LyoKICogc3RhdGUgYmxvY2sgaW1wbGVtZW50YXRpb24KICoKICogQ29weXJpZ2h0IDIwMDIgUmFwaGFlbCBKdW5xdWVpcmEKICogQ29weXJpZ2h0IDIwMDQgSmFzb24gRWRtZWFkZXMKICogQ29weXJpZ2h0IDIwMDUgT2xpdmVyIFN0aWViZXIKICogQ29weXJpZ2h0IDIwMDcgU3RlZmFuIET2c2luZ2VyIGZvciBDb2RlV2VhdmVycwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lZDNkX3ByaXZhdGUuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZCk7CiNkZWZpbmUgR0xJTkZPX0xPQ0FUSU9OIFRoaXMtPndpbmVEM0REZXZpY2UtPmFkYXB0ZXItPmdsX2luZm8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU3RhdGVibG9jayBoZWxwZXIgZnVuY3Rpb25zIGZvbGxvdwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiogQWxsb2NhdGVzIHRoZSBjb3JyZWN0IGFtb3VudCBvZiBzcGFjZSBmb3IgcGl4ZWwgYW5kIHZlcnRleCBzaGFkZXIgY29uc3RhbnRzLCAKICogYWxvbmcgd2l0aCB0aGVpciBzZXQvY2hhbmdlZCBmbGFncyBvbiB0aGUgZ2l2ZW4gc3RhdGVibG9jayBvYmplY3QKICovCkhSRVNVTFQgYWxsb2NhdGVfc2hhZGVyX2NvbnN0YW50cyhJV2luZUQzRFN0YXRlQmxvY2tJbXBsKiBvYmplY3QpIHsKICAgIAogICAgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqVGhpcyA9IG9iamVjdDsKCiNkZWZpbmUgV0lORUQzRF9NRU1DSEVDSyhfb2JqZWN0KSBpZiAoTlVMTCA9PSBfb2JqZWN0KSB7IEZJWE1FKCJPdXQgb2YgbWVtb3J5IVxuIik7IHJldHVybiBFX09VVE9GTUVNT1JZOyB9CgogICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cyAqLwogICAgb2JqZWN0LT5waXhlbFNoYWRlckNvbnN0YW50RiA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoZmxvYXQpICogR0xfTElNSVRTKHBzaGFkZXJfY29uc3RhbnRzRikgKiA0KTsKICAgIFdJTkVEM0RfTUVNQ0hFQ0sob2JqZWN0LT5waXhlbFNoYWRlckNvbnN0YW50Rik7CiAgICBvYmplY3QtPmNoYW5nZWQucGl4ZWxTaGFkZXJDb25zdGFudHNGID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihCT09MKSAqIEdMX0xJTUlUUyhwc2hhZGVyX2NvbnN0YW50c0YpKTsKICAgIFdJTkVEM0RfTUVNQ0hFQ0sob2JqZWN0LT5jaGFuZ2VkLnBpeGVsU2hhZGVyQ29uc3RhbnRzRik7CiAgICBvYmplY3QtPnZlcnRleFNoYWRlckNvbnN0YW50RiA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoZmxvYXQpICogR0xfTElNSVRTKHZzaGFkZXJfY29uc3RhbnRzRikgKiA0KTsKICAgIFdJTkVEM0RfTUVNQ0hFQ0sob2JqZWN0LT52ZXJ0ZXhTaGFkZXJDb25zdGFudEYpOwogICAgb2JqZWN0LT5jaGFuZ2VkLnZlcnRleFNoYWRlckNvbnN0YW50c0YgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKEJPT0wpICogR0xfTElNSVRTKHZzaGFkZXJfY29uc3RhbnRzRikpOwogICAgV0lORUQzRF9NRU1DSEVDSyhvYmplY3QtPmNoYW5nZWQudmVydGV4U2hhZGVyQ29uc3RhbnRzRik7CiAgICBvYmplY3QtPmNvbnRhaW5lZF92c19jb25zdHNfZiA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoRFdPUkQpICogR0xfTElNSVRTKHZzaGFkZXJfY29uc3RhbnRzRikpOwogICAgV0lORUQzRF9NRU1DSEVDSyhvYmplY3QtPmNvbnRhaW5lZF92c19jb25zdHNfZik7CiAgICBvYmplY3QtPmNvbnRhaW5lZF9wc19jb25zdHNfZiA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoRFdPUkQpICogR0xfTElNSVRTKHBzaGFkZXJfY29uc3RhbnRzRikpOwogICAgV0lORUQzRF9NRU1DSEVDSyhvYmplY3QtPmNvbnRhaW5lZF9wc19jb25zdHNfZik7CgogICAgbGlzdF9pbml0KCZvYmplY3QtPnNldF92Y29uc3RhbnRzRik7CiAgICBsaXN0X2luaXQoJm9iamVjdC0+c2V0X3Bjb25zdGFudHNGKTsKCiN1bmRlZiBXSU5FRDNEX01FTUNIRUNLCgogICAgcmV0dXJuIFdJTkVEM0RfT0s7Cn0KCi8qKiBDb3B5IGFsbCBtZW1iZXJzIG9mIG9uZSBzdGF0ZWJsb2NrIHRvIGFub3RoZXIgKi8Kdm9pZCBzdGF0ZWJsb2NrX3NhdmVkc3RhdGVzX2NvcHkoCiAgICBJV2luZUQzRFN0YXRlQmxvY2sqIGlmYWNlLAogICAgU0FWRURTVEFURVMqIGRlc3QsCiAgICBTQVZFRFNUQVRFUyogc291cmNlKSB7CiAgICAKICAgIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKlRoaXMgPSAoSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqKWlmYWNlOwogICAgdW5zaWduZWQgYnNpemUgPSBzaXplb2YoQk9PTCk7CgogICAgLyogU2luZ2xlIHZhbHVlcyAqLwogICAgZGVzdC0+aW5kaWNlcyA9IHNvdXJjZS0+aW5kaWNlczsKICAgIGRlc3QtPm1hdGVyaWFsID0gc291cmNlLT5tYXRlcmlhbDsKICAgIGRlc3QtPmZ2ZiA9IHNvdXJjZS0+ZnZmOwogICAgZGVzdC0+dmlld3BvcnQgPSBzb3VyY2UtPnZpZXdwb3J0OwogICAgZGVzdC0+dmVydGV4RGVjbCA9IHNvdXJjZS0+dmVydGV4RGVjbDsKICAgIGRlc3QtPnBpeGVsU2hhZGVyID0gc291cmNlLT5waXhlbFNoYWRlcjsKICAgIGRlc3QtPnZlcnRleFNoYWRlciA9IHNvdXJjZS0+dmVydGV4U2hhZGVyOwogICAgZGVzdC0+c2Npc3NvclJlY3QgPSBkZXN0LT5zY2lzc29yUmVjdDsKCiAgICAvKiBGaXhlZCBzaXplIGFycmF5cyAqLwogICAgbWVtY3B5KGRlc3QtPnN0cmVhbVNvdXJjZSwgc291cmNlLT5zdHJlYW1Tb3VyY2UsIGJzaXplICogTUFYX1NUUkVBTVMpOwogICAgbWVtY3B5KGRlc3QtPnN0cmVhbUZyZXEsIHNvdXJjZS0+c3RyZWFtRnJlcSwgYnNpemUgKiBNQVhfU1RSRUFNUyk7CiAgICBtZW1jcHkoZGVzdC0+dGV4dHVyZXMsIHNvdXJjZS0+dGV4dHVyZXMsIGJzaXplICogTUFYX0NPTUJJTkVEX1NBTVBMRVJTKTsKICAgIG1lbWNweShkZXN0LT50cmFuc2Zvcm0sIHNvdXJjZS0+dHJhbnNmb3JtLCBic2l6ZSAqIChISUdIRVNUX1RSQU5TRk9STVNUQVRFICsgMSkpOwogICAgbWVtY3B5KGRlc3QtPnJlbmRlclN0YXRlLCBzb3VyY2UtPnJlbmRlclN0YXRlLCBic2l6ZSAqIChXSU5FSElHSEVTVF9SRU5ERVJfU1RBVEUgKyAxKSk7CiAgICBtZW1jcHkoZGVzdC0+dGV4dHVyZVN0YXRlLCBzb3VyY2UtPnRleHR1cmVTdGF0ZSwgYnNpemUgKiBNQVhfVEVYVFVSRVMgKiAoV0lORUQzRF9ISUdIRVNUX1RFWFRVUkVfU1RBVEUgKyAxKSk7CiAgICBtZW1jcHkoZGVzdC0+c2FtcGxlclN0YXRlLCBzb3VyY2UtPnNhbXBsZXJTdGF0ZSwgYnNpemUgKiBNQVhfQ09NQklORURfU0FNUExFUlMgKiAoV0lORUQzRF9ISUdIRVNUX1NBTVBMRVJfU1RBVEUgKyAxKSk7CiAgICBtZW1jcHkoZGVzdC0+Y2xpcHBsYW5lLCBzb3VyY2UtPmNsaXBwbGFuZSwgYnNpemUgKiBNQVhfQ0xJUFBMQU5FUyk7CiAgICBtZW1jcHkoZGVzdC0+cGl4ZWxTaGFkZXJDb25zdGFudHNCLCBzb3VyY2UtPnBpeGVsU2hhZGVyQ29uc3RhbnRzQiwgYnNpemUgKiBNQVhfQ09OU1RfQik7CiAgICBtZW1jcHkoZGVzdC0+cGl4ZWxTaGFkZXJDb25zdGFudHNJLCBzb3VyY2UtPnBpeGVsU2hhZGVyQ29uc3RhbnRzSSwgYnNpemUgKiBNQVhfQ09OU1RfSSk7CiAgICBtZW1jcHkoZGVzdC0+dmVydGV4U2hhZGVyQ29uc3RhbnRzQiwgc291cmNlLT52ZXJ0ZXhTaGFkZXJDb25zdGFudHNCLCBic2l6ZSAqIE1BWF9DT05TVF9CKTsKICAgIG1lbWNweShkZXN0LT52ZXJ0ZXhTaGFkZXJDb25zdGFudHNJLCBzb3VyY2UtPnZlcnRleFNoYWRlckNvbnN0YW50c0ksIGJzaXplICogTUFYX0NPTlNUX0kpOwoKICAgIC8qIER5bmFtaWNhbGx5IHNpemVkIGFycmF5cyAqLwogICAgbWVtY3B5KGRlc3QtPnBpeGVsU2hhZGVyQ29uc3RhbnRzRiwgc291cmNlLT5waXhlbFNoYWRlckNvbnN0YW50c0YsIGJzaXplICogR0xfTElNSVRTKHBzaGFkZXJfY29uc3RhbnRzRikpOwogICAgbWVtY3B5KGRlc3QtPnZlcnRleFNoYWRlckNvbnN0YW50c0YsIHNvdXJjZS0+dmVydGV4U2hhZGVyQ29uc3RhbnRzRiwgYnNpemUgKiBHTF9MSU1JVFModnNoYWRlcl9jb25zdGFudHNGKSk7Cn0KCi8qKiBTZXQgYWxsIG1lbWJlcnMgb2YgYSBzdGF0ZWJsb2NrIHNhdmVkc3RhdGUgdG8gdGhlIGdpdmVuIHZhbHVlICovCnZvaWQgc3RhdGVibG9ja19zYXZlZHN0YXRlc19zZXQoCiAgICBJV2luZUQzRFN0YXRlQmxvY2sqIGlmYWNlLAogICAgU0FWRURTVEFURVMqIHN0YXRlcywKICAgIEJPT0wgdmFsdWUpIHsKICAgIAogICAgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqVGhpcyA9IChJV2luZUQzRFN0YXRlQmxvY2tJbXBsICopaWZhY2U7CiAgICB1bnNpZ25lZCBic2l6ZSA9IHNpemVvZihCT09MKTsKCiAgICAvKiBTaW5nbGUgdmFsdWVzICovCiAgICBzdGF0ZXMtPmluZGljZXMgPSB2YWx1ZTsKICAgIHN0YXRlcy0+bWF0ZXJpYWwgPSB2YWx1ZTsKICAgIHN0YXRlcy0+ZnZmID0gdmFsdWU7CiAgICBzdGF0ZXMtPnZpZXdwb3J0ID0gdmFsdWU7CiAgICBzdGF0ZXMtPnZlcnRleERlY2wgPSB2YWx1ZTsKICAgIHN0YXRlcy0+cGl4ZWxTaGFkZXIgPSB2YWx1ZTsKICAgIHN0YXRlcy0+dmVydGV4U2hhZGVyID0gdmFsdWU7CiAgICBzdGF0ZXMtPnNjaXNzb3JSZWN0ID0gdmFsdWU7CgogICAgLyogRml4ZWQgc2l6ZSBhcnJheXMgKi8KICAgIG1lbXNldChzdGF0ZXMtPnN0cmVhbVNvdXJjZSwgdmFsdWUsIGJzaXplICogTUFYX1NUUkVBTVMpOwogICAgbWVtc2V0KHN0YXRlcy0+c3RyZWFtRnJlcSwgdmFsdWUsIGJzaXplICogTUFYX1NUUkVBTVMpOwogICAgbWVtc2V0KHN0YXRlcy0+dGV4dHVyZXMsIHZhbHVlLCBic2l6ZSAqIE1BWF9DT01CSU5FRF9TQU1QTEVSUyk7CiAgICBtZW1zZXQoc3RhdGVzLT50cmFuc2Zvcm0sIHZhbHVlLCBic2l6ZSAqIChISUdIRVNUX1RSQU5TRk9STVNUQVRFICsgMSkpOwogICAgbWVtc2V0KHN0YXRlcy0+cmVuZGVyU3RhdGUsIHZhbHVlLCBic2l6ZSAqIChXSU5FSElHSEVTVF9SRU5ERVJfU1RBVEUgKyAxKSk7CiAgICBtZW1zZXQoc3RhdGVzLT50ZXh0dXJlU3RhdGUsIHZhbHVlLCBic2l6ZSAqIE1BWF9URVhUVVJFUyAqIChXSU5FRDNEX0hJR0hFU1RfVEVYVFVSRV9TVEFURSArIDEpKTsKICAgIG1lbXNldChzdGF0ZXMtPnNhbXBsZXJTdGF0ZSwgdmFsdWUsIGJzaXplICogTUFYX0NPTUJJTkVEX1NBTVBMRVJTICogKFdJTkVEM0RfSElHSEVTVF9TQU1QTEVSX1NUQVRFICsgMSkpOwogICAgbWVtc2V0KHN0YXRlcy0+Y2xpcHBsYW5lLCB2YWx1ZSwgYnNpemUgKiBNQVhfQ0xJUFBMQU5FUyk7CiAgICBtZW1zZXQoc3RhdGVzLT5waXhlbFNoYWRlckNvbnN0YW50c0IsIHZhbHVlLCBic2l6ZSAqIE1BWF9DT05TVF9CKTsKICAgIG1lbXNldChzdGF0ZXMtPnBpeGVsU2hhZGVyQ29uc3RhbnRzSSwgdmFsdWUsIGJzaXplICogTUFYX0NPTlNUX0kpOwogICAgbWVtc2V0KHN0YXRlcy0+dmVydGV4U2hhZGVyQ29uc3RhbnRzQiwgdmFsdWUsIGJzaXplICogTUFYX0NPTlNUX0IpOwogICAgbWVtc2V0KHN0YXRlcy0+dmVydGV4U2hhZGVyQ29uc3RhbnRzSSwgdmFsdWUsIGJzaXplICogTUFYX0NPTlNUX0kpOwoKICAgIC8qIER5bmFtaWNhbGx5IHNpemVkIGFycmF5cyAqLwogICAgbWVtc2V0KHN0YXRlcy0+cGl4ZWxTaGFkZXJDb25zdGFudHNGLCB2YWx1ZSwgYnNpemUgKiBHTF9MSU1JVFMocHNoYWRlcl9jb25zdGFudHNGKSk7CiAgICBtZW1zZXQoc3RhdGVzLT52ZXJ0ZXhTaGFkZXJDb25zdGFudHNGLCB2YWx1ZSwgYnNpemUgKiBHTF9MSU1JVFModnNoYWRlcl9jb25zdGFudHNGKSk7Cn0KCnZvaWQgc3RhdGVibG9ja19jb3B5KAogICAgSVdpbmVEM0RTdGF0ZUJsb2NrKiBkZXN0aW5hdGlvbiwKICAgIElXaW5lRDNEU3RhdGVCbG9jayogc291cmNlKSB7CiAgICBpbnQgbDsKCiAgICBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpUaGlzID0gKElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKilzb3VyY2U7CiAgICBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpEZXN0ID0gKElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKilkZXN0aW5hdGlvbjsKCiAgICAvKiBJVW5rbm93biBmaWVsZHMgKi8KICAgIERlc3QtPmxwVnRibCAgICAgICAgICAgICAgICA9IFRoaXMtPmxwVnRibDsKICAgIERlc3QtPnJlZiAgICAgICAgICAgICAgICAgICA9IFRoaXMtPnJlZjsKCiAgICAvKiBJV2luZUQzRFN0YXRlQmxvY2sgaW5mb3JtYXRpb24gKi8KICAgIERlc3QtPnBhcmVudCAgICAgICAgICAgICAgICA9IFRoaXMtPnBhcmVudDsKICAgIERlc3QtPndpbmVEM0REZXZpY2UgICAgICAgICA9IFRoaXMtPndpbmVEM0REZXZpY2U7CiAgICBEZXN0LT5ibG9ja1R5cGUgICAgICAgICAgICAgPSBUaGlzLT5ibG9ja1R5cGU7CgogICAgLyogU2F2ZWQgc3RhdGVzICovCiAgICBzdGF0ZWJsb2NrX3NhdmVkc3RhdGVzX2NvcHkoc291cmNlLCAmRGVzdC0+Y2hhbmdlZCwgJlRoaXMtPmNoYW5nZWQpOwoKICAgIC8qIFNpbmdsZSBpdGVtcyAqLwogICAgRGVzdC0+ZnZmID0gVGhpcy0+ZnZmOwogICAgRGVzdC0+dmVydGV4RGVjbCA9IFRoaXMtPnZlcnRleERlY2w7CiAgICBEZXN0LT52ZXJ0ZXhTaGFkZXIgPSBUaGlzLT52ZXJ0ZXhTaGFkZXI7CiAgICBEZXN0LT5zdHJlYW1Jc1VQID0gVGhpcy0+c3RyZWFtSXNVUDsKICAgIERlc3QtPnBJbmRleERhdGEgPSBUaGlzLT5wSW5kZXhEYXRhOwogICAgRGVzdC0+YmFzZVZlcnRleEluZGV4ID0gVGhpcy0+YmFzZVZlcnRleEluZGV4OwogICAgLyogRGVzdC0+bGlnaHRzID0gVGhpcy0+bGlnaHRzOyAqLwogICAgRGVzdC0+Y2xpcF9zdGF0dXMgPSBUaGlzLT5jbGlwX3N0YXR1czsKICAgIERlc3QtPnZpZXdwb3J0ID0gVGhpcy0+dmlld3BvcnQ7CiAgICBEZXN0LT5tYXRlcmlhbCA9IFRoaXMtPm1hdGVyaWFsOwogICAgRGVzdC0+cGl4ZWxTaGFkZXIgPSBUaGlzLT5waXhlbFNoYWRlcjsKICAgIERlc3QtPmdsc2xfcHJvZ3JhbSA9IFRoaXMtPmdsc2xfcHJvZ3JhbTsKICAgIERlc3QtPnNjaXNzb3JSZWN0ID0gVGhpcy0+c2Npc3NvclJlY3Q7CgogICAgLyogTGlnaHRzICovCiAgICBtZW1zZXQoVGhpcy0+YWN0aXZlTGlnaHRzLCAwLCBzaXplb2YoVGhpcy0+YWN0aXZlTGlnaHRzKSk7CiAgICBmb3IobCA9IDA7IGwgPCBMSUdIVE1BUF9TSVpFOyBsKyspIHsKICAgICAgICBzdHJ1Y3QgbGlzdCAqZTEsICplMjsKICAgICAgICBMSVNUX0ZPUl9FQUNIX1NBRkUoZTEsIGUyLCAmRGVzdC0+bGlnaHRNYXBbbF0pIHsKICAgICAgICAgICAgUExJR0hUSU5GT0VMICpsaWdodCA9IExJU1RfRU5UUlkoZTEsIFBMSUdIVElORk9FTCwgZW50cnkpOwogICAgICAgICAgICBsaXN0X3JlbW92ZSgmbGlnaHQtPmVudHJ5KTsKICAgICAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbGlnaHQpOwogICAgICAgIH0KCiAgICAgICAgTElTVF9GT1JfRUFDSChlMSwgJlRoaXMtPmxpZ2h0TWFwW2xdKSB7CiAgICAgICAgICAgIFBMSUdIVElORk9FTCAqbGlnaHQgPSBMSVNUX0VOVFJZKGUxLCBQTElHSFRJTkZPRUwsIGVudHJ5KSwgKmxpZ2h0MjsKICAgICAgICAgICAgbGlnaHQyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZigqbGlnaHQpKTsKICAgICAgICAgICAgKmxpZ2h0MiA9ICpsaWdodDsKICAgICAgICAgICAgbGlzdF9hZGRfdGFpbCgmRGVzdC0+bGlnaHRNYXBbbF0sICZsaWdodDItPmVudHJ5KTsKICAgICAgICAgICAgaWYobGlnaHQyLT5nbEluZGV4ICE9IC0xKSBEZXN0LT5hY3RpdmVMaWdodHNbbGlnaHQyLT5nbEluZGV4XSA9IGxpZ2h0MjsKICAgICAgICB9CiAgICB9CgogICAgLyogRml4ZWQgc2l6ZSBhcnJheXMgKi8KICAgIG1lbWNweShEZXN0LT52ZXJ0ZXhTaGFkZXJDb25zdGFudEIsIFRoaXMtPnZlcnRleFNoYWRlckNvbnN0YW50Qiwgc2l6ZW9mKEJPT0wpICogTUFYX0NPTlNUX0IpOwogICAgbWVtY3B5KERlc3QtPnZlcnRleFNoYWRlckNvbnN0YW50SSwgVGhpcy0+dmVydGV4U2hhZGVyQ29uc3RhbnRJLCBzaXplb2YoSU5UKSAqIE1BWF9DT05TVF9JICogNCk7CiAgICBtZW1jcHkoRGVzdC0+cGl4ZWxTaGFkZXJDb25zdGFudEIsIFRoaXMtPnBpeGVsU2hhZGVyQ29uc3RhbnRCLCBzaXplb2YoQk9PTCkgKiBNQVhfQ09OU1RfQik7CiAgICBtZW1jcHkoRGVzdC0+cGl4ZWxTaGFkZXJDb25zdGFudEksIFRoaXMtPnBpeGVsU2hhZGVyQ29uc3RhbnRJLCBzaXplb2YoSU5UKSAqIE1BWF9DT05TVF9JICogNCk7CiAgICAKICAgIG1lbWNweShEZXN0LT5zdHJlYW1TdHJpZGUsIFRoaXMtPnN0cmVhbVN0cmlkZSwgc2l6ZW9mKFVJTlQpICogTUFYX1NUUkVBTVMpOwogICAgbWVtY3B5KERlc3QtPnN0cmVhbU9mZnNldCwgVGhpcy0+c3RyZWFtT2Zmc2V0LCBzaXplb2YoVUlOVCkgKiBNQVhfU1RSRUFNUyk7CiAgICBtZW1jcHkoRGVzdC0+c3RyZWFtU291cmNlLCBUaGlzLT5zdHJlYW1Tb3VyY2UsIHNpemVvZihJV2luZUQzRFZlcnRleEJ1ZmZlciopICogTUFYX1NUUkVBTVMpOwogICAgbWVtY3B5KERlc3QtPnN0cmVhbUZyZXEsICAgVGhpcy0+c3RyZWFtRnJlcSwgICBzaXplb2YoVUlOVCkgKiBNQVhfU1RSRUFNUyk7CiAgICBtZW1jcHkoRGVzdC0+c3RyZWFtRmxhZ3MsICBUaGlzLT5zdHJlYW1GbGFncywgIHNpemVvZihVSU5UKSAqIE1BWF9TVFJFQU1TKTsKICAgIG1lbWNweShEZXN0LT50cmFuc2Zvcm1zLCAgIFRoaXMtPnRyYW5zZm9ybXMsICAgc2l6ZW9mKFdJTkVEM0RNQVRSSVgpICogKEhJR0hFU1RfVFJBTlNGT1JNU1RBVEUgKyAxKSk7CiAgICBtZW1jcHkoRGVzdC0+Y2xpcHBsYW5lLCAgICBUaGlzLT5jbGlwcGxhbmUsICAgIHNpemVvZihkb3VibGUpICogTUFYX0NMSVBQTEFORVMgKiA0KTsKICAgIG1lbWNweShEZXN0LT5yZW5kZXJTdGF0ZSwgIFRoaXMtPnJlbmRlclN0YXRlLCAgc2l6ZW9mKERXT1JEKSAqIChXSU5FSElHSEVTVF9SRU5ERVJfU1RBVEUgKyAxKSk7CiAgICBtZW1jcHkoRGVzdC0+dGV4dHVyZXMsICAgICBUaGlzLT50ZXh0dXJlcywgICAgIHNpemVvZihJV2luZUQzREJhc2VUZXh0dXJlKikgKiBNQVhfQ09NQklORURfU0FNUExFUlMpOwogICAgbWVtY3B5KERlc3QtPnRleHR1cmVEaW1lbnNpb25zLCBUaGlzLT50ZXh0dXJlRGltZW5zaW9ucywgc2l6ZW9mKGludCkgKiBNQVhfQ09NQklORURfU0FNUExFUlMpOwogICAgbWVtY3B5KERlc3QtPnRleHR1cmVTdGF0ZSwgVGhpcy0+dGV4dHVyZVN0YXRlLCBzaXplb2YoRFdPUkQpICogTUFYX1RFWFRVUkVTICogKFdJTkVEM0RfSElHSEVTVF9URVhUVVJFX1NUQVRFICsgMSkpOwogICAgbWVtY3B5KERlc3QtPnNhbXBsZXJTdGF0ZSwgVGhpcy0+c2FtcGxlclN0YXRlLCBzaXplb2YoRFdPUkQpICogTUFYX0NPTUJJTkVEX1NBTVBMRVJTICogKFdJTkVEM0RfSElHSEVTVF9TQU1QTEVSX1NUQVRFICsgMSkpOwoKICAgIC8qIER5bmFtaWNhbGx5IHNpemVkIGFycmF5cyAqLwogICAgbWVtY3B5KERlc3QtPnZlcnRleFNoYWRlckNvbnN0YW50RiwgVGhpcy0+dmVydGV4U2hhZGVyQ29uc3RhbnRGLCBzaXplb2YoZmxvYXQpICogR0xfTElNSVRTKHZzaGFkZXJfY29uc3RhbnRzRikgKiA0KTsKICAgIG1lbWNweShEZXN0LT5waXhlbFNoYWRlckNvbnN0YW50RiwgIFRoaXMtPnBpeGVsU2hhZGVyQ29uc3RhbnRGLCAgc2l6ZW9mKGZsb2F0KSAqIEdMX0xJTUlUUyhwc2hhZGVyX2NvbnN0YW50c0YpICogNCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgSVVua25vd24gcGFydHMgZm9sbG93cwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgIFdJTkFQSSBJV2luZUQzRFN0YXRlQmxvY2tJbXBsX1F1ZXJ5SW50ZXJmYWNlKElXaW5lRDNEU3RhdGVCbG9jayAqaWZhY2UsUkVGSUlEIHJpaWQsTFBWT0lEICpwcG9iaikKewogICAgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqVGhpcyA9IChJV2luZUQzRFN0YXRlQmxvY2tJbXBsICopaWZhY2U7CiAgICBUUkFDRSgiKCVwKS0+KCVzLCVwKVxuIixUaGlzLGRlYnVnc3RyX2d1aWQocmlpZCkscHBvYmopOwogICAgaWYgKElzRXF1YWxHVUlEKHJpaWQsICZJSURfSVVua25vd24pCiAgICAgICAgfHwgSXNFcXVhbEdVSUQocmlpZCwgJklJRF9JV2luZUQzREJhc2UpCiAgICAgICAgfHwgSXNFcXVhbEdVSUQocmlpZCwgJklJRF9JV2luZUQzRFN0YXRlQmxvY2spKXsKICAgICAgICBJVW5rbm93bl9BZGRSZWYoaWZhY2UpOwogICAgICAgICpwcG9iaiA9IFRoaXM7CiAgICAgICAgcmV0dXJuIFNfT0s7CiAgICB9CiAgICAqcHBvYmogPSBOVUxMOwogICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cn0KCnN0YXRpYyBVTE9ORyAgV0lOQVBJIElXaW5lRDNEU3RhdGVCbG9ja0ltcGxfQWRkUmVmKElXaW5lRDNEU3RhdGVCbG9jayAqaWZhY2UpIHsKICAgIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKlRoaXMgPSAoSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqKWlmYWNlOwogICAgVUxPTkcgcmVmQ291bnQgPSBJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKSA6IEFkZFJlZiBpbmNyZWFzaW5nIGZyb20gJWRcbiIsIFRoaXMsIHJlZkNvdW50IC0gMSk7CiAgICByZXR1cm4gcmVmQ291bnQ7Cn0KCnN0YXRpYyBVTE9ORyAgV0lOQVBJIElXaW5lRDNEU3RhdGVCbG9ja0ltcGxfUmVsZWFzZShJV2luZUQzRFN0YXRlQmxvY2sgKmlmYWNlKSB7CiAgICBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpUaGlzID0gKElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKilpZmFjZTsKICAgIFVMT05HIHJlZkNvdW50ID0gSW50ZXJsb2NrZWREZWNyZW1lbnQoJlRoaXMtPnJlZik7CgogICAgVFJBQ0UoIiglcCkgOiBSZWxlYXNpbmcgZnJvbSAlZFxuIiwgVGhpcywgcmVmQ291bnQgKyAxKTsKCiAgICBpZiAoIXJlZkNvdW50KSB7CiAgICAgICAgY29uc3RhbnRzX2VudHJ5ICpjb25zdGFudCwgKmNvbnN0YW50MjsKICAgICAgICBpbnQgY291bnRlcjsKCiAgICAgICAgLyogdHlwZSAwIHJlcHJlc2VudHMgdGhlIHByaW1hcnkgc3RhdGVibG9jaywgc28gZnJlZSBhbGwgdGhlIHJlc291cmNlcyAqLwogICAgICAgIGlmIChUaGlzLT5ibG9ja1R5cGUgPT0gV0lORUQzRFNCVF9JTklUKSB7CiAgICAgICAgICAgIC8qIE5PVEU6IGFjY29yZGluZyB0byBNU0ROOiBUaGUgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyBzdXJlIHRoZSB0ZXh0dXJlIHJlZmVyZW5jZXMgYXJlIGNsZWFyZWQgZG93biAqLwogICAgICAgICAgICBmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgTUFYX0NPTUJJTkVEX1NBTVBMRVJTOyBjb3VudGVyKyspIHsKICAgICAgICAgICAgICAgIGlmIChUaGlzLT50ZXh0dXJlc1tjb3VudGVyXSkgewogICAgICAgICAgICAgICAgICAgIC8qIHJlbGVhc2Ugb3VyICdpbnRlcm5hbCcgaG9sZCBvbiB0aGUgdGV4dHVyZSAqLwogICAgICAgICAgICAgICAgICAgIGlmKDAgIT0gSVdpbmVEM0RCYXNlVGV4dHVyZV9SZWxlYXNlKFRoaXMtPnRleHR1cmVzW2NvdW50ZXJdKSkgewogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRSgiVGV4dHVyZSBzdGlsbCByZWZlcmVuY2VkIGJ5IHN0YXRlYmxvY2ssIGFwcGxpY2F0aW9ucyBoYXMgbGVha2VkIFN0YWdlID0gJXUgVGV4dHVyZSA9ICVwXG4iLCBjb3VudGVyLCBUaGlzLT50ZXh0dXJlc1tjb3VudGVyXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgTUFYX1NUUkVBTVM7IGNvdW50ZXIrKykgewogICAgICAgICAgICBpZihUaGlzLT5zdHJlYW1Tb3VyY2VbY291bnRlcl0pIHsKICAgICAgICAgICAgICAgIGlmKDAgIT0gSVdpbmVEM0RWZXJ0ZXhCdWZmZXJfUmVsZWFzZShUaGlzLT5zdHJlYW1Tb3VyY2VbY291bnRlcl0pKSB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0UoIlZlcnRleCBidWZmZXIgc3RpbGwgcmVmZXJlbmNlZCBieSBzdGF0ZWJsb2NrLCBhcHBsaWNhdGlvbnMgaGFzIGxlYWtlZCBTdHJlYW0gJXUsIGJ1ZmZlciAlcFxuIiwgY291bnRlciwgVGhpcy0+c3RyZWFtU291cmNlW2NvdW50ZXJdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZihUaGlzLT5wSW5kZXhEYXRhKSBJV2luZUQzREluZGV4QnVmZmVyX1JlbGVhc2UoVGhpcy0+cEluZGV4RGF0YSk7CiAgICAgICAgaWYoVGhpcy0+dmVydGV4U2hhZGVyKSBJV2luZUQzRFZlcnRleFNoYWRlcl9SZWxlYXNlKFRoaXMtPnZlcnRleFNoYWRlcik7CiAgICAgICAgaWYoVGhpcy0+cGl4ZWxTaGFkZXIpIElXaW5lRDNEUGl4ZWxTaGFkZXJfUmVsZWFzZShUaGlzLT5waXhlbFNoYWRlcik7CgogICAgICAgIGZvcihjb3VudGVyID0gMDsgY291bnRlciA8IExJR0hUTUFQX1NJWkU7IGNvdW50ZXIrKykgewogICAgICAgICAgICBzdHJ1Y3QgbGlzdCAqZTEsICplMjsKICAgICAgICAgICAgTElTVF9GT1JfRUFDSF9TQUZFKGUxLCBlMiwgJlRoaXMtPmxpZ2h0TWFwW2NvdW50ZXJdKSB7CiAgICAgICAgICAgICAgICBQTElHSFRJTkZPRUwgKmxpZ2h0ID0gTElTVF9FTlRSWShlMSwgUExJR0hUSU5GT0VMLCBlbnRyeSk7CiAgICAgICAgICAgICAgICBsaXN0X3JlbW92ZSgmbGlnaHQtPmVudHJ5KTsKICAgICAgICAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGxpZ2h0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+dmVydGV4U2hhZGVyQ29uc3RhbnRGKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzLT5jaGFuZ2VkLnZlcnRleFNoYWRlckNvbnN0YW50c0YpOwogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMtPnBpeGVsU2hhZGVyQ29uc3RhbnRGKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzLT5jaGFuZ2VkLnBpeGVsU2hhZGVyQ29uc3RhbnRzRik7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+Y29udGFpbmVkX3ZzX2NvbnN0c19mKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzLT5jb250YWluZWRfcHNfY29uc3RzX2YpOwoKICAgICAgICBMSVNUX0ZPUl9FQUNIX0VOVFJZX1NBRkUoY29uc3RhbnQsIGNvbnN0YW50MiwgJlRoaXMtPnNldF92Y29uc3RhbnRzRiwgY29uc3RhbnRzX2VudHJ5LCBlbnRyeSkgewogICAgICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBjb25zdGFudCk7CiAgICAgICAgfQoKICAgICAgICBMSVNUX0ZPUl9FQUNIX0VOVFJZX1NBRkUoY29uc3RhbnQsIGNvbnN0YW50MiwgJlRoaXMtPnNldF9wY29uc3RhbnRzRiwgY29uc3RhbnRzX2VudHJ5LCBlbnRyeSkgewogICAgICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBjb25zdGFudCk7CiAgICAgICAgfQoKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzKTsKICAgIH0KICAgIHJldHVybiByZWZDb3VudDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCBwYXJ0cyBmb2xsb3dzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCAgV0lOQVBJIElXaW5lRDNEU3RhdGVCbG9ja0ltcGxfR2V0UGFyZW50KElXaW5lRDNEU3RhdGVCbG9jayAqaWZhY2UsIElVbmtub3duICoqcFBhcmVudCkgewogICAgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqVGhpcyA9IChJV2luZUQzRFN0YXRlQmxvY2tJbXBsICopaWZhY2U7CiAgICBJVW5rbm93bl9BZGRSZWYoVGhpcy0+cGFyZW50KTsKICAgICpwUGFyZW50ID0gVGhpcy0+cGFyZW50OwogICAgcmV0dXJuIFdJTkVEM0RfT0s7Cn0KCnN0YXRpYyBIUkVTVUxUICBXSU5BUEkgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbF9HZXREZXZpY2UoSVdpbmVEM0RTdGF0ZUJsb2NrICppZmFjZSwgSVdpbmVEM0REZXZpY2UqKiBwcERldmljZSl7CgogICAgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqVGhpcyAgID0gKElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKilpZmFjZTsKCiAgICAqcHBEZXZpY2UgPSAoSVdpbmVEM0REZXZpY2UqKVRoaXMtPndpbmVEM0REZXZpY2U7CiAgICBJV2luZUQzRERldmljZV9BZGRSZWYoKnBwRGV2aWNlKTsKICAgIHJldHVybiBXSU5FRDNEX09LOwoKfQoKc3RhdGljIGlubGluZSB2b2lkIHJlY29yZF9saWdodHMoSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqVGhpcywgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqdGFyZ2V0U3RhdGVCbG9jaykgewogICAgVUlOVCBpOwoKICAgIC8qIExpZ2h0cy4uLiBGb3IgYSByZWNvcmRlZCBzdGF0ZSBibG9jaywgd2UganVzdCBoYWQgYSBjaGFpbiBvZiBhY3Rpb25zIHRvIHBlcmZvcm0sCiAgICAgKiBzbyB3ZSBuZWVkIHRvIHdhbGsgdGhhdCBjaGFpbiBhbmQgdXBkYXRlIGFueSBhY3Rpb25zIHdoaWNoIGRpZmZlcgogICAgICovCiAgICBmb3IoaSA9IDA7IGkgPCBMSUdIVE1BUF9TSVpFOyBpKyspIHsKICAgICAgICBzdHJ1Y3QgbGlzdCAqZSwgKmY7CiAgICAgICAgTElTVF9GT1JfRUFDSChlLCAmVGhpcy0+bGlnaHRNYXBbaV0pIHsKICAgICAgICAgICAgQk9PTCB1cGRhdGVkID0gRkFMU0U7CiAgICAgICAgICAgIFBMSUdIVElORk9FTCAqc3JjID0gTElTVF9FTlRSWShlLCBQTElHSFRJTkZPRUwsIGVudHJ5KSwgKnJlYWxMaWdodDsKICAgICAgICAgICAgaWYoIXNyYy0+Y2hhbmdlZCB8fCAhc3JjLT5lbmFibGVkQ2hhbmdlZCkgY29udGludWU7CgogICAgICAgICAgICAvKiBMb29rIHVwIHRoZSBsaWdodCBpbiB0aGUgZGVzdGluYXRpb24gKi8KICAgICAgICAgICAgTElTVF9GT1JfRUFDSChmLCAmdGFyZ2V0U3RhdGVCbG9jay0+bGlnaHRNYXBbaV0pIHsKICAgICAgICAgICAgICAgIHJlYWxMaWdodCA9IExJU1RfRU5UUlkoZiwgUExJR0hUSU5GT0VMLCBlbnRyeSk7CiAgICAgICAgICAgICAgICBpZihyZWFsTGlnaHQtPk9yaWdpbmFsSW5kZXggPT0gc3JjLT5PcmlnaW5hbEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYoc3JjLT5jaGFuZ2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+T3JpZ2luYWxQYXJtcyA9IHJlYWxMaWdodC0+T3JpZ2luYWxQYXJtczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYoc3JjLT5lbmFibGVkQ2hhbmdlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVlZCB0byBkb3VibGUgY2hlY2sgYmVjYXVzZSBlbmFibGVkQ2hhbmdlZCBkb2VzIG5vdCBjYXRjaCBlbmFibGVkIC0+IGRpc2FibGVkIC0+IGVuYWJsZWQKICAgICAgICAgICAgICAgICAgICAgICAgKiBvciBkaXNhYmxlZCAtPiBlbmFibGVkIC0+IGRpc2FibGVkIGNoYW5nZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlYWxMaWdodC0+Z2xJbmRleCA9PSAtMSAmJiBzcmMtPmdsSW5kZXggIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExpZ2h0IGRpc2FibGVkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzLT5hY3RpdmVMaWdodHNbc3JjLT5nbEluZGV4XSA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihyZWFsTGlnaHQtPmdsSW5kZXggIT0gLTEgJiYgc3JjLT5nbEluZGV4ID09IC0xKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExpZ2h0IGVuYWJsZWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMtPmFjdGl2ZUxpZ2h0c1tyZWFsTGlnaHQtPmdsSW5kZXhdID0gc3JjOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+Z2xJbmRleCA9IHJlYWxMaWdodC0+Z2xJbmRleDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKHVwZGF0ZWQpIHsKICAgICAgICAgICAgICAgIC8qIEZvdW5kIGEgbGlnaHQsIGFsbCBkb25lLCBwcm9jZWVkIHdpdGggbmV4dCBoYXNoIGVudHJ5ICovCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfSBlbHNlIGlmKHNyYy0+Y2hhbmdlZCkgewogICAgICAgICAgICAgICAgLyogT3RoZXJ3aXNlIGFzc2lnbiBkZWZhdWwgcGFyYW1zICovCiAgICAgICAgICAgICAgICBzcmMtPk9yaWdpbmFsUGFybXMgPSBXSU5FRDNEX2RlZmF1bHRfbGlnaHQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvKiBOb3QgZW5hYmxlZCBieSBkZWZhdWx0ICovCiAgICAgICAgICAgICAgICBzcmMtPmdsSW5kZXggPSAtMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIEhSRVNVTFQgIFdJTkFQSSBJV2luZUQzRFN0YXRlQmxvY2tJbXBsX0NhcHR1cmUoSVdpbmVEM0RTdGF0ZUJsb2NrICppZmFjZSl7CgogICAgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqVGhpcyAgICAgICAgICAgICA9IChJV2luZUQzRFN0YXRlQmxvY2tJbXBsICopaWZhY2U7CiAgICBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICp0YXJnZXRTdGF0ZUJsb2NrID0gVGhpcy0+d2luZUQzRERldmljZS0+c3RhdGVCbG9jazsKICAgIHVuc2lnbmVkIGludCBpLCBqOwoKICAgIFRSQUNFKCIoJXApIDogVXBkYXRpbmcgc3RhdGUgYmxvY2sgJXAgLS0tLS0tLS0tLS0tLS0tLS0tdlxuIiwgdGFyZ2V0U3RhdGVCbG9jaywgVGhpcyk7CgogICAgLyogSWYgbm90IHJlY29yZGVkLCB0aGVuIHVwZGF0ZSBjYW4ganVzdCByZWNhcHR1cmUgKi8KICAgIGlmIChUaGlzLT5ibG9ja1R5cGUgPT0gV0lORUQzRFNCVF9SRUNPUkRFRCkgewoKICAgICAgICAvKiBSZWNvcmRlZCA9PiBPbmx5IHVwZGF0ZSAnY2hhbmdlZCcgdmFsdWVzICovCiAgICAgICAgaWYgKFRoaXMtPmNoYW5nZWQudmVydGV4U2hhZGVyICYmIFRoaXMtPnZlcnRleFNoYWRlciAhPSB0YXJnZXRTdGF0ZUJsb2NrLT52ZXJ0ZXhTaGFkZXIpIHsKICAgICAgICAgICAgVFJBQ0UoIlVwZGF0aW5nIHZlcnRleCBzaGFkZXIgZnJvbSAlcCB0byAlcFxuIiwgVGhpcy0+dmVydGV4U2hhZGVyLCB0YXJnZXRTdGF0ZUJsb2NrLT52ZXJ0ZXhTaGFkZXIpOwoKICAgICAgICAgICAgaWYodGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyKSBJV2luZUQzRFZlcnRleFNoYWRlcl9BZGRSZWYodGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyKTsKICAgICAgICAgICAgaWYoVGhpcy0+dmVydGV4U2hhZGVyKSBJV2luZUQzRFZlcnRleFNoYWRlcl9SZWxlYXNlKFRoaXMtPnZlcnRleFNoYWRlcik7CiAgICAgICAgICAgIFRoaXMtPnZlcnRleFNoYWRlciA9IHRhcmdldFN0YXRlQmxvY2stPnZlcnRleFNoYWRlcjsKICAgICAgICB9CgogICAgICAgIC8qIFZlcnRleCBTaGFkZXIgRmxvYXQgQ29uc3RhbnRzICovCiAgICAgICAgZm9yIChqID0gMDsgaiA8IFRoaXMtPm51bV9jb250YWluZWRfdnNfY29uc3RzX2Y7ICsraikgewogICAgICAgICAgICBpID0gVGhpcy0+Y29udGFpbmVkX3ZzX2NvbnN0c19mW2pdOwogICAgICAgICAgICBUUkFDRSgiU2V0dGluZyAlcCBmcm9tICVwICVkIHRvIHsgJWYsICVmLCAlZiwgJWYgfVxuIiwgVGhpcywgdGFyZ2V0U3RhdGVCbG9jaywgaSwKICAgICAgICAgICAgICAgIHRhcmdldFN0YXRlQmxvY2stPnZlcnRleFNoYWRlckNvbnN0YW50RltpICogNF0sCiAgICAgICAgICAgICAgICB0YXJnZXRTdGF0ZUJsb2NrLT52ZXJ0ZXhTaGFkZXJDb25zdGFudEZbaSAqIDQgKyAxXSwKICAgICAgICAgICAgICAgIHRhcmdldFN0YXRlQmxvY2stPnZlcnRleFNoYWRlckNvbnN0YW50RltpICogNCArIDJdLAogICAgICAgICAgICAgICAgdGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyQ29uc3RhbnRGW2kgKiA0ICsgM10pOwoKICAgICAgICAgICAgVGhpcy0+dmVydGV4U2hhZGVyQ29uc3RhbnRGW2kgKiA0XSAgICAgID0gdGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyQ29uc3RhbnRGW2kgKiA0XTsKICAgICAgICAgICAgVGhpcy0+dmVydGV4U2hhZGVyQ29uc3RhbnRGW2kgKiA0ICsgMV0gID0gdGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyQ29uc3RhbnRGW2kgKiA0ICsgMV07CiAgICAgICAgICAgIFRoaXMtPnZlcnRleFNoYWRlckNvbnN0YW50RltpICogNCArIDJdICA9IHRhcmdldFN0YXRlQmxvY2stPnZlcnRleFNoYWRlckNvbnN0YW50RltpICogNCArIDJdOwogICAgICAgICAgICBUaGlzLT52ZXJ0ZXhTaGFkZXJDb25zdGFudEZbaSAqIDQgKyAzXSAgPSB0YXJnZXRTdGF0ZUJsb2NrLT52ZXJ0ZXhTaGFkZXJDb25zdGFudEZbaSAqIDQgKyAzXTsKICAgICAgICB9CgogICAgICAgIC8qIFZlcnRleCBTaGFkZXIgSW50ZWdlciBDb25zdGFudHMgKi8KICAgICAgICBmb3IgKGogPSAwOyBqIDwgVGhpcy0+bnVtX2NvbnRhaW5lZF92c19jb25zdHNfaTsgKytqKSB7CiAgICAgICAgICAgIGkgPSBUaGlzLT5jb250YWluZWRfdnNfY29uc3RzX2lbal07CiAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nICVwIGZyb20gJXAgJWQgdG8geyAlZCwgJWQsICVkLCAlZCB9XG4iLCBUaGlzLCB0YXJnZXRTdGF0ZUJsb2NrLCBpLAogICAgICAgICAgICAgICAgdGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyQ29uc3RhbnRJW2kgKiA0XSwKICAgICAgICAgICAgICAgIHRhcmdldFN0YXRlQmxvY2stPnZlcnRleFNoYWRlckNvbnN0YW50SVtpICogNCArIDFdLAogICAgICAgICAgICAgICAgdGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyQ29uc3RhbnRJW2kgKiA0ICsgMl0sCiAgICAgICAgICAgICAgICB0YXJnZXRTdGF0ZUJsb2NrLT52ZXJ0ZXhTaGFkZXJDb25zdGFudElbaSAqIDQgKyAzXSk7CgogICAgICAgICAgICBUaGlzLT52ZXJ0ZXhTaGFkZXJDb25zdGFudElbaSAqIDRdICAgICAgPSB0YXJnZXRTdGF0ZUJsb2NrLT52ZXJ0ZXhTaGFkZXJDb25zdGFudElbaSAqIDRdOwogICAgICAgICAgICBUaGlzLT52ZXJ0ZXhTaGFkZXJDb25zdGFudElbaSAqIDQgKyAxXSAgPSB0YXJnZXRTdGF0ZUJsb2NrLT52ZXJ0ZXhTaGFkZXJDb25zdGFudElbaSAqIDQgKyAxXTsKICAgICAgICAgICAgVGhpcy0+dmVydGV4U2hhZGVyQ29uc3RhbnRJW2kgKiA0ICsgMl0gID0gdGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyQ29uc3RhbnRJW2kgKiA0ICsgMl07CiAgICAgICAgICAgIFRoaXMtPnZlcnRleFNoYWRlckNvbnN0YW50SVtpICogNCArIDNdICA9IHRhcmdldFN0YXRlQmxvY2stPnZlcnRleFNoYWRlckNvbnN0YW50SVtpICogNCArIDNdOwogICAgICAgIH0KCiAgICAgICAgLyogVmVydGV4IFNoYWRlciBCb29sZWFuIENvbnN0YW50cyAqLwogICAgICAgIGZvciAoaiA9IDA7IGogPCBUaGlzLT5udW1fY29udGFpbmVkX3ZzX2NvbnN0c19iOyArK2opIHsKICAgICAgICAgICAgaSA9IFRoaXMtPmNvbnRhaW5lZF92c19jb25zdHNfYltqXTsKICAgICAgICAgICAgVFJBQ0UoIlNldHRpbmcgJXAgZnJvbSAlcCAlZCB0byAlc1xuIiwgVGhpcywgdGFyZ2V0U3RhdGVCbG9jaywgaSwKICAgICAgICAgICAgICAgIHRhcmdldFN0YXRlQmxvY2stPnZlcnRleFNoYWRlckNvbnN0YW50QltpXT8gIlRSVUUiOiJGQUxTRSIpOwoKICAgICAgICAgICAgVGhpcy0+dmVydGV4U2hhZGVyQ29uc3RhbnRCW2ldID0gIHRhcmdldFN0YXRlQmxvY2stPnZlcnRleFNoYWRlckNvbnN0YW50QltpXTsKICAgICAgICB9CgogICAgICAgIC8qIFBpeGVsIFNoYWRlciBGbG9hdCBDb25zdGFudHMgKi8KICAgICAgICBmb3IgKGogPSAwOyBqIDwgVGhpcy0+bnVtX2NvbnRhaW5lZF9wc19jb25zdHNfZjsgKytqKSB7CiAgICAgICAgICAgIGkgPSBUaGlzLT5jb250YWluZWRfcHNfY29uc3RzX2Zbal07CiAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nICVwIGZyb20gJXAgJWQgdG8geyAlZiwgJWYsICVmLCAlZiB9XG4iLCBUaGlzLCB0YXJnZXRTdGF0ZUJsb2NrLCBpLAogICAgICAgICAgICAgICAgdGFyZ2V0U3RhdGVCbG9jay0+cGl4ZWxTaGFkZXJDb25zdGFudEZbaSAqIDRdLAogICAgICAgICAgICAgICAgdGFyZ2V0U3RhdGVCbG9jay0+cGl4ZWxTaGFkZXJDb25zdGFudEZbaSAqIDQgKyAxXSwKICAgICAgICAgICAgICAgIHRhcmdldFN0YXRlQmxvY2stPnBpeGVsU2hhZGVyQ29uc3RhbnRGW2kgKiA0ICsgMl0sCiAgICAgICAgICAgICAgICB0YXJnZXRTdGF0ZUJsb2NrLT5waXhlbFNoYWRlckNvbnN0YW50RltpICogNCArIDNdKTsKCiAgICAgICAgICAgIFRoaXMtPnBpeGVsU2hhZGVyQ29uc3RhbnRGW2kgKiA0XSAgICAgID0gdGFyZ2V0U3RhdGVCbG9jay0+cGl4ZWxTaGFkZXJDb25zdGFudEZbaSAqIDRdOwogICAgICAgICAgICBUaGlzLT5waXhlbFNoYWRlckNvbnN0YW50RltpICogNCArIDFdICA9IHRhcmdldFN0YXRlQmxvY2stPnBpeGVsU2hhZGVyQ29uc3RhbnRGW2kgKiA0ICsgMV07CiAgICAgICAgICAgIFRoaXMtPnBpeGVsU2hhZGVyQ29uc3RhbnRGW2kgKiA0ICsgMl0gID0gdGFyZ2V0U3RhdGVCbG9jay0+cGl4ZWxTaGFkZXJDb25zdGFudEZbaSAqIDQgKyAyXTsKICAgICAgICAgICAgVGhpcy0+cGl4ZWxTaGFkZXJDb25zdGFudEZbaSAqIDQgKyAzXSAgPSB0YXJnZXRTdGF0ZUJsb2NrLT5waXhlbFNoYWRlckNvbnN0YW50RltpICogNCArIDNdOwogICAgICAgIH0KCiAgICAgICAgLyogUGl4ZWwgU2hhZGVyIEludGVnZXIgQ29uc3RhbnRzICovCiAgICAgICAgZm9yIChqID0gMDsgaiA8IFRoaXMtPm51bV9jb250YWluZWRfcHNfY29uc3RzX2k7ICsraikgewogICAgICAgICAgICBpID0gVGhpcy0+Y29udGFpbmVkX3BzX2NvbnN0c19pW2pdOwogICAgICAgICAgICBUUkFDRSgiU2V0dGluZyAlcCBmcm9tICVwICVkIHRvIHsgJWQsICVkLCAlZCwgJWQgfVxuIiwgVGhpcywgdGFyZ2V0U3RhdGVCbG9jaywgaSwKICAgICAgICAgICAgICAgIHRhcmdldFN0YXRlQmxvY2stPnBpeGVsU2hhZGVyQ29uc3RhbnRJW2kgKiA0XSwKICAgICAgICAgICAgICAgIHRhcmdldFN0YXRlQmxvY2stPnBpeGVsU2hhZGVyQ29uc3RhbnRJW2kgKiA0ICsgMV0sCiAgICAgICAgICAgICAgICB0YXJnZXRTdGF0ZUJsb2NrLT5waXhlbFNoYWRlckNvbnN0YW50SVtpICogNCArIDJdLAogICAgICAgICAgICAgICAgdGFyZ2V0U3RhdGVCbG9jay0+cGl4ZWxTaGFkZXJDb25zdGFudElbaSAqIDQgKyAzXSk7CgogICAgICAgICAgICBUaGlzLT5waXhlbFNoYWRlckNvbnN0YW50SVtpICogNF0gICAgICA9IHRhcmdldFN0YXRlQmxvY2stPnBpeGVsU2hhZGVyQ29uc3RhbnRJW2kgKiA0XTsKICAgICAgICAgICAgVGhpcy0+cGl4ZWxTaGFkZXJDb25zdGFudElbaSAqIDQgKyAxXSAgPSB0YXJnZXRTdGF0ZUJsb2NrLT5waXhlbFNoYWRlckNvbnN0YW50SVtpICogNCArIDFdOwogICAgICAgICAgICBUaGlzLT5waXhlbFNoYWRlckNvbnN0YW50SVtpICogNCArIDJdICA9IHRhcmdldFN0YXRlQmxvY2stPnBpeGVsU2hhZGVyQ29uc3RhbnRJW2kgKiA0ICsgMl07CiAgICAgICAgICAgIFRoaXMtPnBpeGVsU2hhZGVyQ29uc3RhbnRJW2kgKiA0ICsgM10gID0gdGFyZ2V0U3RhdGVCbG9jay0+cGl4ZWxTaGFkZXJDb25zdGFudElbaSAqIDQgKyAzXTsKICAgICAgICB9CgogICAgICAgIC8qIFBpeGVsIFNoYWRlciBCb29sZWFuIENvbnN0YW50cyAqLwogICAgICAgIGZvciAoaiA9IDA7IGogPCBUaGlzLT5udW1fY29udGFpbmVkX3BzX2NvbnN0c19iOyArK2opIHsKICAgICAgICAgICAgaSA9IFRoaXMtPmNvbnRhaW5lZF9wc19jb25zdHNfYltqXTsKICAgICAgICAgICAgVFJBQ0UoIlNldHRpbmcgJXAgZnJvbSAlcCAlZCB0byAlc1xuIiwgVGhpcywgdGFyZ2V0U3RhdGVCbG9jaywgaSwKICAgICAgICAgICAgICAgIHRhcmdldFN0YXRlQmxvY2stPnBpeGVsU2hhZGVyQ29uc3RhbnRCW2ldPyAiVFJVRSI6IkZBTFNFIik7CgogICAgICAgICAgICBUaGlzLT5waXhlbFNoYWRlckNvbnN0YW50QltpXSA9ICB0YXJnZXRTdGF0ZUJsb2NrLT5waXhlbFNoYWRlckNvbnN0YW50QltpXTsKICAgICAgICB9CgogICAgICAgIC8qIE90aGVycyArIFJlbmRlciAmIFRleHR1cmUgKi8KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgVGhpcy0+bnVtX2NvbnRhaW5lZF90cmFuc2Zvcm1fc3RhdGVzOyBpKyspIHsKICAgICAgICAgICAgVFJBQ0UoIlVwZGF0aW5nIHRyYW5zZm9ybSAlZFxuIiwgaSk7CiAgICAgICAgICAgIFRoaXMtPnRyYW5zZm9ybXNbVGhpcy0+Y29udGFpbmVkX3RyYW5zZm9ybV9zdGF0ZXNbaV1dID0KICAgICAgICAgICAgICAgIHRhcmdldFN0YXRlQmxvY2stPnRyYW5zZm9ybXNbVGhpcy0+Y29udGFpbmVkX3RyYW5zZm9ybV9zdGF0ZXNbaV1dOwogICAgICAgIH0KCiAgICAgICAgaWYgKFRoaXMtPmNoYW5nZWQuaW5kaWNlcyAmJiAoKFRoaXMtPnBJbmRleERhdGEgIT0gdGFyZ2V0U3RhdGVCbG9jay0+cEluZGV4RGF0YSkKICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFRoaXMtPmJhc2VWZXJ0ZXhJbmRleCAhPSB0YXJnZXRTdGF0ZUJsb2NrLT5iYXNlVmVydGV4SW5kZXgpKSkgewogICAgICAgICAgICBUUkFDRSgiVXBkYXRpbmcgcGluZGV4RGF0YSB0byAlcCwgYmFzZVZlcnRleEluZGV4IHRvICVkXG4iLAogICAgICAgICAgICAgICAgICB0YXJnZXRTdGF0ZUJsb2NrLT5wSW5kZXhEYXRhLCB0YXJnZXRTdGF0ZUJsb2NrLT5iYXNlVmVydGV4SW5kZXgpOwogICAgICAgICAgICBpZih0YXJnZXRTdGF0ZUJsb2NrLT5wSW5kZXhEYXRhKSBJV2luZUQzREluZGV4QnVmZmVyX0FkZFJlZih0YXJnZXRTdGF0ZUJsb2NrLT5wSW5kZXhEYXRhKTsKICAgICAgICAgICAgaWYoVGhpcy0+cEluZGV4RGF0YSkgSVdpbmVEM0RJbmRleEJ1ZmZlcl9SZWxlYXNlKFRoaXMtPnBJbmRleERhdGEpOwogICAgICAgICAgICBUaGlzLT5wSW5kZXhEYXRhID0gdGFyZ2V0U3RhdGVCbG9jay0+cEluZGV4RGF0YTsKICAgICAgICAgICAgVGhpcy0+YmFzZVZlcnRleEluZGV4ID0gdGFyZ2V0U3RhdGVCbG9jay0+YmFzZVZlcnRleEluZGV4OwogICAgICAgIH0KCiAgICAgICAgaWYoVGhpcy0+Y2hhbmdlZC52ZXJ0ZXhEZWNsICYmIFRoaXMtPnZlcnRleERlY2wgIT0gdGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4RGVjbCl7CiAgICAgICAgICAgIFRSQUNFKCJVcGRhdGluZyB2ZXJ0ZXggZGVjbGFyYXRpb24gZnJvbSAlcCB0byAlcFxuIiwgVGhpcy0+dmVydGV4RGVjbCwgdGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4RGVjbCk7CgogICAgICAgICAgICBUaGlzLT52ZXJ0ZXhEZWNsID0gdGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4RGVjbDsKICAgICAgICB9CgogICAgICAgIGlmKFRoaXMtPmNoYW5nZWQuZnZmICYmIFRoaXMtPmZ2ZiAhPSB0YXJnZXRTdGF0ZUJsb2NrLT5mdmYpewogICAgICAgICAgICBUaGlzLT5mdmYgPSB0YXJnZXRTdGF0ZUJsb2NrLT5mdmY7CiAgICAgICAgfQoKICAgICAgICBpZiAoVGhpcy0+Y2hhbmdlZC5tYXRlcmlhbCAmJiBtZW1jbXAoJnRhcmdldFN0YXRlQmxvY2stPm1hdGVyaWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlRoaXMtPm1hdGVyaWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFdJTkVEM0RNQVRFUklBTCkpICE9IDApIHsKICAgICAgICAgICAgVFJBQ0UoIlVwZGF0aW5nIG1hdGVyaWFsXG4iKTsKICAgICAgICAgICAgVGhpcy0+bWF0ZXJpYWwgPSB0YXJnZXRTdGF0ZUJsb2NrLT5tYXRlcmlhbDsKICAgICAgICB9CgogICAgICAgIGlmIChUaGlzLT5jaGFuZ2VkLnZpZXdwb3J0ICYmIG1lbWNtcCgmdGFyZ2V0U3RhdGVCbG9jay0+dmlld3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmVGhpcy0+dmlld3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoV0lORUQzRFZJRVdQT1JUKSkgIT0gMCkgewogICAgICAgICAgICBUUkFDRSgiVXBkYXRpbmcgdmlld3BvcnRcbiIpOwogICAgICAgICAgICBUaGlzLT52aWV3cG9ydCA9IHRhcmdldFN0YXRlQmxvY2stPnZpZXdwb3J0OwogICAgICAgIH0KCiAgICAgICAgaWYoVGhpcy0+Y2hhbmdlZC5zY2lzc29yUmVjdCAmJiBtZW1jbXAoJnRhcmdldFN0YXRlQmxvY2stPnNjaXNzb3JSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlRoaXMtPnNjaXNzb3JSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRhcmdldFN0YXRlQmxvY2stPnNjaXNzb3JSZWN0KSkpCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgiVXBkYXRpbmcgc2Npc3NvciByZWN0XG4iKTsKICAgICAgICAgICAgdGFyZ2V0U3RhdGVCbG9jay0+c2Npc3NvclJlY3QgPSBUaGlzLT5zY2lzc29yUmVjdDsKICAgICAgICB9CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfU1RSRUFNUzsgaSsrKSB7CiAgICAgICAgICAgIGlmIChUaGlzLT5jaGFuZ2VkLnN0cmVhbVNvdXJjZVtpXSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChUaGlzLT5zdHJlYW1TdHJpZGVbaV0gIT0gdGFyZ2V0U3RhdGVCbG9jay0+c3RyZWFtU3RyaWRlW2ldKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRoaXMtPnN0cmVhbVNvdXJjZVtpXSAhPSB0YXJnZXRTdGF0ZUJsb2NrLT5zdHJlYW1Tb3VyY2VbaV0pKSkgewogICAgICAgICAgICAgICAgVFJBQ0UoIlVwZGF0aW5nIHN0cmVhbSBzb3VyY2UgJWQgdG8gJXAsIHN0cmlkZSB0byAlZFxuIiwgaSwgdGFyZ2V0U3RhdGVCbG9jay0+c3RyZWFtU291cmNlW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U3RhdGVCbG9jay0+c3RyZWFtU3RyaWRlW2ldKTsKICAgICAgICAgICAgICAgIFRoaXMtPnN0cmVhbVN0cmlkZVtpXSA9IHRhcmdldFN0YXRlQmxvY2stPnN0cmVhbVN0cmlkZVtpXTsKICAgICAgICAgICAgICAgIGlmKHRhcmdldFN0YXRlQmxvY2stPnN0cmVhbVNvdXJjZVtpXSkgSVdpbmVEM0RWZXJ0ZXhCdWZmZXJfQWRkUmVmKHRhcmdldFN0YXRlQmxvY2stPnN0cmVhbVNvdXJjZVtpXSk7CiAgICAgICAgICAgICAgICBpZihUaGlzLT5zdHJlYW1Tb3VyY2VbaV0pIElXaW5lRDNEVmVydGV4QnVmZmVyX1JlbGVhc2UoVGhpcy0+c3RyZWFtU291cmNlW2ldKTsKICAgICAgICAgICAgICAgIFRoaXMtPnN0cmVhbVNvdXJjZVtpXSA9IHRhcmdldFN0YXRlQmxvY2stPnN0cmVhbVNvdXJjZVtpXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKFRoaXMtPmNoYW5nZWQuc3RyZWFtRnJlcVtpXSAmJgogICAgICAgICAgICAoVGhpcy0+c3RyZWFtRnJlcVtpXSAhPSB0YXJnZXRTdGF0ZUJsb2NrLT5zdHJlYW1GcmVxW2ldCiAgICAgICAgICAgIHx8IFRoaXMtPnN0cmVhbUZsYWdzW2ldICE9IHRhcmdldFN0YXRlQmxvY2stPnN0cmVhbUZsYWdzW2ldKSl7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0UoIlVwZGF0aW5nIHN0cmVhbSBmcmVxdWVuY3kgJWQgdG8gJWQgZmxhZ3MgdG8gJWRcbiIsIGkgLCAgdGFyZ2V0U3RhdGVCbG9jay0+c3RyZWFtRnJlcVtpXSAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U3RhdGVCbG9jay0+c3RyZWFtRmxhZ3NbaV0pOwogICAgICAgICAgICAgICAgICAgIFRoaXMtPnN0cmVhbUZyZXFbaV0gID0gIHRhcmdldFN0YXRlQmxvY2stPnN0cmVhbUZyZXFbaV07CiAgICAgICAgICAgICAgICAgICAgVGhpcy0+c3RyZWFtRmxhZ3NbaV0gPSAgdGFyZ2V0U3RhdGVCbG9jay0+c3RyZWFtRmxhZ3NbaV07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBHTF9MSU1JVFMoY2xpcHBsYW5lcyk7IGkrKykgewogICAgICAgICAgICBpZiAoVGhpcy0+Y2hhbmdlZC5jbGlwcGxhbmVbaV0gJiYgbWVtY21wKCZ0YXJnZXRTdGF0ZUJsb2NrLT5jbGlwcGxhbmVbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlRoaXMtPmNsaXBwbGFuZVtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVGhpcy0+Y2xpcHBsYW5lKSkgIT0gMCkgewoKICAgICAgICAgICAgICAgIFRSQUNFKCJVcGRhdGluZyBjbGlwcGxhbmUgJWRcbiIsIGkpOwogICAgICAgICAgICAgICAgbWVtY3B5KCZUaGlzLT5jbGlwcGxhbmVbaV0sICZ0YXJnZXRTdGF0ZUJsb2NrLT5jbGlwcGxhbmVbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVGhpcy0+Y2xpcHBsYW5lKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIFJlbmRlciAqLwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBUaGlzLT5udW1fY29udGFpbmVkX3JlbmRlcl9zdGF0ZXM7IGkrKykgewogICAgICAgICAgICBUUkFDRSgiVXBkYXRpbmcgcmVuZGVyU3RhdGUgJWQgdG8gJWRcbiIsCiAgICAgICAgICAgICAgICAgIFRoaXMtPmNvbnRhaW5lZF9yZW5kZXJfc3RhdGVzW2ldLCB0YXJnZXRTdGF0ZUJsb2NrLT5yZW5kZXJTdGF0ZVtUaGlzLT5jb250YWluZWRfcmVuZGVyX3N0YXRlc1tpXV0pOwogICAgICAgICAgICBUaGlzLT5yZW5kZXJTdGF0ZVtUaGlzLT5jb250YWluZWRfcmVuZGVyX3N0YXRlc1tpXV0gPSB0YXJnZXRTdGF0ZUJsb2NrLT5yZW5kZXJTdGF0ZVtUaGlzLT5jb250YWluZWRfcmVuZGVyX3N0YXRlc1tpXV07CiAgICAgICAgfQoKICAgICAgICAvKiBUZXh0dXJlIHN0YXRlcyAqLwogICAgICAgIGZvciAoaiA9IDA7IGogPCBUaGlzLT5udW1fY29udGFpbmVkX3Rzc19zdGF0ZXM7IGorKykgewogICAgICAgICAgICBEV09SRCBzdGFnZSA9IFRoaXMtPmNvbnRhaW5lZF90c3Nfc3RhdGVzW2pdLnN0YWdlOwogICAgICAgICAgICBEV09SRCBzdGF0ZSA9IFRoaXMtPmNvbnRhaW5lZF90c3Nfc3RhdGVzW2pdLnN0YXRlOwoKICAgICAgICAgICAgVFJBQ0UoIlVwZGF0aW5nIHRleHR1cmVzdGFnZXN0YXRlICVkLCVkIHRvICVkICh3YXMgJWQpXG4iLCBzdGFnZSxzdGF0ZSwKICAgICAgICAgICAgICAgICAgdGFyZ2V0U3RhdGVCbG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtzdGF0ZV0sIFRoaXMtPnRleHR1cmVTdGF0ZVtzdGFnZV1bc3RhdGVdKTsKICAgICAgICAgICAgICAgICAgICBUaGlzLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW3N0YXRlXSA9ICB0YXJnZXRTdGF0ZUJsb2NrLT50ZXh0dXJlU3RhdGVbc3RhZ2VdW3N0YXRlXTsKICAgICAgICB9CgogICAgICAgIC8qIFNhbXBsZXJzICovCiAgICAgICAgLyogVE9ETzogbW92ZSBvdmVyIHRvIHVzaW5nIG1lbWNweSAqLwogICAgICAgIGZvciAoaiA9IDA7IGogPCBNQVhfQ09NQklORURfU0FNUExFUlM7IGorKykgewogICAgICAgICAgICBpZiAoVGhpcy0+Y2hhbmdlZC50ZXh0dXJlc1tqXSkgewogICAgICAgICAgICAgICAgVFJBQ0UoIlVwZGF0aW5nIHRleHR1cmUgJWQgdG8gJXAgKHdhcyAlcClcbiIsIGosIHRhcmdldFN0YXRlQmxvY2stPnRleHR1cmVzW2pdLCAgVGhpcy0+dGV4dHVyZXNbal0pOwogICAgICAgICAgICAgICAgVGhpcy0+dGV4dHVyZXNbal0gPSB0YXJnZXRTdGF0ZUJsb2NrLT50ZXh0dXJlc1tqXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yIChqID0gMDsgaiA8IFRoaXMtPm51bV9jb250YWluZWRfc2FtcGxlcl9zdGF0ZXM7IGorKykgewogICAgICAgICAgICBEV09SRCBzdGFnZSA9IFRoaXMtPmNvbnRhaW5lZF9zYW1wbGVyX3N0YXRlc1tqXS5zdGFnZTsKICAgICAgICAgICAgRFdPUkQgc3RhdGUgPSBUaGlzLT5jb250YWluZWRfc2FtcGxlcl9zdGF0ZXNbal0uc3RhdGU7CiAgICAgICAgICAgIFRSQUNFKCJVcGRhdGluZyBzYW1wbGVyIHN0YXRlICVkLCVkIHRvICVkICh3YXMgJWQpXG4iLAogICAgICAgICAgICAgICAgc3RhZ2UsIHN0YXRlLCB0YXJnZXRTdGF0ZUJsb2NrLT5zYW1wbGVyU3RhdGVbc3RhZ2VdW3N0YXRlXSwKICAgICAgICAgICAgICAgIFRoaXMtPnNhbXBsZXJTdGF0ZVtzdGFnZV1bc3RhdGVdKTsKICAgICAgICAgICAgVGhpcy0+c2FtcGxlclN0YXRlW3N0YWdlXVtzdGF0ZV0gPSB0YXJnZXRTdGF0ZUJsb2NrLT5zYW1wbGVyU3RhdGVbc3RhZ2VdW3N0YXRlXTsKICAgICAgICB9CiAgICAgICAgaWYoVGhpcy0+Y2hhbmdlZC5waXhlbFNoYWRlciAmJiBUaGlzLT5waXhlbFNoYWRlciAhPSB0YXJnZXRTdGF0ZUJsb2NrLT5waXhlbFNoYWRlcikgewogICAgICAgICAgICBpZih0YXJnZXRTdGF0ZUJsb2NrLT5waXhlbFNoYWRlcikgSVdpbmVEM0RQaXhlbFNoYWRlcl9BZGRSZWYodGFyZ2V0U3RhdGVCbG9jay0+cGl4ZWxTaGFkZXIpOwogICAgICAgICAgICBpZihUaGlzLT5waXhlbFNoYWRlcikgSVdpbmVEM0RQaXhlbFNoYWRlcl9SZWxlYXNlKFRoaXMtPnBpeGVsU2hhZGVyKTsKICAgICAgICAgICAgVGhpcy0+cGl4ZWxTaGFkZXIgPSB0YXJnZXRTdGF0ZUJsb2NrLT5waXhlbFNoYWRlcjsKICAgICAgICB9CgogICAgICAgIHJlY29yZF9saWdodHMoVGhpcywgdGFyZ2V0U3RhdGVCbG9jayk7CiAgICB9IGVsc2UgaWYoVGhpcy0+YmxvY2tUeXBlID09IFdJTkVEM0RTQlRfQUxMKSB7CiAgICAgICAgVGhpcy0+dmVydGV4RGVjbCA9IHRhcmdldFN0YXRlQmxvY2stPnZlcnRleERlY2w7CiAgICAgICAgbWVtY3B5KFRoaXMtPnZlcnRleFNoYWRlckNvbnN0YW50QiwgdGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyQ29uc3RhbnRCLCBzaXplb2YoVGhpcy0+dmVydGV4U2hhZGVyQ29uc3RhbnRJKSk7CiAgICAgICAgbWVtY3B5KFRoaXMtPnZlcnRleFNoYWRlckNvbnN0YW50SSwgdGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyQ29uc3RhbnRJLCBzaXplb2YoVGhpcy0+dmVydGV4U2hhZGVyQ29uc3RhbnRGKSk7CiAgICAgICAgbWVtY3B5KFRoaXMtPnZlcnRleFNoYWRlckNvbnN0YW50RiwgdGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyQ29uc3RhbnRGLCBzaXplb2YoZmxvYXQpICogR0xfTElNSVRTKHZzaGFkZXJfY29uc3RhbnRzRikgKiA0KTsKICAgICAgICBtZW1jcHkoVGhpcy0+c3RyZWFtU3RyaWRlLCB0YXJnZXRTdGF0ZUJsb2NrLT5zdHJlYW1TdHJpZGUsIHNpemVvZihUaGlzLT5zdHJlYW1TdHJpZGUpKTsKICAgICAgICBtZW1jcHkoVGhpcy0+c3RyZWFtT2Zmc2V0LCB0YXJnZXRTdGF0ZUJsb2NrLT5zdHJlYW1PZmZzZXQsIHNpemVvZihUaGlzLT5zdHJlYW1PZmZzZXQpKTsKICAgICAgICBtZW1jcHkoVGhpcy0+c3RyZWFtRnJlcSwgdGFyZ2V0U3RhdGVCbG9jay0+c3RyZWFtRnJlcSwgc2l6ZW9mKFRoaXMtPnN0cmVhbUZyZXEpKTsKICAgICAgICBtZW1jcHkoVGhpcy0+c3RyZWFtRmxhZ3MsIHRhcmdldFN0YXRlQmxvY2stPnN0cmVhbUZsYWdzLCBzaXplb2YoVGhpcy0+c3RyZWFtRmxhZ3MpKTsKICAgICAgICBUaGlzLT5iYXNlVmVydGV4SW5kZXggPSB0YXJnZXRTdGF0ZUJsb2NrLT5iYXNlVmVydGV4SW5kZXg7CiAgICAgICAgbWVtY3B5KFRoaXMtPnRyYW5zZm9ybXMsIHRhcmdldFN0YXRlQmxvY2stPnRyYW5zZm9ybXMsIHNpemVvZihUaGlzLT50cmFuc2Zvcm1zKSk7CiAgICAgICAgcmVjb3JkX2xpZ2h0cyhUaGlzLCB0YXJnZXRTdGF0ZUJsb2NrKTsKICAgICAgICBtZW1jcHkoVGhpcy0+Y2xpcHBsYW5lLCB0YXJnZXRTdGF0ZUJsb2NrLT5jbGlwcGxhbmUsIHNpemVvZihUaGlzLT5jbGlwcGxhbmUpKTsKICAgICAgICBUaGlzLT5jbGlwX3N0YXR1cyA9IHRhcmdldFN0YXRlQmxvY2stPmNsaXBfc3RhdHVzOwogICAgICAgIFRoaXMtPnZpZXdwb3J0ID0gdGFyZ2V0U3RhdGVCbG9jay0+dmlld3BvcnQ7CiAgICAgICAgVGhpcy0+bWF0ZXJpYWwgPSB0YXJnZXRTdGF0ZUJsb2NrLT5tYXRlcmlhbDsKICAgICAgICBtZW1jcHkoVGhpcy0+cGl4ZWxTaGFkZXJDb25zdGFudEIsIHRhcmdldFN0YXRlQmxvY2stPnBpeGVsU2hhZGVyQ29uc3RhbnRCLCBzaXplb2YoVGhpcy0+cGl4ZWxTaGFkZXJDb25zdGFudEkpKTsKICAgICAgICBtZW1jcHkoVGhpcy0+cGl4ZWxTaGFkZXJDb25zdGFudEksIHRhcmdldFN0YXRlQmxvY2stPnBpeGVsU2hhZGVyQ29uc3RhbnRJLCBzaXplb2YoVGhpcy0+cGl4ZWxTaGFkZXJDb25zdGFudEYpKTsKICAgICAgICBtZW1jcHkoVGhpcy0+cGl4ZWxTaGFkZXJDb25zdGFudEYsIHRhcmdldFN0YXRlQmxvY2stPnBpeGVsU2hhZGVyQ29uc3RhbnRGLCBzaXplb2YoZmxvYXQpICogR0xfTElNSVRTKHBzaGFkZXJfY29uc3RhbnRzRikgKiA0KTsKICAgICAgICBtZW1jcHkoVGhpcy0+cmVuZGVyU3RhdGUsIHRhcmdldFN0YXRlQmxvY2stPnJlbmRlclN0YXRlLCBzaXplb2YoVGhpcy0+cmVuZGVyU3RhdGUpKTsKICAgICAgICBtZW1jcHkoVGhpcy0+dGV4dHVyZXMsIHRhcmdldFN0YXRlQmxvY2stPnRleHR1cmVzLCBzaXplb2YoVGhpcy0+dGV4dHVyZXMpKTsKICAgICAgICBtZW1jcHkoVGhpcy0+dGV4dHVyZURpbWVuc2lvbnMsIHRhcmdldFN0YXRlQmxvY2stPnRleHR1cmVEaW1lbnNpb25zLCBzaXplb2YoVGhpcy0+dGV4dHVyZURpbWVuc2lvbnMpKTsKICAgICAgICBtZW1jcHkoVGhpcy0+dGV4dHVyZVN0YXRlLCB0YXJnZXRTdGF0ZUJsb2NrLT50ZXh0dXJlU3RhdGUsIHNpemVvZihUaGlzLT50ZXh0dXJlU3RhdGUpKTsKICAgICAgICBtZW1jcHkoVGhpcy0+c2FtcGxlclN0YXRlLCB0YXJnZXRTdGF0ZUJsb2NrLT5zYW1wbGVyU3RhdGUsIHNpemVvZihUaGlzLT5zYW1wbGVyU3RhdGUpKTsKICAgICAgICBUaGlzLT5zY2lzc29yUmVjdCA9IHRhcmdldFN0YXRlQmxvY2stPnNjaXNzb3JSZWN0OwoKICAgICAgICBpZih0YXJnZXRTdGF0ZUJsb2NrLT5wSW5kZXhEYXRhICE9IFRoaXMtPnBJbmRleERhdGEpIHsKICAgICAgICAgICAgaWYodGFyZ2V0U3RhdGVCbG9jay0+cEluZGV4RGF0YSkgSVdpbmVEM0RJbmRleEJ1ZmZlcl9BZGRSZWYodGFyZ2V0U3RhdGVCbG9jay0+cEluZGV4RGF0YSk7CiAgICAgICAgICAgIGlmKFRoaXMtPnBJbmRleERhdGEpIElXaW5lRDNESW5kZXhCdWZmZXJfUmVsZWFzZShUaGlzLT5wSW5kZXhEYXRhKTsKICAgICAgICAgICAgVGhpcy0+cEluZGV4RGF0YSA9IHRhcmdldFN0YXRlQmxvY2stPnBJbmRleERhdGE7CiAgICAgICAgfQogICAgICAgIGZvcihpID0gMDsgaSA8IE1BWF9TVFJFQU1TOyBpKyspIHsKICAgICAgICAgICAgaWYodGFyZ2V0U3RhdGVCbG9jay0+c3RyZWFtU291cmNlW2ldICE9IFRoaXMtPnN0cmVhbVNvdXJjZVtpXSkgewogICAgICAgICAgICAgICAgaWYodGFyZ2V0U3RhdGVCbG9jay0+c3RyZWFtU291cmNlW2ldKSBJV2luZUQzRFZlcnRleEJ1ZmZlcl9BZGRSZWYodGFyZ2V0U3RhdGVCbG9jay0+c3RyZWFtU291cmNlW2ldKTsKICAgICAgICAgICAgICAgIGlmKFRoaXMtPnN0cmVhbVNvdXJjZVtpXSkgSVdpbmVEM0RWZXJ0ZXhCdWZmZXJfUmVsZWFzZShUaGlzLT5zdHJlYW1Tb3VyY2VbaV0pOwogICAgICAgICAgICAgICAgVGhpcy0+c3RyZWFtU291cmNlW2ldID0gdGFyZ2V0U3RhdGVCbG9jay0+c3RyZWFtU291cmNlW2ldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKFRoaXMtPnZlcnRleFNoYWRlciAhPSB0YXJnZXRTdGF0ZUJsb2NrLT52ZXJ0ZXhTaGFkZXIpIHsKICAgICAgICAgICAgaWYodGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyKSBJV2luZUQzRFZlcnRleFNoYWRlcl9BZGRSZWYodGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyKTsKICAgICAgICAgICAgaWYoVGhpcy0+dmVydGV4U2hhZGVyKSBJV2luZUQzRFZlcnRleFNoYWRlcl9SZWxlYXNlKFRoaXMtPnZlcnRleFNoYWRlcik7CiAgICAgICAgICAgIFRoaXMtPnZlcnRleFNoYWRlciA9IHRhcmdldFN0YXRlQmxvY2stPnZlcnRleFNoYWRlcjsKICAgICAgICB9CiAgICAgICAgaWYoVGhpcy0+cGl4ZWxTaGFkZXIgIT0gdGFyZ2V0U3RhdGVCbG9jay0+cGl4ZWxTaGFkZXIpIHsKICAgICAgICAgICAgaWYodGFyZ2V0U3RhdGVCbG9jay0+cGl4ZWxTaGFkZXIpIElXaW5lRDNEUGl4ZWxTaGFkZXJfQWRkUmVmKHRhcmdldFN0YXRlQmxvY2stPnBpeGVsU2hhZGVyKTsKICAgICAgICAgICAgaWYoVGhpcy0+cGl4ZWxTaGFkZXIpIElXaW5lRDNEUGl4ZWxTaGFkZXJfUmVsZWFzZShUaGlzLT5waXhlbFNoYWRlcik7CiAgICAgICAgICAgIFRoaXMtPnBpeGVsU2hhZGVyID0gdGFyZ2V0U3RhdGVCbG9jay0+cGl4ZWxTaGFkZXI7CiAgICAgICAgfQogICAgfSBlbHNlIGlmKFRoaXMtPmJsb2NrVHlwZSA9PSBXSU5FRDNEU0JUX1ZFUlRFWFNUQVRFKSB7CiAgICAgICAgbWVtY3B5KFRoaXMtPnZlcnRleFNoYWRlckNvbnN0YW50QiwgdGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyQ29uc3RhbnRCLCBzaXplb2YoVGhpcy0+dmVydGV4U2hhZGVyQ29uc3RhbnRJKSk7CiAgICAgICAgbWVtY3B5KFRoaXMtPnZlcnRleFNoYWRlckNvbnN0YW50SSwgdGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyQ29uc3RhbnRJLCBzaXplb2YoVGhpcy0+dmVydGV4U2hhZGVyQ29uc3RhbnRGKSk7CiAgICAgICAgbWVtY3B5KFRoaXMtPnZlcnRleFNoYWRlckNvbnN0YW50RiwgdGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyQ29uc3RhbnRGLCBzaXplb2YoZmxvYXQpICogR0xfTElNSVRTKHZzaGFkZXJfY29uc3RhbnRzRikgKiA0KTsKICAgICAgICByZWNvcmRfbGlnaHRzKFRoaXMsIHRhcmdldFN0YXRlQmxvY2spOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fU0FWRURWRVJURVhTVEFURVNfUjsgaSsrKSB7CiAgICAgICAgICAgIFRoaXMtPnJlbmRlclN0YXRlW1NhdmVkVmVydGV4U3RhdGVzX1JbaV1dID0gdGFyZ2V0U3RhdGVCbG9jay0+cmVuZGVyU3RhdGVbU2F2ZWRWZXJ0ZXhTdGF0ZXNfUltpXV07CiAgICAgICAgfQogICAgICAgIGZvciAoaiA9IDA7IGogPCBNQVhfQ09NQklORURfU0FNUExFUlM7IGorKykgewogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1NBVkVEVkVSVEVYU1RBVEVTX1M7IGkrKykgewogICAgICAgICAgICAgICAgVGhpcy0+c2FtcGxlclN0YXRlW2pdW1NhdmVkVmVydGV4U3RhdGVzX1NbaV1dID0gdGFyZ2V0U3RhdGVCbG9jay0+c2FtcGxlclN0YXRlW2pdW1NhdmVkVmVydGV4U3RhdGVzX1NbaV1dOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoaiA9IDA7IGogPCBNQVhfVEVYVFVSRVM7IGorKykgewogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1NBVkVEVkVSVEVYU1RBVEVTX1I7IGkrKykgewogICAgICAgICAgICAgICAgVGhpcy0+dGV4dHVyZVN0YXRlW2pdW1NhdmVkVmVydGV4U3RhdGVzX1JbaV1dID0gdGFyZ2V0U3RhdGVCbG9jay0+dGV4dHVyZVN0YXRlW2pdW1NhdmVkVmVydGV4U3RhdGVzX1JbaV1dOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvcihpID0gMDsgaSA8IE1BWF9TVFJFQU1TOyBpKyspIHsKICAgICAgICAgICAgaWYodGFyZ2V0U3RhdGVCbG9jay0+c3RyZWFtU291cmNlW2ldICE9IFRoaXMtPnN0cmVhbVNvdXJjZVtpXSkgewogICAgICAgICAgICAgICAgaWYodGFyZ2V0U3RhdGVCbG9jay0+c3RyZWFtU291cmNlW2ldKSBJV2luZUQzRFZlcnRleEJ1ZmZlcl9BZGRSZWYodGFyZ2V0U3RhdGVCbG9jay0+c3RyZWFtU291cmNlW2ldKTsKICAgICAgICAgICAgICAgIGlmKFRoaXMtPnN0cmVhbVNvdXJjZVtpXSkgSVdpbmVEM0RWZXJ0ZXhCdWZmZXJfUmVsZWFzZShUaGlzLT5zdHJlYW1Tb3VyY2VbaV0pOwogICAgICAgICAgICAgICAgVGhpcy0+c3RyZWFtU291cmNlW2ldID0gdGFyZ2V0U3RhdGVCbG9jay0+c3RyZWFtU291cmNlW2ldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKFRoaXMtPnZlcnRleFNoYWRlciAhPSB0YXJnZXRTdGF0ZUJsb2NrLT52ZXJ0ZXhTaGFkZXIpIHsKICAgICAgICAgICAgaWYodGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyKSBJV2luZUQzRFZlcnRleFNoYWRlcl9BZGRSZWYodGFyZ2V0U3RhdGVCbG9jay0+dmVydGV4U2hhZGVyKTsKICAgICAgICAgICAgaWYoVGhpcy0+dmVydGV4U2hhZGVyKSBJV2luZUQzRFZlcnRleFNoYWRlcl9SZWxlYXNlKFRoaXMtPnZlcnRleFNoYWRlcik7CiAgICAgICAgICAgIFRoaXMtPnZlcnRleFNoYWRlciA9IHRhcmdldFN0YXRlQmxvY2stPnZlcnRleFNoYWRlcjsKICAgICAgICB9CiAgICB9IGVsc2UgaWYoVGhpcy0+YmxvY2tUeXBlID09IFdJTkVEM0RTQlRfUElYRUxTVEFURSkgewogICAgICAgIG1lbWNweShUaGlzLT5waXhlbFNoYWRlckNvbnN0YW50QiwgdGFyZ2V0U3RhdGVCbG9jay0+cGl4ZWxTaGFkZXJDb25zdGFudEIsIHNpemVvZihUaGlzLT5waXhlbFNoYWRlckNvbnN0YW50SSkpOwogICAgICAgIG1lbWNweShUaGlzLT5waXhlbFNoYWRlckNvbnN0YW50SSwgdGFyZ2V0U3RhdGVCbG9jay0+cGl4ZWxTaGFkZXJDb25zdGFudEksIHNpemVvZihUaGlzLT5waXhlbFNoYWRlckNvbnN0YW50RikpOwogICAgICAgIG1lbWNweShUaGlzLT5waXhlbFNoYWRlckNvbnN0YW50RiwgdGFyZ2V0U3RhdGVCbG9jay0+cGl4ZWxTaGFkZXJDb25zdGFudEYsIHNpemVvZihmbG9hdCkgKiBHTF9MSU1JVFMocHNoYWRlcl9jb25zdGFudHNGKSAqIDQpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fU0FWRURQSVhFTFNUQVRFU19SOyBpKyspIHsKICAgICAgICAgICAgVGhpcy0+cmVuZGVyU3RhdGVbU2F2ZWRQaXhlbFN0YXRlc19SW2ldXSA9IHRhcmdldFN0YXRlQmxvY2stPnJlbmRlclN0YXRlW1NhdmVkUGl4ZWxTdGF0ZXNfUltpXV07CiAgICAgICAgfQogICAgICAgIGZvciAoaiA9IDA7IGogPCBNQVhfQ09NQklORURfU0FNUExFUlM7IGorKykgewogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1NBVkVEUElYRUxTVEFURVNfUzsgaSsrKSB7CiAgICAgICAgICAgICAgICBUaGlzLT5zYW1wbGVyU3RhdGVbal1bU2F2ZWRQaXhlbFN0YXRlc19TW2ldXSA9IHRhcmdldFN0YXRlQmxvY2stPnNhbXBsZXJTdGF0ZVtqXVtTYXZlZFBpeGVsU3RhdGVzX1NbaV1dOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoaiA9IDA7IGogPCBNQVhfVEVYVFVSRVM7IGorKykgewogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1NBVkVEUElYRUxTVEFURVNfUjsgaSsrKSB7CiAgICAgICAgICAgICAgICBUaGlzLT50ZXh0dXJlU3RhdGVbal1bU2F2ZWRQaXhlbFN0YXRlc19SW2ldXSA9IHRhcmdldFN0YXRlQmxvY2stPnRleHR1cmVTdGF0ZVtqXVtTYXZlZFBpeGVsU3RhdGVzX1JbaV1dOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmKFRoaXMtPnBpeGVsU2hhZGVyICE9IHRhcmdldFN0YXRlQmxvY2stPnBpeGVsU2hhZGVyKSB7CiAgICAgICAgICAgIGlmKHRhcmdldFN0YXRlQmxvY2stPnBpeGVsU2hhZGVyKSBJV2luZUQzRFBpeGVsU2hhZGVyX0FkZFJlZih0YXJnZXRTdGF0ZUJsb2NrLT5waXhlbFNoYWRlcik7CiAgICAgICAgICAgIGlmKFRoaXMtPnBpeGVsU2hhZGVyKSBJV2luZUQzRFBpeGVsU2hhZGVyX1JlbGVhc2UoVGhpcy0+cGl4ZWxTaGFkZXIpOwogICAgICAgICAgICBUaGlzLT5waXhlbFNoYWRlciA9IHRhcmdldFN0YXRlQmxvY2stPnBpeGVsU2hhZGVyOwogICAgICAgIH0KICAgIH0KCiAgICBUUkFDRSgiKCVwKSA6IFVwZGF0ZWQgc3RhdGUgYmxvY2sgJXAgLS0tLS0tLS0tLS0tLS0tLS0tXlxuIiwgdGFyZ2V0U3RhdGVCbG9jaywgVGhpcyk7CgogICAgcmV0dXJuIFdJTkVEM0RfT0s7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBhcHBseV9saWdodHMoSVdpbmVEM0REZXZpY2UgKnBEZXZpY2UsIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKlRoaXMpIHsKICAgIFVJTlQgaTsKICAgIGZvcihpID0gMDsgaSA8IExJR0hUTUFQX1NJWkU7IGkrKykgewogICAgICAgIHN0cnVjdCBsaXN0ICplOwoKICAgICAgICBMSVNUX0ZPUl9FQUNIKGUsICZUaGlzLT5saWdodE1hcFtpXSkgewogICAgICAgICAgICBQTElHSFRJTkZPRUwgKmxpZ2h0ID0gTElTVF9FTlRSWShlLCBQTElHSFRJTkZPRUwsIGVudHJ5KTsKCiAgICAgICAgICAgIGlmKGxpZ2h0LT5jaGFuZ2VkKSB7CiAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRMaWdodChwRGV2aWNlLCBsaWdodC0+T3JpZ2luYWxJbmRleCwgJmxpZ2h0LT5PcmlnaW5hbFBhcm1zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihsaWdodC0+ZW5hYmxlZENoYW5nZWQpIHsKICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldExpZ2h0RW5hYmxlKHBEZXZpY2UsIGxpZ2h0LT5PcmlnaW5hbEluZGV4LCBsaWdodC0+Z2xJbmRleCAhPSAtMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyBIUkVTVUxUICBXSU5BUEkgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbF9BcHBseShJV2luZUQzRFN0YXRlQmxvY2sgKmlmYWNlKXsKICAgIElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKlRoaXMgPSAoSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbCAqKWlmYWNlOwogICAgSVdpbmVEM0REZXZpY2UqICAgICAgICBwRGV2aWNlICAgICA9IChJV2luZUQzRERldmljZSopVGhpcy0+d2luZUQzRERldmljZTsKCi8qQ29weSB0aGluZyBvdmVyIHRvIHVwZGF0ZUJsb2NrIGlzIGlzUmVjb3JkaW5nIG90aGVyd2lzZSBTdGF0ZUJsb2NrLApzaG91bGQgcmVhbGx5IHBlcmZvcm0gYSBkZWx0YSBzbyB0aGF0IG9ubHkgdGhlIGNoYW5nZXMgZ2V0IHVwZGF0ZWQqLwoKICAgIFVJTlQgaTsKICAgIFVJTlQgajsKCiAgICBUUkFDRSgiKCVwKSA6IEFwcGx5aW5nIHN0YXRlIGJsb2NrICVwIC0tLS0tLS0tLS0tLS0tLS0tLXZcbiIsIFRoaXMsIHBEZXZpY2UpOwoKICAgIFRSQUNFKCJCbG9ja3R5cGU6ICVkXG4iLCBUaGlzLT5ibG9ja1R5cGUpOwoKICAgIGlmKFRoaXMtPmJsb2NrVHlwZSA9PSBXSU5FRDNEU0JUX1JFQ09SREVEKSB7CiAgICAgICAgaWYgKFRoaXMtPmNoYW5nZWQudmVydGV4U2hhZGVyKSB7CiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFZlcnRleFNoYWRlcihwRGV2aWNlLCBUaGlzLT52ZXJ0ZXhTaGFkZXIpOwogICAgICAgIH0KICAgICAgICAvKiBWZXJ0ZXggU2hhZGVyIENvbnN0YW50cyAqLwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBUaGlzLT5udW1fY29udGFpbmVkX3ZzX2NvbnN0c19mOyBpKyspIHsKICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKHBEZXZpY2UsIFRoaXMtPmNvbnRhaW5lZF92c19jb25zdHNfZltpXSwKICAgICAgICAgICAgICAgICAgICBUaGlzLT52ZXJ0ZXhTaGFkZXJDb25zdGFudEYgKyBUaGlzLT5jb250YWluZWRfdnNfY29uc3RzX2ZbaV0gKiA0LCAxKTsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gMDsgaSA8IFRoaXMtPm51bV9jb250YWluZWRfdnNfY29uc3RzX2k7IGkrKykgewogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEkocERldmljZSwgVGhpcy0+Y29udGFpbmVkX3ZzX2NvbnN0c19pW2ldLAogICAgICAgICAgICAgICAgICAgIFRoaXMtPnZlcnRleFNoYWRlckNvbnN0YW50SSArIFRoaXMtPmNvbnRhaW5lZF92c19jb25zdHNfaVtpXSAqIDQsIDEpOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgVGhpcy0+bnVtX2NvbnRhaW5lZF92c19jb25zdHNfYjsgaSsrKSB7CiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFZlcnRleFNoYWRlckNvbnN0YW50QihwRGV2aWNlLCBUaGlzLT5jb250YWluZWRfdnNfY29uc3RzX2JbaV0sCiAgICAgICAgICAgICAgICAgICAgVGhpcy0+dmVydGV4U2hhZGVyQ29uc3RhbnRCICsgVGhpcy0+Y29udGFpbmVkX3ZzX2NvbnN0c19iW2ldLCAxKTsKICAgICAgICB9CgogICAgICAgIGFwcGx5X2xpZ2h0cyhwRGV2aWNlLCBUaGlzKTsKCiAgICAgICAgaWYgKFRoaXMtPmNoYW5nZWQucGl4ZWxTaGFkZXIpIHsKICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0UGl4ZWxTaGFkZXIocERldmljZSwgVGhpcy0+cGl4ZWxTaGFkZXIpOwogICAgICAgIH0KICAgICAgICAvKiBQaXhlbCBTaGFkZXIgQ29uc3RhbnRzICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8IFRoaXMtPm51bV9jb250YWluZWRfcHNfY29uc3RzX2Y7IGkrKykgewogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRQaXhlbFNoYWRlckNvbnN0YW50RihwRGV2aWNlLCBUaGlzLT5jb250YWluZWRfcHNfY29uc3RzX2ZbaV0sCiAgICAgICAgICAgICAgICAgICAgVGhpcy0+cGl4ZWxTaGFkZXJDb25zdGFudEYgKyBUaGlzLT5jb250YWluZWRfcHNfY29uc3RzX2ZbaV0gKiA0LCAxKTsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gMDsgaSA8IFRoaXMtPm51bV9jb250YWluZWRfcHNfY29uc3RzX2k7IGkrKykgewogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRQaXhlbFNoYWRlckNvbnN0YW50SShwRGV2aWNlLCBUaGlzLT5jb250YWluZWRfcHNfY29uc3RzX2lbaV0sCiAgICAgICAgICAgICAgICAgICAgVGhpcy0+cGl4ZWxTaGFkZXJDb25zdGFudEkgKyBUaGlzLT5jb250YWluZWRfcHNfY29uc3RzX2lbaV0gKiA0LCAxKTsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gMDsgaSA8IFRoaXMtPm51bV9jb250YWluZWRfcHNfY29uc3RzX2I7IGkrKykgewogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRQaXhlbFNoYWRlckNvbnN0YW50QihwRGV2aWNlLCBUaGlzLT5jb250YWluZWRfcHNfY29uc3RzX2JbaV0sCiAgICAgICAgICAgICAgICAgICAgVGhpcy0+cGl4ZWxTaGFkZXJDb25zdGFudEIgKyBUaGlzLT5jb250YWluZWRfcHNfY29uc3RzX2JbaV0sIDEpOwogICAgICAgIH0KCiAgICAgICAgLyogUmVuZGVyICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8PSBUaGlzLT5udW1fY29udGFpbmVkX3JlbmRlcl9zdGF0ZXM7IGkrKykgewogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShwRGV2aWNlLCBUaGlzLT5jb250YWluZWRfcmVuZGVyX3N0YXRlc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+cmVuZGVyU3RhdGVbVGhpcy0+Y29udGFpbmVkX3JlbmRlcl9zdGF0ZXNbaV1dKTsKICAgICAgICB9CiAgICAgICAgLyogVGV4dHVyZSBzdGF0ZXMgKi8KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgVGhpcy0+bnVtX2NvbnRhaW5lZF90c3Nfc3RhdGVzOyBpKyspIHsKICAgICAgICAgICAgRFdPUkQgc3RhZ2UgPSBUaGlzLT5jb250YWluZWRfdHNzX3N0YXRlc1tpXS5zdGFnZTsKICAgICAgICAgICAgRFdPUkQgc3RhdGUgPSBUaGlzLT5jb250YWluZWRfdHNzX3N0YXRlc1tpXS5zdGF0ZTsKICAgICAgICAgICAgKChJV2luZUQzRERldmljZUltcGwgKilwRGV2aWNlKS0+c3RhdGVCbG9jay0+dGV4dHVyZVN0YXRlW3N0YWdlXVtzdGF0ZV0gICAgICAgICA9IFRoaXMtPnRleHR1cmVTdGF0ZVtzdGFnZV1bc3RhdGVdOwogICAgICAgICAgICAoKElXaW5lRDNERGV2aWNlSW1wbCAqKXBEZXZpY2UpLT5zdGF0ZUJsb2NrLT5jaGFuZ2VkLnRleHR1cmVTdGF0ZVtzdGFnZV1bc3RhdGVdID0gVFJVRTsKICAgICAgICAgICAgLyogVE9ETzogUmVjb3JkIGEgZGlzcGxheSBsaXN0IHRvIGFwcGx5IGFsbCBnbCBzdGF0ZXMuIEZvciBub3cgYXBwbHkgYnkgYnJ1dGUgZm9yY2UgKi8KICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VJbXBsX01hcmtTdGF0ZURpcnR5KChJV2luZUQzRERldmljZUltcGwgKilwRGV2aWNlLCBTVEFURV9URVhUVVJFU1RBR0Uoc3RhZ2UsIHN0YXRlKSk7CiAgICAgICAgfQogICAgICAgIC8qIFNhbXBsZXIgc3RhdGVzICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8IFRoaXMtPm51bV9jb250YWluZWRfc2FtcGxlcl9zdGF0ZXM7IGkrKykgewogICAgICAgICAgICBEV09SRCBzdGFnZSA9IFRoaXMtPmNvbnRhaW5lZF9zYW1wbGVyX3N0YXRlc1tpXS5zdGFnZTsKICAgICAgICAgICAgRFdPUkQgc3RhdGUgPSBUaGlzLT5jb250YWluZWRfc2FtcGxlcl9zdGF0ZXNbaV0uc3RhdGU7CiAgICAgICAgICAgICgoSVdpbmVEM0REZXZpY2VJbXBsICopcERldmljZSktPnN0YXRlQmxvY2stPnNhbXBsZXJTdGF0ZVtzdGFnZV1bc3RhdGVdICAgICAgICAgPSBUaGlzLT5zYW1wbGVyU3RhdGVbc3RhZ2VdW3N0YXRlXTsKICAgICAgICAgICAgKChJV2luZUQzRERldmljZUltcGwgKilwRGV2aWNlKS0+c3RhdGVCbG9jay0+Y2hhbmdlZC5zYW1wbGVyU3RhdGVbc3RhZ2VdW3N0YXRlXSA9IFRSVUU7CiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlSW1wbF9NYXJrU3RhdGVEaXJ0eSgoSVdpbmVEM0REZXZpY2VJbXBsICopcERldmljZSwgU1RBVEVfU0FNUExFUihzdGFnZSkpOwogICAgICAgIH0KCiAgICAgICAgZm9yIChpID0gMDsgaSA8IFRoaXMtPm51bV9jb250YWluZWRfdHJhbnNmb3JtX3N0YXRlczsgaSsrKSB7CiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFRyYW5zZm9ybShwRGV2aWNlLCBUaGlzLT5jb250YWluZWRfdHJhbnNmb3JtX3N0YXRlc1tpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZUaGlzLT50cmFuc2Zvcm1zW1RoaXMtPmNvbnRhaW5lZF90cmFuc2Zvcm1fc3RhdGVzW2ldXSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoVGhpcy0+Y2hhbmdlZC5pbmRpY2VzKSB7CiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldEluZGljZXMocERldmljZSwgVGhpcy0+cEluZGV4RGF0YSk7CiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldEJhc2VWZXJ0ZXhJbmRleChwRGV2aWNlLCBUaGlzLT5iYXNlVmVydGV4SW5kZXgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKFRoaXMtPmNoYW5nZWQuZnZmKSB7CiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldEZWRihwRGV2aWNlLCBUaGlzLT5mdmYpOwogICAgICAgIH0KCiAgICAgICAgaWYgKFRoaXMtPmNoYW5nZWQudmVydGV4RGVjbCkgewogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRWZXJ0ZXhEZWNsYXJhdGlvbihwRGV2aWNlLCBUaGlzLT52ZXJ0ZXhEZWNsKTsKICAgICAgICB9CgogICAgICAgIGlmIChUaGlzLT5jaGFuZ2VkLm1hdGVyaWFsICkgewogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRNYXRlcmlhbChwRGV2aWNlLCAmVGhpcy0+bWF0ZXJpYWwpOwogICAgICAgIH0KCiAgICAgICAgaWYgKFRoaXMtPmNoYW5nZWQudmlld3BvcnQpIHsKICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0Vmlld3BvcnQocERldmljZSwgJlRoaXMtPnZpZXdwb3J0KTsKICAgICAgICB9CgogICAgICAgIGlmIChUaGlzLT5jaGFuZ2VkLnNjaXNzb3JSZWN0KSB7CiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFNjaXNzb3JSZWN0KHBEZXZpY2UsICZUaGlzLT5zY2lzc29yUmVjdCk7CiAgICAgICAgfQoKICAgICAgICAvKiBUT0RPOiBQcm9wZXIgaW1wbGVtZW50YXRpb24gdXNpbmcgU2V0U3RyZWFtU291cmNlIG9mZnNldCAoc2V0IHRvIDAgZm9yIHRoZSBtb21lbnQpXG4iKSAqLwogICAgICAgIGZvciAoaT0wOyBpPE1BWF9TVFJFQU1TOyBpKyspIHsKICAgICAgICAgICAgaWYgKFRoaXMtPmNoYW5nZWQuc3RyZWFtU291cmNlW2ldKQogICAgICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0U3RyZWFtU291cmNlKHBEZXZpY2UsIGksIFRoaXMtPnN0cmVhbVNvdXJjZVtpXSwgMCwgVGhpcy0+c3RyZWFtU3RyaWRlW2ldKTsKCiAgICAgICAgICAgIGlmIChUaGlzLT5jaGFuZ2VkLnN0cmVhbUZyZXFbaV0pCiAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRTdHJlYW1Tb3VyY2VGcmVxKHBEZXZpY2UsIGksIFRoaXMtPnN0cmVhbUZyZXFbaV0gfCBUaGlzLT5zdHJlYW1GbGFnc1tpXSk7CiAgICAgICAgfQogICAgICAgIGZvciAoaiA9IDAgOyBqIDwgTUFYX0NPTUJJTkVEX1NBTVBMRVJTOyBqKyspewogICAgICAgICAgICBpZiAoVGhpcy0+Y2hhbmdlZC50ZXh0dXJlc1tqXSkgewogICAgICAgICAgICAgICAgaWYgKGogPCBNQVhfRlJBR01FTlRfU0FNUExFUlMpIHsKICAgICAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRUZXh0dXJlKHBEZXZpY2UsIGosIFRoaXMtPnRleHR1cmVzW2pdKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0VGV4dHVyZShwRGV2aWNlLCBXSU5FRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIwICsgaiAtIE1BWF9GUkFHTUVOVF9TQU1QTEVSUywgVGhpcy0+dGV4dHVyZXNbal0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgR0xfTElNSVRTKGNsaXBwbGFuZXMpOyBpKyspIHsKICAgICAgICAgICAgaWYgKFRoaXMtPmNoYW5nZWQuY2xpcHBsYW5lW2ldKSB7CiAgICAgICAgICAgICAgICBmbG9hdCBjbGlwWzRdOwoKICAgICAgICAgICAgICAgIGNsaXBbMF0gPSBUaGlzLT5jbGlwcGxhbmVbaV1bMF07CiAgICAgICAgICAgICAgICBjbGlwWzFdID0gVGhpcy0+Y2xpcHBsYW5lW2ldWzFdOwogICAgICAgICAgICAgICAgY2xpcFsyXSA9IFRoaXMtPmNsaXBwbGFuZVtpXVsyXTsKICAgICAgICAgICAgICAgIGNsaXBbM10gPSBUaGlzLT5jbGlwcGxhbmVbaV1bM107CiAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRDbGlwUGxhbmUocERldmljZSwgaSwgY2xpcCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfSBlbHNlIGlmKFRoaXMtPmJsb2NrVHlwZSA9PSBXSU5FRDNEU0JUX1ZFUlRFWFNUQVRFKSB7CiAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0VmVydGV4U2hhZGVyKHBEZXZpY2UsIFRoaXMtPnZlcnRleFNoYWRlcik7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IEdMX0xJTUlUUyh2c2hhZGVyX2NvbnN0YW50c0YpOyBpKyspIHsKICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKHBEZXZpY2UsIGksCiAgICAgICAgICAgICAgICAgICAgVGhpcy0+dmVydGV4U2hhZGVyQ29uc3RhbnRGICsgaSAqIDQsIDEpOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTlNUX0k7IGkrKykgewogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEkocERldmljZSwgaSwKICAgICAgICAgICAgICAgICAgICBUaGlzLT52ZXJ0ZXhTaGFkZXJDb25zdGFudEkgKyBpICogNCwgMSk7CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfQ09OU1RfQjsgaSsrKSB7CiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFZlcnRleFNoYWRlckNvbnN0YW50QihwRGV2aWNlLCBpLAogICAgICAgICAgICAgICAgICAgIFRoaXMtPnZlcnRleFNoYWRlckNvbnN0YW50QiArIGksIDEpOwogICAgICAgIH0KCiAgICAgICAgYXBwbHlfbGlnaHRzKHBEZXZpY2UsIFRoaXMpOwoKICAgICAgICBmb3IoaSA9IDA7IGkgPCBOVU1fU0FWRURWRVJURVhTVEFURVNfUjsgaSsrKSB7CiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKHBEZXZpY2UsIFNhdmVkVmVydGV4U3RhdGVzX1JbaV0sIFRoaXMtPnJlbmRlclN0YXRlW1NhdmVkVmVydGV4U3RhdGVzX1JbaV1dKTsKICAgICAgICB9CiAgICAgICAgZm9yKGogPSAwOyBqIDwgTUFYX1RFWFRVUkVTOyBqKyspIHsKICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgTlVNX1NBVkVEVkVSVEVYU1RBVEVTX1Q7IGkrKykgewogICAgICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0VGV4dHVyZVN0YWdlU3RhdGUocERldmljZSwgaiwgU2F2ZWRWZXJ0ZXhTdGF0ZXNfVFtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+dGV4dHVyZVN0YXRlW2pdW1NhdmVkVmVydGV4U3RhdGVzX1RbaV1dKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yKGogPSAwOyBqIDwgTUFYX0ZSQUdNRU5UX1NBTVBMRVJTOyBqKyspIHsKICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgTlVNX1NBVkVEVkVSVEVYU1RBVEVTX1M7IGkrKykgewogICAgICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0U2FtcGxlclN0YXRlKHBEZXZpY2UsIGosIFNhdmVkVmVydGV4U3RhdGVzX1NbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+c2FtcGxlclN0YXRlW2pdW1NhdmVkVmVydGV4U3RhdGVzX1NbaV1dKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IoaiA9IE1BWF9GUkFHTUVOVF9TQU1QTEVSUzsgaiA8IE1BWF9DT01CSU5FRF9TQU1QTEVSUzsgaisrKSB7CiAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IE5VTV9TQVZFRFZFUlRFWFNUQVRFU19TOyBpKyspIHsKICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFNhbXBsZXJTdGF0ZShwRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RWRVJURVhURVhUVVJFU0FNUExFUjAgKyBqIC0gTUFYX0ZSQUdNRU5UX1NBTVBMRVJTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVkVmVydGV4U3RhdGVzX1NbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+c2FtcGxlclN0YXRlW2pdW1NhdmVkVmVydGV4U3RhdGVzX1NbaV1dKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZihUaGlzLT5ibG9ja1R5cGUgPT0gV0lORUQzRFNCVF9QSVhFTFNUQVRFKSB7CiAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0UGl4ZWxTaGFkZXIocERldmljZSwgVGhpcy0+cGl4ZWxTaGFkZXIpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBHTF9MSU1JVFMocHNoYWRlcl9jb25zdGFudHNGKTsgaSsrKSB7CiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFBpeGVsU2hhZGVyQ29uc3RhbnRGKHBEZXZpY2UsIGksCiAgICAgICAgICAgICAgICAgICAgVGhpcy0+cGl4ZWxTaGFkZXJDb25zdGFudEYgKyBpICogNCwgMSk7CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfQ09OU1RfSTsgaSsrKSB7CiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFBpeGVsU2hhZGVyQ29uc3RhbnRJKHBEZXZpY2UsIGksCiAgICAgICAgICAgICAgICAgICAgVGhpcy0+cGl4ZWxTaGFkZXJDb25zdGFudEkgKyBpICogNCwgMSk7CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfQ09OU1RfQjsgaSsrKSB7CiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFBpeGVsU2hhZGVyQ29uc3RhbnRCKHBEZXZpY2UsIGksCiAgICAgICAgICAgICAgICAgICAgVGhpcy0+cGl4ZWxTaGFkZXJDb25zdGFudEIgKyBpLCAxKTsKICAgICAgICB9CgogICAgICAgIGZvcihpID0gMDsgaSA8IE5VTV9TQVZFRFBJWEVMU1RBVEVTX1I7IGkrKykgewogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShwRGV2aWNlLCBTYXZlZFBpeGVsU3RhdGVzX1JbaV0sIFRoaXMtPnJlbmRlclN0YXRlW1NhdmVkUGl4ZWxTdGF0ZXNfUltpXV0pOwogICAgICAgIH0KICAgICAgICBmb3IoaiA9IDA7IGogPCBNQVhfVEVYVFVSRVM7IGorKykgewogICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBOVU1fU0FWRURQSVhFTFNUQVRFU19UOyBpKyspIHsKICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFRleHR1cmVTdGFnZVN0YXRlKHBEZXZpY2UsIGosIFNhdmVkUGl4ZWxTdGF0ZXNfVFtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+dGV4dHVyZVN0YXRlW2pdW1NhdmVkUGl4ZWxTdGF0ZXNfVFtpXV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IoaiA9IDA7IGogPCBNQVhfRlJBR01FTlRfU0FNUExFUlM7IGorKykgewogICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBOVU1fU0FWRURQSVhFTFNUQVRFU19TOyBpKyspIHsKICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFNhbXBsZXJTdGF0ZShwRGV2aWNlLCBqLCBTYXZlZFBpeGVsU3RhdGVzX1NbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+c2FtcGxlclN0YXRlW2pdW1NhdmVkUGl4ZWxTdGF0ZXNfU1tpXV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvcihqID0gTUFYX0ZSQUdNRU5UX1NBTVBMRVJTOyBqIDwgTUFYX0NPTUJJTkVEX1NBTVBMRVJTOyBqKyspIHsKICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgTlVNX1NBVkVEUElYRUxTVEFURVNfUzsgaSsrKSB7CiAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRTYW1wbGVyU3RhdGUocERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVkVSVEVYVEVYVFVSRVNBTVBMRVIwICsgaiAtIE1BWF9GUkFHTUVOVF9TQU1QTEVSUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlZFBpeGVsU3RhdGVzX1NbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+c2FtcGxlclN0YXRlW2pdW1NhdmVkUGl4ZWxTdGF0ZXNfU1tpXV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmKFRoaXMtPmJsb2NrVHlwZSA9PSBXSU5FRDNEU0JUX0FMTCkgewogICAgICAgIElXaW5lRDNERGV2aWNlX1NldFZlcnRleFNoYWRlcihwRGV2aWNlLCBUaGlzLT52ZXJ0ZXhTaGFkZXIpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBHTF9MSU1JVFModnNoYWRlcl9jb25zdGFudHNGKTsgaSsrKSB7CiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFZlcnRleFNoYWRlckNvbnN0YW50RihwRGV2aWNlLCBpLAogICAgICAgICAgICAgICAgICAgIFRoaXMtPnZlcnRleFNoYWRlckNvbnN0YW50RiArIGkgKiA0LCAxKTsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9DT05TVF9JOyBpKyspIHsKICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0VmVydGV4U2hhZGVyQ29uc3RhbnRJKHBEZXZpY2UsIGksCiAgICAgICAgICAgICAgICAgICAgVGhpcy0+dmVydGV4U2hhZGVyQ29uc3RhbnRJICsgaSAqIDQsIDEpOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTlNUX0I7IGkrKykgewogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRWZXJ0ZXhTaGFkZXJDb25zdGFudEIocERldmljZSwgaSwKICAgICAgICAgICAgICAgICAgICBUaGlzLT52ZXJ0ZXhTaGFkZXJDb25zdGFudEIgKyBpLCAxKTsKICAgICAgICB9CgogICAgICAgIElXaW5lRDNERGV2aWNlX1NldFBpeGVsU2hhZGVyKHBEZXZpY2UsIFRoaXMtPnBpeGVsU2hhZGVyKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgR0xfTElNSVRTKHBzaGFkZXJfY29uc3RhbnRzRik7IGkrKykgewogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRQaXhlbFNoYWRlckNvbnN0YW50RihwRGV2aWNlLCBpLAogICAgICAgICAgICAgICAgICAgIFRoaXMtPnBpeGVsU2hhZGVyQ29uc3RhbnRGICsgaSAqIDQsIDEpOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTlNUX0k7IGkrKykgewogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRQaXhlbFNoYWRlckNvbnN0YW50SShwRGV2aWNlLCBpLAogICAgICAgICAgICAgICAgICAgIFRoaXMtPnBpeGVsU2hhZGVyQ29uc3RhbnRJICsgaSAqIDQsIDEpOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTlNUX0I7IGkrKykgewogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRQaXhlbFNoYWRlckNvbnN0YW50QihwRGV2aWNlLCBpLAogICAgICAgICAgICAgICAgICAgIFRoaXMtPnBpeGVsU2hhZGVyQ29uc3RhbnRCICsgaSwgMSk7CiAgICAgICAgfQoKICAgICAgICBhcHBseV9saWdodHMocERldmljZSwgVGhpcyk7CgogICAgICAgIGZvcihpID0gMTsgaSA8PSBXSU5FSElHSEVTVF9SRU5ERVJfU1RBVEU7IGkrKykgewogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShwRGV2aWNlLCBpLCBUaGlzLT5yZW5kZXJTdGF0ZVtpXSk7CiAgICAgICAgfQogICAgICAgIGZvcihqID0gMDsgaiA8IE1BWF9URVhUVVJFUzsgaisrKSB7CiAgICAgICAgICAgIGZvcihpID0gMTsgaSA8PSBXSU5FRDNEX0hJR0hFU1RfVEVYVFVSRV9TVEFURTsgaSsrKSB7CiAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRUZXh0dXJlU3RhZ2VTdGF0ZShwRGV2aWNlLCBqLCBpLCBUaGlzLT50ZXh0dXJlU3RhdGVbal1baV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBTa2lwIHVudXNlZCB2YWx1ZXMgYmV0d2VlbiBURVhUVVJFOCBhbmQgV09STEQwID8gKi8KICAgICAgICBmb3IoaSA9IDE7IGkgPD0gSElHSEVTVF9UUkFOU0ZPUk1TVEFURTsgaSsrKSB7CiAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFRyYW5zZm9ybShwRGV2aWNlLCBpLCAmVGhpcy0+dHJhbnNmb3Jtc1tpXSk7CiAgICAgICAgfQogICAgICAgIElXaW5lRDNERGV2aWNlX1NldEluZGljZXMocERldmljZSwgVGhpcy0+cEluZGV4RGF0YSk7CiAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0QmFzZVZlcnRleEluZGV4KHBEZXZpY2UsIFRoaXMtPmJhc2VWZXJ0ZXhJbmRleCk7CiAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0RlZGKHBEZXZpY2UsIFRoaXMtPmZ2Zik7CiAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0VmVydGV4RGVjbGFyYXRpb24ocERldmljZSwgVGhpcy0+dmVydGV4RGVjbCk7CiAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0TWF0ZXJpYWwocERldmljZSwgJlRoaXMtPm1hdGVyaWFsKTsKICAgICAgICBJV2luZUQzRERldmljZV9TZXRWaWV3cG9ydChwRGV2aWNlLCAmVGhpcy0+dmlld3BvcnQpOwogICAgICAgIElXaW5lRDNERGV2aWNlX1NldFNjaXNzb3JSZWN0KHBEZXZpY2UsICZUaGlzLT5zY2lzc29yUmVjdCk7CgogICAgICAgIC8qIFRPRE86IFByb3BlciBpbXBsZW1lbnRhdGlvbiB1c2luZyBTZXRTdHJlYW1Tb3VyY2Ugb2Zmc2V0IChzZXQgdG8gMCBmb3IgdGhlIG1vbWVudClcbiIpICovCiAgICAgICAgZm9yIChpPTA7IGk8TUFYX1NUUkVBTVM7IGkrKykgewogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRTdHJlYW1Tb3VyY2UocERldmljZSwgaSwgVGhpcy0+c3RyZWFtU291cmNlW2ldLCAwLCBUaGlzLT5zdHJlYW1TdHJpZGVbaV0pOwogICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRTdHJlYW1Tb3VyY2VGcmVxKHBEZXZpY2UsIGksIFRoaXMtPnN0cmVhbUZyZXFbaV0gfCBUaGlzLT5zdHJlYW1GbGFnc1tpXSk7CiAgICAgICAgfQogICAgICAgIGZvciAoaiA9IDAgOyBqIDwgTUFYX0NPTUJJTkVEX1NBTVBMRVJTOyBqKyspewogICAgICAgICAgICBVSU5UIHNhbXBsZXIgPSBqIDwgTUFYX0ZSQUdNRU5UX1NBTVBMRVJTID8gaiA6IFdJTkVEM0RWRVJURVhURVhUVVJFU0FNUExFUjAgKyBqIC0gTUFYX0ZSQUdNRU5UX1NBTVBMRVJTOwoKICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0VGV4dHVyZShwRGV2aWNlLCBzYW1wbGVyLCBUaGlzLT50ZXh0dXJlc1tqXSk7CiAgICAgICAgICAgIGZvcihpID0gMTsgaSA8IFdJTkVEM0RfSElHSEVTVF9TQU1QTEVSX1NUQVRFOyBpKyspIHsKICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX1NldFNhbXBsZXJTdGF0ZShwRGV2aWNlLCBzYW1wbGVyLCBpLCBUaGlzLT5zYW1wbGVyU3RhdGVbal1baV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBHTF9MSU1JVFMoY2xpcHBsYW5lcyk7IGkrKykgewogICAgICAgICAgICBmbG9hdCBjbGlwWzRdOwoKICAgICAgICAgICAgY2xpcFswXSA9IFRoaXMtPmNsaXBwbGFuZVtpXVswXTsKICAgICAgICAgICAgY2xpcFsxXSA9IFRoaXMtPmNsaXBwbGFuZVtpXVsxXTsKICAgICAgICAgICAgY2xpcFsyXSA9IFRoaXMtPmNsaXBwbGFuZVtpXVsyXTsKICAgICAgICAgICAgY2xpcFszXSA9IFRoaXMtPmNsaXBwbGFuZVtpXVszXTsKICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfU2V0Q2xpcFBsYW5lKHBEZXZpY2UsIGksIGNsaXApOwogICAgICAgIH0KICAgIH0KCiAgICAoKElXaW5lRDNERGV2aWNlSW1wbCAqKXBEZXZpY2UpLT5zdGF0ZUJsb2NrLT5sb3dlc3RfZGlzYWJsZWRfc3RhZ2UgPSBNQVhfVEVYVFVSRVMgLSAxOwogICAgZm9yKGogPSAwOyBqIDwgTUFYX1RFWFRVUkVTIC0gMTsgaisrKSB7CiAgICAgICAgaWYoKChJV2luZUQzRERldmljZUltcGwgKilwRGV2aWNlKS0+c3RhdGVCbG9jay0+dGV4dHVyZVN0YXRlW2pdW1dJTkVEM0RUU1NfQ09MT1JPUF0gPT0gV0lORUQzRFRPUF9ESVNBQkxFKSB7CiAgICAgICAgICAgICgoSVdpbmVEM0REZXZpY2VJbXBsICopcERldmljZSktPnN0YXRlQmxvY2stPmxvd2VzdF9kaXNhYmxlZF9zdGFnZSA9IGo7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIFRSQUNFKCIoJXApIDogQXBwbGllZCBzdGF0ZSBibG9jayAlcCAtLS0tLS0tLS0tLS0tLS0tLS1eXG4iLCBUaGlzLCBwRGV2aWNlKTsKCiAgICByZXR1cm4gV0lORUQzRF9PSzsKfQoKc3RhdGljIEhSRVNVTFQgIFdJTkFQSSBJV2luZUQzRFN0YXRlQmxvY2tJbXBsX0luaXRTdGFydHVwU3RhdGVCbG9jayhJV2luZUQzRFN0YXRlQmxvY2sqIGlmYWNlKSB7CiAgICBJV2luZUQzRFN0YXRlQmxvY2tJbXBsICpUaGlzID0gKElXaW5lRDNEU3RhdGVCbG9ja0ltcGwgKilpZmFjZTsKICAgIElXaW5lRDNERGV2aWNlICAgICAgICAgKmRldmljZSA9IChJV2luZUQzRERldmljZSAqKVRoaXMtPndpbmVEM0REZXZpY2U7CiAgICBJV2luZUQzRERldmljZUltcGwgICAgICpUaGlzRGV2aWNlID0gKElXaW5lRDNERGV2aWNlSW1wbCAqKWRldmljZTsKICAgIHVuaW9uIHsKICAgICAgICBXSU5FRDNETElORVBBVFRFUk4gbHA7CiAgICAgICAgRFdPUkQgZDsKICAgIH0gbHA7CiAgICB1bmlvbiB7CiAgICAgICAgZmxvYXQgZjsKICAgICAgICBEV09SRCBkOwogICAgfSB0bXBmbG9hdDsKICAgIHVuc2lnbmVkIGludCBpOwoKICAgIC8qIE5vdGUgdGhpcyBtYXkgaGF2ZSBhIGxhcmdlIG92ZXJoZWFkIGJ1dCBpdCBzaG91bGQgb25seSBiZSBleGVjdXRlZAogICAgICAgb25jZSwgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGUgY29tcGxldGUgc3RhdGUgb2YgdGhlIGRldmljZSBhbmQKICAgICAgIGFsbCBvcGVuZ2wgZXF1aXZhbGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBUUkFDRSgiKCVwKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gU2V0dGluZyB1cCBkZXZpY2UgZGVmYXVsdHMuLi4gJXBcbiIsIFRoaXMsIFRoaXMtPndpbmVEM0REZXZpY2UpOwogICAgLyogVE9ETzogbWFrZSBhIHNwZWNpYWwgc3RhdGVibG9jayB0eXBlIGZvciB0aGUgcHJpbWFyeSBzdGF0ZWJsb2NrIChpdCBuZXZlciBnZXRzIGFwcGxpZWQgc28gaXQgZG9lc24ndCBuZWVkIGEgcmVhbCB0eXBlKSAqLwogICAgVGhpcy0+YmxvY2tUeXBlID0gV0lORUQzRFNCVF9JTklUOwoKICAgIC8qIFNldCBzb21lIG9mIHRoZSBkZWZhdWx0cyBmb3IgbGlnaHRzLCB0cmFuc2Zvcm1zIGV0YyAqLwogICAgbWVtY3B5KCZUaGlzLT50cmFuc2Zvcm1zW1dJTkVEM0RUU19QUk9KRUNUSU9OXSwgJmlkZW50aXR5LCBzaXplb2YoaWRlbnRpdHkpKTsKICAgIG1lbWNweSgmVGhpcy0+dHJhbnNmb3Jtc1tXSU5FRDNEVFNfVklFV10sICZpZGVudGl0eSwgc2l6ZW9mKGlkZW50aXR5KSk7CiAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKICAgICAgbWVtY3B5KCZUaGlzLT50cmFuc2Zvcm1zW1dJTkVEM0RUU19XT1JMRE1BVFJJWChpKV0sICZpZGVudGl0eSwgc2l6ZW9mKGlkZW50aXR5KSk7CiAgICB9CgogICAgVFJBQ0UoIlJlbmRlciBzdGF0ZXNcbiIpOwogICAgLyogUmVuZGVyIHN0YXRlczogKi8KICAgIGlmIChUaGlzRGV2aWNlLT5hdXRvX2RlcHRoX3N0ZW5jaWxfYnVmZmVyICE9IE5VTEwpIHsKICAgICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1pFTkFCTEUsICAgICAgIFdJTkVEM0RaQl9UUlVFKTsKICAgIH0gZWxzZSB7CiAgICAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19aRU5BQkxFLCAgICAgICBXSU5FRDNEWkJfRkFMU0UpOwogICAgfQogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfRklMTE1PREUsICAgICAgICAgV0lORUQzREZJTExfU09MSUQpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfU0hBREVNT0RFLCAgICAgICAgV0lORUQzRFNIQURFX0dPVVJBVUQpOwogICAgbHAubHAud1JlcGVhdEZhY3RvciA9IDA7CiAgICBscC5scC53TGluZVBhdHRlcm4gID0gMDsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0xJTkVQQVRURVJOLCAgICAgIGxwLmQpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfWldSSVRFRU5BQkxFLCAgICAgVFJVRSk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19BTFBIQVRFU1RFTkFCTEUsICBGQUxTRSk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19MQVNUUElYRUwsICAgICAgICBUUlVFKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1NSQ0JMRU5ELCAgICAgICAgIFdJTkVEM0RCTEVORF9PTkUpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfREVTVEJMRU5ELCAgICAgICAgV0lORUQzREJMRU5EX1pFUk8pOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfQ1VMTE1PREUsICAgICAgICAgV0lORUQzRENVTExfQ0NXKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1pGVU5DLCAgICAgICAgICAgIFdJTkVEM0RDTVBfTEVTU0VRVUFMKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0FMUEhBRlVOQywgICAgICAgIFdJTkVEM0RDTVBfQUxXQVlTKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0FMUEhBUkVGLCAgICAgICAgIDApOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfRElUSEVSRU5BQkxFLCAgICAgRkFMU0UpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfQUxQSEFCTEVOREVOQUJMRSwgRkFMU0UpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfRk9HRU5BQkxFLCAgICAgICAgRkFMU0UpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfU1BFQ1VMQVJFTkFCTEUsICAgRkFMU0UpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfWlZJU0lCTEUsICAgICAgICAgMCk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19GT0dDT0xPUiwgICAgICAgICAwKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0ZPR1RBQkxFTU9ERSwgICAgIFdJTkVEM0RGT0dfTk9ORSk7CiAgICB0bXBmbG9hdC5mID0gMC4wZjsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0ZPR1NUQVJULCAgICAgICAgIHRtcGZsb2F0LmQpOwogICAgdG1wZmxvYXQuZiA9IDEuMGY7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19GT0dFTkQsICAgICAgICAgICB0bXBmbG9hdC5kKTsKICAgIHRtcGZsb2F0LmYgPSAxLjBmOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfRk9HREVOU0lUWSwgICAgICAgdG1wZmxvYXQuZCk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19FREdFQU5USUFMSUFTLCAgICBGQUxTRSk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19aQklBUywgICAgICAgICAgICAwKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1JBTkdFRk9HRU5BQkxFLCAgIEZBTFNFKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1NURU5DSUxFTkFCTEUsICAgIEZBTFNFKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1NURU5DSUxGQUlMLCAgICAgIFdJTkVEM0RTVEVOQ0lMT1BfS0VFUCk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19TVEVOQ0lMWkZBSUwsICAgICBXSU5FRDNEU1RFTkNJTE9QX0tFRVApOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfU1RFTkNJTFBBU1MsICAgICAgV0lORUQzRFNURU5DSUxPUF9LRUVQKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1NURU5DSUxSRUYsICAgICAgIDApOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfU1RFTkNJTE1BU0ssICAgICAgMHhGRkZGRkZGRik7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19TVEVOQ0lMRlVOQywgICAgICBXSU5FRDNEQ01QX0FMV0FZUyk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19TVEVOQ0lMV1JJVEVNQVNLLCAweEZGRkZGRkZGKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1RFWFRVUkVGQUNUT1IsICAgIDB4RkZGRkZGRkYpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfV1JBUDAsIDApOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfV1JBUDEsIDApOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfV1JBUDIsIDApOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfV1JBUDMsIDApOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfV1JBUDQsIDApOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfV1JBUDUsIDApOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfV1JBUDYsIDApOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfV1JBUDcsIDApOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfQ0xJUFBJTkcsICAgICAgICAgICAgICAgICBUUlVFKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0xJR0hUSU5HLCAgICAgICAgICAgICAgICAgVFJVRSk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19BTUJJRU5ULCAgICAgICAgICAgICAgICAgIDApOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfRk9HVkVSVEVYTU9ERSwgICAgICAgICAgICBXSU5FRDNERk9HX05PTkUpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfQ09MT1JWRVJURVgsICAgICAgICAgICAgICBUUlVFKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0xPQ0FMVklFV0VSLCAgICAgICAgICAgICAgVFJVRSk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19OT1JNQUxJWkVOT1JNQUxTLCAgICAgICAgIEZBTFNFKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0RJRkZVU0VNQVRFUklBTFNPVVJDRSwgICAgV0lORUQzRE1DU19DT0xPUjEpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfU1BFQ1VMQVJNQVRFUklBTFNPVVJDRSwgICBXSU5FRDNETUNTX0NPTE9SMik7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19BTUJJRU5UTUFURVJJQUxTT1VSQ0UsICAgIFdJTkVEM0RNQ1NfTUFURVJJQUwpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfRU1JU1NJVkVNQVRFUklBTFNPVVJDRSwgICBXSU5FRDNETUNTX01BVEVSSUFMKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1ZFUlRFWEJMRU5ELCAgICAgICAgICAgICAgV0lORUQzRFZCRl9ESVNBQkxFKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0NMSVBQTEFORUVOQUJMRSwgICAgICAgICAgMCk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19TT0ZUV0FSRVZFUlRFWFBST0NFU1NJTkcsIEZBTFNFKTsKICAgIHRtcGZsb2F0LmYgPSAxLjBmOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfUE9JTlRTSVpFLCAgICAgICAgICAgICAgICB0bXBmbG9hdC5kKTsKICAgIHRtcGZsb2F0LmYgPSAxLjBmOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfUE9JTlRTSVpFX01JTiwgICAgICAgICAgICB0bXBmbG9hdC5kKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1BPSU5UU1BSSVRFRU5BQkxFLCAgICAgICAgRkFMU0UpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfUE9JTlRTQ0FMRUVOQUJMRSwgICAgICAgICBGQUxTRSk7CiAgICB0bXBmbG9hdC5mID0gMS4wZjsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1BPSU5UU0NBTEVfQSwgICAgICAgICAgICAgdG1wZmxvYXQuZCk7CiAgICB0bXBmbG9hdC5mID0gMC4wZjsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1BPSU5UU0NBTEVfQiwgICAgICAgICAgICAgdG1wZmxvYXQuZCk7CiAgICB0bXBmbG9hdC5mID0gMC4wZjsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1BPSU5UU0NBTEVfQywgICAgICAgICAgICAgdG1wZmxvYXQuZCk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19NVUxUSVNBTVBMRUFOVElBTElBUywgICAgIFRSVUUpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfTVVMVElTQU1QTEVNQVNLLCAgICAgICAgICAweEZGRkZGRkZGKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1BBVENIRURHRVNUWUxFLCAgICAgICAgICAgV0lORUQzRFBBVENIRURHRV9ESVNDUkVURSk7CiAgICB0bXBmbG9hdC5mID0gMS4wZjsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1BBVENIU0VHTUVOVFMsICAgICAgICAgICAgdG1wZmxvYXQuZCk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19ERUJVR01PTklUT1JUT0tFTiwgICAgICAgIDB4YmFhZGNhZmUpOwogICAgdG1wZmxvYXQuZiA9IDY0LjBmOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfUE9JTlRTSVpFX01BWCwgICAgICAgICAgICB0bXBmbG9hdC5kKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0lOREVYRURWRVJURVhCTEVOREVOQUJMRSwgRkFMU0UpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfQ09MT1JXUklURUVOQUJMRSwgICAgICAgICAweDAwMDAwMDBGKTsKICAgIHRtcGZsb2F0LmYgPSAwLjBmOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfVFdFRU5GQUNUT1IsICAgICAgICAgICAgICB0bXBmbG9hdC5kKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0JMRU5ET1AsICAgICAgICAgICAgICAgICAgV0lORUQzREJMRU5ET1BfQUREKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1BPU0lUSU9OREVHUkVFLCAgICAgICAgICAgV0lORUQzRERFR1JFRV9DVUJJQyk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19OT1JNQUxERUdSRUUsICAgICAgICAgICAgIFdJTkVEM0RERUdSRUVfTElORUFSKTsKICAgIC8qIHN0YXRlcyBuZXcgaW4gZDNkOSAqLwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfU0NJU1NPUlRFU1RFTkFCTEUsICAgICAgICBGQUxTRSk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19TTE9QRVNDQUxFREVQVEhCSUFTLCAgICAgIDApOwogICAgdG1wZmxvYXQuZiA9IDEuMGY7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19NSU5URVNTRUxMQVRJT05MRVZFTCwgICAgIHRtcGZsb2F0LmQpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfTUFYVEVTU0VMTEFUSU9OTEVWRUwsICAgICB0bXBmbG9hdC5kKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0FOVElBTElBU0VETElORUVOQUJMRSwgICAgRkFMU0UpOwogICAgdG1wZmxvYXQuZiA9IDAuMGY7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19BREFQVElWRVRFU1NfWCwgICAgICAgICAgIHRtcGZsb2F0LmQpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfQURBUFRJVkVURVNTX1ksICAgICAgICAgICB0bXBmbG9hdC5kKTsKICAgIHRtcGZsb2F0LmYgPSAxLjBmOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfQURBUFRJVkVURVNTX1osICAgICAgICAgICB0bXBmbG9hdC5kKTsKICAgIHRtcGZsb2F0LmYgPSAwLjBmOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfQURBUFRJVkVURVNTX1csICAgICAgICAgICB0bXBmbG9hdC5kKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0VOQUJMRUFEQVBUSVZFVEVTU0VMTEFUSU9OLCBGQUxTRSk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19UV09TSURFRFNURU5DSUxNT0RFLCAgICAgIEZBTFNFKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0NDV19TVEVOQ0lMRkFJTCwgICAgICAgICAgV0lORUQzRFNURU5DSUxPUF9LRUVQKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0NDV19TVEVOQ0lMWkZBSUwsICAgICAgICAgV0lORUQzRFNURU5DSUxPUF9LRUVQKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0NDV19TVEVOQ0lMUEFTUywgICAgICAgICAgV0lORUQzRFNURU5DSUxPUF9LRUVQKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0NDV19TVEVOQ0lMRlVOQywgICAgICAgICAgV0lORUQzRENNUF9BTFdBWVMpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfQ09MT1JXUklURUVOQUJMRTEsICAgICAgICAweDAwMDAwMDBGKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0NPTE9SV1JJVEVFTkFCTEUyLCAgICAgICAgMHgwMDAwMDAwRik7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19DT0xPUldSSVRFRU5BQkxFMywgICAgICAgIDB4MDAwMDAwMEYpOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfQkxFTkRGQUNUT1IsICAgICAgICAgICAgICAweEZGRkZGRkZGKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1NSR0JXUklURUVOQUJMRSwgICAgICAgICAgMCk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19ERVBUSEJJQVMsICAgICAgICAgICAgICAgIDApOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfV1JBUDgsICAwKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1dSQVA5LCAgMCk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19XUkFQMTAsIDApOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfV1JBUDExLCAwKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1dSQVAxMiwgMCk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19XUkFQMTMsIDApOwogICAgSVdpbmVEM0REZXZpY2VfU2V0UmVuZGVyU3RhdGUoZGV2aWNlLCBXSU5FRDNEUlNfV1JBUDE0LCAwKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1dSQVAxNSwgMCk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19TRVBBUkFURUFMUEhBQkxFTkRFTkFCTEUsIEZBTFNFKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX1NSQ0JMRU5EQUxQSEEsICAgICAgICAgICAgV0lORUQzREJMRU5EX09ORSk7CiAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShkZXZpY2UsIFdJTkVEM0RSU19ERVNUQkxFTkRBTFBIQSwgICAgICAgICAgIFdJTkVEM0RCTEVORF9aRVJPKTsKICAgIElXaW5lRDNERGV2aWNlX1NldFJlbmRlclN0YXRlKGRldmljZSwgV0lORUQzRFJTX0JMRU5ET1BBTFBIQSwgICAgICAgICAgICAgV0lORUQzREJMRU5ET1BfQUREKTsKCiAgICAvKiBjbGlwcGluZyBzdGF0dXMgKi8KICAgIFRoaXMtPmNsaXBfc3RhdHVzLkNsaXBVbmlvbiA9IDA7CiAgICBUaGlzLT5jbGlwX3N0YXR1cy5DbGlwSW50ZXJzZWN0aW9uID0gMHhGRkZGRkZGRjsKCiAgICAvKiBUZXh0dXJlIFN0YWdlIFN0YXRlcyAtIFB1dCBkaXJlY3RseSBpbnRvIHN0YXRlIGJsb2NrLCB3ZSB3aWxsIGNhbGwgZnVuY3Rpb24gYmVsb3cgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfVEVYVFVSRVM7IGkrKykgewogICAgICAgIFRSQUNFKCJTZXR0aW5nIHVwIGRlZmF1bHQgdGV4dHVyZSBzdGF0ZXMgZm9yIHRleHR1cmUgU3RhZ2UgJWRcbiIsIGkpOwogICAgICAgIG1lbWNweSgmVGhpcy0+dHJhbnNmb3Jtc1tXSU5FRDNEVFNfVEVYVFVSRTAgKyBpXSwgJmlkZW50aXR5LCBzaXplb2YoaWRlbnRpdHkpKTsKICAgICAgICBUaGlzLT50ZXh0dXJlU3RhdGVbaV1bV0lORUQzRFRTU19DT0xPUk9QICAgICAgICAgICAgICAgXSA9IChpPT0wKT8gV0lORUQzRFRPUF9NT0RVTEFURSA6ICBXSU5FRDNEVE9QX0RJU0FCTEU7CiAgICAgICAgVGhpcy0+dGV4dHVyZVN0YXRlW2ldW1dJTkVEM0RUU1NfQ09MT1JBUkcxICAgICAgICAgICAgIF0gPSBXSU5FRDNEVEFfVEVYVFVSRTsKICAgICAgICBUaGlzLT50ZXh0dXJlU3RhdGVbaV1bV0lORUQzRFRTU19DT0xPUkFSRzIgICAgICAgICAgICAgXSA9IFdJTkVEM0RUQV9DVVJSRU5UOwogICAgICAgIFRoaXMtPnRleHR1cmVTdGF0ZVtpXVtXSU5FRDNEVFNTX0FMUEhBT1AgICAgICAgICAgICAgICBdID0gKGk9PTApPyBXSU5FRDNEVE9QX1NFTEVDVEFSRzEgOiAgV0lORUQzRFRPUF9ESVNBQkxFOwogICAgICAgIFRoaXMtPnRleHR1cmVTdGF0ZVtpXVtXSU5FRDNEVFNTX0FMUEhBQVJHMSAgICAgICAgICAgICBdID0gV0lORUQzRFRBX1RFWFRVUkU7CiAgICAgICAgVGhpcy0+dGV4dHVyZVN0YXRlW2ldW1dJTkVEM0RUU1NfQUxQSEFBUkcyICAgICAgICAgICAgIF0gPSBXSU5FRDNEVEFfQ1VSUkVOVDsKICAgICAgICBUaGlzLT50ZXh0dXJlU3RhdGVbaV1bV0lORUQzRFRTU19CVU1QRU5WTUFUMDAgICAgICAgICAgXSA9IChEV09SRCkgMC4wOwogICAgICAgIFRoaXMtPnRleHR1cmVTdGF0ZVtpXVtXSU5FRDNEVFNTX0JVTVBFTlZNQVQwMSAgICAgICAgICBdID0gKERXT1JEKSAwLjA7CiAgICAgICAgVGhpcy0+dGV4dHVyZVN0YXRlW2ldW1dJTkVEM0RUU1NfQlVNUEVOVk1BVDEwICAgICAgICAgIF0gPSAoRFdPUkQpIDAuMDsKICAgICAgICBUaGlzLT50ZXh0dXJlU3RhdGVbaV1bV0lORUQzRFRTU19CVU1QRU5WTUFUMTEgICAgICAgICAgXSA9IChEV09SRCkgMC4wOwogICAgICAgIFRoaXMtPnRleHR1cmVTdGF0ZVtpXVtXSU5FRDNEVFNTX1RFWENPT1JESU5ERVggICAgICAgICBdID0gaTsKICAgICAgICBUaGlzLT50ZXh0dXJlU3RhdGVbaV1bV0lORUQzRFRTU19CVU1QRU5WTFNDQUxFICAgICAgICAgXSA9IChEV09SRCkgMC4wOwogICAgICAgIFRoaXMtPnRleHR1cmVTdGF0ZVtpXVtXSU5FRDNEVFNTX0JVTVBFTlZMT0ZGU0VUICAgICAgICBdID0gKERXT1JEKSAwLjA7CiAgICAgICAgVGhpcy0+dGV4dHVyZVN0YXRlW2ldW1dJTkVEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTIF0gPSBXSU5FRDNEVFRGRl9ESVNBQkxFOwogICAgICAgIFRoaXMtPnRleHR1cmVTdGF0ZVtpXVtXSU5FRDNEVFNTX0FERFJFU1NXICAgICAgICAgICAgICBdID0gV0lORUQzRFRBRERSRVNTX1dSQVA7CiAgICAgICAgVGhpcy0+dGV4dHVyZVN0YXRlW2ldW1dJTkVEM0RUU1NfQ09MT1JBUkcwICAgICAgICAgICAgIF0gPSBXSU5FRDNEVEFfQ1VSUkVOVDsKICAgICAgICBUaGlzLT50ZXh0dXJlU3RhdGVbaV1bV0lORUQzRFRTU19BTFBIQUFSRzAgICAgICAgICAgICAgXSA9IFdJTkVEM0RUQV9DVVJSRU5UOwogICAgICAgIFRoaXMtPnRleHR1cmVTdGF0ZVtpXVtXSU5FRDNEVFNTX1JFU1VMVEFSRyAgICAgICAgICAgICBdID0gV0lORUQzRFRBX0NVUlJFTlQ7CiAgICB9CiAgICBUaGlzLT5sb3dlc3RfZGlzYWJsZWRfc3RhZ2UgPSAxOwoKICAgICAgICAvKiBTYW1wbGVyIHN0YXRlcyovCiAgICBmb3IgKGkgPSAwIDsgaSA8ICBNQVhfQ09NQklORURfU0FNUExFUlM7IGkrKykgewogICAgICAgIFRSQUNFKCJTZXR0aW5nIHVwIGRlZmF1bHQgc2FtcGxlcnMgc3RhdGVzIGZvciBzYW1wbGVyICVkXG4iLCBpKTsKICAgICAgICBUaGlzLT5zYW1wbGVyU3RhdGVbaV1bV0lORUQzRFNBTVBfQUREUkVTU1UgICAgICAgICBdID0gV0lORUQzRFRBRERSRVNTX1dSQVA7CiAgICAgICAgVGhpcy0+c2FtcGxlclN0YXRlW2ldW1dJTkVEM0RTQU1QX0FERFJFU1NWICAgICAgICAgXSA9IFdJTkVEM0RUQUREUkVTU19XUkFQOwogICAgICAgIFRoaXMtPnNhbXBsZXJTdGF0ZVtpXVtXSU5FRDNEU0FNUF9BRERSRVNTVyAgICAgICAgIF0gPSBXSU5FRDNEVEFERFJFU1NfV1JBUDsKICAgICAgICBUaGlzLT5zYW1wbGVyU3RhdGVbaV1bV0lORUQzRFNBTVBfQk9SREVSQ09MT1IgICAgICBdID0gMHgwMDsKICAgICAgICBUaGlzLT5zYW1wbGVyU3RhdGVbaV1bV0lORUQzRFNBTVBfTUFHRklMVEVSICAgICAgICBdID0gV0lORUQzRFRFWEZfUE9JTlQ7CiAgICAgICAgVGhpcy0+c2FtcGxlclN0YXRlW2ldW1dJTkVEM0RTQU1QX01JTkZJTFRFUiAgICAgICAgXSA9IFdJTkVEM0RURVhGX1BPSU5UOwogICAgICAgIFRoaXMtPnNhbXBsZXJTdGF0ZVtpXVtXSU5FRDNEU0FNUF9NSVBGSUxURVIgICAgICAgIF0gPSBXSU5FRDNEVEVYRl9OT05FOwogICAgICAgIFRoaXMtPnNhbXBsZXJTdGF0ZVtpXVtXSU5FRDNEU0FNUF9NSVBNQVBMT0RCSUFTICAgIF0gPSAwOwogICAgICAgIFRoaXMtPnNhbXBsZXJTdGF0ZVtpXVtXSU5FRDNEU0FNUF9NQVhNSVBMRVZFTCAgICAgIF0gPSAwOwogICAgICAgIFRoaXMtPnNhbXBsZXJTdGF0ZVtpXVtXSU5FRDNEU0FNUF9NQVhBTklTT1RST1BZICAgIF0gPSAxOwogICAgICAgIFRoaXMtPnNhbXBsZXJTdGF0ZVtpXVtXSU5FRDNEU0FNUF9TUkdCVEVYVFVSRSAgICAgIF0gPSAwOwogICAgICAgIFRoaXMtPnNhbXBsZXJTdGF0ZVtpXVtXSU5FRDNEU0FNUF9FTEVNRU5USU5ERVggICAgIF0gPSAwOyAvKiBUT0RPOiBJbmRpY2F0ZXMgd2hpY2ggZWxlbWVudCBvZiBhICBtdWx0aWVsZW1lbnQgdGV4dHVyZSB0byB1c2UgKi8KICAgICAgICBUaGlzLT5zYW1wbGVyU3RhdGVbaV1bV0lORUQzRFNBTVBfRE1BUE9GRlNFVCAgICAgICBdID0gMDsgLyogVE9ETzogVmVydGV4IG9mZnNldCBpbiB0aGUgcHJlc2FtcGxlZCBkaXNwbGFjZW1lbnQgbWFwICovCiAgICB9CgogICAgZm9yKGkgPSAwOyBpIDwgR0xfTElNSVRTKHRleHR1cmVzKTsgaSsrKSB7CiAgICAgICAgLyogTm90ZTogVGhpcyBhdm9pZHMgY2FsbGluZyBTZXRUZXh0dXJlLCBzbyBwcmV0ZW5kIGl0IGhhcyBiZWVuIGNhbGxlZCAqLwogICAgICAgIFRoaXMtPmNoYW5nZWQudGV4dHVyZXNbaV0gPSBUUlVFOwogICAgICAgIFRoaXMtPnRleHR1cmVzW2ldICAgICAgICAgPSBOVUxMOwogICAgfQoKICAgIC8qIFNldCBkZWZhdWx0IEdMU0wgcHJvZ3JhbSB0byBOVUxMLiAgV2Ugd29uJ3QgYWN0dWFsbHkgY3JlYXRlIG9uZQogICAgICogdW50aWwgdGhlIGFwcCBzZXRzIGEgdmVydGV4IG9yIHBpeGVsIHNoYWRlciAqLwogICAgVGhpcy0+Z2xzbF9wcm9ncmFtID0gTlVMTDsKCiAgICBUUkFDRSgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IERldmljZSBkZWZhdWx0cyBub3cgc2V0IHVwLi4uXG4iKTsKICAgIHJldHVybiBXSU5FRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJV2luZUQzRFN0YXRlQmxvY2sgVlRibCBmb2xsb3dzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKY29uc3QgSVdpbmVEM0RTdGF0ZUJsb2NrVnRibCBJV2luZUQzRFN0YXRlQmxvY2tfVnRibCA9CnsKICAgIC8qIElVbmtub3duICovCiAgICBJV2luZUQzRFN0YXRlQmxvY2tJbXBsX1F1ZXJ5SW50ZXJmYWNlLAogICAgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbF9BZGRSZWYsCiAgICBJV2luZUQzRFN0YXRlQmxvY2tJbXBsX1JlbGVhc2UsCiAgICAvKiBJV2luZUQzRFN0YXRlQmxvY2sgKi8KICAgIElXaW5lRDNEU3RhdGVCbG9ja0ltcGxfR2V0UGFyZW50LAogICAgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbF9HZXREZXZpY2UsCiAgICBJV2luZUQzRFN0YXRlQmxvY2tJbXBsX0NhcHR1cmUsCiAgICBJV2luZUQzRFN0YXRlQmxvY2tJbXBsX0FwcGx5LAogICAgSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbF9Jbml0U3RhcnR1cFN0YXRlQmxvY2sKfTsK