IyMgIyEgL2FwcGwvc29mdC9iaW8vYmlvcGVybC81LjM2LjAvYmluL3BlcmwKIyMgIyEgL3Vzci9iaW4vcGVybCAtdwoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgdnJ0MnRlaS5wbAojIGV1cmVjbwojIGxlaWJuaXotaW5zdGl0dXQgZnVlciBkZXV0c2NoZSBzcHJhY2hlIC8gY3NjIGZpbmxhbmQgZXNibwojIGF1Z3VzdCAyMDI0CiMgCiMgCiMgdXNpbmcgWE1MOjpUd2lnICwgc2VlIGh0dHA6Ly93d3cueG1sdHdpZy5vcmcvLCBodHRwczovL21ldGFjcGFuLm9yZy9wb2QvWE1MOjpUd2lnYQojIAojIHVzYWdlOiBzZWUgYmVsb3cgdGhlIHVzYWdlIGZ1Z25jdGlvbgojIFVzYWdlOiAgLi92cnQydGVpLnBsIDx2cnR4bWxmaWxlLnhtbD4gPG91dGZpbGU+CiMgICAgICAgICA8dnJ0eG1sZmlsZT46IHhtbC1pc2VkIHZydCBmaWxlCiMKIwojIFRPRE86IAoKIyAwIFpJUFBFTiBtaXQgdGVpMmtvcmFweG1sOyB6aXBwZW4gbWl0IGtvckFQIGluZGV4aW5nCgojIDIgdGhyZWFkaW5nIG9uIGNvbXB1dGUgbm9kZSBhbmQgYXBwbGljYXRpb24gb24gc3ViIGNvcnBvcmEgb2YgS0xLCiMgMiBidWlsZCAzMCBiaWxsaW9uIGNvcnB1cyBhbmQgaW5kZXggaXQKIyAzIE9wdGlvbmVuCiMgM2EgcGFyYW1ldHJpemUgZGVwcmVsIGZvciBJNSBhbmQgaWYgTmlscyBpcyBub3QgcmVhZHkgeWV0CgojIAogICAgCiMgNSAgYWJmYW5nZW4gdm9uIHVuZXJ3YXJ0ZXRlbiBlbGVtZW50ZW4gZGggYW5kZXJlIGFscyA8c2VudGVuY2U+IHVuZCA8cGFyYWdyYXBoPgojIDYgIGNoZWNrcyBhbmQgYmFsYW5jZXMsIHdvcnQgcmVpaGVuZm9sZ2Ugbm9jaG1hbCBjaGVja2VuPwojIDcgIEVuY29kZSBLaWVsaXBhbmtraSBhbmQgTmF0aW9uYWwgTGlicmFyeSBvZiBGaW5sYW5kPyBpbiB0ZWlDb3JwdXMgSGVhZGVyCiMgOCAgSG93IHRvIGVuY29kZSB0aGUgQ0xBUklOLVJFUyBiZXR0ZXIgLSBtb3JlIEluZm8gZnJvbSB0aGUgQ01ESQojIDkgIGNvbnN0cnVjdCA8aWRzRG9jPnMgaW5kZXBlbmRlbnQgb2YgdGhlIG9yZGVyIG9mIHRleHRzLCBwcm9iYWJseSB3aXRoIHdyaXRpbmcgaW50ZXJtZWRpYXRlIGZpbGVzIHRvIHppcCAKIyAxMCByZS1pbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ2F3ayBjb2RlIGluIHRoZSBwZXJsIHNjcmlwdAojIDExIFd3ZWRpc2ggY29ycHVzCgojCiMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CiN1c2UgZGlhZ25vc3RpY3M7Cgp1c2UgR2V0b3B0OjpTdGQ7CnVzZSBYTUw6OlR3aWc7IAp1c2UgWE1MOjpHZW5lcmF0b3IgJzpwcmV0dHknOyAgIyBhcHBhcmVudGx5IG5vIGVmZmVjdCB3aGVuIHVzaW5nIGZsdXNoKCk7CgogCnVzZSBsb2NhbGU7ICAgICAgICAgICAgICAgICAjIGRpZXNlIGRyZWkgWmVpbGVuLCBkYW1pdCBcYiBpbSByZWdleCBuaWNodCBVbWxhdXRlIHVuZCDfIG1hdGNodC4KdXNlIFBPU0lYIHF3KGxvY2FsZV9oKTsgICAgICMgdG8gYmUgYWJsZSB0byB1c2Ugc2V0bG9jYWxlKCkKI3NldGxvY2FsZShMQ19BTEwsJ2RlX0RFJyk7ICAKc2V0bG9jYWxlKExDX0FMTCwgImZpX0ZJIik7ICAKdXNlIHV0Zjg7CnVzZSBvcGVuIHF3KCA6c3RkIDplbmNvZGluZyhVVEYtOCkgKTsKCnVzZSBUaW1lOjpQaWVjZTsKdXNlIFRpZTo6SXhIYXNoOwp1c2UgRGF0YTo6UmFuZG9tOjpTdHJpbmc7CgoKCgojLS0tLS0tLS0tLS0tLQojIGdldCBvcHRpb25zIAojLS0tLS0tLS0tLS0tLQoKb3VyICgkb3B0X2gsICRvcHRfbSwgJG9wdF9zLCAkb3B0X3QpOwoKIyByZWFkIHN3aXRjaGVzIGFuZCBwcmludCB1c2FnZSBpbmZvIGlmIHNvbWUgYmFkIG9wdGlvbiB3YXMgZ2l2ZW4KaWYgKCFnZXRvcHRzKCdobXM6dDonKSkgeyAgICMgc3dpdGNoZXMgd2l0aCAnOicgdGFrZSBhbiBhcmd1bWVudDsgc3dpdGNoZXMgd2l0aG91dCAnOicgYXJlIGJvb2xlYW4gZmxhZ3MKICAgICZ1c2FnZV9tZXNzYWdlOwogICAgZXhpdCAtMTsKfQoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLQojIGNoZWNrIGFyZ3VtZW50KHMpCiMtLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBjdXJyZW50bHkgb25lIGFyZ3VtZW50OiB0aGUgdnJ0LXhtbCBpbnB1dCBmaWxlCgp1bmxlc3MoJEFSR1ZbMF0pIHsmdXNhZ2VfbWVzc2FnZSgpfSA7ICMgbWluIGFyZzAsIHRoZSBpbnB1dCBmaWxlIGUuZy4gU3VvbWVuX0t1dmFsZWh0aTIwMjEueG1sCmlmICAgICgkQVJHVlsxXSkgeyZ1c2FnZV9tZXNzYWdlKCl9OyAgIyBtYXggYXJnMCwgdGhlIGlucHV0IGZpbGUKCgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGluaXRpYWxpemUgZGVmYXVsdHMgZm9yIG9wdGlvbnMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpteSAkVEVJRk9STUFUPSAidGVpIjsKbXkgJE1BU0sgICAgID0gMDsKCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGludGVycHJldCB0aGUgb3B0aW9ucyBhbmQgY2hlY2sgd2hldGhlciB0aGVpciByZXNwZWN0aXZlIGFyZ3VtZW50IGlzIG1lYW5pbmdmdWwgKGlmIGFwcGxpY2FibGUpCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKIyBvcHRpb24gLWg6IGRpc3BsYXkgdXNhZ2UgaW5mbyBhbmQgZXhpdAppZiAoJG9wdF9oKSB7CglwcmludCBTVERFUlIgJnVzYWdlX21lc3NhZ2U7CglleGl0IDA7Cn0KCgoKIyBvcHRpb24gLXQKaWYgKGRlZmluZWQoJG9wdF90KSkgewogICAgJFRFSUZPUk1BVCA9ICRvcHRfdDsKfQoKCmlmICgkVEVJRk9STUFUICF+IC8odGVpfGk1KS9pKSB7ICMgY2FzZS1pbnNlbnN0aXZlCiAgICBwcmludCBTVERFUlIgIkVycm9yOiBpbnZhbGlkIGFyZyBmb3Igb3B0aW9uIC10IjsKICAgICZ1c2FnZV9tZXNzYWdlOwogICAgZXhpdCAwOwp9CmlmKCRURUlGT1JNQVQgZXEgInRlaSIpeyRURUlGT1JNQVQ9IlRFSSJ9OwppZigkVEVJRk9STUFUIGVxICJpNSIpIHskVEVJRk9STUFUPSJJNSJ9OwoKIyBvcHRpb24gLW0KaWYgKCRvcHRfbSkgewogICAgJE1BU0sgPSAxOwp9CgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgT1RIRVIgR0xPQkFMIFZBUklBQkxFUyAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpteSAkZW5jb2RpbmcgPSAiVVRGLTgiOyAgICAgICAgICAgICAgICAjIGRpZXNlcyAkZW5jb2RpbmcgaXN0IE5VUiBmdWVyIGRhcyBvdXRwdXQgcy51LiB0d2lnIGZ1bmt0aW9uCgpteSAkRFREREVDTCA9ICdpZHNDb3JwdXMgUFVCTElDICItLy9JRFMvL0RURCBJRFMtSTUgMS4wLy9FTiIgImh0dHA6Ly9jb3Jwb3JhLmlkcy1tYW5uaGVpbS5kZS9JNS9EVEQvaTUuZHRkIic7ICAgICAjIGZvciBJNQoKbXkgJHRleHRjb3VudGVyID0gMDsKbXkgJExBU1RNT05USCA9IDA7CgpvdXIgJWNvcnB1c2lkcyAgICA9ICgpOwpvdXIgJXNyY3B1YmxpZHMgICA9ICgpOwpvdXIgJXNyY2Z1bGxuYW1lcyAgICA9ICgpOwpvdXIgJXNyY3B1YnBsYWNlcyAgICA9ICgpOwpvdXIgJXNyY3B1Ymxpc2hlcnMgICA9ICgpOwpvdXIgJXNyY3RleHR0eXBlcyAgICA9ICgpOwpvdXIgJXNyY3RleHRsYW5ncyAgICA9ICgpOwoKb3VyICVleHBhbmRMYW5nICAgICAgPSAoKTsKCgpteSAlZG9jY291bnRlciA9ICggICAgICAgICAgICAgICAgICAgICAgICAjIGJ5IHRoZSBtb250aCBhcyBpbiBkZXJla28KICAgICIwMSIgPT4gMSwKICAgICIwMiIgPT4gMSwKICAgICIwMyIgPT4gMSwKICAgICIwNCIgPT4gMSwKICAgICIwNSIgPT4gMSwKICAgICIwNiIgPT4gMSwKICAgICIwNyIgPT4gMSwKICAgICIwOCIgPT4gMSwKICAgICIwOSIgPT4gMSwKICAgICIxMCIgPT4gMSwKICAgICIxMSIgPT4gMSwKICAgICIxMiIgPT4gMSwKICAgICk7CgojIGdsb2JhbCB2YXJpYWJsZXMgcGVydGFpbmluZyB0byB0aGUgb3JpZ2luYWwgY29ycHVzIG9mICphbGwqIG5ld3NwYXBlcnM6Cm15ICRraWVsaXBhbmtraUNvcnB1cyAgPSAia2xrLWZpLXYyLXZydCI7Cm15ICRraWVsaXBhbmtraUxpY2Vuc2UgPSAiQ0xBUklOLVJFUyI7Cm15ICRDb3VudHJ5S2V5ICAgICAgICAgPSAiRkkiOwoKIyBUYWJsZSB3aXRoIG1ldGFkYXRhIGFib3V0IHRoZSBkaWZmZXJlbnQgc291cmNlcyAobmV3c3BhcGVycykKbXkgJHNvdXJjZXNjc3ZmaWxlID0gInNvdXJjZXNfa2xrX2ZpX3YyXzIwMjFfNGV1cmVjby5jc3YiOwoKIyBjb3JwdXNoZWFkZXIgYW5kIHRleHRoZWFkZXIgc2tlbGV0b25zCm15ICRjb3JwaGVhZGVyZmlsZSA9ICJ0ZWlDb3JwdXNIZWFkZXJTa2VsZXRvbi50ZWkueG1sIjsKbXkgJHRleHRoZWFkZXJmaWxlID0gInRlaVRleHRIZWFkZXJTa2VsZXRvbi50ZWkueG1sIjsKaWYoJFRFSUZPUk1BVCBlcSAiSTUiKXsKICAgICRjb3JwaGVhZGVyZmlsZSA9ICJpNUNvcnB1c0hlYWRlclNrZWxldG9uLmk1LnhtbCI7CiAgICAkdGV4dGhlYWRlcmZpbGUgPSAiaTVUZXh0SGVhZGVyU2tlbGV0b24uaTUueG1sIjsKfQoKCm15ICR0d2lnPSIiOyAgIAoKIyB2YXJpYWJsZXMgJGZuc291cmNlIGFuZCAkZm55ZWFyIGRlcml2ZWQgZnJvbSB0aGUgZmlsZW5hbWUKbXkgQGFycmF5ID0gc3BsaXQoL1wvLywgJEFSR1ZbMF0pOwpteSAkbCA9IHNjYWxhcihAYXJyYXkpOwpteSAkZm5zb3VyY2UgPSAkYXJyYXlbJGwtMV07CiRmbnNvdXJjZSA9fiBzLyhbMC05XVswLTldWzAtOV1bMC05XSlcLnhtbCQvLzsKCm15ICRmbnllYXIgPSAkMTsgICAjICQxIGNvbnRhaW5zIHN1YnN0cmluZyBpbiBmaXJzdCBicmFja2V0IGluIHJlZ2V4IGFib3ZlCm15ICRmbllZICAgPSBzdWJzdHIoJGZueWVhciwgMiwgMik7CgoKIyBtb250aHMKbXkgJW1vbnRocyA9ICgKICAgICAiMDEiID0+ICJKQU4iLAogICAgICIwMiIgPT4gIkZFQiIsCiAgICAgIjAzIiA9PiAiTUFSIiwKICAgICAiMDQiID0+ICJBUFIiLAogICAgICIwNSIgPT4gIk1BWSIsCiAgICAgIjA2IiA9PiAiSlVOIiwKICAgICAiMDciID0+ICJKVUwiLAogICAgICIwOCIgPT4gIkFVRyIsCiAgICAgIjA5IiA9PiAiU0VQIiwKICAgICAiMTAiID0+ICJPQ1QiLAogICAgICIxMSIgPT4gIk5PViIsCiAgICAgIjEyIiA9PiAiREVDIiwKICAgICApOwoKbXkgJW1vbnRobmFtZXMgPSAoCiAgICAgIjAxIiA9PiAiSmFudWFyeSIsCiAgICAgIjAyIiA9PiAiRmVicnVhcnkiLAogICAgICIwMyIgPT4gIk1hcmNoIiwKICAgICAiMDQiID0+ICJBcHJpbCIsCiAgICAgIjA1IiA9PiAiTWF5IiwKICAgICAiMDYiID0+ICJKdW5lIiwKICAgICAiMDciID0+ICJKdWx5IiwKICAgICAiMDgiID0+ICJBdWd1c3QiLAogICAgICIwOSIgPT4gIlNlcHRlbWJlciIsCiAgICAgIjEwIiA9PiAiT2N0b2JlciIsCiAgICAgIjExIiA9PiAiTm92ZW1iZXIiLAogICAgICIxMiIgPT4gIkRlY2VtYmVyIiwKICAgICApOwoKbXkgJW1hcHBpbmcgPSAoKTsKJG1hcHBpbmd7ImFpa2FrYXVzaSJ9ICAgPSAiWmVpdHNjaHJpZnQiOwokbWFwcGluZ3sic2Fub21hbGVodGkifSA9ICJaZWl0dW5nIjsKCgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyByZWFkIHNvdXJjZSBtZXRhZGF0YSBmaWxlIChwcmVwYXJlZCBtYW51YWxseSA9PiB1bHRpbWF0ZWx5IHJlYWQgdGhlIGluZm8gZnJvbSBDTURJIEZpbGU/KQojIGFuZCBzZXQgdmFyaWFibGVzCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpvcGVuKG15ICRTT1VSQ0VTLCAiPCAkc291cmNlc2NzdmZpbGUiKSB8fCBkaWUoIiQwOiBjYW5ub3Qgb3BlbiBmaWxlIGZvciByZWFkaW5nOiAkc291cmNlc2NzdmZpbGUiKTsKd2hpbGUobXkgJGZsaW5lID0gPCRTT1VSQ0VTPil7CiAgICBjaG9tcCgkZmxpbmUpOwoKICAgIGlmICgkZmxpbmU9fi9eXCMvIHx8ICRmbGluZT1+L15ccyokLyB8fCAkZmxpbmUgPX4gIlRFSUNPUlBVU0lEIil7bmV4dDt9ICAgICMgc2tpcCBsaW5lIGlmIGVtcHR5IGxpbmUgb3IgY29tbWVudCBsaW5lIG9yIGZpcnN0IGxpbmUKICAgIG15IEBmbGFycmF5ID0gc3BsaXQoL1xzKlx0K1xzKi8sICRmbGluZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3BsaXQgZWFjaCBsaW5lIGludG8gYXJyYXkKCiAgICAjIChUb0RvOiB0aGUgZm9sbG93aW5nIGhhc2hlcyBjb3VsZCBwcm9iYWJseSBjb25mbGF0ZWQgaW50byBhbiBhcnJheSBvZiBoYXNoZXMgb3Igc28pCgogICAgIyBzZXQgZnVsbCB0aXRsZXMgKCRmbGFycmF5WzNdKSBhcyBrZXlzOgogICAgJGNvcnB1c2lkc3skZmxhcnJheVszXX0gICAgID0gJGZsYXJyYXlbMV07CiAgICAkc3JjcHVibGlkc3skZmxhcnJheVszXX0gICAgPSAkZmxhcnJheVsyXTsKICAgICRzcmNmdWxsbmFtZXN7JGZsYXJyYXlbM119ICA9ICRmbGFycmF5WzNdOwogICAgJHNyY3B1YnBsYWNlc3skZmxhcnJheVszXX0gID0gJGZsYXJyYXlbOF07CiAgICAkc3JjcHVibGlzaGVyc3skZmxhcnJheVszXX0gPSAkZmxhcnJheVs5XTsKICAgICRzcmN0ZXh0dHlwZXN7JGZsYXJyYXlbM119ICA9ICRmbGFycmF5WzZdOwogICAgJHNyY3RleHRsYW5nc3skZmxhcnJheVszXX0gID0gJGZsYXJyYXlbN107CgogICAgIyBhbHNvIHNldCBzaW1wbGUgdGl0bGVzICgkZmxhcnJheVs1XSkgYXMga2V5czogCiAgICAkY29ycHVzaWRzeyRmbGFycmF5WzRdfSAgICAgPSAkZmxhcnJheVsxXTsKICAgICRzcmNwdWJsaWRzeyRmbGFycmF5WzRdfSAgICA9ICRmbGFycmF5WzJdOyAgICAKICAgICRzcmNmdWxsbmFtZXN7JGZsYXJyYXlbNF19ICA9ICRmbGFycmF5WzNdOwogICAgJHNyY3B1YnBsYWNlc3skZmxhcnJheVs0XX0gID0gJGZsYXJyYXlbOF07CiAgICAkc3JjcHVibGlzaGVyc3skZmxhcnJheVs0XX0gPSAkZmxhcnJheVs5XTsKICAgICRzcmN0ZXh0dHlwZXN7JGZsYXJyYXlbNF19ICA9ICRmbGFycmF5WzZdOwogICAgJHNyY3RleHRsYW5nc3skZmxhcnJheVs0XX0gID0gJGZsYXJyYXlbN107CgogICAgIyBhbHNvIHNldCBwdWJsaWRzICgkZmxhcnJheVsyXSkgYXMga2V5czogCiAgICAkY29ycHVzaWRzeyRmbGFycmF5WzJdfSAgICAgPSAkZmxhcnJheVsxXTsKICAgICRzcmNwdWJsaWRzeyRmbGFycmF5WzJdfSAgICA9ICRmbGFycmF5WzJdOyAgICAKICAgICRzcmNmdWxsbmFtZXN7JGZsYXJyYXlbMl19ICA9ICRmbGFycmF5WzNdOwogICAgJHNyY3B1YnBsYWNlc3skZmxhcnJheVsyXX0gID0gJGZsYXJyYXlbOF07CiAgICAkc3JjcHVibGlzaGVyc3skZmxhcnJheVsyXX0gPSAkZmxhcnJheVs5XTsKICAgICRzcmN0ZXh0dHlwZXN7JGZsYXJyYXlbMl19ICA9ICRmbGFycmF5WzZdOwogICAgJHNyY3RleHRsYW5nc3skZmxhcnJheVsyXX0gID0gJGZsYXJyYXlbN107Cn0KY2xvc2UoJFNPVVJDRVMpOwoKJGV4cGFuZExhbmd7ImZpIn0gPSAiRmlubmlzaCI7CiRleHBhbmRMYW5neyJzdiJ9ID0gIlN3ZWRpc2giOwoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyByZWFkIGNvcnB1c0hlYWRlclNrZWxldG9uIGRvY3VtZW50IGFuZCBzdGFydCBhIHR3aWcgZm9yIGl0CiMgKHNpbmNlIHRoaXMgZmlsZSBuZWVkIG5vdCBiZSBzdHJlYW1lZCwgbm8gaGFuZGxlcnMgYXJlIG5lZWRlZCkKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKbXkgJHRlaUNvcnB1c0hlYWRlckRvY1R3aWcgPSBuZXcgWE1MOjpUd2lnKAogICAga2VlcF9zcGFjZXMgPT4gMSwKICAgIGtlZXBfYXR0c19vcmRlciA9PiAxLAogICAgY29tbWVudHMgPT4gJ2Ryb3AnLAogICAgKTsKCgokdGVpQ29ycHVzSGVhZGVyRG9jVHdpZy0+cGFyc2VmaWxlKCRjb3JwaGVhZGVyZmlsZSk7Cm15ICRjb3JwdXNIZWFkZXIgPSAkdGVpQ29ycHVzSGVhZGVyRG9jVHdpZy0+cm9vdDsgICAgICAgICAgICAgICAgICAjIGdldHRpbmcgdGhlIHRlaUhlYWRlciBmb3IgY29ycHVzIG91dCBvZiB0aGUgdGVpQ29ycHVzSGVhZGVyU2tlbGV0b24gZG9jdW1lbnQKCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgcmVhZCB0ZXh0SGVhZGVyU2tlbGV0b24gZG9jdW1lbnQgYW5kIHN0YXJ0IGEgdHdpZyBmb3IgaXQKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKbXkgJHRlaVRleHRIZWFkZXJEb2NUd2lnID0gbmV3IFhNTDo6VHdpZygKICAgIGtlZXBfc3BhY2VzID0+IDEsCiAgICBrZWVwX2F0dHNfb3JkZXIgPT4gMSwKICAgIGNvbW1lbnRzID0+ICdkcm9wJywKICAgICk7CgokdGVpVGV4dEhlYWRlckRvY1R3aWctPnBhcnNlZmlsZSgkdGV4dGhlYWRlcmZpbGUpOwpteSAkdGV4dEhlYWRlciA9ICR0ZWlUZXh0SGVhZGVyRG9jVHdpZy0+cm9vdDsgICAgICAgICAgICAgICAgICAgICAgIyBnZXR0aW5nIHRoZSB0ZWlIZWFkZXIgZm9yIGNvcnB1cyBvdXQgb2YgdGhlIHRlaVRleHRIZWFkZXJTa2VsZXRvbiBkb2N1bWVudAoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBkZWZpbmUgYSBzdWJ0cmVlIGZvciBpZHNEb2MKIyBmb3IgdGhlIHRpbWUgYmVpbmcgaXQgd2lsbCBvbmx5IGJlIHVzZWQgZm9yIHRoZSBmaXJzdAojIGlkc0RvYyBoZWFkZXIsIHRvIGJlIGluc2VydGVkIGluIHRoZSByb290IGhhbmRlcgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpteSAkaWRzRG9jICAgICAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnaWRzRG9jJyk7ICAgIApteSAkaWRzRG9jSGVhZGVyID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnaWRzSGVhZGVyJyk7CgppZigkVEVJRk9STUFUIGVxICJJNSIpewogICAgbXkgJGRvY0ZpbGVEZXNjICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2ZpbGVEZXNjJyk7CiAgICBteSAkZG9jVGl0bGVTdG10ID0gWE1MOjpUd2lnOjpFbHQtPm5ldygndGl0bGVTdG10Jyk7CiAgICBteSAkZHRpdGxlICAgICAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnZC50aXRsZScpOwogICAgbXkgJGRvY1NpZ2xlICAgICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2Rva3VtZW50U2lnbGUnKTsKCiAgICBteSAkZG9jUHVibGljYXRpb25TdG10ID0gWE1MOjpUd2lnOjpFbHQtPm5ldygncHVibGljYXRpb25TdG10Jyk7CiAgICBteSAkZG9jRGlzdHJpYnV0b3IgICAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnZGlzdHJpYnV0b3InKTsKICAgIG15ICRkb2NQdWJBZGRyZXNzICAgICAgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCdwdWJBZGRyZXNzJyk7CiAgICBteSAkZG9jQXZhaWxhYmlsaXR5ICAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnYXZhaWxhYmlsaXR5Jyk7CiAgICBteSAkZG9jUHViRGF0ZSAgICAgICAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygncHViRGF0ZScpOwogICAgCiAgICBteSAkZG9jU291cmNlRGVzYyAgICAgICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ3NvdXJjZURlc2MnKTsKICAgIG15ICRkb2NCaWJsU3RydWN0ICAgICAgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCdiaWJsU3RydWN0Jyk7CiAgICBteSAkZG9jTW9ub2dyICAgICAgICAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnbW9ub2dyJyk7CiAgICBteSAkZG9jSFRpdGxlICAgICAgICAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnaC50aXRsZScpOwogICAgbXkgJGRvY0ltcHJpbnQgICAgICAgICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2ltcHJpbnQnKTsKCiAgICAkaWRzRG9jICAgICAgICAgICAgICAgICAgICAtPiBzZXRfYXR0KCd2ZXJzaW9uJywgIjEuMCIpOwogICAgJGlkc0RvYyAgICAgICAgICAgICAgICAgICAgLT4gc2V0X2F0dCgnVEVJZm9ybScsICJURUkuMiIpOwoKICAgICRpZHNEb2NIZWFkZXIgICAgICAgICAgICAgIC0+IHNldF9hdHQoJ3ZlcnNpb24nLCAiMS4xIik7CiAgICAkaWRzRG9jSGVhZGVyICAgICAgICAgICAgICAtPiBzZXRfYXR0KCd0eXBlJywgImRvY3VtZW50Iik7CiAgICAkaWRzRG9jSGVhZGVyICAgICAgICAgICAgICAtPiBzZXRfYXR0KCdwYXR0ZXJuJywgInRleHQiKTsKICAgICRpZHNEb2NIZWFkZXIgICAgICAgICAgICAgIC0+IHNldF9hdHQoJ1RFSWZvcm0nLCAidGVpSGVhZGVyIik7CgoKICAgIAogICAgJGRvY1NpZ2xlICAgICAgICAgICAgICAgICAgLT4gcGFzdGUoImZpcnN0X2NoaWxkIiwgJGRvY1RpdGxlU3RtdCk7CiAgICAkZHRpdGxlICAgICAgICAgICAgICAgICAgICAtPiBwYXN0ZSgibGFzdF9jaGlsZCIsICAkZG9jVGl0bGVTdG10KTsKICAgICRkb2NUaXRsZVN0bXQgICAgICAgICAgICAgIC0+IHBhc3RlKCJsYXN0X2NoaWxkIiwgICRkb2NGaWxlRGVzYyk7CiAgICAkZG9jRmlsZURlc2MgICAgICAgICAgICAgICAtPiBwYXN0ZSgibGFzdF9jaGlsZCIsICAkaWRzRG9jSGVhZGVyKTsKICAgICRkb2NQdWJsaWNhdGlvblN0bXQgICAgICAgIC0+IHBhc3RlKCJsYXN0X2NoaWxkIiwgICRkb2NGaWxlRGVzYyk7CiAgICAkZG9jRGlzdHJpYnV0b3IgICAgICAgICAgICAtPiBwYXN0ZSgibGFzdF9jaGlsZCIsICAkZG9jUHVibGljYXRpb25TdG10KTsKICAgICRkb2NQdWJBZGRyZXNzICAgICAgICAgICAgIC0+IHBhc3RlKCJsYXN0X2NoaWxkIiwgICRkb2NQdWJsaWNhdGlvblN0bXQpOwoKICAgICRkb2NBdmFpbGFiaWxpdHkgICAgICAgICAgIC0+IHBhc3RlKCJsYXN0X2NoaWxkIiwgICRkb2NQdWJsaWNhdGlvblN0bXQpOwogICAgJGRvY1B1YkRhdGUgICAgICAgICAgICAgICAgLT4gcGFzdGUoImxhc3RfY2hpbGQiLCAgJGRvY1B1YmxpY2F0aW9uU3RtdCk7CgogICAgJGRvY1NvdXJjZURlc2MgICAgICAgICAgICAgLT4gcGFzdGUoImxhc3RfY2hpbGQiLCAgJGRvY0ZpbGVEZXNjKTsKICAgICRkb2NCaWJsU3RydWN0ICAgICAgICAgICAgIC0+IHBhc3RlKCJsYXN0X2NoaWxkIiwgICRkb2NTb3VyY2VEZXNjKTsKICAgICRkb2NNb25vZ3IgICAgICAgICAgICAgICAgIC0+IHBhc3RlKCJsYXN0X2NoaWxkIiwgICRkb2NCaWJsU3RydWN0KTsKICAgICRkb2NIVGl0bGUgICAgICAgICAgICAgICAgIC0+IHBhc3RlKCJsYXN0X2NoaWxkIiwgICRkb2NNb25vZ3IpOwogICAgJGRvY0ltcHJpbnQgICAgICAgICAgICAgICAgLT4gcGFzdGUoImxhc3RfY2hpbGQiLCAgJGRvY01vbm9ncik7CiAgICAKICAgICRpZHNEb2NIZWFkZXIgICAgICAgICAgIC0+IHBhc3RlKCJsYXN0X2NoaWxkIiwgICRpZHNEb2MpOwoKICAgICRkb2NTaWdsZS0+c2V0X3RleHQoJGNvcnB1c2lkc3skZm5zb3VyY2V9IC4gJGZuWVkgIC4gIi9KQU4iKTsKICAgICRkdGl0bGUgIC0+c2V0X3RleHQoJHNyY2Z1bGxuYW1lc3skZm5zb3VyY2V9IC4gIiwgSmFudWFyeSAiIC4gJGZueWVhcik7Cn0KCgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyByZWFkIHRoZSBpbnB1dCBWUlQtWE1MIGRvY3VtZW50CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpvcGVuKG15ICRJTiwgICI8ICRBUkdWWzBdIikgfHwgZGllKCIkMDogY2Fubm90IG9wZW4gZmlsZSBmb3IgcmVhZGluZzogJEFSR1ZbMF0iKTsgICAgICMgb3BlbiBpbnB1dCAgZmlsZSBhbmQgaW5pdGlhbGlzZSBmaWxlaGFuZGVsLCBhY3R1YWxseSBkb2VzIG5vdCBzZWVtIHRvIGJlIG5lZWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXMgcGFyc2VmaWxlKCkgKHMuYi4pIGlzIGFwcGxpZWQgdG8gdGhlIGZpbGVuYW1lCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICAgICBNIEEgSSBOICAKIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHN0YXJ0IHR3aWcgZm9yIGlucHV0IGFuZCBjYWxsIHN0YXJ0IHRhZyBoYW5kbGVyIGZvciByb290IGFuZCB0d2lnIGhhbmRsZXIgZm9yIGVhY2ggPHRleHQ+IGluIHRoZSBWUlQKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgokdHdpZyA9IG5ldyBYTUw6OlR3aWcoCiAgICBrZWVwX3NwYWNlcyA9PiAxLCAgICAgICAgICAgIyBkYWR1cmNoIGF1Y2ggd2hpdGVzcGFjZXMgYW4gZWhlbWVsaWdlbiBlbGVtZW50Z3JlbnplbiBpbSBvdXRwdXQKICAgIGtlZXBfYXR0c19vcmRlciA9PiAxLCAgICAgICAjIHJlcXVpcmVzIFRpZTo6SXhIYXNoCiAgICBjb21tZW50cyA9PiAnZHJvcCcsCiAgICBzdGFydF90YWdfaGFuZGxlcnMgPT4gewogICAgCXRleHRzID0+IHN1Yntyb290KEBfLCAkY29ycHVzSGVhZGVyKX0KICAgIH0sCgogICAgdHdpZ19oYW5kbGVycyA9PiAgewojCXRleHQgPT4gXCZ0ZXh0Cgl0ZXh0ID0+ICBzdWJ7dGV4dChAXywgJHRleHRIZWFkZXItPmNvcHkpfSAgICAjICAgY29weSBtdXN0IGJlIGJlY2F1c2UgdGV4dEhlYWRlciB3aWxsIGJlIGZsdXNoZWQgd2l0aCAkdHdpZyBpbiB0aGUgPHRleHQ+IGhhbmRsZXI7CiAgICB9LAoKICAgIG91dHB1dF9lbmNvZGluZyA9PiAkZW5jb2RpbmcsCiAgICApOwoKJHR3aWctPnBhcnNlZmlsZSgkQVJHVlswXSk7CgoKIyMjIyMjIyMjIyMKIyBFTkQgTUFJTgojIyMjIyMjIyMjIwoKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgICBTIFUgQiBSIE8gVSBUIEkgTiBFIFMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpzdWIgcm9vdCB7CiAgICBteSAoJHR3aWcsICRyb290LCAkY29ycHVzSGVhZGVyKSA9QF87CgogICAgaWYoJFRFSUZPUk1BVCBlcSAiSTUiKSB7CgkkdHdpZy0+c2V0X2RvY3R5cGUoJERURERFQ0wpOyAgICMgdGhlIGRvY3R5cGUgY291bGQgcHJvYmFibHkgYmUgc2V0IGFueXdoZXJlIHRvIHRoZSB0d2lnCgkkcm9vdC0+c2V0X2dpKCdpZHNDb3JwdXMnKTsKCSRyb290LT5zZXRfYXR0KCd2ZXJzaW9uJywgIjEuMCIpOwoJJHJvb3QtPnNldF9hdHQoJ1RFSWZvcm0nLCAidGVpQ29ycHVzLjIiKTsKCQogICAgfQogICAgZWxzZSB7Cgkkcm9vdC0+c2V0X2dpKCd0ZWlDb3JwdXMnKTsKCSRyb290LT5zZXRfYXR0KCJ4bWxucyIsICdodHRwOi8vd3d3LnRlaS1jLm9yZy9ucy8xLjAnKTsKICAgIH0KICAgIAogICAgJmluc2VydENvcnB1c0hlYWRlcigkcm9vdCwgJGNvcnB1c0hlYWRlcik7Cn0KCgoKc3ViIGluc2VydENvcnB1c0hlYWRlcnsKICAgIG15ICgkcm9vdCwgJGNvcnB1c0hlYWRlcikgPUBfOwoKICAgIG15ICRpZGVudCA9ICJpZGVudCI7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIHNldCBjb3JwdXMgaGVhZGVyCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgJnNldF90aXRsZSgkY29ycHVzSGVhZGVyLCAkc3JjZnVsbG5hbWVzeyRmbnNvdXJjZX0sICRmbnllYXIsICRraWVsaXBhbmtraUNvcnB1cyk7CgogICAgaWYoJFRFSUZPUk1BVCBlcSAiVEVJIil7Cgkmc2V0X3NvdXJjZURlc2MoJGNvcnB1c0hlYWRlciwgJHNyY2Z1bGxuYW1lc3skZm5zb3VyY2V9LCAkZm55ZWFyLCAka2llbGlwYW5ra2lDb3JwdXMpOwogICAgfQogICAgZWxzaWYoJFRFSUZPUk1BVCBlcSAiSTUiKXsKCSRpZGVudD0iaWQiOwoJJGNvcnB1c0hlYWRlci0+Z2V0X3hwYXRoKCJmaWxlRGVzYy90aXRsZVN0bXQva29ycHVzU2lnbGUiLDApICAtPnNldF90ZXh0KCRjb3JwdXNpZHN7JGZuc291cmNlfSAuICRmbllZKTsKCSRjb3JwdXNIZWFkZXItPmdldF94cGF0aCgiZmlsZURlc2MvcHVibGljYXRpb25TdG10L3B1YkRhdGUiLDApLT5zZXRfdGV4dCgobG9jYWx0aW1lKVs1XSArIDE5MDApOwoJJGNvcnB1c0hlYWRlci0+Z2V0X3hwYXRoKCdlbmNvZGluZ0Rlc2MvZWRpdG9yaWFsRGVjbC90cmFuc2R1Y3Rpb25bQG49IjIiXScsMCkgIC0+c2V0X3RleHQoIkk1IHZlcnNpb24gYnkgRXVSZUNvIHVzaW5nIHZydDJ0ZWkucGwgIiAuIGxvY2FsdGltZS0+eW1kKCctJykpOwoJJnNldF9zb3VyY2VEZXNjSTUoJGNvcnB1c0hlYWRlcik7CiAgICB9CiAgICBlbHNlewoJcHJpbnQgU1RERVJSICJURUlGT1JNQVQgaXMgJFRFSUZPUk1BVDsgbXVzdCBiZSBURUkgb3IgSTUiOwogICAgfQoKICAgICRjb3JwdXNIZWFkZXItPnBhc3RlKCJmaXJzdF9jaGlsZCIsICRyb290KTsKICAgICRjb3JwdXNIZWFkZXItPmdldF94cGF0aCgnLi9wcm9maWxlRGVzYy9sYW5nVXNhZ2UvbGFuZ3VhZ2UnLCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRfYXR0KCRpZGVudCwgJHNyY3RleHRsYW5nc3skZm5zb3VyY2V9KTsKICAgICRjb3JwdXNIZWFkZXItPmdldF94cGF0aCgnLi9wcm9maWxlRGVzYy9sYW5nVXNhZ2UvbGFuZ3VhZ2UnLCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRfdGV4dCgkZXhwYW5kTGFuZ3skc3JjdGV4dGxhbmdzeyRmbnNvdXJjZX19KTsKCiAgICBpZigkVEVJRk9STUFUIGVxICJJNSIpewoJJGlkc0RvYy0+cGFzdGUoImFmdGVyIiwgICAgICAgJGNvcnB1c0hlYWRlcik7CiAgICB9Cn0KICAgIAoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBoYW5kbGVyICZ0ZXh0IGZvciA8dGV4dD4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnN1YiB0ZXh0IHsKICAgIG15ICgkdHdpZywgJHRleHQsICR0ZXh0SGVhZGVyKSA9IEBfOwoKICAgICR0ZXh0Y291bnRlcisrOyAgICAgICAgICAgICAgIAoKICAgIAogICAgIyBUb0RvOiBjYXRjaCBhbGwgb3RoZXIsIHVuZXhwZWN0ZWQgY2hpbGRyZW4gb2Ygcm9vdAoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBHZXQgdGV4dCBtZXRhZGF0YSAoYXR0cmlidXRlcyBvZiA8dGV4dD4pIGFuZCBjcmVhdGUgdGVpSGVhZGVyIGZvciA8dGV4dD4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICBteSAkdGV4dGF0dHNyZWYgPSAkdGV4dC0+YXR0cygpOyAgICAgICAgICAgICAgICMgJHRleHRhdHRzcmVmIGlzIG5vdyBhIHJlZmVyZW5jZSB0byBhIGhhc2ggYW5kIHNob3VsZCBiZSB1c2VkIHdpdGggJy0+JwoKICAgICZjcmVhdGVJZHNEb2MoJHRleHRhdHRzcmVmKTsgICAgICAgICAgICAgICAgICAgIyB0aGlzIGNyZWF0aW9uIG9mIGlkc0RvYyB3aWxsIG9ubHkgYmUgY2FsbGVkIGZvciB0aGUgMm5kIGlkc0RvYyAoaS5lLiBmZWJydWFyeSkgb3IgaGlnaGVyCgoKCiAgICAjICZjcmVhdGVUZXh0SGVhZGVyIHJldHVybnMgdGhlICR0ZXh0SUQ6CiAgICBteSAkdGV4dElEID0gJmNyZWF0ZVRleHRIZWFkZXIoJHRleHQsICR0ZXh0YXR0c3JlZiwgJHRleHRIZWFkZXIpOwogICAgCiAgICAKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGNyZWF0ZSA8VEVJPiBvciA8aWRzVGV4dD4gZnJvbSA8dGV4dD4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgICMgc2V0IHZydCA8dGV4dD4gdG8gPFRFST4gYW5kIGRlbGV0ZSBhbGwgYXR0cmlidXRlcyBhZnRlciB0aGV5IHdlcmUgd2VyZSBzYXZlZCBhYm92ZQogICAgJHRleHQtPmRlbF9hdHRzOwogICAgCiAgICBpZigkVEVJRk9STUFUIGVxICJURUkiKXsKCSR0ZXh0LT5zZXRfZ2koIlRFSSIpOwoJJHRleHQtPnNldF9hdHQoJ3htbDppZCcsICR0ZXh0SUQpOwogICAgfQogICAgZWxzZSB7CgkkdGV4dCAgICAtPnNldF9naSgiaWRzVGV4dCIpOwoJJHRleHQgICAgLT5zZXRfYXR0KCd2ZXJzaW9uJywgIjEuMCIpOwojCSR0ZXh0ICAgIC0+bW92ZSgibGFzdF9jaGlsZCIsICRpZHNEb2MpOyAgICAgICAgICAgICAgICAgICAgICAgIyBkb2VzIG5vdCB3b3JrIGJlY2F1c2UgYXBwYXJlbnRseSAkaWRzRG9jIGlzIG5vdCB1bmRlciAkcm9vdCBhdCB0aGlzIHBvaW50CgogICAgfQoKICAgIAogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGNyZWF0ZSB0aGUgPHRlaTp0ZXh0PiwgPGJvZHk+LCA8ZGl2PiBlbGVtZW50cyBpbnNpZGUgPFRFST4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgbXkgJHR0ZXh0X2VsZW1lbnQgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCd0ZXh0Jyk7CiAgICBteSAkYm9keV9lbGVtZW50ICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2JvZHknKTsKICAgIG15ICRkaXZfZWxlbWVudCAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnZGl2Jyk7CgogICAgIyBzZXQgYXR0cwogICAgJGRpdl9lbGVtZW50ICAtPnNldF9hdHQoInR5cGUiLCAicGFnZSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUb0RvOiB0aGlzIGlzIHNwZWNpZmljIHRvIEtMSwogICAgJHR0ZXh0X2VsZW1lbnQtPnNldF9hdHQoInhtbDpsYW5nIiwgJ2ZpJyk7ICAgICAgICAgICAgICAgICAgICAgICAgIyBhcyBpbiBJQ0MtTk9SCgogICAgIyBwYXN0ZQogICAgJHR0ZXh0X2VsZW1lbnQtPnBhc3RlKCdsYXN0X2NoaWxkJywgICR0ZXh0KTsKICAgICRib2R5X2VsZW1lbnQgLT5wYXN0ZSgnbGFzdF9jaGlsZCcsICAkdHRleHRfZWxlbWVudCk7CiAgICAkZGl2X2VsZW1lbnQgIC0+cGFzdGUoJ2xhc3RfY2hpbGQnLCAgJGJvZHlfZWxlbWVudCk7CgogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBjcmVhdGUgPHA+IGZyb20gPHBhcmFncmFwaD4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15IEBwYXJhZ3JhcGhzID0gJHRleHQtPmNoaWxkcmVuKCAncGFyYWdyYXBoJyk7CgogICAgZm9yZWFjaCBteSAkcGFyYWdyYXBoIChAcGFyYWdyYXBocykgewoJCgkmc2V0UCgkcGFyYWdyYXBoKTsKCgkkcGFyYWdyYXBoLT5tb3ZlKCdsYXN0X2NoaWxkJywgJGRpdl9lbGVtZW50KTsKCQoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJIyBjcmVhdGUgPHM+IGZyb20gPHNlbnRlbmNlPgoJIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCglteSBAc2VudGVuY2VzID0gJHBhcmFncmFwaC0+Y2hpbGRyZW4oJ3NlbnRlbmNlJyk7Cglmb3JlYWNoIG15ICRzZW50ZW5jZSAoQHNlbnRlbmNlcykgewoKCSAgICAmc2V0Uygkc2VudGVuY2UpOwoKCgkgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICAgIyBjcmVhdGUgPHc+ICh3b3JkKSBmcm9tIGVhY2ggJGxpbmUKCSAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgICAKCSAgICBteSBAbGluZXMgPSBzcGxpdCgvXG4rLywgJHNlbnRlbmNlLT54bWxfdGV4dCk7CgkgICAgJHNlbnRlbmNlLT5zZXRfdGV4dCgiXG4iKTsKCgkgICAgZm9yIG15ICRsaW5lIChAbGluZXMpeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVG9kbzogUmVpaGVuZm9sZ2UgY2hlY2tlbgoJCWlmKCRsaW5lIG5lICIiICl7CgkJICAgIG15ICR3X2VsZW1lbnQgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCd3Jyk7CgkJICAgICZjcmVhdGVXKCR3X2VsZW1lbnQsICRsaW5lKTsKCQkgICAgJHdfZWxlbWVudC0+cGFzdGUoJ2xhc3RfY2hpbGQnLCAkc2VudGVuY2UpOwoJCX0KCSAgICB9ICMgZW5kIHdvcmRzCgl9ICMgZW5kIHNlbnRlbmNlcwogICAgfSAjIGVuZCBwYXJhZ3JhcGhzCgogICAgIyAkdHdpZy0+c2V0X3ByZXR0eV9wcmludCggJ3JlY29yZCcpOwogICAgIyAkdHdpZy0+Zmx1c2goJE9VVCk7CiAgICAkdHdpZy0+Zmx1c2goIi9kZXYvc3Rkb3V0Iik7Cn0KCnN1YiBjcmVhdGVUZXh0SGVhZGVyewogICAgbXkgKCR0ZXh0LCAkdGV4dGF0dHNyZWYsICR0ZXh0SGVhZGVyKSA9IEBfOwogICAgCiAgICAjIFVTRSAwMSBiaW5kaW5nX2lkPSIyMjQ2MDI1IgogICAgIyBVU0UgMDIgZGF0ZT0iMjAyMS0wMS0xNSIKICAgICMgICAgIDAzIGRhdGVmcm9tPSIyMDIxMDExNSIKICAgICMgICAgIDA0IGRhdGV0bz0iMjAyMTAxMTUiCiAgICAjICAgICAwNSBlbGVjX2RhdGU9Il8iCiAgICAjICAgICAwNiBmaWxlPSIiCiAgICAjIFVTRSAwNyBmaWxlbmFtZV9tZXRhZGF0YT0iZmluY2xhcmluX3NpaXJ0b19rMjAyMS8wMDM5LTU1NTIvMjAyMS9hbHRvLzIyNDYwMjVfMDAzOS01NTUyXzIwMjEtMDEtMTVfU0swMjIxX21ldHMueG1sIgogICAgIyBVU0UgMDggZmlsZW5hbWVfb3JpZyAgICA9ImZpbmNsYXJpbl9zaWlydG9fazIwMjEvMDAzOS01NTUyLzIwMjEvYWx0by8yMjQ2MDI1XzAwMzktNTU1Ml8yMDIxLTAxLTE1X1NLMDIyMV9wYWdlLTIwMjEwMTE1MDIyMTAwMzAzMDEueG1sCiAgICAjIFVTRSAwOSBpZD0idC1iY2QwZjNmYS1iYmQzZGFjNCIKICAgICMgICAgIDEwIGltZ191cmw9IiIKICAgICMgVVNFIDExIGlzc3VlX2RhdGU9IjE1LjAxLjIwMjEiCiAgICAjIFVTRSAxMiBpc3N1ZV9ubz0iU0swMjIxIgogICAgIyBVU0UgMTMgaXNzdWVfdGl0bGU9IlN1b21lbiBLdXZhbGVodGkiCiAgICAjIFVTRSAxNCBsYWJlbD0iU3VvbWVuIEt1dmFsZWh0aSBuby4gU0swMjIxIDE1LjAxLjIwMjEiCiAgICAjIFVTRSAxNiBsYW5ndWFnZT0iZmkiCiAgICAjIFVTRSAxNyBwYWdlX2lkPSJwMSIKICAgICMgVVNFIDE4IHBhZ2Vfbm89Ik5vbmUiCiAgICAjICAgICAxOSBwYXJ0X25hbWU9Il8iCiAgICAjIFVTRSAyMCBwdWJsX2lkPSIwMDM5LTU1NTIiCiAgICAjICAgICAyMSBwdWJsX3BhcnQ9IiIKICAgICMgVVNFIDIyIHB1YmxfdGl0bGU9IlN1b21lbiBLdXZhbGVodGkiIAogICAgIyBVU0UgMjMgcHVibF90eXBlPSJhaWtha2F1c2kiCiAgICAjIFVTRSAyNCBzZW50Y291bnQ9IjcwIgogICAgIyBVU0UgMjUgc3VtX2xhbmc9Inx4eHg6NDR8ZmluOjIzfGVuZzozfCIKICAgICMgICAgIDI2IHRpbWVmcm9tPSIwMDAwMDAiCiAgICAjICAgICAyNyB0aW1ldG89IjIzNTk1OSIKICAgICMgVVNFIDI4IHRva2VuY291bnQ9IjMwNCIKICAgICMgICAgIDI5IHZlcnNpb25fYWRkZWQ9IktMSy1maS0yMDIxIj4KCgogICAgbXkgJEJJRCAgICAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydiaW5kaW5nX2lkJ307CiAgICBteSAkREFURSAgICAgICAgID0gJHRleHRhdHRzcmVmLT57J2RhdGUnfTsKICAgIG15ICRNRVRBRklMRU5BTUUgPSAkdGV4dGF0dHNyZWYtPnsnZmlsZW5hbWVfbWV0YWRhdGEnfTsgICAgCiAgICBteSAkT1JJR0ZJTEVOQU1FID0gJHRleHRhdHRzcmVmLT57J2ZpbGVuYW1lX29yaWcnfTsKICAgIG15ICRJRCAgICAgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnaWQnfTsKICAgIG15ICRJU1NVRURBVEUgICAgPSAkdGV4dGF0dHNyZWYtPnsnaXNzdWVfZGF0ZSd9OwogICAgbXkgJElTU1VFTk8gICAgICA9ICR0ZXh0YXR0c3JlZi0+eydpc3N1ZV9ubyd9OwogICAgbXkgJElTU1VFVElUTEUgICA9ICR0ZXh0YXR0c3JlZi0+eydpc3N1ZV90aXRsZSd9OwogICAgbXkgJExBQkVMICAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydsYWJlbCd9OwogICAgbXkgJExBTkdVQUdFICAgICA9ICR0ZXh0YXR0c3JlZi0+eydsYW5ndWFnZSd9OwogICAgbXkgJFBBR0VJRCAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydwYWdlX2lkJ307CiAgICBteSAkUEFHRU5PICAgICAgID0gJHRleHRhdHRzcmVmLT57J3BhZ2Vfbm8nfTsKICAgIG15ICRQVUJMVElUTEUgICAgPSAkdGV4dGF0dHNyZWYtPnsncHVibF90aXRsZSd9OwogICAgbXkgJFBVQkxJRCAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydwdWJsX2lkJ307CiAgICBteSAkUFVCTFRZUEUgICAgID0gJHRleHRhdHRzcmVmLT57J3B1YmxfdHlwZSd9OwogICAgbXkgJFNFTlRDT1VOVCAgICA9ICR0ZXh0YXR0c3JlZi0+eydzZW50Y291bnQnfTsKICAgIG15ICRTVU1MQU5HICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnc3VtX2xhbmcnfTsKICAgIG15ICRUT0tFTkNPVU5UICAgPSAkdGV4dGF0dHNyZWYtPnsndG9rZW5jb3VudCd9OwoKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgRGVyaXZlZCBNZXRhZGF0YSB2YXJpYWJsZXMKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIG15IEBkYXRlYXJyYXkgPSBzcGxpdCgiLSIsICREQVRFKTsKICAgIG15IEBsYW5nYXJyYXkgPSBzcGxpdCgifCIsICRTVU1MQU5HKTsKICAgIG15IEBuYW1lYXJyYXkgPSBzcGxpdCgvW1wuXC9dLywgJE9SSUdGSUxFTkFNRSk7ICAjIHVzZSAkbmFtZWFycmF5WzRdIGFzIElEIGZvciB0aGUgcGFnZQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGNyZWF0ZSB0ZXh0U2lnbGUgdG8gYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGZ1bmN0aW9uCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICMgU1VLMjEuSkFOLjAwMDAxCiAgICAKICAgIG15ICR5eSAgICAgICA9IHN1YnN0cigkZGF0ZWFycmF5WzBdLCAyLCAyKTsgICAgICAjIHN1YnN0ciBFWFBSLE9GRlNFVCxMRU5HVEgKICAgIG15ICRtbSAgICAgICA9ICRkYXRlYXJyYXlbMV07ICAgICAgICAgICAgICAgICAgICAjIHN1YnN0ciBFWFBSLE9GRlNFVCxMRU5HVEgKICAgIG15ICRNTU0gICAgICA9ICRtb250aHN7JG1tfTsKCiAgICBteSAkQ1NJR0xFID0gJGNvcnB1c2lkc3skZm5zb3VyY2V9IC4gJHl5OwogICAgCiAgICBteSAkdGV4dElEID0gJENTSUdMRSAuICJfIiAuICRNTU0gLiAiLiIgLiBzcHJpbnRmKCIlMDVkIiwgJGRvY2NvdW50ZXJ7JG1tfSsrKTsKICAgIG15ICR0ZXh0U2lnbGUgPSAkdGV4dElEOwogICAgCiAgICAKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBDUkVBVEUgdGV4dC10ZWlIZWFkZXIgQUNDT1JESU5HIFRPIFRIRSBTS0VMRVRPTiBpbiAkdGV4dEhlYWRlcgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKICAgICR0ZXh0SGVhZGVyLT5wYXN0ZSgnZmlyc3RfY2hpbGQnLCAkdGV4dCk7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIDx0ZWlIZWFkZXI+CiAgICAjICAgPGZpbGVEZXNjIG49IkV1UmVDby1LTEstRklOX1skSURdIj4KICAgICMgICAgIDx0aXRsZVN0bXQ+CiAgICAjICAgICAgIDx0aXRsZT5bJExBQkVMLCBwYWdlICRQQUdFTk9dPC90aXRsZT4JCgogICAgJHRleHRIZWFkZXItPmZpcnN0X2NoaWxkKCJmaWxlRGVzYyIpICAgLT4gIHNldF9hdHQoJ24nLCAiRXVSZUNvLSIuICRraWVsaXBhbmtraUNvcnB1cyAuICItIiAuICRJRCk7CgoKICAgICMtLS0tLS0tLS0tLS0tLS0tLQogICAgIyB0aXRsZVN0bXQKICAgICMtLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15ICR0aXRsZT0idGl0bGUiOwogICAgbXkgJHRpdGxlU3RtdCA9ICR0ZXh0SGVhZGVyLT5maXJzdF9jaGlsZCgiZmlsZURlc2MiKS0+Zmlyc3RfY2hpbGQoInRpdGxlU3RtdCIpOwogICAgCiAgICBpZigkVEVJRk9STUFUIGVxICJJNSIpewoJJHRpdGxlID0gInQudGl0bGUiOwkKCSR0ZXh0U2lnbGUgPX4gcy9fL1wvL2c7CgkkdGl0bGVTdG10LT5maXJzdF9jaGlsZCgidGV4dFNpZ2xlIiktPnNldF90ZXh0KCR0ZXh0U2lnbGUpOwogICAgfTsKICAgIAogICAgJHRpdGxlU3RtdC0+Zmlyc3RfY2hpbGQoJHRpdGxlKS0+c2V0X3RleHQoJExBQkVMIC4gIiwgVGV4dCAjIiAuICR0ZXh0Y291bnRlcik7CgogICAgIyBDYXNlIEtMSzogIFBBR0VOTyBzY2hlaW50IG1laXN0ICJOb25lIiB6dSBzZWluCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIDxmaWxlRGVzYz4KICAgICMgIDxzb3VyY2VEZXNjPgogICAgIyAgIDxiaWJsU3RydWN0PgogICAgIyAgICAgIDxhbmFseXRpYz4KICAgICMgICAgICAgICA8dGl0bGUgdHlwZT0ibWFpbiI+WyRMQUJFTCwgcGFnZSAkUEFHRU5PXTwvdGl0bGU+CiAgICAjICAgICAgICAgPGRhdGU+WyREQVRFXTwvZGF0ZT4KICAgICMgICAgICAgICA8ZGF0ZSB0eXBlPSJ5ZWFyIj5UT0RPPC9kYXRlPgogICAgIyAgICAgICAgIDxkYXRlIHR5cGU9Im1vbnRoIj5UT0RPPC9kYXRlPgogICAgIyAgICAgICAgIDxkYXRlIHR5cGU9ImRheSI+VE9ETzwvZGF0ZT4KICAgICMgICAgICAgICA8aWRubyB0eXBlPSJQQUdFSUQiPiRQQUdFSUQ8L2lkbm8+CiAgICAjICAgICAgICAgPGlkbm8gdHlwZT0iQklORElOR0lEIj4kQklEPC9pZG5vPgogICAgIyAgICAgICAgIDxpZG5vIHR5cGU9IklEIj4kSUQ8L2lkbm8+CiAgICAjICAgICAgICAgPGlkbm8gdHlwZT0iS0lFTElQQU5LS0lfTUVUQUZJTEVOQU1FIj4kTUVUQUZJTEVOQU1FPC9pZG5vPgogICAgIyAgICAgICAgIDxpZG5vIHR5cGU9IktJRUxJUEFOS0tJX09SSUdGSUxFTkFNRSI+JE9SSUdGSUxFTkFNRTwvaWRubz4KICAgICMgICAgICAgICA8dGV4dExhbmc+JExBTkdVQUdFPC90ZXh0TGFuZz4KCiAgICAKICAgIG15ICRhbmFseXRpYyAgPSAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCIuL2ZpbGVEZXNjL3NvdXJjZURlc2MvYmlibFN0cnVjdC9hbmFseXRpYyIsIDApOwogICAgaWYoJFRFSUZPUk1BVCBlcSAiSTUiKXskdGl0bGU9ImgudGl0bGUifTsKICAgIAogICAgCiAgICAkYW5hbHl0aWMtPmZpcnN0X2NoaWxkKCR0aXRsZSkgICAgICAgICAgICAgICAgICAgIC0+c2V0X3RleHQoJExBQkVMIC4gIiwgVGV4dCAjIiAuICR0ZXh0Y291bnRlcik7ICAgIyBDYXNlIEtMSzsgUEFHRU5PIHNjaGVpbnQgbWVpc3QgIk5vbmUiIHp1IHNlaW4KICAgICMkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9pZG5vW0B0eXBlPSJQQUdFSUQiXScsICAgICAgIDApICAgICAtPnNldF90ZXh0KCRQQUdFSUQpOwogICAgIyRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2lkbm9bQHR5cGU9IkJJTkRJTkdJRCJdJywgICAgMCkgICAgIC0+c2V0X3RleHQoJEJJRCk7CiAgICAjJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vaWRub1tAdHlwZT0iSUQiXScsICAgICAgICAgICAwKSAgICAgLT5zZXRfdGV4dCgkSUQpOwogICAgIyRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2lkbm9bQHR5cGU9IktJRUxJUEFOS0tJX01FVEFGSUxFTkFNRSJdJywgMCkgICAgIC0+c2V0X3RleHQoJE1FVEFGSUxFTkFNRSk7CiAgICAjJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vaWRub1tAdHlwZT0iS0lFTElQQU5LS0lfT1JJR0ZJTEVOQU1FIl0nLCAwKSAgICAgLT5zZXRfdGV4dCgkT1JJR0ZJTEVOQU1FKTsKICAgIGlmKCRURUlGT1JNQVQgZXEgIlRFSSIpewoJJGFuYWx5dGljLT5maXJzdF9jaGlsZCgndGV4dExhbmcnKSAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0X3RleHQoJExBTkdVQUdFKTsKICAgIH0KICAgIAogICAgIyAgPG1vbm9ncj4KICAgICMgICAgPHRpdGxlPiRQVUJMVElUTEU8L3RpdGxlPgogICAgIyAgICA8aW1wcmludD4KICAgICMgICAgICA8cHViUGxhY2U+VE9ETzwvcHViUGxhY2U+CiAgICAjICAgICAgPHB1Ymxpc2hlcj5UT0RPPC9wdWJsaXNoZXI+CiAgICAjICAgIDwvaW1wcmludD4KICAgICMgICAgPGJpYmxTY29wZSB1bml0PSJJU1NVRVRJVExFIi8+CiAgICAjICAgIDxiaWJsU2NvcGUgdW5pdD0iSVNTVUVOTyIvPgogICAgIyAgICA8YmlibFNjb3BlIHVuaXQ9IklTU1VFREFURSIvPgogICAgIyAgICA8YmlibFNjb3BlIHVuaXQ9InBwIj4kUEFHRU5PPC9iaWJsU2NvcGU+CgogICAgbXkgJG1vbm9nciAgPSAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCIuL2ZpbGVEZXNjL3NvdXJjZURlc2MvYmlibFN0cnVjdC9tb25vZ3IiLCAwKTsKCiAgICAkbW9ub2dyLT5maXJzdF9jaGlsZCgkdGl0bGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRfdGV4dCgkUFVCTFRJVExFKTsKICAgIGlmKCRURUlGT1JNQVQgZXEgIlRFSSIpewoJJG1vbm9nci0+Z2V0X3hwYXRoKCcuL2ltcHJpbnQvZGF0ZVtAdHlwZT0iZGF0ZSJdJywgICAwKSAgICAgICAgIC0+c2V0X3RleHQoJERBVEUpOwogICAgfQogICAgbXkgJGRhdGUgPSAiZGF0ZSI7CiAgICBpZigkVEVJRk9STUFUIGVxICJJNSIpeyRkYXRlPSJwdWJEYXRlIn07CiAgICAkbW9ub2dyLT5nZXRfeHBhdGgoJy4vaW1wcmludC8nIC4gJGRhdGUgLiAnW0B0eXBlPSJ5ZWFyIl0nLCAgIDApICAgICAgICAgLT5zZXRfdGV4dCgkZGF0ZWFycmF5WzBdKTsKICAgICRtb25vZ3ItPmdldF94cGF0aCgnLi9pbXByaW50LycgLiAkZGF0ZSAuICdbQHR5cGU9Im1vbnRoIl0nLCAgMCkgICAgICAgICAtPnNldF90ZXh0KCRkYXRlYXJyYXlbMV0pOwogICAgJG1vbm9nci0+Z2V0X3hwYXRoKCcuL2ltcHJpbnQvJyAuICRkYXRlIC4gJ1tAdHlwZT0iZGF5Il0nLCAgICAwKSAgICAgICAgIC0+c2V0X3RleHQoJGRhdGVhcnJheVsyXSk7ICAgIAogICAgJG1vbm9nci0+Zmlyc3RfY2hpbGQoImltcHJpbnQiKS0+Zmlyc3RfY2hpbGQoInB1YlBsYWNlIikgICAgICAgIC0+c2V0X3RleHQoJHNyY3B1YnBsYWNlc3skUFVCTElEfSk7ICAjIGltcHJpbnQgaXMgbmVlZGVkIGZvciB0ZWkgdmFsaWRpdHkKICAgICRtb25vZ3ItPmZpcnN0X2NoaWxkKCJpbXByaW50IiktPmZpcnN0X2NoaWxkKCJwdWJQbGFjZSIpICAgICAgICAtPnNldF9hdHQoJ2tleScsICRDb3VudHJ5S2V5KTsKICAgICRtb25vZ3ItPmZpcnN0X2NoaWxkKCJpbXByaW50IiktPmZpcnN0X2NoaWxkKCJwdWJsaXNoZXIiKSAgICAgICAtPnNldF90ZXh0KCRzcmNwdWJsaXNoZXJzeyRQVUJMSUR9KTsgIyBpbXByaW50IGlzIG5lZWRlZCBmb3IgdGVpIHZhbGlkaXR5CiAgICAjJG1vbm9nci0+Z2V0X3hwYXRoKCcuL2JpYmxTY29wZVtAdW5pdD0iSVNTVUVUSVRMRSJdJywgMCkgICAgICAgIC0+c2V0X3RleHQoJElTU1VFVElUTEUpOwogICAgIyRtb25vZ3ItPmdldF94cGF0aCgnLi9iaWJsU2NvcGVbQHVuaXQ9IklTU1VFTk8iXScsIDApICAgICAgICAgICAtPnNldF90ZXh0KCRJU1NVRU5PKTsKICAgICMkbW9ub2dyLT5nZXRfeHBhdGgoJy4vYmlibFNjb3BlW0B1bml0PSJJU1NVRURBVEUiXScsIDApICAgICAgICAgLT5zZXRfdGV4dCgkSVNTVUVEQVRFKTsKICAgICMkbW9ub2dyLT5nZXRfeHBhdGgoJy4vYmlibFNjb3BlW0B1bml0PSJwcCJdJywgMCkgICAgICAgICAgICAgICAgLT5zZXRfdGV4dCgkUEFHRU5PKTsgICAgICAgICMgQWNodHVuZyAtIFBBR0VOTyBzY2hlaW50IG1laXN0ICJOb25lIiB6dSBzZWluCgogICAgbXkgJGRhdGVOaWNlICAgICAgPSAkZGF0ZWFycmF5WzJdIC4gIi4iIC4gJGRhdGVhcnJheVsxXSAuICIuIiAuICRkYXRlYXJyYXlbMF07IAogICAgbXkgJGRhdGVCYWNrd2FyZHMgPSAkZGF0ZWFycmF5WzBdIC4gIi4iIC4gJGRhdGVhcnJheVsxXSAuICIuIiAuICRkYXRlYXJyYXlbMl07IAogICAgCiAgICBpZigkVEVJRk9STUFUIGVxICJJNSIpewoJbXkgJHJlZkNvbXBsZXRlVGV4dCA9ICR0ZXh0U2lnbGUgLiAiICIgLiAkUFVCTFRJVExFIC4gIiBuby4gIiAuICRJU1NVRU5PIC4gIiwgWyIgLiAkUFVCTFRZUEUgLiAiXSwgIiAuICRkYXRlTmljZTsKCW15ICRyZWZTaG9ydFRleHQgICAgPSAkdGV4dFNpZ2xlIC4gIiAiIC4gJFBVQkxUSVRMRSAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCAiIC4gJGRhdGVOaWNlOwoJJHRleHRIZWFkZXItPmdldF94cGF0aCgnLi9maWxlRGVzYy9zb3VyY2VEZXNjL3JlZmVyZW5jZVtAdHlwZT0iY29tcGxldGUiXScsIDApIC0+IHNldF90ZXh0KCRyZWZDb21wbGV0ZVRleHQpOwoJJHRleHRIZWFkZXItPmdldF94cGF0aCgnLi9maWxlRGVzYy9zb3VyY2VEZXNjL3JlZmVyZW5jZVtAdHlwZT0ic2hvcnQiXScgICAsIDApIC0+IHNldF90ZXh0KCRyZWZTaG9ydFRleHQpOwogICAgfQoKICAgIAogICAgIyAgPGVuY29kaW5nRGVzYz4KICAgICMgICAgPHRhZ3NEZWNsPgogICAgIyAgICAgIDxuYW1lc3BhY2UgbmFtZT0iaHR0cDovL3d3dy50ZWktYy5vcmcvbnMvMS4wIj4KICAgICMgICAgICAgIDx0YWdVc2FnZSBnaT0icyIgb2NjdXJzPSJTRU5UQ09VTlQiLz4KICAgICMgICAgICAgIDx0YWdVc2FnZSBnaT0idyIgb2NjdXJzPSJUT0tFTkNPVU5UIi8+CgogICAgbXkgJG5hbWVzcGFjZVBhdGg9Ii4vZW5jb2RpbmdEZXNjL3RhZ3NEZWNsL25hbWVzcGFjZS8iOwogICAgaWYoJFRFSUZPUk1BVCBlcSAiSTUiKXskbmFtZXNwYWNlUGF0aD0iLi9lbmNvZGluZ0Rlc2MvdGFnc0RlY2wvIn07CiAgICAKICAgICR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoJG5hbWVzcGFjZVBhdGggLiAndGFnVXNhZ2VbQGdpPSJzIl0nLCAwKSAgICAgIC0+IHNldF9hdHQoJ29jY3VycycsICRTRU5UQ09VTlQpOwogICAgJHRleHRIZWFkZXItPmdldF94cGF0aCgkbmFtZXNwYWNlUGF0aCAuICd0YWdVc2FnZVtAZ2k9InciXScsIDApICAgICAgLT4gc2V0X2F0dCgnb2NjdXJzJywgJFRPS0VOQ09VTlQpOwogCiAgICAjICA8cHJvZmlsZURlc2M+CiAgICAjICAgIDxsYW5nVXNhZ2U+CiAgICAjICAgICA8bGFuZ3VhZ2UgaWRlbnQ9ImZpIiB1c2FnZT0ifHh4eDo0NHxmaW46MjN8ZW5nOjN8Ii8+CiAgICAjICAgPC9sYW5nVXNhZ2U+CiAgICAjICAgIDx0ZXh0Q2xhc3M+CiAgICAjICAgICAgPGNsYXNzQ29kZSBzY2hlbWU9ImtpZWxpcGFua2tpX2tsayI+JFBVQkxUWVBFPC9jbGFzc0NvZGU+CiAgICAjICAgICAgPGNsYXNzQ29kZSBzY2hlbWU9ImtpZWxpcGFua2tpX2tsa19tYXBwZWQiPiRtYXBwaW5neyRQVUJMVFlQRX08L2NsYXNzQ29kZT4KCiAgICBpZigkVEVJRk9STUFUIGVxICJJNSIpewoJJHRleHRIZWFkZXItPmdldF94cGF0aCgnLi9wcm9maWxlRGVzYy9jcmVhdGlvbi9jcmVhdERhdGUnLCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRfdGV4dCgkZGF0ZUJhY2t3YXJkcyk7CiAgICB9CiAgICBpZigkVEVJRk9STUFUIGVxICJURUkiKXsKCSR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoJy4vcHJvZmlsZURlc2MvbGFuZ1VzYWdlL2xhbmd1YWdlJywgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0X2F0dCgnaWRlbnQnLCAkTEFOR1VBR0UpOwoJJHRleHRIZWFkZXItPmdldF94cGF0aCgnLi9wcm9maWxlRGVzYy9sYW5nVXNhZ2UvbGFuZ3VhZ2UnLCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRfYXR0KCd1c2FnZScsICRTVU1MQU5HKTsKICAgIH0KICAgICMgaW4gQHVzYWdlIG11c3MgZWlndC4gZWluIGludGVnZXI7IGFtIGJlc3RlbiBpbmhhbHQgdm9uIFNVTUxBTkcgYXVmZHJvZXNlbG4gdW5kIG1laHJlcmUgPGxhbmd1YWdlPiBtYWNoZW4KCiAgICAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCcuL3Byb2ZpbGVEZXNjL3RleHRDbGFzcy9jbGFzc0NvZGVbQHNjaGVtZT0ia2llbGlwYW5ra2lfa2xrIl0nLCAwKSAgICAgICAtPnNldF90ZXh0KCRQVUJMVFlQRSk7CiAgICAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCcuL3Byb2ZpbGVEZXNjL3RleHRDbGFzcy9jbGFzc0NvZGVbQHNjaGVtZT0ia2llbGlwYW5ra2lfa2xrX21hcHBlZCJdJywgMCktPnNldF90ZXh0KCRtYXBwaW5neyRQVUJMVFlQRX0pOwoKICAgICMgIDxyZXZpc2lvbkRlc2M+CiAgICAjICAgIDxjaGFuZ2Ugd2hlbj0iVE9ETyIgd2hvPSJITCI+VEVJIHZlcnNpb24gZm9yIEV1UmVDbzwvY2hhbmdlPgoKICAgICR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoJy4vcmV2aXNpb25EZXNjL2NoYW5nZScsIDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRfYXR0KCd3aGVuJywgbG9jYWx0aW1lLT55bWQoJy0nKSk7CiAgICAKICAgIHJldHVybiAkdGV4dElEOwoKICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEVORCBPRiBDUkVBVElORyBURUlIRUFERVIKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCn0KCnN1YiBzZXRQIHsKICAgIG15ICgkcGFyYWdyYXBoKSA9IEBfOwogICAgCiAgICAkcGFyYWdyYXBoLT5zZXRfZ2koJ3AnKTsKICAgIAogICAgIyA8cGFyYWdyYXBoIGlkPSJwLWJjZDBmM2ZhLWJiZDNkYWM0LTgxNWVhZDdhIiBzdW1fbGFuZz0ifGZpbjoxfCI+CiAgICAjIGF0dHMgb2YgPHBhcmFncmFwaD46CiAgICAjICAgIEBpZCAgICAgICAgVVNFCiAgICAjICAgIEBzdW1fbGFuZyAgVVNFOiBwdXQgaW4geG1sOmxhbmcgYW5kIHByZWZpeCB0aGUgdmFsdWUgd2l0aCAieC0iIGZvciBwcml2YXRlIHZhbHVlCiAgICAKICAgICRwYXJhZ3JhcGgtPnNldF9hdHQoInhtbDpsYW5nIiwgIngtIiAuICRwYXJhZ3JhcGgtPmF0dCgic3VtX2xhbmciKSk7CiAgICAkcGFyYWdyYXBoLT5kZWxfYXR0KCJzdW1fbGFuZyIpOwogICAgIyAkcGFyYWdyYXBoLT5jaGFuZ2VfYXR0X25hbWUoJ2lkJywgJ3htbDppZCcpOwogICAgJHBhcmFncmFwaC0+ZGVsX2F0dCgiaWQiKTsgICAgICAgICAgICAgICMgZGllc2UgaWQgaXN0IGF1Y2ggbmljaHQgZWluZGV1dGlnISEKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApzdWIgc2V0UyB7CiAgICBteSAoJHNlbnRlbmNlKSA9IEBfOwogICAgCiAgICAkc2VudGVuY2UtPnNldF9naSgncycpOwoJICAgIAogICAgIyB0aGUgYXR0cyBvZiA8c2VudGVuY2U+OgogICAgIyAgICBVU0UgICAxIEBpZD0icy1iY2QwZjNmYS1iYmQzZGFjNC1mNzQyOTA5MCIKICAgICMgICAgVVNFICAgMiBAbGFuZz0iZmluIiAtPiB4bWw6bGFuZyAKICAgICMgICAgPyAgICAgMyBAbGFuZ19jb25mPSIwLjY3MzQ4NTMiPiAtPiBUb0RvIEBjZXJ0ID8JICAgIAogICAgCiAgICAjIHNldCBhdHRycyBvZiA8cz4KICAgICRzZW50ZW5jZS0+c2V0X2F0dCgieG1sOmxhbmciLCAkc2VudGVuY2UtPmF0dCgibGFuZyIpKTsgICMgVG9EbzogY29udmVydCB0aGUgdmFsdWUgLyBpbnRyb2R1Y2UgYSBoYXNoIGZvciBsb29rdXAgKGlucHV0IHZhbHVlczogImZpbiIsICJ4eHgiLCAuLi4uKQogICAgIyAkc2VudGVuY2UtPmNoYW5nZV9hdHRfbmFtZSgnaWQnLCAneG1sOmlkJyk7ICAgICAgICAgICAgIyBuaWNodCBlaW5kZXV0aWcKICAgICRzZW50ZW5jZS0+ZGVsX2F0dCgnaWQnKTsKICAgICRzZW50ZW5jZS0+ZGVsX2F0dCgibGFuZyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2VkIGJ5IHhtbDpsYW5nCiAgICAkc2VudGVuY2UtPmRlbF9hdHQoImxhbmdfY29uZiIpOyAgICAgICAgICAgICAgICAgICAgIyBmb3IgdGhlIHRpbWUgYmVpbmcKICAgIAp9CgpzdWIgY3JlYXRlVyB7CiAgICBteSAoJHdfZWxlbWVudCwgJGxpbmUpID0gQF87CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBHZXQgdGhlIHRhZ3MgKD1jb2x1bW5zKQogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICBteSBAdGFncyA9IHNwbGl0KC9cdC8sICRsaW5lKTsKICAgIAogICAgIyBzZXQgd29yZCBzdHJpbmcgYW5kIGxlbW1hIHN0cmluZyBhY2NvcmRpbmcgdG8gJE1BU0sgZmxhZzoKICAgIG15ICR3X3N0cmluZyA9ICIiOwogICAgbXkgJGxfc3RyaW5nID0gIiI7CiAgICBpZigkTUFTSyAmJiAoJHRhZ3NbNF0gbmUgIlB1bmN0IikpewoJJHdfc3RyaW5nID0gRGF0YTo6UmFuZG9tOjpTdHJpbmctPmNyZWF0ZV9yYW5kb21fc3RyaW5nKGxlbmd0aD0+bGVuZ3RoKCR0YWdzWzBdKSwgY29udGFpbnM9PidhbHBoYScpOwoJJGxfc3RyaW5nID0gJHdfc3RyaW5nOwogICAgfQogICAgZWxzZSB7Cgkkd19zdHJpbmcgPSAkdGFnc1swXTsKCSRsX3N0cmluZyA9ICR0YWdzWzJdOwogICAgfQogICAgJHdfZWxlbWVudC0+c2V0X3RleHQoJHdfc3RyaW5nKTsKICAgIAogICAgIyB2cnQgd29yZCBhbmQgcG9zaXRpb25hbC1hdHRyaWJ1dGVzIGluIGNvcnB1cyBLTEs6CiAgICAjICBVU0UgWzBdIHdvcmQKICAgICMgIFVTRSBbMV0gcmVmICAoaWQgZm9yIHJlZmVyZW5jZSBvZiBkZXBoZWFkKQogICAgIyAgVVNFIFsyXSBsZW1tYQogICAgIyAgPyAgIFszXSBsZW1tYWNvbXAgICAobGVtbWEgd2l0aCBjb21wb3VuZCBpbmZvIC0gY291bGQgZ28gaW4gQG5vcm0sIGFzIHRhZyBhYnVzZT8pCiAgICAjICBVU0UgWzRdIHBvcyAKICAgICMgIFVTRSBbNV0gbXNkIAogICAgIyAgVVNFIFs2XSBkZXBoZWFkCiAgICAjICBVU0UgWzddIGRlcHJlbCAKICAgICMgICAgICBbOF0gY29udGVudCAgIChvY3ItcHJvY2VzcykKICAgICMgICAgICBbOV0gdnBvcyAgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxMF0gb2NyICAgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxMV0gY2MgICAgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxMl0gaHlwaCAgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxM10gc3R5bGUgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxNF0gbGV4ICAgICAgIChrb3JwIHNlbWFudGljIGRpc2FtYmlndWF0aW9uIGZyb20gRyJvdGVib3JnKQogICAgCiAgICAjIHNldCB0aGUgYXR0cmlidXRlcyBvZiA8dz46CiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJuIiwgICAgICAkdGFnc1sxXSk7CiAgICAKICAgICMgJHdfZWxlbWVudC0+c2V0X2F0dCgiaWQiLCAgICAgIndfIiAuICRuYW1lYXJyYXlbNF0gLiAkc2VudGVuY2UtPmF0dCgieG1sOmlkIikgLiAiXyIgLiAkdGFnc1sxXSk7CiAgICAjIHNvIHp1c2FtbWVuZ2ViYXV0ZSBJRCBpc3QgYXVjaCBuaWNodCBlaW5kZXV0aWcuLi4KICAgICR3X2VsZW1lbnQtPmRlbF9hdHQoImlkIik7CgogICAgJHdfZWxlbWVudC0+c2V0X2F0dCgibGVtbWEiLCAgJGxfc3RyaW5nKTsKCiAgICAjICR3X2VsZW1lbnQtPnNldF9hdHQoIm5vcm0iLCAgICR0YWdzWzNdKTsgICMgdGFnIGFidXNlIG9mIEBub3JtCiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJwb3MiLCAgICAkdGFnc1s0XSk7CiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJtc2QiLCAgICAkdGFnc1s1XSk7CiAgICAKICAgIGlmKCRURUlGT1JNQVQgZXEgIkk1Iil7ICAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgY29uZGl0aW9uIHdoZW4gcGFydCBvZiB0aGUgb2ZmaWNpYWwgVEVJCgkkd19lbGVtZW50LT5zZXRfYXR0KCJoZWFkIiwgICAkdGFnc1s2XSk7Cgkkd19lbGVtZW50LT5zZXRfYXR0KCJkZXByZWwiLCAkdGFnc1s3XSk7CiAgICB9Cn0KICAgIAoKc3ViIHNldF90aXRsZXsKICAgIG15ICgkY29ycHVzSGVhZGVyLCAkc291cmNlLCAkeWVhciwgJGtpZWxpcGFua2tpQ29ycHVzKSA9IEBfOwoKICAgIG15ICR0aXRsZUVsZW1lbnQgPSAidGl0bGUiOwogICAgCiAgICBpZigkVEVJRk9STUFUIGVxICJJNSIpewoJJHRpdGxlRWxlbWVudCA9ICJjLnRpdGxlIjsKICAgIH0KICAgIAogICAgbXkgJGNUaXRsZVN0cmluZyA9ICRzb3VyY2UgLiAiICIgLiAkeWVhciAuICIsIGZyb20gIi4gJGtpZWxpcGFua2tpQ29ycHVzIC4gIiBmb3IgRXVSZUNvIjsgICAgCgogICAgIzx0ZWlIZWFkZXI+CiAgICAjICA8ZmlsZURlc2M+CiAgICAjICAgIDx0aXRsZVN0bXQ+CiAgICAjICAgICAgPHRpdGxlPltBYW11bGVodGkyMDIxXSBmcm9tIFtrbGstZmktdjItdnJ0IGZvcl0gRXVSZUNvPC90aXRsZT4KICAgICMgICAgPC90aXRsZVN0bXQ+CiAgICAjICAgIDwhLS0gLi4uIC0tPgogICAgIyAgPC9maWxlRGVzYz4KICAgICM8L3RlaUhlYWRlcj4KCiAgICBteSAkY1RpdGxlTm9kZSA9ICRjb3JwdXNIZWFkZXItPmZpcnN0X2NoaWxkKCJmaWxlRGVzYyIpLT5maXJzdF9jaGlsZCgidGl0bGVTdG10IiktPmZpcnN0X2NoaWxkKCR0aXRsZUVsZW1lbnQpOwoKICAgICRjVGl0bGVOb2RlLT5zZXRfdGV4dCgkY1RpdGxlU3RyaW5nKTsKICAgIAp9CgpzdWIgc2V0X3NvdXJjZURlc2N7CiAgICBteSAoJGNvcnB1c0hlYWRlciwgJHNvdXJjZSwgJHllYXIsICRraWVsaXBhbmtraUNvcnB1cykgPSBAXzsKCiAgICBteSAkY0JpYmxTdHJpbmcgPSAkc291cmNlIC4gIiAiIC4gJHllYXIgLiAiLCBmcm9tICIuICRraWVsaXBhbmtraUNvcnB1cyAuICIgZm9yIEV1UmVDbyI7ICAgIAoKICAgICM8dGVpSGVhZGVyPgogICAgIyAgPGZpbGVEZXNjPgogICAgIyAgICA8IS0tIC4uLiAtLT4KICAgICMgICAgPHNvdXJjZURlc2M+CiAgICAjICAgICAgPGJpYmw+W0FhbXVsZWh0aTIwMjFdIGZyb20gW2tsay1maS12Mi12cnRdPC9iaWJsPgogICAgIyAgICA8L3NvdXJjZURlc2M+CiAgICAjICAgIDwhLS0gLi4uIC0tPgogICAgIyAgPC9maWxlRGVzYz4KICAgICM8L3RlaUhlYWRlcj4KCiAgICBteSAkY0JpYmxOb2RlID0gJGNvcnB1c0hlYWRlci0+Zmlyc3RfY2hpbGQoImZpbGVEZXNjIiktPmZpcnN0X2NoaWxkKCJzb3VyY2VEZXNjIiktPmZpcnN0X2NoaWxkKCJiaWJsIik7CgogICAgJGNCaWJsTm9kZS0+c2V0X3RleHQoJGNCaWJsU3RyaW5nKTsgICAgCn0KCnN1YiBzZXRfc291cmNlRGVzY0k1ewogICAgbXkgKCRjb3JwdXNIZWFkZXIpID0gQF87CgogICAgbXkgJFBVQkxJRCAgICA9ICRzcmNwdWJsaWRzeyRmbnNvdXJjZX07CiAgICBteSAkUFVCTFRJVExFID0gJHNyY2Z1bGxuYW1lc3skZm5zb3VyY2V9OwogICAgbXkgJFBVQkxQTEFDRSA9ICRzcmNwdWJwbGFjZXN7JFBVQkxJRH07CiAgICBteSAkUFVCTElTSEVSID0gJHNyY3B1Ymxpc2hlcnN7JFBVQkxJRH07CiAgICAKICAgIG15ICRZRUFSICA9ICRmbnllYXI7CiAgICBteSAkWVkgICAgPSBzdWJzdHIoJGZueWVhciwgMiwgMik7CgogICAgbXkgJENTSUdMRSAgICA9ICRjb3JwdXNpZHN7JFBVQkxJRH0gLiAkWVk7CgogICAgCiAgICAjPGlkc0hlYWRlcj4KICAgICMgIDxmaWxlRGVzYz4KICAgICMgICAgPCEtLSAuLi4gLS0+CiAgICAjICAgIDxzb3VyY2VEZXNjPgogICAgIyAgICAgIDxiaWJsU3RydWN0PgogICAgIyAgICAgICAgPG1vbm9ncj4KICAgICMgICAgICAgICAgPGgudGl0bGUgdHlwZT0ibWFpbiI+WyRQVUJMVElUTEVdLCBbJFlFQVJdPC9oLnRpdGxlPgogICAgIyAgICAgICAgICA8aW1wcmludD4KICAgICMgICAgICAgICAgICA8cHVibGlzaGVyPlskUFVCTElTSEVSXTwvcHVibGlzaGVyPgogICAgIyAgICAgICAgICAgIDxwdWJQbGFjZSBrZXk9IlskVExdIj5bJFBVQlBMQUNFXTwvcHViUGxhY2U+CiAgICAjICAgICAgICAgIDwvaW1wcmludD4KICAgICMgICAgICAgIDwvbW9ub2dyPgogICAgIyAgICAgIDwvYmlibFN0cnVjdD4KICAgICMgICAgICA8cmVmZXJlbmNlIHR5cGU9InN1cGVyIiBhc3NlbWJsYWdlPSJyZWd1bGFyIj5bJEtLS10gWyRQVUJMVElUTEVdOyBbJFBVQlBMQUNFXTogWyRQVUJMSVNIRVJdLCBbJFlFQVJdPC9yZWZlcmVuY2U+CiAgICAjICAgIDwvc291cmNlRGVzYz4gICAgIyAgICA8c291cmNlRGVzYz4KICAgICMgICAgPCEtLSAuLi4gLS0+CiAgICAjICA8L2ZpbGVEZXNjPgogICAgIzwvdGVpSGVhZGVyPgoKICAgIG15ICRjTW9ub2dyID0gJGNvcnB1c0hlYWRlci0+Zmlyc3RfY2hpbGQoImZpbGVEZXNjIiktPmZpcnN0X2NoaWxkKCJzb3VyY2VEZXNjIiktPmZpcnN0X2NoaWxkKCJiaWJsU3RydWN0IiktPmZpcnN0X2NoaWxkKCJtb25vZ3IiKTsKICAgICRjTW9ub2dyLT5maXJzdF9jaGlsZCgiaC50aXRsZSIpLT5zZXRfdGV4dCgkUFVCTFRJVExFKTsKICAgICRjTW9ub2dyLT5maXJzdF9jaGlsZCgiaW1wcmludCIpLT5maXJzdF9jaGlsZCgicHVibGlzaGVyIiktPnNldF90ZXh0KCRQVUJMSVNIRVIpOwogICAgJGNNb25vZ3ItPmZpcnN0X2NoaWxkKCJpbXByaW50IiktPmZpcnN0X2NoaWxkKCJwdWJQbGFjZSIpIC0+c2V0X3RleHQoJFBVQkxQTEFDRSk7CiAgICAkY01vbm9nci0+Zmlyc3RfY2hpbGQoImltcHJpbnQiKS0+Zmlyc3RfY2hpbGQoInB1YlBsYWNlIikgLT5zZXRfYXR0KCdrZXknLCAkQ291bnRyeUtleSk7CgogICAgJGNvcnB1c0hlYWRlci0+Zmlyc3RfY2hpbGQoImZpbGVEZXNjIiktPmZpcnN0X2NoaWxkKCJzb3VyY2VEZXNjIiktPmZpcnN0X2NoaWxkKCJyZWZlcmVuY2UiKS0+c2V0X3RleHQoJENTSUdMRSAuICIgIiAuICRQVUJMVElUTEUgLiAiOyAiIC4gJFBVQkxQTEFDRSAuICI6ICIgLiAkUFVCTElTSEVSIC4gIiwgIiAuICRZRUFSKTsKCn0KCgoKc3ViIGNyZWF0ZUlkc0RvY3sgICAgICAgICAgIyB3aWxsIG9ubHkgYmUgY2FsbGVkIGZvciB0aGUgc2Vjb25kIGlkc0RvYyAoaS5lLiBmb3IgZmVicnVhcnkpIGFuZCBoaWdoZXIKICAgIG15ICgkdGV4dGF0dHNyZWYpID0gQF87CiAgICBteSAkREFURSAgICAgID0gJHRleHRhdHRzcmVmLT57J2RhdGUnfTsKICAgIG15ICRQVUJMVElUTEUgPSAkdGV4dGF0dHNyZWYtPnsncHVibF90aXRsZSd9OwogICAgbXkgJFBVQkxJRCAgICA9ICR0ZXh0YXR0c3JlZi0+eydwdWJsX2lkJ307CgogICAgCiAgICBteSBAZGF0ZWFycmF5ID0gc3BsaXQoIi0iLCAkREFURSk7CiAgICBteSAkTU9OVEggPSAkZGF0ZWFycmF5WzFdOwogICAgbXkgJFlFQVIgID0gJGRhdGVhcnJheVswXTsKICAgIG15ICRZWSAgICA9IHN1YnN0cigkWUVBUiwgMiwgMik7CiAgICAKICAgIG15ICRDU0lHTEUgICAgPSAkY29ycHVzaWRzeyRQVUJMSUR9IC4gJFlZOwoKICAgIG15ICRET0NJRCA9ICAgICAkbW9udGhzeyRNT05USH07CiAgICBteSAkTU9OVEhOQU1FID0gJG1vbnRobmFtZXN7JE1PTlRIfTsKCiAgICBteSAkaWRzRG9jU3RyaW5nPSIiOwogICAgaWYoJFRFSUZPUk1BVCBlcSAiSTUiKXsKCSRpZHNEb2NTdHJpbmcgPSAiCjxpZHNEb2MgdmVyc2lvbj1cIjEuMFwiIFRFSWZvcm09XCJURUkuMlwiPgo8aWRzSGVhZGVyIHR5cGU9XCJkb2N1bWVudFwiIHBhdHRlcm49XCJ0ZXh0XCIgdmVyc2lvbj1cIjEuMVwiIFRFSWZvcm09XCJ0ZWlIZWFkZXJcIj4KICA8ZmlsZURlc2M+CiAgICA8dGl0bGVTdG10PgogICAgICA8ZG9rdW1lbnRTaWdsZT4kQ1NJR0xFLyRET0NJRDwvZG9rdW1lbnRTaWdsZT4KICAgICAgPGQudGl0bGU+JFBVQkxUSVRMRSwgJE1PTlRITkFNRSAkWUVBUjwvZC50aXRsZT4KICAgIDwvdGl0bGVTdG10PgogICAgPHB1YmxpY2F0aW9uU3RtdD4KICAgICAgPGRpc3RyaWJ1dG9yLz4KICAgICAgPHB1YkFkZHJlc3MvPgogICAgICA8YXZhaWxhYmlsaXR5IHJlZ2lvbj1cIndvcmxkXCI+JGtpZWxpcGFua2tpTGljZW5zZTwvYXZhaWxhYmlsaXR5PgogICAgICA8cHViRGF0ZS8+CiAgICA8L3B1YmxpY2F0aW9uU3RtdD4KICAgIDxzb3VyY2VEZXNjPgogICAgICA8YmlibFN0cnVjdD4KICAgICAgICA8bW9ub2dyPgogICAgICAgICAgPGgudGl0bGUvPgogICAgICAgICAgPGltcHJpbnQvPgogICAgICAgIDwvbW9ub2dyPgogICAgICA8L2JpYmxTdHJ1Y3Q+CiAgICA8L3NvdXJjZURlc2M+ICAgIAogIDwvZmlsZURlc2M+ICAKPC9pZHNIZWFkZXI+CjwvaWRzRG9jPlxuIjsKfSAgICAKICAgIGlmKCRNT05USCArIDAgPT0gJExBU1RNT05USCArIDEpewoJaWYoJE1PTlRIKzAgPiAxKXsKCSAgICBwcmludGYoIiVzXG4iLCAkaWRzRG9jU3RyaW5nKTsKCQl9CgkkTEFTVE1PTlRIKys7CiAgICB9Cn0KCgoKIyMjIyMjIyMjIyMjIyMjIyMKIyMgdXNhZ2VfbWVzc2FnZQojIyMjIyMjIyMjIyMjIyMjIwoKCnN1YiB1c2FnZV9tZXNzYWdlIHsKICAgIHByaW50IFNUREVSUiAiVXNhZ2U6ICAuL3ZydDJ0ZWkucGwgIFtPUFRJT05TXSAgPGZpbGUudnJ0LnhtbD5cbiI7CiAgICBwcmludCBTVERFUlIgIiAgIDxmaWxlLnZydC54bWw+IGlzIGEgVlJUIGZpbGUgYXMgcHJvcGVyICh3ZWxsLWZvcm1lZCkgWE1MXG4iOwogICAgcHJpbnQgU1RERVJSICIgICBPcHRpb25zOlxuIjsKICAgIHByaW50IFNUREVSUiAiICAgICAgIC10ICh0ZWl8aTUpICAgIG91dHB1dCBmb3JtYXQsIGRlZmF1bHQ6IHRlaVxuIjsKICAgIHByaW50IFNUREVSUiAiICAgICAgIC1tICAgICAgICAgICAgIG1hc2sgcHJpbWFyeSBkYXRhXG4iOwogICAgcHJpbnQgU1RERVJSICJcbiI7CiAgICBleGl0Owp9CgoK