ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCA5MzU5YzUwLi5jNzAyODVkIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMDItMDktMTcgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KKworICAgICAgICAqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCwgaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgsCisgICAgICAgIGluY2x1ZGUvZnJlZXR5cGUvZnRzdHJva2VyLmgsIGluY2x1ZGUvZnJlZXR5cGUvZnRzeXNpby5oLAorICAgICAgICBpbmNsdWRlL2ZyZWV0eXBlL2Z0c3lzbWVtLmgsIGluY2x1ZGUvZnJlZXR5cGUvdHRuYW1laWQuaDoKKyAgICAgICAgdXBkYXRpbmcgdGhlIGluLXNvdXJjZSBkb2N1bWVudGF0aW9uCisKKyAgICAgICAgKiBzcmMvdG9vbHMvZG9jbWFrZXIvdG9odG1sLnB5OiB1cGRhdGluZyB0aGUgSFRNTCBmb3JtYXR0ZXIgaW4gdGhlCisgICAgICAgIERvY01ha2VyIHRvb2wKKworICAgICAgICAqIHNyYy90b29scy9kb2NtYWtlci5weTogcmVtb3Zpbmcgb2Jzb2xldGUgZmlsZQorCiAyMDAyLTA5LTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKIAlNb3JlIDE2Yml0IGZpeGVzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIGIvaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oCmluZGV4IDA1MGI2OWQuLjE1NTRkZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmgKQEAgLTYzOSw4ICs2MzksNiBAQAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIEZyZWVUeXBlIGJhc2UgZmFjZSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgRlRfRmFjZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTE3Nyw4ICsxMTc1LDYgQEAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBGcmVlVHlwZSBiYXNlIHNpemUgY2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgIEZUX1NpemVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEyMzYsOCArMTIzMiw2IEBACiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEZyZWVUeXBlIEdseXBoIFNsb3QgYmFzZSBjbGFzcyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICBGVF9HbHlwaFNsb3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMDY5LDcgKzIwNjMsNyBAQAogICogICAgIHRoaXMgZG9lcyBub3QgcHJldmVudCB5b3UgZnJvbSByZW5kZXJpbmcgb3V0bGluZXMgdG8gYml0bWFwcwogICogICAgIHdpdGggQEZUX0xPQURfUkVOREVSIGhvd2V2ZXIuCiAgKgotICogICBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVDoKKyAqICAgRlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgOjoKICAqICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgZ2x5cGggaW1hZ2Ugc2hvdWxkIGJlIHByZXBhcmVkIGZvciB2ZXJ0aWNhbAogICogICAgIHRleHQgbGF5b3V0LiBUaGlzIGJhc2ljYWxseSBtZWFucyB0aGF0ICdmYWNlLmdseXBoLmFkdmFuY2UnIHdpbGwKICAqICAgICBjb3JyZXNwb25kIHRvIHRoZSB2ZXJ0aWNhbCBhZHZhbmNlIGhlaWdodCAoaW5zdGVhZCBvZiB0aGUgZGVmYXVsdApAQCAtMjE0Niw1OSArMjE0MCwyNCBAQAogI2RlZmluZSBGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCAgMHgyMDAKICNkZWZpbmUgRlRfTE9BRF9OT19SRUNVUlNFICAgICAgICAgICAgICAgICAgIDB4NDAwCiAjZGVmaW5lIEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STSAgICAgICAgICAgICAweDgwMAotI2RlZmluZSBGVF9MT0FEX01PTk9DSFJPTUUgIDB4MTAwMAotI2RlZmluZSBGVF9MT0FEX0xJTkVBUl9ERVNJR04gIDB4MjAwMAorI2RlZmluZSBGVF9MT0FEX01PTk9DSFJPTUUgICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEZUX0xPQURfTElORUFSX0RFU0lHTiAgICAgICAgICAgICAgICAweDIwMDAKIAogICAvKiB0ZW1wb3JhcnkgaGFjayEgKi8KLSNkZWZpbmUgRlRfTE9BRF9TQklUU19PTkxZICAweDQwMDAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPENvbnN0YW50PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfTk9fQVVUT0hJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgYml0IGZpZWxkIGNvbnN0YW50LCB1c2VkIHdpdGggQEZUX0xvYWRfR2x5cGggdG8gaW5kaWNhdGUgdGhhdCAgICAqLwotICAvKiAgICB0aGUgYXV0by1oaW50ZXIgc2hvdWxkIG5ldmVyIGJlIHJ1bi4gIFRoaXMgY2FuIGJlIGltcG9ydGFudCBmb3IgICAgKi8KLSAgLyogICAgY2VydGFpbiBmb250cyB3aGVyZSB1bi1oaW50ZWQgb3V0cHV0IGlzIGJldHRlciB0aGFuIGF1dG8taGludGVkICAgICovCi0gIC8qICAgIG9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHRoaXMgd2lsbCBfbm90XyBwcmV2ZW50IGEgbmF0aXZlIGhpbnRlciB0byBiZSBydW4gICAgICAgICovCi0gIC8qICAgIHdoZW4gYXZhaWxhYmxlIChpLmUuIGZvciBQb3N0c2NyaXB0IGZvbnRzLCBvciBmb3IgVHJ1ZVR5cGUgb25lcyAgICAqLwotICAvKiAgICB3aGVuIHRoZSBieXRlY29kZSBpbnRlcnByZXRlciB3YXMgY29tcGlsZWQgaW4pLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHlvdSB3YW50IHRvIGNvbXBsZXRlbHkgZGlzYWJsZSBoaW50aW5nLCB1c2UgQEZUX0xPQURfTk9fSElOVElORyAqLwotICAvKiAgICBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBARlRfTE9BRF9GT1JDRV9BVVRPSElOVCBmbGFnIHdpbGwgbm90IHdvcmsgaWYgdGhpcyBmbGFnIGlzICAgICAqLwotICAvKiAgICBzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0xPQURfTk9fQVVUT0hJTlQgIDB4ODAwMFUKKyNkZWZpbmUgRlRfTE9BRF9TQklUU19PTkxZICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBGVF9MT0FEX05PX0FVVE9ISU5UICAgICAgICAgICAgICAgICAgMHg4MDAwVQogCiAgIC8qICovCiAKICNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfKCB4ICkgICAgICAoIChGVF9JbnQzMikoICh4KSAmIDcgKSA8PCAxNiApCiAjZGVmaW5lIEZUX0xPQURfVEFSR0VUX01PREUoIHggKSAgKCAoRlRfUmVuZGVyX01vZGUpKCAoICh4KSA+PiAxNiApICYgNyApICkKIAotI2RlZmluZSBGVF9MT0FEX1RBUkdFVF9OT1JNQUwgIEZUX0xPQURfVEFSR0VUXyggRlRfUkVOREVSX01PREVfTk9STUFMICkKLSNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfTU9OTyAgICBGVF9MT0FEX1RBUkdFVF8oIEZUX1JFTkRFUl9NT0RFX01PTk8gICApCi0jZGVmaW5lIEZUX0xPQURfVEFSR0VUX0xDRCAgICAgRlRfTE9BRF9UQVJHRVRfKCBGVF9SRU5ERVJfTU9ERV9MQ0QgICAgKQotI2RlZmluZSBGVF9MT0FEX1RBUkdFVF9MQ0RfViAgIEZUX0xPQURfVEFSR0VUXyggRlRfUkVOREVSX01PREVfTENEX1YgICkKKyNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfTk9STUFMICAgICBGVF9MT0FEX1RBUkdFVF8oIEZUX1JFTkRFUl9NT0RFX05PUk1BTCApCisjZGVmaW5lIEZUX0xPQURfVEFSR0VUX01PTk8gICAgICAgRlRfTE9BRF9UQVJHRVRfKCBGVF9SRU5ERVJfTU9ERV9NT05PICAgKQorI2RlZmluZSBGVF9MT0FEX1RBUkdFVF9MQ0QgICAgICAgIEZUX0xPQURfVEFSR0VUXyggRlRfUkVOREVSX01PREVfTENEICAgICkKKyNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfTENEX1YgICAgICBGVF9MT0FEX1RBUkdFVF8oIEZUX1JFTkRFUl9NT0RFX0xDRF9WICApCiAKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxDb25zdGFudD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX0RFRkFVTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGJpdC1maWVsZCBjb25zdGFudCwgdXNlZCB3aXRoIEBGVF9Mb2FkX0dseXBoIHRvIGluZGljYXRlIHRoYXQgICAgKi8KLSAgLyogICAgdGhlIGZ1bmN0aW9uIHNob3VsZCB0cnkgdG8gbG9hZCB0aGUgZ2x5cGggbm9ybWFsbHksIGkuZS4sICAgICAgICAgICovCi0gIC8qICAgIGVtYmVkZGVkIGJpdG1hcHMgYXJlIGZhdm9yZWQgb3ZlciBvdXRsaW5lcywgdmVjdG9ycyBhcmUgYWx3YXlzICAgICAqLwotICAvKiAgICBzY2FsZWQgYW5kIGdyaWQtZml0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0xPQURfREVGQVVMVCAgMHgwCisjZGVmaW5lIEZUX0xPQURfREVGQVVMVCAgICAgICAgICAgMHgwCiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIyNDMsNyArMjIwMiw3IEBACiAgIC8qICAgIGNvbnZlcnNpb24gcGVyZm9ybWVkIG9uIHRoZSBvdXRsaW5lLCBhcyB3ZWxsIGFzIHNwZWNpZmljICAgICAgICAgICAqLwogICAvKiAgICBoaW50aW5nIG9wdGltaXphdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgRlRfUkVOREVSX01PREVfTk9STUFMIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgVGhpcyBpcyB0aGUgZGVmYXVsdCByZW5kZXIgbW9kZTsgaXQgY29ycmVzcG9uZHMgdG8gOC1iaXQgICAgICAgICAqLwogICAvKiAgICAgIGFudGktYWxpYXNlZCBiaXRtYXBzLCB1c2luZyAyNTYgbGV2ZWxzIG9mIG9wYWNpdHkuICAgICAgICAgICAgICAgKi8KQEAgLTIzMzMsNyArMjI5Miw3IEBACiAgIC8qICAgIEFuIGVudW1lcmF0aW9uIHVzZWQgdG8gc3BlY2lmeSB3aGljaCBrZXJuaW5nIHZhbHVlcyB0byByZXR1cm4gaW4gICAqLwogICAvKiAgICBARlRfR2V0X0tlcm5pbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgRlRfS0VSTklOR19ERUZBVUxUICA6OiBSZXR1cm4gc2NhbGVkIGFuZCBncmlkLWZpdHRlZCBrZXJuaW5nICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2VzICh2YWx1ZSBpcyAwKS4gICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTI4ODIsNjcgKzI4NDEsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXgqICBtYXRyaXggKTsKIAogCi0gIC8qQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9IaW50X0ZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBzZXQgYSBudW1iZXIgb2YgZmxhZ3MgdGhhdCBhcmUgdXNlZCB0byBjb250cm9sICAqLwotICAvKiAgICB0aGUgaGludGluZyBwcm9jZXNzIHdoZW4gZ2x5cGhzIGFyZSBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmbGFncyAgOjogQSBzZXQgb2YgYml0IGZsYWdzIHRoYXQgY29udHJvbCB0aGUgaGludGluZyBwcm9jZXNzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgIFNlZSB0aGUgRlRfSElOVF9YWFggY29uc3RhbnRzIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBmbGFncyBkZXBlbmRzIG9uIHRoZSBoaW50ZXIgbW9kdWxlIGluICAgICovCi0gIC8qICAgIHVzZS4gIE5vdCBhbGwgbW9kdWxlcyB3aWxsIHN1cHBvcnQgYWxsIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfU2V0X0hpbnRfRmxhZ3MoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGhpbnRfZmxhZ3MgKTsKLQotCi0gIC8qQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPENvbnN0YW50PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0hJTlRfTk9fSU5URUdFUl9TVEVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgYml0LWZpZWxkIGNvbnN0YW50LCB1c2VkIHdpdGggQEZUX1NldF9IaW50X0ZsYWdzIHRvIHRvIHN1cHByZXNzICAqLwotICAvKiAgICBzbmFwcGluZyBvZiBzdGVtIHdpZHRocyB0byBpbnRlZ2VyIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0hJTlRfTk9fSU5URUdFUl9TVEVNICAxCi0KLQotICAvKkAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxDb25zdGFudD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ISU5UX05PX0hTVEVNX0FMSUdOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGJpdC1maWVsZCBjb25zdGFudCwgdXNlZCB3aXRoIEBGVF9TZXRfSGludF9GbGFncyB0byB0byBzdXBwcmVzcyAgKi8KLSAgLyogICAgYWxpZ25tZW50IG9mIGhvcml6b250YWwgc3RlbXMgd2l0aCB0aGUgcGl4ZWwgZ3JpZC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9ISU5UX05PX0hTVEVNX0FMSUdOICAyCi0KLQotICAvKkAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxDb25zdGFudD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ISU5UX05PX1ZTVEVNX0FMSUdOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGJpdC1maWVsZCBjb25zdGFudCwgdXNlZCB3aXRoIEBGVF9TZXRfSGludF9GbGFncyB0byB0byBzdXBwcmVzcyAgKi8KLSAgLyogICAgYWxpZ25tZW50IG9mIHZlcnRpY2FsIHN0ZW1zIHdpdGggdGhlIHBpeGVsIGdyaWQuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9ISU5UX05PX1ZTVEVNX0FMSUdOICA0Ci0KLQogICAvKiAqLwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgKaW5kZXggNjdkODBiMy4uOGM4OGFmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgKQEAgLTExNyw3ICsxMTcsMTAgQEAKICAgLyogICAgZ2l2ZW4gYml0bWFwLiAgTm90ZSB0aGF0IGFkZGl0aW9uYWwgZm9ybWF0cyBtYXkgYmUgYWRkZWQgaW4gdGhlICAgICovCiAgIC8qICAgIGZ1dHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBGVF9QSVhFTF9NT0RFX05PTkUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICBWYWx1ZSAwIGlzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICBGVF9QSVhFTF9NT0RFX01PTk8gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICBBIG1vbm9jaHJvbWUgYml0bWFwLCB1c2luZyAxIGJpdCBwZXIgcGl4ZWwuICBOb3RlIHRoYXQgcGl4ZWxzICAgICovCiAgIC8qICAgICAgYXJlIHN0b3JlZCBpbiBtb3N0LXNpZ25pZmljYW50IG9yZGVyIChNU0IpLCB3aGljaCBtZWFucyB0aGF0ICAgICAqLwpAQCAtMzYwLDcgKzM2Myw5IEBACiAgIC8qICAgIEEgc2ltcGxlIHR5cGUgdXNlZCB0byBlbnVtZXJhdGVzIHRoZSBmbGFncyBpbiBhbiBvdXRsaW5lJ3MgICAgICAgICAqLwogICAvKiAgICBgb3V0bGluZV9mbGFncycgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfT1VUTElORV9OT05FICAgICAgICAgICA6OiBWYWx1ZSAwIGlzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICBGVF9PVVRMSU5FX09XTkVSICAgICAgICAgIDo6IElmIHNldCwgdGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lJ3MgZmllbGQgYXJyYXlzIChpLmUuICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHBvaW50cycsIGBmbGFncycgJiBgY29udG91cnMnKSBhcmUgICAqLwpAQCAtNDIyLDg4ICs0MjcsMzAgQEAKICAgfSBGVF9PdXRsaW5lX0ZsYWdzOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Q29uc3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfb3V0bGluZV9ub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBjb25zdGFudCBpcyBkZXByZWNhdGVkLiAgUGxlYXNlIHVzZSBARlRfT1VUTElORV9OT05FICAgICAgICAgICovCi0gIC8qICAgIGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgZnRfb3V0bGluZV9ub25lICBGVF9PVVRMSU5FX05PTkUKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPENvbnN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X291dGxpbmVfb3duZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgY29uc3RhbnQgaXMgZGVwcmVjYXRlZC4gIFBsZWFzZSB1c2UgQEZUX09VVExJTkVfT1dORVIgICAgICAgICAqLwotICAvKiAgICBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X291dGxpbmVfb3duZXIgIEZUX09VVExJTkVfT1dORVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPENvbnN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X291dGxpbmVfZXZlbl9vZGRfZmlsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgY29uc3RhbnQgaXMgZGVwcmVjYXRlZC4gIFBsZWFzZSB1c2UgQEZUX09VVExJTkVfRVZFTl9PRERfRklMTCAqLwotICAvKiAgICBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X291dGxpbmVfZXZlbl9vZGRfZmlsbCAgRlRfT1VUTElORV9FVkVOX09ERF9GSUxMCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxDb25zdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9vdXRsaW5lX3JldmVyc2VfZmlsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGNvbnN0YW50IGlzIGRlcHJlY2F0ZWQuICBQbGVhc2UgdXNlIEBGVF9PVVRMSU5FX1JFVkVSU0VfRklMTCAgKi8KLSAgLyogICAgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBmdF9vdXRsaW5lX3JldmVyc2VfZmlsbCAgRlRfT1VUTElORV9SRVZFUlNFX0ZJTEwKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPENvbnN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X291dGxpbmVfaWdub3JlX2Ryb3BvdXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgY29uc3RhbnQgaXMgZGVwcmVjYXRlZC4gIFBsZWFzZSB1c2UgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqIEBlbnVtOiBmdF9vdXRsaW5lX3h4eAorICAqCisgICogQGRlc2NyaXB0aW9uOgorICAqICAgdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBjb3JyZXNwb25kaW5nCisgICogICBARlRfT1VUTElORV9YWFggdmFsdWVzCisgICoKKyAgKiBAdmFsdWVzOgorICAqICAgZnRfb3V0bGluZV9ub25lICAgICAgICAgICAgOjogc2VlIEBGVF9PVVRMSU5FX05PTkUKKyAgKiAgIGZ0X291dGxpbmVfb3duZXIgICAgICAgICAgIDo6IHNlZSBARlRfT1VUTElORV9PV05FUgorICAqICAgZnRfb3V0bGluZV9ldmVuX29kZF9maWxsICAgOjogc2VlIEBGVF9PVVRMSU5FX0VWRU5fT0REX0ZJTEwKKyAgKiAgIGZ0X291dGxpbmVfcmV2ZXJzZV9maWxsICAgIDo6IHNlZSBARlRfT1VUTElORV9SRVZFUlNFX0ZJTEwKKyAgKiAgIGZ0X291dGxpbmVfaWdub3JlX2Ryb3BvdXRzIDo6IHNlZSBARlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMKKyAgKiAgIGZ0X291dGxpbmVfaGlnaF9wcmVjaXNpb24gIDo6IHNlZSBARlRfT1VUTElORV9ISUdIX1BSRUNJU0lPTgorICAqICAgZnRfb3V0bGluZV9zaW5nbGVfcGFzcyAgICAgOjogc2VlIEBGVF9PVVRMSU5FX1NJTkdMRV9QQVNTCisgICovCisjZGVmaW5lIGZ0X291dGxpbmVfbm9uZSAgICAgICAgICAgICBGVF9PVVRMSU5FX05PTkUKKyNkZWZpbmUgZnRfb3V0bGluZV9vd25lciAgICAgICAgICAgIEZUX09VVExJTkVfT1dORVIKKyNkZWZpbmUgZnRfb3V0bGluZV9ldmVuX29kZF9maWxsICAgIEZUX09VVExJTkVfRVZFTl9PRERfRklMTAorI2RlZmluZSBmdF9vdXRsaW5lX3JldmVyc2VfZmlsbCAgICAgRlRfT1VUTElORV9SRVZFUlNFX0ZJTEwKICNkZWZpbmUgZnRfb3V0bGluZV9pZ25vcmVfZHJvcG91dHMgIEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxDb25zdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9vdXRsaW5lX2hpZ2hfcHJlY2lzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGNvbnN0YW50IGlzIGRlcHJlY2F0ZWQuICBQbGVhc2UgdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX09VVExJTkVfSElHSF9QUkVDSVNJT04gaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBmdF9vdXRsaW5lX2hpZ2hfcHJlY2lzaW9uICBGVF9PVVRMSU5FX0hJR0hfUFJFQ0lTSU9OCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxDb25zdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9vdXRsaW5lX3NpbmdsZV9wYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGNvbnN0YW50IGlzIGRlcHJlY2F0ZWQuICBQbGVhc2UgdXNlIEBGVF9PVVRMSU5FX1NJTkdMRV9QQVNTICAgKi8KLSAgLyogICAgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBmdF9vdXRsaW5lX3NpbmdsZV9wYXNzICBGVF9PVVRMSU5FX1NJTkdMRV9QQVNTCisjZGVmaW5lIGZ0X291dGxpbmVfaGlnaF9wcmVjaXNpb24gICBGVF9PVVRMSU5FX0hJR0hfUFJFQ0lTSU9OCisjZGVmaW5lIGZ0X291dGxpbmVfc2luZ2xlX3Bhc3MgICAgICBGVF9PVVRMSU5FX1NJTkdMRV9QQVNTCiAKICAgLyogKi8KIApAQCAtODIzLDcgKzc3MCw3IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJhc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICByYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICBTY2FubGluZSBjb252ZXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTk5NSw3ICs5NDIsNyBAQAogICAvKiAgICBBbiBlbnVtZXJhdGlvbiB0byBsaXN0IHRoZSBiaXQgZmxhZ3MgYXMgdXNlZCBpbiB0aGUgYGZsYWdzJyBmaWVsZCAgKi8KICAgLyogICAgb2YgYSBGVF9SYXN0ZXJfUGFyYW1zIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgIEZUX1JBU1RFUl9GTEFHX0RFRkFVTFQgOjogVGhpcyB2YWx1ZSBpcyAwLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgRlRfUkFTVEVSX0ZMQUdfQUEgICAgICA6OiBUaGlzIGZsYWcgaXMgc2V0IHRvIGluZGljYXRlIHRoYXQgYW4gICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3Ryb2tlci5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdHN0cm9rZXIuaAppbmRleCA5MGZmYTI2Li5hNzE0MDU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3Ryb2tlci5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvZnRzdHJva2VyLmgKQEAgLTYsNyArNiw3IEBACiAKIEZUX0JFR0lOX0hFQURFUgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBAdHlwZTogRlRfU3Ryb2tlcgogICoKQEAgLTE2LDcgKzE2LDcgQEAKICAgdHlwZWRlZiBzdHJ1Y3QgRlRfU3Ryb2tlclJlY18qICAgIEZUX1N0cm9rZXI7CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKkAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogQGVudW06IEZUX1N0cm9rZXJfTGluZUpvaW4KICAqCkBAIC00OCw3ICs0OCw3IEBACiAgIH0gRlRfU3Ryb2tlcl9MaW5lSm9pbjsKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBAZW51bTogRlRfU3Ryb2tlcl9MaW5lQ2FwCiAgKgpAQCAtNjUsNyArNjUsNyBAQAogICogICAgICB0aGUgZW5kIG9mIGxpbmVzIGlzIHJlbmRlcmVkIGFzIGEgaGFsZi1jaXJjbGUgYXJvdW5kIHRoZQogICogICAgICBsYXN0IHBvaW50CiAgKgotICogICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUiA6OgorICogICAgRlRfU1RST0tFUl9MSU5FQ0FQX1NRVUFSRSA6OgogICogICAgICB0aGUgZW5kIG9mIGxpbmVzIGlzIHJlbmRlcmVkIGFzIGEgc3F1YXJlIGFyb3VuZCB0aGUKICAqICAgICAgbGFzdCBwb2ludAogICovCkBAIC03Nyw2ICs3Nyw3IEBACiAKICAgfSBGVF9TdHJva2VyX0xpbmVDYXA7CiAKKyAvKiAqLwogCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9TdHJva2VyX05ldyggRlRfTWVtb3J5ICAgIG1lbW9yeSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRzeXNpby5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdHN5c2lvLmgKaW5kZXggNWY4ZjhiMS4uZjM4NzRkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdHN5c2lvLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9mdHN5c2lvLmgKQEAgLTEsNiArMSwxNiBAQAogI2lmbmRlZiBfX0ZUX1NZU1RFTV9JT19IX18KICNkZWZpbmUgX19GVF9TWVNURU1fSU9fSF9fCiAKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAvKioqKiogICAgTk9URTogVEhFIENPTlRFTlQgT0YgVEhJUyBGSUxFIElTIE5PVCBDVVJSRU5UTFkgVVNFRCAgICAgICoqKioqLworIC8qKioqKiAgICAgICAgICBJTiBOT1JNQUwgQlVJTERTLiBDT05TSURFUiBJVCBFWFBFUklNRU5UQUwgICAgICAgICAgKioqKiovCisgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqCiAgICogIGRlc2lnbmluZyBjdXN0b20gc3RyZWFtcyBpcyBhIGJpdCBkaWZmZXJlbnQgbm93CkBAIC0zNSw3ICs0NSw3IEBACiAKIEZUX0JFR0lOX0hFQURFUgogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgLypAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqCiAgICogQHR5cGU6IEZUX1N0cmVhbQogICAqCkBAIC00NSw3ICs1NSw3IEBACiAgIHR5cGVkZWYgc3RydWN0IEZUX1N0cmVhbVJlY18qICAgIEZUX1N0cmVhbTsKIAogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgLypAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqCiAgICogQHR5cGU6IEZUX1N0cmVhbV9DbGFzcwogICAqCkBAIC01Niw3ICs2Niw3IEBACiAgIHR5cGVkZWYgY29uc3Qgc3RydWN0IEZUX1N0cmVhbV9DbGFzc1JlY18qICAgRlRfU3RyZWFtX0NsYXNzOwogCiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAvKkAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICoKICAgKiBAZnVuY3R5cGU6IEZUX1N0cmVhbV9SZWFkRnVuYwogICAqCkBAIC03Niw3ICs4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgc2l6ZSApOwogCiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAvKkAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICoKICAgKiBAZnVuY3R5cGU6IEZUX1N0cmVhbV9TZWVrRnVuYwogICAqCkBAIC05NCw3ICsxMDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgIHBvcyApOwogCiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAvKkAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICoKICAgKiBAc3RydWN0OiBGVF9TdHJlYW1fQ2xhc3NSZWMKICAgKgpAQCAtMTIwLDcgKzEzMCw3IEBACiAjZGVmaW5lICBGVF9TVFJFQU1fQ0xBU1NfX1JFQUQoeCkgIEZUX1NUUkVBTV9DTEFTUyh4KS0+c3RyZWFtX3JlYWQKICNkZWZpbmUgIEZUX1NUUkVBTV9DTEFTU19fU0VFSyh4KSAgRlRfU1RSRUFNX0NMQVNTKHgpLT5zdHJlYW1fc2VlazsKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIC8qQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKgogICAqIEBzdHJ1Y3Q6IEZUX1N0cmVhbVJlYwogICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3lzbWVtLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3lzbWVtLmgKaW5kZXggNzBmZTZiNS4uNDIxYWFhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdHN5c21lbS5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvZnRzeXNtZW0uaApAQCAtNSw3ICs1LDE3IEBACiAKIEZUX0JFR0lOX0hFQURFUgogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgLyoqKioqICAgIE5PVEU6IFRIRSBDT05URU5UIE9GIFRISVMgRklMRSBJUyBOT1QgQ1VSUkVOVExZIFVTRUQgICAgICAqKioqKi8KKyAvKioqKiogICAgICAgICAgSU4gTk9STUFMIEJVSUxEUy4gQ09OU0lERVIgSVQgRVhQRVJJTUVOVEFMICAgICAgICAgICoqKioqLworIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAvKkAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICoKICAgKiBAdHlwZTogRlRfTWVtb3J5CiAgICoKQEAgLTIwLDcgKzMwLDcgQEAKICAgdHlwZWRlZiBzdHJ1Y3QgRlRfTWVtb3J5UmVjXyogICBGVF9NZW1vcnk7CiAKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIC8qQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKgogICAqIEBmdW5jdHlwZTogRlRfTWVtb3J5X0FsbG9jRnVuYwogICAqCkBAIC0zOSw3ICs0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciBtZW1fZGF0YSApOwogCiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAvKkAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICoKICAgKiBAZnVuY3R5cGU6IEZUX01lbW9yeV9GcmVlRnVuYwogICAqCkBAIC01Niw3ICs2Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgbWVtX2RhdGEgKTsKIAogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgLypAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqCiAgICogQGZ1bmN0eXBlOiBGVF9NZW1vcnlfUmVhbGxvY0Z1bmMKICAgKgpAQCAtNzYsNyArODYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgIG1lbV9kYXRhICk7CiAKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIC8qQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKgogICAqIEBmdW5jdHlwZTogRlRfTWVtb3J5X0NyZWF0ZUZ1bmMKICAgKgpAQCAtMTAwLDcgKzExMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgKmFtZW1fZGF0YSApOwogCiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAvKkAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICoKICAgKiBAZnVuY3R5cGU6IEZUX01lbW9yeV9EZXN0cm95RnVuYwogICAqCkBAIC0xMTUsNyArMTI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgbWVtX2RhdGEgKTsKIAogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgLypAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqCiAgICogQHN0cnVjdDogRlRfTWVtb3J5X0Z1bmNzUmVjCiAgICoKQEAgLTE0MSw3ICsxNTEsNyBAQAogICB9IEZUX01lbW9yeV9GdW5jc1JlYywgKkZUX01lbW9yeV9GdW5jczsKIAogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgLypAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAqCiAgICogQHR5cGU6IEZUX01lbW9yeV9GdW5jcwogICAqCkBAIC0xNTIsNyArMTYyLDcgQEAKICAgdHlwZWRlZiBjb25zdCBGVF9NZW1vcnlfRnVuY3NSZWMqICBGVF9NZW1vcnlfRnVuY3M7CiAKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIC8qQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKgogICAqIEBmdW5jdGlvbjogZnRfbWVtb3J5X25ldwogICAqCkBAIC0xNzIsNyArMTgyLDcgQEAKICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgICAgICBtZW1faW5pdF9kYXRhICk7CiAKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIC8qQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgKgogICAqIEBmdW5jdGlvbjogZnRfbWVtb3J5X2Rlc3Ryb3kKICAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS90dG5hbWVpZC5oIGIvaW5jbHVkZS9mcmVldHlwZS90dG5hbWVpZC5oCmluZGV4IDk5NzM1ZWUuLjIxMTFkNDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvdHRuYW1laWQuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmgKQEAgLTIzMCw3ICsyMzAsNyBAQAogICAgKiAgIEBUVF9QTEFURk9STV9NSUNST1NPRlQgY2hhcm1hcHMgYW5kIG5hbWUgZW50cmllcy4KICAgICoKICAgICogQHZhbHVlczoKLSAgICogICBUVF9NU19JRF9TWU1CT0xTX0NTIDo6CisgICAqICAgVFRfTVNfSURfU1lNQk9MX0NTIDo6CiAgICAqICAgICBDb3JyZXNwb25kcyB0byBzeW1ib2wgZW5jb2RpbmdzLiBzZWUgQEZUX0VOQ09ESU5HX01TX1NZTUJPTC4KICAgICoKICAgICogICBUVF9NU19JRF9VTklDT0RFX0NTIDo6CmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvY29yZGljLnB5IGIvc3JjL3Rvb2xzL2NvcmRpYy5weQppbmRleCA1MTVmYmNjLi5iYjFhMjM4IDEwMDY0NAotLS0gYS9zcmMvdG9vbHMvY29yZGljLnB5CisrKyBiL3NyYy90b29scy9jb3JkaWMucHkKQEAgLTEsNyArMSw3IEBACiAjIGNvbXB1dGUgYXJjdGFuZ2VudCB0YWJsZSBmb3IgQ09SRElDIGNvbXB1dGF0aW9ucyBpbiBmdHRyaWdvbi5jCiBpbXBvcnQgc3lzLCBtYXRoCiAKLXVuaXRzICA9IDE4MCo2NTUzNiAgICMgZG9uJ3QgY2hhbmdlICEhCit1bml0cyAgPSA2NCo2NTUzNi4wICAgIyBkb24ndCBjaGFuZ2UgISEKIHNjYWxlICA9IHVuaXRzL21hdGgucGkKIHNocmluayA9IDEuMAogY29tbWEgID0gIiIKZGlmZiAtLWdpdCBhL3NyYy90b29scy9kb2NtYWtlci5weSBiL3NyYy90b29scy9kb2NtYWtlci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxOGQxYS4uMDAwMDAwMAotLS0gYS9zcmMvdG9vbHMvZG9jbWFrZXIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNjY1ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyAgRG9jTWFrZXIgMC4xIChjKSAyMDAwLTIwMDEgRGF2aWQgVHVybmVyIDxkYXZpZEBmcmVldHlwZS5vcmc+Ci0jCi0jICBEb2NNYWtlciBpcyBhIHZlcnkgc2ltcGxlIHByb2dyYW0gdXNlZCB0byBnZW5lcmF0ZSB0aGUgQVBJIFJlZmVyZW5jZQotIyAgb2YgcHJvZ3JhbXMgYnkgZXh0cmFjdGluZyBjb21tZW50cyBmcm9tIHNvdXJjZSBmaWxlcywgYW5kIGdlbmVyYXRpbmcKLSMgIHRoZSBlcXVpdmFsZW50IEhUTUwgZG9jdW1lbnRhdGlvbi4KLSMKLSMgIERvY01ha2VyIGlzIHZlcnkgc2ltaWxhciB0byBvdGhlciB0b29scyBsaWtlIERveHlnZW4sIHdpdGggdGhlCi0jICBmb2xsb3dpbmcgZGlmZmVyZW5jZXM6Ci0jCi0jICAgIC0gSXQgaXMgd3JpdHRlbiBpbiBQeXRob24gKHNvIGl0IGlzIHNsb3csIGJ1dCBlYXN5IHRvIG1haW50YWluIGFuZAotIyAgICAgIGltcHJvdmUpLgotIwotIyAgICAtIFRoZSBjb21tZW50IHN5bnRheCB1c2VkIGJ5IERvY01ha2VyIGlzIHNpbXBsZXIgYW5kIG1ha2VzIGZvcgotIyAgICAgIGNsZWFyZXIgY29tbWVudHMuCi0jCi0jICBPZiBjb3Vyc2UsIGl0IGRvZXNuJ3QgaGF2ZSBhbGwgdGhlIGdvb2RpZXMgb2YgbW9zdCBzaW1pbGFyIHRvb2xzLAotIyAgKGUuZy4gQysrIGNsYXNzIGhpZXJhcmNoaWVzKSwgYnV0IGhleSwgaXQgaXMgb25seSAyMDAwIGxpbmVzIG9mCi0jICBQeXRob24uCi0jCi0jICBEb2NNYWtlciBpcyBtYWlubHkgdXNlZCB0byBnZW5lcmF0ZSB0aGUgQVBJIHJlZmVyZW5jZXMgb2Ygc2V2ZXJhbAotIyAgRnJlZVR5cGUgcGFja2FnZXMuCi0jCi0jICAgLSBEYXZpZAotIwotCi1pbXBvcnQgZmlsZWlucHV0LCBzeXMsIG9zLCB0aW1lLCBzdHJpbmcsIGdsb2IsIGdldG9wdAotCi0jIFRoZSBQcm9qZWN0J3MgdGl0bGUuICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGZyb20gdGhlIGNvbW1hbmQgbGluZSB3aXRoCi0jIHRoZSBvcHRpb25zICItdCIgb3IgIi0tdGl0bGUiLgotIwotcHJvamVjdF90aXRsZSA9ICJQcm9qZWN0IgotCi0jIFRoZSBwcm9qZWN0J3MgZmlsZW5hbWUgcHJlZml4LiAgVGhpcyBjYW4gYmUgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZSB3aXRoCi0jIHRoZSBvcHRpb25zICItcCIgb3IgIi0tcHJlZml4IgotIwotcHJvamVjdF9wcmVmaXggPSAiIgotCi0jIFRoZSBwcm9qZWN0J3MgZG9jdW1lbnRhdGlvbiBvdXRwdXQgZGlyZWN0b3J5LiAgVGhpcyBjYW4gYmUgc2V0IGZyb20gdGhlCi0jIGNvbW1hbmQgbGluZSB3aXRoIHRoZSBvcHRpb25zICItbyIgb3IgIi0tb3V0cHV0Ii4KLSMKLW91dHB1dF9kaXIgPSBOb25lCi0KLQotIyBUaGUgZm9sbG93aW5nIGRlZmluZXMgdGhlIEhUTUwgaGVhZGVyIHVzZWQgYnkgYWxsIGdlbmVyYXRlZCBwYWdlcy4KLSMKLWh0bWxfaGVhZGVyXzEgPSAiIiJcCi08aHRtbD4KLTxoZWFkZXI+Ci08dGl0bGU+IiIiCi0KLWh0bWxfaGVhZGVyXzI9ICIiIiBBUEkgUmVmZXJlbmNlPC90aXRsZT4KLTxiYXNlZm9udCBmYWNlPSJWZXJkYW5hLEdlbmV2YSxBcmlhbCxIZWx2ZXRpY2EiPgotPHN0eWxlIGNvbnRlbnQ9InRleHQvY3NzIj4KLSAgUCB7IHRleHQtYWxpZ249anVzdGlmeSB9Ci0gIEgxIHsgdGV4dC1hbGlnbj1jZW50ZXIgfQotICBMSSB7IHRleHQtYWxpZ249anVzdGlmeSB9Ci08L3N0eWxlPgotPC9oZWFkZXI+Ci08Ym9keSB0ZXh0PSMwMDAwMDAKLSAgICAgIGJnY29sb3I9I0ZGRkZGRgotICAgICAgbGluaz0jMDAwMEVGCi0gICAgICB2bGluaz0jNTExODhFCi0gICAgICBhbGluaz0jRkYwMDAwPgotPGNlbnRlcj48aDE+IiIiCi0KLWh0bWxfaGVhZGVyXzM9IiIiIEFQSSBSZWZlcmVuY2U8L2gxPjwvY2VudGVyPgotIiIiCi0KLSMgVGhpcyBpcyByZWNvbXB1dGVkIGxhdGVyIHdoZW4gdGhlIHByb2plY3QgdGl0bGUgY2hhbmdlcy4KLSMKLWh0bWxfaGVhZGVyID0gaHRtbF9oZWFkZXJfMSArIHByb2plY3RfdGl0bGUgKyBodG1sX2hlYWRlcl8yICsgcHJvamVjdF90aXRsZSArIGh0bWxfaGVhZGVyXzMKLQotCi0jIFRoZSBIVE1MIGZvb3RlciB1c2VkIGJ5IGFsbCBnZW5lcmF0ZWQgcGFnZXMuCi0jCi1odG1sX2Zvb3RlciA9ICIiIlwKLTwvYm9keT4KLTwvaHRtbD4iIiIKLQotIyBUaGUgaGVhZGVyIGFuZCBmb290ZXIgdXNlZCBmb3IgZWFjaCBzZWN0aW9uLgotIwotc2VjdGlvbl90aXRsZV9oZWFkZXIgPSAiPGNlbnRlcj48aDE+Igotc2VjdGlvbl90aXRsZV9mb290ZXIgPSAiPC9oMT48L2NlbnRlcj4iCi0KLSMgVGhlIGhlYWRlciBhbmQgZm9vdGVyIHVzZWQgZm9yIGNvZGUgc2VnbWVudHMuCi0jCi1jb2RlX2hlYWRlciA9ICI8Zm9udCBjb2xvcj1ibHVlPjxwcmU+IgotY29kZV9mb290ZXIgPSAiPC9wcmU+PC9mb250PiIKLQotIyBQYXJhZ3JhcGggaGVhZGVyIGFuZCBmb290ZXIuCi0jCi1wYXJhX2hlYWRlciA9ICI8cD4iCi1wYXJhX2Zvb3RlciA9ICI8L3A+IgotCi0jIEJsb2NrIGhlYWRlciBhbmQgZm9vdGVyLgotIwotYmxvY2tfaGVhZGVyID0gIjxjZW50ZXI+PHRhYmxlIHdpZHRoPTc1JT48dHI+PHRkPiIKLWJsb2NrX2Zvb3RlciA9ICI8L3RkPjwvdHI+PC90YWJsZT48aHIgd2lkdGg9NzUlPjwvY2VudGVyPiIKLQotIyBEZXNjcmlwdGlvbiBoZWFkZXIvZm9vdGVyLgotIwotZGVzY3JpcHRpb25faGVhZGVyID0gIjxjZW50ZXI+PHRhYmxlIHdpZHRoPTg3JT48dHI+PHRkPiIKLWRlc2NyaXB0aW9uX2Zvb3RlciA9ICI8L3RkPjwvdHI+PC90YWJsZT48L2NlbnRlcj48YnI+IgotCi0jIE1hcmtlciBoZWFkZXIvaW50ZXIvZm9vdGVyIGNvbWJpbmF0aW9uLgotIwotbWFya2VyX2hlYWRlciA9ICI8Y2VudGVyPjx0YWJsZSB3aWR0aD04NyUgY2VsbHBhZGRpbmc9NT48dHIgYmdjb2xvcj0jRUVFRUZGPjx0ZD48ZW0+PGI+IgotbWFya2VyX2ludGVyICA9ICI8L2I+PC9lbT48L3RkPjwvdHI+PHRyPjx0ZD4iCi1tYXJrZXJfZm9vdGVyID0gIjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiIKLQotIyBTb3VyY2UgY29kZSBleHRyYWN0cyBoZWFkZXIvZm9vdGVyLgotIwotc291cmNlX2hlYWRlciA9ICI8Y2VudGVyPjx0YWJsZSB3aWR0aD04NyU+PHRyIGJnY29sb3I9I0Q2RThGRiB3aWR0aD0xMDAlPjx0ZD48cHJlPiIKLXNvdXJjZV9mb290ZXIgPSAiPC9wcmU+PC90YWJsZT48L2NlbnRlcj48YnI+IgotCi0jIENoYXB0ZXIgaGVhZGVyL2ludGVyL2Zvb3Rlci4KLSMKLWNoYXB0ZXJfaGVhZGVyID0gIjxjZW50ZXI+PHRhYmxlIHdpZHRoPTc1JT48dHI+PHRkPjxoMj4iCi1jaGFwdGVyX2ludGVyICA9ICI8L2gyPjx1bD4iCi1jaGFwdGVyX2Zvb3RlciA9ICI8L3VsPjwvdGQ+PC90cj48L3RhYmxlPjwvY2VudGVyPiIKLQotY3VycmVudF9zZWN0aW9uID0gTm9uZQotCi0KLSMgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNvcnQgdGhlIGluZGV4LiAgSXQgaXMgYSBzaW1wbGUgbGV4aWNvZ3JhcGhpY2FsCi0jIHNvcnQsIGV4Y2VwdCB0aGF0IGl0IHBsYWNlcyBjYXBpdGFsIGxldHRlcnMgYmVmb3JlIGxvd2VyY2FzZSBvbmVzLgotIwotZGVmIGluZGV4X3NvcnQoIHMxLCBzMiApOgotICAgIGlmIG5vdCBzMToKLSAgICAgICAgcmV0dXJuIC0xCi0KLSAgICBpZiBub3QgczI6Ci0gICAgICAgIHJldHVybiAxCi0KLSAgICBsMSA9IGxlbiggczEgKQotICAgIGwyID0gbGVuKCBzMiApCi0gICAgbTEgPSBzdHJpbmcubG93ZXIoIHMxICkKLSAgICBtMiA9IHN0cmluZy5sb3dlciggczIgKQotCi0gICAgZm9yIGkgaW4gcmFuZ2UoIGwxICk6Ci0gICAgICAgIGlmIGkgPj0gbDIgb3IgbTFbaV0gPiBtMltpXToKLSAgICAgICAgICAgIHJldHVybiAxCi0KLSAgICAgICAgaWYgbTFbaV0gPCBtMltpXToKLSAgICAgICAgICAgIHJldHVybiAtMQotCi0gICAgICAgIGlmIHMxW2ldIDwgczJbaV06Ci0gICAgICAgICAgICByZXR1cm4gLTEKLQotICAgICAgICBpZiBzMVtpXSA+IHMyW2ldOgotICAgICAgICAgICAgcmV0dXJuIDEKLQotICAgIGlmIGwyID4gbDE6Ci0gICAgICAgIHJldHVybiAtMQotCi0gICAgcmV0dXJuIDAKLQotCi0jIFNvcnQgaW5wdXRfbGlzdCwgcGxhY2luZyB0aGUgZWxlbWVudHMgb2Ygb3JkZXJfbGlzdCBpbiBmcm9udC4KLSMKLWRlZiBzb3J0X29yZGVyX2xpc3QoIGlucHV0X2xpc3QsIG9yZGVyX2xpc3QgKToKLSAgICBuZXdfbGlzdCA9IG9yZGVyX2xpc3RbOl0KLSAgICBmb3IgaWQgaW4gaW5wdXRfbGlzdDoKLSAgICAgICAgaWYgbm90IGlkIGluIG9yZGVyX2xpc3Q6Ci0gICAgICAgICAgICBuZXdfbGlzdC5hcHBlbmQoIGlkICkKLSAgICByZXR1cm4gbmV3X2xpc3QKLQotCi0jIFRyYW5zbGF0ZSBhIHNpbmdsZSBsaW5lIG9mIHNvdXJjZSB0byBIVE1MLiAgVGhpcyB3aWxsIGNvbnZlcnQKLSMgYSAiPCIgaW50byAiJmx0LiIsICI+IiBpbnRvICImZ3QuIiwgZXRjLgotIwotZGVmIGh0bWxfcXVvdGUoIGxpbmUgKToKLSAgICByZXN1bHQgPSBzdHJpbmcucmVwbGFjZSggbGluZSwgICAiJiIsICImYW1wOyIgKQotICAgIHJlc3VsdCA9IHN0cmluZy5yZXBsYWNlKCByZXN1bHQsICI8IiwgIiZsdDsiICkKLSAgICByZXN1bHQgPSBzdHJpbmcucmVwbGFjZSggcmVzdWx0LCAiPiIsICImZ3Q7IiApCi0gICAgcmV0dXJuIHJlc3VsdAotCi0jIHNhbWUgYXMgJ2h0bWxfcXVvdGUnLCBidXQgaWdub3JlcyBsZWZ0IGFuZCByaWdodCBicmFja2V0cwotIwotZGVmIGh0bWxfcXVvdGUwKCBsaW5lICk6Ci0gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBsaW5lLCAiJiIsICImYW1wOyIgKQotCi0KLSMgT3BlbiB0aGUgc3RhbmRhcmQgb3V0cHV0IHRvIGEgZ2l2ZW4gcHJvamVjdCBkb2N1bWVudGF0aW9uIGZpbGUuICBVc2UKLSMgIm91dHB1dF9kaXIiIHRvIGRldGVybWluZSB0aGUgZmlsZW5hbWUgbG9jYXRpb24gaWYgbmVjZXNzYXJ5IGFuZCBzYXZlIHRoZQotIyBvbGQgc3Rkb3V0IGluIGEgdHVwbGUgdGhhdCBpcyByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uLgotIwotZGVmIG9wZW5fb3V0cHV0KCBmaWxlbmFtZSApOgotICAgIGdsb2JhbCBvdXRwdXRfZGlyCi0KLSAgICBpZiBvdXRwdXRfZGlyIGFuZCBvdXRwdXRfZGlyICE9ICIiOgotICAgICAgICBmaWxlbmFtZSA9IG91dHB1dF9kaXIgKyBvcy5zZXAgKyBmaWxlbmFtZQotCi0gICAgb2xkX3N0ZG91dCA9IHN5cy5zdGRvdXQKLSAgICBuZXdfZmlsZSAgID0gb3BlbiggZmlsZW5hbWUsICJ3IiApCi0gICAgc3lzLnN0ZG91dCA9IG5ld19maWxlCi0KLSAgICByZXR1cm4gKCBuZXdfZmlsZSwgb2xkX3N0ZG91dCApCi0KLQotIyBDbG9zZSB0aGUgb3V0cHV0IHRoYXQgd2FzIHJldHVybmVkIGJ5ICJjbG9zZV9vdXRwdXQiLgotIwotZGVmIGNsb3NlX291dHB1dCggb3V0cHV0ICk6Ci0gICAgb3V0cHV0WzBdLmNsb3NlKCkKLSAgICBzeXMuc3Rkb3V0ID0gb3V0cHV0WzFdCi0KLQotIyBDaGVjayBvdXRwdXQgZGlyZWN0b3J5LgotIwotZGVmIGNoZWNrX291dHB1dCggKToKLSAgICBnbG9iYWwgb3V0cHV0X2RpcgotICAgIGlmIG91dHB1dF9kaXI6Ci0gICAgICAgIGlmIG91dHB1dF9kaXIgIT0gIiI6Ci0gICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2Rpciggb3V0cHV0X2RpciApOgotICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICJhcmd1bWVudCIgKyAiICciICsgb3V0cHV0X2RpciArICInICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBub3QgYSB2YWxpZCBkaXJlY3RvcnkiICkKLSAgICAgICAgICAgICAgICBzeXMuZXhpdCggMiApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBvdXRwdXRfZGlyID0gTm9uZQotCi0KLWRlZiBjb21wdXRlX3RpbWVfaHRtbCggKToKLSAgICBnbG9iYWwgaHRtbF9mb290ZXIKLSAgICB0aW1lX3N0cmluZyA9IHRpbWUuYXNjdGltZSggdGltZS5sb2NhbHRpbWUoIHRpbWUudGltZSgpICkgKQotICAgIGh0bWxfZm9vdGVyID0gIjxwPjxjZW50ZXI+PGZvbnQgc2l6ZT0iIi0yIiI+Z2VuZXJhdGVkIG9uICIgKyB0aW1lX3N0cmluZyArICI8L2ZvbnQ+PC9wPjwvY2VudGVyPiIgKyBodG1sX2Zvb3RlcgotCi0jIFRoZSBGcmVlVHlwZSAyIHJlZmVyZW5jZSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgc291cmNlIGZpbGVzLiAgVGhlc2UKLSMgY29udGFpbiB2YXJpb3VzIGNvbW1lbnQgYmxvY2tzIHRoYXQgZm9sbG93IG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6Ci0jCi0jICAvKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgICAqCi0jICAgKiAgRk9STUFUMQotIyAgICoKLSMgICAqCi0jICAgKgotIyAgICoKLSMgICAqKioqKioqKioqKioqKioqKioqKioqKioqLwotIwotIyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwotIyAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwotIyAgLyogIEZPUk1BVDIgICAgICAgICAgICAgICAqLwotIyAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwotIyAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwotIyAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwotIyAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwotIwotIyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwotIyAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwotIyAgLyogIEZPUk1BVDMgICAgICAgICAgICAgICAqLwotIyAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwotIyAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwotIyAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwotIyAgLyogICAgICAgICAgICAgICAgICAgICAgICAqLwotIyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwotIwotIyBFYWNoIGJsb2NrIGNvbnRhaW5zIGEgbGlzdCBvZiBtYXJrZXJzOyBlYWNoIG9uZSBjYW4gYmUgZm9sbG93ZWQgYnkKLSMgc29tZSBhcmJpdHJhcnkgdGV4dCBvciBhIGxpc3Qgb2YgZmllbGRzLiAgSGVyZSBhbiBleGFtcGxlOgotIwotIyAgICA8U3RydWN0PgotIyAgICAgICBNeVN0cnVjdAotIwotIyAgICA8RGVzY3JpcHRpb24+Ci0jICAgICAgIHRoaXMgc3RydWN0dXJlIGhvbGRzIHNvbWUgZGF0YQotIwotIyAgICA8RmllbGRzPgotIyAgICAgICB4IDo6IGhvcml6b250YWwgY29vcmRpbmF0ZQotIyAgICAgICB5IDo6IHZlcnRpY2FsIGNvb3JkaW5hdGUKLSMKLSMKLSMgVGhpcyBleGFtcGxlIGRlZmluZXMgdGhyZWUgbWFya2VyczogJ1N0cnVjdCcsICdEZXNjcmlwdGlvbicgJiAnRmllbGRzJy4KLSMgVGhlIGZpcnN0IHR3byBtYXJrZXJzIGNvbnRhaW4gYXJiaXRyYXJ5IHRleHQsIHdoaWxlIHRoZSBsYXN0IG9uZSBjb250YWlucwotIyBhIGxpc3Qgb2YgZmllbGRzLgotIwotIyBFYWNoIGZpZWxkIGlzIHNpbXBseSBvZiB0aGUgZm9ybWF0OiAgV09SRCA6OiBURVhULi4uCi0jCi0jIE5vdGUgdGhhdCB0eXBpY2FsbHkgZWFjaCBjb21tZW50IGJsb2NrIGlzIGZvbGxvd2VkIGJ5IHNvbWUgc291cmNlIGNvZGUKLSMgZGVjbGFyYXRpb24gdGhhdCBtYXkgbmVlZCB0byBiZSBrZXB0IGluIHRoZSByZWZlcmVuY2UuCi0jCi0jIE5vdGUgdGhhdCBtYXJrZXJzIGNhbiBhbHRlcm5hdGl2ZWx5IGJlIHdyaXR0ZW4gYXMgIkBNQVJLRVI6IiBpbnN0ZWFkIG9mCi0jICI8TUFSS0VSPiIuICBBbGwgbWFya2VyIGlkZW50aWZpZXJzIGFyZSBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZSBkdXJpbmcKLSMgcGFyc2luZyBpbiBvcmRlciB0byBzaW1wbHkgc29ydGluZy4KLSMKLSMgV2UgYXNzb2NpYXRlIHdpdGggZWFjaCBibG9jayB0aGUgZm9sbG93aW5nIHNvdXJjZSBsaW5lcyB0aGF0IGRvIG5vdCBiZWdpbgotIyB3aXRoIGEgY29tbWVudC4gIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nOgotIwotIyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jICAgICoKLSMgICAgKiA8bXl0YWc+ICBibGFibGEKLSMgICAgKgotIyAgICAqLwotIwotIyAgIGJsYV9ibGFfYmxhCi0jICAgYmlsaXBfYmlsaXAKLSMKLSMgICAvKiAtIHRoaXMgY29tbWVudCBhY3RzIGFzIGEgc2VwYXJhdG9yIC0gKi8KLSMKLSMgICBibG9fYmxvX2JsbwotIwotIwotIyB3aWxsIG9ubHkga2VlcCB0aGUgZmlyc3QgdHdvIGxpbmVzIG9mIHNvdXJjZXMgd2l0aAotIyB0aGUgImJsYWJsYSIgYmxvY2suCi0jCi0jIEhvd2V2ZXIsIHRoZSBjb21tZW50IHdpbGwgYmUga2VwdCwgd2l0aCBmb2xsb3dpbmcgc291cmNlIGxpbmVzIGlmIGl0Ci0jIGNvbnRhaW5zIGEgc3RhcnRpbmcgJyMnIG9yICdAJyBhcyBpbjoKLSMKLSMgICAvKkAuLi4uLiovCi0jICAgLyojLi4uLi4qLwotIyAgIC8qIEAuLi4uLiovCi0jICAgLyogIy4uLi4uKi8KLSMKLQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIFRoZSBEb2NDb2RlIGNsYXNzIGlzIHVzZWQgdG8gc3RvcmUgc291cmNlIGNvZGUgbGluZXMuCi0jCi0jICAgJ3NlbGYubGluZXMnIGNvbnRhaW5zIGEgc2V0IG9mIHNvdXJjZSBjb2RlIGxpbmVzIHRoYXQgd2lsbCBiZSBkdW1wZWQgYXMKLSMgICBIVE1MIGluIGEgPFBSRT4gdGFnLgotIwotIyAgIFRoZSBvYmplY3QgaXMgZmlsbGVkIGxpbmUgYnkgbGluZSBieSB0aGUgcGFyc2VyOyBpdCBzdHJpcHMgdGhlIGxlYWRpbmcKLSMgICAibWFyZ2luIiBzcGFjZSBmcm9tIGVhY2ggaW5wdXQgbGluZSBiZWZvcmUgc3RvcmluZyBpdCBpbiAnc2VsZi5saW5lcycuCi0jCi1jbGFzcyBEb2NDb2RlOgotCi0gICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXJnaW4gPSAwICk6Ci0gICAgICAgIHNlbGYubGluZXMgID0gW10KLSAgICAgICAgc2VsZi5tYXJnaW4gPSBtYXJnaW4KLQotCi0gICAgZGVmIGFkZCggc2VsZiwgbGluZSApOgotICAgICAgICAjIHJlbW92ZSBtYXJnaW4gd2hpdGVzcGFjZQotICAgICAgICAjCi0gICAgICAgIGlmIHN0cmluZy5zdHJpcCggbGluZVs6IHNlbGYubWFyZ2luXSApID09ICIiOgotICAgICAgICAgICAgbGluZSA9IGxpbmVbc2VsZi5tYXJnaW4gOl0KLSAgICAgICAgc2VsZi5saW5lcy5hcHBlbmQoIGxpbmUgKQotCi0KLSAgICBkZWYgZHVtcCggc2VsZiApOgotICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmxpbmVzOgotICAgICAgICAgICAgcHJpbnQgIi0tIiArIGxpbmUKLSAgICAgICAgcHJpbnQgIiIKLQotCi0gICAgZGVmIGdldF9pZGVudGlmaWVyKCBzZWxmICk6Ci0gICAgICAgICMgdGhpcyBmdW5jdGlvbiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkCi0gICAgICAgICMKLSAgICAgICAgcmV0dXJuICJVTktOT1dOX0NPREVfSURFTlRJRklFUiEiCi0KLQotICAgIGRlZiBkdW1wX2h0bWwoIHNlbGYsIGlkZW50aWZpZXJzID0gTm9uZSApOgotICAgICAgICAjIGNsZWFuIHRoZSBsYXN0IGVtcHR5IGxpbmVzCi0gICAgICAgICMKLSAgICAgICAgbCA9IGxlbiggc2VsZi5saW5lcyApIC0gMQotICAgICAgICB3aGlsZSBsID4gMCBhbmQgc3RyaW5nLnN0cmlwKCBzZWxmLmxpbmVzW2wgLSAxXSApID09ICIiOgotICAgICAgICAgICAgbCA9IGwgLSAxCi0KLSAgICAgICAgIyBUaGUgY29kZSBmb290ZXIgc2hvdWxkIGJlIGRpcmVjdGx5IGFwcGVuZGVkIHRvIHRoZSBsYXN0IGNvZGUKLSAgICAgICAgIyBsaW5lIHRvIGF2b2lkIGFuIGFkZGl0aW9uYWwgYmxhbmsgbGluZS4KLSAgICAgICAgIwotICAgICAgICBwcmludCBjb2RlX2hlYWRlciwKLSAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5saW5lc1swIDogbCsxXToKLSAgICAgICAgICAgIHByaW50ICdcbicgKyBodG1sX3F1b3RlKGxpbmUpLAotICAgICAgICBwcmludCBjb2RlX2Zvb3RlciwKLQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIFRoZSBEb2NQYXJhZ3JhcGggaXMgdXNlZCB0byBzdG9yZSB0ZXh0IHBhcmFncmFwaHMuCi0jICdzZWxmLndvcmRzJyBpcyBzaW1wbHkgYSBsaXN0IG9mIHdvcmRzIGZvciB0aGUgcGFyYWdyYXBoLgotIwotIyBUaGUgcGFyYWdyYXBoIGlzIGZpbGxlZCBsaW5lIGJ5IGxpbmUgYnkgdGhlIHBhcnNlci4KLSMKLWNsYXNzIERvY1BhcmFncmFwaDoKLQotICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgotICAgICAgICBzZWxmLndvcmRzID0gW10KLQotCi0gICAgZGVmIGFkZCggc2VsZiwgbGluZSApOgotICAgICAgICAjIEdldCByaWQgb2YgdW53YW50ZWQgc3BhY2VzIGluIHRoZSBwYXJhZ3JhcGguCi0gICAgICAgICMKLSAgICAgICAgIyBUaGUgZm9sbG93aW5nIHR3byBsaW5lcyBhcmUgdGhlIHNhbWUgYXMKLSAgICAgICAgIwotICAgICAgICAjICAgc2VsZi53b3Jkcy5leHRlbmQoIHN0cmluZy5zcGxpdCggbGluZSApICkKLSAgICAgICAgIwotICAgICAgICAjIGJ1dCBvbGRlciBQeXRob24gdmVyc2lvbnMgZG9uJ3QgaGF2ZSB0aGUgYGV4dGVuZCcgYXR0cmlidXRlLgotICAgICAgICAjCi0gICAgICAgIGxhc3QgPSBsZW4oIHNlbGYud29yZHMgKQotICAgICAgICBzZWxmLndvcmRzW2xhc3QgOiBsYXN0XSA9IHN0cmluZy5zcGxpdCggbGluZSApCi0KLQotICAgICMgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBmaXJzdCB3b3JkIG9mIGEgZ2l2ZW4KLSAgICAjIHBhcmFncmFwaC4KLSAgICAjCi0gICAgZGVmIGdldF9pZGVudGlmaWVyKCBzZWxmICk6Ci0gICAgICAgIGlmIHNlbGYud29yZHM6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi53b3Jkc1swXQotCi0gICAgICAgICMgc2hvdWxkIG5ldmVyIGhhcHBlbgotICAgICAgICAjCi0gICAgICAgIHJldHVybiAiVU5LTk9XTl9QQVJBX0lERU5USUZJRVIhIgotCi0KLSAgICBkZWYgZ2V0X3dvcmRzKCBzZWxmICk6Ci0gICAgICAgIHJldHVybiBzZWxmLndvcmRzWzpdCi0KLQotICAgIGRlZiBkdW1wKCBzZWxmLCBpZGVudGlmaWVycyA9IE5vbmUgKToKLSAgICAgICAgbWF4X3dpZHRoID0gNTAKLSAgICAgICAgY3Vyc29yICAgID0gMAotICAgICAgICBsaW5lICAgICAgPSAiIgotICAgICAgICBleHRyYSAgICAgPSBOb25lCi0gICAgICAgIGFscGhhbnVtICA9IHN0cmluZy5sb3dlcmNhc2UgKyBzdHJpbmcudXBwZXJjYXNlICsgc3RyaW5nLmRpZ2l0cyArICdfJwotCi0gICAgICAgIGZvciB3b3JkIGluIHNlbGYud29yZHM6Ci0gICAgICAgICAgICAjIHByb2Nlc3MgY3Jvc3MgcmVmZXJlbmNlcyBpZiBuZWVkZWQKLSAgICAgICAgICAgICMKLSAgICAgICAgICAgIGlmIGlkZW50aWZpZXJzIGFuZCB3b3JkIGFuZCB3b3JkWzBdID09ICdAJzoKLSAgICAgICAgICAgICAgICB3b3JkID0gd29yZFsxIDpdCi0KLSAgICAgICAgICAgICAgICAjIHdlIG5lZWQgdG8gZmluZCBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMKLSAgICAgICAgICAgICAgICAjCi0gICAgICAgICAgICAgICAgbCA9IGxlbiggd29yZCApCi0gICAgICAgICAgICAgICAgaSA9IDAKLSAgICAgICAgICAgICAgICB3aGlsZSBpIDwgbCBhbmQgd29yZFtpXSBpbiBhbHBoYW51bToKLSAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxCi0KLSAgICAgICAgICAgICAgICBpZiBpIDwgbDoKLSAgICAgICAgICAgICAgICAgICAgZXh0cmEgPSB3b3JkW2kgOl0KLSAgICAgICAgICAgICAgICAgICAgd29yZCAgPSB3b3JkWzAgOiBpXQotCi0gICAgICAgICAgICAgICAgYmxvY2sgPSBpZGVudGlmaWVycy5nZXQoIHdvcmQgKQotICAgICAgICAgICAgICAgIGlmIGJsb2NrOgotICAgICAgICAgICAgICAgICAgICB3b3JkID0gJzxhIGhyZWY9IicgKyBibG9jay5odG1sX2FkZHJlc3MoKSArICciPicgKyB3b3JkICsgJzwvYT4nCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgd29yZCA9ICc/JyArIHdvcmQKLQotICAgICAgICAgICAgaWYgY3Vyc29yICsgbGVuKCB3b3JkICkgKyAxID4gbWF4X3dpZHRoOgotICAgICAgICAgICAgICAgIHByaW50IGh0bWxfcXVvdGUwKGxpbmUpCi0gICAgICAgICAgICAgICAgY3Vyc29yID0gMAotICAgICAgICAgICAgICAgIGxpbmUgICA9ICIiCi0KLSAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgd29yZAotICAgICAgICAgICAgaWYgbm90IGV4dHJhOgotICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgIiAiCi0KLSAgICAgICAgICAgIGN1cnNvciA9IGN1cnNvciArIGxlbiggd29yZCApICsgMQotCi0KLSAgICAgICAgICAgICMgSGFuZGxlIHRyYWlsaW5nIHBlcmlvZHMsIGNvbW1hcywgZXRjLiBhdCB0aGUgZW5kIG9mIGNyb3NzCi0gICAgICAgICAgICAjIHJlZmVyZW5jZXMuCi0gICAgICAgICAgICAjCi0gICAgICAgICAgICBpZiBleHRyYToKLSAgICAgICAgICAgICAgICBpZiBjdXJzb3IgKyBsZW4oIGV4dHJhICkgKyAxID4gbWF4X3dpZHRoOgotICAgICAgICAgICAgICAgICAgICBwcmludCBodG1sX3F1b3RlMChsaW5lKQotICAgICAgICAgICAgICAgICAgICBjdXJzb3IgPSAwCi0gICAgICAgICAgICAgICAgICAgIGxpbmUgICA9ICIiCi0KLSAgICAgICAgICAgICAgICBsaW5lICAgPSBsaW5lICsgZXh0cmEgKyAiICIKLSAgICAgICAgICAgICAgICBjdXJzb3IgPSBjdXJzb3IgKyBsZW4oIGV4dHJhICkgKyAxCi0gICAgICAgICAgICAgICAgZXh0cmEgID0gTm9uZQotCi0gICAgICAgIGlmIGN1cnNvciA+IDA6Ci0gICAgICAgICAgICBwcmludCBodG1sX3F1b3RlMChsaW5lKQotCi0gICAgICAgICMgcHJpbnQgIqciICMgZm9yIGRlYnVnZ2luZyBvbmx5Ci0KLQotICAgIGRlZiBkdW1wX3N0cmluZyggc2VsZiApOgotICAgICAgICBzICAgICA9ICIiCi0gICAgICAgIHNwYWNlID0gIiIKLSAgICAgICAgZm9yIHdvcmQgaW4gc2VsZi53b3JkczoKLSAgICAgICAgICAgIHMgICAgID0gcyArIHNwYWNlICsgd29yZAotICAgICAgICAgICAgc3BhY2UgPSAiICIKLQotICAgICAgICByZXR1cm4gcwotCi0KLSAgICBkZWYgZHVtcF9odG1sKCBzZWxmLCBpZGVudGlmaWVycyA9IE5vbmUgKToKLSAgICAgICAgcHJpbnQgcGFyYV9oZWFkZXIKLSAgICAgICAgc2VsZi5kdW1wKCBpZGVudGlmaWVycyApCi0gICAgICAgIHByaW50IHBhcmFfZm9vdGVyCi0KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBEb2NDb250ZW50IGlzIHVzZWQgdG8gc3RvcmUgdGhlIGNvbnRlbnQgb2YgYSBnaXZlbiBtYXJrZXIuCi0jCi0jIFRoZSAic2VsZi5pdGVtcyIgbGlzdCBjb250YWlucyAoZmllbGQsZWxlbWVudHMpIHJlY29yZHMsIHdoZXJlICJmaWVsZCIKLSMgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBzdHJ1Y3R1cmUgZmllbGQgb3IgZnVuY3Rpb24gcGFyYW1ldGVyIChpbmRpY2F0ZWQKLSMgYnkgYSAiOjoiKSwgb3IgTlVMTCBmb3IgYSBub3JtYWwgc2VjdGlvbiBvZiB0ZXh0L2NvZGUuCi0jCi0jIEhlbmNlLCB0aGUgZm9sbG93aW5nIGV4YW1wbGU6Ci0jCi0jICAgPE15TWFya2VyPgotIyAgICAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiB3aGF0IGNhbiBiZSBwdXQgaW4gYSBjb250ZW50IHNlY3Rpb24sCi0jCi0jICAgICAgQSBzZWNvbmQgbGluZSBvZiBleGFtcGxlIHRleHQuCi0jCi0jICAgICAgeCA6OiBBIHNpbXBsZSB0ZXN0IGZpZWxkLCB3aXRoIHNvbWUgY29udGVudHMuCi0jICAgICAgeSA6OiBFdmVuIGJlZm9yZSwgdGhpcyBmaWVsZCBoYXMgc29tZSBjb2RlIGNvbnRlbnRzLgotIyAgICAgICAgICAgewotIyAgICAgICAgICAgICB5ID0geCsyOwotIyAgICAgICAgICAgfQotIwotIyBzaG91bGQgYmUgc3RvcmVkIGFzCi0jCi0jICAgICBbICggTm9uZSwgWyBEb2NQYXJhZ3JhcGgsIERvY1BhcmFncmFwaF0gKSwKLSMgICAgICAgKCAieCIsICBbIERvY1BhcmFncmFwaCBdICksCi0jICAgICAgICggInkiLCAgWyBEb2NQYXJhZ3JhcGgsIERvY0NvZGUgXSApIF0KLSMKLSMgaW4gJ3NlbGYuaXRlbXMnLgotIwotIyBUaGUgRG9jQ29udGVudCBvYmplY3QgaXMgZW50aXJlbHkgYnVpbHQgYXQgY3JlYXRpb24gdGltZTsgeW91IG11c3QgcGFzcyBhCi0jIGxpc3Qgb2YgaW5wdXQgdGV4dCBsaW5lcyBpbiB0aGUgImxpbmVzX2xpc3QiIHBhcmFtZXRlci4KLSMKLWNsYXNzIERvY0NvbnRlbnQ6Ci0KLSAgICBkZWYgX19pbml0X18oIHNlbGYsIGxpbmVzX2xpc3QgKToKLSAgICAgICAgc2VsZi5pdGVtcyAgPSBbXQotICAgICAgICBjb2RlX21vZGUgICA9IDAKLSAgICAgICAgY29kZV9tYXJnaW4gPSAwCi0gICAgICAgIHRleHQgICAgICAgID0gW10KLSAgICAgICAgcGFyYWdyYXBoICAgPSBOb25lICAgIyByZXByZXNlbnRzIHRoZSBjdXJyZW50IERvY1BhcmFncmFwaAotICAgICAgICBjb2RlICAgICAgICA9IE5vbmUgICAjIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgRG9jQ29kZQotCi0gICAgICAgIGVsZW1lbnRzICAgID0gW10gICAgICMgdGhlIGxpc3Qgb2YgZWxlbWVudHMgZm9yIHRoZSBjdXJyZW50IGZpZWxkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnRhaW5zIERvY1BhcmFncmFwaCBvciBEb2NDb2RlIG9iamVjdHMKLQotICAgICAgICBmaWVsZCAgICAgICA9IE5vbmUgICAjIHRoZSBjdXJyZW50IGZpZWxkCi0KLSAgICAgICAgZm9yIGFsaW5lIGluIGxpbmVzX2xpc3Q6Ci0gICAgICAgICAgICBpZiBjb2RlX21vZGUgPT0gMDoKLSAgICAgICAgICAgICAgICBsaW5lICAgPSBzdHJpbmcubHN0cmlwKCBhbGluZSApCi0gICAgICAgICAgICAgICAgbCAgICAgID0gbGVuKCBsaW5lICkKLSAgICAgICAgICAgICAgICBtYXJnaW4gPSBsZW4oIGFsaW5lICkgLSBsCi0KLSAgICAgICAgICAgICAgICAjIGlmIHRoZSBsaW5lIGlzIGVtcHR5LCB0aGlzIGlzIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAjIHBhcmFncmFwaAotICAgICAgICAgICAgICAgICMKLSAgICAgICAgICAgICAgICBpZiBsID09IDAgb3IgbGluZSA9PSAneyc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIHBhcmFncmFwaDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFwcGVuZCggcGFyYWdyYXBoICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaCA9IE5vbmUKLQotICAgICAgICAgICAgICAgICAgICBpZiBsaW5lID09ICIiOgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICAgICAgICAgICAgICBjb2RlX21vZGUgICA9IDEKLSAgICAgICAgICAgICAgICAgICAgY29kZV9tYXJnaW4gPSBtYXJnaW4KLSAgICAgICAgICAgICAgICAgICAgY29kZSAgICAgICAgPSBOb25lCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgICAgICAgICB3b3JkcyA9IHN0cmluZy5zcGxpdCggbGluZSApCi0KLSAgICAgICAgICAgICAgICAjIHRlc3QgZm9yIGEgZmllbGQgZGVsaW1pdGVyIG9uIHRoZSBzdGFydCBvZiB0aGUgbGluZSwgaS5lLgotICAgICAgICAgICAgICAgICMgdGhlIHRva2VuIGA6OicKLSAgICAgICAgICAgICAgICAjCi0gICAgICAgICAgICAgICAgaWYgbGVuKCB3b3JkcyApID49IDIgYW5kIHdvcmRzWzFdID09ICI6OiI6Ci0gICAgICAgICAgICAgICAgICAgICMgc3RhcnQgYSBuZXcgZmllbGQgLSBjb21wbGV0ZSBjdXJyZW50IHBhcmFncmFwaCBpZiBhbnkKLSAgICAgICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgICAgICBpZiBwYXJhZ3JhcGg6Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5hcHBlbmQoIHBhcmFncmFwaCApCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGggPSBOb25lCi0KLSAgICAgICAgICAgICAgICAgICAgIyBhcHBlbmQgcHJldmlvdXMgImZpZWxkIiB0byBzZWxmLml0ZW1zCi0gICAgICAgICAgICAgICAgICAgICMKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoICggZmllbGQsIGVsZW1lbnRzICkgKQotCi0gICAgICAgICAgICAgICAgICAgICMgc3RhcnQgbmV3IGZpZWxkIGFuZCBlbGVtZW50cyBsaXN0Ci0gICAgICAgICAgICAgICAgICAgICMKLSAgICAgICAgICAgICAgICAgICAgZmllbGQgICAgPSB3b3Jkc1swXQotICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyA9IFtdCi0gICAgICAgICAgICAgICAgICAgIHdvcmRzICAgID0gd29yZHNbMiA6XQotCi0gICAgICAgICAgICAgICAgIyBhcHBlbmQgcmVtYWluaW5nIHdvcmRzIHRvIGN1cnJlbnQgcGFyYWdyYXBoCi0gICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgIGlmIGxlbiggd29yZHMgKSA+IDA6Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBzdHJpbmcuam9pbiggd29yZHMgKQotICAgICAgICAgICAgICAgICAgICBpZiBub3QgcGFyYWdyYXBoOgotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoID0gRG9jUGFyYWdyYXBoKCkKLSAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoLmFkZCggbGluZSApCi0KLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgIyB3ZSBhcmUgaW4gY29kZSBtb2RlLi4uCi0gICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgIGxpbmUgPSBhbGluZQotCi0gICAgICAgICAgICAgICAgIyB0aGUgY29kZSBibG9jayBlbmRzIHdpdGggYSBsaW5lIHRoYXQgaGFzIGEgc2luZ2xlICd9JyBvbgotICAgICAgICAgICAgICAgICMgaXQgdGhhdCBpcyBsb2NhdGVkIGF0IHRoZSBzYW1lIGNvbHVtbiB0aGF0IHRoZSBvcGVuaW5nCi0gICAgICAgICAgICAgICAgIyBhY2NvbGFkZS4uLgotICAgICAgICAgICAgICAgICMKLSAgICAgICAgICAgICAgICBpZiBsaW5lID09ICIgIiAqIGNvZGVfbWFyZ2luICsgJ30nOgotICAgICAgICAgICAgICAgICAgICBpZiBjb2RlOgotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuYXBwZW5kKCBjb2RlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBOb25lCi0KLSAgICAgICAgICAgICAgICAgICAgY29kZV9tb2RlICAgPSAwCi0gICAgICAgICAgICAgICAgICAgIGNvZGVfbWFyZ2luID0gMAotCi0gICAgICAgICAgICAgICAgIyBvdGhlcndpc2UsIGFkZCB0aGUgbGluZSB0byB0aGUgY3VycmVudCBwYXJhZ3JhcGgKLSAgICAgICAgICAgICAgICAjCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNvZGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gRG9jQ29kZSgpCi0gICAgICAgICAgICAgICAgICAgIGNvZGUuYWRkKCBsaW5lICkKLQotICAgICAgICBpZiBwYXJhZ3JhcGg6Ci0gICAgICAgICAgICBlbGVtZW50cy5hcHBlbmQoIHBhcmFncmFwaCApCi0KLSAgICAgICAgaWYgY29kZToKLSAgICAgICAgICAgIGVsZW1lbnRzLmFwcGVuZCggY29kZSApCi0KLSAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoICggZmllbGQsIGVsZW1lbnRzICkgKQotCi0KLSAgICBkZWYgZ2V0X2lkZW50aWZpZXIoIHNlbGYgKToKLSAgICAgICAgaWYgc2VsZi5pdGVtczoKLSAgICAgICAgICAgIGl0ZW0gPSBzZWxmLml0ZW1zWzBdCi0gICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVtWzFdOgotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldF9pZGVudGlmaWVyKCkKLQotICAgICAgICAjIHNob3VsZCBuZXZlciBoYXBwZW4KLSAgICAgICAgIwotICAgICAgICByZXR1cm4gIlVOS05PV05fQ09OVEVOVF9JREVOVElGSUVSISIKLQotCi0gICAgZGVmIGdldF90aXRsZSggc2VsZiApOgotICAgICAgICBpZiBzZWxmLml0ZW1zOgotICAgICAgICAgICAgaXRlbSA9IHNlbGYuaXRlbXNbMF0KLSAgICAgICAgICAgIGZvciBlbGVtZW50IGluIGl0ZW1bMV06Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZHVtcF9zdHJpbmcoKQotCi0gICAgICAgICMgc2hvdWxkIG5ldmVyIGhhcHBlbgotICAgICAgICAjCi0gICAgICAgIHJldHVybiAiVU5LTk9XTl9DT05URU5UX1RJVExFISIKLQotCi0gICAgZGVmIGR1bXAoIHNlbGYgKToKLSAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5pdGVtczoKLSAgICAgICAgICAgIGZpZWxkID0gaXRlbVswXQotICAgICAgICAgICAgaWYgZmllbGQ6Ci0gICAgICAgICAgICAgICAgcHJpbnQgIjxmaWVsZCAiICsgZmllbGQgKyAiPiIKLQotICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlbVsxXToKLSAgICAgICAgICAgICAgICBlbGVtZW50LmR1bXAoKQotCi0gICAgICAgICAgICBpZiBmaWVsZDoKLSAgICAgICAgICAgICAgICBwcmludCAiPC9maWVsZD4iCi0KLQotICAgIGRlZiBkdW1wX2h0bWwoIHNlbGYsIGlkZW50aWZpZXJzID0gTm9uZSApOgotICAgICAgICBuICAgICAgICA9IGxlbiggc2VsZi5pdGVtcyApCi0gICAgICAgIGluX3RhYmxlID0gMAotCi0gICAgICAgIGZvciBpIGluIHJhbmdlKCBuICk6Ci0gICAgICAgICAgICBpdGVtICA9IHNlbGYuaXRlbXNbaV0KLSAgICAgICAgICAgIGZpZWxkID0gaXRlbVswXQotCi0gICAgICAgICAgICBpZiBub3QgZmllbGQ6Ci0gICAgICAgICAgICAgICAgaWYgaW5fdGFibGU6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ICI8L3RkPjwvdHI+PC90YWJsZT4iCi0gICAgICAgICAgICAgICAgICAgIGluX3RhYmxlID0gMAotCi0gICAgICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlbVsxXToKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kdW1wX2h0bWwoIGlkZW50aWZpZXJzICkKLQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBpZiBub3QgaW5fdGFibGU6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ICI8dGFibGUgY2VsbHBhZGRpbmc9ND48dHIgdmFsaWduPXRvcD48dGQ+IgotICAgICAgICAgICAgICAgICAgICBpbl90YWJsZSA9IDEKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBwcmludCAiPC90ZD48L3RyPjx0ciB2YWxpZ249dG9wPjx0ZD4iCi0KLSAgICAgICAgICAgICAgICBwcmludCAiPGI+IiArIGZpZWxkICsgIjwvYj48L3RkPjx0ZD4iCi0KLSAgICAgICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVtWzFdOgotICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmR1bXBfaHRtbCggaWRlbnRpZmllcnMgKQotCi0gICAgICAgIGlmIGluX3RhYmxlOgotICAgICAgICAgICAgcHJpbnQgIjwvdGQ+PC90cj48L3RhYmxlPiIKLQotCi0gICAgZGVmIGR1bXBfaHRtbF9pbl90YWJsZSggc2VsZiwgaWRlbnRpZmllcnMgPSBOb25lICk6Ci0gICAgICAgIG4gICAgICAgID0gbGVuKCBzZWxmLml0ZW1zICkKLSAgICAgICAgaW5fdGFibGUgPSAwCi0KLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UoIG4gKToKLSAgICAgICAgICAgIGl0ZW0gID0gc2VsZi5pdGVtc1tpXQotICAgICAgICAgICAgZmllbGQgPSBpdGVtWzBdCi0KLSAgICAgICAgICAgIGlmIG5vdCBmaWVsZDoKLSAgICAgICAgICAgICAgICBpZiBpdGVtWzFdOgotICAgICAgICAgICAgICAgICAgICBwcmludCAiPHRyPjx0ZCBjb2xzcGFuPTI+IgotICAgICAgICAgICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVtWzFdOgotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kdW1wX2h0bWwoIGlkZW50aWZpZXJzICkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgIjwvdGQ+PC90cj4iCi0KLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQgIjx0cj48dGQ+PGI+IiArIGZpZWxkICsgIjwvYj48L3RkPjx0ZD4iCi0KLSAgICAgICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVtWzFdOgotICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmR1bXBfaHRtbCggaWRlbnRpZmllcnMgKQotCi0gICAgICAgICAgICAgICAgcHJpbnQgIjwvdGQ+PC90cj4iCi0KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBUaGUgRG9jQmxvY2sgY2xhc3MgaXMgdXNlZCB0byBzdG9yZSBhIGdpdmVuIGNvbW1lbnQgYmxvY2suICBJdCBjb250YWlucwotIyBhIGxpc3Qgb2YgbWFya2VycywgYXMgd2VsbCBhcyBhIGxpc3Qgb2YgY29udGVudHMgZm9yIGVhY2ggbWFya2VyLgotIwotIyAgICJzZWxmLml0ZW1zIiBpcyBhIGxpc3Qgb2YgKG1hcmtlciwgY29udGVudHMpIGVsZW1lbnRzLCB3aGVyZSAnbWFya2VyJyBpcwotIyAgIGEgbG93ZXJjYXNlIG1hcmtlciBzdHJpbmcsIGFuZCAnY29udGVudHMnIGlzIGEgRG9jQ29udGVudCBvYmplY3QuCi0jCi0jICAgInNlbGYuc291cmNlIiBpcyBzaW1wbHkgYSBsaXN0IG9mIHRleHQgbGluZXMgdGFrZW4gZnJvbSB0aGUgdW5jb21tZW50ZWQKLSMgICBzb3VyY2UgaXRzZWxmLgotIwotIyAgIEZpbmFsbHksICJzZWxmLm5hbWUiIGlzIGEgc2ltcGxlIGlkZW50aWZpZXIgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeQotIyAgIHRoZSBibG9jay4gSXQgaXMgdGFrZW4gZnJvbSB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgZmlyc3QgcGFyYWdyYXBoIG9mIHRoZQotIyAgIGZpcnN0IG1hcmtlciBvZiBhIGdpdmVuIGJsb2NrLCBpLmU6Ci0jCi0jICAgICAgPFR5cGU+IEdvbwotIyAgICAgIDxEZXNjcmlwdGlvbj4gQmxhIGJsYSBibGEKLSMKLSMgICB3aWxsIGhhdmUgYSBuYW1lIG9mICJHb28iCi0jCi1jbGFzcyBEb2NCbG9jazoKLQotICAgIGRlZiBfX2luaXRfXyggc2VsZiwgYmxvY2tfbGluZV9saXN0ID0gW10sIHNvdXJjZV9saW5lX2xpc3QgPSBbXSApOgotICAgICAgICBzZWxmLml0ZW1zICAgID0gW10gICAgICAgICAgICAgICAjIGN1cnJlbnQgKCBtYXJrZXIsIGNvbnRlbnRzICkgbGlzdAotICAgICAgICBzZWxmLnNlY3Rpb24gID0gTm9uZSAgICAgICAgICAgICAjIHNlY3Rpb24gdGhpcyBibG9jayBiZWxvbmdzIHRvCi0gICAgICAgIHNlbGYuZmlsZW5hbWUgPSAidW5rbm93biIgICAgICAgICMgZmlsZW5hbWUgZGVmaW5pbmcgdGhpcyBibG9jawotICAgICAgICBzZWxmLmxpbmVubyAgID0gMCAgICAgICAgICAgICAgICAjIGxpbmUgbnVtYmVyIGluIGZpbGVuYW1lCi0KLSAgICAgICAgbWFya2VyICAgICAgICA9IE5vbmUgICAgICAgICAgICAgIyBjdXJyZW50IG1hcmtlcgotICAgICAgICBjb250ZW50ICAgICAgID0gW10gICAgICAgICAgICAgICAjIGN1cnJlbnQgY29udGVudCBsaW5lcyBsaXN0Ci0gICAgICAgIGFscGhhbnVtICAgICAgPSBzdHJpbmcubGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAiXyIKLSAgICAgICAgc2VsZi5uYW1lICAgICA9IE5vbmUKLQotICAgICAgICBmb3IgbGluZSBpbiBibG9ja19saW5lX2xpc3Q6Ci0gICAgICAgICAgICBsaW5lMiAgPSBzdHJpbmcubHN0cmlwKCBsaW5lICkKLSAgICAgICAgICAgIGwgICAgICA9IGxlbiggbGluZTIgKQotICAgICAgICAgICAgbWFyZ2luID0gbGVuKCBsaW5lICkgLSBsCi0KLSAgICAgICAgICAgIGlmIGwgPiAzOgotICAgICAgICAgICAgICAgIGVuZGVyID0gTm9uZQotICAgICAgICAgICAgICAgIGlmIGxpbmUyWzBdID09ICc8JzoKLSAgICAgICAgICAgICAgICAgICAgZW5kZXIgPSAnPicKLSAgICAgICAgICAgICAgICBlbGlmIGxpbmUyWzBdID09ICdAJzoKLSAgICAgICAgICAgICAgICAgICAgZW5kZXIgPSAnOicKLQotICAgICAgICAgICAgICAgIGlmIGVuZGVyOgotICAgICAgICAgICAgICAgICAgICBpID0gMQotICAgICAgICAgICAgICAgICAgICB3aGlsZSBpIDwgbCBhbmQgbGluZTJbaV0gaW4gYWxwaGFudW06Ci0gICAgICAgICAgICAgICAgICAgICAgICBpID0gaSArIDEKLSAgICAgICAgICAgICAgICAgICAgaWYgaSA8IGwgYW5kIGxpbmUyW2ldID09IGVuZGVyOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWFya2VyIGFuZCBjb250ZW50OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKCBtYXJrZXIsIGNvbnRlbnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyICA9IGxpbmUyWzEgOiBpXQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IFtdCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lMiAgID0gc3RyaW5nLmxzdHJpcCggbGluZTJbaSsxIDpdICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGwgICAgICAgPSBsZW4oIGxpbmUyICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgICAgPSAiICIgKiBtYXJnaW4gKyBsaW5lMgotCi0gICAgICAgICAgICBjb250ZW50LmFwcGVuZCggbGluZSApCi0KLSAgICAgICAgaWYgbWFya2VyIGFuZCBjb250ZW50OgotICAgICAgICAgICAgc2VsZi5hZGQoIG1hcmtlciwgY29udGVudCApCi0KLSAgICAgICAgc2VsZi5zb3VyY2UgPSBbXQotICAgICAgICBpZiBzZWxmLml0ZW1zOgotICAgICAgICAgICAgc2VsZi5zb3VyY2UgPSBzb3VyY2VfbGluZV9saXN0Ci0KLSAgICAgICAgIyBub3cgcmV0cmlldmUgYmxvY2sgbmFtZSB3aGVuIHBvc3NpYmxlCi0gICAgICAgICMKLSAgICAgICAgaWYgc2VsZi5pdGVtczoKLSAgICAgICAgICAgIGZpcnN0ICAgICA9IHNlbGYuaXRlbXNbMF0KLSAgICAgICAgICAgIHNlbGYubmFtZSA9IGZpcnN0WzFdLmdldF9pZGVudGlmaWVyKCkKLQotCi0gICAgIyBUaGlzIGZ1bmN0aW9uIGFkZHMgYSBuZXcgZWxlbWVudCB0byAnc2VsZi5pdGVtcycuCi0gICAgIwotICAgICMgICAnbWFya2VyJyBpcyBhIG1hcmtlciBzdHJpbmcsIG9yIE5vbmUuCi0gICAgIyAgICdsaW5lcycgIGlzIGEgbGlzdCBvZiB0ZXh0IGxpbmVzIHVzZWQgdG8gY29tcHV0ZSBhIGxpc3Qgb2YKLSAgICAjICAgICAgICAgICAgRG9jQ29udGVudCBvYmplY3RzLgotICAgICMKLSAgICBkZWYgYWRkKCBzZWxmLCBtYXJrZXIsIGxpbmVzICk6Ci0gICAgICAgICMgcmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBlbXB0eSBsaW5lcyBmcm9tIHRoZSBjb250ZW50IGxpc3QKLSAgICAgICAgIwotICAgICAgICBsID0gbGVuKCBsaW5lcyApCi0gICAgICAgIGlmIGwgPiAwOgotICAgICAgICAgICAgaSA9IDAKLSAgICAgICAgICAgIHdoaWxlIGwgPiAwIGFuZCBzdHJpbmcuc3RyaXAoIGxpbmVzW2wgLSAxXSApID09ICIiOgotICAgICAgICAgICAgICAgIGwgPSBsIC0gMQotICAgICAgICAgICAgd2hpbGUgaSA8IGwgYW5kIHN0cmluZy5zdHJpcCggbGluZXNbaV0gKSA9PSAiIjoKLSAgICAgICAgICAgICAgICBpID0gaSArIDEKLSAgICAgICAgICAgIGxpbmVzID0gbGluZXNbaSA6IGxdCi0gICAgICAgICAgICBsICAgICA9IGxlbiggbGluZXMgKQotCi0gICAgICAgICMgYWRkIGEgbmV3IG1hcmtlciBvbmx5IGlmIGl0cyBtYXJrZXIgYW5kIGl0cyBjb250ZW50IGxpc3QKLSAgICAgICAgIyBhcmUgbm90IGVtcHR5Ci0gICAgICAgICMKLSAgICAgICAgaWYgbCA+IDAgYW5kIG1hcmtlcjoKLSAgICAgICAgICAgIGNvbnRlbnQgPSBEb2NDb250ZW50KCBsaW5lcyApCi0gICAgICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZCggKCBzdHJpbmcubG93ZXIoIG1hcmtlciApLCBjb250ZW50ICkgKQotCi0KLSAgICBkZWYgZmluZF9jb250ZW50KCBzZWxmLCBtYXJrZXIgKToKLSAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5pdGVtczoKLSAgICAgICAgICAgIGlmICggaXRlbVswXSA9PSBtYXJrZXIgKToKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVsxXQotICAgICAgICByZXR1cm4gTm9uZQotCi0KLSAgICBkZWYgaHRtbF9hZGRyZXNzKCBzZWxmICk6Ci0gICAgICAgIHNlY3Rpb24gPSBzZWxmLnNlY3Rpb24KLSAgICAgICAgaWYgc2VjdGlvbiBhbmQgc2VjdGlvbi5maWxlbmFtZToKLSAgICAgICAgICAgIHJldHVybiBzZWN0aW9uLmZpbGVuYW1lICsgJyMnICsgc2VsZi5uYW1lCi0KLSAgICAgICAgcmV0dXJuICIiICAjIHRoaXMgYmxvY2sgaXMgbm90IGluIGEgc2VjdGlvbj8KLQotCi0gICAgZGVmIGxvY2F0aW9uKCBzZWxmICk6Ci0gICAgICAgIHJldHVybiBzZWxmLmZpbGVuYW1lICsgJzonICsgc3RyKCBzZWxmLmxpbmVubyApCi0KLQotICAgIGRlZiBwcmludF93YXJuaW5nKCBzZWxmLCBtZXNzYWdlICk6Ci0gICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICJXQVJOSU5HOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvY2F0aW9uKCkgKyAiOiAiICsgbWVzc2FnZSArICdcbicgKQotCi0KLSAgICBkZWYgcHJpbnRfZXJyb3IoIHNlbGYsIG1lc3NhZ2UgKToKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIkVSUk9SOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvY2F0aW9uKCkgKyAiOiAiICsgbWVzc2FnZSArICdcbicgKQotICAgICAgICBzeXMuZXhpdCgpCi0KLQotICAgIGRlZiBkdW1wKCBzZWxmICk6Ci0gICAgICAgIGZvciBpIGluIHJhbmdlKCBsZW4oIHNlbGYuaXRlbXMgKSApOgotICAgICAgICAgICAgcHJpbnQgIlsiICsgc2VsZi5pdGVtc1tpXVswXSArICJdIgotICAgICAgICAgICAgY29udGVudCA9IHNlbGYuaXRlbXNbaV1bMV0KLSAgICAgICAgICAgIGNvbnRlbnQuZHVtcCgpCi0KLQotICAgIGRlZiBkdW1wX2h0bWwoIHNlbGYsIGlkZW50aWZpZXJzID0gTm9uZSApOgotICAgICAgICB0eXBlcyAgICAgID0gWyd0eXBlJywgJ3N0cnVjdCcsICdmdW5jdHlwZScsICdmdW5jdGlvbicsCi0gICAgICAgICAgICAgICAgICAgICAgJ2NvbnN0YW50JywgJ2VudW0nLCAnbWFjcm8nLCAnc3RydWN0dXJlJywgJ2Fsc28nXQotCi0gICAgICAgIHBhcmFtZXRlcnMgPSBbJ2lucHV0JywgJ2lub3V0JywgJ291dHB1dCcsICdyZXR1cm4nXQotCi0gICAgICAgIGlmIG5vdCBzZWxmLml0ZW1zOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgIyBzdGFydCBvZiBhIGJsb2NrCi0gICAgICAgICMKLSAgICAgICAgcHJpbnQgYmxvY2tfaGVhZGVyCi0KLSAgICAgICAgIyBwbGFjZSBodG1sIGFuY2hvciBpZiBuZWVkZWQKLSAgICAgICAgIwotICAgICAgICBpZiBzZWxmLm5hbWU6Ci0gICAgICAgICAgICBwcmludCAnPGEgbmFtZT0iJyArIHNlbGYubmFtZSArICciPicKLSAgICAgICAgICAgIHByaW50ICI8aDQ+IiArIHNlbGYubmFtZSArICI8L2g0PiIKLSAgICAgICAgICAgIHByaW50ICI8L2E+IgotCi0gICAgICAgICMgcHJpbnQgc291cmNlIGNvZGUKLSAgICAgICAgIwotICAgICAgICBpZiBub3Qgc2VsZi5zb3VyY2U6Ci0gICAgICAgICAgICBwcmludCBibG9ja19mb290ZXIKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgIGxpbmVzID0gc2VsZi5zb3VyY2UKLSAgICAgICAgbCAgICAgPSBsZW4oIGxpbmVzICkgLSAxCi0gICAgICAgIHdoaWxlIGwgPj0gMCBhbmQgc3RyaW5nLnN0cmlwKCBsaW5lc1tsXSApID09ICIiOgotICAgICAgICAgICAgbCA9IGwgLSAxCi0gICAgICAgIHByaW50IHNvdXJjZV9oZWFkZXIKLSAgICAgICAgcHJpbnQgIiIKLSAgICAgICAgZm9yIGxpbmUgaW4gbGluZXNbMCA6IGwrMV06Ci0gICAgICAgICAgICBwcmludCBodG1sX3F1b3RlKGxpbmUpCi0gICAgICAgIHByaW50IHNvdXJjZV9mb290ZXIKLQotICAgICAgICBpbl90YWJsZSA9IDAKLQotICAgICAgICAjIGR1bXAgZWFjaCAobWFya2VyLGNvbnRlbnQpIGVsZW1lbnQKLSAgICAgICAgIwotICAgICAgICBmb3IgZWxlbWVudCBpbiBzZWxmLml0ZW1zOgotICAgICAgICAgICAgbWFya2VyICA9IGVsZW1lbnRbMF0KLSAgICAgICAgICAgIGNvbnRlbnQgPSBlbGVtZW50WzFdCi0KLSAgICAgICAgICAgIGlmIG1hcmtlciA9PSAiZGVzY3JpcHRpb24iOgotICAgICAgICAgICAgICAgIHByaW50IGRlc2NyaXB0aW9uX2hlYWRlcgotICAgICAgICAgICAgICAgIGNvbnRlbnQuZHVtcF9odG1sKCBpZGVudGlmaWVycyApCi0gICAgICAgICAgICAgICAgcHJpbnQgZGVzY3JpcHRpb25fZm9vdGVyCi0KLSAgICAgICAgICAgIGVsaWYgbm90ICggbWFya2VyIGluIHR5cGVzICk6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggbWFya2VyX2hlYWRlciApCi0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggbWFya2VyICkKLSAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCBtYXJrZXJfaW50ZXIgKyAnXG4nICkKLSAgICAgICAgICAgICAgICBjb250ZW50LmR1bXBfaHRtbCggaWRlbnRpZmllcnMgKQotICAgICAgICAgICAgICAgIHByaW50IG1hcmtlcl9mb290ZXIKLQotICAgICAgICBwcmludCAiIgotCi0gICAgICAgIHByaW50IGJsb2NrX2Zvb3RlcgotCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgVGhlIERvY1NlY3Rpb24gY2xhc3MgaXMgdXNlZCB0byBzdG9yZSBhIGdpdmVuIGRvY3VtZW50YXRpb24gc2VjdGlvbi4KLSMKLSMgRWFjaCBzZWN0aW9uIGlzIG1hZGUgb2YgYW4gaWRlbnRpZmllciwgYW4gYWJzdHJhY3QgYW5kIGEgZGVzY3JpcHRpb24uCi0jCi0jIEZvciBleGFtcGxlLCBsb29rIGF0OgotIwotIyAgIDxTZWN0aW9uPiBCYXNpY19EYXRhX1R5cGVzCi0jCi0jICAgPFRpdGxlPiBGcmVlVHlwZSAyIEJhc2ljIERhdGEgVHlwZXMKLSMKLSMgICA8QWJzdHJhY3Q+Ci0jICAgICAgRGVmaW5pdGlvbnMgb2YgYmFzaWMgRnJlZVR5cGUgZGF0YSB0eXBlcwotIwotIyAgIDxEZXNjcmlwdGlvbj4KLSMgICAgICBGcmVlVHlwZSBkZWZpbmVzIHNldmVyYWwgYmFzaWMgZGF0YSB0eXBlcyBmb3IgYWxsIGl0cwotIyAgICAgIG9wZXJhdGlvbnMuLi4KLSMKLWNsYXNzIERvY1NlY3Rpb246Ci0KLSAgICBkZWYgX19pbml0X18oIHNlbGYsIGJsb2NrICk6Ci0gICAgICAgIHNlbGYuYmxvY2sgICAgICAgPSBibG9jawotICAgICAgICBzZWxmLm5hbWUgICAgICAgID0gc3RyaW5nLmxvd2VyKCBibG9jay5uYW1lICkKLSAgICAgICAgc2VsZi5hYnN0cmFjdCAgICA9IGJsb2NrLmZpbmRfY29udGVudCggImFic3RyYWN0IiApCi0gICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSBibG9jay5maW5kX2NvbnRlbnQoICJkZXNjcmlwdGlvbiIgKQotICAgICAgICBzZWxmLmVsZW1lbnRzICAgID0ge30KLSAgICAgICAgc2VsZi5saXN0ICAgICAgICA9IFtdCi0gICAgICAgIHNlbGYuZmlsZW5hbWUgICAgPSBzZWxmLm5hbWUgKyAiLmh0bWwiCi0gICAgICAgIHNlbGYuY2hhcHRlciAgICAgPSBOb25lCi0KLSAgICAgICAgIyBzeXMuc3RkZXJyLndyaXRlKCAibmV3IHNlY3Rpb24gJyIgKyBzZWxmLm5hbWUgKyAiJyIgKQotCi0KLSAgICBkZWYgYWRkX2VsZW1lbnQoIHNlbGYsIGJsb2NrICk6Ci0gICAgICAgICMgY2hlY2sgdGhhdCB3ZSBkb24ndCBoYXZlIGEgZHVwbGljYXRlIGVsZW1lbnQgaW4gdGhpcwotICAgICAgICAjIHNlY3Rpb24KLSAgICAgICAgIwotICAgICAgICBpZiBzZWxmLmVsZW1lbnRzLmhhc19rZXkoIGJsb2NrLm5hbWUgKToKLSAgICAgICAgICAgIGJsb2NrLnByaW50X2Vycm9yKCAiZHVwbGljYXRlIGVsZW1lbnQgZGVmaW5pdGlvbiBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiciICsgYmxvY2submFtZSArICInICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBzZWN0aW9uICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIiArIHNlbGYubmFtZSArICInXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJldmlvdXMgZGVmaW5pdGlvbiBpbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyIgKyBzZWxmLmVsZW1lbnRzW2Jsb2NrLm5hbWVdLmxvY2F0aW9uKCkgKyAiJyIgKQotCi0gICAgICAgIHNlbGYuZWxlbWVudHNbYmxvY2submFtZV0gPSBibG9jawotICAgICAgICBzZWxmLmxpc3QuYXBwZW5kKCBibG9jayApCi0KLQotICAgIGRlZiBwcmludF93YXJuaW5nKCBzZWxmLCBtZXNzYWdlICk6Ci0gICAgICAgIHNlbGYuYmxvY2sucHJpbnRfd2FybmluZyggbWVzc2FnZSApCi0KLQotICAgIGRlZiBwcmludF9lcnJvciggc2VsZiwgbWVzc2FnZSApOgotICAgICAgICBzZWxmLmJsb2NrLnByaW50X2Vycm9yKCBtZXNzYWdlICkKLQotCi0gICAgZGVmIGR1bXBfaHRtbCggc2VsZiwgaWRlbnRpZmllcnMgPSBOb25lICk6Ci0gICAgICAgICIiIm1ha2UgYW4gSFRNTCBwYWdlIGZyb20gYSBnaXZlbiBEb2NTZWN0aW9uIiIiCi0KLSAgICAgICAgIyBwcmludCBIVE1MIGhlYWRlcgotICAgICAgICAjCi0gICAgICAgIHByaW50IGh0bWxfaGVhZGVyCi0KLSAgICAgICAgIyBwcmludCB0aXRsZQotICAgICAgICAjCi0gICAgICAgIHByaW50IHNlY3Rpb25fdGl0bGVfaGVhZGVyCi0gICAgICAgIHByaW50IHNlbGYudGl0bGUKLSAgICAgICAgcHJpbnQgc2VjdGlvbl90aXRsZV9mb290ZXIKLQotICAgICAgICAjIHByaW50IGRlc2NyaXB0aW9uCi0gICAgICAgICMKLSAgICAgICAgcHJpbnQgYmxvY2tfaGVhZGVyCi0gICAgICAgIHNlbGYuZGVzY3JpcHRpb24uZHVtcF9odG1sKCBpZGVudGlmaWVycyApCi0gICAgICAgIHByaW50IGJsb2NrX2Zvb3RlcgotCi0gICAgICAgICMgcHJpbnQgZWxlbWVudHMKLSAgICAgICAgIwotICAgICAgICBmb3IgZWxlbWVudCBpbiBzZWxmLmxpc3Q6Ci0gICAgICAgICAgICBlbGVtZW50LmR1bXBfaHRtbCggaWRlbnRpZmllcnMgKQotCi0gICAgICAgIHByaW50IGh0bWxfZm9vdGVyCi0KLQotY2xhc3MgRG9jU2VjdGlvbkxpc3Q6Ci0KLSAgICBkZWYgX19pbml0X18oIHNlbGYgKToKLSAgICAgICAgc2VsZi5zZWN0aW9ucyAgICAgICAgPSB7fSAgICAjIG1hcCBzZWN0aW9uIG5hbWVzIHRvIHNlY3Rpb24gb2JqZWN0cwotICAgICAgICBzZWxmLmxpc3QgICAgICAgICAgICA9IFtdICAgICMgbGlzdCBvZiBzZWN0aW9ucyAoaW4gY3JlYXRpb24gb3JkZXIpCi0gICAgICAgIHNlbGYuY3VycmVudF9zZWN0aW9uID0gTm9uZSAgIyBjdXJyZW50IHNlY3Rpb24KLSAgICAgICAgc2VsZi5pZGVudGlmaWVycyAgICAgPSB7fSAgICAjIG1hcCBpZGVudGlmaWVycyB0byBibG9ja3MKLQotCi0gICAgZGVmIGFwcGVuZF9zZWN0aW9uKCBzZWxmLCBibG9jayApOgotICAgICAgICBuYW1lICAgICA9IHN0cmluZy5sb3dlciggYmxvY2submFtZSApCi0gICAgICAgIGFic3RyYWN0ID0gYmxvY2suZmluZF9jb250ZW50KCAiYWJzdHJhY3QiICkKLQotICAgICAgICBpZiBzZWxmLnNlY3Rpb25zLmhhc19rZXkoIG5hbWUgKToKLSAgICAgICAgICAgICMgVGhlcmUgaXMgYWxyZWFkeSBhIHNlY3Rpb24gd2l0aCB0aGlzIG5hbWUgaW4gb3VyIGxpc3QuICBXZQotICAgICAgICAgICAgIyB3aWxsIHRyeSB0byBjb21wbGV0ZSBpdC4KLSAgICAgICAgICAgICMKLSAgICAgICAgICAgIHNlY3Rpb24gPSBzZWxmLnNlY3Rpb25zW25hbWVdCi0gICAgICAgICAgICBpZiBzZWN0aW9uLmFic3RyYWN0OgotICAgICAgICAgICAgICAgICMgVGhpcyBzZWN0aW9uIGFscmVhZHkgaGFzIGFuIGFic3RyYWN0IGRlZmluZWQ7IHNpbXBseSBjaGVjawotICAgICAgICAgICAgICAgICMgdGhhdCB0aGUgbmV3IHNlY3Rpb24gZG9lc24ndCBwcm92aWRlIGEgbmV3IG9uZS4KLSAgICAgICAgICAgICAgICAjCi0gICAgICAgICAgICAgICAgaWYgYWJzdHJhY3Q6Ci0gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYmxvY2sucHJpbnRfZXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICAgImR1cGxpY2F0ZSBzZWN0aW9uIGRlZmluaXRpb24gZm9yICIgKwotICAgICAgICAgICAgICAgICAgICAgICInIiArIG5hbWUgKyAiJ1xuIiArCi0gICAgICAgICAgICAgICAgICAgICAgInByZXZpb3VzIGRlZmluaXRpb24gaW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgIiciICsgc2VjdGlvbi5ibG9jay5sb2NhdGlvbigpICsgIidcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICJzZWNvbmQgZGVmaW5pdGlvbiBpbiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAiJyIgKyBibG9jay5sb2NhdGlvbigpICsgIiciICkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgIyBUaGUgb2xkIHNlY3Rpb24gZGlkbid0IGNvbnRhaW4gYW4gYWJzdHJhY3Q7IHdlIGFyZSBub3cKLSAgICAgICAgICAgICAgICAjIGdvaW5nIHRvIHJlcGxhY2UgaXQuCi0gICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgIHNlY3Rpb24uYWJzdHJhY3QgICAgPSBhYnN0cmFjdAotICAgICAgICAgICAgICAgIHNlY3Rpb24uZGVzY3JpcHRpb24gPSBibG9jay5maW5kX2NvbnRlbnQoICJkZXNjcmlwdGlvbiIgKQotICAgICAgICAgICAgICAgIHNlY3Rpb24uYmxvY2sgICAgICAgPSBibG9jawotCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIGEgbmV3IHNlY3Rpb24KLSAgICAgICAgICAgICMKLSAgICAgICAgICAgIHNlY3Rpb24gPSBEb2NTZWN0aW9uKCBibG9jayApCi0gICAgICAgICAgICBzZWxmLnNlY3Rpb25zW25hbWVdID0gc2VjdGlvbgotICAgICAgICAgICAgc2VsZi5saXN0LmFwcGVuZCggc2VjdGlvbiApCi0KLSAgICAgICAgc2VsZi5jdXJyZW50X3NlY3Rpb24gPSBzZWN0aW9uCi0KLQotICAgIGRlZiBhcHBlbmRfYmxvY2soIHNlbGYsIGJsb2NrICk6Ci0gICAgICAgIGlmIGJsb2NrLm5hbWU6Ci0gICAgICAgICAgICBzZWN0aW9uID0gYmxvY2suZmluZF9jb250ZW50KCAic2VjdGlvbiIgKQotICAgICAgICAgICAgaWYgc2VjdGlvbjoKLSAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZF9zZWN0aW9uKCBibG9jayApCi0KLSAgICAgICAgICAgIGVsaWYgc2VsZi5jdXJyZW50X3NlY3Rpb246Ci0gICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50X3NlY3Rpb24uYWRkX2VsZW1lbnQoIGJsb2NrICkKLSAgICAgICAgICAgICAgICBibG9jay5zZWN0aW9uICAgICAgICAgICAgICAgID0gc2VsZi5jdXJyZW50X3NlY3Rpb24KLSAgICAgICAgICAgICAgICBzZWxmLmlkZW50aWZpZXJzW2Jsb2NrLm5hbWVdID0gYmxvY2sKLQotCi0gICAgZGVmIHByZXBhcmVfZmlsZXMoIHNlbGYsIGZpbGVfcHJlZml4ID0gTm9uZSApOgotICAgICAgICAjIHByZXBhcmUgdGhlIHNlY3Rpb24gbGlzdCwgYnkgY29tcHV0aW5nIHNlY3Rpb24gZmlsZW5hbWVzIGFuZCB0aGUKLSAgICAgICAgIyBpbmRleAotICAgICAgICAjCi0gICAgICAgIGlmIGZpbGVfcHJlZml4OgotICAgICAgICAgICAgcHJlZml4ID0gZmlsZV9wcmVmaXggKyAiLSIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByZWZpeCA9ICIiCi0KLSAgICAgICAgIyBjb21wdXRlIHNlY3Rpb24gbmFtZXMKLSAgICAgICAgIwotICAgICAgICBmb3Igc2VjdGlvbiBpbiBzZWxmLnNlY3Rpb25zLnZhbHVlcygpOgotICAgICAgICAgICAgdGl0bGVfY29udGVudCAgICAgPSBzZWN0aW9uLmJsb2NrLmZpbmRfY29udGVudCggInRpdGxlIiApCi0gICAgICAgICAgICBpZiB0aXRsZV9jb250ZW50OgotICAgICAgICAgICAgICAgIHNlY3Rpb24udGl0bGUgPSB0aXRsZV9jb250ZW50LmdldF90aXRsZSgpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlY3Rpb24udGl0bGUgPSAiVU5LTk9XTl9TRUNUSU9OX1RJVExFISIKLQotCi0gICAgICAgICMgc29ydCBzZWN0aW9uIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUgPG9yZGVyPiBtYXJrZXIgaWYgYXZhaWxhYmxlCi0gICAgICAgICMKLSAgICAgICAgZm9yIHNlY3Rpb24gaW4gc2VsZi5zZWN0aW9ucy52YWx1ZXMoKToKLSAgICAgICAgICAgIG9yZGVyID0gc2VjdGlvbi5ibG9jay5maW5kX2NvbnRlbnQoICJvcmRlciIgKQotICAgICAgICAgICAgaWYgb3JkZXI6Ci0gICAgICAgICAgICAgICAgIyBzeXMuc3RkZXJyLndyaXRlKCAiPG9yZGVyPiBmb3VuZCBhdCAiCi0gICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICArIHNlY3Rpb24uYmxvY2subG9jYXRpb24oKSArICdcbicgKQotICAgICAgICAgICAgICAgIG9yZGVyX2xpc3QgPSBbXQotICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIG9yZGVyLml0ZW1zOgotICAgICAgICAgICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVtWzFdOgotICAgICAgICAgICAgICAgICAgICAgICAgd29yZHMgPSBOb25lCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZHMgPSBlbGVtZW50LmdldF93b3JkcygpCi0gICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5ibG9jay5wcmludF93YXJuaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgY29udGVudCBpbiA8b3JkZXI+IG1hcmtlclxuIiApCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiB3b3JkczoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igd29yZCBpbiB3b3JkczoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBzZWxmLmlkZW50aWZpZXJzLmdldCggd29yZCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJsb2NrOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYmxvY2suc2VjdGlvbiA9PSBzZWN0aW9uOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyX2xpc3QuYXBwZW5kKCBibG9jayApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYmxvY2sucHJpbnRfd2FybmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHJlZmVyZW5jZSB0byAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIiArIHdvcmQgKyAiJyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZpbmVkIGluIG90aGVyIHNlY3Rpb24iICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYmxvY2sucHJpbnRfd2FybmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcmVmZXJlbmNlIHRvICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyIgKyB3b3JkICsgIiciICkKLQotICAgICAgICAgICAgICAgICMgbm93IHNvcnQgdGhlIGxpc3Qgb2YgYmxvY2tzIGFjY29yZGluZyB0byB0aGUgb3JkZXIgbGlzdAotICAgICAgICAgICAgICAgICMKLSAgICAgICAgICAgICAgICBuZXdfbGlzdCA9IG9yZGVyX2xpc3RbOl0KLSAgICAgICAgICAgICAgICBmb3IgYmxvY2sgaW4gc2VjdGlvbi5saXN0OgotICAgICAgICAgICAgICAgICAgICBpZiBub3QgYmxvY2sgaW4gb3JkZXJfbGlzdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld19saXN0LmFwcGVuZCggYmxvY2sgKQotCi0gICAgICAgICAgICAgICAgc2VjdGlvbi5saXN0ID0gbmV3X2xpc3QKLQotICAgICAgICAjIGNvbXB1dGUgc2VjdGlvbiBmaWxlbmFtZXMKLSAgICAgICAgIwotICAgICAgICBmb3Igc2VjdGlvbiBpbiBzZWxmLnNlY3Rpb25zLnZhbHVlcygpOgotICAgICAgICAgICAgc2VjdGlvbi5maWxlbmFtZSA9IHByZWZpeCArIHNlY3Rpb24ubmFtZSArICIuaHRtbCIKLQotICAgICAgICBzZWxmLnRvY19maWxlbmFtZSAgID0gcHJlZml4ICsgInRvYy5odG1sIgotICAgICAgICBzZWxmLmluZGV4X2ZpbGVuYW1lID0gcHJlZml4ICsgImluZGV4Lmh0bWwiCi0KLSAgICAgICAgIyBjb21wdXRlIHRoZSBzb3J0ZWQgbGlzdCBvZiBpZGVudGlmaWVycyBmb3IgdGhlIGluZGV4Ci0gICAgICAgICMKLSAgICAgICAgc2VsZi5pbmRleCA9IHNlbGYuaWRlbnRpZmllcnMua2V5cygpCi0gICAgICAgIHNlbGYuaW5kZXguc29ydCggaW5kZXhfc29ydCApCi0KLQotICAgIGRlZiBkdW1wX2h0bWxfc2VjdGlvbnMoIHNlbGYgKToKLSAgICAgICAgZm9yIHNlY3Rpb24gaW4gc2VsZi5zZWN0aW9ucy52YWx1ZXMoKToKLSAgICAgICAgICAgIGlmIHNlY3Rpb24uZmlsZW5hbWU6Ci0gICAgICAgICAgICAgICAgb3V0cHV0ID0gb3Blbl9vdXRwdXQoIHNlY3Rpb24uZmlsZW5hbWUgKQotCi0gICAgICAgICAgICAgICAgc2VjdGlvbi5kdW1wX2h0bWwoIHNlbGYuaWRlbnRpZmllcnMgKQotCi0gICAgICAgICAgICAgICAgY2xvc2Vfb3V0cHV0KCBvdXRwdXQgKQotCi0KLSAgICBkZWYgZHVtcF9odG1sX2luZGV4KCBzZWxmICk6Ci0gICAgICAgIG91dHB1dCA9IG9wZW5fb3V0cHV0KCBzZWxmLmluZGV4X2ZpbGVuYW1lICkKLQotICAgICAgICBudW1fY29sdW1ucyA9IDMKLSAgICAgICAgdG90YWwgICAgICAgPSBsZW4oIHNlbGYuaW5kZXggKQotICAgICAgICBsaW5lICAgICAgICA9IDAKLQotICAgICAgICBwcmludCBodG1sX2hlYWRlcgotICAgICAgICBwcmludCAiPGNlbnRlcj48aDE+R2VuZXJhbCBJbmRleDwvaDE+PC9jZW50ZXI+IgotICAgICAgICBwcmludCAiPGNlbnRlcj48dGFibGUgY2VsbHBhZGRpbmc9NT48dHIgdmFsaWduPXRvcD48dGQ+IgotCi0gICAgICAgIGZvciBpZGVudCBpbiBzZWxmLmluZGV4OgotICAgICAgICAgICAgYmxvY2sgPSBzZWxmLmlkZW50aWZpZXJzW2lkZW50XQotICAgICAgICAgICAgaWYgYmxvY2s6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggJzxhIGhyZWY9IicgKyBibG9jay5odG1sX2FkZHJlc3MoKSArICciPicgKQotICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIGJsb2NrLm5hbWUgKQotICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoICc8L2E+PGJyPicgKyAnXG4nICkKLQotICAgICAgICAgICAgICAgIGlmIGxpbmUgKiBudW1fY29sdW1ucyA+PSB0b3RhbDoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgIjwvdGQ+PHRkPiIKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IDAKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZSArIDEKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggImlkZW50aWZpZXIgJyIgKyBpZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIicgaGFzIG5vIGRlZmluaXRpb24iICsgJ1xuJyApCi0KLSAgICAgICAgcHJpbnQgIjwvdHI+PC90YWJsZT48L2NlbnRlcj4iCi0gICAgICAgIHByaW50IGh0bWxfZm9vdGVyCi0KLSAgICAgICAgY2xvc2Vfb3V0cHV0KCBvdXRwdXQgKQotCi0KLQotIyBGaWx0ZXIgYSBnaXZlbiBsaXN0IG9mIERvY0Jsb2Nrcy4gIFJldHVybnMgYSBuZXcgbGlzdCBvZiBEb2NCbG9jayBvYmplY3RzCi0jIHRoYXQgb25seSBjb250YWlucyBlbGVtZW50IHdob3NlICJ0eXBlIiAoaS5lLiBmaXJzdCBtYXJrZXIpIGlzIGluIHRoZQotIyAidHlwZXMiIHBhcmFtZXRlci4KLSMKLWNsYXNzIERvY0NoYXB0ZXI6Ci0KLSAgICBkZWYgX19pbml0X18oIHNlbGYsIGJsb2NrICk6Ci0gICAgICAgIHNlbGYuc2VjdGlvbnNfbmFtZXMgPSBbXSAgICAjIG9yZGVyZWQgbGlzdCBvZiBzZWN0aW9uIG5hbWVzCi0gICAgICAgIHNlbGYuc2VjdGlvbnMgICAgICAgPSBbXSAgICAjIG9yZGVyZWQgbGlzdCBvZiBEb2NTZWN0aW9uIG9iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZm9yIHRoaXMgY2hhcHRlcgotICAgICAgICBzZWxmLmJsb2NrICAgICAgICAgID0gYmxvY2sKLQotICAgICAgICAjIGxvb2sgZm9yIGNoYXB0ZXIgdGl0bGUKLSAgICAgICAgY29udGVudCA9IGJsb2NrLmZpbmRfY29udGVudCggInRpdGxlIiApCi0gICAgICAgIGlmIGNvbnRlbnQ6Ci0gICAgICAgICAgICBzZWxmLnRpdGxlID0gY29udGVudC5nZXRfdGl0bGUoKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi50aXRsZSA9ICJVTktOT1dOIENIQVBURVIgVElUTEUiCi0KLSAgICAgICAgIyBsb29rIGZvciBzZWN0aW9uIGxpc3QKLSAgICAgICAgY29udGVudCA9IGJsb2NrLmZpbmRfY29udGVudCggInNlY3Rpb25zIiApCi0gICAgICAgIGlmIG5vdCBjb250ZW50OgotICAgICAgICAgICAgYmxvY2sucHJpbnRfZXJyb3IoICJjaGFwdGVyIGhhcyBubyA8c2VjdGlvbnM+IGNvbnRlbnQiICkKLQotICAgICAgICAjIGNvbXB1dGUgbGlzdCBvZiBzZWN0aW9uIG5hbWVzCi0gICAgICAgIHNsaXN0ID0gW10KLSAgICAgICAgZm9yIGl0ZW0gaW4gY29udGVudC5pdGVtczoKLSAgICAgICAgICAgIGZvciBlbGVtZW50IGluIGl0ZW1bMV06Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICB3b3JkcyAgICAgICAgPSBlbGVtZW50LmdldF93b3JkcygpCi0gICAgICAgICAgICAgICAgICAgIGwgICAgICAgICAgICA9IGxlbiggc2xpc3QgKQotICAgICAgICAgICAgICAgICAgICBzbGlzdFtsIDogbF0gPSB3b3JkcwotICAgICAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICAgICAgYmxvY2sucHJpbnRfd2FybmluZygKLSAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBjb250ZW50IGluIDxzZWN0aW9ucz4gbWFya2VyIiApCi0KLSAgICAgICAgc2VsZi5zZWN0aW9uX25hbWVzID0gc2xpc3QKLQotCi1jbGFzcyBEb2NEb2N1bWVudDoKLQotICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgotICAgICAgICBzZWxmLnNlY3Rpb25fbGlzdCAgPSBEb2NTZWN0aW9uTGlzdCgpICAgIyBzZWN0aW9uIGxpc3Qgb2JqZWN0Ci0gICAgICAgIHNlbGYuY2hhcHRlcnMgICAgICA9IFtdICAgICAgICAgICAgICAgICAjIGxpc3Qgb2YgY2hhcHRlcnMKLSAgICAgICAgc2VsZi5sb3N0X3NlY3Rpb25zID0gW10gICAgICAgICAgICAgICAgICMgbGlzdCBvZiBzZWN0aW9ucyB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIGNoYXB0ZXIKLQotICAgIGRlZiBhcHBlbmRfYmxvY2soIHNlbGYsIGJsb2NrICk6Ci0gICAgICAgIGlmIGJsb2NrLm5hbWU6Ci0gICAgICAgICAgICBjb250ZW50ID0gYmxvY2suZmluZF9jb250ZW50KCAiY2hhcHRlciIgKQotICAgICAgICAgICAgaWYgY29udGVudDoKLSAgICAgICAgICAgICAgICAjIGEgY2hhcHRlciBkZWZpbml0aW9uIC0tIGFkZCBpdCB0byBvdXIgbGlzdAotICAgICAgICAgICAgICAgICMKLSAgICAgICAgICAgICAgICBjaGFwdGVyID0gRG9jQ2hhcHRlciggYmxvY2sgKQotICAgICAgICAgICAgICAgIHNlbGYuY2hhcHRlcnMuYXBwZW5kKCBjaGFwdGVyICkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5zZWN0aW9uX2xpc3QuYXBwZW5kX2Jsb2NrKCBibG9jayApCi0KLQotICAgIGRlZiBwcmVwYXJlX2NoYXB0ZXJzKCBzZWxmICk6Ci0gICAgICAgICMgY2hlY2sgc2VjdGlvbiBuYW1lcwotICAgICAgICAjCi0gICAgICAgIGZvciBjaGFwdGVyIGluIHNlbGYuY2hhcHRlcnM6Ci0gICAgICAgICAgICBzbGlzdCA9IFtdCi0gICAgICAgICAgICBmb3IgbmFtZSBpbiBjaGFwdGVyLnNlY3Rpb25fbmFtZXM6Ci0gICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBzZWxmLnNlY3Rpb25fbGlzdC5zZWN0aW9ucy5nZXQoIG5hbWUgKQotICAgICAgICAgICAgICAgICBpZiBub3Qgc2VjdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgIGNoYXB0ZXIuYmxvY2sucHJpbnRfd2FybmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcmVmZXJlbmNlIHRvIHVua25vd24gc2VjdGlvbiAnIiArIG5hbWUgKyAiJyIgKQotICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5jaGFwdGVyID0gY2hhcHRlcgotICAgICAgICAgICAgICAgICAgICAgc2xpc3QuYXBwZW5kKCBzZWN0aW9uICkKLQotICAgICAgICAgICAgY2hhcHRlci5zZWN0aW9ucyA9IHNsaXN0Ci0KLSAgICAgICAgZm9yIHNlY3Rpb24gaW4gc2VsZi5zZWN0aW9uX2xpc3QubGlzdDoKLSAgICAgICAgICAgIGlmIG5vdCBzZWN0aW9uLmNoYXB0ZXI6Ci0gICAgICAgICAgICAgICAgc2VjdGlvbi5ibG9jay5wcmludF93YXJuaW5nKAotICAgICAgICAgICAgICAgICAgInNlY3Rpb24gJyIgKyBzZWN0aW9uLm5hbWUgKyAiJyBpcyBub3QgaW4gYW55IGNoYXB0ZXIiICkKLSAgICAgICAgICAgICAgICBzZWxmLmxvc3Rfc2VjdGlvbnMuYXBwZW5kKCBzZWN0aW9uICkKLQotCi0gICAgZGVmIHByZXBhcmVfZmlsZXMoIHNlbGYsIGZpbGVfcHJlZml4ID0gTm9uZSApOgotICAgICAgICBzZWxmLnNlY3Rpb25fbGlzdC5wcmVwYXJlX2ZpbGVzKCBmaWxlX3ByZWZpeCApCi0gICAgICAgIHNlbGYucHJlcGFyZV9jaGFwdGVycygpCi0KLQotICAgIGRlZiBkdW1wX3RvY19odG1sKCBzZWxmICk6Ci0gICAgICAgICMgZHVtcCBhbiBodG1sIHRhYmxlIG9mIGNvbnRlbnRzCi0gICAgICAgICMKLSAgICAgICAgb3V0cHV0ID0gb3Blbl9vdXRwdXQoIHNlbGYuc2VjdGlvbl9saXN0LnRvY19maWxlbmFtZSApCi0KLSAgICAgICAgcHJpbnQgaHRtbF9oZWFkZXIKLQotICAgICAgICBwcmludCAiPGNlbnRlcj48aDE+VGFibGUgb2YgQ29udGVudHM8L2gxPjwvY2VudGVyPiIKLQotICAgICAgICBmb3IgY2hhcHRlciBpbiBzZWxmLmNoYXB0ZXJzOgotICAgICAgICAgICAgcHJpbnQgY2hhcHRlcl9oZWFkZXIgKyBjaGFwdGVyLnRpdGxlICsgY2hhcHRlcl9pbnRlcgotCi0gICAgICAgICAgICBwcmludCAiPHRhYmxlIGNlbGxwYWRkaW5nPTU+IgotICAgICAgICAgICAgZm9yIHNlY3Rpb24gaW4gY2hhcHRlci5zZWN0aW9uczoKLSAgICAgICAgICAgICAgICBpZiBzZWN0aW9uLmFic3RyYWN0OgotICAgICAgICAgICAgICAgICAgICBwcmludCAiPHRyIHZhbGlnbj10b3A+PHRkPiIKLSAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggJzxhIGhyZWY9IicgKyBzZWN0aW9uLmZpbGVuYW1lICsgJyI+JyApCi0gICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIHNlY3Rpb24udGl0bGUgKQotICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCAiPC9hPjwvdGQ+PHRkPiIgKyAnXG4nICkKLSAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5hYnN0cmFjdC5kdW1wX2h0bWwoIHNlbGYuc2VjdGlvbl9saXN0LmlkZW50aWZpZXJzICkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgIjwvdGQ+PC90cj4iCi0KLSAgICAgICAgICAgIHByaW50ICI8L3RhYmxlPiIKLQotICAgICAgICAgICAgcHJpbnQgY2hhcHRlcl9mb290ZXIKLQotICAgICAgICAjIGxpc3QgbG9zdCBzZWN0aW9ucwotICAgICAgICAjCi0gICAgICAgIGlmIHNlbGYubG9zdF9zZWN0aW9uczoKLSAgICAgICAgICAgIHByaW50IGNoYXB0ZXJfaGVhZGVyICsgIk9USEVSIFNFQ1RJT05TOiIgKyBjaGFwdGVyX2ludGVyCi0KLSAgICAgICAgICAgIHByaW50ICI8dGFibGUgY2VsbHBhZGRpbmc9NT4iCi0gICAgICAgICAgICBmb3Igc2VjdGlvbiBpbiBzZWxmLmxvc3Rfc2VjdGlvbnM6Ci0gICAgICAgICAgICAgICAgaWYgc2VjdGlvbi5hYnN0cmFjdDoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgIjx0ciB2YWxpZ249dG9wPjx0ZD4iCi0gICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoICc8YSBocmVmPSInICsgc2VjdGlvbi5maWxlbmFtZSArICciPicgKQotICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCBzZWN0aW9uLnRpdGxlICkKLSAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSggIjwvYT48L3RkPjx0ZD4iICsgJ1xuJyApCi0gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uYWJzdHJhY3QuZHVtcF9odG1sKCBzZWxmLnNlY3Rpb25fbGlzdC5pZGVudGlmaWVycyApCi0gICAgICAgICAgICAgICAgICAgIHByaW50ICI8L3RkPjwvdHI+IgotCi0gICAgICAgICAgICBwcmludCAiPC90YWJsZT4iCi0KLSAgICAgICAgICAgIHByaW50IGNoYXB0ZXJfZm9vdGVyCi0KLSAgICAgICAgIyBpbmRleAotICAgICAgICAjCi0gICAgICAgIHByaW50IGNoYXB0ZXJfaGVhZGVyICsgJzxhIGhyZWY9IicgKyBzZWxmLnNlY3Rpb25fbGlzdC5pbmRleF9maWxlbmFtZSArICciPkluZGV4PC9hPicgKyBjaGFwdGVyX2Zvb3RlcgotCi0gICAgICAgIHByaW50IGh0bWxfZm9vdGVyCi0KLSAgICAgICAgY2xvc2Vfb3V0cHV0KCBvdXRwdXQgKQotCi0KLSAgICBkZWYgZHVtcF9pbmRleF9odG1sKCBzZWxmICk6Ci0gICAgICAgIHNlbGYuc2VjdGlvbl9saXN0LmR1bXBfaHRtbF9pbmRleCgpCi0KLQotICAgIGRlZiBkdW1wX3NlY3Rpb25zX2h0bWwoIHNlbGYgKToKLSAgICAgICAgc2VsZi5zZWN0aW9uX2xpc3QuZHVtcF9odG1sX3NlY3Rpb25zKCkKLQotCi1kZWYgZmlsdGVyX2Jsb2Nrc19ieV90eXBlKCBibG9ja19saXN0LCB0eXBlcyApOgotICAgIG5ld19saXN0ID0gW10KLSAgICBmb3IgYmxvY2sgaW4gYmxvY2tfbGlzdDoKLSAgICAgICAgaWYgYmxvY2suaXRlbXM6Ci0gICAgICAgICAgICBlbGVtZW50ID0gYmxvY2suaXRlbXNbMF0KLSAgICAgICAgICAgIG1hcmtlciAgPSBlbGVtZW50WzBdCi0gICAgICAgICAgICBpZiBtYXJrZXIgaW4gdHlwZXM6Ci0gICAgICAgICAgICAgICAgbmV3X2xpc3QuYXBwZW5kKCBibG9jayApCi0KLSAgICByZXR1cm4gbmV3X2xpc3QKLQotCi1kZWYgZmlsdGVyX3NlY3Rpb25fYmxvY2tzKCBibG9jayApOgotICAgIHJldHVybiBibG9jay5zZWN0aW9uICE9IE5vbmUKLQotCi0jIFBlcmZvcm0gYSBsZXhpY29ncmFwaGljYWwgY29tcGFyaXNvbiBvZiB0d28gRG9jQmxvY2sgb2JqZWN0cy4gIFJldHVybnMgLTEsCi0jIDAgb3IgMS4KLSMKLWRlZiBibG9ja19sZXhpY29ncmFwaGljYWxfY29tcGFyZSggYjEsIGIyICk6Ci0gICAgaWYgbm90IGIxLm5hbWU6Ci0gICAgICAgIHJldHVybiAtMQotICAgIGlmIG5vdCBiMi5uYW1lOgotICAgICAgICByZXR1cm4gMQotCi0gICAgaWQxID0gc3RyaW5nLmxvd2VyKCBiMS5uYW1lICkKLSAgICBpZDIgPSBzdHJpbmcubG93ZXIoIGIyLm5hbWUgKQotCi0gICAgaWYgaWQxIDwgaWQyOgotICAgICAgICByZXR1cm4gLTEKLSAgICBlbGlmIGlkMSA9PSBpZDI6Ci0gICAgICAgIHJldHVybiAwCi0gICAgZWxzZToKLSAgICAgICAgcmV0dXJuIDEKLQotCi0jIER1bXAgYSBsaXN0IGJsb2NrIGFzIGEgc2luZ2xlIEhUTUwgcGFnZS4KLSMKLWRlZiBkdW1wX2h0bWxfMSggYmxvY2tfbGlzdCApOgotICAgIHByaW50IGh0bWxfaGVhZGVyCi0KLSAgICBmb3IgYmxvY2sgaW4gYmxvY2tfbGlzdDoKLSAgICAgICAgYmxvY2suZHVtcF9odG1sKCkKLQotICAgIHByaW50IGh0bWxfZm9vdGVyCi0KLQotZGVmIGZpbGVfZXhpc3RzKCBwYXRobmFtZSApOgotICAgIHJlc3VsdCA9IDEKLSAgICB0cnk6Ci0gICAgICAgIGZpbGUgPSBvcGVuKCBwYXRobmFtZSwgInIiICkKLSAgICAgICAgZmlsZS5jbG9zZSgpCi0gICAgZXhjZXB0OgotICAgICAgICByZXN1bHQgPSBOb25lCi0KLSAgICByZXR1cm4gcmVzdWx0Ci0KLQotZGVmIGFkZF9uZXdfYmxvY2soIGxpc3QsIGZpbGVuYW1lLCBsaW5lbm8sIGJsb2NrX2xpbmVzLCBzb3VyY2VfbGluZXMgKToKLSAgICAiIiJhZGQgYSBuZXcgYmxvY2sgdG8gdGhlIGxpc3QiIiIKLSAgICBibG9jayAgICAgICAgICA9IERvY0Jsb2NrKCBibG9ja19saW5lcywgc291cmNlX2xpbmVzICkKLSAgICBibG9jay5maWxlbmFtZSA9IGZpbGVuYW1lCi0gICAgYmxvY2subGluZW5vICAgPSBsaW5lbm8KLSAgICBsaXN0LmFwcGVuZCggYmxvY2sgKQotCi0KLWRlZiBtYWtlX2Jsb2NrX2xpc3QoIGFyZ3MgPSBOb25lICk6Ci0gICAgIiIicGFyc2UgYSBmaWxlIGFuZCBleHRyYWN0IGNvbW1lbnRzIGJsb2NrcyBmcm9tIGl0IiIiCi0KLSAgICBmaWxlX2xpc3QgPSBbXQotICAgICMgc3lzLnN0ZGVyci53cml0ZSggcmVwciggc3lzLmFyZ3ZbMSA6XSApICsgJ1xuJyApCi0KLSAgICBpZiBub3QgYXJnczoKLSAgICAgICAgYXJncyA9IHN5cy5hcmd2WzEgOl0KLQotICAgIGZvciBwYXRobmFtZSBpbiBhcmdzOgotICAgICAgICBpZiBzdHJpbmcuZmluZCggcGF0aG5hbWUsICcqJyApID49IDA6Ci0gICAgICAgICAgICBuZXdwYXRoID0gZ2xvYi5nbG9iKCBwYXRobmFtZSApCi0gICAgICAgICAgICBuZXdwYXRoLnNvcnQoKSAgIyBzb3J0IGZpbGVzIC0tIHRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9mIHRoZSBvcmRlciBvZiBmaWxlcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbmV3cGF0aCA9IFtwYXRobmFtZV0KLQotICAgICAgICBsYXN0ID0gbGVuKCBmaWxlX2xpc3QgKQotICAgICAgICBmaWxlX2xpc3RbbGFzdCA6IGxhc3RdID0gbmV3cGF0aAotCi0gICAgaWYgbGVuKCBmaWxlX2xpc3QgKSA9PSAwOgotICAgICAgICBmaWxlX2xpc3QgPSBOb25lCi0gICAgZWxzZToKLSAgICAgICAgIyBub3cgZmlsdGVyIHRoZSBmaWxlIGxpc3QgdG8gcmVtb3ZlIG5vbi1leGlzdGluZyBvbmVzCi0gICAgICAgIGZpbGVfbGlzdCA9IGZpbHRlciggZmlsZV9leGlzdHMsIGZpbGVfbGlzdCApCi0KLSAgICBsaXN0ICAgPSBbXQotICAgIGJsb2NrICA9IFtdCi0gICAgZm9ybWF0ID0gMAotICAgIGxpbmVubyA9IDAKLQotICAgICMgV2UgdXNlICJmb3JtYXQiIHRvIHN0b3JlIHRoZSBzdGF0ZSBvZiBvdXIgcGFyc2VyOgotICAgICMKLSAgICAjICAwIC0gd2FpdCBmb3IgYmVnaW5uaW5nIG9mIGNvbW1lbnQKLSAgICAjICAxIC0gcGFyc2UgY29tbWVudCBmb3JtYXQgMQotICAgICMgIDIgLSBwYXJzZSBjb21tZW50IGZvcm1hdCAyCi0gICAgIwotICAgICMgIDQgLSB3YWl0IGZvciBiZWdpbm5pbmcgb2Ygc291cmNlIChvciBjb21tZW50PykKLSAgICAjICA1IC0gcHJvY2VzcyBzb3VyY2UKLSAgICAjCi0gICAgY29tbWVudCA9IFtdCi0gICAgc291cmNlICA9IFtdCi0gICAgc3RhdGUgICA9IDAKLQotICAgIGZpbGVpbnB1dC5jbG9zZSgpCi0gICAgZm9yIGxpbmUgaW4gZmlsZWlucHV0LmlucHV0KCBmaWxlX2xpc3QgKToKLSAgICAgICAgbCA9IGxlbiggbGluZSApCi0gICAgICAgIGlmIGwgPiAwIGFuZCBsaW5lW2wgLSAxXSA9PSAnXDAxMic6Ci0gICAgICAgICAgICBsaW5lID0gbGluZVswIDogbC0xXQotCi0gICAgICAgICMgc3RyaXBwZWQgdmVyc2lvbiBvZiB0aGUgbGluZQotICAgICAgICAjCi0gICAgICAgIGxpbmUyID0gc3RyaW5nLnN0cmlwKCBsaW5lICkKLSAgICAgICAgbCAgICAgPSBsZW4oIGxpbmUyICkKLQotICAgICAgICAjIGlmIHRoaXMgbGluZSBiZWdpbnMgd2l0aCBhIGNvbW1lbnQgYW5kIHdlIGFyZSBwcm9jZXNzaW5nIHNvbWUKLSAgICAgICAgIyBzb3VyY2UsIGV4aXQgdG8gc3RhdGUgMAotICAgICAgICAjCi0gICAgICAgICMgdW5sZXNzIHdlIGVuY291bnRlciBzb21ldGhpbmcgbGlrZToKLSAgICAgICAgIwotICAgICAgICAjICAgIC8qQC4uLi4uCi0gICAgICAgICMgICAgLyojLi4uLi4KLSAgICAgICAgIwotICAgICAgICAjICAgIC8qIEAuLi4uLgotICAgICAgICAjICAgIC8qICMuLi4uLgotICAgICAgICAjCi0gICAgICAgIGlmIGZvcm1hdCA+PSA0IGFuZCBsID4gMiBhbmQgbGluZTJbMCA6IDJdID09ICcvKic6Ci0gICAgICAgICAgICBpZiBsIDwgNCBvciAoIGxpbmUyWzJdICE9ICdAJyBhbmQgbGluZTJbMiA6IDRdICE9ICcgQCcgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyWzJdICE9ICcjJyBhbmQgbGluZTJbMiA6IDRdICE9ICcgIycpOgotICAgICAgICAgICAgICAgIGFkZF9uZXdfYmxvY2soIGxpc3QsIGZpbGVpbnB1dC5maWxlbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubywgYmxvY2ssIHNvdXJjZSApCi0gICAgICAgICAgICAgICAgZm9ybWF0ID0gMAotCi0gICAgICAgIGlmIGZvcm1hdCA9PSAwOiAgIyMjIyB3YWl0IGZvciBiZWdpbm5pbmcgb2YgY29tbWVudCAjIyMjCi0gICAgICAgICAgICBpZiBsID4gMyBhbmQgbGluZTJbMCA6IDNdID09ICcvKionOgotICAgICAgICAgICAgICAgIGkgPSAzCi0gICAgICAgICAgICAgICAgd2hpbGUgaSA8IGwgYW5kIGxpbmUyW2ldID09ICcqJzoKLSAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxCi0KLSAgICAgICAgICAgICAgICBpZiBpID09IGw6Ci0gICAgICAgICAgICAgICAgICAgICMgdGhpcyBpcyAnLyoqJyBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mICcqJywgdGhlCi0gICAgICAgICAgICAgICAgICAgICMgYmVnaW5uaW5nIG9mIGEgRm9ybWF0IDEgYmxvY2sKLSAgICAgICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgICAgICBibG9jayAgPSBbXQotICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSBbXQotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAxCi0gICAgICAgICAgICAgICAgICAgIGxpbmVubyA9IGZpbGVpbnB1dC5maWxlbGluZW5vKCkKLQotICAgICAgICAgICAgICAgIGVsaWYgaSA9PSBsIC0gMSBhbmQgbGluZTJbaV0gPT0gJy8nOgotICAgICAgICAgICAgICAgICAgICAjIHRoaXMgaXMgJy8qKicgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiAnKicsIGZvbGxvd2VkCi0gICAgICAgICAgICAgICAgICAgICMgYnkgYSAnLycsIGkuZS4gdGhlIGJlZ2lubmluZyBvZiBhIEZvcm1hdCAyIG9yIDMgYmxvY2sKLSAgICAgICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgICAgICBibG9jayAgPSBbXQotICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSBbXQotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAyCi0gICAgICAgICAgICAgICAgICAgIGxpbmVubyA9IGZpbGVpbnB1dC5maWxlbGluZW5vKCkKLQotICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotICAgICAgICAjCi0gICAgICAgICMgRk9STUFUIDEKLSAgICAgICAgIwotICAgICAgICBlbGlmIGZvcm1hdCA9PSAxOgotCi0gICAgICAgICAgICAjIElmIHRoZSBsaW5lIGRvZXNuJ3QgYmVnaW4gd2l0aCBhICIqIiwgc29tZXRoaW5nIHdlbnQgd3JvbmcsCi0gICAgICAgICAgICAjIGFuZCB3ZSBtdXN0IGV4aXQsIGFuZCBmb3JnZXQgdGhlIGN1cnJlbnQgYmxvY2suCi0gICAgICAgICAgICAjCi0gICAgICAgICAgICBpZiBsID09IDAgb3IgbGluZTJbMF0gIT0gJyonOgotICAgICAgICAgICAgICAgIGJsb2NrICA9IFtdCi0gICAgICAgICAgICAgICAgZm9ybWF0ID0gMAotCi0gICAgICAgICAgICAjIE90aGVyd2lzZSwgd2UgdGVzdCBmb3IgYW4gZW5kIG9mIGJsb2NrLCB3aGljaCBpcyBhbiBhcmJpdHJhcnkKLSAgICAgICAgICAgICMgbnVtYmVyIG9mICcqJywgZm9sbG93ZWQgYnkgJy8nLgotICAgICAgICAgICAgIwotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBpID0gMQotICAgICAgICAgICAgICAgIHdoaWxlIGkgPCBsIGFuZCBsaW5lMltpXSA9PSAnKic6Ci0gICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQotCi0gICAgICAgICAgICAgICAgIyB0ZXN0IGZvciB0aGUgZW5kIG9mIHRoZSBibG9jawotICAgICAgICAgICAgICAgICMKLSAgICAgICAgICAgICAgICBpZiBpIDwgbCBhbmQgbGluZTJbaV0gPT0gJy8nOgotICAgICAgICAgICAgICAgICAgICBpZiBibG9jayAhPSBbXToKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDQKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDAKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSBzaW1wbHkgYXBwZW5kIGxpbmUgdG8gY3VycmVudCBibG9jawotICAgICAgICAgICAgICAgICAgICAjCi0gICAgICAgICAgICAgICAgICAgIGJsb2NrLmFwcGVuZCggbGluZTJbaSA6XSApCi0KLSAgICAgICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgICAgICMKLSAgICAgICAgIyBGT1JNQVQgMgotICAgICAgICAjCi0gICAgICAgIGVsaWYgZm9ybWF0ID09IDI6Ci0KLSAgICAgICAgICAgICMgSWYgdGhlIGxpbmUgZG9lc24ndCBiZWdpbiB3aXRoICcvKicgYW5kIGVuZCB3aXRoICcqLycsIHRoaXMgaXMKLSAgICAgICAgICAgICMgdGhlIGVuZCBvZiB0aGUgZm9ybWF0IDIgZm9ybWF0LgotICAgICAgICAgICAgIwotICAgICAgICAgICAgaWYgbCA8IDQgb3IgbGluZTJbOiAyXSAhPSAnLyonIG9yIGxpbmUyWy0yIDpdICE9ICcqLyc6Ci0gICAgICAgICAgICAgICAgaWYgYmxvY2sgIT0gW106Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDQKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAwCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICMgcmVtb3ZlIHRoZSBzdGFydCBhbmQgZW5kIGNvbW1lbnQgZGVsaW1pdGVycywgdGhlbgotICAgICAgICAgICAgICAgICMgcmlnaHQtc3RyaXAgdGhlIGxpbmUKLSAgICAgICAgICAgICAgICAjCi0gICAgICAgICAgICAgICAgbGluZTIgPSBzdHJpbmcucnN0cmlwKCBsaW5lMlsyIDogLTJdICkKLQotICAgICAgICAgICAgICAgICMgY2hlY2sgZm9yIGVuZCBvZiBhIGZvcm1hdDIgYmxvY2ssIGkuZS4gYSBydW4gb2YgJyonCi0gICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgIGlmIHN0cmluZy5jb3VudCggbGluZTIsICcqJyApID09IGwgLSA0OgotICAgICAgICAgICAgICAgICAgICBpZiBibG9jayAhPSBbXToKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDQKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IDAKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSwgYWRkIHRoZSBsaW5lIHRvIHRoZSBjdXJyZW50IGJsb2NrCi0gICAgICAgICAgICAgICAgICAgICMKLSAgICAgICAgICAgICAgICAgICAgYmxvY2suYXBwZW5kKCBsaW5lMiApCi0KLSAgICAgICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIGZvcm1hdCA+PSA0OiAgIyMjIyBzb3VyY2UgcHJvY2Vzc2luZyAjIyMjCi0gICAgICAgICAgICBpZiBsID4gMDoKLSAgICAgICAgICAgICAgICBmb3JtYXQgPSA1Ci0KLSAgICAgICAgICAgIGlmIGZvcm1hdCA9PSA1OgotICAgICAgICAgICAgICAgIHNvdXJjZS5hcHBlbmQoIGxpbmUgKQotCi0gICAgaWYgZm9ybWF0ID49IDQ6Ci0gICAgICAgIGFkZF9uZXdfYmxvY2soIGxpc3QsIGZpbGVpbnB1dC5maWxlbmFtZSgpLCBsaW5lbm8sIGJsb2NrLCBzb3VyY2UgKQotCi0gICAgcmV0dXJuIGxpc3QKLQotCi0KLSMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZwotIwotZGVmIGR1bXBfYmxvY2tfbGlzdCggbGlzdCApOgotICAgICIiImR1bXAgYSBjb21tZW50IGJsb2NrIGxpc3QiIiIKLSAgICBmb3IgYmxvY2sgaW4gbGlzdDoKLSAgICAgICAgcHJpbnQgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0gICAgICAgIGZvciBsaW5lIGluIGJsb2NrWzBdOgotICAgICAgICAgICAgcHJpbnQgbGluZQotICAgICAgICBmb3IgbGluZSBpbiBibG9ja1sxXToKLSAgICAgICAgICAgIHByaW50IGxpbmUKLQotICAgIHByaW50ICItLS0tLS0tLS10aGUgZW5kLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0KLQotZGVmIHVzYWdlKCk6Ci0gICAgcHJpbnQgIlxuRG9jTWFrZXIgMC4xIFVzYWdlIGluZm9ybWF0aW9uXG4iCi0gICAgcHJpbnQgIiAgZG9jbWFrZXIgW29wdGlvbnNdIGZpbGUxIFsgZmlsZTIgLi4uIF1cbiIKLSAgICBwcmludCAidXNpbmcgdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuIgotICAgIHByaW50ICIgIC1oIDogcHJpbnQgdGhpcyBwYWdlIgotICAgIHByaW50ICIgIC10IDogc2V0IHByb2plY3QgdGl0bGUsIGFzIGluICctdCBcIk15IFByb2plY3RcIiciCi0gICAgcHJpbnQgIiAgLW8gOiBzZXQgb3V0cHV0IGRpcmVjdG9yeSwgYXMgaW4gJy1vIG15ZGlyJyIKLSAgICBwcmludCAiICAtcCA6IHNldCBkb2N1bWVudGF0aW9uIHByZWZpeCwgYXMgaW4gJy1wIGZ0MiciCi0gICAgcHJpbnQgIiIKLSAgICBwcmludCAiICAtLXRpdGxlICA6IHNhbWUgYXMgLXQsIGFzIGluICctLXRpdGxlPVwiTXkgUHJvamVjdFwiJyIKLSAgICBwcmludCAiICAtLW91dHB1dCA6IHNhbWUgYXMgLW8sIGFzIGluICctLW91dHB1dD1teWRpciciCi0gICAgcHJpbnQgIiAgLS1wcmVmaXggOiBzYW1lIGFzIC1wLCBhcyBpbiAnLS1wcmVmaXg9ZnQyJyIKLQotCi1kZWYgbWFpbiggYXJndiApOgotICAgICIiIm1haW4gcHJvZ3JhbSBsb29wIiIiCi0KLSAgICBnbG9iYWwgb3V0cHV0X2RpciwgcHJvamVjdF90aXRsZSwgcHJvamVjdF9wcmVmaXgKLSAgICBnbG9iYWwgaHRtbF9oZWFkZXIsIGh0bWxfaGVhZGVyMSwgaHRtbF9oZWFkZXIyLCBodG1sX2hlYWRlcjMKLQotICAgIHRyeToKLSAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoIHN5cy5hcmd2WzE6XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodDpvOnA6IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgImhlbHAiLCAidGl0bGU9IiwgIm91dHB1dD0iLCAicHJlZml4PSIgXSApCi0KLSAgICBleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yOgotICAgICAgICB1c2FnZSgpCi0gICAgICAgIHN5cy5leGl0KCAyICkKLQotICAgIGlmIGFyZ3MgPT0gW106Ci0gICAgICAgIHVzYWdlKCkKLSAgICAgICAgc3lzLmV4aXQoIDEgKQotCi0gICAgIyBwcm9jZXNzIG9wdGlvbnMKLSAgICAjCi0gICAgcHJvamVjdF90aXRsZSAgPSAiUHJvamVjdCIKLSAgICBwcm9qZWN0X3ByZWZpeCA9IE5vbmUKLSAgICBvdXRwdXRfZGlyICAgICA9IE5vbmUKLQotICAgIGZvciBvcHQgaW4gb3B0czoKLSAgICAgICAgaWYgb3B0WzBdIGluICggIi1oIiwgIi0taGVscCIgKToKLSAgICAgICAgICAgIHVzYWdlKCkKLSAgICAgICAgICAgIHN5cy5leGl0KCAwICkKLQotICAgICAgICBpZiBvcHRbMF0gaW4gKCAiLXQiLCAiLS10aXRsZSIgKToKLSAgICAgICAgICAgIHByb2plY3RfdGl0bGUgPSBvcHRbMV0KLQotICAgICAgICBpZiBvcHRbMF0gaW4gKCAiLW8iLCAiLS1vdXRwdXQiICk6Ci0gICAgICAgICAgICBvdXRwdXRfZGlyID0gb3B0WzFdCi0KLSAgICAgICAgaWYgb3B0WzBdIGluICggIi1wIiwgIi0tcHJlZml4IiApOgotICAgICAgICAgICAgcHJvamVjdF9wcmVmaXggPSBvcHRbMV0KLQotICAgIGh0bWxfaGVhZGVyID0gaHRtbF9oZWFkZXJfMSArIHByb2plY3RfdGl0bGUgKyBodG1sX2hlYWRlcl8yICsgcHJvamVjdF90aXRsZSArIGh0bWxfaGVhZGVyXzMKLSAgICBjaGVja19vdXRwdXQoICkKLSAgICBjb21wdXRlX3RpbWVfaHRtbCgpCi0KLSAgICAjIHdlIGJlZ2luIGJ5IHNpbXBseSBidWlsZGluZyBhIGxpc3Qgb2YgRG9jQmxvY2sgZWxlbWVudHMKLSAgICAjCi0gICAgbGlzdCA9IG1ha2VfYmxvY2tfbGlzdCggYXJncyApCi0KLSAgICAjIG5vdywgc29ydCB0aGUgYmxvY2tzIGludG8gc2VjdGlvbnMKLSAgICAjCi0gICAgZG9jdW1lbnQgPSBEb2NEb2N1bWVudCgpCi0gICAgZm9yIGJsb2NrIGluIGxpc3Q6Ci0gICAgICAgIGRvY3VtZW50LmFwcGVuZF9ibG9jayggYmxvY2sgKQotCi0gICAgZG9jdW1lbnQucHJlcGFyZV9maWxlcyggcHJvamVjdF9wcmVmaXggKQotCi0gICAgZG9jdW1lbnQuZHVtcF90b2NfaHRtbCgpCi0gICAgZG9jdW1lbnQuZHVtcF9zZWN0aW9uc19odG1sKCkKLSAgICBkb2N1bWVudC5kdW1wX2luZGV4X2h0bWwoKQotCi0jIGlmIGNhbGxlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUKLSMKLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgbWFpbiggc3lzLmFyZ3YgKQotCi0KLSMgZW9mCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvZG9jbWFrZXIvdG9odG1sLnB5IGIvc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weQppbmRleCBmY2MwZTZkLi40MTRiYWRjIDEwMDY0NAotLS0gYS9zcmMvdG9vbHMvZG9jbWFrZXIvdG9odG1sLnB5CisrKyBiL3NyYy90b29scy9kb2NtYWtlci90b2h0bWwucHkKQEAgLTEyMiwxMyArMTIyLDEzIEBACiAKIAogY2xhc3MgSHRtbEZvcm1hdHRlcihGb3JtYXR0ZXIpOgotICAgIAorCiAgICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwcm9jZXNzb3IsIHByb2plY3RfdGl0bGUsIGZpbGVfcHJlZml4ICk6Ci0gICAgICAgIAorCiAgICAgICAgIEZvcm1hdHRlci5fX2luaXRfXyggc2VsZiwgcHJvY2Vzc29yICkKLSAgICAgICAgCisKICAgICAgICAgZ2xvYmFsIGh0bWxfaGVhZGVyXzEsIGh0bWxfaGVhZGVyXzIsIGh0bWxfaGVhZGVyXzMsIGh0bWxfZm9vdGVyCi0gICAgICAgIAorCiAgICAgICAgIGlmIGZpbGVfcHJlZml4OgogICAgICAgICAgICAgZmlsZV9wcmVmaXggPSBmaWxlX3ByZWZpeCArICItIgogICAgICAgICBlbHNlOgpAQCAtMTM4LDEzICsxMzgsMTMgQEAKICAgICAgICAgc2VsZi5maWxlX3ByZWZpeCAgID0gZmlsZV9wcmVmaXgKICAgICAgICAgc2VsZi5odG1sX2hlYWRlciAgID0gaHRtbF9oZWFkZXJfMSArIHByb2plY3RfdGl0bGUgKyBodG1sX2hlYWRlcl8yICsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0X3RpdGxlICsgaHRtbF9oZWFkZXJfMwotICAgIAorCiAgICAgICAgIHNlbGYuaHRtbF9mb290ZXIgPSAiPHA+PGNlbnRlcj48Zm9udCBzaXplPSIiLTIiIj5nZW5lcmF0ZWQgb24gIiArICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuYXNjdGltZSggdGltZS5sb2NhbHRpbWUoIHRpbWUudGltZSgpICkgKSArIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L2ZvbnQ+PC9wPjwvY2VudGVyPiIgKyBodG1sX2Zvb3RlcgotICAgICAgICAKKwogICAgICAgICBzZWxmLmNvbHVtbnMgPSAzCi0gICAgCisKICAgICBkZWYgIG1ha2Vfc2VjdGlvbl91cmwoIHNlbGYsIHNlY3Rpb24gKToKICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZV9wcmVmaXggKyBzZWN0aW9uLm5hbWUgKyAiLmh0bWwiCiAKQEAgLTE4Myw3ICsxODMsNyBAQAogICAgICAgICBpZiBtOgogICAgICAgICAgICAgbmFtZSA9IG0uZ3JvdXAoMSkKICAgICAgICAgICAgIHJldHVybiAnPGk+JytuYW1lKyc8L2k+JwotICAgIAorCiAgICAgICAgIG0gPSByZV9ib2xkLm1hdGNoKCB3b3JkICkKICAgICAgICAgaWYgbToKICAgICAgICAgICAgIG5hbWUgPSBtLmdyb3VwKDEpCkBAIC0xOTksNyArMTk5LDcgQEAKICAgICAgICAgICAgIGxpbmUgPSBzZWxmLm1ha2VfaHRtbF93b3JkKCB3b3Jkc1swXSApCiAgICAgICAgICAgICBmb3Igd29yZCBpbiB3b3Jkc1sxOl06CiAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUgKyAiICIgKyBzZWxmLm1ha2VfaHRtbF93b3JkKCB3b3JkICkKLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuICI8cD4iICsgbGluZSArICI8L3A+IgogCiAKQEAgLTIzMyw3ICsyMzMsNyBAQAogICAgICAgICAgICAgcHJpbnQgIjx0YWJsZSB2YWxpZ249dG9wPjx0cj48dGQ+PGI+IitmaWVsZC5uYW1lKyI8L2I+PC90ZD48dGQ+IgogCiAgICAgICAgIHByaW50IHNlbGYubWFrZV9odG1sX2l0ZW1zKCBmaWVsZC5pdGVtcyApCi0gICAgICAgIAorCiAgICAgICAgIGlmIGZpZWxkLm5hbWU6CiAgICAgICAgICAgICBwcmludCAiPC90ZD48L3RyPjwvdGFibGU+IgogCkBAIC0yNDYsMTUgKzI0NiwxNSBAQAogICAgICAgICAgICAgICAgIG5hbWUgICA9IG0uZ3JvdXAoMikKICAgICAgICAgICAgICAgICBwcmVmaXggPSBodG1sX3F1b3RlKCBtLmdyb3VwKDEpICkKICAgICAgICAgICAgICAgICBsZW5ndGggPSBsZW4oIG0uZ3JvdXAoMCkgKQotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgaWYgbmFtZSA9PSBibG9ja19uYW1lOgogICAgICAgICAgICAgICAgICAgICAjIHRoaXMgaXMgdGhlIGN1cnJlbnQgYmxvY2sgbmFtZSwgaWYgYW55CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHByZWZpeCArICc8Yj4nICsgbmFtZSArICc8L2I+JwotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgZWxpZiByZV9zb3VyY2Vfa2V5d29yZHMubWF0Y2gobmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICMgdGhpcyBpcyBhIEMga2V5d29yZAogICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBwcmVmaXggKyBrZXl3b3JkX3ByZWZpeCArIG5hbWUgKyBrZXl3b3JkX3N1ZmZpeAotICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5pZGVudGlmaWVycy5oYXNfa2V5KG5hbWUpOgogICAgICAgICAgICAgICAgICAgICAjIHRoaXMgaXMgYSBrbm93biBpZGVudGlmaWVyCiAgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gc2VsZi5pZGVudGlmaWVyc1tuYW1lXQpAQCAtMjY3LDE5ICsyNjcsMzggQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgaHRtbF9xdW90ZShsaW5lKQogICAgICAgICAgICAgICAgIGxpbmUgICA9IFtdCi0gICAgICAgIAorCiAgICAgICAgIHJldHVybiByZXN1bHQKIAogCiAgICAgZGVmIHByaW50X2h0bWxfZmllbGRfbGlzdCggc2VsZiwgZmllbGRzICk6CiAgICAgICAgIHByaW50ICI8dGFibGUgdmFsaWduPXRvcCBjZWxscGFkZGluZz0zPiIKKworICAgICAgICAjIGNvbXB1dGUgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGVhY2ggZmllbGQgbmFtZQorICAgICAgICAjIGlmIGl0IGlzCisgICAgICAgICMKKyAgICAgICAgbWF4ID0gMAogICAgICAgICBmb3IgZmllbGQgaW4gZmllbGRzOgotICAgICAgICAgICAgcHJpbnQgIjx0cj48dGQ+PGI+IiArIGZpZWxkLm5hbWUgKyAiPC9iPjwvdGQ+PHRkPiIKKyAgICAgICAgICAgIGwgPSBsZW4oIGZpZWxkLm5hbWUgKQorICAgICAgICAgICAgaWYgbCA+IG1heDoKKyAgICAgICAgICAgICAgbWF4ID0gbAorCisgICAgICAgIGhlYWQgID0gIjx0ciB2YWxpZ249dG9wPjx0ZD48Yj4iCisgICAgICAgIGludGVyID0gIjwvYj48L3RkPjx0ZD4iCisgICAgICAgIGZvb3QgID0gIjwvdGQ+PC90cj4iCisgICAgICAgIGlmIG1heCA+IDE4OgorICAgICAgICAgICAgaGVhZCAgPSAiPHRyPjx0ZCBjb2xzcGFuPTI+PGI+IgorICAgICAgICAgICAgaW50ZXIgPSAiPC9iPjwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPTUlPjwvdGQ+PHRkPiIKKyAgICAgICAgICAgIGZvb3QgID0gIjxwPjwvdGQ+PC90cj4iCisKKyAgICAgICAgZm9yIGZpZWxkIGluIGZpZWxkczoKKyAgICAgICAgICAgIHByaW50IGhlYWQgKyBmaWVsZC5uYW1lICsgaW50ZXIKICAgICAgICAgICAgIHNlbGYucHJpbnRfaHRtbF9pdGVtcyggZmllbGQuaXRlbXMgKQotICAgICAgICAgICAgcHJpbnQgIjwvdGQ+PC90cj4iCisgICAgICAgICAgICBwcmludCBmb290CisKICAgICAgICAgcHJpbnQgIjwvdGFibGU+IgotICAgIAotICAgIAorCisKICAgICBkZWYgcHJpbnRfaHRtbF9tYXJrdXAoIHNlbGYsIG1hcmt1cCApOgogICAgICAgICB0YWJsZV9maWVsZHMgPSBbXQogICAgICAgICBmb3IgZmllbGQgaW4gbWFya3VwLmZpZWxkczoKQEAgLTI4OSwyMSArMzA4LDIxIEBACiAgICAgICAgICAgICAgICAgIyBhbGwgb2YgdGhlbSBhcyBhIHNpbmdsZSB0YWJsZQogICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICB0YWJsZV9maWVsZHMuYXBwZW5kKCBmaWVsZCApCi0gICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgaWYgdGFibGVfZmllbGRzOgogICAgICAgICAgICAgICAgICAgICBzZWxmLnByaW50X2h0bWxfZmllbGRfbGlzdCggdGFibGVfZmllbGRzICkKICAgICAgICAgICAgICAgICAgICAgdGFibGVfZmllbGRzID0gW10KLSAgICAKKwogICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfaHRtbF9pdGVtcyggZmllbGQuaXRlbXMgKQotICAgICAgICAKKwogICAgICAgICBpZiB0YWJsZV9maWVsZHM6CiAgICAgICAgICAgICBzZWxmLnByaW50X2h0bWxfZmllbGRfbGlzdCggdGFibGVfZmllbGRzICkKIAogICAgICMKICAgICAjICBGb3JtYXR0aW5nIHRoZSBpbmRleAogICAgICMKLSAgICAKKwogICAgIGRlZiAgaW5kZXhfZW50ZXIoIHNlbGYgKToKICAgICAgICAgcHJpbnQgc2VsZi5odG1sX2hlYWRlcgogICAgICAgICBzZWxmLmluZGV4X2l0ZW1zID0ge30KQEAgLTMxNCwxMiArMzMzLDEyIEBACiAgICAgICAgIHNlbGYuaW5kZXhfaXRlbXNbIG5hbWUgXSA9IHVybAogCiAgICAgZGVmICBpbmRleF9leGl0KCBzZWxmICk6Ci0gICAgICAgIAorCiAgICAgICAgICMgYmxvY2tfaW5kZXggYWxyZWFkeSBjb250YWlucyB0aGUgc29ydGVkIGxpc3Qgb2YgaW5kZXggbmFtZXMKICAgICAgICAgY291bnQgPSBsZW4oIHNlbGYuYmxvY2tfaW5kZXggKQogICAgICAgICByb3dzICA9IChjb3VudCArIHNlbGYuY29sdW1ucyAtIDEpL3NlbGYuY29sdW1ucwotICAgICAgICAKLSAgICAgICAgcHJpbnQgIjxjZW50ZXI+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4iCisKKyAgICAgICAgcHJpbnQgIjxjZW50ZXI+PHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9Mj4iCiAgICAgICAgIGZvciByIGluIHJhbmdlKHJvd3MpOgogICAgICAgICAgICAgbGluZSA9ICI8dHI+IgogICAgICAgICAgICAgZm9yIGMgaW4gcmFuZ2Uoc2VsZi5jb2x1bW5zKToKQEAgLTMzOCw3ICszNTcsNyBAQAogICAgICAgICBzZWxmLmluZGV4X2l0ZW1zID0ge30KIAogICAgIGRlZiAgaW5kZXhfZHVtcCggc2VsZiwgaW5kZXhfZmlsZW5hbWUgPSBOb25lICk6Ci0gICAgICAgIAorCiAgICAgICAgIGlmIGluZGV4X2ZpbGVuYW1lID09IE5vbmU6CiAgICAgICAgICAgICBpbmRleF9maWxlbmFtZSA9IHNlbGYuZmlsZV9wcmVmaXggKyAiaW5kZXguaHRtbCIKIApAQCAtMzQ2LDcgKzM2NSw3IEBACiAKICAgICAjCiAgICAgIyAgRm9ybWF0dGluZyB0aGUgdGFibGUgb2YgY29udGVudAotICAgICMgICAgCisgICAgIwogICAgIGRlZiAgdG9jX2VudGVyKCBzZWxmICk6CiAgICAgICAgIHByaW50IHNlbGYuaHRtbF9oZWFkZXIKICAgICAgICAgcHJpbnQgIjxjZW50ZXI+PGgxPlRhYmxlIG9mIENvbnRlbnRzPC9oMT48L2NlbnRlcj4iCkBAIC0zNTksNyArMzc4LDcgQEAKICAgICAgICAgcHJpbnQgIjx0ciB2YWxpZ249dG9wPjx0ZD4iCiAgICAgICAgIHByaW50ICc8YSBocmVmPSInICsgc2VsZi5tYWtlX3NlY3Rpb25fdXJsKCBzZWN0aW9uICkgKyAnIj4nICsgXAogICAgICAgICAgICAgICAgc2VjdGlvbi50aXRsZSArICc8L2E+PC90ZD48dGQ+JwotICAgICAgICAKKwogICAgICAgICBwcmludCBzZWxmLm1ha2VfaHRtbF9wYXJhKCBzZWN0aW9uLmFic3RyYWN0ICkKIAogICAgIGRlZiAgdG9jX3NlY3Rpb25fZXhpdCggc2VsZiwgc2VjdGlvbiApOgpAQCAtMzc5LDcgKzM5OCw3IEBACiAgICAgZGVmICB0b2NfZHVtcCggc2VsZiwgdG9jX2ZpbGVuYW1lID0gTm9uZSwgaW5kZXhfZmlsZW5hbWUgPSBOb25lICk6CiAgICAgICAgIGlmIHRvY19maWxlbmFtZSA9PSBOb25lOgogICAgICAgICAgICAgdG9jX2ZpbGVuYW1lID0gc2VsZi5maWxlX3ByZWZpeCArICJ0b2MuaHRtbCIKLSAgICAgICAgCisKICAgICAgICAgaWYgaW5kZXhfZmlsZW5hbWUgPT0gTm9uZToKICAgICAgICAgICAgIGluZGV4X2ZpbGVuYW1lID0gc2VsZi5maWxlX3ByZWZpeCArICJpbmRleC5odG1sIgogCkBAIC0zOTcsMTQgKzQxNiwxNCBAQAogCiAgICAgICAgICMgcHJpbnQgc2VjdGlvbiBzeW5vcHN5cwogICAgICAgICBwcmludCBzZWN0aW9uX3N5bm9wc2lzX2hlYWRlcgotICAgICAgICBwcmludCAiPGNlbnRlcj48dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0wIGJvcmRlcj0wPiIKLSAgICAgICAgCi0gICAgICAgIG1heHdpZHRoID0gMAorICAgICAgICBwcmludCAiPGNlbnRlcj48dGFibGUgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0yIGJvcmRlcj0wPiIKKworICAgICAgICBtYXh3aWR0aCA9IDEKICAgICAgICAgZm9yIGIgaW4gc2VjdGlvbi5ibG9ja3MudmFsdWVzKCk6CiAgICAgICAgICAgICBpZiBsZW4oYi5uYW1lKSA+IG1heHdpZHRoOgogICAgICAgICAgICAgICAgIG1heHdpZHRoID0gbGVuKGIubmFtZSkKIAotICAgICAgICB3aWR0aCAgPSAxMzAgICMgWFhYIG1hZ2ljIG51bWJlcgorICAgICAgICB3aWR0aCAgPSA3MCAgIyBYWFggbWFnaWMgbnVtYmVyCiAgICAgICAgIGNvbHVtbnMgPSB3aWR0aCAvIG1heHdpZHRoCiAgICAgICAgIGlmIGNvbHVtbnMgPCAxOgogICAgICAgICAgICAgY29sdW1ucyA9IDEKQEAgLTQyMyw3ICs0NDIsNyBAQAogICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgJzwvdGQ+JwogICAgICAgICAgICAgbGluZSA9IGxpbmUgKyAiPC90cj4iCiAgICAgICAgICAgICBwcmludCBsaW5lCi0gICAgICAgICAgICAKKwogICAgICAgICBwcmludCAiPC90YWJsZT48L2NlbnRlcj48YnI+PGJyPiIKICAgICAgICAgcHJpbnQgc2VjdGlvbl9zeW5vcHNpc19mb290ZXIKIApAQCAtNDM5LDcgKzQ1OCw3IEBACiAgICAgICAgICAgICBwcmludCAnPGEgbmFtZT0iJyArIGJsb2NrLm5hbWUgKyAnIj4nCiAgICAgICAgICAgICBwcmludCAiPGg0PiIgKyBibG9jay5uYW1lICsgIjwvaDQ+IgogICAgICAgICAgICAgcHJpbnQgIjwvYT4iCi0gICAgICAgIAorCiAgICAgICAgICMgZHVtcCB0aGUgYmxvY2sgQyBzb3VyY2UgbGluZXMgbm93CiAgICAgICAgIGlmIGJsb2NrLmNvZGU6CiAgICAgICAgICAgICBwcmludCBzb3VyY2VfaGVhZGVyCkBAIC00NTMsOSArNDcyLDkgQEAKICAgICAgICAgICAgIHByaW50IGRlc2NyaXB0aW9uX2hlYWRlcgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcHJpbnQgbWFya2VyX2hlYWRlciArIG1hcmt1cC50YWcgKyBtYXJrZXJfaW50ZXIKLSAgICAgICAgCisKICAgICAgICAgc2VsZi5wcmludF9odG1sX21hcmt1cCggbWFya3VwICkKLSAgICAKKwogICAgIGRlZiAgbWFya3VwX2V4aXQoIHNlbGYsIG1hcmt1cCwgYmxvY2sgKToKICAgICAgICAgaWYgbWFya3VwLnRhZyA9PSAiZGVzY3JpcHRpb24iOgogICAgICAgICAgICAgcHJpbnQgZGVzY3JpcHRpb25fZm9vdGVyCkBAIC00NjUsNyArNDg0LDcgQEAKICAgICBkZWYgIGJsb2NrX2V4aXQoIHNlbGYsIGJsb2NrICk6CiAgICAgICAgIHByaW50IGJsb2NrX2Zvb3RlcgogCi0gICAgICAgIAorCiAgICAgZGVmICBzZWN0aW9uX2V4aXQoIHNlbGYsIHNlY3Rpb24gKToKICAgICAgICAgcHJpbnQgaHRtbF9mb290ZXIKIAo=