IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICAgICAgICAgICAgICAgICAgICAgICBDQURFTkNFIENPUFlSSUdIVCBOT1RJQ0UKIyAgICAgICAgIKkgMjAwOC0yMDEzIENhZGVuY2UgRGVzaWduIFN5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBGb3VuZGF0aW9uIEZsb3cgaXMgcHJvdmlkZWQgYXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gcGVyZm9ybSBzcGVjaWFsaXplZAojIHRhc2tzLgojCiMgVGhpcyB3b3JrIG1heSBub3QgYmUgY29waWVkLCByZS1wdWJsaXNoZWQsIHVwbG9hZGVkLCBvciBkaXN0cmlidXRlZCBpbiBhbnkgd2F5LAojIGluIGFueSBtZWRpdW0sIHdoZXRoZXIgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KIyBmcm9tIENhZGVuY2UuIE5vdHdpdGhzdGFuZGluZyBhbnkgcmVzdHJpY3Rpb25zIGhlcmVpbiwgc3ViamVjdCB0byBjb21wbGlhbmNlCiMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENhZGVuY2Ugc29mdHdhcmUgbGljZW5zZSBhZ3JlZW1lbnQgdW5kZXIKIyB3aGljaCB0aGlzIG1hdGVyaWFsIHdhcyBwcm92aWRlZCwgdGhpcyBtYXRlcmlhbCBtYXkgYmUgY29waWVkIGFuZCBpbnRlcm5hbGx5CiMgZGlzdHJpYnV0ZWQgc29sZWx5IGZvciBpbnRlcm5hbCBwdXJwb3NlcyBmb3IgdXNlIHdpdGggQ2FkZW5jZSB0b29scy4KIwojIFRoaXMgd29yayBpcyBDYWRlbmNlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgbWF5IHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYmUKIyBnaXZlbiB0byB0aGlyZCBwYXJ0aWVzLCBuZWl0aGVyIGluIG9yaWdpbmFsIG5vciBpbiBtb2RpZmllZCB2ZXJzaW9ucywgd2l0aG91dAojIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIENhZGVuY2UuIFRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGlzCiMgdGhlIHByb3ByaWV0YXJ5IGFuZCBjb25maWRlbnRpYWwgaW5mb3JtYXRpb24gb2YgQ2FkZW5jZSBvciBpdHMgbGljZW5zb3JzLCBhbmQKIyBpcyBzdXBwbGllZCBzdWJqZWN0IHRvLCBhbmQgbWF5IGJlIHVzZWQgb25seSBieSBDYWRlbmNlJ3MgY3VycmVudCBjdXN0b21lcnMKIyBpbiBhY2NvcmRhbmNlIHdpdGgsIGEgcHJldmlvdXNseSBleGVjdXRlZCBsaWNlbnNlIGFncmVlbWVudCBiZXR3ZWVuIENhZGVuY2UKIyBhbmQgaXRzIGN1c3RvbWVyLgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUSElTIE1BVEVSSUFMIElTIFBST1ZJREVEIEJZIENBREVOQ0UgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAojIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KIyBJTiBOTyBFVkVOVCBTSEFMTCBDQURFTkNFIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwKIyBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAojIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgojIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgIE1BVEVSSUFMLCBFVkVOIElGCiMgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnByb2MgZ2VuX29wdGlvbnMge2ZpbGV9IHsKCiAgIGdsb2JhbCBuYW1lcwogICBnbG9iYWwgbm90ZXMKICAgZ2xvYmFsIGRlZmF1bHQKICAgZ2xvYmFsIHR5cGUKICAgZ2xvYmFsIGNhdGVnb3J5CgogICBzZXQgbmFtZXMgW2xpc3RdCgogICBzZXQgaXAgW29wZW4gJGZpbGVdCiAgIHdoaWxlIHtbZ2V0cyAkaXAgdGVtcF0+PTB9IHsKICAgICAgaWYge1tyZWdleHAgIl4jIiAkdGVtcF19IHsgY29udGludWUgfQogICAgICBzZXQgbGluZSBbc3BsaXQgJHRlbXAgIlxeIl0KICAgICAgcHV0cyAkbGluZQogICAgICBzZXQgdmFyIFtsaW5kZXggJGxpbmUgMF0KICAgICAgbGFwcGVuZCBuYW1lcyAkdmFyCiAgICAgIHNldCBjYXRlZ29yeSgkdmFyKSBbbGluZGV4ICRsaW5lIDFdCiAgICAgIHNldCB0eXBlKCR2YXIpIFtsaW5kZXggJGxpbmUgMl0KICAgICAgc2V0IGRlZmF1bHQoJHZhcikgW2xpbmRleCAkbGluZSAzXQogICAgICBzZXQgbm90ZXMoJHZhcikgW2xpbmRleCAkbGluZSA0XQogICB9CiAgIGNsb3NlICRpcAoKICAgcHV0cyAiW2xsZW5ndGggJG5hbWVzXSB2YXJpYWJsZXMgcHJvY2Vzc2VkIgoKICAgc2V0IG9wIFtvcGVuIG9wdGlvbnMudGNsIHddCiAgIGZvcmVhY2ggdmFyICRuYW1lcyB7CiAgICAgIHN3aXRjaCAtZ2xvYiAkdmFyICB7CiAgICAgICAgICJsaWJyYXJ5X3NldHMiIHsKICAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKCR2YXIpIFxbbGlzdCBsaWJyYXJ5X3NldFxdIgogICAgICAgICB9CiAgICAgICAgICI8bGlicmFyeV9zZXQqIiB7CiAgICAgICAgICAgIHJlZ3N1YiAiPCIgJHZhciAiIiB0ZW1wCiAgICAgICAgICAgIHJlZ3N1YiAiPiIgJHRlbXAgIiIgc3ZhcgogICAgICAgICAgICBwdXRzICRvcCAic2V0IHZhcnMoJHN2YXIpICRub3RlcygkdmFyKSIKICAgICAgICAgfSAKICAgICAgICAgInJjX2Nvcm5lcnMiIHsKICAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKCR2YXIpIFxbbGlzdCByY19jb3JuZXJcXSIKICAgICAgICAgfQogICAgICAgICAiPHJjX2Nvcm5lcioiIHsKICAgICAgICAgICAgcmVnc3ViICI8IiAkdmFyICIiIHRlbXAKICAgICAgICAgICAgcmVnc3ViICI+IiAkdGVtcCAiIiBzdmFyCiAgICAgICAgICAgIHN3aXRjaCAtZ2xvYiBbbGluZGV4IFtzcGxpdCAkc3ZhciAiLCJdIDFdIHsKICAgICAgICAgICAgICAgImNhcF90YWJsZSIgeyAKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKCRzdmFyKSAkbm90ZXMoJHZhcikiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgInF4X3RlY2hfZmlsZSIgeyAKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKCRzdmFyKSAkbm90ZXMoJHZhcikiCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgImRlZmF1bHQiIHsKICAgICAgICAgICAgICAgICAgaWYge1tyZWdleHAgInBvc3Rfcm91dGUiICRzdmFyXX0gewogICAgICAgICAgICAgICAgICAgICBwdXRzICRvcCAic2V0IHZhcnMoJHN2YXIpIHsxLjAwIDEuMDAgMS4wMH0iCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHB1dHMgJG9wICJzZXQgdmFycygkc3ZhcikgMS4wMCIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgfSAKICAgICAgICAgImRlbGF5X2Nvcm5lcnMiIHsKICAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKCR2YXIpIFxbbGlzdCBkZWxheV9jb3JuZXJcXSIKICAgICAgICAgfQogICAgICAgICAiPGRlbGF5X2Nvcm5lcioiIHsKICAgICAgICAgICAgcmVnc3ViICI8IiAkdmFyICIiIHRlbXAKICAgICAgICAgICAgcmVnc3ViICI+IiAkdGVtcCAiIiB2YXIKICAgICAgICAgICAgc3dpdGNoIC1nbG9iIFtsaW5kZXggW3NwbGl0ICR2YXIgIiwiXSAxXSB7CiAgICAgICAgICAgICAgICJyY19jb3JuZXIiIHsKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKCR2YXIpIHtyY19jb3JuZXJ9IgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICJsaWJyYXJ5X3NldCIgewogICAgICAgICAgICAgICAgICBwdXRzICRvcCAic2V0IHZhcnMoJHZhcikge2xpYnJhcnlfc2V0fSIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAiZGVmYXVsdCIgewogICAgICAgICAgICAgICAgICBwdXRzICRvcCAic2V0IHZhcnMoJHZhcikgMS4wMCIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IAogICAgICAgICB9CiAgICAgICAgICJjb25zdHJhaW50X21vZGVzIiB7CiAgICAgICAgICAgIHB1dHMgJG9wICJzZXQgdmFycygkdmFyKSBcW2xpc3QgY29uc3RyYWludF9tb2RlXF0iCiAgICAgICAgIH0KICAgICAgICAgIjxjb25zdHJhaW50X21vZGUqIiB7CiAgICAgICAgICAgIHJlZ3N1YiAiPCIgJHZhciAiIiB0ZW1wCiAgICAgICAgICAgIHJlZ3N1YiAiPiIgJHRlbXAgIiIgdmFyCiAgICAgICAgICAgIHN3aXRjaCAtZ2xvYiBbbGluZGV4IFtzcGxpdCAkdmFyICIsIl0gMV0gewogICAgICAgICAgICAgICAicHJlX2N0c19zZGMiIHsKICAgICAgICAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKCR2YXIpIHtzZGNfZmlsZX0iCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgInBvc3RfY3RzX3NkYyIgewogICAgICAgICAgICAgICAgICBwdXRzICRvcCAic2V0IHZhcnMoJHZhcikge3NkY19maWxlfSIKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IAogICAgICAgICB9CiAgICAgICAgICIqc2V0dXAqdmlldyoiIHsKICAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKCR2YXIpIHtzZXR1cF92aWV3fSIKICAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKHNldHVwX3ZpZXcsZGVsYXlfY29ybmVyKSB7ZGVsYXlfY29ybmVyfSIKICAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKHNldHVwX3ZpZXcsY29uc3RyYWludF9tb2RlKSB7Y29uc3RyYWludF9tb2RlfSIKICAgICAgICAgfQogICAgICAgICAiKmhvbGQqdmlldyoiIHsKICAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKCR2YXIpIHtob2xkX3ZpZXd9IgogICAgICAgICAgICBwdXRzICRvcCAic2V0IHZhcnMoaG9sZF92aWV3LGRlbGF5X2Nvcm5lcikge2RlbGF5X2Nvcm5lcn0iCiAgICAgICAgICAgIHB1dHMgJG9wICJzZXQgdmFycyhob2xkX3ZpZXcsY29uc3RyYWludF9tb2RlKSB7Y29uc3RyYWludF9tb2RlfSIKICAgICAgICAgfQogICAgICAgICAiYW5hbHlzaXNfdmlld3MiIHsKICAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKGFuYWx5c2lzX3ZpZXdzKSB7c2V0dXBfdmlldyBob2xkX3ZpZXd9IgogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQgewogICAgICAgICAgICBpZiB7JHR5cGUoJHZhcikgPT0gImVudW0ifSB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wICJzZXQgdmFycygkdmFyKSAkbm90ZXMoJHZhcikiCiAgICAgICAgICAgIH0gZWxzZWlmIHskdHlwZSgkdmFyKSA9PSAibGlzdCJ9IHsKICAgICAgICAgICAgICAgcmVnc3ViICI8IiAkbm90ZXMoJHZhcikgIiIgdGVtcAogICAgICAgICAgICAgICByZWdzdWIgIj4iICR0ZW1wICIiIG5vdGVzKCR2YXIpCiAgICAgICAgICAgICAgIHJlZ3N1YiAieyIgJG5vdGVzKCR2YXIpICIiIHRlbXAKICAgICAgICAgICAgICAgcmVnc3ViICJ9IiAkdGVtcCAiIiBub3RlcygkdmFyKQogICAgICAgICAgICAgICBwdXRzICRvcCAic2V0IHZhcnMoJHZhcikge2xpc3Qgb2YgJG5vdGVzKCR2YXIpfSIKICAgICAgICAgICAgfSBlbHNlaWYgeyRjYXRlZ29yeSgkdmFyKSA9PSAicGx1Zy1pbiJ9IHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKCR2YXIpICRub3RlcygkdmFyKSIKICAgICAgICAgICAgfSBlbHNlaWYgeyRkZWZhdWx0KCR2YXIpICE9ICJVTkRFRklORUQifSB7CiAgICAgICAgICAgICAgIHB1dHMgJG9wICJzZXQgdmFycygkdmFyKSAkZGVmYXVsdCgkdmFyKSIKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgcHV0cyAkb3AgInNldCB2YXJzKCR2YXIpIHskdHlwZSgkdmFyKX0iCiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICB9CiAgIH0KICAgY2xvc2UgJG9wCgp9CgpnZW5fb3B0aW9ucyAkYXJndgo=