Name: series-workflowwdml5 Phase: Running StartedAt: 2026-07-06 20:09:17 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwdml5[0] Phase: Running StartedAt: 2026-07-06 20:09:17 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwdml5[0].run-triage Phase: Running StartedAt: 2026-07-06 20:09:17 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowwdml5[0].run-triage(0) Phase: Running StartedAt: 2026-07-06 20:09:17 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "87bfe634b1193db90e5170e1ddbad04a63ef4501", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MODULE_SIG" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "87bfe634b1193db90e5170e1ddbad04a63ef4501", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MODULE_SIG" ], "series_id": "10870cf2-e274-4b09-ab4a-2393ba42835f" }, "track": "KASAN", "fuzz": { "focus": [ "bpf" ], "focus_symbols": [ "bpf_prog_verify_signature", "process_fd_array_continuous", "process_fd_array", "fd_array_get_map_idx_continuous", "fd_array_get_map_idx_sparse", "fd_array_get_map_idx", "fd_array_get_btf_continuous", "fd_array_get_btf_sparse", "fd_array_get_btf", "add_fd_from_fd_array", "bpf_verify_pkcs7_signature" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjI0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Nm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01PRFVMRV9TSUcmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlJiMzNDssCiAgICAmIzM0O3Byb2Nlc3NfZmRfYXJyYXlfY29udGludW91cyYjMzQ7LAogICAgJiMzNDtwcm9jZXNzX2ZkX2FycmF5JiMzNDssCiAgICAmIzM0O2ZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXMmIzM0OywKICAgICYjMzQ7ZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlJiMzNDssCiAgICAmIzM0O2ZkX2FycmF5X2dldF9tYXBfaWR4JiMzNDssCiAgICAmIzM0O2ZkX2FycmF5X2dldF9idGZfY29udGludW91cyYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfYnRmX3NwYXJzZSYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfYnRmJiMzNDssCiAgICAmIzM0O2FkZF9mZF9mcm9tX2ZkX2FycmF5JiMzNDssCiAgICAmIzM0O2JwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIHByb2dyYW0gc2lnbmluZyB2ZXJpZmljYXRpb24gaW50byB0aGUga2VybmVsIHZlcmlmaWVyLiBJdCBtb2RpZmllcyB0aGUgYGJwZl9jaGVja2AgcGF0aCB0byB2ZXJpZnkgUEtDUyM3IHNpZ25hdHVyZXMgb2YgQlBGIHByb2dyYW1zIGFuZCB0aGVpciBtZXRhZGF0YSBtYXBzIHdoZW4gYGF0dHItXHUwMDNlc2lnbmF0dXJlYCBpcyBwcm92aWRlZC4gSXQgYWxzbyBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIGEgY29udGludW91cyBgZmRfYXJyYXlgIHZpYSBgZmRfYXJyYXlfY250YC4gVGhlc2UgYXJlIHJlYWNoYWJsZSBjb3JlIEJQRiB2ZXJpZmllciBjaGFuZ2VzIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNiAyMDoyNDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDllN2RlYjdkYWVkMDI5ZmNkOTIwMWU1NGJlZmY1ZjcyZTI2NWQ2MGJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEp1bCA2IDIwOjI0OjUwIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYnBmL2luZGV4LnJzdCBiL0RvY3VtZW50YXRpb24vYnBmL2luZGV4LnJzdFxuaW5kZXggMGQ1YzZmNjU5MjY2N2EuLjYzOGEwMGQ0MmJjMmExIDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9icGYvaW5kZXgucnN0XG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2JwZi9pbmRleC5yc3RcbkBAIC0yOCw2ICYjNDM7MjgsNyBAQCB0aGF0IGdvZXMgaW50byBncmVhdCB0ZWNobmljYWwgZGVwdGggYWJvdXQgdGhlIEJQRiBBcmNoaXRlY3R1cmUuXG4gICAgY2xhc3NpY192c19leHRlbmRlZC5yc3RcbiAgICBicGZfaXRlcmF0b3JzXG4gICAgYnBmX2xpY2Vuc2luZ1xuJiM0MzsgICBzaWduaW5nXG4gICAgdGVzdF9kZWJ1Z1xuICAgIGNsYW5nLW5vdGVzXG4gICAgbGludXgtbm90ZXNcbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdCBiL0RvY3VtZW50YXRpb24vYnBmL3NpZ25pbmcucnN0XG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjQ0NmI0ZWRiYWU2MjZjXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdFxuQEAgLTAsMCAmIzQzOzEsNDk2IEBAXG4mIzQzOy4uIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzO1xuJiM0Mzs9PT09PT09PT09PT1cbiYjNDM7QlBGIHNpZ25pbmdcbiYjNDM7PT09PT09PT09PT09XG4mIzQzO1xuJiM0MztUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgQlBGIHByb2dyYW1zIGFyZSBjcnlwdG9ncmFwaGljYWxseSBzaWduZWQsIGhvdyB0aGVcbiYjNDM7a2VybmVsIHZlcmlmaWVzIHRoZW0gYXQgbG9hZCB0aW1lLCBhbmQgaG93IExpbnV4IFNlY3VyaXR5IE1vZHVsZXMgKExTTXMpIC1cbiYjNDM7aW5jbHVkaW5nIHRoZSBCUEYgTFNNIC0gdXNlIHRoZSByZXN1bHRpbmcgdmVyZGljdCB0byBlbmZvcmNlIHBvbGljeS4gSXQgaXNcbiYjNDM7d3JpdHRlbiBmb3IgZGV2ZWxvcGVycyB3aG8gd2FudCB0byBwcm9kdWNlIHNpZ25lZCBCUEYgb2JqZWN0cywgdW5kZXJzdGFuZCB3aGF0XG4mIzQzO3RoZSBzaWduYXR1cmUgYWN0dWFsbHkgZ3VhcmFudGVlcywgb3IgYnVpbGQgYSBwb2xpY3kgb24gdG9wIG9mIGl0LlxuJiM0MztcbiYjNDM7TW90aXZhdGlvblxuJiM0Mzs9PT09PT09PT09XG4mIzQzO1xuJiM0MztBIHNpZ25lZCBCUEYgcHJvZ3JhbSBsZXRzIHRoZSBrZXJuZWwgZXN0YWJsaXNoIHRoYXQgdGhlIGJ5dGVjb2RlIGJlaW5nIGxvYWRlZFxuJiM0MztvcmlnaW5hdGVzIGZyb20gYSB0cnVzdGVkIHByb2R1Y2VyIGFuZCB3YXMgbm90IG1vZGlmaWVkIGluIHRyYW5zaXQuIE9uIGl0cyBvd25cbiYjNDM7dGhlIGtlcm5lbCBkb2VzIG5vdCAqcmVxdWlyZSogc2lnbmF0dXJlcyAtIGFuIHVuc2lnbmVkIHByb2dyYW0gbG9hZHMgZXhhY3RseSBhc1xuJiM0MztiZWZvcmUgLSBidXQgaXQgcmVjb3JkcyBhIHZlcmRpY3QgKHNlZSBgVGhlIHZlcmRpY3RgXykgdGhhdCBhbiBMU00gY2FuIGdhdGUgb24uXG4mIzQzO1RoaXMgaXMgdGhlIGJ1aWxkaW5nIGJsb2NrIGZvciBwb2xpY2llcyBzdWNoIGFzIFwmIzM0O29ubHkgcnVuIEJQRiB0aGF0IHdhcyBzaWduZWQgYnlcbiYjNDM7YSBrZXkgaW4gdGhlIHRydXN0ZWQga2V5cmluZ1wmIzM0OywgYXMgY291bGQgaW4gdGhlIGZ1dHVyZSBiZSBlbmZvcmNlZCBieSBhbiBMU01cbiYjNDM7c3VjaCBhcyBJUEUuXG4mIzQzO1xuJiM0MztTaWduaW5nIGlzIG9ydGhvZ29uYWwgdG8gdGhlIGV4aXN0aW5nIHBlcm1pc3Npb24gbW9kZWw6IGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlXG4mIzQzO2NhcGFiaWxpdHkgY2hlY2tzIG9yIHRoZSB2ZXJpZmllci4gQSBzaWduZWQgbG9hZCBzdGlsbCByZXF1aXJlcyB0aGUgdXN1YWxcbiYjNDM7cHJpdmlsZWdlcyAoYGBDQVBfQlBGYGAgYW5kIGFueSBwcm9ncmFtLXR5cGUtc3BlY2lmaWMgY2FwYWJpbGl0eSwgc3ViamVjdCB0b1xuJiM0MztgYGtlcm5lbC51bnByaXZpbGVnZWRfYnBmX2Rpc2FibGVkYGApLCBhbmQgdGhlIGxvYWRlciYjMzk7cyBpbnN0cnVjdGlvbnMgYXJlIHN0aWxsXG4mIzQzO2NoZWNrZWQgYnkgdGhlIHZlcmlmaWVyIGxpa2UgYW55IG90aGVyIHByb2dyYW0uIEEgdmFsaWQgc2lnbmF0dXJlIGVzdGFibGlzaGVzXG4mIzQzOypvcmlnaW4gYW5kIGludGVncml0eSosIG5vdCBzYWZldHkgLSBpdCBsZXRzIGEgcG9saWN5IHRydXN0IHdoZXJlIHRoZSBieXRlY29kZVxuJiM0MztjYW1lIGZyb20sIGl0IGRvZXMgbm90IGxldCBhIGxvYWQgc2tpcCBhbnkgY2hlY2sgaXQgd291bGQgb3RoZXJ3aXNlIGZhY2UuXG4mIzQzO1xuJiM0MztUaGUgaGFyZCBwYXJ0IGlzICp3aGF0KiBnZXRzIHNpZ25lZC4gQSBuYWl2ZSBzY2hlbWUgd291bGQgc2lnbiBhIHByb2dyYW0mIzM5O3NcbiYjNDM7aW5zdHJ1Y3Rpb24gYnVmZmVyIGF0IGJ1aWxkIHRpbWUgYW5kIHZlcmlmeSB0aGF0IHNpZ25hdHVyZSBhdFxuJiM0MztgYEJQRl9QUk9HX0xPQURgYC4gVGhhdCBkb2VzIG5vdCBzdXJ2aXZlIGNvbnRhY3Qgd2l0aCByZWFsIEJQRiBvYmplY3RzLCBiZWNhdXNlXG4mIzQzO3RoZSBieXRlcyB0aGUga2VybmVsIGZpbmFsbHkgbG9hZHMgYXJlIG5vdCB0aGUgYnl0ZXMgdGhlIGRldmVsb3BlciBidWlsdCBhbmRcbiYjNDM7c2lnbmVkLiBCZXR3ZWVuIHRoZSB0d28sIGxpYmJwZiBhbmQgdGhlIGtlcm5lbCByZXdyaXRlIHRoZSBwcm9ncmFtOlxuJiM0MztcbiYjNDM7LSAqKm1hcCBmaWxlIGRlc2NyaXB0b3JzKiogYXJlIHBhdGNoZWQgaW50byBgYGxkX2ltbTY0YGAgaW5zdHJ1Y3Rpb25zXG4mIzQzOyAgKGBgQlBGX1BTRVVET19NQVBfRkRgYCksIGFuZCBhIG1hcCYjMzk7cyBmZCBpcyBhc3NpZ25lZCBhdCBsb2FkIHRpbWUsIHNvIGl0XG4mIzQzOyAgZGlmZmVycyBvbiBldmVyeSBydW47XG4mIzQzOy0gKipDTy1SRSByZWxvY2F0aW9ucyoqIHJld3JpdGUgZmllbGQgb2Zmc2V0cywgc2l6ZXMgYW5kIGV4aXN0ZW5jZSBmbGFncyBhZ2FpbnN0XG4mIzQzOyAgdGhlICpydW5uaW5nKiBrZXJuZWwmIzM5O3MgQlRGLCBzbyB0aGUgcmVzdWx0IGRpZmZlcnMgZnJvbSBvbmUga2VybmVsIHRvIHRoZSBuZXh0O1xuJiM0MzstICoqa2Z1bmMgYW5kIGtzeW0gcmVmZXJlbmNlcyoqIGFyZSByZXNvbHZlZCB0byBpZHMvYWRkcmVzc2VzIGluIHRoZSBydW5uaW5nXG4mIzQzOyAga2VybmVsO1xuJiM0MzstICoqZ2xvYmFsIGRhdGEqKiAoYGAucm9kYXRhYGAvYGAuZGF0YWBgL2BgLmJzc2BgKSBpcyBjcmVhdGVkIGFuZCBzZWVkZWQgYXMgbWFwc1xuJiM0MzsgIGF0IGxvYWQuXG4mIzQzO1xuJiM0MztTbyBhIHNpZ25hdHVyZSBvdmVyIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbnMgY2Fubm90IG1hdGNoIHRoZSByZWxvY2F0ZWRcbiYjNDM7aW5zdHJ1Y3Rpb25zIHRoZSB2ZXJpZmllciBlbmRzIHVwIGNoZWNraW5nLCBhbmQgdGhlIHJlbG9jYXRlZCBmb3JtIGNhbm5vdCBiZVxuJiM0Mztwcm9kdWNlZCBhaGVhZCBvZiB0aW1lIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgdGFyZ2V0IGtlcm5lbC4gVGhlcmUgaXMgbm9cbiYjNDM7Zml4ZWQgYnl0ZSBzdHJpbmcgdGhhdCBpcyBib3RoIHNpZ25hYmxlIGF0IGJ1aWxkIHRpbWUgYW5kIHdoYXQgdGhlIGtlcm5lbFxuJiM0MzthY3R1YWxseSBsb2FkcyAtIHdoaWNoIGlzIHdoeSBhIHByb2dyYW0gY2Fubm90IHNpbXBseSBiZSBzaWduZWQgYW5kIGxvYWRlZFxuJiM0MztkaXJlY3RseS5cbiYjNDM7XG4mIzQzO1RoZSB0cnVzdGVkIGxvYWRlclxuJiM0Mzs9PT09PT09PT09PT09PT09PT1cbiYjNDM7XG4mIzQzO1RoZSBzb2x1dGlvbiBpcyB0byBtb3ZlIHRoYXQgc2V0dXAgd29yayAqaW50byogYSBzbWFsbCBCUEYgcHJvZ3JhbSAtIHRoZVxuJiM0MzsqKmxvYWRlcioqIC0gYW5kIHNpZ24gdGhlIGxvYWRlciBpbnN0ZWFkIG9mIHRoZSBpbmRpdmlkdWFsIHByb2dyYW1zLiBsaWJicGYmIzM5O3NcbiYjNDM7YGBnZW5fbG9hZGVyYGAgbWFjaGluZXJ5IChgYGJwZnRvb2wgZ2VuIHNrZWxldG9uIC1MYGAsIHRoZSBcJiMzNDtsaWdodCBza2VsZXRvblwmIzM0OylcbiYjNDM7ZW1pdHMgYSBgYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGBgIHByb2dyYW0gd2hvc2UgYm9keSBwZXJmb3JtcyB0aGUgYnBmKCkgc3lzY2FsbHNcbiYjNDM7dGhhdCBjcmVhdGUgbWFwcywgYXBwbHkgcmVsb2NhdGlvbnMsIGFuZCBsb2FkIHRoZSByZWFsIHByb2dyYW1zLiBUaGUgcGF5bG9hZCBpdFxuJiM0MztpbnN0YWxscyAtIHRoZSBzZXJpYWxpemVkIHByb2dyYW1zLCBtYXAgZGVzY3JpcHRpb25zLCByZWxvY2F0aW9uIGRhdGEgYW5kXG4mIzQzO2luaXRpYWwgdmFsdWVzIC0gbGl2ZXMgaW4gYSBzZXBhcmF0ZSBhcnJheSBtYXAsIHRoZSAqKm1ldGFkYXRhIG1hcCoqXG4mIzQzOyhgYF9fbG9hZGVyLm1hcGBgKS5cbiYjNDM7XG4mIzQzO1NvIHRoZSB1bml0IG9mIHRydXN0IGlzIHRoZSBsb2FkZXIsIGFuZCB0aGUgc2lnbmluZyBjb250cmFjdCBpczo6XG4mIzQzO1xuJiM0MzsgICAgU2lnKElfbG9hZGVyIHx8IERfbWV0YSlcbiYjNDM7XG4mIzQzO3doZXJlIGBgSV9sb2FkZXJgYCBpcyB0aGUgbG9hZGVyJiMzOTtzIGluc3RydWN0aW9uIHN0cmVhbSBhbmQgYGBEX21ldGFgYCBpcyB0aGVcbiYjNDM7Y29udGVudCBvZiB0aGUgbWV0YWRhdGEgbWFwLiBWZXJpZnlpbmcgdGhlIGxvYWRlciYjMzk7cyBzaWduYXR1cmUgZXN0YWJsaXNoZXMgdGhhdFxuJiM0Mztib3RoIHRoZSBsb2FkZXIgKmFuZCogdGhlIHBheWxvYWQgaXQgaXMgYWJvdXQgdG8gaW5zdGFsbCBhcmUgYXV0aGVudGljLiBUaGVcbiYjNDM7bG9hZGVyIGlzIHJlcHJvZHVjaWJsZTogYGBnZW5fbG9hZGVyYGAgYnVpbGRzIGl0IGZyb20gcHJpbWl0aXZlcyBzbyB0aGUgc2FtZVxuJiM0MztvYmplY3QgeWllbGRzIHRoZSBzYW1lIGJ5dGVzIG9uIGFueSBidWlsZCBob3N0LlxuJiM0MztcbiYjNDM7V2h5IHRoZSBsb2FkZXIgaXMgc2lnbmFibGUgd2hlbiB0aGUgcHJvZ3JhbSBpcyBub3RcbiYjNDM7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiYjNDM7XG4mIzQzO1RoZSBsb2FkZXIgc2lkZXN0ZXBzIGV2ZXJ5IHJld3JpdGUgbGlzdGVkIGFib3ZlLCBiZWNhdXNlIHRoZSBieXRlcyB0aGF0IGFyZVxuJiM0MztzaWduZWQgYXJlICpyZWxvY2F0aW9uLWludmFyaWFudCo6XG4mIzQzO1xuJiM0MzstIFRoZSBsb2FkZXImIzM5O3Mgb3duIGluc3RydWN0aW9ucyBhcmUgYSBmaXhlZCBzZXF1ZW5jZSBvZiBicGYoKSBzeXNjYWxscyBlbWl0dGVkXG4mIzQzOyAgYnkgYGBnZW5fbG9hZGVyYGA7IHRoZXkgY2Fycnkgbm8gQ08tUkUgcmVsb2NhdGlvbnMgYW5kIHJlc29sdmUgbm8ga3N5bXMsIHNvXG4mIzQzOyAgdGhleSBhcmUgaWRlbnRpY2FsIG9uIGV2ZXJ5IGtlcm5lbC4gVGhlIG1ldGFkYXRhIG1hcCBpcyByZWZlcmVuY2VkIGJ5ICppbmRleCpcbiYjNDM7ICBpbnRvIGBgZmRfYXJyYXlgYCAoYGBCUEZfUFNFVURPX01BUF9JRFhfVkFMVUVgYCksIG5vdCBieSBhIGJha2VkLWluIGZpbGVcbiYjNDM7ICBkZXNjcmlwdG9yLCBzbyBldmVuIHRoYXQgcmVmZXJlbmNlIGRvZXMgbm90IGNoYW5nZSBiZXR3ZWVuIGJ1aWxkIGFuZCBsb2FkLlxuJiM0MzsgIFRoZSBsb2FkZXIgaW5zdHJ1Y3Rpb24gYnl0ZXMgdGhlIGtlcm5lbCB2ZXJpZmllcyBhcmUgZXhhY3RseSB0aGUgYnl0ZXMgdGhhdFxuJiM0MzsgIHdlcmUgc2lnbmVkLlxuJiM0MzstIFRoZSBtZXRhZGF0YSBtYXAgaXMgb3BhcXVlLCBmcm96ZW4gZGF0YSAtIHRoZSBzZXJpYWxpemVkIHRhcmdldCBwcm9ncmFtcyxcbiYjNDM7ICB0aGVpciByZWxvY2F0aW9uIHJlY29yZHMsIG1hcCBkZXNjcmlwdGlvbnMgYW5kIGluaXRpYWwgdmFsdWVzLiBJdHMgYnl0ZXMgYXJlXG4mIzQzOyAgaWRlbnRpY2FsIGF0IGJ1aWxkIHRpbWUgYW5kIGF0IGxvYWQgdGltZSwgc28gdGhleSBhcmUgc2ltcGx5IGFwcGVuZGVkIHRvIHRoZVxuJiM0MzsgIGluc3RydWN0aW9ucyBhbmQgY292ZXJlZCBieSB0aGUgc2FtZSBzaWduYXR1cmUgKHRoZXJlIGlzIG5vIHNlcGFyYXRlIG1ldGFkYXRhXG4mIzQzOyAgaGFzaCB0byBjb21wdXRlIG9yIGNvbXBhcmUpLlxuJiM0MztcbiYjNDM7QWxsIHRoZSBob3N0LXNwZWNpZmljIHJld3JpdGluZyAtIGNyZWF0aW5nIG1hcHMsIHBhdGNoaW5nIHRoZWlyIGZkcyBpbnRvIHRoZVxuJiM0Mzt0YXJnZXQgcHJvZ3JhbXMsIGFwcGx5aW5nIENPLVJFLCByZXNvbHZpbmcga3N5bXMsIHNlZWRpbmcgZ2xvYmFsIGRhdGEgLSBzdGlsbFxuJiM0MztoYXBwZW5zLCBidXQgaXQgaGFwcGVucyAqaW5zaWRlIHRoZSBsb2FkZXIgYXQgcnVudGltZSosIG9uIHRoZSB2ZXJpZmllZFxuJiM0MzttZXRhZGF0YSwgKiphZnRlcioqIHRoZSBrZXJuZWwgaGFzIHZlcmlmaWVkIHRoZSBgYGluc25zIHx8IG1ldGFkYXRhYGAgc2lnbmF0dXJlLlxuJiM0MztUaGUga2VybmVsIG5ldmVyIGhhcyB0byB2ZXJpZnkgdGhlIHJlbG9jYXRlZCB0YXJnZXQgcHJvZ3JhbXM6IGl0IHZlcmlmaWVzIHRoZVxuJiM0Mztsb2FkZXIgYW5kIGl0cyBpbnB1dHMgb25jZSwgYW5kIHRydXN0IHRyYW5zZmVycyB0byB3aGF0ZXZlciB0aGF0IG5vdy10cnVzdGVkLFxuJiM0MztkZXRlcm1pbmlzdGljIGxvYWRlciBpbnN0YWxscy4gVGhlIHJlbG9jYXRpb24gc3RlcCBpcyBtb3ZlZCBmcm9tIFwmIzM0O2JlZm9yZSB0aGVcbiYjNDM7c2lnbmF0dXJlIGNhbiBiZSBjaGVja2VkXCYjMzQ7IHRvIFwmIzM0O2FmdGVyIGEgdHJ1c3RlZCBwcm9ncmFtIHJ1bnNcJiMzNDsgLSB3aGljaCBpcyBleGFjdGx5XG4mIzQzO3doYXQgbWFrZXMgaXQgc2lnbmFibGUuXG4mIzQzO1xuJiM0MztCZWNhdXNlIHRoZSBtZXRhZGF0YSBtYXAgaXMgdGhlIGxvYWRlciYjMzk7cyBvbmx5IHVudHJ1c3RlZCBpbnB1dCwgdHdvIGV4aXN0aW5nIG1hcFxuJiM0Mztwcm9wZXJ0aWVzIGFyZSByZXVzZWQgdG8ga2VlcCBpdCB0cnVzdHdvcnRoeSBhY3Jvc3MgdGhlIGxvYWQ6XG4mIzQzO1xuJiM0MztFeGNsdXNpdmUgbWFwc1xuJiM0MzsgICAgQSBtYXAgY3JlYXRlZCB3aXRoIGBgZXhjbF9wcm9nX2hhc2hgYCAoc2VlIGBgQlBGX01BUF9DUkVBVEVgYCkgbWF5IG9ubHkgYmVcbiYjNDM7ICAgIGFjY2Vzc2VkIGJ5IGEgcHJvZ3JhbSB3aG9zZSBkaWdlc3QgbWF0Y2hlcyB0aGF0IGhhc2guIFRoZSB2ZXJpZmllciBlbmZvcmNlc1xuJiM0MzsgICAgYGBtYXAtXHUwMDNlZXhjbF9wcm9nX3NoYSA9PSBwcm9nLVx1MDAzZWRpZ2VzdGBgIGZvciBldmVyeSBtYXAgYSBwcm9ncmFtIHVzZXMsIHNvIHRoZVxuJiM0MzsgICAgbWV0YWRhdGEgbWFwIGlzIGJvdW5kIHRvIGV4YWN0bHkgdGhlIHNpZ25lZCBsb2FkZXIgYW5kIGNhbm5vdCBiZSBzaGFyZWQgd2l0aFxuJiM0MzsgICAgb3IgbXV0YXRlZCBieSBhbm90aGVyIHByb2dyYW0uXG4mIzQzO1xuJiM0MztGcm96ZW4gbWFwc1xuJiM0MzsgICAgVGhlIG1ldGFkYXRhIG1hcCBpcyBmcm96ZW4gKGBgQlBGX01BUF9GUkVFWkVgYCkgYmVmb3JlIHRoZSBsb2FkZXIgaXMgbG9hZGVkLlxuJiM0MzsgICAgRnJlZXppbmcgYmxvY2tzIGZ1cnRoZXIgdXNlcnNwYWNlIHdyaXRlcywgc28gdGhlIGJ5dGVzIGZvbGRlZCBpbnRvIHRoZVxuJiM0MzsgICAgc2lnbmF0dXJlIGNhbm5vdCBjaGFuZ2UgYmVmb3JlIHRoZSBsb2FkZXIgcnVucy4gKEZyZWV6aW5nIGRvZXMgbm90IG1ha2UgdGhlXG4mIzQzOyAgICBtYXAgcmVhZC1vbmx5IHRvIHRoZSBsb2FkZXIgcHJvZ3JhbSBpdHNlbGYsIHdoaWNoIHN0aWxsIHdyaXRlcyBjcmVhdGVkIGZpbGVcbiYjNDM7ICAgIGRlc2NyaXB0b3JzIGJhY2sgaW50byB0aGUgYmxvYiYjMzk7cyBzY3JhdGNoIGFyZWEuKVxuJiM0MztcbiYjNDM7TG9hZC10aW1lIHZlcmlmaWNhdGlvblxuJiM0Mzs9PT09PT09PT09PT09PT09PT09PT09PVxuJiM0MztcbiYjNDM7UmF0aGVyIHRoYW4gaGF2ZSB0aGUgbG9hZGVyIGNoZWNrIGl0cyBvd24gbWV0YWRhdGEgZnJvbSB3aXRoaW4gQlBGLCB0aGUga2VybmVsXG4mIzQzO3ZlcmlmaWVzIGl0IGRpcmVjdGx5IGF0IGBgQlBGX1BST0dfTE9BRGBgLCB3aXRoIG5vIG5ldyBVQVBJLiBUaGUgbWVjaGFuaXNtXG4mIzQzO3JldXNlcyB0aGUgZXhpc3RpbmcgYGBmZF9hcnJheWBgOlxuJiM0MztcbiYjNDM7Iy4gVXNlcnNwYWNlIGNyZWF0ZXMgdGhlIG1ldGFkYXRhIG1hcCB3aXRoIGBgZXhjbF9wcm9nX2hhc2hgYCBzZXQgdG8gdGhlXG4mIzQzOyAgIGxvYWRlciYjMzk7cyBkaWdlc3QsIHBvcHVsYXRlcyBpdCwgYW5kIGZyZWV6ZXMgaXQuXG4mIzQzOyMuIFRoZSBsb2FkZXIgaXMgbG9hZGVkIHdpdGggYGBzaWduYXR1cmVgYC9gYHNpZ25hdHVyZV9zaXplYGAvYGBrZXlyaW5nX2lkYGBcbiYjNDM7ICAgc2V0LCB0aGUgbWV0YWRhdGEgbWFwIHJlZmVyZW5jZWQgdGhyb3VnaCBgYGZkX2FycmF5YGAsIGFuZCBgYGZkX2FycmF5X2NudGBgXG4mIzQzOyAgIHNldCBzbyB0aGUga2VybmVsIGtub3dzIHRoZSBhcnJheSYjMzk7cyBsZW5ndGguXG4mIzQzOyMuIFNpZ25hdHVyZSB2ZXJpZmljYXRpb24gcnVucyBpbnNpZGUgdGhlIHZlcmlmaWVyIChgYGJwZl9jaGVjaygpYGApLCBvbmNlIGl0XG4mIzQzOyAgIGhhcyByZXNvbHZlZCB0aGUgYGBmZF9hcnJheWBgIGVudHJpZXMgaW50byB0aGUgcHJvZ3JhbSYjMzk7cyBgYHVzZWRfbWFwc2BgLiBUaGVcbiYjNDM7ICAgbWFwcyBmb2xkZWQgaW50byB0aGUgc2lnbmF0dXJlIGFyZSB0aGVyZWZvcmUgdGhlIHZlcnkgb2JqZWN0cyB0aGUgcHJvZ3JhbVxuJiM0MzsgICBiaW5kcyAtIGEgc2luZ2xlIHJlc29sdXRpb24gb2YgYGBmZF9hcnJheWBgLCBub3QgYSBzZXBhcmF0ZSByZWFkLCBzbyB0aGVcbiYjNDM7ICAgdmVyaWZpZWQgYnl0ZXMgY2Fubm90IGJlIHN3YXBwZWQgZm9yIGEgZGlmZmVyZW50IG1hcCBhZnRlciB0aGUgY2hlY2sgKG5vXG4mIzQzOyAgIHRpbWUtb2YtY2hlY2svdGltZS1vZi11c2Ugd2luZG93KS4gRWFjaCBmb2xkZWQgbWFwIG11c3QgYmUgZXhjbHVzaXZlIChjYXJyeVxuJiM0MzsgICBgYGV4Y2xfcHJvZ19zaGFgYCkgYW5kIGEgcGxhaW4gYXJyYXkgbWFwIChgYEJQRl9NQVBfVFlQRV9BUlJBWWBgKTsgb25seSBhblxuJiM0MzsgICBhcnJheSBtYXAgZXhwb3NlcyBpdHMgdmFsdWUgYnVmZmVyIHRocm91Z2ggYGBtYXBfZGlyZWN0X3ZhbHVlX2FkZHIoKWBgIGFzIGFcbiYjNDM7ICAga2VybmVsIGFkZHJlc3Mgc3Bhbm5pbmcgYGB2YWx1ZV9zaXplYGAgYnl0ZXMuIEEgbWFwIHRoYXQgaXMgbm90IGV4Y2x1c2l2ZSwgbm90XG4mIzQzOyAgIGZyb3plbiwgb3Igbm90IGEgcGxhaW4gYXJyYXkgaXMgcmVqZWN0ZWQsIHdpdGggYSB2ZXJpZmllciBsb2cgbWVzc2FnZSBuYW1pbmdcbiYjNDM7ICAgdGhlIG9mZmVuZGluZyBtYXAuIFRoZSBrZXJuZWwgYXBwZW5kcyBlYWNoIG1hcCYjMzk7cyBmcm96ZW5cbiYjNDM7ICAgY29udGVudHMgdG8gdGhlIGluc3RydWN0aW9uIGJ1ZmZlciBhbmQgdmVyaWZpZXMgdGhlIFBLQ1MjNyBzaWduYXR1cmUgb3ZlciB0aGVcbiYjNDM7ICAgY29uY2F0ZW5hdGlvbiBgYGluc25zIHx8IG1ldGFkYXRhXzAgfHwgbWV0YWRhdGFfMSB8fCAuLi5gYCBpbiBgYHVzZWRfbWFwc2BgXG4mIzQzOyAgIG9yZGVyLCBiZWZvcmUgaXQgcmV3cml0ZXMgdGhlIChzaWduZWQpIGluc3RydWN0aW9ucy5cbiYjNDM7XG4mIzQzO0Egc2lnbmVkIHByb2dyYW0gdGhlcmVmb3JlIHRha2VzIG9uZSBvZiBleGFjdGx5IHR3byBzaGFwZXMsIGJvdGggZnVsbHlcbiYjNDM7c3VwcG9ydGVkOlxuJiM0MztcbiYjNDM7LSAqKk5vIGJvdW5kIG1hcHMqKiAoYGBmZF9hcnJheV9jbnQgPT0gMGBgKTogdGhlcmUgaXMgbm90aGluZyB0byBhcHBlbmQsIHNvIHRoZVxuJiM0MzsgIGtlcm5lbCB2ZXJpZmllcyB0aGUgc2lnbmF0dXJlIG92ZXIgdGhlIGluc3RydWN0aW9ucyBhbG9uZS4gQSB2YWxpZCBzaWduYXR1cmVcbiYjNDM7ICB5aWVsZHMgYGBCUEZfU0lHX1ZFUklGSUVEYGAgYW5kIHRoZSBwcm9ncmFtIGxvYWRzLiBUaGlzIGlzIHRoZSBvcmRpbmFyeSBjYXNlXG4mIzQzOyAgZm9yIGEgZGlyZWN0bHktbG9hZGVkIHNpZ25lZCBwcm9ncmFtIHdpdGggbm8gc2VwYXJhdGUgcGF5bG9hZDsgaXQgaXMgKm5vdCpcbiYjNDM7ICByZWplY3RlZCBmb3IgXCYjMzQ7bWlzc2luZ1wmIzM0OyBtZXRhZGF0YSwgYmVjYXVzZSBpdCBoYXMgbm9uZSB0byBjb3Zlci5cbiYjNDM7LSAqKkV4Y2x1c2l2ZSBib3VuZCBtYXBzKiogKGBgZmRfYXJyYXlfY250IFx1MDAzZSAwYGApOiBldmVyeSBlbnRyeSBpcyBleGNsdXNpdmUgYW5kXG4mIzQzOyAgZm9sZGVkLCBzbyB0aGUgc2lnbmF0dXJlIGNvdmVycyBgYGluc25zIHx8IG1ldGFkYXRhYGAuXG4mIzQzO1xuJiM0MztUaGVyZSBpcyBubyB0aGlyZCBzaGFwZTogYSBub24tZXhjbHVzaXZlIG1hcCBpbiBhIHNpZ25lZCBwcm9ncmFtJiMzOTtzIGBgZmRfYXJyYXlgYFxuJiM0MztpcyByZWplY3RlZCByYXRoZXIgdGhhbiBzaWxlbnRseSBsZWZ0IG91dCBvZiB0aGUgc2lnbmF0dXJlLCBzbyBhIHByb2dyYW0gYm91bmRcbiYjNDM7dG8gYSBzaWduZWQgbG9hZGVyIG5ldmVyIGhhcyBhIG1hcCB0aGUgc2lnbmF0dXJlIGRvZXMgbm90IGNvdmVyLlxuJiM0MztcbiYjNDM7VGhlIGRpZ2VzdCBiaW5kaW5nIChgYGV4Y2xfcHJvZ19zaGEgPT0gcHJvZy1cdTAwM2VkaWdlc3RgYCkgaXMgZW5mb3JjZWQgYnkgdGhlXG4mIzQzO3ZlcmlmaWVyIGFzIHVzdWFsOyBiZWNhdXNlIHRoYXQgY2hlY2sgcnVucyB3aGlsZSBgYGZkX2FycmF5YGAgaXMgcmVzb2x2ZWQgLVxuJiM0MztiZWZvcmUgdGhlIHZlcmlmaWVyIHdvdWxkIG90aGVyd2lzZSBjb21wdXRlIHRoZSB0YWcgLSBgYHByb2ctXHUwMDNlZGlnZXN0YGAgaXNcbiYjNDM7Y29tcHV0ZWQgdXAgZnJvbnQgaW4gdGhlIHZlcmlmaWVyLCBvdmVyIHRoZSB1bm1vZGlmaWVkIChzaWduYXR1cmUtY292ZXJlZClcbiYjNDM7aW5zdHJ1Y3Rpb25zLCBmb3IgYW55IHNpZ25lZCBsb2FkLlxuJiM0MztcbiYjNDM7Q292ZXJhZ2UgaXMgdGhlbiBlbmZvcmNlZCBhcyB0aGUgdmVyaWZpZXIgcmVzb2x2ZXMgaW5zdHJ1Y3Rpb25zLCBhdCB0aGUgcG9pbnRcbiYjNDM7ZWFjaCBvYmplY3QgaXMgYm91bmQgcmF0aGVyIHRoYW4gYnkgYSBjb3VudCB0YWtlbiBhZnRlcndhcmRzLiBPbmNlIHRoZSBzaWduYXR1cmVcbiYjNDM7aGFzIGJlZW4gdmVyaWZpZWQsIGJpbmRpbmcgYW55IGZ1cnRoZXIgbWFwIGlzIHJlZnVzZWQ6IGEgbWFwIHJlYWNoZWQgYnkgYVxuJiM0MztkaXJlY3RseS1yZWZlcmVuY2VkIGZkLCBvciBhIG1hcCBzd2FwcGVkIGludG8gYW4gYGBmZF9hcnJheWBgIHNsb3QgdGhlIGxvYWRlclxuJiM0MztyZWFkcywgaXMgbm90IGFtb25nIHRob3NlIGFscmVhZHkgZm9sZGVkLCBzbyBpdCBpcyByZWplY3RlZCB0aGUgbW9tZW50IHRoZVxuJiM0Mzt2ZXJpZmllciB0cmllcyB0byBiaW5kIGl0LiBBIEJURiBpcyByZWZ1c2VkIG91dHJpZ2h0IGZvciBhIHNpZ25lZCBwcm9ncmFtIC0gYVxuJiM0Mztrc3ltIG9yIGEgQlRGIGZkIGluIGBgZmRfYXJyYXlgYCwgd2hldGhlciByZXNvbHZlZCB1cCBmcm9udCBvciBsYXppbHkgZm9yIGFcbiYjNDM7bW9kdWxlIGtmdW5jLCBpcyByZWplY3RlZCB3aGVuIGl0IHdvdWxkIGJlIGJvdW5kLiBUb2dldGhlciB3aXRoIHRoZSBmb2xkIHJ1bGVcbiYjNDM7YWJvdmUgdGhpcyBrZWVwcyB0aGUgdmVyZGljdCBiaW5hcnk6IGEgc2lnbmVkIHByb2dyYW0gY2Fubm90IHVzZSBhIG1hcCBpdHNcbiYjNDM7c2lnbmF0dXJlIGRvZXMgbm90IGNvdmVyLCBhbmQgYSBkaWZmZXJlbnQgYnV0IGVxdWFsbHkgZGlnZXN0LWJvdW5kIG1hcCBjYW5ub3QgYmVcbiYjNDM7c3Vic3RpdHV0ZWQgYXQgYW4gYGBmZF9hcnJheWBgIHNsb3QuIE5vbi1leGNsdXNpdmUgbWFwcyBhcmUgbmV2ZXIgZm9sZGVkLCBzbyBhXG4mIzQzO3NpZ25lZCBwcm9ncmFtIGNhbm5vdCB1c2Ugb25lIGF0IGFsbC5cbiYjNDM7XG4mIzQzO1RoZSB2ZXJkaWN0XG4mIzQzOz09PT09PT09PT09XG4mIzQzO1xuJiM0MztBIHByb2dyYW0gaXMgZWl0aGVyIHVuc2lnbmVkIG9yIGZ1bGx5IHZlcmlmaWVkIC0gdGhlcmUgaXMgbm8gaW50ZXJtZWRpYXRlXG4mIzQzO3N0YXRlLiBUaGUgb3V0Y29tZSBpcyByZWNvcmRlZCBpbiBgYHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy52ZXJkaWN0YGA6XG4mIzQzO1xuJiM0MzsuLiBjb2RlLWJsb2NrOjogY1xuJiM0MztcbiYjNDM7ICAgIGVudW0gYnBmX3NpZ192ZXJkaWN0IHtcbiYjNDM7ICAgICAgICAgICAgQlBGX1NJR19VTlNJR05FRCA9IDAsXG4mIzQzOyAgICAgICAgICAgIEJQRl9TSUdfVkVSSUZJRUQsXG4mIzQzOyAgICB9O1xuJiM0MztcbiYjNDM7YGBCUEZfU0lHX1ZFUklGSUVEYGAgbWVhbnMgdGhlIHNpZ25hdHVyZSBpcyB2YWxpZCBhbmQgY292ZXJzIHRoZSBpbnN0cnVjdGlvbnNcbiYjNDM7KmFuZCogdGhlIGZyb3plbiBjb250ZW50cyBvZiBldmVyeSBleGNsdXNpdmUgbWFwIHRoZSBwcm9ncmFtIHVzZXM6XG4mIzQzO1xuJiM0MzstIEZvciBhbiBvcmRpbmFyeSwgZGlyZWN0bHktbG9hZGVkIHNpZ25lZCBwcm9ncmFtIHRoZSBpbnN0cnVjdGlvbnMgYXJlIHRoZSB3aG9sZVxuJiM0MzsgIGFydGlmYWN0IGFuZCBpdCB1c2VzIG5vIGV4Y2x1c2l2ZSBtYXBzLCBzbyBhIHZhbGlkIGluc3RydWN0aW9uIHNpZ25hdHVyZSBpc1xuJiM0MzsgIHRoZSBjb21wbGV0ZSB2ZXJpZmljYXRpb24uXG4mIzQzOy0gRm9yIGEgc2lnbmVkIGxvYWRlciB0aGUgbWV0YWRhdGEgbWFwIGlzIGV4Y2x1c2l2ZSwgc28gaXRzIGNvbnRlbnRzIGFyZSBmb2xkZWRcbiYjNDM7ICBpbiBhbmQgdGhlIHNpZ25hdHVyZSBjb3ZlcnMgYGBpbnNucyB8fCBtZXRhZGF0YWBgLlxuJiM0MztcbiYjNDM7VGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIFwmIzM0O2luc3RydWN0aW9ucyB2ZXJpZmllZCBidXQgbWV0YWRhdGEgbm90XCYjMzQ7IHZlcmRpY3Q6IGFcbiYjNDM7c2lnbmVkIGxvYWRlciB0aGF0IGZhaWxzIHRvIGNvdmVyIGl0cyBtZXRhZGF0YSBpcyAqcmVqZWN0ZWQqIChzZWUgYWJvdmUpLCBub3RcbiYjNDM7cmVjb3JkZWQgd2l0aCBhIHdlYWtlciB2ZXJkaWN0LiBgYEJQRl9TSUdfVkVSSUZJRURgYCB0aGVyZWZvcmUgYWx3YXlzIG1lYW5zIHRoZVxuJiM0Mztwcm9ncmFtIGFuZCBldmVyeXRoaW5nIHRoZSBzaWduYXR1cmUgaXMgcmVzcG9uc2libGUgZm9yIGFyZSBhdXRoZW50aWMsIHdoaWNoIGlzXG4mIzQzO3doYXQgYSBwb2xpY3kgY2FuIHJlbHkgb24uXG4mIzQzO1xuJiM0MztBbG9uZ3NpZGUgdGhlIHZlcmRpY3QgdGhlIGtlcm5lbCByZWNvcmRzIHdoaWNoIGtleXJpbmcgdmFsaWRhdGVkIHRoZSBzaWduYXR1cmU7XG4mIzQzO3NlZSBgS2V5cmluZ3NgXy5cbiYjNDM7XG4mIzQzO0VuZm9yY2VtZW50IHZpYSBMU01zXG4mIzQzOz09PT09PT09PT09PT09PT09PT09XG4mIzQzO1xuJiM0MztTaWduaW5nIG9ubHkgKnJlY29yZHMqIGEgdmVyZGljdDsgYW4gTFNNIHR1cm5zIGl0IGludG8gcG9saWN5LiBUaGUgdmVyZGljdCBhbmRcbiYjNDM7a2V5cmluZyBmaWVsZHMgbGl2ZSBpbiBgYHN0cnVjdCBicGZfcHJvZ19hdXhgYCwgc28gYSBCUEYgTFNNIHByb2dyYW0gY2FuIHJlYWRcbiYjNDM7dGhlbSBkaXJlY3RseSAoc2VlIERvY3VtZW50YXRpb24vYnBmL3Byb2dfbHNtLnJzdCBmb3Igd3JpdGluZyBhbmQgYXR0YWNoaW5nIEJQRlxuJiM0MztMU00gcHJvZ3JhbXMpOyB0aGUgc2FtZSBmaWVsZHMgYXJlIGVxdWFsbHkgYXZhaWxhYmxlIHRvIGluLXRyZWUgTFNNcy4gVHdvIGhvb2tzXG4mIzQzO2FyZSB1c2VmdWwgYXQgZGlmZmVyZW50IHBvaW50cyBvZiB0aGUgbG9hZDogdGhlIGRlZGljYXRlZFxuJiM0MztgYHNlY3VyaXR5X2JwZl9wcm9nX2xvYWQoKWBgIGdhdGVzIGFkbWlzc2lvbiBiZWZvcmUgdGhlIG1haW4gdmVyaWZpY2F0aW9uIHdvcmssXG4mIzQzO2FuZCB0aGUgZXhpc3RpbmcgYGBzZWN1cml0eV9icGZfcHJvZygpYGAgb2JzZXJ2ZXMgYSBwcm9ncmFtIHRoYXQgaGFzIGZ1bGx5XG4mIzQzO2xvYWRlZC5cbiYjNDM7XG4mIzQzO0FkbWlzc2lvbjogYGBzZWN1cml0eV9icGZfcHJvZ19sb2FkKClgYFxuJiM0MzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiYjNDM7XG4mIzQzO1RoaXMgaG9vayBnYXRlcyBhZG1pc3Npb24gKipmb3IgZXZlcnkgbG9hZCoqLCBmcm9tIGEgc2luZ2xlIGNhbGwgc2l0ZSBpbnNpZGUgdGhlXG4mIzQzO3ZlcmlmaWVyIChgYGJwZl9jaGVjaygpYGApLCBiZWZvcmUgdGhlIG1haW4gdmVyaWZpY2F0aW9uIHdvcmsuIEl0IHJ1bnMgYWZ0ZXIgdGhlXG4mIzQzO29wdGlvbmFsIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24sIHNvIHRoZSB2ZXJkaWN0IGFuZCBrZXlyaW5nIGZpZWxkcyBhcmUgZmluYWwgLSB0aGVcbiYjNDM7aG9vayBjYW4gc2VlIHdoZXRoZXIsIGFuZCBob3cgc3Ryb25nbHksIHRoZSBwcm9ncmFtIHdhcyBzaWduZWQsIHdoaWNoIGtleXJpbmdcbiYjNDM7dmFsaWRhdGVkIGl0LCB0aGUgbG9hZCBgYGF0dHJgYCwgdGhlIEJQRiB0b2tlbiBhbmQgd2hldGhlciB0aGUgbG9hZCBjYW1lIGZyb20gdGhlXG4mIzQzO2tlcm5lbC4gRm9yIGEgc2lnbmVkIGxvYWQgdGhlIHZlcmRpY3QgaXMgYGBCUEZfU0lHX1ZFUklGSUVEYGAgaGVyZSAodGhlIHNpZ25hdHVyZVxuJiM0MztoYXMganVzdCBiZWVuIGNoZWNrZWQpOyBmb3IgYW4gdW5zaWduZWQgbG9hZCBpdCBpcyBgYEJQRl9TSUdfVU5TSUdORURgYC5cbiYjNDM7XG4mIzQzO1RoaXMgaXMgdGhlIHBsYWNlIGZvciAqY29hcnNlIGFkbWlzc2lvbiogdGhhdCBtdXN0IGFsc28gc2VlIHVuc2lnbmVkIGFuZFxuJiM0Mztub3QteWV0LXZlcmlmaWVkIGxvYWRzOiByZXF1aXJlIGEgc2lnbmF0dXJlIGF0IGFsbCwgcmVzdHJpY3QgdGhlIGFjY2VwdGFibGVcbiYjNDM7a2V5cmluZywgcmVzdHJpY3Qgd2hpY2ggdG9rZW4vY3JlZGVudGlhbHMgbWF5IGxvYWQgQlBGLCBhcHBseSBwZXItcHJvZ3JhbS10eXBlXG4mIzQzO3J1bGVzLCBvciBhdWRpdCBldmVyeSBsb2FkIGF0dGVtcHQgdGhhdCBtYWtlcyBpdCBwYXN0IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gLVxuJiM0MzthdHRlbXB0cyBmYWlsaW5nIHRoZSBzaWduYXR1cmUgb3IgdGhlIG1ldGFkYXRhIGJpbmRpbmcgYWJvcnQgYmVmb3JlIHRoaXMgaG9va1xuJiM0MztmaXJlcy4gSXQgaXMgdGhlIHByaW1hcnkgZGVueSBwb2ludC5cbiYjNDM7XG4mIzQzO09uZSBzdWJ0bGV0eTogdGhpcyBob29rIHJ1bnMgKmJlZm9yZSogdGhlIHZlcmlmaWVyIGZpbmlzaGVzIGl0cyB3b3JrLCBzb1xuJiM0MztgYEJQRl9TSUdfVkVSSUZJRURgYCAqaGVyZSogbWVhbnMgb25seSBcJiMzNDt2YWxpZGx5IHNpZ25lZFwmIzM0OyAtIG5vdCBcJiMzNDtsb2FkZWRcJiMzNDsuIEFsbG93aW5nXG4mIzQzO2EgbG9hZCBhdCB0aGlzIHBvaW50IGxldHMgaXQgKnByb2NlZWQqOyBpdCBkb2VzIG5vdCBndWFyYW50ZWUgdGhlIHByb2dyYW0gd2lsbFxuJiM0Mztsb2FkLiBBIHZhbGlkbHkgc2lnbmVkIHByb2dyYW0gY2FuIHN0aWxsIGJlIHJlamVjdGVkIGFmdGVyd2FyZHMgb24gdHdvXG4mIzQzO2luZGVwZW5kZW50IGdyb3VuZHM6IHRoZSB2ZXJpZmllciBtYXkgcmVqZWN0IGl0IGxpa2UgYW55IG90aGVyIHByb2dyYW0gKHVuc2FmZVxuJiM0MzttZW1vcnkgYWNjZXNzLCBiYWQgY29udHJvbCBmbG93LCByZXNvdXJjZSBsaW1pdHMsIC4uLiksIGFuZCB0aGUga2VybmVsIHNlcGFyYXRlbHlcbiYjNDM7cmVmdXNlcyAtIGFzIHRoZSB2ZXJpZmllciByZXNvbHZlcyBpbnN0cnVjdGlvbnMgYW5kIGJpbmRzIGVhY2ggb2JqZWN0IC0gYW55IG1hcFxuJiM0Mzt0aGUgc2lnbmF0dXJlIGRvZXMgbm90IGNvdmVyIG9yIGFueSBCVEYgYXQgYWxsLCByZWdhcmRsZXNzIG9mIHdoYXQgdGhpcyBob29rXG4mIzQzO3JldHVybmVkLiBPbmx5IGFmdGVyIHRoZSBwcm9ncmFtIGhhcyBmdWxseSBsb2FkZWQsIGF0IHRoZSBuZXh0IGhvb2tcbiYjNDM7KGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgKSwgZG9lcyBgYEJQRl9TSUdfVkVSSUZJRURgYCBjYXJyeSBpdHMgZnVsbCBtZWFuaW5nOlxuJiM0Mzt2YWxpZGx5IHNpZ25lZCAqYW5kKiBmdWxseSB2ZXJpZmllZC5cbiYjNDM7XG4mIzQzO0EgbW9yZSByZWFsaXN0aWMgYWRtaXNzaW9uIHBvbGljeSB0aGFuIFwmIzM0O2lzIGl0IHNpZ25lZCBhdCBhbGxcJiMzNDs6IGFjY2VwdCBwcm9ncmFtc1xuJiM0MztzaWduZWQgYnkgYSBzeXN0ZW0ga2V5cmluZywgYWNjZXB0IGEgdXNlci1rZXlyaW5nIHNpZ25hdHVyZSBvbmx5IGlmIHRoZVxuJiM0MztrZXkva2V5cmluZyBpdCB3YXMgdmVyaWZpZWQgYWdhaW5zdCBpcyBvbiBhbiBleHBsaWNpdCBhbGxvd2xpc3QsIGFuZCBlbWl0IGFcbiYjNDM7dGFtcGVyLWV2aWRlbnQgcmVjb3JkIG9mIGV2ZXJ5IGRlY2lzaW9uIHNvIHRoYXQgZXZlbiBkZW5pZWQgYXR0ZW1wdHMgYXJlXG4mIzQzO2F1ZGl0YWJsZS4gKElsbHVzdHJhdGl2ZSAtIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pXG4mIzQzO1xuJiM0MzsuLiBjb2RlLWJsb2NrOjogY1xuJiM0MztcbiYjNDM7ICAgIC8qIFNlcmlhbHMgb2YgdXNlciBrZXlzL2tleXJpbmdzIHdlIGFkZGl0aW9uYWxseSB0cnVzdC4gKi9cbiYjNDM7ICAgIHN0cnVjdCB7XG4mIzQzOyAgICAgICAgICAgIF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7XG4mIzQzOyAgICAgICAgICAgIF9fdHlwZShrZXksIF9fczMyKTsgICAgICAgICAgICAgLyoga2V5cmluZ19zZXJpYWwgKi9cbiYjNDM7ICAgICAgICAgICAgX190eXBlKHZhbHVlLCBfX3U4KTtcbiYjNDM7ICAgICAgICAgICAgX191aW50KG1heF9lbnRyaWVzLCA2NCk7XG4mIzQzOyAgICB9IHRydXN0ZWRfdXNlcl9rZXlzIFNFQyhcJiMzNDsubWFwc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MzsgICAgLyogQXVkaXQgc3RyZWFtIGNvbnN1bWVkIGJ5IGEgdXNlcnNwYWNlIGxvZ2dlci4gKi9cbiYjNDM7ICAgIHN0cnVjdCB7XG4mIzQzOyAgICAgICAgICAgIF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7XG4mIzQzOyAgICAgICAgICAgIF9fdWludChtYXhfZW50cmllcywgMSBcdTAwM2NcdTAwM2MgMTYpO1xuJiM0MzsgICAgfSBhdWRpdCBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7ICAgIHN0cnVjdCBkZWNpc2lvbiB7IF9fdTMyIHByb2dfdHlwZSwgdmVyZGljdCwga3R5cGU7IF9fczMyIHNlcmlhbCwgcmV0OyB9O1xuJiM0MztcbiYjNDM7ICAgIFNFQyhcJiMzNDtsc20vYnBmX3Byb2dfbG9hZFwmIzM0OylcbiYjNDM7ICAgIGludCBCUEZfUFJPRyhhZG1pdCwgc3RydWN0IGJwZl9wcm9nICpwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0cixcbiYjNDM7ICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnBmX3Rva2VuICp0b2tlbiwgYm9vbCBrZXJuZWwpXG4mIzQzOyAgICB7XG4mIzQzOyAgICAgICAgICAgIF9fdTMyIHZlcmRpY3QgPSBwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcudmVyZGljdDtcbiYjNDM7ICAgICAgICAgICAgX191MzIga3R5cGUgICA9IHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3R5cGU7XG4mIzQzOyAgICAgICAgICAgIF9fczMyIHNlcmlhbCAgPSBwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcua2V5cmluZ19zZXJpYWw7XG4mIzQzOyAgICAgICAgICAgIHN0cnVjdCBkZWNpc2lvbiAqZDtcbiYjNDM7ICAgICAgICAgICAgaW50IHJldCA9IDA7XG4mIzQzO1xuJiM0MzsgICAgICAgICAgICBpZiAoa2VybmVsKVxuJiM0MzsgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogdHJ1c3QgaW4ta2VybmVsIGxvYWRzICovXG4mIzQzO1xuJiM0MzsgICAgICAgICAgICBpZiAodmVyZGljdCAhPSBCUEZfU0lHX1ZFUklGSUVEKVxuJiM0MzsgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FUEVSTTsgICAgICAgICAgICAgICAgICAgLyogbXVzdCBiZSB2YWxpZGx5IHNpZ25lZCAqL1xuJiM0MzsgICAgICAgICAgICBlbHNlIGlmIChrdHlwZSA9PSBCUEZfU0lHX0tFWVJJTkdfVVNFUiBcdTAwMjZcdTAwMjZcbiYjNDM7ICAgICAgICAgICAgICAgICAgICAgIWJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2dHJ1c3RlZF91c2VyX2tleXMsIFx1MDAyNnNlcmlhbCkpXG4mIzQzOyAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAvKiBrZXkva2V5cmluZyBub3QgYWxsb3dsaXN0ZWQgKi9cbiYjNDM7XG4mIzQzOyAgICAgICAgICAgIGQgPSBicGZfcmluZ2J1Zl9yZXNlcnZlKFx1MDAyNmF1ZGl0LCBzaXplb2YoKmQpLCAwKTtcbiYjNDM7ICAgICAgICAgICAgaWYgKGQpIHtcbiYjNDM7ICAgICAgICAgICAgICAgICAgICBkLVx1MDAzZXByb2dfdHlwZSA9IGF0dHItXHUwMDNlcHJvZ190eXBlO1xuJiM0MzsgICAgICAgICAgICAgICAgICAgIGQtXHUwMDNldmVyZGljdCA9IHZlcmRpY3Q7XG4mIzQzOyAgICAgICAgICAgICAgICAgICAgZC1cdTAwM2VrdHlwZSA9IGt0eXBlO1xuJiM0MzsgICAgICAgICAgICAgICAgICAgIGQtXHUwMDNlc2VyaWFsID0gc2VyaWFsO1xuJiM0MzsgICAgICAgICAgICAgICAgICAgIGQtXHUwMDNlcmV0ID0gcmV0O1xuJiM0MzsgICAgICAgICAgICAgICAgICAgIGJwZl9yaW5nYnVmX3N1Ym1pdChkLCAwKTsgICAgICAgLyogcmVjb3JkIGFsbG93ICphbmQqIGRlbnkgKi9cbiYjNDM7ICAgICAgICAgICAgfVxuJiM0MzsgICAgICAgICAgICByZXR1cm4gcmV0O1xuJiM0MzsgICAgfVxuJiM0MztcbiYjNDM7T2JzZXJ2aW5nIGEgdmVyaWZpZWQgbG9hZDogYGBzZWN1cml0eV9icGZfcHJvZygpYGBcbiYjNDM7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiYjNDM7XG4mIzQzO1RoZXJlIGlzIGRlbGliZXJhdGVseSBubyBzZXBhcmF0ZSBcJiMzNDttZXRhZGF0YSBhdHRlc3RlZFwmIzM0OyBob29rLiBUaGUgY292ZXJhZ2UgY2hlY2tcbiYjNDM7YWJvdmUgaXMgZW5mb3JjZWQgYnkgdGhlIGtlcm5lbCB1bmNvbmRpdGlvbmFsbHksIHNvIGEgc2lnbmVkIGxvYWRlciB0aGF0IGZhaWxzXG4mIzQzO3RvIGNvdmVyIGl0cyBtZXRhZGF0YSBuZXZlciBsb2FkcyBhbmQgYW4gTFNNIG5ldmVyIGhhcyB0byByZS1lc3RhYmxpc2ggdGhhdFxuJiM0MztmYWN0LiBUbyAqYWN0IG9uKiBhIHByb2dyYW0gdGhhdCBoYXMgc3VjY2Vzc2Z1bGx5IGFuZCBmdWxseSBsb2FkZWQsIHVzZSB0aGVcbiYjNDM7ZXhpc3RpbmcgYGBzZWN1cml0eV9icGZfcHJvZygpYGAgaG9vayAoYGBsc20vYnBmX3Byb2dgYCksIHdoaWNoIGZpcmVzIGZyb21cbiYjNDM7YGBicGZfcHJvZ19uZXdfZmQoKWBgIC0gYWZ0ZXIgdGhlIHZlcmlmaWVyLCBhZnRlciB0aGUgY292ZXJhZ2UgY2hlY2ssIGFuZCBhZnRlclxuJiM0MztgYGJwZl9wcm9nX2FsbG9jX2lkKClgYC4gUmVsYXRpdmUgdG8gdGhlIGFkbWlzc2lvbiBob29rIHRoaXMgcG9pbnQgaXMgc3RyaWN0bHlcbiYjNDM7bGF0ZXIgYW5kIHN0cm9uZ2VyOlxuJiM0MztcbiYjNDM7LSB0aGUgcHJvZ3JhbSBoYXMgYW4gaWQgKGBgcHJvZy1cdTAwM2VhdXgtXHUwMDNlaWRgYCksIHNvIGl0IGNhbiBiZSByZWNvcmRlZCBvciBjb3JyZWxhdGVkXG4mIzQzOyAgd2l0aCBsYXRlciBldmVudHM7XG4mIzQzOy0gYGB2ZXJkaWN0ID09IEJQRl9TSUdfVkVSSUZJRURgYCAqaGVyZSogbWVhbnMgKipmdWxseSoqIHZlcmlmaWVkIC0gYSBwcm9ncmFtXG4mIzQzOyAgdGhhdCB1c2VkIGEgbWFwIHRoZSBzaWduYXR1cmUgZG9lcyBub3QgY292ZXIgd2FzIGFscmVhZHkgcmVqZWN0ZWQsIHNvIGl0IGNhbm5vdFxuJiM0MzsgIHJlYWNoIHRoaXMgcG9pbnQ7XG4mIzQzOy0gaXQgb2JzZXJ2ZXMgb25seSBwcm9ncmFtcyB0aGF0IGFjdHVhbGx5IGxvYWRlZDsgYSBmYWlsZWQgbG9hZCBuZXZlciBtaW50cyBhblxuJiM0MzsgIGZkLCBzbyBpdCBuZXZlciByZWFjaGVzIHRoaXMgaG9vay5cbiYjNDM7XG4mIzQzO0l0IHRha2VzIG9ubHkgdGhlIGBgcHJvZ2BgIGFuZCBhIG5vbi16ZXJvIHJldHVybiBzdGlsbCBhYm9ydHMgKHRoZSBmZCBpcyBub3RcbiYjNDM7aGFuZGVkIG91dCksIHNvIGl0IGNhbiB2ZXRvIGFzIHdlbGwgYXMgb2JzZXJ2ZS4gT25lIHdyaW5rbGU6IGl0IGFsc28gZmlyZXMgb25cbiYjNDM7b3RoZXIgcGF0aHMgdGhhdCBtaW50IGEgbmV3IHByb2dyYW0gZmQgLSBub3RhYmx5IGBgYnBmX3Byb2dfZ2V0X2ZkX2J5X2lkKClgYCAtXG4mIzQzO25vdCBqdXN0IG9uIGEgZnJlc2ggbG9hZC4gQmVjYXVzZSB0aGUgcHJvZ3JhbSBhbHJlYWR5IGhhcyBpdHMgaWQgaGVyZSwgYW4gTFNNXG4mIzQzO2NhbiB0ZWxsIHRoZSB0d28gYXBhcnQgd2l0aCBhIHNtYWxsIGhhc2ggbWFwOiB0aGUgKmZpcnN0KiB0aW1lIGFuIGlkIGlzIHNlZW4gaXNcbiYjNDM7dGhlIGxvYWQ7IGEgbGF0ZXIgc2lnaHRpbmcgb2YgdGhlIHNhbWUgaWQgaXMganVzdCBhbm90aGVyIGZkIHRvIGEgcHJvZ3JhbSB0aGF0XG4mIzQzO2FscmVhZHkgZXhpc3RzLlxuJiM0MztcbiYjNDM7VG8gYm91bmQgdGhlIG1hcCBhbmQgbGV0IGEgcmV1c2VkIGlkIHJlYWQgYXMgYSBmcmVzaCBsb2FkLCB0aGlzIGNhbiBiZSBwYWlyZWRcbiYjNDM7d2l0aCBgYHNlY3VyaXR5X2JwZl9wcm9nX2ZyZWUoKWBgIChgYGxzbS9icGZfcHJvZ19mcmVlYGApLCB3aGljaCBkZWxldGVzIHRoZVxuJiM0MztlbnRyeSBvbiB0ZWFyZG93biAtIGtleWVkIGJ5IHRoZSBzYW1lIGBgcHJvZ2BgIHBvaW50ZXIsIHNpbmNlXG4mIzQzO2BgYnBmX3Byb2dfZnJlZV9pZCgpYGAgaGFzIGFscmVhZHkgY2xlYXJlZCBgYHByb2ctXHUwMDNlYXV4LVx1MDAzZWlkYGAgdG8gYGAwYGAgYnkgdGhlIHRpbWVcbiYjNDM7dGhhdCBob29rIHJ1bnMuIChJbGx1c3RyYXRpdmUgLSBwcml2aWxlZ2VkIExTTSwgZXJyb3IgY2hlY2tpbmcgZWxpZGVkLilcbiYjNDM7XG4mIzQzOy4uIGNvZGUtYmxvY2s6OiBjXG4mIzQzO1xuJiM0MzsgICAgc3RydWN0IHJlYyB7IF9fdTMyIGlkLCBrdHlwZTsgX19zMzIgc2VyaWFsOyB9O1xuJiM0MztcbiYjNDM7ICAgIHN0cnVjdCB7XG4mIzQzOyAgICAgICAgICAgIF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7XG4mIzQzOyAgICAgICAgICAgIF9fdHlwZShrZXksIF9fdTY0KTsgICAgICAgICAgICAgLyogc3RydWN0IGJwZl9wcm9nICogLS0gc3RhYmxlIGlkICovXG4mIzQzOyAgICAgICAgICAgIF9fdHlwZSh2YWx1ZSwgc3RydWN0IHJlYyk7XG4mIzQzOyAgICAgICAgICAgIF9fdWludChtYXhfZW50cmllcywgNDA5Nik7XG4mIzQzOyAgICB9IGxpdmUgU0VDKFwmIzM0Oy5tYXBzXCYjMzQ7KTtcbiYjNDM7XG4mIzQzOyAgICBTRUMoXCYjMzQ7bHNtL2JwZl9wcm9nXCYjMzQ7KSAgICAgICAgICAgIC8qIGZpcmVzIGFmdGVyIGxvYWQgYW5kIG9uIGV2ZXJ5IGxhdGVyIGZkICovXG4mIzQzOyAgICBpbnQgQlBGX1BST0cob2JzZXJ2ZSwgc3RydWN0IGJwZl9wcm9nICpwcm9nKVxuJiM0MzsgICAge1xuJiM0MzsgICAgICAgICAgICBfX3U2NCBrZXkgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpcHJvZztcbiYjNDM7ICAgICAgICAgICAgc3RydWN0IHJlYyByO1xuJiM0MztcbiYjNDM7ICAgICAgICAgICAgaWYgKHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy52ZXJkaWN0ICE9IEJQRl9TSUdfVkVSSUZJRUQpXG4mIzQzOyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4mIzQzOyAgICAgICAgICAgIGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNmxpdmUsIFx1MDAyNmtleSkpXG4mIzQzOyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgLyogc2VlbiBiZWZvcmU6IGEgbGF0ZXIgZmQsIG5vdCBhIGxvYWQgKi9cbiYjNDM7XG4mIzQzOyAgICAgICAgICAgIC8qIEZpcnN0IHNpZ2h0aW5nID09IHRoaXMgcHJvZ3JhbSBqdXN0IGxvYWRlZDsgaWQgaXMgdmFsaWQgaGVyZS4gKi9cbiYjNDM7ICAgICAgICAgICAgci5pZCAgICAgPSBwcm9nLVx1MDAzZWF1eC1cdTAwM2VpZDtcbiYjNDM7ICAgICAgICAgICAgci5rdHlwZSAgPSBwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcua2V5cmluZ190eXBlO1xuJiM0MzsgICAgICAgICAgICByLnNlcmlhbCA9IHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3NlcmlhbDtcbiYjNDM7ICAgICAgICAgICAgYnBmX21hcF91cGRhdGVfZWxlbShcdTAwMjZsaXZlLCBcdTAwMjZrZXksIFx1MDAyNnIsIEJQRl9OT0VYSVNUKTtcbiYjNDM7ICAgICAgICAgICAgLyogLi4uIG5ld2x5LWxvYWRlZCB2ZXJpZmllZC1wcm9ncmFtIGFjdGlvbiwgZS5nLiByZWNvcmQgci5pZCAuLi4gKi9cbiYjNDM7ICAgICAgICAgICAgcmV0dXJuIDA7XG4mIzQzOyAgICB9XG4mIzQzO1xuJiM0MztQdXR0aW5nIHRoZW0gdG9nZXRoZXI6IHRvICpyZXF1aXJlKiB2ZXJpZmllZCBCUEYsIGRlbnkgYXQgdGhlIGFkbWlzc2lvbiBob29rXG4mIzQzO3VubGVzcyB0aGUgdmVyZGljdCBpcyBgYEJQRl9TSUdfVkVSSUZJRURgYCAoYW5kLCBpZiBkZXNpcmVkLCByZXN0cmljdCB0aGVcbiYjNDM7a2V5cmluZykuIFRoZSBrZXJuZWwgdGhlbiBndWFyYW50ZWVzIHRoYXQgYW55IHByb2dyYW0gd2hpY2ggYWN0dWFsbHkgbG9hZHMgd2l0aFxuJiM0Mzt0aGF0IHZlcmRpY3QgY292ZXJlZCBhbGwgb2YgaXRzIGV4Y2x1c2l2ZSBtYXBzLCByZWplY3RpbmcgYW55IHRoYXQgZGlkIG5vdCAtIHNvXG4mIzQzO2EgZGVueS1ieS1kZWZhdWx0IGFkbWlzc2lvbiBwb2xpY3kgbmVlZHMgbm8gc2Vjb25kIGVuZm9yY2VtZW50IHBvaW50LiBVc2VcbiYjNDM7YGBzZWN1cml0eV9icGZfcHJvZygpYGAgdG8gcmVjb3JkIG9yIGZpbmFsbHkgZ2F0ZSB0aGUgdmVyaWZpZWQgcHJvZ3JhbXMgb25jZVxuJiM0Mzt0aGV5IGNhcnJ5IGFuIGlkLiBUaGUgYGB2ZXJkaWN0YGAsIGBga2V5cmluZ190eXBlYGAgYW5kIGBga2V5cmluZ19zZXJpYWxgYCBmaWVsZHNcbiYjNDM7bGV0IGEgcG9saWN5IGRpc3Rpbmd1aXNoLCBmb3IgZXhhbXBsZSwgXCYjMzQ7dmVyaWZpZWQgYW5kIHNpZ25lZCBieSBhIGJ1aWx0aW4ga2V5XCYjMzQ7XG4mIzQzO2Zyb20gXCYjMzQ7dmVyaWZpZWQgYnkgYSB1c2VyIGtleVwmIzM0Oy4gQSBwb2xpY3kgTFNNIHN1Y2ggYXMgSVBFIGNvdWxkIGNvbnN1bWUgdGhlIHNhbWVcbiYjNDM7aG9va3MgdG8gZW5mb3JjZSBzeXN0ZW0gcG9saWN5IHdpdGhvdXQgd3JpdGluZyBhbnkgQlBGLCB0aG91Z2ggbm9uZSBpbXBsZW1lbnRzXG4mIzQzO3RoaXMgdG9kYXkuXG4mIzQzO1xuJiM0MztLZXlyaW5nc1xuJiM0Mzs9PT09PT09PVxuJiM0MztcbiYjNDM7YGBrZXlyaW5nX2lkYGAgc2VsZWN0cyB0aGUgdHJ1c3RlZCBrZXlyaW5nIHRoZSBQS0NTIzcgc2lnbmF0dXJlIGlzIHZlcmlmaWVkXG4mIzQzO2FnYWluc3QuIFRoZSB3ZWxsLWtub3duIGlkcyBgYDBgYCAoYnVpbHRpbiksIGBgVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklOR2BgXG4mIzQzO2FuZCBgYFZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklOR2BgIHNlbGVjdCB0aGUgY29ycmVzcG9uZGluZyBzeXN0ZW0ga2V5cmluZ3M7XG4mIzQzO2FueSBvdGhlciB2YWx1ZSBpcyB0cmVhdGVkIGFzIHRoZSBzZXJpYWwgb2YgYSB1c2VyL3Nlc3Npb24ga2V5IG9yIGtleXJpbmcuXG4mIzQzO1RoZSBrZXlyaW5nIGlzIGxvb2tlZCB1cCBmaXJzdCwgYmVmb3JlIHRoZSBzaWduYXR1cmUgYnl0ZXMgYXJlIGV4YW1pbmVkLCBzbyBhXG4mIzQzO3NpZ25hdHVyZSBuYW1pbmcgYSBub24tZXhpc3RlbnQga2V5cmluZyBpcyByZWplY3RlZCB1cCBmcm9udCwgYW5kIGEgZmFpbGVkXG4mIzQzO3ZlcmlmaWNhdGlvbiBhYm9ydHMgdGhlIGxvYWQgLSBzbyBhIHByb2dyYW0gdGhhdCBsb2FkcyBzdWNjZXNzZnVsbHkgd2l0aCBhXG4mIzQzO3NpZ25hdHVyZSBhbHdheXMgaGFzIGNvbnNpc3RlbnQga2V5cmluZyBmaWVsZHMgcmVjb3JkZWQuXG4mIzQzO1xuJiM0MztUd28gZmllbGRzIGFyZSByZWNvcmRlZCBpbiBgYHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZ2BgIGZvciBhbiBMU00gdG8gaW5zcGVjdDpcbiYjNDM7XG4mIzQzO2Bga2V5cmluZ190eXBlYGAgKGBgZW51bSBicGZfc2lnX2tleXJpbmdgYClcbiYjNDM7ICAgIENsYXNzaWZpZWQgcHVyZWx5IGZyb20gYGBrZXlyaW5nX2lkYGAgd2hlbmV2ZXIgdGhlIHByb2dyYW0gaXMgc2lnbmVkOlxuJiM0MzsgICAgYGBCUEZfU0lHX0tFWVJJTkdfQlVJTFRJTmBgLCBgYF9TRUNPTkRBUllgYCwgYGBfUExBVEZPUk1gYCBmb3IgdGhlIHN5c3RlbVxuJiM0MzsgICAga2V5cmluZ3MsIG9yIGBgX1VTRVJgYCBmb3IgYSB1c2VyL3Nlc3Npb24ga2V5cmluZy4gSXQgaXNcbiYjNDM7ICAgIGBgQlBGX1NJR19LRVlSSU5HX05PTkVgYCBmb3IgYW4gdW5zaWduZWQgcHJvZ3JhbS5cbiYjNDM7XG4mIzQzO2Bga2V5cmluZ19zZXJpYWxgYCAoYGBzMzJgYClcbiYjNDM7ICAgIFNldCAqKm9ubHkqKiBvbiBhIHN1Y2Nlc3NmdWwgdmVyaWZpY2F0aW9uLCB0byB0aGUgc2VyaWFsIG9mIHRoZVxuJiM0MzsgICAgKip1c2VyL3Nlc3Npb24ga2V5IG9yIGtleXJpbmcqKiB0aGF0IGBga2V5cmluZ19pZGBgIHJlc29sdmVkIHRvIC0gdGhlXG4mIzQzOyAgICBvYmplY3QgdGhlIHNpZ25hdHVyZSB3YXMgdmVyaWZpZWQgYWdhaW5zdCwgbm90IHRoZSBpbmRpdmlkdWFsIGFzeW1tZXRyaWNcbiYjNDM7ICAgIGtleSBpbnNpZGUgaXQgdGhhdCBtYXRjaGVkIHRoZSBzaWduZXIuIFBhc3NpbmdcbiYjNDM7ICAgIGBgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HYGAsIGZvciBleGFtcGxlLCByZWNvcmRzIHRoZSBzZXNzaW9uIGtleXJpbmcmIzM5O3NcbiYjNDM7ICAgIHNlcmlhbC4gVGhlIHN5c3RlbSBrZXlyaW5ncyBhcmUgdHJ1c3RlZCBhcyBhIHdob2xlIGFuZCBleHBvc2Ugbm8gc2VyaWFsXG4mIzQzOyAgICBoZXJlLCBzbyB0aGUgc2VyaWFsIGlzIGBgMGBgIGZvciBidWlsdGluLCBzZWNvbmRhcnkgYW5kIHBsYXRmb3JtXG4mIzQzOyAgICBzaWduYXR1cmVzLCBhbmQgYGAwYGAgZm9yIHVuc2lnbmVkIHByb2dyYW1zLiBJbiBvdGhlciB3b3JkcywgYSBub24temVyb1xuJiM0MzsgICAgYGBrZXlyaW5nX3NlcmlhbGBgIGlzIGV4YWN0bHkgXCYjMzQ7dmVyaWZpZWQgYWdhaW5zdCB0aGUgdXNlciBrZXkva2V5cmluZyB3aXRoXG4mIzQzOyAgICB0aGlzIHNlcmlhbFwmIzM0Oy5cbiYjNDM7XG4mIzQzOy4uIGxpc3QtdGFibGU6OlxuJiM0MzsgICA6aGVhZGVyLXJvd3M6IDFcbiYjNDM7XG4mIzQzOyAgICogLSBgYGtleXJpbmdfaWRgYFxuJiM0MzsgICAgIC0gYGBrZXlyaW5nX3R5cGVgYFxuJiM0MzsgICAgIC0gYGBrZXlyaW5nX3NlcmlhbGBgXG4mIzQzOyAgICogLSAobm8gc2lnbmF0dXJlKVxuJiM0MzsgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfTk9ORWBgXG4mIzQzOyAgICAgLSBgYDBgYFxuJiM0MzsgICAqIC0gYGAwYGBcbiYjNDM7ICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX0JVSUxUSU5gYFxuJiM0MzsgICAgIC0gYGAwYGBcbiYjNDM7ICAgKiAtIGBgVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklOR2BgXG4mIzQzOyAgICAgLSBgYEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUllgYFxuJiM0MzsgICAgIC0gYGAwYGBcbiYjNDM7ICAgKiAtIGBgVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HYGBcbiYjNDM7ICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX1BMQVRGT1JNYGBcbiYjNDM7ICAgICAtIGBgMGBgXG4mIzQzOyAgICogLSBvdGhlciAoYSB1c2VyL3Nlc3Npb24ga2V5IHNlcmlhbClcbiYjNDM7ICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX1VTRVJgYFxuJiM0MzsgICAgIC0gc2VyaWFsIG9mIHRoZSByZXNvbHZlZCBrZXkva2V5cmluZ1xuJiM0MztcbiYjNDM7UHJvZHVjaW5nIGEgc2lnbmVkIG9iamVjdFxuJiM0Mzs9PT09PT09PT09PT09PT09PT09PT09PT09PVxuJiM0MztcbiYjNDM7YGBicGZ0b29sYGAgZ2VuZXJhdGVzIGFuZCBzaWducyBhIGxpZ2h0IHNrZWxldG9uIGluIG9uZSBzdGVwOjpcbiYjNDM7XG4mIzQzOyAgICBicGZ0b29sIGdlbiBza2VsZXRvbiAtTCAtUyAtayBcdTAwM2Nwcml2YXRlX2tleS5wZW1cdTAwM2UgLWkgXHUwMDNjY2VydGlmaWNhdGUueDUwOVx1MDAzZSBcXFxuJiM0MzsgICAgICAgICAgICBvYmouYnBmLm8gXHUwMDNlIG9iai5sc2tlbC5oXG4mIzQzO1xuJiM0MztgYC1MYGAgc2VsZWN0cyB0aGUgbGlnaHQtc2tlbGV0b24gKGBgZ2VuX2xvYWRlcmBgKSBiYWNrZW5kIGFuZCBgYC1TYGAgZW5hYmxlc1xuJiM0MztzaWduaW5nOyBgYC1rYGAgYW5kIGBgLWlgYCBzdXBwbHkgdGhlIHNpZ25pbmcga2V5IGFuZCBpdHMgWC41MDkgY2VydGlmaWNhdGUuXG4mIzQzO2BgYnBmdG9vbGBgIHNpZ25zIGBgaW5zbnMgfHwgbWV0YWRhdGFgYCAtIHRoZSBleGFjdCBieXRlcyB0aGUga2VybmVsXG4mIzQzO3JlY29uc3RydWN0cyAtIGFuZCBhbHNvIGNvbXB1dGVzIGBgZXhjbF9wcm9nX2hhc2hgYCBhcyB0aGUgZGlnZXN0IG9mIHRoZSBsb2FkZXJcbiYjNDM7aW5zdHJ1Y3Rpb25zIHNvIHRoZSBtZXRhZGF0YSBtYXAgY2FuIGJlIGJvdW5kIHRvIHRoZSBsb2FkZXIuIFRoZSBzaWduYXR1cmUgYW5kXG4mIzQzO2hhc2ggYXJlIGVtYmVkZGVkIGluIHRoZSBnZW5lcmF0ZWQgaGVhZGVyOyB0aGUgY2VydGlmaWNhdGUgaXMgdXNlZCBvbmx5IGZvclxuJiM0MztzaWduaW5nIGFuZCBpcyBub3QgaW5jbHVkZWQuIExvYWRpbmcgdGhlIHNrZWxldG9uIHBlcmZvcm1zIHRoZVxuJiM0MztjcmVhdGUvcG9wdWxhdGUvZnJlZXplL2xvYWQgc2VxdWVuY2UgZGVzY3JpYmVkIGFib3ZlLlxuJiM0MztcbiYjNDM7QXQgcnVudGltZSB0aGUgdHJ1c3RlZCBwdWJsaWMga2V5IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgY2hvc2VuIGtleXJpbmcgKGZvclxuJiM0MztleGFtcGxlIGFkZGVkIHRvIHRoZSBzZXNzaW9uIGtleXJpbmcsIG9yIGJ1aWx0IGludG8gdGhlIGtlcm5lbCYjMzk7cyBidWlsdGluIHRydXN0ZWRcbiYjNDM7a2V5cmluZykgZm9yIHZlcmlmaWNhdGlvbiB0byBzdWNjZWVkLlxuJiM0MztcbiYjNDM7VUFQSSByZWZlcmVuY2VcbiYjNDM7PT09PT09PT09PT09PT1cbiYjNDM7XG4mIzQzO2BgQlBGX1BST0dfTE9BRGBgIChgYHVuaW9uIGJwZl9hdHRyYGApOlxuJiM0MztcbiYjNDM7YGBzaWduYXR1cmVgYCwgYGBzaWduYXR1cmVfc2l6ZWBgXG4mIzQzOyAgICBQb2ludGVyIHRvIGFuZCBsZW5ndGggb2YgdGhlIFBLQ1MjNyBzaWduYXR1cmUgYmxvYi5cbiYjNDM7XG4mIzQzO2Bga2V5cmluZ19pZGBgXG4mIzQzOyAgICBUcnVzdGVkIGtleXJpbmcgc2VsZWN0b3IgKHNlZSBgS2V5cmluZ3NgXykuXG4mIzQzO1xuJiM0MztgYGZkX2FycmF5YGAsIGBgZmRfYXJyYXlfY250YGBcbiYjNDM7ICAgIEFycmF5IG9mIG1hcCBmaWxlIGRlc2NyaXB0b3JzIGJvdW5kIHRvIHRoZSBwcm9ncmFtLiBgYGZkX2FycmF5X2NudGBgIG11c3QgYmVcbiYjNDM7ICAgIHNldCBmb3IgdGhlIGtlcm5lbCB0byBzY2FuIHRoZSBhcnJheS4gV2hlbiBhIHNpZ25hdHVyZSBpcyBwcmVzZW50LCBldmVyeSBtYXBcbiYjNDM7ICAgIGluIHRoZSBhcnJheSBtdXN0IGJlIGV4Y2x1c2l2ZTsgaXRzIGZyb3plbiBjb250ZW50cyBhcmUgZm9sZGVkIGludG8gdGhlXG4mIzQzOyAgICB2ZXJpZmllZCBidWZmZXIsIGFuZCBhIG5vbi1leGNsdXNpdmUgZW50cnkgaXMgcmVqZWN0ZWQuXG4mIzQzO1xuJiM0MztgYEJQRl9NQVBfQ1JFQVRFYGAgKGBgdW5pb24gYnBmX2F0dHJgYCk6XG4mIzQzO1xuJiM0MztgYGV4Y2xfcHJvZ19oYXNoYGAsIGBgZXhjbF9wcm9nX2hhc2hfc2l6ZWBgXG4mIzQzOyAgICBTSEEtMjU2IGRpZ2VzdCBvZiB0aGUgcHJvZ3JhbSBwZXJtaXR0ZWQgdG8gYWNjZXNzIHRoaXMgKGV4Y2x1c2l2ZSkgbWFwLiBUaGlzXG4mIzQzOyAgICBiaW5kcyB0aGUgbWV0YWRhdGEgbWFwIHRvIHRoZSBsb2FkZXI7IGl0IGlzIG5vdCBhIGhhc2ggb2YgdGhlIG1hcCAqY29udGVudCouXG4mIzQzOyAgICBUaGUgbWFwIGNvbnRlbnQgaXMgbm90IGhhc2hlZCBzZXBhcmF0ZWx5IGF0IGFsbCAtIGl0IGlzIGNvdmVyZWQsIGFzIGJ5dGVzLFxuJiM0MzsgICAgYnkgdGhlIHByb2dyYW0gc2lnbmF0dXJlLlxuJiM0MztcbiYjNDM7Tm90ZXMgYW5kIGxpbWl0YXRpb25zXG4mIzQzOz09PT09PT09PT09PT09PT09PT09PT1cbiYjNDM7XG4mIzQzOy0gVGhlIGluc3RydWN0aW9ucyBwbHVzIGZvbGRlZCBtZXRhZGF0YSBhcmUgdmVyaWZpZWQgYXMgb25lIGBgYnBmX2R5bnB0cmBgLFxuJiM0MzsgIHdoaWNoIGJvdW5kcyB0aGUgY29tYmluZWQgc2l6ZSAoY3VycmVudGx5IH4xNiBNaUIpOyB2ZXJ5IGxhcmdlIG9iamVjdHMgY2FuXG4mIzQzOyAgZXhjZWVkIGl0LlxuJiM0MzstIFRoZSBtZXRhZGF0YSBjb250YWluZXIgaXMgYSBzaW5nbGUtZWxlbWVudCBhcnJheSBtYXAsIGFjY2Vzc2VkIHRocm91Z2hcbiYjNDM7ICBgYG1hcF9kaXJlY3RfdmFsdWVfYWRkcmBgLlxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnBmLmggYi9pbmNsdWRlL2xpbnV4L2JwZi5oXG5pbmRleCBiYTA5Nzk1ZTBiZmRiNy4uMmUwZjEyZmI0Y2VhOGIgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2JwZi5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2JwZi5oXG5AQCAtMjk5LDcgJiM0MzsyOTksNiBAQCBzdHJ1Y3QgYnBmX21hcF9vd25lciB7XG4gXG4gc3RydWN0IGJwZl9tYXAge1xuIFx0dTggc2hhW1NIQTI1Nl9ESUdFU1RfU0laRV07XG4tXHR1MzIgZXhjbDtcbiBcdGNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyAqb3BzO1xuIFx0c3RydWN0IGJwZl9tYXAgKmlubmVyX21hcF9tZXRhO1xuICNpZmRlZiBDT05GSUdfU0VDVVJJVFlcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JwZl92ZXJpZmllci5oIGIvaW5jbHVkZS9saW51eC9icGZfdmVyaWZpZXIuaFxuaW5kZXggNzZiOGI3NjI3YTEwODUuLjMxN2U5OWI5YWNjMGE0IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9icGZfdmVyaWZpZXIuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9icGZfdmVyaWZpZXIuaFxuQEAgLTg5OCw2ICYjNDM7ODk4LDE0IEBAIHN0cnVjdCBicGZfc2NjX2luZm8ge1xuIFxuIHN0cnVjdCBicGZfbGl2ZW5lc3M7XG4gXG4mIzQzO3N0cnVjdCBicGZfZmRfYXJyYXkge1xuJiM0MztcdHVuaW9uIHtcbiYjNDM7XHRcdHN0cnVjdCBicGZfbWFwICptYXA7XG4mIzQzO1x0XHRzdHJ1Y3QgYnRmICpidGY7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHZhbDtcbiYjNDM7XHR9O1xuJiM0Mzt9O1xuJiM0MztcbiAvKiBzaW5nbGUgY29udGFpbmVyIGZvciBhbGwgc3RydWN0c1xuICAqIG9uZSB2ZXJpZmllcl9lbnYgcGVyIGJwZl9jaGVjaygpIGNhbGxcbiAgKi9cbkBAIC05MzksNiAmIzQzOzk0Nyw3IEBAIHN0cnVjdCBicGZfdmVyaWZpZXJfZW52IHtcbiBcdGJvb2wgYnlwYXNzX3NwZWNfdjQ7XG4gXHRib29sIHNlZW5fZGlyZWN0X3dyaXRlO1xuIFx0Ym9vbCBzZWVuX2V4Y2VwdGlvbjtcbiYjNDM7XHRib29sIHNpZ25hdHVyZTtcbiBcdHN0cnVjdCBicGZfaW5zbl9hdXhfZGF0YSAqaW5zbl9hdXhfZGF0YTsgLyogYXJyYXkgb2YgcGVyLWluc24gc3RhdGUgKi9cbiBcdGNvbnN0IHN0cnVjdCBicGZfbGluZV9pbmZvICpwcmV2X2xpbmZvO1xuIFx0c3RydWN0IGJwZl92ZXJpZmllcl9sb2cgbG9nO1xuQEAgLTk4OSw3ICYjNDM7OTk4LDE5IEBAIHN0cnVjdCBicGZfdmVyaWZpZXJfZW52IHtcbiBcdHUzMiBmcmVlX2xpc3Rfc2l6ZTtcbiBcdHUzMiBleHBsb3JlZF9zdGF0ZXNfc2l6ZTtcbiBcdHUzMiBudW1fYmFja2VkZ2VzO1xuLVx0YnBmcHRyX3QgZmRfYXJyYXk7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgcHJvZ3JhbSYjMzk7cyBmZF9hcnJheSBjb21lcyBpbiB0d28gc2hhcGVzLCB0b2xkIGFwYXJ0IGJ5IHdoZXRoZXJcbiYjNDM7XHQgKiB0aGUgY2FsbGVyIHBhc3NlZCBmZF9hcnJheV9jbnQuIFRoZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZTpcbiYjNDM7XHQgKiAgLSBjb250aW51b3VzIChmZF9hcnJheV9jbnQgZ2l2ZW4pOiAtXHUwMDNlZmRfYXJyYXkgaG9sZHMgZXZlcnkgZW50cnlcbiYjNDM7XHQgKiAgICByZXNvbHZlZCB0byBpdHMgb2JqZWN0IHVwIGZyb250LCBpbmRleGVkIGJ5IGZkX2FycmF5IHBvc2l0aW9uLFxuJiM0MztcdCAqICAgIHdpdGggLVx1MDAzZWZkX2FycmF5X2NudCBzbG90czsgLVx1MDAzZWZkX2FycmF5X3JhdyBpcyB1bnVzZWQuXG4mIzQzO1x0ICogIC0gc3BhcnNlIChubyBmZF9hcnJheV9jbnQpOiAtXHUwMDNlZmRfYXJyYXkgaXMgTlVMTCwgYW5kIGVudHJpZXMgYXJlXG4mIzQzO1x0ICogICAgcmVhZCBmcm9tIC1cdTAwM2VmZF9hcnJheV9yYXcgKHRoZSBjYWxsZXImIzM5O3MgZmRfYXJyYXkpIGFuZCByZXNvbHZlZFxuJiM0MztcdCAqICAgIG9uIHRoZSBzcG90IGF0IGVhY2ggcmVmZXJlbmNlLlxuJiM0MztcdCAqL1xuJiM0MztcdHN0cnVjdCBicGZfZmRfYXJyYXkgKmZkX2FycmF5O1xuJiM0MztcdHUzMiBmZF9hcnJheV9jbnQ7XG4mIzQzO1x0YnBmcHRyX3QgZmRfYXJyYXlfcmF3O1xuIFxuIFx0LyogYml0IG1hc2sgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIGEgcmVnaXN0ZXIgaGFzIGJlZW4gYWNjZXNzZWRcbiBcdCAqIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGZ1bmN0aW9uIHN0YXRlIHdhcyBwcmludGVkXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9zeXNjYWxsLmMgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xuaW5kZXggNmRiMzA2ZDIzYjQ3OWYuLjM1OGYyYjBjZTJiZDMxIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9zeXNjYWxsLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvc3lzY2FsbC5jXG5AQCAtNDAsNyAmIzQzOzQwLDYgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90cmFjZXBvaW50LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9vdmVyZmxvdy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY29va2llLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC92ZXJpZmljYXRpb24uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zl9pZHMuaFx1MDAzZVxuIFxuICNpbmNsdWRlIFx1MDAzY25ldC9uZXRmaWx0ZXIvbmZfYnBmX2xpbmsuaFx1MDAzZVxuQEAgLTE1OTksMTMgJiM0MzsxNTk4LDYgQEAgc3RhdGljIGludCBtYXBfY3JlYXRlX2FsbG9jKHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl92ZXJcbiBcdFx0XHRlcnIgPSAtRUZBVUxUO1xuIFx0XHRcdGdvdG8gZnJlZV9tYXA7XG4gXHRcdH1cbi1cbi1cdFx0LyogU2VlIGxpYmJwZjogZW1pdF9zaWduYXR1cmVfbWF0Y2goKSAqL1xuLVx0XHRCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGJwZl9tYXAsIGV4Y2wpICE9IFNIQTI1Nl9ESUdFU1RfU0laRSk7XG4tXHRcdEJVSUxEX0JVR19PTighX19zYW1lX3R5cGUobWFwLVx1MDAzZWV4Y2wsIHUzMikpO1xuLVx0XHRCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGJwZl9tYXAsIHNoYSkgICE9IDApO1xuLVx0XHRCVUlMRF9CVUdfT04oIV9fc2FtZV90eXBlKG1hcC1cdTAwM2VzaGEsIHU4W1NIQTI1Nl9ESUdFU1RfU0laRV0pKTtcbi1cdFx0bWFwLVx1MDAzZWV4Y2wgPSAxO1xuIFx0fSBlbHNlIGlmIChhdHRyLVx1MDAzZWV4Y2xfcHJvZ19oYXNoX3NpemUpIHtcbiBcdFx0YnBmX2xvZyhsb2csIFwmIzM0O0ludmFsaWQgZXhjbF9wcm9nX2hhc2hfc2l6ZS5cXG5cJiMzNDspO1xuIFx0XHRlcnIgPSAtRUlOVkFMO1xuQEAgLTI4ODYsNjQgJiM0MzsyODc4LDYgQEAgc3RhdGljIGJvb2wgaXNfcGVyZm1vbl9wcm9nX3R5cGUoZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSlcbiBcdH1cbiB9XG4gXG4tc3RhdGljIGVudW0gYnBmX3NpZ19rZXlyaW5nIGJwZl9jbGFzc2lmeV9rZXlyaW5nKHMzMiBrZXlyaW5nX2lkKVxuLXtcbi1cdHN3aXRjaCAoa2V5cmluZ19pZCkge1xuLVx0Y2FzZSAwOlxuLVx0XHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX0JVSUxUSU47XG4tXHRjYXNlIChzMzIpKHVuc2lnbmVkIGxvbmcpVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklORzpcbi1cdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUlk7XG4tXHRjYXNlIChzMzIpKHVuc2lnbmVkIGxvbmcpVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HOlxuLVx0XHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1BMQVRGT1JNO1xuLVx0ZGVmYXVsdDpcbi1cdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19VU0VSO1xuLVx0fVxuLX1cbi1cbi1zdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl9wcm9nICpwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0cixcbi1cdFx0XHRcdCAgICAgYm9vbCBpc19rZXJuZWwsIHMzMiAqa2V5cmluZ19zZXJpYWwpXG4te1xuLVx0YnBmcHRyX3QgdXNpZyA9IG1ha2VfYnBmcHRyKGF0dHItXHUwMDNlc2lnbmF0dXJlLCBpc19rZXJuZWwpO1xuLVx0c3RydWN0IGJwZl9keW5wdHJfa2VybiBzaWdfcHRyLCBpbnNuc19wdHI7XG4tXHRzdHJ1Y3QgYnBmX2tleSAqa2V5ID0gTlVMTDtcbi1cdHZvaWQgKnNpZztcbi1cdGludCBlcnIgPSAwO1xuLVxuLVx0Lypcbi1cdCAqIERvbiYjMzk7dCBhdHRlbXB0IHRvIHVzZSBrbWFsbG9jX2xhcmdlIG9yIHZtYWxsb2MgZm9yIHNpZ25hdHVyZXMuXG4tXHQgKiBQcmFjdGljYWwgc2lnbmF0dXJlIGZvciBCUEYgcHJvZ3JhbSBzaG91bGQgYmUgYmVsb3cgdGhpcyBsaW1pdC5cbi1cdCAqL1xuLVx0aWYgKGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUgXHUwMDNlIEtNQUxMT0NfTUFYX0NBQ0hFX1NJWkUpXG4tXHRcdHJldHVybiAtRUlOVkFMO1xuLVxuLVx0aWYgKHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItXHUwMDNla2V5cmluZ19pZCkgPT0gMClcbi1cdFx0a2V5ID0gYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KGF0dHItXHUwMDNla2V5cmluZ19pZCk7XG4tXHRlbHNlXG4tXHRcdGtleSA9IGJwZl9sb29rdXBfdXNlcl9rZXkoYXR0ci1cdTAwM2VrZXlyaW5nX2lkLCAwKTtcbi1cbi1cdGlmICgha2V5KVxuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbi1cdHNpZyA9IGt2bWVtZHVwX2JwZnB0cih1c2lnLCBhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplKTtcbi1cdGlmIChJU19FUlIoc2lnKSkge1xuLVx0XHRicGZfa2V5X3B1dChrZXkpO1xuLVx0XHRyZXR1cm4gUFRSX0VSUihzaWcpO1xuLVx0fVxuLVxuLVx0YnBmX2R5bnB0cl9pbml0KFx1MDAyNnNpZ19wdHIsIHNpZywgQlBGX0RZTlBUUl9UWVBFX0xPQ0FMLCAwLFxuLVx0XHRcdGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUpO1xuLVx0YnBmX2R5bnB0cl9pbml0KFx1MDAyNmluc25zX3B0ciwgcHJvZy1cdTAwM2VpbnNuc2ksIEJQRl9EWU5QVFJfVFlQRV9MT0NBTCwgMCxcbi1cdFx0XHRwcm9nLVx1MDAzZWxlbiAqIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pKTtcbi1cbi1cdGVyciA9IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKChzdHJ1Y3QgYnBmX2R5bnB0ciAqKVx1MDAyNmluc25zX3B0cixcbi1cdFx0XHRcdFx0IChzdHJ1Y3QgYnBmX2R5bnB0ciAqKVx1MDAyNnNpZ19wdHIsIGtleSk7XG4tXHRpZiAoIWVycilcbi1cdFx0KmtleXJpbmdfc2VyaWFsID0gYnBmX2tleV9zZXJpYWwoa2V5KTtcbi1cdGJwZl9rZXlfcHV0KGtleSk7XG4tXHRrdmZyZWUoc2lnKTtcbi1cdHJldHVybiBlcnI7XG4tfVxuLVxuIHN0YXRpYyBpbnQgYnBmX3Byb2dfbWFya19pbnNuX2FycmF5c19yZWFkeShzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpXG4ge1xuIFx0aW50IGVycjtcbkBAIC0zMTMzLDE3ICYjNDM7MzA2Nyw4IEBAIHN0YXRpYyBpbnQgYnBmX3Byb2dfbG9hZCh1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0XG4gXG4gXHQvKiBlQlBGIHByb2dyYW1zIG11c3QgYmUgR1BMIGNvbXBhdGlibGUgdG8gdXNlIEdQTC1lZCBmdW5jdGlvbnMgKi9cbiBcdHByb2ctXHUwMDNlZ3BsX2NvbXBhdGlibGUgPSBsaWNlbnNlX2lzX2dwbF9jb21wYXRpYmxlKGxpY2Vuc2UpID8gMSA6IDA7XG4tXHRpZiAoYXR0ci1cdTAwM2VzaWduYXR1cmUpIHtcbi1cdFx0ZXJyID0gYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShwcm9nLCBhdHRyLCB1YXR0ci5pc19rZXJuZWwsXG4tXHRcdFx0XHRcdFx0XHUwMDI2cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLmtleXJpbmdfc2VyaWFsKTtcbi1cdFx0aWYgKGVycilcbi1cdFx0XHRnb3RvIGZyZWVfcHJvZztcbi1cdFx0cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLmtleXJpbmdfdHlwZSA9IGJwZl9jbGFzc2lmeV9rZXlyaW5nKGF0dHItXHUwMDNla2V5cmluZ19pZCk7XG4tXHRcdHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy52ZXJkaWN0ID0gQlBGX1NJR19WRVJJRklFRDtcbi1cdH0gZWxzZSB7XG4tXHRcdHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3R5cGUgPSBCUEZfU0lHX0tFWVJJTkdfTk9ORTtcbi1cdFx0cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLnZlcmRpY3QgPSBCUEZfU0lHX1VOU0lHTkVEO1xuLVx0fVxuJiM0MztcdHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3R5cGUgPSBCUEZfU0lHX0tFWVJJTkdfTk9ORTtcbiYjNDM7XHRwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcudmVyZGljdCA9IEJQRl9TSUdfVU5TSUdORUQ7XG4gXHRwcm9nLVx1MDAzZW9yaWdfcHJvZyA9IE5VTEw7XG4gXHRwcm9nLVx1MDAzZWppdGVkID0gMDtcbiBcbkBAIC0zMTg5LDEwICYjNDM7MzExNCw2IEBAIHN0YXRpYyBpbnQgYnBmX3Byb2dfbG9hZCh1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0XG4gXHRpZiAoZXJyIFx1MDAzYyAwKVxuIFx0XHRnb3RvIGZyZWVfcHJvZztcbiBcbi1cdGVyciA9IHNlY3VyaXR5X2JwZl9wcm9nX2xvYWQocHJvZywgYXR0ciwgdG9rZW4sIHVhdHRyLmlzX2tlcm5lbCk7XG4tXHRpZiAoZXJyKVxuLVx0XHRnb3RvIGZyZWVfcHJvZztcbi1cbiBcdC8qIHJ1biBlQlBGIHZlcmlmaWVyICovXG4gXHRlcnIgPSBicGZfY2hlY2soXHUwMDI2cHJvZywgYXR0ciwgdWF0dHIsIGF0dHJfbG9nKTtcbiBcdGlmIChlcnIgXHUwMDNjIDApXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jXG5pbmRleCBkNDZmN2RiMjBkOGYwNC4uNjVmNTMxMjhmYzMzZDYgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuQEAgLTIyLDYgJiM0MzsyMiw4IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY3R5cGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2Vycm9yLWluamVjdGlvbi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmX2xzbS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NlY3VyaXR5LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvdmVyaWZpY2F0aW9uLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9idGZfaWRzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wb2lzb24uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG5AQCAtMjQ5MCw2ICYjNDM7MjQ5Miw4MyBAQCBpbnQgYnBmX2dldF9rZnVuY19hZGRyKGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZywgdTMyIGZ1bmNfaWQsXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4mIzQzOyNkZWZpbmUgQlBGX0ZEX1NMT1RfQlRGXHQxVUxcbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGZkX3Nsb3Rfc2V0X21hcChzdHJ1Y3QgYnBmX2ZkX2FycmF5ICpzbG90LCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuJiM0Mzt7XG4mIzQzO1x0c2xvdC1cdTAwM2V2YWwgPSAodW5zaWduZWQgbG9uZyltYXA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGZkX3Nsb3Rfc2V0X2J0ZihzdHJ1Y3QgYnBmX2ZkX2FycmF5ICpzbG90LCBzdHJ1Y3QgYnRmICpidGYpXG4mIzQzO3tcbiYjNDM7XHRzbG90LVx1MDAzZXZhbCA9ICh1bnNpZ25lZCBsb25nKWJ0ZiB8IEJQRl9GRF9TTE9UX0JURjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBicGZfbWFwICpmZF9zbG90X21hcChzdHJ1Y3QgYnBmX2ZkX2FycmF5IHNsb3QpXG4mIzQzO3tcbiYjNDM7XHRpZiAoc2xvdC52YWwgXHUwMDI2IEJQRl9GRF9TTE9UX0JURilcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdHJldHVybiAoc3RydWN0IGJwZl9tYXAgKilzbG90LnZhbDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBidGYgKmZkX3Nsb3RfYnRmKHN0cnVjdCBicGZfZmRfYXJyYXkgc2xvdClcbiYjNDM7e1xuJiM0MztcdGlmICghKHNsb3QudmFsIFx1MDAyNiBCUEZfRkRfU0xPVF9CVEYpKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0cmV0dXJuIChzdHJ1Y3QgYnRmICopKHNsb3QudmFsIFx1MDAyNiB+QlBGX0ZEX1NMT1RfQlRGKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBidGYgKlxuJiM0MztmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZjtcbiYjNDM7XG4mIzQzO1x0aWYgKGlkeCBcdTAwM2U9IGVudi1cdTAwM2VmZF9hcnJheV9jbnQpIHtcbiYjNDM7XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtrZnVuYyBmZF9pZHggJXUgb3V0IG9mIGJvdW5kcywgZmRfYXJyYXlfY250ICV1XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRpZHgsIGVudi1cdTAwM2VmZF9hcnJheV9jbnQpO1xuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4mIzQzO1x0fVxuJiM0MztcdGJ0ZiA9IGZkX3Nsb3RfYnRmKGVudi1cdTAwM2VmZF9hcnJheVtpZHhdKTtcbiYjNDM7XHRpZiAoIWJ0Zikge1xuJiM0MztcdFx0dmVyYm9zZShlbnYsIFwmIzM0O2tmdW5jIGZkX2lkeCAldSBpcyBub3QgYSBtb2R1bGUgQlRGXFxuXCYjMzQ7LCBpZHgpO1xuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4mIzQzO1x0fVxuJiM0MztcdGJ0Zl9nZXQoYnRmKTtcbiYjNDM7XHRyZXR1cm4gYnRmO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IGJ0ZiAqXG4mIzQzO2ZkX2FycmF5X2dldF9idGZfc3BhcnNlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnRmICpidGY7XG4mIzQzO1x0aW50IGJ0Zl9mZDtcbiYjNDM7XG4mIzQzO1x0aWYgKGNvcHlfZnJvbV9icGZwdHJfb2Zmc2V0KFx1MDAyNmJ0Zl9mZCwgZW52LVx1MDAzZWZkX2FycmF5X3JhdyxcbiYjNDM7XHRcdFx0XHQgICAgKHNpemVfdClpZHggKiBzaXplb2YoYnRmX2ZkKSwgc2l6ZW9mKGJ0Zl9mZCkpKVxuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XG4mIzQzO1x0YnRmID0gYnRmX2dldF9ieV9mZChidGZfZmQpO1xuJiM0MztcdGlmIChJU19FUlIoYnRmKSkge1xuJiM0MztcdFx0dmVyYm9zZShlbnYsIFwmIzM0O2ludmFsaWQgbW9kdWxlIEJURiBmZCBzcGVjaWZpZWRcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIGJ0ZjtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIGJ0ZjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBidGYgKmZkX2FycmF5X2dldF9idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcbiYjNDM7e1xuJiM0MztcdGlmIChlbnYtXHUwMDNlc2lnbmF0dXJlKSB7XG4mIzQzO1x0XHR2ZXJib3NlKGVudiwgXCYjMzQ7c2lnbmVkIHByb2dyYW0gY2Fubm90IGJpbmQgYW55IEJURlxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGVudi1cdTAwM2VmZF9hcnJheSlcbiYjNDM7XHRcdHJldHVybiBmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXMoZW52LCBpZHgpO1xuJiM0MztcdGlmICghYnBmcHRyX2lzX251bGwoZW52LVx1MDAzZWZkX2FycmF5X3JhdykpXG4mIzQzO1x0XHRyZXR1cm4gZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2UoZW52LCBpZHgpO1xuJiM0MztcbiYjNDM7XHR2ZXJib3NlKGVudiwgXCYjMzQ7a2Z1bmMgb2Zmc2V0IFx1MDAzZSAwIHdpdGhvdXQgZmRfYXJyYXkgaXMgaW52YWxpZFxcblwmIzM0Oyk7XG4mIzQzO1x0cmV0dXJuIEVSUl9QVFIoLUVQUk9UTyk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIHN0cnVjdCBidGYgKl9fZmluZF9rZnVuY19kZXNjX2J0ZihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuIFx0XHRcdFx0XHQgczE2IG9mZnNldClcbiB7XG5AQCAtMjQ5OCw3ICYjNDM7MjU3Nyw2IEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpfX2ZpbmRfa2Z1bmNfZGVzY19idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiBcdHN0cnVjdCBicGZfa2Z1bmNfYnRmICpiO1xuIFx0c3RydWN0IG1vZHVsZSAqbW9kO1xuIFx0c3RydWN0IGJ0ZiAqYnRmO1xuLVx0aW50IGJ0Zl9mZDtcbiBcbiBcdHRhYiA9IGVudi1cdTAwM2Vwcm9nLVx1MDAzZWF1eC1cdTAwM2VrZnVuY19idGZfdGFiO1xuIFx0YiA9IGJzZWFyY2goXHUwMDI2a2ZfYnRmLCB0YWItXHUwMDNlZGVzY3MsIHRhYi1cdTAwM2Vucl9kZXNjcyxcbkBAIC0yNTA5LDIyICYjNDM7MjU4Nyw5IEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpfX2ZpbmRfa2Z1bmNfZGVzY19idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiBcdFx0XHRyZXR1cm4gRVJSX1BUUigtRTJCSUcpO1xuIFx0XHR9XG4gXG4tXHRcdGlmIChicGZwdHJfaXNfbnVsbChlbnYtXHUwMDNlZmRfYXJyYXkpKSB7XG4tXHRcdFx0dmVyYm9zZShlbnYsIFwmIzM0O2tmdW5jIG9mZnNldCBcdTAwM2UgMCB3aXRob3V0IGZkX2FycmF5IGlzIGludmFsaWRcXG5cJiMzNDspO1xuLVx0XHRcdHJldHVybiBFUlJfUFRSKC1FUFJPVE8pO1xuLVx0XHR9XG4tXG4tXHRcdGlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldChcdTAwMjZidGZfZmQsIGVudi1cdTAwM2VmZF9hcnJheSxcbi1cdFx0XHRcdFx0ICAgIG9mZnNldCAqIHNpemVvZihidGZfZmQpLFxuLVx0XHRcdFx0XHQgICAgc2l6ZW9mKGJ0Zl9mZCkpKVxuLVx0XHRcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xuLVxuLVx0XHRidGYgPSBidGZfZ2V0X2J5X2ZkKGJ0Zl9mZCk7XG4tXHRcdGlmIChJU19FUlIoYnRmKSkge1xuLVx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtpbnZhbGlkIG1vZHVsZSBCVEYgZmQgc3BlY2lmaWVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdGJ0ZiA9IGZkX2FycmF5X2dldF9idGYoZW52LCBvZmZzZXQpO1xuJiM0MztcdFx0aWYgKElTX0VSUihidGYpKVxuIFx0XHRcdHJldHVybiBidGY7XG4tXHRcdH1cbi1cbiBcdFx0aWYgKCFidGZfaXNfbW9kdWxlKGJ0ZikpIHtcbiBcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7QlRGIGZkIGZvciBrZnVuYyBpcyBub3QgYSBtb2R1bGUgQlRGXFxuXCYjMzQ7KTtcbiBcdFx0XHRidGZfcHV0KGJ0Zik7XG5AQCAtMTc1ODksNiAmIzQzOzE3NjU0LDExIEBAIHN0YXRpYyBpbnQgX19hZGRfdXNlZF9idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJ0ZiAqYnRmKVxuIFx0XHRpZiAoZW52LVx1MDAzZXVzZWRfYnRmc1tpXS5idGYgPT0gYnRmKVxuIFx0XHRcdGdvdG8gcmV0X3B1dDtcbiBcbiYjNDM7XHRpZiAoZW52LVx1MDAzZXNpZ25hdHVyZSkge1xuJiM0MztcdFx0dmVyYm9zZShlbnYsIFwmIzM0O3NpZ25lZCBwcm9ncmFtIGNhbm5vdCBiaW5kIGFueSBCVEZcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0ID0gLUVBQ0NFUztcbiYjNDM7XHRcdGdvdG8gcmV0X3B1dDtcbiYjNDM7XHR9XG4gXHRpZiAoZW52LVx1MDAzZXVzZWRfYnRmX2NudCBcdTAwM2U9IE1BWF9VU0VEX0JURlMpIHtcbiBcdFx0dmVyYm9zZShlbnYsIFwmIzM0O1RoZSB0b3RhbCBudW1iZXIgb2YgYnRmcyBwZXIgcHJvZ3JhbSBoYXMgcmVhY2hlZCB0aGUgbGltaXQgb2YgJXVcXG5cJiMzNDssXG4gXHRcdFx0TUFYX1VTRURfQlRGUyk7XG5AQCAtMTc4NzEsNiAmIzQzOzE3OTQxLDEyIEBAIHN0YXRpYyBpbnQgX19hZGRfdXNlZF9tYXAoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9tYXAgKm1hcClcbiBcdFx0aWYgKGVudi1cdTAwM2V1c2VkX21hcHNbaV0gPT0gbWFwKVxuIFx0XHRcdHJldHVybiBpO1xuIFxuJiM0MztcdGlmIChlbnYtXHUwMDNlc2lnbmF0dXJlIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBlbnYtXHUwMDNlcHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLnZlcmRpY3QgPT0gQlBGX1NJR19WRVJJRklFRCkge1xuJiM0MztcdFx0dmVyYm9zZShlbnYsIFwmIzM0O3NpZ25lZCBwcm9ncmFtIGNhbm5vdCBiaW5kIG1hcCAmIzM5OyVzJiMzOTsgbm90IGNvdmVyZWQgYnkgdGhlIHNpZ25hdHVyZVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0bWFwLVx1MDAzZW5hbWUpO1xuJiM0MztcdFx0cmV0dXJuIC1FQUNDRVM7XG4mIzQzO1x0fVxuIFx0aWYgKGVudi1cdTAwM2V1c2VkX21hcF9jbnQgXHUwMDNlPSBNQVhfVVNFRF9NQVBTKSB7XG4gXHRcdHZlcmJvc2UoZW52LCBcJiMzNDtUaGUgdG90YWwgbnVtYmVyIG9mIG1hcHMgcGVyIHByb2dyYW0gaGFzIHJlYWNoZWQgdGhlIGxpbWl0IG9mICV1XFxuXCYjMzQ7LFxuIFx0XHRcdE1BWF9VU0VEX01BUFMpO1xuQEAgLTE3OTIzLDYgJiM0MzsxNzk5OSw0OCBAQCBzdGF0aWMgaW50IGFkZF91c2VkX21hcChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgZmQpXG4gXHRyZXR1cm4gX19hZGRfdXNlZF9tYXAoZW52LCBtYXApO1xuIH1cbiBcbiYjNDM7c3RhdGljIGludCBmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX21hcCAqbWFwO1xuJiM0MztcbiYjNDM7XHRpZiAoaWR4IFx1MDAzZT0gZW52LVx1MDAzZWZkX2FycmF5X2NudCkge1xuJiM0MztcdFx0dmVyYm9zZShlbnYsIFwmIzM0O2ZkX2lkeCAldSBvdXQgb2YgYm91bmRzLCBmZF9hcnJheV9jbnQgJXVcXG5cJiMzNDssXG4mIzQzO1x0XHRcdGlkeCwgZW52LVx1MDAzZWZkX2FycmF5X2NudCk7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1x0bWFwID0gZmRfc2xvdF9tYXAoZW52LVx1MDAzZWZkX2FycmF5W2lkeF0pO1xuJiM0MztcdGlmICghbWFwKSB7XG4mIzQzO1x0XHR2ZXJib3NlKGVudiwgXCYjMzQ7ZmRfaWR4ICV1IGlzIG5vdCBhIG1hcFxcblwmIzM0OywgaWR4KTtcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gX19hZGRfdXNlZF9tYXAoZW52LCBtYXApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxuJiM0Mzt7XG4mIzQzO1x0aW50IGZkO1xuJiM0MztcbiYjNDM7XHRpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoXHUwMDI2ZmQsIGVudi1cdTAwM2VmZF9hcnJheV9yYXcsXG4mIzQzO1x0XHRcdFx0ICAgIChzaXplX3QpaWR4ICogc2l6ZW9mKGZkKSwgc2l6ZW9mKGZkKSkpXG4mIzQzO1x0XHRyZXR1cm4gLUVGQVVMVDtcbiYjNDM7XHRyZXR1cm4gYWRkX3VzZWRfbWFwKGVudiwgZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGZkX2FycmF5X2dldF9tYXBfaWR4KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXG4mIzQzO3tcbiYjNDM7XHRpZiAoZW52LVx1MDAzZWZkX2FycmF5KVxuJiM0MztcdFx0cmV0dXJuIGZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXMoZW52LCBpZHgpO1xuJiM0MztcdGlmIChlbnYtXHUwMDNlc2lnbmF0dXJlKSB7XG4mIzQzO1x0XHR2ZXJib3NlKGVudiwgXCYjMzQ7c2lnbmVkIHByb2dyYW0gbXVzdCBiaW5kIG1hcHMgdmlhIGEgY29udGludW91cyBmZF9hcnJheSAoZmRfYXJyYXlfY250KVxcblwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gLUVBQ0NFUztcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFicGZwdHJfaXNfbnVsbChlbnYtXHUwMDNlZmRfYXJyYXlfcmF3KSlcbiYjNDM7XHRcdHJldHVybiBmZF9hcnJheV9nZXRfbWFwX2lkeF9zcGFyc2UoZW52LCBpZHgpO1xuJiM0MztcbiYjNDM7XHR2ZXJib3NlKGVudiwgXCYjMzQ7ZmRfaWR4IHdpdGhvdXQgZmRfYXJyYXkgaXMgaW52YWxpZFxcblwmIzM0Oyk7XG4mIzQzO1x0cmV0dXJuIC1FUFJPVE87XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGludCBjaGVja19hbHVfZmllbGRzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbilcbiB7XG4gXHR1OCBjbGFzcyA9IEJQRl9DTEFTUyhpbnNuLVx1MDAzZWNvZGUpO1xuQEAgLTE4MTQwLDcgJiM0MzsxODI1OCw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfYW5kX3Jlc29sdmVfaW5zbnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcbiBcdFx0XHRzdHJ1Y3QgYnBmX21hcCAqbWFwO1xuIFx0XHRcdGludCBtYXBfaWR4O1xuIFx0XHRcdHU2NCBhZGRyO1xuLVx0XHRcdHUzMiBmZDtcbiBcbiBcdFx0XHRpZiAoaSA9PSBpbnNuX2NudCAtIDEgfHwgaW5zblsxXS5jb2RlICE9IDAgfHxcbiBcdFx0XHQgICAgaW5zblsxXS5kc3RfcmVnICE9IDAgfHwgaW5zblsxXS5zcmNfcmVnICE9IDAgfHxcbkBAIC0xODE5MiwyMSAmIzQzOzE4MzA5LDE3IEBAIHN0YXRpYyBpbnQgY2hlY2tfYW5kX3Jlc29sdmVfaW5zbnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcbiBcdFx0XHRzd2l0Y2ggKGluc25bMF0uc3JjX3JlZykge1xuIFx0XHRcdGNhc2UgQlBGX1BTRVVET19NQVBfSURYX1ZBTFVFOlxuIFx0XHRcdGNhc2UgQlBGX1BTRVVET19NQVBfSURYOlxuLVx0XHRcdFx0aWYgKGJwZnB0cl9pc19udWxsKGVudi1cdTAwM2VmZF9hcnJheSkpIHtcbi1cdFx0XHRcdFx0dmVyYm9zZShlbnYsIFwmIzM0O2ZkX2lkeCB3aXRob3V0IGZkX2FycmF5IGlzIGludmFsaWRcXG5cJiMzNDspO1xuLVx0XHRcdFx0XHRyZXR1cm4gLUVQUk9UTztcbi1cdFx0XHRcdH1cbi1cdFx0XHRcdGlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldChcdTAwMjZmZCwgZW52LVx1MDAzZWZkX2FycmF5LFxuLVx0XHRcdFx0XHRcdFx0ICAgIGluc25bMF0uaW1tICogc2l6ZW9mKGZkKSxcbi1cdFx0XHRcdFx0XHRcdCAgICBzaXplb2YoZmQpKSlcbi1cdFx0XHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4mIzQzO1x0XHRcdFx0bWFwX2lkeCA9IGZkX2FycmF5X2dldF9tYXBfaWR4KGVudiwgaW5zblswXS5pbW0pO1xuIFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0ZGVmYXVsdDpcbi1cdFx0XHRcdGZkID0gaW5zblswXS5pbW07XG4mIzQzO1x0XHRcdFx0aWYgKGVudi1cdTAwM2VzaWduYXR1cmUpIHtcbiYjNDM7XHRcdFx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtzaWduZWQgcHJvZ3JhbSBjYW5ub3QgcmVmZXJlbmNlIGEgbWFwIGJ5IGZkLCBvbmx5IHZpYSBmZF9hcnJheSBpbmRleFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHRcdFx0XHR9XG4mIzQzO1x0XHRcdFx0bWFwX2lkeCA9IGFkZF91c2VkX21hcChlbnYsIGluc25bMF0uaW1tKTtcbiBcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdH1cbiBcbi1cdFx0XHRtYXBfaWR4ID0gYWRkX3VzZWRfbWFwKGVudiwgZmQpO1xuIFx0XHRcdGlmIChtYXBfaWR4IFx1MDAzYyAwKVxuIFx0XHRcdFx0cmV0dXJuIG1hcF9pZHg7XG4gXHRcdFx0bWFwID0gZW52LVx1MDAzZXVzZWRfbWFwc1ttYXBfaWR4XTtcbkBAIC0xOTQ4MSw3ICYjNDM7MTk1OTQsNyBAQCBzdHJ1Y3QgYnRmICpicGZfZ2V0X2J0Zl92bWxpbnV4KHZvaWQpXG4gICogdGhpcyBjYXNlIGV4cGVjdCB0aGF0IGV2ZXJ5IGZpbGUgZGVzY3JpcHRvciBpbiB0aGUgYXJyYXkgaXMgZWl0aGVyIGEgbWFwIG9yXG4gICogYSBCVEYuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBjb25zaWRlcmVkIHRvIGJlIHRyYXNoLlxuICAqL1xuLXN0YXRpYyBpbnQgYWRkX2ZkX2Zyb21fZmRfYXJyYXkoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGZkKVxuJiM0MztzdGF0aWMgaW50IGFkZF9mZF9mcm9tX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgsIGludCBmZClcbiB7XG4gXHRzdHJ1Y3QgYnBmX21hcCAqbWFwO1xuIFx0c3RydWN0IGJ0ZiAqYnRmO1xuQEAgLTE5NDkzLDUxICYjNDM7MTk2MDYsODMgQEAgc3RhdGljIGludCBhZGRfZmRfZnJvbV9mZF9hcnJheShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgZmQpXG4gXHRcdGVyciA9IF9fYWRkX3VzZWRfbWFwKGVudiwgbWFwKTtcbiBcdFx0aWYgKGVyciBcdTAwM2MgMClcbiBcdFx0XHRyZXR1cm4gZXJyO1xuJiM0MztcdFx0ZmRfc2xvdF9zZXRfbWFwKFx1MDAyNmVudi1cdTAwM2VmZF9hcnJheVtpZHhdLCBtYXApO1xuIFx0XHRyZXR1cm4gMDtcbiBcdH1cbiBcbiBcdGJ0ZiA9IF9fYnRmX2dldF9ieV9mZChmKTtcbiBcdGlmICghSVNfRVJSKGJ0ZikpIHtcbiBcdFx0YnRmX2dldChidGYpO1xuLVx0XHRyZXR1cm4gX19hZGRfdXNlZF9idGYoZW52LCBidGYpO1xuJiM0MztcdFx0ZXJyID0gX19hZGRfdXNlZF9idGYoZW52LCBidGYpO1xuJiM0MztcdFx0aWYgKGVyciBcdTAwM2MgMClcbiYjNDM7XHRcdFx0cmV0dXJuIGVycjtcbiYjNDM7XHRcdGZkX3Nsb3Rfc2V0X2J0ZihcdTAwMjZlbnYtXHUwMDNlZmRfYXJyYXlbaWR4XSwgYnRmKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuIFx0fVxuIFxuIFx0dmVyYm9zZShlbnYsIFwmIzM0O2ZkICVkIGlzIG5vdCBwb2ludGluZyB0byB2YWxpZCBicGZfbWFwIG9yIGJ0ZlxcblwmIzM0OywgZmQpO1xuIFx0cmV0dXJuIFBUUl9FUlIobWFwKTtcbiB9XG4gXG4tc3RhdGljIGludCBwcm9jZXNzX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cilcbiYjNDM7LypcbiYjNDM7ICogQSBjb250aW51b3VzIGZkX2FycmF5IGlzIHJlc29sdmVkIGludG8gYW4gaW4tbWVtb3J5IGNhY2hlIHdpdGggb25lIHNsb3RcbiYjNDM7ICogcGVyIGVudHJ5LiBUaGUgYm91bmQgaGVyZSBpcyBkZWxpYmVyYXRlbHkgZ2VuZXJvdXMgYW5kIG5vdCBkZXJpdmVkIGZyb21cbiYjNDM7ICogdGhlIHBlci1wcm9ncmFtIG9iamVjdCBsaW1pdHM6IER1cGxpY2F0ZSBlbnRyaWVzIC9hcmUvIHBlcm1pdHRlZCwgYW5kXG4mIzQzOyAqIHRoZSBudW1iZXIgb2YgZGlzdGluY3QgbWFwcyBhbmQgQlRGcyBhIHByb2dyYW0gY2FuIGJpbmQgaXMgZW5mb3JjZWQgd2hlblxuJiM0MzsgKiBlYWNoIGVudHJ5IGlzIHJlc29sdmVkIGJ5IF9fYWRkX3VzZWRfbWFwKCkgYW5kIF9fYWRkX3VzZWRfYnRmKCkuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIE1BWF9GRF9BUlJBWV9DTlQgNDA5NlxuJiM0MztcbiYjNDM7c3RhdGljIGludCBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiYjNDM7XHRcdFx0XHQgICAgICAgYnBmcHRyX3QgZmRfYXJyYXksIHUzMiBjbnQpXG4ge1xuLVx0c2l6ZV90IHNpemUgPSBzaXplb2YoaW50KTtcbi1cdGludCByZXQ7XG4tXHRpbnQgZmQ7XG4mIzQzO1x0aW50IGZkLCByZXQ7XG4gXHR1MzIgaTtcbiBcbi1cdGVudi1cdTAwM2VmZF9hcnJheSA9IG1ha2VfYnBmcHRyKGF0dHItXHUwMDNlZmRfYXJyYXksIHVhdHRyLmlzX2tlcm5lbCk7XG4tXG4tXHQvKlxuLVx0ICogVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIG9sZCAobm8gZmRfYXJyYXlfY250IGlzIGdpdmVuKSBhbmQgbmV3XG4tXHQgKiBBUElzIGlzIHRoYXQgaW4gdGhlIGxhdHRlciBjYXNlIHRoZSBmZF9hcnJheSBpcyBleHBlY3RlZCB0byBiZVxuLVx0ICogY29udGludW91cyBhbmQgaXMgc2Nhbm5lZCBmb3IgbWFwIGZkcyByaWdodCBhd2F5XG4tXHQgKi9cbi1cdGlmICghYXR0ci1cdTAwM2VmZF9hcnJheV9jbnQpXG4tXHRcdHJldHVybiAwO1xuLVxuLVx0LyogQ2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3cgKi9cbi1cdGlmIChhdHRyLVx1MDAzZWZkX2FycmF5X2NudCBcdTAwM2U9IChVMzJfTUFYIC8gc2l6ZSkpIHtcbi1cdFx0dmVyYm9zZShlbnYsIFwmIzM0O2ZkX2FycmF5X2NudCBpcyB0b28gYmlnICgldSlcXG5cJiMzNDssIGF0dHItXHUwMDNlZmRfYXJyYXlfY250KTtcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0aWYgKGNudCBcdTAwM2UgTUFYX0ZEX0FSUkFZX0NOVCkge1xuJiM0MztcdFx0dmVyYm9zZShlbnYsIFwmIzM0O2ZkX2FycmF5IGhhcyB0b28gbWFueSBlbnRyaWVzICgldSwgbWF4ICV1KVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0Y250LCBNQVhfRkRfQVJSQVlfQ05UKTtcbiYjNDM7XHRcdHJldHVybiAtRTJCSUc7XG4gXHR9XG4gXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBhdHRyLVx1MDAzZWZkX2FycmF5X2NudDsgaSYjNDM7JiM0MzspIHtcbi1cdFx0aWYgKGNvcHlfZnJvbV9icGZwdHJfb2Zmc2V0KFx1MDAyNmZkLCBlbnYtXHUwMDNlZmRfYXJyYXksIGkgKiBzaXplLCBzaXplKSlcbiYjNDM7XHRlbnYtXHUwMDNlZmRfYXJyYXkgPSBrdmNhbGxvYyhjbnQsIHNpemVvZigqZW52LVx1MDAzZWZkX2FycmF5KSxcbiYjNDM7XHRcdFx0XHQgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcbiYjNDM7XHRpZiAoIWVudi1cdTAwM2VmZF9hcnJheSlcbiYjNDM7XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcdGVudi1cdTAwM2VmZF9hcnJheV9jbnQgPSBjbnQ7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgY250OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKGNvcHlfZnJvbV9icGZwdHJfb2Zmc2V0KFx1MDAyNmZkLCBmZF9hcnJheSxcbiYjNDM7XHRcdFx0XHRcdCAgICAoc2l6ZV90KWkgKiBzaXplb2YoZmQpLCBzaXplb2YoZmQpKSlcbiBcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbi1cbi1cdFx0cmV0ID0gYWRkX2ZkX2Zyb21fZmRfYXJyYXkoZW52LCBmZCk7XG4mIzQzO1x0XHRyZXQgPSBhZGRfZmRfZnJvbV9mZF9hcnJheShlbnYsIGksIGZkKTtcbiBcdFx0aWYgKHJldClcbiBcdFx0XHRyZXR1cm4gcmV0O1xuIFx0fVxuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4gXG4mIzQzO3N0YXRpYyBpbnQgcHJvY2Vzc19mZF9hcnJheShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuJiM0MztcdFx0XHQgICAgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyKVxuJiM0Mzt7XG4mIzQzO1x0YnBmcHRyX3QgZmRfYXJyYXkgPSBtYWtlX2JwZnB0cihhdHRyLVx1MDAzZWZkX2FycmF5LCB1YXR0ci5pc19rZXJuZWwpO1xuJiM0MztcbiYjNDM7XHRpZiAoYnBmcHRyX2lzX251bGwoZmRfYXJyYXkpKSB7XG4mIzQzO1x0XHRpZiAoYXR0ci1cdTAwM2VmZF9hcnJheV9jbnQpIHtcbiYjNDM7XHRcdFx0dmVyYm9zZShlbnYsIFwmIzM0O2ZkX2FycmF5X2NudCAldSB3aXRob3V0IGZkX2FycmF5IGlzIGludmFsaWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0YXR0ci1cdTAwM2VmZF9hcnJheV9jbnQpO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XHQvKlxuJiM0MztcdCAqIE5ldyBBUEk6IHRoZSBjYWxsZXIgcGFzc2VzIGZkX2FycmF5X2NudCBhbmQgYSBjb250aW51b3VzIGFycmF5IHRoYXRcbiYjNDM7XHQgKiBpcyByZXNvbHZlZCBhbmQgYm91bmQgdXAgZnJvbnQuIExlZ2FjeSBBUEkgKG5vIGZkX2FycmF5X2NudCk6IGtlZXBcbiYjNDM7XHQgKiB0aGUgY2FsbGVyJiMzOTtzIGFycmF5IGFuZCByZXNvbHZlIGVudHJpZXMgb24gdGhlIHNwb3QgYXQgZWFjaCByZWZlcmVuY2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGF0dHItXHUwMDNlZmRfYXJyYXlfY250KVxuJiM0MztcdFx0cmV0dXJuIHByb2Nlc3NfZmRfYXJyYXlfY29udGludW91cyhlbnYsIGZkX2FycmF5LFxuJiM0MztcdFx0XHRcdFx0XHQgICBhdHRyLVx1MDAzZWZkX2FycmF5X2NudCk7XG4mIzQzO1x0ZW52LVx1MDAzZWZkX2FycmF5X3JhdyA9IGZkX2FycmF5O1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuQEAgLTE5NzUyLDYgJiM0MzsxOTg5NywxMzkgQEAgaW50IGJwZl9maXh1cF9rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbixcbiBcdHJldHVybiAwO1xuIH1cbiBcbiYjNDM7c3RhdGljIGVudW0gYnBmX3NpZ19rZXlyaW5nIGJwZl9jbGFzc2lmeV9rZXlyaW5nKHMzMiBrZXlyaW5nX2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3dpdGNoIChrZXlyaW5nX2lkKSB7XG4mIzQzO1x0Y2FzZSAwOlxuJiM0MztcdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19CVUlMVElOO1xuJiM0MztcdGNhc2UgKHMzMikodW5zaWduZWQgbG9uZylWRVJJRllfVVNFX1NFQ09OREFSWV9LRVlSSU5HOlxuJiM0MztcdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUlk7XG4mIzQzO1x0Y2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklORzpcbiYjNDM7XHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk07XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfVVNFUjtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFZlcmlmeSB0aGUgUEtDUyM3IHNpZ25hdHVyZSBvZiBhIGxvYWRlZCBwcm9ncmFtLiBDYWxsZWQgZnJvbSBicGZfY2hlY2soKVxuJiM0MzsgKiBvbmNlIHRoZSBwcm9ncmFtJiMzOTtzIG1ldGFkYXRhIG1hcHMgaGF2ZSBiZWVuIHJlc29sdmVkIGludG8gdXNlZF9tYXBzLCBzb1xuJiM0MzsgKiB0aGUgZXhhY3QgbWFwcyBmb2xkZWQgaW50byB0aGUgc2lnbmF0dXJlIGFyZSB0aGUgb25lcyB0aGUgcHJvZ3JhbSBiaW5kcy5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIHNpZ25hdHVyZSBjb3ZlcnMgdGhlIGluc3RydWN0aW9ucyBmb2xsb3dlZCBieSB0aGUgZnJvemVuIGNvbnRlbnRzIG9mXG4mIzQzOyAqIGVhY2ggbWFwLCBpbiBAbWFwcyBvcmRlcjogaW5zbnMgfHwgbWFwXzAgfHwgbWFwXzEgfHwgWy4uLl0uIE9uIHN1Y2Nlc3MgdGhlXG4mIzQzOyAqIHZlcmRpY3QgYW5kIGtleXJpbmcgaW5mbyBhcmUgcmVjb3JkZWQgb24gcHJvZy1cdTAwM2VhdXguXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiYjNDM7XHRcdFx0XHQgICAgIHVuaW9uIGJwZl9hdHRyICphdHRyLCBib29sIGlzX2tlcm5lbClcbiYjNDM7e1xuJiM0MztcdGJwZnB0cl90IHVzaWcgPSBtYWtlX2JwZnB0cihhdHRyLVx1MDAzZXNpZ25hdHVyZSwgaXNfa2VybmVsKTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuIHNpZ19wdHIsIGRhdGFfcHRyO1xuJiM0MztcdHN0cnVjdCBicGZfcHJvZyAqcHJvZyA9IGVudi1cdTAwM2Vwcm9nO1xuJiM0MztcdHN0cnVjdCBicGZfbWFwICoqbWFwcyA9IGVudi1cdTAwM2V1c2VkX21hcHM7XG4mIzQzO1x0c3RydWN0IGJwZl9rZXkgKmtleSA9IE5VTEw7XG4mIzQzO1x0dm9pZCAqc2lnLCAqZGF0YSA9IE5VTEw7XG4mIzQzO1x0dTMyIG1hcF9jbnQgPSBlbnYtXHUwMDNldXNlZF9tYXBfY250O1xuJiM0MztcdHUzMiBpLCBvZmYsIGluc25zX3N6O1xuJiM0MztcdHU2NCBkYXRhX3N6O1xuJiM0MztcdGludCBlcnIgPSAwO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIERvbiYjMzk7dCBhdHRlbXB0IHRvIHVzZSBrbWFsbG9jX2xhcmdlIG9yIHZtYWxsb2MgZm9yIHNpZ25hdHVyZXMuXG4mIzQzO1x0ICogUHJhY3RpY2FsIHNpZ25hdHVyZSBmb3IgQlBGIHByb2dyYW0gc2hvdWxkIGJlIGJlbG93IHRoaXMgbGltaXQuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUgXHUwMDNlIEtNQUxMT0NfTUFYX0NBQ0hFX1NJWkUpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHRpZiAoc3lzdGVtX2tleXJpbmdfaWRfY2hlY2soYXR0ci1cdTAwM2VrZXlyaW5nX2lkKSA9PSAwKVxuJiM0MztcdFx0a2V5ID0gYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KGF0dHItXHUwMDNla2V5cmluZ19pZCk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0a2V5ID0gYnBmX2xvb2t1cF91c2VyX2tleShhdHRyLVx1MDAzZWtleXJpbmdfaWQsIDApO1xuJiM0MztcdGlmICgha2V5KSB7XG4mIzQzO1x0XHR2ZXJib3NlKGVudiwgXCYjMzQ7Y2Fubm90IHJlc29sdmUgc2lnbmluZyBrZXlyaW5nIHdpdGgga2V5cmluZ19pZCAlZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0YXR0ci1cdTAwM2VrZXlyaW5nX2lkKTtcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c2lnID0ga3ZtZW1kdXBfYnBmcHRyKHVzaWcsIGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUpO1xuJiM0MztcdGlmIChJU19FUlIoc2lnKSkge1xuJiM0MztcdFx0YnBmX2tleV9wdXQoa2V5KTtcbiYjNDM7XHRcdHJldHVybiBQVFJfRVJSKHNpZyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpbnNuc19zeiA9IHByb2ctXHUwMDNlbGVuICogc2l6ZW9mKHN0cnVjdCBicGZfaW5zbik7XG4mIzQzO1x0ZGF0YV9zeiA9IGluc25zX3N6O1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1hcF9jbnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRzdHJ1Y3QgYnBmX21hcCAqbWFwID0gbWFwc1tpXTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAobWFwLVx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9BUlJBWSB8fFxuJiM0MztcdFx0ICAgICFtYXAtXHUwMDNlb3BzLVx1MDAzZW1hcF9kaXJlY3RfdmFsdWVfYWRkcikge1xuJiM0MztcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7c2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICYjMzk7JXMmIzM5OyBtdXN0IGJlIGFuIGFycmF5XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdG1hcC1cdTAwM2VuYW1lKTtcbiYjNDM7XHRcdFx0ZXJyID0gLUVJTlZBTDtcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoIVJFQURfT05DRShtYXAtXHUwMDNlZnJvemVuKSkge1xuJiM0MztcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7c2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICYjMzk7JXMmIzM5OyBtdXN0IGJlIGZyb3plblxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRtYXAtXHUwMDNlbmFtZSk7XG4mIzQzO1x0XHRcdGVyciA9IC1FUEVSTTtcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoIW1hcC1cdTAwM2VleGNsX3Byb2dfc2hhKSB7XG4mIzQzO1x0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtzaWduZWQgcHJvZ3JhbSBtZXRhZGF0YSBtYXAgJiMzOTslcyYjMzk7IG11c3QgYmUgZXhjbHVzaXZlXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdG1hcC1cdTAwM2VuYW1lKTtcbiYjNDM7XHRcdFx0ZXJyID0gLUVQRVJNO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGRhdGFfc3ogJiM0Mzs9IG1hcC1cdTAwM2V2YWx1ZV9zaXplO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9jaGVja19zaXplKGRhdGFfc3opKSB7XG4mIzQzO1x0XHR2ZXJib3NlKGVudiwgXCYjMzQ7c2lnbmVkIHBheWxvYWQgdG9vIGxhcmdlOiAlbGx1IGJ5dGVzXFxuXCYjMzQ7LCBkYXRhX3N6KTtcbiYjNDM7XHRcdGVyciA9IC1FMkJJRztcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XHRkYXRhID0ga3ZtYWxsb2MoZGF0YV9zeiwgR0ZQX0tFUk5FTF9BQ0NPVU5UIHwgX19HRlBfWkVSTyk7XG4mIzQzO1x0aWYgKCFkYXRhKSB7XG4mIzQzO1x0XHRlcnIgPSAtRU5PTUVNO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcdG1lbWNweShkYXRhLCBwcm9nLVx1MDAzZWluc25zaSwgaW5zbnNfc3opO1xuJiM0MztcdG9mZiA9IGluc25zX3N6O1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1hcF9jbnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRzdHJ1Y3QgYnBmX21hcCAqbWFwID0gbWFwc1tpXTtcbiYjNDM7XHRcdHU2NCBhZGRyO1xuJiM0MztcbiYjNDM7XHRcdGVyciA9IG1hcC1cdTAwM2VvcHMtXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyKG1hcCwgXHUwMDI2YWRkciwgMCk7XG4mIzQzO1x0XHRpZiAoZXJyKSB7XG4mIzQzO1x0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtmYWlsZWQgdG8gcmVhZCBzaWduZWQgbWV0YWRhdGEgbWFwICYjMzk7JXMmIzM5OzogJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0bWFwLVx1MDAzZW5hbWUsIGVycik7XG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0fVxuJiM0MztcdFx0bWVtY3B5KGRhdGEgJiM0Mzsgb2ZmLCAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWFkZHIsXG4mIzQzO1x0XHQgICAgICAgbWFwLVx1MDAzZXZhbHVlX3NpemUpO1xuJiM0MztcdFx0b2ZmICYjNDM7PSBtYXAtXHUwMDNldmFsdWVfc2l6ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGJwZl9keW5wdHJfaW5pdChcdTAwMjZkYXRhX3B0ciwgZGF0YSwgQlBGX0RZTlBUUl9UWVBFX0xPQ0FMLCAwLCBkYXRhX3N6KTtcbiYjNDM7XHRicGZfZHlucHRyX2luaXQoXHUwMDI2c2lnX3B0ciwgc2lnLCBCUEZfRFlOUFRSX1RZUEVfTE9DQUwsIDAsXG4mIzQzO1x0XHRcdGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUpO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgoc3RydWN0IGJwZl9keW5wdHIgKilcdTAwMjZkYXRhX3B0cixcbiYjNDM7XHRcdFx0XHRcdCAoc3RydWN0IGJwZl9keW5wdHIgKilcdTAwMjZzaWdfcHRyLCBrZXkpO1xuJiM0MztcdGlmIChlcnIpIHtcbiYjNDM7XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZDogJWRcXG5cJiMzNDssIGVycik7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHBhc3NlZFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcua2V5cmluZ19zZXJpYWwgPSBicGZfa2V5X3NlcmlhbChrZXkpO1xuJiM0MztcdFx0cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLmtleXJpbmdfdHlwZSA9IGJwZl9jbGFzc2lmeV9rZXlyaW5nKGF0dHItXHUwMDNla2V5cmluZ19pZCk7XG4mIzQzO1x0XHRwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcudmVyZGljdCA9IEJQRl9TSUdfVkVSSUZJRUQ7XG4mIzQzO1x0fVxuJiM0MztvdXQ6XG4mIzQzO1x0a3ZmcmVlKGRhdGEpO1xuJiM0MztcdGJwZl9rZXlfcHV0KGtleSk7XG4mIzQzO1x0a3ZmcmVlKHNpZyk7XG4mIzQzO1x0cmV0dXJuIGVycjtcbiYjNDM7fVxuJiM0MztcbiBpbnQgYnBmX2NoZWNrKHN0cnVjdCBicGZfcHJvZyAqKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbiBcdCAgICAgIHN0cnVjdCBicGZfbG9nX2F0dHIgKmF0dHJfbG9nKVxuIHtcbkBAIC0xOTc3NCwxOCAmIzQzOzIwMDUyLDYgQEAgaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXG4gXHRcdHJldHVybiAtRU5PTUVNO1xuIFxuIFx0ZW52LVx1MDAzZWJ0LmVudiA9IGVudjtcbi1cbi1cdGxlbiA9ICgqcHJvZyktXHUwMDNlbGVuO1xuLVx0ZW52LVx1MDAzZWluc25fYXV4X2RhdGEgPVxuLVx0XHR2emFsbG9jKGFycmF5X3NpemUoc2l6ZW9mKHN0cnVjdCBicGZfaW5zbl9hdXhfZGF0YSksIGxlbikpO1xuLVx0cmV0ID0gLUVOT01FTTtcbi1cdGlmICghZW52LVx1MDAzZWluc25fYXV4X2RhdGEpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfZW52O1xuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbGVuOyBpJiM0MzsmIzQzOylcbi1cdFx0ZW52LVx1MDAzZWluc25fYXV4X2RhdGFbaV0ub3JpZ19pZHggPSBpO1xuLVx0ZW52LVx1MDAzZXN1Y2MgPSBicGZfaWFycmF5X3JlYWxsb2MoTlVMTCwgMik7XG4tXHRpZiAoIWVudi1cdTAwM2VzdWNjKVxuLVx0XHRnb3RvIGVycl9mcmVlX2VudjtcbiBcdGVudi1cdTAwM2Vwcm9nID0gKnByb2c7XG4gXHRlbnYtXHUwMDNlb3BzID0gYnBmX3ZlcmlmaWVyX29wc1tlbnYtXHUwMDNlcHJvZy1cdTAwM2V0eXBlXTtcbiBcbkBAIC0xOTc5NCwyMiAmIzQzOzIwMDYwLDUxIEBAIGludCBicGZfY2hlY2soc3RydWN0IGJwZl9wcm9nICoqcHJvZywgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxuIFx0ZW52LVx1MDAzZWJ5cGFzc19zcGVjX3YxID0gYnBmX2J5cGFzc19zcGVjX3YxKGVudi1cdTAwM2Vwcm9nLVx1MDAzZWF1eC1cdTAwM2V0b2tlbik7XG4gXHRlbnYtXHUwMDNlYnlwYXNzX3NwZWNfdjQgPSBicGZfYnlwYXNzX3NwZWNfdjQoZW52LVx1MDAzZXByb2ctXHUwMDNlYXV4LVx1MDAzZXRva2VuKTtcbiBcdGVudi1cdTAwM2VicGZfY2FwYWJsZSA9IGlzX3ByaXYgPSBicGZfdG9rZW5fY2FwYWJsZShlbnYtXHUwMDNlcHJvZy1cdTAwM2VhdXgtXHUwMDNldG9rZW4sIENBUF9CUEYpO1xuLVxuLVx0YnBmX2dldF9idGZfdm1saW51eCgpO1xuLVxuLVx0LyogZ3JhYiB0aGUgbXV0ZXggdG8gcHJvdGVjdCBmZXcgZ2xvYmFscyB1c2VkIGJ5IHZlcmlmaWVyICovXG4tXHRpZiAoIWlzX3ByaXYpXG4tXHRcdG11dGV4X2xvY2soXHUwMDI2YnBmX3ZlcmlmaWVyX2xvY2spO1xuJiM0MztcdGVudi1cdTAwM2VzaWduYXR1cmUgPSBhdHRyLVx1MDAzZXNpZ25hdHVyZTtcbiBcbiBcdC8qIHVzZXIgY291bGQgaGF2ZSByZXF1ZXN0ZWQgdmVyYm9zZSB2ZXJpZmllciBvdXRwdXRcbiBcdCAqIGFuZCBzdXBwbGllZCBidWZmZXIgdG8gc3RvcmUgdGhlIHZlcmlmaWNhdGlvbiB0cmFjZVxuIFx0ICovXG4gXHRyZXQgPSBicGZfdmxvZ19pbml0KFx1MDAyNmVudi1cdTAwM2Vsb2csIGF0dHJfbG9nLVx1MDAzZWxldmVsLCBhdHRyX2xvZy1cdTAwM2V1YnVmLCBhdHRyX2xvZy1cdTAwM2VzaXplKTtcbiBcdGlmIChyZXQpXG4tXHRcdGdvdG8gZXJyX3VubG9jaztcbiYjNDM7XHRcdGdvdG8gZXJyX2ZyZWVfZW52O1xuJiM0MztcdGlmIChlbnYtXHUwMDNlc2lnbmF0dXJlKSB7XG4mIzQzO1x0XHRyZXQgPSBicGZfcHJvZ19jYWxjX3RhZyhlbnYtXHUwMDNlcHJvZyk7XG4mIzQzO1x0XHRpZiAocmV0IFx1MDAzYyAwKVxuJiM0MztcdFx0XHRnb3RvIGVycl9wcmVwO1xuJiM0MztcdH1cbiBcbiBcdHJldCA9IHByb2Nlc3NfZmRfYXJyYXkoZW52LCBhdHRyLCB1YXR0cik7XG4gXHRpZiAocmV0KVxuJiM0MztcdFx0Z290byBlcnJfcHJlcDtcbiYjNDM7XG4mIzQzO1x0aWYgKGVudi1cdTAwM2VzaWduYXR1cmUpIHtcbiYjNDM7XHRcdHJldCA9IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoZW52LCBhdHRyLCB1YXR0ci5pc19rZXJuZWwpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0Z290byBlcnJfcHJlcDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IHNlY3VyaXR5X2JwZl9wcm9nX2xvYWQoZW52LVx1MDAzZXByb2csIGF0dHIsIGVudi1cdTAwM2Vwcm9nLVx1MDAzZWF1eC1cdTAwM2V0b2tlbixcbiYjNDM7XHRcdFx0XHQgICAgIHVhdHRyLmlzX2tlcm5lbCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdGdvdG8gZXJyX3ByZXA7XG4mIzQzO1xuJiM0MztcdGJwZl9nZXRfYnRmX3ZtbGludXgoKTtcbiYjNDM7XG4mIzQzO1x0LyogZ3JhYiB0aGUgbXV0ZXggdG8gcHJvdGVjdCBmZXcgZ2xvYmFscyB1c2VkIGJ5IHZlcmlmaWVyICovXG4mIzQzO1x0aWYgKCFpc19wcml2KVxuJiM0MztcdFx0bXV0ZXhfbG9jayhcdTAwMjZicGZfdmVyaWZpZXJfbG9jayk7XG4mIzQzO1xuJiM0MztcdGxlbiA9IGVudi1cdTAwM2Vwcm9nLVx1MDAzZWxlbjtcbiYjNDM7XHRlbnYtXHUwMDNlaW5zbl9hdXhfZGF0YSA9XG4mIzQzO1x0XHR2emFsbG9jKGFycmF5X3NpemUoc2l6ZW9mKHN0cnVjdCBicGZfaW5zbl9hdXhfZGF0YSksIGxlbikpO1xuJiM0MztcdHJldCA9IC1FTk9NRU07XG4mIzQzO1x0aWYgKCFlbnYtXHUwMDNlaW5zbl9hdXhfZGF0YSlcbiYjNDM7XHRcdGdvdG8gc2tpcF9mdWxsX2NoZWNrO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGxlbjsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRlbnYtXHUwMDNlaW5zbl9hdXhfZGF0YVtpXS5vcmlnX2lkeCA9IGk7XG4mIzQzO1x0ZW52LVx1MDAzZXN1Y2MgPSBicGZfaWFycmF5X3JlYWxsb2MoTlVMTCwgMik7XG4mIzQzO1x0aWYgKCFlbnYtXHUwMDNlc3VjYylcbiBcdFx0Z290byBza2lwX2Z1bGxfY2hlY2s7XG4gXG4gXHRtYXJrX3ZlcmlmaWVyX3N0YXRlX2NsZWFuKGVudik7XG5AQCAtMjAwMzMsMTcgJiM0MzsyMDMyOCwyNiBAQCBpbnQgYnBmX2NoZWNrKHN0cnVjdCBicGZfcHJvZyAqKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbiBcdCpwcm9nID0gZW52LVx1MDAzZXByb2c7XG4gXG4gXHRtb2R1bGVfcHV0KGVudi1cdTAwM2VhdHRhY2hfYnRmX21vZCk7XG4tZXJyX3VubG9jazpcbiBcdGlmICghaXNfcHJpdilcbiBcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmJwZl92ZXJpZmllcl9sb2NrKTtcbi1cdGJwZl9jbGVhcl9pbnNuX2F1eF9kYXRhKGVudiwgMCwgZW52LVx1MDAzZXByb2ctXHUwMDNlbGVuKTtcbiYjNDM7XHRnb3RvIGVycl9mcmVlX2VudjtcbiYjNDM7ZXJyX3ByZXA6XG4mIzQzO1x0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcdTAwMjZlbnYtXHUwMDNlbG9nKTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0cmV0ID0gZXJyO1xuJiM0MztcdHJlbGVhc2VfaW5zbl9hcnJheXMoZW52KTtcbiYjNDM7XHRyZWxlYXNlX21hcHMoZW52KTtcbiYjNDM7XHRyZWxlYXNlX2J0ZnMoZW52KTtcbiBlcnJfZnJlZV9lbnY6XG4mIzQzO1x0aWYgKGVudi1cdTAwM2VpbnNuX2F1eF9kYXRhKVxuJiM0MztcdFx0YnBmX2NsZWFyX2luc25fYXV4X2RhdGEoZW52LCAwLCBlbnYtXHUwMDNlcHJvZy1cdTAwM2VsZW4pO1xuJiM0MztcdHZmcmVlKGVudi1cdTAwM2VpbnNuX2F1eF9kYXRhKTtcbiYjNDM7XHRrdmZyZWUoZW52LVx1MDAzZWZkX2FycmF5KTtcbiBcdGJwZl9zdGFja19saXZlbmVzc19mcmVlKGVudik7XG4gXHRrdmZyZWUoZW52LVx1MDAzZWNmZy5pbnNuX3Bvc3RvcmRlcik7XG4gXHRrdmZyZWUoZW52LVx1MDAzZXNjY19pbmZvKTtcbiBcdGt2ZnJlZShlbnYtXHUwMDNlc3VjYyk7XG4gXHRrdmZyZWUoZW52LVx1MDAzZWdvdG94X3RtcF9idWYpO1xuLVx0dmZyZWUoZW52LVx1MDAzZWluc25fYXV4X2RhdGEpO1xuIFx0a3ZmcmVlKGVudik7XG4gXHRyZXR1cm4gcmV0O1xuIH1cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9nZW4uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jXG5pbmRleCA2YWU3MjYyZWJlMGMxZC4uYTAxZDA2ZDIyZDFhM2IgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9nZW4uY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmNcbkBAIC03OTMsNiAmIzQzOzc5Myw4IEBAIHN0YXRpYyBpbnQgZ2VuX3RyYWNlKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm9ial9uYW1lLCBjb25zdCBjaGFyICpoXG4gXHRpZiAoc2lnbl9wcm9ncykge1xuIFx0XHRzb3B0cy5pbnNucyA9IG9wdHMuaW5zbnM7XG4gXHRcdHNvcHRzLmluc25zX3N6ID0gb3B0cy5pbnNuc19zejtcbiYjNDM7XHRcdHNvcHRzLmRhdGEgPSBvcHRzLmRhdGE7XG4mIzQzO1x0XHRzb3B0cy5kYXRhX3N6ID0gb3B0cy5kYXRhX3N6O1xuIFx0XHRzb3B0cy5leGNsX3Byb2dfaGFzaCA9IHByb2dfc2hhO1xuIFx0XHRzb3B0cy5leGNsX3Byb2dfaGFzaF9zeiA9IHNpemVvZihwcm9nX3NoYSk7XG4gXHRcdHNvcHRzLnNpZ25hdHVyZSA9IHNpZ19idWY7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvc2lnbi5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvc2lnbi5jXG5pbmRleCBmOWI3NDJmNGJiMTA0Yi4uODg3MjZhNmRiNmQwZTkgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9zaWduLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uY1xuQEAgLTEzNSw5ICYjNDM7MTM1LDIxIEBAIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKVxuIFx0Q01TX0NvbnRlbnRJbmZvICpjbXMgPSBOVUxMO1xuIFx0bG9uZyBhY3R1YWxfc2lnX2xlbiA9IDA7XG4gXHRYNTA5ICp4NTA5ID0gTlVMTDtcbiYjNDM7XHR2b2lkICpkYXRhID0gTlVMTDtcbiYjNDM7XHRzaXplX3QgZGF0YV9zejtcbiBcdGludCBlcnIgPSAwO1xuIFxuLVx0YmRfaW4gPSBCSU9fbmV3X21lbV9idWYob3B0cy1cdTAwM2VpbnNucywgb3B0cy1cdTAwM2VpbnNuc19zeik7XG4mIzQzO1x0ZGF0YV9zeiA9IChzaXplX3Qpb3B0cy1cdTAwM2VpbnNuc19zeiAmIzQzOyBvcHRzLVx1MDAzZWRhdGFfc3o7XG4mIzQzO1x0ZGF0YSA9IG1hbGxvYyhkYXRhX3N6KTtcbiYjNDM7XHRpZiAoIWRhdGEpIHtcbiYjNDM7XHRcdGVyciA9IC1FTk9NRU07XG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0fVxuJiM0MztcdG1lbWNweShkYXRhLCBvcHRzLVx1MDAzZWluc25zLCBvcHRzLVx1MDAzZWluc25zX3N6KTtcbiYjNDM7XHRpZiAob3B0cy1cdTAwM2VkYXRhX3N6KVxuJiM0MztcdFx0bWVtY3B5KChjaGFyICopZGF0YSAmIzQzOyBvcHRzLVx1MDAzZWluc25zX3N6LCBvcHRzLVx1MDAzZWRhdGEsIG9wdHMtXHUwMDNlZGF0YV9zeik7XG4mIzQzO1xuJiM0MztcdGJkX2luID0gQklPX25ld19tZW1fYnVmKGRhdGEsIGRhdGFfc3opO1xuIFx0aWYgKCFiZF9pbikge1xuIFx0XHRlcnIgPSAtRU5PTUVNO1xuIFx0XHRnb3RvIGNsZWFudXA7XG5AQCAtMTc1LDEwICYjNDM7MTg3LDEzIEBAIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKVxuIFx0XHRnb3RvIGNsZWFudXA7XG4gXHR9XG4gXG4tXHRFVlBfRGlnZXN0KG9wdHMtXHUwMDNlaW5zbnMsIG9wdHMtXHUwMDNlaW5zbnNfc3osIG9wdHMtXHUwMDNlZXhjbF9wcm9nX2hhc2gsXG4tXHRcdCAgIFx1MDAyNm9wdHMtXHUwMDNlZXhjbF9wcm9nX2hhc2hfc3osIEVWUF9zaGEyNTYoKSwgTlVMTCk7XG4mIzQzO1x0aWYgKEVWUF9EaWdlc3Qob3B0cy1cdTAwM2VpbnNucywgb3B0cy1cdTAwM2VpbnNuc19zeiwgb3B0cy1cdTAwM2VleGNsX3Byb2dfaGFzaCxcbiYjNDM7XHRcdCAgICAgICBcdTAwMjZvcHRzLVx1MDAzZWV4Y2xfcHJvZ19oYXNoX3N6LCBFVlBfc2hhMjU2KCksIE5VTEwpICE9IDEpIHtcbiYjNDM7XHRcdGVyciA9IC1FSU87XG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0fVxuIFxuLVx0XHRiZF9vdXQgPSBCSU9fbmV3KEJJT19zX21lbSgpKTtcbiYjNDM7XHRiZF9vdXQgPSBCSU9fbmV3KEJJT19zX21lbSgpKTtcbiBcdGlmICghYmRfb3V0KSB7XG4gXHRcdGVyciA9IC1FTk9NRU07XG4gXHRcdGdvdG8gY2xlYW51cDtcbkBAIC0yMTIsNiAmIzQzOzIyNyw3IEBAIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKVxuIFx0WDUwOV9mcmVlKHg1MDkpO1xuIFx0RVZQX1BLRVlfZnJlZShwcml2YXRlX2tleSk7XG4gXHRCSU9fZnJlZShiZF9pbik7XG4mIzQzO1x0ZnJlZShkYXRhKTtcbiBcdERJU1BMQVlfT1NTTF9FUlIoZXJyIFx1MDAzYyAwKTtcbiBcdHJldHVybiBlcnI7XG4gfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmhcbmluZGV4IDQ5YWY0MjYwYjhlNmI3Li4wNDI1NjkxODc3NTIxNyAxMDA2NDRcbi0tLSBhL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaFxuQEAgLTUxLDcgJiM0Mzs1MSw2IEBAIHN0cnVjdCBicGZfZ2VuIHtcbiBcdF9fdTMyIG5yX2tzeW1zO1xuIFx0aW50IGZkX2FycmF5O1xuIFx0aW50IG5yX2ZkX2FycmF5O1xuLVx0aW50IGhhc2hfaW5zbl9vZmZzZXRbU0hBMjU2X0RXT1JEX1NJWkVdO1xuIH07XG4gXG4gdm9pZCBicGZfZ2VuX19pbml0KHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBsb2dfbGV2ZWwsIGludCBucl9wcm9ncywgaW50IG5yX21hcHMpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jIGIvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmNcbmluZGV4IGM3ZjJkMmFjN2JiMzVmLi42ZTNkZDUyNDI3NjE4MyAxMDA2NDRcbi0tLSBhL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuY1xuQEAgLTExMSw3ICYjNDM7MTExLDYgQEAgc3RhdGljIHZvaWQgZW1pdDIoc3RydWN0IGJwZl9nZW4gKmdlbiwgc3RydWN0IGJwZl9pbnNuIGluc24xLCBzdHJ1Y3QgYnBmX2luc24gaW5cbiBcbiBzdGF0aWMgaW50IGFkZF9kYXRhKHN0cnVjdCBicGZfZ2VuICpnZW4sIGNvbnN0IHZvaWQgKmRhdGEsIF9fdTMyIHNpemUpO1xuIHN0YXRpYyB2b2lkIGVtaXRfc3lzX2Nsb3NlX2Jsb2Ioc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGJsb2Jfb2ZmKTtcbi1zdGF0aWMgdm9pZCBlbWl0X3NpZ25hdHVyZV9tYXRjaChzdHJ1Y3QgYnBmX2dlbiAqZ2VuKTtcbiBcbiB2b2lkIGJwZl9nZW5fX2luaXQoc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGxvZ19sZXZlbCwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcylcbiB7XG5AQCAtMTU0LDggJiM0MzsxNTMsNiBAQCB2b2lkIGJwZl9nZW5fX2luaXQoc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGxvZ19sZXZlbCwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwc1xuIFx0LyogUjcgY29udGFpbnMgdGhlIGVycm9yIGNvZGUgZnJvbSBzeXNfYnBmLiBDb3B5IGl0IGludG8gUjAgYW5kIGV4aXQuICovXG4gXHRlbWl0KGdlbiwgQlBGX01PVjY0X1JFRyhCUEZfUkVHXzAsIEJQRl9SRUdfNykpO1xuIFx0ZW1pdChnZW4sIEJQRl9FWElUX0lOU04oKSk7XG4tXHRpZiAoT1BUU19HRVQoZ2VuLVx1MDAzZW9wdHMsIGdlbl9oYXNoLCBmYWxzZSkpXG4tXHRcdGVtaXRfc2lnbmF0dXJlX21hdGNoKGdlbik7XG4gfVxuIFxuIHN0YXRpYyBpbnQgYWRkX2RhdGEoc3RydWN0IGJwZl9nZW4gKmdlbiwgY29uc3Qgdm9pZCAqZGF0YSwgX191MzIgc2l6ZSlcbkBAIC0zNzcsOCAmIzQzOzM3NCw2IEBAIHN0YXRpYyB2b2lkIGVtaXRfc3lzX2Nsb3NlX2Jsb2Ioc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGJsb2Jfb2ZmKVxuIFx0X19lbWl0X3N5c19jbG9zZShnZW4pO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBjb21wdXRlX3NoYV91cGRhdGVfb2Zmc2V0cyhzdHJ1Y3QgYnBmX2dlbiAqZ2VuKTtcbi1cbiBpbnQgYnBmX2dlbl9fZmluaXNoKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBucl9wcm9ncywgaW50IG5yX21hcHMpXG4ge1xuIFx0aW50IGk7XG5AQCAtNDA4LDkgJiM0Mzs0MDMsNiBAQCBpbnQgYnBmX2dlbl9fZmluaXNoKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBucl9wcm9ncywgaW50IG5yX21hcHMpXG4gXHRpZiAoIWdlbi1cdTAwM2VlcnJvcikge1xuIFx0XHRzdHJ1Y3QgZ2VuX2xvYWRlcl9vcHRzICpvcHRzID0gZ2VuLVx1MDAzZW9wdHM7XG4gXG4tXHRcdGlmIChPUFRTX0dFVChvcHRzLCBnZW5faGFzaCwgZmFsc2UpKVxuLVx0XHRcdGNvbXB1dGVfc2hhX3VwZGF0ZV9vZmZzZXRzKGdlbik7XG4tXG4gXHRcdG9wdHMtXHUwMDNlaW5zbnMgPSBnZW4tXHUwMDNlaW5zbl9zdGFydDtcbiBcdFx0b3B0cy1cdTAwM2VpbnNuc19zeiA9IGdlbi1cdTAwM2VpbnNuX2N1ciAtIGdlbi1cdTAwM2VpbnNuX3N0YXJ0O1xuIFx0XHRvcHRzLVx1MDAzZWRhdGEgPSBnZW4tXHUwMDNlZGF0YV9zdGFydDtcbkBAIC00NjAsMjIgJiM0Mzs0NTIsNiBAQCB2b2lkIGJwZl9nZW5fX2ZyZWUoc3RydWN0IGJwZl9nZW4gKmdlbilcbiBcdF92YWw7XHRcdFx0XHRcdFx0XHRcXFxuIH0pXG4gXG4tc3RhdGljIHZvaWQgY29tcHV0ZV9zaGFfdXBkYXRlX29mZnNldHMoc3RydWN0IGJwZl9nZW4gKmdlbilcbi17XG4tXHRfX3U2NCBzaGFbU0hBMjU2X0RXT1JEX1NJWkVdO1xuLVx0X191NjQgc2hhX2R3O1xuLVx0aW50IGk7XG4tXG4tXHRsaWJicGZfc2hhMjU2KGdlbi1cdTAwM2VkYXRhX3N0YXJ0LCBnZW4tXHUwMDNlZGF0YV9jdXIgLSBnZW4tXHUwMDNlZGF0YV9zdGFydCwgKF9fdTggKilzaGEpO1xuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgU0hBMjU2X0RXT1JEX1NJWkU7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9XG4tXHRcdFx0KHN0cnVjdCBicGZfaW5zbiAqKShnZW4tXHUwMDNlaW5zbl9zdGFydCAmIzQzOyBnZW4tXHUwMDNlaGFzaF9pbnNuX29mZnNldFtpXSk7XG4tXHRcdHNoYV9kdyA9IHRndF9lbmRpYW4oc2hhW2ldKTtcbi1cdFx0aW5zblswXS5pbW0gPSAoX191MzIpc2hhX2R3O1xuLVx0XHRpbnNuWzFdLmltbSA9IHNoYV9kdyBcdTAwM2VcdTAwM2UgMzI7XG4tXHR9XG4tfVxuLVxuIHZvaWQgYnBmX2dlbl9fbG9hZF9idGYoc3RydWN0IGJwZl9nZW4gKmdlbiwgY29uc3Qgdm9pZCAqYnRmX3Jhd19kYXRhLFxuIFx0XHQgICAgICAgX191MzIgYnRmX3Jhd19zaXplKVxuIHtcbkBAIC01NTcsOCAmIzQzOzUzMyw5IEBAIHZvaWQgYnBmX2dlbl9fbWFwX2NyZWF0ZShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLFxuIFx0ICogQ29uZGl0aW9uYWxseSB1cGRhdGUgbWF4X2VudHJpZXMgZnJvbSB0aGUgaG9zdC1zdXBwbGllZCBsb2FkZXJcbiBcdCAqIGN0eC4gVGhpcyBzaXplcyB0aGUgbWFwIGF0IHJ1bnRpbWUsIGJ1dCBmb3IgYSBzaWduZWQgbG9hZGVyXG4gXHQgKiAoZ2VuX2hhc2gpIGl0IHdvdWxkIGxldCBhbiB1bnRydXN0ZWQgaG9zdCByZS1kaW1lbnNpb24gdGhlXG4tXHQgKiBwcm9ncmFtJiMzOTtzIG1hcHMgYWZ0ZXIgZW1pdF9zaWduYXR1cmVfbWF0Y2goKSwgb3V0c2lkZSB3aGF0IHRoZVxuLVx0ICogc2lnbmF0dXJlIGF0dGVzdHMgdG8uIEtlZXAgdGhlIHNpZ25lci1wcm92aWRlZCBtYXhfZW50cmllc1xuJiM0MztcdCAqIHByb2dyYW0mIzM5O3MgbWFwcywgb3V0c2lkZSB3aGF0IHRoZSBzaWduYXR1cmUgYXR0ZXN0cyB0bzogdGhlXG4mIzQzO1x0ICogbWV0YWRhdGEgYmxvYiBpcyBjb3ZlcmVkIGJ5IHRoZSBwcm9ncmFtIHNpZ25hdHVyZSBhbmQgdmVyaWZpZWRcbiYjNDM7XHQgKiBieSB0aGUga2VybmVsIGF0IGxvYWQgdGltZS4gS2VlcCB0aGUgc2lnbmVyLXByb3ZpZGVkIG1heF9lbnRyaWVzXG4gXHQgKiBiYWtlZCBpbnRvIHRoZSBibG9iIGluIHRoYXQgY2FzZS5cbiBcdCAqL1xuIFx0aWYgKG1hcF9pZHggXHUwMDNlPSAwIFx1MDAyNlx1MDAyNiAhT1BUU19HRVQoZ2VuLVx1MDAzZW9wdHMsIGdlbl9oYXNoLCBmYWxzZSkpXG5AQCAtNTk2LDQ1ICYjNDM7NTczLDYgQEAgdm9pZCBicGZfZ2VuX19tYXBfY3JlYXRlKHN0cnVjdCBicGZfZ2VuICpnZW4sXG4gXHRcdGVtaXRfc3lzX2Nsb3NlX3N0YWNrKGdlbiwgc3RhY2tfb2ZmKGlubmVyX21hcF9mZCkpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBlbWl0X3NpZ25hdHVyZV9tYXRjaChzdHJ1Y3QgYnBmX2dlbiAqZ2VuKVxuLXtcbi1cdF9fczY0IG9mZjtcbi1cdGludCBpO1xuLVxuLVx0Lypcbi1cdCAqIFJlamVjdCBpZiB0aGUgbWV0YWRhdGEgbWFwIGlzIG5vdCBleGNsdXNpdmUuIFdpdGhvdXQgZXhjbHVzaXZpdHlcbi1cdCAqIHRoZSBjYWNoZWQgbWFwLVx1MDAzZXNoYVtdIHZlcmlmaWVkIGFib3ZlIGNhbiBiZSBzdGFsZTogYW5vdGhlciBCUEZcbi1cdCAqIHByb2dyYW0gd2l0aCBtYXAgYWNjZXNzIGNvdWxkIGhhdmUgbXV0YXRlZCB0aGUgY29udGVudHMgYmV0d2VlblxuLVx0ICogQlBGX09CSl9HRVRfSU5GT19CWV9GRCBhbmQgbG9hZGVyIGV4ZWN1dGlvbi5cbi1cdCAqL1xuLVx0ZW1pdDIoZ2VuLCBCUEZfTERfSU1NNjRfUkFXX0ZVTEwoQlBGX1JFR18xLCBCUEZfUFNFVURPX01BUF9JRFgsXG4tXHRcdFx0XHRcdCAwLCAwLCAwLCAwKSk7XG4tXHRlbWl0KGdlbiwgQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLCBTSEEyNTZfRElHRVNUX0xFTkdUSCkpO1xuLVx0b2ZmID0gLShnZW4tXHUwMDNlaW5zbl9jdXIgLSBnZW4tXHUwMDNlaW5zbl9zdGFydCAtIGdlbi1cdTAwM2VjbGVhbnVwX2xhYmVsKSAvIDggLSAyO1xuLVx0aWYgKGlzX3NpbW0xNihvZmYpKSB7XG4tXHRcdGVtaXQoZ2VuLCBCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNywgLUVJTlZBTCkpO1xuLVx0XHRlbWl0KGdlbiwgQlBGX0pNUF9JTU0oQlBGX0pORSwgQlBGX1JFR18yLCAxLCBvZmYpKTtcbi1cdH0gZWxzZSB7XG4tXHRcdGdlbi1cdTAwM2VlcnJvciA9IC1FUkFOR0U7XG4tXHR9XG4tXG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBTSEEyNTZfRFdPUkRfU0laRTsgaSYjNDM7JiM0MzspIHtcbi1cdFx0ZW1pdDIoZ2VuLCBCUEZfTERfSU1NNjRfUkFXX0ZVTEwoQlBGX1JFR18xLCBCUEZfUFNFVURPX01BUF9JRFgsXG4tXHRcdFx0XHRcdFx0IDAsIDAsIDAsIDApKTtcbi1cdFx0ZW1pdChnZW4sIEJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsIGkgKiBzaXplb2YoX191NjQpKSk7XG4tXHRcdGdlbi1cdTAwM2VoYXNoX2luc25fb2Zmc2V0W2ldID0gZ2VuLVx1MDAzZWluc25fY3VyIC0gZ2VuLVx1MDAzZWluc25fc3RhcnQ7XG4tXHRcdGVtaXQyKGdlbiwgQlBGX0xEX0lNTTY0X1JBV19GVUxMKEJQRl9SRUdfMywgMCwgMCwgMCwgMCwgMCkpO1xuLVxuLVx0XHRvZmYgPSAtKGdlbi1cdTAwM2VpbnNuX2N1ciAtIGdlbi1cdTAwM2VpbnNuX3N0YXJ0IC0gZ2VuLVx1MDAzZWNsZWFudXBfbGFiZWwpIC8gOCAtIDI7XG4tXHRcdGlmIChpc19zaW1tMTYob2ZmKSkge1xuLVx0XHRcdGVtaXQoZ2VuLCBCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNywgLUVJTlZBTCkpO1xuLVx0XHRcdGVtaXQoZ2VuLCBCUEZfSk1QX1JFRyhCUEZfSk5FLCBCUEZfUkVHXzIsIEJQRl9SRUdfMywgb2ZmKSk7XG4tXHRcdH0gZWxzZSB7XG4tXHRcdFx0Z2VuLVx1MDAzZWVycm9yID0gLUVSQU5HRTtcbi1cdFx0fVxuLVx0fVxuLX1cbi1cbiB2b2lkIGJwZl9nZW5fX3JlY29yZF9hdHRhY2hfdGFyZ2V0KHN0cnVjdCBicGZfZ2VuICpnZW4sIGNvbnN0IGNoYXIgKmF0dGFjaF9uYW1lLFxuIFx0XHRcdFx0ICAgZW51bSBicGZfYXR0YWNoX3R5cGUgdHlwZSlcbiB7XG5AQCAtMTIxMSwxMCAmIzQzOzExNDksMTAgQEAgdm9pZCBicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgsIHZvaWQgKnB2YWx1ZSxcbiBcdCAqIH1cbiBcdCAqXG4gXHQgKiBUaGUgcnVudGltZSBpbml0aWFsX3ZhbHVlIGNvbWVzIGZyb20gdGhlIGhvc3Qtc3VwcGxpZWQgbG9hZGVyXG4tXHQgKiBjdHggYW5kIHdvdWxkIG92ZXJ3cml0ZSB0aGUgYmxvYiB2YWx1ZSBhZnRlciBlbWl0X3NpZ25hdHVyZV9tYXRjaCgpXG4tXHQgKiBoYXMgYWxyZWFkeSB2YWxpZGF0ZWQgbWFwLVx1MDAzZXNoYVtdLiBGb3IgYSBzaWduZWQgbG9hZGVyIChnZW5faGFzaClcbi1cdCAqIHRoZSBhdHRlc3RlZCBibG9iIHZhbHVlIG11c3QgYmUgYXV0aG9yaXRhdGl2ZSwgc28gc2tpcCB0aGUgb3ZlcnJpZGVcbi1cdCAqIGFuZCBsZWF2ZSB0aGUgaGFzaGVkIHZhbHVlIGluIHBsYWNlLlxuJiM0MztcdCAqIGN0eCBhbmQgd291bGQgb3ZlcndyaXRlIHRoZSBibG9iIHZhbHVlIHRoYXQgdGhlIHByb2dyYW0gc2lnbmF0dXJlXG4mIzQzO1x0ICogY292ZXJzIGFuZCB0aGUga2VybmVsIHZlcmlmaWVzIGF0IGxvYWQgdGltZS4gRm9yIGEgc2lnbmVkIGxvYWRlclxuJiM0MztcdCAqIChnZW5faGFzaCkgdGhlIGF0dGVzdGVkIGJsb2IgdmFsdWUgbXVzdCBiZSBhdXRob3JpdGF0aXZlLCBzbyBza2lwXG4mIzQzO1x0ICogdGhlIG92ZXJyaWRlIGFuZCBsZWF2ZSB0aGUgc2lnbmVkIHZhbHVlIGluIHBsYWNlLlxuIFx0ICovXG4gXHRpZiAoIU9QVFNfR0VUKGdlbi1cdTAwM2VvcHRzLCBnZW5faGFzaCwgZmFsc2UpKSB7XG4gXHRcdGVtaXQoZ2VuLCBCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMywgQlBGX1JFR182LFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmggYi90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oXG5pbmRleCAwNGNkMzAzZmI1YTg3OS4uZDViN2RiNzAzYjNmZTkgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oXG5AQCAtNzY4LDcgJiM0Mzs3NjgsNiBAQCBpbnQgZWxmX3Jlc29sdmVfcGF0dGVybl9vZmZzZXRzKGNvbnN0IGNoYXIgKmJpbmFyeV9wYXRoLCBjb25zdCBjaGFyICpwYXR0ZXJuLFxuIGludCBwcm9iZV9mZChpbnQgZmQpO1xuIFxuICNkZWZpbmUgU0hBMjU2X0RJR0VTVF9MRU5HVEggMzJcbi0jZGVmaW5lIFNIQTI1Nl9EV09SRF9TSVpFIFNIQTI1Nl9ESUdFU1RfTEVOR1RIIC8gc2l6ZW9mKF9fdTY0KVxuIFxuIHZvaWQgbGliYnBmX3NoYTI1Nihjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLCBfX3U4IG91dFtTSEEyNTZfRElHRVNUX0xFTkdUSF0pO1xuIGludCBwcm9iZV9zeXNfYnBmX2V4dCh2b2lkKTtcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oXG5pbmRleCA3NDUwM2QzNThiYzhhNS4uNTNmZWU1M2QzNmQ1MTIgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmhcbkBAIC0xOCwxMCAmIzQzOzE4LDYgQEBcbiAjaW5jbHVkZSBcJiMzNDticGYuaFwmIzM0O1xuICNlbmRpZlxuIFxuLSNpZm5kZWYgU0hBMjU2X0RJR0VTVF9MRU5HVEhcbi0jZGVmaW5lIFNIQTI1Nl9ESUdFU1RfTEVOR1RIIDMyXG4tI2VuZGlmXG4tXG4gI2lmbmRlZiBfX05SX2JwZlxuICMgaWYgZGVmaW5lZChfX21pcHNfXykgXHUwMDI2XHUwMDI2IGRlZmluZWQoX0FCSU8zMilcbiAjICBkZWZpbmUgX19OUl9icGYgNDM1NVxuQEAgLTMyMCwyNSAmIzQzOzMxNiw2IEBAIHN0YXRpYyBpbmxpbmUgaW50IHNrZWxfbGlua19jcmVhdGUoaW50IHByb2dfZmQsIGludCB0YXJnZXRfZmQsXG4gXHRyZXR1cm4gc2tlbF9zeXNfYnBmKEJQRl9MSU5LX0NSRUFURSwgXHUwMDI2YXR0ciwgYXR0cl9zeik7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgaW50IHNrZWxfb2JqX2dldF9pbmZvX2J5X2ZkKGludCBmZClcbi17XG4tXHRjb25zdCBzaXplX3QgYXR0cl9zeiA9IG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBpbmZvKTtcbi1cdF9fdTggc2hhW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTtcbi1cdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbztcbi1cdF9fdTMyIGluZm9fbGVuID0gc2l6ZW9mKGluZm8pO1xuLVx0dW5pb24gYnBmX2F0dHIgYXR0cjtcbi1cbi1cdG1lbXNldChcdTAwMjZpbmZvLCAwLCBzaXplb2YoaW5mbykpO1xuLVx0aW5mby5oYXNoID0gKGxvbmcpIFx1MDAyNnNoYTtcbi1cdGluZm8uaGFzaF9zaXplID0gU0hBMjU2X0RJR0VTVF9MRU5HVEg7XG4tXG4tXHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgYXR0cl9zeik7XG4tXHRhdHRyLmluZm8uYnBmX2ZkID0gZmQ7XG4tXHRhdHRyLmluZm8uaW5mbyA9IChsb25nKSBcdTAwMjZpbmZvO1xuLVx0YXR0ci5pbmZvLmluZm9fbGVuID0gaW5mb19sZW47XG4tXHRyZXR1cm4gc2tlbF9zeXNfYnBmKEJQRl9PQkpfR0VUX0lORk9fQllfRkQsIFx1MDAyNmF0dHIsIGF0dHJfc3opO1xuLX1cbi1cbiBzdGF0aWMgaW5saW5lIGludCBza2VsX21hcF9mcmVlemUoaW50IGZkKVxuIHtcbiBcdGNvbnN0IHNpemVfdCBhdHRyX3N6ID0gb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIG1hcF9mZCk7XG5AQCAtMzg0LDEyICYjNDM7MzYxLDYgQEAgc3RhdGljIGlubGluZSBpbnQgYnBmX2xvYWRfYW5kX3J1bihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKVxuIFx0XHRzZXRfZXJyO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbi1cdGVyciA9IHNrZWxfb2JqX2dldF9pbmZvX2J5X2ZkKG1hcF9mZCk7XG4tXHRpZiAoZXJyIFx1MDAzYyAwKSB7XG4tXHRcdG9wdHMtXHUwMDNlZXJyc3RyID0gXCYjMzQ7ZmFpbGVkIHRvIGZldGNoIG9iaiBpbmZvXCYjMzQ7O1xuLVx0XHRzZXRfZXJyO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbiAjZW5kaWZcbiBcbiBcdG1lbXNldChcdTAwMjZhdHRyLCAwLCBwcm9nX2xvYWRfYXR0cl9zeik7XG5AQCAtNDAwLDYgJiM0MzszNzEsOCBAQCBzdGF0aWMgaW5saW5lIGludCBicGZfbG9hZF9hbmRfcnVuKHN0cnVjdCBicGZfbG9hZF9hbmRfcnVuX29wdHMgKm9wdHMpXG4gI2lmbmRlZiBfX0tFUk5FTF9fXG4gXHRhdHRyLnNpZ25hdHVyZSA9IChsb25nKSBvcHRzLVx1MDAzZXNpZ25hdHVyZTtcbiBcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBvcHRzLVx1MDAzZXNpZ25hdHVyZV9zejtcbiYjNDM7XHRpZiAob3B0cy1cdTAwM2VzaWduYXR1cmUpXG4mIzQzO1x0XHRhdHRyLmZkX2FycmF5X2NudCA9IDE7XG4gI2Vsc2VcbiBcdGlmIChvcHRzLVx1MDAzZXNpZ25hdHVyZSB8fCBvcHRzLVx1MDAzZXNpZ25hdHVyZV9zeilcbiBcdFx0cHJfd2FybihcJiMzNDtzaWduYXR1cmVzIGFyZSBub3Qgc3VwcG9ydGVkIGZyb20gYnBmX3ByZWxvYWRcXG5cJiMzNDspO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuY1xuaW5kZXggNWZjNDE3ZTMxZmM2MTUuLjU2ZDFmMDcyZGU0YzE3IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmNcbkBAIC0xMSw2ICYjNDM7MTEsOCBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2tleWN0bC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiBcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4mIzQzO1xuICNpbmNsdWRlIFwmIzM0O2JwZi9saWJicGZfaW50ZXJuYWwuaFwmIzM0OyAvKiBmb3IgbGliYnBmX3NoYTI1NigpICovXG4gI2luY2x1ZGUgXCYjMzQ7YnBmL3NrZWxfaW50ZXJuYWwuaFwmIzM0O1x0IC8qIGZvciBsb2FkZXIgY3R4IGxheW91dCAoYnBmX2xvYWRlcl9jdHggZXRjKSAqL1xuIFxuQEAgLTE5LDggJiM0MzsyMSw2IEBAXG4gI2luY2x1ZGUgXCYjMzQ7dGVzdF9zaWduZWRfbG9hZGVyX2RhdGEuc2tlbC5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7dGVzdF9zaWduZWRfbG9hZGVyX2xzbS5za2VsLmhcJiMzNDtcbiBcbi0jZGVmaW5lIFNJR19NQVRDSF9JTlNOUyAzMyAvKiBleGNsICg1KSAmIzQzOyA0ICogc2hhLWR3b3JkICg3KSAqL1xuLVxuIGVudW0ge1xuIFx0QlBGX1NJR19VTlNJR05FRCA9IDAsXG4gXHRCUEZfU0lHX1ZFUklGSUVELFxuQEAgLTM1LDcgJiM0MzszNSw4IEBAIGVudW0ge1xuIH07XG4gXG4gc3RhdGljIGludCBsb2FkX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osIGludCBtYXBfZmQsXG4tXHRcdCAgICAgICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZClcbiYjNDM7XHRcdCAgICAgICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZCxcbiYjNDM7XHRcdCAgICAgICBfX3UzMiBmZF9hcnJheV9jbnQpXG4ge1xuIFx0dW5pb24gYnBmX2F0dHIgYXR0cjtcbiBcdGludCBmZDtcbkBAIC01Miw2ICYjNDM7NTMsNyBAQCBzdGF0aWMgaW50IGxvYWRfbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCxcbiBcdFx0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcbiBcdFx0YXR0ci5rZXlyaW5nX2lkID0ga2V5cmluZ19pZDtcbiBcdH1cbiYjNDM7XHRhdHRyLmZkX2FycmF5X2NudCA9IGZkX2FycmF5X2NudDtcbiBcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXCYjMzQ7X19sb2FkZXIucHJvZ1wmIzM0Oywgc2l6ZW9mKFwmIzM0O19fbG9hZGVyLnByb2dcJiMzNDspKTtcbiBcdGZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXHUwMDI2YXR0cixcbiBcdFx0ICAgICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuQEAgLTYyLDE0ICYjNDM7NjQsMTIgQEAgc3RhdGljIGludCBydW5fZ2VuX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osXG4gXHRcdFx0ICBjb25zdCB2b2lkICpkYXRhLCBfX3UzMiBkYXRhX3N6LFxuIFx0XHRcdCAgY29uc3Qgdm9pZCAqZXhjbCwgX191MzIgZXhjbF9zeixcbiBcdFx0XHQgIGNvbnN0IHZvaWQgKnNpZywgX191MzIgc2lnX3N6LFxuLVx0XHRcdCAgYm9vbCBnZXRfaGFzaCwgdm9pZCAqY3R4LCBfX3UzMiBjdHhfc3osIGJvb2wgKmxvYWRlcl9yYW4pXG4mIzQzO1x0XHRcdCAgdm9pZCAqY3R4LCBfX3UzMiBjdHhfc3osIGJvb2wgKmxvYWRlcl9yYW4pXG4ge1xuIFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgbW9wdHMsXG4gXHRcdCAgICAuZXhjbF9wcm9nX2hhc2ggPSBleGNsLFxuIFx0XHQgICAgLmV4Y2xfcHJvZ19oYXNoX3NpemUgPSBleGNsX3N6KTtcbi1cdF9fdTggaGJ1ZltTSEEyNTZfRElHRVNUX0xFTkdUSF07XG4tXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm87XG4tXHRfX3UzMiBpbGVuID0gc2l6ZW9mKGluZm8pLCBrZXkgPSAwO1xuJiM0MztcdF9fdTMyIGtleSA9IDA7XG4gXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xuIFx0aW50IG1hcF9mZCwgcHJvZ19mZCwgcmV0O1xuIFxuQEAgLTg3LDE1ICYjNDM7ODcsNiBAQCBzdGF0aWMgaW50IHJ1bl9nZW5fbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeixcbiBcdFx0cmV0ID0gLWVycm5vO1xuIFx0XHRnb3RvIG91dF9tYXA7XG4gXHR9XG4tXHRpZiAoZ2V0X2hhc2gpIHtcbi1cdFx0bWVtc2V0KFx1MDAyNmluZm8sIDAsIHNpemVvZihpbmZvKSk7XG4tXHRcdGluZm8uaGFzaCA9IHB0cl90b191NjQoaGJ1Zik7XG4tXHRcdGluZm8uaGFzaF9zaXplID0gc2l6ZW9mKGhidWYpO1xuLVx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChtYXBfZmQsIFx1MDAyNmluZm8sIFx1MDAyNmlsZW4pKSB7XG4tXHRcdFx0cmV0ID0gLWVycm5vO1xuLVx0XHRcdGdvdG8gb3V0X21hcDtcbi1cdFx0fVxuLVx0fVxuIFxuIFx0bWVtc2V0KFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XG4gXHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbkBAIC0xMDgsNiAmIzQzOzk5LDcgQEAgc3RhdGljIGludCBydW5fZ2VuX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osXG4gXHRcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpO1xuIFx0XHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6O1xuIFx0XHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XG4mIzQzO1x0XHRhdHRyLmZkX2FycmF5X2NudCA9IDE7XG4gXHR9XG4gXHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFwmIzM0O19fbG9hZGVyLnByb2dcJiMzNDssIHNpemVvZihcJiMzNDtfX2xvYWRlci5wcm9nXCYjMzQ7KSk7XG4gXHRwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXHUwMDI2YXR0cixcbkBAIC0yMzYsNzkgJiM0MzsyMjgsNiBAQCBzdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sXG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBjaGVja19zaWdfbWF0Y2hfc2hhcGUoY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbiwgaW50IG4pXG4te1xuLVx0aW50IGEgPSAtMSwgY2xlYW51cCA9IC0xLCBpLCBiYXNlLCB0LCBicls1XSwgbmIgPSAwO1xuLVxuLVx0LyogQlBGX1BTRVVET19NQVBfSURYICh0aGUgc3RydWN0IGJwZl9tYXAgKiBmb3JtKSBpcyB1c2VkIG9ubHkgaGVyZS4gKi9cbi1cdGZvciAoaSA9IDA7IGkgJiM0MzsgMSBcdTAwM2MgbjsgaSYjNDM7JiM0MzspIHtcbi1cdFx0aWYgKGluW2ldLmNvZGUgPT0gKEJQRl9MRCB8IEJQRl9JTU0gfCBCUEZfRFcpIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgaW5baV0uc3JjX3JlZyA9PSBCUEZfUFNFVURPX01BUF9JRFgpIHtcbi1cdFx0XHRhID0gaTtcbi1cdFx0XHRicmVhaztcbi1cdFx0fVxuLVx0fVxuLVx0aWYgKCFBU1NFUlRfR0UoYSwgMCwgXCYjMzQ7ZW1pdF9zaWduYXR1cmVfbWF0Y2ggcHJlc2VudFwmIzM0OykpXG4tXHRcdHJldHVybjtcbi1cdGlmICghQVNTRVJUX0xFKGEgJiM0MzsgU0lHX01BVENIX0lOU05TLCBuLCBcJiMzNDtibG9jayBmaXRzIGluIHByb2dyYW1cJiMzNDspKVxuLVx0XHRyZXR1cm47XG4tXG4tXHQvKiBleGNsIGNoZWNrOiByMiA9ICoodTMyICopKG1hcCAmIzQzOyAzMik7IGlmIHIyICE9IDEgZ290byBjbGVhbnVwICovXG4tXHRBU1NFUlRfRVEoaW5bYSAmIzQzOyAyXS5jb2RlLCAoQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfVyksIFwmIzM0O2V4Y2wgbG9hZCB3aWR0aFwmIzM0Oyk7XG4tXHRBU1NFUlRfRVEoaW5bYSAmIzQzOyAyXS5vZmYsIFNIQTI1Nl9ESUdFU1RfTEVOR1RILCBcJiMzNDtleGNsIGZpZWxkIG9mZnNldFwmIzM0Oyk7XG4tXHRBU1NFUlRfRVEoaW5bYSAmIzQzOyA0XS5jb2RlLCAoQlBGX0pNUCB8IEJQRl9KTkUgfCBCUEZfSyksIFwmIzM0O2V4Y2wgYnJhbmNoIG9wXCYjMzQ7KTtcbi1cdEFTU0VSVF9FUShpblthICYjNDM7IDRdLmltbSwgMSwgXCYjMzQ7ZXhjbCBjb21wYXJlZCB0byAxXCYjMzQ7KTtcbi1cdGJyW25iJiM0MzsmIzQzO10gPSBhICYjNDM7IDQ7XG4tXG4tXHQvKiA0IHNoYS1kd29yZCBjaGVja3M6IHIyID0gKih1NjQgKikobWFwICYjNDM7IGkqOCk7IGlmIHIyICE9IHIzIGdvdG8gY2xlYW51cCAqL1xuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgNDsgaSYjNDM7JiM0MzspIHtcbi1cdFx0YmFzZSA9IGEgJiM0MzsgNSAmIzQzOyBpICogNztcbi1cdFx0QVNTRVJUX0VRKGluW2Jhc2UgJiM0MzsgMl0uY29kZSwgKEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX0RXKSwgXCYjMzQ7c2hhIGxvYWQgd2lkdGhcJiMzNDspO1xuLVx0XHRBU1NFUlRfRVEoaW5bYmFzZSAmIzQzOyAyXS5vZmYsIGkgKiA4LCBcJiMzNDtzaGEgZHdvcmQgb2Zmc2V0XCYjMzQ7KTtcbi1cdFx0QVNTRVJUX0VRKGluW2Jhc2UgJiM0MzsgM10uY29kZSwgKEJQRl9MRCB8IEJQRl9JTU0gfCBCUEZfRFcpLCBcJiMzNDtzaGEgaW1tNjQgKEhfbWV0YSlcJiMzNDspO1xuLVx0XHRBU1NFUlRfRVEoaW5bYmFzZSAmIzQzOyA2XS5jb2RlLCAoQlBGX0pNUCB8IEJQRl9KTkUgfCBCUEZfWCksIFwmIzM0O3NoYSBicmFuY2ggb3BcJiMzNDspO1xuLVx0XHRicltuYiYjNDM7JiM0MztdID0gYmFzZSAmIzQzOyA2O1xuLVx0fVxuLVxuLVx0Lypcbi1cdCAqIExvY2F0ZSB0aGUgcmVhbCBjbGVhbnVwIGxhYmVsIHNvIHdlIGNhbiBwaW4gdGhlIGV4YWN0IGp1bXAgdGFyZ2V0LFxuLVx0ICogbm90IGp1c3QgXCYjMzQ7c29tZSBiYWNrd2FyZCBsYWJlbFwmIzM0Oy4gYnBmX2dlbl9faW5pdCgpIGVtaXRzIHRoZSBjbGVhbnVwXG4tXHQgKiBibG9jayBhcyBhIHByb2ctZmQgY2xvc2UgbG9vcCB3aG9zZSBmaXJzdCBpbnN0cnVjdGlvbiBpcyB0aGUgbGFiZWxcbi1cdCAqIGV2ZXJ5IGVycm9yIGJyYW5jaCBqdW1wcyB0by5cbi1cdCAqL1xuLVx0Zm9yIChpID0gMDsgaSAmIzQzOyAyIFx1MDAzYyBhOyBpJiM0MzsmIzQzOykge1xuLVx0XHRpZiAoaW5baV0uY29kZSA9PSAoQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfVykgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBpbltpXS5kc3RfcmVnID09IEJQRl9SRUdfMSBcdTAwMjZcdTAwMjYgaW5baV0uc3JjX3JlZyA9PSBCUEZfUkVHXzEwIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgaW5baSAmIzQzOyAxXS5jb2RlID09IChCUEZfSk1QIHwgQlBGX0pTTEUgfCBCUEZfSykgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBpbltpICYjNDM7IDFdLmRzdF9yZWcgPT0gQlBGX1JFR18xIFx1MDAyNlx1MDAyNiBpbltpICYjNDM7IDFdLmltbSA9PSAwIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgaW5baSAmIzQzOyAxXS5vZmYgPT0gMSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGluW2kgJiM0MzsgMl0uY29kZSA9PSAoQlBGX0pNUCB8IEJQRl9DQUxMKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGluW2kgJiM0MzsgMl0uaW1tID09IEJQRl9GVU5DX3N5c19jbG9zZSkge1xuLVx0XHRcdGNsZWFudXAgPSBpO1xuLVx0XHRcdGJyZWFrO1xuLVx0XHR9XG4tXHR9XG4tXHRpZiAoIUFTU0VSVF9HRShjbGVhbnVwLCAwLCBcJiMzNDtjbGVhbnVwIGxhYmVsIGxvY2F0ZWRcJiMzNDspKVxuLVx0XHRyZXR1cm47XG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYjsgaSYjNDM7JiM0MzspIHtcbi1cdFx0dCA9IGJyW2ldICYjNDM7IDEgJiM0MzsgaW5bYnJbaV1dLm9mZjtcbi1cdFx0QVNTRVJUX0VRKHQsIGNsZWFudXAsIFwmIzM0O3NpZy1tYXRjaCBsYW5kcyBvbiBjbGVhbnVwXCYjMzQ7KTtcbi1cdH1cbi1cdC8qXG4tXHQgKiBTYW1lIGludmFyaWFudCBmb3IgZXZlcnkgb3RoZXIgY2xlYW51cC1ib3VuZCBqdW1wIGluIHRoZSBwcm9ncmFtOlxuLVx0ICogZW1pdF9jaGVja19lcnIoKSBpcyB0aGUgb25seSBzb3VyY2Ugb2YgXCYjMzQ7aWYgKHI3IFx1MDAzYyAwKSBnb3RvIGNsZWFudXBcJiMzNDssXG4tXHQgKiBzbyBlYWNoIG9mIHRob3NlIG11c3QgYWxzbyByZXNvbHZlIGV4YWN0bHkgdG8gY2xlYW51cC5cbi1cdCAqL1xuLVx0Zm9yIChpID0gMCwgdCA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KSB7XG4tXHRcdGlmIChpbltpXS5jb2RlICE9IChCUEZfSk1QIHwgQlBGX0pTTFQgfCBCUEZfSykgfHxcbi1cdFx0ICAgIGluW2ldLmRzdF9yZWcgIT0gQlBGX1JFR183IHx8IGluW2ldLmltbSAhPSAwIHx8IGluW2ldLm9mZiBcdTAwM2U9IDApXG4tXHRcdFx0Y29udGludWU7XG4tXHRcdEFTU0VSVF9FUShpICYjNDM7IDEgJiM0MzsgaW5baV0ub2ZmLCBjbGVhbnVwLCBcJiMzNDtlcnItY2hlY2sgbGFuZHMgb24gY2xlYW51cFwmIzM0Oyk7XG4tXHRcdHQmIzQzOyYjNDM7O1xuLVx0fVxuLVx0QVNTRVJUX0dUKHQsIDAsIFwmIzM0O2ZvdW5kIGVtaXRfY2hlY2tfZXJyIGp1bXBzXCYjMzQ7KTtcbi19XG4tXG4gc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSB7XG4gXHRzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyICpza2VsO1xuIFx0c3RydWN0IGdlbl9sb2FkZXJfb3B0cyBnb3B0cztcbkBAIC0zNzIsMTYgJiM0MzsyOTEsNiBAQCBzdGF0aWMgdm9pZCBnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlICpmKVxuIFx0dGVzdF9zaWduZWRfbG9hZGVyX19kZXN0cm95KGYtXHUwMDNlc2tlbCk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIG1ldGFkYXRhX2NoZWNrX3NoYXBlKHZvaWQpXG4te1xuLVx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuLVxuLVx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApXG4tXHRcdGNoZWNrX3NpZ19tYXRjaF9zaGFwZSgoY29uc3Qgc3RydWN0IGJwZl9pbnNuICopZi5nb3B0cy5pbnNucyxcbi1cdFx0XHRcdCAgICAgIGYuZ29wdHMuaW5zbnNfc3ogLyBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKSk7XG4tXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbi19XG4tXG4gc3RhdGljIHZvaWQgbWV0YWRhdGFfbWF0Y2godm9pZClcbiB7XG4gXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XG5AQCAtMzkxLDk0ICYjNDM7MzAwLDI2MyBAQCBzdGF0aWMgdm9pZCBtZXRhZGF0YV9tYXRjaCh2b2lkKVxuIFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApIHtcbiBcdFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYixcbiBcdFx0XHRcdCAgIGYuZGF0YV9zeiwgZi5leGNsLCBzaXplb2YoZi5leGNsKSwgTlVMTCwgMCxcbi1cdFx0XHRcdCAgIHRydWUsIGYuY3R4LCBmLmN0eF9zeiwgXHUwMDI2cmFuKTtcbiYjNDM7XHRcdFx0XHQgICBmLmN0eCwgZi5jdHhfc3osIFx1MDAyNnJhbik7XG4gXHRcdEFTU0VSVF9UUlVFKHJhbiwgXCYjMzQ7bG9hZGVyIHJhblwmIzM0Oyk7XG4gXHRcdEFTU0VSVF9FUShyLCAwLCBcJiMzNDtob25lc3QgbG9hZGVyIHJldHZhbFwmIzM0Oyk7XG4gXHR9XG4gXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgbWV0YWRhdGFfc2hhX21pc21hdGNoKHZvaWQpXG4mIzQzO3N0YXRpYyB2b2lkIHNpZ25hdHVyZV9lbmZvcmNlZCh2b2lkKVxuIHtcbiYjNDM7XHRzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHsgMHgzMCwgMHg0MiwgMHgxMywgMHgzNywgfTtcbiBcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbi1cdGJvb2wgcmFuO1xuLVx0aW50IHI7XG4mIzQzO1x0aW50IGZkO1xuIFxuIFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApIHtcbiBcdFx0Lypcbi1cdFx0ICogYmxvYlswXSBsaXZlcyBpbiB0aGUgbG9hZGVyJiMzOTtzIGZkX2FycmF5IHNjcmF0Y2ggKGZpcnN0IGFkZF9kYXRhIGluXG4tXHRcdCAqIGJwZl9nZW5fX2luaXQpOyBhIDAtbWFwIHByb2dyYW0gbmV2ZXIgcmVhZHMgaXQsIHNvIGZsaXBwaW5nIGl0XG4tXHRcdCAqIGNoYW5nZXMgb25seSBtYXAtXHUwMDNlc2hhLiBUaGUgbWV0YWRhdGEgY2hlY2sgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdFxuLVx0XHQgKiBjYW4gbm90aWNlIC1cdTAwM2UgaXNvbGF0ZXMgZW1pdF9zaWduYXR1cmVfbWF0Y2guXG4mIzQzO1x0XHQgKiBBIHByZXNlbnQtYnV0LWludmFsaWQgc2lnbmF0dXJlICh0aGUgY2VydCBieXRlcyBhcmUgbm90IGFcbiYjNDM7XHRcdCAqIFBLQ1MjNyBzaWduYXR1cmUpIG11c3QgYmUgcmVqZWN0ZWQgYXQgbG9hZDogdGhlIHNpZ25hdHVyZVxuJiM0MztcdFx0ICogcGF0aCBpcyBob25vcmVkLCBub3QgaWdub3JlZC4gKFRoZSB2YWxpZCBwYXRoIGlzIGNvdmVyZWQgYnlcbiYjNDM7XHRcdCAqIHRoZSBzaWduZWQgbHNrZWxzLikgUGluIC1FQkFETVNHLCB0aGUgUEtDUyM3IHBhcnNlIGZhaWx1cmU6XG4mIzQzO1x0XHQgKiBhIGxvb3NlciBmZCBcdTAwM2MgMCBjaGVjayBjb3VsZCBhbHNvIGJlIHNhdGlzZmllZCBieSB0aGUgc3BhcnNlXG4mIzQzO1x0XHQgKiBmZF9hcnJheSByZWplY3Rpb24gKC1FQUNDRVMpIHRoYXQgdGhlIGxvYWRlciYjMzk7cyBtYXAgcmVmZXJlbmNlXG4mIzQzO1x0XHQgKiB3b3VsZCB0cmlwIGV2ZW4gaWYgdGhlIHNpZ25hdHVyZSB3ZXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gXHRcdCAqL1xuLVx0XHRmLmJsb2JbMF0gXj0gMHhmZjtcbi1cdFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYixcbi1cdFx0XHRcdCAgIGYuZGF0YV9zeiwgZi5leGNsLCBzaXplb2YoZi5leGNsKSwgTlVMTCwgMCxcbi1cdFx0XHRcdCAgIHRydWUsIGYuY3R4LCBmLmN0eF9zeiwgXHUwMDI2cmFuKTtcbi1cdFx0QVNTRVJUX1RSVUUocmFuLCBcJiMzNDtsb2FkZXIgcmFuXCYjMzQ7KTtcbi1cdFx0QVNTRVJUX0VRKHIsIC1FSU5WQUwsIFwmIzM0O3RhbXBlcmVkIGJsb2IgcmVqZWN0ZWQgYnkgZW1pdF9zaWduYXR1cmVfbWF0Y2hcJiMzNDspO1xuJiM0MztcdFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuayxcbiYjNDM7XHRcdFx0XHQgc2l6ZW9mKGp1bmspLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDApO1xuJiM0MztcdFx0QVNTRVJUX0VRKGZkLCAtRUJBRE1TRywgXCYjMzQ7aW52YWxpZCBzaWduYXR1cmUgcmVqZWN0ZWQgYXQgbG9hZFwmIzM0Oyk7XG4gXHR9XG4gXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgbWV0YWRhdGFfbm90X2V4Y2x1c2l2ZSh2b2lkKVxuJiM0MztzdGF0aWMgdm9pZCBzaWduZWRfbm9uZXhjbF9mZF9hcnJheV9yZWplY3RlZCh2b2lkKVxuIHtcbiYjNDM7XHRzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHsgMHgzMCwgMHg0MiwgMHgxMywgMHgzNywgfTtcbiBcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbi1cdGJvb2wgcmFuO1xuLVx0aW50IHI7XG4mIzQzO1x0aW50IG1hcF9mZCwgZmQ7XG4gXG4gXHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXHUwMDI2ZikgPT0gMCkge1xuIFx0XHQvKlxuLVx0XHQgKiBDb3JyZWN0IGJsb2IgYnV0IGEgbm9uLWV4Y2x1c2l2ZSBtZXRhZGF0YSBtYXA6IHRoZSB2ZXJpZmllciBkb2VzXG4tXHRcdCAqIG5vdCByZWplY3QgKGV4Y2xfcHJvZ19zaGEgdW5zZXQpLCBzbyB0aGUgcnVudGltZSBtYXAtXHUwMDNlZXhjbCA9PSAxXG4tXHRcdCAqIGNoZWNrIGluIHRoZSBsb2FkZXIgbXVzdC5cbiYjNDM7XHRcdCAqIEEgc2lnbmVkIHByb2dyYW0gbWF5IG9ubHkgYmluZCBleGNsdXNpdmUgbWFwcyB0aHJvdWdoIGZkX2FycmF5XG4mIzQzO1x0XHQgKiAodGhlaXIgY29udGVudHMgYXJlIGZvbGRlZCBpbnRvIHRoZSBzaWduYXR1cmUpLiBCaW5kaW5nIGFcbiYjNDM7XHRcdCAqIG5vbi1leGNsdXNpdmUgbWFwIGlzIHJlamVjdGVkLCBiZWZvcmUgdGhlIHNpZ25hdHVyZSBpcyBldmVuXG4mIzQzO1x0XHQgKiBleGFtaW5lZC5cbiBcdFx0ICovXG4tXHRcdHIgPSBydW5fZ2VuX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsXG4tXHRcdFx0XHQgICBmLmRhdGFfc3osIE5VTEwsIDAsIE5VTEwsIDAsIHRydWUsIGYuY3R4LFxuLVx0XHRcdFx0ICAgZi5jdHhfc3osIFx1MDAyNnJhbik7XG4tXHRcdEFTU0VSVF9UUlVFKHJhbiwgXCYjMzQ7bG9hZGVyIHJhblwmIzM0Oyk7XG4tXHRcdEFTU0VSVF9FUShyLCAtRUlOVkFMLCBcJiMzNDtub24tZXhjbHVzaXZlIG1ldGFkYXRhIG1hcCByZWplY3RlZFwmIzM0Oyk7XG4mIzQzO1x0XHRtYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVksIFwmIzM0O25vbmV4Y2xcJiMzNDssIDQsXG4mIzQzO1x0XHRcdFx0XHRmLmRhdGFfc3osIDEsIE5VTEwpO1xuJiM0MztcdFx0aWYgKEFTU0VSVF9PS19GRChtYXBfZmQsIFwmIzM0O25vbmV4Y2xfbWFwXCYjMzQ7KSkge1xuJiM0MztcdFx0XHRpZiAoQVNTRVJUX09LKGJwZl9tYXBfZnJlZXplKG1hcF9mZCksIFwmIzM0O2ZyZWV6ZVwmIzM0OykpIHtcbiYjNDM7XHRcdFx0XHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osXG4mIzQzO1x0XHRcdFx0XHRcdCBtYXBfZmQsIGp1bmssIHNpemVvZihqdW5rKSxcbiYjNDM7XHRcdFx0XHRcdFx0IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7XG4mIzQzO1x0XHRcdFx0QVNTRVJUX0VRKGZkLCAtRVBFUk0sXG4mIzQzO1x0XHRcdFx0XHQgIFwmIzM0O25vbi1leGNsdXNpdmUgbWFwIGluIHNpZ25lZCBmZF9hcnJheSByZWplY3RlZFwmIzM0Oyk7XG4mIzQzO1x0XHRcdFx0aWYgKGZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdFx0XHRcdGNsb3NlKGZkKTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRjbG9zZShtYXBfZmQpO1xuJiM0MztcdFx0fVxuIFx0fVxuIFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXHUwMDI2Zik7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIG1ldGFkYXRhX2hhc2hfbm90X2NvbXB1dGVkKHZvaWQpXG4mIzQzO3N0YXRpYyB2b2lkIHNpZ25lZF91bmZyb3plbl9mZF9hcnJheV9yZWplY3RlZCh2b2lkKVxuIHtcbiYjNDM7XHRzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHsgMHgzMCwgMHg0MiwgMHgxMywgMHgzNywgfTtcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBtb3B0cyk7XG4gXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XG4tXHRib29sIHJhbjtcbi1cdGludCByO1xuJiM0MztcdF9fdTMyIGtleSA9IDA7XG4mIzQzO1x0aW50IG1hcF9mZCwgZmQ7XG4gXG4gXHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXHUwMDI2ZikgPT0gMCkge1xuIFx0XHQvKlxuLVx0XHQgKiBDb3JyZWN0LCBleGNsdXNpdmUsIGZyb3plbiBtYXAsIGJ1dCBpdHMgaGFzaCB3YXMgbmV2ZXIgY29tcHV0ZWRcbi1cdFx0ICogKG5vIE9CSl9HRVRfSU5GT19CWV9GRCksIHNvIG1hcC1cdTAwM2VzaGEgc3RheXMgemVyby4gVGhlIGxvYWRlciBtdXN0XG4tXHRcdCAqIGZhaWwgY2xvc2VkIHJhdGhlciB0aGFuIHRyZWF0IGFuIHVuc2V0IGhhc2ggYXMgYSBtYXRjaC5cbiYjNDM7XHRcdCAqIFRoZSBtZXRhZGF0YSBtYXAgbXVzdCBiZSBmcm96ZW4gYmVmb3JlIGEgc2lnbmVkIGxvYWQgc28gdGhlXG4mIzQzO1x0XHQgKiBmb2xkZWQgYnl0ZXMgY2Fubm90IGNoYW5nZSBhZnRlcndhcmRzLiBCaW5kIGFuIGV4Y2x1c2l2ZSBtYXBcbiYjNDM7XHRcdCAqIHdpdGggbWF0Y2hpbmcgY29udGVudHMgYnV0IHNraXAgdGhlIGZyZWV6ZTogdGhlIGxvYWQgbXVzdCBiZVxuJiM0MztcdFx0ICogcmVqZWN0ZWQgYnkgdGhlIGZyb3plbiBjaGVjayB3aXRoIC1FUEVSTS4gVGhlIGV4Y2x1c2l2aXR5XG4mIzQzO1x0XHQgKiBjaGVjayByaWdodCBhZnRlciBpdCB3b3VsZCBwYXNzLCBzbyB0aGUgZXJybm8gdW5pcXVlbHkgcGluc1xuJiM0MztcdFx0ICogdGhlIGZyZWV6ZSByZXF1aXJlbWVudC5cbiBcdFx0ICovXG4tXHRcdHIgPSBydW5fZ2VuX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsXG4tXHRcdFx0XHQgICBmLmRhdGFfc3osIGYuZXhjbCwgc2l6ZW9mKGYuZXhjbCksIE5VTEwsIDAsXG4tXHRcdFx0XHQgICBmYWxzZSwgZi5jdHgsIGYuY3R4X3N6LCBcdTAwMjZyYW4pO1xuLVx0XHRBU1NFUlRfVFJVRShyYW4sIFwmIzM0O2xvYWRlciByYW5cJiMzNDspO1xuLVx0XHRBU1NFUlRfRVEociwgLUVJTlZBTCwgXCYjMzQ7dW5jb21wdXRlZCBtZXRhZGF0YSBoYXNoIHJlamVjdGVkXCYjMzQ7KTtcbiYjNDM7XHRcdG1vcHRzLmV4Y2xfcHJvZ19oYXNoID0gZi5leGNsO1xuJiM0MztcdFx0bW9wdHMuZXhjbF9wcm9nX2hhc2hfc2l6ZSA9IHNpemVvZihmLmV4Y2wpO1xuJiM0MztcdFx0bWFwX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZLCBcJiMzNDt1bmZyb3plblwmIzM0OywgNCxcbiYjNDM7XHRcdFx0XHRcdGYuZGF0YV9zeiwgMSwgXHUwMDI2bW9wdHMpO1xuJiM0MztcdFx0aWYgKEFTU0VSVF9PS19GRChtYXBfZmQsIFwmIzM0O3VuZnJvemVuX21hcFwmIzM0OykpIHtcbiYjNDM7XHRcdFx0aWYgKEFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG1hcF9mZCwgXHUwMDI2a2V5LCBmLmJsb2IsIDApLFxuJiM0MztcdFx0XHRcdCAgICAgIFwmIzM0O3VwZGF0ZVwmIzM0OykpIHtcbiYjNDM7XHRcdFx0XHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osXG4mIzQzO1x0XHRcdFx0XHRcdCBtYXBfZmQsIGp1bmssIHNpemVvZihqdW5rKSxcbiYjNDM7XHRcdFx0XHRcdFx0IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7XG4mIzQzO1x0XHRcdFx0QVNTRVJUX0VRKGZkLCAtRVBFUk0sXG4mIzQzO1x0XHRcdFx0XHQgIFwmIzM0O3VuZnJvemVuIG1hcCBpbiBzaWduZWQgZmRfYXJyYXkgcmVqZWN0ZWRcJiMzNDspO1xuJiM0MztcdFx0XHRcdGlmIChmZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdFx0XHRjbG9zZShmZCk7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0Y2xvc2UobWFwX2ZkKTtcbiYjNDM7XHRcdH1cbiBcdH1cbiBcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBzaWduYXR1cmVfZW5mb3JjZWQodm9pZClcbiYjNDM7c3RhdGljIHZvaWQgc2lnbmVkX25vbmFycmF5X2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpXG4ge1xuIFx0c3RhdGljIGNvbnN0IF9fdTgganVua1s2NF0gPSB7IDB4MzAsIDB4NDIsIDB4MTMsIDB4MzcsIH07XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgbW9wdHMpO1xuIFx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuJiM0MztcdGludCBtYXBfZmQsIGZkO1xuJiM0MztcbiYjNDM7XHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXHUwMDI2ZikgPT0gMCkge1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIE9ubHkgYSBwbGFpbiBCUEZfTUFQX1RZUEVfQVJSQVkgbWF5IGJlIGZvbGRlZCBpbnRvIHRoZVxuJiM0MztcdFx0ICogc2lnbmF0dXJlLiBBbiBleGNsdXNpdmUgbWFwIG9mIGFueSBvdGhlciB0eXBlIGlzIHJlamVjdGVkXG4mIzQzO1x0XHQgKiAoLUVJTlZBTCkgcmF0aGVyIHRoYW4gZm9sZGVkIC0gdGhpcyBpcyB0aGUgdHlwZSBnYXRlIHRoYXRcbiYjNDM7XHRcdCAqIGtlZXBzIGFyZW5hIG1hcHMgKG1hcF9kaXJlY3RfdmFsdWVfYWRkcigpIHJldHVybnMgYSB1c2VyXG4mIzQzO1x0XHQgKiBhZGRyZXNzKSBhbmQgaW5zbi1hcnJheSBtYXBzIChidWZmZXIgc21hbGxlciB0aGFuIHZhbHVlX3NpemUpXG4mIzQzO1x0XHQgKiBvdXQgb2YgdGhlIGhhc2hlZCByZWdpb24sIHdoZXJlIHRoZSBvbGQgY29kZSB3b3VsZCBoYXZlXG4mIzQzO1x0XHQgKiBtZW1jcHkoKSYjMzk7ZCBmcm9tIHRoZW0uIEEgaGFzaCBtYXAgc3RhbmRzIGluIGhlcmU6IGl0IGlzXG4mIzQzO1x0XHQgKiBleGNsdXNpdmUgKGJvdW5kIHRvIHRoZSBsb2FkZXIgZGlnZXN0KSBidXQgbm90IGFuIGFycmF5LlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRtb3B0cy5leGNsX3Byb2dfaGFzaCA9IGYuZXhjbDtcbiYjNDM7XHRcdG1vcHRzLmV4Y2xfcHJvZ19oYXNoX3NpemUgPSBzaXplb2YoZi5leGNsKTtcbiYjNDM7XHRcdG1hcF9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcJiMzNDtleGNsX2hhc2hcJiMzNDssIDQsIDQsIDEsXG4mIzQzO1x0XHRcdFx0XHRcdTAwMjZtb3B0cyk7XG4mIzQzO1x0XHRpZiAoQVNTRVJUX09LX0ZEKG1hcF9mZCwgXCYjMzQ7ZXhjbF9oYXNoX21hcFwmIzM0OykpIHtcbiYjNDM7XHRcdFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsXG4mIzQzO1x0XHRcdFx0XHQganVuaywgc2l6ZW9mKGp1bmspLFxuJiM0MztcdFx0XHRcdFx0IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7XG4mIzQzO1x0XHRcdEFTU0VSVF9FUShmZCwgLUVJTlZBTCxcbiYjNDM7XHRcdFx0XHQgIFwmIzM0O25vbi1hcnJheSBtYXAgaW4gc2lnbmVkIGZkX2FycmF5IHJlamVjdGVkXCYjMzQ7KTtcbiYjNDM7XHRcdFx0aWYgKGZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdFx0XHRjbG9zZShmZCk7XG4mIzQzO1x0XHRcdGNsb3NlKG1hcF9mZCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHNldHVwX21ldGFfbWFwKGNvbnN0IHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgKmYpO1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgc2lnbmVkX2J0Zl9mZF9hcnJheV9yZWplY3RlZCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBkaXJfdG1wbFtdID0gXCYjMzQ7L3RtcC9zaWduZWRfbG9hZGVyX2J0ZlhYWFhYWFwmIzM0OywgKmRpciA9IE5VTEw7XG4mIzQzO1x0X191MzIgc2lnX3N6ID0gODE5MjtcbiYjNDM7XHRpbnQgbWFwX2ZkID0gLTEsIHByb2dfZmQgPSAtMTtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyICpidWYgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbiYjNDM7XHRib29sIGhhdmVfZml4dHVyZSA9IGZhbHNlO1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4mIzQzO1x0dW5pb24gYnBmX2F0dHIgYXR0cjtcbiYjNDM7XHRpbnQgZmRzWzJdO1xuJiM0MztcdF9fdTggc2lnWzgxOTJdO1xuJiM0MztcbiYjNDM7XHRzeXNjYWxsKF9fTlJfcmVxdWVzdF9rZXksIFwmIzM0O2tleXJpbmdcJiMzNDssIFwmIzM0O191aWQuMFwmIzM0OywgTlVMTCxcbiYjNDM7XHRcdEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4mIzQzO1x0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCYjMzQ7bWtkdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwmIzM0O3NldHVwXCYjMzQ7LCBkaXIpLCBcJiMzNDt2ZXJpZnlfc2lnX3NldHVwXCYjMzQ7KSkge1xuJiM0MztcdFx0cm1kaXIoZGlyKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1x0aGF2ZV9maXh0dXJlID0gdHJ1ZTtcbiYjNDM7XHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXHUwMDI2ZikgIT0gMClcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIGZkX2FycmF5IGJpbmRzIG1hcHMgYW5kIEJURnMgYWxpa2UsIGJ1dCBvbmx5IGV4Y2x1c2l2ZSBhcnJheSBtYXBzIGFyZVxuJiM0MztcdCAqIGZvbGRlZCBpbnRvIHRoZSBzaWduYXR1cmUuIEJ1aWxkIGFuIG90aGVyd2lzZSBnZW51aW5lbHkgc2lnbmVkIGxvYWQgLVxuJiM0MztcdCAqIGluc25zIHx8IG1ldGFkYXRhLCBleGNsdXNpdmUgZnJvemVuIG1hcCBhdCBmZF9hcnJheVswXSAtIHRoZW4gc211Z2dsZVxuJiM0MztcdCAqIGFuIGV4dHJhIEJURiBpbnRvIGZkX2FycmF5WzFdLiBBIHNpZ25lZCBwcm9ncmFtIG1heSBub3QgYmluZCBhbnkgQlRGLFxuJiM0MztcdCAqIHNvIHJlc29sdmluZyB0aGUgZmRfYXJyYXkgZW50cmllcyByZWplY3RzIHRoZSBCVEYgd2l0aCAtRUFDQ0VTIChpblxuJiM0MztcdCAqIF9fYWRkX3VzZWRfYnRmKCksIGJlZm9yZSB0aGUgc2lnbmF0dXJlIGlzIGV2ZW4gdmVyaWZpZWQpLlxuJiM0MztcdCAqL1xuJiM0MztcdGJ1ZiA9IG1hbGxvYygoc2l6ZV90KWYuZ29wdHMuaW5zbnNfc3ogJiM0MzsgZi5kYXRhX3N6KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoYnVmLCBcJiMzNDtzaWduYnVmXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdG1lbWNweShidWYsIGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3opO1xuJiM0MztcdG1lbWNweShidWYgJiM0MzsgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLCBmLmRhdGFfc3opO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgYnVmLCBmLmdvcHRzLmluc25zX3N6ICYjNDM7IGYuZGF0YV9zeiwgc2lnLFxuJiM0MztcdFx0XHQgICAgICAgXHUwMDI2c2lnX3N6KSwgXCYjMzQ7c2lnbiBpbnNuc3x8bWV0YWRhdGFcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdG1hcF9mZCA9IHNldHVwX21ldGFfbWFwKFx1MDAyNmYpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKG1hcF9mZCwgXCYjMzQ7bWV0YV9tYXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcJiMzNDtidGZfbmV3X2VtcHR5XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGJ0Zl9fYWRkX2ludChidGYsIFwmIzM0O2ludFwmIzM0OywgNCwgQlRGX0lOVF9TSUdORUQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcJiMzNDtidGZfbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0ZmRzWzBdID0gbWFwX2ZkO1xuJiM0MztcdGZkc1sxXSA9IGJ0Zl9fZmQoYnRmKTtcbiYjNDM7XHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcbiYjNDM7XHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbiYjNDM7XHRhdHRyLmluc25zID0gcHRyX3RvX3U2NChmLmdvcHRzLmluc25zKTtcbiYjNDM7XHRhdHRyLmluc25fY250ID0gZi5nb3B0cy5pbnNuc19zeiAvIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pO1xuJiM0MztcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXCYjMzQ7RHVhbCBCU0QvR1BMXCYjMzQ7KTtcbiYjNDM7XHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XG4mIzQzO1x0YXR0ci5mZF9hcnJheSA9IHB0cl90b191NjQoZmRzKTtcbiYjNDM7XHRhdHRyLmZkX2FycmF5X2NudCA9IDI7XG4mIzQzO1x0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XG4mIzQzO1x0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcbiYjNDM7XHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XG4mIzQzO1x0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcJiMzNDtfX2xvYWRlci5wcm9nXCYjMzQ7LCBzaXplb2YoXCYjMzQ7X19sb2FkZXIucHJvZ1wmIzM0OykpO1xuJiM0MztcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcdTAwMjZhdHRyLFxuJiM0MztcdFx0XHQgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XG4mIzQzO1x0QVNTRVJUX0VRKHByb2dfZmQgXHUwMDNjIDAgPyAtZXJybm8gOiBwcm9nX2ZkLCAtRUFDQ0VTLFxuJiM0MztcdFx0ICBcJiMzNDtCVEYgaW4gc2lnbmVkIGZkX2FycmF5IHJlamVjdGVkXCYjMzQ7KTtcbiYjNDM7XHRpZiAocHJvZ19mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShwcm9nX2ZkKTtcbiYjNDM7b3V0OlxuJiM0MztcdGlmIChidGYpXG4mIzQzO1x0XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7XHRpZiAobWFwX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKG1hcF9mZCk7XG4mIzQzO1x0aWYgKGhhdmVfZml4dHVyZSlcbiYjNDM7XHRcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuJiM0MztcdGlmIChkaXIpXG4mIzQzO1x0XHRydW5fc2V0dXAoXCYjMzQ7Y2xlYW51cFwmIzM0OywgZGlyKTtcbiYjNDM7XHRmcmVlKGJ1Zik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHNpZ25hdHVyZV9mYWlsdXJlX2xvZ3Modm9pZClcbiYjNDM7e1xuJiM0MztcdHN0YXRpYyBjb25zdCBfX3U4IGp1bmtbNjRdID0geyAweDMwLCAweDQyLCAweDEzLCAweDM3LCB9O1xuJiM0MztcdGNoYXIgbG9nX2J1ZlsxMDI0XSA9IHt9O1xuJiM0MztcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbiYjNDM7XHR1bmlvbiBicGZfYXR0ciBhdHRyO1xuIFx0aW50IGZkO1xuIFxuIFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApIHtcbiBcdFx0Lypcbi1cdFx0ICogQSBwcmVzZW50LWJ1dC1pbnZhbGlkIHNpZ25hdHVyZSAodGhlIGNlcnQgYnl0ZXMgYXJlIG5vdCBhXG4tXHRcdCAqIFBLQ1MjNyBzaWduYXR1cmUpIG11c3QgYmUgcmVqZWN0ZWQgYXQgbG9hZDogdGhlIHNpZ25hdHVyZVxuLVx0XHQgKiBwYXRoIGlzIGhvbm9yZWQsIG5vdCBpZ25vcmVkLiAoVGhlIHZhbGlkIHBhdGggaXMgY292ZXJlZCBieVxuLVx0XHQgKiB0aGUgc2lnbmVkIGxza2Vscy4pXG4mIzQzO1x0XHQgKiBTaWduYXR1cmUgdmVyaWZpY2F0aW9uIG5vdyBydW5zIGluc2lkZSBicGZfY2hlY2soKSwgc28gYVxuJiM0MztcdFx0ICogZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSB2ZXJpZmllciBsb2cuIEEgcHJlc2VudC1idXQtXG4mIzQzO1x0XHQgKiBpbnZhbGlkIHNpZ25hdHVyZSBpcyByZWplY3RlZCBhbmQgdGhlIGxvZyBzYXlzIHdoeS5cbiBcdFx0ICovXG4tXHRcdGZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgLTEsIGp1bmssXG4tXHRcdFx0XHQgc2l6ZW9mKGp1bmspLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xuJiM0MztcdFx0bWVtc2V0KFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XG4mIzQzO1x0XHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbiYjNDM7XHRcdGF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGYuZ29wdHMuaW5zbnMpO1xuJiM0MztcdFx0YXR0ci5pbnNuX2NudCA9IGYuZ29wdHMuaW5zbnNfc3ogLyBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKTtcbiYjNDM7XHRcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXCYjMzQ7RHVhbCBCU0QvR1BMXCYjMzQ7KTtcbiYjNDM7XHRcdGF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTtcbiYjNDM7XHRcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChqdW5rKTtcbiYjNDM7XHRcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaXplb2YoanVuayk7XG4mIzQzO1x0XHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XG4mIzQzO1x0XHRhdHRyLmxvZ19sZXZlbCA9IDE7XG4mIzQzO1x0XHRhdHRyLmxvZ19idWYgPSBwdHJfdG9fdTY0KGxvZ19idWYpO1xuJiM0MztcdFx0YXR0ci5sb2dfc2l6ZSA9IHNpemVvZihsb2dfYnVmKTtcbiYjNDM7XHRcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXCYjMzQ7X19sb2FkZXIucHJvZ1wmIzM0Oywgc2l6ZW9mKFwmIzM0O19fbG9hZGVyLnByb2dcJiMzNDspKTtcbiYjNDM7XG4mIzQzO1x0XHRmZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFx1MDAyNmF0dHIsXG4mIzQzO1x0XHRcdCAgICAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcbiBcdFx0QVNTRVJUX0xUKGZkLCAwLCBcJiMzNDtpbnZhbGlkIHNpZ25hdHVyZSByZWplY3RlZCBhdCBsb2FkXCYjMzQ7KTtcbiYjNDM7XHRcdGlmIChmZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdGNsb3NlKGZkKTtcbiYjNDM7XHRcdEFTU0VSVF9IQVNfU1VCU1RSKGxvZ19idWYsIFwmIzM0O3NpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgXCYjMzQ7dmVyaWZpZXIgbG9ncyBzaWduYXR1cmUgZmFpbHVyZVwmIzM0Oyk7XG4gXHR9XG4gXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbiB9XG5AQCAtNDk1LDcgJiM0Mzs1NzMsNyBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfdG9vX2xhcmdlKHZvaWQpXG4gXHRcdCAqIGlzIHJlamVjdGVkIGJlZm9yZSB0aGUgYnVmZmVyIGlzIHJlYWQuXG4gXHRcdCAqL1xuIFx0XHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLFxuLVx0XHRcdFx0IDY0IFx1MDAzY1x1MDAzYyAyMCwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcbiYjNDM7XHRcdFx0XHQgNjQgXHUwMDNjXHUwMDNjIDIwLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDApO1xuIFx0XHRBU1NFUlRfRVEoZmQsIC1FSU5WQUwsIFwmIzM0O292ZXJzaXplZCBzaWduYXR1cmUgcmVqZWN0ZWRcJiMzNDspO1xuIFx0fVxuIFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXHUwMDI2Zik7XG5AQCAtNTE1LDcgJiM0Mzs1OTMsNyBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfYmFkX2tleXJpbmcodm9pZClcbiBcdFx0ICogbGFyZ2UgcG9zaXRpdmUgc2VyaWFsIHRha2VzIHRoZSB1c2VyLWtleXJpbmcgcGF0aCBhbmQgd29uJiMzOTt0IGV4aXN0LlxuIFx0XHQgKi9cbiBcdFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuayxcbi1cdFx0XHRcdCBzaXplb2YoanVuayksIElOVF9NQVgpO1xuJiM0MztcdFx0XHRcdCBzaXplb2YoanVuayksIElOVF9NQVgsIDApO1xuIFx0XHRBU1NFUlRfRVEoZmQsIC1FSU5WQUwsIFwmIzM0O3NpZ25hdHVyZSB3aXRoIGJhZCBrZXlyaW5nX2lkIHJlamVjdGVkXCYjMzQ7KTtcbiBcdH1cbiBcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuQEAgLTU3NSw3ICYjNDM7NjUzLDcgQEAgc3RhdGljIHZvaWQgbWV0YWRhdGFfY3R4X21heF9lbnRyaWVzX2lnbm9yZWQodm9pZClcbiBcdG1lbWNweShibG9iLCBnb3B0cy5kYXRhLCBkYXRhX3N6KTtcbiBcbiBcdHIgPSBydW5fZ2VuX2xvYWRlcihnb3B0cy5pbnNucywgZ29wdHMuaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osXG4tXHRcdFx0ICAgZXhjbCwgc2l6ZW9mKGV4Y2wpLCBOVUxMLCAwLCB0cnVlLCBjdHgsIGN0eF9zeiwgXHUwMDI2cmFuKTtcbiYjNDM7XHRcdFx0ICAgZXhjbCwgc2l6ZW9mKGV4Y2wpLCBOVUxMLCAwLCBjdHgsIGN0eF9zeiwgXHUwMDI2cmFuKTtcbiBcdGlmICghQVNTRVJUX1RSVUUocmFuLCBcJiMzNDtsb2FkZXIgcmFuXCYjMzQ7KSB8fFxuIFx0ICAgICFBU1NFUlRfRVEociwgMCwgXCYjMzQ7bG9hZGVyIHJldHZhbFwmIzM0OykpXG4gXHRcdGdvdG8gZnJlZV9ibG9iO1xuQEAgLTY2MSw3ICYjNDM7NzM5LDcgQEAgc3RhdGljIHZvaWQgbWV0YWRhdGFfY3R4X2luaXRpYWxfdmFsdWVfaWdub3JlZCh2b2lkKVxuIFx0bWVtY3B5KGJsb2IsIGdvcHRzLmRhdGEsIGRhdGFfc3opO1xuIFxuIFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGdvcHRzLmluc25zLCBnb3B0cy5pbnNuc19zeiwgYmxvYiwgZGF0YV9zeixcbi1cdFx0XHQgICBleGNsLCBzaXplb2YoZXhjbCksIE5VTEwsIDAsIHRydWUsIGN0eCwgY3R4X3N6LCBcdTAwMjZyYW4pO1xuJiM0MztcdFx0XHQgICBleGNsLCBzaXplb2YoZXhjbCksIE5VTEwsIDAsIGN0eCwgY3R4X3N6LCBcdTAwMjZyYW4pO1xuIFx0aWYgKCFBU1NFUlRfVFJVRShyYW4sIFwmIzM0O2xvYWRlciByYW5cJiMzNDspIHx8XG4gXHQgICAgIUFTU0VSVF9FUShyLCAwLCBcJiMzNDtsb2FkZXIgcmV0dmFsXCYjMzQ7KSlcbiBcdFx0Z290byBmcmVlX2Jsb2I7XG5AQCAtNzE0LDYgJiM0Mzs3OTIsNyBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfYXV0aGVudGljYXRlc19pbnNucyh2b2lkKVxuIFx0X191OCBleGNsW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXSwgc2lnWzgxOTJdO1xuIFx0X191MzIgc2lnX3N6ID0gc2l6ZW9mKHNpZyksIGluc25zX3N6LCBkYXRhX3N6LCBjdHhfc3o7XG4gXHR1bnNpZ25lZCBjaGFyICppbnNucyA9IE5VTEwsICp0YW1wZXJlZCA9IE5VTEwsICpibG9iID0gTlVMTDtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyICpzaWduYnVmID0gTlVMTDtcbiBcdGludCBucl9tYXBzID0gMCwgbnJfcHJvZ3MgPSAwLCByO1xuIFx0c3RydWN0IGJwZl9wcm9ncmFtICpwO1xuIFx0c3RydWN0IGJwZl9tYXAgKm07XG5AQCAtNzYwLDI5ICYjNDM7ODM5LDE0MSBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfYXV0aGVudGljYXRlc19pbnNucyh2b2lkKVxuIFx0bWVtY3B5KGJsb2IsIGdvcHRzLmRhdGEsIGRhdGFfc3opO1xuIFx0bGliYnBmX3NoYTI1NihpbnNucywgaW5zbnNfc3osIGV4Y2wpO1xuIFxuLVx0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBpbnNucywgaW5zbnNfc3osIHNpZywgXHUwMDI2c2lnX3N6KSwgXCYjMzQ7c2lnbi1maWxlXCYjMzQ7KSlcbiYjNDM7XHRzaWduYnVmID0gbWFsbG9jKChzaXplX3QpaW5zbnNfc3ogJiM0MzsgZGF0YV9zeik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNpZ25idWYsIFwmIzM0O3NpZ25idWZcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdG1lbWNweShzaWduYnVmLCBpbnNucywgaW5zbnNfc3opO1xuJiM0MztcdG1lbWNweShzaWduYnVmICYjNDM7IGluc25zX3N6LCBibG9iLCBkYXRhX3N6KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIHNpZ25idWYsIGluc25zX3N6ICYjNDM7IGRhdGFfc3osIHNpZywgXHUwMDI2c2lnX3N6KSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtzaWduLWZpbGVcJiMzNDspKVxuIFx0XHRnb3RvIGNsZWFudXA7XG4gXG4gXHRtZW1zZXQoY3R4LCAwLCBjdHhfc3opO1xuIFx0KChzdHJ1Y3QgYnBmX2xvYWRlcl9jdHggKiljdHgpLVx1MDAzZXN6ID0gY3R4X3N6O1xuIFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGluc25zLCBpbnNuc19zeiwgYmxvYiwgZGF0YV9zeiwgZXhjbCwgc2l6ZW9mKGV4Y2wpLFxuLVx0XHRcdCAgIHNpZywgc2lnX3N6LCB0cnVlLCBjdHgsIGN0eF9zeiwgXHUwMDI2cmFuKTtcbiYjNDM7XHRcdFx0ICAgc2lnLCBzaWdfc3osIGN0eCwgY3R4X3N6LCBcdTAwMjZyYW4pO1xuIFx0QVNTRVJUX1RSVUUocmFuLCBcJiMzNDt2YWxpZCBzaWduYXR1cmU6IGxvYWRlciBsb2FkZWQgYW5kIHJhblwmIzM0Oyk7XG4gXHRBU1NFUlRfRVEociwgMCwgXCYjMzQ7dmFsaWQgc2lnbmF0dXJlIGFjY2VwdGVkXCYjMzQ7KTtcbiBcdGNsb3NlX2xvYWRlcl9jdHhfZmRzKGN0eCwgbnJfbWFwcywgbnJfcHJvZ3MpO1xuIFxuIFx0bWVtY3B5KHRhbXBlcmVkLCBpbnNucywgaW5zbnNfc3opO1xuIFx0dGFtcGVyZWRbaW5zbnNfc3ogLyAyXSBePSAweGZmO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQmluZCB0aGUgbWV0YWRhdGEgbWFwIHRvIHRoZSB0YW1wZXJlZCBsb2FkZXImIzM5O3Mgb3duIGRpZ2VzdCwgc28gdGhlXG4mIzQzO1x0ICogdmVyaWZpZXImIzM5O3MgZXhjbHVzaXZlLW1hcCBjaGVjayAoZXhjbF9wcm9nX3NoYSA9PSBwcm9nLVx1MDAzZWRpZ2VzdCkgcGFzc2VzXG4mIzQzO1x0ICogYW5kIHRoZSBzaWduYXR1cmUgLSB2ZXJpZmllZCBhZnRlciB0aGUgbWFwcyBhcmUgcmVzb2x2ZWQgLSBpcyB3aGF0XG4mIzQzO1x0ICogcmVqZWN0cyB0aGUgbG9hZC4gVGhpcyBpcyB0aGUgYXR0YWNrZXImIzM5O3MgYmVzdCBjYXNlOiBldmVuIGFmdGVyXG4mIzQzO1x0ICogcmUtYmluZGluZyB0aGUgZXhjbHVzaXZlIG1hcCB0byB0aGVpciB0YW1wZXJlZCBsb2FkZXIsIHRoZSBzaWduYXR1cmVcbiYjNDM7XHQgKiBvdmVyIHRoZSBvcmlnaW5hbCBpbnNucyB8fCBtZXRhZGF0YSBzdGlsbCBmYWlscy4gKExlYXZpbmcgdGhlIG1hcFxuJiM0MztcdCAqIGJvdW5kIHRvIHRoZSBvcmlnaW5hbCBkaWdlc3Qgd291bGQgaW5zdGVhZCB0cmlwIHRoZSBleGNsIGNoZWNrIGZpcnN0LilcbiYjNDM7XHQgKi9cbiYjNDM7XHRsaWJicGZfc2hhMjU2KHRhbXBlcmVkLCBpbnNuc19zeiwgZXhjbCk7XG4gXHRtZW1zZXQoY3R4LCAwLCBjdHhfc3opO1xuIFx0KChzdHJ1Y3QgYnBmX2xvYWRlcl9jdHggKiljdHgpLVx1MDAzZXN6ID0gY3R4X3N6O1xuIFx0ciA9IHJ1bl9nZW5fbG9hZGVyKHRhbXBlcmVkLCBpbnNuc19zeiwgYmxvYiwgZGF0YV9zeiwgZXhjbCwgc2l6ZW9mKGV4Y2wpLFxuLVx0XHRcdCAgIHNpZywgc2lnX3N6LCB0cnVlLCBjdHgsIGN0eF9zeiwgXHUwMDI2cmFuKTtcbiYjNDM7XHRcdFx0ICAgc2lnLCBzaWdfc3osIGN0eCwgY3R4X3N6LCBcdTAwMjZyYW4pO1xuIFx0QVNTRVJUX0ZBTFNFKHJhbiwgXCYjMzQ7dGFtcGVyZWQgbG9hZGVyIHJlamVjdGVkIGJlZm9yZSBydW5cJiMzNDspO1xuIFx0QVNTRVJUX0VRKHIsIC1FS0VZUkVKRUNURUQsIFwmIzM0O3NpZ25hdHVyZSBpcyBib3VuZCB0byB0aGUgaW5zdHJ1Y3Rpb25zXCYjMzQ7KTtcbiBjbGVhbnVwOlxuIFx0ZnJlZShpbnNucyk7XG4gXHRmcmVlKHRhbXBlcmVkKTtcbiBcdGZyZWUoYmxvYik7XG4mIzQzO1x0ZnJlZShzaWduYnVmKTtcbiYjNDM7XHRmcmVlKGN0eCk7XG4mIzQzO1x0dGVzdF9zaWduZWRfbG9hZGVyX19kZXN0cm95KHNrZWwpO1xuJiM0MztcdHJ1bl9zZXR1cChcJiMzNDtjbGVhbnVwXCYjMzQ7LCBkaXIpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBzaWduYXR1cmVfYXV0aGVudGljYXRlc19tZXRhZGF0YSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoZ2VuX2xvYWRlcl9vcHRzLCBnb3B0cywgLmdlbl9oYXNoID0gdHJ1ZSk7XG4mIzQzO1x0Y2hhciBkaXJfdG1wbFtdID0gXCYjMzQ7L3RtcC9zaWduZWRfbG9hZGVyWFhYWFhYXCYjMzQ7LCAqZGlyO1xuJiM0MztcdHN0cnVjdCB0ZXN0X3NpZ25lZF9sb2FkZXIgKnNrZWwgPSBOVUxMO1xuJiM0MztcdF9fdTggZXhjbFtTSEEyNTZfRElHRVNUX0xFTkdUSF0sIHNpZ1s4MTkyXTtcbiYjNDM7XHRfX3UzMiBzaWdfc3ogPSBzaXplb2Yoc2lnKSwgaW5zbnNfc3osIGRhdGFfc3osIGN0eF9zejtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyICppbnNucyA9IE5VTEwsICpibG9iID0gTlVMTDtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyICpzaWduYnVmID0gTlVMTDtcbiYjNDM7XHRpbnQgbnJfbWFwcyA9IDAsIG5yX3Byb2dzID0gMCwgcjtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3Byb2dyYW0gKnA7XG4mIzQzO1x0c3RydWN0IGJwZl9tYXAgKm07XG4mIzQzO1x0dm9pZCAqY3R4ID0gTlVMTDtcbiYjNDM7XHRib29sIHJhbjtcbiYjNDM7XG4mIzQzO1x0c3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCBcJiMzNDtrZXlyaW5nXCYjMzQ7LCBcJiMzNDtfdWlkLjBcJiMzNDssIE5VTEwsXG4mIzQzO1x0XHRLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xuJiM0MztcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwmIzM0O21rZHRlbXBcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcJiMzNDtzZXR1cFwmIzM0OywgZGlyKSwgXCYjMzQ7dmVyaWZ5X3NpZ19zZXR1cFwmIzM0OykpIHtcbiYjNDM7XHRcdHJtZGlyKGRpcik7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRza2VsID0gdGVzdF9zaWduZWRfbG9hZGVyX19vcGVuKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwmIzM0O3NrZWxfb3BlblwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soYnBmX29iamVjdF9fZ2VuX2xvYWRlcihza2VsLVx1MDAzZW9iaiwgXHUwMDI2Z29wdHMpLCBcJiMzNDtnZW5fbG9hZGVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhicGZfb2JqZWN0X19sb2FkKHNrZWwtXHUwMDNlb2JqKSwgXCYjMzQ7Z2VuX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRicGZfb2JqZWN0X19mb3JfZWFjaF9wcm9ncmFtKHAsIHNrZWwtXHUwMDNlb2JqKVxuJiM0MztcdFx0bnJfcHJvZ3MmIzQzOyYjNDM7O1xuJiM0MztcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX21hcChtLCBza2VsLVx1MDAzZW9iailcbiYjNDM7XHRcdG5yX21hcHMmIzQzOyYjNDM7O1xuJiM0MztcdGN0eF9zeiA9IHNpemVvZihzdHJ1Y3QgYnBmX2xvYWRlcl9jdHgpICYjNDM7XG4mIzQzO1x0XHQgbnJfbWFwcyAqIHNpemVvZihzdHJ1Y3QgYnBmX21hcF9kZXNjKSAmIzQzO1xuJiM0MztcdFx0IG5yX3Byb2dzICogc2l6ZW9mKHN0cnVjdCBicGZfcHJvZ19kZXNjKTtcbiYjNDM7XHRpbnNuc19zeiA9IGdvcHRzLmluc25zX3N6O1xuJiM0MztcdGRhdGFfc3ogPSBnb3B0cy5kYXRhX3N6O1xuJiM0MztcdGN0eCA9IGNhbGxvYygxLCBjdHhfc3opO1xuJiM0MztcdGluc25zID0gbWFsbG9jKGluc25zX3N6KTtcbiYjNDM7XHRibG9iID0gbWFsbG9jKGRhdGFfc3opO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihjdHgsIFwmIzM0O2N0eFwmIzM0OykgfHxcbiYjNDM7XHQgICAgIUFTU0VSVF9PS19QVFIoaW5zbnMsIFwmIzM0O2luc25zXCYjMzQ7KSB8fFxuJiM0MztcdCAgICAhQVNTRVJUX09LX1BUUihibG9iLCBcJiMzNDtibG9iXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRtZW1jcHkoaW5zbnMsIGdvcHRzLmluc25zLCBpbnNuc19zeik7XG4mIzQzO1x0bWVtY3B5KGJsb2IsIGdvcHRzLmRhdGEsIGRhdGFfc3opO1xuJiM0MztcdGxpYmJwZl9zaGEyNTYoaW5zbnMsIGluc25zX3N6LCBleGNsKTtcbiYjNDM7XG4mIzQzO1x0c2lnbmJ1ZiA9IG1hbGxvYygoc2l6ZV90KWluc25zX3N6ICYjNDM7IGRhdGFfc3opO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihzaWduYnVmLCBcJiMzNDtzaWduYnVmXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRtZW1jcHkoc2lnbmJ1ZiwgaW5zbnMsIGluc25zX3N6KTtcbiYjNDM7XHRtZW1jcHkoc2lnbmJ1ZiAmIzQzOyBpbnNuc19zeiwgYmxvYiwgZGF0YV9zeik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBzaWduYnVmLCBpbnNuc19zeiAmIzQzOyBkYXRhX3N6LCBzaWcsIFx1MDAyNnNpZ19zeiksXG4mIzQzO1x0XHQgICAgICAgXCYjMzQ7c2lnbi1maWxlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KGN0eCwgMCwgY3R4X3N6KTtcbiYjNDM7XHQoKHN0cnVjdCBicGZfbG9hZGVyX2N0eCAqKWN0eCktXHUwMDNlc3ogPSBjdHhfc3o7XG4mIzQzO1x0ciA9IHJ1bl9nZW5fbG9hZGVyKGluc25zLCBpbnNuc19zeiwgYmxvYiwgZGF0YV9zeiwgZXhjbCwgc2l6ZW9mKGV4Y2wpLFxuJiM0MztcdFx0XHQgICBzaWcsIHNpZ19zeiwgY3R4LCBjdHhfc3osIFx1MDAyNnJhbik7XG4mIzQzO1x0QVNTRVJUX1RSVUUocmFuLCBcJiMzNDt2YWxpZCBzaWduYXR1cmU6IGxvYWRlciBsb2FkZWQgYW5kIHJhblwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKHIsIDAsIFwmIzM0O3ZhbGlkIHNpZ25hdHVyZSBhY2NlcHRlZFwmIzM0Oyk7XG4mIzQzO1x0Y2xvc2VfbG9hZGVyX2N0eF9mZHMoY3R4LCBucl9tYXBzLCBucl9wcm9ncyk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGFtcGVyIHRoZSBtZXRhZGF0YSBhZnRlciBzaWduaW5nIHdoaWxlIGxlYXZpbmcgdGhlIGluc3RydWN0aW9uc1xuJiM0MztcdCAqIGFuZCB0aHVzIHRoZSBleGNsdXNpdmUgaGFzaCBiaW5kaW5nIHVudG91Y2hlZDogdGhlIG1hcCBmcmVlemVzXG4mIzQzO1x0ICogZmluZSBhbmQgZXhjbF9wcm9nX3NoYSBzdGlsbCBtYXRjaGVzIHRoZSBsb2FkZXImIzM5O3MgZGlnZXN0LCBzbyB0aGVcbiYjNDM7XHQgKiBsb2FkIHJlYWNoZXMgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiwgd2hpY2ggZm9sZHMgdGhlIGxpdmUgZnJvemVuXG4mIzQzO1x0ICogbWFwIGJ5dGVzIGludG8gdGhlIGNoZWNrZWQgcGF5bG9hZCBhbmQgbXVzdCByZWplY3QgdGhlIG1vZGlmaWVkXG4mIzQzO1x0ICogYmxvYi4gQSBrZXJuZWwgZm9sZGluZyBhbnl0aGluZyBidXQgdGhlIG1hcCBjb250ZW50cyB0aGVtc2VsdmVzXG4mIzQzO1x0ICogd291bGQgd3JvbmdseSBhY2NlcHQgdGhpcyBsb2FkLlxuJiM0MztcdCAqL1xuJiM0MztcdGJsb2JbZGF0YV9zeiAvIDJdIF49IDB4ZmY7XG4mIzQzO1x0bWVtc2V0KGN0eCwgMCwgY3R4X3N6KTtcbiYjNDM7XHQoKHN0cnVjdCBicGZfbG9hZGVyX2N0eCAqKWN0eCktXHUwMDNlc3ogPSBjdHhfc3o7XG4mIzQzO1x0ciA9IHJ1bl9nZW5fbG9hZGVyKGluc25zLCBpbnNuc19zeiwgYmxvYiwgZGF0YV9zeiwgZXhjbCwgc2l6ZW9mKGV4Y2wpLFxuJiM0MztcdFx0XHQgICBzaWcsIHNpZ19zeiwgY3R4LCBjdHhfc3osIFx1MDAyNnJhbik7XG4mIzQzO1x0QVNTRVJUX0ZBTFNFKHJhbiwgXCYjMzQ7dGFtcGVyZWQgbWV0YWRhdGEgcmVqZWN0ZWQgYmVmb3JlIHJ1blwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKHIsIC1FS0VZUkVKRUNURUQsIFwmIzM0O3NpZ25hdHVyZSBpcyBib3VuZCB0byB0aGUgbWV0YWRhdGFcJiMzNDspO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGZyZWUoaW5zbnMpO1xuJiM0MztcdGZyZWUoYmxvYik7XG4mIzQzO1x0ZnJlZShzaWduYnVmKTtcbiBcdGZyZWUoY3R4KTtcbiBcdHRlc3Rfc2lnbmVkX2xvYWRlcl9fZGVzdHJveShza2VsKTtcbiBcdHJ1bl9zZXR1cChcJiMzNDtjbGVhbnVwXCYjMzQ7LCBkaXIpO1xuQEAgLTEwMDcsMTAgJiM0MzsxMTk4LDExIEBAIHN0YXRpYyB2b2lkIGxzbV9zaWduYXR1cmVfdmVyZGljdCh2b2lkKVxuIHtcbiBcdGNoYXIgZGlyX3RtcGxbXSA9IFwmIzM0Oy90bXAvc2lnbmVkX2xvYWRlcl9sc21YWFhYWFhcJiMzNDssICpkaXIgPSBOVUxMO1xuIFx0c3RydWN0IHRlc3Rfc2lnbmVkX2xvYWRlcl9sc20gKmxzbSA9IE5VTEw7XG4mIzQzO1x0X191MzIgc2lnX3N6ID0gODE5MiwgbXNpZ19zeiA9IDgxOTI7XG4gXHRpbnQgbWFwX2ZkID0gLTEsIHByb2dfZmQgPSAtMTtcbiBcdGJvb2wgaGF2ZV9maXh0dXJlID0gZmFsc2U7XG4gXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XG4tXHRfX3UzMiBzaWdfc3ogPSA4MTkyO1xuJiM0MztcdHVuc2lnbmVkIGNoYXIgKmJ1ZjtcbiBcdF9fczMyIHNlc19zZXJpYWw7XG4gXHRfX3U4IHNpZ1s4MTkyXTtcbiBcbkBAIC0xMDI5LDcgJiM0MzsxMjIxLDcgQEAgc3RhdGljIHZvaWQgbHNtX3NpZ25hdHVyZV92ZXJkaWN0KHZvaWQpXG4gXHRpZiAoIUFTU0VSVF9PS19GRChtYXBfZmQsIFwmIzM0O21ldGFfbWFwX3Vuc2lnbmVkXCYjMzQ7KSlcbiBcdFx0Z290byBvdXQ7XG4gXHRsc20tXHUwMDNlYnNzLVx1MDAzZXNlZW4gPSAwO1xuLVx0cHJvZ19mZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIG1hcF9mZCwgTlVMTCwgMCwgMCk7XG4mIzQzO1x0cHJvZ19mZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIG1hcF9mZCwgTlVMTCwgMCwgMCwgMCk7XG4gXHRjbG9zZShtYXBfZmQpO1xuIFx0bWFwX2ZkID0gLTE7XG4gXHRpZiAoIUFTU0VSVF9PS19GRChwcm9nX2ZkLCBcJiMzNDt1bnNpZ25lZCBsb2FkZXIgbG9hZFwmIzM0OykpXG5AQCAtMTA2MiwyMiAmIzQzOzEyNTQsNTEgQEAgc3RhdGljIHZvaWQgbHNtX3NpZ25hdHVyZV92ZXJkaWN0KHZvaWQpXG4gXHRcdGdvdG8gb3V0O1xuIFx0bHNtLVx1MDAzZWJzcy1cdTAwM2VzZWVuID0gMDtcbiBcdHByb2dfZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsIHNpZyxcbi1cdFx0XHQgICAgICBzaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4mIzQzO1x0XHRcdCAgICAgIHNpZ19zeiwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAwKTtcbiBcdGNsb3NlKG1hcF9mZCk7XG4gXHRtYXBfZmQgPSAtMTtcbi1cdGlmICghQVNTRVJUX09LX0ZEKHByb2dfZmQsIFwmIzM0O3NpZ25lZCBsb2FkZXIgbG9hZFwmIzM0OykpXG4tXHRcdGdvdG8gb3V0O1xuLVx0Y2xvc2UocHJvZ19mZCk7XG4mIzQzO1x0QVNTRVJUX0VRKHByb2dfZmQsIC1FQUNDRVMsIFwmIzM0O3VuZm9sZGVkIG1ldGFkYXRhIHJlamVjdGVkXCYjMzQ7KTtcbiYjNDM7XHRpZiAocHJvZ19mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShwcm9nX2ZkKTtcbiBcdHByb2dfZmQgPSAtMTtcbiBcbiBcdHNlc19zZXJpYWwgPSBzeXNjYWxsKF9fTlJfa2V5Y3RsLCBLRVlDVExfR0VUX0tFWVJJTkdfSUQsXG4gXHRcdFx0ICAgICBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDApO1xuIFx0QVNTRVJUX0VRKGxzbS1cdTAwM2Vic3MtXHUwMDNlc2VlbiwgMSwgXCYjMzQ7c2lnbmVkOiBvbmUgb2JzZXJ2ZWQgbG9hZFwmIzM0Oyk7XG4tXHRBU1NFUlRfRVEobHNtLVx1MDAzZWJzcy1cdTAwM2VzaWdfdmVyZGljdCwgQlBGX1NJR19WRVJJRklFRCwgXCYjMzQ7c2lnbmVkIHZlcmRpY3RcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShsc20tXHUwMDNlYnNzLVx1MDAzZXNpZ192ZXJkaWN0LCBCUEZfU0lHX1ZFUklGSUVELFxuJiM0MztcdFx0ICBcJiMzNDthZG1pc3Npb24gc2F3IGEgdmFsaWQgc2lnbmF0dXJlXCYjMzQ7KTtcbiBcdEFTU0VSVF9FUShsc20tXHUwMDNlYnNzLVx1MDAzZXNpZ19rZXlyaW5nX3R5cGUsIEJQRl9TSUdfS0VZUklOR19VU0VSLCBcJiMzNDtzaWduZWQga2V5cmluZyB0eXBlXCYjMzQ7KTtcbiBcdEFTU0VSVF9HVChzZXNfc2VyaWFsLCAwLCBcJiMzNDtzZXNzaW9uIGtleXJpbmcgc2VyaWFsIHJlc29sdmVkXCYjMzQ7KTtcbiBcdEFTU0VSVF9FUShsc20tXHUwMDNlYnNzLVx1MDAzZXNpZ19rZXlyaW5nX3NlcmlhbCwgc2VzX3NlcmlhbCxcbiBcdFx0ICBcJiMzNDtzaWduZWQ6IHZhbGlkYXRlZCBhZ2FpbnN0IHNlc3Npb24ga2V5cmluZ1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGJ1ZiA9IG1hbGxvYygoc2l6ZV90KWYuZ29wdHMuaW5zbnNfc3ogJiM0MzsgZi5kYXRhX3N6KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoYnVmLCBcJiMzNDttZXRhX3NpZ25idWZcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0bWVtY3B5KGJ1ZiwgZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeik7XG4mIzQzO1x0bWVtY3B5KGJ1ZiAmIzQzOyBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsIGYuZGF0YV9zeik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBidWYsIGYuZ29wdHMuaW5zbnNfc3ogJiM0MzsgZi5kYXRhX3N6LFxuJiM0MztcdFx0XHRcdHNpZywgXHUwMDI2bXNpZ19zeiksIFwmIzM0O3NpZ24gaW5zbnN8fG1ldGFkYXRhXCYjMzQ7KSkge1xuJiM0MztcdFx0ZnJlZShidWYpO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcdGZyZWUoYnVmKTtcbiYjNDM7XG4mIzQzO1x0bWFwX2ZkID0gc2V0dXBfbWV0YV9tYXAoXHUwMDI2Zik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQobWFwX2ZkLCBcJiMzNDttZXRhX21hcF9ib3VuZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRsc20tXHUwMDNlYnNzLVx1MDAzZXNlZW4gPSAwO1xuJiM0MztcdHByb2dfZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsIHNpZyxcbiYjNDM7XHRcdFx0ICAgICAgbXNpZ19zeiwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAxKTtcbiYjNDM7XHRjbG9zZShtYXBfZmQpO1xuJiM0MztcdG1hcF9mZCA9IC0xO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKHByb2dfZmQsIFwmIzM0O21ldGFkYXRhLWJvdW5kIGxvYWRlciBsb2FkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGNsb3NlKHByb2dfZmQpO1xuJiM0MztcdHByb2dfZmQgPSAtMTtcbiYjNDM7XHRBU1NFUlRfRVEobHNtLVx1MDAzZWJzcy1cdTAwM2VzZWVuLCAxLCBcJiMzNDttZXRhZGF0YTogb25lIG9ic2VydmVkIGxvYWRcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShsc20tXHUwMDNlYnNzLVx1MDAzZXNpZ192ZXJkaWN0LCBCUEZfU0lHX1ZFUklGSUVELFxuJiM0MztcdFx0ICBcJiMzNDttZXRhZGF0YS1ib3VuZCB2ZXJkaWN0XCYjMzQ7KTtcbiBvdXQ6XG4gXHRpZiAobWFwX2ZkIFx1MDAzZT0gMClcbiBcdFx0Y2xvc2UobWFwX2ZkKTtcbkBAIC0xMDkwLDIwICYjNDM7MTMxMSw0NjcgQEAgc3RhdGljIHZvaWQgbHNtX3NpZ25hdHVyZV92ZXJkaWN0KHZvaWQpXG4gXHR0ZXN0X3NpZ25lZF9sb2FkZXJfbHNtX19kZXN0cm95KGxzbSk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBMb2FkLXRpbWUgbWV0YWRhdGEgdmVyaWZpY2F0aW9uOiB0aGUga2VybmVsIGZvbGRzIHRoZSBmcm96ZW4gbWV0YWRhdGEgbWFwXG4mIzQzOyAqIGludG8gdGhlIHNpZ25hdHVyZSAoaW5zbnMgfHwgbWV0YWRhdGEpIGFuZCBjaGVja3MgaXQgYXQgQlBGX1BST0dfTE9BRCB2aWFcbiYjNDM7ICogZmRfYXJyYXlfY250LCByYXRoZXIgdGhhbiB0aGUgbG9hZGVyIGNoZWNraW5nIGZyb20gd2l0aGluIEJQRi4gU2lnbiB0aGF0XG4mIzQzOyAqIGNvbmNhdGVuYXRpb24sIGhhbmQgdGhlIGtlcm5lbCB0aGUgbWFwLCBhbmQgY29uZmlybSB0aGUgc2lnbmVkIGxvYWRlciBsb2FkcyxcbiYjNDM7ICogcnVucywgYW5kIGluc3RhbGxzIGl0cyB0YXJnZXQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IGxvYWR0aW1lX2RyaXZlKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LFxuJiM0MztcdFx0XHQgIGNvbnN0IHZvaWQgKmRhdGEsIF9fdTMyIGRhdGFfc3osIGNvbnN0IF9fdTggKmV4Y2wsXG4mIzQzO1x0XHRcdCAgdm9pZCAqY3R4LCBfX3UzMiBjdHhfc3osIGludCAqbG9hZF9yZXQsIGJvb2wgKnJhbilcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG1vcHRzLFxuJiM0MztcdFx0ICAgIC5leGNsX3Byb2dfaGFzaCA9IGV4Y2wsXG4mIzQzO1x0XHQgICAgLmV4Y2xfcHJvZ19oYXNoX3NpemUgPSBTSEEyNTZfRElHRVNUX0xFTkdUSCk7XG4mIzQzO1x0X191MzIgc2lnX3N6ID0gODE5Miwga2V5ID0gMDtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyICpidWYgPSBOVUxMO1xuJiM0MztcdGludCBtYXBfZmQsIHByb2dfZmQsIHJldCA9IDA7XG4mIzQzO1x0dW5pb24gYnBmX2F0dHIgYXR0cjtcbiYjNDM7XHRfX3U4IHNpZ1s4MTkyXTtcbiYjNDM7XG4mIzQzO1x0KnJhbiA9IGZhbHNlO1xuJiM0MztcdCpsb2FkX3JldCA9IDA7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogTWV0YWRhdGEgbWFwLCBib3VuZCB0byB0aGUgbG9hZGVyIGRpZ2VzdCBhbmQgZnJvemVuLCBleGFjdGx5IGFzXG4mIzQzO1x0ICogc2tlbF9pbnRlcm5hbC5oJiMzOTtzIGJwZl9sb2FkX2FuZF9ydW4oKSBzZXRzIGl0IHVwLlxuJiM0MztcdCAqL1xuJiM0MztcdG1hcF9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWSwgXCYjMzQ7X19sb2FkZXIubWFwXCYjMzQ7LCA0LFxuJiM0MztcdFx0XHRcdGRhdGFfc3osIDEsIFx1MDAyNm1vcHRzKTtcbiYjNDM7XHRpZiAobWFwX2ZkIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRyZXQgPSAtZXJybm87XG4mIzQzO1x0XHRnb3RvIG91dF9sb2FkO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoYnBmX21hcF91cGRhdGVfZWxlbShtYXBfZmQsIFx1MDAyNmtleSwgZGF0YSwgMCkgfHwgYnBmX21hcF9mcmVlemUobWFwX2ZkKSkge1xuJiM0MztcdFx0cmV0ID0gLWVycm5vO1xuJiM0MztcdFx0Z290byBvdXRfbG9hZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFNpZ24gaW5zbnMgfHwgbWV0YWRhdGEsIHRoZSBzYW1lIGJ5dGVzIHRoZSBrZXJuZWwgcmVjb25zdHJ1Y3RzLiAqL1xuJiM0MztcdGJ1ZiA9IG1hbGxvYygoc2l6ZV90KWluc25zX3N6ICYjNDM7IGRhdGFfc3opO1xuJiM0MztcdGlmICghYnVmKSB7XG4mIzQzO1x0XHRyZXQgPSAtRU5PTUVNO1xuJiM0MztcdFx0Z290byBvdXRfbG9hZDtcbiYjNDM7XHR9XG4mIzQzO1x0bWVtY3B5KGJ1ZiwgaW5zbnMsIGluc25zX3N6KTtcbiYjNDM7XHRtZW1jcHkoYnVmICYjNDM7IGluc25zX3N6LCBkYXRhLCBkYXRhX3N6KTtcbiYjNDM7XHRyZXQgPSBzaWduX2J1ZihkaXIsIGJ1ZiwgaW5zbnNfc3ogJiM0MzsgZGF0YV9zeiwgc2lnLCBcdTAwMjZzaWdfc3opO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRnb3RvIG91dF9sb2FkO1xuJiM0MztcbiYjNDM7XHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcbiYjNDM7XHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbiYjNDM7XHRhdHRyLmluc25zID0gcHRyX3RvX3U2NChpbnNucyk7XG4mIzQzO1x0YXR0ci5pbnNuX2NudCA9IGluc25zX3N6IC8gc2l6ZW9mKHN0cnVjdCBicGZfaW5zbik7XG4mIzQzO1x0YXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NChcJiMzNDtEdWFsIEJTRC9HUExcJiMzNDspO1xuJiM0MztcdGF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTtcbiYjNDM7XHRhdHRyLmZkX2FycmF5ID0gcHRyX3RvX3U2NChcdTAwMjZtYXBfZmQpO1xuJiM0MztcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpO1xuJiM0MztcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XG4mIzQzO1x0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xuJiM0MztcdGF0dHIuZmRfYXJyYXlfY250ID0gMTtcbiYjNDM7XHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFwmIzM0O19fbG9hZGVyLnByb2dcJiMzNDssIHNpemVvZihcJiMzNDtfX2xvYWRlci5wcm9nXCYjMzQ7KSk7XG4mIzQzO1x0cHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFx1MDAyNmF0dHIsXG4mIzQzO1x0XHRcdCAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcbiYjNDM7XHRpZiAocHJvZ19mZCBcdTAwM2MgMCkge1xuJiM0MztcdFx0cmV0ID0gLWVycm5vO1xuJiM0MztcdFx0Z290byBvdXRfbG9hZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1lbXNldChcdTAwMjZhdHRyLCAwLCBzaXplb2YoYXR0cikpO1xuJiM0MztcdGF0dHIudGVzdC5wcm9nX2ZkID0gcHJvZ19mZDtcbiYjNDM7XHRhdHRyLnRlc3QuY3R4X2luID0gcHRyX3RvX3U2NChjdHgpO1xuJiM0MztcdGF0dHIudGVzdC5jdHhfc2l6ZV9pbiA9IGN0eF9zejtcbiYjNDM7XHRpZiAoc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfUlVOLCBcdTAwMjZhdHRyLFxuJiM0MztcdFx0ICAgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCB0ZXN0KSkgXHUwMDNjIDApIHtcbiYjNDM7XHRcdHJldCA9IC1lcnJubztcbiYjNDM7XHRcdGdvdG8gb3V0X3Byb2c7XG4mIzQzO1x0fVxuJiM0MztcdCpyYW4gPSB0cnVlO1xuJiM0MztcdHJldCA9IChpbnQpYXR0ci50ZXN0LnJldHZhbDtcbiYjNDM7b3V0X3Byb2c6XG4mIzQzO1x0Y2xvc2UocHJvZ19mZCk7XG4mIzQzO1x0Z290byBvdXRfbWFwO1xuJiM0MztvdXRfbG9hZDpcbiYjNDM7XHQqbG9hZF9yZXQgPSByZXQ7XG4mIzQzO291dF9tYXA6XG4mIzQzO1x0ZnJlZShidWYpO1xuJiM0MztcdGlmIChtYXBfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UobWFwX2ZkKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBsb2FkdGltZV92ZXJpZnkoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgaW50IGV4cGVjdF9tYXBzKVxuJiM0Mzt7XG4mIzQzO1x0TElCQlBGX09QVFMoZ2VuX2xvYWRlcl9vcHRzLCBnb3B0cywgLmdlbl9oYXNoID0gdHJ1ZSk7XG4mIzQzO1x0Y2hhciBkaXJfdG1wbFtdID0gXCYjMzQ7L3RtcC9zaWduZWRfbG9hZGVyX2x0WFhYWFhYXCYjMzQ7LCAqZGlyID0gTlVMTDtcbiYjNDM7XHRpbnQgbnJfbWFwcyA9IDAsIG5yX3Byb2dzID0gMCwgbG9hZF9yZXQgPSAwLCByO1xuJiM0MztcdF9fdTggZXhjbFtTSEEyNTZfRElHRVNUX0xFTkdUSF07XG4mIzQzO1x0c3RydWN0IGJwZl9wcm9nX2Rlc2MgKnBkO1xuJiM0MztcdHN0cnVjdCBicGZfbWFwX2Rlc2MgKm1kO1xuJiM0MztcdHVuc2lnbmVkIGNoYXIgKmJsb2IgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBicGZfcHJvZ3JhbSAqcDtcbiYjNDM7XHRzdHJ1Y3QgYnBmX21hcCAqbTtcbiYjNDM7XHRfX3UzMiBjdHhfc3osIGRhdGFfc3o7XG4mIzQzO1x0dm9pZCAqY3R4ID0gTlVMTDtcbiYjNDM7XHRib29sIHJhbiA9IGZhbHNlO1xuJiM0MztcbiYjNDM7XHRzeXNjYWxsKF9fTlJfcmVxdWVzdF9rZXksIFwmIzM0O2tleXJpbmdcJiMzNDssIFwmIzM0O191aWQuMFwmIzM0OywgTlVMTCxcbiYjNDM7XHRcdEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4mIzQzO1x0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCYjMzQ7bWtkdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwmIzM0O3NldHVwXCYjMzQ7LCBkaXIpLCBcJiMzNDt2ZXJpZnlfc2lnX3NldHVwXCYjMzQ7KSkge1xuJiM0MztcdFx0cm1kaXIoZGlyKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJwZl9vYmplY3RfX2dlbl9sb2FkZXIob2JqLCBcdTAwMjZnb3B0cyksIFwmIzM0O2dlbl9sb2FkZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soYnBmX29iamVjdF9fbG9hZChvYmopLCBcJiMzNDtnZW5fbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0YnBmX29iamVjdF9fZm9yX2VhY2hfcHJvZ3JhbShwLCBvYmopXG4mIzQzO1x0XHRucl9wcm9ncyYjNDM7JiM0Mzs7XG4mIzQzO1x0YnBmX29iamVjdF9fZm9yX2VhY2hfbWFwKG0sIG9iailcbiYjNDM7XHRcdG5yX21hcHMmIzQzOyYjNDM7O1xuJiM0MztcdGlmICghQVNTRVJUX0VRKG5yX21hcHMsIGV4cGVjdF9tYXBzLCBcJiMzNDtmaXh0dXJlIG1hcCBjb3VudFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0Y3R4X3N6ID0gc2l6ZW9mKHN0cnVjdCBicGZfbG9hZGVyX2N0eCkgJiM0MztcbiYjNDM7XHRcdCBucl9tYXBzICogc2l6ZW9mKHN0cnVjdCBicGZfbWFwX2Rlc2MpICYjNDM7XG4mIzQzO1x0XHQgbnJfcHJvZ3MgKiBzaXplb2Yoc3RydWN0IGJwZl9wcm9nX2Rlc2MpO1xuJiM0MztcdGN0eCA9IGNhbGxvYygxLCBjdHhfc3opO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihjdHgsIFwmIzM0O2N0eF9hbGxvY1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHQoKHN0cnVjdCBicGZfbG9hZGVyX2N0eCAqKWN0eCktXHUwMDNlc3ogPSBjdHhfc3o7XG4mIzQzO1xuJiM0MztcdGRhdGFfc3ogPSBnb3B0cy5kYXRhX3N6O1xuJiM0MztcdGJsb2IgPSBtYWxsb2MoZGF0YV9zeik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJsb2IsIFwmIzM0O2Jsb2JfYWxsb2NcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0bWVtY3B5KGJsb2IsIGdvcHRzLmRhdGEsIGRhdGFfc3opO1xuJiM0MztcbiYjNDM7XHQvKiBleGNsX3Byb2dfaGFzaCA9IFNIQTI1Nihsb2FkZXIgaW5zbnMpID09IHRoZSBsb2FkZXImIzM5O3MgcHJvZy1cdTAwM2VkaWdlc3QuICovXG4mIzQzO1x0bGliYnBmX3NoYTI1Nihnb3B0cy5pbnNucywgZ29wdHMuaW5zbnNfc3osIGV4Y2wpO1xuJiM0MztcbiYjNDM7XHRyID0gbG9hZHRpbWVfZHJpdmUoZGlyLCBnb3B0cy5pbnNucywgZ29wdHMuaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osXG4mIzQzO1x0XHRcdCAgIGV4Y2wsIGN0eCwgY3R4X3N6LCBcdTAwMjZsb2FkX3JldCwgXHUwMDI2cmFuKTtcbiYjNDM7XHRBU1NFUlRfT0sobG9hZF9yZXQsIFwmIzM0O3NpZ25lZCBsb2FkZXIgbG9hZGVkIChpbnNucyB8fCBtZXRhZGF0YSlcJiMzNDspO1xuJiM0MztcdEFTU0VSVF9UUlVFKHJhbiwgXCYjMzQ7bG9hZGVyIHJhblwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0VRKHIsIDAsIFwmIzM0O2xvYWRlciBpbnN0YWxsZWQgaXRzIHRhcmdldFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdG1kID0gKHN0cnVjdCBicGZfbWFwX2Rlc2MgKikoKGNoYXIgKiljdHggJiM0Mzsgc2l6ZW9mKHN0cnVjdCBicGZfbG9hZGVyX2N0eCkpO1xuJiM0MztcdHBkID0gKHN0cnVjdCBicGZfcHJvZ19kZXNjICopKG1kICYjNDM7IG5yX21hcHMpO1xuJiM0MztcdEFTU0VSVF9HVChwZFswXS5wcm9nX2ZkLCAwLCBcJiMzNDt0YXJnZXQgcHJvZ3JhbSBpbnN0YWxsZWRcJiMzNDspO1xuJiM0MztcdGlmIChucl9tYXBzKVxuJiM0MztcdFx0QVNTRVJUX0dUKG1kWzBdLm1hcF9mZCwgMCwgXCYjMzQ7dGFyZ2V0IG1hcCBpbnN0YWxsZWRcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRjbG9zZV9sb2FkZXJfY3R4X2ZkcyhjdHgsIG5yX21hcHMsIG5yX3Byb2dzKTtcbiYjNDM7b3V0OlxuJiM0MztcdGZyZWUoYmxvYik7XG4mIzQzO1x0ZnJlZShjdHgpO1xuJiM0MztcdGlmIChkaXIpXG4mIzQzO1x0XHRydW5fc2V0dXAoXCYjMzQ7Y2xlYW51cFwmIzM0OywgZGlyKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgbG9hZHRpbWVfbm9fbWFwKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyICpza2VsID0gdGVzdF9zaWduZWRfbG9hZGVyX19vcGVuKCk7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcJiMzNDtza2VsX29wZW5cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGxvYWR0aW1lX3ZlcmlmeShza2VsLVx1MDAzZW9iaiwgMCk7XG4mIzQzO1x0dGVzdF9zaWduZWRfbG9hZGVyX19kZXN0cm95KHNrZWwpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBsb2FkdGltZV93aXRoX21hcCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRlc3Rfc2lnbmVkX2xvYWRlcl9tYXAgKnNrZWwgPSB0ZXN0X3NpZ25lZF9sb2FkZXJfbWFwX19vcGVuKCk7XG4mIzQzO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcJiMzNDtza2VsX29wZW5cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGxvYWR0aW1lX3ZlcmlmeShza2VsLVx1MDAzZW9iaiwgMSk7XG4mIzQzO1x0dGVzdF9zaWduZWRfbG9hZGVyX21hcF9fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQSBzaWduZWQgcHJvZ3JhbSBuZWVkIG5vdCBiaW5kIGFueSBtYXAuIEEgcGxhaW4gQlBGX1BST0dfVFlQRV9TWVNDQUxMXG4mIzQzOyAqIHByb2dyYW0gd2l0aCBubyBmZF9hcnJheSBpcyBzaWduZWQgb3ZlciBpdHMgaW5zdHJ1Y3Rpb25zIGFsb25lOiB0aGUga2VybmVsXG4mIzQzOyAqIHZlcmlmaWVzIHRoZSBzaWduYXR1cmUsIGZvbGRzIG5vIG1ldGFkYXRhLCBhbmQgdGhlIHByb2dyYW0gbG9hZHMuIEV4ZXJjaXNlXG4mIzQzOyAqIHRoZSBmZF9hcnJheSA9PSBOVUxMIC8gZmRfYXJyYXlfY250ID09IDAgcGF0aCwgYW5kIGNvbmZpcm0gdGhlIHNpZ25hdHVyZVxuJiM0MzsgKiBzdGlsbCBhdXRoZW50aWNhdGVzIHRoZSBpbnN0cnVjdGlvbnMgKGEgdGFtcGVyZWQgY29weSBpcyByZWplY3RlZCkuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBzaWduZWRfbm9fZmRfYXJyYXkodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xuJiM0MztcdFx0QlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLFxuJiM0MztcdFx0QlBGX0VYSVRfSU5TTigpLFxuJiM0MztcdH07XG4mIzQzO1x0Y2hhciBkaXJfdG1wbFtdID0gXCYjMzQ7L3RtcC9zaWduZWRfbG9hZGVyWFhYWFhYXCYjMzQ7LCAqZGlyO1xuJiM0MztcdF9fdTMyIHNpZ19zeiA9IDgxOTI7XG4mIzQzO1x0dW5pb24gYnBmX2F0dHIgYXR0cjtcbiYjNDM7XHRfX3U4IHNpZ1s4MTkyXTtcbiYjNDM7XHRpbnQgcHJvZ19mZCwgZXJyO1xuJiM0MztcbiYjNDM7XHRzeXNjYWxsKF9fTlJfcmVxdWVzdF9rZXksIFwmIzM0O2tleXJpbmdcJiMzNDssIFwmIzM0O191aWQuMFwmIzM0OywgTlVMTCxcbiYjNDM7XHRcdEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4mIzQzO1x0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCYjMzQ7bWtkdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwmIzM0O3NldHVwXCYjMzQ7LCBkaXIpLCBcJiMzNDt2ZXJpZnlfc2lnX3NldHVwXCYjMzQ7KSkge1xuJiM0MztcdFx0cm1kaXIoZGlyKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIE5vIG1ldGFkYXRhIG1hcDogdGhlIHNpZ25lZCBwYXlsb2FkIGlzIHRoZSBpbnN0cnVjdGlvbnMgYWxvbmUuICovXG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBpbnNucywgc2l6ZW9mKGluc25zKSwgc2lnLCBcdTAwMjZzaWdfc3opLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3NpZ24tZmlsZVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdG1lbXNldChcdTAwMjZhdHRyLCAwLCBzaXplb2YoYXR0cikpO1xuJiM0MztcdGF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMO1xuJiM0MztcdGF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGluc25zKTtcbiYjNDM7XHRhdHRyLmluc25fY250ID0gQVJSQVlfU0laRShpbnNucyk7XG4mIzQzO1x0YXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NChcJiMzNDtEdWFsIEJTRC9HUExcJiMzNDspO1xuJiM0MztcdGF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTtcbiYjNDM7XHRhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTtcbiYjNDM7XHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6O1xuJiM0MztcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcbiYjNDM7XHQvKiBmZF9hcnJheSBhbmQgZmRfYXJyYXlfY250IGRlbGliZXJhdGVseSBsZWZ0IE5VTEwvMC4gKi9cbiYjNDM7XHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFwmIzM0O3NpZ25lZF9ub21hcFwmIzM0Oywgc2l6ZW9mKFwmIzM0O3NpZ25lZF9ub21hcFwmIzM0OykpO1xuJiM0MztcbiYjNDM7XHRwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXHUwMDI2YXR0cixcbiYjNDM7XHRcdFx0ICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHByb2dfZmQsIDAsIFwmIzM0O21hcC1sZXNzIHNpZ25lZCBwcm9ncmFtIGxvYWRlZFwmIzM0OykpIHtcbiYjNDM7XHRcdGlmIChwcm9nX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdFx0Y2xvc2UocHJvZ19mZCk7XG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKHByb2dfZmQpO1xuJiM0MztcbiYjNDM7XHQvKiBUaGUgc2lnbmF0dXJlIGNvdmVycyB0aGUgaW5zdHJ1Y3Rpb25zLCBzbyB0YW1wZXJpbmcgbXVzdCBiZSByZWplY3RlZC4gKi9cbiYjNDM7XHRpbnNuc1swXS5pbW0gPSAxO1xuJiM0MztcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcdTAwMjZhdHRyLFxuJiM0MztcdFx0XHQgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XG4mIzQzO1x0ZXJyID0gcHJvZ19mZCBcdTAwM2MgMCA/IC1lcnJubyA6IHByb2dfZmQ7XG4mIzQzO1x0QVNTRVJUX0VRKGVyciwgLUVLRVlSRUpFQ1RFRCwgXCYjMzQ7dGFtcGVyZWQgbWFwLWxlc3MgcHJvZ3JhbSByZWplY3RlZFwmIzM0Oyk7XG4mIzQzO1x0aWYgKHByb2dfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UocHJvZ19mZCk7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0cnVuX3NldHVwKFwmIzM0O2NsZWFudXBcJiMzNDssIGRpcik7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEEgc2lnbmVkIHByb2dyYW0gbWF5IHJlYWNoIG1hcHMgb25seSB0aHJvdWdoIGZkX2FycmF5IGluZGljZXMsIHNvIHRoZSBrZXJuZWxcbiYjNDM7ICogZm9sZHMgKGFuZCB0aHVzIGF0dGVzdHMpIHRoZW0uIEEgZGlyZWN0IEJQRl9QU0VVRE9fTUFQX0ZEIHJlZmVyZW5jZSAtIGEgcmF3LFxuJiM0MzsgKiB1bmZvbGRlZCBmZCBiYWtlZCBpbnRvIHRoZSBzaWduZWQgaW5zdHJ1Y3Rpb25zIC0gaXMgcmVqZWN0ZWQgYnkgdGhlIHZlcmlmaWVyLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgc2lnbmVkX21hcF9ieV9mZF9yZWplY3RlZCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7XG4mIzQzO1x0XHRCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksXG4mIzQzO1x0XHRCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksXG4mIzQzO1x0XHRCUEZfRVhJVF9JTlNOKCksXG4mIzQzO1x0fTtcbiYjNDM7XHRjaGFyIGRpcl90bXBsW10gPSBcJiMzNDsvdG1wL3NpZ25lZF9sb2FkZXJYWFhYWFhcJiMzNDssICpkaXI7XG4mIzQzO1x0X191MzIgc2lnX3N6ID0gODE5MjtcbiYjNDM7XHR1bmlvbiBicGZfYXR0ciBhdHRyO1xuJiM0MztcdF9fdTggc2lnWzgxOTJdO1xuJiM0MztcdGludCBtYXBfZmQsIHByb2dfZmQsIGVycjtcbiYjNDM7XG4mIzQzO1x0bWFwX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZLCBcJiMzNDtzaWdfbWFwZmRcJiMzNDssIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKG1hcF9mZCwgMCwgXCYjMzQ7bWFwX2NyZWF0ZVwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aW5zbnNbMF0uaW1tID0gbWFwX2ZkO1x0LyogYmFrZSB0aGUgcmF3IG1hcCBmZCBpbnRvIHRoZSBsZF9pbW02NCAqL1xuJiM0MztcbiYjNDM7XHRzeXNjYWxsKF9fTlJfcmVxdWVzdF9rZXksIFwmIzM0O2tleXJpbmdcJiMzNDssIFwmIzM0O191aWQuMFwmIzM0OywgTlVMTCxcbiYjNDM7XHRcdEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4mIzQzO1x0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCYjMzQ7bWtkdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dF9tYXA7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwmIzM0O3NldHVwXCYjMzQ7LCBkaXIpLCBcJiMzNDt2ZXJpZnlfc2lnX3NldHVwXCYjMzQ7KSkge1xuJiM0MztcdFx0cm1kaXIoZGlyKTtcbiYjNDM7XHRcdGdvdG8gb3V0X21hcDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFNpZ24gdGhlIGluc3RydWN0aW9ucywgcmF3IG1hcCBmZCBhbmQgYWxsLiAqL1xuJiM0MztcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgaW5zbnMsIHNpemVvZihpbnNucyksIHNpZywgXHUwMDI2c2lnX3N6KSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtzaWduLWZpbGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcbiYjNDM7XHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbiYjNDM7XHRhdHRyLmluc25zID0gcHRyX3RvX3U2NChpbnNucyk7XG4mIzQzO1x0YXR0ci5pbnNuX2NudCA9IEFSUkFZX1NJWkUoaW5zbnMpO1xuJiM0MztcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXCYjMzQ7RHVhbCBCU0QvR1BMXCYjMzQ7KTtcbiYjNDM7XHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XG4mIzQzO1x0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XG4mIzQzO1x0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcbiYjNDM7XHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XG4mIzQzO1x0LyogTm8gZmRfYXJyYXk6IHRoZSBtYXAgaXMgcmVhY2hlZCBieSBhIHJhdyBmZCBpbiB0aGUgaW5zdHJ1Y3Rpb25zLiAqL1xuJiM0MztcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXCYjMzQ7c2lnbmVkX21hcGZkXCYjMzQ7LCBzaXplb2YoXCYjMzQ7c2lnbmVkX21hcGZkXCYjMzQ7KSk7XG4mIzQzO1xuJiM0MztcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcdTAwMjZhdHRyLFxuJiM0MztcdFx0XHQgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XG4mIzQzO1x0ZXJyID0gcHJvZ19mZCBcdTAwM2MgMCA/IC1lcnJubyA6IHByb2dfZmQ7XG4mIzQzO1x0QVNTRVJUX0VRKGVyciwgLUVJTlZBTCwgXCYjMzQ7c2lnbmVkIHByb2dyYW0gcmVmZXJlbmNpbmcgYSBtYXAgYnkgZmQgcmVqZWN0ZWRcJiMzNDspO1xuJiM0MztcdGlmIChwcm9nX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKHByb2dfZmQpO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdHJ1bl9zZXR1cChcJiMzNDtjbGVhbnVwXCYjMzQ7LCBkaXIpO1xuJiM0MztvdXRfbWFwOlxuJiM0MztcdGNsb3NlKG1hcF9mZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEEgc2lnbmVkIHByb2dyYW0gbWF5IHJlYWNoIG1hcHMgb25seSB0aHJvdWdoIHRoZSBjb250aW51b3VzIGZkX2FycmF5LCBzbyB0aGVcbiYjNDM7ICoga2VybmVsIGZvbGRzIChhbmQgdGh1cyBhdHRlc3RzKSB0aGVtLiBSZWZlcmVuY2luZyBhIG1hcCBieSBmZF9hcnJheSAqaW5kZXgqXG4mIzQzOyAqIHdoaWxlIGxlYXZpbmcgZmRfYXJyYXlfY250IGF0IDAgc2VsZWN0cyB0aGUgc3BhcnNlIHBhdGgsIHdoaWNoIHJlc29sdmVzIGEgbWFwXG4mIzQzOyAqIHRoZSBzaWduYXR1cmUgbmV2ZXIgY292ZXJlZDsgdGhlIHZlcmlmaWVyIHJlamVjdHMgaXQgdXAgZnJvbnQgd2l0aCAtRUFDQ0VTLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgc2lnbmVkX3NwYXJzZV9mZF9hcnJheV9yZWplY3RlZCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7XG4mIzQzO1x0XHRCUEZfTERfSU1NNjRfUkFXKEJQRl9SRUdfMSwgQlBGX1BTRVVET19NQVBfSURYLCAwKSxcbiYjNDM7XHRcdEJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSxcbiYjNDM7XHRcdEJQRl9FWElUX0lOU04oKSxcbiYjNDM7XHR9O1xuJiM0MztcdGNoYXIgZGlyX3RtcGxbXSA9IFwmIzM0Oy90bXAvc2lnbmVkX2xvYWRlcl9zcFhYWFhYWFwmIzM0OywgKmRpcjtcbiYjNDM7XHRfX3UzMiBzaWdfc3ogPSA4MTkyO1xuJiM0MztcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XG4mIzQzO1x0X191OCBzaWdbODE5Ml07XG4mIzQzO1x0aW50IG1hcF9mZCwgcHJvZ19mZCwgZXJyO1xuJiM0MztcbiYjNDM7XHRtYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVksIFwmIzM0O3NpZ19zcGFyc2VcJiMzNDssIDQsIDQsIDEsIE5VTEwpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKG1hcF9mZCwgMCwgXCYjMzQ7bWFwX2NyZWF0ZVwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdHN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgXCYjMzQ7a2V5cmluZ1wmIzM0OywgXCYjMzQ7X3VpZC4wXCYjMzQ7LCBOVUxMLFxuJiM0MztcdFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcbiYjNDM7XHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcJiMzNDtta2R0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0X21hcDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCYjMzQ7c2V0dXBcJiMzNDssIGRpciksIFwmIzM0O3ZlcmlmeV9zaWdfc2V0dXBcJiMzNDspKSB7XG4mIzQzO1x0XHRybWRpcihkaXIpO1xuJiM0MztcdFx0Z290byBvdXRfbWFwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogU2lnbiB0aGUgaW5zdHJ1Y3Rpb25zIGFsb25lOyB0aGUgc3BhcnNlIG1hcCBpcyBub3QgZm9sZGVkLiAqL1xuJiM0MztcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgaW5zbnMsIHNpemVvZihpbnNucyksIHNpZywgXHUwMDI2c2lnX3N6KSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtzaWduLWZpbGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcbiYjNDM7XHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbiYjNDM7XHRhdHRyLmluc25zID0gcHRyX3RvX3U2NChpbnNucyk7XG4mIzQzO1x0YXR0ci5pbnNuX2NudCA9IEFSUkFZX1NJWkUoaW5zbnMpO1xuJiM0MztcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXCYjMzQ7RHVhbCBCU0QvR1BMXCYjMzQ7KTtcbiYjNDM7XHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XG4mIzQzO1x0YXR0ci5mZF9hcnJheSA9IHB0cl90b191NjQoXHUwMDI2bWFwX2ZkKTtcbiYjNDM7XHRhdHRyLmZkX2FycmF5X2NudCA9IDA7IC8qIHNwYXJzZTogZm9yY2UgbGF6eSBtYXAgcmVzb2x1dGlvbiAqL1xuJiM0MztcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpO1xuJiM0MztcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XG4mIzQzO1x0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xuJiM0MztcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXCYjMzQ7c2lnbmVkX3NwYXJzZVwmIzM0Oywgc2l6ZW9mKFwmIzM0O3NpZ25lZF9zcGFyc2VcJiMzNDspKTtcbiYjNDM7XG4mIzQzO1x0cHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFx1MDAyNmF0dHIsXG4mIzQzO1x0XHRcdCAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcbiYjNDM7XHRlcnIgPSBwcm9nX2ZkIFx1MDAzYyAwID8gLWVycm5vIDogcHJvZ19mZDtcbiYjNDM7XHRBU1NFUlRfRVEoZXJyLCAtRUFDQ0VTLCBcJiMzNDtzaWduZWQgcHJvZ3JhbSBiaW5kaW5nIGEgc3BhcnNlIGZkX2FycmF5IG1hcCByZWplY3RlZFwmIzM0Oyk7XG4mIzQzO1x0aWYgKHByb2dfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UocHJvZ19mZCk7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0cnVuX3NldHVwKFwmIzM0O2NsZWFudXBcJiMzNDssIGRpcik7XG4mIzQzO291dF9tYXA6XG4mIzQzO1x0Y2xvc2UobWFwX2ZkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgc2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7XG4mIzQzO1x0XHRCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCBCUEZfUFNFVURPX0tGVU5DX0NBTEwsIDEsIDEpLFxuJiM0MztcdFx0QlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLFxuJiM0MztcdFx0QlBGX0VYSVRfSU5TTigpLFxuJiM0MztcdH07XG4mIzQzO1x0Y2hhciBkaXJfdG1wbFtdID0gXCYjMzQ7L3RtcC9zaWduZWRfbG9hZGVyX2tmblhYWFhYWFwmIzM0OywgKmRpcjtcbiYjNDM7XHRpbnQgcHJvZ19mZCwgZXJyLCBmZHNbMl07XG4mIzQzO1x0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcbiYjNDM7XHRfX3UzMiBzaWdfc3ogPSA4MTkyO1xuJiM0MztcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XG4mIzQzO1x0X191OCBzaWdbODE5Ml07XG4mIzQzO1xuJiM0MztcdHN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgXCYjMzQ7a2V5cmluZ1wmIzM0OywgXCYjMzQ7X3VpZC4wXCYjMzQ7LCBOVUxMLFxuJiM0MztcdFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcbiYjNDM7XHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcJiMzNDtta2R0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCYjMzQ7c2V0dXBcJiMzNDssIGRpciksIFwmIzM0O3ZlcmlmeV9zaWdfc2V0dXBcJiMzNDspKSB7XG4mIzQzO1x0XHRybWRpcihkaXIpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGluc25zLCBzaXplb2YoaW5zbnMpLCBzaWcsIFx1MDAyNnNpZ19zeiksXG4mIzQzO1x0XHQgICAgICAgXCYjMzQ7c2lnbi1maWxlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwmIzM0O2J0Zl9uZXdfZW1wdHlcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGJ0Zl9fYWRkX2ludChidGYsIFwmIzM0O2ludFwmIzM0OywgNCwgQlRGX0lOVF9TSUdORUQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcJiMzNDtidGZfbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0ZmRzWzBdID0gLTE7XG4mIzQzO1x0ZmRzWzFdID0gYnRmX19mZChidGYpO1xuJiM0MztcbiYjNDM7XHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcbiYjNDM7XHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbiYjNDM7XHRhdHRyLmluc25zID0gcHRyX3RvX3U2NChpbnNucyk7XG4mIzQzO1x0YXR0ci5pbnNuX2NudCA9IEFSUkFZX1NJWkUoaW5zbnMpO1xuJiM0MztcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXCYjMzQ7RHVhbCBCU0QvR1BMXCYjMzQ7KTtcbiYjNDM7XHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XG4mIzQzO1x0YXR0ci5mZF9hcnJheSA9IHB0cl90b191NjQoZmRzKTtcbiYjNDM7XHRhdHRyLmZkX2FycmF5X2NudCA9IDA7IC8qIHNwYXJzZTogZm9yY2UgbGF6eSBrZnVuYyBCVEYgcmVzb2x1dGlvbiAqL1xuJiM0MztcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpO1xuJiM0MztcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XG4mIzQzO1x0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xuJiM0MztcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXCYjMzQ7c2lnbmVkX2tmdW5jXCYjMzQ7LCBzaXplb2YoXCYjMzQ7c2lnbmVkX2tmdW5jXCYjMzQ7KSk7XG4mIzQzO1xuJiM0MztcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcdTAwMjZhdHRyLFxuJiM0MztcdFx0XHQgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XG4mIzQzO1x0ZXJyID0gcHJvZ19mZCBcdTAwM2MgMCA/IC1lcnJubyA6IHByb2dfZmQ7XG4mIzQzO1x0aWYgKHByb2dfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UocHJvZ19mZCk7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUShlcnIsIC1FQUNDRVMsIFwmIzM0O21vZHVsZSBrZnVuYyBCVEYgaW4gc2lnbmVkIHByb2dyYW0gcmVqZWN0ZWRcJiMzNDspO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGlmIChidGYpXG4mIzQzO1x0XHRidGZfX2ZyZWUoYnRmKTtcbiYjNDM7XHRydW5fc2V0dXAoXCYjMzQ7Y2xlYW51cFwmIzM0OywgZGlyKTtcbiYjNDM7fVxuJiM0MztcbiB2b2lkIHRlc3Rfc2lnbmVkX2xvYWRlcih2b2lkKVxuIHtcbi1cdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O21ldGFkYXRhX2NoZWNrX3NoYXBlXCYjMzQ7KSlcbi1cdFx0bWV0YWRhdGFfY2hlY2tfc2hhcGUoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtsb2FkdGltZV9ub19tYXBcJiMzNDspKVxuJiM0MztcdFx0bG9hZHRpbWVfbm9fbWFwKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bG9hZHRpbWVfd2l0aF9tYXBcJiMzNDspKVxuJiM0MztcdFx0bG9hZHRpbWVfd2l0aF9tYXAoKTtcbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O21ldGFkYXRhX21hdGNoXCYjMzQ7KSlcbiBcdFx0bWV0YWRhdGFfbWF0Y2goKTtcbi1cdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O21ldGFkYXRhX3NoYV9taXNtYXRjaFwmIzM0OykpXG4tXHRcdG1ldGFkYXRhX3NoYV9taXNtYXRjaCgpO1xuLVx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWV0YWRhdGFfbm90X2V4Y2x1c2l2ZVwmIzM0OykpXG4tXHRcdG1ldGFkYXRhX25vdF9leGNsdXNpdmUoKTtcbi1cdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O21ldGFkYXRhX2hhc2hfbm90X2NvbXB1dGVkXCYjMzQ7KSlcbi1cdFx0bWV0YWRhdGFfaGFzaF9ub3RfY29tcHV0ZWQoKTtcbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3NpZ25hdHVyZV9lbmZvcmNlZFwmIzM0OykpXG4gXHRcdHNpZ25hdHVyZV9lbmZvcmNlZCgpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3NpZ25lZF9ub25leGNsX2ZkX2FycmF5X3JlamVjdGVkXCYjMzQ7KSlcbiYjNDM7XHRcdHNpZ25lZF9ub25leGNsX2ZkX2FycmF5X3JlamVjdGVkKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7c2lnbmVkX3VuZnJvemVuX2ZkX2FycmF5X3JlamVjdGVkXCYjMzQ7KSlcbiYjNDM7XHRcdHNpZ25lZF91bmZyb3plbl9mZF9hcnJheV9yZWplY3RlZCgpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3NpZ25lZF9ub25hcnJheV9mZF9hcnJheV9yZWplY3RlZFwmIzM0OykpXG4mIzQzO1x0XHRzaWduZWRfbm9uYXJyYXlfZmRfYXJyYXlfcmVqZWN0ZWQoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtzaWduZWRfYnRmX2ZkX2FycmF5X3JlamVjdGVkXCYjMzQ7KSlcbiYjNDM7XHRcdHNpZ25lZF9idGZfZmRfYXJyYXlfcmVqZWN0ZWQoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtzaWduZWRfbW9kdWxlX2tmdW5jX3JlamVjdGVkXCYjMzQ7KSlcbiYjNDM7XHRcdHNpZ25lZF9tb2R1bGVfa2Z1bmNfcmVqZWN0ZWQoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtzaWduYXR1cmVfZmFpbHVyZV9sb2dzXCYjMzQ7KSlcbiYjNDM7XHRcdHNpZ25hdHVyZV9mYWlsdXJlX2xvZ3MoKTtcbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3NpZ25hdHVyZV90b29fbGFyZ2VcJiMzNDspKVxuIFx0XHRzaWduYXR1cmVfdG9vX2xhcmdlKCk7XG4gXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtzaWduYXR1cmVfYmFkX2tleXJpbmdcJiMzNDspKVxuQEAgLTExMTQsNiAmIzQzOzE3ODIsOCBAQCB2b2lkIHRlc3Rfc2lnbmVkX2xvYWRlcih2b2lkKVxuIFx0XHRtZXRhZGF0YV9jdHhfaW5pdGlhbF92YWx1ZV9pZ25vcmVkKCk7XG4gXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtzaWduYXR1cmVfYXV0aGVudGljYXRlc19pbnNuc1wmIzM0OykpXG4gXHRcdHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX2luc25zKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7c2lnbmF0dXJlX2F1dGhlbnRpY2F0ZXNfbWV0YWRhdGFcJiMzNDspKVxuJiM0MztcdFx0c2lnbmF0dXJlX2F1dGhlbnRpY2F0ZXNfbWV0YWRhdGEoKTtcbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O2hhc2hfcmVxdWlyZXNfZnJvemVuXCYjMzQ7KSlcbiBcdFx0aGFzaF9yZXF1aXJlc19mcm96ZW4oKTtcbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O25vX3VwZGF0ZV9hZnRlcl9mcmVlemVcJiMzNDspKVxuQEAgLTExMzIsNCAmIzQzOzE4MDIsMTAgQEAgdm9pZCB0ZXN0X3NpZ25lZF9sb2FkZXIodm9pZClcbiBcdFx0bWFwX2hhc2hfdW5zdXBwb3J0ZWRfdHlwZSgpO1xuIFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bHNtX3NpZ25hdHVyZV92ZXJkaWN0XCYjMzQ7KSlcbiBcdFx0bHNtX3NpZ25hdHVyZV92ZXJkaWN0KCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7c2lnbmVkX25vX2ZkX2FycmF5XCYjMzQ7KSlcbiYjNDM7XHRcdHNpZ25lZF9ub19mZF9hcnJheSgpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3NpZ25lZF9tYXBfYnlfZmRfcmVqZWN0ZWRcJiMzNDspKVxuJiM0MztcdFx0c2lnbmVkX21hcF9ieV9mZF9yZWplY3RlZCgpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3NpZ25lZF9zcGFyc2VfZmRfYXJyYXlfcmVqZWN0ZWRcJiMzNDspKVxuJiM0MztcdFx0c2lnbmVkX3NwYXJzZV9mZF9hcnJheV9yZWplY3RlZCgpO1xuIH1cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9zaWduZWRfbG9hZGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9zaWduZWRfbG9hZGVyLmNcbmluZGV4IGQ5YTRiODVmOTM5MWY1Li41MDQ1MWE2OWI5OWEyNyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3NpZ25lZF9sb2FkZXIuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfc2lnbmVkX2xvYWRlci5jXG5AQCAtNCwxMCAmIzQzOzQsMTEgQEBcbiBcbiAvKlxuICAqIE1pbmltYWwsIG1hcC1sZXNzIHByb2dyYW0uIERyaXZlbiB0aHJvdWdoIGxpYmJwZiYjMzk7cyBnZW5fbG9hZGVyIChnZW5faGFzaClcbi0gKiBieSBwcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYyBzbyB0aGUgZ2VuZXJhdGVkIGxpZ2h0LXNrZWxldG9uIGxvYWRlciAod2l0aFxuLSAqIHRoZSBlbWl0X3NpZ25hdHVyZV9tYXRjaCBtZXRhZGF0YSBjaGVjaykgY2FuIGJlIGV4ZXJjaXNlZCBhZ2FpbnN0IGdvb2Rcbi0gKiBhbmQgdGFtcGVyZWQgbWV0YWRhdGEuIEEgc29ja2V0IGZpbHRlciBuZWVkcyBubyBsb2FkLXRpbWUgYXR0YWNoIHJlc29sdXRpb24sXG4tICogYW5kIGhhdmluZyBubyBtYXBzIGtlZXBzIHRoZSBnZW5lcmF0ZWQgbG9hZGVyJiMzOTtzIGN0eCB0cml2aWFsICgwIG1hcHMsIDEgcHJvZykuXG4mIzQzOyAqIGJ5IHByb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jIHNvIHRoZSBnZW5lcmF0ZWQgbGlnaHQtc2tlbGV0b24gbG9hZGVyIGNhbiBiZVxuJiM0MzsgKiBleGVyY2lzZWQgYWdhaW5zdCBnb29kIGFuZCB0YW1wZXJlZCBtZXRhZGF0YSwgd2hpY2ggdGhlIGtlcm5lbCBub3cgdmVyaWZpZXNcbiYjNDM7ICogYXQgbG9hZCB0aW1lIHZpYSB0aGUgaW5zbnN8fG1ldGFkYXRhIHNpZ25hdHVyZS4gQSBzb2NrZXQgZmlsdGVyIG5lZWRzIG5vXG4mIzQzOyAqIGxvYWQtdGltZSBhdHRhY2ggcmVzb2x1dGlvbiwgYW5kIGhhdmluZyBubyBtYXBzIGtlZXBzIHRoZSBnZW5lcmF0ZWQgbG9hZGVyJiMzOTtzXG4mIzQzOyAqIGN0eCB0cml2aWFsICgwIG1hcHMsIDEgcHJvZykuXG4gICovXG4gU0VDKFwmIzM0O3NvY2tldFwmIzM0OylcbiBpbnQgcHJvYmUodm9pZCAqY3R4KVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy92ZXJpZmllcl9tYXBfcHRyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdmVyaWZpZXJfbWFwX3B0ci5jXG5pbmRleCAxNjYxOTM2NTk4NzAzYy4uZTBhNjU4MzVjODYxYmIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdmVyaWZpZXJfbWFwX3B0ci5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdmVyaWZpZXJfbWFwX3B0ci5jXG5AQCAtNzIsMTQgJiM0Mzs3MiwxNSBAQCBfX25ha2VkIHZvaWQgYnBmX21hcF9wdHJfd3JpdGVfcmVqZWN0ZWQodm9pZClcbiBcbiAvKlxuICAqIHN0cnVjdCBicGZfbWFwIHN0YXJ0cyB3aXRoIHRoZSBTSEEyNTYgaGFzaCBzaGFbMzJdIGF0IG9mZnNldCAwIChhIHJlYWRhYmxlXG4tICogYnl0ZSBhcnJheSksIHRoZSB1MzIgZXhjbCBmaWVsZCBhdCBvZmZzZXQgMzIsIGFuZCB0aGUgb3BzIHBvaW50ZXIgYXQgb2Zmc2V0XG4tICogNDAuIFJlYWRpbmcgYSB1MzIgYXQgb2Zmc2V0IDQxIHJlYWNoZXMgaW50byB0aGUgbWlkZGxlIG9mIHRoZSBvcHMgcG9pbnRlcixcbi0gKiBpLmUuIGEgcGFydGlhbCBwb2ludGVyIGFjY2Vzcywgd2hpY2ggaXMgcmVqZWN0ZWQuXG4mIzQzOyAqIGJ5dGUgYXJyYXkpLCBmb2xsb3dlZCBieSB0aGUgb3BzIHBvaW50ZXIgYXQgb2Zmc2V0IDMyIGFuZCB0aGUgaW5uZXJfbWFwX21ldGFcbiYjNDM7ICogcG9pbnRlciBhdCBvZmZzZXQgNDAuIFJlYWRpbmcgYSB1MzIgYXQgb2Zmc2V0IDQxIHJlYWNoZXMgaW50byB0aGUgbWlkZGxlIG9mXG4mIzQzOyAqIHRoZSBpbm5lcl9tYXBfbWV0YSBwb2ludGVyLCBpLmUuIGEgcGFydGlhbCBwb2ludGVyIGFjY2Vzcywgd2hpY2ggaXNcbiYjNDM7ICogcmVqZWN0ZWQuXG4gICovXG4gU0VDKFwmIzM0O3NvY2tldFwmIzM0OylcbiBfX2Rlc2NyaXB0aW9uKFwmIzM0O2JwZl9tYXBfcHRyOiByZWFkIG5vbi1leGlzdGVudCBmaWVsZCByZWplY3RlZFwmIzM0OylcbiBfX2ZhaWx1cmVcbi1fX21zZyhcJiMzNDtjYW5ub3QgYWNjZXNzIHB0ciBtZW1iZXIgb3BzIHdpdGggbW9mZiA0MCBpbiBzdHJ1Y3QgYnBmX21hcCB3aXRoIG9mZiA0MSBzaXplIDRcJiMzNDspXG4mIzQzO19fbXNnKFwmIzM0O2Nhbm5vdCBhY2Nlc3MgcHRyIG1lbWJlciBpbm5lcl9tYXBfbWV0YSB3aXRoIG1vZmYgNDAgaW4gc3RydWN0IGJwZl9tYXAgd2l0aCBvZmYgNDEgc2l6ZSA0XCYjMzQ7KVxuIF9fZmFpbHVyZV91bnByaXZcbiBfX21zZ191bnByaXYoXCYjMzQ7YWNjZXNzIGlzIGFsbG93ZWQgb25seSB0byBDQVBfUEVSRk1PTiBhbmQgQ0FQX1NZU19BRE1JTlwmIzM0OylcbiBfX2ZsYWcoQlBGX0ZfQU5ZX0FMSUdOTUVOVClcbkBAIC05NywyMyAmIzQzOzk4LDIzIEBAIF9fbmFrZWQgdm9pZCByZWFkX25vbl9leGlzdGVudF9maWVsZF9yZWplY3RlZCh2b2lkKVxuIH1cbiBcbiAvKlxuLSAqIFRoZSB1MzIgZXhjbCBmaWVsZCBzcGFucyBvZmZzZXRzIDMyLi4zNSAobWVuZCAzNikuIFJlYWRpbmcgYSB1MzIgYXQgb2Zmc2V0XG4tICogMzMgc3RhcnRzIGluc2lkZSBleGNsIGJ1dCBleHRlbmRzIHBhc3QgaXRzIGVuZCwgd2hpY2ggdGhlIHZlcmlmaWVyIHJlamVjdHNcbiYjNDM7ICogVGhlIHNoYSBieXRlIGFycmF5IHNwYW5zIG9mZnNldHMgMC4uMzEgKG1lbmQgMzIpLiBSZWFkaW5nIGEgdTMyIGF0IG9mZnNldFxuJiM0MzsgKiAzMCBzdGFydHMgaW5zaWRlIHNoYSBidXQgZXh0ZW5kcyBwYXN0IGl0cyBlbmQsIHdoaWNoIHRoZSB2ZXJpZmllciByZWplY3RzXG4gICogYXMgYW4gb3V0LW9mLWJvdW5kcyBzY2FsYXIgYWNjZXNzLlxuICAqL1xuIFNFQyhcJiMzNDtzb2NrZXRcJiMzNDspXG4tX19kZXNjcmlwdGlvbihcJiMzNDticGZfbWFwX3B0cjogcmVhZCBiZXlvbmQgZXhjbCBmaWVsZCByZWplY3RlZFwmIzM0OylcbiYjNDM7X19kZXNjcmlwdGlvbihcJiMzNDticGZfbWFwX3B0cjogcmVhZCBiZXlvbmQgc2hhIGZpZWxkIHJlamVjdGVkXCYjMzQ7KVxuIF9fZmFpbHVyZVxuLV9fbXNnKFwmIzM0O2FjY2VzcyBiZXlvbmQgdGhlIGVuZCBvZiBtZW1iZXIgZXhjbCAobWVuZDozNikgaW4gc3RydWN0IGJwZl9tYXAgd2l0aCBvZmYgMzMgc2l6ZSA0XCYjMzQ7KVxuJiM0MztfX21zZyhcJiMzNDthY2Nlc3MgYmV5b25kIHRoZSBlbmQgb2YgbWVtYmVyIHNoYSAobWVuZDozMikgaW4gc3RydWN0IGJwZl9tYXAgd2l0aCBvZmYgMzAgc2l6ZSA0XCYjMzQ7KVxuIF9fZmFpbHVyZV91bnByaXZcbiBfX21zZ191bnByaXYoXCYjMzQ7YWNjZXNzIGlzIGFsbG93ZWQgb25seSB0byBDQVBfUEVSRk1PTiBhbmQgQ0FQX1NZU19BRE1JTlwmIzM0OylcbiBfX2ZsYWcoQlBGX0ZfQU5ZX0FMSUdOTUVOVClcbi1fX25ha2VkIHZvaWQgcmVhZF9iZXlvbmRfZXhjbF9maWVsZF9yZWplY3RlZCh2b2lkKVxuJiM0MztfX25ha2VkIHZvaWQgcmVhZF9iZXlvbmRfc2hhX2ZpZWxkX3JlamVjdGVkKHZvaWQpXG4ge1xuIFx0YXNtIHZvbGF0aWxlIChcJiMzNDtcdFx0XHRcdFx0XFxcbiBcdHI2ID0gMDtcdFx0XHRcdFx0XHRcXFxuIFx0cjEgPSAlW21hcF9hcnJheV80OGJdIGxsO1x0XHRcdFxcXG4tXHRyNiA9ICoodTMyKikocjEgJiM0MzsgMzMpO1x0XHRcdFx0XFxcbiYjNDM7XHRyNiA9ICoodTMyKikocjEgJiM0MzsgMzApO1x0XHRcdFx0XFxcbiBcdHIwID0gMTtcdFx0XHRcdFx0XHRcXFxuIFx0ZXhpdDtcdFx0XHRcdFx0XHRcXFxuIFwmIzM0O1x0OlxuQEAgLTEzMSw3ICYjNDM7MTMyLDcgQEAgX19uYWtlZCB2b2lkIHB0cl9yZWFkX29wc19maWVsZF9hY2NlcHRlZCh2b2lkKVxuIFx0YXNtIHZvbGF0aWxlIChcJiMzNDtcdFx0XHRcdFx0XFxcbiBcdHI2ID0gMDtcdFx0XHRcdFx0XHRcXFxuIFx0cjEgPSAlW21hcF9hcnJheV80OGJdIGxsO1x0XHRcdFxcXG4tXHRyNiA9ICoodTY0KikocjEgJiM0MzsgNDApO1x0XHRcdFx0XFxcbiYjNDM7XHRyNiA9ICoodTY0KikocjEgJiM0MzsgMzIpO1x0XHRcdFx0XFxcbiBcdHIwID0gMTtcdFx0XHRcdFx0XHRcXFxuIFx0ZXhpdDtcdFx0XHRcdFx0XHRcXFxuIFwmIzM0O1x0OlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjI0PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjZtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01PRFVMRV9TSUcmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlJiMzNDssCiAgICAmIzM0O3Byb2Nlc3NfZmRfYXJyYXlfY29udGludW91cyYjMzQ7LAogICAgJiMzNDtwcm9jZXNzX2ZkX2FycmF5JiMzNDssCiAgICAmIzM0O2ZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXMmIzM0OywKICAgICYjMzQ7ZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlJiMzNDssCiAgICAmIzM0O2ZkX2FycmF5X2dldF9tYXBfaWR4JiMzNDssCiAgICAmIzM0O2ZkX2FycmF5X2dldF9idGZfY29udGludW91cyYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfYnRmX3NwYXJzZSYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfYnRmJiMzNDssCiAgICAmIzM0O2FkZF9mZF9mcm9tX2ZkX2FycmF5JiMzNDssCiAgICAmIzM0O2JwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIHByb2dyYW0gc2lnbmluZyB2ZXJpZmljYXRpb24gaW50byB0aGUga2VybmVsIHZlcmlmaWVyLiBJdCBtb2RpZmllcyB0aGUgYGJwZl9jaGVja2AgcGF0aCB0byB2ZXJpZnkgUEtDUyM3IHNpZ25hdHVyZXMgb2YgQlBGIHByb2dyYW1zIGFuZCB0aGVpciBtZXRhZGF0YSBtYXBzIHdoZW4gYGF0dHItXHUwMDNlc2lnbmF0dXJlYCBpcyBwcm92aWRlZC4gSXQgYWxzbyBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIGEgY29udGludW91cyBgZmRfYXJyYXlgIHZpYSBgZmRfYXJyYXlfY250YC4gVGhlc2UgYXJlIHJlYWNoYWJsZSBjb3JlIEJQRiB2ZXJpZmllciBjaGFuZ2VzIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLApldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXQKICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LAogICBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgOWU3ZGViN2RhZWQwMjlmY2Q5MjAxZTU0YmVmZjVmNzJlMjY1ZDYwYgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBNb24gSnVsIDYgMjA6MjQ6NTAgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2JwZi9pbmRleC5yc3QgYi9Eb2N1bWVudGF0aW9uL2JwZi9pbmRleC5yc3QKaW5kZXggMGQ1YzZmNjU5MjY2N2EuLjYzOGEwMGQ0MmJjMmExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2JwZi9pbmRleC5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9icGYvaW5kZXgucnN0CkBAIC0yOCw2ICYjNDM7MjgsNyBAQCB0aGF0IGdvZXMgaW50byBncmVhdCB0ZWNobmljYWwgZGVwdGggYWJvdXQgdGhlIEJQRiBBcmNoaXRlY3R1cmUuCiAgICBjbGFzc2ljX3ZzX2V4dGVuZGVkLnJzdAogICAgYnBmX2l0ZXJhdG9ycwogICAgYnBmX2xpY2Vuc2luZwomIzQzOyAgIHNpZ25pbmcKICAgIHRlc3RfZGVidWcKICAgIGNsYW5nLW5vdGVzCiAgICBsaW51eC1ub3RlcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3QgYi9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uNDQ2YjRlZGJhZTYyNmMKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdApAQCAtMCwwICYjNDM7MSw0OTYgQEAKJiM0MzsuLiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOz09PT09PT09PT09PQomIzQzO0JQRiBzaWduaW5nCiYjNDM7PT09PT09PT09PT09CiYjNDM7CiYjNDM7VGhpcyBkb2N1bWVudCBkZXNjcmliZXMgaG93IEJQRiBwcm9ncmFtcyBhcmUgY3J5cHRvZ3JhcGhpY2FsbHkgc2lnbmVkLCBob3cgdGhlCiYjNDM7a2VybmVsIHZlcmlmaWVzIHRoZW0gYXQgbG9hZCB0aW1lLCBhbmQgaG93IExpbnV4IFNlY3VyaXR5IE1vZHVsZXMgKExTTXMpIC0KJiM0MztpbmNsdWRpbmcgdGhlIEJQRiBMU00gLSB1c2UgdGhlIHJlc3VsdGluZyB2ZXJkaWN0IHRvIGVuZm9yY2UgcG9saWN5LiBJdCBpcwomIzQzO3dyaXR0ZW4gZm9yIGRldmVsb3BlcnMgd2hvIHdhbnQgdG8gcHJvZHVjZSBzaWduZWQgQlBGIG9iamVjdHMsIHVuZGVyc3RhbmQgd2hhdAomIzQzO3RoZSBzaWduYXR1cmUgYWN0dWFsbHkgZ3VhcmFudGVlcywgb3IgYnVpbGQgYSBwb2xpY3kgb24gdG9wIG9mIGl0LgomIzQzOwomIzQzO01vdGl2YXRpb24KJiM0Mzs9PT09PT09PT09CiYjNDM7CiYjNDM7QSBzaWduZWQgQlBGIHByb2dyYW0gbGV0cyB0aGUga2VybmVsIGVzdGFibGlzaCB0aGF0IHRoZSBieXRlY29kZSBiZWluZyBsb2FkZWQKJiM0MztvcmlnaW5hdGVzIGZyb20gYSB0cnVzdGVkIHByb2R1Y2VyIGFuZCB3YXMgbm90IG1vZGlmaWVkIGluIHRyYW5zaXQuIE9uIGl0cyBvd24KJiM0Mzt0aGUga2VybmVsIGRvZXMgbm90ICpyZXF1aXJlKiBzaWduYXR1cmVzIC0gYW4gdW5zaWduZWQgcHJvZ3JhbSBsb2FkcyBleGFjdGx5IGFzCiYjNDM7YmVmb3JlIC0gYnV0IGl0IHJlY29yZHMgYSB2ZXJkaWN0IChzZWUgYFRoZSB2ZXJkaWN0YF8pIHRoYXQgYW4gTFNNIGNhbiBnYXRlIG9uLgomIzQzO1RoaXMgaXMgdGhlIGJ1aWxkaW5nIGJsb2NrIGZvciBwb2xpY2llcyBzdWNoIGFzICYjMzQ7b25seSBydW4gQlBGIHRoYXQgd2FzIHNpZ25lZCBieQomIzQzO2Ega2V5IGluIHRoZSB0cnVzdGVkIGtleXJpbmcmIzM0OywgYXMgY291bGQgaW4gdGhlIGZ1dHVyZSBiZSBlbmZvcmNlZCBieSBhbiBMU00KJiM0MztzdWNoIGFzIElQRS4KJiM0MzsKJiM0MztTaWduaW5nIGlzIG9ydGhvZ29uYWwgdG8gdGhlIGV4aXN0aW5nIHBlcm1pc3Npb24gbW9kZWw6IGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlCiYjNDM7Y2FwYWJpbGl0eSBjaGVja3Mgb3IgdGhlIHZlcmlmaWVyLiBBIHNpZ25lZCBsb2FkIHN0aWxsIHJlcXVpcmVzIHRoZSB1c3VhbAomIzQzO3ByaXZpbGVnZXMgKGBgQ0FQX0JQRmBgIGFuZCBhbnkgcHJvZ3JhbS10eXBlLXNwZWNpZmljIGNhcGFiaWxpdHksIHN1YmplY3QgdG8KJiM0MztgYGtlcm5lbC51bnByaXZpbGVnZWRfYnBmX2Rpc2FibGVkYGApLCBhbmQgdGhlIGxvYWRlciYjMzk7cyBpbnN0cnVjdGlvbnMgYXJlIHN0aWxsCiYjNDM7Y2hlY2tlZCBieSB0aGUgdmVyaWZpZXIgbGlrZSBhbnkgb3RoZXIgcHJvZ3JhbS4gQSB2YWxpZCBzaWduYXR1cmUgZXN0YWJsaXNoZXMKJiM0Mzsqb3JpZ2luIGFuZCBpbnRlZ3JpdHkqLCBub3Qgc2FmZXR5IC0gaXQgbGV0cyBhIHBvbGljeSB0cnVzdCB3aGVyZSB0aGUgYnl0ZWNvZGUKJiM0MztjYW1lIGZyb20sIGl0IGRvZXMgbm90IGxldCBhIGxvYWQgc2tpcCBhbnkgY2hlY2sgaXQgd291bGQgb3RoZXJ3aXNlIGZhY2UuCiYjNDM7CiYjNDM7VGhlIGhhcmQgcGFydCBpcyAqd2hhdCogZ2V0cyBzaWduZWQuIEEgbmFpdmUgc2NoZW1lIHdvdWxkIHNpZ24gYSBwcm9ncmFtJiMzOTtzCiYjNDM7aW5zdHJ1Y3Rpb24gYnVmZmVyIGF0IGJ1aWxkIHRpbWUgYW5kIHZlcmlmeSB0aGF0IHNpZ25hdHVyZSBhdAomIzQzO2BgQlBGX1BST0dfTE9BRGBgLiBUaGF0IGRvZXMgbm90IHN1cnZpdmUgY29udGFjdCB3aXRoIHJlYWwgQlBGIG9iamVjdHMsIGJlY2F1c2UKJiM0Mzt0aGUgYnl0ZXMgdGhlIGtlcm5lbCBmaW5hbGx5IGxvYWRzIGFyZSBub3QgdGhlIGJ5dGVzIHRoZSBkZXZlbG9wZXIgYnVpbHQgYW5kCiYjNDM7c2lnbmVkLiBCZXR3ZWVuIHRoZSB0d28sIGxpYmJwZiBhbmQgdGhlIGtlcm5lbCByZXdyaXRlIHRoZSBwcm9ncmFtOgomIzQzOwomIzQzOy0gKiptYXAgZmlsZSBkZXNjcmlwdG9ycyoqIGFyZSBwYXRjaGVkIGludG8gYGBsZF9pbW02NGBgIGluc3RydWN0aW9ucwomIzQzOyAgKGBgQlBGX1BTRVVET19NQVBfRkRgYCksIGFuZCBhIG1hcCYjMzk7cyBmZCBpcyBhc3NpZ25lZCBhdCBsb2FkIHRpbWUsIHNvIGl0CiYjNDM7ICBkaWZmZXJzIG9uIGV2ZXJ5IHJ1bjsKJiM0MzstICoqQ08tUkUgcmVsb2NhdGlvbnMqKiByZXdyaXRlIGZpZWxkIG9mZnNldHMsIHNpemVzIGFuZCBleGlzdGVuY2UgZmxhZ3MgYWdhaW5zdAomIzQzOyAgdGhlICpydW5uaW5nKiBrZXJuZWwmIzM5O3MgQlRGLCBzbyB0aGUgcmVzdWx0IGRpZmZlcnMgZnJvbSBvbmUga2VybmVsIHRvIHRoZSBuZXh0OwomIzQzOy0gKiprZnVuYyBhbmQga3N5bSByZWZlcmVuY2VzKiogYXJlIHJlc29sdmVkIHRvIGlkcy9hZGRyZXNzZXMgaW4gdGhlIHJ1bm5pbmcKJiM0MzsgIGtlcm5lbDsKJiM0MzstICoqZ2xvYmFsIGRhdGEqKiAoYGAucm9kYXRhYGAvYGAuZGF0YWBgL2BgLmJzc2BgKSBpcyBjcmVhdGVkIGFuZCBzZWVkZWQgYXMgbWFwcwomIzQzOyAgYXQgbG9hZC4KJiM0MzsKJiM0MztTbyBhIHNpZ25hdHVyZSBvdmVyIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbnMgY2Fubm90IG1hdGNoIHRoZSByZWxvY2F0ZWQKJiM0MztpbnN0cnVjdGlvbnMgdGhlIHZlcmlmaWVyIGVuZHMgdXAgY2hlY2tpbmcsIGFuZCB0aGUgcmVsb2NhdGVkIGZvcm0gY2Fubm90IGJlCiYjNDM7cHJvZHVjZWQgYWhlYWQgb2YgdGltZSBiZWNhdXNlIGl0IGRlcGVuZHMgb24gdGhlIHRhcmdldCBrZXJuZWwuIFRoZXJlIGlzIG5vCiYjNDM7Zml4ZWQgYnl0ZSBzdHJpbmcgdGhhdCBpcyBib3RoIHNpZ25hYmxlIGF0IGJ1aWxkIHRpbWUgYW5kIHdoYXQgdGhlIGtlcm5lbAomIzQzO2FjdHVhbGx5IGxvYWRzIC0gd2hpY2ggaXMgd2h5IGEgcHJvZ3JhbSBjYW5ub3Qgc2ltcGx5IGJlIHNpZ25lZCBhbmQgbG9hZGVkCiYjNDM7ZGlyZWN0bHkuCiYjNDM7CiYjNDM7VGhlIHRydXN0ZWQgbG9hZGVyCiYjNDM7PT09PT09PT09PT09PT09PT09CiYjNDM7CiYjNDM7VGhlIHNvbHV0aW9uIGlzIHRvIG1vdmUgdGhhdCBzZXR1cCB3b3JrICppbnRvKiBhIHNtYWxsIEJQRiBwcm9ncmFtIC0gdGhlCiYjNDM7Kipsb2FkZXIqKiAtIGFuZCBzaWduIHRoZSBsb2FkZXIgaW5zdGVhZCBvZiB0aGUgaW5kaXZpZHVhbCBwcm9ncmFtcy4gbGliYnBmJiMzOTtzCiYjNDM7YGBnZW5fbG9hZGVyYGAgbWFjaGluZXJ5IChgYGJwZnRvb2wgZ2VuIHNrZWxldG9uIC1MYGAsIHRoZSAmIzM0O2xpZ2h0IHNrZWxldG9uJiMzNDspCiYjNDM7ZW1pdHMgYSBgYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGBgIHByb2dyYW0gd2hvc2UgYm9keSBwZXJmb3JtcyB0aGUgYnBmKCkgc3lzY2FsbHMKJiM0Mzt0aGF0IGNyZWF0ZSBtYXBzLCBhcHBseSByZWxvY2F0aW9ucywgYW5kIGxvYWQgdGhlIHJlYWwgcHJvZ3JhbXMuIFRoZSBwYXlsb2FkIGl0CiYjNDM7aW5zdGFsbHMgLSB0aGUgc2VyaWFsaXplZCBwcm9ncmFtcywgbWFwIGRlc2NyaXB0aW9ucywgcmVsb2NhdGlvbiBkYXRhIGFuZAomIzQzO2luaXRpYWwgdmFsdWVzIC0gbGl2ZXMgaW4gYSBzZXBhcmF0ZSBhcnJheSBtYXAsIHRoZSAqKm1ldGFkYXRhIG1hcCoqCiYjNDM7KGBgX19sb2FkZXIubWFwYGApLgomIzQzOwomIzQzO1NvIHRoZSB1bml0IG9mIHRydXN0IGlzIHRoZSBsb2FkZXIsIGFuZCB0aGUgc2lnbmluZyBjb250cmFjdCBpczo6CiYjNDM7CiYjNDM7ICAgIFNpZyhJX2xvYWRlciB8fCBEX21ldGEpCiYjNDM7CiYjNDM7d2hlcmUgYGBJX2xvYWRlcmBgIGlzIHRoZSBsb2FkZXImIzM5O3MgaW5zdHJ1Y3Rpb24gc3RyZWFtIGFuZCBgYERfbWV0YWBgIGlzIHRoZQomIzQzO2NvbnRlbnQgb2YgdGhlIG1ldGFkYXRhIG1hcC4gVmVyaWZ5aW5nIHRoZSBsb2FkZXImIzM5O3Mgc2lnbmF0dXJlIGVzdGFibGlzaGVzIHRoYXQKJiM0Mztib3RoIHRoZSBsb2FkZXIgKmFuZCogdGhlIHBheWxvYWQgaXQgaXMgYWJvdXQgdG8gaW5zdGFsbCBhcmUgYXV0aGVudGljLiBUaGUKJiM0Mztsb2FkZXIgaXMgcmVwcm9kdWNpYmxlOiBgYGdlbl9sb2FkZXJgYCBidWlsZHMgaXQgZnJvbSBwcmltaXRpdmVzIHNvIHRoZSBzYW1lCiYjNDM7b2JqZWN0IHlpZWxkcyB0aGUgc2FtZSBieXRlcyBvbiBhbnkgYnVpbGQgaG9zdC4KJiM0MzsKJiM0MztXaHkgdGhlIGxvYWRlciBpcyBzaWduYWJsZSB3aGVuIHRoZSBwcm9ncmFtIGlzIG5vdAomIzQzOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiYjNDM7CiYjNDM7VGhlIGxvYWRlciBzaWRlc3RlcHMgZXZlcnkgcmV3cml0ZSBsaXN0ZWQgYWJvdmUsIGJlY2F1c2UgdGhlIGJ5dGVzIHRoYXQgYXJlCiYjNDM7c2lnbmVkIGFyZSAqcmVsb2NhdGlvbi1pbnZhcmlhbnQqOgomIzQzOwomIzQzOy0gVGhlIGxvYWRlciYjMzk7cyBvd24gaW5zdHJ1Y3Rpb25zIGFyZSBhIGZpeGVkIHNlcXVlbmNlIG9mIGJwZigpIHN5c2NhbGxzIGVtaXR0ZWQKJiM0MzsgIGJ5IGBgZ2VuX2xvYWRlcmBgOyB0aGV5IGNhcnJ5IG5vIENPLVJFIHJlbG9jYXRpb25zIGFuZCByZXNvbHZlIG5vIGtzeW1zLCBzbwomIzQzOyAgdGhleSBhcmUgaWRlbnRpY2FsIG9uIGV2ZXJ5IGtlcm5lbC4gVGhlIG1ldGFkYXRhIG1hcCBpcyByZWZlcmVuY2VkIGJ5ICppbmRleCoKJiM0MzsgIGludG8gYGBmZF9hcnJheWBgIChgYEJQRl9QU0VVRE9fTUFQX0lEWF9WQUxVRWBgKSwgbm90IGJ5IGEgYmFrZWQtaW4gZmlsZQomIzQzOyAgZGVzY3JpcHRvciwgc28gZXZlbiB0aGF0IHJlZmVyZW5jZSBkb2VzIG5vdCBjaGFuZ2UgYmV0d2VlbiBidWlsZCBhbmQgbG9hZC4KJiM0MzsgIFRoZSBsb2FkZXIgaW5zdHJ1Y3Rpb24gYnl0ZXMgdGhlIGtlcm5lbCB2ZXJpZmllcyBhcmUgZXhhY3RseSB0aGUgYnl0ZXMgdGhhdAomIzQzOyAgd2VyZSBzaWduZWQuCiYjNDM7LSBUaGUgbWV0YWRhdGEgbWFwIGlzIG9wYXF1ZSwgZnJvemVuIGRhdGEgLSB0aGUgc2VyaWFsaXplZCB0YXJnZXQgcHJvZ3JhbXMsCiYjNDM7ICB0aGVpciByZWxvY2F0aW9uIHJlY29yZHMsIG1hcCBkZXNjcmlwdGlvbnMgYW5kIGluaXRpYWwgdmFsdWVzLiBJdHMgYnl0ZXMgYXJlCiYjNDM7ICBpZGVudGljYWwgYXQgYnVpbGQgdGltZSBhbmQgYXQgbG9hZCB0aW1lLCBzbyB0aGV5IGFyZSBzaW1wbHkgYXBwZW5kZWQgdG8gdGhlCiYjNDM7ICBpbnN0cnVjdGlvbnMgYW5kIGNvdmVyZWQgYnkgdGhlIHNhbWUgc2lnbmF0dXJlICh0aGVyZSBpcyBubyBzZXBhcmF0ZSBtZXRhZGF0YQomIzQzOyAgaGFzaCB0byBjb21wdXRlIG9yIGNvbXBhcmUpLgomIzQzOwomIzQzO0FsbCB0aGUgaG9zdC1zcGVjaWZpYyByZXdyaXRpbmcgLSBjcmVhdGluZyBtYXBzLCBwYXRjaGluZyB0aGVpciBmZHMgaW50byB0aGUKJiM0Mzt0YXJnZXQgcHJvZ3JhbXMsIGFwcGx5aW5nIENPLVJFLCByZXNvbHZpbmcga3N5bXMsIHNlZWRpbmcgZ2xvYmFsIGRhdGEgLSBzdGlsbAomIzQzO2hhcHBlbnMsIGJ1dCBpdCBoYXBwZW5zICppbnNpZGUgdGhlIGxvYWRlciBhdCBydW50aW1lKiwgb24gdGhlIHZlcmlmaWVkCiYjNDM7bWV0YWRhdGEsICoqYWZ0ZXIqKiB0aGUga2VybmVsIGhhcyB2ZXJpZmllZCB0aGUgYGBpbnNucyB8fCBtZXRhZGF0YWBgIHNpZ25hdHVyZS4KJiM0MztUaGUga2VybmVsIG5ldmVyIGhhcyB0byB2ZXJpZnkgdGhlIHJlbG9jYXRlZCB0YXJnZXQgcHJvZ3JhbXM6IGl0IHZlcmlmaWVzIHRoZQomIzQzO2xvYWRlciBhbmQgaXRzIGlucHV0cyBvbmNlLCBhbmQgdHJ1c3QgdHJhbnNmZXJzIHRvIHdoYXRldmVyIHRoYXQgbm93LXRydXN0ZWQsCiYjNDM7ZGV0ZXJtaW5pc3RpYyBsb2FkZXIgaW5zdGFsbHMuIFRoZSByZWxvY2F0aW9uIHN0ZXAgaXMgbW92ZWQgZnJvbSAmIzM0O2JlZm9yZSB0aGUKJiM0MztzaWduYXR1cmUgY2FuIGJlIGNoZWNrZWQmIzM0OyB0byAmIzM0O2FmdGVyIGEgdHJ1c3RlZCBwcm9ncmFtIHJ1bnMmIzM0OyAtIHdoaWNoIGlzIGV4YWN0bHkKJiM0Mzt3aGF0IG1ha2VzIGl0IHNpZ25hYmxlLgomIzQzOwomIzQzO0JlY2F1c2UgdGhlIG1ldGFkYXRhIG1hcCBpcyB0aGUgbG9hZGVyJiMzOTtzIG9ubHkgdW50cnVzdGVkIGlucHV0LCB0d28gZXhpc3RpbmcgbWFwCiYjNDM7cHJvcGVydGllcyBhcmUgcmV1c2VkIHRvIGtlZXAgaXQgdHJ1c3R3b3J0aHkgYWNyb3NzIHRoZSBsb2FkOgomIzQzOwomIzQzO0V4Y2x1c2l2ZSBtYXBzCiYjNDM7ICAgIEEgbWFwIGNyZWF0ZWQgd2l0aCBgYGV4Y2xfcHJvZ19oYXNoYGAgKHNlZSBgYEJQRl9NQVBfQ1JFQVRFYGApIG1heSBvbmx5IGJlCiYjNDM7ICAgIGFjY2Vzc2VkIGJ5IGEgcHJvZ3JhbSB3aG9zZSBkaWdlc3QgbWF0Y2hlcyB0aGF0IGhhc2guIFRoZSB2ZXJpZmllciBlbmZvcmNlcwomIzQzOyAgICBgYG1hcC0mZ3Q7ZXhjbF9wcm9nX3NoYSA9PSBwcm9nLSZndDtkaWdlc3RgYCBmb3IgZXZlcnkgbWFwIGEgcHJvZ3JhbSB1c2VzLCBzbyB0aGUKJiM0MzsgICAgbWV0YWRhdGEgbWFwIGlzIGJvdW5kIHRvIGV4YWN0bHkgdGhlIHNpZ25lZCBsb2FkZXIgYW5kIGNhbm5vdCBiZSBzaGFyZWQgd2l0aAomIzQzOyAgICBvciBtdXRhdGVkIGJ5IGFub3RoZXIgcHJvZ3JhbS4KJiM0MzsKJiM0MztGcm96ZW4gbWFwcwomIzQzOyAgICBUaGUgbWV0YWRhdGEgbWFwIGlzIGZyb3plbiAoYGBCUEZfTUFQX0ZSRUVaRWBgKSBiZWZvcmUgdGhlIGxvYWRlciBpcyBsb2FkZWQuCiYjNDM7ICAgIEZyZWV6aW5nIGJsb2NrcyBmdXJ0aGVyIHVzZXJzcGFjZSB3cml0ZXMsIHNvIHRoZSBieXRlcyBmb2xkZWQgaW50byB0aGUKJiM0MzsgICAgc2lnbmF0dXJlIGNhbm5vdCBjaGFuZ2UgYmVmb3JlIHRoZSBsb2FkZXIgcnVucy4gKEZyZWV6aW5nIGRvZXMgbm90IG1ha2UgdGhlCiYjNDM7ICAgIG1hcCByZWFkLW9ubHkgdG8gdGhlIGxvYWRlciBwcm9ncmFtIGl0c2VsZiwgd2hpY2ggc3RpbGwgd3JpdGVzIGNyZWF0ZWQgZmlsZQomIzQzOyAgICBkZXNjcmlwdG9ycyBiYWNrIGludG8gdGhlIGJsb2ImIzM5O3Mgc2NyYXRjaCBhcmVhLikKJiM0MzsKJiM0MztMb2FkLXRpbWUgdmVyaWZpY2F0aW9uCiYjNDM7PT09PT09PT09PT09PT09PT09PT09PT0KJiM0MzsKJiM0MztSYXRoZXIgdGhhbiBoYXZlIHRoZSBsb2FkZXIgY2hlY2sgaXRzIG93biBtZXRhZGF0YSBmcm9tIHdpdGhpbiBCUEYsIHRoZSBrZXJuZWwKJiM0Mzt2ZXJpZmllcyBpdCBkaXJlY3RseSBhdCBgYEJQRl9QUk9HX0xPQURgYCwgd2l0aCBubyBuZXcgVUFQSS4gVGhlIG1lY2hhbmlzbQomIzQzO3JldXNlcyB0aGUgZXhpc3RpbmcgYGBmZF9hcnJheWBgOgomIzQzOwomIzQzOyMuIFVzZXJzcGFjZSBjcmVhdGVzIHRoZSBtZXRhZGF0YSBtYXAgd2l0aCBgYGV4Y2xfcHJvZ19oYXNoYGAgc2V0IHRvIHRoZQomIzQzOyAgIGxvYWRlciYjMzk7cyBkaWdlc3QsIHBvcHVsYXRlcyBpdCwgYW5kIGZyZWV6ZXMgaXQuCiYjNDM7Iy4gVGhlIGxvYWRlciBpcyBsb2FkZWQgd2l0aCBgYHNpZ25hdHVyZWBgL2Bgc2lnbmF0dXJlX3NpemVgYC9gYGtleXJpbmdfaWRgYAomIzQzOyAgIHNldCwgdGhlIG1ldGFkYXRhIG1hcCByZWZlcmVuY2VkIHRocm91Z2ggYGBmZF9hcnJheWBgLCBhbmQgYGBmZF9hcnJheV9jbnRgYAomIzQzOyAgIHNldCBzbyB0aGUga2VybmVsIGtub3dzIHRoZSBhcnJheSYjMzk7cyBsZW5ndGguCiYjNDM7Iy4gU2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBydW5zIGluc2lkZSB0aGUgdmVyaWZpZXIgKGBgYnBmX2NoZWNrKClgYCksIG9uY2UgaXQKJiM0MzsgICBoYXMgcmVzb2x2ZWQgdGhlIGBgZmRfYXJyYXlgYCBlbnRyaWVzIGludG8gdGhlIHByb2dyYW0mIzM5O3MgYGB1c2VkX21hcHNgYC4gVGhlCiYjNDM7ICAgbWFwcyBmb2xkZWQgaW50byB0aGUgc2lnbmF0dXJlIGFyZSB0aGVyZWZvcmUgdGhlIHZlcnkgb2JqZWN0cyB0aGUgcHJvZ3JhbQomIzQzOyAgIGJpbmRzIC0gYSBzaW5nbGUgcmVzb2x1dGlvbiBvZiBgYGZkX2FycmF5YGAsIG5vdCBhIHNlcGFyYXRlIHJlYWQsIHNvIHRoZQomIzQzOyAgIHZlcmlmaWVkIGJ5dGVzIGNhbm5vdCBiZSBzd2FwcGVkIGZvciBhIGRpZmZlcmVudCBtYXAgYWZ0ZXIgdGhlIGNoZWNrIChubwomIzQzOyAgIHRpbWUtb2YtY2hlY2svdGltZS1vZi11c2Ugd2luZG93KS4gRWFjaCBmb2xkZWQgbWFwIG11c3QgYmUgZXhjbHVzaXZlIChjYXJyeQomIzQzOyAgIGBgZXhjbF9wcm9nX3NoYWBgKSBhbmQgYSBwbGFpbiBhcnJheSBtYXAgKGBgQlBGX01BUF9UWVBFX0FSUkFZYGApOyBvbmx5IGFuCiYjNDM7ICAgYXJyYXkgbWFwIGV4cG9zZXMgaXRzIHZhbHVlIGJ1ZmZlciB0aHJvdWdoIGBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyKClgYCBhcyBhCiYjNDM7ICAga2VybmVsIGFkZHJlc3Mgc3Bhbm5pbmcgYGB2YWx1ZV9zaXplYGAgYnl0ZXMuIEEgbWFwIHRoYXQgaXMgbm90IGV4Y2x1c2l2ZSwgbm90CiYjNDM7ICAgZnJvemVuLCBvciBub3QgYSBwbGFpbiBhcnJheSBpcyByZWplY3RlZCwgd2l0aCBhIHZlcmlmaWVyIGxvZyBtZXNzYWdlIG5hbWluZwomIzQzOyAgIHRoZSBvZmZlbmRpbmcgbWFwLiBUaGUga2VybmVsIGFwcGVuZHMgZWFjaCBtYXAmIzM5O3MgZnJvemVuCiYjNDM7ICAgY29udGVudHMgdG8gdGhlIGluc3RydWN0aW9uIGJ1ZmZlciBhbmQgdmVyaWZpZXMgdGhlIFBLQ1MjNyBzaWduYXR1cmUgb3ZlciB0aGUKJiM0MzsgICBjb25jYXRlbmF0aW9uIGBgaW5zbnMgfHwgbWV0YWRhdGFfMCB8fCBtZXRhZGF0YV8xIHx8IC4uLmBgIGluIGBgdXNlZF9tYXBzYGAKJiM0MzsgICBvcmRlciwgYmVmb3JlIGl0IHJld3JpdGVzIHRoZSAoc2lnbmVkKSBpbnN0cnVjdGlvbnMuCiYjNDM7CiYjNDM7QSBzaWduZWQgcHJvZ3JhbSB0aGVyZWZvcmUgdGFrZXMgb25lIG9mIGV4YWN0bHkgdHdvIHNoYXBlcywgYm90aCBmdWxseQomIzQzO3N1cHBvcnRlZDoKJiM0MzsKJiM0MzstICoqTm8gYm91bmQgbWFwcyoqIChgYGZkX2FycmF5X2NudCA9PSAwYGApOiB0aGVyZSBpcyBub3RoaW5nIHRvIGFwcGVuZCwgc28gdGhlCiYjNDM7ICBrZXJuZWwgdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSBvdmVyIHRoZSBpbnN0cnVjdGlvbnMgYWxvbmUuIEEgdmFsaWQgc2lnbmF0dXJlCiYjNDM7ICB5aWVsZHMgYGBCUEZfU0lHX1ZFUklGSUVEYGAgYW5kIHRoZSBwcm9ncmFtIGxvYWRzLiBUaGlzIGlzIHRoZSBvcmRpbmFyeSBjYXNlCiYjNDM7ICBmb3IgYSBkaXJlY3RseS1sb2FkZWQgc2lnbmVkIHByb2dyYW0gd2l0aCBubyBzZXBhcmF0ZSBwYXlsb2FkOyBpdCBpcyAqbm90KgomIzQzOyAgcmVqZWN0ZWQgZm9yICYjMzQ7bWlzc2luZyYjMzQ7IG1ldGFkYXRhLCBiZWNhdXNlIGl0IGhhcyBub25lIHRvIGNvdmVyLgomIzQzOy0gKipFeGNsdXNpdmUgYm91bmQgbWFwcyoqIChgYGZkX2FycmF5X2NudCAmZ3Q7IDBgYCk6IGV2ZXJ5IGVudHJ5IGlzIGV4Y2x1c2l2ZSBhbmQKJiM0MzsgIGZvbGRlZCwgc28gdGhlIHNpZ25hdHVyZSBjb3ZlcnMgYGBpbnNucyB8fCBtZXRhZGF0YWBgLgomIzQzOwomIzQzO1RoZXJlIGlzIG5vIHRoaXJkIHNoYXBlOiBhIG5vbi1leGNsdXNpdmUgbWFwIGluIGEgc2lnbmVkIHByb2dyYW0mIzM5O3MgYGBmZF9hcnJheWBgCiYjNDM7aXMgcmVqZWN0ZWQgcmF0aGVyIHRoYW4gc2lsZW50bHkgbGVmdCBvdXQgb2YgdGhlIHNpZ25hdHVyZSwgc28gYSBwcm9ncmFtIGJvdW5kCiYjNDM7dG8gYSBzaWduZWQgbG9hZGVyIG5ldmVyIGhhcyBhIG1hcCB0aGUgc2lnbmF0dXJlIGRvZXMgbm90IGNvdmVyLgomIzQzOwomIzQzO1RoZSBkaWdlc3QgYmluZGluZyAoYGBleGNsX3Byb2dfc2hhID09IHByb2ctJmd0O2RpZ2VzdGBgKSBpcyBlbmZvcmNlZCBieSB0aGUKJiM0Mzt2ZXJpZmllciBhcyB1c3VhbDsgYmVjYXVzZSB0aGF0IGNoZWNrIHJ1bnMgd2hpbGUgYGBmZF9hcnJheWBgIGlzIHJlc29sdmVkIC0KJiM0MztiZWZvcmUgdGhlIHZlcmlmaWVyIHdvdWxkIG90aGVyd2lzZSBjb21wdXRlIHRoZSB0YWcgLSBgYHByb2ctJmd0O2RpZ2VzdGBgIGlzCiYjNDM7Y29tcHV0ZWQgdXAgZnJvbnQgaW4gdGhlIHZlcmlmaWVyLCBvdmVyIHRoZSB1bm1vZGlmaWVkIChzaWduYXR1cmUtY292ZXJlZCkKJiM0MztpbnN0cnVjdGlvbnMsIGZvciBhbnkgc2lnbmVkIGxvYWQuCiYjNDM7CiYjNDM7Q292ZXJhZ2UgaXMgdGhlbiBlbmZvcmNlZCBhcyB0aGUgdmVyaWZpZXIgcmVzb2x2ZXMgaW5zdHJ1Y3Rpb25zLCBhdCB0aGUgcG9pbnQKJiM0MztlYWNoIG9iamVjdCBpcyBib3VuZCByYXRoZXIgdGhhbiBieSBhIGNvdW50IHRha2VuIGFmdGVyd2FyZHMuIE9uY2UgdGhlIHNpZ25hdHVyZQomIzQzO2hhcyBiZWVuIHZlcmlmaWVkLCBiaW5kaW5nIGFueSBmdXJ0aGVyIG1hcCBpcyByZWZ1c2VkOiBhIG1hcCByZWFjaGVkIGJ5IGEKJiM0MztkaXJlY3RseS1yZWZlcmVuY2VkIGZkLCBvciBhIG1hcCBzd2FwcGVkIGludG8gYW4gYGBmZF9hcnJheWBgIHNsb3QgdGhlIGxvYWRlcgomIzQzO3JlYWRzLCBpcyBub3QgYW1vbmcgdGhvc2UgYWxyZWFkeSBmb2xkZWQsIHNvIGl0IGlzIHJlamVjdGVkIHRoZSBtb21lbnQgdGhlCiYjNDM7dmVyaWZpZXIgdHJpZXMgdG8gYmluZCBpdC4gQSBCVEYgaXMgcmVmdXNlZCBvdXRyaWdodCBmb3IgYSBzaWduZWQgcHJvZ3JhbSAtIGEKJiM0Mztrc3ltIG9yIGEgQlRGIGZkIGluIGBgZmRfYXJyYXlgYCwgd2hldGhlciByZXNvbHZlZCB1cCBmcm9udCBvciBsYXppbHkgZm9yIGEKJiM0Mzttb2R1bGUga2Z1bmMsIGlzIHJlamVjdGVkIHdoZW4gaXQgd291bGQgYmUgYm91bmQuIFRvZ2V0aGVyIHdpdGggdGhlIGZvbGQgcnVsZQomIzQzO2Fib3ZlIHRoaXMga2VlcHMgdGhlIHZlcmRpY3QgYmluYXJ5OiBhIHNpZ25lZCBwcm9ncmFtIGNhbm5vdCB1c2UgYSBtYXAgaXRzCiYjNDM7c2lnbmF0dXJlIGRvZXMgbm90IGNvdmVyLCBhbmQgYSBkaWZmZXJlbnQgYnV0IGVxdWFsbHkgZGlnZXN0LWJvdW5kIG1hcCBjYW5ub3QgYmUKJiM0MztzdWJzdGl0dXRlZCBhdCBhbiBgYGZkX2FycmF5YGAgc2xvdC4gTm9uLWV4Y2x1c2l2ZSBtYXBzIGFyZSBuZXZlciBmb2xkZWQsIHNvIGEKJiM0MztzaWduZWQgcHJvZ3JhbSBjYW5ub3QgdXNlIG9uZSBhdCBhbGwuCiYjNDM7CiYjNDM7VGhlIHZlcmRpY3QKJiM0Mzs9PT09PT09PT09PQomIzQzOwomIzQzO0EgcHJvZ3JhbSBpcyBlaXRoZXIgdW5zaWduZWQgb3IgZnVsbHkgdmVyaWZpZWQgLSB0aGVyZSBpcyBubyBpbnRlcm1lZGlhdGUKJiM0MztzdGF0ZS4gVGhlIG91dGNvbWUgaXMgcmVjb3JkZWQgaW4gYGBwcm9nLSZndDthdXgtJmd0O3NpZy52ZXJkaWN0YGA6CiYjNDM7CiYjNDM7Li4gY29kZS1ibG9jazo6IGMKJiM0MzsKJiM0MzsgICAgZW51bSBicGZfc2lnX3ZlcmRpY3QgewomIzQzOyAgICAgICAgICAgIEJQRl9TSUdfVU5TSUdORUQgPSAwLAomIzQzOyAgICAgICAgICAgIEJQRl9TSUdfVkVSSUZJRUQsCiYjNDM7ICAgIH07CiYjNDM7CiYjNDM7YGBCUEZfU0lHX1ZFUklGSUVEYGAgbWVhbnMgdGhlIHNpZ25hdHVyZSBpcyB2YWxpZCBhbmQgY292ZXJzIHRoZSBpbnN0cnVjdGlvbnMKJiM0MzsqYW5kKiB0aGUgZnJvemVuIGNvbnRlbnRzIG9mIGV2ZXJ5IGV4Y2x1c2l2ZSBtYXAgdGhlIHByb2dyYW0gdXNlczoKJiM0MzsKJiM0MzstIEZvciBhbiBvcmRpbmFyeSwgZGlyZWN0bHktbG9hZGVkIHNpZ25lZCBwcm9ncmFtIHRoZSBpbnN0cnVjdGlvbnMgYXJlIHRoZSB3aG9sZQomIzQzOyAgYXJ0aWZhY3QgYW5kIGl0IHVzZXMgbm8gZXhjbHVzaXZlIG1hcHMsIHNvIGEgdmFsaWQgaW5zdHJ1Y3Rpb24gc2lnbmF0dXJlIGlzCiYjNDM7ICB0aGUgY29tcGxldGUgdmVyaWZpY2F0aW9uLgomIzQzOy0gRm9yIGEgc2lnbmVkIGxvYWRlciB0aGUgbWV0YWRhdGEgbWFwIGlzIGV4Y2x1c2l2ZSwgc28gaXRzIGNvbnRlbnRzIGFyZSBmb2xkZWQKJiM0MzsgIGluIGFuZCB0aGUgc2lnbmF0dXJlIGNvdmVycyBgYGluc25zIHx8IG1ldGFkYXRhYGAuCiYjNDM7CiYjNDM7VGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vICYjMzQ7aW5zdHJ1Y3Rpb25zIHZlcmlmaWVkIGJ1dCBtZXRhZGF0YSBub3QmIzM0OyB2ZXJkaWN0OiBhCiYjNDM7c2lnbmVkIGxvYWRlciB0aGF0IGZhaWxzIHRvIGNvdmVyIGl0cyBtZXRhZGF0YSBpcyAqcmVqZWN0ZWQqIChzZWUgYWJvdmUpLCBub3QKJiM0MztyZWNvcmRlZCB3aXRoIGEgd2Vha2VyIHZlcmRpY3QuIGBgQlBGX1NJR19WRVJJRklFRGBgIHRoZXJlZm9yZSBhbHdheXMgbWVhbnMgdGhlCiYjNDM7cHJvZ3JhbSBhbmQgZXZlcnl0aGluZyB0aGUgc2lnbmF0dXJlIGlzIHJlc3BvbnNpYmxlIGZvciBhcmUgYXV0aGVudGljLCB3aGljaCBpcwomIzQzO3doYXQgYSBwb2xpY3kgY2FuIHJlbHkgb24uCiYjNDM7CiYjNDM7QWxvbmdzaWRlIHRoZSB2ZXJkaWN0IHRoZSBrZXJuZWwgcmVjb3JkcyB3aGljaCBrZXlyaW5nIHZhbGlkYXRlZCB0aGUgc2lnbmF0dXJlOwomIzQzO3NlZSBgS2V5cmluZ3NgXy4KJiM0MzsKJiM0MztFbmZvcmNlbWVudCB2aWEgTFNNcwomIzQzOz09PT09PT09PT09PT09PT09PT09CiYjNDM7CiYjNDM7U2lnbmluZyBvbmx5ICpyZWNvcmRzKiBhIHZlcmRpY3Q7IGFuIExTTSB0dXJucyBpdCBpbnRvIHBvbGljeS4gVGhlIHZlcmRpY3QgYW5kCiYjNDM7a2V5cmluZyBmaWVsZHMgbGl2ZSBpbiBgYHN0cnVjdCBicGZfcHJvZ19hdXhgYCwgc28gYSBCUEYgTFNNIHByb2dyYW0gY2FuIHJlYWQKJiM0Mzt0aGVtIGRpcmVjdGx5IChzZWUgRG9jdW1lbnRhdGlvbi9icGYvcHJvZ19sc20ucnN0IGZvciB3cml0aW5nIGFuZCBhdHRhY2hpbmcgQlBGCiYjNDM7TFNNIHByb2dyYW1zKTsgdGhlIHNhbWUgZmllbGRzIGFyZSBlcXVhbGx5IGF2YWlsYWJsZSB0byBpbi10cmVlIExTTXMuIFR3byBob29rcwomIzQzO2FyZSB1c2VmdWwgYXQgZGlmZmVyZW50IHBvaW50cyBvZiB0aGUgbG9hZDogdGhlIGRlZGljYXRlZAomIzQzO2Bgc2VjdXJpdHlfYnBmX3Byb2dfbG9hZCgpYGAgZ2F0ZXMgYWRtaXNzaW9uIGJlZm9yZSB0aGUgbWFpbiB2ZXJpZmljYXRpb24gd29yaywKJiM0MzthbmQgdGhlIGV4aXN0aW5nIGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgIG9ic2VydmVzIGEgcHJvZ3JhbSB0aGF0IGhhcyBmdWxseQomIzQzO2xvYWRlZC4KJiM0MzsKJiM0MztBZG1pc3Npb246IGBgc2VjdXJpdHlfYnBmX3Byb2dfbG9hZCgpYGAKJiM0MzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJiM0MzsKJiM0MztUaGlzIGhvb2sgZ2F0ZXMgYWRtaXNzaW9uICoqZm9yIGV2ZXJ5IGxvYWQqKiwgZnJvbSBhIHNpbmdsZSBjYWxsIHNpdGUgaW5zaWRlIHRoZQomIzQzO3ZlcmlmaWVyIChgYGJwZl9jaGVjaygpYGApLCBiZWZvcmUgdGhlIG1haW4gdmVyaWZpY2F0aW9uIHdvcmsuIEl0IHJ1bnMgYWZ0ZXIgdGhlCiYjNDM7b3B0aW9uYWwgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiwgc28gdGhlIHZlcmRpY3QgYW5kIGtleXJpbmcgZmllbGRzIGFyZSBmaW5hbCAtIHRoZQomIzQzO2hvb2sgY2FuIHNlZSB3aGV0aGVyLCBhbmQgaG93IHN0cm9uZ2x5LCB0aGUgcHJvZ3JhbSB3YXMgc2lnbmVkLCB3aGljaCBrZXlyaW5nCiYjNDM7dmFsaWRhdGVkIGl0LCB0aGUgbG9hZCBgYGF0dHJgYCwgdGhlIEJQRiB0b2tlbiBhbmQgd2hldGhlciB0aGUgbG9hZCBjYW1lIGZyb20gdGhlCiYjNDM7a2VybmVsLiBGb3IgYSBzaWduZWQgbG9hZCB0aGUgdmVyZGljdCBpcyBgYEJQRl9TSUdfVkVSSUZJRURgYCBoZXJlICh0aGUgc2lnbmF0dXJlCiYjNDM7aGFzIGp1c3QgYmVlbiBjaGVja2VkKTsgZm9yIGFuIHVuc2lnbmVkIGxvYWQgaXQgaXMgYGBCUEZfU0lHX1VOU0lHTkVEYGAuCiYjNDM7CiYjNDM7VGhpcyBpcyB0aGUgcGxhY2UgZm9yICpjb2Fyc2UgYWRtaXNzaW9uKiB0aGF0IG11c3QgYWxzbyBzZWUgdW5zaWduZWQgYW5kCiYjNDM7bm90LXlldC12ZXJpZmllZCBsb2FkczogcmVxdWlyZSBhIHNpZ25hdHVyZSBhdCBhbGwsIHJlc3RyaWN0IHRoZSBhY2NlcHRhYmxlCiYjNDM7a2V5cmluZywgcmVzdHJpY3Qgd2hpY2ggdG9rZW4vY3JlZGVudGlhbHMgbWF5IGxvYWQgQlBGLCBhcHBseSBwZXItcHJvZ3JhbS10eXBlCiYjNDM7cnVsZXMsIG9yIGF1ZGl0IGV2ZXJ5IGxvYWQgYXR0ZW1wdCB0aGF0IG1ha2VzIGl0IHBhc3Qgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiAtCiYjNDM7YXR0ZW1wdHMgZmFpbGluZyB0aGUgc2lnbmF0dXJlIG9yIHRoZSBtZXRhZGF0YSBiaW5kaW5nIGFib3J0IGJlZm9yZSB0aGlzIGhvb2sKJiM0MztmaXJlcy4gSXQgaXMgdGhlIHByaW1hcnkgZGVueSBwb2ludC4KJiM0MzsKJiM0MztPbmUgc3VidGxldHk6IHRoaXMgaG9vayBydW5zICpiZWZvcmUqIHRoZSB2ZXJpZmllciBmaW5pc2hlcyBpdHMgd29yaywgc28KJiM0MztgYEJQRl9TSUdfVkVSSUZJRURgYCAqaGVyZSogbWVhbnMgb25seSAmIzM0O3ZhbGlkbHkgc2lnbmVkJiMzNDsgLSBub3QgJiMzNDtsb2FkZWQmIzM0Oy4gQWxsb3dpbmcKJiM0MzthIGxvYWQgYXQgdGhpcyBwb2ludCBsZXRzIGl0ICpwcm9jZWVkKjsgaXQgZG9lcyBub3QgZ3VhcmFudGVlIHRoZSBwcm9ncmFtIHdpbGwKJiM0Mztsb2FkLiBBIHZhbGlkbHkgc2lnbmVkIHByb2dyYW0gY2FuIHN0aWxsIGJlIHJlamVjdGVkIGFmdGVyd2FyZHMgb24gdHdvCiYjNDM7aW5kZXBlbmRlbnQgZ3JvdW5kczogdGhlIHZlcmlmaWVyIG1heSByZWplY3QgaXQgbGlrZSBhbnkgb3RoZXIgcHJvZ3JhbSAodW5zYWZlCiYjNDM7bWVtb3J5IGFjY2VzcywgYmFkIGNvbnRyb2wgZmxvdywgcmVzb3VyY2UgbGltaXRzLCAuLi4pLCBhbmQgdGhlIGtlcm5lbCBzZXBhcmF0ZWx5CiYjNDM7cmVmdXNlcyAtIGFzIHRoZSB2ZXJpZmllciByZXNvbHZlcyBpbnN0cnVjdGlvbnMgYW5kIGJpbmRzIGVhY2ggb2JqZWN0IC0gYW55IG1hcAomIzQzO3RoZSBzaWduYXR1cmUgZG9lcyBub3QgY292ZXIgb3IgYW55IEJURiBhdCBhbGwsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGlzIGhvb2sKJiM0MztyZXR1cm5lZC4gT25seSBhZnRlciB0aGUgcHJvZ3JhbSBoYXMgZnVsbHkgbG9hZGVkLCBhdCB0aGUgbmV4dCBob29rCiYjNDM7KGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgKSwgZG9lcyBgYEJQRl9TSUdfVkVSSUZJRURgYCBjYXJyeSBpdHMgZnVsbCBtZWFuaW5nOgomIzQzO3ZhbGlkbHkgc2lnbmVkICphbmQqIGZ1bGx5IHZlcmlmaWVkLgomIzQzOwomIzQzO0EgbW9yZSByZWFsaXN0aWMgYWRtaXNzaW9uIHBvbGljeSB0aGFuICYjMzQ7aXMgaXQgc2lnbmVkIGF0IGFsbCYjMzQ7OiBhY2NlcHQgcHJvZ3JhbXMKJiM0MztzaWduZWQgYnkgYSBzeXN0ZW0ga2V5cmluZywgYWNjZXB0IGEgdXNlci1rZXlyaW5nIHNpZ25hdHVyZSBvbmx5IGlmIHRoZQomIzQzO2tleS9rZXlyaW5nIGl0IHdhcyB2ZXJpZmllZCBhZ2FpbnN0IGlzIG9uIGFuIGV4cGxpY2l0IGFsbG93bGlzdCwgYW5kIGVtaXQgYQomIzQzO3RhbXBlci1ldmlkZW50IHJlY29yZCBvZiBldmVyeSBkZWNpc2lvbiBzbyB0aGF0IGV2ZW4gZGVuaWVkIGF0dGVtcHRzIGFyZQomIzQzO2F1ZGl0YWJsZS4gKElsbHVzdHJhdGl2ZSAtIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pCiYjNDM7CiYjNDM7Li4gY29kZS1ibG9jazo6IGMKJiM0MzsKJiM0MzsgICAgLyogU2VyaWFscyBvZiB1c2VyIGtleXMva2V5cmluZ3Mgd2UgYWRkaXRpb25hbGx5IHRydXN0LiAqLwomIzQzOyAgICBzdHJ1Y3QgewomIzQzOyAgICAgICAgICAgIF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7CiYjNDM7ICAgICAgICAgICAgX190eXBlKGtleSwgX19zMzIpOyAgICAgICAgICAgICAvKiBrZXlyaW5nX3NlcmlhbCAqLwomIzQzOyAgICAgICAgICAgIF9fdHlwZSh2YWx1ZSwgX191OCk7CiYjNDM7ICAgICAgICAgICAgX191aW50KG1heF9lbnRyaWVzLCA2NCk7CiYjNDM7ICAgIH0gdHJ1c3RlZF91c2VyX2tleXMgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7CiYjNDM7ICAgIC8qIEF1ZGl0IHN0cmVhbSBjb25zdW1lZCBieSBhIHVzZXJzcGFjZSBsb2dnZXIuICovCiYjNDM7ICAgIHN0cnVjdCB7CiYjNDM7ICAgICAgICAgICAgX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9SSU5HQlVGKTsKJiM0MzsgICAgICAgICAgICBfX3VpbnQobWF4X2VudHJpZXMsIDEgJmx0OyZsdDsgMTYpOwomIzQzOyAgICB9IGF1ZGl0IFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzOyAgICBzdHJ1Y3QgZGVjaXNpb24geyBfX3UzMiBwcm9nX3R5cGUsIHZlcmRpY3QsIGt0eXBlOyBfX3MzMiBzZXJpYWwsIHJldDsgfTsKJiM0MzsKJiM0MzsgICAgU0VDKCYjMzQ7bHNtL2JwZl9wcm9nX2xvYWQmIzM0OykKJiM0MzsgICAgaW50IEJQRl9QUk9HKGFkbWl0LCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyLAomIzQzOyAgICAgICAgICAgICAgICAgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sIGJvb2wga2VybmVsKQomIzQzOyAgICB7CiYjNDM7ICAgICAgICAgICAgX191MzIgdmVyZGljdCA9IHByb2ctJmd0O2F1eC0mZ3Q7c2lnLnZlcmRpY3Q7CiYjNDM7ICAgICAgICAgICAgX191MzIga3R5cGUgICA9IHByb2ctJmd0O2F1eC0mZ3Q7c2lnLmtleXJpbmdfdHlwZTsKJiM0MzsgICAgICAgICAgICBfX3MzMiBzZXJpYWwgID0gcHJvZy0mZ3Q7YXV4LSZndDtzaWcua2V5cmluZ19zZXJpYWw7CiYjNDM7ICAgICAgICAgICAgc3RydWN0IGRlY2lzaW9uICpkOwomIzQzOyAgICAgICAgICAgIGludCByZXQgPSAwOwomIzQzOwomIzQzOyAgICAgICAgICAgIGlmIChrZXJuZWwpCiYjNDM7ICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHRydXN0IGluLWtlcm5lbCBsb2FkcyAqLwomIzQzOwomIzQzOyAgICAgICAgICAgIGlmICh2ZXJkaWN0ICE9IEJQRl9TSUdfVkVSSUZJRUQpCiYjNDM7ICAgICAgICAgICAgICAgICAgICByZXQgPSAtRVBFUk07ICAgICAgICAgICAgICAgICAgIC8qIG11c3QgYmUgdmFsaWRseSBzaWduZWQgKi8KJiM0MzsgICAgICAgICAgICBlbHNlIGlmIChrdHlwZSA9PSBCUEZfU0lHX0tFWVJJTkdfVVNFUiAmYW1wOyZhbXA7CiYjNDM7ICAgICAgICAgICAgICAgICAgICAgIWJwZl9tYXBfbG9va3VwX2VsZW0oJmFtcDt0cnVzdGVkX3VzZXJfa2V5cywgJmFtcDtzZXJpYWwpKQomIzQzOyAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAvKiBrZXkva2V5cmluZyBub3QgYWxsb3dsaXN0ZWQgKi8KJiM0MzsKJiM0MzsgICAgICAgICAgICBkID0gYnBmX3JpbmdidWZfcmVzZXJ2ZSgmYW1wO2F1ZGl0LCBzaXplb2YoKmQpLCAwKTsKJiM0MzsgICAgICAgICAgICBpZiAoZCkgewomIzQzOyAgICAgICAgICAgICAgICAgICAgZC0mZ3Q7cHJvZ190eXBlID0gYXR0ci0mZ3Q7cHJvZ190eXBlOwomIzQzOyAgICAgICAgICAgICAgICAgICAgZC0mZ3Q7dmVyZGljdCA9IHZlcmRpY3Q7CiYjNDM7ICAgICAgICAgICAgICAgICAgICBkLSZndDtrdHlwZSA9IGt0eXBlOwomIzQzOyAgICAgICAgICAgICAgICAgICAgZC0mZ3Q7c2VyaWFsID0gc2VyaWFsOwomIzQzOyAgICAgICAgICAgICAgICAgICAgZC0mZ3Q7cmV0ID0gcmV0OwomIzQzOyAgICAgICAgICAgICAgICAgICAgYnBmX3JpbmdidWZfc3VibWl0KGQsIDApOyAgICAgICAvKiByZWNvcmQgYWxsb3cgKmFuZCogZGVueSAqLwomIzQzOyAgICAgICAgICAgIH0KJiM0MzsgICAgICAgICAgICByZXR1cm4gcmV0OwomIzQzOyAgICB9CiYjNDM7CiYjNDM7T2JzZXJ2aW5nIGEgdmVyaWZpZWQgbG9hZDogYGBzZWN1cml0eV9icGZfcHJvZygpYGAKJiM0MzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQomIzQzOwomIzQzO1RoZXJlIGlzIGRlbGliZXJhdGVseSBubyBzZXBhcmF0ZSAmIzM0O21ldGFkYXRhIGF0dGVzdGVkJiMzNDsgaG9vay4gVGhlIGNvdmVyYWdlIGNoZWNrCiYjNDM7YWJvdmUgaXMgZW5mb3JjZWQgYnkgdGhlIGtlcm5lbCB1bmNvbmRpdGlvbmFsbHksIHNvIGEgc2lnbmVkIGxvYWRlciB0aGF0IGZhaWxzCiYjNDM7dG8gY292ZXIgaXRzIG1ldGFkYXRhIG5ldmVyIGxvYWRzIGFuZCBhbiBMU00gbmV2ZXIgaGFzIHRvIHJlLWVzdGFibGlzaCB0aGF0CiYjNDM7ZmFjdC4gVG8gKmFjdCBvbiogYSBwcm9ncmFtIHRoYXQgaGFzIHN1Y2Nlc3NmdWxseSBhbmQgZnVsbHkgbG9hZGVkLCB1c2UgdGhlCiYjNDM7ZXhpc3RpbmcgYGBzZWN1cml0eV9icGZfcHJvZygpYGAgaG9vayAoYGBsc20vYnBmX3Byb2dgYCksIHdoaWNoIGZpcmVzIGZyb20KJiM0MztgYGJwZl9wcm9nX25ld19mZCgpYGAgLSBhZnRlciB0aGUgdmVyaWZpZXIsIGFmdGVyIHRoZSBjb3ZlcmFnZSBjaGVjaywgYW5kIGFmdGVyCiYjNDM7YGBicGZfcHJvZ19hbGxvY19pZCgpYGAuIFJlbGF0aXZlIHRvIHRoZSBhZG1pc3Npb24gaG9vayB0aGlzIHBvaW50IGlzIHN0cmljdGx5CiYjNDM7bGF0ZXIgYW5kIHN0cm9uZ2VyOgomIzQzOwomIzQzOy0gdGhlIHByb2dyYW0gaGFzIGFuIGlkIChgYHByb2ctJmd0O2F1eC0mZ3Q7aWRgYCksIHNvIGl0IGNhbiBiZSByZWNvcmRlZCBvciBjb3JyZWxhdGVkCiYjNDM7ICB3aXRoIGxhdGVyIGV2ZW50czsKJiM0MzstIGBgdmVyZGljdCA9PSBCUEZfU0lHX1ZFUklGSUVEYGAgKmhlcmUqIG1lYW5zICoqZnVsbHkqKiB2ZXJpZmllZCAtIGEgcHJvZ3JhbQomIzQzOyAgdGhhdCB1c2VkIGEgbWFwIHRoZSBzaWduYXR1cmUgZG9lcyBub3QgY292ZXIgd2FzIGFscmVhZHkgcmVqZWN0ZWQsIHNvIGl0IGNhbm5vdAomIzQzOyAgcmVhY2ggdGhpcyBwb2ludDsKJiM0MzstIGl0IG9ic2VydmVzIG9ubHkgcHJvZ3JhbXMgdGhhdCBhY3R1YWxseSBsb2FkZWQ7IGEgZmFpbGVkIGxvYWQgbmV2ZXIgbWludHMgYW4KJiM0MzsgIGZkLCBzbyBpdCBuZXZlciByZWFjaGVzIHRoaXMgaG9vay4KJiM0MzsKJiM0MztJdCB0YWtlcyBvbmx5IHRoZSBgYHByb2dgYCBhbmQgYSBub24temVybyByZXR1cm4gc3RpbGwgYWJvcnRzICh0aGUgZmQgaXMgbm90CiYjNDM7aGFuZGVkIG91dCksIHNvIGl0IGNhbiB2ZXRvIGFzIHdlbGwgYXMgb2JzZXJ2ZS4gT25lIHdyaW5rbGU6IGl0IGFsc28gZmlyZXMgb24KJiM0MztvdGhlciBwYXRocyB0aGF0IG1pbnQgYSBuZXcgcHJvZ3JhbSBmZCAtIG5vdGFibHkgYGBicGZfcHJvZ19nZXRfZmRfYnlfaWQoKWBgIC0KJiM0Mztub3QganVzdCBvbiBhIGZyZXNoIGxvYWQuIEJlY2F1c2UgdGhlIHByb2dyYW0gYWxyZWFkeSBoYXMgaXRzIGlkIGhlcmUsIGFuIExTTQomIzQzO2NhbiB0ZWxsIHRoZSB0d28gYXBhcnQgd2l0aCBhIHNtYWxsIGhhc2ggbWFwOiB0aGUgKmZpcnN0KiB0aW1lIGFuIGlkIGlzIHNlZW4gaXMKJiM0Mzt0aGUgbG9hZDsgYSBsYXRlciBzaWdodGluZyBvZiB0aGUgc2FtZSBpZCBpcyBqdXN0IGFub3RoZXIgZmQgdG8gYSBwcm9ncmFtIHRoYXQKJiM0MzthbHJlYWR5IGV4aXN0cy4KJiM0MzsKJiM0MztUbyBib3VuZCB0aGUgbWFwIGFuZCBsZXQgYSByZXVzZWQgaWQgcmVhZCBhcyBhIGZyZXNoIGxvYWQsIHRoaXMgY2FuIGJlIHBhaXJlZAomIzQzO3dpdGggYGBzZWN1cml0eV9icGZfcHJvZ19mcmVlKClgYCAoYGBsc20vYnBmX3Byb2dfZnJlZWBgKSwgd2hpY2ggZGVsZXRlcyB0aGUKJiM0MztlbnRyeSBvbiB0ZWFyZG93biAtIGtleWVkIGJ5IHRoZSBzYW1lIGBgcHJvZ2BgIHBvaW50ZXIsIHNpbmNlCiYjNDM7YGBicGZfcHJvZ19mcmVlX2lkKClgYCBoYXMgYWxyZWFkeSBjbGVhcmVkIGBgcHJvZy0mZ3Q7YXV4LSZndDtpZGBgIHRvIGBgMGBgIGJ5IHRoZSB0aW1lCiYjNDM7dGhhdCBob29rIHJ1bnMuIChJbGx1c3RyYXRpdmUgLSBwcml2aWxlZ2VkIExTTSwgZXJyb3IgY2hlY2tpbmcgZWxpZGVkLikKJiM0MzsKJiM0MzsuLiBjb2RlLWJsb2NrOjogYwomIzQzOwomIzQzOyAgICBzdHJ1Y3QgcmVjIHsgX191MzIgaWQsIGt0eXBlOyBfX3MzMiBzZXJpYWw7IH07CiYjNDM7CiYjNDM7ICAgIHN0cnVjdCB7CiYjNDM7ICAgICAgICAgICAgX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTsKJiM0MzsgICAgICAgICAgICBfX3R5cGUoa2V5LCBfX3U2NCk7ICAgICAgICAgICAgIC8qIHN0cnVjdCBicGZfcHJvZyAqIC0tIHN0YWJsZSBpZCAqLwomIzQzOyAgICAgICAgICAgIF9fdHlwZSh2YWx1ZSwgc3RydWN0IHJlYyk7CiYjNDM7ICAgICAgICAgICAgX191aW50KG1heF9lbnRyaWVzLCA0MDk2KTsKJiM0MzsgICAgfSBsaXZlIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzOyAgICBTRUMoJiMzNDtsc20vYnBmX3Byb2cmIzM0OykgICAgICAgICAgICAvKiBmaXJlcyBhZnRlciBsb2FkIGFuZCBvbiBldmVyeSBsYXRlciBmZCAqLwomIzQzOyAgICBpbnQgQlBGX1BST0cob2JzZXJ2ZSwgc3RydWN0IGJwZl9wcm9nICpwcm9nKQomIzQzOyAgICB7CiYjNDM7ICAgICAgICAgICAgX191NjQga2V5ID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKXByb2c7CiYjNDM7ICAgICAgICAgICAgc3RydWN0IHJlYyByOwomIzQzOwomIzQzOyAgICAgICAgICAgIGlmIChwcm9nLSZndDthdXgtJmd0O3NpZy52ZXJkaWN0ICE9IEJQRl9TSUdfVkVSSUZJRUQpCiYjNDM7ICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKJiM0MzsgICAgICAgICAgICBpZiAoYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO2xpdmUsICZhbXA7a2V5KSkKJiM0MzsgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgIC8qIHNlZW4gYmVmb3JlOiBhIGxhdGVyIGZkLCBub3QgYSBsb2FkICovCiYjNDM7CiYjNDM7ICAgICAgICAgICAgLyogRmlyc3Qgc2lnaHRpbmcgPT0gdGhpcyBwcm9ncmFtIGp1c3QgbG9hZGVkOyBpZCBpcyB2YWxpZCBoZXJlLiAqLwomIzQzOyAgICAgICAgICAgIHIuaWQgICAgID0gcHJvZy0mZ3Q7YXV4LSZndDtpZDsKJiM0MzsgICAgICAgICAgICByLmt0eXBlICA9IHByb2ctJmd0O2F1eC0mZ3Q7c2lnLmtleXJpbmdfdHlwZTsKJiM0MzsgICAgICAgICAgICByLnNlcmlhbCA9IHByb2ctJmd0O2F1eC0mZ3Q7c2lnLmtleXJpbmdfc2VyaWFsOwomIzQzOyAgICAgICAgICAgIGJwZl9tYXBfdXBkYXRlX2VsZW0oJmFtcDtsaXZlLCAmYW1wO2tleSwgJmFtcDtyLCBCUEZfTk9FWElTVCk7CiYjNDM7ICAgICAgICAgICAgLyogLi4uIG5ld2x5LWxvYWRlZCB2ZXJpZmllZC1wcm9ncmFtIGFjdGlvbiwgZS5nLiByZWNvcmQgci5pZCAuLi4gKi8KJiM0MzsgICAgICAgICAgICByZXR1cm4gMDsKJiM0MzsgICAgfQomIzQzOwomIzQzO1B1dHRpbmcgdGhlbSB0b2dldGhlcjogdG8gKnJlcXVpcmUqIHZlcmlmaWVkIEJQRiwgZGVueSBhdCB0aGUgYWRtaXNzaW9uIGhvb2sKJiM0Mzt1bmxlc3MgdGhlIHZlcmRpY3QgaXMgYGBCUEZfU0lHX1ZFUklGSUVEYGAgKGFuZCwgaWYgZGVzaXJlZCwgcmVzdHJpY3QgdGhlCiYjNDM7a2V5cmluZykuIFRoZSBrZXJuZWwgdGhlbiBndWFyYW50ZWVzIHRoYXQgYW55IHByb2dyYW0gd2hpY2ggYWN0dWFsbHkgbG9hZHMgd2l0aAomIzQzO3RoYXQgdmVyZGljdCBjb3ZlcmVkIGFsbCBvZiBpdHMgZXhjbHVzaXZlIG1hcHMsIHJlamVjdGluZyBhbnkgdGhhdCBkaWQgbm90IC0gc28KJiM0MzthIGRlbnktYnktZGVmYXVsdCBhZG1pc3Npb24gcG9saWN5IG5lZWRzIG5vIHNlY29uZCBlbmZvcmNlbWVudCBwb2ludC4gVXNlCiYjNDM7YGBzZWN1cml0eV9icGZfcHJvZygpYGAgdG8gcmVjb3JkIG9yIGZpbmFsbHkgZ2F0ZSB0aGUgdmVyaWZpZWQgcHJvZ3JhbXMgb25jZQomIzQzO3RoZXkgY2FycnkgYW4gaWQuIFRoZSBgYHZlcmRpY3RgYCwgYGBrZXlyaW5nX3R5cGVgYCBhbmQgYGBrZXlyaW5nX3NlcmlhbGBgIGZpZWxkcwomIzQzO2xldCBhIHBvbGljeSBkaXN0aW5ndWlzaCwgZm9yIGV4YW1wbGUsICYjMzQ7dmVyaWZpZWQgYW5kIHNpZ25lZCBieSBhIGJ1aWx0aW4ga2V5JiMzNDsKJiM0Mztmcm9tICYjMzQ7dmVyaWZpZWQgYnkgYSB1c2VyIGtleSYjMzQ7LiBBIHBvbGljeSBMU00gc3VjaCBhcyBJUEUgY291bGQgY29uc3VtZSB0aGUgc2FtZQomIzQzO2hvb2tzIHRvIGVuZm9yY2Ugc3lzdGVtIHBvbGljeSB3aXRob3V0IHdyaXRpbmcgYW55IEJQRiwgdGhvdWdoIG5vbmUgaW1wbGVtZW50cwomIzQzO3RoaXMgdG9kYXkuCiYjNDM7CiYjNDM7S2V5cmluZ3MKJiM0Mzs9PT09PT09PQomIzQzOwomIzQzO2Bga2V5cmluZ19pZGBgIHNlbGVjdHMgdGhlIHRydXN0ZWQga2V5cmluZyB0aGUgUEtDUyM3IHNpZ25hdHVyZSBpcyB2ZXJpZmllZAomIzQzO2FnYWluc3QuIFRoZSB3ZWxsLWtub3duIGlkcyBgYDBgYCAoYnVpbHRpbiksIGBgVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklOR2BgCiYjNDM7YW5kIGBgVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HYGAgc2VsZWN0IHRoZSBjb3JyZXNwb25kaW5nIHN5c3RlbSBrZXlyaW5nczsKJiM0Mzthbnkgb3RoZXIgdmFsdWUgaXMgdHJlYXRlZCBhcyB0aGUgc2VyaWFsIG9mIGEgdXNlci9zZXNzaW9uIGtleSBvciBrZXlyaW5nLgomIzQzO1RoZSBrZXlyaW5nIGlzIGxvb2tlZCB1cCBmaXJzdCwgYmVmb3JlIHRoZSBzaWduYXR1cmUgYnl0ZXMgYXJlIGV4YW1pbmVkLCBzbyBhCiYjNDM7c2lnbmF0dXJlIG5hbWluZyBhIG5vbi1leGlzdGVudCBrZXlyaW5nIGlzIHJlamVjdGVkIHVwIGZyb250LCBhbmQgYSBmYWlsZWQKJiM0Mzt2ZXJpZmljYXRpb24gYWJvcnRzIHRoZSBsb2FkIC0gc28gYSBwcm9ncmFtIHRoYXQgbG9hZHMgc3VjY2Vzc2Z1bGx5IHdpdGggYQomIzQzO3NpZ25hdHVyZSBhbHdheXMgaGFzIGNvbnNpc3RlbnQga2V5cmluZyBmaWVsZHMgcmVjb3JkZWQuCiYjNDM7CiYjNDM7VHdvIGZpZWxkcyBhcmUgcmVjb3JkZWQgaW4gYGBwcm9nLSZndDthdXgtJmd0O3NpZ2BgIGZvciBhbiBMU00gdG8gaW5zcGVjdDoKJiM0MzsKJiM0MztgYGtleXJpbmdfdHlwZWBgIChgYGVudW0gYnBmX3NpZ19rZXlyaW5nYGApCiYjNDM7ICAgIENsYXNzaWZpZWQgcHVyZWx5IGZyb20gYGBrZXlyaW5nX2lkYGAgd2hlbmV2ZXIgdGhlIHByb2dyYW0gaXMgc2lnbmVkOgomIzQzOyAgICBgYEJQRl9TSUdfS0VZUklOR19CVUlMVElOYGAsIGBgX1NFQ09OREFSWWBgLCBgYF9QTEFURk9STWBgIGZvciB0aGUgc3lzdGVtCiYjNDM7ICAgIGtleXJpbmdzLCBvciBgYF9VU0VSYGAgZm9yIGEgdXNlci9zZXNzaW9uIGtleXJpbmcuIEl0IGlzCiYjNDM7ICAgIGBgQlBGX1NJR19LRVlSSU5HX05PTkVgYCBmb3IgYW4gdW5zaWduZWQgcHJvZ3JhbS4KJiM0MzsKJiM0MztgYGtleXJpbmdfc2VyaWFsYGAgKGBgczMyYGApCiYjNDM7ICAgIFNldCAqKm9ubHkqKiBvbiBhIHN1Y2Nlc3NmdWwgdmVyaWZpY2F0aW9uLCB0byB0aGUgc2VyaWFsIG9mIHRoZQomIzQzOyAgICAqKnVzZXIvc2Vzc2lvbiBrZXkgb3Iga2V5cmluZyoqIHRoYXQgYGBrZXlyaW5nX2lkYGAgcmVzb2x2ZWQgdG8gLSB0aGUKJiM0MzsgICAgb2JqZWN0IHRoZSBzaWduYXR1cmUgd2FzIHZlcmlmaWVkIGFnYWluc3QsIG5vdCB0aGUgaW5kaXZpZHVhbCBhc3ltbWV0cmljCiYjNDM7ICAgIGtleSBpbnNpZGUgaXQgdGhhdCBtYXRjaGVkIHRoZSBzaWduZXIuIFBhc3NpbmcKJiM0MzsgICAgYGBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkdgYCwgZm9yIGV4YW1wbGUsIHJlY29yZHMgdGhlIHNlc3Npb24ga2V5cmluZyYjMzk7cwomIzQzOyAgICBzZXJpYWwuIFRoZSBzeXN0ZW0ga2V5cmluZ3MgYXJlIHRydXN0ZWQgYXMgYSB3aG9sZSBhbmQgZXhwb3NlIG5vIHNlcmlhbAomIzQzOyAgICBoZXJlLCBzbyB0aGUgc2VyaWFsIGlzIGBgMGBgIGZvciBidWlsdGluLCBzZWNvbmRhcnkgYW5kIHBsYXRmb3JtCiYjNDM7ICAgIHNpZ25hdHVyZXMsIGFuZCBgYDBgYCBmb3IgdW5zaWduZWQgcHJvZ3JhbXMuIEluIG90aGVyIHdvcmRzLCBhIG5vbi16ZXJvCiYjNDM7ICAgIGBga2V5cmluZ19zZXJpYWxgYCBpcyBleGFjdGx5ICYjMzQ7dmVyaWZpZWQgYWdhaW5zdCB0aGUgdXNlciBrZXkva2V5cmluZyB3aXRoCiYjNDM7ICAgIHRoaXMgc2VyaWFsJiMzNDsuCiYjNDM7CiYjNDM7Li4gbGlzdC10YWJsZTo6CiYjNDM7ICAgOmhlYWRlci1yb3dzOiAxCiYjNDM7CiYjNDM7ICAgKiAtIGBga2V5cmluZ19pZGBgCiYjNDM7ICAgICAtIGBga2V5cmluZ190eXBlYGAKJiM0MzsgICAgIC0gYGBrZXlyaW5nX3NlcmlhbGBgCiYjNDM7ICAgKiAtIChubyBzaWduYXR1cmUpCiYjNDM7ICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX05PTkVgYAomIzQzOyAgICAgLSBgYDBgYAomIzQzOyAgICogLSBgYDBgYAomIzQzOyAgICAgLSBgYEJQRl9TSUdfS0VZUklOR19CVUlMVElOYGAKJiM0MzsgICAgIC0gYGAwYGAKJiM0MzsgICAqIC0gYGBWRVJJRllfVVNFX1NFQ09OREFSWV9LRVlSSU5HYGAKJiM0MzsgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfU0VDT05EQVJZYGAKJiM0MzsgICAgIC0gYGAwYGAKJiM0MzsgICAqIC0gYGBWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkdgYAomIzQzOyAgICAgLSBgYEJQRl9TSUdfS0VZUklOR19QTEFURk9STWBgCiYjNDM7ICAgICAtIGBgMGBgCiYjNDM7ICAgKiAtIG90aGVyIChhIHVzZXIvc2Vzc2lvbiBrZXkgc2VyaWFsKQomIzQzOyAgICAgLSBgYEJQRl9TSUdfS0VZUklOR19VU0VSYGAKJiM0MzsgICAgIC0gc2VyaWFsIG9mIHRoZSByZXNvbHZlZCBrZXkva2V5cmluZwomIzQzOwomIzQzO1Byb2R1Y2luZyBhIHNpZ25lZCBvYmplY3QKJiM0Mzs9PT09PT09PT09PT09PT09PT09PT09PT09PQomIzQzOwomIzQzO2BgYnBmdG9vbGBgIGdlbmVyYXRlcyBhbmQgc2lnbnMgYSBsaWdodCBza2VsZXRvbiBpbiBvbmUgc3RlcDo6CiYjNDM7CiYjNDM7ICAgIGJwZnRvb2wgZ2VuIHNrZWxldG9uIC1MIC1TIC1rICZsdDtwcml2YXRlX2tleS5wZW0mZ3Q7IC1pICZsdDtjZXJ0aWZpY2F0ZS54NTA5Jmd0OyBcCiYjNDM7ICAgICAgICAgICAgb2JqLmJwZi5vICZndDsgb2JqLmxza2VsLmgKJiM0MzsKJiM0MztgYC1MYGAgc2VsZWN0cyB0aGUgbGlnaHQtc2tlbGV0b24gKGBgZ2VuX2xvYWRlcmBgKSBiYWNrZW5kIGFuZCBgYC1TYGAgZW5hYmxlcwomIzQzO3NpZ25pbmc7IGBgLWtgYCBhbmQgYGAtaWBgIHN1cHBseSB0aGUgc2lnbmluZyBrZXkgYW5kIGl0cyBYLjUwOSBjZXJ0aWZpY2F0ZS4KJiM0MztgYGJwZnRvb2xgYCBzaWducyBgYGluc25zIHx8IG1ldGFkYXRhYGAgLSB0aGUgZXhhY3QgYnl0ZXMgdGhlIGtlcm5lbAomIzQzO3JlY29uc3RydWN0cyAtIGFuZCBhbHNvIGNvbXB1dGVzIGBgZXhjbF9wcm9nX2hhc2hgYCBhcyB0aGUgZGlnZXN0IG9mIHRoZSBsb2FkZXIKJiM0MztpbnN0cnVjdGlvbnMgc28gdGhlIG1ldGFkYXRhIG1hcCBjYW4gYmUgYm91bmQgdG8gdGhlIGxvYWRlci4gVGhlIHNpZ25hdHVyZSBhbmQKJiM0MztoYXNoIGFyZSBlbWJlZGRlZCBpbiB0aGUgZ2VuZXJhdGVkIGhlYWRlcjsgdGhlIGNlcnRpZmljYXRlIGlzIHVzZWQgb25seSBmb3IKJiM0MztzaWduaW5nIGFuZCBpcyBub3QgaW5jbHVkZWQuIExvYWRpbmcgdGhlIHNrZWxldG9uIHBlcmZvcm1zIHRoZQomIzQzO2NyZWF0ZS9wb3B1bGF0ZS9mcmVlemUvbG9hZCBzZXF1ZW5jZSBkZXNjcmliZWQgYWJvdmUuCiYjNDM7CiYjNDM7QXQgcnVudGltZSB0aGUgdHJ1c3RlZCBwdWJsaWMga2V5IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgY2hvc2VuIGtleXJpbmcgKGZvcgomIzQzO2V4YW1wbGUgYWRkZWQgdG8gdGhlIHNlc3Npb24ga2V5cmluZywgb3IgYnVpbHQgaW50byB0aGUga2VybmVsJiMzOTtzIGJ1aWx0aW4gdHJ1c3RlZAomIzQzO2tleXJpbmcpIGZvciB2ZXJpZmljYXRpb24gdG8gc3VjY2VlZC4KJiM0MzsKJiM0MztVQVBJIHJlZmVyZW5jZQomIzQzOz09PT09PT09PT09PT09CiYjNDM7CiYjNDM7YGBCUEZfUFJPR19MT0FEYGAgKGBgdW5pb24gYnBmX2F0dHJgYCk6CiYjNDM7CiYjNDM7YGBzaWduYXR1cmVgYCwgYGBzaWduYXR1cmVfc2l6ZWBgCiYjNDM7ICAgIFBvaW50ZXIgdG8gYW5kIGxlbmd0aCBvZiB0aGUgUEtDUyM3IHNpZ25hdHVyZSBibG9iLgomIzQzOwomIzQzO2Bga2V5cmluZ19pZGBgCiYjNDM7ICAgIFRydXN0ZWQga2V5cmluZyBzZWxlY3RvciAoc2VlIGBLZXlyaW5nc2BfKS4KJiM0MzsKJiM0MztgYGZkX2FycmF5YGAsIGBgZmRfYXJyYXlfY250YGAKJiM0MzsgICAgQXJyYXkgb2YgbWFwIGZpbGUgZGVzY3JpcHRvcnMgYm91bmQgdG8gdGhlIHByb2dyYW0uIGBgZmRfYXJyYXlfY250YGAgbXVzdCBiZQomIzQzOyAgICBzZXQgZm9yIHRoZSBrZXJuZWwgdG8gc2NhbiB0aGUgYXJyYXkuIFdoZW4gYSBzaWduYXR1cmUgaXMgcHJlc2VudCwgZXZlcnkgbWFwCiYjNDM7ICAgIGluIHRoZSBhcnJheSBtdXN0IGJlIGV4Y2x1c2l2ZTsgaXRzIGZyb3plbiBjb250ZW50cyBhcmUgZm9sZGVkIGludG8gdGhlCiYjNDM7ICAgIHZlcmlmaWVkIGJ1ZmZlciwgYW5kIGEgbm9uLWV4Y2x1c2l2ZSBlbnRyeSBpcyByZWplY3RlZC4KJiM0MzsKJiM0MztgYEJQRl9NQVBfQ1JFQVRFYGAgKGBgdW5pb24gYnBmX2F0dHJgYCk6CiYjNDM7CiYjNDM7YGBleGNsX3Byb2dfaGFzaGBgLCBgYGV4Y2xfcHJvZ19oYXNoX3NpemVgYAomIzQzOyAgICBTSEEtMjU2IGRpZ2VzdCBvZiB0aGUgcHJvZ3JhbSBwZXJtaXR0ZWQgdG8gYWNjZXNzIHRoaXMgKGV4Y2x1c2l2ZSkgbWFwLiBUaGlzCiYjNDM7ICAgIGJpbmRzIHRoZSBtZXRhZGF0YSBtYXAgdG8gdGhlIGxvYWRlcjsgaXQgaXMgbm90IGEgaGFzaCBvZiB0aGUgbWFwICpjb250ZW50Ki4KJiM0MzsgICAgVGhlIG1hcCBjb250ZW50IGlzIG5vdCBoYXNoZWQgc2VwYXJhdGVseSBhdCBhbGwgLSBpdCBpcyBjb3ZlcmVkLCBhcyBieXRlcywKJiM0MzsgICAgYnkgdGhlIHByb2dyYW0gc2lnbmF0dXJlLgomIzQzOwomIzQzO05vdGVzIGFuZCBsaW1pdGF0aW9ucwomIzQzOz09PT09PT09PT09PT09PT09PT09PT0KJiM0MzsKJiM0MzstIFRoZSBpbnN0cnVjdGlvbnMgcGx1cyBmb2xkZWQgbWV0YWRhdGEgYXJlIHZlcmlmaWVkIGFzIG9uZSBgYGJwZl9keW5wdHJgYCwKJiM0MzsgIHdoaWNoIGJvdW5kcyB0aGUgY29tYmluZWQgc2l6ZSAoY3VycmVudGx5IH4xNiBNaUIpOyB2ZXJ5IGxhcmdlIG9iamVjdHMgY2FuCiYjNDM7ICBleGNlZWQgaXQuCiYjNDM7LSBUaGUgbWV0YWRhdGEgY29udGFpbmVyIGlzIGEgc2luZ2xlLWVsZW1lbnQgYXJyYXkgbWFwLCBhY2Nlc3NlZCB0aHJvdWdoCiYjNDM7ICBgYG1hcF9kaXJlY3RfdmFsdWVfYWRkcmBgLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGYuaCBiL2luY2x1ZGUvbGludXgvYnBmLmgKaW5kZXggYmEwOTc5NWUwYmZkYjcuLjJlMGYxMmZiNGNlYThiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JwZi5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYnBmLmgKQEAgLTI5OSw3ICYjNDM7Mjk5LDYgQEAgc3RydWN0IGJwZl9tYXBfb3duZXIgewogCiBzdHJ1Y3QgYnBmX21hcCB7CiAJdTggc2hhW1NIQTI1Nl9ESUdFU1RfU0laRV07Ci0JdTMyIGV4Y2w7CiAJY29uc3Qgc3RydWN0IGJwZl9tYXBfb3BzICpvcHM7CiAJc3RydWN0IGJwZl9tYXAgKmlubmVyX21hcF9tZXRhOwogI2lmZGVmIENPTkZJR19TRUNVUklUWQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGZfdmVyaWZpZXIuaCBiL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmgKaW5kZXggNzZiOGI3NjI3YTEwODUuLjMxN2U5OWI5YWNjMGE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JwZl92ZXJpZmllci5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmgKQEAgLTg5OCw2ICYjNDM7ODk4LDE0IEBAIHN0cnVjdCBicGZfc2NjX2luZm8gewogCiBzdHJ1Y3QgYnBmX2xpdmVuZXNzOwogCiYjNDM7c3RydWN0IGJwZl9mZF9hcnJheSB7CiYjNDM7CXVuaW9uIHsKJiM0MzsJCXN0cnVjdCBicGZfbWFwICptYXA7CiYjNDM7CQlzdHJ1Y3QgYnRmICpidGY7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHZhbDsKJiM0MzsJfTsKJiM0Mzt9OwomIzQzOwogLyogc2luZ2xlIGNvbnRhaW5lciBmb3IgYWxsIHN0cnVjdHMKICAqIG9uZSB2ZXJpZmllcl9lbnYgcGVyIGJwZl9jaGVjaygpIGNhbGwKICAqLwpAQCAtOTM5LDYgJiM0Mzs5NDcsNyBAQCBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiB7CiAJYm9vbCBieXBhc3Nfc3BlY192NDsKIAlib29sIHNlZW5fZGlyZWN0X3dyaXRlOwogCWJvb2wgc2Vlbl9leGNlcHRpb247CiYjNDM7CWJvb2wgc2lnbmF0dXJlOwogCXN0cnVjdCBicGZfaW5zbl9hdXhfZGF0YSAqaW5zbl9hdXhfZGF0YTsgLyogYXJyYXkgb2YgcGVyLWluc24gc3RhdGUgKi8KIAljb25zdCBzdHJ1Y3QgYnBmX2xpbmVfaW5mbyAqcHJldl9saW5mbzsKIAlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2xvZyBsb2c7CkBAIC05ODksNyAmIzQzOzk5OCwxOSBAQCBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiB7CiAJdTMyIGZyZWVfbGlzdF9zaXplOwogCXUzMiBleHBsb3JlZF9zdGF0ZXNfc2l6ZTsKIAl1MzIgbnVtX2JhY2tlZGdlczsKLQlicGZwdHJfdCBmZF9hcnJheTsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHByb2dyYW0mIzM5O3MgZmRfYXJyYXkgY29tZXMgaW4gdHdvIHNoYXBlcywgdG9sZCBhcGFydCBieSB3aGV0aGVyCiYjNDM7CSAqIHRoZSBjYWxsZXIgcGFzc2VkIGZkX2FycmF5X2NudC4gVGhleSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlOgomIzQzOwkgKiAgLSBjb250aW51b3VzIChmZF9hcnJheV9jbnQgZ2l2ZW4pOiAtJmd0O2ZkX2FycmF5IGhvbGRzIGV2ZXJ5IGVudHJ5CiYjNDM7CSAqICAgIHJlc29sdmVkIHRvIGl0cyBvYmplY3QgdXAgZnJvbnQsIGluZGV4ZWQgYnkgZmRfYXJyYXkgcG9zaXRpb24sCiYjNDM7CSAqICAgIHdpdGggLSZndDtmZF9hcnJheV9jbnQgc2xvdHM7IC0mZ3Q7ZmRfYXJyYXlfcmF3IGlzIHVudXNlZC4KJiM0MzsJICogIC0gc3BhcnNlIChubyBmZF9hcnJheV9jbnQpOiAtJmd0O2ZkX2FycmF5IGlzIE5VTEwsIGFuZCBlbnRyaWVzIGFyZQomIzQzOwkgKiAgICByZWFkIGZyb20gLSZndDtmZF9hcnJheV9yYXcgKHRoZSBjYWxsZXImIzM5O3MgZmRfYXJyYXkpIGFuZCByZXNvbHZlZAomIzQzOwkgKiAgICBvbiB0aGUgc3BvdCBhdCBlYWNoIHJlZmVyZW5jZS4KJiM0MzsJICovCiYjNDM7CXN0cnVjdCBicGZfZmRfYXJyYXkgKmZkX2FycmF5OwomIzQzOwl1MzIgZmRfYXJyYXlfY250OwomIzQzOwlicGZwdHJfdCBmZF9hcnJheV9yYXc7CiAKIAkvKiBiaXQgbWFzayB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgYSByZWdpc3RlciBoYXMgYmVlbiBhY2Nlc3NlZAogCSAqIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGZ1bmN0aW9uIHN0YXRlIHdhcyBwcmludGVkCmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3N5c2NhbGwuYyBiL2tlcm5lbC9icGYvc3lzY2FsbC5jCmluZGV4IDZkYjMwNmQyM2I0NzlmLi4zNThmMmIwY2UyYmQzMSAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9zeXNjYWxsLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9zeXNjYWxsLmMKQEAgLTQwLDcgJiM0Mzs0MCw2IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvdHJhY2Vwb2ludC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L292ZXJmbG93LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvY29va2llLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvdmVyaWZpY2F0aW9uLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYnRmX2lkcy5oJmd0OwogCiAjaW5jbHVkZSAmbHQ7bmV0L25ldGZpbHRlci9uZl9icGZfbGluay5oJmd0OwpAQCAtMTU5OSwxMyAmIzQzOzE1OTgsNiBAQCBzdGF0aWMgaW50IG1hcF9jcmVhdGVfYWxsb2ModW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLCBzdHJ1Y3QgYnBmX3ZlcgogCQkJZXJyID0gLUVGQVVMVDsKIAkJCWdvdG8gZnJlZV9tYXA7CiAJCX0KLQotCQkvKiBTZWUgbGliYnBmOiBlbWl0X3NpZ25hdHVyZV9tYXRjaCgpICovCi0JCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgYnBmX21hcCwgZXhjbCkgIT0gU0hBMjU2X0RJR0VTVF9TSVpFKTsKLQkJQlVJTERfQlVHX09OKCFfX3NhbWVfdHlwZShtYXAtJmd0O2V4Y2wsIHUzMikpOwotCQlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGJwZl9tYXAsIHNoYSkgICE9IDApOwotCQlCVUlMRF9CVUdfT04oIV9fc2FtZV90eXBlKG1hcC0mZ3Q7c2hhLCB1OFtTSEEyNTZfRElHRVNUX1NJWkVdKSk7Ci0JCW1hcC0mZ3Q7ZXhjbCA9IDE7CiAJfSBlbHNlIGlmIChhdHRyLSZndDtleGNsX3Byb2dfaGFzaF9zaXplKSB7CiAJCWJwZl9sb2cobG9nLCAmIzM0O0ludmFsaWQgZXhjbF9wcm9nX2hhc2hfc2l6ZS5cbiYjMzQ7KTsKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTI4ODYsNjQgJiM0MzsyODc4LDYgQEAgc3RhdGljIGJvb2wgaXNfcGVyZm1vbl9wcm9nX3R5cGUoZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSkKIAl9CiB9CiAKLXN0YXRpYyBlbnVtIGJwZl9zaWdfa2V5cmluZyBicGZfY2xhc3NpZnlfa2V5cmluZyhzMzIga2V5cmluZ19pZCkKLXsKLQlzd2l0Y2ggKGtleXJpbmdfaWQpIHsKLQljYXNlIDA6Ci0JCXJldHVybiBCUEZfU0lHX0tFWVJJTkdfQlVJTFRJTjsKLQljYXNlIChzMzIpKHVuc2lnbmVkIGxvbmcpVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklORzoKLQkJcmV0dXJuIEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUlk7Ci0JY2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklORzoKLQkJcmV0dXJuIEJQRl9TSUdfS0VZUklOR19QTEFURk9STTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1VTRVI7Ci0JfQotfQotCi1zdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl9wcm9nICpwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwKLQkJCQkgICAgIGJvb2wgaXNfa2VybmVsLCBzMzIgKmtleXJpbmdfc2VyaWFsKQotewotCWJwZnB0cl90IHVzaWcgPSBtYWtlX2JwZnB0cihhdHRyLSZndDtzaWduYXR1cmUsIGlzX2tlcm5lbCk7Ci0Jc3RydWN0IGJwZl9keW5wdHJfa2VybiBzaWdfcHRyLCBpbnNuc19wdHI7Ci0Jc3RydWN0IGJwZl9rZXkgKmtleSA9IE5VTEw7Ci0Jdm9pZCAqc2lnOwotCWludCBlcnIgPSAwOwotCi0JLyoKLQkgKiBEb24mIzM5O3QgYXR0ZW1wdCB0byB1c2Uga21hbGxvY19sYXJnZSBvciB2bWFsbG9jIGZvciBzaWduYXR1cmVzLgotCSAqIFByYWN0aWNhbCBzaWduYXR1cmUgZm9yIEJQRiBwcm9ncmFtIHNob3VsZCBiZSBiZWxvdyB0aGlzIGxpbWl0LgotCSAqLwotCWlmIChhdHRyLSZndDtzaWduYXR1cmVfc2l6ZSAmZ3Q7IEtNQUxMT0NfTUFYX0NBQ0hFX1NJWkUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItJmd0O2tleXJpbmdfaWQpID09IDApCi0JCWtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLSZndDtrZXlyaW5nX2lkKTsKLQllbHNlCi0JCWtleSA9IGJwZl9sb29rdXBfdXNlcl9rZXkoYXR0ci0mZ3Q7a2V5cmluZ19pZCwgMCk7Ci0KLQlpZiAoIWtleSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzaWcgPSBrdm1lbWR1cF9icGZwdHIodXNpZywgYXR0ci0mZ3Q7c2lnbmF0dXJlX3NpemUpOwotCWlmIChJU19FUlIoc2lnKSkgewotCQlicGZfa2V5X3B1dChrZXkpOwotCQlyZXR1cm4gUFRSX0VSUihzaWcpOwotCX0KLQotCWJwZl9keW5wdHJfaW5pdCgmYW1wO3NpZ19wdHIsIHNpZywgQlBGX0RZTlBUUl9UWVBFX0xPQ0FMLCAwLAotCQkJYXR0ci0mZ3Q7c2lnbmF0dXJlX3NpemUpOwotCWJwZl9keW5wdHJfaW5pdCgmYW1wO2luc25zX3B0ciwgcHJvZy0mZ3Q7aW5zbnNpLCBCUEZfRFlOUFRSX1RZUEVfTE9DQUwsIDAsCi0JCQlwcm9nLSZndDtsZW4gKiBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKSk7Ci0KLQllcnIgPSBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgoc3RydWN0IGJwZl9keW5wdHIgKikmYW1wO2luc25zX3B0ciwKLQkJCQkJIChzdHJ1Y3QgYnBmX2R5bnB0ciAqKSZhbXA7c2lnX3B0ciwga2V5KTsKLQlpZiAoIWVycikKLQkJKmtleXJpbmdfc2VyaWFsID0gYnBmX2tleV9zZXJpYWwoa2V5KTsKLQlicGZfa2V5X3B1dChrZXkpOwotCWt2ZnJlZShzaWcpOwotCXJldHVybiBlcnI7Ci19Ci0KIHN0YXRpYyBpbnQgYnBmX3Byb2dfbWFya19pbnNuX2FycmF5c19yZWFkeShzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCiB7CiAJaW50IGVycjsKQEAgLTMxMzMsMTcgJiM0MzszMDY3LDggQEAgc3RhdGljIGludCBicGZfcHJvZ19sb2FkKHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXQKIAogCS8qIGVCUEYgcHJvZ3JhbXMgbXVzdCBiZSBHUEwgY29tcGF0aWJsZSB0byB1c2UgR1BMLWVkIGZ1bmN0aW9ucyAqLwogCXByb2ctJmd0O2dwbF9jb21wYXRpYmxlID0gbGljZW5zZV9pc19ncGxfY29tcGF0aWJsZShsaWNlbnNlKSA/IDEgOiAwOwotCWlmIChhdHRyLSZndDtzaWduYXR1cmUpIHsKLQkJZXJyID0gYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShwcm9nLCBhdHRyLCB1YXR0ci5pc19rZXJuZWwsCi0JCQkJCQkmYW1wO3Byb2ctJmd0O2F1eC0mZ3Q7c2lnLmtleXJpbmdfc2VyaWFsKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZnJlZV9wcm9nOwotCQlwcm9nLSZndDthdXgtJmd0O3NpZy5rZXlyaW5nX3R5cGUgPSBicGZfY2xhc3NpZnlfa2V5cmluZyhhdHRyLSZndDtrZXlyaW5nX2lkKTsKLQkJcHJvZy0mZ3Q7YXV4LSZndDtzaWcudmVyZGljdCA9IEJQRl9TSUdfVkVSSUZJRUQ7Ci0JfSBlbHNlIHsKLQkJcHJvZy0mZ3Q7YXV4LSZndDtzaWcua2V5cmluZ190eXBlID0gQlBGX1NJR19LRVlSSU5HX05PTkU7Ci0JCXByb2ctJmd0O2F1eC0mZ3Q7c2lnLnZlcmRpY3QgPSBCUEZfU0lHX1VOU0lHTkVEOwotCX0KJiM0MzsJcHJvZy0mZ3Q7YXV4LSZndDtzaWcua2V5cmluZ190eXBlID0gQlBGX1NJR19LRVlSSU5HX05PTkU7CiYjNDM7CXByb2ctJmd0O2F1eC0mZ3Q7c2lnLnZlcmRpY3QgPSBCUEZfU0lHX1VOU0lHTkVEOwogCXByb2ctJmd0O29yaWdfcHJvZyA9IE5VTEw7CiAJcHJvZy0mZ3Q7aml0ZWQgPSAwOwogCkBAIC0zMTg5LDEwICYjNDM7MzExNCw2IEBAIHN0YXRpYyBpbnQgYnBmX3Byb2dfbG9hZCh1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0CiAJaWYgKGVyciAmbHQ7IDApCiAJCWdvdG8gZnJlZV9wcm9nOwogCi0JZXJyID0gc2VjdXJpdHlfYnBmX3Byb2dfbG9hZChwcm9nLCBhdHRyLCB0b2tlbiwgdWF0dHIuaXNfa2VybmVsKTsKLQlpZiAoZXJyKQotCQlnb3RvIGZyZWVfcHJvZzsKLQogCS8qIHJ1biBlQlBGIHZlcmlmaWVyICovCiAJZXJyID0gYnBmX2NoZWNrKCZhbXA7cHJvZywgYXR0ciwgdWF0dHIsIGF0dHJfbG9nKTsKIAlpZiAoZXJyICZsdDsgMCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuYwppbmRleCBkNDZmN2RiMjBkOGYwNC4uNjVmNTMxMjhmYzMzZDYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKQEAgLTIyLDYgJiM0MzsyMiw4IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvY3R5cGUuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9lcnJvci1pbmplY3Rpb24uaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9icGZfbHNtLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NlY3VyaXR5LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3ZlcmlmaWNhdGlvbi5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2J0Zl9pZHMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9wb2lzb24uaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9tb2R1bGUuaCZndDsKQEAgLTI0OTAsNiAmIzQzOzI0OTIsODMgQEAgaW50IGJwZl9nZXRfa2Z1bmNfYWRkcihjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2csIHUzMiBmdW5jX2lkLAogCXJldHVybiAwOwogfQogCiYjNDM7I2RlZmluZSBCUEZfRkRfU0xPVF9CVEYJMVVMCiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZmRfc2xvdF9zZXRfbWFwKHN0cnVjdCBicGZfZmRfYXJyYXkgKnNsb3QsIHN0cnVjdCBicGZfbWFwICptYXApCiYjNDM7ewomIzQzOwlzbG90LSZndDt2YWwgPSAodW5zaWduZWQgbG9uZyltYXA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGZkX3Nsb3Rfc2V0X2J0ZihzdHJ1Y3QgYnBmX2ZkX2FycmF5ICpzbG90LCBzdHJ1Y3QgYnRmICpidGYpCiYjNDM7ewomIzQzOwlzbG90LSZndDt2YWwgPSAodW5zaWduZWQgbG9uZylidGYgfCBCUEZfRkRfU0xPVF9CVEY7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqZmRfc2xvdF9tYXAoc3RydWN0IGJwZl9mZF9hcnJheSBzbG90KQomIzQzO3sKJiM0MzsJaWYgKHNsb3QudmFsICZhbXA7IEJQRl9GRF9TTE9UX0JURikKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwlyZXR1cm4gKHN0cnVjdCBicGZfbWFwICopc2xvdC52YWw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnRmICpmZF9zbG90X2J0ZihzdHJ1Y3QgYnBmX2ZkX2FycmF5IHNsb3QpCiYjNDM7ewomIzQzOwlpZiAoIShzbG90LnZhbCAmYW1wOyBCUEZfRkRfU0xPVF9CVEYpKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CXJldHVybiAoc3RydWN0IGJ0ZiAqKShzbG90LnZhbCAmYW1wOyB+QlBGX0ZEX1NMT1RfQlRGKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBidGYgKgomIzQzO2ZkX2FycmF5X2dldF9idGZfY29udGludW91cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwomIzQzOwlpZiAoaWR4ICZndDs9IGVudi0mZ3Q7ZmRfYXJyYXlfY250KSB7CiYjNDM7CQl2ZXJib3NlKGVudiwgJiMzNDtrZnVuYyBmZF9pZHggJXUgb3V0IG9mIGJvdW5kcywgZmRfYXJyYXlfY250ICV1XG4mIzM0OywKJiM0MzsJCQlpZHgsIGVudi0mZ3Q7ZmRfYXJyYXlfY250KTsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwomIzQzOwl9CiYjNDM7CWJ0ZiA9IGZkX3Nsb3RfYnRmKGVudi0mZ3Q7ZmRfYXJyYXlbaWR4XSk7CiYjNDM7CWlmICghYnRmKSB7CiYjNDM7CQl2ZXJib3NlKGVudiwgJiMzNDtrZnVuYyBmZF9pZHggJXUgaXMgbm90IGEgbW9kdWxlIEJURlxuJiMzNDssIGlkeCk7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKJiM0MzsJfQomIzQzOwlidGZfZ2V0KGJ0Zik7CiYjNDM7CXJldHVybiBidGY7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnRmICoKJiM0MztmZF9hcnJheV9nZXRfYnRmX3NwYXJzZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwlpbnQgYnRmX2ZkOwomIzQzOwomIzQzOwlpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoJmFtcDtidGZfZmQsIGVudi0mZ3Q7ZmRfYXJyYXlfcmF3LAomIzQzOwkJCQkgICAgKHNpemVfdClpZHggKiBzaXplb2YoYnRmX2ZkKSwgc2l6ZW9mKGJ0Zl9mZCkpKQomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CiYjNDM7CWJ0ZiA9IGJ0Zl9nZXRfYnlfZmQoYnRmX2ZkKTsKJiM0MzsJaWYgKElTX0VSUihidGYpKSB7CiYjNDM7CQl2ZXJib3NlKGVudiwgJiMzNDtpbnZhbGlkIG1vZHVsZSBCVEYgZmQgc3BlY2lmaWVkXG4mIzM0Oyk7CiYjNDM7CQlyZXR1cm4gYnRmOwomIzQzOwl9CiYjNDM7CXJldHVybiBidGY7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnRmICpmZF9hcnJheV9nZXRfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpCiYjNDM7ewomIzQzOwlpZiAoZW52LSZndDtzaWduYXR1cmUpIHsKJiM0MzsJCXZlcmJvc2UoZW52LCAmIzM0O3NpZ25lZCBwcm9ncmFtIGNhbm5vdCBiaW5kIGFueSBCVEZcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwomIzQzOwl9CiYjNDM7CWlmIChlbnYtJmd0O2ZkX2FycmF5KQomIzQzOwkJcmV0dXJuIGZkX2FycmF5X2dldF9idGZfY29udGludW91cyhlbnYsIGlkeCk7CiYjNDM7CWlmICghYnBmcHRyX2lzX251bGwoZW52LSZndDtmZF9hcnJheV9yYXcpKQomIzQzOwkJcmV0dXJuIGZkX2FycmF5X2dldF9idGZfc3BhcnNlKGVudiwgaWR4KTsKJiM0MzsKJiM0MzsJdmVyYm9zZShlbnYsICYjMzQ7a2Z1bmMgb2Zmc2V0ICZndDsgMCB3aXRob3V0IGZkX2FycmF5IGlzIGludmFsaWRcbiYjMzQ7KTsKJiM0MzsJcmV0dXJuIEVSUl9QVFIoLUVQUk9UTyk7CiYjNDM7fQomIzQzOwogc3RhdGljIHN0cnVjdCBidGYgKl9fZmluZF9rZnVuY19kZXNjX2J0ZihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAogCQkJCQkgczE2IG9mZnNldCkKIHsKQEAgLTI0OTgsNyAmIzQzOzI1NzcsNiBAQCBzdGF0aWMgc3RydWN0IGJ0ZiAqX19maW5kX2tmdW5jX2Rlc2NfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsCiAJc3RydWN0IGJwZl9rZnVuY19idGYgKmI7CiAJc3RydWN0IG1vZHVsZSAqbW9kOwogCXN0cnVjdCBidGYgKmJ0ZjsKLQlpbnQgYnRmX2ZkOwogCiAJdGFiID0gZW52LSZndDtwcm9nLSZndDthdXgtJmd0O2tmdW5jX2J0Zl90YWI7CiAJYiA9IGJzZWFyY2goJmFtcDtrZl9idGYsIHRhYi0mZ3Q7ZGVzY3MsIHRhYi0mZ3Q7bnJfZGVzY3MsCkBAIC0yNTA5LDIyICYjNDM7MjU4Nyw5IEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpfX2ZpbmRfa2Z1bmNfZGVzY19idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKIAkJCXJldHVybiBFUlJfUFRSKC1FMkJJRyk7CiAJCX0KIAotCQlpZiAoYnBmcHRyX2lzX251bGwoZW52LSZndDtmZF9hcnJheSkpIHsKLQkJCXZlcmJvc2UoZW52LCAmIzM0O2tmdW5jIG9mZnNldCAmZ3Q7IDAgd2l0aG91dCBmZF9hcnJheSBpcyBpbnZhbGlkXG4mIzM0Oyk7Ci0JCQlyZXR1cm4gRVJSX1BUUigtRVBST1RPKTsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldCgmYW1wO2J0Zl9mZCwgZW52LSZndDtmZF9hcnJheSwKLQkJCQkJICAgIG9mZnNldCAqIHNpemVvZihidGZfZmQpLAotCQkJCQkgICAgc2l6ZW9mKGJ0Zl9mZCkpKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7Ci0KLQkJYnRmID0gYnRmX2dldF9ieV9mZChidGZfZmQpOwotCQlpZiAoSVNfRVJSKGJ0ZikpIHsKLQkJCXZlcmJvc2UoZW52LCAmIzM0O2ludmFsaWQgbW9kdWxlIEJURiBmZCBzcGVjaWZpZWRcbiYjMzQ7KTsKJiM0MzsJCWJ0ZiA9IGZkX2FycmF5X2dldF9idGYoZW52LCBvZmZzZXQpOwomIzQzOwkJaWYgKElTX0VSUihidGYpKQogCQkJcmV0dXJuIGJ0ZjsKLQkJfQotCiAJCWlmICghYnRmX2lzX21vZHVsZShidGYpKSB7CiAJCQl2ZXJib3NlKGVudiwgJiMzNDtCVEYgZmQgZm9yIGtmdW5jIGlzIG5vdCBhIG1vZHVsZSBCVEZcbiYjMzQ7KTsKIAkJCWJ0Zl9wdXQoYnRmKTsKQEAgLTE3NTg5LDYgJiM0MzsxNzY1NCwxMSBAQCBzdGF0aWMgaW50IF9fYWRkX3VzZWRfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBidGYgKmJ0ZikKIAkJaWYgKGVudi0mZ3Q7dXNlZF9idGZzW2ldLmJ0ZiA9PSBidGYpCiAJCQlnb3RvIHJldF9wdXQ7CiAKJiM0MzsJaWYgKGVudi0mZ3Q7c2lnbmF0dXJlKSB7CiYjNDM7CQl2ZXJib3NlKGVudiwgJiMzNDtzaWduZWQgcHJvZ3JhbSBjYW5ub3QgYmluZCBhbnkgQlRGXG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSAtRUFDQ0VTOwomIzQzOwkJZ290byByZXRfcHV0OwomIzQzOwl9CiAJaWYgKGVudi0mZ3Q7dXNlZF9idGZfY250ICZndDs9IE1BWF9VU0VEX0JURlMpIHsKIAkJdmVyYm9zZShlbnYsICYjMzQ7VGhlIHRvdGFsIG51bWJlciBvZiBidGZzIHBlciBwcm9ncmFtIGhhcyByZWFjaGVkIHRoZSBsaW1pdCBvZiAldVxuJiMzNDssCiAJCQlNQVhfVVNFRF9CVEZTKTsKQEAgLTE3ODcxLDYgJiM0MzsxNzk0MSwxMiBAQCBzdGF0aWMgaW50IF9fYWRkX3VzZWRfbWFwKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfbWFwICptYXApCiAJCWlmIChlbnYtJmd0O3VzZWRfbWFwc1tpXSA9PSBtYXApCiAJCQlyZXR1cm4gaTsKIAomIzQzOwlpZiAoZW52LSZndDtzaWduYXR1cmUgJmFtcDsmYW1wOwomIzQzOwkgICAgZW52LSZndDtwcm9nLSZndDthdXgtJmd0O3NpZy52ZXJkaWN0ID09IEJQRl9TSUdfVkVSSUZJRUQpIHsKJiM0MzsJCXZlcmJvc2UoZW52LCAmIzM0O3NpZ25lZCBwcm9ncmFtIGNhbm5vdCBiaW5kIG1hcCAmIzM5OyVzJiMzOTsgbm90IGNvdmVyZWQgYnkgdGhlIHNpZ25hdHVyZVxuJiMzNDssCiYjNDM7CQkJbWFwLSZndDtuYW1lKTsKJiM0MzsJCXJldHVybiAtRUFDQ0VTOwomIzQzOwl9CiAJaWYgKGVudi0mZ3Q7dXNlZF9tYXBfY250ICZndDs9IE1BWF9VU0VEX01BUFMpIHsKIAkJdmVyYm9zZShlbnYsICYjMzQ7VGhlIHRvdGFsIG51bWJlciBvZiBtYXBzIHBlciBwcm9ncmFtIGhhcyByZWFjaGVkIHRoZSBsaW1pdCBvZiAldVxuJiMzNDssCiAJCQlNQVhfVVNFRF9NQVBTKTsKQEAgLTE3OTIzLDYgJiM0MzsxNzk5OSw0OCBAQCBzdGF0aWMgaW50IGFkZF91c2VkX21hcChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgZmQpCiAJcmV0dXJuIF9fYWRkX3VzZWRfbWFwKGVudiwgbWFwKTsKIH0KIAomIzQzO3N0YXRpYyBpbnQgZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9tYXAgKm1hcDsKJiM0MzsKJiM0MzsJaWYgKGlkeCAmZ3Q7PSBlbnYtJmd0O2ZkX2FycmF5X2NudCkgewomIzQzOwkJdmVyYm9zZShlbnYsICYjMzQ7ZmRfaWR4ICV1IG91dCBvZiBib3VuZHMsIGZkX2FycmF5X2NudCAldVxuJiMzNDssCiYjNDM7CQkJaWR4LCBlbnYtJmd0O2ZkX2FycmF5X2NudCk7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwltYXAgPSBmZF9zbG90X21hcChlbnYtJmd0O2ZkX2FycmF5W2lkeF0pOwomIzQzOwlpZiAoIW1hcCkgewomIzQzOwkJdmVyYm9zZShlbnYsICYjMzQ7ZmRfaWR4ICV1IGlzIG5vdCBhIG1hcFxuJiMzNDssIGlkeCk7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwlyZXR1cm4gX19hZGRfdXNlZF9tYXAoZW52LCBtYXApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KQomIzQzO3sKJiM0MzsJaW50IGZkOwomIzQzOwomIzQzOwlpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoJmFtcDtmZCwgZW52LSZndDtmZF9hcnJheV9yYXcsCiYjNDM7CQkJCSAgICAoc2l6ZV90KWlkeCAqIHNpemVvZihmZCksIHNpemVvZihmZCkpKQomIzQzOwkJcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CXJldHVybiBhZGRfdXNlZF9tYXAoZW52LCBmZCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZmRfYXJyYXlfZ2V0X21hcF9pZHgoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeCkKJiM0Mzt7CiYjNDM7CWlmIChlbnYtJmd0O2ZkX2FycmF5KQomIzQzOwkJcmV0dXJuIGZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXMoZW52LCBpZHgpOwomIzQzOwlpZiAoZW52LSZndDtzaWduYXR1cmUpIHsKJiM0MzsJCXZlcmJvc2UoZW52LCAmIzM0O3NpZ25lZCBwcm9ncmFtIG11c3QgYmluZCBtYXBzIHZpYSBhIGNvbnRpbnVvdXMgZmRfYXJyYXkgKGZkX2FycmF5X2NudClcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiAtRUFDQ0VTOwomIzQzOwl9CiYjNDM7CWlmICghYnBmcHRyX2lzX251bGwoZW52LSZndDtmZF9hcnJheV9yYXcpKQomIzQzOwkJcmV0dXJuIGZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZShlbnYsIGlkeCk7CiYjNDM7CiYjNDM7CXZlcmJvc2UoZW52LCAmIzM0O2ZkX2lkeCB3aXRob3V0IGZkX2FycmF5IGlzIGludmFsaWRcbiYjMzQ7KTsKJiM0MzsJcmV0dXJuIC1FUFJPVE87CiYjNDM7fQomIzQzOwogc3RhdGljIGludCBjaGVja19hbHVfZmllbGRzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbikKIHsKIAl1OCBjbGFzcyA9IEJQRl9DTEFTUyhpbnNuLSZndDtjb2RlKTsKQEAgLTE4MTQwLDcgJiM0MzsxODI1OCw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfYW5kX3Jlc29sdmVfaW5zbnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKIAkJCXN0cnVjdCBicGZfbWFwICptYXA7CiAJCQlpbnQgbWFwX2lkeDsKIAkJCXU2NCBhZGRyOwotCQkJdTMyIGZkOwogCiAJCQlpZiAoaSA9PSBpbnNuX2NudCAtIDEgfHwgaW5zblsxXS5jb2RlICE9IDAgfHwKIAkJCSAgICBpbnNuWzFdLmRzdF9yZWcgIT0gMCB8fCBpbnNuWzFdLnNyY19yZWcgIT0gMCB8fApAQCAtMTgxOTIsMjEgJiM0MzsxODMwOSwxNyBAQCBzdGF0aWMgaW50IGNoZWNrX2FuZF9yZXNvbHZlX2luc25zKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpCiAJCQlzd2l0Y2ggKGluc25bMF0uc3JjX3JlZykgewogCQkJY2FzZSBCUEZfUFNFVURPX01BUF9JRFhfVkFMVUU6CiAJCQljYXNlIEJQRl9QU0VVRE9fTUFQX0lEWDoKLQkJCQlpZiAoYnBmcHRyX2lzX251bGwoZW52LSZndDtmZF9hcnJheSkpIHsKLQkJCQkJdmVyYm9zZShlbnYsICYjMzQ7ZmRfaWR4IHdpdGhvdXQgZmRfYXJyYXkgaXMgaW52YWxpZFxuJiMzNDspOwotCQkJCQlyZXR1cm4gLUVQUk9UTzsKLQkJCQl9Ci0JCQkJaWYgKGNvcHlfZnJvbV9icGZwdHJfb2Zmc2V0KCZhbXA7ZmQsIGVudi0mZ3Q7ZmRfYXJyYXksCi0JCQkJCQkJICAgIGluc25bMF0uaW1tICogc2l6ZW9mKGZkKSwKLQkJCQkJCQkgICAgc2l6ZW9mKGZkKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwomIzQzOwkJCQltYXBfaWR4ID0gZmRfYXJyYXlfZ2V0X21hcF9pZHgoZW52LCBpbnNuWzBdLmltbSk7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCWZkID0gaW5zblswXS5pbW07CiYjNDM7CQkJCWlmIChlbnYtJmd0O3NpZ25hdHVyZSkgewomIzQzOwkJCQkJdmVyYm9zZShlbnYsICYjMzQ7c2lnbmVkIHByb2dyYW0gY2Fubm90IHJlZmVyZW5jZSBhIG1hcCBieSBmZCwgb25seSB2aWEgZmRfYXJyYXkgaW5kZXhcbiYjMzQ7KTsKJiM0MzsJCQkJCXJldHVybiAtRUlOVkFMOwomIzQzOwkJCQl9CiYjNDM7CQkJCW1hcF9pZHggPSBhZGRfdXNlZF9tYXAoZW52LCBpbnNuWzBdLmltbSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCW1hcF9pZHggPSBhZGRfdXNlZF9tYXAoZW52LCBmZCk7CiAJCQlpZiAobWFwX2lkeCAmbHQ7IDApCiAJCQkJcmV0dXJuIG1hcF9pZHg7CiAJCQltYXAgPSBlbnYtJmd0O3VzZWRfbWFwc1ttYXBfaWR4XTsKQEAgLTE5NDgxLDcgJiM0MzsxOTU5NCw3IEBAIHN0cnVjdCBidGYgKmJwZl9nZXRfYnRmX3ZtbGludXgodm9pZCkKICAqIHRoaXMgY2FzZSBleHBlY3QgdGhhdCBldmVyeSBmaWxlIGRlc2NyaXB0b3IgaW4gdGhlIGFycmF5IGlzIGVpdGhlciBhIG1hcCBvcgogICogYSBCVEYuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBjb25zaWRlcmVkIHRvIGJlIHRyYXNoLgogICovCi1zdGF0aWMgaW50IGFkZF9mZF9mcm9tX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBmZCkKJiM0MztzdGF0aWMgaW50IGFkZF9mZF9mcm9tX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgsIGludCBmZCkKIHsKIAlzdHJ1Y3QgYnBmX21hcCAqbWFwOwogCXN0cnVjdCBidGYgKmJ0ZjsKQEAgLTE5NDkzLDUxICYjNDM7MTk2MDYsODMgQEAgc3RhdGljIGludCBhZGRfZmRfZnJvbV9mZF9hcnJheShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgZmQpCiAJCWVyciA9IF9fYWRkX3VzZWRfbWFwKGVudiwgbWFwKTsKIAkJaWYgKGVyciAmbHQ7IDApCiAJCQlyZXR1cm4gZXJyOwomIzQzOwkJZmRfc2xvdF9zZXRfbWFwKCZhbXA7ZW52LSZndDtmZF9hcnJheVtpZHhdLCBtYXApOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlidGYgPSBfX2J0Zl9nZXRfYnlfZmQoZik7CiAJaWYgKCFJU19FUlIoYnRmKSkgewogCQlidGZfZ2V0KGJ0Zik7Ci0JCXJldHVybiBfX2FkZF91c2VkX2J0ZihlbnYsIGJ0Zik7CiYjNDM7CQllcnIgPSBfX2FkZF91c2VkX2J0ZihlbnYsIGJ0Zik7CiYjNDM7CQlpZiAoZXJyICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gZXJyOwomIzQzOwkJZmRfc2xvdF9zZXRfYnRmKCZhbXA7ZW52LSZndDtmZF9hcnJheVtpZHhdLCBidGYpOwomIzQzOwkJcmV0dXJuIDA7CiAJfQogCiAJdmVyYm9zZShlbnYsICYjMzQ7ZmQgJWQgaXMgbm90IHBvaW50aW5nIHRvIHZhbGlkIGJwZl9tYXAgb3IgYnRmXG4mIzM0OywgZmQpOwogCXJldHVybiBQVFJfRVJSKG1hcCk7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY2Vzc19mZF9hcnJheShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIpCiYjNDM7LyoKJiM0MzsgKiBBIGNvbnRpbnVvdXMgZmRfYXJyYXkgaXMgcmVzb2x2ZWQgaW50byBhbiBpbi1tZW1vcnkgY2FjaGUgd2l0aCBvbmUgc2xvdAomIzQzOyAqIHBlciBlbnRyeS4gVGhlIGJvdW5kIGhlcmUgaXMgZGVsaWJlcmF0ZWx5IGdlbmVyb3VzIGFuZCBub3QgZGVyaXZlZCBmcm9tCiYjNDM7ICogdGhlIHBlci1wcm9ncmFtIG9iamVjdCBsaW1pdHM6IER1cGxpY2F0ZSBlbnRyaWVzIC9hcmUvIHBlcm1pdHRlZCwgYW5kCiYjNDM7ICogdGhlIG51bWJlciBvZiBkaXN0aW5jdCBtYXBzIGFuZCBCVEZzIGEgcHJvZ3JhbSBjYW4gYmluZCBpcyBlbmZvcmNlZCB3aGVuCiYjNDM7ICogZWFjaCBlbnRyeSBpcyByZXNvbHZlZCBieSBfX2FkZF91c2VkX21hcCgpIGFuZCBfX2FkZF91c2VkX2J0ZigpLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgTUFYX0ZEX0FSUkFZX0NOVCA0MDk2CiYjNDM7CiYjNDM7c3RhdGljIGludCBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKJiM0MzsJCQkJICAgICAgIGJwZnB0cl90IGZkX2FycmF5LCB1MzIgY250KQogewotCXNpemVfdCBzaXplID0gc2l6ZW9mKGludCk7Ci0JaW50IHJldDsKLQlpbnQgZmQ7CiYjNDM7CWludCBmZCwgcmV0OwogCXUzMiBpOwogCi0JZW52LSZndDtmZF9hcnJheSA9IG1ha2VfYnBmcHRyKGF0dHItJmd0O2ZkX2FycmF5LCB1YXR0ci5pc19rZXJuZWwpOwotCi0JLyoKLQkgKiBUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gb2xkIChubyBmZF9hcnJheV9jbnQgaXMgZ2l2ZW4pIGFuZCBuZXcKLQkgKiBBUElzIGlzIHRoYXQgaW4gdGhlIGxhdHRlciBjYXNlIHRoZSBmZF9hcnJheSBpcyBleHBlY3RlZCB0byBiZQotCSAqIGNvbnRpbnVvdXMgYW5kIGlzIHNjYW5uZWQgZm9yIG1hcCBmZHMgcmlnaHQgYXdheQotCSAqLwotCWlmICghYXR0ci0mZ3Q7ZmRfYXJyYXlfY250KQotCQlyZXR1cm4gMDsKLQotCS8qIENoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovCi0JaWYgKGF0dHItJmd0O2ZkX2FycmF5X2NudCAmZ3Q7PSAoVTMyX01BWCAvIHNpemUpKSB7Ci0JCXZlcmJvc2UoZW52LCAmIzM0O2ZkX2FycmF5X2NudCBpcyB0b28gYmlnICgldSlcbiYjMzQ7LCBhdHRyLSZndDtmZF9hcnJheV9jbnQpOwotCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJaWYgKGNudCAmZ3Q7IE1BWF9GRF9BUlJBWV9DTlQpIHsKJiM0MzsJCXZlcmJvc2UoZW52LCAmIzM0O2ZkX2FycmF5IGhhcyB0b28gbWFueSBlbnRyaWVzICgldSwgbWF4ICV1KVxuJiMzNDssCiYjNDM7CQkJY250LCBNQVhfRkRfQVJSQVlfQ05UKTsKJiM0MzsJCXJldHVybiAtRTJCSUc7CiAJfQogCi0JZm9yIChpID0gMDsgaSAmbHQ7IGF0dHItJmd0O2ZkX2FycmF5X2NudDsgaSYjNDM7JiM0MzspIHsKLQkJaWYgKGNvcHlfZnJvbV9icGZwdHJfb2Zmc2V0KCZhbXA7ZmQsIGVudi0mZ3Q7ZmRfYXJyYXksIGkgKiBzaXplLCBzaXplKSkKJiM0MzsJZW52LSZndDtmZF9hcnJheSA9IGt2Y2FsbG9jKGNudCwgc2l6ZW9mKCplbnYtJmd0O2ZkX2FycmF5KSwKJiM0MzsJCQkJIEdGUF9LRVJORUxfQUNDT1VOVCk7CiYjNDM7CWlmICghZW52LSZndDtmZF9hcnJheSkKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwllbnYtJmd0O2ZkX2FycmF5X2NudCA9IGNudDsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGNudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldCgmYW1wO2ZkLCBmZF9hcnJheSwKJiM0MzsJCQkJCSAgICAoc2l6ZV90KWkgKiBzaXplb2YoZmQpLCBzaXplb2YoZmQpKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCi0JCXJldCA9IGFkZF9mZF9mcm9tX2ZkX2FycmF5KGVudiwgZmQpOwomIzQzOwkJcmV0ID0gYWRkX2ZkX2Zyb21fZmRfYXJyYXkoZW52LCBpLCBmZCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQogCiYjNDM7c3RhdGljIGludCBwcm9jZXNzX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsCiYjNDM7CQkJICAgIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cikKJiM0Mzt7CiYjNDM7CWJwZnB0cl90IGZkX2FycmF5ID0gbWFrZV9icGZwdHIoYXR0ci0mZ3Q7ZmRfYXJyYXksIHVhdHRyLmlzX2tlcm5lbCk7CiYjNDM7CiYjNDM7CWlmIChicGZwdHJfaXNfbnVsbChmZF9hcnJheSkpIHsKJiM0MzsJCWlmIChhdHRyLSZndDtmZF9hcnJheV9jbnQpIHsKJiM0MzsJCQl2ZXJib3NlKGVudiwgJiMzNDtmZF9hcnJheV9jbnQgJXUgd2l0aG91dCBmZF9hcnJheSBpcyBpbnZhbGlkXG4mIzM0OywKJiM0MzsJCQkJYXR0ci0mZ3Q7ZmRfYXJyYXlfY250KTsKJiM0MzsJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJCX0KJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CS8qCiYjNDM7CSAqIE5ldyBBUEk6IHRoZSBjYWxsZXIgcGFzc2VzIGZkX2FycmF5X2NudCBhbmQgYSBjb250aW51b3VzIGFycmF5IHRoYXQKJiM0MzsJICogaXMgcmVzb2x2ZWQgYW5kIGJvdW5kIHVwIGZyb250LiBMZWdhY3kgQVBJIChubyBmZF9hcnJheV9jbnQpOiBrZWVwCiYjNDM7CSAqIHRoZSBjYWxsZXImIzM5O3MgYXJyYXkgYW5kIHJlc29sdmUgZW50cmllcyBvbiB0aGUgc3BvdCBhdCBlYWNoIHJlZmVyZW5jZS4KJiM0MzsJICovCiYjNDM7CWlmIChhdHRyLSZndDtmZF9hcnJheV9jbnQpCiYjNDM7CQlyZXR1cm4gcHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzKGVudiwgZmRfYXJyYXksCiYjNDM7CQkJCQkJICAgYXR0ci0mZ3Q7ZmRfYXJyYXlfY250KTsKJiM0MzsJZW52LSZndDtmZF9hcnJheV9yYXcgPSBmZF9hcnJheTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTk3NTIsNiAmIzQzOzE5ODk3LDEzOSBAQCBpbnQgYnBmX2ZpeHVwX2tmdW5jX2NhbGwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuLAogCXJldHVybiAwOwogfQogCiYjNDM7c3RhdGljIGVudW0gYnBmX3NpZ19rZXlyaW5nIGJwZl9jbGFzc2lmeV9rZXlyaW5nKHMzMiBrZXlyaW5nX2lkKQomIzQzO3sKJiM0MzsJc3dpdGNoIChrZXlyaW5nX2lkKSB7CiYjNDM7CWNhc2UgMDoKJiM0MzsJCXJldHVybiBCUEZfU0lHX0tFWVJJTkdfQlVJTFRJTjsKJiM0MzsJY2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkc6CiYjNDM7CQlyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1NFQ09OREFSWTsKJiM0MzsJY2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklORzoKJiM0MzsJCXJldHVybiBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk07CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1VTRVI7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBWZXJpZnkgdGhlIFBLQ1MjNyBzaWduYXR1cmUgb2YgYSBsb2FkZWQgcHJvZ3JhbS4gQ2FsbGVkIGZyb20gYnBmX2NoZWNrKCkKJiM0MzsgKiBvbmNlIHRoZSBwcm9ncmFtJiMzOTtzIG1ldGFkYXRhIG1hcHMgaGF2ZSBiZWVuIHJlc29sdmVkIGludG8gdXNlZF9tYXBzLCBzbwomIzQzOyAqIHRoZSBleGFjdCBtYXBzIGZvbGRlZCBpbnRvIHRoZSBzaWduYXR1cmUgYXJlIHRoZSBvbmVzIHRoZSBwcm9ncmFtIGJpbmRzLgomIzQzOyAqCiYjNDM7ICogVGhlIHNpZ25hdHVyZSBjb3ZlcnMgdGhlIGluc3RydWN0aW9ucyBmb2xsb3dlZCBieSB0aGUgZnJvemVuIGNvbnRlbnRzIG9mCiYjNDM7ICogZWFjaCBtYXAsIGluIEBtYXBzIG9yZGVyOiBpbnNucyB8fCBtYXBfMCB8fCBtYXBfMSB8fCBbLi4uXS4gT24gc3VjY2VzcyB0aGUKJiM0MzsgKiB2ZXJkaWN0IGFuZCBrZXlyaW5nIGluZm8gYXJlIHJlY29yZGVkIG9uIHByb2ctJmd0O2F1eC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKJiM0MzsJCQkJICAgICB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYm9vbCBpc19rZXJuZWwpCiYjNDM7ewomIzQzOwlicGZwdHJfdCB1c2lnID0gbWFrZV9icGZwdHIoYXR0ci0mZ3Q7c2lnbmF0dXJlLCBpc19rZXJuZWwpOwomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuIHNpZ19wdHIsIGRhdGFfcHRyOwomIzQzOwlzdHJ1Y3QgYnBmX3Byb2cgKnByb2cgPSBlbnYtJmd0O3Byb2c7CiYjNDM7CXN0cnVjdCBicGZfbWFwICoqbWFwcyA9IGVudi0mZ3Q7dXNlZF9tYXBzOwomIzQzOwlzdHJ1Y3QgYnBmX2tleSAqa2V5ID0gTlVMTDsKJiM0MzsJdm9pZCAqc2lnLCAqZGF0YSA9IE5VTEw7CiYjNDM7CXUzMiBtYXBfY250ID0gZW52LSZndDt1c2VkX21hcF9jbnQ7CiYjNDM7CXUzMiBpLCBvZmYsIGluc25zX3N6OwomIzQzOwl1NjQgZGF0YV9zejsKJiM0MzsJaW50IGVyciA9IDA7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIERvbiYjMzk7dCBhdHRlbXB0IHRvIHVzZSBrbWFsbG9jX2xhcmdlIG9yIHZtYWxsb2MgZm9yIHNpZ25hdHVyZXMuCiYjNDM7CSAqIFByYWN0aWNhbCBzaWduYXR1cmUgZm9yIEJQRiBwcm9ncmFtIHNob3VsZCBiZSBiZWxvdyB0aGlzIGxpbWl0LgomIzQzOwkgKi8KJiM0MzsJaWYgKGF0dHItJmd0O3NpZ25hdHVyZV9zaXplICZndDsgS01BTExPQ19NQVhfQ0FDSEVfU0laRSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwlpZiAoc3lzdGVtX2tleXJpbmdfaWRfY2hlY2soYXR0ci0mZ3Q7a2V5cmluZ19pZCkgPT0gMCkKJiM0MzsJCWtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLSZndDtrZXlyaW5nX2lkKTsKJiM0MzsJZWxzZQomIzQzOwkJa2V5ID0gYnBmX2xvb2t1cF91c2VyX2tleShhdHRyLSZndDtrZXlyaW5nX2lkLCAwKTsKJiM0MzsJaWYgKCFrZXkpIHsKJiM0MzsJCXZlcmJvc2UoZW52LCAmIzM0O2Nhbm5vdCByZXNvbHZlIHNpZ25pbmcga2V5cmluZyB3aXRoIGtleXJpbmdfaWQgJWRcbiYjMzQ7LAomIzQzOwkJCWF0dHItJmd0O2tleXJpbmdfaWQpOwomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc2lnID0ga3ZtZW1kdXBfYnBmcHRyKHVzaWcsIGF0dHItJmd0O3NpZ25hdHVyZV9zaXplKTsKJiM0MzsJaWYgKElTX0VSUihzaWcpKSB7CiYjNDM7CQlicGZfa2V5X3B1dChrZXkpOwomIzQzOwkJcmV0dXJuIFBUUl9FUlIoc2lnKTsKJiM0MzsJfQomIzQzOwomIzQzOwlpbnNuc19zeiA9IHByb2ctJmd0O2xlbiAqIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pOwomIzQzOwlkYXRhX3N6ID0gaW5zbnNfc3o7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBtYXBfY250OyBpJiM0MzsmIzQzOykgewomIzQzOwkJc3RydWN0IGJwZl9tYXAgKm1hcCA9IG1hcHNbaV07CiYjNDM7CiYjNDM7CQlpZiAobWFwLSZndDttYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfQVJSQVkgfHwKJiM0MzsJCSAgICAhbWFwLSZndDtvcHMtJmd0O21hcF9kaXJlY3RfdmFsdWVfYWRkcikgewomIzQzOwkJCXZlcmJvc2UoZW52LCAmIzM0O3NpZ25lZCBwcm9ncmFtIG1ldGFkYXRhIG1hcCAmIzM5OyVzJiMzOTsgbXVzdCBiZSBhbiBhcnJheVxuJiMzNDssCiYjNDM7CQkJCW1hcC0mZ3Q7bmFtZSk7CiYjNDM7CQkJZXJyID0gLUVJTlZBTDsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJCWlmICghUkVBRF9PTkNFKG1hcC0mZ3Q7ZnJvemVuKSkgewomIzQzOwkJCXZlcmJvc2UoZW52LCAmIzM0O3NpZ25lZCBwcm9ncmFtIG1ldGFkYXRhIG1hcCAmIzM5OyVzJiMzOTsgbXVzdCBiZSBmcm96ZW5cbiYjMzQ7LAomIzQzOwkJCQltYXAtJmd0O25hbWUpOwomIzQzOwkJCWVyciA9IC1FUEVSTTsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJCWlmICghbWFwLSZndDtleGNsX3Byb2dfc2hhKSB7CiYjNDM7CQkJdmVyYm9zZShlbnYsICYjMzQ7c2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICYjMzk7JXMmIzM5OyBtdXN0IGJlIGV4Y2x1c2l2ZVxuJiMzNDssCiYjNDM7CQkJCW1hcC0mZ3Q7bmFtZSk7CiYjNDM7CQkJZXJyID0gLUVQRVJNOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwkJZGF0YV9zeiAmIzQzOz0gbWFwLSZndDt2YWx1ZV9zaXplOwomIzQzOwl9CiYjNDM7CWlmIChicGZfZHlucHRyX2NoZWNrX3NpemUoZGF0YV9zeikpIHsKJiM0MzsJCXZlcmJvc2UoZW52LCAmIzM0O3NpZ25lZCBwYXlsb2FkIHRvbyBsYXJnZTogJWxsdSBieXRlc1xuJiMzNDssIGRhdGFfc3opOwomIzQzOwkJZXJyID0gLUUyQklHOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJZGF0YSA9IGt2bWFsbG9jKGRhdGFfc3osIEdGUF9LRVJORUxfQUNDT1VOVCB8IF9fR0ZQX1pFUk8pOwomIzQzOwlpZiAoIWRhdGEpIHsKJiM0MzsJCWVyciA9IC1FTk9NRU07CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwltZW1jcHkoZGF0YSwgcHJvZy0mZ3Q7aW5zbnNpLCBpbnNuc19zeik7CiYjNDM7CW9mZiA9IGluc25zX3N6OwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbWFwX2NudDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXN0cnVjdCBicGZfbWFwICptYXAgPSBtYXBzW2ldOwomIzQzOwkJdTY0IGFkZHI7CiYjNDM7CiYjNDM7CQllcnIgPSBtYXAtJmd0O29wcy0mZ3Q7bWFwX2RpcmVjdF92YWx1ZV9hZGRyKG1hcCwgJmFtcDthZGRyLCAwKTsKJiM0MzsJCWlmIChlcnIpIHsKJiM0MzsJCQl2ZXJib3NlKGVudiwgJiMzNDtmYWlsZWQgdG8gcmVhZCBzaWduZWQgbWV0YWRhdGEgbWFwICYjMzk7JXMmIzM5OzogJWRcbiYjMzQ7LAomIzQzOwkJCQltYXAtJmd0O25hbWUsIGVycik7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CQltZW1jcHkoZGF0YSAmIzQzOyBvZmYsICh2b2lkICopKHVuc2lnbmVkIGxvbmcpYWRkciwKJiM0MzsJCSAgICAgICBtYXAtJmd0O3ZhbHVlX3NpemUpOwomIzQzOwkJb2ZmICYjNDM7PSBtYXAtJmd0O3ZhbHVlX3NpemU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJYnBmX2R5bnB0cl9pbml0KCZhbXA7ZGF0YV9wdHIsIGRhdGEsIEJQRl9EWU5QVFJfVFlQRV9MT0NBTCwgMCwgZGF0YV9zeik7CiYjNDM7CWJwZl9keW5wdHJfaW5pdCgmYW1wO3NpZ19wdHIsIHNpZywgQlBGX0RZTlBUUl9UWVBFX0xPQ0FMLCAwLAomIzQzOwkJCWF0dHItJmd0O3NpZ25hdHVyZV9zaXplKTsKJiM0MzsKJiM0MzsJZXJyID0gYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoKHN0cnVjdCBicGZfZHlucHRyICopJmFtcDtkYXRhX3B0ciwKJiM0MzsJCQkJCSAoc3RydWN0IGJwZl9keW5wdHIgKikmYW1wO3NpZ19wdHIsIGtleSk7CiYjNDM7CWlmIChlcnIpIHsKJiM0MzsJCXZlcmJvc2UoZW52LCAmIzM0O3NpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkOiAlZFxuJiMzNDssIGVycik7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQl2ZXJib3NlKGVudiwgJiMzNDtzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHBhc3NlZFxuJiMzNDspOwomIzQzOwkJcHJvZy0mZ3Q7YXV4LSZndDtzaWcua2V5cmluZ19zZXJpYWwgPSBicGZfa2V5X3NlcmlhbChrZXkpOwomIzQzOwkJcHJvZy0mZ3Q7YXV4LSZndDtzaWcua2V5cmluZ190eXBlID0gYnBmX2NsYXNzaWZ5X2tleXJpbmcoYXR0ci0mZ3Q7a2V5cmluZ19pZCk7CiYjNDM7CQlwcm9nLSZndDthdXgtJmd0O3NpZy52ZXJkaWN0ID0gQlBGX1NJR19WRVJJRklFRDsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJa3ZmcmVlKGRhdGEpOwomIzQzOwlicGZfa2V5X3B1dChrZXkpOwomIzQzOwlrdmZyZWUoc2lnKTsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7CiBpbnQgYnBmX2NoZWNrKHN0cnVjdCBicGZfcHJvZyAqKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwKIAkgICAgICBzdHJ1Y3QgYnBmX2xvZ19hdHRyICphdHRyX2xvZykKIHsKQEAgLTE5Nzc0LDE4ICYjNDM7MjAwNTIsNiBAQCBpbnQgYnBmX2NoZWNrKHN0cnVjdCBicGZfcHJvZyAqKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAllbnYtJmd0O2J0LmVudiA9IGVudjsKLQotCWxlbiA9ICgqcHJvZyktJmd0O2xlbjsKLQllbnYtJmd0O2luc25fYXV4X2RhdGEgPQotCQl2emFsbG9jKGFycmF5X3NpemUoc2l6ZW9mKHN0cnVjdCBicGZfaW5zbl9hdXhfZGF0YSksIGxlbikpOwotCXJldCA9IC1FTk9NRU07Ci0JaWYgKCFlbnYtJmd0O2luc25fYXV4X2RhdGEpCi0JCWdvdG8gZXJyX2ZyZWVfZW52OwotCWZvciAoaSA9IDA7IGkgJmx0OyBsZW47IGkmIzQzOyYjNDM7KQotCQllbnYtJmd0O2luc25fYXV4X2RhdGFbaV0ub3JpZ19pZHggPSBpOwotCWVudi0mZ3Q7c3VjYyA9IGJwZl9pYXJyYXlfcmVhbGxvYyhOVUxMLCAyKTsKLQlpZiAoIWVudi0mZ3Q7c3VjYykKLQkJZ290byBlcnJfZnJlZV9lbnY7CiAJZW52LSZndDtwcm9nID0gKnByb2c7CiAJZW52LSZndDtvcHMgPSBicGZfdmVyaWZpZXJfb3BzW2Vudi0mZ3Q7cHJvZy0mZ3Q7dHlwZV07CiAKQEAgLTE5Nzk0LDIyICYjNDM7MjAwNjAsNTEgQEAgaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsCiAJZW52LSZndDtieXBhc3Nfc3BlY192MSA9IGJwZl9ieXBhc3Nfc3BlY192MShlbnYtJmd0O3Byb2ctJmd0O2F1eC0mZ3Q7dG9rZW4pOwogCWVudi0mZ3Q7YnlwYXNzX3NwZWNfdjQgPSBicGZfYnlwYXNzX3NwZWNfdjQoZW52LSZndDtwcm9nLSZndDthdXgtJmd0O3Rva2VuKTsKIAllbnYtJmd0O2JwZl9jYXBhYmxlID0gaXNfcHJpdiA9IGJwZl90b2tlbl9jYXBhYmxlKGVudi0mZ3Q7cHJvZy0mZ3Q7YXV4LSZndDt0b2tlbiwgQ0FQX0JQRik7Ci0KLQlicGZfZ2V0X2J0Zl92bWxpbnV4KCk7Ci0KLQkvKiBncmFiIHRoZSBtdXRleCB0byBwcm90ZWN0IGZldyBnbG9iYWxzIHVzZWQgYnkgdmVyaWZpZXIgKi8KLQlpZiAoIWlzX3ByaXYpCi0JCW11dGV4X2xvY2soJmFtcDticGZfdmVyaWZpZXJfbG9jayk7CiYjNDM7CWVudi0mZ3Q7c2lnbmF0dXJlID0gYXR0ci0mZ3Q7c2lnbmF0dXJlOwogCiAJLyogdXNlciBjb3VsZCBoYXZlIHJlcXVlc3RlZCB2ZXJib3NlIHZlcmlmaWVyIG91dHB1dAogCSAqIGFuZCBzdXBwbGllZCBidWZmZXIgdG8gc3RvcmUgdGhlIHZlcmlmaWNhdGlvbiB0cmFjZQogCSAqLwogCXJldCA9IGJwZl92bG9nX2luaXQoJmFtcDtlbnYtJmd0O2xvZywgYXR0cl9sb2ctJmd0O2xldmVsLCBhdHRyX2xvZy0mZ3Q7dWJ1ZiwgYXR0cl9sb2ctJmd0O3NpemUpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyX3VubG9jazsKJiM0MzsJCWdvdG8gZXJyX2ZyZWVfZW52OwomIzQzOwlpZiAoZW52LSZndDtzaWduYXR1cmUpIHsKJiM0MzsJCXJldCA9IGJwZl9wcm9nX2NhbGNfdGFnKGVudi0mZ3Q7cHJvZyk7CiYjNDM7CQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQlnb3RvIGVycl9wcmVwOwomIzQzOwl9CiAKIAlyZXQgPSBwcm9jZXNzX2ZkX2FycmF5KGVudiwgYXR0ciwgdWF0dHIpOwogCWlmIChyZXQpCiYjNDM7CQlnb3RvIGVycl9wcmVwOwomIzQzOwomIzQzOwlpZiAoZW52LSZndDtzaWduYXR1cmUpIHsKJiM0MzsJCXJldCA9IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoZW52LCBhdHRyLCB1YXR0ci5pc19rZXJuZWwpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlnb3RvIGVycl9wcmVwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IHNlY3VyaXR5X2JwZl9wcm9nX2xvYWQoZW52LSZndDtwcm9nLCBhdHRyLCBlbnYtJmd0O3Byb2ctJmd0O2F1eC0mZ3Q7dG9rZW4sCiYjNDM7CQkJCSAgICAgdWF0dHIuaXNfa2VybmVsKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCWdvdG8gZXJyX3ByZXA7CiYjNDM7CiYjNDM7CWJwZl9nZXRfYnRmX3ZtbGludXgoKTsKJiM0MzsKJiM0MzsJLyogZ3JhYiB0aGUgbXV0ZXggdG8gcHJvdGVjdCBmZXcgZ2xvYmFscyB1c2VkIGJ5IHZlcmlmaWVyICovCiYjNDM7CWlmICghaXNfcHJpdikKJiM0MzsJCW11dGV4X2xvY2soJmFtcDticGZfdmVyaWZpZXJfbG9jayk7CiYjNDM7CiYjNDM7CWxlbiA9IGVudi0mZ3Q7cHJvZy0mZ3Q7bGVuOwomIzQzOwllbnYtJmd0O2luc25fYXV4X2RhdGEgPQomIzQzOwkJdnphbGxvYyhhcnJheV9zaXplKHNpemVvZihzdHJ1Y3QgYnBmX2luc25fYXV4X2RhdGEpLCBsZW4pKTsKJiM0MzsJcmV0ID0gLUVOT01FTTsKJiM0MzsJaWYgKCFlbnYtJmd0O2luc25fYXV4X2RhdGEpCiYjNDM7CQlnb3RvIHNraXBfZnVsbF9jaGVjazsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGxlbjsgaSYjNDM7JiM0MzspCiYjNDM7CQllbnYtJmd0O2luc25fYXV4X2RhdGFbaV0ub3JpZ19pZHggPSBpOwomIzQzOwllbnYtJmd0O3N1Y2MgPSBicGZfaWFycmF5X3JlYWxsb2MoTlVMTCwgMik7CiYjNDM7CWlmICghZW52LSZndDtzdWNjKQogCQlnb3RvIHNraXBfZnVsbF9jaGVjazsKIAogCW1hcmtfdmVyaWZpZXJfc3RhdGVfY2xlYW4oZW52KTsKQEAgLTIwMDMzLDE3ICYjNDM7MjAzMjgsMjYgQEAgaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsCiAJKnByb2cgPSBlbnYtJmd0O3Byb2c7CiAKIAltb2R1bGVfcHV0KGVudi0mZ3Q7YXR0YWNoX2J0Zl9tb2QpOwotZXJyX3VubG9jazoKIAlpZiAoIWlzX3ByaXYpCiAJCW11dGV4X3VubG9jaygmYW1wO2JwZl92ZXJpZmllcl9sb2NrKTsKLQlicGZfY2xlYXJfaW5zbl9hdXhfZGF0YShlbnYsIDAsIGVudi0mZ3Q7cHJvZy0mZ3Q7bGVuKTsKJiM0MzsJZ290byBlcnJfZnJlZV9lbnY7CiYjNDM7ZXJyX3ByZXA6CiYjNDM7CWVyciA9IGJwZl9sb2dfYXR0cl9maW5hbGl6ZShhdHRyX2xvZywgJmFtcDtlbnYtJmd0O2xvZyk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlyZXQgPSBlcnI7CiYjNDM7CXJlbGVhc2VfaW5zbl9hcnJheXMoZW52KTsKJiM0MzsJcmVsZWFzZV9tYXBzKGVudik7CiYjNDM7CXJlbGVhc2VfYnRmcyhlbnYpOwogZXJyX2ZyZWVfZW52OgomIzQzOwlpZiAoZW52LSZndDtpbnNuX2F1eF9kYXRhKQomIzQzOwkJYnBmX2NsZWFyX2luc25fYXV4X2RhdGEoZW52LCAwLCBlbnYtJmd0O3Byb2ctJmd0O2xlbik7CiYjNDM7CXZmcmVlKGVudi0mZ3Q7aW5zbl9hdXhfZGF0YSk7CiYjNDM7CWt2ZnJlZShlbnYtJmd0O2ZkX2FycmF5KTsKIAlicGZfc3RhY2tfbGl2ZW5lc3NfZnJlZShlbnYpOwogCWt2ZnJlZShlbnYtJmd0O2NmZy5pbnNuX3Bvc3RvcmRlcik7CiAJa3ZmcmVlKGVudi0mZ3Q7c2NjX2luZm8pOwogCWt2ZnJlZShlbnYtJmd0O3N1Y2MpOwogCWt2ZnJlZShlbnYtJmd0O2dvdG94X3RtcF9idWYpOwotCXZmcmVlKGVudi0mZ3Q7aW5zbl9hdXhfZGF0YSk7CiAJa3ZmcmVlKGVudik7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmMKaW5kZXggNmFlNzI2MmViZTBjMWQuLmEwMWQwNmQyMmQxYTNiIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9nZW4uYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9nZW4uYwpAQCAtNzkzLDYgJiM0Mzs3OTMsOCBAQCBzdGF0aWMgaW50IGdlbl90cmFjZShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpvYmpfbmFtZSwgY29uc3QgY2hhciAqaAogCWlmIChzaWduX3Byb2dzKSB7CiAJCXNvcHRzLmluc25zID0gb3B0cy5pbnNuczsKIAkJc29wdHMuaW5zbnNfc3ogPSBvcHRzLmluc25zX3N6OwomIzQzOwkJc29wdHMuZGF0YSA9IG9wdHMuZGF0YTsKJiM0MzsJCXNvcHRzLmRhdGFfc3ogPSBvcHRzLmRhdGFfc3o7CiAJCXNvcHRzLmV4Y2xfcHJvZ19oYXNoID0gcHJvZ19zaGE7CiAJCXNvcHRzLmV4Y2xfcHJvZ19oYXNoX3N6ID0gc2l6ZW9mKHByb2dfc2hhKTsKIAkJc29wdHMuc2lnbmF0dXJlID0gc2lnX2J1ZjsKZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uYwppbmRleCBmOWI3NDJmNGJiMTA0Yi4uODg3MjZhNmRiNmQwZTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9zaWduLmMKQEAgLTEzNSw5ICYjNDM7MTM1LDIxIEBAIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKQogCUNNU19Db250ZW50SW5mbyAqY21zID0gTlVMTDsKIAlsb25nIGFjdHVhbF9zaWdfbGVuID0gMDsKIAlYNTA5ICp4NTA5ID0gTlVMTDsKJiM0MzsJdm9pZCAqZGF0YSA9IE5VTEw7CiYjNDM7CXNpemVfdCBkYXRhX3N6OwogCWludCBlcnIgPSAwOwogCi0JYmRfaW4gPSBCSU9fbmV3X21lbV9idWYob3B0cy0mZ3Q7aW5zbnMsIG9wdHMtJmd0O2luc25zX3N6KTsKJiM0MzsJZGF0YV9zeiA9IChzaXplX3Qpb3B0cy0mZ3Q7aW5zbnNfc3ogJiM0Mzsgb3B0cy0mZ3Q7ZGF0YV9zejsKJiM0MzsJZGF0YSA9IG1hbGxvYyhkYXRhX3N6KTsKJiM0MzsJaWYgKCFkYXRhKSB7CiYjNDM7CQllcnIgPSAtRU5PTUVNOwomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwl9CiYjNDM7CW1lbWNweShkYXRhLCBvcHRzLSZndDtpbnNucywgb3B0cy0mZ3Q7aW5zbnNfc3opOwomIzQzOwlpZiAob3B0cy0mZ3Q7ZGF0YV9zeikKJiM0MzsJCW1lbWNweSgoY2hhciAqKWRhdGEgJiM0Mzsgb3B0cy0mZ3Q7aW5zbnNfc3osIG9wdHMtJmd0O2RhdGEsIG9wdHMtJmd0O2RhdGFfc3opOwomIzQzOwomIzQzOwliZF9pbiA9IEJJT19uZXdfbWVtX2J1ZihkYXRhLCBkYXRhX3N6KTsKIAlpZiAoIWJkX2luKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gY2xlYW51cDsKQEAgLTE3NSwxMCAmIzQzOzE4NywxMyBAQCBpbnQgYnBmdG9vbF9wcm9nX3NpZ24oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cykKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCUVWUF9EaWdlc3Qob3B0cy0mZ3Q7aW5zbnMsIG9wdHMtJmd0O2luc25zX3N6LCBvcHRzLSZndDtleGNsX3Byb2dfaGFzaCwKLQkJICAgJmFtcDtvcHRzLSZndDtleGNsX3Byb2dfaGFzaF9zeiwgRVZQX3NoYTI1NigpLCBOVUxMKTsKJiM0MzsJaWYgKEVWUF9EaWdlc3Qob3B0cy0mZ3Q7aW5zbnMsIG9wdHMtJmd0O2luc25zX3N6LCBvcHRzLSZndDtleGNsX3Byb2dfaGFzaCwKJiM0MzsJCSAgICAgICAmYW1wO29wdHMtJmd0O2V4Y2xfcHJvZ19oYXNoX3N6LCBFVlBfc2hhMjU2KCksIE5VTEwpICE9IDEpIHsKJiM0MzsJCWVyciA9IC1FSU87CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KIAotCQliZF9vdXQgPSBCSU9fbmV3KEJJT19zX21lbSgpKTsKJiM0MzsJYmRfb3V0ID0gQklPX25ldyhCSU9fc19tZW0oKSk7CiAJaWYgKCFiZF9vdXQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBjbGVhbnVwOwpAQCAtMjEyLDYgJiM0MzsyMjcsNyBAQCBpbnQgYnBmdG9vbF9wcm9nX3NpZ24oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cykKIAlYNTA5X2ZyZWUoeDUwOSk7CiAJRVZQX1BLRVlfZnJlZShwcml2YXRlX2tleSk7CiAJQklPX2ZyZWUoYmRfaW4pOwomIzQzOwlmcmVlKGRhdGEpOwogCURJU1BMQVlfT1NTTF9FUlIoZXJyICZsdDsgMCk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmgKaW5kZXggNDlhZjQyNjBiOGU2YjcuLjA0MjU2OTE4Nzc1MjE3IDEwMDY0NAotLS0gYS90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaApAQCAtNTEsNyAmIzQzOzUxLDYgQEAgc3RydWN0IGJwZl9nZW4gewogCV9fdTMyIG5yX2tzeW1zOwogCWludCBmZF9hcnJheTsKIAlpbnQgbnJfZmRfYXJyYXk7Ci0JaW50IGhhc2hfaW5zbl9vZmZzZXRbU0hBMjU2X0RXT1JEX1NJWkVdOwogfTsKIAogdm9pZCBicGZfZ2VuX19pbml0KHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBsb2dfbGV2ZWwsIGludCBucl9wcm9ncywgaW50IG5yX21hcHMpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmMgYi90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuYwppbmRleCBjN2YyZDJhYzdiYjM1Zi4uNmUzZGQ1MjQyNzYxODMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jCkBAIC0xMTEsNyAmIzQzOzExMSw2IEBAIHN0YXRpYyB2b2lkIGVtaXQyKHN0cnVjdCBicGZfZ2VuICpnZW4sIHN0cnVjdCBicGZfaW5zbiBpbnNuMSwgc3RydWN0IGJwZl9pbnNuIGluCiAKIHN0YXRpYyBpbnQgYWRkX2RhdGEoc3RydWN0IGJwZl9nZW4gKmdlbiwgY29uc3Qgdm9pZCAqZGF0YSwgX191MzIgc2l6ZSk7CiBzdGF0aWMgdm9pZCBlbWl0X3N5c19jbG9zZV9ibG9iKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBibG9iX29mZik7Ci1zdGF0aWMgdm9pZCBlbWl0X3NpZ25hdHVyZV9tYXRjaChzdHJ1Y3QgYnBmX2dlbiAqZ2VuKTsKIAogdm9pZCBicGZfZ2VuX19pbml0KHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBsb2dfbGV2ZWwsIGludCBucl9wcm9ncywgaW50IG5yX21hcHMpCiB7CkBAIC0xNTQsOCAmIzQzOzE1Myw2IEBAIHZvaWQgYnBmX2dlbl9faW5pdChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbG9nX2xldmVsLCBpbnQgbnJfcHJvZ3MsIGludCBucl9tYXBzCiAJLyogUjcgY29udGFpbnMgdGhlIGVycm9yIGNvZGUgZnJvbSBzeXNfYnBmLiBDb3B5IGl0IGludG8gUjAgYW5kIGV4aXQuICovCiAJZW1pdChnZW4sIEJQRl9NT1Y2NF9SRUcoQlBGX1JFR18wLCBCUEZfUkVHXzcpKTsKIAllbWl0KGdlbiwgQlBGX0VYSVRfSU5TTigpKTsKLQlpZiAoT1BUU19HRVQoZ2VuLSZndDtvcHRzLCBnZW5faGFzaCwgZmFsc2UpKQotCQllbWl0X3NpZ25hdHVyZV9tYXRjaChnZW4pOwogfQogCiBzdGF0aWMgaW50IGFkZF9kYXRhKHN0cnVjdCBicGZfZ2VuICpnZW4sIGNvbnN0IHZvaWQgKmRhdGEsIF9fdTMyIHNpemUpCkBAIC0zNzcsOCAmIzQzOzM3NCw2IEBAIHN0YXRpYyB2b2lkIGVtaXRfc3lzX2Nsb3NlX2Jsb2Ioc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGJsb2Jfb2ZmKQogCV9fZW1pdF9zeXNfY2xvc2UoZ2VuKTsKIH0KIAotc3RhdGljIHZvaWQgY29tcHV0ZV9zaGFfdXBkYXRlX29mZnNldHMoc3RydWN0IGJwZl9nZW4gKmdlbik7Ci0KIGludCBicGZfZ2VuX19maW5pc2goc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcykKIHsKIAlpbnQgaTsKQEAgLTQwOCw5ICYjNDM7NDAzLDYgQEAgaW50IGJwZl9nZW5fX2ZpbmlzaChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbnJfcHJvZ3MsIGludCBucl9tYXBzKQogCWlmICghZ2VuLSZndDtlcnJvcikgewogCQlzdHJ1Y3QgZ2VuX2xvYWRlcl9vcHRzICpvcHRzID0gZ2VuLSZndDtvcHRzOwogCi0JCWlmIChPUFRTX0dFVChvcHRzLCBnZW5faGFzaCwgZmFsc2UpKQotCQkJY29tcHV0ZV9zaGFfdXBkYXRlX29mZnNldHMoZ2VuKTsKLQogCQlvcHRzLSZndDtpbnNucyA9IGdlbi0mZ3Q7aW5zbl9zdGFydDsKIAkJb3B0cy0mZ3Q7aW5zbnNfc3ogPSBnZW4tJmd0O2luc25fY3VyIC0gZ2VuLSZndDtpbnNuX3N0YXJ0OwogCQlvcHRzLSZndDtkYXRhID0gZ2VuLSZndDtkYXRhX3N0YXJ0OwpAQCAtNDYwLDIyICYjNDM7NDUyLDYgQEAgdm9pZCBicGZfZ2VuX19mcmVlKHN0cnVjdCBicGZfZ2VuICpnZW4pCiAJX3ZhbDsJCQkJCQkJXAogfSkKIAotc3RhdGljIHZvaWQgY29tcHV0ZV9zaGFfdXBkYXRlX29mZnNldHMoc3RydWN0IGJwZl9nZW4gKmdlbikKLXsKLQlfX3U2NCBzaGFbU0hBMjU2X0RXT1JEX1NJWkVdOwotCV9fdTY0IHNoYV9kdzsKLQlpbnQgaTsKLQotCWxpYmJwZl9zaGEyNTYoZ2VuLSZndDtkYXRhX3N0YXJ0LCBnZW4tJmd0O2RhdGFfY3VyIC0gZ2VuLSZndDtkYXRhX3N0YXJ0LCAoX191OCAqKXNoYSk7Ci0JZm9yIChpID0gMDsgaSAmbHQ7IFNIQTI1Nl9EV09SRF9TSVpFOyBpJiM0MzsmIzQzOykgewotCQlzdHJ1Y3QgYnBmX2luc24gKmluc24gPQotCQkJKHN0cnVjdCBicGZfaW5zbiAqKShnZW4tJmd0O2luc25fc3RhcnQgJiM0MzsgZ2VuLSZndDtoYXNoX2luc25fb2Zmc2V0W2ldKTsKLQkJc2hhX2R3ID0gdGd0X2VuZGlhbihzaGFbaV0pOwotCQlpbnNuWzBdLmltbSA9IChfX3UzMilzaGFfZHc7Ci0JCWluc25bMV0uaW1tID0gc2hhX2R3ICZndDsmZ3Q7IDMyOwotCX0KLX0KLQogdm9pZCBicGZfZ2VuX19sb2FkX2J0ZihzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCB2b2lkICpidGZfcmF3X2RhdGEsCiAJCSAgICAgICBfX3UzMiBidGZfcmF3X3NpemUpCiB7CkBAIC01NTcsOCAmIzQzOzUzMyw5IEBAIHZvaWQgYnBmX2dlbl9fbWFwX2NyZWF0ZShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLAogCSAqIENvbmRpdGlvbmFsbHkgdXBkYXRlIG1heF9lbnRyaWVzIGZyb20gdGhlIGhvc3Qtc3VwcGxpZWQgbG9hZGVyCiAJICogY3R4LiBUaGlzIHNpemVzIHRoZSBtYXAgYXQgcnVudGltZSwgYnV0IGZvciBhIHNpZ25lZCBsb2FkZXIKIAkgKiAoZ2VuX2hhc2gpIGl0IHdvdWxkIGxldCBhbiB1bnRydXN0ZWQgaG9zdCByZS1kaW1lbnNpb24gdGhlCi0JICogcHJvZ3JhbSYjMzk7cyBtYXBzIGFmdGVyIGVtaXRfc2lnbmF0dXJlX21hdGNoKCksIG91dHNpZGUgd2hhdCB0aGUKLQkgKiBzaWduYXR1cmUgYXR0ZXN0cyB0by4gS2VlcCB0aGUgc2lnbmVyLXByb3ZpZGVkIG1heF9lbnRyaWVzCiYjNDM7CSAqIHByb2dyYW0mIzM5O3MgbWFwcywgb3V0c2lkZSB3aGF0IHRoZSBzaWduYXR1cmUgYXR0ZXN0cyB0bzogdGhlCiYjNDM7CSAqIG1ldGFkYXRhIGJsb2IgaXMgY292ZXJlZCBieSB0aGUgcHJvZ3JhbSBzaWduYXR1cmUgYW5kIHZlcmlmaWVkCiYjNDM7CSAqIGJ5IHRoZSBrZXJuZWwgYXQgbG9hZCB0aW1lLiBLZWVwIHRoZSBzaWduZXItcHJvdmlkZWQgbWF4X2VudHJpZXMKIAkgKiBiYWtlZCBpbnRvIHRoZSBibG9iIGluIHRoYXQgY2FzZS4KIAkgKi8KIAlpZiAobWFwX2lkeCAmZ3Q7PSAwICZhbXA7JmFtcDsgIU9QVFNfR0VUKGdlbi0mZ3Q7b3B0cywgZ2VuX2hhc2gsIGZhbHNlKSkKQEAgLTU5Niw0NSAmIzQzOzU3Myw2IEBAIHZvaWQgYnBmX2dlbl9fbWFwX2NyZWF0ZShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLAogCQllbWl0X3N5c19jbG9zZV9zdGFjayhnZW4sIHN0YWNrX29mZihpbm5lcl9tYXBfZmQpKTsKIH0KIAotc3RhdGljIHZvaWQgZW1pdF9zaWduYXR1cmVfbWF0Y2goc3RydWN0IGJwZl9nZW4gKmdlbikKLXsKLQlfX3M2NCBvZmY7Ci0JaW50IGk7Ci0KLQkvKgotCSAqIFJlamVjdCBpZiB0aGUgbWV0YWRhdGEgbWFwIGlzIG5vdCBleGNsdXNpdmUuIFdpdGhvdXQgZXhjbHVzaXZpdHkKLQkgKiB0aGUgY2FjaGVkIG1hcC0mZ3Q7c2hhW10gdmVyaWZpZWQgYWJvdmUgY2FuIGJlIHN0YWxlOiBhbm90aGVyIEJQRgotCSAqIHByb2dyYW0gd2l0aCBtYXAgYWNjZXNzIGNvdWxkIGhhdmUgbXV0YXRlZCB0aGUgY29udGVudHMgYmV0d2VlbgotCSAqIEJQRl9PQkpfR0VUX0lORk9fQllfRkQgYW5kIGxvYWRlciBleGVjdXRpb24uCi0JICovCi0JZW1pdDIoZ2VuLCBCUEZfTERfSU1NNjRfUkFXX0ZVTEwoQlBGX1JFR18xLCBCUEZfUFNFVURPX01BUF9JRFgsCi0JCQkJCSAwLCAwLCAwLCAwKSk7Ci0JZW1pdChnZW4sIEJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwgU0hBMjU2X0RJR0VTVF9MRU5HVEgpKTsKLQlvZmYgPSAtKGdlbi0mZ3Q7aW5zbl9jdXIgLSBnZW4tJmd0O2luc25fc3RhcnQgLSBnZW4tJmd0O2NsZWFudXBfbGFiZWwpIC8gOCAtIDI7Ci0JaWYgKGlzX3NpbW0xNihvZmYpKSB7Ci0JCWVtaXQoZ2VuLCBCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNywgLUVJTlZBTCkpOwotCQllbWl0KGdlbiwgQlBGX0pNUF9JTU0oQlBGX0pORSwgQlBGX1JFR18yLCAxLCBvZmYpKTsKLQl9IGVsc2UgewotCQlnZW4tJmd0O2Vycm9yID0gLUVSQU5HRTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpICZsdDsgU0hBMjU2X0RXT1JEX1NJWkU7IGkmIzQzOyYjNDM7KSB7Ci0JCWVtaXQyKGdlbiwgQlBGX0xEX0lNTTY0X1JBV19GVUxMKEJQRl9SRUdfMSwgQlBGX1BTRVVET19NQVBfSURYLAotCQkJCQkJIDAsIDAsIDAsIDApKTsKLQkJZW1pdChnZW4sIEJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsIGkgKiBzaXplb2YoX191NjQpKSk7Ci0JCWdlbi0mZ3Q7aGFzaF9pbnNuX29mZnNldFtpXSA9IGdlbi0mZ3Q7aW5zbl9jdXIgLSBnZW4tJmd0O2luc25fc3RhcnQ7Ci0JCWVtaXQyKGdlbiwgQlBGX0xEX0lNTTY0X1JBV19GVUxMKEJQRl9SRUdfMywgMCwgMCwgMCwgMCwgMCkpOwotCi0JCW9mZiA9IC0oZ2VuLSZndDtpbnNuX2N1ciAtIGdlbi0mZ3Q7aW5zbl9zdGFydCAtIGdlbi0mZ3Q7Y2xlYW51cF9sYWJlbCkgLyA4IC0gMjsKLQkJaWYgKGlzX3NpbW0xNihvZmYpKSB7Ci0JCQllbWl0KGdlbiwgQlBGX01PVjY0X0lNTShCUEZfUkVHXzcsIC1FSU5WQUwpKTsKLQkJCWVtaXQoZ2VuLCBCUEZfSk1QX1JFRyhCUEZfSk5FLCBCUEZfUkVHXzIsIEJQRl9SRUdfMywgb2ZmKSk7Ci0JCX0gZWxzZSB7Ci0JCQlnZW4tJmd0O2Vycm9yID0gLUVSQU5HRTsKLQkJfQotCX0KLX0KLQogdm9pZCBicGZfZ2VuX19yZWNvcmRfYXR0YWNoX3RhcmdldChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCBjaGFyICphdHRhY2hfbmFtZSwKIAkJCQkgICBlbnVtIGJwZl9hdHRhY2hfdHlwZSB0eXBlKQogewpAQCAtMTIxMSwxMCAmIzQzOzExNDksMTAgQEAgdm9pZCBicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgsIHZvaWQgKnB2YWx1ZSwKIAkgKiB9CiAJICoKIAkgKiBUaGUgcnVudGltZSBpbml0aWFsX3ZhbHVlIGNvbWVzIGZyb20gdGhlIGhvc3Qtc3VwcGxpZWQgbG9hZGVyCi0JICogY3R4IGFuZCB3b3VsZCBvdmVyd3JpdGUgdGhlIGJsb2IgdmFsdWUgYWZ0ZXIgZW1pdF9zaWduYXR1cmVfbWF0Y2goKQotCSAqIGhhcyBhbHJlYWR5IHZhbGlkYXRlZCBtYXAtJmd0O3NoYVtdLiBGb3IgYSBzaWduZWQgbG9hZGVyIChnZW5faGFzaCkKLQkgKiB0aGUgYXR0ZXN0ZWQgYmxvYiB2YWx1ZSBtdXN0IGJlIGF1dGhvcml0YXRpdmUsIHNvIHNraXAgdGhlIG92ZXJyaWRlCi0JICogYW5kIGxlYXZlIHRoZSBoYXNoZWQgdmFsdWUgaW4gcGxhY2UuCiYjNDM7CSAqIGN0eCBhbmQgd291bGQgb3ZlcndyaXRlIHRoZSBibG9iIHZhbHVlIHRoYXQgdGhlIHByb2dyYW0gc2lnbmF0dXJlCiYjNDM7CSAqIGNvdmVycyBhbmQgdGhlIGtlcm5lbCB2ZXJpZmllcyBhdCBsb2FkIHRpbWUuIEZvciBhIHNpZ25lZCBsb2FkZXIKJiM0MzsJICogKGdlbl9oYXNoKSB0aGUgYXR0ZXN0ZWQgYmxvYiB2YWx1ZSBtdXN0IGJlIGF1dGhvcml0YXRpdmUsIHNvIHNraXAKJiM0MzsJICogdGhlIG92ZXJyaWRlIGFuZCBsZWF2ZSB0aGUgc2lnbmVkIHZhbHVlIGluIHBsYWNlLgogCSAqLwogCWlmICghT1BUU19HRVQoZ2VuLSZndDtvcHRzLCBnZW5faGFzaCwgZmFsc2UpKSB7CiAJCWVtaXQoZ2VuLCBCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMywgQlBGX1JFR182LApkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9saWJicGZfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmgKaW5kZXggMDRjZDMwM2ZiNWE4NzkuLmQ1YjdkYjcwM2IzZmU5IDEwMDY0NAotLS0gYS90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmgKQEAgLTc2OCw3ICYjNDM7NzY4LDYgQEAgaW50IGVsZl9yZXNvbHZlX3BhdHRlcm5fb2Zmc2V0cyhjb25zdCBjaGFyICpiaW5hcnlfcGF0aCwgY29uc3QgY2hhciAqcGF0dGVybiwKIGludCBwcm9iZV9mZChpbnQgZmQpOwogCiAjZGVmaW5lIFNIQTI1Nl9ESUdFU1RfTEVOR1RIIDMyCi0jZGVmaW5lIFNIQTI1Nl9EV09SRF9TSVpFIFNIQTI1Nl9ESUdFU1RfTEVOR1RIIC8gc2l6ZW9mKF9fdTY0KQogCiB2b2lkIGxpYmJwZl9zaGEyNTYoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiwgX191OCBvdXRbU0hBMjU2X0RJR0VTVF9MRU5HVEhdKTsKIGludCBwcm9iZV9zeXNfYnBmX2V4dCh2b2lkKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmgKaW5kZXggNzQ1MDNkMzU4YmM4YTUuLjUzZmVlNTNkMzZkNTEyIDEwMDY0NAotLS0gYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaApAQCAtMTgsMTAgJiM0MzsxOCw2IEBACiAjaW5jbHVkZSAmIzM0O2JwZi5oJiMzNDsKICNlbmRpZgogCi0jaWZuZGVmIFNIQTI1Nl9ESUdFU1RfTEVOR1RICi0jZGVmaW5lIFNIQTI1Nl9ESUdFU1RfTEVOR1RIIDMyCi0jZW5kaWYKLQogI2lmbmRlZiBfX05SX2JwZgogIyBpZiBkZWZpbmVkKF9fbWlwc19fKSAmYW1wOyZhbXA7IGRlZmluZWQoX0FCSU8zMikKICMgIGRlZmluZSBfX05SX2JwZiA0MzU1CkBAIC0zMjAsMjUgJiM0MzszMTYsNiBAQCBzdGF0aWMgaW5saW5lIGludCBza2VsX2xpbmtfY3JlYXRlKGludCBwcm9nX2ZkLCBpbnQgdGFyZ2V0X2ZkLAogCXJldHVybiBza2VsX3N5c19icGYoQlBGX0xJTktfQ1JFQVRFLCAmYW1wO2F0dHIsIGF0dHJfc3opOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBza2VsX29ial9nZXRfaW5mb19ieV9mZChpbnQgZmQpCi17Ci0JY29uc3Qgc2l6ZV90IGF0dHJfc3ogPSBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwgaW5mbyk7Ci0JX191OCBzaGFbU0hBMjU2X0RJR0VTVF9MRU5HVEhdOwotCXN0cnVjdCBicGZfbWFwX2luZm8gaW5mbzsKLQlfX3UzMiBpbmZvX2xlbiA9IHNpemVvZihpbmZvKTsKLQl1bmlvbiBicGZfYXR0ciBhdHRyOwotCi0JbWVtc2V0KCZhbXA7aW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKLQlpbmZvLmhhc2ggPSAobG9uZykgJmFtcDtzaGE7Ci0JaW5mby5oYXNoX3NpemUgPSBTSEEyNTZfRElHRVNUX0xFTkdUSDsKLQotCW1lbXNldCgmYW1wO2F0dHIsIDAsIGF0dHJfc3opOwotCWF0dHIuaW5mby5icGZfZmQgPSBmZDsKLQlhdHRyLmluZm8uaW5mbyA9IChsb25nKSAmYW1wO2luZm87Ci0JYXR0ci5pbmZvLmluZm9fbGVuID0gaW5mb19sZW47Ci0JcmV0dXJuIHNrZWxfc3lzX2JwZihCUEZfT0JKX0dFVF9JTkZPX0JZX0ZELCAmYW1wO2F0dHIsIGF0dHJfc3opOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBza2VsX21hcF9mcmVlemUoaW50IGZkKQogewogCWNvbnN0IHNpemVfdCBhdHRyX3N6ID0gb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIG1hcF9mZCk7CkBAIC0zODQsMTIgJiM0MzszNjEsNiBAQCBzdGF0aWMgaW5saW5lIGludCBicGZfbG9hZF9hbmRfcnVuKHN0cnVjdCBicGZfbG9hZF9hbmRfcnVuX29wdHMgKm9wdHMpCiAJCXNldF9lcnI7CiAJCWdvdG8gb3V0OwogCX0KLQllcnIgPSBza2VsX29ial9nZXRfaW5mb19ieV9mZChtYXBfZmQpOwotCWlmIChlcnIgJmx0OyAwKSB7Ci0JCW9wdHMtJmd0O2VycnN0ciA9ICYjMzQ7ZmFpbGVkIHRvIGZldGNoIG9iaiBpbmZvJiMzNDs7Ci0JCXNldF9lcnI7Ci0JCWdvdG8gb3V0OwotCX0KICNlbmRpZgogCiAJbWVtc2V0KCZhbXA7YXR0ciwgMCwgcHJvZ19sb2FkX2F0dHJfc3opOwpAQCAtNDAwLDYgJiM0MzszNzEsOCBAQCBzdGF0aWMgaW5saW5lIGludCBicGZfbG9hZF9hbmRfcnVuKHN0cnVjdCBicGZfbG9hZF9hbmRfcnVuX29wdHMgKm9wdHMpCiAjaWZuZGVmIF9fS0VSTkVMX18KIAlhdHRyLnNpZ25hdHVyZSA9IChsb25nKSBvcHRzLSZndDtzaWduYXR1cmU7CiAJYXR0ci5zaWduYXR1cmVfc2l6ZSA9IG9wdHMtJmd0O3NpZ25hdHVyZV9zejsKJiM0MzsJaWYgKG9wdHMtJmd0O3NpZ25hdHVyZSkKJiM0MzsJCWF0dHIuZmRfYXJyYXlfY250ID0gMTsKICNlbHNlCiAJaWYgKG9wdHMtJmd0O3NpZ25hdHVyZSB8fCBvcHRzLSZndDtzaWduYXR1cmVfc3opCiAJCXByX3dhcm4oJiMzNDtzaWduYXR1cmVzIGFyZSBub3Qgc3VwcG9ydGVkIGZyb20gYnBmX3ByZWxvYWRcbiYjMzQ7KTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYwppbmRleCA1ZmM0MTdlMzFmYzYxNS4uNTZkMWYwNzJkZTRjMTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmMKQEAgLTExLDYgJiM0MzsxMSw4IEBACiAjaW5jbHVkZSAmbHQ7bGludXgva2V5Y3RsLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2J0Zi5oJmd0OwomIzQzOwogI2luY2x1ZGUgJiMzNDticGYvbGliYnBmX2ludGVybmFsLmgmIzM0OyAvKiBmb3IgbGliYnBmX3NoYTI1NigpICovCiAjaW5jbHVkZSAmIzM0O2JwZi9za2VsX2ludGVybmFsLmgmIzM0OwkgLyogZm9yIGxvYWRlciBjdHggbGF5b3V0IChicGZfbG9hZGVyX2N0eCBldGMpICovCiAKQEAgLTE5LDggJiM0MzsyMSw2IEBACiAjaW5jbHVkZSAmIzM0O3Rlc3Rfc2lnbmVkX2xvYWRlcl9kYXRhLnNrZWwuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O3Rlc3Rfc2lnbmVkX2xvYWRlcl9sc20uc2tlbC5oJiMzNDsKIAotI2RlZmluZSBTSUdfTUFUQ0hfSU5TTlMgMzMgLyogZXhjbCAoNSkgJiM0MzsgNCAqIHNoYS1kd29yZCAoNykgKi8KLQogZW51bSB7CiAJQlBGX1NJR19VTlNJR05FRCA9IDAsCiAJQlBGX1NJR19WRVJJRklFRCwKQEAgLTM1LDcgJiM0MzszNSw4IEBAIGVudW0gewogfTsKIAogc3RhdGljIGludCBsb2FkX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osIGludCBtYXBfZmQsCi0JCSAgICAgICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZCkKJiM0MzsJCSAgICAgICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZCwKJiM0MzsJCSAgICAgICBfX3UzMiBmZF9hcnJheV9jbnQpCiB7CiAJdW5pb24gYnBmX2F0dHIgYXR0cjsKIAlpbnQgZmQ7CkBAIC01Miw2ICYjNDM7NTMsNyBAQCBzdGF0aWMgaW50IGxvYWRfbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCwKIAkJYXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejsKIAkJYXR0ci5rZXlyaW5nX2lkID0ga2V5cmluZ19pZDsKIAl9CiYjNDM7CWF0dHIuZmRfYXJyYXlfY250ID0gZmRfYXJyYXlfY250OwogCW1lbWNweShhdHRyLnByb2dfbmFtZSwgJiMzNDtfX2xvYWRlci5wcm9nJiMzNDssIHNpemVvZigmIzM0O19fbG9hZGVyLnByb2cmIzM0OykpOwogCWZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgJmFtcDthdHRyLAogCQkgICAgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7CkBAIC02MiwxNCAmIzQzOzY0LDEyIEBAIHN0YXRpYyBpbnQgcnVuX2dlbl9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LAogCQkJICBjb25zdCB2b2lkICpkYXRhLCBfX3UzMiBkYXRhX3N6LAogCQkJICBjb25zdCB2b2lkICpleGNsLCBfX3UzMiBleGNsX3N6LAogCQkJICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwKLQkJCSAgYm9vbCBnZXRfaGFzaCwgdm9pZCAqY3R4LCBfX3UzMiBjdHhfc3osIGJvb2wgKmxvYWRlcl9yYW4pCiYjNDM7CQkJICB2b2lkICpjdHgsIF9fdTMyIGN0eF9zeiwgYm9vbCAqbG9hZGVyX3JhbikKIHsKIAlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBtb3B0cywKIAkJICAgIC5leGNsX3Byb2dfaGFzaCA9IGV4Y2wsCiAJCSAgICAuZXhjbF9wcm9nX2hhc2hfc2l6ZSA9IGV4Y2xfc3opOwotCV9fdTggaGJ1ZltTSEEyNTZfRElHRVNUX0xFTkdUSF07Ci0Jc3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvOwotCV9fdTMyIGlsZW4gPSBzaXplb2YoaW5mbyksIGtleSA9IDA7CiYjNDM7CV9fdTMyIGtleSA9IDA7CiAJdW5pb24gYnBmX2F0dHIgYXR0cjsKIAlpbnQgbWFwX2ZkLCBwcm9nX2ZkLCByZXQ7CiAKQEAgLTg3LDE1ICYjNDM7ODcsNiBAQCBzdGF0aWMgaW50IHJ1bl9nZW5fbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwKIAkJcmV0ID0gLWVycm5vOwogCQlnb3RvIG91dF9tYXA7CiAJfQotCWlmIChnZXRfaGFzaCkgewotCQltZW1zZXQoJmFtcDtpbmZvLCAwLCBzaXplb2YoaW5mbykpOwotCQlpbmZvLmhhc2ggPSBwdHJfdG9fdTY0KGhidWYpOwotCQlpbmZvLmhhc2hfc2l6ZSA9IHNpemVvZihoYnVmKTsKLQkJaWYgKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQobWFwX2ZkLCAmYW1wO2luZm8sICZhbXA7aWxlbikpIHsKLQkJCXJldCA9IC1lcnJubzsKLQkJCWdvdG8gb3V0X21hcDsKLQkJfQotCX0KIAogCW1lbXNldCgmYW1wO2F0dHIsIDAsIHNpemVvZihhdHRyKSk7CiAJYXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7CkBAIC0xMDgsNiAmIzQzOzk5LDcgQEAgc3RhdGljIGludCBydW5fZ2VuX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osCiAJCWF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpOwogCQlhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6OwogCQlhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7CiYjNDM7CQlhdHRyLmZkX2FycmF5X2NudCA9IDE7CiAJfQogCW1lbWNweShhdHRyLnByb2dfbmFtZSwgJiMzNDtfX2xvYWRlci5wcm9nJiMzNDssIHNpemVvZigmIzM0O19fbG9hZGVyLnByb2cmIzM0OykpOwogCXByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCAmYW1wO2F0dHIsCkBAIC0yMzYsNzkgJiM0MzsyMjgsNiBAQCBzdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgY2hlY2tfc2lnX21hdGNoX3NoYXBlKGNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW4sIGludCBuKQotewotCWludCBhID0gLTEsIGNsZWFudXAgPSAtMSwgaSwgYmFzZSwgdCwgYnJbNV0sIG5iID0gMDsKLQotCS8qIEJQRl9QU0VVRE9fTUFQX0lEWCAodGhlIHN0cnVjdCBicGZfbWFwICogZm9ybSkgaXMgdXNlZCBvbmx5IGhlcmUuICovCi0JZm9yIChpID0gMDsgaSAmIzQzOyAxICZsdDsgbjsgaSYjNDM7JiM0MzspIHsKLQkJaWYgKGluW2ldLmNvZGUgPT0gKEJQRl9MRCB8IEJQRl9JTU0gfCBCUEZfRFcpICZhbXA7JmFtcDsKLQkJICAgIGluW2ldLnNyY19yZWcgPT0gQlBGX1BTRVVET19NQVBfSURYKSB7Ci0JCQlhID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICghQVNTRVJUX0dFKGEsIDAsICYjMzQ7ZW1pdF9zaWduYXR1cmVfbWF0Y2ggcHJlc2VudCYjMzQ7KSkKLQkJcmV0dXJuOwotCWlmICghQVNTRVJUX0xFKGEgJiM0MzsgU0lHX01BVENIX0lOU05TLCBuLCAmIzM0O2Jsb2NrIGZpdHMgaW4gcHJvZ3JhbSYjMzQ7KSkKLQkJcmV0dXJuOwotCi0JLyogZXhjbCBjaGVjazogcjIgPSAqKHUzMiAqKShtYXAgJiM0MzsgMzIpOyBpZiByMiAhPSAxIGdvdG8gY2xlYW51cCAqLwotCUFTU0VSVF9FUShpblthICYjNDM7IDJdLmNvZGUsIChCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9XKSwgJiMzNDtleGNsIGxvYWQgd2lkdGgmIzM0Oyk7Ci0JQVNTRVJUX0VRKGluW2EgJiM0MzsgMl0ub2ZmLCBTSEEyNTZfRElHRVNUX0xFTkdUSCwgJiMzNDtleGNsIGZpZWxkIG9mZnNldCYjMzQ7KTsKLQlBU1NFUlRfRVEoaW5bYSAmIzQzOyA0XS5jb2RlLCAoQlBGX0pNUCB8IEJQRl9KTkUgfCBCUEZfSyksICYjMzQ7ZXhjbCBicmFuY2ggb3AmIzM0Oyk7Ci0JQVNTRVJUX0VRKGluW2EgJiM0MzsgNF0uaW1tLCAxLCAmIzM0O2V4Y2wgY29tcGFyZWQgdG8gMSYjMzQ7KTsKLQlicltuYiYjNDM7JiM0MztdID0gYSAmIzQzOyA0OwotCi0JLyogNCBzaGEtZHdvcmQgY2hlY2tzOiByMiA9ICoodTY0ICopKG1hcCAmIzQzOyBpKjgpOyBpZiByMiAhPSByMyBnb3RvIGNsZWFudXAgKi8KLQlmb3IgKGkgPSAwOyBpICZsdDsgNDsgaSYjNDM7JiM0MzspIHsKLQkJYmFzZSA9IGEgJiM0MzsgNSAmIzQzOyBpICogNzsKLQkJQVNTRVJUX0VRKGluW2Jhc2UgJiM0MzsgMl0uY29kZSwgKEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX0RXKSwgJiMzNDtzaGEgbG9hZCB3aWR0aCYjMzQ7KTsKLQkJQVNTRVJUX0VRKGluW2Jhc2UgJiM0MzsgMl0ub2ZmLCBpICogOCwgJiMzNDtzaGEgZHdvcmQgb2Zmc2V0JiMzNDspOwotCQlBU1NFUlRfRVEoaW5bYmFzZSAmIzQzOyAzXS5jb2RlLCAoQlBGX0xEIHwgQlBGX0lNTSB8IEJQRl9EVyksICYjMzQ7c2hhIGltbTY0IChIX21ldGEpJiMzNDspOwotCQlBU1NFUlRfRVEoaW5bYmFzZSAmIzQzOyA2XS5jb2RlLCAoQlBGX0pNUCB8IEJQRl9KTkUgfCBCUEZfWCksICYjMzQ7c2hhIGJyYW5jaCBvcCYjMzQ7KTsKLQkJYnJbbmImIzQzOyYjNDM7XSA9IGJhc2UgJiM0MzsgNjsKLQl9Ci0KLQkvKgotCSAqIExvY2F0ZSB0aGUgcmVhbCBjbGVhbnVwIGxhYmVsIHNvIHdlIGNhbiBwaW4gdGhlIGV4YWN0IGp1bXAgdGFyZ2V0LAotCSAqIG5vdCBqdXN0ICYjMzQ7c29tZSBiYWNrd2FyZCBsYWJlbCYjMzQ7LiBicGZfZ2VuX19pbml0KCkgZW1pdHMgdGhlIGNsZWFudXAKLQkgKiBibG9jayBhcyBhIHByb2ctZmQgY2xvc2UgbG9vcCB3aG9zZSBmaXJzdCBpbnN0cnVjdGlvbiBpcyB0aGUgbGFiZWwKLQkgKiBldmVyeSBlcnJvciBicmFuY2gganVtcHMgdG8uCi0JICovCi0JZm9yIChpID0gMDsgaSAmIzQzOyAyICZsdDsgYTsgaSYjNDM7JiM0MzspIHsKLQkJaWYgKGluW2ldLmNvZGUgPT0gKEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX1cpICZhbXA7JmFtcDsKLQkJICAgIGluW2ldLmRzdF9yZWcgPT0gQlBGX1JFR18xICZhbXA7JmFtcDsgaW5baV0uc3JjX3JlZyA9PSBCUEZfUkVHXzEwICZhbXA7JmFtcDsKLQkJICAgIGluW2kgJiM0MzsgMV0uY29kZSA9PSAoQlBGX0pNUCB8IEJQRl9KU0xFIHwgQlBGX0spICZhbXA7JmFtcDsKLQkJICAgIGluW2kgJiM0MzsgMV0uZHN0X3JlZyA9PSBCUEZfUkVHXzEgJmFtcDsmYW1wOyBpbltpICYjNDM7IDFdLmltbSA9PSAwICZhbXA7JmFtcDsKLQkJICAgIGluW2kgJiM0MzsgMV0ub2ZmID09IDEgJmFtcDsmYW1wOwotCQkgICAgaW5baSAmIzQzOyAyXS5jb2RlID09IChCUEZfSk1QIHwgQlBGX0NBTEwpICZhbXA7JmFtcDsKLQkJICAgIGluW2kgJiM0MzsgMl0uaW1tID09IEJQRl9GVU5DX3N5c19jbG9zZSkgewotCQkJY2xlYW51cCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoIUFTU0VSVF9HRShjbGVhbnVwLCAwLCAmIzM0O2NsZWFudXAgbGFiZWwgbG9jYXRlZCYjMzQ7KSkKLQkJcmV0dXJuOwotCWZvciAoaSA9IDA7IGkgJmx0OyBuYjsgaSYjNDM7JiM0MzspIHsKLQkJdCA9IGJyW2ldICYjNDM7IDEgJiM0MzsgaW5bYnJbaV1dLm9mZjsKLQkJQVNTRVJUX0VRKHQsIGNsZWFudXAsICYjMzQ7c2lnLW1hdGNoIGxhbmRzIG9uIGNsZWFudXAmIzM0Oyk7Ci0JfQotCS8qCi0JICogU2FtZSBpbnZhcmlhbnQgZm9yIGV2ZXJ5IG90aGVyIGNsZWFudXAtYm91bmQganVtcCBpbiB0aGUgcHJvZ3JhbToKLQkgKiBlbWl0X2NoZWNrX2VycigpIGlzIHRoZSBvbmx5IHNvdXJjZSBvZiAmIzM0O2lmIChyNyAmbHQ7IDApIGdvdG8gY2xlYW51cCYjMzQ7LAotCSAqIHNvIGVhY2ggb2YgdGhvc2UgbXVzdCBhbHNvIHJlc29sdmUgZXhhY3RseSB0byBjbGVhbnVwLgotCSAqLwotCWZvciAoaSA9IDAsIHQgPSAwOyBpICZsdDsgbjsgaSYjNDM7JiM0MzspIHsKLQkJaWYgKGluW2ldLmNvZGUgIT0gKEJQRl9KTVAgfCBCUEZfSlNMVCB8IEJQRl9LKSB8fAotCQkgICAgaW5baV0uZHN0X3JlZyAhPSBCUEZfUkVHXzcgfHwgaW5baV0uaW1tICE9IDAgfHwgaW5baV0ub2ZmICZndDs9IDApCi0JCQljb250aW51ZTsKLQkJQVNTRVJUX0VRKGkgJiM0MzsgMSAmIzQzOyBpbltpXS5vZmYsIGNsZWFudXAsICYjMzQ7ZXJyLWNoZWNrIGxhbmRzIG9uIGNsZWFudXAmIzM0Oyk7Ci0JCXQmIzQzOyYjNDM7OwotCX0KLQlBU1NFUlRfR1QodCwgMCwgJiMzNDtmb3VuZCBlbWl0X2NoZWNrX2VyciBqdW1wcyYjMzQ7KTsKLX0KLQogc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSB7CiAJc3RydWN0IHRlc3Rfc2lnbmVkX2xvYWRlciAqc2tlbDsKIAlzdHJ1Y3QgZ2VuX2xvYWRlcl9vcHRzIGdvcHRzOwpAQCAtMzcyLDE2ICYjNDM7MjkxLDYgQEAgc3RhdGljIHZvaWQgZ2VuX2xvYWRlcl9maXh0dXJlX2Zpbmkoc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSAqZikKIAl0ZXN0X3NpZ25lZF9sb2FkZXJfX2Rlc3Ryb3koZi0mZ3Q7c2tlbCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1ldGFkYXRhX2NoZWNrX3NoYXBlKHZvaWQpCi17Ci0Jc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmOwotCi0JaWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KCZhbXA7ZikgPT0gMCkKLQkJY2hlY2tfc2lnX21hdGNoX3NoYXBlKChjb25zdCBzdHJ1Y3QgYnBmX2luc24gKilmLmdvcHRzLmluc25zLAotCQkJCSAgICAgIGYuZ29wdHMuaW5zbnNfc3ogLyBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKSk7Ci0JZ2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoJmFtcDtmKTsKLX0KLQogc3RhdGljIHZvaWQgbWV0YWRhdGFfbWF0Y2godm9pZCkKIHsKIAlzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7CkBAIC0zOTEsOTQgJiM0MzszMDAsMjYzIEBAIHN0YXRpYyB2b2lkIG1ldGFkYXRhX21hdGNoKHZvaWQpCiAJaWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KCZhbXA7ZikgPT0gMCkgewogCQlyID0gcnVuX2dlbl9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLAogCQkJCSAgIGYuZGF0YV9zeiwgZi5leGNsLCBzaXplb2YoZi5leGNsKSwgTlVMTCwgMCwKLQkJCQkgICB0cnVlLCBmLmN0eCwgZi5jdHhfc3osICZhbXA7cmFuKTsKJiM0MzsJCQkJICAgZi5jdHgsIGYuY3R4X3N6LCAmYW1wO3Jhbik7CiAJCUFTU0VSVF9UUlVFKHJhbiwgJiMzNDtsb2FkZXIgcmFuJiMzNDspOwogCQlBU1NFUlRfRVEociwgMCwgJiMzNDtob25lc3QgbG9hZGVyIHJldHZhbCYjMzQ7KTsKIAl9CiAJZ2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoJmFtcDtmKTsKIH0KIAotc3RhdGljIHZvaWQgbWV0YWRhdGFfc2hhX21pc21hdGNoKHZvaWQpCiYjNDM7c3RhdGljIHZvaWQgc2lnbmF0dXJlX2VuZm9yY2VkKHZvaWQpCiB7CiYjNDM7CXN0YXRpYyBjb25zdCBfX3U4IGp1bmtbNjRdID0geyAweDMwLCAweDQyLCAweDEzLCAweDM3LCB9OwogCXN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjsKLQlib29sIHJhbjsKLQlpbnQgcjsKJiM0MzsJaW50IGZkOwogCiAJaWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KCZhbXA7ZikgPT0gMCkgewogCQkvKgotCQkgKiBibG9iWzBdIGxpdmVzIGluIHRoZSBsb2FkZXImIzM5O3MgZmRfYXJyYXkgc2NyYXRjaCAoZmlyc3QgYWRkX2RhdGEgaW4KLQkJICogYnBmX2dlbl9faW5pdCk7IGEgMC1tYXAgcHJvZ3JhbSBuZXZlciByZWFkcyBpdCwgc28gZmxpcHBpbmcgaXQKLQkJICogY2hhbmdlcyBvbmx5IG1hcC0mZ3Q7c2hhLiBUaGUgbWV0YWRhdGEgY2hlY2sgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdAotCQkgKiBjYW4gbm90aWNlIC0mZ3Q7IGlzb2xhdGVzIGVtaXRfc2lnbmF0dXJlX21hdGNoLgomIzQzOwkJICogQSBwcmVzZW50LWJ1dC1pbnZhbGlkIHNpZ25hdHVyZSAodGhlIGNlcnQgYnl0ZXMgYXJlIG5vdCBhCiYjNDM7CQkgKiBQS0NTIzcgc2lnbmF0dXJlKSBtdXN0IGJlIHJlamVjdGVkIGF0IGxvYWQ6IHRoZSBzaWduYXR1cmUKJiM0MzsJCSAqIHBhdGggaXMgaG9ub3JlZCwgbm90IGlnbm9yZWQuIChUaGUgdmFsaWQgcGF0aCBpcyBjb3ZlcmVkIGJ5CiYjNDM7CQkgKiB0aGUgc2lnbmVkIGxza2Vscy4pIFBpbiAtRUJBRE1TRywgdGhlIFBLQ1MjNyBwYXJzZSBmYWlsdXJlOgomIzQzOwkJICogYSBsb29zZXIgZmQgJmx0OyAwIGNoZWNrIGNvdWxkIGFsc28gYmUgc2F0aXNmaWVkIGJ5IHRoZSBzcGFyc2UKJiM0MzsJCSAqIGZkX2FycmF5IHJlamVjdGlvbiAoLUVBQ0NFUykgdGhhdCB0aGUgbG9hZGVyJiMzOTtzIG1hcCByZWZlcmVuY2UKJiM0MzsJCSAqIHdvdWxkIHRyaXAgZXZlbiBpZiB0aGUgc2lnbmF0dXJlIHdlcmUgc2lsZW50bHkgaWdub3JlZC4KIAkJICovCi0JCWYuYmxvYlswXSBePSAweGZmOwotCQlyID0gcnVuX2dlbl9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLAotCQkJCSAgIGYuZGF0YV9zeiwgZi5leGNsLCBzaXplb2YoZi5leGNsKSwgTlVMTCwgMCwKLQkJCQkgICB0cnVlLCBmLmN0eCwgZi5jdHhfc3osICZhbXA7cmFuKTsKLQkJQVNTRVJUX1RSVUUocmFuLCAmIzM0O2xvYWRlciByYW4mIzM0Oyk7Ci0JCUFTU0VSVF9FUShyLCAtRUlOVkFMLCAmIzM0O3RhbXBlcmVkIGJsb2IgcmVqZWN0ZWQgYnkgZW1pdF9zaWduYXR1cmVfbWF0Y2gmIzM0Oyk7CiYjNDM7CQlmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLAomIzQzOwkJCQkgc2l6ZW9mKGp1bmspLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDApOwomIzQzOwkJQVNTRVJUX0VRKGZkLCAtRUJBRE1TRywgJiMzNDtpbnZhbGlkIHNpZ25hdHVyZSByZWplY3RlZCBhdCBsb2FkJiMzNDspOwogCX0KIAlnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaSgmYW1wO2YpOwogfQogCi1zdGF0aWMgdm9pZCBtZXRhZGF0YV9ub3RfZXhjbHVzaXZlKHZvaWQpCiYjNDM7c3RhdGljIHZvaWQgc2lnbmVkX25vbmV4Y2xfZmRfYXJyYXlfcmVqZWN0ZWQodm9pZCkKIHsKJiM0MzsJc3RhdGljIGNvbnN0IF9fdTgganVua1s2NF0gPSB7IDB4MzAsIDB4NDIsIDB4MTMsIDB4MzcsIH07CiAJc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmOwotCWJvb2wgcmFuOwotCWludCByOwomIzQzOwlpbnQgbWFwX2ZkLCBmZDsKIAogCWlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdCgmYW1wO2YpID09IDApIHsKIAkJLyoKLQkJICogQ29ycmVjdCBibG9iIGJ1dCBhIG5vbi1leGNsdXNpdmUgbWV0YWRhdGEgbWFwOiB0aGUgdmVyaWZpZXIgZG9lcwotCQkgKiBub3QgcmVqZWN0IChleGNsX3Byb2dfc2hhIHVuc2V0KSwgc28gdGhlIHJ1bnRpbWUgbWFwLSZndDtleGNsID09IDEKLQkJICogY2hlY2sgaW4gdGhlIGxvYWRlciBtdXN0LgomIzQzOwkJICogQSBzaWduZWQgcHJvZ3JhbSBtYXkgb25seSBiaW5kIGV4Y2x1c2l2ZSBtYXBzIHRocm91Z2ggZmRfYXJyYXkKJiM0MzsJCSAqICh0aGVpciBjb250ZW50cyBhcmUgZm9sZGVkIGludG8gdGhlIHNpZ25hdHVyZSkuIEJpbmRpbmcgYQomIzQzOwkJICogbm9uLWV4Y2x1c2l2ZSBtYXAgaXMgcmVqZWN0ZWQsIGJlZm9yZSB0aGUgc2lnbmF0dXJlIGlzIGV2ZW4KJiM0MzsJCSAqIGV4YW1pbmVkLgogCQkgKi8KLQkJciA9IHJ1bl9nZW5fbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYiwKLQkJCQkgICBmLmRhdGFfc3osIE5VTEwsIDAsIE5VTEwsIDAsIHRydWUsIGYuY3R4LAotCQkJCSAgIGYuY3R4X3N6LCAmYW1wO3Jhbik7Ci0JCUFTU0VSVF9UUlVFKHJhbiwgJiMzNDtsb2FkZXIgcmFuJiMzNDspOwotCQlBU1NFUlRfRVEociwgLUVJTlZBTCwgJiMzNDtub24tZXhjbHVzaXZlIG1ldGFkYXRhIG1hcCByZWplY3RlZCYjMzQ7KTsKJiM0MzsJCW1hcF9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWSwgJiMzNDtub25leGNsJiMzNDssIDQsCiYjNDM7CQkJCQlmLmRhdGFfc3osIDEsIE5VTEwpOwomIzQzOwkJaWYgKEFTU0VSVF9PS19GRChtYXBfZmQsICYjMzQ7bm9uZXhjbF9tYXAmIzM0OykpIHsKJiM0MzsJCQlpZiAoQVNTRVJUX09LKGJwZl9tYXBfZnJlZXplKG1hcF9mZCksICYjMzQ7ZnJlZXplJiMzNDspKSB7CiYjNDM7CQkJCWZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwKJiM0MzsJCQkJCQkgbWFwX2ZkLCBqdW5rLCBzaXplb2YoanVuayksCiYjNDM7CQkJCQkJIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7CiYjNDM7CQkJCUFTU0VSVF9FUShmZCwgLUVQRVJNLAomIzQzOwkJCQkJICAmIzM0O25vbi1leGNsdXNpdmUgbWFwIGluIHNpZ25lZCBmZF9hcnJheSByZWplY3RlZCYjMzQ7KTsKJiM0MzsJCQkJaWYgKGZkICZndDs9IDApCiYjNDM7CQkJCQljbG9zZShmZCk7CiYjNDM7CQkJfQomIzQzOwkJCWNsb3NlKG1hcF9mZCk7CiYjNDM7CQl9CiAJfQogCWdlbl9sb2FkZXJfZml4dHVyZV9maW5pKCZhbXA7Zik7CiB9CiAKLXN0YXRpYyB2b2lkIG1ldGFkYXRhX2hhc2hfbm90X2NvbXB1dGVkKHZvaWQpCiYjNDM7c3RhdGljIHZvaWQgc2lnbmVkX3VuZnJvemVuX2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpCiB7CiYjNDM7CXN0YXRpYyBjb25zdCBfX3U4IGp1bmtbNjRdID0geyAweDMwLCAweDQyLCAweDEzLCAweDM3LCB9OwomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBtb3B0cyk7CiAJc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmOwotCWJvb2wgcmFuOwotCWludCByOwomIzQzOwlfX3UzMiBrZXkgPSAwOwomIzQzOwlpbnQgbWFwX2ZkLCBmZDsKIAogCWlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdCgmYW1wO2YpID09IDApIHsKIAkJLyoKLQkJICogQ29ycmVjdCwgZXhjbHVzaXZlLCBmcm96ZW4gbWFwLCBidXQgaXRzIGhhc2ggd2FzIG5ldmVyIGNvbXB1dGVkCi0JCSAqIChubyBPQkpfR0VUX0lORk9fQllfRkQpLCBzbyBtYXAtJmd0O3NoYSBzdGF5cyB6ZXJvLiBUaGUgbG9hZGVyIG11c3QKLQkJICogZmFpbCBjbG9zZWQgcmF0aGVyIHRoYW4gdHJlYXQgYW4gdW5zZXQgaGFzaCBhcyBhIG1hdGNoLgomIzQzOwkJICogVGhlIG1ldGFkYXRhIG1hcCBtdXN0IGJlIGZyb3plbiBiZWZvcmUgYSBzaWduZWQgbG9hZCBzbyB0aGUKJiM0MzsJCSAqIGZvbGRlZCBieXRlcyBjYW5ub3QgY2hhbmdlIGFmdGVyd2FyZHMuIEJpbmQgYW4gZXhjbHVzaXZlIG1hcAomIzQzOwkJICogd2l0aCBtYXRjaGluZyBjb250ZW50cyBidXQgc2tpcCB0aGUgZnJlZXplOiB0aGUgbG9hZCBtdXN0IGJlCiYjNDM7CQkgKiByZWplY3RlZCBieSB0aGUgZnJvemVuIGNoZWNrIHdpdGggLUVQRVJNLiBUaGUgZXhjbHVzaXZpdHkKJiM0MzsJCSAqIGNoZWNrIHJpZ2h0IGFmdGVyIGl0IHdvdWxkIHBhc3MsIHNvIHRoZSBlcnJubyB1bmlxdWVseSBwaW5zCiYjNDM7CQkgKiB0aGUgZnJlZXplIHJlcXVpcmVtZW50LgogCQkgKi8KLQkJciA9IHJ1bl9nZW5fbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYiwKLQkJCQkgICBmLmRhdGFfc3osIGYuZXhjbCwgc2l6ZW9mKGYuZXhjbCksIE5VTEwsIDAsCi0JCQkJICAgZmFsc2UsIGYuY3R4LCBmLmN0eF9zeiwgJmFtcDtyYW4pOwotCQlBU1NFUlRfVFJVRShyYW4sICYjMzQ7bG9hZGVyIHJhbiYjMzQ7KTsKLQkJQVNTRVJUX0VRKHIsIC1FSU5WQUwsICYjMzQ7dW5jb21wdXRlZCBtZXRhZGF0YSBoYXNoIHJlamVjdGVkJiMzNDspOwomIzQzOwkJbW9wdHMuZXhjbF9wcm9nX2hhc2ggPSBmLmV4Y2w7CiYjNDM7CQltb3B0cy5leGNsX3Byb2dfaGFzaF9zaXplID0gc2l6ZW9mKGYuZXhjbCk7CiYjNDM7CQltYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVksICYjMzQ7dW5mcm96ZW4mIzM0OywgNCwKJiM0MzsJCQkJCWYuZGF0YV9zeiwgMSwgJmFtcDttb3B0cyk7CiYjNDM7CQlpZiAoQVNTRVJUX09LX0ZEKG1hcF9mZCwgJiMzNDt1bmZyb3plbl9tYXAmIzM0OykpIHsKJiM0MzsJCQlpZiAoQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwX2ZkLCAmYW1wO2tleSwgZi5ibG9iLCAwKSwKJiM0MzsJCQkJICAgICAgJiMzNDt1cGRhdGUmIzM0OykpIHsKJiM0MzsJCQkJZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LAomIzQzOwkJCQkJCSBtYXBfZmQsIGp1bmssIHNpemVvZihqdW5rKSwKJiM0MzsJCQkJCQkgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAxKTsKJiM0MzsJCQkJQVNTRVJUX0VRKGZkLCAtRVBFUk0sCiYjNDM7CQkJCQkgICYjMzQ7dW5mcm96ZW4gbWFwIGluIHNpZ25lZCBmZF9hcnJheSByZWplY3RlZCYjMzQ7KTsKJiM0MzsJCQkJaWYgKGZkICZndDs9IDApCiYjNDM7CQkJCQljbG9zZShmZCk7CiYjNDM7CQkJfQomIzQzOwkJCWNsb3NlKG1hcF9mZCk7CiYjNDM7CQl9CiAJfQogCWdlbl9sb2FkZXJfZml4dHVyZV9maW5pKCZhbXA7Zik7CiB9CiAKLXN0YXRpYyB2b2lkIHNpZ25hdHVyZV9lbmZvcmNlZCh2b2lkKQomIzQzO3N0YXRpYyB2b2lkIHNpZ25lZF9ub25hcnJheV9mZF9hcnJheV9yZWplY3RlZCh2b2lkKQogewogCXN0YXRpYyBjb25zdCBfX3U4IGp1bmtbNjRdID0geyAweDMwLCAweDQyLCAweDEzLCAweDM3LCB9OwomIzQzOwlMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBtb3B0cyk7CiAJc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmOwomIzQzOwlpbnQgbWFwX2ZkLCBmZDsKJiM0MzsKJiM0MzsJaWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KCZhbXA7ZikgPT0gMCkgewomIzQzOwkJLyoKJiM0MzsJCSAqIE9ubHkgYSBwbGFpbiBCUEZfTUFQX1RZUEVfQVJSQVkgbWF5IGJlIGZvbGRlZCBpbnRvIHRoZQomIzQzOwkJICogc2lnbmF0dXJlLiBBbiBleGNsdXNpdmUgbWFwIG9mIGFueSBvdGhlciB0eXBlIGlzIHJlamVjdGVkCiYjNDM7CQkgKiAoLUVJTlZBTCkgcmF0aGVyIHRoYW4gZm9sZGVkIC0gdGhpcyBpcyB0aGUgdHlwZSBnYXRlIHRoYXQKJiM0MzsJCSAqIGtlZXBzIGFyZW5hIG1hcHMgKG1hcF9kaXJlY3RfdmFsdWVfYWRkcigpIHJldHVybnMgYSB1c2VyCiYjNDM7CQkgKiBhZGRyZXNzKSBhbmQgaW5zbi1hcnJheSBtYXBzIChidWZmZXIgc21hbGxlciB0aGFuIHZhbHVlX3NpemUpCiYjNDM7CQkgKiBvdXQgb2YgdGhlIGhhc2hlZCByZWdpb24sIHdoZXJlIHRoZSBvbGQgY29kZSB3b3VsZCBoYXZlCiYjNDM7CQkgKiBtZW1jcHkoKSYjMzk7ZCBmcm9tIHRoZW0uIEEgaGFzaCBtYXAgc3RhbmRzIGluIGhlcmU6IGl0IGlzCiYjNDM7CQkgKiBleGNsdXNpdmUgKGJvdW5kIHRvIHRoZSBsb2FkZXIgZGlnZXN0KSBidXQgbm90IGFuIGFycmF5LgomIzQzOwkJICovCiYjNDM7CQltb3B0cy5leGNsX3Byb2dfaGFzaCA9IGYuZXhjbDsKJiM0MzsJCW1vcHRzLmV4Y2xfcHJvZ19oYXNoX3NpemUgPSBzaXplb2YoZi5leGNsKTsKJiM0MzsJCW1hcF9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCAmIzM0O2V4Y2xfaGFzaCYjMzQ7LCA0LCA0LCAxLAomIzQzOwkJCQkJJmFtcDttb3B0cyk7CiYjNDM7CQlpZiAoQVNTRVJUX09LX0ZEKG1hcF9mZCwgJiMzNDtleGNsX2hhc2hfbWFwJiMzNDspKSB7CiYjNDM7CQkJZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsCiYjNDM7CQkJCQkganVuaywgc2l6ZW9mKGp1bmspLAomIzQzOwkJCQkJIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7CiYjNDM7CQkJQVNTRVJUX0VRKGZkLCAtRUlOVkFMLAomIzQzOwkJCQkgICYjMzQ7bm9uLWFycmF5IG1hcCBpbiBzaWduZWQgZmRfYXJyYXkgcmVqZWN0ZWQmIzM0Oyk7CiYjNDM7CQkJaWYgKGZkICZndDs9IDApCiYjNDM7CQkJCWNsb3NlKGZkKTsKJiM0MzsJCQljbG9zZShtYXBfZmQpOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CWdlbl9sb2FkZXJfZml4dHVyZV9maW5pKCZhbXA7Zik7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgc2V0dXBfbWV0YV9tYXAoY29uc3Qgc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSAqZik7CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgc2lnbmVkX2J0Zl9mZF9hcnJheV9yZWplY3RlZCh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciBkaXJfdG1wbFtdID0gJiMzNDsvdG1wL3NpZ25lZF9sb2FkZXJfYnRmWFhYWFhYJiMzNDssICpkaXIgPSBOVUxMOwomIzQzOwlfX3UzMiBzaWdfc3ogPSA4MTkyOwomIzQzOwlpbnQgbWFwX2ZkID0gLTEsIHByb2dfZmQgPSAtMTsKJiM0MzsJdW5zaWduZWQgY2hhciAqYnVmID0gTlVMTDsKJiM0MzsJc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmOwomIzQzOwlib29sIGhhdmVfZml4dHVyZSA9IGZhbHNlOwomIzQzOwlzdHJ1Y3QgYnRmICpidGYgPSBOVUxMOwomIzQzOwl1bmlvbiBicGZfYXR0ciBhdHRyOwomIzQzOwlpbnQgZmRzWzJdOwomIzQzOwlfX3U4IHNpZ1s4MTkyXTsKJiM0MzsKJiM0MzsJc3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCAmIzM0O2tleXJpbmcmIzM0OywgJiMzNDtfdWlkLjAmIzM0OywgTlVMTCwKJiM0MzsJCUtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7CiYjNDM7CWRpciA9IG1rZHRlbXAoZGlyX3RtcGwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCAmIzM0O21rZHRlbXAmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwJiMzNDssIGRpciksICYjMzQ7dmVyaWZ5X3NpZ19zZXR1cCYjMzQ7KSkgewomIzQzOwkJcm1kaXIoZGlyKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwloYXZlX2ZpeHR1cmUgPSB0cnVlOwomIzQzOwlpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoJmFtcDtmKSAhPSAwKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIGZkX2FycmF5IGJpbmRzIG1hcHMgYW5kIEJURnMgYWxpa2UsIGJ1dCBvbmx5IGV4Y2x1c2l2ZSBhcnJheSBtYXBzIGFyZQomIzQzOwkgKiBmb2xkZWQgaW50byB0aGUgc2lnbmF0dXJlLiBCdWlsZCBhbiBvdGhlcndpc2UgZ2VudWluZWx5IHNpZ25lZCBsb2FkIC0KJiM0MzsJICogaW5zbnMgfHwgbWV0YWRhdGEsIGV4Y2x1c2l2ZSBmcm96ZW4gbWFwIGF0IGZkX2FycmF5WzBdIC0gdGhlbiBzbXVnZ2xlCiYjNDM7CSAqIGFuIGV4dHJhIEJURiBpbnRvIGZkX2FycmF5WzFdLiBBIHNpZ25lZCBwcm9ncmFtIG1heSBub3QgYmluZCBhbnkgQlRGLAomIzQzOwkgKiBzbyByZXNvbHZpbmcgdGhlIGZkX2FycmF5IGVudHJpZXMgcmVqZWN0cyB0aGUgQlRGIHdpdGggLUVBQ0NFUyAoaW4KJiM0MzsJICogX19hZGRfdXNlZF9idGYoKSwgYmVmb3JlIHRoZSBzaWduYXR1cmUgaXMgZXZlbiB2ZXJpZmllZCkuCiYjNDM7CSAqLwomIzQzOwlidWYgPSBtYWxsb2MoKHNpemVfdClmLmdvcHRzLmluc25zX3N6ICYjNDM7IGYuZGF0YV9zeik7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidWYsICYjMzQ7c2lnbmJ1ZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwltZW1jcHkoYnVmLCBmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6KTsKJiM0MzsJbWVtY3B5KGJ1ZiAmIzQzOyBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsIGYuZGF0YV9zeik7CiYjNDM7CWlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgYnVmLCBmLmdvcHRzLmluc25zX3N6ICYjNDM7IGYuZGF0YV9zeiwgc2lnLAomIzQzOwkJCSAgICAgICAmYW1wO3NpZ19zeiksICYjMzQ7c2lnbiBpbnNuc3x8bWV0YWRhdGEmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJbWFwX2ZkID0gc2V0dXBfbWV0YV9tYXAoJmFtcDtmKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQobWFwX2ZkLCAmIzM0O21ldGFfbWFwJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7YnRmX25ld19lbXB0eSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlidGZfX2FkZF9pbnQoYnRmLCAmIzM0O2ludCYjMzQ7LCA0LCBCVEZfSU5UX1NJR05FRCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCAmIzM0O2J0Zl9sb2FkJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWZkc1swXSA9IG1hcF9mZDsKJiM0MzsJZmRzWzFdID0gYnRmX19mZChidGYpOwomIzQzOwltZW1zZXQoJmFtcDthdHRyLCAwLCBzaXplb2YoYXR0cikpOwomIzQzOwlhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDsKJiM0MzsJYXR0ci5pbnNucyA9IHB0cl90b191NjQoZi5nb3B0cy5pbnNucyk7CiYjNDM7CWF0dHIuaW5zbl9jbnQgPSBmLmdvcHRzLmluc25zX3N6IC8gc2l6ZW9mKHN0cnVjdCBicGZfaW5zbik7CiYjNDM7CWF0dHIubGljZW5zZSA9IHB0cl90b191NjQoJiMzNDtEdWFsIEJTRC9HUEwmIzM0Oyk7CiYjNDM7CWF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTsKJiM0MzsJYXR0ci5mZF9hcnJheSA9IHB0cl90b191NjQoZmRzKTsKJiM0MzsJYXR0ci5mZF9hcnJheV9jbnQgPSAyOwomIzQzOwlhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTsKJiM0MzsJYXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejsKJiM0MzsJYXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HOwomIzQzOwltZW1jcHkoYXR0ci5wcm9nX25hbWUsICYjMzQ7X19sb2FkZXIucHJvZyYjMzQ7LCBzaXplb2YoJiMzNDtfX2xvYWRlci5wcm9nJiMzNDspKTsKJiM0MzsJcHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsICZhbXA7YXR0ciwKJiM0MzsJCQkgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7CiYjNDM7CUFTU0VSVF9FUShwcm9nX2ZkICZsdDsgMCA/IC1lcnJubyA6IHByb2dfZmQsIC1FQUNDRVMsCiYjNDM7CQkgICYjMzQ7QlRGIGluIHNpZ25lZCBmZF9hcnJheSByZWplY3RlZCYjMzQ7KTsKJiM0MzsJaWYgKHByb2dfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKHByb2dfZmQpOwomIzQzO291dDoKJiM0MzsJaWYgKGJ0ZikKJiM0MzsJCWJ0Zl9fZnJlZShidGYpOwomIzQzOwlpZiAobWFwX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShtYXBfZmQpOwomIzQzOwlpZiAoaGF2ZV9maXh0dXJlKQomIzQzOwkJZ2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoJmFtcDtmKTsKJiM0MzsJaWYgKGRpcikKJiM0MzsJCXJ1bl9zZXR1cCgmIzM0O2NsZWFudXAmIzM0OywgZGlyKTsKJiM0MzsJZnJlZShidWYpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBzaWduYXR1cmVfZmFpbHVyZV9sb2dzKHZvaWQpCiYjNDM7ewomIzQzOwlzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHsgMHgzMCwgMHg0MiwgMHgxMywgMHgzNywgfTsKJiM0MzsJY2hhciBsb2dfYnVmWzEwMjRdID0ge307CiYjNDM7CXN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjsKJiM0MzsJdW5pb24gYnBmX2F0dHIgYXR0cjsKIAlpbnQgZmQ7CiAKIAlpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoJmFtcDtmKSA9PSAwKSB7CiAJCS8qCi0JCSAqIEEgcHJlc2VudC1idXQtaW52YWxpZCBzaWduYXR1cmUgKHRoZSBjZXJ0IGJ5dGVzIGFyZSBub3QgYQotCQkgKiBQS0NTIzcgc2lnbmF0dXJlKSBtdXN0IGJlIHJlamVjdGVkIGF0IGxvYWQ6IHRoZSBzaWduYXR1cmUKLQkJICogcGF0aCBpcyBob25vcmVkLCBub3QgaWdub3JlZC4gKFRoZSB2YWxpZCBwYXRoIGlzIGNvdmVyZWQgYnkKLQkJICogdGhlIHNpZ25lZCBsc2tlbHMuKQomIzQzOwkJICogU2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBub3cgcnVucyBpbnNpZGUgYnBmX2NoZWNrKCksIHNvIGEKJiM0MzsJCSAqIGZhaWx1cmUgaXMgcmVwb3J0ZWQgdGhyb3VnaCB0aGUgdmVyaWZpZXIgbG9nLiBBIHByZXNlbnQtYnV0LQomIzQzOwkJICogaW52YWxpZCBzaWduYXR1cmUgaXMgcmVqZWN0ZWQgYW5kIHRoZSBsb2cgc2F5cyB3aHkuCiAJCSAqLwotCQlmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLAotCQkJCSBzaXplb2YoanVuayksIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7CiYjNDM7CQltZW1zZXQoJmFtcDthdHRyLCAwLCBzaXplb2YoYXR0cikpOwomIzQzOwkJYXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7CiYjNDM7CQlhdHRyLmluc25zID0gcHRyX3RvX3U2NChmLmdvcHRzLmluc25zKTsKJiM0MzsJCWF0dHIuaW5zbl9jbnQgPSBmLmdvcHRzLmluc25zX3N6IC8gc2l6ZW9mKHN0cnVjdCBicGZfaW5zbik7CiYjNDM7CQlhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KCYjMzQ7RHVhbCBCU0QvR1BMJiMzNDspOwomIzQzOwkJYXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFOwomIzQzOwkJYXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KGp1bmspOwomIzQzOwkJYXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpemVvZihqdW5rKTsKJiM0MzsJCWF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORzsKJiM0MzsJCWF0dHIubG9nX2xldmVsID0gMTsKJiM0MzsJCWF0dHIubG9nX2J1ZiA9IHB0cl90b191NjQobG9nX2J1Zik7CiYjNDM7CQlhdHRyLmxvZ19zaXplID0gc2l6ZW9mKGxvZ19idWYpOwomIzQzOwkJbWVtY3B5KGF0dHIucHJvZ19uYW1lLCAmIzM0O19fbG9hZGVyLnByb2cmIzM0Oywgc2l6ZW9mKCYjMzQ7X19sb2FkZXIucHJvZyYjMzQ7KSk7CiYjNDM7CiYjNDM7CQlmZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsICZhbXA7YXR0ciwKJiM0MzsJCQkgICAgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7CiAJCUFTU0VSVF9MVChmZCwgMCwgJiMzNDtpbnZhbGlkIHNpZ25hdHVyZSByZWplY3RlZCBhdCBsb2FkJiMzNDspOwomIzQzOwkJaWYgKGZkICZndDs9IDApCiYjNDM7CQkJY2xvc2UoZmQpOwomIzQzOwkJQVNTRVJUX0hBU19TVUJTVFIobG9nX2J1ZiwgJiMzNDtzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZCYjMzQ7LAomIzQzOwkJCQkgICYjMzQ7dmVyaWZpZXIgbG9ncyBzaWduYXR1cmUgZmFpbHVyZSYjMzQ7KTsKIAl9CiAJZ2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoJmFtcDtmKTsKIH0KQEAgLTQ5NSw3ICYjNDM7NTczLDcgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX3Rvb19sYXJnZSh2b2lkKQogCQkgKiBpcyByZWplY3RlZCBiZWZvcmUgdGhlIGJ1ZmZlciBpcyByZWFkLgogCQkgKi8KIAkJZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuaywKLQkJCQkgNjQgJmx0OyZsdDsgMjAsIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7CiYjNDM7CQkJCSA2NCAmbHQ7Jmx0OyAyMCwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAwKTsKIAkJQVNTRVJUX0VRKGZkLCAtRUlOVkFMLCAmIzM0O292ZXJzaXplZCBzaWduYXR1cmUgcmVqZWN0ZWQmIzM0Oyk7CiAJfQogCWdlbl9sb2FkZXJfZml4dHVyZV9maW5pKCZhbXA7Zik7CkBAIC01MTUsNyAmIzQzOzU5Myw3IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9iYWRfa2V5cmluZyh2b2lkKQogCQkgKiBsYXJnZSBwb3NpdGl2ZSBzZXJpYWwgdGFrZXMgdGhlIHVzZXIta2V5cmluZyBwYXRoIGFuZCB3b24mIzM5O3QgZXhpc3QuCiAJCSAqLwogCQlmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLAotCQkJCSBzaXplb2YoanVuayksIElOVF9NQVgpOwomIzQzOwkJCQkgc2l6ZW9mKGp1bmspLCBJTlRfTUFYLCAwKTsKIAkJQVNTRVJUX0VRKGZkLCAtRUlOVkFMLCAmIzM0O3NpZ25hdHVyZSB3aXRoIGJhZCBrZXlyaW5nX2lkIHJlamVjdGVkJiMzNDspOwogCX0KIAlnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaSgmYW1wO2YpOwpAQCAtNTc1LDcgJiM0Mzs2NTMsNyBAQCBzdGF0aWMgdm9pZCBtZXRhZGF0YV9jdHhfbWF4X2VudHJpZXNfaWdub3JlZCh2b2lkKQogCW1lbWNweShibG9iLCBnb3B0cy5kYXRhLCBkYXRhX3N6KTsKIAogCXIgPSBydW5fZ2VuX2xvYWRlcihnb3B0cy5pbnNucywgZ29wdHMuaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osCi0JCQkgICBleGNsLCBzaXplb2YoZXhjbCksIE5VTEwsIDAsIHRydWUsIGN0eCwgY3R4X3N6LCAmYW1wO3Jhbik7CiYjNDM7CQkJICAgZXhjbCwgc2l6ZW9mKGV4Y2wpLCBOVUxMLCAwLCBjdHgsIGN0eF9zeiwgJmFtcDtyYW4pOwogCWlmICghQVNTRVJUX1RSVUUocmFuLCAmIzM0O2xvYWRlciByYW4mIzM0OykgfHwKIAkgICAgIUFTU0VSVF9FUShyLCAwLCAmIzM0O2xvYWRlciByZXR2YWwmIzM0OykpCiAJCWdvdG8gZnJlZV9ibG9iOwpAQCAtNjYxLDcgJiM0Mzs3MzksNyBAQCBzdGF0aWMgdm9pZCBtZXRhZGF0YV9jdHhfaW5pdGlhbF92YWx1ZV9pZ25vcmVkKHZvaWQpCiAJbWVtY3B5KGJsb2IsIGdvcHRzLmRhdGEsIGRhdGFfc3opOwogCiAJciA9IHJ1bl9nZW5fbG9hZGVyKGdvcHRzLmluc25zLCBnb3B0cy5pbnNuc19zeiwgYmxvYiwgZGF0YV9zeiwKLQkJCSAgIGV4Y2wsIHNpemVvZihleGNsKSwgTlVMTCwgMCwgdHJ1ZSwgY3R4LCBjdHhfc3osICZhbXA7cmFuKTsKJiM0MzsJCQkgICBleGNsLCBzaXplb2YoZXhjbCksIE5VTEwsIDAsIGN0eCwgY3R4X3N6LCAmYW1wO3Jhbik7CiAJaWYgKCFBU1NFUlRfVFJVRShyYW4sICYjMzQ7bG9hZGVyIHJhbiYjMzQ7KSB8fAogCSAgICAhQVNTRVJUX0VRKHIsIDAsICYjMzQ7bG9hZGVyIHJldHZhbCYjMzQ7KSkKIAkJZ290byBmcmVlX2Jsb2I7CkBAIC03MTQsNiAmIzQzOzc5Miw3IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX2luc25zKHZvaWQpCiAJX191OCBleGNsW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXSwgc2lnWzgxOTJdOwogCV9fdTMyIHNpZ19zeiA9IHNpemVvZihzaWcpLCBpbnNuc19zeiwgZGF0YV9zeiwgY3R4X3N6OwogCXVuc2lnbmVkIGNoYXIgKmluc25zID0gTlVMTCwgKnRhbXBlcmVkID0gTlVMTCwgKmJsb2IgPSBOVUxMOwomIzQzOwl1bnNpZ25lZCBjaGFyICpzaWduYnVmID0gTlVMTDsKIAlpbnQgbnJfbWFwcyA9IDAsIG5yX3Byb2dzID0gMCwgcjsKIAlzdHJ1Y3QgYnBmX3Byb2dyYW0gKnA7CiAJc3RydWN0IGJwZl9tYXAgKm07CkBAIC03NjAsMjkgJiM0Mzs4MzksMTQxIEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX2luc25zKHZvaWQpCiAJbWVtY3B5KGJsb2IsIGdvcHRzLmRhdGEsIGRhdGFfc3opOwogCWxpYmJwZl9zaGEyNTYoaW5zbnMsIGluc25zX3N6LCBleGNsKTsKIAotCWlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgaW5zbnMsIGluc25zX3N6LCBzaWcsICZhbXA7c2lnX3N6KSwgJiMzNDtzaWduLWZpbGUmIzM0OykpCiYjNDM7CXNpZ25idWYgPSBtYWxsb2MoKHNpemVfdClpbnNuc19zeiAmIzQzOyBkYXRhX3N6KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNpZ25idWYsICYjMzQ7c2lnbmJ1ZiYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJbWVtY3B5KHNpZ25idWYsIGluc25zLCBpbnNuc19zeik7CiYjNDM7CW1lbWNweShzaWduYnVmICYjNDM7IGluc25zX3N6LCBibG9iLCBkYXRhX3N6KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBzaWduYnVmLCBpbnNuc19zeiAmIzQzOyBkYXRhX3N6LCBzaWcsICZhbXA7c2lnX3N6KSwKJiM0MzsJCSAgICAgICAmIzM0O3NpZ24tZmlsZSYjMzQ7KSkKIAkJZ290byBjbGVhbnVwOwogCiAJbWVtc2V0KGN0eCwgMCwgY3R4X3N6KTsKIAkoKHN0cnVjdCBicGZfbG9hZGVyX2N0eCAqKWN0eCktJmd0O3N6ID0gY3R4X3N6OwogCXIgPSBydW5fZ2VuX2xvYWRlcihpbnNucywgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osIGV4Y2wsIHNpemVvZihleGNsKSwKLQkJCSAgIHNpZywgc2lnX3N6LCB0cnVlLCBjdHgsIGN0eF9zeiwgJmFtcDtyYW4pOwomIzQzOwkJCSAgIHNpZywgc2lnX3N6LCBjdHgsIGN0eF9zeiwgJmFtcDtyYW4pOwogCUFTU0VSVF9UUlVFKHJhbiwgJiMzNDt2YWxpZCBzaWduYXR1cmU6IGxvYWRlciBsb2FkZWQgYW5kIHJhbiYjMzQ7KTsKIAlBU1NFUlRfRVEociwgMCwgJiMzNDt2YWxpZCBzaWduYXR1cmUgYWNjZXB0ZWQmIzM0Oyk7CiAJY2xvc2VfbG9hZGVyX2N0eF9mZHMoY3R4LCBucl9tYXBzLCBucl9wcm9ncyk7CiAKIAltZW1jcHkodGFtcGVyZWQsIGluc25zLCBpbnNuc19zeik7CiAJdGFtcGVyZWRbaW5zbnNfc3ogLyAyXSBePSAweGZmOwomIzQzOwkvKgomIzQzOwkgKiBCaW5kIHRoZSBtZXRhZGF0YSBtYXAgdG8gdGhlIHRhbXBlcmVkIGxvYWRlciYjMzk7cyBvd24gZGlnZXN0LCBzbyB0aGUKJiM0MzsJICogdmVyaWZpZXImIzM5O3MgZXhjbHVzaXZlLW1hcCBjaGVjayAoZXhjbF9wcm9nX3NoYSA9PSBwcm9nLSZndDtkaWdlc3QpIHBhc3NlcwomIzQzOwkgKiBhbmQgdGhlIHNpZ25hdHVyZSAtIHZlcmlmaWVkIGFmdGVyIHRoZSBtYXBzIGFyZSByZXNvbHZlZCAtIGlzIHdoYXQKJiM0MzsJICogcmVqZWN0cyB0aGUgbG9hZC4gVGhpcyBpcyB0aGUgYXR0YWNrZXImIzM5O3MgYmVzdCBjYXNlOiBldmVuIGFmdGVyCiYjNDM7CSAqIHJlLWJpbmRpbmcgdGhlIGV4Y2x1c2l2ZSBtYXAgdG8gdGhlaXIgdGFtcGVyZWQgbG9hZGVyLCB0aGUgc2lnbmF0dXJlCiYjNDM7CSAqIG92ZXIgdGhlIG9yaWdpbmFsIGluc25zIHx8IG1ldGFkYXRhIHN0aWxsIGZhaWxzLiAoTGVhdmluZyB0aGUgbWFwCiYjNDM7CSAqIGJvdW5kIHRvIHRoZSBvcmlnaW5hbCBkaWdlc3Qgd291bGQgaW5zdGVhZCB0cmlwIHRoZSBleGNsIGNoZWNrIGZpcnN0LikKJiM0MzsJICovCiYjNDM7CWxpYmJwZl9zaGEyNTYodGFtcGVyZWQsIGluc25zX3N6LCBleGNsKTsKIAltZW1zZXQoY3R4LCAwLCBjdHhfc3opOwogCSgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS0mZ3Q7c3ogPSBjdHhfc3o7CiAJciA9IHJ1bl9nZW5fbG9hZGVyKHRhbXBlcmVkLCBpbnNuc19zeiwgYmxvYiwgZGF0YV9zeiwgZXhjbCwgc2l6ZW9mKGV4Y2wpLAotCQkJICAgc2lnLCBzaWdfc3osIHRydWUsIGN0eCwgY3R4X3N6LCAmYW1wO3Jhbik7CiYjNDM7CQkJICAgc2lnLCBzaWdfc3osIGN0eCwgY3R4X3N6LCAmYW1wO3Jhbik7CiAJQVNTRVJUX0ZBTFNFKHJhbiwgJiMzNDt0YW1wZXJlZCBsb2FkZXIgcmVqZWN0ZWQgYmVmb3JlIHJ1biYjMzQ7KTsKIAlBU1NFUlRfRVEociwgLUVLRVlSRUpFQ1RFRCwgJiMzNDtzaWduYXR1cmUgaXMgYm91bmQgdG8gdGhlIGluc3RydWN0aW9ucyYjMzQ7KTsKIGNsZWFudXA6CiAJZnJlZShpbnNucyk7CiAJZnJlZSh0YW1wZXJlZCk7CiAJZnJlZShibG9iKTsKJiM0MzsJZnJlZShzaWduYnVmKTsKJiM0MzsJZnJlZShjdHgpOwomIzQzOwl0ZXN0X3NpZ25lZF9sb2FkZXJfX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CXJ1bl9zZXR1cCgmIzM0O2NsZWFudXAmIzM0OywgZGlyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgc2lnbmF0dXJlX2F1dGhlbnRpY2F0ZXNfbWV0YWRhdGEodm9pZCkKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGdlbl9sb2FkZXJfb3B0cywgZ29wdHMsIC5nZW5faGFzaCA9IHRydWUpOwomIzQzOwljaGFyIGRpcl90bXBsW10gPSAmIzM0Oy90bXAvc2lnbmVkX2xvYWRlclhYWFhYWCYjMzQ7LCAqZGlyOwomIzQzOwlzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyICpza2VsID0gTlVMTDsKJiM0MzsJX191OCBleGNsW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXSwgc2lnWzgxOTJdOwomIzQzOwlfX3UzMiBzaWdfc3ogPSBzaXplb2Yoc2lnKSwgaW5zbnNfc3osIGRhdGFfc3osIGN0eF9zejsKJiM0MzsJdW5zaWduZWQgY2hhciAqaW5zbnMgPSBOVUxMLCAqYmxvYiA9IE5VTEw7CiYjNDM7CXVuc2lnbmVkIGNoYXIgKnNpZ25idWYgPSBOVUxMOwomIzQzOwlpbnQgbnJfbWFwcyA9IDAsIG5yX3Byb2dzID0gMCwgcjsKJiM0MzsJc3RydWN0IGJwZl9wcm9ncmFtICpwOwomIzQzOwlzdHJ1Y3QgYnBmX21hcCAqbTsKJiM0MzsJdm9pZCAqY3R4ID0gTlVMTDsKJiM0MzsJYm9vbCByYW47CiYjNDM7CiYjNDM7CXN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgJiMzNDtrZXlyaW5nJiMzNDssICYjMzQ7X3VpZC4wJiMzNDssIE5VTEwsCiYjNDM7CQlLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpOwomIzQzOwlkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoJiMzNDtzZXR1cCYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKJiM0MzsJCXJtZGlyKGRpcik7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJc2tlbCA9IHRlc3Rfc2lnbmVkX2xvYWRlcl9fb3BlbigpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtza2VsX29wZW4mIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZl9vYmplY3RfX2dlbl9sb2FkZXIoc2tlbC0mZ3Q7b2JqLCAmYW1wO2dvcHRzKSwgJiMzNDtnZW5fbG9hZGVyJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhicGZfb2JqZWN0X19sb2FkKHNrZWwtJmd0O29iaiksICYjMzQ7Z2VuX2xvYWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWJwZl9vYmplY3RfX2Zvcl9lYWNoX3Byb2dyYW0ocCwgc2tlbC0mZ3Q7b2JqKQomIzQzOwkJbnJfcHJvZ3MmIzQzOyYjNDM7OwomIzQzOwlicGZfb2JqZWN0X19mb3JfZWFjaF9tYXAobSwgc2tlbC0mZ3Q7b2JqKQomIzQzOwkJbnJfbWFwcyYjNDM7JiM0Mzs7CiYjNDM7CWN0eF9zeiA9IHNpemVvZihzdHJ1Y3QgYnBmX2xvYWRlcl9jdHgpICYjNDM7CiYjNDM7CQkgbnJfbWFwcyAqIHNpemVvZihzdHJ1Y3QgYnBmX21hcF9kZXNjKSAmIzQzOwomIzQzOwkJIG5yX3Byb2dzICogc2l6ZW9mKHN0cnVjdCBicGZfcHJvZ19kZXNjKTsKJiM0MzsJaW5zbnNfc3ogPSBnb3B0cy5pbnNuc19zejsKJiM0MzsJZGF0YV9zeiA9IGdvcHRzLmRhdGFfc3o7CiYjNDM7CWN0eCA9IGNhbGxvYygxLCBjdHhfc3opOwomIzQzOwlpbnNucyA9IG1hbGxvYyhpbnNuc19zeik7CiYjNDM7CWJsb2IgPSBtYWxsb2MoZGF0YV9zeik7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihjdHgsICYjMzQ7Y3R4JiMzNDspIHx8CiYjNDM7CSAgICAhQVNTRVJUX09LX1BUUihpbnNucywgJiMzNDtpbnNucyYjMzQ7KSB8fAomIzQzOwkgICAgIUFTU0VSVF9PS19QVFIoYmxvYiwgJiMzNDtibG9iJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwltZW1jcHkoaW5zbnMsIGdvcHRzLmluc25zLCBpbnNuc19zeik7CiYjNDM7CW1lbWNweShibG9iLCBnb3B0cy5kYXRhLCBkYXRhX3N6KTsKJiM0MzsJbGliYnBmX3NoYTI1NihpbnNucywgaW5zbnNfc3osIGV4Y2wpOwomIzQzOwomIzQzOwlzaWduYnVmID0gbWFsbG9jKChzaXplX3QpaW5zbnNfc3ogJiM0MzsgZGF0YV9zeik7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihzaWduYnVmLCAmIzM0O3NpZ25idWYmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CW1lbWNweShzaWduYnVmLCBpbnNucywgaW5zbnNfc3opOwomIzQzOwltZW1jcHkoc2lnbmJ1ZiAmIzQzOyBpbnNuc19zeiwgYmxvYiwgZGF0YV9zeik7CiYjNDM7CWlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgc2lnbmJ1ZiwgaW5zbnNfc3ogJiM0MzsgZGF0YV9zeiwgc2lnLCAmYW1wO3NpZ19zeiksCiYjNDM7CQkgICAgICAgJiMzNDtzaWduLWZpbGUmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CW1lbXNldChjdHgsIDAsIGN0eF9zeik7CiYjNDM7CSgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS0mZ3Q7c3ogPSBjdHhfc3o7CiYjNDM7CXIgPSBydW5fZ2VuX2xvYWRlcihpbnNucywgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osIGV4Y2wsIHNpemVvZihleGNsKSwKJiM0MzsJCQkgICBzaWcsIHNpZ19zeiwgY3R4LCBjdHhfc3osICZhbXA7cmFuKTsKJiM0MzsJQVNTRVJUX1RSVUUocmFuLCAmIzM0O3ZhbGlkIHNpZ25hdHVyZTogbG9hZGVyIGxvYWRlZCBhbmQgcmFuJiMzNDspOwomIzQzOwlBU1NFUlRfRVEociwgMCwgJiMzNDt2YWxpZCBzaWduYXR1cmUgYWNjZXB0ZWQmIzM0Oyk7CiYjNDM7CWNsb3NlX2xvYWRlcl9jdHhfZmRzKGN0eCwgbnJfbWFwcywgbnJfcHJvZ3MpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUYW1wZXIgdGhlIG1ldGFkYXRhIGFmdGVyIHNpZ25pbmcgd2hpbGUgbGVhdmluZyB0aGUgaW5zdHJ1Y3Rpb25zCiYjNDM7CSAqIGFuZCB0aHVzIHRoZSBleGNsdXNpdmUgaGFzaCBiaW5kaW5nIHVudG91Y2hlZDogdGhlIG1hcCBmcmVlemVzCiYjNDM7CSAqIGZpbmUgYW5kIGV4Y2xfcHJvZ19zaGEgc3RpbGwgbWF0Y2hlcyB0aGUgbG9hZGVyJiMzOTtzIGRpZ2VzdCwgc28gdGhlCiYjNDM7CSAqIGxvYWQgcmVhY2hlcyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCB3aGljaCBmb2xkcyB0aGUgbGl2ZSBmcm96ZW4KJiM0MzsJICogbWFwIGJ5dGVzIGludG8gdGhlIGNoZWNrZWQgcGF5bG9hZCBhbmQgbXVzdCByZWplY3QgdGhlIG1vZGlmaWVkCiYjNDM7CSAqIGJsb2IuIEEga2VybmVsIGZvbGRpbmcgYW55dGhpbmcgYnV0IHRoZSBtYXAgY29udGVudHMgdGhlbXNlbHZlcwomIzQzOwkgKiB3b3VsZCB3cm9uZ2x5IGFjY2VwdCB0aGlzIGxvYWQuCiYjNDM7CSAqLwomIzQzOwlibG9iW2RhdGFfc3ogLyAyXSBePSAweGZmOwomIzQzOwltZW1zZXQoY3R4LCAwLCBjdHhfc3opOwomIzQzOwkoKHN0cnVjdCBicGZfbG9hZGVyX2N0eCAqKWN0eCktJmd0O3N6ID0gY3R4X3N6OwomIzQzOwlyID0gcnVuX2dlbl9sb2FkZXIoaW5zbnMsIGluc25zX3N6LCBibG9iLCBkYXRhX3N6LCBleGNsLCBzaXplb2YoZXhjbCksCiYjNDM7CQkJICAgc2lnLCBzaWdfc3osIGN0eCwgY3R4X3N6LCAmYW1wO3Jhbik7CiYjNDM7CUFTU0VSVF9GQUxTRShyYW4sICYjMzQ7dGFtcGVyZWQgbWV0YWRhdGEgcmVqZWN0ZWQgYmVmb3JlIHJ1biYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKHIsIC1FS0VZUkVKRUNURUQsICYjMzQ7c2lnbmF0dXJlIGlzIGJvdW5kIHRvIHRoZSBtZXRhZGF0YSYjMzQ7KTsKJiM0MztjbGVhbnVwOgomIzQzOwlmcmVlKGluc25zKTsKJiM0MzsJZnJlZShibG9iKTsKJiM0MzsJZnJlZShzaWduYnVmKTsKIAlmcmVlKGN0eCk7CiAJdGVzdF9zaWduZWRfbG9hZGVyX19kZXN0cm95KHNrZWwpOwogCXJ1bl9zZXR1cCgmIzM0O2NsZWFudXAmIzM0OywgZGlyKTsKQEAgLTEwMDcsMTAgJiM0MzsxMTk4LDExIEBAIHN0YXRpYyB2b2lkIGxzbV9zaWduYXR1cmVfdmVyZGljdCh2b2lkKQogewogCWNoYXIgZGlyX3RtcGxbXSA9ICYjMzQ7L3RtcC9zaWduZWRfbG9hZGVyX2xzbVhYWFhYWCYjMzQ7LCAqZGlyID0gTlVMTDsKIAlzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyX2xzbSAqbHNtID0gTlVMTDsKJiM0MzsJX191MzIgc2lnX3N6ID0gODE5MiwgbXNpZ19zeiA9IDgxOTI7CiAJaW50IG1hcF9mZCA9IC0xLCBwcm9nX2ZkID0gLTE7CiAJYm9vbCBoYXZlX2ZpeHR1cmUgPSBmYWxzZTsKIAlzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7Ci0JX191MzIgc2lnX3N6ID0gODE5MjsKJiM0MzsJdW5zaWduZWQgY2hhciAqYnVmOwogCV9fczMyIHNlc19zZXJpYWw7CiAJX191OCBzaWdbODE5Ml07CiAKQEAgLTEwMjksNyAmIzQzOzEyMjEsNyBAQCBzdGF0aWMgdm9pZCBsc21fc2lnbmF0dXJlX3ZlcmRpY3Qodm9pZCkKIAlpZiAoIUFTU0VSVF9PS19GRChtYXBfZmQsICYjMzQ7bWV0YV9tYXBfdW5zaWduZWQmIzM0OykpCiAJCWdvdG8gb3V0OwogCWxzbS0mZ3Q7YnNzLSZndDtzZWVuID0gMDsKLQlwcm9nX2ZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgbWFwX2ZkLCBOVUxMLCAwLCAwKTsKJiM0MzsJcHJvZ19mZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIG1hcF9mZCwgTlVMTCwgMCwgMCwgMCk7CiAJY2xvc2UobWFwX2ZkKTsKIAltYXBfZmQgPSAtMTsKIAlpZiAoIUFTU0VSVF9PS19GRChwcm9nX2ZkLCAmIzM0O3Vuc2lnbmVkIGxvYWRlciBsb2FkJiMzNDspKQpAQCAtMTA2MiwyMiAmIzQzOzEyNTQsNTEgQEAgc3RhdGljIHZvaWQgbHNtX3NpZ25hdHVyZV92ZXJkaWN0KHZvaWQpCiAJCWdvdG8gb3V0OwogCWxzbS0mZ3Q7YnNzLSZndDtzZWVuID0gMDsKIAlwcm9nX2ZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgbWFwX2ZkLCBzaWcsCi0JCQkgICAgICBzaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7CiYjNDM7CQkJICAgICAgc2lnX3N6LCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDApOwogCWNsb3NlKG1hcF9mZCk7CiAJbWFwX2ZkID0gLTE7Ci0JaWYgKCFBU1NFUlRfT0tfRkQocHJvZ19mZCwgJiMzNDtzaWduZWQgbG9hZGVyIGxvYWQmIzM0OykpCi0JCWdvdG8gb3V0OwotCWNsb3NlKHByb2dfZmQpOwomIzQzOwlBU1NFUlRfRVEocHJvZ19mZCwgLUVBQ0NFUywgJiMzNDt1bmZvbGRlZCBtZXRhZGF0YSByZWplY3RlZCYjMzQ7KTsKJiM0MzsJaWYgKHByb2dfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKHByb2dfZmQpOwogCXByb2dfZmQgPSAtMTsKIAogCXNlc19zZXJpYWwgPSBzeXNjYWxsKF9fTlJfa2V5Y3RsLCBLRVlDVExfR0VUX0tFWVJJTkdfSUQsCiAJCQkgICAgIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCk7CiAJQVNTRVJUX0VRKGxzbS0mZ3Q7YnNzLSZndDtzZWVuLCAxLCAmIzM0O3NpZ25lZDogb25lIG9ic2VydmVkIGxvYWQmIzM0Oyk7Ci0JQVNTRVJUX0VRKGxzbS0mZ3Q7YnNzLSZndDtzaWdfdmVyZGljdCwgQlBGX1NJR19WRVJJRklFRCwgJiMzNDtzaWduZWQgdmVyZGljdCYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGxzbS0mZ3Q7YnNzLSZndDtzaWdfdmVyZGljdCwgQlBGX1NJR19WRVJJRklFRCwKJiM0MzsJCSAgJiMzNDthZG1pc3Npb24gc2F3IGEgdmFsaWQgc2lnbmF0dXJlJiMzNDspOwogCUFTU0VSVF9FUShsc20tJmd0O2Jzcy0mZ3Q7c2lnX2tleXJpbmdfdHlwZSwgQlBGX1NJR19LRVlSSU5HX1VTRVIsICYjMzQ7c2lnbmVkIGtleXJpbmcgdHlwZSYjMzQ7KTsKIAlBU1NFUlRfR1Qoc2VzX3NlcmlhbCwgMCwgJiMzNDtzZXNzaW9uIGtleXJpbmcgc2VyaWFsIHJlc29sdmVkJiMzNDspOwogCUFTU0VSVF9FUShsc20tJmd0O2Jzcy0mZ3Q7c2lnX2tleXJpbmdfc2VyaWFsLCBzZXNfc2VyaWFsLAogCQkgICYjMzQ7c2lnbmVkOiB2YWxpZGF0ZWQgYWdhaW5zdCBzZXNzaW9uIGtleXJpbmcmIzM0Oyk7CiYjNDM7CiYjNDM7CWJ1ZiA9IG1hbGxvYygoc2l6ZV90KWYuZ29wdHMuaW5zbnNfc3ogJiM0MzsgZi5kYXRhX3N6KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ1ZiwgJiMzNDttZXRhX3NpZ25idWYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJbWVtY3B5KGJ1ZiwgZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeik7CiYjNDM7CW1lbWNweShidWYgJiM0MzsgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLCBmLmRhdGFfc3opOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGJ1ZiwgZi5nb3B0cy5pbnNuc19zeiAmIzQzOyBmLmRhdGFfc3osCiYjNDM7CQkJCXNpZywgJmFtcDttc2lnX3N6KSwgJiMzNDtzaWduIGluc25zfHxtZXRhZGF0YSYjMzQ7KSkgewomIzQzOwkJZnJlZShidWYpOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJZnJlZShidWYpOwomIzQzOwomIzQzOwltYXBfZmQgPSBzZXR1cF9tZXRhX21hcCgmYW1wO2YpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChtYXBfZmQsICYjMzQ7bWV0YV9tYXBfYm91bmQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJbHNtLSZndDtic3MtJmd0O3NlZW4gPSAwOwomIzQzOwlwcm9nX2ZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgbWFwX2ZkLCBzaWcsCiYjNDM7CQkJICAgICAgbXNpZ19zeiwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAxKTsKJiM0MzsJY2xvc2UobWFwX2ZkKTsKJiM0MzsJbWFwX2ZkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKHByb2dfZmQsICYjMzQ7bWV0YWRhdGEtYm91bmQgbG9hZGVyIGxvYWQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJY2xvc2UocHJvZ19mZCk7CiYjNDM7CXByb2dfZmQgPSAtMTsKJiM0MzsJQVNTRVJUX0VRKGxzbS0mZ3Q7YnNzLSZndDtzZWVuLCAxLCAmIzM0O21ldGFkYXRhOiBvbmUgb2JzZXJ2ZWQgbG9hZCYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGxzbS0mZ3Q7YnNzLSZndDtzaWdfdmVyZGljdCwgQlBGX1NJR19WRVJJRklFRCwKJiM0MzsJCSAgJiMzNDttZXRhZGF0YS1ib3VuZCB2ZXJkaWN0JiMzNDspOwogb3V0OgogCWlmIChtYXBfZmQgJmd0Oz0gMCkKIAkJY2xvc2UobWFwX2ZkKTsKQEAgLTEwOTAsMjAgJiM0MzsxMzExLDQ2NyBAQCBzdGF0aWMgdm9pZCBsc21fc2lnbmF0dXJlX3ZlcmRpY3Qodm9pZCkKIAl0ZXN0X3NpZ25lZF9sb2FkZXJfbHNtX19kZXN0cm95KGxzbSk7CiB9CiAKJiM0MzsvKgomIzQzOyAqIExvYWQtdGltZSBtZXRhZGF0YSB2ZXJpZmljYXRpb246IHRoZSBrZXJuZWwgZm9sZHMgdGhlIGZyb3plbiBtZXRhZGF0YSBtYXAKJiM0MzsgKiBpbnRvIHRoZSBzaWduYXR1cmUgKGluc25zIHx8IG1ldGFkYXRhKSBhbmQgY2hlY2tzIGl0IGF0IEJQRl9QUk9HX0xPQUQgdmlhCiYjNDM7ICogZmRfYXJyYXlfY250LCByYXRoZXIgdGhhbiB0aGUgbG9hZGVyIGNoZWNraW5nIGZyb20gd2l0aGluIEJQRi4gU2lnbiB0aGF0CiYjNDM7ICogY29uY2F0ZW5hdGlvbiwgaGFuZCB0aGUga2VybmVsIHRoZSBtYXAsIGFuZCBjb25maXJtIHRoZSBzaWduZWQgbG9hZGVyIGxvYWRzLAomIzQzOyAqIHJ1bnMsIGFuZCBpbnN0YWxscyBpdHMgdGFyZ2V0LgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgbG9hZHRpbWVfZHJpdmUoY29uc3QgY2hhciAqZGlyLCBjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osCiYjNDM7CQkJICBjb25zdCB2b2lkICpkYXRhLCBfX3UzMiBkYXRhX3N6LCBjb25zdCBfX3U4ICpleGNsLAomIzQzOwkJCSAgdm9pZCAqY3R4LCBfX3UzMiBjdHhfc3osIGludCAqbG9hZF9yZXQsIGJvb2wgKnJhbikKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG1vcHRzLAomIzQzOwkJICAgIC5leGNsX3Byb2dfaGFzaCA9IGV4Y2wsCiYjNDM7CQkgICAgLmV4Y2xfcHJvZ19oYXNoX3NpemUgPSBTSEEyNTZfRElHRVNUX0xFTkdUSCk7CiYjNDM7CV9fdTMyIHNpZ19zeiA9IDgxOTIsIGtleSA9IDA7CiYjNDM7CXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IE5VTEw7CiYjNDM7CWludCBtYXBfZmQsIHByb2dfZmQsIHJldCA9IDA7CiYjNDM7CXVuaW9uIGJwZl9hdHRyIGF0dHI7CiYjNDM7CV9fdTggc2lnWzgxOTJdOwomIzQzOwomIzQzOwkqcmFuID0gZmFsc2U7CiYjNDM7CSpsb2FkX3JldCA9IDA7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIE1ldGFkYXRhIG1hcCwgYm91bmQgdG8gdGhlIGxvYWRlciBkaWdlc3QgYW5kIGZyb3plbiwgZXhhY3RseSBhcwomIzQzOwkgKiBza2VsX2ludGVybmFsLmgmIzM5O3MgYnBmX2xvYWRfYW5kX3J1bigpIHNldHMgaXQgdXAuCiYjNDM7CSAqLwomIzQzOwltYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVksICYjMzQ7X19sb2FkZXIubWFwJiMzNDssIDQsCiYjNDM7CQkJCWRhdGFfc3osIDEsICZhbXA7bW9wdHMpOwomIzQzOwlpZiAobWFwX2ZkICZsdDsgMCkgewomIzQzOwkJcmV0ID0gLWVycm5vOwomIzQzOwkJZ290byBvdXRfbG9hZDsKJiM0MzsJfQomIzQzOwlpZiAoYnBmX21hcF91cGRhdGVfZWxlbShtYXBfZmQsICZhbXA7a2V5LCBkYXRhLCAwKSB8fCBicGZfbWFwX2ZyZWV6ZShtYXBfZmQpKSB7CiYjNDM7CQlyZXQgPSAtZXJybm87CiYjNDM7CQlnb3RvIG91dF9sb2FkOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFNpZ24gaW5zbnMgfHwgbWV0YWRhdGEsIHRoZSBzYW1lIGJ5dGVzIHRoZSBrZXJuZWwgcmVjb25zdHJ1Y3RzLiAqLwomIzQzOwlidWYgPSBtYWxsb2MoKHNpemVfdClpbnNuc19zeiAmIzQzOyBkYXRhX3N6KTsKJiM0MzsJaWYgKCFidWYpIHsKJiM0MzsJCXJldCA9IC1FTk9NRU07CiYjNDM7CQlnb3RvIG91dF9sb2FkOwomIzQzOwl9CiYjNDM7CW1lbWNweShidWYsIGluc25zLCBpbnNuc19zeik7CiYjNDM7CW1lbWNweShidWYgJiM0MzsgaW5zbnNfc3osIGRhdGEsIGRhdGFfc3opOwomIzQzOwlyZXQgPSBzaWduX2J1ZihkaXIsIGJ1ZiwgaW5zbnNfc3ogJiM0MzsgZGF0YV9zeiwgc2lnLCAmYW1wO3NpZ19zeik7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlnb3RvIG91dF9sb2FkOwomIzQzOwomIzQzOwltZW1zZXQoJmFtcDthdHRyLCAwLCBzaXplb2YoYXR0cikpOwomIzQzOwlhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDsKJiM0MzsJYXR0ci5pbnNucyA9IHB0cl90b191NjQoaW5zbnMpOwomIzQzOwlhdHRyLmluc25fY250ID0gaW5zbnNfc3ogLyBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKTsKJiM0MzsJYXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NCgmIzM0O0R1YWwgQlNEL0dQTCYjMzQ7KTsKJiM0MzsJYXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFOwomIzQzOwlhdHRyLmZkX2FycmF5ID0gcHRyX3RvX3U2NCgmYW1wO21hcF9mZCk7CiYjNDM7CWF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpOwomIzQzOwlhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6OwomIzQzOwlhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7CiYjNDM7CWF0dHIuZmRfYXJyYXlfY250ID0gMTsKJiM0MzsJbWVtY3B5KGF0dHIucHJvZ19uYW1lLCAmIzM0O19fbG9hZGVyLnByb2cmIzM0Oywgc2l6ZW9mKCYjMzQ7X19sb2FkZXIucHJvZyYjMzQ7KSk7CiYjNDM7CXByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCAmYW1wO2F0dHIsCiYjNDM7CQkJICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpOwomIzQzOwlpZiAocHJvZ19mZCAmbHQ7IDApIHsKJiM0MzsJCXJldCA9IC1lcnJubzsKJiM0MzsJCWdvdG8gb3V0X2xvYWQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWVtc2V0KCZhbXA7YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTsKJiM0MzsJYXR0ci50ZXN0LnByb2dfZmQgPSBwcm9nX2ZkOwomIzQzOwlhdHRyLnRlc3QuY3R4X2luID0gcHRyX3RvX3U2NChjdHgpOwomIzQzOwlhdHRyLnRlc3QuY3R4X3NpemVfaW4gPSBjdHhfc3o7CiYjNDM7CWlmIChzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19SVU4sICZhbXA7YXR0ciwKJiM0MzsJCSAgICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwgdGVzdCkpICZsdDsgMCkgewomIzQzOwkJcmV0ID0gLWVycm5vOwomIzQzOwkJZ290byBvdXRfcHJvZzsKJiM0MzsJfQomIzQzOwkqcmFuID0gdHJ1ZTsKJiM0MzsJcmV0ID0gKGludClhdHRyLnRlc3QucmV0dmFsOwomIzQzO291dF9wcm9nOgomIzQzOwljbG9zZShwcm9nX2ZkKTsKJiM0MzsJZ290byBvdXRfbWFwOwomIzQzO291dF9sb2FkOgomIzQzOwkqbG9hZF9yZXQgPSByZXQ7CiYjNDM7b3V0X21hcDoKJiM0MzsJZnJlZShidWYpOwomIzQzOwlpZiAobWFwX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShtYXBfZmQpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBsb2FkdGltZV92ZXJpZnkoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgaW50IGV4cGVjdF9tYXBzKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoZ2VuX2xvYWRlcl9vcHRzLCBnb3B0cywgLmdlbl9oYXNoID0gdHJ1ZSk7CiYjNDM7CWNoYXIgZGlyX3RtcGxbXSA9ICYjMzQ7L3RtcC9zaWduZWRfbG9hZGVyX2x0WFhYWFhYJiMzNDssICpkaXIgPSBOVUxMOwomIzQzOwlpbnQgbnJfbWFwcyA9IDAsIG5yX3Byb2dzID0gMCwgbG9hZF9yZXQgPSAwLCByOwomIzQzOwlfX3U4IGV4Y2xbU0hBMjU2X0RJR0VTVF9MRU5HVEhdOwomIzQzOwlzdHJ1Y3QgYnBmX3Byb2dfZGVzYyAqcGQ7CiYjNDM7CXN0cnVjdCBicGZfbWFwX2Rlc2MgKm1kOwomIzQzOwl1bnNpZ25lZCBjaGFyICpibG9iID0gTlVMTDsKJiM0MzsJc3RydWN0IGJwZl9wcm9ncmFtICpwOwomIzQzOwlzdHJ1Y3QgYnBmX21hcCAqbTsKJiM0MzsJX191MzIgY3R4X3N6LCBkYXRhX3N6OwomIzQzOwl2b2lkICpjdHggPSBOVUxMOwomIzQzOwlib29sIHJhbiA9IGZhbHNlOwomIzQzOwomIzQzOwlzeXNjYWxsKF9fTlJfcmVxdWVzdF9rZXksICYjMzQ7a2V5cmluZyYjMzQ7LCAmIzM0O191aWQuMCYjMzQ7LCBOVUxMLAomIzQzOwkJS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTsKJiM0MzsJZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihkaXIsICYjMzQ7bWtkdGVtcCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWYgKCFBU1NFUlRfT0socnVuX3NldHVwKCYjMzQ7c2V0dXAmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiYjNDM7CQlybWRpcihkaXIpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZl9vYmplY3RfX2dlbl9sb2FkZXIob2JqLCAmYW1wO2dvcHRzKSwgJiMzNDtnZW5fbG9hZGVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZl9vYmplY3RfX2xvYWQob2JqKSwgJiMzNDtnZW5fbG9hZCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlicGZfb2JqZWN0X19mb3JfZWFjaF9wcm9ncmFtKHAsIG9iaikKJiM0MzsJCW5yX3Byb2dzJiM0MzsmIzQzOzsKJiM0MzsJYnBmX29iamVjdF9fZm9yX2VhY2hfbWFwKG0sIG9iaikKJiM0MzsJCW5yX21hcHMmIzQzOyYjNDM7OwomIzQzOwlpZiAoIUFTU0VSVF9FUShucl9tYXBzLCBleHBlY3RfbWFwcywgJiMzNDtmaXh0dXJlIG1hcCBjb3VudCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwljdHhfc3ogPSBzaXplb2Yoc3RydWN0IGJwZl9sb2FkZXJfY3R4KSAmIzQzOwomIzQzOwkJIG5yX21hcHMgKiBzaXplb2Yoc3RydWN0IGJwZl9tYXBfZGVzYykgJiM0MzsKJiM0MzsJCSBucl9wcm9ncyAqIHNpemVvZihzdHJ1Y3QgYnBmX3Byb2dfZGVzYyk7CiYjNDM7CWN0eCA9IGNhbGxvYygxLCBjdHhfc3opOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoY3R4LCAmIzM0O2N0eF9hbGxvYyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwkoKHN0cnVjdCBicGZfbG9hZGVyX2N0eCAqKWN0eCktJmd0O3N6ID0gY3R4X3N6OwomIzQzOwomIzQzOwlkYXRhX3N6ID0gZ29wdHMuZGF0YV9zejsKJiM0MzsJYmxvYiA9IG1hbGxvYyhkYXRhX3N6KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJsb2IsICYjMzQ7YmxvYl9hbGxvYyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwltZW1jcHkoYmxvYiwgZ29wdHMuZGF0YSwgZGF0YV9zeik7CiYjNDM7CiYjNDM7CS8qIGV4Y2xfcHJvZ19oYXNoID0gU0hBMjU2KGxvYWRlciBpbnNucykgPT0gdGhlIGxvYWRlciYjMzk7cyBwcm9nLSZndDtkaWdlc3QuICovCiYjNDM7CWxpYmJwZl9zaGEyNTYoZ29wdHMuaW5zbnMsIGdvcHRzLmluc25zX3N6LCBleGNsKTsKJiM0MzsKJiM0MzsJciA9IGxvYWR0aW1lX2RyaXZlKGRpciwgZ29wdHMuaW5zbnMsIGdvcHRzLmluc25zX3N6LCBibG9iLCBkYXRhX3N6LAomIzQzOwkJCSAgIGV4Y2wsIGN0eCwgY3R4X3N6LCAmYW1wO2xvYWRfcmV0LCAmYW1wO3Jhbik7CiYjNDM7CUFTU0VSVF9PSyhsb2FkX3JldCwgJiMzNDtzaWduZWQgbG9hZGVyIGxvYWRlZCAoaW5zbnMgfHwgbWV0YWRhdGEpJiMzNDspOwomIzQzOwlBU1NFUlRfVFJVRShyYW4sICYjMzQ7bG9hZGVyIHJhbiYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKHIsIDAsICYjMzQ7bG9hZGVyIGluc3RhbGxlZCBpdHMgdGFyZ2V0JiMzNDspOwomIzQzOwomIzQzOwltZCA9IChzdHJ1Y3QgYnBmX21hcF9kZXNjICopKChjaGFyICopY3R4ICYjNDM7IHNpemVvZihzdHJ1Y3QgYnBmX2xvYWRlcl9jdHgpKTsKJiM0MzsJcGQgPSAoc3RydWN0IGJwZl9wcm9nX2Rlc2MgKikobWQgJiM0MzsgbnJfbWFwcyk7CiYjNDM7CUFTU0VSVF9HVChwZFswXS5wcm9nX2ZkLCAwLCAmIzM0O3RhcmdldCBwcm9ncmFtIGluc3RhbGxlZCYjMzQ7KTsKJiM0MzsJaWYgKG5yX21hcHMpCiYjNDM7CQlBU1NFUlRfR1QobWRbMF0ubWFwX2ZkLCAwLCAmIzM0O3RhcmdldCBtYXAgaW5zdGFsbGVkJiMzNDspOwomIzQzOwomIzQzOwljbG9zZV9sb2FkZXJfY3R4X2ZkcyhjdHgsIG5yX21hcHMsIG5yX3Byb2dzKTsKJiM0MztvdXQ6CiYjNDM7CWZyZWUoYmxvYik7CiYjNDM7CWZyZWUoY3R4KTsKJiM0MzsJaWYgKGRpcikKJiM0MzsJCXJ1bl9zZXR1cCgmIzM0O2NsZWFudXAmIzM0OywgZGlyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgbG9hZHRpbWVfbm9fbWFwKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyICpza2VsID0gdGVzdF9zaWduZWRfbG9hZGVyX19vcGVuKCk7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O3NrZWxfb3BlbiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJbG9hZHRpbWVfdmVyaWZ5KHNrZWwtJmd0O29iaiwgMCk7CiYjNDM7CXRlc3Rfc2lnbmVkX2xvYWRlcl9fZGVzdHJveShza2VsKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgbG9hZHRpbWVfd2l0aF9tYXAodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0ZXN0X3NpZ25lZF9sb2FkZXJfbWFwICpza2VsID0gdGVzdF9zaWduZWRfbG9hZGVyX21hcF9fb3BlbigpOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtza2VsX29wZW4mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWxvYWR0aW1lX3ZlcmlmeShza2VsLSZndDtvYmosIDEpOwomIzQzOwl0ZXN0X3NpZ25lZF9sb2FkZXJfbWFwX19kZXN0cm95KHNrZWwpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEEgc2lnbmVkIHByb2dyYW0gbmVlZCBub3QgYmluZCBhbnkgbWFwLiBBIHBsYWluIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTAomIzQzOyAqIHByb2dyYW0gd2l0aCBubyBmZF9hcnJheSBpcyBzaWduZWQgb3ZlciBpdHMgaW5zdHJ1Y3Rpb25zIGFsb25lOiB0aGUga2VybmVsCiYjNDM7ICogdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSwgZm9sZHMgbm8gbWV0YWRhdGEsIGFuZCB0aGUgcHJvZ3JhbSBsb2Fkcy4gRXhlcmNpc2UKJiM0MzsgKiB0aGUgZmRfYXJyYXkgPT0gTlVMTCAvIGZkX2FycmF5X2NudCA9PSAwIHBhdGgsIGFuZCBjb25maXJtIHRoZSBzaWduYXR1cmUKJiM0MzsgKiBzdGlsbCBhdXRoZW50aWNhdGVzIHRoZSBpbnN0cnVjdGlvbnMgKGEgdGFtcGVyZWQgY29weSBpcyByZWplY3RlZCkuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgc2lnbmVkX25vX2ZkX2FycmF5KHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2luc24gaW5zbnNbXSA9IHsKJiM0MzsJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKJiM0MzsJCUJQRl9FWElUX0lOU04oKSwKJiM0MzsJfTsKJiM0MzsJY2hhciBkaXJfdG1wbFtdID0gJiMzNDsvdG1wL3NpZ25lZF9sb2FkZXJYWFhYWFgmIzM0OywgKmRpcjsKJiM0MzsJX191MzIgc2lnX3N6ID0gODE5MjsKJiM0MzsJdW5pb24gYnBmX2F0dHIgYXR0cjsKJiM0MzsJX191OCBzaWdbODE5Ml07CiYjNDM7CWludCBwcm9nX2ZkLCBlcnI7CiYjNDM7CiYjNDM7CXN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgJiMzNDtrZXlyaW5nJiMzNDssICYjMzQ7X3VpZC4wJiMzNDssIE5VTEwsCiYjNDM7CQlLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpOwomIzQzOwlkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoJiMzNDtzZXR1cCYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKJiM0MzsJCXJtZGlyKGRpcik7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogTm8gbWV0YWRhdGEgbWFwOiB0aGUgc2lnbmVkIHBheWxvYWQgaXMgdGhlIGluc3RydWN0aW9ucyBhbG9uZS4gKi8KJiM0MzsJaWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBpbnNucywgc2l6ZW9mKGluc25zKSwgc2lnLCAmYW1wO3NpZ19zeiksCiYjNDM7CQkgICAgICAgJiMzNDtzaWduLWZpbGUmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CW1lbXNldCgmYW1wO2F0dHIsIDAsIHNpemVvZihhdHRyKSk7CiYjNDM7CWF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMOwomIzQzOwlhdHRyLmluc25zID0gcHRyX3RvX3U2NChpbnNucyk7CiYjNDM7CWF0dHIuaW5zbl9jbnQgPSBBUlJBWV9TSVpFKGluc25zKTsKJiM0MzsJYXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NCgmIzM0O0R1YWwgQlNEL0dQTCYjMzQ7KTsKJiM0MzsJYXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFOwomIzQzOwlhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTsKJiM0MzsJYXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejsKJiM0MzsJYXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HOwomIzQzOwkvKiBmZF9hcnJheSBhbmQgZmRfYXJyYXlfY250IGRlbGliZXJhdGVseSBsZWZ0IE5VTEwvMC4gKi8KJiM0MzsJbWVtY3B5KGF0dHIucHJvZ19uYW1lLCAmIzM0O3NpZ25lZF9ub21hcCYjMzQ7LCBzaXplb2YoJiMzNDtzaWduZWRfbm9tYXAmIzM0OykpOwomIzQzOwomIzQzOwlwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgJmFtcDthdHRyLAomIzQzOwkJCSAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocHJvZ19mZCwgMCwgJiMzNDttYXAtbGVzcyBzaWduZWQgcHJvZ3JhbSBsb2FkZWQmIzM0OykpIHsKJiM0MzsJCWlmIChwcm9nX2ZkICZndDs9IDApCiYjNDM7CQkJY2xvc2UocHJvZ19mZCk7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsJY2xvc2UocHJvZ19mZCk7CiYjNDM7CiYjNDM7CS8qIFRoZSBzaWduYXR1cmUgY292ZXJzIHRoZSBpbnN0cnVjdGlvbnMsIHNvIHRhbXBlcmluZyBtdXN0IGJlIHJlamVjdGVkLiAqLwomIzQzOwlpbnNuc1swXS5pbW0gPSAxOwomIzQzOwlwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgJmFtcDthdHRyLAomIzQzOwkJCSAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTsKJiM0MzsJZXJyID0gcHJvZ19mZCAmbHQ7IDAgPyAtZXJybm8gOiBwcm9nX2ZkOwomIzQzOwlBU1NFUlRfRVEoZXJyLCAtRUtFWVJFSkVDVEVELCAmIzM0O3RhbXBlcmVkIG1hcC1sZXNzIHByb2dyYW0gcmVqZWN0ZWQmIzM0Oyk7CiYjNDM7CWlmIChwcm9nX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShwcm9nX2ZkKTsKJiM0MztjbGVhbnVwOgomIzQzOwlydW5fc2V0dXAoJiMzNDtjbGVhbnVwJiMzNDssIGRpcik7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBzaWduZWQgcHJvZ3JhbSBtYXkgcmVhY2ggbWFwcyBvbmx5IHRocm91Z2ggZmRfYXJyYXkgaW5kaWNlcywgc28gdGhlIGtlcm5lbAomIzQzOyAqIGZvbGRzIChhbmQgdGh1cyBhdHRlc3RzKSB0aGVtLiBBIGRpcmVjdCBCUEZfUFNFVURPX01BUF9GRCByZWZlcmVuY2UgLSBhIHJhdywKJiM0MzsgKiB1bmZvbGRlZCBmZCBiYWtlZCBpbnRvIHRoZSBzaWduZWQgaW5zdHJ1Y3Rpb25zIC0gaXMgcmVqZWN0ZWQgYnkgdGhlIHZlcmlmaWVyLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHNpZ25lZF9tYXBfYnlfZmRfcmVqZWN0ZWQodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0gewomIzQzOwkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAomIzQzOwkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAomIzQzOwkJQlBGX0VYSVRfSU5TTigpLAomIzQzOwl9OwomIzQzOwljaGFyIGRpcl90bXBsW10gPSAmIzM0Oy90bXAvc2lnbmVkX2xvYWRlclhYWFhYWCYjMzQ7LCAqZGlyOwomIzQzOwlfX3UzMiBzaWdfc3ogPSA4MTkyOwomIzQzOwl1bmlvbiBicGZfYXR0ciBhdHRyOwomIzQzOwlfX3U4IHNpZ1s4MTkyXTsKJiM0MzsJaW50IG1hcF9mZCwgcHJvZ19mZCwgZXJyOwomIzQzOwomIzQzOwltYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVksICYjMzQ7c2lnX21hcGZkJiMzNDssIDQsIDQsIDEsIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShtYXBfZmQsIDAsICYjMzQ7bWFwX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaW5zbnNbMF0uaW1tID0gbWFwX2ZkOwkvKiBiYWtlIHRoZSByYXcgbWFwIGZkIGludG8gdGhlIGxkX2ltbTY0ICovCiYjNDM7CiYjNDM7CXN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgJiMzNDtrZXlyaW5nJiMzNDssICYjMzQ7X3VpZC4wJiMzNDssIE5VTEwsCiYjNDM7CQlLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpOwomIzQzOwlkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQomIzQzOwkJZ290byBvdXRfbWFwOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoJiMzNDtzZXR1cCYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKJiM0MzsJCXJtZGlyKGRpcik7CiYjNDM7CQlnb3RvIG91dF9tYXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogU2lnbiB0aGUgaW5zdHJ1Y3Rpb25zLCByYXcgbWFwIGZkIGFuZCBhbGwuICovCiYjNDM7CWlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgaW5zbnMsIHNpemVvZihpbnNucyksIHNpZywgJmFtcDtzaWdfc3opLAomIzQzOwkJICAgICAgICYjMzQ7c2lnbi1maWxlJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwltZW1zZXQoJmFtcDthdHRyLCAwLCBzaXplb2YoYXR0cikpOwomIzQzOwlhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDsKJiM0MzsJYXR0ci5pbnNucyA9IHB0cl90b191NjQoaW5zbnMpOwomIzQzOwlhdHRyLmluc25fY250ID0gQVJSQVlfU0laRShpbnNucyk7CiYjNDM7CWF0dHIubGljZW5zZSA9IHB0cl90b191NjQoJiMzNDtEdWFsIEJTRC9HUEwmIzM0Oyk7CiYjNDM7CWF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTsKJiM0MzsJYXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7CiYjNDM7CWF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7CiYjNDM7CWF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORzsKJiM0MzsJLyogTm8gZmRfYXJyYXk6IHRoZSBtYXAgaXMgcmVhY2hlZCBieSBhIHJhdyBmZCBpbiB0aGUgaW5zdHJ1Y3Rpb25zLiAqLwomIzQzOwltZW1jcHkoYXR0ci5wcm9nX25hbWUsICYjMzQ7c2lnbmVkX21hcGZkJiMzNDssIHNpemVvZigmIzM0O3NpZ25lZF9tYXBmZCYjMzQ7KSk7CiYjNDM7CiYjNDM7CXByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCAmYW1wO2F0dHIsCiYjNDM7CQkJICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpOwomIzQzOwllcnIgPSBwcm9nX2ZkICZsdDsgMCA/IC1lcnJubyA6IHByb2dfZmQ7CiYjNDM7CUFTU0VSVF9FUShlcnIsIC1FSU5WQUwsICYjMzQ7c2lnbmVkIHByb2dyYW0gcmVmZXJlbmNpbmcgYSBtYXAgYnkgZmQgcmVqZWN0ZWQmIzM0Oyk7CiYjNDM7CWlmIChwcm9nX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShwcm9nX2ZkKTsKJiM0MztjbGVhbnVwOgomIzQzOwlydW5fc2V0dXAoJiMzNDtjbGVhbnVwJiMzNDssIGRpcik7CiYjNDM7b3V0X21hcDoKJiM0MzsJY2xvc2UobWFwX2ZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBIHNpZ25lZCBwcm9ncmFtIG1heSByZWFjaCBtYXBzIG9ubHkgdGhyb3VnaCB0aGUgY29udGludW91cyBmZF9hcnJheSwgc28gdGhlCiYjNDM7ICoga2VybmVsIGZvbGRzIChhbmQgdGh1cyBhdHRlc3RzKSB0aGVtLiBSZWZlcmVuY2luZyBhIG1hcCBieSBmZF9hcnJheSAqaW5kZXgqCiYjNDM7ICogd2hpbGUgbGVhdmluZyBmZF9hcnJheV9jbnQgYXQgMCBzZWxlY3RzIHRoZSBzcGFyc2UgcGF0aCwgd2hpY2ggcmVzb2x2ZXMgYSBtYXAKJiM0MzsgKiB0aGUgc2lnbmF0dXJlIG5ldmVyIGNvdmVyZWQ7IHRoZSB2ZXJpZmllciByZWplY3RzIGl0IHVwIGZyb250IHdpdGggLUVBQ0NFUy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBzaWduZWRfc3BhcnNlX2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2luc24gaW5zbnNbXSA9IHsKJiM0MzsJCUJQRl9MRF9JTU02NF9SQVcoQlBGX1JFR18xLCBCUEZfUFNFVURPX01BUF9JRFgsIDApLAomIzQzOwkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAomIzQzOwkJQlBGX0VYSVRfSU5TTigpLAomIzQzOwl9OwomIzQzOwljaGFyIGRpcl90bXBsW10gPSAmIzM0Oy90bXAvc2lnbmVkX2xvYWRlcl9zcFhYWFhYWCYjMzQ7LCAqZGlyOwomIzQzOwlfX3UzMiBzaWdfc3ogPSA4MTkyOwomIzQzOwl1bmlvbiBicGZfYXR0ciBhdHRyOwomIzQzOwlfX3U4IHNpZ1s4MTkyXTsKJiM0MzsJaW50IG1hcF9mZCwgcHJvZ19mZCwgZXJyOwomIzQzOwomIzQzOwltYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVksICYjMzQ7c2lnX3NwYXJzZSYjMzQ7LCA0LCA0LCAxLCBOVUxMKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UobWFwX2ZkLCAwLCAmIzM0O21hcF9jcmVhdGUmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CXN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgJiMzNDtrZXlyaW5nJiMzNDssICYjMzQ7X3VpZC4wJiMzNDssIE5VTEwsCiYjNDM7CQlLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpOwomIzQzOwlkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQomIzQzOwkJZ290byBvdXRfbWFwOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoJiMzNDtzZXR1cCYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKJiM0MzsJCXJtZGlyKGRpcik7CiYjNDM7CQlnb3RvIG91dF9tYXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogU2lnbiB0aGUgaW5zdHJ1Y3Rpb25zIGFsb25lOyB0aGUgc3BhcnNlIG1hcCBpcyBub3QgZm9sZGVkLiAqLwomIzQzOwlpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGluc25zLCBzaXplb2YoaW5zbnMpLCBzaWcsICZhbXA7c2lnX3N6KSwKJiM0MzsJCSAgICAgICAmIzM0O3NpZ24tZmlsZSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJbWVtc2V0KCZhbXA7YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTsKJiM0MzsJYXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7CiYjNDM7CWF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGluc25zKTsKJiM0MzsJYXR0ci5pbnNuX2NudCA9IEFSUkFZX1NJWkUoaW5zbnMpOwomIzQzOwlhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KCYjMzQ7RHVhbCBCU0QvR1BMJiMzNDspOwomIzQzOwlhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7CiYjNDM7CWF0dHIuZmRfYXJyYXkgPSBwdHJfdG9fdTY0KCZhbXA7bWFwX2ZkKTsKJiM0MzsJYXR0ci5mZF9hcnJheV9jbnQgPSAwOyAvKiBzcGFyc2U6IGZvcmNlIGxhenkgbWFwIHJlc29sdXRpb24gKi8KJiM0MzsJYXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7CiYjNDM7CWF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7CiYjNDM7CWF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORzsKJiM0MzsJbWVtY3B5KGF0dHIucHJvZ19uYW1lLCAmIzM0O3NpZ25lZF9zcGFyc2UmIzM0Oywgc2l6ZW9mKCYjMzQ7c2lnbmVkX3NwYXJzZSYjMzQ7KSk7CiYjNDM7CiYjNDM7CXByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCAmYW1wO2F0dHIsCiYjNDM7CQkJICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpOwomIzQzOwllcnIgPSBwcm9nX2ZkICZsdDsgMCA/IC1lcnJubyA6IHByb2dfZmQ7CiYjNDM7CUFTU0VSVF9FUShlcnIsIC1FQUNDRVMsICYjMzQ7c2lnbmVkIHByb2dyYW0gYmluZGluZyBhIHNwYXJzZSBmZF9hcnJheSBtYXAgcmVqZWN0ZWQmIzM0Oyk7CiYjNDM7CWlmIChwcm9nX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShwcm9nX2ZkKTsKJiM0MztjbGVhbnVwOgomIzQzOwlydW5fc2V0dXAoJiMzNDtjbGVhbnVwJiMzNDssIGRpcik7CiYjNDM7b3V0X21hcDoKJiM0MzsJY2xvc2UobWFwX2ZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgc2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZCh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7CiYjNDM7CQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCBCUEZfUFNFVURPX0tGVU5DX0NBTEwsIDEsIDEpLAomIzQzOwkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAomIzQzOwkJQlBGX0VYSVRfSU5TTigpLAomIzQzOwl9OwomIzQzOwljaGFyIGRpcl90bXBsW10gPSAmIzM0Oy90bXAvc2lnbmVkX2xvYWRlcl9rZm5YWFhYWFgmIzM0OywgKmRpcjsKJiM0MzsJaW50IHByb2dfZmQsIGVyciwgZmRzWzJdOwomIzQzOwlzdHJ1Y3QgYnRmICpidGYgPSBOVUxMOwomIzQzOwlfX3UzMiBzaWdfc3ogPSA4MTkyOwomIzQzOwl1bmlvbiBicGZfYXR0ciBhdHRyOwomIzQzOwlfX3U4IHNpZ1s4MTkyXTsKJiM0MzsKJiM0MzsJc3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCAmIzM0O2tleXJpbmcmIzM0OywgJiMzNDtfdWlkLjAmIzM0OywgTlVMTCwKJiM0MzsJCUtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7CiYjNDM7CWRpciA9IG1rZHRlbXAoZGlyX3RtcGwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCAmIzM0O21rZHRlbXAmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwJiMzNDssIGRpciksICYjMzQ7dmVyaWZ5X3NpZ19zZXR1cCYjMzQ7KSkgewomIzQzOwkJcm1kaXIoZGlyKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwlpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGluc25zLCBzaXplb2YoaW5zbnMpLCBzaWcsICZhbXA7c2lnX3N6KSwKJiM0MzsJCSAgICAgICAmIzM0O3NpZ24tZmlsZSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJYnRmID0gYnRmX19uZXdfZW1wdHkoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgJiMzNDtidGZfbmV3X2VtcHR5JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlidGZfX2FkZF9pbnQoYnRmLCAmIzM0O2ludCYjMzQ7LCA0LCBCVEZfSU5UX1NJR05FRCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCAmIzM0O2J0Zl9sb2FkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlmZHNbMF0gPSAtMTsKJiM0MzsJZmRzWzFdID0gYnRmX19mZChidGYpOwomIzQzOwomIzQzOwltZW1zZXQoJmFtcDthdHRyLCAwLCBzaXplb2YoYXR0cikpOwomIzQzOwlhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDsKJiM0MzsJYXR0ci5pbnNucyA9IHB0cl90b191NjQoaW5zbnMpOwomIzQzOwlhdHRyLmluc25fY250ID0gQVJSQVlfU0laRShpbnNucyk7CiYjNDM7CWF0dHIubGljZW5zZSA9IHB0cl90b191NjQoJiMzNDtEdWFsIEJTRC9HUEwmIzM0Oyk7CiYjNDM7CWF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTsKJiM0MzsJYXR0ci5mZF9hcnJheSA9IHB0cl90b191NjQoZmRzKTsKJiM0MzsJYXR0ci5mZF9hcnJheV9jbnQgPSAwOyAvKiBzcGFyc2U6IGZvcmNlIGxhenkga2Z1bmMgQlRGIHJlc29sdXRpb24gKi8KJiM0MzsJYXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7CiYjNDM7CWF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7CiYjNDM7CWF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORzsKJiM0MzsJbWVtY3B5KGF0dHIucHJvZ19uYW1lLCAmIzM0O3NpZ25lZF9rZnVuYyYjMzQ7LCBzaXplb2YoJiMzNDtzaWduZWRfa2Z1bmMmIzM0OykpOwomIzQzOwomIzQzOwlwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgJmFtcDthdHRyLAomIzQzOwkJCSAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTsKJiM0MzsJZXJyID0gcHJvZ19mZCAmbHQ7IDAgPyAtZXJybm8gOiBwcm9nX2ZkOwomIzQzOwlpZiAocHJvZ19mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UocHJvZ19mZCk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUShlcnIsIC1FQUNDRVMsICYjMzQ7bW9kdWxlIGtmdW5jIEJURiBpbiBzaWduZWQgcHJvZ3JhbSByZWplY3RlZCYjMzQ7KTsKJiM0MztjbGVhbnVwOgomIzQzOwlpZiAoYnRmKQomIzQzOwkJYnRmX19mcmVlKGJ0Zik7CiYjNDM7CXJ1bl9zZXR1cCgmIzM0O2NsZWFudXAmIzM0OywgZGlyKTsKJiM0Mzt9CiYjNDM7CiB2b2lkIHRlc3Rfc2lnbmVkX2xvYWRlcih2b2lkKQogewotCWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWV0YWRhdGFfY2hlY2tfc2hhcGUmIzM0OykpCi0JCW1ldGFkYXRhX2NoZWNrX3NoYXBlKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bG9hZHRpbWVfbm9fbWFwJiMzNDspKQomIzQzOwkJbG9hZHRpbWVfbm9fbWFwKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bG9hZHRpbWVfd2l0aF9tYXAmIzM0OykpCiYjNDM7CQlsb2FkdGltZV93aXRoX21hcCgpOwogCWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWV0YWRhdGFfbWF0Y2gmIzM0OykpCiAJCW1ldGFkYXRhX21hdGNoKCk7Ci0JaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDttZXRhZGF0YV9zaGFfbWlzbWF0Y2gmIzM0OykpCi0JCW1ldGFkYXRhX3NoYV9taXNtYXRjaCgpOwotCWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWV0YWRhdGFfbm90X2V4Y2x1c2l2ZSYjMzQ7KSkKLQkJbWV0YWRhdGFfbm90X2V4Y2x1c2l2ZSgpOwotCWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWV0YWRhdGFfaGFzaF9ub3RfY29tcHV0ZWQmIzM0OykpCi0JCW1ldGFkYXRhX2hhc2hfbm90X2NvbXB1dGVkKCk7CiAJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzaWduYXR1cmVfZW5mb3JjZWQmIzM0OykpCiAJCXNpZ25hdHVyZV9lbmZvcmNlZCgpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3NpZ25lZF9ub25leGNsX2ZkX2FycmF5X3JlamVjdGVkJiMzNDspKQomIzQzOwkJc2lnbmVkX25vbmV4Y2xfZmRfYXJyYXlfcmVqZWN0ZWQoKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzaWduZWRfdW5mcm96ZW5fZmRfYXJyYXlfcmVqZWN0ZWQmIzM0OykpCiYjNDM7CQlzaWduZWRfdW5mcm96ZW5fZmRfYXJyYXlfcmVqZWN0ZWQoKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzaWduZWRfbm9uYXJyYXlfZmRfYXJyYXlfcmVqZWN0ZWQmIzM0OykpCiYjNDM7CQlzaWduZWRfbm9uYXJyYXlfZmRfYXJyYXlfcmVqZWN0ZWQoKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzaWduZWRfYnRmX2ZkX2FycmF5X3JlamVjdGVkJiMzNDspKQomIzQzOwkJc2lnbmVkX2J0Zl9mZF9hcnJheV9yZWplY3RlZCgpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3NpZ25lZF9tb2R1bGVfa2Z1bmNfcmVqZWN0ZWQmIzM0OykpCiYjNDM7CQlzaWduZWRfbW9kdWxlX2tmdW5jX3JlamVjdGVkKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7c2lnbmF0dXJlX2ZhaWx1cmVfbG9ncyYjMzQ7KSkKJiM0MzsJCXNpZ25hdHVyZV9mYWlsdXJlX2xvZ3MoKTsKIAlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3NpZ25hdHVyZV90b29fbGFyZ2UmIzM0OykpCiAJCXNpZ25hdHVyZV90b29fbGFyZ2UoKTsKIAlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3NpZ25hdHVyZV9iYWRfa2V5cmluZyYjMzQ7KSkKQEAgLTExMTQsNiAmIzQzOzE3ODIsOCBAQCB2b2lkIHRlc3Rfc2lnbmVkX2xvYWRlcih2b2lkKQogCQltZXRhZGF0YV9jdHhfaW5pdGlhbF92YWx1ZV9pZ25vcmVkKCk7CiAJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzaWduYXR1cmVfYXV0aGVudGljYXRlc19pbnNucyYjMzQ7KSkKIAkJc2lnbmF0dXJlX2F1dGhlbnRpY2F0ZXNfaW5zbnMoKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzaWduYXR1cmVfYXV0aGVudGljYXRlc19tZXRhZGF0YSYjMzQ7KSkKJiM0MzsJCXNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX21ldGFkYXRhKCk7CiAJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtoYXNoX3JlcXVpcmVzX2Zyb3plbiYjMzQ7KSkKIAkJaGFzaF9yZXF1aXJlc19mcm96ZW4oKTsKIAlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O25vX3VwZGF0ZV9hZnRlcl9mcmVlemUmIzM0OykpCkBAIC0xMTMyLDQgJiM0MzsxODAyLDEwIEBAIHZvaWQgdGVzdF9zaWduZWRfbG9hZGVyKHZvaWQpCiAJCW1hcF9oYXNoX3Vuc3VwcG9ydGVkX3R5cGUoKTsKIAlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2xzbV9zaWduYXR1cmVfdmVyZGljdCYjMzQ7KSkKIAkJbHNtX3NpZ25hdHVyZV92ZXJkaWN0KCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7c2lnbmVkX25vX2ZkX2FycmF5JiMzNDspKQomIzQzOwkJc2lnbmVkX25vX2ZkX2FycmF5KCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7c2lnbmVkX21hcF9ieV9mZF9yZWplY3RlZCYjMzQ7KSkKJiM0MzsJCXNpZ25lZF9tYXBfYnlfZmRfcmVqZWN0ZWQoKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzaWduZWRfc3BhcnNlX2ZkX2FycmF5X3JlamVjdGVkJiMzNDspKQomIzQzOwkJc2lnbmVkX3NwYXJzZV9mZF9hcnJheV9yZWplY3RlZCgpOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfc2lnbmVkX2xvYWRlci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfc2lnbmVkX2xvYWRlci5jCmluZGV4IGQ5YTRiODVmOTM5MWY1Li41MDQ1MWE2OWI5OWEyNyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfc2lnbmVkX2xvYWRlci5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3NpZ25lZF9sb2FkZXIuYwpAQCAtNCwxMCAmIzQzOzQsMTEgQEAKIAogLyoKICAqIE1pbmltYWwsIG1hcC1sZXNzIHByb2dyYW0uIERyaXZlbiB0aHJvdWdoIGxpYmJwZiYjMzk7cyBnZW5fbG9hZGVyIChnZW5faGFzaCkKLSAqIGJ5IHByb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jIHNvIHRoZSBnZW5lcmF0ZWQgbGlnaHQtc2tlbGV0b24gbG9hZGVyICh3aXRoCi0gKiB0aGUgZW1pdF9zaWduYXR1cmVfbWF0Y2ggbWV0YWRhdGEgY2hlY2spIGNhbiBiZSBleGVyY2lzZWQgYWdhaW5zdCBnb29kCi0gKiBhbmQgdGFtcGVyZWQgbWV0YWRhdGEuIEEgc29ja2V0IGZpbHRlciBuZWVkcyBubyBsb2FkLXRpbWUgYXR0YWNoIHJlc29sdXRpb24sCi0gKiBhbmQgaGF2aW5nIG5vIG1hcHMga2VlcHMgdGhlIGdlbmVyYXRlZCBsb2FkZXImIzM5O3MgY3R4IHRyaXZpYWwgKDAgbWFwcywgMSBwcm9nKS4KJiM0MzsgKiBieSBwcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYyBzbyB0aGUgZ2VuZXJhdGVkIGxpZ2h0LXNrZWxldG9uIGxvYWRlciBjYW4gYmUKJiM0MzsgKiBleGVyY2lzZWQgYWdhaW5zdCBnb29kIGFuZCB0YW1wZXJlZCBtZXRhZGF0YSwgd2hpY2ggdGhlIGtlcm5lbCBub3cgdmVyaWZpZXMKJiM0MzsgKiBhdCBsb2FkIHRpbWUgdmlhIHRoZSBpbnNuc3x8bWV0YWRhdGEgc2lnbmF0dXJlLiBBIHNvY2tldCBmaWx0ZXIgbmVlZHMgbm8KJiM0MzsgKiBsb2FkLXRpbWUgYXR0YWNoIHJlc29sdXRpb24sIGFuZCBoYXZpbmcgbm8gbWFwcyBrZWVwcyB0aGUgZ2VuZXJhdGVkIGxvYWRlciYjMzk7cwomIzQzOyAqIGN0eCB0cml2aWFsICgwIG1hcHMsIDEgcHJvZykuCiAgKi8KIFNFQygmIzM0O3NvY2tldCYjMzQ7KQogaW50IHByb2JlKHZvaWQgKmN0eCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy92ZXJpZmllcl9tYXBfcHRyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdmVyaWZpZXJfbWFwX3B0ci5jCmluZGV4IDE2NjE5MzY1OTg3MDNjLi5lMGE2NTgzNWM4NjFiYiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3ZlcmlmaWVyX21hcF9wdHIuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdmVyaWZpZXJfbWFwX3B0ci5jCkBAIC03MiwxNCAmIzQzOzcyLDE1IEBAIF9fbmFrZWQgdm9pZCBicGZfbWFwX3B0cl93cml0ZV9yZWplY3RlZCh2b2lkKQogCiAvKgogICogc3RydWN0IGJwZl9tYXAgc3RhcnRzIHdpdGggdGhlIFNIQTI1NiBoYXNoIHNoYVszMl0gYXQgb2Zmc2V0IDAgKGEgcmVhZGFibGUKLSAqIGJ5dGUgYXJyYXkpLCB0aGUgdTMyIGV4Y2wgZmllbGQgYXQgb2Zmc2V0IDMyLCBhbmQgdGhlIG9wcyBwb2ludGVyIGF0IG9mZnNldAotICogNDAuIFJlYWRpbmcgYSB1MzIgYXQgb2Zmc2V0IDQxIHJlYWNoZXMgaW50byB0aGUgbWlkZGxlIG9mIHRoZSBvcHMgcG9pbnRlciwKLSAqIGkuZS4gYSBwYXJ0aWFsIHBvaW50ZXIgYWNjZXNzLCB3aGljaCBpcyByZWplY3RlZC4KJiM0MzsgKiBieXRlIGFycmF5KSwgZm9sbG93ZWQgYnkgdGhlIG9wcyBwb2ludGVyIGF0IG9mZnNldCAzMiBhbmQgdGhlIGlubmVyX21hcF9tZXRhCiYjNDM7ICogcG9pbnRlciBhdCBvZmZzZXQgNDAuIFJlYWRpbmcgYSB1MzIgYXQgb2Zmc2V0IDQxIHJlYWNoZXMgaW50byB0aGUgbWlkZGxlIG9mCiYjNDM7ICogdGhlIGlubmVyX21hcF9tZXRhIHBvaW50ZXIsIGkuZS4gYSBwYXJ0aWFsIHBvaW50ZXIgYWNjZXNzLCB3aGljaCBpcwomIzQzOyAqIHJlamVjdGVkLgogICovCiBTRUMoJiMzNDtzb2NrZXQmIzM0OykKIF9fZGVzY3JpcHRpb24oJiMzNDticGZfbWFwX3B0cjogcmVhZCBub24tZXhpc3RlbnQgZmllbGQgcmVqZWN0ZWQmIzM0OykKIF9fZmFpbHVyZQotX19tc2coJiMzNDtjYW5ub3QgYWNjZXNzIHB0ciBtZW1iZXIgb3BzIHdpdGggbW9mZiA0MCBpbiBzdHJ1Y3QgYnBmX21hcCB3aXRoIG9mZiA0MSBzaXplIDQmIzM0OykKJiM0MztfX21zZygmIzM0O2Nhbm5vdCBhY2Nlc3MgcHRyIG1lbWJlciBpbm5lcl9tYXBfbWV0YSB3aXRoIG1vZmYgNDAgaW4gc3RydWN0IGJwZl9tYXAgd2l0aCBvZmYgNDEgc2l6ZSA0JiMzNDspCiBfX2ZhaWx1cmVfdW5wcml2CiBfX21zZ191bnByaXYoJiMzNDthY2Nlc3MgaXMgYWxsb3dlZCBvbmx5IHRvIENBUF9QRVJGTU9OIGFuZCBDQVBfU1lTX0FETUlOJiMzNDspCiBfX2ZsYWcoQlBGX0ZfQU5ZX0FMSUdOTUVOVCkKQEAgLTk3LDIzICYjNDM7OTgsMjMgQEAgX19uYWtlZCB2b2lkIHJlYWRfbm9uX2V4aXN0ZW50X2ZpZWxkX3JlamVjdGVkKHZvaWQpCiB9CiAKIC8qCi0gKiBUaGUgdTMyIGV4Y2wgZmllbGQgc3BhbnMgb2Zmc2V0cyAzMi4uMzUgKG1lbmQgMzYpLiBSZWFkaW5nIGEgdTMyIGF0IG9mZnNldAotICogMzMgc3RhcnRzIGluc2lkZSBleGNsIGJ1dCBleHRlbmRzIHBhc3QgaXRzIGVuZCwgd2hpY2ggdGhlIHZlcmlmaWVyIHJlamVjdHMKJiM0MzsgKiBUaGUgc2hhIGJ5dGUgYXJyYXkgc3BhbnMgb2Zmc2V0cyAwLi4zMSAobWVuZCAzMikuIFJlYWRpbmcgYSB1MzIgYXQgb2Zmc2V0CiYjNDM7ICogMzAgc3RhcnRzIGluc2lkZSBzaGEgYnV0IGV4dGVuZHMgcGFzdCBpdHMgZW5kLCB3aGljaCB0aGUgdmVyaWZpZXIgcmVqZWN0cwogICogYXMgYW4gb3V0LW9mLWJvdW5kcyBzY2FsYXIgYWNjZXNzLgogICovCiBTRUMoJiMzNDtzb2NrZXQmIzM0OykKLV9fZGVzY3JpcHRpb24oJiMzNDticGZfbWFwX3B0cjogcmVhZCBiZXlvbmQgZXhjbCBmaWVsZCByZWplY3RlZCYjMzQ7KQomIzQzO19fZGVzY3JpcHRpb24oJiMzNDticGZfbWFwX3B0cjogcmVhZCBiZXlvbmQgc2hhIGZpZWxkIHJlamVjdGVkJiMzNDspCiBfX2ZhaWx1cmUKLV9fbXNnKCYjMzQ7YWNjZXNzIGJleW9uZCB0aGUgZW5kIG9mIG1lbWJlciBleGNsIChtZW5kOjM2KSBpbiBzdHJ1Y3QgYnBmX21hcCB3aXRoIG9mZiAzMyBzaXplIDQmIzM0OykKJiM0MztfX21zZygmIzM0O2FjY2VzcyBiZXlvbmQgdGhlIGVuZCBvZiBtZW1iZXIgc2hhIChtZW5kOjMyKSBpbiBzdHJ1Y3QgYnBmX21hcCB3aXRoIG9mZiAzMCBzaXplIDQmIzM0OykKIF9fZmFpbHVyZV91bnByaXYKIF9fbXNnX3VucHJpdigmIzM0O2FjY2VzcyBpcyBhbGxvd2VkIG9ubHkgdG8gQ0FQX1BFUkZNT04gYW5kIENBUF9TWVNfQURNSU4mIzM0OykKIF9fZmxhZyhCUEZfRl9BTllfQUxJR05NRU5UKQotX19uYWtlZCB2b2lkIHJlYWRfYmV5b25kX2V4Y2xfZmllbGRfcmVqZWN0ZWQodm9pZCkKJiM0MztfX25ha2VkIHZvaWQgcmVhZF9iZXlvbmRfc2hhX2ZpZWxkX3JlamVjdGVkKHZvaWQpCiB7CiAJYXNtIHZvbGF0aWxlICgmIzM0OwkJCQkJXAogCXI2ID0gMDsJCQkJCQlcCiAJcjEgPSAlW21hcF9hcnJheV80OGJdIGxsOwkJCVwKLQlyNiA9ICoodTMyKikocjEgJiM0MzsgMzMpOwkJCQlcCiYjNDM7CXI2ID0gKih1MzIqKShyMSAmIzQzOyAzMCk7CQkJCVwKIAlyMCA9IDE7CQkJCQkJXAogCWV4aXQ7CQkJCQkJXAogJiMzNDsJOgpAQCAtMTMxLDcgJiM0MzsxMzIsNyBAQCBfX25ha2VkIHZvaWQgcHRyX3JlYWRfb3BzX2ZpZWxkX2FjY2VwdGVkKHZvaWQpCiAJYXNtIHZvbGF0aWxlICgmIzM0OwkJCQkJXAogCXI2ID0gMDsJCQkJCQlcCiAJcjEgPSAlW21hcF9hcnJheV80OGJdIGxsOwkJCVwKLQlyNiA9ICoodTY0KikocjEgJiM0MzsgNDApOwkJCQlcCiYjNDM7CXI2ID0gKih1NjQqKShyMSAmIzQzOyAzMik7CQkJCVwKIAlyMCA9IDE7CQkJCQkJXAogCWV4aXQ7CQkJCQkJXAogJiMzNDsJOgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNiAyMDoyNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MzE5MgoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDY0MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBCUEYgU2lnbmluZyBQYXRjaCBTZXJpZXMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggc2VyaWVzIGFpbWVkIGF0IGludHJvZHVjaW5nIEJQRiBzaWduaW5nLiBJdCBzZWVtcyBsaWtlIGEgcHJldHR5IHNpZ25pZmljYW50IHNoaWZ0LCBjZW50cmFsaXppbmcgdGhlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gcHJvY2VzcyB3aXRoaW4gdGhlIGtlcm5lbCB2ZXJpZmllciBpdHNlbGYuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGlzIGNvdWxkIGhhdmUgc2VyaW91cyBpbXBsaWNhdGlvbnMsIGJvdGggaW4gdGVybXMgb2Ygc2VjdXJpdHkgYW5kIHBlcmZvcm1hbmNlLCBhbmQgd2lsbCB3YXJyYW50IGEgdGhvcm91Z2ggcmV2aWV3LgoKTXkgaW1tZWRpYXRlIGltcHJlc3Npb24gaXMgdGhhdCB0aGUgY2hhbmdlcyBhcmUgZmFpcmx5IGV4dGVuc2l2ZSwgdG91Y2hpbmcgbXVsdGlwbGUgZmlsZXMgYWNyb3NzIHRoZSBrZXJuZWwgYW5kIHRvb2xpbmcuIEkgc2VlIG5ldyBkb2N1bWVudGF0aW9uIHdpdGggYERvY3VtZW50YXRpb24vYnBmL3NpZ25pbmcucnN0YCwgd2hpY2ggaXMgYSBnb29kIHNpZ24g4oCTIHRoYXQmIzM5O3Mgc29tZXRoaW5nIHRvIGRlbHZlIGludG8uIFRoZSBjb3JlIGtlcm5lbCBmaWxlcyBhZmZlY3RlZCDigJMgYGluY2x1ZGUvbGludXgvYnBmLmhgLCBgaW5jbHVkZS9saW51eC9icGZfdmVyaWZpZXIuaGAsIGBrZXJuZWwvYnBmL3N5c2NhbGwuY2AsIGBrZXJuZWwvYnBmL3ZlcmlmaWVyLmNgIOKAkyBjbGVhcmx5IGluZGljYXRlIHRoZSBoZWFydCBvZiB0aGUgY2hhbmdlOiBpbnRlZ3JhdGluZyB0aGUgc2lnbmluZyBmdW5jdGlvbmFsaXR5IGRpcmVjdGx5IGludG8gdGhlIEJQRiB2ZXJpZmljYXRpb24gcHJvY2Vzcy4gVGhlIG1vZGlmaWNhdGlvbnMgdG8gYGJwZnRvb2xgIHN1Z2dlc3QgYWRkZWQgdG9vbGluZyBzdXBwb3J0IGZvciBnZW5lcmF0aW5nIGFuZCBtYW5hZ2luZyBzaWduYXR1cmVzLCB3aGljaCBpcyBpbXBvcnRhbnQuIEFuZCB0aGUgc2VsZnRlc3RzIGFyZSBhIGNyaXRpY2FsIGluZGljYXRvciB0aGF0IHRoZXkgY29uc2lkZXJlZCBhIGxvdCBvZiB0ZXN0Y2FzZXMuCgpUaGUga2V5IGZ1bmN0aW9uYWwgc2hpZnQgaXMgbW92aW5nIHRoZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZyb20gdXNlcnNwYWNlL2xvYWRlciBpbnRvIHRoZSBrZXJuZWwgdmVyaWZpZXIuIFNwZWNpZmljYWxseSwgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIGlzIHRoZSBmdW5jdGlvbiB0aGF0JiMzOTtzIGJlaW5nIG1vdmVkLiBJJiMzOTttIG5vdGluZyB0aGUgYWRkaXRpb24gb2YgYGZkX2FycmF5X2NudGAgdG8gYHVuaW9uIGJwZl9hdHRyYCBhbmQgdGhlIGhhbmRsaW5nIG9mIGNvbnRpbnVvdXMgYGZkX2FycmF5YCB3aXRoIGBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXNgIGFzIHdlbGwuIFRoZSBwcmVzZW5jZSBvZiBgZW52LSZndDtzaWduYXR1cmVgIGNoZWNrIHdpdGhpbiBgYnBmX2NoZWNrYCBhbmQgdGhlIHN1YnNlcXVlbnQgY2FsbCB0byBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgc2hvd3MgaG93IHRoZSBzaWduaW5nIGludGVncmF0aW9uIGlzIGJlaW5nIGltcGxlbWVudGVkIHdpdGhpbiB0aGUgZXhpc3RpbmcgdmVyaWZpY2F0aW9uIGZyYW1ld29yay4KCk15IGF0dGVudGlvbiBpcyBub3cgZm9jdXNlZCBvbiBga2VybmVsL2JwZi92ZXJpZmllci5jYCBhbmQgYGtlcm5lbC9icGYvc3lzY2FsbC5jYCB0byBzZWUgdGhlIGV4YWN0IG5hdHVyZSBvZiB0aGVzZSBtb2RpZmljYXRpb25zLiBJdCBzZWVtcyB0aGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBpcyBtb3ZpbmcgZnJvbSBgc3lzY2FsbC5jYCB0byBgdmVyaWZpZXIuY2Agd2hpY2gsIG9uIHRoZSBmYWNlIG9mIGl0LCBtYWtlcyBzZW5zZS4gQnV0IGl0IHJlcXVpcmVzIHNvbWUgZGV0YWlsZWQgY2hlY2tpbmcsIHdoaWNoIEkmIzM5O20gYWxyZWFkeSBkb2luZy4gVGhlIG1vZGlmaWNhdGlvbiBvZiBgcHJvY2Vzc19mZF9hcnJheWAgaXMgcmVsZXZhbnQsIHNpbmNlIHRoYXQgZGVhbHMgd2l0aCBmaWxlIGRlc2NyaXB0b3JzIGFuZCBtYXBzLiBBbmQgdGhlIGFkZGl0aW9uIG9mIGBmZF9hcnJheV9nZXRfbWFwX2lkeGAgYW5kIGBmZF9hcnJheV9nZXRfYnRmYCBtZWFucyBhIG5ldyB3YXkgb2YgZGVhbGluZyB3aXRoIGV4aXN0aW5nIHN0cnVjdHVyZXMuCgpHaXZlbiB0aGVzZSBrZXJuZWwgbW9kaWZpY2F0aW9ucywgSSYjMzk7bSB0aGlua2luZyB0aGlzIGlzIGRlZmluaXRlbHkgd29ydGggZnV6emluZy4gVGhlIGNoYW5nZXMgdG91Y2ggY29yZSBCUEYgdmVyaWZpZXIgbG9naWMsIG1lYW5pbmcgYW55IHZ1bG5lcmFiaWxpdGllcyBoZXJlIGNvdWxkIGJlIHF1aXRlIGltcGFjdGZ1bC4gTXkgZnV6emluZyB0YXJnZXRzIHdpbGwgYmU6IGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCwgYHByb2Nlc3NfZmRfYXJyYXlgLCBgcHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzYCwgYGZkX2FycmF5X2dldF9tYXBfaWR4YCwgYGZkX2FycmF5X2dldF9idGZgLCBhbmQgYGFkZF9mZF9mcm9tX2ZkX2FycmF5YC4gVGhlc2UgZnVuY3Rpb25zIGFyZSBub3cgY3JpdGljYWwuIEkgbmVlZCB0byBiZSBzdXJlIHRoYXQgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIGlzIHJlYWNoYWJsZSBpbiBhbGwgdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb25zLCBhbmQgaW4gYWxsIHRoZSBkaWZmZXJlbnQgY29kZSBwYXRocy4gSSYjMzk7bGwgbmVlZCB0byBjaGVjayB0aGUgcmVxdWlyZWQgY29uZmlncyBmb3IgQlBGIHNpZ25pbmcgdG8gZW5zdXJlIHRoZSB0ZXN0cyBhcmUgY29tcHJlaGVuc2l2ZS4gSSYjMzk7bGwgbmVlZCB0byBzZWFyY2ggZm9yIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBvciBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIHRvIGxvb2sgYXQgaG93IHRoZXNlIGZ1bmN0aW9ucyBhcmUgYmVpbmcgY2FsbGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjI1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2JwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvYnBmLmg9MzgyMj12b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KTtcbmluY2x1ZGUvbGludXgvYnBmLmg6MzgyMzppbnQgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKmRhdGFfcCxcbmluY2x1ZGUvbGludXgvYnBmLmgtMzgyNC1cdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnNpZ19wLFxuLS1cbmluY2x1ZGUvbGludXgvYnBmLmg9Mzg0Mj1zdGF0aWMgaW5saW5lIHZvaWQgYnBmX2tleV9wdXQoc3RydWN0IGJwZl9rZXkgKmJrZXkpXG4tLVxuaW5jbHVkZS9saW51eC9icGYuaC0zODQ1LVxuaW5jbHVkZS9saW51eC9icGYuaDozODQ2OnN0YXRpYyBpbmxpbmUgaW50IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpkYXRhX3AsXG5pbmNsdWRlL2xpbnV4L2JwZi5oLTM4NDctXHRcdFx0XHRcdCAgICAgY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnNpZ19wLFxuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jPTQyOTc9X19icGZfa2Z1bmMgdm9pZCBicGZfa2V5X3B1dChzdHJ1Y3QgYnBmX2tleSAqYmtleSlcbi0tXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00MzA1LS8qKlxua2VybmVsL2JwZi9oZWxwZXJzLmM6NDMwNjogKiBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSAtIHZlcmlmeSBhIFBLQ1MjNyBzaWduYXR1cmVcbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMDctICogQGRhdGFfcDogZGF0YSB0byB2ZXJpZnlcbi0tXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00MzE1LSAqL1xua2VybmVsL2JwZi9oZWxwZXJzLmM6NDMxNjpfX2JwZl9rZnVuYyBpbnQgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKmRhdGFfcCxcbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMTctXHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpzaWdfcCxcbi0tXG5rZXJuZWwvYnBmL2hlbHBlcnMuYz00ODU2PUJURl9JRF9GTEFHUyhmdW5jLCBicGZfa2V5X3B1dCwgS0ZfUkVMRUFTRSlcbmtlcm5lbC9icGYvaGVscGVycy5jLTQ4NTctI2lmZGVmIENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05cbmtlcm5lbC9icGYvaGVscGVycy5jOjQ4NTg6QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlLCBLRl9TTEVFUEFCTEUpXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00ODU5LSNlbmRpZlxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0xOTkyMz1zdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjAwMTUtXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjAwMTY6XHRlcnIgPSBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgoc3RydWN0IGJwZl9keW5wdHIgKilcdTAwMjZkYXRhX3B0cixcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMDAxNy1cdFx0XHRcdFx0IChzdHJ1Y3QgYnBmX2R5bnB0ciAqKVx1MDAyNnNpZ19wdHIsIGtleSk7XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9rZnVuY3MuaD03Nz1leHRlcm4gdm9pZCBicGZfa2V5X3B1dChzdHJ1Y3QgYnBmX2tleSAqa2V5KSBfX2tzeW07XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2tmdW5jcy5oOjc4OmV4dGVybiBpbnQgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKmRhdGFfcHRyLFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9rZnVuY3MuaC03OS1cdFx0XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpzaWdfcHRyLFxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tmdW5jX2R5bnB0cl9wYXJhbS5jPTIyPXN0YXRpYyBpbnQgbGliYnBmX3ByaW50X2NiKGVudW0gbGliYnBmX3ByaW50X2xldmVsIGxldmVsLCBjb25zdCBjaGFyICpmbXQsXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmMtMjctXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rZnVuY19keW5wdHJfcGFyYW0uYzoyODpcdGlmIChzdHJjbXAodmFfYXJnKGFyZ3MsIGNoYXIgKiksIFwmIzM0O2JwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlXCYjMzQ7KSlcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tmdW5jX2R5bnB0cl9wYXJhbS5jLTI5LVx0XHRyZXR1cm4gMDtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rZnVuY19keW5wdHJfcGFyYW0uYz0zNT1zdGF0aWMgYm9vbCBoYXNfcGtjczdfa2Z1bmNfc3VwcG9ydCh2b2lkKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tmdW5jX2R5bnB0cl9wYXJhbS5jLTUyLVx0XHRmcHJpbnRmKHN0ZGVycixcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tmdW5jX2R5bnB0cl9wYXJhbS5jOjUzOlx0XHQgIFwmIzM0OyVzOlNLSVA6YnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoKSBrZnVuYyBub3Qgc3VwcG9ydGVkXFxuXCYjMzQ7LFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmMtNTQtXHRcdCAgX19mdW5jX18pO1xuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYz00Nj1zdGF0aWMgaW50IGxpYmJwZl9wcmludF9jYihlbnVtIGxpYmJwZl9wcmludF9sZXZlbCBsZXZlbCwgY29uc3QgY2hhciAqZm10LFxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYy01NC1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYzo1NTpcdGlmIChzdHJjbXAodmFfYXJnKGFyZ3MsIGNoYXIgKiksIFwmIzM0O2JwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlXCYjMzQ7KSlcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYy01Ni1cdFx0cmV0dXJuIDA7XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jPTI0Mj1zdGF0aWMgdm9pZCB0ZXN0X3ZlcmlmeV9wa2NzN19zaWdfZnJvbV9tYXAodm9pZClcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZnlfcGtjczdfc2lnLmMtMjczLVx0XHRwcmludGYoXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZnlfcGtjczdfc2lnLmM6Mjc0Olx0XHQgIFwmIzM0OyVzOlNLSVA6YnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoKSBrZnVuYyBub3Qgc3VwcG9ydGVkXFxuXCYjMzQ7LFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jLTI3NS1cdFx0ICBfX2Z1bmNfXyk7XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmM9MzQ9aW50IEJQRl9QUk9HKG5vdF92YWxpZF9keW5wdHIsIGludCBjbWQsIHVuaW9uIGJwZl9hdHRyICphdHRyLCB1bnNpZ25lZCBpbnQgc2l6ZSwgYm9vbCBrZXJuZWwpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmMtMzctXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9rZnVuY19keW5wdHJfcGFyYW0uYzozODpcdHJldHVybiBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgoc3RydWN0IGJwZl9keW5wdHIgKilcdTAwMjZ2YWwsXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9rZnVuY19keW5wdHJfcGFyYW0uYy0zOS1cdFx0XHRcdFx0ICAoc3RydWN0IGJwZl9keW5wdHIgKilcdTAwMjZ2YWwsIE5VTEwpO1xuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2tmdW5jX2R5bnB0cl9wYXJhbS5jPTQ0PWludCBCUEZfUFJPRyhub3RfcHRyX3RvX3N0YWNrLCBpbnQgY21kLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgdW5zaWduZWQgaW50IHNpemUsIGJvb2wga2VybmVsKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2tmdW5jX2R5bnB0cl9wYXJhbS5jLTQ3LVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmM6NDg6XHRyZXR1cm4gYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoXHUwMDI2dmFsLCBcdTAwMjZ2YWwsIE5VTEwpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmMtNDktfVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2tmdW5jX2R5bnB0cl9wYXJhbS5jPTUyPWludCBCUEZfUFJPRyhkeW5wdHJfZGF0YV9udWxsLCBpbnQgY21kLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgdW5zaWduZWQgaW50IHNpemUsIGJvb2wga2VybmVsKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2tmdW5jX2R5bnB0cl9wYXJhbS5jLTc0LVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmM6NzU6XHRlcnIgPSBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShcdTAwMjZwdHIsIFx1MDAyNnB0ciwgdHJ1c3RlZF9rZXlyaW5nKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2tmdW5jX2R5bnB0cl9wYXJhbS5jLTc2LVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3NpZ19pbl94YXR0ci5jPTQ2PWludCBCUEZfUFJPRyh0ZXN0X2ZpbGVfb3Blbiwgc3RydWN0IGZpbGUgKmYpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfc2lnX2luX3hhdHRyLmMtNzktXHQvKiBWZXJpZnkgc2lnbmF0dXJlICovXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9zaWdfaW5feGF0dHIuYzo4MDpcdHJldCA9IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKFx1MDAyNmRpZ2VzdF9wdHIsIFx1MDAyNnNpZ19wdHIsIHRydXN0ZWRfa2V5cmluZyk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9zaWdfaW5feGF0dHIuYy04MS1cbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF92ZXJpZnlfcGtjczdfc2lnLmM9NDA9aW50IEJQRl9QUk9HKGJwZiwgaW50IGNtZCwgdW5pb24gYnBmX2F0dHIgKmF0dHIsIHVuc2lnbmVkIGludCBzaXplLCBib29sIGtlcm5lbClcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF92ZXJpZnlfcGtjczdfc2lnLmMtODMtXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF92ZXJpZnlfcGtjczdfc2lnLmM6ODQ6XHRyZXQgPSBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShcdTAwMjZkYXRhX3B0ciwgXHUwMDI2c2lnX3B0ciwgdHJ1c3RlZF9rZXlyaW5nKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3ZlcmlmeV9wa2NzN19zaWcuYy04NS1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNiAyMDoyNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0Njk4MQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDExMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbnZlc3RpZ2F0aW5nIHRoZSBCUEYgU2lnbmF0dXJlIFZlcmlmaWNhdGlvbiBGdW5jdGlvbnMqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGhvdyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGlzIGhhbmRsZWQgd2l0aGluIHRoZSBCUEYgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgdGhlIFBLQ1MjNyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLiBJIHNlZSB0aGF0IHRoZSBmdW5jdGlvbiBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGlzIGRlZmluZWQgaW4gYGtlcm5lbC9icGYvaGVscGVycy5jYC4gQW5kIGl0IHNlZW1zIGxpa2UgaXQmIzM5O3MgbGlua2VkIHRvIHRoZSBgQ09ORklHX1NZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAgY29uZmlnIG9wdGlvbi4gQnV0IHRoZW4sIEkgYWxzbyBzZWUgdGhhdCBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAsIGxvY2F0ZWQgaW4gYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AsICpjYWxscyogYGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlYC4KCk5vdyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGJldHRlci4gSXMgYGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlYCBhbHdheXMgYXZhaWxhYmxlLCBvciBpcyBpdHMgaW5jbHVzaW9uIGNvbmRpdGlvbmFsIG9uIGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYD8gVGhpcyBjb3VsZCBpbXBhY3QgdGhlIG92ZXJhbGwgYXZhaWxhYmlsaXR5IGFuZCBiZWhhdmlvciBvZiBCUEYgcHJvZ3JhbSBzaWduYXR1cmUgdmFsaWRhdGlvbi4gSSYjMzk7bGwgbmVlZCB0byBkaWcgZGVlcGVyIGludG8gdGhlIGNvZGUgYW5kIHBvdGVudGlhbCBidWlsZCBjb25maWd1cmF0aW9ucyB0byBjbGFyaWZ5IHRoaXMgZGVwZW5kZW5jeS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNiAyMDoyNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDticGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvaGVscGVycy5jPTQyOTc9X19icGZfa2Z1bmMgdm9pZCBicGZfa2V5X3B1dChzdHJ1Y3QgYnBmX2tleSAqYmtleSlcbi0tXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00MzA1LS8qKlxua2VybmVsL2JwZi9oZWxwZXJzLmM6NDMwNjogKiBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSAtIHZlcmlmeSBhIFBLQ1MjNyBzaWduYXR1cmVcbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMDctICogQGRhdGFfcDogZGF0YSB0byB2ZXJpZnlcbi0tXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00MzE1LSAqL1xua2VybmVsL2JwZi9oZWxwZXJzLmM6NDMxNjpfX2JwZl9rZnVuYyBpbnQgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKmRhdGFfcCxcbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMTctXHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpzaWdfcCxcbi0tXG5rZXJuZWwvYnBmL2hlbHBlcnMuYz00ODU2PUJURl9JRF9GTEFHUyhmdW5jLCBicGZfa2V5X3B1dCwgS0ZfUkVMRUFTRSlcbmtlcm5lbC9icGYvaGVscGVycy5jLTQ4NTctI2lmZGVmIENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05cbmtlcm5lbC9icGYvaGVscGVycy5jOjQ4NTg6QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlLCBLRl9TTEVFUEFCTEUpXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00ODU5LSNlbmRpZlxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0xOTkyMz1zdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjAwMTUtXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjAwMTY6XHRlcnIgPSBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgoc3RydWN0IGJwZl9keW5wdHIgKilcdTAwMjZkYXRhX3B0cixcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMDAxNy1cdFx0XHRcdFx0IChzdHJ1Y3QgYnBmX2R5bnB0ciAqKVx1MDAyNnNpZ19wdHIsIGtleSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMjA6MjU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDc4MDYKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiA0OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbnZlc3RpZ2F0aW5nIHRoZSBCUEYgU2lnbmF0dXJlIFZlcmlmaWNhdGlvbiBGdW5jdGlvbioqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlYCBhbmQgbmVlZCB0byBxdWlja2x5IGZpZ3VyZSBvdXQgaXRzIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uLiBJIHJlbWVtYmVyIHNlZWluZyBpdHMgZGVmaW5pdGlvbiBpbiBga2VybmVsL2JwZi9oZWxwZXJzLmNgLiBNeSBuZXh0IHRob3VnaHQgaXMgdG8ganVtcCBkaXJlY3RseSB0byB0aGF0IGZpbGUgdG8gY2hlY2sgZm9yIGFueSBgI2lmZGVmYCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcy4gSSYjMzk7bSBzcGVjaWZpY2FsbHkgaW50ZXJlc3RlZCBpbiB3aGV0aGVyIGl0JiMzOTtzIGd1YXJkZWQgYnkgdGhlIGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBmbGFnLiBUaGF0IGNvbmZpZ3VyYXRpb24gb3B0aW9uIG9mdGVuIHJlbGF0ZXMgdG8gZW5hYmxpbmcgc2VjdXJpdHkgZmVhdHVyZXMsIHNvIEkgc3VzcGVjdCB0aGlzIGZ1bmN0aW9uIG1pZ2h0IGJlIHRpZWQgdG8gYSBicm9hZGVyIHN5c3RlbSBkYXRhIHZlcmlmaWNhdGlvbiBzeXN0ZW0uIFVuZGVyc3RhbmRpbmcgaXRzIGNvbmRpdGlvbmFsIG5hdHVyZSBpcyBjcnVjaWFsIGZvciBmaWd1cmluZyBvdXQgd2hlbiBhbmQgaG93IHRoaXMgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBpcyBhY3RpdmUgaW4gdGhlIGtlcm5lbC4gVGhpcyB3aWxsIGxpa2VseSBpbmZvcm0gbWUgYWJvdXQgdGhlIHNjZW5hcmlvcyBpbiB3aGljaCBzaWduYXR1cmUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgb24gQlBGIHByb2dyYW1zIG9yIHJlbGF0ZWQgZGF0YS4gSSYjMzk7bSBnb2luZyB0byBsb29rIGZvciB0aGF0IGAjaWZkZWZgIHN0YXRlbWVudCByaWdodCBub3cuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMjA6MjU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2hlbHBlcnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQzMDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NDMwMDpcdFx0XHRrZXlfcHV0KGJrZXktXHUwMDNla2V5KTtcbjQzMDE6XHRcbjQzMDI6XHRcdGtmcmVlKGJrZXkpO1xuNDMwMzpcdH1cbjQzMDQ6XHRcbjQzMDU6XHQvKipcbjQzMDY6XHQgKiBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSAtIHZlcmlmeSBhIFBLQ1MjNyBzaWduYXR1cmVcbjQzMDc6XHQgKiBAZGF0YV9wOiBkYXRhIHRvIHZlcmlmeVxuNDMwODpcdCAqIEBzaWdfcDogc2lnbmF0dXJlIG9mIHRoZSBkYXRhXG40MzA5Olx0ICogQHRydXN0ZWRfa2V5cmluZzoga2V5cmluZyB3aXRoIGtleXMgdHJ1c3RlZCBmb3Igc2lnbmF0dXJlIHZlcmlmaWNhdGlvblxuNDMxMDpcdCAqXG40MzExOlx0ICogVmVyaWZ5IHRoZSBQS0NTIzcgc2lnbmF0dXJlICpzaWdfcHRyKiBhZ2FpbnN0IHRoZSBzdXBwbGllZCAqZGF0YV9wdHIqXG40MzEyOlx0ICogd2l0aCBrZXlzIGluIGEga2V5cmluZyByZWZlcmVuY2VkIGJ5ICp0cnVzdGVkX2tleXJpbmcqLlxuNDMxMzpcdCAqXG40MzE0Olx0ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuXG40MzE1Olx0ICovXG40MzE2Olx0X19icGZfa2Z1bmMgaW50IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpkYXRhX3AsXG40MzE3Olx0XHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpzaWdfcCxcbjQzMTg6XHRcdFx0XHQgICAgICAgc3RydWN0IGJwZl9rZXkgKnRydXN0ZWRfa2V5cmluZylcbjQzMTk6XHR7XG40MzIwOlx0I2lmZGVmIENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05cbjQzMjE6XHRcdGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKmRhdGFfcHRyID0gKHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKilkYXRhX3A7XG40MzIyOlx0XHRjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICpzaWdfcHRyID0gKHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKilzaWdfcDtcbjQzMjM6XHRcdGNvbnN0IHZvaWQgKmRhdGEsICpzaWc7XG40MzI0Olx0XHR1MzIgZGF0YV9sZW4sIHNpZ19sZW47XG40MzI1Olx0XHRpbnQgcmV0O1xuNDMyNjpcdFxuNDMyNzpcdFx0aWYgKHRydXN0ZWRfa2V5cmluZy1cdTAwM2VoYXNfcmVmKSB7XG40MzI4Olx0XHRcdC8qXG40MzI5Olx0XHRcdCAqIERvIHRoZSBwZXJtaXNzaW9uIGNoZWNrIGRlZmVycmVkIGluIGJwZl9sb29rdXBfdXNlcl9rZXkoKS5cbjQzMzA6XHRcdFx0ICogU2VlIGJwZl9sb29rdXBfdXNlcl9rZXkoKSBmb3IgbW9yZSBkZXRhaWxzLlxuNDMzMTpcdFx0XHQgKlxuNDMzMjpcdFx0XHQgKiBBIGNhbGwgdG8ga2V5X3Rhc2tfcGVybWlzc2lvbigpIGhlcmUgd291bGQgYmUgcmVkdW5kYW50LCBhc1xuNDMzMzpcdFx0XHQgKiBpdCBpcyBhbHJlYWR5IGRvbmUgYnkga2V5cmluZ19zZWFyY2goKSBjYWxsZWQgYnlcbjQzMzQ6XHRcdFx0ICogZmluZF9hc3ltbWV0cmljX2tleSgpLlxuNDMzNTpcdFx0XHQgKi9cbjQzMzY6XHRcdFx0cmV0ID0ga2V5X3ZhbGlkYXRlKHRydXN0ZWRfa2V5cmluZy1cdTAwM2VrZXkpO1xuNDMzNzpcdFx0XHRpZiAocmV0IFx1MDAzYyAwKVxuNDMzODpcdFx0XHRcdHJldHVybiByZXQ7XG40MzM5Olx0XHR9XG40MzQwOlx0XG40MzQxOlx0XHRkYXRhX2xlbiA9IF9fYnBmX2R5bnB0cl9zaXplKGRhdGFfcHRyKTtcbjQzNDI6XHRcdGRhdGEgPSBfX2JwZl9keW5wdHJfZGF0YShkYXRhX3B0ciwgZGF0YV9sZW4pO1xuNDM0MzpcdFx0aWYgKCFkYXRhKVxuNDM0NDpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjQzNDU6XHRcbjQzNDY6XHRcdHNpZ19sZW4gPSBfX2JwZl9keW5wdHJfc2l6ZShzaWdfcHRyKTtcbjQzNDc6XHRcdHNpZyA9IF9fYnBmX2R5bnB0cl9kYXRhKHNpZ19wdHIsIHNpZ19sZW4pO1xuNDM0ODpcdFx0aWYgKCFzaWcpXG40MzQ5Olx0XHRcdHJldHVybiAtRUlOVkFMO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjI1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ4OTAzCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogNTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIHRoZXNlIHRob3VnaHRzOgoKKipBbmFseXppbmcgdGhlIEJQRiBQS0NTNyBWZXJpZmljYXRpb24gRnVuY3Rpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAgaGVyZS4gSW50ZXJlc3RpbmcuLi4gaXQmIzM5O3MgZGVmaW5lZCByZWdhcmRsZXNzLCB3aGljaCBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIEJ1dCwgYXMgSSBzdXNwZWN0ZWQsIHRoZSBhY3R1YWwgKmltcGxlbWVudGF0aW9uKiBpcyBjb25kaXRpb25hbCwgYmFzZWQgb24gYCNpZmRlZiBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYC4gTXkgZ3V0IGZlZWxpbmcgaXMgdGhhdCBpZiB0aGF0IGNvbmZpZyBvcHRpb24gaXNuJiMzOTt0IHNldCwgdGhlIGZ1bmN0aW9uIHByb2JhYmx5IHJldHVybnMgYC1FT1BOT1RTVVBQYC4gVGhhdCB3b3VsZCBiZSBhIHN0YW5kYXJkIHdheSB0byBzaWduYWwgJiMzNDtvcGVyYXRpb24gbm90IHN1cHBvcnRlZCYjMzQ7IGluIHRoaXMgY29udGV4dC4gSSBzaG91bGQgZG91YmxlLWNoZWNrIHRoYXQgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCB0aG91Z2gg4oCTIG5vIGFzc3VtcHRpb25zIHdpdGhvdXQgY29uZmlybWF0aW9uISBJJiMzOTtsbCBxdWlja2x5IHZlcmlmeSB0aGF0IHJldHVybiBwYXRoIHdpdGhpbiB0aGUgY29kZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMjA6MjU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2hlbHBlcnMuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDQzNTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NDM1MDpcdFxuNDM1MTpcdFx0cmV0dXJuIHZlcmlmeV9wa2NzN19zaWduYXR1cmUoZGF0YSwgZGF0YV9sZW4sIHNpZywgc2lnX2xlbixcbjQzNTI6XHRcdFx0XHRcdCAgICAgIHRydXN0ZWRfa2V5cmluZy1cdTAwM2VrZXksXG40MzUzOlx0XHRcdFx0XHQgICAgICBWRVJJRllJTkdfQlBGX1NJR05BVFVSRSwgTlVMTCxcbjQzNTQ6XHRcdFx0XHRcdCAgICAgIE5VTEwpO1xuNDM1NTpcdCNlbHNlXG40MzU2Olx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG40MzU3Olx0I2VuZGlmIC8qIENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT04gKi9cbjQzNTg6XHR9XG40MzU5Olx0I2VuZGlmIC8qIENPTkZJR19LRVlTICovXG40MzYwOlx0XG40MzYxOlx0dHlwZWRlZiBpbnQgKCpicGZfdGFza193b3JrX2NhbGxiYWNrX3QpKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUpO1xuNDM2MjpcdFxuNDM2MzpcdGVudW0gYnBmX3Rhc2tfd29ya19zdGF0ZSB7XG40MzY0Olx0XHQvKiBicGZfdGFza193b3JrIGlzIHJlYWR5IHRvIGJlIHVzZWQgKi9cbjQzNjU6XHRcdEJQRl9UV19TVEFOREJZID0gMCxcbjQzNjY6XHRcdC8qIGlycSB3b3JrIHNjaGVkdWxpbmcgaW4gcHJvZ3Jlc3MgKi9cbjQzNjc6XHRcdEJQRl9UV19QRU5ESU5HLFxuNDM2ODpcdFx0LyogdGFzayB3b3JrIHNjaGVkdWxpbmcgaW4gcHJvZ3Jlc3MgKi9cbjQzNjk6XHRcdEJQRl9UV19TQ0hFRFVMSU5HLFxuNDM3MDpcdFx0LyogdGFzayB3b3JrIGlzIHNjaGVkdWxlZCBzdWNjZXNzZnVsbHkgKi9cbjQzNzE6XHRcdEJQRl9UV19TQ0hFRFVMRUQsXG40MzcyOlx0XHQvKiBjYWxsYmFjayBpcyBydW5uaW5nICovXG40MzczOlx0XHRCUEZfVFdfUlVOTklORyxcbjQzNzQ6XHRcdC8qIGFzc29jaWF0ZWQgQlBGIG1hcCB2YWx1ZSBpcyBkZWxldGVkICovXG40Mzc1Olx0XHRCUEZfVFdfRlJFRUQsXG40Mzc2Olx0fTtcbjQzNzc6XHRcbjQzNzg6XHRzdHJ1Y3QgYnBmX3Rhc2tfd29ya19jdHgge1xuNDM3OTpcdFx0ZW51bSBicGZfdGFza193b3JrX3N0YXRlIHN0YXRlO1xuNDM4MDpcdFx0cmVmY291bnRfdCByZWZjbnQ7XG40MzgxOlx0XHRzdHJ1Y3QgY2FsbGJhY2tfaGVhZCB3b3JrO1xuNDM4MjpcdFx0c3RydWN0IGlycV93b3JrIGlycV93b3JrO1xuNDM4MzpcdFx0LyogYnBmX3Byb2cgdGhhdCBzY2hlZHVsZXMgdGFzayB3b3JrICovXG40Mzg0Olx0XHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7XG40Mzg1Olx0XHQvKiB0YXNrIGZvciB3aGljaCBjYWxsYmFjayBpcyBzY2hlZHVsZWQgKi9cbjQzODY6XHRcdHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaztcbjQzODc6XHRcdC8qIHRoZSBtYXAgYW5kIG1hcCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250ZXh0ICovXG40Mzg4Olx0XHRzdHJ1Y3QgYnBmX21hcCAqbWFwO1xuNDM4OTpcdFx0dm9pZCAqbWFwX3ZhbDtcbjQzOTA6XHRcdGVudW0gdGFza193b3JrX25vdGlmeV9tb2RlIG1vZGU7XG40MzkxOlx0XHRicGZfdGFza193b3JrX2NhbGxiYWNrX3QgY2FsbGJhY2tfZm47XG40MzkyOlx0XHRzdHJ1Y3QgcmN1X2hlYWQgcmN1O1xuNDM5MzpcdH0gX19hbGlnbmVkKDgpO1xuNDM5NDpcdFxuNDM5NTpcdC8qIEFjdHVhbCB0eXBlIGZvciBzdHJ1Y3QgYnBmX3Rhc2tfd29yayAqL1xuNDM5NjpcdHN0cnVjdCBicGZfdGFza193b3JrX2tlcm4ge1xuNDM5NzpcdFx0c3RydWN0IGJwZl90YXNrX3dvcmtfY3R4ICpjdHg7XG40Mzk4Olx0fTtcbjQzOTk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMjA6MjU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDk5MTcKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiA2MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFeGFtaW5pbmcgdGhlIEJQRiBWZXJpZmljYXRpb24gQ29kZSoqCgpPa2F5LCBob2xkIG9uIGEgc2Vjb25kLiBJIGp1c3QgcmVhbGl6ZWQgdGhhdCBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGlzIGFsc28gY29uZGl0aW9uYWwsIHByb3RlY3RlZCBieSB0aGUgYCNpZmRlZiBDT05GSUdfS0VZU2AgZGlyZWN0aXZlLiBUaGF0JiMzOTtzIGdvb2QgdG8ga25vdywgbWFrZXMgc2Vuc2Ugd2l0aCB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zLiBOb3csIEkgc2hvdWxkIGRvdWJsZSBjaGVjayB0byBlbnN1cmUgdGhlIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBpcyBlaXRoZXIgYWx3YXlzIGNvbXBpbGVkIG9yIGFsc28gY29uZGl0aW9uYWxseSBidWlsdC4gU28sIEkmIzM5O20gZ29pbmcgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGNvZGUgaW4gYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AgdG8gY2xhcmlmeSB0aGF0IHNwZWNpZmljIGRldGFpbC4gR290dGEgbWFrZSBzdXJlIEkgaGF2ZSBhIGNvbXBsZXRlIHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjI2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi92ZXJpZmllci5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTk4OTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE5ODkwOlx0XHRcdGludCBpZHggPSAqY250O1xuMTk4OTE6XHRcbjE5ODkyOlx0XHRcdGluc25fYnVmW2lkeCYjNDM7JiM0MztdID0gbGRfYWRkcnNbMF07XG4xOTg5MzpcdFx0XHRpbnNuX2J1ZltpZHgmIzQzOyYjNDM7XSA9IGxkX2FkZHJzWzFdO1xuMTk4OTQ6XHRcdFx0aW5zbl9idWZbaWR4JiM0MzsmIzQzO10gPSAqaW5zbjtcbjE5ODk1Olx0XHRcdCpjbnQgPSBpZHg7XG4xOTg5NjpcdFx0fVxuMTk4OTc6XHRcdHJldHVybiAwO1xuMTk4OTg6XHR9XG4xOTg5OTpcdFxuMTk5MDA6XHRzdGF0aWMgZW51bSBicGZfc2lnX2tleXJpbmcgYnBmX2NsYXNzaWZ5X2tleXJpbmcoczMyIGtleXJpbmdfaWQpXG4xOTkwMTpcdHtcbjE5OTAyOlx0XHRzd2l0Y2ggKGtleXJpbmdfaWQpIHtcbjE5OTAzOlx0XHRjYXNlIDA6XG4xOTkwNDpcdFx0XHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX0JVSUxUSU47XG4xOTkwNTpcdFx0Y2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkc6XG4xOTkwNjpcdFx0XHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1NFQ09OREFSWTtcbjE5OTA3Olx0XHRjYXNlIChzMzIpKHVuc2lnbmVkIGxvbmcpVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HOlxuMTk5MDg6XHRcdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19QTEFURk9STTtcbjE5OTA5Olx0XHRkZWZhdWx0OlxuMTk5MTA6XHRcdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19VU0VSO1xuMTk5MTE6XHRcdH1cbjE5OTEyOlx0fVxuMTk5MTM6XHRcbjE5OTE0Olx0LypcbjE5OTE1Olx0ICogVmVyaWZ5IHRoZSBQS0NTIzcgc2lnbmF0dXJlIG9mIGEgbG9hZGVkIHByb2dyYW0uIENhbGxlZCBmcm9tIGJwZl9jaGVjaygpXG4xOTkxNjpcdCAqIG9uY2UgdGhlIHByb2dyYW0mIzM5O3MgbWV0YWRhdGEgbWFwcyBoYXZlIGJlZW4gcmVzb2x2ZWQgaW50byB1c2VkX21hcHMsIHNvXG4xOTkxNzpcdCAqIHRoZSBleGFjdCBtYXBzIGZvbGRlZCBpbnRvIHRoZSBzaWduYXR1cmUgYXJlIHRoZSBvbmVzIHRoZSBwcm9ncmFtIGJpbmRzLlxuMTk5MTg6XHQgKlxuMTk5MTk6XHQgKiBUaGUgc2lnbmF0dXJlIGNvdmVycyB0aGUgaW5zdHJ1Y3Rpb25zIGZvbGxvd2VkIGJ5IHRoZSBmcm96ZW4gY29udGVudHMgb2ZcbjE5OTIwOlx0ICogZWFjaCBtYXAsIGluIEBtYXBzIG9yZGVyOiBpbnNucyB8fCBtYXBfMCB8fCBtYXBfMSB8fCBbLi4uXS4gT24gc3VjY2VzcyB0aGVcbjE5OTIxOlx0ICogdmVyZGljdCBhbmQga2V5cmluZyBpbmZvIGFyZSByZWNvcmRlZCBvbiBwcm9nLVx1MDAzZWF1eC5cbjE5OTIyOlx0ICovXG4xOTkyMzpcdHN0YXRpYyBpbnQgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuMTk5MjQ6XHRcdFx0XHRcdCAgICAgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJvb2wgaXNfa2VybmVsKVxuMTk5MjU6XHR7XG4xOTkyNjpcdFx0YnBmcHRyX3QgdXNpZyA9IG1ha2VfYnBmcHRyKGF0dHItXHUwMDNlc2lnbmF0dXJlLCBpc19rZXJuZWwpO1xuMTk5Mjc6XHRcdHN0cnVjdCBicGZfZHlucHRyX2tlcm4gc2lnX3B0ciwgZGF0YV9wdHI7XG4xOTkyODpcdFx0c3RydWN0IGJwZl9wcm9nICpwcm9nID0gZW52LVx1MDAzZXByb2c7XG4xOTkyOTpcdFx0c3RydWN0IGJwZl9tYXAgKiptYXBzID0gZW52LVx1MDAzZXVzZWRfbWFwcztcbjE5OTMwOlx0XHRzdHJ1Y3QgYnBmX2tleSAqa2V5ID0gTlVMTDtcbjE5OTMxOlx0XHR2b2lkICpzaWcsICpkYXRhID0gTlVMTDtcbjE5OTMyOlx0XHR1MzIgbWFwX2NudCA9IGVudi1cdTAwM2V1c2VkX21hcF9jbnQ7XG4xOTkzMzpcdFx0dTMyIGksIG9mZiwgaW5zbnNfc3o7XG4xOTkzNDpcdFx0dTY0IGRhdGFfc3o7XG4xOTkzNTpcdFx0aW50IGVyciA9IDA7XG4xOTkzNjpcdFxuMTk5Mzc6XHRcdC8qXG4xOTkzODpcdFx0ICogRG9uJiMzOTt0IGF0dGVtcHQgdG8gdXNlIGttYWxsb2NfbGFyZ2Ugb3Igdm1hbGxvYyBmb3Igc2lnbmF0dXJlcy5cbjE5OTM5Olx0XHQgKiBQcmFjdGljYWwgc2lnbmF0dXJlIGZvciBCUEYgcHJvZ3JhbSBzaG91bGQgYmUgYmVsb3cgdGhpcyBsaW1pdC5cbjE5OTQwOlx0XHQgKi9cbjE5OTQxOlx0XHRpZiAoYXR0ci1cdTAwM2VzaWduYXR1cmVfc2l6ZSBcdTAwM2UgS01BTExPQ19NQVhfQ0FDSEVfU0laRSlcbjE5OTQyOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuMTk5NDM6XHRcdGlmIChzeXN0ZW1fa2V5cmluZ19pZF9jaGVjayhhdHRyLVx1MDAzZWtleXJpbmdfaWQpID09IDApXG4xOTk0NDpcdFx0XHRrZXkgPSBicGZfbG9va3VwX3N5c3RlbV9rZXkoYXR0ci1cdTAwM2VrZXlyaW5nX2lkKTtcbjE5OTQ1Olx0XHRlbHNlXG4xOTk0NjpcdFx0XHRrZXkgPSBicGZfbG9va3VwX3VzZXJfa2V5KGF0dHItXHUwMDNla2V5cmluZ19pZCwgMCk7XG4xOTk0NzpcdFx0aWYgKCFrZXkpIHtcbjE5OTQ4Olx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtjYW5ub3QgcmVzb2x2ZSBzaWduaW5nIGtleXJpbmcgd2l0aCBrZXlyaW5nX2lkICVkXFxuXCYjMzQ7LFxuMTk5NDk6XHRcdFx0XHRhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuMTk5NTA6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4xOTk1MTpcdFx0fVxuMTk5NTI6XHRcbjE5OTUzOlx0XHRzaWcgPSBrdm1lbWR1cF9icGZwdHIodXNpZywgYXR0ci1cdTAwM2VzaWduYXR1cmVfc2l6ZSk7XG4xOTk1NDpcdFx0aWYgKElTX0VSUihzaWcpKSB7XG4xOTk1NTpcdFx0XHRicGZfa2V5X3B1dChrZXkpO1xuMTk5NTY6XHRcdFx0cmV0dXJuIFBUUl9FUlIoc2lnKTtcbjE5OTU3Olx0XHR9XG4xOTk1ODpcdFxuMTk5NTk6XHRcdGluc25zX3N6ID0gcHJvZy1cdTAwM2VsZW4gKiBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKTtcbjE5OTYwOlx0XHRkYXRhX3N6ID0gaW5zbnNfc3o7XG4xOTk2MTpcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbWFwX2NudDsgaSYjNDM7JiM0MzspIHtcbjE5OTYyOlx0XHRcdHN0cnVjdCBicGZfbWFwICptYXAgPSBtYXBzW2ldO1xuMTk5NjM6XHRcbjE5OTY0Olx0XHRcdGlmIChtYXAtXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX0FSUkFZIHx8XG4xOTk2NTpcdFx0XHQgICAgIW1hcC1cdTAwM2VvcHMtXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyKSB7XG4xOTk2NjpcdFx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtzaWduZWQgcHJvZ3JhbSBtZXRhZGF0YSBtYXAgJiMzOTslcyYjMzk7IG11c3QgYmUgYW4gYXJyYXlcXG5cJiMzNDssXG4xOTk2NzpcdFx0XHRcdFx0bWFwLVx1MDAzZW5hbWUpO1xuMTk5Njg6XHRcdFx0XHRlcnIgPSAtRUlOVkFMO1xuMTk5Njk6XHRcdFx0XHRnb3RvIG91dDtcbjE5OTcwOlx0XHRcdH1cbjE5OTcxOlx0XHRcdGlmICghUkVBRF9PTkNFKG1hcC1cdTAwM2Vmcm96ZW4pKSB7XG4xOTk3MjpcdFx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtzaWduZWQgcHJvZ3JhbSBtZXRhZGF0YSBtYXAgJiMzOTslcyYjMzk7IG11c3QgYmUgZnJvemVuXFxuXCYjMzQ7LFxuMTk5NzM6XHRcdFx0XHRcdG1hcC1cdTAwM2VuYW1lKTtcbjE5OTc0Olx0XHRcdFx0ZXJyID0gLUVQRVJNO1xuMTk5NzU6XHRcdFx0XHRnb3RvIG91dDtcbjE5OTc2Olx0XHRcdH1cbjE5OTc3Olx0XHRcdGlmICghbWFwLVx1MDAzZWV4Y2xfcHJvZ19zaGEpIHtcbjE5OTc4Olx0XHRcdFx0dmVyYm9zZShlbnYsIFwmIzM0O3NpZ25lZCBwcm9ncmFtIG1ldGFkYXRhIG1hcCAmIzM5OyVzJiMzOTsgbXVzdCBiZSBleGNsdXNpdmVcXG5cJiMzNDssXG4xOTk3OTpcdFx0XHRcdFx0bWFwLVx1MDAzZW5hbWUpO1xuMTk5ODA6XHRcdFx0XHRlcnIgPSAtRVBFUk07XG4xOTk4MTpcdFx0XHRcdGdvdG8gb3V0O1xuMTk5ODI6XHRcdFx0fVxuMTk5ODM6XHRcdFx0ZGF0YV9zeiAmIzQzOz0gbWFwLVx1MDAzZXZhbHVlX3NpemU7XG4xOTk4NDpcdFx0fVxuMTk5ODU6XHRcdGlmIChicGZfZHlucHRyX2NoZWNrX3NpemUoZGF0YV9zeikpIHtcbjE5OTg2Olx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtzaWduZWQgcGF5bG9hZCB0b28gbGFyZ2U6ICVsbHUgYnl0ZXNcXG5cJiMzNDssIGRhdGFfc3opO1xuMTk5ODc6XHRcdFx0ZXJyID0gLUUyQklHO1xuMTk5ODg6XHRcdFx0Z290byBvdXQ7XG4xOTk4OTpcdFx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNiAyMDoyNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MTg3NQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDEwNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipVbnJhdmVsaW5nIHRoZSBDb25kaXRpb25hbCBDb21waWxhdGlvbiBvZiBCUEYgU2lnbmF0dXJlIFZlcmlmaWNhdGlvbioqCgpPa2F5LCBzbyBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgaXMgYWx3YXlzIGNvbXBpbGVkLCB3aGljaCBzZWVtcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoLiBCdXQgaGVyZSYjMzk7cyB0aGUga2lja2VyOiBpdCAqY2FsbHMqIGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAuIEFuZCAqdGhhdCogZnVuY3Rpb24sIGFzIEkgcmVjYWxsLCBpcyB0dWNrZWQgYXdheSBpbiBga2VybmVsL2JwZi9oZWxwZXJzLmNgIGFuZCBpcyBjb25kaXRpb25hbCBvbiBgI2lmZGVmIENPTkZJR19LRVlTYC4gVGhpcyBpbW1lZGlhdGVseSByYWlzZXMgYSBmbGFnLiBJZiBgQ09ORklHX0tFWVNgIGlzbiYjMzk7dCBlbmFibGVkLCBzaG91bGRuJiMzOTt0IHRoZSBjb21waWxlciBiZSB0aHJvd2luZyBhIGZpdD8gSXMgYGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlYCBldmVuICpkZWZpbmVkKiBpbiB0aGUgYWJzZW5jZSBvZiBgQ09ORklHX0tFWVNgPyBJdCBmZWVscyBsaWtlIGEgcG90ZW50aWFsIGJ1aWxkLXRpbWUgaXNzdWUganVzdCB3YWl0aW5nIHRvIHN1cmZhY2UuCgpJJiMzOTtkIGJldHRlciBkb3VibGUtY2hlY2sgdGhlIGluY2x1ZGVzLCBzcGVjaWZpY2FsbHkgYGluY2x1ZGUvbGludXgvYnBmLmhgLCB0byBzZWUgaWYgbXkgbWVtb3J5IGlzIGZhaWxpbmcgbWUgb3IgaWYgdGhlcmUmIzM5O3MgYSBkaXNjb25uZWN0IHNvbWV3aGVyZS4gTGV0IG1lIHNlZS4uLiBJIG5lZWQgdG8gdmVyaWZ5IGhvdyBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGlzIGFjdHVhbGx5IGRlY2xhcmVkIGluIHRoYXQgaGVhZGVyIGZpbGUuIFRpbWUgdG8gbWFrZSBzdXJlIHRoaXMgY29kZSB3aWxsIGFjdHVhbGx5IGJ1aWxkIGNvcnJlY3RseSEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMjA6Mjc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2JwZi5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzgyMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA1MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDszODIwOlx0c3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfdXNlcl9rZXkoczMyIHNlcmlhbCwgdTY0IGZsYWdzKTtcbjM4MjE6XHRzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KHU2NCBpZCk7XG4zODIyOlx0dm9pZCBicGZfa2V5X3B1dChzdHJ1Y3QgYnBmX2tleSAqYmtleSk7XG4zODIzOlx0aW50IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpkYXRhX3AsXG4zODI0Olx0XHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpzaWdfcCxcbjM4MjU6XHRcdFx0XHQgICAgICAgc3RydWN0IGJwZl9rZXkgKnRydXN0ZWRfa2V5cmluZyk7XG4zODI2Olx0XG4zODI3Olx0c3RhdGljIGlubGluZSBzMzIgYnBmX2tleV9zZXJpYWwoY29uc3Qgc3RydWN0IGJwZl9rZXkgKmtleSlcbjM4Mjg6XHR7XG4zODI5Olx0XHRyZXR1cm4ga2V5LVx1MDAzZWhhc19yZWYgPyBrZXktXHUwMDNla2V5LVx1MDAzZXNlcmlhbCA6IDA7XG4zODMwOlx0fVxuMzgzMTpcdCNlbHNlXG4zODMyOlx0c3RhdGljIGlubGluZSBzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF91c2VyX2tleSh1MzIgc2VyaWFsLCB1NjQgZmxhZ3MpXG4zODMzOlx0e1xuMzgzNDpcdFx0cmV0dXJuIE5VTEw7XG4zODM1Olx0fVxuMzgzNjpcdFxuMzgzNzpcdHN0YXRpYyBpbmxpbmUgc3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfc3lzdGVtX2tleSh1NjQgaWQpXG4zODM4Olx0e1xuMzgzOTpcdFx0cmV0dXJuIE5VTEw7XG4zODQwOlx0fVxuMzg0MTpcdFxuMzg0MjpcdHN0YXRpYyBpbmxpbmUgdm9pZCBicGZfa2V5X3B1dChzdHJ1Y3QgYnBmX2tleSAqYmtleSlcbjM4NDM6XHR7XG4zODQ0Olx0fVxuMzg0NTpcdFxuMzg0NjpcdHN0YXRpYyBpbmxpbmUgaW50IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpkYXRhX3AsXG4zODQ3Olx0XHRcdFx0XHRcdCAgICAgY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnNpZ19wLFxuMzg0ODpcdFx0XHRcdFx0XHQgICAgIHN0cnVjdCBicGZfa2V5ICp0cnVzdGVkX2tleXJpbmcpXG4zODQ5Olx0e1xuMzg1MDpcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuMzg1MTpcdH1cbjM4NTI6XHRcbjM4NTM6XHRzdGF0aWMgaW5saW5lIHMzMiBicGZfa2V5X3NlcmlhbChjb25zdCBzdHJ1Y3QgYnBmX2tleSAqa2V5KVxuMzg1NDpcdHtcbjM4NTU6XHRcdHJldHVybiAwO1xuMzg1NjpcdH1cbjM4NTc6XHQjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfS0VZUykgXHUwMDI2XHUwMDI2IGRlZmluZWQoQ09ORklHX0JQRl9TWVNDQUxMKSAqL1xuMzg1ODpcdFxuMzg1OTpcdC8qIHZlcmlmaWVyIHByb3RvdHlwZXMgZm9yIGhlbHBlciBmdW5jdGlvbnMgY2FsbGVkIGZyb20gZUJQRiBwcm9ncmFtcyAqL1xuMzg2MDpcdGV4dGVybiBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX21hcF9sb29rdXBfZWxlbV9wcm90bztcbjM4NjE6XHRleHRlcm4gY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9tYXBfdXBkYXRlX2VsZW1fcHJvdG87XG4zODYyOlx0ZXh0ZXJuIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX2RlbGV0ZV9lbGVtX3Byb3RvO1xuMzg2MzpcdGV4dGVybiBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX21hcF9wdXNoX2VsZW1fcHJvdG87XG4zODY0Olx0ZXh0ZXJuIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX3BvcF9lbGVtX3Byb3RvO1xuMzg2NTpcdGV4dGVybiBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX21hcF9wZWVrX2VsZW1fcHJvdG87XG4zODY2Olx0ZXh0ZXJuIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX2xvb2t1cF9wZXJjcHVfZWxlbV9wcm90bztcbjM4Njc6XHRcbjM4Njg6XHRleHRlcm4gY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9nZXRfcHJhbmRvbV91MzJfcHJvdG87XG4zODY5Olx0ZXh0ZXJuIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfZ2V0X3NtcF9wcm9jZXNzb3JfaWRfcHJvdG87XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjI3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDUzMTY4CgkJCQkJCQlvdXRwdXQ6IDIxCgkJCQkJCQl0aG91Z2h0czogMzIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgS2VybmVsJiMzOTtzIFNpZ25hdHVyZSBWZXJpZmljYXRpb24gTG9naWMqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gaG93IHRoZSBCUEYgdmVyaWZpZXIgaGFuZGxlcyBzaWduYXR1cmVzLCBzcGVjaWZpY2FsbHkgaW4gdGhlIGFic2VuY2Ugb2YgY2VydGFpbiBrZXJuZWwgY29uZmlndXJhdGlvbnMuIE15IGluaXRpYWwgdGhvdWdodCB3YXMgdGhhdCBpZiBgQ09ORklHX0tFWVNgIGlzbiYjMzk7dCBlbmFibGVkLCBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGp1c3QgYmFpbHMgb3V0IHdpdGggYW4gYC1FT1BOT1RTVVBQYCBlcnJvci4gQnV0IHdhaXQsIGl0JiMzOTtzIG1vcmUgbnVhbmNlZCB0aGFuIHRoYXQuIExvb2tpbmcgYXQgdGhlIGNvZGUgZm9yIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCwgaXQgY2FsbHMgZWl0aGVyIGBicGZfbG9va3VwX3N5c3RlbV9rZXlgIG9yIGBicGZfbG9va3VwX3VzZXJfa2V5YC4gSWYgYENPTkZJR19LRVlTYCBpc24mIzM5O3Qgc2V0LCAqdGhvc2UqIGZ1bmN0aW9ucyBhY3R1YWxseSByZXR1cm4gYE5VTExgLgoKTm93LCBsZXQmIzM5O3MgdHJhY2UgdGhpcyBmdXJ0aGVyLiBUaGUgY29kZSBmbG93IGluIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBkb2VzIGEgbG9va3VwIGJhc2VkIG9uIGBhdHRyLSZndDtrZXlyaW5nX2lkYDoKCmBgYGMKCWlmIChzeXN0ZW1fa2V5cmluZ19pZF9jaGVjayhhdHRyLSZndDtrZXlyaW5nX2lkKSA9PSAwKQoJCWtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLSZndDtrZXlyaW5nX2lkKTsKCWVsc2UKCQlrZXkgPSBicGZfbG9va3VwX3VzZXJfa2V5KGF0dHItJmd0O2tleXJpbmdfaWQsIDApOwoJaWYgKCFrZXkpIHsKCQl2ZXJib3NlKGVudiwgJiMzNDtjYW5ub3QgcmVzb2x2ZSBzaWduaW5nIGtleXJpbmcgd2l0aCBrZXlyaW5nX2lkICVkXG4mIzM0OywKCQkJYXR0ci0mZ3Q7a2V5cmluZ19pZCk7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CmBgYAoKU28sIGlmIGBDT05GSUdfS0VZU2AgaXMgb2ZmLCBga2V5YCBlbmRzIHVwIGJlaW5nIGBOVUxMYCBiZWNhdXNlIHRob3NlIGxvb2t1cCBmdW5jdGlvbnMgcmV0dXJuIGBOVUxMYCwgYW5kIHRoZSBjb2RlICpzaG91bGQqIHJldHVybiBgLUVJTlZBTGAuIFRoaXMgaXMgYW4gaW1wb3J0YW50IGRpc3RpbmN0aW9uIGFuZCBtZWFucyB0aGUgaW5pdGlhbCBhc3N1bXB0aW9uIHdhcyBpbmNvcnJlY3QuCgpDb25zZXF1ZW50bHksIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBwYXJ0aWN1bGFyIGNvZGUgcGF0aCwgSSYjMzk7bGwgbmVlZCAqYm90aCogYENPTkZJR19LRVlTYCBhbmQgYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGVuYWJsZWQuIEhhbmcgb24uLi4gaXNuJiMzOTt0IGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCB0aGUgZmxhZyB0aGF0IGVuYWJsZXMgdGhlIFBLQ1M3IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gaW4gdGhlIGZpcnN0IHBsYWNlPyBBaGEhIE9rYXksIHNvIEkgc2hvdWxkIG5vdyBnbyBjaGVjayB0aGUgYGluaXQvS2NvbmZpZ2Agb3IgYGNlcnRzL0tjb25maWdgIGZpbGVzIHRvIHZlcmlmeSBob3cgYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzIGRlZmluZWQgYW5kIGhvdyBpdCByZWxhdGVzIHRvIHRoaXMgdmVyaWZpY2F0aW9uIGNvZGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjI3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBTWVNURU1fREFUQV9WRVJJRklDQVRJT04mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5pdC9LY29uZmlnPTIxODE9ZW5kbWVudVxuaW5pdC9LY29uZmlnLTIxODItXG5pbml0L0tjb25maWc6MjE4Mzpjb25maWcgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXG5pbml0L0tjb25maWctMjE4NC1cdGRlZl9ib29sIG5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMjA6Mjc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTQwNTcKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiA1NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0JiMzOTtzIGludGVybmFsIG1vbm9sb2d1ZToKCioqSW52ZXN0aWdhdGluZyBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OKioKCkFscmlnaHQsIHNvIGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBpcyBhIGJvb2xlYW4sIHN0cmFpZ2h0IGZvcndhcmQgZW5vdWdoLiBUaGUgcmVhbCBxdWVzdGlvbiBpcywgd2hhdCYjMzk7cyAqZHJpdmluZyogaXRzIHNlbGVjdGlvbj8gSXQmIzM5O3MgY2xlYXJseSBhIGRlcGVuZGVuY3kgZm9yIHRoaW5ncyBsaWtlIGBNT0RVTEVfU0lHYCwgYEtFWEVDX1NJR2AsIGFuZCBgQlBGX1NZU0NBTExgLCBhbmQgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGxhcmdlciBjb250ZXh0LiBJcyB0aGVyZSBhbnl0aGluZyBlbHNlIHRoYXQgZW5hYmxlcyBpdD8gTmVlZCB0byBxdWlja2x5IHRyYWNlIHRoYXQgYmFjayBhbmQgY2hlY2sgdGhlIGRlcGVuZGVuY2llcy4gTGV0JiMzOTtzIGRpZyBpbiBhbmQgc2VlIHdoYXQmIzM5O3MgZ29pbmcgb24gdXBzdHJlYW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjI3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NlbGVjdCBTWVNURU1fREFUQV9WRVJJRklDQVRJT04mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YXJjaC9zMzkwL0tjb25maWc9NzU9Y29uZmlnIFMzOTBcbi0tXG5hcmNoL3MzOTAvS2NvbmZpZy0yNzgtXHRzZWxlY3QgU1lTQ1RMX0VYQ0VQVElPTl9UUkFDRVxuYXJjaC9zMzkwL0tjb25maWc6Mjc5Olx0c2VsZWN0IFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTiBpZiBLRVhFQ19TSUdcbmFyY2gvczM5MC9LY29uZmlnLTI4MC1cdHNlbGVjdCBUSFJFQURfSU5GT19JTl9UQVNLXG4tLVxuZHJpdmVycy9tZC9LY29uZmlnPTU4MT1jb25maWcgRE1fVkVSSVRZX1ZFUklGWV9ST09USEFTSF9TSUdcbi0tXG5kcml2ZXJzL21kL0tjb25maWctNTgzLVx0ZGVwZW5kcyBvbiBETV9WRVJJVFlcbmRyaXZlcnMvbWQvS2NvbmZpZzo1ODQ6XHRzZWxlY3QgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXG5kcml2ZXJzL21kL0tjb25maWctNTg1LVx0aGVscFxuLS1cbmZzL3ViaWZzL0tjb25maWc9ODk9Y29uZmlnIFVCSUZTX0ZTX0FVVEhFTlRJQ0FUSU9OXG4tLVxuZnMvdWJpZnMvS2NvbmZpZy05Mi1cdHNlbGVjdCBDUllQVE9fSE1BQ1xuZnMvdWJpZnMvS2NvbmZpZzo5MzpcdHNlbGVjdCBTWVNURU1fREFUQV9WRVJJRklDQVRJT05cbmZzL3ViaWZzL0tjb25maWctOTQtXHRoZWxwXG4tLVxuZnMvdmVyaXR5L0tjb25maWc9MzQ9Y29uZmlnIEZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNcbi0tXG5mcy92ZXJpdHkvS2NvbmZpZy0zNi1cdGRlcGVuZHMgb24gRlNfVkVSSVRZXG5mcy92ZXJpdHkvS2NvbmZpZzozNzpcdHNlbGVjdCBTWVNURU1fREFUQV9WRVJJRklDQVRJT05cbmZzL3Zlcml0eS9LY29uZmlnLTM4LVx0aGVscFxuLS1cbmluaXQvS2NvbmZpZz0yMjY3PWNvbmZpZyBNT0RVTEVfU0lHX0ZPUk1BVFxuaW5pdC9LY29uZmlnLTIyNjgtXHRkZWZfYm9vbCBuXG5pbml0L0tjb25maWc6MjI2OTpcdHNlbGVjdCBTWVNURU1fREFUQV9WRVJJRklDQVRJT05cbmluaXQvS2NvbmZpZy0yMjcwLVxuLS1cbm5ldC93aXJlbGVzcy9LY29uZmlnPTg5PWNvbmZpZyBDRkc4MDIxMV9SRVFVSVJFX1NJR05FRF9SRUdEQlxuLS1cbm5ldC93aXJlbGVzcy9LY29uZmlnLTkxLVx0ZGVmYXVsdCB5XG5uZXQvd2lyZWxlc3MvS2NvbmZpZzo5MjpcdHNlbGVjdCBTWVNURU1fREFUQV9WRVJJRklDQVRJT05cbm5ldC93aXJlbGVzcy9LY29uZmlnLTkzLVx0aGVscFxuLS1cbnNlY3VyaXR5L2lwZS9LY29uZmlnPTY9bWVudWNvbmZpZyBTRUNVUklUWV9JUEVcbi0tXG5zZWN1cml0eS9pcGUvS2NvbmZpZy0xMC1cdHNlbGVjdCBQS0NTN19NRVNTQUdFX1BBUlNFUlxuc2VjdXJpdHkvaXBlL0tjb25maWc6MTE6XHRzZWxlY3QgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXG5zZWN1cml0eS9pcGUvS2NvbmZpZy0xMi1cdHNlbGVjdCBJUEVfUFJPUF9ETV9WRVJJVFkgaWYgRE1fVkVSSVRZXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjI3PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU0ODUzCgkJCQkJCQlvdXRwdXQ6IDE4CgkJCQkJCQl0aG91Z2h0czogMTI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk5hdmlnYXRpbmcgdGhlIEtjb25maWcgTGFieXJpbnRoKioKCk9rYXksIHNvIHRoZSBnb2FsIGlzIHRvIGVuYWJsZSBgQ09ORklHX1NZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAuIE15IGluaXRpYWwgdGhvdWdodCB3YXMgdG8ganVzdCBzZXQgaXQgZGlyZWN0bHksIGJ1dCB0aGVuIEkgcmVhbGl6ZWQgaXQmIzM5O3MgZGVmaW5lZCBhcyBhIGBkZWZfYm9vbCBuYC4gVGhhdCBtZWFucyBJIGNhbiYjMzk7dCBlbmFibGUgaXQgdW5sZXNzIHRoZXJlJiMzOTtzIGEgcHJvbXB0IGFzc29jaWF0ZWQgd2l0aCBpdC4gQnV0IGEgcXVpY2sgY2hlY2sgcmV2ZWFscyB0aGVyZSYjMzk7cyBubyB2aXNpYmxlIHByb21wdC4gU28sIEkgbmVlZCB0byBmaW5kIGEgZGlmZmVyZW50IHN0cmF0ZWd5LiBJIG5lZWQgdG8gZW5hYmxlIHNvbWV0aGluZyB0aGF0ICpzZWxlY3RzKiBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYC4gSSBoYWQgdGhlIGlkZWEgdG8gdXNlIGBDT05GSUdfTU9EVUxFX1NJR19GT1JNQVRgIG9yIGBDT05GSUdfRlNfVkVSSVRZX0JVSUxUSU5fU0lHTkFUVVJFU2AuIFVuZm9ydHVuYXRlbHksIGBDT05GSUdfTU9EVUxFX1NJR19GT1JNQVRgIGlzIGFsc28gYSBgZGVmX2Jvb2wgbmAuIExvb2tzIGxpa2UgSSBjYW4mIzM5O3QgdXNlIGl0LiBPa2F5LCB0aW1lIHRvIGRpZyBkZWVwZXIuIEkmIzM5O2xsIGZvY3VzIG15IHNlYXJjaCBvbiBgTU9EVUxFX1NJR2AgYW5kIHdpbGwgY2hlY2sgYGluaXQvS2NvbmZpZ2AgdG8gc2VlIHdoYXQgaXMgZ29pbmcgb24gdGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjI3PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBNT0RVTEVfU0lHJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2NlcnRzL0tjb25maWc9Mj1tZW51IFwmIzM0O0NlcnRpZmljYXRlcyBmb3Igc2lnbmF0dXJlIGNoZWNraW5nXCYjMzQ7XG5jZXJ0cy9LY29uZmlnLTMtXG5jZXJ0cy9LY29uZmlnOjQ6Y29uZmlnIE1PRFVMRV9TSUdfS0VZXG5jZXJ0cy9LY29uZmlnLTUtXHRzdHJpbmcgXCYjMzQ7RmlsZSBuYW1lIG9yIFBLQ1MjMTEgVVJJIG9mIG1vZHVsZSBzaWduaW5nIGtleVwmIzM0O1xuLS1cbmNlcnRzL0tjb25maWc9MTg9Y2hvaWNlXG4tLVxuY2VydHMvS2NvbmZpZy0yNC1cbmNlcnRzL0tjb25maWc6MjU6Y29uZmlnIE1PRFVMRV9TSUdfS0VZX1RZUEVfUlNBXG5jZXJ0cy9LY29uZmlnLTI2LVx0Ym9vbCBcJiMzNDtSU0FcJiMzNDtcbi0tXG5jZXJ0cy9LY29uZmlnLTI5LVxuY2VydHMvS2NvbmZpZzozMDpjb25maWcgTU9EVUxFX1NJR19LRVlfVFlQRV9FQ0RTQVxuY2VydHMvS2NvbmZpZy0zMS1cdGJvb2wgXCYjMzQ7RUNEU0FcJiMzNDtcbi0tXG5jZXJ0cy9LY29uZmlnLTQxLVxuY2VydHMvS2NvbmZpZzo0Mjpjb25maWcgTU9EVUxFX1NJR19LRVlfVFlQRV9NTERTQV80NFxuY2VydHMvS2NvbmZpZy00My1cdGJvb2wgXCYjMzQ7TUwtRFNBLTQ0XCYjMzQ7XG4tLVxuY2VydHMvS2NvbmZpZy01Mi1cbmNlcnRzL0tjb25maWc6NTM6Y29uZmlnIE1PRFVMRV9TSUdfS0VZX1RZUEVfTUxEU0FfNjVcbmNlcnRzL0tjb25maWctNTQtXHRib29sIFwmIzM0O01MLURTQS02NVwmIzM0O1xuLS1cbmNlcnRzL0tjb25maWctNjMtXG5jZXJ0cy9LY29uZmlnOjY0OmNvbmZpZyBNT0RVTEVfU0lHX0tFWV9UWVBFX01MRFNBXzg3XG5jZXJ0cy9LY29uZmlnLTY1LVx0Ym9vbCBcJiMzNDtNTC1EU0EtODdcJiMzNDtcbi0tXG5pbml0L0tjb25maWc9MjI2Mz1jb25maWcgUlRfTVVURVhFU1xuLS1cbmluaXQvS2NvbmZpZy0yMjY2LVxuaW5pdC9LY29uZmlnOjIyNjc6Y29uZmlnIE1PRFVMRV9TSUdfRk9STUFUXG5pbml0L0tjb25maWctMjI2OC1cdGRlZl9ib29sIG5cbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWc9MjQxPWNvbmZpZyBNT0RVTEVfU1JDVkVSU0lPTl9BTExcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMjUxLVxua2VybmVsL21vZHVsZS9LY29uZmlnOjI1Mjpjb25maWcgTU9EVUxFX1NJR1xua2VybmVsL21vZHVsZS9LY29uZmlnLTI1My1cdGJvb2wgXCYjMzQ7TW9kdWxlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb25cJiMzNDtcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMjczLVxua2VybmVsL21vZHVsZS9LY29uZmlnOjI3NDpjb25maWcgTU9EVUxFX1NJR19GT1JDRVxua2VybmVsL21vZHVsZS9LY29uZmlnLTI3NS1cdGJvb2wgXCYjMzQ7UmVxdWlyZSBtb2R1bGVzIHRvIGJlIHZhbGlkbHkgc2lnbmVkXCYjMzQ7XG4tLVxua2VybmVsL21vZHVsZS9LY29uZmlnPTI4MT1pZiBNT0RVTEVfU0lHIHx8IElNQV9BUFBSQUlTRV9NT0RTSUdcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0yODItXG5rZXJuZWwvbW9kdWxlL0tjb25maWc6MjgzOmNvbmZpZyBNT0RVTEVfU0lHX0FMTFxua2VybmVsL21vZHVsZS9LY29uZmlnLTI4NC1cdGJvb2wgXCYjMzQ7QXV0b21hdGljYWxseSBzaWduIGFsbCBtb2R1bGVzXCYjMzQ7XG4tLVxua2VybmVsL21vZHVsZS9LY29uZmlnPTI5Mz1jaG9pY2Vcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzAyLVxua2VybmVsL21vZHVsZS9LY29uZmlnOjMwMzpjb25maWcgTU9EVUxFX1NJR19TSEEyNTZcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMDQtXHRib29sIFwmIzM0O1NIQS0yNTZcJiMzNDtcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzA2LVxua2VybmVsL21vZHVsZS9LY29uZmlnOjMwNzpjb25maWcgTU9EVUxFX1NJR19TSEEzODRcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMDgtXHRib29sIFwmIzM0O1NIQS0zODRcJiMzNDtcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzEwLVxua2VybmVsL21vZHVsZS9LY29uZmlnOjMxMTpjb25maWcgTU9EVUxFX1NJR19TSEE1MTJcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMTItXHRib29sIFwmIzM0O1NIQS01MTJcJiMzNDtcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzE0LVxua2VybmVsL21vZHVsZS9LY29uZmlnOjMxNTpjb25maWcgTU9EVUxFX1NJR19TSEEzXzI1Nlxua2VybmVsL21vZHVsZS9LY29uZmlnLTMxNi1cdGJvb2wgXCYjMzQ7U0hBMy0yNTZcJiMzNDtcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzE4LVxua2VybmVsL21vZHVsZS9LY29uZmlnOjMxOTpjb25maWcgTU9EVUxFX1NJR19TSEEzXzM4NFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMyMC1cdGJvb2wgXCYjMzQ7U0hBMy0zODRcJiMzNDtcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzIyLVxua2VybmVsL21vZHVsZS9LY29uZmlnOjMyMzpjb25maWcgTU9EVUxFX1NJR19TSEEzXzUxMlxua2VybmVsL21vZHVsZS9LY29uZmlnLTMyNC1cdGJvb2wgXCYjMzQ7U0hBMy01MTJcJiMzNDtcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWc9MzI3PWVuZGNob2ljZVxua2VybmVsL21vZHVsZS9LY29uZmlnLTMyOC1cbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzozMjk6Y29uZmlnIE1PRFVMRV9TSUdfSEFTSFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMzMC1cdHN0cmluZ1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNiAyMDoyNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NjIzMAoJCQkJCQkJb3V0cHV0OiAzMAoJCQkJCQkJdGhvdWdodHM6IDEyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246CgoqKkludmVzdGlnYXRpbmcgYE1PRFVMRV9TSUdgKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgZXhhY3RseSB0aGUgYE1PRFVMRV9TSUdgIG1hY3JvIGlzIHNlbGVjdGluZy4gVGhpcyBpcyBmdW5kYW1lbnRhbDsgaXQmIzM5O3MgdGhlIGNvcmUgcGllY2UgSSBuZWVkIHRvIGdyYXNwIHRvIHByb2NlZWQuIEtub3dpbmcgdGhlIHNlbGVjdGlvbiBjcml0ZXJpYSBmb3IgYE1PRFVMRV9TSUdgIHdpbGwgbGlrZWx5IHByb3ZpZGUgY3J1Y2lhbCBjb250ZXh0IGZvciBteSBjdXJyZW50IHRhc2suIEkgbmVlZCB0byBkZWx2ZSBpbnRvIHRoZSBkZXRhaWxzIG9mIHdoYXQgYE1PRFVMRV9TSUdgIGVuY29tcGFzc2VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNiAyMDoyNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgTU9EVUxFX1NJRyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvS2NvbmZpZyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvbW9kdWxlL0tjb25maWc9MjQxPWNvbmZpZyBNT0RVTEVfU1JDVkVSU0lPTl9BTExcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMjUxLVxua2VybmVsL21vZHVsZS9LY29uZmlnOjI1Mjpjb25maWcgTU9EVUxFX1NJR1xua2VybmVsL21vZHVsZS9LY29uZmlnLTI1My1cdGJvb2wgXCYjMzQ7TW9kdWxlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb25cJiMzNDtcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMjczLVxua2VybmVsL21vZHVsZS9LY29uZmlnOjI3NDpjb25maWcgTU9EVUxFX1NJR19GT1JDRVxua2VybmVsL21vZHVsZS9LY29uZmlnLTI3NS1cdGJvb2wgXCYjMzQ7UmVxdWlyZSBtb2R1bGVzIHRvIGJlIHZhbGlkbHkgc2lnbmVkXCYjMzQ7XG4tLVxua2VybmVsL21vZHVsZS9LY29uZmlnPTI4MT1pZiBNT0RVTEVfU0lHIHx8IElNQV9BUFBSQUlTRV9NT0RTSUdcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0yODItXG5rZXJuZWwvbW9kdWxlL0tjb25maWc6MjgzOmNvbmZpZyBNT0RVTEVfU0lHX0FMTFxua2VybmVsL21vZHVsZS9LY29uZmlnLTI4NC1cdGJvb2wgXCYjMzQ7QXV0b21hdGljYWxseSBzaWduIGFsbCBtb2R1bGVzXCYjMzQ7XG4tLVxua2VybmVsL21vZHVsZS9LY29uZmlnPTI5Mz1jaG9pY2Vcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzAyLVxua2VybmVsL21vZHVsZS9LY29uZmlnOjMwMzpjb25maWcgTU9EVUxFX1NJR19TSEEyNTZcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMDQtXHRib29sIFwmIzM0O1NIQS0yNTZcJiMzNDtcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzA2LVxua2VybmVsL21vZHVsZS9LY29uZmlnOjMwNzpjb25maWcgTU9EVUxFX1NJR19TSEEzODRcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMDgtXHRib29sIFwmIzM0O1NIQS0zODRcJiMzNDtcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzEwLVxua2VybmVsL21vZHVsZS9LY29uZmlnOjMxMTpjb25maWcgTU9EVUxFX1NJR19TSEE1MTJcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMTItXHRib29sIFwmIzM0O1NIQS01MTJcJiMzNDtcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzE0LVxua2VybmVsL21vZHVsZS9LY29uZmlnOjMxNTpjb25maWcgTU9EVUxFX1NJR19TSEEzXzI1Nlxua2VybmVsL21vZHVsZS9LY29uZmlnLTMxNi1cdGJvb2wgXCYjMzQ7U0hBMy0yNTZcJiMzNDtcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzE4LVxua2VybmVsL21vZHVsZS9LY29uZmlnOjMxOTpjb25maWcgTU9EVUxFX1NJR19TSEEzXzM4NFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMyMC1cdGJvb2wgXCYjMzQ7U0hBMy0zODRcJiMzNDtcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzIyLVxua2VybmVsL21vZHVsZS9LY29uZmlnOjMyMzpjb25maWcgTU9EVUxFX1NJR19TSEEzXzUxMlxua2VybmVsL21vZHVsZS9LY29uZmlnLTMyNC1cdGJvb2wgXCYjMzQ7U0hBMy01MTJcJiMzNDtcbi0tXG5rZXJuZWwvbW9kdWxlL0tjb25maWc9MzI3PWVuZGNob2ljZVxua2VybmVsL21vZHVsZS9LY29uZmlnLTMyOC1cbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzozMjk6Y29uZmlnIE1PRFVMRV9TSUdfSEFTSFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMzMC1cdHN0cmluZ1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNiAyMDoyNzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NzAwNwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIGtlcm5lbCBtb2R1bGUgS2NvbmZpZyBmaWxlOgoKKipEaXZpbmcgaW50byBLY29uZmlnOiBNb2R1bGUgQ29uZmlndXJhdGlvbioqCgpPa2F5LCBsZXQmIzM5O3MgemVybyBpbiBvbiBga2VybmVsL21vZHVsZS9LY29uZmlnYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDI1Mi4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIG1vZHVsZSBjb25maWd1cmF0aW9uIHN5c3RlbSBpcyBoYW5kbGVkIGF0IGl0cyBjb3JlLiBJJiMzOTttIHByb2JhYmx5IGxvb2tpbmcgZm9yIHRoZSBtYWluIGRlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmVzIGZvciBtb2R1bGUgb3B0aW9ucywgZGVwZW5kZW5jaWVzLCBhbmQgZGVmYXVsdCBjb25maWd1cmF0aW9ucy4gSSBrbm93IHRoZSBLY29uZmlnIGxhbmd1YWdlIHdlbGwsIHNvIEkmIzM5O20gZXhwZWN0aW5nIHRvIHNlZSB0aGluZ3MgbGlrZSBgY29uZmlnYCwgYGJvb2xgLCBgdHJpc3RhdGVgLCBgc2VsZWN0YCwgYGRlcGVuZHMgb25gLCBhbmQgYGRlZmF1bHRgIGRpcmVjdGl2ZXMuIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgYnkgZ2V0dGluZyBhIGhpZ2gtbGV2ZWwgdmlldyBvZiBob3cgbW9kdWxlcyBhcmUgaW50ZWdyYXRlZCBpbnRvIHRoZSBvdmVyYWxsIGNvbmZpZ3VyYXRpb24gZmxvdzsgdGhpcyBjb3VsZCByZXZlYWwgYW55IHJlY2VudCBjaGFuZ2VzIHRvIG1vZHVsZSBjb25maWd1cmF0aW9uLiBUaGlzIHNob3VsZCBwcm92aWRlIHNvbWUgY29udGV4dCBhcm91bmQgdGhlIG1vZHVsZSBwYXJhbWV0ZXJzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNiAyMDoyODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9tb2R1bGUvS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMjUwOlx0XHQgIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIG1vZHVsZXMuICBJZiB1bnN1cmUsIHNheSBOLlxuIDI1MTpcdFxuIDI1MjpcdGNvbmZpZyBNT0RVTEVfU0lHXG4gMjUzOlx0XHRib29sIFwmIzM0O01vZHVsZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uXCYjMzQ7XG4gMjU0Olx0XHRzZWxlY3QgTU9EVUxFX1NJR19GT1JNQVRcbiAyNTU6XHRcdGhlbHBcbiAyNTY6XHRcdCAgQ2hlY2sgbW9kdWxlcyBmb3IgdmFsaWQgc2lnbmF0dXJlcyB1cG9uIGxvYWQ6IHRoZSBzaWduYXR1cmVcbiAyNTc6XHRcdCAgaXMgc2ltcGx5IGFwcGVuZGVkIHRvIHRoZSBtb2R1bGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZVxuIDI1ODpcdFx0ICBcdTAwM2NmaWxlOkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW9kdWxlLXNpZ25pbmcucnN0XHUwMDNlLlxuIDI1OTpcdFxuIDI2MDpcdFx0ICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYWRkcyB0aGUgT3BlblNTTCBkZXZlbG9wbWVudCBwYWNrYWdlcyBhcyBhXG4gMjYxOlx0XHQgIGtlcm5lbCBidWlsZCBkZXBlbmRlbmN5IHNvIHRoYXQgdGhlIHNpZ25pbmcgdG9vbCBjYW4gdXNlIGl0cyBjcnlwdG9cbiAyNjI6XHRcdCAgbGlicmFyeS5cbiAyNjM6XHRcbiAyNjQ6XHRcdCAgWW91IHNob3VsZCBlbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IHdpc2ggdG8gdXNlIGVpdGhlclxuIDI2NTpcdFx0ICBDT05GSUdfU0VDVVJJVFlfTE9DS0RPV05fTFNNIG9yIGxvY2tkb3duIGZ1bmN0aW9uYWxpdHkgaW1wb3NlZCB2aWFcbiAyNjY6XHRcdCAgYW5vdGhlciBMU00gLSBvdGhlcndpc2UgdW5zaWduZWQgbW9kdWxlcyB3aWxsIGJlIGxvYWRhYmxlIHJlZ2FyZGxlc3NcbiAyNjc6XHRcdCAgb2YgdGhlIGxvY2tkb3duIHBvbGljeS5cbiAyNjg6XHRcbiAyNjk6XHRcdCAgISEhV0FSTklORyEhISAgSWYgeW91IGVuYWJsZSB0aGlzIG9wdGlvbiwgeW91IE1VU1QgbWFrZSBzdXJlIHRoYXQgdGhlXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjI4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU3NTQ5CgkJCQkJCQlvdXRwdXQ6IDE2CgkJCQkJCQl0aG91Z2h0czogOTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTmF2aWdhdGluZyB0aGUgS2VybmVsIENvbmZpZ3VyYXRpb24gTGFieXJpbnRoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEl0IHNlZW1zIHRoYXQgYE1PRFVMRV9TSUdgIGlzIHRoZSBrZXkg4oCTIGl0IGRpcmVjdGx5IHB1bGxzIGluIGBNT0RVTEVfU0lHX0ZPUk1BVGAsIHdoaWNoIGluIHR1cm4gbGVhZHMgdG8gYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAuIEludGVyZXN0aW5nLiBCdXQgaGFuZyBvbi4uLiBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBpcyAqYWxzbyogYnJvdWdodCBpbiBieSBgRlNfVkVSSVRZX0JVSUxUSU5fU0lHTkFUVVJFU2AuIFNvLCBpdCYjMzk7cyBub3QgYSBkaXJlY3QsIGV4Y2x1c2l2ZSBkZXBlbmRlbmN5LgoKSWYgSSBzaW1wbHkgZW5hYmxlIGBNT0RVTEVfU0lHYCwgdGhlIGtlcm5lbCB3aWxsIGhhbmRsZSBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBhbmQsIGNyaXRpY2FsbHksIGBLRVlTYC4gT2theSwgdGhhdCBtYWtlcyBhIGtpbmQgb2YgbG9naWNhbCBzZW5zZS4gV2FpdCBhIG1pbnV0ZS4uLiBJIGtub3cgdGhhdCBgS0VZU2AgYXJlIG5lY2Vzc2FyeSBhbnl3YXkhIEdpdmVuIHRoaXMsIEkgc2hvdWxkIGNvbmZpcm0gdGhhdCBgQ09ORklHX0tFWVNgIGlzIGFsc28gZW5hYmxlZC4gVGhhdCYjMzk7cyBhIGNyaXRpY2FsIGNvbXBvbmVudCBmb3IgYWxsIG9mIHRoaXMgdG8gd29yayBhbmQgSSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCYjMzk7cyBzZXQgY29ycmVjdGx5LiBUaW1lIHRvIGNoZWNrIGl0cyBzdGF0dXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBLRVlTJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZz0yNDI9Y29uZmlnIE5TUElSRV9USU1FUlxuLS1cbmRyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZy0yNDctXG5kcml2ZXJzL2Nsb2Nrc291cmNlL0tjb25maWc6MjQ4OmNvbmZpZyBLRVlTVE9ORV9USU1FUlxuZHJpdmVycy9jbG9ja3NvdXJjZS9LY29uZmlnLTI0OS1cdGJvb2wgXCYjMzQ7S2V5c3RvbmUgdGltZXIgZHJpdmVyXCYjMzQ7IGlmIENPTVBJTEVfVEVTVFxuLS1cbmRyaXZlcnMvaXJxY2hpcC9LY29uZmlnPTM5OD1jb25maWcgSVJRX0NST1NTQkFSXG4tLVxuZHJpdmVycy9pcnFjaGlwL0tjb25maWctNDA1LVxuZHJpdmVycy9pcnFjaGlwL0tjb25maWc6NDA2OmNvbmZpZyBLRVlTVE9ORV9JUlFcbmRyaXZlcnMvaXJxY2hpcC9LY29uZmlnLTQwNy1cdHRyaXN0YXRlIFwmIzM0O0tleXN0b25lIDIgSVJRIGNvbnRyb2xsZXIgSVBcJiMzNDtcbi0tXG5kcml2ZXJzL3JlbW90ZXByb2MvS2NvbmZpZz0xMTI9Y29uZmlnIERBOFhYX1JFTU9URVBST0Ncbi0tXG5kcml2ZXJzL3JlbW90ZXByb2MvS2NvbmZpZy0xMzItXG5kcml2ZXJzL3JlbW90ZXByb2MvS2NvbmZpZzoxMzM6Y29uZmlnIEtFWVNUT05FX1JFTU9URVBST0NcbmRyaXZlcnMvcmVtb3RlcHJvYy9LY29uZmlnLTEzNC1cdHRyaXN0YXRlIFwmIzM0O0tleXN0b25lIFJlbW90ZXByb2Mgc3VwcG9ydFwmIzM0O1xuLS1cbmRyaXZlcnMvc29jL3RpL0tjb25maWc9OT1pZiBTT0NfVElcbmRyaXZlcnMvc29jL3RpL0tjb25maWctMTAtXG5kcml2ZXJzL3NvYy90aS9LY29uZmlnOjExOmNvbmZpZyBLRVlTVE9ORV9OQVZJR0FUT1JfUU1TU1xuZHJpdmVycy9zb2MvdGkvS2NvbmZpZy0xMi1cdHRyaXN0YXRlIFwmIzM0O0tleXN0b25lIFF1ZXVlIE1hbmFnZXIgU3ViIFN5c3RlbVwmIzM0O1xuLS1cbmRyaXZlcnMvc29jL3RpL0tjb25maWctMjItXG5kcml2ZXJzL3NvYy90aS9LY29uZmlnOjIzOmNvbmZpZyBLRVlTVE9ORV9OQVZJR0FUT1JfRE1BXG5kcml2ZXJzL3NvYy90aS9LY29uZmlnLTI0LVx0dHJpc3RhdGUgXCYjMzQ7VEkgS2V5c3RvbmUgTmF2aWdhdG9yIFBhY2tldCBETUEgc3VwcG9ydFwmIzM0O1xuLS1cbmRyaXZlcnMvdXNiL3BoeS9LY29uZmlnPTIzPWNvbmZpZyBGU0xfVVNCMl9PVEdcbi0tXG5kcml2ZXJzL3VzYi9waHkvS2NvbmZpZy0zMC1cbmRyaXZlcnMvdXNiL3BoeS9LY29uZmlnOjMxOmNvbmZpZyBLRVlTVE9ORV9VU0JfUEhZXG5kcml2ZXJzL3VzYi9waHkvS2NvbmZpZy0zMi1cdHRyaXN0YXRlIFwmIzM0O0tleXN0b25lIFVTQiBQSFkgRHJpdmVyXCYjMzQ7XG4tLVxuc2VjdXJpdHkva2V5cy9LY29uZmlnLTUtXG5zZWN1cml0eS9rZXlzL0tjb25maWc6NjptZW51Y29uZmlnIEtFWVNcbnNlY3VyaXR5L2tleXMvS2NvbmZpZy03LVx0Ym9vbCBcJiMzNDtFbmFibGUgYWNjZXNzIGtleSByZXRlbnRpb24gc3VwcG9ydFwmIzM0O1xuLS1cbnNlY3VyaXR5L2tleXMvS2NvbmZpZz0yND1pZiBLRVlTXG5zZWN1cml0eS9rZXlzL0tjb25maWctMjUtXG5zZWN1cml0eS9rZXlzL0tjb25maWc6MjY6Y29uZmlnIEtFWVNfUkVRVUVTVF9DQUNIRVxuc2VjdXJpdHkva2V5cy9LY29uZmlnLTI3LVx0Ym9vbCBcJiMzNDtFbmFibGUgdGVtcG9yYXJ5IGNhY2hpbmcgb2YgdGhlIGxhc3QgcmVxdWVzdF9rZXkoKSByZXN1bHRcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMjA6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTg0NjcKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAyOTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQW5hbHlzaXMgb2YgQlBGIFNpZ25hdHVyZSBWZXJpZmljYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBCUEYgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBjb2RlLiBJbml0aWFsbHksIEkgd2FzIGxvb2tpbmcgYXQgYENPTkZJR19LRVlTYCBhbmQgYENPTkZJR19NT0RVTEVfU0lHYCBhcyBwb3RlbnRpYWwgdHJpZ2dlcnMsIGJ1dCBoYW5nIG9uLi4uIEkgdGhpbmsgYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzIHRoZSBrZXkuIExldCYjMzk7cyBzZWUgaWYgd2UgY2FuIGVuYWJsZSB0aGF0IHRocm91Z2ggYENPTkZJR19NT0RVTEVfU0lHYC4gWXVwLCBpdCBsb29rcyBsaWtlIGBDT05GSUdfTU9EVUxFX1NJR2Agc2VsZWN0cyBgTU9EVUxFX1NJR19GT1JNQVRgLCB3aGljaCAqZG9lcyogaW5kZWVkIHNlbGVjdCBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYC4gVGhhdCYjMzk7cyBnb29kLiBCdXQgd2FpdCwgYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzICphbHNvKiBzZWxlY3RlZCBieSBgQ09ORklHX0ZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNgLiBTbywgaXQgc2VlbXMgbGlrZSBqdXN0IHNwZWNpZnlpbmcgYE1PRFVMRV9TSUdgIHNob3VsZCBiZSBlbm91Z2guCgpXYWl0LCB0aG91Z2guLi4gYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgKmFscmVhZHkqIGVuYWJsZWQuIFJpZ2h0LCBsZXQmIzM5O3MgZ28gYmFjayBhbmQgY2hlY2sgYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AgYWdhaW4uCgpgYGBjCglpZiAoZW52LSZndDtzaWduYXR1cmUpIHsKCQlyZXQgPSBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKGVudiwgYXR0ciwgdWF0dHIuaXNfa2VybmVsKTsKCQlpZiAocmV0KQoJCQlnb3RvIGVycl9wcmVwOwoJfQpgYGAKCk9rYXksIHNvIHRoYXQgY29kZSBwYXRoIGlzIHJlYWNoYWJsZSBpZiBgZW52LSZndDtzaWduYXR1cmVgIGlzIHNldC4gVGhlIHBhdGNoIGlzIGFkZGluZyBgYXR0ci0mZ3Q7c2lnbmF0dXJlYCBhbmQgYGF0dHItJmd0O3NpZ25hdHVyZV9zaXplYCB0byB0aGUgYHVuaW9uIGJwZl9hdHRyYC4gTm93LCBkaWQgSSBtaXNzIHNvbWV0aGluZz8gV2FzbiYjMzk7dCBgYXR0ci0mZ3Q7c2lnbmF0dXJlYCBhbHJlYWR5IGRlZmluZWQgdGhlcmU/IExldCBtZSBkb3VibGUtY2hlY2sgdGhlIGBpbmNsdWRlL3VhcGkvbGludXgvYnBmLmhgIGZpbGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NpZ25hdHVyZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvdWFwaS9saW51eC9icGYuaCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL3VhcGkvbGludXgvYnBmLmg9MTUyNz11bmlvbiBicGZfYXR0ciB7XG4tLVxuaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oLTE2NjEtXHRcdF9fdTMyXHRcdGZkX2FycmF5X2NudDtcbmluY2x1ZGUvdWFwaS9saW51eC9icGYuaDoxNjYyOlx0XHQvKiBQb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNpZ25hdHVyZSBvZiB0aGUgQlBGXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgtMTY2My1cdFx0ICogcHJvZ3JhbS5cbmluY2x1ZGUvdWFwaS9saW51eC9icGYuaC0xNjY0LVx0XHQgKi9cbmluY2x1ZGUvdWFwaS9saW51eC9icGYuaDoxNjY1Olx0XHRfX2FsaWduZWRfdTY0ICAgc2lnbmF0dXJlO1xuaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oOjE2NjY6XHRcdC8qIFNpemUgb2YgdGhlIHNpZ25hdHVyZSBidWZmZXIgaW4gYnl0ZXMuICovXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmg6MTY2NzpcdFx0X191MzIgXHRcdHNpZ25hdHVyZV9zaXplO1xuaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oOjE2Njg6XHRcdC8qIElEIG9mIHRoZSBrZXJuZWwga2V5cmluZyB0byBiZSB1c2VkIGZvciBzaWduYXR1cmVcbmluY2x1ZGUvdWFwaS9saW51eC9icGYuaC0xNjY5LVx0XHQgKiB2ZXJpZmljYXRpb24uXG4tLVxuaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oLTUyNTctICpcdFx0VGhlIGZvbGxvd2luZyBhcmUgYSBsaXN0IG9mIHN1cHBvcnRlZCBtYXAgdHlwZXMgYW5kIHRoZWlyXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmg6NTI1ODogKlx0XHRyZXNwZWN0aXZlIGV4cGVjdGVkIGNhbGxiYWNrIHNpZ25hdHVyZXM6XG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgtNTI1OS0gKlxuLS1cbmluY2x1ZGUvdWFwaS9saW51eC9icGYuaC01NDg4LSAqXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmg6NTQ4OTogKlx0XHRUaGUgZXhwZWN0ZWQgY2FsbGJhY2sgc2lnbmF0dXJlIGlzXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgtNTQ5MC0gKlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNiAyMDoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1OTU3MQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDI2MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgQlBGIFBhdGNoKioKCk9rYXksIHNvIEkgc2VlIHRoaXMgcGF0Y2ggaXMgYWJvdXQgYHNpZ25hdHVyZWAsIGFuZCBJIHJlY2FsbCB0aGF0IGl0IHdhcyBpbml0aWFsbHkgaGFuZGxlZCBpbiBgc3lzY2FsbC5jYC4gTm93LCB0aGUgcGF0Y2ggbW92ZXMgaXQgdG8gYHZlcmlmaWVyLmNgLCB3aGljaCBtYWtlcyBzZW5zZSBmb3IgdGhlIG92ZXJhbGwgYXJjaGl0ZWN0dXJlIGFzIHRoYXQmIzM5O3Mgd2hlcmUgdmVyaWZpY2F0aW9ucyByZXNpZGUsIGFuZCBpdCB0d2Vha3MgaG93IHRoZSB2ZXJpZmljYXRpb24gaXRzZWxmIGlzIGRvbmUgYnkgaW5jb3Jwb3JhdGluZyBtZXRhZGF0YSBtYXBzLiBUaGlzIHJlc3RydWN0dXJpbmcgZmVlbHMgbGlrZSBhIGdvb2Qgc3RlcCB0b3dhcmRzIGltcHJvdmVkIGNvZGUgb3JnYW5pemF0aW9uLgoKSG1tLCB0aGlzIHBhdGNoIGFsc28gdG91Y2hlcyBgZmRfYXJyYXlgIGhhbmRsaW5nLiBMb29rcyBsaWtlIGl0IGludHJvZHVjZXMgYSBzaWduaWZpY2FudCBjaGFuZ2UgdG8gaG93IHRoZSBwcm9ncmFtJiMzOTtzIGBmZF9hcnJheWAgaXMgbWFuYWdlZC4gVGhlIGNvbW1lbnQgZXhwbGFpbnMgdGhlIHR3byBkaWZmZXJlbnQgc2hhcGVzOiBlaXRoZXIgY29udGludW91cywgd2hlcmUgYGZkX2FycmF5YCBob2xkcyBhbGwgZW50cmllcyB1cCBmcm9udCwgb3Igc3BhcnNlIHdoZXJlIGVudHJpZXMgYXJlIHJlc29sdmVkIG9uIHRoZSBzcG90IGZyb20gYGZkX2FycmF5X3Jhd2AuIFRoZSBrZXkgaGVyZSBpcyB0aGlzIG5ldyBgZmRfYXJyYXlfY250YCB2YXJpYWJsZS4gSSBkb24mIzM5O3QgcmVjYWxsIHNlZWluZyB0aGF0IGJlZm9yZSwgc28gSSBuZWVkIHRvIGNoZWNrIGBpbmNsdWRlL3VhcGkvbGludXgvYnBmLmhgIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhpcyBpbnRyb2R1Y3Rpb24uIElzIHRoaXMgYSBuZXcgdXNlci1zcGFjZSBBUEkgY2hhbmdlPyBJcyBpdCBiYWNrd2FyZHMgY29tcGF0aWJsZT8gVGhpcyBpcyBhbiBpbnRlcmVzdGluZyBtb2RpZmljYXRpb24gdGhhdCBjb3VsZCBoYXZlIGltcGxpY2F0aW9ucyBmb3IgcGVyZm9ybWFuY2UgYW5kIG1lbW9yeSBtYW5hZ2VtZW50LCBkZXBlbmRpbmcgb24gaG93IGl0JiMzOTtzIHVzZWQuIExldCBtZSBnbyBmaW5kIHRoYXQgaGVhZGVyIGZpbGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2ZkX2FycmF5X2NudCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvdWFwaS9saW51eC9icGYuaCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL3VhcGkvbGludXgvYnBmLmg9MTUyNz11bmlvbiBicGZfYXR0ciB7XG4tLVxuaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oLTE2NTEtXHRcdF9fczMyXHRcdHByb2dfdG9rZW5fZmQ7XG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmg6MTY1MjpcdFx0LyogVGhlIGZkX2FycmF5X2NudCBjYW4gYmUgdXNlZCB0byBwYXNzIHRoZSBsZW5ndGggb2YgdGhlXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgtMTY1My1cdFx0ICogZmRfYXJyYXkgYXJyYXkuIEluIHRoaXMgY2FzZSBhbGwgdGhlIFttYXBdIGZpbGUgZGVzY3JpcHRvcnNcbi0tXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgtMTY1Ny1cdFx0ICogdXNlZCBieSB0aGUgdmVyaWZpZXIgZHVyaW5nIHRoZSBwcm9ncmFtIGxvYWQuIElmIHByb3ZpZGVkLFxuaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oOjE2NTg6XHRcdCAqIHRoZW4gdGhlIGZkX2FycmF5WzAsLi4uLGZkX2FycmF5X2NudC0xXSBpcyBleHBlY3RlZCB0byBiZVxuaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oLTE2NTktXHRcdCAqIGNvbnRpbnVvdXMuXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgtMTY2MC1cdFx0ICovXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmg6MTY2MTpcdFx0X191MzJcdFx0ZmRfYXJyYXlfY250O1xuaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oLTE2NjItXHRcdC8qIFBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgc2lnbmF0dXJlIG9mIHRoZSBCUEZcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMjA6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjA0NDQKCQkJCQkJCW91dHB1dDogMTYKCQkJCQkJCXRob3VnaHRzOiA2NzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIEJQRiBQYXRjaCBmb3IgUG90ZW50aWFsIEZ1enppbmcgVGFyZ2V0cyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBhbmQgaW1tZWRpYXRlbHksIGBmZF9hcnJheV9jbnRgIHBvcHMgb3V0LiBXYWl0LCBpc24mIzM5O3QgdGhhdCBhbHJlYWR5IGRlZmluZWQgc29tZXdoZXJlPyBMZXQmIzM5O3MgdmVyaWZ5IGlmIHRoaXMgcGF0Y2ggaW50cm9kdWNlZCBpdCBvciBqdXN0IG1vZGlmaWVkIGl0cyB1c2FnZS4gVGhlIGRpZmYgY29uZmlybXMgaXQsIHRoZSBwYXRjaCBkb2VzbiYjMzk7dCB0b3VjaCBgaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oYC4gQWhhISBJdCYjMzk7cyBtb2RpZmljYXRpb24sIG5vdCBpbnRyb2R1Y3Rpb24uCgpUaGUgcmVhbCBtZWF0IGlzIGluIHRoZSBga2VybmVsL2JwZi92ZXJpZmllci5jYCBjaGFuZ2VzLiBJIHNlZSBgcHJvY2Vzc19mZF9hcnJheWAgaXMgbm93IGBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXNgLCBhbmQgdGhlcmUmIzM5O3MgYSB3aG9sZSBmYW1pbHkgb2YgbmV3IGZ1bmN0aW9uczogYGZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXNgLCBgZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlYCwgYGZkX2FycmF5X2dldF9idGZfY29udGludW91c2AsIGFuZCBgZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2VgLiBUaGlzIGlzIHNjcmVhbWluZyAmIzM0O3BvdGVudGlhbCBmdXp6aW5nIHRhcmdldCYjMzQ7IHRvIG1lLiBUaGUgaW50ZXJwbGF5IGJldHdlZW4gY29udGludW91cyBhbmQgc3BhcnNlIGFjY2VzcyBwYXR0ZXJucyB3aXRoaW4gdGhpcyBjb250ZXh0IGNvdWxkIGJlIHZlcnkgaW50ZXJlc3RpbmcgZnJvbSBhIHNlY3VyaXR5IHBlcnNwZWN0aXZlLgoKSSYjMzk7bSBtYWtpbmcgYSBtZW50YWwgbm90ZSBvZiBhbGwgdGhlIHJlbGF0ZWQgc3ltYm9scywgaW5jbHVkaW5nIHRoZSBpbml0aWFsIG9uZXMsIGFsb25nIHdpdGggdGhlIG5ld2x5IGFkZGVkOgoKKiAgIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYAoqICAgYHByb2Nlc3NfZmRfYXJyYXlfY29udGludW91c2AKKiAgIGBwcm9jZXNzX2ZkX2FycmF5YAoqICAgYGZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXNgCiogICBgZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlYAoqICAgYGZkX2FycmF5X2dldF9tYXBfaWR4YAoqICAgYGZkX2FycmF5X2dldF9idGZfY29udGludW91c2AKKiAgIGBmZF9hcnJheV9nZXRfYnRmX3NwYXJzZWAKKiAgIGBmZF9hcnJheV9nZXRfYnRmYAoqICAgYGFkZF9mZF9mcm9tX2ZkX2FycmF5YAoKSSYjMzk7bSBleHBhbmRpbmcgbXkgc2NvcGUgYW5kIGNoZWNraW5nIGZvciBvdGhlciBwb3RlbnRpYWxseSByZWxldmFudCBmdW5jdGlvbnMgdG8gYmUgYXdhcmUgb2YuIFJpZ2h0LCBgZmRfc2xvdF9zZXRfbWFwYCwgYGZkX3Nsb3Rfc2V0X2J0ZmAsIGBmZF9zbG90X21hcGAsIGBmZF9zbG90X2J0ZmAg4oCTIHRob3NlIGFyZSByZWxhdGVkIHRvby4gQWxzbywgSSBzZWUgYF9fYWRkX3VzZWRfYnRmYCBhbmQgYF9fYWRkX3VzZWRfbWFwYCBhcmUgYWxzbyB1cGRhdGVkLCBub3cgd2l0aCBgZW52LSZndDtzaWduYXR1cmVgIGNoZWNrcy4gQW5kIGBjaGVja19hbmRfcmVzb2x2ZV9pbnNuc2Agbm93IGNhbGxzIGBmZF9hcnJheV9nZXRfbWFwX2lkeGAuIFRoaXMgaXMgYWxsIGJ1aWxkaW5nIGEgbW9yZSBjb21wbGV0ZSBwaWN0dXJlIG9mIHRoZSBhdHRhY2sgc3VyZmFjZS4KCk5vdywgbGV0JiMzOTtzIHRoaW5rIGFib3V0IGVuYWJsaW5nIHRoZSByaWdodCBrZXJuZWwgY29uZmlndXJhdGlvbnMuIEkmIzM5O2xsIG5lZWQgYE1PRFVMRV9TSUdgIHRvIGdldCBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBhbmQgYEtFWVNgLiBJIG5lZWQgdG8gZW5zdXJlIEkgZG9uJiMzOTt0IG92ZXJsb29rIGFueSBkZXBlbmRlbmNpZXMuIEEgcXVpY2sgY2hlY2sgdGVsbHMgbWUgYE1PRFVMRVNgIGlzIG9mdGVuIGVuYWJsZWQsIGJ1dCBpdCBjb3VsZCBiZSB0aGF0IEkgY2FuIGVuYWJsZSBqdXN0IGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGRpcmVjdGx5IGluIG15IGNvbmZpZ3VyYXRpb25zLiBXYWl0IGEgbWludXRlLi4uIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzIGEgYm9vbGVhbiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZiAqbiogYW5kIG5vIGFzc29jaWF0ZWQgcHJvbXB0LiBJIGNhbiYjMzk7dCBlbmFibGUgaXQgZGlyZWN0bHkhIEkgaGF2ZSB0byBlbmFibGUgc29tZXRoaW5nIHRoYXQgKnNlbGVjdHMqIGl0LiBMb29rcyBsaWtlIGBNT0RVTEVfU0lHYCBpcyB0aGUgd2F5IHRvIGdvLgpJJiMzOTtsbCBhbHNvIG5lZWQgdG8gdmVyaWZ5IHRoYXQgYEtFWVNgIGlzIGFjdGl2YXRlZCBieSBlbmFibGluZyBgTU9EVUxFX1NJR2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NlbGVjdCBLRVlTJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gvYXJtL21hY2gta2V5c3RvbmUvS2NvbmZpZz0yPWNvbmZpZyBBUkNIX0tFWVNUT05FXG4tLVxuYXJjaC9hcm0vbWFjaC1rZXlzdG9uZS9LY29uZmlnLTYtXHRzZWxlY3QgSEFWRV9BUk1fQVJDSF9USU1FUlxuYXJjaC9hcm0vbWFjaC1rZXlzdG9uZS9LY29uZmlnOjc6XHRzZWxlY3QgS0VZU1RPTkVfVElNRVJcbmFyY2gvYXJtL21hY2gta2V5c3RvbmUvS2NvbmZpZy04LVx0c2VsZWN0IEFSQ0hfSEFTX1JFU0VUX0NPTlRST0xMRVJcbi0tXG5kcml2ZXJzL252bWUvY29tbW9uL0tjb25maWc9Mz1jb25maWcgTlZNRV9LRVlSSU5HXG5kcml2ZXJzL252bWUvY29tbW9uL0tjb25maWctNC0gICAgICAgdHJpc3RhdGVcbmRyaXZlcnMvbnZtZS9jb21tb24vS2NvbmZpZzo1OiAgICAgICBzZWxlY3QgS0VZU1xuZHJpdmVycy9udm1lL2NvbW1vbi9LY29uZmlnLTYtXG4tLVxuZHJpdmVycy9udm1lL2hvc3QvS2NvbmZpZz0xMDA9Y29uZmlnIE5WTUVfVENQX1RMU1xuLS1cbmRyaXZlcnMvbnZtZS9ob3N0L0tjb25maWctMTAzLVx0c2VsZWN0IE5FVF9IQU5EU0hBS0VcbmRyaXZlcnMvbnZtZS9ob3N0L0tjb25maWc6MTA0Olx0c2VsZWN0IEtFWVNcbmRyaXZlcnMvbnZtZS9ob3N0L0tjb25maWctMTA1LVx0c2VsZWN0IFRMU1xuLS1cbmRyaXZlcnMvbnZtZS90YXJnZXQvS2NvbmZpZz0zPWNvbmZpZyBOVk1FX1RBUkdFVFxuLS1cbmRyaXZlcnMvbnZtZS90YXJnZXQvS2NvbmZpZy03LVx0c2VsZWN0IE5WTUVfS0VZUklORyBpZiBOVk1FX1RBUkdFVF9UQ1BfVExTXG5kcml2ZXJzL252bWUvdGFyZ2V0L0tjb25maWc6ODpcdHNlbGVjdCBLRVlTIGlmIE5WTUVfVEFSR0VUX1RDUF9UTFNcbmRyaXZlcnMvbnZtZS90YXJnZXQvS2NvbmZpZy05LVx0c2VsZWN0IFNHTF9BTExPQ1xuLS1cbmZzL2NyeXB0by9LY29uZmlnPTI9Y29uZmlnIEZTX0VOQ1JZUFRJT05cbi0tXG5mcy9jcnlwdG8vS2NvbmZpZy04LVx0c2VsZWN0IENSWVBUT19MSUJfU0hBNTEyXG5mcy9jcnlwdG8vS2NvbmZpZzo5Olx0c2VsZWN0IEtFWVNcbmZzL2NyeXB0by9LY29uZmlnLTEwLVx0aGVscFxuLS1cbmZzL25mcy9LY29uZmlnPTc3PWNvbmZpZyBORlNfVjRcbi0tXG5mcy9uZnMvS2NvbmZpZy03OS1cdGRlcGVuZHMgb24gTkZTX0ZTXG5mcy9uZnMvS2NvbmZpZzo4MDpcdHNlbGVjdCBLRVlTXG5mcy9uZnMvS2NvbmZpZy04MS1cdHNlbGVjdCBTVU5SUENfQkFDS0NIQU5ORUxcbi0tXG5mcy9zbWIvY2xpZW50L0tjb25maWc9Mj1jb25maWcgQ0lGU1xuLS1cbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNi1cdHNlbGVjdCBDUllQVE9fTElCX1NIQTUxMlxuZnMvc21iL2NsaWVudC9LY29uZmlnOjE3Olx0c2VsZWN0IEtFWVNcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xOC1cdHNlbGVjdCBETlNfUkVTT0xWRVJcbi0tXG5mcy91Ymlmcy9LY29uZmlnPTg5PWNvbmZpZyBVQklGU19GU19BVVRIRU5USUNBVElPTlxuZnMvdWJpZnMvS2NvbmZpZy05MC1cdGJvb2wgXCYjMzQ7VUJJRlMgYXV0aGVudGljYXRpb24gc3VwcG9ydFwmIzM0O1xuZnMvdWJpZnMvS2NvbmZpZzo5MTpcdHNlbGVjdCBLRVlTXG5mcy91Ymlmcy9LY29uZmlnLTkyLVx0c2VsZWN0IENSWVBUT19ITUFDXG4tLVxuaW5pdC9LY29uZmlnPTIxODM9Y29uZmlnIFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlxuLS1cbmluaXQvS2NvbmZpZy0yMTg1LVx0c2VsZWN0IFNZU1RFTV9UUlVTVEVEX0tFWVJJTkdcbmluaXQvS2NvbmZpZzoyMTg2Olx0c2VsZWN0IEtFWVNcbmluaXQvS2NvbmZpZy0yMTg3LVx0c2VsZWN0IENSWVBUT1xuLS1cbm5ldC9jZXBoL0tjb25maWc9Mj1jb25maWcgQ0VQSF9MSUJcbi0tXG5uZXQvY2VwaC9LY29uZmlnLTExLVx0c2VsZWN0IENSWVBUT1xubmV0L2NlcGgvS2NvbmZpZzoxMjpcdHNlbGVjdCBLRVlTXG5uZXQvY2VwaC9LY29uZmlnLTEzLVx0ZGVmYXVsdCBuXG4tLVxubmV0L3J4cnBjL0tjb25maWc9Nj1jb25maWcgQUZfUlhSUENcbi0tXG5uZXQvcnhycGMvS2NvbmZpZy0xMC1cdHNlbGVjdCBDUllQVE9fTElCX0RFUyBpZiBSWEtBRFxubmV0L3J4cnBjL0tjb25maWc6MTE6XHRzZWxlY3QgS0VZU1xubmV0L3J4cnBjL0tjb25maWctMTItXHRzZWxlY3QgTkVUX1VEUF9UVU5ORUxcbi0tXG5zZWN1cml0eS9pbnRlZ3JpdHkvS2NvbmZpZz0xOT1jb25maWcgSU5URUdSSVRZX1NJR05BVFVSRVxuLS1cbnNlY3VyaXR5L2ludGVncml0eS9LY29uZmlnLTIxLVx0ZGVmYXVsdCBuXG5zZWN1cml0eS9pbnRlZ3JpdHkvS2NvbmZpZzoyMjpcdHNlbGVjdCBLRVlTXG5zZWN1cml0eS9pbnRlZ3JpdHkvS2NvbmZpZy0yMy1cdHNlbGVjdCBTSUdOQVRVUkVcbi0tXG5zZWN1cml0eS9pbnRlZ3JpdHkvZXZtL0tjb25maWc9Mj1jb25maWcgRVZNXG5zZWN1cml0eS9pbnRlZ3JpdHkvZXZtL0tjb25maWctMy1cdGJvb2wgXCYjMzQ7RVZNIHN1cHBvcnRcJiMzNDtcbnNlY3VyaXR5L2ludGVncml0eS9ldm0vS2NvbmZpZzo0Olx0c2VsZWN0IEtFWVNcbnNlY3VyaXR5L2ludGVncml0eS9ldm0vS2NvbmZpZy01LVx0c2VsZWN0IEVOQ1JZUFRFRF9LRVlTXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDYyODIxCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMTAwNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipCUEYgUHJvZ3JhbSBTaWduaW5nIFZlcmlmaWNhdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBSZXZpZXcqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gSXQgbG9va3MgbGlrZSB0aGUgY29yZSBvZiB0aGUgcGF0Y2ggaW52b2x2ZXMgYWRkaW5nIEJQRiBwcm9ncmFtIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gd2l0aGluIHRoZSBrZXJuZWwmIzM5O3MgdmVyaWZpZXIuIFRoZSBpbnRlbnQgaXMgdG8gdmVyaWZ5IFBLQ1MjNyBzaWduYXR1cmVzIG9mIEJQRiBwcm9ncmFtcyBhbmQgdGhlaXIgbWV0YWRhdGEgbWFwcyB3aGVuIGEgc2lnbmF0dXJlIGlzIHByb3ZpZGVkIHZpYSB0aGUgYGF0dHItJmd0O3NpZ25hdHVyZWAgZmllbGQuIEFsc28sIHRoZSBwYXRjaCBhZGRzIHN1cHBvcnQgZm9yIGNvbnRpbnVvdXMgYGZkX2FycmF5YCB0aHJvdWdoIHRoZSBgZmRfYXJyYXlfY250YCBmaWVsZC4gVGhlc2UgYXJlIGZ1bmRhbWVudGFsIGNoYW5nZXMgaW4gdGhlIEJQRiB2ZXJpZmllciBwYXRoIHRoYXQgZGVtYW5kIHRob3JvdWdoIGZ1enppbmcuCgpNeSBpbml0aWFsIHRob3VnaHQgd2FzIHRoYXQgZW5hYmxpbmcgYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAgd291bGQgYmUgdGhlIGtleSwgc2luY2UgaXQmIzM5O3MgdGhlIHRhcmdldC4gSG93ZXZlciwgYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAgaXMgc2VsZWN0ZWQgYnkgc2V2ZXJhbCBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBvcHRpb25zLiBNeSBmaXJzdCB0aG91Z2h0IHdhcyBgTU9EVUxFX1NJR2AsIGFzIGl0IGFsc28gc2VsZWN0cyBgTU9EVUxFX1NJR19GT1JNQVRgLCB3aGljaCBzZWxlY3RzIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gLCB3aGljaCBzZWxlY3RzIGBLRVlTYC4KCkkgdGhlbiBkb3VibGUtY2hlY2tlZCBga2VybmVsL21vZHVsZS9LY29uZmlnYCB0byBjb25maXJtIHRoYXQgYE1PRFVMRV9TSUdgIGlzIGEgYm9vbGVhbiBhbmQgdGhhdCB0aGUgc2VsZWN0aW9uIGlzIGNvcnJlY3QuIEl0IGlzLCBhbmQgbG9va3Mgc3RyYWlnaHRmb3J3YXJkLgoKSSBjb25zaWRlcmVkIGRlcGVuZGVuY2llcy4gRG9lcyBgTU9EVUxFX1NJR2AgZGVwZW5kIG9uIGBNT0RVTEVTYD8gWWVzLCBpdCYjMzk7cyB0eXBpY2FsbHkgaW5zaWRlIGFuIGBpZiBNT0RVTEVTYCBibG9jayBpbiBga2VybmVsL21vZHVsZS9LY29uZmlnYCwgc28gaXQgZG9lcyBkZXBlbmQgb24gdGhlIG1vZHVsZSBzeXN0ZW0gYmVpbmcgZW5hYmxlZC4gSSBxdWlja2x5IGNoZWNrZWQgb3RoZXIgY29uZmlnIG9wdGlvbnMgdGhhdCBhbHNvIHNlbGVjdCBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYDogYEZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNgLCBgRE1fVkVSSVRZX1ZFUklGWV9ST09USEFTSF9TSUdgLCBgVUJJRlNfRlNfQVVUSEVOVElDQVRJT05gLCBgQ0ZHODAyMTFfUkVRVUlSRV9TSUdORURfUkVHREJgLCBhbmQgYFNFQ1VSSVRZX0lQRWAuIE9ubHkgYFNFQ1VSSVRZX0lQRWAgZG9lc24mIzM5O3QgZGVwZW5kIG9uIGFub3RoZXIgY29uZmlnLiBCdXQgYE1PRFVMRV9TSUdgIGlzIHRoZSBzdGFuZGFyZCByb3V0ZSwgc28gSSYjMzk7bGwgZ28gd2l0aCB0aGF0IGZvciBub3cuCgpUaGVuLCB0aGVyZSYjMzk7cyBgS0VYRUNfU0lHYCwgd2hpY2ggYWxzbyBzZWxlY3RzIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gLiBUbyBiZSBzYWZlLCBJIHdhcyB0aGlua2luZyBvZiBhZGRpbmcgYE1PRFVMRV9TSUdgIGFuZCBgRlNfVkVSSVRZX0JVSUxUSU5fU0lHTkFUVVJFU2AsIG9yIGp1c3QgYE1PRFVMRV9TSUdgLgoKSSBzdGFydGVkIHRvIGRpZyBkZWVwZXIgaW50byB0aGUgY29kZSBtb2RpZmljYXRpb25zLiBUaGUgcGF0Y2ggaW50cm9kdWNlcyBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAsIHdoaWNoIGlzIGRlZmluZWQgaW4gYGtlcm5lbC9icGYvaGVscGVycy5jYCBhbmQgaXMgZXhwb3J0ZWQgYXMgYSBrZnVuYy4gVGhlIHBhdGNoIGFsc28gbW9kaWZpZXMgYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AgYW5kIGBrZXJuZWwvYnBmL3N5c2NhbGwuY2AuCgpGb2N1c2luZyBvbiB0aGUgc3ltYm9scywgSSBub3RlZCBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAsIGBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXNgLCBgcHJvY2Vzc19mZF9hcnJheWAsIGBmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzYCwgYGZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZWAsIGBmZF9hcnJheV9nZXRfbWFwX2lkeGAsIGBmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXNgLCBgZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2VgLCBgZmRfYXJyYXlfZ2V0X2J0ZmAsIGFuZCBgYWRkX2ZkX2Zyb21fZmRfYXJyYXlgLgoKVXBvbiBpbnNwZWN0aW9uLCBgcHJvY2Vzc19mZF9hcnJheWAgaXMgcHJlc2VudCBidXQgbW9kaWZpZWQsIHdoaWxlIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCwgYGZkX2FycmF5X2dldF9tYXBfaWR4YCwgYW5kIGBmZF9hcnJheV9nZXRfYnRmYCBhcmUgbmV3IHdpdGhpbiBgdmVyaWZpZXIuY2AuIEFsc28sIGhlbHBlciBmdW5jdGlvbnMgYGZkX3Nsb3Rfc2V0X21hcGAsIGBmZF9zbG90X3NldF9idGZgLCBgZmRfc2xvdF9tYXBgLCBgZmRfc2xvdF9idGZgIGFyZSBwcmVzZW50LiBGaW5hbGx5LCBgX19hZGRfdXNlZF9idGZgIGFuZCBgX19hZGRfdXNlZF9tYXBgIGFyZSBtb2RpZmllZC4KCkkgdmVyaWZpZWQgdGhhdCBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgYW5kIGBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXNgIGFyZSBzdGF0aWMuCgpTbywgdGhlIHBsYW4gaXMgdG8gZW5hYmxlIGBNT0RVTEVfU0lHYCwgZXZlbiB0aG91Z2ggYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAgaXMgYSBgZGVmX2Jvb2xgLiBBcyBsb25nIGFzIGl0IGlzIHNlbGVjdGVkIGJ5IHNvbWV0aGluZyBlbHNlLCBvciBpZiB0aGUgY29uZmlnIG9wdGlvbnMgYXJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkLCB0aGlzIHNob3VsZCBiZSBmaW5lLgoKRmluYWxseSwgSSBjaGVja2VkIGBpbml0L0tjb25maWdgIGZvciB0aGUgZGVwZW5kZW5jaWVzIG9mIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGFuZCBjb25maXJtZWQgdGhhdCBpdCByZXF1aXJlcyBgQVNOMWAsIGBDUllQVE9gLCBhbmQgYFBLQ1M3X01FU1NBR0VfUEFSU0VSYC4gVGhpcyBpcyBhbiBpbXBvcnRhbnQgY29uc2lkZXJhdGlvbi4KCkluIHN1bW1hcnksIHRoZSBrZXkgY29uZmlnIHRvIHByb3ZpZGUgaXMgYE1PRFVMRV9TSUdgLiBUaGlzIHNob3VsZCBjb3JyZWN0bHkgZW5hYmxlIHRoZSBuZWNlc3NhcnkgZnVuY3Rpb25hbGl0eSBmb3IgQlBGIHByb2dyYW0gc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMjA6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbml0L0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyMTgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzIxODA6XHRcbjIxODE6XHRlbmRtZW51XG4yMTgyOlx0XG4yMTgzOlx0Y29uZmlnIFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlxuMjE4NDpcdFx0ZGVmX2Jvb2wgblxuMjE4NTpcdFx0c2VsZWN0IFNZU1RFTV9UUlVTVEVEX0tFWVJJTkdcbjIxODY6XHRcdHNlbGVjdCBLRVlTXG4yMTg3Olx0XHRzZWxlY3QgQ1JZUFRPXG4yMTg4Olx0XHRzZWxlY3QgQ1JZUFRPX1JTQVxuMjE4OTpcdFx0c2VsZWN0IEFTWU1NRVRSSUNfS0VZX1RZUEVcbjIxOTA6XHRcdHNlbGVjdCBBU1lNTUVUUklDX1BVQkxJQ19LRVlfU1VCVFlQRVxuMjE5MTpcdFx0c2VsZWN0IEFTTjFcbjIxOTI6XHRcdHNlbGVjdCBPSURfUkVHSVNUUllcbjIxOTM6XHRcdHNlbGVjdCBYNTA5X0NFUlRJRklDQVRFX1BBUlNFUlxuMjE5NDpcdFx0c2VsZWN0IFBLQ1M3X01FU1NBR0VfUEFSU0VSXG4yMTk1Olx0XHRoZWxwXG4yMTk2Olx0XHQgIFByb3ZpZGUgUEtDUyM3IG1lc3NhZ2UgdmVyaWZpY2F0aW9uIHVzaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgc3lzdGVtXG4yMTk3Olx0XHQgIHRydXN0ZWQga2V5cmluZyB0byBwcm92aWRlIHB1YmxpYyBrZXlzLiAgVGhpcyB0aGVuIGNhbiBiZSB1c2VkIGZvclxuMjE5ODpcdFx0ICBtb2R1bGUgdmVyaWZpY2F0aW9uLCBrZXhlYyBpbWFnZSB2ZXJpZmljYXRpb24gYW5kIGZpcm13YXJlIGJsb2JcbjIxOTk6XHRcdCAgdmVyaWZpY2F0aW9uLlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wNiAyMDozMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2NTA3MAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDMyMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgQlBGIFZlcmlmaWNhdGlvbiBhbmQgU2lnbmF0dXJlIENoZWNrcyoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBnb3QgYSBoYW5kbGUgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBoZXJlLiBJdCBzZWVtcyBsaWtlIGVuYWJsaW5nIGBNT0RVTEVfU0lHYCBpcyB0aGUga2V5IOKAkyB0aGF0JiMzOTtsbCBhdXRvbWF0aWNhbGx5IHB1bGwgaW4gYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAgYW5kIGFsbCBpdHMgcmVxdWlyZWQgY3J5cHRvIGFuZCBrZXkgcGFyc2luZyBjb25maWd1cmF0aW9ucy4gSSByZW1lbWJlciBub3csIGBNT0RVTEVfU0lHYCBpcyBkZWZpbmVkIGluIGBrZXJuZWwvbW9kdWxlL0tjb25maWdgLiBJIHdvbmRlciBpZiB0aGVyZSBhcmUgYW55IG90aGVyIHJlbGV2YW50IGNvbmZpZ3MsIGJ1dCBsZXQmIzM5O3MganVzdCBzdGljayB3aXRoIGBNT0RVTEVfU0lHYCBmb3Igbm93LgoKTm93LCBsZXQmIzM5O3MgbG9vayBhdCB0aGUgaW1wbGVtZW50YXRpb24gc2lkZS4gVGhlIGZvY3VzIGlzIGNsZWFybHkgb24gY2hhbmdlcyB0byBCUEYgcHJvZ3JhbSB2ZXJpZmljYXRpb24gYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLiBJJiMzOTttIHNlZWluZyBtb2RpZmljYXRpb25zIHRvIGBwcm9jZXNzX2ZkX2FycmF5YCBhbmQgdGhlIG1vdmVtZW50IG9mIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBmcm9tIGBzeXNjYWxsLmNgIHRvIGB2ZXJpZmllci5jYCwgYWxvbmcgd2l0aCBpdHMgbW9kaWZpY2F0aW9uLiBJbXBvcnRhbnRseSwgYGZkX2FycmF5X2dldF9tYXBfaWR4YCBhbmQgYGZkX2FycmF5X2dldF9idGZgIGFyZSBicmFuZCBuZXcgYWRkaXRpb25zLCB3aGljaCBJJiMzOTtsbCBkZWZpbml0ZWx5IG5lZWQgdG8gZGlnIGludG8uCgpHaXZlbiB0aGUgbmV3IGBmZF9hcnJheV9nZXRfbWFwX2lkeGAgZnVuY3Rpb24sIEkgc2hvdWxkIHN0YXJ0IGJ5IGV4YW1pbmluZyBga2VybmVsL2JwZi92ZXJpZmllci5jYC4gSSYjMzk7bSBndWVzc2luZyB0aGF0JiMzOTtzIHdoZXJlIEkmIzM5O2xsIGZpbmQgaXRzIGltcGxlbWVudGF0aW9uIGFuZCBob3BlZnVsbHkgdW5kZXJzdGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzLiBJJiMzOTtsbCBuZWVkIHRvIHNlZSBob3cgdGhlc2UgYWRkaXRpb25zIHJlbGF0ZSB0byB0aGUgZXhpc3RpbmcgYHByb2Nlc3NfZmRfYXJyYXlgIGFuZCBob3cgdGhleSBjb250cmlidXRlIHRvIHRoZSBvdmVyYWxsIHNlY3VyaXR5IHBvc3R1cmUuIFRoZSBmYWN0IHRoYXQgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIGhhcyBiZWVuIG1vdmVkIGFuZCBtb2RpZmllZCBpcyBhIHN0cm9uZyBpbmRpY2F0aW9uIHRoYXQgdGhlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBpcyBldm9sdmluZywgd2hpY2ggaXMgYSBrZXkgcG9pbnQgdG8gdW5kZXJzdGFuZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMjA6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZmRfYXJyYXlfZ2V0X21hcF9pZHgmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmL3ZlcmlmaWVyLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi92ZXJpZmllci5jPTE3OTg4PXN0YXRpYyBpbnQgYWRkX3VzZWRfbWFwKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBmZClcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgwMDEtXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MTgwMDI6c3RhdGljIGludCBmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgwMDMte1xuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xODAxOC1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxODAxOTpzdGF0aWMgaW50IGZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxua2VybmVsL2JwZi92ZXJpZmllci5jLTE4MDIwLXtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgwMjgtXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MTgwMjk6c3RhdGljIGludCBmZF9hcnJheV9nZXRfbWFwX2lkeChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxua2VybmVsL2JwZi92ZXJpZmllci5jLTE4MDMwLXtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xODAzMS1cdGlmIChlbnYtXHUwMDNlZmRfYXJyYXkpXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MTgwMzI6XHRcdHJldHVybiBmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzKGVudiwgaWR4KTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xODAzMy1cdGlmIChlbnYtXHUwMDNlc2lnbmF0dXJlKSB7XG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTE4MDM3LVx0aWYgKCFicGZwdHJfaXNfbnVsbChlbnYtXHUwMDNlZmRfYXJyYXlfcmF3KSlcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxODAzODpcdFx0cmV0dXJuIGZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZShlbnYsIGlkeCk7XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgwMzktXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jPTE4MjM2PXN0YXRpYyBpbnQgY2hlY2tfYW5kX3Jlc29sdmVfaW5zbnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgzMTEtXHRcdFx0Y2FzZSBCUEZfUFNFVURPX01BUF9JRFg6XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MTgzMTI6XHRcdFx0XHRtYXBfaWR4ID0gZmRfYXJyYXlfZ2V0X21hcF9pZHgoZW52LCBpbnNuWzBdLmltbSk7XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgzMTMtXHRcdFx0XHRicmVhaztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMjA6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjYzNTkKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAzMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0JiMzOTtzIGludGVybmFsIG1vbm9sb2d1ZToKCioqQ2hlY2tpbmcgb24gdGhlIGBmZF9hcnJheV9nZXRfYnRmYCBGdW5jdGlvbioqCgpSaWdodCwgdGhhdCYjMzk7cyBpdCB0aGVuLCB0aGV5JiMzOTtyZSBkZWZpbml0ZWx5IHByZXNlbnQgaW4gdGhlIGNvZGUgYmFzZS4gTm93LCB0byBnZXQgdGhlIHNwZWNpZmljcywgSSBuZWVkIHRvIGRpZyBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiwgYW5kIEkga25vdyBleGFjdGx5IHdoZXJlIHRvIGZpbmQgaXQuIFRpbWUgdG8gb3BlbiB1cCBga2VybmVsL2JwZi92ZXJpZmllci5jYC4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIGFmdGVyIHRoZSBgZmRfYXJyYXlfZ2V0X2J0ZmAgZnVuY3Rpb24gd2l0aGluIHRoYXQgZmlsZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGl0JiMzOTtzIGJlaGF2aW5nLCB0aGUgbG9naWMgaXQmIzM5O3MgdXNpbmcsIGFuZCBob3cgdGhlIGludGVyYWN0aW9uIHdpdGggZmlsZSBkZXNjcmlwdG9ycyBpcyBoYW5kbGVkIHRvIGFzY2VydGFpbiB0aGUgcHJlY2lzZSBtZWNoYW5pc20gYW5kIGhvdyBpdCYjMzk7cyBpbnRlcmFjdGluZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMjA6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZmRfYXJyYXlfZ2V0X2J0ZiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvdmVyaWZpZXIuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MjUyMT1zdGF0aWMgc3RydWN0IGJ0ZiAqXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjUyMjpmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yNTIzLXtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MjU0MD1zdGF0aWMgc3RydWN0IGJ0ZiAqXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjU0MTpmZF9hcnJheV9nZXRfYnRmX3NwYXJzZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxua2VybmVsL2JwZi92ZXJpZmllci5jLTI1NDIte1xuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yNTU2LVxua2VybmVsL2JwZi92ZXJpZmllci5jOjI1NTc6c3RhdGljIHN0cnVjdCBidGYgKmZkX2FycmF5X2dldF9idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yNTU4LXtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjU2My1cdGlmIChlbnYtXHUwMDNlZmRfYXJyYXkpXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjU2NDpcdFx0cmV0dXJuIGZkX2FycmF5X2dldF9idGZfY29udGludW91cyhlbnYsIGlkeCk7XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjU2NS1cdGlmICghYnBmcHRyX2lzX251bGwoZW52LVx1MDAzZWZkX2FycmF5X3JhdykpXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjU2NjpcdFx0cmV0dXJuIGZkX2FycmF5X2dldF9idGZfc3BhcnNlKGVudiwgaWR4KTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yNTY3LVxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0yNTcyPXN0YXRpYyBzdHJ1Y3QgYnRmICpfX2ZpbmRfa2Z1bmNfZGVzY19idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjU4OS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoyNTkwOlx0XHRidGYgPSBmZF9hcnJheV9nZXRfYnRmKGVudiwgb2Zmc2V0KTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yNTkxLVx0XHRpZiAoSVNfRVJSKGJ0ZikpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzA2IDIwOjMxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY3MDgwCgkJCQkJCQlvdXRwdXQ6IDI1MAoJCQkJCQkJdGhvdWdodHM6IDM4NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgQlBGIFByb2dyYW0gU2lnbmluZyBWZXJpZmljYXRpb24gUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kLCB5ZXMsIGl0JiMzOTtzIGRlZmluaXRlbHkgaW50cm9kdWNpbmcgc29tZSBpbnRlcmVzdGluZyBjaGFuZ2VzLiBNeSByZWFzb25pbmcgZ29lcyBsaWtlIHRoaXM6IHdlJiMzOTt2ZSBnb3QgQlBGIHByb2dyYW0gc2lnbmluZyB2ZXJpZmljYXRpb24gYmVpbmcgaW50ZWdyYXRlZCBpbnRvIHRoZSBrZXJuZWwgdmVyaWZpZXIuIFRoYXQmIzM5O3MgYSBjcml0aWNhbCBwb2ludC4gU3BlY2lmaWNhbGx5LCBpdCBzZWVtcyB0aGUgYGJwZl9jaGVja2AgcGF0aCBoYXMgYmVlbiBtb2RpZmllZCB0byBoYW5kbGUgUEtDUyM3IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZm9yIEJQRiBwcm9ncmFtcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBtZXRhZGF0YSBtYXBzLCBidXQgb25seSB3aGVuIGBhdHRyLSZndDtzaWduYXR1cmVgIGlzIHByZXNlbnQuIFBsdXMsIHRoZXJlIGlzIHRoaXMgbmV3IGNvbnRpbnVvdXMgYGZkX2FycmF5YCBzdXBwb3J0IGltcGxlbWVudGVkIHdpdGggYGZkX2FycmF5X2NudGAuIFRoaXMgaW1wYWN0cyB0aGUgY29yZSBCUEYgdmVyaWZpZXIgYW5kIHRodXMsIHdhcnJhbnRzIGNhcmVmdWwgZnV6emluZy4KCkZyb20gYSBjb25maWd1cmF0aW9uIHBlcnNwZWN0aXZlLCBJIHNlZSB0aGF0IHRoaXMgaXMgY29uZGl0aW9uYWwgb24gYE1PRFVMRV9TSUdgIGJlaW5nIGVuYWJsZWQuCgpOb3csIG15IGZvY3VzIGlzIHplcm9pbmcgaW4gb24gYSBmZXcga2V5IHN5bWJvbHMgaGVyZTogYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgLCBgcHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzYCwgYHByb2Nlc3NfZmRfYXJyYXlgLCBgZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91c2AsIGBmZF9hcnJheV9nZXRfbWFwX2lkeF9zcGFyc2VgLCBgZmRfYXJyYXlfZ2V0X21hcF9pZHhgLCBgZmRfYXJyYXlfZ2V0X2J0Zl9jb250aW51b3VzYCwgYGZkX2FycmF5X2dldF9idGZfc3BhcnNlYCwgYGZkX2FycmF5X2dldF9idGZgLCBhbmQgYGFkZF9mZF9mcm9tX2ZkX2FycmF5YC4KCldhaXQgYSBzZWNvbmQuIEkganVzdCByZWFsaXplZCB0aGF0IGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBpcyBhICpzdGF0aWMqIGZ1bmN0aW9uIHdpdGhpbiBga2VybmVsL2JwZi92ZXJpZmllci5jYC4gVGhhdCBtZWFucy4uLiBva2F5LCBhcmUgdGhlcmUgYW55IG90aGVyIGZ1bmN0aW9ucyBpbnZvbHZlZCBpbiB0aGlzPyBBaCwgeWVzLCBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGlzIGluIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AuIEl0JiMzOTtzIGRlZmluZWQgYXMgYSBrZnVuYywgYnV0IGNydWNpYWxseSwgaXQmIzM5O3MgYWxzbyBjYWxsZWQgYnkgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgLiBUaGF0IGNoYW5nZXMgdGhpbmdzIGEgYml0LiBTbyBJJiMzOTtsbCBpbmNsdWRlIGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAgYXMgYSBwcmltYXJ5IGZvY3VzIGFzIHdlbGwuCgpJIHNob3VsZCB2ZXJpZnkgdGhhdCBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGlzIHJlYWNoYWJsZS4gWWVzLCBpdCBpcyBjYWxsZWQgYnkgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgLgoKT2theSwgbGV0JiMzOTtzIGNhbGwgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDYgMjA6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01PRFVMRV9TSUcmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlJiMzNDssCiAgICAmIzM0O3Byb2Nlc3NfZmRfYXJyYXlfY29udGludW91cyYjMzQ7LAogICAgJiMzNDtwcm9jZXNzX2ZkX2FycmF5JiMzNDssCiAgICAmIzM0O2ZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXMmIzM0OywKICAgICYjMzQ7ZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlJiMzNDssCiAgICAmIzM0O2ZkX2FycmF5X2dldF9tYXBfaWR4JiMzNDssCiAgICAmIzM0O2ZkX2FycmF5X2dldF9idGZfY29udGludW91cyYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfYnRmX3NwYXJzZSYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfYnRmJiMzNDssCiAgICAmIzM0O2FkZF9mZF9mcm9tX2ZkX2FycmF5JiMzNDssCiAgICAmIzM0O2JwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIHByb2dyYW0gc2lnbmluZyB2ZXJpZmljYXRpb24gaW50byB0aGUga2VybmVsIHZlcmlmaWVyLiBJdCBtb2RpZmllcyB0aGUgYGJwZl9jaGVja2AgcGF0aCB0byB2ZXJpZnkgUEtDUyM3IHNpZ25hdHVyZXMgb2YgQlBGIHByb2dyYW1zIGFuZCB0aGVpciBtZXRhZGF0YSBtYXBzIHdoZW4gYGF0dHItXHUwMDNlc2lnbmF0dXJlYCBpcyBwcm92aWRlZC4gSXQgYWxzbyBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIGEgY29udGludW91cyBgZmRfYXJyYXlgIHZpYSBgZmRfYXJyYXlfY250YC4gVGhlc2UgYXJlIHJlYWNoYWJsZSBjb3JlIEJQRiB2ZXJpZmllciBjaGFuZ2VzIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TU9EVUxFX1NJRyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUmIzM0OywKICAgICYjMzQ7cHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzJiMzNDssCiAgICAmIzM0O3Byb2Nlc3NfZmRfYXJyYXkmIzM0OywKICAgICYjMzQ7ZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91cyYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfbWFwX2lkeF9zcGFyc2UmIzM0OywKICAgICYjMzQ7ZmRfYXJyYXlfZ2V0X21hcF9pZHgmIzM0OywKICAgICYjMzQ7ZmRfYXJyYXlfZ2V0X2J0Zl9jb250aW51b3VzJiMzNDssCiAgICAmIzM0O2ZkX2FycmF5X2dldF9idGZfc3BhcnNlJiMzNDssCiAgICAmIzM0O2ZkX2FycmF5X2dldF9idGYmIzM0OywKICAgICYjMzQ7YWRkX2ZkX2Zyb21fZmRfYXJyYXkmIzM0OywKICAgICYjMzQ7YnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBCUEYgcHJvZ3JhbSBzaWduaW5nIHZlcmlmaWNhdGlvbiBpbnRvIHRoZSBrZXJuZWwgdmVyaWZpZXIuIEl0IG1vZGlmaWVzIHRoZSBgYnBmX2NoZWNrYCBwYXRoIHRvIHZlcmlmeSBQS0NTIzcgc2lnbmF0dXJlcyBvZiBCUEYgcHJvZ3JhbXMgYW5kIHRoZWlyIG1ldGFkYXRhIG1hcHMgd2hlbiBgYXR0ci1cdTAwM2VzaWduYXR1cmVgIGlzIHByb3ZpZGVkLiBJdCBhbHNvIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgYSBjb250aW51b3VzIGBmZF9hcnJheWAgdmlhIGBmZF9hcnJheV9jbnRgLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUgQlBGIHZlcmlmaWVyIGNoYW5nZXMgdGhhdCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDctMDZUMjA6MjQ6NTIuNDIyMDE2MTAzWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mzk3MDE3Mjc5MDU2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1PRFVMRV9TSUdcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlXCIsXG4gICAgXCJwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXNcIixcbiAgICBcInByb2Nlc3NfZmRfYXJyYXlcIixcbiAgICBcImZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXNcIixcbiAgICBcImZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZVwiLFxuICAgIFwiZmRfYXJyYXlfZ2V0X21hcF9pZHhcIixcbiAgICBcImZkX2FycmF5X2dldF9idGZfY29udGludW91c1wiLFxuICAgIFwiZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2VcIixcbiAgICBcImZkX2FycmF5X2dldF9idGZcIixcbiAgICBcImFkZF9mZF9mcm9tX2ZkX2FycmF5XCIsXG4gICAgXCJicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIHByb2dyYW0gc2lnbmluZyB2ZXJpZmljYXRpb24gaW50byB0aGUga2VybmVsIHZlcmlmaWVyLiBJdCBtb2RpZmllcyB0aGUgYGJwZl9jaGVja2AgcGF0aCB0byB2ZXJpZnkgUEtDUyM3IHNpZ25hdHVyZXMgb2YgQlBGIHByb2dyYW1zIGFuZCB0aGVpciBtZXRhZGF0YSBtYXBzIHdoZW4gYGF0dHItXFx1MDAzZXNpZ25hdHVyZWAgaXMgcHJvdmlkZWQuIEl0IGFsc28gaW50cm9kdWNlcyBzdXBwb3J0IGZvciBhIGNvbnRpbnVvdXMgYGZkX2FycmF5YCB2aWEgYGZkX2FycmF5X2NudGAuIFRoZXNlIGFyZSByZWFjaGFibGUgY29yZSBCUEYgdmVyaWZpZXIgY2hhbmdlcyB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjI0OjUyLjQyMjAyNDM3M1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTE4Mjc2ODYwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgOWU3ZGViN2RhZWQwMjlmY2Q5MjAxZTU0YmVmZjVmNzJlMjY1ZDYwYlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgTW9uIEp1bCA2IDIwOjI0OjUwIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYnBmL2luZGV4LnJzdCBiL0RvY3VtZW50YXRpb24vYnBmL2luZGV4LnJzdFxcbmluZGV4IDBkNWM2ZjY1OTI2NjdhLi42MzhhMDBkNDJiYzJhMSAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL2JwZi9pbmRleC5yc3RcXG4rKysgYi9Eb2N1bWVudGF0aW9uL2JwZi9pbmRleC5yc3RcXG5AQCAtMjgsNiArMjgsNyBAQCB0aGF0IGdvZXMgaW50byBncmVhdCB0ZWNobmljYWwgZGVwdGggYWJvdXQgdGhlIEJQRiBBcmNoaXRlY3R1cmUuXFxuICAgIGNsYXNzaWNfdnNfZXh0ZW5kZWQucnN0XFxuICAgIGJwZl9pdGVyYXRvcnNcXG4gICAgYnBmX2xpY2Vuc2luZ1xcbisgICBzaWduaW5nXFxuICAgIHRlc3RfZGVidWdcXG4gICAgY2xhbmctbm90ZXNcXG4gICAgbGludXgtbm90ZXNcXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3QgYi9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdFxcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjQ0NmI0ZWRiYWU2MjZjXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL0RvY3VtZW50YXRpb24vYnBmL3NpZ25pbmcucnN0XFxuQEAgLTAsMCArMSw0OTYgQEBcXG4rLi4gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rXFxuKz09PT09PT09PT09PVxcbitCUEYgc2lnbmluZ1xcbis9PT09PT09PT09PT1cXG4rXFxuK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyBCUEYgcHJvZ3JhbXMgYXJlIGNyeXB0b2dyYXBoaWNhbGx5IHNpZ25lZCwgaG93IHRoZVxcbitrZXJuZWwgdmVyaWZpZXMgdGhlbSBhdCBsb2FkIHRpbWUsIGFuZCBob3cgTGludXggU2VjdXJpdHkgTW9kdWxlcyAoTFNNcykgLVxcbitpbmNsdWRpbmcgdGhlIEJQRiBMU00gLSB1c2UgdGhlIHJlc3VsdGluZyB2ZXJkaWN0IHRvIGVuZm9yY2UgcG9saWN5LiBJdCBpc1xcbit3cml0dGVuIGZvciBkZXZlbG9wZXJzIHdobyB3YW50IHRvIHByb2R1Y2Ugc2lnbmVkIEJQRiBvYmplY3RzLCB1bmRlcnN0YW5kIHdoYXRcXG4rdGhlIHNpZ25hdHVyZSBhY3R1YWxseSBndWFyYW50ZWVzLCBvciBidWlsZCBhIHBvbGljeSBvbiB0b3Agb2YgaXQuXFxuK1xcbitNb3RpdmF0aW9uXFxuKz09PT09PT09PT1cXG4rXFxuK0Egc2lnbmVkIEJQRiBwcm9ncmFtIGxldHMgdGhlIGtlcm5lbCBlc3RhYmxpc2ggdGhhdCB0aGUgYnl0ZWNvZGUgYmVpbmcgbG9hZGVkXFxuK29yaWdpbmF0ZXMgZnJvbSBhIHRydXN0ZWQgcHJvZHVjZXIgYW5kIHdhcyBub3QgbW9kaWZpZWQgaW4gdHJhbnNpdC4gT24gaXRzIG93blxcbit0aGUga2VybmVsIGRvZXMgbm90ICpyZXF1aXJlKiBzaWduYXR1cmVzIC0gYW4gdW5zaWduZWQgcHJvZ3JhbSBsb2FkcyBleGFjdGx5IGFzXFxuK2JlZm9yZSAtIGJ1dCBpdCByZWNvcmRzIGEgdmVyZGljdCAoc2VlIGBUaGUgdmVyZGljdGBfKSB0aGF0IGFuIExTTSBjYW4gZ2F0ZSBvbi5cXG4rVGhpcyBpcyB0aGUgYnVpbGRpbmcgYmxvY2sgZm9yIHBvbGljaWVzIHN1Y2ggYXMgXFxcIm9ubHkgcnVuIEJQRiB0aGF0IHdhcyBzaWduZWQgYnlcXG4rYSBrZXkgaW4gdGhlIHRydXN0ZWQga2V5cmluZ1xcXCIsIGFzIGNvdWxkIGluIHRoZSBmdXR1cmUgYmUgZW5mb3JjZWQgYnkgYW4gTFNNXFxuK3N1Y2ggYXMgSVBFLlxcbitcXG4rU2lnbmluZyBpcyBvcnRob2dvbmFsIHRvIHRoZSBleGlzdGluZyBwZXJtaXNzaW9uIG1vZGVsOiBpdCBkb2VzIG5vdCByZXBsYWNlIHRoZVxcbitjYXBhYmlsaXR5IGNoZWNrcyBvciB0aGUgdmVyaWZpZXIuIEEgc2lnbmVkIGxvYWQgc3RpbGwgcmVxdWlyZXMgdGhlIHVzdWFsXFxuK3ByaXZpbGVnZXMgKGBgQ0FQX0JQRmBgIGFuZCBhbnkgcHJvZ3JhbS10eXBlLXNwZWNpZmljIGNhcGFiaWxpdHksIHN1YmplY3QgdG9cXG4rYGBrZXJuZWwudW5wcml2aWxlZ2VkX2JwZl9kaXNhYmxlZGBgKSwgYW5kIHRoZSBsb2FkZXIncyBpbnN0cnVjdGlvbnMgYXJlIHN0aWxsXFxuK2NoZWNrZWQgYnkgdGhlIHZlcmlmaWVyIGxpa2UgYW55IG90aGVyIHByb2dyYW0uIEEgdmFsaWQgc2lnbmF0dXJlIGVzdGFibGlzaGVzXFxuKypvcmlnaW4gYW5kIGludGVncml0eSosIG5vdCBzYWZldHkgLSBpdCBsZXRzIGEgcG9saWN5IHRydXN0IHdoZXJlIHRoZSBieXRlY29kZVxcbitjYW1lIGZyb20sIGl0IGRvZXMgbm90IGxldCBhIGxvYWQgc2tpcCBhbnkgY2hlY2sgaXQgd291bGQgb3RoZXJ3aXNlIGZhY2UuXFxuK1xcbitUaGUgaGFyZCBwYXJ0IGlzICp3aGF0KiBnZXRzIHNpZ25lZC4gQSBuYWl2ZSBzY2hlbWUgd291bGQgc2lnbiBhIHByb2dyYW0nc1xcbitpbnN0cnVjdGlvbiBidWZmZXIgYXQgYnVpbGQgdGltZSBhbmQgdmVyaWZ5IHRoYXQgc2lnbmF0dXJlIGF0XFxuK2BgQlBGX1BST0dfTE9BRGBgLiBUaGF0IGRvZXMgbm90IHN1cnZpdmUgY29udGFjdCB3aXRoIHJlYWwgQlBGIG9iamVjdHMsIGJlY2F1c2VcXG4rdGhlIGJ5dGVzIHRoZSBrZXJuZWwgZmluYWxseSBsb2FkcyBhcmUgbm90IHRoZSBieXRlcyB0aGUgZGV2ZWxvcGVyIGJ1aWx0IGFuZFxcbitzaWduZWQuIEJldHdlZW4gdGhlIHR3bywgbGliYnBmIGFuZCB0aGUga2VybmVsIHJld3JpdGUgdGhlIHByb2dyYW06XFxuK1xcbistICoqbWFwIGZpbGUgZGVzY3JpcHRvcnMqKiBhcmUgcGF0Y2hlZCBpbnRvIGBgbGRfaW1tNjRgYCBpbnN0cnVjdGlvbnNcXG4rICAoYGBCUEZfUFNFVURPX01BUF9GRGBgKSwgYW5kIGEgbWFwJ3MgZmQgaXMgYXNzaWduZWQgYXQgbG9hZCB0aW1lLCBzbyBpdFxcbisgIGRpZmZlcnMgb24gZXZlcnkgcnVuO1xcbistICoqQ08tUkUgcmVsb2NhdGlvbnMqKiByZXdyaXRlIGZpZWxkIG9mZnNldHMsIHNpemVzIGFuZCBleGlzdGVuY2UgZmxhZ3MgYWdhaW5zdFxcbisgIHRoZSAqcnVubmluZyoga2VybmVsJ3MgQlRGLCBzbyB0aGUgcmVzdWx0IGRpZmZlcnMgZnJvbSBvbmUga2VybmVsIHRvIHRoZSBuZXh0O1xcbistICoqa2Z1bmMgYW5kIGtzeW0gcmVmZXJlbmNlcyoqIGFyZSByZXNvbHZlZCB0byBpZHMvYWRkcmVzc2VzIGluIHRoZSBydW5uaW5nXFxuKyAga2VybmVsO1xcbistICoqZ2xvYmFsIGRhdGEqKiAoYGAucm9kYXRhYGAvYGAuZGF0YWBgL2BgLmJzc2BgKSBpcyBjcmVhdGVkIGFuZCBzZWVkZWQgYXMgbWFwc1xcbisgIGF0IGxvYWQuXFxuK1xcbitTbyBhIHNpZ25hdHVyZSBvdmVyIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbnMgY2Fubm90IG1hdGNoIHRoZSByZWxvY2F0ZWRcXG4raW5zdHJ1Y3Rpb25zIHRoZSB2ZXJpZmllciBlbmRzIHVwIGNoZWNraW5nLCBhbmQgdGhlIHJlbG9jYXRlZCBmb3JtIGNhbm5vdCBiZVxcbitwcm9kdWNlZCBhaGVhZCBvZiB0aW1lIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgdGFyZ2V0IGtlcm5lbC4gVGhlcmUgaXMgbm9cXG4rZml4ZWQgYnl0ZSBzdHJpbmcgdGhhdCBpcyBib3RoIHNpZ25hYmxlIGF0IGJ1aWxkIHRpbWUgYW5kIHdoYXQgdGhlIGtlcm5lbFxcbithY3R1YWxseSBsb2FkcyAtIHdoaWNoIGlzIHdoeSBhIHByb2dyYW0gY2Fubm90IHNpbXBseSBiZSBzaWduZWQgYW5kIGxvYWRlZFxcbitkaXJlY3RseS5cXG4rXFxuK1RoZSB0cnVzdGVkIGxvYWRlclxcbis9PT09PT09PT09PT09PT09PT1cXG4rXFxuK1RoZSBzb2x1dGlvbiBpcyB0byBtb3ZlIHRoYXQgc2V0dXAgd29yayAqaW50byogYSBzbWFsbCBCUEYgcHJvZ3JhbSAtIHRoZVxcbisqKmxvYWRlcioqIC0gYW5kIHNpZ24gdGhlIGxvYWRlciBpbnN0ZWFkIG9mIHRoZSBpbmRpdmlkdWFsIHByb2dyYW1zLiBsaWJicGYnc1xcbitgYGdlbl9sb2FkZXJgYCBtYWNoaW5lcnkgKGBgYnBmdG9vbCBnZW4gc2tlbGV0b24gLUxgYCwgdGhlIFxcXCJsaWdodCBza2VsZXRvblxcXCIpXFxuK2VtaXRzIGEgYGBCUEZfUFJPR19UWVBFX1NZU0NBTExgYCBwcm9ncmFtIHdob3NlIGJvZHkgcGVyZm9ybXMgdGhlIGJwZigpIHN5c2NhbGxzXFxuK3RoYXQgY3JlYXRlIG1hcHMsIGFwcGx5IHJlbG9jYXRpb25zLCBhbmQgbG9hZCB0aGUgcmVhbCBwcm9ncmFtcy4gVGhlIHBheWxvYWQgaXRcXG4raW5zdGFsbHMgLSB0aGUgc2VyaWFsaXplZCBwcm9ncmFtcywgbWFwIGRlc2NyaXB0aW9ucywgcmVsb2NhdGlvbiBkYXRhIGFuZFxcbitpbml0aWFsIHZhbHVlcyAtIGxpdmVzIGluIGEgc2VwYXJhdGUgYXJyYXkgbWFwLCB0aGUgKiptZXRhZGF0YSBtYXAqKlxcbisoYGBfX2xvYWRlci5tYXBgYCkuXFxuK1xcbitTbyB0aGUgdW5pdCBvZiB0cnVzdCBpcyB0aGUgbG9hZGVyLCBhbmQgdGhlIHNpZ25pbmcgY29udHJhY3QgaXM6OlxcbitcXG4rICAgIFNpZyhJX2xvYWRlciB8fCBEX21ldGEpXFxuK1xcbit3aGVyZSBgYElfbG9hZGVyYGAgaXMgdGhlIGxvYWRlcidzIGluc3RydWN0aW9uIHN0cmVhbSBhbmQgYGBEX21ldGFgYCBpcyB0aGVcXG4rY29udGVudCBvZiB0aGUgbWV0YWRhdGEgbWFwLiBWZXJpZnlpbmcgdGhlIGxvYWRlcidzIHNpZ25hdHVyZSBlc3RhYmxpc2hlcyB0aGF0XFxuK2JvdGggdGhlIGxvYWRlciAqYW5kKiB0aGUgcGF5bG9hZCBpdCBpcyBhYm91dCB0byBpbnN0YWxsIGFyZSBhdXRoZW50aWMuIFRoZVxcbitsb2FkZXIgaXMgcmVwcm9kdWNpYmxlOiBgYGdlbl9sb2FkZXJgYCBidWlsZHMgaXQgZnJvbSBwcmltaXRpdmVzIHNvIHRoZSBzYW1lXFxuK29iamVjdCB5aWVsZHMgdGhlIHNhbWUgYnl0ZXMgb24gYW55IGJ1aWxkIGhvc3QuXFxuK1xcbitXaHkgdGhlIGxvYWRlciBpcyBzaWduYWJsZSB3aGVuIHRoZSBwcm9ncmFtIGlzIG5vdFxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbitcXG4rVGhlIGxvYWRlciBzaWRlc3RlcHMgZXZlcnkgcmV3cml0ZSBsaXN0ZWQgYWJvdmUsIGJlY2F1c2UgdGhlIGJ5dGVzIHRoYXQgYXJlXFxuK3NpZ25lZCBhcmUgKnJlbG9jYXRpb24taW52YXJpYW50KjpcXG4rXFxuKy0gVGhlIGxvYWRlcidzIG93biBpbnN0cnVjdGlvbnMgYXJlIGEgZml4ZWQgc2VxdWVuY2Ugb2YgYnBmKCkgc3lzY2FsbHMgZW1pdHRlZFxcbisgIGJ5IGBgZ2VuX2xvYWRlcmBgOyB0aGV5IGNhcnJ5IG5vIENPLVJFIHJlbG9jYXRpb25zIGFuZCByZXNvbHZlIG5vIGtzeW1zLCBzb1xcbisgIHRoZXkgYXJlIGlkZW50aWNhbCBvbiBldmVyeSBrZXJuZWwuIFRoZSBtZXRhZGF0YSBtYXAgaXMgcmVmZXJlbmNlZCBieSAqaW5kZXgqXFxuKyAgaW50byBgYGZkX2FycmF5YGAgKGBgQlBGX1BTRVVET19NQVBfSURYX1ZBTFVFYGApLCBub3QgYnkgYSBiYWtlZC1pbiBmaWxlXFxuKyAgZGVzY3JpcHRvciwgc28gZXZlbiB0aGF0IHJlZmVyZW5jZSBkb2VzIG5vdCBjaGFuZ2UgYmV0d2VlbiBidWlsZCBhbmQgbG9hZC5cXG4rICBUaGUgbG9hZGVyIGluc3RydWN0aW9uIGJ5dGVzIHRoZSBrZXJuZWwgdmVyaWZpZXMgYXJlIGV4YWN0bHkgdGhlIGJ5dGVzIHRoYXRcXG4rICB3ZXJlIHNpZ25lZC5cXG4rLSBUaGUgbWV0YWRhdGEgbWFwIGlzIG9wYXF1ZSwgZnJvemVuIGRhdGEgLSB0aGUgc2VyaWFsaXplZCB0YXJnZXQgcHJvZ3JhbXMsXFxuKyAgdGhlaXIgcmVsb2NhdGlvbiByZWNvcmRzLCBtYXAgZGVzY3JpcHRpb25zIGFuZCBpbml0aWFsIHZhbHVlcy4gSXRzIGJ5dGVzIGFyZVxcbisgIGlkZW50aWNhbCBhdCBidWlsZCB0aW1lIGFuZCBhdCBsb2FkIHRpbWUsIHNvIHRoZXkgYXJlIHNpbXBseSBhcHBlbmRlZCB0byB0aGVcXG4rICBpbnN0cnVjdGlvbnMgYW5kIGNvdmVyZWQgYnkgdGhlIHNhbWUgc2lnbmF0dXJlICh0aGVyZSBpcyBubyBzZXBhcmF0ZSBtZXRhZGF0YVxcbisgIGhhc2ggdG8gY29tcHV0ZSBvciBjb21wYXJlKS5cXG4rXFxuK0FsbCB0aGUgaG9zdC1zcGVjaWZpYyByZXdyaXRpbmcgLSBjcmVhdGluZyBtYXBzLCBwYXRjaGluZyB0aGVpciBmZHMgaW50byB0aGVcXG4rdGFyZ2V0IHByb2dyYW1zLCBhcHBseWluZyBDTy1SRSwgcmVzb2x2aW5nIGtzeW1zLCBzZWVkaW5nIGdsb2JhbCBkYXRhIC0gc3RpbGxcXG4raGFwcGVucywgYnV0IGl0IGhhcHBlbnMgKmluc2lkZSB0aGUgbG9hZGVyIGF0IHJ1bnRpbWUqLCBvbiB0aGUgdmVyaWZpZWRcXG4rbWV0YWRhdGEsICoqYWZ0ZXIqKiB0aGUga2VybmVsIGhhcyB2ZXJpZmllZCB0aGUgYGBpbnNucyB8fCBtZXRhZGF0YWBgIHNpZ25hdHVyZS5cXG4rVGhlIGtlcm5lbCBuZXZlciBoYXMgdG8gdmVyaWZ5IHRoZSByZWxvY2F0ZWQgdGFyZ2V0IHByb2dyYW1zOiBpdCB2ZXJpZmllcyB0aGVcXG4rbG9hZGVyIGFuZCBpdHMgaW5wdXRzIG9uY2UsIGFuZCB0cnVzdCB0cmFuc2ZlcnMgdG8gd2hhdGV2ZXIgdGhhdCBub3ctdHJ1c3RlZCxcXG4rZGV0ZXJtaW5pc3RpYyBsb2FkZXIgaW5zdGFsbHMuIFRoZSByZWxvY2F0aW9uIHN0ZXAgaXMgbW92ZWQgZnJvbSBcXFwiYmVmb3JlIHRoZVxcbitzaWduYXR1cmUgY2FuIGJlIGNoZWNrZWRcXFwiIHRvIFxcXCJhZnRlciBhIHRydXN0ZWQgcHJvZ3JhbSBydW5zXFxcIiAtIHdoaWNoIGlzIGV4YWN0bHlcXG4rd2hhdCBtYWtlcyBpdCBzaWduYWJsZS5cXG4rXFxuK0JlY2F1c2UgdGhlIG1ldGFkYXRhIG1hcCBpcyB0aGUgbG9hZGVyJ3Mgb25seSB1bnRydXN0ZWQgaW5wdXQsIHR3byBleGlzdGluZyBtYXBcXG4rcHJvcGVydGllcyBhcmUgcmV1c2VkIHRvIGtlZXAgaXQgdHJ1c3R3b3J0aHkgYWNyb3NzIHRoZSBsb2FkOlxcbitcXG4rRXhjbHVzaXZlIG1hcHNcXG4rICAgIEEgbWFwIGNyZWF0ZWQgd2l0aCBgYGV4Y2xfcHJvZ19oYXNoYGAgKHNlZSBgYEJQRl9NQVBfQ1JFQVRFYGApIG1heSBvbmx5IGJlXFxuKyAgICBhY2Nlc3NlZCBieSBhIHByb2dyYW0gd2hvc2UgZGlnZXN0IG1hdGNoZXMgdGhhdCBoYXNoLiBUaGUgdmVyaWZpZXIgZW5mb3JjZXNcXG4rICAgIGBgbWFwLVxcdTAwM2VleGNsX3Byb2dfc2hhID09IHByb2ctXFx1MDAzZWRpZ2VzdGBgIGZvciBldmVyeSBtYXAgYSBwcm9ncmFtIHVzZXMsIHNvIHRoZVxcbisgICAgbWV0YWRhdGEgbWFwIGlzIGJvdW5kIHRvIGV4YWN0bHkgdGhlIHNpZ25lZCBsb2FkZXIgYW5kIGNhbm5vdCBiZSBzaGFyZWQgd2l0aFxcbisgICAgb3IgbXV0YXRlZCBieSBhbm90aGVyIHByb2dyYW0uXFxuK1xcbitGcm96ZW4gbWFwc1xcbisgICAgVGhlIG1ldGFkYXRhIG1hcCBpcyBmcm96ZW4gKGBgQlBGX01BUF9GUkVFWkVgYCkgYmVmb3JlIHRoZSBsb2FkZXIgaXMgbG9hZGVkLlxcbisgICAgRnJlZXppbmcgYmxvY2tzIGZ1cnRoZXIgdXNlcnNwYWNlIHdyaXRlcywgc28gdGhlIGJ5dGVzIGZvbGRlZCBpbnRvIHRoZVxcbisgICAgc2lnbmF0dXJlIGNhbm5vdCBjaGFuZ2UgYmVmb3JlIHRoZSBsb2FkZXIgcnVucy4gKEZyZWV6aW5nIGRvZXMgbm90IG1ha2UgdGhlXFxuKyAgICBtYXAgcmVhZC1vbmx5IHRvIHRoZSBsb2FkZXIgcHJvZ3JhbSBpdHNlbGYsIHdoaWNoIHN0aWxsIHdyaXRlcyBjcmVhdGVkIGZpbGVcXG4rICAgIGRlc2NyaXB0b3JzIGJhY2sgaW50byB0aGUgYmxvYidzIHNjcmF0Y2ggYXJlYS4pXFxuK1xcbitMb2FkLXRpbWUgdmVyaWZpY2F0aW9uXFxuKz09PT09PT09PT09PT09PT09PT09PT09XFxuK1xcbitSYXRoZXIgdGhhbiBoYXZlIHRoZSBsb2FkZXIgY2hlY2sgaXRzIG93biBtZXRhZGF0YSBmcm9tIHdpdGhpbiBCUEYsIHRoZSBrZXJuZWxcXG4rdmVyaWZpZXMgaXQgZGlyZWN0bHkgYXQgYGBCUEZfUFJPR19MT0FEYGAsIHdpdGggbm8gbmV3IFVBUEkuIFRoZSBtZWNoYW5pc21cXG4rcmV1c2VzIHRoZSBleGlzdGluZyBgYGZkX2FycmF5YGA6XFxuK1xcbisjLiBVc2Vyc3BhY2UgY3JlYXRlcyB0aGUgbWV0YWRhdGEgbWFwIHdpdGggYGBleGNsX3Byb2dfaGFzaGBgIHNldCB0byB0aGVcXG4rICAgbG9hZGVyJ3MgZGlnZXN0LCBwb3B1bGF0ZXMgaXQsIGFuZCBmcmVlemVzIGl0LlxcbisjLiBUaGUgbG9hZGVyIGlzIGxvYWRlZCB3aXRoIGBgc2lnbmF0dXJlYGAvYGBzaWduYXR1cmVfc2l6ZWBgL2Bga2V5cmluZ19pZGBgXFxuKyAgIHNldCwgdGhlIG1ldGFkYXRhIG1hcCByZWZlcmVuY2VkIHRocm91Z2ggYGBmZF9hcnJheWBgLCBhbmQgYGBmZF9hcnJheV9jbnRgYFxcbisgICBzZXQgc28gdGhlIGtlcm5lbCBrbm93cyB0aGUgYXJyYXkncyBsZW5ndGguXFxuKyMuIFNpZ25hdHVyZSB2ZXJpZmljYXRpb24gcnVucyBpbnNpZGUgdGhlIHZlcmlmaWVyIChgYGJwZl9jaGVjaygpYGApLCBvbmNlIGl0XFxuKyAgIGhhcyByZXNvbHZlZCB0aGUgYGBmZF9hcnJheWBgIGVudHJpZXMgaW50byB0aGUgcHJvZ3JhbSdzIGBgdXNlZF9tYXBzYGAuIFRoZVxcbisgICBtYXBzIGZvbGRlZCBpbnRvIHRoZSBzaWduYXR1cmUgYXJlIHRoZXJlZm9yZSB0aGUgdmVyeSBvYmplY3RzIHRoZSBwcm9ncmFtXFxuKyAgIGJpbmRzIC0gYSBzaW5nbGUgcmVzb2x1dGlvbiBvZiBgYGZkX2FycmF5YGAsIG5vdCBhIHNlcGFyYXRlIHJlYWQsIHNvIHRoZVxcbisgICB2ZXJpZmllZCBieXRlcyBjYW5ub3QgYmUgc3dhcHBlZCBmb3IgYSBkaWZmZXJlbnQgbWFwIGFmdGVyIHRoZSBjaGVjayAobm9cXG4rICAgdGltZS1vZi1jaGVjay90aW1lLW9mLXVzZSB3aW5kb3cpLiBFYWNoIGZvbGRlZCBtYXAgbXVzdCBiZSBleGNsdXNpdmUgKGNhcnJ5XFxuKyAgIGBgZXhjbF9wcm9nX3NoYWBgKSBhbmQgYSBwbGFpbiBhcnJheSBtYXAgKGBgQlBGX01BUF9UWVBFX0FSUkFZYGApOyBvbmx5IGFuXFxuKyAgIGFycmF5IG1hcCBleHBvc2VzIGl0cyB2YWx1ZSBidWZmZXIgdGhyb3VnaCBgYG1hcF9kaXJlY3RfdmFsdWVfYWRkcigpYGAgYXMgYVxcbisgICBrZXJuZWwgYWRkcmVzcyBzcGFubmluZyBgYHZhbHVlX3NpemVgYCBieXRlcy4gQSBtYXAgdGhhdCBpcyBub3QgZXhjbHVzaXZlLCBub3RcXG4rICAgZnJvemVuLCBvciBub3QgYSBwbGFpbiBhcnJheSBpcyByZWplY3RlZCwgd2l0aCBhIHZlcmlmaWVyIGxvZyBtZXNzYWdlIG5hbWluZ1xcbisgICB0aGUgb2ZmZW5kaW5nIG1hcC4gVGhlIGtlcm5lbCBhcHBlbmRzIGVhY2ggbWFwJ3MgZnJvemVuXFxuKyAgIGNvbnRlbnRzIHRvIHRoZSBpbnN0cnVjdGlvbiBidWZmZXIgYW5kIHZlcmlmaWVzIHRoZSBQS0NTIzcgc2lnbmF0dXJlIG92ZXIgdGhlXFxuKyAgIGNvbmNhdGVuYXRpb24gYGBpbnNucyB8fCBtZXRhZGF0YV8wIHx8IG1ldGFkYXRhXzEgfHwgLi4uYGAgaW4gYGB1c2VkX21hcHNgYFxcbisgICBvcmRlciwgYmVmb3JlIGl0IHJld3JpdGVzIHRoZSAoc2lnbmVkKSBpbnN0cnVjdGlvbnMuXFxuK1xcbitBIHNpZ25lZCBwcm9ncmFtIHRoZXJlZm9yZSB0YWtlcyBvbmUgb2YgZXhhY3RseSB0d28gc2hhcGVzLCBib3RoIGZ1bGx5XFxuK3N1cHBvcnRlZDpcXG4rXFxuKy0gKipObyBib3VuZCBtYXBzKiogKGBgZmRfYXJyYXlfY250ID09IDBgYCk6IHRoZXJlIGlzIG5vdGhpbmcgdG8gYXBwZW5kLCBzbyB0aGVcXG4rICBrZXJuZWwgdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSBvdmVyIHRoZSBpbnN0cnVjdGlvbnMgYWxvbmUuIEEgdmFsaWQgc2lnbmF0dXJlXFxuKyAgeWllbGRzIGBgQlBGX1NJR19WRVJJRklFRGBgIGFuZCB0aGUgcHJvZ3JhbSBsb2Fkcy4gVGhpcyBpcyB0aGUgb3JkaW5hcnkgY2FzZVxcbisgIGZvciBhIGRpcmVjdGx5LWxvYWRlZCBzaWduZWQgcHJvZ3JhbSB3aXRoIG5vIHNlcGFyYXRlIHBheWxvYWQ7IGl0IGlzICpub3QqXFxuKyAgcmVqZWN0ZWQgZm9yIFxcXCJtaXNzaW5nXFxcIiBtZXRhZGF0YSwgYmVjYXVzZSBpdCBoYXMgbm9uZSB0byBjb3Zlci5cXG4rLSAqKkV4Y2x1c2l2ZSBib3VuZCBtYXBzKiogKGBgZmRfYXJyYXlfY250IFxcdTAwM2UgMGBgKTogZXZlcnkgZW50cnkgaXMgZXhjbHVzaXZlIGFuZFxcbisgIGZvbGRlZCwgc28gdGhlIHNpZ25hdHVyZSBjb3ZlcnMgYGBpbnNucyB8fCBtZXRhZGF0YWBgLlxcbitcXG4rVGhlcmUgaXMgbm8gdGhpcmQgc2hhcGU6IGEgbm9uLWV4Y2x1c2l2ZSBtYXAgaW4gYSBzaWduZWQgcHJvZ3JhbSdzIGBgZmRfYXJyYXlgYFxcbitpcyByZWplY3RlZCByYXRoZXIgdGhhbiBzaWxlbnRseSBsZWZ0IG91dCBvZiB0aGUgc2lnbmF0dXJlLCBzbyBhIHByb2dyYW0gYm91bmRcXG4rdG8gYSBzaWduZWQgbG9hZGVyIG5ldmVyIGhhcyBhIG1hcCB0aGUgc2lnbmF0dXJlIGRvZXMgbm90IGNvdmVyLlxcbitcXG4rVGhlIGRpZ2VzdCBiaW5kaW5nIChgYGV4Y2xfcHJvZ19zaGEgPT0gcHJvZy1cXHUwMDNlZGlnZXN0YGApIGlzIGVuZm9yY2VkIGJ5IHRoZVxcbit2ZXJpZmllciBhcyB1c3VhbDsgYmVjYXVzZSB0aGF0IGNoZWNrIHJ1bnMgd2hpbGUgYGBmZF9hcnJheWBgIGlzIHJlc29sdmVkIC1cXG4rYmVmb3JlIHRoZSB2ZXJpZmllciB3b3VsZCBvdGhlcndpc2UgY29tcHV0ZSB0aGUgdGFnIC0gYGBwcm9nLVxcdTAwM2VkaWdlc3RgYCBpc1xcbitjb21wdXRlZCB1cCBmcm9udCBpbiB0aGUgdmVyaWZpZXIsIG92ZXIgdGhlIHVubW9kaWZpZWQgKHNpZ25hdHVyZS1jb3ZlcmVkKVxcbitpbnN0cnVjdGlvbnMsIGZvciBhbnkgc2lnbmVkIGxvYWQuXFxuK1xcbitDb3ZlcmFnZSBpcyB0aGVuIGVuZm9yY2VkIGFzIHRoZSB2ZXJpZmllciByZXNvbHZlcyBpbnN0cnVjdGlvbnMsIGF0IHRoZSBwb2ludFxcbitlYWNoIG9iamVjdCBpcyBib3VuZCByYXRoZXIgdGhhbiBieSBhIGNvdW50IHRha2VuIGFmdGVyd2FyZHMuIE9uY2UgdGhlIHNpZ25hdHVyZVxcbitoYXMgYmVlbiB2ZXJpZmllZCwgYmluZGluZyBhbnkgZnVydGhlciBtYXAgaXMgcmVmdXNlZDogYSBtYXAgcmVhY2hlZCBieSBhXFxuK2RpcmVjdGx5LXJlZmVyZW5jZWQgZmQsIG9yIGEgbWFwIHN3YXBwZWQgaW50byBhbiBgYGZkX2FycmF5YGAgc2xvdCB0aGUgbG9hZGVyXFxuK3JlYWRzLCBpcyBub3QgYW1vbmcgdGhvc2UgYWxyZWFkeSBmb2xkZWQsIHNvIGl0IGlzIHJlamVjdGVkIHRoZSBtb21lbnQgdGhlXFxuK3ZlcmlmaWVyIHRyaWVzIHRvIGJpbmQgaXQuIEEgQlRGIGlzIHJlZnVzZWQgb3V0cmlnaHQgZm9yIGEgc2lnbmVkIHByb2dyYW0gLSBhXFxuK2tzeW0gb3IgYSBCVEYgZmQgaW4gYGBmZF9hcnJheWBgLCB3aGV0aGVyIHJlc29sdmVkIHVwIGZyb250IG9yIGxhemlseSBmb3IgYVxcbittb2R1bGUga2Z1bmMsIGlzIHJlamVjdGVkIHdoZW4gaXQgd291bGQgYmUgYm91bmQuIFRvZ2V0aGVyIHdpdGggdGhlIGZvbGQgcnVsZVxcbithYm92ZSB0aGlzIGtlZXBzIHRoZSB2ZXJkaWN0IGJpbmFyeTogYSBzaWduZWQgcHJvZ3JhbSBjYW5ub3QgdXNlIGEgbWFwIGl0c1xcbitzaWduYXR1cmUgZG9lcyBub3QgY292ZXIsIGFuZCBhIGRpZmZlcmVudCBidXQgZXF1YWxseSBkaWdlc3QtYm91bmQgbWFwIGNhbm5vdCBiZVxcbitzdWJzdGl0dXRlZCBhdCBhbiBgYGZkX2FycmF5YGAgc2xvdC4gTm9uLWV4Y2x1c2l2ZSBtYXBzIGFyZSBuZXZlciBmb2xkZWQsIHNvIGFcXG4rc2lnbmVkIHByb2dyYW0gY2Fubm90IHVzZSBvbmUgYXQgYWxsLlxcbitcXG4rVGhlIHZlcmRpY3RcXG4rPT09PT09PT09PT1cXG4rXFxuK0EgcHJvZ3JhbSBpcyBlaXRoZXIgdW5zaWduZWQgb3IgZnVsbHkgdmVyaWZpZWQgLSB0aGVyZSBpcyBubyBpbnRlcm1lZGlhdGVcXG4rc3RhdGUuIFRoZSBvdXRjb21lIGlzIHJlY29yZGVkIGluIGBgcHJvZy1cXHUwMDNlYXV4LVxcdTAwM2VzaWcudmVyZGljdGBgOlxcbitcXG4rLi4gY29kZS1ibG9jazo6IGNcXG4rXFxuKyAgICBlbnVtIGJwZl9zaWdfdmVyZGljdCB7XFxuKyAgICAgICAgICAgIEJQRl9TSUdfVU5TSUdORUQgPSAwLFxcbisgICAgICAgICAgICBCUEZfU0lHX1ZFUklGSUVELFxcbisgICAgfTtcXG4rXFxuK2BgQlBGX1NJR19WRVJJRklFRGBgIG1lYW5zIHRoZSBzaWduYXR1cmUgaXMgdmFsaWQgYW5kIGNvdmVycyB0aGUgaW5zdHJ1Y3Rpb25zXFxuKyphbmQqIHRoZSBmcm96ZW4gY29udGVudHMgb2YgZXZlcnkgZXhjbHVzaXZlIG1hcCB0aGUgcHJvZ3JhbSB1c2VzOlxcbitcXG4rLSBGb3IgYW4gb3JkaW5hcnksIGRpcmVjdGx5LWxvYWRlZCBzaWduZWQgcHJvZ3JhbSB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgd2hvbGVcXG4rICBhcnRpZmFjdCBhbmQgaXQgdXNlcyBubyBleGNsdXNpdmUgbWFwcywgc28gYSB2YWxpZCBpbnN0cnVjdGlvbiBzaWduYXR1cmUgaXNcXG4rICB0aGUgY29tcGxldGUgdmVyaWZpY2F0aW9uLlxcbistIEZvciBhIHNpZ25lZCBsb2FkZXIgdGhlIG1ldGFkYXRhIG1hcCBpcyBleGNsdXNpdmUsIHNvIGl0cyBjb250ZW50cyBhcmUgZm9sZGVkXFxuKyAgaW4gYW5kIHRoZSBzaWduYXR1cmUgY292ZXJzIGBgaW5zbnMgfHwgbWV0YWRhdGFgYC5cXG4rXFxuK1RoZXJlIGlzIGRlbGliZXJhdGVseSBubyBcXFwiaW5zdHJ1Y3Rpb25zIHZlcmlmaWVkIGJ1dCBtZXRhZGF0YSBub3RcXFwiIHZlcmRpY3Q6IGFcXG4rc2lnbmVkIGxvYWRlciB0aGF0IGZhaWxzIHRvIGNvdmVyIGl0cyBtZXRhZGF0YSBpcyAqcmVqZWN0ZWQqIChzZWUgYWJvdmUpLCBub3RcXG4rcmVjb3JkZWQgd2l0aCBhIHdlYWtlciB2ZXJkaWN0LiBgYEJQRl9TSUdfVkVSSUZJRURgYCB0aGVyZWZvcmUgYWx3YXlzIG1lYW5zIHRoZVxcbitwcm9ncmFtIGFuZCBldmVyeXRoaW5nIHRoZSBzaWduYXR1cmUgaXMgcmVzcG9uc2libGUgZm9yIGFyZSBhdXRoZW50aWMsIHdoaWNoIGlzXFxuK3doYXQgYSBwb2xpY3kgY2FuIHJlbHkgb24uXFxuK1xcbitBbG9uZ3NpZGUgdGhlIHZlcmRpY3QgdGhlIGtlcm5lbCByZWNvcmRzIHdoaWNoIGtleXJpbmcgdmFsaWRhdGVkIHRoZSBzaWduYXR1cmU7XFxuK3NlZSBgS2V5cmluZ3NgXy5cXG4rXFxuK0VuZm9yY2VtZW50IHZpYSBMU01zXFxuKz09PT09PT09PT09PT09PT09PT09XFxuK1xcbitTaWduaW5nIG9ubHkgKnJlY29yZHMqIGEgdmVyZGljdDsgYW4gTFNNIHR1cm5zIGl0IGludG8gcG9saWN5LiBUaGUgdmVyZGljdCBhbmRcXG4ra2V5cmluZyBmaWVsZHMgbGl2ZSBpbiBgYHN0cnVjdCBicGZfcHJvZ19hdXhgYCwgc28gYSBCUEYgTFNNIHByb2dyYW0gY2FuIHJlYWRcXG4rdGhlbSBkaXJlY3RseSAoc2VlIERvY3VtZW50YXRpb24vYnBmL3Byb2dfbHNtLnJzdCBmb3Igd3JpdGluZyBhbmQgYXR0YWNoaW5nIEJQRlxcbitMU00gcHJvZ3JhbXMpOyB0aGUgc2FtZSBmaWVsZHMgYXJlIGVxdWFsbHkgYXZhaWxhYmxlIHRvIGluLXRyZWUgTFNNcy4gVHdvIGhvb2tzXFxuK2FyZSB1c2VmdWwgYXQgZGlmZmVyZW50IHBvaW50cyBvZiB0aGUgbG9hZDogdGhlIGRlZGljYXRlZFxcbitgYHNlY3VyaXR5X2JwZl9wcm9nX2xvYWQoKWBgIGdhdGVzIGFkbWlzc2lvbiBiZWZvcmUgdGhlIG1haW4gdmVyaWZpY2F0aW9uIHdvcmssXFxuK2FuZCB0aGUgZXhpc3RpbmcgYGBzZWN1cml0eV9icGZfcHJvZygpYGAgb2JzZXJ2ZXMgYSBwcm9ncmFtIHRoYXQgaGFzIGZ1bGx5XFxuK2xvYWRlZC5cXG4rXFxuK0FkbWlzc2lvbjogYGBzZWN1cml0eV9icGZfcHJvZ19sb2FkKClgYFxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4rXFxuK1RoaXMgaG9vayBnYXRlcyBhZG1pc3Npb24gKipmb3IgZXZlcnkgbG9hZCoqLCBmcm9tIGEgc2luZ2xlIGNhbGwgc2l0ZSBpbnNpZGUgdGhlXFxuK3ZlcmlmaWVyIChgYGJwZl9jaGVjaygpYGApLCBiZWZvcmUgdGhlIG1haW4gdmVyaWZpY2F0aW9uIHdvcmsuIEl0IHJ1bnMgYWZ0ZXIgdGhlXFxuK29wdGlvbmFsIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24sIHNvIHRoZSB2ZXJkaWN0IGFuZCBrZXlyaW5nIGZpZWxkcyBhcmUgZmluYWwgLSB0aGVcXG4raG9vayBjYW4gc2VlIHdoZXRoZXIsIGFuZCBob3cgc3Ryb25nbHksIHRoZSBwcm9ncmFtIHdhcyBzaWduZWQsIHdoaWNoIGtleXJpbmdcXG4rdmFsaWRhdGVkIGl0LCB0aGUgbG9hZCBgYGF0dHJgYCwgdGhlIEJQRiB0b2tlbiBhbmQgd2hldGhlciB0aGUgbG9hZCBjYW1lIGZyb20gdGhlXFxuK2tlcm5lbC4gRm9yIGEgc2lnbmVkIGxvYWQgdGhlIHZlcmRpY3QgaXMgYGBCUEZfU0lHX1ZFUklGSUVEYGAgaGVyZSAodGhlIHNpZ25hdHVyZVxcbitoYXMganVzdCBiZWVuIGNoZWNrZWQpOyBmb3IgYW4gdW5zaWduZWQgbG9hZCBpdCBpcyBgYEJQRl9TSUdfVU5TSUdORURgYC5cXG4rXFxuK1RoaXMgaXMgdGhlIHBsYWNlIGZvciAqY29hcnNlIGFkbWlzc2lvbiogdGhhdCBtdXN0IGFsc28gc2VlIHVuc2lnbmVkIGFuZFxcbitub3QteWV0LXZlcmlmaWVkIGxvYWRzOiByZXF1aXJlIGEgc2lnbmF0dXJlIGF0IGFsbCwgcmVzdHJpY3QgdGhlIGFjY2VwdGFibGVcXG4ra2V5cmluZywgcmVzdHJpY3Qgd2hpY2ggdG9rZW4vY3JlZGVudGlhbHMgbWF5IGxvYWQgQlBGLCBhcHBseSBwZXItcHJvZ3JhbS10eXBlXFxuK3J1bGVzLCBvciBhdWRpdCBldmVyeSBsb2FkIGF0dGVtcHQgdGhhdCBtYWtlcyBpdCBwYXN0IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gLVxcbithdHRlbXB0cyBmYWlsaW5nIHRoZSBzaWduYXR1cmUgb3IgdGhlIG1ldGFkYXRhIGJpbmRpbmcgYWJvcnQgYmVmb3JlIHRoaXMgaG9va1xcbitmaXJlcy4gSXQgaXMgdGhlIHByaW1hcnkgZGVueSBwb2ludC5cXG4rXFxuK09uZSBzdWJ0bGV0eTogdGhpcyBob29rIHJ1bnMgKmJlZm9yZSogdGhlIHZlcmlmaWVyIGZpbmlzaGVzIGl0cyB3b3JrLCBzb1xcbitgYEJQRl9TSUdfVkVSSUZJRURgYCAqaGVyZSogbWVhbnMgb25seSBcXFwidmFsaWRseSBzaWduZWRcXFwiIC0gbm90IFxcXCJsb2FkZWRcXFwiLiBBbGxvd2luZ1xcbithIGxvYWQgYXQgdGhpcyBwb2ludCBsZXRzIGl0ICpwcm9jZWVkKjsgaXQgZG9lcyBub3QgZ3VhcmFudGVlIHRoZSBwcm9ncmFtIHdpbGxcXG4rbG9hZC4gQSB2YWxpZGx5IHNpZ25lZCBwcm9ncmFtIGNhbiBzdGlsbCBiZSByZWplY3RlZCBhZnRlcndhcmRzIG9uIHR3b1xcbitpbmRlcGVuZGVudCBncm91bmRzOiB0aGUgdmVyaWZpZXIgbWF5IHJlamVjdCBpdCBsaWtlIGFueSBvdGhlciBwcm9ncmFtICh1bnNhZmVcXG4rbWVtb3J5IGFjY2VzcywgYmFkIGNvbnRyb2wgZmxvdywgcmVzb3VyY2UgbGltaXRzLCAuLi4pLCBhbmQgdGhlIGtlcm5lbCBzZXBhcmF0ZWx5XFxuK3JlZnVzZXMgLSBhcyB0aGUgdmVyaWZpZXIgcmVzb2x2ZXMgaW5zdHJ1Y3Rpb25zIGFuZCBiaW5kcyBlYWNoIG9iamVjdCAtIGFueSBtYXBcXG4rdGhlIHNpZ25hdHVyZSBkb2VzIG5vdCBjb3ZlciBvciBhbnkgQlRGIGF0IGFsbCwgcmVnYXJkbGVzcyBvZiB3aGF0IHRoaXMgaG9va1xcbityZXR1cm5lZC4gT25seSBhZnRlciB0aGUgcHJvZ3JhbSBoYXMgZnVsbHkgbG9hZGVkLCBhdCB0aGUgbmV4dCBob29rXFxuKyhgYHNlY3VyaXR5X2JwZl9wcm9nKClgYCksIGRvZXMgYGBCUEZfU0lHX1ZFUklGSUVEYGAgY2FycnkgaXRzIGZ1bGwgbWVhbmluZzpcXG4rdmFsaWRseSBzaWduZWQgKmFuZCogZnVsbHkgdmVyaWZpZWQuXFxuK1xcbitBIG1vcmUgcmVhbGlzdGljIGFkbWlzc2lvbiBwb2xpY3kgdGhhbiBcXFwiaXMgaXQgc2lnbmVkIGF0IGFsbFxcXCI6IGFjY2VwdCBwcm9ncmFtc1xcbitzaWduZWQgYnkgYSBzeXN0ZW0ga2V5cmluZywgYWNjZXB0IGEgdXNlci1rZXlyaW5nIHNpZ25hdHVyZSBvbmx5IGlmIHRoZVxcbitrZXkva2V5cmluZyBpdCB3YXMgdmVyaWZpZWQgYWdhaW5zdCBpcyBvbiBhbiBleHBsaWNpdCBhbGxvd2xpc3QsIGFuZCBlbWl0IGFcXG4rdGFtcGVyLWV2aWRlbnQgcmVjb3JkIG9mIGV2ZXJ5IGRlY2lzaW9uIHNvIHRoYXQgZXZlbiBkZW5pZWQgYXR0ZW1wdHMgYXJlXFxuK2F1ZGl0YWJsZS4gKElsbHVzdHJhdGl2ZSAtIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pXFxuK1xcbisuLiBjb2RlLWJsb2NrOjogY1xcbitcXG4rICAgIC8qIFNlcmlhbHMgb2YgdXNlciBrZXlzL2tleXJpbmdzIHdlIGFkZGl0aW9uYWxseSB0cnVzdC4gKi9cXG4rICAgIHN0cnVjdCB7XFxuKyAgICAgICAgICAgIF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7XFxuKyAgICAgICAgICAgIF9fdHlwZShrZXksIF9fczMyKTsgICAgICAgICAgICAgLyoga2V5cmluZ19zZXJpYWwgKi9cXG4rICAgICAgICAgICAgX190eXBlKHZhbHVlLCBfX3U4KTtcXG4rICAgICAgICAgICAgX191aW50KG1heF9lbnRyaWVzLCA2NCk7XFxuKyAgICB9IHRydXN0ZWRfdXNlcl9rZXlzIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuKyAgICAvKiBBdWRpdCBzdHJlYW0gY29uc3VtZWQgYnkgYSB1c2Vyc3BhY2UgbG9nZ2VyLiAqL1xcbisgICAgc3RydWN0IHtcXG4rICAgICAgICAgICAgX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9SSU5HQlVGKTtcXG4rICAgICAgICAgICAgX191aW50KG1heF9lbnRyaWVzLCAxIFxcdTAwM2NcXHUwMDNjIDE2KTtcXG4rICAgIH0gYXVkaXQgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rICAgIHN0cnVjdCBkZWNpc2lvbiB7IF9fdTMyIHByb2dfdHlwZSwgdmVyZGljdCwga3R5cGU7IF9fczMyIHNlcmlhbCwgcmV0OyB9O1xcbitcXG4rICAgIFNFQyhcXFwibHNtL2JwZl9wcm9nX2xvYWRcXFwiKVxcbisgICAgaW50IEJQRl9QUk9HKGFkbWl0LCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyLFxcbisgICAgICAgICAgICAgICAgIHN0cnVjdCBicGZfdG9rZW4gKnRva2VuLCBib29sIGtlcm5lbClcXG4rICAgIHtcXG4rICAgICAgICAgICAgX191MzIgdmVyZGljdCA9IHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLnZlcmRpY3Q7XFxuKyAgICAgICAgICAgIF9fdTMyIGt0eXBlICAgPSBwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZXNpZy5rZXlyaW5nX3R5cGU7XFxuKyAgICAgICAgICAgIF9fczMyIHNlcmlhbCAgPSBwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZXNpZy5rZXlyaW5nX3NlcmlhbDtcXG4rICAgICAgICAgICAgc3RydWN0IGRlY2lzaW9uICpkO1xcbisgICAgICAgICAgICBpbnQgcmV0ID0gMDtcXG4rXFxuKyAgICAgICAgICAgIGlmIChrZXJuZWwpXFxuKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiB0cnVzdCBpbi1rZXJuZWwgbG9hZHMgKi9cXG4rXFxuKyAgICAgICAgICAgIGlmICh2ZXJkaWN0ICE9IEJQRl9TSUdfVkVSSUZJRUQpXFxuKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGJlIHZhbGlkbHkgc2lnbmVkICovXFxuKyAgICAgICAgICAgIGVsc2UgaWYgKGt0eXBlID09IEJQRl9TSUdfS0VZUklOR19VU0VSIFxcdTAwMjZcXHUwMDI2XFxuKyAgICAgICAgICAgICAgICAgICAgICFicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZ0cnVzdGVkX3VzZXJfa2V5cywgXFx1MDAyNnNlcmlhbCkpXFxuKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAvKiBrZXkva2V5cmluZyBub3QgYWxsb3dsaXN0ZWQgKi9cXG4rXFxuKyAgICAgICAgICAgIGQgPSBicGZfcmluZ2J1Zl9yZXNlcnZlKFxcdTAwMjZhdWRpdCwgc2l6ZW9mKCpkKSwgMCk7XFxuKyAgICAgICAgICAgIGlmIChkKSB7XFxuKyAgICAgICAgICAgICAgICAgICAgZC1cXHUwMDNlcHJvZ190eXBlID0gYXR0ci1cXHUwMDNlcHJvZ190eXBlO1xcbisgICAgICAgICAgICAgICAgICAgIGQtXFx1MDAzZXZlcmRpY3QgPSB2ZXJkaWN0O1xcbisgICAgICAgICAgICAgICAgICAgIGQtXFx1MDAzZWt0eXBlID0ga3R5cGU7XFxuKyAgICAgICAgICAgICAgICAgICAgZC1cXHUwMDNlc2VyaWFsID0gc2VyaWFsO1xcbisgICAgICAgICAgICAgICAgICAgIGQtXFx1MDAzZXJldCA9IHJldDtcXG4rICAgICAgICAgICAgICAgICAgICBicGZfcmluZ2J1Zl9zdWJtaXQoZCwgMCk7ICAgICAgIC8qIHJlY29yZCBhbGxvdyAqYW5kKiBkZW55ICovXFxuKyAgICAgICAgICAgIH1cXG4rICAgICAgICAgICAgcmV0dXJuIHJldDtcXG4rICAgIH1cXG4rXFxuK09ic2VydmluZyBhIHZlcmlmaWVkIGxvYWQ6IGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgXFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuK1xcbitUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gc2VwYXJhdGUgXFxcIm1ldGFkYXRhIGF0dGVzdGVkXFxcIiBob29rLiBUaGUgY292ZXJhZ2UgY2hlY2tcXG4rYWJvdmUgaXMgZW5mb3JjZWQgYnkgdGhlIGtlcm5lbCB1bmNvbmRpdGlvbmFsbHksIHNvIGEgc2lnbmVkIGxvYWRlciB0aGF0IGZhaWxzXFxuK3RvIGNvdmVyIGl0cyBtZXRhZGF0YSBuZXZlciBsb2FkcyBhbmQgYW4gTFNNIG5ldmVyIGhhcyB0byByZS1lc3RhYmxpc2ggdGhhdFxcbitmYWN0LiBUbyAqYWN0IG9uKiBhIHByb2dyYW0gdGhhdCBoYXMgc3VjY2Vzc2Z1bGx5IGFuZCBmdWxseSBsb2FkZWQsIHVzZSB0aGVcXG4rZXhpc3RpbmcgYGBzZWN1cml0eV9icGZfcHJvZygpYGAgaG9vayAoYGBsc20vYnBmX3Byb2dgYCksIHdoaWNoIGZpcmVzIGZyb21cXG4rYGBicGZfcHJvZ19uZXdfZmQoKWBgIC0gYWZ0ZXIgdGhlIHZlcmlmaWVyLCBhZnRlciB0aGUgY292ZXJhZ2UgY2hlY2ssIGFuZCBhZnRlclxcbitgYGJwZl9wcm9nX2FsbG9jX2lkKClgYC4gUmVsYXRpdmUgdG8gdGhlIGFkbWlzc2lvbiBob29rIHRoaXMgcG9pbnQgaXMgc3RyaWN0bHlcXG4rbGF0ZXIgYW5kIHN0cm9uZ2VyOlxcbitcXG4rLSB0aGUgcHJvZ3JhbSBoYXMgYW4gaWQgKGBgcHJvZy1cXHUwMDNlYXV4LVxcdTAwM2VpZGBgKSwgc28gaXQgY2FuIGJlIHJlY29yZGVkIG9yIGNvcnJlbGF0ZWRcXG4rICB3aXRoIGxhdGVyIGV2ZW50cztcXG4rLSBgYHZlcmRpY3QgPT0gQlBGX1NJR19WRVJJRklFRGBgICpoZXJlKiBtZWFucyAqKmZ1bGx5KiogdmVyaWZpZWQgLSBhIHByb2dyYW1cXG4rICB0aGF0IHVzZWQgYSBtYXAgdGhlIHNpZ25hdHVyZSBkb2VzIG5vdCBjb3ZlciB3YXMgYWxyZWFkeSByZWplY3RlZCwgc28gaXQgY2Fubm90XFxuKyAgcmVhY2ggdGhpcyBwb2ludDtcXG4rLSBpdCBvYnNlcnZlcyBvbmx5IHByb2dyYW1zIHRoYXQgYWN0dWFsbHkgbG9hZGVkOyBhIGZhaWxlZCBsb2FkIG5ldmVyIG1pbnRzIGFuXFxuKyAgZmQsIHNvIGl0IG5ldmVyIHJlYWNoZXMgdGhpcyBob29rLlxcbitcXG4rSXQgdGFrZXMgb25seSB0aGUgYGBwcm9nYGAgYW5kIGEgbm9uLXplcm8gcmV0dXJuIHN0aWxsIGFib3J0cyAodGhlIGZkIGlzIG5vdFxcbitoYW5kZWQgb3V0KSwgc28gaXQgY2FuIHZldG8gYXMgd2VsbCBhcyBvYnNlcnZlLiBPbmUgd3JpbmtsZTogaXQgYWxzbyBmaXJlcyBvblxcbitvdGhlciBwYXRocyB0aGF0IG1pbnQgYSBuZXcgcHJvZ3JhbSBmZCAtIG5vdGFibHkgYGBicGZfcHJvZ19nZXRfZmRfYnlfaWQoKWBgIC1cXG4rbm90IGp1c3Qgb24gYSBmcmVzaCBsb2FkLiBCZWNhdXNlIHRoZSBwcm9ncmFtIGFscmVhZHkgaGFzIGl0cyBpZCBoZXJlLCBhbiBMU01cXG4rY2FuIHRlbGwgdGhlIHR3byBhcGFydCB3aXRoIGEgc21hbGwgaGFzaCBtYXA6IHRoZSAqZmlyc3QqIHRpbWUgYW4gaWQgaXMgc2VlbiBpc1xcbit0aGUgbG9hZDsgYSBsYXRlciBzaWdodGluZyBvZiB0aGUgc2FtZSBpZCBpcyBqdXN0IGFub3RoZXIgZmQgdG8gYSBwcm9ncmFtIHRoYXRcXG4rYWxyZWFkeSBleGlzdHMuXFxuK1xcbitUbyBib3VuZCB0aGUgbWFwIGFuZCBsZXQgYSByZXVzZWQgaWQgcmVhZCBhcyBhIGZyZXNoIGxvYWQsIHRoaXMgY2FuIGJlIHBhaXJlZFxcbit3aXRoIGBgc2VjdXJpdHlfYnBmX3Byb2dfZnJlZSgpYGAgKGBgbHNtL2JwZl9wcm9nX2ZyZWVgYCksIHdoaWNoIGRlbGV0ZXMgdGhlXFxuK2VudHJ5IG9uIHRlYXJkb3duIC0ga2V5ZWQgYnkgdGhlIHNhbWUgYGBwcm9nYGAgcG9pbnRlciwgc2luY2VcXG4rYGBicGZfcHJvZ19mcmVlX2lkKClgYCBoYXMgYWxyZWFkeSBjbGVhcmVkIGBgcHJvZy1cXHUwMDNlYXV4LVxcdTAwM2VpZGBgIHRvIGBgMGBgIGJ5IHRoZSB0aW1lXFxuK3RoYXQgaG9vayBydW5zLiAoSWxsdXN0cmF0aXZlIC0gcHJpdmlsZWdlZCBMU00sIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pXFxuK1xcbisuLiBjb2RlLWJsb2NrOjogY1xcbitcXG4rICAgIHN0cnVjdCByZWMgeyBfX3UzMiBpZCwga3R5cGU7IF9fczMyIHNlcmlhbDsgfTtcXG4rXFxuKyAgICBzdHJ1Y3Qge1xcbisgICAgICAgICAgICBfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0hBU0gpO1xcbisgICAgICAgICAgICBfX3R5cGUoa2V5LCBfX3U2NCk7ICAgICAgICAgICAgIC8qIHN0cnVjdCBicGZfcHJvZyAqIC0tIHN0YWJsZSBpZCAqL1xcbisgICAgICAgICAgICBfX3R5cGUodmFsdWUsIHN0cnVjdCByZWMpO1xcbisgICAgICAgICAgICBfX3VpbnQobWF4X2VudHJpZXMsIDQwOTYpO1xcbisgICAgfSBsaXZlIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuKyAgICBTRUMoXFxcImxzbS9icGZfcHJvZ1xcXCIpICAgICAgICAgICAgLyogZmlyZXMgYWZ0ZXIgbG9hZCBhbmQgb24gZXZlcnkgbGF0ZXIgZmQgKi9cXG4rICAgIGludCBCUEZfUFJPRyhvYnNlcnZlLCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpXFxuKyAgICB7XFxuKyAgICAgICAgICAgIF9fdTY0IGtleSA9IChfX3U2NCkodW5zaWduZWQgbG9uZylwcm9nO1xcbisgICAgICAgICAgICBzdHJ1Y3QgcmVjIHI7XFxuK1xcbisgICAgICAgICAgICBpZiAocHJvZy1cXHUwMDNlYXV4LVxcdTAwM2VzaWcudmVyZGljdCAhPSBCUEZfU0lHX1ZFUklGSUVEKVxcbisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xcbisgICAgICAgICAgICBpZiAoYnBmX21hcF9sb29rdXBfZWxlbShcXHUwMDI2bGl2ZSwgXFx1MDAyNmtleSkpXFxuKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgLyogc2VlbiBiZWZvcmU6IGEgbGF0ZXIgZmQsIG5vdCBhIGxvYWQgKi9cXG4rXFxuKyAgICAgICAgICAgIC8qIEZpcnN0IHNpZ2h0aW5nID09IHRoaXMgcHJvZ3JhbSBqdXN0IGxvYWRlZDsgaWQgaXMgdmFsaWQgaGVyZS4gKi9cXG4rICAgICAgICAgICAgci5pZCAgICAgPSBwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZWlkO1xcbisgICAgICAgICAgICByLmt0eXBlICA9IHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLmtleXJpbmdfdHlwZTtcXG4rICAgICAgICAgICAgci5zZXJpYWwgPSBwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZXNpZy5rZXlyaW5nX3NlcmlhbDtcXG4rICAgICAgICAgICAgYnBmX21hcF91cGRhdGVfZWxlbShcXHUwMDI2bGl2ZSwgXFx1MDAyNmtleSwgXFx1MDAyNnIsIEJQRl9OT0VYSVNUKTtcXG4rICAgICAgICAgICAgLyogLi4uIG5ld2x5LWxvYWRlZCB2ZXJpZmllZC1wcm9ncmFtIGFjdGlvbiwgZS5nLiByZWNvcmQgci5pZCAuLi4gKi9cXG4rICAgICAgICAgICAgcmV0dXJuIDA7XFxuKyAgICB9XFxuK1xcbitQdXR0aW5nIHRoZW0gdG9nZXRoZXI6IHRvICpyZXF1aXJlKiB2ZXJpZmllZCBCUEYsIGRlbnkgYXQgdGhlIGFkbWlzc2lvbiBob29rXFxuK3VubGVzcyB0aGUgdmVyZGljdCBpcyBgYEJQRl9TSUdfVkVSSUZJRURgYCAoYW5kLCBpZiBkZXNpcmVkLCByZXN0cmljdCB0aGVcXG4ra2V5cmluZykuIFRoZSBrZXJuZWwgdGhlbiBndWFyYW50ZWVzIHRoYXQgYW55IHByb2dyYW0gd2hpY2ggYWN0dWFsbHkgbG9hZHMgd2l0aFxcbit0aGF0IHZlcmRpY3QgY292ZXJlZCBhbGwgb2YgaXRzIGV4Y2x1c2l2ZSBtYXBzLCByZWplY3RpbmcgYW55IHRoYXQgZGlkIG5vdCAtIHNvXFxuK2EgZGVueS1ieS1kZWZhdWx0IGFkbWlzc2lvbiBwb2xpY3kgbmVlZHMgbm8gc2Vjb25kIGVuZm9yY2VtZW50IHBvaW50LiBVc2VcXG4rYGBzZWN1cml0eV9icGZfcHJvZygpYGAgdG8gcmVjb3JkIG9yIGZpbmFsbHkgZ2F0ZSB0aGUgdmVyaWZpZWQgcHJvZ3JhbXMgb25jZVxcbit0aGV5IGNhcnJ5IGFuIGlkLiBUaGUgYGB2ZXJkaWN0YGAsIGBga2V5cmluZ190eXBlYGAgYW5kIGBga2V5cmluZ19zZXJpYWxgYCBmaWVsZHNcXG4rbGV0IGEgcG9saWN5IGRpc3Rpbmd1aXNoLCBmb3IgZXhhbXBsZSwgXFxcInZlcmlmaWVkIGFuZCBzaWduZWQgYnkgYSBidWlsdGluIGtleVxcXCJcXG4rZnJvbSBcXFwidmVyaWZpZWQgYnkgYSB1c2VyIGtleVxcXCIuIEEgcG9saWN5IExTTSBzdWNoIGFzIElQRSBjb3VsZCBjb25zdW1lIHRoZSBzYW1lXFxuK2hvb2tzIHRvIGVuZm9yY2Ugc3lzdGVtIHBvbGljeSB3aXRob3V0IHdyaXRpbmcgYW55IEJQRiwgdGhvdWdoIG5vbmUgaW1wbGVtZW50c1xcbit0aGlzIHRvZGF5LlxcbitcXG4rS2V5cmluZ3NcXG4rPT09PT09PT1cXG4rXFxuK2Bga2V5cmluZ19pZGBgIHNlbGVjdHMgdGhlIHRydXN0ZWQga2V5cmluZyB0aGUgUEtDUyM3IHNpZ25hdHVyZSBpcyB2ZXJpZmllZFxcbithZ2FpbnN0LiBUaGUgd2VsbC1rbm93biBpZHMgYGAwYGAgKGJ1aWx0aW4pLCBgYFZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkdgYFxcbithbmQgYGBWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkdgYCBzZWxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgc3lzdGVtIGtleXJpbmdzO1xcbithbnkgb3RoZXIgdmFsdWUgaXMgdHJlYXRlZCBhcyB0aGUgc2VyaWFsIG9mIGEgdXNlci9zZXNzaW9uIGtleSBvciBrZXlyaW5nLlxcbitUaGUga2V5cmluZyBpcyBsb29rZWQgdXAgZmlyc3QsIGJlZm9yZSB0aGUgc2lnbmF0dXJlIGJ5dGVzIGFyZSBleGFtaW5lZCwgc28gYVxcbitzaWduYXR1cmUgbmFtaW5nIGEgbm9uLWV4aXN0ZW50IGtleXJpbmcgaXMgcmVqZWN0ZWQgdXAgZnJvbnQsIGFuZCBhIGZhaWxlZFxcbit2ZXJpZmljYXRpb24gYWJvcnRzIHRoZSBsb2FkIC0gc28gYSBwcm9ncmFtIHRoYXQgbG9hZHMgc3VjY2Vzc2Z1bGx5IHdpdGggYVxcbitzaWduYXR1cmUgYWx3YXlzIGhhcyBjb25zaXN0ZW50IGtleXJpbmcgZmllbGRzIHJlY29yZGVkLlxcbitcXG4rVHdvIGZpZWxkcyBhcmUgcmVjb3JkZWQgaW4gYGBwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZXNpZ2BgIGZvciBhbiBMU00gdG8gaW5zcGVjdDpcXG4rXFxuK2Bga2V5cmluZ190eXBlYGAgKGBgZW51bSBicGZfc2lnX2tleXJpbmdgYClcXG4rICAgIENsYXNzaWZpZWQgcHVyZWx5IGZyb20gYGBrZXlyaW5nX2lkYGAgd2hlbmV2ZXIgdGhlIHByb2dyYW0gaXMgc2lnbmVkOlxcbisgICAgYGBCUEZfU0lHX0tFWVJJTkdfQlVJTFRJTmBgLCBgYF9TRUNPTkRBUllgYCwgYGBfUExBVEZPUk1gYCBmb3IgdGhlIHN5c3RlbVxcbisgICAga2V5cmluZ3MsIG9yIGBgX1VTRVJgYCBmb3IgYSB1c2VyL3Nlc3Npb24ga2V5cmluZy4gSXQgaXNcXG4rICAgIGBgQlBGX1NJR19LRVlSSU5HX05PTkVgYCBmb3IgYW4gdW5zaWduZWQgcHJvZ3JhbS5cXG4rXFxuK2Bga2V5cmluZ19zZXJpYWxgYCAoYGBzMzJgYClcXG4rICAgIFNldCAqKm9ubHkqKiBvbiBhIHN1Y2Nlc3NmdWwgdmVyaWZpY2F0aW9uLCB0byB0aGUgc2VyaWFsIG9mIHRoZVxcbisgICAgKip1c2VyL3Nlc3Npb24ga2V5IG9yIGtleXJpbmcqKiB0aGF0IGBga2V5cmluZ19pZGBgIHJlc29sdmVkIHRvIC0gdGhlXFxuKyAgICBvYmplY3QgdGhlIHNpZ25hdHVyZSB3YXMgdmVyaWZpZWQgYWdhaW5zdCwgbm90IHRoZSBpbmRpdmlkdWFsIGFzeW1tZXRyaWNcXG4rICAgIGtleSBpbnNpZGUgaXQgdGhhdCBtYXRjaGVkIHRoZSBzaWduZXIuIFBhc3NpbmdcXG4rICAgIGBgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HYGAsIGZvciBleGFtcGxlLCByZWNvcmRzIHRoZSBzZXNzaW9uIGtleXJpbmcnc1xcbisgICAgc2VyaWFsLiBUaGUgc3lzdGVtIGtleXJpbmdzIGFyZSB0cnVzdGVkIGFzIGEgd2hvbGUgYW5kIGV4cG9zZSBubyBzZXJpYWxcXG4rICAgIGhlcmUsIHNvIHRoZSBzZXJpYWwgaXMgYGAwYGAgZm9yIGJ1aWx0aW4sIHNlY29uZGFyeSBhbmQgcGxhdGZvcm1cXG4rICAgIHNpZ25hdHVyZXMsIGFuZCBgYDBgYCBmb3IgdW5zaWduZWQgcHJvZ3JhbXMuIEluIG90aGVyIHdvcmRzLCBhIG5vbi16ZXJvXFxuKyAgICBgYGtleXJpbmdfc2VyaWFsYGAgaXMgZXhhY3RseSBcXFwidmVyaWZpZWQgYWdhaW5zdCB0aGUgdXNlciBrZXkva2V5cmluZyB3aXRoXFxuKyAgICB0aGlzIHNlcmlhbFxcXCIuXFxuK1xcbisuLiBsaXN0LXRhYmxlOjpcXG4rICAgOmhlYWRlci1yb3dzOiAxXFxuK1xcbisgICAqIC0gYGBrZXlyaW5nX2lkYGBcXG4rICAgICAtIGBga2V5cmluZ190eXBlYGBcXG4rICAgICAtIGBga2V5cmluZ19zZXJpYWxgYFxcbisgICAqIC0gKG5vIHNpZ25hdHVyZSlcXG4rICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX05PTkVgYFxcbisgICAgIC0gYGAwYGBcXG4rICAgKiAtIGBgMGBgXFxuKyAgICAgLSBgYEJQRl9TSUdfS0VZUklOR19CVUlMVElOYGBcXG4rICAgICAtIGBgMGBgXFxuKyAgICogLSBgYFZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkdgYFxcbisgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfU0VDT05EQVJZYGBcXG4rICAgICAtIGBgMGBgXFxuKyAgICogLSBgYFZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklOR2BgXFxuKyAgICAgLSBgYEJQRl9TSUdfS0VZUklOR19QTEFURk9STWBgXFxuKyAgICAgLSBgYDBgYFxcbisgICAqIC0gb3RoZXIgKGEgdXNlci9zZXNzaW9uIGtleSBzZXJpYWwpXFxuKyAgICAgLSBgYEJQRl9TSUdfS0VZUklOR19VU0VSYGBcXG4rICAgICAtIHNlcmlhbCBvZiB0aGUgcmVzb2x2ZWQga2V5L2tleXJpbmdcXG4rXFxuK1Byb2R1Y2luZyBhIHNpZ25lZCBvYmplY3RcXG4rPT09PT09PT09PT09PT09PT09PT09PT09PT1cXG4rXFxuK2BgYnBmdG9vbGBgIGdlbmVyYXRlcyBhbmQgc2lnbnMgYSBsaWdodCBza2VsZXRvbiBpbiBvbmUgc3RlcDo6XFxuK1xcbisgICAgYnBmdG9vbCBnZW4gc2tlbGV0b24gLUwgLVMgLWsgXFx1MDAzY3ByaXZhdGVfa2V5LnBlbVxcdTAwM2UgLWkgXFx1MDAzY2NlcnRpZmljYXRlLng1MDlcXHUwMDNlIFxcXFxcXG4rICAgICAgICAgICAgb2JqLmJwZi5vIFxcdTAwM2Ugb2JqLmxza2VsLmhcXG4rXFxuK2BgLUxgYCBzZWxlY3RzIHRoZSBsaWdodC1za2VsZXRvbiAoYGBnZW5fbG9hZGVyYGApIGJhY2tlbmQgYW5kIGBgLVNgYCBlbmFibGVzXFxuK3NpZ25pbmc7IGBgLWtgYCBhbmQgYGAtaWBgIHN1cHBseSB0aGUgc2lnbmluZyBrZXkgYW5kIGl0cyBYLjUwOSBjZXJ0aWZpY2F0ZS5cXG4rYGBicGZ0b29sYGAgc2lnbnMgYGBpbnNucyB8fCBtZXRhZGF0YWBgIC0gdGhlIGV4YWN0IGJ5dGVzIHRoZSBrZXJuZWxcXG4rcmVjb25zdHJ1Y3RzIC0gYW5kIGFsc28gY29tcHV0ZXMgYGBleGNsX3Byb2dfaGFzaGBgIGFzIHRoZSBkaWdlc3Qgb2YgdGhlIGxvYWRlclxcbitpbnN0cnVjdGlvbnMgc28gdGhlIG1ldGFkYXRhIG1hcCBjYW4gYmUgYm91bmQgdG8gdGhlIGxvYWRlci4gVGhlIHNpZ25hdHVyZSBhbmRcXG4raGFzaCBhcmUgZW1iZWRkZWQgaW4gdGhlIGdlbmVyYXRlZCBoZWFkZXI7IHRoZSBjZXJ0aWZpY2F0ZSBpcyB1c2VkIG9ubHkgZm9yXFxuK3NpZ25pbmcgYW5kIGlzIG5vdCBpbmNsdWRlZC4gTG9hZGluZyB0aGUgc2tlbGV0b24gcGVyZm9ybXMgdGhlXFxuK2NyZWF0ZS9wb3B1bGF0ZS9mcmVlemUvbG9hZCBzZXF1ZW5jZSBkZXNjcmliZWQgYWJvdmUuXFxuK1xcbitBdCBydW50aW1lIHRoZSB0cnVzdGVkIHB1YmxpYyBrZXkgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBjaG9zZW4ga2V5cmluZyAoZm9yXFxuK2V4YW1wbGUgYWRkZWQgdG8gdGhlIHNlc3Npb24ga2V5cmluZywgb3IgYnVpbHQgaW50byB0aGUga2VybmVsJ3MgYnVpbHRpbiB0cnVzdGVkXFxuK2tleXJpbmcpIGZvciB2ZXJpZmljYXRpb24gdG8gc3VjY2VlZC5cXG4rXFxuK1VBUEkgcmVmZXJlbmNlXFxuKz09PT09PT09PT09PT09XFxuK1xcbitgYEJQRl9QUk9HX0xPQURgYCAoYGB1bmlvbiBicGZfYXR0cmBgKTpcXG4rXFxuK2Bgc2lnbmF0dXJlYGAsIGBgc2lnbmF0dXJlX3NpemVgYFxcbisgICAgUG9pbnRlciB0byBhbmQgbGVuZ3RoIG9mIHRoZSBQS0NTIzcgc2lnbmF0dXJlIGJsb2IuXFxuK1xcbitgYGtleXJpbmdfaWRgYFxcbisgICAgVHJ1c3RlZCBrZXlyaW5nIHNlbGVjdG9yIChzZWUgYEtleXJpbmdzYF8pLlxcbitcXG4rYGBmZF9hcnJheWBgLCBgYGZkX2FycmF5X2NudGBgXFxuKyAgICBBcnJheSBvZiBtYXAgZmlsZSBkZXNjcmlwdG9ycyBib3VuZCB0byB0aGUgcHJvZ3JhbS4gYGBmZF9hcnJheV9jbnRgYCBtdXN0IGJlXFxuKyAgICBzZXQgZm9yIHRoZSBrZXJuZWwgdG8gc2NhbiB0aGUgYXJyYXkuIFdoZW4gYSBzaWduYXR1cmUgaXMgcHJlc2VudCwgZXZlcnkgbWFwXFxuKyAgICBpbiB0aGUgYXJyYXkgbXVzdCBiZSBleGNsdXNpdmU7IGl0cyBmcm96ZW4gY29udGVudHMgYXJlIGZvbGRlZCBpbnRvIHRoZVxcbisgICAgdmVyaWZpZWQgYnVmZmVyLCBhbmQgYSBub24tZXhjbHVzaXZlIGVudHJ5IGlzIHJlamVjdGVkLlxcbitcXG4rYGBCUEZfTUFQX0NSRUFURWBgIChgYHVuaW9uIGJwZl9hdHRyYGApOlxcbitcXG4rYGBleGNsX3Byb2dfaGFzaGBgLCBgYGV4Y2xfcHJvZ19oYXNoX3NpemVgYFxcbisgICAgU0hBLTI1NiBkaWdlc3Qgb2YgdGhlIHByb2dyYW0gcGVybWl0dGVkIHRvIGFjY2VzcyB0aGlzIChleGNsdXNpdmUpIG1hcC4gVGhpc1xcbisgICAgYmluZHMgdGhlIG1ldGFkYXRhIG1hcCB0byB0aGUgbG9hZGVyOyBpdCBpcyBub3QgYSBoYXNoIG9mIHRoZSBtYXAgKmNvbnRlbnQqLlxcbisgICAgVGhlIG1hcCBjb250ZW50IGlzIG5vdCBoYXNoZWQgc2VwYXJhdGVseSBhdCBhbGwgLSBpdCBpcyBjb3ZlcmVkLCBhcyBieXRlcyxcXG4rICAgIGJ5IHRoZSBwcm9ncmFtIHNpZ25hdHVyZS5cXG4rXFxuK05vdGVzIGFuZCBsaW1pdGF0aW9uc1xcbis9PT09PT09PT09PT09PT09PT09PT09XFxuK1xcbistIFRoZSBpbnN0cnVjdGlvbnMgcGx1cyBmb2xkZWQgbWV0YWRhdGEgYXJlIHZlcmlmaWVkIGFzIG9uZSBgYGJwZl9keW5wdHJgYCxcXG4rICB3aGljaCBib3VuZHMgdGhlIGNvbWJpbmVkIHNpemUgKGN1cnJlbnRseSB+MTYgTWlCKTsgdmVyeSBsYXJnZSBvYmplY3RzIGNhblxcbisgIGV4Y2VlZCBpdC5cXG4rLSBUaGUgbWV0YWRhdGEgY29udGFpbmVyIGlzIGEgc2luZ2xlLWVsZW1lbnQgYXJyYXkgbWFwLCBhY2Nlc3NlZCB0aHJvdWdoXFxuKyAgYGBtYXBfZGlyZWN0X3ZhbHVlX2FkZHJgYC5cXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGYuaCBiL2luY2x1ZGUvbGludXgvYnBmLmhcXG5pbmRleCBiYTA5Nzk1ZTBiZmRiNy4uMmUwZjEyZmI0Y2VhOGIgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9icGYuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvYnBmLmhcXG5AQCAtMjk5LDcgKzI5OSw2IEBAIHN0cnVjdCBicGZfbWFwX293bmVyIHtcXG4gXFxuIHN0cnVjdCBicGZfbWFwIHtcXG4gXFx0dTggc2hhW1NIQTI1Nl9ESUdFU1RfU0laRV07XFxuLVxcdHUzMiBleGNsO1xcbiBcXHRjb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgKm9wcztcXG4gXFx0c3RydWN0IGJwZl9tYXAgKmlubmVyX21hcF9tZXRhO1xcbiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmggYi9pbmNsdWRlL2xpbnV4L2JwZl92ZXJpZmllci5oXFxuaW5kZXggNzZiOGI3NjI3YTEwODUuLjMxN2U5OWI5YWNjMGE0IDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2JwZl92ZXJpZmllci5oXFxuQEAgLTg5OCw2ICs4OTgsMTQgQEAgc3RydWN0IGJwZl9zY2NfaW5mbyB7XFxuIFxcbiBzdHJ1Y3QgYnBmX2xpdmVuZXNzO1xcbiBcXG4rc3RydWN0IGJwZl9mZF9hcnJheSB7XFxuK1xcdHVuaW9uIHtcXG4rXFx0XFx0c3RydWN0IGJwZl9tYXAgKm1hcDtcXG4rXFx0XFx0c3RydWN0IGJ0ZiAqYnRmO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHZhbDtcXG4rXFx0fTtcXG4rfTtcXG4rXFxuIC8qIHNpbmdsZSBjb250YWluZXIgZm9yIGFsbCBzdHJ1Y3RzXFxuICAqIG9uZSB2ZXJpZmllcl9lbnYgcGVyIGJwZl9jaGVjaygpIGNhbGxcXG4gICovXFxuQEAgLTkzOSw2ICs5NDcsNyBAQCBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiB7XFxuIFxcdGJvb2wgYnlwYXNzX3NwZWNfdjQ7XFxuIFxcdGJvb2wgc2Vlbl9kaXJlY3Rfd3JpdGU7XFxuIFxcdGJvb2wgc2Vlbl9leGNlcHRpb247XFxuK1xcdGJvb2wgc2lnbmF0dXJlO1xcbiBcXHRzdHJ1Y3QgYnBmX2luc25fYXV4X2RhdGEgKmluc25fYXV4X2RhdGE7IC8qIGFycmF5IG9mIHBlci1pbnNuIHN0YXRlICovXFxuIFxcdGNvbnN0IHN0cnVjdCBicGZfbGluZV9pbmZvICpwcmV2X2xpbmZvO1xcbiBcXHRzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2xvZyBsb2c7XFxuQEAgLTk4OSw3ICs5OTgsMTkgQEAgc3RydWN0IGJwZl92ZXJpZmllcl9lbnYge1xcbiBcXHR1MzIgZnJlZV9saXN0X3NpemU7XFxuIFxcdHUzMiBleHBsb3JlZF9zdGF0ZXNfc2l6ZTtcXG4gXFx0dTMyIG51bV9iYWNrZWRnZXM7XFxuLVxcdGJwZnB0cl90IGZkX2FycmF5O1xcbitcXHQvKlxcbitcXHQgKiBUaGUgcHJvZ3JhbSdzIGZkX2FycmF5IGNvbWVzIGluIHR3byBzaGFwZXMsIHRvbGQgYXBhcnQgYnkgd2hldGhlclxcbitcXHQgKiB0aGUgY2FsbGVyIHBhc3NlZCBmZF9hcnJheV9jbnQuIFRoZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZTpcXG4rXFx0ICogIC0gY29udGludW91cyAoZmRfYXJyYXlfY250IGdpdmVuKTogLVxcdTAwM2VmZF9hcnJheSBob2xkcyBldmVyeSBlbnRyeVxcbitcXHQgKiAgICByZXNvbHZlZCB0byBpdHMgb2JqZWN0IHVwIGZyb250LCBpbmRleGVkIGJ5IGZkX2FycmF5IHBvc2l0aW9uLFxcbitcXHQgKiAgICB3aXRoIC1cXHUwMDNlZmRfYXJyYXlfY250IHNsb3RzOyAtXFx1MDAzZWZkX2FycmF5X3JhdyBpcyB1bnVzZWQuXFxuK1xcdCAqICAtIHNwYXJzZSAobm8gZmRfYXJyYXlfY250KTogLVxcdTAwM2VmZF9hcnJheSBpcyBOVUxMLCBhbmQgZW50cmllcyBhcmVcXG4rXFx0ICogICAgcmVhZCBmcm9tIC1cXHUwMDNlZmRfYXJyYXlfcmF3ICh0aGUgY2FsbGVyJ3MgZmRfYXJyYXkpIGFuZCByZXNvbHZlZFxcbitcXHQgKiAgICBvbiB0aGUgc3BvdCBhdCBlYWNoIHJlZmVyZW5jZS5cXG4rXFx0ICovXFxuK1xcdHN0cnVjdCBicGZfZmRfYXJyYXkgKmZkX2FycmF5O1xcbitcXHR1MzIgZmRfYXJyYXlfY250O1xcbitcXHRicGZwdHJfdCBmZF9hcnJheV9yYXc7XFxuIFxcbiBcXHQvKiBiaXQgbWFzayB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgYSByZWdpc3RlciBoYXMgYmVlbiBhY2Nlc3NlZFxcbiBcXHQgKiBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBmdW5jdGlvbiBzdGF0ZSB3YXMgcHJpbnRlZFxcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3N5c2NhbGwuYyBiL2tlcm5lbC9icGYvc3lzY2FsbC5jXFxuaW5kZXggNmRiMzA2ZDIzYjQ3OWYuLjM1OGYyYjBjZTJiZDMxIDEwMDY0NFxcbi0tLSBhL2tlcm5lbC9icGYvc3lzY2FsbC5jXFxuKysrIGIva2VybmVsL2JwZi9zeXNjYWxsLmNcXG5AQCAtNDAsNyArNDAsNiBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvdHJhY2Vwb2ludC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvb3ZlcmZsb3cuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Nvb2tpZS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvdmVyaWZpY2F0aW9uLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9idGZfaWRzLmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjbmV0L25ldGZpbHRlci9uZl9icGZfbGluay5oXFx1MDAzZVxcbkBAIC0xNTk5LDEzICsxNTk4LDYgQEAgc3RhdGljIGludCBtYXBfY3JlYXRlX2FsbG9jKHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl92ZXJcXG4gXFx0XFx0XFx0ZXJyID0gLUVGQVVMVDtcXG4gXFx0XFx0XFx0Z290byBmcmVlX21hcDtcXG4gXFx0XFx0fVxcbi1cXG4tXFx0XFx0LyogU2VlIGxpYmJwZjogZW1pdF9zaWduYXR1cmVfbWF0Y2goKSAqL1xcbi1cXHRcXHRCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGJwZl9tYXAsIGV4Y2wpICE9IFNIQTI1Nl9ESUdFU1RfU0laRSk7XFxuLVxcdFxcdEJVSUxEX0JVR19PTighX19zYW1lX3R5cGUobWFwLVxcdTAwM2VleGNsLCB1MzIpKTtcXG4tXFx0XFx0QlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBicGZfbWFwLCBzaGEpICAhPSAwKTtcXG4tXFx0XFx0QlVJTERfQlVHX09OKCFfX3NhbWVfdHlwZShtYXAtXFx1MDAzZXNoYSwgdThbU0hBMjU2X0RJR0VTVF9TSVpFXSkpO1xcbi1cXHRcXHRtYXAtXFx1MDAzZWV4Y2wgPSAxO1xcbiBcXHR9IGVsc2UgaWYgKGF0dHItXFx1MDAzZWV4Y2xfcHJvZ19oYXNoX3NpemUpIHtcXG4gXFx0XFx0YnBmX2xvZyhsb2csIFxcXCJJbnZhbGlkIGV4Y2xfcHJvZ19oYXNoX3NpemUuXFxcXG5cXFwiKTtcXG4gXFx0XFx0ZXJyID0gLUVJTlZBTDtcXG5AQCAtMjg4Niw2NCArMjg3OCw2IEBAIHN0YXRpYyBib29sIGlzX3BlcmZtb25fcHJvZ190eXBlKGVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGUpXFxuIFxcdH1cXG4gfVxcbiBcXG4tc3RhdGljIGVudW0gYnBmX3NpZ19rZXlyaW5nIGJwZl9jbGFzc2lmeV9rZXlyaW5nKHMzMiBrZXlyaW5nX2lkKVxcbi17XFxuLVxcdHN3aXRjaCAoa2V5cmluZ19pZCkge1xcbi1cXHRjYXNlIDA6XFxuLVxcdFxcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfQlVJTFRJTjtcXG4tXFx0Y2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkc6XFxuLVxcdFxcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfU0VDT05EQVJZO1xcbi1cXHRjYXNlIChzMzIpKHVuc2lnbmVkIGxvbmcpVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HOlxcbi1cXHRcXHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1BMQVRGT1JNO1xcbi1cXHRkZWZhdWx0Olxcbi1cXHRcXHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1VTRVI7XFxuLVxcdH1cXG4tfVxcbi1cXG4tc3RhdGljIGludCBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBicGZfcHJvZyAqcHJvZywgdW5pb24gYnBmX2F0dHIgKmF0dHIsXFxuLVxcdFxcdFxcdFxcdCAgICAgYm9vbCBpc19rZXJuZWwsIHMzMiAqa2V5cmluZ19zZXJpYWwpXFxuLXtcXG4tXFx0YnBmcHRyX3QgdXNpZyA9IG1ha2VfYnBmcHRyKGF0dHItXFx1MDAzZXNpZ25hdHVyZSwgaXNfa2VybmVsKTtcXG4tXFx0c3RydWN0IGJwZl9keW5wdHJfa2VybiBzaWdfcHRyLCBpbnNuc19wdHI7XFxuLVxcdHN0cnVjdCBicGZfa2V5ICprZXkgPSBOVUxMO1xcbi1cXHR2b2lkICpzaWc7XFxuLVxcdGludCBlcnIgPSAwO1xcbi1cXG4tXFx0LypcXG4tXFx0ICogRG9uJ3QgYXR0ZW1wdCB0byB1c2Uga21hbGxvY19sYXJnZSBvciB2bWFsbG9jIGZvciBzaWduYXR1cmVzLlxcbi1cXHQgKiBQcmFjdGljYWwgc2lnbmF0dXJlIGZvciBCUEYgcHJvZ3JhbSBzaG91bGQgYmUgYmVsb3cgdGhpcyBsaW1pdC5cXG4tXFx0ICovXFxuLVxcdGlmIChhdHRyLVxcdTAwM2VzaWduYXR1cmVfc2l6ZSBcXHUwMDNlIEtNQUxMT0NfTUFYX0NBQ0hFX1NJWkUpXFxuLVxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi1cXG4tXFx0aWYgKHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItXFx1MDAzZWtleXJpbmdfaWQpID09IDApXFxuLVxcdFxcdGtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLVxcdTAwM2VrZXlyaW5nX2lkKTtcXG4tXFx0ZWxzZVxcbi1cXHRcXHRrZXkgPSBicGZfbG9va3VwX3VzZXJfa2V5KGF0dHItXFx1MDAzZWtleXJpbmdfaWQsIDApO1xcbi1cXG4tXFx0aWYgKCFrZXkpXFxuLVxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi1cXG4tXFx0c2lnID0ga3ZtZW1kdXBfYnBmcHRyKHVzaWcsIGF0dHItXFx1MDAzZXNpZ25hdHVyZV9zaXplKTtcXG4tXFx0aWYgKElTX0VSUihzaWcpKSB7XFxuLVxcdFxcdGJwZl9rZXlfcHV0KGtleSk7XFxuLVxcdFxcdHJldHVybiBQVFJfRVJSKHNpZyk7XFxuLVxcdH1cXG4tXFxuLVxcdGJwZl9keW5wdHJfaW5pdChcXHUwMDI2c2lnX3B0ciwgc2lnLCBCUEZfRFlOUFRSX1RZUEVfTE9DQUwsIDAsXFxuLVxcdFxcdFxcdGF0dHItXFx1MDAzZXNpZ25hdHVyZV9zaXplKTtcXG4tXFx0YnBmX2R5bnB0cl9pbml0KFxcdTAwMjZpbnNuc19wdHIsIHByb2ctXFx1MDAzZWluc25zaSwgQlBGX0RZTlBUUl9UWVBFX0xPQ0FMLCAwLFxcbi1cXHRcXHRcXHRwcm9nLVxcdTAwM2VsZW4gKiBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKSk7XFxuLVxcbi1cXHRlcnIgPSBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgoc3RydWN0IGJwZl9keW5wdHIgKilcXHUwMDI2aW5zbnNfcHRyLFxcbi1cXHRcXHRcXHRcXHRcXHQgKHN0cnVjdCBicGZfZHlucHRyICopXFx1MDAyNnNpZ19wdHIsIGtleSk7XFxuLVxcdGlmICghZXJyKVxcbi1cXHRcXHQqa2V5cmluZ19zZXJpYWwgPSBicGZfa2V5X3NlcmlhbChrZXkpO1xcbi1cXHRicGZfa2V5X3B1dChrZXkpO1xcbi1cXHRrdmZyZWUoc2lnKTtcXG4tXFx0cmV0dXJuIGVycjtcXG4tfVxcbi1cXG4gc3RhdGljIGludCBicGZfcHJvZ19tYXJrX2luc25fYXJyYXlzX3JlYWR5KHN0cnVjdCBicGZfcHJvZyAqcHJvZylcXG4ge1xcbiBcXHRpbnQgZXJyO1xcbkBAIC0zMTMzLDE3ICszMDY3LDggQEAgc3RhdGljIGludCBicGZfcHJvZ19sb2FkKHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXRcXG4gXFxuIFxcdC8qIGVCUEYgcHJvZ3JhbXMgbXVzdCBiZSBHUEwgY29tcGF0aWJsZSB0byB1c2UgR1BMLWVkIGZ1bmN0aW9ucyAqL1xcbiBcXHRwcm9nLVxcdTAwM2VncGxfY29tcGF0aWJsZSA9IGxpY2Vuc2VfaXNfZ3BsX2NvbXBhdGlibGUobGljZW5zZSkgPyAxIDogMDtcXG4tXFx0aWYgKGF0dHItXFx1MDAzZXNpZ25hdHVyZSkge1xcbi1cXHRcXHRlcnIgPSBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKHByb2csIGF0dHIsIHVhdHRyLmlzX2tlcm5lbCxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx1MDAyNnByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLmtleXJpbmdfc2VyaWFsKTtcXG4tXFx0XFx0aWYgKGVycilcXG4tXFx0XFx0XFx0Z290byBmcmVlX3Byb2c7XFxuLVxcdFxcdHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLmtleXJpbmdfdHlwZSA9IGJwZl9jbGFzc2lmeV9rZXlyaW5nKGF0dHItXFx1MDAzZWtleXJpbmdfaWQpO1xcbi1cXHRcXHRwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZXNpZy52ZXJkaWN0ID0gQlBGX1NJR19WRVJJRklFRDtcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0cHJvZy1cXHUwMDNlYXV4LVxcdTAwM2VzaWcua2V5cmluZ190eXBlID0gQlBGX1NJR19LRVlSSU5HX05PTkU7XFxuLVxcdFxcdHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLnZlcmRpY3QgPSBCUEZfU0lHX1VOU0lHTkVEO1xcbi1cXHR9XFxuK1xcdHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLmtleXJpbmdfdHlwZSA9IEJQRl9TSUdfS0VZUklOR19OT05FO1xcbitcXHRwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZXNpZy52ZXJkaWN0ID0gQlBGX1NJR19VTlNJR05FRDtcXG4gXFx0cHJvZy1cXHUwMDNlb3JpZ19wcm9nID0gTlVMTDtcXG4gXFx0cHJvZy1cXHUwMDNlaml0ZWQgPSAwO1xcbiBcXG5AQCAtMzE4OSwxMCArMzExNCw2IEBAIHN0YXRpYyBpbnQgYnBmX3Byb2dfbG9hZCh1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0XFxuIFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbiBcXHRcXHRnb3RvIGZyZWVfcHJvZztcXG4gXFxuLVxcdGVyciA9IHNlY3VyaXR5X2JwZl9wcm9nX2xvYWQocHJvZywgYXR0ciwgdG9rZW4sIHVhdHRyLmlzX2tlcm5lbCk7XFxuLVxcdGlmIChlcnIpXFxuLVxcdFxcdGdvdG8gZnJlZV9wcm9nO1xcbi1cXG4gXFx0LyogcnVuIGVCUEYgdmVyaWZpZXIgKi9cXG4gXFx0ZXJyID0gYnBmX2NoZWNrKFxcdTAwMjZwcm9nLCBhdHRyLCB1YXR0ciwgYXR0cl9sb2cpO1xcbiBcXHRpZiAoZXJyIFxcdTAwM2MgMClcXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jXFxuaW5kZXggZDQ2ZjdkYjIwZDhmMDQuLjY1ZjUzMTI4ZmMzM2Q2IDEwMDY0NFxcbi0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xcbisrKyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xcbkBAIC0yMiw2ICsyMiw4IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9jdHlwZS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvZXJyb3ItaW5qZWN0aW9uLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9icGZfbHNtLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zZWN1cml0eS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvdmVyaWZpY2F0aW9uLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9idGZfaWRzLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9wb2lzb24uaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbkBAIC0yNDkwLDYgKzI0OTIsODMgQEAgaW50IGJwZl9nZXRfa2Z1bmNfYWRkcihjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2csIHUzMiBmdW5jX2lkLFxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4rI2RlZmluZSBCUEZfRkRfU0xPVF9CVEZcXHQxVUxcXG4rXFxuK3N0YXRpYyB2b2lkIGZkX3Nsb3Rfc2V0X21hcChzdHJ1Y3QgYnBmX2ZkX2FycmF5ICpzbG90LCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxcbit7XFxuK1xcdHNsb3QtXFx1MDAzZXZhbCA9ICh1bnNpZ25lZCBsb25nKW1hcDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgZmRfc2xvdF9zZXRfYnRmKHN0cnVjdCBicGZfZmRfYXJyYXkgKnNsb3QsIHN0cnVjdCBidGYgKmJ0ZilcXG4re1xcbitcXHRzbG90LVxcdTAwM2V2YWwgPSAodW5zaWduZWQgbG9uZylidGYgfCBCUEZfRkRfU0xPVF9CVEY7XFxuK31cXG4rXFxuK3N0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqZmRfc2xvdF9tYXAoc3RydWN0IGJwZl9mZF9hcnJheSBzbG90KVxcbit7XFxuK1xcdGlmIChzbG90LnZhbCBcXHUwMDI2IEJQRl9GRF9TTE9UX0JURilcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdHJldHVybiAoc3RydWN0IGJwZl9tYXAgKilzbG90LnZhbDtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBidGYgKmZkX3Nsb3RfYnRmKHN0cnVjdCBicGZfZmRfYXJyYXkgc2xvdClcXG4re1xcbitcXHRpZiAoIShzbG90LnZhbCBcXHUwMDI2IEJQRl9GRF9TTE9UX0JURikpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHRyZXR1cm4gKHN0cnVjdCBidGYgKikoc2xvdC52YWwgXFx1MDAyNiB+QlBGX0ZEX1NMT1RfQlRGKTtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBidGYgKlxcbitmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcXG4re1xcbitcXHRzdHJ1Y3QgYnRmICpidGY7XFxuK1xcbitcXHRpZiAoaWR4IFxcdTAwM2U9IGVudi1cXHUwMDNlZmRfYXJyYXlfY250KSB7XFxuK1xcdFxcdHZlcmJvc2UoZW52LCBcXFwia2Z1bmMgZmRfaWR4ICV1IG91dCBvZiBib3VuZHMsIGZkX2FycmF5X2NudCAldVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0aWR4LCBlbnYtXFx1MDAzZWZkX2FycmF5X2NudCk7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbitcXHR9XFxuK1xcdGJ0ZiA9IGZkX3Nsb3RfYnRmKGVudi1cXHUwMDNlZmRfYXJyYXlbaWR4XSk7XFxuK1xcdGlmICghYnRmKSB7XFxuK1xcdFxcdHZlcmJvc2UoZW52LCBcXFwia2Z1bmMgZmRfaWR4ICV1IGlzIG5vdCBhIG1vZHVsZSBCVEZcXFxcblxcXCIsIGlkeCk7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbitcXHR9XFxuK1xcdGJ0Zl9nZXQoYnRmKTtcXG4rXFx0cmV0dXJuIGJ0ZjtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBidGYgKlxcbitmZF9hcnJheV9nZXRfYnRmX3NwYXJzZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxcbit7XFxuK1xcdHN0cnVjdCBidGYgKmJ0ZjtcXG4rXFx0aW50IGJ0Zl9mZDtcXG4rXFxuK1xcdGlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldChcXHUwMDI2YnRmX2ZkLCBlbnYtXFx1MDAzZWZkX2FycmF5X3JhdyxcXG4rXFx0XFx0XFx0XFx0ICAgIChzaXplX3QpaWR4ICogc2l6ZW9mKGJ0Zl9mZCksIHNpemVvZihidGZfZmQpKSlcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XFxuK1xcdGJ0ZiA9IGJ0Zl9nZXRfYnlfZmQoYnRmX2ZkKTtcXG4rXFx0aWYgKElTX0VSUihidGYpKSB7XFxuK1xcdFxcdHZlcmJvc2UoZW52LCBcXFwiaW52YWxpZCBtb2R1bGUgQlRGIGZkIHNwZWNpZmllZFxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiBidGY7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIGJ0ZjtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBidGYgKmZkX2FycmF5X2dldF9idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcXG4re1xcbitcXHRpZiAoZW52LVxcdTAwM2VzaWduYXR1cmUpIHtcXG4rXFx0XFx0dmVyYm9zZShlbnYsIFxcXCJzaWduZWQgcHJvZ3JhbSBjYW5ub3QgYmluZCBhbnkgQlRGXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7XFxuK1xcdH1cXG4rXFx0aWYgKGVudi1cXHUwMDNlZmRfYXJyYXkpXFxuK1xcdFxcdHJldHVybiBmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXMoZW52LCBpZHgpO1xcbitcXHRpZiAoIWJwZnB0cl9pc19udWxsKGVudi1cXHUwMDNlZmRfYXJyYXlfcmF3KSlcXG4rXFx0XFx0cmV0dXJuIGZkX2FycmF5X2dldF9idGZfc3BhcnNlKGVudiwgaWR4KTtcXG4rXFxuK1xcdHZlcmJvc2UoZW52LCBcXFwia2Z1bmMgb2Zmc2V0IFxcdTAwM2UgMCB3aXRob3V0IGZkX2FycmF5IGlzIGludmFsaWRcXFxcblxcXCIpO1xcbitcXHRyZXR1cm4gRVJSX1BUUigtRVBST1RPKTtcXG4rfVxcbitcXG4gc3RhdGljIHN0cnVjdCBidGYgKl9fZmluZF9rZnVuY19kZXNjX2J0ZihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxcbiBcXHRcXHRcXHRcXHRcXHQgczE2IG9mZnNldClcXG4ge1xcbkBAIC0yNDk4LDcgKzI1NzcsNiBAQCBzdGF0aWMgc3RydWN0IGJ0ZiAqX19maW5kX2tmdW5jX2Rlc2NfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXFxuIFxcdHN0cnVjdCBicGZfa2Z1bmNfYnRmICpiO1xcbiBcXHRzdHJ1Y3QgbW9kdWxlICptb2Q7XFxuIFxcdHN0cnVjdCBidGYgKmJ0ZjtcXG4tXFx0aW50IGJ0Zl9mZDtcXG4gXFxuIFxcdHRhYiA9IGVudi1cXHUwMDNlcHJvZy1cXHUwMDNlYXV4LVxcdTAwM2VrZnVuY19idGZfdGFiO1xcbiBcXHRiID0gYnNlYXJjaChcXHUwMDI2a2ZfYnRmLCB0YWItXFx1MDAzZWRlc2NzLCB0YWItXFx1MDAzZW5yX2Rlc2NzLFxcbkBAIC0yNTA5LDIyICsyNTg3LDkgQEAgc3RhdGljIHN0cnVjdCBidGYgKl9fZmluZF9rZnVuY19kZXNjX2J0ZihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxcbiBcXHRcXHRcXHRyZXR1cm4gRVJSX1BUUigtRTJCSUcpO1xcbiBcXHRcXHR9XFxuIFxcbi1cXHRcXHRpZiAoYnBmcHRyX2lzX251bGwoZW52LVxcdTAwM2VmZF9hcnJheSkpIHtcXG4tXFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJrZnVuYyBvZmZzZXQgXFx1MDAzZSAwIHdpdGhvdXQgZmRfYXJyYXkgaXMgaW52YWxpZFxcXFxuXFxcIik7XFxuLVxcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FUFJPVE8pO1xcbi1cXHRcXHR9XFxuLVxcbi1cXHRcXHRpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoXFx1MDAyNmJ0Zl9mZCwgZW52LVxcdTAwM2VmZF9hcnJheSxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgIG9mZnNldCAqIHNpemVvZihidGZfZmQpLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgc2l6ZW9mKGJ0Zl9mZCkpKVxcbi1cXHRcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcXG4tXFxuLVxcdFxcdGJ0ZiA9IGJ0Zl9nZXRfYnlfZmQoYnRmX2ZkKTtcXG4tXFx0XFx0aWYgKElTX0VSUihidGYpKSB7XFxuLVxcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwiaW52YWxpZCBtb2R1bGUgQlRGIGZkIHNwZWNpZmllZFxcXFxuXFxcIik7XFxuK1xcdFxcdGJ0ZiA9IGZkX2FycmF5X2dldF9idGYoZW52LCBvZmZzZXQpO1xcbitcXHRcXHRpZiAoSVNfRVJSKGJ0ZikpXFxuIFxcdFxcdFxcdHJldHVybiBidGY7XFxuLVxcdFxcdH1cXG4tXFxuIFxcdFxcdGlmICghYnRmX2lzX21vZHVsZShidGYpKSB7XFxuIFxcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwiQlRGIGZkIGZvciBrZnVuYyBpcyBub3QgYSBtb2R1bGUgQlRGXFxcXG5cXFwiKTtcXG4gXFx0XFx0XFx0YnRmX3B1dChidGYpO1xcbkBAIC0xNzU4OSw2ICsxNzY1NCwxMSBAQCBzdGF0aWMgaW50IF9fYWRkX3VzZWRfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBidGYgKmJ0ZilcXG4gXFx0XFx0aWYgKGVudi1cXHUwMDNldXNlZF9idGZzW2ldLmJ0ZiA9PSBidGYpXFxuIFxcdFxcdFxcdGdvdG8gcmV0X3B1dDtcXG4gXFxuK1xcdGlmIChlbnYtXFx1MDAzZXNpZ25hdHVyZSkge1xcbitcXHRcXHR2ZXJib3NlKGVudiwgXFxcInNpZ25lZCBwcm9ncmFtIGNhbm5vdCBiaW5kIGFueSBCVEZcXFxcblxcXCIpO1xcbitcXHRcXHRyZXQgPSAtRUFDQ0VTO1xcbitcXHRcXHRnb3RvIHJldF9wdXQ7XFxuK1xcdH1cXG4gXFx0aWYgKGVudi1cXHUwMDNldXNlZF9idGZfY250IFxcdTAwM2U9IE1BWF9VU0VEX0JURlMpIHtcXG4gXFx0XFx0dmVyYm9zZShlbnYsIFxcXCJUaGUgdG90YWwgbnVtYmVyIG9mIGJ0ZnMgcGVyIHByb2dyYW0gaGFzIHJlYWNoZWQgdGhlIGxpbWl0IG9mICV1XFxcXG5cXFwiLFxcbiBcXHRcXHRcXHRNQVhfVVNFRF9CVEZTKTtcXG5AQCAtMTc4NzEsNiArMTc5NDEsMTIgQEAgc3RhdGljIGludCBfX2FkZF91c2VkX21hcChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxcbiBcXHRcXHRpZiAoZW52LVxcdTAwM2V1c2VkX21hcHNbaV0gPT0gbWFwKVxcbiBcXHRcXHRcXHRyZXR1cm4gaTtcXG4gXFxuK1xcdGlmIChlbnYtXFx1MDAzZXNpZ25hdHVyZSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgZW52LVxcdTAwM2Vwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZXNpZy52ZXJkaWN0ID09IEJQRl9TSUdfVkVSSUZJRUQpIHtcXG4rXFx0XFx0dmVyYm9zZShlbnYsIFxcXCJzaWduZWQgcHJvZ3JhbSBjYW5ub3QgYmluZCBtYXAgJyVzJyBub3QgY292ZXJlZCBieSB0aGUgc2lnbmF0dXJlXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRtYXAtXFx1MDAzZW5hbWUpO1xcbitcXHRcXHRyZXR1cm4gLUVBQ0NFUztcXG4rXFx0fVxcbiBcXHRpZiAoZW52LVxcdTAwM2V1c2VkX21hcF9jbnQgXFx1MDAzZT0gTUFYX1VTRURfTUFQUykge1xcbiBcXHRcXHR2ZXJib3NlKGVudiwgXFxcIlRoZSB0b3RhbCBudW1iZXIgb2YgbWFwcyBwZXIgcHJvZ3JhbSBoYXMgcmVhY2hlZCB0aGUgbGltaXQgb2YgJXVcXFxcblxcXCIsXFxuIFxcdFxcdFxcdE1BWF9VU0VEX01BUFMpO1xcbkBAIC0xNzkyMyw2ICsxNzk5OSw0OCBAQCBzdGF0aWMgaW50IGFkZF91c2VkX21hcChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgZmQpXFxuIFxcdHJldHVybiBfX2FkZF91c2VkX21hcChlbnYsIG1hcCk7XFxuIH1cXG4gXFxuK3N0YXRpYyBpbnQgZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfbWFwICptYXA7XFxuK1xcbitcXHRpZiAoaWR4IFxcdTAwM2U9IGVudi1cXHUwMDNlZmRfYXJyYXlfY250KSB7XFxuK1xcdFxcdHZlcmJvc2UoZW52LCBcXFwiZmRfaWR4ICV1IG91dCBvZiBib3VuZHMsIGZkX2FycmF5X2NudCAldVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0aWR4LCBlbnYtXFx1MDAzZWZkX2FycmF5X2NudCk7XFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcdG1hcCA9IGZkX3Nsb3RfbWFwKGVudi1cXHUwMDNlZmRfYXJyYXlbaWR4XSk7XFxuK1xcdGlmICghbWFwKSB7XFxuK1xcdFxcdHZlcmJvc2UoZW52LCBcXFwiZmRfaWR4ICV1IGlzIG5vdCBhIG1hcFxcXFxuXFxcIiwgaWR4KTtcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIF9fYWRkX3VzZWRfbWFwKGVudiwgbWFwKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBmZF9hcnJheV9nZXRfbWFwX2lkeF9zcGFyc2Uoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcXG4re1xcbitcXHRpbnQgZmQ7XFxuK1xcbitcXHRpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoXFx1MDAyNmZkLCBlbnYtXFx1MDAzZWZkX2FycmF5X3JhdyxcXG4rXFx0XFx0XFx0XFx0ICAgIChzaXplX3QpaWR4ICogc2l6ZW9mKGZkKSwgc2l6ZW9mKGZkKSkpXFxuK1xcdFxcdHJldHVybiAtRUZBVUxUO1xcbitcXHRyZXR1cm4gYWRkX3VzZWRfbWFwKGVudiwgZmQpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGZkX2FycmF5X2dldF9tYXBfaWR4KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXFxuK3tcXG4rXFx0aWYgKGVudi1cXHUwMDNlZmRfYXJyYXkpXFxuK1xcdFxcdHJldHVybiBmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzKGVudiwgaWR4KTtcXG4rXFx0aWYgKGVudi1cXHUwMDNlc2lnbmF0dXJlKSB7XFxuK1xcdFxcdHZlcmJvc2UoZW52LCBcXFwic2lnbmVkIHByb2dyYW0gbXVzdCBiaW5kIG1hcHMgdmlhIGEgY29udGludW91cyBmZF9hcnJheSAoZmRfYXJyYXlfY250KVxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiAtRUFDQ0VTO1xcbitcXHR9XFxuK1xcdGlmICghYnBmcHRyX2lzX251bGwoZW52LVxcdTAwM2VmZF9hcnJheV9yYXcpKVxcbitcXHRcXHRyZXR1cm4gZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlKGVudiwgaWR4KTtcXG4rXFxuK1xcdHZlcmJvc2UoZW52LCBcXFwiZmRfaWR4IHdpdGhvdXQgZmRfYXJyYXkgaXMgaW52YWxpZFxcXFxuXFxcIik7XFxuK1xcdHJldHVybiAtRVBST1RPO1xcbit9XFxuK1xcbiBzdGF0aWMgaW50IGNoZWNrX2FsdV9maWVsZHMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKVxcbiB7XFxuIFxcdHU4IGNsYXNzID0gQlBGX0NMQVNTKGluc24tXFx1MDAzZWNvZGUpO1xcbkBAIC0xODE0MCw3ICsxODI1OCw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfYW5kX3Jlc29sdmVfaW5zbnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcXG4gXFx0XFx0XFx0c3RydWN0IGJwZl9tYXAgKm1hcDtcXG4gXFx0XFx0XFx0aW50IG1hcF9pZHg7XFxuIFxcdFxcdFxcdHU2NCBhZGRyO1xcbi1cXHRcXHRcXHR1MzIgZmQ7XFxuIFxcbiBcXHRcXHRcXHRpZiAoaSA9PSBpbnNuX2NudCAtIDEgfHwgaW5zblsxXS5jb2RlICE9IDAgfHxcXG4gXFx0XFx0XFx0ICAgIGluc25bMV0uZHN0X3JlZyAhPSAwIHx8IGluc25bMV0uc3JjX3JlZyAhPSAwIHx8XFxuQEAgLTE4MTkyLDIxICsxODMwOSwxNyBAQCBzdGF0aWMgaW50IGNoZWNrX2FuZF9yZXNvbHZlX2luc25zKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpXFxuIFxcdFxcdFxcdHN3aXRjaCAoaW5zblswXS5zcmNfcmVnKSB7XFxuIFxcdFxcdFxcdGNhc2UgQlBGX1BTRVVET19NQVBfSURYX1ZBTFVFOlxcbiBcXHRcXHRcXHRjYXNlIEJQRl9QU0VVRE9fTUFQX0lEWDpcXG4tXFx0XFx0XFx0XFx0aWYgKGJwZnB0cl9pc19udWxsKGVudi1cXHUwMDNlZmRfYXJyYXkpKSB7XFxuLVxcdFxcdFxcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwiZmRfaWR4IHdpdGhvdXQgZmRfYXJyYXkgaXMgaW52YWxpZFxcXFxuXFxcIik7XFxuLVxcdFxcdFxcdFxcdFxcdHJldHVybiAtRVBST1RPO1xcbi1cXHRcXHRcXHRcXHR9XFxuLVxcdFxcdFxcdFxcdGlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldChcXHUwMDI2ZmQsIGVudi1cXHUwMDNlZmRfYXJyYXksXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBpbnNuWzBdLmltbSAqIHNpemVvZihmZCksXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBzaXplb2YoZmQpKSlcXG4tXFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcdFxcdFxcdFxcdG1hcF9pZHggPSBmZF9hcnJheV9nZXRfbWFwX2lkeChlbnYsIGluc25bMF0uaW1tKTtcXG4gXFx0XFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdFxcdGRlZmF1bHQ6XFxuLVxcdFxcdFxcdFxcdGZkID0gaW5zblswXS5pbW07XFxuK1xcdFxcdFxcdFxcdGlmIChlbnYtXFx1MDAzZXNpZ25hdHVyZSkge1xcbitcXHRcXHRcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcInNpZ25lZCBwcm9ncmFtIGNhbm5vdCByZWZlcmVuY2UgYSBtYXAgYnkgZmQsIG9ubHkgdmlhIGZkX2FycmF5IGluZGV4XFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdFxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0XFx0bWFwX2lkeCA9IGFkZF91c2VkX21hcChlbnYsIGluc25bMF0uaW1tKTtcXG4gXFx0XFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdFxcdH1cXG4gXFxuLVxcdFxcdFxcdG1hcF9pZHggPSBhZGRfdXNlZF9tYXAoZW52LCBmZCk7XFxuIFxcdFxcdFxcdGlmIChtYXBfaWR4IFxcdTAwM2MgMClcXG4gXFx0XFx0XFx0XFx0cmV0dXJuIG1hcF9pZHg7XFxuIFxcdFxcdFxcdG1hcCA9IGVudi1cXHUwMDNldXNlZF9tYXBzW21hcF9pZHhdO1xcbkBAIC0xOTQ4MSw3ICsxOTU5NCw3IEBAIHN0cnVjdCBidGYgKmJwZl9nZXRfYnRmX3ZtbGludXgodm9pZClcXG4gICogdGhpcyBjYXNlIGV4cGVjdCB0aGF0IGV2ZXJ5IGZpbGUgZGVzY3JpcHRvciBpbiB0aGUgYXJyYXkgaXMgZWl0aGVyIGEgbWFwIG9yXFxuICAqIGEgQlRGLiBFdmVyeXRoaW5nIGVsc2UgaXMgY29uc2lkZXJlZCB0byBiZSB0cmFzaC5cXG4gICovXFxuLXN0YXRpYyBpbnQgYWRkX2ZkX2Zyb21fZmRfYXJyYXkoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGZkKVxcbitzdGF0aWMgaW50IGFkZF9mZF9mcm9tX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgsIGludCBmZClcXG4ge1xcbiBcXHRzdHJ1Y3QgYnBmX21hcCAqbWFwO1xcbiBcXHRzdHJ1Y3QgYnRmICpidGY7XFxuQEAgLTE5NDkzLDUxICsxOTYwNiw4MyBAQCBzdGF0aWMgaW50IGFkZF9mZF9mcm9tX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBmZClcXG4gXFx0XFx0ZXJyID0gX19hZGRfdXNlZF9tYXAoZW52LCBtYXApO1xcbiBcXHRcXHRpZiAoZXJyIFxcdTAwM2MgMClcXG4gXFx0XFx0XFx0cmV0dXJuIGVycjtcXG4rXFx0XFx0ZmRfc2xvdF9zZXRfbWFwKFxcdTAwMjZlbnYtXFx1MDAzZWZkX2FycmF5W2lkeF0sIG1hcCk7XFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXHR9XFxuIFxcbiBcXHRidGYgPSBfX2J0Zl9nZXRfYnlfZmQoZik7XFxuIFxcdGlmICghSVNfRVJSKGJ0ZikpIHtcXG4gXFx0XFx0YnRmX2dldChidGYpO1xcbi1cXHRcXHRyZXR1cm4gX19hZGRfdXNlZF9idGYoZW52LCBidGYpO1xcbitcXHRcXHRlcnIgPSBfX2FkZF91c2VkX2J0ZihlbnYsIGJ0Zik7XFxuK1xcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbitcXHRcXHRmZF9zbG90X3NldF9idGYoXFx1MDAyNmVudi1cXHUwMDNlZmRfYXJyYXlbaWR4XSwgYnRmKTtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuIFxcdH1cXG4gXFxuIFxcdHZlcmJvc2UoZW52LCBcXFwiZmQgJWQgaXMgbm90IHBvaW50aW5nIHRvIHZhbGlkIGJwZl9tYXAgb3IgYnRmXFxcXG5cXFwiLCBmZCk7XFxuIFxcdHJldHVybiBQVFJfRVJSKG1hcCk7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbnQgcHJvY2Vzc19mZF9hcnJheShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIpXFxuKy8qXFxuKyAqIEEgY29udGludW91cyBmZF9hcnJheSBpcyByZXNvbHZlZCBpbnRvIGFuIGluLW1lbW9yeSBjYWNoZSB3aXRoIG9uZSBzbG90XFxuKyAqIHBlciBlbnRyeS4gVGhlIGJvdW5kIGhlcmUgaXMgZGVsaWJlcmF0ZWx5IGdlbmVyb3VzIGFuZCBub3QgZGVyaXZlZCBmcm9tXFxuKyAqIHRoZSBwZXItcHJvZ3JhbSBvYmplY3QgbGltaXRzOiBEdXBsaWNhdGUgZW50cmllcyAvYXJlLyBwZXJtaXR0ZWQsIGFuZFxcbisgKiB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IG1hcHMgYW5kIEJURnMgYSBwcm9ncmFtIGNhbiBiaW5kIGlzIGVuZm9yY2VkIHdoZW5cXG4rICogZWFjaCBlbnRyeSBpcyByZXNvbHZlZCBieSBfX2FkZF91c2VkX21hcCgpIGFuZCBfX2FkZF91c2VkX2J0ZigpLlxcbisgKi9cXG4rI2RlZmluZSBNQVhfRkRfQVJSQVlfQ05UIDQwOTZcXG4rXFxuK3N0YXRpYyBpbnQgcHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXFxuK1xcdFxcdFxcdFxcdCAgICAgICBicGZwdHJfdCBmZF9hcnJheSwgdTMyIGNudClcXG4ge1xcbi1cXHRzaXplX3Qgc2l6ZSA9IHNpemVvZihpbnQpO1xcbi1cXHRpbnQgcmV0O1xcbi1cXHRpbnQgZmQ7XFxuK1xcdGludCBmZCwgcmV0O1xcbiBcXHR1MzIgaTtcXG4gXFxuLVxcdGVudi1cXHUwMDNlZmRfYXJyYXkgPSBtYWtlX2JwZnB0cihhdHRyLVxcdTAwM2VmZF9hcnJheSwgdWF0dHIuaXNfa2VybmVsKTtcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiBvbGQgKG5vIGZkX2FycmF5X2NudCBpcyBnaXZlbikgYW5kIG5ld1xcbi1cXHQgKiBBUElzIGlzIHRoYXQgaW4gdGhlIGxhdHRlciBjYXNlIHRoZSBmZF9hcnJheSBpcyBleHBlY3RlZCB0byBiZVxcbi1cXHQgKiBjb250aW51b3VzIGFuZCBpcyBzY2FubmVkIGZvciBtYXAgZmRzIHJpZ2h0IGF3YXlcXG4tXFx0ICovXFxuLVxcdGlmICghYXR0ci1cXHUwMDNlZmRfYXJyYXlfY250KVxcbi1cXHRcXHRyZXR1cm4gMDtcXG4tXFxuLVxcdC8qIENoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovXFxuLVxcdGlmIChhdHRyLVxcdTAwM2VmZF9hcnJheV9jbnQgXFx1MDAzZT0gKFUzMl9NQVggLyBzaXplKSkge1xcbi1cXHRcXHR2ZXJib3NlKGVudiwgXFxcImZkX2FycmF5X2NudCBpcyB0b28gYmlnICgldSlcXFxcblxcXCIsIGF0dHItXFx1MDAzZWZkX2FycmF5X2NudCk7XFxuLVxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHRpZiAoY250IFxcdTAwM2UgTUFYX0ZEX0FSUkFZX0NOVCkge1xcbitcXHRcXHR2ZXJib3NlKGVudiwgXFxcImZkX2FycmF5IGhhcyB0b28gbWFueSBlbnRyaWVzICgldSwgbWF4ICV1KVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0Y250LCBNQVhfRkRfQVJSQVlfQ05UKTtcXG4rXFx0XFx0cmV0dXJuIC1FMkJJRztcXG4gXFx0fVxcbiBcXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGF0dHItXFx1MDAzZWZkX2FycmF5X2NudDsgaSsrKSB7XFxuLVxcdFxcdGlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldChcXHUwMDI2ZmQsIGVudi1cXHUwMDNlZmRfYXJyYXksIGkgKiBzaXplLCBzaXplKSlcXG4rXFx0ZW52LVxcdTAwM2VmZF9hcnJheSA9IGt2Y2FsbG9jKGNudCwgc2l6ZW9mKCplbnYtXFx1MDAzZWZkX2FycmF5KSxcXG4rXFx0XFx0XFx0XFx0IEdGUF9LRVJORUxfQUNDT1VOVCk7XFxuK1xcdGlmICghZW52LVxcdTAwM2VmZF9hcnJheSlcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcdGVudi1cXHUwMDNlZmRfYXJyYXlfY250ID0gY250O1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgY250OyBpKyspIHtcXG4rXFx0XFx0aWYgKGNvcHlfZnJvbV9icGZwdHJfb2Zmc2V0KFxcdTAwMjZmZCwgZmRfYXJyYXksXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAoc2l6ZV90KWkgKiBzaXplb2YoZmQpLCBzaXplb2YoZmQpKSlcXG4gXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuLVxcbi1cXHRcXHRyZXQgPSBhZGRfZmRfZnJvbV9mZF9hcnJheShlbnYsIGZkKTtcXG4rXFx0XFx0cmV0ID0gYWRkX2ZkX2Zyb21fZmRfYXJyYXkoZW52LCBpLCBmZCk7XFxuIFxcdFxcdGlmIChyZXQpXFxuIFxcdFxcdFxcdHJldHVybiByZXQ7XFxuIFxcdH1cXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4gXFxuK3N0YXRpYyBpbnQgcHJvY2Vzc19mZF9hcnJheShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxcbitcXHRcXHRcXHQgICAgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyKVxcbit7XFxuK1xcdGJwZnB0cl90IGZkX2FycmF5ID0gbWFrZV9icGZwdHIoYXR0ci1cXHUwMDNlZmRfYXJyYXksIHVhdHRyLmlzX2tlcm5lbCk7XFxuK1xcbitcXHRpZiAoYnBmcHRyX2lzX251bGwoZmRfYXJyYXkpKSB7XFxuK1xcdFxcdGlmIChhdHRyLVxcdTAwM2VmZF9hcnJheV9jbnQpIHtcXG4rXFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJmZF9hcnJheV9jbnQgJXUgd2l0aG91dCBmZF9hcnJheSBpcyBpbnZhbGlkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRhdHRyLVxcdTAwM2VmZF9hcnJheV9jbnQpO1xcbitcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0XFx0fVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0fVxcbitcXHQvKlxcbitcXHQgKiBOZXcgQVBJOiB0aGUgY2FsbGVyIHBhc3NlcyBmZF9hcnJheV9jbnQgYW5kIGEgY29udGludW91cyBhcnJheSB0aGF0XFxuK1xcdCAqIGlzIHJlc29sdmVkIGFuZCBib3VuZCB1cCBmcm9udC4gTGVnYWN5IEFQSSAobm8gZmRfYXJyYXlfY250KToga2VlcFxcbitcXHQgKiB0aGUgY2FsbGVyJ3MgYXJyYXkgYW5kIHJlc29sdmUgZW50cmllcyBvbiB0aGUgc3BvdCBhdCBlYWNoIHJlZmVyZW5jZS5cXG4rXFx0ICovXFxuK1xcdGlmIChhdHRyLVxcdTAwM2VmZF9hcnJheV9jbnQpXFxuK1xcdFxcdHJldHVybiBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXMoZW52LCBmZF9hcnJheSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgYXR0ci1cXHUwMDNlZmRfYXJyYXlfY250KTtcXG4rXFx0ZW52LVxcdTAwM2VmZF9hcnJheV9yYXcgPSBmZF9hcnJheTtcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuQEAgLTE5NzUyLDYgKzE5ODk3LDEzOSBAQCBpbnQgYnBmX2ZpeHVwX2tmdW5jX2NhbGwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuLFxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4rc3RhdGljIGVudW0gYnBmX3NpZ19rZXlyaW5nIGJwZl9jbGFzc2lmeV9rZXlyaW5nKHMzMiBrZXlyaW5nX2lkKVxcbit7XFxuK1xcdHN3aXRjaCAoa2V5cmluZ19pZCkge1xcbitcXHRjYXNlIDA6XFxuK1xcdFxcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfQlVJTFRJTjtcXG4rXFx0Y2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkc6XFxuK1xcdFxcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfU0VDT05EQVJZO1xcbitcXHRjYXNlIChzMzIpKHVuc2lnbmVkIGxvbmcpVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HOlxcbitcXHRcXHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1BMQVRGT1JNO1xcbitcXHRkZWZhdWx0OlxcbitcXHRcXHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1VTRVI7XFxuK1xcdH1cXG4rfVxcbitcXG4rLypcXG4rICogVmVyaWZ5IHRoZSBQS0NTIzcgc2lnbmF0dXJlIG9mIGEgbG9hZGVkIHByb2dyYW0uIENhbGxlZCBmcm9tIGJwZl9jaGVjaygpXFxuKyAqIG9uY2UgdGhlIHByb2dyYW0ncyBtZXRhZGF0YSBtYXBzIGhhdmUgYmVlbiByZXNvbHZlZCBpbnRvIHVzZWRfbWFwcywgc29cXG4rICogdGhlIGV4YWN0IG1hcHMgZm9sZGVkIGludG8gdGhlIHNpZ25hdHVyZSBhcmUgdGhlIG9uZXMgdGhlIHByb2dyYW0gYmluZHMuXFxuKyAqXFxuKyAqIFRoZSBzaWduYXR1cmUgY292ZXJzIHRoZSBpbnN0cnVjdGlvbnMgZm9sbG93ZWQgYnkgdGhlIGZyb3plbiBjb250ZW50cyBvZlxcbisgKiBlYWNoIG1hcCwgaW4gQG1hcHMgb3JkZXI6IGluc25zIHx8IG1hcF8wIHx8IG1hcF8xIHx8IFsuLi5dLiBPbiBzdWNjZXNzIHRoZVxcbisgKiB2ZXJkaWN0IGFuZCBrZXlyaW5nIGluZm8gYXJlIHJlY29yZGVkIG9uIHByb2ctXFx1MDAzZWF1eC5cXG4rICovXFxuK3N0YXRpYyBpbnQgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxcbitcXHRcXHRcXHRcXHQgICAgIHVuaW9uIGJwZl9hdHRyICphdHRyLCBib29sIGlzX2tlcm5lbClcXG4re1xcbitcXHRicGZwdHJfdCB1c2lnID0gbWFrZV9icGZwdHIoYXR0ci1cXHUwMDNlc2lnbmF0dXJlLCBpc19rZXJuZWwpO1xcbitcXHRzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuIHNpZ19wdHIsIGRhdGFfcHRyO1xcbitcXHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2cgPSBlbnYtXFx1MDAzZXByb2c7XFxuK1xcdHN0cnVjdCBicGZfbWFwICoqbWFwcyA9IGVudi1cXHUwMDNldXNlZF9tYXBzO1xcbitcXHRzdHJ1Y3QgYnBmX2tleSAqa2V5ID0gTlVMTDtcXG4rXFx0dm9pZCAqc2lnLCAqZGF0YSA9IE5VTEw7XFxuK1xcdHUzMiBtYXBfY250ID0gZW52LVxcdTAwM2V1c2VkX21hcF9jbnQ7XFxuK1xcdHUzMiBpLCBvZmYsIGluc25zX3N6O1xcbitcXHR1NjQgZGF0YV9zejtcXG4rXFx0aW50IGVyciA9IDA7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBEb24ndCBhdHRlbXB0IHRvIHVzZSBrbWFsbG9jX2xhcmdlIG9yIHZtYWxsb2MgZm9yIHNpZ25hdHVyZXMuXFxuK1xcdCAqIFByYWN0aWNhbCBzaWduYXR1cmUgZm9yIEJQRiBwcm9ncmFtIHNob3VsZCBiZSBiZWxvdyB0aGlzIGxpbWl0LlxcbitcXHQgKi9cXG4rXFx0aWYgKGF0dHItXFx1MDAzZXNpZ25hdHVyZV9zaXplIFxcdTAwM2UgS01BTExPQ19NQVhfQ0FDSEVfU0laRSlcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdGlmIChzeXN0ZW1fa2V5cmluZ19pZF9jaGVjayhhdHRyLVxcdTAwM2VrZXlyaW5nX2lkKSA9PSAwKVxcbitcXHRcXHRrZXkgPSBicGZfbG9va3VwX3N5c3RlbV9rZXkoYXR0ci1cXHUwMDNla2V5cmluZ19pZCk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0a2V5ID0gYnBmX2xvb2t1cF91c2VyX2tleShhdHRyLVxcdTAwM2VrZXlyaW5nX2lkLCAwKTtcXG4rXFx0aWYgKCFrZXkpIHtcXG4rXFx0XFx0dmVyYm9zZShlbnYsIFxcXCJjYW5ub3QgcmVzb2x2ZSBzaWduaW5nIGtleXJpbmcgd2l0aCBrZXlyaW5nX2lkICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRhdHRyLVxcdTAwM2VrZXlyaW5nX2lkKTtcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdH1cXG4rXFxuK1xcdHNpZyA9IGt2bWVtZHVwX2JwZnB0cih1c2lnLCBhdHRyLVxcdTAwM2VzaWduYXR1cmVfc2l6ZSk7XFxuK1xcdGlmIChJU19FUlIoc2lnKSkge1xcbitcXHRcXHRicGZfa2V5X3B1dChrZXkpO1xcbitcXHRcXHRyZXR1cm4gUFRSX0VSUihzaWcpO1xcbitcXHR9XFxuK1xcbitcXHRpbnNuc19zeiA9IHByb2ctXFx1MDAzZWxlbiAqIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pO1xcbitcXHRkYXRhX3N6ID0gaW5zbnNfc3o7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBtYXBfY250OyBpKyspIHtcXG4rXFx0XFx0c3RydWN0IGJwZl9tYXAgKm1hcCA9IG1hcHNbaV07XFxuK1xcbitcXHRcXHRpZiAobWFwLVxcdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfQVJSQVkgfHxcXG4rXFx0XFx0ICAgICFtYXAtXFx1MDAzZW9wcy1cXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyKSB7XFxuK1xcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwic2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICclcycgbXVzdCBiZSBhbiBhcnJheVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0bWFwLVxcdTAwM2VuYW1lKTtcXG4rXFx0XFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKCFSRUFEX09OQ0UobWFwLVxcdTAwM2Vmcm96ZW4pKSB7XFxuK1xcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwic2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICclcycgbXVzdCBiZSBmcm96ZW5cXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdG1hcC1cXHUwMDNlbmFtZSk7XFxuK1xcdFxcdFxcdGVyciA9IC1FUEVSTTtcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKCFtYXAtXFx1MDAzZWV4Y2xfcHJvZ19zaGEpIHtcXG4rXFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJzaWduZWQgcHJvZ3JhbSBtZXRhZGF0YSBtYXAgJyVzJyBtdXN0IGJlIGV4Y2x1c2l2ZVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0bWFwLVxcdTAwM2VuYW1lKTtcXG4rXFx0XFx0XFx0ZXJyID0gLUVQRVJNO1xcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0fVxcbitcXHRcXHRkYXRhX3N6ICs9IG1hcC1cXHUwMDNldmFsdWVfc2l6ZTtcXG4rXFx0fVxcbitcXHRpZiAoYnBmX2R5bnB0cl9jaGVja19zaXplKGRhdGFfc3opKSB7XFxuK1xcdFxcdHZlcmJvc2UoZW52LCBcXFwic2lnbmVkIHBheWxvYWQgdG9vIGxhcmdlOiAlbGx1IGJ5dGVzXFxcXG5cXFwiLCBkYXRhX3N6KTtcXG4rXFx0XFx0ZXJyID0gLUUyQklHO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXHRkYXRhID0ga3ZtYWxsb2MoZGF0YV9zeiwgR0ZQX0tFUk5FTF9BQ0NPVU5UIHwgX19HRlBfWkVSTyk7XFxuK1xcdGlmICghZGF0YSkge1xcbitcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXHRtZW1jcHkoZGF0YSwgcHJvZy1cXHUwMDNlaW5zbnNpLCBpbnNuc19zeik7XFxuK1xcdG9mZiA9IGluc25zX3N6O1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbWFwX2NudDsgaSsrKSB7XFxuK1xcdFxcdHN0cnVjdCBicGZfbWFwICptYXAgPSBtYXBzW2ldO1xcbitcXHRcXHR1NjQgYWRkcjtcXG4rXFxuK1xcdFxcdGVyciA9IG1hcC1cXHUwMDNlb3BzLVxcdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIobWFwLCBcXHUwMDI2YWRkciwgMCk7XFxuK1xcdFxcdGlmIChlcnIpIHtcXG4rXFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJmYWlsZWQgdG8gcmVhZCBzaWduZWQgbWV0YWRhdGEgbWFwICclcyc6ICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRtYXAtXFx1MDAzZW5hbWUsIGVycik7XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdFxcdG1lbWNweShkYXRhICsgb2ZmLCAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWFkZHIsXFxuK1xcdFxcdCAgICAgICBtYXAtXFx1MDAzZXZhbHVlX3NpemUpO1xcbitcXHRcXHRvZmYgKz0gbWFwLVxcdTAwM2V2YWx1ZV9zaXplO1xcbitcXHR9XFxuK1xcbitcXHRicGZfZHlucHRyX2luaXQoXFx1MDAyNmRhdGFfcHRyLCBkYXRhLCBCUEZfRFlOUFRSX1RZUEVfTE9DQUwsIDAsIGRhdGFfc3opO1xcbitcXHRicGZfZHlucHRyX2luaXQoXFx1MDAyNnNpZ19wdHIsIHNpZywgQlBGX0RZTlBUUl9UWVBFX0xPQ0FMLCAwLFxcbitcXHRcXHRcXHRhdHRyLVxcdTAwM2VzaWduYXR1cmVfc2l6ZSk7XFxuK1xcbitcXHRlcnIgPSBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgoc3RydWN0IGJwZl9keW5wdHIgKilcXHUwMDI2ZGF0YV9wdHIsXFxuK1xcdFxcdFxcdFxcdFxcdCAoc3RydWN0IGJwZl9keW5wdHIgKilcXHUwMDI2c2lnX3B0ciwga2V5KTtcXG4rXFx0aWYgKGVycikge1xcbitcXHRcXHR2ZXJib3NlKGVudiwgXFxcInNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkOiAlZFxcXFxuXFxcIiwgZXJyKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0dmVyYm9zZShlbnYsIFxcXCJzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHBhc3NlZFxcXFxuXFxcIik7XFxuK1xcdFxcdHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLmtleXJpbmdfc2VyaWFsID0gYnBmX2tleV9zZXJpYWwoa2V5KTtcXG4rXFx0XFx0cHJvZy1cXHUwMDNlYXV4LVxcdTAwM2VzaWcua2V5cmluZ190eXBlID0gYnBmX2NsYXNzaWZ5X2tleXJpbmcoYXR0ci1cXHUwMDNla2V5cmluZ19pZCk7XFxuK1xcdFxcdHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLnZlcmRpY3QgPSBCUEZfU0lHX1ZFUklGSUVEO1xcbitcXHR9XFxuK291dDpcXG4rXFx0a3ZmcmVlKGRhdGEpO1xcbitcXHRicGZfa2V5X3B1dChrZXkpO1xcbitcXHRrdmZyZWUoc2lnKTtcXG4rXFx0cmV0dXJuIGVycjtcXG4rfVxcbitcXG4gaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXFxuIFxcdCAgICAgIHN0cnVjdCBicGZfbG9nX2F0dHIgKmF0dHJfbG9nKVxcbiB7XFxuQEAgLTE5Nzc0LDE4ICsyMDA1Miw2IEBAIGludCBicGZfY2hlY2soc3RydWN0IGJwZl9wcm9nICoqcHJvZywgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxcbiBcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gXFxuIFxcdGVudi1cXHUwMDNlYnQuZW52ID0gZW52O1xcbi1cXG4tXFx0bGVuID0gKCpwcm9nKS1cXHUwMDNlbGVuO1xcbi1cXHRlbnYtXFx1MDAzZWluc25fYXV4X2RhdGEgPVxcbi1cXHRcXHR2emFsbG9jKGFycmF5X3NpemUoc2l6ZW9mKHN0cnVjdCBicGZfaW5zbl9hdXhfZGF0YSksIGxlbikpO1xcbi1cXHRyZXQgPSAtRU5PTUVNO1xcbi1cXHRpZiAoIWVudi1cXHUwMDNlaW5zbl9hdXhfZGF0YSlcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9lbnY7XFxuLVxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBsZW47IGkrKylcXG4tXFx0XFx0ZW52LVxcdTAwM2VpbnNuX2F1eF9kYXRhW2ldLm9yaWdfaWR4ID0gaTtcXG4tXFx0ZW52LVxcdTAwM2VzdWNjID0gYnBmX2lhcnJheV9yZWFsbG9jKE5VTEwsIDIpO1xcbi1cXHRpZiAoIWVudi1cXHUwMDNlc3VjYylcXG4tXFx0XFx0Z290byBlcnJfZnJlZV9lbnY7XFxuIFxcdGVudi1cXHUwMDNlcHJvZyA9ICpwcm9nO1xcbiBcXHRlbnYtXFx1MDAzZW9wcyA9IGJwZl92ZXJpZmllcl9vcHNbZW52LVxcdTAwM2Vwcm9nLVxcdTAwM2V0eXBlXTtcXG4gXFxuQEAgLTE5Nzk0LDIyICsyMDA2MCw1MSBAQCBpbnQgYnBmX2NoZWNrKHN0cnVjdCBicGZfcHJvZyAqKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcXG4gXFx0ZW52LVxcdTAwM2VieXBhc3Nfc3BlY192MSA9IGJwZl9ieXBhc3Nfc3BlY192MShlbnYtXFx1MDAzZXByb2ctXFx1MDAzZWF1eC1cXHUwMDNldG9rZW4pO1xcbiBcXHRlbnYtXFx1MDAzZWJ5cGFzc19zcGVjX3Y0ID0gYnBmX2J5cGFzc19zcGVjX3Y0KGVudi1cXHUwMDNlcHJvZy1cXHUwMDNlYXV4LVxcdTAwM2V0b2tlbik7XFxuIFxcdGVudi1cXHUwMDNlYnBmX2NhcGFibGUgPSBpc19wcml2ID0gYnBmX3Rva2VuX2NhcGFibGUoZW52LVxcdTAwM2Vwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZXRva2VuLCBDQVBfQlBGKTtcXG4tXFxuLVxcdGJwZl9nZXRfYnRmX3ZtbGludXgoKTtcXG4tXFxuLVxcdC8qIGdyYWIgdGhlIG11dGV4IHRvIHByb3RlY3QgZmV3IGdsb2JhbHMgdXNlZCBieSB2ZXJpZmllciAqL1xcbi1cXHRpZiAoIWlzX3ByaXYpXFxuLVxcdFxcdG11dGV4X2xvY2soXFx1MDAyNmJwZl92ZXJpZmllcl9sb2NrKTtcXG4rXFx0ZW52LVxcdTAwM2VzaWduYXR1cmUgPSBhdHRyLVxcdTAwM2VzaWduYXR1cmU7XFxuIFxcbiBcXHQvKiB1c2VyIGNvdWxkIGhhdmUgcmVxdWVzdGVkIHZlcmJvc2UgdmVyaWZpZXIgb3V0cHV0XFxuIFxcdCAqIGFuZCBzdXBwbGllZCBidWZmZXIgdG8gc3RvcmUgdGhlIHZlcmlmaWNhdGlvbiB0cmFjZVxcbiBcXHQgKi9cXG4gXFx0cmV0ID0gYnBmX3Zsb2dfaW5pdChcXHUwMDI2ZW52LVxcdTAwM2Vsb2csIGF0dHJfbG9nLVxcdTAwM2VsZXZlbCwgYXR0cl9sb2ctXFx1MDAzZXVidWYsIGF0dHJfbG9nLVxcdTAwM2VzaXplKTtcXG4gXFx0aWYgKHJldClcXG4tXFx0XFx0Z290byBlcnJfdW5sb2NrO1xcbitcXHRcXHRnb3RvIGVycl9mcmVlX2VudjtcXG4rXFx0aWYgKGVudi1cXHUwMDNlc2lnbmF0dXJlKSB7XFxuK1xcdFxcdHJldCA9IGJwZl9wcm9nX2NhbGNfdGFnKGVudi1cXHUwMDNlcHJvZyk7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRnb3RvIGVycl9wcmVwO1xcbitcXHR9XFxuIFxcbiBcXHRyZXQgPSBwcm9jZXNzX2ZkX2FycmF5KGVudiwgYXR0ciwgdWF0dHIpO1xcbiBcXHRpZiAocmV0KVxcbitcXHRcXHRnb3RvIGVycl9wcmVwO1xcbitcXG4rXFx0aWYgKGVudi1cXHUwMDNlc2lnbmF0dXJlKSB7XFxuK1xcdFxcdHJldCA9IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoZW52LCBhdHRyLCB1YXR0ci5pc19rZXJuZWwpO1xcbitcXHRcXHRpZiAocmV0KVxcbitcXHRcXHRcXHRnb3RvIGVycl9wcmVwO1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSBzZWN1cml0eV9icGZfcHJvZ19sb2FkKGVudi1cXHUwMDNlcHJvZywgYXR0ciwgZW52LVxcdTAwM2Vwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZXRva2VuLFxcbitcXHRcXHRcXHRcXHQgICAgIHVhdHRyLmlzX2tlcm5lbCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdGdvdG8gZXJyX3ByZXA7XFxuK1xcbitcXHRicGZfZ2V0X2J0Zl92bWxpbnV4KCk7XFxuK1xcbitcXHQvKiBncmFiIHRoZSBtdXRleCB0byBwcm90ZWN0IGZldyBnbG9iYWxzIHVzZWQgYnkgdmVyaWZpZXIgKi9cXG4rXFx0aWYgKCFpc19wcml2KVxcbitcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZicGZfdmVyaWZpZXJfbG9jayk7XFxuK1xcbitcXHRsZW4gPSBlbnYtXFx1MDAzZXByb2ctXFx1MDAzZWxlbjtcXG4rXFx0ZW52LVxcdTAwM2VpbnNuX2F1eF9kYXRhID1cXG4rXFx0XFx0dnphbGxvYyhhcnJheV9zaXplKHNpemVvZihzdHJ1Y3QgYnBmX2luc25fYXV4X2RhdGEpLCBsZW4pKTtcXG4rXFx0cmV0ID0gLUVOT01FTTtcXG4rXFx0aWYgKCFlbnYtXFx1MDAzZWluc25fYXV4X2RhdGEpXFxuK1xcdFxcdGdvdG8gc2tpcF9mdWxsX2NoZWNrO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbGVuOyBpKyspXFxuK1xcdFxcdGVudi1cXHUwMDNlaW5zbl9hdXhfZGF0YVtpXS5vcmlnX2lkeCA9IGk7XFxuK1xcdGVudi1cXHUwMDNlc3VjYyA9IGJwZl9pYXJyYXlfcmVhbGxvYyhOVUxMLCAyKTtcXG4rXFx0aWYgKCFlbnYtXFx1MDAzZXN1Y2MpXFxuIFxcdFxcdGdvdG8gc2tpcF9mdWxsX2NoZWNrO1xcbiBcXG4gXFx0bWFya192ZXJpZmllcl9zdGF0ZV9jbGVhbihlbnYpO1xcbkBAIC0yMDAzMywxNyArMjAzMjgsMjYgQEAgaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXFxuIFxcdCpwcm9nID0gZW52LVxcdTAwM2Vwcm9nO1xcbiBcXG4gXFx0bW9kdWxlX3B1dChlbnYtXFx1MDAzZWF0dGFjaF9idGZfbW9kKTtcXG4tZXJyX3VubG9jazpcXG4gXFx0aWYgKCFpc19wcml2KVxcbiBcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmJwZl92ZXJpZmllcl9sb2NrKTtcXG4tXFx0YnBmX2NsZWFyX2luc25fYXV4X2RhdGEoZW52LCAwLCBlbnYtXFx1MDAzZXByb2ctXFx1MDAzZWxlbik7XFxuK1xcdGdvdG8gZXJyX2ZyZWVfZW52O1xcbitlcnJfcHJlcDpcXG4rXFx0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcXHUwMDI2ZW52LVxcdTAwM2Vsb2cpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRyZXQgPSBlcnI7XFxuK1xcdHJlbGVhc2VfaW5zbl9hcnJheXMoZW52KTtcXG4rXFx0cmVsZWFzZV9tYXBzKGVudik7XFxuK1xcdHJlbGVhc2VfYnRmcyhlbnYpO1xcbiBlcnJfZnJlZV9lbnY6XFxuK1xcdGlmIChlbnYtXFx1MDAzZWluc25fYXV4X2RhdGEpXFxuK1xcdFxcdGJwZl9jbGVhcl9pbnNuX2F1eF9kYXRhKGVudiwgMCwgZW52LVxcdTAwM2Vwcm9nLVxcdTAwM2VsZW4pO1xcbitcXHR2ZnJlZShlbnYtXFx1MDAzZWluc25fYXV4X2RhdGEpO1xcbitcXHRrdmZyZWUoZW52LVxcdTAwM2VmZF9hcnJheSk7XFxuIFxcdGJwZl9zdGFja19saXZlbmVzc19mcmVlKGVudik7XFxuIFxcdGt2ZnJlZShlbnYtXFx1MDAzZWNmZy5pbnNuX3Bvc3RvcmRlcik7XFxuIFxcdGt2ZnJlZShlbnYtXFx1MDAzZXNjY19pbmZvKTtcXG4gXFx0a3ZmcmVlKGVudi1cXHUwMDNlc3VjYyk7XFxuIFxcdGt2ZnJlZShlbnYtXFx1MDAzZWdvdG94X3RtcF9idWYpO1xcbi1cXHR2ZnJlZShlbnYtXFx1MDAzZWluc25fYXV4X2RhdGEpO1xcbiBcXHRrdmZyZWUoZW52KTtcXG4gXFx0cmV0dXJuIHJldDtcXG4gfVxcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9nZW4uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jXFxuaW5kZXggNmFlNzI2MmViZTBjMWQuLmEwMWQwNmQyMmQxYTNiIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jXFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmNcXG5AQCAtNzkzLDYgKzc5Myw4IEBAIHN0YXRpYyBpbnQgZ2VuX3RyYWNlKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm9ial9uYW1lLCBjb25zdCBjaGFyICpoXFxuIFxcdGlmIChzaWduX3Byb2dzKSB7XFxuIFxcdFxcdHNvcHRzLmluc25zID0gb3B0cy5pbnNucztcXG4gXFx0XFx0c29wdHMuaW5zbnNfc3ogPSBvcHRzLmluc25zX3N6O1xcbitcXHRcXHRzb3B0cy5kYXRhID0gb3B0cy5kYXRhO1xcbitcXHRcXHRzb3B0cy5kYXRhX3N6ID0gb3B0cy5kYXRhX3N6O1xcbiBcXHRcXHRzb3B0cy5leGNsX3Byb2dfaGFzaCA9IHByb2dfc2hhO1xcbiBcXHRcXHRzb3B0cy5leGNsX3Byb2dfaGFzaF9zeiA9IHNpemVvZihwcm9nX3NoYSk7XFxuIFxcdFxcdHNvcHRzLnNpZ25hdHVyZSA9IHNpZ19idWY7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uY1xcbmluZGV4IGY5Yjc0MmY0YmIxMDRiLi44ODcyNmE2ZGI2ZDBlOSAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9zaWduLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9zaWduLmNcXG5AQCAtMTM1LDkgKzEzNSwyMSBAQCBpbnQgYnBmdG9vbF9wcm9nX3NpZ24oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cylcXG4gXFx0Q01TX0NvbnRlbnRJbmZvICpjbXMgPSBOVUxMO1xcbiBcXHRsb25nIGFjdHVhbF9zaWdfbGVuID0gMDtcXG4gXFx0WDUwOSAqeDUwOSA9IE5VTEw7XFxuK1xcdHZvaWQgKmRhdGEgPSBOVUxMO1xcbitcXHRzaXplX3QgZGF0YV9zejtcXG4gXFx0aW50IGVyciA9IDA7XFxuIFxcbi1cXHRiZF9pbiA9IEJJT19uZXdfbWVtX2J1ZihvcHRzLVxcdTAwM2VpbnNucywgb3B0cy1cXHUwMDNlaW5zbnNfc3opO1xcbitcXHRkYXRhX3N6ID0gKHNpemVfdClvcHRzLVxcdTAwM2VpbnNuc19zeiArIG9wdHMtXFx1MDAzZWRhdGFfc3o7XFxuK1xcdGRhdGEgPSBtYWxsb2MoZGF0YV9zeik7XFxuK1xcdGlmICghZGF0YSkge1xcbitcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFx0bWVtY3B5KGRhdGEsIG9wdHMtXFx1MDAzZWluc25zLCBvcHRzLVxcdTAwM2VpbnNuc19zeik7XFxuK1xcdGlmIChvcHRzLVxcdTAwM2VkYXRhX3N6KVxcbitcXHRcXHRtZW1jcHkoKGNoYXIgKilkYXRhICsgb3B0cy1cXHUwMDNlaW5zbnNfc3osIG9wdHMtXFx1MDAzZWRhdGEsIG9wdHMtXFx1MDAzZWRhdGFfc3opO1xcbitcXG4rXFx0YmRfaW4gPSBCSU9fbmV3X21lbV9idWYoZGF0YSwgZGF0YV9zeik7XFxuIFxcdGlmICghYmRfaW4pIHtcXG4gXFx0XFx0ZXJyID0gLUVOT01FTTtcXG4gXFx0XFx0Z290byBjbGVhbnVwO1xcbkBAIC0xNzUsMTAgKzE4NywxMyBAQCBpbnQgYnBmdG9vbF9wcm9nX3NpZ24oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cylcXG4gXFx0XFx0Z290byBjbGVhbnVwO1xcbiBcXHR9XFxuIFxcbi1cXHRFVlBfRGlnZXN0KG9wdHMtXFx1MDAzZWluc25zLCBvcHRzLVxcdTAwM2VpbnNuc19zeiwgb3B0cy1cXHUwMDNlZXhjbF9wcm9nX2hhc2gsXFxuLVxcdFxcdCAgIFxcdTAwMjZvcHRzLVxcdTAwM2VleGNsX3Byb2dfaGFzaF9zeiwgRVZQX3NoYTI1NigpLCBOVUxMKTtcXG4rXFx0aWYgKEVWUF9EaWdlc3Qob3B0cy1cXHUwMDNlaW5zbnMsIG9wdHMtXFx1MDAzZWluc25zX3N6LCBvcHRzLVxcdTAwM2VleGNsX3Byb2dfaGFzaCxcXG4rXFx0XFx0ICAgICAgIFxcdTAwMjZvcHRzLVxcdTAwM2VleGNsX3Byb2dfaGFzaF9zeiwgRVZQX3NoYTI1NigpLCBOVUxMKSAhPSAxKSB7XFxuK1xcdFxcdGVyciA9IC1FSU87XFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0fVxcbiBcXG4tXFx0XFx0YmRfb3V0ID0gQklPX25ldyhCSU9fc19tZW0oKSk7XFxuK1xcdGJkX291dCA9IEJJT19uZXcoQklPX3NfbWVtKCkpO1xcbiBcXHRpZiAoIWJkX291dCkge1xcbiBcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbiBcXHRcXHRnb3RvIGNsZWFudXA7XFxuQEAgLTIxMiw2ICsyMjcsNyBAQCBpbnQgYnBmdG9vbF9wcm9nX3NpZ24oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cylcXG4gXFx0WDUwOV9mcmVlKHg1MDkpO1xcbiBcXHRFVlBfUEtFWV9mcmVlKHByaXZhdGVfa2V5KTtcXG4gXFx0QklPX2ZyZWUoYmRfaW4pO1xcbitcXHRmcmVlKGRhdGEpO1xcbiBcXHRESVNQTEFZX09TU0xfRVJSKGVyciBcXHUwMDNjIDApO1xcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmhcXG5pbmRleCA0OWFmNDI2MGI4ZTZiNy4uMDQyNTY5MTg3NzUyMTcgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmhcXG4rKysgYi90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaFxcbkBAIC01MSw3ICs1MSw2IEBAIHN0cnVjdCBicGZfZ2VuIHtcXG4gXFx0X191MzIgbnJfa3N5bXM7XFxuIFxcdGludCBmZF9hcnJheTtcXG4gXFx0aW50IG5yX2ZkX2FycmF5O1xcbi1cXHRpbnQgaGFzaF9pbnNuX29mZnNldFtTSEEyNTZfRFdPUkRfU0laRV07XFxuIH07XFxuIFxcbiB2b2lkIGJwZl9nZW5fX2luaXQoc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGxvZ19sZXZlbCwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcyk7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jIGIvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmNcXG5pbmRleCBjN2YyZDJhYzdiYjM1Zi4uNmUzZGQ1MjQyNzYxODMgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmNcXG4rKysgYi90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuY1xcbkBAIC0xMTEsNyArMTExLDYgQEAgc3RhdGljIHZvaWQgZW1pdDIoc3RydWN0IGJwZl9nZW4gKmdlbiwgc3RydWN0IGJwZl9pbnNuIGluc24xLCBzdHJ1Y3QgYnBmX2luc24gaW5cXG4gXFxuIHN0YXRpYyBpbnQgYWRkX2RhdGEoc3RydWN0IGJwZl9nZW4gKmdlbiwgY29uc3Qgdm9pZCAqZGF0YSwgX191MzIgc2l6ZSk7XFxuIHN0YXRpYyB2b2lkIGVtaXRfc3lzX2Nsb3NlX2Jsb2Ioc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGJsb2Jfb2ZmKTtcXG4tc3RhdGljIHZvaWQgZW1pdF9zaWduYXR1cmVfbWF0Y2goc3RydWN0IGJwZl9nZW4gKmdlbik7XFxuIFxcbiB2b2lkIGJwZl9nZW5fX2luaXQoc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGxvZ19sZXZlbCwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcylcXG4ge1xcbkBAIC0xNTQsOCArMTUzLDYgQEAgdm9pZCBicGZfZ2VuX19pbml0KHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBsb2dfbGV2ZWwsIGludCBucl9wcm9ncywgaW50IG5yX21hcHNcXG4gXFx0LyogUjcgY29udGFpbnMgdGhlIGVycm9yIGNvZGUgZnJvbSBzeXNfYnBmLiBDb3B5IGl0IGludG8gUjAgYW5kIGV4aXQuICovXFxuIFxcdGVtaXQoZ2VuLCBCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMCwgQlBGX1JFR183KSk7XFxuIFxcdGVtaXQoZ2VuLCBCUEZfRVhJVF9JTlNOKCkpO1xcbi1cXHRpZiAoT1BUU19HRVQoZ2VuLVxcdTAwM2VvcHRzLCBnZW5faGFzaCwgZmFsc2UpKVxcbi1cXHRcXHRlbWl0X3NpZ25hdHVyZV9tYXRjaChnZW4pO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGFkZF9kYXRhKHN0cnVjdCBicGZfZ2VuICpnZW4sIGNvbnN0IHZvaWQgKmRhdGEsIF9fdTMyIHNpemUpXFxuQEAgLTM3Nyw4ICszNzQsNiBAQCBzdGF0aWMgdm9pZCBlbWl0X3N5c19jbG9zZV9ibG9iKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBibG9iX29mZilcXG4gXFx0X19lbWl0X3N5c19jbG9zZShnZW4pO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBjb21wdXRlX3NoYV91cGRhdGVfb2Zmc2V0cyhzdHJ1Y3QgYnBmX2dlbiAqZ2VuKTtcXG4tXFxuIGludCBicGZfZ2VuX19maW5pc2goc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcylcXG4ge1xcbiBcXHRpbnQgaTtcXG5AQCAtNDA4LDkgKzQwMyw2IEBAIGludCBicGZfZ2VuX19maW5pc2goc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcylcXG4gXFx0aWYgKCFnZW4tXFx1MDAzZWVycm9yKSB7XFxuIFxcdFxcdHN0cnVjdCBnZW5fbG9hZGVyX29wdHMgKm9wdHMgPSBnZW4tXFx1MDAzZW9wdHM7XFxuIFxcbi1cXHRcXHRpZiAoT1BUU19HRVQob3B0cywgZ2VuX2hhc2gsIGZhbHNlKSlcXG4tXFx0XFx0XFx0Y29tcHV0ZV9zaGFfdXBkYXRlX29mZnNldHMoZ2VuKTtcXG4tXFxuIFxcdFxcdG9wdHMtXFx1MDAzZWluc25zID0gZ2VuLVxcdTAwM2VpbnNuX3N0YXJ0O1xcbiBcXHRcXHRvcHRzLVxcdTAwM2VpbnNuc19zeiA9IGdlbi1cXHUwMDNlaW5zbl9jdXIgLSBnZW4tXFx1MDAzZWluc25fc3RhcnQ7XFxuIFxcdFxcdG9wdHMtXFx1MDAzZWRhdGEgPSBnZW4tXFx1MDAzZWRhdGFfc3RhcnQ7XFxuQEAgLTQ2MCwyMiArNDUyLDYgQEAgdm9pZCBicGZfZ2VuX19mcmVlKHN0cnVjdCBicGZfZ2VuICpnZW4pXFxuIFxcdF92YWw7XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbiB9KVxcbiBcXG4tc3RhdGljIHZvaWQgY29tcHV0ZV9zaGFfdXBkYXRlX29mZnNldHMoc3RydWN0IGJwZl9nZW4gKmdlbilcXG4te1xcbi1cXHRfX3U2NCBzaGFbU0hBMjU2X0RXT1JEX1NJWkVdO1xcbi1cXHRfX3U2NCBzaGFfZHc7XFxuLVxcdGludCBpO1xcbi1cXG4tXFx0bGliYnBmX3NoYTI1NihnZW4tXFx1MDAzZWRhdGFfc3RhcnQsIGdlbi1cXHUwMDNlZGF0YV9jdXIgLSBnZW4tXFx1MDAzZWRhdGFfc3RhcnQsIChfX3U4ICopc2hhKTtcXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFNIQTI1Nl9EV09SRF9TSVpFOyBpKyspIHtcXG4tXFx0XFx0c3RydWN0IGJwZl9pbnNuICppbnNuID1cXG4tXFx0XFx0XFx0KHN0cnVjdCBicGZfaW5zbiAqKShnZW4tXFx1MDAzZWluc25fc3RhcnQgKyBnZW4tXFx1MDAzZWhhc2hfaW5zbl9vZmZzZXRbaV0pO1xcbi1cXHRcXHRzaGFfZHcgPSB0Z3RfZW5kaWFuKHNoYVtpXSk7XFxuLVxcdFxcdGluc25bMF0uaW1tID0gKF9fdTMyKXNoYV9kdztcXG4tXFx0XFx0aW5zblsxXS5pbW0gPSBzaGFfZHcgXFx1MDAzZVxcdTAwM2UgMzI7XFxuLVxcdH1cXG4tfVxcbi1cXG4gdm9pZCBicGZfZ2VuX19sb2FkX2J0ZihzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCB2b2lkICpidGZfcmF3X2RhdGEsXFxuIFxcdFxcdCAgICAgICBfX3UzMiBidGZfcmF3X3NpemUpXFxuIHtcXG5AQCAtNTU3LDggKzUzMyw5IEBAIHZvaWQgYnBmX2dlbl9fbWFwX2NyZWF0ZShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLFxcbiBcXHQgKiBDb25kaXRpb25hbGx5IHVwZGF0ZSBtYXhfZW50cmllcyBmcm9tIHRoZSBob3N0LXN1cHBsaWVkIGxvYWRlclxcbiBcXHQgKiBjdHguIFRoaXMgc2l6ZXMgdGhlIG1hcCBhdCBydW50aW1lLCBidXQgZm9yIGEgc2lnbmVkIGxvYWRlclxcbiBcXHQgKiAoZ2VuX2hhc2gpIGl0IHdvdWxkIGxldCBhbiB1bnRydXN0ZWQgaG9zdCByZS1kaW1lbnNpb24gdGhlXFxuLVxcdCAqIHByb2dyYW0ncyBtYXBzIGFmdGVyIGVtaXRfc2lnbmF0dXJlX21hdGNoKCksIG91dHNpZGUgd2hhdCB0aGVcXG4tXFx0ICogc2lnbmF0dXJlIGF0dGVzdHMgdG8uIEtlZXAgdGhlIHNpZ25lci1wcm92aWRlZCBtYXhfZW50cmllc1xcbitcXHQgKiBwcm9ncmFtJ3MgbWFwcywgb3V0c2lkZSB3aGF0IHRoZSBzaWduYXR1cmUgYXR0ZXN0cyB0bzogdGhlXFxuK1xcdCAqIG1ldGFkYXRhIGJsb2IgaXMgY292ZXJlZCBieSB0aGUgcHJvZ3JhbSBzaWduYXR1cmUgYW5kIHZlcmlmaWVkXFxuK1xcdCAqIGJ5IHRoZSBrZXJuZWwgYXQgbG9hZCB0aW1lLiBLZWVwIHRoZSBzaWduZXItcHJvdmlkZWQgbWF4X2VudHJpZXNcXG4gXFx0ICogYmFrZWQgaW50byB0aGUgYmxvYiBpbiB0aGF0IGNhc2UuXFxuIFxcdCAqL1xcbiBcXHRpZiAobWFwX2lkeCBcXHUwMDNlPSAwIFxcdTAwMjZcXHUwMDI2ICFPUFRTX0dFVChnZW4tXFx1MDAzZW9wdHMsIGdlbl9oYXNoLCBmYWxzZSkpXFxuQEAgLTU5Niw0NSArNTczLDYgQEAgdm9pZCBicGZfZ2VuX19tYXBfY3JlYXRlKHN0cnVjdCBicGZfZ2VuICpnZW4sXFxuIFxcdFxcdGVtaXRfc3lzX2Nsb3NlX3N0YWNrKGdlbiwgc3RhY2tfb2ZmKGlubmVyX21hcF9mZCkpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBlbWl0X3NpZ25hdHVyZV9tYXRjaChzdHJ1Y3QgYnBmX2dlbiAqZ2VuKVxcbi17XFxuLVxcdF9fczY0IG9mZjtcXG4tXFx0aW50IGk7XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBSZWplY3QgaWYgdGhlIG1ldGFkYXRhIG1hcCBpcyBub3QgZXhjbHVzaXZlLiBXaXRob3V0IGV4Y2x1c2l2aXR5XFxuLVxcdCAqIHRoZSBjYWNoZWQgbWFwLVxcdTAwM2VzaGFbXSB2ZXJpZmllZCBhYm92ZSBjYW4gYmUgc3RhbGU6IGFub3RoZXIgQlBGXFxuLVxcdCAqIHByb2dyYW0gd2l0aCBtYXAgYWNjZXNzIGNvdWxkIGhhdmUgbXV0YXRlZCB0aGUgY29udGVudHMgYmV0d2Vlblxcbi1cXHQgKiBCUEZfT0JKX0dFVF9JTkZPX0JZX0ZEIGFuZCBsb2FkZXIgZXhlY3V0aW9uLlxcbi1cXHQgKi9cXG4tXFx0ZW1pdDIoZ2VuLCBCUEZfTERfSU1NNjRfUkFXX0ZVTEwoQlBGX1JFR18xLCBCUEZfUFNFVURPX01BUF9JRFgsXFxuLVxcdFxcdFxcdFxcdFxcdCAwLCAwLCAwLCAwKSk7XFxuLVxcdGVtaXQoZ2VuLCBCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsIFNIQTI1Nl9ESUdFU1RfTEVOR1RIKSk7XFxuLVxcdG9mZiA9IC0oZ2VuLVxcdTAwM2VpbnNuX2N1ciAtIGdlbi1cXHUwMDNlaW5zbl9zdGFydCAtIGdlbi1cXHUwMDNlY2xlYW51cF9sYWJlbCkgLyA4IC0gMjtcXG4tXFx0aWYgKGlzX3NpbW0xNihvZmYpKSB7XFxuLVxcdFxcdGVtaXQoZ2VuLCBCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNywgLUVJTlZBTCkpO1xcbi1cXHRcXHRlbWl0KGdlbiwgQlBGX0pNUF9JTU0oQlBGX0pORSwgQlBGX1JFR18yLCAxLCBvZmYpKTtcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0Z2VuLVxcdTAwM2VlcnJvciA9IC1FUkFOR0U7XFxuLVxcdH1cXG4tXFxuLVxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBTSEEyNTZfRFdPUkRfU0laRTsgaSsrKSB7XFxuLVxcdFxcdGVtaXQyKGdlbiwgQlBGX0xEX0lNTTY0X1JBV19GVUxMKEJQRl9SRUdfMSwgQlBGX1BTRVVET19NQVBfSURYLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgMCwgMCwgMCwgMCkpO1xcbi1cXHRcXHRlbWl0KGdlbiwgQlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwgaSAqIHNpemVvZihfX3U2NCkpKTtcXG4tXFx0XFx0Z2VuLVxcdTAwM2VoYXNoX2luc25fb2Zmc2V0W2ldID0gZ2VuLVxcdTAwM2VpbnNuX2N1ciAtIGdlbi1cXHUwMDNlaW5zbl9zdGFydDtcXG4tXFx0XFx0ZW1pdDIoZ2VuLCBCUEZfTERfSU1NNjRfUkFXX0ZVTEwoQlBGX1JFR18zLCAwLCAwLCAwLCAwLCAwKSk7XFxuLVxcbi1cXHRcXHRvZmYgPSAtKGdlbi1cXHUwMDNlaW5zbl9jdXIgLSBnZW4tXFx1MDAzZWluc25fc3RhcnQgLSBnZW4tXFx1MDAzZWNsZWFudXBfbGFiZWwpIC8gOCAtIDI7XFxuLVxcdFxcdGlmIChpc19zaW1tMTYob2ZmKSkge1xcbi1cXHRcXHRcXHRlbWl0KGdlbiwgQlBGX01PVjY0X0lNTShCUEZfUkVHXzcsIC1FSU5WQUwpKTtcXG4tXFx0XFx0XFx0ZW1pdChnZW4sIEJQRl9KTVBfUkVHKEJQRl9KTkUsIEJQRl9SRUdfMiwgQlBGX1JFR18zLCBvZmYpKTtcXG4tXFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0Z2VuLVxcdTAwM2VlcnJvciA9IC1FUkFOR0U7XFxuLVxcdFxcdH1cXG4tXFx0fVxcbi19XFxuLVxcbiB2b2lkIGJwZl9nZW5fX3JlY29yZF9hdHRhY2hfdGFyZ2V0KHN0cnVjdCBicGZfZ2VuICpnZW4sIGNvbnN0IGNoYXIgKmF0dGFjaF9uYW1lLFxcbiBcXHRcXHRcXHRcXHQgICBlbnVtIGJwZl9hdHRhY2hfdHlwZSB0eXBlKVxcbiB7XFxuQEAgLTEyMTEsMTAgKzExNDksMTAgQEAgdm9pZCBicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgsIHZvaWQgKnB2YWx1ZSxcXG4gXFx0ICogfVxcbiBcXHQgKlxcbiBcXHQgKiBUaGUgcnVudGltZSBpbml0aWFsX3ZhbHVlIGNvbWVzIGZyb20gdGhlIGhvc3Qtc3VwcGxpZWQgbG9hZGVyXFxuLVxcdCAqIGN0eCBhbmQgd291bGQgb3ZlcndyaXRlIHRoZSBibG9iIHZhbHVlIGFmdGVyIGVtaXRfc2lnbmF0dXJlX21hdGNoKClcXG4tXFx0ICogaGFzIGFscmVhZHkgdmFsaWRhdGVkIG1hcC1cXHUwMDNlc2hhW10uIEZvciBhIHNpZ25lZCBsb2FkZXIgKGdlbl9oYXNoKVxcbi1cXHQgKiB0aGUgYXR0ZXN0ZWQgYmxvYiB2YWx1ZSBtdXN0IGJlIGF1dGhvcml0YXRpdmUsIHNvIHNraXAgdGhlIG92ZXJyaWRlXFxuLVxcdCAqIGFuZCBsZWF2ZSB0aGUgaGFzaGVkIHZhbHVlIGluIHBsYWNlLlxcbitcXHQgKiBjdHggYW5kIHdvdWxkIG92ZXJ3cml0ZSB0aGUgYmxvYiB2YWx1ZSB0aGF0IHRoZSBwcm9ncmFtIHNpZ25hdHVyZVxcbitcXHQgKiBjb3ZlcnMgYW5kIHRoZSBrZXJuZWwgdmVyaWZpZXMgYXQgbG9hZCB0aW1lLiBGb3IgYSBzaWduZWQgbG9hZGVyXFxuK1xcdCAqIChnZW5faGFzaCkgdGhlIGF0dGVzdGVkIGJsb2IgdmFsdWUgbXVzdCBiZSBhdXRob3JpdGF0aXZlLCBzbyBza2lwXFxuK1xcdCAqIHRoZSBvdmVycmlkZSBhbmQgbGVhdmUgdGhlIHNpZ25lZCB2YWx1ZSBpbiBwbGFjZS5cXG4gXFx0ICovXFxuIFxcdGlmICghT1BUU19HRVQoZ2VuLVxcdTAwM2VvcHRzLCBnZW5faGFzaCwgZmFsc2UpKSB7XFxuIFxcdFxcdGVtaXQoZ2VuLCBCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMywgQlBGX1JFR182LFxcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9saWJicGZfaW50ZXJuYWwuaFxcbmluZGV4IDA0Y2QzMDNmYjVhODc5Li5kNWI3ZGI3MDNiM2ZlOSAxMDA2NDRcXG4tLS0gYS90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oXFxuKysrIGIvdG9vbHMvbGliL2JwZi9saWJicGZfaW50ZXJuYWwuaFxcbkBAIC03NjgsNyArNzY4LDYgQEAgaW50IGVsZl9yZXNvbHZlX3BhdHRlcm5fb2Zmc2V0cyhjb25zdCBjaGFyICpiaW5hcnlfcGF0aCwgY29uc3QgY2hhciAqcGF0dGVybixcXG4gaW50IHByb2JlX2ZkKGludCBmZCk7XFxuIFxcbiAjZGVmaW5lIFNIQTI1Nl9ESUdFU1RfTEVOR1RIIDMyXFxuLSNkZWZpbmUgU0hBMjU2X0RXT1JEX1NJWkUgU0hBMjU2X0RJR0VTVF9MRU5HVEggLyBzaXplb2YoX191NjQpXFxuIFxcbiB2b2lkIGxpYmJwZl9zaGEyNTYoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiwgX191OCBvdXRbU0hBMjU2X0RJR0VTVF9MRU5HVEhdKTtcXG4gaW50IHByb2JlX3N5c19icGZfZXh0KHZvaWQpO1xcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oXFxuaW5kZXggNzQ1MDNkMzU4YmM4YTUuLjUzZmVlNTNkMzZkNTEyIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oXFxuKysrIGIvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmhcXG5AQCAtMTgsMTAgKzE4LDYgQEBcXG4gI2luY2x1ZGUgXFxcImJwZi5oXFxcIlxcbiAjZW5kaWZcXG4gXFxuLSNpZm5kZWYgU0hBMjU2X0RJR0VTVF9MRU5HVEhcXG4tI2RlZmluZSBTSEEyNTZfRElHRVNUX0xFTkdUSCAzMlxcbi0jZW5kaWZcXG4tXFxuICNpZm5kZWYgX19OUl9icGZcXG4gIyBpZiBkZWZpbmVkKF9fbWlwc19fKSBcXHUwMDI2XFx1MDAyNiBkZWZpbmVkKF9BQklPMzIpXFxuICMgIGRlZmluZSBfX05SX2JwZiA0MzU1XFxuQEAgLTMyMCwyNSArMzE2LDYgQEAgc3RhdGljIGlubGluZSBpbnQgc2tlbF9saW5rX2NyZWF0ZShpbnQgcHJvZ19mZCwgaW50IHRhcmdldF9mZCxcXG4gXFx0cmV0dXJuIHNrZWxfc3lzX2JwZihCUEZfTElOS19DUkVBVEUsIFxcdTAwMjZhdHRyLCBhdHRyX3N6KTtcXG4gfVxcbiBcXG4tc3RhdGljIGlubGluZSBpbnQgc2tlbF9vYmpfZ2V0X2luZm9fYnlfZmQoaW50IGZkKVxcbi17XFxuLVxcdGNvbnN0IHNpemVfdCBhdHRyX3N6ID0gb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGluZm8pO1xcbi1cXHRfX3U4IHNoYVtTSEEyNTZfRElHRVNUX0xFTkdUSF07XFxuLVxcdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbztcXG4tXFx0X191MzIgaW5mb19sZW4gPSBzaXplb2YoaW5mbyk7XFxuLVxcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XFxuLVxcbi1cXHRtZW1zZXQoXFx1MDAyNmluZm8sIDAsIHNpemVvZihpbmZvKSk7XFxuLVxcdGluZm8uaGFzaCA9IChsb25nKSBcXHUwMDI2c2hhO1xcbi1cXHRpbmZvLmhhc2hfc2l6ZSA9IFNIQTI1Nl9ESUdFU1RfTEVOR1RIO1xcbi1cXG4tXFx0bWVtc2V0KFxcdTAwMjZhdHRyLCAwLCBhdHRyX3N6KTtcXG4tXFx0YXR0ci5pbmZvLmJwZl9mZCA9IGZkO1xcbi1cXHRhdHRyLmluZm8uaW5mbyA9IChsb25nKSBcXHUwMDI2aW5mbztcXG4tXFx0YXR0ci5pbmZvLmluZm9fbGVuID0gaW5mb19sZW47XFxuLVxcdHJldHVybiBza2VsX3N5c19icGYoQlBGX09CSl9HRVRfSU5GT19CWV9GRCwgXFx1MDAyNmF0dHIsIGF0dHJfc3opO1xcbi19XFxuLVxcbiBzdGF0aWMgaW5saW5lIGludCBza2VsX21hcF9mcmVlemUoaW50IGZkKVxcbiB7XFxuIFxcdGNvbnN0IHNpemVfdCBhdHRyX3N6ID0gb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIG1hcF9mZCk7XFxuQEAgLTM4NCwxMiArMzYxLDYgQEAgc3RhdGljIGlubGluZSBpbnQgYnBmX2xvYWRfYW5kX3J1bihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKVxcbiBcXHRcXHRzZXRfZXJyO1xcbiBcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbi1cXHRlcnIgPSBza2VsX29ial9nZXRfaW5mb19ieV9mZChtYXBfZmQpO1xcbi1cXHRpZiAoZXJyIFxcdTAwM2MgMCkge1xcbi1cXHRcXHRvcHRzLVxcdTAwM2VlcnJzdHIgPSBcXFwiZmFpbGVkIHRvIGZldGNoIG9iaiBpbmZvXFxcIjtcXG4tXFx0XFx0c2V0X2VycjtcXG4tXFx0XFx0Z290byBvdXQ7XFxuLVxcdH1cXG4gI2VuZGlmXFxuIFxcbiBcXHRtZW1zZXQoXFx1MDAyNmF0dHIsIDAsIHByb2dfbG9hZF9hdHRyX3N6KTtcXG5AQCAtNDAwLDYgKzM3MSw4IEBAIHN0YXRpYyBpbmxpbmUgaW50IGJwZl9sb2FkX2FuZF9ydW4oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cylcXG4gI2lmbmRlZiBfX0tFUk5FTF9fXFxuIFxcdGF0dHIuc2lnbmF0dXJlID0gKGxvbmcpIG9wdHMtXFx1MDAzZXNpZ25hdHVyZTtcXG4gXFx0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IG9wdHMtXFx1MDAzZXNpZ25hdHVyZV9zejtcXG4rXFx0aWYgKG9wdHMtXFx1MDAzZXNpZ25hdHVyZSlcXG4rXFx0XFx0YXR0ci5mZF9hcnJheV9jbnQgPSAxO1xcbiAjZWxzZVxcbiBcXHRpZiAob3B0cy1cXHUwMDNlc2lnbmF0dXJlIHx8IG9wdHMtXFx1MDAzZXNpZ25hdHVyZV9zeilcXG4gXFx0XFx0cHJfd2FybihcXFwic2lnbmF0dXJlcyBhcmUgbm90IHN1cHBvcnRlZCBmcm9tIGJwZl9wcmVsb2FkXFxcXG5cXFwiKTtcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jXFxuaW5kZXggNWZjNDE3ZTMxZmM2MTUuLjU2ZDFmMDcyZGU0YzE3IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuY1xcbkBAIC0xMSw2ICsxMSw4IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXljdGwuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JwZi5oXFx1MDAzZVxcbiBcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9idGYuaFxcdTAwM2VcXG4rXFxuICNpbmNsdWRlIFxcXCJicGYvbGliYnBmX2ludGVybmFsLmhcXFwiIC8qIGZvciBsaWJicGZfc2hhMjU2KCkgKi9cXG4gI2luY2x1ZGUgXFxcImJwZi9za2VsX2ludGVybmFsLmhcXFwiXFx0IC8qIGZvciBsb2FkZXIgY3R4IGxheW91dCAoYnBmX2xvYWRlcl9jdHggZXRjKSAqL1xcbiBcXG5AQCAtMTksOCArMjEsNiBAQFxcbiAjaW5jbHVkZSBcXFwidGVzdF9zaWduZWRfbG9hZGVyX2RhdGEuc2tlbC5oXFxcIlxcbiAjaW5jbHVkZSBcXFwidGVzdF9zaWduZWRfbG9hZGVyX2xzbS5za2VsLmhcXFwiXFxuIFxcbi0jZGVmaW5lIFNJR19NQVRDSF9JTlNOUyAzMyAvKiBleGNsICg1KSArIDQgKiBzaGEtZHdvcmQgKDcpICovXFxuLVxcbiBlbnVtIHtcXG4gXFx0QlBGX1NJR19VTlNJR05FRCA9IDAsXFxuIFxcdEJQRl9TSUdfVkVSSUZJRUQsXFxuQEAgLTM1LDcgKzM1LDggQEAgZW51bSB7XFxuIH07XFxuIFxcbiBzdGF0aWMgaW50IGxvYWRfbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCxcXG4tXFx0XFx0ICAgICAgIGNvbnN0IHZvaWQgKnNpZywgX191MzIgc2lnX3N6LCBfX3MzMiBrZXlyaW5nX2lkKVxcbitcXHRcXHQgICAgICAgY29uc3Qgdm9pZCAqc2lnLCBfX3UzMiBzaWdfc3osIF9fczMyIGtleXJpbmdfaWQsXFxuK1xcdFxcdCAgICAgICBfX3UzMiBmZF9hcnJheV9jbnQpXFxuIHtcXG4gXFx0dW5pb24gYnBmX2F0dHIgYXR0cjtcXG4gXFx0aW50IGZkO1xcbkBAIC01Miw2ICs1Myw3IEBAIHN0YXRpYyBpbnQgbG9hZF9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LCBpbnQgbWFwX2ZkLFxcbiBcXHRcXHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6O1xcbiBcXHRcXHRhdHRyLmtleXJpbmdfaWQgPSBrZXlyaW5nX2lkO1xcbiBcXHR9XFxuK1xcdGF0dHIuZmRfYXJyYXlfY250ID0gZmRfYXJyYXlfY250O1xcbiBcXHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFxcXCJfX2xvYWRlci5wcm9nXFxcIiwgc2l6ZW9mKFxcXCJfX2xvYWRlci5wcm9nXFxcIikpO1xcbiBcXHRmZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFxcdTAwMjZhdHRyLFxcbiBcXHRcXHQgICAgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XFxuQEAgLTYyLDE0ICs2NCwxMiBAQCBzdGF0aWMgaW50IHJ1bl9nZW5fbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeixcXG4gXFx0XFx0XFx0ICBjb25zdCB2b2lkICpkYXRhLCBfX3UzMiBkYXRhX3N6LFxcbiBcXHRcXHRcXHQgIGNvbnN0IHZvaWQgKmV4Y2wsIF9fdTMyIGV4Y2xfc3osXFxuIFxcdFxcdFxcdCAgY29uc3Qgdm9pZCAqc2lnLCBfX3UzMiBzaWdfc3osXFxuLVxcdFxcdFxcdCAgYm9vbCBnZXRfaGFzaCwgdm9pZCAqY3R4LCBfX3UzMiBjdHhfc3osIGJvb2wgKmxvYWRlcl9yYW4pXFxuK1xcdFxcdFxcdCAgdm9pZCAqY3R4LCBfX3UzMiBjdHhfc3osIGJvb2wgKmxvYWRlcl9yYW4pXFxuIHtcXG4gXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgbW9wdHMsXFxuIFxcdFxcdCAgICAuZXhjbF9wcm9nX2hhc2ggPSBleGNsLFxcbiBcXHRcXHQgICAgLmV4Y2xfcHJvZ19oYXNoX3NpemUgPSBleGNsX3N6KTtcXG4tXFx0X191OCBoYnVmW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTtcXG4tXFx0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvO1xcbi1cXHRfX3UzMiBpbGVuID0gc2l6ZW9mKGluZm8pLCBrZXkgPSAwO1xcbitcXHRfX3UzMiBrZXkgPSAwO1xcbiBcXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xcbiBcXHRpbnQgbWFwX2ZkLCBwcm9nX2ZkLCByZXQ7XFxuIFxcbkBAIC04NywxNSArODcsNiBAQCBzdGF0aWMgaW50IHJ1bl9nZW5fbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeixcXG4gXFx0XFx0cmV0ID0gLWVycm5vO1xcbiBcXHRcXHRnb3RvIG91dF9tYXA7XFxuIFxcdH1cXG4tXFx0aWYgKGdldF9oYXNoKSB7XFxuLVxcdFxcdG1lbXNldChcXHUwMDI2aW5mbywgMCwgc2l6ZW9mKGluZm8pKTtcXG4tXFx0XFx0aW5mby5oYXNoID0gcHRyX3RvX3U2NChoYnVmKTtcXG4tXFx0XFx0aW5mby5oYXNoX3NpemUgPSBzaXplb2YoaGJ1Zik7XFxuLVxcdFxcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKG1hcF9mZCwgXFx1MDAyNmluZm8sIFxcdTAwMjZpbGVuKSkge1xcbi1cXHRcXHRcXHRyZXQgPSAtZXJybm87XFxuLVxcdFxcdFxcdGdvdG8gb3V0X21hcDtcXG4tXFx0XFx0fVxcbi1cXHR9XFxuIFxcbiBcXHRtZW1zZXQoXFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XFxuIFxcdGF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMO1xcbkBAIC0xMDgsNiArOTksNyBAQCBzdGF0aWMgaW50IHJ1bl9nZW5fbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeixcXG4gXFx0XFx0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XFxuIFxcdFxcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XFxuIFxcdFxcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcXG4rXFx0XFx0YXR0ci5mZF9hcnJheV9jbnQgPSAxO1xcbiBcXHR9XFxuIFxcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXFxcIl9fbG9hZGVyLnByb2dcXFwiLCBzaXplb2YoXFxcIl9fbG9hZGVyLnByb2dcXFwiKSk7XFxuIFxcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcXHUwMDI2YXR0cixcXG5AQCAtMjM2LDc5ICsyMjgsNiBAQCBzdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sXFxuIFxcdHJldHVybiByZXQ7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIGNoZWNrX3NpZ19tYXRjaF9zaGFwZShjb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluLCBpbnQgbilcXG4te1xcbi1cXHRpbnQgYSA9IC0xLCBjbGVhbnVwID0gLTEsIGksIGJhc2UsIHQsIGJyWzVdLCBuYiA9IDA7XFxuLVxcbi1cXHQvKiBCUEZfUFNFVURPX01BUF9JRFggKHRoZSBzdHJ1Y3QgYnBmX21hcCAqIGZvcm0pIGlzIHVzZWQgb25seSBoZXJlLiAqL1xcbi1cXHRmb3IgKGkgPSAwOyBpICsgMSBcXHUwMDNjIG47IGkrKykge1xcbi1cXHRcXHRpZiAoaW5baV0uY29kZSA9PSAoQlBGX0xEIHwgQlBGX0lNTSB8IEJQRl9EVykgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIGluW2ldLnNyY19yZWcgPT0gQlBGX1BTRVVET19NQVBfSURYKSB7XFxuLVxcdFxcdFxcdGEgPSBpO1xcbi1cXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0fVxcbi1cXHR9XFxuLVxcdGlmICghQVNTRVJUX0dFKGEsIDAsIFxcXCJlbWl0X3NpZ25hdHVyZV9tYXRjaCBwcmVzZW50XFxcIikpXFxuLVxcdFxcdHJldHVybjtcXG4tXFx0aWYgKCFBU1NFUlRfTEUoYSArIFNJR19NQVRDSF9JTlNOUywgbiwgXFxcImJsb2NrIGZpdHMgaW4gcHJvZ3JhbVxcXCIpKVxcbi1cXHRcXHRyZXR1cm47XFxuLVxcbi1cXHQvKiBleGNsIGNoZWNrOiByMiA9ICoodTMyICopKG1hcCArIDMyKTsgaWYgcjIgIT0gMSBnb3RvIGNsZWFudXAgKi9cXG4tXFx0QVNTRVJUX0VRKGluW2EgKyAyXS5jb2RlLCAoQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfVyksIFxcXCJleGNsIGxvYWQgd2lkdGhcXFwiKTtcXG4tXFx0QVNTRVJUX0VRKGluW2EgKyAyXS5vZmYsIFNIQTI1Nl9ESUdFU1RfTEVOR1RILCBcXFwiZXhjbCBmaWVsZCBvZmZzZXRcXFwiKTtcXG4tXFx0QVNTRVJUX0VRKGluW2EgKyA0XS5jb2RlLCAoQlBGX0pNUCB8IEJQRl9KTkUgfCBCUEZfSyksIFxcXCJleGNsIGJyYW5jaCBvcFxcXCIpO1xcbi1cXHRBU1NFUlRfRVEoaW5bYSArIDRdLmltbSwgMSwgXFxcImV4Y2wgY29tcGFyZWQgdG8gMVxcXCIpO1xcbi1cXHRicltuYisrXSA9IGEgKyA0O1xcbi1cXG4tXFx0LyogNCBzaGEtZHdvcmQgY2hlY2tzOiByMiA9ICoodTY0ICopKG1hcCArIGkqOCk7IGlmIHIyICE9IHIzIGdvdG8gY2xlYW51cCAqL1xcbi1cXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgNDsgaSsrKSB7XFxuLVxcdFxcdGJhc2UgPSBhICsgNSArIGkgKiA3O1xcbi1cXHRcXHRBU1NFUlRfRVEoaW5bYmFzZSArIDJdLmNvZGUsIChCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9EVyksIFxcXCJzaGEgbG9hZCB3aWR0aFxcXCIpO1xcbi1cXHRcXHRBU1NFUlRfRVEoaW5bYmFzZSArIDJdLm9mZiwgaSAqIDgsIFxcXCJzaGEgZHdvcmQgb2Zmc2V0XFxcIik7XFxuLVxcdFxcdEFTU0VSVF9FUShpbltiYXNlICsgM10uY29kZSwgKEJQRl9MRCB8IEJQRl9JTU0gfCBCUEZfRFcpLCBcXFwic2hhIGltbTY0IChIX21ldGEpXFxcIik7XFxuLVxcdFxcdEFTU0VSVF9FUShpbltiYXNlICsgNl0uY29kZSwgKEJQRl9KTVAgfCBCUEZfSk5FIHwgQlBGX1gpLCBcXFwic2hhIGJyYW5jaCBvcFxcXCIpO1xcbi1cXHRcXHRicltuYisrXSA9IGJhc2UgKyA2O1xcbi1cXHR9XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBMb2NhdGUgdGhlIHJlYWwgY2xlYW51cCBsYWJlbCBzbyB3ZSBjYW4gcGluIHRoZSBleGFjdCBqdW1wIHRhcmdldCxcXG4tXFx0ICogbm90IGp1c3QgXFxcInNvbWUgYmFja3dhcmQgbGFiZWxcXFwiLiBicGZfZ2VuX19pbml0KCkgZW1pdHMgdGhlIGNsZWFudXBcXG4tXFx0ICogYmxvY2sgYXMgYSBwcm9nLWZkIGNsb3NlIGxvb3Agd2hvc2UgZmlyc3QgaW5zdHJ1Y3Rpb24gaXMgdGhlIGxhYmVsXFxuLVxcdCAqIGV2ZXJ5IGVycm9yIGJyYW5jaCBqdW1wcyB0by5cXG4tXFx0ICovXFxuLVxcdGZvciAoaSA9IDA7IGkgKyAyIFxcdTAwM2MgYTsgaSsrKSB7XFxuLVxcdFxcdGlmIChpbltpXS5jb2RlID09IChCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9XKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgaW5baV0uZHN0X3JlZyA9PSBCUEZfUkVHXzEgXFx1MDAyNlxcdTAwMjYgaW5baV0uc3JjX3JlZyA9PSBCUEZfUkVHXzEwIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICBpbltpICsgMV0uY29kZSA9PSAoQlBGX0pNUCB8IEJQRl9KU0xFIHwgQlBGX0spIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICBpbltpICsgMV0uZHN0X3JlZyA9PSBCUEZfUkVHXzEgXFx1MDAyNlxcdTAwMjYgaW5baSArIDFdLmltbSA9PSAwIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICBpbltpICsgMV0ub2ZmID09IDEgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIGluW2kgKyAyXS5jb2RlID09IChCUEZfSk1QIHwgQlBGX0NBTEwpIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICBpbltpICsgMl0uaW1tID09IEJQRl9GVU5DX3N5c19jbG9zZSkge1xcbi1cXHRcXHRcXHRjbGVhbnVwID0gaTtcXG4tXFx0XFx0XFx0YnJlYWs7XFxuLVxcdFxcdH1cXG4tXFx0fVxcbi1cXHRpZiAoIUFTU0VSVF9HRShjbGVhbnVwLCAwLCBcXFwiY2xlYW51cCBsYWJlbCBsb2NhdGVkXFxcIikpXFxuLVxcdFxcdHJldHVybjtcXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5iOyBpKyspIHtcXG4tXFx0XFx0dCA9IGJyW2ldICsgMSArIGluW2JyW2ldXS5vZmY7XFxuLVxcdFxcdEFTU0VSVF9FUSh0LCBjbGVhbnVwLCBcXFwic2lnLW1hdGNoIGxhbmRzIG9uIGNsZWFudXBcXFwiKTtcXG4tXFx0fVxcbi1cXHQvKlxcbi1cXHQgKiBTYW1lIGludmFyaWFudCBmb3IgZXZlcnkgb3RoZXIgY2xlYW51cC1ib3VuZCBqdW1wIGluIHRoZSBwcm9ncmFtOlxcbi1cXHQgKiBlbWl0X2NoZWNrX2VycigpIGlzIHRoZSBvbmx5IHNvdXJjZSBvZiBcXFwiaWYgKHI3IFxcdTAwM2MgMCkgZ290byBjbGVhbnVwXFxcIixcXG4tXFx0ICogc28gZWFjaCBvZiB0aG9zZSBtdXN0IGFsc28gcmVzb2x2ZSBleGFjdGx5IHRvIGNsZWFudXAuXFxuLVxcdCAqL1xcbi1cXHRmb3IgKGkgPSAwLCB0ID0gMDsgaSBcXHUwMDNjIG47IGkrKykge1xcbi1cXHRcXHRpZiAoaW5baV0uY29kZSAhPSAoQlBGX0pNUCB8IEJQRl9KU0xUIHwgQlBGX0spIHx8XFxuLVxcdFxcdCAgICBpbltpXS5kc3RfcmVnICE9IEJQRl9SRUdfNyB8fCBpbltpXS5pbW0gIT0gMCB8fCBpbltpXS5vZmYgXFx1MDAzZT0gMClcXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdEFTU0VSVF9FUShpICsgMSArIGluW2ldLm9mZiwgY2xlYW51cCwgXFxcImVyci1jaGVjayBsYW5kcyBvbiBjbGVhbnVwXFxcIik7XFxuLVxcdFxcdHQrKztcXG4tXFx0fVxcbi1cXHRBU1NFUlRfR1QodCwgMCwgXFxcImZvdW5kIGVtaXRfY2hlY2tfZXJyIGp1bXBzXFxcIik7XFxuLX1cXG4tXFxuIHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUge1xcbiBcXHRzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyICpza2VsO1xcbiBcXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9vcHRzIGdvcHRzO1xcbkBAIC0zNzIsMTYgKzI5MSw2IEBAIHN0YXRpYyB2b2lkIGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgKmYpXFxuIFxcdHRlc3Rfc2lnbmVkX2xvYWRlcl9fZGVzdHJveShmLVxcdTAwM2Vza2VsKTtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgbWV0YWRhdGFfY2hlY2tfc2hhcGUodm9pZClcXG4te1xcbi1cXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XFxuLVxcbi1cXHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXFx1MDAyNmYpID09IDApXFxuLVxcdFxcdGNoZWNrX3NpZ19tYXRjaF9zaGFwZSgoY29uc3Qgc3RydWN0IGJwZl9pbnNuICopZi5nb3B0cy5pbnNucyxcXG4tXFx0XFx0XFx0XFx0ICAgICAgZi5nb3B0cy5pbnNuc19zeiAvIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pKTtcXG4tXFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXFx1MDAyNmYpO1xcbi19XFxuLVxcbiBzdGF0aWMgdm9pZCBtZXRhZGF0YV9tYXRjaCh2b2lkKVxcbiB7XFxuIFxcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcXG5AQCAtMzkxLDk0ICszMDAsMjYzIEBAIHN0YXRpYyB2b2lkIG1ldGFkYXRhX21hdGNoKHZvaWQpXFxuIFxcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcXHUwMDI2ZikgPT0gMCkge1xcbiBcXHRcXHRyID0gcnVuX2dlbl9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLFxcbiBcXHRcXHRcXHRcXHQgICBmLmRhdGFfc3osIGYuZXhjbCwgc2l6ZW9mKGYuZXhjbCksIE5VTEwsIDAsXFxuLVxcdFxcdFxcdFxcdCAgIHRydWUsIGYuY3R4LCBmLmN0eF9zeiwgXFx1MDAyNnJhbik7XFxuK1xcdFxcdFxcdFxcdCAgIGYuY3R4LCBmLmN0eF9zeiwgXFx1MDAyNnJhbik7XFxuIFxcdFxcdEFTU0VSVF9UUlVFKHJhbiwgXFxcImxvYWRlciByYW5cXFwiKTtcXG4gXFx0XFx0QVNTRVJUX0VRKHIsIDAsIFxcXCJob25lc3QgbG9hZGVyIHJldHZhbFxcXCIpO1xcbiBcXHR9XFxuIFxcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFxcdTAwMjZmKTtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgbWV0YWRhdGFfc2hhX21pc21hdGNoKHZvaWQpXFxuK3N0YXRpYyB2b2lkIHNpZ25hdHVyZV9lbmZvcmNlZCh2b2lkKVxcbiB7XFxuK1xcdHN0YXRpYyBjb25zdCBfX3U4IGp1bmtbNjRdID0geyAweDMwLCAweDQyLCAweDEzLCAweDM3LCB9O1xcbiBcXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XFxuLVxcdGJvb2wgcmFuO1xcbi1cXHRpbnQgcjtcXG4rXFx0aW50IGZkO1xcbiBcXG4gXFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFxcdTAwMjZmKSA9PSAwKSB7XFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIGJsb2JbMF0gbGl2ZXMgaW4gdGhlIGxvYWRlcidzIGZkX2FycmF5IHNjcmF0Y2ggKGZpcnN0IGFkZF9kYXRhIGluXFxuLVxcdFxcdCAqIGJwZl9nZW5fX2luaXQpOyBhIDAtbWFwIHByb2dyYW0gbmV2ZXIgcmVhZHMgaXQsIHNvIGZsaXBwaW5nIGl0XFxuLVxcdFxcdCAqIGNoYW5nZXMgb25seSBtYXAtXFx1MDAzZXNoYS4gVGhlIG1ldGFkYXRhIGNoZWNrIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXRcXG4tXFx0XFx0ICogY2FuIG5vdGljZSAtXFx1MDAzZSBpc29sYXRlcyBlbWl0X3NpZ25hdHVyZV9tYXRjaC5cXG4rXFx0XFx0ICogQSBwcmVzZW50LWJ1dC1pbnZhbGlkIHNpZ25hdHVyZSAodGhlIGNlcnQgYnl0ZXMgYXJlIG5vdCBhXFxuK1xcdFxcdCAqIFBLQ1MjNyBzaWduYXR1cmUpIG11c3QgYmUgcmVqZWN0ZWQgYXQgbG9hZDogdGhlIHNpZ25hdHVyZVxcbitcXHRcXHQgKiBwYXRoIGlzIGhvbm9yZWQsIG5vdCBpZ25vcmVkLiAoVGhlIHZhbGlkIHBhdGggaXMgY292ZXJlZCBieVxcbitcXHRcXHQgKiB0aGUgc2lnbmVkIGxza2Vscy4pIFBpbiAtRUJBRE1TRywgdGhlIFBLQ1MjNyBwYXJzZSBmYWlsdXJlOlxcbitcXHRcXHQgKiBhIGxvb3NlciBmZCBcXHUwMDNjIDAgY2hlY2sgY291bGQgYWxzbyBiZSBzYXRpc2ZpZWQgYnkgdGhlIHNwYXJzZVxcbitcXHRcXHQgKiBmZF9hcnJheSByZWplY3Rpb24gKC1FQUNDRVMpIHRoYXQgdGhlIGxvYWRlcidzIG1hcCByZWZlcmVuY2VcXG4rXFx0XFx0ICogd291bGQgdHJpcCBldmVuIGlmIHRoZSBzaWduYXR1cmUgd2VyZSBzaWxlbnRseSBpZ25vcmVkLlxcbiBcXHRcXHQgKi9cXG4tXFx0XFx0Zi5ibG9iWzBdIF49IDB4ZmY7XFxuLVxcdFxcdHIgPSBydW5fZ2VuX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsXFxuLVxcdFxcdFxcdFxcdCAgIGYuZGF0YV9zeiwgZi5leGNsLCBzaXplb2YoZi5leGNsKSwgTlVMTCwgMCxcXG4tXFx0XFx0XFx0XFx0ICAgdHJ1ZSwgZi5jdHgsIGYuY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4tXFx0XFx0QVNTRVJUX1RSVUUocmFuLCBcXFwibG9hZGVyIHJhblxcXCIpO1xcbi1cXHRcXHRBU1NFUlRfRVEociwgLUVJTlZBTCwgXFxcInRhbXBlcmVkIGJsb2IgcmVqZWN0ZWQgYnkgZW1pdF9zaWduYXR1cmVfbWF0Y2hcXFwiKTtcXG4rXFx0XFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuayxcXG4rXFx0XFx0XFx0XFx0IHNpemVvZihqdW5rKSwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAwKTtcXG4rXFx0XFx0QVNTRVJUX0VRKGZkLCAtRUJBRE1TRywgXFxcImludmFsaWQgc2lnbmF0dXJlIHJlamVjdGVkIGF0IGxvYWRcXFwiKTtcXG4gXFx0fVxcbiBcXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcXHUwMDI2Zik7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIG1ldGFkYXRhX25vdF9leGNsdXNpdmUodm9pZClcXG4rc3RhdGljIHZvaWQgc2lnbmVkX25vbmV4Y2xfZmRfYXJyYXlfcmVqZWN0ZWQodm9pZClcXG4ge1xcbitcXHRzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHsgMHgzMCwgMHg0MiwgMHgxMywgMHgzNywgfTtcXG4gXFx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xcbi1cXHRib29sIHJhbjtcXG4tXFx0aW50IHI7XFxuK1xcdGludCBtYXBfZmQsIGZkO1xcbiBcXG4gXFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFxcdTAwMjZmKSA9PSAwKSB7XFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIENvcnJlY3QgYmxvYiBidXQgYSBub24tZXhjbHVzaXZlIG1ldGFkYXRhIG1hcDogdGhlIHZlcmlmaWVyIGRvZXNcXG4tXFx0XFx0ICogbm90IHJlamVjdCAoZXhjbF9wcm9nX3NoYSB1bnNldCksIHNvIHRoZSBydW50aW1lIG1hcC1cXHUwMDNlZXhjbCA9PSAxXFxuLVxcdFxcdCAqIGNoZWNrIGluIHRoZSBsb2FkZXIgbXVzdC5cXG4rXFx0XFx0ICogQSBzaWduZWQgcHJvZ3JhbSBtYXkgb25seSBiaW5kIGV4Y2x1c2l2ZSBtYXBzIHRocm91Z2ggZmRfYXJyYXlcXG4rXFx0XFx0ICogKHRoZWlyIGNvbnRlbnRzIGFyZSBmb2xkZWQgaW50byB0aGUgc2lnbmF0dXJlKS4gQmluZGluZyBhXFxuK1xcdFxcdCAqIG5vbi1leGNsdXNpdmUgbWFwIGlzIHJlamVjdGVkLCBiZWZvcmUgdGhlIHNpZ25hdHVyZSBpcyBldmVuXFxuK1xcdFxcdCAqIGV4YW1pbmVkLlxcbiBcXHRcXHQgKi9cXG4tXFx0XFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYixcXG4tXFx0XFx0XFx0XFx0ICAgZi5kYXRhX3N6LCBOVUxMLCAwLCBOVUxMLCAwLCB0cnVlLCBmLmN0eCxcXG4tXFx0XFx0XFx0XFx0ICAgZi5jdHhfc3osIFxcdTAwMjZyYW4pO1xcbi1cXHRcXHRBU1NFUlRfVFJVRShyYW4sIFxcXCJsb2FkZXIgcmFuXFxcIik7XFxuLVxcdFxcdEFTU0VSVF9FUShyLCAtRUlOVkFMLCBcXFwibm9uLWV4Y2x1c2l2ZSBtZXRhZGF0YSBtYXAgcmVqZWN0ZWRcXFwiKTtcXG4rXFx0XFx0bWFwX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZLCBcXFwibm9uZXhjbFxcXCIsIDQsXFxuK1xcdFxcdFxcdFxcdFxcdGYuZGF0YV9zeiwgMSwgTlVMTCk7XFxuK1xcdFxcdGlmIChBU1NFUlRfT0tfRkQobWFwX2ZkLCBcXFwibm9uZXhjbF9tYXBcXFwiKSkge1xcbitcXHRcXHRcXHRpZiAoQVNTRVJUX09LKGJwZl9tYXBfZnJlZXplKG1hcF9mZCksIFxcXCJmcmVlemVcXFwiKSkge1xcbitcXHRcXHRcXHRcXHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCBtYXBfZmQsIGp1bmssIHNpemVvZihqdW5rKSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7XFxuK1xcdFxcdFxcdFxcdEFTU0VSVF9FUShmZCwgLUVQRVJNLFxcbitcXHRcXHRcXHRcXHRcXHQgIFxcXCJub24tZXhjbHVzaXZlIG1hcCBpbiBzaWduZWQgZmRfYXJyYXkgcmVqZWN0ZWRcXFwiKTtcXG4rXFx0XFx0XFx0XFx0aWYgKGZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdFxcdFxcdFxcdGNsb3NlKGZkKTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRjbG9zZShtYXBfZmQpO1xcbitcXHRcXHR9XFxuIFxcdH1cXG4gXFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXFx1MDAyNmYpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBtZXRhZGF0YV9oYXNoX25vdF9jb21wdXRlZCh2b2lkKVxcbitzdGF0aWMgdm9pZCBzaWduZWRfdW5mcm96ZW5fZmRfYXJyYXlfcmVqZWN0ZWQodm9pZClcXG4ge1xcbitcXHRzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHsgMHgzMCwgMHg0MiwgMHgxMywgMHgzNywgfTtcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgbW9wdHMpO1xcbiBcXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XFxuLVxcdGJvb2wgcmFuO1xcbi1cXHRpbnQgcjtcXG4rXFx0X191MzIga2V5ID0gMDtcXG4rXFx0aW50IG1hcF9mZCwgZmQ7XFxuIFxcbiBcXHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXFx1MDAyNmYpID09IDApIHtcXG4gXFx0XFx0LypcXG4tXFx0XFx0ICogQ29ycmVjdCwgZXhjbHVzaXZlLCBmcm96ZW4gbWFwLCBidXQgaXRzIGhhc2ggd2FzIG5ldmVyIGNvbXB1dGVkXFxuLVxcdFxcdCAqIChubyBPQkpfR0VUX0lORk9fQllfRkQpLCBzbyBtYXAtXFx1MDAzZXNoYSBzdGF5cyB6ZXJvLiBUaGUgbG9hZGVyIG11c3RcXG4tXFx0XFx0ICogZmFpbCBjbG9zZWQgcmF0aGVyIHRoYW4gdHJlYXQgYW4gdW5zZXQgaGFzaCBhcyBhIG1hdGNoLlxcbitcXHRcXHQgKiBUaGUgbWV0YWRhdGEgbWFwIG11c3QgYmUgZnJvemVuIGJlZm9yZSBhIHNpZ25lZCBsb2FkIHNvIHRoZVxcbitcXHRcXHQgKiBmb2xkZWQgYnl0ZXMgY2Fubm90IGNoYW5nZSBhZnRlcndhcmRzLiBCaW5kIGFuIGV4Y2x1c2l2ZSBtYXBcXG4rXFx0XFx0ICogd2l0aCBtYXRjaGluZyBjb250ZW50cyBidXQgc2tpcCB0aGUgZnJlZXplOiB0aGUgbG9hZCBtdXN0IGJlXFxuK1xcdFxcdCAqIHJlamVjdGVkIGJ5IHRoZSBmcm96ZW4gY2hlY2sgd2l0aCAtRVBFUk0uIFRoZSBleGNsdXNpdml0eVxcbitcXHRcXHQgKiBjaGVjayByaWdodCBhZnRlciBpdCB3b3VsZCBwYXNzLCBzbyB0aGUgZXJybm8gdW5pcXVlbHkgcGluc1xcbitcXHRcXHQgKiB0aGUgZnJlZXplIHJlcXVpcmVtZW50LlxcbiBcXHRcXHQgKi9cXG4tXFx0XFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYixcXG4tXFx0XFx0XFx0XFx0ICAgZi5kYXRhX3N6LCBmLmV4Y2wsIHNpemVvZihmLmV4Y2wpLCBOVUxMLCAwLFxcbi1cXHRcXHRcXHRcXHQgICBmYWxzZSwgZi5jdHgsIGYuY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4tXFx0XFx0QVNTRVJUX1RSVUUocmFuLCBcXFwibG9hZGVyIHJhblxcXCIpO1xcbi1cXHRcXHRBU1NFUlRfRVEociwgLUVJTlZBTCwgXFxcInVuY29tcHV0ZWQgbWV0YWRhdGEgaGFzaCByZWplY3RlZFxcXCIpO1xcbitcXHRcXHRtb3B0cy5leGNsX3Byb2dfaGFzaCA9IGYuZXhjbDtcXG4rXFx0XFx0bW9wdHMuZXhjbF9wcm9nX2hhc2hfc2l6ZSA9IHNpemVvZihmLmV4Y2wpO1xcbitcXHRcXHRtYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVksIFxcXCJ1bmZyb3plblxcXCIsIDQsXFxuK1xcdFxcdFxcdFxcdFxcdGYuZGF0YV9zeiwgMSwgXFx1MDAyNm1vcHRzKTtcXG4rXFx0XFx0aWYgKEFTU0VSVF9PS19GRChtYXBfZmQsIFxcXCJ1bmZyb3plbl9tYXBcXFwiKSkge1xcbitcXHRcXHRcXHRpZiAoQVNTRVJUX09LKGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwX2ZkLCBcXHUwMDI2a2V5LCBmLmJsb2IsIDApLFxcbitcXHRcXHRcXHRcXHQgICAgICBcXFwidXBkYXRlXFxcIikpIHtcXG4rXFx0XFx0XFx0XFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgbWFwX2ZkLCBqdW5rLCBzaXplb2YoanVuayksXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDEpO1xcbitcXHRcXHRcXHRcXHRBU1NFUlRfRVEoZmQsIC1FUEVSTSxcXG4rXFx0XFx0XFx0XFx0XFx0ICBcXFwidW5mcm96ZW4gbWFwIGluIHNpZ25lZCBmZF9hcnJheSByZWplY3RlZFxcXCIpO1xcbitcXHRcXHRcXHRcXHRpZiAoZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0XFx0XFx0XFx0Y2xvc2UoZmQpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGNsb3NlKG1hcF9mZCk7XFxuK1xcdFxcdH1cXG4gXFx0fVxcbiBcXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcXHUwMDI2Zik7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIHNpZ25hdHVyZV9lbmZvcmNlZCh2b2lkKVxcbitzdGF0aWMgdm9pZCBzaWduZWRfbm9uYXJyYXlfZmRfYXJyYXlfcmVqZWN0ZWQodm9pZClcXG4ge1xcbiBcXHRzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHsgMHgzMCwgMHg0MiwgMHgxMywgMHgzNywgfTtcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgbW9wdHMpO1xcbiBcXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XFxuK1xcdGludCBtYXBfZmQsIGZkO1xcbitcXG4rXFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFxcdTAwMjZmKSA9PSAwKSB7XFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIE9ubHkgYSBwbGFpbiBCUEZfTUFQX1RZUEVfQVJSQVkgbWF5IGJlIGZvbGRlZCBpbnRvIHRoZVxcbitcXHRcXHQgKiBzaWduYXR1cmUuIEFuIGV4Y2x1c2l2ZSBtYXAgb2YgYW55IG90aGVyIHR5cGUgaXMgcmVqZWN0ZWRcXG4rXFx0XFx0ICogKC1FSU5WQUwpIHJhdGhlciB0aGFuIGZvbGRlZCAtIHRoaXMgaXMgdGhlIHR5cGUgZ2F0ZSB0aGF0XFxuK1xcdFxcdCAqIGtlZXBzIGFyZW5hIG1hcHMgKG1hcF9kaXJlY3RfdmFsdWVfYWRkcigpIHJldHVybnMgYSB1c2VyXFxuK1xcdFxcdCAqIGFkZHJlc3MpIGFuZCBpbnNuLWFycmF5IG1hcHMgKGJ1ZmZlciBzbWFsbGVyIHRoYW4gdmFsdWVfc2l6ZSlcXG4rXFx0XFx0ICogb3V0IG9mIHRoZSBoYXNoZWQgcmVnaW9uLCB3aGVyZSB0aGUgb2xkIGNvZGUgd291bGQgaGF2ZVxcbitcXHRcXHQgKiBtZW1jcHkoKSdkIGZyb20gdGhlbS4gQSBoYXNoIG1hcCBzdGFuZHMgaW4gaGVyZTogaXQgaXNcXG4rXFx0XFx0ICogZXhjbHVzaXZlIChib3VuZCB0byB0aGUgbG9hZGVyIGRpZ2VzdCkgYnV0IG5vdCBhbiBhcnJheS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdG1vcHRzLmV4Y2xfcHJvZ19oYXNoID0gZi5leGNsO1xcbitcXHRcXHRtb3B0cy5leGNsX3Byb2dfaGFzaF9zaXplID0gc2l6ZW9mKGYuZXhjbCk7XFxuK1xcdFxcdG1hcF9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9IQVNILCBcXFwiZXhjbF9oYXNoXFxcIiwgNCwgNCwgMSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx1MDAyNm1vcHRzKTtcXG4rXFx0XFx0aWYgKEFTU0VSVF9PS19GRChtYXBfZmQsIFxcXCJleGNsX2hhc2hfbWFwXFxcIikpIHtcXG4rXFx0XFx0XFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsXFxuK1xcdFxcdFxcdFxcdFxcdCBqdW5rLCBzaXplb2YoanVuayksXFxuK1xcdFxcdFxcdFxcdFxcdCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDEpO1xcbitcXHRcXHRcXHRBU1NFUlRfRVEoZmQsIC1FSU5WQUwsXFxuK1xcdFxcdFxcdFxcdCAgXFxcIm5vbi1hcnJheSBtYXAgaW4gc2lnbmVkIGZkX2FycmF5IHJlamVjdGVkXFxcIik7XFxuK1xcdFxcdFxcdGlmIChmZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRcXHRcXHRjbG9zZShmZCk7XFxuK1xcdFxcdFxcdGNsb3NlKG1hcF9mZCk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcXHUwMDI2Zik7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgc2V0dXBfbWV0YV9tYXAoY29uc3Qgc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSAqZik7XFxuK1xcbitzdGF0aWMgdm9pZCBzaWduZWRfYnRmX2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpXFxuK3tcXG4rXFx0Y2hhciBkaXJfdG1wbFtdID0gXFxcIi90bXAvc2lnbmVkX2xvYWRlcl9idGZYWFhYWFhcXFwiLCAqZGlyID0gTlVMTDtcXG4rXFx0X191MzIgc2lnX3N6ID0gODE5MjtcXG4rXFx0aW50IG1hcF9mZCA9IC0xLCBwcm9nX2ZkID0gLTE7XFxuK1xcdHVuc2lnbmVkIGNoYXIgKmJ1ZiA9IE5VTEw7XFxuK1xcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcXG4rXFx0Ym9vbCBoYXZlX2ZpeHR1cmUgPSBmYWxzZTtcXG4rXFx0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcXG4rXFx0dW5pb24gYnBmX2F0dHIgYXR0cjtcXG4rXFx0aW50IGZkc1syXTtcXG4rXFx0X191OCBzaWdbODE5Ml07XFxuK1xcbitcXHRzeXNjYWxsKF9fTlJfcmVxdWVzdF9rZXksIFxcXCJrZXlyaW5nXFxcIiwgXFxcIl91aWQuMFxcXCIsIE5VTEwsXFxuK1xcdFxcdEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XFxuK1xcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcXFwibWtkdGVtcFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcXFwic2V0dXBcXFwiLCBkaXIpLCBcXFwidmVyaWZ5X3NpZ19zZXR1cFxcXCIpKSB7XFxuK1xcdFxcdHJtZGlyKGRpcik7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXHRoYXZlX2ZpeHR1cmUgPSB0cnVlO1xcbitcXHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXFx1MDAyNmYpICE9IDApXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0LypcXG4rXFx0ICogZmRfYXJyYXkgYmluZHMgbWFwcyBhbmQgQlRGcyBhbGlrZSwgYnV0IG9ubHkgZXhjbHVzaXZlIGFycmF5IG1hcHMgYXJlXFxuK1xcdCAqIGZvbGRlZCBpbnRvIHRoZSBzaWduYXR1cmUuIEJ1aWxkIGFuIG90aGVyd2lzZSBnZW51aW5lbHkgc2lnbmVkIGxvYWQgLVxcbitcXHQgKiBpbnNucyB8fCBtZXRhZGF0YSwgZXhjbHVzaXZlIGZyb3plbiBtYXAgYXQgZmRfYXJyYXlbMF0gLSB0aGVuIHNtdWdnbGVcXG4rXFx0ICogYW4gZXh0cmEgQlRGIGludG8gZmRfYXJyYXlbMV0uIEEgc2lnbmVkIHByb2dyYW0gbWF5IG5vdCBiaW5kIGFueSBCVEYsXFxuK1xcdCAqIHNvIHJlc29sdmluZyB0aGUgZmRfYXJyYXkgZW50cmllcyByZWplY3RzIHRoZSBCVEYgd2l0aCAtRUFDQ0VTIChpblxcbitcXHQgKiBfX2FkZF91c2VkX2J0ZigpLCBiZWZvcmUgdGhlIHNpZ25hdHVyZSBpcyBldmVuIHZlcmlmaWVkKS5cXG4rXFx0ICovXFxuK1xcdGJ1ZiA9IG1hbGxvYygoc2l6ZV90KWYuZ29wdHMuaW5zbnNfc3ogKyBmLmRhdGFfc3opO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoYnVmLCBcXFwic2lnbmJ1ZlxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0bWVtY3B5KGJ1ZiwgZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeik7XFxuK1xcdG1lbWNweShidWYgKyBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsIGYuZGF0YV9zeik7XFxuK1xcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgYnVmLCBmLmdvcHRzLmluc25zX3N6ICsgZi5kYXRhX3N6LCBzaWcsXFxuK1xcdFxcdFxcdCAgICAgICBcXHUwMDI2c2lnX3N6KSwgXFxcInNpZ24gaW5zbnN8fG1ldGFkYXRhXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0bWFwX2ZkID0gc2V0dXBfbWV0YV9tYXAoXFx1MDAyNmYpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChtYXBfZmQsIFxcXCJtZXRhX21hcFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXFxcImJ0Zl9uZXdfZW1wdHlcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGJ0Zl9fYWRkX2ludChidGYsIFxcXCJpbnRcXFwiLCA0LCBCVEZfSU5UX1NJR05FRCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcXFwiYnRmX2xvYWRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRmZHNbMF0gPSBtYXBfZmQ7XFxuK1xcdGZkc1sxXSA9IGJ0Zl9fZmQoYnRmKTtcXG4rXFx0bWVtc2V0KFxcdTAwMjZhdHRyLCAwLCBzaXplb2YoYXR0cikpO1xcbitcXHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcXG4rXFx0YXR0ci5pbnNucyA9IHB0cl90b191NjQoZi5nb3B0cy5pbnNucyk7XFxuK1xcdGF0dHIuaW5zbl9jbnQgPSBmLmdvcHRzLmluc25zX3N6IC8gc2l6ZW9mKHN0cnVjdCBicGZfaW5zbik7XFxuK1xcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXFxcIkR1YWwgQlNEL0dQTFxcXCIpO1xcbitcXHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XFxuK1xcdGF0dHIuZmRfYXJyYXkgPSBwdHJfdG9fdTY0KGZkcyk7XFxuK1xcdGF0dHIuZmRfYXJyYXlfY250ID0gMjtcXG4rXFx0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XFxuK1xcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XFxuK1xcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcXG4rXFx0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcXFwiX19sb2FkZXIucHJvZ1xcXCIsIHNpemVvZihcXFwiX19sb2FkZXIucHJvZ1xcXCIpKTtcXG4rXFx0cHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFxcdTAwMjZhdHRyLFxcbitcXHRcXHRcXHQgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XFxuK1xcdEFTU0VSVF9FUShwcm9nX2ZkIFxcdTAwM2MgMCA/IC1lcnJubyA6IHByb2dfZmQsIC1FQUNDRVMsXFxuK1xcdFxcdCAgXFxcIkJURiBpbiBzaWduZWQgZmRfYXJyYXkgcmVqZWN0ZWRcXFwiKTtcXG4rXFx0aWYgKHByb2dfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UocHJvZ19mZCk7XFxuK291dDpcXG4rXFx0aWYgKGJ0ZilcXG4rXFx0XFx0YnRmX19mcmVlKGJ0Zik7XFxuK1xcdGlmIChtYXBfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UobWFwX2ZkKTtcXG4rXFx0aWYgKGhhdmVfZml4dHVyZSlcXG4rXFx0XFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXFx1MDAyNmYpO1xcbitcXHRpZiAoZGlyKVxcbitcXHRcXHRydW5fc2V0dXAoXFxcImNsZWFudXBcXFwiLCBkaXIpO1xcbitcXHRmcmVlKGJ1Zik7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHNpZ25hdHVyZV9mYWlsdXJlX2xvZ3Modm9pZClcXG4re1xcbitcXHRzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHsgMHgzMCwgMHg0MiwgMHgxMywgMHgzNywgfTtcXG4rXFx0Y2hhciBsb2dfYnVmWzEwMjRdID0ge307XFxuK1xcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcXG4rXFx0dW5pb24gYnBmX2F0dHIgYXR0cjtcXG4gXFx0aW50IGZkO1xcbiBcXG4gXFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFxcdTAwMjZmKSA9PSAwKSB7XFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIEEgcHJlc2VudC1idXQtaW52YWxpZCBzaWduYXR1cmUgKHRoZSBjZXJ0IGJ5dGVzIGFyZSBub3QgYVxcbi1cXHRcXHQgKiBQS0NTIzcgc2lnbmF0dXJlKSBtdXN0IGJlIHJlamVjdGVkIGF0IGxvYWQ6IHRoZSBzaWduYXR1cmVcXG4tXFx0XFx0ICogcGF0aCBpcyBob25vcmVkLCBub3QgaWdub3JlZC4gKFRoZSB2YWxpZCBwYXRoIGlzIGNvdmVyZWQgYnlcXG4tXFx0XFx0ICogdGhlIHNpZ25lZCBsc2tlbHMuKVxcbitcXHRcXHQgKiBTaWduYXR1cmUgdmVyaWZpY2F0aW9uIG5vdyBydW5zIGluc2lkZSBicGZfY2hlY2soKSwgc28gYVxcbitcXHRcXHQgKiBmYWlsdXJlIGlzIHJlcG9ydGVkIHRocm91Z2ggdGhlIHZlcmlmaWVyIGxvZy4gQSBwcmVzZW50LWJ1dC1cXG4rXFx0XFx0ICogaW52YWxpZCBzaWduYXR1cmUgaXMgcmVqZWN0ZWQgYW5kIHRoZSBsb2cgc2F5cyB3aHkuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLFxcbi1cXHRcXHRcXHRcXHQgc2l6ZW9mKGp1bmspLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xcbitcXHRcXHRtZW1zZXQoXFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XFxuK1xcdFxcdGF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMO1xcbitcXHRcXHRhdHRyLmluc25zID0gcHRyX3RvX3U2NChmLmdvcHRzLmluc25zKTtcXG4rXFx0XFx0YXR0ci5pbnNuX2NudCA9IGYuZ29wdHMuaW5zbnNfc3ogLyBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKTtcXG4rXFx0XFx0YXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NChcXFwiRHVhbCBCU0QvR1BMXFxcIik7XFxuK1xcdFxcdGF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTtcXG4rXFx0XFx0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KGp1bmspO1xcbitcXHRcXHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2l6ZW9mKGp1bmspO1xcbitcXHRcXHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XFxuK1xcdFxcdGF0dHIubG9nX2xldmVsID0gMTtcXG4rXFx0XFx0YXR0ci5sb2dfYnVmID0gcHRyX3RvX3U2NChsb2dfYnVmKTtcXG4rXFx0XFx0YXR0ci5sb2dfc2l6ZSA9IHNpemVvZihsb2dfYnVmKTtcXG4rXFx0XFx0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcXFwiX19sb2FkZXIucHJvZ1xcXCIsIHNpemVvZihcXFwiX19sb2FkZXIucHJvZ1xcXCIpKTtcXG4rXFxuK1xcdFxcdGZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXFx1MDAyNmF0dHIsXFxuK1xcdFxcdFxcdCAgICAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcXG4gXFx0XFx0QVNTRVJUX0xUKGZkLCAwLCBcXFwiaW52YWxpZCBzaWduYXR1cmUgcmVqZWN0ZWQgYXQgbG9hZFxcXCIpO1xcbitcXHRcXHRpZiAoZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0XFx0Y2xvc2UoZmQpO1xcbitcXHRcXHRBU1NFUlRfSEFTX1NVQlNUUihsb2dfYnVmLCBcXFwic2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWRcXFwiLFxcbitcXHRcXHRcXHRcXHQgIFxcXCJ2ZXJpZmllciBsb2dzIHNpZ25hdHVyZSBmYWlsdXJlXFxcIik7XFxuIFxcdH1cXG4gXFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXFx1MDAyNmYpO1xcbiB9XFxuQEAgLTQ5NSw3ICs1NzMsNyBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfdG9vX2xhcmdlKHZvaWQpXFxuIFxcdFxcdCAqIGlzIHJlamVjdGVkIGJlZm9yZSB0aGUgYnVmZmVyIGlzIHJlYWQuXFxuIFxcdFxcdCAqL1xcbiBcXHRcXHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLFxcbi1cXHRcXHRcXHRcXHQgNjQgXFx1MDAzY1xcdTAwM2MgMjAsIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XFxuK1xcdFxcdFxcdFxcdCA2NCBcXHUwMDNjXFx1MDAzYyAyMCwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAwKTtcXG4gXFx0XFx0QVNTRVJUX0VRKGZkLCAtRUlOVkFMLCBcXFwib3ZlcnNpemVkIHNpZ25hdHVyZSByZWplY3RlZFxcXCIpO1xcbiBcXHR9XFxuIFxcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFxcdTAwMjZmKTtcXG5AQCAtNTE1LDcgKzU5Myw3IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9iYWRfa2V5cmluZyh2b2lkKVxcbiBcXHRcXHQgKiBsYXJnZSBwb3NpdGl2ZSBzZXJpYWwgdGFrZXMgdGhlIHVzZXIta2V5cmluZyBwYXRoIGFuZCB3b24ndCBleGlzdC5cXG4gXFx0XFx0ICovXFxuIFxcdFxcdGZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgLTEsIGp1bmssXFxuLVxcdFxcdFxcdFxcdCBzaXplb2YoanVuayksIElOVF9NQVgpO1xcbitcXHRcXHRcXHRcXHQgc2l6ZW9mKGp1bmspLCBJTlRfTUFYLCAwKTtcXG4gXFx0XFx0QVNTRVJUX0VRKGZkLCAtRUlOVkFMLCBcXFwic2lnbmF0dXJlIHdpdGggYmFkIGtleXJpbmdfaWQgcmVqZWN0ZWRcXFwiKTtcXG4gXFx0fVxcbiBcXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcXHUwMDI2Zik7XFxuQEAgLTU3NSw3ICs2NTMsNyBAQCBzdGF0aWMgdm9pZCBtZXRhZGF0YV9jdHhfbWF4X2VudHJpZXNfaWdub3JlZCh2b2lkKVxcbiBcXHRtZW1jcHkoYmxvYiwgZ29wdHMuZGF0YSwgZGF0YV9zeik7XFxuIFxcbiBcXHRyID0gcnVuX2dlbl9sb2FkZXIoZ29wdHMuaW5zbnMsIGdvcHRzLmluc25zX3N6LCBibG9iLCBkYXRhX3N6LFxcbi1cXHRcXHRcXHQgICBleGNsLCBzaXplb2YoZXhjbCksIE5VTEwsIDAsIHRydWUsIGN0eCwgY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4rXFx0XFx0XFx0ICAgZXhjbCwgc2l6ZW9mKGV4Y2wpLCBOVUxMLCAwLCBjdHgsIGN0eF9zeiwgXFx1MDAyNnJhbik7XFxuIFxcdGlmICghQVNTRVJUX1RSVUUocmFuLCBcXFwibG9hZGVyIHJhblxcXCIpIHx8XFxuIFxcdCAgICAhQVNTRVJUX0VRKHIsIDAsIFxcXCJsb2FkZXIgcmV0dmFsXFxcIikpXFxuIFxcdFxcdGdvdG8gZnJlZV9ibG9iO1xcbkBAIC02NjEsNyArNzM5LDcgQEAgc3RhdGljIHZvaWQgbWV0YWRhdGFfY3R4X2luaXRpYWxfdmFsdWVfaWdub3JlZCh2b2lkKVxcbiBcXHRtZW1jcHkoYmxvYiwgZ29wdHMuZGF0YSwgZGF0YV9zeik7XFxuIFxcbiBcXHRyID0gcnVuX2dlbl9sb2FkZXIoZ29wdHMuaW5zbnMsIGdvcHRzLmluc25zX3N6LCBibG9iLCBkYXRhX3N6LFxcbi1cXHRcXHRcXHQgICBleGNsLCBzaXplb2YoZXhjbCksIE5VTEwsIDAsIHRydWUsIGN0eCwgY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4rXFx0XFx0XFx0ICAgZXhjbCwgc2l6ZW9mKGV4Y2wpLCBOVUxMLCAwLCBjdHgsIGN0eF9zeiwgXFx1MDAyNnJhbik7XFxuIFxcdGlmICghQVNTRVJUX1RSVUUocmFuLCBcXFwibG9hZGVyIHJhblxcXCIpIHx8XFxuIFxcdCAgICAhQVNTRVJUX0VRKHIsIDAsIFxcXCJsb2FkZXIgcmV0dmFsXFxcIikpXFxuIFxcdFxcdGdvdG8gZnJlZV9ibG9iO1xcbkBAIC03MTQsNiArNzkyLDcgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX2F1dGhlbnRpY2F0ZXNfaW5zbnModm9pZClcXG4gXFx0X191OCBleGNsW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXSwgc2lnWzgxOTJdO1xcbiBcXHRfX3UzMiBzaWdfc3ogPSBzaXplb2Yoc2lnKSwgaW5zbnNfc3osIGRhdGFfc3osIGN0eF9zejtcXG4gXFx0dW5zaWduZWQgY2hhciAqaW5zbnMgPSBOVUxMLCAqdGFtcGVyZWQgPSBOVUxMLCAqYmxvYiA9IE5VTEw7XFxuK1xcdHVuc2lnbmVkIGNoYXIgKnNpZ25idWYgPSBOVUxMO1xcbiBcXHRpbnQgbnJfbWFwcyA9IDAsIG5yX3Byb2dzID0gMCwgcjtcXG4gXFx0c3RydWN0IGJwZl9wcm9ncmFtICpwO1xcbiBcXHRzdHJ1Y3QgYnBmX21hcCAqbTtcXG5AQCAtNzYwLDI5ICs4MzksMTQxIEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX2luc25zKHZvaWQpXFxuIFxcdG1lbWNweShibG9iLCBnb3B0cy5kYXRhLCBkYXRhX3N6KTtcXG4gXFx0bGliYnBmX3NoYTI1NihpbnNucywgaW5zbnNfc3osIGV4Y2wpO1xcbiBcXG4tXFx0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBpbnNucywgaW5zbnNfc3osIHNpZywgXFx1MDAyNnNpZ19zeiksIFxcXCJzaWduLWZpbGVcXFwiKSlcXG4rXFx0c2lnbmJ1ZiA9IG1hbGxvYygoc2l6ZV90KWluc25zX3N6ICsgZGF0YV9zeik7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihzaWduYnVmLCBcXFwic2lnbmJ1ZlxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdG1lbWNweShzaWduYnVmLCBpbnNucywgaW5zbnNfc3opO1xcbitcXHRtZW1jcHkoc2lnbmJ1ZiArIGluc25zX3N6LCBibG9iLCBkYXRhX3N6KTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBzaWduYnVmLCBpbnNuc19zeiArIGRhdGFfc3osIHNpZywgXFx1MDAyNnNpZ19zeiksXFxuK1xcdFxcdCAgICAgICBcXFwic2lnbi1maWxlXFxcIikpXFxuIFxcdFxcdGdvdG8gY2xlYW51cDtcXG4gXFxuIFxcdG1lbXNldChjdHgsIDAsIGN0eF9zeik7XFxuIFxcdCgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS1cXHUwMDNlc3ogPSBjdHhfc3o7XFxuIFxcdHIgPSBydW5fZ2VuX2xvYWRlcihpbnNucywgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osIGV4Y2wsIHNpemVvZihleGNsKSxcXG4tXFx0XFx0XFx0ICAgc2lnLCBzaWdfc3osIHRydWUsIGN0eCwgY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4rXFx0XFx0XFx0ICAgc2lnLCBzaWdfc3osIGN0eCwgY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4gXFx0QVNTRVJUX1RSVUUocmFuLCBcXFwidmFsaWQgc2lnbmF0dXJlOiBsb2FkZXIgbG9hZGVkIGFuZCByYW5cXFwiKTtcXG4gXFx0QVNTRVJUX0VRKHIsIDAsIFxcXCJ2YWxpZCBzaWduYXR1cmUgYWNjZXB0ZWRcXFwiKTtcXG4gXFx0Y2xvc2VfbG9hZGVyX2N0eF9mZHMoY3R4LCBucl9tYXBzLCBucl9wcm9ncyk7XFxuIFxcbiBcXHRtZW1jcHkodGFtcGVyZWQsIGluc25zLCBpbnNuc19zeik7XFxuIFxcdHRhbXBlcmVkW2luc25zX3N6IC8gMl0gXj0gMHhmZjtcXG4rXFx0LypcXG4rXFx0ICogQmluZCB0aGUgbWV0YWRhdGEgbWFwIHRvIHRoZSB0YW1wZXJlZCBsb2FkZXIncyBvd24gZGlnZXN0LCBzbyB0aGVcXG4rXFx0ICogdmVyaWZpZXIncyBleGNsdXNpdmUtbWFwIGNoZWNrIChleGNsX3Byb2dfc2hhID09IHByb2ctXFx1MDAzZWRpZ2VzdCkgcGFzc2VzXFxuK1xcdCAqIGFuZCB0aGUgc2lnbmF0dXJlIC0gdmVyaWZpZWQgYWZ0ZXIgdGhlIG1hcHMgYXJlIHJlc29sdmVkIC0gaXMgd2hhdFxcbitcXHQgKiByZWplY3RzIHRoZSBsb2FkLiBUaGlzIGlzIHRoZSBhdHRhY2tlcidzIGJlc3QgY2FzZTogZXZlbiBhZnRlclxcbitcXHQgKiByZS1iaW5kaW5nIHRoZSBleGNsdXNpdmUgbWFwIHRvIHRoZWlyIHRhbXBlcmVkIGxvYWRlciwgdGhlIHNpZ25hdHVyZVxcbitcXHQgKiBvdmVyIHRoZSBvcmlnaW5hbCBpbnNucyB8fCBtZXRhZGF0YSBzdGlsbCBmYWlscy4gKExlYXZpbmcgdGhlIG1hcFxcbitcXHQgKiBib3VuZCB0byB0aGUgb3JpZ2luYWwgZGlnZXN0IHdvdWxkIGluc3RlYWQgdHJpcCB0aGUgZXhjbCBjaGVjayBmaXJzdC4pXFxuK1xcdCAqL1xcbitcXHRsaWJicGZfc2hhMjU2KHRhbXBlcmVkLCBpbnNuc19zeiwgZXhjbCk7XFxuIFxcdG1lbXNldChjdHgsIDAsIGN0eF9zeik7XFxuIFxcdCgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS1cXHUwMDNlc3ogPSBjdHhfc3o7XFxuIFxcdHIgPSBydW5fZ2VuX2xvYWRlcih0YW1wZXJlZCwgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osIGV4Y2wsIHNpemVvZihleGNsKSxcXG4tXFx0XFx0XFx0ICAgc2lnLCBzaWdfc3osIHRydWUsIGN0eCwgY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4rXFx0XFx0XFx0ICAgc2lnLCBzaWdfc3osIGN0eCwgY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4gXFx0QVNTRVJUX0ZBTFNFKHJhbiwgXFxcInRhbXBlcmVkIGxvYWRlciByZWplY3RlZCBiZWZvcmUgcnVuXFxcIik7XFxuIFxcdEFTU0VSVF9FUShyLCAtRUtFWVJFSkVDVEVELCBcXFwic2lnbmF0dXJlIGlzIGJvdW5kIHRvIHRoZSBpbnN0cnVjdGlvbnNcXFwiKTtcXG4gY2xlYW51cDpcXG4gXFx0ZnJlZShpbnNucyk7XFxuIFxcdGZyZWUodGFtcGVyZWQpO1xcbiBcXHRmcmVlKGJsb2IpO1xcbitcXHRmcmVlKHNpZ25idWYpO1xcbitcXHRmcmVlKGN0eCk7XFxuK1xcdHRlc3Rfc2lnbmVkX2xvYWRlcl9fZGVzdHJveShza2VsKTtcXG4rXFx0cnVuX3NldHVwKFxcXCJjbGVhbnVwXFxcIiwgZGlyKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgc2lnbmF0dXJlX2F1dGhlbnRpY2F0ZXNfbWV0YWRhdGEodm9pZClcXG4re1xcbitcXHRMSUJCUEZfT1BUUyhnZW5fbG9hZGVyX29wdHMsIGdvcHRzLCAuZ2VuX2hhc2ggPSB0cnVlKTtcXG4rXFx0Y2hhciBkaXJfdG1wbFtdID0gXFxcIi90bXAvc2lnbmVkX2xvYWRlclhYWFhYWFxcXCIsICpkaXI7XFxuK1xcdHN0cnVjdCB0ZXN0X3NpZ25lZF9sb2FkZXIgKnNrZWwgPSBOVUxMO1xcbitcXHRfX3U4IGV4Y2xbU0hBMjU2X0RJR0VTVF9MRU5HVEhdLCBzaWdbODE5Ml07XFxuK1xcdF9fdTMyIHNpZ19zeiA9IHNpemVvZihzaWcpLCBpbnNuc19zeiwgZGF0YV9zeiwgY3R4X3N6O1xcbitcXHR1bnNpZ25lZCBjaGFyICppbnNucyA9IE5VTEwsICpibG9iID0gTlVMTDtcXG4rXFx0dW5zaWduZWQgY2hhciAqc2lnbmJ1ZiA9IE5VTEw7XFxuK1xcdGludCBucl9tYXBzID0gMCwgbnJfcHJvZ3MgPSAwLCByO1xcbitcXHRzdHJ1Y3QgYnBmX3Byb2dyYW0gKnA7XFxuK1xcdHN0cnVjdCBicGZfbWFwICptO1xcbitcXHR2b2lkICpjdHggPSBOVUxMO1xcbitcXHRib29sIHJhbjtcXG4rXFxuK1xcdHN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgXFxcImtleXJpbmdcXFwiLCBcXFwiX3VpZC4wXFxcIiwgTlVMTCxcXG4rXFx0XFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcXG4rXFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFxcXCJta2R0ZW1wXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFxcXCJzZXR1cFxcXCIsIGRpciksIFxcXCJ2ZXJpZnlfc2lnX3NldHVwXFxcIikpIHtcXG4rXFx0XFx0cm1kaXIoZGlyKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbitcXHRza2VsID0gdGVzdF9zaWduZWRfbG9hZGVyX19vcGVuKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwic2tlbF9vcGVuXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKCFBU1NFUlRfT0soYnBmX29iamVjdF9fZ2VuX2xvYWRlcihza2VsLVxcdTAwM2VvYmosIFxcdTAwMjZnb3B0cyksIFxcXCJnZW5fbG9hZGVyXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKCFBU1NFUlRfT0soYnBmX29iamVjdF9fbG9hZChza2VsLVxcdTAwM2VvYmopLCBcXFwiZ2VuX2xvYWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0YnBmX29iamVjdF9fZm9yX2VhY2hfcHJvZ3JhbShwLCBza2VsLVxcdTAwM2VvYmopXFxuK1xcdFxcdG5yX3Byb2dzKys7XFxuK1xcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX21hcChtLCBza2VsLVxcdTAwM2VvYmopXFxuK1xcdFxcdG5yX21hcHMrKztcXG4rXFx0Y3R4X3N6ID0gc2l6ZW9mKHN0cnVjdCBicGZfbG9hZGVyX2N0eCkgK1xcbitcXHRcXHQgbnJfbWFwcyAqIHNpemVvZihzdHJ1Y3QgYnBmX21hcF9kZXNjKSArXFxuK1xcdFxcdCBucl9wcm9ncyAqIHNpemVvZihzdHJ1Y3QgYnBmX3Byb2dfZGVzYyk7XFxuK1xcdGluc25zX3N6ID0gZ29wdHMuaW5zbnNfc3o7XFxuK1xcdGRhdGFfc3ogPSBnb3B0cy5kYXRhX3N6O1xcbitcXHRjdHggPSBjYWxsb2MoMSwgY3R4X3N6KTtcXG4rXFx0aW5zbnMgPSBtYWxsb2MoaW5zbnNfc3opO1xcbitcXHRibG9iID0gbWFsbG9jKGRhdGFfc3opO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoY3R4LCBcXFwiY3R4XFxcIikgfHxcXG4rXFx0ICAgICFBU1NFUlRfT0tfUFRSKGluc25zLCBcXFwiaW5zbnNcXFwiKSB8fFxcbitcXHQgICAgIUFTU0VSVF9PS19QVFIoYmxvYiwgXFxcImJsb2JcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRtZW1jcHkoaW5zbnMsIGdvcHRzLmluc25zLCBpbnNuc19zeik7XFxuK1xcdG1lbWNweShibG9iLCBnb3B0cy5kYXRhLCBkYXRhX3N6KTtcXG4rXFx0bGliYnBmX3NoYTI1NihpbnNucywgaW5zbnNfc3osIGV4Y2wpO1xcbitcXG4rXFx0c2lnbmJ1ZiA9IG1hbGxvYygoc2l6ZV90KWluc25zX3N6ICsgZGF0YV9zeik7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihzaWduYnVmLCBcXFwic2lnbmJ1ZlxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdG1lbWNweShzaWduYnVmLCBpbnNucywgaW5zbnNfc3opO1xcbitcXHRtZW1jcHkoc2lnbmJ1ZiArIGluc25zX3N6LCBibG9iLCBkYXRhX3N6KTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBzaWduYnVmLCBpbnNuc19zeiArIGRhdGFfc3osIHNpZywgXFx1MDAyNnNpZ19zeiksXFxuK1xcdFxcdCAgICAgICBcXFwic2lnbi1maWxlXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdG1lbXNldChjdHgsIDAsIGN0eF9zeik7XFxuK1xcdCgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS1cXHUwMDNlc3ogPSBjdHhfc3o7XFxuK1xcdHIgPSBydW5fZ2VuX2xvYWRlcihpbnNucywgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osIGV4Y2wsIHNpemVvZihleGNsKSxcXG4rXFx0XFx0XFx0ICAgc2lnLCBzaWdfc3osIGN0eCwgY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4rXFx0QVNTRVJUX1RSVUUocmFuLCBcXFwidmFsaWQgc2lnbmF0dXJlOiBsb2FkZXIgbG9hZGVkIGFuZCByYW5cXFwiKTtcXG4rXFx0QVNTRVJUX0VRKHIsIDAsIFxcXCJ2YWxpZCBzaWduYXR1cmUgYWNjZXB0ZWRcXFwiKTtcXG4rXFx0Y2xvc2VfbG9hZGVyX2N0eF9mZHMoY3R4LCBucl9tYXBzLCBucl9wcm9ncyk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUYW1wZXIgdGhlIG1ldGFkYXRhIGFmdGVyIHNpZ25pbmcgd2hpbGUgbGVhdmluZyB0aGUgaW5zdHJ1Y3Rpb25zXFxuK1xcdCAqIGFuZCB0aHVzIHRoZSBleGNsdXNpdmUgaGFzaCBiaW5kaW5nIHVudG91Y2hlZDogdGhlIG1hcCBmcmVlemVzXFxuK1xcdCAqIGZpbmUgYW5kIGV4Y2xfcHJvZ19zaGEgc3RpbGwgbWF0Y2hlcyB0aGUgbG9hZGVyJ3MgZGlnZXN0LCBzbyB0aGVcXG4rXFx0ICogbG9hZCByZWFjaGVzIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24sIHdoaWNoIGZvbGRzIHRoZSBsaXZlIGZyb3plblxcbitcXHQgKiBtYXAgYnl0ZXMgaW50byB0aGUgY2hlY2tlZCBwYXlsb2FkIGFuZCBtdXN0IHJlamVjdCB0aGUgbW9kaWZpZWRcXG4rXFx0ICogYmxvYi4gQSBrZXJuZWwgZm9sZGluZyBhbnl0aGluZyBidXQgdGhlIG1hcCBjb250ZW50cyB0aGVtc2VsdmVzXFxuK1xcdCAqIHdvdWxkIHdyb25nbHkgYWNjZXB0IHRoaXMgbG9hZC5cXG4rXFx0ICovXFxuK1xcdGJsb2JbZGF0YV9zeiAvIDJdIF49IDB4ZmY7XFxuK1xcdG1lbXNldChjdHgsIDAsIGN0eF9zeik7XFxuK1xcdCgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS1cXHUwMDNlc3ogPSBjdHhfc3o7XFxuK1xcdHIgPSBydW5fZ2VuX2xvYWRlcihpbnNucywgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osIGV4Y2wsIHNpemVvZihleGNsKSxcXG4rXFx0XFx0XFx0ICAgc2lnLCBzaWdfc3osIGN0eCwgY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4rXFx0QVNTRVJUX0ZBTFNFKHJhbiwgXFxcInRhbXBlcmVkIG1ldGFkYXRhIHJlamVjdGVkIGJlZm9yZSBydW5cXFwiKTtcXG4rXFx0QVNTRVJUX0VRKHIsIC1FS0VZUkVKRUNURUQsIFxcXCJzaWduYXR1cmUgaXMgYm91bmQgdG8gdGhlIG1ldGFkYXRhXFxcIik7XFxuK2NsZWFudXA6XFxuK1xcdGZyZWUoaW5zbnMpO1xcbitcXHRmcmVlKGJsb2IpO1xcbitcXHRmcmVlKHNpZ25idWYpO1xcbiBcXHRmcmVlKGN0eCk7XFxuIFxcdHRlc3Rfc2lnbmVkX2xvYWRlcl9fZGVzdHJveShza2VsKTtcXG4gXFx0cnVuX3NldHVwKFxcXCJjbGVhbnVwXFxcIiwgZGlyKTtcXG5AQCAtMTAwNywxMCArMTE5OCwxMSBAQCBzdGF0aWMgdm9pZCBsc21fc2lnbmF0dXJlX3ZlcmRpY3Qodm9pZClcXG4ge1xcbiBcXHRjaGFyIGRpcl90bXBsW10gPSBcXFwiL3RtcC9zaWduZWRfbG9hZGVyX2xzbVhYWFhYWFxcXCIsICpkaXIgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyX2xzbSAqbHNtID0gTlVMTDtcXG4rXFx0X191MzIgc2lnX3N6ID0gODE5MiwgbXNpZ19zeiA9IDgxOTI7XFxuIFxcdGludCBtYXBfZmQgPSAtMSwgcHJvZ19mZCA9IC0xO1xcbiBcXHRib29sIGhhdmVfZml4dHVyZSA9IGZhbHNlO1xcbiBcXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XFxuLVxcdF9fdTMyIHNpZ19zeiA9IDgxOTI7XFxuK1xcdHVuc2lnbmVkIGNoYXIgKmJ1ZjtcXG4gXFx0X19zMzIgc2VzX3NlcmlhbDtcXG4gXFx0X191OCBzaWdbODE5Ml07XFxuIFxcbkBAIC0xMDI5LDcgKzEyMjEsNyBAQCBzdGF0aWMgdm9pZCBsc21fc2lnbmF0dXJlX3ZlcmRpY3Qodm9pZClcXG4gXFx0aWYgKCFBU1NFUlRfT0tfRkQobWFwX2ZkLCBcXFwibWV0YV9tYXBfdW5zaWduZWRcXFwiKSlcXG4gXFx0XFx0Z290byBvdXQ7XFxuIFxcdGxzbS1cXHUwMDNlYnNzLVxcdTAwM2VzZWVuID0gMDtcXG4tXFx0cHJvZ19mZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIG1hcF9mZCwgTlVMTCwgMCwgMCk7XFxuK1xcdHByb2dfZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsIE5VTEwsIDAsIDAsIDApO1xcbiBcXHRjbG9zZShtYXBfZmQpO1xcbiBcXHRtYXBfZmQgPSAtMTtcXG4gXFx0aWYgKCFBU1NFUlRfT0tfRkQocHJvZ19mZCwgXFxcInVuc2lnbmVkIGxvYWRlciBsb2FkXFxcIikpXFxuQEAgLTEwNjIsMjIgKzEyNTQsNTEgQEAgc3RhdGljIHZvaWQgbHNtX3NpZ25hdHVyZV92ZXJkaWN0KHZvaWQpXFxuIFxcdFxcdGdvdG8gb3V0O1xcbiBcXHRsc20tXFx1MDAzZWJzcy1cXHUwMDNlc2VlbiA9IDA7XFxuIFxcdHByb2dfZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsIHNpZyxcXG4tXFx0XFx0XFx0ICAgICAgc2lnX3N6LCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xcbitcXHRcXHRcXHQgICAgICBzaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCk7XFxuIFxcdGNsb3NlKG1hcF9mZCk7XFxuIFxcdG1hcF9mZCA9IC0xO1xcbi1cXHRpZiAoIUFTU0VSVF9PS19GRChwcm9nX2ZkLCBcXFwic2lnbmVkIGxvYWRlciBsb2FkXFxcIikpXFxuLVxcdFxcdGdvdG8gb3V0O1xcbi1cXHRjbG9zZShwcm9nX2ZkKTtcXG4rXFx0QVNTRVJUX0VRKHByb2dfZmQsIC1FQUNDRVMsIFxcXCJ1bmZvbGRlZCBtZXRhZGF0YSByZWplY3RlZFxcXCIpO1xcbitcXHRpZiAocHJvZ19mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShwcm9nX2ZkKTtcXG4gXFx0cHJvZ19mZCA9IC0xO1xcbiBcXG4gXFx0c2VzX3NlcmlhbCA9IHN5c2NhbGwoX19OUl9rZXljdGwsIEtFWUNUTF9HRVRfS0VZUklOR19JRCxcXG4gXFx0XFx0XFx0ICAgICBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDApO1xcbiBcXHRBU1NFUlRfRVEobHNtLVxcdTAwM2Vic3MtXFx1MDAzZXNlZW4sIDEsIFxcXCJzaWduZWQ6IG9uZSBvYnNlcnZlZCBsb2FkXFxcIik7XFxuLVxcdEFTU0VSVF9FUShsc20tXFx1MDAzZWJzcy1cXHUwMDNlc2lnX3ZlcmRpY3QsIEJQRl9TSUdfVkVSSUZJRUQsIFxcXCJzaWduZWQgdmVyZGljdFxcXCIpO1xcbitcXHRBU1NFUlRfRVEobHNtLVxcdTAwM2Vic3MtXFx1MDAzZXNpZ192ZXJkaWN0LCBCUEZfU0lHX1ZFUklGSUVELFxcbitcXHRcXHQgIFxcXCJhZG1pc3Npb24gc2F3IGEgdmFsaWQgc2lnbmF0dXJlXFxcIik7XFxuIFxcdEFTU0VSVF9FUShsc20tXFx1MDAzZWJzcy1cXHUwMDNlc2lnX2tleXJpbmdfdHlwZSwgQlBGX1NJR19LRVlSSU5HX1VTRVIsIFxcXCJzaWduZWQga2V5cmluZyB0eXBlXFxcIik7XFxuIFxcdEFTU0VSVF9HVChzZXNfc2VyaWFsLCAwLCBcXFwic2Vzc2lvbiBrZXlyaW5nIHNlcmlhbCByZXNvbHZlZFxcXCIpO1xcbiBcXHRBU1NFUlRfRVEobHNtLVxcdTAwM2Vic3MtXFx1MDAzZXNpZ19rZXlyaW5nX3NlcmlhbCwgc2VzX3NlcmlhbCxcXG4gXFx0XFx0ICBcXFwic2lnbmVkOiB2YWxpZGF0ZWQgYWdhaW5zdCBzZXNzaW9uIGtleXJpbmdcXFwiKTtcXG4rXFxuK1xcdGJ1ZiA9IG1hbGxvYygoc2l6ZV90KWYuZ29wdHMuaW5zbnNfc3ogKyBmLmRhdGFfc3opO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoYnVmLCBcXFwibWV0YV9zaWduYnVmXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRtZW1jcHkoYnVmLCBmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6KTtcXG4rXFx0bWVtY3B5KGJ1ZiArIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYiwgZi5kYXRhX3N6KTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBidWYsIGYuZ29wdHMuaW5zbnNfc3ogKyBmLmRhdGFfc3osXFxuK1xcdFxcdFxcdFxcdHNpZywgXFx1MDAyNm1zaWdfc3opLCBcXFwic2lnbiBpbnNuc3x8bWV0YWRhdGFcXFwiKSkge1xcbitcXHRcXHRmcmVlKGJ1Zik7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdGZyZWUoYnVmKTtcXG4rXFxuK1xcdG1hcF9mZCA9IHNldHVwX21ldGFfbWFwKFxcdTAwMjZmKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQobWFwX2ZkLCBcXFwibWV0YV9tYXBfYm91bmRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGxzbS1cXHUwMDNlYnNzLVxcdTAwM2VzZWVuID0gMDtcXG4rXFx0cHJvZ19mZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIG1hcF9mZCwgc2lnLFxcbitcXHRcXHRcXHQgICAgICBtc2lnX3N6LCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDEpO1xcbitcXHRjbG9zZShtYXBfZmQpO1xcbitcXHRtYXBfZmQgPSAtMTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQocHJvZ19mZCwgXFxcIm1ldGFkYXRhLWJvdW5kIGxvYWRlciBsb2FkXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRjbG9zZShwcm9nX2ZkKTtcXG4rXFx0cHJvZ19mZCA9IC0xO1xcbitcXHRBU1NFUlRfRVEobHNtLVxcdTAwM2Vic3MtXFx1MDAzZXNlZW4sIDEsIFxcXCJtZXRhZGF0YTogb25lIG9ic2VydmVkIGxvYWRcXFwiKTtcXG4rXFx0QVNTRVJUX0VRKGxzbS1cXHUwMDNlYnNzLVxcdTAwM2VzaWdfdmVyZGljdCwgQlBGX1NJR19WRVJJRklFRCxcXG4rXFx0XFx0ICBcXFwibWV0YWRhdGEtYm91bmQgdmVyZGljdFxcXCIpO1xcbiBvdXQ6XFxuIFxcdGlmIChtYXBfZmQgXFx1MDAzZT0gMClcXG4gXFx0XFx0Y2xvc2UobWFwX2ZkKTtcXG5AQCAtMTA5MCwyMCArMTMxMSw0NjcgQEAgc3RhdGljIHZvaWQgbHNtX3NpZ25hdHVyZV92ZXJkaWN0KHZvaWQpXFxuIFxcdHRlc3Rfc2lnbmVkX2xvYWRlcl9sc21fX2Rlc3Ryb3kobHNtKTtcXG4gfVxcbiBcXG4rLypcXG4rICogTG9hZC10aW1lIG1ldGFkYXRhIHZlcmlmaWNhdGlvbjogdGhlIGtlcm5lbCBmb2xkcyB0aGUgZnJvemVuIG1ldGFkYXRhIG1hcFxcbisgKiBpbnRvIHRoZSBzaWduYXR1cmUgKGluc25zIHx8IG1ldGFkYXRhKSBhbmQgY2hlY2tzIGl0IGF0IEJQRl9QUk9HX0xPQUQgdmlhXFxuKyAqIGZkX2FycmF5X2NudCwgcmF0aGVyIHRoYW4gdGhlIGxvYWRlciBjaGVja2luZyBmcm9tIHdpdGhpbiBCUEYuIFNpZ24gdGhhdFxcbisgKiBjb25jYXRlbmF0aW9uLCBoYW5kIHRoZSBrZXJuZWwgdGhlIG1hcCwgYW5kIGNvbmZpcm0gdGhlIHNpZ25lZCBsb2FkZXIgbG9hZHMsXFxuKyAqIHJ1bnMsIGFuZCBpbnN0YWxscyBpdHMgdGFyZ2V0LlxcbisgKi9cXG4rc3RhdGljIGludCBsb2FkdGltZV9kcml2ZShjb25zdCBjaGFyICpkaXIsIGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeixcXG4rXFx0XFx0XFx0ICBjb25zdCB2b2lkICpkYXRhLCBfX3UzMiBkYXRhX3N6LCBjb25zdCBfX3U4ICpleGNsLFxcbitcXHRcXHRcXHQgIHZvaWQgKmN0eCwgX191MzIgY3R4X3N6LCBpbnQgKmxvYWRfcmV0LCBib29sICpyYW4pXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgbW9wdHMsXFxuK1xcdFxcdCAgICAuZXhjbF9wcm9nX2hhc2ggPSBleGNsLFxcbitcXHRcXHQgICAgLmV4Y2xfcHJvZ19oYXNoX3NpemUgPSBTSEEyNTZfRElHRVNUX0xFTkdUSCk7XFxuK1xcdF9fdTMyIHNpZ19zeiA9IDgxOTIsIGtleSA9IDA7XFxuK1xcdHVuc2lnbmVkIGNoYXIgKmJ1ZiA9IE5VTEw7XFxuK1xcdGludCBtYXBfZmQsIHByb2dfZmQsIHJldCA9IDA7XFxuK1xcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XFxuK1xcdF9fdTggc2lnWzgxOTJdO1xcbitcXG4rXFx0KnJhbiA9IGZhbHNlO1xcbitcXHQqbG9hZF9yZXQgPSAwO1xcbitcXG4rXFx0LypcXG4rXFx0ICogTWV0YWRhdGEgbWFwLCBib3VuZCB0byB0aGUgbG9hZGVyIGRpZ2VzdCBhbmQgZnJvemVuLCBleGFjdGx5IGFzXFxuK1xcdCAqIHNrZWxfaW50ZXJuYWwuaCdzIGJwZl9sb2FkX2FuZF9ydW4oKSBzZXRzIGl0IHVwLlxcbitcXHQgKi9cXG4rXFx0bWFwX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZLCBcXFwiX19sb2FkZXIubWFwXFxcIiwgNCxcXG4rXFx0XFx0XFx0XFx0ZGF0YV9zeiwgMSwgXFx1MDAyNm1vcHRzKTtcXG4rXFx0aWYgKG1hcF9mZCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0cmV0ID0gLWVycm5vO1xcbitcXHRcXHRnb3RvIG91dF9sb2FkO1xcbitcXHR9XFxuK1xcdGlmIChicGZfbWFwX3VwZGF0ZV9lbGVtKG1hcF9mZCwgXFx1MDAyNmtleSwgZGF0YSwgMCkgfHwgYnBmX21hcF9mcmVlemUobWFwX2ZkKSkge1xcbitcXHRcXHRyZXQgPSAtZXJybm87XFxuK1xcdFxcdGdvdG8gb3V0X2xvYWQ7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIFNpZ24gaW5zbnMgfHwgbWV0YWRhdGEsIHRoZSBzYW1lIGJ5dGVzIHRoZSBrZXJuZWwgcmVjb25zdHJ1Y3RzLiAqL1xcbitcXHRidWYgPSBtYWxsb2MoKHNpemVfdClpbnNuc19zeiArIGRhdGFfc3opO1xcbitcXHRpZiAoIWJ1Zikge1xcbitcXHRcXHRyZXQgPSAtRU5PTUVNO1xcbitcXHRcXHRnb3RvIG91dF9sb2FkO1xcbitcXHR9XFxuK1xcdG1lbWNweShidWYsIGluc25zLCBpbnNuc19zeik7XFxuK1xcdG1lbWNweShidWYgKyBpbnNuc19zeiwgZGF0YSwgZGF0YV9zeik7XFxuK1xcdHJldCA9IHNpZ25fYnVmKGRpciwgYnVmLCBpbnNuc19zeiArIGRhdGFfc3osIHNpZywgXFx1MDAyNnNpZ19zeik7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdGdvdG8gb3V0X2xvYWQ7XFxuK1xcbitcXHRtZW1zZXQoXFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XFxuK1xcdGF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMO1xcbitcXHRhdHRyLmluc25zID0gcHRyX3RvX3U2NChpbnNucyk7XFxuK1xcdGF0dHIuaW5zbl9jbnQgPSBpbnNuc19zeiAvIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pO1xcbitcXHRhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KFxcXCJEdWFsIEJTRC9HUExcXFwiKTtcXG4rXFx0YXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFO1xcbitcXHRhdHRyLmZkX2FycmF5ID0gcHRyX3RvX3U2NChcXHUwMDI2bWFwX2ZkKTtcXG4rXFx0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XFxuK1xcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XFxuK1xcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcXG4rXFx0YXR0ci5mZF9hcnJheV9jbnQgPSAxO1xcbitcXHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFxcXCJfX2xvYWRlci5wcm9nXFxcIiwgc2l6ZW9mKFxcXCJfX2xvYWRlci5wcm9nXFxcIikpO1xcbitcXHRwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXFx1MDAyNmF0dHIsXFxuK1xcdFxcdFxcdCAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcXG4rXFx0aWYgKHByb2dfZmQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdHJldCA9IC1lcnJubztcXG4rXFx0XFx0Z290byBvdXRfbG9hZDtcXG4rXFx0fVxcbitcXG4rXFx0bWVtc2V0KFxcdTAwMjZhdHRyLCAwLCBzaXplb2YoYXR0cikpO1xcbitcXHRhdHRyLnRlc3QucHJvZ19mZCA9IHByb2dfZmQ7XFxuK1xcdGF0dHIudGVzdC5jdHhfaW4gPSBwdHJfdG9fdTY0KGN0eCk7XFxuK1xcdGF0dHIudGVzdC5jdHhfc2l6ZV9pbiA9IGN0eF9zejtcXG4rXFx0aWYgKHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX1JVTiwgXFx1MDAyNmF0dHIsXFxuK1xcdFxcdCAgICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwgdGVzdCkpIFxcdTAwM2MgMCkge1xcbitcXHRcXHRyZXQgPSAtZXJybm87XFxuK1xcdFxcdGdvdG8gb3V0X3Byb2c7XFxuK1xcdH1cXG4rXFx0KnJhbiA9IHRydWU7XFxuK1xcdHJldCA9IChpbnQpYXR0ci50ZXN0LnJldHZhbDtcXG4rb3V0X3Byb2c6XFxuK1xcdGNsb3NlKHByb2dfZmQpO1xcbitcXHRnb3RvIG91dF9tYXA7XFxuK291dF9sb2FkOlxcbitcXHQqbG9hZF9yZXQgPSByZXQ7XFxuK291dF9tYXA6XFxuK1xcdGZyZWUoYnVmKTtcXG4rXFx0aWYgKG1hcF9mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShtYXBfZmQpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBsb2FkdGltZV92ZXJpZnkoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgaW50IGV4cGVjdF9tYXBzKVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGdlbl9sb2FkZXJfb3B0cywgZ29wdHMsIC5nZW5faGFzaCA9IHRydWUpO1xcbitcXHRjaGFyIGRpcl90bXBsW10gPSBcXFwiL3RtcC9zaWduZWRfbG9hZGVyX2x0WFhYWFhYXFxcIiwgKmRpciA9IE5VTEw7XFxuK1xcdGludCBucl9tYXBzID0gMCwgbnJfcHJvZ3MgPSAwLCBsb2FkX3JldCA9IDAsIHI7XFxuK1xcdF9fdTggZXhjbFtTSEEyNTZfRElHRVNUX0xFTkdUSF07XFxuK1xcdHN0cnVjdCBicGZfcHJvZ19kZXNjICpwZDtcXG4rXFx0c3RydWN0IGJwZl9tYXBfZGVzYyAqbWQ7XFxuK1xcdHVuc2lnbmVkIGNoYXIgKmJsb2IgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgYnBmX3Byb2dyYW0gKnA7XFxuK1xcdHN0cnVjdCBicGZfbWFwICptO1xcbitcXHRfX3UzMiBjdHhfc3osIGRhdGFfc3o7XFxuK1xcdHZvaWQgKmN0eCA9IE5VTEw7XFxuK1xcdGJvb2wgcmFuID0gZmFsc2U7XFxuK1xcbitcXHRzeXNjYWxsKF9fTlJfcmVxdWVzdF9rZXksIFxcXCJrZXlyaW5nXFxcIiwgXFxcIl91aWQuMFxcXCIsIE5VTEwsXFxuK1xcdFxcdEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XFxuK1xcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcXFwibWtkdGVtcFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcXFwic2V0dXBcXFwiLCBkaXIpLCBcXFwidmVyaWZ5X3NpZ19zZXR1cFxcXCIpKSB7XFxuK1xcdFxcdHJtZGlyKGRpcik7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0soYnBmX29iamVjdF9fZ2VuX2xvYWRlcihvYmosIFxcdTAwMjZnb3B0cyksIFxcXCJnZW5fbG9hZGVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZfb2JqZWN0X19sb2FkKG9iaiksIFxcXCJnZW5fbG9hZFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX3Byb2dyYW0ocCwgb2JqKVxcbitcXHRcXHRucl9wcm9ncysrO1xcbitcXHRicGZfb2JqZWN0X19mb3JfZWFjaF9tYXAobSwgb2JqKVxcbitcXHRcXHRucl9tYXBzKys7XFxuK1xcdGlmICghQVNTRVJUX0VRKG5yX21hcHMsIGV4cGVjdF9tYXBzLCBcXFwiZml4dHVyZSBtYXAgY291bnRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRjdHhfc3ogPSBzaXplb2Yoc3RydWN0IGJwZl9sb2FkZXJfY3R4KSArXFxuK1xcdFxcdCBucl9tYXBzICogc2l6ZW9mKHN0cnVjdCBicGZfbWFwX2Rlc2MpICtcXG4rXFx0XFx0IG5yX3Byb2dzICogc2l6ZW9mKHN0cnVjdCBicGZfcHJvZ19kZXNjKTtcXG4rXFx0Y3R4ID0gY2FsbG9jKDEsIGN0eF9zeik7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihjdHgsIFxcXCJjdHhfYWxsb2NcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdCgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS1cXHUwMDNlc3ogPSBjdHhfc3o7XFxuK1xcbitcXHRkYXRhX3N6ID0gZ29wdHMuZGF0YV9zejtcXG4rXFx0YmxvYiA9IG1hbGxvYyhkYXRhX3N6KTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJsb2IsIFxcXCJibG9iX2FsbG9jXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRtZW1jcHkoYmxvYiwgZ29wdHMuZGF0YSwgZGF0YV9zeik7XFxuK1xcbitcXHQvKiBleGNsX3Byb2dfaGFzaCA9IFNIQTI1Nihsb2FkZXIgaW5zbnMpID09IHRoZSBsb2FkZXIncyBwcm9nLVxcdTAwM2VkaWdlc3QuICovXFxuK1xcdGxpYmJwZl9zaGEyNTYoZ29wdHMuaW5zbnMsIGdvcHRzLmluc25zX3N6LCBleGNsKTtcXG4rXFxuK1xcdHIgPSBsb2FkdGltZV9kcml2ZShkaXIsIGdvcHRzLmluc25zLCBnb3B0cy5pbnNuc19zeiwgYmxvYiwgZGF0YV9zeixcXG4rXFx0XFx0XFx0ICAgZXhjbCwgY3R4LCBjdHhfc3osIFxcdTAwMjZsb2FkX3JldCwgXFx1MDAyNnJhbik7XFxuK1xcdEFTU0VSVF9PSyhsb2FkX3JldCwgXFxcInNpZ25lZCBsb2FkZXIgbG9hZGVkIChpbnNucyB8fCBtZXRhZGF0YSlcXFwiKTtcXG4rXFx0QVNTRVJUX1RSVUUocmFuLCBcXFwibG9hZGVyIHJhblxcXCIpO1xcbitcXHRBU1NFUlRfRVEociwgMCwgXFxcImxvYWRlciBpbnN0YWxsZWQgaXRzIHRhcmdldFxcXCIpO1xcbitcXG4rXFx0bWQgPSAoc3RydWN0IGJwZl9tYXBfZGVzYyAqKSgoY2hhciAqKWN0eCArIHNpemVvZihzdHJ1Y3QgYnBmX2xvYWRlcl9jdHgpKTtcXG4rXFx0cGQgPSAoc3RydWN0IGJwZl9wcm9nX2Rlc2MgKikobWQgKyBucl9tYXBzKTtcXG4rXFx0QVNTRVJUX0dUKHBkWzBdLnByb2dfZmQsIDAsIFxcXCJ0YXJnZXQgcHJvZ3JhbSBpbnN0YWxsZWRcXFwiKTtcXG4rXFx0aWYgKG5yX21hcHMpXFxuK1xcdFxcdEFTU0VSVF9HVChtZFswXS5tYXBfZmQsIDAsIFxcXCJ0YXJnZXQgbWFwIGluc3RhbGxlZFxcXCIpO1xcbitcXG4rXFx0Y2xvc2VfbG9hZGVyX2N0eF9mZHMoY3R4LCBucl9tYXBzLCBucl9wcm9ncyk7XFxuK291dDpcXG4rXFx0ZnJlZShibG9iKTtcXG4rXFx0ZnJlZShjdHgpO1xcbitcXHRpZiAoZGlyKVxcbitcXHRcXHRydW5fc2V0dXAoXFxcImNsZWFudXBcXFwiLCBkaXIpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBsb2FkdGltZV9ub19tYXAodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyICpza2VsID0gdGVzdF9zaWduZWRfbG9hZGVyX19vcGVuKCk7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcInNrZWxfb3BlblxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGxvYWR0aW1lX3ZlcmlmeShza2VsLVxcdTAwM2VvYmosIDApO1xcbitcXHR0ZXN0X3NpZ25lZF9sb2FkZXJfX2Rlc3Ryb3koc2tlbCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGxvYWR0aW1lX3dpdGhfbWFwKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IHRlc3Rfc2lnbmVkX2xvYWRlcl9tYXAgKnNrZWwgPSB0ZXN0X3NpZ25lZF9sb2FkZXJfbWFwX19vcGVuKCk7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcInNrZWxfb3BlblxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGxvYWR0aW1lX3ZlcmlmeShza2VsLVxcdTAwM2VvYmosIDEpO1xcbitcXHR0ZXN0X3NpZ25lZF9sb2FkZXJfbWFwX19kZXN0cm95KHNrZWwpO1xcbit9XFxuK1xcbisvKlxcbisgKiBBIHNpZ25lZCBwcm9ncmFtIG5lZWQgbm90IGJpbmQgYW55IG1hcC4gQSBwbGFpbiBCUEZfUFJPR19UWVBFX1NZU0NBTExcXG4rICogcHJvZ3JhbSB3aXRoIG5vIGZkX2FycmF5IGlzIHNpZ25lZCBvdmVyIGl0cyBpbnN0cnVjdGlvbnMgYWxvbmU6IHRoZSBrZXJuZWxcXG4rICogdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSwgZm9sZHMgbm8gbWV0YWRhdGEsIGFuZCB0aGUgcHJvZ3JhbSBsb2Fkcy4gRXhlcmNpc2VcXG4rICogdGhlIGZkX2FycmF5ID09IE5VTEwgLyBmZF9hcnJheV9jbnQgPT0gMCBwYXRoLCBhbmQgY29uZmlybSB0aGUgc2lnbmF0dXJlXFxuKyAqIHN0aWxsIGF1dGhlbnRpY2F0ZXMgdGhlIGluc3RydWN0aW9ucyAoYSB0YW1wZXJlZCBjb3B5IGlzIHJlamVjdGVkKS5cXG4rICovXFxuK3N0YXRpYyB2b2lkIHNpZ25lZF9ub19mZF9hcnJheSh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xcbitcXHRcXHRCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksXFxuK1xcdFxcdEJQRl9FWElUX0lOU04oKSxcXG4rXFx0fTtcXG4rXFx0Y2hhciBkaXJfdG1wbFtdID0gXFxcIi90bXAvc2lnbmVkX2xvYWRlclhYWFhYWFxcXCIsICpkaXI7XFxuK1xcdF9fdTMyIHNpZ19zeiA9IDgxOTI7XFxuK1xcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XFxuK1xcdF9fdTggc2lnWzgxOTJdO1xcbitcXHRpbnQgcHJvZ19mZCwgZXJyO1xcbitcXG4rXFx0c3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCBcXFwia2V5cmluZ1xcXCIsIFxcXCJfdWlkLjBcXFwiLCBOVUxMLFxcbitcXHRcXHRLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xcbitcXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXFxcIm1rZHRlbXBcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXFxcInNldHVwXFxcIiwgZGlyKSwgXFxcInZlcmlmeV9zaWdfc2V0dXBcXFwiKSkge1xcbitcXHRcXHRybWRpcihkaXIpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdC8qIE5vIG1ldGFkYXRhIG1hcDogdGhlIHNpZ25lZCBwYXlsb2FkIGlzIHRoZSBpbnN0cnVjdGlvbnMgYWxvbmUuICovXFxuK1xcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgaW5zbnMsIHNpemVvZihpbnNucyksIHNpZywgXFx1MDAyNnNpZ19zeiksXFxuK1xcdFxcdCAgICAgICBcXFwic2lnbi1maWxlXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdG1lbXNldChcXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcXG4rXFx0YXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7XFxuK1xcdGF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGluc25zKTtcXG4rXFx0YXR0ci5pbnNuX2NudCA9IEFSUkFZX1NJWkUoaW5zbnMpO1xcbitcXHRhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KFxcXCJEdWFsIEJTRC9HUExcXFwiKTtcXG4rXFx0YXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFO1xcbitcXHRhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTtcXG4rXFx0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcXG4rXFx0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xcbitcXHQvKiBmZF9hcnJheSBhbmQgZmRfYXJyYXlfY250IGRlbGliZXJhdGVseSBsZWZ0IE5VTEwvMC4gKi9cXG4rXFx0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcXFwic2lnbmVkX25vbWFwXFxcIiwgc2l6ZW9mKFxcXCJzaWduZWRfbm9tYXBcXFwiKSk7XFxuK1xcbitcXHRwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXFx1MDAyNmF0dHIsXFxuK1xcdFxcdFxcdCAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UocHJvZ19mZCwgMCwgXFxcIm1hcC1sZXNzIHNpZ25lZCBwcm9ncmFtIGxvYWRlZFxcXCIpKSB7XFxuK1xcdFxcdGlmIChwcm9nX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdFxcdGNsb3NlKHByb2dfZmQpO1xcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFx0Y2xvc2UocHJvZ19mZCk7XFxuK1xcbitcXHQvKiBUaGUgc2lnbmF0dXJlIGNvdmVycyB0aGUgaW5zdHJ1Y3Rpb25zLCBzbyB0YW1wZXJpbmcgbXVzdCBiZSByZWplY3RlZC4gKi9cXG4rXFx0aW5zbnNbMF0uaW1tID0gMTtcXG4rXFx0cHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFxcdTAwMjZhdHRyLFxcbitcXHRcXHRcXHQgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XFxuK1xcdGVyciA9IHByb2dfZmQgXFx1MDAzYyAwID8gLWVycm5vIDogcHJvZ19mZDtcXG4rXFx0QVNTRVJUX0VRKGVyciwgLUVLRVlSRUpFQ1RFRCwgXFxcInRhbXBlcmVkIG1hcC1sZXNzIHByb2dyYW0gcmVqZWN0ZWRcXFwiKTtcXG4rXFx0aWYgKHByb2dfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UocHJvZ19mZCk7XFxuK2NsZWFudXA6XFxuK1xcdHJ1bl9zZXR1cChcXFwiY2xlYW51cFxcXCIsIGRpcik7XFxuK31cXG4rXFxuKy8qXFxuKyAqIEEgc2lnbmVkIHByb2dyYW0gbWF5IHJlYWNoIG1hcHMgb25seSB0aHJvdWdoIGZkX2FycmF5IGluZGljZXMsIHNvIHRoZSBrZXJuZWxcXG4rICogZm9sZHMgKGFuZCB0aHVzIGF0dGVzdHMpIHRoZW0uIEEgZGlyZWN0IEJQRl9QU0VVRE9fTUFQX0ZEIHJlZmVyZW5jZSAtIGEgcmF3LFxcbisgKiB1bmZvbGRlZCBmZCBiYWtlZCBpbnRvIHRoZSBzaWduZWQgaW5zdHJ1Y3Rpb25zIC0gaXMgcmVqZWN0ZWQgYnkgdGhlIHZlcmlmaWVyLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgc2lnbmVkX21hcF9ieV9mZF9yZWplY3RlZCh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xcbitcXHRcXHRCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksXFxuK1xcdFxcdEJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSxcXG4rXFx0XFx0QlBGX0VYSVRfSU5TTigpLFxcbitcXHR9O1xcbitcXHRjaGFyIGRpcl90bXBsW10gPSBcXFwiL3RtcC9zaWduZWRfbG9hZGVyWFhYWFhYXFxcIiwgKmRpcjtcXG4rXFx0X191MzIgc2lnX3N6ID0gODE5MjtcXG4rXFx0dW5pb24gYnBmX2F0dHIgYXR0cjtcXG4rXFx0X191OCBzaWdbODE5Ml07XFxuK1xcdGludCBtYXBfZmQsIHByb2dfZmQsIGVycjtcXG4rXFxuK1xcdG1hcF9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWSwgXFxcInNpZ19tYXBmZFxcXCIsIDQsIDQsIDEsIE5VTEwpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShtYXBfZmQsIDAsIFxcXCJtYXBfY3JlYXRlXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aW5zbnNbMF0uaW1tID0gbWFwX2ZkO1xcdC8qIGJha2UgdGhlIHJhdyBtYXAgZmQgaW50byB0aGUgbGRfaW1tNjQgKi9cXG4rXFxuK1xcdHN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgXFxcImtleXJpbmdcXFwiLCBcXFwiX3VpZC4wXFxcIiwgTlVMTCxcXG4rXFx0XFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcXG4rXFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFxcXCJta2R0ZW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0X21hcDtcXG4rXFx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFxcXCJzZXR1cFxcXCIsIGRpciksIFxcXCJ2ZXJpZnlfc2lnX3NldHVwXFxcIikpIHtcXG4rXFx0XFx0cm1kaXIoZGlyKTtcXG4rXFx0XFx0Z290byBvdXRfbWFwO1xcbitcXHR9XFxuK1xcbitcXHQvKiBTaWduIHRoZSBpbnN0cnVjdGlvbnMsIHJhdyBtYXAgZmQgYW5kIGFsbC4gKi9cXG4rXFx0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBpbnNucywgc2l6ZW9mKGluc25zKSwgc2lnLCBcXHUwMDI2c2lnX3N6KSxcXG4rXFx0XFx0ICAgICAgIFxcXCJzaWduLWZpbGVcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0bWVtc2V0KFxcdTAwMjZhdHRyLCAwLCBzaXplb2YoYXR0cikpO1xcbitcXHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcXG4rXFx0YXR0ci5pbnNucyA9IHB0cl90b191NjQoaW5zbnMpO1xcbitcXHRhdHRyLmluc25fY250ID0gQVJSQVlfU0laRShpbnNucyk7XFxuK1xcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXFxcIkR1YWwgQlNEL0dQTFxcXCIpO1xcbitcXHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XFxuK1xcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpO1xcbitcXHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6O1xcbitcXHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XFxuK1xcdC8qIE5vIGZkX2FycmF5OiB0aGUgbWFwIGlzIHJlYWNoZWQgYnkgYSByYXcgZmQgaW4gdGhlIGluc3RydWN0aW9ucy4gKi9cXG4rXFx0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcXFwic2lnbmVkX21hcGZkXFxcIiwgc2l6ZW9mKFxcXCJzaWduZWRfbWFwZmRcXFwiKSk7XFxuK1xcbitcXHRwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXFx1MDAyNmF0dHIsXFxuK1xcdFxcdFxcdCAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcXG4rXFx0ZXJyID0gcHJvZ19mZCBcXHUwMDNjIDAgPyAtZXJybm8gOiBwcm9nX2ZkO1xcbitcXHRBU1NFUlRfRVEoZXJyLCAtRUlOVkFMLCBcXFwic2lnbmVkIHByb2dyYW0gcmVmZXJlbmNpbmcgYSBtYXAgYnkgZmQgcmVqZWN0ZWRcXFwiKTtcXG4rXFx0aWYgKHByb2dfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UocHJvZ19mZCk7XFxuK2NsZWFudXA6XFxuK1xcdHJ1bl9zZXR1cChcXFwiY2xlYW51cFxcXCIsIGRpcik7XFxuK291dF9tYXA6XFxuK1xcdGNsb3NlKG1hcF9mZCk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIEEgc2lnbmVkIHByb2dyYW0gbWF5IHJlYWNoIG1hcHMgb25seSB0aHJvdWdoIHRoZSBjb250aW51b3VzIGZkX2FycmF5LCBzbyB0aGVcXG4rICoga2VybmVsIGZvbGRzIChhbmQgdGh1cyBhdHRlc3RzKSB0aGVtLiBSZWZlcmVuY2luZyBhIG1hcCBieSBmZF9hcnJheSAqaW5kZXgqXFxuKyAqIHdoaWxlIGxlYXZpbmcgZmRfYXJyYXlfY250IGF0IDAgc2VsZWN0cyB0aGUgc3BhcnNlIHBhdGgsIHdoaWNoIHJlc29sdmVzIGEgbWFwXFxuKyAqIHRoZSBzaWduYXR1cmUgbmV2ZXIgY292ZXJlZDsgdGhlIHZlcmlmaWVyIHJlamVjdHMgaXQgdXAgZnJvbnQgd2l0aCAtRUFDQ0VTLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgc2lnbmVkX3NwYXJzZV9mZF9hcnJheV9yZWplY3RlZCh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xcbitcXHRcXHRCUEZfTERfSU1NNjRfUkFXKEJQRl9SRUdfMSwgQlBGX1BTRVVET19NQVBfSURYLCAwKSxcXG4rXFx0XFx0QlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLFxcbitcXHRcXHRCUEZfRVhJVF9JTlNOKCksXFxuK1xcdH07XFxuK1xcdGNoYXIgZGlyX3RtcGxbXSA9IFxcXCIvdG1wL3NpZ25lZF9sb2FkZXJfc3BYWFhYWFhcXFwiLCAqZGlyO1xcbitcXHRfX3UzMiBzaWdfc3ogPSA4MTkyO1xcbitcXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xcbitcXHRfX3U4IHNpZ1s4MTkyXTtcXG4rXFx0aW50IG1hcF9mZCwgcHJvZ19mZCwgZXJyO1xcbitcXG4rXFx0bWFwX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZLCBcXFwic2lnX3NwYXJzZVxcXCIsIDQsIDQsIDEsIE5VTEwpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShtYXBfZmQsIDAsIFxcXCJtYXBfY3JlYXRlXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdHN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgXFxcImtleXJpbmdcXFwiLCBcXFwiX3VpZC4wXFxcIiwgTlVMTCxcXG4rXFx0XFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcXG4rXFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFxcXCJta2R0ZW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0X21hcDtcXG4rXFx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFxcXCJzZXR1cFxcXCIsIGRpciksIFxcXCJ2ZXJpZnlfc2lnX3NldHVwXFxcIikpIHtcXG4rXFx0XFx0cm1kaXIoZGlyKTtcXG4rXFx0XFx0Z290byBvdXRfbWFwO1xcbitcXHR9XFxuK1xcbitcXHQvKiBTaWduIHRoZSBpbnN0cnVjdGlvbnMgYWxvbmU7IHRoZSBzcGFyc2UgbWFwIGlzIG5vdCBmb2xkZWQuICovXFxuK1xcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgaW5zbnMsIHNpemVvZihpbnNucyksIHNpZywgXFx1MDAyNnNpZ19zeiksXFxuK1xcdFxcdCAgICAgICBcXFwic2lnbi1maWxlXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdG1lbXNldChcXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcXG4rXFx0YXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7XFxuK1xcdGF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGluc25zKTtcXG4rXFx0YXR0ci5pbnNuX2NudCA9IEFSUkFZX1NJWkUoaW5zbnMpO1xcbitcXHRhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KFxcXCJEdWFsIEJTRC9HUExcXFwiKTtcXG4rXFx0YXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFO1xcbitcXHRhdHRyLmZkX2FycmF5ID0gcHRyX3RvX3U2NChcXHUwMDI2bWFwX2ZkKTtcXG4rXFx0YXR0ci5mZF9hcnJheV9jbnQgPSAwOyAvKiBzcGFyc2U6IGZvcmNlIGxhenkgbWFwIHJlc29sdXRpb24gKi9cXG4rXFx0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XFxuK1xcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XFxuK1xcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcXG4rXFx0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcXFwic2lnbmVkX3NwYXJzZVxcXCIsIHNpemVvZihcXFwic2lnbmVkX3NwYXJzZVxcXCIpKTtcXG4rXFxuK1xcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcXHUwMDI2YXR0cixcXG4rXFx0XFx0XFx0ICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xcbitcXHRlcnIgPSBwcm9nX2ZkIFxcdTAwM2MgMCA/IC1lcnJubyA6IHByb2dfZmQ7XFxuK1xcdEFTU0VSVF9FUShlcnIsIC1FQUNDRVMsIFxcXCJzaWduZWQgcHJvZ3JhbSBiaW5kaW5nIGEgc3BhcnNlIGZkX2FycmF5IG1hcCByZWplY3RlZFxcXCIpO1xcbitcXHRpZiAocHJvZ19mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShwcm9nX2ZkKTtcXG4rY2xlYW51cDpcXG4rXFx0cnVuX3NldHVwKFxcXCJjbGVhbnVwXFxcIiwgZGlyKTtcXG4rb3V0X21hcDpcXG4rXFx0Y2xvc2UobWFwX2ZkKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgc2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZCh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xcbitcXHRcXHRCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCBCUEZfUFNFVURPX0tGVU5DX0NBTEwsIDEsIDEpLFxcbitcXHRcXHRCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksXFxuK1xcdFxcdEJQRl9FWElUX0lOU04oKSxcXG4rXFx0fTtcXG4rXFx0Y2hhciBkaXJfdG1wbFtdID0gXFxcIi90bXAvc2lnbmVkX2xvYWRlcl9rZm5YWFhYWFhcXFwiLCAqZGlyO1xcbitcXHRpbnQgcHJvZ19mZCwgZXJyLCBmZHNbMl07XFxuK1xcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XFxuK1xcdF9fdTMyIHNpZ19zeiA9IDgxOTI7XFxuK1xcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XFxuK1xcdF9fdTggc2lnWzgxOTJdO1xcbitcXG4rXFx0c3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCBcXFwia2V5cmluZ1xcXCIsIFxcXCJfdWlkLjBcXFwiLCBOVUxMLFxcbitcXHRcXHRLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xcbitcXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXFxcIm1rZHRlbXBcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXFxcInNldHVwXFxcIiwgZGlyKSwgXFxcInZlcmlmeV9zaWdfc2V0dXBcXFwiKSkge1xcbitcXHRcXHRybWRpcihkaXIpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFx0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBpbnNucywgc2l6ZW9mKGluc25zKSwgc2lnLCBcXHUwMDI2c2lnX3N6KSxcXG4rXFx0XFx0ICAgICAgIFxcXCJzaWduLWZpbGVcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcXFwiYnRmX25ld19lbXB0eVxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGJ0Zl9fYWRkX2ludChidGYsIFxcXCJpbnRcXFwiLCA0LCBCVEZfSU5UX1NJR05FRCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcXFwiYnRmX2xvYWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRmZHNbMF0gPSAtMTtcXG4rXFx0ZmRzWzFdID0gYnRmX19mZChidGYpO1xcbitcXG4rXFx0bWVtc2V0KFxcdTAwMjZhdHRyLCAwLCBzaXplb2YoYXR0cikpO1xcbitcXHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcXG4rXFx0YXR0ci5pbnNucyA9IHB0cl90b191NjQoaW5zbnMpO1xcbitcXHRhdHRyLmluc25fY250ID0gQVJSQVlfU0laRShpbnNucyk7XFxuK1xcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXFxcIkR1YWwgQlNEL0dQTFxcXCIpO1xcbitcXHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XFxuK1xcdGF0dHIuZmRfYXJyYXkgPSBwdHJfdG9fdTY0KGZkcyk7XFxuK1xcdGF0dHIuZmRfYXJyYXlfY250ID0gMDsgLyogc3BhcnNlOiBmb3JjZSBsYXp5IGtmdW5jIEJURiByZXNvbHV0aW9uICovXFxuK1xcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpO1xcbitcXHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6O1xcbitcXHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XFxuK1xcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXFxcInNpZ25lZF9rZnVuY1xcXCIsIHNpemVvZihcXFwic2lnbmVkX2tmdW5jXFxcIikpO1xcbitcXG4rXFx0cHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFxcdTAwMjZhdHRyLFxcbitcXHRcXHRcXHQgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XFxuK1xcdGVyciA9IHByb2dfZmQgXFx1MDAzYyAwID8gLWVycm5vIDogcHJvZ19mZDtcXG4rXFx0aWYgKHByb2dfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UocHJvZ19mZCk7XFxuK1xcbitcXHRBU1NFUlRfRVEoZXJyLCAtRUFDQ0VTLCBcXFwibW9kdWxlIGtmdW5jIEJURiBpbiBzaWduZWQgcHJvZ3JhbSByZWplY3RlZFxcXCIpO1xcbitjbGVhbnVwOlxcbitcXHRpZiAoYnRmKVxcbitcXHRcXHRidGZfX2ZyZWUoYnRmKTtcXG4rXFx0cnVuX3NldHVwKFxcXCJjbGVhbnVwXFxcIiwgZGlyKTtcXG4rfVxcbitcXG4gdm9pZCB0ZXN0X3NpZ25lZF9sb2FkZXIodm9pZClcXG4ge1xcbi1cXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwibWV0YWRhdGFfY2hlY2tfc2hhcGVcXFwiKSlcXG4tXFx0XFx0bWV0YWRhdGFfY2hlY2tfc2hhcGUoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImxvYWR0aW1lX25vX21hcFxcXCIpKVxcbitcXHRcXHRsb2FkdGltZV9ub19tYXAoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImxvYWR0aW1lX3dpdGhfbWFwXFxcIikpXFxuK1xcdFxcdGxvYWR0aW1lX3dpdGhfbWFwKCk7XFxuIFxcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtZXRhZGF0YV9tYXRjaFxcXCIpKVxcbiBcXHRcXHRtZXRhZGF0YV9tYXRjaCgpO1xcbi1cXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwibWV0YWRhdGFfc2hhX21pc21hdGNoXFxcIikpXFxuLVxcdFxcdG1ldGFkYXRhX3NoYV9taXNtYXRjaCgpO1xcbi1cXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwibWV0YWRhdGFfbm90X2V4Y2x1c2l2ZVxcXCIpKVxcbi1cXHRcXHRtZXRhZGF0YV9ub3RfZXhjbHVzaXZlKCk7XFxuLVxcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtZXRhZGF0YV9oYXNoX25vdF9jb21wdXRlZFxcXCIpKVxcbi1cXHRcXHRtZXRhZGF0YV9oYXNoX25vdF9jb21wdXRlZCgpO1xcbiBcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwic2lnbmF0dXJlX2VuZm9yY2VkXFxcIikpXFxuIFxcdFxcdHNpZ25hdHVyZV9lbmZvcmNlZCgpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwic2lnbmVkX25vbmV4Y2xfZmRfYXJyYXlfcmVqZWN0ZWRcXFwiKSlcXG4rXFx0XFx0c2lnbmVkX25vbmV4Y2xfZmRfYXJyYXlfcmVqZWN0ZWQoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInNpZ25lZF91bmZyb3plbl9mZF9hcnJheV9yZWplY3RlZFxcXCIpKVxcbitcXHRcXHRzaWduZWRfdW5mcm96ZW5fZmRfYXJyYXlfcmVqZWN0ZWQoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInNpZ25lZF9ub25hcnJheV9mZF9hcnJheV9yZWplY3RlZFxcXCIpKVxcbitcXHRcXHRzaWduZWRfbm9uYXJyYXlfZmRfYXJyYXlfcmVqZWN0ZWQoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInNpZ25lZF9idGZfZmRfYXJyYXlfcmVqZWN0ZWRcXFwiKSlcXG4rXFx0XFx0c2lnbmVkX2J0Zl9mZF9hcnJheV9yZWplY3RlZCgpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwic2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZFxcXCIpKVxcbitcXHRcXHRzaWduZWRfbW9kdWxlX2tmdW5jX3JlamVjdGVkKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJzaWduYXR1cmVfZmFpbHVyZV9sb2dzXFxcIikpXFxuK1xcdFxcdHNpZ25hdHVyZV9mYWlsdXJlX2xvZ3MoKTtcXG4gXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInNpZ25hdHVyZV90b29fbGFyZ2VcXFwiKSlcXG4gXFx0XFx0c2lnbmF0dXJlX3Rvb19sYXJnZSgpO1xcbiBcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwic2lnbmF0dXJlX2JhZF9rZXlyaW5nXFxcIikpXFxuQEAgLTExMTQsNiArMTc4Miw4IEBAIHZvaWQgdGVzdF9zaWduZWRfbG9hZGVyKHZvaWQpXFxuIFxcdFxcdG1ldGFkYXRhX2N0eF9pbml0aWFsX3ZhbHVlX2lnbm9yZWQoKTtcXG4gXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX2luc25zXFxcIikpXFxuIFxcdFxcdHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX2luc25zKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJzaWduYXR1cmVfYXV0aGVudGljYXRlc19tZXRhZGF0YVxcXCIpKVxcbitcXHRcXHRzaWduYXR1cmVfYXV0aGVudGljYXRlc19tZXRhZGF0YSgpO1xcbiBcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwiaGFzaF9yZXF1aXJlc19mcm96ZW5cXFwiKSlcXG4gXFx0XFx0aGFzaF9yZXF1aXJlc19mcm96ZW4oKTtcXG4gXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcIm5vX3VwZGF0ZV9hZnRlcl9mcmVlemVcXFwiKSlcXG5AQCAtMTEzMiw0ICsxODAyLDEwIEBAIHZvaWQgdGVzdF9zaWduZWRfbG9hZGVyKHZvaWQpXFxuIFxcdFxcdG1hcF9oYXNoX3Vuc3VwcG9ydGVkX3R5cGUoKTtcXG4gXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImxzbV9zaWduYXR1cmVfdmVyZGljdFxcXCIpKVxcbiBcXHRcXHRsc21fc2lnbmF0dXJlX3ZlcmRpY3QoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInNpZ25lZF9ub19mZF9hcnJheVxcXCIpKVxcbitcXHRcXHRzaWduZWRfbm9fZmRfYXJyYXkoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInNpZ25lZF9tYXBfYnlfZmRfcmVqZWN0ZWRcXFwiKSlcXG4rXFx0XFx0c2lnbmVkX21hcF9ieV9mZF9yZWplY3RlZCgpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwic2lnbmVkX3NwYXJzZV9mZF9hcnJheV9yZWplY3RlZFxcXCIpKVxcbitcXHRcXHRzaWduZWRfc3BhcnNlX2ZkX2FycmF5X3JlamVjdGVkKCk7XFxuIH1cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfc2lnbmVkX2xvYWRlci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfc2lnbmVkX2xvYWRlci5jXFxuaW5kZXggZDlhNGI4NWY5MzkxZjUuLjUwNDUxYTY5Yjk5YTI3IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3NpZ25lZF9sb2FkZXIuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3NpZ25lZF9sb2FkZXIuY1xcbkBAIC00LDEwICs0LDExIEBAXFxuIFxcbiAvKlxcbiAgKiBNaW5pbWFsLCBtYXAtbGVzcyBwcm9ncmFtLiBEcml2ZW4gdGhyb3VnaCBsaWJicGYncyBnZW5fbG9hZGVyIChnZW5faGFzaClcXG4tICogYnkgcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmMgc28gdGhlIGdlbmVyYXRlZCBsaWdodC1za2VsZXRvbiBsb2FkZXIgKHdpdGhcXG4tICogdGhlIGVtaXRfc2lnbmF0dXJlX21hdGNoIG1ldGFkYXRhIGNoZWNrKSBjYW4gYmUgZXhlcmNpc2VkIGFnYWluc3QgZ29vZFxcbi0gKiBhbmQgdGFtcGVyZWQgbWV0YWRhdGEuIEEgc29ja2V0IGZpbHRlciBuZWVkcyBubyBsb2FkLXRpbWUgYXR0YWNoIHJlc29sdXRpb24sXFxuLSAqIGFuZCBoYXZpbmcgbm8gbWFwcyBrZWVwcyB0aGUgZ2VuZXJhdGVkIGxvYWRlcidzIGN0eCB0cml2aWFsICgwIG1hcHMsIDEgcHJvZykuXFxuKyAqIGJ5IHByb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jIHNvIHRoZSBnZW5lcmF0ZWQgbGlnaHQtc2tlbGV0b24gbG9hZGVyIGNhbiBiZVxcbisgKiBleGVyY2lzZWQgYWdhaW5zdCBnb29kIGFuZCB0YW1wZXJlZCBtZXRhZGF0YSwgd2hpY2ggdGhlIGtlcm5lbCBub3cgdmVyaWZpZXNcXG4rICogYXQgbG9hZCB0aW1lIHZpYSB0aGUgaW5zbnN8fG1ldGFkYXRhIHNpZ25hdHVyZS4gQSBzb2NrZXQgZmlsdGVyIG5lZWRzIG5vXFxuKyAqIGxvYWQtdGltZSBhdHRhY2ggcmVzb2x1dGlvbiwgYW5kIGhhdmluZyBubyBtYXBzIGtlZXBzIHRoZSBnZW5lcmF0ZWQgbG9hZGVyJ3NcXG4rICogY3R4IHRyaXZpYWwgKDAgbWFwcywgMSBwcm9nKS5cXG4gICovXFxuIFNFQyhcXFwic29ja2V0XFxcIilcXG4gaW50IHByb2JlKHZvaWQgKmN0eClcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3ZlcmlmaWVyX21hcF9wdHIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy92ZXJpZmllcl9tYXBfcHRyLmNcXG5pbmRleCAxNjYxOTM2NTk4NzAzYy4uZTBhNjU4MzVjODYxYmIgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3ZlcmlmaWVyX21hcF9wdHIuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy92ZXJpZmllcl9tYXBfcHRyLmNcXG5AQCAtNzIsMTQgKzcyLDE1IEBAIF9fbmFrZWQgdm9pZCBicGZfbWFwX3B0cl93cml0ZV9yZWplY3RlZCh2b2lkKVxcbiBcXG4gLypcXG4gICogc3RydWN0IGJwZl9tYXAgc3RhcnRzIHdpdGggdGhlIFNIQTI1NiBoYXNoIHNoYVszMl0gYXQgb2Zmc2V0IDAgKGEgcmVhZGFibGVcXG4tICogYnl0ZSBhcnJheSksIHRoZSB1MzIgZXhjbCBmaWVsZCBhdCBvZmZzZXQgMzIsIGFuZCB0aGUgb3BzIHBvaW50ZXIgYXQgb2Zmc2V0XFxuLSAqIDQwLiBSZWFkaW5nIGEgdTMyIGF0IG9mZnNldCA0MSByZWFjaGVzIGludG8gdGhlIG1pZGRsZSBvZiB0aGUgb3BzIHBvaW50ZXIsXFxuLSAqIGkuZS4gYSBwYXJ0aWFsIHBvaW50ZXIgYWNjZXNzLCB3aGljaCBpcyByZWplY3RlZC5cXG4rICogYnl0ZSBhcnJheSksIGZvbGxvd2VkIGJ5IHRoZSBvcHMgcG9pbnRlciBhdCBvZmZzZXQgMzIgYW5kIHRoZSBpbm5lcl9tYXBfbWV0YVxcbisgKiBwb2ludGVyIGF0IG9mZnNldCA0MC4gUmVhZGluZyBhIHUzMiBhdCBvZmZzZXQgNDEgcmVhY2hlcyBpbnRvIHRoZSBtaWRkbGUgb2ZcXG4rICogdGhlIGlubmVyX21hcF9tZXRhIHBvaW50ZXIsIGkuZS4gYSBwYXJ0aWFsIHBvaW50ZXIgYWNjZXNzLCB3aGljaCBpc1xcbisgKiByZWplY3RlZC5cXG4gICovXFxuIFNFQyhcXFwic29ja2V0XFxcIilcXG4gX19kZXNjcmlwdGlvbihcXFwiYnBmX21hcF9wdHI6IHJlYWQgbm9uLWV4aXN0ZW50IGZpZWxkIHJlamVjdGVkXFxcIilcXG4gX19mYWlsdXJlXFxuLV9fbXNnKFxcXCJjYW5ub3QgYWNjZXNzIHB0ciBtZW1iZXIgb3BzIHdpdGggbW9mZiA0MCBpbiBzdHJ1Y3QgYnBmX21hcCB3aXRoIG9mZiA0MSBzaXplIDRcXFwiKVxcbitfX21zZyhcXFwiY2Fubm90IGFjY2VzcyBwdHIgbWVtYmVyIGlubmVyX21hcF9tZXRhIHdpdGggbW9mZiA0MCBpbiBzdHJ1Y3QgYnBmX21hcCB3aXRoIG9mZiA0MSBzaXplIDRcXFwiKVxcbiBfX2ZhaWx1cmVfdW5wcml2XFxuIF9fbXNnX3VucHJpdihcXFwiYWNjZXNzIGlzIGFsbG93ZWQgb25seSB0byBDQVBfUEVSRk1PTiBhbmQgQ0FQX1NZU19BRE1JTlxcXCIpXFxuIF9fZmxhZyhCUEZfRl9BTllfQUxJR05NRU5UKVxcbkBAIC05NywyMyArOTgsMjMgQEAgX19uYWtlZCB2b2lkIHJlYWRfbm9uX2V4aXN0ZW50X2ZpZWxkX3JlamVjdGVkKHZvaWQpXFxuIH1cXG4gXFxuIC8qXFxuLSAqIFRoZSB1MzIgZXhjbCBmaWVsZCBzcGFucyBvZmZzZXRzIDMyLi4zNSAobWVuZCAzNikuIFJlYWRpbmcgYSB1MzIgYXQgb2Zmc2V0XFxuLSAqIDMzIHN0YXJ0cyBpbnNpZGUgZXhjbCBidXQgZXh0ZW5kcyBwYXN0IGl0cyBlbmQsIHdoaWNoIHRoZSB2ZXJpZmllciByZWplY3RzXFxuKyAqIFRoZSBzaGEgYnl0ZSBhcnJheSBzcGFucyBvZmZzZXRzIDAuLjMxIChtZW5kIDMyKS4gUmVhZGluZyBhIHUzMiBhdCBvZmZzZXRcXG4rICogMzAgc3RhcnRzIGluc2lkZSBzaGEgYnV0IGV4dGVuZHMgcGFzdCBpdHMgZW5kLCB3aGljaCB0aGUgdmVyaWZpZXIgcmVqZWN0c1xcbiAgKiBhcyBhbiBvdXQtb2YtYm91bmRzIHNjYWxhciBhY2Nlc3MuXFxuICAqL1xcbiBTRUMoXFxcInNvY2tldFxcXCIpXFxuLV9fZGVzY3JpcHRpb24oXFxcImJwZl9tYXBfcHRyOiByZWFkIGJleW9uZCBleGNsIGZpZWxkIHJlamVjdGVkXFxcIilcXG4rX19kZXNjcmlwdGlvbihcXFwiYnBmX21hcF9wdHI6IHJlYWQgYmV5b25kIHNoYSBmaWVsZCByZWplY3RlZFxcXCIpXFxuIF9fZmFpbHVyZVxcbi1fX21zZyhcXFwiYWNjZXNzIGJleW9uZCB0aGUgZW5kIG9mIG1lbWJlciBleGNsIChtZW5kOjM2KSBpbiBzdHJ1Y3QgYnBmX21hcCB3aXRoIG9mZiAzMyBzaXplIDRcXFwiKVxcbitfX21zZyhcXFwiYWNjZXNzIGJleW9uZCB0aGUgZW5kIG9mIG1lbWJlciBzaGEgKG1lbmQ6MzIpIGluIHN0cnVjdCBicGZfbWFwIHdpdGggb2ZmIDMwIHNpemUgNFxcXCIpXFxuIF9fZmFpbHVyZV91bnByaXZcXG4gX19tc2dfdW5wcml2KFxcXCJhY2Nlc3MgaXMgYWxsb3dlZCBvbmx5IHRvIENBUF9QRVJGTU9OIGFuZCBDQVBfU1lTX0FETUlOXFxcIilcXG4gX19mbGFnKEJQRl9GX0FOWV9BTElHTk1FTlQpXFxuLV9fbmFrZWQgdm9pZCByZWFkX2JleW9uZF9leGNsX2ZpZWxkX3JlamVjdGVkKHZvaWQpXFxuK19fbmFrZWQgdm9pZCByZWFkX2JleW9uZF9zaGFfZmllbGRfcmVqZWN0ZWQodm9pZClcXG4ge1xcbiBcXHRhc20gdm9sYXRpbGUgKFxcXCJcXHRcXHRcXHRcXHRcXHRcXFxcXFxuIFxcdHI2ID0gMDtcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuIFxcdHIxID0gJVttYXBfYXJyYXlfNDhiXSBsbDtcXHRcXHRcXHRcXFxcXFxuLVxcdHI2ID0gKih1MzIqKShyMSArIDMzKTtcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdHI2ID0gKih1MzIqKShyMSArIDMwKTtcXHRcXHRcXHRcXHRcXFxcXFxuIFxcdHIwID0gMTtcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuIFxcdGV4aXQ7XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXFwiXFx0OlxcbkBAIC0xMzEsNyArMTMyLDcgQEAgX19uYWtlZCB2b2lkIHB0cl9yZWFkX29wc19maWVsZF9hY2NlcHRlZCh2b2lkKVxcbiBcXHRhc20gdm9sYXRpbGUgKFxcXCJcXHRcXHRcXHRcXHRcXHRcXFxcXFxuIFxcdHI2ID0gMDtcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuIFxcdHIxID0gJVttYXBfYXJyYXlfNDhiXSBsbDtcXHRcXHRcXHRcXFxcXFxuLVxcdHI2ID0gKih1NjQqKShyMSArIDQwKTtcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdHI2ID0gKih1NjQqKShyMSArIDMyKTtcXHRcXHRcXHRcXHRcXFxcXFxuIFxcdHIwID0gMTtcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuIFxcdGV4aXQ7XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXFwiXFx0OlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQyMDoyNDo1My4zNDEzNTk3ODNaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM5NjA5NzkxOTQzNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNT0RVTEVfU0lHXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZVwiLFxuICAgIFwicHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzXCIsXG4gICAgXCJwcm9jZXNzX2ZkX2FycmF5XCIsXG4gICAgXCJmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzXCIsXG4gICAgXCJmZF9hcnJheV9nZXRfbWFwX2lkeF9zcGFyc2VcIixcbiAgICBcImZkX2FycmF5X2dldF9tYXBfaWR4XCIsXG4gICAgXCJmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXNcIixcbiAgICBcImZkX2FycmF5X2dldF9idGZfc3BhcnNlXCIsXG4gICAgXCJmZF9hcnJheV9nZXRfYnRmXCIsXG4gICAgXCJhZGRfZmRfZnJvbV9mZF9hcnJheVwiLFxuICAgIFwiYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBwcm9ncmFtIHNpZ25pbmcgdmVyaWZpY2F0aW9uIGludG8gdGhlIGtlcm5lbCB2ZXJpZmllci4gSXQgbW9kaWZpZXMgdGhlIGBicGZfY2hlY2tgIHBhdGggdG8gdmVyaWZ5IFBLQ1MjNyBzaWduYXR1cmVzIG9mIEJQRiBwcm9ncmFtcyBhbmQgdGhlaXIgbWV0YWRhdGEgbWFwcyB3aGVuIGBhdHRyLVxcdTAwM2VzaWduYXR1cmVgIGlzIHByb3ZpZGVkLiBJdCBhbHNvIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgYSBjb250aW51b3VzIGBmZF9hcnJheWAgdmlhIGBmZF9hcnJheV9jbnRgLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUgQlBGIHZlcmlmaWVyIGNoYW5nZXMgdGhhdCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG5ldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0XG4gICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksXG4gICBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDllN2RlYjdkYWVkMDI5ZmNkOTIwMWU1NGJlZmY1ZjcyZTI2NWQ2MGJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEp1bCA2IDIwOjI0OjUwIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9icGYvaW5kZXgucnN0IGIvRG9jdW1lbnRhdGlvbi9icGYvaW5kZXgucnN0XG5pbmRleCAwZDVjNmY2NTkyNjY3YS4uNjM4YTAwZDQyYmMyYTEgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL2JwZi9pbmRleC5yc3RcbisrKyBiL0RvY3VtZW50YXRpb24vYnBmL2luZGV4LnJzdFxuQEAgLTI4LDYgKzI4LDcgQEAgdGhhdCBnb2VzIGludG8gZ3JlYXQgdGVjaG5pY2FsIGRlcHRoIGFib3V0IHRoZSBCUEYgQXJjaGl0ZWN0dXJlLlxuICAgIGNsYXNzaWNfdnNfZXh0ZW5kZWQucnN0XG4gICAgYnBmX2l0ZXJhdG9yc1xuICAgIGJwZl9saWNlbnNpbmdcbisgICBzaWduaW5nXG4gICAgdGVzdF9kZWJ1Z1xuICAgIGNsYW5nLW5vdGVzXG4gICAgbGludXgtbm90ZXNcbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdCBiL0RvY3VtZW50YXRpb24vYnBmL3NpZ25pbmcucnN0XG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjQ0NmI0ZWRiYWU2MjZjXG4tLS0gL2Rldi9udWxsXG4rKysgYi9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdFxuQEAgLTAsMCArMSw0OTYgQEBcbisuLiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuK1xuKz09PT09PT09PT09PVxuK0JQRiBzaWduaW5nXG4rPT09PT09PT09PT09XG4rXG4rVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgaG93IEJQRiBwcm9ncmFtcyBhcmUgY3J5cHRvZ3JhcGhpY2FsbHkgc2lnbmVkLCBob3cgdGhlXG4ra2VybmVsIHZlcmlmaWVzIHRoZW0gYXQgbG9hZCB0aW1lLCBhbmQgaG93IExpbnV4IFNlY3VyaXR5IE1vZHVsZXMgKExTTXMpIC1cbitpbmNsdWRpbmcgdGhlIEJQRiBMU00gLSB1c2UgdGhlIHJlc3VsdGluZyB2ZXJkaWN0IHRvIGVuZm9yY2UgcG9saWN5LiBJdCBpc1xuK3dyaXR0ZW4gZm9yIGRldmVsb3BlcnMgd2hvIHdhbnQgdG8gcHJvZHVjZSBzaWduZWQgQlBGIG9iamVjdHMsIHVuZGVyc3RhbmQgd2hhdFxuK3RoZSBzaWduYXR1cmUgYWN0dWFsbHkgZ3VhcmFudGVlcywgb3IgYnVpbGQgYSBwb2xpY3kgb24gdG9wIG9mIGl0LlxuK1xuK01vdGl2YXRpb25cbis9PT09PT09PT09XG4rXG4rQSBzaWduZWQgQlBGIHByb2dyYW0gbGV0cyB0aGUga2VybmVsIGVzdGFibGlzaCB0aGF0IHRoZSBieXRlY29kZSBiZWluZyBsb2FkZWRcbitvcmlnaW5hdGVzIGZyb20gYSB0cnVzdGVkIHByb2R1Y2VyIGFuZCB3YXMgbm90IG1vZGlmaWVkIGluIHRyYW5zaXQuIE9uIGl0cyBvd25cbit0aGUga2VybmVsIGRvZXMgbm90ICpyZXF1aXJlKiBzaWduYXR1cmVzIC0gYW4gdW5zaWduZWQgcHJvZ3JhbSBsb2FkcyBleGFjdGx5IGFzXG4rYmVmb3JlIC0gYnV0IGl0IHJlY29yZHMgYSB2ZXJkaWN0IChzZWUgYFRoZSB2ZXJkaWN0YF8pIHRoYXQgYW4gTFNNIGNhbiBnYXRlIG9uLlxuK1RoaXMgaXMgdGhlIGJ1aWxkaW5nIGJsb2NrIGZvciBwb2xpY2llcyBzdWNoIGFzIFwib25seSBydW4gQlBGIHRoYXQgd2FzIHNpZ25lZCBieVxuK2Ega2V5IGluIHRoZSB0cnVzdGVkIGtleXJpbmdcIiwgYXMgY291bGQgaW4gdGhlIGZ1dHVyZSBiZSBlbmZvcmNlZCBieSBhbiBMU01cbitzdWNoIGFzIElQRS5cbitcbitTaWduaW5nIGlzIG9ydGhvZ29uYWwgdG8gdGhlIGV4aXN0aW5nIHBlcm1pc3Npb24gbW9kZWw6IGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlXG4rY2FwYWJpbGl0eSBjaGVja3Mgb3IgdGhlIHZlcmlmaWVyLiBBIHNpZ25lZCBsb2FkIHN0aWxsIHJlcXVpcmVzIHRoZSB1c3VhbFxuK3ByaXZpbGVnZXMgKGBgQ0FQX0JQRmBgIGFuZCBhbnkgcHJvZ3JhbS10eXBlLXNwZWNpZmljIGNhcGFiaWxpdHksIHN1YmplY3QgdG9cbitgYGtlcm5lbC51bnByaXZpbGVnZWRfYnBmX2Rpc2FibGVkYGApLCBhbmQgdGhlIGxvYWRlcidzIGluc3RydWN0aW9ucyBhcmUgc3RpbGxcbitjaGVja2VkIGJ5IHRoZSB2ZXJpZmllciBsaWtlIGFueSBvdGhlciBwcm9ncmFtLiBBIHZhbGlkIHNpZ25hdHVyZSBlc3RhYmxpc2hlc1xuKypvcmlnaW4gYW5kIGludGVncml0eSosIG5vdCBzYWZldHkgLSBpdCBsZXRzIGEgcG9saWN5IHRydXN0IHdoZXJlIHRoZSBieXRlY29kZVxuK2NhbWUgZnJvbSwgaXQgZG9lcyBub3QgbGV0IGEgbG9hZCBza2lwIGFueSBjaGVjayBpdCB3b3VsZCBvdGhlcndpc2UgZmFjZS5cbitcbitUaGUgaGFyZCBwYXJ0IGlzICp3aGF0KiBnZXRzIHNpZ25lZC4gQSBuYWl2ZSBzY2hlbWUgd291bGQgc2lnbiBhIHByb2dyYW0nc1xuK2luc3RydWN0aW9uIGJ1ZmZlciBhdCBidWlsZCB0aW1lIGFuZCB2ZXJpZnkgdGhhdCBzaWduYXR1cmUgYXRcbitgYEJQRl9QUk9HX0xPQURgYC4gVGhhdCBkb2VzIG5vdCBzdXJ2aXZlIGNvbnRhY3Qgd2l0aCByZWFsIEJQRiBvYmplY3RzLCBiZWNhdXNlXG4rdGhlIGJ5dGVzIHRoZSBrZXJuZWwgZmluYWxseSBsb2FkcyBhcmUgbm90IHRoZSBieXRlcyB0aGUgZGV2ZWxvcGVyIGJ1aWx0IGFuZFxuK3NpZ25lZC4gQmV0d2VlbiB0aGUgdHdvLCBsaWJicGYgYW5kIHRoZSBrZXJuZWwgcmV3cml0ZSB0aGUgcHJvZ3JhbTpcbitcbistICoqbWFwIGZpbGUgZGVzY3JpcHRvcnMqKiBhcmUgcGF0Y2hlZCBpbnRvIGBgbGRfaW1tNjRgYCBpbnN0cnVjdGlvbnNcbisgIChgYEJQRl9QU0VVRE9fTUFQX0ZEYGApLCBhbmQgYSBtYXAncyBmZCBpcyBhc3NpZ25lZCBhdCBsb2FkIHRpbWUsIHNvIGl0XG4rICBkaWZmZXJzIG9uIGV2ZXJ5IHJ1bjtcbistICoqQ08tUkUgcmVsb2NhdGlvbnMqKiByZXdyaXRlIGZpZWxkIG9mZnNldHMsIHNpemVzIGFuZCBleGlzdGVuY2UgZmxhZ3MgYWdhaW5zdFxuKyAgdGhlICpydW5uaW5nKiBrZXJuZWwncyBCVEYsIHNvIHRoZSByZXN1bHQgZGlmZmVycyBmcm9tIG9uZSBrZXJuZWwgdG8gdGhlIG5leHQ7XG4rLSAqKmtmdW5jIGFuZCBrc3ltIHJlZmVyZW5jZXMqKiBhcmUgcmVzb2x2ZWQgdG8gaWRzL2FkZHJlc3NlcyBpbiB0aGUgcnVubmluZ1xuKyAga2VybmVsO1xuKy0gKipnbG9iYWwgZGF0YSoqIChgYC5yb2RhdGFgYC9gYC5kYXRhYGAvYGAuYnNzYGApIGlzIGNyZWF0ZWQgYW5kIHNlZWRlZCBhcyBtYXBzXG4rICBhdCBsb2FkLlxuK1xuK1NvIGEgc2lnbmF0dXJlIG92ZXIgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9ucyBjYW5ub3QgbWF0Y2ggdGhlIHJlbG9jYXRlZFxuK2luc3RydWN0aW9ucyB0aGUgdmVyaWZpZXIgZW5kcyB1cCBjaGVja2luZywgYW5kIHRoZSByZWxvY2F0ZWQgZm9ybSBjYW5ub3QgYmVcbitwcm9kdWNlZCBhaGVhZCBvZiB0aW1lIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgdGFyZ2V0IGtlcm5lbC4gVGhlcmUgaXMgbm9cbitmaXhlZCBieXRlIHN0cmluZyB0aGF0IGlzIGJvdGggc2lnbmFibGUgYXQgYnVpbGQgdGltZSBhbmQgd2hhdCB0aGUga2VybmVsXG4rYWN0dWFsbHkgbG9hZHMgLSB3aGljaCBpcyB3aHkgYSBwcm9ncmFtIGNhbm5vdCBzaW1wbHkgYmUgc2lnbmVkIGFuZCBsb2FkZWRcbitkaXJlY3RseS5cbitcbitUaGUgdHJ1c3RlZCBsb2FkZXJcbis9PT09PT09PT09PT09PT09PT1cbitcbitUaGUgc29sdXRpb24gaXMgdG8gbW92ZSB0aGF0IHNldHVwIHdvcmsgKmludG8qIGEgc21hbGwgQlBGIHByb2dyYW0gLSB0aGVcbisqKmxvYWRlcioqIC0gYW5kIHNpZ24gdGhlIGxvYWRlciBpbnN0ZWFkIG9mIHRoZSBpbmRpdmlkdWFsIHByb2dyYW1zLiBsaWJicGYnc1xuK2BgZ2VuX2xvYWRlcmBgIG1hY2hpbmVyeSAoYGBicGZ0b29sIGdlbiBza2VsZXRvbiAtTGBgLCB0aGUgXCJsaWdodCBza2VsZXRvblwiKVxuK2VtaXRzIGEgYGBCUEZfUFJPR19UWVBFX1NZU0NBTExgYCBwcm9ncmFtIHdob3NlIGJvZHkgcGVyZm9ybXMgdGhlIGJwZigpIHN5c2NhbGxzXG4rdGhhdCBjcmVhdGUgbWFwcywgYXBwbHkgcmVsb2NhdGlvbnMsIGFuZCBsb2FkIHRoZSByZWFsIHByb2dyYW1zLiBUaGUgcGF5bG9hZCBpdFxuK2luc3RhbGxzIC0gdGhlIHNlcmlhbGl6ZWQgcHJvZ3JhbXMsIG1hcCBkZXNjcmlwdGlvbnMsIHJlbG9jYXRpb24gZGF0YSBhbmRcbitpbml0aWFsIHZhbHVlcyAtIGxpdmVzIGluIGEgc2VwYXJhdGUgYXJyYXkgbWFwLCB0aGUgKiptZXRhZGF0YSBtYXAqKlxuKyhgYF9fbG9hZGVyLm1hcGBgKS5cbitcbitTbyB0aGUgdW5pdCBvZiB0cnVzdCBpcyB0aGUgbG9hZGVyLCBhbmQgdGhlIHNpZ25pbmcgY29udHJhY3QgaXM6OlxuK1xuKyAgICBTaWcoSV9sb2FkZXIgfHwgRF9tZXRhKVxuK1xuK3doZXJlIGBgSV9sb2FkZXJgYCBpcyB0aGUgbG9hZGVyJ3MgaW5zdHJ1Y3Rpb24gc3RyZWFtIGFuZCBgYERfbWV0YWBgIGlzIHRoZVxuK2NvbnRlbnQgb2YgdGhlIG1ldGFkYXRhIG1hcC4gVmVyaWZ5aW5nIHRoZSBsb2FkZXIncyBzaWduYXR1cmUgZXN0YWJsaXNoZXMgdGhhdFxuK2JvdGggdGhlIGxvYWRlciAqYW5kKiB0aGUgcGF5bG9hZCBpdCBpcyBhYm91dCB0byBpbnN0YWxsIGFyZSBhdXRoZW50aWMuIFRoZVxuK2xvYWRlciBpcyByZXByb2R1Y2libGU6IGBgZ2VuX2xvYWRlcmBgIGJ1aWxkcyBpdCBmcm9tIHByaW1pdGl2ZXMgc28gdGhlIHNhbWVcbitvYmplY3QgeWllbGRzIHRoZSBzYW1lIGJ5dGVzIG9uIGFueSBidWlsZCBob3N0LlxuK1xuK1doeSB0aGUgbG9hZGVyIGlzIHNpZ25hYmxlIHdoZW4gdGhlIHByb2dyYW0gaXMgbm90XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbitcbitUaGUgbG9hZGVyIHNpZGVzdGVwcyBldmVyeSByZXdyaXRlIGxpc3RlZCBhYm92ZSwgYmVjYXVzZSB0aGUgYnl0ZXMgdGhhdCBhcmVcbitzaWduZWQgYXJlICpyZWxvY2F0aW9uLWludmFyaWFudCo6XG4rXG4rLSBUaGUgbG9hZGVyJ3Mgb3duIGluc3RydWN0aW9ucyBhcmUgYSBmaXhlZCBzZXF1ZW5jZSBvZiBicGYoKSBzeXNjYWxscyBlbWl0dGVkXG4rICBieSBgYGdlbl9sb2FkZXJgYDsgdGhleSBjYXJyeSBubyBDTy1SRSByZWxvY2F0aW9ucyBhbmQgcmVzb2x2ZSBubyBrc3ltcywgc29cbisgIHRoZXkgYXJlIGlkZW50aWNhbCBvbiBldmVyeSBrZXJuZWwuIFRoZSBtZXRhZGF0YSBtYXAgaXMgcmVmZXJlbmNlZCBieSAqaW5kZXgqXG4rICBpbnRvIGBgZmRfYXJyYXlgYCAoYGBCUEZfUFNFVURPX01BUF9JRFhfVkFMVUVgYCksIG5vdCBieSBhIGJha2VkLWluIGZpbGVcbisgIGRlc2NyaXB0b3IsIHNvIGV2ZW4gdGhhdCByZWZlcmVuY2UgZG9lcyBub3QgY2hhbmdlIGJldHdlZW4gYnVpbGQgYW5kIGxvYWQuXG4rICBUaGUgbG9hZGVyIGluc3RydWN0aW9uIGJ5dGVzIHRoZSBrZXJuZWwgdmVyaWZpZXMgYXJlIGV4YWN0bHkgdGhlIGJ5dGVzIHRoYXRcbisgIHdlcmUgc2lnbmVkLlxuKy0gVGhlIG1ldGFkYXRhIG1hcCBpcyBvcGFxdWUsIGZyb3plbiBkYXRhIC0gdGhlIHNlcmlhbGl6ZWQgdGFyZ2V0IHByb2dyYW1zLFxuKyAgdGhlaXIgcmVsb2NhdGlvbiByZWNvcmRzLCBtYXAgZGVzY3JpcHRpb25zIGFuZCBpbml0aWFsIHZhbHVlcy4gSXRzIGJ5dGVzIGFyZVxuKyAgaWRlbnRpY2FsIGF0IGJ1aWxkIHRpbWUgYW5kIGF0IGxvYWQgdGltZSwgc28gdGhleSBhcmUgc2ltcGx5IGFwcGVuZGVkIHRvIHRoZVxuKyAgaW5zdHJ1Y3Rpb25zIGFuZCBjb3ZlcmVkIGJ5IHRoZSBzYW1lIHNpZ25hdHVyZSAodGhlcmUgaXMgbm8gc2VwYXJhdGUgbWV0YWRhdGFcbisgIGhhc2ggdG8gY29tcHV0ZSBvciBjb21wYXJlKS5cbitcbitBbGwgdGhlIGhvc3Qtc3BlY2lmaWMgcmV3cml0aW5nIC0gY3JlYXRpbmcgbWFwcywgcGF0Y2hpbmcgdGhlaXIgZmRzIGludG8gdGhlXG4rdGFyZ2V0IHByb2dyYW1zLCBhcHBseWluZyBDTy1SRSwgcmVzb2x2aW5nIGtzeW1zLCBzZWVkaW5nIGdsb2JhbCBkYXRhIC0gc3RpbGxcbitoYXBwZW5zLCBidXQgaXQgaGFwcGVucyAqaW5zaWRlIHRoZSBsb2FkZXIgYXQgcnVudGltZSosIG9uIHRoZSB2ZXJpZmllZFxuK21ldGFkYXRhLCAqKmFmdGVyKiogdGhlIGtlcm5lbCBoYXMgdmVyaWZpZWQgdGhlIGBgaW5zbnMgfHwgbWV0YWRhdGFgYCBzaWduYXR1cmUuXG4rVGhlIGtlcm5lbCBuZXZlciBoYXMgdG8gdmVyaWZ5IHRoZSByZWxvY2F0ZWQgdGFyZ2V0IHByb2dyYW1zOiBpdCB2ZXJpZmllcyB0aGVcbitsb2FkZXIgYW5kIGl0cyBpbnB1dHMgb25jZSwgYW5kIHRydXN0IHRyYW5zZmVycyB0byB3aGF0ZXZlciB0aGF0IG5vdy10cnVzdGVkLFxuK2RldGVybWluaXN0aWMgbG9hZGVyIGluc3RhbGxzLiBUaGUgcmVsb2NhdGlvbiBzdGVwIGlzIG1vdmVkIGZyb20gXCJiZWZvcmUgdGhlXG4rc2lnbmF0dXJlIGNhbiBiZSBjaGVja2VkXCIgdG8gXCJhZnRlciBhIHRydXN0ZWQgcHJvZ3JhbSBydW5zXCIgLSB3aGljaCBpcyBleGFjdGx5XG4rd2hhdCBtYWtlcyBpdCBzaWduYWJsZS5cbitcbitCZWNhdXNlIHRoZSBtZXRhZGF0YSBtYXAgaXMgdGhlIGxvYWRlcidzIG9ubHkgdW50cnVzdGVkIGlucHV0LCB0d28gZXhpc3RpbmcgbWFwXG4rcHJvcGVydGllcyBhcmUgcmV1c2VkIHRvIGtlZXAgaXQgdHJ1c3R3b3J0aHkgYWNyb3NzIHRoZSBsb2FkOlxuK1xuK0V4Y2x1c2l2ZSBtYXBzXG4rICAgIEEgbWFwIGNyZWF0ZWQgd2l0aCBgYGV4Y2xfcHJvZ19oYXNoYGAgKHNlZSBgYEJQRl9NQVBfQ1JFQVRFYGApIG1heSBvbmx5IGJlXG4rICAgIGFjY2Vzc2VkIGJ5IGEgcHJvZ3JhbSB3aG9zZSBkaWdlc3QgbWF0Y2hlcyB0aGF0IGhhc2guIFRoZSB2ZXJpZmllciBlbmZvcmNlc1xuKyAgICBgYG1hcC1cdTAwM2VleGNsX3Byb2dfc2hhID09IHByb2ctXHUwMDNlZGlnZXN0YGAgZm9yIGV2ZXJ5IG1hcCBhIHByb2dyYW0gdXNlcywgc28gdGhlXG4rICAgIG1ldGFkYXRhIG1hcCBpcyBib3VuZCB0byBleGFjdGx5IHRoZSBzaWduZWQgbG9hZGVyIGFuZCBjYW5ub3QgYmUgc2hhcmVkIHdpdGhcbisgICAgb3IgbXV0YXRlZCBieSBhbm90aGVyIHByb2dyYW0uXG4rXG4rRnJvemVuIG1hcHNcbisgICAgVGhlIG1ldGFkYXRhIG1hcCBpcyBmcm96ZW4gKGBgQlBGX01BUF9GUkVFWkVgYCkgYmVmb3JlIHRoZSBsb2FkZXIgaXMgbG9hZGVkLlxuKyAgICBGcmVlemluZyBibG9ja3MgZnVydGhlciB1c2Vyc3BhY2Ugd3JpdGVzLCBzbyB0aGUgYnl0ZXMgZm9sZGVkIGludG8gdGhlXG4rICAgIHNpZ25hdHVyZSBjYW5ub3QgY2hhbmdlIGJlZm9yZSB0aGUgbG9hZGVyIHJ1bnMuIChGcmVlemluZyBkb2VzIG5vdCBtYWtlIHRoZVxuKyAgICBtYXAgcmVhZC1vbmx5IHRvIHRoZSBsb2FkZXIgcHJvZ3JhbSBpdHNlbGYsIHdoaWNoIHN0aWxsIHdyaXRlcyBjcmVhdGVkIGZpbGVcbisgICAgZGVzY3JpcHRvcnMgYmFjayBpbnRvIHRoZSBibG9iJ3Mgc2NyYXRjaCBhcmVhLilcbitcbitMb2FkLXRpbWUgdmVyaWZpY2F0aW9uXG4rPT09PT09PT09PT09PT09PT09PT09PT1cbitcbitSYXRoZXIgdGhhbiBoYXZlIHRoZSBsb2FkZXIgY2hlY2sgaXRzIG93biBtZXRhZGF0YSBmcm9tIHdpdGhpbiBCUEYsIHRoZSBrZXJuZWxcbit2ZXJpZmllcyBpdCBkaXJlY3RseSBhdCBgYEJQRl9QUk9HX0xPQURgYCwgd2l0aCBubyBuZXcgVUFQSS4gVGhlIG1lY2hhbmlzbVxuK3JldXNlcyB0aGUgZXhpc3RpbmcgYGBmZF9hcnJheWBgOlxuK1xuKyMuIFVzZXJzcGFjZSBjcmVhdGVzIHRoZSBtZXRhZGF0YSBtYXAgd2l0aCBgYGV4Y2xfcHJvZ19oYXNoYGAgc2V0IHRvIHRoZVxuKyAgIGxvYWRlcidzIGRpZ2VzdCwgcG9wdWxhdGVzIGl0LCBhbmQgZnJlZXplcyBpdC5cbisjLiBUaGUgbG9hZGVyIGlzIGxvYWRlZCB3aXRoIGBgc2lnbmF0dXJlYGAvYGBzaWduYXR1cmVfc2l6ZWBgL2Bga2V5cmluZ19pZGBgXG4rICAgc2V0LCB0aGUgbWV0YWRhdGEgbWFwIHJlZmVyZW5jZWQgdGhyb3VnaCBgYGZkX2FycmF5YGAsIGFuZCBgYGZkX2FycmF5X2NudGBgXG4rICAgc2V0IHNvIHRoZSBrZXJuZWwga25vd3MgdGhlIGFycmF5J3MgbGVuZ3RoLlxuKyMuIFNpZ25hdHVyZSB2ZXJpZmljYXRpb24gcnVucyBpbnNpZGUgdGhlIHZlcmlmaWVyIChgYGJwZl9jaGVjaygpYGApLCBvbmNlIGl0XG4rICAgaGFzIHJlc29sdmVkIHRoZSBgYGZkX2FycmF5YGAgZW50cmllcyBpbnRvIHRoZSBwcm9ncmFtJ3MgYGB1c2VkX21hcHNgYC4gVGhlXG4rICAgbWFwcyBmb2xkZWQgaW50byB0aGUgc2lnbmF0dXJlIGFyZSB0aGVyZWZvcmUgdGhlIHZlcnkgb2JqZWN0cyB0aGUgcHJvZ3JhbVxuKyAgIGJpbmRzIC0gYSBzaW5nbGUgcmVzb2x1dGlvbiBvZiBgYGZkX2FycmF5YGAsIG5vdCBhIHNlcGFyYXRlIHJlYWQsIHNvIHRoZVxuKyAgIHZlcmlmaWVkIGJ5dGVzIGNhbm5vdCBiZSBzd2FwcGVkIGZvciBhIGRpZmZlcmVudCBtYXAgYWZ0ZXIgdGhlIGNoZWNrIChub1xuKyAgIHRpbWUtb2YtY2hlY2svdGltZS1vZi11c2Ugd2luZG93KS4gRWFjaCBmb2xkZWQgbWFwIG11c3QgYmUgZXhjbHVzaXZlIChjYXJyeVxuKyAgIGBgZXhjbF9wcm9nX3NoYWBgKSBhbmQgYSBwbGFpbiBhcnJheSBtYXAgKGBgQlBGX01BUF9UWVBFX0FSUkFZYGApOyBvbmx5IGFuXG4rICAgYXJyYXkgbWFwIGV4cG9zZXMgaXRzIHZhbHVlIGJ1ZmZlciB0aHJvdWdoIGBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyKClgYCBhcyBhXG4rICAga2VybmVsIGFkZHJlc3Mgc3Bhbm5pbmcgYGB2YWx1ZV9zaXplYGAgYnl0ZXMuIEEgbWFwIHRoYXQgaXMgbm90IGV4Y2x1c2l2ZSwgbm90XG4rICAgZnJvemVuLCBvciBub3QgYSBwbGFpbiBhcnJheSBpcyByZWplY3RlZCwgd2l0aCBhIHZlcmlmaWVyIGxvZyBtZXNzYWdlIG5hbWluZ1xuKyAgIHRoZSBvZmZlbmRpbmcgbWFwLiBUaGUga2VybmVsIGFwcGVuZHMgZWFjaCBtYXAncyBmcm96ZW5cbisgICBjb250ZW50cyB0byB0aGUgaW5zdHJ1Y3Rpb24gYnVmZmVyIGFuZCB2ZXJpZmllcyB0aGUgUEtDUyM3IHNpZ25hdHVyZSBvdmVyIHRoZVxuKyAgIGNvbmNhdGVuYXRpb24gYGBpbnNucyB8fCBtZXRhZGF0YV8wIHx8IG1ldGFkYXRhXzEgfHwgLi4uYGAgaW4gYGB1c2VkX21hcHNgYFxuKyAgIG9yZGVyLCBiZWZvcmUgaXQgcmV3cml0ZXMgdGhlIChzaWduZWQpIGluc3RydWN0aW9ucy5cbitcbitBIHNpZ25lZCBwcm9ncmFtIHRoZXJlZm9yZSB0YWtlcyBvbmUgb2YgZXhhY3RseSB0d28gc2hhcGVzLCBib3RoIGZ1bGx5XG4rc3VwcG9ydGVkOlxuK1xuKy0gKipObyBib3VuZCBtYXBzKiogKGBgZmRfYXJyYXlfY250ID09IDBgYCk6IHRoZXJlIGlzIG5vdGhpbmcgdG8gYXBwZW5kLCBzbyB0aGVcbisgIGtlcm5lbCB2ZXJpZmllcyB0aGUgc2lnbmF0dXJlIG92ZXIgdGhlIGluc3RydWN0aW9ucyBhbG9uZS4gQSB2YWxpZCBzaWduYXR1cmVcbisgIHlpZWxkcyBgYEJQRl9TSUdfVkVSSUZJRURgYCBhbmQgdGhlIHByb2dyYW0gbG9hZHMuIFRoaXMgaXMgdGhlIG9yZGluYXJ5IGNhc2VcbisgIGZvciBhIGRpcmVjdGx5LWxvYWRlZCBzaWduZWQgcHJvZ3JhbSB3aXRoIG5vIHNlcGFyYXRlIHBheWxvYWQ7IGl0IGlzICpub3QqXG4rICByZWplY3RlZCBmb3IgXCJtaXNzaW5nXCIgbWV0YWRhdGEsIGJlY2F1c2UgaXQgaGFzIG5vbmUgdG8gY292ZXIuXG4rLSAqKkV4Y2x1c2l2ZSBib3VuZCBtYXBzKiogKGBgZmRfYXJyYXlfY250IFx1MDAzZSAwYGApOiBldmVyeSBlbnRyeSBpcyBleGNsdXNpdmUgYW5kXG4rICBmb2xkZWQsIHNvIHRoZSBzaWduYXR1cmUgY292ZXJzIGBgaW5zbnMgfHwgbWV0YWRhdGFgYC5cbitcbitUaGVyZSBpcyBubyB0aGlyZCBzaGFwZTogYSBub24tZXhjbHVzaXZlIG1hcCBpbiBhIHNpZ25lZCBwcm9ncmFtJ3MgYGBmZF9hcnJheWBgXG4raXMgcmVqZWN0ZWQgcmF0aGVyIHRoYW4gc2lsZW50bHkgbGVmdCBvdXQgb2YgdGhlIHNpZ25hdHVyZSwgc28gYSBwcm9ncmFtIGJvdW5kXG4rdG8gYSBzaWduZWQgbG9hZGVyIG5ldmVyIGhhcyBhIG1hcCB0aGUgc2lnbmF0dXJlIGRvZXMgbm90IGNvdmVyLlxuK1xuK1RoZSBkaWdlc3QgYmluZGluZyAoYGBleGNsX3Byb2dfc2hhID09IHByb2ctXHUwMDNlZGlnZXN0YGApIGlzIGVuZm9yY2VkIGJ5IHRoZVxuK3ZlcmlmaWVyIGFzIHVzdWFsOyBiZWNhdXNlIHRoYXQgY2hlY2sgcnVucyB3aGlsZSBgYGZkX2FycmF5YGAgaXMgcmVzb2x2ZWQgLVxuK2JlZm9yZSB0aGUgdmVyaWZpZXIgd291bGQgb3RoZXJ3aXNlIGNvbXB1dGUgdGhlIHRhZyAtIGBgcHJvZy1cdTAwM2VkaWdlc3RgYCBpc1xuK2NvbXB1dGVkIHVwIGZyb250IGluIHRoZSB2ZXJpZmllciwgb3ZlciB0aGUgdW5tb2RpZmllZCAoc2lnbmF0dXJlLWNvdmVyZWQpXG4raW5zdHJ1Y3Rpb25zLCBmb3IgYW55IHNpZ25lZCBsb2FkLlxuK1xuK0NvdmVyYWdlIGlzIHRoZW4gZW5mb3JjZWQgYXMgdGhlIHZlcmlmaWVyIHJlc29sdmVzIGluc3RydWN0aW9ucywgYXQgdGhlIHBvaW50XG4rZWFjaCBvYmplY3QgaXMgYm91bmQgcmF0aGVyIHRoYW4gYnkgYSBjb3VudCB0YWtlbiBhZnRlcndhcmRzLiBPbmNlIHRoZSBzaWduYXR1cmVcbitoYXMgYmVlbiB2ZXJpZmllZCwgYmluZGluZyBhbnkgZnVydGhlciBtYXAgaXMgcmVmdXNlZDogYSBtYXAgcmVhY2hlZCBieSBhXG4rZGlyZWN0bHktcmVmZXJlbmNlZCBmZCwgb3IgYSBtYXAgc3dhcHBlZCBpbnRvIGFuIGBgZmRfYXJyYXlgYCBzbG90IHRoZSBsb2FkZXJcbityZWFkcywgaXMgbm90IGFtb25nIHRob3NlIGFscmVhZHkgZm9sZGVkLCBzbyBpdCBpcyByZWplY3RlZCB0aGUgbW9tZW50IHRoZVxuK3ZlcmlmaWVyIHRyaWVzIHRvIGJpbmQgaXQuIEEgQlRGIGlzIHJlZnVzZWQgb3V0cmlnaHQgZm9yIGEgc2lnbmVkIHByb2dyYW0gLSBhXG4ra3N5bSBvciBhIEJURiBmZCBpbiBgYGZkX2FycmF5YGAsIHdoZXRoZXIgcmVzb2x2ZWQgdXAgZnJvbnQgb3IgbGF6aWx5IGZvciBhXG4rbW9kdWxlIGtmdW5jLCBpcyByZWplY3RlZCB3aGVuIGl0IHdvdWxkIGJlIGJvdW5kLiBUb2dldGhlciB3aXRoIHRoZSBmb2xkIHJ1bGVcbithYm92ZSB0aGlzIGtlZXBzIHRoZSB2ZXJkaWN0IGJpbmFyeTogYSBzaWduZWQgcHJvZ3JhbSBjYW5ub3QgdXNlIGEgbWFwIGl0c1xuK3NpZ25hdHVyZSBkb2VzIG5vdCBjb3ZlciwgYW5kIGEgZGlmZmVyZW50IGJ1dCBlcXVhbGx5IGRpZ2VzdC1ib3VuZCBtYXAgY2Fubm90IGJlXG4rc3Vic3RpdHV0ZWQgYXQgYW4gYGBmZF9hcnJheWBgIHNsb3QuIE5vbi1leGNsdXNpdmUgbWFwcyBhcmUgbmV2ZXIgZm9sZGVkLCBzbyBhXG4rc2lnbmVkIHByb2dyYW0gY2Fubm90IHVzZSBvbmUgYXQgYWxsLlxuK1xuK1RoZSB2ZXJkaWN0XG4rPT09PT09PT09PT1cbitcbitBIHByb2dyYW0gaXMgZWl0aGVyIHVuc2lnbmVkIG9yIGZ1bGx5IHZlcmlmaWVkIC0gdGhlcmUgaXMgbm8gaW50ZXJtZWRpYXRlXG4rc3RhdGUuIFRoZSBvdXRjb21lIGlzIHJlY29yZGVkIGluIGBgcHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLnZlcmRpY3RgYDpcbitcbisuLiBjb2RlLWJsb2NrOjogY1xuK1xuKyAgICBlbnVtIGJwZl9zaWdfdmVyZGljdCB7XG4rICAgICAgICAgICAgQlBGX1NJR19VTlNJR05FRCA9IDAsXG4rICAgICAgICAgICAgQlBGX1NJR19WRVJJRklFRCxcbisgICAgfTtcbitcbitgYEJQRl9TSUdfVkVSSUZJRURgYCBtZWFucyB0aGUgc2lnbmF0dXJlIGlzIHZhbGlkIGFuZCBjb3ZlcnMgdGhlIGluc3RydWN0aW9uc1xuKyphbmQqIHRoZSBmcm96ZW4gY29udGVudHMgb2YgZXZlcnkgZXhjbHVzaXZlIG1hcCB0aGUgcHJvZ3JhbSB1c2VzOlxuK1xuKy0gRm9yIGFuIG9yZGluYXJ5LCBkaXJlY3RseS1sb2FkZWQgc2lnbmVkIHByb2dyYW0gdGhlIGluc3RydWN0aW9ucyBhcmUgdGhlIHdob2xlXG4rICBhcnRpZmFjdCBhbmQgaXQgdXNlcyBubyBleGNsdXNpdmUgbWFwcywgc28gYSB2YWxpZCBpbnN0cnVjdGlvbiBzaWduYXR1cmUgaXNcbisgIHRoZSBjb21wbGV0ZSB2ZXJpZmljYXRpb24uXG4rLSBGb3IgYSBzaWduZWQgbG9hZGVyIHRoZSBtZXRhZGF0YSBtYXAgaXMgZXhjbHVzaXZlLCBzbyBpdHMgY29udGVudHMgYXJlIGZvbGRlZFxuKyAgaW4gYW5kIHRoZSBzaWduYXR1cmUgY292ZXJzIGBgaW5zbnMgfHwgbWV0YWRhdGFgYC5cbitcbitUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gXCJpbnN0cnVjdGlvbnMgdmVyaWZpZWQgYnV0IG1ldGFkYXRhIG5vdFwiIHZlcmRpY3Q6IGFcbitzaWduZWQgbG9hZGVyIHRoYXQgZmFpbHMgdG8gY292ZXIgaXRzIG1ldGFkYXRhIGlzICpyZWplY3RlZCogKHNlZSBhYm92ZSksIG5vdFxuK3JlY29yZGVkIHdpdGggYSB3ZWFrZXIgdmVyZGljdC4gYGBCUEZfU0lHX1ZFUklGSUVEYGAgdGhlcmVmb3JlIGFsd2F5cyBtZWFucyB0aGVcbitwcm9ncmFtIGFuZCBldmVyeXRoaW5nIHRoZSBzaWduYXR1cmUgaXMgcmVzcG9uc2libGUgZm9yIGFyZSBhdXRoZW50aWMsIHdoaWNoIGlzXG4rd2hhdCBhIHBvbGljeSBjYW4gcmVseSBvbi5cbitcbitBbG9uZ3NpZGUgdGhlIHZlcmRpY3QgdGhlIGtlcm5lbCByZWNvcmRzIHdoaWNoIGtleXJpbmcgdmFsaWRhdGVkIHRoZSBzaWduYXR1cmU7XG4rc2VlIGBLZXlyaW5nc2BfLlxuK1xuK0VuZm9yY2VtZW50IHZpYSBMU01zXG4rPT09PT09PT09PT09PT09PT09PT1cbitcbitTaWduaW5nIG9ubHkgKnJlY29yZHMqIGEgdmVyZGljdDsgYW4gTFNNIHR1cm5zIGl0IGludG8gcG9saWN5LiBUaGUgdmVyZGljdCBhbmRcbitrZXlyaW5nIGZpZWxkcyBsaXZlIGluIGBgc3RydWN0IGJwZl9wcm9nX2F1eGBgLCBzbyBhIEJQRiBMU00gcHJvZ3JhbSBjYW4gcmVhZFxuK3RoZW0gZGlyZWN0bHkgKHNlZSBEb2N1bWVudGF0aW9uL2JwZi9wcm9nX2xzbS5yc3QgZm9yIHdyaXRpbmcgYW5kIGF0dGFjaGluZyBCUEZcbitMU00gcHJvZ3JhbXMpOyB0aGUgc2FtZSBmaWVsZHMgYXJlIGVxdWFsbHkgYXZhaWxhYmxlIHRvIGluLXRyZWUgTFNNcy4gVHdvIGhvb2tzXG4rYXJlIHVzZWZ1bCBhdCBkaWZmZXJlbnQgcG9pbnRzIG9mIHRoZSBsb2FkOiB0aGUgZGVkaWNhdGVkXG4rYGBzZWN1cml0eV9icGZfcHJvZ19sb2FkKClgYCBnYXRlcyBhZG1pc3Npb24gYmVmb3JlIHRoZSBtYWluIHZlcmlmaWNhdGlvbiB3b3JrLFxuK2FuZCB0aGUgZXhpc3RpbmcgYGBzZWN1cml0eV9icGZfcHJvZygpYGAgb2JzZXJ2ZXMgYSBwcm9ncmFtIHRoYXQgaGFzIGZ1bGx5XG4rbG9hZGVkLlxuK1xuK0FkbWlzc2lvbjogYGBzZWN1cml0eV9icGZfcHJvZ19sb2FkKClgYFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuK1xuK1RoaXMgaG9vayBnYXRlcyBhZG1pc3Npb24gKipmb3IgZXZlcnkgbG9hZCoqLCBmcm9tIGEgc2luZ2xlIGNhbGwgc2l0ZSBpbnNpZGUgdGhlXG4rdmVyaWZpZXIgKGBgYnBmX2NoZWNrKClgYCksIGJlZm9yZSB0aGUgbWFpbiB2ZXJpZmljYXRpb24gd29yay4gSXQgcnVucyBhZnRlciB0aGVcbitvcHRpb25hbCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCBzbyB0aGUgdmVyZGljdCBhbmQga2V5cmluZyBmaWVsZHMgYXJlIGZpbmFsIC0gdGhlXG4raG9vayBjYW4gc2VlIHdoZXRoZXIsIGFuZCBob3cgc3Ryb25nbHksIHRoZSBwcm9ncmFtIHdhcyBzaWduZWQsIHdoaWNoIGtleXJpbmdcbit2YWxpZGF0ZWQgaXQsIHRoZSBsb2FkIGBgYXR0cmBgLCB0aGUgQlBGIHRva2VuIGFuZCB3aGV0aGVyIHRoZSBsb2FkIGNhbWUgZnJvbSB0aGVcbitrZXJuZWwuIEZvciBhIHNpZ25lZCBsb2FkIHRoZSB2ZXJkaWN0IGlzIGBgQlBGX1NJR19WRVJJRklFRGBgIGhlcmUgKHRoZSBzaWduYXR1cmVcbitoYXMganVzdCBiZWVuIGNoZWNrZWQpOyBmb3IgYW4gdW5zaWduZWQgbG9hZCBpdCBpcyBgYEJQRl9TSUdfVU5TSUdORURgYC5cbitcbitUaGlzIGlzIHRoZSBwbGFjZSBmb3IgKmNvYXJzZSBhZG1pc3Npb24qIHRoYXQgbXVzdCBhbHNvIHNlZSB1bnNpZ25lZCBhbmRcbitub3QteWV0LXZlcmlmaWVkIGxvYWRzOiByZXF1aXJlIGEgc2lnbmF0dXJlIGF0IGFsbCwgcmVzdHJpY3QgdGhlIGFjY2VwdGFibGVcbitrZXlyaW5nLCByZXN0cmljdCB3aGljaCB0b2tlbi9jcmVkZW50aWFscyBtYXkgbG9hZCBCUEYsIGFwcGx5IHBlci1wcm9ncmFtLXR5cGVcbitydWxlcywgb3IgYXVkaXQgZXZlcnkgbG9hZCBhdHRlbXB0IHRoYXQgbWFrZXMgaXQgcGFzdCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIC1cbithdHRlbXB0cyBmYWlsaW5nIHRoZSBzaWduYXR1cmUgb3IgdGhlIG1ldGFkYXRhIGJpbmRpbmcgYWJvcnQgYmVmb3JlIHRoaXMgaG9va1xuK2ZpcmVzLiBJdCBpcyB0aGUgcHJpbWFyeSBkZW55IHBvaW50LlxuK1xuK09uZSBzdWJ0bGV0eTogdGhpcyBob29rIHJ1bnMgKmJlZm9yZSogdGhlIHZlcmlmaWVyIGZpbmlzaGVzIGl0cyB3b3JrLCBzb1xuK2BgQlBGX1NJR19WRVJJRklFRGBgICpoZXJlKiBtZWFucyBvbmx5IFwidmFsaWRseSBzaWduZWRcIiAtIG5vdCBcImxvYWRlZFwiLiBBbGxvd2luZ1xuK2EgbG9hZCBhdCB0aGlzIHBvaW50IGxldHMgaXQgKnByb2NlZWQqOyBpdCBkb2VzIG5vdCBndWFyYW50ZWUgdGhlIHByb2dyYW0gd2lsbFxuK2xvYWQuIEEgdmFsaWRseSBzaWduZWQgcHJvZ3JhbSBjYW4gc3RpbGwgYmUgcmVqZWN0ZWQgYWZ0ZXJ3YXJkcyBvbiB0d29cbitpbmRlcGVuZGVudCBncm91bmRzOiB0aGUgdmVyaWZpZXIgbWF5IHJlamVjdCBpdCBsaWtlIGFueSBvdGhlciBwcm9ncmFtICh1bnNhZmVcbittZW1vcnkgYWNjZXNzLCBiYWQgY29udHJvbCBmbG93LCByZXNvdXJjZSBsaW1pdHMsIC4uLiksIGFuZCB0aGUga2VybmVsIHNlcGFyYXRlbHlcbityZWZ1c2VzIC0gYXMgdGhlIHZlcmlmaWVyIHJlc29sdmVzIGluc3RydWN0aW9ucyBhbmQgYmluZHMgZWFjaCBvYmplY3QgLSBhbnkgbWFwXG4rdGhlIHNpZ25hdHVyZSBkb2VzIG5vdCBjb3ZlciBvciBhbnkgQlRGIGF0IGFsbCwgcmVnYXJkbGVzcyBvZiB3aGF0IHRoaXMgaG9va1xuK3JldHVybmVkLiBPbmx5IGFmdGVyIHRoZSBwcm9ncmFtIGhhcyBmdWxseSBsb2FkZWQsIGF0IHRoZSBuZXh0IGhvb2tcbisoYGBzZWN1cml0eV9icGZfcHJvZygpYGApLCBkb2VzIGBgQlBGX1NJR19WRVJJRklFRGBgIGNhcnJ5IGl0cyBmdWxsIG1lYW5pbmc6XG4rdmFsaWRseSBzaWduZWQgKmFuZCogZnVsbHkgdmVyaWZpZWQuXG4rXG4rQSBtb3JlIHJlYWxpc3RpYyBhZG1pc3Npb24gcG9saWN5IHRoYW4gXCJpcyBpdCBzaWduZWQgYXQgYWxsXCI6IGFjY2VwdCBwcm9ncmFtc1xuK3NpZ25lZCBieSBhIHN5c3RlbSBrZXlyaW5nLCBhY2NlcHQgYSB1c2VyLWtleXJpbmcgc2lnbmF0dXJlIG9ubHkgaWYgdGhlXG4ra2V5L2tleXJpbmcgaXQgd2FzIHZlcmlmaWVkIGFnYWluc3QgaXMgb24gYW4gZXhwbGljaXQgYWxsb3dsaXN0LCBhbmQgZW1pdCBhXG4rdGFtcGVyLWV2aWRlbnQgcmVjb3JkIG9mIGV2ZXJ5IGRlY2lzaW9uIHNvIHRoYXQgZXZlbiBkZW5pZWQgYXR0ZW1wdHMgYXJlXG4rYXVkaXRhYmxlLiAoSWxsdXN0cmF0aXZlIC0gZXJyb3IgY2hlY2tpbmcgZWxpZGVkLilcbitcbisuLiBjb2RlLWJsb2NrOjogY1xuK1xuKyAgICAvKiBTZXJpYWxzIG9mIHVzZXIga2V5cy9rZXlyaW5ncyB3ZSBhZGRpdGlvbmFsbHkgdHJ1c3QuICovXG4rICAgIHN0cnVjdCB7XG4rICAgICAgICAgICAgX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTtcbisgICAgICAgICAgICBfX3R5cGUoa2V5LCBfX3MzMik7ICAgICAgICAgICAgIC8qIGtleXJpbmdfc2VyaWFsICovXG4rICAgICAgICAgICAgX190eXBlKHZhbHVlLCBfX3U4KTtcbisgICAgICAgICAgICBfX3VpbnQobWF4X2VudHJpZXMsIDY0KTtcbisgICAgfSB0cnVzdGVkX3VzZXJfa2V5cyBTRUMoXCIubWFwc1wiKTtcbitcbisgICAgLyogQXVkaXQgc3RyZWFtIGNvbnN1bWVkIGJ5IGEgdXNlcnNwYWNlIGxvZ2dlci4gKi9cbisgICAgc3RydWN0IHtcbisgICAgICAgICAgICBfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1JJTkdCVUYpO1xuKyAgICAgICAgICAgIF9fdWludChtYXhfZW50cmllcywgMSBcdTAwM2NcdTAwM2MgMTYpO1xuKyAgICB9IGF1ZGl0IFNFQyhcIi5tYXBzXCIpO1xuK1xuKyAgICBzdHJ1Y3QgZGVjaXNpb24geyBfX3UzMiBwcm9nX3R5cGUsIHZlcmRpY3QsIGt0eXBlOyBfX3MzMiBzZXJpYWwsIHJldDsgfTtcbitcbisgICAgU0VDKFwibHNtL2JwZl9wcm9nX2xvYWRcIilcbisgICAgaW50IEJQRl9QUk9HKGFkbWl0LCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyLFxuKyAgICAgICAgICAgICAgICAgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sIGJvb2wga2VybmVsKVxuKyAgICB7XG4rICAgICAgICAgICAgX191MzIgdmVyZGljdCA9IHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy52ZXJkaWN0O1xuKyAgICAgICAgICAgIF9fdTMyIGt0eXBlICAgPSBwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcua2V5cmluZ190eXBlO1xuKyAgICAgICAgICAgIF9fczMyIHNlcmlhbCAgPSBwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcua2V5cmluZ19zZXJpYWw7XG4rICAgICAgICAgICAgc3RydWN0IGRlY2lzaW9uICpkO1xuKyAgICAgICAgICAgIGludCByZXQgPSAwO1xuK1xuKyAgICAgICAgICAgIGlmIChrZXJuZWwpXG4rICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHRydXN0IGluLWtlcm5lbCBsb2FkcyAqL1xuK1xuKyAgICAgICAgICAgIGlmICh2ZXJkaWN0ICE9IEJQRl9TSUdfVkVSSUZJRUQpXG4rICAgICAgICAgICAgICAgICAgICByZXQgPSAtRVBFUk07ICAgICAgICAgICAgICAgICAgIC8qIG11c3QgYmUgdmFsaWRseSBzaWduZWQgKi9cbisgICAgICAgICAgICBlbHNlIGlmIChrdHlwZSA9PSBCUEZfU0lHX0tFWVJJTkdfVVNFUiBcdTAwMjZcdTAwMjZcbisgICAgICAgICAgICAgICAgICAgICAhYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ0cnVzdGVkX3VzZXJfa2V5cywgXHUwMDI2c2VyaWFsKSlcbisgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FUEVSTTsgICAgICAgICAgICAgICAgICAgLyoga2V5L2tleXJpbmcgbm90IGFsbG93bGlzdGVkICovXG4rXG4rICAgICAgICAgICAgZCA9IGJwZl9yaW5nYnVmX3Jlc2VydmUoXHUwMDI2YXVkaXQsIHNpemVvZigqZCksIDApO1xuKyAgICAgICAgICAgIGlmIChkKSB7XG4rICAgICAgICAgICAgICAgICAgICBkLVx1MDAzZXByb2dfdHlwZSA9IGF0dHItXHUwMDNlcHJvZ190eXBlO1xuKyAgICAgICAgICAgICAgICAgICAgZC1cdTAwM2V2ZXJkaWN0ID0gdmVyZGljdDtcbisgICAgICAgICAgICAgICAgICAgIGQtXHUwMDNla3R5cGUgPSBrdHlwZTtcbisgICAgICAgICAgICAgICAgICAgIGQtXHUwMDNlc2VyaWFsID0gc2VyaWFsO1xuKyAgICAgICAgICAgICAgICAgICAgZC1cdTAwM2VyZXQgPSByZXQ7XG4rICAgICAgICAgICAgICAgICAgICBicGZfcmluZ2J1Zl9zdWJtaXQoZCwgMCk7ICAgICAgIC8qIHJlY29yZCBhbGxvdyAqYW5kKiBkZW55ICovXG4rICAgICAgICAgICAgfVxuKyAgICAgICAgICAgIHJldHVybiByZXQ7XG4rICAgIH1cbitcbitPYnNlcnZpbmcgYSB2ZXJpZmllZCBsb2FkOiBgYHNlY3VyaXR5X2JwZl9wcm9nKClgYFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4rXG4rVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIHNlcGFyYXRlIFwibWV0YWRhdGEgYXR0ZXN0ZWRcIiBob29rLiBUaGUgY292ZXJhZ2UgY2hlY2tcbithYm92ZSBpcyBlbmZvcmNlZCBieSB0aGUga2VybmVsIHVuY29uZGl0aW9uYWxseSwgc28gYSBzaWduZWQgbG9hZGVyIHRoYXQgZmFpbHNcbit0byBjb3ZlciBpdHMgbWV0YWRhdGEgbmV2ZXIgbG9hZHMgYW5kIGFuIExTTSBuZXZlciBoYXMgdG8gcmUtZXN0YWJsaXNoIHRoYXRcbitmYWN0LiBUbyAqYWN0IG9uKiBhIHByb2dyYW0gdGhhdCBoYXMgc3VjY2Vzc2Z1bGx5IGFuZCBmdWxseSBsb2FkZWQsIHVzZSB0aGVcbitleGlzdGluZyBgYHNlY3VyaXR5X2JwZl9wcm9nKClgYCBob29rIChgYGxzbS9icGZfcHJvZ2BgKSwgd2hpY2ggZmlyZXMgZnJvbVxuK2BgYnBmX3Byb2dfbmV3X2ZkKClgYCAtIGFmdGVyIHRoZSB2ZXJpZmllciwgYWZ0ZXIgdGhlIGNvdmVyYWdlIGNoZWNrLCBhbmQgYWZ0ZXJcbitgYGJwZl9wcm9nX2FsbG9jX2lkKClgYC4gUmVsYXRpdmUgdG8gdGhlIGFkbWlzc2lvbiBob29rIHRoaXMgcG9pbnQgaXMgc3RyaWN0bHlcbitsYXRlciBhbmQgc3Ryb25nZXI6XG4rXG4rLSB0aGUgcHJvZ3JhbSBoYXMgYW4gaWQgKGBgcHJvZy1cdTAwM2VhdXgtXHUwMDNlaWRgYCksIHNvIGl0IGNhbiBiZSByZWNvcmRlZCBvciBjb3JyZWxhdGVkXG4rICB3aXRoIGxhdGVyIGV2ZW50cztcbistIGBgdmVyZGljdCA9PSBCUEZfU0lHX1ZFUklGSUVEYGAgKmhlcmUqIG1lYW5zICoqZnVsbHkqKiB2ZXJpZmllZCAtIGEgcHJvZ3JhbVxuKyAgdGhhdCB1c2VkIGEgbWFwIHRoZSBzaWduYXR1cmUgZG9lcyBub3QgY292ZXIgd2FzIGFscmVhZHkgcmVqZWN0ZWQsIHNvIGl0IGNhbm5vdFxuKyAgcmVhY2ggdGhpcyBwb2ludDtcbistIGl0IG9ic2VydmVzIG9ubHkgcHJvZ3JhbXMgdGhhdCBhY3R1YWxseSBsb2FkZWQ7IGEgZmFpbGVkIGxvYWQgbmV2ZXIgbWludHMgYW5cbisgIGZkLCBzbyBpdCBuZXZlciByZWFjaGVzIHRoaXMgaG9vay5cbitcbitJdCB0YWtlcyBvbmx5IHRoZSBgYHByb2dgYCBhbmQgYSBub24temVybyByZXR1cm4gc3RpbGwgYWJvcnRzICh0aGUgZmQgaXMgbm90XG4raGFuZGVkIG91dCksIHNvIGl0IGNhbiB2ZXRvIGFzIHdlbGwgYXMgb2JzZXJ2ZS4gT25lIHdyaW5rbGU6IGl0IGFsc28gZmlyZXMgb25cbitvdGhlciBwYXRocyB0aGF0IG1pbnQgYSBuZXcgcHJvZ3JhbSBmZCAtIG5vdGFibHkgYGBicGZfcHJvZ19nZXRfZmRfYnlfaWQoKWBgIC1cbitub3QganVzdCBvbiBhIGZyZXNoIGxvYWQuIEJlY2F1c2UgdGhlIHByb2dyYW0gYWxyZWFkeSBoYXMgaXRzIGlkIGhlcmUsIGFuIExTTVxuK2NhbiB0ZWxsIHRoZSB0d28gYXBhcnQgd2l0aCBhIHNtYWxsIGhhc2ggbWFwOiB0aGUgKmZpcnN0KiB0aW1lIGFuIGlkIGlzIHNlZW4gaXNcbit0aGUgbG9hZDsgYSBsYXRlciBzaWdodGluZyBvZiB0aGUgc2FtZSBpZCBpcyBqdXN0IGFub3RoZXIgZmQgdG8gYSBwcm9ncmFtIHRoYXRcbithbHJlYWR5IGV4aXN0cy5cbitcbitUbyBib3VuZCB0aGUgbWFwIGFuZCBsZXQgYSByZXVzZWQgaWQgcmVhZCBhcyBhIGZyZXNoIGxvYWQsIHRoaXMgY2FuIGJlIHBhaXJlZFxuK3dpdGggYGBzZWN1cml0eV9icGZfcHJvZ19mcmVlKClgYCAoYGBsc20vYnBmX3Byb2dfZnJlZWBgKSwgd2hpY2ggZGVsZXRlcyB0aGVcbitlbnRyeSBvbiB0ZWFyZG93biAtIGtleWVkIGJ5IHRoZSBzYW1lIGBgcHJvZ2BgIHBvaW50ZXIsIHNpbmNlXG4rYGBicGZfcHJvZ19mcmVlX2lkKClgYCBoYXMgYWxyZWFkeSBjbGVhcmVkIGBgcHJvZy1cdTAwM2VhdXgtXHUwMDNlaWRgYCB0byBgYDBgYCBieSB0aGUgdGltZVxuK3RoYXQgaG9vayBydW5zLiAoSWxsdXN0cmF0aXZlIC0gcHJpdmlsZWdlZCBMU00sIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pXG4rXG4rLi4gY29kZS1ibG9jazo6IGNcbitcbisgICAgc3RydWN0IHJlYyB7IF9fdTMyIGlkLCBrdHlwZTsgX19zMzIgc2VyaWFsOyB9O1xuK1xuKyAgICBzdHJ1Y3Qge1xuKyAgICAgICAgICAgIF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7XG4rICAgICAgICAgICAgX190eXBlKGtleSwgX191NjQpOyAgICAgICAgICAgICAvKiBzdHJ1Y3QgYnBmX3Byb2cgKiAtLSBzdGFibGUgaWQgKi9cbisgICAgICAgICAgICBfX3R5cGUodmFsdWUsIHN0cnVjdCByZWMpO1xuKyAgICAgICAgICAgIF9fdWludChtYXhfZW50cmllcywgNDA5Nik7XG4rICAgIH0gbGl2ZSBTRUMoXCIubWFwc1wiKTtcbitcbisgICAgU0VDKFwibHNtL2JwZl9wcm9nXCIpICAgICAgICAgICAgLyogZmlyZXMgYWZ0ZXIgbG9hZCBhbmQgb24gZXZlcnkgbGF0ZXIgZmQgKi9cbisgICAgaW50IEJQRl9QUk9HKG9ic2VydmUsIHN0cnVjdCBicGZfcHJvZyAqcHJvZylcbisgICAge1xuKyAgICAgICAgICAgIF9fdTY0IGtleSA9IChfX3U2NCkodW5zaWduZWQgbG9uZylwcm9nO1xuKyAgICAgICAgICAgIHN0cnVjdCByZWMgcjtcbitcbisgICAgICAgICAgICBpZiAocHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLnZlcmRpY3QgIT0gQlBGX1NJR19WRVJJRklFRClcbisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuKyAgICAgICAgICAgIGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNmxpdmUsIFx1MDAyNmtleSkpXG4rICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAvKiBzZWVuIGJlZm9yZTogYSBsYXRlciBmZCwgbm90IGEgbG9hZCAqL1xuK1xuKyAgICAgICAgICAgIC8qIEZpcnN0IHNpZ2h0aW5nID09IHRoaXMgcHJvZ3JhbSBqdXN0IGxvYWRlZDsgaWQgaXMgdmFsaWQgaGVyZS4gKi9cbisgICAgICAgICAgICByLmlkICAgICA9IHByb2ctXHUwMDNlYXV4LVx1MDAzZWlkO1xuKyAgICAgICAgICAgIHIua3R5cGUgID0gcHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLmtleXJpbmdfdHlwZTtcbisgICAgICAgICAgICByLnNlcmlhbCA9IHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3NlcmlhbDtcbisgICAgICAgICAgICBicGZfbWFwX3VwZGF0ZV9lbGVtKFx1MDAyNmxpdmUsIFx1MDAyNmtleSwgXHUwMDI2ciwgQlBGX05PRVhJU1QpO1xuKyAgICAgICAgICAgIC8qIC4uLiBuZXdseS1sb2FkZWQgdmVyaWZpZWQtcHJvZ3JhbSBhY3Rpb24sIGUuZy4gcmVjb3JkIHIuaWQgLi4uICovXG4rICAgICAgICAgICAgcmV0dXJuIDA7XG4rICAgIH1cbitcbitQdXR0aW5nIHRoZW0gdG9nZXRoZXI6IHRvICpyZXF1aXJlKiB2ZXJpZmllZCBCUEYsIGRlbnkgYXQgdGhlIGFkbWlzc2lvbiBob29rXG4rdW5sZXNzIHRoZSB2ZXJkaWN0IGlzIGBgQlBGX1NJR19WRVJJRklFRGBgIChhbmQsIGlmIGRlc2lyZWQsIHJlc3RyaWN0IHRoZVxuK2tleXJpbmcpLiBUaGUga2VybmVsIHRoZW4gZ3VhcmFudGVlcyB0aGF0IGFueSBwcm9ncmFtIHdoaWNoIGFjdHVhbGx5IGxvYWRzIHdpdGhcbit0aGF0IHZlcmRpY3QgY292ZXJlZCBhbGwgb2YgaXRzIGV4Y2x1c2l2ZSBtYXBzLCByZWplY3RpbmcgYW55IHRoYXQgZGlkIG5vdCAtIHNvXG4rYSBkZW55LWJ5LWRlZmF1bHQgYWRtaXNzaW9uIHBvbGljeSBuZWVkcyBubyBzZWNvbmQgZW5mb3JjZW1lbnQgcG9pbnQuIFVzZVxuK2Bgc2VjdXJpdHlfYnBmX3Byb2coKWBgIHRvIHJlY29yZCBvciBmaW5hbGx5IGdhdGUgdGhlIHZlcmlmaWVkIHByb2dyYW1zIG9uY2Vcbit0aGV5IGNhcnJ5IGFuIGlkLiBUaGUgYGB2ZXJkaWN0YGAsIGBga2V5cmluZ190eXBlYGAgYW5kIGBga2V5cmluZ19zZXJpYWxgYCBmaWVsZHNcbitsZXQgYSBwb2xpY3kgZGlzdGluZ3Vpc2gsIGZvciBleGFtcGxlLCBcInZlcmlmaWVkIGFuZCBzaWduZWQgYnkgYSBidWlsdGluIGtleVwiXG4rZnJvbSBcInZlcmlmaWVkIGJ5IGEgdXNlciBrZXlcIi4gQSBwb2xpY3kgTFNNIHN1Y2ggYXMgSVBFIGNvdWxkIGNvbnN1bWUgdGhlIHNhbWVcbitob29rcyB0byBlbmZvcmNlIHN5c3RlbSBwb2xpY3kgd2l0aG91dCB3cml0aW5nIGFueSBCUEYsIHRob3VnaCBub25lIGltcGxlbWVudHNcbit0aGlzIHRvZGF5LlxuK1xuK0tleXJpbmdzXG4rPT09PT09PT1cbitcbitgYGtleXJpbmdfaWRgYCBzZWxlY3RzIHRoZSB0cnVzdGVkIGtleXJpbmcgdGhlIFBLQ1MjNyBzaWduYXR1cmUgaXMgdmVyaWZpZWRcbithZ2FpbnN0LiBUaGUgd2VsbC1rbm93biBpZHMgYGAwYGAgKGJ1aWx0aW4pLCBgYFZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkdgYFxuK2FuZCBgYFZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklOR2BgIHNlbGVjdCB0aGUgY29ycmVzcG9uZGluZyBzeXN0ZW0ga2V5cmluZ3M7XG4rYW55IG90aGVyIHZhbHVlIGlzIHRyZWF0ZWQgYXMgdGhlIHNlcmlhbCBvZiBhIHVzZXIvc2Vzc2lvbiBrZXkgb3Iga2V5cmluZy5cbitUaGUga2V5cmluZyBpcyBsb29rZWQgdXAgZmlyc3QsIGJlZm9yZSB0aGUgc2lnbmF0dXJlIGJ5dGVzIGFyZSBleGFtaW5lZCwgc28gYVxuK3NpZ25hdHVyZSBuYW1pbmcgYSBub24tZXhpc3RlbnQga2V5cmluZyBpcyByZWplY3RlZCB1cCBmcm9udCwgYW5kIGEgZmFpbGVkXG4rdmVyaWZpY2F0aW9uIGFib3J0cyB0aGUgbG9hZCAtIHNvIGEgcHJvZ3JhbSB0aGF0IGxvYWRzIHN1Y2Nlc3NmdWxseSB3aXRoIGFcbitzaWduYXR1cmUgYWx3YXlzIGhhcyBjb25zaXN0ZW50IGtleXJpbmcgZmllbGRzIHJlY29yZGVkLlxuK1xuK1R3byBmaWVsZHMgYXJlIHJlY29yZGVkIGluIGBgcHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnYGAgZm9yIGFuIExTTSB0byBpbnNwZWN0OlxuK1xuK2Bga2V5cmluZ190eXBlYGAgKGBgZW51bSBicGZfc2lnX2tleXJpbmdgYClcbisgICAgQ2xhc3NpZmllZCBwdXJlbHkgZnJvbSBgYGtleXJpbmdfaWRgYCB3aGVuZXZlciB0aGUgcHJvZ3JhbSBpcyBzaWduZWQ6XG4rICAgIGBgQlBGX1NJR19LRVlSSU5HX0JVSUxUSU5gYCwgYGBfU0VDT05EQVJZYGAsIGBgX1BMQVRGT1JNYGAgZm9yIHRoZSBzeXN0ZW1cbisgICAga2V5cmluZ3MsIG9yIGBgX1VTRVJgYCBmb3IgYSB1c2VyL3Nlc3Npb24ga2V5cmluZy4gSXQgaXNcbisgICAgYGBCUEZfU0lHX0tFWVJJTkdfTk9ORWBgIGZvciBhbiB1bnNpZ25lZCBwcm9ncmFtLlxuK1xuK2Bga2V5cmluZ19zZXJpYWxgYCAoYGBzMzJgYClcbisgICAgU2V0ICoqb25seSoqIG9uIGEgc3VjY2Vzc2Z1bCB2ZXJpZmljYXRpb24sIHRvIHRoZSBzZXJpYWwgb2YgdGhlXG4rICAgICoqdXNlci9zZXNzaW9uIGtleSBvciBrZXlyaW5nKiogdGhhdCBgYGtleXJpbmdfaWRgYCByZXNvbHZlZCB0byAtIHRoZVxuKyAgICBvYmplY3QgdGhlIHNpZ25hdHVyZSB3YXMgdmVyaWZpZWQgYWdhaW5zdCwgbm90IHRoZSBpbmRpdmlkdWFsIGFzeW1tZXRyaWNcbisgICAga2V5IGluc2lkZSBpdCB0aGF0IG1hdGNoZWQgdGhlIHNpZ25lci4gUGFzc2luZ1xuKyAgICBgYEtFWV9TUEVDX1NFU1NJT05fS0VZUklOR2BgLCBmb3IgZXhhbXBsZSwgcmVjb3JkcyB0aGUgc2Vzc2lvbiBrZXlyaW5nJ3NcbisgICAgc2VyaWFsLiBUaGUgc3lzdGVtIGtleXJpbmdzIGFyZSB0cnVzdGVkIGFzIGEgd2hvbGUgYW5kIGV4cG9zZSBubyBzZXJpYWxcbisgICAgaGVyZSwgc28gdGhlIHNlcmlhbCBpcyBgYDBgYCBmb3IgYnVpbHRpbiwgc2Vjb25kYXJ5IGFuZCBwbGF0Zm9ybVxuKyAgICBzaWduYXR1cmVzLCBhbmQgYGAwYGAgZm9yIHVuc2lnbmVkIHByb2dyYW1zLiBJbiBvdGhlciB3b3JkcywgYSBub24temVyb1xuKyAgICBgYGtleXJpbmdfc2VyaWFsYGAgaXMgZXhhY3RseSBcInZlcmlmaWVkIGFnYWluc3QgdGhlIHVzZXIga2V5L2tleXJpbmcgd2l0aFxuKyAgICB0aGlzIHNlcmlhbFwiLlxuK1xuKy4uIGxpc3QtdGFibGU6OlxuKyAgIDpoZWFkZXItcm93czogMVxuK1xuKyAgICogLSBgYGtleXJpbmdfaWRgYFxuKyAgICAgLSBgYGtleXJpbmdfdHlwZWBgXG4rICAgICAtIGBga2V5cmluZ19zZXJpYWxgYFxuKyAgICogLSAobm8gc2lnbmF0dXJlKVxuKyAgICAgLSBgYEJQRl9TSUdfS0VZUklOR19OT05FYGBcbisgICAgIC0gYGAwYGBcbisgICAqIC0gYGAwYGBcbisgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfQlVJTFRJTmBgXG4rICAgICAtIGBgMGBgXG4rICAgKiAtIGBgVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklOR2BgXG4rICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX1NFQ09OREFSWWBgXG4rICAgICAtIGBgMGBgXG4rICAgKiAtIGBgVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HYGBcbisgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk1gYFxuKyAgICAgLSBgYDBgYFxuKyAgICogLSBvdGhlciAoYSB1c2VyL3Nlc3Npb24ga2V5IHNlcmlhbClcbisgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfVVNFUmBgXG4rICAgICAtIHNlcmlhbCBvZiB0aGUgcmVzb2x2ZWQga2V5L2tleXJpbmdcbitcbitQcm9kdWNpbmcgYSBzaWduZWQgb2JqZWN0XG4rPT09PT09PT09PT09PT09PT09PT09PT09PT1cbitcbitgYGJwZnRvb2xgYCBnZW5lcmF0ZXMgYW5kIHNpZ25zIGEgbGlnaHQgc2tlbGV0b24gaW4gb25lIHN0ZXA6OlxuK1xuKyAgICBicGZ0b29sIGdlbiBza2VsZXRvbiAtTCAtUyAtayBcdTAwM2Nwcml2YXRlX2tleS5wZW1cdTAwM2UgLWkgXHUwMDNjY2VydGlmaWNhdGUueDUwOVx1MDAzZSBcXFxuKyAgICAgICAgICAgIG9iai5icGYubyBcdTAwM2Ugb2JqLmxza2VsLmhcbitcbitgYC1MYGAgc2VsZWN0cyB0aGUgbGlnaHQtc2tlbGV0b24gKGBgZ2VuX2xvYWRlcmBgKSBiYWNrZW5kIGFuZCBgYC1TYGAgZW5hYmxlc1xuK3NpZ25pbmc7IGBgLWtgYCBhbmQgYGAtaWBgIHN1cHBseSB0aGUgc2lnbmluZyBrZXkgYW5kIGl0cyBYLjUwOSBjZXJ0aWZpY2F0ZS5cbitgYGJwZnRvb2xgYCBzaWducyBgYGluc25zIHx8IG1ldGFkYXRhYGAgLSB0aGUgZXhhY3QgYnl0ZXMgdGhlIGtlcm5lbFxuK3JlY29uc3RydWN0cyAtIGFuZCBhbHNvIGNvbXB1dGVzIGBgZXhjbF9wcm9nX2hhc2hgYCBhcyB0aGUgZGlnZXN0IG9mIHRoZSBsb2FkZXJcbitpbnN0cnVjdGlvbnMgc28gdGhlIG1ldGFkYXRhIG1hcCBjYW4gYmUgYm91bmQgdG8gdGhlIGxvYWRlci4gVGhlIHNpZ25hdHVyZSBhbmRcbitoYXNoIGFyZSBlbWJlZGRlZCBpbiB0aGUgZ2VuZXJhdGVkIGhlYWRlcjsgdGhlIGNlcnRpZmljYXRlIGlzIHVzZWQgb25seSBmb3JcbitzaWduaW5nIGFuZCBpcyBub3QgaW5jbHVkZWQuIExvYWRpbmcgdGhlIHNrZWxldG9uIHBlcmZvcm1zIHRoZVxuK2NyZWF0ZS9wb3B1bGF0ZS9mcmVlemUvbG9hZCBzZXF1ZW5jZSBkZXNjcmliZWQgYWJvdmUuXG4rXG4rQXQgcnVudGltZSB0aGUgdHJ1c3RlZCBwdWJsaWMga2V5IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgY2hvc2VuIGtleXJpbmcgKGZvclxuK2V4YW1wbGUgYWRkZWQgdG8gdGhlIHNlc3Npb24ga2V5cmluZywgb3IgYnVpbHQgaW50byB0aGUga2VybmVsJ3MgYnVpbHRpbiB0cnVzdGVkXG4ra2V5cmluZykgZm9yIHZlcmlmaWNhdGlvbiB0byBzdWNjZWVkLlxuK1xuK1VBUEkgcmVmZXJlbmNlXG4rPT09PT09PT09PT09PT1cbitcbitgYEJQRl9QUk9HX0xPQURgYCAoYGB1bmlvbiBicGZfYXR0cmBgKTpcbitcbitgYHNpZ25hdHVyZWBgLCBgYHNpZ25hdHVyZV9zaXplYGBcbisgICAgUG9pbnRlciB0byBhbmQgbGVuZ3RoIG9mIHRoZSBQS0NTIzcgc2lnbmF0dXJlIGJsb2IuXG4rXG4rYGBrZXlyaW5nX2lkYGBcbisgICAgVHJ1c3RlZCBrZXlyaW5nIHNlbGVjdG9yIChzZWUgYEtleXJpbmdzYF8pLlxuK1xuK2BgZmRfYXJyYXlgYCwgYGBmZF9hcnJheV9jbnRgYFxuKyAgICBBcnJheSBvZiBtYXAgZmlsZSBkZXNjcmlwdG9ycyBib3VuZCB0byB0aGUgcHJvZ3JhbS4gYGBmZF9hcnJheV9jbnRgYCBtdXN0IGJlXG4rICAgIHNldCBmb3IgdGhlIGtlcm5lbCB0byBzY2FuIHRoZSBhcnJheS4gV2hlbiBhIHNpZ25hdHVyZSBpcyBwcmVzZW50LCBldmVyeSBtYXBcbisgICAgaW4gdGhlIGFycmF5IG11c3QgYmUgZXhjbHVzaXZlOyBpdHMgZnJvemVuIGNvbnRlbnRzIGFyZSBmb2xkZWQgaW50byB0aGVcbisgICAgdmVyaWZpZWQgYnVmZmVyLCBhbmQgYSBub24tZXhjbHVzaXZlIGVudHJ5IGlzIHJlamVjdGVkLlxuK1xuK2BgQlBGX01BUF9DUkVBVEVgYCAoYGB1bmlvbiBicGZfYXR0cmBgKTpcbitcbitgYGV4Y2xfcHJvZ19oYXNoYGAsIGBgZXhjbF9wcm9nX2hhc2hfc2l6ZWBgXG4rICAgIFNIQS0yNTYgZGlnZXN0IG9mIHRoZSBwcm9ncmFtIHBlcm1pdHRlZCB0byBhY2Nlc3MgdGhpcyAoZXhjbHVzaXZlKSBtYXAuIFRoaXNcbisgICAgYmluZHMgdGhlIG1ldGFkYXRhIG1hcCB0byB0aGUgbG9hZGVyOyBpdCBpcyBub3QgYSBoYXNoIG9mIHRoZSBtYXAgKmNvbnRlbnQqLlxuKyAgICBUaGUgbWFwIGNvbnRlbnQgaXMgbm90IGhhc2hlZCBzZXBhcmF0ZWx5IGF0IGFsbCAtIGl0IGlzIGNvdmVyZWQsIGFzIGJ5dGVzLFxuKyAgICBieSB0aGUgcHJvZ3JhbSBzaWduYXR1cmUuXG4rXG4rTm90ZXMgYW5kIGxpbWl0YXRpb25zXG4rPT09PT09PT09PT09PT09PT09PT09PVxuK1xuKy0gVGhlIGluc3RydWN0aW9ucyBwbHVzIGZvbGRlZCBtZXRhZGF0YSBhcmUgdmVyaWZpZWQgYXMgb25lIGBgYnBmX2R5bnB0cmBgLFxuKyAgd2hpY2ggYm91bmRzIHRoZSBjb21iaW5lZCBzaXplIChjdXJyZW50bHkgfjE2IE1pQik7IHZlcnkgbGFyZ2Ugb2JqZWN0cyBjYW5cbisgIGV4Y2VlZCBpdC5cbistIFRoZSBtZXRhZGF0YSBjb250YWluZXIgaXMgYSBzaW5nbGUtZWxlbWVudCBhcnJheSBtYXAsIGFjY2Vzc2VkIHRocm91Z2hcbisgIGBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyYGAuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGYuaCBiL2luY2x1ZGUvbGludXgvYnBmLmhcbmluZGV4IGJhMDk3OTVlMGJmZGI3Li4yZTBmMTJmYjRjZWE4YiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvYnBmLmhcbisrKyBiL2luY2x1ZGUvbGludXgvYnBmLmhcbkBAIC0yOTksNyArMjk5LDYgQEAgc3RydWN0IGJwZl9tYXBfb3duZXIge1xuIFxuIHN0cnVjdCBicGZfbWFwIHtcbiBcdHU4IHNoYVtTSEEyNTZfRElHRVNUX1NJWkVdO1xuLVx0dTMyIGV4Y2w7XG4gXHRjb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgKm9wcztcbiBcdHN0cnVjdCBicGZfbWFwICppbm5lcl9tYXBfbWV0YTtcbiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGZfdmVyaWZpZXIuaCBiL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmhcbmluZGV4IDc2YjhiNzYyN2ExMDg1Li4zMTdlOTliOWFjYzBhNCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmhcbisrKyBiL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmhcbkBAIC04OTgsNiArODk4LDE0IEBAIHN0cnVjdCBicGZfc2NjX2luZm8ge1xuIFxuIHN0cnVjdCBicGZfbGl2ZW5lc3M7XG4gXG4rc3RydWN0IGJwZl9mZF9hcnJheSB7XG4rXHR1bmlvbiB7XG4rXHRcdHN0cnVjdCBicGZfbWFwICptYXA7XG4rXHRcdHN0cnVjdCBidGYgKmJ0ZjtcbitcdFx0dW5zaWduZWQgbG9uZyB2YWw7XG4rXHR9O1xuK307XG4rXG4gLyogc2luZ2xlIGNvbnRhaW5lciBmb3IgYWxsIHN0cnVjdHNcbiAgKiBvbmUgdmVyaWZpZXJfZW52IHBlciBicGZfY2hlY2soKSBjYWxsXG4gICovXG5AQCAtOTM5LDYgKzk0Nyw3IEBAIHN0cnVjdCBicGZfdmVyaWZpZXJfZW52IHtcbiBcdGJvb2wgYnlwYXNzX3NwZWNfdjQ7XG4gXHRib29sIHNlZW5fZGlyZWN0X3dyaXRlO1xuIFx0Ym9vbCBzZWVuX2V4Y2VwdGlvbjtcbitcdGJvb2wgc2lnbmF0dXJlO1xuIFx0c3RydWN0IGJwZl9pbnNuX2F1eF9kYXRhICppbnNuX2F1eF9kYXRhOyAvKiBhcnJheSBvZiBwZXItaW5zbiBzdGF0ZSAqL1xuIFx0Y29uc3Qgc3RydWN0IGJwZl9saW5lX2luZm8gKnByZXZfbGluZm87XG4gXHRzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2xvZyBsb2c7XG5AQCAtOTg5LDcgKzk5OCwxOSBAQCBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiB7XG4gXHR1MzIgZnJlZV9saXN0X3NpemU7XG4gXHR1MzIgZXhwbG9yZWRfc3RhdGVzX3NpemU7XG4gXHR1MzIgbnVtX2JhY2tlZGdlcztcbi1cdGJwZnB0cl90IGZkX2FycmF5O1xuK1x0LypcbitcdCAqIFRoZSBwcm9ncmFtJ3MgZmRfYXJyYXkgY29tZXMgaW4gdHdvIHNoYXBlcywgdG9sZCBhcGFydCBieSB3aGV0aGVyXG4rXHQgKiB0aGUgY2FsbGVyIHBhc3NlZCBmZF9hcnJheV9jbnQuIFRoZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZTpcbitcdCAqICAtIGNvbnRpbnVvdXMgKGZkX2FycmF5X2NudCBnaXZlbik6IC1cdTAwM2VmZF9hcnJheSBob2xkcyBldmVyeSBlbnRyeVxuK1x0ICogICAgcmVzb2x2ZWQgdG8gaXRzIG9iamVjdCB1cCBmcm9udCwgaW5kZXhlZCBieSBmZF9hcnJheSBwb3NpdGlvbixcbitcdCAqICAgIHdpdGggLVx1MDAzZWZkX2FycmF5X2NudCBzbG90czsgLVx1MDAzZWZkX2FycmF5X3JhdyBpcyB1bnVzZWQuXG4rXHQgKiAgLSBzcGFyc2UgKG5vIGZkX2FycmF5X2NudCk6IC1cdTAwM2VmZF9hcnJheSBpcyBOVUxMLCBhbmQgZW50cmllcyBhcmVcbitcdCAqICAgIHJlYWQgZnJvbSAtXHUwMDNlZmRfYXJyYXlfcmF3ICh0aGUgY2FsbGVyJ3MgZmRfYXJyYXkpIGFuZCByZXNvbHZlZFxuK1x0ICogICAgb24gdGhlIHNwb3QgYXQgZWFjaCByZWZlcmVuY2UuXG4rXHQgKi9cbitcdHN0cnVjdCBicGZfZmRfYXJyYXkgKmZkX2FycmF5O1xuK1x0dTMyIGZkX2FycmF5X2NudDtcbitcdGJwZnB0cl90IGZkX2FycmF5X3JhdztcbiBcbiBcdC8qIGJpdCBtYXNrIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBhIHJlZ2lzdGVyIGhhcyBiZWVuIGFjY2Vzc2VkXG4gXHQgKiBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBmdW5jdGlvbiBzdGF0ZSB3YXMgcHJpbnRlZFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvc3lzY2FsbC5jIGIva2VybmVsL2JwZi9zeXNjYWxsLmNcbmluZGV4IDZkYjMwNmQyM2I0NzlmLi4zNThmMmIwY2UyYmQzMSAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvc3lzY2FsbC5jXG4rKysgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xuQEAgLTQwLDcgKzQwLDYgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90cmFjZXBvaW50LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9vdmVyZmxvdy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY29va2llLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC92ZXJpZmljYXRpb24uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zl9pZHMuaFx1MDAzZVxuIFxuICNpbmNsdWRlIFx1MDAzY25ldC9uZXRmaWx0ZXIvbmZfYnBmX2xpbmsuaFx1MDAzZVxuQEAgLTE1OTksMTMgKzE1OTgsNiBAQCBzdGF0aWMgaW50IG1hcF9jcmVhdGVfYWxsb2ModW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLCBzdHJ1Y3QgYnBmX3ZlclxuIFx0XHRcdGVyciA9IC1FRkFVTFQ7XG4gXHRcdFx0Z290byBmcmVlX21hcDtcbiBcdFx0fVxuLVxuLVx0XHQvKiBTZWUgbGliYnBmOiBlbWl0X3NpZ25hdHVyZV9tYXRjaCgpICovXG4tXHRcdEJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgYnBmX21hcCwgZXhjbCkgIT0gU0hBMjU2X0RJR0VTVF9TSVpFKTtcbi1cdFx0QlVJTERfQlVHX09OKCFfX3NhbWVfdHlwZShtYXAtXHUwMDNlZXhjbCwgdTMyKSk7XG4tXHRcdEJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgYnBmX21hcCwgc2hhKSAgIT0gMCk7XG4tXHRcdEJVSUxEX0JVR19PTighX19zYW1lX3R5cGUobWFwLVx1MDAzZXNoYSwgdThbU0hBMjU2X0RJR0VTVF9TSVpFXSkpO1xuLVx0XHRtYXAtXHUwMDNlZXhjbCA9IDE7XG4gXHR9IGVsc2UgaWYgKGF0dHItXHUwMDNlZXhjbF9wcm9nX2hhc2hfc2l6ZSkge1xuIFx0XHRicGZfbG9nKGxvZywgXCJJbnZhbGlkIGV4Y2xfcHJvZ19oYXNoX3NpemUuXFxuXCIpO1xuIFx0XHRlcnIgPSAtRUlOVkFMO1xuQEAgLTI4ODYsNjQgKzI4NzgsNiBAQCBzdGF0aWMgYm9vbCBpc19wZXJmbW9uX3Byb2dfdHlwZShlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlKVxuIFx0fVxuIH1cbiBcbi1zdGF0aWMgZW51bSBicGZfc2lnX2tleXJpbmcgYnBmX2NsYXNzaWZ5X2tleXJpbmcoczMyIGtleXJpbmdfaWQpXG4te1xuLVx0c3dpdGNoIChrZXlyaW5nX2lkKSB7XG4tXHRjYXNlIDA6XG4tXHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfQlVJTFRJTjtcbi1cdGNhc2UgKHMzMikodW5zaWduZWQgbG9uZylWRVJJRllfVVNFX1NFQ09OREFSWV9LRVlSSU5HOlxuLVx0XHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1NFQ09OREFSWTtcbi1cdGNhc2UgKHMzMikodW5zaWduZWQgbG9uZylWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkc6XG4tXHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk07XG4tXHRkZWZhdWx0OlxuLVx0XHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1VTRVI7XG4tXHR9XG4tfVxuLVxuLXN0YXRpYyBpbnQgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgYnBmX3Byb2cgKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyLFxuLVx0XHRcdFx0ICAgICBib29sIGlzX2tlcm5lbCwgczMyICprZXlyaW5nX3NlcmlhbClcbi17XG4tXHRicGZwdHJfdCB1c2lnID0gbWFrZV9icGZwdHIoYXR0ci1cdTAwM2VzaWduYXR1cmUsIGlzX2tlcm5lbCk7XG4tXHRzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuIHNpZ19wdHIsIGluc25zX3B0cjtcbi1cdHN0cnVjdCBicGZfa2V5ICprZXkgPSBOVUxMO1xuLVx0dm9pZCAqc2lnO1xuLVx0aW50IGVyciA9IDA7XG4tXG4tXHQvKlxuLVx0ICogRG9uJ3QgYXR0ZW1wdCB0byB1c2Uga21hbGxvY19sYXJnZSBvciB2bWFsbG9jIGZvciBzaWduYXR1cmVzLlxuLVx0ICogUHJhY3RpY2FsIHNpZ25hdHVyZSBmb3IgQlBGIHByb2dyYW0gc2hvdWxkIGJlIGJlbG93IHRoaXMgbGltaXQuXG4tXHQgKi9cbi1cdGlmIChhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplIFx1MDAzZSBLTUFMTE9DX01BWF9DQUNIRV9TSVpFKVxuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbi1cdGlmIChzeXN0ZW1fa2V5cmluZ19pZF9jaGVjayhhdHRyLVx1MDAzZWtleXJpbmdfaWQpID09IDApXG4tXHRcdGtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuLVx0ZWxzZVxuLVx0XHRrZXkgPSBicGZfbG9va3VwX3VzZXJfa2V5KGF0dHItXHUwMDNla2V5cmluZ19pZCwgMCk7XG4tXG4tXHRpZiAoIWtleSlcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4tXG4tXHRzaWcgPSBrdm1lbWR1cF9icGZwdHIodXNpZywgYXR0ci1cdTAwM2VzaWduYXR1cmVfc2l6ZSk7XG4tXHRpZiAoSVNfRVJSKHNpZykpIHtcbi1cdFx0YnBmX2tleV9wdXQoa2V5KTtcbi1cdFx0cmV0dXJuIFBUUl9FUlIoc2lnKTtcbi1cdH1cbi1cbi1cdGJwZl9keW5wdHJfaW5pdChcdTAwMjZzaWdfcHRyLCBzaWcsIEJQRl9EWU5QVFJfVFlQRV9MT0NBTCwgMCxcbi1cdFx0XHRhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplKTtcbi1cdGJwZl9keW5wdHJfaW5pdChcdTAwMjZpbnNuc19wdHIsIHByb2ctXHUwMDNlaW5zbnNpLCBCUEZfRFlOUFRSX1RZUEVfTE9DQUwsIDAsXG4tXHRcdFx0cHJvZy1cdTAwM2VsZW4gKiBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKSk7XG4tXG4tXHRlcnIgPSBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgoc3RydWN0IGJwZl9keW5wdHIgKilcdTAwMjZpbnNuc19wdHIsXG4tXHRcdFx0XHRcdCAoc3RydWN0IGJwZl9keW5wdHIgKilcdTAwMjZzaWdfcHRyLCBrZXkpO1xuLVx0aWYgKCFlcnIpXG4tXHRcdCprZXlyaW5nX3NlcmlhbCA9IGJwZl9rZXlfc2VyaWFsKGtleSk7XG4tXHRicGZfa2V5X3B1dChrZXkpO1xuLVx0a3ZmcmVlKHNpZyk7XG4tXHRyZXR1cm4gZXJyO1xuLX1cbi1cbiBzdGF0aWMgaW50IGJwZl9wcm9nX21hcmtfaW5zbl9hcnJheXNfcmVhZHkoc3RydWN0IGJwZl9wcm9nICpwcm9nKVxuIHtcbiBcdGludCBlcnI7XG5AQCAtMzEzMywxNyArMzA2Nyw4IEBAIHN0YXRpYyBpbnQgYnBmX3Byb2dfbG9hZCh1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0XG4gXG4gXHQvKiBlQlBGIHByb2dyYW1zIG11c3QgYmUgR1BMIGNvbXBhdGlibGUgdG8gdXNlIEdQTC1lZCBmdW5jdGlvbnMgKi9cbiBcdHByb2ctXHUwMDNlZ3BsX2NvbXBhdGlibGUgPSBsaWNlbnNlX2lzX2dwbF9jb21wYXRpYmxlKGxpY2Vuc2UpID8gMSA6IDA7XG4tXHRpZiAoYXR0ci1cdTAwM2VzaWduYXR1cmUpIHtcbi1cdFx0ZXJyID0gYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShwcm9nLCBhdHRyLCB1YXR0ci5pc19rZXJuZWwsXG4tXHRcdFx0XHRcdFx0XHUwMDI2cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLmtleXJpbmdfc2VyaWFsKTtcbi1cdFx0aWYgKGVycilcbi1cdFx0XHRnb3RvIGZyZWVfcHJvZztcbi1cdFx0cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLmtleXJpbmdfdHlwZSA9IGJwZl9jbGFzc2lmeV9rZXlyaW5nKGF0dHItXHUwMDNla2V5cmluZ19pZCk7XG4tXHRcdHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy52ZXJkaWN0ID0gQlBGX1NJR19WRVJJRklFRDtcbi1cdH0gZWxzZSB7XG4tXHRcdHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3R5cGUgPSBCUEZfU0lHX0tFWVJJTkdfTk9ORTtcbi1cdFx0cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLnZlcmRpY3QgPSBCUEZfU0lHX1VOU0lHTkVEO1xuLVx0fVxuK1x0cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLmtleXJpbmdfdHlwZSA9IEJQRl9TSUdfS0VZUklOR19OT05FO1xuK1x0cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLnZlcmRpY3QgPSBCUEZfU0lHX1VOU0lHTkVEO1xuIFx0cHJvZy1cdTAwM2VvcmlnX3Byb2cgPSBOVUxMO1xuIFx0cHJvZy1cdTAwM2VqaXRlZCA9IDA7XG4gXG5AQCAtMzE4OSwxMCArMzExNCw2IEBAIHN0YXRpYyBpbnQgYnBmX3Byb2dfbG9hZCh1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0XG4gXHRpZiAoZXJyIFx1MDAzYyAwKVxuIFx0XHRnb3RvIGZyZWVfcHJvZztcbiBcbi1cdGVyciA9IHNlY3VyaXR5X2JwZl9wcm9nX2xvYWQocHJvZywgYXR0ciwgdG9rZW4sIHVhdHRyLmlzX2tlcm5lbCk7XG4tXHRpZiAoZXJyKVxuLVx0XHRnb3RvIGZyZWVfcHJvZztcbi1cbiBcdC8qIHJ1biBlQlBGIHZlcmlmaWVyICovXG4gXHRlcnIgPSBicGZfY2hlY2soXHUwMDI2cHJvZywgYXR0ciwgdWF0dHIsIGF0dHJfbG9nKTtcbiBcdGlmIChlcnIgXHUwMDNjIDApXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jXG5pbmRleCBkNDZmN2RiMjBkOGYwNC4uNjVmNTMxMjhmYzMzZDYgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbisrKyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuQEAgLTIyLDYgKzIyLDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jdHlwZS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZXJyb3ItaW5qZWN0aW9uLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9icGZfbHNtLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zZWN1cml0eS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdmVyaWZpY2F0aW9uLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9idGZfaWRzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wb2lzb24uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG5AQCAtMjQ5MCw2ICsyNDkyLDgzIEBAIGludCBicGZfZ2V0X2tmdW5jX2FkZHIoY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nLCB1MzIgZnVuY19pZCxcbiBcdHJldHVybiAwO1xuIH1cbiBcbisjZGVmaW5lIEJQRl9GRF9TTE9UX0JURlx0MVVMXG4rXG4rc3RhdGljIHZvaWQgZmRfc2xvdF9zZXRfbWFwKHN0cnVjdCBicGZfZmRfYXJyYXkgKnNsb3QsIHN0cnVjdCBicGZfbWFwICptYXApXG4re1xuK1x0c2xvdC1cdTAwM2V2YWwgPSAodW5zaWduZWQgbG9uZyltYXA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGZkX3Nsb3Rfc2V0X2J0ZihzdHJ1Y3QgYnBmX2ZkX2FycmF5ICpzbG90LCBzdHJ1Y3QgYnRmICpidGYpXG4re1xuK1x0c2xvdC1cdTAwM2V2YWwgPSAodW5zaWduZWQgbG9uZylidGYgfCBCUEZfRkRfU0xPVF9CVEY7XG4rfVxuK1xuK3N0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqZmRfc2xvdF9tYXAoc3RydWN0IGJwZl9mZF9hcnJheSBzbG90KVxuK3tcbitcdGlmIChzbG90LnZhbCBcdTAwMjYgQlBGX0ZEX1NMT1RfQlRGKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdHJldHVybiAoc3RydWN0IGJwZl9tYXAgKilzbG90LnZhbDtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBidGYgKmZkX3Nsb3RfYnRmKHN0cnVjdCBicGZfZmRfYXJyYXkgc2xvdClcbit7XG4rXHRpZiAoIShzbG90LnZhbCBcdTAwMjYgQlBGX0ZEX1NMT1RfQlRGKSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRyZXR1cm4gKHN0cnVjdCBidGYgKikoc2xvdC52YWwgXHUwMDI2IH5CUEZfRkRfU0xPVF9CVEYpO1xuK31cbitcbitzdGF0aWMgc3RydWN0IGJ0ZiAqXG4rZmRfYXJyYXlfZ2V0X2J0Zl9jb250aW51b3VzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXG4re1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1xuK1x0aWYgKGlkeCBcdTAwM2U9IGVudi1cdTAwM2VmZF9hcnJheV9jbnQpIHtcbitcdFx0dmVyYm9zZShlbnYsIFwia2Z1bmMgZmRfaWR4ICV1IG91dCBvZiBib3VuZHMsIGZkX2FycmF5X2NudCAldVxcblwiLFxuK1x0XHRcdGlkeCwgZW52LVx1MDAzZWZkX2FycmF5X2NudCk7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuK1x0fVxuK1x0YnRmID0gZmRfc2xvdF9idGYoZW52LVx1MDAzZWZkX2FycmF5W2lkeF0pO1xuK1x0aWYgKCFidGYpIHtcbitcdFx0dmVyYm9zZShlbnYsIFwia2Z1bmMgZmRfaWR4ICV1IGlzIG5vdCBhIG1vZHVsZSBCVEZcXG5cIiwgaWR4KTtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4rXHR9XG4rXHRidGZfZ2V0KGJ0Zik7XG4rXHRyZXR1cm4gYnRmO1xuK31cbitcbitzdGF0aWMgc3RydWN0IGJ0ZiAqXG4rZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2Uoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcbit7XG4rXHRzdHJ1Y3QgYnRmICpidGY7XG4rXHRpbnQgYnRmX2ZkO1xuK1xuK1x0aWYgKGNvcHlfZnJvbV9icGZwdHJfb2Zmc2V0KFx1MDAyNmJ0Zl9mZCwgZW52LVx1MDAzZWZkX2FycmF5X3JhdyxcbitcdFx0XHRcdCAgICAoc2l6ZV90KWlkeCAqIHNpemVvZihidGZfZmQpLCBzaXplb2YoYnRmX2ZkKSkpXG4rXHRcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xuK1x0YnRmID0gYnRmX2dldF9ieV9mZChidGZfZmQpO1xuK1x0aWYgKElTX0VSUihidGYpKSB7XG4rXHRcdHZlcmJvc2UoZW52LCBcImludmFsaWQgbW9kdWxlIEJURiBmZCBzcGVjaWZpZWRcXG5cIik7XG4rXHRcdHJldHVybiBidGY7XG4rXHR9XG4rXHRyZXR1cm4gYnRmO1xuK31cbitcbitzdGF0aWMgc3RydWN0IGJ0ZiAqZmRfYXJyYXlfZ2V0X2J0ZihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxuK3tcbitcdGlmIChlbnYtXHUwMDNlc2lnbmF0dXJlKSB7XG4rXHRcdHZlcmJvc2UoZW52LCBcInNpZ25lZCBwcm9ncmFtIGNhbm5vdCBiaW5kIGFueSBCVEZcXG5cIik7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FQUNDRVMpO1xuK1x0fVxuK1x0aWYgKGVudi1cdTAwM2VmZF9hcnJheSlcbitcdFx0cmV0dXJuIGZkX2FycmF5X2dldF9idGZfY29udGludW91cyhlbnYsIGlkeCk7XG4rXHRpZiAoIWJwZnB0cl9pc19udWxsKGVudi1cdTAwM2VmZF9hcnJheV9yYXcpKVxuK1x0XHRyZXR1cm4gZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2UoZW52LCBpZHgpO1xuK1xuK1x0dmVyYm9zZShlbnYsIFwia2Z1bmMgb2Zmc2V0IFx1MDAzZSAwIHdpdGhvdXQgZmRfYXJyYXkgaXMgaW52YWxpZFxcblwiKTtcbitcdHJldHVybiBFUlJfUFRSKC1FUFJPVE8pO1xuK31cbitcbiBzdGF0aWMgc3RydWN0IGJ0ZiAqX19maW5kX2tmdW5jX2Rlc2NfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4gXHRcdFx0XHRcdCBzMTYgb2Zmc2V0KVxuIHtcbkBAIC0yNDk4LDcgKzI1NzcsNiBAQCBzdGF0aWMgc3RydWN0IGJ0ZiAqX19maW5kX2tmdW5jX2Rlc2NfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4gXHRzdHJ1Y3QgYnBmX2tmdW5jX2J0ZiAqYjtcbiBcdHN0cnVjdCBtb2R1bGUgKm1vZDtcbiBcdHN0cnVjdCBidGYgKmJ0Zjtcbi1cdGludCBidGZfZmQ7XG4gXG4gXHR0YWIgPSBlbnYtXHUwMDNlcHJvZy1cdTAwM2VhdXgtXHUwMDNla2Z1bmNfYnRmX3RhYjtcbiBcdGIgPSBic2VhcmNoKFx1MDAyNmtmX2J0ZiwgdGFiLVx1MDAzZWRlc2NzLCB0YWItXHUwMDNlbnJfZGVzY3MsXG5AQCAtMjUwOSwyMiArMjU4Nyw5IEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpfX2ZpbmRfa2Z1bmNfZGVzY19idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiBcdFx0XHRyZXR1cm4gRVJSX1BUUigtRTJCSUcpO1xuIFx0XHR9XG4gXG4tXHRcdGlmIChicGZwdHJfaXNfbnVsbChlbnYtXHUwMDNlZmRfYXJyYXkpKSB7XG4tXHRcdFx0dmVyYm9zZShlbnYsIFwia2Z1bmMgb2Zmc2V0IFx1MDAzZSAwIHdpdGhvdXQgZmRfYXJyYXkgaXMgaW52YWxpZFxcblwiKTtcbi1cdFx0XHRyZXR1cm4gRVJSX1BUUigtRVBST1RPKTtcbi1cdFx0fVxuLVxuLVx0XHRpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoXHUwMDI2YnRmX2ZkLCBlbnYtXHUwMDNlZmRfYXJyYXksXG4tXHRcdFx0XHRcdCAgICBvZmZzZXQgKiBzaXplb2YoYnRmX2ZkKSxcbi1cdFx0XHRcdFx0ICAgIHNpemVvZihidGZfZmQpKSlcbi1cdFx0XHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbi1cbi1cdFx0YnRmID0gYnRmX2dldF9ieV9mZChidGZfZmQpO1xuLVx0XHRpZiAoSVNfRVJSKGJ0ZikpIHtcbi1cdFx0XHR2ZXJib3NlKGVudiwgXCJpbnZhbGlkIG1vZHVsZSBCVEYgZmQgc3BlY2lmaWVkXFxuXCIpO1xuK1x0XHRidGYgPSBmZF9hcnJheV9nZXRfYnRmKGVudiwgb2Zmc2V0KTtcbitcdFx0aWYgKElTX0VSUihidGYpKVxuIFx0XHRcdHJldHVybiBidGY7XG4tXHRcdH1cbi1cbiBcdFx0aWYgKCFidGZfaXNfbW9kdWxlKGJ0ZikpIHtcbiBcdFx0XHR2ZXJib3NlKGVudiwgXCJCVEYgZmQgZm9yIGtmdW5jIGlzIG5vdCBhIG1vZHVsZSBCVEZcXG5cIik7XG4gXHRcdFx0YnRmX3B1dChidGYpO1xuQEAgLTE3NTg5LDYgKzE3NjU0LDExIEBAIHN0YXRpYyBpbnQgX19hZGRfdXNlZF9idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJ0ZiAqYnRmKVxuIFx0XHRpZiAoZW52LVx1MDAzZXVzZWRfYnRmc1tpXS5idGYgPT0gYnRmKVxuIFx0XHRcdGdvdG8gcmV0X3B1dDtcbiBcbitcdGlmIChlbnYtXHUwMDNlc2lnbmF0dXJlKSB7XG4rXHRcdHZlcmJvc2UoZW52LCBcInNpZ25lZCBwcm9ncmFtIGNhbm5vdCBiaW5kIGFueSBCVEZcXG5cIik7XG4rXHRcdHJldCA9IC1FQUNDRVM7XG4rXHRcdGdvdG8gcmV0X3B1dDtcbitcdH1cbiBcdGlmIChlbnYtXHUwMDNldXNlZF9idGZfY250IFx1MDAzZT0gTUFYX1VTRURfQlRGUykge1xuIFx0XHR2ZXJib3NlKGVudiwgXCJUaGUgdG90YWwgbnVtYmVyIG9mIGJ0ZnMgcGVyIHByb2dyYW0gaGFzIHJlYWNoZWQgdGhlIGxpbWl0IG9mICV1XFxuXCIsXG4gXHRcdFx0TUFYX1VTRURfQlRGUyk7XG5AQCAtMTc4NzEsNiArMTc5NDEsMTIgQEAgc3RhdGljIGludCBfX2FkZF91c2VkX21hcChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuIFx0XHRpZiAoZW52LVx1MDAzZXVzZWRfbWFwc1tpXSA9PSBtYXApXG4gXHRcdFx0cmV0dXJuIGk7XG4gXG4rXHRpZiAoZW52LVx1MDAzZXNpZ25hdHVyZSBcdTAwMjZcdTAwMjZcbitcdCAgICBlbnYtXHUwMDNlcHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLnZlcmRpY3QgPT0gQlBGX1NJR19WRVJJRklFRCkge1xuK1x0XHR2ZXJib3NlKGVudiwgXCJzaWduZWQgcHJvZ3JhbSBjYW5ub3QgYmluZCBtYXAgJyVzJyBub3QgY292ZXJlZCBieSB0aGUgc2lnbmF0dXJlXFxuXCIsXG4rXHRcdFx0bWFwLVx1MDAzZW5hbWUpO1xuK1x0XHRyZXR1cm4gLUVBQ0NFUztcbitcdH1cbiBcdGlmIChlbnYtXHUwMDNldXNlZF9tYXBfY250IFx1MDAzZT0gTUFYX1VTRURfTUFQUykge1xuIFx0XHR2ZXJib3NlKGVudiwgXCJUaGUgdG90YWwgbnVtYmVyIG9mIG1hcHMgcGVyIHByb2dyYW0gaGFzIHJlYWNoZWQgdGhlIGxpbWl0IG9mICV1XFxuXCIsXG4gXHRcdFx0TUFYX1VTRURfTUFQUyk7XG5AQCAtMTc5MjMsNiArMTc5OTksNDggQEAgc3RhdGljIGludCBhZGRfdXNlZF9tYXAoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGZkKVxuIFx0cmV0dXJuIF9fYWRkX3VzZWRfbWFwKGVudiwgbWFwKTtcbiB9XG4gXG4rc3RhdGljIGludCBmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXG4re1xuK1x0c3RydWN0IGJwZl9tYXAgKm1hcDtcbitcbitcdGlmIChpZHggXHUwMDNlPSBlbnYtXHUwMDNlZmRfYXJyYXlfY250KSB7XG4rXHRcdHZlcmJvc2UoZW52LCBcImZkX2lkeCAldSBvdXQgb2YgYm91bmRzLCBmZF9hcnJheV9jbnQgJXVcXG5cIixcbitcdFx0XHRpZHgsIGVudi1cdTAwM2VmZF9hcnJheV9jbnQpO1xuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcdG1hcCA9IGZkX3Nsb3RfbWFwKGVudi1cdTAwM2VmZF9hcnJheVtpZHhdKTtcbitcdGlmICghbWFwKSB7XG4rXHRcdHZlcmJvc2UoZW52LCBcImZkX2lkeCAldSBpcyBub3QgYSBtYXBcXG5cIiwgaWR4KTtcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHR9XG4rXHRyZXR1cm4gX19hZGRfdXNlZF9tYXAoZW52LCBtYXApO1xuK31cbitcbitzdGF0aWMgaW50IGZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxuK3tcbitcdGludCBmZDtcbitcbitcdGlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldChcdTAwMjZmZCwgZW52LVx1MDAzZWZkX2FycmF5X3JhdyxcbitcdFx0XHRcdCAgICAoc2l6ZV90KWlkeCAqIHNpemVvZihmZCksIHNpemVvZihmZCkpKVxuK1x0XHRyZXR1cm4gLUVGQVVMVDtcbitcdHJldHVybiBhZGRfdXNlZF9tYXAoZW52LCBmZCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZmRfYXJyYXlfZ2V0X21hcF9pZHgoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcbit7XG4rXHRpZiAoZW52LVx1MDAzZWZkX2FycmF5KVxuK1x0XHRyZXR1cm4gZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91cyhlbnYsIGlkeCk7XG4rXHRpZiAoZW52LVx1MDAzZXNpZ25hdHVyZSkge1xuK1x0XHR2ZXJib3NlKGVudiwgXCJzaWduZWQgcHJvZ3JhbSBtdXN0IGJpbmQgbWFwcyB2aWEgYSBjb250aW51b3VzIGZkX2FycmF5IChmZF9hcnJheV9jbnQpXFxuXCIpO1xuK1x0XHRyZXR1cm4gLUVBQ0NFUztcbitcdH1cbitcdGlmICghYnBmcHRyX2lzX251bGwoZW52LVx1MDAzZWZkX2FycmF5X3JhdykpXG4rXHRcdHJldHVybiBmZF9hcnJheV9nZXRfbWFwX2lkeF9zcGFyc2UoZW52LCBpZHgpO1xuK1xuK1x0dmVyYm9zZShlbnYsIFwiZmRfaWR4IHdpdGhvdXQgZmRfYXJyYXkgaXMgaW52YWxpZFxcblwiKTtcbitcdHJldHVybiAtRVBST1RPO1xuK31cbitcbiBzdGF0aWMgaW50IGNoZWNrX2FsdV9maWVsZHMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKVxuIHtcbiBcdHU4IGNsYXNzID0gQlBGX0NMQVNTKGluc24tXHUwMDNlY29kZSk7XG5AQCAtMTgxNDAsNyArMTgyNTgsNiBAQCBzdGF0aWMgaW50IGNoZWNrX2FuZF9yZXNvbHZlX2luc25zKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpXG4gXHRcdFx0c3RydWN0IGJwZl9tYXAgKm1hcDtcbiBcdFx0XHRpbnQgbWFwX2lkeDtcbiBcdFx0XHR1NjQgYWRkcjtcbi1cdFx0XHR1MzIgZmQ7XG4gXG4gXHRcdFx0aWYgKGkgPT0gaW5zbl9jbnQgLSAxIHx8IGluc25bMV0uY29kZSAhPSAwIHx8XG4gXHRcdFx0ICAgIGluc25bMV0uZHN0X3JlZyAhPSAwIHx8IGluc25bMV0uc3JjX3JlZyAhPSAwIHx8XG5AQCAtMTgxOTIsMjEgKzE4MzA5LDE3IEBAIHN0YXRpYyBpbnQgY2hlY2tfYW5kX3Jlc29sdmVfaW5zbnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcbiBcdFx0XHRzd2l0Y2ggKGluc25bMF0uc3JjX3JlZykge1xuIFx0XHRcdGNhc2UgQlBGX1BTRVVET19NQVBfSURYX1ZBTFVFOlxuIFx0XHRcdGNhc2UgQlBGX1BTRVVET19NQVBfSURYOlxuLVx0XHRcdFx0aWYgKGJwZnB0cl9pc19udWxsKGVudi1cdTAwM2VmZF9hcnJheSkpIHtcbi1cdFx0XHRcdFx0dmVyYm9zZShlbnYsIFwiZmRfaWR4IHdpdGhvdXQgZmRfYXJyYXkgaXMgaW52YWxpZFxcblwiKTtcbi1cdFx0XHRcdFx0cmV0dXJuIC1FUFJPVE87XG4tXHRcdFx0XHR9XG4tXHRcdFx0XHRpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoXHUwMDI2ZmQsIGVudi1cdTAwM2VmZF9hcnJheSxcbi1cdFx0XHRcdFx0XHRcdCAgICBpbnNuWzBdLmltbSAqIHNpemVvZihmZCksXG4tXHRcdFx0XHRcdFx0XHQgICAgc2l6ZW9mKGZkKSkpXG4tXHRcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuK1x0XHRcdFx0bWFwX2lkeCA9IGZkX2FycmF5X2dldF9tYXBfaWR4KGVudiwgaW5zblswXS5pbW0pO1xuIFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0ZGVmYXVsdDpcbi1cdFx0XHRcdGZkID0gaW5zblswXS5pbW07XG4rXHRcdFx0XHRpZiAoZW52LVx1MDAzZXNpZ25hdHVyZSkge1xuK1x0XHRcdFx0XHR2ZXJib3NlKGVudiwgXCJzaWduZWQgcHJvZ3JhbSBjYW5ub3QgcmVmZXJlbmNlIGEgbWFwIGJ5IGZkLCBvbmx5IHZpYSBmZF9hcnJheSBpbmRleFxcblwiKTtcbitcdFx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdFx0XHR9XG4rXHRcdFx0XHRtYXBfaWR4ID0gYWRkX3VzZWRfbWFwKGVudiwgaW5zblswXS5pbW0pO1xuIFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0fVxuIFxuLVx0XHRcdG1hcF9pZHggPSBhZGRfdXNlZF9tYXAoZW52LCBmZCk7XG4gXHRcdFx0aWYgKG1hcF9pZHggXHUwMDNjIDApXG4gXHRcdFx0XHRyZXR1cm4gbWFwX2lkeDtcbiBcdFx0XHRtYXAgPSBlbnYtXHUwMDNldXNlZF9tYXBzW21hcF9pZHhdO1xuQEAgLTE5NDgxLDcgKzE5NTk0LDcgQEAgc3RydWN0IGJ0ZiAqYnBmX2dldF9idGZfdm1saW51eCh2b2lkKVxuICAqIHRoaXMgY2FzZSBleHBlY3QgdGhhdCBldmVyeSBmaWxlIGRlc2NyaXB0b3IgaW4gdGhlIGFycmF5IGlzIGVpdGhlciBhIG1hcCBvclxuICAqIGEgQlRGLiBFdmVyeXRoaW5nIGVsc2UgaXMgY29uc2lkZXJlZCB0byBiZSB0cmFzaC5cbiAgKi9cbi1zdGF0aWMgaW50IGFkZF9mZF9mcm9tX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBmZClcbitzdGF0aWMgaW50IGFkZF9mZF9mcm9tX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgsIGludCBmZClcbiB7XG4gXHRzdHJ1Y3QgYnBmX21hcCAqbWFwO1xuIFx0c3RydWN0IGJ0ZiAqYnRmO1xuQEAgLTE5NDkzLDUxICsxOTYwNiw4MyBAQCBzdGF0aWMgaW50IGFkZF9mZF9mcm9tX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBmZClcbiBcdFx0ZXJyID0gX19hZGRfdXNlZF9tYXAoZW52LCBtYXApO1xuIFx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuIFx0XHRcdHJldHVybiBlcnI7XG4rXHRcdGZkX3Nsb3Rfc2V0X21hcChcdTAwMjZlbnYtXHUwMDNlZmRfYXJyYXlbaWR4XSwgbWFwKTtcbiBcdFx0cmV0dXJuIDA7XG4gXHR9XG4gXG4gXHRidGYgPSBfX2J0Zl9nZXRfYnlfZmQoZik7XG4gXHRpZiAoIUlTX0VSUihidGYpKSB7XG4gXHRcdGJ0Zl9nZXQoYnRmKTtcbi1cdFx0cmV0dXJuIF9fYWRkX3VzZWRfYnRmKGVudiwgYnRmKTtcbitcdFx0ZXJyID0gX19hZGRfdXNlZF9idGYoZW52LCBidGYpO1xuK1x0XHRpZiAoZXJyIFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiBlcnI7XG4rXHRcdGZkX3Nsb3Rfc2V0X2J0ZihcdTAwMjZlbnYtXHUwMDNlZmRfYXJyYXlbaWR4XSwgYnRmKTtcbitcdFx0cmV0dXJuIDA7XG4gXHR9XG4gXG4gXHR2ZXJib3NlKGVudiwgXCJmZCAlZCBpcyBub3QgcG9pbnRpbmcgdG8gdmFsaWQgYnBmX21hcCBvciBidGZcXG5cIiwgZmQpO1xuIFx0cmV0dXJuIFBUUl9FUlIobWFwKTtcbiB9XG4gXG4tc3RhdGljIGludCBwcm9jZXNzX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cilcbisvKlxuKyAqIEEgY29udGludW91cyBmZF9hcnJheSBpcyByZXNvbHZlZCBpbnRvIGFuIGluLW1lbW9yeSBjYWNoZSB3aXRoIG9uZSBzbG90XG4rICogcGVyIGVudHJ5LiBUaGUgYm91bmQgaGVyZSBpcyBkZWxpYmVyYXRlbHkgZ2VuZXJvdXMgYW5kIG5vdCBkZXJpdmVkIGZyb21cbisgKiB0aGUgcGVyLXByb2dyYW0gb2JqZWN0IGxpbWl0czogRHVwbGljYXRlIGVudHJpZXMgL2FyZS8gcGVybWl0dGVkLCBhbmRcbisgKiB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IG1hcHMgYW5kIEJURnMgYSBwcm9ncmFtIGNhbiBiaW5kIGlzIGVuZm9yY2VkIHdoZW5cbisgKiBlYWNoIGVudHJ5IGlzIHJlc29sdmVkIGJ5IF9fYWRkX3VzZWRfbWFwKCkgYW5kIF9fYWRkX3VzZWRfYnRmKCkuXG4rICovXG4rI2RlZmluZSBNQVhfRkRfQVJSQVlfQ05UIDQwOTZcbitcbitzdGF0aWMgaW50IHByb2Nlc3NfZmRfYXJyYXlfY29udGludW91cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuK1x0XHRcdFx0ICAgICAgIGJwZnB0cl90IGZkX2FycmF5LCB1MzIgY250KVxuIHtcbi1cdHNpemVfdCBzaXplID0gc2l6ZW9mKGludCk7XG4tXHRpbnQgcmV0O1xuLVx0aW50IGZkO1xuK1x0aW50IGZkLCByZXQ7XG4gXHR1MzIgaTtcbiBcbi1cdGVudi1cdTAwM2VmZF9hcnJheSA9IG1ha2VfYnBmcHRyKGF0dHItXHUwMDNlZmRfYXJyYXksIHVhdHRyLmlzX2tlcm5lbCk7XG4tXG4tXHQvKlxuLVx0ICogVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIG9sZCAobm8gZmRfYXJyYXlfY250IGlzIGdpdmVuKSBhbmQgbmV3XG4tXHQgKiBBUElzIGlzIHRoYXQgaW4gdGhlIGxhdHRlciBjYXNlIHRoZSBmZF9hcnJheSBpcyBleHBlY3RlZCB0byBiZVxuLVx0ICogY29udGludW91cyBhbmQgaXMgc2Nhbm5lZCBmb3IgbWFwIGZkcyByaWdodCBhd2F5XG4tXHQgKi9cbi1cdGlmICghYXR0ci1cdTAwM2VmZF9hcnJheV9jbnQpXG4tXHRcdHJldHVybiAwO1xuLVxuLVx0LyogQ2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3cgKi9cbi1cdGlmIChhdHRyLVx1MDAzZWZkX2FycmF5X2NudCBcdTAwM2U9IChVMzJfTUFYIC8gc2l6ZSkpIHtcbi1cdFx0dmVyYm9zZShlbnYsIFwiZmRfYXJyYXlfY250IGlzIHRvbyBiaWcgKCV1KVxcblwiLCBhdHRyLVx1MDAzZWZkX2FycmF5X2NudCk7XG4tXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0aWYgKGNudCBcdTAwM2UgTUFYX0ZEX0FSUkFZX0NOVCkge1xuK1x0XHR2ZXJib3NlKGVudiwgXCJmZF9hcnJheSBoYXMgdG9vIG1hbnkgZW50cmllcyAoJXUsIG1heCAldSlcXG5cIixcbitcdFx0XHRjbnQsIE1BWF9GRF9BUlJBWV9DTlQpO1xuK1x0XHRyZXR1cm4gLUUyQklHO1xuIFx0fVxuIFxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgYXR0ci1cdTAwM2VmZF9hcnJheV9jbnQ7IGkrKykge1xuLVx0XHRpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoXHUwMDI2ZmQsIGVudi1cdTAwM2VmZF9hcnJheSwgaSAqIHNpemUsIHNpemUpKVxuK1x0ZW52LVx1MDAzZWZkX2FycmF5ID0ga3ZjYWxsb2MoY250LCBzaXplb2YoKmVudi1cdTAwM2VmZF9hcnJheSksXG4rXHRcdFx0XHQgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcbitcdGlmICghZW52LVx1MDAzZWZkX2FycmF5KVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcdGVudi1cdTAwM2VmZF9hcnJheV9jbnQgPSBjbnQ7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjbnQ7IGkrKykge1xuK1x0XHRpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoXHUwMDI2ZmQsIGZkX2FycmF5LFxuK1x0XHRcdFx0XHQgICAgKHNpemVfdClpICogc2l6ZW9mKGZkKSwgc2l6ZW9mKGZkKSkpXG4gXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4tXG4tXHRcdHJldCA9IGFkZF9mZF9mcm9tX2ZkX2FycmF5KGVudiwgZmQpO1xuK1x0XHRyZXQgPSBhZGRfZmRfZnJvbV9mZF9hcnJheShlbnYsIGksIGZkKTtcbiBcdFx0aWYgKHJldClcbiBcdFx0XHRyZXR1cm4gcmV0O1xuIFx0fVxuK1x0cmV0dXJuIDA7XG4rfVxuIFxuK3N0YXRpYyBpbnQgcHJvY2Vzc19mZF9hcnJheShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuK1x0XHRcdCAgICB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIpXG4re1xuK1x0YnBmcHRyX3QgZmRfYXJyYXkgPSBtYWtlX2JwZnB0cihhdHRyLVx1MDAzZWZkX2FycmF5LCB1YXR0ci5pc19rZXJuZWwpO1xuK1xuK1x0aWYgKGJwZnB0cl9pc19udWxsKGZkX2FycmF5KSkge1xuK1x0XHRpZiAoYXR0ci1cdTAwM2VmZF9hcnJheV9jbnQpIHtcbitcdFx0XHR2ZXJib3NlKGVudiwgXCJmZF9hcnJheV9jbnQgJXUgd2l0aG91dCBmZF9hcnJheSBpcyBpbnZhbGlkXFxuXCIsXG4rXHRcdFx0XHRhdHRyLVx1MDAzZWZkX2FycmF5X2NudCk7XG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdH1cbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXHQvKlxuK1x0ICogTmV3IEFQSTogdGhlIGNhbGxlciBwYXNzZXMgZmRfYXJyYXlfY250IGFuZCBhIGNvbnRpbnVvdXMgYXJyYXkgdGhhdFxuK1x0ICogaXMgcmVzb2x2ZWQgYW5kIGJvdW5kIHVwIGZyb250LiBMZWdhY3kgQVBJIChubyBmZF9hcnJheV9jbnQpOiBrZWVwXG4rXHQgKiB0aGUgY2FsbGVyJ3MgYXJyYXkgYW5kIHJlc29sdmUgZW50cmllcyBvbiB0aGUgc3BvdCBhdCBlYWNoIHJlZmVyZW5jZS5cbitcdCAqL1xuK1x0aWYgKGF0dHItXHUwMDNlZmRfYXJyYXlfY250KVxuK1x0XHRyZXR1cm4gcHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzKGVudiwgZmRfYXJyYXksXG4rXHRcdFx0XHRcdFx0ICAgYXR0ci1cdTAwM2VmZF9hcnJheV9jbnQpO1xuK1x0ZW52LVx1MDAzZWZkX2FycmF5X3JhdyA9IGZkX2FycmF5O1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuQEAgLTE5NzUyLDYgKzE5ODk3LDEzOSBAQCBpbnQgYnBmX2ZpeHVwX2tmdW5jX2NhbGwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuK3N0YXRpYyBlbnVtIGJwZl9zaWdfa2V5cmluZyBicGZfY2xhc3NpZnlfa2V5cmluZyhzMzIga2V5cmluZ19pZClcbit7XG4rXHRzd2l0Y2ggKGtleXJpbmdfaWQpIHtcbitcdGNhc2UgMDpcbitcdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19CVUlMVElOO1xuK1x0Y2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkc6XG4rXHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfU0VDT05EQVJZO1xuK1x0Y2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklORzpcbitcdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19QTEFURk9STTtcbitcdGRlZmF1bHQ6XG4rXHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfVVNFUjtcbitcdH1cbit9XG4rXG4rLypcbisgKiBWZXJpZnkgdGhlIFBLQ1MjNyBzaWduYXR1cmUgb2YgYSBsb2FkZWQgcHJvZ3JhbS4gQ2FsbGVkIGZyb20gYnBmX2NoZWNrKClcbisgKiBvbmNlIHRoZSBwcm9ncmFtJ3MgbWV0YWRhdGEgbWFwcyBoYXZlIGJlZW4gcmVzb2x2ZWQgaW50byB1c2VkX21hcHMsIHNvXG4rICogdGhlIGV4YWN0IG1hcHMgZm9sZGVkIGludG8gdGhlIHNpZ25hdHVyZSBhcmUgdGhlIG9uZXMgdGhlIHByb2dyYW0gYmluZHMuXG4rICpcbisgKiBUaGUgc2lnbmF0dXJlIGNvdmVycyB0aGUgaW5zdHJ1Y3Rpb25zIGZvbGxvd2VkIGJ5IHRoZSBmcm96ZW4gY29udGVudHMgb2ZcbisgKiBlYWNoIG1hcCwgaW4gQG1hcHMgb3JkZXI6IGluc25zIHx8IG1hcF8wIHx8IG1hcF8xIHx8IFsuLi5dLiBPbiBzdWNjZXNzIHRoZVxuKyAqIHZlcmRpY3QgYW5kIGtleXJpbmcgaW5mbyBhcmUgcmVjb3JkZWQgb24gcHJvZy1cdTAwM2VhdXguXG4rICovXG4rc3RhdGljIGludCBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4rXHRcdFx0XHQgICAgIHVuaW9uIGJwZl9hdHRyICphdHRyLCBib29sIGlzX2tlcm5lbClcbit7XG4rXHRicGZwdHJfdCB1c2lnID0gbWFrZV9icGZwdHIoYXR0ci1cdTAwM2VzaWduYXR1cmUsIGlzX2tlcm5lbCk7XG4rXHRzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuIHNpZ19wdHIsIGRhdGFfcHRyO1xuK1x0c3RydWN0IGJwZl9wcm9nICpwcm9nID0gZW52LVx1MDAzZXByb2c7XG4rXHRzdHJ1Y3QgYnBmX21hcCAqKm1hcHMgPSBlbnYtXHUwMDNldXNlZF9tYXBzO1xuK1x0c3RydWN0IGJwZl9rZXkgKmtleSA9IE5VTEw7XG4rXHR2b2lkICpzaWcsICpkYXRhID0gTlVMTDtcbitcdHUzMiBtYXBfY250ID0gZW52LVx1MDAzZXVzZWRfbWFwX2NudDtcbitcdHUzMiBpLCBvZmYsIGluc25zX3N6O1xuK1x0dTY0IGRhdGFfc3o7XG4rXHRpbnQgZXJyID0gMDtcbitcbitcdC8qXG4rXHQgKiBEb24ndCBhdHRlbXB0IHRvIHVzZSBrbWFsbG9jX2xhcmdlIG9yIHZtYWxsb2MgZm9yIHNpZ25hdHVyZXMuXG4rXHQgKiBQcmFjdGljYWwgc2lnbmF0dXJlIGZvciBCUEYgcHJvZ3JhbSBzaG91bGQgYmUgYmVsb3cgdGhpcyBsaW1pdC5cbitcdCAqL1xuK1x0aWYgKGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUgXHUwMDNlIEtNQUxMT0NfTUFYX0NBQ0hFX1NJWkUpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0aWYgKHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItXHUwMDNla2V5cmluZ19pZCkgPT0gMClcbitcdFx0a2V5ID0gYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KGF0dHItXHUwMDNla2V5cmluZ19pZCk7XG4rXHRlbHNlXG4rXHRcdGtleSA9IGJwZl9sb29rdXBfdXNlcl9rZXkoYXR0ci1cdTAwM2VrZXlyaW5nX2lkLCAwKTtcbitcdGlmICgha2V5KSB7XG4rXHRcdHZlcmJvc2UoZW52LCBcImNhbm5vdCByZXNvbHZlIHNpZ25pbmcga2V5cmluZyB3aXRoIGtleXJpbmdfaWQgJWRcXG5cIixcbitcdFx0XHRhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbitcdHNpZyA9IGt2bWVtZHVwX2JwZnB0cih1c2lnLCBhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplKTtcbitcdGlmIChJU19FUlIoc2lnKSkge1xuK1x0XHRicGZfa2V5X3B1dChrZXkpO1xuK1x0XHRyZXR1cm4gUFRSX0VSUihzaWcpO1xuK1x0fVxuK1xuK1x0aW5zbnNfc3ogPSBwcm9nLVx1MDAzZWxlbiAqIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pO1xuK1x0ZGF0YV9zeiA9IGluc25zX3N6O1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbWFwX2NudDsgaSsrKSB7XG4rXHRcdHN0cnVjdCBicGZfbWFwICptYXAgPSBtYXBzW2ldO1xuK1xuK1x0XHRpZiAobWFwLVx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9BUlJBWSB8fFxuK1x0XHQgICAgIW1hcC1cdTAwM2VvcHMtXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyKSB7XG4rXHRcdFx0dmVyYm9zZShlbnYsIFwic2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICclcycgbXVzdCBiZSBhbiBhcnJheVxcblwiLFxuK1x0XHRcdFx0bWFwLVx1MDAzZW5hbWUpO1xuK1x0XHRcdGVyciA9IC1FSU5WQUw7XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcdFx0aWYgKCFSRUFEX09OQ0UobWFwLVx1MDAzZWZyb3plbikpIHtcbitcdFx0XHR2ZXJib3NlKGVudiwgXCJzaWduZWQgcHJvZ3JhbSBtZXRhZGF0YSBtYXAgJyVzJyBtdXN0IGJlIGZyb3plblxcblwiLFxuK1x0XHRcdFx0bWFwLVx1MDAzZW5hbWUpO1xuK1x0XHRcdGVyciA9IC1FUEVSTTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0XHRpZiAoIW1hcC1cdTAwM2VleGNsX3Byb2dfc2hhKSB7XG4rXHRcdFx0dmVyYm9zZShlbnYsIFwic2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICclcycgbXVzdCBiZSBleGNsdXNpdmVcXG5cIixcbitcdFx0XHRcdG1hcC1cdTAwM2VuYW1lKTtcbitcdFx0XHRlcnIgPSAtRVBFUk07XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcdFx0ZGF0YV9zeiArPSBtYXAtXHUwMDNldmFsdWVfc2l6ZTtcbitcdH1cbitcdGlmIChicGZfZHlucHRyX2NoZWNrX3NpemUoZGF0YV9zeikpIHtcbitcdFx0dmVyYm9zZShlbnYsIFwic2lnbmVkIHBheWxvYWQgdG9vIGxhcmdlOiAlbGx1IGJ5dGVzXFxuXCIsIGRhdGFfc3opO1xuK1x0XHRlcnIgPSAtRTJCSUc7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1x0ZGF0YSA9IGt2bWFsbG9jKGRhdGFfc3osIEdGUF9LRVJORUxfQUNDT1VOVCB8IF9fR0ZQX1pFUk8pO1xuK1x0aWYgKCFkYXRhKSB7XG4rXHRcdGVyciA9IC1FTk9NRU07XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1x0bWVtY3B5KGRhdGEsIHByb2ctXHUwMDNlaW5zbnNpLCBpbnNuc19zeik7XG4rXHRvZmYgPSBpbnNuc19zejtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1hcF9jbnQ7IGkrKykge1xuK1x0XHRzdHJ1Y3QgYnBmX21hcCAqbWFwID0gbWFwc1tpXTtcbitcdFx0dTY0IGFkZHI7XG4rXG4rXHRcdGVyciA9IG1hcC1cdTAwM2VvcHMtXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyKG1hcCwgXHUwMDI2YWRkciwgMCk7XG4rXHRcdGlmIChlcnIpIHtcbitcdFx0XHR2ZXJib3NlKGVudiwgXCJmYWlsZWQgdG8gcmVhZCBzaWduZWQgbWV0YWRhdGEgbWFwICclcyc6ICVkXFxuXCIsXG4rXHRcdFx0XHRtYXAtXHUwMDNlbmFtZSwgZXJyKTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0XHRtZW1jcHkoZGF0YSArIG9mZiwgKHZvaWQgKikodW5zaWduZWQgbG9uZylhZGRyLFxuK1x0XHQgICAgICAgbWFwLVx1MDAzZXZhbHVlX3NpemUpO1xuK1x0XHRvZmYgKz0gbWFwLVx1MDAzZXZhbHVlX3NpemU7XG4rXHR9XG4rXG4rXHRicGZfZHlucHRyX2luaXQoXHUwMDI2ZGF0YV9wdHIsIGRhdGEsIEJQRl9EWU5QVFJfVFlQRV9MT0NBTCwgMCwgZGF0YV9zeik7XG4rXHRicGZfZHlucHRyX2luaXQoXHUwMDI2c2lnX3B0ciwgc2lnLCBCUEZfRFlOUFRSX1RZUEVfTE9DQUwsIDAsXG4rXHRcdFx0YXR0ci1cdTAwM2VzaWduYXR1cmVfc2l6ZSk7XG4rXG4rXHRlcnIgPSBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgoc3RydWN0IGJwZl9keW5wdHIgKilcdTAwMjZkYXRhX3B0cixcbitcdFx0XHRcdFx0IChzdHJ1Y3QgYnBmX2R5bnB0ciAqKVx1MDAyNnNpZ19wdHIsIGtleSk7XG4rXHRpZiAoZXJyKSB7XG4rXHRcdHZlcmJvc2UoZW52LCBcInNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkOiAlZFxcblwiLCBlcnIpO1xuK1x0fSBlbHNlIHtcbitcdFx0dmVyYm9zZShlbnYsIFwic2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBwYXNzZWRcXG5cIik7XG4rXHRcdHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3NlcmlhbCA9IGJwZl9rZXlfc2VyaWFsKGtleSk7XG4rXHRcdHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3R5cGUgPSBicGZfY2xhc3NpZnlfa2V5cmluZyhhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuK1x0XHRwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcudmVyZGljdCA9IEJQRl9TSUdfVkVSSUZJRUQ7XG4rXHR9XG4rb3V0OlxuK1x0a3ZmcmVlKGRhdGEpO1xuK1x0YnBmX2tleV9wdXQoa2V5KTtcbitcdGt2ZnJlZShzaWcpO1xuK1x0cmV0dXJuIGVycjtcbit9XG4rXG4gaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXG4gXHQgICAgICBzdHJ1Y3QgYnBmX2xvZ19hdHRyICphdHRyX2xvZylcbiB7XG5AQCAtMTk3NzQsMTggKzIwMDUyLDYgQEAgaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXG4gXHRcdHJldHVybiAtRU5PTUVNO1xuIFxuIFx0ZW52LVx1MDAzZWJ0LmVudiA9IGVudjtcbi1cbi1cdGxlbiA9ICgqcHJvZyktXHUwMDNlbGVuO1xuLVx0ZW52LVx1MDAzZWluc25fYXV4X2RhdGEgPVxuLVx0XHR2emFsbG9jKGFycmF5X3NpemUoc2l6ZW9mKHN0cnVjdCBicGZfaW5zbl9hdXhfZGF0YSksIGxlbikpO1xuLVx0cmV0ID0gLUVOT01FTTtcbi1cdGlmICghZW52LVx1MDAzZWluc25fYXV4X2RhdGEpXG4tXHRcdGdvdG8gZXJyX2ZyZWVfZW52O1xuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbGVuOyBpKyspXG4tXHRcdGVudi1cdTAwM2VpbnNuX2F1eF9kYXRhW2ldLm9yaWdfaWR4ID0gaTtcbi1cdGVudi1cdTAwM2VzdWNjID0gYnBmX2lhcnJheV9yZWFsbG9jKE5VTEwsIDIpO1xuLVx0aWYgKCFlbnYtXHUwMDNlc3VjYylcbi1cdFx0Z290byBlcnJfZnJlZV9lbnY7XG4gXHRlbnYtXHUwMDNlcHJvZyA9ICpwcm9nO1xuIFx0ZW52LVx1MDAzZW9wcyA9IGJwZl92ZXJpZmllcl9vcHNbZW52LVx1MDAzZXByb2ctXHUwMDNldHlwZV07XG4gXG5AQCAtMTk3OTQsMjIgKzIwMDYwLDUxIEBAIGludCBicGZfY2hlY2soc3RydWN0IGJwZl9wcm9nICoqcHJvZywgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxuIFx0ZW52LVx1MDAzZWJ5cGFzc19zcGVjX3YxID0gYnBmX2J5cGFzc19zcGVjX3YxKGVudi1cdTAwM2Vwcm9nLVx1MDAzZWF1eC1cdTAwM2V0b2tlbik7XG4gXHRlbnYtXHUwMDNlYnlwYXNzX3NwZWNfdjQgPSBicGZfYnlwYXNzX3NwZWNfdjQoZW52LVx1MDAzZXByb2ctXHUwMDNlYXV4LVx1MDAzZXRva2VuKTtcbiBcdGVudi1cdTAwM2VicGZfY2FwYWJsZSA9IGlzX3ByaXYgPSBicGZfdG9rZW5fY2FwYWJsZShlbnYtXHUwMDNlcHJvZy1cdTAwM2VhdXgtXHUwMDNldG9rZW4sIENBUF9CUEYpO1xuLVxuLVx0YnBmX2dldF9idGZfdm1saW51eCgpO1xuLVxuLVx0LyogZ3JhYiB0aGUgbXV0ZXggdG8gcHJvdGVjdCBmZXcgZ2xvYmFscyB1c2VkIGJ5IHZlcmlmaWVyICovXG4tXHRpZiAoIWlzX3ByaXYpXG4tXHRcdG11dGV4X2xvY2soXHUwMDI2YnBmX3ZlcmlmaWVyX2xvY2spO1xuK1x0ZW52LVx1MDAzZXNpZ25hdHVyZSA9IGF0dHItXHUwMDNlc2lnbmF0dXJlO1xuIFxuIFx0LyogdXNlciBjb3VsZCBoYXZlIHJlcXVlc3RlZCB2ZXJib3NlIHZlcmlmaWVyIG91dHB1dFxuIFx0ICogYW5kIHN1cHBsaWVkIGJ1ZmZlciB0byBzdG9yZSB0aGUgdmVyaWZpY2F0aW9uIHRyYWNlXG4gXHQgKi9cbiBcdHJldCA9IGJwZl92bG9nX2luaXQoXHUwMDI2ZW52LVx1MDAzZWxvZywgYXR0cl9sb2ctXHUwMDNlbGV2ZWwsIGF0dHJfbG9nLVx1MDAzZXVidWYsIGF0dHJfbG9nLVx1MDAzZXNpemUpO1xuIFx0aWYgKHJldClcbi1cdFx0Z290byBlcnJfdW5sb2NrO1xuK1x0XHRnb3RvIGVycl9mcmVlX2VudjtcbitcdGlmIChlbnYtXHUwMDNlc2lnbmF0dXJlKSB7XG4rXHRcdHJldCA9IGJwZl9wcm9nX2NhbGNfdGFnKGVudi1cdTAwM2Vwcm9nKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRnb3RvIGVycl9wcmVwO1xuK1x0fVxuIFxuIFx0cmV0ID0gcHJvY2Vzc19mZF9hcnJheShlbnYsIGF0dHIsIHVhdHRyKTtcbiBcdGlmIChyZXQpXG4rXHRcdGdvdG8gZXJyX3ByZXA7XG4rXG4rXHRpZiAoZW52LVx1MDAzZXNpZ25hdHVyZSkge1xuK1x0XHRyZXQgPSBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKGVudiwgYXR0ciwgdWF0dHIuaXNfa2VybmVsKTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRnb3RvIGVycl9wcmVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gc2VjdXJpdHlfYnBmX3Byb2dfbG9hZChlbnYtXHUwMDNlcHJvZywgYXR0ciwgZW52LVx1MDAzZXByb2ctXHUwMDNlYXV4LVx1MDAzZXRva2VuLFxuK1x0XHRcdFx0ICAgICB1YXR0ci5pc19rZXJuZWwpO1xuK1x0aWYgKHJldClcbitcdFx0Z290byBlcnJfcHJlcDtcbitcbitcdGJwZl9nZXRfYnRmX3ZtbGludXgoKTtcbitcbitcdC8qIGdyYWIgdGhlIG11dGV4IHRvIHByb3RlY3QgZmV3IGdsb2JhbHMgdXNlZCBieSB2ZXJpZmllciAqL1xuK1x0aWYgKCFpc19wcml2KVxuK1x0XHRtdXRleF9sb2NrKFx1MDAyNmJwZl92ZXJpZmllcl9sb2NrKTtcbitcbitcdGxlbiA9IGVudi1cdTAwM2Vwcm9nLVx1MDAzZWxlbjtcbitcdGVudi1cdTAwM2VpbnNuX2F1eF9kYXRhID1cbitcdFx0dnphbGxvYyhhcnJheV9zaXplKHNpemVvZihzdHJ1Y3QgYnBmX2luc25fYXV4X2RhdGEpLCBsZW4pKTtcbitcdHJldCA9IC1FTk9NRU07XG4rXHRpZiAoIWVudi1cdTAwM2VpbnNuX2F1eF9kYXRhKVxuK1x0XHRnb3RvIHNraXBfZnVsbF9jaGVjaztcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGxlbjsgaSsrKVxuK1x0XHRlbnYtXHUwMDNlaW5zbl9hdXhfZGF0YVtpXS5vcmlnX2lkeCA9IGk7XG4rXHRlbnYtXHUwMDNlc3VjYyA9IGJwZl9pYXJyYXlfcmVhbGxvYyhOVUxMLCAyKTtcbitcdGlmICghZW52LVx1MDAzZXN1Y2MpXG4gXHRcdGdvdG8gc2tpcF9mdWxsX2NoZWNrO1xuIFxuIFx0bWFya192ZXJpZmllcl9zdGF0ZV9jbGVhbihlbnYpO1xuQEAgLTIwMDMzLDE3ICsyMDMyOCwyNiBAQCBpbnQgYnBmX2NoZWNrKHN0cnVjdCBicGZfcHJvZyAqKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbiBcdCpwcm9nID0gZW52LVx1MDAzZXByb2c7XG4gXG4gXHRtb2R1bGVfcHV0KGVudi1cdTAwM2VhdHRhY2hfYnRmX21vZCk7XG4tZXJyX3VubG9jazpcbiBcdGlmICghaXNfcHJpdilcbiBcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmJwZl92ZXJpZmllcl9sb2NrKTtcbi1cdGJwZl9jbGVhcl9pbnNuX2F1eF9kYXRhKGVudiwgMCwgZW52LVx1MDAzZXByb2ctXHUwMDNlbGVuKTtcbitcdGdvdG8gZXJyX2ZyZWVfZW52O1xuK2Vycl9wcmVwOlxuK1x0ZXJyID0gYnBmX2xvZ19hdHRyX2ZpbmFsaXplKGF0dHJfbG9nLCBcdTAwMjZlbnYtXHUwMDNlbG9nKTtcbitcdGlmIChlcnIpXG4rXHRcdHJldCA9IGVycjtcbitcdHJlbGVhc2VfaW5zbl9hcnJheXMoZW52KTtcbitcdHJlbGVhc2VfbWFwcyhlbnYpO1xuK1x0cmVsZWFzZV9idGZzKGVudik7XG4gZXJyX2ZyZWVfZW52OlxuK1x0aWYgKGVudi1cdTAwM2VpbnNuX2F1eF9kYXRhKVxuK1x0XHRicGZfY2xlYXJfaW5zbl9hdXhfZGF0YShlbnYsIDAsIGVudi1cdTAwM2Vwcm9nLVx1MDAzZWxlbik7XG4rXHR2ZnJlZShlbnYtXHUwMDNlaW5zbl9hdXhfZGF0YSk7XG4rXHRrdmZyZWUoZW52LVx1MDAzZWZkX2FycmF5KTtcbiBcdGJwZl9zdGFja19saXZlbmVzc19mcmVlKGVudik7XG4gXHRrdmZyZWUoZW52LVx1MDAzZWNmZy5pbnNuX3Bvc3RvcmRlcik7XG4gXHRrdmZyZWUoZW52LVx1MDAzZXNjY19pbmZvKTtcbiBcdGt2ZnJlZShlbnYtXHUwMDNlc3VjYyk7XG4gXHRrdmZyZWUoZW52LVx1MDAzZWdvdG94X3RtcF9idWYpO1xuLVx0dmZyZWUoZW52LVx1MDAzZWluc25fYXV4X2RhdGEpO1xuIFx0a3ZmcmVlKGVudik7XG4gXHRyZXR1cm4gcmV0O1xuIH1cbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9nZW4uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jXG5pbmRleCA2YWU3MjYyZWJlMGMxZC4uYTAxZDA2ZDIyZDFhM2IgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9nZW4uY1xuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmNcbkBAIC03OTMsNiArNzkzLDggQEAgc3RhdGljIGludCBnZW5fdHJhY2Uoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgY29uc3QgY2hhciAqb2JqX25hbWUsIGNvbnN0IGNoYXIgKmhcbiBcdGlmIChzaWduX3Byb2dzKSB7XG4gXHRcdHNvcHRzLmluc25zID0gb3B0cy5pbnNucztcbiBcdFx0c29wdHMuaW5zbnNfc3ogPSBvcHRzLmluc25zX3N6O1xuK1x0XHRzb3B0cy5kYXRhID0gb3B0cy5kYXRhO1xuK1x0XHRzb3B0cy5kYXRhX3N6ID0gb3B0cy5kYXRhX3N6O1xuIFx0XHRzb3B0cy5leGNsX3Byb2dfaGFzaCA9IHByb2dfc2hhO1xuIFx0XHRzb3B0cy5leGNsX3Byb2dfaGFzaF9zeiA9IHNpemVvZihwcm9nX3NoYSk7XG4gXHRcdHNvcHRzLnNpZ25hdHVyZSA9IHNpZ19idWY7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvc2lnbi5jIGIvdG9vbHMvYnBmL2JwZnRvb2wvc2lnbi5jXG5pbmRleCBmOWI3NDJmNGJiMTA0Yi4uODg3MjZhNmRiNmQwZTkgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9zaWduLmNcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uY1xuQEAgLTEzNSw5ICsxMzUsMjEgQEAgaW50IGJwZnRvb2xfcHJvZ19zaWduKHN0cnVjdCBicGZfbG9hZF9hbmRfcnVuX29wdHMgKm9wdHMpXG4gXHRDTVNfQ29udGVudEluZm8gKmNtcyA9IE5VTEw7XG4gXHRsb25nIGFjdHVhbF9zaWdfbGVuID0gMDtcbiBcdFg1MDkgKng1MDkgPSBOVUxMO1xuK1x0dm9pZCAqZGF0YSA9IE5VTEw7XG4rXHRzaXplX3QgZGF0YV9zejtcbiBcdGludCBlcnIgPSAwO1xuIFxuLVx0YmRfaW4gPSBCSU9fbmV3X21lbV9idWYob3B0cy1cdTAwM2VpbnNucywgb3B0cy1cdTAwM2VpbnNuc19zeik7XG4rXHRkYXRhX3N6ID0gKHNpemVfdClvcHRzLVx1MDAzZWluc25zX3N6ICsgb3B0cy1cdTAwM2VkYXRhX3N6O1xuK1x0ZGF0YSA9IG1hbGxvYyhkYXRhX3N6KTtcbitcdGlmICghZGF0YSkge1xuK1x0XHRlcnIgPSAtRU5PTUVNO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXHRtZW1jcHkoZGF0YSwgb3B0cy1cdTAwM2VpbnNucywgb3B0cy1cdTAwM2VpbnNuc19zeik7XG4rXHRpZiAob3B0cy1cdTAwM2VkYXRhX3N6KVxuK1x0XHRtZW1jcHkoKGNoYXIgKilkYXRhICsgb3B0cy1cdTAwM2VpbnNuc19zeiwgb3B0cy1cdTAwM2VkYXRhLCBvcHRzLVx1MDAzZWRhdGFfc3opO1xuK1xuK1x0YmRfaW4gPSBCSU9fbmV3X21lbV9idWYoZGF0YSwgZGF0YV9zeik7XG4gXHRpZiAoIWJkX2luKSB7XG4gXHRcdGVyciA9IC1FTk9NRU07XG4gXHRcdGdvdG8gY2xlYW51cDtcbkBAIC0xNzUsMTAgKzE4NywxMyBAQCBpbnQgYnBmdG9vbF9wcm9nX3NpZ24oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cylcbiBcdFx0Z290byBjbGVhbnVwO1xuIFx0fVxuIFxuLVx0RVZQX0RpZ2VzdChvcHRzLVx1MDAzZWluc25zLCBvcHRzLVx1MDAzZWluc25zX3N6LCBvcHRzLVx1MDAzZWV4Y2xfcHJvZ19oYXNoLFxuLVx0XHQgICBcdTAwMjZvcHRzLVx1MDAzZWV4Y2xfcHJvZ19oYXNoX3N6LCBFVlBfc2hhMjU2KCksIE5VTEwpO1xuK1x0aWYgKEVWUF9EaWdlc3Qob3B0cy1cdTAwM2VpbnNucywgb3B0cy1cdTAwM2VpbnNuc19zeiwgb3B0cy1cdTAwM2VleGNsX3Byb2dfaGFzaCxcbitcdFx0ICAgICAgIFx1MDAyNm9wdHMtXHUwMDNlZXhjbF9wcm9nX2hhc2hfc3osIEVWUF9zaGEyNTYoKSwgTlVMTCkgIT0gMSkge1xuK1x0XHRlcnIgPSAtRUlPO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4gXG4tXHRcdGJkX291dCA9IEJJT19uZXcoQklPX3NfbWVtKCkpO1xuK1x0YmRfb3V0ID0gQklPX25ldyhCSU9fc19tZW0oKSk7XG4gXHRpZiAoIWJkX291dCkge1xuIFx0XHRlcnIgPSAtRU5PTUVNO1xuIFx0XHRnb3RvIGNsZWFudXA7XG5AQCAtMjEyLDYgKzIyNyw3IEBAIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKVxuIFx0WDUwOV9mcmVlKHg1MDkpO1xuIFx0RVZQX1BLRVlfZnJlZShwcml2YXRlX2tleSk7XG4gXHRCSU9fZnJlZShiZF9pbik7XG4rXHRmcmVlKGRhdGEpO1xuIFx0RElTUExBWV9PU1NMX0VSUihlcnIgXHUwMDNjIDApO1xuIFx0cmV0dXJuIGVycjtcbiB9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmggYi90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaFxuaW5kZXggNDlhZjQyNjBiOGU2YjcuLjA0MjU2OTE4Nzc1MjE3IDEwMDY0NFxuLS0tIGEvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmhcbisrKyBiL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oXG5AQCAtNTEsNyArNTEsNiBAQCBzdHJ1Y3QgYnBmX2dlbiB7XG4gXHRfX3UzMiBucl9rc3ltcztcbiBcdGludCBmZF9hcnJheTtcbiBcdGludCBucl9mZF9hcnJheTtcbi1cdGludCBoYXNoX2luc25fb2Zmc2V0W1NIQTI1Nl9EV09SRF9TSVpFXTtcbiB9O1xuIFxuIHZvaWQgYnBmX2dlbl9faW5pdChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbG9nX2xldmVsLCBpbnQgbnJfcHJvZ3MsIGludCBucl9tYXBzKTtcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuYyBiL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jXG5pbmRleCBjN2YyZDJhYzdiYjM1Zi4uNmUzZGQ1MjQyNzYxODMgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuY1xuKysrIGIvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmNcbkBAIC0xMTEsNyArMTExLDYgQEAgc3RhdGljIHZvaWQgZW1pdDIoc3RydWN0IGJwZl9nZW4gKmdlbiwgc3RydWN0IGJwZl9pbnNuIGluc24xLCBzdHJ1Y3QgYnBmX2luc24gaW5cbiBcbiBzdGF0aWMgaW50IGFkZF9kYXRhKHN0cnVjdCBicGZfZ2VuICpnZW4sIGNvbnN0IHZvaWQgKmRhdGEsIF9fdTMyIHNpemUpO1xuIHN0YXRpYyB2b2lkIGVtaXRfc3lzX2Nsb3NlX2Jsb2Ioc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGJsb2Jfb2ZmKTtcbi1zdGF0aWMgdm9pZCBlbWl0X3NpZ25hdHVyZV9tYXRjaChzdHJ1Y3QgYnBmX2dlbiAqZ2VuKTtcbiBcbiB2b2lkIGJwZl9nZW5fX2luaXQoc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGxvZ19sZXZlbCwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcylcbiB7XG5AQCAtMTU0LDggKzE1Myw2IEBAIHZvaWQgYnBmX2dlbl9faW5pdChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbG9nX2xldmVsLCBpbnQgbnJfcHJvZ3MsIGludCBucl9tYXBzXG4gXHQvKiBSNyBjb250YWlucyB0aGUgZXJyb3IgY29kZSBmcm9tIHN5c19icGYuIENvcHkgaXQgaW50byBSMCBhbmQgZXhpdC4gKi9cbiBcdGVtaXQoZ2VuLCBCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMCwgQlBGX1JFR183KSk7XG4gXHRlbWl0KGdlbiwgQlBGX0VYSVRfSU5TTigpKTtcbi1cdGlmIChPUFRTX0dFVChnZW4tXHUwMDNlb3B0cywgZ2VuX2hhc2gsIGZhbHNlKSlcbi1cdFx0ZW1pdF9zaWduYXR1cmVfbWF0Y2goZ2VuKTtcbiB9XG4gXG4gc3RhdGljIGludCBhZGRfZGF0YShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCB2b2lkICpkYXRhLCBfX3UzMiBzaXplKVxuQEAgLTM3Nyw4ICszNzQsNiBAQCBzdGF0aWMgdm9pZCBlbWl0X3N5c19jbG9zZV9ibG9iKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBibG9iX29mZilcbiBcdF9fZW1pdF9zeXNfY2xvc2UoZ2VuKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgY29tcHV0ZV9zaGFfdXBkYXRlX29mZnNldHMoc3RydWN0IGJwZl9nZW4gKmdlbik7XG4tXG4gaW50IGJwZl9nZW5fX2ZpbmlzaChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbnJfcHJvZ3MsIGludCBucl9tYXBzKVxuIHtcbiBcdGludCBpO1xuQEAgLTQwOCw5ICs0MDMsNiBAQCBpbnQgYnBmX2dlbl9fZmluaXNoKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBucl9wcm9ncywgaW50IG5yX21hcHMpXG4gXHRpZiAoIWdlbi1cdTAwM2VlcnJvcikge1xuIFx0XHRzdHJ1Y3QgZ2VuX2xvYWRlcl9vcHRzICpvcHRzID0gZ2VuLVx1MDAzZW9wdHM7XG4gXG4tXHRcdGlmIChPUFRTX0dFVChvcHRzLCBnZW5faGFzaCwgZmFsc2UpKVxuLVx0XHRcdGNvbXB1dGVfc2hhX3VwZGF0ZV9vZmZzZXRzKGdlbik7XG4tXG4gXHRcdG9wdHMtXHUwMDNlaW5zbnMgPSBnZW4tXHUwMDNlaW5zbl9zdGFydDtcbiBcdFx0b3B0cy1cdTAwM2VpbnNuc19zeiA9IGdlbi1cdTAwM2VpbnNuX2N1ciAtIGdlbi1cdTAwM2VpbnNuX3N0YXJ0O1xuIFx0XHRvcHRzLVx1MDAzZWRhdGEgPSBnZW4tXHUwMDNlZGF0YV9zdGFydDtcbkBAIC00NjAsMjIgKzQ1Miw2IEBAIHZvaWQgYnBmX2dlbl9fZnJlZShzdHJ1Y3QgYnBmX2dlbiAqZ2VuKVxuIFx0X3ZhbDtcdFx0XHRcdFx0XHRcdFxcXG4gfSlcbiBcbi1zdGF0aWMgdm9pZCBjb21wdXRlX3NoYV91cGRhdGVfb2Zmc2V0cyhzdHJ1Y3QgYnBmX2dlbiAqZ2VuKVxuLXtcbi1cdF9fdTY0IHNoYVtTSEEyNTZfRFdPUkRfU0laRV07XG4tXHRfX3U2NCBzaGFfZHc7XG4tXHRpbnQgaTtcbi1cbi1cdGxpYmJwZl9zaGEyNTYoZ2VuLVx1MDAzZWRhdGFfc3RhcnQsIGdlbi1cdTAwM2VkYXRhX2N1ciAtIGdlbi1cdTAwM2VkYXRhX3N0YXJ0LCAoX191OCAqKXNoYSk7XG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBTSEEyNTZfRFdPUkRfU0laRTsgaSsrKSB7XG4tXHRcdHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9XG4tXHRcdFx0KHN0cnVjdCBicGZfaW5zbiAqKShnZW4tXHUwMDNlaW5zbl9zdGFydCArIGdlbi1cdTAwM2VoYXNoX2luc25fb2Zmc2V0W2ldKTtcbi1cdFx0c2hhX2R3ID0gdGd0X2VuZGlhbihzaGFbaV0pO1xuLVx0XHRpbnNuWzBdLmltbSA9IChfX3UzMilzaGFfZHc7XG4tXHRcdGluc25bMV0uaW1tID0gc2hhX2R3IFx1MDAzZVx1MDAzZSAzMjtcbi1cdH1cbi19XG4tXG4gdm9pZCBicGZfZ2VuX19sb2FkX2J0ZihzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCB2b2lkICpidGZfcmF3X2RhdGEsXG4gXHRcdCAgICAgICBfX3UzMiBidGZfcmF3X3NpemUpXG4ge1xuQEAgLTU1Nyw4ICs1MzMsOSBAQCB2b2lkIGJwZl9nZW5fX21hcF9jcmVhdGUoc3RydWN0IGJwZl9nZW4gKmdlbixcbiBcdCAqIENvbmRpdGlvbmFsbHkgdXBkYXRlIG1heF9lbnRyaWVzIGZyb20gdGhlIGhvc3Qtc3VwcGxpZWQgbG9hZGVyXG4gXHQgKiBjdHguIFRoaXMgc2l6ZXMgdGhlIG1hcCBhdCBydW50aW1lLCBidXQgZm9yIGEgc2lnbmVkIGxvYWRlclxuIFx0ICogKGdlbl9oYXNoKSBpdCB3b3VsZCBsZXQgYW4gdW50cnVzdGVkIGhvc3QgcmUtZGltZW5zaW9uIHRoZVxuLVx0ICogcHJvZ3JhbSdzIG1hcHMgYWZ0ZXIgZW1pdF9zaWduYXR1cmVfbWF0Y2goKSwgb3V0c2lkZSB3aGF0IHRoZVxuLVx0ICogc2lnbmF0dXJlIGF0dGVzdHMgdG8uIEtlZXAgdGhlIHNpZ25lci1wcm92aWRlZCBtYXhfZW50cmllc1xuK1x0ICogcHJvZ3JhbSdzIG1hcHMsIG91dHNpZGUgd2hhdCB0aGUgc2lnbmF0dXJlIGF0dGVzdHMgdG86IHRoZVxuK1x0ICogbWV0YWRhdGEgYmxvYiBpcyBjb3ZlcmVkIGJ5IHRoZSBwcm9ncmFtIHNpZ25hdHVyZSBhbmQgdmVyaWZpZWRcbitcdCAqIGJ5IHRoZSBrZXJuZWwgYXQgbG9hZCB0aW1lLiBLZWVwIHRoZSBzaWduZXItcHJvdmlkZWQgbWF4X2VudHJpZXNcbiBcdCAqIGJha2VkIGludG8gdGhlIGJsb2IgaW4gdGhhdCBjYXNlLlxuIFx0ICovXG4gXHRpZiAobWFwX2lkeCBcdTAwM2U9IDAgXHUwMDI2XHUwMDI2ICFPUFRTX0dFVChnZW4tXHUwMDNlb3B0cywgZ2VuX2hhc2gsIGZhbHNlKSlcbkBAIC01OTYsNDUgKzU3Myw2IEBAIHZvaWQgYnBmX2dlbl9fbWFwX2NyZWF0ZShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLFxuIFx0XHRlbWl0X3N5c19jbG9zZV9zdGFjayhnZW4sIHN0YWNrX29mZihpbm5lcl9tYXBfZmQpKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgZW1pdF9zaWduYXR1cmVfbWF0Y2goc3RydWN0IGJwZl9nZW4gKmdlbilcbi17XG4tXHRfX3M2NCBvZmY7XG4tXHRpbnQgaTtcbi1cbi1cdC8qXG4tXHQgKiBSZWplY3QgaWYgdGhlIG1ldGFkYXRhIG1hcCBpcyBub3QgZXhjbHVzaXZlLiBXaXRob3V0IGV4Y2x1c2l2aXR5XG4tXHQgKiB0aGUgY2FjaGVkIG1hcC1cdTAwM2VzaGFbXSB2ZXJpZmllZCBhYm92ZSBjYW4gYmUgc3RhbGU6IGFub3RoZXIgQlBGXG4tXHQgKiBwcm9ncmFtIHdpdGggbWFwIGFjY2VzcyBjb3VsZCBoYXZlIG11dGF0ZWQgdGhlIGNvbnRlbnRzIGJldHdlZW5cbi1cdCAqIEJQRl9PQkpfR0VUX0lORk9fQllfRkQgYW5kIGxvYWRlciBleGVjdXRpb24uXG4tXHQgKi9cbi1cdGVtaXQyKGdlbiwgQlBGX0xEX0lNTTY0X1JBV19GVUxMKEJQRl9SRUdfMSwgQlBGX1BTRVVET19NQVBfSURYLFxuLVx0XHRcdFx0XHQgMCwgMCwgMCwgMCkpO1xuLVx0ZW1pdChnZW4sIEJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwgU0hBMjU2X0RJR0VTVF9MRU5HVEgpKTtcbi1cdG9mZiA9IC0oZ2VuLVx1MDAzZWluc25fY3VyIC0gZ2VuLVx1MDAzZWluc25fc3RhcnQgLSBnZW4tXHUwMDNlY2xlYW51cF9sYWJlbCkgLyA4IC0gMjtcbi1cdGlmIChpc19zaW1tMTYob2ZmKSkge1xuLVx0XHRlbWl0KGdlbiwgQlBGX01PVjY0X0lNTShCUEZfUkVHXzcsIC1FSU5WQUwpKTtcbi1cdFx0ZW1pdChnZW4sIEJQRl9KTVBfSU1NKEJQRl9KTkUsIEJQRl9SRUdfMiwgMSwgb2ZmKSk7XG4tXHR9IGVsc2Uge1xuLVx0XHRnZW4tXHUwMDNlZXJyb3IgPSAtRVJBTkdFO1xuLVx0fVxuLVxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgU0hBMjU2X0RXT1JEX1NJWkU7IGkrKykge1xuLVx0XHRlbWl0MihnZW4sIEJQRl9MRF9JTU02NF9SQVdfRlVMTChCUEZfUkVHXzEsIEJQRl9QU0VVRE9fTUFQX0lEWCxcbi1cdFx0XHRcdFx0XHQgMCwgMCwgMCwgMCkpO1xuLVx0XHRlbWl0KGdlbiwgQlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwgaSAqIHNpemVvZihfX3U2NCkpKTtcbi1cdFx0Z2VuLVx1MDAzZWhhc2hfaW5zbl9vZmZzZXRbaV0gPSBnZW4tXHUwMDNlaW5zbl9jdXIgLSBnZW4tXHUwMDNlaW5zbl9zdGFydDtcbi1cdFx0ZW1pdDIoZ2VuLCBCUEZfTERfSU1NNjRfUkFXX0ZVTEwoQlBGX1JFR18zLCAwLCAwLCAwLCAwLCAwKSk7XG4tXG4tXHRcdG9mZiA9IC0oZ2VuLVx1MDAzZWluc25fY3VyIC0gZ2VuLVx1MDAzZWluc25fc3RhcnQgLSBnZW4tXHUwMDNlY2xlYW51cF9sYWJlbCkgLyA4IC0gMjtcbi1cdFx0aWYgKGlzX3NpbW0xNihvZmYpKSB7XG4tXHRcdFx0ZW1pdChnZW4sIEJQRl9NT1Y2NF9JTU0oQlBGX1JFR183LCAtRUlOVkFMKSk7XG4tXHRcdFx0ZW1pdChnZW4sIEJQRl9KTVBfUkVHKEJQRl9KTkUsIEJQRl9SRUdfMiwgQlBGX1JFR18zLCBvZmYpKTtcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRnZW4tXHUwMDNlZXJyb3IgPSAtRVJBTkdFO1xuLVx0XHR9XG4tXHR9XG4tfVxuLVxuIHZvaWQgYnBmX2dlbl9fcmVjb3JkX2F0dGFjaF90YXJnZXQoc3RydWN0IGJwZl9nZW4gKmdlbiwgY29uc3QgY2hhciAqYXR0YWNoX25hbWUsXG4gXHRcdFx0XHQgICBlbnVtIGJwZl9hdHRhY2hfdHlwZSB0eXBlKVxuIHtcbkBAIC0xMjExLDEwICsxMTQ5LDEwIEBAIHZvaWQgYnBmX2dlbl9fbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBtYXBfaWR4LCB2b2lkICpwdmFsdWUsXG4gXHQgKiB9XG4gXHQgKlxuIFx0ICogVGhlIHJ1bnRpbWUgaW5pdGlhbF92YWx1ZSBjb21lcyBmcm9tIHRoZSBob3N0LXN1cHBsaWVkIGxvYWRlclxuLVx0ICogY3R4IGFuZCB3b3VsZCBvdmVyd3JpdGUgdGhlIGJsb2IgdmFsdWUgYWZ0ZXIgZW1pdF9zaWduYXR1cmVfbWF0Y2goKVxuLVx0ICogaGFzIGFscmVhZHkgdmFsaWRhdGVkIG1hcC1cdTAwM2VzaGFbXS4gRm9yIGEgc2lnbmVkIGxvYWRlciAoZ2VuX2hhc2gpXG4tXHQgKiB0aGUgYXR0ZXN0ZWQgYmxvYiB2YWx1ZSBtdXN0IGJlIGF1dGhvcml0YXRpdmUsIHNvIHNraXAgdGhlIG92ZXJyaWRlXG4tXHQgKiBhbmQgbGVhdmUgdGhlIGhhc2hlZCB2YWx1ZSBpbiBwbGFjZS5cbitcdCAqIGN0eCBhbmQgd291bGQgb3ZlcndyaXRlIHRoZSBibG9iIHZhbHVlIHRoYXQgdGhlIHByb2dyYW0gc2lnbmF0dXJlXG4rXHQgKiBjb3ZlcnMgYW5kIHRoZSBrZXJuZWwgdmVyaWZpZXMgYXQgbG9hZCB0aW1lLiBGb3IgYSBzaWduZWQgbG9hZGVyXG4rXHQgKiAoZ2VuX2hhc2gpIHRoZSBhdHRlc3RlZCBibG9iIHZhbHVlIG11c3QgYmUgYXV0aG9yaXRhdGl2ZSwgc28gc2tpcFxuK1x0ICogdGhlIG92ZXJyaWRlIGFuZCBsZWF2ZSB0aGUgc2lnbmVkIHZhbHVlIGluIHBsYWNlLlxuIFx0ICovXG4gXHRpZiAoIU9QVFNfR0VUKGdlbi1cdTAwM2VvcHRzLCBnZW5faGFzaCwgZmFsc2UpKSB7XG4gXHRcdGVtaXQoZ2VuLCBCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMywgQlBGX1JFR182LFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmggYi90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oXG5pbmRleCAwNGNkMzAzZmI1YTg3OS4uZDViN2RiNzAzYjNmZTkgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oXG4rKysgYi90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oXG5AQCAtNzY4LDcgKzc2OCw2IEBAIGludCBlbGZfcmVzb2x2ZV9wYXR0ZXJuX29mZnNldHMoY29uc3QgY2hhciAqYmluYXJ5X3BhdGgsIGNvbnN0IGNoYXIgKnBhdHRlcm4sXG4gaW50IHByb2JlX2ZkKGludCBmZCk7XG4gXG4gI2RlZmluZSBTSEEyNTZfRElHRVNUX0xFTkdUSCAzMlxuLSNkZWZpbmUgU0hBMjU2X0RXT1JEX1NJWkUgU0hBMjU2X0RJR0VTVF9MRU5HVEggLyBzaXplb2YoX191NjQpXG4gXG4gdm9pZCBsaWJicGZfc2hhMjU2KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4sIF9fdTggb3V0W1NIQTI1Nl9ESUdFU1RfTEVOR1RIXSk7XG4gaW50IHByb2JlX3N5c19icGZfZXh0KHZvaWQpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmhcbmluZGV4IDc0NTAzZDM1OGJjOGE1Li41M2ZlZTUzZDM2ZDUxMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oXG4rKysgYi90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaFxuQEAgLTE4LDEwICsxOCw2IEBAXG4gI2luY2x1ZGUgXCJicGYuaFwiXG4gI2VuZGlmXG4gXG4tI2lmbmRlZiBTSEEyNTZfRElHRVNUX0xFTkdUSFxuLSNkZWZpbmUgU0hBMjU2X0RJR0VTVF9MRU5HVEggMzJcbi0jZW5kaWZcbi1cbiAjaWZuZGVmIF9fTlJfYnBmXG4gIyBpZiBkZWZpbmVkKF9fbWlwc19fKSBcdTAwMjZcdTAwMjYgZGVmaW5lZChfQUJJTzMyKVxuICMgIGRlZmluZSBfX05SX2JwZiA0MzU1XG5AQCAtMzIwLDI1ICszMTYsNiBAQCBzdGF0aWMgaW5saW5lIGludCBza2VsX2xpbmtfY3JlYXRlKGludCBwcm9nX2ZkLCBpbnQgdGFyZ2V0X2ZkLFxuIFx0cmV0dXJuIHNrZWxfc3lzX2JwZihCUEZfTElOS19DUkVBVEUsIFx1MDAyNmF0dHIsIGF0dHJfc3opO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIGludCBza2VsX29ial9nZXRfaW5mb19ieV9mZChpbnQgZmQpXG4te1xuLVx0Y29uc3Qgc2l6ZV90IGF0dHJfc3ogPSBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwgaW5mbyk7XG4tXHRfX3U4IHNoYVtTSEEyNTZfRElHRVNUX0xFTkdUSF07XG4tXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm87XG4tXHRfX3UzMiBpbmZvX2xlbiA9IHNpemVvZihpbmZvKTtcbi1cdHVuaW9uIGJwZl9hdHRyIGF0dHI7XG4tXG4tXHRtZW1zZXQoXHUwMDI2aW5mbywgMCwgc2l6ZW9mKGluZm8pKTtcbi1cdGluZm8uaGFzaCA9IChsb25nKSBcdTAwMjZzaGE7XG4tXHRpbmZvLmhhc2hfc2l6ZSA9IFNIQTI1Nl9ESUdFU1RfTEVOR1RIO1xuLVxuLVx0bWVtc2V0KFx1MDAyNmF0dHIsIDAsIGF0dHJfc3opO1xuLVx0YXR0ci5pbmZvLmJwZl9mZCA9IGZkO1xuLVx0YXR0ci5pbmZvLmluZm8gPSAobG9uZykgXHUwMDI2aW5mbztcbi1cdGF0dHIuaW5mby5pbmZvX2xlbiA9IGluZm9fbGVuO1xuLVx0cmV0dXJuIHNrZWxfc3lzX2JwZihCUEZfT0JKX0dFVF9JTkZPX0JZX0ZELCBcdTAwMjZhdHRyLCBhdHRyX3N6KTtcbi19XG4tXG4gc3RhdGljIGlubGluZSBpbnQgc2tlbF9tYXBfZnJlZXplKGludCBmZClcbiB7XG4gXHRjb25zdCBzaXplX3QgYXR0cl9zeiA9IG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBtYXBfZmQpO1xuQEAgLTM4NCwxMiArMzYxLDYgQEAgc3RhdGljIGlubGluZSBpbnQgYnBmX2xvYWRfYW5kX3J1bihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKVxuIFx0XHRzZXRfZXJyO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbi1cdGVyciA9IHNrZWxfb2JqX2dldF9pbmZvX2J5X2ZkKG1hcF9mZCk7XG4tXHRpZiAoZXJyIFx1MDAzYyAwKSB7XG4tXHRcdG9wdHMtXHUwMDNlZXJyc3RyID0gXCJmYWlsZWQgdG8gZmV0Y2ggb2JqIGluZm9cIjtcbi1cdFx0c2V0X2Vycjtcbi1cdFx0Z290byBvdXQ7XG4tXHR9XG4gI2VuZGlmXG4gXG4gXHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgcHJvZ19sb2FkX2F0dHJfc3opO1xuQEAgLTQwMCw2ICszNzEsOCBAQCBzdGF0aWMgaW5saW5lIGludCBicGZfbG9hZF9hbmRfcnVuKHN0cnVjdCBicGZfbG9hZF9hbmRfcnVuX29wdHMgKm9wdHMpXG4gI2lmbmRlZiBfX0tFUk5FTF9fXG4gXHRhdHRyLnNpZ25hdHVyZSA9IChsb25nKSBvcHRzLVx1MDAzZXNpZ25hdHVyZTtcbiBcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBvcHRzLVx1MDAzZXNpZ25hdHVyZV9zejtcbitcdGlmIChvcHRzLVx1MDAzZXNpZ25hdHVyZSlcbitcdFx0YXR0ci5mZF9hcnJheV9jbnQgPSAxO1xuICNlbHNlXG4gXHRpZiAob3B0cy1cdTAwM2VzaWduYXR1cmUgfHwgb3B0cy1cdTAwM2VzaWduYXR1cmVfc3opXG4gXHRcdHByX3dhcm4oXCJzaWduYXR1cmVzIGFyZSBub3Qgc3VwcG9ydGVkIGZyb20gYnBmX3ByZWxvYWRcXG5cIik7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jXG5pbmRleCA1ZmM0MTdlMzFmYzYxNS4uNTZkMWYwNzJkZTRjMTcgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuY1xuQEAgLTExLDYgKzExLDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rZXljdGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4rXG4gI2luY2x1ZGUgXCJicGYvbGliYnBmX2ludGVybmFsLmhcIiAvKiBmb3IgbGliYnBmX3NoYTI1NigpICovXG4gI2luY2x1ZGUgXCJicGYvc2tlbF9pbnRlcm5hbC5oXCJcdCAvKiBmb3IgbG9hZGVyIGN0eCBsYXlvdXQgKGJwZl9sb2FkZXJfY3R4IGV0YykgKi9cbiBcbkBAIC0xOSw4ICsyMSw2IEBAXG4gI2luY2x1ZGUgXCJ0ZXN0X3NpZ25lZF9sb2FkZXJfZGF0YS5za2VsLmhcIlxuICNpbmNsdWRlIFwidGVzdF9zaWduZWRfbG9hZGVyX2xzbS5za2VsLmhcIlxuIFxuLSNkZWZpbmUgU0lHX01BVENIX0lOU05TIDMzIC8qIGV4Y2wgKDUpICsgNCAqIHNoYS1kd29yZCAoNykgKi9cbi1cbiBlbnVtIHtcbiBcdEJQRl9TSUdfVU5TSUdORUQgPSAwLFxuIFx0QlBGX1NJR19WRVJJRklFRCxcbkBAIC0zNSw3ICszNSw4IEBAIGVudW0ge1xuIH07XG4gXG4gc3RhdGljIGludCBsb2FkX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osIGludCBtYXBfZmQsXG4tXHRcdCAgICAgICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZClcbitcdFx0ICAgICAgIGNvbnN0IHZvaWQgKnNpZywgX191MzIgc2lnX3N6LCBfX3MzMiBrZXlyaW5nX2lkLFxuK1x0XHQgICAgICAgX191MzIgZmRfYXJyYXlfY250KVxuIHtcbiBcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XG4gXHRpbnQgZmQ7XG5AQCAtNTIsNiArNTMsNyBAQCBzdGF0aWMgaW50IGxvYWRfbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCxcbiBcdFx0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcbiBcdFx0YXR0ci5rZXlyaW5nX2lkID0ga2V5cmluZ19pZDtcbiBcdH1cbitcdGF0dHIuZmRfYXJyYXlfY250ID0gZmRfYXJyYXlfY250O1xuIFx0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcIl9fbG9hZGVyLnByb2dcIiwgc2l6ZW9mKFwiX19sb2FkZXIucHJvZ1wiKSk7XG4gXHRmZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFx1MDAyNmF0dHIsXG4gXHRcdCAgICAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcbkBAIC02MiwxNCArNjQsMTIgQEAgc3RhdGljIGludCBydW5fZ2VuX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osXG4gXHRcdFx0ICBjb25zdCB2b2lkICpkYXRhLCBfX3UzMiBkYXRhX3N6LFxuIFx0XHRcdCAgY29uc3Qgdm9pZCAqZXhjbCwgX191MzIgZXhjbF9zeixcbiBcdFx0XHQgIGNvbnN0IHZvaWQgKnNpZywgX191MzIgc2lnX3N6LFxuLVx0XHRcdCAgYm9vbCBnZXRfaGFzaCwgdm9pZCAqY3R4LCBfX3UzMiBjdHhfc3osIGJvb2wgKmxvYWRlcl9yYW4pXG4rXHRcdFx0ICB2b2lkICpjdHgsIF9fdTMyIGN0eF9zeiwgYm9vbCAqbG9hZGVyX3JhbilcbiB7XG4gXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBtb3B0cyxcbiBcdFx0ICAgIC5leGNsX3Byb2dfaGFzaCA9IGV4Y2wsXG4gXHRcdCAgICAuZXhjbF9wcm9nX2hhc2hfc2l6ZSA9IGV4Y2xfc3opO1xuLVx0X191OCBoYnVmW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTtcbi1cdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbztcbi1cdF9fdTMyIGlsZW4gPSBzaXplb2YoaW5mbyksIGtleSA9IDA7XG4rXHRfX3UzMiBrZXkgPSAwO1xuIFx0dW5pb24gYnBmX2F0dHIgYXR0cjtcbiBcdGludCBtYXBfZmQsIHByb2dfZmQsIHJldDtcbiBcbkBAIC04NywxNSArODcsNiBAQCBzdGF0aWMgaW50IHJ1bl9nZW5fbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeixcbiBcdFx0cmV0ID0gLWVycm5vO1xuIFx0XHRnb3RvIG91dF9tYXA7XG4gXHR9XG4tXHRpZiAoZ2V0X2hhc2gpIHtcbi1cdFx0bWVtc2V0KFx1MDAyNmluZm8sIDAsIHNpemVvZihpbmZvKSk7XG4tXHRcdGluZm8uaGFzaCA9IHB0cl90b191NjQoaGJ1Zik7XG4tXHRcdGluZm8uaGFzaF9zaXplID0gc2l6ZW9mKGhidWYpO1xuLVx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChtYXBfZmQsIFx1MDAyNmluZm8sIFx1MDAyNmlsZW4pKSB7XG4tXHRcdFx0cmV0ID0gLWVycm5vO1xuLVx0XHRcdGdvdG8gb3V0X21hcDtcbi1cdFx0fVxuLVx0fVxuIFxuIFx0bWVtc2V0KFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XG4gXHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbkBAIC0xMDgsNiArOTksNyBAQCBzdGF0aWMgaW50IHJ1bl9nZW5fbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeixcbiBcdFx0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XG4gXHRcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XG4gXHRcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcbitcdFx0YXR0ci5mZF9hcnJheV9jbnQgPSAxO1xuIFx0fVxuIFx0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcIl9fbG9hZGVyLnByb2dcIiwgc2l6ZW9mKFwiX19sb2FkZXIucHJvZ1wiKSk7XG4gXHRwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXHUwMDI2YXR0cixcbkBAIC0yMzYsNzkgKzIyOCw2IEBAIHN0YXRpYyBpbnQgc2lnbl9idWYoY29uc3QgY2hhciAqZGlyLCBjb25zdCB2b2lkICpidWYsIF9fdTMyIGxlbixcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGNoZWNrX3NpZ19tYXRjaF9zaGFwZShjb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluLCBpbnQgbilcbi17XG4tXHRpbnQgYSA9IC0xLCBjbGVhbnVwID0gLTEsIGksIGJhc2UsIHQsIGJyWzVdLCBuYiA9IDA7XG4tXG4tXHQvKiBCUEZfUFNFVURPX01BUF9JRFggKHRoZSBzdHJ1Y3QgYnBmX21hcCAqIGZvcm0pIGlzIHVzZWQgb25seSBoZXJlLiAqL1xuLVx0Zm9yIChpID0gMDsgaSArIDEgXHUwMDNjIG47IGkrKykge1xuLVx0XHRpZiAoaW5baV0uY29kZSA9PSAoQlBGX0xEIHwgQlBGX0lNTSB8IEJQRl9EVykgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBpbltpXS5zcmNfcmVnID09IEJQRl9QU0VVRE9fTUFQX0lEWCkge1xuLVx0XHRcdGEgPSBpO1xuLVx0XHRcdGJyZWFrO1xuLVx0XHR9XG4tXHR9XG4tXHRpZiAoIUFTU0VSVF9HRShhLCAwLCBcImVtaXRfc2lnbmF0dXJlX21hdGNoIHByZXNlbnRcIikpXG4tXHRcdHJldHVybjtcbi1cdGlmICghQVNTRVJUX0xFKGEgKyBTSUdfTUFUQ0hfSU5TTlMsIG4sIFwiYmxvY2sgZml0cyBpbiBwcm9ncmFtXCIpKVxuLVx0XHRyZXR1cm47XG4tXG4tXHQvKiBleGNsIGNoZWNrOiByMiA9ICoodTMyICopKG1hcCArIDMyKTsgaWYgcjIgIT0gMSBnb3RvIGNsZWFudXAgKi9cbi1cdEFTU0VSVF9FUShpblthICsgMl0uY29kZSwgKEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX1cpLCBcImV4Y2wgbG9hZCB3aWR0aFwiKTtcbi1cdEFTU0VSVF9FUShpblthICsgMl0ub2ZmLCBTSEEyNTZfRElHRVNUX0xFTkdUSCwgXCJleGNsIGZpZWxkIG9mZnNldFwiKTtcbi1cdEFTU0VSVF9FUShpblthICsgNF0uY29kZSwgKEJQRl9KTVAgfCBCUEZfSk5FIHwgQlBGX0spLCBcImV4Y2wgYnJhbmNoIG9wXCIpO1xuLVx0QVNTRVJUX0VRKGluW2EgKyA0XS5pbW0sIDEsIFwiZXhjbCBjb21wYXJlZCB0byAxXCIpO1xuLVx0YnJbbmIrK10gPSBhICsgNDtcbi1cbi1cdC8qIDQgc2hhLWR3b3JkIGNoZWNrczogcjIgPSAqKHU2NCAqKShtYXAgKyBpKjgpOyBpZiByMiAhPSByMyBnb3RvIGNsZWFudXAgKi9cbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIDQ7IGkrKykge1xuLVx0XHRiYXNlID0gYSArIDUgKyBpICogNztcbi1cdFx0QVNTRVJUX0VRKGluW2Jhc2UgKyAyXS5jb2RlLCAoQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfRFcpLCBcInNoYSBsb2FkIHdpZHRoXCIpO1xuLVx0XHRBU1NFUlRfRVEoaW5bYmFzZSArIDJdLm9mZiwgaSAqIDgsIFwic2hhIGR3b3JkIG9mZnNldFwiKTtcbi1cdFx0QVNTRVJUX0VRKGluW2Jhc2UgKyAzXS5jb2RlLCAoQlBGX0xEIHwgQlBGX0lNTSB8IEJQRl9EVyksIFwic2hhIGltbTY0IChIX21ldGEpXCIpO1xuLVx0XHRBU1NFUlRfRVEoaW5bYmFzZSArIDZdLmNvZGUsIChCUEZfSk1QIHwgQlBGX0pORSB8IEJQRl9YKSwgXCJzaGEgYnJhbmNoIG9wXCIpO1xuLVx0XHRicltuYisrXSA9IGJhc2UgKyA2O1xuLVx0fVxuLVxuLVx0Lypcbi1cdCAqIExvY2F0ZSB0aGUgcmVhbCBjbGVhbnVwIGxhYmVsIHNvIHdlIGNhbiBwaW4gdGhlIGV4YWN0IGp1bXAgdGFyZ2V0LFxuLVx0ICogbm90IGp1c3QgXCJzb21lIGJhY2t3YXJkIGxhYmVsXCIuIGJwZl9nZW5fX2luaXQoKSBlbWl0cyB0aGUgY2xlYW51cFxuLVx0ICogYmxvY2sgYXMgYSBwcm9nLWZkIGNsb3NlIGxvb3Agd2hvc2UgZmlyc3QgaW5zdHJ1Y3Rpb24gaXMgdGhlIGxhYmVsXG4tXHQgKiBldmVyeSBlcnJvciBicmFuY2gganVtcHMgdG8uXG4tXHQgKi9cbi1cdGZvciAoaSA9IDA7IGkgKyAyIFx1MDAzYyBhOyBpKyspIHtcbi1cdFx0aWYgKGluW2ldLmNvZGUgPT0gKEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX1cpIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgaW5baV0uZHN0X3JlZyA9PSBCUEZfUkVHXzEgXHUwMDI2XHUwMDI2IGluW2ldLnNyY19yZWcgPT0gQlBGX1JFR18xMCBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGluW2kgKyAxXS5jb2RlID09IChCUEZfSk1QIHwgQlBGX0pTTEUgfCBCUEZfSykgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBpbltpICsgMV0uZHN0X3JlZyA9PSBCUEZfUkVHXzEgXHUwMDI2XHUwMDI2IGluW2kgKyAxXS5pbW0gPT0gMCBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGluW2kgKyAxXS5vZmYgPT0gMSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGluW2kgKyAyXS5jb2RlID09IChCUEZfSk1QIHwgQlBGX0NBTEwpIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgaW5baSArIDJdLmltbSA9PSBCUEZfRlVOQ19zeXNfY2xvc2UpIHtcbi1cdFx0XHRjbGVhbnVwID0gaTtcbi1cdFx0XHRicmVhaztcbi1cdFx0fVxuLVx0fVxuLVx0aWYgKCFBU1NFUlRfR0UoY2xlYW51cCwgMCwgXCJjbGVhbnVwIGxhYmVsIGxvY2F0ZWRcIikpXG4tXHRcdHJldHVybjtcbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5iOyBpKyspIHtcbi1cdFx0dCA9IGJyW2ldICsgMSArIGluW2JyW2ldXS5vZmY7XG4tXHRcdEFTU0VSVF9FUSh0LCBjbGVhbnVwLCBcInNpZy1tYXRjaCBsYW5kcyBvbiBjbGVhbnVwXCIpO1xuLVx0fVxuLVx0Lypcbi1cdCAqIFNhbWUgaW52YXJpYW50IGZvciBldmVyeSBvdGhlciBjbGVhbnVwLWJvdW5kIGp1bXAgaW4gdGhlIHByb2dyYW06XG4tXHQgKiBlbWl0X2NoZWNrX2VycigpIGlzIHRoZSBvbmx5IHNvdXJjZSBvZiBcImlmIChyNyBcdTAwM2MgMCkgZ290byBjbGVhbnVwXCIsXG4tXHQgKiBzbyBlYWNoIG9mIHRob3NlIG11c3QgYWxzbyByZXNvbHZlIGV4YWN0bHkgdG8gY2xlYW51cC5cbi1cdCAqL1xuLVx0Zm9yIChpID0gMCwgdCA9IDA7IGkgXHUwMDNjIG47IGkrKykge1xuLVx0XHRpZiAoaW5baV0uY29kZSAhPSAoQlBGX0pNUCB8IEJQRl9KU0xUIHwgQlBGX0spIHx8XG4tXHRcdCAgICBpbltpXS5kc3RfcmVnICE9IEJQRl9SRUdfNyB8fCBpbltpXS5pbW0gIT0gMCB8fCBpbltpXS5vZmYgXHUwMDNlPSAwKVxuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHRBU1NFUlRfRVEoaSArIDEgKyBpbltpXS5vZmYsIGNsZWFudXAsIFwiZXJyLWNoZWNrIGxhbmRzIG9uIGNsZWFudXBcIik7XG4tXHRcdHQrKztcbi1cdH1cbi1cdEFTU0VSVF9HVCh0LCAwLCBcImZvdW5kIGVtaXRfY2hlY2tfZXJyIGp1bXBzXCIpO1xuLX1cbi1cbiBzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIHtcbiBcdHN0cnVjdCB0ZXN0X3NpZ25lZF9sb2FkZXIgKnNrZWw7XG4gXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9vcHRzIGdvcHRzO1xuQEAgLTM3MiwxNiArMjkxLDYgQEAgc3RhdGljIHZvaWQgZ2VuX2xvYWRlcl9maXh0dXJlX2Zpbmkoc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSAqZilcbiBcdHRlc3Rfc2lnbmVkX2xvYWRlcl9fZGVzdHJveShmLVx1MDAzZXNrZWwpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBtZXRhZGF0YV9jaGVja19zaGFwZSh2b2lkKVxuLXtcbi1cdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbi1cbi1cdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcdTAwMjZmKSA9PSAwKVxuLVx0XHRjaGVja19zaWdfbWF0Y2hfc2hhcGUoKGNvbnN0IHN0cnVjdCBicGZfaW5zbiAqKWYuZ29wdHMuaW5zbnMsXG4tXHRcdFx0XHQgICAgICBmLmdvcHRzLmluc25zX3N6IC8gc2l6ZW9mKHN0cnVjdCBicGZfaW5zbikpO1xuLVx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXHUwMDI2Zik7XG4tfVxuLVxuIHN0YXRpYyB2b2lkIG1ldGFkYXRhX21hdGNoKHZvaWQpXG4ge1xuIFx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuQEAgLTM5MSw5NCArMzAwLDI2MyBAQCBzdGF0aWMgdm9pZCBtZXRhZGF0YV9tYXRjaCh2b2lkKVxuIFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApIHtcbiBcdFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYixcbiBcdFx0XHRcdCAgIGYuZGF0YV9zeiwgZi5leGNsLCBzaXplb2YoZi5leGNsKSwgTlVMTCwgMCxcbi1cdFx0XHRcdCAgIHRydWUsIGYuY3R4LCBmLmN0eF9zeiwgXHUwMDI2cmFuKTtcbitcdFx0XHRcdCAgIGYuY3R4LCBmLmN0eF9zeiwgXHUwMDI2cmFuKTtcbiBcdFx0QVNTRVJUX1RSVUUocmFuLCBcImxvYWRlciByYW5cIik7XG4gXHRcdEFTU0VSVF9FUShyLCAwLCBcImhvbmVzdCBsb2FkZXIgcmV0dmFsXCIpO1xuIFx0fVxuIFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXHUwMDI2Zik7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIG1ldGFkYXRhX3NoYV9taXNtYXRjaCh2b2lkKVxuK3N0YXRpYyB2b2lkIHNpZ25hdHVyZV9lbmZvcmNlZCh2b2lkKVxuIHtcbitcdHN0YXRpYyBjb25zdCBfX3U4IGp1bmtbNjRdID0geyAweDMwLCAweDQyLCAweDEzLCAweDM3LCB9O1xuIFx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuLVx0Ym9vbCByYW47XG4tXHRpbnQgcjtcbitcdGludCBmZDtcbiBcbiBcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcdTAwMjZmKSA9PSAwKSB7XG4gXHRcdC8qXG4tXHRcdCAqIGJsb2JbMF0gbGl2ZXMgaW4gdGhlIGxvYWRlcidzIGZkX2FycmF5IHNjcmF0Y2ggKGZpcnN0IGFkZF9kYXRhIGluXG4tXHRcdCAqIGJwZl9nZW5fX2luaXQpOyBhIDAtbWFwIHByb2dyYW0gbmV2ZXIgcmVhZHMgaXQsIHNvIGZsaXBwaW5nIGl0XG4tXHRcdCAqIGNoYW5nZXMgb25seSBtYXAtXHUwMDNlc2hhLiBUaGUgbWV0YWRhdGEgY2hlY2sgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdFxuLVx0XHQgKiBjYW4gbm90aWNlIC1cdTAwM2UgaXNvbGF0ZXMgZW1pdF9zaWduYXR1cmVfbWF0Y2guXG4rXHRcdCAqIEEgcHJlc2VudC1idXQtaW52YWxpZCBzaWduYXR1cmUgKHRoZSBjZXJ0IGJ5dGVzIGFyZSBub3QgYVxuK1x0XHQgKiBQS0NTIzcgc2lnbmF0dXJlKSBtdXN0IGJlIHJlamVjdGVkIGF0IGxvYWQ6IHRoZSBzaWduYXR1cmVcbitcdFx0ICogcGF0aCBpcyBob25vcmVkLCBub3QgaWdub3JlZC4gKFRoZSB2YWxpZCBwYXRoIGlzIGNvdmVyZWQgYnlcbitcdFx0ICogdGhlIHNpZ25lZCBsc2tlbHMuKSBQaW4gLUVCQURNU0csIHRoZSBQS0NTIzcgcGFyc2UgZmFpbHVyZTpcbitcdFx0ICogYSBsb29zZXIgZmQgXHUwMDNjIDAgY2hlY2sgY291bGQgYWxzbyBiZSBzYXRpc2ZpZWQgYnkgdGhlIHNwYXJzZVxuK1x0XHQgKiBmZF9hcnJheSByZWplY3Rpb24gKC1FQUNDRVMpIHRoYXQgdGhlIGxvYWRlcidzIG1hcCByZWZlcmVuY2VcbitcdFx0ICogd291bGQgdHJpcCBldmVuIGlmIHRoZSBzaWduYXR1cmUgd2VyZSBzaWxlbnRseSBpZ25vcmVkLlxuIFx0XHQgKi9cbi1cdFx0Zi5ibG9iWzBdIF49IDB4ZmY7XG4tXHRcdHIgPSBydW5fZ2VuX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsXG4tXHRcdFx0XHQgICBmLmRhdGFfc3osIGYuZXhjbCwgc2l6ZW9mKGYuZXhjbCksIE5VTEwsIDAsXG4tXHRcdFx0XHQgICB0cnVlLCBmLmN0eCwgZi5jdHhfc3osIFx1MDAyNnJhbik7XG4tXHRcdEFTU0VSVF9UUlVFKHJhbiwgXCJsb2FkZXIgcmFuXCIpO1xuLVx0XHRBU1NFUlRfRVEociwgLUVJTlZBTCwgXCJ0YW1wZXJlZCBibG9iIHJlamVjdGVkIGJ5IGVtaXRfc2lnbmF0dXJlX21hdGNoXCIpO1xuK1x0XHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLFxuK1x0XHRcdFx0IHNpemVvZihqdW5rKSwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAwKTtcbitcdFx0QVNTRVJUX0VRKGZkLCAtRUJBRE1TRywgXCJpbnZhbGlkIHNpZ25hdHVyZSByZWplY3RlZCBhdCBsb2FkXCIpO1xuIFx0fVxuIFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXHUwMDI2Zik7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIG1ldGFkYXRhX25vdF9leGNsdXNpdmUodm9pZClcbitzdGF0aWMgdm9pZCBzaWduZWRfbm9uZXhjbF9mZF9hcnJheV9yZWplY3RlZCh2b2lkKVxuIHtcbitcdHN0YXRpYyBjb25zdCBfX3U4IGp1bmtbNjRdID0geyAweDMwLCAweDQyLCAweDEzLCAweDM3LCB9O1xuIFx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuLVx0Ym9vbCByYW47XG4tXHRpbnQgcjtcbitcdGludCBtYXBfZmQsIGZkO1xuIFxuIFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApIHtcbiBcdFx0Lypcbi1cdFx0ICogQ29ycmVjdCBibG9iIGJ1dCBhIG5vbi1leGNsdXNpdmUgbWV0YWRhdGEgbWFwOiB0aGUgdmVyaWZpZXIgZG9lc1xuLVx0XHQgKiBub3QgcmVqZWN0IChleGNsX3Byb2dfc2hhIHVuc2V0KSwgc28gdGhlIHJ1bnRpbWUgbWFwLVx1MDAzZWV4Y2wgPT0gMVxuLVx0XHQgKiBjaGVjayBpbiB0aGUgbG9hZGVyIG11c3QuXG4rXHRcdCAqIEEgc2lnbmVkIHByb2dyYW0gbWF5IG9ubHkgYmluZCBleGNsdXNpdmUgbWFwcyB0aHJvdWdoIGZkX2FycmF5XG4rXHRcdCAqICh0aGVpciBjb250ZW50cyBhcmUgZm9sZGVkIGludG8gdGhlIHNpZ25hdHVyZSkuIEJpbmRpbmcgYVxuK1x0XHQgKiBub24tZXhjbHVzaXZlIG1hcCBpcyByZWplY3RlZCwgYmVmb3JlIHRoZSBzaWduYXR1cmUgaXMgZXZlblxuK1x0XHQgKiBleGFtaW5lZC5cbiBcdFx0ICovXG4tXHRcdHIgPSBydW5fZ2VuX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsXG4tXHRcdFx0XHQgICBmLmRhdGFfc3osIE5VTEwsIDAsIE5VTEwsIDAsIHRydWUsIGYuY3R4LFxuLVx0XHRcdFx0ICAgZi5jdHhfc3osIFx1MDAyNnJhbik7XG4tXHRcdEFTU0VSVF9UUlVFKHJhbiwgXCJsb2FkZXIgcmFuXCIpO1xuLVx0XHRBU1NFUlRfRVEociwgLUVJTlZBTCwgXCJub24tZXhjbHVzaXZlIG1ldGFkYXRhIG1hcCByZWplY3RlZFwiKTtcbitcdFx0bWFwX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZLCBcIm5vbmV4Y2xcIiwgNCxcbitcdFx0XHRcdFx0Zi5kYXRhX3N6LCAxLCBOVUxMKTtcbitcdFx0aWYgKEFTU0VSVF9PS19GRChtYXBfZmQsIFwibm9uZXhjbF9tYXBcIikpIHtcbitcdFx0XHRpZiAoQVNTRVJUX09LKGJwZl9tYXBfZnJlZXplKG1hcF9mZCksIFwiZnJlZXplXCIpKSB7XG4rXHRcdFx0XHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osXG4rXHRcdFx0XHRcdFx0IG1hcF9mZCwganVuaywgc2l6ZW9mKGp1bmspLFxuK1x0XHRcdFx0XHRcdCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDEpO1xuK1x0XHRcdFx0QVNTRVJUX0VRKGZkLCAtRVBFUk0sXG4rXHRcdFx0XHRcdCAgXCJub24tZXhjbHVzaXZlIG1hcCBpbiBzaWduZWQgZmRfYXJyYXkgcmVqZWN0ZWRcIik7XG4rXHRcdFx0XHRpZiAoZmQgXHUwMDNlPSAwKVxuK1x0XHRcdFx0XHRjbG9zZShmZCk7XG4rXHRcdFx0fVxuK1x0XHRcdGNsb3NlKG1hcF9mZCk7XG4rXHRcdH1cbiBcdH1cbiBcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBtZXRhZGF0YV9oYXNoX25vdF9jb21wdXRlZCh2b2lkKVxuK3N0YXRpYyB2b2lkIHNpZ25lZF91bmZyb3plbl9mZF9hcnJheV9yZWplY3RlZCh2b2lkKVxuIHtcbitcdHN0YXRpYyBjb25zdCBfX3U4IGp1bmtbNjRdID0geyAweDMwLCAweDQyLCAweDEzLCAweDM3LCB9O1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgbW9wdHMpO1xuIFx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuLVx0Ym9vbCByYW47XG4tXHRpbnQgcjtcbitcdF9fdTMyIGtleSA9IDA7XG4rXHRpbnQgbWFwX2ZkLCBmZDtcbiBcbiBcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcdTAwMjZmKSA9PSAwKSB7XG4gXHRcdC8qXG4tXHRcdCAqIENvcnJlY3QsIGV4Y2x1c2l2ZSwgZnJvemVuIG1hcCwgYnV0IGl0cyBoYXNoIHdhcyBuZXZlciBjb21wdXRlZFxuLVx0XHQgKiAobm8gT0JKX0dFVF9JTkZPX0JZX0ZEKSwgc28gbWFwLVx1MDAzZXNoYSBzdGF5cyB6ZXJvLiBUaGUgbG9hZGVyIG11c3Rcbi1cdFx0ICogZmFpbCBjbG9zZWQgcmF0aGVyIHRoYW4gdHJlYXQgYW4gdW5zZXQgaGFzaCBhcyBhIG1hdGNoLlxuK1x0XHQgKiBUaGUgbWV0YWRhdGEgbWFwIG11c3QgYmUgZnJvemVuIGJlZm9yZSBhIHNpZ25lZCBsb2FkIHNvIHRoZVxuK1x0XHQgKiBmb2xkZWQgYnl0ZXMgY2Fubm90IGNoYW5nZSBhZnRlcndhcmRzLiBCaW5kIGFuIGV4Y2x1c2l2ZSBtYXBcbitcdFx0ICogd2l0aCBtYXRjaGluZyBjb250ZW50cyBidXQgc2tpcCB0aGUgZnJlZXplOiB0aGUgbG9hZCBtdXN0IGJlXG4rXHRcdCAqIHJlamVjdGVkIGJ5IHRoZSBmcm96ZW4gY2hlY2sgd2l0aCAtRVBFUk0uIFRoZSBleGNsdXNpdml0eVxuK1x0XHQgKiBjaGVjayByaWdodCBhZnRlciBpdCB3b3VsZCBwYXNzLCBzbyB0aGUgZXJybm8gdW5pcXVlbHkgcGluc1xuK1x0XHQgKiB0aGUgZnJlZXplIHJlcXVpcmVtZW50LlxuIFx0XHQgKi9cbi1cdFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYixcbi1cdFx0XHRcdCAgIGYuZGF0YV9zeiwgZi5leGNsLCBzaXplb2YoZi5leGNsKSwgTlVMTCwgMCxcbi1cdFx0XHRcdCAgIGZhbHNlLCBmLmN0eCwgZi5jdHhfc3osIFx1MDAyNnJhbik7XG4tXHRcdEFTU0VSVF9UUlVFKHJhbiwgXCJsb2FkZXIgcmFuXCIpO1xuLVx0XHRBU1NFUlRfRVEociwgLUVJTlZBTCwgXCJ1bmNvbXB1dGVkIG1ldGFkYXRhIGhhc2ggcmVqZWN0ZWRcIik7XG4rXHRcdG1vcHRzLmV4Y2xfcHJvZ19oYXNoID0gZi5leGNsO1xuK1x0XHRtb3B0cy5leGNsX3Byb2dfaGFzaF9zaXplID0gc2l6ZW9mKGYuZXhjbCk7XG4rXHRcdG1hcF9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWSwgXCJ1bmZyb3plblwiLCA0LFxuK1x0XHRcdFx0XHRmLmRhdGFfc3osIDEsIFx1MDAyNm1vcHRzKTtcbitcdFx0aWYgKEFTU0VSVF9PS19GRChtYXBfZmQsIFwidW5mcm96ZW5fbWFwXCIpKSB7XG4rXHRcdFx0aWYgKEFTU0VSVF9PSyhicGZfbWFwX3VwZGF0ZV9lbGVtKG1hcF9mZCwgXHUwMDI2a2V5LCBmLmJsb2IsIDApLFxuK1x0XHRcdFx0ICAgICAgXCJ1cGRhdGVcIikpIHtcbitcdFx0XHRcdGZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeixcbitcdFx0XHRcdFx0XHQgbWFwX2ZkLCBqdW5rLCBzaXplb2YoanVuayksXG4rXHRcdFx0XHRcdFx0IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7XG4rXHRcdFx0XHRBU1NFUlRfRVEoZmQsIC1FUEVSTSxcbitcdFx0XHRcdFx0ICBcInVuZnJvemVuIG1hcCBpbiBzaWduZWQgZmRfYXJyYXkgcmVqZWN0ZWRcIik7XG4rXHRcdFx0XHRpZiAoZmQgXHUwMDNlPSAwKVxuK1x0XHRcdFx0XHRjbG9zZShmZCk7XG4rXHRcdFx0fVxuK1x0XHRcdGNsb3NlKG1hcF9mZCk7XG4rXHRcdH1cbiBcdH1cbiBcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBzaWduYXR1cmVfZW5mb3JjZWQodm9pZClcbitzdGF0aWMgdm9pZCBzaWduZWRfbm9uYXJyYXlfZmRfYXJyYXlfcmVqZWN0ZWQodm9pZClcbiB7XG4gXHRzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHsgMHgzMCwgMHg0MiwgMHgxMywgMHgzNywgfTtcbitcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG1vcHRzKTtcbiBcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbitcdGludCBtYXBfZmQsIGZkO1xuK1xuK1x0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApIHtcbitcdFx0LypcbitcdFx0ICogT25seSBhIHBsYWluIEJQRl9NQVBfVFlQRV9BUlJBWSBtYXkgYmUgZm9sZGVkIGludG8gdGhlXG4rXHRcdCAqIHNpZ25hdHVyZS4gQW4gZXhjbHVzaXZlIG1hcCBvZiBhbnkgb3RoZXIgdHlwZSBpcyByZWplY3RlZFxuK1x0XHQgKiAoLUVJTlZBTCkgcmF0aGVyIHRoYW4gZm9sZGVkIC0gdGhpcyBpcyB0aGUgdHlwZSBnYXRlIHRoYXRcbitcdFx0ICoga2VlcHMgYXJlbmEgbWFwcyAobWFwX2RpcmVjdF92YWx1ZV9hZGRyKCkgcmV0dXJucyBhIHVzZXJcbitcdFx0ICogYWRkcmVzcykgYW5kIGluc24tYXJyYXkgbWFwcyAoYnVmZmVyIHNtYWxsZXIgdGhhbiB2YWx1ZV9zaXplKVxuK1x0XHQgKiBvdXQgb2YgdGhlIGhhc2hlZCByZWdpb24sIHdoZXJlIHRoZSBvbGQgY29kZSB3b3VsZCBoYXZlXG4rXHRcdCAqIG1lbWNweSgpJ2QgZnJvbSB0aGVtLiBBIGhhc2ggbWFwIHN0YW5kcyBpbiBoZXJlOiBpdCBpc1xuK1x0XHQgKiBleGNsdXNpdmUgKGJvdW5kIHRvIHRoZSBsb2FkZXIgZGlnZXN0KSBidXQgbm90IGFuIGFycmF5LlxuK1x0XHQgKi9cbitcdFx0bW9wdHMuZXhjbF9wcm9nX2hhc2ggPSBmLmV4Y2w7XG4rXHRcdG1vcHRzLmV4Y2xfcHJvZ19oYXNoX3NpemUgPSBzaXplb2YoZi5leGNsKTtcbitcdFx0bWFwX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0hBU0gsIFwiZXhjbF9oYXNoXCIsIDQsIDQsIDEsXG4rXHRcdFx0XHRcdFx1MDAyNm1vcHRzKTtcbitcdFx0aWYgKEFTU0VSVF9PS19GRChtYXBfZmQsIFwiZXhjbF9oYXNoX21hcFwiKSkge1xuK1x0XHRcdGZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgbWFwX2ZkLFxuK1x0XHRcdFx0XHQganVuaywgc2l6ZW9mKGp1bmspLFxuK1x0XHRcdFx0XHQgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAxKTtcbitcdFx0XHRBU1NFUlRfRVEoZmQsIC1FSU5WQUwsXG4rXHRcdFx0XHQgIFwibm9uLWFycmF5IG1hcCBpbiBzaWduZWQgZmRfYXJyYXkgcmVqZWN0ZWRcIik7XG4rXHRcdFx0aWYgKGZkIFx1MDAzZT0gMClcbitcdFx0XHRcdGNsb3NlKGZkKTtcbitcdFx0XHRjbG9zZShtYXBfZmQpO1xuK1x0XHR9XG4rXHR9XG4rXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbit9XG4rXG4rc3RhdGljIGludCBzZXR1cF9tZXRhX21hcChjb25zdCBzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlICpmKTtcbitcbitzdGF0aWMgdm9pZCBzaWduZWRfYnRmX2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpXG4re1xuK1x0Y2hhciBkaXJfdG1wbFtdID0gXCIvdG1wL3NpZ25lZF9sb2FkZXJfYnRmWFhYWFhYXCIsICpkaXIgPSBOVUxMO1xuK1x0X191MzIgc2lnX3N6ID0gODE5MjtcbitcdGludCBtYXBfZmQgPSAtMSwgcHJvZ19mZCA9IC0xO1xuK1x0dW5zaWduZWQgY2hhciAqYnVmID0gTlVMTDtcbitcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbitcdGJvb2wgaGF2ZV9maXh0dXJlID0gZmFsc2U7XG4rXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuK1x0dW5pb24gYnBmX2F0dHIgYXR0cjtcbitcdGludCBmZHNbMl07XG4rXHRfX3U4IHNpZ1s4MTkyXTtcbitcbitcdHN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgXCJrZXlyaW5nXCIsIFwiX3VpZC4wXCIsIE5VTEwsXG4rXHRcdEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4rXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwibWtkdGVtcFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXBcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4rXHRcdHJtZGlyKGRpcik7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGhhdmVfZml4dHVyZSA9IHRydWU7XG4rXHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXHUwMDI2ZikgIT0gMClcbitcdFx0Z290byBvdXQ7XG4rXG4rXHQvKlxuK1x0ICogZmRfYXJyYXkgYmluZHMgbWFwcyBhbmQgQlRGcyBhbGlrZSwgYnV0IG9ubHkgZXhjbHVzaXZlIGFycmF5IG1hcHMgYXJlXG4rXHQgKiBmb2xkZWQgaW50byB0aGUgc2lnbmF0dXJlLiBCdWlsZCBhbiBvdGhlcndpc2UgZ2VudWluZWx5IHNpZ25lZCBsb2FkIC1cbitcdCAqIGluc25zIHx8IG1ldGFkYXRhLCBleGNsdXNpdmUgZnJvemVuIG1hcCBhdCBmZF9hcnJheVswXSAtIHRoZW4gc211Z2dsZVxuK1x0ICogYW4gZXh0cmEgQlRGIGludG8gZmRfYXJyYXlbMV0uIEEgc2lnbmVkIHByb2dyYW0gbWF5IG5vdCBiaW5kIGFueSBCVEYsXG4rXHQgKiBzbyByZXNvbHZpbmcgdGhlIGZkX2FycmF5IGVudHJpZXMgcmVqZWN0cyB0aGUgQlRGIHdpdGggLUVBQ0NFUyAoaW5cbitcdCAqIF9fYWRkX3VzZWRfYnRmKCksIGJlZm9yZSB0aGUgc2lnbmF0dXJlIGlzIGV2ZW4gdmVyaWZpZWQpLlxuK1x0ICovXG4rXHRidWYgPSBtYWxsb2MoKHNpemVfdClmLmdvcHRzLmluc25zX3N6ICsgZi5kYXRhX3N6KTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidWYsIFwic2lnbmJ1ZlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRtZW1jcHkoYnVmLCBmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6KTtcbitcdG1lbWNweShidWYgKyBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsIGYuZGF0YV9zeik7XG4rXHRpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGJ1ZiwgZi5nb3B0cy5pbnNuc19zeiArIGYuZGF0YV9zeiwgc2lnLFxuK1x0XHRcdCAgICAgICBcdTAwMjZzaWdfc3opLCBcInNpZ24gaW5zbnN8fG1ldGFkYXRhXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdG1hcF9mZCA9IHNldHVwX21ldGFfbWFwKFx1MDAyNmYpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQobWFwX2ZkLCBcIm1ldGFfbWFwXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcImJ0Zl9uZXdfZW1wdHlcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0YnRmX19hZGRfaW50KGJ0ZiwgXCJpbnRcIiwgNCwgQlRGX0lOVF9TSUdORUQpO1xuK1x0aWYgKCFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksIFwiYnRmX2xvYWRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZmRzWzBdID0gbWFwX2ZkO1xuK1x0ZmRzWzFdID0gYnRmX19mZChidGYpO1xuK1x0bWVtc2V0KFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XG4rXHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbitcdGF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGYuZ29wdHMuaW5zbnMpO1xuK1x0YXR0ci5pbnNuX2NudCA9IGYuZ29wdHMuaW5zbnNfc3ogLyBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKTtcbitcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXCJEdWFsIEJTRC9HUExcIik7XG4rXHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XG4rXHRhdHRyLmZkX2FycmF5ID0gcHRyX3RvX3U2NChmZHMpO1xuK1x0YXR0ci5mZF9hcnJheV9jbnQgPSAyO1xuK1x0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XG4rXHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6O1xuK1x0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xuK1x0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcIl9fbG9hZGVyLnByb2dcIiwgc2l6ZW9mKFwiX19sb2FkZXIucHJvZ1wiKSk7XG4rXHRwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXHUwMDI2YXR0cixcbitcdFx0XHQgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XG4rXHRBU1NFUlRfRVEocHJvZ19mZCBcdTAwM2MgMCA/IC1lcnJubyA6IHByb2dfZmQsIC1FQUNDRVMsXG4rXHRcdCAgXCJCVEYgaW4gc2lnbmVkIGZkX2FycmF5IHJlamVjdGVkXCIpO1xuK1x0aWYgKHByb2dfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShwcm9nX2ZkKTtcbitvdXQ6XG4rXHRpZiAoYnRmKVxuK1x0XHRidGZfX2ZyZWUoYnRmKTtcbitcdGlmIChtYXBfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShtYXBfZmQpO1xuK1x0aWYgKGhhdmVfZml4dHVyZSlcbitcdFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXHUwMDI2Zik7XG4rXHRpZiAoZGlyKVxuK1x0XHRydW5fc2V0dXAoXCJjbGVhbnVwXCIsIGRpcik7XG4rXHRmcmVlKGJ1Zik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHNpZ25hdHVyZV9mYWlsdXJlX2xvZ3Modm9pZClcbit7XG4rXHRzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHsgMHgzMCwgMHg0MiwgMHgxMywgMHgzNywgfTtcbitcdGNoYXIgbG9nX2J1ZlsxMDI0XSA9IHt9O1xuK1x0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuK1x0dW5pb24gYnBmX2F0dHIgYXR0cjtcbiBcdGludCBmZDtcbiBcbiBcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcdTAwMjZmKSA9PSAwKSB7XG4gXHRcdC8qXG4tXHRcdCAqIEEgcHJlc2VudC1idXQtaW52YWxpZCBzaWduYXR1cmUgKHRoZSBjZXJ0IGJ5dGVzIGFyZSBub3QgYVxuLVx0XHQgKiBQS0NTIzcgc2lnbmF0dXJlKSBtdXN0IGJlIHJlamVjdGVkIGF0IGxvYWQ6IHRoZSBzaWduYXR1cmVcbi1cdFx0ICogcGF0aCBpcyBob25vcmVkLCBub3QgaWdub3JlZC4gKFRoZSB2YWxpZCBwYXRoIGlzIGNvdmVyZWQgYnlcbi1cdFx0ICogdGhlIHNpZ25lZCBsc2tlbHMuKVxuK1x0XHQgKiBTaWduYXR1cmUgdmVyaWZpY2F0aW9uIG5vdyBydW5zIGluc2lkZSBicGZfY2hlY2soKSwgc28gYVxuK1x0XHQgKiBmYWlsdXJlIGlzIHJlcG9ydGVkIHRocm91Z2ggdGhlIHZlcmlmaWVyIGxvZy4gQSBwcmVzZW50LWJ1dC1cbitcdFx0ICogaW52YWxpZCBzaWduYXR1cmUgaXMgcmVqZWN0ZWQgYW5kIHRoZSBsb2cgc2F5cyB3aHkuXG4gXHRcdCAqL1xuLVx0XHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLFxuLVx0XHRcdFx0IHNpemVvZihqdW5rKSwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcbitcdFx0bWVtc2V0KFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XG4rXHRcdGF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMO1xuK1x0XHRhdHRyLmluc25zID0gcHRyX3RvX3U2NChmLmdvcHRzLmluc25zKTtcbitcdFx0YXR0ci5pbnNuX2NudCA9IGYuZ29wdHMuaW5zbnNfc3ogLyBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKTtcbitcdFx0YXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NChcIkR1YWwgQlNEL0dQTFwiKTtcbitcdFx0YXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFO1xuK1x0XHRhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoanVuayk7XG4rXHRcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaXplb2YoanVuayk7XG4rXHRcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcbitcdFx0YXR0ci5sb2dfbGV2ZWwgPSAxO1xuK1x0XHRhdHRyLmxvZ19idWYgPSBwdHJfdG9fdTY0KGxvZ19idWYpO1xuK1x0XHRhdHRyLmxvZ19zaXplID0gc2l6ZW9mKGxvZ19idWYpO1xuK1x0XHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFwiX19sb2FkZXIucHJvZ1wiLCBzaXplb2YoXCJfX2xvYWRlci5wcm9nXCIpKTtcbitcbitcdFx0ZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcdTAwMjZhdHRyLFxuK1x0XHRcdCAgICAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcbiBcdFx0QVNTRVJUX0xUKGZkLCAwLCBcImludmFsaWQgc2lnbmF0dXJlIHJlamVjdGVkIGF0IGxvYWRcIik7XG4rXHRcdGlmIChmZCBcdTAwM2U9IDApXG4rXHRcdFx0Y2xvc2UoZmQpO1xuK1x0XHRBU1NFUlRfSEFTX1NVQlNUUihsb2dfYnVmLCBcInNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkXCIsXG4rXHRcdFx0XHQgIFwidmVyaWZpZXIgbG9ncyBzaWduYXR1cmUgZmFpbHVyZVwiKTtcbiBcdH1cbiBcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuIH1cbkBAIC00OTUsNyArNTczLDcgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX3Rvb19sYXJnZSh2b2lkKVxuIFx0XHQgKiBpcyByZWplY3RlZCBiZWZvcmUgdGhlIGJ1ZmZlciBpcyByZWFkLlxuIFx0XHQgKi9cbiBcdFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuayxcbi1cdFx0XHRcdCA2NCBcdTAwM2NcdTAwM2MgMjAsIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4rXHRcdFx0XHQgNjQgXHUwMDNjXHUwMDNjIDIwLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDApO1xuIFx0XHRBU1NFUlRfRVEoZmQsIC1FSU5WQUwsIFwib3ZlcnNpemVkIHNpZ25hdHVyZSByZWplY3RlZFwiKTtcbiBcdH1cbiBcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuQEAgLTUxNSw3ICs1OTMsNyBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfYmFkX2tleXJpbmcodm9pZClcbiBcdFx0ICogbGFyZ2UgcG9zaXRpdmUgc2VyaWFsIHRha2VzIHRoZSB1c2VyLWtleXJpbmcgcGF0aCBhbmQgd29uJ3QgZXhpc3QuXG4gXHRcdCAqL1xuIFx0XHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLFxuLVx0XHRcdFx0IHNpemVvZihqdW5rKSwgSU5UX01BWCk7XG4rXHRcdFx0XHQgc2l6ZW9mKGp1bmspLCBJTlRfTUFYLCAwKTtcbiBcdFx0QVNTRVJUX0VRKGZkLCAtRUlOVkFMLCBcInNpZ25hdHVyZSB3aXRoIGJhZCBrZXlyaW5nX2lkIHJlamVjdGVkXCIpO1xuIFx0fVxuIFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXHUwMDI2Zik7XG5AQCAtNTc1LDcgKzY1Myw3IEBAIHN0YXRpYyB2b2lkIG1ldGFkYXRhX2N0eF9tYXhfZW50cmllc19pZ25vcmVkKHZvaWQpXG4gXHRtZW1jcHkoYmxvYiwgZ29wdHMuZGF0YSwgZGF0YV9zeik7XG4gXG4gXHRyID0gcnVuX2dlbl9sb2FkZXIoZ29wdHMuaW5zbnMsIGdvcHRzLmluc25zX3N6LCBibG9iLCBkYXRhX3N6LFxuLVx0XHRcdCAgIGV4Y2wsIHNpemVvZihleGNsKSwgTlVMTCwgMCwgdHJ1ZSwgY3R4LCBjdHhfc3osIFx1MDAyNnJhbik7XG4rXHRcdFx0ICAgZXhjbCwgc2l6ZW9mKGV4Y2wpLCBOVUxMLCAwLCBjdHgsIGN0eF9zeiwgXHUwMDI2cmFuKTtcbiBcdGlmICghQVNTRVJUX1RSVUUocmFuLCBcImxvYWRlciByYW5cIikgfHxcbiBcdCAgICAhQVNTRVJUX0VRKHIsIDAsIFwibG9hZGVyIHJldHZhbFwiKSlcbiBcdFx0Z290byBmcmVlX2Jsb2I7XG5AQCAtNjYxLDcgKzczOSw3IEBAIHN0YXRpYyB2b2lkIG1ldGFkYXRhX2N0eF9pbml0aWFsX3ZhbHVlX2lnbm9yZWQodm9pZClcbiBcdG1lbWNweShibG9iLCBnb3B0cy5kYXRhLCBkYXRhX3N6KTtcbiBcbiBcdHIgPSBydW5fZ2VuX2xvYWRlcihnb3B0cy5pbnNucywgZ29wdHMuaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osXG4tXHRcdFx0ICAgZXhjbCwgc2l6ZW9mKGV4Y2wpLCBOVUxMLCAwLCB0cnVlLCBjdHgsIGN0eF9zeiwgXHUwMDI2cmFuKTtcbitcdFx0XHQgICBleGNsLCBzaXplb2YoZXhjbCksIE5VTEwsIDAsIGN0eCwgY3R4X3N6LCBcdTAwMjZyYW4pO1xuIFx0aWYgKCFBU1NFUlRfVFJVRShyYW4sIFwibG9hZGVyIHJhblwiKSB8fFxuIFx0ICAgICFBU1NFUlRfRVEociwgMCwgXCJsb2FkZXIgcmV0dmFsXCIpKVxuIFx0XHRnb3RvIGZyZWVfYmxvYjtcbkBAIC03MTQsNiArNzkyLDcgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX2F1dGhlbnRpY2F0ZXNfaW5zbnModm9pZClcbiBcdF9fdTggZXhjbFtTSEEyNTZfRElHRVNUX0xFTkdUSF0sIHNpZ1s4MTkyXTtcbiBcdF9fdTMyIHNpZ19zeiA9IHNpemVvZihzaWcpLCBpbnNuc19zeiwgZGF0YV9zeiwgY3R4X3N6O1xuIFx0dW5zaWduZWQgY2hhciAqaW5zbnMgPSBOVUxMLCAqdGFtcGVyZWQgPSBOVUxMLCAqYmxvYiA9IE5VTEw7XG4rXHR1bnNpZ25lZCBjaGFyICpzaWduYnVmID0gTlVMTDtcbiBcdGludCBucl9tYXBzID0gMCwgbnJfcHJvZ3MgPSAwLCByO1xuIFx0c3RydWN0IGJwZl9wcm9ncmFtICpwO1xuIFx0c3RydWN0IGJwZl9tYXAgKm07XG5AQCAtNzYwLDI5ICs4MzksMTQxIEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX2luc25zKHZvaWQpXG4gXHRtZW1jcHkoYmxvYiwgZ29wdHMuZGF0YSwgZGF0YV9zeik7XG4gXHRsaWJicGZfc2hhMjU2KGluc25zLCBpbnNuc19zeiwgZXhjbCk7XG4gXG4tXHRpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGluc25zLCBpbnNuc19zeiwgc2lnLCBcdTAwMjZzaWdfc3opLCBcInNpZ24tZmlsZVwiKSlcbitcdHNpZ25idWYgPSBtYWxsb2MoKHNpemVfdClpbnNuc19zeiArIGRhdGFfc3opO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNpZ25idWYsIFwic2lnbmJ1ZlwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0bWVtY3B5KHNpZ25idWYsIGluc25zLCBpbnNuc19zeik7XG4rXHRtZW1jcHkoc2lnbmJ1ZiArIGluc25zX3N6LCBibG9iLCBkYXRhX3N6KTtcbitcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgc2lnbmJ1ZiwgaW5zbnNfc3ogKyBkYXRhX3N6LCBzaWcsIFx1MDAyNnNpZ19zeiksXG4rXHRcdCAgICAgICBcInNpZ24tZmlsZVwiKSlcbiBcdFx0Z290byBjbGVhbnVwO1xuIFxuIFx0bWVtc2V0KGN0eCwgMCwgY3R4X3N6KTtcbiBcdCgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS1cdTAwM2VzeiA9IGN0eF9zejtcbiBcdHIgPSBydW5fZ2VuX2xvYWRlcihpbnNucywgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osIGV4Y2wsIHNpemVvZihleGNsKSxcbi1cdFx0XHQgICBzaWcsIHNpZ19zeiwgdHJ1ZSwgY3R4LCBjdHhfc3osIFx1MDAyNnJhbik7XG4rXHRcdFx0ICAgc2lnLCBzaWdfc3osIGN0eCwgY3R4X3N6LCBcdTAwMjZyYW4pO1xuIFx0QVNTRVJUX1RSVUUocmFuLCBcInZhbGlkIHNpZ25hdHVyZTogbG9hZGVyIGxvYWRlZCBhbmQgcmFuXCIpO1xuIFx0QVNTRVJUX0VRKHIsIDAsIFwidmFsaWQgc2lnbmF0dXJlIGFjY2VwdGVkXCIpO1xuIFx0Y2xvc2VfbG9hZGVyX2N0eF9mZHMoY3R4LCBucl9tYXBzLCBucl9wcm9ncyk7XG4gXG4gXHRtZW1jcHkodGFtcGVyZWQsIGluc25zLCBpbnNuc19zeik7XG4gXHR0YW1wZXJlZFtpbnNuc19zeiAvIDJdIF49IDB4ZmY7XG4rXHQvKlxuK1x0ICogQmluZCB0aGUgbWV0YWRhdGEgbWFwIHRvIHRoZSB0YW1wZXJlZCBsb2FkZXIncyBvd24gZGlnZXN0LCBzbyB0aGVcbitcdCAqIHZlcmlmaWVyJ3MgZXhjbHVzaXZlLW1hcCBjaGVjayAoZXhjbF9wcm9nX3NoYSA9PSBwcm9nLVx1MDAzZWRpZ2VzdCkgcGFzc2VzXG4rXHQgKiBhbmQgdGhlIHNpZ25hdHVyZSAtIHZlcmlmaWVkIGFmdGVyIHRoZSBtYXBzIGFyZSByZXNvbHZlZCAtIGlzIHdoYXRcbitcdCAqIHJlamVjdHMgdGhlIGxvYWQuIFRoaXMgaXMgdGhlIGF0dGFja2VyJ3MgYmVzdCBjYXNlOiBldmVuIGFmdGVyXG4rXHQgKiByZS1iaW5kaW5nIHRoZSBleGNsdXNpdmUgbWFwIHRvIHRoZWlyIHRhbXBlcmVkIGxvYWRlciwgdGhlIHNpZ25hdHVyZVxuK1x0ICogb3ZlciB0aGUgb3JpZ2luYWwgaW5zbnMgfHwgbWV0YWRhdGEgc3RpbGwgZmFpbHMuIChMZWF2aW5nIHRoZSBtYXBcbitcdCAqIGJvdW5kIHRvIHRoZSBvcmlnaW5hbCBkaWdlc3Qgd291bGQgaW5zdGVhZCB0cmlwIHRoZSBleGNsIGNoZWNrIGZpcnN0LilcbitcdCAqL1xuK1x0bGliYnBmX3NoYTI1Nih0YW1wZXJlZCwgaW5zbnNfc3osIGV4Y2wpO1xuIFx0bWVtc2V0KGN0eCwgMCwgY3R4X3N6KTtcbiBcdCgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS1cdTAwM2VzeiA9IGN0eF9zejtcbiBcdHIgPSBydW5fZ2VuX2xvYWRlcih0YW1wZXJlZCwgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osIGV4Y2wsIHNpemVvZihleGNsKSxcbi1cdFx0XHQgICBzaWcsIHNpZ19zeiwgdHJ1ZSwgY3R4LCBjdHhfc3osIFx1MDAyNnJhbik7XG4rXHRcdFx0ICAgc2lnLCBzaWdfc3osIGN0eCwgY3R4X3N6LCBcdTAwMjZyYW4pO1xuIFx0QVNTRVJUX0ZBTFNFKHJhbiwgXCJ0YW1wZXJlZCBsb2FkZXIgcmVqZWN0ZWQgYmVmb3JlIHJ1blwiKTtcbiBcdEFTU0VSVF9FUShyLCAtRUtFWVJFSkVDVEVELCBcInNpZ25hdHVyZSBpcyBib3VuZCB0byB0aGUgaW5zdHJ1Y3Rpb25zXCIpO1xuIGNsZWFudXA6XG4gXHRmcmVlKGluc25zKTtcbiBcdGZyZWUodGFtcGVyZWQpO1xuIFx0ZnJlZShibG9iKTtcbitcdGZyZWUoc2lnbmJ1Zik7XG4rXHRmcmVlKGN0eCk7XG4rXHR0ZXN0X3NpZ25lZF9sb2FkZXJfX2Rlc3Ryb3koc2tlbCk7XG4rXHRydW5fc2V0dXAoXCJjbGVhbnVwXCIsIGRpcik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX21ldGFkYXRhKHZvaWQpXG4re1xuK1x0TElCQlBGX09QVFMoZ2VuX2xvYWRlcl9vcHRzLCBnb3B0cywgLmdlbl9oYXNoID0gdHJ1ZSk7XG4rXHRjaGFyIGRpcl90bXBsW10gPSBcIi90bXAvc2lnbmVkX2xvYWRlclhYWFhYWFwiLCAqZGlyO1xuK1x0c3RydWN0IHRlc3Rfc2lnbmVkX2xvYWRlciAqc2tlbCA9IE5VTEw7XG4rXHRfX3U4IGV4Y2xbU0hBMjU2X0RJR0VTVF9MRU5HVEhdLCBzaWdbODE5Ml07XG4rXHRfX3UzMiBzaWdfc3ogPSBzaXplb2Yoc2lnKSwgaW5zbnNfc3osIGRhdGFfc3osIGN0eF9zejtcbitcdHVuc2lnbmVkIGNoYXIgKmluc25zID0gTlVMTCwgKmJsb2IgPSBOVUxMO1xuK1x0dW5zaWduZWQgY2hhciAqc2lnbmJ1ZiA9IE5VTEw7XG4rXHRpbnQgbnJfbWFwcyA9IDAsIG5yX3Byb2dzID0gMCwgcjtcbitcdHN0cnVjdCBicGZfcHJvZ3JhbSAqcDtcbitcdHN0cnVjdCBicGZfbWFwICptO1xuK1x0dm9pZCAqY3R4ID0gTlVMTDtcbitcdGJvb2wgcmFuO1xuK1xuK1x0c3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCBcImtleXJpbmdcIiwgXCJfdWlkLjBcIiwgTlVMTCxcbitcdFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcbitcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCJta2R0ZW1wXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cFwiLCBkaXIpLCBcInZlcmlmeV9zaWdfc2V0dXBcIikpIHtcbitcdFx0cm1kaXIoZGlyKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0c2tlbCA9IHRlc3Rfc2lnbmVkX2xvYWRlcl9fb3BlbigpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwic2tlbF9vcGVuXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRpZiAoIUFTU0VSVF9PSyhicGZfb2JqZWN0X19nZW5fbG9hZGVyKHNrZWwtXHUwMDNlb2JqLCBcdTAwMjZnb3B0cyksIFwiZ2VuX2xvYWRlclwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKCFBU1NFUlRfT0soYnBmX29iamVjdF9fbG9hZChza2VsLVx1MDAzZW9iaiksIFwiZ2VuX2xvYWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX3Byb2dyYW0ocCwgc2tlbC1cdTAwM2VvYmopXG4rXHRcdG5yX3Byb2dzKys7XG4rXHRicGZfb2JqZWN0X19mb3JfZWFjaF9tYXAobSwgc2tlbC1cdTAwM2VvYmopXG4rXHRcdG5yX21hcHMrKztcbitcdGN0eF9zeiA9IHNpemVvZihzdHJ1Y3QgYnBmX2xvYWRlcl9jdHgpICtcbitcdFx0IG5yX21hcHMgKiBzaXplb2Yoc3RydWN0IGJwZl9tYXBfZGVzYykgK1xuK1x0XHQgbnJfcHJvZ3MgKiBzaXplb2Yoc3RydWN0IGJwZl9wcm9nX2Rlc2MpO1xuK1x0aW5zbnNfc3ogPSBnb3B0cy5pbnNuc19zejtcbitcdGRhdGFfc3ogPSBnb3B0cy5kYXRhX3N6O1xuK1x0Y3R4ID0gY2FsbG9jKDEsIGN0eF9zeik7XG4rXHRpbnNucyA9IG1hbGxvYyhpbnNuc19zeik7XG4rXHRibG9iID0gbWFsbG9jKGRhdGFfc3opO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGN0eCwgXCJjdHhcIikgfHxcbitcdCAgICAhQVNTRVJUX09LX1BUUihpbnNucywgXCJpbnNuc1wiKSB8fFxuK1x0ICAgICFBU1NFUlRfT0tfUFRSKGJsb2IsIFwiYmxvYlwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0bWVtY3B5KGluc25zLCBnb3B0cy5pbnNucywgaW5zbnNfc3opO1xuK1x0bWVtY3B5KGJsb2IsIGdvcHRzLmRhdGEsIGRhdGFfc3opO1xuK1x0bGliYnBmX3NoYTI1NihpbnNucywgaW5zbnNfc3osIGV4Y2wpO1xuK1xuK1x0c2lnbmJ1ZiA9IG1hbGxvYygoc2l6ZV90KWluc25zX3N6ICsgZGF0YV9zeik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2lnbmJ1ZiwgXCJzaWduYnVmXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRtZW1jcHkoc2lnbmJ1ZiwgaW5zbnMsIGluc25zX3N6KTtcbitcdG1lbWNweShzaWduYnVmICsgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3opO1xuK1x0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBzaWduYnVmLCBpbnNuc19zeiArIGRhdGFfc3osIHNpZywgXHUwMDI2c2lnX3N6KSxcbitcdFx0ICAgICAgIFwic2lnbi1maWxlXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRtZW1zZXQoY3R4LCAwLCBjdHhfc3opO1xuK1x0KChzdHJ1Y3QgYnBmX2xvYWRlcl9jdHggKiljdHgpLVx1MDAzZXN6ID0gY3R4X3N6O1xuK1x0ciA9IHJ1bl9nZW5fbG9hZGVyKGluc25zLCBpbnNuc19zeiwgYmxvYiwgZGF0YV9zeiwgZXhjbCwgc2l6ZW9mKGV4Y2wpLFxuK1x0XHRcdCAgIHNpZywgc2lnX3N6LCBjdHgsIGN0eF9zeiwgXHUwMDI2cmFuKTtcbitcdEFTU0VSVF9UUlVFKHJhbiwgXCJ2YWxpZCBzaWduYXR1cmU6IGxvYWRlciBsb2FkZWQgYW5kIHJhblwiKTtcbitcdEFTU0VSVF9FUShyLCAwLCBcInZhbGlkIHNpZ25hdHVyZSBhY2NlcHRlZFwiKTtcbitcdGNsb3NlX2xvYWRlcl9jdHhfZmRzKGN0eCwgbnJfbWFwcywgbnJfcHJvZ3MpO1xuK1xuK1x0LypcbitcdCAqIFRhbXBlciB0aGUgbWV0YWRhdGEgYWZ0ZXIgc2lnbmluZyB3aGlsZSBsZWF2aW5nIHRoZSBpbnN0cnVjdGlvbnNcbitcdCAqIGFuZCB0aHVzIHRoZSBleGNsdXNpdmUgaGFzaCBiaW5kaW5nIHVudG91Y2hlZDogdGhlIG1hcCBmcmVlemVzXG4rXHQgKiBmaW5lIGFuZCBleGNsX3Byb2dfc2hhIHN0aWxsIG1hdGNoZXMgdGhlIGxvYWRlcidzIGRpZ2VzdCwgc28gdGhlXG4rXHQgKiBsb2FkIHJlYWNoZXMgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiwgd2hpY2ggZm9sZHMgdGhlIGxpdmUgZnJvemVuXG4rXHQgKiBtYXAgYnl0ZXMgaW50byB0aGUgY2hlY2tlZCBwYXlsb2FkIGFuZCBtdXN0IHJlamVjdCB0aGUgbW9kaWZpZWRcbitcdCAqIGJsb2IuIEEga2VybmVsIGZvbGRpbmcgYW55dGhpbmcgYnV0IHRoZSBtYXAgY29udGVudHMgdGhlbXNlbHZlc1xuK1x0ICogd291bGQgd3JvbmdseSBhY2NlcHQgdGhpcyBsb2FkLlxuK1x0ICovXG4rXHRibG9iW2RhdGFfc3ogLyAyXSBePSAweGZmO1xuK1x0bWVtc2V0KGN0eCwgMCwgY3R4X3N6KTtcbitcdCgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS1cdTAwM2VzeiA9IGN0eF9zejtcbitcdHIgPSBydW5fZ2VuX2xvYWRlcihpbnNucywgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osIGV4Y2wsIHNpemVvZihleGNsKSxcbitcdFx0XHQgICBzaWcsIHNpZ19zeiwgY3R4LCBjdHhfc3osIFx1MDAyNnJhbik7XG4rXHRBU1NFUlRfRkFMU0UocmFuLCBcInRhbXBlcmVkIG1ldGFkYXRhIHJlamVjdGVkIGJlZm9yZSBydW5cIik7XG4rXHRBU1NFUlRfRVEociwgLUVLRVlSRUpFQ1RFRCwgXCJzaWduYXR1cmUgaXMgYm91bmQgdG8gdGhlIG1ldGFkYXRhXCIpO1xuK2NsZWFudXA6XG4rXHRmcmVlKGluc25zKTtcbitcdGZyZWUoYmxvYik7XG4rXHRmcmVlKHNpZ25idWYpO1xuIFx0ZnJlZShjdHgpO1xuIFx0dGVzdF9zaWduZWRfbG9hZGVyX19kZXN0cm95KHNrZWwpO1xuIFx0cnVuX3NldHVwKFwiY2xlYW51cFwiLCBkaXIpO1xuQEAgLTEwMDcsMTAgKzExOTgsMTEgQEAgc3RhdGljIHZvaWQgbHNtX3NpZ25hdHVyZV92ZXJkaWN0KHZvaWQpXG4ge1xuIFx0Y2hhciBkaXJfdG1wbFtdID0gXCIvdG1wL3NpZ25lZF9sb2FkZXJfbHNtWFhYWFhYXCIsICpkaXIgPSBOVUxMO1xuIFx0c3RydWN0IHRlc3Rfc2lnbmVkX2xvYWRlcl9sc20gKmxzbSA9IE5VTEw7XG4rXHRfX3UzMiBzaWdfc3ogPSA4MTkyLCBtc2lnX3N6ID0gODE5MjtcbiBcdGludCBtYXBfZmQgPSAtMSwgcHJvZ19mZCA9IC0xO1xuIFx0Ym9vbCBoYXZlX2ZpeHR1cmUgPSBmYWxzZTtcbiBcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbi1cdF9fdTMyIHNpZ19zeiA9IDgxOTI7XG4rXHR1bnNpZ25lZCBjaGFyICpidWY7XG4gXHRfX3MzMiBzZXNfc2VyaWFsO1xuIFx0X191OCBzaWdbODE5Ml07XG4gXG5AQCAtMTAyOSw3ICsxMjIxLDcgQEAgc3RhdGljIHZvaWQgbHNtX3NpZ25hdHVyZV92ZXJkaWN0KHZvaWQpXG4gXHRpZiAoIUFTU0VSVF9PS19GRChtYXBfZmQsIFwibWV0YV9tYXBfdW5zaWduZWRcIikpXG4gXHRcdGdvdG8gb3V0O1xuIFx0bHNtLVx1MDAzZWJzcy1cdTAwM2VzZWVuID0gMDtcbi1cdHByb2dfZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsIE5VTEwsIDAsIDApO1xuK1x0cHJvZ19mZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIG1hcF9mZCwgTlVMTCwgMCwgMCwgMCk7XG4gXHRjbG9zZShtYXBfZmQpO1xuIFx0bWFwX2ZkID0gLTE7XG4gXHRpZiAoIUFTU0VSVF9PS19GRChwcm9nX2ZkLCBcInVuc2lnbmVkIGxvYWRlciBsb2FkXCIpKVxuQEAgLTEwNjIsMjIgKzEyNTQsNTEgQEAgc3RhdGljIHZvaWQgbHNtX3NpZ25hdHVyZV92ZXJkaWN0KHZvaWQpXG4gXHRcdGdvdG8gb3V0O1xuIFx0bHNtLVx1MDAzZWJzcy1cdTAwM2VzZWVuID0gMDtcbiBcdHByb2dfZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsIHNpZyxcbi1cdFx0XHQgICAgICBzaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4rXHRcdFx0ICAgICAgc2lnX3N6LCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDApO1xuIFx0Y2xvc2UobWFwX2ZkKTtcbiBcdG1hcF9mZCA9IC0xO1xuLVx0aWYgKCFBU1NFUlRfT0tfRkQocHJvZ19mZCwgXCJzaWduZWQgbG9hZGVyIGxvYWRcIikpXG4tXHRcdGdvdG8gb3V0O1xuLVx0Y2xvc2UocHJvZ19mZCk7XG4rXHRBU1NFUlRfRVEocHJvZ19mZCwgLUVBQ0NFUywgXCJ1bmZvbGRlZCBtZXRhZGF0YSByZWplY3RlZFwiKTtcbitcdGlmIChwcm9nX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UocHJvZ19mZCk7XG4gXHRwcm9nX2ZkID0gLTE7XG4gXG4gXHRzZXNfc2VyaWFsID0gc3lzY2FsbChfX05SX2tleWN0bCwgS0VZQ1RMX0dFVF9LRVlSSU5HX0lELFxuIFx0XHRcdCAgICAgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAwKTtcbiBcdEFTU0VSVF9FUShsc20tXHUwMDNlYnNzLVx1MDAzZXNlZW4sIDEsIFwic2lnbmVkOiBvbmUgb2JzZXJ2ZWQgbG9hZFwiKTtcbi1cdEFTU0VSVF9FUShsc20tXHUwMDNlYnNzLVx1MDAzZXNpZ192ZXJkaWN0LCBCUEZfU0lHX1ZFUklGSUVELCBcInNpZ25lZCB2ZXJkaWN0XCIpO1xuK1x0QVNTRVJUX0VRKGxzbS1cdTAwM2Vic3MtXHUwMDNlc2lnX3ZlcmRpY3QsIEJQRl9TSUdfVkVSSUZJRUQsXG4rXHRcdCAgXCJhZG1pc3Npb24gc2F3IGEgdmFsaWQgc2lnbmF0dXJlXCIpO1xuIFx0QVNTRVJUX0VRKGxzbS1cdTAwM2Vic3MtXHUwMDNlc2lnX2tleXJpbmdfdHlwZSwgQlBGX1NJR19LRVlSSU5HX1VTRVIsIFwic2lnbmVkIGtleXJpbmcgdHlwZVwiKTtcbiBcdEFTU0VSVF9HVChzZXNfc2VyaWFsLCAwLCBcInNlc3Npb24ga2V5cmluZyBzZXJpYWwgcmVzb2x2ZWRcIik7XG4gXHRBU1NFUlRfRVEobHNtLVx1MDAzZWJzcy1cdTAwM2VzaWdfa2V5cmluZ19zZXJpYWwsIHNlc19zZXJpYWwsXG4gXHRcdCAgXCJzaWduZWQ6IHZhbGlkYXRlZCBhZ2FpbnN0IHNlc3Npb24ga2V5cmluZ1wiKTtcbitcbitcdGJ1ZiA9IG1hbGxvYygoc2l6ZV90KWYuZ29wdHMuaW5zbnNfc3ogKyBmLmRhdGFfc3opO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ1ZiwgXCJtZXRhX3NpZ25idWZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0bWVtY3B5KGJ1ZiwgZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeik7XG4rXHRtZW1jcHkoYnVmICsgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLCBmLmRhdGFfc3opO1xuK1x0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBidWYsIGYuZ29wdHMuaW5zbnNfc3ogKyBmLmRhdGFfc3osXG4rXHRcdFx0XHRzaWcsIFx1MDAyNm1zaWdfc3opLCBcInNpZ24gaW5zbnN8fG1ldGFkYXRhXCIpKSB7XG4rXHRcdGZyZWUoYnVmKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRmcmVlKGJ1Zik7XG4rXG4rXHRtYXBfZmQgPSBzZXR1cF9tZXRhX21hcChcdTAwMjZmKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKG1hcF9mZCwgXCJtZXRhX21hcF9ib3VuZFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRsc20tXHUwMDNlYnNzLVx1MDAzZXNlZW4gPSAwO1xuK1x0cHJvZ19mZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIG1hcF9mZCwgc2lnLFxuK1x0XHRcdCAgICAgIG1zaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7XG4rXHRjbG9zZShtYXBfZmQpO1xuK1x0bWFwX2ZkID0gLTE7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChwcm9nX2ZkLCBcIm1ldGFkYXRhLWJvdW5kIGxvYWRlciBsb2FkXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGNsb3NlKHByb2dfZmQpO1xuK1x0cHJvZ19mZCA9IC0xO1xuK1x0QVNTRVJUX0VRKGxzbS1cdTAwM2Vic3MtXHUwMDNlc2VlbiwgMSwgXCJtZXRhZGF0YTogb25lIG9ic2VydmVkIGxvYWRcIik7XG4rXHRBU1NFUlRfRVEobHNtLVx1MDAzZWJzcy1cdTAwM2VzaWdfdmVyZGljdCwgQlBGX1NJR19WRVJJRklFRCxcbitcdFx0ICBcIm1ldGFkYXRhLWJvdW5kIHZlcmRpY3RcIik7XG4gb3V0OlxuIFx0aWYgKG1hcF9mZCBcdTAwM2U9IDApXG4gXHRcdGNsb3NlKG1hcF9mZCk7XG5AQCAtMTA5MCwyMCArMTMxMSw0NjcgQEAgc3RhdGljIHZvaWQgbHNtX3NpZ25hdHVyZV92ZXJkaWN0KHZvaWQpXG4gXHR0ZXN0X3NpZ25lZF9sb2FkZXJfbHNtX19kZXN0cm95KGxzbSk7XG4gfVxuIFxuKy8qXG4rICogTG9hZC10aW1lIG1ldGFkYXRhIHZlcmlmaWNhdGlvbjogdGhlIGtlcm5lbCBmb2xkcyB0aGUgZnJvemVuIG1ldGFkYXRhIG1hcFxuKyAqIGludG8gdGhlIHNpZ25hdHVyZSAoaW5zbnMgfHwgbWV0YWRhdGEpIGFuZCBjaGVja3MgaXQgYXQgQlBGX1BST0dfTE9BRCB2aWFcbisgKiBmZF9hcnJheV9jbnQsIHJhdGhlciB0aGFuIHRoZSBsb2FkZXIgY2hlY2tpbmcgZnJvbSB3aXRoaW4gQlBGLiBTaWduIHRoYXRcbisgKiBjb25jYXRlbmF0aW9uLCBoYW5kIHRoZSBrZXJuZWwgdGhlIG1hcCwgYW5kIGNvbmZpcm0gdGhlIHNpZ25lZCBsb2FkZXIgbG9hZHMsXG4rICogcnVucywgYW5kIGluc3RhbGxzIGl0cyB0YXJnZXQuXG4rICovXG4rc3RhdGljIGludCBsb2FkdGltZV9kcml2ZShjb25zdCBjaGFyICpkaXIsIGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeixcbitcdFx0XHQgIGNvbnN0IHZvaWQgKmRhdGEsIF9fdTMyIGRhdGFfc3osIGNvbnN0IF9fdTggKmV4Y2wsXG4rXHRcdFx0ICB2b2lkICpjdHgsIF9fdTMyIGN0eF9zeiwgaW50ICpsb2FkX3JldCwgYm9vbCAqcmFuKVxuK3tcbitcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG1vcHRzLFxuK1x0XHQgICAgLmV4Y2xfcHJvZ19oYXNoID0gZXhjbCxcbitcdFx0ICAgIC5leGNsX3Byb2dfaGFzaF9zaXplID0gU0hBMjU2X0RJR0VTVF9MRU5HVEgpO1xuK1x0X191MzIgc2lnX3N6ID0gODE5Miwga2V5ID0gMDtcbitcdHVuc2lnbmVkIGNoYXIgKmJ1ZiA9IE5VTEw7XG4rXHRpbnQgbWFwX2ZkLCBwcm9nX2ZkLCByZXQgPSAwO1xuK1x0dW5pb24gYnBmX2F0dHIgYXR0cjtcbitcdF9fdTggc2lnWzgxOTJdO1xuK1xuK1x0KnJhbiA9IGZhbHNlO1xuK1x0KmxvYWRfcmV0ID0gMDtcbitcbitcdC8qXG4rXHQgKiBNZXRhZGF0YSBtYXAsIGJvdW5kIHRvIHRoZSBsb2FkZXIgZGlnZXN0IGFuZCBmcm96ZW4sIGV4YWN0bHkgYXNcbitcdCAqIHNrZWxfaW50ZXJuYWwuaCdzIGJwZl9sb2FkX2FuZF9ydW4oKSBzZXRzIGl0IHVwLlxuK1x0ICovXG4rXHRtYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVksIFwiX19sb2FkZXIubWFwXCIsIDQsXG4rXHRcdFx0XHRkYXRhX3N6LCAxLCBcdTAwMjZtb3B0cyk7XG4rXHRpZiAobWFwX2ZkIFx1MDAzYyAwKSB7XG4rXHRcdHJldCA9IC1lcnJubztcbitcdFx0Z290byBvdXRfbG9hZDtcbitcdH1cbitcdGlmIChicGZfbWFwX3VwZGF0ZV9lbGVtKG1hcF9mZCwgXHUwMDI2a2V5LCBkYXRhLCAwKSB8fCBicGZfbWFwX2ZyZWV6ZShtYXBfZmQpKSB7XG4rXHRcdHJldCA9IC1lcnJubztcbitcdFx0Z290byBvdXRfbG9hZDtcbitcdH1cbitcbitcdC8qIFNpZ24gaW5zbnMgfHwgbWV0YWRhdGEsIHRoZSBzYW1lIGJ5dGVzIHRoZSBrZXJuZWwgcmVjb25zdHJ1Y3RzLiAqL1xuK1x0YnVmID0gbWFsbG9jKChzaXplX3QpaW5zbnNfc3ogKyBkYXRhX3N6KTtcbitcdGlmICghYnVmKSB7XG4rXHRcdHJldCA9IC1FTk9NRU07XG4rXHRcdGdvdG8gb3V0X2xvYWQ7XG4rXHR9XG4rXHRtZW1jcHkoYnVmLCBpbnNucywgaW5zbnNfc3opO1xuK1x0bWVtY3B5KGJ1ZiArIGluc25zX3N6LCBkYXRhLCBkYXRhX3N6KTtcbitcdHJldCA9IHNpZ25fYnVmKGRpciwgYnVmLCBpbnNuc19zeiArIGRhdGFfc3osIHNpZywgXHUwMDI2c2lnX3N6KTtcbitcdGlmIChyZXQpXG4rXHRcdGdvdG8gb3V0X2xvYWQ7XG4rXG4rXHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcbitcdGF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMO1xuK1x0YXR0ci5pbnNucyA9IHB0cl90b191NjQoaW5zbnMpO1xuK1x0YXR0ci5pbnNuX2NudCA9IGluc25zX3N6IC8gc2l6ZW9mKHN0cnVjdCBicGZfaW5zbik7XG4rXHRhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KFwiRHVhbCBCU0QvR1BMXCIpO1xuK1x0YXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFO1xuK1x0YXR0ci5mZF9hcnJheSA9IHB0cl90b191NjQoXHUwMDI2bWFwX2ZkKTtcbitcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpO1xuK1x0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcbitcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcbitcdGF0dHIuZmRfYXJyYXlfY250ID0gMTtcbitcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXCJfX2xvYWRlci5wcm9nXCIsIHNpemVvZihcIl9fbG9hZGVyLnByb2dcIikpO1xuK1x0cHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFx1MDAyNmF0dHIsXG4rXHRcdFx0ICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuK1x0aWYgKHByb2dfZmQgXHUwMDNjIDApIHtcbitcdFx0cmV0ID0gLWVycm5vO1xuK1x0XHRnb3RvIG91dF9sb2FkO1xuK1x0fVxuK1xuK1x0bWVtc2V0KFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XG4rXHRhdHRyLnRlc3QucHJvZ19mZCA9IHByb2dfZmQ7XG4rXHRhdHRyLnRlc3QuY3R4X2luID0gcHRyX3RvX3U2NChjdHgpO1xuK1x0YXR0ci50ZXN0LmN0eF9zaXplX2luID0gY3R4X3N6O1xuK1x0aWYgKHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX1JVTiwgXHUwMDI2YXR0cixcbitcdFx0ICAgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCB0ZXN0KSkgXHUwMDNjIDApIHtcbitcdFx0cmV0ID0gLWVycm5vO1xuK1x0XHRnb3RvIG91dF9wcm9nO1xuK1x0fVxuK1x0KnJhbiA9IHRydWU7XG4rXHRyZXQgPSAoaW50KWF0dHIudGVzdC5yZXR2YWw7XG4rb3V0X3Byb2c6XG4rXHRjbG9zZShwcm9nX2ZkKTtcbitcdGdvdG8gb3V0X21hcDtcbitvdXRfbG9hZDpcbitcdCpsb2FkX3JldCA9IHJldDtcbitvdXRfbWFwOlxuK1x0ZnJlZShidWYpO1xuK1x0aWYgKG1hcF9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKG1hcF9mZCk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgdm9pZCBsb2FkdGltZV92ZXJpZnkoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgaW50IGV4cGVjdF9tYXBzKVxuK3tcbitcdExJQkJQRl9PUFRTKGdlbl9sb2FkZXJfb3B0cywgZ29wdHMsIC5nZW5faGFzaCA9IHRydWUpO1xuK1x0Y2hhciBkaXJfdG1wbFtdID0gXCIvdG1wL3NpZ25lZF9sb2FkZXJfbHRYWFhYWFhcIiwgKmRpciA9IE5VTEw7XG4rXHRpbnQgbnJfbWFwcyA9IDAsIG5yX3Byb2dzID0gMCwgbG9hZF9yZXQgPSAwLCByO1xuK1x0X191OCBleGNsW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTtcbitcdHN0cnVjdCBicGZfcHJvZ19kZXNjICpwZDtcbitcdHN0cnVjdCBicGZfbWFwX2Rlc2MgKm1kO1xuK1x0dW5zaWduZWQgY2hhciAqYmxvYiA9IE5VTEw7XG4rXHRzdHJ1Y3QgYnBmX3Byb2dyYW0gKnA7XG4rXHRzdHJ1Y3QgYnBmX21hcCAqbTtcbitcdF9fdTMyIGN0eF9zeiwgZGF0YV9zejtcbitcdHZvaWQgKmN0eCA9IE5VTEw7XG4rXHRib29sIHJhbiA9IGZhbHNlO1xuK1xuK1x0c3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCBcImtleXJpbmdcIiwgXCJfdWlkLjBcIiwgTlVMTCxcbitcdFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcbitcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCJta2R0ZW1wXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cFwiLCBkaXIpLCBcInZlcmlmeV9zaWdfc2V0dXBcIikpIHtcbitcdFx0cm1kaXIoZGlyKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0aWYgKCFBU1NFUlRfT0soYnBmX29iamVjdF9fZ2VuX2xvYWRlcihvYmosIFx1MDAyNmdvcHRzKSwgXCJnZW5fbG9hZGVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghQVNTRVJUX09LKGJwZl9vYmplY3RfX2xvYWQob2JqKSwgXCJnZW5fbG9hZFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRicGZfb2JqZWN0X19mb3JfZWFjaF9wcm9ncmFtKHAsIG9iailcbitcdFx0bnJfcHJvZ3MrKztcbitcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX21hcChtLCBvYmopXG4rXHRcdG5yX21hcHMrKztcbitcdGlmICghQVNTRVJUX0VRKG5yX21hcHMsIGV4cGVjdF9tYXBzLCBcImZpeHR1cmUgbWFwIGNvdW50XCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGN0eF9zeiA9IHNpemVvZihzdHJ1Y3QgYnBmX2xvYWRlcl9jdHgpICtcbitcdFx0IG5yX21hcHMgKiBzaXplb2Yoc3RydWN0IGJwZl9tYXBfZGVzYykgK1xuK1x0XHQgbnJfcHJvZ3MgKiBzaXplb2Yoc3RydWN0IGJwZl9wcm9nX2Rlc2MpO1xuK1x0Y3R4ID0gY2FsbG9jKDEsIGN0eF9zeik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoY3R4LCBcImN0eF9hbGxvY1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHQoKHN0cnVjdCBicGZfbG9hZGVyX2N0eCAqKWN0eCktXHUwMDNlc3ogPSBjdHhfc3o7XG4rXG4rXHRkYXRhX3N6ID0gZ29wdHMuZGF0YV9zejtcbitcdGJsb2IgPSBtYWxsb2MoZGF0YV9zeik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoYmxvYiwgXCJibG9iX2FsbG9jXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdG1lbWNweShibG9iLCBnb3B0cy5kYXRhLCBkYXRhX3N6KTtcbitcbitcdC8qIGV4Y2xfcHJvZ19oYXNoID0gU0hBMjU2KGxvYWRlciBpbnNucykgPT0gdGhlIGxvYWRlcidzIHByb2ctXHUwMDNlZGlnZXN0LiAqL1xuK1x0bGliYnBmX3NoYTI1Nihnb3B0cy5pbnNucywgZ29wdHMuaW5zbnNfc3osIGV4Y2wpO1xuK1xuK1x0ciA9IGxvYWR0aW1lX2RyaXZlKGRpciwgZ29wdHMuaW5zbnMsIGdvcHRzLmluc25zX3N6LCBibG9iLCBkYXRhX3N6LFxuK1x0XHRcdCAgIGV4Y2wsIGN0eCwgY3R4X3N6LCBcdTAwMjZsb2FkX3JldCwgXHUwMDI2cmFuKTtcbitcdEFTU0VSVF9PSyhsb2FkX3JldCwgXCJzaWduZWQgbG9hZGVyIGxvYWRlZCAoaW5zbnMgfHwgbWV0YWRhdGEpXCIpO1xuK1x0QVNTRVJUX1RSVUUocmFuLCBcImxvYWRlciByYW5cIik7XG4rXHRBU1NFUlRfRVEociwgMCwgXCJsb2FkZXIgaW5zdGFsbGVkIGl0cyB0YXJnZXRcIik7XG4rXG4rXHRtZCA9IChzdHJ1Y3QgYnBmX21hcF9kZXNjICopKChjaGFyICopY3R4ICsgc2l6ZW9mKHN0cnVjdCBicGZfbG9hZGVyX2N0eCkpO1xuK1x0cGQgPSAoc3RydWN0IGJwZl9wcm9nX2Rlc2MgKikobWQgKyBucl9tYXBzKTtcbitcdEFTU0VSVF9HVChwZFswXS5wcm9nX2ZkLCAwLCBcInRhcmdldCBwcm9ncmFtIGluc3RhbGxlZFwiKTtcbitcdGlmIChucl9tYXBzKVxuK1x0XHRBU1NFUlRfR1QobWRbMF0ubWFwX2ZkLCAwLCBcInRhcmdldCBtYXAgaW5zdGFsbGVkXCIpO1xuK1xuK1x0Y2xvc2VfbG9hZGVyX2N0eF9mZHMoY3R4LCBucl9tYXBzLCBucl9wcm9ncyk7XG4rb3V0OlxuK1x0ZnJlZShibG9iKTtcbitcdGZyZWUoY3R4KTtcbitcdGlmIChkaXIpXG4rXHRcdHJ1bl9zZXR1cChcImNsZWFudXBcIiwgZGlyKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgbG9hZHRpbWVfbm9fbWFwKHZvaWQpXG4re1xuK1x0c3RydWN0IHRlc3Rfc2lnbmVkX2xvYWRlciAqc2tlbCA9IHRlc3Rfc2lnbmVkX2xvYWRlcl9fb3BlbigpO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwic2tlbF9vcGVuXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRsb2FkdGltZV92ZXJpZnkoc2tlbC1cdTAwM2VvYmosIDApO1xuK1x0dGVzdF9zaWduZWRfbG9hZGVyX19kZXN0cm95KHNrZWwpO1xuK31cbitcbitzdGF0aWMgdm9pZCBsb2FkdGltZV93aXRoX21hcCh2b2lkKVxuK3tcbitcdHN0cnVjdCB0ZXN0X3NpZ25lZF9sb2FkZXJfbWFwICpza2VsID0gdGVzdF9zaWduZWRfbG9hZGVyX21hcF9fb3BlbigpO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwic2tlbF9vcGVuXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRsb2FkdGltZV92ZXJpZnkoc2tlbC1cdTAwM2VvYmosIDEpO1xuK1x0dGVzdF9zaWduZWRfbG9hZGVyX21hcF9fZGVzdHJveShza2VsKTtcbit9XG4rXG4rLypcbisgKiBBIHNpZ25lZCBwcm9ncmFtIG5lZWQgbm90IGJpbmQgYW55IG1hcC4gQSBwbGFpbiBCUEZfUFJPR19UWVBFX1NZU0NBTExcbisgKiBwcm9ncmFtIHdpdGggbm8gZmRfYXJyYXkgaXMgc2lnbmVkIG92ZXIgaXRzIGluc3RydWN0aW9ucyBhbG9uZTogdGhlIGtlcm5lbFxuKyAqIHZlcmlmaWVzIHRoZSBzaWduYXR1cmUsIGZvbGRzIG5vIG1ldGFkYXRhLCBhbmQgdGhlIHByb2dyYW0gbG9hZHMuIEV4ZXJjaXNlXG4rICogdGhlIGZkX2FycmF5ID09IE5VTEwgLyBmZF9hcnJheV9jbnQgPT0gMCBwYXRoLCBhbmQgY29uZmlybSB0aGUgc2lnbmF0dXJlXG4rICogc3RpbGwgYXV0aGVudGljYXRlcyB0aGUgaW5zdHJ1Y3Rpb25zIChhIHRhbXBlcmVkIGNvcHkgaXMgcmVqZWN0ZWQpLlxuKyAqL1xuK3N0YXRpYyB2b2lkIHNpZ25lZF9ub19mZF9hcnJheSh2b2lkKVxuK3tcbitcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xuK1x0XHRCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksXG4rXHRcdEJQRl9FWElUX0lOU04oKSxcbitcdH07XG4rXHRjaGFyIGRpcl90bXBsW10gPSBcIi90bXAvc2lnbmVkX2xvYWRlclhYWFhYWFwiLCAqZGlyO1xuK1x0X191MzIgc2lnX3N6ID0gODE5MjtcbitcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XG4rXHRfX3U4IHNpZ1s4MTkyXTtcbitcdGludCBwcm9nX2ZkLCBlcnI7XG4rXG4rXHRzeXNjYWxsKF9fTlJfcmVxdWVzdF9rZXksIFwia2V5cmluZ1wiLCBcIl91aWQuMFwiLCBOVUxMLFxuK1x0XHRLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xuK1x0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcIm1rZHRlbXBcIikpXG4rXHRcdHJldHVybjtcbitcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcInNldHVwXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuK1x0XHRybWRpcihkaXIpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHQvKiBObyBtZXRhZGF0YSBtYXA6IHRoZSBzaWduZWQgcGF5bG9hZCBpcyB0aGUgaW5zdHJ1Y3Rpb25zIGFsb25lLiAqL1xuK1x0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBpbnNucywgc2l6ZW9mKGluc25zKSwgc2lnLCBcdTAwMjZzaWdfc3opLFxuK1x0XHQgICAgICAgXCJzaWduLWZpbGVcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdG1lbXNldChcdTAwMjZhdHRyLCAwLCBzaXplb2YoYXR0cikpO1xuK1x0YXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7XG4rXHRhdHRyLmluc25zID0gcHRyX3RvX3U2NChpbnNucyk7XG4rXHRhdHRyLmluc25fY250ID0gQVJSQVlfU0laRShpbnNucyk7XG4rXHRhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KFwiRHVhbCBCU0QvR1BMXCIpO1xuK1x0YXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFO1xuK1x0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XG4rXHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6O1xuK1x0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xuK1x0LyogZmRfYXJyYXkgYW5kIGZkX2FycmF5X2NudCBkZWxpYmVyYXRlbHkgbGVmdCBOVUxMLzAuICovXG4rXHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFwic2lnbmVkX25vbWFwXCIsIHNpemVvZihcInNpZ25lZF9ub21hcFwiKSk7XG4rXG4rXHRwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXHUwMDI2YXR0cixcbitcdFx0XHQgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XG4rXHRpZiAoIUFTU0VSVF9HRShwcm9nX2ZkLCAwLCBcIm1hcC1sZXNzIHNpZ25lZCBwcm9ncmFtIGxvYWRlZFwiKSkge1xuK1x0XHRpZiAocHJvZ19mZCBcdTAwM2U9IDApXG4rXHRcdFx0Y2xvc2UocHJvZ19mZCk7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcdGNsb3NlKHByb2dfZmQpO1xuK1xuK1x0LyogVGhlIHNpZ25hdHVyZSBjb3ZlcnMgdGhlIGluc3RydWN0aW9ucywgc28gdGFtcGVyaW5nIG11c3QgYmUgcmVqZWN0ZWQuICovXG4rXHRpbnNuc1swXS5pbW0gPSAxO1xuK1x0cHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFx1MDAyNmF0dHIsXG4rXHRcdFx0ICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuK1x0ZXJyID0gcHJvZ19mZCBcdTAwM2MgMCA/IC1lcnJubyA6IHByb2dfZmQ7XG4rXHRBU1NFUlRfRVEoZXJyLCAtRUtFWVJFSkVDVEVELCBcInRhbXBlcmVkIG1hcC1sZXNzIHByb2dyYW0gcmVqZWN0ZWRcIik7XG4rXHRpZiAocHJvZ19mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKHByb2dfZmQpO1xuK2NsZWFudXA6XG4rXHRydW5fc2V0dXAoXCJjbGVhbnVwXCIsIGRpcik7XG4rfVxuK1xuKy8qXG4rICogQSBzaWduZWQgcHJvZ3JhbSBtYXkgcmVhY2ggbWFwcyBvbmx5IHRocm91Z2ggZmRfYXJyYXkgaW5kaWNlcywgc28gdGhlIGtlcm5lbFxuKyAqIGZvbGRzIChhbmQgdGh1cyBhdHRlc3RzKSB0aGVtLiBBIGRpcmVjdCBCUEZfUFNFVURPX01BUF9GRCByZWZlcmVuY2UgLSBhIHJhdyxcbisgKiB1bmZvbGRlZCBmZCBiYWtlZCBpbnRvIHRoZSBzaWduZWQgaW5zdHJ1Y3Rpb25zIC0gaXMgcmVqZWN0ZWQgYnkgdGhlIHZlcmlmaWVyLlxuKyAqL1xuK3N0YXRpYyB2b2lkIHNpZ25lZF9tYXBfYnlfZmRfcmVqZWN0ZWQodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnBmX2luc24gaW5zbnNbXSA9IHtcbitcdFx0QlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLFxuK1x0XHRCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksXG4rXHRcdEJQRl9FWElUX0lOU04oKSxcbitcdH07XG4rXHRjaGFyIGRpcl90bXBsW10gPSBcIi90bXAvc2lnbmVkX2xvYWRlclhYWFhYWFwiLCAqZGlyO1xuK1x0X191MzIgc2lnX3N6ID0gODE5MjtcbitcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XG4rXHRfX3U4IHNpZ1s4MTkyXTtcbitcdGludCBtYXBfZmQsIHByb2dfZmQsIGVycjtcbitcbitcdG1hcF9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWSwgXCJzaWdfbWFwZmRcIiwgNCwgNCwgMSwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9HRShtYXBfZmQsIDAsIFwibWFwX2NyZWF0ZVwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aW5zbnNbMF0uaW1tID0gbWFwX2ZkO1x0LyogYmFrZSB0aGUgcmF3IG1hcCBmZCBpbnRvIHRoZSBsZF9pbW02NCAqL1xuK1xuK1x0c3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCBcImtleXJpbmdcIiwgXCJfdWlkLjBcIiwgTlVMTCxcbitcdFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcbitcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCJta2R0ZW1wXCIpKVxuK1x0XHRnb3RvIG91dF9tYXA7XG4rXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cFwiLCBkaXIpLCBcInZlcmlmeV9zaWdfc2V0dXBcIikpIHtcbitcdFx0cm1kaXIoZGlyKTtcbitcdFx0Z290byBvdXRfbWFwO1xuK1x0fVxuK1xuK1x0LyogU2lnbiB0aGUgaW5zdHJ1Y3Rpb25zLCByYXcgbWFwIGZkIGFuZCBhbGwuICovXG4rXHRpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGluc25zLCBzaXplb2YoaW5zbnMpLCBzaWcsIFx1MDAyNnNpZ19zeiksXG4rXHRcdCAgICAgICBcInNpZ24tZmlsZVwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0bWVtc2V0KFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XG4rXHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbitcdGF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGluc25zKTtcbitcdGF0dHIuaW5zbl9jbnQgPSBBUlJBWV9TSVpFKGluc25zKTtcbitcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXCJEdWFsIEJTRC9HUExcIik7XG4rXHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XG4rXHRhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTtcbitcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XG4rXHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XG4rXHQvKiBObyBmZF9hcnJheTogdGhlIG1hcCBpcyByZWFjaGVkIGJ5IGEgcmF3IGZkIGluIHRoZSBpbnN0cnVjdGlvbnMuICovXG4rXHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFwic2lnbmVkX21hcGZkXCIsIHNpemVvZihcInNpZ25lZF9tYXBmZFwiKSk7XG4rXG4rXHRwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXHUwMDI2YXR0cixcbitcdFx0XHQgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XG4rXHRlcnIgPSBwcm9nX2ZkIFx1MDAzYyAwID8gLWVycm5vIDogcHJvZ19mZDtcbitcdEFTU0VSVF9FUShlcnIsIC1FSU5WQUwsIFwic2lnbmVkIHByb2dyYW0gcmVmZXJlbmNpbmcgYSBtYXAgYnkgZmQgcmVqZWN0ZWRcIik7XG4rXHRpZiAocHJvZ19mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKHByb2dfZmQpO1xuK2NsZWFudXA6XG4rXHRydW5fc2V0dXAoXCJjbGVhbnVwXCIsIGRpcik7XG4rb3V0X21hcDpcbitcdGNsb3NlKG1hcF9mZCk7XG4rfVxuK1xuKy8qXG4rICogQSBzaWduZWQgcHJvZ3JhbSBtYXkgcmVhY2ggbWFwcyBvbmx5IHRocm91Z2ggdGhlIGNvbnRpbnVvdXMgZmRfYXJyYXksIHNvIHRoZVxuKyAqIGtlcm5lbCBmb2xkcyAoYW5kIHRodXMgYXR0ZXN0cykgdGhlbS4gUmVmZXJlbmNpbmcgYSBtYXAgYnkgZmRfYXJyYXkgKmluZGV4KlxuKyAqIHdoaWxlIGxlYXZpbmcgZmRfYXJyYXlfY250IGF0IDAgc2VsZWN0cyB0aGUgc3BhcnNlIHBhdGgsIHdoaWNoIHJlc29sdmVzIGEgbWFwXG4rICogdGhlIHNpZ25hdHVyZSBuZXZlciBjb3ZlcmVkOyB0aGUgdmVyaWZpZXIgcmVqZWN0cyBpdCB1cCBmcm9udCB3aXRoIC1FQUNDRVMuXG4rICovXG4rc3RhdGljIHZvaWQgc2lnbmVkX3NwYXJzZV9mZF9hcnJheV9yZWplY3RlZCh2b2lkKVxuK3tcbitcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xuK1x0XHRCUEZfTERfSU1NNjRfUkFXKEJQRl9SRUdfMSwgQlBGX1BTRVVET19NQVBfSURYLCAwKSxcbitcdFx0QlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLFxuK1x0XHRCUEZfRVhJVF9JTlNOKCksXG4rXHR9O1xuK1x0Y2hhciBkaXJfdG1wbFtdID0gXCIvdG1wL3NpZ25lZF9sb2FkZXJfc3BYWFhYWFhcIiwgKmRpcjtcbitcdF9fdTMyIHNpZ19zeiA9IDgxOTI7XG4rXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xuK1x0X191OCBzaWdbODE5Ml07XG4rXHRpbnQgbWFwX2ZkLCBwcm9nX2ZkLCBlcnI7XG4rXG4rXHRtYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVksIFwic2lnX3NwYXJzZVwiLCA0LCA0LCAxLCBOVUxMKTtcbitcdGlmICghQVNTRVJUX0dFKG1hcF9mZCwgMCwgXCJtYXBfY3JlYXRlXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRzeXNjYWxsKF9fTlJfcmVxdWVzdF9rZXksIFwia2V5cmluZ1wiLCBcIl91aWQuMFwiLCBOVUxMLFxuK1x0XHRLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xuK1x0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcIm1rZHRlbXBcIikpXG4rXHRcdGdvdG8gb3V0X21hcDtcbitcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcInNldHVwXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuK1x0XHRybWRpcihkaXIpO1xuK1x0XHRnb3RvIG91dF9tYXA7XG4rXHR9XG4rXG4rXHQvKiBTaWduIHRoZSBpbnN0cnVjdGlvbnMgYWxvbmU7IHRoZSBzcGFyc2UgbWFwIGlzIG5vdCBmb2xkZWQuICovXG4rXHRpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGluc25zLCBzaXplb2YoaW5zbnMpLCBzaWcsIFx1MDAyNnNpZ19zeiksXG4rXHRcdCAgICAgICBcInNpZ24tZmlsZVwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0bWVtc2V0KFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XG4rXHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbitcdGF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGluc25zKTtcbitcdGF0dHIuaW5zbl9jbnQgPSBBUlJBWV9TSVpFKGluc25zKTtcbitcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXCJEdWFsIEJTRC9HUExcIik7XG4rXHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XG4rXHRhdHRyLmZkX2FycmF5ID0gcHRyX3RvX3U2NChcdTAwMjZtYXBfZmQpO1xuK1x0YXR0ci5mZF9hcnJheV9jbnQgPSAwOyAvKiBzcGFyc2U6IGZvcmNlIGxhenkgbWFwIHJlc29sdXRpb24gKi9cbitcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpO1xuK1x0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcbitcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcbitcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXCJzaWduZWRfc3BhcnNlXCIsIHNpemVvZihcInNpZ25lZF9zcGFyc2VcIikpO1xuK1xuK1x0cHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFx1MDAyNmF0dHIsXG4rXHRcdFx0ICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuK1x0ZXJyID0gcHJvZ19mZCBcdTAwM2MgMCA/IC1lcnJubyA6IHByb2dfZmQ7XG4rXHRBU1NFUlRfRVEoZXJyLCAtRUFDQ0VTLCBcInNpZ25lZCBwcm9ncmFtIGJpbmRpbmcgYSBzcGFyc2UgZmRfYXJyYXkgbWFwIHJlamVjdGVkXCIpO1xuK1x0aWYgKHByb2dfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShwcm9nX2ZkKTtcbitjbGVhbnVwOlxuK1x0cnVuX3NldHVwKFwiY2xlYW51cFwiLCBkaXIpO1xuK291dF9tYXA6XG4rXHRjbG9zZShtYXBfZmQpO1xuK31cbitcbitzdGF0aWMgdm9pZCBzaWduZWRfbW9kdWxlX2tmdW5jX3JlamVjdGVkKHZvaWQpXG4re1xuK1x0c3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7XG4rXHRcdEJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIEJQRl9QU0VVRE9fS0ZVTkNfQ0FMTCwgMSwgMSksXG4rXHRcdEJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSxcbitcdFx0QlBGX0VYSVRfSU5TTigpLFxuK1x0fTtcbitcdGNoYXIgZGlyX3RtcGxbXSA9IFwiL3RtcC9zaWduZWRfbG9hZGVyX2tmblhYWFhYWFwiLCAqZGlyO1xuK1x0aW50IHByb2dfZmQsIGVyciwgZmRzWzJdO1xuK1x0c3RydWN0IGJ0ZiAqYnRmID0gTlVMTDtcbitcdF9fdTMyIHNpZ19zeiA9IDgxOTI7XG4rXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xuK1x0X191OCBzaWdbODE5Ml07XG4rXG4rXHRzeXNjYWxsKF9fTlJfcmVxdWVzdF9rZXksIFwia2V5cmluZ1wiLCBcIl91aWQuMFwiLCBOVUxMLFxuK1x0XHRLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xuK1x0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcIm1rZHRlbXBcIikpXG4rXHRcdHJldHVybjtcbitcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcInNldHVwXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuK1x0XHRybWRpcihkaXIpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXHRpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGluc25zLCBzaXplb2YoaW5zbnMpLCBzaWcsIFx1MDAyNnNpZ19zeiksXG4rXHRcdCAgICAgICBcInNpZ24tZmlsZVwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiYnRmX25ld19lbXB0eVwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0YnRmX19hZGRfaW50KGJ0ZiwgXCJpbnRcIiwgNCwgQlRGX0lOVF9TSUdORUQpO1xuK1x0aWYgKCFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksIFwiYnRmX2xvYWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGZkc1swXSA9IC0xO1xuK1x0ZmRzWzFdID0gYnRmX19mZChidGYpO1xuK1xuK1x0bWVtc2V0KFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XG4rXHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbitcdGF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGluc25zKTtcbitcdGF0dHIuaW5zbl9jbnQgPSBBUlJBWV9TSVpFKGluc25zKTtcbitcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXCJEdWFsIEJTRC9HUExcIik7XG4rXHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XG4rXHRhdHRyLmZkX2FycmF5ID0gcHRyX3RvX3U2NChmZHMpO1xuK1x0YXR0ci5mZF9hcnJheV9jbnQgPSAwOyAvKiBzcGFyc2U6IGZvcmNlIGxhenkga2Z1bmMgQlRGIHJlc29sdXRpb24gKi9cbitcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpO1xuK1x0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcbitcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcbitcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXCJzaWduZWRfa2Z1bmNcIiwgc2l6ZW9mKFwic2lnbmVkX2tmdW5jXCIpKTtcbitcbitcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcdTAwMjZhdHRyLFxuK1x0XHRcdCAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcbitcdGVyciA9IHByb2dfZmQgXHUwMDNjIDAgPyAtZXJybm8gOiBwcm9nX2ZkO1xuK1x0aWYgKHByb2dfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShwcm9nX2ZkKTtcbitcbitcdEFTU0VSVF9FUShlcnIsIC1FQUNDRVMsIFwibW9kdWxlIGtmdW5jIEJURiBpbiBzaWduZWQgcHJvZ3JhbSByZWplY3RlZFwiKTtcbitjbGVhbnVwOlxuK1x0aWYgKGJ0ZilcbitcdFx0YnRmX19mcmVlKGJ0Zik7XG4rXHRydW5fc2V0dXAoXCJjbGVhbnVwXCIsIGRpcik7XG4rfVxuK1xuIHZvaWQgdGVzdF9zaWduZWRfbG9hZGVyKHZvaWQpXG4ge1xuLVx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtZXRhZGF0YV9jaGVja19zaGFwZVwiKSlcbi1cdFx0bWV0YWRhdGFfY2hlY2tfc2hhcGUoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibG9hZHRpbWVfbm9fbWFwXCIpKVxuK1x0XHRsb2FkdGltZV9ub19tYXAoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibG9hZHRpbWVfd2l0aF9tYXBcIikpXG4rXHRcdGxvYWR0aW1lX3dpdGhfbWFwKCk7XG4gXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcIm1ldGFkYXRhX21hdGNoXCIpKVxuIFx0XHRtZXRhZGF0YV9tYXRjaCgpO1xuLVx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtZXRhZGF0YV9zaGFfbWlzbWF0Y2hcIikpXG4tXHRcdG1ldGFkYXRhX3NoYV9taXNtYXRjaCgpO1xuLVx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtZXRhZGF0YV9ub3RfZXhjbHVzaXZlXCIpKVxuLVx0XHRtZXRhZGF0YV9ub3RfZXhjbHVzaXZlKCk7XG4tXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcIm1ldGFkYXRhX2hhc2hfbm90X2NvbXB1dGVkXCIpKVxuLVx0XHRtZXRhZGF0YV9oYXNoX25vdF9jb21wdXRlZCgpO1xuIFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJzaWduYXR1cmVfZW5mb3JjZWRcIikpXG4gXHRcdHNpZ25hdHVyZV9lbmZvcmNlZCgpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJzaWduZWRfbm9uZXhjbF9mZF9hcnJheV9yZWplY3RlZFwiKSlcbitcdFx0c2lnbmVkX25vbmV4Y2xfZmRfYXJyYXlfcmVqZWN0ZWQoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic2lnbmVkX3VuZnJvemVuX2ZkX2FycmF5X3JlamVjdGVkXCIpKVxuK1x0XHRzaWduZWRfdW5mcm96ZW5fZmRfYXJyYXlfcmVqZWN0ZWQoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic2lnbmVkX25vbmFycmF5X2ZkX2FycmF5X3JlamVjdGVkXCIpKVxuK1x0XHRzaWduZWRfbm9uYXJyYXlfZmRfYXJyYXlfcmVqZWN0ZWQoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic2lnbmVkX2J0Zl9mZF9hcnJheV9yZWplY3RlZFwiKSlcbitcdFx0c2lnbmVkX2J0Zl9mZF9hcnJheV9yZWplY3RlZCgpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJzaWduZWRfbW9kdWxlX2tmdW5jX3JlamVjdGVkXCIpKVxuK1x0XHRzaWduZWRfbW9kdWxlX2tmdW5jX3JlamVjdGVkKCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNpZ25hdHVyZV9mYWlsdXJlX2xvZ3NcIikpXG4rXHRcdHNpZ25hdHVyZV9mYWlsdXJlX2xvZ3MoKTtcbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic2lnbmF0dXJlX3Rvb19sYXJnZVwiKSlcbiBcdFx0c2lnbmF0dXJlX3Rvb19sYXJnZSgpO1xuIFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJzaWduYXR1cmVfYmFkX2tleXJpbmdcIikpXG5AQCAtMTExNCw2ICsxNzgyLDggQEAgdm9pZCB0ZXN0X3NpZ25lZF9sb2FkZXIodm9pZClcbiBcdFx0bWV0YWRhdGFfY3R4X2luaXRpYWxfdmFsdWVfaWdub3JlZCgpO1xuIFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJzaWduYXR1cmVfYXV0aGVudGljYXRlc19pbnNuc1wiKSlcbiBcdFx0c2lnbmF0dXJlX2F1dGhlbnRpY2F0ZXNfaW5zbnMoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic2lnbmF0dXJlX2F1dGhlbnRpY2F0ZXNfbWV0YWRhdGFcIikpXG4rXHRcdHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX21ldGFkYXRhKCk7XG4gXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImhhc2hfcmVxdWlyZXNfZnJvemVuXCIpKVxuIFx0XHRoYXNoX3JlcXVpcmVzX2Zyb3plbigpO1xuIFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJub191cGRhdGVfYWZ0ZXJfZnJlZXplXCIpKVxuQEAgLTExMzIsNCArMTgwMiwxMCBAQCB2b2lkIHRlc3Rfc2lnbmVkX2xvYWRlcih2b2lkKVxuIFx0XHRtYXBfaGFzaF91bnN1cHBvcnRlZF90eXBlKCk7XG4gXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImxzbV9zaWduYXR1cmVfdmVyZGljdFwiKSlcbiBcdFx0bHNtX3NpZ25hdHVyZV92ZXJkaWN0KCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNpZ25lZF9ub19mZF9hcnJheVwiKSlcbitcdFx0c2lnbmVkX25vX2ZkX2FycmF5KCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNpZ25lZF9tYXBfYnlfZmRfcmVqZWN0ZWRcIikpXG4rXHRcdHNpZ25lZF9tYXBfYnlfZmRfcmVqZWN0ZWQoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic2lnbmVkX3NwYXJzZV9mZF9hcnJheV9yZWplY3RlZFwiKSlcbitcdFx0c2lnbmVkX3NwYXJzZV9mZF9hcnJheV9yZWplY3RlZCgpO1xuIH1cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9zaWduZWRfbG9hZGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9zaWduZWRfbG9hZGVyLmNcbmluZGV4IGQ5YTRiODVmOTM5MWY1Li41MDQ1MWE2OWI5OWEyNyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3NpZ25lZF9sb2FkZXIuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfc2lnbmVkX2xvYWRlci5jXG5AQCAtNCwxMCArNCwxMSBAQFxuIFxuIC8qXG4gICogTWluaW1hbCwgbWFwLWxlc3MgcHJvZ3JhbS4gRHJpdmVuIHRocm91Z2ggbGliYnBmJ3MgZ2VuX2xvYWRlciAoZ2VuX2hhc2gpXG4tICogYnkgcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmMgc28gdGhlIGdlbmVyYXRlZCBsaWdodC1za2VsZXRvbiBsb2FkZXIgKHdpdGhcbi0gKiB0aGUgZW1pdF9zaWduYXR1cmVfbWF0Y2ggbWV0YWRhdGEgY2hlY2spIGNhbiBiZSBleGVyY2lzZWQgYWdhaW5zdCBnb29kXG4tICogYW5kIHRhbXBlcmVkIG1ldGFkYXRhLiBBIHNvY2tldCBmaWx0ZXIgbmVlZHMgbm8gbG9hZC10aW1lIGF0dGFjaCByZXNvbHV0aW9uLFxuLSAqIGFuZCBoYXZpbmcgbm8gbWFwcyBrZWVwcyB0aGUgZ2VuZXJhdGVkIGxvYWRlcidzIGN0eCB0cml2aWFsICgwIG1hcHMsIDEgcHJvZykuXG4rICogYnkgcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmMgc28gdGhlIGdlbmVyYXRlZCBsaWdodC1za2VsZXRvbiBsb2FkZXIgY2FuIGJlXG4rICogZXhlcmNpc2VkIGFnYWluc3QgZ29vZCBhbmQgdGFtcGVyZWQgbWV0YWRhdGEsIHdoaWNoIHRoZSBrZXJuZWwgbm93IHZlcmlmaWVzXG4rICogYXQgbG9hZCB0aW1lIHZpYSB0aGUgaW5zbnN8fG1ldGFkYXRhIHNpZ25hdHVyZS4gQSBzb2NrZXQgZmlsdGVyIG5lZWRzIG5vXG4rICogbG9hZC10aW1lIGF0dGFjaCByZXNvbHV0aW9uLCBhbmQgaGF2aW5nIG5vIG1hcHMga2VlcHMgdGhlIGdlbmVyYXRlZCBsb2FkZXInc1xuKyAqIGN0eCB0cml2aWFsICgwIG1hcHMsIDEgcHJvZykuXG4gICovXG4gU0VDKFwic29ja2V0XCIpXG4gaW50IHByb2JlKHZvaWQgKmN0eClcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdmVyaWZpZXJfbWFwX3B0ci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3ZlcmlmaWVyX21hcF9wdHIuY1xuaW5kZXggMTY2MTkzNjU5ODcwM2MuLmUwYTY1ODM1Yzg2MWJiIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3ZlcmlmaWVyX21hcF9wdHIuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3ZlcmlmaWVyX21hcF9wdHIuY1xuQEAgLTcyLDE0ICs3MiwxNSBAQCBfX25ha2VkIHZvaWQgYnBmX21hcF9wdHJfd3JpdGVfcmVqZWN0ZWQodm9pZClcbiBcbiAvKlxuICAqIHN0cnVjdCBicGZfbWFwIHN0YXJ0cyB3aXRoIHRoZSBTSEEyNTYgaGFzaCBzaGFbMzJdIGF0IG9mZnNldCAwIChhIHJlYWRhYmxlXG4tICogYnl0ZSBhcnJheSksIHRoZSB1MzIgZXhjbCBmaWVsZCBhdCBvZmZzZXQgMzIsIGFuZCB0aGUgb3BzIHBvaW50ZXIgYXQgb2Zmc2V0XG4tICogNDAuIFJlYWRpbmcgYSB1MzIgYXQgb2Zmc2V0IDQxIHJlYWNoZXMgaW50byB0aGUgbWlkZGxlIG9mIHRoZSBvcHMgcG9pbnRlcixcbi0gKiBpLmUuIGEgcGFydGlhbCBwb2ludGVyIGFjY2Vzcywgd2hpY2ggaXMgcmVqZWN0ZWQuXG4rICogYnl0ZSBhcnJheSksIGZvbGxvd2VkIGJ5IHRoZSBvcHMgcG9pbnRlciBhdCBvZmZzZXQgMzIgYW5kIHRoZSBpbm5lcl9tYXBfbWV0YVxuKyAqIHBvaW50ZXIgYXQgb2Zmc2V0IDQwLiBSZWFkaW5nIGEgdTMyIGF0IG9mZnNldCA0MSByZWFjaGVzIGludG8gdGhlIG1pZGRsZSBvZlxuKyAqIHRoZSBpbm5lcl9tYXBfbWV0YSBwb2ludGVyLCBpLmUuIGEgcGFydGlhbCBwb2ludGVyIGFjY2Vzcywgd2hpY2ggaXNcbisgKiByZWplY3RlZC5cbiAgKi9cbiBTRUMoXCJzb2NrZXRcIilcbiBfX2Rlc2NyaXB0aW9uKFwiYnBmX21hcF9wdHI6IHJlYWQgbm9uLWV4aXN0ZW50IGZpZWxkIHJlamVjdGVkXCIpXG4gX19mYWlsdXJlXG4tX19tc2coXCJjYW5ub3QgYWNjZXNzIHB0ciBtZW1iZXIgb3BzIHdpdGggbW9mZiA0MCBpbiBzdHJ1Y3QgYnBmX21hcCB3aXRoIG9mZiA0MSBzaXplIDRcIilcbitfX21zZyhcImNhbm5vdCBhY2Nlc3MgcHRyIG1lbWJlciBpbm5lcl9tYXBfbWV0YSB3aXRoIG1vZmYgNDAgaW4gc3RydWN0IGJwZl9tYXAgd2l0aCBvZmYgNDEgc2l6ZSA0XCIpXG4gX19mYWlsdXJlX3VucHJpdlxuIF9fbXNnX3VucHJpdihcImFjY2VzcyBpcyBhbGxvd2VkIG9ubHkgdG8gQ0FQX1BFUkZNT04gYW5kIENBUF9TWVNfQURNSU5cIilcbiBfX2ZsYWcoQlBGX0ZfQU5ZX0FMSUdOTUVOVClcbkBAIC05NywyMyArOTgsMjMgQEAgX19uYWtlZCB2b2lkIHJlYWRfbm9uX2V4aXN0ZW50X2ZpZWxkX3JlamVjdGVkKHZvaWQpXG4gfVxuIFxuIC8qXG4tICogVGhlIHUzMiBleGNsIGZpZWxkIHNwYW5zIG9mZnNldHMgMzIuLjM1IChtZW5kIDM2KS4gUmVhZGluZyBhIHUzMiBhdCBvZmZzZXRcbi0gKiAzMyBzdGFydHMgaW5zaWRlIGV4Y2wgYnV0IGV4dGVuZHMgcGFzdCBpdHMgZW5kLCB3aGljaCB0aGUgdmVyaWZpZXIgcmVqZWN0c1xuKyAqIFRoZSBzaGEgYnl0ZSBhcnJheSBzcGFucyBvZmZzZXRzIDAuLjMxIChtZW5kIDMyKS4gUmVhZGluZyBhIHUzMiBhdCBvZmZzZXRcbisgKiAzMCBzdGFydHMgaW5zaWRlIHNoYSBidXQgZXh0ZW5kcyBwYXN0IGl0cyBlbmQsIHdoaWNoIHRoZSB2ZXJpZmllciByZWplY3RzXG4gICogYXMgYW4gb3V0LW9mLWJvdW5kcyBzY2FsYXIgYWNjZXNzLlxuICAqL1xuIFNFQyhcInNvY2tldFwiKVxuLV9fZGVzY3JpcHRpb24oXCJicGZfbWFwX3B0cjogcmVhZCBiZXlvbmQgZXhjbCBmaWVsZCByZWplY3RlZFwiKVxuK19fZGVzY3JpcHRpb24oXCJicGZfbWFwX3B0cjogcmVhZCBiZXlvbmQgc2hhIGZpZWxkIHJlamVjdGVkXCIpXG4gX19mYWlsdXJlXG4tX19tc2coXCJhY2Nlc3MgYmV5b25kIHRoZSBlbmQgb2YgbWVtYmVyIGV4Y2wgKG1lbmQ6MzYpIGluIHN0cnVjdCBicGZfbWFwIHdpdGggb2ZmIDMzIHNpemUgNFwiKVxuK19fbXNnKFwiYWNjZXNzIGJleW9uZCB0aGUgZW5kIG9mIG1lbWJlciBzaGEgKG1lbmQ6MzIpIGluIHN0cnVjdCBicGZfbWFwIHdpdGggb2ZmIDMwIHNpemUgNFwiKVxuIF9fZmFpbHVyZV91bnByaXZcbiBfX21zZ191bnByaXYoXCJhY2Nlc3MgaXMgYWxsb3dlZCBvbmx5IHRvIENBUF9QRVJGTU9OIGFuZCBDQVBfU1lTX0FETUlOXCIpXG4gX19mbGFnKEJQRl9GX0FOWV9BTElHTk1FTlQpXG4tX19uYWtlZCB2b2lkIHJlYWRfYmV5b25kX2V4Y2xfZmllbGRfcmVqZWN0ZWQodm9pZClcbitfX25ha2VkIHZvaWQgcmVhZF9iZXlvbmRfc2hhX2ZpZWxkX3JlamVjdGVkKHZvaWQpXG4ge1xuIFx0YXNtIHZvbGF0aWxlIChcIlx0XHRcdFx0XHRcXFxuIFx0cjYgPSAwO1x0XHRcdFx0XHRcdFxcXG4gXHRyMSA9ICVbbWFwX2FycmF5XzQ4Yl0gbGw7XHRcdFx0XFxcbi1cdHI2ID0gKih1MzIqKShyMSArIDMzKTtcdFx0XHRcdFxcXG4rXHRyNiA9ICoodTMyKikocjEgKyAzMCk7XHRcdFx0XHRcXFxuIFx0cjAgPSAxO1x0XHRcdFx0XHRcdFxcXG4gXHRleGl0O1x0XHRcdFx0XHRcdFxcXG4gXCJcdDpcbkBAIC0xMzEsNyArMTMyLDcgQEAgX19uYWtlZCB2b2lkIHB0cl9yZWFkX29wc19maWVsZF9hY2NlcHRlZCh2b2lkKVxuIFx0YXNtIHZvbGF0aWxlIChcIlx0XHRcdFx0XHRcXFxuIFx0cjYgPSAwO1x0XHRcdFx0XHRcdFxcXG4gXHRyMSA9ICVbbWFwX2FycmF5XzQ4Yl0gbGw7XHRcdFx0XFxcbi1cdHI2ID0gKih1NjQqKShyMSArIDQwKTtcdFx0XHRcdFxcXG4rXHRyNiA9ICoodTY0KikocjEgKyAzMik7XHRcdFx0XHRcXFxuIFx0cjAgPSAxO1x0XHRcdFx0XHRcdFxcXG4gXHRleGl0O1x0XHRcdFx0XHRcdFxcXG4gXCJcdDpcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjI0OjUzLjM0MTM2MjU1M1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwMDk5MDc0MzgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIEJQRiBTaWduaW5nIFBhdGNoIFNlcmllcyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggc2VyaWVzIGFpbWVkIGF0IGludHJvZHVjaW5nIEJQRiBzaWduaW5nLiBJdCBzZWVtcyBsaWtlIGEgcHJldHR5IHNpZ25pZmljYW50IHNoaWZ0LCBjZW50cmFsaXppbmcgdGhlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gcHJvY2VzcyB3aXRoaW4gdGhlIGtlcm5lbCB2ZXJpZmllciBpdHNlbGYuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGlzIGNvdWxkIGhhdmUgc2VyaW91cyBpbXBsaWNhdGlvbnMsIGJvdGggaW4gdGVybXMgb2Ygc2VjdXJpdHkgYW5kIHBlcmZvcm1hbmNlLCBhbmQgd2lsbCB3YXJyYW50IGEgdGhvcm91Z2ggcmV2aWV3LlxuXG5NeSBpbW1lZGlhdGUgaW1wcmVzc2lvbiBpcyB0aGF0IHRoZSBjaGFuZ2VzIGFyZSBmYWlybHkgZXh0ZW5zaXZlLCB0b3VjaGluZyBtdWx0aXBsZSBmaWxlcyBhY3Jvc3MgdGhlIGtlcm5lbCBhbmQgdG9vbGluZy4gSSBzZWUgbmV3IGRvY3VtZW50YXRpb24gd2l0aCBgRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3RgLCB3aGljaCBpcyBhIGdvb2Qgc2lnbiDigJMgdGhhdCdzIHNvbWV0aGluZyB0byBkZWx2ZSBpbnRvLiBUaGUgY29yZSBrZXJuZWwgZmlsZXMgYWZmZWN0ZWQg4oCTIGBpbmNsdWRlL2xpbnV4L2JwZi5oYCwgYGluY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmhgLCBga2VybmVsL2JwZi9zeXNjYWxsLmNgLCBga2VybmVsL2JwZi92ZXJpZmllci5jYCDigJMgY2xlYXJseSBpbmRpY2F0ZSB0aGUgaGVhcnQgb2YgdGhlIGNoYW5nZTogaW50ZWdyYXRpbmcgdGhlIHNpZ25pbmcgZnVuY3Rpb25hbGl0eSBkaXJlY3RseSBpbnRvIHRoZSBCUEYgdmVyaWZpY2F0aW9uIHByb2Nlc3MuIFRoZSBtb2RpZmljYXRpb25zIHRvIGBicGZ0b29sYCBzdWdnZXN0IGFkZGVkIHRvb2xpbmcgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBhbmQgbWFuYWdpbmcgc2lnbmF0dXJlcywgd2hpY2ggaXMgaW1wb3J0YW50LiBBbmQgdGhlIHNlbGZ0ZXN0cyBhcmUgYSBjcml0aWNhbCBpbmRpY2F0b3IgdGhhdCB0aGV5IGNvbnNpZGVyZWQgYSBsb3Qgb2YgdGVzdGNhc2VzLlxuXG5UaGUga2V5IGZ1bmN0aW9uYWwgc2hpZnQgaXMgbW92aW5nIHRoZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZyb20gdXNlcnNwYWNlL2xvYWRlciBpbnRvIHRoZSBrZXJuZWwgdmVyaWZpZXIuIFNwZWNpZmljYWxseSwgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIGlzIHRoZSBmdW5jdGlvbiB0aGF0J3MgYmVpbmcgbW92ZWQuIEknbSBub3RpbmcgdGhlIGFkZGl0aW9uIG9mIGBmZF9hcnJheV9jbnRgIHRvIGB1bmlvbiBicGZfYXR0cmAgYW5kIHRoZSBoYW5kbGluZyBvZiBjb250aW51b3VzIGBmZF9hcnJheWAgd2l0aCBgcHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzYCBhcyB3ZWxsLiBUaGUgcHJlc2VuY2Ugb2YgYGVudi1cdTAwM2VzaWduYXR1cmVgIGNoZWNrIHdpdGhpbiBgYnBmX2NoZWNrYCBhbmQgdGhlIHN1YnNlcXVlbnQgY2FsbCB0byBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgc2hvd3MgaG93IHRoZSBzaWduaW5nIGludGVncmF0aW9uIGlzIGJlaW5nIGltcGxlbWVudGVkIHdpdGhpbiB0aGUgZXhpc3RpbmcgdmVyaWZpY2F0aW9uIGZyYW1ld29yay5cblxuTXkgYXR0ZW50aW9uIGlzIG5vdyBmb2N1c2VkIG9uIGBrZXJuZWwvYnBmL3ZlcmlmaWVyLmNgIGFuZCBga2VybmVsL2JwZi9zeXNjYWxsLmNgIHRvIHNlZSB0aGUgZXhhY3QgbmF0dXJlIG9mIHRoZXNlIG1vZGlmaWNhdGlvbnMuIEl0IHNlZW1zIHRoZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGlzIG1vdmluZyBmcm9tIGBzeXNjYWxsLmNgIHRvIGB2ZXJpZmllci5jYCB3aGljaCwgb24gdGhlIGZhY2Ugb2YgaXQsIG1ha2VzIHNlbnNlLiBCdXQgaXQgcmVxdWlyZXMgc29tZSBkZXRhaWxlZCBjaGVja2luZywgd2hpY2ggSSdtIGFscmVhZHkgZG9pbmcuIFRoZSBtb2RpZmljYXRpb24gb2YgYHByb2Nlc3NfZmRfYXJyYXlgIGlzIHJlbGV2YW50LCBzaW5jZSB0aGF0IGRlYWxzIHdpdGggZmlsZSBkZXNjcmlwdG9ycyBhbmQgbWFwcy4gQW5kIHRoZSBhZGRpdGlvbiBvZiBgZmRfYXJyYXlfZ2V0X21hcF9pZHhgIGFuZCBgZmRfYXJyYXlfZ2V0X2J0ZmAgbWVhbnMgYSBuZXcgd2F5IG9mIGRlYWxpbmcgd2l0aCBleGlzdGluZyBzdHJ1Y3R1cmVzLlxuXG5HaXZlbiB0aGVzZSBrZXJuZWwgbW9kaWZpY2F0aW9ucywgSSdtIHRoaW5raW5nIHRoaXMgaXMgZGVmaW5pdGVseSB3b3J0aCBmdXp6aW5nLiBUaGUgY2hhbmdlcyB0b3VjaCBjb3JlIEJQRiB2ZXJpZmllciBsb2dpYywgbWVhbmluZyBhbnkgdnVsbmVyYWJpbGl0aWVzIGhlcmUgY291bGQgYmUgcXVpdGUgaW1wYWN0ZnVsLiBNeSBmdXp6aW5nIHRhcmdldHMgd2lsbCBiZTogYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgLCBgcHJvY2Vzc19mZF9hcnJheWAsIGBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXNgLCBgZmRfYXJyYXlfZ2V0X21hcF9pZHhgLCBgZmRfYXJyYXlfZ2V0X2J0ZmAsIGFuZCBgYWRkX2ZkX2Zyb21fZmRfYXJyYXlgLiBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdyBjcml0aWNhbC4gSSBuZWVkIHRvIGJlIHN1cmUgdGhhdCBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgaXMgcmVhY2hhYmxlIGluIGFsbCB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbnMsIGFuZCBpbiBhbGwgdGhlIGRpZmZlcmVudCBjb2RlIHBhdGhzLiBJJ2xsIG5lZWQgdG8gY2hlY2sgdGhlIHJlcXVpcmVkIGNvbmZpZ3MgZm9yIEJQRiBzaWduaW5nIHRvIGVuc3VyZSB0aGUgdGVzdHMgYXJlIGNvbXByZWhlbnNpdmUuIEknbGwgbmVlZCB0byBzZWFyY2ggZm9yIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBvciBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIHRvIGxvb2sgYXQgaG93IHRoZXNlIGZ1bmN0aW9ucyBhcmUgYmVpbmcgY2FsbGVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MzE5MiwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY0MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjI1OjAzLjQ0MDQzOTk2NloiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MjEyNTg5NjMxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvYnBmLmg9MzgyMj12b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KTtcXG5pbmNsdWRlL2xpbnV4L2JwZi5oOjM4MjM6aW50IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpkYXRhX3AsXFxuaW5jbHVkZS9saW51eC9icGYuaC0zODI0LVxcdFxcdFxcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqc2lnX3AsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2JwZi5oPTM4NDI9c3RhdGljIGlubGluZSB2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KVxcbi0tXFxuaW5jbHVkZS9saW51eC9icGYuaC0zODQ1LVxcbmluY2x1ZGUvbGludXgvYnBmLmg6Mzg0NjpzdGF0aWMgaW5saW5lIGludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wLFxcbmluY2x1ZGUvbGludXgvYnBmLmgtMzg0Ny1cXHRcXHRcXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpzaWdfcCxcXG4tLVxcbmtlcm5lbC9icGYvaGVscGVycy5jPTQyOTc9X19icGZfa2Z1bmMgdm9pZCBicGZfa2V5X3B1dChzdHJ1Y3QgYnBmX2tleSAqYmtleSlcXG4tLVxcbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMDUtLyoqXFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NDMwNjogKiBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSAtIHZlcmlmeSBhIFBLQ1MjNyBzaWduYXR1cmVcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00MzA3LSAqIEBkYXRhX3A6IGRhdGEgdG8gdmVyaWZ5XFxuLS1cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00MzE1LSAqL1xcbmtlcm5lbC9icGYvaGVscGVycy5jOjQzMTY6X19icGZfa2Z1bmMgaW50IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpkYXRhX3AsXFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDMxNy1cXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnNpZ19wLFxcbi0tXFxua2VybmVsL2JwZi9oZWxwZXJzLmM9NDg1Nj1CVEZfSURfRkxBR1MoZnVuYywgYnBmX2tleV9wdXQsIEtGX1JFTEVBU0UpXFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDg1Ny0jaWZkZWYgQ09ORklHX1NZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlxcbmtlcm5lbC9icGYvaGVscGVycy5jOjQ4NTg6QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlLCBLRl9TTEVFUEFCTEUpXFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDg1OS0jZW5kaWZcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0xOTkyMz1zdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMDAxNS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjAwMTY6XFx0ZXJyID0gYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoKHN0cnVjdCBicGZfZHlucHRyICopXFx1MDAyNmRhdGFfcHRyLFxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMDAxNy1cXHRcXHRcXHRcXHRcXHQgKHN0cnVjdCBicGZfZHlucHRyICopXFx1MDAyNnNpZ19wdHIsIGtleSk7XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2tmdW5jcy5oPTc3PWV4dGVybiB2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICprZXkpIF9fa3N5bTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2tmdW5jcy5oOjc4OmV4dGVybiBpbnQgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKmRhdGFfcHRyLFxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfa2Z1bmNzLmgtNzktXFx0XFx0XFx0XFx0ICAgICAgY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnNpZ19wdHIsXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rZnVuY19keW5wdHJfcGFyYW0uYz0yMj1zdGF0aWMgaW50IGxpYmJwZl9wcmludF9jYihlbnVtIGxpYmJwZl9wcmludF9sZXZlbCBsZXZlbCwgY29uc3QgY2hhciAqZm10LFxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmMtMjctXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmM6Mjg6XFx0aWYgKHN0cmNtcCh2YV9hcmcoYXJncywgY2hhciAqKSwgXFxcImJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlXFxcIikpXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmMtMjktXFx0XFx0cmV0dXJuIDA7XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rZnVuY19keW5wdHJfcGFyYW0uYz0zNT1zdGF0aWMgYm9vbCBoYXNfcGtjczdfa2Z1bmNfc3VwcG9ydCh2b2lkKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmMtNTItXFx0XFx0ZnByaW50ZihzdGRlcnIsXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmM6NTM6XFx0XFx0ICBcXFwiJXM6U0tJUDpicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgpIGtmdW5jIG5vdCBzdXBwb3J0ZWRcXFxcblxcXCIsXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmMtNTQtXFx0XFx0ICBfX2Z1bmNfXyk7XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZnlfcGtjczdfc2lnLmM9NDY9c3RhdGljIGludCBsaWJicGZfcHJpbnRfY2IoZW51bSBsaWJicGZfcHJpbnRfbGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCxcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYy01NC1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZnlfcGtjczdfc2lnLmM6NTU6XFx0aWYgKHN0cmNtcCh2YV9hcmcoYXJncywgY2hhciAqKSwgXFxcImJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlXFxcIikpXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jLTU2LVxcdFxcdHJldHVybiAwO1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jPTI0Mj1zdGF0aWMgdm9pZCB0ZXN0X3ZlcmlmeV9wa2NzN19zaWdfZnJvbV9tYXAodm9pZClcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYy0yNzMtXFx0XFx0cHJpbnRmKFxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYzoyNzQ6XFx0XFx0ICBcXFwiJXM6U0tJUDpicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgpIGtmdW5jIG5vdCBzdXBwb3J0ZWRcXFxcblxcXCIsXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jLTI3NS1cXHRcXHQgIF9fZnVuY19fKTtcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2tmdW5jX2R5bnB0cl9wYXJhbS5jPTM0PWludCBCUEZfUFJPRyhub3RfdmFsaWRfZHlucHRyLCBpbnQgY21kLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgdW5zaWduZWQgaW50IHNpemUsIGJvb2wga2VybmVsKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmMtMzctXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmM6Mzg6XFx0cmV0dXJuIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKChzdHJ1Y3QgYnBmX2R5bnB0ciAqKVxcdTAwMjZ2YWwsXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmMtMzktXFx0XFx0XFx0XFx0XFx0ICAoc3RydWN0IGJwZl9keW5wdHIgKilcXHUwMDI2dmFsLCBOVUxMKTtcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2tmdW5jX2R5bnB0cl9wYXJhbS5jPTQ0PWludCBCUEZfUFJPRyhub3RfcHRyX3RvX3N0YWNrLCBpbnQgY21kLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgdW5zaWduZWQgaW50IHNpemUsIGJvb2wga2VybmVsKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmMtNDctXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmM6NDg6XFx0cmV0dXJuIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKFxcdTAwMjZ2YWwsIFxcdTAwMjZ2YWwsIE5VTEwpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2tmdW5jX2R5bnB0cl9wYXJhbS5jLTQ5LX1cXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2tmdW5jX2R5bnB0cl9wYXJhbS5jPTUyPWludCBCUEZfUFJPRyhkeW5wdHJfZGF0YV9udWxsLCBpbnQgY21kLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgdW5zaWduZWQgaW50IHNpemUsIGJvb2wga2VybmVsKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmMtNzQtXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmM6NzU6XFx0ZXJyID0gYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoXFx1MDAyNnB0ciwgXFx1MDAyNnB0ciwgdHJ1c3RlZF9rZXlyaW5nKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9rZnVuY19keW5wdHJfcGFyYW0uYy03Ni1cXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3NpZ19pbl94YXR0ci5jPTQ2PWludCBCUEZfUFJPRyh0ZXN0X2ZpbGVfb3Blbiwgc3RydWN0IGZpbGUgKmYpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9zaWdfaW5feGF0dHIuYy03OS1cXHQvKiBWZXJpZnkgc2lnbmF0dXJlICovXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfc2lnX2luX3hhdHRyLmM6ODA6XFx0cmV0ID0gYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoXFx1MDAyNmRpZ2VzdF9wdHIsIFxcdTAwMjZzaWdfcHRyLCB0cnVzdGVkX2tleXJpbmcpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3NpZ19pbl94YXR0ci5jLTgxLVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfdmVyaWZ5X3BrY3M3X3NpZy5jPTQwPWludCBCUEZfUFJPRyhicGYsIGludCBjbWQsIHVuaW9uIGJwZl9hdHRyICphdHRyLCB1bnNpZ25lZCBpbnQgc2l6ZSwgYm9vbCBrZXJuZWwpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF92ZXJpZnlfcGtjczdfc2lnLmMtODMtXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfdmVyaWZ5X3BrY3M3X3NpZy5jOjg0OlxcdHJldCA9IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKFxcdTAwMjZkYXRhX3B0ciwgXFx1MDAyNnNpZ19wdHIsIHRydXN0ZWRfa2V5cmluZyk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfdmVyaWZ5X3BrY3M3X3NpZy5jLTg1LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQyMDoyNTowNy42NTMwNDE3NjZaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMjI0NDYxOTkxOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbnZlc3RpZ2F0aW5nIHRoZSBCUEYgU2lnbmF0dXJlIFZlcmlmaWNhdGlvbiBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBob3cgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBpcyBoYW5kbGVkIHdpdGhpbiB0aGUgQlBGIHN1YnN5c3RlbSwgc3BlY2lmaWNhbGx5IHRoZSBQS0NTIzcgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi4gSSBzZWUgdGhhdCB0aGUgZnVuY3Rpb24gYGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlYCBpcyBkZWZpbmVkIGluIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AuIEFuZCBpdCBzZWVtcyBsaWtlIGl0J3MgbGlua2VkIHRvIHRoZSBgQ09ORklHX1NZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAgY29uZmlnIG9wdGlvbi4gQnV0IHRoZW4sIEkgYWxzbyBzZWUgdGhhdCBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAsIGxvY2F0ZWQgaW4gYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AsICpjYWxscyogYGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlYC5cblxuTm93IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgYmV0dGVyLiBJcyBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGFsd2F5cyBhdmFpbGFibGUsIG9yIGlzIGl0cyBpbmNsdXNpb24gY29uZGl0aW9uYWwgb24gYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gPyBUaGlzIGNvdWxkIGltcGFjdCB0aGUgb3ZlcmFsbCBhdmFpbGFiaWxpdHkgYW5kIGJlaGF2aW9yIG9mIEJQRiBwcm9ncmFtIHNpZ25hdHVyZSB2YWxpZGF0aW9uLiBJJ2xsIG5lZWQgdG8gZGlnIGRlZXBlciBpbnRvIHRoZSBjb2RlIGFuZCBwb3RlbnRpYWwgYnVpbGQgY29uZmlndXJhdGlvbnMgdG8gY2xhcmlmeSB0aGlzIGRlcGVuZGVuY3kuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ2OTgxLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTEyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjI1OjE5Ljg5NzY2NTE2NVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzMwMzM4NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9oZWxwZXJzLmM9NDI5Nz1fX2JwZl9rZnVuYyB2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KVxcbi0tXFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDMwNS0vKipcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0MzA2OiAqIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlIC0gdmVyaWZ5IGEgUEtDUyM3IHNpZ25hdHVyZVxcbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMDctICogQGRhdGFfcDogZGF0YSB0byB2ZXJpZnlcXG4tLVxcbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMTUtICovXFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NDMxNjpfX2JwZl9rZnVuYyBpbnQgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKmRhdGFfcCxcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00MzE3LVxcdFxcdFxcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqc2lnX3AsXFxuLS1cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYz00ODU2PUJURl9JRF9GTEFHUyhmdW5jLCBicGZfa2V5X3B1dCwgS0ZfUkVMRUFTRSlcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00ODU3LSNpZmRlZiBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NDg1ODpCVEZfSURfRkxBR1MoZnVuYywgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUsIEtGX1NMRUVQQUJMRSlcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00ODU5LSNlbmRpZlxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jPTE5OTIzPXN0YXRpYyBpbnQgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTIwMDE1LVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoyMDAxNjpcXHRlcnIgPSBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgoc3RydWN0IGJwZl9keW5wdHIgKilcXHUwMDI2ZGF0YV9wdHIsXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTIwMDE3LVxcdFxcdFxcdFxcdFxcdCAoc3RydWN0IGJwZl9keW5wdHIgKilcXHUwMDI2c2lnX3B0ciwga2V5KTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDZUMjA6MjU6MjAuMDMwNzA5Njc1WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzQxOTY5MzYwNjUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqSW52ZXN0aWdhdGluZyB0aGUgQlBGIFNpZ25hdHVyZSBWZXJpZmljYXRpb24gRnVuY3Rpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGFuZCBuZWVkIHRvIHF1aWNrbHkgZmlndXJlIG91dCBpdHMgY29uZGl0aW9uYWwgY29tcGlsYXRpb24uIEkgcmVtZW1iZXIgc2VlaW5nIGl0cyBkZWZpbml0aW9uIGluIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AuIE15IG5leHQgdGhvdWdodCBpcyB0byBqdW1wIGRpcmVjdGx5IHRvIHRoYXQgZmlsZSB0byBjaGVjayBmb3IgYW55IGAjaWZkZWZgIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLiBJJ20gc3BlY2lmaWNhbGx5IGludGVyZXN0ZWQgaW4gd2hldGhlciBpdCdzIGd1YXJkZWQgYnkgdGhlIGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBmbGFnLiBUaGF0IGNvbmZpZ3VyYXRpb24gb3B0aW9uIG9mdGVuIHJlbGF0ZXMgdG8gZW5hYmxpbmcgc2VjdXJpdHkgZmVhdHVyZXMsIHNvIEkgc3VzcGVjdCB0aGlzIGZ1bmN0aW9uIG1pZ2h0IGJlIHRpZWQgdG8gYSBicm9hZGVyIHN5c3RlbSBkYXRhIHZlcmlmaWNhdGlvbiBzeXN0ZW0uIFVuZGVyc3RhbmRpbmcgaXRzIGNvbmRpdGlvbmFsIG5hdHVyZSBpcyBjcnVjaWFsIGZvciBmaWd1cmluZyBvdXQgd2hlbiBhbmQgaG93IHRoaXMgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBpcyBhY3RpdmUgaW4gdGhlIGtlcm5lbC4gVGhpcyB3aWxsIGxpa2VseSBpbmZvcm0gbWUgYWJvdXQgdGhlIHNjZW5hcmlvcyBpbiB3aGljaCBzaWduYXR1cmUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgb24gQlBGIHByb2dyYW1zIG9yIHJlbGF0ZWQgZGF0YS4gSSdtIGdvaW5nIHRvIGxvb2sgZm9yIHRoYXQgYCNpZmRlZmAgc3RhdGVtZW50IHJpZ2h0IG5vdy5cblxuXG4iLCJJbnB1dFRva2VucyI6NDc4MDYsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQyMDoyNTo1NC4yMjc2NDgxMTlaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNDU1NDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9oZWxwZXJzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDMwMCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiNDMwMDpcXHRcXHRcXHRrZXlfcHV0KGJrZXktXFx1MDAzZWtleSk7XFxuNDMwMTpcXHRcXG40MzAyOlxcdFxcdGtmcmVlKGJrZXkpO1xcbjQzMDM6XFx0fVxcbjQzMDQ6XFx0XFxuNDMwNTpcXHQvKipcXG40MzA2OlxcdCAqIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlIC0gdmVyaWZ5IGEgUEtDUyM3IHNpZ25hdHVyZVxcbjQzMDc6XFx0ICogQGRhdGFfcDogZGF0YSB0byB2ZXJpZnlcXG40MzA4OlxcdCAqIEBzaWdfcDogc2lnbmF0dXJlIG9mIHRoZSBkYXRhXFxuNDMwOTpcXHQgKiBAdHJ1c3RlZF9rZXlyaW5nOiBrZXlyaW5nIHdpdGgga2V5cyB0cnVzdGVkIGZvciBzaWduYXR1cmUgdmVyaWZpY2F0aW9uXFxuNDMxMDpcXHQgKlxcbjQzMTE6XFx0ICogVmVyaWZ5IHRoZSBQS0NTIzcgc2lnbmF0dXJlICpzaWdfcHRyKiBhZ2FpbnN0IHRoZSBzdXBwbGllZCAqZGF0YV9wdHIqXFxuNDMxMjpcXHQgKiB3aXRoIGtleXMgaW4gYSBrZXlyaW5nIHJlZmVyZW5jZWQgYnkgKnRydXN0ZWRfa2V5cmluZyouXFxuNDMxMzpcXHQgKlxcbjQzMTQ6XFx0ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuXFxuNDMxNTpcXHQgKi9cXG40MzE2OlxcdF9fYnBmX2tmdW5jIGludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wLFxcbjQzMTc6XFx0XFx0XFx0XFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpzaWdfcCxcXG40MzE4OlxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgYnBmX2tleSAqdHJ1c3RlZF9rZXlyaW5nKVxcbjQzMTk6XFx0e1xcbjQzMjA6XFx0I2lmZGVmIENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05cXG40MzIxOlxcdFxcdGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKmRhdGFfcHRyID0gKHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKilkYXRhX3A7XFxuNDMyMjpcXHRcXHRjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICpzaWdfcHRyID0gKHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKilzaWdfcDtcXG40MzIzOlxcdFxcdGNvbnN0IHZvaWQgKmRhdGEsICpzaWc7XFxuNDMyNDpcXHRcXHR1MzIgZGF0YV9sZW4sIHNpZ19sZW47XFxuNDMyNTpcXHRcXHRpbnQgcmV0O1xcbjQzMjY6XFx0XFxuNDMyNzpcXHRcXHRpZiAodHJ1c3RlZF9rZXlyaW5nLVxcdTAwM2VoYXNfcmVmKSB7XFxuNDMyODpcXHRcXHRcXHQvKlxcbjQzMjk6XFx0XFx0XFx0ICogRG8gdGhlIHBlcm1pc3Npb24gY2hlY2sgZGVmZXJyZWQgaW4gYnBmX2xvb2t1cF91c2VyX2tleSgpLlxcbjQzMzA6XFx0XFx0XFx0ICogU2VlIGJwZl9sb29rdXBfdXNlcl9rZXkoKSBmb3IgbW9yZSBkZXRhaWxzLlxcbjQzMzE6XFx0XFx0XFx0ICpcXG40MzMyOlxcdFxcdFxcdCAqIEEgY2FsbCB0byBrZXlfdGFza19wZXJtaXNzaW9uKCkgaGVyZSB3b3VsZCBiZSByZWR1bmRhbnQsIGFzXFxuNDMzMzpcXHRcXHRcXHQgKiBpdCBpcyBhbHJlYWR5IGRvbmUgYnkga2V5cmluZ19zZWFyY2goKSBjYWxsZWQgYnlcXG40MzM0OlxcdFxcdFxcdCAqIGZpbmRfYXN5bW1ldHJpY19rZXkoKS5cXG40MzM1OlxcdFxcdFxcdCAqL1xcbjQzMzY6XFx0XFx0XFx0cmV0ID0ga2V5X3ZhbGlkYXRlKHRydXN0ZWRfa2V5cmluZy1cXHUwMDNla2V5KTtcXG40MzM3OlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjQzMzg6XFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG40MzM5OlxcdFxcdH1cXG40MzQwOlxcdFxcbjQzNDE6XFx0XFx0ZGF0YV9sZW4gPSBfX2JwZl9keW5wdHJfc2l6ZShkYXRhX3B0cik7XFxuNDM0MjpcXHRcXHRkYXRhID0gX19icGZfZHlucHRyX2RhdGEoZGF0YV9wdHIsIGRhdGFfbGVuKTtcXG40MzQzOlxcdFxcdGlmICghZGF0YSlcXG40MzQ0OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjQzNDU6XFx0XFxuNDM0NjpcXHRcXHRzaWdfbGVuID0gX19icGZfZHlucHRyX3NpemUoc2lnX3B0cik7XFxuNDM0NzpcXHRcXHRzaWcgPSBfX2JwZl9keW5wdHJfZGF0YShzaWdfcHRyLCBzaWdfbGVuKTtcXG40MzQ4OlxcdFxcdGlmICghc2lnKVxcbjQzNDk6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjI1OjU0LjIyNzk5NjAzWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDc4MTQ4Njc3MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyB0aGVzZSB0aG91Z2h0czpcblxuKipBbmFseXppbmcgdGhlIEJQRiBQS0NTNyBWZXJpZmljYXRpb24gRnVuY3Rpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGhlcmUuIEludGVyZXN0aW5nLi4uIGl0J3MgZGVmaW5lZCByZWdhcmRsZXNzLCB3aGljaCBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIEJ1dCwgYXMgSSBzdXNwZWN0ZWQsIHRoZSBhY3R1YWwgKmltcGxlbWVudGF0aW9uKiBpcyBjb25kaXRpb25hbCwgYmFzZWQgb24gYCNpZmRlZiBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYC4gTXkgZ3V0IGZlZWxpbmcgaXMgdGhhdCBpZiB0aGF0IGNvbmZpZyBvcHRpb24gaXNuJ3Qgc2V0LCB0aGUgZnVuY3Rpb24gcHJvYmFibHkgcmV0dXJucyBgLUVPUE5PVFNVUFBgLiBUaGF0IHdvdWxkIGJlIGEgc3RhbmRhcmQgd2F5IHRvIHNpZ25hbCBcIm9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkXCIgaW4gdGhpcyBjb250ZXh0LiBJIHNob3VsZCBkb3VibGUtY2hlY2sgdGhhdCB0byBiZSBhYnNvbHV0ZWx5IHN1cmUsIHRob3VnaCDigJMgbm8gYXNzdW1wdGlvbnMgd2l0aG91dCBjb25maXJtYXRpb24hIEknbGwgcXVpY2tseSB2ZXJpZnkgdGhhdCByZXR1cm4gcGF0aCB3aXRoaW4gdGhlIGNvZGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ4OTAzLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQyMDoyNTo1OS4wMDk0ODU0MTFaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTg4MTMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9icGYvaGVscGVycy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQzNTAsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjQzNTA6XFx0XFxuNDM1MTpcXHRcXHRyZXR1cm4gdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShkYXRhLCBkYXRhX2xlbiwgc2lnLCBzaWdfbGVuLFxcbjQzNTI6XFx0XFx0XFx0XFx0XFx0ICAgICAgdHJ1c3RlZF9rZXlyaW5nLVxcdTAwM2VrZXksXFxuNDM1MzpcXHRcXHRcXHRcXHRcXHQgICAgICBWRVJJRllJTkdfQlBGX1NJR05BVFVSRSwgTlVMTCxcXG40MzU0OlxcdFxcdFxcdFxcdFxcdCAgICAgIE5VTEwpO1xcbjQzNTU6XFx0I2Vsc2VcXG40MzU2OlxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG40MzU3OlxcdCNlbmRpZiAvKiBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OICovXFxuNDM1ODpcXHR9XFxuNDM1OTpcXHQjZW5kaWYgLyogQ09ORklHX0tFWVMgKi9cXG40MzYwOlxcdFxcbjQzNjE6XFx0dHlwZWRlZiBpbnQgKCpicGZfdGFza193b3JrX2NhbGxiYWNrX3QpKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUpO1xcbjQzNjI6XFx0XFxuNDM2MzpcXHRlbnVtIGJwZl90YXNrX3dvcmtfc3RhdGUge1xcbjQzNjQ6XFx0XFx0LyogYnBmX3Rhc2tfd29yayBpcyByZWFkeSB0byBiZSB1c2VkICovXFxuNDM2NTpcXHRcXHRCUEZfVFdfU1RBTkRCWSA9IDAsXFxuNDM2NjpcXHRcXHQvKiBpcnEgd29yayBzY2hlZHVsaW5nIGluIHByb2dyZXNzICovXFxuNDM2NzpcXHRcXHRCUEZfVFdfUEVORElORyxcXG40MzY4OlxcdFxcdC8qIHRhc2sgd29yayBzY2hlZHVsaW5nIGluIHByb2dyZXNzICovXFxuNDM2OTpcXHRcXHRCUEZfVFdfU0NIRURVTElORyxcXG40MzcwOlxcdFxcdC8qIHRhc2sgd29yayBpcyBzY2hlZHVsZWQgc3VjY2Vzc2Z1bGx5ICovXFxuNDM3MTpcXHRcXHRCUEZfVFdfU0NIRURVTEVELFxcbjQzNzI6XFx0XFx0LyogY2FsbGJhY2sgaXMgcnVubmluZyAqL1xcbjQzNzM6XFx0XFx0QlBGX1RXX1JVTk5JTkcsXFxuNDM3NDpcXHRcXHQvKiBhc3NvY2lhdGVkIEJQRiBtYXAgdmFsdWUgaXMgZGVsZXRlZCAqL1xcbjQzNzU6XFx0XFx0QlBGX1RXX0ZSRUVELFxcbjQzNzY6XFx0fTtcXG40Mzc3OlxcdFxcbjQzNzg6XFx0c3RydWN0IGJwZl90YXNrX3dvcmtfY3R4IHtcXG40Mzc5OlxcdFxcdGVudW0gYnBmX3Rhc2tfd29ya19zdGF0ZSBzdGF0ZTtcXG40MzgwOlxcdFxcdHJlZmNvdW50X3QgcmVmY250O1xcbjQzODE6XFx0XFx0c3RydWN0IGNhbGxiYWNrX2hlYWQgd29yaztcXG40MzgyOlxcdFxcdHN0cnVjdCBpcnFfd29yayBpcnFfd29yaztcXG40MzgzOlxcdFxcdC8qIGJwZl9wcm9nIHRoYXQgc2NoZWR1bGVzIHRhc2sgd29yayAqL1xcbjQzODQ6XFx0XFx0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xcbjQzODU6XFx0XFx0LyogdGFzayBmb3Igd2hpY2ggY2FsbGJhY2sgaXMgc2NoZWR1bGVkICovXFxuNDM4NjpcXHRcXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7XFxuNDM4NzpcXHRcXHQvKiB0aGUgbWFwIGFuZCBtYXAgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dCAqL1xcbjQzODg6XFx0XFx0c3RydWN0IGJwZl9tYXAgKm1hcDtcXG40Mzg5OlxcdFxcdHZvaWQgKm1hcF92YWw7XFxuNDM5MDpcXHRcXHRlbnVtIHRhc2tfd29ya19ub3RpZnlfbW9kZSBtb2RlO1xcbjQzOTE6XFx0XFx0YnBmX3Rhc2tfd29ya19jYWxsYmFja190IGNhbGxiYWNrX2ZuO1xcbjQzOTI6XFx0XFx0c3RydWN0IHJjdV9oZWFkIHJjdTtcXG40MzkzOlxcdH0gX19hbGlnbmVkKDgpO1xcbjQzOTQ6XFx0XFxuNDM5NTpcXHQvKiBBY3R1YWwgdHlwZSBmb3Igc3RydWN0IGJwZl90YXNrX3dvcmsgKi9cXG40Mzk2OlxcdHN0cnVjdCBicGZfdGFza193b3JrX2tlcm4ge1xcbjQzOTc6XFx0XFx0c3RydWN0IGJwZl90YXNrX3dvcmtfY3R4ICpjdHg7XFxuNDM5ODpcXHR9O1xcbjQzOTk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjI1OjU5LjAxMDA3OTM0MVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzk2MTQ3MjQyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipFeGFtaW5pbmcgdGhlIEJQRiBWZXJpZmljYXRpb24gQ29kZSoqXG5cbk9rYXksIGhvbGQgb24gYSBzZWNvbmQuIEkganVzdCByZWFsaXplZCB0aGF0IGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAgaXMgYWxzbyBjb25kaXRpb25hbCwgcHJvdGVjdGVkIGJ5IHRoZSBgI2lmZGVmIENPTkZJR19LRVlTYCBkaXJlY3RpdmUuIFRoYXQncyBnb29kIHRvIGtub3csIG1ha2VzIHNlbnNlIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gTm93LCBJIHNob3VsZCBkb3VibGUgY2hlY2sgdG8gZW5zdXJlIHRoZSBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgaXMgZWl0aGVyIGFsd2F5cyBjb21waWxlZCBvciBhbHNvIGNvbmRpdGlvbmFsbHkgYnVpbHQuIFNvLCBJJ20gZ29pbmcgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGNvZGUgaW4gYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AgdG8gY2xhcmlmeSB0aGF0IHNwZWNpZmljIGRldGFpbC4gR290dGEgbWFrZSBzdXJlIEkgaGF2ZSBhIGNvbXBsZXRlIHBpY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ5OTE3LCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQyMDoyNjozNi45NzE1NTYwMTZaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTEwMDkyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvYnBmL3ZlcmlmaWVyLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTk4OTAsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxOTg5MDpcXHRcXHRcXHRpbnQgaWR4ID0gKmNudDtcXG4xOTg5MTpcXHRcXG4xOTg5MjpcXHRcXHRcXHRpbnNuX2J1ZltpZHgrK10gPSBsZF9hZGRyc1swXTtcXG4xOTg5MzpcXHRcXHRcXHRpbnNuX2J1ZltpZHgrK10gPSBsZF9hZGRyc1sxXTtcXG4xOTg5NDpcXHRcXHRcXHRpbnNuX2J1ZltpZHgrK10gPSAqaW5zbjtcXG4xOTg5NTpcXHRcXHRcXHQqY250ID0gaWR4O1xcbjE5ODk2OlxcdFxcdH1cXG4xOTg5NzpcXHRcXHRyZXR1cm4gMDtcXG4xOTg5ODpcXHR9XFxuMTk4OTk6XFx0XFxuMTk5MDA6XFx0c3RhdGljIGVudW0gYnBmX3NpZ19rZXlyaW5nIGJwZl9jbGFzc2lmeV9rZXlyaW5nKHMzMiBrZXlyaW5nX2lkKVxcbjE5OTAxOlxcdHtcXG4xOTkwMjpcXHRcXHRzd2l0Y2ggKGtleXJpbmdfaWQpIHtcXG4xOTkwMzpcXHRcXHRjYXNlIDA6XFxuMTk5MDQ6XFx0XFx0XFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19CVUlMVElOO1xcbjE5OTA1OlxcdFxcdGNhc2UgKHMzMikodW5zaWduZWQgbG9uZylWRVJJRllfVVNFX1NFQ09OREFSWV9LRVlSSU5HOlxcbjE5OTA2OlxcdFxcdFxcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfU0VDT05EQVJZO1xcbjE5OTA3OlxcdFxcdGNhc2UgKHMzMikodW5zaWduZWQgbG9uZylWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkc6XFxuMTk5MDg6XFx0XFx0XFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19QTEFURk9STTtcXG4xOTkwOTpcXHRcXHRkZWZhdWx0OlxcbjE5OTEwOlxcdFxcdFxcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfVVNFUjtcXG4xOTkxMTpcXHRcXHR9XFxuMTk5MTI6XFx0fVxcbjE5OTEzOlxcdFxcbjE5OTE0OlxcdC8qXFxuMTk5MTU6XFx0ICogVmVyaWZ5IHRoZSBQS0NTIzcgc2lnbmF0dXJlIG9mIGEgbG9hZGVkIHByb2dyYW0uIENhbGxlZCBmcm9tIGJwZl9jaGVjaygpXFxuMTk5MTY6XFx0ICogb25jZSB0aGUgcHJvZ3JhbSdzIG1ldGFkYXRhIG1hcHMgaGF2ZSBiZWVuIHJlc29sdmVkIGludG8gdXNlZF9tYXBzLCBzb1xcbjE5OTE3OlxcdCAqIHRoZSBleGFjdCBtYXBzIGZvbGRlZCBpbnRvIHRoZSBzaWduYXR1cmUgYXJlIHRoZSBvbmVzIHRoZSBwcm9ncmFtIGJpbmRzLlxcbjE5OTE4OlxcdCAqXFxuMTk5MTk6XFx0ICogVGhlIHNpZ25hdHVyZSBjb3ZlcnMgdGhlIGluc3RydWN0aW9ucyBmb2xsb3dlZCBieSB0aGUgZnJvemVuIGNvbnRlbnRzIG9mXFxuMTk5MjA6XFx0ICogZWFjaCBtYXAsIGluIEBtYXBzIG9yZGVyOiBpbnNucyB8fCBtYXBfMCB8fCBtYXBfMSB8fCBbLi4uXS4gT24gc3VjY2VzcyB0aGVcXG4xOTkyMTpcXHQgKiB2ZXJkaWN0IGFuZCBrZXlyaW5nIGluZm8gYXJlIHJlY29yZGVkIG9uIHByb2ctXFx1MDAzZWF1eC5cXG4xOTkyMjpcXHQgKi9cXG4xOTkyMzpcXHRzdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG4xOTkyNDpcXHRcXHRcXHRcXHRcXHQgICAgIHVuaW9uIGJwZl9hdHRyICphdHRyLCBib29sIGlzX2tlcm5lbClcXG4xOTkyNTpcXHR7XFxuMTk5MjY6XFx0XFx0YnBmcHRyX3QgdXNpZyA9IG1ha2VfYnBmcHRyKGF0dHItXFx1MDAzZXNpZ25hdHVyZSwgaXNfa2VybmVsKTtcXG4xOTkyNzpcXHRcXHRzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuIHNpZ19wdHIsIGRhdGFfcHRyO1xcbjE5OTI4OlxcdFxcdHN0cnVjdCBicGZfcHJvZyAqcHJvZyA9IGVudi1cXHUwMDNlcHJvZztcXG4xOTkyOTpcXHRcXHRzdHJ1Y3QgYnBmX21hcCAqKm1hcHMgPSBlbnYtXFx1MDAzZXVzZWRfbWFwcztcXG4xOTkzMDpcXHRcXHRzdHJ1Y3QgYnBmX2tleSAqa2V5ID0gTlVMTDtcXG4xOTkzMTpcXHRcXHR2b2lkICpzaWcsICpkYXRhID0gTlVMTDtcXG4xOTkzMjpcXHRcXHR1MzIgbWFwX2NudCA9IGVudi1cXHUwMDNldXNlZF9tYXBfY250O1xcbjE5OTMzOlxcdFxcdHUzMiBpLCBvZmYsIGluc25zX3N6O1xcbjE5OTM0OlxcdFxcdHU2NCBkYXRhX3N6O1xcbjE5OTM1OlxcdFxcdGludCBlcnIgPSAwO1xcbjE5OTM2OlxcdFxcbjE5OTM3OlxcdFxcdC8qXFxuMTk5Mzg6XFx0XFx0ICogRG9uJ3QgYXR0ZW1wdCB0byB1c2Uga21hbGxvY19sYXJnZSBvciB2bWFsbG9jIGZvciBzaWduYXR1cmVzLlxcbjE5OTM5OlxcdFxcdCAqIFByYWN0aWNhbCBzaWduYXR1cmUgZm9yIEJQRiBwcm9ncmFtIHNob3VsZCBiZSBiZWxvdyB0aGlzIGxpbWl0LlxcbjE5OTQwOlxcdFxcdCAqL1xcbjE5OTQxOlxcdFxcdGlmIChhdHRyLVxcdTAwM2VzaWduYXR1cmVfc2l6ZSBcXHUwMDNlIEtNQUxMT0NfTUFYX0NBQ0hFX1NJWkUpXFxuMTk5NDI6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMTk5NDM6XFx0XFx0aWYgKHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItXFx1MDAzZWtleXJpbmdfaWQpID09IDApXFxuMTk5NDQ6XFx0XFx0XFx0a2V5ID0gYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KGF0dHItXFx1MDAzZWtleXJpbmdfaWQpO1xcbjE5OTQ1OlxcdFxcdGVsc2VcXG4xOTk0NjpcXHRcXHRcXHRrZXkgPSBicGZfbG9va3VwX3VzZXJfa2V5KGF0dHItXFx1MDAzZWtleXJpbmdfaWQsIDApO1xcbjE5OTQ3OlxcdFxcdGlmICgha2V5KSB7XFxuMTk5NDg6XFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJjYW5ub3QgcmVzb2x2ZSBzaWduaW5nIGtleXJpbmcgd2l0aCBrZXlyaW5nX2lkICVkXFxcXG5cXFwiLFxcbjE5OTQ5OlxcdFxcdFxcdFxcdGF0dHItXFx1MDAzZWtleXJpbmdfaWQpO1xcbjE5OTUwOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjE5OTUxOlxcdFxcdH1cXG4xOTk1MjpcXHRcXG4xOTk1MzpcXHRcXHRzaWcgPSBrdm1lbWR1cF9icGZwdHIodXNpZywgYXR0ci1cXHUwMDNlc2lnbmF0dXJlX3NpemUpO1xcbjE5OTU0OlxcdFxcdGlmIChJU19FUlIoc2lnKSkge1xcbjE5OTU1OlxcdFxcdFxcdGJwZl9rZXlfcHV0KGtleSk7XFxuMTk5NTY6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIoc2lnKTtcXG4xOTk1NzpcXHRcXHR9XFxuMTk5NTg6XFx0XFxuMTk5NTk6XFx0XFx0aW5zbnNfc3ogPSBwcm9nLVxcdTAwM2VsZW4gKiBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKTtcXG4xOTk2MDpcXHRcXHRkYXRhX3N6ID0gaW5zbnNfc3o7XFxuMTk5NjE6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG1hcF9jbnQ7IGkrKykge1xcbjE5OTYyOlxcdFxcdFxcdHN0cnVjdCBicGZfbWFwICptYXAgPSBtYXBzW2ldO1xcbjE5OTYzOlxcdFxcbjE5OTY0OlxcdFxcdFxcdGlmIChtYXAtXFx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9BUlJBWSB8fFxcbjE5OTY1OlxcdFxcdFxcdCAgICAhbWFwLVxcdTAwM2VvcHMtXFx1MDAzZW1hcF9kaXJlY3RfdmFsdWVfYWRkcikge1xcbjE5OTY2OlxcdFxcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwic2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICclcycgbXVzdCBiZSBhbiBhcnJheVxcXFxuXFxcIixcXG4xOTk2NzpcXHRcXHRcXHRcXHRcXHRtYXAtXFx1MDAzZW5hbWUpO1xcbjE5OTY4OlxcdFxcdFxcdFxcdGVyciA9IC1FSU5WQUw7XFxuMTk5Njk6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuMTk5NzA6XFx0XFx0XFx0fVxcbjE5OTcxOlxcdFxcdFxcdGlmICghUkVBRF9PTkNFKG1hcC1cXHUwMDNlZnJvemVuKSkge1xcbjE5OTcyOlxcdFxcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwic2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICclcycgbXVzdCBiZSBmcm96ZW5cXFxcblxcXCIsXFxuMTk5NzM6XFx0XFx0XFx0XFx0XFx0bWFwLVxcdTAwM2VuYW1lKTtcXG4xOTk3NDpcXHRcXHRcXHRcXHRlcnIgPSAtRVBFUk07XFxuMTk5NzU6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuMTk5NzY6XFx0XFx0XFx0fVxcbjE5OTc3OlxcdFxcdFxcdGlmICghbWFwLVxcdTAwM2VleGNsX3Byb2dfc2hhKSB7XFxuMTk5Nzg6XFx0XFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJzaWduZWQgcHJvZ3JhbSBtZXRhZGF0YSBtYXAgJyVzJyBtdXN0IGJlIGV4Y2x1c2l2ZVxcXFxuXFxcIixcXG4xOTk3OTpcXHRcXHRcXHRcXHRcXHRtYXAtXFx1MDAzZW5hbWUpO1xcbjE5OTgwOlxcdFxcdFxcdFxcdGVyciA9IC1FUEVSTTtcXG4xOTk4MTpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4xOTk4MjpcXHRcXHRcXHR9XFxuMTk5ODM6XFx0XFx0XFx0ZGF0YV9zeiArPSBtYXAtXFx1MDAzZXZhbHVlX3NpemU7XFxuMTk5ODQ6XFx0XFx0fVxcbjE5OTg1OlxcdFxcdGlmIChicGZfZHlucHRyX2NoZWNrX3NpemUoZGF0YV9zeikpIHtcXG4xOTk4NjpcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcInNpZ25lZCBwYXlsb2FkIHRvbyBsYXJnZTogJWxsdSBieXRlc1xcXFxuXFxcIiwgZGF0YV9zeik7XFxuMTk5ODc6XFx0XFx0XFx0ZXJyID0gLUUyQklHO1xcbjE5OTg4OlxcdFxcdFxcdGdvdG8gb3V0O1xcbjE5OTg5OlxcdFxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDZUMjA6MjY6MzYuOTcyNjYwNjU2WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjIzNTE1MDQyMDUwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlVucmF2ZWxpbmcgdGhlIENvbmRpdGlvbmFsIENvbXBpbGF0aW9uIG9mIEJQRiBTaWduYXR1cmUgVmVyaWZpY2F0aW9uKipcblxuT2theSwgc28gYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIGlzIGFsd2F5cyBjb21waWxlZCwgd2hpY2ggc2VlbXMgc3RyYWlnaHRmb3J3YXJkIGVub3VnaC4gQnV0IGhlcmUncyB0aGUga2lja2VyOiBpdCAqY2FsbHMqIGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAuIEFuZCAqdGhhdCogZnVuY3Rpb24sIGFzIEkgcmVjYWxsLCBpcyB0dWNrZWQgYXdheSBpbiBga2VybmVsL2JwZi9oZWxwZXJzLmNgIGFuZCBpcyBjb25kaXRpb25hbCBvbiBgI2lmZGVmIENPTkZJR19LRVlTYC4gVGhpcyBpbW1lZGlhdGVseSByYWlzZXMgYSBmbGFnLiBJZiBgQ09ORklHX0tFWVNgIGlzbid0IGVuYWJsZWQsIHNob3VsZG4ndCB0aGUgY29tcGlsZXIgYmUgdGhyb3dpbmcgYSBmaXQ/IElzIGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAgZXZlbiAqZGVmaW5lZCogaW4gdGhlIGFic2VuY2Ugb2YgYENPTkZJR19LRVlTYD8gSXQgZmVlbHMgbGlrZSBhIHBvdGVudGlhbCBidWlsZC10aW1lIGlzc3VlIGp1c3Qgd2FpdGluZyB0byBzdXJmYWNlLlxuXG5JJ2QgYmV0dGVyIGRvdWJsZS1jaGVjayB0aGUgaW5jbHVkZXMsIHNwZWNpZmljYWxseSBgaW5jbHVkZS9saW51eC9icGYuaGAsIHRvIHNlZSBpZiBteSBtZW1vcnkgaXMgZmFpbGluZyBtZSBvciBpZiB0aGVyZSdzIGEgZGlzY29ubmVjdCBzb21ld2hlcmUuIExldCBtZSBzZWUuLi4gSSBuZWVkIHRvIHZlcmlmeSBob3cgYGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlYCBpcyBhY3R1YWxseSBkZWNsYXJlZCBpbiB0aGF0IGhlYWRlciBmaWxlLiBUaW1lIHRvIG1ha2Ugc3VyZSB0aGlzIGNvZGUgd2lsbCBhY3R1YWxseSBidWlsZCBjb3JyZWN0bHkhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUxODc1LCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTA3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDZUMjA6Mjc6MDAuNDg3NzA4MTE2WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM1NjAzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJpbmNsdWRlL2xpbnV4L2JwZi5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM4MjAsXG4gIFwiTGluZUNvdW50XCI6IDUwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjM4MjA6XFx0c3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfdXNlcl9rZXkoczMyIHNlcmlhbCwgdTY0IGZsYWdzKTtcXG4zODIxOlxcdHN0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX3N5c3RlbV9rZXkodTY0IGlkKTtcXG4zODIyOlxcdHZvaWQgYnBmX2tleV9wdXQoc3RydWN0IGJwZl9rZXkgKmJrZXkpO1xcbjM4MjM6XFx0aW50IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpkYXRhX3AsXFxuMzgyNDpcXHRcXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnNpZ19wLFxcbjM4MjU6XFx0XFx0XFx0XFx0ICAgICAgIHN0cnVjdCBicGZfa2V5ICp0cnVzdGVkX2tleXJpbmcpO1xcbjM4MjY6XFx0XFxuMzgyNzpcXHRzdGF0aWMgaW5saW5lIHMzMiBicGZfa2V5X3NlcmlhbChjb25zdCBzdHJ1Y3QgYnBmX2tleSAqa2V5KVxcbjM4Mjg6XFx0e1xcbjM4Mjk6XFx0XFx0cmV0dXJuIGtleS1cXHUwMDNlaGFzX3JlZiA/IGtleS1cXHUwMDNla2V5LVxcdTAwM2VzZXJpYWwgOiAwO1xcbjM4MzA6XFx0fVxcbjM4MzE6XFx0I2Vsc2VcXG4zODMyOlxcdHN0YXRpYyBpbmxpbmUgc3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfdXNlcl9rZXkodTMyIHNlcmlhbCwgdTY0IGZsYWdzKVxcbjM4MzM6XFx0e1xcbjM4MzQ6XFx0XFx0cmV0dXJuIE5VTEw7XFxuMzgzNTpcXHR9XFxuMzgzNjpcXHRcXG4zODM3OlxcdHN0YXRpYyBpbmxpbmUgc3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfc3lzdGVtX2tleSh1NjQgaWQpXFxuMzgzODpcXHR7XFxuMzgzOTpcXHRcXHRyZXR1cm4gTlVMTDtcXG4zODQwOlxcdH1cXG4zODQxOlxcdFxcbjM4NDI6XFx0c3RhdGljIGlubGluZSB2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KVxcbjM4NDM6XFx0e1xcbjM4NDQ6XFx0fVxcbjM4NDU6XFx0XFxuMzg0NjpcXHRzdGF0aWMgaW5saW5lIGludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wLFxcbjM4NDc6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqc2lnX3AsXFxuMzg0ODpcXHRcXHRcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBicGZfa2V5ICp0cnVzdGVkX2tleXJpbmcpXFxuMzg0OTpcXHR7XFxuMzg1MDpcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuMzg1MTpcXHR9XFxuMzg1MjpcXHRcXG4zODUzOlxcdHN0YXRpYyBpbmxpbmUgczMyIGJwZl9rZXlfc2VyaWFsKGNvbnN0IHN0cnVjdCBicGZfa2V5ICprZXkpXFxuMzg1NDpcXHR7XFxuMzg1NTpcXHRcXHRyZXR1cm4gMDtcXG4zODU2OlxcdH1cXG4zODU3OlxcdCNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19LRVlTKSBcXHUwMDI2XFx1MDAyNiBkZWZpbmVkKENPTkZJR19CUEZfU1lTQ0FMTCkgKi9cXG4zODU4OlxcdFxcbjM4NTk6XFx0LyogdmVyaWZpZXIgcHJvdG90eXBlcyBmb3IgaGVscGVyIGZ1bmN0aW9ucyBjYWxsZWQgZnJvbSBlQlBGIHByb2dyYW1zICovXFxuMzg2MDpcXHRleHRlcm4gY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9tYXBfbG9va3VwX2VsZW1fcHJvdG87XFxuMzg2MTpcXHRleHRlcm4gY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9tYXBfdXBkYXRlX2VsZW1fcHJvdG87XFxuMzg2MjpcXHRleHRlcm4gY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9tYXBfZGVsZXRlX2VsZW1fcHJvdG87XFxuMzg2MzpcXHRleHRlcm4gY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9tYXBfcHVzaF9lbGVtX3Byb3RvO1xcbjM4NjQ6XFx0ZXh0ZXJuIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX3BvcF9lbGVtX3Byb3RvO1xcbjM4NjU6XFx0ZXh0ZXJuIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX3BlZWtfZWxlbV9wcm90bztcXG4zODY2OlxcdGV4dGVybiBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX21hcF9sb29rdXBfcGVyY3B1X2VsZW1fcHJvdG87XFxuMzg2NzpcXHRcXG4zODY4OlxcdGV4dGVybiBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX2dldF9wcmFuZG9tX3UzMl9wcm90bztcXG4zODY5OlxcdGV4dGVybiBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX2dldF9zbXBfcHJvY2Vzc29yX2lkX3Byb3RvO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQyMDoyNzowMC40ODgwNjY3ODZaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTYwNTM3NTQzNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEtlcm5lbCdzIFNpZ25hdHVyZSBWZXJpZmljYXRpb24gTG9naWMqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIGhvdyB0aGUgQlBGIHZlcmlmaWVyIGhhbmRsZXMgc2lnbmF0dXJlcywgc3BlY2lmaWNhbGx5IGluIHRoZSBhYnNlbmNlIG9mIGNlcnRhaW4ga2VybmVsIGNvbmZpZ3VyYXRpb25zLiBNeSBpbml0aWFsIHRob3VnaHQgd2FzIHRoYXQgaWYgYENPTkZJR19LRVlTYCBpc24ndCBlbmFibGVkLCBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGp1c3QgYmFpbHMgb3V0IHdpdGggYW4gYC1FT1BOT1RTVVBQYCBlcnJvci4gQnV0IHdhaXQsIGl0J3MgbW9yZSBudWFuY2VkIHRoYW4gdGhhdC4gTG9va2luZyBhdCB0aGUgY29kZSBmb3IgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgLCBpdCBjYWxscyBlaXRoZXIgYGJwZl9sb29rdXBfc3lzdGVtX2tleWAgb3IgYGJwZl9sb29rdXBfdXNlcl9rZXlgLiBJZiBgQ09ORklHX0tFWVNgIGlzbid0IHNldCwgKnRob3NlKiBmdW5jdGlvbnMgYWN0dWFsbHkgcmV0dXJuIGBOVUxMYC5cblxuTm93LCBsZXQncyB0cmFjZSB0aGlzIGZ1cnRoZXIuIFRoZSBjb2RlIGZsb3cgaW4gYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIGRvZXMgYSBsb29rdXAgYmFzZWQgb24gYGF0dHItXHUwMDNla2V5cmluZ19pZGA6XG5cbmBgYGNcblx0aWYgKHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItXHUwMDNla2V5cmluZ19pZCkgPT0gMClcblx0XHRrZXkgPSBicGZfbG9va3VwX3N5c3RlbV9rZXkoYXR0ci1cdTAwM2VrZXlyaW5nX2lkKTtcblx0ZWxzZVxuXHRcdGtleSA9IGJwZl9sb29rdXBfdXNlcl9rZXkoYXR0ci1cdTAwM2VrZXlyaW5nX2lkLCAwKTtcblx0aWYgKCFrZXkpIHtcblx0XHR2ZXJib3NlKGVudiwgXCJjYW5ub3QgcmVzb2x2ZSBzaWduaW5nIGtleXJpbmcgd2l0aCBrZXlyaW5nX2lkICVkXFxuXCIsXG5cdFx0XHRhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuXHRcdHJldHVybiAtRUlOVkFMO1xuXHR9XG5gYGBcblxuU28sIGlmIGBDT05GSUdfS0VZU2AgaXMgb2ZmLCBga2V5YCBlbmRzIHVwIGJlaW5nIGBOVUxMYCBiZWNhdXNlIHRob3NlIGxvb2t1cCBmdW5jdGlvbnMgcmV0dXJuIGBOVUxMYCwgYW5kIHRoZSBjb2RlICpzaG91bGQqIHJldHVybiBgLUVJTlZBTGAuIFRoaXMgaXMgYW4gaW1wb3J0YW50IGRpc3RpbmN0aW9uIGFuZCBtZWFucyB0aGUgaW5pdGlhbCBhc3N1bXB0aW9uIHdhcyBpbmNvcnJlY3QuXG5cbkNvbnNlcXVlbnRseSwgdG8gcHJvcGVybHkgdGVzdCB0aGlzIHBhcnRpY3VsYXIgY29kZSBwYXRoLCBJJ2xsIG5lZWQgKmJvdGgqIGBDT05GSUdfS0VZU2AgYW5kIGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBlbmFibGVkLiBIYW5nIG9uLi4uIGlzbid0IGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCB0aGUgZmxhZyB0aGF0IGVuYWJsZXMgdGhlIFBLQ1M3IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gaW4gdGhlIGZpcnN0IHBsYWNlPyBBaGEhIE9rYXksIHNvIEkgc2hvdWxkIG5vdyBnbyBjaGVjayB0aGUgYGluaXQvS2NvbmZpZ2Agb3IgYGNlcnRzL0tjb25maWdgIGZpbGVzIHRvIHZlcmlmeSBob3cgYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzIGRlZmluZWQgYW5kIGhvdyBpdCByZWxhdGVzIHRvIHRoaXMgdmVyaWZpY2F0aW9uIGNvZGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUzMTY4LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzIwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDZUMjA6Mjc6MDYuMDkzNDQ0NTIxWiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNDAxOTM3OTQyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBTWVNURU1fREFUQV9WRVJJRklDQVRJT05cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5pdC9LY29uZmlnPTIxODE9ZW5kbWVudVxcbmluaXQvS2NvbmZpZy0yMTgyLVxcbmluaXQvS2NvbmZpZzoyMTgzOmNvbmZpZyBTWVNURU1fREFUQV9WRVJJRklDQVRJT05cXG5pbml0L0tjb25maWctMjE4NC1cXHRkZWZfYm9vbCBuXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjI3OjA5LjQ5NTM5NDM2NFoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxOTY5OTk1Njg2OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQncyBpbnRlcm5hbCBtb25vbG9ndWU6XG5cbioqSW52ZXN0aWdhdGluZyBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OKipcblxuQWxyaWdodCwgc28gYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzIGEgYm9vbGVhbiwgc3RyYWlnaHQgZm9yd2FyZCBlbm91Z2guIFRoZSByZWFsIHF1ZXN0aW9uIGlzLCB3aGF0J3MgKmRyaXZpbmcqIGl0cyBzZWxlY3Rpb24/IEl0J3MgY2xlYXJseSBhIGRlcGVuZGVuY3kgZm9yIHRoaW5ncyBsaWtlIGBNT0RVTEVfU0lHYCwgYEtFWEVDX1NJR2AsIGFuZCBgQlBGX1NZU0NBTExgLCBhbmQgSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGxhcmdlciBjb250ZXh0LiBJcyB0aGVyZSBhbnl0aGluZyBlbHNlIHRoYXQgZW5hYmxlcyBpdD8gTmVlZCB0byBxdWlja2x5IHRyYWNlIHRoYXQgYmFjayBhbmQgY2hlY2sgdGhlIGRlcGVuZGVuY2llcy4gTGV0J3MgZGlnIGluIGFuZCBzZWUgd2hhdCdzIGdvaW5nIG9uIHVwc3RyZWFtLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NDA1NywiT3V0cHV0VG9rZW5zIjoyMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjI3OjI5LjE5NTM1NjEwMVoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjg5Nzk3NzUyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzZWxlY3QgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImFyY2gvczM5MC9LY29uZmlnPTc1PWNvbmZpZyBTMzkwXFxuLS1cXG5hcmNoL3MzOTAvS2NvbmZpZy0yNzgtXFx0c2VsZWN0IFNZU0NUTF9FWENFUFRJT05fVFJBQ0VcXG5hcmNoL3MzOTAvS2NvbmZpZzoyNzk6XFx0c2VsZWN0IFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTiBpZiBLRVhFQ19TSUdcXG5hcmNoL3MzOTAvS2NvbmZpZy0yODAtXFx0c2VsZWN0IFRIUkVBRF9JTkZPX0lOX1RBU0tcXG4tLVxcbmRyaXZlcnMvbWQvS2NvbmZpZz01ODE9Y29uZmlnIERNX1ZFUklUWV9WRVJJRllfUk9PVEhBU0hfU0lHXFxuLS1cXG5kcml2ZXJzL21kL0tjb25maWctNTgzLVxcdGRlcGVuZHMgb24gRE1fVkVSSVRZXFxuZHJpdmVycy9tZC9LY29uZmlnOjU4NDpcXHRzZWxlY3QgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXFxuZHJpdmVycy9tZC9LY29uZmlnLTU4NS1cXHRoZWxwXFxuLS1cXG5mcy91Ymlmcy9LY29uZmlnPTg5PWNvbmZpZyBVQklGU19GU19BVVRIRU5USUNBVElPTlxcbi0tXFxuZnMvdWJpZnMvS2NvbmZpZy05Mi1cXHRzZWxlY3QgQ1JZUFRPX0hNQUNcXG5mcy91Ymlmcy9LY29uZmlnOjkzOlxcdHNlbGVjdCBTWVNURU1fREFUQV9WRVJJRklDQVRJT05cXG5mcy91Ymlmcy9LY29uZmlnLTk0LVxcdGhlbHBcXG4tLVxcbmZzL3Zlcml0eS9LY29uZmlnPTM0PWNvbmZpZyBGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTXFxuLS1cXG5mcy92ZXJpdHkvS2NvbmZpZy0zNi1cXHRkZXBlbmRzIG9uIEZTX1ZFUklUWVxcbmZzL3Zlcml0eS9LY29uZmlnOjM3OlxcdHNlbGVjdCBTWVNURU1fREFUQV9WRVJJRklDQVRJT05cXG5mcy92ZXJpdHkvS2NvbmZpZy0zOC1cXHRoZWxwXFxuLS1cXG5pbml0L0tjb25maWc9MjI2Nz1jb25maWcgTU9EVUxFX1NJR19GT1JNQVRcXG5pbml0L0tjb25maWctMjI2OC1cXHRkZWZfYm9vbCBuXFxuaW5pdC9LY29uZmlnOjIyNjk6XFx0c2VsZWN0IFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlxcbmluaXQvS2NvbmZpZy0yMjcwLVxcbi0tXFxubmV0L3dpcmVsZXNzL0tjb25maWc9ODk9Y29uZmlnIENGRzgwMjExX1JFUVVJUkVfU0lHTkVEX1JFR0RCXFxuLS1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy05MS1cXHRkZWZhdWx0IHlcXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzo5MjpcXHRzZWxlY3QgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXFxubmV0L3dpcmVsZXNzL0tjb25maWctOTMtXFx0aGVscFxcbi0tXFxuc2VjdXJpdHkvaXBlL0tjb25maWc9Nj1tZW51Y29uZmlnIFNFQ1VSSVRZX0lQRVxcbi0tXFxuc2VjdXJpdHkvaXBlL0tjb25maWctMTAtXFx0c2VsZWN0IFBLQ1M3X01FU1NBR0VfUEFSU0VSXFxuc2VjdXJpdHkvaXBlL0tjb25maWc6MTE6XFx0c2VsZWN0IFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlxcbnNlY3VyaXR5L2lwZS9LY29uZmlnLTEyLVxcdHNlbGVjdCBJUEVfUFJPUF9ETV9WRVJJVFkgaWYgRE1fVkVSSVRZXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjI3OjMyLjA5MzM0ODUyMVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo2MjQ0MzgzNjc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk5hdmlnYXRpbmcgdGhlIEtjb25maWcgTGFieXJpbnRoKipcblxuT2theSwgc28gdGhlIGdvYWwgaXMgdG8gZW5hYmxlIGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYC4gTXkgaW5pdGlhbCB0aG91Z2h0IHdhcyB0byBqdXN0IHNldCBpdCBkaXJlY3RseSwgYnV0IHRoZW4gSSByZWFsaXplZCBpdCdzIGRlZmluZWQgYXMgYSBgZGVmX2Jvb2wgbmAuIFRoYXQgbWVhbnMgSSBjYW4ndCBlbmFibGUgaXQgdW5sZXNzIHRoZXJlJ3MgYSBwcm9tcHQgYXNzb2NpYXRlZCB3aXRoIGl0LiBCdXQgYSBxdWljayBjaGVjayByZXZlYWxzIHRoZXJlJ3Mgbm8gdmlzaWJsZSBwcm9tcHQuIFNvLCBJIG5lZWQgdG8gZmluZCBhIGRpZmZlcmVudCBzdHJhdGVneS4gSSBuZWVkIHRvIGVuYWJsZSBzb21ldGhpbmcgdGhhdCAqc2VsZWN0cyogYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAuIEkgaGFkIHRoZSBpZGVhIHRvIHVzZSBgQ09ORklHX01PRFVMRV9TSUdfRk9STUFUYCBvciBgQ09ORklHX0ZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNgLiBVbmZvcnR1bmF0ZWx5LCBgQ09ORklHX01PRFVMRV9TSUdfRk9STUFUYCBpcyBhbHNvIGEgYGRlZl9ib29sIG5gLiBMb29rcyBsaWtlIEkgY2FuJ3QgdXNlIGl0LiBPa2F5LCB0aW1lIHRvIGRpZyBkZWVwZXIuIEknbGwgZm9jdXMgbXkgc2VhcmNoIG9uIGBNT0RVTEVfU0lHYCBhbmQgd2lsbCBjaGVjayBgaW5pdC9LY29uZmlnYCB0byBzZWUgd2hhdCBpcyBnb2luZyBvbiB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTQ4NTMsIk91dHB1dFRva2VucyI6MTgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMjQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDZUMjA6Mjc6MzguMzM3NzM1NDk4WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyODkwODM2NTIxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBNT0RVTEVfU0lHXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImNlcnRzL0tjb25maWc9Mj1tZW51IFxcXCJDZXJ0aWZpY2F0ZXMgZm9yIHNpZ25hdHVyZSBjaGVja2luZ1xcXCJcXG5jZXJ0cy9LY29uZmlnLTMtXFxuY2VydHMvS2NvbmZpZzo0OmNvbmZpZyBNT0RVTEVfU0lHX0tFWVxcbmNlcnRzL0tjb25maWctNS1cXHRzdHJpbmcgXFxcIkZpbGUgbmFtZSBvciBQS0NTIzExIFVSSSBvZiBtb2R1bGUgc2lnbmluZyBrZXlcXFwiXFxuLS1cXG5jZXJ0cy9LY29uZmlnPTE4PWNob2ljZVxcbi0tXFxuY2VydHMvS2NvbmZpZy0yNC1cXG5jZXJ0cy9LY29uZmlnOjI1OmNvbmZpZyBNT0RVTEVfU0lHX0tFWV9UWVBFX1JTQVxcbmNlcnRzL0tjb25maWctMjYtXFx0Ym9vbCBcXFwiUlNBXFxcIlxcbi0tXFxuY2VydHMvS2NvbmZpZy0yOS1cXG5jZXJ0cy9LY29uZmlnOjMwOmNvbmZpZyBNT0RVTEVfU0lHX0tFWV9UWVBFX0VDRFNBXFxuY2VydHMvS2NvbmZpZy0zMS1cXHRib29sIFxcXCJFQ0RTQVxcXCJcXG4tLVxcbmNlcnRzL0tjb25maWctNDEtXFxuY2VydHMvS2NvbmZpZzo0Mjpjb25maWcgTU9EVUxFX1NJR19LRVlfVFlQRV9NTERTQV80NFxcbmNlcnRzL0tjb25maWctNDMtXFx0Ym9vbCBcXFwiTUwtRFNBLTQ0XFxcIlxcbi0tXFxuY2VydHMvS2NvbmZpZy01Mi1cXG5jZXJ0cy9LY29uZmlnOjUzOmNvbmZpZyBNT0RVTEVfU0lHX0tFWV9UWVBFX01MRFNBXzY1XFxuY2VydHMvS2NvbmZpZy01NC1cXHRib29sIFxcXCJNTC1EU0EtNjVcXFwiXFxuLS1cXG5jZXJ0cy9LY29uZmlnLTYzLVxcbmNlcnRzL0tjb25maWc6NjQ6Y29uZmlnIE1PRFVMRV9TSUdfS0VZX1RZUEVfTUxEU0FfODdcXG5jZXJ0cy9LY29uZmlnLTY1LVxcdGJvb2wgXFxcIk1MLURTQS04N1xcXCJcXG4tLVxcbmluaXQvS2NvbmZpZz0yMjYzPWNvbmZpZyBSVF9NVVRFWEVTXFxuLS1cXG5pbml0L0tjb25maWctMjI2Ni1cXG5pbml0L0tjb25maWc6MjI2Nzpjb25maWcgTU9EVUxFX1NJR19GT1JNQVRcXG5pbml0L0tjb25maWctMjI2OC1cXHRkZWZfYm9vbCBuXFxuLS1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWc9MjQxPWNvbmZpZyBNT0RVTEVfU1JDVkVSU0lPTl9BTExcXG4tLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0yNTEtXFxua2VybmVsL21vZHVsZS9LY29uZmlnOjI1Mjpjb25maWcgTU9EVUxFX1NJR1xcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0yNTMtXFx0Ym9vbCBcXFwiTW9kdWxlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb25cXFwiXFxuLS1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMjczLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzoyNzQ6Y29uZmlnIE1PRFVMRV9TSUdfRk9SQ0VcXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMjc1LVxcdGJvb2wgXFxcIlJlcXVpcmUgbW9kdWxlcyB0byBiZSB2YWxpZGx5IHNpZ25lZFxcXCJcXG4tLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZz0yODE9aWYgTU9EVUxFX1NJRyB8fCBJTUFfQVBQUkFJU0VfTU9EU0lHXFxua2VybmVsL21vZHVsZS9LY29uZmlnLTI4Mi1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWc6MjgzOmNvbmZpZyBNT0RVTEVfU0lHX0FMTFxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0yODQtXFx0Ym9vbCBcXFwiQXV0b21hdGljYWxseSBzaWduIGFsbCBtb2R1bGVzXFxcIlxcbi0tXFxua2VybmVsL21vZHVsZS9LY29uZmlnPTI5Mz1jaG9pY2VcXG4tLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMDItXFxua2VybmVsL21vZHVsZS9LY29uZmlnOjMwMzpjb25maWcgTU9EVUxFX1NJR19TSEEyNTZcXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzA0LVxcdGJvb2wgXFxcIlNIQS0yNTZcXFwiXFxuLS1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzA2LVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzozMDc6Y29uZmlnIE1PRFVMRV9TSUdfU0hBMzg0XFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMwOC1cXHRib29sIFxcXCJTSEEtMzg0XFxcIlxcbi0tXFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMxMC1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWc6MzExOmNvbmZpZyBNT0RVTEVfU0lHX1NIQTUxMlxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMTItXFx0Ym9vbCBcXFwiU0hBLTUxMlxcXCJcXG4tLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMTQtXFxua2VybmVsL21vZHVsZS9LY29uZmlnOjMxNTpjb25maWcgTU9EVUxFX1NJR19TSEEzXzI1Nlxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMTYtXFx0Ym9vbCBcXFwiU0hBMy0yNTZcXFwiXFxuLS1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzE4LVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzozMTk6Y29uZmlnIE1PRFVMRV9TSUdfU0hBM18zODRcXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzIwLVxcdGJvb2wgXFxcIlNIQTMtMzg0XFxcIlxcbi0tXFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMyMi1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWc6MzIzOmNvbmZpZyBNT0RVTEVfU0lHX1NIQTNfNTEyXFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMyNC1cXHRib29sIFxcXCJTSEEzLTUxMlxcXCJcXG4tLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZz0zMjc9ZW5kY2hvaWNlXFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMyOC1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWc6MzI5OmNvbmZpZyBNT0RVTEVfU0lHX0hBU0hcXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzMwLVxcdHN0cmluZ1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQyMDoyNzo0MS4yMjg1NzgyOTlaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTA5OTYxNDUwNjcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOlxuXG4qKkludmVzdGlnYXRpbmcgYE1PRFVMRV9TSUdgKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBleGFjdGx5IHRoZSBgTU9EVUxFX1NJR2AgbWFjcm8gaXMgc2VsZWN0aW5nLiBUaGlzIGlzIGZ1bmRhbWVudGFsOyBpdCdzIHRoZSBjb3JlIHBpZWNlIEkgbmVlZCB0byBncmFzcCB0byBwcm9jZWVkLiBLbm93aW5nIHRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgZm9yIGBNT0RVTEVfU0lHYCB3aWxsIGxpa2VseSBwcm92aWRlIGNydWNpYWwgY29udGV4dCBmb3IgbXkgY3VycmVudCB0YXNrLiBJIG5lZWQgdG8gZGVsdmUgaW50byB0aGUgZGV0YWlscyBvZiB3aGF0IGBNT0RVTEVfU0lHYCBlbmNvbXBhc3Nlcy5cblxuXG4iLCJJbnB1dFRva2VucyI6NTYyMzAsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQyMDoyNzo1Mi4yMjQ3MjU5NTZaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MjgwODYzOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgTU9EVUxFX1NJR1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvbW9kdWxlL0tjb25maWdcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL21vZHVsZS9LY29uZmlnPTI0MT1jb25maWcgTU9EVUxFX1NSQ1ZFUlNJT05fQUxMXFxuLS1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMjUxLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzoyNTI6Y29uZmlnIE1PRFVMRV9TSUdcXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMjUzLVxcdGJvb2wgXFxcIk1vZHVsZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uXFxcIlxcbi0tXFxua2VybmVsL21vZHVsZS9LY29uZmlnLTI3My1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWc6Mjc0OmNvbmZpZyBNT0RVTEVfU0lHX0ZPUkNFXFxua2VybmVsL21vZHVsZS9LY29uZmlnLTI3NS1cXHRib29sIFxcXCJSZXF1aXJlIG1vZHVsZXMgdG8gYmUgdmFsaWRseSBzaWduZWRcXFwiXFxuLS1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWc9MjgxPWlmIE1PRFVMRV9TSUcgfHwgSU1BX0FQUFJBSVNFX01PRFNJR1xcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0yODItXFxua2VybmVsL21vZHVsZS9LY29uZmlnOjI4Mzpjb25maWcgTU9EVUxFX1NJR19BTExcXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMjg0LVxcdGJvb2wgXFxcIkF1dG9tYXRpY2FsbHkgc2lnbiBhbGwgbW9kdWxlc1xcXCJcXG4tLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZz0yOTM9Y2hvaWNlXFxuLS1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzAyLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzozMDM6Y29uZmlnIE1PRFVMRV9TSUdfU0hBMjU2XFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMwNC1cXHRib29sIFxcXCJTSEEtMjU2XFxcIlxcbi0tXFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMwNi1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWc6MzA3OmNvbmZpZyBNT0RVTEVfU0lHX1NIQTM4NFxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMDgtXFx0Ym9vbCBcXFwiU0hBLTM4NFxcXCJcXG4tLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMTAtXFxua2VybmVsL21vZHVsZS9LY29uZmlnOjMxMTpjb25maWcgTU9EVUxFX1NJR19TSEE1MTJcXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzEyLVxcdGJvb2wgXFxcIlNIQS01MTJcXFwiXFxuLS1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzE0LVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzozMTU6Y29uZmlnIE1PRFVMRV9TSUdfU0hBM18yNTZcXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzE2LVxcdGJvb2wgXFxcIlNIQTMtMjU2XFxcIlxcbi0tXFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMxOC1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWc6MzE5OmNvbmZpZyBNT0RVTEVfU0lHX1NIQTNfMzg0XFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMyMC1cXHRib29sIFxcXCJTSEEzLTM4NFxcXCJcXG4tLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMjItXFxua2VybmVsL21vZHVsZS9LY29uZmlnOjMyMzpjb25maWcgTU9EVUxFX1NJR19TSEEzXzUxMlxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMjQtXFx0Ym9vbCBcXFwiU0hBMy01MTJcXFwiXFxuLS1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWc9MzI3PWVuZGNob2ljZVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMjgtXFxua2VybmVsL21vZHVsZS9LY29uZmlnOjMyOTpjb25maWcgTU9EVUxFX1NJR19IQVNIXFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMzMC1cXHRzdHJpbmdcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDZUMjA6Mjc6NTIuMzc3NTQyMTc1WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU4MTQ0NDE3NTg0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUga2VybmVsIG1vZHVsZSBLY29uZmlnIGZpbGU6XG5cbioqRGl2aW5nIGludG8gS2NvbmZpZzogTW9kdWxlIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBsZXQncyB6ZXJvIGluIG9uIGBrZXJuZWwvbW9kdWxlL0tjb25maWdgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgMjUyLiBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUgbW9kdWxlIGNvbmZpZ3VyYXRpb24gc3lzdGVtIGlzIGhhbmRsZWQgYXQgaXRzIGNvcmUuIEknbSBwcm9iYWJseSBsb29raW5nIGZvciB0aGUgbWFpbiBkZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcyBmb3IgbW9kdWxlIG9wdGlvbnMsIGRlcGVuZGVuY2llcywgYW5kIGRlZmF1bHQgY29uZmlndXJhdGlvbnMuIEkga25vdyB0aGUgS2NvbmZpZyBsYW5ndWFnZSB3ZWxsLCBzbyBJJ20gZXhwZWN0aW5nIHRvIHNlZSB0aGluZ3MgbGlrZSBgY29uZmlnYCwgYGJvb2xgLCBgdHJpc3RhdGVgLCBgc2VsZWN0YCwgYGRlcGVuZHMgb25gLCBhbmQgYGRlZmF1bHRgIGRpcmVjdGl2ZXMuIEknbSBnb2luZyB0byBzdGFydCBieSBnZXR0aW5nIGEgaGlnaC1sZXZlbCB2aWV3IG9mIGhvdyBtb2R1bGVzIGFyZSBpbnRlZ3JhdGVkIGludG8gdGhlIG92ZXJhbGwgY29uZmlndXJhdGlvbiBmbG93OyB0aGlzIGNvdWxkIHJldmVhbCBhbnkgcmVjZW50IGNoYW5nZXMgdG8gbW9kdWxlIGNvbmZpZ3VyYXRpb24uIFRoaXMgc2hvdWxkIHByb3ZpZGUgc29tZSBjb250ZXh0IGFyb3VuZCB0aGUgbW9kdWxlIHBhcmFtZXRlcnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU3MDA3LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDZUMjA6Mjg6NTAuNTIxOTYzNDM5WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2NjMyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJrZXJuZWwvbW9kdWxlL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMjUwLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMjUwOlxcdFxcdCAgd2lsbCBiZSBjcmVhdGVkIGZvciBhbGwgbW9kdWxlcy4gIElmIHVuc3VyZSwgc2F5IE4uXFxuIDI1MTpcXHRcXG4gMjUyOlxcdGNvbmZpZyBNT0RVTEVfU0lHXFxuIDI1MzpcXHRcXHRib29sIFxcXCJNb2R1bGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvblxcXCJcXG4gMjU0OlxcdFxcdHNlbGVjdCBNT0RVTEVfU0lHX0ZPUk1BVFxcbiAyNTU6XFx0XFx0aGVscFxcbiAyNTY6XFx0XFx0ICBDaGVjayBtb2R1bGVzIGZvciB2YWxpZCBzaWduYXR1cmVzIHVwb24gbG9hZDogdGhlIHNpZ25hdHVyZVxcbiAyNTc6XFx0XFx0ICBpcyBzaW1wbHkgYXBwZW5kZWQgdG8gdGhlIG1vZHVsZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlXFxuIDI1ODpcXHRcXHQgIFxcdTAwM2NmaWxlOkRvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW9kdWxlLXNpZ25pbmcucnN0XFx1MDAzZS5cXG4gMjU5OlxcdFxcbiAyNjA6XFx0XFx0ICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYWRkcyB0aGUgT3BlblNTTCBkZXZlbG9wbWVudCBwYWNrYWdlcyBhcyBhXFxuIDI2MTpcXHRcXHQgIGtlcm5lbCBidWlsZCBkZXBlbmRlbmN5IHNvIHRoYXQgdGhlIHNpZ25pbmcgdG9vbCBjYW4gdXNlIGl0cyBjcnlwdG9cXG4gMjYyOlxcdFxcdCAgbGlicmFyeS5cXG4gMjYzOlxcdFxcbiAyNjQ6XFx0XFx0ICBZb3Ugc2hvdWxkIGVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2lzaCB0byB1c2UgZWl0aGVyXFxuIDI2NTpcXHRcXHQgIENPTkZJR19TRUNVUklUWV9MT0NLRE9XTl9MU00gb3IgbG9ja2Rvd24gZnVuY3Rpb25hbGl0eSBpbXBvc2VkIHZpYVxcbiAyNjY6XFx0XFx0ICBhbm90aGVyIExTTSAtIG90aGVyd2lzZSB1bnNpZ25lZCBtb2R1bGVzIHdpbGwgYmUgbG9hZGFibGUgcmVnYXJkbGVzc1xcbiAyNjc6XFx0XFx0ICBvZiB0aGUgbG9ja2Rvd24gcG9saWN5LlxcbiAyNjg6XFx0XFxuIDI2OTpcXHRcXHQgICEhIVdBUk5JTkchISEgIElmIHlvdSBlbmFibGUgdGhpcyBvcHRpb24sIHlvdSBNVVNUIG1ha2Ugc3VyZSB0aGF0IHRoZVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQyMDoyODo1MC41MjIxMzc3NTlaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzMzOTQxNzgwNzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTmF2aWdhdGluZyB0aGUgS2VybmVsIENvbmZpZ3VyYXRpb24gTGFieXJpbnRoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBJdCBzZWVtcyB0aGF0IGBNT0RVTEVfU0lHYCBpcyB0aGUga2V5IOKAkyBpdCBkaXJlY3RseSBwdWxscyBpbiBgTU9EVUxFX1NJR19GT1JNQVRgLCB3aGljaCBpbiB0dXJuIGxlYWRzIHRvIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gLiBJbnRlcmVzdGluZy4gQnV0IGhhbmcgb24uLi4gYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAgaXMgKmFsc28qIGJyb3VnaHQgaW4gYnkgYEZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNgLiBTbywgaXQncyBub3QgYSBkaXJlY3QsIGV4Y2x1c2l2ZSBkZXBlbmRlbmN5LlxuXG5JZiBJIHNpbXBseSBlbmFibGUgYE1PRFVMRV9TSUdgLCB0aGUga2VybmVsIHdpbGwgaGFuZGxlIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGFuZCwgY3JpdGljYWxseSwgYEtFWVNgLiBPa2F5LCB0aGF0IG1ha2VzIGEga2luZCBvZiBsb2dpY2FsIHNlbnNlLiBXYWl0IGEgbWludXRlLi4uIEkga25vdyB0aGF0IGBLRVlTYCBhcmUgbmVjZXNzYXJ5IGFueXdheSEgR2l2ZW4gdGhpcywgSSBzaG91bGQgY29uZmlybSB0aGF0IGBDT05GSUdfS0VZU2AgaXMgYWxzbyBlbmFibGVkLiBUaGF0J3MgYSBjcml0aWNhbCBjb21wb25lbnQgZm9yIGFsbCBvZiB0aGlzIHRvIHdvcmsgYW5kIEkgbmVlZCB0byBtYWtlIHN1cmUgaXQncyBzZXQgY29ycmVjdGx5LiBUaW1lIHRvIGNoZWNrIGl0cyBzdGF0dXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU3NTQ5LCJPdXRwdXRUb2tlbnMiOjE2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6OTcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQyMDoyOToyMy45MTYzMTkzOFoiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjY4NTAyMjc4NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgS0VZU1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL2Nsb2Nrc291cmNlL0tjb25maWc9MjQyPWNvbmZpZyBOU1BJUkVfVElNRVJcXG4tLVxcbmRyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZy0yNDctXFxuZHJpdmVycy9jbG9ja3NvdXJjZS9LY29uZmlnOjI0ODpjb25maWcgS0VZU1RPTkVfVElNRVJcXG5kcml2ZXJzL2Nsb2Nrc291cmNlL0tjb25maWctMjQ5LVxcdGJvb2wgXFxcIktleXN0b25lIHRpbWVyIGRyaXZlclxcXCIgaWYgQ09NUElMRV9URVNUXFxuLS1cXG5kcml2ZXJzL2lycWNoaXAvS2NvbmZpZz0zOTg9Y29uZmlnIElSUV9DUk9TU0JBUlxcbi0tXFxuZHJpdmVycy9pcnFjaGlwL0tjb25maWctNDA1LVxcbmRyaXZlcnMvaXJxY2hpcC9LY29uZmlnOjQwNjpjb25maWcgS0VZU1RPTkVfSVJRXFxuZHJpdmVycy9pcnFjaGlwL0tjb25maWctNDA3LVxcdHRyaXN0YXRlIFxcXCJLZXlzdG9uZSAyIElSUSBjb250cm9sbGVyIElQXFxcIlxcbi0tXFxuZHJpdmVycy9yZW1vdGVwcm9jL0tjb25maWc9MTEyPWNvbmZpZyBEQThYWF9SRU1PVEVQUk9DXFxuLS1cXG5kcml2ZXJzL3JlbW90ZXByb2MvS2NvbmZpZy0xMzItXFxuZHJpdmVycy9yZW1vdGVwcm9jL0tjb25maWc6MTMzOmNvbmZpZyBLRVlTVE9ORV9SRU1PVEVQUk9DXFxuZHJpdmVycy9yZW1vdGVwcm9jL0tjb25maWctMTM0LVxcdHRyaXN0YXRlIFxcXCJLZXlzdG9uZSBSZW1vdGVwcm9jIHN1cHBvcnRcXFwiXFxuLS1cXG5kcml2ZXJzL3NvYy90aS9LY29uZmlnPTk9aWYgU09DX1RJXFxuZHJpdmVycy9zb2MvdGkvS2NvbmZpZy0xMC1cXG5kcml2ZXJzL3NvYy90aS9LY29uZmlnOjExOmNvbmZpZyBLRVlTVE9ORV9OQVZJR0FUT1JfUU1TU1xcbmRyaXZlcnMvc29jL3RpL0tjb25maWctMTItXFx0dHJpc3RhdGUgXFxcIktleXN0b25lIFF1ZXVlIE1hbmFnZXIgU3ViIFN5c3RlbVxcXCJcXG4tLVxcbmRyaXZlcnMvc29jL3RpL0tjb25maWctMjItXFxuZHJpdmVycy9zb2MvdGkvS2NvbmZpZzoyMzpjb25maWcgS0VZU1RPTkVfTkFWSUdBVE9SX0RNQVxcbmRyaXZlcnMvc29jL3RpL0tjb25maWctMjQtXFx0dHJpc3RhdGUgXFxcIlRJIEtleXN0b25lIE5hdmlnYXRvciBQYWNrZXQgRE1BIHN1cHBvcnRcXFwiXFxuLS1cXG5kcml2ZXJzL3VzYi9waHkvS2NvbmZpZz0yMz1jb25maWcgRlNMX1VTQjJfT1RHXFxuLS1cXG5kcml2ZXJzL3VzYi9waHkvS2NvbmZpZy0zMC1cXG5kcml2ZXJzL3VzYi9waHkvS2NvbmZpZzozMTpjb25maWcgS0VZU1RPTkVfVVNCX1BIWVxcbmRyaXZlcnMvdXNiL3BoeS9LY29uZmlnLTMyLVxcdHRyaXN0YXRlIFxcXCJLZXlzdG9uZSBVU0IgUEhZIERyaXZlclxcXCJcXG4tLVxcbnNlY3VyaXR5L2tleXMvS2NvbmZpZy01LVxcbnNlY3VyaXR5L2tleXMvS2NvbmZpZzo2Om1lbnVjb25maWcgS0VZU1xcbnNlY3VyaXR5L2tleXMvS2NvbmZpZy03LVxcdGJvb2wgXFxcIkVuYWJsZSBhY2Nlc3Mga2V5IHJldGVudGlvbiBzdXBwb3J0XFxcIlxcbi0tXFxuc2VjdXJpdHkva2V5cy9LY29uZmlnPTI0PWlmIEtFWVNcXG5zZWN1cml0eS9rZXlzL0tjb25maWctMjUtXFxuc2VjdXJpdHkva2V5cy9LY29uZmlnOjI2OmNvbmZpZyBLRVlTX1JFUVVFU1RfQ0FDSEVcXG5zZWN1cml0eS9rZXlzL0tjb25maWctMjctXFx0Ym9vbCBcXFwiRW5hYmxlIHRlbXBvcmFyeSBjYWNoaW5nIG9mIHRoZSBsYXN0IHJlcXVlc3Rfa2V5KCkgcmVzdWx0XFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQyMDoyOToyNi42MDEzNTA4MzZaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjExMTk3MzM3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiBCUEYgU2lnbmF0dXJlIFZlcmlmaWNhdGlvbioqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBCUEYgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBjb2RlLiBJbml0aWFsbHksIEkgd2FzIGxvb2tpbmcgYXQgYENPTkZJR19LRVlTYCBhbmQgYENPTkZJR19NT0RVTEVfU0lHYCBhcyBwb3RlbnRpYWwgdHJpZ2dlcnMsIGJ1dCBoYW5nIG9uLi4uIEkgdGhpbmsgYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzIHRoZSBrZXkuIExldCdzIHNlZSBpZiB3ZSBjYW4gZW5hYmxlIHRoYXQgdGhyb3VnaCBgQ09ORklHX01PRFVMRV9TSUdgLiBZdXAsIGl0IGxvb2tzIGxpa2UgYENPTkZJR19NT0RVTEVfU0lHYCBzZWxlY3RzIGBNT0RVTEVfU0lHX0ZPUk1BVGAsIHdoaWNoICpkb2VzKiBpbmRlZWQgc2VsZWN0IGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gLiBUaGF0J3MgZ29vZC4gQnV0IHdhaXQsIGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBpcyAqYWxzbyogc2VsZWN0ZWQgYnkgYENPTkZJR19GU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTYC4gU28sIGl0IHNlZW1zIGxpa2UganVzdCBzcGVjaWZ5aW5nIGBNT0RVTEVfU0lHYCBzaG91bGQgYmUgZW5vdWdoLlxuXG5XYWl0LCB0aG91Z2guLi4gYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgKmFscmVhZHkqIGVuYWJsZWQuIFJpZ2h0LCBsZXQncyBnbyBiYWNrIGFuZCBjaGVjayBga2VybmVsL2JwZi92ZXJpZmllci5jYCBhZ2Fpbi5cblxuYGBgY1xuXHRpZiAoZW52LVx1MDAzZXNpZ25hdHVyZSkge1xuXHRcdHJldCA9IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoZW52LCBhdHRyLCB1YXR0ci5pc19rZXJuZWwpO1xuXHRcdGlmIChyZXQpXG5cdFx0XHRnb3RvIGVycl9wcmVwO1xuXHR9XG5gYGBcblxuT2theSwgc28gdGhhdCBjb2RlIHBhdGggaXMgcmVhY2hhYmxlIGlmIGBlbnYtXHUwMDNlc2lnbmF0dXJlYCBpcyBzZXQuIFRoZSBwYXRjaCBpcyBhZGRpbmcgYGF0dHItXHUwMDNlc2lnbmF0dXJlYCBhbmQgYGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemVgIHRvIHRoZSBgdW5pb24gYnBmX2F0dHJgLiBOb3csIGRpZCBJIG1pc3Mgc29tZXRoaW5nPyBXYXNuJ3QgYGF0dHItXHUwMDNlc2lnbmF0dXJlYCBhbHJlYWR5IGRlZmluZWQgdGhlcmU/IExldCBtZSBkb3VibGUtY2hlY2sgdGhlIGBpbmNsdWRlL3VhcGkvbGludXgvYnBmLmhgIGZpbGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU4NDY3LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mjk1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjI5OjMyLjcxMzMyODI0M1oiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYzMjc0OTM0NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzaWduYXR1cmVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvdWFwaS9saW51eC9icGYuaD0xNTI3PXVuaW9uIGJwZl9hdHRyIHtcXG4tLVxcbmluY2x1ZGUvdWFwaS9saW51eC9icGYuaC0xNjYxLVxcdFxcdF9fdTMyXFx0XFx0ZmRfYXJyYXlfY250O1xcbmluY2x1ZGUvdWFwaS9saW51eC9icGYuaDoxNjYyOlxcdFxcdC8qIFBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgc2lnbmF0dXJlIG9mIHRoZSBCUEZcXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgtMTY2My1cXHRcXHQgKiBwcm9ncmFtLlxcbmluY2x1ZGUvdWFwaS9saW51eC9icGYuaC0xNjY0LVxcdFxcdCAqL1xcbmluY2x1ZGUvdWFwaS9saW51eC9icGYuaDoxNjY1OlxcdFxcdF9fYWxpZ25lZF91NjQgICBzaWduYXR1cmU7XFxuaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oOjE2NjY6XFx0XFx0LyogU2l6ZSBvZiB0aGUgc2lnbmF0dXJlIGJ1ZmZlciBpbiBieXRlcy4gKi9cXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmg6MTY2NzpcXHRcXHRfX3UzMiBcXHRcXHRzaWduYXR1cmVfc2l6ZTtcXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmg6MTY2ODpcXHRcXHQvKiBJRCBvZiB0aGUga2VybmVsIGtleXJpbmcgdG8gYmUgdXNlZCBmb3Igc2lnbmF0dXJlXFxuaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oLTE2NjktXFx0XFx0ICogdmVyaWZpY2F0aW9uLlxcbi0tXFxuaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oLTUyNTctICpcXHRcXHRUaGUgZm9sbG93aW5nIGFyZSBhIGxpc3Qgb2Ygc3VwcG9ydGVkIG1hcCB0eXBlcyBhbmQgdGhlaXJcXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmg6NTI1ODogKlxcdFxcdHJlc3BlY3RpdmUgZXhwZWN0ZWQgY2FsbGJhY2sgc2lnbmF0dXJlczpcXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgtNTI1OS0gKlxcbi0tXFxuaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oLTU0ODgtICpcXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmg6NTQ4OTogKlxcdFxcdFRoZSBleHBlY3RlZCBjYWxsYmFjayBzaWduYXR1cmUgaXNcXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgtNTQ5MC0gKlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQyMDoyOTozNC4zNDYwODE4MDlaIiwiU2VxIjoyOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTE4MTY1OTM1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGUgQlBGIFBhdGNoKipcblxuT2theSwgc28gSSBzZWUgdGhpcyBwYXRjaCBpcyBhYm91dCBgc2lnbmF0dXJlYCwgYW5kIEkgcmVjYWxsIHRoYXQgaXQgd2FzIGluaXRpYWxseSBoYW5kbGVkIGluIGBzeXNjYWxsLmNgLiBOb3csIHRoZSBwYXRjaCBtb3ZlcyBpdCB0byBgdmVyaWZpZXIuY2AsIHdoaWNoIG1ha2VzIHNlbnNlIGZvciB0aGUgb3ZlcmFsbCBhcmNoaXRlY3R1cmUgYXMgdGhhdCdzIHdoZXJlIHZlcmlmaWNhdGlvbnMgcmVzaWRlLCBhbmQgaXQgdHdlYWtzIGhvdyB0aGUgdmVyaWZpY2F0aW9uIGl0c2VsZiBpcyBkb25lIGJ5IGluY29ycG9yYXRpbmcgbWV0YWRhdGEgbWFwcy4gVGhpcyByZXN0cnVjdHVyaW5nIGZlZWxzIGxpa2UgYSBnb29kIHN0ZXAgdG93YXJkcyBpbXByb3ZlZCBjb2RlIG9yZ2FuaXphdGlvbi5cblxuSG1tLCB0aGlzIHBhdGNoIGFsc28gdG91Y2hlcyBgZmRfYXJyYXlgIGhhbmRsaW5nLiBMb29rcyBsaWtlIGl0IGludHJvZHVjZXMgYSBzaWduaWZpY2FudCBjaGFuZ2UgdG8gaG93IHRoZSBwcm9ncmFtJ3MgYGZkX2FycmF5YCBpcyBtYW5hZ2VkLiBUaGUgY29tbWVudCBleHBsYWlucyB0aGUgdHdvIGRpZmZlcmVudCBzaGFwZXM6IGVpdGhlciBjb250aW51b3VzLCB3aGVyZSBgZmRfYXJyYXlgIGhvbGRzIGFsbCBlbnRyaWVzIHVwIGZyb250LCBvciBzcGFyc2Ugd2hlcmUgZW50cmllcyBhcmUgcmVzb2x2ZWQgb24gdGhlIHNwb3QgZnJvbSBgZmRfYXJyYXlfcmF3YC4gVGhlIGtleSBoZXJlIGlzIHRoaXMgbmV3IGBmZF9hcnJheV9jbnRgIHZhcmlhYmxlLiBJIGRvbid0IHJlY2FsbCBzZWVpbmcgdGhhdCBiZWZvcmUsIHNvIEkgbmVlZCB0byBjaGVjayBgaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oYCB0byBmdWxseSB1bmRlcnN0YW5kIHRoaXMgaW50cm9kdWN0aW9uLiBJcyB0aGlzIGEgbmV3IHVzZXItc3BhY2UgQVBJIGNoYW5nZT8gSXMgaXQgYmFja3dhcmRzIGNvbXBhdGlibGU/IFRoaXMgaXMgYW4gaW50ZXJlc3RpbmcgbW9kaWZpY2F0aW9uIHRoYXQgY291bGQgaGF2ZSBpbXBsaWNhdGlvbnMgZm9yIHBlcmZvcm1hbmNlIGFuZCBtZW1vcnkgbWFuYWdlbWVudCwgZGVwZW5kaW5nIG9uIGhvdyBpdCdzIHVzZWQuIExldCBtZSBnbyBmaW5kIHRoYXQgaGVhZGVyIGZpbGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU5NTcxLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjYxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjI5OjM5LjUyNzc0MzEwN1oiLCJTZXEiOjMwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDA3MzQ2MzI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZkX2FycmF5X2NudFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJpbmNsdWRlL3VhcGkvbGludXgvYnBmLmhcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oPTE1Mjc9dW5pb24gYnBmX2F0dHIge1xcbi0tXFxuaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oLTE2NTEtXFx0XFx0X19zMzJcXHRcXHRwcm9nX3Rva2VuX2ZkO1xcbmluY2x1ZGUvdWFwaS9saW51eC9icGYuaDoxNjUyOlxcdFxcdC8qIFRoZSBmZF9hcnJheV9jbnQgY2FuIGJlIHVzZWQgdG8gcGFzcyB0aGUgbGVuZ3RoIG9mIHRoZVxcbmluY2x1ZGUvdWFwaS9saW51eC9icGYuaC0xNjUzLVxcdFxcdCAqIGZkX2FycmF5IGFycmF5LiBJbiB0aGlzIGNhc2UgYWxsIHRoZSBbbWFwXSBmaWxlIGRlc2NyaXB0b3JzXFxuLS1cXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgtMTY1Ny1cXHRcXHQgKiB1c2VkIGJ5IHRoZSB2ZXJpZmllciBkdXJpbmcgdGhlIHByb2dyYW0gbG9hZC4gSWYgcHJvdmlkZWQsXFxuaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oOjE2NTg6XFx0XFx0ICogdGhlbiB0aGUgZmRfYXJyYXlbMCwuLi4sZmRfYXJyYXlfY250LTFdIGlzIGV4cGVjdGVkIHRvIGJlXFxuaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oLTE2NTktXFx0XFx0ICogY29udGludW91cy5cXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgtMTY2MC1cXHRcXHQgKi9cXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmg6MTY2MTpcXHRcXHRfX3UzMlxcdFxcdGZkX2FycmF5X2NudDtcXG5pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgtMTY2Mi1cXHRcXHQvKiBQb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNpZ25hdHVyZSBvZiB0aGUgQlBGXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjI5OjM5LjkzNTA5NjQ2NloiLCJTZXEiOjMxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMDA2NDc1NTY0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgQlBGIFBhdGNoIGZvciBQb3RlbnRpYWwgRnV6emluZyBUYXJnZXRzKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBhbmQgaW1tZWRpYXRlbHksIGBmZF9hcnJheV9jbnRgIHBvcHMgb3V0LiBXYWl0LCBpc24ndCB0aGF0IGFscmVhZHkgZGVmaW5lZCBzb21ld2hlcmU/IExldCdzIHZlcmlmeSBpZiB0aGlzIHBhdGNoIGludHJvZHVjZWQgaXQgb3IganVzdCBtb2RpZmllZCBpdHMgdXNhZ2UuIFRoZSBkaWZmIGNvbmZpcm1zIGl0LCB0aGUgcGF0Y2ggZG9lc24ndCB0b3VjaCBgaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oYC4gQWhhISBJdCdzIG1vZGlmaWNhdGlvbiwgbm90IGludHJvZHVjdGlvbi5cblxuVGhlIHJlYWwgbWVhdCBpcyBpbiB0aGUgYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AgY2hhbmdlcy4gSSBzZWUgYHByb2Nlc3NfZmRfYXJyYXlgIGlzIG5vdyBgcHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzYCwgYW5kIHRoZXJlJ3MgYSB3aG9sZSBmYW1pbHkgb2YgbmV3IGZ1bmN0aW9uczogYGZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXNgLCBgZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlYCwgYGZkX2FycmF5X2dldF9idGZfY29udGludW91c2AsIGFuZCBgZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2VgLiBUaGlzIGlzIHNjcmVhbWluZyBcInBvdGVudGlhbCBmdXp6aW5nIHRhcmdldFwiIHRvIG1lLiBUaGUgaW50ZXJwbGF5IGJldHdlZW4gY29udGludW91cyBhbmQgc3BhcnNlIGFjY2VzcyBwYXR0ZXJucyB3aXRoaW4gdGhpcyBjb250ZXh0IGNvdWxkIGJlIHZlcnkgaW50ZXJlc3RpbmcgZnJvbSBhIHNlY3VyaXR5IHBlcnNwZWN0aXZlLlxuXG5JJ20gbWFraW5nIGEgbWVudGFsIG5vdGUgb2YgYWxsIHRoZSByZWxhdGVkIHN5bWJvbHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBvbmVzLCBhbG9uZyB3aXRoIHRoZSBuZXdseSBhZGRlZDpcblxuKiAgIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYFxuKiAgIGBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXNgXG4qICAgYHByb2Nlc3NfZmRfYXJyYXlgXG4qICAgYGZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXNgXG4qICAgYGZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZWBcbiogICBgZmRfYXJyYXlfZ2V0X21hcF9pZHhgXG4qICAgYGZkX2FycmF5X2dldF9idGZfY29udGludW91c2BcbiogICBgZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2VgXG4qICAgYGZkX2FycmF5X2dldF9idGZgXG4qICAgYGFkZF9mZF9mcm9tX2ZkX2FycmF5YFxuXG5JJ20gZXhwYW5kaW5nIG15IHNjb3BlIGFuZCBjaGVja2luZyBmb3Igb3RoZXIgcG90ZW50aWFsbHkgcmVsZXZhbnQgZnVuY3Rpb25zIHRvIGJlIGF3YXJlIG9mLiBSaWdodCwgYGZkX3Nsb3Rfc2V0X21hcGAsIGBmZF9zbG90X3NldF9idGZgLCBgZmRfc2xvdF9tYXBgLCBgZmRfc2xvdF9idGZgIOKAkyB0aG9zZSBhcmUgcmVsYXRlZCB0b28uIEFsc28sIEkgc2VlIGBfX2FkZF91c2VkX2J0ZmAgYW5kIGBfX2FkZF91c2VkX21hcGAgYXJlIGFsc28gdXBkYXRlZCwgbm93IHdpdGggYGVudi1cdTAwM2VzaWduYXR1cmVgIGNoZWNrcy4gQW5kIGBjaGVja19hbmRfcmVzb2x2ZV9pbnNuc2Agbm93IGNhbGxzIGBmZF9hcnJheV9nZXRfbWFwX2lkeGAuIFRoaXMgaXMgYWxsIGJ1aWxkaW5nIGEgbW9yZSBjb21wbGV0ZSBwaWN0dXJlIG9mIHRoZSBhdHRhY2sgc3VyZmFjZS5cblxuTm93LCBsZXQncyB0aGluayBhYm91dCBlbmFibGluZyB0aGUgcmlnaHQga2VybmVsIGNvbmZpZ3VyYXRpb25zLiBJJ2xsIG5lZWQgYE1PRFVMRV9TSUdgIHRvIGdldCBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBhbmQgYEtFWVNgLiBJIG5lZWQgdG8gZW5zdXJlIEkgZG9uJ3Qgb3Zlcmxvb2sgYW55IGRlcGVuZGVuY2llcy4gQSBxdWljayBjaGVjayB0ZWxscyBtZSBgTU9EVUxFU2AgaXMgb2Z0ZW4gZW5hYmxlZCwgYnV0IGl0IGNvdWxkIGJlIHRoYXQgSSBjYW4gZW5hYmxlIGp1c3QgYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAgZGlyZWN0bHkgaW4gbXkgY29uZmlndXJhdGlvbnMuIFdhaXQgYSBtaW51dGUuLi4gYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAgaXMgYSBib29sZWFuIHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mICpuKiBhbmQgbm8gYXNzb2NpYXRlZCBwcm9tcHQuIEkgY2FuJ3QgZW5hYmxlIGl0IGRpcmVjdGx5ISBJIGhhdmUgdG8gZW5hYmxlIHNvbWV0aGluZyB0aGF0ICpzZWxlY3RzKiBpdC4gTG9va3MgbGlrZSBgTU9EVUxFX1NJR2AgaXMgdGhlIHdheSB0byBnby5cbkknbGwgYWxzbyBuZWVkIHRvIHZlcmlmeSB0aGF0IGBLRVlTYCBpcyBhY3RpdmF0ZWQgYnkgZW5hYmxpbmcgYE1PRFVMRV9TSUdgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2MDQ0NCwiT3V0cHV0VG9rZW5zIjoxNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY3MSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQyMDoyOTo0OS45OTk4NTQ4ODNaIiwiU2VxIjozMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI1NTAyODc0MDcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic2VsZWN0IEtFWVNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYXJjaC9hcm0vbWFjaC1rZXlzdG9uZS9LY29uZmlnPTI9Y29uZmlnIEFSQ0hfS0VZU1RPTkVcXG4tLVxcbmFyY2gvYXJtL21hY2gta2V5c3RvbmUvS2NvbmZpZy02LVxcdHNlbGVjdCBIQVZFX0FSTV9BUkNIX1RJTUVSXFxuYXJjaC9hcm0vbWFjaC1rZXlzdG9uZS9LY29uZmlnOjc6XFx0c2VsZWN0IEtFWVNUT05FX1RJTUVSXFxuYXJjaC9hcm0vbWFjaC1rZXlzdG9uZS9LY29uZmlnLTgtXFx0c2VsZWN0IEFSQ0hfSEFTX1JFU0VUX0NPTlRST0xMRVJcXG4tLVxcbmRyaXZlcnMvbnZtZS9jb21tb24vS2NvbmZpZz0zPWNvbmZpZyBOVk1FX0tFWVJJTkdcXG5kcml2ZXJzL252bWUvY29tbW9uL0tjb25maWctNC0gICAgICAgdHJpc3RhdGVcXG5kcml2ZXJzL252bWUvY29tbW9uL0tjb25maWc6NTogICAgICAgc2VsZWN0IEtFWVNcXG5kcml2ZXJzL252bWUvY29tbW9uL0tjb25maWctNi1cXG4tLVxcbmRyaXZlcnMvbnZtZS9ob3N0L0tjb25maWc9MTAwPWNvbmZpZyBOVk1FX1RDUF9UTFNcXG4tLVxcbmRyaXZlcnMvbnZtZS9ob3N0L0tjb25maWctMTAzLVxcdHNlbGVjdCBORVRfSEFORFNIQUtFXFxuZHJpdmVycy9udm1lL2hvc3QvS2NvbmZpZzoxMDQ6XFx0c2VsZWN0IEtFWVNcXG5kcml2ZXJzL252bWUvaG9zdC9LY29uZmlnLTEwNS1cXHRzZWxlY3QgVExTXFxuLS1cXG5kcml2ZXJzL252bWUvdGFyZ2V0L0tjb25maWc9Mz1jb25maWcgTlZNRV9UQVJHRVRcXG4tLVxcbmRyaXZlcnMvbnZtZS90YXJnZXQvS2NvbmZpZy03LVxcdHNlbGVjdCBOVk1FX0tFWVJJTkcgaWYgTlZNRV9UQVJHRVRfVENQX1RMU1xcbmRyaXZlcnMvbnZtZS90YXJnZXQvS2NvbmZpZzo4OlxcdHNlbGVjdCBLRVlTIGlmIE5WTUVfVEFSR0VUX1RDUF9UTFNcXG5kcml2ZXJzL252bWUvdGFyZ2V0L0tjb25maWctOS1cXHRzZWxlY3QgU0dMX0FMTE9DXFxuLS1cXG5mcy9jcnlwdG8vS2NvbmZpZz0yPWNvbmZpZyBGU19FTkNSWVBUSU9OXFxuLS1cXG5mcy9jcnlwdG8vS2NvbmZpZy04LVxcdHNlbGVjdCBDUllQVE9fTElCX1NIQTUxMlxcbmZzL2NyeXB0by9LY29uZmlnOjk6XFx0c2VsZWN0IEtFWVNcXG5mcy9jcnlwdG8vS2NvbmZpZy0xMC1cXHRoZWxwXFxuLS1cXG5mcy9uZnMvS2NvbmZpZz03Nz1jb25maWcgTkZTX1Y0XFxuLS1cXG5mcy9uZnMvS2NvbmZpZy03OS1cXHRkZXBlbmRzIG9uIE5GU19GU1xcbmZzL25mcy9LY29uZmlnOjgwOlxcdHNlbGVjdCBLRVlTXFxuZnMvbmZzL0tjb25maWctODEtXFx0c2VsZWN0IFNVTlJQQ19CQUNLQ0hBTk5FTFxcbi0tXFxuZnMvc21iL2NsaWVudC9LY29uZmlnPTI9Y29uZmlnIENJRlNcXG4tLVxcbmZzL3NtYi9jbGllbnQvS2NvbmZpZy0xNi1cXHRzZWxlY3QgQ1JZUFRPX0xJQl9TSEE1MTJcXG5mcy9zbWIvY2xpZW50L0tjb25maWc6MTc6XFx0c2VsZWN0IEtFWVNcXG5mcy9zbWIvY2xpZW50L0tjb25maWctMTgtXFx0c2VsZWN0IEROU19SRVNPTFZFUlxcbi0tXFxuZnMvdWJpZnMvS2NvbmZpZz04OT1jb25maWcgVUJJRlNfRlNfQVVUSEVOVElDQVRJT05cXG5mcy91Ymlmcy9LY29uZmlnLTkwLVxcdGJvb2wgXFxcIlVCSUZTIGF1dGhlbnRpY2F0aW9uIHN1cHBvcnRcXFwiXFxuZnMvdWJpZnMvS2NvbmZpZzo5MTpcXHRzZWxlY3QgS0VZU1xcbmZzL3ViaWZzL0tjb25maWctOTItXFx0c2VsZWN0IENSWVBUT19ITUFDXFxuLS1cXG5pbml0L0tjb25maWc9MjE4Mz1jb25maWcgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXFxuLS1cXG5pbml0L0tjb25maWctMjE4NS1cXHRzZWxlY3QgU1lTVEVNX1RSVVNURURfS0VZUklOR1xcbmluaXQvS2NvbmZpZzoyMTg2OlxcdHNlbGVjdCBLRVlTXFxuaW5pdC9LY29uZmlnLTIxODctXFx0c2VsZWN0IENSWVBUT1xcbi0tXFxubmV0L2NlcGgvS2NvbmZpZz0yPWNvbmZpZyBDRVBIX0xJQlxcbi0tXFxubmV0L2NlcGgvS2NvbmZpZy0xMS1cXHRzZWxlY3QgQ1JZUFRPXFxubmV0L2NlcGgvS2NvbmZpZzoxMjpcXHRzZWxlY3QgS0VZU1xcbm5ldC9jZXBoL0tjb25maWctMTMtXFx0ZGVmYXVsdCBuXFxuLS1cXG5uZXQvcnhycGMvS2NvbmZpZz02PWNvbmZpZyBBRl9SWFJQQ1xcbi0tXFxubmV0L3J4cnBjL0tjb25maWctMTAtXFx0c2VsZWN0IENSWVBUT19MSUJfREVTIGlmIFJYS0FEXFxubmV0L3J4cnBjL0tjb25maWc6MTE6XFx0c2VsZWN0IEtFWVNcXG5uZXQvcnhycGMvS2NvbmZpZy0xMi1cXHRzZWxlY3QgTkVUX1VEUF9UVU5ORUxcXG4tLVxcbnNlY3VyaXR5L2ludGVncml0eS9LY29uZmlnPTE5PWNvbmZpZyBJTlRFR1JJVFlfU0lHTkFUVVJFXFxuLS1cXG5zZWN1cml0eS9pbnRlZ3JpdHkvS2NvbmZpZy0yMS1cXHRkZWZhdWx0IG5cXG5zZWN1cml0eS9pbnRlZ3JpdHkvS2NvbmZpZzoyMjpcXHRzZWxlY3QgS0VZU1xcbnNlY3VyaXR5L2ludGVncml0eS9LY29uZmlnLTIzLVxcdHNlbGVjdCBTSUdOQVRVUkVcXG4tLVxcbnNlY3VyaXR5L2ludGVncml0eS9ldm0vS2NvbmZpZz0yPWNvbmZpZyBFVk1cXG5zZWN1cml0eS9pbnRlZ3JpdHkvZXZtL0tjb25maWctMy1cXHRib29sIFxcXCJFVk0gc3VwcG9ydFxcXCJcXG5zZWN1cml0eS9pbnRlZ3JpdHkvZXZtL0tjb25maWc6NDpcXHRzZWxlY3QgS0VZU1xcbnNlY3VyaXR5L2ludGVncml0eS9ldm0vS2NvbmZpZy01LVxcdHNlbGVjdCBFTkNSWVBURURfS0VZU1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQyMDoyOTo1Mi41NTAxNDY1WiIsIlNlcSI6MzMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM1MDc4MjQ4NzMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkJQRiBQcm9ncmFtIFNpZ25pbmcgVmVyaWZpY2F0aW9uIGFuZCBDb25maWd1cmF0aW9uIFJldmlldyoqXG5cbkFscmlnaHQsIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gSXQgbG9va3MgbGlrZSB0aGUgY29yZSBvZiB0aGUgcGF0Y2ggaW52b2x2ZXMgYWRkaW5nIEJQRiBwcm9ncmFtIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gd2l0aGluIHRoZSBrZXJuZWwncyB2ZXJpZmllci4gVGhlIGludGVudCBpcyB0byB2ZXJpZnkgUEtDUyM3IHNpZ25hdHVyZXMgb2YgQlBGIHByb2dyYW1zIGFuZCB0aGVpciBtZXRhZGF0YSBtYXBzIHdoZW4gYSBzaWduYXR1cmUgaXMgcHJvdmlkZWQgdmlhIHRoZSBgYXR0ci1cdTAwM2VzaWduYXR1cmVgIGZpZWxkLiBBbHNvLCB0aGUgcGF0Y2ggYWRkcyBzdXBwb3J0IGZvciBjb250aW51b3VzIGBmZF9hcnJheWAgdGhyb3VnaCB0aGUgYGZkX2FycmF5X2NudGAgZmllbGQuIFRoZXNlIGFyZSBmdW5kYW1lbnRhbCBjaGFuZ2VzIGluIHRoZSBCUEYgdmVyaWZpZXIgcGF0aCB0aGF0IGRlbWFuZCB0aG9yb3VnaCBmdXp6aW5nLlxuXG5NeSBpbml0aWFsIHRob3VnaHQgd2FzIHRoYXQgZW5hYmxpbmcgYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAgd291bGQgYmUgdGhlIGtleSwgc2luY2UgaXQncyB0aGUgdGFyZ2V0LiBIb3dldmVyLCBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBpcyBzZWxlY3RlZCBieSBzZXZlcmFsIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIG9wdGlvbnMuIE15IGZpcnN0IHRob3VnaHQgd2FzIGBNT0RVTEVfU0lHYCwgYXMgaXQgYWxzbyBzZWxlY3RzIGBNT0RVTEVfU0lHX0ZPUk1BVGAsIHdoaWNoIHNlbGVjdHMgYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAsIHdoaWNoIHNlbGVjdHMgYEtFWVNgLlxuXG5JIHRoZW4gZG91YmxlLWNoZWNrZWQgYGtlcm5lbC9tb2R1bGUvS2NvbmZpZ2AgdG8gY29uZmlybSB0aGF0IGBNT0RVTEVfU0lHYCBpcyBhIGJvb2xlYW4gYW5kIHRoYXQgdGhlIHNlbGVjdGlvbiBpcyBjb3JyZWN0LiBJdCBpcywgYW5kIGxvb2tzIHN0cmFpZ2h0Zm9yd2FyZC5cblxuSSBjb25zaWRlcmVkIGRlcGVuZGVuY2llcy4gRG9lcyBgTU9EVUxFX1NJR2AgZGVwZW5kIG9uIGBNT0RVTEVTYD8gWWVzLCBpdCdzIHR5cGljYWxseSBpbnNpZGUgYW4gYGlmIE1PRFVMRVNgIGJsb2NrIGluIGBrZXJuZWwvbW9kdWxlL0tjb25maWdgLCBzbyBpdCBkb2VzIGRlcGVuZCBvbiB0aGUgbW9kdWxlIHN5c3RlbSBiZWluZyBlbmFibGVkLiBJIHF1aWNrbHkgY2hlY2tlZCBvdGhlciBjb25maWcgb3B0aW9ucyB0aGF0IGFsc28gc2VsZWN0IGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gOiBgRlNfVkVSSVRZX0JVSUxUSU5fU0lHTkFUVVJFU2AsIGBETV9WRVJJVFlfVkVSSUZZX1JPT1RIQVNIX1NJR2AsIGBVQklGU19GU19BVVRIRU5USUNBVElPTmAsIGBDRkc4MDIxMV9SRVFVSVJFX1NJR05FRF9SRUdEQmAsIGFuZCBgU0VDVVJJVFlfSVBFYC4gT25seSBgU0VDVVJJVFlfSVBFYCBkb2Vzbid0IGRlcGVuZCBvbiBhbm90aGVyIGNvbmZpZy4gQnV0IGBNT0RVTEVfU0lHYCBpcyB0aGUgc3RhbmRhcmQgcm91dGUsIHNvIEknbGwgZ28gd2l0aCB0aGF0IGZvciBub3cuXG5cblRoZW4sIHRoZXJlJ3MgYEtFWEVDX1NJR2AsIHdoaWNoIGFsc28gc2VsZWN0cyBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYC4gVG8gYmUgc2FmZSwgSSB3YXMgdGhpbmtpbmcgb2YgYWRkaW5nIGBNT0RVTEVfU0lHYCBhbmQgYEZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNgLCBvciBqdXN0IGBNT0RVTEVfU0lHYC5cblxuSSBzdGFydGVkIHRvIGRpZyBkZWVwZXIgaW50byB0aGUgY29kZSBtb2RpZmljYXRpb25zLiBUaGUgcGF0Y2ggaW50cm9kdWNlcyBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAsIHdoaWNoIGlzIGRlZmluZWQgaW4gYGtlcm5lbC9icGYvaGVscGVycy5jYCBhbmQgaXMgZXhwb3J0ZWQgYXMgYSBrZnVuYy4gVGhlIHBhdGNoIGFsc28gbW9kaWZpZXMgYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AgYW5kIGBrZXJuZWwvYnBmL3N5c2NhbGwuY2AuXG5cbkZvY3VzaW5nIG9uIHRoZSBzeW1ib2xzLCBJIG5vdGVkIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCwgYHByb2Nlc3NfZmRfYXJyYXlfY29udGludW91c2AsIGBwcm9jZXNzX2ZkX2FycmF5YCwgYGZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXNgLCBgZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlYCwgYGZkX2FycmF5X2dldF9tYXBfaWR4YCwgYGZkX2FycmF5X2dldF9idGZfY29udGludW91c2AsIGBmZF9hcnJheV9nZXRfYnRmX3NwYXJzZWAsIGBmZF9hcnJheV9nZXRfYnRmYCwgYW5kIGBhZGRfZmRfZnJvbV9mZF9hcnJheWAuXG5cblVwb24gaW5zcGVjdGlvbiwgYHByb2Nlc3NfZmRfYXJyYXlgIGlzIHByZXNlbnQgYnV0IG1vZGlmaWVkLCB3aGlsZSBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAsIGBmZF9hcnJheV9nZXRfbWFwX2lkeGAsIGFuZCBgZmRfYXJyYXlfZ2V0X2J0ZmAgYXJlIG5ldyB3aXRoaW4gYHZlcmlmaWVyLmNgLiBBbHNvLCBoZWxwZXIgZnVuY3Rpb25zIGBmZF9zbG90X3NldF9tYXBgLCBgZmRfc2xvdF9zZXRfYnRmYCwgYGZkX3Nsb3RfbWFwYCwgYGZkX3Nsb3RfYnRmYCBhcmUgcHJlc2VudC4gRmluYWxseSwgYF9fYWRkX3VzZWRfYnRmYCBhbmQgYF9fYWRkX3VzZWRfbWFwYCBhcmUgbW9kaWZpZWQuXG5cbkkgdmVyaWZpZWQgdGhhdCBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgYW5kIGBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXNgIGFyZSBzdGF0aWMuXG5cblNvLCB0aGUgcGxhbiBpcyB0byBlbmFibGUgYE1PRFVMRV9TSUdgLCBldmVuIHRob3VnaCBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBpcyBhIGBkZWZfYm9vbGAuIEFzIGxvbmcgYXMgaXQgaXMgc2VsZWN0ZWQgYnkgc29tZXRoaW5nIGVsc2UsIG9yIGlmIHRoZSBjb25maWcgb3B0aW9ucyBhcmUgZXhwbGljaXRseSBzcGVjaWZpZWQsIHRoaXMgc2hvdWxkIGJlIGZpbmUuXG5cbkZpbmFsbHksIEkgY2hlY2tlZCBgaW5pdC9LY29uZmlnYCBmb3IgdGhlIGRlcGVuZGVuY2llcyBvZiBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBhbmQgY29uZmlybWVkIHRoYXQgaXQgcmVxdWlyZXMgYEFTTjFgLCBgQ1JZUFRPYCwgYW5kIGBQS0NTN19NRVNTQUdFX1BBUlNFUmAuIFRoaXMgaXMgYW4gaW1wb3J0YW50IGNvbnNpZGVyYXRpb24uXG5cbkluIHN1bW1hcnksIHRoZSBrZXkgY29uZmlnIHRvIHByb3ZpZGUgaXMgYE1PRFVMRV9TSUdgLiBUaGlzIHNob3VsZCBjb3JyZWN0bHkgZW5hYmxlIHRoZSBuZWNlc3NhcnkgZnVuY3Rpb25hbGl0eSBmb3IgQlBGIHByb2dyYW0gc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6NjI4MjEsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDA0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjMwOjI3LjYyODM5ODIxMloiLCJTZXEiOjM0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzM3MTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW5pdC9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIxODAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIxODA6XFx0XFxuMjE4MTpcXHRlbmRtZW51XFxuMjE4MjpcXHRcXG4yMTgzOlxcdGNvbmZpZyBTWVNURU1fREFUQV9WRVJJRklDQVRJT05cXG4yMTg0OlxcdFxcdGRlZl9ib29sIG5cXG4yMTg1OlxcdFxcdHNlbGVjdCBTWVNURU1fVFJVU1RFRF9LRVlSSU5HXFxuMjE4NjpcXHRcXHRzZWxlY3QgS0VZU1xcbjIxODc6XFx0XFx0c2VsZWN0IENSWVBUT1xcbjIxODg6XFx0XFx0c2VsZWN0IENSWVBUT19SU0FcXG4yMTg5OlxcdFxcdHNlbGVjdCBBU1lNTUVUUklDX0tFWV9UWVBFXFxuMjE5MDpcXHRcXHRzZWxlY3QgQVNZTU1FVFJJQ19QVUJMSUNfS0VZX1NVQlRZUEVcXG4yMTkxOlxcdFxcdHNlbGVjdCBBU04xXFxuMjE5MjpcXHRcXHRzZWxlY3QgT0lEX1JFR0lTVFJZXFxuMjE5MzpcXHRcXHRzZWxlY3QgWDUwOV9DRVJUSUZJQ0FURV9QQVJTRVJcXG4yMTk0OlxcdFxcdHNlbGVjdCBQS0NTN19NRVNTQUdFX1BBUlNFUlxcbjIxOTU6XFx0XFx0aGVscFxcbjIxOTY6XFx0XFx0ICBQcm92aWRlIFBLQ1MjNyBtZXNzYWdlIHZlcmlmaWNhdGlvbiB1c2luZyB0aGUgY29udGVudHMgb2YgdGhlIHN5c3RlbVxcbjIxOTc6XFx0XFx0ICB0cnVzdGVkIGtleXJpbmcgdG8gcHJvdmlkZSBwdWJsaWMga2V5cy4gIFRoaXMgdGhlbiBjYW4gYmUgdXNlZCBmb3JcXG4yMTk4OlxcdFxcdCAgbW9kdWxlIHZlcmlmaWNhdGlvbiwga2V4ZWMgaW1hZ2UgdmVyaWZpY2F0aW9uIGFuZCBmaXJtd2FyZSBibG9iXFxuMjE5OTpcXHRcXHQgIHZlcmlmaWNhdGlvbi5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDZUMjA6MzA6MjcuNjI4NTM0OTcyWiIsIlNlcSI6MzUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU0OTQwNTY2MDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIEJQRiBWZXJpZmljYXRpb24gYW5kIFNpZ25hdHVyZSBDaGVja3MqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGdvdCBhIGhhbmRsZSBvbiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGhlcmUuIEl0IHNlZW1zIGxpa2UgZW5hYmxpbmcgYE1PRFVMRV9TSUdgIGlzIHRoZSBrZXkg4oCTIHRoYXQnbGwgYXV0b21hdGljYWxseSBwdWxsIGluIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGFuZCBhbGwgaXRzIHJlcXVpcmVkIGNyeXB0byBhbmQga2V5IHBhcnNpbmcgY29uZmlndXJhdGlvbnMuIEkgcmVtZW1iZXIgbm93LCBgTU9EVUxFX1NJR2AgaXMgZGVmaW5lZCBpbiBga2VybmVsL21vZHVsZS9LY29uZmlnYC4gSSB3b25kZXIgaWYgdGhlcmUgYXJlIGFueSBvdGhlciByZWxldmFudCBjb25maWdzLCBidXQgbGV0J3MganVzdCBzdGljayB3aXRoIGBNT0RVTEVfU0lHYCBmb3Igbm93LlxuXG5Ob3csIGxldCdzIGxvb2sgYXQgdGhlIGltcGxlbWVudGF0aW9uIHNpZGUuIFRoZSBmb2N1cyBpcyBjbGVhcmx5IG9uIGNoYW5nZXMgdG8gQlBGIHByb2dyYW0gdmVyaWZpY2F0aW9uIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4gSSdtIHNlZWluZyBtb2RpZmljYXRpb25zIHRvIGBwcm9jZXNzX2ZkX2FycmF5YCBhbmQgdGhlIG1vdmVtZW50IG9mIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBmcm9tIGBzeXNjYWxsLmNgIHRvIGB2ZXJpZmllci5jYCwgYWxvbmcgd2l0aCBpdHMgbW9kaWZpY2F0aW9uLiBJbXBvcnRhbnRseSwgYGZkX2FycmF5X2dldF9tYXBfaWR4YCBhbmQgYGZkX2FycmF5X2dldF9idGZgIGFyZSBicmFuZCBuZXcgYWRkaXRpb25zLCB3aGljaCBJJ2xsIGRlZmluaXRlbHkgbmVlZCB0byBkaWcgaW50by5cblxuR2l2ZW4gdGhlIG5ldyBgZmRfYXJyYXlfZ2V0X21hcF9pZHhgIGZ1bmN0aW9uLCBJIHNob3VsZCBzdGFydCBieSBleGFtaW5pbmcgYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AuIEknbSBndWVzc2luZyB0aGF0J3Mgd2hlcmUgSSdsbCBmaW5kIGl0cyBpbXBsZW1lbnRhdGlvbiBhbmQgaG9wZWZ1bGx5IHVuZGVyc3RhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSByZXN0IG9mIHRoZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy4gSSdsbCBuZWVkIHRvIHNlZSBob3cgdGhlc2UgYWRkaXRpb25zIHJlbGF0ZSB0byB0aGUgZXhpc3RpbmcgYHByb2Nlc3NfZmRfYXJyYXlgIGFuZCBob3cgdGhleSBjb250cmlidXRlIHRvIHRoZSBvdmVyYWxsIHNlY3VyaXR5IHBvc3R1cmUuIFRoZSBmYWN0IHRoYXQgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIGhhcyBiZWVuIG1vdmVkIGFuZCBtb2RpZmllZCBpcyBhIHN0cm9uZyBpbmRpY2F0aW9uIHRoYXQgdGhlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBpcyBldm9sdmluZywgd2hpY2ggaXMgYSBrZXkgcG9pbnQgdG8gdW5kZXJzdGFuZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NjUwNzAsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMjMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wNlQyMDozMDozMy4xMjI1OTQ1NjZaIiwiU2VxIjozNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUyMDI3MzE5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJmZF9hcnJheV9nZXRfbWFwX2lkeFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL3ZlcmlmaWVyLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi92ZXJpZmllci5jPTE3OTg4PXN0YXRpYyBpbnQgYWRkX3VzZWRfbWFwKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBmZClcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xODAwMS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MTgwMDI6c3RhdGljIGludCBmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE4MDAzLXtcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xODAxOC1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MTgwMTk6c3RhdGljIGludCBmZF9hcnJheV9nZXRfbWFwX2lkeF9zcGFyc2Uoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgwMjAte1xcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE4MDI4LVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxODAyOTpzdGF0aWMgaW50IGZkX2FycmF5X2dldF9tYXBfaWR4KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE4MDMwLXtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgwMzEtXFx0aWYgKGVudi1cXHUwMDNlZmRfYXJyYXkpXFxua2VybmVsL2JwZi92ZXJpZmllci5jOjE4MDMyOlxcdFxcdHJldHVybiBmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzKGVudiwgaWR4KTtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgwMzMtXFx0aWYgKGVudi1cXHUwMDNlc2lnbmF0dXJlKSB7XFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgwMzctXFx0aWYgKCFicGZwdHJfaXNfbnVsbChlbnYtXFx1MDAzZWZkX2FycmF5X3JhdykpXFxua2VybmVsL2JwZi92ZXJpZmllci5jOjE4MDM4OlxcdFxcdHJldHVybiBmZF9hcnJheV9nZXRfbWFwX2lkeF9zcGFyc2UoZW52LCBpZHgpO1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xODAzOS1cXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0xODIzNj1zdGF0aWMgaW50IGNoZWNrX2FuZF9yZXNvbHZlX2luc25zKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgzMTEtXFx0XFx0XFx0Y2FzZSBCUEZfUFNFVURPX01BUF9JRFg6XFxua2VybmVsL2JwZi92ZXJpZmllci5jOjE4MzEyOlxcdFxcdFxcdFxcdG1hcF9pZHggPSBmZF9hcnJheV9nZXRfbWFwX2lkeChlbnYsIGluc25bMF0uaW1tKTtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgzMTMtXFx0XFx0XFx0XFx0YnJlYWs7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjMwOjMzLjY0Mjg3MzcyNloiLCJTZXEiOjM3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozMTExMzYwNDcxMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQncyBpbnRlcm5hbCBtb25vbG9ndWU6XG5cbioqQ2hlY2tpbmcgb24gdGhlIGBmZF9hcnJheV9nZXRfYnRmYCBGdW5jdGlvbioqXG5cblJpZ2h0LCB0aGF0J3MgaXQgdGhlbiwgdGhleSdyZSBkZWZpbml0ZWx5IHByZXNlbnQgaW4gdGhlIGNvZGUgYmFzZS4gTm93LCB0byBnZXQgdGhlIHNwZWNpZmljcywgSSBuZWVkIHRvIGRpZyBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiwgYW5kIEkga25vdyBleGFjdGx5IHdoZXJlIHRvIGZpbmQgaXQuIFRpbWUgdG8gb3BlbiB1cCBga2VybmVsL2JwZi92ZXJpZmllci5jYC4gU3BlY2lmaWNhbGx5LCBJJ20gYWZ0ZXIgdGhlIGBmZF9hcnJheV9nZXRfYnRmYCBmdW5jdGlvbiB3aXRoaW4gdGhhdCBmaWxlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQncyBiZWhhdmluZywgdGhlIGxvZ2ljIGl0J3MgdXNpbmcsIGFuZCBob3cgdGhlIGludGVyYWN0aW9uIHdpdGggZmlsZSBkZXNjcmlwdG9ycyBpcyBoYW5kbGVkIHRvIGFzY2VydGFpbiB0aGUgcHJlY2lzZSBtZWNoYW5pc20gYW5kIGhvdyBpdCdzIGludGVyYWN0aW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2NjM1OSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjMxOjA0Ljc1NjQ4MTM4OVoiLCJTZXEiOjM4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzU3MzE1MDYzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImZkX2FycmF5X2dldF9idGZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi92ZXJpZmllci5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvdmVyaWZpZXIuYz0yNTIxPXN0YXRpYyBzdHJ1Y3QgYnRmICpcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjUyMjpmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjUyMy17XFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MjU0MD1zdGF0aWMgc3RydWN0IGJ0ZiAqXFxua2VybmVsL2JwZi92ZXJpZmllci5jOjI1NDE6ZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2Uoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjU0Mi17XFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjU1Ni1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjU1NzpzdGF0aWMgc3RydWN0IGJ0ZiAqZmRfYXJyYXlfZ2V0X2J0ZihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yNTU4LXtcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yNTYzLVxcdGlmIChlbnYtXFx1MDAzZWZkX2FycmF5KVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoyNTY0OlxcdFxcdHJldHVybiBmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXMoZW52LCBpZHgpO1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yNTY1LVxcdGlmICghYnBmcHRyX2lzX251bGwoZW52LVxcdTAwM2VmZF9hcnJheV9yYXcpKVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoyNTY2OlxcdFxcdHJldHVybiBmZF9hcnJheV9nZXRfYnRmX3NwYXJzZShlbnYsIGlkeCk7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTI1NjctXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MjU3Mj1zdGF0aWMgc3RydWN0IGJ0ZiAqX19maW5kX2tmdW5jX2Rlc2NfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjU4OS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjU5MDpcXHRcXHRidGYgPSBmZF9hcnJheV9nZXRfYnRmKGVudiwgb2Zmc2V0KTtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjU5MS1cXHRcXHRpZiAoSVNfRVJSKGJ0ZikpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjMxOjA1LjExMzgzMjUwMloiLCJTZXEiOjM5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoyNDI0ODgwMzMyMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGUgQlBGIFByb2dyYW0gU2lnbmluZyBWZXJpZmljYXRpb24gUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCwgeWVzLCBpdCdzIGRlZmluaXRlbHkgaW50cm9kdWNpbmcgc29tZSBpbnRlcmVzdGluZyBjaGFuZ2VzLiBNeSByZWFzb25pbmcgZ29lcyBsaWtlIHRoaXM6IHdlJ3ZlIGdvdCBCUEYgcHJvZ3JhbSBzaWduaW5nIHZlcmlmaWNhdGlvbiBiZWluZyBpbnRlZ3JhdGVkIGludG8gdGhlIGtlcm5lbCB2ZXJpZmllci4gVGhhdCdzIGEgY3JpdGljYWwgcG9pbnQuIFNwZWNpZmljYWxseSwgaXQgc2VlbXMgdGhlIGBicGZfY2hlY2tgIHBhdGggaGFzIGJlZW4gbW9kaWZpZWQgdG8gaGFuZGxlIFBLQ1MjNyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZvciBCUEYgcHJvZ3JhbXMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgbWV0YWRhdGEgbWFwcywgYnV0IG9ubHkgd2hlbiBgYXR0ci1cdTAwM2VzaWduYXR1cmVgIGlzIHByZXNlbnQuIFBsdXMsIHRoZXJlIGlzIHRoaXMgbmV3IGNvbnRpbnVvdXMgYGZkX2FycmF5YCBzdXBwb3J0IGltcGxlbWVudGVkIHdpdGggYGZkX2FycmF5X2NudGAuIFRoaXMgaW1wYWN0cyB0aGUgY29yZSBCUEYgdmVyaWZpZXIgYW5kIHRodXMsIHdhcnJhbnRzIGNhcmVmdWwgZnV6emluZy5cblxuRnJvbSBhIGNvbmZpZ3VyYXRpb24gcGVyc3BlY3RpdmUsIEkgc2VlIHRoYXQgdGhpcyBpcyBjb25kaXRpb25hbCBvbiBgTU9EVUxFX1NJR2AgYmVpbmcgZW5hYmxlZC5cblxuTm93LCBteSBmb2N1cyBpcyB6ZXJvaW5nIGluIG9uIGEgZmV3IGtleSBzeW1ib2xzIGhlcmU6IGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCwgYHByb2Nlc3NfZmRfYXJyYXlfY29udGludW91c2AsIGBwcm9jZXNzX2ZkX2FycmF5YCwgYGZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXNgLCBgZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlYCwgYGZkX2FycmF5X2dldF9tYXBfaWR4YCwgYGZkX2FycmF5X2dldF9idGZfY29udGludW91c2AsIGBmZF9hcnJheV9nZXRfYnRmX3NwYXJzZWAsIGBmZF9hcnJheV9nZXRfYnRmYCwgYW5kIGBhZGRfZmRfZnJvbV9mZF9hcnJheWAuXG5cbldhaXQgYSBzZWNvbmQuIEkganVzdCByZWFsaXplZCB0aGF0IGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBpcyBhICpzdGF0aWMqIGZ1bmN0aW9uIHdpdGhpbiBga2VybmVsL2JwZi92ZXJpZmllci5jYC4gVGhhdCBtZWFucy4uLiBva2F5LCBhcmUgdGhlcmUgYW55IG90aGVyIGZ1bmN0aW9ucyBpbnZvbHZlZCBpbiB0aGlzPyBBaCwgeWVzLCBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGlzIGluIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AuIEl0J3MgZGVmaW5lZCBhcyBhIGtmdW5jLCBidXQgY3J1Y2lhbGx5LCBpdCdzIGFsc28gY2FsbGVkIGJ5IGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYC4gVGhhdCBjaGFuZ2VzIHRoaW5ncyBhIGJpdC4gU28gSSdsbCBpbmNsdWRlIGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAgYXMgYSBwcmltYXJ5IGZvY3VzIGFzIHdlbGwuXG5cbkkgc2hvdWxkIHZlcmlmeSB0aGF0IGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAgaXMgcmVhY2hhYmxlLiBZZXMsIGl0IGlzIGNhbGxlZCBieSBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAuXG5cbk9rYXksIGxldCdzIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6NjcwODAsIk91dHB1dFRva2VucyI6MjUwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mzg2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTA2VDIwOjMxOjI5LjM2MjYzODUwNVoiLCJTZXEiOjQwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc2NjM3NDI0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNT0RVTEVfU0lHXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZVwiLFxuICAgIFwicHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzXCIsXG4gICAgXCJwcm9jZXNzX2ZkX2FycmF5XCIsXG4gICAgXCJmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzXCIsXG4gICAgXCJmZF9hcnJheV9nZXRfbWFwX2lkeF9zcGFyc2VcIixcbiAgICBcImZkX2FycmF5X2dldF9tYXBfaWR4XCIsXG4gICAgXCJmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXNcIixcbiAgICBcImZkX2FycmF5X2dldF9idGZfc3BhcnNlXCIsXG4gICAgXCJmZF9hcnJheV9nZXRfYnRmXCIsXG4gICAgXCJhZGRfZmRfZnJvbV9mZF9hcnJheVwiLFxuICAgIFwiYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIEJQRiBwcm9ncmFtIHNpZ25pbmcgdmVyaWZpY2F0aW9uIGludG8gdGhlIGtlcm5lbCB2ZXJpZmllci4gSXQgbW9kaWZpZXMgdGhlIGBicGZfY2hlY2tgIHBhdGggdG8gdmVyaWZ5IFBLQ1MjNyBzaWduYXR1cmVzIG9mIEJQRiBwcm9ncmFtcyBhbmQgdGhlaXIgbWV0YWRhdGEgbWFwcyB3aGVuIGBhdHRyLVxcdTAwM2VzaWduYXR1cmVgIGlzIHByb3ZpZGVkLiBJdCBhbHNvIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgYSBjb250aW51b3VzIGBmZF9hcnJheWAgdmlhIGBmZF9hcnJheV9jbnRgLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUgQlBGIHZlcmlmaWVyIGNoYW5nZXMgdGhhdCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1PRFVMRV9TSUdcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlXCIsXG4gICAgXCJwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXNcIixcbiAgICBcInByb2Nlc3NfZmRfYXJyYXlcIixcbiAgICBcImZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXNcIixcbiAgICBcImZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZVwiLFxuICAgIFwiZmRfYXJyYXlfZ2V0X21hcF9pZHhcIixcbiAgICBcImZkX2FycmF5X2dldF9idGZfY29udGludW91c1wiLFxuICAgIFwiZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2VcIixcbiAgICBcImZkX2FycmF5X2dldF9idGZcIixcbiAgICBcImFkZF9mZF9mcm9tX2ZkX2FycmF5XCIsXG4gICAgXCJicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgQlBGIHByb2dyYW0gc2lnbmluZyB2ZXJpZmljYXRpb24gaW50byB0aGUga2VybmVsIHZlcmlmaWVyLiBJdCBtb2RpZmllcyB0aGUgYGJwZl9jaGVja2AgcGF0aCB0byB2ZXJpZnkgUEtDUyM3IHNpZ25hdHVyZXMgb2YgQlBGIHByb2dyYW1zIGFuZCB0aGVpciBtZXRhZGF0YSBtYXBzIHdoZW4gYGF0dHItXFx1MDAzZXNpZ25hdHVyZWAgaXMgcHJvdmlkZWQuIEl0IGFsc28gaW50cm9kdWNlcyBzdXBwb3J0IGZvciBhIGNvbnRpbnVvdXMgYGZkX2FycmF5YCB2aWEgYGZkX2FycmF5X2NudGAuIFRoZXNlIGFyZSByZWFjaGFibGUgY29yZSBCUEYgdmVyaWZpZXIgY2hhbmdlcyB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:nil,}