IyAtKi0gY29kaW5nOiBMYXRpbi0xIC0qLQoKIiIiSGVhcCBxdWV1ZSBhbGdvcml0aG0gKGEuay5hLiBwcmlvcml0eSBxdWV1ZSkuCgpIZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvcgphbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sCm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZwpwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC4KClVzYWdlOgoKaGVhcCA9IFtdICAgICAgICAgICAgIyBjcmVhdGVzIGFuIGVtcHR5IGhlYXAKaGVhcHB1c2goaGVhcCwgaXRlbSkgIyBwdXNoZXMgYSBuZXcgaXRlbSBvbiB0aGUgaGVhcAppdGVtID0gaGVhcHBvcChoZWFwKSAjIHBvcHMgdGhlIHNtYWxsZXN0IGl0ZW0gZnJvbSB0aGUgaGVhcAppdGVtID0gaGVhcFswXSAgICAgICAjIHNtYWxsZXN0IGl0ZW0gb24gdGhlIGhlYXAgd2l0aG91dCBwb3BwaW5nIGl0CmhlYXBpZnkoeCkgICAgICAgICAgICMgdHJhbnNmb3JtcyBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gbGluZWFyIHRpbWUKaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pICMgcG9wcyBhbmQgcmV0dXJucyBzbWFsbGVzdCBpdGVtLCBhbmQgYWRkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuZXcgaXRlbTsgdGhlIGhlYXAgc2l6ZSBpcyB1bmNoYW5nZWQKCk91ciBBUEkgZGlmZmVycyBmcm9tIHRleHRib29rIGhlYXAgYWxnb3JpdGhtcyBhcyBmb2xsb3dzOgoKLSBXZSB1c2UgMC1iYXNlZCBpbmRleGluZy4gIFRoaXMgbWFrZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZQogIGluZGV4IGZvciBhIG5vZGUgYW5kIHRoZSBpbmRleGVzIGZvciBpdHMgY2hpbGRyZW4gc2xpZ2h0bHkgbGVzcwogIG9idmlvdXMsIGJ1dCBpcyBtb3JlIHN1aXRhYmxlIHNpbmNlIFB5dGhvbiB1c2VzIDAtYmFzZWQgaW5kZXhpbmcuCgotIE91ciBoZWFwcG9wKCkgbWV0aG9kIHJldHVybnMgdGhlIHNtYWxsZXN0IGl0ZW0sIG5vdCB0aGUgbGFyZ2VzdC4KClRoZXNlIHR3byBtYWtlIGl0IHBvc3NpYmxlIHRvIHZpZXcgdGhlIGhlYXAgYXMgYSByZWd1bGFyIFB5dGhvbiBsaXN0CndpdGhvdXQgc3VycHJpc2VzOiBoZWFwWzBdIGlzIHRoZSBzbWFsbGVzdCBpdGVtLCBhbmQgaGVhcC5zb3J0KCkKbWFpbnRhaW5zIHRoZSBoZWFwIGludmFyaWFudCEKIiIiCgojIE9yaWdpbmFsIGNvZGUgYnkgS2V2aW4gTydDb25ub3IsIGF1Z21lbnRlZCBieSBUaW0gUGV0ZXJzCgpfX2Fib3V0X18gPSAiIiJIZWFwIHF1ZXVlcwoKW2V4cGxhbmF0aW9uIGJ5IEZyYW7nb2lzIFBpbmFyZF0KCkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yCmFsbCBrLCBjb3VudGluZyBlbGVtZW50cyBmcm9tIDAuICBGb3IgdGhlIHNha2Ugb2YgY29tcGFyaXNvbiwKbm9uLWV4aXN0aW5nIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLiAgVGhlIGludGVyZXN0aW5nCnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LgoKVGhlIHN0cmFuZ2UgaW52YXJpYW50IGFib3ZlIGlzIG1lYW50IHRvIGJlIGFuIGVmZmljaWVudCBtZW1vcnkKcmVwcmVzZW50YXRpb24gZm9yIGEgdG91cm5hbWVudC4gIFRoZSBudW1iZXJzIGJlbG93IGFyZSBgaycsIG5vdCBhW2tdOgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCgogICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgoKICAgICAgICAgIDMgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICA2CgogICAgICA3ICAgICAgIDggICAgICAgOSAgICAgICAxMCAgICAgIDExICAgICAgMTIgICAgICAxMyAgICAgIDE0CgogICAgMTUgMTYgICAxNyAxOCAgIDE5IDIwICAgMjEgMjIgICAyMyAyNCAgIDI1IDI2ICAgMjcgMjggICAyOSAzMAoKCkluIHRoZSB0cmVlIGFib3ZlLCBlYWNoIGNlbGwgYGsnIGlzIHRvcHBpbmcgYDIqaysxJyBhbmQgYDIqaysyJy4gIEluCmFuIHVzdWFsIGJpbmFyeSB0b3VybmFtZW50IHdlIHNlZSBpbiBzcG9ydHMsIGVhY2ggY2VsbCBpcyB0aGUgd2lubmVyCm92ZXIgdGhlIHR3byBjZWxscyBpdCB0b3BzLCBhbmQgd2UgY2FuIHRyYWNlIHRoZSB3aW5uZXIgZG93biB0aGUgdHJlZQp0byBzZWUgYWxsIG9wcG9uZW50cyBzL2hlIGhhZC4gIEhvd2V2ZXIsIGluIG1hbnkgY29tcHV0ZXIgYXBwbGljYXRpb25zCm9mIHN1Y2ggdG91cm5hbWVudHMsIHdlIGRvIG5vdCBuZWVkIHRvIHRyYWNlIHRoZSBoaXN0b3J5IG9mIGEgd2lubmVyLgpUbyBiZSBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHdoZW4gYSB3aW5uZXIgaXMgcHJvbW90ZWQsIHdlIHRyeSB0bwpyZXBsYWNlIGl0IGJ5IHNvbWV0aGluZyBlbHNlIGF0IGEgbG93ZXIgbGV2ZWwsIGFuZCB0aGUgcnVsZSBiZWNvbWVzCnRoYXQgYSBjZWxsIGFuZCB0aGUgdHdvIGNlbGxzIGl0IHRvcHMgY29udGFpbiB0aHJlZSBkaWZmZXJlbnQgaXRlbXMsCmJ1dCB0aGUgdG9wIGNlbGwgIndpbnMiIG92ZXIgdGhlIHR3byB0b3BwZWQgY2VsbHMuCgpJZiB0aGlzIGhlYXAgaW52YXJpYW50IGlzIHByb3RlY3RlZCBhdCBhbGwgdGltZSwgaW5kZXggMCBpcyBjbGVhcmx5CnRoZSBvdmVyYWxsIHdpbm5lci4gIFRoZSBzaW1wbGVzdCBhbGdvcml0aG1pYyB3YXkgdG8gcmVtb3ZlIGl0IGFuZApmaW5kIHRoZSAibmV4dCIgd2lubmVyIGlzIHRvIG1vdmUgc29tZSBsb3NlciAobGV0J3Mgc2F5IGNlbGwgMzAgaW4gdGhlCmRpYWdyYW0gYWJvdmUpIGludG8gdGhlIDAgcG9zaXRpb24sIGFuZCB0aGVuIHBlcmNvbGF0ZSB0aGlzIG5ldyAwIGRvd24KdGhlIHRyZWUsIGV4Y2hhbmdpbmcgdmFsdWVzLCB1bnRpbCB0aGUgaW52YXJpYW50IGlzIHJlLWVzdGFibGlzaGVkLgpUaGlzIGlzIGNsZWFybHkgbG9nYXJpdGhtaWMgb24gdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgdHJlZS4KQnkgaXRlcmF0aW5nIG92ZXIgYWxsIGl0ZW1zLCB5b3UgZ2V0IGFuIE8obiBsbiBuKSBzb3J0LgoKQSBuaWNlIGZlYXR1cmUgb2YgdGhpcyBzb3J0IGlzIHRoYXQgeW91IGNhbiBlZmZpY2llbnRseSBpbnNlcnQgbmV3Cml0ZW1zIHdoaWxlIHRoZSBzb3J0IGlzIGdvaW5nIG9uLCBwcm92aWRlZCB0aGF0IHRoZSBpbnNlcnRlZCBpdGVtcyBhcmUKbm90ICJiZXR0ZXIiIHRoYW4gdGhlIGxhc3QgMCd0aCBlbGVtZW50IHlvdSBleHRyYWN0ZWQuICBUaGlzIGlzCmVzcGVjaWFsbHkgdXNlZnVsIGluIHNpbXVsYXRpb24gY29udGV4dHMsIHdoZXJlIHRoZSB0cmVlIGhvbGRzIGFsbAppbmNvbWluZyBldmVudHMsIGFuZCB0aGUgIndpbiIgY29uZGl0aW9uIG1lYW5zIHRoZSBzbWFsbGVzdCBzY2hlZHVsZWQKdGltZS4gIFdoZW4gYW4gZXZlbnQgc2NoZWR1bGUgb3RoZXIgZXZlbnRzIGZvciBleGVjdXRpb24sIHRoZXkgYXJlCnNjaGVkdWxlZCBpbnRvIHRoZSBmdXR1cmUsIHNvIHRoZXkgY2FuIGVhc2lseSBnbyBpbnRvIHRoZSBoZWFwLiAgU28sIGEKaGVhcCBpcyBhIGdvb2Qgc3RydWN0dXJlIGZvciBpbXBsZW1lbnRpbmcgc2NoZWR1bGVycyAodGhpcyBpcyB3aGF0IEkKdXNlZCBmb3IgbXkgTUlESSBzZXF1ZW5jZXIgOi0pLgoKVmFyaW91cyBzdHJ1Y3R1cmVzIGZvciBpbXBsZW1lbnRpbmcgc2NoZWR1bGVycyBoYXZlIGJlZW4gZXh0ZW5zaXZlbHkKc3R1ZGllZCwgYW5kIGhlYXBzIGFyZSBnb29kIGZvciB0aGlzLCBhcyB0aGV5IGFyZSByZWFzb25hYmx5IHNwZWVkeSwKdGhlIHNwZWVkIGlzIGFsbW9zdCBjb25zdGFudCwgYW5kIHRoZSB3b3JzdCBjYXNlIGlzIG5vdCBtdWNoIGRpZmZlcmVudAp0aGFuIHRoZSBhdmVyYWdlIGNhc2UuICBIb3dldmVyLCB0aGVyZSBhcmUgb3RoZXIgcmVwcmVzZW50YXRpb25zIHdoaWNoCmFyZSBtb3JlIGVmZmljaWVudCBvdmVyYWxsLCB5ZXQgdGhlIHdvcnN0IGNhc2VzIG1pZ2h0IGJlIHRlcnJpYmxlLgoKSGVhcHMgYXJlIGFsc28gdmVyeSB1c2VmdWwgaW4gYmlnIGRpc2sgc29ydHMuICBZb3UgbW9zdCBwcm9iYWJseSBhbGwKa25vdyB0aGF0IGEgYmlnIHNvcnQgaW1wbGllcyBwcm9kdWNpbmcgInJ1bnMiICh3aGljaCBhcmUgcHJlLXNvcnRlZApzZXF1ZW5jZXMsIHdoaWNoIHNpemUgaXMgdXN1YWxseSByZWxhdGVkIHRvIHRoZSBhbW91bnQgb2YgQ1BVIG1lbW9yeSksCmZvbGxvd2VkIGJ5IGEgbWVyZ2luZyBwYXNzZXMgZm9yIHRoZXNlIHJ1bnMsIHdoaWNoIG1lcmdpbmcgaXMgb2Z0ZW4KdmVyeSBjbGV2ZXJseSBvcmdhbmlzZWRbMV0uICBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHRoZSBpbml0aWFsCnNvcnQgcHJvZHVjZXMgdGhlIGxvbmdlc3QgcnVucyBwb3NzaWJsZS4gIFRvdXJuYW1lbnRzIGFyZSBhIGdvb2Qgd2F5CnRvIHRoYXQuICBJZiwgdXNpbmcgYWxsIHRoZSBtZW1vcnkgYXZhaWxhYmxlIHRvIGhvbGQgYSB0b3VybmFtZW50LCB5b3UKcmVwbGFjZSBhbmQgcGVyY29sYXRlIGl0ZW1zIHRoYXQgaGFwcGVuIHRvIGZpdCB0aGUgY3VycmVudCBydW4sIHlvdSdsbApwcm9kdWNlIHJ1bnMgd2hpY2ggYXJlIHR3aWNlIHRoZSBzaXplIG9mIHRoZSBtZW1vcnkgZm9yIHJhbmRvbSBpbnB1dCwKYW5kIG11Y2ggYmV0dGVyIGZvciBpbnB1dCBmdXp6aWx5IG9yZGVyZWQuCgpNb3Jlb3ZlciwgaWYgeW91IG91dHB1dCB0aGUgMCd0aCBpdGVtIG9uIGRpc2sgYW5kIGdldCBhbiBpbnB1dCB3aGljaAptYXkgbm90IGZpdCBpbiB0aGUgY3VycmVudCB0b3VybmFtZW50IChiZWNhdXNlIHRoZSB2YWx1ZSAid2lucyIgb3Zlcgp0aGUgbGFzdCBvdXRwdXQgdmFsdWUpLCBpdCBjYW5ub3QgZml0IGluIHRoZSBoZWFwLCBzbyB0aGUgc2l6ZSBvZiB0aGUKaGVhcCBkZWNyZWFzZXMuICBUaGUgZnJlZWQgbWVtb3J5IGNvdWxkIGJlIGNsZXZlcmx5IHJldXNlZCBpbW1lZGlhdGVseQpmb3IgcHJvZ3Jlc3NpdmVseSBidWlsZGluZyBhIHNlY29uZCBoZWFwLCB3aGljaCBncm93cyBhdCBleGFjdGx5IHRoZQpzYW1lIHJhdGUgdGhlIGZpcnN0IGhlYXAgaXMgbWVsdGluZy4gIFdoZW4gdGhlIGZpcnN0IGhlYXAgY29tcGxldGVseQp2YW5pc2hlcywgeW91IHN3aXRjaCBoZWFwcyBhbmQgc3RhcnQgYSBuZXcgcnVuLiAgQ2xldmVyIGFuZCBxdWl0ZQplZmZlY3RpdmUhCgpJbiBhIHdvcmQsIGhlYXBzIGFyZSB1c2VmdWwgbWVtb3J5IHN0cnVjdHVyZXMgdG8ga25vdy4gIEkgdXNlIHRoZW0gaW4KYSBmZXcgYXBwbGljYXRpb25zLCBhbmQgSSB0aGluayBpdCBpcyBnb29kIHRvIGtlZXAgYSBgaGVhcCcgbW9kdWxlCmFyb3VuZC4gOi0pCgotLS0tLS0tLS0tLS0tLS0tLS0tLQpbMV0gVGhlIGRpc2sgYmFsYW5jaW5nIGFsZ29yaXRobXMgd2hpY2ggYXJlIGN1cnJlbnQsIG5vd2FkYXlzLCBhcmUKbW9yZSBhbm5veWluZyB0aGFuIGNsZXZlciwgYW5kIHRoaXMgaXMgYSBjb25zZXF1ZW5jZSBvZiB0aGUgc2Vla2luZwpjYXBhYmlsaXRpZXMgb2YgdGhlIGRpc2tzLiAgT24gZGV2aWNlcyB3aGljaCBjYW5ub3Qgc2VlaywgbGlrZSBiaWcKdGFwZSBkcml2ZXMsIHRoZSBzdG9yeSB3YXMgcXVpdGUgZGlmZmVyZW50LCBhbmQgb25lIGhhZCB0byBiZSB2ZXJ5CmNsZXZlciB0byBlbnN1cmUgKGZhciBpbiBhZHZhbmNlKSB0aGF0IGVhY2ggdGFwZSBtb3ZlbWVudCB3aWxsIGJlIHRoZQptb3N0IGVmZmVjdGl2ZSBwb3NzaWJsZSAodGhhdCBpcywgd2lsbCBiZXN0IHBhcnRpY2lwYXRlIGF0CiJwcm9ncmVzc2luZyIgdGhlIG1lcmdlKS4gIFNvbWUgdGFwZXMgd2VyZSBldmVuIGFibGUgdG8gcmVhZApiYWNrd2FyZHMsIGFuZCB0aGlzIHdhcyBhbHNvIHVzZWQgdG8gYXZvaWQgdGhlIHJld2luZGluZyB0aW1lLgpCZWxpZXZlIG1lLCByZWFsIGdvb2QgdGFwZSBzb3J0cyB3ZXJlIHF1aXRlIHNwZWN0YWN1bGFyIHRvIHdhdGNoIQpGcm9tIGFsbCB0aW1lcywgc29ydGluZyBoYXMgYWx3YXlzIGJlZW4gYSBHcmVhdCBBcnQhIDotKQoiIiIKCmRlZiBoZWFwcHVzaChoZWFwLCBpdGVtKToKICAgICIiIlB1c2ggaXRlbSBvbnRvIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC4iIiIKICAgIGhlYXAuYXBwZW5kKGl0ZW0pCiAgICBfc2lmdGRvd24oaGVhcCwgMCwgbGVuKGhlYXApLTEpCgpkZWYgaGVhcHBvcChoZWFwKToKICAgICIiIlBvcCB0aGUgc21hbGxlc3QgaXRlbSBvZmYgdGhlIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC4iIiIKICAgIGxhc3RlbHQgPSBoZWFwLnBvcCgpICAgICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eQogICAgaWYgaGVhcDoKICAgICAgICByZXR1cm5pdGVtID0gaGVhcFswXQogICAgICAgIGhlYXBbMF0gPSBsYXN0ZWx0CiAgICAgICAgX3NpZnR1cChoZWFwLCAwKQogICAgZWxzZToKICAgICAgICByZXR1cm5pdGVtID0gbGFzdGVsdAogICAgcmV0dXJuIHJldHVybml0ZW0KCmRlZiBoZWFwcmVwbGFjZShoZWFwLCBpdGVtKToKICAgICIiIlBvcCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHNtYWxsZXN0IHZhbHVlLCBhbmQgYWRkIHRoZSBuZXcgaXRlbS4KCiAgICBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaGVhcHBvcCgpIGZvbGxvd2VkIGJ5IGhlYXBwdXNoKCksIGFuZCBjYW4gYmUKICAgIG1vcmUgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBhIGZpeGVkLXNpemUgaGVhcC4gIE5vdGUgdGhhdCB0aGUgdmFsdWUKICAgIHJldHVybmVkIG1heSBiZSBsYXJnZXIgdGhhbiBpdGVtISAgVGhhdCBjb25zdHJhaW5zIHJlYXNvbmFibGUgdXNlcyBvZgogICAgdGhpcyByb3V0aW5lLgogICAgIiIiCiAgICByZXR1cm5pdGVtID0gaGVhcFswXSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHkKICAgIGhlYXBbMF0gPSBpdGVtCiAgICBfc2lmdHVwKGhlYXAsIDApCiAgICByZXR1cm4gcmV0dXJuaXRlbQoKZGVmIGhlYXBpZnkoeCk6CiAgICAiIiJUcmFuc2Zvcm0gbGlzdCBpbnRvIGEgaGVhcCwgaW4tcGxhY2UsIGluIE8obGVuKGhlYXApKSB0aW1lLiIiIgogICAgbiA9IGxlbih4KQogICAgIyBUcmFuc2Zvcm0gYm90dG9tLXVwLiAgVGhlIGxhcmdlc3QgaW5kZXggdGhlcmUncyBhbnkgcG9pbnQgdG8gbG9va2luZyBhdAogICAgIyBpcyB0aGUgbGFyZ2VzdCB3aXRoIGEgY2hpbGQgaW5kZXggaW4tcmFuZ2UsIHNvIG11c3QgaGF2ZSAyKmkgKyAxIDwgbiwKICAgICMgb3IgaSA8IChuLTEpLzIuICBJZiBuIGlzIGV2ZW4gPSAyKmosIHRoaXMgaXMgKDIqai0xKS8yID0gai0xLzIgc28KICAgICMgai0xIGlzIHRoZSBsYXJnZXN0LCB3aGljaCBpcyBuLy8yIC0gMS4gIElmIG4gaXMgb2RkID0gMipqKzEsIHRoaXMgaXMKICAgICMgKDIqaisxLTEpLzIgPSBqIHNvIGotMSBpcyB0aGUgbGFyZ2VzdCwgYW5kIHRoYXQncyBhZ2FpbiBuLy8yLTEuCiAgICBmb3IgaSBpbiB4cmFuZ2Uobi8vMiAtIDEsIC0xLCAtMSk6CiAgICAgICAgX3NpZnR1cCh4LCBpKQoKIyAnaGVhcCcgaXMgYSBoZWFwIGF0IGFsbCBpbmRpY2VzID49IHN0YXJ0cG9zLCBleGNlcHQgcG9zc2libHkgZm9yIHBvcy4gIHBvcwojIGlzIHRoZSBpbmRleCBvZiBhIGxlYWYgd2l0aCBhIHBvc3NpYmx5IG91dC1vZi1vcmRlciB2YWx1ZS4gIFJlc3RvcmUgdGhlCiMgaGVhcCBpbnZhcmlhbnQuCmRlZiBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcyk6CiAgICBuZXdpdGVtID0gaGVhcFtwb3NdCiAgICAjIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nIGEgcGxhY2UKICAgICMgbmV3aXRlbSBmaXRzLgogICAgd2hpbGUgcG9zID4gc3RhcnRwb3M6CiAgICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDEKICAgICAgICBwYXJlbnQgPSBoZWFwW3BhcmVudHBvc10KICAgICAgICBpZiBwYXJlbnQgPD0gbmV3aXRlbToKICAgICAgICAgICAgYnJlYWsKICAgICAgICBoZWFwW3Bvc10gPSBwYXJlbnQKICAgICAgICBwb3MgPSBwYXJlbnRwb3MKICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW0KCiMgVGhlIGNoaWxkIGluZGljZXMgb2YgaGVhcCBpbmRleCBwb3MgYXJlIGFscmVhZHkgaGVhcHMsIGFuZCB3ZSB3YW50IHRvIG1ha2UKIyBhIGhlYXAgYXQgaW5kZXggcG9zIHRvby4gIFdlIGRvIHRoaXMgYnkgYnViYmxpbmcgdGhlIHNtYWxsZXIgY2hpbGQgb2YKIyBwb3MgdXAgKGFuZCBzbyBvbiB3aXRoIHRoYXQgY2hpbGQncyBjaGlsZHJlbiwgZXRjKSB1bnRpbCBoaXR0aW5nIGEgbGVhZiwKIyB0aGVuIHVzaW5nIF9zaWZ0ZG93biB0byBtb3ZlIHRoZSBvZGRiYWxsIG9yaWdpbmFsbHkgYXQgaW5kZXggcG9zIGludG8gcGxhY2UuCiMKIyBXZSAqY291bGQqIGJyZWFrIG91dCBvZiB0aGUgbG9vcCBhcyBzb29uIGFzIHdlIGZpbmQgYSBwb3Mgd2hlcmUgbmV3aXRlbSA8PQojIGJvdGggaXRzIGNoaWxkcmVuLCBidXQgdHVybnMgb3V0IHRoYXQncyBub3QgYSBnb29kIGlkZWEsIGFuZCBkZXNwaXRlIHRoYXQKIyBtYW55IGJvb2tzIHdyaXRlIHRoZSBhbGdvcml0aG0gdGhhdCB3YXkuICBEdXJpbmcgYSBoZWFwIHBvcCwgdGhlIGxhc3QgYXJyYXkKIyBlbGVtZW50IGlzIHNpZnRlZCBpbiwgYW5kIHRoYXQgdGVuZHMgdG8gYmUgbGFyZ2UsIHNvIHRoYXQgY29tcGFyaW5nIGl0CiMgYWdhaW5zdCB2YWx1ZXMgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCB1c3VhbGx5IGRvZXNuJ3QgcGF5ICg9IHVzdWFsbHkgZG9lc24ndAojIGdldCB1cyBvdXQgb2YgdGhlIGxvb3AgZWFybHkpLiAgU2VlIEtudXRoLCBWb2x1bWUgMywgd2hlcmUgdGhpcyBpcwojIGV4cGxhaW5lZCBhbmQgcXVhbnRpZmllZCBpbiBhbiBleGVyY2lzZS4KIwojIEN1dHRpbmcgdGhlICMgb2YgY29tcGFyaXNvbnMgaXMgaW1wb3J0YW50LCBzaW5jZSB0aGVzZSByb3V0aW5lcyBoYXZlIG5vCiMgd2F5IHRvIGV4dHJhY3QgInRoZSBwcmlvcml0eSIgZnJvbSBhbiBhcnJheSBlbGVtZW50LCBzbyB0aGF0IGludGVsbGlnZW5jZQojIGlzIGxpa2VseSB0byBiZSBoaWRpbmcgaW4gY3VzdG9tIF9fY21wX18gbWV0aG9kcywgb3IgaW4gYXJyYXkgZWxlbWVudHMKIyBzdG9yaW5nIChwcmlvcml0eSwgcmVjb3JkKSB0dXBsZXMuICBDb21wYXJpc29ucyBhcmUgdGh1cyBwb3RlbnRpYWxseQojIGV4cGVuc2l2ZS4KIwojIE9uIHJhbmRvbSBhcnJheXMgb2YgbGVuZ3RoIDEwMDAsIG1ha2luZyB0aGlzIGNoYW5nZSBjdXQgdGhlIG51bWJlciBvZgojIGNvbXBhcmlzb25zIG1hZGUgYnkgaGVhcGlmeSgpIGEgbGl0dGxlLCBhbmQgdGhvc2UgbWFkZSBieSBleGhhdXN0aXZlCiMgaGVhcHBvcCgpIGEgbG90LCBpbiBhY2NvcmQgd2l0aCB0aGVvcnkuICBIZXJlIGFyZSB0eXBpY2FsIHJlc3VsdHMgZnJvbSAzCiMgcnVucyAoMyBqdXN0IHRvIGRlbW9uc3RyYXRlIGhvdyBzbWFsbCB0aGUgdmFyaWFuY2UgaXMpOgojCiMgQ29tcGFyZXMgbmVlZGVkIGJ5IGhlYXBpZnkgICAgIENvbXBhcmVzIG5lZWRlZCBieSAxMDAwIGhlYXBwcG9wcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAxODM3IGN1dCB0byAxNjYzICAgICAgICAgICAgICAgMTQ5OTYgY3V0IHRvIDg2ODAKIyAxODU1IGN1dCB0byAxNjU5ICAgICAgICAgICAgICAgMTQ5NjYgY3V0IHRvIDg2NzgKIyAxODQ3IGN1dCB0byAxNjYwICAgICAgICAgICAgICAgMTUwMjQgY3V0IHRvIDg3MDMKIwojIEJ1aWxkaW5nIHRoZSBoZWFwIGJ5IHVzaW5nIGhlYXBwdXNoKCkgMTAwMCB0aW1lcyBpbnN0ZWFkIHJlcXVpcmVkCiMgMjE5OCwgMjE0OCwgYW5kIDIyMTkgY29tcGFyZXM6ICBoZWFwaWZ5KCkgaXMgbW9yZSBlZmZpY2llbnQsIHdoZW4KIyB5b3UgY2FuIHVzZSBpdC4KIwojIFRoZSB0b3RhbCBjb21wYXJlcyBuZWVkZWQgYnkgbGlzdC5zb3J0KCkgb24gdGhlIHNhbWUgbGlzdHMgd2VyZSA4NjI3LAojIDg2MjcsIGFuZCA4NjMyICh0aGlzIHNob3VsZCBiZSBjb21wYXJlZCB0byB0aGUgc3VtIG9mIGhlYXBpZnkoKSBhbmQKIyBoZWFwcG9wKCkgY29tcGFyZXMpOiAgbGlzdC5zb3J0KCkgaXMgKHVuc3VycHJpc2luZ2x5ISkgbW9yZSBlZmZpY2llbnQKIyBmb3Igc29ydGluZy4KCmRlZiBfc2lmdHVwKGhlYXAsIHBvcyk6CiAgICBlbmRwb3MgPSBsZW4oaGVhcCkKICAgIHN0YXJ0cG9zID0gcG9zCiAgICBuZXdpdGVtID0gaGVhcFtwb3NdCiAgICAjIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4KICAgIGNoaWxkcG9zID0gMipwb3MgKyAxICAgICMgbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24KICAgIHdoaWxlIGNoaWxkcG9zIDwgZW5kcG9zOgogICAgICAgICMgU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuCiAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDEKICAgICAgICBpZiByaWdodHBvcyA8IGVuZHBvcyBhbmQgaGVhcFtyaWdodHBvc10gPD0gaGVhcFtjaGlsZHBvc106CiAgICAgICAgICAgIGNoaWxkcG9zID0gcmlnaHRwb3MKICAgICAgICAjIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuCiAgICAgICAgaGVhcFtwb3NdID0gaGVhcFtjaGlsZHBvc10KICAgICAgICBwb3MgPSBjaGlsZHBvcwogICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxCiAgICAjIFRoZSBsZWFmIGF0IHBvcyBpcyBlbXB0eSBub3cuICBQdXQgbmV3aXRlbSB0aGVyZSwgYW5kIGFuZCBidWJibGUgaXQgdXAKICAgICMgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuCiAgICBoZWFwW3Bvc10gPSBuZXdpdGVtCiAgICBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcykKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAjIFNpbXBsZSBzYW5pdHkgdGVzdAogICAgaGVhcCA9IFtdCiAgICBkYXRhID0gWzEsIDMsIDUsIDcsIDksIDIsIDQsIDYsIDgsIDBdCiAgICBmb3IgaXRlbSBpbiBkYXRhOgogICAgICAgIGhlYXBwdXNoKGhlYXAsIGl0ZW0pCiAgICBzb3J0ID0gW10KICAgIHdoaWxlIGhlYXA6CiAgICAgICAgc29ydC5hcHBlbmQoaGVhcHBvcChoZWFwKSkKICAgIHByaW50IHNvcnQK