XGlucHV0IHRleGluZm8gICAgQGMgLSotdGV4aW5mby0qLQpAYyAlKipzdGFydCBvZiBoZWFkZXIKQHNldGZpbGVuYW1lIG1wZnIuaW5mbwpAZG9jdW1lbnRlbmNvZGluZyBJU08tODg1OS0xCkBzZXQgVkVSU0lPTiAyLjQuMQpAc2V0IFVQREFURUQtTU9OVEggRmVicnVhcnkgMjAwOQpAc2V0dGl0bGUgR05VIE1QRlIgQHZhbHVle1ZFUlNJT059CkBzeW5pbmRleCB0cCBmbgpAaWZ0ZXgKQGFmb3VycGFwZXIKQGVuZCBpZnRleApAY29tbWVudCAlKiplbmQgb2YgaGVhZGVyCgpAY29weWluZwpUaGlzIG1hbnVhbCBkb2N1bWVudHMgaG93IHRvIGluc3RhbGwgYW5kIHVzZSB0aGUgTXVsdGlwbGUgUHJlY2lzaW9uCkZsb2F0aW5nLVBvaW50IFJlbGlhYmxlIExpYnJhcnksIHZlcnNpb24gQHZhbHVle1ZFUlNJT059LgoKQ29weXJpZ2h0IDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgpQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgZG9jdW1lbnQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UsIFZlcnNpb24gMS4yIG9yIGFueSBsYXRlcgp2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3aXRoIG5vIEludmFyaWFudCBTZWN0aW9ucywKd2l0aCBubyBGcm9udC1Db3ZlciBUZXh0cywgYW5kIHdpdGggbm8gQmFjay1Db3ZlciBUZXh0cy4gIEEgY29weSBvZiB0aGUKbGljZW5zZSBpcyBpbmNsdWRlZCBpbiBAcmVme0dOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZX0uCkBlbmQgY29weWluZwoKCkBjICBUZXhpbmZvIHZlcnNpb24gNC4yIG9yIHVwIHdpbGwgYmUgbmVlZGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlLgpAYwpAYyAgQSBzdWl0YWJsZSB0ZXhpbmZvLnRleCBpcyBzdXBwbGllZCwgYSBuZXdlciBvbmUgc2hvdWxkIHdvcmsKQGMgIGVxdWFsbHkgd2VsbC4KQGMKQGMgIFRoZSBlZGl0aW9uIG51bWJlciBpcyBpbiB0aGUgVkVSU0lPTiB2YXJpYWJsZSBhYm92ZSBhbmQgc2hvdWxkIGJlCkBjICB1cGRhdGVkIHdoZXJlIGFwcHJvcHJpYXRlLiAgQWxzbywgdXBkYXRlIHRoZSBtb250aCBhbmQgeWVhciBpbgpAYyAgVVBEQVRFRC1NT05USC4KCgpAZGlyY2F0ZWdvcnkgU29mdHdhcmUgbGlicmFyaWVzCkBkaXJlbnRyeQoqIG1wZnI6IChtcGZyKS4gICAgICAgICAgICAgICAgIE11bHRpcGxlIFByZWNpc2lvbiBGbG9hdGluZy1Qb2ludCBSZWxpYWJsZSBMaWJyYXJ5LgpAZW5kIGRpcmVudHJ5CgpAYyAgaHRtbCA8bWV0YSBuYW1lPWRlc2NyaXB0aW9uIGNvbnRlbnQ9Ii4uLiI+CkBkb2N1bWVudGRlc2NyaXB0aW9uCkhvdyB0byBpbnN0YWxsIGFuZCB1c2UgR05VIE1QRlIsIGEgbGlicmFyeSBmb3IgcmVsaWFibGUgbXVsdGlwbGUgcHJlY2lzaW9uCmZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMsIHZlcnNpb24gQHZhbHVle1ZFUlNJT059LgpAZW5kIGRvY3VtZW50ZGVzY3JpcHRpb24KCkBjIHNtYWxsYm9vawpAZmluYWxvdXQKQHNldGNoYXB0ZXJuZXdwYWdlIG9uCgpAaWZub3R0ZXgKQG5vZGUgVG9wLCBDb3B5aW5nLCAoZGlyKSwgKGRpcikKQHRvcCBHTlUgTVBGUgpAZW5kIGlmbm90dGV4CgpAaWZ0ZXgKQHRpdGxlcGFnZQpAdGl0bGUgR05VIE1QRlIKQHN1YnRpdGxlIFRoZSBNdWx0aXBsZSBQcmVjaXNpb24gRmxvYXRpbmctUG9pbnQgUmVsaWFibGUgTGlicmFyeQpAc3VidGl0bGUgRWRpdGlvbiBAdmFsdWV7VkVSU0lPTn0KQHN1YnRpdGxlIEB2YWx1ZXtVUERBVEVELU1PTlRIfQoKQGF1dGhvciBUaGUgTVBGUiB0ZWFtCkBlbWFpbHttcGZyQEBsb3JpYS5mcn0KCkBjIEluY2x1ZGUgdGhlIERpc3RyaWJ1dGlvbiBpbnNpZGUgdGhlIHRpdGxlcGFnZSBzbwpAYyB0aGF0IGhlYWRpbmdzIGFyZSB0dXJuZWQgb2ZmLgoKQHRleApcZ2xvYmFsXHBhcmluZGVudD0wcHQKXGdsb2JhbFxwYXJza2lwPThwdApcZ2xvYmFsXGJhc2VsaW5lc2tpcD0xM3B0CkBlbmQgdGV4CgpAcGFnZQpAdnNraXAgMHB0IHBsdXMgMWZpbGxsCkBlbmQgaWZ0ZXgKCkBpbnNlcnRjb3B5aW5nCkBpZm5vdHRleApAc3AgMQpAZW5kIGlmbm90dGV4CgpAaWZ0ZXgKQGVuZCB0aXRsZXBhZ2UKQGhlYWRpbmdzIGRvdWJsZQpAZW5kIGlmdGV4CgpAYyAgRG9uJ3QgYm90aGVyIHdpdGggY29udGVudHMgZm9yIGh0bWwsIHRoZSBtZW51cyBzZWVtIGFkZXF1YXRlLgpAaWZub3RodG1sCkBjb250ZW50cwpAZW5kIGlmbm90aHRtbAoKQG1lbnUKKiBDb3B5aW5nOjogICAgICAgICAgICAgICAgICAgICBNUEZSIENvcHlpbmcgQ29uZGl0aW9ucyAoTEdQTCkuCiogSW50cm9kdWN0aW9uIHRvIE1QRlI6OiAgICAgICAgQnJpZWYgaW50cm9kdWN0aW9uIHRvIEdOVSBNUEZSLgoqIEluc3RhbGxpbmcgTVBGUjo6ICAgICAgICAgICAgIEhvdyB0byBjb25maWd1cmUgYW5kIGNvbXBpbGUgdGhlIE1QRlIgbGlicmFyeS4KKiBSZXBvcnRpbmcgQnVnczo6ICAgICAgICAgICAgICBIb3cgdG8gdXNlZnVsbHkgcmVwb3J0IGJ1Z3MuCiogTVBGUiBCYXNpY3M6OiAgICAgICAgICAgICAgICAgV2hhdCBldmVyeSBNUEZSIHVzZXIgc2hvdWxkIG5vdy4KKiBNUEZSIEludGVyZmFjZTo6ICAgICAgICAgICAgICBNUEZSIGZ1bmN0aW9ucyBhbmQgbWFjcm9zLgoqIENvbnRyaWJ1dG9yczo6CiogUmVmZXJlbmNlczo6CiogR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlOjoKKiBDb25jZXB0IEluZGV4OjoKKiBGdW5jdGlvbiBJbmRleDo6CkBlbmQgbWVudQoKCkBjICBAbXtULE59IGlzICRUJCBpbiB0ZXggb3IgQG1hdGh7Tn0gb3RoZXJ3aXNlLiAgVGhpcyBpcyBhbiBlYXN5IHdheSB0byBnaXZlCkBjICBkaWZmZXJlbnQgZm9ybXMgZm9yIG1hdGggaW4gdGV4IGFuZCBpbmZvLiAgQ29tbWFzIGluIE4gb3IgVCBkb24ndCB3b3JrLApAYyAgYnV0IEBDe30gY2FuIGJlIHVzZWQgaW5zdGVhZC4gIFwsIHdvcmtzIGluIGluZm8gYnV0IG5vdCBpbiB0ZXguCkBpZnRleApAbWFjcm8gbSB7VCxOfQpAdGV4JFxUXCRAZW5kIHRleApAZW5kIG1hY3JvCkBlbmQgaWZ0ZXgKQGlmbm90dGV4CkBtYWNybyBtIHtULE59CkBtYXRoe1xOXH0KQGVuZCBtYWNybwpAZW5kIGlmbm90dGV4CgpAYyAgVXNhZ2U6IEBHTVBhYnN7eH0KQGMgIEdpdmUgZWl0aGVyIHx4fCBpbiB0ZXgsIG9yIGFicyh4KSBpbiBpbmZvIG9yIGh0bWwuCkB0ZXgKXGdkZWZcR01QYWJzIzF7fCMxfH0KQGVuZCB0ZXgKQGlmbm90dGV4CkBtYWNybyBHTVBhYnMge1h9CkBhYnN7fShcWFwpCkBlbmQgbWFjcm8KQGVuZCBpZm5vdHRleAoKQGMgIFVzYWdlOiBAR01QdGltZXN7fQpAYyAgR2l2ZSBlaXRoZXIgXHRpbWVzIG9yIHRoZSB3b3JkICJ0aW1lcyIuCkB0ZXgKXGdkZWZcR01QdGltZXN7XHRpbWVzfQpAZW5kIHRleApAaWZub3R0ZXgKQG1hY3JvIEdNUHRpbWVzCnRpbWVzCkBlbmQgbWFjcm8KQGVuZCBpZm5vdHRleAoKQGMgIE5ldyBtYXRoIG9wZXJhdG9ycy4KQGMgIEBhYnN7fSBjYW4gYmUgdXNlZCBpbiBib3RoIHRleCBhbmQgaW5mbywgb3IganVzdCBcYWJzIGluIHRleC4KQHRleApcZ2RlZlxhYnN7XG1hdGhvcHtccm0gYWJzfX0KQGVuZCB0ZXgKQGlmbm90dGV4CkBtYWNybyBhYnMKYWJzCkBlbmQgbWFjcm8KQGVuZCBpZm5vdHRleAoKQGMgIEB0aW1lc3t9IG1hZGUgYXZhaWxhYmxlIGFzIGEgIioiIGluIGluZm8gYW5kIGh0bWwgKGFscmVhZHkgd29ya3MgaW4gdGV4KS4KQGlmbm90dGV4CkBtYWNybyB0aW1lcwoqCkBlbmQgbWFjcm8KQGVuZCBpZm5vdHRleAoKQGMgIE1hdGggb3BlcmF0b3JzIGFscmVhZHkgYXZhaWxhYmxlIGluIHRleCwgbWFkZSBhdmFpbGFibGUgaW4gaW5mbyB0b28uCkBjICBGb3IgZXhhbXBsZSBAbG9ne30gY2FuIGJlIHVzZWQgaW4gYm90aCB0ZXggYW5kIGluZm8uCkBpZm5vdHRleApAbWFjcm8gbGUKPD0KQGVuZCBtYWNybwpAbWFjcm8gZ2UKPj0KQGVuZCBtYWNybwpAbWFjcm8gbmUKPD4KQGVuZCBtYWNybwpAbWFjcm8gbG9nCmxvZwpAZW5kIG1hY3JvCkBlbmQgaWZub3R0ZXgKCkBjICBAcG9te30gZGVmaW5pdGlvbgpAdGV4ClxnZGVmXHBvbXtcaWZtbW9kZVxwbVxlbHNlJFxwbSRcZml9CkBlbmQgdGV4CkBpZm5vdHRleApAbWFjcm8gcG9tCrEKQGVuZCBtYWNybwpAZW5kIGlmbm90dGV4CgpAYyBUaGUgZm9sbG93aW5nIG1hY3JvIGhhdmUgYmVlbiBjb3BpZWQgZnJvbSBnbXAudGV4aQpAYwpAYyAgVXNhZ2U6IEBNUEZScHhyZWZ0b3B7aW5mbyx0aXRsZX0KQGMKQGMgIExpa2UgQHB4cmVme30sIGJ1dCBkZXNpZ25lZCBmb3IgYSByZWZlcmVuY2UgdG8gdGhlIHRvcCBvZiBhIGRvY3VtZW50LCBub3QKQGMgIGEgcGFydGljdWxhciBzZWN0aW9uLgpAYwpAYyAgVGhlIHRleGluZm8gbWFudWFsIHJlY29tbWVuZHMgcHV0dGluZyBhIGxpa2VseSBzZWN0aW9uIG5hbWUgaW4gcmVmZXJlbmNlcwpAYyAgbGlrZSB0aGlzLCBlZy4gIkludHJvZHVjdGlvbiIsIGJ1dCBpdCBzZWVtcyBiZXR0ZXIgdG8ganVzdCBnaXZlIHRoZSB0aXRsZS4KQGMKQGlmdGV4CkBtYWNybyBNUEZScHhyZWZ0b3B7aW5mbyx0aXRsZX0Kc2VlIEBjaXRle1x0aXRsZVx9LgpAZW5kIG1hY3JvCkBlbmQgaWZ0ZXgKQGlmaHRtbApAbWFjcm8gTVBGUnB4cmVmdG9we2luZm8sdGl0bGV9CnNlZSBAY2l0ZXtcdGl0bGVcfS4KQGVuZCBtYWNybwpAZW5kIGlmaHRtbApAaWZub3R0ZXgKQGlmbm90aHRtbApAbWFjcm8gTVBGUnB4cmVmdG9we2luZm8sdGl0bGV9CkBweHJlZntUb3AsXHRpdGxlXCxcdGl0bGVcLFxpbmZvXCxcdGl0bGVcfQpAZW5kIG1hY3JvCkBlbmQgaWZub3RodG1sCkBlbmQgaWZub3R0ZXgKCkBub2RlIENvcHlpbmcsIEludHJvZHVjdGlvbiB0byBNUEZSLCBUb3AsIFRvcApAY29tbWVudCAgbm9kZS1uYW1lLCBuZXh0LCBwcmV2aW91cywgIHVwCkB1bm51bWJlcmVkIE1QRlIgQ29weWluZyBDb25kaXRpb25zCkBjaW5kZXggQ29weWluZyBjb25kaXRpb25zCkBjaW5kZXggQ29uZGl0aW9ucyBmb3IgY29weWluZyBNUEZSCgpUaGlzIGxpYnJhcnkgaXMgQGRmbntmcmVlfTsgdGhpcyBtZWFucyB0aGF0IGV2ZXJ5b25lIGlzIGZyZWUgdG8gdXNlIGl0IGFuZApmcmVlIHRvIHJlZGlzdHJpYnV0ZSBpdCBvbiBhIGZyZWUgYmFzaXMuICBUaGUgbGlicmFyeSBpcyBub3QgaW4gdGhlIHB1YmxpYwpkb21haW47IGl0IGlzIGNvcHlyaWdodGVkIGFuZCB0aGVyZSBhcmUgcmVzdHJpY3Rpb25zIG9uIGl0cyBkaXN0cmlidXRpb24sIGJ1dAp0aGVzZSByZXN0cmljdGlvbnMgYXJlIGRlc2lnbmVkIHRvIHBlcm1pdCBldmVyeXRoaW5nIHRoYXQgYSBnb29kIGNvb3BlcmF0aW5nCmNpdGl6ZW4gd291bGQgd2FudCB0byBkby4gIFdoYXQgaXMgbm90IGFsbG93ZWQgaXMgdG8gdHJ5IHRvIHByZXZlbnQgb3RoZXJzCmZyb20gZnVydGhlciBzaGFyaW5nIGFueSB2ZXJzaW9uIG9mIHRoaXMgbGlicmFyeSB0aGF0IHRoZXkgbWlnaHQgZ2V0IGZyb20KeW91LkByZWZpbGwKClNwZWNpZmljYWxseSwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgcmlnaHQgdG8gZ2l2ZSBhd2F5IGNvcGllcwpvZiB0aGUgbGlicmFyeSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBlbHNlIGNhbiBnZXQgaXQgaWYgeW91IHdhbnQKaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhpcyBsaWJyYXJ5IG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXMsCmFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLkByZWZpbGwKClRvIG1ha2Ugc3VyZSB0aGF0IGV2ZXJ5b25lIGhhcyBzdWNoIHJpZ2h0cywgd2UgaGF2ZSB0byBmb3JiaWQgeW91IHRvIGRlcHJpdmUKYW55b25lIGVsc2Ugb2YgdGhlc2UgcmlnaHRzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKR05VIE1QRlIgbGlicmFyeSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHlvdSBoYXZlLgpZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuICBBbmQgeW91Cm11c3QgdGVsbCB0aGVtIHRoZWlyIHJpZ2h0cy5AcmVmaWxsCgpBbHNvLCBmb3Igb3VyIG93biBwcm90ZWN0aW9uLCB3ZSBtdXN0IG1ha2UgY2VydGFpbiB0aGF0IGV2ZXJ5b25lIGZpbmRzIG91dAp0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgR05VIE1QRlIgbGlicmFyeS4gIElmIGl0IGlzIG1vZGlmaWVkIGJ5CnNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZSB3YW50IHRoZWlyIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleQpoYXZlIGlzIG5vdCB3aGF0IHdlIGRpc3RyaWJ1dGVkLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycwp3aWxsIG5vdCByZWZsZWN0IG9uIG91ciByZXB1dGF0aW9uLkByZWZpbGwKClRoZSBwcmVjaXNlIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2UgZm9yIHRoZSBHTlUgTVBGUiBsaWJyYXJ5IGFyZSBmb3VuZCBpbiB0aGUKTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhhdCBhY2NvbXBhbmllcyB0aGUgc291cmNlIGNvZGUuClNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi5AcmVmaWxsCgpAbm9kZSBJbnRyb2R1Y3Rpb24gdG8gTVBGUiwgSW5zdGFsbGluZyBNUEZSLCBDb3B5aW5nLCBUb3AKQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCkBjaGFwdGVyIEludHJvZHVjdGlvbiB0byBNUEZSCgoKTVBGUiBpcyBhIHBvcnRhYmxlIGxpYnJhcnkgd3JpdHRlbiBpbiBDIGZvciBhcmJpdHJhcnkgcHJlY2lzaW9uIGFyaXRobWV0aWMKb24gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4gSXQgaXMgYmFzZWQgb24gdGhlIEdOVSBNUCBsaWJyYXJ5LgpJdCBhaW1zIHRvIGV4dGVuZCB0aGUgY2xhc3Mgb2YgZmxvYXRpbmctcG9pbnQgbnVtYmVycyBwcm92aWRlZCBieSB0aGUKR05VIE1QIGxpYnJhcnkgYnkgYSBwcmVjaXNlIHNlbWFudGljcy4gVGhlIG1haW4gZGlmZmVyZW5jZXMKd2l0aCB0aGUgQGNvZGV7bXBmfSBjbGFzcyBmcm9tIEdOVSBNUCBhcmU6CgpAaXRlbWl6ZSBAYnVsbGV0CkBpdGVtIHRoZSBNUEZSIGNvZGUgaXMgcG9ydGFibGUsIGkuZS5AOiB0aGUgcmVzdWx0IG9mIGFueSBvcGVyYXRpb24KZG9lcyBub3QgZGVwZW5kIChvciBzaG91bGQgbm90KSBvbiB0aGUgbWFjaGluZSB3b3JkIHNpemUKQGNvZGV7bXBfYml0c19wZXJfbGltYn0gKDMyIG9yIDY0IG9uIG1vc3QgbWFjaGluZXMpOwpAaXRlbSB0aGUgcHJlY2lzaW9uIGluIGJpdHMgY2FuIGJlIHNldCBleGFjdGx5IHRvIGFueSB2YWxpZCB2YWx1ZQpmb3IgZWFjaCB2YXJpYWJsZSAoaW5jbHVkaW5nIHZlcnkgc21hbGwgcHJlY2lzaW9uKTsKQGl0ZW0gTVBGUiBwcm92aWRlcyB0aGUgZm91ciByb3VuZGluZyBtb2RlcyBmcm9tIHRoZSBJRUVFIDc1NC0xOTg1CnN0YW5kYXJkLgpAZW5kIGl0ZW1pemUKCkluIHBhcnRpY3VsYXIsIHdpdGggYSBwcmVjaXNpb24gb2YgNTMgYml0cywgTVBGUiBzaG91bGQgYmUgYWJsZSB0bwpleGFjdGx5IHJlcHJvZHVjZSBhbGwgY29tcHV0YXRpb25zIHdpdGggZG91YmxlLXByZWNpc2lvbiBtYWNoaW5lCmZsb2F0aW5nLXBvaW50IG51bWJlcnMgKGUuZy4sIEBjb2Rle2RvdWJsZX0gdHlwZSBpbiBDLCB3aXRoIGEgQwppbXBsZW1lbnRhdGlvbiB0aGF0IHJpZ29yb3VzbHkgZm9sbG93cyBBbm5leCBGIG9mIHRoZSBJU08gQzk5IHN0YW5kYXJkCmFuZCBAY29kZXtGUF9DT05UUkFDVH0gcHJhZ21hIHNldCB0byBAY29kZXtPRkZ9KSBvbiB0aGUgZm91ciBhcml0aG1ldGljCm9wZXJhdGlvbnMgYW5kIHRoZSBzcXVhcmUgcm9vdCwgZXhjZXB0IHRoZSBkZWZhdWx0IGV4cG9uZW50IHJhbmdlIGlzIG11Y2gKd2lkZXIgYW5kIHN1Ym5vcm1hbCBudW1iZXJzIGFyZSBub3QgaW1wbGVtZW50ZWQgKGJ1dCBjYW4gYmUgZW11bGF0ZWQpLgoKVGhpcyB2ZXJzaW9uIG9mIE1QRlIgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSwgVmVyc2lvbiAyLjEgb3IgYW55IGxhdGVyIHZlcnNpb24uCkl0IGlzIHBlcm1pdHRlZCB0byBsaW5rIE1QRlIgdG8gbW9zdCBub24tZnJlZSBwcm9ncmFtcywgYXMgbG9uZyBhcyB3aGVuCmRpc3RyaWJ1dGluZyB0aGVtIHRoZSBNUEZSIHNvdXJjZSBjb2RlIGFuZCBhIG1lYW5zIHRvIHJlLWxpbmsgd2l0aCBhCm1vZGlmaWVkIE1QRlIgbGlicmFyeSBpcyBwcm92aWRlZC4KCkBzZWN0aW9uIEhvdyB0byBVc2UgVGhpcyBNYW51YWwKCkV2ZXJ5b25lIHNob3VsZCByZWFkIEByZWZ7TVBGUiBCYXNpY3N9LiAgSWYgeW91IG5lZWQgdG8gaW5zdGFsbCB0aGUgbGlicmFyeQp5b3Vyc2VsZiwgeW91IG5lZWQgdG8gcmVhZCBAcmVme0luc3RhbGxpbmcgTVBGUn0sIHRvby4KClRoZSByZXN0IG9mIHRoZSBtYW51YWwgY2FuIGJlIHVzZWQgZm9yIGxhdGVyIHJlZmVyZW5jZSwgYWx0aG91Z2ggaXQgaXMKcHJvYmFibHkgYSBnb29kIGlkZWEgdG8gZ2xhbmNlIHRocm91Z2ggaXQuCgpAbm9kZSBJbnN0YWxsaW5nIE1QRlIsIFJlcG9ydGluZyBCdWdzLCBJbnRyb2R1Y3Rpb24gdG8gTVBGUiwgVG9wCkBjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cApAY2hhcHRlciBJbnN0YWxsaW5nIE1QRlIKQGNpbmRleCBJbnN0YWxsYXRpb24KCkBzZWN0aW9uIEhvdyB0byBJbnN0YWxsCgpIZXJlIGFyZSB0aGUgc3RlcHMgbmVlZGVkIHRvIGluc3RhbGwgdGhlIGxpYnJhcnkgb24gVW5peCBzeXN0ZW1zCihtb3JlIGRldGFpbHMgYXJlIHByb3ZpZGVkIGluIHRoZSBAZmlsZXtJTlNUQUxMfSBmaWxlKToKCkBlbnVtZXJhdGUKQGl0ZW0KVG8gYnVpbGQgTVBGUiwgeW91IGZpcnN0IGhhdmUgdG8gaW5zdGFsbCBHTlUgTVAKKHZlcnNpb24gNC4xIG9yIGhpZ2hlcikgb24geW91ciBjb21wdXRlci4KWW91IG5lZWQgYSBDIGNvbXBpbGVyLCBwcmVmZXJhYmx5IEdDQywgYnV0IGFueSByZWFzb25hYmxlIGNvbXBpbGVyIHNob3VsZAp3b3JrLiAgQW5kIHlvdSBuZWVkIGEgc3RhbmRhcmQgVW5peCBAc2FtcHttYWtlfSBwcm9ncmFtLCBwbHVzIHNvbWUgb3RoZXIKc3RhbmRhcmQgVW5peCB1dGlsaXR5IHByb2dyYW1zLgoKQGl0ZW0KSW4gdGhlIE1QRlIgYnVpbGQgZGlyZWN0b3J5LCB0eXBlCkBzYW1wey4vY29uZmlndXJlfQoKVGhpcyB3aWxsIHByZXBhcmUgdGhlIGJ1aWxkIGFuZCBzZXR1cCB0aGUgb3B0aW9ucyBhY2NvcmRpbmcgdG8geW91ciBzeXN0ZW0uCklmIHlvdSBnZXQgZXJyb3IgbWVzc2FnZXMsIHlvdSBtaWdodCBjaGVjayB0aGF0IHlvdSB1c2UgdGhlIHNhbWUgY29tcGlsZXIKYW5kIGNvbXBpbGUgb3B0aW9ucyBhcyBmb3IgR05VIE1QIChzZWUgdGhlIEBmaWxle0lOU1RBTEx9IGZpbGUpLgoKQGl0ZW0KQHNhbXB7bWFrZX0KClRoaXMgd2lsbCBjb21waWxlIE1QRlIsIGFuZCBjcmVhdGUgYSBsaWJyYXJ5IGFyY2hpdmUgZmlsZSBAZmlsZXtsaWJtcGZyLmF9LgpBIGR5bmFtaWMgbGlicmFyeSBtYXkgYmUgcHJvZHVjZWQgdG9vIChzZWUgY29uZmlndXJlKS4KCkBpdGVtCkBzYW1we21ha2UgY2hlY2t9CgpUaGlzIHdpbGwgbWFrZSBzdXJlIE1QRlIgd2FzIGJ1aWx0IGNvcnJlY3RseS4KSWYgeW91IGdldCBlcnJvciBtZXNzYWdlcywgcGxlYXNlCnJlcG9ydCB0aGlzIHRvIEBzYW1we21wZnJAQGxvcmlhLmZyfS4gIChAeHJlZntSZXBvcnRpbmcgQnVnc30sIGZvcgppbmZvcm1hdGlvbiBvbiB3aGF0IHRvIGluY2x1ZGUgaW4gdXNlZnVsIGJ1ZyByZXBvcnRzLikKCkBpdGVtCkBzYW1we21ha2UgaW5zdGFsbH0KClRoaXMgd2lsbCBjb3B5IHRoZSBmaWxlcyBAZmlsZXttcGZyLmh9IGFuZCBAZmlsZXttcGYybXBmci5ofSB0byB0aGUgZGlyZWN0b3J5CkBmaWxley91c3IvbG9jYWwvaW5jbHVkZX0sIHRoZSBmaWxlIEBmaWxle2xpYm1wZnIuYX0gdG8gdGhlIGRpcmVjdG9yeQpAZmlsZXsvdXNyL2xvY2FsL2xpYn0sIGFuZCB0aGUgZmlsZSBAZmlsZXttcGZyLmluZm99IHRvIHRoZSBkaXJlY3RvcnkKQGZpbGV7L3Vzci9sb2NhbC9zaGFyZS9pbmZvfSAob3IgaWYgeW91IHBhc3NlZCB0aGUgQHNhbXB7LS1wcmVmaXh9IG9wdGlvbiB0bwogQGZpbGV7Y29uZmlndXJlfSwgdXNpbmcgdGhlIHByZWZpeCBkaXJlY3RvcnkgZ2l2ZW4gYXMgYXJndW1lbnQgdG8KQHNhbXB7LS1wcmVmaXh9IGluc3RlYWQgb2YgQGZpbGV7L3Vzci9sb2NhbH0pLgpAZW5kIGVudW1lcmF0ZQoKQHNlY3Rpb24gT3RoZXIgYG1ha2UnIFRhcmdldHMKClRoZXJlIGFyZSBzb21lIG90aGVyIHVzZWZ1bCBtYWtlIHRhcmdldHM6CgpAaXRlbWl6ZSBAYnVsbGV0CkBpdGVtCkBzYW1we21wZnIuaW5mb30gb3IgQHNhbXB7aW5mb30KCkNyZWF0ZSBhbiBpbmZvIHZlcnNpb24gb2YgdGhlIG1hbnVhbCwgaW4gQGZpbGV7bXBmci5pbmZvfS4KCkBpdGVtCkBzYW1we21wZnIucGRmfSBvciBAc2FtcHtwZGZ9CgpDcmVhdGUgYSBQREYgdmVyc2lvbiBvZiB0aGUgbWFudWFsLCBpbiBAZmlsZXttcGZyLnBkZn0uCgpAaXRlbQpAc2FtcHttcGZyLmR2aX0gb3IgQHNhbXB7ZHZpfQoKQ3JlYXRlIGEgRFZJIHZlcnNpb24gb2YgdGhlIG1hbnVhbCwgaW4gQGZpbGV7bXBmci5kdml9LgoKQGl0ZW0KQHNhbXB7bXBmci5wc30gb3IgQHNhbXB7cHN9CgpDcmVhdGUgYSBQb3N0c2NyaXB0IHZlcnNpb24gb2YgdGhlIG1hbnVhbCwgaW4gQGZpbGV7bXBmci5wc30uCgpAaXRlbQpAc2FtcHttcGZyLmh0bWx9IG9yIEBzYW1we2h0bWx9CgpDcmVhdGUgYSBIVE1MIHZlcnNpb24gb2YgdGhlIG1hbnVhbCwgaW4gc2V2ZXJhbCBwYWdlcyBpbiB0aGUgZGlyZWN0b3J5CkBmaWxle21wZnIuaHRtbH07IGlmIHlvdSB3YW50IG9ubHkgb25lIG91dHB1dCBIVE1MIGZpbGUsIHRoZW4gdHlwZQpAc2FtcHttYWtlaW5mbyAtLWh0bWwgLS1uby1zcGxpdCBtcGZyLnRleGl9IGluc3RlYWQuCgpAaXRlbQpAc2FtcHtjbGVhbn0KCkRlbGV0ZSBhbGwgb2JqZWN0IGZpbGVzIGFuZCBhcmNoaXZlIGZpbGVzLCBidXQgbm90IHRoZSBjb25maWd1cmF0aW9uIGZpbGVzLgoKQGl0ZW0KQHNhbXB7ZGlzdGNsZWFufQoKRGVsZXRlIGFsbCBmaWxlcyBub3QgaW5jbHVkZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbi4KCkBpdGVtCkBzYW1we3VuaW5zdGFsbH0KCkRlbGV0ZSBhbGwgZmlsZXMgY29waWVkIGJ5IEBzYW1we21ha2UgaW5zdGFsbH0uCkBlbmQgaXRlbWl6ZQoKCkBzZWN0aW9uIEJ1aWxkIFByb2JsZW1zCgpJbiBjYXNlIG9mIHByb2JsZW0sIHBsZWFzZSByZWFkIHRoZSBAZmlsZXtJTlNUQUxMfSBmaWxlIGNhcmVmdWxseQpiZWZvcmUgcmVwb3J0aW5nIGEgYnVnLCBpbiBwYXJ0aWN1bGFyIHNlY3Rpb24gYGBJbiBjYXNlIG9mIHByb2JsZW0nJy4KU29tZSBwcm9ibGVtcyBhcmUgZHVlIHRvIGJhZCBjb25maWd1cmF0aW9uIG9uIHRoZSB1c2VyIHNpZGUgKG5vdApzcGVjaWZpYyB0byBNUEZSKS4gUHJvYmxlbXMgYXJlIGFsc28gbWVudGlvbmVkIGluIHRoZSBGQVEKQHVybHtodHRwOi8vd3d3Lm1wZnIub3JnL2ZhcS5odG1sfS4KCkBjb21tZW50IFdhcm5pbmchIERvIG5vdCBzcGxpdCAiTVBGUiAuLi4gQHVybHsuLi59IiBhY3Jvc3Mgc2V2ZXJhbCBsaW5lcwpAY29tbWVudCBhcyB0aGlzIG5lZWRzIHRvIGJlIHVwZGF0ZWQgd2l0aCB1cGRhdGUtdmVyc2lvbi4KUGxlYXNlIHJlcG9ydCBwcm9ibGVtcyB0byBAc2FtcHttcGZyQEBsb3JpYS5mcn0uCkB4cmVme1JlcG9ydGluZyBCdWdzfS4KU29tZSBidWcgZml4ZXMgYXJlIGF2YWlsYWJsZSBvbiB0aGUKTVBGUiAyLjQuMSB3ZWIgcGFnZSBAdXJse2h0dHA6Ly93d3cubXBmci5vcmcvbXBmci0yLjQuMS99LgoKQHNlY3Rpb24gR2V0dGluZyB0aGUgTGF0ZXN0IFZlcnNpb24gb2YgTVBGUgoKVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIE1QRlIgaXMgYXZhaWxhYmxlIGZyb20KQHVybHtmdHA6Ly9mdHAuZ251Lm9yZy9nbnUvbXBmci99IG9yIEB1cmx7aHR0cDovL3d3dy5tcGZyLm9yZy99LgoKQG5vZGUgUmVwb3J0aW5nIEJ1Z3MsIE1QRlIgQmFzaWNzLCBJbnN0YWxsaW5nIE1QRlIsIFRvcApAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKQGNoYXB0ZXIgUmVwb3J0aW5nIEJ1Z3MKQGNpbmRleCBSZXBvcnRpbmcgYnVncwoKQGNvbW1lbnQgV2FybmluZyEgRG8gbm90IHNwbGl0ICJNUEZSIC4uLiBAdXJsey4uLn0iIGFjcm9zcyBzZXZlcmFsIGxpbmVzCkBjb21tZW50IGFzIHRoaXMgbmVlZHMgdG8gYmUgdXBkYXRlZCB3aXRoIHVwZGF0ZS12ZXJzaW9uLgpJZiB5b3UgdGhpbmsgeW91IGhhdmUgZm91bmQgYSBidWcgaW4gdGhlIE1QRlIgbGlicmFyeSwgZmlyc3QgaGF2ZSBhIGxvb2sKb24gdGhlIE1QRlIgMi40LjEgd2ViIHBhZ2UgQHVybHtodHRwOi8vd3d3Lm1wZnIub3JnL21wZnItMi40LjEvfSBhbmQgdGhlCkZBUSBAdXJse2h0dHA6Ly93d3cubXBmci5vcmcvZmFxLmh0bWx9OgpwZXJoYXBzIHRoaXMgYnVnIGlzIGFscmVhZHkga25vd24sIGluIHdoaWNoIGNhc2UgeW91IG1heSBmaW5kIHRoZXJlCmEgd29ya2Fyb3VuZCBmb3IgaXQuIE90aGVyd2lzZSwgcGxlYXNlIGludmVzdGlnYXRlIGFuZCByZXBvcnQgaXQuCldlIGhhdmUgbWFkZSB0aGlzIGxpYnJhcnkgYXZhaWxhYmxlIHRvIHlvdSwgYW5kIGl0IGlzIG5vdCB0byBhc2sgdG9vCm11Y2ggZnJvbSB5b3UsIHRvIGFzayB5b3UgdG8gcmVwb3J0IHRoZSBidWdzIHRoYXQgeW91IGZpbmQuCgpUaGVyZSBhcmUgYSBmZXcgdGhpbmdzIHlvdSBzaG91bGQgdGhpbmsgYWJvdXQgd2hlbiB5b3UgcHV0IHlvdXIgYnVnIHJlcG9ydAp0b2dldGhlci4KCllvdSBoYXZlIHRvIHNlbmQgdXMgYSB0ZXN0IGNhc2UgdGhhdCBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdXMgdG8gcmVwcm9kdWNlIHRoZQpidWcuICBJbmNsdWRlIGluc3RydWN0aW9ucyBvbiBob3cgdG8gcnVuIHRoZSB0ZXN0IGNhc2UuCgpZb3UgYWxzbyBoYXZlIHRvIGV4cGxhaW4gd2hhdCBpcyB3cm9uZzsgaWYgeW91IGdldCBhIGNyYXNoLCBvciBpZiB0aGUgcmVzdWx0cwpwcmludGVkIGFyZSBpbmNvcnJlY3QgYW5kIGluIHRoYXQgY2FzZSwgaW4gd2hhdCB3YXkuCgpQbGVhc2UgaW5jbHVkZSBjb21waWxlciB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIHlvdXIgYnVnIHJlcG9ydC4gVGhpcyBjYW4KYmUgZXh0cmFjdGVkIHVzaW5nIEBzYW1we2NjIC1WfSBvbiBzb21lIG1hY2hpbmVzLCBvciwgaWYgeW91J3JlIHVzaW5nIGdjYywKQHNhbXB7Z2NjIC12fS4gQWxzbywgaW5jbHVkZSB0aGUgb3V0cHV0IGZyb20gQHNhbXB7dW5hbWUgLWF9IGFuZCB0aGUgTVBGUgp2ZXJzaW9uICh0aGUgR01QIHZlcnNpb24gbWF5IGJlIHVzZWZ1bCB0b28pLgoKSWYgeW91ciBidWcgcmVwb3J0IGlzIGdvb2QsIHdlIHdpbGwgZG8gb3VyIGJlc3QgdG8gaGVscCB5b3UgdG8gZ2V0IGEgY29ycmVjdGVkCnZlcnNpb24gb2YgdGhlIGxpYnJhcnk7IGlmIHRoZSBidWcgcmVwb3J0IGlzIHBvb3IsIHdlIHdpbGwgbm90IGRvIGFueXRoaW5nCmFib3V0IGl0IChhc2lkZSBvZiBjaGlkaW5nIHlvdSB0byBzZW5kIGJldHRlciBidWcgcmVwb3J0cykuCgpTZW5kIHlvdXIgYnVnIHJlcG9ydCB0bzogQHNhbXB7bXBmckBAbG9yaWEuZnJ9LgoKSWYgeW91IHRoaW5rIHNvbWV0aGluZyBpbiB0aGlzIG1hbnVhbCBpcyB1bmNsZWFyLCBvciBkb3ducmlnaHQgaW5jb3JyZWN0LCBvciBpZgp0aGUgbGFuZ3VhZ2UgbmVlZHMgdG8gYmUgaW1wcm92ZWQsIHBsZWFzZSBzZW5kIGEgbm90ZSB0byB0aGUgc2FtZSBhZGRyZXNzLgoKQG5vZGUgTVBGUiBCYXNpY3MsIE1QRlIgSW50ZXJmYWNlLCBSZXBvcnRpbmcgQnVncywgVG9wCkBjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cApAY2hhcHRlciBNUEZSIEJhc2ljcwoKQHNlY3Rpb24gSGVhZGVycyBhbmQgTGlicmFyaWVzCgpAY2luZGV4IEBmaWxle21wZnIuaH0KQWxsIGRlY2xhcmF0aW9ucyBuZWVkZWQgdG8gdXNlIE1QRlIgYXJlIGNvbGxlY3RlZCBpbiB0aGUgaW5jbHVkZSBmaWxlCkBmaWxle21wZnIuaH0uICBJdCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggYm90aCBDIGFuZCBDKysgY29tcGlsZXJzLgpZb3Ugc2hvdWxkIGluY2x1ZGUgdGhhdCBmaWxlIGluIGFueSBwcm9ncmFtIHVzaW5nIHRoZSBNUEZSIGxpYnJhcnk6CgpAZXhhbXBsZQojaW5jbHVkZSA8bXBmci5oPgpAZW5kIGV4YW1wbGUKCkBjaW5kZXggQGNvZGV7c3RkaW8uaH0KTm90ZSBob3dldmVyIHRoYXQgcHJvdG90eXBlcyBmb3IgTVBGUiBmdW5jdGlvbnMgd2l0aCBAY29kZXtGSUxFICp9IHBhcmFtZXRlcnMKYXJlIHByb3ZpZGVkIG9ubHkgaWYgQGNvZGV7PHN0ZGlvLmg+fSBpcyBpbmNsdWRlZCB0b28gKGJlZm9yZSBAZmlsZXttcGZyLmh9KS4KCkBleGFtcGxlCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8bXBmci5oPgpAZW5kIGV4YW1wbGUKCkBjaW5kZXggQGNvZGV7c3RkYXJnLmh9Ckxpa2V3aXNlIEBjb2RlezxzdGRhcmcuaD59IChvciBAY29kZXs8dmFyYXJncy5oPn0pIGlzIHJlcXVpcmVkIGZvciBwcm90b3R5cGVzCndpdGggQGNvZGV7dmFfbGlzdH0gcGFyYW1ldGVycywgc3VjaCBhcyBAY29kZXttcGZyX3ZwcmludGZ9LgoKWW91IGNhbiBhdm9pZCB0aGUgdXNlIG9mIE1QRlIgbWFjcm9zIGVuY2Fwc3VsYXRpbmcgZnVuY3Rpb25zIGJ5IGRlZmluaW5nCnRoZSBAc2FtcHtNUEZSX1VTRV9OT19NQUNST30gbWFjcm8gYmVmb3JlIEBmaWxle21wZnIuaH0gaXMgaW5jbHVkZWQuICBJbgpnZW5lcmFsIHRoaXMgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnksIGJ1dCB0aGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcKdXNlciBjb2RlOiB3aXRoIHNvbWUgbWFjcm9zLCB0aGUgY29tcGlsZXIgbWF5IGVtaXQgc3B1cmlvdXMgd2FybmluZ3Mgd2l0aApzb21lIHdhcm5pbmcgb3B0aW9ucywgYW5kIG1hY3JvcyBjYW4gcHJldmVudCBzb21lIHByb3RvdHlwZSBjaGVja2luZy4KCkBjaW5kZXggTGlicmFyaWVzCkBjaW5kZXggTGlua2luZwpAY2luZGV4IEBjb2Rle2xpYm1wZnJ9CkFsbCBwcm9ncmFtcyB1c2luZyBNUEZSIG11c3QgbGluayBhZ2FpbnN0IGJvdGggQGZpbGV7bGlibXBmcn0gYW5kCkBmaWxle2xpYmdtcH0gbGlicmFyaWVzLiAgT24gYSB0eXBpY2FsIFVuaXgtbGlrZSBzeXN0ZW0gdGhpcyBjYW4gYmUKZG9uZSB3aXRoIEBzYW1wey1sbXBmciAtbGdtcH0gKGluIHRoYXQgb3JkZXIpLCBmb3IgZXhhbXBsZQoKQGV4YW1wbGUKZ2NjIG15cHJvZ3JhbS5jIC1sbXBmciAtbGdtcApAZW5kIGV4YW1wbGUKCkBjaW5kZXggTGlidG9vbApNUEZSIGlzIGJ1aWx0IHVzaW5nIExpYnRvb2wgYW5kIGFuIGFwcGxpY2F0aW9uIGNhbiB1c2UgdGhhdCB0byBsaW5rIGlmCmRlc2lyZWQsIEBNUEZScHhyZWZ0b3B7bGlidG9vbC5pbmZvLCBHTlUgTGlidG9vbH0KQGMgTm90ZTogdGhlIC5pbmZvIGV4dGVuc2lvbiBoYXMgYmVlbiBhZGRlZCB0byBhdm9pZCB0aGUgZm9sbG93aW5nIGJ1ZzoKQGMgICBodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9NDg0NzQwCkBjIHdoaWNoIG9jY3VycyB3aGVuIHJlYWRpbmcgdGhlIGluZm8gZmlsZSBmcm9tIHRoZSBidWlsZCBkaXJlY3Rvcnk6CkBjICAgaW5mbyAuL21wZnIgICAgb3IgICAgaW5mbyAtZiAuL21wZnIuaW5mbwpAYyBEdWUgdG8gYSBwb29yIGRlc2lnbiwgdGhlICJpbmZvIiB1dGlsaXR5IHdpbGwgbm90IGZpbmQgdGhlIGNvcnJlY3QKQGMgbGlidG9vbCBpbmZvIGZpbGUgaWYgdGhlIC5pbmZvIGV4dGVuc2lvbiBpcyBub3QgcHJvdmlkZWQsIGJlY2F1c2Ugb2YKQGMgdGhlICJsaWJ0b29sIiBzY3JpcHQgaW4gTVBGUidzIGRpcmVjdG9yeSEKCklmIE1QRlIgaGFzIGJlZW4gaW5zdGFsbGVkIHRvIGEgbm9uLXN0YW5kYXJkIGxvY2F0aW9uLCB0aGVuIGl0IG1heSBiZQpuZWNlc3NhcnkgdG8gc2V0IHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyBzdWNoIGFzIEBzYW1we0NfSU5DTFVERV9QQVRIfQphbmQgQHNhbXB7TElCUkFSWV9QQVRIfSwgb3IgdXNlIEBzYW1wey1JfSBhbmQgQHNhbXB7LUx9IGNvbXBpbGVyIG9wdGlvbnMsCmluIG9yZGVyIHRvIHBvaW50IHRvIHRoZSByaWdodCBkaXJlY3Rvcmllcy4gRm9yIGEgc2hhcmVkIGxpYnJhcnksIGl0IG1heQphbHNvIGJlIG5lY2Vzc2FyeSB0byBzZXQgdXAgc29tZSBzb3J0IG9mIHJ1bi10aW1lIGxpYnJhcnkgcGF0aCAoZS5nLiwKQHNhbXB7TERfTElCUkFSWV9QQVRIfSkgb24gc29tZSBzeXN0ZW1zLiBQbGVhc2UgcmVhZCB0aGUgQGZpbGV7SU5TVEFMTH0KZmlsZSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KCkBzZWN0aW9uIE5vbWVuY2xhdHVyZSBhbmQgVHlwZXMKCkBjaW5kZXggRmxvYXRpbmctcG9pbnQgbnVtYmVyCkB0aW5kZXggQGNvZGV7bXBmcl90fQpAbm9pbmRlbnQKQSBAZGZue2Zsb2F0aW5nLXBvaW50IG51bWJlcn0gb3IgQGRmbntmbG9hdH0gZm9yIHNob3J0LCBpcyBhbiBhcmJpdHJhcnkKcHJlY2lzaW9uIHNpZ25pZmljYW5kIChhbHNvIGNhbGxlZCBtYW50aXNzYSkgd2l0aCBhIGxpbWl0ZWQgcHJlY2lzaW9uCmV4cG9uZW50LiBUaGUgQyBkYXRhIHR5cGUKZm9yIHN1Y2ggb2JqZWN0cyBpcyBAY29kZXttcGZyX3R9IChpbnRlcm5hbGx5IGRlZmluZWQgYXMgYSBvbmUtZWxlbWVudAphcnJheSBvZiBhIHN0cnVjdHVyZSwgYW5kIEBjb2Rle21wZnJfcHRyfSBpcyB0aGUgQyBkYXRhIHR5cGUgcmVwcmVzZW50aW5nCmEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSkuIEEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGNhbiBoYXZlCnRocmVlIHNwZWNpYWwgdmFsdWVzOiBOb3QtYS1OdW1iZXIgKE5hTikgb3IgcGx1cyBvciBtaW51cyBJbmZpbml0eS4gTmFOCnJlcHJlc2VudHMgYW4gdW5pbml0aWFsaXplZCBvYmplY3QsIHRoZSByZXN1bHQgb2YgYW4gaW52YWxpZCBvcGVyYXRpb24KKGxpa2UgMCBkaXZpZGVkIGJ5IDApLCBvciBhIHZhbHVlIHRoYXQgY2Fubm90IGJlIGRldGVybWluZWQgKGxpa2UKK0luZmluaXR5IG1pbnVzICtJbmZpbml0eSkuIE1vcmVvdmVyLCBsaWtlIGluIHRoZSBJRUVFIDc1NC0xOTg1IHN0YW5kYXJkLAp6ZXJvIGlzIHNpZ25lZCwgaS5lLkA6IHRoZXJlIGFyZSBib3RoICswIGFuZCBAbWludXN7fTA7IHRoZSBiZWhhdmlvcgppcyB0aGUgc2FtZSBhcyBpbiB0aGUgSUVFRSA3NTQtMTk4NSBzdGFuZGFyZCBhbmQgaXQgaXMgZ2VuZXJhbGl6ZWQgdG8KdGhlIG90aGVyIGZ1bmN0aW9ucyBzdXBwb3J0ZWQgYnkgTVBGUi4KCgpAY2luZGV4IFByZWNpc2lvbgpAdGluZGV4IEBjb2Rle21wX3ByZWNfdH0KQG5vaW5kZW50ClRoZSBAZGZue3ByZWNpc2lvbn0gaXMgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBzaWduaWZpY2FuZApvZiBhIGZsb2F0aW5nLXBvaW50IG51bWJlcjsKdGhlIGNvcnJlc3BvbmRpbmcgQyBkYXRhIHR5cGUgaXMgQGNvZGV7bXBfcHJlY190fS4KVGhlIHByZWNpc2lvbiBjYW4gYmUgYW55IGludGVnZXIgYmV0d2VlbiBAY29kZXtNUEZSX1BSRUNfTUlOfSBhbmQKQGNvZGV7TVBGUl9QUkVDX01BWH0uIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBAY29kZXtNUEZSX1BSRUNfTUlOfQppcyBlcXVhbCB0byAyLgoKV2FybmluZyEgTVBGUiBuZWVkcyB0byBpbmNyZWFzZSB0aGUgcHJlY2lzaW9uIGludGVybmFsbHksIGluIG9yZGVyIHRvCnByb3ZpZGUgYWNjdXJhdGUgcmVzdWx0cyAoYW5kIGluIHBhcnRpY3VsYXIsIGNvcnJlY3Qgcm91bmRpbmcpLiBEbyBub3QKYXR0ZW1wdCB0byBzZXQgdGhlIHByZWNpc2lvbiB0byBhbnkgdmFsdWUgbmVhciBAY29kZXtNUEZSX1BSRUNfTUFYfSwKb3RoZXJ3aXNlIE1QRlIgd2lsbCBhYm9ydCBkdWUgdG8gYW4gYXNzZXJ0aW9uIGZhaWx1cmUuIE1vcmVvdmVyLCB5b3UKbWF5IHJlYWNoIHNvbWUgbWVtb3J5IGxpbWl0IG9uIHlvdXIgcGxhdGZvcm0sIGluIHdoaWNoIGNhc2UgdGhlIHByb2dyYW0KbWF5IGFib3J0LCBjcmFzaCBvciBoYXZlIHVuZGVmaW5lZCBiZWhhdmlvciAoZGVwZW5kaW5nIG9uIHlvdXIgQwppbXBsZW1lbnRhdGlvbikuCgpAY2luZGV4IFJvdW5kaW5nIE1vZGVzCkB0aW5kZXggQGNvZGV7bXBfcm5kX3R9CkBub2luZGVudApUaGUgQGRmbntyb3VuZGluZyBtb2RlfSBzcGVjaWZpZXMgdGhlIHdheSB0byByb3VuZCB0aGUgcmVzdWx0IG9mIGEKZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uLCBpbiBjYXNlIHRoZSBleGFjdCByZXN1bHQgY2FuIG5vdCBiZSByZXByZXNlbnRlZApleGFjdGx5IGluIHRoZSBkZXN0aW5hdGlvbiBzaWduaWZpY2FuZDsKdGhlIGNvcnJlc3BvbmRpbmcgQyBkYXRhIHR5cGUgaXMgQGNvZGV7bXBfcm5kX3R9LgoKQGNpbmRleCBMaW1iCkBjIEB0aW5kZXggQGNvZGV7bXBfbGltYl90fQpAbm9pbmRlbnQKQSBAZGZue2xpbWJ9IG1lYW5zIHRoZSBwYXJ0IG9mIGEgbXVsdGktcHJlY2lzaW9uIG51bWJlciB0aGF0IGZpdHMgaW4gYSBzaW5nbGUKd29yZC4gIChXZSBjaG9zZSB0aGlzIHdvcmQgYmVjYXVzZSBhIGxpbWIgb2YgdGhlIGh1bWFuIGJvZHkgaXMgYW5hbG9nb3VzIHRvIGEKZGlnaXQsIG9ubHkgbGFyZ2VyLCBhbmQgY29udGFpbmluZyBzZXZlcmFsIGRpZ2l0cy4pICBOb3JtYWxseSBhIGxpbWIgY29udGFpbnMKMzIgb3IgNjQgYml0cy4gIFRoZSBDIGRhdGEgdHlwZSBmb3IgYSBsaW1iIGlzIEBjb2Rle21wX2xpbWJfdH0uCgpAc2VjdGlvbiBGdW5jdGlvbiBDbGFzc2VzCgpUaGVyZSBpcyBvbmx5IG9uZSBjbGFzcyBvZiBmdW5jdGlvbnMgaW4gdGhlIE1QRlIgbGlicmFyeToKCkBlbnVtZXJhdGUKQGl0ZW0KRnVuY3Rpb25zIGZvciBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLCB3aXRoIG5hbWVzIGJlZ2lubmluZyB3aXRoCkBjb2Rle21wZnJffS4gIFRoZSBhc3NvY2lhdGVkIHR5cGUgaXMgQGNvZGV7bXBmcl90fS4KQGVuZCBlbnVtZXJhdGUKCgpAc2VjdGlvbiBNUEZSIFZhcmlhYmxlIENvbnZlbnRpb25zCgpBcyBhIGdlbmVyYWwgcnVsZSwgYWxsIE1QRlIgZnVuY3Rpb25zIGV4cGVjdCBvdXRwdXQgYXJndW1lbnRzIGJlZm9yZSBpbnB1dAphcmd1bWVudHMuICBUaGlzIG5vdGF0aW9uIGlzIGJhc2VkIG9uIGFuIGFuYWxvZ3kgd2l0aCB0aGUgYXNzaWdubWVudCBvcGVyYXRvci4KCk1QRlIgYWxsb3dzIHlvdSB0byB1c2UgdGhlIHNhbWUgdmFyaWFibGUgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBpbiB0aGUgc2FtZQpleHByZXNzaW9uLiAgRm9yIGV4YW1wbGUsIHRoZSBtYWluIGZ1bmN0aW9uIGZvciBmbG9hdGluZy1wb2ludCBtdWx0aXBsaWNhdGlvbiwKQGNvZGV7bXBmcl9tdWx9LCBjYW4gYmUgdXNlZCBsaWtlIHRoaXM6IEBjb2Rle21wZnJfbXVsICh4LCB4LCB4LCBybmRfbW9kZSl9LgpUaGlzCmNvbXB1dGVzIHRoZSBzcXVhcmUgb2YgQHZhcnt4fSB3aXRoIHJvdW5kaW5nIG1vZGUgQGNvZGV7cm5kX21vZGV9CmFuZCBwdXRzIHRoZSByZXN1bHQgYmFjayBpbiBAdmFye3h9LgoKQmVmb3JlIHlvdSBjYW4gYXNzaWduIHRvIGFuIE1QRlIgdmFyaWFibGUsIHlvdSBuZWVkIHRvIGluaXRpYWxpemUgaXQgYnkgY2FsbGluZwpvbmUgb2YgdGhlIHNwZWNpYWwgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLiAgV2hlbiB5b3UncmUgZG9uZSB3aXRoIGEKdmFyaWFibGUsIHlvdSBuZWVkIHRvIGNsZWFyIGl0IG91dCwgdXNpbmcgb25lIG9mIHRoZSBmdW5jdGlvbnMgZm9yIHRoYXQKcHVycG9zZS4KCkEgdmFyaWFibGUgc2hvdWxkIG9ubHkgYmUgaW5pdGlhbGl6ZWQgb25jZSwgb3IgYXQgbGVhc3QgY2xlYXJlZCBvdXQgYmV0d2VlbgplYWNoIGluaXRpYWxpemF0aW9uLiAgQWZ0ZXIgYSB2YXJpYWJsZSBoYXMgYmVlbiBpbml0aWFsaXplZCwgaXQgbWF5IGJlCmFzc2lnbmVkIHRvIGFueSBudW1iZXIgb2YgdGltZXMuCgpGb3IgZWZmaWNpZW5jeSByZWFzb25zLCBhdm9pZCB0byBpbml0aWFsaXplIGFuZCBjbGVhciBvdXQgYSB2YXJpYWJsZSBpbiBsb29wcy4KSW5zdGVhZCwgaW5pdGlhbGl6ZSBpdCBiZWZvcmUgZW50ZXJpbmcgdGhlIGxvb3AsIGFuZCBjbGVhciBpdCBvdXQgYWZ0ZXIgdGhlCmxvb3AgaGFzIGV4aXRlZC4KCllvdSBkbyBub3QgbmVlZCB0byBiZSBjb25jZXJuZWQgYWJvdXQgYWxsb2NhdGluZyBhZGRpdGlvbmFsIHNwYWNlIGZvciBNUEZSCnZhcmlhYmxlcywgc2luY2UgYW55IHZhcmlhYmxlIGhhcyBhIHNpZ25pZmljYW5kIG9mIGZpeGVkIHNpemUuCkhlbmNlIHVubGVzcyB5b3UgY2hhbmdlIGl0cyBwcmVjaXNpb24sIG9yIGNsZWFyIGFuZCByZWluaXRpYWxpemUgaXQsCmEgZmxvYXRpbmctcG9pbnQgdmFyaWFibGUgd2lsbCBoYXZlIHRoZSBzYW1lIGFsbG9jYXRlZCBzcGFjZSBkdXJpbmcgYWxsIGl0cwpsaWZlLgoKQHNlY3Rpb24gUm91bmRpbmcgTW9kZXMKClRoZSBmb2xsb3dpbmcgZm91ciByb3VuZGluZyBtb2RlcyBhcmUgc3VwcG9ydGVkOgoKQGl0ZW1pemUgQGJ1bGxldApAaXRlbSBAY29kZXtHTVBfUk5ETn06IHJvdW5kIHRvIG5lYXJlc3QKQGl0ZW0gQGNvZGV7R01QX1JORFp9OiByb3VuZCB0b3dhcmQgemVybwpAaXRlbSBAY29kZXtHTVBfUk5EVX06IHJvdW5kIHRvd2FyZCBwbHVzIGluZmluaXR5CkBpdGVtIEBjb2Rle0dNUF9STkREfTogcm91bmQgdG93YXJkIG1pbnVzIGluZmluaXR5CkBlbmQgaXRlbWl6ZQoKVGhlIEBzYW1we3JvdW5kIHRvIG5lYXJlc3R9IG1vZGUgd29ya3MgYXMgaW4gdGhlIElFRUUgNzU0LTE5ODUgc3RhbmRhcmQ6IGluCmNhc2UgdGhlIG51bWJlciB0byBiZSByb3VuZGVkIGxpZXMgZXhhY3RseSBpbiB0aGUgbWlkZGxlIG9mIHR3byByZXByZXNlbnRhYmxlCm51bWJlcnMsIGl0IGlzIHJvdW5kZWQgdG8gdGhlIG9uZSB3aXRoIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgc2V0IHRvIHplcm8uCkZvciBleGFtcGxlLCB0aGUgbnVtYmVyIDUvMiwgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgKDEwLjEpIGluIGJpbmFyeSwgaXMKcm91bmRlZCB0byAoMTAuMCk9MiB3aXRoIGEgcHJlY2lzaW9uIG9mIHR3byBiaXRzLCBhbmQgbm90IHRvICgxMS4wKT0zLgpUaGlzIHJ1bGUgYXZvaWRzIHRoZSBAZGZue2RyaWZ0fSBwaGVub21lbm9uIG1lbnRpb25lZCBieSBLbnV0aCBpbiB2b2x1bWUgMgpvZiBUaGUgQXJ0IG9mIENvbXB1dGVyIFByb2dyYW1taW5nIChTZWN0aW9uIDQuMi4yKS4KCk1vc3QgTVBGUiBmdW5jdGlvbnMgdGFrZSBhcyBmaXJzdCBhcmd1bWVudCB0aGUgZGVzdGluYXRpb24gdmFyaWFibGUsIGFzCnNlY29uZCBhbmQgZm9sbG93aW5nIGFyZ3VtZW50cyB0aGUgaW5wdXQgdmFyaWFibGVzLCBhcyBsYXN0IGFyZ3VtZW50IGEKcm91bmRpbmcgbW9kZSwgYW5kIGhhdmUgYSByZXR1cm4gdmFsdWUgb2YgdHlwZSBAY29kZXtpbnR9LCBjYWxsZWQgdGhlCkBkZm57dGVybmFyeSB2YWx1ZX0uIFRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGRlc3RpbmF0aW9uIHZhcmlhYmxlIGlzCmNvcnJlY3RseSByb3VuZGVkLCBpLmUuQDogTVBGUiBiZWhhdmVzIGFzIGlmIGl0IGNvbXB1dGVkIHRoZSByZXN1bHQgd2l0aAphbiBpbmZpbml0ZSBwcmVjaXNpb24sIHRoZW4gcm91bmRlZCBpdCB0byB0aGUgcHJlY2lzaW9uIG9mIHRoaXMgdmFyaWFibGUuClRoZSBpbnB1dCB2YXJpYWJsZXMgYXJlIHJlZ2FyZGVkIGFzIGV4YWN0IChpbiBwYXJ0aWN1bGFyLCB0aGVpciBwcmVjaXNpb24KZG9lcyBub3QgYWZmZWN0IHRoZSByZXN1bHQpLgoKQXMgYSBjb25zZXF1ZW5jZSwgaW4gY2FzZSBvZiBhIG5vbi16ZXJvIHJlYWwgcm91bmRlZCByZXN1bHQsIHRoZSBlcnJvcgpvbiB0aGUgcmVzdWx0IGlzIGxlc3Mgb3IgZXF1YWwgdG8gMS8yIHVscCAodW5pdCBpbiB0aGUgbGFzdCBwbGFjZSkgb2YKdGhlIHRhcmdldCBpbiB0aGUgcm91bmRpbmcgdG8gbmVhcmVzdCBtb2RlLCBhbmQgbGVzcyB0aGFuIDEgdWxwIG9mIHRoZQp0YXJnZXQgaW4gdGhlIGRpcmVjdGVkIHJvdW5kaW5nIG1vZGVzIChhIHVscCBpcyB0aGUgd2VpZ2h0IG9mIHRoZSBsZWFzdApzaWduaWZpY2FudCByZXByZXNlbnRlZCBiaXQgb2YgdGhlIHRhcmdldCBhZnRlciByb3VuZGluZykuCkBjIFNpbmNlIHN1Ym5vcm1hbHMgYXJlIG5vdCBzdXBwb3J0ZWQsIHdlIG11c3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIHVscCBvZgpAYyB0aGUgcm91bmRlZCByZXN1bHQsIG5vdCB0aGUgb25lIG9mIHRoZSBleGFjdCByZXN1bHQsIGZvciBmdWxsIGdlbmVyYWxpdHkuCgpVbmxlc3MgZG9jdW1lbnRlZCBvdGhlcndpc2UsIGZ1bmN0aW9ucyByZXR1cm5pbmcgYW4gQGNvZGV7aW50fSByZXR1cm4KYSB0ZXJuYXJ5IHZhbHVlLgpJZiB0aGUgdGVybmFyeSB2YWx1ZSBpcyB6ZXJvLCBpdCBtZWFucyB0aGF0IHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlCmRlc3RpbmF0aW9uIHZhcmlhYmxlIGlzIHRoZSBleGFjdCByZXN1bHQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbWF0aGVtYXRpY2FsCmZ1bmN0aW9uLiBJZiB0aGUgdGVybmFyeSB2YWx1ZSBpcyBwb3NpdGl2ZSAocmVzcC5AOiBuZWdhdGl2ZSksIGl0IG1lYW5zCnRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGRlc3RpbmF0aW9uIHZhcmlhYmxlIGlzIGdyZWF0ZXIgKHJlc3AuQDogbG93ZXIpCnRoYW4gdGhlIGV4YWN0IHJlc3VsdC4gRm9yIGV4YW1wbGUgd2l0aCB0aGUgQGNvZGV7R01QX1JORFV9IHJvdW5kaW5nIG1vZGUsCnRoZSB0ZXJuYXJ5IHZhbHVlIGlzIHVzdWFsbHkgcG9zaXRpdmUsIGV4Y2VwdCB3aGVuIHRoZSByZXN1bHQgaXMgZXhhY3QsIGluCndoaWNoIGNhc2UgaXQgaXMgemVyby4gSW4gdGhlIGNhc2Ugb2YgYW4gaW5maW5pdGUgcmVzdWx0LCBpdCBpcyBjb25zaWRlcmVkCmFzIGluZXhhY3Qgd2hlbiBpdCB3YXMgb2J0YWluZWQgYnkgb3ZlcmZsb3csIGFuZCBleGFjdCBvdGhlcndpc2UuIEEgTmFOCnJlc3VsdCAoTm90LWEtTnVtYmVyKSBhbHdheXMgY29ycmVzcG9uZHMgdG8gYW4gZXhhY3QgcmV0dXJuIHZhbHVlLgpUaGUgb3Bwb3NpdGUgb2YgYSByZXR1cm5lZCB0ZXJuYXJ5IHZhbHVlIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmVwcmVzZW50YWJsZQppbiBhbiBAY29kZXtpbnR9LgoKVW5sZXNzIGRvY3VtZW50ZWQgb3RoZXJ3aXNlLCBmdW5jdGlvbnMgcmV0dXJuaW5nIGEgQGNvZGV7MX0KKG9yIGFueSBvdGhlciB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhpcyBtYW51YWwpCmZvciBzcGVjaWFsIGNhc2VzIChsaWtlIEBjb2Rle2Fjb3MoMCl9KSBzaG91bGQgcmV0dXJuIGFuIG92ZXJmbG93IG9yCmFuIHVuZGVyZmxvdyBpZiBAY29kZXsxfSBpcyBub3QgcmVwcmVzZW50YWJsZSBpbiB0aGUgY3VycmVudCBleHBvbmVudCByYW5nZS4KCkBzZWN0aW9uIEZsb2F0aW5nLVBvaW50IFZhbHVlcyBvbiBTcGVjaWFsIE51bWJlcnMKClRoaXMgc2VjdGlvbiBzcGVjaWZpZXMgdGhlIGZsb2F0aW5nLXBvaW50IHZhbHVlcyAob2YgdHlwZSBAY29kZXttcGZyX3R9KQpyZXR1cm5lZCBieSBNUEZSIGZ1bmN0aW9ucy4gRm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcgc2V2ZXJhbCB2YWx1ZXMgKGxpa2UKQGNvZGV7bXBmcl9zaW5fY29zfSksIHRoZSBydWxlcyBhcHBseSB0byBlYWNoIHJlc3VsdCBzZXBhcmF0ZWx5LgoKRnVuY3Rpb25zIGNhbiBoYXZlIG9uZSBvciBzZXZlcmFsIGlucHV0IGFyZ3VtZW50cy4gQW4gaW5wdXQgcG9pbnQgaXMKYSBtYXBwaW5nIGZyb20gdGhlc2UgaW5wdXQgYXJndW1lbnRzIHRvIHRoZSBzZXQgb2YgdGhlIE1QRlIgbnVtYmVycy4KV2hlbiBub25lIG9mIGl0cyBjb21wb25lbnRzIGFyZSBOYU4sIGFuIGlucHV0IHBvaW50IGNhbiBhbHNvIGJlIHNlZW4KYXMgYSB0dXBsZSBpbiB0aGUgZXh0ZW5kZWQgcmVhbCBudW1iZXJzICh0aGUgc2V0IG9mIHRoZSByZWFsIG51bWJlcnMKd2l0aCBib3RoIGluZmluaXRpZXMpLgoKV2hlbiB0aGUgaW5wdXQgcG9pbnQgaXMgaW4gdGhlIGRvbWFpbiBvZiB0aGUgbWF0aGVtYXRpY2FsIGZ1bmN0aW9uLCB0aGUKcmVzdWx0IGlzIHJvdW5kZWQgYXMgZGVzY3JpYmVkIGluIFNlY3Rpb24gYGBSb3VuZGluZyBNb2RlcycnIChidXQgc2VlCmJlbG93IGZvciB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2lnbiBvZiBhbiBleGFjdCB6ZXJvKS4gT3RoZXJ3aXNlCnRoZSBnZW5lcmFsIHJ1bGVzIGZyb20gdGhpcyBzZWN0aW9uIGFwcGx5IHVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlIGluCnRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgTVBGUiBmdW5jdGlvbiAoQHJlZntNUEZSIEludGVyZmFjZX0pLgoKV2hlbiB0aGUgaW5wdXQgcG9pbnQgaXMgbm90IGluIHRoZSBkb21haW4gb2YgdGhlIG1hdGhlbWF0aWNhbCBmdW5jdGlvbgpidXQgaXMgaW4gaXRzIGNsb3N1cmUgaW4gdGhlIGV4dGVuZGVkIHJlYWwgbnVtYmVycyBhbmQgdGhlIGZ1bmN0aW9uIGNhbgpiZSBleHRlbmRlZCBieSBjb250aW51aXR5LCB0aGUgcmVzdWx0IGlzIHRoZSBvYnRhaW5lZCBsaW1pdC4KRXhhbXBsZXM6IEBjb2Rle21wZnJfaHlwb3R9IG9uICgrSW5mLDApIGdpdmVzICtJbmYuIEJ1dCBAY29kZXttcGZyX3Bvd30KY2Fubm90IGJlIGRlZmluZWQgb24gKDEsK0luZikgdXNpbmcgdGhpcyBydWxlLCBhcyBvbmUgY2FuIGZpbmQKc2VxdWVuY2VzIChAbXt4X24sQHZhcnt4fV9AdmFye259fSxAbXt5X24sQHZhcnt5fV9AdmFye259fSkgc3VjaCB0aGF0CkBte3hfbixAdmFye3h9X0B2YXJ7bn19IGdvZXMgdG8gMSwgQG17eV9uLEB2YXJ7eX1fQHZhcntufX0gZ29lcyB0byArSW5mCmFuZCBAbXsoeF9uKV57eV9ufSxAdmFye3h9X0B2YXJ7bn0gdG8gdGhlIEB2YXJ7eX1fQHZhcntufX0gZ29lcyB0byBhbnkKcG9zaXRpdmUgdmFsdWUgd2hlbiBAdmFye259IGdvZXMgdG8gdGhlIGluZmluaXR5LgoKV2hlbiB0aGUgaW5wdXQgcG9pbnQgaXMgaW4gdGhlIGNsb3N1cmUgb2YgdGhlIGRvbWFpbiBvZiB0aGUgbWF0aGVtYXRpY2FsCmZ1bmN0aW9uIGFuZCBhbiBpbnB1dCBhcmd1bWVudCBpcyArMCAocmVzcC5AOiBAbWludXN7fTApLCBvbmUgY29uc2lkZXJzCnRoZSBsaW1pdCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IGFwcHJvYWNoZXMgMCBmcm9tIGFib3ZlCihyZXNwLkA6IGJlbG93KS4gSWYgdGhlIGxpbWl0IGlzIG5vdCBkZWZpbmVkIChlLmcuLCBAY29kZXttcGZyX2xvZ30gb24KQG1pbnVze30wKSwgdGhlIGJlaGF2aW9yIG11c3QgYmUgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUKTVBGUiBmdW5jdGlvbi4KCldoZW4gdGhlIHJlc3VsdCBpcyBlcXVhbCB0byAwLCBpdHMgc2lnbiBpcyBkZXRlcm1pbmVkIGJ5IGNvbnNpZGVyaW5nIHRoZQpsaW1pdCBhcyBpZiB0aGUgaW5wdXQgcG9pbnQgd2VyZSBub3QgaW4gdGhlIGRvbWFpbjogSWYgb25lIGFwcHJvYWNoZXMgMApmcm9tIGFib3ZlIChyZXNwLkA6IGJlbG93KSwgdGhlIHJlc3VsdCBpcyArMCAocmVzcC5AOiBAbWludXN7fTApLiBJbiB0aGUKb3RoZXIgY2FzZXMsIHRoZSBzaWduIG11c3QgYmUgc3BlY2lmaWVkIGluIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgTVBGUgpmdW5jdGlvbi4gRXhhbXBsZTogQGNvZGV7bXBmcl9zaW59IG9uICswIGdpdmVzICswLgoKV2hlbiB0aGUgaW5wdXQgcG9pbnQgaXMgbm90IGluIHRoZSBjbG9zdXJlIG9mIHRoZSBkb21haW4gb2YgdGhlIGZ1bmN0aW9uLAp0aGUgcmVzdWx0IGlzIE5hTi4gRXhhbXBsZTogQGNvZGV7bXBmcl9zcXJ0fSBvbiBAbWludXN7fTE3IGdpdmVzIE5hTi4KCldoZW4gYW4gaW5wdXQgYXJndW1lbnQgaXMgTmFOLCB0aGUgcmVzdWx0IGlzIE5hTiwgcG9zc2libHkgZXhjZXB0IHdoZW4KYSBwYXJ0aWFsIGZ1bmN0aW9uIGlzIGNvbnN0YW50IG9uIHRoZSBmaW5pdGUgZmxvYXRpbmctcG9pbnQgbnVtYmVyczsKc3VjaCBhIGNhc2UgaXMgYWx3YXlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIEByZWZ7TVBGUiBJbnRlcmZhY2V9LgpAYyBTYWlkIG90aGVyd2lzZSwgaWYgc3VjaCBhIGNhc2UgaXMgbm90IHNwZWNpZmllZCwgdGhpcyBpcyBhIGJ1ZywgdGh1cwpAYyB3ZSBtYXkgY2hhbmdlIHRoZSByZXR1cm5lZCB2YWx1ZSBhZnRlciBkb2N1bWVudGluZyBpdCB3aXRob3V0IGhhdmluZwpAYyB0byBjaGFuZ2UgdGhlIGxpYnRvb2wgaW50ZXJmYWNlIG51bWJlciAodGhpcyB3b3VsZCBoYXZlIG1vcmUgZHJhd2JhY2tzCkBjIHRoYXQgYWR2YW50YWdlcyBpbiBwcmFjdGljZSksIGxpa2UgZm9yIGFueSBidWcgZml4LgpFeGFtcGxlOiBAY29kZXttcGZyX2h5cG90fSBvbiAoTmFOLDApIGdpdmVzIE5hTiwgYnV0IEBjb2Rle21wZnJfaHlwb3R9Cm9uIChOYU4sK0luZikgZ2l2ZXMgK0luZiAoYXMgc3BlY2lmaWVkIGluIEByZWZ7U3BlY2lhbCBGdW5jdGlvbnN9KSwKc2luY2UgZm9yIGFueSBmaW5pdGUgaW5wdXQgQHZhcnt4fSwgQGNvZGV7bXBmcl9oeXBvdH0gb24gKEB2YXJ7eH0sK0luZikKZ2l2ZXMgK0luZi4KCkBzZWN0aW9uIEV4Y2VwdGlvbnMKCk1QRlIgc3VwcG9ydHMgNSBleGNlcHRpb24gdHlwZXM6CgpAaXRlbWl6ZSBAYnVsbGV0CgpAaXRlbSBVbmRlcmZsb3c6CkFuIHVuZGVyZmxvdyBvY2N1cnMgd2hlbiB0aGUgZXhhY3QgcmVzdWx0IG9mIGEgZnVuY3Rpb24gaXMgYSBub24temVybwpyZWFsIG51bWJlciBhbmQgdGhlIHJlc3VsdCBvYnRhaW5lZCBhZnRlciB0aGUgcm91bmRpbmcsIGFzc3VtaW5nIGFuCnVuYm91bmRlZCBleHBvbmVudCByYW5nZSAoZm9yIHRoZSByb3VuZGluZyksIGhhcyBhbiBleHBvbmVudCBzbWFsbGVyCnRoYW4gdGhlIG1pbmltdW0gZXhwb25lbnQgb2YgdGhlIGN1cnJlbnQgcmFuZ2UuIEluIHRoZSByb3VuZC10by1uZWFyZXN0Cm1vZGUsIHRoZSBoYWxmd2F5IGNhc2UgaXMgcm91bmRlZCB0b3dhcmQgemVyby4KCk5vdGU6IFRoaXMgaXMgbm90IHRoZSBzaW5nbGUgZGVmaW5pdGlvbiBvZiB0aGUgdW5kZXJmbG93LiBNUEZSIGNob29zZXMKdG8gY29uc2lkZXIgdGhlIHVuZGVyZmxvdyBhZnRlciByb3VuZGluZy4gVGhlIHVuZGVyZmxvdyBiZWZvcmUgcm91bmRpbmcKY2FuIGFsc28gYmUgZGVmaW5lZC4gRm9yIGluc3RhbmNlLCBjb25zaWRlciBhIGZ1bmN0aW9uIHRoYXQgaGFzIHRoZQpleGFjdCByZXN1bHQgQG17NyBcdGltZXMgMl57ZS00fSwgNyBtdWx0aXBsaWVkIGJ5IHR3byB0byB0aGUgcG93ZXIKQHZhcntlfUBtaW51c3t9NH0sIHdoZXJlIEB2YXJ7ZX0gaXMgdGhlIHNtYWxsZXN0IGV4cG9uZW50IChmb3IgYQpzaWduaWZpY2FuZCBiZXR3ZWVuIDEvMiBhbmQgMSkgaW4gdGhlIGN1cnJlbnQKcmFuZ2UsIHdpdGggYSAyLWJpdCB0YXJnZXQgcHJlY2lzaW9uIGFuZCByb3VuZGluZyB0b3dhcmQgcGx1cyBpbmZpbml0eS4KVGhlIGV4YWN0IHJlc3VsdCBoYXMgdGhlIGV4cG9uZW50IEB2YXJ7ZX1AbWludXN7fTEuIFdpdGggdGhlIHVuZGVyZmxvdwpiZWZvcmUgcm91bmRpbmcsIHN1Y2ggYSBmdW5jdGlvbiBjYWxsIHdvdWxkIHlpZWxkIGFuIHVuZGVyZmxvdywgYXMKQHZhcntlfUBtaW51c3t9MSBpcyBvdXRzaWRlIHRoZSBjdXJyZW50IGV4cG9uZW50IHJhbmdlLiBIb3dldmVyLCBNUEZSCmZpcnN0IGNvbnNpZGVycyB0aGUgcm91bmRlZCByZXN1bHQgYXNzdW1pbmcgYW4gdW5ib3VuZGVkIGV4cG9uZW50IHJhbmdlLgpUaGUgZXhhY3QgcmVzdWx0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGluIHByZWNpc2lvbiAyLCBhbmQgaGVyZSwKaXQgaXMgcm91bmRlZCB0byBAbXswLjUgQHRpbWVzIDJeZSwgMC41IHRpbWVzIDIgdG8gQHZhcntlfX0sIHdoaWNoIGlzCnJlcHJlc2VudGFibGUgaW4gdGhlIGN1cnJlbnQgZXhwb25lbnQgcmFuZ2UuIEFzIGEgY29uc2VxdWVuY2UsIHRoaXMgd2lsbApub3QgeWllbGQgYW4gdW5kZXJmbG93IGluIE1QRlIuCgpAaXRlbSBPdmVyZmxvdzoKQW4gb3ZlcmZsb3cgb2NjdXJzIHdoZW4gdGhlIGV4YWN0IHJlc3VsdCBvZiBhIGZ1bmN0aW9uIGlzIGEgbm9uLXplcm8KcmVhbCBudW1iZXIgYW5kIHRoZSByZXN1bHQgb2J0YWluZWQgYWZ0ZXIgdGhlIHJvdW5kaW5nLCBhc3N1bWluZyBhbgp1bmJvdW5kZWQgZXhwb25lbnQgcmFuZ2UgKGZvciB0aGUgcm91bmRpbmcpLCBoYXMgYW4gZXhwb25lbnQgbGFyZ2VyCnRoYW4gdGhlIG1heGltdW0gZXhwb25lbnQgb2YgdGhlIGN1cnJlbnQgcmFuZ2UuIEluIHRoZSByb3VuZC10by1uZWFyZXN0Cm1vZGUsIHRoZSByZXN1bHQgaXMgaW5maW5pdGUuCgpAaXRlbSBOYU46CkEgTmFOIGV4Y2VwdGlvbiBvY2N1cnMgd2hlbiB0aGUgcmVzdWx0IG9mIGEgZnVuY3Rpb24gaXMgYSBOYU4uCkBjIE5hTiBpcyBkZWZpbmVkIGFib3ZlLiBTbywgd2UgZG9uJ3Qgc2F5IGFueXRoaW5nIG1vcmUuCgpAaXRlbSBJbmV4YWN0OgpBbiBpbmV4YWN0IGV4Y2VwdGlvbiBvY2N1cnMgd2hlbiB0aGUgcmVzdWx0IG9mIGEgZnVuY3Rpb24gY2Fubm90IGJlCnJlcHJlc2VudGVkIGV4YWN0bHkgYW5kIG11c3QgYmUgcm91bmRlZC4KCkBpdGVtIFJhbmdlIGVycm9yOgpBIHJhbmdlIGV4Y2VwdGlvbiBvY2N1cnMgd2hlbiBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3QgcmV0dXJuIGEgTVBGUgpudW1iZXIgKHN1Y2ggYXMgY29tcGFyaXNvbnMgYW5kIGNvbnZlcnNpb25zIHRvIGFuIGludGVnZXIpIGhhcyBhbgppbnZhbGlkIHJlc3VsdCAoZS5nLiBhbiBhcmd1bWVudCBpcyBOYU4gaW4gQGNvZGV7bXBmcl9jbXB9IG9yIGluIGEKY29udmVyc2lvbiB0byBhbiBpbnRlZ2VyKS4KCkBlbmQgaXRlbWl6ZQoKTVBGUiBoYXMgYSBnbG9iYWwgZmxhZyBmb3IgZWFjaCBleGNlcHRpb24sIHdoaWNoIGNhbiBiZSBjbGVhcmVkLCBzZXQKb3IgdGVzdGVkIGJ5IGZ1bmN0aW9ucyBkZXNjcmliZWQgaW4gQHJlZntFeGNlcHRpb24gUmVsYXRlZCBGdW5jdGlvbnN9LgoKRGlmZmVyZW5jZXMgd2l0aCB0aGUgSVNPIEM5OSBzdGFuZGFyZDoKCkBpdGVtaXplIEBidWxsZXQKCkBpdGVtIEluIEMsIG9ubHkgcXVpZXQgTmFOcyBhcmUgc3BlY2lmaWVkLCBhbmQgYSBOYU4gcHJvcGFnYXRpb24gZG9lcyBub3QKcmFpc2UgYW4gaW52YWxpZCBleGNlcHRpb24uIFVubGVzcyBleHBsaWNpdGx5IHN0YXRlZCBvdGhlcndpc2UsIE1QRlIgc2V0cwp0aGUgTmFOIGZsYWcgd2hlbmV2ZXIgYSBOYU4gaXMgZ2VuZXJhdGVkLCBldmVuIHdoZW4gYSBOYU4gaXMgcHJvcGFnYXRlZAooZS5nLiBpbiBOYU4gKyBOYU4pLCBhcyBpZiBhbGwgTmFOcyB3ZXJlIHNpZ25hbGluZy4KCkBpdGVtIEFuIGludmFsaWQgZXhjZXB0aW9uIGluIEMgY29ycmVzcG9uZHMgdG8gZWl0aGVyIGEgTmFOIGV4Y2VwdGlvbiBvcgphIHJhbmdlIGVycm9yIGluIE1QRlIuCgpAZW5kIGl0ZW1pemUKCkBzZWN0aW9uIE1lbW9yeSBIYW5kbGluZwoKTVBGUiBmdW5jdGlvbnMgbWF5IGNyZWF0ZSBjYWNoZXMsIGUuZy4gd2hlbiBjb21wdXRpbmcgY29uc3RhbnRzIHN1Y2gKYXMgQG17XHBpLFBpfSwgZWl0aGVyIGJlY2F1c2UgdGhlIHVzZXIgaGFzIGNhbGxlZCBhIGZ1bmN0aW9uIGxpa2UKQGNvZGV7bXBmcl9jb25zdF9waX0gZGlyZWN0bHkgb3IgYmVjYXVzZSBzdWNoIGEgZnVuY3Rpb24gd2FzIGNhbGxlZAppbnRlcm5hbGx5IGJ5IHRoZSBNUEZSIGxpYnJhcnkgaXRzZWxmIHRvIGNvbXB1dGUgc29tZSBvdGhlciBmdW5jdGlvbi4KCkF0IGFueSB0aW1lLCB0aGUgdXNlciBjYW4gZnJlZSB0aGUgdmFyaW91cyBjYWNoZXMgd2l0aApAY29kZXttcGZyX2ZyZWVfY2FjaGV9LiBJdCBpcyBzdHJvbmdseSBhZHZpc2VkIHRvIGRvIHRoYXQgYmVmb3JlCnRlcm1pbmF0aW5nIGEgdGhyZWFkLCBvciBiZWZvcmUgZXhpdGluZyB3aGVuIHVzaW5nIHRvb2xzIGxpa2UKQHNhbXB7dmFsZ3JpbmR9ICh0byBhdm9pZCBtZW1vcnkgbGVha3MgYmVpbmcgcmVwb3J0ZWQpLgoKTVBGUiBpbnRlcm5hbCBkYXRhIHN1Y2ggYXMgZmxhZ3MsIHRoZSBleHBvbmVudCByYW5nZSwgdGhlIGRlZmF1bHQKcHJlY2lzaW9uIGFuZCByb3VuZGluZyBtb2RlLCBhbmQgY2FjaGVzIChpLmUuLCBkYXRhIHRoYXQgYXJlIG5vdAphY2Nlc3NlZCB2aWEgcGFyYW1ldGVycykgYXJlIGVpdGhlciBnbG9iYWwgKGlmIE1QRlIgaGFzIG5vdCBiZWVuCmNvbXBpbGVkIGFzIHRocmVhZCBzYWZlKSBvciBwZXItdGhyZWFkICh0aHJlYWQgbG9jYWwgc3RvcmFnZSkuCgpAbm9kZSBNUEZSIEludGVyZmFjZSwgQ29udHJpYnV0b3JzLCBNUEZSIEJhc2ljcywgVG9wCkBjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cApAY2hhcHRlciBNUEZSIEludGVyZmFjZQpAY2luZGV4IEZsb2F0aW5nLXBvaW50IGZ1bmN0aW9ucwpAY2luZGV4IEZsb2F0IGZ1bmN0aW9ucwoKVGhlIGZsb2F0aW5nLXBvaW50IGZ1bmN0aW9ucyBleHBlY3QgYXJndW1lbnRzIG9mIHR5cGUgQGNvZGV7bXBmcl90fS4KClRoZSBNUEZSIGZsb2F0aW5nLXBvaW50IGZ1bmN0aW9ucyBoYXZlIGFuIGludGVyZmFjZSB0aGF0IGlzIHNpbWlsYXIgdG8gdGhlCkdOVSBNUAppbnRlZ2VyIGZ1bmN0aW9ucy4gIFRoZSBmdW5jdGlvbiBwcmVmaXggZm9yIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgaXMKQGNvZGV7bXBmcl99LgoKVGhlcmUgaXMgb25lIHNpZ25pZmljYW50IGNoYXJhY3RlcmlzdGljIG9mIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgdGhhdCBoYXMKbW90aXZhdGVkIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgZnVuY3Rpb24gY2xhc3MgYW5kIG90aGVyIEdOVSBNUCBmdW5jdGlvbgpjbGFzc2VzOiB0aGUgaW5oZXJlbnQgaW5leGFjdG5lc3Mgb2YgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYy4gIFRoZSB1c2VyIGhhcwp0byBzcGVjaWZ5IHRoZSBwcmVjaXNpb24gZm9yIGVhY2ggdmFyaWFibGUuICBBIGNvbXB1dGF0aW9uIHRoYXQgYXNzaWducyBhCnZhcmlhYmxlIHdpbGwgdGFrZSBwbGFjZSB3aXRoIHRoZSBwcmVjaXNpb24gb2YgdGhlIGFzc2lnbmVkIHZhcmlhYmxlOyB0aGUKY29zdCBvZiB0aGF0IGNvbXB1dGF0aW9uIHNob3VsZCBub3QgZGVwZW5kIGZyb20gdGhlCnByZWNpc2lvbiBvZiB2YXJpYWJsZXMgdXNlZCBhcyBpbnB1dCAob24gYXZlcmFnZSkuCgpAY2luZGV4IFByZWNpc2lvbgpUaGUgc2VtYW50aWNzIG9mIGEgY2FsY3VsYXRpb24gaW4gTVBGUiBpcyBzcGVjaWZpZWQgYXMgZm9sbG93czogQ29tcHV0ZSB0aGUKcmVxdWVzdGVkIG9wZXJhdGlvbiBleGFjdGx5ICh3aXRoIGBgaW5maW5pdGUgYWNjdXJhY3knJyksIGFuZCByb3VuZCB0aGUgcmVzdWx0CnRvIHRoZSBwcmVjaXNpb24gb2YgdGhlIGRlc3RpbmF0aW9uIHZhcmlhYmxlLCB3aXRoIHRoZSBnaXZlbiByb3VuZGluZyBtb2RlLgpUaGUgTVBGUiBmbG9hdGluZy1wb2ludCBmdW5jdGlvbnMgYXJlIGludGVuZGVkIHRvIGJlIGEgc21vb3RoIGV4dGVuc2lvbgpvZiB0aGUgSUVFRSA3NTQtMTk4NSBhcml0aG1ldGljLiBUaGUgcmVzdWx0cyBvYnRhaW5lZCBvbiBvbmUgY29tcHV0ZXIgc2hvdWxkCm5vdCBkaWZmZXIgZnJvbSB0aGUgcmVzdWx0cyBvYnRhaW5lZCBvbiBhIGNvbXB1dGVyIHdpdGggYSBkaWZmZXJlbnQgd29yZCBzaXplLgoKQGNpbmRleCBBY2N1cmFjeQpNUEZSIGRvZXMgbm90IGtlZXAgdHJhY2sgb2YgdGhlIGFjY3VyYWN5IG9mIGEgY29tcHV0YXRpb24uIFRoaXMgaXMgbGVmdAp0byB0aGUgdXNlciBvciB0byBhIGhpZ2hlciBsYXllci4KQXMgYSBjb25zZXF1ZW5jZSwgaWYgdHdvIHZhcmlhYmxlcyBhcmUgdXNlZCB0byBzdG9yZQpvbmx5IGEgZmV3IHNpZ25pZmljYW50IGJpdHMsIGFuZCB0aGVpciBwcm9kdWN0IGlzIHN0b3JlZCBpbiBhIHZhcmlhYmxlIHdpdGggbGFyZ2UKcHJlY2lzaW9uLCB0aGVuIE1QRlIgd2lsbCBzdGlsbCBjb21wdXRlIHRoZSByZXN1bHQgd2l0aCBmdWxsIHByZWNpc2lvbi4KClRoZSB2YWx1ZSBvZiB0aGUgc3RhbmRhcmQgQyBtYWNybyBAY29kZXtlcnJub30gbWF5IGJlIHNldCB0byBub24temVybyBieQphbnkgTVBGUiBmdW5jdGlvbiBvciBtYWNybywgd2hldGhlciBvciBub3QgdGhlcmUgaXMgYW4gZXJyb3IuCgpAbWVudQoqIEluaXRpYWxpemF0aW9uIEZ1bmN0aW9uczo6CiogQXNzaWdubWVudCBGdW5jdGlvbnM6OgoqIENvbWJpbmVkIEluaXRpYWxpemF0aW9uIGFuZCBBc3NpZ25tZW50IEZ1bmN0aW9uczo6CiogQ29udmVyc2lvbiBGdW5jdGlvbnM6OgoqIEJhc2ljIEFyaXRobWV0aWMgRnVuY3Rpb25zOjoKKiBDb21wYXJpc29uIEZ1bmN0aW9uczo6CiogU3BlY2lhbCBGdW5jdGlvbnM6OgoqIElucHV0IGFuZCBPdXRwdXQgRnVuY3Rpb25zOjoKKiBGb3JtYXR0ZWQgT3V0cHV0IEZ1bmN0aW9uczo6CiogSW50ZWdlciBSZWxhdGVkIEZ1bmN0aW9uczo6CiogUm91bmRpbmcgUmVsYXRlZCBGdW5jdGlvbnM6OgoqIE1pc2NlbGxhbmVvdXMgRnVuY3Rpb25zOjoKKiBFeGNlcHRpb24gUmVsYXRlZCBGdW5jdGlvbnM6OgoqIENvbXBhdGliaWxpdHkgd2l0aCBNUEY6OgoqIEN1c3RvbSBJbnRlcmZhY2U6OgoqIEludGVybmFsczo6CkBlbmQgbWVudQoKQG5vZGUgSW5pdGlhbGl6YXRpb24gRnVuY3Rpb25zLCBBc3NpZ25tZW50IEZ1bmN0aW9ucywgTVBGUiBJbnRlcmZhY2UsIE1QRlIgSW50ZXJmYWNlCkBjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cApAY2luZGV4IEluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucwpAc2VjdGlvbiBJbml0aWFsaXphdGlvbiBGdW5jdGlvbnMKCkFuIEBjb2Rle21wZnJfdH0gb2JqZWN0IG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHN0b3JpbmcgdGhlIGZpcnN0IHZhbHVlIGluCml0LiAgVGhlIGZ1bmN0aW9ucyBAY29kZXttcGZyX2luaXR9IGFuZCBAY29kZXttcGZyX2luaXQyfSBhcmUgdXNlZCBmb3IgdGhhdApwdXJwb3NlLgoKQGRlZnR5cGVmdW4gdm9pZCBtcGZyX2luaXQyIChtcGZyX3QgQHZhcnt4fSwgbXBfcHJlY190IEB2YXJ7cHJlY30pCkluaXRpYWxpemUgQHZhcnt4fSwgc2V0IGl0cyBwcmVjaXNpb24gdG8gYmUgQHN0cm9uZ3tleGFjdGx5fQpAdmFye3ByZWN9IGJpdHMgYW5kIGl0cyB2YWx1ZSB0byBOYU4uIChXYXJuaW5nOiB0aGUgY29ycmVzcG9uZGluZwpAY29kZXttcGZ9IGZ1bmN0aW9ucyBpbml0aWFsaXplIHRvIHplcm8gaW5zdGVhZC4pCgpOb3JtYWxseSwgYSB2YXJpYWJsZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgb25jZSBvbmx5IG9yIGF0CmxlYXN0IGJlIGNsZWFyZWQsIHVzaW5nIEBjb2Rle21wZnJfY2xlYXJ9LCBiZXR3ZWVuIGluaXRpYWxpemF0aW9ucy4KVG8gY2hhbmdlIHRoZSBwcmVjaXNpb24gb2YgYSB2YXJpYWJsZSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLAp1c2UgQGNvZGV7bXBmcl9zZXRfcHJlY30uClRoZSBwcmVjaXNpb24gQHZhcntwcmVjfSBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiBAY29kZXtNUEZSX1BSRUNfTUlOfSBhbmQKQGNvZGV7TVBGUl9QUkVDX01BWH0gKG90aGVyd2lzZSB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkKS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biB2b2lkIG1wZnJfaW5pdHMyIChtcF9wcmVjX3QgQHZhcntwcmVjfSwgbXBmcl90IEB2YXJ7eH0sIC4uLikKSW5pdGlhbGl6ZSBhbGwgdGhlIEBjb2Rle21wZnJfdH0gdmFyaWFibGVzIG9mIHRoZSBnaXZlbiBAY29kZXt2YV9saXN0fSwKc2V0IHRoZWlyIHByZWNpc2lvbiB0byBiZSBAc3Ryb25ne2V4YWN0bHl9CkB2YXJ7cHJlY30gYml0cyBhbmQgdGhlaXIgdmFsdWUgdG8gTmFOLgpTZWUgQGNvZGV7bXBmcl9pbml0Mn0gZm9yIG1vcmUgZGV0YWlscy4KVGhlIEBjb2Rle3ZhX2xpc3R9IGlzIGFzc3VtZWQgdG8gYmUgY29tcG9zZWQgb25seSBvZiB0eXBlIEBjb2Rle21wZnJfdH0KKG9yIGVxdWl2YWxlbnRseSBAY29kZXttcGZyX3B0cn0pLgpJdCBiZWdpbnMgZnJvbSBAdmFye3h9LiBJdCBlbmRzIHdoZW4gaXQgZW5jb3VudGVycyBhIG51bGwgcG9pbnRlciAod2hvc2UKdHlwZSBtdXN0IGFsc28gYmUgQGNvZGV7bXBmcl9wdHJ9KS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biB2b2lkIG1wZnJfY2xlYXIgKG1wZnJfdCBAdmFye3h9KQpGcmVlIHRoZSBzcGFjZSBvY2N1cGllZCBieSBAdmFye3h9LiAgTWFrZSBzdXJlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgYWxsCkBjb2Rle21wZnJfdH0gdmFyaWFibGVzIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhlbS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biB2b2lkIG1wZnJfY2xlYXJzIChtcGZyX3QgQHZhcnt4fSwgLi4uKQpGcmVlIHRoZSBzcGFjZSBvY2N1cGllZCBieSBhbGwgdGhlIEBjb2Rle21wZnJfdH0gdmFyaWFibGVzIG9mIHRoZSBnaXZlbgpAY29kZXt2YV9saXN0fS4gU2VlIEBjb2Rle21wZnJfY2xlYXJ9IGZvciBtb3JlIGRldGFpbHMuClRoZSBAY29kZXt2YV9saXN0fSBpcyBhc3N1bWVkIHRvIGJlIGNvbXBvc2VkIG9ubHkgb2YgdHlwZSBAY29kZXttcGZyX3R9CihvciBlcXVpdmFsZW50bHkgQGNvZGV7bXBmcl9wdHJ9KS4KSXQgYmVnaW5zIGZyb20gQHZhcnt4fS4gSXQgZW5kcyB3aGVuIGl0IGVuY291bnRlcnMgYSBudWxsIHBvaW50ZXIgKHdob3NlCnR5cGUgbXVzdCBhbHNvIGJlIEBjb2Rle21wZnJfcHRyfSkuCkBlbmQgZGVmdHlwZWZ1bgoKSGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgbXVsdGlwbGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zOgoKQGV4YW1wbGUKQHsKICBtcGZyX3QgeCwgeSwgeiwgdDsKICBtcGZyX2luaXRzMiAoMjU2LCB4LCB5LCB6LCB0LCAobXBmcl9wdHIpIDApOwogIEBkb3Rze30KICBtcGZyX2NsZWFycyAoeCwgeSwgeiwgdCwgKG1wZnJfcHRyKSAwKTsKQH0KQGVuZCBleGFtcGxlCgpAZGVmdHlwZWZ1biB2b2lkIG1wZnJfaW5pdCAobXBmcl90IEB2YXJ7eH0pCkluaXRpYWxpemUgQHZhcnt4fSBhbmQgc2V0IGl0cyB2YWx1ZSB0byBOYU4uCgpOb3JtYWxseSwgYSB2YXJpYWJsZSBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgb25jZSBvbmx5Cm9yIGF0IGxlYXN0IGJlIGNsZWFyZWQsIHVzaW5nIEBjb2Rle21wZnJfY2xlYXJ9LCBiZXR3ZWVuIGluaXRpYWxpemF0aW9ucy4gIFRoZQpwcmVjaXNpb24gb2YgQHZhcnt4fSBpcyB0aGUgZGVmYXVsdCBwcmVjaXNpb24sIHdoaWNoIGNhbiBiZSBjaGFuZ2VkCmJ5IGEgY2FsbCB0byBAY29kZXttcGZyX3NldF9kZWZhdWx0X3ByZWN9LgoKV2FybmluZyEgSW4gYSBnaXZlbiBwcm9ncmFtLCBzb21lIG90aGVyIGxpYnJhcmllcyBtaWdodCBjaGFuZ2UgdGhlIGRlZmF1bHQKcHJlY2lzaW9uIGFuZCBub3QgcmVzdG9yZSBpdC4gVGh1cyBpdCBpcyBzYWZlciB0byB1c2UgQGNvZGV7bXBmcl9pbml0Mn0uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gdm9pZCBtcGZyX2luaXRzIChtcGZyX3QgQHZhcnt4fSwgLi4uKQpJbml0aWFsaXplIGFsbCB0aGUgQGNvZGV7bXBmcl90fSB2YXJpYWJsZXMgb2YgdGhlIGdpdmVuIEBjb2Rle3ZhX2xpc3R9LApzZXQgdGhlaXIgcHJlY2lzaW9uIHRvIGJlIHRoZSBkZWZhdWx0IHByZWNpc2lvbiBhbmQgdGhlaXIgdmFsdWUgdG8gTmFOLgpTZWUgQGNvZGV7bXBmcl9pbml0fSBmb3IgbW9yZSBkZXRhaWxzLgpUaGUgQGNvZGV7dmFfbGlzdH0gaXMgYXNzdW1lZCB0byBiZSBjb21wb3NlZCBvbmx5IG9mIHR5cGUgQGNvZGV7bXBmcl90fQoob3IgZXF1aXZhbGVudGx5IEBjb2Rle21wZnJfcHRyfSkuCkl0IGJlZ2lucyBmcm9tIEB2YXJ7eH0uIEl0IGVuZHMgd2hlbiBpdCBlbmNvdW50ZXJzIGEgbnVsbCBwb2ludGVyICh3aG9zZQp0eXBlIG11c3QgYWxzbyBiZSBAY29kZXttcGZyX3B0cn0pLgoKV2FybmluZyEgSW4gYSBnaXZlbiBwcm9ncmFtLCBzb21lIG90aGVyIGxpYnJhcmllcyBtaWdodCBjaGFuZ2UgdGhlIGRlZmF1bHQKcHJlY2lzaW9uIGFuZCBub3QgcmVzdG9yZSBpdC4gVGh1cyBpdCBpcyBzYWZlciB0byB1c2UgQGNvZGV7bXBmcl9pbml0czJ9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZtYWMgTVBGUl9ERUNMX0lOSVQgKEB2YXJ7bmFtZX0sIEB2YXJ7cHJlY30pClRoaXMgbWFjcm8gZGVjbGFyZXMgQHZhcntuYW1lfSBhcyBhbiBhdXRvbWF0aWMgdmFyaWFibGUgb2YgdHlwZSBAY29kZXttcGZyX3R9LAppbml0aWFsaXplcyBpdCBhbmQgc2V0cyBpdHMgcHJlY2lzaW9uIHRvIGJlIEBzdHJvbmd7ZXhhY3RseX0gQHZhcntwcmVjfSBiaXRzCmFuZCBpdHMgdmFsdWUgdG8gTmFOLiBAdmFye25hbWV9IG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyLgpZb3UgbXVzdCB1c2UgdGhpcyBtYWNybyBpbiB0aGUgZGVjbGFyYXRpb24gc2VjdGlvbi4KVGhpcyBtYWNybyBpcyBtdWNoIGZhc3RlciB0aGFuIHVzaW5nIEBjb2Rle21wZnJfaW5pdDJ9IGJ1dCBoYXMgc29tZQpkcmF3YmFja3M6CgpAaXRlbWl6ZSBAYnVsbGV0CkBpdGVtIFlvdSBAc3Ryb25ne211c3Qgbm90fSBjYWxsIEBjb2Rle21wZnJfY2xlYXJ9IHdpdGggdmFyaWFibGVzCmNyZWF0ZWQgd2l0aCB0aGlzIG1hY3JvICh0aGUgc3RvcmFnZSBpcyBhbGxvY2F0ZWQgYXQgdGhlIHBvaW50IG9mIGRlY2xhcmF0aW9uCmFuZCBkZWFsbG9jYXRlZCB3aGVuIHRoZSBicmFjZS1sZXZlbCBpcyBleGl0ZWQpLgpAaXRlbSBZb3UgQHN0cm9uZ3tjYW5ub3R9IGNoYW5nZSB0aGVpciBwcmVjaXNpb24uCkBpdGVtIFlvdSBAc3Ryb25ne3Nob3VsZCBub3R9IGNyZWF0ZSB2YXJpYWJsZXMgd2l0aCBodWdlIHByZWNpc2lvbiB3aXRoIHRoaXMKbWFjcm8uCkBpdGVtIFlvdXIgY29tcGlsZXIgbXVzdCBzdXBwb3J0IEBzYW1we05vbi1Db25zdGFudCBJbml0aWFsaXplcnN9IChzdGFuZGFyZAppbiBDKysgYW5kIElTTyBDOTkpIGFuZCBAc2FtcHtUb2tlbiBQYXN0aW5nfQooc3RhbmRhcmQgaW4gSVNPIEM4OSkuIElmIEB2YXJ7cHJlY30gaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiwgeW91cgpjb21waWxlciBtdXN0IHN1cHBvcnQgQHNhbXB7dmFyaWFibGUtbGVuZ3RoIGF1dG9tYXRpYyBhcnJheXN9IChzdGFuZGFyZAppbiBJU08gQzk5KS4gQHNhbXB7R0NDIDIuOTUuM30gYW5kIGFib3ZlIHN1cHBvcnRzIGFsbCB0aGVzZSBmZWF0dXJlcy4KSWYgeW91IGNvbXBpbGUgeW91ciBwcm9ncmFtIHdpdGggZ2NjIGluIGM4OSBtb2RlIGFuZCB3aXRoIEBzYW1wey1wZWRhbnRpY30sCnlvdSBtYXkgd2FudCB0byBkZWZpbmUgdGhlIEBjb2Rle01QRlJfVVNFX0VYVEVOU0lPTn0gbWFjcm8gdG8gYXZvaWQgd2FybmluZ3MKZHVlIHRvIHRoZSBAY29kZXtNUEZSX0RFQ0xfSU5JVH0gaW1wbGVtZW50YXRpb24uCkBlbmQgaXRlbWl6ZQpAZW5kIGRlZm1hYwoKQGRlZnR5cGVmdW4gdm9pZCBtcGZyX3NldF9kZWZhdWx0X3ByZWMgKG1wX3ByZWNfdCBAdmFye3ByZWN9KQpTZXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uIHRvIGJlIEBzdHJvbmd7ZXhhY3RseX0gQHZhcntwcmVjfSBiaXRzLiAgVGhlCnByZWNpc2lvbiBvZiBhIHZhcmlhYmxlIG1lYW5zIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIHRvIHN0b3JlIGl0cyBzaWduaWZpY2FuZC4KQWxsCnN1YnNlcXVlbnQgY2FsbHMgdG8gQGNvZGV7bXBmcl9pbml0fSB3aWxsIHVzZSB0aGlzIHByZWNpc2lvbiwgYnV0IHByZXZpb3VzbHkKaW5pdGlhbGl6ZWQgdmFyaWFibGVzIGFyZSB1bmFmZmVjdGVkLgpUaGlzIGRlZmF1bHQgcHJlY2lzaW9uIGlzIHNldCB0byA1MyBiaXRzIGluaXRpYWxseS4KVGhlIHByZWNpc2lvbiBjYW4gYmUgYW55IGludGVnZXIgYmV0d2VlbiBAY29kZXtNUEZSX1BSRUNfTUlOfSBhbmQKQGNvZGV7TVBGUl9QUkVDX01BWH0uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gbXBfcHJlY190IG1wZnJfZ2V0X2RlZmF1bHRfcHJlYyAodm9pZCkKUmV0dXJuIHRoZSBkZWZhdWx0IE1QRlIgcHJlY2lzaW9uIGluIGJpdHMuCkBlbmQgZGVmdHlwZWZ1bgoKQG5lZWQgMjAwMApIZXJlIGlzIGFuIGV4YW1wbGUgb24gaG93IHRvIGluaXRpYWxpemUgZmxvYXRpbmctcG9pbnQgdmFyaWFibGVzOgoKQGV4YW1wbGUKQHsKICBtcGZyX3QgeCwgeTsKICBtcGZyX2luaXQgKHgpOyAgICAgICAgICAgICAgICAvKiB1c2UgZGVmYXVsdCBwcmVjaXNpb24gKi8KICBtcGZyX2luaXQyICh5LCAyNTYpOyAgICAgICAgICAvKiBwcmVjaXNpb24gQGVtcGh7ZXhhY3RseX0gMjU2IGJpdHMgKi8KICBAZG90c3t9CiAgLyogV2hlbiB0aGUgcHJvZ3JhbSBpcyBhYm91dCB0byBleGl0LCBkbyAuLi4gKi8KICBtcGZyX2NsZWFyICh4KTsKICBtcGZyX2NsZWFyICh5KTsKICBtcGZyX2ZyZWVfY2FjaGUgKCk7CkB9CkBlbmQgZXhhbXBsZQoKVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWZ1bCBmb3IgY2hhbmdpbmcgdGhlIHByZWNpc2lvbiBkdXJpbmcgYQpjYWxjdWxhdGlvbi4gIEEgdHlwaWNhbCB1c2Ugd291bGQgYmUgZm9yIGFkanVzdGluZyB0aGUgcHJlY2lzaW9uIGdyYWR1YWxseSBpbgppdGVyYXRpdmUgYWxnb3JpdGhtcyBsaWtlIE5ld3Rvbi1SYXBoc29uLCBtYWtpbmcgdGhlIGNvbXB1dGF0aW9uIHByZWNpc2lvbgpjbG9zZWx5IG1hdGNoIHRoZSBhY3R1YWwgYWNjdXJhdGUgcGFydCBvZiB0aGUgbnVtYmVycy4KCkBkZWZ0eXBlZnVuIHZvaWQgbXBmcl9zZXRfcHJlYyAobXBmcl90IEB2YXJ7eH0sIG1wX3ByZWNfdCBAdmFye3ByZWN9KQpSZXNldCB0aGUgcHJlY2lzaW9uIG9mIEB2YXJ7eH0gdG8gYmUgQHN0cm9uZ3tleGFjdGx5fSBAdmFye3ByZWN9IGJpdHMsCmFuZCBzZXQgaXRzIHZhbHVlIHRvIE5hTi4KVGhlIHByZXZpb3VzIHZhbHVlIHN0b3JlZCBpbiBAdmFye3h9IGlzIGxvc3QuIEl0IGlzIGVxdWl2YWxlbnQgdG8KYSBjYWxsIHRvIEBjb2Rle21wZnJfY2xlYXIoeCl9IGZvbGxvd2VkIGJ5IGEgY2FsbCB0bwpAY29kZXttcGZyX2luaXQyKHgsIHByZWMpfSwgYnV0IG1vcmUgZWZmaWNpZW50IGFzIG5vIGFsbG9jYXRpb24gaXMgZG9uZSBpbgpjYXNlIHRoZSBjdXJyZW50IGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlIHNpZ25pZmljYW5kIG9mIEB2YXJ7eH0gaXMgZW5vdWdoLgpUaGUgcHJlY2lzaW9uIEB2YXJ7cHJlY30gY2FuIGJlIGFueSBpbnRlZ2VyIGJldHdlZW4gQGNvZGV7TVBGUl9QUkVDX01JTn0gYW5kCkBjb2Rle01QRlJfUFJFQ19NQVh9LgoKSW4gY2FzZSB5b3Ugd2FudCB0byBrZWVwIHRoZSBwcmV2aW91cyB2YWx1ZSBzdG9yZWQgaW4gQHZhcnt4fSwKdXNlIEBjb2Rle21wZnJfcHJlY19yb3VuZH0gaW5zdGVhZC4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBtcF9wcmVjX3QgbXBmcl9nZXRfcHJlYyAobXBmcl90IEB2YXJ7eH0pClJldHVybiB0aGUgcHJlY2lzaW9uIGFjdHVhbGx5IHVzZWQgZm9yIGFzc2lnbm1lbnRzIG9mIEB2YXJ7eH0sIGkuZS5AOiB0aGUKbnVtYmVyIG9mIGJpdHMgdXNlZCB0byBzdG9yZSBpdHMgc2lnbmlmaWNhbmQuCkBlbmQgZGVmdHlwZWZ1bgoKQG5vZGUgQXNzaWdubWVudCBGdW5jdGlvbnMsIENvbWJpbmVkIEluaXRpYWxpemF0aW9uIGFuZCBBc3NpZ25tZW50IEZ1bmN0aW9ucywgSW5pdGlhbGl6YXRpb24gRnVuY3Rpb25zLCBNUEZSIEludGVyZmFjZQpAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKQGNpbmRleCBBc3NpZ25tZW50IGZ1bmN0aW9ucwpAc2VjdGlvbiBBc3NpZ25tZW50IEZ1bmN0aW9ucwoKVGhlc2UgZnVuY3Rpb25zIGFzc2lnbiBuZXcgdmFsdWVzIHRvIGFscmVhZHkgaW5pdGlhbGl6ZWQgZmxvYXRzCihAcHhyZWZ7SW5pdGlhbGl6YXRpb24gRnVuY3Rpb25zfSkuIFdoZW4gdXNpbmcgYW55IGZ1bmN0aW9ucyB1c2luZwpAY29kZXtpbnRtYXhfdH0sIHlvdSBtdXN0IGluY2x1ZGUgQGNvZGV7PHN0ZGludC5oPn0gb3IgQGNvZGV7PGludHR5cGVzLmg+fQpiZWZvcmUgQGZpbGV7bXBmci5ofSwgdG8gYWxsb3cgQGZpbGV7bXBmci5ofSB0byBkZWZpbmUgcHJvdG90eXBlcyBmb3IKdGhlc2UgZnVuY3Rpb25zLgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfc2V0IChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3NldF91aSAobXBmcl90IEB2YXJ7cm9wfSwgdW5zaWduZWQgbG9uZyBpbnQgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3NldF9zaSAobXBmcl90IEB2YXJ7cm9wfSwgbG9uZyBpbnQgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3NldF91aiAobXBmcl90IEB2YXJ7cm9wfSwgdWludG1heF90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9zZXRfc2ogKG1wZnJfdCBAdmFye3JvcH0sIGludG1heF90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9zZXRfZCAobXBmcl90IEB2YXJ7cm9wfSwgZG91YmxlIEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9zZXRfbGQgKG1wZnJfdCBAdmFye3JvcH0sIGxvbmcgZG91YmxlIEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9zZXRfZGVjaW1hbDY0IChtcGZyX3QgQHZhcntyb3B9LCBfRGVjaW1hbDY0IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9zZXRfeiAobXBmcl90IEB2YXJ7cm9wfSwgbXB6X3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3NldF9xIChtcGZyX3QgQHZhcntyb3B9LCBtcHFfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfc2V0X2YgKG1wZnJfdCBAdmFye3JvcH0sIG1wZl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pClNldCB0aGUgdmFsdWUgb2YgQHZhcntyb3B9IGZyb20gQHZhcntvcH0sIHJvdW5kZWQKdG93YXJkIHRoZSBnaXZlbiBkaXJlY3Rpb24gQHZhcntybmR9LgpOb3RlIHRoYXQgdGhlIGlucHV0IDAgaXMgY29udmVydGVkIHRvICswIGJ5IEBjb2Rle21wZnJfc2V0X3VpfSwKQGNvZGV7bXBmcl9zZXRfc2l9LCBAY29kZXttcGZyX3NldF9zan0sIEBjb2Rle21wZnJfc2V0X3VqfSwKQGNvZGV7bXBmcl9zZXRfen0sIEBjb2Rle21wZnJfc2V0X3F9IGFuZApAY29kZXttcGZyX3NldF9mfSwgcmVnYXJkbGVzcyBvZiB0aGUgcm91bmRpbmcgbW9kZS4KSWYgdGhlIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBJRUVFLTc1NCBzdGFuZGFyZCwgQGNvZGV7bXBmcl9zZXRfZH0sCkBjb2Rle21wZnJfc2V0X2xkfSBhbmQKQGNvZGV7bXBmcl9zZXRfZGVjaW1hbDY0fSBtaWdodCBub3QgcHJlc2VydmUgdGhlIHNpZ25lZCB6ZXJvcy4KVGhlIEBjb2Rle21wZnJfc2V0X2RlY2ltYWw2NH0gZnVuY3Rpb24gaXMgYnVpbHQgb25seSB3aXRoIHRoZSBjb25maWd1cmUKb3B0aW9uIEBzYW1wey0tZW5hYmxlLWRlY2ltYWwtZmxvYXR9LCB3aGljaCBhbHNvIHJlcXVpcmVzCkBzYW1wey0td2l0aC1nbXAtYnVpbGR9LCBhbmQgd2hlbiB0aGUgY29tcGlsZXIgb3IKc3lzdGVtIHByb3ZpZGVzIHRoZSBAc2FtcHtfRGVjaW1hbDY0fSBkYXRhIHR5cGUKKEdDQyB2ZXJzaW9uIDQuMi4wIGlzIGtub3duIHRvIHN1cHBvcnQgdGhpcyBkYXRhIHR5cGUsCmJ1dCBvbmx5IHdoZW4gY29uZmlndXJlZCB3aXRoIEBzYW1wey0tZW5hYmxlLWRlY2ltYWwtZmxvYXR9IHRvbykuCkBjb2Rle21wZnJfc2V0X3F9IG1pZ2h0IG5vdCBiZSBhYmxlIHRvIHdvcmsgaWYgdGhlIG51bWVyYXRvciAob3IgdGhlCmRlbm9taW5hdG9yKSBjYW4gbm90IGJlIHJlcHJlc2VudGFibGUgYXMgYSBAY29kZXttcGZyX3R9LgoKTm90ZTogSWYgeW91IHdhbnQgdG8gc3RvcmUgYSBmbG9hdGluZy1wb2ludCBjb25zdGFudCB0byBhIEBjb2Rle21wZnJfdH0sCnlvdSBzaG91bGQgdXNlIEBjb2Rle21wZnJfc2V0X3N0cn0gKG9yIG9uZSBvZiB0aGUgTVBGUiBjb25zdGFudCBmdW5jdGlvbnMsCnN1Y2ggYXMgQGNvZGV7bXBmcl9jb25zdF9waX0gZm9yIEBte1xwaSxQaX0pIGluc3RlYWQgb2YgQGNvZGV7bXBmcl9zZXRfZH0sCkBjb2Rle21wZnJfc2V0X2xkfSBvciBAY29kZXttcGZyX3NldF9kZWNpbWFsNjR9LgpPdGhlcndpc2UgdGhlIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50IHdpbGwgYmUgZmlyc3QKY29udmVydGVkIGludG8gYSByZWR1Y2VkLXByZWNpc2lvbiAoZS5nLiwgNTMtYml0KSBiaW5hcnkgbnVtYmVyIGJlZm9yZQpNUEZSIGNhbiB3b3JrIHdpdGggaXQuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfc2V0X3VpXzJleHAgKG1wZnJfdCBAdmFye3JvcH0sIHVuc2lnbmVkIGxvbmcgaW50IEB2YXJ7b3B9LCBtcF9leHBfdCBAdmFye2V9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9zZXRfc2lfMmV4cCAobXBmcl90IEB2YXJ7cm9wfSwgbG9uZyBpbnQgQHZhcntvcH0sIG1wX2V4cF90IEB2YXJ7ZX0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3NldF91al8yZXhwIChtcGZyX3QgQHZhcntyb3B9LCB1aW50bWF4X3QgQHZhcntvcH0sIGludG1heF90IEB2YXJ7ZX0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3NldF9zal8yZXhwIChtcGZyX3QgQHZhcntyb3B9LCBpbnRtYXhfdCBAdmFye29wfSwgaW50bWF4X3QgQHZhcntlfSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgdGhlIHZhbHVlIG9mIEB2YXJ7cm9wfSBmcm9tIEBte0B2YXJ7b3B9IFx0aW1lcyAyXmUsIEB2YXJ7b3B9IG11bHRpcGxpZWQgYnkKdHdvIHRvIHRoZSBwb3dlciBAdmFye2V9fSwgcm91bmRlZCB0b3dhcmQgdGhlIGdpdmVuIGRpcmVjdGlvbiBAdmFye3JuZH0uCk5vdGUgdGhhdCB0aGUgaW5wdXQgMCBpcyBjb252ZXJ0ZWQgdG8gKzAuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfc2V0X3N0ciAobXBmcl90IEB2YXJ7cm9wfSwgY29uc3QgY2hhciAqQHZhcntzfSwgaW50IEB2YXJ7YmFzZX0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byB0aGUgdmFsdWUgb2YgdGhlIHN0cmluZyBAdmFye3N9IGluIGJhc2UgQHZhcntiYXNlfSwKcm91bmRlZCBpbiB0aGUgZGlyZWN0aW9uIEB2YXJ7cm5kfS4KU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIEBjb2Rle21wZnJfc3RydG9mcn0gZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24Kb2YgdGhlIHZhbGlkIHN0cmluZyBmb3JtYXRzLgpDb250cmFyeSB0byBAY29kZXttcGZyX3N0cnRvZnJ9LCBAY29kZXttcGZyX3NldF9zdHJ9IHJlcXVpcmVzIHRoZQpAZW1waHt3aG9sZX0gc3RyaW5nIHRvIHJlcHJlc2VudCBhIHZhbGlkIGZsb2F0aW5nLXBvaW50IG51bWJlci4KQGMgQWRkaXRpb25hbGx5LCBzcGVjaWFsIHZhbHVlcwpAYyBAY29kZXtAQE5hTkBAfSwgQGNvZGV7QEBJbmZAQH0sIEBjb2RleytAQEluZkBAfSBhbmQgQGNvZGV7LUBASW5mQEB9LApAYyBhbGwgY2FzZSBpbnNlbnNpdGl2ZSwgd2l0aG91dCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHBvc3NpYmx5IGZvbGxvd2VkIGJ5CkBjIG90aGVyIGNoYXJhY3RlcnMsIGFyZSBhY2NlcHRlZCB0b28gKGl0IG1heSBjaGFuZ2UpLgpUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBpZiB0aGUgZW50aXJlIHN0cmluZyB1cCB0byB0aGUgZmluYWwgbnVsbCBjaGFyYWN0ZXIKaXMgYSB2YWxpZCBudW1iZXIgaW4gYmFzZSBAdmFye2Jhc2V9OyBvdGhlcndpc2UgaXQgcmV0dXJucyBAbWludXN7fTEsIGFuZApAdmFye3JvcH0gbWF5IGhhdmUgY2hhbmdlZC4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9zdHJ0b2ZyIChtcGZyX3QgQHZhcntyb3B9LCBjb25zdCBjaGFyICpAdmFye25wdHJ9LCBjaGFyICoqQHZhcntlbmRwdHJ9LCBpbnQgQHZhcntiYXNlfSwgbXBfcm5kX3QgQHZhcntybmR9KQoKUmVhZCBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBmcm9tIGEgc3RyaW5nIEB2YXJ7bnB0cn0gaW4gYmFzZSBAdmFye2Jhc2V9LApyb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9OyBAdmFye2Jhc2V9IG11c3QgYmUgZWl0aGVyIDAgKHRvCmRldGVjdCB0aGUgYmFzZSwgYXMgZGVzY3JpYmVkIGJlbG93KSBvciBhIG51bWJlciBmcm9tIDIgdG8gMzYgKG90aGVyd2lzZQp0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkKS4gSWYgQHZhcntucHRyfSBzdGFydHMgd2l0aCB2YWxpZCBkYXRhLCB0aGUKcmVzdWx0IGlzIHN0b3JlZCBpbiBAdmFye3JvcH0gYW5kIEBjb2RleypAdmFye2VuZHB0cn19IHBvaW50cyB0byB0aGUKY2hhcmFjdGVyIGp1c3QgYWZ0ZXIgdGhlIHZhbGlkIGRhdGEgKGlmIEB2YXJ7ZW5kcHRyfSBpcyBub3QgYSBudWxsIHBvaW50ZXIpOwpvdGhlcndpc2UgQHZhcntyb3B9IGlzIHNldCB0byB6ZXJvIGFuZCB0aGUgdmFsdWUgb2YgQHZhcntucHRyfSBpcyBzdG9yZWQKaW4gdGhlIGxvY2F0aW9uIHJlZmVyZW5jZWQgYnkgQHZhcntlbmRwdHJ9IChpZiBAdmFye2VuZHB0cn0gaXMgbm90IGEgbnVsbApwb2ludGVyKS4gVGhlIHVzdWFsIHRlcm5hcnkgdmFsdWUgaXMgcmV0dXJuZWQuCgpQYXJzaW5nIGZvbGxvd3MgdGhlIHN0YW5kYXJkIEMgQGNvZGV7c3RydG9kfSBmdW5jdGlvbiB3aXRoIHNvbWUgZXh0ZW5zaW9ucy4KQ2FzZSBpcyBpZ25vcmVkLiBBZnRlciBvcHRpb25hbCBsZWFkaW5nIHdoaXRlc3BhY2UsIG9uZSBoYXMgYSBzdWJqZWN0CnNlcXVlbmNlIGNvbnNpc3Rpbmcgb2YgYW4gb3B0aW9uYWwgc2lnbiAoQGNvZGV7K30gb3IgQGNvZGV7LX0pLCBhbmQgZWl0aGVyCm51bWVyaWMgZGF0YSBvciBzcGVjaWFsIGRhdGEuIFRoZSBzdWJqZWN0IHNlcXVlbmNlIGlzIGRlZmluZWQgYXMgdGhlCmxvbmdlc3QgaW5pdGlhbCBzdWJzZXF1ZW5jZSBvZiB0aGUgaW5wdXQgc3RyaW5nLCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdApub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHRoYXQgaXMgb2YgdGhlIGV4cGVjdGVkIGZvcm0uCgpUaGUgZm9ybSBvZiBudW1lcmljIGRhdGEgaXMgYSBub24tZW1wdHkgc2VxdWVuY2Ugb2Ygc2lnbmlmaWNhbmQgZGlnaXRzCndpdGggYW4gb3B0aW9uYWwgZGVjaW1hbCBwb2ludCwgYW5kIGFuIG9wdGlvbmFsIGV4cG9uZW50IGNvbnNpc3Rpbmcgb2YKYW4gZXhwb25lbnQgcHJlZml4IGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIHNpZ24gYW5kIGEgbm9uLWVtcHR5IHNlcXVlbmNlCm9mIGRlY2ltYWwgZGlnaXRzLiBBIHNpZ25pZmljYW5kIGRpZ2l0IGlzIGVpdGhlciBhIGRlY2ltYWwgZGlnaXQgb3IgYQpMYXRpbiBsZXR0ZXIgKDYyIHBvc3NpYmxlIGNoYXJhY3RlcnMpLCB3aXRoIEBjb2Rle2F9ID0gMTAsIEBjb2Rle2J9ID0gMTEsCkBkb3Rze30sIEBjb2Rle3p9ID0gMzU7IGl0cyB2YWx1ZSBtdXN0IGJlIHN0cmljdGx5IGxlc3MgdGhhbiB0aGUgYmFzZS4KVGhlIGRlY2ltYWwgcG9pbnQgY2FuIGJlIGVpdGhlciB0aGUgb25lIGRlZmluZWQgYnkgdGhlIGN1cnJlbnQgbG9jYWxlIG9yCnRoZSBwZXJpb2QgKHRoZSBmaXJzdCBvbmUgaXMgYWNjZXB0ZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIEMgc3RhbmRhcmQKYW5kIHRoZSBwcmFjdGljZSwgdGhlIHNlY29uZCBvbmUgaXMgYWNjZXB0ZWQgdG8gYWxsb3cgdGhlIHByb2dyYW1tZXIgdG8KcHJvdmlkZSBNUEZSIG51bWJlcnMgZnJvbSBzdHJpbmdzIGluIGEgd2F5IHRoYXQgZG9lcyBub3QgZGVwZW5kIG9uIHRoZQpjdXJyZW50IGxvY2FsZSkuClRoZSBleHBvbmVudCBwcmVmaXggY2FuIGJlIEBjb2Rle2V9IG9yIEBjb2Rle0V9IGZvciBiYXNlcyB1cCB0byAxMCwgb3IKQGNvZGV7QEB9IGluIGFueSBiYXNlOyBpdCBpbmRpY2F0ZXMgYSBtdWx0aXBsaWNhdGlvbiBieSBhIHBvd2VyIG9mIHRoZQpiYXNlLiBJbiBiYXNlcyAyIGFuZCAxNiwgdGhlIGV4cG9uZW50IHByZWZpeCBjYW4gYWxzbyBiZSBAY29kZXtwfSBvcgpAY29kZXtQfSwgaW4gd2hpY2ggY2FzZSBpdCBpbnRyb2R1Y2VzIGEgYmluYXJ5IGV4cG9uZW50OiBpdCBpbmRpY2F0ZXMgYQptdWx0aXBsaWNhdGlvbiBieSBhIHBvd2VyIG9mIDIgKHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBvbmx5IGZvciBiYXNlIDE2KS4KVGhlIHZhbHVlIG9mIGFuIGV4cG9uZW50IGlzIGFsd2F5cyB3cml0dGVuIGluIGJhc2UgMTAuCkluIGJhc2UgMiwgdGhlIHNpZ25pZmljYW5kIGNhbiBzdGFydCB3aXRoIEBjb2RlezBifSBvciBAY29kZXswQn0sIGFuZAppbiBiYXNlIDE2LCBpdCBjYW4gc3RhcnQgd2l0aCBAY29kZXsweH0gb3IgQGNvZGV7MFh9LgoKSWYgdGhlIGFyZ3VtZW50IEB2YXJ7YmFzZX0gaXMgMCwgdGhlbiB0aGUgYmFzZSBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkCmFzIGZvbGxvd3MuIElmIHRoZSBzaWduaWZpY2FuZCBzdGFydHMgd2l0aCBAY29kZXswYn0gb3IgQGNvZGV7MEJ9LCBiYXNlIDIKaXMgYXNzdW1lZC4gSWYgdGhlIHNpZ25pZmljYW5kIHN0YXJ0cyB3aXRoIEBjb2RlezB4fSBvciBAY29kZXswWH0sIGJhc2UgMTYKaXMgYXNzdW1lZC4gT3RoZXJ3aXNlIGJhc2UgMTAgaXMgYXNzdW1lZC4KCk5vdGU6IFRoZSBleHBvbmVudCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgYSBkaWdpdC4gT3RoZXJ3aXNlIHRoZSBwb3NzaWJsZQpleHBvbmVudCBwcmVmaXggYW5kIHNpZ24gYXJlIG5vdCBwYXJ0IG9mIHRoZSBudW1iZXIgKHdoaWNoIGVuZHMgd2l0aCB0aGUKc2lnbmlmaWNhbmQpLiBTaW1pbGFybHksIGlmIEBjb2RlezBifSwgQGNvZGV7MEJ9LCBAY29kZXsweH0gb3IgQGNvZGV7MFh9CmlzIG5vdCBmb2xsb3dlZCBieSBhIGJpbmFyeS9oZXhhZGVjaW1hbCBkaWdpdCwgdGhlbiB0aGUgc3ViamVjdCBzZXF1ZW5jZQpzdG9wcyBhdCB0aGUgY2hhcmFjdGVyIEBjb2RlezB9LgoKU3BlY2lhbCBkYXRhIChmb3IgaW5maW5pdGllcyBhbmQgTmFOKSBjYW4gYmUgQGNvZGV7QEBpbmZAQH0gb3IKQGNvZGV7QEBuYW5AQChuLWNoYXItc2VxdWVuY2UpfSwgYW5kIGlmIEBtYXRoe0B2YXJ7YmFzZX0gQGxle30gMTZ9LAppdCBjYW4gYWxzbyBiZSBAY29kZXtpbmZpbml0eX0sIEBjb2Rle2luZn0sIEBjb2Rle25hbn0gb3IKQGNvZGV7bmFuKG4tY2hhci1zZXF1ZW5jZSl9LCBhbGwgY2FzZSBpbnNlbnNpdGl2ZS4KQSBAY29kZXtuLWNoYXItc2VxdWVuY2V9IGlzIGEgbm9uLWVtcHR5IHN0cmluZyBjb250YWluaW5nIG9ubHkgZGlnaXRzLApMYXRpbiBsZXR0ZXJzIGFuZCB0aGUgdW5kZXJzY29yZSAoMCwgMSwgMiwgQGRvdHN7fSwgOSwgYSwgYiwgQGRvdHN7fSwgeiwKQSwgQiwgQGRvdHN7fSwgWiwgXykuIE5vdGU6IG9uZSBoYXMgYW4gb3B0aW9uYWwgc2lnbiBmb3IgYWxsIGRhdGEsIGV2ZW4KTmFOLgoKQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biB2b2lkIG1wZnJfc2V0X2luZiAobXBmcl90IEB2YXJ7eH0sIGludCBAdmFye3NpZ259KQpAZGVmdHlwZWZ1bnggdm9pZCBtcGZyX3NldF9uYW4gKG1wZnJfdCBAdmFye3h9KQpTZXQgdGhlIHZhcmlhYmxlIEB2YXJ7eH0gdG8gaW5maW5pdHkgb3IgTmFOIChOb3QtYS1OdW1iZXIpIHJlc3BlY3RpdmVseS4KSW4gQGNvZGV7bXBmcl9zZXRfaW5mfSwgQHZhcnt4fSBpcyBzZXQgdG8gcGx1cyBpbmZpbml0eSBpZmYgQHZhcntzaWdufSBpcwpub25uZWdhdGl2ZS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biB2b2lkIG1wZnJfc3dhcCAobXBmcl90IEB2YXJ7eH0sIG1wZnJfdCBAdmFye3l9KQpTd2FwIHRoZSB2YWx1ZXMgQHZhcnt4fSBhbmQgQHZhcnt5fSBlZmZpY2llbnRseS4gV2FybmluZzogdGhlCnByZWNpc2lvbnMgYXJlIGV4Y2hhbmdlZCB0b287IGluIGNhc2UgdGhlIHByZWNpc2lvbnMgYXJlIGRpZmZlcmVudCwKQGNvZGV7bXBmcl9zd2FwfSBpcyB0aHVzIG5vdCBlcXVpdmFsZW50IHRvIHRocmVlIEBjb2Rle21wZnJfc2V0fSBjYWxscwp1c2luZyBhIHRoaXJkIGF1eGlsaWFyeSB2YXJpYWJsZS4KQGVuZCBkZWZ0eXBlZnVuCgpAbm9kZSBDb21iaW5lZCBJbml0aWFsaXphdGlvbiBhbmQgQXNzaWdubWVudCBGdW5jdGlvbnMsIENvbnZlcnNpb24gRnVuY3Rpb25zLCBBc3NpZ25tZW50IEZ1bmN0aW9ucywgTVBGUiBJbnRlcmZhY2UKQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCkBjaW5kZXggQ29tYmluZWQgaW5pdGlhbGl6YXRpb24gYW5kIGFzc2lnbm1lbnQgZnVuY3Rpb25zCkBzZWN0aW9uIENvbWJpbmVkIEluaXRpYWxpemF0aW9uIGFuZCBBc3NpZ25tZW50IEZ1bmN0aW9ucwoKQGRlZnR5cGVmbiBNYWNybyBpbnQgbXBmcl9pbml0X3NldCAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZm54IE1hY3JvIGludCBtcGZyX2luaXRfc2V0X3VpIChtcGZyX3QgQHZhcntyb3B9LCB1bnNpZ25lZCBsb25nIGludCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZueCBNYWNybyBpbnQgbXBmcl9pbml0X3NldF9zaSAobXBmcl90IEB2YXJ7cm9wfSwgc2lnbmVkIGxvbmcgaW50IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZm54IE1hY3JvIGludCBtcGZyX2luaXRfc2V0X2QgKG1wZnJfdCBAdmFye3JvcH0sIGRvdWJsZSBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZueCBNYWNybyBpbnQgbXBmcl9pbml0X3NldF9sZCAobXBmcl90IEB2YXJ7cm9wfSwgbG9uZyBkb3VibGUgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmbnggTWFjcm8gaW50IG1wZnJfaW5pdF9zZXRfeiAobXBmcl90IEB2YXJ7cm9wfSwgbXB6X3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmbnggTWFjcm8gaW50IG1wZnJfaW5pdF9zZXRfcSAobXBmcl90IEB2YXJ7cm9wfSwgbXBxX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmbnggTWFjcm8gaW50IG1wZnJfaW5pdF9zZXRfZiAobXBmcl90IEB2YXJ7cm9wfSwgbXBmX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKSW5pdGlhbGl6ZSBAdmFye3JvcH0gYW5kIHNldCBpdHMgdmFsdWUgZnJvbSBAdmFye29wfSwgcm91bmRlZCBpbiB0aGUgZGlyZWN0aW9uCkB2YXJ7cm5kfS4KVGhlIHByZWNpc2lvbiBvZiBAdmFye3JvcH0gd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBhY3RpdmUgZGVmYXVsdCBwcmVjaXNpb24sCmFzIHNldCBieSBAY29kZXttcGZyX3NldF9kZWZhdWx0X3ByZWN9LgpAZW5kIGRlZnR5cGVmbgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfaW5pdF9zZXRfc3RyIChtcGZyX3QgQHZhcnt4fSwgY29uc3QgY2hhciAqQHZhcntzfSwgaW50IEB2YXJ7YmFzZX0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKSW5pdGlhbGl6ZSBAdmFye3h9IGFuZCBzZXQgaXRzIHZhbHVlIGZyb20KdGhlIHN0cmluZyBAdmFye3N9IGluIGJhc2UgQHZhcntiYXNlfSwKcm91bmRlZCBpbiB0aGUgZGlyZWN0aW9uIEB2YXJ7cm5kfS4KU2VlIEBjb2Rle21wZnJfc2V0X3N0cn0uCkBlbmQgZGVmdHlwZWZ1bgoKQG5vZGUgQ29udmVyc2lvbiBGdW5jdGlvbnMsIEJhc2ljIEFyaXRobWV0aWMgRnVuY3Rpb25zLCBDb21iaW5lZCBJbml0aWFsaXphdGlvbiBhbmQgQXNzaWdubWVudCBGdW5jdGlvbnMsIE1QRlIgSW50ZXJmYWNlCkBjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cApAY2luZGV4IENvbnZlcnNpb24gZnVuY3Rpb25zCkBzZWN0aW9uIENvbnZlcnNpb24gRnVuY3Rpb25zCgpAZGVmdHlwZWZ1biBkb3VibGUgbXBmcl9nZXRfZCAobXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCB7bG9uZyBkb3VibGV9IG1wZnJfZ2V0X2xkIChtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IF9EZWNpbWFsNjQgbXBmcl9nZXRfZGVjaW1hbDY0IChtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQ29udmVydCBAdmFye29wfSB0byBhIEBjb2Rle2RvdWJsZX0gKHJlc3BlY3RpdmVseSBAY29kZXtfRGVjaW1hbDY0fSBvcgpAY29kZXtsb25nIGRvdWJsZX0pLCB1c2luZyB0aGUgcm91bmRpbmcgbW9kZSBAdmFye3JuZH0uCklmIEB2YXJ7b3B9IGlzIE5hTiwgc29tZSBmaXhlZCBOYU4gKGVpdGhlciBxdWlldCBvciBzaWduYWxpbmcpIG9yIHRoZSByZXN1bHQKb2YgMC4wLzAuMCBpcyByZXR1cm5lZC4gSWYgQHZhcntvcH0gaXMgQHBvbXt9SW5mLCBhbiBpbmZpbml0eSBvZiB0aGUgc2FtZQpzaWduIG9yIHRoZSByZXN1bHQgb2YgQHBvbXt9MS4wLzAuMCBpcyByZXR1cm5lZC4gSWYgQHZhcntvcH0gaXMgemVybywgdGhlc2UKZnVuY3Rpb25zIHJldHVybiBhIHplcm8sIHRyeWluZyB0byBwcmVzZXJ2ZSBpdHMgc2lnbiwgaWYgcG9zc2libGUuClRoZSBAY29kZXttcGZyX2dldF9kZWNpbWFsNjR9IGZ1bmN0aW9uIGlzIGJ1aWx0IG9ubHkgdW5kZXIgc29tZSBjb25kaXRpb25zOgpzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQGNvZGV7bXBmcl9zZXRfZGVjaW1hbDY0fS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBkb3VibGUgbXBmcl9nZXRfZF8yZXhwIChsb25nICpAdmFye2V4cH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bngge2xvbmcgZG91YmxlfSBtcGZyX2dldF9sZF8yZXhwIChsb25nICpAdmFye2V4cH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpSZXR1cm4gQHZhcntkfSBhbmQgc2V0IEB2YXJ7ZXhwfSBzdWNoIHRoYXQgQG1hdGh7MC41QGxle31AR01QYWJze0B2YXJ7ZH19PDF9CmFuZCBAbXtAdmFye2R9XHRpbWVzIDJee2V4cH0sIEB2YXJ7ZH0gdGltZXMgMiByYWlzZWQgdG8gQHZhcntleHB9fSBlcXVhbHMKQHZhcntvcH0gcm91bmRlZCB0byBkb3VibGUgKHJlc3AuQDogbG9uZyBkb3VibGUpCnByZWNpc2lvbiwgdXNpbmcgdGhlIGdpdmVuIHJvdW5kaW5nIG1vZGUuCkBjb21tZW50IFNlZSBJU08gQyBzdGFuZGFyZCwgZnJleHAgZnVuY3Rpb24uCklmIEB2YXJ7b3B9IGlzIHplcm8sIHRoZW4gYSB6ZXJvIG9mIHRoZSBzYW1lIHNpZ24gKG9yIGFuIHVuc2lnbmVkIHplcm8sCmlmIHRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBoYXZlIHNpZ25lZCB6ZXJvcykgaXMgcmV0dXJuZWQsIGFuZApAdmFye2V4cH0gaXMgc2V0IHRvIDAuCklmIEB2YXJ7b3B9IGlzIE5hTiBvciBhbiBpbmZpbml0eSwgdGhlbiB0aGUgY29ycmVzcG9uZGluZyBkb3VibGUgcHJlY2lzaW9uCihyZXNwLkA6IGxvbmctZG91YmxlIHByZWNpc2lvbikKdmFsdWUgaXMgcmV0dXJuZWQsIGFuZCBAdmFye2V4cH0gaXMgdW5kZWZpbmVkLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGxvbmcgbXBmcl9nZXRfc2kgKG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bngge3Vuc2lnbmVkIGxvbmd9IG1wZnJfZ2V0X3VpIChtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludG1heF90IG1wZnJfZ2V0X3NqIChtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IHVpbnRtYXhfdCBtcGZyX2dldF91aiAobXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkNvbnZlcnQgQHZhcntvcH0gdG8gYSBAY29kZXtsb25nfSwgYW4gQGNvZGV7dW5zaWduZWQgbG9uZ30sCmFuIEBjb2Rle2ludG1heF90fSBvciBhbiBAY29kZXt1aW50bWF4X3R9IChyZXNwZWN0aXZlbHkpIGFmdGVyIHJvdW5kaW5nCml0IHdpdGggcmVzcGVjdCB0byBAdmFye3JuZH0uCklmIEB2YXJ7b3B9IGlzIE5hTiwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCklmIEB2YXJ7b3B9IGlzIHRvbyBiaWcgZm9yIHRoZSByZXR1cm4gdHlwZSwgaXQgcmV0dXJucyB0aGUgbWF4aW11bQpvciB0aGUgbWluaW11bSBvZiB0aGUgY29ycmVzcG9uZGluZyBDIHR5cGUsIGRlcGVuZGluZyBvbiB0aGUgZGlyZWN0aW9uCm9mIHRoZSBvdmVyZmxvdy4gVGhlIEBlbXBoe2VyYW5nZX0gZmxhZyBpcyBzZXQgdG9vLgpTZWUgYWxzbyBAY29kZXttcGZyX2ZpdHNfc2xvbmdfcH0sIEBjb2Rle21wZnJfZml0c191bG9uZ19wfSwKQGNvZGV7bXBmcl9maXRzX2ludG1heF9wfSBhbmQgQGNvZGV7bXBmcl9maXRzX3VpbnRtYXhfcH0uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gbXBfZXhwX3QgbXBmcl9nZXRfel9leHAgKG1wel90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9KQpQdXQgdGhlIHNjYWxlZCBzaWduaWZpY2FuZCBvZiBAdmFye29wfSAocmVnYXJkZWQgYXMgYW4gaW50ZWdlciwgd2l0aCB0aGUKcHJlY2lzaW9uIG9mIEB2YXJ7b3B9KSBpbnRvIEB2YXJ7cm9wfSwgYW5kIHJldHVybiB0aGUgZXhwb25lbnQgQHZhcntleHB9Cih3aGljaCBtYXkgYmUgb3V0c2lkZSB0aGUgY3VycmVudCBleHBvbmVudCByYW5nZSkgc3VjaCB0aGF0IEB2YXJ7b3B9CmV4YWN0bHkgZXF1YWxzCkBpZm5vdHRleApAdmFye3JvcH0gbXVsdGlwbGllZCBieSB0d28gZXhwb25lbnQgQHZhcntleHB9LgpAZW5kIGlmbm90dGV4CkB0ZXgKJHJvcCBcdGltZXMgMl57XHJtIGV4cH0kLgpAZW5kIHRleApJZiB0aGUgZXhwb25lbnQgaXMgbm90IHJlcHJlc2VudGFibGUgaW4gdGhlIEBjb2Rle21wX2V4cF90fSB0eXBlLCB0aGUKYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIHZvaWQgbXBmcl9nZXRfeiAobXB6X3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQ29udmVydCBAdmFye29wfSB0byBhIEBjb2Rle21wel90fSwgYWZ0ZXIgcm91bmRpbmcgaXQgd2l0aCByZXNwZWN0IHRvCkB2YXJ7cm5kfS4gSWYgQHZhcntvcH0gaXMgTmFOIG9yIEluZiwgdGhlIHJlc3VsdCBpcyB1bmRlZmluZWQuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfZ2V0X2YgKG1wZl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkNvbnZlcnQgQHZhcntvcH0gdG8gYSBAY29kZXttcGZfdH0sIGFmdGVyIHJvdW5kaW5nIGl0IHdpdGggcmVzcGVjdCB0bwpAdmFye3JuZH0uIFJldHVybiB6ZXJvIGlmZiBubyBlcnJvciBvY2N1cnJlZCwKaW4gcGFydGljdWxhciBhIG5vbi16ZXJvIHZhbHVlIGlzIHJldHVybmVkIGlmCkB2YXJ7b3B9IGlzIE5hTiBvciBJbmYsIHdoaWNoIGRvIG5vdCBleGlzdCBpbiBAY29kZXttcGZ9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIHtjaGFyICp9IG1wZnJfZ2V0X3N0ciAoY2hhciAqQHZhcntzdHJ9LCBtcF9leHBfdCAqQHZhcntleHBwdHJ9LCBpbnQgQHZhcntifSwgc2l6ZV90IEB2YXJ7bn0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpDb252ZXJ0IEB2YXJ7b3B9IHRvIGEgc3RyaW5nIG9mIGRpZ2l0cyBpbiBiYXNlIEB2YXJ7Yn0sIHdpdGggcm91bmRpbmcgaW4KdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0sIHdoZXJlIEB2YXJ7bn0gaXMgZWl0aGVyIHplcm8gKHNlZSBiZWxvdykgb3IgdGhlCm51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHM7IGluIHRoZSBsYXR0ZXIgY2FzZSwgQHZhcntufSBtdXN0IGJlIGdyZWF0ZXIKb3IgZXF1YWwgdG8gMi4gVGhlIGJhc2UgbWF5IHZhcnkgZnJvbSAyIHRvIDM2LgoKVGhlIGdlbmVyYXRlZCBzdHJpbmcgaXMgYSBmcmFjdGlvbiwgd2l0aCBhbiBpbXBsaWNpdCByYWRpeCBwb2ludCBpbW1lZGlhdGVseQp0byB0aGUgbGVmdCBvZiB0aGUgZmlyc3QgZGlnaXQuICBGb3IgZXhhbXBsZSwgdGhlIG51bWJlciBAbWludXN7fTMuMTQxNiB3b3VsZApiZSByZXR1cm5lZCBhcyAiQG1pbnVze30zMTQxNiIgaW4gdGhlIHN0cmluZyBhbmQgMSB3cml0dGVuIGF0IEB2YXJ7ZXhwcHRyfS4KSWYgQHZhcntybmR9IGlzIHRvIG5lYXJlc3QsIGFuZCBAdmFye29wfSBpcyBleGFjdGx5IGluIHRoZSBtaWRkbGUgb2YgdHdvCnBvc3NpYmxlIG91dHB1dHMsIHRoZSBvbmUgd2l0aCBhbiBldmVuIGxhc3QgZGlnaXQgaXMgY2hvc2VuCihmb3IgYW4gb2RkIGJhc2UsIHRoaXMgbWF5IG5vdCBjb3JyZXNwb25kIHRvIGFuIGV2ZW4gc2lnbmlmaWNhbmQpLgoKSWYgQHZhcntufSBpcyB6ZXJvLCB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBvZiB0aGUgc2lnbmlmaWNhbmQgaXMgY2hvc2VuCmxhcmdlIGVub3VnaCBzbyB0aGF0IHJlLXJlYWRpbmcgdGhlIHByaW50ZWQgdmFsdWUgd2l0aCB0aGUgc2FtZSBwcmVjaXNpb24sCmFzc3VtaW5nIGJvdGggb3V0cHV0IGFuZCBpbnB1dCB1c2Ugcm91bmRpbmcgdG8gbmVhcmVzdCwgd2lsbCByZWNvdmVyCnRoZSBvcmlnaW5hbCB2YWx1ZSBvZiBAdmFye29wfS4KTW9yZSBwcmVjaXNlbHksIGluIG1vc3QgY2FzZXMsIHRoZSBjaG9zZW4gcHJlY2lzaW9uIG9mIEB2YXJ7c3RyfSBpcwp0aGUgbWluaW1hbCBwcmVjaXNpb24gZGVwZW5kaW5nIG9uIEB2YXJ7bn0gYW5kIEB2YXJ7Yn0gb25seSB0aGF0CnNhdGlzZmllcyB0aGUgYWJvdmUgcHJvcGVydHksIGkuZS4sCkBpZm5vdHRleAptID0gMSArIGNlaWwoQHZhcntufSpsb2coMikvbG9nKEB2YXJ7Yn0pKSwKQGVuZCBpZm5vdHRleApAdGV4CiRtID0gMSArIFxsY2VpbCBuIHtcbG9nIDIgXG92ZXIgXGxvZyBifSBccmNlaWwkLApAZW5kIHRleApidXQgaW4gc29tZSB2ZXJ5IHJhcmUgY2FzZXMsIGl0IG1pZ2h0IGJlIEBtYXRoe20rMX0uCgpJZiBAdmFye3N0cn0gaXMgYSBudWxsIHBvaW50ZXIsIHNwYWNlIGZvciB0aGUgc2lnbmlmaWNhbmQgaXMgYWxsb2NhdGVkIHVzaW5nCnRoZSBjdXJyZW50IGFsbG9jYXRpb24gZnVuY3Rpb24sIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KVG8gZnJlZSB0aGUgcmV0dXJuZWQgc3RyaW5nLCB5b3UgbXVzdCB1c2UgQGNvZGV7bXBmcl9mcmVlX3N0cn0uCgpJZiBAdmFye3N0cn0gaXMgbm90IGEgbnVsbCBwb2ludGVyLCBpdCBzaG91bGQgcG9pbnQgdG8gYSBibG9jayBvZiBzdG9yYWdlCmxhcmdlIGVub3VnaCBmb3IgdGhlIHNpZ25pZmljYW5kLCBpLmUuLCBhdCBsZWFzdCBAY29kZXttYXgoQHZhcntufSArIDIsIDcpfS4KVGhlIGV4dHJhIHR3byBieXRlcyBhcmUgZm9yIGEgcG9zc2libGUgbWludXMgc2lnbiwgYW5kIGZvciB0aGUgdGVybWluYXRpbmcgbnVsbApjaGFyYWN0ZXIuCgpJZiB0aGUgaW5wdXQgbnVtYmVyIGlzIGFuIG9yZGluYXJ5IG51bWJlciwgdGhlIGV4cG9uZW50IGlzIHdyaXR0ZW4gdGhyb3VnaAp0aGUgcG9pbnRlciBAdmFye2V4cHB0cn0gKHRoZSBjdXJyZW50IG1pbmltYWwgZXhwb25lbnQgZm9yIDApLgoKQSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQsIHVubGVzcyB0aGVyZSBpcyBhbiBlcnJvciwgaW4gd2hpY2gKY2FzZSBhIG51bGwgcG9pbnRlciBpcyByZXR1cm5lZC4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biB2b2lkIG1wZnJfZnJlZV9zdHIgKGNoYXIgKkB2YXJ7c3RyfSkKRnJlZSBhIHN0cmluZyBhbGxvY2F0ZWQgYnkgQGNvZGV7bXBmcl9nZXRfc3RyfSB1c2luZyB0aGUgY3VycmVudCB1bmFsbG9jYXRpb24KZnVuY3Rpb24gKHByZWxpbWluYXJ5IGludGVyZmFjZSkuClRoZSBibG9jayBpcyBhc3N1bWVkIHRvIGJlIEBjb2Rle3N0cmxlbihAdmFye3N0cn0pKzF9IGJ5dGVzLgpGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgaXQgaXMgZG9uZToKQGlmaW5mbwpAcHhyZWZ7Q3VzdG9tIEFsbG9jYXRpb24sLCwgZ21wLmluZm8sR05VIE1QfS4KQGVuZCBpZmluZm8KQGlmbm90aW5mbwpzZWUgU2VjdGlvbiBgYEN1c3RvbSBBbGxvY2F0aW9uJycgaW4gQGNpdGV7R05VIE1QfS4KQGVuZCBpZm5vdGluZm8KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9maXRzX3Vsb25nX3AgKG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfZml0c19zbG9uZ19wIChtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2ZpdHNfdWludF9wIChtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2ZpdHNfc2ludF9wIChtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2ZpdHNfdXNob3J0X3AgKG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfZml0c19zc2hvcnRfcCAobXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9maXRzX2ludG1heF9wIChtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2ZpdHNfdWludG1heF9wIChtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKUmV0dXJuIG5vbi16ZXJvIGlmIEB2YXJ7b3B9IHdvdWxkIGZpdCBpbiB0aGUgcmVzcGVjdGl2ZSBDIGRhdGEgdHlwZSwgd2hlbgpyb3VuZGVkIHRvIGFuIGludGVnZXIgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0uCkBlbmQgZGVmdHlwZWZ1bgoKQG5vZGUgQmFzaWMgQXJpdGhtZXRpYyBGdW5jdGlvbnMsIENvbXBhcmlzb24gRnVuY3Rpb25zLCBDb252ZXJzaW9uIEZ1bmN0aW9ucywgTVBGUiBJbnRlcmZhY2UKQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCkBjaW5kZXggQmFzaWMgYXJpdGhtZXRpYyBmdW5jdGlvbnMKQGNpbmRleCBGbG9hdCBhcml0aG1ldGljIGZ1bmN0aW9ucwpAY2luZGV4IEFyaXRobWV0aWMgZnVuY3Rpb25zCkBzZWN0aW9uIEJhc2ljIEFyaXRobWV0aWMgRnVuY3Rpb25zCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9hZGQgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIG1wZnJfdCBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2FkZF91aSAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3AxfSwgdW5zaWduZWQgbG9uZyBpbnQgQHZhcntvcDJ9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9hZGRfc2kgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIGxvbmcgaW50IEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfYWRkX2QgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIGRvdWJsZSBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2FkZF96IChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcDF9LCBtcHpfdCBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2FkZF9xIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcDF9LCBtcHFfdCBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byBAbWF0aHtAdmFye29wMX0gKyBAdmFye29wMn19IHJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbgpAdmFye3JuZH0uIEZvciB0eXBlcyBoYXZpbmcgbm8gc2lnbmVkIHplcm8sIGl0IGlzIGNvbnNpZGVyZWQgdW5zaWduZWQKKGkuZS5AOiAoKzApICsgMCA9ICgrMCkgYW5kIChAbWludXN7fTApICsgMCA9IChAbWludXN7fTApKS4KVGhlIEBjb2Rle21wZnJfYWRkX2R9IGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgcmFkaXggb2YgdGhlIEBjb2Rle2RvdWJsZX0gdHlwZQppcyBhIHBvd2VyIG9mIDIsIHdpdGggYSBwcmVjaXNpb24gYXQgbW9zdCB0aGF0IGRlY2xhcmVkIGJ5IHRoZSBDIGltcGxlbWVudGF0aW9uCihtYWNybyBAY29kZXtJRUVFX0RCTF9NQU5UX0RJR30sIGFuZCBpZiBub3QgZGVmaW5lZCA1MyBiaXRzKS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9zdWIgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIG1wZnJfdCBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3VpX3N1YiAobXBmcl90IEB2YXJ7cm9wfSwgdW5zaWduZWQgbG9uZyBpbnQgQHZhcntvcDF9LCBtcGZyX3QgQHZhcntvcDJ9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9zdWJfdWkgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIHVuc2lnbmVkIGxvbmcgaW50IEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfc2lfc3ViIChtcGZyX3QgQHZhcntyb3B9LCBsb25nIGludCBAdmFye29wMX0sIG1wZnJfdCBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3N1Yl9zaSAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3AxfSwgbG9uZyBpbnQgQHZhcntvcDJ9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9kX3N1YiAobXBmcl90IEB2YXJ7cm9wfSwgZG91YmxlIEB2YXJ7b3AxfSwgbXBmcl90IEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfc3ViX2QgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIGRvdWJsZSBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3N1Yl96IChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcDF9LCBtcHpfdCBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3N1Yl9xIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcDF9LCBtcHFfdCBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byBAbWF0aHtAdmFye29wMX0gLSBAdmFye29wMn19IHJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbgpAdmFye3JuZH0uIEZvciB0eXBlcyBoYXZpbmcgbm8gc2lnbmVkIHplcm8sIGl0IGlzIGNvbnNpZGVyZWQgdW5zaWduZWQKKGkuZS5AOiAoKzApIEBtaW51c3t9IDAgPSAoKzApLCAoQG1pbnVze30wKSBAbWludXN7fSAwID0gKEBtaW51c3t9MCksCjAgQG1pbnVze30gKCswKSA9IChAbWludXN7fTApIGFuZCAwIEBtaW51c3t9IChAbWludXN7fTApID0gKCswKSkuClRoZSBzYW1lIHJlc3RyaWN0aW9ucyB0aGFuIGZvciBAY29kZXttcGZyX2FkZF9kfSBhcHBseSB0byBAY29kZXttcGZyX2Rfc3VifQphbmQgQGNvZGV7bXBmcl9zdWJfZH0uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfbXVsIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcDF9LCBtcGZyX3QgQHZhcntvcDJ9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9tdWxfdWkgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIHVuc2lnbmVkIGxvbmcgaW50IEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfbXVsX3NpIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcDF9LCBsb25nIGludCBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX211bF9kIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcDF9LCBkb3VibGUgQHZhcntvcDJ9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9tdWxfeiAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3AxfSwgbXB6X3QgQHZhcntvcDJ9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9tdWxfcSAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3AxfSwgbXBxX3QgQHZhcntvcDJ9LCBtcF9ybmRfdCBAdmFye3JuZH0pClNldCBAdmFye3JvcH0gdG8gQG1hdGh7QHZhcntvcDF9IEBHTVB0aW1lc3t9IEB2YXJ7b3AyfX0gcm91bmRlZCBpbiB0aGUKZGlyZWN0aW9uIEB2YXJ7cm5kfS4KV2hlbiBhIHJlc3VsdCBpcyB6ZXJvLCBpdHMgc2lnbiBpcyB0aGUgcHJvZHVjdCBvZiB0aGUgc2lnbnMgb2YgdGhlIG9wZXJhbmRzCihmb3IgdHlwZXMgaGF2aW5nIG5vIHNpZ25lZCB6ZXJvLCBpdCBpcyBjb25zaWRlcmVkIHBvc2l0aXZlKS4KVGhlIHNhbWUgcmVzdHJpY3Rpb25zIHRoYW4gZm9yIEBjb2Rle21wZnJfYWRkX2R9IGFwcGx5IHRvIEBjb2Rle21wZnJfbXVsX2R9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX3NxciAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pClNldCBAdmFye3JvcH0gdG8gQG17QHZhcntvcH1eezJ9LCB0aGUgc3F1YXJlIG9mIEB2YXJ7b3B9fQpyb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2RpdiAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3AxfSwgbXBmcl90IEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfdWlfZGl2IChtcGZyX3QgQHZhcntyb3B9LCB1bnNpZ25lZCBsb25nIGludCBAdmFye29wMX0sIG1wZnJfdCBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2Rpdl91aSAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3AxfSwgdW5zaWduZWQgbG9uZyBpbnQgQHZhcntvcDJ9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9zaV9kaXYgKG1wZnJfdCBAdmFye3JvcH0sIGxvbmcgaW50IEB2YXJ7b3AxfSwgbXBmcl90IEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfZGl2X3NpIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcDF9LCBsb25nIGludCBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2RfZGl2IChtcGZyX3QgQHZhcntyb3B9LCBkb3VibGUgQHZhcntvcDF9LCBtcGZyX3QgQHZhcntvcDJ9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9kaXZfZCAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3AxfSwgZG91YmxlIEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfZGl2X3ogKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIG1wel90IEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfZGl2X3EgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIG1wcV90IEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgQHZhcntyb3B9IHRvIEBtYXRoe0B2YXJ7b3AxfS9AdmFye29wMn19IHJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0uCldoZW4gYSByZXN1bHQgaXMgemVybywgaXRzIHNpZ24gaXMgdGhlIHByb2R1Y3Qgb2YgdGhlIHNpZ25zIG9mIHRoZSBvcGVyYW5kcwooZm9yIHR5cGVzIGhhdmluZyBubyBzaWduZWQgemVybywgaXQgaXMgY29uc2lkZXJlZCBwb3NpdGl2ZSkuClRoZSBzYW1lIHJlc3RyaWN0aW9ucyB0aGFuIGZvciBAY29kZXttcGZyX2FkZF9kfSBhcHBseSB0byBAY29kZXttcGZyX2RfZGl2fQphbmQgQGNvZGV7bXBmcl9kaXZfZH0uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfc3FydCAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9zcXJ0X3VpIChtcGZyX3QgQHZhcntyb3B9LCB1bnNpZ25lZCBsb25nIGludCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgQHZhcntyb3B9IHRvIEBte1xzcXJ0e0B2YXJ7b3B9fSwgdGhlIHNxdWFyZSByb290IG9mIEB2YXJ7b3B9fQpyb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LiBSZXR1cm4gQG1pbnVze30wIGlmIEB2YXJ7b3B9IGlzCkBtaW51c3t9MCAodG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBJRUVFIDc1NC0xOTg1IHN0YW5kYXJkKS4KU2V0IEB2YXJ7cm9wfSB0byBOYU4gaWYgQHZhcntvcH0gaXMgbmVnYXRpdmUuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfcmVjX3NxcnQgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgQHZhcntyb3B9IHRvIEBtezEvXHNxcnR7QHZhcntvcH19LCB0aGUgcmVjaXByb2NhbCBzcXVhcmUgcm9vdCBvZiBAdmFye29wfX0Kcm91bmRlZCBpbiB0aGUgZGlyZWN0aW9uIEB2YXJ7cm5kfS4gUmV0dXJuICtJbmYgaWYgQHZhcntvcH0gaXMgQHBvbXt9MCwKYW5kICswIGlmIEB2YXJ7b3B9IGlzICtJbmYuClNldCBAdmFye3JvcH0gdG8gTmFOIGlmIEB2YXJ7b3B9IGlzIG5lZ2F0aXZlLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2NicnQgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfcm9vdCAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCB1bnNpZ25lZCBsb25nIGludCBAdmFye2t9LCBtcF9ybmRfdCBAdmFye3JuZH0pClNldCBAdmFye3JvcH0gdG8gdGhlIGN1YmljIHJvb3QgKHJlc3AuQDogdGhlIEB2YXJ7a310aCByb290KQpvZiBAdmFye29wfSByb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LgpBbiBvZGQgKHJlc3AuQDogZXZlbikgcm9vdCBvZiBhIG5lZ2F0aXZlIG51bWJlciAoaW5jbHVkaW5nIEBtaW51c3t9SW5mKQpyZXR1cm5zIGEgbmVnYXRpdmUgbnVtYmVyIChyZXNwLkA6IE5hTikuClRoZSBAdmFye2t9dGggcm9vdCBvZiBAbWludXN7fTAgaXMgZGVmaW5lZCB0byBiZSBAbWludXN7fTAsCndoYXRldmVyIHRoZSBwYXJpdHkgb2YgQHZhcntrfS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9wb3cgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIG1wZnJfdCBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3Bvd191aSAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3AxfSwgdW5zaWduZWQgbG9uZyBpbnQgQHZhcntvcDJ9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9wb3dfc2kgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIGxvbmcgaW50IEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfcG93X3ogKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIG1wel90IEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfdWlfcG93X3VpIChtcGZyX3QgQHZhcntyb3B9LCB1bnNpZ25lZCBsb25nIGludCBAdmFye29wMX0sIHVuc2lnbmVkIGxvbmcgaW50IEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfdWlfcG93IChtcGZyX3QgQHZhcntyb3B9LCB1bnNpZ25lZCBsb25nIGludCBAdmFye29wMX0sIG1wZnJfdCBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byBAbXtAdmFye29wMX1ee29wMn0sIEB2YXJ7b3AxfSByYWlzZWQgdG8gQHZhcntvcDJ9fSwKcm91bmRlZCBpbiB0aGUgZGlyZWN0aW9uIEB2YXJ7cm5kfS4KU3BlY2lhbCB2YWx1ZXMgYXJlIGN1cnJlbnRseSBoYW5kbGVkIGFzIGRlc2NyaWJlZCBpbiB0aGUgSVNPIEM5OSBzdGFuZGFyZApmb3IgdGhlIEBjb2Rle3Bvd30gZnVuY3Rpb24gKG5vdGUgdGhpcyBtYXkgY2hhbmdlIGluIGZ1dHVyZSB2ZXJzaW9ucyk6CkBpdGVtaXplIEBidWxsZXQKQGl0ZW0gQGNvZGV7cG93KEBwb217fTAsIEB2YXJ7eX0pfSByZXR1cm5zIHBsdXMgb3IgbWludXMgaW5maW5pdHkgZm9yIEB2YXJ7eX0gYSBuZWdhdGl2ZSBvZGQgaW50ZWdlci4KQGl0ZW0gQGNvZGV7cG93KEBwb217fTAsIEB2YXJ7eX0pfSByZXR1cm5zIHBsdXMgaW5maW5pdHkgZm9yIEB2YXJ7eX0gbmVnYXRpdmUgYW5kIG5vdCBhbiBvZGQgaW50ZWdlci4KQGl0ZW0gQGNvZGV7cG93KEBwb217fTAsIEB2YXJ7eX0pfSByZXR1cm5zIHBsdXMgb3IgbWludXMgemVybyBmb3IgQHZhcnt5fSBhIHBvc2l0aXZlIG9kZCBpbnRlZ2VyLgpAaXRlbSBAY29kZXtwb3coQHBvbXt9MCwgQHZhcnt5fSl9IHJldHVybnMgcGx1cyB6ZXJvIGZvciBAdmFye3l9IHBvc2l0aXZlIGFuZCBub3QgYW4gb2RkIGludGVnZXIuCkBpdGVtIEBjb2Rle3BvdygtMSwgQHBvbXt9SW5mKX0gcmV0dXJucyAxLgpAaXRlbSBAY29kZXtwb3coKzEsIEB2YXJ7eX0pfSByZXR1cm5zIDEgZm9yIGFueSBAdmFye3l9LCBldmVuIGEgTmFOLgpAaXRlbSBAY29kZXtwb3coQHZhcnt4fSwgQHBvbXt9MCl9IHJldHVybnMgMSBmb3IgYW55IEB2YXJ7eH0sIGV2ZW4gYSBOYU4uCkBpdGVtIEBjb2Rle3BvdyhAdmFye3h9LCBAdmFye3l9KX0gcmV0dXJucyBOYU4gZm9yIGZpbml0ZSBuZWdhdGl2ZSBAdmFye3h9IGFuZCBmaW5pdGUgbm9uLWludGVnZXIgQHZhcnt5fS4KQGl0ZW0gQGNvZGV7cG93KEB2YXJ7eH0sIC1JbmYpfSByZXR1cm5zIHBsdXMgaW5maW5pdHkgZm9yIEBtYXRoezAgPCBAR01QYWJze3h9IDwgMX0sIGFuZCBwbHVzIHplcm8gZm9yIEBtYXRoe0BHTVBhYnN7eH0gPiAxfS4KQGl0ZW0gQGNvZGV7cG93KEB2YXJ7eH0sICtJbmYpfSByZXR1cm5zIHBsdXMgemVybyBmb3IgQG1hdGh7MCA8IEBHTVBhYnN7eH0gPCAxfSwgYW5kIHBsdXMgaW5maW5pdHkgZm9yIEBtYXRoe0BHTVBhYnN7eH0gPiAxfS4KQGl0ZW0gQGNvZGV7cG93KC1JbmYsIEB2YXJ7eX0pfSByZXR1cm5zIG1pbnVzIHplcm8gZm9yIEB2YXJ7eX0gYSBuZWdhdGl2ZSBvZGQgaW50ZWdlci4KQGl0ZW0gQGNvZGV7cG93KC1JbmYsIEB2YXJ7eX0pfSByZXR1cm5zIHBsdXMgemVybyBmb3IgQHZhcnt5fSBuZWdhdGl2ZSBhbmQgbm90IGFuIG9kZCBpbnRlZ2VyLgpAaXRlbSBAY29kZXtwb3coLUluZiwgQHZhcnt5fSl9IHJldHVybnMgbWludXMgaW5maW5pdHkgZm9yIEB2YXJ7eX0gYSBwb3NpdGl2ZSBvZGQgaW50ZWdlci4KQGl0ZW0gQGNvZGV7cG93KC1JbmYsIEB2YXJ7eX0pfSByZXR1cm5zIHBsdXMgaW5maW5pdHkgZm9yIEB2YXJ7eX0gcG9zaXRpdmUgYW5kIG5vdCBhbiBvZGQgaW50ZWdlci4KQGl0ZW0gQGNvZGV7cG93KCtJbmYsIEB2YXJ7eX0pfSByZXR1cm5zIHBsdXMgemVybyBmb3IgQHZhcnt5fSBuZWdhdGl2ZSwgYW5kIHBsdXMgaW5maW5pdHkgZm9yIEB2YXJ7eX0gcG9zaXRpdmUuCkBlbmQgaXRlbWl6ZQpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX25lZyAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pClNldCBAdmFye3JvcH0gdG8gQG1hdGh7LUB2YXJ7b3B9fSByb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LgpKdXN0IGNoYW5nZXMgdGhlIHNpZ24gaWYgQHZhcntyb3B9IGFuZCBAdmFye29wfSBhcmUgdGhlIHNhbWUgdmFyaWFibGUuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfYWJzIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgQHZhcntvcH0sCnJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0uCkp1c3QgY2hhbmdlcyB0aGUgc2lnbiBpZiBAdmFye3JvcH0gYW5kIEB2YXJ7b3B9IGFyZSB0aGUgc2FtZSB2YXJpYWJsZS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9kaW0gKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIG1wZnJfdCBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byB0aGUgcG9zaXRpdmUgZGlmZmVyZW5jZSBvZiBAdmFye29wMX0gYW5kIEB2YXJ7b3AyfSwgaS5lLiwKQG1hdGh7QHZhcntvcDF9IC0gQHZhcntvcDJ9fSByb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9CmlmIEBtYXRoe0B2YXJ7b3AxfSA+IEB2YXJ7b3AyfX0sIGFuZCArMCBvdGhlcndpc2UuClJldHVybnMgTmFOIHdoZW4gQHZhcntvcDF9IG9yIEB2YXJ7b3AyfSBpcyBOYU4uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfbXVsXzJ1aSAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3AxfSwgdW5zaWduZWQgbG9uZyBpbnQgQHZhcntvcDJ9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9tdWxfMnNpIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcDF9LCBsb25nIGludCBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byBAbXtAdmFye29wMX0gXHRpbWVzIDJee29wMn0sIEB2YXJ7b3AxfSB0aW1lcyAyIHJhaXNlZAp0byBAdmFye29wMn19CnJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0uIEp1c3QgaW5jcmVhc2VzIHRoZSBleHBvbmVudCBieSBAdmFye29wMn0Kd2hlbiBAdmFye3JvcH0gYW5kIEB2YXJ7b3AxfSBhcmUgaWRlbnRpY2FsLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2Rpdl8ydWkgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIHVuc2lnbmVkIGxvbmcgaW50IEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfZGl2XzJzaSAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3AxfSwgbG9uZyBpbnQgQHZhcntvcDJ9LCBtcF9ybmRfdCBAdmFye3JuZH0pClNldCBAdmFye3JvcH0gdG8gQG17QHZhcntvcDF9LzJee29wMn0sIEB2YXJ7b3AxfSBkaXZpZGVkIGJ5IDIgcmFpc2VkCnRvIEB2YXJ7b3AyfX0Kcm91bmRlZCBpbiB0aGUgZGlyZWN0aW9uIEB2YXJ7cm5kfS4gSnVzdCBkZWNyZWFzZXMgdGhlIGV4cG9uZW50IGJ5IEB2YXJ7b3AyfQp3aGVuIEB2YXJ7cm9wfSBhbmQgQHZhcntvcDF9IGFyZSBpZGVudGljYWwuCkBlbmQgZGVmdHlwZWZ1bgoKQG5vZGUgQ29tcGFyaXNvbiBGdW5jdGlvbnMsIFNwZWNpYWwgRnVuY3Rpb25zLCBCYXNpYyBBcml0aG1ldGljIEZ1bmN0aW9ucywgTVBGUiBJbnRlcmZhY2UKQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCkBjaW5kZXggRmxvYXQgY29tcGFyaXNvbnMgZnVuY3Rpb25zCkBjaW5kZXggQ29tcGFyaXNvbiBmdW5jdGlvbnMKQHNlY3Rpb24gQ29tcGFyaXNvbiBGdW5jdGlvbnMKCkBkZWZ0eXBlZnVuIGludCBtcGZyX2NtcCAobXBmcl90IEB2YXJ7b3AxfSwgbXBmcl90IEB2YXJ7b3AyfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2NtcF91aSAobXBmcl90IEB2YXJ7b3AxfSwgdW5zaWduZWQgbG9uZyBpbnQgQHZhcntvcDJ9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfY21wX3NpIChtcGZyX3QgQHZhcntvcDF9LCBzaWduZWQgbG9uZyBpbnQgQHZhcntvcDJ9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfY21wX2QgKG1wZnJfdCBAdmFye29wMX0sIGRvdWJsZSBAdmFye29wMn0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9jbXBfbGQgKG1wZnJfdCBAdmFye29wMX0sIGxvbmcgZG91YmxlIEB2YXJ7b3AyfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2NtcF96IChtcGZyX3QgQHZhcntvcDF9LCBtcHpfdCBAdmFye29wMn0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9jbXBfcSAobXBmcl90IEB2YXJ7b3AxfSwgbXBxX3QgQHZhcntvcDJ9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfY21wX2YgKG1wZnJfdCBAdmFye29wMX0sIG1wZl90IEB2YXJ7b3AyfSkKQ29tcGFyZSBAdmFye29wMX0gYW5kIEB2YXJ7b3AyfS4gIFJldHVybiBhIHBvc2l0aXZlIHZhbHVlIGlmIEBtYXRoe0B2YXJ7b3AxfSA+CkB2YXJ7b3AyfX0sIHplcm8gaWYgQG1hdGh7QHZhcntvcDF9ID0gQHZhcntvcDJ9fSwgYW5kIGEgbmVnYXRpdmUgdmFsdWUgaWYKQG1hdGh7QHZhcntvcDF9IDwgQHZhcntvcDJ9fS4KQm90aCBAdmFye29wMX0gYW5kIEB2YXJ7b3AyfSBhcmUgY29uc2lkZXJlZCB0byB0aGVpciBmdWxsIG93biBwcmVjaXNpb24sCndoaWNoIG1heSBkaWZmZXIuCklmIG9uZSBvZiB0aGUgb3BlcmFuZHMgaXMgTmFOLCBzZXQgdGhlIEBlbXBoe2VyYW5nZX0gZmxhZyBhbmQgcmV0dXJuIHplcm8uCgpOb3RlOiBUaGVzZSBmdW5jdGlvbnMgbWF5IGJlIHVzZWZ1bCB0byBkaXN0aW5ndWlzaCB0aGUgdGhyZWUgcG9zc2libGUgY2FzZXMuCklmIHlvdSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHR3byBjYXNlcyBvbmx5LCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlCnByZWRpY2F0ZSBmdW5jdGlvbnMgKGUuZy4sIEBjb2Rle21wZnJfZXF1YWxfcH0gZm9yIHRoZSBlcXVhbGl0eSkgZGVzY3JpYmVkCmJlbG93OyB0aGV5IGJlaGF2ZSBsaWtlIHRoZSBJRUVFLTc1NCBjb21wYXJpc29ucywgaW4gcGFydGljdWxhciB3aGVuIG9uZQpvciBib3RoIGFyZ3VtZW50cyBhcmUgTmFOLiBCdXQgb25seSBmbG9hdGluZy1wb2ludCBudW1iZXJzIGNhbiBiZSBjb21wYXJlZAooeW91IG1heSBuZWVkIHRvIGRvIGEgY29udmVyc2lvbiBmaXJzdCkuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfY21wX3VpXzJleHAgKG1wZnJfdCBAdmFye29wMX0sIHVuc2lnbmVkIGxvbmcgaW50IEB2YXJ7b3AyfSwgbXBfZXhwX3QgQHZhcntlfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2NtcF9zaV8yZXhwIChtcGZyX3QgQHZhcntvcDF9LCBsb25nIGludCBAdmFye29wMn0sIG1wX2V4cF90IEB2YXJ7ZX0pCkNvbXBhcmUgQHZhcntvcDF9IGFuZCBAbXtAdmFye29wMn0gXHRpbWVzIDJeZSwgQHZhcntvcDJ9IG11bHRpcGxpZWQgYnkgdHdvIHRvCnRoZSBwb3dlciBAdmFye2V9fS4gU2ltaWxhciBhcyBhYm92ZS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9jbXBhYnMgKG1wZnJfdCBAdmFye29wMX0sIG1wZnJfdCBAdmFye29wMn0pCkNvbXBhcmUgQG1hdGh7fEB2YXJ7b3AxfXx9IGFuZCBAbWF0aHt8QHZhcntvcDJ9fH0uICBSZXR1cm4gYSBwb3NpdGl2ZSB2YWx1ZSBpZgpAbWF0aHt8QHZhcntvcDF9fCA+IHxAdmFye29wMn18fSwgemVybyBpZiBAbWF0aHt8QHZhcntvcDF9fCA9IHxAdmFye29wMn18fSwgYW5kCmEgbmVnYXRpdmUgdmFsdWUgaWYgQG1hdGh7fEB2YXJ7b3AxfXwgPCB8QHZhcntvcDJ9fH0uCklmIG9uZSBvZiB0aGUgb3BlcmFuZHMgaXMgTmFOLCBzZXQgdGhlIEBlbXBoe2VyYW5nZX0gZmxhZyBhbmQgcmV0dXJuIHplcm8uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfbmFuX3AgKG1wZnJfdCBAdmFye29wfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2luZl9wIChtcGZyX3QgQHZhcntvcH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9udW1iZXJfcCAobXBmcl90IEB2YXJ7b3B9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfemVyb19wIChtcGZyX3QgQHZhcntvcH0pClJldHVybiBub24temVybyBpZiBAdmFye29wfSBpcyByZXNwZWN0aXZlbHkgTmFOLCBhbiBpbmZpbml0eSwgYW4gb3JkaW5hcnkKbnVtYmVyIChpLmUuQDogbmVpdGhlciBOYU4gbm9yIGFuIGluZmluaXR5KSBvciB6ZXJvLiBSZXR1cm4gemVybyBvdGhlcndpc2UuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmbiBNYWNybyBpbnQgbXBmcl9zZ24gKG1wZnJfdCBAdmFye29wfSkKUmV0dXJuIGEgcG9zaXRpdmUgdmFsdWUgaWYgQG1hdGh7QHZhcntvcH0gPiAwfSwgemVybyBpZiBAbWF0aHtAdmFye29wfSA9IDB9LAphbmQgYSBuZWdhdGl2ZSB2YWx1ZSBpZiBAbWF0aHtAdmFye29wfSA8IDB9LgpJZiB0aGUgb3BlcmFuZCBpcyBOYU4sIHNldCB0aGUgQGVtcGh7ZXJhbmdlfSBmbGFnIGFuZCByZXR1cm4gemVyby4KQGVuZCBkZWZ0eXBlZm4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2dyZWF0ZXJfcCAobXBmcl90IEB2YXJ7b3AxfSwgbXBmcl90IEB2YXJ7b3AyfSkKUmV0dXJuIG5vbi16ZXJvIGlmIEBtYXRoe0B2YXJ7b3AxfSA+IEB2YXJ7b3AyfX0sIHplcm8gb3RoZXJ3aXNlLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2dyZWF0ZXJlcXVhbF9wIChtcGZyX3QgQHZhcntvcDF9LCBtcGZyX3QgQHZhcntvcDJ9KQpSZXR1cm4gbm9uLXplcm8gaWYgQG1hdGh7QHZhcntvcDF9IEBnZXt9IEB2YXJ7b3AyfX0sIHplcm8gb3RoZXJ3aXNlLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2xlc3NfcCAobXBmcl90IEB2YXJ7b3AxfSwgbXBmcl90IEB2YXJ7b3AyfSkKUmV0dXJuIG5vbi16ZXJvIGlmIEBtYXRoe0B2YXJ7b3AxfSA8IEB2YXJ7b3AyfX0sIHplcm8gb3RoZXJ3aXNlLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2xlc3NlcXVhbF9wIChtcGZyX3QgQHZhcntvcDF9LCBtcGZyX3QgQHZhcntvcDJ9KQpSZXR1cm4gbm9uLXplcm8gaWYgQG1hdGh7QHZhcntvcDF9IEBsZXt9IEB2YXJ7b3AyfX0sIHplcm8gb3RoZXJ3aXNlLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2xlc3NncmVhdGVyX3AgKG1wZnJfdCBAdmFye29wMX0sIG1wZnJfdCBAdmFye29wMn0pClJldHVybiBub24temVybyBpZiBAbWF0aHtAdmFye29wMX0gPCBAdmFye29wMn19IG9yCkBtYXRoe0B2YXJ7b3AxfSA+IEB2YXJ7b3AyfX0gKGkuZS5AOiBuZWl0aGVyIEB2YXJ7b3AxfSwgbm9yIEB2YXJ7b3AyfSBpcwpOYU4sIGFuZCBAbWF0aHtAdmFye29wMX0gQG5le30gQHZhcntvcDJ9fSksIHplcm8gb3RoZXJ3aXNlIChpLmUuQDogQHZhcntvcDF9CmFuZC9vciBAdmFye29wMn0gYXJlIE5hTiwgb3IgQG1hdGh7QHZhcntvcDF9ID0gQHZhcntvcDJ9fSkuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfZXF1YWxfcCAobXBmcl90IEB2YXJ7b3AxfSwgbXBmcl90IEB2YXJ7b3AyfSkKUmV0dXJuIG5vbi16ZXJvIGlmIEBtYXRoe0B2YXJ7b3AxfSA9IEB2YXJ7b3AyfX0sIHplcm8gb3RoZXJ3aXNlCihpLmUuQDogQHZhcntvcDF9IGFuZC9vciBAdmFye29wMn0gYXJlIE5hTiwgb3IKQG1hdGh7QHZhcntvcDF9IEBuZXt9IEB2YXJ7b3AyfX0pLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX3Vub3JkZXJlZF9wIChtcGZyX3QgQHZhcntvcDF9LCBtcGZyX3QgQHZhcntvcDJ9KQpSZXR1cm4gbm9uLXplcm8gaWYgQHZhcntvcDF9IG9yIEB2YXJ7b3AyfSBpcyBhIE5hTiAoaS5lLkA6IHRoZXkgY2Fubm90IGJlCmNvbXBhcmVkKSwgemVybyBvdGhlcndpc2UuCkBlbmQgZGVmdHlwZWZ1bgoKQG5vZGUgU3BlY2lhbCBGdW5jdGlvbnMsIElucHV0IGFuZCBPdXRwdXQgRnVuY3Rpb25zLCBDb21wYXJpc29uIEZ1bmN0aW9ucywgTVBGUiBJbnRlcmZhY2UKQGNpbmRleCBTcGVjaWFsIGZ1bmN0aW9ucwpAc2VjdGlvbiBTcGVjaWFsIEZ1bmN0aW9ucwoKQWxsIHRob3NlIGZ1bmN0aW9ucywgZXhjZXB0IGV4cGxpY2l0bHkgc3RhdGVkLCByZXR1cm4gemVybyBmb3IgYW4KZXhhY3QgcmV0dXJuIHZhbHVlLCBhIHBvc2l0aXZlIHZhbHVlIGZvciBhIHJldHVybiB2YWx1ZSBsYXJnZXIgdGhhbiB0aGUKZXhhY3QgcmVzdWx0LCBhbmQgYSBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCgpJbXBvcnRhbnQgbm90ZTogaW4gc29tZSBkb21haW5zLCBjb21wdXRpbmcgc3BlY2lhbCBmdW5jdGlvbnMgKGVpdGhlciB3aXRoCmNvcnJlY3Qgb3IgaW5jb3JyZWN0IHJvdW5kaW5nKSBpcyBleHBlbnNpdmUsIGV2ZW4gZm9yIHNtYWxsIHByZWNpc2lvbiwKZm9yIGV4YW1wbGUgdGhlIHRyaWdvbm9tZXRyaWMgYW5kIEJlc3NlbCBmdW5jdGlvbnMgZm9yIGxhcmdlIGFyZ3VtZW50LgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfbG9nIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2xvZzIgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfbG9nMTAgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgQHZhcntyb3B9IHRvIHRoZSBuYXR1cmFsIGxvZ2FyaXRobSBvZiBAdmFye29wfSwKQG17XGxvZ18yIEB2YXJ7b3B9LCBsb2cyKEB2YXJ7b3B9KX0gb3IKQG17XGxvZ197MTB9IEB2YXJ7b3B9LCBsb2cxMChAdmFye29wfSl9LCByZXNwZWN0aXZlbHksCnJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0uClJldHVybiBAbWludXN7fUluZiBpZiBAdmFye29wfSBpcyBAbWludXN7fTAgKGkuZS5AOiB0aGUgc2lnbiBvZiB0aGUgemVybwpoYXMgbm8gaW5mbHVlbmNlIG9uIHRoZSByZXN1bHQpLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2V4cCAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9leHAyIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2V4cDEwIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byB0aGUgZXhwb25lbnRpYWwgb2YgQHZhcntvcH0sCiB0byBAbXsyXntvcH0sIDIgcG93ZXIgb2YgQHZhcntvcH19Cm9yIHRvIEBtezEwXntvcH0sIDEwIHBvd2VyIG9mIEB2YXJ7b3B9fSwgcmVzcGVjdGl2ZWx5LApyb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2NvcyAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9zaW4gKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfdGFuIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byB0aGUgY29zaW5lIG9mIEB2YXJ7b3B9LCBzaW5lIG9mIEB2YXJ7b3B9LAp0YW5nZW50IG9mIEB2YXJ7b3B9LCByb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX3NlYyAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9jc2MgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfY290IChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byB0aGUgc2VjYW50IG9mIEB2YXJ7b3B9LCBjb3NlY2FudCBvZiBAdmFye29wfSwKY290YW5nZW50IG9mIEB2YXJ7b3B9LCByb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX3Npbl9jb3MgKG1wZnJfdCBAdmFye3NvcH0sIG1wZnJfdCBAdmFye2NvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgc2ltdWx0YW5lb3VzbHkgQHZhcntzb3B9IHRvIHRoZSBzaW5lIG9mIEB2YXJ7b3B9IGFuZAogICAgICAgICAgICAgICAgICAgQHZhcntjb3B9IHRvIHRoZSBjb3NpbmUgb2YgQHZhcntvcH0sCnJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0gd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwcmVjaXNpb25zIG9mCkB2YXJ7c29wfSBhbmQgQHZhcntjb3B9LCB3aGljaCBtdXN0IGJlIGRpZmZlcmVudCB2YXJpYWJsZXMuClJldHVybiAwIGlmZiBib3RoIHJlc3VsdHMgYXJlIGV4YWN0LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2Fjb3MgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfYXNpbiAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9hdGFuIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byB0aGUgYXJjLWNvc2luZSwgYXJjLXNpbmUgb3IgYXJjLXRhbmdlbnQgb2YgQHZhcntvcH0sCnJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0uCk5vdGUgdGhhdCBzaW5jZSBAY29kZXthY29zKC0xKX0gcmV0dXJucyB0aGUgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGNsb3Nlc3QgdG8KQG17XHBpLFBpfSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHJvdW5kaW5nIG1vZGUsIHRoaXMgbnVtYmVyIG1pZ2h0IG5vdCBiZQppbiB0aGUgb3V0cHV0IHJhbmdlIEBtYXRoezAgQGxle30gQHZhcntyb3B9IDwgXHBpfQpvZiB0aGUgYXJjLWNvc2luZSBmdW5jdGlvbjsKc3RpbGwsIHRoZSByZXN1bHQgbGllcyBpbiB0aGUgaW1hZ2Ugb2YgdGhlIG91dHB1dCByYW5nZQpieSB0aGUgcm91bmRpbmcgZnVuY3Rpb24uClRoZSBzYW1lIGhvbGRzIGZvciBAY29kZXthc2luKC0xKX0sIEBjb2Rle2FzaW4oMSl9LCBAY29kZXthdGFuKC1JbmYpfSwKQGNvZGV7YXRhbigrSW5mKX0uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfYXRhbjIgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye3l9LCBtcGZyX3QgQHZhcnt4fSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgQHZhcntyb3B9IHRvIHRoZSBhcmMtdGFuZ2VudDIgb2YgQHZhcnt5fSBhbmQgQHZhcnt4fSwKcm91bmRlZCBpbiB0aGUgZGlyZWN0aW9uIEB2YXJ7cm5kfToKaWYgQGNvZGV7eCA+IDB9LCBAY29kZXthdGFuMih5LCB4KSA9IGF0YW4gKHkveCl9OwppZiBAY29kZXt4IDwgMH0sIEBjb2Rle2F0YW4yKHksIHgpID0gc2lnbih5KSooUGkgLSBhdGFuIChAR01QYWJze3kveH0pKX0uCkFzIGZvciBAY29kZXthdGFufSwgaW4gY2FzZSB0aGUgZXhhY3QgbWF0aGVtYXRpY2FsIHJlc3VsdCBpcyBAbXsrXHBpLCtQaX0gb3IKQG17LVxwaSwtUGl9LCBpdHMgcm91bmRlZCByZXN1bHQgbWlnaHQgYmUgb3V0c2lkZSB0aGUgZnVuY3Rpb24gb3V0cHV0IHJhbmdlLgoKQGNvZGV7YXRhbjIoeSwgMCl9IGRvZXMgbm90IHJhaXNlIGFueSBmbG9hdGluZy1wb2ludCBleGNlcHRpb24uClNwZWNpYWwgdmFsdWVzIGFyZSBjdXJyZW50bHkgaGFuZGxlZCBhcyBkZXNjcmliZWQgaW4gdGhlIElTTyBDOTkgc3RhbmRhcmQKZm9yIHRoZSBAY29kZXthdGFuMn0gZnVuY3Rpb24gKG5vdGUgdGhpcyBtYXkgY2hhbmdlIGluIGZ1dHVyZSB2ZXJzaW9ucyk6CkBpdGVtaXplIEBidWxsZXQKQGl0ZW0gQGNvZGV7YXRhbjIoKzAsIC0wKX0gcmV0dXJucyBAbXsrXHBpLCtQaX0uCkBpdGVtIEBjb2Rle2F0YW4yKC0wLCAtMCl9IHJldHVybnMgQG17LVxwaSwtUGl9LgpAaXRlbSBAY29kZXthdGFuMigrMCwgKzApfSByZXR1cm5zICswLgpAaXRlbSBAY29kZXthdGFuMigtMCwgKzApfSByZXR1cm5zIEBtaW51c3t9MC4KQGl0ZW0gQGNvZGV7YXRhbjIoKzAsIHgpfSByZXR1cm5zIEBteytccGksK1BpfSBmb3IgQG1hdGh7eCA8IDB9LgpAaXRlbSBAY29kZXthdGFuMigtMCwgeCl9IHJldHVybnMgQG17LVxwaSwtUGl9IGZvciBAbWF0aHt4IDwgMH0uCkBpdGVtIEBjb2Rle2F0YW4yKCswLCB4KX0gcmV0dXJucyArMCBmb3IgQG1hdGh7eCA+IDB9LgpAaXRlbSBAY29kZXthdGFuMigtMCwgeCl9IHJldHVybnMgQG1pbnVze30wIGZvciBAbWF0aHt4ID4gMH0uCkBpdGVtIEBjb2Rle2F0YW4yKHksIDApfSByZXR1cm5zIEBtey1ccGkvMiwtUGkvMn0gZm9yIEBtYXRoe3kgPCAwfS4KQGl0ZW0gQGNvZGV7YXRhbjIoeSwgMCl9IHJldHVybnMgQG17K1xwaS8yLCtQaS8yfSBmb3IgQG1hdGh7eSA+IDB9LgpAaXRlbSBAY29kZXthdGFuMigrSW5mLCAtSW5mKX0gcmV0dXJucyBAbXsrMypccGkvNCwrMypQaS80fS4KQGl0ZW0gQGNvZGV7YXRhbjIoLUluZiwgLUluZil9IHJldHVybnMgQG17LTMqXHBpLzQsLTMqUGkvNH0uCkBpdGVtIEBjb2Rle2F0YW4yKCtJbmYsICtJbmYpfSByZXR1cm5zIEBteytccGkvNCwrUGkvNH0uCkBpdGVtIEBjb2Rle2F0YW4yKC1JbmYsICtJbmYpfSByZXR1cm5zIEBtey1ccGkvNCwtUGkvNH0uCkBpdGVtIEBjb2Rle2F0YW4yKCtJbmYsIHgpfSByZXR1cm5zIEBteytccGkvMiwrUGkvMn0gZm9yIGZpbml0ZSBAbWF0aHt4fS4KQGl0ZW0gQGNvZGV7YXRhbjIoLUluZiwgeCl9IHJldHVybnMgQG17LVxwaS8yLC1QaS8yfSBmb3IgZmluaXRlIEBtYXRoe3h9LgpAaXRlbSBAY29kZXthdGFuMih5LCAtSW5mKX0gcmV0dXJucyBAbXsrXHBpLCtQaX0gZm9yIGZpbml0ZSBAbWF0aHt5ID4gMH0uCkBpdGVtIEBjb2Rle2F0YW4yKHksIC1JbmYpfSByZXR1cm5zIEBtey1ccGksLVBpfSBmb3IgZmluaXRlIEBtYXRoe3kgPCAwfS4KQGl0ZW0gQGNvZGV7YXRhbjIoeSwgK0luZil9IHJldHVybnMgKzAgZm9yIGZpbml0ZSBAbWF0aHt5ID4gMH0uCkBpdGVtIEBjb2Rle2F0YW4yKHksICtJbmYpfSByZXR1cm5zIEBtaW51c3t9MCBmb3IgZmluaXRlIEBtYXRoe3kgPCAwfS4KQGVuZCBpdGVtaXplCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfY29zaCAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9zaW5oIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3RhbmggKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgQHZhcntyb3B9IHRvIHRoZSBoeXBlcmJvbGljIGNvc2luZSwgc2luZSBvciB0YW5nZW50IG9mIEB2YXJ7b3B9LApyb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX3NpbmhfY29zaCAobXBmcl90IEB2YXJ7c29wfSwgbXBmcl90IEB2YXJ7Y29wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pClNldCBzaW11bHRhbmVvdXNseSBAdmFye3NvcH0gdG8gdGhlIGh5cGVyYm9saWMgc2luZSBvZiBAdmFye29wfSBhbmQKICAgICAgICAgICAgICAgICAgIEB2YXJ7Y29wfSB0byB0aGUgaHlwZXJib2xpYyBjb3NpbmUgb2YgQHZhcntvcH0sCnJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0gd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwcmVjaXNpb24gb2YKQHZhcntzb3B9IGFuZCBAdmFye2NvcH0gd2hpY2ggbXVzdCBiZSBkaWZmZXJlbnQgdmFyaWFibGVzLgpSZXR1cm4gMCBpZmYgYm90aCByZXN1bHRzIGFyZSBleGFjdC4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9zZWNoIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2NzY2ggKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfY290aCAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pClNldCBAdmFye3JvcH0gdG8gdGhlIGh5cGVyYm9saWMgc2VjYW50IG9mIEB2YXJ7b3B9LCBjb3NlY2FudCBvZiBAdmFye29wfSwKY290YW5nZW50IG9mIEB2YXJ7b3B9LCByb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2Fjb3NoIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2FzaW5oIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2F0YW5oIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byB0aGUgaW52ZXJzZSBoeXBlcmJvbGljIGNvc2luZSwgc2luZSBvciB0YW5nZW50IG9mIEB2YXJ7b3B9LApyb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2ZhY191aSAobXBmcl90IEB2YXJ7cm9wfSwgdW5zaWduZWQgbG9uZyBpbnQgIEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pClNldCBAdmFye3JvcH0gdG8gdGhlIGZhY3RvcmlhbCBvZiB0aGUgQGNvZGV7dW5zaWduZWQgbG9uZyBpbnR9IEB2YXJ7b3B9LApyb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2xvZzFwIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byB0aGUgbG9nYXJpdGhtIG9mIG9uZSBwbHVzIEB2YXJ7b3B9LApyb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2V4cG0xIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byB0aGUgZXhwb25lbnRpYWwgb2YgQHZhcntvcH0gbWludXMgb25lLApyb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2VpbnQgKG1wZnJfdCBAdmFye3l9LCBtcGZyX3QgQHZhcnt4fSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgQHZhcnt5fSB0byB0aGUgZXhwb25lbnRpYWwgaW50ZWdyYWwgb2YgQHZhcnt4fSwKcm91bmRlZCBpbiB0aGUgZGlyZWN0aW9uIEB2YXJ7cm5kfS4KRm9yIHBvc2l0aXZlIEB2YXJ7eH0sCnRoZSBleHBvbmVudGlhbCBpbnRlZ3JhbCBpcyB0aGUgc3VtIG9mIEV1bGVyJ3MgY29uc3RhbnQsIG9mIHRoZSBsb2dhcml0aG0Kb2YgQHZhcnt4fSwgYW5kIG9mIHRoZSBzdW0gZm9yIGsgZnJvbSAxIHRvIGluZmluaXR5IG9mCkBpZm5vdHRleApAdmFye3h9IHRvIHRoZSBwb3dlciBrLCBkaXZpZGVkIGJ5IGsgYW5kIGZhY3RvcmlhbChrKS4KQGVuZCBpZm5vdHRleApAdGV4CiR4Xmsvay9rISQuCkBlbmQgdGV4CkZvciBuZWdhdGl2ZSBAdmFye3h9LCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgTmFOLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2xpMiAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZF9tb2RlfSkKU2V0IEB2YXJ7cm9wfSB0byByZWFsIHBhcnQgb2YgdGhlIGRpbG9nYXJpdGhtIG9mIEB2YXJ7b3B9LCByb3VuZGVkIGluIHRoZQpkaXJlY3Rpb24gQHZhcntybmRfbW9kZX0uIFRoZSBkaWxvZ2FyaXRobSBmdW5jdGlvbiBpcyBkZWZpbmVkIGhlcmUgYXMKQG17LVxpbnRfe3Q9MH1eeCBsb2coMS10KS90IGR0LHRoZSBpbnRlZ3JhbCBvZiAtbG9nKDEtdCkvdCBmcm9tIDAgdG8geH0uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfZ2FtbWEgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgQHZhcntyb3B9IHRvIHRoZSB2YWx1ZSBvZiB0aGUgR2FtbWEgZnVuY3Rpb24gb24gQHZhcntvcH0sIHJvdW5kZWQgaW4gdGhlCmRpcmVjdGlvbiBAdmFye3JuZH0uIFdoZW4gQHZhcntvcH0gaXMgYSBuZWdhdGl2ZSBpbnRlZ2VyLCBOYU4gaXMgcmV0dXJuZWQuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfbG5nYW1tYSAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pClNldCBAdmFye3JvcH0gdG8gdGhlIHZhbHVlIG9mIHRoZSBsb2dhcml0aG0gb2YgdGhlIEdhbW1hIGZ1bmN0aW9uIG9uIEB2YXJ7b3B9LApyb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LgpXaGVuIEBtYXRoe0BtaW51c3t9MkB2YXJ7a31AbWludXN7fTEgQGxle30gQHZhcnt4fSBAbGV7fSBAbWludXN7fTJAdmFye2t9fSwKQHZhcntrfSBiZWluZyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBOYU4gaXMgcmV0dXJuZWQuClNlZSBhbHNvIEBjb2Rle21wZnJfbGdhbW1hfS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9sZ2FtbWEgKG1wZnJfdCBAdmFye3JvcH0sIGludCAqQHZhcntzaWducH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgQHZhcntyb3B9IHRvIHRoZSB2YWx1ZSBvZiB0aGUgbG9nYXJpdGhtIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUKR2FtbWEgZnVuY3Rpb24gb24gQHZhcntvcH0sIHJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0uIFRoZSBzaWduCigxIG9yIEBtaW51c3t9MSkgb2YgR2FtbWEoQHZhcntvcH0pIGlzIHJldHVybmVkIGluIHRoZSBvYmplY3QgcG9pbnRlZCB0bwpieSBAdmFye3NpZ25wfS4gV2hlbiBAdmFye29wfSBpcyBhbiBpbmZpbml0eSBvciBhIG5vbi1wb3NpdGl2ZSBpbnRlZ2VyLAorSW5mIGlzIHJldHVybmVkLiBXaGVuIEB2YXJ7b3B9IGlzIE5hTiwgQG1pbnVze31JbmYgb3IgYSBuZWdhdGl2ZSBpbnRlZ2VyLAoqQHZhcntzaWducH0gaXMgdW5kZWZpbmVkLCBhbmQgd2hlbiBAdmFye29wfSBpcyBAcG9te30wLCAqQHZhcntzaWducH0gaXMKdGhlIHNpZ24gb2YgdGhlIHplcm8uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfemV0YSAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl96ZXRhX3VpIChtcGZyX3QgQHZhcntyb3B9LCB1bnNpZ25lZCBsb25nIEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pClNldCBAdmFye3JvcH0gdG8gdGhlIHZhbHVlIG9mIHRoZSBSaWVtYW5uIFpldGEgZnVuY3Rpb24gb24gQHZhcntvcH0sCnJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfZXJmIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byB0aGUgdmFsdWUgb2YgdGhlIGVycm9yIGZ1bmN0aW9uIG9uIEB2YXJ7b3B9LApyb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2VyZmMgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgQHZhcntyb3B9IHRvIHRoZSB2YWx1ZSBvZiB0aGUgY29tcGxlbWVudGFyeSBlcnJvciBmdW5jdGlvbiBvbiBAdmFye29wfSwKcm91bmRlZCBpbiB0aGUgZGlyZWN0aW9uIEB2YXJ7cm5kfS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9qMCAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9qMSAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9qbiAobXBmcl90IEB2YXJ7cm9wfSwgbG9uZyBAdmFye259LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGtpbmQgQmVzc2VsIGZ1bmN0aW9uIG9mIG9yZGVyIDAsIDEKYW5kIEB2YXJ7bn0gb24gQHZhcntvcH0sIHJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0uIFdoZW4gQHZhcntvcH0gaXMKTmFOLCBAdmFye3JvcH0gaXMgYWx3YXlzIHNldCB0byBOYU4uIFdoZW4gQHZhcntvcH0gaXMgcGx1cyBvciBtaW51cyBJbmZpbml0eSwKQHZhcntyb3B9IGlzIHNldCB0byArMC4gV2hlbiBAdmFye29wfSBpcyB6ZXJvLCBhbmQgQHZhcntufSBpcyBub3QgemVybywKQHZhcntyb3B9IGlzICswIG9yIEBtaW51c3t9MCBkZXBlbmRpbmcgb24gdGhlIHBhcml0eSBhbmQgc2lnbiBvZiBAdmFye259LAphbmQgdGhlIHNpZ24gb2YgQHZhcntvcH0uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfeTAgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfeTEgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfeW4gKG1wZnJfdCBAdmFye3JvcH0sIGxvbmcgQHZhcntufSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pClNldCBAdmFye3JvcH0gdG8gdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQga2luZCBCZXNzZWwgZnVuY3Rpb24gb2Ygb3JkZXIgMCwgMQphbmQgQHZhcntufSBvbiBAdmFye29wfSwgcm91bmRlZCBpbiB0aGUgZGlyZWN0aW9uIEB2YXJ7cm5kfS4gV2hlbiBAdmFye29wfSBpcwpOYU4gb3IgbmVnYXRpdmUsCkB2YXJ7cm9wfSBpcyBhbHdheXMgc2V0IHRvIE5hTi4gV2hlbiBAdmFye29wfSBpcyArSW5mLApAdmFye3JvcH0gaXMgKzAuIFdoZW4gQHZhcntvcH0gaXMgemVybywKQHZhcntyb3B9IGlzICtJbmYgb3IgQG1pbnVze31JbmYgZGVwZW5kaW5nIG9uIHRoZSBwYXJpdHkgYW5kIHNpZ24gb2YgQHZhcntufS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9mbWEgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIG1wZnJfdCBAdmFye29wMn0sIG1wZnJfdCBAdmFye29wM30sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byBAbWF0aHsoQHZhcntvcDF9IEBHTVB0aW1lc3t9IEB2YXJ7b3AyfSkgKyBAdmFye29wM319LApyb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2ZtcyAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3AxfSwgbXBmcl90IEB2YXJ7b3AyfSwgbXBmcl90IEB2YXJ7b3AzfSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgQHZhcntyb3B9IHRvIEBtYXRoeyhAdmFye29wMX0gQEdNUHRpbWVze30gQHZhcntvcDJ9KSAtIEB2YXJ7b3AzfX0sCnJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfYWdtIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcDF9LCBtcGZyX3QgQHZhcntvcDJ9LCBtcF9ybmRfdCBAdmFye3JuZH0pClNldCBAdmFye3JvcH0gdG8gdGhlIGFyaXRobWV0aWMtZ2VvbWV0cmljIG1lYW4gb2YgQHZhcntvcDF9IGFuZCBAdmFye29wMn0sCnJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0uClRoZSBhcml0aG1ldGljLWdlb21ldHJpYyBtZWFuIGlzIHRoZSBjb21tb24gbGltaXQgb2YgdGhlIHNlcXVlbmNlcwp1W25dIGFuZCB2W25dLCB3aGVyZSB1WzBdPUB2YXJ7b3AxfSwgdlswXT1AdmFye29wMn0sIHVbbisxXSBpcyB0aGUKYXJpdGhtZXRpYyBtZWFuIG9mIHVbbl0gYW5kIHZbbl0sIGFuZCB2W24rMV0gaXMgdGhlIGdlb21ldHJpYyBtZWFuIG9mCnVbbl0gYW5kIHZbbl0uCklmIGFueSBvcGVyYW5kIGlzIG5lZ2F0aXZlLCB0aGUgcmV0dXJuIHZhbHVlIGlzIE5hTi4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9oeXBvdCAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7eH0sIG1wZnJfdCBAdmFye3l9LCBtcF9ybmRfdCBAdmFye3JuZH0pClNldCBAdmFye3JvcH0gdG8gdGhlIEV1Y2xpZGVhbiBub3JtIG9mIEB2YXJ7eH0gYW5kIEB2YXJ7eX0sCkBpZm5vdHRleAppLmUuQDogdGhlIHNxdWFyZSByb290IG9mIHRoZSBzdW0gb2YgdGhlIHNxdWFyZXMgb2YgQHZhcnt4fSBhbmQgQHZhcnt5fSwKQGVuZCBpZm5vdHRleApAdGV4CmkuZS5AOiAkXHNxcnR7eF4yK3leMn0kLApAZW5kIHRleApyb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9LgpTcGVjaWFsIHZhbHVlcyBhcmUgY3VycmVudGx5IGhhbmRsZWQgYXMgZGVzY3JpYmVkIGluIFNlY3Rpb24gRi45LjQuMyBvZgp0aGUgSVNPIEM5OSBzdGFuZGFyZCwgZm9yIHRoZSBAY29kZXtoeXBvdH0gZnVuY3Rpb24gKG5vdGUgdGhpcyBtYXkgY2hhbmdlCmluIGZ1dHVyZSB2ZXJzaW9ucyk6IElmIEB2YXJ7eH0gb3IgQHZhcnt5fSBpcyBhbiBpbmZpbml0eSwgdGhlbiBwbHVzCmluZmluaXR5IGlzIHJldHVybmVkIGluIEB2YXJ7cm9wfSwgZXZlbiBpZiB0aGUgb3RoZXIgbnVtYmVyIGlzIE5hTi4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9jb25zdF9sb2cyIChtcGZyX3QgQHZhcntyb3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9jb25zdF9waSAobXBmcl90IEB2YXJ7cm9wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfY29uc3RfZXVsZXIgKG1wZnJfdCBAdmFye3JvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX2NvbnN0X2NhdGFsYW4gKG1wZnJfdCBAdmFye3JvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byB0aGUgbG9nYXJpdGhtIG9mIDIsIHRoZSB2YWx1ZSBvZiBAbXtccGksUGl9LApvZiBFdWxlcidzIGNvbnN0YW50IDAuNTc3QGRvdHN7fSwgb2YgQ2F0YWxhbidzIGNvbnN0YW50IDAuOTE1QGRvdHN7fSwKcmVzcGVjdGl2ZWx5LCByb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24KQHZhcntybmR9LiBUaGVzZSBmdW5jdGlvbnMgY2FjaGUgdGhlIGNvbXB1dGVkIHZhbHVlcyB0byBhdm9pZCBvdGhlcgpjYWxjdWxhdGlvbnMgaWYgYSBsb3dlciBvciBlcXVhbCBwcmVjaXNpb24gaXMgcmVxdWVzdGVkLiBUbyBmcmVlIHRoZXNlIGNhY2hlcywKdXNlIEBjb2Rle21wZnJfZnJlZV9jYWNoZX0uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gdm9pZCBtcGZyX2ZyZWVfY2FjaGUgKHZvaWQpCkZyZWUgdmFyaW91cyBjYWNoZXMgdXNlZCBieSBNUEZSIGludGVybmFsbHksIGluIHBhcnRpY3VsYXIgdGhlCmNhY2hlcyB1c2VkIGJ5IHRoZSBmdW5jdGlvbnMgY29tcHV0aW5nIGNvbnN0YW50cyAoY3VycmVudGx5CkBjb2Rle21wZnJfY29uc3RfbG9nMn0sIEBjb2Rle21wZnJfY29uc3RfcGl9LApAY29kZXttcGZyX2NvbnN0X2V1bGVyfSBhbmQgQGNvZGV7bXBmcl9jb25zdF9jYXRhbGFufSkuCllvdSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSB0ZXJtaW5hdGluZyBhIHRocmVhZCwgZXZlbiBpZiB5b3UgZGlkCm5vdCBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSAodGhleSBjb3VsZCBoYXZlIGJlZW4gY2FsbGVkIGludGVybmFsbHkpLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX3N1bSAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl9wdHIgY29uc3QgQHZhcnt0YWJ9W10sIHVuc2lnbmVkIGxvbmcgQHZhcntufSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgQHZhcntyZXR9IHRvIHRoZSBzdW0gb2YgYWxsIGVsZW1lbnRzIG9mIEB2YXJ7dGFifSB3aG9zZSBzaXplIGlzIEB2YXJ7bn0sCnJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0uIFdhcm5pbmcsIEB2YXJ7dGFifSBpcyBhIHRhYmxlIG9mIHBvaW50ZXJzCnRvIG1wZnJfdCwgbm90IGEgdGFibGUgb2YgbXBmcl90IChwcmVsaW1pbmFyeSBpbnRlcmZhY2UpLiBUaGUgcmV0dXJuZWQKQGNvZGV7aW50fSB2YWx1ZSBpcyB6ZXJvIHdoZW4gdGhlIGNvbXB1dGVkIHZhbHVlIGlzIHRoZSBleGFjdCB2YWx1ZSwKYW5kIG5vbi16ZXJvIHdoZW4gdGhpcyBjYW5ub3QgYmUgZ3VhcmFudGVlZCwgd2l0aG91dCBnaXZpbmcgdGhlCmRpcmVjdGlvbiBvZiB0aGUgZXJyb3IgYXMgdGhlIG90aGVyIGZ1bmN0aW9ucyBkby4KQGVuZCBkZWZ0eXBlZnVuCgpAbm9kZSBJbnB1dCBhbmQgT3V0cHV0IEZ1bmN0aW9ucywgRm9ybWF0dGVkIE91dHB1dCBGdW5jdGlvbnMsIFNwZWNpYWwgRnVuY3Rpb25zLCBNUEZSIEludGVyZmFjZQpAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKQGNpbmRleCBGbG9hdCBpbnB1dCBhbmQgb3V0cHV0IGZ1bmN0aW9ucwpAY2luZGV4IElucHV0IGZ1bmN0aW9ucwpAY2luZGV4IE91dHB1dCBmdW5jdGlvbnMKQGNpbmRleCBJL08gZnVuY3Rpb25zCkBzZWN0aW9uIElucHV0IGFuZCBPdXRwdXQgRnVuY3Rpb25zCgpUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gaW5wdXQgZnJvbSBhbiBpbnB1dC9vdXRwdXQKc3RyZWFtLCBhbmQgZnVuY3Rpb25zIHRoYXQgb3V0cHV0IHRvIGFuIGlucHV0L291dHB1dCBzdHJlYW0uClBhc3NpbmcgYSBudWxsIHBvaW50ZXIgZm9yIGEgQGNvZGV7c3RyZWFtfSB0byBhbnkgb2YgdGhlc2UgZnVuY3Rpb25zIHdpbGwgbWFrZQp0aGVtIHJlYWQgZnJvbSBAY29kZXtzdGRpbn0gYW5kIHdyaXRlIHRvIEBjb2Rle3N0ZG91dH0sIHJlc3BlY3RpdmVseS4KCldoZW4gdXNpbmcgYW55IG9mIHRoZXNlIGZ1bmN0aW9ucywgeW91IG11c3QgaW5jbHVkZSB0aGUgQGNvZGV7PHN0ZGlvLmg+fQpzdGFuZGFyZCBoZWFkZXIgYmVmb3JlIEBmaWxle21wZnIuaH0sIHRvIGFsbG93IEBmaWxle21wZnIuaH0gdG8gZGVmaW5lCnByb3RvdHlwZXMgZm9yIHRoZXNlIGZ1bmN0aW9ucy4KCkBkZWZ0eXBlZnVuIHNpemVfdCBtcGZyX291dF9zdHIgKEZJTEUgKkB2YXJ7c3RyZWFtfSwgaW50IEB2YXJ7YmFzZX0sIHNpemVfdCBAdmFye259LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKT3V0cHV0IEB2YXJ7b3B9IG9uIHN0cmVhbSBAdmFye3N0cmVhbX0sIGFzIGEgc3RyaW5nIG9mIGRpZ2l0cyBpbgpiYXNlIEB2YXJ7YmFzZX0sIHJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0uClRoZSBiYXNlIG1heSB2YXJ5IGZyb20gMiB0byAzNi4gIFByaW50IEB2YXJ7bn0gc2lnbmlmaWNhbnQgZGlnaXRzIGV4YWN0bHksCm9yIGlmIEB2YXJ7bn0gaXMgMCwgZW5vdWdoIGRpZ2l0cyBzbyB0aGF0IEB2YXJ7b3B9IGNhbiBiZSByZWFkIGJhY2sKZXhhY3RseSAoc2VlIEBjb2Rle21wZnJfZ2V0X3N0cn0pLgoKSW4gYWRkaXRpb24gdG8gdGhlIHNpZ25pZmljYW50IGRpZ2l0cywgYSBkZWNpbWFsIHBvaW50IChkZWZpbmVkIGJ5IHRoZQpjdXJyZW50IGxvY2FsZSkgYXQgdGhlIHJpZ2h0IG9mIHRoZQpmaXJzdCBkaWdpdCBhbmQgYSB0cmFpbGluZyBleHBvbmVudCBpbiBiYXNlIDEwLCBpbiB0aGUgZm9ybSBAc2FtcHtlTk5OfSwKYXJlIHByaW50ZWQuIElmIEB2YXJ7YmFzZX0gaXMgZ3JlYXRlciB0aGFuIDEwLCBAc2FtcHtAQH0gd2lsbCBiZSB1c2VkCmluc3RlYWQgb2YgQHNhbXB7ZX0gYXMgZXhwb25lbnQgZGVsaW1pdGVyLgoKUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgb3IgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIHJldHVybiAwLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIHNpemVfdCBtcGZyX2lucF9zdHIgKG1wZnJfdCBAdmFye3JvcH0sIEZJTEUgKkB2YXJ7c3RyZWFtfSwgaW50IEB2YXJ7YmFzZX0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKSW5wdXQgYSBzdHJpbmcgaW4gYmFzZSBAdmFye2Jhc2V9IGZyb20gc3RyZWFtIEB2YXJ7c3RyZWFtfSwKcm91bmRlZCBpbiB0aGUgZGlyZWN0aW9uIEB2YXJ7cm5kfSwgYW5kIHB1dCB0aGUKcmVhZCBmbG9hdCBpbiBAdmFye3JvcH0uCkBjIFRoZSBhcmd1bWVudCBAdmFye2Jhc2V9IG11c3QgYmUgaW4gdGhlIHJhbmdlIDIgdG8gMzYuCgpAYyBUaGUgc3RyaW5nIGlzIG9mIHRoZSBmb3JtIEBzYW1we01AQE59IG9yLCBpZiB0aGUKQGMgYmFzZSBpcyAxMCBvciBsZXNzLCBhbHRlcm5hdGl2ZWx5IEBzYW1we01lTn0gb3IgQHNhbXB7TUVOfSwgb3IsIGlmIHRoZSBiYXNlCkBjIGlzIDE2LCBhbHRlcm5hdGl2ZWx5IEBzYW1we01wQn0gb3IgQHNhbXB7TVBCfS4KQGMgQHNhbXB7TX0gaXMgdGhlIHNpZ25pZmljYW5kIGluIHRoZSBzcGVjaWZpZWQgYmFzZSwgQHNhbXB7Tn0gaXMgdGhlIGV4cG9uZW50CkBjIHdyaXR0ZW4gaW4gZGVjaW1hbCBmb3IgdGhlIHNwZWNpZmllZCBiYXNlLCBhbmQgaW4gYmFzZSAxNiwgQHNhbXB7Qn0gaXMgdGhlCkBjIGJpbmFyeSBleHBvbmVudCB3cml0dGVuIGluIGRlY2ltYWwgKGkuZS5AOiBpdCBpbmRpY2F0ZXMgdGhlIHBvd2VyIG9mIDIgYnkKQGMgd2hpY2ggdGhlIHNpZ25pZmljYW5kIGlzIHRvIGJlIHNjYWxlZCkuClRoaXMgZnVuY3Rpb24gcmVhZHMgYSB3b3JkIChkZWZpbmVkIGFzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBiZXR3ZWVuCndoaXRlc3BhY2UpIGFuZCBwYXJzZXMgaXQgdXNpbmcgQGNvZGV7bXBmcl9zZXRfc3RyfSAoaXQgbWF5IGNoYW5nZSkuClNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBAY29kZXttcGZyX3N0cnRvZnJ9IGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uCm9mIHRoZSB2YWxpZCBzdHJpbmcgZm9ybWF0cy4KQGMgU3BlY2lhbCB2YWx1ZXMgY2FuIGJlIHJlYWQgYXMgZm9sbG93cyAodGhlIGNhc2UgZG9lcyBub3QgbWF0dGVyKToKQGMgQGNvZGV7QEBOYU5AQH0sIEBjb2Rle0BASW5mQEB9LCBAY29kZXsrQEBJbmZAQH0gYW5kIEBjb2Rley1AQEluZkBAfSwKQGMgcG9zc2libHkgZm9sbG93ZWQgYnkgb3RoZXIgY2hhcmFjdGVyczsgaWYgdGhlIGJhc2UgaXMgc21hbGxlciBvciBlcXVhbApAYyB0byAxNiwgdGhlIGZvbGxvd2luZyBzdHJpbmdzIGFyZSBhY2NlcHRlZCB0b286IEBjb2Rle05hTn0sIEBjb2Rle0luZn0sCkBjIEBjb2RleytJbmZ9IGFuZCBAY29kZXstSW5mfS4KClJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIGlmIGFuIGVycm9yIG9jY3VycmVkLCByZXR1cm4gMC4KQGVuZCBkZWZ0eXBlZnVuCgpAYyBAZGVmdHlwZWZ1biB2b2lkIG1wZnJfaW5wX3JhdyAobXBmcl90IEB2YXJ7ZmxvYXR9LCBGSUxFICpAdmFye3N0cmVhbX0pCkBjIElucHV0IGZyb20gc3RkaW8gc3RyZWFtIEB2YXJ7c3RyZWFtfSBpbiB0aGUgZm9ybWF0IHdyaXR0ZW4gYnkKQGMgQGNvZGV7bXBmcl9vdXRfcmF3fSwgYW5kIHB1dCB0aGUgcmVzdWx0IGluIEB2YXJ7ZmxvYXR9LgpAYyBAZW5kIGRlZnR5cGVmdW4KCkBub2RlIEZvcm1hdHRlZCBPdXRwdXQgRnVuY3Rpb25zLCBJbnRlZ2VyIFJlbGF0ZWQgRnVuY3Rpb25zLCBJbnB1dCBhbmQgT3V0cHV0IEZ1bmN0aW9ucywgTVBGUiBJbnRlcmZhY2UKQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCkBjaW5kZXggRmxvYXQgb3V0cHV0IGZ1bmN0aW9ucwpAY2luZGV4IE91dHB1dCBmdW5jdGlvbnMKQGNpbmRleCBJL08gZnVuY3Rpb25zCkBzZWN0aW9uIEZvcm1hdHRlZCBPdXRwdXQgRnVuY3Rpb25zCgpAc3Vic2VjdGlvbiBSZXF1aXJlbWVudHMKVGhlIGNsYXNzIG9mIEBjb2Rle21wZnJfcHJpbnRmfSBmdW5jdGlvbnMgcHJvdmlkZXMgZm9ybWF0dGVkIG91dHB1dCBpbiBhCnNpbWlsYXIgbWFubmVyIGFzIHRoZSBzdGFuZGFyZCBDIEBjb2Rle3ByaW50Zn0uIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZApvbmx5IGlmIHlvdXIgc3lzdGVtIHN1cHBvcnRzIElTTyBDIHZhcmlhZGljIGZ1bmN0aW9ucyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKYXJndW1lbnQgYWNjZXNzIG1hY3Jvcy4KCldoZW4gdXNpbmcgYW55IG9mIHRoZXNlIGZ1bmN0aW9ucywgeW91IG11c3QgaW5jbHVkZSB0aGUgQGNvZGV7PHN0ZGlvLmg+fQpzdGFuZGFyZCBoZWFkZXIgYmVmb3JlIEBmaWxle21wZnIuaH0sIHRvIGFsbG93IEBmaWxle21wZnIuaH0gdG8gZGVmaW5lCnByb3RvdHlwZXMgZm9yIHRoZXNlIGZ1bmN0aW9ucy4KCkBzdWJzZWN0aW9uIEZvcm1hdCBTdHJpbmcKVGhlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGFjY2VwdGVkIGJ5IEBjb2Rle21wZnJfcHJpbnRmfSBpcyBhbiBleHRlbnNpb24gb2YgdGhlCkBjb2Rle3ByaW50Zn0gb25lLiBUaGUgY29udmVyc2lvbiBzcGVjaWZpY2F0aW9uIGlzIG9mIHRoZSBmb3JtOgpAZXhhbXBsZQolIFtmbGFnc10gW3dpZHRoXSBbLltwcmVjaXNpb25dXSBbdHlwZV0gW3JvdW5kaW5nXSBjb252CkBlbmQgZXhhbXBsZQpAc2FtcHtmbGFnc30sIEBzYW1we3dpZHRofSwgYW5kIEBzYW1we3ByZWNpc2lvbn0gaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGFzIGZvcgp0aGUgc3RhbmRhcmQgQyBmdW5jdGlvbiBAY29kZXtwcmludGZ9IChpbiBwYXJ0aWN1bGFyLCBub3RpY2UgdGhhdCB0aGUKcHJlY2lzaW9uIGlzIHJlbGF0ZWQgdG8gdGhlIG51bWJlciBvZiBkaWdpdHMgZGlzcGxheWVkIGluIHRoZSBiYXNlIGNob3NlbiBieQpAc2FtcHtjb252fSBhbmQgbm90IHJlbGF0ZWQgdG8gdGhlIGludGVybmFsIHByZWNpc2lvbiBvZiB0aGUgQGNvZGV7bXBmcl90fQp2YXJpYWJsZSkuICBAY29kZXttcGZyX3ByaW50Zn0gYWNjZXB0cyB0aGUgc2FtZSBAc2FtcHt0eXBlfSBzcGVjaWZpZXJzIGFzCkBjb2Rle2dtcH0gKGV4Y2VwdCB0aGUgbm9uLXN0YW5kYXJkIGFuZCBkZXByZWNhdGVkIEBzYW1we3F9LCB1c2UgQHNhbXB7bGx9Cmluc3RlYWQpLCBwbHVzIEBzYW1we1J9IGFuZCBAc2FtcHtQfToKCkBxdW90YXRpb24KQG11bHRpdGFibGUgeyhzcGFjZSl9IHtNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU19CkBpdGVtIEBzYW1we2h9ICBAdGFiIEBjb2Rle3Nob3J0fQpAaXRlbSBAc2FtcHtoaH0gQHRhYiBAY29kZXtjaGFyfQpAaXRlbSBAc2FtcHtqfSAgQHRhYiBAY29kZXtpbnRtYXhfdH0gb3IgQGNvZGV7dWludG1heF90fQpAaXRlbSBAc2FtcHtsfSAgQHRhYiBAY29kZXtsb25nfSBvciBAY29kZXt3Y2hhcl90fQpAaXRlbSBAc2FtcHtsbH0gQHRhYiBAY29kZXtsb25nIGxvbmd9CkBpdGVtIEBzYW1we0x9ICBAdGFiIEBjb2Rle2xvbmcgZG91YmxlfQpAaXRlbSBAc2FtcHt0fSAgQHRhYiBAY29kZXtwdHJkaWZmX3R9CkBpdGVtIEBzYW1we3p9ICBAdGFiIEBjb2Rle3NpemVfdH0KCkBpdGVtIEBzYW1we0Z9ICBAdGFiIEBjb2Rle21wZl90fSwgZmxvYXQgY29udmVyc2lvbnMKQGl0ZW0gQHNhbXB7UX0gIEB0YWIgQGNvZGV7bXBxX3R9LCBpbnRlZ2VyIGNvbnZlcnNpb25zCkBpdGVtIEBzYW1we019ICBAdGFiIEBjb2Rle21wX2xpbWJfdH0sIGludGVnZXIgY29udmVyc2lvbnMKQGl0ZW0gQHNhbXB7Tn0gIEB0YWIgQGNvZGV7bXBfbGltYl90fSBhcnJheSwgaW50ZWdlciBjb252ZXJzaW9ucwpAaXRlbSBAc2FtcHtafSAgQHRhYiBAY29kZXttcHpfdH0sIGludGVnZXIgY29udmVyc2lvbnMKCkBpdGVtIEBzYW1we1J9ICBAdGFiIEBjb2Rle21wZnJfdH0gaW5wdXQsIGZsb2F0IGNvbnZlcnNpb25zCkBpdGVtIEBzYW1we1B9ICBAdGFiIEBjb2Rle21wZnJfcHJlY190fSBpbnB1dCwgaW50ZWdlciBjb252ZXJzaW9ucwpAZW5kIG11bHRpdGFibGUKQGVuZCBxdW90YXRpb24KClRoZSBAc2FtcHt0eXBlfSBzcGVjaWZpZXJzIGhhdmUgdGhlIHNhbWUgcmVzdHJpY3Rpb25zIGFzIHRob3NlCm1lbnRpb25lZCBpbiB0aGUgR01QIGRvY3VtZW50YXRpb246CkBpZmluZm8KQHB4cmVme0Zvcm1hdHRlZCBPdXRwdXQgU3RyaW5ncywsLCBnbXAuaW5mbyxHTlUgTVB9LgpAZW5kIGlmaW5mbwpAaWZub3RpbmZvCnNlZSBTZWN0aW9uIGBgRm9ybWF0dGVkIE91dHB1dCBTdHJpbmdzJycgaW4gQGNpdGV7R05VIE1QfS4KQGVuZCBpZm5vdGluZm8KTW9yZSBwcmVjaXNlbHksIGV4Y2VwdCBmb3IgQHNhbXB7Un0gYW5kIEBzYW1we1B9Cih3aGljaCBhcmUgZGVmaW5lZCBieSBNUEZSKSwgdGhlIEBzYW1we3R5cGV9IHNwZWNpZmllcnMgYXJlIHN1cHBvcnRlZApvbmx5IGlmIHRoZXkgYXJlIHN1cHBvcnRlZCBieSBAY29kZXtnbXBfcHJpbnRmfSBpbiB5b3VyIEdNUCBidWlsZDsKdGhpcyBpbXBsaWVzIHRoYXQgdGhlIHN0YW5kYXJkIHNwZWNpZmllcnMsIHN1Y2ggYXMgQHNhbXB7dH0sIG11c3QKQGVtcGh7YWxzb30gYmUgc3VwcG9ydGVkIGJ5IHlvdXIgQyBsaWJyYXJ5IGlmIHlvdSB3YW50IHRvIHVzZSB0aGVtLgoKVGhlIEBzYW1we3JvdW5kaW5nfSBzcGVjaWZpZXIgaXMgc3BlY2lmaWMgdG8gQGNvZGV7bXBmcl90fSBwYXJhbWV0ZXIgYW5kIHNoYWxsCm5vdCBiZSB1c2VkIHdpdGggb3RoZXIgdHlwZXMuIEBjb2Rle21wZnJfcHJpbnRmfSBhY2NlcHRzIHRoZSBzYW1lIGNvbnZlcnNpb24Kc3BlY2lmaWVyIGNoYXJhY3RlciBAc2FtcHtjb252fSBhcyBAY29kZXtnbXBfcHJpbnRmfSBwbHVzIEBzYW1we2J9LgoKVGhlIEBzYW1we1B9IHR5cGUgb3V0cHV0cyB0aGUgcHJlY2lzaW9uIG9mIGFuIEBjb2Rle21wZnJfdH0gdmFyaWFibGUuCkl0IGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBAY29kZXttcGZyX3ByZWNfdH0gdHlwZSBkb2VzIG5vdCBuZWNlc3NhcmlseQpjb3JyZXNwb25kIHRvIGFuIEBjb2Rle3Vuc2lnbmVkIGludH0gb3IgYW55IGZpeGVkIHN0YW5kYXJkIHR5cGUuCkZvciBleGFtcGxlOgpAZXhhbXBsZQptcGZyX3QgeDsKbXBmcl9wcmVjX3QgcDsKbXBmcl9pbml0ICh4KTsKQGRvdHN7fQpwID0gbXBmcl9nZXRfcHJlYyAoeCk7Cm1wZnJfcHJpbnRmICgidmFyaWFibGUgeCB3aXRoICVQdSBiaXRzIiwgcCk7CkBlbmQgZXhhbXBsZQoKVGhlIEBzYW1we1J9IHR5cGUgaXMgdXNlZCBmb3IgYSBAY29kZXttcGZyX3R9IG91dHB1dCBhbmQgY2FuIGJlIGZvbGxvd2VkIGJ5CmEgcm91bmRpbmcgc3BlY2lmaWVyIGRlbm90ZWQgYnkgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKCkBxdW90YXRpb24KQG11bHRpdGFibGUgeyhzcGFjZSl9IHtNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU19CkBpdGVtIEBzYW1we1V9ICBAdGFiIHJvdW5kIHRvd2FyZCBwbHVzIGluZmluaXR5CkBpdGVtIEBzYW1we0R9ICBAdGFiIHJvdW5kIHRvd2FyZCBtaW51cyBpbmZpbml0eQpAaXRlbSBAc2FtcHtafSAgQHRhYiByb3VuZCB0b3dhcmQgemVybwpAaXRlbSBAc2FtcHtOfSAgQHRhYiByb3VuZCB0byBuZWFyZXN0CkBpdGVtIEBzYW1weyp9ICBAdGFiIHJvdW5kaW5nIG1vZGUgKGFzIGEgQGNvZGV7bXBmcl9ybmRfdH0pIGluZGljYXRlZCBieSB0aGUKYXJndW1lbnQganVzdCBiZWZvcmUgdGhlIGNvcnJlc3BvbmRpbmcgQGNvZGV7bXBmcl90fSB2YXJpYWJsZS4KQGVuZCBtdWx0aXRhYmxlCkBlbmQgcXVvdGF0aW9uCgpJZiB0aGUgcHJlY2lzaW9uIGZpZWxkIGlzIG5vdCBlbXB0eSwgdGhlIEBjb2Rle21wZnJfdH0gbnVtYmVyIGlzIHJvdW5kZWQgdG8KdGhlIGdpdmVuIHByZWNpc2lvbiBpbiB0aGUgZGlyZWN0aW9uIHNwZWNpZmllZCBieSB0aGUgcm91bmRpbmcgbW9kZS4KSWYgdGhlIHByZWNpc2lvbiBmaWVsZCBpcyBlbXB0eSAoYXMgaW4gQHNhbXB7JS5SZn0pLCB0aGUgbnVtYmVyIGlzIGRpc3BsYXllZAp3aXRoIGVub3VnaCBkaWdpdHMgc28gdGhhdCBpdCBjYW4gYmUgcmVhZCBiYWNrIGV4YWN0bHkgKGFzc3VtaW5nIHJvdW5kaW5nIHRvCm5lYXJlc3QsIHNlZSBAY29kZXttcGZyX2dldF9zdHJ9KS4KSWYgbm8gcm91bmRpbmcgaXMgc3BlY2lmaWVkLCB0aGUgQGNvZGV7bXBmcl90fSBhcmd1bWVudCBpcyByb3VuZGVkIHRvIG5lYXJlc3QuClRoZSBmb2xsb3dpbmcgdGhyZWUgZXhhbXBsZXMgYXJlIGVxdWl2YWxlbnQ6CkBleGFtcGxlCm1wZnJfdCB4OwptcGZyX2luaXQgKHgpOwpAZG90c3t9Cm1wZnJfcHJpbnRmICgiJS4xMjhSZiIsIHgpOwptcGZyX3ByaW50ZiAoIiUuMTI4Uk5mIiwgeCk7Cm1wZnJfcHJpbnRmICgiJS4xMjhSKmYiLCBHTVBfUk5ETiwgeCk7CkBlbmQgZXhhbXBsZQoKQGNvZGV7bXBmcl9wcmludGZ9IGFsc28gYWRkcyBhIG5ldyBjb252ZXJzaW9uIHNwZWNpZmllciBAc2FtcHtifSB3aGljaApkaXNwbGF5cyB0aGUgQGNvZGV7bXBmcl90fSBwYXJhbWV0ZXIgaW4gYmluYXJ5LCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkIHdpdGgKb3RoZXIgcGFyYW1ldGVyIHR5cGUuClRoZSBAc2FtcHtjb252fSBzcGVjaWZpZXJzIGFsbG93ZWQgd2l0aCBAY29kZXttcGZyX3R9IHBhcmFtZXRlciBhcmU6CgpAcXVvdGF0aW9uCkBtdWx0aXRhYmxlIHsoc3BhY2UpfSB7TU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NfQpAaXRlbSBAc2FtcHthfSBAc2FtcHtBfSBAdGFiIGhleCBmbG9hdCwgQzk5IHN0eWxlCkBpdGVtIEBzYW1we2J9ICAgICAgICAgIEB0YWIgYmluYXJ5IG91dHB1dApAaXRlbSBAc2FtcHtlfSBAc2FtcHtFfSBAdGFiIHNjaWVudGlmaWMgZm9ybWF0IGZsb2F0CkBpdGVtIEBzYW1we2Z9ICAgICAgICAgIEB0YWIgZml4ZWQgcG9pbnQgZmxvYXQKQGl0ZW0gQHNhbXB7Z30gQHNhbXB7R30gQHRhYiBmaXhlZCBvciBzY2llbnRpZmljIGZsb2F0CkBlbmQgbXVsdGl0YWJsZQpAZW5kIHF1b3RhdGlvbgoKSW4gY2FzZSBvZiBub24tZGVjaW1hbCBvdXRwdXQsIG9ubHkgdGhlIHNpZ25pZmljYW5kIGlzIHdyaXR0ZW4gaW4gdGhlCnNwZWNpZmllZCBiYXNlLCB0aGUgZXhwb25lbnQgaXMgYWx3YXlzIGRpc3BsYXllZCBpbiBkZWNpbWFsLgpTcGVjaWFsIHZhbHVlcyBhcmUgYWx3YXlzIGRpc3BsYXllZCBhcyBAY29kZXtuYW59LCBAY29kZXstaW5mfSwgYW5kCkBjb2Rle2luZn0gZm9yIEBzYW1we2F9LCBAc2FtcHtifSwgQHNhbXB7ZX0sIEBzYW1we2Z9LCBhbmQgQHNhbXB7Z30Kc3BlY2lmaWVycyBhbmQgQGNvZGV7TkFOfSwgQGNvZGV7LUlORn0sIGFuZApAY29kZXtJTkZ9IGZvciBAc2FtcHtBfSwgQHNhbXB7RX0sIEBzYW1we0Z9LCBhbmQgQHNhbXB7R30Kc3BlY2lmaWVycy4KSW4gYmluYXJ5IG91dHB1dCwgdGhlIHByZWNpc2lvbiBpcyBzaWxlbnRseSBpbmNyZWFzZWQgdXAgdG8gMiBpZiBpdCBlcXVhbHMgMS4KCkBzdWJzZWN0aW9uIEZ1bmN0aW9ucwpAZGVmdHlwZWZ1biBpbnQgbXBmcl9mcHJpbnRmIChGSUxFICpAdmFye3N0cmVhbX0sIGNvbnN0IGNoYXIgKkB2YXJ7dGVtcGxhdGV9LCBAZG90c3t9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfdmZwcmludGYgKEZJTEUgKkB2YXJ7c3RyZWFtfSwgY29uc3QgY2hhciAqQHZhcnt0ZW1wbGF0ZX0sIHZhX2xpc3QgQHZhcnthcH0pClByaW50IHRvIHRoZSBzdHJlYW0gQHZhcntzdHJlYW19IHRoZSBvcHRpb25hbCBhcmd1bWVudHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YKdGhlIHRlbXBsYXRlIHN0cmluZyBAdmFye3RlbXBsYXRlfS4KClJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiBvciBhIG5lZ2F0aXZlIHZhbHVlIGlmIGFuIGVycm9yCm9jY3VycmVkLiBJZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hpY2ggb3VnaHQgdG8gYmUgd3JpdHRlbiBhcHBlYXJzCnRvIGV4Y2VlZCB0aGUgbWF4aW11bSBsaW1pdCBmb3IgYW4gQGNvZGV7aW50fSwgbm90aGluZyBpcyB3cml0dGVuIGluIHRoZQpzdHJlYW0sIHRoZSBmdW5jdGlvbiByZXR1cm5zIEBtaW51c3t9MSwgc2V0cyB0aGUgQGVtcGh7ZXJhbmdlfSBmbGFnLCBhbmQgKGluClBPU0lYIHN5c3RlbSBvbmx5KSBAY29kZXtlcnJub30gaXMgc2V0IHRvIEBjb2Rle0VPVkVSRkxPV30uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gIGludCBtcGZyX3ByaW50ZiAoY29uc3QgY2hhciAqQHZhcnt0ZW1wbGF0ZX0sIEBkb3Rze30pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl92cHJpbnRmIChjb25zdCBjaGFyICpAdmFye3RlbXBsYXRlfSwgdmFfbGlzdCBAdmFye2FwfSkKUHJpbnQgdG8gQHZhcntzdGRvdXR9IHRoZSBvcHRpb25hbCBhcmd1bWVudHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlCnRlbXBsYXRlIHN0cmluZyBAdmFye3RlbXBsYXRlfS4KClJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiBvciBhIG5lZ2F0aXZlIHZhbHVlIGlmIGFuIGVycm9yCm9jY3VycmVkLiBJZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hpY2ggb3VnaHQgdG8gYmUgd3JpdHRlbiBhcHBlYXJzCnRvIGV4Y2VlZCB0aGUgbWF4aW11bSBsaW1pdCBmb3IgYW4gQGNvZGV7aW50fSwgbm90aGluZyBpcyB3cml0dGVuIGluCkBjb2Rle3N0ZG91dH0sIHRoZSBmdW5jdGlvbiByZXR1cm5zIEBtaW51c3t9MSwgc2V0cyB0aGUgQGVtcGh7ZXJhbmdlfSBmbGFnLAphbmQgKGluIFBPU0lYIHN5c3RlbSBvbmx5KSBAY29kZXtlcnJub30gaXMgc2V0IHRvIEBjb2Rle0VPVkVSRkxPV30uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfc3ByaW50ZiAoY2hhciAqQHZhcntidWZ9LCBjb25zdCBjaGFyICpAdmFye3RlbXBsYXRlfSwgQGRvdHN7fSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3ZzcHJpbnRmIChjaGFyICpAdmFye2J1Zn0sIGNvbnN0IGNoYXIgKkB2YXJ7dGVtcGxhdGV9LCB2YV9saXN0IEB2YXJ7YXB9KQpGb3JtIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBpbiBAdmFye2J1Zn0uIE5vIG92ZXJsYXAgaXMgcGVybWl0dGVkIGJldHdlZW4KQHZhcntidWZ9IGFuZCB0aGUgb3RoZXIgYXJndW1lbnRzLgoKUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuIGluIHRoZSBhcnJheSBAdmFye2J1Zn0gbm90IGNvdW50aW5nCnRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3RlciBvciBhIG5lZ2F0aXZlIHZhbHVlIGlmIGFuIGVycm9yIG9jY3VycmVkLiBJZgp0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hpY2ggb3VnaHQgdG8gYmUgd3JpdHRlbiBhcHBlYXJzIHRvIGV4Y2VlZCB0aGUKbWF4aW11bSBsaW1pdCBmb3IgYW4gQGNvZGV7aW50fSwgbm90aGluZyBpcyB3cml0dGVuIGluIEB2YXJ7YnVmfSwgdGhlIGZ1bmN0aW9uCnJldHVybnMgQG1pbnVze30xLCBzZXRzIHRoZSBAZW1waHtlcmFuZ2V9IGZsYWcsIGFuZCAoaW4gUE9TSVggc3lzdGVtIG9ubHkpCkBjb2Rle2Vycm5vfSBpcyBzZXQgdG8gQGNvZGV7RU9WRVJGTE9XfS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9zbnByaW50ZiAoY2hhciAqQHZhcntidWZ9LCBzaXplX3QgQHZhcntufSwgY29uc3QgY2hhciAqQHZhcnt0ZW1wbGF0ZX0sIEBkb3Rze30pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl92c25wcmludGYgKGNoYXIgKkB2YXJ7YnVmfSwgc2l6ZV90IEB2YXJ7bn0sIGNvbnN0IGNoYXIgKkB2YXJ7dGVtcGxhdGV9LCB2YV9saXN0IEB2YXJ7YXB9KQpGb3JtIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBpbiBAdmFye2J1Zn0uIElmIEB2YXJ7bn0gaXMgemVybywgbm90aGluZyBpcwp3cml0dGVuIGFuZCBAdmFye2J1Zn0gbWF5IGJlIGEgbnVsbCBwb2ludGVyLCBvdGhlcndpc2UsIHRoZSBAY29kZXtuLTF9IGZpcnN0CmNoYXJhY3RlcnMgYXJlIHdyaXR0ZW4gaW4gQHZhcntidWZ9IGFuZCB0aGUgQHZhcntufS10aCBpcyBhIG51bGwgY2hhcmFjdGVyLgoKUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGhhdmUgYmVlbiB3cml0dGVuIGhhZCBAdmFye259IGJlCnN1ZmZpY2llbnRseSBsYXJnZSwgbm90IGNvdW50aW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsIGNoYXJhY3RlciBvciBhIG5lZ2F0aXZlCnZhbHVlIGlmIGFuIGVycm9yIG9jY3VycmVkLiBJZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJvZHVjZWQgYnkgdGhlCm9wdGlvbmFsIGFyZ3VtZW50cyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgdGVtcGxhdGUgc3RyaW5nIEB2YXJ7dGVtcGxhdGV9CmFwcGVhcnMgdG8gZXhjZWVkIHRoZSBtYXhpbXVtIGxpbWl0IGZvciBhbiBAY29kZXtpbnR9LCBub3RoaW5nIGlzIHdyaXR0ZW4gaW4KQHZhcntidWZ9LCB0aGUgZnVuY3Rpb24gcmV0dXJucyBAbWludXN7fTEsIHNldHMgdGhlIEBlbXBoe2VyYW5nZX0gZmxhZywgYW5kCihpbiBQT1NJWCBzeXN0ZW0gb25seSkgQGNvZGV7ZXJybm99IGlzIHNldCB0byBAY29kZXtFT1ZFUkZMT1d9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2FzcHJpbnRmIChjaGFyICoqQHZhcntzdHJ9LCBjb25zdCBjaGFyICpAdmFye3RlbXBsYXRlfSwgQGRvdHN7fSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3Zhc3ByaW50ZiAoY2hhciAqKkB2YXJ7c3RyfSwgY29uc3QgY2hhciAqQHZhcnt0ZW1wbGF0ZX0sIHZhX2xpc3QgQHZhcnthcH0pCldyaXRlIHRoZWlyIG91dHB1dCBhcyBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgaW4gYSBibG9jayBvZiBtZW1vcnkgYWxsb2NhdGVkCnVzaW5nIHRoZSBjdXJyZW50IGFsbG9jYXRpb24gZnVuY3Rpb24uIEEgcG9pbnRlciB0byB0aGUgYmxvY2sgaXMgc3RvcmVkIGluCkB2YXJ7c3RyfS4gVGhlIGJsb2NrIG9mIG1lbW9yeSBtdXN0IGJlIGZyZWVkIHVzaW5nIEBjb2Rle21wZnJfZnJlZV9zdHJ9LgoKVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiBpbiB0aGUgc3RyaW5nLCBleGNsdWRpbmcKdGhlIG51bGwtdGVybWluYXRvciBvciBhIG5lZ2F0aXZlIHZhbHVlIGlmIGFuIGVycm9yIG9jY3VycmVkLiBJZiB0aGUgbnVtYmVyIG9mCmNoYXJhY3RlcnMgcHJvZHVjZWQgYnkgdGhlIG9wdGlvbmFsIGFyZ3VtZW50cyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUKdGVtcGxhdGUgc3RyaW5nIEB2YXJ7dGVtcGxhdGV9IGFwcGVhcnMgdG8gZXhjZWVkIHRoZSBtYXhpbXVtIGxpbWl0IGZvciBhbgpAY29kZXtpbnR9LCBAdmFye3N0cn0gaXMgYSBudWxsIHBvaW50ZXIsIHRoZSBmdW5jdGlvbiByZXR1cm5zIEBtaW51c3t9MSwgc2V0cwp0aGUgQGVtcGh7ZXJhbmdlfSBmbGFnLCBhbmQgKGluIFBPU0lYIHN5c3RlbSBvbmx5KSBAY29kZXtlcnJub30gaXMgc2V0IHRvCkBjb2Rle0VPVkVSRkxPV30uCkBlbmQgZGVmdHlwZWZ1bgoKQG5vZGUgSW50ZWdlciBSZWxhdGVkIEZ1bmN0aW9ucywgUm91bmRpbmcgUmVsYXRlZCBGdW5jdGlvbnMsIEZvcm1hdHRlZCBPdXRwdXQgRnVuY3Rpb25zLCBNUEZSIEludGVyZmFjZQpAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKQGNpbmRleCBJbnRlZ2VyIHJlbGF0ZWQgZnVuY3Rpb25zCkBzZWN0aW9uIEludGVnZXIgYW5kIFJlbWFpbmRlciBSZWxhdGVkIEZ1bmN0aW9ucwoKQGRlZnR5cGVmdW4gaW50IG1wZnJfcmludCAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9jZWlsIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9mbG9vciAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfcm91bmQgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3RydW5jIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0pClNldCBAdmFye3JvcH0gdG8gQHZhcntvcH0gcm91bmRlZCB0byBhbiBpbnRlZ2VyLgpAY29kZXttcGZyX3JpbnR9IHJvdW5kcyB0byB0aGUgbmVhcmVzdCByZXByZXNlbnRhYmxlIGludGVnZXIgaW4gdGhlCmdpdmVuIHJvdW5kaW5nIG1vZGUsIEBjb2Rle21wZnJfY2VpbH0gcm91bmRzCnRvIHRoZSBuZXh0IGhpZ2hlciBvciBlcXVhbCByZXByZXNlbnRhYmxlIGludGVnZXIsIEBjb2Rle21wZnJfZmxvb3J9IHRvCnRoZSBuZXh0IGxvd2VyIG9yIGVxdWFsIHJlcHJlc2VudGFibGUgaW50ZWdlciwgQGNvZGV7bXBmcl9yb3VuZH0gdG8gdGhlCm5lYXJlc3QgcmVwcmVzZW50YWJsZSBpbnRlZ2VyLCByb3VuZGluZyBoYWxmd2F5IGNhc2VzIGF3YXkgZnJvbSB6ZXJvLAphbmQgQGNvZGV7bXBmcl90cnVuY30gdG8gdGhlIG5leHQgcmVwcmVzZW50YWJsZSBpbnRlZ2VyIHRvd2FyZCB6ZXJvLgoKVGhlIHJldHVybmVkIHZhbHVlIGlzIHplcm8gd2hlbiB0aGUgcmVzdWx0IGlzIGV4YWN0LCBwb3NpdGl2ZSB3aGVuIGl0IGlzCmdyZWF0ZXIgdGhhbiB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgQHZhcntvcH0sIGFuZCBuZWdhdGl2ZSB3aGVuIGl0IGlzIHNtYWxsZXIuCk1vcmUgcHJlY2lzZWx5LCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgMCB3aGVuIEB2YXJ7b3B9IGlzIGFuIGludGVnZXIKcmVwcmVzZW50YWJsZSBpbiBAdmFye3JvcH0sIDEgb3IgQG1pbnVze30xIHdoZW4gQHZhcntvcH0gaXMgYW4gaW50ZWdlcgp0aGF0IGlzIG5vdCByZXByZXNlbnRhYmxlIGluIEB2YXJ7cm9wfSwgMiBvciBAbWludXN7fTIgd2hlbiBAdmFye29wfSBpcwpub3QgYW4gaW50ZWdlci4KCk5vdGUgdGhhdCBAY29kZXttcGZyX3JvdW5kfSBpcyBkaWZmZXJlbnQgZnJvbSBAY29kZXttcGZyX3JpbnR9IGNhbGxlZCB3aXRoCnRoZSByb3VuZGluZyB0byBuZWFyZXN0IG1vZGUgKHdoZXJlIGhhbGZ3YXkgY2FzZXMgYXJlIHJvdW5kZWQgdG8gYW4gZXZlbgppbnRlZ2VyIG9yIHNpZ25pZmljYW5kKS4gTm90ZSBhbHNvIHRoYXQgbm8gZG91YmxlIHJvdW5kaW5nIGlzIHBlcmZvcm1lZDsgZm9yCmluc3RhbmNlLCA0LjUgKDEwMC4xIGluIGJpbmFyeSkgaXMgcm91bmRlZCBieSBAY29kZXttcGZyX3JvdW5kfSB0byA0ICgxMDAKaW4gYmluYXJ5KSBpbiAyLWJpdCBwcmVjaXNpb24sIHRob3VnaCBAY29kZXtyb3VuZCg0LjUpfSBpcyBlcXVhbCB0byA1IGFuZAo1ICgxMDEgaW4gYmluYXJ5KSBpcyByb3VuZGVkIHRvIDYgKDExMCBpbiBiaW5hcnkpIGluIDItYml0IHByZWNpc2lvbi4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9yaW50X2NlaWwgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfcmludF9mbG9vciAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9yaW50X3JvdW5kIChtcGZyX3QgQHZhcntyb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3JpbnRfdHJ1bmMgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgQHZhcntyb3B9IHRvIEB2YXJ7b3B9IHJvdW5kZWQgdG8gYW4gaW50ZWdlci4KQGNvZGV7bXBmcl9yaW50X2NlaWx9IHJvdW5kcyB0byB0aGUgbmV4dCBoaWdoZXIgb3IgZXF1YWwgaW50ZWdlciwKQGNvZGV7bXBmcl9yaW50X2Zsb29yfSB0byB0aGUgbmV4dCBsb3dlciBvciBlcXVhbCBpbnRlZ2VyLApAY29kZXttcGZyX3JpbnRfcm91bmR9IHRvIHRoZSBuZWFyZXN0IGludGVnZXIsIHJvdW5kaW5nIGhhbGZ3YXkgY2FzZXMgYXdheQpmcm9tIHplcm8sIGFuZCBAY29kZXttcGZyX3JpbnRfdHJ1bmN9IHRvIHRoZSBuZXh0IGludGVnZXIgdG93YXJkIHplcm8uCklmIHRoZSByZXN1bHQgaXMgbm90IHJlcHJlc2VudGFibGUsIGl0IGlzIHJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0uClRoZSByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgdGVybmFyeSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnNpZGVyZWQKcm91bmQtdG8taW50ZWdlciBmdW5jdGlvbiAocmVnYXJkZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGFueSBvdGhlcgptYXRoZW1hdGljYWwgZnVuY3Rpb24pLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2ZyYWMgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wfSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgQHZhcntyb3B9IHRvIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgQHZhcntvcH0sIGhhdmluZyB0aGUgc2FtZSBzaWduIGFzCkB2YXJ7b3B9LCByb3VuZGVkIGluIHRoZSBkaXJlY3Rpb24gQHZhcntybmR9ICh1bmxpa2UgaW4gQGNvZGV7bXBmcl9yaW50fSwKQHZhcntybmR9IGFmZmVjdHMgb25seSBob3cgdGhlIGV4YWN0IGZyYWN0aW9uYWwgcGFydCBpcyByb3VuZGVkLCBub3QgaG93CnRoZSBmcmFjdGlvbmFsIHBhcnQgaXMgZ2VuZXJhdGVkKS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9tb2RmIChtcGZyX3QgQHZhcntpb3B9LCBtcGZyX3QgQHZhcntmb3B9LCBtcGZyX3QgQHZhcntvcH0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IHNpbXVsdGFuZW91c2x5IEB2YXJ7aW9wfSB0byB0aGUgaW50ZWdyYWwgcGFydCBvZiBAdmFye29wfSBhbmQgQHZhcntmb3B9IHRvCnRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgQHZhcntvcH0sIHJvdW5kZWQgaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZH0gd2l0aCB0aGUKY29ycmVzcG9uZGluZyBwcmVjaXNpb24gb2YgQHZhcntpb3B9IGFuZCBAdmFye2ZvcH0gKGVxdWl2YWxlbnQgdG8KQGNvZGV7bXBmcl90cnVuYyhAdmFye2lvcH0sIEB2YXJ7b3B9LCBAdmFye3JuZH0pfSBhbmQKQGNvZGV7bXBmcl9mcmFjKEB2YXJ7Zm9wfSwgQHZhcntvcH0sIEB2YXJ7cm5kfSl9KS4gVGhlIHZhcmlhYmxlcyBAdmFye2lvcH0gYW5kCkB2YXJ7Zm9wfSBtdXN0IGJlIGRpZmZlcmVudC4gUmV0dXJuIDAgaWZmIGJvdGggcmVzdWx0cyBhcmUgZXhhY3QuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfZm1vZCAobXBmcl90IEB2YXJ7cn0sIG1wZnJfdCBAdmFye3h9LCBtcGZyX3QgQHZhcnt5fSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfcmVtYWluZGVyIChtcGZyX3QgQHZhcntyfSwgbXBmcl90IEB2YXJ7eH0sIG1wZnJfdCBAdmFye3l9LCBtcF9ybmRfdCBAdmFye3JuZH0pCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9yZW1xdW8gKG1wZnJfdCBAdmFye3J9LCBsb25nKiBAdmFye3F9LCBtcGZyX3QgQHZhcnt4fSwgbXBmcl90IEB2YXJ7eX0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cn0gdG8gdGhlIHZhbHVlIG9mIEBtYXRoe3ggLSBuIHl9LCByb3VuZGVkIGFjY29yZGluZyB0byB0aGUgZGlyZWN0aW9uCkB2YXJ7cm5kfSwgd2hlcmUgQG1hdGh7bn0gaXMgdGhlIGludGVnZXIgcXVvdGllbnQgb2YgQHZhcnt4fSBkaXZpZGVkCmJ5IEB2YXJ7eX0sIGRlZmluZWQgYXMgZm9sbG93czogQG1hdGh7bn0gaXMgcm91bmRlZCB0b3dhcmQgemVybyBmb3IKQGNvZGV7bXBmcl9mbW9kfSwgYW5kIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgKHRpZXMgcm91bmRlZCB0byBldmVuKQpmb3IgQGNvZGV7bXBmcl9yZW1haW5kZXJ9IGFuZCBAY29kZXttcGZyX3JlbXF1b30uCgpTcGVjaWFsIHZhbHVlcyBhcmUgaGFuZGxlZCBhcyBkZXNjcmliZWQgaW4gU2VjdGlvbiBGLjkuNy4xIG9mCnRoZSBJU08gQzk5IHN0YW5kYXJkOgpJZiBAdmFye3h9IGlzIGluZmluaXRlIG9yIEB2YXJ7eX0gaXMgemVybywgQHZhcntyfSBpcyBOYU4uCklmIEB2YXJ7eX0gaXMgaW5maW5pdGUgYW5kIEB2YXJ7eH0gaXMgZmluaXRlLCBAdmFye3J9IGlzIEB2YXJ7eH0gcm91bmRlZAp0byB0aGUgcHJlY2lzaW9uIG9mIEB2YXJ7cn0uCklmIEB2YXJ7cn0gaXMgemVybywgaXQgaGFzIHRoZSBzaWduIG9mIEB2YXJ7eH0uClRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHRlcm5hcnkgdmFsdWUgY29ycmVzcG9uZGluZyB0byBAdmFye3J9LgoKQWRkaXRpb25hbGx5LCBAY29kZXttcGZyX3JlbXF1b30gc3RvcmVzCnRoZSBsb3cgc2lnbmlmaWNhbnQgYml0cyBmcm9tIHRoZSBxdW90aWVudCBpbiBAdmFyeypxfQoobW9yZSBwcmVjaXNlbHkgdGhlIG51bWJlciBvZiBiaXRzIGluIGEgQGNvZGV7bG9uZ30gbWludXMgb25lKSwKd2l0aCB0aGUgc2lnbiBvZiBAdmFye3h9IGRpdmlkZWQgYnkgQHZhcnt5fQooZXhjZXB0IGlmIHRob3NlIGxvdyBiaXRzIGFyZSBhbGwgemVybywgaW4gd2hpY2ggY2FzZSB6ZXJvIGlzIHJldHVybmVkKS4KTm90ZSB0aGF0IEB2YXJ7eH0gbWF5IGJlIHNvIGxhcmdlIGluIG1hZ25pdHVkZSByZWxhdGl2ZSB0byBAdmFye3l9IHRoYXQgYW4KZXhhY3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIHF1b3RpZW50IGlzIG5vdCBwcmFjdGljYWwuCkBjb2Rle21wZnJfcmVtYWluZGVyfSBhbmQgQGNvZGV7bXBmcl9yZW1xdW99IGZ1bmN0aW9ucyBhcmUgdXNlZnVsIGZvciBhZGRpdGl2ZQphcmd1bWVudCByZWR1Y3Rpb24uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfaW50ZWdlcl9wIChtcGZyX3QgQHZhcntvcH0pClJldHVybiBub24temVybyBpZmYgQHZhcntvcH0gaXMgYW4gaW50ZWdlci4KQGVuZCBkZWZ0eXBlZnVuCgpAbm9kZSBSb3VuZGluZyBSZWxhdGVkIEZ1bmN0aW9ucywgTWlzY2VsbGFuZW91cyBGdW5jdGlvbnMsIEludGVnZXIgUmVsYXRlZCBGdW5jdGlvbnMsIE1QRlIgSW50ZXJmYWNlCkBjaW5kZXggUm91bmRpbmcgbW9kZSByZWxhdGVkIGZ1bmN0aW9ucwpAc2VjdGlvbiBSb3VuZGluZyBSZWxhdGVkIEZ1bmN0aW9ucwoKQGRlZnR5cGVmdW4gdm9pZCBtcGZyX3NldF9kZWZhdWx0X3JvdW5kaW5nX21vZGUgKG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IHRoZSBkZWZhdWx0IHJvdW5kaW5nIG1vZGUgdG8gQHZhcntybmR9LgpUaGUgZGVmYXVsdCByb3VuZGluZyBtb2RlIGlzIHRvIG5lYXJlc3QgaW5pdGlhbGx5LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIG1wX3JuZF90IG1wZnJfZ2V0X2RlZmF1bHRfcm91bmRpbmdfbW9kZSAodm9pZCkKR2V0IHRoZSBkZWZhdWx0IHJvdW5kaW5nIG1vZGUuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfcHJlY19yb3VuZCAobXBmcl90IEB2YXJ7eH0sIG1wX3ByZWNfdCBAdmFye3ByZWN9LCBtcF9ybmRfdCBAdmFye3JuZH0pClJvdW5kIEB2YXJ7eH0gYWNjb3JkaW5nIHRvIEB2YXJ7cm5kfSB3aXRoIHByZWNpc2lvbiBAdmFye3ByZWN9LCB3aGljaAptdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiBAY29kZXtNUEZSX1BSRUNfTUlOfSBhbmQgQGNvZGV7TVBGUl9QUkVDX01BWH0KKG90aGVyd2lzZSB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkKS4KSWYgQHZhcntwcmVjfSBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBwcmVjaXNpb24gb2YgQHZhcnt4fSwgdGhlbiBuZXcKc3BhY2UgaXMgYWxsb2NhdGVkIGZvciB0aGUgc2lnbmlmaWNhbmQsIGFuZCBpdCBpcyBmaWxsZWQgd2l0aCB6ZXJvcy4KT3RoZXJ3aXNlLCB0aGUgc2lnbmlmaWNhbmQgaXMgcm91bmRlZCB0byBwcmVjaXNpb24gQHZhcntwcmVjfSB3aXRoIHRoZSBnaXZlbgpkaXJlY3Rpb24uIEluIGJvdGggY2FzZXMsIHRoZSBwcmVjaXNpb24gb2YgQHZhcnt4fSBpcyBjaGFuZ2VkIHRvIEB2YXJ7cHJlY30uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfcm91bmRfcHJlYyAobXBmcl90IEB2YXJ7eH0sIG1wX3JuZF90IEB2YXJ7cm5kfSwgbXBfcHJlY190IEB2YXJ7cHJlY30pCltUaGlzIGZ1bmN0aW9uIGlzIG9ic29sZXRlLiBQbGVhc2UgdXNlIEBjb2Rle21wZnJfcHJlY19yb3VuZH0gaW5zdGVhZC5dCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfY2FuX3JvdW5kIChtcGZyX3QgQHZhcntifSwgbXBfZXhwX3QgQHZhcntlcnJ9LCBtcF9ybmRfdCBAdmFye3JuZDF9LCBtcF9ybmRfdCBAdmFye3JuZDJ9LCBtcF9wcmVjX3QgQHZhcntwcmVjfSkKQXNzdW1pbmcgQHZhcntifSBpcyBhbiBhcHByb3hpbWF0aW9uIG9mIGFuIHVua25vd24gbnVtYmVyCkB2YXJ7eH0gaW4gdGhlIGRpcmVjdGlvbiBAdmFye3JuZDF9IHdpdGggZXJyb3IgYXQgbW9zdCB0d28gdG8gdGhlIHBvd2VyCkUoYiktQHZhcntlcnJ9IHdoZXJlIEUoYikgaXMgdGhlIGV4cG9uZW50IG9mIEB2YXJ7Yn0sIHJldHVybiBhIG5vbi16ZXJvCnZhbHVlIGlmIG9uZSBpcyBhYmxlIHRvIHJvdW5kIGNvcnJlY3RseSBAdmFye3h9IHRvIHByZWNpc2lvbgpAdmFye3ByZWN9IHdpdGggdGhlIGRpcmVjdGlvbiBAdmFye3JuZDJ9LAphbmQgMCBvdGhlcndpc2UgKGluY2x1ZGluZyBmb3IgTmFOIGFuZCBJbmYpLgpUaGlzIGZ1bmN0aW9uIEBzdHJvbmd7ZG9lcyBub3QgbW9kaWZ5fSBpdHMgYXJndW1lbnRzLgoKTm90ZTogaWYgb25lIHdhbnRzIHRvIGFsc28gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHRlcm5hcnkgdmFsdWUgd2hlbiByb3VuZGluZwpAdmFye2J9IHRvIHByZWNpc2lvbiBAdmFye3ByZWN9LCBhIHVzZWZ1bCB0cmljayBpcyB0aGUgZm9sbG93aW5nOgpAdmVyYmF0aW0KICAgaWYgKG1wZnJfY2FuX3JvdW5kIChiLCBlcnIsIHJuZDEsIEdNUF9STkRaLCBwcmVjICsgKHJuZDIgPT0gR01QX1JORE4pKSkKICAgICAgLi4uCkBlbmQgdmVyYmF0aW0KSW5kZWVkLCBpZiBAdmFye3JuZDJ9IGlzIEBjb2Rle0dNUF9STkROfSwgdGhpcyB3aWxsIGNoZWNrIGlmIG9uZSBjYW4Kcm91bmQgdG8gQHZhcntwcmVjfSsxIGJpdHMgd2l0aCBhIGRpcmVjdGVkIHJvdW5kaW5nOgppZiBzbywgb25lIGNhbiBzdXJlbHkgcm91bmQgdG8gbmVhcmVzdCB0byBAdmFye3ByZWN9IGJpdHMsCmFuZCBpbiBhZGRpdGlvbiBvbmUgY2FuIGRldGVybWluZSB0aGUgY29ycmVjdCB0ZXJuYXJ5IHZhbHVlLCB3aGljaCB3b3VsZCBub3QKYmUgdGhlIGNhc2Ugd2hlbiBAdmFye2J9IGlzIG5lYXIgZnJvbSBhIHZhbHVlIGV4YWN0bHkgcmVwcmVzZW50YWJsZSBvbgpAdmFye3ByZWN9IGJpdHMuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4ge2NvbnN0IGNoYXIgKn0gbXBmcl9wcmludF9ybmRfbW9kZSAobXBfcm5kX3QgQHZhcntybmR9KQpSZXR1cm4gdGhlIGlucHV0IHN0cmluZyAoR01QX1JOREQsIEdNUF9STkRVLCBHTVBfUk5ETiwgR01QX1JORFopCmNvcnJlc3BvbmRpbmcgdG8gdGhlIHJvdW5kaW5nIG1vZGUgQHZhcntybmR9IG9yIGEgbnVsbCBwb2ludGVyIGlmCkB2YXJ7cm5kfSBpcyBhbiBpbnZhbGlkIHJvdW5kaW5nIG1vZGUuCkBlbmQgZGVmdHlwZWZ1bgoKQG5vZGUgTWlzY2VsbGFuZW91cyBGdW5jdGlvbnMsIEV4Y2VwdGlvbiBSZWxhdGVkIEZ1bmN0aW9ucywgUm91bmRpbmcgUmVsYXRlZCBGdW5jdGlvbnMsIE1QRlIgSW50ZXJmYWNlCkBjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cApAY2luZGV4IE1pc2NlbGxhbmVvdXMgZmxvYXQgZnVuY3Rpb25zCkBzZWN0aW9uIE1pc2NlbGxhbmVvdXMgRnVuY3Rpb25zCgpAZGVmdHlwZWZ1biB2b2lkIG1wZnJfbmV4dHRvd2FyZCAobXBmcl90IEB2YXJ7eH0sIG1wZnJfdCBAdmFye3l9KQpJZiBAdmFye3h9IG9yIEB2YXJ7eX0gaXMgTmFOLCBzZXQgQHZhcnt4fSB0byBOYU4uIE90aGVyd2lzZSwgaWYgQHZhcnt4fQppcyBkaWZmZXJlbnQgZnJvbSBAdmFye3l9LCByZXBsYWNlIEB2YXJ7eH0gYnkgdGhlIG5leHQgZmxvYXRpbmctcG9pbnQKbnVtYmVyICh3aXRoIHRoZSBwcmVjaXNpb24gb2YgQHZhcnt4fSBhbmQgdGhlIGN1cnJlbnQgZXhwb25lbnQgcmFuZ2UpCmluIHRoZSBkaXJlY3Rpb24gb2YgQHZhcnt5fSwgaWYgdGhlcmUgaXMgb25lCih0aGUgaW5maW5pdGUgdmFsdWVzIGFyZSBzZWVuIGFzIHRoZSBzbWFsbGVzdCBhbmQgbGFyZ2VzdCBmbG9hdGluZy1wb2ludApudW1iZXJzKS4gSWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBpdCBrZWVwcyB0aGUgc2FtZSBzaWduLiBObyB1bmRlcmZsb3cgb3IKb3ZlcmZsb3cgaXMgZ2VuZXJhdGVkLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIHZvaWQgbXBmcl9uZXh0YWJvdmUgKG1wZnJfdCBAdmFye3h9KQpFcXVpdmFsZW50IHRvIEBjb2Rle21wZnJfbmV4dHRvd2FyZH0gd2hlcmUgQHZhcnt5fSBpcyBwbHVzIGluZmluaXR5LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIHZvaWQgbXBmcl9uZXh0YmVsb3cgKG1wZnJfdCBAdmFye3h9KQpFcXVpdmFsZW50IHRvIEBjb2Rle21wZnJfbmV4dHRvd2FyZH0gd2hlcmUgQHZhcnt5fSBpcyBtaW51cyBpbmZpbml0eS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9taW4gKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIG1wZnJfdCBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IEB2YXJ7cm9wfSB0byB0aGUgbWluaW11bSBvZiBAdmFye29wMX0gYW5kIEB2YXJ7b3AyfS4gSWYgQHZhcntvcDF9CmFuZCBAdmFye29wMn0gYXJlIGJvdGggTmFOLCB0aGVuIEB2YXJ7cm9wfSBpcyBzZXQgdG8gTmFOLiBJZiBAdmFye29wMX0Kb3IgQHZhcntvcDJ9IGlzIE5hTiwgdGhlbiBAdmFye3JvcH0gaXMgc2V0IHRvIHRoZSBudW1lcmljIHZhbHVlLiBJZgpAdmFye29wMX0gYW5kIEB2YXJ7b3AyfSBhcmUgemVyb3Mgb2YgZGlmZmVyZW50IHNpZ25zLCB0aGVuIEB2YXJ7cm9wfQppcyBzZXQgdG8gQG1pbnVze30wLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX21heCAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3AxfSwgbXBmcl90IEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgQHZhcntyb3B9IHRvIHRoZSBtYXhpbXVtIG9mIEB2YXJ7b3AxfSBhbmQgQHZhcntvcDJ9LiBJZiBAdmFye29wMX0KYW5kIEB2YXJ7b3AyfSBhcmUgYm90aCBOYU4sIHRoZW4gQHZhcntyb3B9IGlzIHNldCB0byBOYU4uIElmIEB2YXJ7b3AxfQpvciBAdmFye29wMn0gaXMgTmFOLCB0aGVuIEB2YXJ7cm9wfSBpcyBzZXQgdG8gdGhlIG51bWVyaWMgdmFsdWUuIElmCkB2YXJ7b3AxfSBhbmQgQHZhcntvcDJ9IGFyZSB6ZXJvcyBvZiBkaWZmZXJlbnQgc2lnbnMsIHRoZW4gQHZhcntyb3B9CmlzIHNldCB0byArMC4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl91cmFuZG9tYiAobXBmcl90IEB2YXJ7cm9wfSwgZ21wX3JhbmRzdGF0ZV90IEB2YXJ7c3RhdGV9KQpHZW5lcmF0ZSBhIHVuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gZmxvYXQgaW4gdGhlIGludGVydmFsCkBtYXRoezAgQGxle30gQHZhcntyb3B9IDwgMX0uIE1vcmUgcHJlY2lzZWx5LCB0aGUgbnVtYmVyIGNhbiBiZSBzZWVuIGFzIGEKZmxvYXQgd2l0aCBhIHJhbmRvbSBub24tbm9ybWFsaXplZCBzaWduaWZpY2FuZCBhbmQgZXhwb25lbnQgMCwgd2hpY2ggaXMgdGhlbgpub3JtYWxpemVkICh0aHVzIGlmIEB2YXJ7ZX0gZGVub3RlcyB0aGUgZXhwb25lbnQgYWZ0ZXIgbm9ybWFsaXphdGlvbiwgdGhlbgp0aGUgbGVhc3QgQG1hdGh7LUB2YXJ7ZX19IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIHNpZ25pZmljYW5kIGFyZSBhbHdheXMgMCkuClJldHVybiAwLCB1bmxlc3MgdGhlIGV4cG9uZW50IGlzIG5vdCBpbiB0aGUgY3VycmVudCBleHBvbmVudCByYW5nZSwgaW4Kd2hpY2ggY2FzZSBAdmFye3JvcH0gaXMgc2V0IHRvIE5hTiBhbmQgYSBub24temVybyB2YWx1ZSBpcyByZXR1cm5lZCAodGhpcwpzaG91bGQgbmV2ZXIgaGFwcGVuIGluIHByYWN0aWNlLCBleGNlcHQgaW4gdmVyeSBzcGVjaWZpYyBjYXNlcykuIFRoZQpzZWNvbmQgYXJndW1lbnQgaXMgYSBAY29kZXtnbXBfcmFuZHN0YXRlX3R9IHN0cnVjdHVyZSB3aGljaCBzaG91bGQgYmUKY3JlYXRlZCB1c2luZyB0aGUgR01QIEBjb2Rle2dtcF9yYW5kaW5pdH0gZnVuY3Rpb24sIHNlZSB0aGUgR01QIG1hbnVhbC4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biB2b2lkIG1wZnJfcmFuZG9tIChtcGZyX3QgQHZhcntyb3B9KQpHZW5lcmF0ZSBhIHVuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gZmxvYXQgaW4gdGhlIGludGVydmFsCkBtYXRoezAgQGxle30gQHZhcntyb3B9IDwgMX0uCgpUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgc3VwcHJlc3NlZCBpbiB0aGUgbmV4dCByZWxlYXNlOwpAY29kZXttcGZyX3VyYW5kb21ifSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIHZvaWQgbXBmcl9yYW5kb20yIChtcGZyX3QgQHZhcntyb3B9LCBtcF9zaXplX3QgQHZhcntzaXplfSwgbXBfZXhwX3QgQHZhcntleHB9KQpHZW5lcmF0ZSBhIHJhbmRvbSBmbG9hdCBvZiBhdCBtb3N0IEB2YXJ7c2l6ZX0gbGltYnMsIHdpdGggbG9uZyBzdHJpbmdzIG9mCnplcm9zIGFuZCBvbmVzIGluIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24uIFRoZSBleHBvbmVudCBvZiB0aGUgbnVtYmVyIGlzIGluCnRoZSBpbnRlcnZhbCBAbWludXN7fUB2YXJ7ZXhwfSB0byBAdmFye2V4cH0uClRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIGZvcgp0ZXN0aW5nIGZ1bmN0aW9ucyBhbmQgYWxnb3JpdGhtcywgc2luY2UgdGhpcyBraW5kIG9mIHJhbmRvbSBudW1iZXJzIGhhdmUKcHJvdmVuIHRvIGJlIG1vcmUgbGlrZWx5IHRvIHRyaWdnZXIgY29ybmVyLWNhc2UgYnVncy4KTmVnYXRpdmUgcmFuZG9tIG51bWJlcnMgYXJlIGdlbmVyYXRlZCB3aGVuIEB2YXJ7c2l6ZX0gaXMgbmVnYXRpdmUuClB1dCArMCBpbiBAdmFye3JvcH0gd2hlbiBzaXplIGlmIHplcm8uIFRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgZGVmYXVsdApwc2V1ZG9yYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpcyBtb2RpZmllZCBieSBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiAodGhlCnNhbWUgb25lIGFzIEdNUCBpZiBNUEZSIHdhcyBidWlsdCB1c2luZyBAc2FtcHstLXdpdGgtZ21wLWJ1aWxkfSkuCgpUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgc3VwcHJlc3NlZCBpbiB0aGUgbmV4dCByZWxlYXNlLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIG1wX2V4cF90IG1wZnJfZ2V0X2V4cCAobXBmcl90IEB2YXJ7eH0pCkdldCB0aGUgZXhwb25lbnQgb2YgQHZhcnt4fSwgYXNzdW1pbmcgdGhhdCBAdmFye3h9IGlzIGEgbm9uLXplcm8gb3JkaW5hcnkKbnVtYmVyIGFuZCB0aGUgc2lnbmlmaWNhbmQgaXMgY2hvc2VuIGluIFsxLzIsMSkuIFRoZSBiZWhhdmlvciBmb3IgTmFOLAppbmZpbml0eSBvciB6ZXJvIGlzIHVuZGVmaW5lZC4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9zZXRfZXhwIChtcGZyX3QgQHZhcnt4fSwgbXBfZXhwX3QgQHZhcntlfSkKU2V0IHRoZSBleHBvbmVudCBvZiBAdmFye3h9IGlmIEB2YXJ7ZX0gaXMgaW4gdGhlIGN1cnJlbnQgZXhwb25lbnQgcmFuZ2UsCmFuZCByZXR1cm4gMCAoZXZlbiBpZiBAdmFye3h9IGlzIG5vdCBhIG5vbi16ZXJvIG9yZGluYXJ5IG51bWJlcik7Cm90aGVyd2lzZSwgcmV0dXJuIGEgbm9uLXplcm8gdmFsdWUuClRoZSBzaWduaWZpY2FuZCBpcyBhc3N1bWVkIHRvIGJlIGluIFsxLzIsMSkuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfc2lnbmJpdCAobXBmcl90IEB2YXJ7b3B9KQpSZXR1cm4gYSBub24temVybyB2YWx1ZSBpZmYgQHZhcntvcH0gaGFzIGl0cyBzaWduIGJpdCBzZXQgKGkuZS5AOiBpZiBpdCBpcwpuZWdhdGl2ZSwgQG1pbnVze30wLCBvciBhIE5hTiB3aG9zZSByZXByZXNlbnRhdGlvbiBoYXMgaXRzIHNpZ24gYml0IHNldCkuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfc2V0c2lnbiAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3B9LCBpbnQgQHZhcntzfSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZXQgdGhlIHZhbHVlIG9mIEB2YXJ7cm9wfSBmcm9tIEB2YXJ7b3B9LCByb3VuZGVkIHRvd2FyZCB0aGUgZ2l2ZW4KZGlyZWN0aW9uIEB2YXJ7cm5kfSwgdGhlbiBzZXQgKHJlc3AuQDogY2xlYXIpIGl0cyBzaWduIGJpdCBpZiBAdmFye3N9CmlzIG5vbi16ZXJvIChyZXNwLkA6IHplcm8pLCBldmVuIHdoZW4gQHZhcntvcH0gaXMgYSBOYU4uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfY29weXNpZ24gKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIG1wZnJfdCBAdmFye29wMn0sIG1wX3JuZF90IEB2YXJ7cm5kfSkKU2V0IHRoZSB2YWx1ZSBvZiBAdmFye3JvcH0gZnJvbSBAdmFye29wMX0sIHJvdW5kZWQgdG93YXJkIHRoZSBnaXZlbgpkaXJlY3Rpb24gQHZhcntybmR9LCB0aGVuIHNldCBpdHMgc2lnbiBiaXQgdG8gdGhhdCBvZiBAdmFye29wMn0gKGV2ZW4Kd2hlbiBAdmFye29wMX0gb3IgQHZhcntvcDJ9IGlzIGEgTmFOKS4gVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvCkBjb2Rle21wZnJfc2V0c2lnbiAoQHZhcntyb3B9LCBAdmFye29wMX0sIG1wZnJfc2lnbmJpdCAoQHZhcntvcDJ9KSwgQHZhcntybmR9KX0uCkBlbmQgZGVmdHlwZWZ1bgoKQGMgQnkgZGVmaW5pdGlvbiwgYSBDIHN0cmluZyBpcyBhbHdheXMgbnVsbC10ZXJtaW5hdGVkLCBzbyB0aGF0IHdlCkBjIGNvdWxkIGp1c3Qgc2F5ICJzdHJpbmciIG9yICJudWxsLXRlcm1pbmF0ZWQgY2hhcmFjdGVyIGFycmF5IiwKQGMgYnV0ICJudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIiBpcyBub3QgYW4gZXJyb3IgYW5kIHByb2JhYmx5IGJldHRlcgpAYyBmb3IgbW9zdCB1c2Vycy4KQGRlZnR5cGVmdW4ge2NvbnN0IGNoYXIgKn0gbXBmcl9nZXRfdmVyc2lvbiAodm9pZCkKUmV0dXJuIHRoZSBNUEZSIHZlcnNpb24sIGFzIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmbWFjIE1QRlJfVkVSU0lPTgpAZGVmbWFjeCBNUEZSX1ZFUlNJT05fTUFKT1IKQGRlZm1hY3ggTVBGUl9WRVJTSU9OX01JTk9SCkBkZWZtYWN4IE1QRlJfVkVSU0lPTl9QQVRDSExFVkVMCkBkZWZtYWN4IE1QRlJfVkVSU0lPTl9TVFJJTkcKQGNvZGV7TVBGUl9WRVJTSU9OfSBpcyB0aGUgdmVyc2lvbiBvZiBNUEZSIGFzIGEgcHJlcHJvY2Vzc2luZyBjb25zdGFudC4KQGNvZGV7TVBGUl9WRVJTSU9OX01BSk9SfSwgQGNvZGV7TVBGUl9WRVJTSU9OX01JTk9SfSBhbmQKQGNvZGV7TVBGUl9WRVJTSU9OX1BBVENITEVWRUx9IGFyZSByZXNwZWN0aXZlbHkgdGhlIG1ham9yLCBtaW5vciBhbmQgcGF0Y2gKbGV2ZWwgb2YgTVBGUiB2ZXJzaW9uLCBhcyBwcmVwcm9jZXNzaW5nIGNvbnN0YW50cy4KQGNvZGV7TVBGUl9WRVJTSU9OX1NUUklOR30gaXMgdGhlIHZlcnNpb24gKHdpdGggYW4gb3B0aW9uYWwgc3VmZml4LCB1c2VkCmluIGRldmVsb3BtZW50IGFuZCBwcmUtcmVsZWFzZSB2ZXJzaW9ucykgYXMgYSBzdHJpbmcgY29uc3RhbnQsIHdoaWNoIGNhbgpiZSBjb21wYXJlZCB0byB0aGUgcmVzdWx0IG9mIEBjb2Rle21wZnJfZ2V0X3ZlcnNpb259IHRvIGNoZWNrIGF0IHJ1biB0aW1lCnRoZSBoZWFkZXIgZmlsZSBhbmQgbGlicmFyeSB1c2VkIG1hdGNoOgpAZXhhbXBsZQppZiAoc3RyY21wIChtcGZyX2dldF92ZXJzaW9uICgpLCBNUEZSX1ZFUlNJT05fU1RSSU5HKSkKICBmcHJpbnRmIChzdGRlcnIsICJXYXJuaW5nOiBoZWFkZXIgYW5kIGxpYnJhcnkgZG8gbm90IG1hdGNoXG4iKTsKQGVuZCBleGFtcGxlCk5vdGU6IE9idGFpbmluZyBkaWZmZXJlbnQgc3RyaW5ncyBpcyBub3QgbmVjZXNzYXJpbHkgYW4gZXJyb3IsIGFzCmluIGdlbmVyYWwsIGEgcHJvZ3JhbSBjb21waWxlZCB3aXRoIHNvbWUgb2xkIE1QRlIgdmVyc2lvbiBjYW4gYmUKZHluYW1pY2FsbHkgbGlua2VkIHdpdGggYSBuZXdlciBNUEZSIGxpYnJhcnkgdmVyc2lvbiAoaWYgYWxsb3dlZApieSB0aGUgbGlicmFyeSB2ZXJzaW9uaW5nIHN5c3RlbSkuCkBlbmQgZGVmbWFjCgpAZGVmdHlwZWZuIE1hY3JvIGxvbmcgTVBGUl9WRVJTSU9OX05VTSAoQHZhcnttYWpvcn0sIEB2YXJ7bWlub3J9LCBAdmFye3BhdGNobGV2ZWx9KQpDcmVhdGUgYW4gaW50ZWdlciBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdXNlZCBieSBAY29kZXtNUEZSX1ZFUlNJT059IGZyb20gdGhlCmdpdmVuIEB2YXJ7bWFqb3J9LCBAdmFye21pbm9yfSBhbmQgQHZhcntwYXRjaGxldmVsfS4KSGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byBjaGVjayB0aGUgTVBGUiB2ZXJzaW9uIGF0IGNvbXBpbGUgdGltZToKQGV4YW1wbGUKI2lmICghZGVmaW5lZChNUEZSX1ZFUlNJT04pIHx8IChNUEZSX1ZFUlNJT048TVBGUl9WRVJTSU9OX05VTSgyLDEsMCkpKQojIGVycm9yICJXcm9uZyBNUEZSIHZlcnNpb24uIgojZW5kaWYKQGVuZCBleGFtcGxlCkBlbmQgZGVmdHlwZWZuCgpAZGVmdHlwZWZ1biB7Y29uc3QgY2hhciAqfSBtcGZyX2dldF9wYXRjaGVzICh2b2lkKQpSZXR1cm4gYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGlkcyBvZiB0aGUgcGF0Y2hlcyBhcHBsaWVkIHRvCnRoZSBNUEZSIGxpYnJhcnkgKGNvbnRlbnRzIG9mIHRoZSBAZmlsZXtQQVRDSEVTfSBmaWxlKSwgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KTm90ZTogSWYgdGhlIHByb2dyYW0gaGFzIGJlZW4gY29tcGlsZWQgd2l0aCBhbiBvbGRlciBNUEZSIHZlcnNpb24gYW5kIGlzCmR5bmFtaWNhbGx5IGxpbmtlZCB3aXRoIGEgbmV3IE1QRlIgbGlicmFyeSB2ZXJzaW9uLCB0aGUgaWRzIG9mIHRoZSBwYXRjaGVzCmFwcGxpZWQgdG8gdGhlIG9sZCAoY29tcGlsZS10aW1lKSBNUEZSIHZlcnNpb24gYXJlIG5vdCBhdmFpbGFibGUgKGhvd2V2ZXIKdGhpcyBpbmZvcm1hdGlvbiBzaG91bGQgbm90IGhhdmUgbXVjaCBpbnRlcmVzdCBpbiBnZW5lcmFsKS4KQGVuZCBkZWZ0eXBlZnVuCgpAbm9kZSBFeGNlcHRpb24gUmVsYXRlZCBGdW5jdGlvbnMsIENvbXBhdGliaWxpdHkgd2l0aCBNUEYsIE1pc2NlbGxhbmVvdXMgRnVuY3Rpb25zLCBNUEZSIEludGVyZmFjZQpAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKQGNpbmRleCBFeGNlcHRpb24gcmVsYXRlZCBmdW5jdGlvbnMKQHNlY3Rpb24gRXhjZXB0aW9uIFJlbGF0ZWQgRnVuY3Rpb25zCgpAZGVmdHlwZWZ1biBtcF9leHBfdCBtcGZyX2dldF9lbWluICh2b2lkKQpAZGVmdHlwZWZ1bnggbXBfZXhwX3QgbXBmcl9nZXRfZW1heCAodm9pZCkKUmV0dXJuIHRoZSAoY3VycmVudCkgc21hbGxlc3QgYW5kIGxhcmdlc3QgZXhwb25lbnRzIGFsbG93ZWQgZm9yIGEKZmxvYXRpbmctcG9pbnQgdmFyaWFibGUuIFRoZSBzbWFsbGVzdCBwb3NpdGl2ZSB2YWx1ZSBvZiBhIGZsb2F0aW5nLXBvaW50CnZhcmlhYmxlIGlzIEBtezEvMiBcdGltZXMgMl57XHJtIGVtaW59LCBvbmUgaGFsZiB0aW1lcyAyIHJhaXNlZCB0byB0aGUKc21hbGxlc3QgZXhwb25lbnR9IGFuZCB0aGUgbGFyZ2VzdCB2YWx1ZSBoYXMgdGhlIGZvcm0gQG17KDEgLSBcdmFyZXBzaWxvbikKXHRpbWVzIDJee1xybSBlbWF4fSwgKDEgLSBlcHNpbG9uKSB0aW1lcyAyIHJhaXNlZCB0byB0aGUgbGFyZ2VzdCBleHBvbmVudH0uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfc2V0X2VtaW4gKG1wX2V4cF90IEB2YXJ7ZXhwfSkKQGRlZnR5cGVmdW54IGludCBtcGZyX3NldF9lbWF4IChtcF9leHBfdCBAdmFye2V4cH0pClNldCB0aGUgc21hbGxlc3QgYW5kIGxhcmdlc3QgZXhwb25lbnRzIGFsbG93ZWQgZm9yIGEgZmxvYXRpbmctcG9pbnQgdmFyaWFibGUuClJldHVybiBhIG5vbi16ZXJvIHZhbHVlIHdoZW4gQHZhcntleHB9IGlzIG5vdCBpbiB0aGUgcmFuZ2UgYWNjZXB0ZWQgYnkgdGhlCmltcGxlbWVudGF0aW9uIChpbiB0aGF0IGNhc2UgdGhlIHNtYWxsZXN0IG9yIGxhcmdlc3QgZXhwb25lbnQgaXMgbm90IGNoYW5nZWQpLAphbmQgemVybyBvdGhlcndpc2UuCklmIHRoZSB1c2VyIGNoYW5nZXMgdGhlIGV4cG9uZW50IHJhbmdlLCBpdCBpcyBoZXIvaGlzIHJlc3BvbnNpYmlsaXR5IHRvIGNoZWNrCnRoYXQgYWxsIGN1cnJlbnQgZmxvYXRpbmctcG9pbnQgdmFyaWFibGVzIGFyZSBpbiB0aGUgbmV3IGFsbG93ZWQgcmFuZ2UKKGZvciBleGFtcGxlIHVzaW5nIEBjb2Rle21wZnJfY2hlY2tfcmFuZ2V9KSwgb3RoZXJ3aXNlIHRoZSBzdWJzZXF1ZW50CmJlaGF2aW9yIHdpbGwgYmUgdW5kZWZpbmVkLCBpbiB0aGUgc2Vuc2Ugb2YgdGhlIElTTyBDIHN0YW5kYXJkLgpAYyBJdCBpcyBhbHNvIGhlci9oaXMgcmVzcG9uc2liaWxpdHkgdG8gY2hlY2sgdGhhdCBAbSB7ZW1pbiA8PSBlbWF4fS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBtcF9leHBfdCBtcGZyX2dldF9lbWluX21pbiAodm9pZCkKQGRlZnR5cGVmdW54IG1wX2V4cF90IG1wZnJfZ2V0X2VtaW5fbWF4ICh2b2lkKQpAZGVmdHlwZWZ1bnggbXBfZXhwX3QgbXBmcl9nZXRfZW1heF9taW4gKHZvaWQpCkBkZWZ0eXBlZnVueCBtcF9leHBfdCBtcGZyX2dldF9lbWF4X21heCAodm9pZCkKUmV0dXJuIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG9mIHRoZSBzbWFsbGVzdCBhbmQgbGFyZ2VzdCBleHBvbmVudHMKYWxsb3dlZCBmb3IgQGNvZGV7bXBmcl9zZXRfZW1pbn0gYW5kIEBjb2Rle21wZnJfc2V0X2VtYXh9LiBUaGVzZSB2YWx1ZXMKYXJlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudDsgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGEgbm9uCnBvcnRhYmxlIHByb2dyYW0gYnkgd3JpdGluZyBAY29kZXttcGZyX3NldF9lbWF4KG1wZnJfZ2V0X2VtYXhfbWF4KCkpfQphbmQgQGNvZGV7bXBmcl9zZXRfZW1pbihtcGZyX2dldF9lbWluX21pbigpKX0gc2luY2UgdGhlIHZhbHVlcwpvZiB0aGUgc21hbGxlc3QgYW5kIGxhcmdlc3QgZXhwb25lbnRzIGJlY29tZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfY2hlY2tfcmFuZ2UgKG1wZnJfdCBAdmFye3h9LCBpbnQgQHZhcnt0fSwgbXBfcm5kX3QgQHZhcntybmR9KQpUaGlzIGZ1bmN0aW9uIGZvcmNlcyBAdmFye3h9IHRvIGJlIGluIHRoZSBjdXJyZW50IHJhbmdlIG9mIGFjY2VwdGFibGUKdmFsdWVzLCBAdmFye3R9IGJlaW5nIHRoZSBjdXJyZW50IHRlcm5hcnkgdmFsdWU6IG5lZ2F0aXZlIGlmIEB2YXJ7eH0KaXMgc21hbGxlciB0aGFuIHRoZSBleGFjdCB2YWx1ZSwgcG9zaXRpdmUgaWYgQHZhcnt4fSBpcyBsYXJnZXIgdGhhbgp0aGUgZXhhY3QgdmFsdWUgYW5kIHplcm8gaWYgQHZhcnt4fSBpcyBleGFjdCAoYmVmb3JlIHRoZSBjYWxsKS4gSXQKZ2VuZXJhdGVzIGFuIHVuZGVyZmxvdyBvciBhbiBvdmVyZmxvdyBpZiB0aGUgZXhwb25lbnQgb2YgQHZhcnt4fSBpcwpvdXRzaWRlIHRoZSBjdXJyZW50IGFsbG93ZWQgcmFuZ2U7IHRoZSB2YWx1ZSBvZiBAdmFye3R9IG1heSBiZSB1c2VkCnRvIGF2b2lkIGEgZG91YmxlIHJvdW5kaW5nLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBpZiB0aGUgcm91bmRlZApyZXN1bHQgaXMgZXF1YWwgdG8gdGhlIGV4YWN0IG9uZSwgYSBwb3NpdGl2ZSB2YWx1ZSBpZiB0aGUgcm91bmRlZApyZXN1bHQgaXMgbGFyZ2VyIHRoYW4gdGhlIGV4YWN0IG9uZSwgYSBuZWdhdGl2ZSB2YWx1ZSBpZiB0aGUgcm91bmRlZApyZXN1bHQgaXMgc21hbGxlciB0aGFuIHRoZSBleGFjdCBvbmUuIE5vdGUgdGhhdCB1bmxpa2UgbW9zdCBmdW5jdGlvbnMsCnRoZSByZXN1bHQgaXMgY29tcGFyZWQgdG8gdGhlIGV4YWN0IG9uZSwgbm90IHRoZSBpbnB1dCB2YWx1ZSBAdmFye3h9LAppLmUuQDogdGhlIHRlcm5hcnkgdmFsdWUgaXMgcHJvcGFnYXRlZC4KCk5vdGU6IElmIEB2YXJ7eH0gaXMgYW4gaW5maW5pdHkgYW5kIEB2YXJ7dH0gaXMgZGlmZmVyZW50IGZyb20gemVybyAoaS5lLiwKaWYgdGhlIHJvdW5kZWQgcmVzdWx0IGlzIGFuIGluZXhhY3QgaW5maW5pdHkpLCB0aGVuIHRoZSBvdmVyZmxvdyBmbGFnIGlzCnNldC4gVGhpcyBpcyB1c2VmdWwgYmVjYXVzZSBAY29kZXttcGZyX2NoZWNrX3JhbmdlfSBpcyB0eXBpY2FsbHkgY2FsbGVkCihhdCBsZWFzdCBpbiBNUEZSIGZ1bmN0aW9ucykgYWZ0ZXIgcmVzdG9yaW5nIHRoZSBmbGFncyB0aGF0IGNvdWxkIGhhdmUKYmVlbiBzZXQgZHVlIHRvIGludGVybmFsIGNvbXB1dGF0aW9ucy4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9zdWJub3JtYWxpemUgKG1wZnJfdCBAdmFye3h9LCBpbnQgQHZhcnt0fSwgbXBfcm5kX3QgQHZhcntybmR9KQpUaGlzIGZ1bmN0aW9uIHJvdW5kcyBAdmFye3h9IGVtdWxhdGluZyBzdWJub3JtYWwgbnVtYmVyIGFyaXRobWV0aWM6CmlmIEB2YXJ7eH0gaXMgb3V0c2lkZSB0aGUgc3Vibm9ybWFsIGV4cG9uZW50IHJhbmdlLCBpdCBqdXN0IHByb3BhZ2F0ZXMgdGhlCnRlcm5hcnkgdmFsdWUgQHZhcnt0fTsgb3RoZXJ3aXNlLCBpdCByb3VuZHMgQHZhcnt4fSB0byBwcmVjaXNpb24KQGNvZGV7RVhQKHgpLWVtaW4rMX0gYWNjb3JkaW5nIHRvIHJvdW5kaW5nIG1vZGUgQHZhcntybmR9IGFuZCBwcmV2aW91cwp0ZXJuYXJ5IHZhbHVlIEB2YXJ7dH0sIGF2b2lkaW5nIGRvdWJsZSByb3VuZGluZyBwcm9ibGVtcy4KTW9yZSBwcmVjaXNlbHkgaW4gdGhlIHN1Ym5vcm1hbCBkb21haW4sIGRlbm90aW5nIGJ5IEB2YXJ7ZX0gdGhlIHZhbHVlIG9mCkBjb2Rle2VtaW59LCBAdmFye3h9IGlzIHJvdW5kZWQgaW4gZml4ZWQtcG9pbnQKYXJpdGhtZXRpYyB0byBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIEBtezJee2UtMX0sIHR3byB0byB0aGUgcG93ZXIKQHZhcntlfUBtaW51c3t9MX07IGFzIGEgY29uc2VxdWVuY2UsIEBtezEuNSBcdGltZXMgMl57ZS0xfSwKMS41IG11bHRpcGxpZWQgYnkgdHdvIHRvIHRoZSBwb3dlciBAdmFye2V9QG1pbnVze30xfSB3aGVuIEB2YXJ7dH0gaXMgemVybwppcyByb3VuZGVkIHRvIEBtezJeZSwgdHdvIHRvIHRoZSBwb3dlciBAdmFye2V9fSB3aXRoIHJvdW5kaW5nIHRvIG5lYXJlc3QuCgpAY29kZXtQUkVDKHgpfSBpcyBub3QgbW9kaWZpZWQgYnkgdGhpcyBmdW5jdGlvbi4KQHZhcntybmR9IGFuZCBAdmFye3R9IG11c3QgYmUgdGhlIHVzZWQgcm91bmRpbmcgbW9kZSBmb3IgY29tcHV0aW5nIEB2YXJ7eH0KYW5kIHRoZSByZXR1cm5lZCB0ZXJuYXJ5IHZhbHVlIHdoZW4gY29tcHV0aW5nIEB2YXJ7eH0uClRoZSBzdWJub3JtYWwgZXhwb25lbnQgcmFuZ2UgaXMgZnJvbSBAY29kZXtlbWlufSB0byBAY29kZXtlbWluK1BSRUMoeCktMX0uCklmIHRoZSByZXN1bHQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIHRoZSBjdXJyZW50IGV4cG9uZW50IHJhbmdlCihkdWUgdG8gYSB0b28gc21hbGwgQGNvZGV7ZW1heH0pLCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgpOb3RlIHRoYXQgdW5saWtlIG1vc3QgZnVuY3Rpb25zLCB0aGUgcmVzdWx0IGlzIGNvbXBhcmVkIHRvIHRoZSBleGFjdCBvbmUsCm5vdCB0aGUgaW5wdXQgdmFsdWUgQHZhcnt4fSwgaS5lLkA6IHRoZSB0ZXJuYXJ5IHZhbHVlIGlzIHByb3BhZ2F0ZWQuClRoaXMgaXMgYSBwcmVsaW1pbmFyeSBpbnRlcmZhY2UuCkBlbmQgZGVmdHlwZWZ1bgoKVGhpcyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byBlbXVsYXRlIGRvdWJsZSBJRUVFLTc1NCBhcml0aG1ldGljCnVzaW5nIE1QRlI6CgpAZXhhbXBsZQpAewogIG1wZnJfdCB4YSwgeGI7CiAgaW50IGk7CiAgdm9sYXRpbGUgZG91YmxlIGEsIGI7CgogIG1wZnJfc2V0X2RlZmF1bHRfcHJlYyAoNTMpOwogIG1wZnJfc2V0X2VtaW4gKC0xMDczKTsKICBtcGZyX3NldF9lbWF4ICgxMDI0KTsKCiAgbXBmcl9pbml0ICh4YSk7IG1wZnJfaW5pdCAoeGIpOwoKICBiID0gMzQuMzsgbXBmcl9zZXRfZCAoeGIsIGIsIEdNUF9STkROKTsKICBhID0gMHgxLjEyMzVQLTEwMjE7IG1wZnJfc2V0X2QgKHhhLCBhLCBHTVBfUk5ETik7CgogIGEgLz0gYjsKICBpID0gbXBmcl9kaXYgKHhhLCB4YSwgeGIsIEdNUF9STkROKTsKICBpID0gbXBmcl9zdWJub3JtYWxpemUgKHhhLCBpLCBHTVBfUk5ETik7CgogIG1wZnJfY2xlYXIgKHhhKTsgbXBmcl9jbGVhciAoeGIpOwpAfQpAZW5kIGV4YW1wbGUKCldhcm5pbmc6IHRoaXMgZW11bGF0ZXMgYSBkb3VibGUgSUVFRS03NTQgYXJpdGhtZXRpYyB3aXRoIGNvcnJlY3Qgcm91bmRpbmcKaW4gdGhlIHN1Ym5vcm1hbCByYW5nZSwgd2hpY2ggbWF5IG5vdCBiZSB0aGUgY2FzZSBmb3IgeW91ciBoYXJkd2FyZS4KCkBkZWZ0eXBlZnVuIHZvaWQgbXBmcl9jbGVhcl91bmRlcmZsb3cgKHZvaWQpCkBkZWZ0eXBlZnVueCB2b2lkIG1wZnJfY2xlYXJfb3ZlcmZsb3cgKHZvaWQpCkBkZWZ0eXBlZnVueCB2b2lkIG1wZnJfY2xlYXJfbmFuZmxhZyAodm9pZCkKQGRlZnR5cGVmdW54IHZvaWQgbXBmcl9jbGVhcl9pbmV4ZmxhZyAodm9pZCkKQGRlZnR5cGVmdW54IHZvaWQgbXBmcl9jbGVhcl9lcmFuZ2VmbGFnICh2b2lkKQpDbGVhciB0aGUgdW5kZXJmbG93LCBvdmVyZmxvdywgaW52YWxpZCwgaW5leGFjdCBhbmQgQGVtcGh7ZXJhbmdlfSBmbGFncy4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biB2b2lkIG1wZnJfc2V0X3VuZGVyZmxvdyAodm9pZCkKQGRlZnR5cGVmdW54IHZvaWQgbXBmcl9zZXRfb3ZlcmZsb3cgKHZvaWQpCkBkZWZ0eXBlZnVueCB2b2lkIG1wZnJfc2V0X25hbmZsYWcgKHZvaWQpCkBkZWZ0eXBlZnVueCB2b2lkIG1wZnJfc2V0X2luZXhmbGFnICh2b2lkKQpAZGVmdHlwZWZ1bnggdm9pZCBtcGZyX3NldF9lcmFuZ2VmbGFnICh2b2lkKQpTZXQgdGhlIHVuZGVyZmxvdywgb3ZlcmZsb3csIGludmFsaWQsIGluZXhhY3QgYW5kIEBlbXBoe2VyYW5nZX0gZmxhZ3MuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gdm9pZCBtcGZyX2NsZWFyX2ZsYWdzICh2b2lkKQpDbGVhciBhbGwgZ2xvYmFsIGZsYWdzICh1bmRlcmZsb3csIG92ZXJmbG93LCBpbmV4YWN0LCBpbnZhbGlkLCBAZW1waHtlcmFuZ2V9KS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl91bmRlcmZsb3dfcCAodm9pZCkKQGRlZnR5cGVmdW54IGludCBtcGZyX292ZXJmbG93X3AgKHZvaWQpCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9uYW5mbGFnX3AgKHZvaWQpCkBkZWZ0eXBlZnVueCBpbnQgbXBmcl9pbmV4ZmxhZ19wICh2b2lkKQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfZXJhbmdlZmxhZ19wICh2b2lkKQpSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgKHVuZGVyZmxvdywgb3ZlcmZsb3csIGludmFsaWQsIGluZXhhY3QsIEBlbXBoe2VyYW5nZX0pCmZsYWcsIHdoaWNoIGlzIG5vbi16ZXJvIGlmZiB0aGUgZmxhZyBpcyBzZXQuCkBlbmQgZGVmdHlwZWZ1bgoKQG5vZGUgQ29tcGF0aWJpbGl0eSB3aXRoIE1QRiwgQ3VzdG9tIEludGVyZmFjZSwgRXhjZXB0aW9uIFJlbGF0ZWQgRnVuY3Rpb25zLCBNUEZSIEludGVyZmFjZQpAY2luZGV4IENvbXBhdGliaWxpdHkgd2l0aCBNUEYKQHNlY3Rpb24gQ29tcGF0aWJpbGl0eSBXaXRoIE1QRgoKQSBoZWFkZXIgZmlsZSBAZmlsZXttcGYybXBmci5ofSBpcyBpbmNsdWRlZCBpbiB0aGUgZGlzdHJpYnV0aW9uIG9mIE1QRlIgZm9yCmNvbXBhdGliaWxpdHkgd2l0aCB0aGUgR05VIE1QIGNsYXNzIE1QRi4KQWZ0ZXIgaW5zZXJ0aW5nIHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIGFmdGVyIHRoZSBAY29kZXsjaW5jbHVkZSA8Z21wLmg+fQpsaW5lLApAdmVyYmF0aW0KI2luY2x1ZGUgPG1wZnIuaD4KI2luY2x1ZGUgPG1wZjJtcGZyLmg+CkBlbmQgdmVyYmF0aW0KQG5vaW5kZW50CmFueSBwcm9ncmFtIHdyaXR0ZW4gZm9yCk1QRiBjYW4gYmUgY29tcGlsZWQgZGlyZWN0bHkgd2l0aCBNUEZSIHdpdGhvdXQgYW55IGNoYW5nZXMuCkFsbCBvcGVyYXRpb25zIGFyZSB0aGVuIHBlcmZvcm1lZCB3aXRoIHRoZSBkZWZhdWx0IE1QRlIgcm91bmRpbmcgbW9kZSwKd2hpY2ggY2FuIGJlIHJlc2V0IHdpdGggQGNvZGV7bXBmcl9zZXRfZGVmYXVsdF9yb3VuZGluZ19tb2RlfS4KCldhcm5pbmc6IHRoZSBAY29kZXttcGZfaW5pdH0gYW5kIEBjb2Rle21wZl9pbml0Mn0gZnVuY3Rpb25zIGluaXRpYWxpemUKdG8gemVybywgd2hlcmVhcyB0aGUgY29ycmVzcG9uZGluZyBNUEZSIGZ1bmN0aW9ucyBpbml0aWFsaXplIHRvIE5hTjoKdGhpcyBpcyB1c2VmdWwgdG8gZGV0ZWN0IHVuaW5pdGlhbGl6ZWQgdmFsdWVzLCBidXQgaXMgc2xpZ2h0bHkgaW5jb21wYXRpYmxlCndpdGggQGNvZGV7bXBmfS4KCkBkZWZ0eXBlZnVuIHZvaWQgbXBmcl9zZXRfcHJlY19yYXcgKG1wZnJfdCBAdmFye3h9LCBtcF9wcmVjX3QgQHZhcntwcmVjfSkKUmVzZXQgdGhlIHByZWNpc2lvbiBvZiBAdmFye3h9IHRvIGJlIEBzdHJvbmd7ZXhhY3RseX0gQHZhcntwcmVjfSBiaXRzLgpUaGUgb25seSBkaWZmZXJlbmNlIHdpdGggQGNvZGV7bXBmcl9zZXRfcHJlY30gaXMgdGhhdCBAdmFye3ByZWN9IGlzIGFzc3VtZWQgdG8KYmUgc21hbGwgZW5vdWdoIHNvIHRoYXQgdGhlIHNpZ25pZmljYW5kIGZpdHMgaW50byB0aGUgY3VycmVudCBhbGxvY2F0ZWQgbWVtb3J5CnNwYWNlIGZvciBAdmFye3h9LiBPdGhlcndpc2UgdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biBpbnQgbXBmcl9lcSAobXBmcl90IEB2YXJ7b3AxfSwgbXBmcl90IEB2YXJ7b3AyfSwgdW5zaWduZWQgbG9uZyBpbnQgQHZhcntvcDN9KQpSZXR1cm4gbm9uLXplcm8gaWYgQHZhcntvcDF9IGFuZCBAdmFye29wMn0gYXJlIGJvdGggbm9uLXplcm8gb3JkaW5hcnkKbnVtYmVycyB3aXRoIHRoZSBzYW1lIGV4cG9uZW50IGFuZCB0aGUgc2FtZSBmaXJzdCBAdmFye29wM30gYml0cywgYm90aAp6ZXJvLCBvciBib3RoIGluZmluaXRpZXMgb2YgdGhlIHNhbWUgc2lnbi4gUmV0dXJuIHplcm8gb3RoZXJ3aXNlLiBUaGlzCmZ1bmN0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBAY29kZXttcGZ9LiBEbyBub3QgdXNlIGl0IGlmCnlvdSB3YW50IHRvIGtub3cgd2hldGhlciB0d28gbnVtYmVycyBhcmUgY2xvc2UgdG8gZWFjaCBvdGhlcjsgZm9yIGluc3RhbmNlLAoxLjAxMTExMSBhbmQgMS4xMDAwMDAgYXJlIGN1cnJlbnRseSByZWdhcmRlZCBhcyBkaWZmZXJlbnQgZm9yIGFueSB2YWx1ZSBvZgpAdmFye29wM30gbGFyZ2VyIHRoYW4gMSAoYnV0IHRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgbmV4dCByZWxlYXNlKS4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biB2b2lkIG1wZnJfcmVsZGlmZiAobXBmcl90IEB2YXJ7cm9wfSwgbXBmcl90IEB2YXJ7b3AxfSwgbXBmcl90IEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpDb21wdXRlIHRoZSByZWxhdGl2ZSBkaWZmZXJlbmNlIGJldHdlZW4gQHZhcntvcDF9IGFuZCBAdmFye29wMn0KYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gQHZhcntyb3B9LgpUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGd1YXJhbnRlZSB0aGUgY29ycmVjdCByb3VuZGluZyBvbiB0aGUgcmVsYXRpdmUKZGlmZmVyZW5jZTsgaXQganVzdCBjb21wdXRlcyBAbWF0aHt8QHZhcntvcDF9LUB2YXJ7b3AyfXwvQHZhcntvcDF9fSwgdXNpbmcgdGhlCnJvdW5kaW5nIG1vZGUgQHZhcntybmR9IGZvciBhbGwgb3BlcmF0aW9ucyBhbmQgdGhlIHByZWNpc2lvbiBvZiBAdmFye3JvcH0uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gaW50IG1wZnJfbXVsXzJleHAgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIHVuc2lnbmVkIGxvbmcgaW50IEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpAZGVmdHlwZWZ1bnggaW50IG1wZnJfZGl2XzJleHAgKG1wZnJfdCBAdmFye3JvcH0sIG1wZnJfdCBAdmFye29wMX0sIHVuc2lnbmVkIGxvbmcgaW50IEB2YXJ7b3AyfSwgbXBfcm5kX3QgQHZhcntybmR9KQpTZWUgQGNvZGV7bXBmcl9tdWxfMnVpfSBhbmQgQGNvZGV7bXBmcl9kaXZfMnVpfS4gVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGtlcHQKZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBNUEYuCkBlbmQgZGVmdHlwZWZ1bgoKCkBub2RlIEN1c3RvbSBJbnRlcmZhY2UsIEludGVybmFscywgQ29tcGF0aWJpbGl0eSB3aXRoIE1QRiwgTVBGUiBJbnRlcmZhY2UKQGNpbmRleCBDdXN0b20gaW50ZXJmYWNlCkBzZWN0aW9uIEN1c3RvbSBJbnRlcmZhY2UKClNvbWUgYXBwbGljYXRpb25zIHVzZSBhIHN0YWNrIHRvIGhhbmRsZSB0aGUgbWVtb3J5IGFuZCB0aGVpciBvYmplY3RzLgpIb3dldmVyLCB0aGUgTVBGUiBtZW1vcnkgZGVzaWduIGlzIG5vdCB3ZWxsIHN1aXRlZCBmb3Igc3VjaCBhIHRoaW5nLiBTbyB0aGF0CnN1Y2ggYXBwbGljYXRpb25zIGFyZSBhYmxlIHRvIHVzZSBNUEZSLCBhbiBhdXhpbGlhcnkgbWVtb3J5IGludGVyZmFjZSBoYXMKYmVlbiBjcmVhdGVkOiB0aGUgQ3VzdG9tIEludGVyZmFjZS4KClRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlIGFsbG93cyB0aGVtIHRvIHVzZSBNUEZSIGluIHR3byB3YXlzOgpAaXRlbWl6ZQpAaXRlbSBFaXRoZXIgdGhleSBkaXJlY3RseSBzdG9yZSB0aGUgTVBGUiBGUCBudW1iZXIgYXMgYSBAY29kZXttcGZyX3R9Cm9uIHRoZSBzdGFjay4KQGl0ZW0gRWl0aGVyIHRoZXkgc3RvcmUgdGhlaXIgb3duIHJlcHJlc2VudGF0aW9uIG9mIGEgRlAgbnVtYmVyIG9uIHRoZQpzdGFjayBhbmQgY29uc3RydWN0IGEgbmV3IHRlbXBvcmFyeSBAY29kZXttcGZyX3R9IGVhY2ggdGltZSBpdCBpcyBuZWVkZWQuCkBlbmQgaXRlbWl6ZQpOb3RoaW5nIGhhcyB0byBiZSBkb25lIHRvIGRlc3Ryb3kgdGhlIEZQIG51bWJlcnMgZXhjZXB0IGdhcmJhZ2luZyB0aGUgdXNlZAptZW1vcnk6IGFsbCB0aGUgbWVtb3J5IHN0dWZmIChhbGxvY2F0aW5nLCBkZXN0cm95aW5nLCBnYXJiYWdpbmcpIGlzIGtlcHQgdG8KdGhlIGFwcGxpY2F0aW9uLgoKRWFjaCBmdW5jdGlvbiBpbiB0aGlzIGludGVyZmFjZSBpcyBhbHNvIGltcGxlbWVudGVkIGFzIGEgbWFjcm8gZm9yCmVmZmljaWVuY3kgcmVhc29uczogZm9yIGV4YW1wbGUgQGNvZGV7bXBmcl9jdXN0b21faW5pdCAocywgcCl9CnVzZXMgdGhlIG1hY3JvLCB3aGlsZSBAY29kZXsobXBmcl9jdXN0b21faW5pdCkgKHMsIHApfSB1c2VzIHRoZSBmdW5jdGlvbi4KCk5vdGUgMTogTVBGUiBmdW5jdGlvbnMgbWF5IHN0aWxsIGluaXRpYWxpemUgdGVtcG9yYXJ5IEZQIG51bWJlcnMKdXNpbmcgc3RhbmRhcmQgbXBmcl9pbml0LiBTZWUgQ3VzdG9tIEFsbG9jYXRpb24gKEdOVSBNUCkuCgpOb3RlIDI6IE1QRlIgZnVuY3Rpb25zIG1heSB1c2UgdGhlIGNhY2hlZCBmdW5jdGlvbnMgKG1wZnJfY29uc3RfcGkgZm9yCmV4YW1wbGUpLCBldmVuIGlmIHRoZXkgYXJlIG5vdCBleHBsaWNpdGx5IGNhbGxlZC4gWW91IGhhdmUgdG8gY2FsbApAY29kZXttcGZyX2ZyZWVfY2FjaGV9IGVhY2ggdGltZSB5b3UgZ2FyYmFnZSB0aGUgbWVtb3J5IGlmZiBtcGZyX2luaXQsIHRocm91Z2gKR01QIEN1c3RvbSBBbGxvY2F0aW9uLCBhbGxvY2F0ZXMgaXRzIG1lbW9yeSBvbiB0aGUgYXBwbGljYXRpb24gc3RhY2suCgpOb3RlIDM6IFRoaXMgaW50ZXJmYWNlIGlzIHByZWxpbWluYXJ5LgoKQGRlZnR5cGVmdW4gc2l6ZV90IG1wZnJfY3VzdG9tX2dldF9zaXplIChtcF9wcmVjX3QgQHZhcntwcmVjfSkKUmV0dXJuIHRoZSBuZWVkZWQgc2l6ZSBpbiBieXRlcyB0byBzdG9yZSB0aGUgc2lnbmlmaWNhbmQgb2YgYSBGUCBudW1iZXIKb2YgcHJlY2lzaW9uIEB2YXJ7cHJlY30uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gdm9pZCBtcGZyX2N1c3RvbV9pbml0ICh2b2lkICpAdmFye3NpZ25pZmljYW5kfSwgbXBfcHJlY190IEB2YXJ7cHJlY30pCkluaXRpYWxpemUgYSBzaWduaWZpY2FuZCBvZiBwcmVjaXNpb24gQHZhcntwcmVjfS4KQHZhcntzaWduaWZpY2FuZH0gbXVzdCBiZSBhbiBhcmVhIG9mIEBjb2Rle21wZnJfY3VzdG9tX2dldF9zaXplIChwcmVjKX0gYnl0ZXMKYXQgbGVhc3QgYW5kIGJlIHN1aXRhYmx5IGFsaWduZWQgZm9yIGFuIGFycmF5IG9mIEBjb2Rle21wX2xpbWJfdH0uCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4gdm9pZCBtcGZyX2N1c3RvbV9pbml0X3NldCAobXBmcl90IEB2YXJ7eH0sIGludCBAdmFye2tpbmR9LCBtcF9leHBfdCBAdmFye2V4cH0sIG1wX3ByZWNfdCBAdmFye3ByZWN9LCB2b2lkICpAdmFye3NpZ25pZmljYW5kfSkKUGVyZm9ybSBhIGR1bW15IGluaXRpYWxpemF0aW9uIG9mIGEgQGNvZGV7bXBmcl90fSBhbmQgc2V0IGl0IHRvOgpAaXRlbWl6ZQpAaXRlbSBpZiBAY29kZXtBQlMoa2luZCkgPT0gTVBGUl9OQU5fS0lORH0sIEB2YXJ7eH0gaXMgc2V0IHRvIE5hTjsKQGl0ZW0gaWYgQGNvZGV7QUJTKGtpbmQpID09IE1QRlJfSU5GX0tJTkR9LCBAdmFye3h9IGlzIHNldCB0byB0aGUgaW5maW5pdHkKb2Ygc2lnbiBAY29kZXtzaWduKGtpbmQpfTsKQGl0ZW0gaWYgQGNvZGV7QUJTKGtpbmQpID09IE1QRlJfWkVST19LSU5EfSwgQHZhcnt4fSBpcyBzZXQgdG8gdGhlIHplcm8gb2YKc2lnbiBAY29kZXtzaWduKGtpbmQpfTsKQGl0ZW0gaWYgQGNvZGV7QUJTKGtpbmQpID09IE1QRlJfUkVHVUxBUl9LSU5EfSwgQHZhcnt4fSBpcyBzZXQgdG8gYSByZWd1bGFyCm51bWJlcjogQGNvZGV7eCA9IHNpZ24oa2luZCkqc2lnbmlmaWNhbmQqMl5leHB9CkBlbmQgaXRlbWl6ZQpJbiBhbGwgY2FzZXMsIGl0IHVzZXMgQHZhcntzaWduaWZpY2FuZH0gZGlyZWN0bHkgZm9yIGZ1cnRoZXIgY29tcHV0aW5nCmludm9sdmluZyBAdmFye3h9LiBJdCB3aWxsIG5vdCBhbGxvY2F0ZSBhbnl0aGluZy4KQSBGUCBudW1iZXIgaW5pdGlhbGl6ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSByZXNpemVkIHVzaW5nCkBjb2Rle21wZnJfc2V0X3ByZWN9LCBvciBjbGVhcmVkIHVzaW5nIEBjb2Rle21wZnJfY2xlYXJ9IQpAdmFye3NpZ25pZmljYW5kfSBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCB3aXRoIEBjb2Rle21wZnJfY3VzdG9tX2luaXR9CnVzaW5nIHRoZSBzYW1lIHByZWNpc2lvbiBAdmFye3ByZWN9LgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIGludCBtcGZyX2N1c3RvbV9nZXRfa2luZCAobXBmcl90IEB2YXJ7eH0pClJldHVybiB0aGUgY3VycmVudCBraW5kIG9mIGEgQGNvZGV7bXBmcl90fSBhcyB1c2VkIGJ5CkBjb2Rle21wZnJfY3VzdG9tX2luaXRfc2V0fS4KVGhlIGJlaGF2aW9yIG9mIHRoaXMgZnVuY3Rpb24gZm9yIGFueSBAY29kZXttcGZyX3R9IG5vdCBpbml0aWFsaXplZAp3aXRoIEBjb2Rle21wZnJfY3VzdG9tX2luaXRfc2V0fSBpcyB1bmRlZmluZWQuCkBlbmQgZGVmdHlwZWZ1bgoKQGRlZnR5cGVmdW4ge3ZvaWQgKn0gbXBmcl9jdXN0b21fZ2V0X21hbnRpc3NhIChtcGZyX3QgQHZhcnt4fSkKUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc2lnbmlmaWNhbmQgdXNlZCBieSBhIEBjb2Rle21wZnJfdH0gaW5pdGlhbGl6ZWQgd2l0aApAY29kZXttcGZyX2N1c3RvbV9pbml0X3NldH0uClRoZSBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIGZvciBhbnkgQGNvZGV7bXBmcl90fSBub3QgaW5pdGlhbGl6ZWQKd2l0aCBAY29kZXttcGZyX2N1c3RvbV9pbml0X3NldH0gaXMgdW5kZWZpbmVkLgpAZW5kIGRlZnR5cGVmdW4KCkBkZWZ0eXBlZnVuIG1wX2V4cF90IG1wZnJfY3VzdG9tX2dldF9leHAgKG1wZnJfdCBAdmFye3h9KQpSZXR1cm4gdGhlIGV4cG9uZW50IG9mIEB2YXJ7eH0sIGFzc3VtaW5nIHRoYXQgQHZhcnt4fSBpcyBhIG5vbi16ZXJvIG9yZGluYXJ5Cm51bWJlci4gVGhlIHJldHVybiB2YWx1ZSBmb3IgTmFOLCBJbmZpbml0eSBvciBaZXJvIGlzIHVuc3BlY2lmaWVkIGJ1dCBkb2VzIG5vdApwcm9kdWNlIGFueSB0cmFwLgpUaGUgYmVoYXZpb3Igb2YgdGhpcyBmdW5jdGlvbiBmb3IgYW55IEBjb2Rle21wZnJfdH0gbm90IGluaXRpYWxpemVkCndpdGggQGNvZGV7bXBmcl9jdXN0b21faW5pdF9zZXR9IGlzIHVuZGVmaW5lZC4KQGVuZCBkZWZ0eXBlZnVuCgpAZGVmdHlwZWZ1biB2b2lkIG1wZnJfY3VzdG9tX21vdmUgKG1wZnJfdCBAdmFye3h9LCB2b2lkICpAdmFye25ld19wb3NpdGlvbn0pCkluZm9ybSBNUEZSIHRoYXQgdGhlIHNpZ25pZmljYW5kIGhhcyBtb3ZlZCBkdWUgdG8gYSBnYXJiYWdlIGNvbGxlY3QKYW5kIHVwZGF0ZSBpdHMgbmV3IHBvc2l0aW9uIHRvIEBjb2Rle25ld19wb3NpdGlvbn0uCkhvd2V2ZXIgdGhlIGFwcGxpY2F0aW9uIGhhcyB0byBtb3ZlIHRoZSBzaWduaWZpY2FuZCBhbmQgdGhlIEBjb2Rle21wZnJfdH0KaXRzZWxmLgpUaGUgYmVoYXZpb3Igb2YgdGhpcyBmdW5jdGlvbiBmb3IgYW55IEBjb2Rle21wZnJfdH0gbm90IGluaXRpYWxpemVkCndpdGggQGNvZGV7bXBmcl9jdXN0b21faW5pdF9zZXR9IGlzIHVuZGVmaW5lZC4KQGVuZCBkZWZ0eXBlZnVuCgpTZWUgdGhlIHRlc3Qgc3VpdGUgZm9yIGV4YW1wbGVzLgoKQG5vZGUgSW50ZXJuYWxzLCAgLCBDdXN0b20gSW50ZXJmYWNlLCBNUEZSIEludGVyZmFjZQpAY2luZGV4IEludGVybmFscwpAc2VjdGlvbiBJbnRlcm5hbHMKClRoZSBmb2xsb3dpbmcgdHlwZXMgYW5kCmZ1bmN0aW9ucyB3ZXJlIG1haW5seSBkZXNpZ25lZCBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9mIE1QRlIsCmJ1dCBtYXkgYmUgdXNlZnVsIGZvciB1c2VycyB0b28uCkhvd2V2ZXIgbm8gdXB3YXJkIGNvbXBhdGliaWxpdHkgaXMgZ3VhcmFudGVlZC4KWW91IG1heSBuZWVkIHRvIGluY2x1ZGUgQGZpbGV7bXBmci1pbXBsLmh9IHRvIHVzZSB0aGVtLgoKVGhlIEBjb2Rle21wZnJfdH0gdHlwZSBjb25zaXN0cyBvZiBmb3VyIGZpZWxkcy4KCkBpdGVtaXplIEBidWxsZXQKCkBpdGVtIFRoZSBAY29kZXtfbXBmcl9wcmVjfSBmaWVsZCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBwcmVjaXNpb24gb2YKdGhlIHZhcmlhYmxlIChpbiBiaXRzKTsgdGhpcyBpcyBub3QgbGVzcyB0aGFuIEBjb2Rle01QRlJfUFJFQ19NSU59LgoKQGl0ZW0gVGhlIEBjb2Rle19tcGZyX3NpZ259IGZpZWxkIGlzIHVzZWQgdG8gc3RvcmUgdGhlIHNpZ24gb2YgdGhlIHZhcmlhYmxlLgoKQGl0ZW0gVGhlIEBjb2Rle19tcGZyX2V4cH0gZmllbGQgc3RvcmVzIHRoZSBleHBvbmVudC4KQW4gZXhwb25lbnQgb2YgMCBtZWFucyBhIHJhZGl4IHBvaW50IGp1c3QgYWJvdmUgdGhlIG1vc3Qgc2lnbmlmaWNhbnQKbGltYi4gIE5vbi16ZXJvIHZhbHVlcyBAbWF0aHtufSBhcmUgYSBtdWx0aXBsaWVyIEBtYXRoezJebn0gcmVsYXRpdmUgdG8gdGhhdApwb2ludC4KQSBOYU4sIGFuIGluZmluaXR5IGFuZCBhIHplcm8gYXJlIGluZGljYXRlZCBieSBhIHNwZWNpYWwgdmFsdWUgb2YgdGhlIGV4cG9uZW50LgoKQGl0ZW0gRmluYWxseSwgdGhlIEBjb2Rle19tcGZyX2R9IGlzIGEgcG9pbnRlciB0byB0aGUgbGltYnMsIGxlYXN0CnNpZ25pZmljYW50IGxpbWJzIHN0b3JlZCBmaXJzdC4KVGhlIG51bWJlciBvZiBsaW1icyBpbiB1c2UgaXMgY29udHJvbGxlZCBieSBAY29kZXtfbXBmcl9wcmVjfSwgbmFtZWx5CmNlaWwoQGNvZGV7X21wZnJfcHJlY30vQGNvZGV7bXBfYml0c19wZXJfbGltYn0pLgpOb24tc2luZ3VsYXIgdmFsdWVzIGFsd2F5cyBoYXZlIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgbW9zdApzaWduaWZpY2FudCBsaW1iIHNldCB0byAxLiAgV2hlbiB0aGUgcHJlY2lzaW9uIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYQp3aG9sZSBudW1iZXIgb2YgbGltYnMsIHRoZSBleGNlc3MgYml0cyBhdCB0aGUgbG93IGVuZCBvZiB0aGUgZGF0YSBhcmUgemVyby4KCkBlbmQgaXRlbWl6ZQoKQGMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyBub3QgZG9jdW1lbnRlZCBhbnkgbW9yZSBhZnRlciBtcGZyLTIuMy4wCkBjIEBkZWZ0eXBlZnVuIGRvdWJsZSBtcGZyX2dldF9kMSAobXBmcl90IEB2YXJ7b3B9KQpAYyBDb252ZXJ0IEB2YXJ7b3B9IHRvIGEgQGNvZGV7ZG91YmxlfSwgdXNpbmcgdGhlIGRlZmF1bHQgTVBGUiByb3VuZGluZyBtb2RlCkBjIChzZWUgZnVuY3Rpb24gQGNvZGV7bXBmcl9zZXRfZGVmYXVsdF9yb3VuZGluZ19tb2RlfSkuIFRoaXMgZnVuY3Rpb24gaXMKQGMgb2Jzb2xldGUuCkBjIEBlbmQgZGVmdHlwZWZ1bgoKQG5vZGUgQ29udHJpYnV0b3JzLCBSZWZlcmVuY2VzLCBNUEZSIEludGVyZmFjZSwgVG9wCkBjb21tZW50ICBub2RlLW5hbWUsICBuZXh0LCAgcHJldmlvdXMsICB1cApAdW5udW1iZXJlZCBDb250cmlidXRvcnMKClRoZSBtYWluIGRldmVsb3BlcnMgb2YgTVBGUiBhcmUgR3VpbGxhdW1lIEhhbnJvdCwgVmluY2VudCBMZWZAYGV2cmUsClBhdHJpY2sgUEAnZWxpc3NpZXIsIFBoaWxpcHBlIFRoQCdldmVueSBhbmQgUGF1bCBaaW1tZXJtYW5uLgoKU3lsdmllIEJvbGRvIGZyb20gRU5TLUx5b24sIEZyYW5jZSwKY29udHJpYnV0ZWQgdGhlIGZ1bmN0aW9ucyBAY29kZXttcGZyX2FnbX0gYW5kIEBjb2Rle21wZnJfbG9nfS4KRW1tYW51ZWwgSmVhbmRlbCwgZnJvbSBFTlMtTHlvbiB0b28sCmNvbnRyaWJ1dGVkIHRoZSBnZW5lcmljIGh5cGVyZ2VvbWV0cmljIGNvZGUsCmFzIHdlbGwgYXMgdGhlIEBjb2Rle21wZnJfZXhwM30sCmEgZmlyc3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNpbmUgYW5kIGNvc2luZSwKYW5kIGltcHJvdmVkIHZlcnNpb25zIG9mCkBjb2Rle21wZnJfY29uc3RfbG9nMn0gYW5kIEBjb2Rle21wZnJfY29uc3RfcGl9LgpNYXRoaWV1IER1dG91ciBjb250cmlidXRlZCB0aGUgZnVuY3Rpb25zIEBjb2Rle21wZnJfYXRhbn0gYW5kIEBjb2Rle21wZnJfYXNpbn0sCmFuZCBhIHByZXZpb3VzIHZlcnNpb24gb2YgQGNvZGV7bXBmcl9nYW1tYX07CkRhdmlkIERhbmV5IGNvbnRyaWJ1dGVkIHRoZSBoeXBlcmJvbGljIGFuZCBpbnZlcnNlIGh5cGVyYm9saWMgZnVuY3Rpb25zLAp0aGUgYmFzZS0yIGV4cG9uZW50aWFsLCBhbmQgdGhlIGZhY3RvcmlhbCBmdW5jdGlvbi4gRmFicmljZSBSb3VpbGxpZXIKY29udHJpYnV0ZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgQGZpbGV7bXVsX3VpLmN9LCB0aGUgQGZpbGV7Z21wX29wLmN9CmZpbGUsIGFuZCBoZWxwZWQgdG8gdGhlIE1pY3Jvc29mdCBXaW5kb3dzIHBvcnRpbmcuCkplYW4tTHVjIFJAJ2VteSBjb250cmlidXRlZCB0aGUgQGNvZGV7bXBmcl96ZXRhfSBjb2RlLgpMdWRvdmljIE1ldW5pZXIgaGVscGVkIGluIHRoZSBkZXNpZ24gb2YgdGhlIEBjb2Rle21wZnJfZXJmfSBjb2RlLgpEYW1pZW4gU3RlaGxAJ2UgY29udHJpYnV0ZWQgdGhlIEBjb2Rle21wZnJfZ2V0X2xkXzJleHB9IGZ1bmN0aW9uLgoKV2Ugd291bGQgbGlrZSB0byB0aGFuayBKZWFuLU1pY2hlbCBNdWxsZXIgYW5kIEpvcmlzIHZhbiBkZXIgSG9ldmVuIGZvciB2ZXJ5CmZydWl0ZnVsIGRpc2N1c3Npb25zIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhhdCBwcm9qZWN0LCBUb3JiakAib3JuIEdyYW5sdW5kCmFuZCBLZXZpbiBSeWRlIGZvciB0aGVpciBoZWxwIGFib3V0IGRlc2lnbiBpc3N1ZXMsCmFuZCBOYXRoYWxpZSBSZXZvbCBmb3IgaGVyIGNhcmVmdWwgcmVhZGluZyBvZiBhIHByZXZpb3VzIHZlcnNpb24gb2YKdGhpcyBkb2N1bWVudGF0aW9uLgpLZXZpbiBSeWRlIGRpZCBhIHRyZW1lbmRvdXMgam9iIGZvciB0aGUgcG9ydGFiaWxpdHkgb2YgTVBGUiBpbiAyMDAyLTIwMDQuCgpUaGUgZGV2ZWxvcG1lbnQgb2YgdGhlIE1QRlIgbGlicmFyeSB3b3VsZCBub3QgaGF2ZSBiZWVuIHBvc3NpYmxlIHdpdGhvdXQKdGhlIGNvbnRpbnVvdXMgc3VwcG9ydCBvZiBJTlJJQSwgYW5kIG9mIHRoZSBMT1JJQSAoTmFuY3ksIEZyYW5jZSkgYW5kIExJUAooTHlvbiwgRnJhbmNlKSBsYWJvcmF0b3JpZXMuIEluIHBhcnRpY3VsYXIgdGhlIG1haW4gYXV0aG9ycyB3ZXJlIG9yIGFyZQptZW1iZXJzIG9mIHRoZSBQb2xLQSwgU3BhY2VzLCBDYWNhbyBwcm9qZWN0LXRlYW1zIGF0IExPUklBIGFuZCBvZiB0aGUKQXJlbmFpcmUgcHJvamVjdC10ZWFtIGF0IExJUC4KVGhpcyBwcm9qZWN0IHdhcyBzdGFydGVkIGR1cmluZyB0aGUgRmlhYmxlIChyZWxpYWJsZSBpbiBGcmVuY2gpIGFjdGlvbgpzdXBwb3J0ZWQgYnkgSU5SSUEsIGFuZCBjb250aW51ZWQgZHVyaW5nIHRoZSBBT0MgYWN0aW9uLgpUaGUgZGV2ZWxvcG1lbnQgb2YgTVBGUiB3YXMgYWxzbyBzdXBwb3J0ZWQgYnkgYSBncmFudAooMjAyRjA2NTkgMDAgTVBOIDEyMSkgZnJvbSB0aGUgQ29uc2VpbCBSQCdlZ2lvbmFsIGRlIExvcnJhaW5lIGluIDIwMDIsCmFuZCBmcm9tIElOUklBIGJ5IGFuICJhc3NvY2lhdGUgZW5naW5lZXIiIGdyYW50ICgyMDAzLTIwMDUpCmFuZCBhbiAib3BAJ2VyYXRpb24gZGUgZEAnZXZlbG9wcGVtZW50IGxvZ2ljaWVsIiBncmFudCAoMjAwNy0yMDA5KS4KCkBub2RlIFJlZmVyZW5jZXMsIEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSwgQ29udHJpYnV0b3JzLCBUb3AKQGNvbW1lbnQgIG5vZGUtbmFtZSwgIG5leHQsICBwcmV2aW91cywgIHVwCkB1bm51bWJlcmVkIFJlZmVyZW5jZXMKCkBpdGVtaXplIEBidWxsZXQKCkBpdGVtCkxhdXJlbnQgRm91c3NlLCBHdWlsbGF1bWUgSGFucm90LCBWaW5jZW50IExlZkBgZXZyZSwKUGF0cmljayBQQCdlbGlzc2llciBhbmQgUGF1bCBaaW1tZXJtYW5uLAoiTVBGUjogQSBNdWx0aXBsZS1QcmVjaXNpb24gQmluYXJ5IEZsb2F0aW5nLVBvaW50IExpYnJhcnkgV2l0aCBDb3JyZWN0IFJvdW5kaW5nIiwKQUNNIFRyYW5zYWN0aW9ucyBvbiBNYXRoZW1hdGljYWwgU29mdHdhcmUsCnZvbHVtZSAzMywgaXNzdWUgMiwgYXJ0aWNsZSAxMywgMTUgcGFnZXMsIDIwMDcsCkB1cmx7aHR0cDovL2RvaS5hY20ub3JnLzEwLjExNDUvMTIzNjQ2My4xMjM2NDY4fS4KCkBpdGVtClRvcmJqQCJvcm4gR3Jhbmx1bmQsICJHTlUgTVA6IFRoZSBHTlUgTXVsdGlwbGUgUHJlY2lzaW9uIEFyaXRobWV0aWMgTGlicmFyeSIsCiAgdmVyc2lvbiA0LjIuMiwgMjAwNywgQHVybHtodHRwOi8vZ21wbGliLm9yZ30uCgpAaXRlbQpJRUVFIHN0YW5kYXJkIGZvciBiaW5hcnkgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYywgVGVjaG5pY2FsIFJlcG9ydApBTlNJLUlFRUUgU3RhbmRhcmQgNzU0LTE5ODUsIE5ldyBZb3JrLCAxOTg1LgpBcHByb3ZlZCBNYXJjaCAyMSwgMTk4NTogSUVFRSBTdGFuZGFyZHMgQm9hcmQ7IGFwcHJvdmVkIEp1bHkgMjYsCiAgMTk4NTogQW1lcmljYW4gTmF0aW9uYWwgU3RhbmRhcmRzIEluc3RpdHV0ZSwgMTggcGFnZXMuCgpAaXRlbQpEb25hbGQgRS4gS251dGgsICJUaGUgQXJ0IG9mIENvbXB1dGVyIFByb2dyYW1taW5nIiwgdm9sIDIsCiJTZW1pbnVtZXJpY2FsIEFsZ29yaXRobXMiLCAybmQgZWRpdGlvbiwgQWRkaXNvbi1XZXNsZXksIDE5ODEuCgpAaXRlbQpKZWFuLU1pY2hlbCBNdWxsZXIsICJFbGVtZW50YXJ5IEZ1bmN0aW9ucywgQWxnb3JpdGhtcyBhbmQgSW1wbGVtZW50YXRpb24iLApCaXJraGF1c2VyLCBCb3N0b24sIDJuZCBlZGl0aW9uLCAyMDA2LgoKQGVuZCBpdGVtaXplCgoKQG5vZGUgR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlLCBDb25jZXB0IEluZGV4LCBSZWZlcmVuY2VzLCBUb3AKQGFwcGVuZGl4IEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZQpAY2luZGV4IEdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZQpAaW5jbHVkZSBmZGwudGV4aQoKCkBub2RlIENvbmNlcHQgSW5kZXgsIEZ1bmN0aW9uIEluZGV4LCBHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UsIFRvcApAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKQHVubnVtYmVyZWQgQ29uY2VwdCBJbmRleApAcHJpbnRpbmRleCBjcAoKQG5vZGUgRnVuY3Rpb24gSW5kZXgsICAsIENvbmNlcHQgSW5kZXgsIFRvcApAY29tbWVudCAgbm9kZS1uYW1lLCAgbmV4dCwgIHByZXZpb3VzLCAgdXAKQHVubnVtYmVyZWQgRnVuY3Rpb24gYW5kIFR5cGUgSW5kZXgKQHByaW50aW5kZXggZm4KCkBieWUKCkBjIExvY2FsIHZhcmlhYmxlczoKQGMgZmlsbC1jb2x1bW46IDc4CkBjIEVuZDoK