Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAovLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQoKI2lmbmRlZiBfRlBERkRPQ19IXwojZGVmaW5lIF9GUERGRE9DX0hfCgojaW5jbHVkZSAiZnBkZnZpZXcuaCIKCi8vIEV4cG9ydGVkIEZ1bmN0aW9ucwojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB7CiNlbmRpZgoKLy8gRnVuY3Rpb246IEZQREZCb29rbWFya19HZXRGaXJzdENoaWxkCi8vCQkJR2V0IHRoZSBmaXJzdCBjaGlsZCBvZiBhIGJvb2ttYXJrIGl0ZW0sIG9yIHRoZSBmaXJzdCB0b3AgbGV2ZWwgYm9va21hcmsgaXRlbS4KLy8gUGFyYW1ldGVyczoKLy8JCQlkb2N1bWVudAktCUhhbmRsZSB0byB0aGUgZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IG9yIEZQREZfTG9hZE1lbURvY3VtZW50LgovLwkJCWJvb2ttYXJrCS0JSGFuZGxlIHRvIHRoZSBjdXJyZW50IGJvb2ttYXJrLiBDYW4gYmUgTlVMTCBpZiB5b3Ugd2FudCB0byBnZXQgdGhlIGZpcnN0IHRvcCBsZXZlbCBpdGVtLgovLyBSZXR1cm4gdmFsdWU6Ci8vCQkJSGFuZGxlIHRvIHRoZSBmaXJzdCBjaGlsZCBvciB0b3AgbGV2ZWwgYm9va21hcmsgaXRlbS4gTlVMTCBpZiBubyBjaGlsZCBvciB0b3AgbGV2ZWwgYm9va21hcmsgZm91bmQuCi8vCkRMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0dldEZpcnN0Q2hpbGQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CT09LTUFSSyBib29rbWFyayk7CgovLyBGdW5jdGlvbjogRlBERkJvb2ttYXJrX0dldE5leHRTaWJsaW5nCi8vCQkJR2V0IG5leHQgYm9va21hcmsgaXRlbSBhdCB0aGUgc2FtZSBsZXZlbC4KLy8gUGFyYW1ldGVyczoKLy8JCQlkb2N1bWVudAktCUhhbmRsZSB0byB0aGUgZG9jdW1lbnQuIFJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IG9yIEZQREZfTG9hZE1lbURvY3VtZW50LgovLwkJCWJvb2ttYXJrCS0JSGFuZGxlIHRvIHRoZSBjdXJyZW50IGJvb2ttYXJrLiBDYW5ub3QgYmUgTlVMTC4KLy8gUmV0dXJuIHZhbHVlOgovLwkJCUhhbmRsZSB0byB0aGUgbmV4dCBib29rbWFyayBpdGVtIGF0IHRoZSBzYW1lIGxldmVsLiBOVUxMIGlmIHRoaXMgaXMgdGhlIGxhc3QgYm9va21hcmsgYXQgdGhpcyBsZXZlbC4KLy8KRExMRVhQT1JUIEZQREZfQk9PS01BUksgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0TmV4dFNpYmxpbmcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CT09LTUFSSyBib29rbWFyayk7CgovLyBGdW5jdGlvbjogRlBERkJvb2ttYXJrX0dldFRpdGxlCi8vCQkJR2V0IHRpdGxlIG9mIGEgYm9va21hcmsuCi8vIFBhcmFtZXRlcnM6Ci8vCQkJYm9va21hcmsJLQlIYW5kbGUgdG8gdGhlIGJvb2ttYXJrLgovLwkJCWJ1ZmZlciAgCS0JQnVmZmVyIGZvciB0aGUgdGl0bGUuIENhbiBiZSBOVUxMLgovLyAgICAgICAgICBidWZsZW4gICAgICAtICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzLiBDYW4gYmUgMC4KLy8gUmV0dXJuIHZhbHVlOgovLwkJCU51bWJlciBvZiBieXRlcyB0aGUgdGl0bGUgY29uc3VtZXMsIGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvcy4KLy8gQ29tbWVudHM6Ci8vCQkJUmVnYXJkbGVzcyBvZiB0aGUgcGxhdGZvcm0sIHRoZSB0aXRsZSBpcyBhbHdheXMgaW4gVVRGLTE2TEUgZW5jb2RpbmcuIFRoYXQgbWVhbnMgdGhlIGJ1ZmZlcgovLyAgICAgICAgICBjYW4gYmUgdHJlYXRlZCBhcyBhbiBhcnJheSBvZiBXT1JEIChvbiBJbnRlbCBhbmQgY29tcGF0aWJsZSBDUFVzKSwgZWFjaCBXT1JEIHJlcHJlc2VudGluZyB0aGUgVW5pY29kZSBvZgovLyAgICAgICAgICBhIGNoYXJhY3Rlcihzb21lIHNwZWNpYWwgVW5pY29kZSBtYXkgdGFrZSAyIFdPUkRzKS5UaGUgc3RyaW5nIGlzIGZvbGxvd2VkIGJ5IHR3byBieXRlcyBvZiB6ZXJvCi8vICAgICAgICAgIGluZGljYXRpbmcgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgovLwovLyAgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGFsd2F5cyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIGJ1ZmZlciwgZXZlbiBpZiBubyBidWZmZXIgaXMgc3BlY2lmaWVkCi8vICAgICAgICAgIG9yIHRoZSBidWZmZXIgc2l6ZSBpcyBsZXNzIHRoZW4gcmVxdWlyZWQuIEluIHRoZXNlIGNhc2VzLCB0aGUgYnVmZmVyIHdpbGwgbm90IGJlIG1vZGlmaWVkLgovLwpETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZCb29rbWFya19HZXRUaXRsZShGUERGX0JPT0tNQVJLIGJvb2ttYXJrLCB2b2lkKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsKCi8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfRmluZAovLwkJCUZpbmQgYSBib29rbWFyayBpbiB0aGUgZG9jdW1lbnQsIHVzaW5nIHRoZSBib29rbWFyayB0aXRsZS4KLy8gUGFyYW1ldGVyczogCi8vCQkJZG9jdW1lbnQJLQlIYW5kbGUgdG8gdGhlIGRvY3VtZW50LiBSZXR1cm5lZCBieSBGUERGX0xvYWREb2N1bWVudCBvciBGUERGX0xvYWRNZW1Eb2N1bWVudC4KLy8JCQl0aXRsZQkJLQlUaGUgVVRGLTE2TEUgZW5jb2RlZCBVbmljb2RlIHN0cmluZyBmb3IgdGhlIGJvb2ttYXJrIHRpdGxlIHRvIGJlIHNlYXJjaGVkLiBDYW4ndCBiZSBOVUxMLgovLyBSZXR1cm4gdmFsdWU6Ci8vCQkJSGFuZGxlIHRvIHRoZSBmb3VuZCBib29rbWFyayBpdGVtLiBOVUxMIGlmIHRoZSB0aXRsZSBjYW4ndCBiZSBmb3VuZC4KLy8gQ29tbWVudHM6Ci8vCQkJSXQgYWx3YXlzIHJldHVybnMgdGhlIGZpcnN0IGZvdW5kIGJvb2ttYXJrIGlmIG1vcmUgdGhhbiBvbmUgYm9va21hcmtzIGhhdmUgdGhlIHNhbWUgdGl0bGUuCi8vCkRMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0ZpbmQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURFU1RSSU5HIHRpdGxlKTsKCi8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfR2V0RGVzdAovLwkJCUdldCB0aGUgZGVzdGluYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgYm9va21hcmsgaXRlbS4KLy8gUGFyYW1ldGVyczoKLy8JCQlkb2N1bWVudAktCUhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCi8vCQkJYm9va21hcmsJLQlIYW5kbGUgdG8gdGhlIGJvb2ttYXJrLgovLyBSZXR1cm4gdmFsdWU6Ci8vCQkJSGFuZGxlIHRvIHRoZSBkZXN0aW5hdGlvbiBkYXRhLiBOVUxMIGlmIG5vIGRlc3RpbmF0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJvb2ttYXJrLgovLwpETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkJvb2ttYXJrX0dldERlc3QoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CT09LTUFSSyBib29rbWFyayk7CgovLyBGdW5jdGlvbjogRlBERkJvb2ttYXJrX0dldEFjdGlvbgovLwkJCUdldCB0aGUgYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIGJvb2ttYXJrIGl0ZW0uCi8vIFBhcmFtZXRlcnM6Ci8vCQkJYm9va21hcmsJLQlIYW5kbGUgdG8gdGhlIGJvb2ttYXJrLgovLyBSZXR1cm4gdmFsdWU6Ci8vCQkJSGFuZGxlIHRvIHRoZSBhY3Rpb24gZGF0YS4gTlVMTCBpZiBubyBhY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYm9va21hcmsuIEluIHRoaXMgY2FzZSwgdGhlIAovLwkJCWFwcGxpY2F0aW9uIHNob3VsZCB0cnkgRlBERkJvb2ttYXJrX0dldERlc3QuCi8vCkRMTEVYUE9SVCBGUERGX0FDVElPTiBTVERDQUxMIEZQREZCb29rbWFya19HZXRBY3Rpb24oRlBERl9CT09LTUFSSyBib29rbWFyayk7CgojZGVmaW5lIFBERkFDVElPTl9VTlNVUFBPUlRFRAkJMAkJLy8gVW5zdXBwb3J0ZWQgYWN0aW9uIHR5cGUuCiNkZWZpbmUgUERGQUNUSU9OX0dPVE8JCQkJMQkJLy8gR28gdG8gYSBkZXN0aW5hdGlvbiB3aXRoaW4gY3VycmVudCBkb2N1bWVudC4KI2RlZmluZSBQREZBQ1RJT05fUkVNT1RFR09UTwkJMgkJLy8gR28gdG8gYSBkZXN0aW5hdGlvbiB3aXRoaW4gYW5vdGhlciBkb2N1bWVudC4KI2RlZmluZSBQREZBQ1RJT05fVVJJCQkJCTMJCS8vIFVuaXZlcnNhbCBSZXNvdXJjZSBJZGVudGlmaWVyLCBpbmNsdWRpbmcgd2ViIHBhZ2VzIGFuZCAKCQkJCQkJCQkJCQkvLyBvdGhlciBJbnRlcm5ldCBiYXNlZCByZXNvdXJjZXMuCiNkZWZpbmUgUERGQUNUSU9OX0xBVU5DSAkJCTQJCS8vIExhdW5jaCBhbiBhcHBsaWNhdGlvbiBvciBvcGVuIGEgZmlsZS4KCi8vIEZ1bmN0aW9uOiBGUERGQWN0aW9uX0dldFR5cGUKLy8JCQlHZXQgdHlwZSBvZiBhbiBhY3Rpb24uCi8vIFBhcmFtZXRlcnM6Ci8vCQkJYWN0aW9uCQktCUhhbmRsZSB0byB0aGUgYWN0aW9uLgovLyBSZXR1cm4gdmFsdWU6Ci8vCQkJQSB0eXBlIG51bWJlciBhcyBkZWZpbmVkIGFib3ZlLgovLwpETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZBY3Rpb25fR2V0VHlwZShGUERGX0FDVElPTiBhY3Rpb24pOwoKLy8gRnVuY3Rpb246IEZQREZBY3Rpb25fR2V0RGVzdAovLwkJCUdldCBkZXN0aW5hdGlvbiBvZiBhbiBhY3Rpb24uCi8vIFBhcmFtZXRlcnM6Ci8vCQkJZG9jdW1lbnQJLQlIYW5kbGUgdG8gdGhlIGRvY3VtZW50LgovLwkJCWFjdGlvbgkJLQlIYW5kbGUgdG8gdGhlIGFjdGlvbi4gSXQgbXVzdCBiZSBhIEdPVE8gb3IgUkVNT1RFR09UTyBhY3Rpb24uCi8vIFJldHVybiB2YWx1ZToKLy8JCQlIYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGRhdGEuCi8vIENvbW1lbnRzOgovLwkJCUluIGNhc2Ugb2YgcmVtb3RlIGdvdG8gYWN0aW9uLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGZpcnN0IHVzZSBGUERGQWN0aW9uX0dldEZpbGVQYXRoIHRvCi8vCQkJZ2V0IGZpbGUgcGF0aCwgdGhlbiBsb2FkIHRoYXQgcGFydGljdWxhciBkb2N1bWVudCwgYW5kIHVzZSBpdHMgZG9jdW1lbnQgaGFuZGxlIHRvIGNhbGwgdGhpcwovLwkJCWZ1bmN0aW9uLgovLwpETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkFjdGlvbl9HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQUNUSU9OIGFjdGlvbik7CgovLyBGdW5jdGlvbjogRlBERkFjdGlvbl9HZXRVUklQYXRoCi8vCQkJR2V0IFVSSSBwYXRoIG9mIGEgVVJJIGFjdGlvbi4KLy8gUGFyYW1ldGVyczoKLy8JCQlkb2N1bWVudAktCUhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCi8vCQkJYWN0aW9uCQktCUhhbmRsZSB0byB0aGUgYWN0aW9uLiBNdXN0IGJlIGEgVVJJIGFjdGlvbi4KLy8JCQlidWZmZXIJCS0JQSBidWZmZXIgZm9yIG91dHB1dCB0aGUgcGF0aCBzdHJpbmcuIENhbiBiZSBOVUxMLgovLwkJCWJ1ZmxlbgkJLQlUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4gQ2FuIGJlIDAuCi8vIFJldHVybiB2YWx1ZToKLy8JCQlOdW1iZXIgb2YgYnl0ZXMgdGhlIFVSSSBwYXRoIGNvbnN1bWVzLCBpbmNsdWRpbmcgdHJhaWxpbmcgemVyb3MuCi8vIENvbW1lbnRzOgovLwkJCVRoZSBVUkkgcGF0aCBpcyBhbHdheXMgZW5jb2RlZCBpbiA3LWJpdCBBU0NJSS4KLy8gCi8vCQkJVGhlIHJldHVybiB2YWx1ZSBhbHdheXMgaW5kaWNhdGVkIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIGJ1ZmZlciwgZXZlbiB3aGVuIHRoZXJlIGlzCi8vCQkJbm8gYnVmZmVyIHNwZWNpZmllZCwgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4gdGhpcyBjYXNlLCB0aGUgYnVmZmVyIHdpbGwgbm90Ci8vCQkJYmUgbW9kaWZpZWQuCi8vCkRMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkFjdGlvbl9HZXRVUklQYXRoKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQUNUSU9OIGFjdGlvbiwgCgkJCQkJCQkJCQkJCQkgIHZvaWQqIGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZsZW4pOwoKLy8gRnVuY3Rpb246IEZQREZEZXN0X0dldFBhZ2VJbmRleAovLwkJCUdldCBwYWdlIGluZGV4IG9mIGEgZGVzdGluYXRpb24uCi8vIFBhcmFtZXRlcnM6Ci8vCQkJZG9jdW1lbnQJLQlIYW5kbGUgdG8gdGhlIGRvY3VtZW50LgovLwkJCWRlc3QJCS0JSGFuZGxlIHRvIHRoZSBkZXN0aW5hdGlvbi4KLy8gUmV0dXJuIHZhbHVlOgovLwkJCVRoZSBwYWdlIGluZGV4LiBTdGFydGluZyBmcm9tIDAgZm9yIHRoZSBmaXJzdCBwYWdlLgovLwpETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZEZXN0X0dldFBhZ2VJbmRleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0RFU1QgZGVzdCk7CgovLyBGdW5jdGlvbjogRlBERkxpbmtfR2V0TGlua0F0UG9pbnQKLy8JCQlGaW5kIGEgbGluayBhdCBzcGVjaWZpZWQgcG9pbnQgb24gYSBkb2N1bWVudCBwYWdlLgovLyBQYXJhbWV0ZXJzOgovLwkJCXBhZ2UJCS0JSGFuZGxlIHRvIHRoZSBkb2N1bWVudCBwYWdlLgovLwkJCXgJCQktCVRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LCBzcGVjaWZpZWQgaW4gcGFnZSBjb29yZGluYXRlIHN5c3RlbS4KLy8JCQl5CQkJLQlUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCwgc3BlY2lmaWVkIGluIHBhZ2UgY29vcmRpbmF0ZSBzeXN0ZW0uCi8vIFJldHVybiB2YWx1ZToKLy8JCQlIYW5kbGUgdG8gdGhlIGxpbmsuIE5VTEwgaWYgbm8gbGluayBmb3VuZCBhdCB0aGF0IHBvaW50LgovLyBDb21tZW50czoKLy8JCQlUaGUgcG9pbnQgY29vcmRpbmF0ZXMgYXJlIHNwZWNpZmllZCBpbiBwYWdlIGNvb3JkaW5hdGUgc3lzdGVtLiBZb3UgY2FuIGNvbnZlcnQgY29vcmRpbmF0ZXMgCi8vCQkJZnJvbSBzY3JlZW4gc3lzdGVtIHRvIHBhZ2Ugc3lzdGVtIHVzaW5nIEZQREZfRGV2aWNlVG9QYWdlIGZ1bmN0aW9ucy4KLy8KRExMRVhQT1JUIEZQREZfTElOSyBTVERDQUxMIEZQREZMaW5rX0dldExpbmtBdFBvaW50KEZQREZfUEFHRSBwYWdlLCBkb3VibGUgeCwgZG91YmxlIHkpOwoKLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldERlc3QKLy8JCQlHZXQgZGVzdGluYXRpb24gaW5mbyBvZiBhIGxpbmsuCi8vIFBhcmFtZXRlcnM6Ci8vCQkJZG9jdW1lbnQJLQlIYW5kbGUgdG8gdGhlIGRvY3VtZW50LgovLwkJCWxpbmsJCS0JSGFuZGxlIHRvIHRoZSBsaW5rLiBSZXR1cm5lZCBieSBGUERGTGlua19HZXRMaW5rQXRQb2ludC4KLy8gUmV0dXJuIHZhbHVlOgovLwkJCUhhbmRsZSB0byB0aGUgZGVzdGluYXRpb24uIE5VTEwgaWYgdGhlcmUgaXMgbm8gZGVzdGluYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBpbiB0aGlzIGNhc2UKLy8JCQl0aGUgYXBwbGljYXRpb24gc2hvdWxkIHRyeSBGUERGTGlua19HZXRBY3Rpb24uCi8vCkRMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGTGlua19HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfTElOSyBsaW5rKTsKCi8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRBY3Rpb24KLy8JCQlHZXQgYWN0aW9uIGluZm8gb2YgYSBsaW5rLgovLyBQYXJhbWV0ZXJzOgovLwkJCWxpbmsJCS0JSGFuZGxlIHRvIHRoZSBsaW5rLgovLyBSZXR1cm4gdmFsdWU6Ci8vCQkJSGFuZGxlIHRvIHRoZSBhY3Rpb24uIE5VTEwgaWYgdGhlcmUgaXMgbm8gYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluay4KLy8KRExMRVhQT1JUIEZQREZfQUNUSU9OIFNURENBTEwgRlBERkxpbmtfR2V0QWN0aW9uKEZQREZfTElOSyBsaW5rKTsKCi8vIEZ1bmN0aW9uOiBGUERGTGlua19FbnVtZXJhdGUKLy8JCQlUaGlzIGZ1bmN0aW9uIHdvdWxkIGVudW1lcmF0ZSBhbGwgdGhlIGxpbmsgYW5ub3RhdGlvbnMgaW4gYSBzaW5nbGUgUERGIHBhZ2UuCi8vIFBhcmFtZXRlcnM6Ci8vCQkJcGFnZVtpbl0JCQktCUhhbmRsZSB0byB0aGUgcGFnZS4KLy8JCQlzdGFydFBvc1tpbixvdXRdCS0JVGhlIHN0YXJ0IHBvc2l0aW9uIHRvIGVudW1lcmF0ZSB0aGUgbGluayBhbm5vdGF0aW9ucywgd2hpY2ggc2hvdWxkIGJlIHNwZWNpZmllZCB0byBzdGFydCBmcm9tIAovLwkJCQkJCQkJLQkwIGZvciB0aGUgZmlyc3QgY2FsbCwgYW5kIHdvdWxkIHJlY2VpdmUgdGhlIG5leHQgcG9zaXRpb24gZm9yIGVudW1lcmF0aW5nIHRvIHN0YXJ0IGZyb20uCi8vCQkJbGlua0Fubm90W291dF0JCS0JUmVjZWl2ZSB0aGUgbGluayBoYW5kbGUuCi8vIFJldHVybiB2YWx1ZToKLy8JCQlUUlVFIGlmIHN1Y2NjZWVkLCBlbHNlIEZhbHNlOwovLwpETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfRW51bWVyYXRlKEZQREZfUEFHRSBwYWdlLCBpbnQqIHN0YXJ0UG9zLCBGUERGX0xJTksqIGxpbmtBbm5vdCk7CgovLyBGdW5jdGlvbjogRlBERkxpbmtfR2V0QW5ub3RSZWN0Ci8vCQkJR2V0IHRoZSBhbm5vdGF0aW9uIHJlY3RhbmdsZS4gKFNwZWNpZmllZCBieSB0aGUgobBSZWN0obEgZW50cnkgb2YgYW5ub3RhdGlvbiBkaWN0aW9uYXJ5KS4KLy8gUGFyYW1ldGVyczoKLy8JCQlsaW5rQW5ub3RbaW5dCQktCUhhbmRsZSB0byB0aGUgbGluayBhbm5vdGF0aW9uLgovLwkJCXJlY3Rbb3V0XQkJCS0JVGhlIGFubm90YXRpb24gcmVjdC4KLy8gUmV0dXJuIHZhbHVlOgovLwkJCVRSVUUgaWYgc3VjY2NlZWQsIGVsc2UgRmFsc2U7Ci8vCkRMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19HZXRBbm5vdFJlY3QoRlBERl9MSU5LIGxpbmtBbm5vdCwgRlNfUkVDVEYqIHJlY3QpOwoKLy8gRnVuY3Rpb246IEZQREZMaW5rX0NvdW50UXVhZFBvaW50cwovLwkJCUdldCB0aGUgY291bnQgb2YgcXVhZHJpbGF0ZXJhbCBwb2ludHMgdG8gdGhlIGxpbmsgYW5ub3RhdGlvbi4KLy8gUGFyYW1ldGVyczoKLy8JCQlsaW5rQW5ub3RbaW5dCQktCUhhbmRsZSB0byB0aGUgbGluayBhbm5vdGF0aW9uLgovLyBSZXR1cm4gdmFsdWU6Ci8vCQkJVGhlIGNvdW50IG9mIHF1YWRyaWxhdGVyYWwgcG9pbnRzLgovLwpETExFWFBPUlQgaW50IFNURENBTEwgRlBERkxpbmtfQ291bnRRdWFkUG9pbnRzKEZQREZfTElOSyBsaW5rQW5ub3QpOwoKLyogX0ZTX0RFRl9TVFJVQ1RVUkVfUVVBRFBPSU5UU0ZfICovCiNpZm5kZWYgX0ZTX0RFRl9TVFJVQ1RVUkVfUVVBRFBPSU5UU0ZfCiNkZWZpbmUgX0ZTX0RFRl9TVFJVQ1RVUkVfUVVBRFBPSU5UU0ZfCnR5cGVkZWYgc3RydWN0IF9GU19RVUFEUE9JTlRTRgp7CglGU19GTE9BVCAgeDE7CglGU19GTE9BVCAgeTE7CglGU19GTE9BVCAgeDI7CglGU19GTE9BVCAgeTI7CglGU19GTE9BVCAgeDM7CglGU19GTE9BVCAgeTM7CglGU19GTE9BVCAgeDQ7CglGU19GTE9BVCAgeTQ7Cn0gRlNfUVVBRFBPSU5UU0Y7CiNlbmRpZiAvKiBfRlNfREVGX1NUUlVDVFVSRV9RVUFEUE9JTlRTRl8gKi8KCi8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRRdWFkUG9pbnRzCi8vCQkJR2V0IHRoZSBxdWFkcmlsYXRlcmFsIHBvaW50cyBmb3IgdGhlIHNwZWNpZmllZCBpbmRleCBpbiB0aGUgbGluayBhbm5vdGF0aW9uLgovLyBQYXJhbWV0ZXJzOgovLwkJCWxpbmtBbm5vdFtpbl0JCS0JSGFuZGxlIHRvIHRoZSBsaW5rIGFubm90YXRpb24uCi8vCQkJcXVhZEluZGV4W2luXQkJLQlUaGUgc3BlY2lmaWVkIHF1YWQgcG9pbnRzIGluZGV4LgovLwkJCXF1YWRQb2ludHNbb3V0XQkJLQlSZWNlaXZlIHRoZSBxdWFkcmlsYXRlcmFsIHBvaW50cy4KLy8gUmV0dXJuIHZhbHVlOgovLwkJCVRydWUgaWYgc3VjY2VlZCwgZWxzZSBGYWxzZS4KLy8KRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCwgaW50IHF1YWRJbmRleCwgRlNfUVVBRFBPSU5UU0YqIHF1YWRQb2ludHMpOwoKLy8gRnVuY3Rpb246IEZQREZfR2V0TWV0YVRleHQKLy8JCQlHZXQgYSB0ZXh0IGZyb20gbWV0YSBkYXRhIG9mIHRoZSBkb2N1bWVudC4gUmVzdWx0IGlzIGVuY29kZWQgaW4gVVRGLTE2TEUuCi8vIFBhcmFtZXRlcnM6Ci8vCQkJZG9jCQkJLQlIYW5kbGUgdG8gYSBkb2N1bWVudAovLwkJCXRhZwkJCS0JVGhlIHRhZyBmb3IgdGhlIG1ldGEgZGF0YS4gQ3VycmVudGx5LCBJdCBjYW4gYmUgIlRpdGxlIiwgIkF1dGhvciIsIAovLwkJCQkJCQkiU3ViamVjdCIsICJLZXl3b3JkcyIsICJDcmVhdG9yIiwgIlByb2R1Y2VyIiwgIkNyZWF0aW9uRGF0ZSIsIG9yICJNb2REYXRlIi4KLy8JCQkJCQkJRm9yIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoZXNlIHRhZ3MgYW5kIHRoZWlyIHJlc3BlY3RpdmUgdmFsdWVzLAovLwkJCQkJCQlwbGVhc2UgcmVmZXIgdG8gUERGIFJlZmVyZW5jZSAxLjYsIHNlY3Rpb24gMTAuMi4xLCAiRG9jdW1lbnQgSW5mb3JtYXRpb24gRGljdGlvbmFyeSIuCi8vCQkJYnVmZmVyCQktCUEgYnVmZmVyIGZvciBvdXRwdXQgdGhlIHRpdGxlLiBDYW4gYmUgTlVMTC4KLy8JCQlidWZsZW4JCS0JVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMuIENhbiBiZSAwLgovLyBSZXR1cm4gdmFsdWU6Ci8vCQkJTnVtYmVyIG9mIGJ5dGVzIHRoZSB0aXRsZSBjb25zdW1lcywgaW5jbHVkaW5nIHRyYWlsaW5nIHplcm9zLgovLyBDb21tZW50czoKLy8JCQlObyBtYXR0ZXIgb24gd2hhdCBwbGF0Zm9ybSwgdGhlIHRpdGxlIGlzIGFsd2F5cyBvdXRwdXQgaW4gVVRGLTE2TEUgZW5jb2RpbmcsIHdoaWNoIG1lYW5zIHRoZSBidWZmZXIgCi8vCQkJY2FuIGJlIHJlZ2FyZGVkIGFzIGFuIGFycmF5IG9mIFdPUkQgKG9uIEludGVsIGFuZCBjb21wYXRpYmxlIENQVXMpLCBlYWNoIFdPUkQgcmVwcmVzZW50IHRoZSBVbmljb2RlIG9mIAovLwkJCWEgY2hhcmFjdGVyIChzb21lIHNwZWNpYWwgVW5pY29kZSBtYXkgdGFrZSAyIFdPUkRzKS4gVGhlIHN0cmluZyBpcyBmb2xsb3dlZCBieSB0d28gYnl0ZXMgb2YgemVybyAKLy8JCQlpbmRpY2F0aW5nIGVuZCBvZiB0aGUgc3RyaW5nLgovLwovLwkJCVRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGluZGljYXRlZCBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBidWZmZXIsIGV2ZW4gd2hlbiB0aGVyZSBpcwovLwkJCW5vIGJ1ZmZlciBzcGVjaWZpZWQsIG9yIHRoZSBidWZmZXIgc2l6ZSBpcyBsZXNzIHRoZW4gcmVxdWlyZWQuIEluIHRoaXMgY2FzZSwgdGhlIGJ1ZmZlciB3aWxsIG5vdAovLwkJCWJlIG1vZGlmaWVkLgovLwpETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZfR2V0TWV0YVRleHQoRlBERl9ET0NVTUVOVCBkb2MsIEZQREZfQllURVNUUklORyB0YWcsCgkJCQkJCQkJCQkJCSB2b2lkKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsKCgojaWZkZWYgX19jcGx1c3BsdXMKfTsKI2VuZGlmCgojZW5kaWYJLy8gX0ZQREZET0NfSF8K