Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCgojaWZuZGVmIFBVQkxJQ19GUERGX0RPQ19IXwojZGVmaW5lIFBVQkxJQ19GUERGX0RPQ19IXwoKI2luY2x1ZGUgImZwZGZ2aWV3LmgiCgovLyBFeHBvcnRlZCBGdW5jdGlvbnMKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYKCi8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfR2V0Rmlyc3RDaGlsZAovLyAgICAgICAgICBHZXQgdGhlIGZpcnN0IGNoaWxkIG9mIGEgYm9va21hcmsgaXRlbSwgb3IgdGhlIGZpcnN0IHRvcCBsZXZlbAovLyAgICAgICAgICBib29rbWFyayBpdGVtLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4gUmV0dXJuZWQgYnkKLy8gICAgICAgICAgRlBERl9Mb2FkRG9jdW1lbnQgb3IgRlBERl9Mb2FkTWVtRG9jdW1lbnQuCi8vICAgICAgICAgIGJvb2ttYXJrICAgIC0gICBIYW5kbGUgdG8gdGhlIGN1cnJlbnQgYm9va21hcmsuIENhbiBiZSBOVUxMIGlmIHlvdQovLyAgICAgICAgICB3YW50IHRvIGdldCB0aGUgZmlyc3QgdG9wIGxldmVsIGl0ZW0uCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBmaXJzdCBjaGlsZCBvciB0b3AgbGV2ZWwgYm9va21hcmsgaXRlbS4gTlVMTCBpZiBubwovLyAgICAgICAgICBjaGlsZCBvciB0b3AgbGV2ZWwgYm9va21hcmsgZm91bmQuCi8vCkRMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwKRlBERkJvb2ttYXJrX0dldEZpcnN0Q2hpbGQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CT09LTUFSSyBib29rbWFyayk7CgovLyBGdW5jdGlvbjogRlBERkJvb2ttYXJrX0dldE5leHRTaWJsaW5nCi8vICAgICAgICAgIEdldCBuZXh0IGJvb2ttYXJrIGl0ZW0gYXQgdGhlIHNhbWUgbGV2ZWwuCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LiBSZXR1cm5lZCBieQovLyAgICAgICAgICBGUERGX0xvYWREb2N1bWVudCBvciBGUERGX0xvYWRNZW1Eb2N1bWVudC4KLy8gICAgICAgICAgYm9va21hcmsgICAgLSAgIEhhbmRsZSB0byB0aGUgY3VycmVudCBib29rbWFyay4gQ2Fubm90IGJlIE5VTEwuCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBuZXh0IGJvb2ttYXJrIGl0ZW0gYXQgdGhlIHNhbWUgbGV2ZWwuIE5VTEwgaWYgdGhpcyBpcwovLyAgICAgICAgICB0aGUgbGFzdCBib29rbWFyayBhdCB0aGlzIGxldmVsLgovLwpETExFWFBPUlQgRlBERl9CT09LTUFSSyBTVERDQUxMCkZQREZCb29rbWFya19HZXROZXh0U2libGluZyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0JPT0tNQVJLIGJvb2ttYXJrKTsKCi8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfR2V0VGl0bGUKLy8gICAgICAgICAgR2V0IHRpdGxlIG9mIGEgYm9va21hcmsuCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGJvb2ttYXJrICAgIC0gICBIYW5kbGUgdG8gdGhlIGJvb2ttYXJrLgovLyAgICAgICAgICBidWZmZXIgICAgICAtICAgQnVmZmVyIGZvciB0aGUgdGl0bGUuIENhbiBiZSBOVUxMLgovLyAgICAgICAgICBidWZsZW4gICAgICAtICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzLiBDYW4gYmUgMC4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBOdW1iZXIgb2YgYnl0ZXMgdGhlIHRpdGxlIGNvbnN1bWVzLCBpbmNsdWRpbmcgdHJhaWxpbmcgemVyb3MuCi8vIENvbW1lbnRzOgovLyAgICAgICAgICBSZWdhcmRsZXNzIG9mIHRoZSBwbGF0Zm9ybSwgdGhlIHRpdGxlIGlzIGFsd2F5cyBpbiBVVEYtMTZMRQovLyAgICAgICAgICBlbmNvZGluZy4gVGhhdCBtZWFucyB0aGUgYnVmZmVyCi8vICAgICAgICAgIGNhbiBiZSB0cmVhdGVkIGFzIGFuIGFycmF5IG9mIFdPUkQgKG9uIEludGVsIGFuZCBjb21wYXRpYmxlIENQVXMpLAovLyAgICAgICAgICBlYWNoIFdPUkQgcmVwcmVzZW50aW5nIHRoZSBVbmljb2RlIG9mCi8vICAgICAgICAgIGEgY2hhcmFjdGVyKHNvbWUgc3BlY2lhbCBVbmljb2RlIG1heSB0YWtlIDIgV09SRHMpLlRoZSBzdHJpbmcgaXMKLy8gICAgICAgICAgZm9sbG93ZWQgYnkgdHdvIGJ5dGVzIG9mIHplcm8KLy8gICAgICAgICAgaW5kaWNhdGluZyB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCi8vCi8vICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvcgovLyAgICAgICAgICB0aGUgYnVmZmVyLCBldmVuIGlmIG5vIGJ1ZmZlciBpcyBzcGVjaWZpZWQKLy8gICAgICAgICAgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4gdGhlc2UgY2FzZXMsIHRoZSBidWZmZXIKLy8gICAgICAgICAgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi8vCkRMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkJvb2ttYXJrX0dldFRpdGxlKEZQREZfQk9PS01BUksgYm9va21hcmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOwoKLy8gRnVuY3Rpb246IEZQREZCb29rbWFya19GaW5kCi8vICAgICAgICAgIEZpbmQgYSBib29rbWFyayBpbiB0aGUgZG9jdW1lbnQsIHVzaW5nIHRoZSBib29rbWFyayB0aXRsZS4KLy8gUGFyYW1ldGVyczoKLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuIFJldHVybmVkIGJ5Ci8vICAgICAgICAgIEZQREZfTG9hZERvY3VtZW50IG9yIEZQREZfTG9hZE1lbURvY3VtZW50LgovLyAgICAgICAgICB0aXRsZSAgICAgICAtICAgVGhlIFVURi0xNkxFIGVuY29kZWQgVW5pY29kZSBzdHJpbmcgZm9yIHRoZSBib29rbWFyawovLyAgICAgICAgICB0aXRsZSB0byBiZSBzZWFyY2hlZC4gQ2FuJ3QgYmUgTlVMTC4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGZvdW5kIGJvb2ttYXJrIGl0ZW0uIE5VTEwgaWYgdGhlIHRpdGxlIGNhbid0IGJlIGZvdW5kLgovLyBDb21tZW50czoKLy8gICAgICAgICAgSXQgYWx3YXlzIHJldHVybnMgdGhlIGZpcnN0IGZvdW5kIGJvb2ttYXJrIGlmIG1vcmUgdGhhbiBvbmUKLy8gICAgICAgICAgYm9va21hcmtzIGhhdmUgdGhlIHNhbWUgdGl0bGUuCi8vCkRMTEVYUE9SVCBGUERGX0JPT0tNQVJLIFNURENBTEwgRlBERkJvb2ttYXJrX0ZpbmQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdGl0bGUpOwoKLy8gRnVuY3Rpb246IEZQREZCb29rbWFya19HZXREZXN0Ci8vICAgICAgICAgIEdldCB0aGUgZGVzdGluYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgYm9va21hcmsgaXRlbS4KLy8gUGFyYW1ldGVyczoKLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCi8vICAgICAgICAgIGJvb2ttYXJrICAgIC0gICBIYW5kbGUgdG8gdGhlIGJvb2ttYXJrLgovLyBSZXR1cm4gdmFsdWU6Ci8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgZGVzdGluYXRpb24gZGF0YS4gTlVMTCBpZiBubyBkZXN0aW5hdGlvbiBpcyBhc3NvY2lhdGVkCi8vICAgICAgICAgIHdpdGggdGhpcyBib29rbWFyay4KLy8KRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZCb29rbWFya19HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0tNQVJLIGJvb2ttYXJrKTsKCi8vIEZ1bmN0aW9uOiBGUERGQm9va21hcmtfR2V0QWN0aW9uCi8vICAgICAgICAgIEdldCB0aGUgYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIGJvb2ttYXJrIGl0ZW0uCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGJvb2ttYXJrICAgIC0gICBIYW5kbGUgdG8gdGhlIGJvb2ttYXJrLgovLyBSZXR1cm4gdmFsdWU6Ci8vICAgICAgICAgIEhhbmRsZSB0byB0aGUgYWN0aW9uIGRhdGEuIE5VTEwgaWYgbm8gYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi8vICAgICAgICAgIGJvb2ttYXJrLiBJbiB0aGlzIGNhc2UsIHRoZQovLyAgICAgICAgICBhcHBsaWNhdGlvbiBzaG91bGQgdHJ5IEZQREZCb29rbWFya19HZXREZXN0LgovLwpETExFWFBPUlQgRlBERl9BQ1RJT04gU1REQ0FMTCBGUERGQm9va21hcmtfR2V0QWN0aW9uKEZQREZfQk9PS01BUksgYm9va21hcmspOwoKI2RlZmluZSBQREZBQ1RJT05fVU5TVVBQT1JURUQgMCAgLy8gVW5zdXBwb3J0ZWQgYWN0aW9uIHR5cGUuCiNkZWZpbmUgUERGQUNUSU9OX0dPVE8gMSAgICAgICAgIC8vIEdvIHRvIGEgZGVzdGluYXRpb24gd2l0aGluIGN1cnJlbnQgZG9jdW1lbnQuCiNkZWZpbmUgUERGQUNUSU9OX1JFTU9URUdPVE8gMiAgIC8vIEdvIHRvIGEgZGVzdGluYXRpb24gd2l0aGluIGFub3RoZXIgZG9jdW1lbnQuCiNkZWZpbmUgUERGQUNUSU9OX1VSSSAzICAgICAgICAgIC8vIFVuaXZlcnNhbCBSZXNvdXJjZSBJZGVudGlmaWVyLCBpbmNsdWRpbmcgd2ViCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhZ2VzIGFuZCBvdGhlciBJbnRlcm5ldCBiYXNlZCByZXNvdXJjZXMuCiNkZWZpbmUgUERGQUNUSU9OX0xBVU5DSCA0ICAgICAgIC8vIExhdW5jaCBhbiBhcHBsaWNhdGlvbiBvciBvcGVuIGEgZmlsZS4KCi8vIEZ1bmN0aW9uOiBGUERGQWN0aW9uX0dldFR5cGUKLy8gICAgICAgICAgR2V0IHR5cGUgb2YgYW4gYWN0aW9uLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgICAgICBhY3Rpb24gICAgICAtICAgSGFuZGxlIHRvIHRoZSBhY3Rpb24uCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgQSB0eXBlIG51bWJlciBhcyBkZWZpbmVkIGFib3ZlLgovLwpETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZBY3Rpb25fR2V0VHlwZShGUERGX0FDVElPTiBhY3Rpb24pOwoKLy8gRnVuY3Rpb246IEZQREZBY3Rpb25fR2V0RGVzdAovLyAgICAgICAgICBHZXQgZGVzdGluYXRpb24gb2YgYW4gYWN0aW9uLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4KLy8gICAgICAgICAgYWN0aW9uICAgICAgLSAgIEhhbmRsZSB0byB0aGUgYWN0aW9uLiBJdCBtdXN0IGJlIGEgR09UTyBvcgovLyAgICAgICAgICBSRU1PVEVHT1RPIGFjdGlvbi4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGRhdGEuCi8vIENvbW1lbnRzOgovLyAgICAgICAgICBJbiBjYXNlIG9mIHJlbW90ZSBnb3RvIGFjdGlvbiwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBmaXJzdCB1c2UKLy8gICAgICAgICAgRlBERkFjdGlvbl9HZXRGaWxlUGF0aCB0bwovLyAgICAgICAgICBnZXQgZmlsZSBwYXRoLCB0aGVuIGxvYWQgdGhhdCBwYXJ0aWN1bGFyIGRvY3VtZW50LCBhbmQgdXNlIGl0cwovLyAgICAgICAgICBkb2N1bWVudCBoYW5kbGUgdG8gY2FsbCB0aGlzCi8vICAgICAgICAgIGZ1bmN0aW9uLgovLwpETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkFjdGlvbl9HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9BQ1RJT04gYWN0aW9uKTsKCi8vIEZ1bmN0aW9uOiBGUERGQWN0aW9uX0dldEZpbGVQYXRoCi8vICAgICAgICAgIEdldCBmaWxlIHBhdGggb2YgYSByZW1vdGUgZ290byBhY3Rpb24uCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGFjdGlvbiAgICAtICAgSGFuZGxlIHRvIHRoZSBhY3Rpb24uIE11c3QgYmUgYSBSRU1PVEVHT1RPIG9yCi8vICAgICAgICAgICAgICAgICAgICAgICAgTEFVTkNIIGFjdGlvbi4KLy8gICAgICAgICAgYnVmZmVyICAgIC0gICBBIGJ1ZmZlciBmb3Igb3V0cHV0IHRoZSBwYXRoIHN0cmluZy4gQ2FuIGJlIE5VTEwuCi8vICAgICAgICAgIGJ1ZmxlbiAgICAtICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMuIENhbiBiZSAwLgovLyBSZXR1cm4gdmFsdWU6Ci8vICAgICAgICAgIE51bWJlciBvZiBieXRlcyB0aGUgZmlsZSBwYXRoIGNvbnN1bWVzLCBpbmNsdWRpbmcgdHJhaWxpbmcgemVyby4KLy8KLy8gQ29tbWVudHM6Ci8vICAgICAgICAgIFRoZSBmaWxlIHBhdGggaXMgVVRGLTggZW5jb2RlZC4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mCi8vICAgICAgICAgIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgYnVmZmVyLCBldmVuIHdoZW4gdGhlcmUgaXMgbm8gYnVmZmVyCi8vICAgICAgICAgIHNwZWNpZmllZCwgb3IgdGhlIGJ1ZmZlciBzaXplIGlzIGxlc3MgdGhlbiByZXF1aXJlZC4gSW4gdGhpcyBjYXNlLAovLyAgICAgICAgICB0aGUgYnVmZmVyIHdpbGwgbm90IGJlIG1vZGlmaWVkLgovLwpETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMCkZQREZBY3Rpb25fR2V0RmlsZVBhdGgoRlBERl9BQ1RJT04gYWN0aW9uLCB2b2lkKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsKCi8vIEZ1bmN0aW9uOiBGUERGQWN0aW9uX0dldFVSSVBhdGgKLy8gICAgICAgICAgR2V0IFVSSSBwYXRoIG9mIGEgVVJJIGFjdGlvbi4KLy8gUGFyYW1ldGVyczoKLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCi8vICAgICAgICAgIGFjdGlvbiAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGFjdGlvbi4gTXVzdCBiZSBhIFVSSSBhY3Rpb24uCi8vICAgICAgICAgIGJ1ZmZlciAgICAgIC0gICBBIGJ1ZmZlciBmb3Igb3V0cHV0IHRoZSBwYXRoIHN0cmluZy4gQ2FuIGJlIE5VTEwuCi8vICAgICAgICAgIGJ1ZmxlbiAgICAgIC0gICBUaGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIG51bWJlciBvZiBieXRlcy4gQ2FuIGJlIDAuCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgTnVtYmVyIG9mIGJ5dGVzIHRoZSBVUkkgcGF0aCBjb25zdW1lcywgaW5jbHVkaW5nIHRyYWlsaW5nIHplcm9zLgovLyBDb21tZW50czoKLy8gICAgICAgICAgVGhlIFVSSSBwYXRoIGlzIGFsd2F5cyBlbmNvZGVkIGluIDctYml0IEFTQ0lJLgovLwovLyAgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBidWZmZXIsCi8vICAgICAgICAgIGV2ZW4gd2hlbiB0aGVyZSBpcyBubyBidWZmZXIgc3BlY2lmaWVkLCBvciB0aGUgYnVmZmVyIHNpemUgaXMgbGVzcwovLyAgICAgICAgICB0aGVuIHJlcXVpcmVkLiBJbiB0aGlzIGNhc2UsIHRoZSBidWZmZXIgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi8vCkRMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkFjdGlvbl9HZXRVUklQYXRoKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQUNUSU9OIGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zmxlbik7CgovLyBGdW5jdGlvbjogRlBERkRlc3RfR2V0UGFnZUluZGV4Ci8vICAgICAgICAgIEdldCBwYWdlIGluZGV4IG9mIGEgZGVzdGluYXRpb24uCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGRvY3VtZW50ICAgIC0gICBIYW5kbGUgdG8gdGhlIGRvY3VtZW50LgovLyAgICAgICAgICBkZXN0ICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkZXN0aW5hdGlvbi4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBUaGUgcGFnZSBpbmRleC4gU3RhcnRpbmcgZnJvbSAwIGZvciB0aGUgZmlyc3QgcGFnZS4KLy8KRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGRGVzdF9HZXRQYWdlSW5kZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ERVNUIGRlc3QpOwoKLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldExpbmtBdFBvaW50Ci8vICAgICBGaW5kIGEgbGluayBhdCBzcGVjaWZpZWQgcG9pbnQgb24gYSBkb2N1bWVudCBwYWdlLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgZG9jdW1lbnQgcGFnZS4KLy8gICAgIHggICAgICAgICAgIC0gICBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSBwb2ludCwgc3BlY2lmaWVkIGluIHBhZ2UKLy8gICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlIHN5c3RlbS4KLy8gICAgIHkgICAgICAgICAgIC0gICBUaGUgeSBjb29yZGluYXRlIG9mIHRoZSBwb2ludCwgc3BlY2lmaWVkIGluIHBhZ2UKLy8gICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlIHN5c3RlbS4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgSGFuZGxlIHRvIHRoZSBsaW5rLiBOVUxMIGlmIG5vIGxpbmsgZm91bmQgYXQgdGhhdCBwb2ludC4KLy8gQ29tbWVudHM6Ci8vICAgICBUaGUgcG9pbnQgY29vcmRpbmF0ZXMgYXJlIHNwZWNpZmllZCBpbiBwYWdlIGNvb3JkaW5hdGUgc3lzdGVtLiBZb3UgY2FuCi8vICAgICBjb252ZXJ0IGNvb3JkaW5hdGVzIGZyb20gc2NyZWVuIHN5c3RlbSB0byBwYWdlIHN5c3RlbSB1c2luZwovLyAgICAgRlBERl9EZXZpY2VUb1BhZ2UoKS4KLy8KRExMRVhQT1JUIEZQREZfTElOSyBTVERDQUxMIEZQREZMaW5rX0dldExpbmtBdFBvaW50KEZQREZfUEFHRSBwYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeSk7CgovLyBGdW5jdGlvbjogRlBERkxpbmtfR2V0TGlua1pPcmRlckF0UG9pbnQKLy8gICAgIEZpbmQgdGhlIHotb3JkZXIgb2YgYSBsaW5rIGF0IHNwZWNpZmllZCBwb2ludCBvbiBhIGRvY3VtZW50IHBhZ2UuCi8vIFBhcmFtZXRlcnM6Ci8vICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudCBwYWdlLgovLyAgICAgeCAgICAgICAgICAgLSAgIFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LCBzcGVjaWZpZWQgaW4gcGFnZQovLyAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGUgc3lzdGVtLgovLyAgICAgeSAgICAgICAgICAgLSAgIFRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LCBzcGVjaWZpZWQgaW4gcGFnZQovLyAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGUgc3lzdGVtLgovLyBSZXR1cm4gdmFsdWU6Ci8vICAgICBaLW9yZGVyIG9mIHRoZSBsaW5rLCBvciAtMSBpZiBubyBsaW5rIGZvdW5kIGF0IHRoYXQgcG9pbnQuCi8vICAgICBIaWdoZXIgbnVtYmVycyBhcmUgY2xvc2VyIHRvIHRoZSBmcm9udC4KLy8gQ29tbWVudHM6Ci8vICAgICBUaGUgcG9pbnQgY29vcmRpbmF0ZXMgYXJlIHNwZWNpZmllZCBpbiBwYWdlIGNvb3JkaW5hdGUgc3lzdGVtLiBZb3UgY2FuCi8vICAgICBjb252ZXJ0IGNvb3JkaW5hdGVzIGZyb20gc2NyZWVuIHN5c3RlbSB0byBwYWdlIHN5c3RlbSB1c2luZwovLyAgICAgRlBERl9EZXZpY2VUb1BhZ2UoKS4KLy8KRExMRVhQT1JUIGludCBTVERDQUxMCkZQREZMaW5rX0dldExpbmtaT3JkZXJBdFBvaW50KEZQREZfUEFHRSBwYWdlLCBkb3VibGUgeCwgZG91YmxlIHkpOwoKLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldERlc3QKLy8gICAgICAgICAgR2V0IGRlc3RpbmF0aW9uIGluZm8gb2YgYSBsaW5rLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBkb2N1bWVudC4KLy8gICAgICAgICAgbGluayAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgbGluay4gUmV0dXJuZWQgYnkKLy8gICAgICAgICAgRlBERkxpbmtfR2V0TGlua0F0UG9pbnQuCi8vIFJldHVybiB2YWx1ZToKLy8gICAgICAgICAgSGFuZGxlIHRvIHRoZSBkZXN0aW5hdGlvbi4gTlVMTCBpZiB0aGVyZSBpcyBubyBkZXN0aW5hdGlvbgovLyAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmssIGluIHRoaXMgY2FzZQovLyAgICAgICAgICB0aGUgYXBwbGljYXRpb24gc2hvdWxkIHRyeSBGUERGTGlua19HZXRBY3Rpb24uCi8vCkRMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGTGlua19HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfTElOSyBsaW5rKTsKCi8vIEZ1bmN0aW9uOiBGUERGTGlua19HZXRBY3Rpb24KLy8gICAgICAgICAgR2V0IGFjdGlvbiBpbmZvIG9mIGEgbGluay4KLy8gUGFyYW1ldGVyczoKLy8gICAgICAgICAgbGluayAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgbGluay4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBIYW5kbGUgdG8gdGhlIGFjdGlvbi4gTlVMTCBpZiB0aGVyZSBpcyBubyBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZQovLyAgICAgICAgICBsaW5rLgovLwpETExFWFBPUlQgRlBERl9BQ1RJT04gU1REQ0FMTCBGUERGTGlua19HZXRBY3Rpb24oRlBERl9MSU5LIGxpbmspOwoKLy8gRnVuY3Rpb246IEZQREZMaW5rX0VudW1lcmF0ZQovLyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHdvdWxkIGVudW1lcmF0ZSBhbGwgdGhlIGxpbmsgYW5ub3RhdGlvbnMgaW4gYSBzaW5nbGUKLy8gICAgICAgICAgUERGIHBhZ2UuCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIHBhZ2VbaW5dICAgICAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4KLy8gICAgICAgICAgc3RhcnRQb3NbaW4sb3V0XSAgICAtICAgVGhlIHN0YXJ0IHBvc2l0aW9uIHRvIGVudW1lcmF0ZSB0aGUgbGluawovLyAgICAgICAgICBhbm5vdGF0aW9ucywgd2hpY2ggc2hvdWxkIGJlIHNwZWNpZmllZCB0byBzdGFydCBmcm9tCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAgIDAgZm9yIHRoZSBmaXJzdCBjYWxsLCBhbmQgd291bGQgcmVjZWl2ZSB0aGUKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IHBvc2l0aW9uIGZvciBlbnVtZXJhdGluZyB0byBzdGFydCBmcm9tLgovLyAgICAgICAgICBsaW5rQW5ub3Rbb3V0XSAgICAgIC0gICBSZWNlaXZlIHRoZSBsaW5rIGhhbmRsZS4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBUUlVFIGlmIHN1Y2NjZWVkLCBlbHNlIEZhbHNlOwovLwpETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfRW51bWVyYXRlKEZQREZfUEFHRSBwYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RhcnRQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9MSU5LKiBsaW5rQW5ub3QpOwoKLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldEFubm90UmVjdAovLyAgICAgICAgICBHZXQgdGhlIGFubm90YXRpb24gcmVjdGFuZ2xlLiAoU3BlY2lmaWVkIGJ5IHRoZSChsFJlY3ShsSBlbnRyeSBvZgovLyAgICAgICAgICBhbm5vdGF0aW9uIGRpY3Rpb25hcnkpLgovLyBQYXJhbWV0ZXJzOgovLyAgICAgICAgICBsaW5rQW5ub3RbaW5dICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGxpbmsgYW5ub3RhdGlvbi4KLy8gICAgICAgICAgcmVjdFtvdXRdICAgICAgICAgICAtICAgVGhlIGFubm90YXRpb24gcmVjdC4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBUUlVFIGlmIHN1Y2NjZWVkLCBlbHNlIEZhbHNlOwovLwpETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfR2V0QW5ub3RSZWN0KEZQREZfTElOSyBsaW5rQW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfUkVDVEYqIHJlY3QpOwoKLy8gRnVuY3Rpb246IEZQREZMaW5rX0NvdW50UXVhZFBvaW50cwovLyAgICAgICAgICBHZXQgdGhlIGNvdW50IG9mIHF1YWRyaWxhdGVyYWwgcG9pbnRzIHRvIHRoZSBsaW5rIGFubm90YXRpb24uCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGxpbmtBbm5vdFtpbl0gICAgICAgLSAgIEhhbmRsZSB0byB0aGUgbGluayBhbm5vdGF0aW9uLgovLyBSZXR1cm4gdmFsdWU6Ci8vICAgICAgICAgIFRoZSBjb3VudCBvZiBxdWFkcmlsYXRlcmFsIHBvaW50cy4KLy8KRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZMaW5rX0NvdW50UXVhZFBvaW50cyhGUERGX0xJTksgbGlua0Fubm90KTsKCi8qIF9GU19ERUZfU1RSVUNUVVJFX1FVQURQT0lOVFNGXyAqLwojaWZuZGVmIF9GU19ERUZfU1RSVUNUVVJFX1FVQURQT0lOVFNGXwojZGVmaW5lIF9GU19ERUZfU1RSVUNUVVJFX1FVQURQT0lOVFNGXwp0eXBlZGVmIHN0cnVjdCBfRlNfUVVBRFBPSU5UU0YgewogIEZTX0ZMT0FUIHgxOwogIEZTX0ZMT0FUIHkxOwogIEZTX0ZMT0FUIHgyOwogIEZTX0ZMT0FUIHkyOwogIEZTX0ZMT0FUIHgzOwogIEZTX0ZMT0FUIHkzOwogIEZTX0ZMT0FUIHg0OwogIEZTX0ZMT0FUIHk0Owp9IEZTX1FVQURQT0lOVFNGOwojZW5kaWYgLyogX0ZTX0RFRl9TVFJVQ1RVUkVfUVVBRFBPSU5UU0ZfICovCgovLyBGdW5jdGlvbjogRlBERkxpbmtfR2V0UXVhZFBvaW50cwovLyAgICAgICAgICBHZXQgdGhlIHF1YWRyaWxhdGVyYWwgcG9pbnRzIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBsaW5rCi8vICAgICAgICAgIGFubm90YXRpb24uCi8vIFBhcmFtZXRlcnM6Ci8vICAgICAgICAgIGxpbmtBbm5vdFtpbl0gICAgICAgLSAgIEhhbmRsZSB0byB0aGUgbGluayBhbm5vdGF0aW9uLgovLyAgICAgICAgICBxdWFkSW5kZXhbaW5dICAgICAgIC0gICBUaGUgc3BlY2lmaWVkIHF1YWQgcG9pbnRzIGluZGV4LgovLyAgICAgICAgICBxdWFkUG9pbnRzW291dF0gICAgIC0gICBSZWNlaXZlIHRoZSBxdWFkcmlsYXRlcmFsIHBvaW50cy4KLy8gUmV0dXJuIHZhbHVlOgovLyAgICAgICAgICBUcnVlIGlmIHN1Y2NlZWQsIGVsc2UgRmFsc2UuCi8vCkRMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19HZXRRdWFkUG9pbnRzKEZQREZfTElOSyBsaW5rQW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFkSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX1FVQURQT0lOVFNGKiBxdWFkUG9pbnRzKTsKCi8vIEZ1bmN0aW9uOiBGUERGX0dldE1ldGFUZXh0Ci8vICAgICAgICAgIEdldCBhIHRleHQgZnJvbSBtZXRhIGRhdGEgb2YgdGhlIGRvY3VtZW50LiBSZXN1bHQgaXMgZW5jb2RlZCBpbgovLyAgICAgICAgICBVVEYtMTZMRS4KLy8gUGFyYW1ldGVyczoKLy8gICAgICAgICAgZG9jICAgICAgICAgLSAgIEhhbmRsZSB0byBhIGRvY3VtZW50Ci8vICAgICAgICAgIHRhZyAgICAgICAgIC0gICBUaGUgdGFnIGZvciB0aGUgbWV0YSBkYXRhLiBDdXJyZW50bHksIEl0IGNhbiBiZQovLyAgICAgICAgICAiVGl0bGUiLCAiQXV0aG9yIiwKLy8gICAgICAgICAgICAgICAgICAgICAgICAgICJTdWJqZWN0IiwgIktleXdvcmRzIiwgIkNyZWF0b3IiLCAiUHJvZHVjZXIiLAovLyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0aW9uRGF0ZSIsIG9yICJNb2REYXRlIi4KLy8gICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGVzZSB0YWdzIGFuZCB0aGVpcgovLyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZSB2YWx1ZXMsCi8vICAgICAgICAgICAgICAgICAgICAgICAgICBwbGVhc2UgcmVmZXIgdG8gUERGIFJlZmVyZW5jZSAxLjYsIHNlY3Rpb24gMTAuMi4xLAovLyAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvY3VtZW50IEluZm9ybWF0aW9uIERpY3Rpb25hcnkiLgovLyAgICAgICAgICBidWZmZXIgICAgICAtICAgQSBidWZmZXIgZm9yIG91dHB1dCB0aGUgdGl0bGUuIENhbiBiZSBOVUxMLgovLyAgICAgICAgICBidWZsZW4gICAgICAtICAgVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBudW1iZXIgb2YgYnl0ZXMuIENhbiBiZSAwLgovLyBSZXR1cm4gdmFsdWU6Ci8vICAgICAgICAgIE51bWJlciBvZiBieXRlcyB0aGUgdGl0bGUgY29uc3VtZXMsIGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvcy4KLy8gQ29tbWVudHM6Ci8vICAgICAgICAgIE5vIG1hdHRlciBvbiB3aGF0IHBsYXRmb3JtLCB0aGUgdGl0bGUgaXMgYWx3YXlzIG91dHB1dCBpbiBVVEYtMTZMRQovLyAgICAgICAgICBlbmNvZGluZywgd2hpY2ggbWVhbnMgdGhlIGJ1ZmZlcgovLyAgICAgICAgICBjYW4gYmUgcmVnYXJkZWQgYXMgYW4gYXJyYXkgb2YgV09SRCAob24gSW50ZWwgYW5kIGNvbXBhdGlibGUgQ1BVcyksCi8vICAgICAgICAgIGVhY2ggV09SRCByZXByZXNlbnQgdGhlIFVuaWNvZGUgb2YKLy8gICAgICAgICAgYSBjaGFyYWN0ZXIgKHNvbWUgc3BlY2lhbCBVbmljb2RlIG1heSB0YWtlIDIgV09SRHMpLiBUaGUgc3RyaW5nIGlzCi8vICAgICAgICAgIGZvbGxvd2VkIGJ5IHR3byBieXRlcyBvZiB6ZXJvCi8vICAgICAgICAgIGluZGljYXRpbmcgZW5kIG9mIHRoZSBzdHJpbmcuCi8vCi8vICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgYWx3YXlzIGluZGljYXRlZCBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZQovLyAgICAgICAgICBidWZmZXIsIGV2ZW4gd2hlbiB0aGVyZSBpcwovLyAgICAgICAgICBubyBidWZmZXIgc3BlY2lmaWVkLCBvciB0aGUgYnVmZmVyIHNpemUgaXMgbGVzcyB0aGVuIHJlcXVpcmVkLiBJbgovLyAgICAgICAgICB0aGlzIGNhc2UsIHRoZSBidWZmZXIgd2lsbCBub3QKLy8gICAgICAgICAgYmUgbW9kaWZpZWQuCi8vCkRMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERl9HZXRNZXRhVGV4dChGUERGX0RPQ1VNRU5UIGRvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyB0YWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zmxlbik7CgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZiAgLy8gUFVCTElDX0ZQREZfRE9DX0hfCg==