CiAgICAgICAgICAgICAgICAgICAgU2NhdHRlcmxpc3QgQ3J5cHRvZ3JhcGhpYyBBUEkKICAgICAgICAgICAgICAgICAgIApJTlRST0RVQ1RJT04KClRoZSBTY2F0dGVybGlzdCBDcnlwdG8gQVBJIHRha2VzIHBhZ2UgdmVjdG9ycyAoc2NhdHRlcmxpc3RzKSBhcwphcmd1bWVudHMsIGFuZCB3b3JrcyBkaXJlY3RseSBvbiBwYWdlcy4gIEluIHNvbWUgY2FzZXMgKGUuZy4gRUNCCm1vZGUgY2lwaGVycyksIHRoaXMgd2lsbCBhbGxvdyBmb3IgcGFnZXMgdG8gYmUgZW5jcnlwdGVkIGluLXBsYWNlCndpdGggbm8gY29weWluZy4KCk9uZSBvZiB0aGUgaW5pdGlhbCBnb2FscyBvZiB0aGlzIGRlc2lnbiB3YXMgdG8gcmVhZGlseSBzdXBwb3J0IElQc2VjLApzbyB0aGF0IHByb2Nlc3NpbmcgY2FuIGJlIGFwcGxpZWQgdG8gcGFnZWQgc2tiJ3Mgd2l0aG91dCB0aGUgbmVlZApmb3IgbGluZWFyaXphdGlvbi4KCgpERVRBSUxTCgpBdCB0aGUgbG93ZXN0IGxldmVsIGFyZSBhbGdvcml0aG1zLCB3aGljaCByZWdpc3RlciBkeW5hbWljYWxseSB3aXRoIHRoZQpBUEkuCgonVHJhbnNmb3JtcycgYXJlIHVzZXItaW5zdGFudGlhdGVkIG9iamVjdHMsIHdoaWNoIG1haW50YWluIHN0YXRlLCBoYW5kbGUgYWxsCm9mIHRoZSBpbXBsZW1lbnRhdGlvbiBsb2dpYyAoZS5nLiBtYW5pcHVsYXRpbmcgcGFnZSB2ZWN0b3JzKSBhbmQgcHJvdmlkZSBhbiAKYWJzdHJhY3Rpb24gdG8gdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtcy4gIEhvd2V2ZXIsIGF0IHRoZSB1c2VyIApsZXZlbCB0aGV5IGFyZSB2ZXJ5IHNpbXBsZS4KCkNvbmNlcHR1YWxseSwgdGhlIEFQSSBsYXllcmluZyBsb29rcyBsaWtlIHRoaXM6CgogIFt0cmFuc2Zvcm0gYXBpXSAgKHVzZXIgaW50ZXJmYWNlKQogIFt0cmFuc2Zvcm0gb3BzXSAgKHBlci10eXBlIGxvZ2ljIGdsdWUgZS5nLiBjaXBoZXIuYywgY29tcHJlc3MuYykKICBbYWxnb3JpdGhtIGFwaV0gIChmb3IgcmVnaXN0ZXJpbmcgYWxnb3JpdGhtcykKICAKVGhlIGlkZWEgaXMgdG8gbWFrZSB0aGUgdXNlciBpbnRlcmZhY2UgYW5kIGFsZ29yaXRobSByZWdpc3RyYXRpb24gQVBJCnZlcnkgc2ltcGxlLCB3aGlsZSBoaWRpbmcgdGhlIGNvcmUgbG9naWMgZnJvbSBib3RoLiAgTWFueSBnb29kIGlkZWFzCmZyb20gZXhpc3RpbmcgQVBJcyBzdWNoIGFzIENyeXB0b2FwaSBhbmQgTmV0dGxlIGhhdmUgYmVlbiBhZGFwdGVkIGZvciB0aGlzLgoKVGhlIEFQSSBjdXJyZW50bHkgc3VwcG9ydHMgdGhyZWUgdHlwZXMgb2YgdHJhbnNmb3JtczogQ2lwaGVycywgRGlnZXN0cyBhbmQKQ29tcHJlc3NvcnMuICBUaGUgY29tcHJlc3Npb24gYWxnb3JpdGhtcyBlc3BlY2lhbGx5IHNlZW0gdG8gYmUgcGVyZm9ybWluZwp2ZXJ5IHdlbGwgc28gZmFyLgoKU3VwcG9ydCBmb3IgaGFyZHdhcmUgY3J5cHRvIGRldmljZXMgdmlhIGFuIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UgaXMKdW5kZXIgZGV2ZWxvcG1lbnQuCgpIZXJlJ3MgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBBUEk6CgoJI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgoJI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgoJI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CgkKCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1syXTsKCWNoYXIgcmVzdWx0WzEyOF07CglzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbTsKCXN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKCQoJdGZtID0gY3J5cHRvX2FsbG9jX2hhc2goIm1kNSIsIDAsIENSWVBUT19BTEdfQVNZTkMpOwoJaWYgKElTX0VSUih0Zm0pKQoJCWZhaWwoKTsKCQkKCS8qIC4uLiBzZXQgdXAgdGhlIHNjYXR0ZXJsaXN0cyAuLi4gKi8KCglkZXNjLnRmbSA9IHRmbTsKCWRlc2MuZmxhZ3MgPSAwOwoJCglpZiAoY3J5cHRvX2hhc2hfZGlnZXN0KCZkZXNjLCAmc2csIDIsIHJlc3VsdCkpCgkJZmFpbCgpOwoJCgljcnlwdG9fZnJlZV9oYXNoKHRmbSk7CgogICAgCk1hbnkgcmVhbCBleGFtcGxlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSByZWdyZXNzaW9uIHRlc3QgbW9kdWxlICh0Y3J5cHQuYykuCgoKQ09ORklHVVJBVElPTiBOT1RFUwoKQXMgVHJpcGxlIERFUyBpcyBwYXJ0IG9mIHRoZSBERVMgbW9kdWxlLCBmb3IgdGhvc2UgdXNpbmcgbW9kdWxhciBidWlsZHMsCmFkZCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gL2V0Yy9tb2Rwcm9iZS5jb25mOgoKICBhbGlhcyBkZXMzX2VkZSBkZXMKClRoZSBOdWxsIGFsZ29yaXRobXMgcmVzaWRlIGluIHRoZSBjcnlwdG9fbnVsbCBtb2R1bGUsIHNvIHRoZXNlIGxpbmVzCnNob3VsZCBhbHNvIGJlIGFkZGVkOgoKICBhbGlhcyBjaXBoZXJfbnVsbCBjcnlwdG9fbnVsbAogIGFsaWFzIGRpZ2VzdF9udWxsIGNyeXB0b19udWxsCiAgYWxpYXMgY29tcHJlc3NfbnVsbCBjcnlwdG9fbnVsbAoKVGhlIFNIQTM4NCBhbGdvcml0aG0gc2hhcmVzIGNvZGUgd2l0aGluIHRoZSBTSEE1MTIgbW9kdWxlLCBzbyB5b3UnbGwKYWxzbyBuZWVkOgogIGFsaWFzIHNoYTM4NCBzaGE1MTIKCgpERVZFTE9QRVIgTk9URVMKClRyYW5zZm9ybXMgbWF5IG9ubHkgYmUgYWxsb2NhdGVkIGluIHVzZXIgY29udGV4dCwgYW5kIGNyeXB0b2dyYXBoaWMKbWV0aG9kcyBtYXkgb25seSBiZSBjYWxsZWQgZnJvbSBzb2Z0aXJxIGFuZCB1c2VyIGNvbnRleHRzLgoKV2hlbiB1c2luZyB0aGUgQVBJIGZvciBjaXBoZXJzLCBwZXJmb3JtYW5jZSB3aWxsIGJlIG9wdGltYWwgaWYgZWFjaApzY2F0dGVybGlzdCBjb250YWlucyBkYXRhIHdoaWNoIGlzIGEgbXVsdGlwbGUgb2YgdGhlIGNpcGhlcidzIGJsb2NrCnNpemUgKHR5cGljYWxseSA4IGJ5dGVzKS4gIFRoaXMgcHJldmVudHMgaGF2aW5nIHRvIGRvIGFueSBjb3B5aW5nCmFjcm9zcyBub24tYWxpZ25lZCBwYWdlIGZyYWdtZW50IGJvdW5kYXJpZXMuCgoKQURESU5HIE5FVyBBTEdPUklUSE1TCgpXaGVuIHN1Ym1pdHRpbmcgYSBuZXcgYWxnb3JpdGhtIGZvciBpbmNsdXNpb24sIGEgbWFuZGF0b3J5IHJlcXVpcmVtZW50CmlzIHRoYXQgYXQgbGVhc3QgYSBmZXcgdGVzdCB2ZWN0b3JzIGZyb20ga25vd24gc291cmNlcyAocHJlZmVyYWJseQpzdGFuZGFyZHMpIGJlIGluY2x1ZGVkLgoKQ29udmVydGluZyBleGlzdGluZyB3ZWxsIGtub3duIGNvZGUgaXMgcHJlZmVycmVkLCBhcyBpdCBpcyBtb3JlIGxpa2VseQp0byBoYXZlIGJlZW4gcmV2aWV3ZWQgYW5kIHdpZGVseSB0ZXN0ZWQuICBJZiBzdWJtaXR0aW5nIGNvZGUgZnJvbSBMR1BMCnNvdXJjZXMsIHBsZWFzZSBjb25zaWRlciBjaGFuZ2luZyB0aGUgbGljZW5zZSB0byBHUEwgKHNlZSBzZWN0aW9uIDMgb2YKdGhlIExHUEwpLgoKQWxnb3JpdGhtcyBzdWJtaXR0ZWQgbXVzdCBhbHNvIGJlIGdlbmVyYWxseSBwYXRlbnQtZnJlZSAoZS5nLiBJREVBCndpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBtYWlubGluZSB1bnRpbCBhcm91bmQgMjAxMSksIGFuZCBiZSBiYXNlZApvbiBhIHJlY29nbml6ZWQgc3RhbmRhcmQgYW5kL29yIGhhdmUgYmVlbiBzdWJqZWN0ZWQgdG8gYXBwcm9wcmlhdGUKcGVlciByZXZpZXcuCgpBbHNvIGNoZWNrIGZvciBhbnkgUkZDcyB3aGljaCBtYXkgcmVsYXRlIHRvIHRoZSB1c2Ugb2Ygc3BlY2lmaWMgYWxnb3JpdGhtcywKYXMgd2VsbCBhcyBnZW5lcmFsIGFwcGxpY2F0aW9uIG5vdGVzIHN1Y2ggYXMgUkZDMjQ1MSAoIlRoZSBFU1AgQ0JDLU1vZGUKQ2lwaGVyIEFsZ29yaXRobXMiKS4KCkl0J3MgYSBnb29kIGlkZWEgdG8gYXZvaWQgdXNpbmcgbG90cyBvZiBtYWNyb3MgYW5kIHVzZSBpbmxpbmVkIGZ1bmN0aW9ucwppbnN0ZWFkLCBhcyBnY2MgZG9lcyBhIGdvb2Qgam9iIHdpdGggaW5saW5pbmcsIHdoaWxlIGV4Y2Vzc2l2ZSB1c2Ugb2YKbWFjcm9zIGNhbiBjYXVzZSBjb21waWxhdGlvbiBwcm9ibGVtcyBvbiBzb21lIHBsYXRmb3Jtcy4KCkFsc28gY2hlY2sgdGhlIFRPRE8gbGlzdCBhdCB0aGUgd2ViIHNpdGUgbGlzdGVkIGJlbG93IHRvIHNlZSB3aGF0IHBlb3BsZQptaWdodCBhbHJlYWR5IGJlIHdvcmtpbmcgb24uCgoKQlVHUwoKU2VuZCBidWcgcmVwb3J0cyB0bzoKSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgpDYzogRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUByZWRoYXQuY29tPgoKCkZVUlRIRVIgSU5GT1JNQVRJT04KCkZvciBmdXJ0aGVyIHBhdGNoZXMgYW5kIHZhcmlvdXMgdXBkYXRlcywgaW5jbHVkaW5nIHRoZSBjdXJyZW50IFRPRE8KbGlzdCwgc2VlOgpodHRwOi8vZ29uZG9yLmFwYW5hLm9yZy5hdS9+aGVyYmVydC9jcnlwdG8vCgoKQVVUSE9SUwoKSmFtZXMgTW9ycmlzCkRhdmlkIFMuIE1pbGxlcgpIZXJiZXJ0IFh1CgoKQ1JFRElUUwoKVGhlIGZvbGxvd2luZyBwZW9wbGUgcHJvdmlkZWQgaW52YWx1YWJsZSBmZWVkYmFjayBkdXJpbmcgdGhlIGRldmVsb3BtZW50Cm9mIHRoZSBBUEk6CgogIEFsZXhleSBLdXpuZXR6b3YKICBSdXN0eSBSdXNzZWxsCiAgSGVyYmVydCBWYWxlcmlvIFJpZWRlbAogIEplZmYgR2FyemlrCiAgTWljaGFlbCBSaWNoYXJkc29uCiAgQW5kcmV3IE1vcnRvbgogIEluZ28gT2VzZXIKICBDaHJpc3RvcGggSGVsbHdpZwoKUG9ydGlvbnMgb2YgdGhpcyBBUEkgd2VyZSBkZXJpdmVkIGZyb20gdGhlIGZvbGxvd2luZyBwcm9qZWN0czoKICAKICBLZXJuZWxpIENyeXB0b2FwaSAoaHR0cDovL3d3dy5rZXJuZWxpLm9yZy8pCiAgICBBbGV4YW5kZXIgS2plbGRhYXMKICAgIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwKICAgIEt5bGUgTWNNYXJ0aW4KICAgIEplYW4tTHVjIENvb2tlCiAgICBEYXZpZCBCcnlzb24KICAgIENsZW1lbnMgRnJ1aHdpcnRoCiAgICBUb2JpYXMgUmluZ3N0cm9tCiAgICBIYXJhbGQgV2VsdGUKCmFuZDsKICAKICBOZXR0bGUgKGh0dHA6Ly93d3cubHlzYXRvci5saXUuc2Uvfm5pc3NlL25ldHRsZS8pCiAgICBOaWVscyBN9mxsZXIKCk9yaWdpbmFsIGRldmVsb3BlcnMgb2YgdGhlIGNyeXB0byBhbGdvcml0aG1zOgoKICBEYW5hIEwuIEhvdyAoREVTKQogIEFuZHJldyBUcmlkZ2VsbCBhbmQgU3RldmUgRnJlbmNoIChNRDQpCiAgQ29saW4gUGx1bWIgKE1ENSkKICBTdGV2ZSBSZWlkIChTSEExKQogIEplYW4tTHVjIENvb2tlIChTSEEyNTYsIFNIQTM4NCwgU0hBNTEyKQogIEthenVub3JpIE1peWF6YXdhIC8gVVNBR0kgKEhNQUMpCiAgTWF0dGhldyBTa2FsYSAoVHdvZmlzaCkKICBEYWcgQXJuZSBPc3ZpayAoU2VycGVudCkKICBCcmlhbiBHbGFkbWFuIChBRVMpCiAgS2FydGlrZXkgTWFoZW5kcmEgQmhhdHQgKENBU1Q2KQogIEpvbiBPYmVyaGVpZGUgKEFSQzQpCiAgSm91bmkgTWFsaW5lbiAoTWljaGFlbCBNSUMpCgpTSEExIGFsZ29yaXRobSBjb250cmlidXRvcnM6CiAgSmVhbi1GcmFuY29pcyBEaXZlCiAgCkRFUyBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogIFJhaW1hciBGYWxrZQogIEdpc2xlIFPmbGVuc21pbmRlCiAgTmllbHMgTfZsbGVyCgpCbG93ZmlzaCBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwKICBLeWxlIE1jTWFydGluCgpUd29maXNoIGFsZ29yaXRobSBjb250cmlidXRvcnM6CiAgV2VybmVyIEtvY2gKICBNYXJjIE11dHoKClNIQTI1Ni8zODQvNTEyIGFsZ29yaXRobSBjb250cmlidXRvcnM6CiAgQW5kcmV3IE1jRG9uYWxkCiAgS3lsZSBNY01hcnRpbgogIEhlcmJlcnQgVmFsZXJpbyBSaWVkZWwKICAKQUVTIGFsZ29yaXRobSBjb250cmlidXRvcnM6CiAgQWxleGFuZGVyIEtqZWxkYWFzCiAgSGVyYmVydCBWYWxlcmlvIFJpZWRlbAogIEt5bGUgTWNNYXJ0aW4KICBBZGFtIEouIFJpY2h0ZXIKICBGcnVod2lydGggQ2xlbWVucyAoaTU4NikKICBMaW51cyBUb3J2YWxkcyAoaTU4NikKCkNBU1Q1IGFsZ29yaXRobSBjb250cmlidXRvcnM6CiAgS2FydGlrZXkgTWFoZW5kcmEgQmhhdHQgKG9yaWdpbmFsIGRldmVsb3BlcnMgdW5rbm93biwgRlNGIGNvcHlyaWdodCkuCgpURUEvWFRFQSBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogIEFhcm9uIEdyb3RoZQogIE1pY2hhZWwgUmluZ2UKCktoYXphZCBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogIEFhcm9uIEdyb3RoZQoKV2hpcmxwb29sIGFsZ29yaXRobSBjb250cmlidXRvcnM6CiAgQWFyb24gR3JvdGhlCiAgSmVhbi1MdWMgQ29va2UKCkFudWJpcyBhbGdvcml0aG0gY29udHJpYnV0b3JzOgogIEFhcm9uIEdyb3RoZQoKVGlnZXIgYWxnb3JpdGhtIGNvbnRyaWJ1dG9yczoKICBBYXJvbiBHcm90aGUKClZJQSBQYWRMb2NrIGNvbnRyaWJ1dG9yczoKICBNaWNoYWwgTHVkdmlnCgpHZW5lcmljIHNjYXR0ZXJ3YWxrIGNvZGUgYnkgQWRhbSBKLiBSaWNodGVyIDxhZGFtQHlnZ2RyYXNpbC5jb20+CgpQbGVhc2Ugc2VuZCBhbnkgY3JlZGl0cyB1cGRhdGVzIG9yIGNvcnJlY3Rpb25zIHRvOgpIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+Cgo=