D3
OG
Old school D3 from simpler times
All examples
By author
By category
About
Jverma
Full window
Github gist
NVD3
NVD3 based graph, created using rCharts.
<!doctype HTML> <meta charset = 'utf-8'> <html> <head> <link rel='stylesheet' href='data:text/css;base64,Ci8qKioqKioqKioqKioqKioqKioqKgogKiBIVE1MIENTUwogKi8KCgouY2hhcnRXcmFwIHsKICBtYXJnaW46IDA7CiAgcGFkZGluZzogMDsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqCiAqIFRPT0xUSVAgQ1NTCiAqLwoKLm52dG9vbHRpcCB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMSk7CiAgcGFkZGluZzogMXB4OwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwwLDAsLjIpOwogIHotaW5kZXg6IDEwMDAwOwoKICBmb250LWZhbWlseTogQXJpYWw7CiAgZm9udC1zaXplOiAxM3B4OwoKICB0cmFuc2l0aW9uOiBvcGFjaXR5IDUwMG1zIGxpbmVhcjsKICAtbW96LXRyYW5zaXRpb246IG9wYWNpdHkgNTAwbXMgbGluZWFyOwogIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSA1MDBtcyBsaW5lYXI7CgogIHRyYW5zaXRpb24tZGVsYXk6IDUwMG1zOwogIC1tb3otdHJhbnNpdGlvbi1kZWxheTogNTAwbXM7CiAgLXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5OiA1MDBtczsKCiAgLW1vei1ib3gtc2hhZG93OiAwIDVweCAxMHB4IHJnYmEoMCwwLDAsLjIpOwogIC13ZWJraXQtYm94LXNoYWRvdzogMCA1cHggMTBweCByZ2JhKDAsMCwwLC4yKTsKICBib3gtc2hhZG93OiAwIDVweCAxMHB4IHJnYmEoMCwwLDAsLjIpOwoKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDZweDsKICAtbW96LWJvcmRlci1yYWRpdXM6IDZweDsKICBib3JkZXItcmFkaXVzOiA2cHg7CgogIHBvaW50ZXItZXZlbnRzOiBub25lOwoKICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7CiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5udnRvb2x0aXAueC1udnRvb2x0aXAsCi5udnRvb2x0aXAueS1udnRvb2x0aXAgewogIHBhZGRpbmc6IDhweDsKfQoKLm52dG9vbHRpcCBoMyB7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmc6IDRweCAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxOHB4OwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNzsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CgogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWJlYmViOwoKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweCA1cHggMCAwOwogIC1tb3otYm9yZGVyLXJhZGl1czogNXB4IDVweCAwIDA7CiAgYm9yZGVyLXJhZGl1czogNXB4IDVweCAwIDA7Cn0KCi5udnRvb2x0aXAgcCB7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmc6IDVweCAxNHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLm52dG9vbHRpcCBzcGFuIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgbWFyZ2luOiAycHggMDsKfQoKLm52dG9vbHRpcC1wZW5kaW5nLXJlbW92YWwgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKgogKiBTVkcgQ1NTCiAqLwoKCnN2ZyB7CiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lOwogIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOwogIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogIHVzZXItc2VsZWN0OiBub25lOwogIC8qIFRyeWluZyB0byBnZXQgU1ZHIHRvIGFjdCBsaWtlIGEgZ3JlZWR5IGJsb2NrIGluIGFsbCBicm93c2VycyAqLwogIGRpc3BsYXk6IGJsb2NrOwogIHdpZHRoOjEwMCU7CiAgaGVpZ2h0OjEwMCU7Cn0KCgpzdmcgdGV4dCB7CiAgZm9udDogbm9ybWFsIDEycHggQXJpYWw7Cn0KCnN2ZyAudGl0bGUgewogZm9udDogYm9sZCAxNHB4IEFyaWFsOwp9CgoubnZkMyAubnYtYmFja2dyb3VuZCB7CiAgZmlsbDogd2hpdGU7CiAgZmlsbC1vcGFjaXR5OiAwOwogIC8qCiAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgKi8KfQoKLm52ZDMubnYtbm9EYXRhIHsKICBmb250LXNpemU6IDE4cHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCgovKioqKioqKioqKgoqICBCcnVzaAoqLwoKLm52LWJydXNoIC5leHRlbnQgewogIGZpbGwtb3BhY2l0eTogLjEyNTsKICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7Cn0KCgoKLyoqKioqKioqKioKKiAgTGVnZW5kCiovCgoubnZkMyAubnYtbGVnZW5kIC5udi1zZXJpZXMgewogIGN1cnNvcjogcG9pbnRlcjsKfQoKLm52ZDMgLm52LWxlZ2VuZCAuZGlzYWJsZWQgY2lyY2xlIHsKICBmaWxsLW9wYWNpdHk6IDA7Cn0KCgoKLyoqKioqKioqKioKKiAgQXhlcwoqLwoKLm52ZDMgLm52LWF4aXMgcGF0aCB7CiAgZmlsbDogbm9uZTsKICBzdHJva2U6ICMwMDA7CiAgc3Ryb2tlLW9wYWNpdHk6IC43NTsKICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7Cn0KCi5udmQzIC5udi1heGlzIHBhdGguZG9tYWluIHsKICBzdHJva2Utb3BhY2l0eTogLjc1Owp9CgoubnZkMyAubnYtYXhpcy5udi14IHBhdGguZG9tYWluIHsKICBzdHJva2Utb3BhY2l0eTogMDsKfQoKLm52ZDMgLm52LWF4aXMgbGluZSB7CiAgZmlsbDogbm9uZTsKICBzdHJva2U6ICMwMDA7CiAgc3Ryb2tlLW9wYWNpdHk6IC4yNTsKICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7Cn0KCi5udmQzIC5udi1heGlzIGxpbmUuemVybyB7CiAgc3Ryb2tlLW9wYWNpdHk6IC43NTsKfQoKLm52ZDMgLm52LWF4aXMgLm52LWF4aXNNYXhNaW4gdGV4dCB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi5udmQzIC54ICAubnYtYXhpcyAubnYtYXhpc01heE1pbiB0ZXh0LAoubnZkMyAueDIgLm52LWF4aXMgLm52LWF4aXNNYXhNaW4gdGV4dCwKLm52ZDMgLngzIC5udi1heGlzIC5udi1heGlzTWF4TWluIHRleHQgewogIHRleHQtYW5jaG9yOiBtaWRkbGUKfQoKCgovKioqKioqKioqKgoqICBCcnVzaAoqLwoKLm52LWJydXNoIC5yZXNpemUgcGF0aCB7CiAgZmlsbDogI2VlZTsKICBzdHJva2U6ICM2NjY7Cn0KCgoKLyoqKioqKioqKioKKiAgQmFycwoqLwoKLm52ZDMgLm52LWJhcnMgLm5lZ2F0aXZlIHJlY3QgewogICAgemZpbGw6IGJyb3duOwp9CgoubnZkMyAubnYtYmFycyByZWN0IHsKICB6ZmlsbDogc3RlZWxibHVlOwogIGZpbGwtb3BhY2l0eTogLjc1OwoKICB0cmFuc2l0aW9uOiBmaWxsLW9wYWNpdHkgMjUwbXMgbGluZWFyOwogIC1tb3otdHJhbnNpdGlvbjogZmlsbC1vcGFjaXR5IDI1MG1zIGxpbmVhcjsKICAtd2Via2l0LXRyYW5zaXRpb246IGZpbGwtb3BhY2l0eSAyNTBtcyBsaW5lYXI7Cn0KCi5udmQzIC5udi1iYXJzIHJlY3Q6aG92ZXIgewogIGZpbGwtb3BhY2l0eTogMTsKfQoKLm52ZDMgLm52LWJhcnMgLmhvdmVyIHJlY3QgewogIGZpbGw6IGxpZ2h0Ymx1ZTsKfQoKLm52ZDMgLm52LWJhcnMgdGV4dCB7CiAgZmlsbDogcmdiYSgwLDAsMCwwKTsKfQoKLm52ZDMgLm52LWJhcnMgLmhvdmVyIHRleHQgewogIGZpbGw6IHJnYmEoMCwwLDAsMSk7Cn0KCgovKioqKioqKioqKgoqICBCYXJzCiovCgoubnZkMyAubnYtbXVsdGliYXIgLm52LWdyb3VwcyByZWN0LAoubnZkMyAubnYtbXVsdGliYXJIb3Jpem9udGFsIC5udi1ncm91cHMgcmVjdCwKLm52ZDMgLm52LWRpc2NyZXRlYmFyIC5udi1ncm91cHMgcmVjdCB7CiAgc3Ryb2tlLW9wYWNpdHk6IDA7CgogIHRyYW5zaXRpb246IGZpbGwtb3BhY2l0eSAyNTBtcyBsaW5lYXI7CiAgLW1vei10cmFuc2l0aW9uOiBmaWxsLW9wYWNpdHkgMjUwbXMgbGluZWFyOwogIC13ZWJraXQtdHJhbnNpdGlvbjogZmlsbC1vcGFjaXR5IDI1MG1zIGxpbmVhcjsKfQoKLm52ZDMgLm52LW11bHRpYmFyIC5udi1ncm91cHMgcmVjdDpob3ZlciwKLm52ZDMgLm52LW11bHRpYmFySG9yaXpvbnRhbCAubnYtZ3JvdXBzIHJlY3Q6aG92ZXIsCi5udmQzIC5udi1kaXNjcmV0ZWJhciAubnYtZ3JvdXBzIHJlY3Q6aG92ZXIgewogIGZpbGwtb3BhY2l0eTogMTsKfQoKLm52ZDMgLm52LWRpc2NyZXRlYmFyIC5udi1ncm91cHMgdGV4dCwKLm52ZDMgLm52LW11bHRpYmFySG9yaXpvbnRhbCAubnYtZ3JvdXBzIHRleHQgewogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZpbGw6IHJnYmEoMCwwLDAsMSk7CiAgc3Ryb2tlOiByZ2JhKDAsMCwwLDApOwp9CgovKioqKioqKioqKioKKiAgUGllIENoYXJ0CiovCgoubnZkMy5udi1waWUgcGF0aCB7CiAgc3Ryb2tlLW9wYWNpdHk6IDA7CgogIHRyYW5zaXRpb246IGZpbGwtb3BhY2l0eSAyNTBtcyBsaW5lYXIsIHN0cm9rZS13aWR0aCAyNTBtcyBsaW5lYXIsIHN0cm9rZS1vcGFjaXR5IDI1MG1zIGxpbmVhcjsKICAtbW96LXRyYW5zaXRpb246IGZpbGwtb3BhY2l0eSAyNTBtcyBsaW5lYXIsIHN0cm9rZS13aWR0aCAyNTBtcyBsaW5lYXIsIHN0cm9rZS1vcGFjaXR5IDI1MG1zIGxpbmVhcjsKICAtd2Via2l0LXRyYW5zaXRpb246IGZpbGwtb3BhY2l0eSAyNTBtcyBsaW5lYXIsIHN0cm9rZS13aWR0aCAyNTBtcyBsaW5lYXIsIHN0cm9rZS1vcGFjaXR5IDI1MG1zIGxpbmVhcjsKCn0KCi5udmQzLm52LXBpZSAubnYtc2xpY2UgdGV4dCB7CiAgc3Ryb2tlOiAjMDAwOwogIHN0cm9rZS13aWR0aDogMDsKfQoKLm52ZDMubnYtcGllIHBhdGggewogIHN0cm9rZTogI2ZmZjsKICBzdHJva2Utd2lkdGg6IDFweDsKICBzdHJva2Utb3BhY2l0eTogMTsKfQoKLm52ZDMubnYtcGllIC5ob3ZlciBwYXRoIHsKICBmaWxsLW9wYWNpdHk6IC43OwovKgogIHN0cm9rZS13aWR0aDogNnB4OwogIHN0cm9rZS1vcGFjaXR5OiAxOwoqLwp9CgoubnZkMy5udi1waWUgLm52LWxhYmVsIHJlY3QgewogIGZpbGwtb3BhY2l0eTogMDsKICBzdHJva2Utb3BhY2l0eTogMDsKfQoKLyoqKioqKioqKioKKiBMaW5lcwoqLwoKLm52ZDMgLm52LWdyb3VwcyBwYXRoLm52LWxpbmUgewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlLXdpZHRoOiAyLjVweDsKICAvKgogIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICBzaGFwZS1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjsKCiAgdHJhbnNpdGlvbjogc3Ryb2tlLXdpZHRoIDI1MG1zIGxpbmVhcjsKICAtbW96LXRyYW5zaXRpb246IHN0cm9rZS13aWR0aCAyNTBtcyBsaW5lYXI7CiAgLXdlYmtpdC10cmFuc2l0aW9uOiBzdHJva2Utd2lkdGggMjUwbXMgbGluZWFyOwoKICB0cmFuc2l0aW9uLWRlbGF5OiAyNTBtcwogIC1tb3otdHJhbnNpdGlvbi1kZWxheTogMjUwbXM7CiAgLXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5OiAyNTBtczsKICAqLwp9CgoubnZkMyAubnYtZ3JvdXBzIHBhdGgubnYtYXJlYSB7CiAgc3Ryb2tlOiBub25lOwogIC8qCiAgc3Ryb2tlLWxpbmVjYXA6IHJvdW5kOwogIHNoYXBlLXJlbmRlcmluZzogZ2VvbWV0cmljUHJlY2lzaW9uOwoKICBzdHJva2Utd2lkdGg6IDIuNXB4OwogIHRyYW5zaXRpb246IHN0cm9rZS13aWR0aCAyNTBtcyBsaW5lYXI7CiAgLW1vei10cmFuc2l0aW9uOiBzdHJva2Utd2lkdGggMjUwbXMgbGluZWFyOwogIC13ZWJraXQtdHJhbnNpdGlvbjogc3Ryb2tlLXdpZHRoIDI1MG1zIGxpbmVhcjsKCiAgdHJhbnNpdGlvbi1kZWxheTogMjUwbXMKICAtbW96LXRyYW5zaXRpb24tZGVsYXk6IDI1MG1zOwogIC13ZWJraXQtdHJhbnNpdGlvbi1kZWxheTogMjUwbXM7CiAgKi8KfQoKLm52ZDMgLm52LWxpbmUuaG92ZXIgcGF0aCB7CiAgc3Ryb2tlLXdpZHRoOiA2cHg7Cn0KCi8qCi5udmQzLnNjYXR0ZXIgLmdyb3VwcyAucG9pbnQgewogIGZpbGwtb3BhY2l0eTogMC4xOwogIHN0cm9rZS1vcGFjaXR5OiAwLjE7Cn0KICAqLwoKLm52ZDMubnYtbGluZSAubnZkMy5udi1zY2F0dGVyIC5udi1ncm91cHMgLm52LXBvaW50IHsKICBmaWxsLW9wYWNpdHk6IDA7CiAgc3Ryb2tlLW9wYWNpdHk6IDA7Cn0KCi5udmQzLm52LXNjYXR0ZXIubnYtc2luZ2xlLXBvaW50IC5udi1ncm91cHMgLm52LXBvaW50IHsKICBmaWxsLW9wYWNpdHk6IC41ICFpbXBvcnRhbnQ7CiAgc3Ryb2tlLW9wYWNpdHk6IC41ICFpbXBvcnRhbnQ7Cn0KCgoubnZkMyAubnYtZ3JvdXBzIC5udi1wb2ludCB7CiAgdHJhbnNpdGlvbjogc3Ryb2tlLXdpZHRoIDI1MG1zIGxpbmVhciwgc3Ryb2tlLW9wYWNpdHkgMjUwbXMgbGluZWFyOwogIC1tb3otdHJhbnNpdGlvbjogc3Ryb2tlLXdpZHRoIDI1MG1zIGxpbmVhciwgc3Ryb2tlLW9wYWNpdHkgMjUwbXMgbGluZWFyOwogIC13ZWJraXQtdHJhbnNpdGlvbjogc3Ryb2tlLXdpZHRoIDI1MG1zIGxpbmVhciwgc3Ryb2tlLW9wYWNpdHkgMjUwbXMgbGluZWFyOwp9CgoubnZkMy5udi1zY2F0dGVyIC5udi1ncm91cHMgLm52LXBvaW50LmhvdmVyLAoubnZkMyAubnYtZ3JvdXBzIC5udi1wb2ludC5ob3ZlciB7CiAgc3Ryb2tlLXdpZHRoOiAyMHB4OwogIGZpbGwtb3BhY2l0eTogLjUgIWltcG9ydGFudDsKICBzdHJva2Utb3BhY2l0eTogLjUgIWltcG9ydGFudDsKfQoKCi5udmQzIC5udi1wb2ludC1wYXRocyBwYXRoIHsKICBzdHJva2U6ICNhYWE7CiAgc3Ryb2tlLW9wYWNpdHk6IDA7CiAgZmlsbDogI2VlZTsKICBmaWxsLW9wYWNpdHk6IDA7Cn0KCgoKLm52ZDMgLm52LWluZGV4TGluZSB7CiAgY3Vyc29yOiBldy1yZXNpemU7Cn0KCgovKioqKioqKioqKgoqIERpc3RyaWJ1dGlvbgoqLwoKLm52ZDMgLm52LWRpc3RyaWJ1dGlvbiB7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCgoKLyoqKioqKioqKioKKiAgU2NhdHRlcgoqLwoKLyogKipBdHRlbXB0aW5nIHRvIHJlbW92ZSB0aGlzIGZvciB1c2VWb3Jvbm9pKGZhbHNlKSwgbmVlZCB0byBzZWUgaWYgaXQncyByZXF1aXJlZCBhbnl3aGVyZQoubnZkMyAubnYtZ3JvdXBzIC5udi1wb2ludCB7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KKi8KCi5udmQzIC5udi1ncm91cHMgLm52LXBvaW50LmhvdmVyIHsKICBzdHJva2Utd2lkdGg6IDIwcHg7CiAgc3Ryb2tlLW9wYWNpdHk6IC41Owp9CgoubnZkMyAubnYtc2NhdHRlciAubnYtcG9pbnQuaG92ZXIgewogIGZpbGwtb3BhY2l0eTogMTsKfQoKLyoKLm52LWdyb3VwLmhvdmVyIC5udi1wb2ludCB7CiAgZmlsbC1vcGFjaXR5OiAxOwp9CiovCgoKLyoqKioqKioqKioKKiAgU3RhY2tlZCBBcmVhCiovCgoubnZkMy5udi1zdGFja2VkYXJlYSBwYXRoLm52LWFyZWEgewogIGZpbGwtb3BhY2l0eTogLjc7CiAgLyoKICBzdHJva2Utb3BhY2l0eTogLjY1OwogIGZpbGwtb3BhY2l0eTogMTsKICAqLwogIHN0cm9rZS1vcGFjaXR5OiAwOwoKICB0cmFuc2l0aW9uOiBmaWxsLW9wYWNpdHkgMjUwbXMgbGluZWFyLCBzdHJva2Utb3BhY2l0eSAyNTBtcyBsaW5lYXI7CiAgLW1vei10cmFuc2l0aW9uOiBmaWxsLW9wYWNpdHkgMjUwbXMgbGluZWFyLCBzdHJva2Utb3BhY2l0eSAyNTBtcyBsaW5lYXI7CiAgLXdlYmtpdC10cmFuc2l0aW9uOiBmaWxsLW9wYWNpdHkgMjUwbXMgbGluZWFyLCBzdHJva2Utb3BhY2l0eSAyNTBtcyBsaW5lYXI7CgogIC8qCiAgdHJhbnNpdGlvbi1kZWxheTogNTAwbXM7CiAgLW1vei10cmFuc2l0aW9uLWRlbGF5OiA1MDBtczsKICAtd2Via2l0LXRyYW5zaXRpb24tZGVsYXk6IDUwMG1zOwogICovCgp9CgoubnZkMy5udi1zdGFja2VkYXJlYSBwYXRoLm52LWFyZWEuaG92ZXIgewogIGZpbGwtb3BhY2l0eTogLjk7CiAgLyoKICBzdHJva2Utb3BhY2l0eTogLjg1OwogICovCn0KLyoKLmQzc3RhY2tlZGFyZWEgLmdyb3VwcyBwYXRoIHsKICBzdHJva2Utb3BhY2l0eTogMDsKfQogICovCgoKCi5udmQzLm52LXN0YWNrZWRhcmVhIC5udi1ncm91cHMgLm52LXBvaW50IHsKICBzdHJva2Utb3BhY2l0eTogMDsKICBmaWxsLW9wYWNpdHk6IDA7Cn0KCi5udmQzLm52LXN0YWNrZWRhcmVhIC5udi1ncm91cHMgLm52LXBvaW50LmhvdmVyIHsKICBzdHJva2Utd2lkdGg6IDIwcHg7CiAgc3Ryb2tlLW9wYWNpdHk6IC43NTsKICBmaWxsLW9wYWNpdHk6IDE7Cn0KCgoKLyoqKioqKioqKioKKiAgTGluZSBQbHVzIEJhcgoqLwoKLm52ZDMubnYtbGluZVBsdXNCYXIgLm52LWJhciByZWN0IHsKICBmaWxsLW9wYWNpdHk6IC43NTsKfQoKLm52ZDMubnYtbGluZVBsdXNCYXIgLm52LWJhciByZWN0OmhvdmVyIHsKICBmaWxsLW9wYWNpdHk6IDE7Cn0KCgovKioqKioqKioqKgoqICBCdWxsZXQKKi8KCi5udmQzLm52LWJ1bGxldCB7IGZvbnQ6IDEwcHggc2Fucy1zZXJpZjsgfQoubnZkMy5udi1idWxsZXQgLm52LW1lYXN1cmUgeyBmaWxsLW9wYWNpdHk6IC44OyB9Ci5udmQzLm52LWJ1bGxldCAubnYtbWVhc3VyZTpob3ZlciB7IGZpbGwtb3BhY2l0eTogMTsgfQoubnZkMy5udi1idWxsZXQgLm52LW1hcmtlciB7IHN0cm9rZTogIzAwMDsgc3Ryb2tlLXdpZHRoOiAycHg7IH0KLm52ZDMubnYtYnVsbGV0IC5udi1tYXJrZXJUcmlhbmdsZSB7IHN0cm9rZTogIzAwMDsgZmlsbDogI2ZmZjsgc3Ryb2tlLXdpZHRoOiAxLjVweDsgfQoubnZkMy5udi1idWxsZXQgLm52LXRpY2sgbGluZSB7IHN0cm9rZTogIzY2Njsgc3Ryb2tlLXdpZHRoOiAuNXB4OyB9Ci5udmQzLm52LWJ1bGxldCAubnYtcmFuZ2UubnYtczAgeyBmaWxsOiAjZWVlOyB9Ci5udmQzLm52LWJ1bGxldCAubnYtcmFuZ2UubnYtczEgeyBmaWxsOiAjZGRkOyB9Ci5udmQzLm52LWJ1bGxldCAubnYtcmFuZ2UubnYtczIgeyBmaWxsOiAjY2NjOyB9Ci5udmQzLm52LWJ1bGxldCAubnYtdGl0bGUgeyBmb250LXNpemU6IDE0cHg7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci5udmQzLm52LWJ1bGxldCAubnYtc3VidGl0bGUgeyBmaWxsOiAjOTk5OyB9CgoKLm52ZDMubnYtYnVsbGV0IC5udi1yYW5nZSB7CiAgZmlsbDogIzk5OTsKICBmaWxsLW9wYWNpdHk6IC40Owp9Ci5udmQzLm52LWJ1bGxldCAubnYtcmFuZ2U6aG92ZXIgewogIGZpbGwtb3BhY2l0eTogLjc7Cn0KCgoKLyoqKioqKioqKioKKiBTcGFya2xpbmUKKi8KCi5udmQzLm52LXNwYXJrbGluZSBwYXRoIHsKICBmaWxsOiBub25lOwp9CgoubnZkMy5udi1zcGFya2xpbmVwbHVzIGcubnYtaG92ZXJWYWx1ZSB7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5udmQzLm52LXNwYXJrbGluZXBsdXMgLm52LWhvdmVyVmFsdWUgbGluZSB7CiAgc3Ryb2tlOiAjMzMzOwogIHN0cm9rZS13aWR0aDogMS41cHg7CiB9CgoubnZkMy5udi1zcGFya2xpbmVwbHVzLAoubnZkMy5udi1zcGFya2xpbmVwbHVzIGcgewogIHBvaW50ZXItZXZlbnRzOiBhbGw7Cn0KCi5udmQzIC5udi1ob3ZlckFyZWEgewogIGZpbGwtb3BhY2l0eTogMDsKICBzdHJva2Utb3BhY2l0eTogMDsKfQoKLm52ZDMubnYtc3BhcmtsaW5lcGx1cyAubnYteFZhbHVlLAoubnZkMy5udi1zcGFya2xpbmVwbHVzIC5udi15VmFsdWUgewogIC8qCiAgc3Ryb2tlOiAjNjY2OwogICovCiAgc3Ryb2tlLXdpZHRoOiAwOwogIGZvbnQtc2l6ZTogLjllbTsKICBmb250LXdlaWdodDogbm9ybWFsOwp9CgoubnZkMy5udi1zcGFya2xpbmVwbHVzIC5udi15VmFsdWUgewogIHN0cm9rZTogI2Y2NjsKfQoKLm52ZDMubnYtc3BhcmtsaW5lcGx1cyAubnYtbWF4VmFsdWUgewogIHN0cm9rZTogIzJjYTAyYzsKICBmaWxsOiAjMmNhMDJjOwp9CgoubnZkMy5udi1zcGFya2xpbmVwbHVzIC5udi1taW5WYWx1ZSB7CiAgc3Ryb2tlOiAjZDYyNzI4OwogIGZpbGw6ICNkNjI3Mjg7Cn0KCi5udmQzLm52LXNwYXJrbGluZXBsdXMgLm52LWN1cnJlbnRWYWx1ZSB7CiAgLyoKICBzdHJva2U6ICM0NDQ7CiAgZmlsbDogIzAwMDsKICAqLwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtc2l6ZTogMS4xZW07Cn0KCi8qKioqKioqKioqCiogaGlzdG9yaWNhbCBzdG9jawoqLwoKLm52ZDMubnYtb2hsY0JhciAubnYtdGlja3MgLm52LXRpY2sgewogIHN0cm9rZS13aWR0aDogMnB4Owp9CgoubnZkMy5udi1vaGxjQmFyIC5udi10aWNrcyAubnYtdGljay5ob3ZlciB7CiAgc3Ryb2tlLXdpZHRoOiA0cHg7Cn0KCi5udmQzLm52LW9obGNCYXIgLm52LXRpY2tzIC5udi10aWNrLnBvc2l0aXZlIHsKIHN0cm9rZTogIzJjYTAyYzsKfQoKLm52ZDMubnYtb2hsY0JhciAubnYtdGlja3MgLm52LXRpY2submVnYXRpdmUgewogc3Ryb2tlOiAjZDYyNzI4Owp9CgoubnZkMy5udi1oaXN0b3JpY2FsU3RvY2tDaGFydCAubnYtYXhpcyAubnYtYXhpc2xhYmVsIHsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLm52ZDMubnYtaGlzdG9yaWNhbFN0b2NrQ2hhcnQgLm52LWRyYWdUYXJnZXQgewogIGZpbGwtb3BhY2l0eTogMDsKICBzdHJva2U6IG5vbmU7CiAgY3Vyc29yOiBtb3ZlOwp9CgoubnZkMyAubnYtYnJ1c2ggLmV4dGVudCB7CiAgLyoKICBjdXJzb3I6IGV3LXJlc2l6ZSAhaW1wb3J0YW50OwogICovCiAgZmlsbC1vcGFjaXR5OiAwICFpbXBvcnRhbnQ7Cn0KCi5udmQzIC5udi1icnVzaEJhY2tncm91bmQgcmVjdCB7CiAgc3Ryb2tlOiAjMDAwOwogIHN0cm9rZS13aWR0aDogLjQ7CiAgZmlsbDogI2ZmZjsKICBmaWxsLW9wYWNpdHk6IC43Owp9CgoKCi8qKioqKioqKioqCiogSW5kZW50ZWQgVHJlZQoqLwoKCi8qKgogKiBUT0RPOiB0aGUgZm9sbG93aW5nIDMgc2VsZWN0b3JzIGFyZSBiYXNlZCBvbiBjbGFzc2VzIHVzZWQgaW4gdGhlIGV4YW1wbGUuICBJIHNob3VsZCBlaXRoZXIgbWFrZSB0aGVtIHN0YW5kYXJkIGFuZCBsZWF2ZSB0aGVtIGhlcmUsIG9yIG1vdmUgdG8gYSBDU1MgZmlsZSBub3QgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKICovCi5udmQzLm52LWluZGVudGVkdHJlZSAubmFtZSB7CiAgbWFyZ2luLWxlZnQ6IDVweDsKfQoKLm52ZDMubnYtaW5kZW50ZWR0cmVlIC5jbGlja2FibGUgewogIGNvbG9yOiAjMDhDOwogIGN1cnNvcjogcG9pbnRlcjsKfQoKLm52ZDMubnYtaW5kZW50ZWR0cmVlIHNwYW4uY2xpY2thYmxlOmhvdmVyIHsKICBjb2xvcjogIzAwNTU4MDsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKCi5udmQzLm52LWluZGVudGVkdHJlZSAubnYtY2hpbGRyZW5Db3VudCB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbi1sZWZ0OiA1cHg7Cn0KCi5udmQzLm52LWluZGVudGVkdHJlZSAubnYtdHJlZWljb24gewogIGN1cnNvcjogcG9pbnRlcjsKICAvKgogIGN1cnNvcjogbi1yZXNpemU7CiAgKi8KfQoKLm52ZDMubnYtaW5kZW50ZWR0cmVlIC5udi10cmVlaWNvbi5udi1mb2xkZWQgewogIGN1cnNvcjogcG9pbnRlcjsKICAvKgogIGN1cnNvcjogcy1yZXNpemU7CiAgKi8KfQoKCg=='> <link rel='stylesheet' href='data:text/css;base64,Lm52ZDMgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgIG1hcmdpbi1yaWdodDogYXV0bzsKICAgIHdpZHRoOiA4MDBweDsKICAgIGhlaWdodDogNDAwcHg7CiAgICAvKiBiYWNrZ3JvdW5kOiAjZWVlOyAqLwp9ICAK'> <script src='data:application/javascript;base64,LyohIGpRdWVyeSB2MS44LjIganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLw0KKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gRyhhKXt2YXIgYj1GW2FdPXt9O3JldHVybiBwLmVhY2goYS5zcGxpdChzKSxmdW5jdGlvbihhLGMpe2JbY109ITB9KSxifWZ1bmN0aW9uIEooYSxjLGQpe2lmKGQ9PT1iJiZhLm5vZGVUeXBlPT09MSl7dmFyIGU9ImRhdGEtIitjLnJlcGxhY2UoSSwiLSQxIikudG9Mb3dlckNhc2UoKTtkPWEuZ2V0QXR0cmlidXRlKGUpO2lmKHR5cGVvZiBkPT0ic3RyaW5nIil7dHJ5e2Q9ZD09PSJ0cnVlIj8hMDpkPT09ImZhbHNlIj8hMTpkPT09Im51bGwiP251bGw6K2QrIiI9PT1kPytkOkgudGVzdChkKT9wLnBhcnNlSlNPTihkKTpkfWNhdGNoKGYpe31wLmRhdGEoYSxjLGQpfWVsc2UgZD1ifXJldHVybiBkfWZ1bmN0aW9uIEsoYSl7dmFyIGI7Zm9yKGIgaW4gYSl7aWYoYj09PSJkYXRhIiYmcC5pc0VtcHR5T2JqZWN0KGFbYl0pKWNvbnRpbnVlO2lmKGIhPT0idG9KU09OIilyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBiYSgpe3JldHVybiExfWZ1bmN0aW9uIGJiKCl7cmV0dXJuITB9ZnVuY3Rpb24gYmgoYSl7cmV0dXJuIWF8fCFhLnBhcmVudE5vZGV8fGEucGFyZW50Tm9kZS5ub2RlVHlwZT09PTExfWZ1bmN0aW9uIGJpKGEsYil7ZG8gYT1hW2JdO3doaWxlKGEmJmEubm9kZVR5cGUhPT0xKTtyZXR1cm4gYX1mdW5jdGlvbiBiaihhLGIsYyl7Yj1ifHwwO2lmKHAuaXNGdW5jdGlvbihiKSlyZXR1cm4gcC5ncmVwKGEsZnVuY3Rpb24oYSxkKXt2YXIgZT0hIWIuY2FsbChhLGQsYSk7cmV0dXJuIGU9PT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gcC5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gYT09PWI9PT1jfSk7aWYodHlwZW9mIGI9PSJzdHJpbmciKXt2YXIgZD1wLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PTF9KTtpZihiZS50ZXN0KGIpKXJldHVybiBwLmZpbHRlcihiLGQsIWMpO2I9cC5maWx0ZXIoYixkKX1yZXR1cm4gcC5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gcC5pbkFycmF5KGEsYik+PTA9PT1jfSl9ZnVuY3Rpb24gYmsoYSl7dmFyIGI9Ymwuc3BsaXQoInwiKSxjPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2lmKGMuY3JlYXRlRWxlbWVudCl3aGlsZShiLmxlbmd0aCljLmNyZWF0ZUVsZW1lbnQoYi5wb3AoKSk7cmV0dXJuIGN9ZnVuY3Rpb24gYkMoYSxiKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChiKSl9ZnVuY3Rpb24gYkQoYSxiKXtpZihiLm5vZGVUeXBlIT09MXx8IXAuaGFzRGF0YShhKSlyZXR1cm47dmFyIGMsZCxlLGY9cC5fZGF0YShhKSxnPXAuX2RhdGEoYixmKSxoPWYuZXZlbnRzO2lmKGgpe2RlbGV0ZSBnLmhhbmRsZSxnLmV2ZW50cz17fTtmb3IoYyBpbiBoKWZvcihkPTAsZT1oW2NdLmxlbmd0aDtkPGU7ZCsrKXAuZXZlbnQuYWRkKGIsYyxoW2NdW2RdKX1nLmRhdGEmJihnLmRhdGE9cC5leHRlbmQoe30sZy5kYXRhKSl9ZnVuY3Rpb24gYkUoYSxiKXt2YXIgYztpZihiLm5vZGVUeXBlIT09MSlyZXR1cm47Yi5jbGVhckF0dHJpYnV0ZXMmJmIuY2xlYXJBdHRyaWJ1dGVzKCksYi5tZXJnZUF0dHJpYnV0ZXMmJmIubWVyZ2VBdHRyaWJ1dGVzKGEpLGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGM9PT0ib2JqZWN0Ij8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLHAuc3VwcG9ydC5odG1sNUNsb25lJiZhLmlubmVySFRNTCYmIXAudHJpbShiLmlubmVySFRNTCkmJihiLmlubmVySFRNTD1hLmlubmVySFRNTCkpOmM9PT0iaW5wdXQiJiZidi50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOmM9PT0ib3B0aW9uIj9iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOmM9PT0iaW5wdXQifHxjPT09InRleHRhcmVhIj9iLmRlZmF1bHRWYWx1ZT1hLmRlZmF1bHRWYWx1ZTpjPT09InNjcmlwdCImJmIudGV4dCE9PWEudGV4dCYmKGIudGV4dD1hLnRleHQpLGIucmVtb3ZlQXR0cmlidXRlKHAuZXhwYW5kbyl9ZnVuY3Rpb24gYkYoYSl7cmV0dXJuIHR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIj9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9InVuZGVmaW5lZCI/YS5xdWVyeVNlbGVjdG9yQWxsKCIqIik6W119ZnVuY3Rpb24gYkcoYSl7YnYudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIGJZKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1iVy5sZW5ndGg7d2hpbGUoZS0tKXtiPWJXW2VdK2M7aWYoYiBpbiBhKXJldHVybiBifXJldHVybiBkfWZ1bmN0aW9uIGJaKGEsYil7cmV0dXJuIGE9Ynx8YSxwLmNzcyhhLCJkaXNwbGF5Iik9PT0ibm9uZSJ8fCFwLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKX1mdW5jdGlvbiBiJChhLGIpe3ZhciBjLGQsZT1bXSxmPTAsZz1hLmxlbmd0aDtmb3IoO2Y8ZztmKyspe2M9YVtmXTtpZighYy5zdHlsZSljb250aW51ZTtlW2ZdPXAuX2RhdGEoYywib2xkZGlzcGxheSIpLGI/KCFlW2ZdJiZjLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSImJihjLnN0eWxlLmRpc3BsYXk9IiIpLGMuc3R5bGUuZGlzcGxheT09PSIiJiZiWihjKSYmKGVbZl09cC5fZGF0YShjLCJvbGRkaXNwbGF5IixjYyhjLm5vZGVOYW1lKSkpKTooZD1iSChjLCJkaXNwbGF5IiksIWVbZl0mJmQhPT0ibm9uZSImJnAuX2RhdGEoYywib2xkZGlzcGxheSIsZCkpfWZvcihmPTA7ZjxnO2YrKyl7Yz1hW2ZdO2lmKCFjLnN0eWxlKWNvbnRpbnVlO2lmKCFifHxjLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSJ8fGMuc3R5bGUuZGlzcGxheT09PSIiKWMuc3R5bGUuZGlzcGxheT1iP2VbZl18fCIiOiJub25lIn1yZXR1cm4gYX1mdW5jdGlvbiBiXyhhLGIsYyl7dmFyIGQ9YlAuZXhlYyhiKTtyZXR1cm4gZD9NYXRoLm1heCgwLGRbMV0tKGN8fDApKSsoZFsyXXx8InB4Iik6Yn1mdW5jdGlvbiBjYShhLGIsYyxkKXt2YXIgZT1jPT09KGQ/ImJvcmRlciI6ImNvbnRlbnQiKT80OmI9PT0id2lkdGgiPzE6MCxmPTA7Zm9yKDtlPDQ7ZSs9MiljPT09Im1hcmdpbiImJihmKz1wLmNzcyhhLGMrYlZbZV0sITApKSxkPyhjPT09ImNvbnRlbnQiJiYoZi09cGFyc2VGbG9hdChiSChhLCJwYWRkaW5nIitiVltlXSkpfHwwKSxjIT09Im1hcmdpbiImJihmLT1wYXJzZUZsb2F0KGJIKGEsImJvcmRlciIrYlZbZV0rIldpZHRoIikpfHwwKSk6KGYrPXBhcnNlRmxvYXQoYkgoYSwicGFkZGluZyIrYlZbZV0pKXx8MCxjIT09InBhZGRpbmciJiYoZis9cGFyc2VGbG9hdChiSChhLCJib3JkZXIiK2JWW2VdKyJXaWR0aCIpKXx8MCkpO3JldHVybiBmfWZ1bmN0aW9uIGNiKGEsYixjKXt2YXIgZD1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGU9ITAsZj1wLnN1cHBvcnQuYm94U2l6aW5nJiZwLmNzcyhhLCJib3hTaXppbmciKT09PSJib3JkZXItYm94IjtpZihkPD0wfHxkPT1udWxsKXtkPWJIKGEsYik7aWYoZDwwfHxkPT1udWxsKWQ9YS5zdHlsZVtiXTtpZihiUS50ZXN0KGQpKXJldHVybiBkO2U9ZiYmKHAuc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZXx8ZD09PWEuc3R5bGVbYl0pLGQ9cGFyc2VGbG9hdChkKXx8MH1yZXR1cm4gZCtjYShhLGIsY3x8KGY/ImJvcmRlciI6ImNvbnRlbnQiKSxlKSsicHgifWZ1bmN0aW9uIGNjKGEpe2lmKGJTW2FdKXJldHVybiBiU1thXTt2YXIgYj1wKCI8IithKyI+IikuYXBwZW5kVG8oZS5ib2R5KSxjPWIuY3NzKCJkaXNwbGF5Iik7Yi5yZW1vdmUoKTtpZihjPT09Im5vbmUifHxjPT09IiIpe2JJPWUuYm9keS5hcHBlbmRDaGlsZChiSXx8cC5leHRlbmQoZS5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSx7ZnJhbWVCb3JkZXI6MCx3aWR0aDowLGhlaWdodDowfSkpO2lmKCFiSnx8IWJJLmNyZWF0ZUVsZW1lbnQpYko9KGJJLmNvbnRlbnRXaW5kb3d8fGJJLmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsYkoud3JpdGUoIjwhZG9jdHlwZSBodG1sPjxodG1sPjxib2R5PiIpLGJKLmNsb3NlKCk7Yj1iSi5ib2R5LmFwcGVuZENoaWxkKGJKLmNyZWF0ZUVsZW1lbnQoYSkpLGM9YkgoYiwiZGlzcGxheSIpLGUuYm9keS5yZW1vdmVDaGlsZChiSSl9cmV0dXJuIGJTW2FdPWMsY31mdW5jdGlvbiBjaShhLGIsYyxkKXt2YXIgZTtpZihwLmlzQXJyYXkoYikpcC5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxjZS50ZXN0KGEpP2QoYSxlKTpjaShhKyJbIisodHlwZW9mIGU9PSJvYmplY3QiP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKCFjJiZwLnR5cGUoYik9PT0ib2JqZWN0Iilmb3IoZSBpbiBiKWNpKGErIlsiK2UrIl0iLGJbZV0sYyxkKTtlbHNlIGQoYSxiKX1mdW5jdGlvbiBjeihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXt0eXBlb2YgYiE9InN0cmluZyImJihjPWIsYj0iKiIpO3ZhciBkLGUsZixnPWIudG9Mb3dlckNhc2UoKS5zcGxpdChzKSxoPTAsaT1nLmxlbmd0aDtpZihwLmlzRnVuY3Rpb24oYykpZm9yKDtoPGk7aCsrKWQ9Z1toXSxmPS9eXCsvLnRlc3QoZCksZiYmKGQ9ZC5zdWJzdHIoMSl8fCIqIiksZT1hW2RdPWFbZF18fFtdLGVbZj8idW5zaGlmdCI6InB1c2giXShjKX19ZnVuY3Rpb24gY0EoYSxjLGQsZSxmLGcpe2Y9Znx8Yy5kYXRhVHlwZXNbMF0sZz1nfHx7fSxnW2ZdPSEwO3ZhciBoLGk9YVtmXSxqPTAsaz1pP2kubGVuZ3RoOjAsbD1hPT09Y3Y7Zm9yKDtqPGsmJihsfHwhaCk7aisrKWg9aVtqXShjLGQsZSksdHlwZW9mIGg9PSJzdHJpbmciJiYoIWx8fGdbaF0/aD1iOihjLmRhdGFUeXBlcy51bnNoaWZ0KGgpLGg9Y0EoYSxjLGQsZSxoLGcpKSk7cmV0dXJuKGx8fCFoKSYmIWdbIioiXSYmKGg9Y0EoYSxjLGQsZSwiKiIsZykpLGh9ZnVuY3Rpb24gY0IoYSxjKXt2YXIgZCxlLGY9cC5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGMpY1tkXSE9PWImJigoZltkXT9hOmV8fChlPXt9KSlbZF09Y1tkXSk7ZSYmcC5leHRlbmQoITAsYSxlKX1mdW5jdGlvbiBjQyhhLGMsZCl7dmFyIGUsZixnLGgsaT1hLmNvbnRlbnRzLGo9YS5kYXRhVHlwZXMsaz1hLnJlc3BvbnNlRmllbGRzO2ZvcihmIGluIGspZiBpbiBkJiYoY1trW2ZdXT1kW2ZdKTt3aGlsZShqWzBdPT09IioiKWouc2hpZnQoKSxlPT09YiYmKGU9YS5taW1lVHlwZXx8Yy5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIikpO2lmKGUpZm9yKGYgaW4gaSlpZihpW2ZdJiZpW2ZdLnRlc3QoZSkpe2oudW5zaGlmdChmKTticmVha31pZihqWzBdaW4gZClnPWpbMF07ZWxzZXtmb3IoZiBpbiBkKXtpZighalswXXx8YS5jb252ZXJ0ZXJzW2YrIiAiK2pbMF1dKXtnPWY7YnJlYWt9aHx8KGg9Zil9Zz1nfHxofWlmKGcpcmV0dXJuIGchPT1qWzBdJiZqLnVuc2hpZnQoZyksZFtnXX1mdW5jdGlvbiBjRChhLGIpe3ZhciBjLGQsZSxmLGc9YS5kYXRhVHlwZXMuc2xpY2UoKSxoPWdbMF0saT17fSxqPTA7YS5kYXRhRmlsdGVyJiYoYj1hLmRhdGFGaWx0ZXIoYixhLmRhdGFUeXBlKSk7aWYoZ1sxXSlmb3IoYyBpbiBhLmNvbnZlcnRlcnMpaVtjLnRvTG93ZXJDYXNlKCldPWEuY29udmVydGVyc1tjXTtmb3IoO2U9Z1srK2pdOylpZihlIT09IioiKXtpZihoIT09IioiJiZoIT09ZSl7Yz1pW2grIiAiK2VdfHxpWyIqICIrZV07aWYoIWMpZm9yKGQgaW4gaSl7Zj1kLnNwbGl0KCIgIik7aWYoZlsxXT09PWUpe2M9aVtoKyIgIitmWzBdXXx8aVsiKiAiK2ZbMF1dO2lmKGMpe2M9PT0hMD9jPWlbZF06aVtkXSE9PSEwJiYoZT1mWzBdLGcuc3BsaWNlKGotLSwwLGUpKTticmVha319fWlmKGMhPT0hMClpZihjJiZhWyJ0aHJvd3MiXSliPWMoYik7ZWxzZSB0cnl7Yj1jKGIpfWNhdGNoKGspe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmM/azoiTm8gY29udmVyc2lvbiBmcm9tICIraCsiIHRvICIrZX19fWg9ZX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6Yn19ZnVuY3Rpb24gY0woKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gY00oKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1mdW5jdGlvbiBjVSgpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Y049Yn0sMCksY049cC5ub3coKX1mdW5jdGlvbiBjVihhLGIpe3AuZWFjaChiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9KGNUW2JdfHxbXSkuY29uY2F0KGNUWyIqIl0pLGU9MCxmPWQubGVuZ3RoO2Zvcig7ZTxmO2UrKylpZihkW2VdLmNhbGwoYSxiLGMpKXJldHVybn0pfWZ1bmN0aW9uIGNXKGEsYixjKXt2YXIgZCxlPTAsZj0wLGc9Y1MubGVuZ3RoLGg9cC5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBpLmVsZW19KSxpPWZ1bmN0aW9uKCl7dmFyIGI9Y058fGNVKCksYz1NYXRoLm1heCgwLGouc3RhcnRUaW1lK2ouZHVyYXRpb24tYiksZD0xLShjL2ouZHVyYXRpb258fDApLGU9MCxmPWoudHdlZW5zLmxlbmd0aDtmb3IoO2U8ZjtlKyspai50d2VlbnNbZV0ucnVuKGQpO3JldHVybiBoLm5vdGlmeVdpdGgoYSxbaixkLGNdKSxkPDEmJmY/YzooaC5yZXNvbHZlV2l0aChhLFtqXSksITEpfSxqPWgucHJvbWlzZSh7ZWxlbTphLHByb3BzOnAuZXh0ZW5kKHt9LGIpLG9wdHM6cC5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LGMpLG9yaWdpbmFsUHJvcGVydGllczpiLG9yaWdpbmFsT3B0aW9uczpjLHN0YXJ0VGltZTpjTnx8Y1UoKSxkdXJhdGlvbjpjLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihiLGMsZCl7dmFyIGU9cC5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGUpLGV9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7Zm9yKDtjPGQ7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj9oLnJlc29sdmVXaXRoKGEsW2osYl0pOmgucmVqZWN0V2l0aChhLFtqLGJdKSx0aGlzfX0pLGs9ai5wcm9wcztjWChrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtmb3IoO2U8ZztlKyspe2Q9Y1NbZV0uY2FsbChqLGEsayxqLm9wdHMpO2lmKGQpcmV0dXJuIGR9cmV0dXJuIGNWKGosaykscC5pc0Z1bmN0aW9uKGoub3B0cy5zdGFydCkmJmoub3B0cy5zdGFydC5jYWxsKGEsaikscC5meC50aW1lcihwLmV4dGVuZChpLHthbmltOmoscXVldWU6ai5vcHRzLnF1ZXVlLGVsZW06YX0pKSxqLnByb2dyZXNzKGoub3B0cy5wcm9ncmVzcykuZG9uZShqLm9wdHMuZG9uZSxqLm9wdHMuY29tcGxldGUpLmZhaWwoai5vcHRzLmZhaWwpLmFsd2F5cyhqLm9wdHMuYWx3YXlzKX1mdW5jdGlvbiBjWChhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSl7ZD1wLmNhbWVsQ2FzZShjKSxlPWJbZF0sZj1hW2NdLHAuaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9cC5jc3NIb29rc1tkXTtpZihnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX19ZnVuY3Rpb24gY1koYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGssbD10aGlzLG09YS5zdHlsZSxuPXt9LG89W10scT1hLm5vZGVUeXBlJiZiWihhKTtjLnF1ZXVlfHwoaj1wLl9xdWV1ZUhvb2tzKGEsImZ4Iiksai51bnF1ZXVlZD09bnVsbCYmKGoudW5xdWV1ZWQ9MCxrPWouZW1wdHkuZmlyZSxqLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtqLnVucXVldWVkfHxrKCl9KSxqLnVucXVldWVkKyssbC5hbHdheXMoZnVuY3Rpb24oKXtsLmFsd2F5cyhmdW5jdGlvbigpe2oudW5xdWV1ZWQtLSxwLnF1ZXVlKGEsImZ4IikubGVuZ3RofHxqLmVtcHR5LmZpcmUoKX0pfSkpLGEubm9kZVR5cGU9PT0xJiYoImhlaWdodCJpbiBifHwid2lkdGgiaW4gYikmJihjLm92ZXJmbG93PVttLm92ZXJmbG93LG0ub3ZlcmZsb3dYLG0ub3ZlcmZsb3dZXSxwLmNzcyhhLCJkaXNwbGF5Iik9PT0iaW5saW5lIiYmcC5jc3MoYSwiZmxvYXQiKT09PSJub25lIiYmKCFwLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dHx8Y2MoYS5ub2RlTmFtZSk9PT0iaW5saW5lIj9tLmRpc3BsYXk9ImlubGluZS1ibG9jayI6bS56b29tPTEpKSxjLm92ZXJmbG93JiYobS5vdmVyZmxvdz0iaGlkZGVuIixwLnN1cHBvcnQuc2hyaW5rV3JhcEJsb2Nrc3x8bC5kb25lKGZ1bmN0aW9uKCl7bS5vdmVyZmxvdz1jLm92ZXJmbG93WzBdLG0ub3ZlcmZsb3dYPWMub3ZlcmZsb3dbMV0sbS5vdmVyZmxvd1k9Yy5vdmVyZmxvd1syXX0pKTtmb3IoZCBpbiBiKXtmPWJbZF07aWYoY1AuZXhlYyhmKSl7ZGVsZXRlIGJbZF07aWYoZj09PShxPyJoaWRlIjoic2hvdyIpKWNvbnRpbnVlO28ucHVzaChkKX19Zz1vLmxlbmd0aDtpZihnKXtoPXAuX2RhdGEoYSwiZnhzaG93Iil8fHAuX2RhdGEoYSwiZnhzaG93Iix7fSkscT9wKGEpLnNob3coKTpsLmRvbmUoZnVuY3Rpb24oKXtwKGEpLmhpZGUoKX0pLGwuZG9uZShmdW5jdGlvbigpe3ZhciBiO3AucmVtb3ZlRGF0YShhLCJmeHNob3ciLCEwKTtmb3IoYiBpbiBuKXAuc3R5bGUoYSxiLG5bYl0pfSk7Zm9yKGQ9MDtkPGc7ZCsrKWU9b1tkXSxpPWwuY3JlYXRlVHdlZW4oZSxxP2hbZV06MCksbltlXT1oW2VdfHxwLnN0eWxlKGEsZSksZSBpbiBofHwoaFtlXT1pLnN0YXJ0LHEmJihpLmVuZD1pLnN0YXJ0LGkuc3RhcnQ9ZT09PSJ3aWR0aCJ8fGU9PT0iaGVpZ2h0Ij8xOjApKX19ZnVuY3Rpb24gY1ooYSxiLGMsZCxlKXtyZXR1cm4gbmV3IGNaLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9ZnVuY3Rpb24gYyQoYSxiKXt2YXIgYyxkPXtoZWlnaHQ6YX0sZT0wO2I9Yj8xOjA7Zm9yKDtlPDQ7ZSs9Mi1iKWM9YlZbZV0sZFsibWFyZ2luIitjXT1kWyJwYWRkaW5nIitjXT1hO3JldHVybiBiJiYoZC5vcGFjaXR5PWQud2lkdGg9YSksZH1mdW5jdGlvbiBkYShhKXtyZXR1cm4gcC5pc1dpbmRvdyhhKT9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OiExfXZhciBjLGQsZT1hLmRvY3VtZW50LGY9YS5sb2NhdGlvbixnPWEubmF2aWdhdG9yLGg9YS5qUXVlcnksaT1hLiQsaj1BcnJheS5wcm90b3R5cGUucHVzaCxrPUFycmF5LnByb3RvdHlwZS5zbGljZSxsPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLG09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxuPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksbz1TdHJpbmcucHJvdG90eXBlLnRyaW0scD1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgcC5mbi5pbml0KGEsYixjKX0scT0vW1wtK10/KD86XGQqXC58KVxkKyg/OltlRV1bXC0rXT9cZCt8KS8uc291cmNlLHI9L1xTLyxzPS9ccysvLHQ9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLHU9L14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLHY9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyx3PS9eW1xdLDp7fVxzXSokLyx4PS8oPzpefDp8LCkoPzpccypcWykrL2cseT0vXFwoPzpbIlxcXC9iZm5ydF18dVtcZGEtZkEtRl17NH0pL2csej0vIlteIlxcXHJcbl0qInx0cnVlfGZhbHNlfG51bGx8LT8oPzpcZFxkKlwufClcZCsoPzpbZUVdW1wtK10/XGQrfCkvZyxBPS9eLW1zLS8sQj0vLShbXGRhLXpdKS9naSxDPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGIrIiIpLnRvVXBwZXJDYXNlKCl9LEQ9ZnVuY3Rpb24oKXtlLmFkZEV2ZW50TGlzdGVuZXI/KGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsRCwhMSkscC5yZWFkeSgpKTplLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiJiYoZS5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixEKSxwLnJlYWR5KCkpfSxFPXt9O3AuZm49cC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnAsaW5pdDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoLGk7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSlyZXR1cm4gdGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xLHRoaXM7aWYodHlwZW9mIGE9PSJzdHJpbmciKXthLmNoYXJBdCgwKT09PSI8IiYmYS5jaGFyQXQoYS5sZW5ndGgtMSk9PT0iPiImJmEubGVuZ3RoPj0zP2Y9W251bGwsYSxudWxsXTpmPXUuZXhlYyhhKTtpZihmJiYoZlsxXXx8IWMpKXtpZihmWzFdKXJldHVybiBjPWMgaW5zdGFuY2VvZiBwP2NbMF06YyxpPWMmJmMubm9kZVR5cGU/Yy5vd25lckRvY3VtZW50fHxjOmUsYT1wLnBhcnNlSFRNTChmWzFdLGksITApLHYudGVzdChmWzFdKSYmcC5pc1BsYWluT2JqZWN0KGMpJiZ0aGlzLmF0dHIuY2FsbChhLGMsITApLHAubWVyZ2UodGhpcyxhKTtnPWUuZ2V0RWxlbWVudEJ5SWQoZlsyXSk7aWYoZyYmZy5wYXJlbnROb2RlKXtpZihnLmlkIT09ZlsyXSlyZXR1cm4gZC5maW5kKGEpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1nfXJldHVybiB0aGlzLmNvbnRleHQ9ZSx0aGlzLnNlbGVjdG9yPWEsdGhpc31yZXR1cm4hY3x8Yy5qcXVlcnk/KGN8fGQpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihjKS5maW5kKGEpfXJldHVybiBwLmlzRnVuY3Rpb24oYSk/ZC5yZWFkeShhKTooYS5zZWxlY3RvciE9PWImJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEuY29udGV4dCkscC5tYWtlQXJyYXkoYSx0aGlzKSl9LHNlbGVjdG9yOiIiLGpxdWVyeToiMS44LjIiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gay5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/dGhpcy50b0FycmF5KCk6YTwwP3RoaXNbdGhpcy5sZW5ndGgrYV06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1wLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gZC5wcmV2T2JqZWN0PXRoaXMsZC5jb250ZXh0PXRoaXMuY29udGV4dCxiPT09ImZpbmQiP2Quc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK2M6YiYmKGQuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrYisiKCIrYysiKSIpLGR9LGVhY2g6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gcC5lYWNoKHRoaXMsYSxiKX0scmVhZHk6ZnVuY3Rpb24oYSl7cmV0dXJuIHAucmVhZHkucHJvbWlzZSgpLmRvbmUoYSksdGhpc30sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9K2EsYT09PS0xP3RoaXMuc2xpY2UoYSk6dGhpcy5zbGljZShhLGErMSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGsuYXBwbHkodGhpcyxhcmd1bWVudHMpLCJzbGljZSIsay5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhwLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6aixzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX0scC5mbi5pbml0LnByb3RvdHlwZT1wLmZuLHAuZXh0ZW5kPXAuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYyxkLGUsZixnLGg9YXJndW1lbnRzWzBdfHx7fSxpPTEsaj1hcmd1bWVudHMubGVuZ3RoLGs9ITE7dHlwZW9mIGg9PSJib29sZWFuIiYmKGs9aCxoPWFyZ3VtZW50c1sxXXx8e30saT0yKSx0eXBlb2YgaCE9Im9iamVjdCImJiFwLmlzRnVuY3Rpb24oaCkmJihoPXt9KSxqPT09aSYmKGg9dGhpcywtLWkpO2Zvcig7aTxqO2krKylpZigoYT1hcmd1bWVudHNbaV0pIT1udWxsKWZvcihjIGluIGEpe2Q9aFtjXSxlPWFbY107aWYoaD09PWUpY29udGludWU7ayYmZSYmKHAuaXNQbGFpbk9iamVjdChlKXx8KGY9cC5pc0FycmF5KGUpKSk/KGY/KGY9ITEsZz1kJiZwLmlzQXJyYXkoZCk/ZDpbXSk6Zz1kJiZwLmlzUGxhaW5PYmplY3QoZCk/ZDp7fSxoW2NdPXAuZXh0ZW5kKGssZyxlKSk6ZSE9PWImJihoW2NdPWUpfXJldHVybiBofSxwLmV4dGVuZCh7bm9Db25mbGljdDpmdW5jdGlvbihiKXtyZXR1cm4gYS4kPT09cCYmKGEuJD1pKSxiJiZhLmpRdWVyeT09PXAmJihhLmpRdWVyeT1oKSxwfSxpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP3AucmVhZHlXYWl0Kys6cC5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpe2lmKGE9PT0hMD8tLXAucmVhZHlXYWl0OnAuaXNSZWFkeSlyZXR1cm47aWYoIWUuYm9keSlyZXR1cm4gc2V0VGltZW91dChwLnJlYWR5LDEpO3AuaXNSZWFkeT0hMDtpZihhIT09ITAmJi0tcC5yZWFkeVdhaXQ+MClyZXR1cm47ZC5yZXNvbHZlV2l0aChlLFtwXSkscC5mbi50cmlnZ2VyJiZwKGUpLnRyaWdnZXIoInJlYWR5Iikub2ZmKCJyZWFkeSIpfSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiBwLnR5cGUoYSk9PT0iZnVuY3Rpb24ifSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVybiBwLnR5cGUoYSk9PT0iYXJyYXkifSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbCYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdChhKSkmJmlzRmluaXRlKGEpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP1N0cmluZyhhKTpFW20uY2FsbChhKV18fCJvYmplY3QifSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe2lmKCFhfHxwLnR5cGUoYSkhPT0ib2JqZWN0Inx8YS5ub2RlVHlwZXx8cC5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIW4uY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhbi5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9dmFyIGQ7Zm9yKGQgaW4gYSk7cmV0dXJuIGQ9PT1ifHxuLmNhbGwoYSxkKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LHBhcnNlSFRNTDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIWF8fHR5cGVvZiBhIT0ic3RyaW5nIj9udWxsOih0eXBlb2YgYj09ImJvb2xlYW4iJiYoYz1iLGI9MCksYj1ifHxlLChkPXYuZXhlYyhhKSk/W2IuY3JlYXRlRWxlbWVudChkWzFdKV06KGQ9cC5idWlsZEZyYWdtZW50KFthXSxiLGM/bnVsbDpbXSkscC5tZXJnZShbXSwoZC5jYWNoZWFibGU/cC5jbG9uZShkLmZyYWdtZW50KTpkLmZyYWdtZW50KS5jaGlsZE5vZGVzKSkpfSxwYXJzZUpTT046ZnVuY3Rpb24oYil7aWYoIWJ8fHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gbnVsbDtiPXAudHJpbShiKTtpZihhLkpTT04mJmEuSlNPTi5wYXJzZSlyZXR1cm4gYS5KU09OLnBhcnNlKGIpO2lmKHcudGVzdChiLnJlcGxhY2UoeSwiQCIpLnJlcGxhY2UoeiwiXSIpLnJlcGxhY2UoeCwiIikpKXJldHVybihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IpKSgpO3AuZXJyb3IoIkludmFsaWQgSlNPTjogIitiKX0scGFyc2VYTUw6ZnVuY3Rpb24oYyl7dmFyIGQsZTtpZighY3x8dHlwZW9mIGMhPSJzdHJpbmciKXJldHVybiBudWxsO3RyeXthLkRPTVBhcnNlcj8oZT1uZXcgRE9NUGFyc2VyLGQ9ZS5wYXJzZUZyb21TdHJpbmcoYywidGV4dC94bWwiKSk6KGQ9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxkLmFzeW5jPSJmYWxzZSIsZC5sb2FkWE1MKGMpKX1jYXRjaChmKXtkPWJ9cmV0dXJuKCFkfHwhZC5kb2N1bWVudEVsZW1lbnR8fGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RoKSYmcC5lcnJvcigiSW52YWxpZCBYTUw6ICIrYyksZH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZyLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoQSwibXMtIikucmVwbGFjZShCLEMpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGY9MCxnPWEubGVuZ3RoLGg9Zz09PWJ8fHAuaXNGdW5jdGlvbihhKTtpZihkKXtpZihoKXtmb3IoZSBpbiBhKWlmKGMuYXBwbHkoYVtlXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtmPGc7KWlmKGMuYXBwbHkoYVtmKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihoKXtmb3IoZSBpbiBhKWlmKGMuY2FsbChhW2VdLGUsYVtlXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZjxnOylpZihjLmNhbGwoYVtmXSxmLGFbZisrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpvJiYhby5jYWxsKCLvu7/CoCIpP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOm8uY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6KGErIiIpLnJlcGxhY2UodCwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9Ynx8W107cmV0dXJuIGEhPW51bGwmJihjPXAudHlwZShhKSxhLmxlbmd0aD09bnVsbHx8Yz09PSJzdHJpbmcifHxjPT09ImZ1bmN0aW9uInx8Yz09PSJyZWdleHAifHxwLmlzV2luZG93KGEpP2ouY2FsbChkLGEpOnAubWVyZ2UoZCxhKSksZH0saW5BcnJheTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoYil7aWYobClyZXR1cm4gbC5jYWxsKGIsYSxjKTtkPWIubGVuZ3RoLGM9Yz9jPDA/TWF0aC5tYXgoMCxkK2MpOmM6MDtmb3IoO2M8ZDtjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxjKXt2YXIgZD1jLmxlbmd0aCxlPWEubGVuZ3RoLGY9MDtpZih0eXBlb2YgZD09Im51bWJlciIpZm9yKDtmPGQ7ZisrKWFbZSsrXT1jW2ZdO2Vsc2Ugd2hpbGUoY1tmXSE9PWIpYVtlKytdPWNbZisrXTtyZXR1cm4gYS5sZW5ndGg9ZSxhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoO2M9ISFjO2Zvcig7ZjxnO2YrKylkPSEhYihhW2ZdLGYpLGMhPT1kJiZlLnB1c2goYVtmXSk7cmV0dXJuIGV9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9YSBpbnN0YW5jZW9mIHB8fGkhPT1iJiZ0eXBlb2YgaT09Im51bWJlciImJihpPjAmJmFbMF0mJmFbaS0xXXx8aT09PTB8fHAuaXNBcnJheShhKSk7aWYoailmb3IoO2g8aTtoKyspZT1jKGFbaF0saCxkKSxlIT1udWxsJiYoZ1tnLmxlbmd0aF09ZSk7ZWxzZSBmb3IoZiBpbiBhKWU9YyhhW2ZdLGYsZCksZSE9bnVsbCYmKGdbZy5sZW5ndGhdPWUpO3JldHVybiBnLmNvbmNhdC5hcHBseShbXSxnKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7dmFyIGQsZSxmO3JldHVybiB0eXBlb2YgYz09InN0cmluZyImJihkPWFbY10sYz1hLGE9ZCkscC5pc0Z1bmN0aW9uKGEpPyhlPWsuY2FsbChhcmd1bWVudHMsMiksZj1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGMsZS5jb25jYXQoay5jYWxsKGFyZ3VtZW50cykpKX0sZi5ndWlkPWEuZ3VpZD1hLmd1aWR8fHAuZ3VpZCsrLGYpOmJ9LGFjY2VzczpmdW5jdGlvbihhLGMsZCxlLGYsZyxoKXt2YXIgaSxqPWQ9PW51bGwsaz0wLGw9YS5sZW5ndGg7aWYoZCYmdHlwZW9mIGQ9PSJvYmplY3QiKXtmb3IoayBpbiBkKXAuYWNjZXNzKGEsYyxrLGRba10sMSxnLGUpO2Y9MX1lbHNlIGlmKGUhPT1iKXtpPWg9PT1iJiZwLmlzRnVuY3Rpb24oZSksaiYmKGk/KGk9YyxjPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gaS5jYWxsKHAoYSksYyl9KTooYy5jYWxsKGEsZSksYz1udWxsKSk7aWYoYylmb3IoO2s8bDtrKyspYyhhW2tdLGQsaT9lLmNhbGwoYVtrXSxrLGMoYVtrXSxkKSk6ZSxoKTtmPTF9cmV0dXJuIGY/YTpqP2MuY2FsbChhKTpsP2MoYVswXSxkKTpnfSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX19KSxwLnJlYWR5LnByb21pc2U9ZnVuY3Rpb24oYil7aWYoIWQpe2Q9cC5EZWZlcnJlZCgpO2lmKGUucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpc2V0VGltZW91dChwLnJlYWR5LDEpO2Vsc2UgaWYoZS5hZGRFdmVudExpc3RlbmVyKWUuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsRCwhMSksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixwLnJlYWR5LCExKTtlbHNle2UuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsRCksYS5hdHRhY2hFdmVudCgib25sb2FkIixwLnJlYWR5KTt2YXIgYz0hMTt0cnl7Yz1hLmZyYW1lRWxlbWVudD09bnVsbCYmZS5kb2N1bWVudEVsZW1lbnR9Y2F0Y2goZil7fWMmJmMuZG9TY3JvbGwmJmZ1bmN0aW9uIGcoKXtpZighcC5pc1JlYWR5KXt0cnl7Yy5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3JldHVybiBzZXRUaW1lb3V0KGcsNTApfXAucmVhZHkoKX19KCl9fXJldHVybiBkLnByb21pc2UoYil9LHAuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe0VbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSksYz1wKGUpO3ZhciBGPXt9O3AuQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9dHlwZW9mIGE9PSJzdHJpbmciP0ZbYV18fEcoYSk6cC5leHRlbmQoe30sYSk7dmFyIGMsZCxlLGYsZyxoLGk9W10saj0hYS5vbmNlJiZbXSxrPWZ1bmN0aW9uKGIpe2M9YS5tZW1vcnkmJmIsZD0hMCxoPWZ8fDAsZj0wLGc9aS5sZW5ndGgsZT0hMDtmb3IoO2kmJmg8ZztoKyspaWYoaVtoXS5hcHBseShiWzBdLGJbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2Upe2M9ITE7YnJlYWt9ZT0hMSxpJiYoaj9qLmxlbmd0aCYmayhqLnNoaWZ0KCkpOmM/aT1bXTpsLmRpc2FibGUoKSl9LGw9e2FkZDpmdW5jdGlvbigpe2lmKGkpe3ZhciBiPWkubGVuZ3RoOyhmdW5jdGlvbiBkKGIpe3AuZWFjaChiLGZ1bmN0aW9uKGIsYyl7dmFyIGU9cC50eXBlKGMpO2U9PT0iZnVuY3Rpb24iJiYoIWEudW5pcXVlfHwhbC5oYXMoYykpP2kucHVzaChjKTpjJiZjLmxlbmd0aCYmZSE9PSJzdHJpbmciJiZkKGMpfSl9KShhcmd1bWVudHMpLGU/Zz1pLmxlbmd0aDpjJiYoZj1iLGsoYykpfXJldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gaSYmcC5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihhLGIpe3ZhciBjO3doaWxlKChjPXAuaW5BcnJheShiLGksYykpPi0xKWkuc3BsaWNlKGMsMSksZSYmKGM8PWcmJmctLSxjPD1oJiZoLS0pfSksdGhpc30saGFzOmZ1bmN0aW9uKGEpe3JldHVybiBwLmluQXJyYXkoYSxpKT4tMX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaT1bXSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGk9aj1jPWIsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sbG9jazpmdW5jdGlvbigpe3JldHVybiBqPWIsY3x8bC5kaXNhYmxlKCksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIWp9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9Ynx8W10sYj1bYSxiLnNsaWNlP2Iuc2xpY2UoKTpiXSxpJiYoIWR8fGopJiYoZT9qLnB1c2goYik6ayhiKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBsLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBsfSxwLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLHAuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIscC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIscC5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBwLkRlZmVycmVkKGZ1bmN0aW9uKGMpe3AuZWFjaChiLGZ1bmN0aW9uKGIsZCl7dmFyIGY9ZFswXSxnPWFbYl07ZVtkWzFdXShwLmlzRnVuY3Rpb24oZyk/ZnVuY3Rpb24oKXt2YXIgYT1nLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZwLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5kb25lKGMucmVzb2x2ZSkuZmFpbChjLnJlamVjdCkucHJvZ3Jlc3MoYy5ub3RpZnkpOmNbZisiV2l0aCJdKHRoaXM9PT1lP2M6dGhpcyxbYV0pfTpjW2ZdKX0pLGE9bnVsbH0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtyZXR1cm4gYSE9bnVsbD9wLmV4dGVuZChhLGQpOmR9fSxlPXt9O3JldHVybiBkLnBpcGU9ZC50aGVuLHAuZWFjaChiLGZ1bmN0aW9uKGEsZil7dmFyIGc9ZlsyXSxoPWZbM107ZFtmWzFdXT1nLmFkZCxoJiZnLmFkZChmdW5jdGlvbigpe2M9aH0sYlthXjFdWzJdLmRpc2FibGUsYlsyXVsyXS5sb2NrKSxlW2ZbMF1dPWcuZmlyZSxlW2ZbMF0rIldpdGgiXT1nLmZpcmVXaXRofSksZC5wcm9taXNlKGUpLGEmJmEuY2FsbChlLGUpLGV9LHdoZW46ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPWsuY2FsbChhcmd1bWVudHMpLGQ9Yy5sZW5ndGgsZT1kIT09MXx8YSYmcC5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/ZDowLGY9ZT09PTE/YTpwLkRlZmVycmVkKCksZz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe2JbYV09dGhpcyxjW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9rLmNhbGwoYXJndW1lbnRzKTpkLGM9PT1oP2Yubm90aWZ5V2l0aChiLGMpOi0tZXx8Zi5yZXNvbHZlV2l0aChiLGMpfX0saCxpLGo7aWYoZD4xKXtoPW5ldyBBcnJheShkKSxpPW5ldyBBcnJheShkKSxqPW5ldyBBcnJheShkKTtmb3IoO2I8ZDtiKyspY1tiXSYmcC5pc0Z1bmN0aW9uKGNbYl0ucHJvbWlzZSk/Y1tiXS5wcm9taXNlKCkuZG9uZShnKGIsaixjKSkuZmFpbChmLnJlamVjdCkucHJvZ3Jlc3MoZyhiLGksaCkpOi0tZX1yZXR1cm4gZXx8Zi5yZXNvbHZlV2l0aChqLGMpLGYucHJvbWlzZSgpfX0pLHAuc3VwcG9ydD1mdW5jdGlvbigpe3ZhciBiLGMsZCxmLGcsaCxpLGosayxsLG0sbj1lLmNyZWF0ZUVsZW1lbnQoImRpdiIpO24uc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0Iiksbi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsYz1uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksZD1uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sZC5zdHlsZS5jc3NUZXh0PSJ0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNSI7aWYoIWN8fCFjLmxlbmd0aClyZXR1cm57fTtmPWUuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksZz1mLmFwcGVuZENoaWxkKGUuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGg9bi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxiPXtsZWFkaW5nV2hpdGVzcGFjZTpuLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0zLHRib2R5OiFuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCxodG1sU2VyaWFsaXplOiEhbi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxzdHlsZTovdG9wLy50ZXN0KGQuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxocmVmTm9ybWFsaXplZDpkLmdldEF0dHJpYnV0ZSgiaHJlZiIpPT09Ii9hIixvcGFjaXR5Oi9eMC41Ly50ZXN0KGQuc3R5bGUub3BhY2l0eSksY3NzRmxvYXQ6ISFkLnN0eWxlLmNzc0Zsb2F0LGNoZWNrT246aC52YWx1ZT09PSJvbiIsb3B0U2VsZWN0ZWQ6Zy5zZWxlY3RlZCxnZXRTZXRBdHRyaWJ1dGU6bi5jbGFzc05hbWUhPT0idCIsZW5jdHlwZTohIWUuY3JlYXRlRWxlbWVudCgiZm9ybSIpLmVuY3R5cGUsaHRtbDVDbG9uZTplLmNyZWF0ZUVsZW1lbnQoIm5hdiIpLmNsb25lTm9kZSghMCkub3V0ZXJIVE1MIT09Ijw6bmF2PjwvOm5hdj4iLGJveE1vZGVsOmUuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0IixzdWJtaXRCdWJibGVzOiEwLGNoYW5nZUJ1YmJsZXM6ITAsZm9jdXNpbkJ1YmJsZXM6ITEsZGVsZXRlRXhwYW5kbzohMCxub0Nsb25lRXZlbnQ6ITAsaW5saW5lQmxvY2tOZWVkc0xheW91dDohMSxzaHJpbmtXcmFwQmxvY2tzOiExLHJlbGlhYmxlTWFyZ2luUmlnaHQ6ITAsYm94U2l6aW5nUmVsaWFibGU6ITAscGl4ZWxQb3NpdGlvbjohMX0saC5jaGVja2VkPSEwLGIubm9DbG9uZUNoZWNrZWQ9aC5jbG9uZU5vZGUoITApLmNoZWNrZWQsZi5kaXNhYmxlZD0hMCxiLm9wdERpc2FibGVkPSFnLmRpc2FibGVkO3RyeXtkZWxldGUgbi50ZXN0fWNhdGNoKG8pe2IuZGVsZXRlRXhwYW5kbz0hMX0hbi5hZGRFdmVudExpc3RlbmVyJiZuLmF0dGFjaEV2ZW50JiZuLmZpcmVFdmVudCYmKG4uYXR0YWNoRXZlbnQoIm9uY2xpY2siLG09ZnVuY3Rpb24oKXtiLm5vQ2xvbmVFdmVudD0hMX0pLG4uY2xvbmVOb2RlKCEwKS5maXJlRXZlbnQoIm9uY2xpY2siKSxuLmRldGFjaEV2ZW50KCJvbmNsaWNrIixtKSksaD1lLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksaC52YWx1ZT0idCIsaC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGIucmFkaW9WYWx1ZT1oLnZhbHVlPT09InQiLGguc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLGguc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLG4uYXBwZW5kQ2hpbGQoaCksaT1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxpLmFwcGVuZENoaWxkKG4ubGFzdENoaWxkKSxiLmNoZWNrQ2xvbmU9aS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYi5hcHBlbmRDaGVja2VkPWguY2hlY2tlZCxpLnJlbW92ZUNoaWxkKGgpLGkuYXBwZW5kQ2hpbGQobik7aWYobi5hdHRhY2hFdmVudClmb3IoayBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWo9Im9uIitrLGw9aiBpbiBuLGx8fChuLnNldEF0dHJpYnV0ZShqLCJyZXR1cm47IiksbD10eXBlb2YgbltqXT09ImZ1bmN0aW9uIiksYltrKyJCdWJibGVzIl09bDtyZXR1cm4gcChmdW5jdGlvbigpe3ZhciBjLGQsZixnLGg9InBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjsiLGk9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdO2lmKCFpKXJldHVybjtjPWUuY3JlYXRlRWxlbWVudCgiZGl2IiksYy5zdHlsZS5jc3NUZXh0PSJ2aXNpYmlsaXR5OmhpZGRlbjtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOnN0YXRpYzt0b3A6MDttYXJnaW4tdG9wOjFweCIsaS5pbnNlcnRCZWZvcmUoYyxpLmZpcnN0Q2hpbGQpLGQ9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSxjLmFwcGVuZENoaWxkKGQpLGQuaW5uZXJIVE1MPSI8dGFibGU+PHRyPjx0ZD48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+IixmPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIiksZlswXS5zdHlsZS5jc3NUZXh0PSJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lIixsPWZbMF0ub2Zmc2V0SGVpZ2h0PT09MCxmWzBdLnN0eWxlLmRpc3BsYXk9IiIsZlsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixiLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cz1sJiZmWzBdLm9mZnNldEhlaWdodD09PTAsZC5pbm5lckhUTUw9IiIsZC5zdHlsZS5jc3NUZXh0PSJib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzoxcHg7Ym9yZGVyOjFweDtkaXNwbGF5OmJsb2NrO3dpZHRoOjRweDttYXJnaW4tdG9wOjElO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxJTsiLGIuYm94U2l6aW5nPWQub2Zmc2V0V2lkdGg9PT00LGIuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQ9aS5vZmZzZXRUb3AhPT0xLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGIucGl4ZWxQb3NpdGlvbj0oYS5nZXRDb21wdXRlZFN0eWxlKGQsbnVsbCl8fHt9KS50b3AhPT0iMSUiLGIuYm94U2l6aW5nUmVsaWFibGU9KGEuZ2V0Q29tcHV0ZWRTdHlsZShkLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aD09PSI0cHgiLGc9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKSxnLnN0eWxlLmNzc1RleHQ9ZC5zdHlsZS5jc3NUZXh0PWgsZy5zdHlsZS5tYXJnaW5SaWdodD1nLnN0eWxlLndpZHRoPSIwIixkLnN0eWxlLndpZHRoPSIxcHgiLGQuYXBwZW5kQ2hpbGQoZyksYi5yZWxpYWJsZU1hcmdpblJpZ2h0PSFwYXJzZUZsb2F0KChhLmdldENvbXB1dGVkU3R5bGUoZyxudWxsKXx8e30pLm1hcmdpblJpZ2h0KSksdHlwZW9mIGQuc3R5bGUuem9vbSE9InVuZGVmaW5lZCImJihkLmlubmVySFRNTD0iIixkLnN0eWxlLmNzc1RleHQ9aCsid2lkdGg6MXB4O3BhZGRpbmc6MXB4O2Rpc3BsYXk6aW5saW5lO3pvb206MSIsYi5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWQub2Zmc2V0V2lkdGg9PT0zLGQuc3R5bGUuZGlzcGxheT0iYmxvY2siLGQuc3R5bGUub3ZlcmZsb3c9InZpc2libGUiLGQuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiIsZC5maXJzdENoaWxkLnN0eWxlLndpZHRoPSI1cHgiLGIuc2hyaW5rV3JhcEJsb2Nrcz1kLm9mZnNldFdpZHRoIT09MyxjLnN0eWxlLnpvb209MSksaS5yZW1vdmVDaGlsZChjKSxjPWQ9Zj1nPW51bGx9KSxpLnJlbW92ZUNoaWxkKG4pLGM9ZD1mPWc9aD1pPW49bnVsbCxifSgpO3ZhciBIPS8oPzpce1tcc1xTXSpcfXxcW1tcc1xTXSpcXSkkLyxJPS8oW0EtWl0pL2c7cC5leHRlbmQoe2NhY2hlOnt9LGRlbGV0ZWRJZHM6W10sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrKHAuZm4uanF1ZXJ5K01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vRGF0YTp7ZW1iZWQ6ITAsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDohMH0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP3AuY2FjaGVbYVtwLmV4cGFuZG9dXTphW3AuZXhwYW5kb10sISFhJiYhSyhhKX0sZGF0YTpmdW5jdGlvbihhLGMsZCxlKXtpZighcC5hY2NlcHREYXRhKGEpKXJldHVybjt2YXIgZixnLGg9cC5leHBhbmRvLGk9dHlwZW9mIGM9PSJzdHJpbmciLGo9YS5ub2RlVHlwZSxrPWo/cC5jYWNoZTphLGw9aj9hW2hdOmFbaF0mJmg7aWYoKCFsfHwha1tsXXx8IWUmJiFrW2xdLmRhdGEpJiZpJiZkPT09YilyZXR1cm47bHx8KGo/YVtoXT1sPXAuZGVsZXRlZElkcy5wb3AoKXx8cC5ndWlkKys6bD1oKSxrW2xdfHwoa1tsXT17fSxqfHwoa1tsXS50b0pTT049cC5ub29wKSk7aWYodHlwZW9mIGM9PSJvYmplY3QifHx0eXBlb2YgYz09ImZ1bmN0aW9uIillP2tbbF09cC5leHRlbmQoa1tsXSxjKTprW2xdLmRhdGE9cC5leHRlbmQoa1tsXS5kYXRhLGMpO3JldHVybiBmPWtbbF0sZXx8KGYuZGF0YXx8KGYuZGF0YT17fSksZj1mLmRhdGEpLGQhPT1iJiYoZltwLmNhbWVsQ2FzZShjKV09ZCksaT8oZz1mW2NdLGc9PW51bGwmJihnPWZbcC5jYW1lbENhc2UoYyldKSk6Zz1mLGd9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSxiLGMpe2lmKCFwLmFjY2VwdERhdGEoYSkpcmV0dXJuO3ZhciBkLGUsZixnPWEubm9kZVR5cGUsaD1nP3AuY2FjaGU6YSxpPWc/YVtwLmV4cGFuZG9dOnAuZXhwYW5kbztpZighaFtpXSlyZXR1cm47aWYoYil7ZD1jP2hbaV06aFtpXS5kYXRhO2lmKGQpe3AuaXNBcnJheShiKXx8KGIgaW4gZD9iPVtiXTooYj1wLmNhbWVsQ2FzZShiKSxiIGluIGQ/Yj1bYl06Yj1iLnNwbGl0KCIgIikpKTtmb3IoZT0wLGY9Yi5sZW5ndGg7ZTxmO2UrKylkZWxldGUgZFtiW2VdXTtpZighKGM/SzpwLmlzRW1wdHlPYmplY3QpKGQpKXJldHVybn19aWYoIWMpe2RlbGV0ZSBoW2ldLmRhdGE7aWYoIUsoaFtpXSkpcmV0dXJufWc/cC5jbGVhbkRhdGEoW2FdLCEwKTpwLnN1cHBvcnQuZGVsZXRlRXhwYW5kb3x8aCE9aC53aW5kb3c/ZGVsZXRlIGhbaV06aFtpXT1udWxsfSxfZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHAuZGF0YShhLGIsYywhMCl9LGFjY2VwdERhdGE6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZSYmcC5ub0RhdGFbYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtyZXR1cm4hYnx8YiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn19KSxwLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGMpe3ZhciBkLGUsZixnLGgsaT10aGlzWzBdLGo9MCxrPW51bGw7aWYoYT09PWIpe2lmKHRoaXMubGVuZ3RoKXtrPXAuZGF0YShpKTtpZihpLm5vZGVUeXBlPT09MSYmIXAuX2RhdGEoaSwicGFyc2VkQXR0cnMiKSl7Zj1pLmF0dHJpYnV0ZXM7Zm9yKGg9Zi5sZW5ndGg7ajxoO2orKylnPWZbal0ubmFtZSxnLmluZGV4T2YoImRhdGEtIil8fChnPXAuY2FtZWxDYXNlKGcuc3Vic3RyaW5nKDUpKSxKKGksZyxrW2ddKSk7cC5fZGF0YShpLCJwYXJzZWRBdHRycyIsITApfX1yZXR1cm4ga31yZXR1cm4gdHlwZW9mIGE9PSJvYmplY3QiP3RoaXMuZWFjaChmdW5jdGlvbigpe3AuZGF0YSh0aGlzLGEpfSk6KGQ9YS5zcGxpdCgiLiIsMiksZFsxXT1kWzFdPyIuIitkWzFdOiIiLGU9ZFsxXSsiISIscC5hY2Nlc3ModGhpcyxmdW5jdGlvbihjKXtpZihjPT09YilyZXR1cm4gaz10aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIitlLFtkWzBdXSksaz09PWImJmkmJihrPXAuZGF0YShpLGEpLGs9SihpLGEsaykpLGs9PT1iJiZkWzFdP3RoaXMuZGF0YShkWzBdKTprO2RbMV09Yyx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1wKHRoaXMpO2IudHJpZ2dlckhhbmRsZXIoInNldERhdGEiK2UsZCkscC5kYXRhKHRoaXMsYSxjKSxiLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitlLGQpfSl9LG51bGwsYyxhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMSkpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtwLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLHAuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoYSlyZXR1cm4gYj0oYnx8ImZ4IikrInF1ZXVlIixkPXAuX2RhdGEoYSxiKSxjJiYoIWR8fHAuaXNBcnJheShjKT9kPXAuX2RhdGEoYSxiLHAubWFrZUFycmF5KGMpKTpkLnB1c2goYykpLGR8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPXAucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9cC5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXtwLmRlcXVldWUoYSxiKX07ZT09PSJpbnByb2dyZXNzIiYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKGI9PT0iZngiJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gcC5fZGF0YShhLGMpfHxwLl9kYXRhKGEsYyx7ZW1wdHk6cC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7cC5yZW1vdmVEYXRhKGEsYisicXVldWUiLCEwKSxwLnJlbW92ZURhdGEoYSxjLCEwKX0pfSl9fSkscC5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9MjtyZXR1cm4gdHlwZW9mIGEhPSJzdHJpbmciJiYoYz1hLGE9ImZ4IixkLS0pLGFyZ3VtZW50cy5sZW5ndGg8ZD9wLnF1ZXVlKHRoaXNbMF0sYSk6Yz09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1wLnF1ZXVlKHRoaXMsYSxjKTtwLl9xdWV1ZUhvb2tzKHRoaXMsYSksYT09PSJmeCImJmJbMF0hPT0iaW5wcm9ncmVzcyImJnAuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3AuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlbGF5OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9cC5meD9wLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4Iix0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYyl7dmFyIGQsZT0xLGY9cC5EZWZlcnJlZCgpLGc9dGhpcyxoPXRoaXMubGVuZ3RoLGk9ZnVuY3Rpb24oKXstLWV8fGYucmVzb2x2ZVdpdGgoZyxbZ10pfTt0eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT1iKSxhPWF8fCJmeCI7d2hpbGUoaC0tKWQ9cC5fZGF0YShnW2hdLGErInF1ZXVlSG9va3MiKSxkJiZkLmVtcHR5JiYoZSsrLGQuZW1wdHkuYWRkKGkpKTtyZXR1cm4gaSgpLGYucHJvbWlzZShjKX19KTt2YXIgTCxNLE4sTz0vW1x0XHJcbl0vZyxQPS9cci9nLFE9L14oPzpidXR0b258aW5wdXQpJC9pLFI9L14oPzpidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksUz0vXmEoPzpyZWF8KSQvaSxUPS9eKD86YXV0b2ZvY3VzfGF1dG9wbGF5fGFzeW5jfGNoZWNrZWR8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWR8c2VsZWN0ZWQpJC9pLFU9cC5zdXBwb3J0LmdldFNldEF0dHJpYnV0ZTtwLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBwLmFjY2Vzcyh0aGlzLHAuYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7cC5yZW1vdmVBdHRyKHRoaXMsYSl9KX0scHJvcDpmdW5jdGlvbihhLGIpe3JldHVybiBwLmFjY2Vzcyh0aGlzLHAucHJvcCxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXtyZXR1cm4gYT1wLnByb3BGaXhbYV18fGEsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09YixkZWxldGUgdGhpc1thXX1jYXRjaChjKXt9fSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoO2lmKHAuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3AodGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmciKXtiPWEuc3BsaXQocyk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2U9dGhpc1tjXTtpZihlLm5vZGVUeXBlPT09MSlpZighZS5jbGFzc05hbWUmJmIubGVuZ3RoPT09MSllLmNsYXNzTmFtZT1hO2Vsc2V7Zj0iICIrZS5jbGFzc05hbWUrIiAiO2ZvcihnPTAsaD1iLmxlbmd0aDtnPGg7ZysrKWYuaW5kZXhPZigiICIrYltnXSsiICIpPDAmJihmKz1iW2ddKyIgIik7ZS5jbGFzc05hbWU9cC50cmltKGYpfX19cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3ZhciBjLGQsZSxmLGcsaCxpO2lmKHAuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3AodGhpcykucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmcifHxhPT09Yil7Yz0oYXx8IiIpLnNwbGl0KHMpO2ZvcihoPTAsaT10aGlzLmxlbmd0aDtoPGk7aCsrKXtlPXRoaXNbaF07aWYoZS5ub2RlVHlwZT09PTEmJmUuY2xhc3NOYW1lKXtkPSgiICIrZS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKE8sIiAiKTtmb3IoZj0wLGc9Yy5sZW5ndGg7ZjxnO2YrKyl3aGlsZShkLmluZGV4T2YoIiAiK2NbZl0rIiAiKT49MClkPWQucmVwbGFjZSgiICIrY1tmXSsiICIsIiAiKTtlLmNsYXNzTmFtZT1hP3AudHJpbShkKToiIn19fXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhLGQ9dHlwZW9mIGI9PSJib29sZWFuIjtyZXR1cm4gcC5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihjKXtwKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihjPT09InN0cmluZyIpe3ZhciBlLGY9MCxnPXAodGhpcyksaD1iLGk9YS5zcGxpdChzKTt3aGlsZShlPWlbZisrXSloPWQ/aDohZy5oYXNDbGFzcyhlKSxnW2g/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXShlKX1lbHNlIGlmKGM9PT0idW5kZWZpbmVkInx8Yz09PSJib29sZWFuIil0aGlzLmNsYXNzTmFtZSYmcC5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjpwLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiJ9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGI9IiAiK2ErIiAiLGM9MCxkPXRoaXMubGVuZ3RoO2Zvcig7YzxkO2MrKylpZih0aGlzW2NdLm5vZGVUeXBlPT09MSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoTywiICIpLmluZGV4T2YoYik+PTApcmV0dXJuITA7cmV0dXJuITF9LHZhbDpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZj10aGlzWzBdO2lmKCFhcmd1bWVudHMubGVuZ3RoKXtpZihmKXJldHVybiBjPXAudmFsSG9va3NbZi50eXBlXXx8cC52YWxIb29rc1tmLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGMmJiJnZXQiaW4gYyYmKGQ9Yy5nZXQoZiwidmFsdWUiKSkhPT1iP2Q6KGQ9Zi52YWx1ZSx0eXBlb2YgZD09InN0cmluZyI/ZC5yZXBsYWNlKFAsIiIpOmQ9PW51bGw/IiI6ZCk7cmV0dXJufXJldHVybiBlPXAuaXNGdW5jdGlvbihhKSx0aGlzLmVhY2goZnVuY3Rpb24oZCl7dmFyIGYsZz1wKHRoaXMpO2lmKHRoaXMubm9kZVR5cGUhPT0xKXJldHVybjtlP2Y9YS5jYWxsKHRoaXMsZCxnLnZhbCgpKTpmPWEsZj09bnVsbD9mPSIiOnR5cGVvZiBmPT0ibnVtYmVyIj9mKz0iIjpwLmlzQXJyYXkoZikmJihmPXAubWFwKGYsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6YSsiIn0pKSxjPXAudmFsSG9va3NbdGhpcy50eXBlXXx8cC52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKCFjfHwhKCJzZXQiaW4gYyl8fGMuc2V0KHRoaXMsZiwidmFsdWUiKT09PWIpdGhpcy52YWx1ZT1mfSl9fSkscC5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIWJ8fGIuc3BlY2lmaWVkP2EudmFsdWU6YS50ZXh0fX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZj1hLnNlbGVjdGVkSW5kZXgsZz1bXSxoPWEub3B0aW9ucyxpPWEudHlwZT09PSJzZWxlY3Qtb25lIjtpZihmPDApcmV0dXJuIG51bGw7Yz1pP2Y6MCxkPWk/ZisxOmgubGVuZ3RoO2Zvcig7YzxkO2MrKyl7ZT1oW2NdO2lmKGUuc2VsZWN0ZWQmJihwLnN1cHBvcnQub3B0RGlzYWJsZWQ/IWUuZGlzYWJsZWQ6ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PT1udWxsKSYmKCFlLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFwLm5vZGVOYW1lKGUucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2I9cChlKS52YWwoKTtpZihpKXJldHVybiBiO2cucHVzaChiKX19cmV0dXJuIGkmJiFnLmxlbmd0aCYmaC5sZW5ndGg/cChoW2ZdKS52YWwoKTpnfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1wLm1ha2VBcnJheShiKTtyZXR1cm4gcChhKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD1wLmluQXJyYXkocCh0aGlzKS52YWwoKSxjKT49MH0pLGMubGVuZ3RofHwoYS5zZWxlY3RlZEluZGV4PS0xKSxjfX19LGF0dHJGbjp7fSxhdHRyOmZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBmLGcsaCxpPWEubm9kZVR5cGU7aWYoIWF8fGk9PT0zfHxpPT09OHx8aT09PTIpcmV0dXJuO2lmKGUmJnAuaXNGdW5jdGlvbihwLmZuW2NdKSlyZXR1cm4gcChhKVtjXShkKTtpZih0eXBlb2YgYS5nZXRBdHRyaWJ1dGU9PSJ1bmRlZmluZWQiKXJldHVybiBwLnByb3AoYSxjLGQpO2g9aSE9PTF8fCFwLmlzWE1MRG9jKGEpLGgmJihjPWMudG9Mb3dlckNhc2UoKSxnPXAuYXR0ckhvb2tzW2NdfHwoVC50ZXN0KGMpP006TCkpO2lmKGQhPT1iKXtpZihkPT09bnVsbCl7cC5yZW1vdmVBdHRyKGEsYyk7cmV0dXJufXJldHVybiBnJiYic2V0ImluIGcmJmgmJihmPWcuc2V0KGEsZCxjKSkhPT1iP2Y6KGEuc2V0QXR0cmlidXRlKGMsZCsiIiksZCl9cmV0dXJuIGcmJiJnZXQiaW4gZyYmaCYmKGY9Zy5nZXQoYSxjKSkhPT1udWxsP2Y6KGY9YS5nZXRBdHRyaWJ1dGUoYyksZj09PW51bGw/YjpmKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9MDtpZihiJiZhLm5vZGVUeXBlPT09MSl7ZD1iLnNwbGl0KHMpO2Zvcig7ZzxkLmxlbmd0aDtnKyspZT1kW2ddLGUmJihjPXAucHJvcEZpeFtlXXx8ZSxmPVQudGVzdChlKSxmfHxwLmF0dHIoYSxlLCIiKSxhLnJlbW92ZUF0dHJpYnV0ZShVP2U6YyksZiYmYyBpbiBhJiYoYVtjXT0hMSkpfX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oYSxiKXtpZihRLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSlwLmVycm9yKCJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiKTtlbHNlIGlmKCFwLnN1cHBvcnQucmFkaW9WYWx1ZSYmYj09PSJyYWRpbyImJnAubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX0sdmFsdWU6e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBMJiZwLm5vZGVOYW1lKGEsImJ1dHRvbiIpP0wuZ2V0KGEsYik6YiBpbiBhP2EudmFsdWU6bnVsbH0sc2V0OmZ1bmN0aW9uKGEsYixjKXtpZihMJiZwLm5vZGVOYW1lKGEsImJ1dHRvbiIpKXJldHVybiBMLnNldChhLGIsYyk7YS52YWx1ZT1ifX19LHByb3BGaXg6e3RhYmluZGV4OiJ0YWJJbmRleCIscmVhZG9ubHk6InJlYWRPbmx5IiwiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIixtYXhsZW5ndGg6Im1heExlbmd0aCIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjZWxscGFkZGluZzoiY2VsbFBhZGRpbmciLHJvd3NwYW46InJvd1NwYW4iLGNvbHNwYW46ImNvbFNwYW4iLHVzZW1hcDoidXNlTWFwIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGNvbnRlbnRlZGl0YWJsZToiY29udGVudEVkaXRhYmxlIn0scHJvcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZixnLGg9YS5ub2RlVHlwZTtpZighYXx8aD09PTN8fGg9PT04fHxoPT09MilyZXR1cm47cmV0dXJuIGc9aCE9PTF8fCFwLmlzWE1MRG9jKGEpLGcmJihjPXAucHJvcEZpeFtjXXx8YyxmPXAucHJvcEhvb2tzW2NdKSxkIT09Yj9mJiYic2V0ImluIGYmJihlPWYuc2V0KGEsZCxjKSkhPT1iP2U6YVtjXT1kOmYmJiJnZXQiaW4gZiYmKGU9Zi5nZXQoYSxjKSkhPT1udWxsP2U6YVtjXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTtyZXR1cm4gYyYmYy5zcGVjaWZpZWQ/cGFyc2VJbnQoYy52YWx1ZSwxMCk6Ui50ZXN0KGEubm9kZU5hbWUpfHxTLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOmJ9fX19KSxNPXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlPXAucHJvcChhLGMpO3JldHVybiBlPT09ITB8fHR5cGVvZiBlIT0iYm9vbGVhbiImJihkPWEuZ2V0QXR0cmlidXRlTm9kZShjKSkmJmQubm9kZVZhbHVlIT09ITE/Yy50b0xvd2VyQ2FzZSgpOmJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGI9PT0hMT9wLnJlbW92ZUF0dHIoYSxjKTooZD1wLnByb3BGaXhbY118fGMsZCBpbiBhJiYoYVtkXT0hMCksYS5zZXRBdHRyaWJ1dGUoYyxjLnRvTG93ZXJDYXNlKCkpKSxjfX0sVXx8KE49e25hbWU6ITAsaWQ6ITAsY29vcmRzOiEwfSxMPXAudmFsSG9va3MuYnV0dG9uPXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZDtyZXR1cm4gZD1hLmdldEF0dHJpYnV0ZU5vZGUoYyksZCYmKE5bY10/ZC52YWx1ZSE9PSIiOmQuc3BlY2lmaWVkKT9kLnZhbHVlOmJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkfHwoZD1lLmNyZWF0ZUF0dHJpYnV0ZShjKSxhLnNldEF0dHJpYnV0ZU5vZGUoZCkpLGQudmFsdWU9YisiIn19LHAuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtwLmF0dHJIb29rc1tiXT1wLmV4dGVuZChwLmF0dHJIb29rc1tiXSx7c2V0OmZ1bmN0aW9uKGEsYyl7aWYoYz09PSIiKXJldHVybiBhLnNldEF0dHJpYnV0ZShiLCJhdXRvIiksY319KX0pLHAuYXR0ckhvb2tzLmNvbnRlbnRlZGl0YWJsZT17Z2V0OkwuZ2V0LHNldDpmdW5jdGlvbihhLGIsYyl7Yj09PSIiJiYoYj0iZmFsc2UiKSxMLnNldChhLGIsYyl9fSkscC5zdXBwb3J0LmhyZWZOb3JtYWxpemVkfHxwLmVhY2goWyJocmVmIiwic3JjIiwid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGMpe3AuYXR0ckhvb2tzW2NdPXAuZXh0ZW5kKHAuYXR0ckhvb2tzW2NdLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoYywyKTtyZXR1cm4gZD09PW51bGw/YjpkfX0pfSkscC5zdXBwb3J0LnN0eWxlfHwocC5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0LnRvTG93ZXJDYXNlKCl8fGJ9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9YisiIn19KSxwLnN1cHBvcnQub3B0U2VsZWN0ZWR8fChwLnByb3BIb29rcy5zZWxlY3RlZD1wLmV4dGVuZChwLnByb3BIb29rcy5zZWxlY3RlZCx7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmKGIuc2VsZWN0ZWRJbmRleCxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KSxudWxsfX0pKSxwLnN1cHBvcnQuZW5jdHlwZXx8KHAucHJvcEZpeC5lbmN0eXBlPSJlbmNvZGluZyIpLHAuc3VwcG9ydC5jaGVja09ufHxwLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtwLnZhbEhvb2tzW3RoaXNdPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPT09bnVsbD8ib24iOmEudmFsdWV9fX0pLHAuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe3AudmFsSG9va3NbdGhpc109cC5leHRlbmQocC52YWxIb29rc1t0aGlzXSx7c2V0OmZ1bmN0aW9uKGEsYil7aWYocC5pc0FycmF5KGIpKXJldHVybiBhLmNoZWNrZWQ9cC5pbkFycmF5KHAoYSkudmFsKCksYik+PTB9fSl9KTt2YXIgVj0vXig/OnRleHRhcmVhfGlucHV0fHNlbGVjdCkkL2ksVz0vXihbXlwuXSp8KSg/OlwuKC4rKXwpJC8sWD0vKD86Xnxccylob3ZlcihcLlxTK3wpXGIvLFk9L15rZXkvLFo9L14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLCQ9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLF89ZnVuY3Rpb24oYSl7cmV0dXJuIHAuZXZlbnQuc3BlY2lhbC5ob3Zlcj9hOmEucmVwbGFjZShYLCJtb3VzZWVudGVyJDEgbW91c2VsZWF2ZSQxIil9O3AuZXZlbnQ9e2FkZDpmdW5jdGlvbihhLGMsZCxlLGYpe3ZhciBnLGgsaSxqLGssbCxtLG4sbyxxLHI7aWYoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhY3x8IWR8fCEoZz1wLl9kYXRhKGEpKSlyZXR1cm47ZC5oYW5kbGVyJiYobz1kLGQ9by5oYW5kbGVyLGY9by5zZWxlY3RvciksZC5ndWlkfHwoZC5ndWlkPXAuZ3VpZCsrKSxpPWcuZXZlbnRzLGl8fChnLmV2ZW50cz1pPXt9KSxoPWcuaGFuZGxlLGh8fChnLmhhbmRsZT1oPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgcCE9InVuZGVmaW5lZCImJighYXx8cC5ldmVudC50cmlnZ2VyZWQhPT1hLnR5cGUpP3AuZXZlbnQuZGlzcGF0Y2guYXBwbHkoaC5lbGVtLGFyZ3VtZW50cyk6Yn0saC5lbGVtPWEpLGM9cC50cmltKF8oYykpLnNwbGl0KCIgIik7Zm9yKGo9MDtqPGMubGVuZ3RoO2orKyl7az1XLmV4ZWMoY1tqXSl8fFtdLGw9a1sxXSxtPShrWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCkscj1wLmV2ZW50LnNwZWNpYWxbbF18fHt9LGw9KGY/ci5kZWxlZ2F0ZVR5cGU6ci5iaW5kVHlwZSl8fGwscj1wLmV2ZW50LnNwZWNpYWxbbF18fHt9LG49cC5leHRlbmQoe3R5cGU6bCxvcmlnVHlwZTprWzFdLGRhdGE6ZSxoYW5kbGVyOmQsZ3VpZDpkLmd1aWQsc2VsZWN0b3I6ZixuZWVkc0NvbnRleHQ6ZiYmcC5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KGYpLG5hbWVzcGFjZTptLmpvaW4oIi4iKX0sbykscT1pW2xdO2lmKCFxKXtxPWlbbF09W10scS5kZWxlZ2F0ZUNvdW50PTA7aWYoIXIuc2V0dXB8fHIuc2V0dXAuY2FsbChhLGUsbSxoKT09PSExKWEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobCxoLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbCxoKX1yLmFkZCYmKHIuYWRkLmNhbGwoYSxuKSxuLmhhbmRsZXIuZ3VpZHx8KG4uaGFuZGxlci5ndWlkPWQuZ3VpZCkpLGY/cS5zcGxpY2UocS5kZWxlZ2F0ZUNvdW50KyssMCxuKTpxLnB1c2gobikscC5ldmVudC5nbG9iYWxbbF09ITB9YT1udWxsfSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbSxuLG8scSxyPXAuaGFzRGF0YShhKSYmcC5fZGF0YShhKTtpZighcnx8IShtPXIuZXZlbnRzKSlyZXR1cm47Yj1wLnRyaW0oXyhifHwiIikpLnNwbGl0KCIgIik7Zm9yKGY9MDtmPGIubGVuZ3RoO2YrKyl7Zz1XLmV4ZWMoYltmXSl8fFtdLGg9aT1nWzFdLGo9Z1syXTtpZighaCl7Zm9yKGggaW4gbSlwLmV2ZW50LnJlbW92ZShhLGgrYltmXSxjLGQsITApO2NvbnRpbnVlfW49cC5ldmVudC5zcGVjaWFsW2hdfHx7fSxoPShkP24uZGVsZWdhdGVUeXBlOm4uYmluZFR5cGUpfHxoLG89bVtoXXx8W10saz1vLmxlbmd0aCxqPWo/bmV3IFJlZ0V4cCgiKF58XFwuKSIrai5zcGxpdCgiLiIpLnNvcnQoKS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsO2ZvcihsPTA7bDxvLmxlbmd0aDtsKyspcT1vW2xdLChlfHxpPT09cS5vcmlnVHlwZSkmJighY3x8Yy5ndWlkPT09cS5ndWlkKSYmKCFqfHxqLnRlc3QocS5uYW1lc3BhY2UpKSYmKCFkfHxkPT09cS5zZWxlY3Rvcnx8ZD09PSIqKiImJnEuc2VsZWN0b3IpJiYoby5zcGxpY2UobC0tLDEpLHEuc2VsZWN0b3ImJm8uZGVsZWdhdGVDb3VudC0tLG4ucmVtb3ZlJiZuLnJlbW92ZS5jYWxsKGEscSkpO28ubGVuZ3RoPT09MCYmayE9PW8ubGVuZ3RoJiYoKCFuLnRlYXJkb3dufHxuLnRlYXJkb3duLmNhbGwoYSxqLHIuaGFuZGxlKT09PSExKSYmcC5yZW1vdmVFdmVudChhLGgsci5oYW5kbGUpLGRlbGV0ZSBtW2hdKX1wLmlzRW1wdHlPYmplY3QobSkmJihkZWxldGUgci5oYW5kbGUscC5yZW1vdmVEYXRhKGEsImV2ZW50cyIsITApKX0sY3VzdG9tRXZlbnQ6e2dldERhdGE6ITAsc2V0RGF0YTohMCxjaGFuZ2VEYXRhOiEwfSx0cmlnZ2VyOmZ1bmN0aW9uKGMsZCxmLGcpe2lmKCFmfHxmLm5vZGVUeXBlIT09MyYmZi5ub2RlVHlwZSE9PTgpe3ZhciBoLGksaixrLGwsbSxuLG8scSxyLHM9Yy50eXBlfHxjLHQ9W107aWYoJC50ZXN0KHMrcC5ldmVudC50cmlnZ2VyZWQpKXJldHVybjtzLmluZGV4T2YoIiEiKT49MCYmKHM9cy5zbGljZSgwLC0xKSxpPSEwKSxzLmluZGV4T2YoIi4iKT49MCYmKHQ9cy5zcGxpdCgiLiIpLHM9dC5zaGlmdCgpLHQuc29ydCgpKTtpZigoIWZ8fHAuZXZlbnQuY3VzdG9tRXZlbnRbc10pJiYhcC5ldmVudC5nbG9iYWxbc10pcmV0dXJuO2M9dHlwZW9mIGM9PSJvYmplY3QiP2NbcC5leHBhbmRvXT9jOm5ldyBwLkV2ZW50KHMsYyk6bmV3IHAuRXZlbnQocyksYy50eXBlPXMsYy5pc1RyaWdnZXI9ITAsYy5leGNsdXNpdmU9aSxjLm5hbWVzcGFjZT10LmpvaW4oIi4iKSxjLm5hbWVzcGFjZV9yZT1jLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIit0LmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsbT1zLmluZGV4T2YoIjoiKTwwPyJvbiIrczoiIjtpZighZil7aD1wLmNhY2hlO2ZvcihqIGluIGgpaFtqXS5ldmVudHMmJmhbal0uZXZlbnRzW3NdJiZwLmV2ZW50LnRyaWdnZXIoYyxkLGhbal0uaGFuZGxlLmVsZW0sITApO3JldHVybn1jLnJlc3VsdD1iLGMudGFyZ2V0fHwoYy50YXJnZXQ9ZiksZD1kIT1udWxsP3AubWFrZUFycmF5KGQpOltdLGQudW5zaGlmdChjKSxuPXAuZXZlbnQuc3BlY2lhbFtzXXx8e307aWYobi50cmlnZ2VyJiZuLnRyaWdnZXIuYXBwbHkoZixkKT09PSExKXJldHVybjtxPVtbZixuLmJpbmRUeXBlfHxzXV07aWYoIWcmJiFuLm5vQnViYmxlJiYhcC5pc1dpbmRvdyhmKSl7cj1uLmRlbGVnYXRlVHlwZXx8cyxrPSQudGVzdChyK3MpP2Y6Zi5wYXJlbnROb2RlO2ZvcihsPWY7aztrPWsucGFyZW50Tm9kZSlxLnB1c2goW2sscl0pLGw9aztsPT09KGYub3duZXJEb2N1bWVudHx8ZSkmJnEucHVzaChbbC5kZWZhdWx0Vmlld3x8bC5wYXJlbnRXaW5kb3d8fGEscl0pfWZvcihqPTA7ajxxLmxlbmd0aCYmIWMuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtqKyspaz1xW2pdWzBdLGMudHlwZT1xW2pdWzFdLG89KHAuX2RhdGEoaywiZXZlbnRzIil8fHt9KVtjLnR5cGVdJiZwLl9kYXRhKGssImhhbmRsZSIpLG8mJm8uYXBwbHkoayxkKSxvPW0mJmtbbV0sbyYmcC5hY2NlcHREYXRhKGspJiZvLmFwcGx5JiZvLmFwcGx5KGssZCk9PT0hMSYmYy5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBjLnR5cGU9cywhZyYmIWMuaXNEZWZhdWx0UHJldmVudGVkKCkmJighbi5fZGVmYXVsdHx8bi5fZGVmYXVsdC5hcHBseShmLm93bmVyRG9jdW1lbnQsZCk9PT0hMSkmJihzIT09ImNsaWNrInx8IXAubm9kZU5hbWUoZiwiYSIpKSYmcC5hY2NlcHREYXRhKGYpJiZtJiZmW3NdJiYocyE9PSJmb2N1cyImJnMhPT0iYmx1ciJ8fGMudGFyZ2V0Lm9mZnNldFdpZHRoIT09MCkmJiFwLmlzV2luZG93KGYpJiYobD1mW21dLGwmJihmW21dPW51bGwpLHAuZXZlbnQudHJpZ2dlcmVkPXMsZltzXSgpLHAuZXZlbnQudHJpZ2dlcmVkPWIsbCYmKGZbbV09bCkpLGMucmVzdWx0fXJldHVybn0sZGlzcGF0Y2g6ZnVuY3Rpb24oYyl7Yz1wLmV2ZW50LmZpeChjfHxhLmV2ZW50KTt2YXIgZCxlLGYsZyxoLGksaixsLG0sbixvPShwLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYy50eXBlXXx8W10scT1vLmRlbGVnYXRlQ291bnQscj1rLmNhbGwoYXJndW1lbnRzKSxzPSFjLmV4Y2x1c2l2ZSYmIWMubmFtZXNwYWNlLHQ9cC5ldmVudC5zcGVjaWFsW2MudHlwZV18fHt9LHU9W107clswXT1jLGMuZGVsZWdhdGVUYXJnZXQ9dGhpcztpZih0LnByZURpc3BhdGNoJiZ0LnByZURpc3BhdGNoLmNhbGwodGhpcyxjKT09PSExKXJldHVybjtpZihxJiYoIWMuYnV0dG9ufHxjLnR5cGUhPT0iY2xpY2siKSlmb3IoZj1jLnRhcmdldDtmIT10aGlzO2Y9Zi5wYXJlbnROb2RlfHx0aGlzKWlmKGYuZGlzYWJsZWQhPT0hMHx8Yy50eXBlIT09ImNsaWNrIil7aD17fSxqPVtdO2ZvcihkPTA7ZDxxO2QrKylsPW9bZF0sbT1sLnNlbGVjdG9yLGhbbV09PT1iJiYoaFttXT1sLm5lZWRzQ29udGV4dD9wKG0sdGhpcykuaW5kZXgoZik+PTA6cC5maW5kKG0sdGhpcyxudWxsLFtmXSkubGVuZ3RoKSxoW21dJiZqLnB1c2gobCk7ai5sZW5ndGgmJnUucHVzaCh7ZWxlbTpmLG1hdGNoZXM6an0pfW8ubGVuZ3RoPnEmJnUucHVzaCh7ZWxlbTp0aGlzLG1hdGNoZXM6by5zbGljZShxKX0pO2ZvcihkPTA7ZDx1Lmxlbmd0aCYmIWMuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtkKyspe2k9dVtkXSxjLmN1cnJlbnRUYXJnZXQ9aS5lbGVtO2ZvcihlPTA7ZTxpLm1hdGNoZXMubGVuZ3RoJiYhYy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpO2UrKyl7bD1pLm1hdGNoZXNbZV07aWYoc3x8IWMubmFtZXNwYWNlJiYhbC5uYW1lc3BhY2V8fGMubmFtZXNwYWNlX3JlJiZjLm5hbWVzcGFjZV9yZS50ZXN0KGwubmFtZXNwYWNlKSljLmRhdGE9bC5kYXRhLGMuaGFuZGxlT2JqPWwsZz0oKHAuZXZlbnQuc3BlY2lhbFtsLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8bC5oYW5kbGVyKS5hcHBseShpLmVsZW0sciksZyE9PWImJihjLnJlc3VsdD1nLGc9PT0hMSYmKGMucHJldmVudERlZmF1bHQoKSxjLnN0b3BQcm9wYWdhdGlvbigpKSl9fXJldHVybiB0LnBvc3REaXNwYXRjaCYmdC5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGMpLGMucmVzdWx0fSxwcm9wczoiYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50IGFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEud2hpY2g9PW51bGwmJihhLndoaWNoPWIuY2hhckNvZGUhPW51bGw/Yi5jaGFyQ29kZTpiLmtleUNvZGUpLGF9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGMpe3ZhciBkLGYsZyxoPWMuYnV0dG9uLGk9Yy5mcm9tRWxlbWVudDtyZXR1cm4gYS5wYWdlWD09bnVsbCYmYy5jbGllbnRYIT1udWxsJiYoZD1hLnRhcmdldC5vd25lckRvY3VtZW50fHxlLGY9ZC5kb2N1bWVudEVsZW1lbnQsZz1kLmJvZHksYS5wYWdlWD1jLmNsaWVudFgrKGYmJmYuc2Nyb2xsTGVmdHx8ZyYmZy5zY3JvbGxMZWZ0fHwwKS0oZiYmZi5jbGllbnRMZWZ0fHxnJiZnLmNsaWVudExlZnR8fDApLGEucGFnZVk9Yy5jbGllbnRZKyhmJiZmLnNjcm9sbFRvcHx8ZyYmZy5zY3JvbGxUb3B8fDApLShmJiZmLmNsaWVudFRvcHx8ZyYmZy5jbGllbnRUb3B8fDApKSwhYS5yZWxhdGVkVGFyZ2V0JiZpJiYoYS5yZWxhdGVkVGFyZ2V0PWk9PT1hLnRhcmdldD9jLnRvRWxlbWVudDppKSwhYS53aGljaCYmaCE9PWImJihhLndoaWNoPWgmMT8xOmgmMj8zOmgmND8yOjApLGF9fSxmaXg6ZnVuY3Rpb24oYSl7aWYoYVtwLmV4cGFuZG9dKXJldHVybiBhO3ZhciBiLGMsZD1hLGY9cC5ldmVudC5maXhIb29rc1thLnR5cGVdfHx7fSxnPWYucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoZi5wcm9wcyk6dGhpcy5wcm9wczthPXAuRXZlbnQoZCk7Zm9yKGI9Zy5sZW5ndGg7YjspYz1nWy0tYl0sYVtjXT1kW2NdO3JldHVybiBhLnRhcmdldHx8KGEudGFyZ2V0PWQuc3JjRWxlbWVudHx8ZSksYS50YXJnZXQubm9kZVR5cGU9PT0zJiYoYS50YXJnZXQ9YS50YXJnZXQucGFyZW50Tm9kZSksYS5tZXRhS2V5PSEhYS5tZXRhS2V5LGYuZmlsdGVyP2YuZmlsdGVyKGEsZCk6YX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOntkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOntkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihhLGIsYyl7cC5pc1dpbmRvdyh0aGlzKSYmKHRoaXMub25iZWZvcmV1bmxvYWQ9Yyl9LHRlYXJkb3duOmZ1bmN0aW9uKGEsYil7dGhpcy5vbmJlZm9yZXVubG9hZD09PWImJih0aGlzLm9uYmVmb3JldW5sb2FkPW51bGwpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXAuZXh0ZW5kKG5ldyBwLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7ZD9wLmV2ZW50LnRyaWdnZXIoZSxudWxsLGIpOnAuZXZlbnQuZGlzcGF0Y2guY2FsbChiLGUpLGUuaXNEZWZhdWx0UHJldmVudGVkKCkmJmMucHJldmVudERlZmF1bHQoKX19LHAuZXZlbnQuaGFuZGxlPXAuZXZlbnQuZGlzcGF0Y2gscC5yZW1vdmVFdmVudD1lLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT0idW5kZWZpbmVkIiYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0scC5FdmVudD1mdW5jdGlvbihhLGIpe2lmKHRoaXMgaW5zdGFuY2VvZiBwLkV2ZW50KWEmJmEudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWEsdGhpcy50eXBlPWEudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1hLmRlZmF1bHRQcmV2ZW50ZWR8fGEucmV0dXJuVmFsdWU9PT0hMXx8YS5nZXRQcmV2ZW50RGVmYXVsdCYmYS5nZXRQcmV2ZW50RGVmYXVsdCgpP2JiOmJhKTp0aGlzLnR5cGU9YSxiJiZwLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxwLm5vdygpLHRoaXNbcC5leHBhbmRvXT0hMDtlbHNlIHJldHVybiBuZXcgcC5FdmVudChhLGIpfSxwLkV2ZW50LnByb3RvdHlwZT17cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1iYjt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7aWYoIWEpcmV0dXJuO2EucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITF9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YmI7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKCFhKXJldHVybjthLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKSxhLmNhbmNlbEJ1YmJsZT0hMH0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1iYix0aGlzLnN0b3BQcm9wYWdhdGlvbigpfSxpc0RlZmF1bHRQcmV2ZW50ZWQ6YmEsaXNQcm9wYWdhdGlvblN0b3BwZWQ6YmEsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6YmF9LHAuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7cC5ldmVudC5zcGVjaWFsW2FdPXtkZWxlZ2F0ZVR5cGU6YixiaW5kVHlwZTpiLGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYyxkPXRoaXMsZT1hLnJlbGF0ZWRUYXJnZXQsZj1hLmhhbmRsZU9iaixnPWYuc2VsZWN0b3I7aWYoIWV8fGUhPT1kJiYhcC5jb250YWlucyhkLGUpKWEudHlwZT1mLm9yaWdUeXBlLGM9Zi5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9YjtyZXR1cm4gY319fSkscC5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXN8fChwLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe2lmKHAubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO3AuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGM9YS50YXJnZXQsZD1wLm5vZGVOYW1lKGMsImlucHV0Iil8fHAubm9kZU5hbWUoYywiYnV0dG9uIik/Yy5mb3JtOmI7ZCYmIXAuX2RhdGEoZCwiX3N1Ym1pdF9hdHRhY2hlZCIpJiYocC5ldmVudC5hZGQoZCwic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGU9ITB9KSxwLl9kYXRhKGQsIl9zdWJtaXRfYXR0YWNoZWQiLCEwKSl9KX0scG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGUmJihkZWxldGUgYS5fc3VibWl0X2J1YmJsZSx0aGlzLnBhcmVudE5vZGUmJiFhLmlzVHJpZ2dlciYmcC5ldmVudC5zaW11bGF0ZSgic3VibWl0Iix0aGlzLnBhcmVudE5vZGUsYSwhMCkpfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKHAubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO3AuZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSkscC5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fChwLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe2lmKFYudGVzdCh0aGlzLm5vZGVOYW1lKSl7aWYodGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIilwLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXthLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lPT09ImNoZWNrZWQiJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLHAuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmIWEuaXNUcmlnZ2VyJiYodGhpcy5fanVzdF9jaGFuZ2VkPSExKSxwLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSwhMCl9KTtyZXR1cm4hMX1wLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtWLnRlc3QoYi5ub2RlTmFtZSkmJiFwLl9kYXRhKGIsIl9jaGFuZ2VfYXR0YWNoZWQiKSYmKHAuZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJiFhLmlzU2ltdWxhdGVkJiYhYS5pc1RyaWdnZXImJnAuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEsITApfSkscC5fZGF0YShiLCJfY2hhbmdlX2F0dGFjaGVkIiwhMCkpfSl9LGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtpZih0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fGIudHlwZSE9PSJyYWRpbyImJmIudHlwZSE9PSJjaGVja2JveCIpcmV0dXJuIGEuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBwLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFWLnRlc3QodGhpcy5ub2RlTmFtZSl9fSkscC5zdXBwb3J0LmZvY3VzaW5CdWJibGVzfHxwLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7dmFyIGM9MCxkPWZ1bmN0aW9uKGEpe3AuZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxwLmV2ZW50LmZpeChhKSwhMCl9O3AuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXtjKys9PT0wJiZlLmFkZEV2ZW50TGlzdGVuZXIoYSxkLCEwKX0sdGVhcmRvd246ZnVuY3Rpb24oKXstLWM9PT0wJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxkLCEwKX19fSkscC5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGEsYyxkLGUsZil7dmFyIGcsaDtpZih0eXBlb2YgYT09Im9iamVjdCIpe3R5cGVvZiBjIT0ic3RyaW5nIiYmKGQ9ZHx8YyxjPWIpO2ZvcihoIGluIGEpdGhpcy5vbihoLGMsZCxhW2hdLGYpO3JldHVybiB0aGlzfWQ9PW51bGwmJmU9PW51bGw/KGU9YyxkPWM9Yik6ZT09bnVsbCYmKHR5cGVvZiBjPT0ic3RyaW5nIj8oZT1kLGQ9Yik6KGU9ZCxkPWMsYz1iKSk7aWYoZT09PSExKWU9YmE7ZWxzZSBpZighZSlyZXR1cm4gdGhpcztyZXR1cm4gZj09PTEmJihnPWUsZT1mdW5jdGlvbihhKXtyZXR1cm4gcCgpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1wLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe3AuZXZlbnQuYWRkKHRoaXMsYSxlLGQsYyl9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZjtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZT1hLmhhbmRsZU9iaixwKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihlLm5hbWVzcGFjZT9lLm9yaWdUeXBlKyIuIitlLm5hbWVzcGFjZTplLm9yaWdUeXBlLGUuc2VsZWN0b3IsZS5oYW5kbGVyKSx0aGlzO2lmKHR5cGVvZiBhPT0ib2JqZWN0Iil7Zm9yKGYgaW4gYSl0aGlzLm9mZihmLGMsYVtmXSk7cmV0dXJuIHRoaXN9aWYoYz09PSExfHx0eXBlb2YgYz09ImZ1bmN0aW9uIilkPWMsYz1iO3JldHVybiBkPT09ITEmJihkPWJhKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtwLmV2ZW50LnJlbW92ZSh0aGlzLGEsZCxjKX0pfSxiaW5kOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5vbihhLG51bGwsYixjKX0sdW5iaW5kOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub2ZmKGEsbnVsbCxiKX0sbGl2ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHAodGhpcy5jb250ZXh0KS5vbihhLHRoaXMuc2VsZWN0b3IsYixjKSx0aGlzfSxkaWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gcCh0aGlzLmNvbnRleHQpLm9mZihhLHRoaXMuc2VsZWN0b3J8fCIqKiIsYiksdGhpc30sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYixhLGMsZCl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MT90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYXx8IioqIixjKX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtwLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7aWYodGhpc1swXSlyZXR1cm4gcC5ldmVudC50cmlnZ2VyKGEsYix0aGlzWzBdLCEwKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cyxjPWEuZ3VpZHx8cC5ndWlkKyssZD0wLGU9ZnVuY3Rpb24oYyl7dmFyIGU9KHAuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkKXx8MCklZDtyZXR1cm4gcC5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQsZSsxKSxjLnByZXZlbnREZWZhdWx0KCksYltlXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fCExfTtlLmd1aWQ9Yzt3aGlsZShkPGIubGVuZ3RoKWJbZCsrXS5ndWlkPWM7cmV0dXJuIHRoaXMuY2xpY2soZSl9LGhvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfX0pLHAuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe3AuZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz09bnVsbCYmKGM9YSxhPW51bGwpLGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX0sWS50ZXN0KGIpJiYocC5ldmVudC5maXhIb29rc1tiXT1wLmV2ZW50LmtleUhvb2tzKSxaLnRlc3QoYikmJihwLmV2ZW50LmZpeEhvb2tzW2JdPXAuZXZlbnQubW91c2VIb29rcyl9KSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGJjKGEsYixjLGQpe2M9Y3x8W10sYj1ifHxyO3ZhciBlLGYsaSxqLGs9Yi5ub2RlVHlwZTtpZighYXx8dHlwZW9mIGEhPSJzdHJpbmciKXJldHVybiBjO2lmKGshPT0xJiZrIT09OSlyZXR1cm5bXTtpPWcoYik7aWYoIWkmJiFkKWlmKGU9UC5leGVjKGEpKWlmKGo9ZVsxXSl7aWYoaz09PTkpe2Y9Yi5nZXRFbGVtZW50QnlJZChqKTtpZighZnx8IWYucGFyZW50Tm9kZSlyZXR1cm4gYztpZihmLmlkPT09ailyZXR1cm4gYy5wdXNoKGYpLGN9ZWxzZSBpZihiLm93bmVyRG9jdW1lbnQmJihmPWIub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChqKSkmJmgoYixmKSYmZi5pZD09PWopcmV0dXJuIGMucHVzaChmKSxjfWVsc2V7aWYoZVsyXSlyZXR1cm4gdy5hcHBseShjLHguY2FsbChiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLDApKSxjO2lmKChqPWVbM10pJiZfJiZiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIHcuYXBwbHkoYyx4LmNhbGwoYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGopLDApKSxjfXJldHVybiBicChhLnJlcGxhY2UoTCwiJDEiKSxiLGMsZCxpKX1mdW5jdGlvbiBiZChhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBjPT09ImlucHV0IiYmYi50eXBlPT09YX19ZnVuY3Rpb24gYmUoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oYz09PSJpbnB1dCJ8fGM9PT0iYnV0dG9uIikmJmIudHlwZT09PWF9fWZ1bmN0aW9uIGJmKGEpe3JldHVybiB6KGZ1bmN0aW9uKGIpe3JldHVybiBiPStiLHooZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBiZyhhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7dmFyIGQ9YS5uZXh0U2libGluZzt3aGlsZShkKXtpZihkPT09YilyZXR1cm4tMTtkPWQubmV4dFNpYmxpbmd9cmV0dXJuIDF9ZnVuY3Rpb24gYmgoYSxiKXt2YXIgYyxkLGYsZyxoLGksaixrPUNbb11bYV07aWYoaylyZXR1cm4gYj8wOmsuc2xpY2UoMCk7aD1hLGk9W10saj1lLnByZUZpbHRlcjt3aGlsZShoKXtpZighY3x8KGQ9TS5leGVjKGgpKSlkJiYoaD1oLnNsaWNlKGRbMF0ubGVuZ3RoKSksaS5wdXNoKGY9W10pO2M9ITE7aWYoZD1OLmV4ZWMoaCkpZi5wdXNoKGM9bmV3IHEoZC5zaGlmdCgpKSksaD1oLnNsaWNlKGMubGVuZ3RoKSxjLnR5cGU9ZFswXS5yZXBsYWNlKEwsIiAiKTtmb3IoZyBpbiBlLmZpbHRlcikoZD1XW2ddLmV4ZWMoaCkpJiYoIWpbZ118fChkPWpbZ10oZCxyLCEwKSkpJiYoZi5wdXNoKGM9bmV3IHEoZC5zaGlmdCgpKSksaD1oLnNsaWNlKGMubGVuZ3RoKSxjLnR5cGU9ZyxjLm1hdGNoZXM9ZCk7aWYoIWMpYnJlYWt9cmV0dXJuIGI/aC5sZW5ndGg6aD9iYy5lcnJvcihhKTpDKGEsaSkuc2xpY2UoMCl9ZnVuY3Rpb24gYmkoYSxiLGQpe3ZhciBlPWIuZGlyLGY9ZCYmYi5kaXI9PT0icGFyZW50Tm9kZSIsZz11Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGQpe3doaWxlKGI9YltlXSlpZihmfHxiLm5vZGVUeXBlPT09MSlyZXR1cm4gYShiLGMsZCl9OmZ1bmN0aW9uKGIsZCxoKXtpZighaCl7dmFyIGksaj10KyIgIitnKyIgIixrPWorYzt3aGlsZShiPWJbZV0paWYoZnx8Yi5ub2RlVHlwZT09PTEpe2lmKChpPWJbb10pPT09aylyZXR1cm4gYi5zaXpzZXQ7aWYodHlwZW9mIGk9PSJzdHJpbmciJiZpLmluZGV4T2Yoaik9PT0wKXtpZihiLnNpenNldClyZXR1cm4gYn1lbHNle2Jbb109aztpZihhKGIsZCxoKSlyZXR1cm4gYi5zaXpzZXQ9ITAsYjtiLnNpenNldD0hMX19fWVsc2Ugd2hpbGUoYj1iW2VdKWlmKGZ8fGIubm9kZVR5cGU9PT0xKWlmKGEoYixkLGgpKXJldHVybiBifX1mdW5jdGlvbiBiaihhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiBiayhhLGIsYyxkLGUpe3ZhciBmLGc9W10saD0wLGk9YS5sZW5ndGgsaj1iIT1udWxsO2Zvcig7aDxpO2grKylpZihmPWFbaF0paWYoIWN8fGMoZixkLGUpKWcucHVzaChmKSxqJiZiLnB1c2goaCk7cmV0dXJuIGd9ZnVuY3Rpb24gYmwoYSxiLGMsZCxlLGYpe3JldHVybiBkJiYhZFtvXSYmKGQ9YmwoZCkpLGUmJiFlW29dJiYoZT1ibChlLGYpKSx6KGZ1bmN0aW9uKGYsZyxoLGkpe2lmKGYmJmUpcmV0dXJuO3ZhciBqLGssbCxtPVtdLG49W10sbz1nLmxlbmd0aCxwPWZ8fGJvKGJ8fCIqIixoLm5vZGVUeXBlP1toXTpoLFtdLGYpLHE9YSYmKGZ8fCFiKT9iayhwLG0sYSxoLGkpOnAscj1jP2V8fChmP2E6b3x8ZCk/W106ZzpxO2MmJmMocSxyLGgsaSk7aWYoZCl7bD1iayhyLG4pLGQobCxbXSxoLGkpLGo9bC5sZW5ndGg7d2hpbGUoai0tKWlmKGs9bFtqXSlyW25bal1dPSEocVtuW2pdXT1rKX1pZihmKXtqPWEmJnIubGVuZ3RoO3doaWxlKGotLSlpZihrPXJbal0pZlttW2pdXT0hKGdbbVtqXV09ayl9ZWxzZSByPWJrKHI9PT1nP3Iuc3BsaWNlKG8sci5sZW5ndGgpOnIpLGU/ZShudWxsLGcscixpKTp3LmFwcGx5KGcscil9KX1mdW5jdGlvbiBibShhKXt2YXIgYixjLGQsZj1hLmxlbmd0aCxnPWUucmVsYXRpdmVbYVswXS50eXBlXSxoPWd8fGUucmVsYXRpdmVbIiAiXSxpPWc/MTowLGo9YmkoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifSxoLCEwKSxrPWJpKGZ1bmN0aW9uKGEpe3JldHVybiB5LmNhbGwoYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3JldHVybiFnJiYoZHx8YyE9PWwpfHwoKGI9Yykubm9kZVR5cGU/aihhLGMsZCk6ayhhLGMsZCkpfV07Zm9yKDtpPGY7aSsrKWlmKGM9ZS5yZWxhdGl2ZVthW2ldLnR5cGVdKW09W2JpKGJqKG0pLGMpXTtlbHNle2M9ZS5maWx0ZXJbYVtpXS50eXBlXS5hcHBseShudWxsLGFbaV0ubWF0Y2hlcyk7aWYoY1tvXSl7ZD0rK2k7Zm9yKDtkPGY7ZCsrKWlmKGUucmVsYXRpdmVbYVtkXS50eXBlXSlicmVhaztyZXR1cm4gYmwoaT4xJiZiaihtKSxpPjEmJmEuc2xpY2UoMCxpLTEpLmpvaW4oIiIpLnJlcGxhY2UoTCwiJDEiKSxjLGk8ZCYmYm0oYS5zbGljZShpLGQpKSxkPGYmJmJtKGE9YS5zbGljZShkKSksZDxmJiZhLmpvaW4oIiIpKX1tLnB1c2goYyl9cmV0dXJuIGJqKG0pfWZ1bmN0aW9uIGJuKGEsYil7dmFyIGQ9Yi5sZW5ndGg+MCxmPWEubGVuZ3RoPjAsZz1mdW5jdGlvbihoLGksaixrLG0pe3ZhciBuLG8scCxxPVtdLHM9MCx1PSIwIix4PWgmJltdLHk9bSE9bnVsbCx6PWwsQT1ofHxmJiZlLmZpbmQuVEFHKCIqIixtJiZpLnBhcmVudE5vZGV8fGkpLEI9dCs9ej09bnVsbD8xOk1hdGguRTt5JiYobD1pIT09ciYmaSxjPWcuZWwpO2Zvcig7KG49QVt1XSkhPW51bGw7dSsrKXtpZihmJiZuKXtmb3Iobz0wO3A9YVtvXTtvKyspaWYocChuLGksaikpe2sucHVzaChuKTticmVha315JiYodD1CLGM9KytnLmVsKX1kJiYoKG49IXAmJm4pJiZzLS0saCYmeC5wdXNoKG4pKX1zKz11O2lmKGQmJnUhPT1zKXtmb3Iobz0wO3A9YltvXTtvKyspcCh4LHEsaSxqKTtpZihoKXtpZihzPjApd2hpbGUodS0tKSF4W3VdJiYhcVt1XSYmKHFbdV09di5jYWxsKGspKTtxPWJrKHEpfXcuYXBwbHkoayxxKSx5JiYhaCYmcS5sZW5ndGg+MCYmcytiLmxlbmd0aD4xJiZiYy51bmlxdWVTb3J0KGspfXJldHVybiB5JiYodD1CLGw9eikseH07cmV0dXJuIGcuZWw9MCxkP3ooZyk6Z31mdW5jdGlvbiBibyhhLGIsYyxkKXt2YXIgZT0wLGY9Yi5sZW5ndGg7Zm9yKDtlPGY7ZSsrKWJjKGEsYltlXSxjLGQpO3JldHVybiBjfWZ1bmN0aW9uIGJwKGEsYixjLGQsZil7dmFyIGcsaCxqLGssbCxtPWJoKGEpLG49bS5sZW5ndGg7aWYoIWQmJm0ubGVuZ3RoPT09MSl7aD1tWzBdPW1bMF0uc2xpY2UoMCk7aWYoaC5sZW5ndGg+MiYmKGo9aFswXSkudHlwZT09PSJJRCImJmIubm9kZVR5cGU9PT05JiYhZiYmZS5yZWxhdGl2ZVtoWzFdLnR5cGVdKXtiPWUuZmluZC5JRChqLm1hdGNoZXNbMF0ucmVwbGFjZShWLCIiKSxiLGYpWzBdO2lmKCFiKXJldHVybiBjO2E9YS5zbGljZShoLnNoaWZ0KCkubGVuZ3RoKX1mb3IoZz1XLlBPUy50ZXN0KGEpPy0xOmgubGVuZ3RoLTE7Zz49MDtnLS0pe2o9aFtnXTtpZihlLnJlbGF0aXZlW2s9ai50eXBlXSlicmVhaztpZihsPWUuZmluZFtrXSlpZihkPWwoai5tYXRjaGVzWzBdLnJlcGxhY2UoViwiIiksUi50ZXN0KGhbMF0udHlwZSkmJmIucGFyZW50Tm9kZXx8YixmKSl7aC5zcGxpY2UoZywxKSxhPWQubGVuZ3RoJiZoLmpvaW4oIiIpO2lmKCFhKXJldHVybiB3LmFwcGx5KGMseC5jYWxsKGQsMCkpLGM7YnJlYWt9fX1yZXR1cm4gaShhLG0pKGQsYixmLGMsUi50ZXN0KGEpKSxjfWZ1bmN0aW9uIGJxKCl7fXZhciBjLGQsZSxmLGcsaCxpLGosayxsLG09ITAsbj0idW5kZWZpbmVkIixvPSgic2l6Y2FjaGUiK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoIi4iLCIiKSxxPVN0cmluZyxyPWEuZG9jdW1lbnQscz1yLmRvY3VtZW50RWxlbWVudCx0PTAsdT0wLHY9W10ucG9wLHc9W10ucHVzaCx4PVtdLnNsaWNlLHk9W10uaW5kZXhPZnx8ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPXRoaXMubGVuZ3RoO2Zvcig7YjxjO2IrKylpZih0aGlzW2JdPT09YSlyZXR1cm4gYjtyZXR1cm4tMX0sej1mdW5jdGlvbihhLGIpe3JldHVybiBhW29dPWI9PW51bGx8fGIsYX0sQT1mdW5jdGlvbigpe3ZhciBhPXt9LGI9W107cmV0dXJuIHooZnVuY3Rpb24oYyxkKXtyZXR1cm4gYi5wdXNoKGMpPmUuY2FjaGVMZW5ndGgmJmRlbGV0ZSBhW2Iuc2hpZnQoKV0sYVtjXT1kfSxhKX0sQj1BKCksQz1BKCksRD1BKCksRT0iW1xceDIwXFx0XFxyXFxuXFxmXSIsRj0iKD86XFxcXC58Wy1cXHddfFteXFx4MDAtXFx4YTBdKSsiLEc9Ri5yZXBsYWNlKCJ3IiwidyMiKSxIPSIoWypeJHwhfl0/PSkiLEk9IlxcWyIrRSsiKigiK0YrIikiK0UrIiooPzoiK0grRSsiKig/OihbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDN8KCIrRysiKXwpfCkiK0UrIipcXF0iLEo9IjooIitGKyIpKD86XFwoKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcMnwoW14oKVtcXF1dKnwoPzooPzoiK0krIil8W146XXxcXFxcLikqfC4qKSlcXCl8KSIsSz0iOihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK0UrIiooKD86LVxcZCk/XFxkKikiK0UrIipcXCl8KSg/PVteLV18JCkiLEw9bmV3IFJlZ0V4cCgiXiIrRSsiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitFKyIrJCIsImciKSxNPW5ldyBSZWdFeHAoIl4iK0UrIiosIitFKyIqIiksTj1uZXcgUmVnRXhwKCJeIitFKyIqKFtcXHgyMFxcdFxcclxcblxcZj4rfl0pIitFKyIqIiksTz1uZXcgUmVnRXhwKEopLFA9L14oPzojKFtcd1wtXSspfChcdyspfFwuKFtcd1wtXSspKSQvLFE9L146bm90LyxSPS9bXHgyMFx0XHJcblxmXSpbK35dLyxTPS86bm90XCgkLyxUPS9oXGQvaSxVPS9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2ksVj0vXFwoPyFcXCkvZyxXPXtJRDpuZXcgUmVnRXhwKCJeIygiK0YrIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrRisiKSIpLE5BTUU6bmV3IFJlZ0V4cCgiXlxcW25hbWU9WydcIl0/KCIrRisiKVsnXCJdP1xcXSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrRi5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrSSksUFNFVURPOm5ldyBSZWdFeHAoIl4iK0opLFBPUzpuZXcgUmVnRXhwKEssImkiKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fG50aHxmaXJzdHxsYXN0KS1jaGlsZCg/OlxcKCIrRSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrRSsiKig/OihbKy1dfCkiK0UrIiooXFxkKyl8KSkiK0UrIipcXCl8KSIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrRSsiKls+K35dfCIrSywiaSIpfSxYPWZ1bmN0aW9uKGEpe3ZhciBiPXIuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiBhKGIpfWNhdGNoKGMpe3JldHVybiExfWZpbmFsbHl7Yj1udWxsfX0sWT1YKGZ1bmN0aW9uKGEpe3JldHVybiBhLmFwcGVuZENoaWxkKHIuY3JlYXRlQ29tbWVudCgiIikpLCFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksWj1YKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsYS5maXJzdENoaWxkJiZ0eXBlb2YgYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9PW4mJmEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIjIn0pLCQ9WChmdW5jdGlvbihhKXthLmlubmVySFRNTD0iPHNlbGVjdD48L3NlbGVjdD4iO3ZhciBiPXR5cGVvZiBhLmxhc3RDaGlsZC5nZXRBdHRyaWJ1dGUoIm11bHRpcGxlIik7cmV0dXJuIGIhPT0iYm9vbGVhbiImJmIhPT0ic3RyaW5nIn0pLF89WChmdW5jdGlvbihhKXtyZXR1cm4gYS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J2hpZGRlbiBlJz48L2Rpdj48ZGl2IGNsYXNzPSdoaWRkZW4nPjwvZGl2PiIsIWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZXx8IWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD8hMTooYS5sYXN0Q2hpbGQuY2xhc3NOYW1lPSJlIixhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg9PT0yKX0pLGJhPVgoZnVuY3Rpb24oYSl7YS5pZD1vKzAsYS5pbm5lckhUTUw9IjxhIG5hbWU9JyIrbysiJz48L2E+PGRpdiBuYW1lPSciK28rIic+PC9kaXY+IixzLmluc2VydEJlZm9yZShhLHMuZmlyc3RDaGlsZCk7dmFyIGI9ci5nZXRFbGVtZW50c0J5TmFtZSYmci5nZXRFbGVtZW50c0J5TmFtZShvKS5sZW5ndGg9PT0yK3IuZ2V0RWxlbWVudHNCeU5hbWUobyswKS5sZW5ndGg7cmV0dXJuIGQ9IXIuZ2V0RWxlbWVudEJ5SWQobykscy5yZW1vdmVDaGlsZChhKSxifSk7dHJ5e3guY2FsbChzLmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2goYmIpe3g9ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXTtmb3IoO2I9dGhpc1thXTthKyspYy5wdXNoKGIpO3JldHVybiBjfX1iYy5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGJjKGEsbnVsbCxudWxsLGIpfSxiYy5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYmMoYixudWxsLG51bGwsW2FdKS5sZW5ndGg+MH0sZj1iYy5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9IiIsZD0wLGU9YS5ub2RlVHlwZTtpZihlKXtpZihlPT09MXx8ZT09PTl8fGU9PT0xMSl7aWYodHlwZW9mIGEudGV4dENvbnRlbnQ9PSJzdHJpbmciKXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1mKGEpfWVsc2UgaWYoZT09PTN8fGU9PT00KXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIGZvcig7Yj1hW2RdO2QrKyljKz1mKGIpO3JldHVybiBjfSxnPWJjLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj9iLm5vZGVOYW1lIT09IkhUTUwiOiExfSxoPWJjLmNvbnRhaW5zPXMuY29udGFpbnM/ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLm5vZGVUeXBlPT09OT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISEoZCYmZC5ub2RlVHlwZT09PTEmJmMuY29udGFpbnMmJmMuY29udGFpbnMoZCkpfTpzLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGImJiEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpfTpmdW5jdGlvbihhLGIpe3doaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSxiYy5hdHRyPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1nKGEpO3JldHVybiBkfHwoYj1iLnRvTG93ZXJDYXNlKCkpLChjPWUuYXR0ckhhbmRsZVtiXSk/YyhhKTpkfHwkP2EuZ2V0QXR0cmlidXRlKGIpOihjPWEuZ2V0QXR0cmlidXRlTm9kZShiKSxjP3R5cGVvZiBhW2JdPT0iYm9vbGVhbiI/YVtiXT9iOm51bGw6Yy5zcGVjaWZpZWQ/Yy52YWx1ZTpudWxsOm51bGwpfSxlPWJjLnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOnosbWF0Y2g6VyxhdHRySGFuZGxlOlo/e306e2hyZWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJocmVmIiwyKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInR5cGUiKX19LGZpbmQ6e0lEOmQ/ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRCeUlkIT09biYmIWMpe3ZhciBkPWIuZ2V0RWxlbWVudEJ5SWQoYSk7cmV0dXJuIGQmJmQucGFyZW50Tm9kZT9bZF06W119fTpmdW5jdGlvbihhLGMsZCl7aWYodHlwZW9mIGMuZ2V0RWxlbWVudEJ5SWQhPT1uJiYhZCl7dmFyIGU9Yy5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gZT9lLmlkPT09YXx8dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSE9PW4mJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS52YWx1ZT09PWE/W2VdOmI6W119fSxUQUc6WT9mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09bilyZXR1cm4gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKGE9PT0iKiIpe3ZhciBkLGU9W10sZj0wO2Zvcig7ZD1jW2ZdO2YrKylkLm5vZGVUeXBlPT09MSYmZS5wdXNoKGQpO3JldHVybiBlfXJldHVybiBjfSxOQU1FOmJhJiZmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlOYW1lIT09bilyZXR1cm4gYi5nZXRFbGVtZW50c0J5TmFtZShuYW1lKX0sQ0xBU1M6XyYmZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPT1uJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpfX0scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS5yZXBsYWNlKFYsIiIpLGFbM109KGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKFYsIiIpLGFbMl09PT0ifj0iJiYoYVszXT0iICIrYVszXSsiICIpLGEuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS50b0xvd2VyQ2FzZSgpLGFbMV09PT0ibnRoIj8oYVsyXXx8YmMuZXJyb3IoYVswXSksYVszXT0rKGFbM10/YVs0XSsoYVs1XXx8MSk6MiooYVsyXT09PSJldmVuInx8YVsyXT09PSJvZGQiKSksYVs0XT0rKGFbNl0rYVs3XXx8YVsyXT09PSJvZGQiKSk6YVsyXSYmYmMuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM7aWYoVy5DSElMRC50ZXN0KGFbMF0pKXJldHVybiBudWxsO2lmKGFbM10pYVsyXT1hWzNdO2Vsc2UgaWYoYj1hWzRdKU8udGVzdChiKSYmKGM9YmgoYiwhMCkpJiYoYz1iLmluZGV4T2YoIikiLGIubGVuZ3RoLWMpLWIubGVuZ3RoKSYmKGI9Yi5zbGljZSgwLGMpLGFbMF09YVswXS5zbGljZSgwLGMpKSxhWzJdPWI7cmV0dXJuIGEuc2xpY2UoMCwzKX19LGZpbHRlcjp7SUQ6ZD9mdW5jdGlvbihhKXtyZXR1cm4gYT1hLnJlcGxhY2UoViwiIiksZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QXR0cmlidXRlKCJpZCIpPT09YX19OmZ1bmN0aW9uKGEpe3JldHVybiBhPWEucmVwbGFjZShWLCIiKSxmdW5jdGlvbihiKXt2YXIgYz10eXBlb2YgYi5nZXRBdHRyaWJ1dGVOb2RlIT09biYmYi5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBjJiZjLnZhbHVlPT09YX19LFRBRzpmdW5jdGlvbihhKXtyZXR1cm4gYT09PSIqIj9mdW5jdGlvbigpe3JldHVybiEwfTooYT1hLnJlcGxhY2UoViwiIikudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihiKXtyZXR1cm4gYi5ub2RlTmFtZSYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09YX0pfSxDTEFTUzpmdW5jdGlvbihhKXt2YXIgYj1CW29dW2FdO3JldHVybiBifHwoYj1CKGEsbmV3IFJlZ0V4cCgiKF58IitFKyIpIithKyIoIitFKyJ8JCkiKSkpLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoYS5jbGFzc05hbWV8fHR5cGVvZiBhLmdldEF0dHJpYnV0ZSE9PW4mJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9fSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCxlKXt2YXIgZj1iYy5hdHRyKGQsYSk7cmV0dXJuIGY9PW51bGw/Yj09PSIhPSI6Yj8oZis9IiIsYj09PSI9Ij9mPT09YzpiPT09IiE9Ij9mIT09YzpiPT09Il49Ij9jJiZmLmluZGV4T2YoYyk9PT0wOmI9PT0iKj0iP2MmJmYuaW5kZXhPZihjKT4tMTpiPT09IiQ9Ij9jJiZmLnN1YnN0cihmLmxlbmd0aC1jLmxlbmd0aCk9PT1jOmI9PT0ifj0iPygiICIrZisiICIpLmluZGV4T2YoYyk+LTE6Yj09PSJ8PSI/Zj09PWN8fGYuc3Vic3RyKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYT09PSJudGgiP2Z1bmN0aW9uKGEpe3ZhciBiLGUsZj1hLnBhcmVudE5vZGU7aWYoYz09PTEmJmQ9PT0wKXJldHVybiEwO2lmKGYpe2U9MDtmb3IoYj1mLmZpcnN0Q2hpbGQ7YjtiPWIubmV4dFNpYmxpbmcpaWYoYi5ub2RlVHlwZT09PTEpe2UrKztpZihhPT09YilicmVha319cmV0dXJuIGUtPWQsZT09PWN8fGUlYz09PTAmJmUvYz49MH06ZnVuY3Rpb24oYil7dmFyIGM9Yjtzd2l0Y2goYSl7Y2FzZSJvbmx5IjpjYXNlImZpcnN0Ijp3aGlsZShjPWMucHJldmlvdXNTaWJsaW5nKWlmKGMubm9kZVR5cGU9PT0xKXJldHVybiExO2lmKGE9PT0iZmlyc3QiKXJldHVybiEwO2M9YjtjYXNlImxhc3QiOndoaWxlKGM9Yy5uZXh0U2libGluZylpZihjLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtyZXR1cm4hMH19fSxQU0VVRE86ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPWUucHNldWRvc1thXXx8ZS5zZXRGaWx0ZXJzW2EudG9Mb3dlckNhc2UoKV18fGJjLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrYSk7cmV0dXJuIGRbb10/ZChiKTpkLmxlbmd0aD4xPyhjPVthLGEsIiIsYl0sZS5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/eihmdW5jdGlvbihhLGMpe3ZhciBlLGY9ZChhLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWU9eS5jYWxsKGEsZltnXSksYVtlXT0hKGNbZV09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZChhLDAsYyl9KTpkfX0scHNldWRvczp7bm90OnooZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxkPWkoYS5yZXBsYWNlKEwsIiQxIikpO3JldHVybiBkW29dP3ooZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsZz1kKGEsbnVsbCxlLFtdKSxoPWEubGVuZ3RoO3doaWxlKGgtLSlpZihmPWdbaF0pYVtoXT0hKGJbaF09Zil9KTpmdW5jdGlvbihhLGUsZil7cmV0dXJuIGJbMF09YSxkKGIsbnVsbCxmLGMpLCFjLnBvcCgpfX0pLGhhczp6KGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gYmMoYSxiKS5sZW5ndGg+MH19KSxjb250YWluczp6KGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4oYi50ZXh0Q29udGVudHx8Yi5pbm5lclRleHR8fGYoYikpLmluZGV4T2YoYSk+LTF9fSksZW5hYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYj09PSJpbnB1dCImJiEhYS5jaGVja2VkfHxiPT09Im9wdGlvbiImJiEhYS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsYS5zZWxlY3RlZD09PSEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIWUucHNldWRvcy5lbXB0eShhKX0sZW1wdHk6ZnVuY3Rpb24oYSl7dmFyIGI7YT1hLmZpcnN0Q2hpbGQ7d2hpbGUoYSl7aWYoYS5ub2RlTmFtZT4iQCJ8fChiPWEubm9kZVR5cGUpPT09M3x8Yj09PTQpcmV0dXJuITE7YT1hLm5leHRTaWJsaW5nfXJldHVybiEwfSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIFQudGVzdChhLm5vZGVOYW1lKX0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYixjO3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYoYj1hLnR5cGUpPT09InRleHQiJiYoKGM9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSk9PW51bGx8fGMudG9Mb3dlckNhc2UoKT09PWIpfSxyYWRpbzpiZCgicmFkaW8iKSxjaGVja2JveDpiZCgiY2hlY2tib3giKSxmaWxlOmJkKCJmaWxlIikscGFzc3dvcmQ6YmQoInBhc3N3b3JkIiksaW1hZ2U6YmQoImltYWdlIiksc3VibWl0OmJlKCJzdWJtaXQiKSxyZXNldDpiZSgicmVzZXQiKSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBiPT09ImlucHV0IiYmYS50eXBlPT09ImJ1dHRvbiJ8fGI9PT0iYnV0dG9uIn0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFUudGVzdChhLm5vZGVOYW1lKX0sZm9jdXM6ZnVuY3Rpb24oYSl7dmFyIGI9YS5vd25lckRvY3VtZW50O3JldHVybiBhPT09Yi5hY3RpdmVFbGVtZW50JiYoIWIuaGFzRm9jdXN8fGIuaGFzRm9jdXMoKSkmJighIWEudHlwZXx8ISFhLmhyZWYpfSxhY3RpdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1hLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudH0sZmlyc3Q6YmYoZnVuY3Rpb24oYSxiLGMpe3JldHVyblswXX0pLGxhc3Q6YmYoZnVuY3Rpb24oYSxiLGMpe3JldHVybltiLTFdfSksZXE6YmYoZnVuY3Rpb24oYSxiLGMpe3JldHVybltjPDA/YytiOmNdfSksZXZlbjpiZihmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA7ZDxiO2QrPTIpYS5wdXNoKGQpO3JldHVybiBhfSksb2RkOmJmKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MTtkPGI7ZCs9MilhLnB1c2goZCk7cmV0dXJuIGF9KSxsdDpiZihmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPWM8MD9jK2I6YzstLWQ+PTA7KWEucHVzaChkKTtyZXR1cm4gYX0pLGd0OmJmKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9YzwwP2MrYjpjOysrZDxiOylhLnB1c2goZCk7cmV0dXJuIGF9KX19LGo9cy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihhLGIpe3JldHVybiBhPT09Yj8oaz0hMCwwKTooIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb258fCFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb246YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0KT8tMToxfTpmdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBrPSEwLDA7aWYoYS5zb3VyY2VJbmRleCYmYi5zb3VyY2VJbmRleClyZXR1cm4gYS5zb3VyY2VJbmRleC1iLnNvdXJjZUluZGV4O3ZhciBjLGQsZT1bXSxmPVtdLGc9YS5wYXJlbnROb2RlLGg9Yi5wYXJlbnROb2RlLGk9ZztpZihnPT09aClyZXR1cm4gYmcoYSxiKTtpZighZylyZXR1cm4tMTtpZighaClyZXR1cm4gMTt3aGlsZShpKWUudW5zaGlmdChpKSxpPWkucGFyZW50Tm9kZTtpPWg7d2hpbGUoaSlmLnVuc2hpZnQoaSksaT1pLnBhcmVudE5vZGU7Yz1lLmxlbmd0aCxkPWYubGVuZ3RoO2Zvcih2YXIgaj0wO2o8YyYmajxkO2orKylpZihlW2pdIT09ZltqXSlyZXR1cm4gYmcoZVtqXSxmW2pdKTtyZXR1cm4gaj09PWM/YmcoYSxmW2pdLC0xKTpiZyhlW2pdLGIsMSl9LFswLDBdLnNvcnQoaiksbT0hayxiYy51bmlxdWVTb3J0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9MTtrPW0sYS5zb3J0KGopO2lmKGspZm9yKDtiPWFbY107YysrKWI9PT1hW2MtMV0mJmEuc3BsaWNlKGMtLSwxKTtyZXR1cm4gYX0sYmMuZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2EpfSxpPWJjLmNvbXBpbGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9W10sZj1EW29dW2FdO2lmKCFmKXtifHwoYj1iaChhKSksYz1iLmxlbmd0aDt3aGlsZShjLS0pZj1ibShiW2NdKSxmW29dP2QucHVzaChmKTplLnB1c2goZik7Zj1EKGEsYm4oZSxkKSl9cmV0dXJuIGZ9LHIucXVlcnlTZWxlY3RvckFsbCYmZnVuY3Rpb24oKXt2YXIgYSxiPWJwLGM9Lyd8XFwvZyxkPS9cPVtceDIwXHRcclxuXGZdKihbXiciXF1dKilbXHgyMFx0XHJcblxmXSpcXS9nLGU9WyI6Zm9jdXMiXSxmPVsiOmFjdGl2ZSIsIjpmb2N1cyJdLGg9cy5tYXRjaGVzU2VsZWN0b3J8fHMubW96TWF0Y2hlc1NlbGVjdG9yfHxzLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8cy5vTWF0Y2hlc1NlbGVjdG9yfHxzLm1zTWF0Y2hlc1NlbGVjdG9yO1goZnVuY3Rpb24oYSl7YS5pbm5lckhUTUw9IjxzZWxlY3Q+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8ZS5wdXNoKCJcXFsiK0UrIiooPzpjaGVja2VkfGRpc2FibGVkfGlzbWFwfG11bHRpcGxlfHJlYWRvbmx5fHNlbGVjdGVkfHZhbHVlKSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fGUucHVzaCgiOmNoZWNrZWQiKX0pLFgoZnVuY3Rpb24oYSl7YS5pbm5lckhUTUw9IjxwIHRlc3Q9Jyc+PC9wPiIsYS5xdWVyeVNlbGVjdG9yQWxsKCJbdGVzdF49JyddIikubGVuZ3RoJiZlLnB1c2goIlsqXiRdPSIrRSsiKig/OlwiXCJ8JycpIiksYS5pbm5lckhUTUw9IjxpbnB1dCB0eXBlPSdoaWRkZW4nLz4iLGEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fGUucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKX0pLGU9bmV3IFJlZ0V4cChlLmpvaW4oInwiKSksYnA9ZnVuY3Rpb24oYSxkLGYsZyxoKXtpZighZyYmIWgmJighZXx8IWUudGVzdChhKSkpe3ZhciBpLGosaz0hMCxsPW8sbT1kLG49ZC5ub2RlVHlwZT09PTkmJmE7aWYoZC5ub2RlVHlwZT09PTEmJmQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJvYmplY3QiKXtpPWJoKGEpLChrPWQuZ2V0QXR0cmlidXRlKCJpZCIpKT9sPWsucmVwbGFjZShjLCJcXCQmIik6ZC5zZXRBdHRyaWJ1dGUoImlkIixsKSxsPSJbaWQ9JyIrbCsiJ10gIixqPWkubGVuZ3RoO3doaWxlKGotLSlpW2pdPWwraVtqXS5qb2luKCIiKTttPVIudGVzdChhKSYmZC5wYXJlbnROb2RlfHxkLG49aS5qb2luKCIsIil9aWYobil0cnl7cmV0dXJuIHcuYXBwbHkoZix4LmNhbGwobS5xdWVyeVNlbGVjdG9yQWxsKG4pLDApKSxmfWNhdGNoKHApe31maW5hbGx5e2t8fGQucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX1yZXR1cm4gYihhLGQsZixnLGgpfSxoJiYoWChmdW5jdGlvbihiKXthPWguY2FsbChiLCJkaXYiKTt0cnl7aC5jYWxsKGIsIlt0ZXN0IT0nJ106c2l6emxlIiksZi5wdXNoKCIhPSIsSil9Y2F0Y2goYyl7fX0pLGY9bmV3IFJlZ0V4cChmLmpvaW4oInwiKSksYmMubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGIsYyl7Yz1jLnJlcGxhY2UoZCwiPSckMSddIik7aWYoIWcoYikmJiFmLnRlc3QoYykmJighZXx8IWUudGVzdChjKSkpdHJ5e3ZhciBpPWguY2FsbChiLGMpO2lmKGl8fGF8fGIuZG9jdW1lbnQmJmIuZG9jdW1lbnQubm9kZVR5cGUhPT0xMSlyZXR1cm4gaX1jYXRjaChqKXt9cmV0dXJuIGJjKGMsbnVsbCxudWxsLFtiXSkubGVuZ3RoPjB9KX0oKSxlLnBzZXVkb3MubnRoPWUucHNldWRvcy5lcSxlLmZpbHRlcnM9YnEucHJvdG90eXBlPWUucHNldWRvcyxlLnNldEZpbHRlcnM9bmV3IGJxLGJjLmF0dHI9cC5hdHRyLHAuZmluZD1iYyxwLmV4cHI9YmMuc2VsZWN0b3JzLHAuZXhwclsiOiJdPXAuZXhwci5wc2V1ZG9zLHAudW5pcXVlPWJjLnVuaXF1ZVNvcnQscC50ZXh0PWJjLmdldFRleHQscC5pc1hNTERvYz1iYy5pc1hNTCxwLmNvbnRhaW5zPWJjLmNvbnRhaW5zfShhKTt2YXIgYmM9L1VudGlsJC8sYmQ9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sYmU9L14uW146I1xbXC4sXSokLyxiZj1wLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LGJnPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O3AuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPXRoaXM7aWYodHlwZW9mIGEhPSJzdHJpbmciKXJldHVybiBwKGEpLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTAsYz1oLmxlbmd0aDtiPGM7YisrKWlmKHAuY29udGFpbnMoaFtiXSx0aGlzKSlyZXR1cm4hMH0pO2c9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpO2ZvcihiPTAsYz10aGlzLmxlbmd0aDtiPGM7YisrKXtkPWcubGVuZ3RoLHAuZmluZChhLHRoaXNbYl0sZyk7aWYoYj4wKWZvcihlPWQ7ZTxnLmxlbmd0aDtlKyspZm9yKGY9MDtmPGQ7ZisrKWlmKGdbZl09PT1nW2VdKXtnLnNwbGljZShlLS0sMSk7YnJlYWt9fXJldHVybiBnfSxoYXM6ZnVuY3Rpb24oYSl7dmFyIGIsYz1wKGEsdGhpcyksZD1jLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2I8ZDtiKyspaWYocC5jb250YWlucyh0aGlzLGNbYl0pKXJldHVybiEwfSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYmoodGhpcyxhLCExKSwibm90IixhKX0sZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhiaih0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/YmYudGVzdChhKT9wKGEsdGhpcy5jb250ZXh0KS5pbmRleCh0aGlzWzBdKT49MDpwLmZpbHRlcihhLHRoaXMpLmxlbmd0aD4wOnRoaXMuZmlsdGVyKGEpLmxlbmd0aD4wKX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MCxlPXRoaXMubGVuZ3RoLGY9W10sZz1iZi50ZXN0KGEpfHx0eXBlb2YgYSE9InN0cmluZyI/cChhLGJ8fHRoaXMuY29udGV4dCk6MDtmb3IoO2Q8ZTtkKyspe2M9dGhpc1tkXTt3aGlsZShjJiZjLm93bmVyRG9jdW1lbnQmJmMhPT1iJiZjLm5vZGVUeXBlIT09MTEpe2lmKGc/Zy5pbmRleChjKT4tMTpwLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGMsYSkpe2YucHVzaChjKTticmVha31jPWMucGFyZW50Tm9kZX19cmV0dXJuIGY9Zi5sZW5ndGg+MT9wLnVuaXF1ZShmKTpmLHRoaXMucHVzaFN0YWNrKGYsImNsb3Nlc3QiLGEpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT90eXBlb2YgYT09InN0cmluZyI/cC5pbkFycmF5KHRoaXNbMF0scChhKSk6cC5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYT09InN0cmluZyI/cChhLGIpOnAubWFrZUFycmF5KGEmJmEubm9kZVR5cGU/W2FdOmEpLGQ9cC5tZXJnZSh0aGlzLmdldCgpLGMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhiaChjWzBdKXx8YmgoZFswXSk/ZDpwLnVuaXF1ZShkKSl9LGFkZEJhY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkKGE9PW51bGw/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoYSkpfX0pLHAuZm4uYW5kU2VsZj1wLmZuLmFkZEJhY2sscC5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLm5vZGVUeXBlIT09MTE/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBwLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHAuZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBiaShhLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBiaShhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gcC5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gcC5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHAuZGlyKGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gcC5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIHAuc2libGluZygoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIHAuc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gcC5ub2RlTmFtZShhLCJpZnJhbWUiKT9hLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50OnAubWVyZ2UoW10sYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7cC5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPXAubWFwKHRoaXMsYixjKTtyZXR1cm4gYmMudGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1wLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFiZ1thXT9wLnVuaXF1ZShlKTplLHRoaXMubGVuZ3RoPjEmJmJkLnRlc3QoYSkmJihlPWUucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhlLGEsay5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSxwLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksYi5sZW5ndGg9PT0xP3AuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106cC5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1bXSxmPWFbY107d2hpbGUoZiYmZi5ub2RlVHlwZSE9PTkmJihkPT09Ynx8Zi5ub2RlVHlwZSE9PTF8fCFwKGYpLmlzKGQpKSlmLm5vZGVUeXBlPT09MSYmZS5wdXNoKGYpLGY9ZltjXTtyZXR1cm4gZX0sc2libGluZzpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO2Zvcig7YTthPWEubmV4dFNpYmxpbmcpYS5ub2RlVHlwZT09PTEmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9fSk7dmFyIGJsPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixibT0vIGpRdWVyeVxkKz0iKD86bnVsbHxcZCspIi9nLGJuPS9eXHMrLyxibz0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLGJwPS88KFtcdzpdKykvLGJxPS88dGJvZHkvaSxicj0vPHwmIz9cdys7Lyxicz0vPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLGJ0PS88KD86c2NyaXB0fG9iamVjdHxlbWJlZHxvcHRpb258c3R5bGUpL2ksYnU9bmV3IFJlZ0V4cCgiPCg/OiIrYmwrIilbXFxzLz5dIiwiaSIpLGJ2PS9eKD86Y2hlY2tib3h8cmFkaW8pJC8sYnc9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksYng9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSxieT0vXlxzKjwhKD86XFtDREFUQVxbfFwtXC0pfFtcXVwtXXsyfT5ccyokL2csYno9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0OlswLCIiLCIiXX0sYkE9YmsoZSksYkI9YkEuYXBwZW5kQ2hpbGQoZS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7Ynoub3B0Z3JvdXA9Ynoub3B0aW9uLGJ6LnRib2R5PWJ6LnRmb290PWJ6LmNvbGdyb3VwPWJ6LmNhcHRpb249YnoudGhlYWQsYnoudGg9YnoudGQscC5zdXBwb3J0Lmh0bWxTZXJpYWxpemV8fChiei5fZGVmYXVsdD1bMSwiWDxkaXY+IiwiPC9kaXY+Il0pLHAuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBwLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGEpe3JldHVybiBhPT09Yj9wLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHxlKS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sd3JhcEFsbDpmdW5jdGlvbihhKXtpZihwLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtwKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsYikpfSk7aWYodGhpc1swXSl7dmFyIGI9cChhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApO3RoaXNbMF0ucGFyZW50Tm9kZSYmYi5pbnNlcnRCZWZvcmUodGhpc1swXSksYi5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzO3doaWxlKGEuZmlyc3RDaGlsZCYmYS5maXJzdENoaWxkLm5vZGVUeXBlPT09MSlhPWEuZmlyc3RDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiBwLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3AodGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXAodGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9cC5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7cCh0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe3Aubm9kZU5hbWUodGhpcywiYm9keSIpfHxwKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGEpeyh0aGlzLm5vZGVUeXBlPT09MXx8dGhpcy5ub2RlVHlwZT09PTExKSYmdGhpcy5hcHBlbmRDaGlsZChhKX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGEpeyh0aGlzLm5vZGVUeXBlPT09MXx8dGhpcy5ub2RlVHlwZT09PTExKSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKCFiaCh0aGlzWzBdKSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9cC5jbGVhbihhcmd1bWVudHMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhwLm1lcmdlKGEsdGhpcyksImJlZm9yZSIsdGhpcy5zZWxlY3Rvcil9fSxhZnRlcjpmdW5jdGlvbigpe2lmKCFiaCh0aGlzWzBdKSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMubmV4dFNpYmxpbmcpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9cC5jbGVhbihhcmd1bWVudHMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhwLm1lcmdlKHRoaXMsYSksImFmdGVyIix0aGlzLnNlbGVjdG9yKX19LHJlbW92ZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9MDtmb3IoOyhjPXRoaXNbZF0pIT1udWxsO2QrKylpZighYXx8cC5maWx0ZXIoYSxbY10pLmxlbmd0aCkhYiYmYy5ub2RlVHlwZT09PTEmJihwLmNsZWFuRGF0YShjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLHAuY2xlYW5EYXRhKFtjXSkpLGMucGFyZW50Tm9kZSYmYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe3ZhciBhLGI9MDtmb3IoOyhhPXRoaXNbYl0pIT1udWxsO2IrKyl7YS5ub2RlVHlwZT09PTEmJnAuY2xlYW5EYXRhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7d2hpbGUoYS5maXJzdENoaWxkKWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1hPT1udWxsPyExOmEsYj1iPT1udWxsP2E6Yix0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBwLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBwLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGEpe3ZhciBjPXRoaXNbMF18fHt9LGQ9MCxlPXRoaXMubGVuZ3RoO2lmKGE9PT1iKXJldHVybiBjLm5vZGVUeXBlPT09MT9jLmlubmVySFRNTC5yZXBsYWNlKGJtLCIiKTpiO2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmIWJzLnRlc3QoYSkmJihwLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8IWJ1LnRlc3QoYSkpJiYocC5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlfHwhYm4udGVzdChhKSkmJiFielsoYnAuZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9YS5yZXBsYWNlKGJvLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPGU7ZCsrKWM9dGhpc1tkXXx8e30sYy5ub2RlVHlwZT09PTEmJihwLmNsZWFuRGF0YShjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLGMuaW5uZXJIVE1MPWEpO2M9MH1jYXRjaChmKXt9fWMmJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGJoKHRoaXNbMF0pP3RoaXMubGVuZ3RoP3RoaXMucHVzaFN0YWNrKHAocC5pc0Z1bmN0aW9uKGEpP2EoKTphKSwicmVwbGFjZVdpdGgiLGEpOnRoaXM6cC5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1wKHRoaXMpLGQ9Yy5odG1sKCk7Yy5yZXBsYWNlV2l0aChhLmNhbGwodGhpcyxiLGQpKX0pOih0eXBlb2YgYSE9InN0cmluZyImJihhPXAoYSkuZGV0YWNoKCkpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXRoaXMubmV4dFNpYmxpbmcsYz10aGlzLnBhcmVudE5vZGU7cCh0aGlzKS5yZW1vdmUoKSxiP3AoYikuYmVmb3JlKGEpOnAoYykuYXBwZW5kKGEpfSkpfSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVtb3ZlKGEsITApfSxkb21NYW5pcDpmdW5jdGlvbihhLGMsZCl7YT1bXS5jb25jYXQuYXBwbHkoW10sYSk7dmFyIGUsZixnLGgsaT0wLGo9YVswXSxrPVtdLGw9dGhpcy5sZW5ndGg7aWYoIXAuc3VwcG9ydC5jaGVja0Nsb25lJiZsPjEmJnR5cGVvZiBqPT0ic3RyaW5nIiYmYncudGVzdChqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7cCh0aGlzKS5kb21NYW5pcChhLGMsZCl9KTtpZihwLmlzRnVuY3Rpb24oaikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgZj1wKHRoaXMpO2FbMF09ai5jYWxsKHRoaXMsZSxjP2YuaHRtbCgpOmIpLGYuZG9tTWFuaXAoYSxjLGQpfSk7aWYodGhpc1swXSl7ZT1wLmJ1aWxkRnJhZ21lbnQoYSx0aGlzLGspLGc9ZS5mcmFnbWVudCxmPWcuZmlyc3RDaGlsZCxnLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmKGc9Zik7aWYoZil7Yz1jJiZwLm5vZGVOYW1lKGYsInRyIik7Zm9yKGg9ZS5jYWNoZWFibGV8fGwtMTtpPGw7aSsrKWQuY2FsbChjJiZwLm5vZGVOYW1lKHRoaXNbaV0sInRhYmxlIik/YkModGhpc1tpXSwidGJvZHkiKTp0aGlzW2ldLGk9PT1oP2c6cC5jbG9uZShnLCEwLCEwKSl9Zz1mPW51bGwsay5sZW5ndGgmJnAuZWFjaChrLGZ1bmN0aW9uKGEsYil7Yi5zcmM/cC5hamF4P3AuYWpheCh7dXJsOmIuc3JjLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsYXN5bmM6ITEsZ2xvYmFsOiExLCJ0aHJvd3MiOiEwfSk6cC5lcnJvcigibm8gYWpheCIpOnAuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UoYnksIiIpKSxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX0pfXJldHVybiB0aGlzfX0pLHAuYnVpbGRGcmFnbWVudD1mdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoLGk9YVswXTtyZXR1cm4gYz1jfHxlLGM9IWMubm9kZVR5cGUmJmNbMF18fGMsYz1jLm93bmVyRG9jdW1lbnR8fGMsYS5sZW5ndGg9PT0xJiZ0eXBlb2YgaT09InN0cmluZyImJmkubGVuZ3RoPDUxMiYmYz09PWUmJmkuY2hhckF0KDApPT09IjwiJiYhYnQudGVzdChpKSYmKHAuc3VwcG9ydC5jaGVja0Nsb25lfHwhYncudGVzdChpKSkmJihwLnN1cHBvcnQuaHRtbDVDbG9uZXx8IWJ1LnRlc3QoaSkpJiYoZz0hMCxmPXAuZnJhZ21lbnRzW2ldLGg9ZiE9PWIpLGZ8fChmPWMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHAuY2xlYW4oYSxjLGYsZCksZyYmKHAuZnJhZ21lbnRzW2ldPWgmJmYpKSx7ZnJhZ21lbnQ6ZixjYWNoZWFibGU6Z319LHAuZnJhZ21lbnRzPXt9LHAuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7cC5mblthXT1mdW5jdGlvbihjKXt2YXIgZCxlPTAsZj1bXSxnPXAoYyksaD1nLmxlbmd0aCxpPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2lmKChpPT1udWxsfHxpJiZpLm5vZGVUeXBlPT09MTEmJmkuY2hpbGROb2Rlcy5sZW5ndGg9PT0xKSYmaD09PTEpcmV0dXJuIGdbYl0odGhpc1swXSksdGhpcztmb3IoO2U8aDtlKyspZD0oZT4wP3RoaXMuY2xvbmUoITApOnRoaXMpLmdldCgpLHAoZ1tlXSlbYl0oZCksZj1mLmNvbmNhdChkKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZixhLGcuc2VsZWN0b3IpfX0pLHAuZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGc7cC5zdXBwb3J0Lmh0bWw1Q2xvbmV8fHAuaXNYTUxEb2MoYSl8fCFidS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zz1hLmNsb25lTm9kZSghMCk6KGJCLmlubmVySFRNTD1hLm91dGVySFRNTCxiQi5yZW1vdmVDaGlsZChnPWJCLmZpcnN0Q2hpbGQpKTtpZigoIXAuc3VwcG9ydC5ub0Nsb25lRXZlbnR8fCFwLnN1cHBvcnQubm9DbG9uZUNoZWNrZWQpJiYoYS5ub2RlVHlwZT09PTF8fGEubm9kZVR5cGU9PT0xMSkmJiFwLmlzWE1MRG9jKGEpKXtiRShhLGcpLGQ9YkYoYSksZT1iRihnKTtmb3IoZj0wO2RbZl07KytmKWVbZl0mJmJFKGRbZl0sZVtmXSl9aWYoYil7YkQoYSxnKTtpZihjKXtkPWJGKGEpLGU9YkYoZyk7Zm9yKGY9MDtkW2ZdOysrZiliRChkW2ZdLGVbZl0pfX1yZXR1cm4gZD1lPW51bGwsZ30sY2xlYW46ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGYsZyxoLGksaixrLGwsbSxuLG8scSxyLHM9Yj09PWUmJmJBLHQ9W107aWYoIWJ8fHR5cGVvZiBiLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQ9PSJ1bmRlZmluZWQiKWI9ZTtmb3IoZj0wOyhoPWFbZl0pIT1udWxsO2YrKyl7dHlwZW9mIGg9PSJudW1iZXIiJiYoaCs9IiIpO2lmKCFoKWNvbnRpbnVlO2lmKHR5cGVvZiBoPT0ic3RyaW5nIilpZighYnIudGVzdChoKSloPWIuY3JlYXRlVGV4dE5vZGUoaCk7ZWxzZXtzPXN8fGJrKGIpLGw9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKSxzLmFwcGVuZENoaWxkKGwpLGg9aC5yZXBsYWNlKGJvLCI8JDE+PC8kMj4iKSxpPShicC5leGVjKGgpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGo9YnpbaV18fGJ6Ll9kZWZhdWx0LGs9alswXSxsLmlubmVySFRNTD1qWzFdK2gralsyXTt3aGlsZShrLS0pbD1sLmxhc3RDaGlsZDtpZighcC5zdXBwb3J0LnRib2R5KXttPWJxLnRlc3QoaCksbj1pPT09InRhYmxlIiYmIW0/bC5maXJzdENoaWxkJiZsLmZpcnN0Q2hpbGQuY2hpbGROb2RlczpqWzFdPT09Ijx0YWJsZT4iJiYhbT9sLmNoaWxkTm9kZXM6W107Zm9yKGc9bi5sZW5ndGgtMTtnPj0wOy0tZylwLm5vZGVOYW1lKG5bZ10sInRib2R5IikmJiFuW2ddLmNoaWxkTm9kZXMubGVuZ3RoJiZuW2ddLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobltnXSl9IXAuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmYm4udGVzdChoKSYmbC5pbnNlcnRCZWZvcmUoYi5jcmVhdGVUZXh0Tm9kZShibi5leGVjKGgpWzBdKSxsLmZpcnN0Q2hpbGQpLGg9bC5jaGlsZE5vZGVzLGwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsKX1oLm5vZGVUeXBlP3QucHVzaChoKTpwLm1lcmdlKHQsaCl9bCYmKGg9bD1zPW51bGwpO2lmKCFwLnN1cHBvcnQuYXBwZW5kQ2hlY2tlZClmb3IoZj0wOyhoPXRbZl0pIT1udWxsO2YrKylwLm5vZGVOYW1lKGgsImlucHV0Iik/YkcoaCk6dHlwZW9mIGguZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiZwLmdyZXAoaC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxiRyk7aWYoYyl7cT1mdW5jdGlvbihhKXtpZighYS50eXBlfHxieC50ZXN0KGEudHlwZSkpcmV0dXJuIGQ/ZC5wdXNoKGEucGFyZW50Tm9kZT9hLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSk6YSk6Yy5hcHBlbmRDaGlsZChhKX07Zm9yKGY9MDsoaD10W2ZdKSE9bnVsbDtmKyspaWYoIXAubm9kZU5hbWUoaCwic2NyaXB0Iil8fCFxKGgpKWMuYXBwZW5kQ2hpbGQoaCksdHlwZW9mIGguZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiYocj1wLmdyZXAocC5tZXJnZShbXSxoLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSkscSksdC5zcGxpY2UuYXBwbHkodCxbZisxLDBdLmNvbmNhdChyKSksZis9ci5sZW5ndGgpfXJldHVybiB0fSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnPTAsaD1wLmV4cGFuZG8saT1wLmNhY2hlLGo9cC5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8saz1wLmV2ZW50LnNwZWNpYWw7Zm9yKDsoZT1hW2ddKSE9bnVsbDtnKyspaWYoYnx8cC5hY2NlcHREYXRhKGUpKXtkPWVbaF0sYz1kJiZpW2RdO2lmKGMpe2lmKGMuZXZlbnRzKWZvcihmIGluIGMuZXZlbnRzKWtbZl0/cC5ldmVudC5yZW1vdmUoZSxmKTpwLnJlbW92ZUV2ZW50KGUsZixjLmhhbmRsZSk7aVtkXSYmKGRlbGV0ZSBpW2RdLGo/ZGVsZXRlIGVbaF06ZS5yZW1vdmVBdHRyaWJ1dGU/ZS5yZW1vdmVBdHRyaWJ1dGUoaCk6ZVtoXT1udWxsLHAuZGVsZXRlZElkcy5wdXNoKGQpKX19fX0pLGZ1bmN0aW9uKCl7dmFyIGEsYjtwLnVhTWF0Y2g9ZnVuY3Rpb24oYSl7YT1hLnRvTG93ZXJDYXNlKCk7dmFyIGI9LyhjaHJvbWUpWyBcL10oW1x3Ll0rKS8uZXhlYyhhKXx8Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8uZXhlYyhhKXx8LyhvcGVyYSkoPzouKnZlcnNpb258KVsgXC9dKFtcdy5dKykvLmV4ZWMoYSl8fC8obXNpZSkgKFtcdy5dKykvLmV4ZWMoYSl8fGEuaW5kZXhPZigiY29tcGF0aWJsZSIpPDAmJi8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKyl8KS8uZXhlYyhhKXx8W107cmV0dXJue2Jyb3dzZXI6YlsxXXx8IiIsdmVyc2lvbjpiWzJdfHwiMCJ9fSxhPXAudWFNYXRjaChnLnVzZXJBZ2VudCksYj17fSxhLmJyb3dzZXImJihiW2EuYnJvd3Nlcl09ITAsYi52ZXJzaW9uPWEudmVyc2lvbiksYi5jaHJvbWU/Yi53ZWJraXQ9ITA6Yi53ZWJraXQmJihiLnNhZmFyaT0hMCkscC5icm93c2VyPWIscC5zdWI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIsYyl7cmV0dXJuIG5ldyBhLmZuLmluaXQoYixjKX1wLmV4dGVuZCghMCxhLHRoaXMpLGEuc3VwZXJjbGFzcz10aGlzLGEuZm49YS5wcm90b3R5cGU9dGhpcygpLGEuZm4uY29uc3RydWN0b3I9YSxhLnN1Yj10aGlzLnN1YixhLmZuLmluaXQ9ZnVuY3Rpb24gYyhjLGQpe3JldHVybiBkJiZkIGluc3RhbmNlb2YgcCYmIShkIGluc3RhbmNlb2YgYSkmJihkPWEoZCkpLHAuZm4uaW5pdC5jYWxsKHRoaXMsYyxkLGIpfSxhLmZuLmluaXQucHJvdG90eXBlPWEuZm47dmFyIGI9YShlKTtyZXR1cm4gYX19KCk7dmFyIGJILGJJLGJKLGJLPS9hbHBoYVwoW14pXSpcKS9pLGJMPS9vcGFjaXR5PShbXildKikvLGJNPS9eKHRvcHxyaWdodHxib3R0b218bGVmdCkkLyxiTj0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sYk89L15tYXJnaW4vLGJQPW5ldyBSZWdFeHAoIl4oIitxKyIpKC4qKSQiLCJpIiksYlE9bmV3IFJlZ0V4cCgiXigiK3ErIikoPyFweClbYS16JV0rJCIsImkiKSxiUj1uZXcgUmVnRXhwKCJeKFstK10pPSgiK3ErIikiLCJpIiksYlM9e30sYlQ9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJVPXtsZXR0ZXJTcGFjaW5nOjAsZm9udFdlaWdodDo0MDB9LGJWPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sYlc9WyJXZWJraXQiLCJPIiwiTW96IiwibXMiXSxiWD1wLmZuLnRvZ2dsZTtwLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHAuYWNjZXNzKHRoaXMsZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkIT09Yj9wLnN0eWxlKGEsYyxkKTpwLmNzcyhhLGMpfSxhLGMsYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBiJCh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBiJCh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE9PSJib29sZWFuIjtyZXR1cm4gcC5pc0Z1bmN0aW9uKGEpJiZwLmlzRnVuY3Rpb24oYik/YlguYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuZWFjaChmdW5jdGlvbigpeyhjP2E6YloodGhpcykpP3AodGhpcykuc2hvdygpOnAodGhpcykuaGlkZSgpfSl9fSkscC5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1iSChhLCJvcGFjaXR5Iik7cmV0dXJuIGM9PT0iIj8iMSI6Y319fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6cC5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGMsZCxlKXtpZighYXx8YS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhYS5zdHlsZSlyZXR1cm47dmFyIGYsZyxoLGk9cC5jYW1lbENhc2UoYyksaj1hLnN0eWxlO2M9cC5jc3NQcm9wc1tpXXx8KHAuY3NzUHJvcHNbaV09YlkoaixpKSksaD1wLmNzc0hvb2tzW2NdfHxwLmNzc0hvb2tzW2ldO2lmKGQ9PT1iKXJldHVybiBoJiYiZ2V0ImluIGgmJihmPWguZ2V0KGEsITEsZSkpIT09Yj9mOmpbY107Zz10eXBlb2YgZCxnPT09InN0cmluZyImJihmPWJSLmV4ZWMoZCkpJiYoZD0oZlsxXSsxKSpmWzJdK3BhcnNlRmxvYXQocC5jc3MoYSxjKSksZz0ibnVtYmVyIik7aWYoZD09bnVsbHx8Zz09PSJudW1iZXIiJiZpc05hTihkKSlyZXR1cm47Zz09PSJudW1iZXIiJiYhcC5jc3NOdW1iZXJbaV0mJihkKz0icHgiKTtpZighaHx8ISgic2V0ImluIGgpfHwoZD1oLnNldChhLGQsZSkpIT09Yil0cnl7altjXT1kfWNhdGNoKGspe319LGNzczpmdW5jdGlvbihhLGMsZCxlKXt2YXIgZixnLGgsaT1wLmNhbWVsQ2FzZShjKTtyZXR1cm4gYz1wLmNzc1Byb3BzW2ldfHwocC5jc3NQcm9wc1tpXT1iWShhLnN0eWxlLGkpKSxoPXAuY3NzSG9va3NbY118fHAuY3NzSG9va3NbaV0saCYmImdldCJpbiBoJiYoZj1oLmdldChhLCEwLGUpKSxmPT09YiYmKGY9YkgoYSxjKSksZj09PSJub3JtYWwiJiZjIGluIGJVJiYoZj1iVVtjXSksZHx8ZSE9PWI/KGc9cGFyc2VGbG9hdChmKSxkfHxwLmlzTnVtZXJpYyhnKT9nfHwwOmYpOmZ9LHN3YXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj17fTtmb3IoZSBpbiBiKWZbZV09YS5zdHlsZVtlXSxhLnN0eWxlW2VdPWJbZV07ZD1jLmNhbGwoYSk7Zm9yKGUgaW4gYilhLnN0eWxlW2VdPWZbZV07cmV0dXJuIGR9fSksYS5nZXRDb21wdXRlZFN0eWxlP2JIPWZ1bmN0aW9uKGIsYyl7dmFyIGQsZSxmLGcsaD1hLmdldENvbXB1dGVkU3R5bGUoYixudWxsKSxpPWIuc3R5bGU7cmV0dXJuIGgmJihkPWhbY10sZD09PSIiJiYhcC5jb250YWlucyhiLm93bmVyRG9jdW1lbnQsYikmJihkPXAuc3R5bGUoYixjKSksYlEudGVzdChkKSYmYk8udGVzdChjKSYmKGU9aS53aWR0aCxmPWkubWluV2lkdGgsZz1pLm1heFdpZHRoLGkubWluV2lkdGg9aS5tYXhXaWR0aD1pLndpZHRoPWQsZD1oLndpZHRoLGkud2lkdGg9ZSxpLm1pbldpZHRoPWYsaS5tYXhXaWR0aD1nKSksZH06ZS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoYkg9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9YS5jdXJyZW50U3R5bGUmJmEuY3VycmVudFN0eWxlW2JdLGY9YS5zdHlsZTtyZXR1cm4gZT09bnVsbCYmZiYmZltiXSYmKGU9ZltiXSksYlEudGVzdChlKSYmIWJNLnRlc3QoYikmJihjPWYubGVmdCxkPWEucnVudGltZVN0eWxlJiZhLnJ1bnRpbWVTdHlsZS5sZWZ0LGQmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGYubGVmdD1iPT09ImZvbnRTaXplIj8iMWVtIjplLGU9Zi5waXhlbExlZnQrInB4IixmLmxlZnQ9YyxkJiYoYS5ydW50aW1lU3R5bGUubGVmdD1kKSksZT09PSIiPyJhdXRvIjplfSkscC5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe3AuY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7aWYoYylyZXR1cm4gYS5vZmZzZXRXaWR0aD09PTAmJmJOLnRlc3QoYkgoYSwiZGlzcGxheSIpKT9wLnN3YXAoYSxiVCxmdW5jdGlvbigpe3JldHVybiBjYihhLGIsZCl9KTpjYihhLGIsZCl9LHNldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGJfKGEsYyxkP2NhKGEsYixkLHAuc3VwcG9ydC5ib3hTaXppbmcmJnAuY3NzKGEsImJveFNpemluZyIpPT09ImJvcmRlci1ib3giKTowKX19fSkscC5zdXBwb3J0Lm9wYWNpdHl8fChwLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBiTC50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/LjAxKnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlLGU9cC5pc051bWVyaWMoYik/ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSI6IiIsZj1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2Muem9vbT0xO2lmKGI+PTEmJnAudHJpbShmLnJlcGxhY2UoYkssIiIpKT09PSIiJiZjLnJlbW92ZUF0dHJpYnV0ZSl7Yy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpO2lmKGQmJiFkLmZpbHRlcilyZXR1cm59Yy5maWx0ZXI9YksudGVzdChmKT9mLnJlcGxhY2UoYkssZSk6ZisiICIrZX19KSxwKGZ1bmN0aW9uKCl7cC5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHR8fChwLmNzc0hvb2tzLm1hcmdpblJpZ2h0PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gcC5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LGZ1bmN0aW9uKCl7aWYoYilyZXR1cm4gYkgoYSwibWFyZ2luUmlnaHQiKX0pfX0pLCFwLnN1cHBvcnQucGl4ZWxQb3NpdGlvbiYmcC5mbi5wb3NpdGlvbiYmcC5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7cC5jc3NIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEsYyl7aWYoYyl7dmFyIGQ9YkgoYSxiKTtyZXR1cm4gYlEudGVzdChkKT9wKGEpLnBvc2l0aW9uKClbYl0rInB4IjpkfX19fSl9KSxwLmV4cHImJnAuZXhwci5maWx0ZXJzJiYocC5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGEpe3JldHVybiBhLm9mZnNldFdpZHRoPT09MCYmYS5vZmZzZXRIZWlnaHQ9PT0wfHwhcC5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmKGEuc3R5bGUmJmEuc3R5bGUuZGlzcGxheXx8YkgoYSwiZGlzcGxheSIpKT09PSJub25lIn0scC5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hcC5leHByLmZpbHRlcnMuaGlkZGVuKGEpfSkscC5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxiKXtwLmNzc0hvb2tzW2ErYl09e2V4cGFuZDpmdW5jdGlvbihjKXt2YXIgZCxlPXR5cGVvZiBjPT0ic3RyaW5nIj9jLnNwbGl0KCIgIik6W2NdLGY9e307Zm9yKGQ9MDtkPDQ7ZCsrKWZbYStiVltkXStiXT1lW2RdfHxlW2QtMl18fGVbMF07cmV0dXJuIGZ9fSxiTy50ZXN0KGEpfHwocC5jc3NIb29rc1thK2JdLnNldD1iXyl9KTt2YXIgY2Q9LyUyMC9nLGNlPS9cW1xdJC8sY2Y9L1xyP1xuL2csY2c9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGRhdGV0aW1lLWxvY2FsfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGNoPS9eKD86c2VsZWN0fHRleHRhcmVhKS9pO3AuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gcC5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP3AubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8Y2gudGVzdCh0aGlzLm5vZGVOYW1lKXx8Y2cudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPXAodGhpcykudmFsKCk7cmV0dXJuIGM9PW51bGw/bnVsbDpwLmlzQXJyYXkoYyk/cC5tYXAoYyxmdW5jdGlvbihhLGMpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoY2YsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGNmLCJcclxuIil9fSkuZ2V0KCl9fSkscC5wYXJhbT1mdW5jdGlvbihhLGMpe3ZhciBkLGU9W10sZj1mdW5jdGlvbihhLGIpe2I9cC5pc0Z1bmN0aW9uKGIpP2IoKTpiPT1udWxsPyIiOmIsZVtlLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2M9PT1iJiYoYz1wLmFqYXhTZXR0aW5ncyYmcC5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2lmKHAuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFwLmlzUGxhaW5PYmplY3QoYSkpcC5lYWNoKGEsZnVuY3Rpb24oKXtmKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGQgaW4gYSljaShkLGFbZF0sYyxmKTtyZXR1cm4gZS5qb2luKCImIikucmVwbGFjZShjZCwiKyIpfTt2YXIgY2osY2ssY2w9LyMuKiQvLGNtPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsY249L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxjbz0vXig/OkdFVHxIRUFEKSQvLGNwPS9eXC9cLy8sY3E9L1w/Lyxjcj0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxjcz0vKFs/Jl0pXz1bXiZdKi8sY3Q9L14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLGN1PXAuZm4ubG9hZCxjdj17fSxjdz17fSxjeD1bIiovIl0rWyIqIl07dHJ5e2NrPWYuaHJlZn1jYXRjaChjeSl7Y2s9ZS5jcmVhdGVFbGVtZW50KCJhIiksY2suaHJlZj0iIixjaz1jay5ocmVmfWNqPWN0LmV4ZWMoY2sudG9Mb3dlckNhc2UoKSl8fFtdLHAuZm4ubG9hZD1mdW5jdGlvbihhLGMsZCl7aWYodHlwZW9mIGEhPSJzdHJpbmciJiZjdSlyZXR1cm4gY3UuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZSxmLGcsaD10aGlzLGk9YS5pbmRleE9mKCIgIik7cmV0dXJuIGk+PTAmJihlPWEuc2xpY2UoaSxhLmxlbmd0aCksYT1hLnNsaWNlKDAsaSkpLHAuaXNGdW5jdGlvbihjKT8oZD1jLGM9Yik6YyYmdHlwZW9mIGM9PSJvYmplY3QiJiYoZj0iUE9TVCIpLHAuYWpheCh7dXJsOmEsdHlwZTpmLGRhdGFUeXBlOiJodG1sIixkYXRhOmMsY29tcGxldGU6ZnVuY3Rpb24oYSxiKXtkJiZoLmVhY2goZCxnfHxbYS5yZXNwb25zZVRleHQsYixhXSl9fSkuZG9uZShmdW5jdGlvbihhKXtnPWFyZ3VtZW50cyxoLmh0bWwoZT9wKCI8ZGl2PiIpLmFwcGVuZChhLnJlcGxhY2UoY3IsIiIpKS5maW5kKGUpOmEpfSksdGhpc30scC5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe3AuZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxwLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxjKXtwW2NdPWZ1bmN0aW9uKGEsZCxlLGYpe3JldHVybiBwLmlzRnVuY3Rpb24oZCkmJihmPWZ8fGUsZT1kLGQ9YikscC5hamF4KHt0eXBlOmMsdXJsOmEsZGF0YTpkLHN1Y2Nlc3M6ZSxkYXRhVHlwZTpmfSl9fSkscC5leHRlbmQoe2dldFNjcmlwdDpmdW5jdGlvbihhLGMpe3JldHVybiBwLmdldChhLGIsYywic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBwLmdldChhLGIsYywianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9jQihhLHAuYWpheFNldHRpbmdzKTooYj1hLGE9cC5hamF4U2V0dGluZ3MpLGNCKGEsYiksYX0sYWpheFNldHRpbmdzOnt1cmw6Y2ssaXNMb2NhbDpjbi50ZXN0KGNqWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04Iixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6Y3h9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjphLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpwLnBhcnNlSlNPTiwidGV4dCB4bWwiOnAucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6Y3ooY3YpLGFqYXhUcmFuc3BvcnQ6Y3ooY3cpLGFqYXg6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiB5KGEsYyxmLGkpe3ZhciBrLHMsdCx1LHcseT1jO2lmKHY9PT0yKXJldHVybjt2PTIsaCYmY2xlYXJUaW1lb3V0KGgpLGc9YixlPWl8fCIiLHgucmVhZHlTdGF0ZT1hPjA/NDowLGYmJih1PWNDKGwseCxmKSk7aWYoYT49MjAwJiZhPDMwMHx8YT09PTMwNClsLmlmTW9kaWZpZWQmJih3PXguZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSx3JiYocC5sYXN0TW9kaWZpZWRbZF09dyksdz14LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIiksdyYmKHAuZXRhZ1tkXT13KSksYT09PTMwND8oeT0ibm90bW9kaWZpZWQiLGs9ITApOihrPWNEKGwsdSkseT1rLnN0YXRlLHM9ay5kYXRhLHQ9ay5lcnJvcixrPSF0KTtlbHNle3Q9eTtpZigheXx8YSl5PSJlcnJvciIsYTwwJiYoYT0wKX14LnN0YXR1cz1hLHguc3RhdHVzVGV4dD0oY3x8eSkrIiIsaz9vLnJlc29sdmVXaXRoKG0sW3MseSx4XSk6by5yZWplY3RXaXRoKG0sW3gseSx0XSkseC5zdGF0dXNDb2RlKHIpLHI9YixqJiZuLnRyaWdnZXIoImFqYXgiKyhrPyJTdWNjZXNzIjoiRXJyb3IiKSxbeCxsLGs/czp0XSkscS5maXJlV2l0aChtLFt4LHldKSxqJiYobi50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt4LGxdKSwtLXAuYWN0aXZlfHxwLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfXR5cGVvZiBhPT0ib2JqZWN0IiYmKGM9YSxhPWIpLGM9Y3x8e307dmFyIGQsZSxmLGcsaCxpLGosayxsPXAuYWpheFNldHVwKHt9LGMpLG09bC5jb250ZXh0fHxsLG49bSE9PWwmJihtLm5vZGVUeXBlfHxtIGluc3RhbmNlb2YgcCk/cChtKTpwLmV2ZW50LG89cC5EZWZlcnJlZCgpLHE9cC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iikscj1sLnN0YXR1c0NvZGV8fHt9LHQ9e30sdT17fSx2PTAsdz0iY2FuY2VsZWQiLHg9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7aWYoIXYpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTthPXVbY109dVtjXXx8YSx0W2FdPWJ9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiB2PT09Mj9lOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBjO2lmKHY9PT0yKXtpZighZil7Zj17fTt3aGlsZShjPWNtLmV4ZWMoZSkpZltjWzFdLnRvTG93ZXJDYXNlKCldPWNbMl19Yz1mW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIGM9PT1iP251bGw6Y30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gdnx8KGwubWltZVR5cGU9YSksdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9YXx8dyxnJiZnLmFib3J0KGEpLHkoMCxhKSx0aGlzfX07by5wcm9taXNlKHgpLHguc3VjY2Vzcz14LmRvbmUseC5lcnJvcj14LmZhaWwseC5jb21wbGV0ZT1xLmFkZCx4LnN0YXR1c0NvZGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI7aWYodjwyKWZvcihiIGluIGEpcltiXT1bcltiXSxhW2JdXTtlbHNlIGI9YVt4LnN0YXR1c10seC5hbHdheXMoYil9cmV0dXJuIHRoaXN9LGwudXJsPSgoYXx8bC51cmwpKyIiKS5yZXBsYWNlKGNsLCIiKS5yZXBsYWNlKGNwLGNqWzFdKyIvLyIpLGwuZGF0YVR5cGVzPXAudHJpbShsLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQocyksbC5jcm9zc0RvbWFpbj09bnVsbCYmKGk9Y3QuZXhlYyhsLnVybC50b0xvd2VyQ2FzZSgpKXx8ITEsbC5jcm9zc0RvbWFpbj1pJiZpLmpvaW4oIjoiKSsoaVszXT8iIjppWzFdPT09Imh0dHA6Ij84MDo0NDMpIT09Y2ouam9pbigiOiIpKyhjalszXT8iIjpjalsxXT09PSJodHRwOiI/ODA6NDQzKSksbC5kYXRhJiZsLnByb2Nlc3NEYXRhJiZ0eXBlb2YgbC5kYXRhIT0ic3RyaW5nIiYmKGwuZGF0YT1wLnBhcmFtKGwuZGF0YSxsLnRyYWRpdGlvbmFsKSksY0EoY3YsbCxjLHgpO2lmKHY9PT0yKXJldHVybiB4O2o9bC5nbG9iYWwsbC50eXBlPWwudHlwZS50b1VwcGVyQ2FzZSgpLGwuaGFzQ29udGVudD0hY28udGVzdChsLnR5cGUpLGomJnAuYWN0aXZlKys9PT0wJiZwLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpO2lmKCFsLmhhc0NvbnRlbnQpe2wuZGF0YSYmKGwudXJsKz0oY3EudGVzdChsLnVybCk/IiYiOiI/IikrbC5kYXRhLGRlbGV0ZSBsLmRhdGEpLGQ9bC51cmw7aWYobC5jYWNoZT09PSExKXt2YXIgej1wLm5vdygpLEE9bC51cmwucmVwbGFjZShjcywiJDFfPSIreik7bC51cmw9QSsoQT09PWwudXJsPyhjcS50ZXN0KGwudXJsKT8iJiI6Ij8iKSsiXz0iK3o6IiIpfX0obC5kYXRhJiZsLmhhc0NvbnRlbnQmJmwuY29udGVudFR5cGUhPT0hMXx8Yy5jb250ZW50VHlwZSkmJnguc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixsLmNvbnRlbnRUeXBlKSxsLmlmTW9kaWZpZWQmJihkPWR8fGwudXJsLHAubGFzdE1vZGlmaWVkW2RdJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixwLmxhc3RNb2RpZmllZFtkXSkscC5ldGFnW2RdJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLHAuZXRhZ1tkXSkpLHguc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixsLmRhdGFUeXBlc1swXSYmbC5hY2NlcHRzW2wuZGF0YVR5cGVzWzBdXT9sLmFjY2VwdHNbbC5kYXRhVHlwZXNbMF1dKyhsLmRhdGFUeXBlc1swXSE9PSIqIj8iLCAiK2N4KyI7IHE9MC4wMSI6IiIpOmwuYWNjZXB0c1siKiJdKTtmb3IoayBpbiBsLmhlYWRlcnMpeC5zZXRSZXF1ZXN0SGVhZGVyKGssbC5oZWFkZXJzW2tdKTtpZighbC5iZWZvcmVTZW5kfHxsLmJlZm9yZVNlbmQuY2FsbChtLHgsbCkhPT0hMSYmdiE9PTIpe3c9ImFib3J0Ijtmb3IoayBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl4W2tdKGxba10pO2c9Y0EoY3csbCxjLHgpO2lmKCFnKXkoLTEsIk5vIFRyYW5zcG9ydCIpO2Vsc2V7eC5yZWFkeVN0YXRlPTEsaiYmbi50cmlnZ2VyKCJhamF4U2VuZCIsW3gsbF0pLGwuYXN5bmMmJmwudGltZW91dD4wJiYoaD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eC5hYm9ydCgidGltZW91dCIpfSxsLnRpbWVvdXQpKTt0cnl7dj0xLGcuc2VuZCh0LHkpfWNhdGNoKEIpe2lmKHY8Mil5KC0xLEIpO2Vsc2UgdGhyb3cgQn19cmV0dXJuIHh9cmV0dXJuIHguYWJvcnQoKX0sYWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e319KTt2YXIgY0U9W10sY0Y9L1w/LyxjRz0vKD0pXD8oPz0mfCQpfFw/XD8vLGNIPXAubm93KCk7cC5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBhPWNFLnBvcCgpfHxwLmV4cGFuZG8rIl8iK2NIKys7cmV0dXJuIHRoaXNbYV09ITAsYX19KSxwLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGMsZCxlKXt2YXIgZixnLGgsaT1jLmRhdGEsaj1jLnVybCxrPWMuanNvbnAhPT0hMSxsPWsmJmNHLnRlc3QoaiksbT1rJiYhbCYmdHlwZW9mIGk9PSJzdHJpbmciJiYhKGMuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmY0cudGVzdChpKTtpZihjLmRhdGFUeXBlc1swXT09PSJqc29ucCJ8fGx8fG0pcmV0dXJuIGY9Yy5qc29ucENhbGxiYWNrPXAuaXNGdW5jdGlvbihjLmpzb25wQ2FsbGJhY2spP2MuanNvbnBDYWxsYmFjaygpOmMuanNvbnBDYWxsYmFjayxnPWFbZl0sbD9jLnVybD1qLnJlcGxhY2UoY0csIiQxIitmKTptP2MuZGF0YT1pLnJlcGxhY2UoY0csIiQxIitmKTprJiYoYy51cmwrPShjRi50ZXN0KGopPyImIjoiPyIpK2MuanNvbnArIj0iK2YpLGMuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBofHxwLmVycm9yKGYrIiB3YXMgbm90IGNhbGxlZCIpLGhbMF19LGMuZGF0YVR5cGVzWzBdPSJqc29uIixhW2ZdPWZ1bmN0aW9uKCl7aD1hcmd1bWVudHN9LGUuYWx3YXlzKGZ1bmN0aW9uKCl7YVtmXT1nLGNbZl0mJihjLmpzb25wQ2FsbGJhY2s9ZC5qc29ucENhbGxiYWNrLGNFLnB1c2goZikpLGgmJnAuaXNGdW5jdGlvbihnKSYmZyhoWzBdKSxoPWc9Yn0pLCJzY3JpcHQifSkscC5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBwLmdsb2JhbEV2YWwoYSksYX19fSkscC5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2EuY2FjaGU9PT1iJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KSxwLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGMsZD1lLmhlYWR8fGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8ZS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZixnKXtjPWUuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksYy5hc3luYz0iYXN5bmMiLGEuc2NyaXB0Q2hhcnNldCYmKGMuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGMuc3JjPWEudXJsLGMub25sb2FkPWMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsZSl7aWYoZXx8IWMucmVhZHlTdGF0ZXx8L2xvYWRlZHxjb21wbGV0ZS8udGVzdChjLnJlYWR5U3RhdGUpKWMub25sb2FkPWMub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsZCYmYy5wYXJlbnROb2RlJiZkLnJlbW92ZUNoaWxkKGMpLGM9YixlfHxnKDIwMCwic3VjY2VzcyIpfSxkLmluc2VydEJlZm9yZShjLGQuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7YyYmYy5vbmxvYWQoMCwxKX19fX0pO3ZhciBjSSxjSj1hLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gY0kpY0lbYV0oMCwxKX06ITEsY0s9MDtwLmFqYXhTZXR0aW5ncy54aHI9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmY0woKXx8Y00oKX06Y0wsZnVuY3Rpb24oYSl7cC5leHRlbmQocC5zdXBwb3J0LHthamF4OiEhYSxjb3JzOiEhYSYmIndpdGhDcmVkZW50aWFscyJpbiBhfSl9KHAuYWpheFNldHRpbmdzLnhocigpKSxwLnN1cHBvcnQuYWpheCYmcC5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGMpe2lmKCFjLmNyb3NzRG9tYWlufHxwLnN1cHBvcnQuY29ycyl7dmFyIGQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxmKXt2YXIgZyxoLGk9Yy54aHIoKTtjLnVzZXJuYW1lP2kub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyxjLnVzZXJuYW1lLGMucGFzc3dvcmQpOmkub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyk7aWYoYy54aHJGaWVsZHMpZm9yKGggaW4gYy54aHJGaWVsZHMpaVtoXT1jLnhockZpZWxkc1toXTtjLm1pbWVUeXBlJiZpLm92ZXJyaWRlTWltZVR5cGUmJmkub3ZlcnJpZGVNaW1lVHlwZShjLm1pbWVUeXBlKSwhYy5jcm9zc0RvbWFpbiYmIWVbIlgtUmVxdWVzdGVkLVdpdGgiXSYmKGVbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKGggaW4gZSlpLnNldFJlcXVlc3RIZWFkZXIoaCxlW2hdKX1jYXRjaChqKXt9aS5zZW5kKGMuaGFzQ29udGVudCYmYy5kYXRhfHxudWxsKSxkPWZ1bmN0aW9uKGEsZSl7dmFyIGgsaixrLGwsbTt0cnl7aWYoZCYmKGV8fGkucmVhZHlTdGF0ZT09PTQpKXtkPWIsZyYmKGkub25yZWFkeXN0YXRlY2hhbmdlPXAubm9vcCxjSiYmZGVsZXRlIGNJW2ddKTtpZihlKWkucmVhZHlTdGF0ZSE9PTQmJmkuYWJvcnQoKTtlbHNle2g9aS5zdGF0dXMsaz1pLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLGw9e30sbT1pLnJlc3BvbnNlWE1MLG0mJm0uZG9jdW1lbnRFbGVtZW50JiYobC54bWw9bSk7dHJ5e2wudGV4dD1pLnJlc3BvbnNlVGV4dH1jYXRjaChhKXt9dHJ5e2o9aS5zdGF0dXNUZXh0fWNhdGNoKG4pe2o9IiJ9IWgmJmMuaXNMb2NhbCYmIWMuY3Jvc3NEb21haW4/aD1sLnRleHQ/MjAwOjQwNDpoPT09MTIyMyYmKGg9MjA0KX19fWNhdGNoKG8pe2V8fGYoLTEsbyl9bCYmZihoLGosbCxrKX0sYy5hc3luYz9pLnJlYWR5U3RhdGU9PT00P3NldFRpbWVvdXQoZCwwKTooZz0rK2NLLGNKJiYoY0l8fChjST17fSxwKGEpLnVubG9hZChjSikpLGNJW2ddPWQpLGkub25yZWFkeXN0YXRlY2hhbmdlPWQpOmQoKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkKDAsMSl9fX19KTt2YXIgY04sY08sY1A9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGNRPW5ldyBSZWdFeHAoIl4oPzooWy0rXSk9fCkoIitxKyIpKFthLXolXSopJCIsImkiKSxjUj0vcXVldWVIb29rcyQvLGNTPVtjWV0sY1Q9eyIqIjpbZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9dGhpcy5jcmVhdGVUd2VlbihhLGIpLGY9Y1EuZXhlYyhiKSxnPWUuY3VyKCksaD0rZ3x8MCxpPTEsaj0yMDtpZihmKXtjPStmWzJdLGQ9ZlszXXx8KHAuY3NzTnVtYmVyW2FdPyIiOiJweCIpO2lmKGQhPT0icHgiJiZoKXtoPXAuY3NzKGUuZWxlbSxhLCEwKXx8Y3x8MTtkbyBpPWl8fCIuNSIsaD1oL2kscC5zdHlsZShlLmVsZW0sYSxoK2QpO3doaWxlKGkhPT0oaT1lLmN1cigpL2cpJiZpIT09MSYmLS1qKX1lLnVuaXQ9ZCxlLnN0YXJ0PWgsZS5lbmQ9ZlsxXT9oKyhmWzFdKzEpKmM6Y31yZXR1cm4gZX1dfTtwLkFuaW1hdGlvbj1wLmV4dGVuZChjVyx7dHdlZW5lcjpmdW5jdGlvbihhLGIpe3AuaXNGdW5jdGlvbihhKT8oYj1hLGE9WyIqIl0pOmE9YS5zcGxpdCgiICIpO3ZhciBjLGQ9MCxlPWEubGVuZ3RoO2Zvcig7ZDxlO2QrKyljPWFbZF0sY1RbY109Y1RbY118fFtdLGNUW2NdLnVuc2hpZnQoYil9LHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/Y1MudW5zaGlmdChhKTpjUy5wdXNoKGEpfX0pLHAuVHdlZW49Y1osY1oucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpjWixpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHwic3dpbmciLHRoaXMub3B0aW9ucz1iLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1kLHRoaXMudW5pdD1mfHwocC5jc3NOdW1iZXJbY10/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPWNaLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpjWi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1jWi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWI9cC5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9Yj1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpiK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLGMmJmMuc2V0P2Muc2V0KHRoaXMpOmNaLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LGNaLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1jWi5wcm90b3R5cGUsY1oucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBhLmVsZW1bYS5wcm9wXT09bnVsbHx8ISFhLmVsZW0uc3R5bGUmJmEuZWxlbS5zdHlsZVthLnByb3BdIT1udWxsPyhiPXAuY3NzKGEuZWxlbSxhLnByb3AsITEsIiIpLCFifHxiPT09ImF1dG8iPzA6Yik6YS5lbGVtW2EucHJvcF19LHNldDpmdW5jdGlvbihhKXtwLmZ4LnN0ZXBbYS5wcm9wXT9wLmZ4LnN0ZXBbYS5wcm9wXShhKTphLmVsZW0uc3R5bGUmJihhLmVsZW0uc3R5bGVbcC5jc3NQcm9wc1thLnByb3BdXSE9bnVsbHx8cC5jc3NIb29rc1thLnByb3BdKT9wLnN0eWxlKGEuZWxlbSxhLnByb3AsYS5ub3crYS51bml0KTphLmVsZW1bYS5wcm9wXT1hLm5vd319fSxjWi5wcm9wSG9va3Muc2Nyb2xsVG9wPWNaLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oYSl7YS5lbGVtLm5vZGVUeXBlJiZhLmVsZW0ucGFyZW50Tm9kZSYmKGEuZWxlbVthLnByb3BdPWEubm93KX19LHAuZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24oYSxiKXt2YXIgYz1wLmZuW2JdO3AuZm5bYl09ZnVuY3Rpb24oZCxlLGYpe3JldHVybiBkPT1udWxsfHx0eXBlb2YgZD09ImJvb2xlYW4ifHwhYSYmcC5pc0Z1bmN0aW9uKGQpJiZwLmlzRnVuY3Rpb24oZSk/Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGMkKGIsITApLGQsZSxmKX19KSxwLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihiWikuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9cC5pc0VtcHR5T2JqZWN0KGEpLGY9cC5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPWNXKHRoaXMscC5leHRlbmQoe30sYSksZik7ZSYmYi5zdG9wKCEwKX07cmV0dXJuIGV8fGYucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShmLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1mdW5jdGlvbihhKXt2YXIgYj1hLnN0b3A7ZGVsZXRlIGEuc3RvcCxiKGQpfTtyZXR1cm4gdHlwZW9mIGEhPSJzdHJpbmciJiYoZD1jLGM9YSxhPWIpLGMmJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj0hMCxjPWEhPW51bGwmJmErInF1ZXVlSG9va3MiLGY9cC50aW1lcnMsZz1wLl9kYXRhKHRoaXMpO2lmKGMpZ1tjXSYmZ1tjXS5zdG9wJiZlKGdbY10pO2Vsc2UgZm9yKGMgaW4gZylnW2NdJiZnW2NdLnN0b3AmJmNSLnRlc3QoYykmJmUoZ1tjXSk7Zm9yKGM9Zi5sZW5ndGg7Yy0tOylmW2NdLmVsZW09PT10aGlzJiYoYT09bnVsbHx8ZltjXS5xdWV1ZT09PWEpJiYoZltjXS5hbmltLnN0b3AoZCksYj0hMSxmLnNwbGljZShjLDEpKTsoYnx8IWQpJiZwLmRlcXVldWUodGhpcyxhKX0pfX0pLHAuZWFjaCh7c2xpZGVEb3duOmMkKCJzaG93Iiksc2xpZGVVcDpjJCgiaGlkZSIpLHNsaWRlVG9nZ2xlOmMkKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7cC5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxwLnNwZWVkPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiZ0eXBlb2YgYT09Im9iamVjdCI/cC5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxwLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIXAuaXNGdW5jdGlvbihiKSYmYn07ZC5kdXJhdGlvbj1wLmZ4Lm9mZj8wOnR5cGVvZiBkLmR1cmF0aW9uPT0ibnVtYmVyIj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gcC5meC5zcGVlZHM/cC5meC5zcGVlZHNbZC5kdXJhdGlvbl06cC5meC5zcGVlZHMuX2RlZmF1bHQ7aWYoZC5xdWV1ZT09bnVsbHx8ZC5xdWV1ZT09PSEwKWQucXVldWU9ImZ4IjtyZXR1cm4gZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKCl7cC5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlJiZwLmRlcXVldWUodGhpcyxkLnF1ZXVlKX0sZH0scC5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfX0scC50aW1lcnM9W10scC5meD1jWi5wcm90b3R5cGUuaW5pdCxwLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPXAudGltZXJzLGM9MDtmb3IoO2M8Yi5sZW5ndGg7YysrKWE9YltjXSwhYSgpJiZiW2NdPT09YSYmYi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxwLmZ4LnN0b3AoKX0scC5meC50aW1lcj1mdW5jdGlvbihhKXthKCkmJnAudGltZXJzLnB1c2goYSkmJiFjTyYmKGNPPXNldEludGVydmFsKHAuZngudGljayxwLmZ4LmludGVydmFsKSl9LHAuZnguaW50ZXJ2YWw9MTMscC5meC5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChjTyksY089bnVsbH0scC5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0scC5meC5zdGVwPXt9LHAuZXhwciYmcC5leHByLmZpbHRlcnMmJihwLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gcC5ncmVwKHAudGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofSk7dmFyIGNfPS9eKD86Ym9keXxodG1sKSQvaTtwLmZuLm9mZnNldD1mdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBhPT09Yj90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXtwLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGMsZCxlLGYsZyxoLGksaj17dG9wOjAsbGVmdDowfSxrPXRoaXNbMF0sbD1rJiZrLm93bmVyRG9jdW1lbnQ7aWYoIWwpcmV0dXJuO3JldHVybihkPWwuYm9keSk9PT1rP3Aub2Zmc2V0LmJvZHlPZmZzZXQoayk6KGM9bC5kb2N1bWVudEVsZW1lbnQscC5jb250YWlucyhjLGspPyh0eXBlb2Ygay5nZXRCb3VuZGluZ0NsaWVudFJlY3QhPSJ1bmRlZmluZWQiJiYoaj1rLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxlPWRhKGwpLGY9Yy5jbGllbnRUb3B8fGQuY2xpZW50VG9wfHwwLGc9Yy5jbGllbnRMZWZ0fHxkLmNsaWVudExlZnR8fDAsaD1lLnBhZ2VZT2Zmc2V0fHxjLnNjcm9sbFRvcCxpPWUucGFnZVhPZmZzZXR8fGMuc2Nyb2xsTGVmdCx7dG9wOmoudG9wK2gtZixsZWZ0OmoubGVmdCtpLWd9KTpqKX0scC5vZmZzZXQ9e2JvZHlPZmZzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRUb3AsYz1hLm9mZnNldExlZnQ7cmV0dXJuIHAuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKGIrPXBhcnNlRmxvYXQocC5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMrPXBhcnNlRmxvYXQocC5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCkse3RvcDpiLGxlZnQ6Y319LHNldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9cC5jc3MoYSwicG9zaXRpb24iKTtkPT09InN0YXRpYyImJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBlPXAoYSksZj1lLm9mZnNldCgpLGc9cC5jc3MoYSwidG9wIiksaD1wLmNzcyhhLCJsZWZ0IiksaT0oZD09PSJhYnNvbHV0ZSJ8fGQ9PT0iZml4ZWQiKSYmcC5pbkFycmF5KCJhdXRvIixbZyxoXSk+LTEsaj17fSxrPXt9LGwsbTtpPyhrPWUucG9zaXRpb24oKSxsPWsudG9wLG09ay5sZWZ0KToobD1wYXJzZUZsb2F0KGcpfHwwLG09cGFyc2VGbG9hdChoKXx8MCkscC5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGYpKSxiLnRvcCE9bnVsbCYmKGoudG9wPWIudG9wLWYudG9wK2wpLGIubGVmdCE9bnVsbCYmKGoubGVmdD1iLmxlZnQtZi5sZWZ0K20pLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGopOmUuY3NzKGopfX0scC5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGM9dGhpcy5vZmZzZXQoKSxkPWNfLnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtyZXR1cm4gYy50b3AtPXBhcnNlRmxvYXQocC5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMubGVmdC09cGFyc2VGbG9hdChwLmNzcyhhLCJtYXJnaW5MZWZ0IikpfHwwLGQudG9wKz1wYXJzZUZsb2F0KHAuY3NzKGJbMF0sImJvcmRlclRvcFdpZHRoIikpfHwwLGQubGVmdCs9cGFyc2VGbG9hdChwLmNzcyhiWzBdLCJib3JkZXJMZWZ0V2lkdGgiKSl8fDAse3RvcDpjLnRvcC1kLnRvcCxsZWZ0OmMubGVmdC1kLmxlZnR9fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8ZS5ib2R5O3doaWxlKGEmJiFjXy50ZXN0KGEubm9kZU5hbWUpJiZwLmNzcyhhLCJwb3NpdGlvbiIpPT09InN0YXRpYyIpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYXx8ZS5ib2R5fSl9fSkscC5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGEsYyl7dmFyIGQ9L1kvLnRlc3QoYyk7cC5mblthXT1mdW5jdGlvbihlKXtyZXR1cm4gcC5hY2Nlc3ModGhpcyxmdW5jdGlvbihhLGUsZil7dmFyIGc9ZGEoYSk7aWYoZj09PWIpcmV0dXJuIGc/YyBpbiBnP2dbY106Zy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZV06YVtlXTtnP2cuc2Nyb2xsVG8oZD9wKGcpLnNjcm9sbExlZnQoKTpmLGQ/ZjpwKGcpLnNjcm9sbFRvcCgpKTphW2VdPWZ9LGEsZSxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLHAuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGEsYyl7cC5lYWNoKHtwYWRkaW5nOiJpbm5lciIrYSxjb250ZW50OmMsIiI6Im91dGVyIithfSxmdW5jdGlvbihkLGUpe3AuZm5bZV09ZnVuY3Rpb24oZSxmKXt2YXIgZz1hcmd1bWVudHMubGVuZ3RoJiYoZHx8dHlwZW9mIGUhPSJib29sZWFuIiksaD1kfHwoZT09PSEwfHxmPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiBwLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGMsZCxlKXt2YXIgZjtyZXR1cm4gcC5pc1dpbmRvdyhjKT9jLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTpjLm5vZGVUeXBlPT09OT8oZj1jLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChjLmJvZHlbInNjcm9sbCIrYV0sZlsic2Nyb2xsIithXSxjLmJvZHlbIm9mZnNldCIrYV0sZlsib2Zmc2V0IithXSxmWyJjbGllbnQiK2FdKSk6ZT09PWI/cC5jc3MoYyxkLGUsaCk6cC5zdHlsZShjLGQsZSxoKX0sYyxnP2U6YixnLG51bGwpfX0pfSksYS5qUXVlcnk9YS4kPXAsdHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCYmZGVmaW5lLmFtZC5qUXVlcnkmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBwfSl9KSh3aW5kb3cpOw==' type='text/javascript'></script> <script src='data:application/javascript;base64,ZDM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3JldHVybiBudWxsIT1uJiYhaXNOYU4obil9ZnVuY3Rpb24gdChuKXtyZXR1cm4gbi5sZW5ndGh9ZnVuY3Rpb24gZShuKXtmb3IodmFyIHQ9MTtuKnQlMTspdCo9MTA7cmV0dXJuIHR9ZnVuY3Rpb24gcihuLHQpe3RyeXtmb3IodmFyIGUgaW4gdClPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsZSx7dmFsdWU6dFtlXSxlbnVtZXJhYmxlOiExfSl9Y2F0Y2gocil7bi5wcm90b3R5cGU9dH19ZnVuY3Rpb24gaSgpe31mdW5jdGlvbiB1KCl7fWZ1bmN0aW9uIGEobix0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPWUuYXBwbHkodCxhcmd1bWVudHMpO3JldHVybiByPT09dD9uOnJ9fWZ1bmN0aW9uIG8obix0KXtpZih0IGluIG4pcmV0dXJuIHQ7dD10LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyaW5nKDEpO2Zvcih2YXIgZT0wLHI9TmEubGVuZ3RoO3I+ZTsrK2Upe3ZhciBpPU5hW2VdK3Q7aWYoaSBpbiBuKXJldHVybiBpfX1mdW5jdGlvbiBjKG4pe2Zvcih2YXIgdD0tMSxlPW4ubGVuZ3RoLHI9W107Kyt0PGU7KXIucHVzaChuW3RdKTtyZXR1cm4gcn1mdW5jdGlvbiBsKG4pe3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChuKX1mdW5jdGlvbiBzKCl7fWZ1bmN0aW9uIGYoKXt9ZnVuY3Rpb24gaChuKXtmdW5jdGlvbiB0KCl7Zm9yKHZhciB0LHI9ZSxpPS0xLHU9ci5sZW5ndGg7KytpPHU7KSh0PXJbaV0ub24pJiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbn12YXIgZT1bXSxyPW5ldyBpO3JldHVybiB0Lm9uPWZ1bmN0aW9uKHQsaSl7dmFyIHUsYT1yLmdldCh0KTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP2EmJmEub246KGEmJihhLm9uPW51bGwsZT1lLnNsaWNlKDAsdT1lLmluZGV4T2YoYSkpLmNvbmNhdChlLnNsaWNlKHUrMSkpLHIucmVtb3ZlKHQpKSxpJiZlLnB1c2goci5zZXQodCx7b246aX0pKSxuKX0sdH1mdW5jdGlvbiBnKCl7eWEuZXZlbnQucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBwKCl7Zm9yKHZhciBuLHQ9eWEuZXZlbnQ7bj10LnNvdXJjZUV2ZW50Oyl0PW47cmV0dXJuIHR9ZnVuY3Rpb24gZChuKXtmb3IodmFyIHQ9bmV3IGYsZT0wLHI9YXJndW1lbnRzLmxlbmd0aDsrK2U8cjspdFthcmd1bWVudHNbZV1dPWgodCk7cmV0dXJuIHQub2Y9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dHJ5e3ZhciB1PWkuc291cmNlRXZlbnQ9eWEuZXZlbnQ7aS50YXJnZXQ9bix5YS5ldmVudD1pLHRbaS50eXBlXS5hcHBseShlLHIpfWZpbmFsbHl7eWEuZXZlbnQ9dX19fSx0fWZ1bmN0aW9uIG0obil7cmV0dXJuIHphKG4sRmEpLG59ZnVuY3Rpb24gdihuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIERhKG4sdGhpcyl9fWZ1bmN0aW9uIHkobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiBqYShuLHRoaXMpfX1mdW5jdGlvbiBNKG4sdCl7ZnVuY3Rpb24gZSgpe3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pfWZ1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCl9ZnVuY3Rpb24gaSgpe3RoaXMuc2V0QXR0cmlidXRlKG4sdCl9ZnVuY3Rpb24gdSgpe3RoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLHQpfWZ1bmN0aW9uIGEoKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pOnRoaXMuc2V0QXR0cmlidXRlKG4sZSl9ZnVuY3Rpb24gbygpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLGUpfXJldHVybiBuPXlhLm5zLnF1YWxpZnkobiksbnVsbD09dD9uLmxvY2FsP3I6ZToiZnVuY3Rpb24iPT10eXBlb2YgdD9uLmxvY2FsP286YTpuLmxvY2FsP3U6aX1mdW5jdGlvbiB4KG4pe3JldHVybiBuLnRyaW0oKS5yZXBsYWNlKC9ccysvZywiICIpfWZ1bmN0aW9uIGIobil7cmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58XFxzKykiK3lhLnJlcXVvdGUobikrIig/Olxccyt8JCkiLCJnIil9ZnVuY3Rpb24gXyhuLHQpe2Z1bmN0aW9uIGUoKXtmb3IodmFyIGU9LTE7KytlPGk7KW5bZV0odGhpcyx0KX1mdW5jdGlvbiByKCl7Zm9yKHZhciBlPS0xLHI9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7KytlPGk7KW5bZV0odGhpcyxyKX1uPW4udHJpbSgpLnNwbGl0KC9ccysvKS5tYXAodyk7dmFyIGk9bi5sZW5ndGg7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/cjplfWZ1bmN0aW9uIHcobil7dmFyIHQ9YihuKTtyZXR1cm4gZnVuY3Rpb24oZSxyKXtpZihpPWUuY2xhc3NMaXN0KXJldHVybiByP2kuYWRkKG4pOmkucmVtb3ZlKG4pO3ZhciBpPWUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIjtyPyh0Lmxhc3RJbmRleD0wLHQudGVzdChpKXx8ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix4KGkrIiAiK24pKSk6ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix4KGkucmVwbGFjZSh0LCIgIikpKX19ZnVuY3Rpb24gUyhuLHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobil9ZnVuY3Rpb24gaSgpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobix0LGUpfWZ1bmN0aW9uIHUoKXt2YXIgcj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1yP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobik6dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHIsZSl9cmV0dXJuIG51bGw9PXQ/cjoiZnVuY3Rpb24iPT10eXBlb2YgdD91Oml9ZnVuY3Rpb24gRShuLHQpe2Z1bmN0aW9uIGUoKXtkZWxldGUgdGhpc1tuXX1mdW5jdGlvbiByKCl7dGhpc1tuXT10fWZ1bmN0aW9uIGkoKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP2RlbGV0ZSB0aGlzW25dOnRoaXNbbl09ZX1yZXR1cm4gbnVsbD09dD9lOiJmdW5jdGlvbiI9PXR5cGVvZiB0P2k6cn1mdW5jdGlvbiBrKG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246KG49eWEubnMucXVhbGlmeShuKSkubG9jYWw/ZnVuY3Rpb24oKXtyZXR1cm4gTWEuY3JlYXRlRWxlbWVudE5TKG4uc3BhY2Usbi5sb2NhbCl9OmZ1bmN0aW9uKCl7cmV0dXJuIE1hLmNyZWF0ZUVsZW1lbnROUyh0aGlzLm5hbWVzcGFjZVVSSSxuKX19ZnVuY3Rpb24gQShuKXtyZXR1cm57X19kYXRhX186bn19ZnVuY3Rpb24gTihuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gSGEodGhpcyxuKX19ZnVuY3Rpb24gcShuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aHx8KG49eWEuYXNjZW5kaW5nKSxmdW5jdGlvbih0LGUpe3JldHVybiF0LSFlfHxuKHQuX19kYXRhX18sZS5fX2RhdGFfXyl9fWZ1bmN0aW9uIFQobix0KXtmb3IodmFyIGU9MCxyPW4ubGVuZ3RoO3I+ZTtlKyspZm9yKHZhciBpLHU9bltlXSxhPTAsbz11Lmxlbmd0aDtvPmE7YSsrKShpPXVbYV0pJiZ0KGksYSxlKTtyZXR1cm4gbn1mdW5jdGlvbiBDKG4pe3JldHVybiB6YShuLE9hKSxufWZ1bmN0aW9uIHoobix0LGUpe2Z1bmN0aW9uIHIoKXt2YXIgdD10aGlzW2FdO3QmJih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobix0LHQuJCksZGVsZXRlIHRoaXNbYV0pfWZ1bmN0aW9uIGkoKXt2YXIgaT1jKHQscWEoYXJndW1lbnRzKSk7ci5jYWxsKHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihuLHRoaXNbYV09aSxpLiQ9ZSksaS5fPXR9ZnVuY3Rpb24gdSgpe3ZhciB0LGU9bmV3IFJlZ0V4cCgiXl9fb24oW14uXSspIit5YS5yZXF1b3RlKG4pKyIkIik7Zm9yKHZhciByIGluIHRoaXMpaWYodD1yLm1hdGNoKGUpKXt2YXIgaT10aGlzW3JdO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0WzFdLGksaS4kKSxkZWxldGUgdGhpc1tyXX19dmFyIGE9Il9fb24iK24sbz1uLmluZGV4T2YoIi4iKSxjPUQ7bz4wJiYobj1uLnN1YnN0cmluZygwLG8pKTt2YXIgbD1SYS5nZXQobik7cmV0dXJuIGwmJihuPWwsYz1qKSxvP3Q/aTpyOnQ/czp1fWZ1bmN0aW9uIEQobix0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9eWEuZXZlbnQ7eWEuZXZlbnQ9ZSx0WzBdPXRoaXMuX19kYXRhX187dHJ5e24uYXBwbHkodGhpcyx0KX1maW5hbGx5e3lhLmV2ZW50PXJ9fX1mdW5jdGlvbiBqKG4sdCl7dmFyIGU9RChuLHQpO3JldHVybiBmdW5jdGlvbihuKXt2YXIgdD10aGlzLHI9bi5yZWxhdGVkVGFyZ2V0O3ImJihyPT09dHx8OCZyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpKXx8ZS5jYWxsKHQsbil9fWZ1bmN0aW9uIEwobil7dmFyIHQ9InNlbGVjdHN0YXJ0LiIrbixlPSJkcmFnc3RhcnQuIituLHI9ImNsaWNrLiIrbixpPXlhLnNlbGVjdChiYSkub24odCxnKS5vbihlLGcpLHU9eGEuc3R5bGUsYT11W1VhXTtyZXR1cm4gdVtVYV09Im5vbmUiLGZ1bmN0aW9uKG4pe2Z1bmN0aW9uIG8oKXtpLm9uKHIsbnVsbCl9aS5vbih0LG51bGwpLm9uKGUsbnVsbCksdVtVYV09YSxuJiYoaS5vbihyLGZ1bmN0aW9uKCl7ZygpLG8oKX0sITApLHNldFRpbWVvdXQobywwKSl9fWZ1bmN0aW9uIEgobix0KXt2YXIgZT1uLm93bmVyU1ZHRWxlbWVudHx8bjtpZihlLmNyZWF0ZVNWR1BvaW50KXt2YXIgcj1lLmNyZWF0ZVNWR1BvaW50KCk7aWYoMD5JYSYmKGJhLnNjcm9sbFh8fGJhLnNjcm9sbFkpKXtlPXlhLnNlbGVjdCgiYm9keSIpLmFwcGVuZCgic3ZnIikuc3R5bGUoe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLG1hcmdpbjowLHBhZGRpbmc6MCxib3JkZXI6Im5vbmUifSwiaW1wb3J0YW50Iik7dmFyIGk9ZVswXVswXS5nZXRTY3JlZW5DVE0oKTtJYT0hKGkuZnx8aS5lKSxlLnJlbW92ZSgpfXJldHVybiBJYT8oci54PXQucGFnZVgsci55PXQucGFnZVkpOihyLng9dC5jbGllbnRYLHIueT10LmNsaWVudFkpLHI9ci5tYXRyaXhUcmFuc2Zvcm0obi5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpLFtyLngsci55XX12YXIgdT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVyblt0LmNsaWVudFgtdS5sZWZ0LW4uY2xpZW50TGVmdCx0LmNsaWVudFktdS50b3Atbi5jbGllbnRUb3BdfWZ1bmN0aW9uIEYoKXt9ZnVuY3Rpb24gUChuLHQsZSl7cmV0dXJuIG5ldyBPKG4sdCxlKX1mdW5jdGlvbiBPKG4sdCxlKXt0aGlzLmg9bix0aGlzLnM9dCx0aGlzLmw9ZX1mdW5jdGlvbiBZKG4sdCxlKXtmdW5jdGlvbiByKG4pe3JldHVybiBuPjM2MD9uLT0zNjA6MD5uJiYobis9MzYwKSw2MD5uP3UrKGEtdSkqbi82MDoxODA+bj9hOjI0MD5uP3UrKGEtdSkqKDI0MC1uKS82MDp1fWZ1bmN0aW9uIGkobil7cmV0dXJuIE1hdGgucm91bmQoMjU1KnIobikpfXZhciB1LGE7cmV0dXJuIG49aXNOYU4obik/MDoobiU9MzYwKTwwP24rMzYwOm4sdD1pc05hTih0KT8wOjA+dD8wOnQ+MT8xOnQsZT0wPmU/MDplPjE/MTplLGE9LjU+PWU/ZSooMSt0KTplK3QtZSp0LHU9MiplLWEscnQoaShuKzEyMCksaShuKSxpKG4tMTIwKSl9ZnVuY3Rpb24gUihuKXtyZXR1cm4gbj4wPzE6MD5uPy0xOjB9ZnVuY3Rpb24gVShuKXtyZXR1cm4gbj4xPzA6LTE+bj8kYTpNYXRoLmFjb3Mobil9ZnVuY3Rpb24gSShuKXtyZXR1cm4gbj4xPyRhLzI6LTE+bj8tJGEvMjpNYXRoLmFzaW4obil9ZnVuY3Rpb24gVihuKXtyZXR1cm4oTWF0aC5leHAobiktTWF0aC5leHAoLW4pKS8yfWZ1bmN0aW9uIFgobil7cmV0dXJuKE1hdGguZXhwKG4pK01hdGguZXhwKC1uKSkvMn1mdW5jdGlvbiBaKG4pe3JldHVybihuPU1hdGguc2luKG4vMikpKm59ZnVuY3Rpb24gQihuLHQsZSl7cmV0dXJuIG5ldyAkKG4sdCxlKX1mdW5jdGlvbiAkKG4sdCxlKXt0aGlzLmg9bix0aGlzLmM9dCx0aGlzLmw9ZX1mdW5jdGlvbiBXKG4sdCxlKXtyZXR1cm4gaXNOYU4obikmJihuPTApLGlzTmFOKHQpJiYodD0wKSxKKGUsTWF0aC5jb3Mobio9R2EpKnQsTWF0aC5zaW4obikqdCl9ZnVuY3Rpb24gSihuLHQsZSl7cmV0dXJuIG5ldyBHKG4sdCxlKX1mdW5jdGlvbiBHKG4sdCxlKXt0aGlzLmw9bix0aGlzLmE9dCx0aGlzLmI9ZX1mdW5jdGlvbiBLKG4sdCxlKXt2YXIgcj0obisxNikvMTE2LGk9cit0LzUwMCx1PXItZS8yMDA7cmV0dXJuIGk9bnQoaSkqdG8scj1udChyKSplbyx1PW50KHUpKnJvLHJ0KGV0KDMuMjQwNDU0MippLTEuNTM3MTM4NSpyLS40OTg1MzE0KnUpLGV0KC0uOTY5MjY2KmkrMS44NzYwMTA4KnIrLjA0MTU1Nip1KSxldCguMDU1NjQzNCppLS4yMDQwMjU5KnIrMS4wNTcyMjUyKnUpKX1mdW5jdGlvbiBRKG4sdCxlKXtyZXR1cm4gbj4wP0IoTWF0aC5hdGFuMihlLHQpKkthLE1hdGguc3FydCh0KnQrZSplKSxuKTpCKDAvMCwwLzAsbil9ZnVuY3Rpb24gbnQobil7cmV0dXJuIG4+LjIwNjg5MzAzND9uKm4qbjoobi00LzI5KS83Ljc4NzAzN31mdW5jdGlvbiB0dChuKXtyZXR1cm4gbj4uMDA4ODU2P01hdGgucG93KG4sMS8zKTo3Ljc4NzAzNypuKzQvMjl9ZnVuY3Rpb24gZXQobil7cmV0dXJuIE1hdGgucm91bmQoMjU1KiguMDAzMDQ+PW4/MTIuOTIqbjoxLjA1NSpNYXRoLnBvdyhuLDEvMi40KS0uMDU1KSl9ZnVuY3Rpb24gcnQobix0LGUpe3JldHVybiBuZXcgaXQobix0LGUpfWZ1bmN0aW9uIGl0KG4sdCxlKXt0aGlzLnI9bix0aGlzLmc9dCx0aGlzLmI9ZX1mdW5jdGlvbiB1dChuKXtyZXR1cm4gMTY+bj8iMCIrTWF0aC5tYXgoMCxuKS50b1N0cmluZygxNik6TWF0aC5taW4oMjU1LG4pLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBhdChuLHQsZSl7dmFyIHIsaSx1LGE9MCxvPTAsYz0wO2lmKHI9LyhbYS16XSspXCgoLiopXCkvaS5leGVjKG4pKXN3aXRjaChpPXJbMl0uc3BsaXQoIiwiKSxyWzFdKXtjYXNlImhzbCI6cmV0dXJuIGUocGFyc2VGbG9hdChpWzBdKSxwYXJzZUZsb2F0KGlbMV0pLzEwMCxwYXJzZUZsb2F0KGlbMl0pLzEwMCk7Y2FzZSJyZ2IiOnJldHVybiB0KHN0KGlbMF0pLHN0KGlbMV0pLHN0KGlbMl0pKX1yZXR1cm4odT1hby5nZXQobikpP3QodS5yLHUuZyx1LmIpOihudWxsIT1uJiYiIyI9PT1uLmNoYXJBdCgwKSYmKDQ9PT1uLmxlbmd0aD8oYT1uLmNoYXJBdCgxKSxhKz1hLG89bi5jaGFyQXQoMiksbys9byxjPW4uY2hhckF0KDMpLGMrPWMpOjc9PT1uLmxlbmd0aCYmKGE9bi5zdWJzdHJpbmcoMSwzKSxvPW4uc3Vic3RyaW5nKDMsNSksYz1uLnN1YnN0cmluZyg1LDcpKSxhPXBhcnNlSW50KGEsMTYpLG89cGFyc2VJbnQobywxNiksYz1wYXJzZUludChjLDE2KSksdChhLG8sYykpfWZ1bmN0aW9uIG90KG4sdCxlKXt2YXIgcixpLHU9TWF0aC5taW4obi89MjU1LHQvPTI1NSxlLz0yNTUpLGE9TWF0aC5tYXgobix0LGUpLG89YS11LGM9KGErdSkvMjtyZXR1cm4gbz8oaT0uNT5jP28vKGErdSk6by8oMi1hLXUpLHI9bj09YT8odC1lKS9vKyhlPnQ/NjowKTp0PT1hPyhlLW4pL28rMjoobi10KS9vKzQscio9NjApOihyPTAvMCxpPWM+MCYmMT5jPzA6ciksUChyLGksYyl9ZnVuY3Rpb24gY3Qobix0LGUpe249bHQobiksdD1sdCh0KSxlPWx0KGUpO3ZhciByPXR0KCguNDEyNDU2NCpuKy4zNTc1NzYxKnQrLjE4MDQzNzUqZSkvdG8pLGk9dHQoKC4yMTI2NzI5Km4rLjcxNTE1MjIqdCsuMDcyMTc1KmUpL2VvKSx1PXR0KCguMDE5MzMzOSpuKy4xMTkxOTIqdCsuOTUwMzA0MSplKS9ybyk7cmV0dXJuIEooMTE2KmktMTYsNTAwKihyLWkpLDIwMCooaS11KSl9ZnVuY3Rpb24gbHQobil7cmV0dXJuKG4vPTI1NSk8PS4wNDA0NT9uLzEyLjkyOk1hdGgucG93KChuKy4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gc3Qobil7dmFyIHQ9cGFyc2VGbG9hdChuKTtyZXR1cm4iJSI9PT1uLmNoYXJBdChuLmxlbmd0aC0xKT9NYXRoLnJvdW5kKDIuNTUqdCk6dH1mdW5jdGlvbiBmdChuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIG59fWZ1bmN0aW9uIGh0KG4pe3JldHVybiBufWZ1bmN0aW9uIGd0KG4pe3JldHVybiBmdW5jdGlvbih0LGUscil7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLHB0KHQsZSxuLHIpfX1mdW5jdGlvbiBwdChuLHQsZSxyKXtmdW5jdGlvbiBpKCl7dmFyIG4sdD1jLnN0YXR1cztpZighdCYmYy5yZXNwb25zZVRleHR8fHQ+PTIwMCYmMzAwPnR8fDMwND09PXQpe3RyeXtuPWUuY2FsbCh1LGMpfWNhdGNoKHIpe3JldHVybiBhLmVycm9yLmNhbGwodSxyKSx2b2lkIDB9YS5sb2FkLmNhbGwodSxuKX1lbHNlIGEuZXJyb3IuY2FsbCh1LGMpfXZhciB1PXt9LGE9eWEuZGlzcGF0Y2goInByb2dyZXNzIiwibG9hZCIsImVycm9yIiksbz17fSxjPW5ldyBYTUxIdHRwUmVxdWVzdCxsPW51bGw7cmV0dXJuIWJhLlhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIGN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3Qobil8fChjPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBjP2Mub25sb2FkPWMub25lcnJvcj1pOmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPjMmJmkoKX0sYy5vbnByb2dyZXNzPWZ1bmN0aW9uKG4pe3ZhciB0PXlhLmV2ZW50O3lhLmV2ZW50PW47dHJ5e2EucHJvZ3Jlc3MuY2FsbCh1LGMpfWZpbmFsbHl7eWEuZXZlbnQ9dH19LHUuaGVhZGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49KG4rIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP29bbl06KG51bGw9PXQ/ZGVsZXRlIG9bbl06b1tuXT10KyIiLHUpfSx1Lm1pbWVUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PW4/bnVsbDpuKyIiLHUpOnR9LHUucmVzcG9uc2VUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4sdSk6bH0sdS5yZXNwb25zZT1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLHV9LFsiZ2V0IiwicG9zdCJdLmZvckVhY2goZnVuY3Rpb24obil7dVtuXT1mdW5jdGlvbigpe3JldHVybiB1LnNlbmQuYXBwbHkodSxbbl0uY29uY2F0KHFhKGFyZ3VtZW50cykpKX19KSx1LnNlbmQ9ZnVuY3Rpb24oZSxyLGkpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKGk9cixyPW51bGwpLGMub3BlbihlLG4sITApLG51bGw9PXR8fCJhY2NlcHQiaW4gb3x8KG8uYWNjZXB0PXQrIiwqLyoiKSxjLnNldFJlcXVlc3RIZWFkZXIpZm9yKHZhciBhIGluIG8pYy5zZXRSZXF1ZXN0SGVhZGVyKGEsb1thXSk7cmV0dXJuIG51bGwhPXQmJmMub3ZlcnJpZGVNaW1lVHlwZSYmYy5vdmVycmlkZU1pbWVUeXBlKHQpLG51bGwhPWwmJihjLnJlc3BvbnNlVHlwZT1sKSxudWxsIT1pJiZ1Lm9uKCJlcnJvciIsaSkub24oImxvYWQiLGZ1bmN0aW9uKG4pe2kobnVsbCxuKX0pLGMuc2VuZChudWxsPT1yP251bGw6ciksdX0sdS5hYm9ydD1mdW5jdGlvbigpe3JldHVybiBjLmFib3J0KCksdX0seWEucmViaW5kKHUsYSwib24iKSxudWxsPT1yP3U6dS5nZXQoZHQocikpfWZ1bmN0aW9uIGR0KG4pe3JldHVybiAxPT09bi5sZW5ndGg/ZnVuY3Rpb24odCxlKXtuKG51bGw9PXQ/ZTpudWxsKX06bn1mdW5jdGlvbiBtdCgpe3ZhciBuPXZ0KCksdD15dCgpLW47dD4yND8oaXNGaW5pdGUodCkmJihjbGVhclRpbWVvdXQoc28pLHNvPXNldFRpbWVvdXQobXQsdCkpLGxvPTApOihsbz0xLGZvKG10KSl9ZnVuY3Rpb24gdnQoKXtmb3IodmFyIG49RGF0ZS5ub3coKSx0PW9vO3Q7KW4+PXQudGltZSYmKHQuZmx1c2g9dC5jYWxsYmFjayhuLXQudGltZSkpLHQ9dC5uZXh0O3JldHVybiBufWZ1bmN0aW9uIHl0KCl7Zm9yKHZhciBuLHQ9b28sZT0xLzA7dDspdC5mbHVzaD90PW4/bi5uZXh0PXQubmV4dDpvbz10Lm5leHQ6KHQudGltZTxlJiYoZT10LnRpbWUpLHQ9KG49dCkubmV4dCk7cmV0dXJuIGNvPW4sZX1mdW5jdGlvbiBNdChuLHQpe3ZhciBlPU1hdGgucG93KDEwLDMqTWF0aC5hYnMoOC10KSk7cmV0dXJue3NjYWxlOnQ+OD9mdW5jdGlvbihuKXtyZXR1cm4gbi9lfTpmdW5jdGlvbihuKXtyZXR1cm4gbiplfSxzeW1ib2w6bn19ZnVuY3Rpb24geHQobix0KXtyZXR1cm4gdC0obj9NYXRoLmNlaWwoTWF0aC5sb2cobikvTWF0aC5MTjEwKToxKX1mdW5jdGlvbiBidChuKXtyZXR1cm4gbisiIn1mdW5jdGlvbiBfdCgpe31mdW5jdGlvbiB3dChuLHQsZSl7dmFyIHI9ZS5zPW4rdCxpPXItbix1PXItaTtlLnQ9bi11Kyh0LWkpfWZ1bmN0aW9uIFN0KG4sdCl7biYmd28uaGFzT3duUHJvcGVydHkobi50eXBlKSYmd29bbi50eXBlXShuLHQpfWZ1bmN0aW9uIEV0KG4sdCxlKXt2YXIgcixpPS0xLHU9bi5sZW5ndGgtZTtmb3IodC5saW5lU3RhcnQoKTsrK2k8dTspcj1uW2ldLHQucG9pbnQoclswXSxyWzFdKTt0LmxpbmVFbmQoKX1mdW5jdGlvbiBrdChuLHQpe3ZhciBlPS0xLHI9bi5sZW5ndGg7Zm9yKHQucG9seWdvblN0YXJ0KCk7KytlPHI7KUV0KG5bZV0sdCwxKTt0LnBvbHlnb25FbmQoKX1mdW5jdGlvbiBBdCgpe2Z1bmN0aW9uIG4obix0KXtuKj1HYSx0PXQqR2EvMiskYS80O3ZhciBlPW4tcixhPU1hdGguY29zKHQpLG89TWF0aC5zaW4odCksYz11Km8sbD1pKmErYypNYXRoLmNvcyhlKSxzPWMqTWF0aC5zaW4oZSk7RW8uYWRkKE1hdGguYXRhbjIocyxsKSkscj1uLGk9YSx1PW99dmFyIHQsZSxyLGksdTtrby5wb2ludD1mdW5jdGlvbihhLG8pe2tvLnBvaW50PW4scj0odD1hKSpHYSxpPU1hdGguY29zKG89KGU9bykqR2EvMiskYS80KSx1PU1hdGguc2luKG8pfSxrby5saW5lRW5kPWZ1bmN0aW9uKCl7bih0LGUpfX1mdW5jdGlvbiBOdChuKXt2YXIgdD1uWzBdLGU9blsxXSxyPU1hdGguY29zKGUpO3JldHVybltyKk1hdGguY29zKHQpLHIqTWF0aC5zaW4odCksTWF0aC5zaW4oZSldfWZ1bmN0aW9uIHF0KG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV0rblsyXSp0WzJdfWZ1bmN0aW9uIFR0KG4sdCl7cmV0dXJuW25bMV0qdFsyXS1uWzJdKnRbMV0sblsyXSp0WzBdLW5bMF0qdFsyXSxuWzBdKnRbMV0tblsxXSp0WzBdXX1mdW5jdGlvbiBDdChuLHQpe25bMF0rPXRbMF0sblsxXSs9dFsxXSxuWzJdKz10WzJdfWZ1bmN0aW9uIHp0KG4sdCl7cmV0dXJuW25bMF0qdCxuWzFdKnQsblsyXSp0XX1mdW5jdGlvbiBEdChuKXt2YXIgdD1NYXRoLnNxcnQoblswXSpuWzBdK25bMV0qblsxXStuWzJdKm5bMl0pO25bMF0vPXQsblsxXS89dCxuWzJdLz10fWZ1bmN0aW9uIGp0KG4pe3JldHVybltNYXRoLmF0YW4yKG5bMV0sblswXSksSShuWzJdKV19ZnVuY3Rpb24gTHQobix0KXtyZXR1cm4gTWF0aC5hYnMoblswXS10WzBdKTxXYSYmTWF0aC5hYnMoblsxXS10WzFdKTxXYX1mdW5jdGlvbiBIdChuLHQpe24qPUdhO3ZhciBlPU1hdGguY29zKHQqPUdhKTtGdChlKk1hdGguY29zKG4pLGUqTWF0aC5zaW4obiksTWF0aC5zaW4odCkpfWZ1bmN0aW9uIEZ0KG4sdCxlKXsrK0FvLHFvKz0obi1xbykvQW8sVG8rPSh0LVRvKS9BbyxDbys9KGUtQ28pL0FvfWZ1bmN0aW9uIFB0KCl7ZnVuY3Rpb24gbihuLGkpe24qPUdhO3ZhciB1PU1hdGguY29zKGkqPUdhKSxhPXUqTWF0aC5jb3Mobiksbz11Kk1hdGguc2luKG4pLGM9TWF0aC5zaW4oaSksbD1NYXRoLmF0YW4yKE1hdGguc3FydCgobD1lKmMtcipvKSpsKyhsPXIqYS10KmMpKmwrKGw9dCpvLWUqYSkqbCksdCphK2UqbytyKmMpO05vKz1sLHpvKz1sKih0Kyh0PWEpKSxEbys9bCooZSsoZT1vKSksam8rPWwqKHIrKHI9YykpLEZ0KHQsZSxyKX12YXIgdCxlLHI7UG8ucG9pbnQ9ZnVuY3Rpb24oaSx1KXtpKj1HYTt2YXIgYT1NYXRoLmNvcyh1Kj1HYSk7dD1hKk1hdGguY29zKGkpLGU9YSpNYXRoLnNpbihpKSxyPU1hdGguc2luKHUpLFBvLnBvaW50PW4sRnQodCxlLHIpfX1mdW5jdGlvbiBPdCgpe1BvLnBvaW50PUh0fWZ1bmN0aW9uIFl0KCl7ZnVuY3Rpb24gbihuLHQpe24qPUdhO3ZhciBlPU1hdGguY29zKHQqPUdhKSxhPWUqTWF0aC5jb3Mobiksbz1lKk1hdGguc2luKG4pLGM9TWF0aC5zaW4odCksbD1pKmMtdSpvLHM9dSphLXIqYyxmPXIqby1pKmEsaD1NYXRoLnNxcnQobCpsK3MqcytmKmYpLGc9ciphK2kqbyt1KmMscD1oJiYtVShnKS9oLGQ9TWF0aC5hdGFuMihoLGcpO0xvKz1wKmwsSG8rPXAqcyxGbys9cCpmLE5vKz1kLHpvKz1kKihyKyhyPWEpKSxEbys9ZCooaSsoaT1vKSksam8rPWQqKHUrKHU9YykpLEZ0KHIsaSx1KX12YXIgdCxlLHIsaSx1O1BvLnBvaW50PWZ1bmN0aW9uKGEsbyl7dD1hLGU9byxQby5wb2ludD1uLGEqPUdhO3ZhciBjPU1hdGguY29zKG8qPUdhKTtyPWMqTWF0aC5jb3MoYSksaT1jKk1hdGguc2luKGEpLHU9TWF0aC5zaW4obyksRnQocixpLHUpfSxQby5saW5lRW5kPWZ1bmN0aW9uKCl7bih0LGUpLFBvLmxpbmVFbmQ9T3QsUG8ucG9pbnQ9SHR9fWZ1bmN0aW9uIFJ0KCl7cmV0dXJuITB9ZnVuY3Rpb24gVXQobix0LGUscixpKXt2YXIgdT1bXSxhPVtdO2lmKG4uZm9yRWFjaChmdW5jdGlvbihuKXtpZighKCh0PW4ubGVuZ3RoLTEpPD0wKSl7dmFyIHQsZT1uWzBdLHI9blt0XTtpZihMdChlLHIpKXtpLmxpbmVTdGFydCgpO2Zvcih2YXIgbz0wO3Q+bzsrK28paS5wb2ludCgoZT1uW29dKVswXSxlWzFdKTtyZXR1cm4gaS5saW5lRW5kKCksdm9pZCAwfXZhciBjPXtwb2ludDplLHBvaW50czpuLG90aGVyOm51bGwsdmlzaXRlZDohMSxlbnRyeTohMCxzdWJqZWN0OiEwfSxsPXtwb2ludDplLHBvaW50czpbZV0sb3RoZXI6Yyx2aXNpdGVkOiExLGVudHJ5OiExLHN1YmplY3Q6ITF9O2Mub3RoZXI9bCx1LnB1c2goYyksYS5wdXNoKGwpLGM9e3BvaW50OnIscG9pbnRzOltyXSxvdGhlcjpudWxsLHZpc2l0ZWQ6ITEsZW50cnk6ITEsc3ViamVjdDohMH0sbD17cG9pbnQ6cixwb2ludHM6W3JdLG90aGVyOmMsdmlzaXRlZDohMSxlbnRyeTohMCxzdWJqZWN0OiExfSxjLm90aGVyPWwsdS5wdXNoKGMpLGEucHVzaChsKX19KSxhLnNvcnQodCksSXQodSksSXQoYSksdS5sZW5ndGgpe2lmKGUpZm9yKHZhciBvPTEsYz0hZShhWzBdLnBvaW50KSxsPWEubGVuZ3RoO2w+bzsrK28pYVtvXS5lbnRyeT1jPSFjO2Zvcih2YXIgcyxmLGgsZz11WzBdOzspe2ZvcihzPWc7cy52aXNpdGVkOylpZigocz1zLm5leHQpPT09ZylyZXR1cm47Zj1zLnBvaW50cyxpLmxpbmVTdGFydCgpO2Rve2lmKHMudmlzaXRlZD1zLm90aGVyLnZpc2l0ZWQ9ITAscy5lbnRyeSl7aWYocy5zdWJqZWN0KWZvcih2YXIgbz0wO288Zi5sZW5ndGg7bysrKWkucG9pbnQoKGg9ZltvXSlbMF0saFsxXSk7ZWxzZSByKHMucG9pbnQscy5uZXh0LnBvaW50LDEsaSk7cz1zLm5leHR9ZWxzZXtpZihzLnN1YmplY3Qpe2Y9cy5wcmV2LnBvaW50cztmb3IodmFyIG89Zi5sZW5ndGg7LS1vPj0wOylpLnBvaW50KChoPWZbb10pWzBdLGhbMV0pfWVsc2UgcihzLnBvaW50LHMucHJldi5wb2ludCwtMSxpKTtzPXMucHJldn1zPXMub3RoZXIsZj1zLnBvaW50c313aGlsZSghcy52aXNpdGVkKTtpLmxpbmVFbmQoKX19fWZ1bmN0aW9uIEl0KG4pe2lmKHQ9bi5sZW5ndGgpe2Zvcih2YXIgdCxlLHI9MCxpPW5bMF07KytyPHQ7KWkubmV4dD1lPW5bcl0sZS5wcmV2PWksaT1lO2kubmV4dD1lPW5bMF0sZS5wcmV2PWl9fWZ1bmN0aW9uIFZ0KG4sdCxlLHIpe3JldHVybiBmdW5jdGlvbihpKXtmdW5jdGlvbiB1KHQsZSl7bih0LGUpJiZpLnBvaW50KHQsZSl9ZnVuY3Rpb24gYShuLHQpe2QucG9pbnQobix0KX1mdW5jdGlvbiBvKCl7bS5wb2ludD1hLGQubGluZVN0YXJ0KCl9ZnVuY3Rpb24gYygpe20ucG9pbnQ9dSxkLmxpbmVFbmQoKX1mdW5jdGlvbiBsKG4sdCl7eS5wb2ludChuLHQpLHAucHVzaChbbix0XSl9ZnVuY3Rpb24gcygpe3kubGluZVN0YXJ0KCkscD1bXX1mdW5jdGlvbiBmKCl7bChwWzBdWzBdLHBbMF1bMV0pLHkubGluZUVuZCgpO3ZhciBuLHQ9eS5jbGVhbigpLGU9di5idWZmZXIoKSxyPWUubGVuZ3RoO2lmKHAucG9wKCksZy5wdXNoKHApLHA9bnVsbCxyKXtpZigxJnQpe249ZVswXTt2YXIgdSxyPW4ubGVuZ3RoLTEsYT0tMTtmb3IoaS5saW5lU3RhcnQoKTsrK2E8cjspaS5wb2ludCgodT1uW2FdKVswXSx1WzFdKTtyZXR1cm4gaS5saW5lRW5kKCksdm9pZCAwfXI+MSYmMiZ0JiZlLnB1c2goZS5wb3AoKS5jb25jYXQoZS5zaGlmdCgpKSksaC5wdXNoKGUuZmlsdGVyKFh0KSl9fXZhciBoLGcscCxkPXQoaSksbT17cG9pbnQ6dSxsaW5lU3RhcnQ6byxsaW5lRW5kOmMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bS5wb2ludD1sLG0ubGluZVN0YXJ0PXMsbS5saW5lRW5kPWYsaD1bXSxnPVtdLGkucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXttLnBvaW50PXUsbS5saW5lU3RhcnQ9byxtLmxpbmVFbmQ9YyxoPXlhLm1lcmdlKGgpLGgubGVuZ3RoP1V0KGgsQnQsbnVsbCxlLGkpOnIoZykmJihpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCkpLGkucG9seWdvbkVuZCgpLGg9Zz1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtpLnBvbHlnb25TdGFydCgpLGkubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxpKSxpLmxpbmVFbmQoKSxpLnBvbHlnb25FbmQoKX19LHY9WnQoKSx5PXQodik7cmV0dXJuIG19fWZ1bmN0aW9uIFh0KG4pe3JldHVybiBuLmxlbmd0aD4xfWZ1bmN0aW9uIFp0KCl7dmFyIG4sdD1bXTtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5wdXNoKG49W10pfSxwb2ludDpmdW5jdGlvbih0LGUpe24ucHVzaChbdCxlXSl9LGxpbmVFbmQ6cyxidWZmZXI6ZnVuY3Rpb24oKXt2YXIgZT10O3JldHVybiB0PVtdLG49bnVsbCxlfSxyZWpvaW46ZnVuY3Rpb24oKXt0Lmxlbmd0aD4xJiZ0LnB1c2godC5wb3AoKS5jb25jYXQodC5zaGlmdCgpKSl9fX1mdW5jdGlvbiBCdChuLHQpe3JldHVybigobj1uLnBvaW50KVswXTwwP25bMV0tJGEvMi1XYTokYS8yLW5bMV0pLSgodD10LnBvaW50KVswXTwwP3RbMV0tJGEvMi1XYTokYS8yLXRbMV0pfWZ1bmN0aW9uICR0KG4sdCl7dmFyIGU9blswXSxyPW5bMV0saT1bTWF0aC5zaW4oZSksLU1hdGguY29zKGUpLDBdLHU9MCxhPSExLG89ITEsYz0wO0VvLnJlc2V0KCk7Zm9yKHZhciBsPTAscz10Lmxlbmd0aDtzPmw7KytsKXt2YXIgZj10W2xdLGg9Zi5sZW5ndGg7aWYoaCl7Zm9yKHZhciBnPWZbMF0scD1nWzBdLGQ9Z1sxXS8yKyRhLzQsbT1NYXRoLnNpbihkKSx2PU1hdGguY29zKGQpLHk9MTs7KXt5PT09aCYmKHk9MCksbj1mW3ldO3ZhciBNPW5bMF0seD1uWzFdLzIrJGEvNCxiPU1hdGguc2luKHgpLF89TWF0aC5jb3MoeCksdz1NLXAsUz1NYXRoLmFicyh3KT4kYSxFPW0qYjtpZihFby5hZGQoTWF0aC5hdGFuMihFKk1hdGguc2luKHcpLHYqXytFKk1hdGguY29zKHcpKSksTWF0aC5hYnMoeCk8V2EmJihvPSEwKSx1Kz1TP3crKHc+PTA/MjotMikqJGE6dyxTXnA+PWVeTT49ZSl7dmFyIGs9VHQoTnQoZyksTnQobikpO0R0KGspO3ZhciBBPVR0KGksayk7RHQoQSk7dmFyIE49KFNedz49MD8tMToxKSpJKEFbMl0pO3I+TiYmKGMrPVNedz49MD8xOi0xKX1pZigheSsrKWJyZWFrO3A9TSxtPWIsdj1fLGc9bn1NYXRoLmFicyh1KT5XYSYmKGE9ITApfX1yZXR1cm4oIW8mJiFhJiYwPkVvfHwtV2E+dSleMSZjfWZ1bmN0aW9uIFd0KG4pe3ZhciB0LGU9MC8wLHI9MC8wLGk9MC8wO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLmxpbmVTdGFydCgpLHQ9MX0scG9pbnQ6ZnVuY3Rpb24odSxhKXt2YXIgbz11PjA/JGE6LSRhLGM9TWF0aC5hYnModS1lKTtNYXRoLmFicyhjLSRhKTxXYT8obi5wb2ludChlLHI9KHIrYSkvMj4wPyRhLzI6LSRhLzIpLG4ucG9pbnQoaSxyKSxuLmxpbmVFbmQoKSxuLmxpbmVTdGFydCgpLG4ucG9pbnQobyxyKSxuLnBvaW50KHUsciksdD0wKTppIT09byYmYz49JGEmJihNYXRoLmFicyhlLWkpPFdhJiYoZS09aSpXYSksTWF0aC5hYnModS1vKTxXYSYmKHUtPW8qV2EpLHI9SnQoZSxyLHUsYSksbi5wb2ludChpLHIpLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChvLHIpLHQ9MCksbi5wb2ludChlPXUscj1hKSxpPW99LGxpbmVFbmQ6ZnVuY3Rpb24oKXtuLmxpbmVFbmQoKSxlPXI9MC8wfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLXR9fX1mdW5jdGlvbiBKdChuLHQsZSxyKXt2YXIgaSx1LGE9TWF0aC5zaW4obi1lKTtyZXR1cm4gTWF0aC5hYnMoYSk+V2E/TWF0aC5hdGFuKChNYXRoLnNpbih0KSoodT1NYXRoLmNvcyhyKSkqTWF0aC5zaW4oZSktTWF0aC5zaW4ocikqKGk9TWF0aC5jb3ModCkpKk1hdGguc2luKG4pKS8oaSp1KmEpKToodCtyKS8yfWZ1bmN0aW9uIEd0KG4sdCxlLHIpe3ZhciBpO2lmKG51bGw9PW4paT1lKiRhLzIsci5wb2ludCgtJGEsaSksci5wb2ludCgwLGkpLHIucG9pbnQoJGEsaSksci5wb2ludCgkYSwwKSxyLnBvaW50KCRhLC1pKSxyLnBvaW50KDAsLWkpLHIucG9pbnQoLSRhLC1pKSxyLnBvaW50KC0kYSwwKSxyLnBvaW50KC0kYSxpKTtlbHNlIGlmKE1hdGguYWJzKG5bMF0tdFswXSk+V2Epe3ZhciB1PShuWzBdPHRbMF0/MTotMSkqJGE7aT1lKnUvMixyLnBvaW50KC11LGkpLHIucG9pbnQoMCxpKSxyLnBvaW50KHUsaSl9ZWxzZSByLnBvaW50KHRbMF0sdFsxXSl9ZnVuY3Rpb24gS3Qobil7cmV0dXJuICR0KFlvLG4pfWZ1bmN0aW9uIFF0KG4pe2Z1bmN0aW9uIHQobix0KXtyZXR1cm4gTWF0aC5jb3MobikqTWF0aC5jb3ModCk+YX1mdW5jdGlvbiBlKG4pe3ZhciBlLHUsYSxjLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2M9YT0hMSxzPTF9LHBvaW50OmZ1bmN0aW9uKGYsaCl7dmFyIGcscD1bZixoXSxkPXQoZixoKSxtPW8/ZD8wOmkoZixoKTpkP2koZisoMD5mPyRhOi0kYSksaCk6MDtpZighZSYmKGM9YT1kKSYmbi5saW5lU3RhcnQoKSxkIT09YSYmKGc9cihlLHApLChMdChlLGcpfHxMdChwLGcpKSYmKHBbMF0rPVdhLHBbMV0rPVdhLGQ9dChwWzBdLHBbMV0pKSksZCE9PWEpcz0wLGQ/KG4ubGluZVN0YXJ0KCksZz1yKHAsZSksbi5wb2ludChnWzBdLGdbMV0pKTooZz1yKGUscCksbi5wb2ludChnWzBdLGdbMV0pLG4ubGluZUVuZCgpKSxlPWc7ZWxzZSBpZihsJiZlJiZvXmQpe3ZhciB2O20mdXx8ISh2PXIocCxlLCEwKSl8fChzPTAsbz8obi5saW5lU3RhcnQoKSxuLnBvaW50KHZbMF1bMF0sdlswXVsxXSksbi5wb2ludCh2WzFdWzBdLHZbMV1bMV0pLG4ubGluZUVuZCgpKToobi5wb2ludCh2WzFdWzBdLHZbMV1bMV0pLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludCh2WzBdWzBdLHZbMF1bMV0pKSl9IWR8fGUmJkx0KGUscCl8fG4ucG9pbnQocFswXSxwWzFdKSxlPXAsYT1kLHU9bX0sbGluZUVuZDpmdW5jdGlvbigpe2EmJm4ubGluZUVuZCgpLGU9bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gc3woYyYmYSk8PDF9fX1mdW5jdGlvbiByKG4sdCxlKXt2YXIgcj1OdChuKSxpPU50KHQpLHU9WzEsMCwwXSxvPVR0KHIsaSksYz1xdChvLG8pLGw9b1swXSxzPWMtbCpsO2lmKCFzKXJldHVybiFlJiZuO3ZhciBmPWEqYy9zLGg9LWEqbC9zLGc9VHQodSxvKSxwPXp0KHUsZiksZD16dChvLGgpO0N0KHAsZCk7dmFyIG09Zyx2PXF0KHAsbSkseT1xdChtLG0pLE09dip2LXkqKHF0KHAscCktMSk7aWYoISgwPk0pKXt2YXIgeD1NYXRoLnNxcnQoTSksYj16dChtLCgtdi14KS95KTtpZihDdChiLHApLGI9anQoYiksIWUpcmV0dXJuIGI7dmFyIF8sdz1uWzBdLFM9dFswXSxFPW5bMV0saz10WzFdO3c+UyYmKF89dyx3PVMsUz1fKTt2YXIgQT1TLXcsTj1NYXRoLmFicyhBLSRhKTxXYSxxPU58fFdhPkE7aWYoIU4mJkU+ayYmKF89RSxFPWssaz1fKSxxP04/RStrPjBeYlsxXTwoTWF0aC5hYnMoYlswXS13KTxXYT9FOmspOkU8PWJbMV0mJmJbMV08PWs6QT4kYV4odzw9YlswXSYmYlswXTw9Uykpe3ZhciBUPXp0KG0sKC12K3gpL3kpO3JldHVybiBDdChULHApLFtiLGp0KFQpXX19fWZ1bmN0aW9uIGkodCxlKXt2YXIgcj1vP246JGEtbixpPTA7cmV0dXJuLXI+dD9pfD0xOnQ+ciYmKGl8PTIpLC1yPmU/aXw9NDplPnImJihpfD04KSxpfWZ1bmN0aW9uIHUobil7cmV0dXJuICR0KGMsbil9dmFyIGE9TWF0aC5jb3Mobiksbz1hPjAsYz1bbiwwXSxsPU1hdGguYWJzKGEpPldhLHM9U2Uobiw2KkdhKTtyZXR1cm4gVnQodCxlLHMsdSl9ZnVuY3Rpb24gbmUobix0LGUscil7ZnVuY3Rpb24gaShyLGkpe3JldHVybiBNYXRoLmFicyhyWzBdLW4pPFdhP2k+MD8wOjM6TWF0aC5hYnMoclswXS1lKTxXYT9pPjA/MjoxOk1hdGguYWJzKHJbMV0tdCk8V2E/aT4wPzE6MDppPjA/MzoyfWZ1bmN0aW9uIHUobix0KXtyZXR1cm4gYShuLnBvaW50LHQucG9pbnQpfWZ1bmN0aW9uIGEobix0KXt2YXIgZT1pKG4sMSkscj1pKHQsMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT90WzFdLW5bMV06MT09PWU/blswXS10WzBdOjI9PT1lP25bMV0tdFsxXTp0WzBdLW5bMF19ZnVuY3Rpb24gbyhpLHUpe3ZhciBhPXVbMF0taVswXSxvPXVbMV0taVsxXSxjPVswLDFdO3JldHVybiBNYXRoLmFicyhhKTxXYSYmTWF0aC5hYnMobyk8V2E/bjw9aVswXSYmaVswXTw9ZSYmdDw9aVsxXSYmaVsxXTw9cjp0ZShuLWlbMF0sYSxjKSYmdGUoaVswXS1lLC1hLGMpJiZ0ZSh0LWlbMV0sbyxjKSYmdGUoaVsxXS1yLC1vLGMpPyhjWzFdPDEmJih1WzBdPWlbMF0rY1sxXSphLHVbMV09aVsxXStjWzFdKm8pLGNbMF0+MCYmKGlbMF0rPWNbMF0qYSxpWzFdKz1jWzBdKm8pLCEwKTohMX1yZXR1cm4gZnVuY3Rpb24oYyl7ZnVuY3Rpb24gbCh1KXt2YXIgYT1pKHUsLTEpLG89cyhbMD09PWF8fDM9PT1hP246ZSxhPjE/cjp0XSk7cmV0dXJuIG99ZnVuY3Rpb24gcyhuKXtmb3IodmFyIHQ9MCxlPU0ubGVuZ3RoLHI9blsxXSxpPTA7ZT5pOysraSlmb3IodmFyIHUsYT0xLG89TVtpXSxjPW8ubGVuZ3RoLGw9b1swXTtjPmE7KythKXU9b1thXSxsWzFdPD1yP3VbMV0+ciYmZihsLHUsbik+MCYmKyt0OnVbMV08PXImJmYobCx1LG4pPDAmJi0tdCxsPXU7cmV0dXJuIDAhPT10fWZ1bmN0aW9uIGYobix0LGUpe3JldHVybih0WzBdLW5bMF0pKihlWzFdLW5bMV0pLShlWzBdLW5bMF0pKih0WzFdLW5bMV0pfWZ1bmN0aW9uIGgodSxvLGMsbCl7dmFyIHM9MCxmPTA7aWYobnVsbD09dXx8KHM9aSh1LGMpKSE9PShmPWkobyxjKSl8fGEodSxvKTwwXmM+MCl7ZG8gbC5wb2ludCgwPT09c3x8Mz09PXM/bjplLHM+MT9yOnQpO3doaWxlKChzPShzK2MrNCklNCkhPT1mKX1lbHNlIGwucG9pbnQob1swXSxvWzFdKX1mdW5jdGlvbiBnKGksdSl7cmV0dXJuIGk+PW4mJmU+PWkmJnU+PXQmJnI+PXV9ZnVuY3Rpb24gcChuLHQpe2cobix0KSYmYy5wb2ludChuLHQpfWZ1bmN0aW9uIGQoKXtULnBvaW50PXYsTSYmTS5wdXNoKHg9W10pLEE9ITAsaz0hMSxTPUU9MC8wfWZ1bmN0aW9uIG0oKXt5JiYodihiLF8pLHcmJmsmJnEucmVqb2luKCkseS5wdXNoKHEuYnVmZmVyKCkpKSxULnBvaW50PXAsayYmYy5saW5lRW5kKCl9ZnVuY3Rpb24gdihuLHQpe249TWF0aC5tYXgoLVJvLE1hdGgubWluKFJvLG4pKSx0PU1hdGgubWF4KC1SbyxNYXRoLm1pbihSbyx0KSk7dmFyIGU9ZyhuLHQpO2lmKE0mJngucHVzaChbbix0XSksQSliPW4sXz10LHc9ZSxBPSExLGUmJihjLmxpbmVTdGFydCgpLGMucG9pbnQobix0KSk7ZWxzZSBpZihlJiZrKWMucG9pbnQobix0KTtlbHNle3ZhciByPVtTLEVdLGk9W24sdF07byhyLGkpPyhrfHwoYy5saW5lU3RhcnQoKSxjLnBvaW50KHJbMF0sclsxXSkpLGMucG9pbnQoaVswXSxpWzFdKSxlfHxjLmxpbmVFbmQoKSk6ZSYmKGMubGluZVN0YXJ0KCksYy5wb2ludChuLHQpKX1TPW4sRT10LGs9ZX12YXIgeSxNLHgsYixfLHcsUyxFLGssQSxOPWMscT1adCgpLFQ9e3BvaW50OnAsbGluZVN0YXJ0OmQsbGluZUVuZDptLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2M9cSx5PVtdLE09W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtjPU4sKHk9eWEubWVyZ2UoeSkpLmxlbmd0aD8oYy5wb2x5Z29uU3RhcnQoKSxVdCh5LHUsbCxoLGMpLGMucG9seWdvbkVuZCgpKTpzKFtuLHRdKSYmKGMucG9seWdvblN0YXJ0KCksYy5saW5lU3RhcnQoKSxoKG51bGwsbnVsbCwxLGMpLGMubGluZUVuZCgpLGMucG9seWdvbkVuZCgpKSx5PU09eD1udWxsfX07cmV0dXJuIFR9fWZ1bmN0aW9uIHRlKG4sdCxlKXtpZihNYXRoLmFicyh0KTxXYSlyZXR1cm4gMD49bjt2YXIgcj1uL3Q7aWYodD4wKXtpZihyPmVbMV0pcmV0dXJuITE7cj5lWzBdJiYoZVswXT1yKX1lbHNle2lmKHI8ZVswXSlyZXR1cm4hMTtyPGVbMV0mJihlWzFdPXIpfXJldHVybiEwfWZ1bmN0aW9uIGVlKG4sdCl7ZnVuY3Rpb24gZShlLHIpe3JldHVybiBlPW4oZSxyKSx0KGVbMF0sZVsxXSl9cmV0dXJuIG4uaW52ZXJ0JiZ0LmludmVydCYmKGUuaW52ZXJ0PWZ1bmN0aW9uKGUscil7cmV0dXJuIGU9dC5pbnZlcnQoZSxyKSxlJiZuLmludmVydChlWzBdLGVbMV0pfSksZX1mdW5jdGlvbiByZShuKXt2YXIgdD0wLGU9JGEvMyxyPXZlKG4pLGk9cih0LGUpO3JldHVybiBpLnBhcmFsbGVscz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9yKHQ9blswXSokYS8xODAsZT1uWzFdKiRhLzE4MCk6WzE4MCoodC8kYSksMTgwKihlLyRhKV19LGl9ZnVuY3Rpb24gaWUobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9TWF0aC5zcXJ0KHUtMippKk1hdGguc2luKHQpKS9pO3JldHVybltlKk1hdGguc2luKG4qPWkpLGEtZSpNYXRoLmNvcyhuKV19dmFyIHI9TWF0aC5zaW4obiksaT0ocitNYXRoLnNpbih0KSkvMix1PTErciooMippLXIpLGE9TWF0aC5zcXJ0KHUpL2k7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7dmFyIGU9YS10O3JldHVybltNYXRoLmF0YW4yKG4sZSkvaSxJKCh1LShuKm4rZSplKSppKmkpLygyKmkpKV19LGV9ZnVuY3Rpb24gdWUoKXtmdW5jdGlvbiBuKG4sdCl7SW8rPWkqbi1yKnQscj1uLGk9dH12YXIgdCxlLHIsaTskby5wb2ludD1mdW5jdGlvbih1LGEpeyRvLnBvaW50PW4sdD1yPXUsZT1pPWF9LCRvLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIGFlKG4sdCl7Vm8+biYmKFZvPW4pLG4+Wm8mJihabz1uKSxYbz50JiYoWG89dCksdD5CbyYmKEJvPXQpfWZ1bmN0aW9uIG9lKCl7ZnVuY3Rpb24gbihuLHQpe2EucHVzaCgiTSIsbiwiLCIsdCx1KX1mdW5jdGlvbiB0KG4sdCl7YS5wdXNoKCJNIixuLCIsIix0KSxvLnBvaW50PWV9ZnVuY3Rpb24gZShuLHQpe2EucHVzaCgiTCIsbiwiLCIsdCl9ZnVuY3Rpb24gcigpe28ucG9pbnQ9bn1mdW5jdGlvbiBpKCl7YS5wdXNoKCJaIil9dmFyIHU9Y2UoNC41KSxhPVtdLG89e3BvaW50Om4sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7by5wb2ludD10fSxsaW5lRW5kOnIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7by5saW5lRW5kPWl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtvLmxpbmVFbmQ9cixvLnBvaW50PW59LHBvaW50UmFkaXVzOmZ1bmN0aW9uKG4pe3JldHVybiB1PWNlKG4pLG99LHJlc3VsdDpmdW5jdGlvbigpe2lmKGEubGVuZ3RoKXt2YXIgbj1hLmpvaW4oIiIpO3JldHVybiBhPVtdLG59fX07cmV0dXJuIG99ZnVuY3Rpb24gY2Uobil7cmV0dXJuIm0wLCIrbisiYSIrbisiLCIrbisiIDAgMSwxIDAsIistMipuKyJhIituKyIsIituKyIgMCAxLDEgMCwiKzIqbisieiJ9ZnVuY3Rpb24gbGUobix0KXtxbys9bixUbys9dCwrK0NvfWZ1bmN0aW9uIHNlKCl7ZnVuY3Rpb24gbihuLHIpe3ZhciBpPW4tdCx1PXItZSxhPU1hdGguc3FydChpKmkrdSp1KTt6bys9YSoodCtuKS8yLERvKz1hKihlK3IpLzIsam8rPWEsbGUodD1uLGU9cil9dmFyIHQsZTtKby5wb2ludD1mdW5jdGlvbihyLGkpe0pvLnBvaW50PW4sbGUodD1yLGU9aSl9fWZ1bmN0aW9uIGZlKCl7Sm8ucG9pbnQ9bGV9ZnVuY3Rpb24gaGUoKXtmdW5jdGlvbiBuKG4sdCl7dmFyIGU9bi1yLHU9dC1pLGE9TWF0aC5zcXJ0KGUqZSt1KnUpO3pvKz1hKihyK24pLzIsRG8rPWEqKGkrdCkvMixqbys9YSxhPWkqbi1yKnQsTG8rPWEqKHIrbiksSG8rPWEqKGkrdCksRm8rPTMqYSxsZShyPW4saT10KX12YXIgdCxlLHIsaTtKby5wb2ludD1mdW5jdGlvbih1LGEpe0pvLnBvaW50PW4sbGUodD1yPXUsZT1pPWEpfSxKby5saW5lRW5kPWZ1bmN0aW9uKCl7bih0LGUpfX1mdW5jdGlvbiBnZShuKXtmdW5jdGlvbiB0KHQsZSl7bi5tb3ZlVG8odCxlKSxuLmFyYyh0LGUsYSwwLDIqJGEpfWZ1bmN0aW9uIGUodCxlKXtuLm1vdmVUbyh0LGUpLG8ucG9pbnQ9cn1mdW5jdGlvbiByKHQsZSl7bi5saW5lVG8odCxlKX1mdW5jdGlvbiBpKCl7by5wb2ludD10fWZ1bmN0aW9uIHUoKXtuLmNsb3NlUGF0aCgpfXZhciBhPTQuNSxvPXtwb2ludDp0LGxpbmVTdGFydDpmdW5jdGlvbigpe28ucG9pbnQ9ZX0sbGluZUVuZDppLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe28ubGluZUVuZD11fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7by5saW5lRW5kPWksby5wb2ludD10fSxwb2ludFJhZGl1czpmdW5jdGlvbihuKXtyZXR1cm4gYT1uLG99LHJlc3VsdDpzfTtyZXR1cm4gb31mdW5jdGlvbiBwZShuKXtmdW5jdGlvbiB0KHQpe2Z1bmN0aW9uIHIoZSxyKXtlPW4oZSxyKSx0LnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gaSgpe009MC8wLFMucG9pbnQ9YSx0LmxpbmVTdGFydCgpfWZ1bmN0aW9uIGEocixpKXt2YXIgYT1OdChbcixpXSksbz1uKHIsaSk7ZShNLHgseSxiLF8sdyxNPW9bMF0seD1vWzFdLHk9cixiPWFbMF0sXz1hWzFdLHc9YVsyXSx1LHQpLHQucG9pbnQoTSx4KX1mdW5jdGlvbiBvKCl7Uy5wb2ludD1yLHQubGluZUVuZCgpfWZ1bmN0aW9uIGMoKXtpKCksUy5wb2ludD1sLFMubGluZUVuZD1zfWZ1bmN0aW9uIGwobix0KXthKGY9bixoPXQpLGc9TSxwPXgsZD1iLG09Xyx2PXcsUy5wb2ludD1hfWZ1bmN0aW9uIHMoKXtlKE0seCx5LGIsXyx3LGcscCxmLGQsbSx2LHUsdCksUy5saW5lRW5kPW8sbygpfXZhciBmLGgsZyxwLGQsbSx2LHksTSx4LGIsXyx3LFM9e3BvaW50OnIsbGluZVN0YXJ0OmksbGluZUVuZDpvLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3QucG9seWdvblN0YXJ0KCksUy5saW5lU3RhcnQ9Y30scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpLFMubGluZVN0YXJ0PWl9fTtyZXR1cm4gU31mdW5jdGlvbiBlKHQsdSxhLG8sYyxsLHMsZixoLGcscCxkLG0sdil7dmFyIHk9cy10LE09Zi11LHg9eSp5K00qTTtpZih4PjQqciYmbS0tKXt2YXIgYj1vK2csXz1jK3Asdz1sK2QsUz1NYXRoLnNxcnQoYipiK18qXyt3KncpLEU9TWF0aC5hc2luKHcvPVMpLGs9TWF0aC5hYnMoTWF0aC5hYnModyktMSk8V2E/KGEraCkvMjpNYXRoLmF0YW4yKF8sYiksQT1uKGssRSksTj1BWzBdLHE9QVsxXSxUPU4tdCxDPXEtdSx6PU0qVC15KkM7KHoqei94PnJ8fE1hdGguYWJzKCh5KlQrTSpDKS94LS41KT4uM3x8aT5vKmcrYypwK2wqZCkmJihlKHQsdSxhLG8sYyxsLE4scSxrLGIvPVMsXy89Uyx3LG0sdiksdi5wb2ludChOLHEpLGUoTixxLGssYixfLHcscyxmLGgsZyxwLGQsbSx2KSl9fXZhciByPS41LGk9TWF0aC5jb3MoMzAqR2EpLHU9MTY7cmV0dXJuIHQucHJlY2lzaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PShyPW4qbik+MCYmMTYsdCk6TWF0aC5zcXJ0KHIpfSx0fWZ1bmN0aW9uIGRlKG4pe3ZhciB0PXBlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oW3QqS2EsZSpLYV0pfSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBuPXQobikse3BvaW50OmZ1bmN0aW9uKHQsZSl7bi5wb2ludCh0KkdhLGUqR2EpfSxzcGhlcmU6ZnVuY3Rpb24oKXtuLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7bi5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25FbmQoKX19fX1mdW5jdGlvbiBtZShuKXtyZXR1cm4gdmUoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKCl9ZnVuY3Rpb24gdmUobil7ZnVuY3Rpb24gdChuKXtyZXR1cm4gbj1vKG5bMF0qR2EsblsxXSpHYSksW25bMF0qaCtjLGwtblsxXSpoXX1mdW5jdGlvbiBlKG4pe3JldHVybiBuPW8uaW52ZXJ0KChuWzBdLWMpL2gsKGwtblsxXSkvaCksbiYmW25bMF0qS2EsblsxXSpLYV19ZnVuY3Rpb24gcigpe289ZWUoYT14ZSh2LHksTSksdSk7dmFyIG49dShkLG0pO3JldHVybiBjPWctblswXSpoLGw9cCtuWzFdKmgsaSgpfWZ1bmN0aW9uIGkoKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEscz1udWxsKSx0fXZhciB1LGEsbyxjLGwscyxmPXBlKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49dShuLHQpLFtuWzBdKmgrYyxsLW5bMV0qaF19KSxoPTE1MCxnPTQ4MCxwPTI1MCxkPTAsbT0wLHY9MCx5PTAsTT0wLHg9T28sYj1odCxfPW51bGwsdz1udWxsO3JldHVybiB0LnN0cmVhbT1mdW5jdGlvbihuKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEpLHM9eWUoYSx4KGYoYihuKSkpKSxzLnZhbGlkPSEwLHN9LHQuY2xpcEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PW51bGw9PW4/KF89bixPbyk6UXQoKF89K24pKkdhKSxpKCkpOl99LHQuY2xpcEV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odz1uLGI9bnVsbD09bj9odDpuZShuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdKSxpKCkpOnd9LHQuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K24scigpKTpofSx0LnRyYW5zbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz0rblswXSxwPStuWzFdLHIoKSk6W2cscF19LHQuY2VudGVyPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPW5bMF0lMzYwKkdhLG09blsxXSUzNjAqR2EscigpKTpbZCpLYSxtKkthXX0sdC5yb3RhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9blswXSUzNjAqR2EseT1uWzFdJTM2MCpHYSxNPW4ubGVuZ3RoPjI/blsyXSUzNjAqR2E6MCxyKCkpOlt2KkthLHkqS2EsTSpLYV19LHlhLnJlYmluZCh0LGYsInByZWNpc2lvbiIpLGZ1bmN0aW9uKCl7cmV0dXJuIHU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC5pbnZlcnQ9dS5pbnZlcnQmJmUscigpfX1mdW5jdGlvbiB5ZShuLHQpe3JldHVybntwb2ludDpmdW5jdGlvbihlLHIpe3I9bihlKkdhLHIqR2EpLGU9clswXSx0LnBvaW50KGU+JGE/ZS0yKiRhOi0kYT5lP2UrMiokYTplLHJbMV0pfSxzcGhlcmU6ZnVuY3Rpb24oKXt0LnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dC5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3QucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25FbmQoKX19fWZ1bmN0aW9uIE1lKG4sdCl7cmV0dXJuW24sdF19ZnVuY3Rpb24geGUobix0LGUpe3JldHVybiBuP3R8fGU/ZWUoX2Uobiksd2UodCxlKSk6X2Uobik6dHx8ZT93ZSh0LGUpOk1lfWZ1bmN0aW9uIGJlKG4pe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0Kz1uLFt0PiRhP3QtMiokYTotJGE+dD90KzIqJGE6dCxlXX19ZnVuY3Rpb24gX2Uobil7dmFyIHQ9YmUobik7cmV0dXJuIHQuaW52ZXJ0PWJlKC1uKSx0fWZ1bmN0aW9uIHdlKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguY29zKHQpLG89TWF0aC5jb3MobikqZSxjPU1hdGguc2luKG4pKmUsbD1NYXRoLnNpbih0KSxzPWwqcitvKmk7cmV0dXJuW01hdGguYXRhbjIoYyp1LXMqYSxvKnItbCppKSxJKHMqdStjKmEpXX12YXIgcj1NYXRoLmNvcyhuKSxpPU1hdGguc2luKG4pLHU9TWF0aC5jb3ModCksYT1NYXRoLnNpbih0KTtyZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1NYXRoLmNvcyh0KSxvPU1hdGguY29zKG4pKmUsYz1NYXRoLnNpbihuKSplLGw9TWF0aC5zaW4odCkscz1sKnUtYyphO3JldHVybltNYXRoLmF0YW4yKGMqdStsKmEsbypyK3MqaSksSShzKnItbyppKV19LGV9ZnVuY3Rpb24gU2Uobix0KXt2YXIgZT1NYXRoLmNvcyhuKSxyPU1hdGguc2luKG4pO3JldHVybiBmdW5jdGlvbihpLHUsYSxvKXtudWxsIT1pPyhpPUVlKGUsaSksdT1FZShlLHUpLChhPjA/dT5pOmk+dSkmJihpKz0yKmEqJGEpKTooaT1uKzIqYSokYSx1PW4pO2Zvcih2YXIgYyxsPWEqdCxzPWk7YT4wP3M+dTp1PnM7cy09bClvLnBvaW50KChjPWp0KFtlLC1yKk1hdGguY29zKHMpLC1yKk1hdGguc2luKHMpXSkpWzBdLGNbMV0pfX1mdW5jdGlvbiBFZShuLHQpe3ZhciBlPU50KHQpO2VbMF0tPW4sRHQoZSk7dmFyIHI9VSgtZVsxXSk7cmV0dXJuKCgtZVsyXTwwPy1yOnIpKzIqTWF0aC5QSS1XYSklKDIqTWF0aC5QSSl9ZnVuY3Rpb24ga2Uobix0LGUpe3ZhciByPXlhLnJhbmdlKG4sdC1XYSxlKS5jb25jYXQodCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiByLm1hcChmdW5jdGlvbih0KXtyZXR1cm5bbix0XX0pfX1mdW5jdGlvbiBBZShuLHQsZSl7dmFyIHI9eWEucmFuZ2Uobix0LVdhLGUpLmNvbmNhdCh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKHQpe3JldHVyblt0LG5dfSl9fWZ1bmN0aW9uIE5lKG4pe3JldHVybiBuLnNvdXJjZX1mdW5jdGlvbiBxZShuKXtyZXR1cm4gbi50YXJnZXR9ZnVuY3Rpb24gVGUobix0LGUscil7dmFyIGk9TWF0aC5jb3ModCksdT1NYXRoLnNpbih0KSxhPU1hdGguY29zKHIpLG89TWF0aC5zaW4ociksYz1pKk1hdGguY29zKG4pLGw9aSpNYXRoLnNpbihuKSxzPWEqTWF0aC5jb3MoZSksZj1hKk1hdGguc2luKGUpLGg9MipNYXRoLmFzaW4oTWF0aC5zcXJ0KFooci10KStpKmEqWihlLW4pKSksZz0xL01hdGguc2luKGgpLHA9aD9mdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNpbihuKj1oKSpnLGU9TWF0aC5zaW4oaC1uKSpnLHI9ZSpjK3QqcyxpPWUqbCt0KmYsYT1lKnUrdCpvO3JldHVybltNYXRoLmF0YW4yKGkscikqS2EsTWF0aC5hdGFuMihhLE1hdGguc3FydChyKnIraSppKSkqS2FdfTpmdW5jdGlvbigpe3JldHVybltuKkthLHQqS2FdfTtyZXR1cm4gcC5kaXN0YW5jZT1oLHB9ZnVuY3Rpb24gQ2UoKXtmdW5jdGlvbiBuKG4saSl7dmFyIHU9TWF0aC5zaW4oaSo9R2EpLGE9TWF0aC5jb3MoaSksbz1NYXRoLmFicygobio9R2EpLXQpLGM9TWF0aC5jb3Mobyk7R28rPU1hdGguYXRhbjIoTWF0aC5zcXJ0KChvPWEqTWF0aC5zaW4obykpKm8rKG89cip1LWUqYSpjKSpvKSxlKnUrciphKmMpLHQ9bixlPXUscj1hfXZhciB0LGUscjtLby5wb2ludD1mdW5jdGlvbihpLHUpe3Q9aSpHYSxlPU1hdGguc2luKHUqPUdhKSxyPU1hdGguY29zKHUpLEtvLnBvaW50PW59LEtvLmxpbmVFbmQ9ZnVuY3Rpb24oKXtLby5wb2ludD1Lby5saW5lRW5kPXN9fWZ1bmN0aW9uIHplKG4sdCl7ZnVuY3Rpb24gZSh0LGUpe3ZhciByPU1hdGguY29zKHQpLGk9TWF0aC5jb3MoZSksdT1uKHIqaSk7cmV0dXJuW3UqaSpNYXRoLnNpbih0KSx1Kk1hdGguc2luKGUpXX1yZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obixlKXt2YXIgcj1NYXRoLnNxcnQobipuK2UqZSksaT10KHIpLHU9TWF0aC5zaW4oaSksYT1NYXRoLmNvcyhpKTtyZXR1cm5bTWF0aC5hdGFuMihuKnUsciphKSxNYXRoLmFzaW4ociYmZSp1L3IpXX0sZX1mdW5jdGlvbiBEZShuLHQpe2Z1bmN0aW9uIGUobix0KXt2YXIgZT1NYXRoLmFicyhNYXRoLmFicyh0KS0kYS8yKTxXYT8wOmEvTWF0aC5wb3coaSh0KSx1KTtyZXR1cm5bZSpNYXRoLnNpbih1Km4pLGEtZSpNYXRoLmNvcyh1Km4pXX12YXIgcj1NYXRoLmNvcyhuKSxpPWZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnRhbigkYS80K24vMil9LHU9bj09PXQ/TWF0aC5zaW4obik6TWF0aC5sb2coci9NYXRoLmNvcyh0KSkvTWF0aC5sb2coaSh0KS9pKG4pKSxhPXIqTWF0aC5wb3coaShuKSx1KS91O3JldHVybiB1PyhlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPWEtdCxyPVIodSkqTWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybltNYXRoLmF0YW4yKG4sZSkvdSwyKk1hdGguYXRhbihNYXRoLnBvdyhhL3IsMS91KSktJGEvMl19LGUpOkxlfWZ1bmN0aW9uIGplKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPXUtdDtyZXR1cm5bZSpNYXRoLnNpbihpKm4pLHUtZSpNYXRoLmNvcyhpKm4pXX12YXIgcj1NYXRoLmNvcyhuKSxpPW49PT10P01hdGguc2luKG4pOihyLU1hdGguY29zKHQpKS8odC1uKSx1PXIvaStuO3JldHVybiBNYXRoLmFicyhpKTxXYT9NZTooZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT11LXQ7cmV0dXJuW01hdGguYXRhbjIobixlKS9pLHUtUihpKSpNYXRoLnNxcnQobipuK2UqZSldfSxlKX1mdW5jdGlvbiBMZShuLHQpe3JldHVybltuLE1hdGgubG9nKE1hdGgudGFuKCRhLzQrdC8yKSldfWZ1bmN0aW9uIEhlKG4pe3ZhciB0LGU9bWUobikscj1lLnNjYWxlLGk9ZS50cmFuc2xhdGUsdT1lLmNsaXBFeHRlbnQ7cmV0dXJuIGUuc2NhbGU9ZnVuY3Rpb24oKXt2YXIgbj1yLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gbj09PWU/dD9lLmNsaXBFeHRlbnQobnVsbCk6ZTpufSxlLnRyYW5zbGF0ZT1mdW5jdGlvbigpe3ZhciBuPWkuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiBuPT09ZT90P2UuY2xpcEV4dGVudChudWxsKTplOm59LGUuY2xpcEV4dGVudD1mdW5jdGlvbihuKXt2YXIgYT11LmFwcGx5KGUsYXJndW1lbnRzKTtpZihhPT09ZSl7aWYodD1udWxsPT1uKXt2YXIgbz0kYSpyKCksYz1pKCk7dShbW2NbMF0tbyxjWzFdLW9dLFtjWzBdK28sY1sxXStvXV0pfX1lbHNlIHQmJihhPW51bGwpO3JldHVybiBhfSxlLmNsaXBFeHRlbnQobnVsbCl9ZnVuY3Rpb24gRmUobix0KXt2YXIgZT1NYXRoLmNvcyh0KSpNYXRoLnNpbihuKTtyZXR1cm5bTWF0aC5sb2coKDErZSkvKDEtZSkpLzIsTWF0aC5hdGFuMihNYXRoLnRhbih0KSxNYXRoLmNvcyhuKSldfWZ1bmN0aW9uIFBlKG4pe2Z1bmN0aW9uIHQodCl7ZnVuY3Rpb24gYSgpe2wucHVzaCgiTSIsdShuKHMpLG8pKX1mb3IodmFyIGMsbD1bXSxzPVtdLGY9LTEsaD10Lmxlbmd0aCxnPWZ0KGUpLHA9ZnQocik7KytmPGg7KWkuY2FsbCh0aGlzLGM9dFtmXSxmKT9zLnB1c2goWytnLmNhbGwodGhpcyxjLGYpLCtwLmNhbGwodGhpcyxjLGYpXSk6cy5sZW5ndGgmJihhKCkscz1bXSk7cmV0dXJuIHMubGVuZ3RoJiZhKCksbC5sZW5ndGg/bC5qb2luKCIiKTpudWxsfXZhciBlPU9lLHI9WWUsaT1SdCx1PVJlLGE9dS5rZXksbz0uNztyZXR1cm4gdC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW4sdCk6aX0sdC5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2Ygbj91PW46KHU9aWMuZ2V0KG4pfHxSZSkua2V5LHQpOmF9LHQudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLHQpOm99LHR9ZnVuY3Rpb24gT2Uobil7cmV0dXJuIG5bMF19ZnVuY3Rpb24gWWUobil7cmV0dXJuIG5bMV19ZnVuY3Rpb24gUmUobil7cmV0dXJuIG4uam9pbigiTCIpfWZ1bmN0aW9uIFVlKG4pe3JldHVybiBSZShuKSsiWiJ9ZnVuY3Rpb24gSWUobil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0saT1bclswXSwiLCIsclsxXV07Kyt0PGU7KWkucHVzaCgiSCIsKHJbMF0rKHI9blt0XSlbMF0pLzIsIlYiLHJbMV0pO3JldHVybiBlPjEmJmkucHVzaCgiSCIsclswXSksaS5qb2luKCIiKX1mdW5jdGlvbiBWZShuKXtmb3IodmFyIHQ9MCxlPW4ubGVuZ3RoLHI9blswXSxpPVtyWzBdLCIsIixyWzFdXTsrK3Q8ZTspaS5wdXNoKCJWIiwocj1uW3RdKVsxXSwiSCIsclswXSk7cmV0dXJuIGkuam9pbigiIil9ZnVuY3Rpb24gWGUobil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0saT1bclswXSwiLCIsclsxXV07Kyt0PGU7KWkucHVzaCgiSCIsKHI9blt0XSlbMF0sIlYiLHJbMV0pO3JldHVybiBpLmpvaW4oIiIpfWZ1bmN0aW9uIFplKG4sdCl7cmV0dXJuIG4ubGVuZ3RoPDQ/UmUobik6blsxXStXZShuLnNsaWNlKDEsbi5sZW5ndGgtMSksSmUobix0KSl9ZnVuY3Rpb24gQmUobix0KXtyZXR1cm4gbi5sZW5ndGg8Mz9SZShuKTpuWzBdK1dlKChuLnB1c2goblswXSksbiksSmUoW25bbi5sZW5ndGgtMl1dLmNvbmNhdChuLFtuWzFdXSksdCkpfWZ1bmN0aW9uICRlKG4sdCl7cmV0dXJuIG4ubGVuZ3RoPDM/UmUobik6blswXStXZShuLEplKG4sdCkpfWZ1bmN0aW9uIFdlKG4sdCl7aWYodC5sZW5ndGg8MXx8bi5sZW5ndGghPXQubGVuZ3RoJiZuLmxlbmd0aCE9dC5sZW5ndGgrMilyZXR1cm4gUmUobik7dmFyIGU9bi5sZW5ndGghPXQubGVuZ3RoLHI9IiIsaT1uWzBdLHU9blsxXSxhPXRbMF0sbz1hLGM9MTtpZihlJiYocis9IlEiKyh1WzBdLTIqYVswXS8zKSsiLCIrKHVbMV0tMiphWzFdLzMpKyIsIit1WzBdKyIsIit1WzFdLGk9blsxXSxjPTIpLHQubGVuZ3RoPjEpe289dFsxXSx1PW5bY10sYysrLHIrPSJDIisoaVswXSthWzBdKSsiLCIrKGlbMV0rYVsxXSkrIiwiKyh1WzBdLW9bMF0pKyIsIisodVsxXS1vWzFdKSsiLCIrdVswXSsiLCIrdVsxXTtmb3IodmFyIGw9MjtsPHQubGVuZ3RoO2wrKyxjKyspdT1uW2NdLG89dFtsXSxyKz0iUyIrKHVbMF0tb1swXSkrIiwiKyh1WzFdLW9bMV0pKyIsIit1WzBdKyIsIit1WzFdfWlmKGUpe3ZhciBzPW5bY107cis9IlEiKyh1WzBdKzIqb1swXS8zKSsiLCIrKHVbMV0rMipvWzFdLzMpKyIsIitzWzBdKyIsIitzWzFdfXJldHVybiByfWZ1bmN0aW9uIEplKG4sdCl7Zm9yKHZhciBlLHI9W10saT0oMS10KS8yLHU9blswXSxhPW5bMV0sbz0xLGM9bi5sZW5ndGg7KytvPGM7KWU9dSx1PWEsYT1uW29dLHIucHVzaChbaSooYVswXS1lWzBdKSxpKihhWzFdLWVbMV0pXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gR2Uobil7aWYobi5sZW5ndGg8MylyZXR1cm4gUmUobik7dmFyIHQ9MSxlPW4ubGVuZ3RoLHI9blswXSxpPXJbMF0sdT1yWzFdLGE9W2ksaSxpLChyPW5bMV0pWzBdXSxvPVt1LHUsdSxyWzFdXSxjPVtpLCIsIix1XTtmb3IoZXIoYyxhLG8pOysrdDxlOylyPW5bdF0sYS5zaGlmdCgpLGEucHVzaChyWzBdKSxvLnNoaWZ0KCksby5wdXNoKHJbMV0pLGVyKGMsYSxvKTtmb3IodD0tMTsrK3Q8MjspYS5zaGlmdCgpLGEucHVzaChyWzBdKSxvLnNoaWZ0KCksby5wdXNoKHJbMV0pLGVyKGMsYSxvKTtyZXR1cm4gYy5qb2luKCIiKX1mdW5jdGlvbiBLZShuKXtpZihuLmxlbmd0aDw0KXJldHVybiBSZShuKTtmb3IodmFyIHQsZT1bXSxyPS0xLGk9bi5sZW5ndGgsdT1bMF0sYT1bMF07KytyPDM7KXQ9bltyXSx1LnB1c2godFswXSksYS5wdXNoKHRbMV0pO2ZvcihlLnB1c2godHIob2MsdSkrIiwiK3RyKG9jLGEpKSwtLXI7KytyPGk7KXQ9bltyXSx1LnNoaWZ0KCksdS5wdXNoKHRbMF0pLGEuc2hpZnQoKSxhLnB1c2godFsxXSksZXIoZSx1LGEpO3JldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIFFlKG4pe2Zvcih2YXIgdCxlLHI9LTEsaT1uLmxlbmd0aCx1PWkrNCxhPVtdLG89W107KytyPDQ7KWU9bltyJWldLGEucHVzaChlWzBdKSxvLnB1c2goZVsxXSk7Zm9yKHQ9W3RyKG9jLGEpLCIsIix0cihvYyxvKV0sLS1yOysrcjx1OyllPW5bciVpXSxhLnNoaWZ0KCksYS5wdXNoKGVbMF0pLG8uc2hpZnQoKSxvLnB1c2goZVsxXSksZXIodCxhLG8pO3JldHVybiB0LmpvaW4oIiIpfWZ1bmN0aW9uIG5yKG4sdCl7dmFyIGU9bi5sZW5ndGgtMTtpZihlKWZvcih2YXIgcixpLHU9blswXVswXSxhPW5bMF1bMV0sbz1uW2VdWzBdLXUsYz1uW2VdWzFdLWEsbD0tMTsrK2w8PWU7KXI9bltsXSxpPWwvZSxyWzBdPXQqclswXSsoMS10KSoodStpKm8pLHJbMV09dCpyWzFdKygxLXQpKihhK2kqYyk7cmV0dXJuIEdlKG4pfWZ1bmN0aW9uIHRyKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV0rblsyXSp0WzJdK25bM10qdFszXX1mdW5jdGlvbiBlcihuLHQsZSl7bi5wdXNoKCJDIix0cih1Yyx0KSwiLCIsdHIodWMsZSksIiwiLHRyKGFjLHQpLCIsIix0cihhYyxlKSwiLCIsdHIob2MsdCksIiwiLHRyKG9jLGUpKX1mdW5jdGlvbiBycihuLHQpe3JldHVybih0WzFdLW5bMV0pLyh0WzBdLW5bMF0pfWZ1bmN0aW9uIGlyKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgtMSxyPVtdLGk9blswXSx1PW5bMV0sYT1yWzBdPXJyKGksdSk7Kyt0PGU7KXJbdF09KGErKGE9cnIoaT11LHU9blt0KzFdKSkpLzI7cmV0dXJuIHJbdF09YSxyfWZ1bmN0aW9uIHVyKG4pe2Zvcih2YXIgdCxlLHIsaSx1PVtdLGE9aXIobiksbz0tMSxjPW4ubGVuZ3RoLTE7KytvPGM7KXQ9cnIobltvXSxuW28rMV0pLE1hdGguYWJzKHQpPDFlLTY/YVtvXT1hW28rMV09MDooZT1hW29dL3Qscj1hW28rMV0vdCxpPWUqZStyKnIsaT45JiYoaT0zKnQvTWF0aC5zcXJ0KGkpLGFbb109aSplLGFbbysxXT1pKnIpKTsKZm9yKG89LTE7KytvPD1jOylpPShuW01hdGgubWluKGMsbysxKV1bMF0tbltNYXRoLm1heCgwLG8tMSldWzBdKS8oNiooMSthW29dKmFbb10pKSx1LnB1c2goW2l8fDAsYVtvXSppfHwwXSk7cmV0dXJuIHV9ZnVuY3Rpb24gYXIobil7cmV0dXJuIG4ubGVuZ3RoPDM/UmUobik6blswXStXZShuLHVyKG4pKX1mdW5jdGlvbiBvcihuLHQsZSxyKXt2YXIgaSx1LGEsbyxjLGwscztyZXR1cm4gaT1yW25dLHU9aVswXSxhPWlbMV0saT1yW3RdLG89aVswXSxjPWlbMV0saT1yW2VdLGw9aVswXSxzPWlbMV0sKHMtYSkqKG8tdSktKGMtYSkqKGwtdSk+MH1mdW5jdGlvbiBjcihuLHQsZSl7cmV0dXJuKGVbMF0tdFswXSkqKG5bMV0tdFsxXSk8KGVbMV0tdFsxXSkqKG5bMF0tdFswXSl9ZnVuY3Rpb24gbHIobix0LGUscil7dmFyIGk9blswXSx1PWVbMF0sYT10WzBdLWksbz1yWzBdLXUsYz1uWzFdLGw9ZVsxXSxzPXRbMV0tYyxmPXJbMV0tbCxoPShvKihjLWwpLWYqKGktdSkpLyhmKmEtbypzKTtyZXR1cm5baStoKmEsYytoKnNdfWZ1bmN0aW9uIHNyKG4pe3ZhciB0PW5bMF0sZT1uW24ubGVuZ3RoLTFdO3JldHVybiEodFswXS1lWzBdfHx0WzFdLWVbMV0pfWZ1bmN0aW9uIGZyKG4sdCl7dmFyIGU9e2xpc3Q6bi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm57aW5kZXg6dCx4Om5bMF0seTpuWzFdfX0pLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gbi55PHQueT8tMTpuLnk+dC55PzE6bi54PHQueD8tMTpuLng+dC54PzE6MH0pLGJvdHRvbVNpdGU6bnVsbH0scj17bGlzdDpbXSxsZWZ0RW5kOm51bGwscmlnaHRFbmQ6bnVsbCxpbml0OmZ1bmN0aW9uKCl7ci5sZWZ0RW5kPXIuY3JlYXRlSGFsZkVkZ2UobnVsbCwibCIpLHIucmlnaHRFbmQ9ci5jcmVhdGVIYWxmRWRnZShudWxsLCJsIiksci5sZWZ0RW5kLnI9ci5yaWdodEVuZCxyLnJpZ2h0RW5kLmw9ci5sZWZ0RW5kLHIubGlzdC51bnNoaWZ0KHIubGVmdEVuZCxyLnJpZ2h0RW5kKX0sY3JlYXRlSGFsZkVkZ2U6ZnVuY3Rpb24obix0KXtyZXR1cm57ZWRnZTpuLHNpZGU6dCx2ZXJ0ZXg6bnVsbCxsOm51bGwscjpudWxsfX0saW5zZXJ0OmZ1bmN0aW9uKG4sdCl7dC5sPW4sdC5yPW4ucixuLnIubD10LG4ucj10fSxsZWZ0Qm91bmQ6ZnVuY3Rpb24obil7dmFyIHQ9ci5sZWZ0RW5kO2RvIHQ9dC5yO3doaWxlKHQhPXIucmlnaHRFbmQmJmkucmlnaHRPZih0LG4pKTtyZXR1cm4gdD10Lmx9LGRlbDpmdW5jdGlvbihuKXtuLmwucj1uLnIsbi5yLmw9bi5sLG4uZWRnZT1udWxsfSxyaWdodDpmdW5jdGlvbihuKXtyZXR1cm4gbi5yfSxsZWZ0OmZ1bmN0aW9uKG4pe3JldHVybiBuLmx9LGxlZnRSZWdpb246ZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PW4uZWRnZT9lLmJvdHRvbVNpdGU6bi5lZGdlLnJlZ2lvbltuLnNpZGVdfSxyaWdodFJlZ2lvbjpmdW5jdGlvbihuKXtyZXR1cm4gbnVsbD09bi5lZGdlP2UuYm90dG9tU2l0ZTpuLmVkZ2UucmVnaW9uW2xjW24uc2lkZV1dfX0saT17YmlzZWN0OmZ1bmN0aW9uKG4sdCl7dmFyIGU9e3JlZ2lvbjp7bDpuLHI6dH0sZXA6e2w6bnVsbCxyOm51bGx9fSxyPXQueC1uLngsaT10Lnktbi55LHU9cj4wP3I6LXIsYT1pPjA/aTotaTtyZXR1cm4gZS5jPW4ueCpyK24ueSppKy41KihyKnIraSppKSx1PmE/KGUuYT0xLGUuYj1pL3IsZS5jLz1yKTooZS5iPTEsZS5hPXIvaSxlLmMvPWkpLGV9LGludGVyc2VjdDpmdW5jdGlvbihuLHQpe3ZhciBlPW4uZWRnZSxyPXQuZWRnZTtpZighZXx8IXJ8fGUucmVnaW9uLnI9PXIucmVnaW9uLnIpcmV0dXJuIG51bGw7dmFyIGk9ZS5hKnIuYi1lLmIqci5hO2lmKE1hdGguYWJzKGkpPDFlLTEwKXJldHVybiBudWxsO3ZhciB1LGEsbz0oZS5jKnIuYi1yLmMqZS5iKS9pLGM9KHIuYyplLmEtZS5jKnIuYSkvaSxsPWUucmVnaW9uLnIscz1yLnJlZ2lvbi5yO2wueTxzLnl8fGwueT09cy55JiZsLng8cy54Pyh1PW4sYT1lKToodT10LGE9cik7dmFyIGY9bz49YS5yZWdpb24uci54O3JldHVybiBmJiYibCI9PT11LnNpZGV8fCFmJiYiciI9PT11LnNpZGU/bnVsbDp7eDpvLHk6Y319LHJpZ2h0T2Y6ZnVuY3Rpb24obix0KXt2YXIgZT1uLmVkZ2Uscj1lLnJlZ2lvbi5yLGk9dC54PnIueDtpZihpJiYibCI9PT1uLnNpZGUpcmV0dXJuIDE7aWYoIWkmJiJyIj09PW4uc2lkZSlyZXR1cm4gMDtpZigxPT09ZS5hKXt2YXIgdT10Lnktci55LGE9dC54LXIueCxvPTAsYz0wO2lmKCFpJiZlLmI8MHx8aSYmZS5iPj0wP2M9bz11Pj1lLmIqYTooYz10LngrdC55KmUuYj5lLmMsZS5iPDAmJihjPSFjKSxjfHwobz0xKSksIW8pe3ZhciBsPXIueC1lLnJlZ2lvbi5sLng7Yz1lLmIqKGEqYS11KnUpPGwqdSooMSsyKmEvbCtlLmIqZS5iKSxlLmI8MCYmKGM9IWMpfX1lbHNle3ZhciBzPWUuYy1lLmEqdC54LGY9dC55LXMsaD10Lngtci54LGc9cy1yLnk7Yz1mKmY+aCpoK2cqZ31yZXR1cm4ibCI9PT1uLnNpZGU/YzohY30sZW5kUG9pbnQ6ZnVuY3Rpb24obixlLHIpe24uZXBbZV09cixuLmVwW2xjW2VdXSYmdChuKX0sZGlzdGFuY2U6ZnVuY3Rpb24obix0KXt2YXIgZT1uLngtdC54LHI9bi55LXQueTtyZXR1cm4gTWF0aC5zcXJ0KGUqZStyKnIpfX0sdT17bGlzdDpbXSxpbnNlcnQ6ZnVuY3Rpb24obix0LGUpe24udmVydGV4PXQsbi55c3Rhcj10LnkrZTtmb3IodmFyIHI9MCxpPXUubGlzdCxhPWkubGVuZ3RoO2E+cjtyKyspe3ZhciBvPWlbcl07aWYoIShuLnlzdGFyPm8ueXN0YXJ8fG4ueXN0YXI9PW8ueXN0YXImJnQueD5vLnZlcnRleC54KSlicmVha31pLnNwbGljZShyLDAsbil9LGRlbDpmdW5jdGlvbihuKXtmb3IodmFyIHQ9MCxlPXUubGlzdCxyPWUubGVuZ3RoO3I+dCYmZVt0XSE9bjsrK3QpO2Uuc3BsaWNlKHQsMSl9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT11Lmxpc3QubGVuZ3RofSxuZXh0RXZlbnQ6ZnVuY3Rpb24obil7Zm9yKHZhciB0PTAsZT11Lmxpc3Qscj1lLmxlbmd0aDtyPnQ7Kyt0KWlmKGVbdF09PW4pcmV0dXJuIGVbdCsxXTtyZXR1cm4gbnVsbH0sbWluOmZ1bmN0aW9uKCl7dmFyIG49dS5saXN0WzBdO3JldHVybnt4Om4udmVydGV4LngseTpuLnlzdGFyfX0sZXh0cmFjdE1pbjpmdW5jdGlvbigpe3JldHVybiB1Lmxpc3Quc2hpZnQoKX19O3IuaW5pdCgpLGUuYm90dG9tU2l0ZT1lLmxpc3Quc2hpZnQoKTtmb3IodmFyIGEsbyxjLGwscyxmLGgsZyxwLGQsbSx2LHksTT1lLmxpc3Quc2hpZnQoKTs7KWlmKHUuZW1wdHkoKXx8KGE9dS5taW4oKSksTSYmKHUuZW1wdHkoKXx8TS55PGEueXx8TS55PT1hLnkmJk0ueDxhLngpKW89ci5sZWZ0Qm91bmQoTSksYz1yLnJpZ2h0KG8pLGg9ci5yaWdodFJlZ2lvbihvKSx2PWkuYmlzZWN0KGgsTSksZj1yLmNyZWF0ZUhhbGZFZGdlKHYsImwiKSxyLmluc2VydChvLGYpLGQ9aS5pbnRlcnNlY3QobyxmKSxkJiYodS5kZWwobyksdS5pbnNlcnQobyxkLGkuZGlzdGFuY2UoZCxNKSkpLG89ZixmPXIuY3JlYXRlSGFsZkVkZ2UodiwiciIpLHIuaW5zZXJ0KG8sZiksZD1pLmludGVyc2VjdChmLGMpLGQmJnUuaW5zZXJ0KGYsZCxpLmRpc3RhbmNlKGQsTSkpLE09ZS5saXN0LnNoaWZ0KCk7ZWxzZXtpZih1LmVtcHR5KCkpYnJlYWs7bz11LmV4dHJhY3RNaW4oKSxsPXIubGVmdChvKSxjPXIucmlnaHQobykscz1yLnJpZ2h0KGMpLGg9ci5sZWZ0UmVnaW9uKG8pLGc9ci5yaWdodFJlZ2lvbihjKSxtPW8udmVydGV4LGkuZW5kUG9pbnQoby5lZGdlLG8uc2lkZSxtKSxpLmVuZFBvaW50KGMuZWRnZSxjLnNpZGUsbSksci5kZWwobyksdS5kZWwoYyksci5kZWwoYykseT0ibCIsaC55PmcueSYmKHA9aCxoPWcsZz1wLHk9InIiKSx2PWkuYmlzZWN0KGgsZyksZj1yLmNyZWF0ZUhhbGZFZGdlKHYseSksci5pbnNlcnQobCxmKSxpLmVuZFBvaW50KHYsbGNbeV0sbSksZD1pLmludGVyc2VjdChsLGYpLGQmJih1LmRlbChsKSx1Lmluc2VydChsLGQsaS5kaXN0YW5jZShkLGgpKSksZD1pLmludGVyc2VjdChmLHMpLGQmJnUuaW5zZXJ0KGYsZCxpLmRpc3RhbmNlKGQsaCkpfWZvcihvPXIucmlnaHQoci5sZWZ0RW5kKTtvIT1yLnJpZ2h0RW5kO289ci5yaWdodChvKSl0KG8uZWRnZSl9ZnVuY3Rpb24gaHIobil7cmV0dXJuIG4ueH1mdW5jdGlvbiBncihuKXtyZXR1cm4gbi55fWZ1bmN0aW9uIHByKCl7cmV0dXJue2xlYWY6ITAsbm9kZXM6W10scG9pbnQ6bnVsbCx4Om51bGwseTpudWxsfX1mdW5jdGlvbiBkcihuLHQsZSxyLGksdSl7aWYoIW4odCxlLHIsaSx1KSl7dmFyIGE9LjUqKGUraSksbz0uNSoocit1KSxjPXQubm9kZXM7Y1swXSYmZHIobixjWzBdLGUscixhLG8pLGNbMV0mJmRyKG4sY1sxXSxhLHIsaSxvKSxjWzJdJiZkcihuLGNbMl0sZSxvLGEsdSksY1szXSYmZHIobixjWzNdLGEsbyxpLHUpfX1mdW5jdGlvbiBtcihuLHQpe249eWEucmdiKG4pLHQ9eWEucmdiKHQpO3ZhciBlPW4ucixyPW4uZyxpPW4uYix1PXQuci1lLGE9dC5nLXIsbz10LmItaTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIiMiK3V0KE1hdGgucm91bmQoZSt1Km4pKSt1dChNYXRoLnJvdW5kKHIrYSpuKSkrdXQoTWF0aC5yb3VuZChpK28qbikpfX1mdW5jdGlvbiB2cihuLHQpe3ZhciBlLHI9e30saT17fTtmb3IoZSBpbiBuKWUgaW4gdD9yW2VdPXhyKG5bZV0sdFtlXSk6aVtlXT1uW2VdO2ZvcihlIGluIHQpZSBpbiBufHwoaVtlXT10W2VdKTtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKGUgaW4gcilpW2VdPXJbZV0obik7cmV0dXJuIGl9fWZ1bmN0aW9uIHlyKG4sdCl7cmV0dXJuIHQtPW49K24sZnVuY3Rpb24oZSl7cmV0dXJuIG4rdCplfX1mdW5jdGlvbiBNcihuLHQpe3ZhciBlLHIsaSx1LGEsbz0wLGM9MCxsPVtdLHM9W107Zm9yKG4rPSIiLHQrPSIiLHNjLmxhc3RJbmRleD0wLHI9MDtlPXNjLmV4ZWModCk7KytyKWUuaW5kZXgmJmwucHVzaCh0LnN1YnN0cmluZyhvLGM9ZS5pbmRleCkpLHMucHVzaCh7aTpsLmxlbmd0aCx4OmVbMF19KSxsLnB1c2gobnVsbCksbz1zYy5sYXN0SW5kZXg7Zm9yKG88dC5sZW5ndGgmJmwucHVzaCh0LnN1YnN0cmluZyhvKSkscj0wLHU9cy5sZW5ndGg7KGU9c2MuZXhlYyhuKSkmJnU+cjsrK3IpaWYoYT1zW3JdLGEueD09ZVswXSl7aWYoYS5pKWlmKG51bGw9PWxbYS5pKzFdKWZvcihsW2EuaS0xXSs9YS54LGwuc3BsaWNlKGEuaSwxKSxpPXIrMTt1Pmk7KytpKXNbaV0uaS0tO2Vsc2UgZm9yKGxbYS5pLTFdKz1hLngrbFthLmkrMV0sbC5zcGxpY2UoYS5pLDIpLGk9cisxO3U+aTsrK2kpc1tpXS5pLT0yO2Vsc2UgaWYobnVsbD09bFthLmkrMV0pbFthLmldPWEueDtlbHNlIGZvcihsW2EuaV09YS54K2xbYS5pKzFdLGwuc3BsaWNlKGEuaSsxLDEpLGk9cisxO3U+aTsrK2kpc1tpXS5pLS07cy5zcGxpY2UociwxKSx1LS0sci0tfWVsc2UgYS54PXlyKHBhcnNlRmxvYXQoZVswXSkscGFyc2VGbG9hdChhLngpKTtmb3IoO3U+cjspYT1zLnBvcCgpLG51bGw9PWxbYS5pKzFdP2xbYS5pXT1hLng6KGxbYS5pXT1hLngrbFthLmkrMV0sbC5zcGxpY2UoYS5pKzEsMSkpLHUtLTtyZXR1cm4gMT09PWwubGVuZ3RoP251bGw9PWxbMF0/KGE9c1swXS54LGZ1bmN0aW9uKG4pe3JldHVybiBhKG4pKyIifSk6ZnVuY3Rpb24oKXtyZXR1cm4gdH06ZnVuY3Rpb24obil7Zm9yKHI9MDt1PnI7KytyKWxbKGE9c1tyXSkuaV09YS54KG4pO3JldHVybiBsLmpvaW4oIiIpfX1mdW5jdGlvbiB4cihuLHQpe2Zvcih2YXIgZSxyPXlhLmludGVycG9sYXRvcnMubGVuZ3RoOy0tcj49MCYmIShlPXlhLmludGVycG9sYXRvcnNbcl0obix0KSk7KTtyZXR1cm4gZX1mdW5jdGlvbiBicihuLHQpe3ZhciBlLHI9W10saT1bXSx1PW4ubGVuZ3RoLGE9dC5sZW5ndGgsbz1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCk7Zm9yKGU9MDtvPmU7KytlKXIucHVzaCh4cihuW2VdLHRbZV0pKTtmb3IoO3U+ZTsrK2UpaVtlXT1uW2VdO2Zvcig7YT5lOysrZSlpW2VdPXRbZV07cmV0dXJuIGZ1bmN0aW9uKG4pe2ZvcihlPTA7bz5lOysrZSlpW2VdPXJbZV0obik7cmV0dXJuIGl9fWZ1bmN0aW9uIF9yKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD49dD8wOnQ+PTE/MTpuKHQpfX1mdW5jdGlvbiB3cihuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDEtbigxLXQpfX1mdW5jdGlvbiBTcihuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuLjUqKC41PnQ/bigyKnQpOjItbigyLTIqdCkpfX1mdW5jdGlvbiBFcihuKXtyZXR1cm4gbipufWZ1bmN0aW9uIGtyKG4pe3JldHVybiBuKm4qbn1mdW5jdGlvbiBBcihuKXtpZigwPj1uKXJldHVybiAwO2lmKG4+PTEpcmV0dXJuIDE7dmFyIHQ9bipuLGU9dCpuO3JldHVybiA0KiguNT5uP2U6Myoobi10KStlLS43NSl9ZnVuY3Rpb24gTnIobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBxcihuKXtyZXR1cm4gMS1NYXRoLmNvcyhuKiRhLzIpfWZ1bmN0aW9uIFRyKG4pe3JldHVybiBNYXRoLnBvdygyLDEwKihuLTEpKX1mdW5jdGlvbiBDcihuKXtyZXR1cm4gMS1NYXRoLnNxcnQoMS1uKm4pfWZ1bmN0aW9uIHpyKG4sdCl7dmFyIGU7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKHQ9LjQ1KSxhcmd1bWVudHMubGVuZ3RoP2U9dC8oMiokYSkqTWF0aC5hc2luKDEvbik6KG49MSxlPXQvNCksZnVuY3Rpb24ocil7cmV0dXJuIDErbipNYXRoLnBvdygyLDEwKi1yKSpNYXRoLnNpbigyKihyLWUpKiRhL3QpfX1mdW5jdGlvbiBEcihuKXtyZXR1cm4gbnx8KG49MS43MDE1OCksZnVuY3Rpb24odCl7cmV0dXJuIHQqdCooKG4rMSkqdC1uKX19ZnVuY3Rpb24ganIobil7cmV0dXJuIDEvMi43NT5uPzcuNTYyNSpuKm46Mi8yLjc1Pm4/Ny41NjI1KihuLT0xLjUvMi43NSkqbisuNzU6Mi41LzIuNzU+bj83LjU2MjUqKG4tPTIuMjUvMi43NSkqbisuOTM3NTo3LjU2MjUqKG4tPTIuNjI1LzIuNzUpKm4rLjk4NDM3NX1mdW5jdGlvbiBMcihuLHQpe249eWEuaGNsKG4pLHQ9eWEuaGNsKHQpO3ZhciBlPW4uaCxyPW4uYyxpPW4ubCx1PXQuaC1lLGE9dC5jLXIsbz10LmwtaTtyZXR1cm4gaXNOYU4oYSkmJihhPTAscj1pc05hTihyKT90LmM6ciksaXNOYU4odSk/KHU9MCxlPWlzTmFOKGUpP3QuaDplKTp1PjE4MD91LT0zNjA6LTE4MD51JiYodSs9MzYwKSxmdW5jdGlvbihuKXtyZXR1cm4gVyhlK3UqbixyK2EqbixpK28qbikrIiJ9fWZ1bmN0aW9uIEhyKG4sdCl7bj15YS5oc2wobiksdD15YS5oc2wodCk7dmFyIGU9bi5oLHI9bi5zLGk9bi5sLHU9dC5oLWUsYT10LnMtcixvPXQubC1pO3JldHVybiBpc05hTihhKSYmKGE9MCxyPWlzTmFOKHIpP3QuczpyKSxpc05hTih1KT8odT0wLGU9aXNOYU4oZSk/dC5oOmUpOnU+MTgwP3UtPTM2MDotMTgwPnUmJih1Kz0zNjApLGZ1bmN0aW9uKG4pe3JldHVybiBZKGUrdSpuLHIrYSpuLGkrbypuKSsiIn19ZnVuY3Rpb24gRnIobix0KXtuPXlhLmxhYihuKSx0PXlhLmxhYih0KTt2YXIgZT1uLmwscj1uLmEsaT1uLmIsdT10LmwtZSxhPXQuYS1yLG89dC5iLWk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBLKGUrdSpuLHIrYSpuLGkrbypuKSsiIn19ZnVuY3Rpb24gUHIobix0KXtyZXR1cm4gdC09bixmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5yb3VuZChuK3QqZSl9fWZ1bmN0aW9uIE9yKG4pe3ZhciB0PVtuLmEsbi5iXSxlPVtuLmMsbi5kXSxyPVJyKHQpLGk9WXIodCxlKSx1PVJyKFVyKGUsdCwtaSkpfHwwO3RbMF0qZVsxXTxlWzBdKnRbMV0mJih0WzBdKj0tMSx0WzFdKj0tMSxyKj0tMSxpKj0tMSksdGhpcy5yb3RhdGU9KHI/TWF0aC5hdGFuMih0WzFdLHRbMF0pOk1hdGguYXRhbjIoLWVbMF0sZVsxXSkpKkthLHRoaXMudHJhbnNsYXRlPVtuLmUsbi5mXSx0aGlzLnNjYWxlPVtyLHVdLHRoaXMuc2tldz11P01hdGguYXRhbjIoaSx1KSpLYTowfWZ1bmN0aW9uIFlyKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV19ZnVuY3Rpb24gUnIobil7dmFyIHQ9TWF0aC5zcXJ0KFlyKG4sbikpO3JldHVybiB0JiYoblswXS89dCxuWzFdLz10KSx0fWZ1bmN0aW9uIFVyKG4sdCxlKXtyZXR1cm4gblswXSs9ZSp0WzBdLG5bMV0rPWUqdFsxXSxufWZ1bmN0aW9uIElyKG4sdCl7dmFyIGUscj1bXSxpPVtdLHU9eWEudHJhbnNmb3JtKG4pLGE9eWEudHJhbnNmb3JtKHQpLG89dS50cmFuc2xhdGUsYz1hLnRyYW5zbGF0ZSxsPXUucm90YXRlLHM9YS5yb3RhdGUsZj11LnNrZXcsaD1hLnNrZXcsZz11LnNjYWxlLHA9YS5zY2FsZTtyZXR1cm4gb1swXSE9Y1swXXx8b1sxXSE9Y1sxXT8oci5wdXNoKCJ0cmFuc2xhdGUoIixudWxsLCIsIixudWxsLCIpIiksaS5wdXNoKHtpOjEseDp5cihvWzBdLGNbMF0pfSx7aTozLHg6eXIob1sxXSxjWzFdKX0pKTpjWzBdfHxjWzFdP3IucHVzaCgidHJhbnNsYXRlKCIrYysiKSIpOnIucHVzaCgiIiksbCE9cz8obC1zPjE4MD9zKz0zNjA6cy1sPjE4MCYmKGwrPTM2MCksaS5wdXNoKHtpOnIucHVzaChyLnBvcCgpKyJyb3RhdGUoIixudWxsLCIpIiktMix4OnlyKGwscyl9KSk6cyYmci5wdXNoKHIucG9wKCkrInJvdGF0ZSgiK3MrIikiKSxmIT1oP2kucHVzaCh7aTpyLnB1c2goci5wb3AoKSsic2tld1goIixudWxsLCIpIiktMix4OnlyKGYsaCl9KTpoJiZyLnB1c2goci5wb3AoKSsic2tld1goIitoKyIpIiksZ1swXSE9cFswXXx8Z1sxXSE9cFsxXT8oZT1yLnB1c2goci5wb3AoKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIiksaS5wdXNoKHtpOmUtNCx4OnlyKGdbMF0scFswXSl9LHtpOmUtMix4OnlyKGdbMV0scFsxXSl9KSk6KDEhPXBbMF18fDEhPXBbMV0pJiZyLnB1c2goci5wb3AoKSsic2NhbGUoIitwKyIpIiksZT1pLmxlbmd0aCxmdW5jdGlvbihuKXtmb3IodmFyIHQsdT0tMTsrK3U8ZTspclsodD1pW3VdKS5pXT10Lngobik7cmV0dXJuIHIuam9pbigiIil9fWZ1bmN0aW9uIFZyKG4sdCl7cmV0dXJuIHQ9dC0obj0rbik/MS8odC1uKTowLGZ1bmN0aW9uKGUpe3JldHVybihlLW4pKnR9fWZ1bmN0aW9uIFhyKG4sdCl7cmV0dXJuIHQ9dC0obj0rbik/MS8odC1uKTowLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDEsKGUtbikqdCkpfX1mdW5jdGlvbiBacihuKXtmb3IodmFyIHQ9bi5zb3VyY2UsZT1uLnRhcmdldCxyPSRyKHQsZSksaT1bdF07dCE9PXI7KXQ9dC5wYXJlbnQsaS5wdXNoKHQpO2Zvcih2YXIgdT1pLmxlbmd0aDtlIT09cjspaS5zcGxpY2UodSwwLGUpLGU9ZS5wYXJlbnQ7cmV0dXJuIGl9ZnVuY3Rpb24gQnIobil7Zm9yKHZhciB0PVtdLGU9bi5wYXJlbnQ7bnVsbCE9ZTspdC5wdXNoKG4pLG49ZSxlPWUucGFyZW50O3JldHVybiB0LnB1c2gobiksdH1mdW5jdGlvbiAkcihuLHQpe2lmKG49PT10KXJldHVybiBuO2Zvcih2YXIgZT1CcihuKSxyPUJyKHQpLGk9ZS5wb3AoKSx1PXIucG9wKCksYT1udWxsO2k9PT11OylhPWksaT1lLnBvcCgpLHU9ci5wb3AoKTtyZXR1cm4gYX1mdW5jdGlvbiBXcihuKXtuLmZpeGVkfD0yfWZ1bmN0aW9uIEpyKG4pe24uZml4ZWQmPS03fWZ1bmN0aW9uIEdyKG4pe24uZml4ZWR8PTQsbi5weD1uLngsbi5weT1uLnl9ZnVuY3Rpb24gS3Iobil7bi5maXhlZCY9LTV9ZnVuY3Rpb24gUXIobix0LGUpe3ZhciByPTAsaT0wO2lmKG4uY2hhcmdlPTAsIW4ubGVhZilmb3IodmFyIHUsYT1uLm5vZGVzLG89YS5sZW5ndGgsYz0tMTsrK2M8bzspdT1hW2NdLG51bGwhPXUmJihRcih1LHQsZSksbi5jaGFyZ2UrPXUuY2hhcmdlLHIrPXUuY2hhcmdlKnUuY3gsaSs9dS5jaGFyZ2UqdS5jeSk7aWYobi5wb2ludCl7bi5sZWFmfHwobi5wb2ludC54Kz1NYXRoLnJhbmRvbSgpLS41LG4ucG9pbnQueSs9TWF0aC5yYW5kb20oKS0uNSk7dmFyIGw9dCplW24ucG9pbnQuaW5kZXhdO24uY2hhcmdlKz1uLnBvaW50Q2hhcmdlPWwscis9bCpuLnBvaW50LngsaSs9bCpuLnBvaW50Lnl9bi5jeD1yL24uY2hhcmdlLG4uY3k9aS9uLmNoYXJnZX1mdW5jdGlvbiBuaShuLHQpe3JldHVybiB5YS5yZWJpbmQobix0LCJzb3J0IiwiY2hpbGRyZW4iLCJ2YWx1ZSIpLG4ubm9kZXM9bixuLmxpbmtzPWlpLG59ZnVuY3Rpb24gdGkobil7cmV0dXJuIG4uY2hpbGRyZW59ZnVuY3Rpb24gZWkobil7cmV0dXJuIG4udmFsdWV9ZnVuY3Rpb24gcmkobix0KXtyZXR1cm4gdC52YWx1ZS1uLnZhbHVlfWZ1bmN0aW9uIGlpKG4pe3JldHVybiB5YS5tZXJnZShuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4obi5jaGlsZHJlbnx8W10pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOm4sdGFyZ2V0OnR9fSl9KSl9ZnVuY3Rpb24gdWkobil7cmV0dXJuIG4ueH1mdW5jdGlvbiBhaShuKXtyZXR1cm4gbi55fWZ1bmN0aW9uIG9pKG4sdCxlKXtuLnkwPXQsbi55PWV9ZnVuY3Rpb24gY2kobil7cmV0dXJuIHlhLnJhbmdlKG4ubGVuZ3RoKX1mdW5jdGlvbiBsaShuKXtmb3IodmFyIHQ9LTEsZT1uWzBdLmxlbmd0aCxyPVtdOysrdDxlOylyW3RdPTA7cmV0dXJuIHJ9ZnVuY3Rpb24gc2kobil7Zm9yKHZhciB0LGU9MSxyPTAsaT1uWzBdWzFdLHU9bi5sZW5ndGg7dT5lOysrZSkodD1uW2VdWzFdKT5pJiYocj1lLGk9dCk7cmV0dXJuIHJ9ZnVuY3Rpb24gZmkobil7cmV0dXJuIG4ucmVkdWNlKGhpLDApfWZ1bmN0aW9uIGhpKG4sdCl7cmV0dXJuIG4rdFsxXX1mdW5jdGlvbiBnaShuLHQpe3JldHVybiBwaShuLE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIrMSkpfWZ1bmN0aW9uIHBpKG4sdCl7Zm9yKHZhciBlPS0xLHI9K25bMF0saT0oblsxXS1yKS90LHU9W107KytlPD10Oyl1W2VdPWkqZStyO3JldHVybiB1fWZ1bmN0aW9uIGRpKG4pe3JldHVyblt5YS5taW4obikseWEubWF4KG4pXX1mdW5jdGlvbiBtaShuLHQpe3JldHVybiBuLnBhcmVudD09dC5wYXJlbnQ/MToyfWZ1bmN0aW9uIHZpKG4pe3ZhciB0PW4uY2hpbGRyZW47cmV0dXJuIHQmJnQubGVuZ3RoP3RbMF06bi5fdHJlZS50aHJlYWR9ZnVuY3Rpb24geWkobil7dmFyIHQsZT1uLmNoaWxkcmVuO3JldHVybiBlJiYodD1lLmxlbmd0aCk/ZVt0LTFdOm4uX3RyZWUudGhyZWFkfWZ1bmN0aW9uIE1pKG4sdCl7dmFyIGU9bi5jaGlsZHJlbjtpZihlJiYoaT1lLmxlbmd0aCkpZm9yKHZhciByLGksdT0tMTsrK3U8aTspdChyPU1pKGVbdV0sdCksbik+MCYmKG49cik7cmV0dXJuIG59ZnVuY3Rpb24geGkobix0KXtyZXR1cm4gbi54LXQueH1mdW5jdGlvbiBiaShuLHQpe3JldHVybiB0Lngtbi54fWZ1bmN0aW9uIF9pKG4sdCl7cmV0dXJuIG4uZGVwdGgtdC5kZXB0aH1mdW5jdGlvbiB3aShuLHQpe2Z1bmN0aW9uIGUobixyKXt2YXIgaT1uLmNoaWxkcmVuO2lmKGkmJihhPWkubGVuZ3RoKSlmb3IodmFyIHUsYSxvPW51bGwsYz0tMTsrK2M8YTspdT1pW2NdLGUodSxvKSxvPXU7dChuLHIpfWUobixudWxsKX1mdW5jdGlvbiBTaShuKXtmb3IodmFyIHQsZT0wLHI9MCxpPW4uY2hpbGRyZW4sdT1pLmxlbmd0aDstLXU+PTA7KXQ9aVt1XS5fdHJlZSx0LnByZWxpbSs9ZSx0Lm1vZCs9ZSxlKz10LnNoaWZ0KyhyKz10LmNoYW5nZSl9ZnVuY3Rpb24gRWkobix0LGUpe249bi5fdHJlZSx0PXQuX3RyZWU7dmFyIHI9ZS8odC5udW1iZXItbi5udW1iZXIpO24uY2hhbmdlKz1yLHQuY2hhbmdlLT1yLHQuc2hpZnQrPWUsdC5wcmVsaW0rPWUsdC5tb2QrPWV9ZnVuY3Rpb24ga2kobix0LGUpe3JldHVybiBuLl90cmVlLmFuY2VzdG9yLnBhcmVudD09dC5wYXJlbnQ/bi5fdHJlZS5hbmNlc3RvcjplfWZ1bmN0aW9uIEFpKG4sdCl7cmV0dXJuIG4udmFsdWUtdC52YWx1ZX1mdW5jdGlvbiBOaShuLHQpe3ZhciBlPW4uX3BhY2tfbmV4dDtuLl9wYWNrX25leHQ9dCx0Ll9wYWNrX3ByZXY9bix0Ll9wYWNrX25leHQ9ZSxlLl9wYWNrX3ByZXY9dH1mdW5jdGlvbiBxaShuLHQpe24uX3BhY2tfbmV4dD10LHQuX3BhY2tfcHJldj1ufWZ1bmN0aW9uIFRpKG4sdCl7dmFyIGU9dC54LW4ueCxyPXQueS1uLnksaT1uLnIrdC5yO3JldHVybi45OTkqaSppPmUqZStyKnJ9ZnVuY3Rpb24gQ2kobil7ZnVuY3Rpb24gdChuKXtzPU1hdGgubWluKG4ueC1uLnIscyksZj1NYXRoLm1heChuLngrbi5yLGYpLGg9TWF0aC5taW4obi55LW4ucixoKSxnPU1hdGgubWF4KG4ueStuLnIsZyl9aWYoKGU9bi5jaGlsZHJlbikmJihsPWUubGVuZ3RoKSl7dmFyIGUscixpLHUsYSxvLGMsbCxzPTEvMCxmPS0xLzAsaD0xLzAsZz0tMS8wO2lmKGUuZm9yRWFjaCh6aSkscj1lWzBdLHIueD0tci5yLHIueT0wLHQociksbD4xJiYoaT1lWzFdLGkueD1pLnIsaS55PTAsdChpKSxsPjIpKWZvcih1PWVbMl0sTGkocixpLHUpLHQodSksTmkocix1KSxyLl9wYWNrX3ByZXY9dSxOaSh1LGkpLGk9ci5fcGFja19uZXh0LGE9MztsPmE7YSsrKXtMaShyLGksdT1lW2FdKTt2YXIgcD0wLGQ9MSxtPTE7Zm9yKG89aS5fcGFja19uZXh0O28hPT1pO289by5fcGFja19uZXh0LGQrKylpZihUaShvLHUpKXtwPTE7YnJlYWt9aWYoMT09cClmb3IoYz1yLl9wYWNrX3ByZXY7YyE9PW8uX3BhY2tfcHJldiYmIVRpKGMsdSk7Yz1jLl9wYWNrX3ByZXYsbSsrKTtwPyhtPmR8fGQ9PW0mJmkucjxyLnI/cWkocixpPW8pOnFpKHI9YyxpKSxhLS0pOihOaShyLHUpLGk9dSx0KHUpKX12YXIgdj0ocytmKS8yLHk9KGgrZykvMixNPTA7Zm9yKGE9MDtsPmE7YSsrKXU9ZVthXSx1LngtPXYsdS55LT15LE09TWF0aC5tYXgoTSx1LnIrTWF0aC5zcXJ0KHUueCp1LngrdS55KnUueSkpO24ucj1NLGUuZm9yRWFjaChEaSl9fWZ1bmN0aW9uIHppKG4pe24uX3BhY2tfbmV4dD1uLl9wYWNrX3ByZXY9bn1mdW5jdGlvbiBEaShuKXtkZWxldGUgbi5fcGFja19uZXh0LGRlbGV0ZSBuLl9wYWNrX3ByZXZ9ZnVuY3Rpb24gamkobix0LGUscil7dmFyIGk9bi5jaGlsZHJlbjtpZihuLng9dCs9cipuLngsbi55PWUrPXIqbi55LG4ucio9cixpKWZvcih2YXIgdT0tMSxhPWkubGVuZ3RoOysrdTxhOylqaShpW3VdLHQsZSxyKX1mdW5jdGlvbiBMaShuLHQsZSl7dmFyIHI9bi5yK2UucixpPXQueC1uLngsdT10Lnktbi55O2lmKHImJihpfHx1KSl7dmFyIGE9dC5yK2UucixvPWkqaSt1KnU7YSo9YSxyKj1yO3ZhciBjPS41KyhyLWEpLygyKm8pLGw9TWF0aC5zcXJ0KE1hdGgubWF4KDAsMiphKihyK28pLShyLT1vKSpyLWEqYSkpLygyKm8pO2UueD1uLngrYyppK2wqdSxlLnk9bi55K2MqdS1sKml9ZWxzZSBlLng9bi54K3IsZS55PW4ueX1mdW5jdGlvbiBIaShuKXtyZXR1cm4gMSt5YS5tYXgobixmdW5jdGlvbihuKXtyZXR1cm4gbi55fSl9ZnVuY3Rpb24gRmkobil7cmV0dXJuIG4ucmVkdWNlKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4rdC54fSwwKS9uLmxlbmd0aH1mdW5jdGlvbiBQaShuKXt2YXIgdD1uLmNoaWxkcmVuO3JldHVybiB0JiZ0Lmxlbmd0aD9QaSh0WzBdKTpufWZ1bmN0aW9uIE9pKG4pe3ZhciB0LGU9bi5jaGlsZHJlbjtyZXR1cm4gZSYmKHQ9ZS5sZW5ndGgpP09pKGVbdC0xXSk6bn1mdW5jdGlvbiBZaShuKXtyZXR1cm57eDpuLngseTpuLnksZHg6bi5keCxkeTpuLmR5fX1mdW5jdGlvbiBSaShuLHQpe3ZhciBlPW4ueCt0WzNdLHI9bi55K3RbMF0saT1uLmR4LXRbMV0tdFszXSx1PW4uZHktdFswXS10WzJdO3JldHVybiAwPmkmJihlKz1pLzIsaT0wKSwwPnUmJihyKz11LzIsdT0wKSx7eDplLHk6cixkeDppLGR5OnV9fWZ1bmN0aW9uIFVpKG4pe3ZhciB0PW5bMF0sZT1uW24ubGVuZ3RoLTFdO3JldHVybiBlPnQ/W3QsZV06W2UsdF19ZnVuY3Rpb24gSWkobil7cmV0dXJuIG4ucmFuZ2VFeHRlbnQ/bi5yYW5nZUV4dGVudCgpOlVpKG4ucmFuZ2UoKSl9ZnVuY3Rpb24gVmkobix0LGUscil7dmFyIGk9ZShuWzBdLG5bMV0pLHU9cih0WzBdLHRbMV0pO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdShpKG4pKX19ZnVuY3Rpb24gWGkobix0KXt2YXIgZSxyPTAsaT1uLmxlbmd0aC0xLHU9bltyXSxhPW5baV07cmV0dXJuIHU+YSYmKGU9cixyPWksaT1lLGU9dSx1PWEsYT1lKSxuW3JdPXQuZmxvb3IodSksbltpXT10LmNlaWwoYSksbn1mdW5jdGlvbiBaaShuKXtyZXR1cm4gbj97Zmxvb3I6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguZmxvb3IodC9uKSpufSxjZWlsOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmNlaWwodC9uKSpufX06eGN9ZnVuY3Rpb24gQmkobix0LGUscil7dmFyIGk9W10sdT1bXSxhPTAsbz1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCktMTtmb3IobltvXTxuWzBdJiYobj1uLnNsaWNlKCkucmV2ZXJzZSgpLHQ9dC5zbGljZSgpLnJldmVyc2UoKSk7KythPD1vOylpLnB1c2goZShuW2EtMV0sblthXSkpLHUucHVzaChyKHRbYS0xXSx0W2FdKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXlhLmJpc2VjdChuLHQsMSxvKS0xO3JldHVybiB1W2VdKGlbZV0odCkpfX1mdW5jdGlvbiAkaShuLHQsZSxyKXtmdW5jdGlvbiBpKCl7dmFyIGk9TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpPjI/Qmk6VmksYz1yP1hyOlZyO3JldHVybiBhPWkobix0LGMsZSksbz1pKHQsbixjLHhyKSx1fWZ1bmN0aW9uIHUobil7cmV0dXJuIGEobil9dmFyIGEsbztyZXR1cm4gdS5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuIG8obil9LHUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQubWFwKE51bWJlciksaSgpKTpufSx1LnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saSgpKTp0fSx1LnJhbmdlUm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIHUucmFuZ2UobikuaW50ZXJwb2xhdGUoUHIpfSx1LmNsYW1wPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4saSgpKTpyfSx1LmludGVycG9sYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4saSgpKTplfSx1LnRpY2tzPWZ1bmN0aW9uKHQpe3JldHVybiBRaShuLHQpfSx1LnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnUobix0LGUpfSx1Lm5pY2U9ZnVuY3Rpb24odCl7cmV0dXJuIEppKG4sdCksaSgpfSx1LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gJGkobix0LGUscil9LGkoKX1mdW5jdGlvbiBXaShuLHQpe3JldHVybiB5YS5yZWJpbmQobix0LCJyYW5nZSIsInJhbmdlUm91bmQiLCJpbnRlcnBvbGF0ZSIsImNsYW1wIil9ZnVuY3Rpb24gSmkobix0KXtyZXR1cm4gWGkobixaaSh0P0tpKG4sdClbMl06R2kobikpKX1mdW5jdGlvbiBHaShuKXt2YXIgdD1VaShuKSxlPXRbMV0tdFswXTtyZXR1cm4gTWF0aC5wb3coMTAsTWF0aC5yb3VuZChNYXRoLmxvZyhlKS9NYXRoLkxOMTApLTEpfWZ1bmN0aW9uIEtpKG4sdCl7dmFyIGU9VWkobikscj1lWzFdLWVbMF0saT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIvdCkvTWF0aC5MTjEwKSksdT10L3IqaTtyZXR1cm4uMTU+PXU/aSo9MTA6LjM1Pj11P2kqPTU6Ljc1Pj11JiYoaSo9MiksZVswXT1NYXRoLmNlaWwoZVswXS9pKSppLGVbMV09TWF0aC5mbG9vcihlWzFdL2kpKmkrLjUqaSxlWzJdPWksZX1mdW5jdGlvbiBRaShuLHQpe3JldHVybiB5YS5yYW5nZS5hcHBseSh5YSxLaShuLHQpKX1mdW5jdGlvbiBudShuLHQsZSl7dmFyIHI9LU1hdGguZmxvb3IoTWF0aC5sb2coS2kobix0KVsyXSkvTWF0aC5MTjEwKy4wMSk7cmV0dXJuIHlhLmZvcm1hdChlP2UucmVwbGFjZSh2byxmdW5jdGlvbihuLHQsZSxpLHUsYSxvLGMsbCxzKXtyZXR1cm5bdCxlLGksdSxhLG8sYyxsfHwiLiIrKHItMiooIiUiPT09cykpLHNdLmpvaW4oIiIpfSk6IiwuIityKyJmIil9ZnVuY3Rpb24gdHUobix0LGUscixpKXtmdW5jdGlvbiB1KHQpe3JldHVybiBuKGUodCkpfXJldHVybiB1LmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gcihuLmludmVydCh0KSl9LHUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0WzBdPDA/KGU9aXUscj11dSk6KGU9ZXUscj1ydSksbi5kb21haW4oKGk9dC5tYXAoTnVtYmVyKSkubWFwKGUpKSx1KTppfSx1LmJhc2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K24sdSk6dH0sdS5uaWNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihuKXtyZXR1cm4gTWF0aC5wb3codCxNYXRoLmZsb29yKE1hdGgubG9nKG4pL01hdGgubG9nKHQpKSl9ZnVuY3Rpb24gYShuKXtyZXR1cm4gTWF0aC5wb3codCxNYXRoLmNlaWwoTWF0aC5sb2cobikvTWF0aC5sb2codCkpKX1yZXR1cm4gbi5kb21haW4oWGkoaSxlPT09ZXU/e2Zsb29yOnIsY2VpbDphfTp7Zmxvb3I6ZnVuY3Rpb24obil7cmV0dXJuLWEoLW4pfSxjZWlsOmZ1bmN0aW9uKG4pe3JldHVybi1yKC1uKX19KS5tYXAoZSkpLHV9LHUudGlja3M9ZnVuY3Rpb24oKXt2YXIgaT1VaShuLmRvbWFpbigpKSx1PVtdO2lmKGkuZXZlcnkoaXNGaW5pdGUpKXt2YXIgYT1NYXRoLmxvZyh0KSxvPU1hdGguZmxvb3IoaVswXS9hKSxjPU1hdGguY2VpbChpWzFdL2EpLGw9cihpWzBdKSxzPXIoaVsxXSksZj10JTE/Mjp0O2lmKGU9PT1pdSlmb3IodS5wdXNoKC1NYXRoLnBvdyh0LC1vKSk7bysrPGM7KWZvcih2YXIgaD1mLTE7aD4wO2gtLSl1LnB1c2goLU1hdGgucG93KHQsLW8pKmgpO2Vsc2V7Zm9yKDtjPm87bysrKWZvcih2YXIgaD0xO2Y+aDtoKyspdS5wdXNoKE1hdGgucG93KHQsbykqaCk7dS5wdXNoKE1hdGgucG93KHQsbykpfWZvcihvPTA7dVtvXTxsO28rKyk7Zm9yKGM9dS5sZW5ndGg7dVtjLTFdPnM7Yy0tKTt1PXUuc2xpY2UobyxjKX1yZXR1cm4gdX0sdS50aWNrRm9ybWF0PWZ1bmN0aW9uKG4saSl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGJjO2FyZ3VtZW50cy5sZW5ndGg8Mj9pPWJjOiJmdW5jdGlvbiIhPXR5cGVvZiBpJiYoaT15YS5mb3JtYXQoaSkpO3ZhciBhLG89TWF0aC5sb2codCksYz1NYXRoLm1heCguMSxuL3UudGlja3MoKS5sZW5ndGgpLGw9ZT09PWl1PyhhPS0xZS0xMixNYXRoLmZsb29yKTooYT0xZS0xMixNYXRoLmNlaWwpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi9yKG8qbChlKG4pL28rYSkpPD1jP2kobik6IiJ9fSx1LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdHUobi5jb3B5KCksdCxlLHIsaSl9LFdpKHUsbil9ZnVuY3Rpb24gZXUobil7cmV0dXJuIE1hdGgubG9nKDA+bj8wOm4pfWZ1bmN0aW9uIHJ1KG4pe3JldHVybiBNYXRoLmV4cChuKX1mdW5jdGlvbiBpdShuKXtyZXR1cm4tTWF0aC5sb2cobj4wPzA6LW4pfWZ1bmN0aW9uIHV1KG4pe3JldHVybi1NYXRoLmV4cCgtbil9ZnVuY3Rpb24gYXUobix0LGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIG4oaSh0KSl9dmFyIGk9b3UodCksdT1vdSgxL3QpO3JldHVybiByLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdShuLmludmVydCh0KSl9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuLmRvbWFpbigoZT10Lm1hcChOdW1iZXIpKS5tYXAoaSkpLHIpOmV9LHIudGlja3M9ZnVuY3Rpb24obil7cmV0dXJuIFFpKGUsbil9LHIudGlja0Zvcm1hdD1mdW5jdGlvbihuLHQpe3JldHVybiBudShlLG4sdCl9LHIubmljZT1mdW5jdGlvbihuKXtyZXR1cm4gci5kb21haW4oSmkoZSxuKSl9LHIuZXhwb25lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9b3UodD1hKSx1PW91KDEvdCksbi5kb21haW4oZS5tYXAoaSkpLHIpOnR9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBhdShuLmNvcHkoKSx0LGUpfSxXaShyLG4pfWZ1bmN0aW9uIG91KG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD50Py1NYXRoLnBvdygtdCxuKTpNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBjdShuLHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIGFbKCh1LmdldCh0KXx8dS5zZXQodCxuLnB1c2godCkpKS0xKSVhLmxlbmd0aF19ZnVuY3Rpb24gcih0LGUpe3JldHVybiB5YS5yYW5nZShuLmxlbmd0aCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiB0K2Uqbn0pfXZhciB1LGEsbztyZXR1cm4gZS5kb21haW49ZnVuY3Rpb24ocil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG47bj1bXSx1PW5ldyBpO2Zvcih2YXIgYSxvPS0xLGM9ci5sZW5ndGg7KytvPGM7KXUuaGFzKGE9cltvXSl8fHUuc2V0KGEsbi5wdXNoKGEpKTtyZXR1cm4gZVt0LnRdLmFwcGx5KGUsdC5hKX0sZS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1uLG89MCx0PXt0OiJyYW5nZSIsYTphcmd1bWVudHN9LGUpOmF9LGUucmFuZ2VQb2ludHM9ZnVuY3Rpb24oaSx1KXthcmd1bWVudHMubGVuZ3RoPDImJih1PTApO3ZhciBjPWlbMF0sbD1pWzFdLHM9KGwtYykvKE1hdGgubWF4KDEsbi5sZW5ndGgtMSkrdSk7cmV0dXJuIGE9cihuLmxlbmd0aDwyPyhjK2wpLzI6YytzKnUvMixzKSxvPTAsdD17dDoicmFuZ2VQb2ludHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlQmFuZHM9ZnVuY3Rpb24oaSx1LGMpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKHU9MCksYXJndW1lbnRzLmxlbmd0aDwzJiYoYz11KTt2YXIgbD1pWzFdPGlbMF0scz1pW2wtMF0sZj1pWzEtbF0saD0oZi1zKS8obi5sZW5ndGgtdSsyKmMpO3JldHVybiBhPXIocytoKmMsaCksbCYmYS5yZXZlcnNlKCksbz1oKigxLXUpLHQ9e3Q6InJhbmdlQmFuZHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlUm91bmRCYW5kcz1mdW5jdGlvbihpLHUsYyl7YXJndW1lbnRzLmxlbmd0aDwyJiYodT0wKSxhcmd1bWVudHMubGVuZ3RoPDMmJihjPXUpO3ZhciBsPWlbMV08aVswXSxzPWlbbC0wXSxmPWlbMS1sXSxoPU1hdGguZmxvb3IoKGYtcykvKG4ubGVuZ3RoLXUrMipjKSksZz1mLXMtKG4ubGVuZ3RoLXUpKmg7cmV0dXJuIGE9cihzK01hdGgucm91bmQoZy8yKSxoKSxsJiZhLnJldmVyc2UoKSxvPU1hdGgucm91bmQoaCooMS11KSksdD17dDoicmFuZ2VSb3VuZEJhbmRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZUJhbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gb30sZS5yYW5nZUV4dGVudD1mdW5jdGlvbigpe3JldHVybiBVaSh0LmFbMF0pfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gY3Uobix0KX0sZS5kb21haW4obil9ZnVuY3Rpb24gbHUobix0KXtmdW5jdGlvbiBlKCl7dmFyIGU9MCx1PXQubGVuZ3RoO2ZvcihpPVtdOysrZTx1OylpW2UtMV09eWEucXVhbnRpbGUobixlL3UpO3JldHVybiByfWZ1bmN0aW9uIHIobil7cmV0dXJuIGlzTmFOKG49K24pP3ZvaWQgMDp0W3lhLmJpc2VjdChpLG4pXX12YXIgaTtyZXR1cm4gci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dC5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIWlzTmFOKG4pfSkuc29ydCh5YS5hc2NlbmRpbmcpLGUoKSk6bn0sci5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGUoKSk6dH0sci5xdWFudGlsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gaX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGx1KG4sdCl9LGUoKX1mdW5jdGlvbiBzdShuLHQsZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gZVtNYXRoLm1heCgwLE1hdGgubWluKGEsTWF0aC5mbG9vcih1Kih0LW4pKSkpXX1mdW5jdGlvbiBpKCl7cmV0dXJuIHU9ZS5sZW5ndGgvKHQtbiksYT1lLmxlbmd0aC0xLHJ9dmFyIHUsYTtyZXR1cm4gci5kb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K2VbMF0sdD0rZVtlLmxlbmd0aC0xXSxpKCkpOltuLHRdfSxyLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4saSgpKTplfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gc3Uobix0LGUpfSxyLmludmVydEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gdD1lLmluZGV4T2YodCksdD0wPnQ/MC8wOnQvdStuLFt0LHQrMS91XX0saSgpfWZ1bmN0aW9uIGZ1KG4sdCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gZT49ZT90W3lhLmJpc2VjdChuLGUpXTp2b2lkIDB9cmV0dXJuIGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZSk6bn0sZS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGUpOnR9LGUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlPXQuaW5kZXhPZihlKSxbbltlLTFdLG5bZV1dfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gZnUobix0KX0sZX1mdW5jdGlvbiBodShuKXtmdW5jdGlvbiB0KG4pe3JldHVybitufXJldHVybiB0LmludmVydD10LHQuZG9tYWluPXQucmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZS5tYXAodCksdCk6bn0sdC50aWNrcz1mdW5jdGlvbih0KXtyZXR1cm4gUWkobix0KX0sdC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51KG4sdCxlKX0sdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGh1KG4pfSx0fWZ1bmN0aW9uIGd1KG4pe3JldHVybiBuLmlubmVyUmFkaXVzfWZ1bmN0aW9uIHB1KG4pe3JldHVybiBuLm91dGVyUmFkaXVzfWZ1bmN0aW9uIGR1KG4pe3JldHVybiBuLnN0YXJ0QW5nbGV9ZnVuY3Rpb24gbXUobil7cmV0dXJuIG4uZW5kQW5nbGV9ZnVuY3Rpb24gdnUobil7Zm9yKHZhciB0LGUscixpPS0xLHU9bi5sZW5ndGg7KytpPHU7KXQ9bltpXSxlPXRbMF0scj10WzFdK2tjLHRbMF09ZSpNYXRoLmNvcyhyKSx0WzFdPWUqTWF0aC5zaW4ocik7cmV0dXJuIG59ZnVuY3Rpb24geXUobil7ZnVuY3Rpb24gdCh0KXtmdW5jdGlvbiBjKCl7ZC5wdXNoKCJNIixvKG4odiksZikscyxsKG4obS5yZXZlcnNlKCkpLGYpLCJaIil9Zm9yKHZhciBoLGcscCxkPVtdLG09W10sdj1bXSx5PS0xLE09dC5sZW5ndGgseD1mdChlKSxiPWZ0KGkpLF89ZT09PXI/ZnVuY3Rpb24oKXtyZXR1cm4gZ306ZnQociksdz1pPT09dT9mdW5jdGlvbigpe3JldHVybiBwfTpmdCh1KTsrK3k8TTspYS5jYWxsKHRoaXMsaD10W3ldLHkpPyhtLnB1c2goW2c9K3guY2FsbCh0aGlzLGgseSkscD0rYi5jYWxsKHRoaXMsaCx5KV0pLHYucHVzaChbK18uY2FsbCh0aGlzLGgseSksK3cuY2FsbCh0aGlzLGgseSldKSk6bS5sZW5ndGgmJihjKCksbT1bXSx2PVtdKTtyZXR1cm4gbS5sZW5ndGgmJmMoKSxkLmxlbmd0aD9kLmpvaW4oIiIpOm51bGx9dmFyIGU9T2Uscj1PZSxpPTAsdT1ZZSxhPVJ0LG89UmUsYz1vLmtleSxsPW8scz0iTCIsZj0uNztyZXR1cm4gdC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXI9bix0KTpyfSx0LngwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC54MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHQpOnJ9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT11PW4sdCk6dX0sdC55MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLHQpOml9LHQueTE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bix0KTp1fSx0LmRlZmluZWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bix0KTphfSx0LmludGVycG9sYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiBuP289bjoobz1pYy5nZXQobil8fFJlKS5rZXksbD1vLnJldmVyc2V8fG8scz1vLmNsb3NlZD8iTSI6IkwiLHQpOmN9LHQudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1uLHQpOmZ9LHR9ZnVuY3Rpb24gTXUobil7cmV0dXJuIG4ucmFkaXVzfWZ1bmN0aW9uIHh1KG4pe3JldHVybltuLngsbi55XX1mdW5jdGlvbiBidShuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlPXRbMF0scj10WzFdK2tjO3JldHVybltlKk1hdGguY29zKHIpLGUqTWF0aC5zaW4ocildfX1mdW5jdGlvbiBfdSgpe3JldHVybiA2NH1mdW5jdGlvbiB3dSgpe3JldHVybiJjaXJjbGUifWZ1bmN0aW9uIFN1KG4pe3ZhciB0PU1hdGguc3FydChuLyRhKTtyZXR1cm4iTTAsIit0KyJBIit0KyIsIit0KyIgMCAxLDEgMCwiKy10KyJBIit0KyIsIit0KyIgMCAxLDEgMCwiK3QrIloifWZ1bmN0aW9uIEV1KG4sdCl7cmV0dXJuIHphKG4semMpLG4uaWQ9dCxufWZ1bmN0aW9uIGt1KG4sdCxlLHIpe3ZhciBpPW4uaWQ7cmV0dXJuIFQobiwiZnVuY3Rpb24iPT10eXBlb2YgZT9mdW5jdGlvbihuLHUsYSl7bi5fX3RyYW5zaXRpb25fX1tpXS50d2Vlbi5zZXQodCxyKGUuY2FsbChuLG4uX19kYXRhX18sdSxhKSkpfTooZT1yKGUpLGZ1bmN0aW9uKG4pe24uX190cmFuc2l0aW9uX19baV0udHdlZW4uc2V0KHQsZSl9KSl9ZnVuY3Rpb24gQXUobil7cmV0dXJuIG51bGw9PW4mJihuPSIiKSxmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9bn19ZnVuY3Rpb24gTnUobix0LGUscil7dmFyIHU9bi5fX3RyYW5zaXRpb25fX3x8KG4uX190cmFuc2l0aW9uX189e2FjdGl2ZTowLGNvdW50OjB9KSxhPXVbZV07aWYoIWEpe3ZhciBvPXIudGltZTtyZXR1cm4gYT11W2VdPXt0d2VlbjpuZXcgaSxldmVudDp5YS5kaXNwYXRjaCgic3RhcnQiLCJlbmQiKSx0aW1lOm8sZWFzZTpyLmVhc2UsZGVsYXk6ci5kZWxheSxkdXJhdGlvbjpyLmR1cmF0aW9ufSwrK3UuY291bnQseWEudGltZXIoZnVuY3Rpb24ocil7ZnVuY3Rpb24gaShyKXtyZXR1cm4gdS5hY3RpdmU+ZT9sKCk6KHUuYWN0aXZlPWUsaC5zdGFydC5jYWxsKG4scyx0KSxhLnR3ZWVuLmZvckVhY2goZnVuY3Rpb24oZSxyKXsocj1yLmNhbGwobixzLHQpKSYmZC5wdXNoKHIpfSksYyhyKXx8eWEudGltZXIoYywwLG8pLDEpfWZ1bmN0aW9uIGMocil7aWYodS5hY3RpdmUhPT1lKXJldHVybiBsKCk7Zm9yKHZhciBpPShyLWcpL3AsYT1mKGkpLG89ZC5sZW5ndGg7bz4wOylkWy0tb10uY2FsbChuLGEpO3JldHVybiBpPj0xPyhsKCksaC5lbmQuY2FsbChuLHMsdCksMSk6dm9pZCAwfWZ1bmN0aW9uIGwoKXtyZXR1cm4tLXUuY291bnQ/ZGVsZXRlIHVbZV06ZGVsZXRlIG4uX190cmFuc2l0aW9uX18sMX12YXIgcz1uLl9fZGF0YV9fLGY9YS5lYXNlLGg9YS5ldmVudCxnPWEuZGVsYXkscD1hLmR1cmF0aW9uLGQ9W107cmV0dXJuIHI+PWc/aShyKTp5YS50aW1lcihpLGcsbyksMX0sMCxvKSxhfX1mdW5jdGlvbiBxdShuLHQpe24uYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihuKXtyZXR1cm4idHJhbnNsYXRlKCIrdChuKSsiLDApIn0pfWZ1bmN0aW9uIFR1KG4sdCl7bi5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKG4pe3JldHVybiJ0cmFuc2xhdGUoMCwiK3QobikrIikifSl9ZnVuY3Rpb24gQ3Uobix0LGUpe2lmKHI9W10sZSYmdC5sZW5ndGg+MSl7Zm9yKHZhciByLGksdSxhPVVpKG4uZG9tYWluKCkpLG89LTEsYz10Lmxlbmd0aCxsPSh0WzFdLXRbMF0pLysrZTsrK288YzspZm9yKGk9ZTstLWk+MDspKHU9K3Rbb10taSpsKT49YVswXSYmci5wdXNoKHUpO2ZvcigtLW8saT0wOysraTxlJiYodT0rdFtvXStpKmwpPGFbMV07KXIucHVzaCh1KX1yZXR1cm4gcn1mdW5jdGlvbiB6dSgpe3RoaXMuXz1uZXcgRGF0ZShhcmd1bWVudHMubGVuZ3RoPjE/RGF0ZS5VVEMuYXBwbHkodGhpcyxhcmd1bWVudHMpOmFyZ3VtZW50c1swXSl9ZnVuY3Rpb24gRHUobix0LGUpe2Z1bmN0aW9uIHIodCl7dmFyIGU9bih0KSxyPXUoZSwxKTtyZXR1cm4gci10PnQtZT9lOnJ9ZnVuY3Rpb24gaShlKXtyZXR1cm4gdChlPW4obmV3IE9jKGUtMSkpLDEpLGV9ZnVuY3Rpb24gdShuLGUpe3JldHVybiB0KG49bmV3IE9jKCtuKSxlKSxufWZ1bmN0aW9uIGEobixyLHUpe3ZhciBhPWkobiksbz1bXTtpZih1PjEpZm9yKDtyPmE7KWUoYSkldXx8by5wdXNoKG5ldyBEYXRlKCthKSksdChhLDEpO2Vsc2UgZm9yKDtyPmE7KW8ucHVzaChuZXcgRGF0ZSgrYSkpLHQoYSwxKTtyZXR1cm4gb31mdW5jdGlvbiBvKG4sdCxlKXt0cnl7T2M9enU7dmFyIHI9bmV3IHp1O3JldHVybiByLl89bixhKHIsdCxlKX1maW5hbGx5e09jPURhdGV9fW4uZmxvb3I9bixuLnJvdW5kPXIsbi5jZWlsPWksbi5vZmZzZXQ9dSxuLnJhbmdlPWE7dmFyIGM9bi51dGM9anUobik7cmV0dXJuIGMuZmxvb3I9YyxjLnJvdW5kPWp1KHIpLGMuY2VpbD1qdShpKSxjLm9mZnNldD1qdSh1KSxjLnJhbmdlPW8sbn1mdW5jdGlvbiBqdShuKXtyZXR1cm4gZnVuY3Rpb24odCxlKXt0cnl7T2M9enU7dmFyIHI9bmV3IHp1O3JldHVybiByLl89dCxuKHIsZSkuX31maW5hbGx5e09jPURhdGV9fX1mdW5jdGlvbiBMdShuLHQsZSxyKXtmb3IodmFyIGksdSxhPTAsbz10Lmxlbmd0aCxjPWUubGVuZ3RoO28+YTspe2lmKHI+PWMpcmV0dXJuLTE7aWYoaT10LmNoYXJDb2RlQXQoYSsrKSwzNz09PWkpe2lmKHU9YWxbdC5jaGFyQXQoYSsrKV0sIXV8fChyPXUobixlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYoaSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9ZnVuY3Rpb24gSHUobil7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK24ubWFwKHlhLnJlcXVvdGUpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBGdShuKXtmb3IodmFyIHQ9bmV3IGksZT0tMSxyPW4ubGVuZ3RoOysrZTxyOyl0LnNldChuW2VdLnRvTG93ZXJDYXNlKCksZSk7cmV0dXJuIHR9ZnVuY3Rpb24gUHUobix0LGUpe3ZhciByPTA+bj8iLSI6IiIsaT0ocj8tbjpuKSsiIix1PWkubGVuZ3RoO3JldHVybiByKyhlPnU/bmV3IEFycmF5KGUtdSsxKS5qb2luKHQpK2k6aSl9ZnVuY3Rpb24gT3Uobix0LGUpe0djLmxhc3RJbmRleD0wO3ZhciByPUdjLmV4ZWModC5zdWJzdHJpbmcoZSkpO3JldHVybiByPyhuLnc9S2MuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWXUobix0LGUpe1djLmxhc3RJbmRleD0wO3ZhciByPVdjLmV4ZWModC5zdWJzdHJpbmcoZSkpO3JldHVybiByPyhuLnc9SmMuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gUnUobix0LGUpe29sLmxhc3RJbmRleD0wO3ZhciByPW9sLmV4ZWModC5zdWJzdHJpbmcoZSxlKzEpKTtyZXR1cm4gcj8obi53PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFV1KG4sdCxlKXtvbC5sYXN0SW5kZXg9MDt2YXIgcj1vbC5leGVjKHQuc3Vic3RyaW5nKGUpKTtyZXR1cm4gcj8obi5VPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEl1KG4sdCxlKXtvbC5sYXN0SW5kZXg9MDt2YXIgcj1vbC5leGVjKHQuc3Vic3RyaW5nKGUpKTtyZXR1cm4gcj8obi5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFZ1KG4sdCxlKXt0bC5sYXN0SW5kZXg9MDt2YXIgcj10bC5leGVjKHQuc3Vic3RyaW5nKGUpKTtyZXR1cm4gcj8obi5tPWVsLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFh1KG4sdCxlKXtRYy5sYXN0SW5kZXg9MDt2YXIgcj1RYy5leGVjKHQuc3Vic3RyaW5nKGUpKTtyZXR1cm4gcj8obi5tPW5sLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFp1KG4sdCxlKXtyZXR1cm4gTHUobix1bC5jLnRvU3RyaW5nKCksdCxlKX1mdW5jdGlvbiBCdShuLHQsZSl7cmV0dXJuIEx1KG4sdWwueC50b1N0cmluZygpLHQsZSl9ZnVuY3Rpb24gJHUobix0LGUpe3JldHVybiBMdShuLHVsLlgudG9TdHJpbmcoKSx0LGUpfWZ1bmN0aW9uIFd1KG4sdCxlKXtvbC5sYXN0SW5kZXg9MDt2YXIgcj1vbC5leGVjKHQuc3Vic3RyaW5nKGUsZSs0KSk7cmV0dXJuIHI/KG4ueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKdShuLHQsZSl7b2wubGFzdEluZGV4PTA7dmFyIHI9b2wuZXhlYyh0LnN1YnN0cmluZyhlLGUrMikpO3JldHVybiByPyhuLnk9R3UoK3JbMF0pLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEd1KG4pe3JldHVybiBuKyhuPjY4PzE5MDA6MmUzKX1mdW5jdGlvbiBLdShuLHQsZSl7b2wubGFzdEluZGV4PTA7dmFyIHI9b2wuZXhlYyh0LnN1YnN0cmluZyhlLGUrMikpO3JldHVybiByPyhuLm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFF1KG4sdCxlKXtvbC5sYXN0SW5kZXg9MDt2YXIgcj1vbC5leGVjKHQuc3Vic3RyaW5nKGUsZSsyKSk7cmV0dXJuIHI/KG4uZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBuYShuLHQsZSl7b2wubGFzdEluZGV4PTA7dmFyIHI9b2wuZXhlYyh0LnN1YnN0cmluZyhlLGUrMykpO3JldHVybiByPyhuLmo9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdGEobix0LGUpe29sLmxhc3RJbmRleD0wO3ZhciByPW9sLmV4ZWModC5zdWJzdHJpbmcoZSxlKzIpKTtyZXR1cm4gcj8obi5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVhKG4sdCxlKXtvbC5sYXN0SW5kZXg9MDt2YXIgcj1vbC5leGVjKHQuc3Vic3RyaW5nKGUsZSsyKSk7cmV0dXJuIHI/KG4uTT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiByYShuLHQsZSl7b2wubGFzdEluZGV4PTA7dmFyIHI9b2wuZXhlYyh0LnN1YnN0cmluZyhlLGUrMikpO3JldHVybiByPyhuLlM9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gaWEobix0LGUpe29sLmxhc3RJbmRleD0wO3ZhciByPW9sLmV4ZWModC5zdWJzdHJpbmcoZSxlKzMpKTtyZXR1cm4gcj8obi5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVhKG4sdCxlKXt2YXIgcj1jbC5nZXQodC5zdWJzdHJpbmcoZSxlKz0yKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbnVsbD09cj8tMToobi5wPXIsZSl9ZnVuY3Rpb24gYWEobil7dmFyIHQ9bi5nZXRUaW1lem9uZU9mZnNldCgpLGU9dD4wPyItIjoiKyIscj1+fihNYXRoLmFicyh0KS82MCksaT1NYXRoLmFicyh0KSU2MDtyZXR1cm4gZStQdShyLCIwIiwyKStQdShpLCIwIiwyKX1mdW5jdGlvbiBvYShuLHQsZSl7cmwubGFzdEluZGV4PTA7dmFyIHI9cmwuZXhlYyh0LnN1YnN0cmluZyhlLGUrMSkpO3JldHVybiByP2UrclswXS5sZW5ndGg6LTF9ZnVuY3Rpb24gY2Eobil7cmV0dXJuIG4udG9JU09TdHJpbmcoKX1mdW5jdGlvbiBsYShuLHQsZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gbih0KX1yZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHNhKG4uaW52ZXJ0KHQpKX0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4uZG9tYWluKHQpLHIpOm4uZG9tYWluKCkubWFwKHNhKX0sci5uaWNlPWZ1bmN0aW9uKG4pe3JldHVybiByLmRvbWFpbihYaShyLmRvbWFpbigpLG4pKX0sci50aWNrcz1mdW5jdGlvbihlLGkpe3ZhciB1PVVpKHIuZG9tYWluKCkpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXt2YXIgYT11WzFdLXVbMF0sbz1hL2UsYz15YS5iaXNlY3Qoc2wsbyk7aWYoYz09c2wubGVuZ3RoKXJldHVybiB0LnllYXIodSxlKTtpZighYylyZXR1cm4gbi50aWNrcyhlKS5tYXAoc2EpO01hdGgubG9nKG8vc2xbYy0xXSk8TWF0aC5sb2coc2xbY10vbykmJi0tYyxlPXRbY10saT1lWzFdLGU9ZVswXS5yYW5nZX1yZXR1cm4gZSh1WzBdLG5ldyBEYXRlKCt1WzFdKzEpLGkpfSxyLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGxhKG4uY29weSgpLHQsZSl9LFdpKHIsbil9ZnVuY3Rpb24gc2Eobil7cmV0dXJuIG5ldyBEYXRlKG4pfWZ1bmN0aW9uIGZhKG4pe3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9bi5sZW5ndGgtMSxyPW5bZV07IXJbMV0odCk7KXI9blstLWVdO3JldHVybiByWzBdKHQpfX1mdW5jdGlvbiBoYShuKXt2YXIgdD1uZXcgRGF0ZShuLDAsMSk7cmV0dXJuIHQuc2V0RnVsbFllYXIobiksdH1mdW5jdGlvbiBnYShuKXt2YXIgdD1uLmdldEZ1bGxZZWFyKCksZT1oYSh0KSxyPWhhKHQrMSk7cmV0dXJuIHQrKG4tZSkvKHItZSl9ZnVuY3Rpb24gcGEobil7dmFyIHQ9bmV3IERhdGUoRGF0ZS5VVEMobiwwLDEpKTtyZXR1cm4gdC5zZXRVVENGdWxsWWVhcihuKSx0fWZ1bmN0aW9uIGRhKG4pe3ZhciB0PW4uZ2V0VVRDRnVsbFllYXIoKSxlPXBhKHQpLHI9cGEodCsxKTtyZXR1cm4gdCsobi1lKS8oci1lKX1mdW5jdGlvbiBtYShuKXtyZXR1cm4gSlNPTi5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gdmEobil7dmFyIHQ9TWEuY3JlYXRlUmFuZ2UoKTtyZXR1cm4gdC5zZWxlY3ROb2RlKE1hLmJvZHkpLHQuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KG4ucmVzcG9uc2VUZXh0KX12YXIgeWE9e3ZlcnNpb246IjMuMi4zIn07RGF0ZS5ub3d8fChEYXRlLm5vdz1mdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX0pO3ZhciBNYT1kb2N1bWVudCx4YT1NYS5kb2N1bWVudEVsZW1lbnQsYmE9d2luZG93O3RyeXtNYS5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZS5zZXRQcm9wZXJ0eSgib3BhY2l0eSIsMCwiIil9Y2F0Y2goX2Epe3ZhciB3YT1iYS5DU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZSxTYT13YS5zZXRQcm9wZXJ0eTt3YS5zZXRQcm9wZXJ0eT1mdW5jdGlvbihuLHQsZSl7U2EuY2FsbCh0aGlzLG4sdCsiIixlKX19eWEuYXNjZW5kaW5nPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQ+bj8tMTpuPnQ/MTpuPj10PzA6MC8wfSx5YS5kZXNjZW5kaW5nPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4+dD8tMTp0Pm4/MTp0Pj1uPzA6MC8wfSx5YS5taW49ZnVuY3Rpb24obix0KXt2YXIgZSxyLGk9LTEsdT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK2k8dSYmIShudWxsIT0oZT1uW2ldKSYmZT49ZSk7KWU9dm9pZCAwO2Zvcig7KytpPHU7KW51bGwhPShyPW5baV0pJiZlPnImJihlPXIpfWVsc2V7Zm9yKDsrK2k8dSYmIShudWxsIT0oZT10LmNhbGwobixuW2ldLGkpKSYmZT49ZSk7KWU9dm9pZCAwO2Zvcig7KytpPHU7KW51bGwhPShyPXQuY2FsbChuLG5baV0saSkpJiZlPnImJihlPXIpfXJldHVybiBlfSx5YS5tYXg9ZnVuY3Rpb24obix0KXt2YXIgZSxyLGk9LTEsdT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK2k8dSYmIShudWxsIT0oZT1uW2ldKSYmZT49ZSk7KWU9dm9pZCAwO2Zvcig7KytpPHU7KW51bGwhPShyPW5baV0pJiZyPmUmJihlPXIpfWVsc2V7Zm9yKDsrK2k8dSYmIShudWxsIT0oZT10LmNhbGwobixuW2ldLGkpKSYmZT49ZSk7KWU9dm9pZCAwO2Zvcig7KytpPHU7KW51bGwhPShyPXQuY2FsbChuLG5baV0saSkpJiZyPmUmJihlPXIpfXJldHVybiBlfSx5YS5leHRlbnQ9ZnVuY3Rpb24obix0KXt2YXIgZSxyLGksdT0tMSxhPW4ubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IoOysrdTxhJiYhKG51bGwhPShlPWk9blt1XSkmJmU+PWUpOyllPWk9dm9pZCAwO2Zvcig7Kyt1PGE7KW51bGwhPShyPW5bdV0pJiYoZT5yJiYoZT1yKSxyPmkmJihpPXIpKX1lbHNle2Zvcig7Kyt1PGEmJiEobnVsbCE9KGU9aT10LmNhbGwobixuW3VdLHUpKSYmZT49ZSk7KWU9dm9pZCAwO2Zvcig7Kyt1PGE7KW51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiYoZT5yJiYoZT1yKSxyPmkmJihpPXIpKX1yZXR1cm5bZSxpXX0seWEuc3VtPWZ1bmN0aW9uKG4sdCl7dmFyIGUscj0wLGk9bi5sZW5ndGgsdT0tMTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrdTxpOylpc05hTihlPStuW3VdKXx8KHIrPWUpO2Vsc2UgZm9yKDsrK3U8aTspaXNOYU4oZT0rdC5jYWxsKG4sblt1XSx1KSl8fChyKz1lKTtyZXR1cm4gcn0seWEubWVhbj1mdW5jdGlvbih0LGUpe3ZhciByLGk9dC5sZW5ndGgsdT0wLGE9LTEsbz0wO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KythPGk7KW4ocj10W2FdKSYmKHUrPShyLXUpLysrbyk7ZWxzZSBmb3IoOysrYTxpOyluKHI9ZS5jYWxsKHQsdFthXSxhKSkmJih1Kz0oci11KS8rK28pO3JldHVybiBvP3U6dm9pZCAwfSx5YS5xdWFudGlsZT1mdW5jdGlvbihuLHQpe3ZhciBlPShuLmxlbmd0aC0xKSp0KzEscj1NYXRoLmZsb29yKGUpLGk9K25bci0xXSx1PWUtcjtyZXR1cm4gdT9pK3UqKG5bcl0taSk6aX0seWEubWVkaWFuPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MSYmKHQ9dC5tYXAoZSkpLHQ9dC5maWx0ZXIobiksdC5sZW5ndGg/eWEucXVhbnRpbGUodC5zb3J0KHlhLmFzY2VuZGluZyksLjUpOnZvaWQgMH0seWEuYmlzZWN0b3I9ZnVuY3Rpb24obil7cmV0dXJue2xlZnQ6ZnVuY3Rpb24odCxlLHIsaSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYoaT10Lmxlbmd0aCk7aT5yOyl7dmFyIHU9citpPj4+MTtuLmNhbGwodCx0W3VdLHUpPGU/cj11KzE6aT11fXJldHVybiByfSxyaWdodDpmdW5jdGlvbih0LGUscixpKXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJihpPXQubGVuZ3RoKTtpPnI7KXt2YXIgdT1yK2k+Pj4xO2U8bi5jYWxsKHQsdFt1XSx1KT9pPXU6cj11KzF9cmV0dXJuIHJ9fX07dmFyIEVhPXlhLmJpc2VjdG9yKGZ1bmN0aW9uKG4pe3JldHVybiBufSk7eWEuYmlzZWN0TGVmdD1FYS5sZWZ0LHlhLmJpc2VjdD15YS5iaXNlY3RSaWdodD1FYS5yaWdodCx5YS5zaHVmZmxlPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHI9bi5sZW5ndGg7cjspZT0wfE1hdGgucmFuZG9tKCkqci0tLHQ9bltyXSxuW3JdPW5bZV0sbltlXT10O3JldHVybiBufSx5YS5wZXJtdXRlPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPVtdLHI9LTEsaT10Lmxlbmd0aDsrK3I8aTspZVtyXT1uW3Rbcl1dO3JldHVybiBlfSx5YS56aXA9ZnVuY3Rpb24oKXtpZighKGk9YXJndW1lbnRzLmxlbmd0aCkpcmV0dXJuW107Zm9yKHZhciBuPS0xLGU9eWEubWluKGFyZ3VtZW50cyx0KSxyPW5ldyBBcnJheShlKTsrK248ZTspZm9yKHZhciBpLHU9LTEsYT1yW25dPW5ldyBBcnJheShpKTsrK3U8aTspYVt1XT1hcmd1bWVudHNbdV1bbl07cmV0dXJuIHJ9LHlhLnRyYW5zcG9zZT1mdW5jdGlvbihuKXtyZXR1cm4geWEuemlwLmFwcGx5KHlhLG4pfSx5YS5rZXlzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChlKTtyZXR1cm4gdH0seWEudmFsdWVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChuW2VdKTtyZXR1cm4gdH0seWEuZW50cmllcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gbil0LnB1c2goe2tleTplLHZhbHVlOm5bZV19KTtyZXR1cm4gdH0seWEubWVyZ2U9ZnVuY3Rpb24obil7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sbil9LHlhLnJhbmdlPWZ1bmN0aW9uKG4sdCxyKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihyPTEsYXJndW1lbnRzLmxlbmd0aDwyJiYodD1uLG49MCkpLDEvMD09PSh0LW4pL3IpdGhyb3cgbmV3IEVycm9yKCJpbmZpbml0ZSByYW5nZSIpO3ZhciBpLHU9W10sYT1lKE1hdGguYWJzKHIpKSxvPS0xO2lmKG4qPWEsdCo9YSxyKj1hLDA+cilmb3IoOyhpPW4rciorK28pPnQ7KXUucHVzaChpL2EpO2Vsc2UgZm9yKDsoaT1uK3IqKytvKTx0Oyl1LnB1c2goaS9hKTtyZXR1cm4gdX0seWEubWFwPWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBpO2Zvcih2YXIgZSBpbiBuKXQuc2V0KGUsbltlXSk7cmV0dXJuIHR9LHIoaSx7aGFzOmZ1bmN0aW9uKG4pe3JldHVybiBrYStuIGluIHRoaXN9LGdldDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpc1trYStuXX0sc2V0OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIHRoaXNba2Erbl09dH0scmVtb3ZlOmZ1bmN0aW9uKG4pe3JldHVybiBuPWthK24sbiBpbiB0aGlzJiZkZWxldGUgdGhpc1tuXX0sa2V5czpmdW5jdGlvbigpe3ZhciBuPVtdO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24odCl7bi5wdXNoKHQpfSksbn0sdmFsdWVzOmZ1bmN0aW9uKCl7dmFyIG49W107cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbih0LGUpe24ucHVzaChlKX0pLG59LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgbj1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7bi5wdXNoKHtrZXk6dCx2YWx1ZTplfSl9KSxufSxmb3JFYWNoOmZ1bmN0aW9uKG4pe2Zvcih2YXIgdCBpbiB0aGlzKXQuY2hhckNvZGVBdCgwKT09PUFhJiZuLmNhbGwodGhpcyx0LnN1YnN0cmluZygxKSx0aGlzW3RdKX19KTt2YXIga2E9IlwwIixBYT1rYS5jaGFyQ29kZUF0KDApO3lhLm5lc3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQsbyxjKXtpZihjPj1hLmxlbmd0aClyZXR1cm4gcj9yLmNhbGwodSxvKTplP28uc29ydChlKTpvO2Zvcih2YXIgbCxzLGYsaCxnPS0xLHA9by5sZW5ndGgsZD1hW2MrK10sbT1uZXcgaTsrK2c8cDspKGg9bS5nZXQobD1kKHM9b1tnXSkpKT9oLnB1c2gocyk6bS5zZXQobCxbc10pO3JldHVybiB0PyhzPXQoKSxmPWZ1bmN0aW9uKGUscil7cy5zZXQoZSxuKHQscixjKSkKfSk6KHM9e30sZj1mdW5jdGlvbihlLHIpe3NbZV09bih0LHIsYyl9KSxtLmZvckVhY2goZiksc31mdW5jdGlvbiB0KG4sZSl7aWYoZT49YS5sZW5ndGgpcmV0dXJuIG47dmFyIHI9W10saT1vW2UrK107cmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbihuLGkpe3IucHVzaCh7a2V5Om4sdmFsdWVzOnQoaSxlKX0pfSksaT9yLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gaShuLmtleSx0LmtleSl9KTpyfXZhciBlLHIsdT17fSxhPVtdLG89W107cmV0dXJuIHUubWFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oZSx0LDApfSx1LmVudHJpZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobih5YS5tYXAsZSwwKSwwKX0sdS5rZXk9ZnVuY3Rpb24obil7cmV0dXJuIGEucHVzaChuKSx1fSx1LnNvcnRLZXlzPWZ1bmN0aW9uKG4pe3JldHVybiBvW2EubGVuZ3RoLTFdPW4sdX0sdS5zb3J0VmFsdWVzPWZ1bmN0aW9uKG4pe3JldHVybiBlPW4sdX0sdS5yb2xsdXA9ZnVuY3Rpb24obil7cmV0dXJuIHI9bix1fSx1fSx5YS5zZXQ9ZnVuY3Rpb24obil7dmFyIHQ9bmV3IHU7aWYobilmb3IodmFyIGU9MDtlPG4ubGVuZ3RoO2UrKyl0LmFkZChuW2VdKTtyZXR1cm4gdH0scih1LHtoYXM6ZnVuY3Rpb24obil7cmV0dXJuIGthK24gaW4gdGhpc30sYWRkOmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzW2thK25dPSEwLG59LHJlbW92ZTpmdW5jdGlvbihuKXtyZXR1cm4gbj1rYStuLG4gaW4gdGhpcyYmZGVsZXRlIHRoaXNbbl19LHZhbHVlczpmdW5jdGlvbigpe3ZhciBuPVtdO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24odCl7bi5wdXNoKHQpfSksbn0sZm9yRWFjaDpmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gdGhpcyl0LmNoYXJDb2RlQXQoMCk9PT1BYSYmbi5jYWxsKHRoaXMsdC5zdWJzdHJpbmcoMSkpfX0pLHlhLmJlaGF2aW9yPXt9LHlhLnJlYmluZD1mdW5jdGlvbihuLHQpe2Zvcih2YXIgZSxyPTEsaT1hcmd1bWVudHMubGVuZ3RoOysrcjxpOyluW2U9YXJndW1lbnRzW3JdXT1hKG4sdCx0W2VdKTtyZXR1cm4gbn07dmFyIE5hPVsid2Via2l0IiwibXMiLCJtb3oiLCJNb3oiLCJvIiwiTyJdLHFhPWw7dHJ5e3FhKHhhLmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlfWNhdGNoKFRhKXtxYT1jfXlhLmRpc3BhdGNoPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPW5ldyBmLHQ9LTEsZT1hcmd1bWVudHMubGVuZ3RoOysrdDxlOyluW2FyZ3VtZW50c1t0XV09aChuKTtyZXR1cm4gbn0sZi5wcm90b3R5cGUub249ZnVuY3Rpb24obix0KXt2YXIgZT1uLmluZGV4T2YoIi4iKSxyPSIiO2lmKGU+PTAmJihyPW4uc3Vic3RyaW5nKGUrMSksbj1uLnN1YnN0cmluZygwLGUpKSxuKXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpc1tuXS5vbihyKTp0aGlzW25dLm9uKHIsdCk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKG51bGw9PXQpZm9yKG4gaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KG4pJiZ0aGlzW25dLm9uKHIsbnVsbCk7cmV0dXJuIHRoaXN9fSx5YS5ldmVudD1udWxsLHlhLnJlcXVvdGU9ZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZShDYSwiXFwkJiIpfTt2YXIgQ2E9L1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nLHphPXt9Ll9fcHJvdG9fXz9mdW5jdGlvbihuLHQpe24uX19wcm90b19fPXR9OmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlIGluIHQpbltlXT10W2VdfSxEYT1mdW5jdGlvbihuLHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3Iobil9LGphPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbChuKX0sTGE9eGFbbyh4YSwibWF0Y2hlc1NlbGVjdG9yIildLEhhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIExhLmNhbGwobix0KX07ImZ1bmN0aW9uIj09dHlwZW9mIFNpenpsZSYmKERhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIFNpenpsZShuLHQpWzBdfHxudWxsfSxqYT1mdW5jdGlvbihuLHQpe3JldHVybiBTaXp6bGUudW5pcXVlU29ydChTaXp6bGUobix0KSl9LEhhPVNpenpsZS5tYXRjaGVzU2VsZWN0b3IpLHlhLnNlbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiBZYX07dmFyIEZhPXlhLnNlbGVjdGlvbi5wcm90b3R5cGU9W107RmEuc2VsZWN0PWZ1bmN0aW9uKG4pe3ZhciB0LGUscixpLHU9W107bj12KG4pO2Zvcih2YXIgYT0tMSxvPXRoaXMubGVuZ3RoOysrYTxvOyl7dS5wdXNoKHQ9W10pLHQucGFyZW50Tm9kZT0ocj10aGlzW2FdKS5wYXJlbnROb2RlO2Zvcih2YXIgYz0tMSxsPXIubGVuZ3RoOysrYzxsOykoaT1yW2NdKT8odC5wdXNoKGU9bi5jYWxsKGksaS5fX2RhdGFfXyxjKSksZSYmIl9fZGF0YV9fImluIGkmJihlLl9fZGF0YV9fPWkuX19kYXRhX18pKTp0LnB1c2gobnVsbCl9cmV0dXJuIG0odSl9LEZhLnNlbGVjdEFsbD1mdW5jdGlvbihuKXt2YXIgdCxlLHI9W107bj15KG4pO2Zvcih2YXIgaT0tMSx1PXRoaXMubGVuZ3RoOysraTx1Oylmb3IodmFyIGE9dGhpc1tpXSxvPS0xLGM9YS5sZW5ndGg7KytvPGM7KShlPWFbb10pJiYoci5wdXNoKHQ9cWEobi5jYWxsKGUsZS5fX2RhdGFfXyxvKSkpLHQucGFyZW50Tm9kZT1lKTtyZXR1cm4gbShyKX07dmFyIFBhPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTt5YS5ucz17cHJlZml4OlBhLHF1YWxpZnk6ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCI6IiksZT1uO3JldHVybiB0Pj0wJiYoZT1uLnN1YnN0cmluZygwLHQpLG49bi5zdWJzdHJpbmcodCsxKSksUGEuaGFzT3duUHJvcGVydHkoZSk/e3NwYWNlOlBhW2VdLGxvY2FsOm59Om59fSxGYS5hdHRyPWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBlPXRoaXMubm9kZSgpO3JldHVybiBuPXlhLm5zLnF1YWxpZnkobiksbi5sb2NhbD9lLmdldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCk6ZS5nZXRBdHRyaWJ1dGUobil9Zm9yKHQgaW4gbil0aGlzLmVhY2goTSh0LG5bdF0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKE0obix0KSl9LEZhLmNsYXNzZWQ9ZnVuY3Rpb24obix0KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGU9dGhpcy5ub2RlKCkscj0obj1uLnRyaW0oKS5zcGxpdCgvXnxccysvZykpLmxlbmd0aCxpPS0xO2lmKHQ9ZS5jbGFzc0xpc3Qpe2Zvcig7KytpPHI7KWlmKCF0LmNvbnRhaW5zKG5baV0pKXJldHVybiExfWVsc2UgZm9yKHQ9ZS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7KytpPHI7KWlmKCFiKG5baV0pLnRlc3QodCkpcmV0dXJuITE7cmV0dXJuITB9Zm9yKHQgaW4gbil0aGlzLmVhY2goXyh0LG5bdF0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKF8obix0KSl9LEZhLnN0eWxlPWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoO2lmKDM+cil7aWYoInN0cmluZyIhPXR5cGVvZiBuKXsyPnImJih0PSIiKTtmb3IoZSBpbiBuKXRoaXMuZWFjaChTKGUsbltlXSx0KSk7cmV0dXJuIHRoaXN9aWYoMj5yKXJldHVybiBiYS5nZXRDb21wdXRlZFN0eWxlKHRoaXMubm9kZSgpLG51bGwpLmdldFByb3BlcnR5VmFsdWUobik7ZT0iIn1yZXR1cm4gdGhpcy5lYWNoKFMobix0LGUpKX0sRmEucHJvcGVydHk9ZnVuY3Rpb24obix0KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gdGhpcy5ub2RlKClbbl07Zm9yKHQgaW4gbil0aGlzLmVhY2goRSh0LG5bdF0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKEUobix0KSl9LEZhLnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT10PyIiOnR9Om51bGw9PW4/ZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PSIifTpmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9bn0pOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxGYS5odG1sPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PXQ/IiI6dH06bnVsbD09bj9mdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPSIifTpmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPW59KTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LEZhLmFwcGVuZD1mdW5jdGlvbihuKXtyZXR1cm4gbj1rKG4pLHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LEZhLmluc2VydD1mdW5jdGlvbihuLHQpe3JldHVybiBuPWsobiksdD12KHQpLHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pfSxGYS5yZW1vdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49dGhpcy5wYXJlbnROb2RlO24mJm4ucmVtb3ZlQ2hpbGQodGhpcyl9KX0sRmEuZGF0YT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlKXt2YXIgcix1LGEsbz1uLmxlbmd0aCxmPWUubGVuZ3RoLGg9TWF0aC5taW4obyxmKSxnPW5ldyBBcnJheShmKSxwPW5ldyBBcnJheShmKSxkPW5ldyBBcnJheShvKTtpZih0KXt2YXIgbSx2PW5ldyBpLHk9bmV3IGksTT1bXTtmb3Iocj0tMTsrK3I8bzspbT10LmNhbGwodT1uW3JdLHUuX19kYXRhX18sciksdi5oYXMobSk/ZFtyXT11OnYuc2V0KG0sdSksTS5wdXNoKG0pO2ZvcihyPS0xOysrcjxmOyltPXQuY2FsbChlLGE9ZVtyXSxyKSwodT12LmdldChtKSk/KGdbcl09dSx1Ll9fZGF0YV9fPWEpOnkuaGFzKG0pfHwocFtyXT1BKGEpKSx5LnNldChtLGEpLHYucmVtb3ZlKG0pO2ZvcihyPS0xOysrcjxvOyl2LmhhcyhNW3JdKSYmKGRbcl09bltyXSl9ZWxzZXtmb3Iocj0tMTsrK3I8aDspdT1uW3JdLGE9ZVtyXSx1Pyh1Ll9fZGF0YV9fPWEsZ1tyXT11KTpwW3JdPUEoYSk7Zm9yKDtmPnI7KytyKXBbcl09QShlW3JdKTtmb3IoO28+cjsrK3IpZFtyXT1uW3JdfXAudXBkYXRlPWcscC5wYXJlbnROb2RlPWcucGFyZW50Tm9kZT1kLnBhcmVudE5vZGU9bi5wYXJlbnROb2RlLGMucHVzaChwKSxsLnB1c2goZykscy5wdXNoKGQpfXZhciByLHUsYT0tMSxvPXRoaXMubGVuZ3RoO2lmKCFhcmd1bWVudHMubGVuZ3RoKXtmb3Iobj1uZXcgQXJyYXkobz0ocj10aGlzWzBdKS5sZW5ndGgpOysrYTxvOykodT1yW2FdKSYmKG5bYV09dS5fX2RhdGFfXyk7cmV0dXJuIG59dmFyIGM9QyhbXSksbD1tKFtdKSxzPW0oW10pO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKWZvcig7KythPG87KWUocj10aGlzW2FdLG4uY2FsbChyLHIucGFyZW50Tm9kZS5fX2RhdGFfXyxhKSk7ZWxzZSBmb3IoOysrYTxvOyllKHI9dGhpc1thXSxuKTtyZXR1cm4gbC5lbnRlcj1mdW5jdGlvbigpe3JldHVybiBjfSxsLmV4aXQ9ZnVuY3Rpb24oKXtyZXR1cm4gc30sbH0sRmEuZGF0dW09ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLG4pOnRoaXMucHJvcGVydHkoIl9fZGF0YV9fIil9LEZhLmZpbHRlcj1mdW5jdGlvbihuKXt2YXIgdCxlLHIsaT1bXTsiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49TihuKSk7Zm9yKHZhciB1PTAsYT10aGlzLmxlbmd0aDthPnU7dSsrKXtpLnB1c2godD1bXSksdC5wYXJlbnROb2RlPShlPXRoaXNbdV0pLnBhcmVudE5vZGU7Zm9yKHZhciBvPTAsYz1lLmxlbmd0aDtjPm87bysrKShyPWVbb10pJiZuLmNhbGwocixyLl9fZGF0YV9fLG8pJiZ0LnB1c2gocil9cmV0dXJuIG0oaSl9LEZhLm9yZGVyPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xLHQ9dGhpcy5sZW5ndGg7KytuPHQ7KWZvcih2YXIgZSxyPXRoaXNbbl0saT1yLmxlbmd0aC0xLHU9cltpXTstLWk+PTA7KShlPXJbaV0pJiYodSYmdSE9PWUubmV4dFNpYmxpbmcmJnUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx1KSx1PWUpO3JldHVybiB0aGlzfSxGYS5zb3J0PWZ1bmN0aW9uKG4pe249cS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Zm9yKHZhciB0PS0xLGU9dGhpcy5sZW5ndGg7Kyt0PGU7KXRoaXNbdF0uc29ydChuKTtyZXR1cm4gdGhpcy5vcmRlcigpfSxGYS5lYWNoPWZ1bmN0aW9uKG4pe3JldHVybiBUKHRoaXMsZnVuY3Rpb24odCxlLHIpe24uY2FsbCh0LHQuX19kYXRhX18sZSxyKX0pfSxGYS5jYWxsPWZ1bmN0aW9uKG4pe3ZhciB0PXFhKGFyZ3VtZW50cyk7cmV0dXJuIG4uYXBwbHkodFswXT10aGlzLHQpLHRoaXN9LEZhLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxGYS5ub2RlPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsdD10aGlzLmxlbmd0aDt0Pm47bisrKWZvcih2YXIgZT10aGlzW25dLHI9MCxpPWUubGVuZ3RoO2k+cjtyKyspe3ZhciB1PWVbcl07aWYodSlyZXR1cm4gdX1yZXR1cm4gbnVsbH0sRmEuc2l6ZT1mdW5jdGlvbigpe3ZhciBuPTA7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeysrbn0pLG59O3ZhciBPYT1bXTt5YS5zZWxlY3Rpb24uZW50ZXI9Qyx5YS5zZWxlY3Rpb24uZW50ZXIucHJvdG90eXBlPU9hLE9hLmFwcGVuZD1GYS5hcHBlbmQsT2EuaW5zZXJ0PUZhLmluc2VydCxPYS5lbXB0eT1GYS5lbXB0eSxPYS5ub2RlPUZhLm5vZGUsT2EuY2FsbD1GYS5jYWxsLE9hLnNpemU9RmEuc2l6ZSxPYS5zZWxlY3Q9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscixpLHUsYT1bXSxvPS0xLGM9dGhpcy5sZW5ndGg7KytvPGM7KXtyPShpPXRoaXNbb10pLnVwZGF0ZSxhLnB1c2godD1bXSksdC5wYXJlbnROb2RlPWkucGFyZW50Tm9kZTtmb3IodmFyIGw9LTEscz1pLmxlbmd0aDsrK2w8czspKHU9aVtsXSk/KHQucHVzaChyW2xdPWU9bi5jYWxsKGkucGFyZW50Tm9kZSx1Ll9fZGF0YV9fLGwpKSxlLl9fZGF0YV9fPXUuX19kYXRhX18pOnQucHVzaChudWxsKX1yZXR1cm4gbShhKX0sRmEudHJhbnNpdGlvbj1mdW5jdGlvbigpe3ZhciBuLHQsZT1xY3x8KytEYyxyPVtdLGk9T2JqZWN0LmNyZWF0ZShqYyk7aS50aW1lPURhdGUubm93KCk7Zm9yKHZhciB1PS0xLGE9dGhpcy5sZW5ndGg7Kyt1PGE7KXtyLnB1c2gobj1bXSk7Zm9yKHZhciBvPXRoaXNbdV0sYz0tMSxsPW8ubGVuZ3RoOysrYzxsOykodD1vW2NdKSYmTnUodCxjLGUsaSksbi5wdXNoKHQpfXJldHVybiBFdShyLGUpfSx5YS5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQ9WyJzdHJpbmciPT10eXBlb2Ygbj9EYShuLE1hKTpuXTtyZXR1cm4gdC5wYXJlbnROb2RlPXhhLG0oW3RdKX0seWEuc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0PXFhKCJzdHJpbmciPT10eXBlb2Ygbj9qYShuLE1hKTpuKTtyZXR1cm4gdC5wYXJlbnROb2RlPXhhLG0oW3RdKX07dmFyIFlhPXlhLnNlbGVjdCh4YSk7RmEub249ZnVuY3Rpb24obix0LGUpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5yKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+ciYmKHQ9ITEpO2ZvcihlIGluIG4pdGhpcy5lYWNoKHooZSxuW2VdLHQpKTtyZXR1cm4gdGhpc31pZigyPnIpcmV0dXJuKHI9dGhpcy5ub2RlKClbIl9fb24iK25dKSYmci5fO2U9ITF9cmV0dXJuIHRoaXMuZWFjaCh6KG4sdCxlKSl9O3ZhciBSYT15YS5tYXAoe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSk7UmEuZm9yRWFjaChmdW5jdGlvbihuKXsib24iK24gaW4gTWEmJlJhLnJlbW92ZShuKX0pO3ZhciBVYT1vKHhhLnN0eWxlLCJ1c2VyU2VsZWN0Iik7eWEubW91c2U9ZnVuY3Rpb24obil7cmV0dXJuIEgobixwKCkpfTt2YXIgSWE9L1dlYktpdC8udGVzdChiYS5uYXZpZ2F0b3IudXNlckFnZW50KT8tMTowO3lhLnRvdWNoZXM9ZnVuY3Rpb24obix0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD1wKCkudG91Y2hlcyksdD9xYSh0KS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9SChuLHQpO3JldHVybiBlLmlkZW50aWZpZXI9dC5pZGVudGlmaWVyLGV9KTpbXX0seWEuYmVoYXZpb3IuZHJhZz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt0aGlzLm9uKCJtb3VzZWRvd24uZHJhZyIsdCkub24oInRvdWNoc3RhcnQuZHJhZyIsdCl9ZnVuY3Rpb24gdCgpe2Z1bmN0aW9uIG4oKXt2YXIgbj1hLnBhcmVudE5vZGU7cmV0dXJuIG51bGwhPWw/eWEudG91Y2hlcyhuKS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIG4uaWRlbnRpZmllcj09PWx9KVswXTp5YS5tb3VzZShuKX1mdW5jdGlvbiB0KCl7aWYoIWEucGFyZW50Tm9kZSlyZXR1cm4gaSgpO3ZhciB0PW4oKSxlPXRbMF0tc1swXSxyPXRbMV0tc1sxXTtmfD1lfHIscz10LG8oe3R5cGU6ImRyYWciLHg6dFswXSt1WzBdLHk6dFsxXSt1WzFdLGR4OmUsZHk6cn0pfWZ1bmN0aW9uIGkoKXtnLm9uKG51bGwhPWw/InRvdWNobW92ZS5kcmFnLSIrbDoibW91c2Vtb3ZlLmRyYWciLG51bGwpLm9uKG51bGwhPWw/InRvdWNoZW5kLmRyYWctIitsOiJtb3VzZXVwLmRyYWciLG51bGwpLGgoZiYmeWEuZXZlbnQudGFyZ2V0PT09Yyksbyh7dHlwZToiZHJhZ2VuZCJ9KX12YXIgdSxhPXRoaXMsbz1lLm9mKGEsYXJndW1lbnRzKSxjPXlhLmV2ZW50LnRhcmdldCxsPXlhLmV2ZW50LnRvdWNoZXM/eWEuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcjpudWxsLHM9bigpLGY9MCxoPUwobnVsbCE9bD8iZHJhZy0iK2w6ImRyYWciKSxnPXlhLnNlbGVjdChiYSkub24obnVsbCE9bD8idG91Y2htb3ZlLmRyYWctIitsOiJtb3VzZW1vdmUuZHJhZyIsdCkub24obnVsbCE9bD8idG91Y2hlbmQuZHJhZy0iK2w6Im1vdXNldXAuZHJhZyIsaSwhMCk7cj8odT1yLmFwcGx5KGEsYXJndW1lbnRzKSx1PVt1Lngtc1swXSx1Lnktc1sxXV0pOnU9WzAsMF0sbyh7dHlwZToiZHJhZ3N0YXJ0In0pfXZhciBlPWQobiwiZHJhZyIsImRyYWdzdGFydCIsImRyYWdlbmQiKSxyPW51bGw7cmV0dXJuIG4ub3JpZ2luPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0seWEucmViaW5kKG4sZSwib24iKX0seWEuYmVoYXZpb3Iuem9vbT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt0aGlzLm9uKCJtb3VzZWRvd24uem9vbSIsbykub24oIm1vdXNlbW92ZS56b29tIixsKS5vbihaYSsiLnpvb20iLGMpLm9uKCJkYmxjbGljay56b29tIixzKS5vbigidG91Y2hzdGFydC56b29tIixmKS5vbigidG91Y2htb3ZlLnpvb20iLGgpLm9uKCJ0b3VjaGVuZC56b29tIixmKX1mdW5jdGlvbiB0KG4pe3JldHVyblsoblswXS1fWzBdKS93LChuWzFdLV9bMV0pL3ddfWZ1bmN0aW9uIGUobil7cmV0dXJuW25bMF0qdytfWzBdLG5bMV0qdytfWzFdXX1mdW5jdGlvbiByKG4pe3c9TWF0aC5tYXgoU1swXSxNYXRoLm1pbihTWzFdLG4pKX1mdW5jdGlvbiBpKG4sdCl7dD1lKHQpLF9bMF0rPW5bMF0tdFswXSxfWzFdKz1uWzFdLXRbMV19ZnVuY3Rpb24gdSgpe3kmJnkuZG9tYWluKHYucmFuZ2UoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4tX1swXSkvd30pLm1hcCh2LmludmVydCkpLHgmJnguZG9tYWluKE0ucmFuZ2UoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4tX1sxXSkvd30pLm1hcChNLmludmVydCkpfWZ1bmN0aW9uIGEobil7dSgpLHlhLmV2ZW50LnByZXZlbnREZWZhdWx0KCksbih7dHlwZToiem9vbSIsc2NhbGU6dyx0cmFuc2xhdGU6X30pfWZ1bmN0aW9uIG8oKXtmdW5jdGlvbiBuKCl7Yz0xLGkoeWEubW91c2UocikscyksYSh1KX1mdW5jdGlvbiBlKCl7bC5vbigibW91c2Vtb3ZlLnpvb20iLG51bGwpLm9uKCJtb3VzZXVwLnpvb20iLG51bGwpLGYoYyYmeWEuZXZlbnQudGFyZ2V0PT09byl9dmFyIHI9dGhpcyx1PUUub2Yocixhcmd1bWVudHMpLG89eWEuZXZlbnQudGFyZ2V0LGM9MCxsPXlhLnNlbGVjdChiYSkub24oIm1vdXNlbW92ZS56b29tIixuKS5vbigibW91c2V1cC56b29tIixlKSxzPXQoeWEubW91c2UocikpLGY9TCgiem9vbSIpfWZ1bmN0aW9uIGMoKXtnfHwoZz10KHlhLm1vdXNlKHRoaXMpKSkscihNYXRoLnBvdygyLC4wMDIqVmEoKSkqdyksaSh5YS5tb3VzZSh0aGlzKSxnKSxhKEUub2YodGhpcyxhcmd1bWVudHMpKX1mdW5jdGlvbiBsKCl7Zz1udWxsfWZ1bmN0aW9uIHMoKXt2YXIgbj15YS5tb3VzZSh0aGlzKSxlPXQobiksdT1NYXRoLmxvZyh3KS9NYXRoLkxOMjtyKE1hdGgucG93KDIseWEuZXZlbnQuc2hpZnRLZXk/TWF0aC5jZWlsKHUpLTE6TWF0aC5mbG9vcih1KSsxKSksaShuLGUpLGEoRS5vZih0aGlzLGFyZ3VtZW50cykpfWZ1bmN0aW9uIGYoKXt2YXIgbj15YS50b3VjaGVzKHRoaXMpLGU9RGF0ZS5ub3coKTtpZihtPXcsZz17fSxwPTAsbi5mb3JFYWNoKGZ1bmN0aW9uKG4pe2dbbi5pZGVudGlmaWVyXT10KG4pfSksMT09PW4ubGVuZ3RoKXtpZig1MDA+ZS1iKXt2YXIgdT1uWzBdLG89dChuWzBdKTtyKDIqdyksaSh1LG8pLGEoRS5vZih0aGlzLGFyZ3VtZW50cykpfWI9ZX1lbHNlIGlmKG4ubGVuZ3RoPjEpe3ZhciB1PW5bMF0sYz1uWzFdLGw9dVswXS1jWzBdLHM9dVsxXS1jWzFdO3A9bCpsK3Mqc319ZnVuY3Rpb24gaCgpe3ZhciBuPXlhLnRvdWNoZXModGhpcyksdD1uWzBdLGU9Z1t0LmlkZW50aWZpZXJdO2lmKHU9blsxXSl7dmFyIHUsbz1nW3UuaWRlbnRpZmllcl0sYz15YS5ldmVudC5zY2FsZTtpZihudWxsPT1jKXt2YXIgbD0obD11WzBdLXRbMF0pKmwrKGw9dVsxXS10WzFdKSpsO2M9cCYmTWF0aC5zcXJ0KGwvcCl9dD1bKHRbMF0rdVswXSkvMiwodFsxXSt1WzFdKS8yXSxlPVsoZVswXStvWzBdKS8yLChlWzFdK29bMV0pLzJdLHIoYyptKX1pKHQsZSksYj1udWxsLGEoRS5vZih0aGlzLGFyZ3VtZW50cykpfXZhciBnLHAsbSx2LHksTSx4LGIsXz1bMCwwXSx3PTEsUz1YYSxFPWQobiwiem9vbSIpO3JldHVybiBuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz10Lm1hcChOdW1iZXIpLHUoKSxuKTpffSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PSt0LHUoKSxuKTp3fSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhTPW51bGw9PXQ/WGE6dC5tYXAoTnVtYmVyKSxuKTpTfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9dCx2PXQuY29weSgpLF89WzAsMF0sdz0xLG4pOnl9LG4ueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD10LE09dC5jb3B5KCksXz1bMCwwXSx3PTEsbik6eH0seWEucmViaW5kKG4sRSwib24iKX07dmFyIFZhLFhhPVswLDEvMF0sWmE9Im9ud2hlZWwiaW4gTWE/KFZhPWZ1bmN0aW9uKCl7cmV0dXJuLXlhLmV2ZW50LmRlbHRhWSooeWEuZXZlbnQuZGVsdGFNb2RlPzEyMDoxKX0sIndoZWVsIik6Im9ubW91c2V3aGVlbCJpbiBNYT8oVmE9ZnVuY3Rpb24oKXtyZXR1cm4geWEuZXZlbnQud2hlZWxEZWx0YX0sIm1vdXNld2hlZWwiKTooVmE9ZnVuY3Rpb24oKXtyZXR1cm4teWEuZXZlbnQuZGV0YWlsfSwiTW96TW91c2VQaXhlbFNjcm9sbCIpO0YucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9LHlhLmhzbD1mdW5jdGlvbihuLHQsZSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP24gaW5zdGFuY2VvZiBPP1Aobi5oLG4ucyxuLmwpOmF0KCIiK24sb3QsUCk6UCgrbiwrdCwrZSl9O3ZhciBCYT1PLnByb3RvdHlwZT1uZXcgRjtCYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksUCh0aGlzLmgsdGhpcy5zLHRoaXMubC9uKX0sQmEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxQKHRoaXMuaCx0aGlzLnMsbip0aGlzLmwpfSxCYS5yZ2I9ZnVuY3Rpb24oKXtyZXR1cm4gWSh0aGlzLmgsdGhpcy5zLHRoaXMubCl9O3ZhciAkYT1NYXRoLlBJLFdhPTFlLTYsSmE9V2EqV2EsR2E9JGEvMTgwLEthPTE4MC8kYTt5YS5oY2w9ZnVuY3Rpb24obix0LGUpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9uIGluc3RhbmNlb2YgJD9CKG4uaCxuLmMsbi5sKTpuIGluc3RhbmNlb2YgRz9RKG4ubCxuLmEsbi5iKTpRKChuPWN0KChuPXlhLnJnYihuKSkucixuLmcsbi5iKSkubCxuLmEsbi5iKTpCKCtuLCt0LCtlKX07dmFyIFFhPSQucHJvdG90eXBlPW5ldyBGO1FhLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBCKHRoaXMuaCx0aGlzLmMsTWF0aC5taW4oMTAwLHRoaXMubCtubyooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSl9LFFhLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gQih0aGlzLmgsdGhpcy5jLE1hdGgubWF4KDAsdGhpcy5sLW5vKihhcmd1bWVudHMubGVuZ3RoP246MSkpKX0sUWEucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIFcodGhpcy5oLHRoaXMuYyx0aGlzLmwpLnJnYigpfSx5YS5sYWI9ZnVuY3Rpb24obix0LGUpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9uIGluc3RhbmNlb2YgRz9KKG4ubCxuLmEsbi5iKTpuIGluc3RhbmNlb2YgJD9XKG4ubCxuLmMsbi5oKTpjdCgobj15YS5yZ2IobikpLnIsbi5nLG4uYik6SigrbiwrdCwrZSl9O3ZhciBubz0xOCx0bz0uOTUwNDcsZW89MSxybz0xLjA4ODgzLGlvPUcucHJvdG90eXBlPW5ldyBGO2lvLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBKKE1hdGgubWluKDEwMCx0aGlzLmwrbm8qKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSksdGhpcy5hLHRoaXMuYil9LGlvLmRhcmtlcj1mdW5jdGlvbihuKXtyZXR1cm4gSihNYXRoLm1heCgwLHRoaXMubC1ubyooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSx0aGlzLmEsdGhpcy5iKX0saW8ucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIEsodGhpcy5sLHRoaXMuYSx0aGlzLmIpfSx5YS5yZ2I9ZnVuY3Rpb24obix0LGUpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9uIGluc3RhbmNlb2YgaXQ/cnQobi5yLG4uZyxuLmIpOmF0KCIiK24scnQsWSk6cnQofn5uLH5+dCx+fmUpfTt2YXIgdW89aXQucHJvdG90eXBlPW5ldyBGO3VvLmJyaWdodGVyPWZ1bmN0aW9uKG4pe249TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpO3ZhciB0PXRoaXMucixlPXRoaXMuZyxyPXRoaXMuYixpPTMwO3JldHVybiB0fHxlfHxyPyh0JiZpPnQmJih0PWkpLGUmJmk+ZSYmKGU9aSksciYmaT5yJiYocj1pKSxydChNYXRoLm1pbigyNTUsTWF0aC5mbG9vcih0L24pKSxNYXRoLm1pbigyNTUsTWF0aC5mbG9vcihlL24pKSxNYXRoLm1pbigyNTUsTWF0aC5mbG9vcihyL24pKSkpOnJ0KGksaSxpKX0sdW8uZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxydChNYXRoLmZsb29yKG4qdGhpcy5yKSxNYXRoLmZsb29yKG4qdGhpcy5nKSxNYXRoLmZsb29yKG4qdGhpcy5iKSl9LHVvLmhzbD1mdW5jdGlvbigpe3JldHVybiBvdCh0aGlzLnIsdGhpcy5nLHRoaXMuYil9LHVvLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIiMiK3V0KHRoaXMucikrdXQodGhpcy5nKSt1dCh0aGlzLmIpfTt2YXIgYW89eWEubWFwKHthbGljZWJsdWU6IiNmMGY4ZmYiLGFudGlxdWV3aGl0ZToiI2ZhZWJkNyIsYXF1YToiIzAwZmZmZiIsYXF1YW1hcmluZToiIzdmZmZkNCIsYXp1cmU6IiNmMGZmZmYiLGJlaWdlOiIjZjVmNWRjIixiaXNxdWU6IiNmZmU0YzQiLGJsYWNrOiIjMDAwMDAwIixibGFuY2hlZGFsbW9uZDoiI2ZmZWJjZCIsYmx1ZToiIzAwMDBmZiIsYmx1ZXZpb2xldDoiIzhhMmJlMiIsYnJvd246IiNhNTJhMmEiLGJ1cmx5d29vZDoiI2RlYjg4NyIsY2FkZXRibHVlOiIjNWY5ZWEwIixjaGFydHJldXNlOiIjN2ZmZjAwIixjaG9jb2xhdGU6IiNkMjY5MWUiLGNvcmFsOiIjZmY3ZjUwIixjb3JuZmxvd2VyYmx1ZToiIzY0OTVlZCIsY29ybnNpbGs6IiNmZmY4ZGMiLGNyaW1zb246IiNkYzE0M2MiLGN5YW46IiMwMGZmZmYiLGRhcmtibHVlOiIjMDAwMDhiIixkYXJrY3lhbjoiIzAwOGI4YiIsZGFya2dvbGRlbnJvZDoiI2I4ODYwYiIsZGFya2dyYXk6IiNhOWE5YTkiLGRhcmtncmVlbjoiIzAwNjQwMCIsZGFya2dyZXk6IiNhOWE5YTkiLGRhcmtraGFraToiI2JkYjc2YiIsZGFya21hZ2VudGE6IiM4YjAwOGIiLGRhcmtvbGl2ZWdyZWVuOiIjNTU2YjJmIixkYXJrb3JhbmdlOiIjZmY4YzAwIixkYXJrb3JjaGlkOiIjOTkzMmNjIixkYXJrcmVkOiIjOGIwMDAwIixkYXJrc2FsbW9uOiIjZTk5NjdhIixkYXJrc2VhZ3JlZW46IiM4ZmJjOGYiLGRhcmtzbGF0ZWJsdWU6IiM0ODNkOGIiLGRhcmtzbGF0ZWdyYXk6IiMyZjRmNGYiLGRhcmtzbGF0ZWdyZXk6IiMyZjRmNGYiLGRhcmt0dXJxdW9pc2U6IiMwMGNlZDEiLGRhcmt2aW9sZXQ6IiM5NDAwZDMiLGRlZXBwaW5rOiIjZmYxNDkzIixkZWVwc2t5Ymx1ZToiIzAwYmZmZiIsZGltZ3JheToiIzY5Njk2OSIsZGltZ3JleToiIzY5Njk2OSIsZG9kZ2VyYmx1ZToiIzFlOTBmZiIsZmlyZWJyaWNrOiIjYjIyMjIyIixmbG9yYWx3aGl0ZToiI2ZmZmFmMCIsZm9yZXN0Z3JlZW46IiMyMjhiMjIiLGZ1Y2hzaWE6IiNmZjAwZmYiLGdhaW5zYm9ybzoiI2RjZGNkYyIsZ2hvc3R3aGl0ZToiI2Y4ZjhmZiIsZ29sZDoiI2ZmZDcwMCIsZ29sZGVucm9kOiIjZGFhNTIwIixncmF5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsZ3JlZW55ZWxsb3c6IiNhZGZmMmYiLGdyZXk6IiM4MDgwODAiLGhvbmV5ZGV3OiIjZjBmZmYwIixob3RwaW5rOiIjZmY2OWI0IixpbmRpYW5yZWQ6IiNjZDVjNWMiLGluZGlnbzoiIzRiMDA4MiIsaXZvcnk6IiNmZmZmZjAiLGtoYWtpOiIjZjBlNjhjIixsYXZlbmRlcjoiI2U2ZTZmYSIsbGF2ZW5kZXJibHVzaDoiI2ZmZjBmNSIsbGF3bmdyZWVuOiIjN2NmYzAwIixsZW1vbmNoaWZmb246IiNmZmZhY2QiLGxpZ2h0Ymx1ZToiI2FkZDhlNiIsbGlnaHRjb3JhbDoiI2YwODA4MCIsbGlnaHRjeWFuOiIjZTBmZmZmIixsaWdodGdvbGRlbnJvZHllbGxvdzoiI2ZhZmFkMiIsbGlnaHRncmF5OiIjZDNkM2QzIixsaWdodGdyZWVuOiIjOTBlZTkwIixsaWdodGdyZXk6IiNkM2QzZDMiLGxpZ2h0cGluazoiI2ZmYjZjMSIsbGlnaHRzYWxtb246IiNmZmEwN2EiLGxpZ2h0c2VhZ3JlZW46IiMyMGIyYWEiLGxpZ2h0c2t5Ymx1ZToiIzg3Y2VmYSIsbGlnaHRzbGF0ZWdyYXk6IiM3Nzg4OTkiLGxpZ2h0c2xhdGVncmV5OiIjNzc4ODk5IixsaWdodHN0ZWVsYmx1ZToiI2IwYzRkZSIsbGlnaHR5ZWxsb3c6IiNmZmZmZTAiLGxpbWU6IiMwMGZmMDAiLGxpbWVncmVlbjoiIzMyY2QzMiIsbGluZW46IiNmYWYwZTYiLG1hZ2VudGE6IiNmZjAwZmYiLG1hcm9vbjoiIzgwMDAwMCIsbWVkaXVtYXF1YW1hcmluZToiIzY2Y2RhYSIsbWVkaXVtYmx1ZToiIzAwMDBjZCIsbWVkaXVtb3JjaGlkOiIjYmE1NWQzIixtZWRpdW1wdXJwbGU6IiM5MzcwZGIiLG1lZGl1bXNlYWdyZWVuOiIjM2NiMzcxIixtZWRpdW1zbGF0ZWJsdWU6IiM3YjY4ZWUiLG1lZGl1bXNwcmluZ2dyZWVuOiIjMDBmYTlhIixtZWRpdW10dXJxdW9pc2U6IiM0OGQxY2MiLG1lZGl1bXZpb2xldHJlZDoiI2M3MTU4NSIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixtaW50Y3JlYW06IiNmNWZmZmEiLG1pc3R5cm9zZToiI2ZmZTRlMSIsbW9jY2FzaW46IiNmZmU0YjUiLG5hdmFqb3doaXRlOiIjZmZkZWFkIixuYXZ5OiIjMDAwMDgwIixvbGRsYWNlOiIjZmRmNWU2IixvbGl2ZToiIzgwODAwMCIsb2xpdmVkcmFiOiIjNmI4ZTIzIixvcmFuZ2U6IiNmZmE1MDAiLG9yYW5nZXJlZDoiI2ZmNDUwMCIsb3JjaGlkOiIjZGE3MGQ2IixwYWxlZ29sZGVucm9kOiIjZWVlOGFhIixwYWxlZ3JlZW46IiM5OGZiOTgiLHBhbGV0dXJxdW9pc2U6IiNhZmVlZWUiLHBhbGV2aW9sZXRyZWQ6IiNkYjcwOTMiLHBhcGF5YXdoaXA6IiNmZmVmZDUiLHBlYWNocHVmZjoiI2ZmZGFiOSIscGVydToiI2NkODUzZiIscGluazoiI2ZmYzBjYiIscGx1bToiI2RkYTBkZCIscG93ZGVyYmx1ZToiI2IwZTBlNiIscHVycGxlOiIjODAwMDgwIixyZWQ6IiNmZjAwMDAiLHJvc3licm93bjoiI2JjOGY4ZiIscm95YWxibHVlOiIjNDE2OWUxIixzYWRkbGVicm93bjoiIzhiNDUxMyIsc2FsbW9uOiIjZmE4MDcyIixzYW5keWJyb3duOiIjZjRhNDYwIixzZWFncmVlbjoiIzJlOGI1NyIsc2Vhc2hlbGw6IiNmZmY1ZWUiLHNpZW5uYToiI2EwNTIyZCIsc2lsdmVyOiIjYzBjMGMwIixza3libHVlOiIjODdjZWViIixzbGF0ZWJsdWU6IiM2YTVhY2QiLHNsYXRlZ3JheToiIzcwODA5MCIsc2xhdGVncmV5OiIjNzA4MDkwIixzbm93OiIjZmZmYWZhIixzcHJpbmdncmVlbjoiIzAwZmY3ZiIsc3RlZWxibHVlOiIjNDY4MmI0Iix0YW46IiNkMmI0OGMiLHRlYWw6IiMwMDgwODAiLHRoaXN0bGU6IiNkOGJmZDgiLHRvbWF0bzoiI2ZmNjM0NyIsdHVycXVvaXNlOiIjNDBlMGQwIix2aW9sZXQ6IiNlZTgyZWUiLHdoZWF0OiIjZjVkZWIzIix3aGl0ZToiI2ZmZmZmZiIsd2hpdGVzbW9rZToiI2Y1ZjVmNSIseWVsbG93OiIjZmZmZjAwIix5ZWxsb3dncmVlbjoiIzlhY2QzMiJ9KTthby5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7YW8uc2V0KG4sYXQodCxydCxZKSl9KSx5YS5mdW5jdG9yPWZ0LHlhLnhocj1ndChodCkseWEuZHN2PWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuLGUsdSl7YXJndW1lbnRzLmxlbmd0aDwzJiYodT1lLGU9bnVsbCk7dmFyIGE9eWEueGhyKG4sdCx1KTtyZXR1cm4gYS5yb3c9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/YS5yZXNwb25zZShudWxsPT0oZT1uKT9yOmkobikpOmV9LGEucm93KGUpfWZ1bmN0aW9uIHIobil7cmV0dXJuIGUucGFyc2Uobi5yZXNwb25zZVRleHQpfWZ1bmN0aW9uIGkobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLnBhcnNlKHQucmVzcG9uc2VUZXh0LG4pfX1mdW5jdGlvbiBhKHQpe3JldHVybiB0Lm1hcChvKS5qb2luKG4pfWZ1bmN0aW9uIG8obil7cmV0dXJuIGMudGVzdChuKT8nIicrbi5yZXBsYWNlKC9cIi9nLCciIicpKyciJzpufXZhciBjPW5ldyBSZWdFeHAoJ1siJytuKyJcbl0iKSxsPW4uY2hhckNvZGVBdCgwKTtyZXR1cm4gZS5wYXJzZT1mdW5jdGlvbihuLHQpe3ZhciByO3JldHVybiBlLnBhcnNlUm93cyhuLGZ1bmN0aW9uKG4sZSl7aWYocilyZXR1cm4gcihuLGUtMSk7dmFyIGk9bmV3IEZ1bmN0aW9uKCJkIiwicmV0dXJuIHsiK24ubWFwKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KG4pKyI6IGRbIit0KyJdIn0pLmpvaW4oIiwiKSsifSIpO3I9dD9mdW5jdGlvbihuLGUpe3JldHVybiB0KGkobiksZSl9Oml9KX0sZS5wYXJzZVJvd3M9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKCl7aWYocz49YylyZXR1cm4gYTtpZihpKXJldHVybiBpPSExLHU7dmFyIHQ9cztpZigzND09PW4uY2hhckNvZGVBdCh0KSl7Zm9yKHZhciBlPXQ7ZSsrPGM7KWlmKDM0PT09bi5jaGFyQ29kZUF0KGUpKXtpZigzNCE9PW4uY2hhckNvZGVBdChlKzEpKWJyZWFrOysrZX1zPWUrMjt2YXIgcj1uLmNoYXJDb2RlQXQoZSsxKTtyZXR1cm4gMTM9PT1yPyhpPSEwLDEwPT09bi5jaGFyQ29kZUF0KGUrMikmJisrcyk6MTA9PT1yJiYoaT0hMCksbi5zdWJzdHJpbmcodCsxLGUpLnJlcGxhY2UoLyIiL2csJyInKX1mb3IoO2M+czspe3ZhciByPW4uY2hhckNvZGVBdChzKyspLG89MTtpZigxMD09PXIpaT0hMDtlbHNlIGlmKDEzPT09cilpPSEwLDEwPT09bi5jaGFyQ29kZUF0KHMpJiYoKytzLCsrbyk7ZWxzZSBpZihyIT09bCljb250aW51ZTtyZXR1cm4gbi5zdWJzdHJpbmcodCxzLW8pfXJldHVybiBuLnN1YnN0cmluZyh0KX1mb3IodmFyIHIsaSx1PXt9LGE9e30sbz1bXSxjPW4ubGVuZ3RoLHM9MCxmPTA7KHI9ZSgpKSE9PWE7KXtmb3IodmFyIGg9W107ciE9PXUmJnIhPT1hOyloLnB1c2gocikscj1lKCk7KCF0fHwoaD10KGgsZisrKSkpJiZvLnB1c2goaCl9cmV0dXJuIG99LGUuZm9ybWF0PWZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodFswXSkpcmV0dXJuIGUuZm9ybWF0Um93cyh0KTt2YXIgcj1uZXcgdSxpPVtdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIG4pci5oYXModCl8fGkucHVzaChyLmFkZCh0KSl9KSxbaS5tYXAobykuam9pbihuKV0uY29uY2F0KHQubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbyh0W25dKX0pLmpvaW4obil9KSkuam9pbigiXG4iKX0sZS5mb3JtYXRSb3dzPWZ1bmN0aW9uKG4pe3JldHVybiBuLm1hcChhKS5qb2luKCJcbiIpfSxlfSx5YS5jc3Y9eWEuZHN2KCIsIiwidGV4dC9jc3YiKSx5YS50c3Y9eWEuZHN2KCIJIiwidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyIpO3ZhciBvbyxjbyxsbyxzbzt5YS50aW1lcj1mdW5jdGlvbihuLHQsZSl7aWYoYXJndW1lbnRzLmxlbmd0aDwzKXtpZihhcmd1bWVudHMubGVuZ3RoPDIpdD0wO2Vsc2UgaWYoIWlzRmluaXRlKHQpKXJldHVybjtlPURhdGUubm93KCl9dmFyIHI9ZSt0LGk9e2NhbGxiYWNrOm4sdGltZTpyLG5leHQ6bnVsbH07Y28/Y28ubmV4dD1pOm9vPWksY289aSxsb3x8KHNvPWNsZWFyVGltZW91dChzbyksbG89MSxmbyhtdCkpfSx5YS50aW1lci5mbHVzaD1mdW5jdGlvbigpe3Z0KCkseXQoKX07dmFyIGZvPWJhW28oYmEsInJlcXVlc3RBbmltYXRpb25GcmFtZSIpXXx8ZnVuY3Rpb24obil7c2V0VGltZW91dChuLDE3KX0saG89Ii4iLGdvPSIsIixwbz1bMywzXSxtbz1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIsK1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl0ubWFwKE10KTt5YS5mb3JtYXRQcmVmaXg9ZnVuY3Rpb24obix0KXt2YXIgZT0wO3JldHVybiBuJiYoMD5uJiYobio9LTEpLHQmJihuPXlhLnJvdW5kKG4seHQobix0KSkpLGU9MStNYXRoLmZsb29yKDFlLTEyK01hdGgubG9nKG4pL01hdGguTE4xMCksZT1NYXRoLm1heCgtMjQsTWF0aC5taW4oMjQsMypNYXRoLmZsb29yKCgwPj1lP2UrMTplLTEpLzMpKSkpLG1vWzgrZS8zXX0seWEucm91bmQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gdD9NYXRoLnJvdW5kKG4qKHQ9TWF0aC5wb3coMTAsdCkpKS90Ok1hdGgucm91bmQobil9LHlhLmZvcm1hdD1mdW5jdGlvbihuKXt2YXIgdD12by5leGVjKG4pLGU9dFsxXXx8IiAiLHI9dFsyXXx8Ij4iLGk9dFszXXx8IiIsdT10WzRdfHwiIixhPXRbNV0sbz0rdFs2XSxjPXRbN10sbD10WzhdLHM9dFs5XSxmPTEsaD0iIixnPSExO3N3aXRjaChsJiYobD0rbC5zdWJzdHJpbmcoMSkpLChhfHwiMCI9PT1lJiYiPSI9PT1yKSYmKGE9ZT0iMCIscj0iPSIsYyYmKG8tPU1hdGguZmxvb3IoKG8tMSkvNCkpKSxzKXtjYXNlIm4iOmM9ITAscz0iZyI7YnJlYWs7Y2FzZSIlIjpmPTEwMCxoPSIlIixzPSJmIjticmVhaztjYXNlInAiOmY9MTAwLGg9IiUiLHM9InIiO2JyZWFrO2Nhc2UiYiI6Y2FzZSJvIjpjYXNlIngiOmNhc2UiWCI6dSYmKHU9IjAiK3MudG9Mb3dlckNhc2UoKSk7Y2FzZSJjIjpjYXNlImQiOmc9ITAsbD0wO2JyZWFrO2Nhc2UicyI6Zj0tMSxzPSJyIn0iIyI9PT11JiYodT0iIiksInIiIT1zfHxsfHwocz0iZyIpLG51bGwhPWwmJigiZyI9PXM/bD1NYXRoLm1heCgxLE1hdGgubWluKDIxLGwpKTooImUiPT1zfHwiZiI9PXMpJiYobD1NYXRoLm1heCgwLE1hdGgubWluKDIwLGwpKSkpLHM9eW8uZ2V0KHMpfHxidDt2YXIgcD1hJiZjO3JldHVybiBmdW5jdGlvbihuKXtpZihnJiZuJTEpcmV0dXJuIiI7dmFyIHQ9MD5ufHwwPT09biYmMD4xL24/KG49LW4sIi0iKTppO2lmKDA+Zil7dmFyIGQ9eWEuZm9ybWF0UHJlZml4KG4sbCk7bj1kLnNjYWxlKG4pLGg9ZC5zeW1ib2x9ZWxzZSBuKj1mO249cyhuLGwpLCFhJiZjJiYobj1NbyhuKSk7dmFyIG09dS5sZW5ndGgrbi5sZW5ndGgrKHA/MDp0Lmxlbmd0aCksdj1vPm0/bmV3IEFycmF5KG09by1tKzEpLmpvaW4oZSk6IiI7cmV0dXJuIHAmJihuPU1vKHYrbikpLGhvJiZuLnJlcGxhY2UoIi4iLGhvKSx0Kz11LCgiPCI9PT1yP3Qrbit2OiI+Ij09PXI/dit0K246Il4iPT09cj92LnN1YnN0cmluZygwLG0+Pj0xKSt0K24rdi5zdWJzdHJpbmcobSk6dCsocD9uOnYrbikpK2h9fTt2YXIgdm89Lyg/OihbXntdKT8oWzw+PV5dKSk/KFsrXC0gXSk/KCMpPygwKT8oXGQrKT8oLCk/KFwuLT9cZCspPyhbYS16JV0pPy9pLHlvPXlhLm1hcCh7YjpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygyKX0sYzpmdW5jdGlvbihuKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuKX0sbzpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZyg4KX0seDpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygxNil9LFg6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LGc6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b1ByZWNpc2lvbih0KX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBuLnRvRXhwb25lbnRpYWwodCl9LGY6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b0ZpeGVkKHQpfSxyOmZ1bmN0aW9uKG4sdCl7cmV0dXJuKG49eWEucm91bmQobix4dChuLHQpKSkudG9GaXhlZChNYXRoLm1heCgwLE1hdGgubWluKDIwLHh0KG4qKDErMWUtMTUpLHQpKSkpfX0pLE1vPWh0O2lmKHBvKXt2YXIgeG89cG8ubGVuZ3RoO01vPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdD1uLmxhc3RJbmRleE9mKCIuIiksZT10Pj0wPyIuIituLnN1YnN0cmluZyh0KzEpOih0PW4ubGVuZ3RoLCIiKSxyPVtdLGk9MCx1PXBvWzBdO3Q+MCYmdT4wOylyLnB1c2gobi5zdWJzdHJpbmcodC09dSx0K3UpKSx1PXBvW2k9KGkrMSkleG9dO3JldHVybiByLnJldmVyc2UoKS5qb2luKGdvfHwiIikrZX19eWEuZ2VvPXt9LF90LnByb3RvdHlwZT17czowLHQ6MCxhZGQ6ZnVuY3Rpb24obil7d3Qobix0aGlzLnQsYm8pLHd0KGJvLnMsdGhpcy5zLHRoaXMpLHRoaXMucz90aGlzLnQrPWJvLnQ6dGhpcy5zPWJvLnR9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zPXRoaXMudD0wfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc319O3ZhciBibz1uZXcgX3Q7eWEuZ2VvLnN0cmVhbT1mdW5jdGlvbihuLHQpe24mJl9vLmhhc093blByb3BlcnR5KG4udHlwZSk/X29bbi50eXBlXShuLHQpOlN0KG4sdCl9O3ZhciBfbz17RmVhdHVyZTpmdW5jdGlvbihuLHQpe1N0KG4uZ2VvbWV0cnksdCl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylTdChlW3JdLmdlb21ldHJ5LHQpfX0sd289e1NwaGVyZTpmdW5jdGlvbihuLHQpe3Quc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKG4sdCl7dmFyIGU9bi5jb29yZGluYXRlczt0LnBvaW50KGVbMF0sZVsxXSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24obix0KXtmb3IodmFyIGUscj1uLmNvb3JkaW5hdGVzLGk9LTEsdT1yLmxlbmd0aDsrK2k8dTspZT1yW2ldLHQucG9pbnQoZVswXSxlWzFdKX0sTGluZVN0cmluZzpmdW5jdGlvbihuLHQpe0V0KG4uY29vcmRpbmF0ZXMsdCwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylFdChlW3JdLHQsMCl9LFBvbHlnb246ZnVuY3Rpb24obix0KXtrdChuLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWt0KGVbcl0sdCl9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmdlb21ldHJpZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylTdChlW3JdLHQpfX07eWEuZ2VvLmFyZWE9ZnVuY3Rpb24obil7cmV0dXJuIFNvPTAseWEuZ2VvLnN0cmVhbShuLGtvKSxTb307dmFyIFNvLEVvPW5ldyBfdCxrbz17c3BoZXJlOmZ1bmN0aW9uKCl7U28rPTQqJGF9LHBvaW50OnMsbGluZVN0YXJ0OnMsbGluZUVuZDpzLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0VvLnJlc2V0KCksa28ubGluZVN0YXJ0PUF0fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIG49MipFbztTbys9MD5uPzQqJGErbjpuLGtvLmxpbmVTdGFydD1rby5saW5lRW5kPWtvLnBvaW50PXN9fTt5YS5nZW8uYm91bmRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe00ucHVzaCh4PVtzPW4saD1uXSksZj50JiYoZj10KSx0PmcmJihnPXQpfWZ1bmN0aW9uIHQodCxlKXt2YXIgcj1OdChbdCpHYSxlKkdhXSk7aWYodil7dmFyIGk9VHQodixyKSx1PVtpWzFdLC1pWzBdLDBdLGE9VHQodSxpKTtEdChhKSxhPWp0KGEpO3ZhciBjPXQtcCxsPWM+MD8xOi0xLGQ9YVswXSpLYSpsLG09TWF0aC5hYnMoYyk+MTgwO2lmKG1eKGQ+bCpwJiZsKnQ+ZCkpe3ZhciB5PWFbMV0qS2E7eT5nJiYoZz15KX1lbHNlIGlmKGQ9KGQrMzYwKSUzNjAtMTgwLG1eKGQ+bCpwJiZsKnQ+ZCkpe3ZhciB5PS1hWzFdKkthO2Y+eSYmKGY9eSl9ZWxzZSBmPmUmJihmPWUpLGU+ZyYmKGc9ZSk7bT9wPnQ/byhzLHQpPm8ocyxoKSYmKGg9dCk6byh0LGgpPm8ocyxoKSYmKHM9dCk6aD49cz8ocz50JiYocz10KSx0PmgmJihoPXQpKTp0PnA/byhzLHQpPm8ocyxoKSYmKGg9dCk6byh0LGgpPm8ocyxoKSYmKHM9dCl9ZWxzZSBuKHQsZSk7dj1yLHA9dH1mdW5jdGlvbiBlKCl7Yi5wb2ludD10fWZ1bmN0aW9uIHIoKXt4WzBdPXMseFsxXT1oLGIucG9pbnQ9bix2PW51bGx9ZnVuY3Rpb24gaShuLGUpe2lmKHYpe3ZhciByPW4tcDt5Kz1NYXRoLmFicyhyKT4xODA/cisocj4wPzM2MDotMzYwKTpyfWVsc2UgZD1uLG09ZTtrby5wb2ludChuLGUpLHQobixlKX1mdW5jdGlvbiB1KCl7a28ubGluZVN0YXJ0KCl9ZnVuY3Rpb24gYSgpe2koZCxtKSxrby5saW5lRW5kKCksTWF0aC5hYnMoeSk+V2EmJihzPS0oaD0xODApKSx4WzBdPXMseFsxXT1oLHY9bnVsbH1mdW5jdGlvbiBvKG4sdCl7cmV0dXJuKHQtPW4pPDA/dCszNjA6dH1mdW5jdGlvbiBjKG4sdCl7cmV0dXJuIG5bMF0tdFswXX1mdW5jdGlvbiBsKG4sdCl7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgcyxmLGgsZyxwLGQsbSx2LHksTSx4LGI9e3BvaW50Om4sbGluZVN0YXJ0OmUsbGluZUVuZDpyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2IucG9pbnQ9aSxiLmxpbmVTdGFydD11LGIubGluZUVuZD1hLHk9MCxrby5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2tvLnBvbHlnb25FbmQoKSxiLnBvaW50PW4sYi5saW5lU3RhcnQ9ZSxiLmxpbmVFbmQ9ciwwPkVvPyhzPS0oaD0xODApLGY9LShnPTkwKSk6eT5XYT9nPTkwOi1XYT55JiYoZj0tOTApLHhbMF09cyx4WzFdPWh9fTtyZXR1cm4gZnVuY3Rpb24obil7Zz1oPS0ocz1mPTEvMCksTT1bXSx5YS5nZW8uc3RyZWFtKG4sYik7dmFyIHQ9TS5sZW5ndGg7aWYodCl7TS5zb3J0KGMpO2Zvcih2YXIgZSxyPTEsaT1NWzBdLHU9W2ldO3Q+cjsrK3IpZT1NW3JdLGwoZVswXSxpKXx8bChlWzFdLGkpPyhvKGlbMF0sZVsxXSk+byhpWzBdLGlbMV0pJiYoaVsxXT1lWzFdKSxvKGVbMF0saVsxXSk+byhpWzBdLGlbMV0pJiYoaVswXT1lWzBdKSk6dS5wdXNoKGk9ZSk7Zm9yKHZhciBhLGUscD0tMS8wLHQ9dS5sZW5ndGgtMSxyPTAsaT11W3RdO3Q+PXI7aT1lLCsrcillPXVbcl0sKGE9byhpWzFdLGVbMF0pKT5wJiYocD1hLHM9ZVswXSxoPWlbMV0pfXJldHVybiBNPXg9bnVsbCwxLzA9PT1zfHwxLzA9PT1mP1tbMC8wLDAvMF0sWzAvMCwwLzBdXTpbW3MsZl0sW2gsZ11dfX0oKSx5YS5nZW8uY2VudHJvaWQ9ZnVuY3Rpb24obil7QW89Tm89cW89VG89Q289em89RG89am89TG89SG89Rm89MCx5YS5nZW8uc3RyZWFtKG4sUG8pO3ZhciB0PUxvLGU9SG8scj1GbyxpPXQqdCtlKmUrcipyO3JldHVybiBKYT5pJiYodD16byxlPURvLHI9am8sV2E+Tm8mJih0PXFvLGU9VG8scj1DbyksaT10KnQrZSplK3IqcixKYT5pKT9bMC8wLDAvMF06W01hdGguYXRhbjIoZSx0KSpLYSxJKHIvTWF0aC5zcXJ0KGkpKSpLYV19O3ZhciBBbyxObyxxbyxUbyxDbyx6byxEbyxqbyxMbyxIbyxGbyxQbz17c3BoZXJlOnMscG9pbnQ6SHQsbGluZVN0YXJ0OlB0LGxpbmVFbmQ6T3QscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7UG8ubGluZVN0YXJ0PVl0fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7UG8ubGluZVN0YXJ0PVB0fX0sT289VnQoUnQsV3QsR3QsS3QpLFlvPVstJGEsMF0sUm89MWU5Oyh5YS5nZW8uY29uaWNFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gcmUoaWUpfSkucmF3PWllLHlhLmdlby5hbGJlcnM9ZnVuY3Rpb24oKXtyZXR1cm4geWEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFs5NiwwXSkuY2VudGVyKFstLjYsMzguN10pLnBhcmFsbGVscyhbMjkuNSw0NS41XSkuc2NhbGUoMTA3MCl9LHlhLmdlby5hbGJlcnNVc2E9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3ZhciB1PW5bMF0sYT1uWzFdO3JldHVybiB0PW51bGwsZSh1LGEpLHR8fChyKHUsYSksdCl8fGkodSxhKSx0fXZhciB0LGUscixpLHU9eWEuZ2VvLmFsYmVycygpLGE9eWEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTQsMF0pLmNlbnRlcihbLTIsNTguNV0pLnBhcmFsbGVscyhbNTUsNjVdKSxvPXlhLmdlby5jb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxjPXtwb2ludDpmdW5jdGlvbihuLGUpe3Q9W24sZV19fTtyZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24obil7dmFyIHQ9dS5zY2FsZSgpLGU9dS50cmFuc2xhdGUoKSxyPShuWzBdLWVbMF0pL3QsaT0oblsxXS1lWzFdKS90O3JldHVybihpPj0uMTImJi4yMzQ+aSYmcj49LS40MjUmJi0uMjE0PnI/YTppPj0uMTY2JiYuMjM0PmkmJnI+PS0uMjE0JiYtLjExNT5yP286dSkuaW52ZXJ0KG4pfSxuLnN0cmVhbT1mdW5jdGlvbihuKXt2YXIgdD11LnN0cmVhbShuKSxlPWEuc3RyZWFtKG4pLHI9by5zdHJlYW0obik7cmV0dXJue3BvaW50OmZ1bmN0aW9uKG4saSl7dC5wb2ludChuLGkpLGUucG9pbnQobixpKSxyLnBvaW50KG4saSl9LHNwaGVyZTpmdW5jdGlvbigpe3Quc3BoZXJlKCksZS5zcGhlcmUoKSxyLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LmxpbmVTdGFydCgpLGUubGluZVN0YXJ0KCksci5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGUubGluZUVuZCgpLHIubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLGUucG9seWdvblN0YXJ0KCksci5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpLGUucG9seWdvbkVuZCgpLHIucG9seWdvbkVuZCgpfX19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1LnByZWNpc2lvbih0KSxhLnByZWNpc2lvbih0KSxvLnByZWNpc2lvbih0KSxuKTp1LnByZWNpc2lvbigpfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1LnNjYWxlKHQpLGEuc2NhbGUoLjM1KnQpLG8uc2NhbGUodCksbi50cmFuc2xhdGUodS50cmFuc2xhdGUoKSkpOnUuc2NhbGUoKX0sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHUudHJhbnNsYXRlKCk7dmFyIGw9dS5zY2FsZSgpLHM9K3RbMF0sZj0rdFsxXTtyZXR1cm4gZT11LnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbcy0uNDU1KmwsZi0uMjM4KmxdLFtzKy40NTUqbCxmKy4yMzgqbF1dKS5zdHJlYW0oYykucG9pbnQscj1hLnRyYW5zbGF0ZShbcy0uMzA3KmwsZisuMjAxKmxdKS5jbGlwRXh0ZW50KFtbcy0uNDI1KmwrV2EsZisuMTIqbCtXYV0sW3MtLjIxNCpsLVdhLGYrLjIzNCpsLVdhXV0pLnN0cmVhbShjKS5wb2ludCxpPW8udHJhbnNsYXRlKFtzLS4yMDUqbCxmKy4yMTIqbF0pLmNsaXBFeHRlbnQoW1tzLS4yMTQqbCtXYSxmKy4xNjYqbCtXYV0sW3MtLjExNSpsLVdhLGYrLjIzNCpsLVdhXV0pLnN0cmVhbShjKS5wb2ludCxufSxuLnNjYWxlKDEwNzApfTt2YXIgVW8sSW8sVm8sWG8sWm8sQm8sJG89e3BvaW50OnMsbGluZVN0YXJ0OnMsbGluZUVuZDpzLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0lvPTAsJG8ubGluZVN0YXJ0PXVlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7JG8ubGluZVN0YXJ0PSRvLmxpbmVFbmQ9JG8ucG9pbnQ9cyxVbys9TWF0aC5hYnMoSW8vMil9fSxXbz17cG9pbnQ6YWUsbGluZVN0YXJ0OnMsbGluZUVuZDpzLHBvbHlnb25TdGFydDpzLHBvbHlnb25FbmQ6c30sSm89e3BvaW50OmxlLGxpbmVTdGFydDpzZSxsaW5lRW5kOmZlLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0pvLmxpbmVTdGFydD1oZX0scG9seWdvbkVuZDpmdW5jdGlvbigpe0pvLnBvaW50PWxlLEpvLmxpbmVTdGFydD1zZSxKby5saW5lRW5kPWZlfX07eWEuZ2VvLnBhdGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3JldHVybiBuJiYoImZ1bmN0aW9uIj09dHlwZW9mIG8mJnUucG9pbnRSYWRpdXMoK28uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxhJiZhLnZhbGlkfHwoYT1pKHUpKSx5YS5nZW8uc3RyZWFtKG4sYSkpLHUucmVzdWx0KCl9ZnVuY3Rpb24gdCgpe3JldHVybiBhPW51bGwsbn12YXIgZSxyLGksdSxhLG89NC41O3JldHVybiBuLmFyZWE9ZnVuY3Rpb24obil7cmV0dXJuIFVvPTAseWEuZ2VvLnN0cmVhbShuLGkoJG8pKSxVb30sbi5jZW50cm9pZD1mdW5jdGlvbihuKXtyZXR1cm4gcW89VG89Q289em89RG89am89TG89SG89Rm89MCx5YS5nZW8uc3RyZWFtKG4saShKbykpLEZvP1tMby9GbyxIby9Gb106am8/W3pvL2pvLERvL2pvXTpDbz9bcW8vQ28sVG8vQ29dOlswLzAsMC8wXX0sbi5ib3VuZHM9ZnVuY3Rpb24obil7cmV0dXJuIFpvPUJvPS0oVm89WG89MS8wKSx5YS5nZW8uc3RyZWFtKG4saShXbykpLFtbVm8sWG9dLFtabyxCb11dfSxuLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9KGU9bik/bi5zdHJlYW18fGRlKG4pOmh0LHQoKSk6ZX0sbi5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PShyPW4pP25ldyBvZTpuZXcgZ2UobiksImZ1bmN0aW9uIiE9dHlwZW9mIG8mJnUucG9pbnRSYWRpdXMobyksdCgpKTpyfSxuLnBvaW50UmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6KHUucG9pbnRSYWRpdXMoK3QpLCt0KSxuKTpvfSxuLnByb2plY3Rpb24oeWEuZ2VvLmFsYmVyc1VzYSgpKS5jb250ZXh0KG51bGwpfSx5YS5nZW8ucHJvamVjdGlvbj1tZSx5YS5nZW8ucHJvamVjdGlvbk11dGF0b3I9dmUsKHlhLmdlby5lcXVpcmVjdGFuZ3VsYXI9ZnVuY3Rpb24oKXtyZXR1cm4gbWUoTWUpfSkucmF3PU1lLmludmVydD1NZSx5YS5nZW8ucm90YXRpb249ZnVuY3Rpb24obil7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gdD1uKHRbMF0qR2EsdFsxXSpHYSksdFswXSo9S2EsdFsxXSo9S2EsdH1yZXR1cm4gbj14ZShuWzBdJTM2MCpHYSxuWzFdKkdhLG4ubGVuZ3RoPjI/blsyXSpHYTowKSx0LmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdD1uLmludmVydCh0WzBdKkdhLHRbMV0qR2EpLHRbMF0qPUthLHRbMV0qPUthLHR9LHR9LHlhLmdlby5jaXJjbGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6cix0PXhlKC1uWzBdKkdhLC1uWzFdKkdhLDApLmludmVydCxpPVtdO3JldHVybiBlKG51bGwsbnVsbCwxLHtwb2ludDpmdW5jdGlvbihuLGUpe2kucHVzaChuPXQobixlKSksblswXSo9S2EsblsxXSo9S2F9fSkse3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltpXX19dmFyIHQsZSxyPVswLDBdLGk9NjtyZXR1cm4gbi5vcmlnaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxuLmFuZ2xlPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPVNlKCh0PStyKSpHYSxpKkdhKSxuKTp0fSxuLnByZWNpc2lvbj1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1TZSh0KkdhLChpPStyKSpHYSksbik6aX0sbi5hbmdsZSg5MCl9LHlhLmdlby5kaXN0YW5jZT1mdW5jdGlvbihuLHQpe3ZhciBlLHI9KHRbMF0tblswXSkqR2EsaT1uWzFdKkdhLHU9dFsxXSpHYSxhPU1hdGguc2luKHIpLG89TWF0aC5jb3MociksYz1NYXRoLnNpbihpKSxsPU1hdGguY29zKGkpLHM9TWF0aC5zaW4odSksZj1NYXRoLmNvcyh1KTtyZXR1cm4gTWF0aC5hdGFuMihNYXRoLnNxcnQoKGU9ZiphKSplKyhlPWwqcy1jKmYqbykqZSksYypzK2wqZipvKX0seWEuZ2VvLmdyYXRpY3VsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXtyZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczp0KCl9fWZ1bmN0aW9uIHQoKXtyZXR1cm4geWEucmFuZ2UoTWF0aC5jZWlsKHUvbSkqbSxpLG0pLm1hcChoKS5jb25jYXQoeWEucmFuZ2UoTWF0aC5jZWlsKGwvdikqdixjLHYpLm1hcChnKSkuY29uY2F0KHlhLnJhbmdlKE1hdGguY2VpbChyL3ApKnAsZSxwKS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIE1hdGguYWJzKG4lbSk+V2F9KS5tYXAocykpLmNvbmNhdCh5YS5yYW5nZShNYXRoLmNlaWwoby9kKSpkLGEsZCkuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLmFicyhuJXYpPldhfSkubWFwKGYpKX12YXIgZSxyLGksdSxhLG8sYyxsLHMsZixoLGcscD0xMCxkPXAsbT05MCx2PTM2MCx5PTIuNTtyZXR1cm4gbi5saW5lcz1mdW5jdGlvbigpe3JldHVybiB0KCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpufX0pfSxuLm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W2godSkuY29uY2F0KGcoYykuc2xpY2UoMSksaChpKS5yZXZlcnNlKCkuc2xpY2UoMSksZyhsKS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LG4uZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24ubWFqb3JFeHRlbnQodCkubWlub3JFeHRlbnQodCk6bi5taW5vckV4dGVudCgpfSxuLm1ham9yRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0WzBdWzBdLGk9K3RbMV1bMF0sbD0rdFswXVsxXSxjPSt0WzFdWzFdLHU+aSYmKHQ9dSx1PWksaT10KSxsPmMmJih0PWwsbD1jLGM9dCksbi5wcmVjaXNpb24oeSkpOltbdSxsXSxbaSxjXV19LG4ubWlub3JFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3RbMF1bMF0sZT0rdFsxXVswXSxvPSt0WzBdWzFdLGE9K3RbMV1bMV0scj5lJiYodD1yLHI9ZSxlPXQpLG8+YSYmKHQ9byxvPWEsYT10KSxuLnByZWNpc2lvbih5KSk6W1tyLG9dLFtlLGFdXX0sbi5zdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24ubWFqb3JTdGVwKHQpLm1pbm9yU3RlcCh0KTpuLm1pbm9yU3RlcCgpfSxuLm1ham9yU3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT0rdFswXSx2PSt0WzFdLG4pOlttLHZdfSxuLm1pbm9yU3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdFswXSxkPSt0WzFdLG4pOltwLGRdfSxuLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0rdCxzPWtlKG8sYSw5MCksZj1BZShyLGUseSksaD1rZShsLGMsOTApLGc9QWUodSxpLHkpLG4pOnl9LG4ubWFqb3JFeHRlbnQoW1stMTgwLC05MCtXYV0sWzE4MCw5MC1XYV1dKS5taW5vckV4dGVudChbWy0xODAsLTgwLVdhXSxbMTgwLDgwK1dhXV0pfSx5YS5nZW8uZ3JlYXRBcmM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOlt0fHxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlfHxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKV19fXZhciB0LGUscj1OZSxpPXFlO3JldHVybiBuLmRpc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHlhLmdlby5kaXN0YW5jZSh0fHxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlfHxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LG4uc291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWUsdD0iZnVuY3Rpb24iPT10eXBlb2YgZT9udWxsOmUsbik6cn0sbi50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P251bGw6dCxuKTppfSxuLnByZWNpc2lvbj1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP246MH0sbn0seWEuZ2VvLmludGVycG9sYXRlPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIFRlKG5bMF0qR2EsblsxXSpHYSx0WzBdKkdhLHRbMV0qR2EpfSx5YS5nZW8ubGVuZ3RoPWZ1bmN0aW9uKG4pe3JldHVybiBHbz0wLHlhLmdlby5zdHJlYW0obixLbyksR299O3ZhciBHbyxLbz17c3BoZXJlOnMscG9pbnQ6cyxsaW5lU3RhcnQ6Q2UsbGluZUVuZDpzLHBvbHlnb25TdGFydDpzLHBvbHlnb25FbmQ6c30sUW89emUoZnVuY3Rpb24obil7cmV0dXJuIE1hdGguc3FydCgyLygxK24pKX0sZnVuY3Rpb24obil7cmV0dXJuIDIqTWF0aC5hc2luKG4vMil9KTsoeWEuZ2VvLmF6aW11dGhhbEVxdWFsQXJlYT1mdW5jdGlvbigpe3JldHVybiBtZShRbyl9KS5yYXc9UW87dmFyIG5jPXplKGZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguYWNvcyhuKTtyZXR1cm4gdCYmdC9NYXRoLnNpbih0KX0saHQpOyh5YS5nZW8uYXppbXV0aGFsRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbWUobmMpfSkucmF3PW5jLCh5YS5nZW8uY29uaWNDb25mb3JtYWw9ZnVuY3Rpb24oKXtyZXR1cm4gcmUoRGUpfSkucmF3PURlLCh5YS5nZW8uY29uaWNFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiByZShqZSl9KS5yYXc9amU7dmFyIHRjPXplKGZ1bmN0aW9uKG4pe3JldHVybiAxL259LE1hdGguYXRhbik7KHlhLmdlby5nbm9tb25pYz1mdW5jdGlvbigpe3JldHVybiBtZSh0Yyl9KS5yYXc9dGMsTGUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuW24sMipNYXRoLmF0YW4oTWF0aC5leHAodCkpLSRhLzJdfSwoeWEuZ2VvLm1lcmNhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIEhlKExlKX0pLnJhdz1MZTt2YXIgZWM9emUoZnVuY3Rpb24oKXtyZXR1cm4gMX0sTWF0aC5hc2luKTsoeWEuZ2VvLm9ydGhvZ3JhcGhpYz1mdW5jdGlvbigpe3JldHVybiBtZShlYyl9KS5yYXc9ZWM7dmFyIHJjPXplKGZ1bmN0aW9uKG4pe3JldHVybiAxLygxK24pfSxmdW5jdGlvbihuKXtyZXR1cm4gMipNYXRoLmF0YW4obil9KTsoeWEuZ2VvLnN0ZXJlb2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gbWUocmMpfSkucmF3PXJjLEZlLmludmVydD1mdW5jdGlvbihuLHQpe3JldHVybltNYXRoLmF0YW4yKFYobiksTWF0aC5jb3ModCkpLEkoTWF0aC5zaW4odCkvWChuKSldfSwoeWEuZ2VvLnRyYW5zdmVyc2VNZXJjYXRvcj1mdW5jdGlvbigpe3JldHVybiBIZShGZSl9KS5yYXc9RmUseWEuZ2VvbT17fSx5YS5zdmc9e30seWEuc3ZnLmxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gUGUoaHQpfTt2YXIgaWM9eWEubWFwKHtsaW5lYXI6UmUsImxpbmVhci1jbG9zZWQiOlVlLHN0ZXA6SWUsInN0ZXAtYmVmb3JlIjpWZSwic3RlcC1hZnRlciI6WGUsYmFzaXM6R2UsImJhc2lzLW9wZW4iOktlLCJiYXNpcy1jbG9zZWQiOlFlLGJ1bmRsZTpucixjYXJkaW5hbDokZSwiY2FyZGluYWwtb3BlbiI6WmUsImNhcmRpbmFsLWNsb3NlZCI6QmUsbW9ub3RvbmU6YXJ9KTtpYy5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7dC5rZXk9bix0LmNsb3NlZD0vLWNsb3NlZCQvLnRlc3Qobil9KTt2YXIgdWM9WzAsMi8zLDEvMywwXSxhYz1bMCwxLzMsMi8zLDBdLG9jPVswLDEvNiwyLzMsMS82XTt5YS5nZW9tLmh1bGw9ZnVuY3Rpb24obil7ZnVuY3Rpb24gdChuKXtpZihuLmxlbmd0aDwzKXJldHVybltdO3ZhciB0LGksdSxhLG8sYyxsLHMsZixoLGcscCxkPWZ0KGUpLG09ZnQociksdj1uLmxlbmd0aCx5PXYtMSxNPVtdLHg9W10sYj0wOwppZihkPT09T2UmJnI9PT1ZZSl0PW47ZWxzZSBmb3IodT0wLHQ9W107dj51OysrdSl0LnB1c2goWytkLmNhbGwodGhpcyxpPW5bdV0sdSksK20uY2FsbCh0aGlzLGksdSldKTtmb3IodT0xO3Y+dTsrK3UpKHRbdV1bMV08dFtiXVsxXXx8dFt1XVsxXT09dFtiXVsxXSYmdFt1XVswXTx0W2JdWzBdKSYmKGI9dSk7Zm9yKHU9MDt2PnU7Kyt1KXUhPT1iJiYoYz10W3VdWzFdLXRbYl1bMV0sbz10W3VdWzBdLXRbYl1bMF0sTS5wdXNoKHthbmdsZTpNYXRoLmF0YW4yKGMsbyksaW5kZXg6dX0pKTtmb3IoTS5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4uYW5nbGUtdC5hbmdsZX0pLGc9TVswXS5hbmdsZSxoPU1bMF0uaW5kZXgsZj0wLHU9MTt5PnU7Kyt1KXtpZihhPU1bdV0uaW5kZXgsZz09TVt1XS5hbmdsZSl7aWYobz10W2hdWzBdLXRbYl1bMF0sYz10W2hdWzFdLXRbYl1bMV0sbD10W2FdWzBdLXRbYl1bMF0scz10W2FdWzFdLXRbYl1bMV0sbypvK2MqYz49bCpsK3Mqcyl7TVt1XS5pbmRleD0tMTtjb250aW51ZX1NW2ZdLmluZGV4PS0xfWc9TVt1XS5hbmdsZSxmPXUsaD1hfWZvcih4LnB1c2goYiksdT0wLGE9MDsyPnU7KythKU1bYV0uaW5kZXg+LTEmJih4LnB1c2goTVthXS5pbmRleCksdSsrKTtmb3IocD14Lmxlbmd0aDt5PmE7KythKWlmKCEoTVthXS5pbmRleDwwKSl7Zm9yKDshb3IoeFtwLTJdLHhbcC0xXSxNW2FdLmluZGV4LHQpOyktLXA7eFtwKytdPU1bYV0uaW5kZXh9dmFyIF89W107Zm9yKHU9cC0xO3U+PTA7LS11KV8ucHVzaChuW3hbdV1dKTtyZXR1cm4gX312YXIgZT1PZSxyPVllO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Qobik6KHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHQpOnJ9LHQpfSx5YS5nZW9tLnBvbHlnb249ZnVuY3Rpb24obil7cmV0dXJuIHphKG4sY2MpLG59O3ZhciBjYz15YS5nZW9tLnBvbHlnb24ucHJvdG90eXBlPVtdO2NjLmFyZWE9ZnVuY3Rpb24oKXtmb3IodmFyIG4sdD0tMSxlPXRoaXMubGVuZ3RoLHI9dGhpc1tlLTFdLGk9MDsrK3Q8ZTspbj1yLHI9dGhpc1t0XSxpKz1uWzFdKnJbMF0tblswXSpyWzFdO3JldHVybi41Kml9LGNjLmNlbnRyb2lkPWZ1bmN0aW9uKG4pe3ZhciB0LGUscj0tMSxpPXRoaXMubGVuZ3RoLHU9MCxhPTAsbz10aGlzW2ktMV07Zm9yKGFyZ3VtZW50cy5sZW5ndGh8fChuPS0xLyg2KnRoaXMuYXJlYSgpKSk7KytyPGk7KXQ9byxvPXRoaXNbcl0sZT10WzBdKm9bMV0tb1swXSp0WzFdLHUrPSh0WzBdK29bMF0pKmUsYSs9KHRbMV0rb1sxXSkqZTtyZXR1cm5bdSpuLGEqbl19LGNjLmNsaXA9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscixpLHUsYSxvPXNyKG4pLGM9LTEsbD10aGlzLmxlbmd0aC1zcih0aGlzKSxzPXRoaXNbbC0xXTsrK2M8bDspe2Zvcih0PW4uc2xpY2UoKSxuLmxlbmd0aD0wLGk9dGhpc1tjXSx1PXRbKHI9dC5sZW5ndGgtbyktMV0sZT0tMTsrK2U8cjspYT10W2VdLGNyKGEscyxpKT8oY3IodSxzLGkpfHxuLnB1c2gobHIodSxhLHMsaSkpLG4ucHVzaChhKSk6Y3IodSxzLGkpJiZuLnB1c2gobHIodSxhLHMsaSkpLHU9YTtvJiZuLnB1c2goblswXSkscz1pfXJldHVybiBufSx5YS5nZW9tLmRlbGF1bmF5PWZ1bmN0aW9uKG4pe3ZhciB0PW4ubWFwKGZ1bmN0aW9uKCl7cmV0dXJuW119KSxlPVtdO3JldHVybiBmcihuLGZ1bmN0aW9uKGUpe3RbZS5yZWdpb24ubC5pbmRleF0ucHVzaChuW2UucmVnaW9uLnIuaW5kZXhdKX0pLHQuZm9yRWFjaChmdW5jdGlvbih0LHIpe3ZhciBpPW5bcl0sdT1pWzBdLGE9aVsxXTt0LmZvckVhY2goZnVuY3Rpb24obil7bi5hbmdsZT1NYXRoLmF0YW4yKG5bMF0tdSxuWzFdLWEpfSksdC5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4uYW5nbGUtdC5hbmdsZX0pO2Zvcih2YXIgbz0wLGM9dC5sZW5ndGgtMTtjPm87bysrKWUucHVzaChbaSx0W29dLHRbbysxXV0pfSksZX0seWEuZ2VvbS52b3Jvbm9pPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQobil7dmFyIHQsdSxhLG89bi5tYXAoZnVuY3Rpb24oKXtyZXR1cm5bXX0pLGM9ZnQoZSksbD1mdChyKSxzPW4ubGVuZ3RoLGY9MWU2O2lmKGM9PT1PZSYmbD09PVllKXQ9bjtlbHNlIGZvcih0PW5ldyBBcnJheShzKSxhPTA7cz5hOysrYSl0W2FdPVsrYy5jYWxsKHRoaXMsdT1uW2FdLGEpLCtsLmNhbGwodGhpcyx1LGEpXTtpZihmcih0LGZ1bmN0aW9uKG4pe3ZhciB0LGUscixpLHUsYTsxPT09bi5hJiZuLmI+PTA/KHQ9bi5lcC5yLGU9bi5lcC5sKToodD1uLmVwLmwsZT1uLmVwLnIpLDE9PT1uLmE/KHU9dD90Lnk6LWYscj1uLmMtbi5iKnUsYT1lP2UueTpmLGk9bi5jLW4uYiphKToocj10P3QueDotZix1PW4uYy1uLmEqcixpPWU/ZS54OmYsYT1uLmMtbi5hKmkpO3ZhciBjPVtyLHVdLGw9W2ksYV07b1tuLnJlZ2lvbi5sLmluZGV4XS5wdXNoKGMsbCksb1tuLnJlZ2lvbi5yLmluZGV4XS5wdXNoKGMsbCl9KSxvPW8ubWFwKGZ1bmN0aW9uKG4sZSl7dmFyIHI9dFtlXVswXSxpPXRbZV1bMV0sdT1uLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5hdGFuMihuWzBdLXIsblsxXS1pKX0pLGE9eWEucmFuZ2Uobi5sZW5ndGgpLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gdVtuXS11W3RdfSk7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIXR8fHVbbl0tdVthW3QtMV1dPldhfSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBuW3RdfSl9KSxvLmZvckVhY2goZnVuY3Rpb24obixlKXt2YXIgcj1uLmxlbmd0aDtpZighcilyZXR1cm4gbi5wdXNoKFstZiwtZl0sWy1mLGZdLFtmLGZdLFtmLC1mXSk7aWYoIShyPjIpKXt2YXIgaT10W2VdLHU9blswXSxhPW5bMV0sbz1pWzBdLGM9aVsxXSxsPXVbMF0scz11WzFdLGg9YVswXSxnPWFbMV0scD1NYXRoLmFicyhoLWwpLGQ9Zy1zO2lmKE1hdGguYWJzKGQpPFdhKXt2YXIgbT1zPmM/LWY6ZjtuLnB1c2goWy1mLG1dLFtmLG1dKX1lbHNlIGlmKFdhPnApe3ZhciB2PWw+bz8tZjpmO24ucHVzaChbdiwtZl0sW3YsZl0pfWVsc2V7dmFyIG09KGwtbykqKGctcyk+KGgtbCkqKHMtYyk/ZjotZix5PU1hdGguYWJzKGQpLXA7TWF0aC5hYnMoeSk8V2E/bi5wdXNoKFswPmQ/bTotbSxtXSk6KHk+MCYmKG0qPS0xKSxuLnB1c2goWy1mLG1dLFtmLG1dKSl9fX0pLGkpZm9yKGE9MDtzPmE7KythKWkuY2xpcChvW2FdKTtmb3IoYT0wO3M+YTsrK2Epb1thXS5wb2ludD1uW2FdO3JldHVybiBvfXZhciBlPU9lLHI9WWUsaT1udWxsO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Qobik6KHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHQpOnJ9LHQuY2xpcEV4dGVudD1mdW5jdGlvbihuKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gaSYmW2lbMF0saVsyXV07aWYobnVsbD09bilpPW51bGw7ZWxzZXt2YXIgZT0rblswXVswXSxyPStuWzBdWzFdLHU9K25bMV1bMF0sYT0rblsxXVsxXTtpPXlhLmdlb20ucG9seWdvbihbW2Uscl0sW2UsYV0sW3UsYV0sW3Uscl1dKX1yZXR1cm4gdH0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QuY2xpcEV4dGVudChuJiZbWzAsMF0sbl0pOmkmJmlbMl19LHQubGlua3M9ZnVuY3Rpb24obil7dmFyIHQsaSx1LGE9bi5tYXAoZnVuY3Rpb24oKXtyZXR1cm5bXX0pLG89W10sYz1mdChlKSxsPWZ0KHIpLHM9bi5sZW5ndGg7aWYoYz09PU9lJiZsPT09WWUpdD1uO2Vsc2UgZm9yKHQ9bmV3IEFycmF5KHMpLHU9MDtzPnU7Kyt1KXRbdV09WytjLmNhbGwodGhpcyxpPW5bdV0sdSksK2wuY2FsbCh0aGlzLGksdSldO3JldHVybiBmcih0LGZ1bmN0aW9uKHQpe3ZhciBlPXQucmVnaW9uLmwuaW5kZXgscj10LnJlZ2lvbi5yLmluZGV4O2FbZV1bcl18fChhW2VdW3JdPWFbcl1bZV09ITAsby5wdXNoKHtzb3VyY2U6bltlXSx0YXJnZXQ6bltyXX0pKX0pLG99LHQudHJpYW5nbGVzPWZ1bmN0aW9uKG4pe2lmKGU9PT1PZSYmcj09PVllKXJldHVybiB5YS5nZW9tLmRlbGF1bmF5KG4pO2Zvcih2YXIgdCxpPW5ldyBBcnJheShjKSx1PWZ0KGUpLGE9ZnQociksbz0tMSxjPW4ubGVuZ3RoOysrbzxjOykoaVtvXT1bK3UuY2FsbCh0aGlzLHQ9bltvXSxvKSwrYS5jYWxsKHRoaXMsdCxvKV0pLmRhdGE9dDtyZXR1cm4geWEuZ2VvbS5kZWxhdW5heShpKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuLmRhdGF9KX0pfSx0KX07dmFyIGxjPXtsOiJyIixyOiJsIn07eWEuZ2VvbS5xdWFkdHJlZT1mdW5jdGlvbihuLHQsZSxyLGkpe2Z1bmN0aW9uIHUobil7ZnVuY3Rpb24gdShuLHQsZSxyLGksdSxhLG8pe2lmKCFpc05hTihlKSYmIWlzTmFOKHIpKWlmKG4ubGVhZil7dmFyIGM9bi54LHM9bi55O2lmKG51bGwhPWMpaWYoTWF0aC5hYnMoYy1lKStNYXRoLmFicyhzLXIpPC4wMSlsKG4sdCxlLHIsaSx1LGEsbyk7ZWxzZXt2YXIgZj1uLnBvaW50O24ueD1uLnk9bi5wb2ludD1udWxsLGwobixmLGMscyxpLHUsYSxvKSxsKG4sdCxlLHIsaSx1LGEsbyl9ZWxzZSBuLng9ZSxuLnk9cixuLnBvaW50PXR9ZWxzZSBsKG4sdCxlLHIsaSx1LGEsbyl9ZnVuY3Rpb24gbChuLHQsZSxyLGksYSxvLGMpe3ZhciBsPS41KihpK28pLHM9LjUqKGErYyksZj1lPj1sLGg9cj49cyxnPShoPDwxKStmO24ubGVhZj0hMSxuPW4ubm9kZXNbZ118fChuLm5vZGVzW2ddPXByKCkpLGY/aT1sOm89bCxoP2E9czpjPXMsdShuLHQsZSxyLGksYSxvLGMpfXZhciBzLGYsaCxnLHAsZCxtLHYseSxNPWZ0KG8pLHg9ZnQoYyk7aWYobnVsbCE9dClkPXQsbT1lLHY9cix5PWk7ZWxzZSBpZih2PXk9LShkPW09MS8wKSxmPVtdLGg9W10scD1uLmxlbmd0aCxhKWZvcihnPTA7cD5nOysrZylzPW5bZ10scy54PGQmJihkPXMueCkscy55PG0mJihtPXMueSkscy54PnYmJih2PXMueCkscy55PnkmJih5PXMueSksZi5wdXNoKHMueCksaC5wdXNoKHMueSk7ZWxzZSBmb3IoZz0wO3A+ZzsrK2cpe3ZhciBiPStNKHM9bltnXSxnKSxfPSt4KHMsZyk7ZD5iJiYoZD1iKSxtPl8mJihtPV8pLGI+diYmKHY9YiksXz55JiYoeT1fKSxmLnB1c2goYiksaC5wdXNoKF8pfXZhciB3PXYtZCxTPXktbTt3PlM/eT1tK3c6dj1kK1M7dmFyIEU9cHIoKTtpZihFLmFkZD1mdW5jdGlvbihuKXt1KEUsbiwrTShuLCsrZyksK3gobixnKSxkLG0sdix5KX0sRS52aXNpdD1mdW5jdGlvbihuKXtkcihuLEUsZCxtLHYseSl9LGc9LTEsbnVsbD09dCl7Zm9yKDsrK2c8cDspdShFLG5bZ10sZltnXSxoW2ddLGQsbSx2LHkpOy0tZ31lbHNlIG4uZm9yRWFjaChFLmFkZCk7cmV0dXJuIGY9aD1uPXM9bnVsbCxFfXZhciBhLG89T2UsYz1ZZTtyZXR1cm4oYT1hcmd1bWVudHMubGVuZ3RoKT8obz1ocixjPWdyLDM9PT1hJiYoaT1lLHI9dCxlPXQ9MCksdShuKSk6KHUueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLHUpOm99LHUueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uLHUpOmN9LHUuZXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP3Q9ZT1yPWk9bnVsbDoodD0rblswXVswXSxlPStuWzBdWzFdLHI9K25bMV1bMF0saT0rblsxXVsxXSksdSk6bnVsbD09dD9udWxsOltbdCxlXSxbcixpXV19LHUuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj90PWU9cj1pPW51bGw6KHQ9ZT0wLHI9K25bMF0saT0rblsxXSksdSk6bnVsbD09dD9udWxsOltyLXQsaS1lXX0sdSl9LHlhLmludGVycG9sYXRlUmdiPW1yLHlhLmludGVycG9sYXRlT2JqZWN0PXZyLHlhLmludGVycG9sYXRlTnVtYmVyPXlyLHlhLmludGVycG9sYXRlU3RyaW5nPU1yO3ZhciBzYz0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2c7eWEuaW50ZXJwb2xhdGU9eHIseWEuaW50ZXJwb2xhdG9ycz1bZnVuY3Rpb24obix0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4oInN0cmluZyI9PT1lP2FvLmhhcyh0KXx8L14oI3xyZ2JcKHxoc2xcKCkvLnRlc3QodCk/bXI6TXI6dCBpbnN0YW5jZW9mIEY/bXI6Im9iamVjdCI9PT1lP0FycmF5LmlzQXJyYXkodCk/YnI6dnI6eXIpKG4sdCl9XSx5YS5pbnRlcnBvbGF0ZUFycmF5PWJyO3ZhciBmYz1mdW5jdGlvbigpe3JldHVybiBodH0saGM9eWEubWFwKHtsaW5lYXI6ZmMscG9seTpOcixxdWFkOmZ1bmN0aW9uKCl7cmV0dXJuIEVyfSxjdWJpYzpmdW5jdGlvbigpe3JldHVybiBrcn0sc2luOmZ1bmN0aW9uKCl7cmV0dXJuIHFyfSxleHA6ZnVuY3Rpb24oKXtyZXR1cm4gVHJ9LGNpcmNsZTpmdW5jdGlvbigpe3JldHVybiBDcn0sZWxhc3RpYzp6cixiYWNrOkRyLGJvdW5jZTpmdW5jdGlvbigpe3JldHVybiBqcn19KSxnYz15YS5tYXAoeyJpbiI6aHQsb3V0OndyLCJpbi1vdXQiOlNyLCJvdXQtaW4iOmZ1bmN0aW9uKG4pe3JldHVybiBTcih3cihuKSl9fSk7eWEuZWFzZT1mdW5jdGlvbihuKXt2YXIgdD1uLmluZGV4T2YoIi0iKSxlPXQ+PTA/bi5zdWJzdHJpbmcoMCx0KTpuLHI9dD49MD9uLnN1YnN0cmluZyh0KzEpOiJpbiI7cmV0dXJuIGU9aGMuZ2V0KGUpfHxmYyxyPWdjLmdldChyKXx8aHQsX3IocihlLmFwcGx5KG51bGwsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKSkpfSx5YS5pbnRlcnBvbGF0ZUhjbD1Mcix5YS5pbnRlcnBvbGF0ZUhzbD1Icix5YS5pbnRlcnBvbGF0ZUxhYj1Gcix5YS5pbnRlcnBvbGF0ZVJvdW5kPVByLHlhLnRyYW5zZm9ybT1mdW5jdGlvbihuKXt2YXIgdD1NYS5jcmVhdGVFbGVtZW50TlMoeWEubnMucHJlZml4LnN2ZywiZyIpO3JldHVybih5YS50cmFuc2Zvcm09ZnVuY3Rpb24obil7aWYobnVsbCE9bil7dC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsbik7dmFyIGU9dC50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpfXJldHVybiBuZXcgT3IoZT9lLm1hdHJpeDpwYyl9KShuKX0sT3IucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMudHJhbnNsYXRlKyIpcm90YXRlKCIrdGhpcy5yb3RhdGUrIilza2V3WCgiK3RoaXMuc2tldysiKXNjYWxlKCIrdGhpcy5zY2FsZSsiKSJ9O3ZhciBwYz17YToxLGI6MCxjOjAsZDoxLGU6MCxmOjB9O3lhLmludGVycG9sYXRlVHJhbnNmb3JtPUlyLHlhLmxheW91dD17fSx5YS5sYXlvdXQuYnVuZGxlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2Zvcih2YXIgdD1bXSxlPS0xLHI9bi5sZW5ndGg7KytlPHI7KXQucHVzaChacihuW2VdKSk7cmV0dXJuIHR9fSx5YS5sYXlvdXQuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dmFyIG4sbCxmLGgsZyxwPXt9LGQ9W10sbT15YS5yYW5nZSh1KSx2PVtdO2ZvcihlPVtdLHI9W10sbj0wLGg9LTE7KytoPHU7KXtmb3IobD0wLGc9LTE7KytnPHU7KWwrPWlbaF1bZ107ZC5wdXNoKGwpLHYucHVzaCh5YS5yYW5nZSh1KSksbis9bH1mb3IoYSYmbS5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIGEoZFtuXSxkW3RdKX0pLG8mJnYuZm9yRWFjaChmdW5jdGlvbihuLHQpe24uc29ydChmdW5jdGlvbihuLGUpe3JldHVybiBvKGlbdF1bbl0saVt0XVtlXSl9KX0pLG49KDIqJGEtcyp1KS9uLGw9MCxoPS0xOysraDx1Oyl7Zm9yKGY9bCxnPS0xOysrZzx1Oyl7dmFyIHk9bVtoXSxNPXZbeV1bZ10seD1pW3ldW01dLGI9bCxfPWwrPXgqbjtwW3krIi0iK01dPXtpbmRleDp5LHN1YmluZGV4Ok0sc3RhcnRBbmdsZTpiLGVuZEFuZ2xlOl8sdmFsdWU6eH19clt5XT17aW5kZXg6eSxzdGFydEFuZ2xlOmYsZW5kQW5nbGU6bCx2YWx1ZToobC1mKS9ufSxsKz1zfWZvcihoPS0xOysraDx1Oylmb3IoZz1oLTE7KytnPHU7KXt2YXIgdz1wW2grIi0iK2ddLFM9cFtnKyItIitoXTsody52YWx1ZXx8Uy52YWx1ZSkmJmUucHVzaCh3LnZhbHVlPFMudmFsdWU/e3NvdXJjZTpTLHRhcmdldDp3fTp7c291cmNlOncsdGFyZ2V0OlN9KX1jJiZ0KCl9ZnVuY3Rpb24gdCgpe2Uuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiBjKChuLnNvdXJjZS52YWx1ZStuLnRhcmdldC52YWx1ZSkvMiwodC5zb3VyY2UudmFsdWUrdC50YXJnZXQudmFsdWUpLzIpfSl9dmFyIGUscixpLHUsYSxvLGMsbD17fSxzPTA7cmV0dXJuIGwubWF0cml4PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PShpPW4pJiZpLmxlbmd0aCxlPXI9bnVsbCxsKTppfSxsLnBhZGRpbmc9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bixlPXI9bnVsbCxsKTpzfSxsLnNvcnRHcm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bixlPXI9bnVsbCxsKTphfSxsLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bixlPW51bGwsbCk6b30sbC5zb3J0Q2hvcmRzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4sZSYmdCgpLGwpOmN9LGwuY2hvcmRzPWZ1bmN0aW9uKCl7cmV0dXJuIGV8fG4oKSxlfSxsLmdyb3Vwcz1mdW5jdGlvbigpe3JldHVybiByfHxuKCkscn0sbH0seWEubGF5b3V0LmZvcmNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIsaSl7aWYodC5wb2ludCE9PW4pe3ZhciB1PXQuY3gtbi54LGE9dC5jeS1uLnksbz0xL01hdGguc3FydCh1KnUrYSphKTtpZihkPihpLWUpKm8pe3ZhciBjPXQuY2hhcmdlKm8qbztyZXR1cm4gbi5weC09dSpjLG4ucHktPWEqYywhMH1pZih0LnBvaW50JiZpc0Zpbml0ZShvKSl7dmFyIGM9dC5wb2ludENoYXJnZSpvKm87bi5weC09dSpjLG4ucHktPWEqY319cmV0dXJuIXQuY2hhcmdlfX1mdW5jdGlvbiB0KG4pe24ucHg9eWEuZXZlbnQueCxuLnB5PXlhLmV2ZW50Lnksby5yZXN1bWUoKX12YXIgZSxyLGksdSxhLG89e30sYz15YS5kaXNwYXRjaCgic3RhcnQiLCJ0aWNrIiwiZW5kIiksbD1bMSwxXSxzPS45LGY9ZGMsaD1tYyxnPS0zMCxwPS4xLGQ9LjgsbT1bXSx2PVtdO3JldHVybiBvLnRpY2s9ZnVuY3Rpb24oKXtpZigocio9Ljk5KTwuMDA1KXJldHVybiBjLmVuZCh7dHlwZToiZW5kIixhbHBoYTpyPTB9KSwhMDt2YXIgdCxlLG8sZixoLGQseSxNLHgsYj1tLmxlbmd0aCxfPXYubGVuZ3RoO2ZvcihlPTA7Xz5lOysrZSlvPXZbZV0sZj1vLnNvdXJjZSxoPW8udGFyZ2V0LE09aC54LWYueCx4PWgueS1mLnksKGQ9TSpNK3gqeCkmJihkPXIqdVtlXSooKGQ9TWF0aC5zcXJ0KGQpKS1pW2VdKS9kLE0qPWQseCo9ZCxoLngtPU0qKHk9Zi53ZWlnaHQvKGgud2VpZ2h0K2Yud2VpZ2h0KSksaC55LT14KnksZi54Kz1NKih5PTEteSksZi55Kz14KnkpO2lmKCh5PXIqcCkmJihNPWxbMF0vMix4PWxbMV0vMixlPS0xLHkpKWZvcig7KytlPGI7KW89bVtlXSxvLngrPShNLW8ueCkqeSxvLnkrPSh4LW8ueSkqeTtpZihnKWZvcihRcih0PXlhLmdlb20ucXVhZHRyZWUobSkscixhKSxlPS0xOysrZTxiOykobz1tW2VdKS5maXhlZHx8dC52aXNpdChuKG8pKTtmb3IoZT0tMTsrK2U8Yjspbz1tW2VdLG8uZml4ZWQ/KG8ueD1vLnB4LG8ueT1vLnB5KTooby54LT0oby5weC0oby5weD1vLngpKSpzLG8ueS09KG8ucHktKG8ucHk9by55KSkqcyk7Yy50aWNrKHt0eXBlOiJ0aWNrIixhbHBoYTpyfSl9LG8ubm9kZXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09bixvKTptfSxvLmxpbmtzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PW4sbyk6dn0sby5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4sbyk6bH0sby5saW5rRGlzdGFuY2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixvKTpmfSxvLmRpc3RhbmNlPW8ubGlua0Rpc3RhbmNlLG8ubGlua1N0cmVuZ3RoPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sbyk6aH0sby5mcmljdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0rbixvKTpzfSxvLmNoYXJnZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLG8pOmd9LG8uZ3Jhdml0eT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rbixvKTpwfSxvLnRoZXRhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPStuLG8pOmR9LG8uYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K24scj9yPW4+MD9uOjA6bj4wJiYoYy5zdGFydCh7dHlwZToic3RhcnQiLGFscGhhOnI9bn0pLHlhLnRpbWVyKG8udGljaykpLG8pOnJ9LG8uc3RhcnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4scil7Zm9yKHZhciBpLHU9dChlKSxhPS0xLG89dS5sZW5ndGg7KythPG87KWlmKCFpc05hTihpPXVbYV1bbl0pKXJldHVybiBpO3JldHVybiBNYXRoLnJhbmRvbSgpKnJ9ZnVuY3Rpb24gdCgpe2lmKCFjKXtmb3IoYz1bXSxyPTA7cD5yOysrciljW3JdPVtdO2ZvcihyPTA7ZD5yOysrcil7dmFyIG49dltyXTtjW24uc291cmNlLmluZGV4XS5wdXNoKG4udGFyZ2V0KSxjW24udGFyZ2V0LmluZGV4XS5wdXNoKG4uc291cmNlKX19cmV0dXJuIGNbZV19dmFyIGUscixjLHMscD1tLmxlbmd0aCxkPXYubGVuZ3RoLHk9bFswXSxNPWxbMV07Zm9yKGU9MDtwPmU7KytlKShzPW1bZV0pLmluZGV4PWUscy53ZWlnaHQ9MDtmb3IoZT0wO2Q+ZTsrK2Upcz12W2VdLCJudW1iZXIiPT10eXBlb2Ygcy5zb3VyY2UmJihzLnNvdXJjZT1tW3Muc291cmNlXSksIm51bWJlciI9PXR5cGVvZiBzLnRhcmdldCYmKHMudGFyZ2V0PW1bcy50YXJnZXRdKSwrK3Muc291cmNlLndlaWdodCwrK3MudGFyZ2V0LndlaWdodDtmb3IoZT0wO3A+ZTsrK2Upcz1tW2VdLGlzTmFOKHMueCkmJihzLng9bigieCIseSkpLGlzTmFOKHMueSkmJihzLnk9bigieSIsTSkpLGlzTmFOKHMucHgpJiYocy5weD1zLngpLGlzTmFOKHMucHkpJiYocy5weT1zLnkpO2lmKGk9W10sImZ1bmN0aW9uIj09dHlwZW9mIGYpZm9yKGU9MDtkPmU7KytlKWlbZV09K2YuY2FsbCh0aGlzLHZbZV0sZSk7ZWxzZSBmb3IoZT0wO2Q+ZTsrK2UpaVtlXT1mO2lmKHU9W10sImZ1bmN0aW9uIj09dHlwZW9mIGgpZm9yKGU9MDtkPmU7KytlKXVbZV09K2guY2FsbCh0aGlzLHZbZV0sZSk7ZWxzZSBmb3IoZT0wO2Q+ZTsrK2UpdVtlXT1oO2lmKGE9W10sImZ1bmN0aW9uIj09dHlwZW9mIGcpZm9yKGU9MDtwPmU7KytlKWFbZV09K2cuY2FsbCh0aGlzLG1bZV0sZSk7ZWxzZSBmb3IoZT0wO3A+ZTsrK2UpYVtlXT1nO3JldHVybiBvLnJlc3VtZSgpfSxvLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBvLmFscGhhKC4xKX0sby5zdG9wPWZ1bmN0aW9uKCl7cmV0dXJuIG8uYWxwaGEoMCl9LG8uZHJhZz1mdW5jdGlvbigpe3JldHVybiBlfHwoZT15YS5iZWhhdmlvci5kcmFnKCkub3JpZ2luKGh0KS5vbigiZHJhZ3N0YXJ0LmZvcmNlIixXcikub24oImRyYWcuZm9yY2UiLHQpLm9uKCJkcmFnZW5kLmZvcmNlIixKcikpLGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMub24oIm1vdXNlb3Zlci5mb3JjZSIsR3IpLm9uKCJtb3VzZW91dC5mb3JjZSIsS3IpLmNhbGwoZSksdm9pZCAwKTplfSx5YS5yZWJpbmQobyxjLCJvbiIpfTt2YXIgZGM9MjAsbWM9MTt5YS5sYXlvdXQuaGllcmFyY2h5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0LGEsbyl7dmFyIGM9aS5jYWxsKGUsdCxhKTtpZih0LmRlcHRoPWEsby5wdXNoKHQpLGMmJihsPWMubGVuZ3RoKSl7Zm9yKHZhciBsLHMsZj0tMSxoPXQuY2hpbGRyZW49W10sZz0wLHA9YSsxOysrZjxsOylzPW4oY1tmXSxwLG8pLHMucGFyZW50PXQsaC5wdXNoKHMpLGcrPXMudmFsdWU7ciYmaC5zb3J0KHIpLHUmJih0LnZhbHVlPWcpfWVsc2UgdSYmKHQudmFsdWU9K3UuY2FsbChlLHQsYSl8fDApO3JldHVybiB0fWZ1bmN0aW9uIHQobixyKXt2YXIgaT1uLmNoaWxkcmVuLGE9MDtpZihpJiYobz1pLmxlbmd0aCkpZm9yKHZhciBvLGM9LTEsbD1yKzE7KytjPG87KWErPXQoaVtjXSxsKTtlbHNlIHUmJihhPSt1LmNhbGwoZSxuLHIpfHwwKTtyZXR1cm4gdSYmKG4udmFsdWU9YSksYX1mdW5jdGlvbiBlKHQpe3ZhciBlPVtdO3JldHVybiBuKHQsMCxlKSxlfXZhciByPXJpLGk9dGksdT1laTtyZXR1cm4gZS5zb3J0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sZSk6cn0sZS5jaGlsZHJlbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLGUpOml9LGUudmFsdWU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bixlKTp1fSxlLnJldmFsdWU9ZnVuY3Rpb24obil7cmV0dXJuIHQobiwwKSxufSxlfSx5YS5sYXlvdXQucGFydGl0aW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0LGUscixpKXt2YXIgdT10LmNoaWxkcmVuO2lmKHQueD1lLHQueT10LmRlcHRoKmksdC5keD1yLHQuZHk9aSx1JiYoYT11Lmxlbmd0aCkpe3ZhciBhLG8sYyxsPS0xO2ZvcihyPXQudmFsdWU/ci90LnZhbHVlOjA7KytsPGE7KW4obz11W2xdLGUsYz1vLnZhbHVlKnIsaSksZSs9Y319ZnVuY3Rpb24gdChuKXt2YXIgZT1uLmNoaWxkcmVuLHI9MDtpZihlJiYoaT1lLmxlbmd0aCkpZm9yKHZhciBpLHU9LTE7Kyt1PGk7KXI9TWF0aC5tYXgocix0KGVbdV0pKTtyZXR1cm4gMStyfWZ1bmN0aW9uIGUoZSx1KXt2YXIgYT1yLmNhbGwodGhpcyxlLHUpO3JldHVybiBuKGFbMF0sMCxpWzBdLGlbMV0vdChhWzBdKSksYX12YXIgcj15YS5sYXlvdXQuaGllcmFyY2h5KCksaT1bMSwxXTtyZXR1cm4gZS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW4sZSk6aX0sbmkoZSxyKX0seWEubGF5b3V0LnBpZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odSl7dmFyIGE9dS5tYXAoZnVuY3Rpb24oZSxyKXtyZXR1cm4rdC5jYWxsKG4sZSxyKX0pLG89KygiZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyKSxjPSgoImZ1bmN0aW9uIj09dHlwZW9mIGk/aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6aSktbykveWEuc3VtKGEpLGw9eWEucmFuZ2UodS5sZW5ndGgpO251bGwhPWUmJmwuc29ydChlPT09dmM/ZnVuY3Rpb24obix0KXtyZXR1cm4gYVt0XS1hW25dfTpmdW5jdGlvbihuLHQpe3JldHVybiBlKHVbbl0sdVt0XSl9KTt2YXIgcz1bXTtyZXR1cm4gbC5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciB0O3Nbbl09e2RhdGE6dVtuXSx2YWx1ZTp0PWFbbl0sc3RhcnRBbmdsZTpvLGVuZEFuZ2xlOm8rPXQqY319KSxzfXZhciB0PU51bWJlcixlPXZjLHI9MCxpPTIqJGE7cmV0dXJuIG4udmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLnNvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbn07dmFyIHZjPXt9O3lhLmxheW91dC5zdGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obyxjKXt2YXIgbD1vLm1hcChmdW5jdGlvbihlLHIpe3JldHVybiB0LmNhbGwobixlLHIpfSkscz1sLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm5bdS5jYWxsKG4sdCxlKSxhLmNhbGwobix0LGUpXX0pfSksZj1lLmNhbGwobixzLGMpO2w9eWEucGVybXV0ZShsLGYpLHM9eWEucGVybXV0ZShzLGYpO3ZhciBoLGcscCxkPXIuY2FsbChuLHMsYyksbT1sLmxlbmd0aCx2PWxbMF0ubGVuZ3RoO2ZvcihnPTA7dj5nOysrZylmb3IoaS5jYWxsKG4sbFswXVtnXSxwPWRbZ10sc1swXVtnXVsxXSksaD0xO20+aDsrK2gpaS5jYWxsKG4sbFtoXVtnXSxwKz1zW2gtMV1bZ11bMV0sc1toXVtnXVsxXSk7cmV0dXJuIG99dmFyIHQ9aHQsZT1jaSxyPWxpLGk9b2ksdT11aSxhPWFpO3JldHVybiBuLnZhbHVlcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4ub3JkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5Yy5nZXQodCl8fGNpLG4pOmV9LG4ub2Zmc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TWMuZ2V0KHQpfHxsaSxuKTpyfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxuKTphfSxuLm91dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LG4pOml9LG59O3ZhciB5Yz15YS5tYXAoeyJpbnNpZGUtb3V0IjpmdW5jdGlvbihuKXt2YXIgdCxlLHI9bi5sZW5ndGgsaT1uLm1hcChzaSksdT1uLm1hcChmaSksYT15YS5yYW5nZShyKS5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIGlbbl0taVt0XX0pLG89MCxjPTAsbD1bXSxzPVtdO2Zvcih0PTA7cj50OysrdCllPWFbdF0sYz5vPyhvKz11W2VdLGwucHVzaChlKSk6KGMrPXVbZV0scy5wdXNoKGUpKTtyZXR1cm4gcy5yZXZlcnNlKCkuY29uY2F0KGwpfSxyZXZlcnNlOmZ1bmN0aW9uKG4pe3JldHVybiB5YS5yYW5nZShuLmxlbmd0aCkucmV2ZXJzZSgpfSwiZGVmYXVsdCI6Y2l9KSxNYz15YS5tYXAoe3NpbGhvdWV0dGU6ZnVuY3Rpb24obil7dmFyIHQsZSxyLGk9bi5sZW5ndGgsdT1uWzBdLmxlbmd0aCxhPVtdLG89MCxjPVtdO2ZvcihlPTA7dT5lOysrZSl7Zm9yKHQ9MCxyPTA7aT50O3QrKylyKz1uW3RdW2VdWzFdO3I+byYmKG89ciksYS5wdXNoKHIpfWZvcihlPTA7dT5lOysrZSljW2VdPShvLWFbZV0pLzI7cmV0dXJuIGN9LHdpZ2dsZTpmdW5jdGlvbihuKXt2YXIgdCxlLHIsaSx1LGEsbyxjLGwscz1uLmxlbmd0aCxmPW5bMF0saD1mLmxlbmd0aCxnPVtdO2ZvcihnWzBdPWM9bD0wLGU9MTtoPmU7KytlKXtmb3IodD0wLGk9MDtzPnQ7Kyt0KWkrPW5bdF1bZV1bMV07Zm9yKHQ9MCx1PTAsbz1mW2VdWzBdLWZbZS0xXVswXTtzPnQ7Kyt0KXtmb3Iocj0wLGE9KG5bdF1bZV1bMV0tblt0XVtlLTFdWzFdKS8oMipvKTt0PnI7KytyKWErPShuW3JdW2VdWzFdLW5bcl1bZS0xXVsxXSkvbzt1Kz1hKm5bdF1bZV1bMV19Z1tlXT1jLT1pP3UvaSpvOjAsbD5jJiYobD1jKX1mb3IoZT0wO2g+ZTsrK2UpZ1tlXS09bDtyZXR1cm4gZ30sZXhwYW5kOmZ1bmN0aW9uKG4pe3ZhciB0LGUscixpPW4ubGVuZ3RoLHU9blswXS5sZW5ndGgsYT0xL2ksbz1bXTtmb3IoZT0wO3U+ZTsrK2Upe2Zvcih0PTAscj0wO2k+dDt0Kyspcis9blt0XVtlXVsxXTtpZihyKWZvcih0PTA7aT50O3QrKyluW3RdW2VdWzFdLz1yO2Vsc2UgZm9yKHQ9MDtpPnQ7dCsrKW5bdF1bZV1bMV09YX1mb3IoZT0wO3U+ZTsrK2Upb1tlXT0wO3JldHVybiBvfSx6ZXJvOmxpfSk7eWEubGF5b3V0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix1KXtmb3IodmFyIGEsbyxjPVtdLGw9bi5tYXAoZSx0aGlzKSxzPXIuY2FsbCh0aGlzLGwsdSksZj1pLmNhbGwodGhpcyxzLGwsdSksdT0tMSxoPWwubGVuZ3RoLGc9Zi5sZW5ndGgtMSxwPXQ/MToxL2g7Kyt1PGc7KWE9Y1t1XT1bXSxhLmR4PWZbdSsxXS0oYS54PWZbdV0pLGEueT0wO2lmKGc+MClmb3IodT0tMTsrK3U8aDspbz1sW3VdLG8+PXNbMF0mJm88PXNbMV0mJihhPWNbeWEuYmlzZWN0KGYsbywxLGcpLTFdLGEueSs9cCxhLnB1c2goblt1XSkpO3JldHVybiBjfXZhciB0PSEwLGU9TnVtYmVyLHI9ZGksaT1naTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZnQodCksbik6cn0sbi5iaW5zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbihuKXtyZXR1cm4gcGkobix0KX06ZnQodCksbik6aX0sbi5mcmVxdWVuY3k9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ISFlLG4pOnR9LG59LHlhLmxheW91dC50cmVlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe2Z1bmN0aW9uIGEobix0KXt2YXIgcj1uLmNoaWxkcmVuLGk9bi5fdHJlZTtpZihyJiYodT1yLmxlbmd0aCkpe2Zvcih2YXIgdSxvLGwscz1yWzBdLGY9cyxoPS0xOysraDx1OylsPXJbaF0sYShsLG8pLGY9YyhsLG8sZiksbz1sO1NpKG4pO3ZhciBnPS41KihzLl90cmVlLnByZWxpbStsLl90cmVlLnByZWxpbSk7dD8oaS5wcmVsaW09dC5fdHJlZS5wcmVsaW0rZShuLHQpLGkubW9kPWkucHJlbGltLWcpOmkucHJlbGltPWd9ZWxzZSB0JiYoaS5wcmVsaW09dC5fdHJlZS5wcmVsaW0rZShuLHQpKX1mdW5jdGlvbiBvKG4sdCl7bi54PW4uX3RyZWUucHJlbGltK3Q7dmFyIGU9bi5jaGlsZHJlbjtpZihlJiYocj1lLmxlbmd0aCkpe3ZhciByLGk9LTE7Zm9yKHQrPW4uX3RyZWUubW9kOysraTxyOylvKGVbaV0sdCl9fWZ1bmN0aW9uIGMobix0LHIpe2lmKHQpe2Zvcih2YXIgaSx1PW4sYT1uLG89dCxjPW4ucGFyZW50LmNoaWxkcmVuWzBdLGw9dS5fdHJlZS5tb2Qscz1hLl90cmVlLm1vZCxmPW8uX3RyZWUubW9kLGg9Yy5fdHJlZS5tb2Q7bz15aShvKSx1PXZpKHUpLG8mJnU7KWM9dmkoYyksYT15aShhKSxhLl90cmVlLmFuY2VzdG9yPW4saT1vLl90cmVlLnByZWxpbStmLXUuX3RyZWUucHJlbGltLWwrZShvLHUpLGk+MCYmKEVpKGtpKG8sbixyKSxuLGkpLGwrPWkscys9aSksZis9by5fdHJlZS5tb2QsbCs9dS5fdHJlZS5tb2QsaCs9Yy5fdHJlZS5tb2Qscys9YS5fdHJlZS5tb2Q7byYmIXlpKGEpJiYoYS5fdHJlZS50aHJlYWQ9byxhLl90cmVlLm1vZCs9Zi1zKSx1JiYhdmkoYykmJihjLl90cmVlLnRocmVhZD11LGMuX3RyZWUubW9kKz1sLWgscj1uKX1yZXR1cm4gcn12YXIgbD10LmNhbGwodGhpcyxuLHUpLHM9bFswXTt3aShzLGZ1bmN0aW9uKG4sdCl7bi5fdHJlZT17YW5jZXN0b3I6bixwcmVsaW06MCxtb2Q6MCxjaGFuZ2U6MCxzaGlmdDowLG51bWJlcjp0P3QuX3RyZWUubnVtYmVyKzE6MH19KSxhKHMpLG8ocywtcy5fdHJlZS5wcmVsaW0pO3ZhciBmPU1pKHMsYmkpLGg9TWkocyx4aSksZz1NaShzLF9pKSxwPWYueC1lKGYsaCkvMixkPWgueCtlKGgsZikvMixtPWcuZGVwdGh8fDE7cmV0dXJuIHdpKHMsaT9mdW5jdGlvbihuKXtuLngqPXJbMF0sbi55PW4uZGVwdGgqclsxXSxkZWxldGUgbi5fdHJlZX06ZnVuY3Rpb24obil7bi54PShuLngtcCkvKGQtcCkqclswXSxuLnk9bi5kZXB0aC9tKnJbMV0sZGVsZXRlIG4uX3RyZWV9KSxsfXZhciB0PXlhLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLGU9bWkscj1bMSwxXSxpPSExO3JldHVybiBuLnNlcGFyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09KHI9dCksbik6aT9udWxsOnJ9LG4ubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbCE9KHI9dCksbik6aT9yOm51bGx9LG5pKG4sdCl9LHlhLmxheW91dC5wYWNrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBhPWUuY2FsbCh0aGlzLG4sdSksbz1hWzBdLGM9aVswXSxsPWlbMV0scz1udWxsPT10P01hdGguc3FydDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O2lmKG8ueD1vLnk9MCx3aShvLGZ1bmN0aW9uKG4pe24ucj0rcyhuLnZhbHVlKX0pLHdpKG8sQ2kpLHIpe3ZhciBmPXIqKHQ/MTpNYXRoLm1heCgyKm8uci9jLDIqby5yL2wpKS8yO3dpKG8sZnVuY3Rpb24obil7bi5yKz1mfSksd2kobyxDaSksd2kobyxmdW5jdGlvbihuKXtuLnItPWZ9KX1yZXR1cm4gamkobyxjLzIsbC8yLHQ/MToxL01hdGgubWF4KDIqby5yL2MsMipvLnIvbCkpLGF9dmFyIHQsZT15YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChBaSkscj0wLGk9WzEsMV07cmV0dXJuIG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LG4pOml9LG4ucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PWV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6K2Usbik6dH0sbi5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG4pOnJ9LG5pKG4sZSl9LHlhLmxheW91dC5jbHVzdGVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBhLG89dC5jYWxsKHRoaXMsbix1KSxjPW9bMF0sbD0wO3dpKGMsZnVuY3Rpb24obil7dmFyIHQ9bi5jaGlsZHJlbjt0JiZ0Lmxlbmd0aD8obi54PUZpKHQpLG4ueT1IaSh0KSk6KG4ueD1hP2wrPWUobixhKTowLG4ueT0wLGE9bil9KTt2YXIgcz1QaShjKSxmPU9pKGMpLGg9cy54LWUocyxmKS8yLGc9Zi54K2UoZixzKS8yO3JldHVybiB3aShjLGk/ZnVuY3Rpb24obil7bi54PShuLngtYy54KSpyWzBdLG4ueT0oYy55LW4ueSkqclsxXX06ZnVuY3Rpb24obil7bi54PShuLngtaCkvKGctaCkqclswXSxuLnk9KDEtKGMueT9uLnkvYy55OjEpKSpyWzFdfSksb312YXIgdD15YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxlPW1pLHI9WzEsMV0saT0hMTtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PShyPXQpLG4pOmk/bnVsbDpyfSxuLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGwhPShyPXQpLG4pOmk/cjpudWxsfSxuaShuLHQpfSx5YS5sYXlvdXQudHJlZW1hcD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix0KXtmb3IodmFyIGUscixpPS0xLHU9bi5sZW5ndGg7KytpPHU7KXI9KGU9bltpXSkudmFsdWUqKDA+dD8wOnQpLGUuYXJlYT1pc05hTihyKXx8MD49cj8wOnJ9ZnVuY3Rpb24gdChlKXt2YXIgdT1lLmNoaWxkcmVuO2lmKHUmJnUubGVuZ3RoKXt2YXIgYSxvLGMsbD1mKGUpLHM9W10saD11LnNsaWNlKCkscD0xLzAsZD0ic2xpY2UiPT09Zz9sLmR4OiJkaWNlIj09PWc/bC5keToic2xpY2UtZGljZSI9PT1nPzEmZS5kZXB0aD9sLmR5OmwuZHg6TWF0aC5taW4obC5keCxsLmR5KTtmb3IobihoLGwuZHgqbC5keS9lLnZhbHVlKSxzLmFyZWE9MDsoYz1oLmxlbmd0aCk+MDspcy5wdXNoKGE9aFtjLTFdKSxzLmFyZWErPWEuYXJlYSwic3F1YXJpZnkiIT09Z3x8KG89cihzLGQpKTw9cD8oaC5wb3AoKSxwPW8pOihzLmFyZWEtPXMucG9wKCkuYXJlYSxpKHMsZCxsLCExKSxkPU1hdGgubWluKGwuZHgsbC5keSkscy5sZW5ndGg9cy5hcmVhPTAscD0xLzApO3MubGVuZ3RoJiYoaShzLGQsbCwhMCkscy5sZW5ndGg9cy5hcmVhPTApLHUuZm9yRWFjaCh0KX19ZnVuY3Rpb24gZSh0KXt2YXIgcj10LmNoaWxkcmVuO2lmKHImJnIubGVuZ3RoKXt2YXIgdSxhPWYodCksbz1yLnNsaWNlKCksYz1bXTtmb3IobihvLGEuZHgqYS5keS90LnZhbHVlKSxjLmFyZWE9MDt1PW8ucG9wKCk7KWMucHVzaCh1KSxjLmFyZWErPXUuYXJlYSxudWxsIT11LnomJihpKGMsdS56P2EuZHg6YS5keSxhLCFvLmxlbmd0aCksYy5sZW5ndGg9Yy5hcmVhPTApO3IuZm9yRWFjaChlKX19ZnVuY3Rpb24gcihuLHQpe2Zvcih2YXIgZSxyPW4uYXJlYSxpPTAsdT0xLzAsYT0tMSxvPW4ubGVuZ3RoOysrYTxvOykoZT1uW2FdLmFyZWEpJiYodT5lJiYodT1lKSxlPmkmJihpPWUpKTtyZXR1cm4gcio9cix0Kj10LHI/TWF0aC5tYXgodCppKnAvcixyLyh0KnUqcCkpOjEvMH1mdW5jdGlvbiBpKG4sdCxlLHIpe3ZhciBpLHU9LTEsYT1uLmxlbmd0aCxvPWUueCxsPWUueSxzPXQ/YyhuLmFyZWEvdCk6MDtpZih0PT1lLmR4KXtmb3IoKHJ8fHM+ZS5keSkmJihzPWUuZHkpOysrdTxhOylpPW5bdV0saS54PW8saS55PWwsaS5keT1zLG8rPWkuZHg9TWF0aC5taW4oZS54K2UuZHgtbyxzP2MoaS5hcmVhL3MpOjApO2kuej0hMCxpLmR4Kz1lLngrZS5keC1vLGUueSs9cyxlLmR5LT1zfWVsc2V7Zm9yKChyfHxzPmUuZHgpJiYocz1lLmR4KTsrK3U8YTspaT1uW3VdLGkueD1vLGkueT1sLGkuZHg9cyxsKz1pLmR5PU1hdGgubWluKGUueStlLmR5LWwscz9jKGkuYXJlYS9zKTowKTtpLno9ITEsaS5keSs9ZS55K2UuZHktbCxlLngrPXMsZS5keC09c319ZnVuY3Rpb24gdShyKXt2YXIgaT1hfHxvKHIpLHU9aVswXTtyZXR1cm4gdS54PTAsdS55PTAsdS5keD1sWzBdLHUuZHk9bFsxXSxhJiZvLnJldmFsdWUodSksbihbdV0sdS5keCp1LmR5L3UudmFsdWUpLChhP2U6dCkodSksaCYmKGE9aSksaX12YXIgYSxvPXlhLmxheW91dC5oaWVyYXJjaHkoKSxjPU1hdGgucm91bmQsbD1bMSwxXSxzPW51bGwsZj1ZaSxoPSExLGc9InNxdWFyaWZ5IixwPS41KigxK01hdGguc3FydCg1KSk7cmV0dXJuIHUuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1uLHUpOmx9LHUucGFkZGluZz1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KHQpe3ZhciBlPW4uY2FsbCh1LHQsdC5kZXB0aCk7cmV0dXJuIG51bGw9PWU/WWkodCk6UmkodCwibnVtYmVyIj09dHlwZW9mIGU/W2UsZSxlLGVdOmUpfWZ1bmN0aW9uIGUodCl7cmV0dXJuIFJpKHQsbil9aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHM7dmFyIHI7cmV0dXJuIGY9bnVsbD09KHM9bik/WWk6ImZ1bmN0aW9uIj09KHI9dHlwZW9mIG4pP3Q6Im51bWJlciI9PT1yPyhuPVtuLG4sbixuXSxlKTplLHV9LHUucm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bj9NYXRoLnJvdW5kOk51bWJlcix1KTpjIT1OdW1iZXJ9LHUuc3RpY2t5PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPW4sYT1udWxsLHUpOmh9LHUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9bix1KTpwfSx1Lm1vZGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9bisiIix1KTpnfSxuaSh1LG8pfSx5YS5yYW5kb209e25vcm1hbDpmdW5jdGlvbihuLHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIDI+ZSYmKHQ9MSksMT5lJiYobj0wKSxmdW5jdGlvbigpe3ZhciBlLHIsaTtkbyBlPTIqTWF0aC5yYW5kb20oKS0xLHI9MipNYXRoLnJhbmRvbSgpLTEsaT1lKmUrcipyO3doaWxlKCFpfHxpPjEpO3JldHVybiBuK3QqZSpNYXRoLnNxcnQoLTIqTWF0aC5sb2coaSkvaSl9fSxsb2dOb3JtYWw6ZnVuY3Rpb24oKXt2YXIgbj15YS5yYW5kb20ubm9ybWFsLmFwcGx5KHlhLGFyZ3VtZW50cyk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZXhwKG4oKSl9fSxpcndpbkhhbGw6ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT0wO24+ZTtlKyspdCs9TWF0aC5yYW5kb20oKTtyZXR1cm4gdC9ufX19LHlhLnNjYWxlPXt9O3ZhciB4Yz17Zmxvb3I6aHQsY2VpbDpodH07eWEuc2NhbGUubGluZWFyPWZ1bmN0aW9uKCl7cmV0dXJuICRpKFswLDFdLFswLDFdLHhyLCExKX0seWEuc2NhbGUubG9nPWZ1bmN0aW9uKCl7cmV0dXJuIHR1KHlhLnNjYWxlLmxpbmVhcigpLmRvbWFpbihbMCxNYXRoLkxOMTBdKSwxMCxldSxydSxbMSwxMF0pfTt2YXIgYmM9eWEuZm9ybWF0KCIuMGUiKTt5YS5zY2FsZS5wb3c9ZnVuY3Rpb24oKXtyZXR1cm4gYXUoeWEuc2NhbGUubGluZWFyKCksMSxbMCwxXSl9LHlhLnNjYWxlLnNxcnQ9ZnVuY3Rpb24oKXtyZXR1cm4geWEuc2NhbGUucG93KCkuZXhwb25lbnQoLjUpfSx5YS5zY2FsZS5vcmRpbmFsPWZ1bmN0aW9uKCl7cmV0dXJuIGN1KFtdLHt0OiJyYW5nZSIsYTpbW11dfSl9LHlhLnNjYWxlLmNhdGVnb3J5MTA9ZnVuY3Rpb24oKXtyZXR1cm4geWEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKF9jKX0seWEuc2NhbGUuY2F0ZWdvcnkyMD1mdW5jdGlvbigpe3JldHVybiB5YS5zY2FsZS5vcmRpbmFsKCkucmFuZ2Uod2MpfSx5YS5zY2FsZS5jYXRlZ29yeTIwYj1mdW5jdGlvbigpe3JldHVybiB5YS5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoU2MpfSx5YS5zY2FsZS5jYXRlZ29yeTIwYz1mdW5jdGlvbigpe3JldHVybiB5YS5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoRWMpfTt2YXIgX2M9WyIjMWY3N2I0IiwiI2ZmN2YwZSIsIiMyY2EwMmMiLCIjZDYyNzI4IiwiIzk0NjdiZCIsIiM4YzU2NGIiLCIjZTM3N2MyIiwiIzdmN2Y3ZiIsIiNiY2JkMjIiLCIjMTdiZWNmIl0sd2M9WyIjMWY3N2I0IiwiI2FlYzdlOCIsIiNmZjdmMGUiLCIjZmZiYjc4IiwiIzJjYTAyYyIsIiM5OGRmOGEiLCIjZDYyNzI4IiwiI2ZmOTg5NiIsIiM5NDY3YmQiLCIjYzViMGQ1IiwiIzhjNTY0YiIsIiNjNDljOTQiLCIjZTM3N2MyIiwiI2Y3YjZkMiIsIiM3ZjdmN2YiLCIjYzdjN2M3IiwiI2JjYmQyMiIsIiNkYmRiOGQiLCIjMTdiZWNmIiwiIzllZGFlNSJdLFNjPVsiIzM5M2I3OSIsIiM1MjU0YTMiLCIjNmI2ZWNmIiwiIzljOWVkZSIsIiM2Mzc5MzkiLCIjOGNhMjUyIiwiI2I1Y2Y2YiIsIiNjZWRiOWMiLCIjOGM2ZDMxIiwiI2JkOWUzOSIsIiNlN2JhNTIiLCIjZTdjYjk0IiwiIzg0M2MzOSIsIiNhZDQ5NGEiLCIjZDY2MTZiIiwiI2U3OTY5YyIsIiM3YjQxNzMiLCIjYTU1MTk0IiwiI2NlNmRiZCIsIiNkZTllZDYiXSxFYz1bIiMzMTgyYmQiLCIjNmJhZWQ2IiwiIzllY2FlMSIsIiNjNmRiZWYiLCIjZTY1NTBkIiwiI2ZkOGQzYyIsIiNmZGFlNmIiLCIjZmRkMGEyIiwiIzMxYTM1NCIsIiM3NGM0NzYiLCIjYTFkOTliIiwiI2M3ZTljMCIsIiM3NTZiYjEiLCIjOWU5YWM4IiwiI2JjYmRkYyIsIiNkYWRhZWIiLCIjNjM2MzYzIiwiIzk2OTY5NiIsIiNiZGJkYmQiLCIjZDlkOWQ5Il07eWEuc2NhbGUucXVhbnRpbGU9ZnVuY3Rpb24oKXtyZXR1cm4gbHUoW10sW10pfSx5YS5zY2FsZS5xdWFudGl6ZT1mdW5jdGlvbigpe3JldHVybiBzdSgwLDEsWzAsMV0pfSx5YS5zY2FsZS50aHJlc2hvbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gZnUoWy41XSxbMCwxXSl9LHlhLnNjYWxlLmlkZW50aXR5PWZ1bmN0aW9uKCl7cmV0dXJuIGh1KFswLDFdKX0seWEuc3ZnLmFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx1PWUuYXBwbHkodGhpcyxhcmd1bWVudHMpLGE9ci5hcHBseSh0aGlzLGFyZ3VtZW50cykra2Msbz1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKStrYyxjPShhPm8mJihjPWEsYT1vLG89Yyksby1hKSxsPSRhPmM/IjAiOiIxIixzPU1hdGguY29zKGEpLGY9TWF0aC5zaW4oYSksaD1NYXRoLmNvcyhvKSxnPU1hdGguc2luKG8pO3JldHVybiBjPj1BYz9uPyJNMCwiK3UrIkEiK3UrIiwiK3UrIiAwIDEsMSAwLCIrLXUrIkEiK3UrIiwiK3UrIiAwIDEsMSAwLCIrdSsiTTAsIituKyJBIituKyIsIituKyIgMCAxLDAgMCwiKy1uKyJBIituKyIsIituKyIgMCAxLDAgMCwiK24rIloiOiJNMCwiK3UrIkEiK3UrIiwiK3UrIiAwIDEsMSAwLCIrLXUrIkEiK3UrIiwiK3UrIiAwIDEsMSAwLCIrdSsiWiI6bj8iTSIrdSpzKyIsIit1KmYrIkEiK3UrIiwiK3UrIiAwICIrbCsiLDEgIit1KmgrIiwiK3UqZysiTCIrbipoKyIsIituKmcrIkEiK24rIiwiK24rIiAwICIrbCsiLDAgIituKnMrIiwiK24qZisiWiI6Ik0iK3UqcysiLCIrdSpmKyJBIit1KyIsIit1KyIgMCAiK2wrIiwxICIrdSpoKyIsIit1KmcrIkwwLDAiKyJaIn12YXIgdD1ndSxlPXB1LHI9ZHUsaT1tdTtyZXR1cm4gbi5pbm5lclJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1mdChlKSxuKTp0fSxuLm91dGVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWZ0KHQpLG4pOmV9LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1mdCh0KSxuKTpyfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWZ0KHQpLG4pOml9LG4uY2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgbj0odC5hcHBseSh0aGlzLGFyZ3VtZW50cykrZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIsdT0oci5hcHBseSh0aGlzLGFyZ3VtZW50cykraS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIra2M7cmV0dXJuW01hdGguY29zKHUpKm4sTWF0aC5zaW4odSkqbl19LG59O3ZhciBrYz0tJGEvMixBYz0yKiRhLTFlLTY7eWEuc3ZnLmxpbmUucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49UGUodnUpO3JldHVybiBuLnJhZGl1cz1uLngsZGVsZXRlIG4ueCxuLmFuZ2xlPW4ueSxkZWxldGUgbi55LG59LFZlLnJldmVyc2U9WGUsWGUucmV2ZXJzZT1WZSx5YS5zdmcuYXJlYT1mdW5jdGlvbigpe3JldHVybiB5dShodCl9LHlhLnN2Zy5hcmVhLnJhZGlhbD1mdW5jdGlvbigpe3ZhciBuPXl1KHZ1KTtyZXR1cm4gbi5yYWRpdXM9bi54LGRlbGV0ZSBuLngsbi5pbm5lclJhZGl1cz1uLngwLGRlbGV0ZSBuLngwLG4ub3V0ZXJSYWRpdXM9bi54MSxkZWxldGUgbi54MSxuLmFuZ2xlPW4ueSxkZWxldGUgbi55LG4uc3RhcnRBbmdsZT1uLnkwLGRlbGV0ZSBuLnkwLG4uZW5kQW5nbGU9bi55MSxkZWxldGUgbi55MSxufSx5YS5zdmcuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sbyl7dmFyIGM9dCh0aGlzLHUsbixvKSxsPXQodGhpcyxhLG4sbyk7cmV0dXJuIk0iK2MucDArcihjLnIsYy5wMSxjLmExLWMuYTApKyhlKGMsbCk/aShjLnIsYy5wMSxjLnIsYy5wMCk6aShjLnIsYy5wMSxsLnIsbC5wMCkrcihsLnIsbC5wMSxsLmExLWwuYTApK2kobC5yLGwucDEsYy5yLGMucDApKSsiWiJ9ZnVuY3Rpb24gdChuLHQsZSxyKXt2YXIgaT10LmNhbGwobixlLHIpLHU9by5jYWxsKG4saSxyKSxhPWMuY2FsbChuLGkscikra2Mscz1sLmNhbGwobixpLHIpK2tjO3JldHVybntyOnUsYTA6YSxhMTpzLHAwOlt1Kk1hdGguY29zKGEpLHUqTWF0aC5zaW4oYSldLHAxOlt1Kk1hdGguY29zKHMpLHUqTWF0aC5zaW4ocyldfX1mdW5jdGlvbiBlKG4sdCl7cmV0dXJuIG4uYTA9PXQuYTAmJm4uYTE9PXQuYTF9ZnVuY3Rpb24gcihuLHQsZSl7cmV0dXJuIkEiK24rIiwiK24rIiAwICIrICsoZT4kYSkrIiwxICIrdH1mdW5jdGlvbiBpKG4sdCxlLHIpe3JldHVybiJRIDAsMCAiK3J9dmFyIHU9TmUsYT1xZSxvPU11LGM9ZHUsbD1tdTtyZXR1cm4gbi5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ZnQodCksbik6b30sbi5zb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ZnQodCksbik6dX0sbi50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ZnQodCksbik6YX0sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPWZ0KHQpLG4pOmN9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ZnQodCksbik6bH0sbn0seWEuc3ZnLmRpYWdvbmFsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGkpe3ZhciB1PXQuY2FsbCh0aGlzLG4saSksYT1lLmNhbGwodGhpcyxuLGkpLG89KHUueSthLnkpLzIsYz1bdSx7eDp1LngseTpvfSx7eDphLngseTpvfSxhXTtyZXR1cm4gYz1jLm1hcChyKSwiTSIrY1swXSsiQyIrY1sxXSsiICIrY1syXSsiICIrY1szXX12YXIgdD1OZSxlPXFlLHI9eHU7cmV0dXJuIG4uc291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWZ0KGUpLG4pOnR9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWZ0KHQpLG4pOmV9LG4ucHJvamVjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG59LHlhLnN2Zy5kaWFnb25hbC5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj15YS5zdmcuZGlhZ29uYWwoKSx0PXh1LGU9bi5wcm9qZWN0aW9uO3JldHVybiBuLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ZShidSh0PW4pKTp0fSxufSx5YS5zdmcuc3ltYm9sPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHIpe3JldHVybihOYy5nZXQodC5jYWxsKHRoaXMsbixyKSl8fFN1KShlLmNhbGwodGhpcyxuLHIpKX12YXIgdD13dSxlPV91O3JldHVybiBuLnR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZnQoZSksbik6dH0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWZ0KHQpLG4pOmV9LG59O3ZhciBOYz15YS5tYXAoe2NpcmNsZTpTdSxjcm9zczpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi81KS8yO3JldHVybiJNIistMyp0KyIsIistdCsiSCIrLXQrIlYiKy0zKnQrIkgiK3QrIlYiKy10KyJIIiszKnQrIlYiK3QrIkgiK3QrIlYiKzMqdCsiSCIrLXQrIlYiK3QrIkgiKy0zKnQrIloifSxkaWFtb25kOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuLygyKkNjKSksZT10KkNjO3JldHVybiJNMCwiKy10KyJMIitlKyIsMCIrIiAwLCIrdCsiICIrLWUrIiwwIisiWiJ9LHNxdWFyZTpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobikvMjtyZXR1cm4iTSIrLXQrIiwiKy10KyJMIit0KyIsIistdCsiICIrdCsiLCIrdCsiICIrLXQrIiwiK3QrIloifSwidHJpYW5nbGUtZG93biI6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vVGMpLGU9dCpUYy8yO3JldHVybiJNMCwiK2UrIkwiK3QrIiwiKy1lKyIgIistdCsiLCIrLWUrIloifSwidHJpYW5nbGUtdXAiOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuL1RjKSxlPXQqVGMvMjtyZXR1cm4iTTAsIistZSsiTCIrdCsiLCIrZSsiICIrLXQrIiwiK2UrIloifX0pO3lhLnN2Zy5zeW1ib2xUeXBlcz1OYy5rZXlzKCk7dmFyIHFjLFRjPU1hdGguc3FydCgzKSxDYz1NYXRoLnRhbigzMCpHYSksemM9W10sRGM9MCxqYz17ZWFzZTpBcixkZWxheTowLGR1cmF0aW9uOjI1MH07emMuY2FsbD1GYS5jYWxsLHpjLmVtcHR5PUZhLmVtcHR5LHpjLm5vZGU9RmEubm9kZSx6Yy5zaXplPUZhLnNpemUseWEudHJhbnNpdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9xYz9uLnRyYW5zaXRpb24oKTpuOllhLnRyYW5zaXRpb24oKX0seWEudHJhbnNpdGlvbi5wcm90b3R5cGU9emMsemMuc2VsZWN0PWZ1bmN0aW9uKG4pe3ZhciB0LGUscixpPXRoaXMuaWQsdT1bXTtuPXYobik7Zm9yKHZhciBhPS0xLG89dGhpcy5sZW5ndGg7KythPG87KXt1LnB1c2godD1bXSk7Zm9yKHZhciBjPXRoaXNbYV0sbD0tMSxzPWMubGVuZ3RoOysrbDxzOykocj1jW2xdKSYmKGU9bi5jYWxsKHIsci5fX2RhdGFfXyxsKSk/KCJfX2RhdGFfXyJpbiByJiYoZS5fX2RhdGFfXz1yLl9fZGF0YV9fKSxOdShlLGwsaSxyLl9fdHJhbnNpdGlvbl9fW2ldKSx0LnB1c2goZSkpOnQucHVzaChudWxsKX1yZXR1cm4gRXUodSxpKX0semMuc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0LGUscixpLHUsYT10aGlzLmlkLG89W107bj15KG4pO2Zvcih2YXIgYz0tMSxsPXRoaXMubGVuZ3RoOysrYzxsOylmb3IodmFyIHM9dGhpc1tjXSxmPS0xLGg9cy5sZW5ndGg7KytmPGg7KWlmKHI9c1tmXSl7dT1yLl9fdHJhbnNpdGlvbl9fW2FdLGU9bi5jYWxsKHIsci5fX2RhdGFfXyxmKSxvLnB1c2godD1bXSk7Zm9yKHZhciBnPS0xLHA9ZS5sZW5ndGg7KytnPHA7KShpPWVbZ10pJiZOdShpLGcsYSx1KSx0LnB1c2goaSl9cmV0dXJuIEV1KG8sYSl9LHpjLmZpbHRlcj1mdW5jdGlvbihuKXt2YXIgdCxlLHIsaT1bXTsiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49TihuKSk7Zm9yKHZhciB1PTAsYT10aGlzLmxlbmd0aDthPnU7dSsrKXtpLnB1c2godD1bXSk7Zm9yKHZhciBlPXRoaXNbdV0sbz0wLGM9ZS5sZW5ndGg7Yz5vO28rKykocj1lW29dKSYmbi5jYWxsKHIsci5fX2RhdGFfXyxvKSYmdC5wdXNoKHIpfXJldHVybiBFdShpLHRoaXMuaWQsdGhpcy50aW1lKS5lYXNlKHRoaXMuZWFzZSgpKX0semMudHdlZW49ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpcy5ub2RlKCkuX190cmFuc2l0aW9uX19bZV0udHdlZW4uZ2V0KG4pOlQodGhpcyxudWxsPT10P2Z1bmN0aW9uKHQpe3QuX190cmFuc2l0aW9uX19bZV0udHdlZW4ucmVtb3ZlKG4pfTpmdW5jdGlvbihyKXtyLl9fdHJhbnNpdGlvbl9fW2VdLnR3ZWVuLnNldChuLHQpfSl9LHpjLmF0dHI9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUobyl9ZnVuY3Rpb24gcigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlMoby5zcGFjZSxvLmxvY2FsKX1mdW5jdGlvbiBpKG4pe3JldHVybiBudWxsPT1uP2U6KG4rPSIiLGZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmdldEF0dHJpYnV0ZShvKTtyZXR1cm4gZSE9PW4mJih0PWEoZSxuKSxmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZShvLHQobikpfSl9KX1mdW5jdGlvbiB1KG4pe3JldHVybiBudWxsPT1uP3I6KG4rPSIiLGZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmdldEF0dHJpYnV0ZU5TKG8uc3BhY2Usby5sb2NhbCk7cmV0dXJuIGUhPT1uJiYodD1hKGUsbiksZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGVOUyhvLnNwYWNlLG8ubG9jYWwsdChuKSl9KX0pfWlmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHQgaW4gbil0aGlzLmF0dHIodCxuW3RdKTtyZXR1cm4gdGhpc312YXIgYT0idHJhbnNmb3JtIj09bj9Jcjp4cixvPXlhLm5zLnF1YWxpZnkobik7cmV0dXJuIGt1KHRoaXMsImF0dHIuIituLHQsby5sb2NhbD91OmkpfSx6Yy5hdHRyVHdlZW49ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4sZSl7dmFyIHI9dC5jYWxsKHRoaXMsbixlLHRoaXMuZ2V0QXR0cmlidXRlKGkpKTtyZXR1cm4gciYmZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGUoaSxyKG4pKX19ZnVuY3Rpb24gcihuLGUpe3ZhciByPXQuY2FsbCh0aGlzLG4sZSx0aGlzLmdldEF0dHJpYnV0ZU5TKGkuc3BhY2UsaS5sb2NhbCkpO3JldHVybiByJiZmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZU5TKGkuc3BhY2UsaS5sb2NhbCxyKG4pKX19dmFyIGk9eWEubnMucXVhbGlmeShuKTtyZXR1cm4gdGhpcy50d2VlbigiYXR0ci4iK24saS5sb2NhbD9yOmUpfSx6Yy5zdHlsZT1mdW5jdGlvbihuLHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobil9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gbnVsbD09dD9yOih0Kz0iIixmdW5jdGlvbigpe3ZhciByLGk9YmEuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUobik7cmV0dXJuIGkhPT10JiYocj14cihpLHQpLGZ1bmN0aW9uKHQpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobixyKHQpLGUpfSl9KX12YXIgdT1hcmd1bWVudHMubGVuZ3RoO2lmKDM+dSl7aWYoInN0cmluZyIhPXR5cGVvZiBuKXsyPnUmJih0PSIiKTtmb3IoZSBpbiBuKXRoaXMuc3R5bGUoZSxuW2VdLHQpO3JldHVybiB0aGlzfWU9IiJ9cmV0dXJuIGt1KHRoaXMsInN0eWxlLiIrbix0LGkpfSx6Yy5zdHlsZVR3ZWVuPWZ1bmN0aW9uKG4sdCxlKXtmdW5jdGlvbiByKHIsaSl7dmFyIHU9dC5jYWxsKHRoaXMscixpLGJhLmdldENvbXB1dGVkU3R5bGUodGhpcyxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pKTtyZXR1cm4gdSYmZnVuY3Rpb24odCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHUodCksZSl9fXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDMmJihlPSIiKSx0aGlzLnR3ZWVuKCJzdHlsZS4iK24scil9LHpjLnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGt1KHRoaXMsInRleHQiLG4sQXUpfSx6Yy5yZW1vdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKCJlbmQudHJhbnNpdGlvbiIsZnVuY3Rpb24oKXt2YXIgbjshdGhpcy5fX3RyYW5zaXRpb25fXyYmKG49dGhpcy5wYXJlbnROb2RlKSYmbi5yZW1vdmVDaGlsZCh0aGlzKX0pfSx6Yy5lYXNlPWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKS5fX3RyYW5zaXRpb25fX1t0XS5lYXNlOigiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49eWEuZWFzZS5hcHBseSh5YSxhcmd1bWVudHMpKSxUKHRoaXMsZnVuY3Rpb24oZSl7ZS5fX3RyYW5zaXRpb25fX1t0XS5lYXNlPW59KSl9LHpjLmRlbGF5PWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQ7cmV0dXJuIFQodGhpcywiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbihlLHIsaSl7ZS5fX3RyYW5zaXRpb25fX1t0XS5kZWxheT0wfG4uY2FsbChlLGUuX19kYXRhX18scixpKX06KG58PTAsZnVuY3Rpb24oZSl7ZS5fX3RyYW5zaXRpb25fX1t0XS5kZWxheT1ufSkpfSx6Yy5kdXJhdGlvbj1mdW5jdGlvbihuKXt2YXIgdD10aGlzLmlkO3JldHVybiBUKHRoaXMsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24oZSxyLGkpe2UuX190cmFuc2l0aW9uX19bdF0uZHVyYXRpb249TWF0aC5tYXgoMSwwfG4uY2FsbChlLGUuX19kYXRhX18scixpKSl9OihuPU1hdGgubWF4KDEsMHxuKSxmdW5jdGlvbihlKXtlLl9fdHJhbnNpdGlvbl9fW3RdLmR1cmF0aW9uPW59KSl9LHpjLmVhY2g9ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7dmFyIHI9amMsaT1xYztxYz1lLFQodGhpcyxmdW5jdGlvbih0LHIsaSl7amM9dC5fX3RyYW5zaXRpb25fX1tlXSxuLmNhbGwodCx0Ll9fZGF0YV9fLHIsaSl9KSxqYz1yLHFjPWl9ZWxzZSBUKHRoaXMsZnVuY3Rpb24ocil7ci5fX3RyYW5zaXRpb25fX1tlXS5ldmVudC5vbihuLHQpfSk7cmV0dXJuIHRoaXN9LHpjLnRyYW5zaXRpb249ZnVuY3Rpb24oKXtmb3IodmFyIG4sdCxlLHIsaT10aGlzLmlkLHU9KytEYyxhPVtdLG89MCxjPXRoaXMubGVuZ3RoO2M+bztvKyspe2EucHVzaChuPVtdKTtmb3IodmFyIHQ9dGhpc1tvXSxsPTAscz10Lmxlbmd0aDtzPmw7bCsrKShlPXRbbF0pJiYocj1PYmplY3QuY3JlYXRlKGUuX190cmFuc2l0aW9uX19baV0pLHIuZGVsYXkrPXIuZHVyYXRpb24sTnUoZSxsLHUscikpLG4ucHVzaChlKX1yZXR1cm4gRXUoYSx1KX0seWEuc3ZnLmF4aXM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuLGY9eWEuc2VsZWN0KHRoaXMpLGg9bnVsbD09bD9lLnRpY2tzP2UudGlja3MuYXBwbHkoZSxjKTplLmRvbWFpbigpOmwsZz1udWxsPT10P2UudGlja0Zvcm1hdD9lLnRpY2tGb3JtYXQuYXBwbHkoZSxjKTpTdHJpbmc6dCxwPUN1KGUsaCxzKSxkPWYuc2VsZWN0QWxsKCIudGljay5taW5vciIpLmRhdGEocCxTdHJpbmcpLG09ZC5lbnRlcigpLmluc2VydCgibGluZSIsIi50aWNrIikuYXR0cigiY2xhc3MiLCJ0aWNrIG1pbm9yIikuc3R5bGUoIm9wYWNpdHkiLDFlLTYpLHY9eWEudHJhbnNpdGlvbihkLmV4aXQoKSkuc3R5bGUoIm9wYWNpdHkiLDFlLTYpLnJlbW92ZSgpLHk9eWEudHJhbnNpdGlvbihkKS5zdHlsZSgib3BhY2l0eSIsMSksTT1mLnNlbGVjdEFsbCgiLnRpY2subWFqb3IiKS5kYXRhKGgsU3RyaW5nKSx4PU0uZW50ZXIoKS5pbnNlcnQoImciLCIuZG9tYWluIikuYXR0cigiY2xhc3MiLCJ0aWNrIG1ham9yIikuc3R5bGUoIm9wYWNpdHkiLDFlLTYpLGI9eWEudHJhbnNpdGlvbihNLmV4aXQoKSkuc3R5bGUoIm9wYWNpdHkiLDFlLTYpLnJlbW92ZSgpLF89eWEudHJhbnNpdGlvbihNKS5zdHlsZSgib3BhY2l0eSIsMSksdz1JaShlKSxTPWYuc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbMF0pLEU9KFMuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJjbGFzcyIsImRvbWFpbiIpLHlhLnRyYW5zaXRpb24oUykpLGs9ZS5jb3B5KCksQT10aGlzLl9fY2hhcnRfX3x8azt0aGlzLl9fY2hhcnRfXz1rLHguYXBwZW5kKCJsaW5lIikseC5hcHBlbmQoInRleHQiKTt2YXIgTj14LnNlbGVjdCgibGluZSIpLHE9Xy5zZWxlY3QoImxpbmUiKSxUPU0uc2VsZWN0KCJ0ZXh0IikudGV4dChnKSxDPXguc2VsZWN0KCJ0ZXh0Iiksej1fLnNlbGVjdCgidGV4dCIpOwpzd2l0Y2gocil7Y2FzZSJib3R0b20iOm49cXUsbS5hdHRyKCJ5MiIsdSkseS5hdHRyKCJ4MiIsMCkuYXR0cigieTIiLHUpLE4uYXR0cigieTIiLGkpLEMuYXR0cigieSIsTWF0aC5tYXgoaSwwKStvKSxxLmF0dHIoIngyIiwwKS5hdHRyKCJ5MiIsaSksei5hdHRyKCJ4IiwwKS5hdHRyKCJ5IixNYXRoLm1heChpLDApK28pLFQuYXR0cigiZHkiLCIuNzFlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLEUuYXR0cigiZCIsIk0iK3dbMF0rIiwiK2ErIlYwSCIrd1sxXSsiViIrYSk7YnJlYWs7Y2FzZSJ0b3AiOm49cXUsbS5hdHRyKCJ5MiIsLXUpLHkuYXR0cigieDIiLDApLmF0dHIoInkyIiwtdSksTi5hdHRyKCJ5MiIsLWkpLEMuYXR0cigieSIsLShNYXRoLm1heChpLDApK28pKSxxLmF0dHIoIngyIiwwKS5hdHRyKCJ5MiIsLWkpLHouYXR0cigieCIsMCkuYXR0cigieSIsLShNYXRoLm1heChpLDApK28pKSxULmF0dHIoImR5IiwiMGVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIiksRS5hdHRyKCJkIiwiTSIrd1swXSsiLCIrLWErIlYwSCIrd1sxXSsiViIrLWEpO2JyZWFrO2Nhc2UibGVmdCI6bj1UdSxtLmF0dHIoIngyIiwtdSkseS5hdHRyKCJ4MiIsLXUpLmF0dHIoInkyIiwwKSxOLmF0dHIoIngyIiwtaSksQy5hdHRyKCJ4IiwtKE1hdGgubWF4KGksMCkrbykpLHEuYXR0cigieDIiLC1pKS5hdHRyKCJ5MiIsMCksei5hdHRyKCJ4IiwtKE1hdGgubWF4KGksMCkrbykpLmF0dHIoInkiLDApLFQuYXR0cigiZHkiLCIuMzJlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsImVuZCIpLEUuYXR0cigiZCIsIk0iKy1hKyIsIit3WzBdKyJIMFYiK3dbMV0rIkgiKy1hKTticmVhaztjYXNlInJpZ2h0IjpuPVR1LG0uYXR0cigieDIiLHUpLHkuYXR0cigieDIiLHUpLmF0dHIoInkyIiwwKSxOLmF0dHIoIngyIixpKSxDLmF0dHIoIngiLE1hdGgubWF4KGksMCkrbykscS5hdHRyKCJ4MiIsaSkuYXR0cigieTIiLDApLHouYXR0cigieCIsTWF0aC5tYXgoaSwwKStvKS5hdHRyKCJ5IiwwKSxULmF0dHIoImR5IiwiLjMyZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCJzdGFydCIpLEUuYXR0cigiZCIsIk0iK2ErIiwiK3dbMF0rIkgwViIrd1sxXSsiSCIrYSl9aWYoZS50aWNrcyl4LmNhbGwobixBKSxfLmNhbGwobixrKSxiLmNhbGwobixrKSxtLmNhbGwobixBKSx5LmNhbGwobixrKSx2LmNhbGwobixrKTtlbHNle3ZhciBEPWsucmFuZ2VCYW5kKCkvMixqPWZ1bmN0aW9uKG4pe3JldHVybiBrKG4pK0R9O3guY2FsbChuLGopLF8uY2FsbChuLGopfX0pfXZhciB0LGU9eWEuc2NhbGUubGluZWFyKCkscj1MYyxpPTYsdT02LGE9NixvPTMsYz1bMTBdLGw9bnVsbCxzPTA7cmV0dXJuIG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLm9yaWVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10IGluIEhjP3QrIiI6TGMsbik6cn0sbi50aWNrcz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPWFyZ3VtZW50cyxuKTpjfSxuLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCxuKTpsfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLnRpY2tTaXplPWZ1bmN0aW9uKHQsZSl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGk7dmFyIHI9YXJndW1lbnRzLmxlbmd0aC0xO3JldHVybiBpPSt0LHU9cj4xPytlOmksYT1yPjA/K2FyZ3VtZW50c1tyXTppLG59LG4udGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3Qsbik6b30sbi50aWNrU3ViZGl2aWRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LG4pOnN9LG59O3ZhciBMYz0iYm90dG9tIixIYz17dG9wOjEscmlnaHQ6MSxib3R0b206MSxsZWZ0OjF9O3lhLnN2Zy5icnVzaD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odSl7dS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHUsYT15YS5zZWxlY3QodGhpcykscz1hLnNlbGVjdEFsbCgiLmJhY2tncm91bmQiKS5kYXRhKFswXSksZj1hLnNlbGVjdEFsbCgiLmV4dGVudCIpLmRhdGEoWzBdKSxoPWEuc2VsZWN0QWxsKCIucmVzaXplIikuZGF0YShsLFN0cmluZyk7YS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJhbGwiKS5vbigibW91c2Vkb3duLmJydXNoIixpKS5vbigidG91Y2hzdGFydC5icnVzaCIsaSkscy5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwiYmFja2dyb3VuZCIpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikuc3R5bGUoImN1cnNvciIsImNyb3NzaGFpciIpLGYuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImV4dGVudCIpLnN0eWxlKCJjdXJzb3IiLCJtb3ZlIiksaC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIixmdW5jdGlvbihuKXtyZXR1cm4icmVzaXplICIrbn0pLnN0eWxlKCJjdXJzb3IiLGZ1bmN0aW9uKG4pe3JldHVybiBGY1tuXX0pLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLGZ1bmN0aW9uKG4pe3JldHVybi9bZXddJC8udGVzdChuKT8tMzpudWxsfSkuYXR0cigieSIsZnVuY3Rpb24obil7cmV0dXJuL15bbnNdLy50ZXN0KG4pPy0zOm51bGx9KS5hdHRyKCJ3aWR0aCIsNikuYXR0cigiaGVpZ2h0Iiw2KS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpLGguc3R5bGUoImRpc3BsYXkiLG4uZW1wdHkoKT8ibm9uZSI6bnVsbCksaC5leGl0KCkucmVtb3ZlKCksbyYmKHU9SWkobykscy5hdHRyKCJ4Iix1WzBdKS5hdHRyKCJ3aWR0aCIsdVsxXS11WzBdKSxlKGEpKSxjJiYodT1JaShjKSxzLmF0dHIoInkiLHVbMF0pLmF0dHIoImhlaWdodCIsdVsxXS11WzBdKSxyKGEpKSx0KGEpfSl9ZnVuY3Rpb24gdChuKXtuLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7cmV0dXJuInRyYW5zbGF0ZSgiK3NbKy9lJC8udGVzdChuKV1bMF0rIiwiK3NbKy9ecy8udGVzdChuKV1bMV0rIikifSl9ZnVuY3Rpb24gZShuKXtuLnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoIngiLHNbMF1bMF0pLG4uc2VsZWN0QWxsKCIuZXh0ZW50LC5uPnJlY3QsLnM+cmVjdCIpLmF0dHIoIndpZHRoIixzWzFdWzBdLXNbMF1bMF0pfWZ1bmN0aW9uIHIobil7bi5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ5IixzWzBdWzFdKSxuLnNlbGVjdEFsbCgiLmV4dGVudCwuZT5yZWN0LC53PnJlY3QiKS5hdHRyKCJoZWlnaHQiLHNbMV1bMV0tc1swXVsxXSl9ZnVuY3Rpb24gaSgpe2Z1bmN0aW9uIGkoKXt2YXIgbj15YS5ldmVudC5jaGFuZ2VkVG91Y2hlcztyZXR1cm4gbj95YS50b3VjaGVzKE0sbilbMF06eWEubW91c2UoTSl9ZnVuY3Rpb24gbCgpezMyPT15YS5ldmVudC5rZXlDb2RlJiYoa3x8KHY9bnVsbCxOWzBdLT1zWzFdWzBdLE5bMV0tPXNbMV1bMV0saz0yKSxnKCkpfWZ1bmN0aW9uIGgoKXszMj09eWEuZXZlbnQua2V5Q29kZSYmMj09ayYmKE5bMF0rPXNbMV1bMF0sTlsxXSs9c1sxXVsxXSxrPTAsZygpKX1mdW5jdGlvbiBwKCl7dmFyIG49aSgpLHU9ITE7eSYmKG5bMF0rPXlbMF0sblsxXSs9eVsxXSksa3x8KHlhLmV2ZW50LmFsdEtleT8odnx8KHY9WyhzWzBdWzBdK3NbMV1bMF0pLzIsKHNbMF1bMV0rc1sxXVsxXSkvMl0pLE5bMF09c1srKG5bMF08dlswXSldWzBdLE5bMV09c1srKG5bMV08dlsxXSldWzFdKTp2PW51bGwpLFMmJmQobixvLDApJiYoZShfKSx1PSEwKSxFJiZkKG4sYywxKSYmKHIoXyksdT0hMCksdSYmKHQoXyksYih7dHlwZToiYnJ1c2giLG1vZGU6az8ibW92ZSI6InJlc2l6ZSJ9KSl9ZnVuY3Rpb24gZChuLHQsZSl7dmFyIHIsaSxhPUlpKHQpLG89YVswXSxjPWFbMV0sbD1OW2VdLGg9c1sxXVtlXS1zWzBdW2VdO3JldHVybiBrJiYoby09bCxjLT1oK2wpLHI9ZltlXT9NYXRoLm1heChvLE1hdGgubWluKGMsbltlXSkpOm5bZV0saz9pPShyKz1sKStoOih2JiYobD1NYXRoLm1heChvLE1hdGgubWluKGMsMip2W2VdLXIpKSkscj5sPyhpPXIscj1sKTppPWwpLHNbMF1bZV0hPT1yfHxzWzFdW2VdIT09aT8odT1udWxsLHNbMF1bZV09cixzWzFdW2VdPWksITApOnZvaWQgMH1mdW5jdGlvbiBtKCl7cCgpLF8uc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG4uZW1wdHkoKT8ibm9uZSI6bnVsbCkseWEuc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsbnVsbCkscS5vbigibW91c2Vtb3ZlLmJydXNoIixudWxsKS5vbigibW91c2V1cC5icnVzaCIsbnVsbCkub24oInRvdWNobW92ZS5icnVzaCIsbnVsbCkub24oInRvdWNoZW5kLmJydXNoIixudWxsKS5vbigia2V5ZG93bi5icnVzaCIsbnVsbCkub24oImtleXVwLmJydXNoIixudWxsKSxBKCksYih7dHlwZToiYnJ1c2hlbmQifSl9dmFyIHYseSxNPXRoaXMseD15YS5zZWxlY3QoeWEuZXZlbnQudGFyZ2V0KSxiPWEub2YoTSxhcmd1bWVudHMpLF89eWEuc2VsZWN0KE0pLHc9eC5kYXR1bSgpLFM9IS9eKG58cykkLy50ZXN0KHcpJiZvLEU9IS9eKGV8dykkLy50ZXN0KHcpJiZjLGs9eC5jbGFzc2VkKCJleHRlbnQiKSxBPUwoImJydXNoIiksTj1pKCkscT15YS5zZWxlY3QoYmEpLm9uKCJrZXlkb3duLmJydXNoIixsKS5vbigia2V5dXAuYnJ1c2giLGgpO2lmKHlhLmV2ZW50LmNoYW5nZWRUb3VjaGVzP3Eub24oInRvdWNobW92ZS5icnVzaCIscCkub24oInRvdWNoZW5kLmJydXNoIixtKTpxLm9uKCJtb3VzZW1vdmUuYnJ1c2giLHApLm9uKCJtb3VzZXVwLmJydXNoIixtKSxrKU5bMF09c1swXVswXS1OWzBdLE5bMV09c1swXVsxXS1OWzFdO2Vsc2UgaWYodyl7dmFyIFQ9Ky93JC8udGVzdCh3KSxDPSsvXm4vLnRlc3Qodyk7eT1bc1sxLVRdWzBdLU5bMF0sc1sxLUNdWzFdLU5bMV1dLE5bMF09c1tUXVswXSxOWzFdPXNbQ11bMV19ZWxzZSB5YS5ldmVudC5hbHRLZXkmJih2PU4uc2xpY2UoKSk7Xy5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJub25lIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLHlhLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLHguc3R5bGUoImN1cnNvciIpKSxiKHt0eXBlOiJicnVzaHN0YXJ0In0pLHAoKX12YXIgdSxhPWQobiwiYnJ1c2hzdGFydCIsImJydXNoIiwiYnJ1c2hlbmQiKSxvPW51bGwsYz1udWxsLGw9UGNbMF0scz1bWzAsMF0sWzAsMF1dLGY9WyEwLCEwXTtyZXR1cm4gbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQsbD1QY1shbzw8MXwhY10sbik6b30sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQsbD1QY1shbzw8MXwhY10sbik6Y30sbi5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obyYmYz9mPVshIXRbMF0sISF0WzFdXToob3x8YykmJihmWyshb109ISF0KSxuKTpvJiZjP2Y6b3x8Yz9mWyshb106bnVsbH0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGUscixpLGEsbDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1bWzAsMF0sWzAsMF1dLG8mJihlPXRbMF0scj10WzFdLGMmJihlPWVbMF0scj1yWzBdKSx1WzBdWzBdPWUsdVsxXVswXT1yLG8uaW52ZXJ0JiYoZT1vKGUpLHI9byhyKSksZT5yJiYobD1lLGU9cixyPWwpLHNbMF1bMF09MHxlLHNbMV1bMF09MHxyKSxjJiYoaT10WzBdLGE9dFsxXSxvJiYoaT1pWzFdLGE9YVsxXSksdVswXVsxXT1pLHVbMV1bMV09YSxjLmludmVydCYmKGk9YyhpKSxhPWMoYSkpLGk+YSYmKGw9aSxpPWEsYT1sKSxzWzBdWzFdPTB8aSxzWzFdWzFdPTB8YSksbik6KHQ9dXx8cyxvJiYoZT10WzBdWzBdLHI9dFsxXVswXSx1fHwoZT1zWzBdWzBdLHI9c1sxXVswXSxvLmludmVydCYmKGU9by5pbnZlcnQoZSkscj1vLmludmVydChyKSksZT5yJiYobD1lLGU9cixyPWwpKSksYyYmKGk9dFswXVsxXSxhPXRbMV1bMV0sdXx8KGk9c1swXVsxXSxhPXNbMV1bMV0sYy5pbnZlcnQmJihpPWMuaW52ZXJ0KGkpLGE9Yy5pbnZlcnQoYSkpLGk+YSYmKGw9aSxpPWEsYT1sKSkpLG8mJmM/W1tlLGldLFtyLGFdXTpvP1tlLHJdOmMmJltpLGFdKX0sbi5jbGVhcj1mdW5jdGlvbigpe3JldHVybiB1PW51bGwsc1swXVswXT1zWzBdWzFdPXNbMV1bMF09c1sxXVsxXT0wLG59LG4uZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gbyYmc1swXVswXT09PXNbMV1bMF18fGMmJnNbMF1bMV09PT1zWzFdWzFdfSx5YS5yZWJpbmQobixhLCJvbiIpfTt2YXIgRmM9e246Im5zLXJlc2l6ZSIsZToiZXctcmVzaXplIixzOiJucy1yZXNpemUiLHc6ImV3LXJlc2l6ZSIsbnc6Im53c2UtcmVzaXplIixuZToibmVzdy1yZXNpemUiLHNlOiJud3NlLXJlc2l6ZSIsc3c6Im5lc3ctcmVzaXplIn0sUGM9W1sibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0sWyJlIiwidyJdLFsibiIsInMiXSxbXV07eWEudGltZT17fTt2YXIgT2M9RGF0ZSxZYz1bIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il07enUucHJvdG90eXBlPXtnZXREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXRlKCl9LGdldERheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDRGF5KCl9LGdldEZ1bGxZZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENGdWxsWWVhcigpfSxnZXRIb3VyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDSG91cnMoKX0sZ2V0TWlsbGlzZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaWxsaXNlY29uZHMoKX0sZ2V0TWludXRlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTWludXRlcygpfSxnZXRNb250aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTW9udGgoKX0sZ2V0U2Vjb25kczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDU2Vjb25kcygpfSxnZXRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRUaW1lKCl9LGdldFRpbWV6b25lT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLnZhbHVlT2YoKX0sc2V0RGF0ZTpmdW5jdGlvbigpe1JjLnNldFVUQ0RhdGUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldERheTpmdW5jdGlvbigpe1JjLnNldFVUQ0RheS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RnVsbFllYXI6ZnVuY3Rpb24oKXtSYy5zZXRVVENGdWxsWWVhci5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0SG91cnM6ZnVuY3Rpb24oKXtSYy5zZXRVVENIb3Vycy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TWlsbGlzZWNvbmRzOmZ1bmN0aW9uKCl7UmMuc2V0VVRDTWlsbGlzZWNvbmRzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaW51dGVzOmZ1bmN0aW9uKCl7UmMuc2V0VVRDTWludXRlcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TW9udGg6ZnVuY3Rpb24oKXtSYy5zZXRVVENNb250aC5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0U2Vjb25kczpmdW5jdGlvbigpe1JjLnNldFVUQ1NlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldFRpbWU6ZnVuY3Rpb24oKXtSYy5zZXRUaW1lLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfX07dmFyIFJjPURhdGUucHJvdG90eXBlLFVjPSIlYSAlYiAlZSAlWCAlWSIsSWM9IiVtLyVkLyVZIixWYz0iJUg6JU06JVMiLFhjPVsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxaYz1bIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLEJjPVsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSwkYz1bIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdO3lhLnRpbWUueWVhcj1EdShmdW5jdGlvbihuKXtyZXR1cm4gbj15YS50aW1lLmRheShuKSxuLnNldE1vbnRoKDAsMSksbn0sZnVuY3Rpb24obix0KXtuLnNldEZ1bGxZZWFyKG4uZ2V0RnVsbFllYXIoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RnVsbFllYXIoKX0pLHlhLnRpbWUueWVhcnM9eWEudGltZS55ZWFyLnJhbmdlLHlhLnRpbWUueWVhcnMudXRjPXlhLnRpbWUueWVhci51dGMucmFuZ2UseWEudGltZS5kYXk9RHUoZnVuY3Rpb24obil7dmFyIHQ9bmV3IE9jKDJlMywwKTtyZXR1cm4gdC5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpKSx0fSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RGF0ZSgpLTF9KSx5YS50aW1lLmRheXM9eWEudGltZS5kYXkucmFuZ2UseWEudGltZS5kYXlzLnV0Yz15YS50aW1lLmRheS51dGMucmFuZ2UseWEudGltZS5kYXlPZlllYXI9ZnVuY3Rpb24obil7dmFyIHQ9eWEudGltZS55ZWFyKG4pO3JldHVybiBNYXRoLmZsb29yKChuLXQtNmU0KihuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSkvODY0ZTUpfSxZYy5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7bj1uLnRvTG93ZXJDYXNlKCksdD03LXQ7dmFyIGU9eWEudGltZVtuXT1EdShmdW5jdGlvbihuKXtyZXR1cm4obj15YS50aW1lLmRheShuKSkuc2V0RGF0ZShuLmdldERhdGUoKS0obi5nZXREYXkoKSt0KSU3KSxufSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSs3Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXt2YXIgZT15YS50aW1lLnllYXIobikuZ2V0RGF5KCk7cmV0dXJuIE1hdGguZmxvb3IoKHlhLnRpbWUuZGF5T2ZZZWFyKG4pKyhlK3QpJTcpLzcpLShlIT09dCl9KTt5YS50aW1lW24rInMiXT1lLnJhbmdlLHlhLnRpbWVbbisicyJdLnV0Yz1lLnV0Yy5yYW5nZSx5YS50aW1lW24rIk9mWWVhciJdPWZ1bmN0aW9uKG4pe3ZhciBlPXlhLnRpbWUueWVhcihuKS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoeWEudGltZS5kYXlPZlllYXIobikrKGUrdCklNykvNyl9fSkseWEudGltZS53ZWVrPXlhLnRpbWUuc3VuZGF5LHlhLnRpbWUud2Vla3M9eWEudGltZS5zdW5kYXkucmFuZ2UseWEudGltZS53ZWVrcy51dGM9eWEudGltZS5zdW5kYXkudXRjLnJhbmdlLHlhLnRpbWUud2Vla09mWWVhcj15YS50aW1lLnN1bmRheU9mWWVhcix5YS50aW1lLmZvcm1hdD1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KHQpe2Zvcih2YXIgcixpLHUsYT1bXSxvPS0xLGM9MDsrK288ZTspMzc9PT1uLmNoYXJDb2RlQXQobykmJihhLnB1c2gobi5zdWJzdHJpbmcoYyxvKSksbnVsbCE9KGk9aWxbcj1uLmNoYXJBdCgrK28pXSkmJihyPW4uY2hhckF0KCsrbykpLCh1PXVsW3JdKSYmKHI9dSh0LG51bGw9PWk/ImUiPT09cj8iICI6IjAiOmkpKSxhLnB1c2gociksYz1vKzEpO3JldHVybiBhLnB1c2gobi5zdWJzdHJpbmcoYyxvKSksYS5qb2luKCIiKX12YXIgZT1uLmxlbmd0aDtyZXR1cm4gdC5wYXJzZT1mdW5jdGlvbih0KXt2YXIgZT17eToxOTAwLG06MCxkOjEsSDowLE06MCxTOjAsTDowfSxyPUx1KGUsbix0LDApO2lmKHIhPXQubGVuZ3RoKXJldHVybiBudWxsOyJwImluIGUmJihlLkg9ZS5IJTEyKzEyKmUucCk7dmFyIGk9bmV3IE9jO3JldHVybiJqImluIGU/aS5zZXRGdWxsWWVhcihlLnksMCxlLmopOiJ3ImluIGUmJigiVyJpbiBlfHwiVSJpbiBlKT8oaS5zZXRGdWxsWWVhcihlLnksMCwxKSxpLnNldEZ1bGxZZWFyKGUueSwwLCJXImluIGU/KGUudys2KSU3KzcqZS5XLShpLmdldERheSgpKzUpJTc6ZS53KzcqZS5VLShpLmdldERheSgpKzYpJTcpKTppLnNldEZ1bGxZZWFyKGUueSxlLm0sZS5kKSxpLnNldEhvdXJzKGUuSCxlLk0sZS5TLGUuTCksaX0sdC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBufSx0fTt2YXIgV2M9SHUoWGMpLEpjPUZ1KFhjKSxHYz1IdShaYyksS2M9RnUoWmMpLFFjPUh1KEJjKSxubD1GdShCYyksdGw9SHUoJGMpLGVsPUZ1KCRjKSxybD0vXiUvLGlsPXsiLSI6IiIsXzoiICIsMDoiMCJ9LHVsPXthOmZ1bmN0aW9uKG4pe3JldHVybiBaY1tuLmdldERheSgpXX0sQTpmdW5jdGlvbihuKXtyZXR1cm4gWGNbbi5nZXREYXkoKV19LGI6ZnVuY3Rpb24obil7cmV0dXJuICRjW24uZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24obil7cmV0dXJuIEJjW24uZ2V0TW9udGgoKV19LGM6eWEudGltZS5mb3JtYXQoVWMpLGQ6ZnVuY3Rpb24obix0KXtyZXR1cm4gUHUobi5nZXREYXRlKCksdCwyKX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBQdShuLmdldERhdGUoKSx0LDIpfSxIOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFB1KG4uZ2V0SG91cnMoKSx0LDIpfSxJOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFB1KG4uZ2V0SG91cnMoKSUxMnx8MTIsdCwyKX0sajpmdW5jdGlvbihuLHQpe3JldHVybiBQdSgxK3lhLnRpbWUuZGF5T2ZZZWFyKG4pLHQsMyl9LEw6ZnVuY3Rpb24obix0KXtyZXR1cm4gUHUobi5nZXRNaWxsaXNlY29uZHMoKSx0LDMpfSxtOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFB1KG4uZ2V0TW9udGgoKSsxLHQsMil9LE06ZnVuY3Rpb24obix0KXtyZXR1cm4gUHUobi5nZXRNaW51dGVzKCksdCwyKX0scDpmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRIb3VycygpPj0xMj8iUE0iOiJBTSJ9LFM6ZnVuY3Rpb24obix0KXtyZXR1cm4gUHUobi5nZXRTZWNvbmRzKCksdCwyKX0sVTpmdW5jdGlvbihuLHQpe3JldHVybiBQdSh5YS50aW1lLnN1bmRheU9mWWVhcihuKSx0LDIpfSx3OmZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERheSgpfSxXOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFB1KHlhLnRpbWUubW9uZGF5T2ZZZWFyKG4pLHQsMil9LHg6eWEudGltZS5mb3JtYXQoSWMpLFg6eWEudGltZS5mb3JtYXQoVmMpLHk6ZnVuY3Rpb24obix0KXtyZXR1cm4gUHUobi5nZXRGdWxsWWVhcigpJTEwMCx0LDIpfSxZOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFB1KG4uZ2V0RnVsbFllYXIoKSUxZTQsdCw0KX0sWjphYSwiJSI6ZnVuY3Rpb24oKXtyZXR1cm4iJSJ9fSxhbD17YTpPdSxBOll1LGI6VnUsQjpYdSxjOlp1LGQ6UXUsZTpRdSxIOnRhLEk6dGEsajpuYSxMOmlhLG06S3UsTTplYSxwOnVhLFM6cmEsVTpVdSx3OlJ1LFc6SXUseDpCdSxYOiR1LHk6SnUsWTpXdSwiJSI6b2F9LG9sPS9eXHMqXGQrLyxjbD15YS5tYXAoe2FtOjAscG06MX0pO3lhLnRpbWUuZm9ybWF0LnV0Yz1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KG4pe3RyeXtPYz16dTt2YXIgdD1uZXcgT2M7cmV0dXJuIHQuXz1uLGUodCl9ZmluYWxseXtPYz1EYXRlfX12YXIgZT15YS50aW1lLmZvcm1hdChuKTtyZXR1cm4gdC5wYXJzZT1mdW5jdGlvbihuKXt0cnl7T2M9enU7dmFyIHQ9ZS5wYXJzZShuKTtyZXR1cm4gdCYmdC5ffWZpbmFsbHl7T2M9RGF0ZX19LHQudG9TdHJpbmc9ZS50b1N0cmluZyx0fTt2YXIgbGw9eWEudGltZS5mb3JtYXQudXRjKCIlWS0lbS0lZFQlSDolTTolUy4lTFoiKTt5YS50aW1lLmZvcm1hdC5pc289RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcmJituZXcgRGF0ZSgiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaIik/Y2E6bGwsY2EucGFyc2U9ZnVuY3Rpb24obil7dmFyIHQ9bmV3IERhdGUobik7cmV0dXJuIGlzTmFOKHQpP251bGw6dH0sY2EudG9TdHJpbmc9bGwudG9TdHJpbmcseWEudGltZS5zZWNvbmQ9RHUoZnVuY3Rpb24obil7cmV0dXJuIG5ldyBPYygxZTMqTWF0aC5mbG9vcihuLzFlMykpfSxmdW5jdGlvbihuLHQpe24uc2V0VGltZShuLmdldFRpbWUoKSsxZTMqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFNlY29uZHMoKX0pLHlhLnRpbWUuc2Vjb25kcz15YS50aW1lLnNlY29uZC5yYW5nZSx5YS50aW1lLnNlY29uZHMudXRjPXlhLnRpbWUuc2Vjb25kLnV0Yy5yYW5nZSx5YS50aW1lLm1pbnV0ZT1EdShmdW5jdGlvbihuKXtyZXR1cm4gbmV3IE9jKDZlNCpNYXRoLmZsb29yKG4vNmU0KSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzZlNCpNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWludXRlcygpfSkseWEudGltZS5taW51dGVzPXlhLnRpbWUubWludXRlLnJhbmdlLHlhLnRpbWUubWludXRlcy51dGM9eWEudGltZS5taW51dGUudXRjLnJhbmdlLHlhLnRpbWUuaG91cj1EdShmdW5jdGlvbihuKXt2YXIgdD1uLmdldFRpbWV6b25lT2Zmc2V0KCkvNjA7cmV0dXJuIG5ldyBPYygzNmU1KihNYXRoLmZsb29yKG4vMzZlNS10KSt0KSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzM2ZTUqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEhvdXJzKCl9KSx5YS50aW1lLmhvdXJzPXlhLnRpbWUuaG91ci5yYW5nZSx5YS50aW1lLmhvdXJzLnV0Yz15YS50aW1lLmhvdXIudXRjLnJhbmdlLHlhLnRpbWUubW9udGg9RHUoZnVuY3Rpb24obil7cmV0dXJuIG49eWEudGltZS5kYXkobiksbi5zZXREYXRlKDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRNb250aChuLmdldE1vbnRoKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1vbnRoKCl9KSx5YS50aW1lLm1vbnRocz15YS50aW1lLm1vbnRoLnJhbmdlLHlhLnRpbWUubW9udGhzLnV0Yz15YS50aW1lLm1vbnRoLnV0Yy5yYW5nZTt2YXIgc2w9WzFlMyw1ZTMsMTVlMywzZTQsNmU0LDNlNSw5ZTUsMThlNSwzNmU1LDEwOGU1LDIxNmU1LDQzMmU1LDg2NGU1LDE3MjhlNSw2MDQ4ZTUsMjU5MmU2LDc3NzZlNiwzMTUzNmU2XSxmbD1bW3lhLnRpbWUuc2Vjb25kLDFdLFt5YS50aW1lLnNlY29uZCw1XSxbeWEudGltZS5zZWNvbmQsMTVdLFt5YS50aW1lLnNlY29uZCwzMF0sW3lhLnRpbWUubWludXRlLDFdLFt5YS50aW1lLm1pbnV0ZSw1XSxbeWEudGltZS5taW51dGUsMTVdLFt5YS50aW1lLm1pbnV0ZSwzMF0sW3lhLnRpbWUuaG91ciwxXSxbeWEudGltZS5ob3VyLDNdLFt5YS50aW1lLmhvdXIsNl0sW3lhLnRpbWUuaG91ciwxMl0sW3lhLnRpbWUuZGF5LDFdLFt5YS50aW1lLmRheSwyXSxbeWEudGltZS53ZWVrLDFdLFt5YS50aW1lLm1vbnRoLDFdLFt5YS50aW1lLm1vbnRoLDNdLFt5YS50aW1lLnllYXIsMV1dLGhsPVtbeWEudGltZS5mb3JtYXQoIiVZIiksUnRdLFt5YS50aW1lLmZvcm1hdCgiJUIiKSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNb250aCgpfV0sW3lhLnRpbWUuZm9ybWF0KCIlYiAlZCIpLGZ1bmN0aW9uKG4pe3JldHVybiAxIT1uLmdldERhdGUoKX1dLFt5YS50aW1lLmZvcm1hdCgiJWEgJWQiKSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXREYXkoKSYmMSE9bi5nZXREYXRlKCl9XSxbeWEudGltZS5mb3JtYXQoIiVJICVwIiksZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0SG91cnMoKX1dLFt5YS50aW1lLmZvcm1hdCgiJUk6JU0iKSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNaW51dGVzKCl9XSxbeWEudGltZS5mb3JtYXQoIjolUyIpLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFNlY29uZHMoKX1dLFt5YS50aW1lLmZvcm1hdCgiLiVMIiksZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWlsbGlzZWNvbmRzKCl9XV0sZ2w9eWEuc2NhbGUubGluZWFyKCkscGw9ZmEoaGwpO2ZsLnllYXI9ZnVuY3Rpb24obix0KXtyZXR1cm4gZ2wuZG9tYWluKG4ubWFwKGdhKSkudGlja3ModCkubWFwKGhhKX0seWEudGltZS5zY2FsZT1mdW5jdGlvbigpe3JldHVybiBsYSh5YS5zY2FsZS5saW5lYXIoKSxmbCxwbCl9O3ZhciBkbD1mbC5tYXAoZnVuY3Rpb24obil7cmV0dXJuW25bMF0udXRjLG5bMV1dfSksbWw9W1t5YS50aW1lLmZvcm1hdC51dGMoIiVZIiksUnRdLFt5YS50aW1lLmZvcm1hdC51dGMoIiVCIiksZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTW9udGgoKX1dLFt5YS50aW1lLmZvcm1hdC51dGMoIiViICVkIiksZnVuY3Rpb24obil7cmV0dXJuIDEhPW4uZ2V0VVRDRGF0ZSgpfV0sW3lhLnRpbWUuZm9ybWF0LnV0YygiJWEgJWQiKSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENEYXkoKSYmMSE9bi5nZXRVVENEYXRlKCl9XSxbeWEudGltZS5mb3JtYXQudXRjKCIlSSAlcCIpLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ0hvdXJzKCl9XSxbeWEudGltZS5mb3JtYXQudXRjKCIlSTolTSIpLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ01pbnV0ZXMoKX1dLFt5YS50aW1lLmZvcm1hdC51dGMoIjolUyIpLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ1NlY29uZHMoKX1dLFt5YS50aW1lLmZvcm1hdC51dGMoIi4lTCIpLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ01pbGxpc2Vjb25kcygpfV1dLHZsPWZhKG1sKTtyZXR1cm4gZGwueWVhcj1mdW5jdGlvbihuLHQpe3JldHVybiBnbC5kb21haW4obi5tYXAoZGEpKS50aWNrcyh0KS5tYXAocGEpfSx5YS50aW1lLnNjYWxlLnV0Yz1mdW5jdGlvbigpe3JldHVybiBsYSh5YS5zY2FsZS5saW5lYXIoKSxkbCx2bCl9LHlhLnRleHQ9Z3QoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVzcG9uc2VUZXh0fSkseWEuanNvbj1mdW5jdGlvbihuLHQpe3JldHVybiBwdChuLCJhcHBsaWNhdGlvbi9qc29uIixtYSx0KX0seWEuaHRtbD1mdW5jdGlvbihuLHQpe3JldHVybiBwdChuLCJ0ZXh0L2h0bWwiLHZhLHQpfSx5YS54bWw9Z3QoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVzcG9uc2VYTUx9KSx5YX0oKTs=' type='text/javascript'></script> <script src='data:application/javascript;base64,KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLHQpe3JldHVybihuZXcgRGF0ZSh0LGUrMSwwKSkuZ2V0RGF0ZSgpfWZ1bmN0aW9uIG4oZSx0LG4pe3JldHVybiBmdW5jdGlvbihyLGkscyl7dmFyIG89ZShyKSx1PVtdO288ciYmdChvKTtpZihzPjEpd2hpbGUobzxpKXt2YXIgYT1uZXcgRGF0ZSgrbyk7bihhKSVzPT09MCYmdS5wdXNoKGEpLHQobyl9ZWxzZSB3aGlsZShvPGkpdS5wdXNoKG5ldyBEYXRlKCtvKSksdChvKTtyZXR1cm4gdX19dmFyIGU9d2luZG93Lm52fHx7fTtlLnZlcnNpb249IjEuMS4xMGIiLGUuZGV2PSEwLHdpbmRvdy5udj1lLGUudG9vbHRpcD17fSxlLnV0aWxzPXt9LGUubW9kZWxzPXt9LGUuY2hhcnRzPXt9LGUuZ3JhcGhzPVtdLGUubG9ncz17fSxlLmRpc3BhdGNoPWQzLmRpc3BhdGNoKCJyZW5kZXJfc3RhcnQiLCJyZW5kZXJfZW5kIiksZS5kZXYmJihlLmRpc3BhdGNoLm9uKCJyZW5kZXJfc3RhcnQiLGZ1bmN0aW9uKHQpe2UubG9ncy5zdGFydFRpbWU9KyhuZXcgRGF0ZSl9KSxlLmRpc3BhdGNoLm9uKCJyZW5kZXJfZW5kIixmdW5jdGlvbih0KXtlLmxvZ3MuZW5kVGltZT0rKG5ldyBEYXRlKSxlLmxvZ3MudG90YWxUaW1lPWUubG9ncy5lbmRUaW1lLWUubG9ncy5zdGFydFRpbWUsZS5sb2coInRvdGFsIixlLmxvZ3MudG90YWxUaW1lKX0pKSxlLmxvZz1mdW5jdGlvbigpe2lmKGUuZGV2JiZjb25zb2xlLmxvZyYmY29uc29sZS5sb2cuYXBwbHkpY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSxhcmd1bWVudHMpO2Vsc2UgaWYoZS5kZXYmJnR5cGVvZiBjb25zb2xlLmxvZz09ImZ1bmN0aW9uIiYmRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQpe3ZhciB0PUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwoY29uc29sZS5sb2csY29uc29sZSk7dC5hcHBseShjb25zb2xlLGFyZ3VtZW50cyl9cmV0dXJuIGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdfSxlLnJlbmRlcj1mdW5jdGlvbihuKXtuPW58fDEsZS5yZW5kZXIuYWN0aXZlPSEwLGUuZGlzcGF0Y2gucmVuZGVyX3N0YXJ0KCksc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciB0LHI7Zm9yKHZhciBpPTA7aTxuJiYocj1lLnJlbmRlci5xdWV1ZVtpXSk7aSsrKXQ9ci5nZW5lcmF0ZSgpLHR5cGVvZiByLmNhbGxiYWNrPT10eXBlb2YgRnVuY3Rpb24mJnIuY2FsbGJhY2sodCksZS5ncmFwaHMucHVzaCh0KTtlLnJlbmRlci5xdWV1ZS5zcGxpY2UoMCxpKSxlLnJlbmRlci5xdWV1ZS5sZW5ndGg/c2V0VGltZW91dChhcmd1bWVudHMuY2FsbGVlLDApOihlLnJlbmRlci5hY3RpdmU9ITEsZS5kaXNwYXRjaC5yZW5kZXJfZW5kKCkpfSwwKX0sZS5yZW5kZXIuYWN0aXZlPSExLGUucmVuZGVyLnF1ZXVlPVtdLGUuYWRkR3JhcGg9ZnVuY3Rpb24odCl7dHlwZW9mIGFyZ3VtZW50c1swXT09dHlwZW9mIEZ1bmN0aW9uJiYodD17Z2VuZXJhdGU6YXJndW1lbnRzWzBdLGNhbGxiYWNrOmFyZ3VtZW50c1sxXX0pLGUucmVuZGVyLnF1ZXVlLnB1c2godCksZS5yZW5kZXIuYWN0aXZlfHxlLnJlbmRlcigpfSxlLmlkZW50aXR5PWZ1bmN0aW9uKGUpe3JldHVybiBlfSxlLnN0cmlwPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLyhcc3wmKS9nLCIiKX0sZDMudGltZS5tb250aEVuZD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLGUuZ2V0TW9udGgoKSwwKX0sZDMudGltZS5tb250aEVuZHM9bihkMy50aW1lLm1vbnRoRW5kLGZ1bmN0aW9uKGUpe2Uuc2V0VVRDRGF0ZShlLmdldFVUQ0RhdGUoKSsxKSxlLnNldERhdGUodChlLmdldE1vbnRoKCkrMSxlLmdldEZ1bGxZZWFyKCkpKX0sZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0TW9udGgoKX0pLGUuaW50ZXJhY3RpdmVHdWlkZWxpbmU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYyhvKXtvLmVhY2goZnVuY3Rpb24obyl7ZnVuY3Rpb24gZygpe3ZhciBlPWQzLm1vdXNlKHRoaXMpLG49ZVswXSxyPWVbMV0sbz0hMCxhPSExO2wmJihuPWQzLmV2ZW50Lm9mZnNldFgscj1kMy5ldmVudC5vZmZzZXRZLGQzLmV2ZW50LnRhcmdldC50YWdOYW1lIT09InN2ZyImJihvPSExKSxkMy5ldmVudC50YXJnZXQuY2xhc3NOYW1lLmJhc2VWYWwubWF0Y2goIm52LWxlZ2VuZCIpJiYoYT0hMCkpLG8mJihuLT1pLmxlZnQsci09aS50b3ApO2lmKG48MHx8cjwwfHxuPnB8fHI+ZHx8ZDMuZXZlbnQucmVsYXRlZFRhcmdldCYmZDMuZXZlbnQucmVsYXRlZFRhcmdldC5vd25lclNWR0VsZW1lbnQ9PT11bmRlZmluZWR8fGEpe2lmKGwmJmQzLmV2ZW50LnJlbGF0ZWRUYXJnZXQmJmQzLmV2ZW50LnJlbGF0ZWRUYXJnZXQub3duZXJTVkdFbGVtZW50PT09dW5kZWZpbmVkJiZkMy5ldmVudC5yZWxhdGVkVGFyZ2V0LmNsYXNzTmFtZS5tYXRjaCh0Lm52UG9pbnRlckV2ZW50c0NsYXNzKSlyZXR1cm47dS5lbGVtZW50TW91c2VvdXQoe21vdXNlWDpuLG1vdXNlWTpyfSksYy5yZW5kZXJHdWlkZUxpbmUobnVsbCk7cmV0dXJufXZhciBmPXMuaW52ZXJ0KG4pO3UuZWxlbWVudE1vdXNlbW92ZSh7bW91c2VYOm4sbW91c2VZOnIscG9pbnRYVmFsdWU6Zn0pfXZhciBoPWQzLnNlbGVjdCh0aGlzKSxwPW58fDk2MCxkPXJ8fDQwMCx2PWguc2VsZWN0QWxsKCJnLm52LXdyYXAubnYtaW50ZXJhY3RpdmVMaW5lTGF5ZXIiKS5kYXRhKFtvXSksbT12LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCIgbnYtd3JhcCBudi1pbnRlcmFjdGl2ZUxpbmVMYXllciIpO20uYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1pbnRlcmFjdGl2ZUd1aWRlTGluZSIpO2lmKCFmKXJldHVybjtmLm9uKCJtb3VzZW1vdmUiLGcsITApLm9uKCJtb3VzZW91dCIsZywhMCksYy5yZW5kZXJHdWlkZUxpbmU9ZnVuY3Rpb24odCl7aWYoIWEpcmV0dXJuO3ZhciBuPXYuc2VsZWN0KCIubnYtaW50ZXJhY3RpdmVHdWlkZUxpbmUiKS5zZWxlY3RBbGwoImxpbmUiKS5kYXRhKHQhPW51bGw/W2UudXRpbHMuTmFOdG9aZXJvKHQpXTpbXSxTdHJpbmcpO24uZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5hdHRyKCJjbGFzcyIsIm52LWd1aWRlbGluZSIpLmF0dHIoIngxIixmdW5jdGlvbihlKXtyZXR1cm4gZX0pLmF0dHIoIngyIixmdW5jdGlvbihlKXtyZXR1cm4gZX0pLmF0dHIoInkxIixkKS5hdHRyKCJ5MiIsMCksbi5leGl0KCkucmVtb3ZlKCl9fSl9dmFyIHQ9ZS5tb2RlbHMudG9vbHRpcCgpLG49bnVsbCxyPW51bGwsaT17bGVmdDowLHRvcDowfSxzPWQzLnNjYWxlLmxpbmVhcigpLG89ZDMuc2NhbGUubGluZWFyKCksdT1kMy5kaXNwYXRjaCgiZWxlbWVudE1vdXNlbW92ZSIsImVsZW1lbnRNb3VzZW91dCIpLGE9ITAsZj1udWxsLGw9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIikhPT0tMTtyZXR1cm4gYy5kaXNwYXRjaD11LGMudG9vbHRpcD10LGMubWFyZ2luPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpLnRvcD10eXBlb2YgZS50b3AhPSJ1bmRlZmluZWQiP2UudG9wOmkudG9wLGkubGVmdD10eXBlb2YgZS5sZWZ0IT0idW5kZWZpbmVkIj9lLmxlZnQ6aS5sZWZ0LGMpOml9LGMud2lkdGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSxjKTpufSxjLmhlaWdodD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLGMpOnJ9LGMueFNjYWxlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPWUsYyk6c30sYy5zaG93R3VpZGVMaW5lPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWUsYyk6YX0sYy5zdmdDb250YWluZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ZSxjKTpmfSxjfSxlLmludGVyYWN0aXZlQmlzZWN0PWZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7aWYoIWUgaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4gbnVsbDt0eXBlb2YgbiE9ImZ1bmN0aW9uIiYmKG49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS54fSk7dmFyIHI9ZDMuYmlzZWN0b3IobikubGVmdCxpPWQzLm1heChbMCxyKGUsdCktMV0pLHM9bihlW2ldLGkpO3R5cGVvZiBzPT0idW5kZWZpbmVkIiYmKHM9aSk7aWYocz09PXQpcmV0dXJuIGk7dmFyIG89ZDMubWluKFtpKzEsZS5sZW5ndGgtMV0pLHU9bihlW29dLG8pO3JldHVybiB0eXBlb2YgdT09InVuZGVmaW5lZCImJih1PW8pLE1hdGguYWJzKHUtdCk+PU1hdGguYWJzKHMtdCk/aTpvfSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt3aW5kb3cubnYudG9vbHRpcD17fSx3aW5kb3cubnYubW9kZWxzLnRvb2x0aXA9ZnVuY3Rpb24oKXtmdW5jdGlvbiBnKCl7aWYoYSl7dmFyIGU9ZDMuc2VsZWN0KGEpO2Uubm9kZSgpLnRhZ05hbWUhPT0ic3ZnIiYmKGU9ZS5zZWxlY3QoInN2ZyIpKTt2YXIgdD1lLm5vZGUoKT9lLmF0dHIoInZpZXdCb3giKTpudWxsO2lmKHQpe3Q9dC5zcGxpdCgiICIpO3ZhciBuPXBhcnNlSW50KGUuc3R5bGUoIndpZHRoIikpL3RbMl07Zi5sZWZ0PWYubGVmdCpuLGYudG9wPWYudG9wKm59fX1mdW5jdGlvbiB5KGUpe3ZhciB0O2E/dD1kMy5zZWxlY3QoYSk6dD1kMy5zZWxlY3QoImJvZHkiKTt2YXIgbj10LnNlbGVjdCgiLm52dG9vbHRpcCIpO3JldHVybiBuLm5vZGUoKT09PW51bGwmJihuPXQuYXBwZW5kKCJkaXYiKS5hdHRyKCJjbGFzcyIsIm52dG9vbHRpcCAiKyh1P3U6Inh5LXRvb2x0aXAiKSkuYXR0cigiaWQiLGMpKSxuLm5vZGUoKS5pbm5lckhUTUw9ZSxuLnN0eWxlKCJ0b3AiLDApLnN0eWxlKCJsZWZ0IiwwKS5zdHlsZSgib3BhY2l0eSIsMCksbi5zZWxlY3RBbGwoImRpdiwgdGFibGUsIHRkLCB0ciIpLmNsYXNzZWQoaCwhMCksbi5jbGFzc2VkKGgsITApLG4ubm9kZSgpfWZ1bmN0aW9uIGIoKXtpZighbClyZXR1cm47aWYoIW0obikpcmV0dXJuO2coKTt2YXIgdD1mLmxlZnQsdT1vIT1udWxsP286Zi50b3AsYz15KHYobikpO2lmKGEpe3ZhciBoPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInN2ZyIpWzBdLHA9aD9oLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD17bGVmdDowLHRvcDowfTtpZihoKXt2YXIgdz1oLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLEU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtkLnRvcD1NYXRoLmFicyh3LnRvcC1FLnRvcCksZC5sZWZ0PU1hdGguYWJzKHcubGVmdC1FLmxlZnQpfXQrPWEub2Zmc2V0TGVmdCtkLmxlZnQtMiphLnNjcm9sbExlZnQsdSs9YS5vZmZzZXRUb3ArZC50b3AtMiphLnNjcm9sbFRvcH1yZXR1cm4gcyYmcz4wJiYodT1NYXRoLmZsb29yKHUvcykqcyksZS50b29sdGlwLmNhbGNUb29sdGlwUG9zaXRpb24oW3QsdV0scixpLGMpLGJ9dmFyIHQ9bnVsbCxuPW51bGwscj0idyIsaT01MCxzPTI1LG89bnVsbCx1PW51bGwsYT1udWxsLGY9e2xlZnQ6bnVsbCx0b3A6bnVsbH0sbD0hMCxjPSJudnRvb2x0aXAtIitNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqMWU1KSxoPSJudi1wb2ludGVyLWV2ZW50cy1ub25lIixwPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGV9LGQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHY9ZnVuY3Rpb24oZSl7aWYodCE9bnVsbClyZXR1cm4gdDtpZihlPT1udWxsKXJldHVybiIiO3ZhciBuPSI8dGFibGU+PHRoZWFkPjx0cj48dGQgY29sc3Bhbj0nMyc+PHN0cm9uZyBjbGFzcz0neC12YWx1ZSc+IitkKGUudmFsdWUpKyI8L3N0cm9uZz48L3RkPjwvdHI+PC90aGVhZD48dGJvZHk+IjtyZXR1cm4gZS5zZXJpZXMgaW5zdGFuY2VvZiBBcnJheSYmZS5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihlLHQpe24rPSI8dHI+IixuKz0iPHRkIGNsYXNzPSdsZWdlbmQtY29sb3ItZ3VpZGUnPjxkaXYgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6ICIrZS5jb2xvcisiOyc+PC9kaXY+PC90ZD4iLG4rPSI8dGQgY2xhc3M9J2tleSc+IitlLmtleSsiOjwvdGQ+IixuKz0iPHRkIGNsYXNzPSd2YWx1ZSc+IitwKGUudmFsdWUsdCkrIjwvdGQ+PC90cj4ifSksbis9IjwvdGJvZHk+PC90YWJsZT4iLG59LG09ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuc2VyaWVzJiZlLnNlcmllcy5sZW5ndGg+MD8hMDohMX07cmV0dXJuIGIubnZQb2ludGVyRXZlbnRzQ2xhc3M9aCxiLmNvbnRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxiKTp0fSxiLmNvbnRlbnRHZW5lcmF0b3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHR5cGVvZiBlPT0iZnVuY3Rpb24iJiYodj1lKSxiKTp2fSxiLmRhdGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSxiKTpufSxiLmdyYXZpdHk9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSxiKTpyfSxiLmRpc3RhbmNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUsYik6aX0sYi5zbmFwRGlzdGFuY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ZSxiKTpzfSxiLmNsYXNzZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ZSxiKTp1fSxiLmNoYXJ0Q29udGFpbmVyPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWUsYik6YX0sYi5wb3NpdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZi5sZWZ0PXR5cGVvZiBlLmxlZnQhPSJ1bmRlZmluZWQiP2UubGVmdDpmLmxlZnQsZi50b3A9dHlwZW9mIGUudG9wIT0idW5kZWZpbmVkIj9lLnRvcDpmLnRvcCxiKTpmfSxiLmZpeGVkVG9wPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWUsYik6b30sYi5lbmFibGVkPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPWUsYik6bH0sYi52YWx1ZUZvcm1hdHRlcj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odHlwZW9mIGU9PSJmdW5jdGlvbiImJihwPWUpLGIpOnB9LGIuaGVhZGVyRm9ybWF0dGVyPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0eXBlb2YgZT09ImZ1bmN0aW9uIiYmKGQ9ZSksYik6ZH0sYi5pZD1mdW5jdGlvbigpe3JldHVybiBjfSxifSxlLnRvb2x0aXAuc2hvdz1mdW5jdGlvbih0LG4scixpLHMsbyl7dmFyIHU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dS5jbGFzc05hbWU9Im52dG9vbHRpcCAiKyhvP286Inh5LXRvb2x0aXAiKTt2YXIgYT1zO2lmKCFzfHxzLnRhZ05hbWUubWF0Y2goL2d8c3ZnL2kpKWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTt1LnN0eWxlLmxlZnQ9MCx1LnN0eWxlLnRvcD0wLHUuc3R5bGUub3BhY2l0eT0wLHUuaW5uZXJIVE1MPW4sYS5hcHBlbmRDaGlsZCh1KSxzJiYodFswXT10WzBdLXMuc2Nyb2xsTGVmdCx0WzFdPXRbMV0tcy5zY3JvbGxUb3ApLGUudG9vbHRpcC5jYWxjVG9vbHRpcFBvc2l0aW9uKHQscixpLHUpfSxlLnRvb2x0aXAuZmluZEZpcnN0Tm9uU1ZHUGFyZW50PWZ1bmN0aW9uKGUpe3doaWxlKGUudGFnTmFtZS5tYXRjaCgvXmd8c3ZnJC9pKSE9PW51bGwpZT1lLnBhcmVudE5vZGU7cmV0dXJuIGV9LGUudG9vbHRpcC5maW5kVG90YWxPZmZzZXRUb3A9ZnVuY3Rpb24oZSx0KXt2YXIgbj10O2RvIGlzTmFOKGUub2Zmc2V0VG9wKXx8KG4rPWUub2Zmc2V0VG9wKTt3aGlsZShlPWUub2Zmc2V0UGFyZW50KTtyZXR1cm4gbn0sZS50b29sdGlwLmZpbmRUb3RhbE9mZnNldExlZnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10O2RvIGlzTmFOKGUub2Zmc2V0TGVmdCl8fChuKz1lLm9mZnNldExlZnQpO3doaWxlKGU9ZS5vZmZzZXRQYXJlbnQpO3JldHVybiBufSxlLnRvb2x0aXAuY2FsY1Rvb2x0aXBQb3NpdGlvbj1mdW5jdGlvbih0LG4scixpKXt2YXIgcz1wYXJzZUludChpLm9mZnNldEhlaWdodCksbz1wYXJzZUludChpLm9mZnNldFdpZHRoKSx1PWUudXRpbHMud2luZG93U2l6ZSgpLndpZHRoLGE9ZS51dGlscy53aW5kb3dTaXplKCkuaGVpZ2h0LGY9d2luZG93LnBhZ2VZT2Zmc2V0LGw9d2luZG93LnBhZ2VYT2Zmc2V0LGMsaDthPXdpbmRvdy5pbm5lcldpZHRoPj1kb2N1bWVudC5ib2R5LnNjcm9sbFdpZHRoP2E6YS0xNix1PXdpbmRvdy5pbm5lckhlaWdodD49ZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQ/dTp1LTE2LG49bnx8InMiLHI9cnx8MjA7dmFyIHA9ZnVuY3Rpb24odCl7cmV0dXJuIGUudG9vbHRpcC5maW5kVG90YWxPZmZzZXRUb3AodCxoKX0sZD1mdW5jdGlvbih0KXtyZXR1cm4gZS50b29sdGlwLmZpbmRUb3RhbE9mZnNldExlZnQodCxjKX07c3dpdGNoKG4pe2Nhc2UiZSI6Yz10WzBdLW8tcixoPXRbMV0tcy8yO3ZhciB2PWQoaSksbT1wKGkpO3Y8bCYmKGM9dFswXStyPmw/dFswXStyOmwtditjKSxtPGYmJihoPWYtbStoKSxtK3M+ZithJiYoaD1mK2EtbStoLXMpO2JyZWFrO2Nhc2UidyI6Yz10WzBdK3IsaD10WzFdLXMvMjt2YXIgdj1kKGkpLG09cChpKTt2K28+dSYmKGM9dFswXS1vLXIpLG08ZiYmKGg9Zis1KSxtK3M+ZithJiYoaD1mK2EtbStoLXMpO2JyZWFrO2Nhc2UibiI6Yz10WzBdLW8vMi01LGg9dFsxXStyO3ZhciB2PWQoaSksbT1wKGkpO3Y8bCYmKGM9bCs1KSx2K28+dSYmKGM9Yy1vLzIrNSksbStzPmYrYSYmKGg9ZithLW0raC1zKTticmVhaztjYXNlInMiOmM9dFswXS1vLzIsaD10WzFdLXMtcjt2YXIgdj1kKGkpLG09cChpKTt2PGwmJihjPWwrNSksditvPnUmJihjPWMtby8yKzUpLGY+bSYmKGg9Zik7YnJlYWs7Y2FzZSJub25lIjpjPXRbMF0saD10WzFdLXI7dmFyIHY9ZChpKSxtPXAoaSl9cmV0dXJuIGkuc3R5bGUubGVmdD1jKyJweCIsaS5zdHlsZS50b3A9aCsicHgiLGkuc3R5bGUub3BhY2l0eT0xLGkuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixpfSxlLnRvb2x0aXAuY2xlYW51cD1mdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm52dG9vbHRpcCIpLHQ9W107d2hpbGUoZS5sZW5ndGgpdC5wdXNoKGVbMF0pLGVbMF0uc3R5bGUudHJhbnNpdGlvbkRlbGF5PSIwICFpbXBvcnRhbnQiLGVbMF0uc3R5bGUub3BhY2l0eT0wLGVbMF0uY2xhc3NOYW1lPSJudnRvb2x0aXAtcGVuZGluZy1yZW1vdmFsIjtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7d2hpbGUodC5sZW5ndGgpe3ZhciBlPXQucG9wKCk7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfX0sNTAwKX19KCksZS51dGlscy53aW5kb3dTaXplPWZ1bmN0aW9uKCl7dmFyIGU9e3dpZHRoOjY0MCxoZWlnaHQ6NDgwfTtyZXR1cm4gZG9jdW1lbnQuYm9keSYmZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCYmKGUud2lkdGg9ZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCxlLmhlaWdodD1kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCksZG9jdW1lbnQuY29tcGF0TW9kZT09IkNTUzFDb21wYXQiJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRXaWR0aCYmKGUud2lkdGg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoLGUuaGVpZ2h0PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQpLHdpbmRvdy5pbm5lcldpZHRoJiZ3aW5kb3cuaW5uZXJIZWlnaHQmJihlLndpZHRoPXdpbmRvdy5pbm5lcldpZHRoLGUuaGVpZ2h0PXdpbmRvdy5pbm5lckhlaWdodCksZX0sZS51dGlscy53aW5kb3dSZXNpemU9ZnVuY3Rpb24oZSl7aWYoZT09PXVuZGVmaW5lZClyZXR1cm47dmFyIHQ9d2luZG93Lm9ucmVzaXplO3dpbmRvdy5vbnJlc2l6ZT1mdW5jdGlvbihuKXt0eXBlb2YgdD09ImZ1bmN0aW9uIiYmdChuKSxlKG4pfX0sZS51dGlscy5nZXRDb2xvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk9PT0iW29iamVjdCBBcnJheV0iP2Z1bmN0aW9uKGUsbil7cmV0dXJuIGUuY29sb3J8fHRbbiV0Lmxlbmd0aF19OnQ6ZS51dGlscy5kZWZhdWx0Q29sb3IoKX0sZS51dGlscy5kZWZhdWx0Q29sb3I9ZnVuY3Rpb24oKXt2YXIgZT1kMy5zY2FsZS5jYXRlZ29yeTIwKCkucmFuZ2UoKTtyZXR1cm4gZnVuY3Rpb24odCxuKXtyZXR1cm4gdC5jb2xvcnx8ZVtuJWUubGVuZ3RoXX19LGUudXRpbHMuY3VzdG9tVGhlbWU9ZnVuY3Rpb24oZSx0LG4pe3Q9dHx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUua2V5fSxuPW58fGQzLnNjYWxlLmNhdGVnb3J5MjAoKS5yYW5nZSgpO3ZhciByPW4ubGVuZ3RoO3JldHVybiBmdW5jdGlvbihpLHMpe3ZhciBvPXQoaSk7cmV0dXJuIHJ8fChyPW4ubGVuZ3RoKSx0eXBlb2YgZVtvXSE9InVuZGVmaW5lZCI/dHlwZW9mIGVbb109PSJmdW5jdGlvbiI/ZVtvXSgpOmVbb106blstLXJdfX0sZS51dGlscy5wamF4PWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gcihyKXtkMy5odG1sKHIsZnVuY3Rpb24ocil7dmFyIGk9ZDMuc2VsZWN0KG4pLm5vZGUoKTtpLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGQzLnNlbGVjdChyKS5zZWxlY3Qobikubm9kZSgpLGkpLGUudXRpbHMucGpheCh0LG4pfSl9ZDMuc2VsZWN0QWxsKHQpLm9uKCJjbGljayIsZnVuY3Rpb24oKXtoaXN0b3J5LnB1c2hTdGF0ZSh0aGlzLmhyZWYsdGhpcy50ZXh0Q29udGVudCx0aGlzLmhyZWYpLHIodGhpcy5ocmVmKSxkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpfSksZDMuc2VsZWN0KHdpbmRvdykub24oInBvcHN0YXRlIixmdW5jdGlvbigpe2QzLmV2ZW50LnN0YXRlJiZyKGQzLmV2ZW50LnN0YXRlKX0pfSxlLnV0aWxzLmNhbGNBcHByb3hUZXh0V2lkdGg9ZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIGQzLnNlbGVjdGlvbil7dmFyIHQ9cGFyc2VJbnQoZS5zdHlsZSgiZm9udC1zaXplIikucmVwbGFjZSgicHgiLCIiKSksbj1lLnRleHQoKS5sZW5ndGg7cmV0dXJuIG4qdCouNX1yZXR1cm4gMH0sZS51dGlscy5OYU50b1plcm89ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlIT0ibnVtYmVyInx8aXNOYU4oZSl8fGU9PT1udWxsfHxlPT09SW5maW5pdHk/MDplfSxlLnV0aWxzLm9wdGlvbnNGdW5jPWZ1bmN0aW9uKGUpe3JldHVybiBlJiZkMy5tYXAoZSkuZm9yRWFjaChmdW5jdGlvbihlLHQpe3R5cGVvZiB0aGlzW2VdPT0iZnVuY3Rpb24iJiZ0aGlzW2VdKHQpfS5iaW5kKHRoaXMpKSx0aGlzfSxlLm1vZGVscy5heGlzPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHYoZSl7cmV0dXJuIGUuZWFjaChmdW5jdGlvbihlKXt2YXIgaT1kMy5zZWxlY3QodGhpcyksdj1pLnNlbGVjdEFsbCgiZy5udi13cmFwLm52LWF4aXMiKS5kYXRhKFtlXSksbT12LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudmQzIG52LXdyYXAgbnYtYXhpcyIpLGc9bS5hcHBlbmQoImciKSx5PXYuc2VsZWN0KCJnIik7cCE9PW51bGw/dC50aWNrcyhwKToodC5vcmllbnQoKT09InRvcCJ8fHQub3JpZW50KCk9PSJib3R0b20iKSYmdC50aWNrcyhNYXRoLmFicyhzLnJhbmdlKClbMV0tcy5yYW5nZSgpWzBdKS8xMDApLHkudHJhbnNpdGlvbigpLmNhbGwodCksZD1kfHx0LnNjYWxlKCk7dmFyIGI9dC50aWNrRm9ybWF0KCk7Yj09bnVsbCYmKGI9ZC50aWNrRm9ybWF0KCkpO3ZhciB3PXkuc2VsZWN0QWxsKCJ0ZXh0Lm52LWF4aXNsYWJlbCIpLmRhdGEoW298fG51bGxdKTt3LmV4aXQoKS5yZW1vdmUoKTtzd2l0Y2godC5vcmllbnQoKSl7Y2FzZSJ0b3AiOncuZW50ZXIoKS5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsIm52LWF4aXNsYWJlbCIpO3ZhciBFPXMucmFuZ2UoKS5sZW5ndGg9PTI/cy5yYW5nZSgpWzFdOnMucmFuZ2UoKVtzLnJhbmdlKCkubGVuZ3RoLTFdKyhzLnJhbmdlKClbMV0tcy5yYW5nZSgpWzBdKTt3LmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigieSIsMCkuYXR0cigieCIsRS8yKTtpZih1KXt2YXIgUz12LnNlbGVjdEFsbCgiZy5udi1heGlzTWF4TWluIikuZGF0YShzLmRvbWFpbigpKTtTLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1heGlzTWF4TWluIikuYXBwZW5kKCJ0ZXh0IiksUy5leGl0KCkucmVtb3ZlKCksUy5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUsdCl7cmV0dXJuInRyYW5zbGF0ZSgiK3MoZSkrIiwwKSJ9KS5zZWxlY3QoInRleHQiKS5hdHRyKCJkeSIsIjBlbSIpLmF0dHIoInkiLC10LnRpY2tQYWRkaW5nKCkpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikudGV4dChmdW5jdGlvbihlLHQpe3ZhciBuPWIoZSk7cmV0dXJuKCIiK24pLm1hdGNoKCJOYU4iKT8iIjpufSksUy50cmFuc2l0aW9uKCkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihlLHQpe3JldHVybiJ0cmFuc2xhdGUoIitzLnJhbmdlKClbdF0rIiwwKSJ9KX1icmVhaztjYXNlImJvdHRvbSI6dmFyIHg9MzYsVD0zMCxOPXkuc2VsZWN0QWxsKCJnIikuc2VsZWN0KCJ0ZXh0Iik7aWYoZiUzNjApe04uZWFjaChmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0QkJveCgpLndpZHRoO24+VCYmKFQ9bil9KTt2YXIgQz1NYXRoLmFicyhNYXRoLnNpbihmKk1hdGguUEkvMTgwKSkseD0oQz9DKlQ6VCkrMzA7Ti5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4icm90YXRlKCIrZisiIDAsMCkifSkuc3R5bGUoInRleHQtYW5jaG9yIixmJTM2MD4wPyJzdGFydCI6ImVuZCIpfXcuZW50ZXIoKS5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsIm52LWF4aXNsYWJlbCIpO3ZhciBFPXMucmFuZ2UoKS5sZW5ndGg9PTI/cy5yYW5nZSgpWzFdOnMucmFuZ2UoKVtzLnJhbmdlKCkubGVuZ3RoLTFdKyhzLnJhbmdlKClbMV0tcy5yYW5nZSgpWzBdKTt3LmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigieSIseCkuYXR0cigieCIsRS8yKTtpZih1KXt2YXIgUz12LnNlbGVjdEFsbCgiZy5udi1heGlzTWF4TWluIikuZGF0YShbcy5kb21haW4oKVswXSxzLmRvbWFpbigpW3MuZG9tYWluKCkubGVuZ3RoLTFdXSk7Uy5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtYXhpc01heE1pbiIpLmFwcGVuZCgidGV4dCIpLFMuZXhpdCgpLnJlbW92ZSgpLFMuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihlLHQpe3JldHVybiJ0cmFuc2xhdGUoIisocyhlKSsoaD9zLnJhbmdlQmFuZCgpLzI6MCkpKyIsMCkifSkuc2VsZWN0KCJ0ZXh0IikuYXR0cigiZHkiLCIuNzFlbSIpLmF0dHIoInkiLHQudGlja1BhZGRpbmcoKSkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihlLHQsbil7cmV0dXJuInJvdGF0ZSgiK2YrIiAwLDApIn0pLnN0eWxlKCJ0ZXh0LWFuY2hvciIsZj9mJTM2MD4wPyJzdGFydCI6ImVuZCI6Im1pZGRsZSIpLnRleHQoZnVuY3Rpb24oZSx0KXt2YXIgbj1iKGUpO3JldHVybigiIituKS5tYXRjaCgiTmFOIik/IiI6bn0pLFMudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oZSx0KXtyZXR1cm4idHJhbnNsYXRlKCIrKHMoZSkrKGg/cy5yYW5nZUJhbmQoKS8yOjApKSsiLDApIn0pfWMmJk4uYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihlLHQpe3JldHVybiJ0cmFuc2xhdGUoMCwiKyh0JTI9PTA/IjAiOiIxMiIpKyIpIn0pO2JyZWFrO2Nhc2UicmlnaHQiOncuZW50ZXIoKS5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsIm52LWF4aXNsYWJlbCIpLHcuc3R5bGUoInRleHQtYW5jaG9yIixsPyJtaWRkbGUiOiJiZWdpbiIpLmF0dHIoInRyYW5zZm9ybSIsbD8icm90YXRlKDkwKSI6IiIpLmF0dHIoInkiLGw/LU1hdGgubWF4KG4ucmlnaHQscikrMTI6LTEwKS5hdHRyKCJ4IixsP3MucmFuZ2UoKVswXS8yOnQudGlja1BhZGRpbmcoKSk7aWYodSl7dmFyIFM9di5zZWxlY3RBbGwoImcubnYtYXhpc01heE1pbiIpLmRhdGEocy5kb21haW4oKSk7Uy5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtYXhpc01heE1pbiIpLmFwcGVuZCgidGV4dCIpLnN0eWxlKCJvcGFjaXR5IiwwKSxTLmV4aXQoKS5yZW1vdmUoKSxTLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oZSx0KXtyZXR1cm4idHJhbnNsYXRlKDAsIitzKGUpKyIpIn0pLnNlbGVjdCgidGV4dCIpLmF0dHIoImR5IiwiLjMyZW0iKS5hdHRyKCJ5IiwwKS5hdHRyKCJ4Iix0LnRpY2tQYWRkaW5nKCkpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsInN0YXJ0IikudGV4dChmdW5jdGlvbihlLHQpe3ZhciBuPWIoZSk7cmV0dXJuKCIiK24pLm1hdGNoKCJOYU4iKT8iIjpufSksUy50cmFuc2l0aW9uKCkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihlLHQpe3JldHVybiJ0cmFuc2xhdGUoMCwiK3MucmFuZ2UoKVt0XSsiKSJ9KS5zZWxlY3QoInRleHQiKS5zdHlsZSgib3BhY2l0eSIsMSl9YnJlYWs7Y2FzZSJsZWZ0Ijp3LmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLCJudi1heGlzbGFiZWwiKSx3LnN0eWxlKCJ0ZXh0LWFuY2hvciIsbD8ibWlkZGxlIjoiZW5kIikuYXR0cigidHJhbnNmb3JtIixsPyJyb3RhdGUoLTkwKSI6IiIpLmF0dHIoInkiLGw/LU1hdGgubWF4KG4ubGVmdCxyKSsxMjotMTApLmF0dHIoIngiLGw/LXMucmFuZ2UoKVswXS8yOi10LnRpY2tQYWRkaW5nKCkpO2lmKHUpe3ZhciBTPXYuc2VsZWN0QWxsKCJnLm52LWF4aXNNYXhNaW4iKS5kYXRhKHMuZG9tYWluKCkpO1MuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LWF4aXNNYXhNaW4iKS5hcHBlbmQoInRleHQiKS5zdHlsZSgib3BhY2l0eSIsMCksUy5leGl0KCkucmVtb3ZlKCksUy5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUsdCl7cmV0dXJuInRyYW5zbGF0ZSgwLCIrZChlKSsiKSJ9KS5zZWxlY3QoInRleHQiKS5hdHRyKCJkeSIsIi4zMmVtIikuYXR0cigieSIsMCkuYXR0cigieCIsLXQudGlja1BhZGRpbmcoKSkuYXR0cigidGV4dC1hbmNob3IiLCJlbmQiKS50ZXh0KGZ1bmN0aW9uKGUsdCl7dmFyIG49YihlKTtyZXR1cm4oIiIrbikubWF0Y2goIk5hTiIpPyIiOm59KSxTLnRyYW5zaXRpb24oKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUsdCl7cmV0dXJuInRyYW5zbGF0ZSgwLCIrcy5yYW5nZSgpW3RdKyIpIn0pLnNlbGVjdCgidGV4dCIpLnN0eWxlKCJvcGFjaXR5IiwxKX19dy50ZXh0KGZ1bmN0aW9uKGUpe3JldHVybiBlfSksdSYmKHQub3JpZW50KCk9PT0ibGVmdCJ8fHQub3JpZW50KCk9PT0icmlnaHQiKSYmKHkuc2VsZWN0QWxsKCJnIikuZWFjaChmdW5jdGlvbihlLHQpe2QzLnNlbGVjdCh0aGlzKS5zZWxlY3QoInRleHQiKS5hdHRyKCJvcGFjaXR5IiwxKTtpZihzKGUpPHMucmFuZ2UoKVsxXSsxMHx8cyhlKT5zLnJhbmdlKClbMF0tMTApKGU+MWUtMTB8fGU8LTFlLTEwKSYmZDMuc2VsZWN0KHRoaXMpLmF0dHIoIm9wYWNpdHkiLDApLGQzLnNlbGVjdCh0aGlzKS5zZWxlY3QoInRleHQiKS5hdHRyKCJvcGFjaXR5IiwwKX0pLHMuZG9tYWluKClbMF09PXMuZG9tYWluKClbMV0mJnMuZG9tYWluKClbMF09PTAmJnYuc2VsZWN0QWxsKCJnLm52LWF4aXNNYXhNaW4iKS5zdHlsZSgib3BhY2l0eSIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8wOjF9KSk7aWYodSYmKHQub3JpZW50KCk9PT0idG9wInx8dC5vcmllbnQoKT09PSJib3R0b20iKSl7dmFyIGs9W107di5zZWxlY3RBbGwoImcubnYtYXhpc01heE1pbiIpLmVhY2goZnVuY3Rpb24oZSx0KXt0cnl7dD9rLnB1c2gocyhlKS10aGlzLmdldEJCb3goKS53aWR0aC00KTprLnB1c2gocyhlKSt0aGlzLmdldEJCb3goKS53aWR0aCs0KX1jYXRjaChuKXt0P2sucHVzaChzKGUpLTQpOmsucHVzaChzKGUpKzQpfX0pLHkuc2VsZWN0QWxsKCJnIikuZWFjaChmdW5jdGlvbihlLHQpe2lmKHMoZSk8a1swXXx8cyhlKT5rWzFdKWU+MWUtMTB8fGU8LTFlLTEwP2QzLnNlbGVjdCh0aGlzKS5yZW1vdmUoKTpkMy5zZWxlY3QodGhpcykuc2VsZWN0KCJ0ZXh0IikucmVtb3ZlKCl9KX1hJiZ5LnNlbGVjdEFsbCgiLnRpY2siKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIXBhcnNlRmxvYXQoTWF0aC5yb3VuZChlLl9fZGF0YV9fKjFlNSkvMWU2KSYmZS5fX2RhdGFfXyE9PXVuZGVmaW5lZH0pLmNsYXNzZWQoInplcm8iLCEwKSxkPXMuY29weSgpfSksdn12YXIgdD1kMy5zdmcuYXhpcygpLG49e3RvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowfSxyPTc1LGk9NjAscz1kMy5zY2FsZS5saW5lYXIoKSxvPW51bGwsdT0hMCxhPSEwLGY9MCxsPSEwLGM9ITEsaD0hMSxwPW51bGw7dC5zY2FsZShzKS5vcmllbnQoImJvdHRvbSIpLnRpY2tGb3JtYXQoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KTt2YXIgZDtyZXR1cm4gdi5heGlzPXQsZDMucmViaW5kKHYsdCwib3JpZW50IiwidGlja1ZhbHVlcyIsInRpY2tTdWJkaXZpZGUiLCJ0aWNrU2l6ZSIsInRpY2tQYWRkaW5nIiwidGlja0Zvcm1hdCIpLGQzLnJlYmluZCh2LHMsImRvbWFpbiIsInJhbmdlIiwicmFuZ2VCYW5kIiwicmFuZ2VCYW5kcyIpLHYub3B0aW9ucz1lLnV0aWxzLm9wdGlvbnNGdW5jLmJpbmQodiksdi5tYXJnaW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4udG9wPXR5cGVvZiBlLnRvcCE9InVuZGVmaW5lZCI/ZS50b3A6bi50b3Asbi5yaWdodD10eXBlb2YgZS5yaWdodCE9InVuZGVmaW5lZCI/ZS5yaWdodDpuLnJpZ2h0LG4uYm90dG9tPXR5cGVvZiBlLmJvdHRvbSE9InVuZGVmaW5lZCI/ZS5ib3R0b206bi5ib3R0b20sbi5sZWZ0PXR5cGVvZiBlLmxlZnQhPSJ1bmRlZmluZWQiP2UubGVmdDpuLmxlZnQsdik6bn0sdi53aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLHYpOnJ9LHYudGlja3M9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9ZSx2KTpwfSx2LmhlaWdodD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1lLHYpOml9LHYuYXhpc0xhYmVsPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWUsdik6b30sdi5zaG93TWF4TWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWUsdik6dX0sdi5oaWdobGlnaHRaZXJvPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWUsdik6YX0sdi5zY2FsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1lLHQuc2NhbGUocyksaD10eXBlb2Ygcy5yYW5nZUJhbmRzPT0iZnVuY3Rpb24iLGQzLnJlYmluZCh2LHMsImRvbWFpbiIsInJhbmdlIiwicmFuZ2VCYW5kIiwicmFuZ2VCYW5kcyIpLHYpOnN9LHYucm90YXRlWUxhYmVsPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPWUsdik6bH0sdi5yb3RhdGVMYWJlbHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ZSx2KTpmfSx2LnN0YWdnZXJMYWJlbHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ZSx2KTpjfSx2fSxlLm1vZGVscy5idWxsZXQ9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbShlKXtyZXR1cm4gZS5lYWNoKGZ1bmN0aW9uKGUsbil7dmFyIHA9Yy10LmxlZnQtdC5yaWdodCxtPWgtdC50b3AtdC5ib3R0b20sZz1kMy5zZWxlY3QodGhpcykseT1pLmNhbGwodGhpcyxlLG4pLnNsaWNlKCkuc29ydChkMy5kZXNjZW5kaW5nKSxiPXMuY2FsbCh0aGlzLGUsbikuc2xpY2UoKS5zb3J0KGQzLmRlc2NlbmRpbmcpLHc9by5jYWxsKHRoaXMsZSxuKS5zbGljZSgpLnNvcnQoZDMuZGVzY2VuZGluZyksRT11LmNhbGwodGhpcyxlLG4pLnNsaWNlKCksUz1hLmNhbGwodGhpcyxlLG4pLnNsaWNlKCkseD1mLmNhbGwodGhpcyxlLG4pLnNsaWNlKCksVD1kMy5zY2FsZS5saW5lYXIoKS5kb21haW4oZDMuZXh0ZW50KGQzLm1lcmdlKFtsLHldKSkpLnJhbmdlKHI/W3AsMF06WzAscF0pLE49dGhpcy5fX2NoYXJ0X198fGQzLnNjYWxlLmxpbmVhcigpLmRvbWFpbihbMCxJbmZpbml0eV0pLnJhbmdlKFQucmFuZ2UoKSk7dGhpcy5fX2NoYXJ0X189VDt2YXIgQz1kMy5taW4oeSksaz1kMy5tYXgoeSksTD15WzFdLEE9Zy5zZWxlY3RBbGwoImcubnYtd3JhcC5udi1idWxsZXQiKS5kYXRhKFtlXSksTz1BLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudmQzIG52LXdyYXAgbnYtYnVsbGV0IiksTT1PLmFwcGVuZCgiZyIpLF89QS5zZWxlY3QoImciKTtNLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwibnYtcmFuZ2UgbnYtcmFuZ2VNYXgiKSxNLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwibnYtcmFuZ2UgbnYtcmFuZ2VBdmciKSxNLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwibnYtcmFuZ2UgbnYtcmFuZ2VNaW4iKSxNLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwibnYtbWVhc3VyZSIpLE0uYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJudi1tYXJrZXJUcmlhbmdsZSIpLEEuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrdC5sZWZ0KyIsIit0LnRvcCsiKSIpO3ZhciBEPWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmFicyhOKGUpLU4oMCkpfSxQPWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmFicyhUKGUpLVQoMCkpfSxIPWZ1bmN0aW9uKGUpe3JldHVybiBlPDA/TihlKTpOKDApfSxCPWZ1bmN0aW9uKGUpe3JldHVybiBlPDA/VChlKTpUKDApfTtfLnNlbGVjdCgicmVjdC5udi1yYW5nZU1heCIpLmF0dHIoImhlaWdodCIsbSkuYXR0cigid2lkdGgiLFAoaz4wP2s6QykpLmF0dHIoIngiLEIoaz4wP2s6QykpLmRhdHVtKGs+MD9rOkMpLF8uc2VsZWN0KCJyZWN0Lm52LXJhbmdlQXZnIikuYXR0cigiaGVpZ2h0IixtKS5hdHRyKCJ3aWR0aCIsUChMKSkuYXR0cigieCIsQihMKSkuZGF0dW0oTCksXy5zZWxlY3QoInJlY3QubnYtcmFuZ2VNaW4iKS5hdHRyKCJoZWlnaHQiLG0pLmF0dHIoIndpZHRoIixQKGspKS5hdHRyKCJ4IixCKGspKS5hdHRyKCJ3aWR0aCIsUChrPjA/QzprKSkuYXR0cigieCIsQihrPjA/QzprKSkuZGF0dW0oaz4wP0M6ayksXy5zZWxlY3QoInJlY3QubnYtbWVhc3VyZSIpLnN0eWxlKCJmaWxsIixkKS5hdHRyKCJoZWlnaHQiLG0vMykuYXR0cigieSIsbS8zKS5hdHRyKCJ3aWR0aCIsdzwwP1QoMCktVCh3WzBdKTpUKHdbMF0pLVQoMCkpLmF0dHIoIngiLEIodykpLm9uKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7di5lbGVtZW50TW91c2VvdmVyKHt2YWx1ZTp3WzBdLGxhYmVsOnhbMF18fCJDdXJyZW50Iixwb3M6W1Qod1swXSksbS8yXX0pfSkub24oIm1vdXNlb3V0IixmdW5jdGlvbigpe3YuZWxlbWVudE1vdXNlb3V0KHt2YWx1ZTp3WzBdLGxhYmVsOnhbMF18fCJDdXJyZW50In0pfSk7dmFyIGo9bS82O2JbMF0/Xy5zZWxlY3RBbGwoInBhdGgubnYtbWFya2VyVHJpYW5nbGUiKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUpe3JldHVybiJ0cmFuc2xhdGUoIitUKGJbMF0pKyIsIittLzIrIikifSkuYXR0cigiZCIsIk0wLCIraisiTCIraisiLCIrIC1qKyIgIisgLWorIiwiKyAtaisiWiIpLm9uKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7di5lbGVtZW50TW91c2VvdmVyKHt2YWx1ZTpiWzBdLGxhYmVsOlNbMF18fCJQcmV2aW91cyIscG9zOltUKGJbMF0pLG0vMl19KX0pLm9uKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2LmVsZW1lbnRNb3VzZW91dCh7dmFsdWU6YlswXSxsYWJlbDpTWzBdfHwiUHJldmlvdXMifSl9KTpfLnNlbGVjdEFsbCgicGF0aC5udi1tYXJrZXJUcmlhbmdsZSIpLnJlbW92ZSgpLEEuc2VsZWN0QWxsKCIubnYtcmFuZ2UiKS5vbigibW91c2VvdmVyIixmdW5jdGlvbihlLHQpe3ZhciBuPUVbdF18fCh0P3Q9PTE/Ik1lYW4iOiJNaW5pbXVtIjoiTWF4aW11bSIpO3YuZWxlbWVudE1vdXNlb3Zlcih7dmFsdWU6ZSxsYWJlbDpuLHBvczpbVChlKSxtLzJdfSl9KS5vbigibW91c2VvdXQiLGZ1bmN0aW9uKGUsdCl7dmFyIG49RVt0XXx8KHQ/dD09MT8iTWVhbiI6Ik1pbmltdW0iOiJNYXhpbXVtIik7di5lbGVtZW50TW91c2VvdXQoe3ZhbHVlOmUsbGFiZWw6bn0pfSl9KSxtfXZhciB0PXt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MH0sbj0ibGVmdCIscj0hMSxpPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJhbmdlc30scz1mdW5jdGlvbihlKXtyZXR1cm4gZS5tYXJrZXJzfSxvPWZ1bmN0aW9uKGUpe3JldHVybiBlLm1lYXN1cmVzfSx1PWZ1bmN0aW9uKGUpe3JldHVybiBlLnJhbmdlTGFiZWxzP2UucmFuZ2VMYWJlbHM6W119LGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGUubWFya2VyTGFiZWxzP2UubWFya2VyTGFiZWxzOltdfSxmPWZ1bmN0aW9uKGUpe3JldHVybiBlLm1lYXN1cmVMYWJlbHM/ZS5tZWFzdXJlTGFiZWxzOltdfSxsPVswXSxjPTM4MCxoPTMwLHA9bnVsbCxkPWUudXRpbHMuZ2V0Q29sb3IoWyIjMWY3N2I0Il0pLHY9ZDMuZGlzcGF0Y2goImVsZW1lbnRNb3VzZW92ZXIiLCJlbGVtZW50TW91c2VvdXQiKTtyZXR1cm4gbS5kaXNwYXRjaD12LG0ub3B0aW9ucz1lLnV0aWxzLm9wdGlvbnNGdW5jLmJpbmQobSksbS5vcmllbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSxyPW49PSJyaWdodCJ8fG49PSJib3R0b20iLG0pOm59LG0ucmFuZ2VzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUsbSk6aX0sbS5tYXJrZXJzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPWUsbSk6c30sbS5tZWFzdXJlcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1lLG0pOm99LG0uZm9yY2VYPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPWUsbSk6bH0sbS53aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1lLG0pOmN9LG0uaGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPWUsbSk6aH0sbS5tYXJnaW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQudG9wPXR5cGVvZiBlLnRvcCE9InVuZGVmaW5lZCI/ZS50b3A6dC50b3AsdC5yaWdodD10eXBlb2YgZS5yaWdodCE9InVuZGVmaW5lZCI/ZS5yaWdodDp0LnJpZ2h0LHQuYm90dG9tPXR5cGVvZiBlLmJvdHRvbSE9InVuZGVmaW5lZCI/ZS5ib3R0b206dC5ib3R0b20sdC5sZWZ0PXR5cGVvZiBlLmxlZnQhPSJ1bmRlZmluZWQiP2UubGVmdDp0LmxlZnQsbSk6dH0sbS50aWNrRm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPWUsbSk6cH0sbS5jb2xvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1lLnV0aWxzLmdldENvbG9yKHQpLG0pOmR9LG19LGUubW9kZWxzLmJ1bGxldENoYXJ0PWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG0oZSl7cmV0dXJuIGUuZWFjaChmdW5jdGlvbihuLGgpe3ZhciBnPWQzLnNlbGVjdCh0aGlzKSx5PShhfHxwYXJzZUludChnLnN0eWxlKCJ3aWR0aCIpKXx8OTYwKS1pLmxlZnQtaS5yaWdodCxiPWYtaS50b3AtaS5ib3R0b20sdz10aGlzO20udXBkYXRlPWZ1bmN0aW9uKCl7bShlKX0sbS5jb250YWluZXI9dGhpcztpZighbnx8IXMuY2FsbCh0aGlzLG4saCkpe3ZhciBFPWcuc2VsZWN0QWxsKCIubnYtbm9EYXRhIikuZGF0YShbcF0pO3JldHVybiBFLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLCJudmQzIG52LW5vRGF0YSIpLmF0dHIoImR5IiwiLS43ZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKSxFLmF0dHIoIngiLGkubGVmdCt5LzIpLmF0dHIoInkiLDE4K2kudG9wK2IvMikudGV4dChmdW5jdGlvbihlKXtyZXR1cm4gZX0pLG19Zy5zZWxlY3RBbGwoIi5udi1ub0RhdGEiKS5yZW1vdmUoKTt2YXIgUz1zLmNhbGwodGhpcyxuLGgpLnNsaWNlKCkuc29ydChkMy5kZXNjZW5kaW5nKSx4PW8uY2FsbCh0aGlzLG4saCkuc2xpY2UoKS5zb3J0KGQzLmRlc2NlbmRpbmcpLFQ9dS5jYWxsKHRoaXMsbixoKS5zbGljZSgpLnNvcnQoZDMuZGVzY2VuZGluZyksTj1nLnNlbGVjdEFsbCgiZy5udi13cmFwLm52LWJ1bGxldENoYXJ0IikuZGF0YShbbl0pLEM9Ti5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnZkMyBudi13cmFwIG52LWJ1bGxldENoYXJ0Iiksaz1DLmFwcGVuZCgiZyIpLEw9Ti5zZWxlY3QoImciKTtrLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtYnVsbGV0V3JhcCIpLGsuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi10aXRsZXMiKSxOLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2kubGVmdCsiLCIraS50b3ArIikiKTt2YXIgQT1kMy5zY2FsZS5saW5lYXIoKS5kb21haW4oWzAsTWF0aC5tYXgoU1swXSx4WzBdLFRbMF0pXSkucmFuZ2Uocj9beSwwXTpbMCx5XSksTz10aGlzLl9fY2hhcnRfX3x8ZDMuc2NhbGUubGluZWFyKCkuZG9tYWluKFswLEluZmluaXR5XSkucmFuZ2UoQS5yYW5nZSgpKTt0aGlzLl9fY2hhcnRfXz1BO3ZhciBNPWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmFicyhPKGUpLU8oMCkpfSxfPWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmFicyhBKGUpLUEoMCkpfSxEPWsuc2VsZWN0KCIubnYtdGl0bGVzIikuYXBwZW5kKCJnIikuYXR0cigidGV4dC1hbmNob3IiLCJlbmQiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoLTYsIisoZi1pLnRvcC1pLmJvdHRvbSkvMisiKSIpO0QuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLCJudi10aXRsZSIpLnRleHQoZnVuY3Rpb24oZSl7cmV0dXJuIGUudGl0bGV9KSxELmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIiwibnYtc3VidGl0bGUiKS5hdHRyKCJkeSIsIjFlbSIpLnRleHQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3VidGl0bGV9KSx0LndpZHRoKHkpLmhlaWdodChiKTt2YXIgUD1MLnNlbGVjdCgiLm52LWJ1bGxldFdyYXAiKTtkMy50cmFuc2l0aW9uKFApLmNhbGwodCk7dmFyIEg9bHx8QS50aWNrRm9ybWF0KHkvMTAwKSxCPUwuc2VsZWN0QWxsKCJnLm52LXRpY2siKS5kYXRhKEEudGlja3MoeS81MCksZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudGV4dENvbnRlbnR8fEgoZSl9KSxqPUIuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXRpY2siKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUpe3JldHVybiJ0cmFuc2xhdGUoIitPKGUpKyIsMCkifSkuc3R5bGUoIm9wYWNpdHkiLDFlLTYpO2ouYXBwZW5kKCJsaW5lIikuYXR0cigieTEiLGIpLmF0dHIoInkyIixiKjcvNiksai5hcHBlbmQoInRleHQiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoImR5IiwiMWVtIikuYXR0cigieSIsYio3LzYpLnRleHQoSCk7dmFyIEY9ZDMudHJhbnNpdGlvbihCKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUpe3JldHVybiJ0cmFuc2xhdGUoIitBKGUpKyIsMCkifSkuc3R5bGUoIm9wYWNpdHkiLDEpO0Yuc2VsZWN0KCJsaW5lIikuYXR0cigieTEiLGIpLmF0dHIoInkyIixiKjcvNiksRi5zZWxlY3QoInRleHQiKS5hdHRyKCJ5IixiKjcvNiksZDMudHJhbnNpdGlvbihCLmV4aXQoKSkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihlKXtyZXR1cm4idHJhbnNsYXRlKCIrQShlKSsiLDApIn0pLnN0eWxlKCJvcGFjaXR5IiwxZS02KS5yZW1vdmUoKSxkLm9uKCJ0b29sdGlwU2hvdyIsZnVuY3Rpb24oZSl7ZS5rZXk9bi50aXRsZSxjJiZ2KGUsdy5wYXJlbnROb2RlKX0pfSksZDMudGltZXIuZmx1c2goKSxtfXZhciB0PWUubW9kZWxzLmJ1bGxldCgpLG49ImxlZnQiLHI9ITEsaT17dG9wOjUscmlnaHQ6NDAsYm90dG9tOjIwLGxlZnQ6MTIwfSxzPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJhbmdlc30sbz1mdW5jdGlvbihlKXtyZXR1cm4gZS5tYXJrZXJzfSx1PWZ1bmN0aW9uKGUpe3JldHVybiBlLm1lYXN1cmVzfSxhPW51bGwsZj01NSxsPW51bGwsYz0hMCxoPWZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJuIjxoMz4iK3QrIjwvaDM+IisiPHA+IituKyI8L3A+In0scD0iTm8gRGF0YSBBdmFpbGFibGUuIixkPWQzLmRpc3BhdGNoKCJ0b29sdGlwU2hvdyIsInRvb2x0aXBIaWRlIiksdj1mdW5jdGlvbih0LG4pe3ZhciByPXQucG9zWzBdKyhuLm9mZnNldExlZnR8fDApK2kubGVmdCxzPXQucG9zWzFdKyhuLm9mZnNldFRvcHx8MCkraS50b3Asbz1oKHQua2V5LHQubGFiZWwsdC52YWx1ZSx0LG0pO2UudG9vbHRpcC5zaG93KFtyLHNdLG8sdC52YWx1ZTwwPyJlIjoidyIsbnVsbCxuKX07cmV0dXJuIHQuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW92ZXIudG9vbHRpcCIsZnVuY3Rpb24oZSl7ZC50b29sdGlwU2hvdyhlKX0pLHQuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW91dC50b29sdGlwIixmdW5jdGlvbihlKXtkLnRvb2x0aXBIaWRlKGUpfSksZC5vbigidG9vbHRpcEhpZGUiLGZ1bmN0aW9uKCl7YyYmZS50b29sdGlwLmNsZWFudXAoKX0pLG0uZGlzcGF0Y2g9ZCxtLmJ1bGxldD10LGQzLnJlYmluZChtLHQsImNvbG9yIiksbS5vcHRpb25zPWUudXRpbHMub3B0aW9uc0Z1bmMuYmluZChtKSxtLm9yaWVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLHI9bj09InJpZ2h0Inx8bj09ImJvdHRvbSIsbSk6bn0sbS5yYW5nZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ZSxtKTpzfSxtLm1hcmtlcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ZSxtKTpvfSxtLm1lYXN1cmVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWUsbSk6dX0sbS53aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1lLG0pOmF9LG0uaGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPWUsbSk6Zn0sbS5tYXJnaW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkudG9wPXR5cGVvZiBlLnRvcCE9InVuZGVmaW5lZCI/ZS50b3A6aS50b3AsaS5yaWdodD10eXBlb2YgZS5yaWdodCE9InVuZGVmaW5lZCI/ZS5yaWdodDppLnJpZ2h0LGkuYm90dG9tPXR5cGVvZiBlLmJvdHRvbSE9InVuZGVmaW5lZCI/ZS5ib3R0b206aS5ib3R0b20saS5sZWZ0PXR5cGVvZiBlLmxlZnQhPSJ1bmRlZmluZWQiP2UubGVmdDppLmxlZnQsbSk6aX0sbS50aWNrRm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPWUsbSk6bH0sbS50b29sdGlwcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1lLG0pOmN9LG0udG9vbHRpcENvbnRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ZSxtKTpofSxtLm5vRGF0YT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1lLG0pOnB9LG19LGUubW9kZWxzLmN1bXVsYXRpdmVMaW5lQ2hhcnQ9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gXyhiKXtyZXR1cm4gYi5lYWNoKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIHEoZSx0KXtkMy5zZWxlY3QoXy5jb250YWluZXIpLnN0eWxlKCJjdXJzb3IiLCJldy1yZXNpemUiKX1mdW5jdGlvbiBSKGUsdCl7Ty54PWQzLmV2ZW50LngsTy5pPU1hdGgucm91bmQoQS5pbnZlcnQoTy54KSkscnQoKX1mdW5jdGlvbiBVKGUsdCl7ZDMuc2VsZWN0KF8uY29udGFpbmVyKS5zdHlsZSgiY3Vyc29yIiwiYXV0byIpLHguaW5kZXg9Ty5pLGsuc3RhdGVDaGFuZ2UoeCl9ZnVuY3Rpb24gcnQoKXtudC5kYXRhKFtPXSk7dmFyIGU9Xy50cmFuc2l0aW9uRHVyYXRpb24oKTtfLnRyYW5zaXRpb25EdXJhdGlvbigwKSxfLnVwZGF0ZSgpLF8udHJhbnNpdGlvbkR1cmF0aW9uKGUpfXZhciBQPWQzLnNlbGVjdCh0aGlzKS5jbGFzc2VkKCJudi1jaGFydC0iK1MsITApLEg9dGhpcyxCPShmfHxwYXJzZUludChQLnN0eWxlKCJ3aWR0aCIpKXx8OTYwKS11LmxlZnQtdS5yaWdodCxqPShsfHxwYXJzZUludChQLnN0eWxlKCJoZWlnaHQiKSl8fDQwMCktdS50b3AtdS5ib3R0b207Xy51cGRhdGU9ZnVuY3Rpb24oKXtQLnRyYW5zaXRpb24oKS5kdXJhdGlvbihMKS5jYWxsKF8pfSxfLmNvbnRhaW5lcj10aGlzLHguZGlzYWJsZWQ9Yi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuISFlLmRpc2FibGVkfSk7aWYoIVQpe3ZhciBGO1Q9e307Zm9yKEYgaW4geCl4W0ZdaW5zdGFuY2VvZiBBcnJheT9UW0ZdPXhbRl0uc2xpY2UoMCk6VFtGXT14W0ZdfXZhciBJPWQzLmJlaGF2aW9yLmRyYWcoKS5vbigiZHJhZ3N0YXJ0IixxKS5vbigiZHJhZyIsUikub24oImRyYWdlbmQiLFUpO2lmKCFifHwhYi5sZW5ndGh8fCFiLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZXMubGVuZ3RofSkubGVuZ3RoKXt2YXIgej1QLnNlbGVjdEFsbCgiLm52LW5vRGF0YSIpLmRhdGEoW05dKTtyZXR1cm4gei5lbnRlcigpLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIiwibnZkMyBudi1ub0RhdGEiKS5hdHRyKCJkeSIsIi0uN2VtIikuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIiksei5hdHRyKCJ4Iix1LmxlZnQrQi8yKS5hdHRyKCJ5Iix1LnRvcCtqLzIpLnRleHQoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KSxffVAuc2VsZWN0QWxsKCIubnYtbm9EYXRhIikucmVtb3ZlKCksdz10LnhTY2FsZSgpLEU9dC55U2NhbGUoKTtpZigheSl7dmFyIFc9Yi5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuZGlzYWJsZWR9KS5tYXAoZnVuY3Rpb24oZSxuKXt2YXIgcj1kMy5leHRlbnQoZS52YWx1ZXMsdC55KCkpO3JldHVybiByWzBdPC0wLjk1JiYoclswXT0tMC45NSksWyhyWzBdLXJbMV0pLygxK3JbMV0pLChyWzFdLXJbMF0pLygxK3JbMF0pXX0pLFg9W2QzLm1pbihXLGZ1bmN0aW9uKGUpe3JldHVybiBlWzBdfSksZDMubWF4KFcsZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV19KV07dC55RG9tYWluKFgpfWVsc2UgdC55RG9tYWluKG51bGwpO0EuZG9tYWluKFswLGJbMF0udmFsdWVzLmxlbmd0aC0xXSkucmFuZ2UoWzAsQl0pLmNsYW1wKCEwKTt2YXIgYj1EKE8uaSxiKSxWPWc/Im5vbmUiOiJhbGwiLCQ9UC5zZWxlY3RBbGwoImcubnYtd3JhcC5udi1jdW11bGF0aXZlTGluZSIpLmRhdGEoW2JdKSxKPSQuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52ZDMgbnYtd3JhcCBudi1jdW11bGF0aXZlTGluZSIpLmFwcGVuZCgiZyIpLEs9JC5zZWxlY3QoImciKTtKLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtaW50ZXJhY3RpdmUiKSxKLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYteCBudi1heGlzIikuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLEouYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi15IG52LWF4aXMiKSxKLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtYmFja2dyb3VuZCIpLEouYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1saW5lc1dyYXAiKS5zdHlsZSgicG9pbnRlci1ldmVudHMiLFYpLEouYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1hdmdMaW5lc1dyYXAiKS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJub25lIiksSi5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LWxlZ2VuZFdyYXAiKSxKLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtY29udHJvbHNXcmFwIiksYyYmKGkud2lkdGgoQiksSy5zZWxlY3QoIi5udi1sZWdlbmRXcmFwIikuZGF0dW0oYikuY2FsbChpKSx1LnRvcCE9aS5oZWlnaHQoKSYmKHUudG9wPWkuaGVpZ2h0KCksaj0obHx8cGFyc2VJbnQoUC5zdHlsZSgiaGVpZ2h0IikpfHw0MDApLXUudG9wLXUuYm90dG9tKSxLLnNlbGVjdCgiLm52LWxlZ2VuZFdyYXAiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwiKyAtdS50b3ArIikiKSk7aWYobSl7dmFyIFE9W3trZXk6IlJlLXNjYWxlIHktYXhpcyIsZGlzYWJsZWQ6IXl9XTtzLndpZHRoKDE0MCkuY29sb3IoWyIjNDQ0IiwiIzQ0NCIsIiM0NDQiXSksSy5zZWxlY3QoIi5udi1jb250cm9sc1dyYXAiKS5kYXR1bShRKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwiKyAtdS50b3ArIikiKS5jYWxsKHMpfSQuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrdS5sZWZ0KyIsIit1LnRvcCsiKSIpLGQmJksuc2VsZWN0KCIubnYteS5udi1heGlzIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrQisiLDApIik7dmFyIEc9Yi5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUudGVtcERpc2FibGVkfSk7JC5zZWxlY3QoIi50ZW1wRGlzYWJsZWQiKS5yZW1vdmUoKSxHLmxlbmd0aCYmJC5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsInRlbXBEaXNhYmxlZCIpLmF0dHIoIngiLEIvMikuYXR0cigieSIsIi0uNzFlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsImVuZCIpLnRleHQoRy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUua2V5fSkuam9pbigiLCAiKSsiIHZhbHVlcyBjYW5ub3QgYmUgY2FsY3VsYXRlZCBmb3IgdGhpcyB0aW1lIHBlcmlvZC4iKSxnJiYoby53aWR0aChCKS5oZWlnaHQoaikubWFyZ2luKHtsZWZ0OnUubGVmdCx0b3A6dS50b3B9KS5zdmdDb250YWluZXIoUCkueFNjYWxlKHcpLCQuc2VsZWN0KCIubnYtaW50ZXJhY3RpdmUiKS5jYWxsKG8pKSxKLnNlbGVjdCgiLm52LWJhY2tncm91bmQiKS5hcHBlbmQoInJlY3QiKSxLLnNlbGVjdCgiLm52LWJhY2tncm91bmQgcmVjdCIpLmF0dHIoIndpZHRoIixCKS5hdHRyKCJoZWlnaHQiLGopLHQueShmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNwbGF5Lnl9KS53aWR0aChCKS5oZWlnaHQoaikuY29sb3IoYi5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb2xvcnx8YShlLHQpfSkuZmlsdGVyKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIWJbdF0uZGlzYWJsZWQmJiFiW3RdLnRlbXBEaXNhYmxlZH0pKTt2YXIgWT1LLnNlbGVjdCgiLm52LWxpbmVzV3JhcCIpLmRhdHVtKGIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmRpc2FibGVkJiYhZS50ZW1wRGlzYWJsZWR9KSk7WS5jYWxsKHQpLGIuZm9yRWFjaChmdW5jdGlvbihlLHQpe2Uuc2VyaWVzSW5kZXg9dH0pO3ZhciBaPWIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmRpc2FibGVkJiYhIUMoZSl9KSxldD1LLnNlbGVjdCgiLm52LWF2Z0xpbmVzV3JhcCIpLnNlbGVjdEFsbCgibGluZSIpLmRhdGEoWixmdW5jdGlvbihlKXtyZXR1cm4gZS5rZXl9KSx0dD1mdW5jdGlvbihlKXt2YXIgdD1FKEMoZSkpO3JldHVybiB0PDA/MDp0Pmo/ajp0fTtldC5lbnRlcigpLmFwcGVuZCgibGluZSIpLnN0eWxlKCJzdHJva2Utd2lkdGgiLDIpLnN0eWxlKCJzdHJva2UtZGFzaGFycmF5IiwiMTAsMTAiKS5zdHlsZSgic3Ryb2tlIixmdW5jdGlvbihlLG4pe3JldHVybiB0LmNvbG9yKCkoZSxlLnNlcmllc0luZGV4KX0pLmF0dHIoIngxIiwwKS5hdHRyKCJ4MiIsQikuYXR0cigieTEiLHR0KS5hdHRyKCJ5MiIsdHQpLGV0LnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsZnVuY3Rpb24oZSl7dmFyIHQ9RShDKGUpKTtyZXR1cm4gdDwwfHx0Pmo/MDoxfSkuYXR0cigieDEiLDApLmF0dHIoIngyIixCKS5hdHRyKCJ5MSIsdHQpLmF0dHIoInkyIix0dCksZXQuZXhpdCgpLnJlbW92ZSgpO3ZhciBudD1ZLnNlbGVjdEFsbCgiLm52LWluZGV4TGluZSIpLmRhdGEoW09dKTtudC5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwibnYtaW5kZXhMaW5lIikuYXR0cigid2lkdGgiLDMpLmF0dHIoIngiLC0yKS5hdHRyKCJmaWxsIiwicmVkIikuYXR0cigiZmlsbC1vcGFjaXR5IiwuNSkuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuY2FsbChJKSxudC5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUpe3JldHVybiJ0cmFuc2xhdGUoIitBKGUuaSkrIiwwKSJ9KS5hdHRyKCJoZWlnaHQiLGopLGgmJihuLnNjYWxlKHcpLnRpY2tzKE1hdGgubWluKGJbMF0udmFsdWVzLmxlbmd0aCxCLzcwKSkudGlja1NpemUoLWosMCksSy5zZWxlY3QoIi5udi14Lm52LWF4aXMiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwiK0UucmFuZ2UoKVswXSsiKSIpLGQzLnRyYW5zaXRpb24oSy5zZWxlY3QoIi5udi14Lm52LWF4aXMiKSkuY2FsbChuKSkscCYmKHIuc2NhbGUoRSkudGlja3Moai8zNikudGlja1NpemUoLUIsMCksZDMudHJhbnNpdGlvbihLLnNlbGVjdCgiLm52LXkubnYtYXhpcyIpKS5jYWxsKHIpKSxLLnNlbGVjdCgiLm52LWJhY2tncm91bmQgcmVjdCIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXtPLng9ZDMubW91c2UodGhpcylbMF0sTy5pPU1hdGgucm91bmQoQS5pbnZlcnQoTy54KSkseC5pbmRleD1PLmksay5zdGF0ZUNoYW5nZSh4KSxydCgpfSksdC5kaXNwYXRjaC5vbigiZWxlbWVudENsaWNrIixmdW5jdGlvbihlKXtPLmk9ZS5wb2ludEluZGV4LE8ueD1BKE8uaSkseC5pbmRleD1PLmksay5zdGF0ZUNoYW5nZSh4KSxydCgpfSkscy5kaXNwYXRjaC5vbigibGVnZW5kQ2xpY2siLGZ1bmN0aW9uKGUsdCl7ZS5kaXNhYmxlZD0hZS5kaXNhYmxlZCx5PSFlLmRpc2FibGVkLHgucmVzY2FsZVk9eSxrLnN0YXRlQ2hhbmdlKHgpLF8udXBkYXRlKCl9KSxpLmRpc3BhdGNoLm9uKCJzdGF0ZUNoYW5nZSIsZnVuY3Rpb24oZSl7eC5kaXNhYmxlZD1lLmRpc2FibGVkLGsuc3RhdGVDaGFuZ2UoeCksXy51cGRhdGUoKX0pLG8uZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW1vdmUiLGZ1bmN0aW9uKGkpe3QuY2xlYXJIaWdobGlnaHRzKCk7dmFyIHMsZixsLGM9W107Yi5maWx0ZXIoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zZXJpZXNJbmRleD10LCFlLmRpc2FibGVkfSkuZm9yRWFjaChmdW5jdGlvbihuLHIpe2Y9ZS5pbnRlcmFjdGl2ZUJpc2VjdChuLnZhbHVlcyxpLnBvaW50WFZhbHVlLF8ueCgpKSx0LmhpZ2hsaWdodFBvaW50KHIsZiwhMCk7dmFyIG89bi52YWx1ZXNbZl07aWYodHlwZW9mIG89PSJ1bmRlZmluZWQiKXJldHVybjt0eXBlb2Ygcz09InVuZGVmaW5lZCImJihzPW8pLHR5cGVvZiBsPT0idW5kZWZpbmVkIiYmKGw9Xy54U2NhbGUoKShfLngoKShvLGYpKSksYy5wdXNoKHtrZXk6bi5rZXksdmFsdWU6Xy55KCkobyxmKSxjb2xvcjphKG4sbi5zZXJpZXNJbmRleCl9KX0pO3ZhciBoPW4udGlja0Zvcm1hdCgpKF8ueCgpKHMsZikpO28udG9vbHRpcC5wb3NpdGlvbih7bGVmdDpsK3UubGVmdCx0b3A6aS5tb3VzZVkrdS50b3B9KS5jaGFydENvbnRhaW5lcihILnBhcmVudE5vZGUpLmVuYWJsZWQodikudmFsdWVGb3JtYXR0ZXIoZnVuY3Rpb24oZSx0KXtyZXR1cm4gci50aWNrRm9ybWF0KCkoZSl9KS5kYXRhKHt2YWx1ZTpoLHNlcmllczpjfSkoKSxvLnJlbmRlckd1aWRlTGluZShsKX0pLG8uZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW91dCIsZnVuY3Rpb24oZSl7ay50b29sdGlwSGlkZSgpLHQuY2xlYXJIaWdobGlnaHRzKCl9KSxrLm9uKCJ0b29sdGlwU2hvdyIsZnVuY3Rpb24oZSl7diYmTShlLEgucGFyZW50Tm9kZSl9KSxrLm9uKCJjaGFuZ2VTdGF0ZSIsZnVuY3Rpb24oZSl7dHlwZW9mIGUuZGlzYWJsZWQhPSJ1bmRlZmluZWQiJiYoYi5mb3JFYWNoKGZ1bmN0aW9uKHQsbil7dC5kaXNhYmxlZD1lLmRpc2FibGVkW25dfSkseC5kaXNhYmxlZD1lLmRpc2FibGVkKSx0eXBlb2YgZS5pbmRleCE9InVuZGVmaW5lZCImJihPLmk9ZS5pbmRleCxPLng9QShPLmkpLHguaW5kZXg9ZS5pbmRleCxudC5kYXRhKFtPXSkpLHR5cGVvZiBlLnJlc2NhbGVZIT0idW5kZWZpbmVkIiYmKHk9ZS5yZXNjYWxlWSksXy51cGRhdGUoKX0pfSksX31mdW5jdGlvbiBEKGUsbil7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKG4scil7aWYoIW4udmFsdWVzKXJldHVybiBuO3ZhciBpPXQueSgpKG4udmFsdWVzW2VdLGUpO3JldHVybiBpPC0wLjk1PyhuLnRlbXBEaXNhYmxlZD0hMCxuKToobi50ZW1wRGlzYWJsZWQ9ITEsbi52YWx1ZXM9bi52YWx1ZXMubWFwKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGUuZGlzcGxheT17eToodC55KCkoZSxuKS1pKS8oMStpKX0sZX0pLG4pfSl9dmFyIHQ9ZS5tb2RlbHMubGluZSgpLG49ZS5tb2RlbHMuYXhpcygpLHI9ZS5tb2RlbHMuYXhpcygpLGk9ZS5tb2RlbHMubGVnZW5kKCkscz1lLm1vZGVscy5sZWdlbmQoKSxvPWUuaW50ZXJhY3RpdmVHdWlkZWxpbmUoKSx1PXt0b3A6MzAscmlnaHQ6MzAsYm90dG9tOjUwLGxlZnQ6NjB9LGE9ZS51dGlscy5kZWZhdWx0Q29sb3IoKSxmPW51bGwsbD1udWxsLGM9ITAsaD0hMCxwPSEwLGQ9ITEsdj0hMCxtPSEwLGc9ITEseT0hMCxiPWZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJuIjxoMz4iK2UrIjwvaDM+IisiPHA+IituKyIgYXQgIit0KyI8L3A+In0sdyxFLFM9dC5pZCgpLHg9e2luZGV4OjAscmVzY2FsZVk6eX0sVD1udWxsLE49Ik5vIERhdGEgQXZhaWxhYmxlLiIsQz1mdW5jdGlvbihlKXtyZXR1cm4gZS5hdmVyYWdlfSxrPWQzLmRpc3BhdGNoKCJ0b29sdGlwU2hvdyIsInRvb2x0aXBIaWRlIiwic3RhdGVDaGFuZ2UiLCJjaGFuZ2VTdGF0ZSIpLEw9MjUwO24ub3JpZW50KCJib3R0b20iKS50aWNrUGFkZGluZyg3KSxyLm9yaWVudChkPyJyaWdodCI6ImxlZnQiKSxzLnVwZGF0ZVN0YXRlKCExKTt2YXIgQT1kMy5zY2FsZS5saW5lYXIoKSxPPXtpOjAseDowfSxNPWZ1bmN0aW9uKGkscyl7dmFyIG89aS5wb3NbMF0rKHMub2Zmc2V0TGVmdHx8MCksdT1pLnBvc1sxXSsocy5vZmZzZXRUb3B8fDApLGE9bi50aWNrRm9ybWF0KCkodC54KCkoaS5wb2ludCxpLnBvaW50SW5kZXgpKSxmPXIudGlja0Zvcm1hdCgpKHQueSgpKGkucG9pbnQsaS5wb2ludEluZGV4KSksbD1iKGkuc2VyaWVzLmtleSxhLGYsaSxfKTtlLnRvb2x0aXAuc2hvdyhbbyx1XSxsLG51bGwsbnVsbCxzKX07cmV0dXJuIHQuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW92ZXIudG9vbHRpcCIsZnVuY3Rpb24oZSl7ZS5wb3M9W2UucG9zWzBdK3UubGVmdCxlLnBvc1sxXSt1LnRvcF0say50b29sdGlwU2hvdyhlKX0pLHQuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW91dC50b29sdGlwIixmdW5jdGlvbihlKXtrLnRvb2x0aXBIaWRlKGUpfSksay5vbigidG9vbHRpcEhpZGUiLGZ1bmN0aW9uKCl7diYmZS50b29sdGlwLmNsZWFudXAoKX0pLF8uZGlzcGF0Y2g9ayxfLmxpbmVzPXQsXy5sZWdlbmQ9aSxfLnhBeGlzPW4sXy55QXhpcz1yLF8uaW50ZXJhY3RpdmVMYXllcj1vLGQzLnJlYmluZChfLHQsImRlZmluZWQiLCJpc0FyZWEiLCJ4IiwieSIsInhTY2FsZSIsInlTY2FsZSIsInNpemUiLCJ4RG9tYWluIiwieURvbWFpbiIsInhSYW5nZSIsInlSYW5nZSIsImZvcmNlWCIKLCJmb3JjZVkiLCJpbnRlcmFjdGl2ZSIsImNsaXBFZGdlIiwiY2xpcFZvcm9ub2kiLCJ1c2VWb3Jvbm9pIiwiaWQiKSxfLm9wdGlvbnM9ZS51dGlscy5vcHRpb25zRnVuYy5iaW5kKF8pLF8ubWFyZ2luPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1LnRvcD10eXBlb2YgZS50b3AhPSJ1bmRlZmluZWQiP2UudG9wOnUudG9wLHUucmlnaHQ9dHlwZW9mIGUucmlnaHQhPSJ1bmRlZmluZWQiP2UucmlnaHQ6dS5yaWdodCx1LmJvdHRvbT10eXBlb2YgZS5ib3R0b20hPSJ1bmRlZmluZWQiP2UuYm90dG9tOnUuYm90dG9tLHUubGVmdD10eXBlb2YgZS5sZWZ0IT0idW5kZWZpbmVkIj9lLmxlZnQ6dS5sZWZ0LF8pOnV9LF8ud2lkdGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ZSxfKTpmfSxfLmhlaWdodD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1lLF8pOmx9LF8uY29sb3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ZS51dGlscy5nZXRDb2xvcih0KSxpLmNvbG9yKGEpLF8pOmF9LF8ucmVzY2FsZVk9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9ZSx5KTp5fSxfLnNob3dDb250cm9scz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1lLF8pOm19LF8udXNlSW50ZXJhY3RpdmVHdWlkZWxpbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ZSxlPT09ITAmJihfLmludGVyYWN0aXZlKCExKSxfLnVzZVZvcm9ub2koITEpKSxfKTpnfSxfLnNob3dMZWdlbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ZSxfKTpjfSxfLnNob3dYQXhpcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1lLF8pOmh9LF8uc2hvd1lBeGlzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPWUsXyk6cH0sXy5yaWdodEFsaWduWUF4aXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9ZSxyLm9yaWVudChlPyJyaWdodCI6ImxlZnQiKSxfKTpkfSxfLnRvb2x0aXBzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PWUsXyk6dn0sXy50b29sdGlwQ29udGVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj1lLF8pOmJ9LF8uc3RhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9ZSxfKTp4fSxfLmRlZmF1bHRTdGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oVD1lLF8pOlR9LF8ubm9EYXRhPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhOPWUsXyk6Tn0sXy5hdmVyYWdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhDPWUsXyk6Q30sXy50cmFuc2l0aW9uRHVyYXRpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEw9ZSxfKTpMfSxffSxlLm1vZGVscy5kaXNjcmV0ZUJhcj1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBFKGUpe3JldHVybiBlLmVhY2goZnVuY3Rpb24oZSl7dmFyIGk9bi10LmxlZnQtdC5yaWdodCxFPXItdC50b3AtdC5ib3R0b20sUz1kMy5zZWxlY3QodGhpcyk7ZT1lLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiBlLnZhbHVlcz1lLnZhbHVlcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2VyaWVzPXQsZX0pLGV9KTt2YXIgVD1wJiZkP1tdOmUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlcy5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm57eDp1KGUsdCkseTphKGUsdCkseTA6ZS55MH19KX0pO3MuZG9tYWluKHB8fGQzLm1lcmdlKFQpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS54fSkpLnJhbmdlQmFuZHModnx8WzAsaV0sLjEpLG8uZG9tYWluKGR8fGQzLmV4dGVudChkMy5tZXJnZShUKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUueX0pLmNvbmNhdChmKSkpLGM/by5yYW5nZShtfHxbRS0oby5kb21haW4oKVswXTwwPzEyOjApLG8uZG9tYWluKClbMV0+MD8xMjowXSk6by5yYW5nZShtfHxbRSwwXSksYj1ifHxzLHc9d3x8by5jb3B5KCkucmFuZ2UoW28oMCksbygwKV0pO3ZhciBOPVMuc2VsZWN0QWxsKCJnLm52LXdyYXAubnYtZGlzY3JldGViYXIiKS5kYXRhKFtlXSksQz1OLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudmQzIG52LXdyYXAgbnYtZGlzY3JldGViYXIiKSxrPUMuYXBwZW5kKCJnIiksTD1OLnNlbGVjdCgiZyIpO2suYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1ncm91cHMiKSxOLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3QubGVmdCsiLCIrdC50b3ArIikiKTt2YXIgQT1OLnNlbGVjdCgiLm52LWdyb3VwcyIpLnNlbGVjdEFsbCgiLm52LWdyb3VwIikuZGF0YShmdW5jdGlvbihlKXtyZXR1cm4gZX0sZnVuY3Rpb24oZSl7cmV0dXJuIGUua2V5fSk7QS5lbnRlcigpLmFwcGVuZCgiZyIpLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsMWUtNikuc3R5bGUoImZpbGwtb3BhY2l0eSIsMWUtNiksQS5leGl0KCkudHJhbnNpdGlvbigpLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsMWUtNikuc3R5bGUoImZpbGwtb3BhY2l0eSIsMWUtNikucmVtb3ZlKCksQS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24oZSx0KXtyZXR1cm4ibnYtZ3JvdXAgbnYtc2VyaWVzLSIrdH0pLmNsYXNzZWQoImhvdmVyIixmdW5jdGlvbihlKXtyZXR1cm4gZS5ob3Zlcn0pLEEudHJhbnNpdGlvbigpLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsMSkuc3R5bGUoImZpbGwtb3BhY2l0eSIsLjc1KTt2YXIgTz1BLnNlbGVjdEFsbCgiZy5udi1iYXIiKS5kYXRhKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlc30pO08uZXhpdCgpLnJlbW92ZSgpO3ZhciBNPU8uZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4idHJhbnNsYXRlKCIrKHModShlLHQpKStzLnJhbmdlQmFuZCgpKi4wNSkrIiwgIitvKDApKyIpIn0pLm9uKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKHQsbil7ZDMuc2VsZWN0KHRoaXMpLmNsYXNzZWQoImhvdmVyIiwhMCksZy5lbGVtZW50TW91c2VvdmVyKHt2YWx1ZTphKHQsbikscG9pbnQ6dCxzZXJpZXM6ZVt0LnNlcmllc10scG9zOltzKHUodCxuKSkrcy5yYW5nZUJhbmQoKSoodC5zZXJpZXMrLjUpL2UubGVuZ3RoLG8oYSh0LG4pKV0scG9pbnRJbmRleDpuLHNlcmllc0luZGV4OnQuc2VyaWVzLGU6ZDMuZXZlbnR9KX0pLm9uKCJtb3VzZW91dCIsZnVuY3Rpb24odCxuKXtkMy5zZWxlY3QodGhpcykuY2xhc3NlZCgiaG92ZXIiLCExKSxnLmVsZW1lbnRNb3VzZW91dCh7dmFsdWU6YSh0LG4pLHBvaW50OnQsc2VyaWVzOmVbdC5zZXJpZXNdLHBvaW50SW5kZXg6bixzZXJpZXNJbmRleDp0LnNlcmllcyxlOmQzLmV2ZW50fSl9KS5vbigiY2xpY2siLGZ1bmN0aW9uKHQsbil7Zy5lbGVtZW50Q2xpY2soe3ZhbHVlOmEodCxuKSxwb2ludDp0LHNlcmllczplW3Quc2VyaWVzXSxwb3M6W3ModSh0LG4pKStzLnJhbmdlQmFuZCgpKih0LnNlcmllcysuNSkvZS5sZW5ndGgsbyhhKHQsbikpXSxwb2ludEluZGV4Om4sc2VyaWVzSW5kZXg6dC5zZXJpZXMsZTpkMy5ldmVudH0pLGQzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpfSkub24oImRibGNsaWNrIixmdW5jdGlvbih0LG4pe2cuZWxlbWVudERibENsaWNrKHt2YWx1ZTphKHQsbikscG9pbnQ6dCxzZXJpZXM6ZVt0LnNlcmllc10scG9zOltzKHUodCxuKSkrcy5yYW5nZUJhbmQoKSoodC5zZXJpZXMrLjUpL2UubGVuZ3RoLG8oYSh0LG4pKV0scG9pbnRJbmRleDpuLHNlcmllc0luZGV4OnQuc2VyaWVzLGU6ZDMuZXZlbnR9KSxkMy5ldmVudC5zdG9wUHJvcGFnYXRpb24oKX0pO00uYXBwZW5kKCJyZWN0IikuYXR0cigiaGVpZ2h0IiwwKS5hdHRyKCJ3aWR0aCIscy5yYW5nZUJhbmQoKSouOS9lLmxlbmd0aCksYz8oTS5hcHBlbmQoInRleHQiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLE8uc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbihlLHQpe3JldHVybiBoKGEoZSx0KSl9KS50cmFuc2l0aW9uKCkuYXR0cigieCIscy5yYW5nZUJhbmQoKSouOS8yKS5hdHRyKCJ5IixmdW5jdGlvbihlLHQpe3JldHVybiBhKGUsdCk8MD9vKGEoZSx0KSktbygwKSsxMjotNH0pKTpPLnNlbGVjdEFsbCgidGV4dCIpLnJlbW92ZSgpLE8uYXR0cigiY2xhc3MiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGEoZSx0KTwwPyJudi1iYXIgbmVnYXRpdmUiOiJudi1iYXIgcG9zaXRpdmUifSkuc3R5bGUoImZpbGwiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29sb3J8fGwoZSx0KX0pLnN0eWxlKCJzdHJva2UiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29sb3J8fGwoZSx0KX0pLnNlbGVjdCgicmVjdCIpLmF0dHIoImNsYXNzIix5KS50cmFuc2l0aW9uKCkuYXR0cigid2lkdGgiLHMucmFuZ2VCYW5kKCkqLjkvZS5sZW5ndGgpLE8udHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oZSx0KXt2YXIgbj1zKHUoZSx0KSkrcy5yYW5nZUJhbmQoKSouMDUscj1hKGUsdCk8MD9vKDApOm8oMCktbyhhKGUsdCkpPDE/bygwKS0xOm8oYShlLHQpKTtyZXR1cm4idHJhbnNsYXRlKCIrbisiLCAiK3IrIikifSkuc2VsZWN0KCJyZWN0IikuYXR0cigiaGVpZ2h0IixmdW5jdGlvbihlLHQpe3JldHVybiBNYXRoLm1heChNYXRoLmFicyhvKGEoZSx0KSktbyhkJiZkWzBdfHwwKSl8fDEpfSksYj1zLmNvcHkoKSx3PW8uY29weSgpfSksRX12YXIgdD17dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9LG49OTYwLHI9NTAwLGk9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjFlNCkscz1kMy5zY2FsZS5vcmRpbmFsKCksbz1kMy5zY2FsZS5saW5lYXIoKSx1PWZ1bmN0aW9uKGUpe3JldHVybiBlLnh9LGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGUueX0sZj1bMF0sbD1lLnV0aWxzLmRlZmF1bHRDb2xvcigpLGM9ITEsaD1kMy5mb3JtYXQoIiwuMmYiKSxwLGQsdixtLGc9ZDMuZGlzcGF0Y2goImNoYXJ0Q2xpY2siLCJlbGVtZW50Q2xpY2siLCJlbGVtZW50RGJsQ2xpY2siLCJlbGVtZW50TW91c2VvdmVyIiwiZWxlbWVudE1vdXNlb3V0IikseT0iZGlzY3JldGVCYXIiLGIsdztyZXR1cm4gRS5kaXNwYXRjaD1nLEUub3B0aW9ucz1lLnV0aWxzLm9wdGlvbnNGdW5jLmJpbmQoRSksRS54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWUsRSk6dX0sRS55PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWUsRSk6YX0sRS5tYXJnaW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQudG9wPXR5cGVvZiBlLnRvcCE9InVuZGVmaW5lZCI/ZS50b3A6dC50b3AsdC5yaWdodD10eXBlb2YgZS5yaWdodCE9InVuZGVmaW5lZCI/ZS5yaWdodDp0LnJpZ2h0LHQuYm90dG9tPXR5cGVvZiBlLmJvdHRvbSE9InVuZGVmaW5lZCI/ZS5ib3R0b206dC5ib3R0b20sdC5sZWZ0PXR5cGVvZiBlLmxlZnQhPSJ1bmRlZmluZWQiP2UubGVmdDp0LmxlZnQsRSk6dH0sRS53aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLEUpOm59LEUuaGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWUsRSk6cn0sRS54U2NhbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ZSxFKTpzfSxFLnlTY2FsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1lLEUpOm99LEUueERvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1lLEUpOnB9LEUueURvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1lLEUpOmR9LEUueFJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PWUsRSk6dn0sRS55UmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09ZSxFKTptfSxFLmZvcmNlWT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1lLEUpOmZ9LEUuY29sb3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ZS51dGlscy5nZXRDb2xvcih0KSxFKTpsfSxFLmlkPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUsRSk6aX0sRS5zaG93VmFsdWVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPWUsRSk6Y30sRS52YWx1ZUZvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1lLEUpOmh9LEUucmVjdENsYXNzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PWUsRSk6eX0sRX0sZS5tb2RlbHMuZGlzY3JldGVCYXJDaGFydD1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB3KGUpe3JldHVybiBlLmVhY2goZnVuY3Rpb24oZSl7dmFyIHU9ZDMuc2VsZWN0KHRoaXMpLHA9dGhpcyxFPShzfHxwYXJzZUludCh1LnN0eWxlKCJ3aWR0aCIpKXx8OTYwKS1pLmxlZnQtaS5yaWdodCxTPShvfHxwYXJzZUludCh1LnN0eWxlKCJoZWlnaHQiKSl8fDQwMCktaS50b3AtaS5ib3R0b207dy51cGRhdGU9ZnVuY3Rpb24oKXtnLmJlZm9yZVVwZGF0ZSgpLHUudHJhbnNpdGlvbigpLmR1cmF0aW9uKHkpLmNhbGwodyl9LHcuY29udGFpbmVyPXRoaXM7aWYoIWV8fCFlLmxlbmd0aHx8IWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlcy5sZW5ndGh9KS5sZW5ndGgpe3ZhciBUPXUuc2VsZWN0QWxsKCIubnYtbm9EYXRhIikuZGF0YShbbV0pO3JldHVybiBULmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLCJudmQzIG52LW5vRGF0YSIpLmF0dHIoImR5IiwiLS43ZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKSxULmF0dHIoIngiLGkubGVmdCtFLzIpLmF0dHIoInkiLGkudG9wK1MvMikudGV4dChmdW5jdGlvbihlKXtyZXR1cm4gZX0pLHd9dS5zZWxlY3RBbGwoIi5udi1ub0RhdGEiKS5yZW1vdmUoKSxkPXQueFNjYWxlKCksdj10LnlTY2FsZSgpLmNsYW1wKCEwKTt2YXIgTj11LnNlbGVjdEFsbCgiZy5udi13cmFwLm52LWRpc2NyZXRlQmFyV2l0aEF4ZXMiKS5kYXRhKFtlXSksQz1OLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudmQzIG52LXdyYXAgbnYtZGlzY3JldGVCYXJXaXRoQXhlcyIpLmFwcGVuZCgiZyIpLGs9Qy5hcHBlbmQoImRlZnMiKSxMPU4uc2VsZWN0KCJnIik7Qy5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXggbnYtYXhpcyIpLEMuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi15IG52LWF4aXMiKSxDLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtYmFyc1dyYXAiKSxMLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2kubGVmdCsiLCIraS50b3ArIikiKSxsJiZMLnNlbGVjdCgiLm52LXkubnYtYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0UrIiwwKSIpLHQud2lkdGgoRSkuaGVpZ2h0KFMpO3ZhciBBPUwuc2VsZWN0KCIubnYtYmFyc1dyYXAiKS5kYXR1bShlLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5kaXNhYmxlZH0pKTtBLnRyYW5zaXRpb24oKS5jYWxsKHQpLGsuYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIiwibnYteC1sYWJlbC1jbGlwLSIrdC5pZCgpKS5hcHBlbmQoInJlY3QiKSxMLnNlbGVjdCgiI252LXgtbGFiZWwtY2xpcC0iK3QuaWQoKSsiIHJlY3QiKS5hdHRyKCJ3aWR0aCIsZC5yYW5nZUJhbmQoKSooYz8yOjEpKS5hdHRyKCJoZWlnaHQiLDE2KS5hdHRyKCJ4IiwtZC5yYW5nZUJhbmQoKS8oYz8xOjIpKTtpZihhKXtuLnNjYWxlKGQpLnRpY2tzKEUvMTAwKS50aWNrU2l6ZSgtUywwKSxMLnNlbGVjdCgiLm52LXgubnYtYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIrKHYucmFuZ2UoKVswXSsodC5zaG93VmFsdWVzKCkmJnYuZG9tYWluKClbMF08MD8xNjowKSkrIikiKSxMLnNlbGVjdCgiLm52LXgubnYtYXhpcyIpLnRyYW5zaXRpb24oKS5jYWxsKG4pO3ZhciBPPUwuc2VsZWN0KCIubnYteC5udi1heGlzIikuc2VsZWN0QWxsKCJnIik7YyYmTy5zZWxlY3RBbGwoInRleHQiKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4idHJhbnNsYXRlKDAsIisobiUyPT0wPyI1IjoiMTciKSsiKSJ9KX1mJiYoci5zY2FsZSh2KS50aWNrcyhTLzM2KS50aWNrU2l6ZSgtRSwwKSxMLnNlbGVjdCgiLm52LXkubnYtYXhpcyIpLnRyYW5zaXRpb24oKS5jYWxsKHIpKSxnLm9uKCJ0b29sdGlwU2hvdyIsZnVuY3Rpb24oZSl7aCYmYihlLHAucGFyZW50Tm9kZSl9KX0pLHd9dmFyIHQ9ZS5tb2RlbHMuZGlzY3JldGVCYXIoKSxuPWUubW9kZWxzLmF4aXMoKSxyPWUubW9kZWxzLmF4aXMoKSxpPXt0b3A6MTUscmlnaHQ6MTAsYm90dG9tOjUwLGxlZnQ6NjB9LHM9bnVsbCxvPW51bGwsdT1lLnV0aWxzLmdldENvbG9yKCksYT0hMCxmPSEwLGw9ITEsYz0hMSxoPSEwLHA9ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm4iPGgzPiIrdCsiPC9oMz4iKyI8cD4iK24rIjwvcD4ifSxkLHYsbT0iTm8gRGF0YSBBdmFpbGFibGUuIixnPWQzLmRpc3BhdGNoKCJ0b29sdGlwU2hvdyIsInRvb2x0aXBIaWRlIiwiYmVmb3JlVXBkYXRlIikseT0yNTA7bi5vcmllbnQoImJvdHRvbSIpLmhpZ2hsaWdodFplcm8oITEpLnNob3dNYXhNaW4oITEpLnRpY2tGb3JtYXQoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KSxyLm9yaWVudChsPyJyaWdodCI6ImxlZnQiKS50aWNrRm9ybWF0KGQzLmZvcm1hdCgiLC4xZiIpKTt2YXIgYj1mdW5jdGlvbihpLHMpe3ZhciBvPWkucG9zWzBdKyhzLm9mZnNldExlZnR8fDApLHU9aS5wb3NbMV0rKHMub2Zmc2V0VG9wfHwwKSxhPW4udGlja0Zvcm1hdCgpKHQueCgpKGkucG9pbnQsaS5wb2ludEluZGV4KSksZj1yLnRpY2tGb3JtYXQoKSh0LnkoKShpLnBvaW50LGkucG9pbnRJbmRleCkpLGw9cChpLnNlcmllcy5rZXksYSxmLGksdyk7ZS50b29sdGlwLnNob3coW28sdV0sbCxpLnZhbHVlPDA/Im4iOiJzIixudWxsLHMpfTtyZXR1cm4gdC5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlb3Zlci50b29sdGlwIixmdW5jdGlvbihlKXtlLnBvcz1bZS5wb3NbMF0raS5sZWZ0LGUucG9zWzFdK2kudG9wXSxnLnRvb2x0aXBTaG93KGUpfSksdC5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlb3V0LnRvb2x0aXAiLGZ1bmN0aW9uKGUpe2cudG9vbHRpcEhpZGUoZSl9KSxnLm9uKCJ0b29sdGlwSGlkZSIsZnVuY3Rpb24oKXtoJiZlLnRvb2x0aXAuY2xlYW51cCgpfSksdy5kaXNwYXRjaD1nLHcuZGlzY3JldGViYXI9dCx3LnhBeGlzPW4sdy55QXhpcz1yLGQzLnJlYmluZCh3LHQsIngiLCJ5IiwieERvbWFpbiIsInlEb21haW4iLCJ4UmFuZ2UiLCJ5UmFuZ2UiLCJmb3JjZVgiLCJmb3JjZVkiLCJpZCIsInNob3dWYWx1ZXMiLCJ2YWx1ZUZvcm1hdCIpLHcub3B0aW9ucz1lLnV0aWxzLm9wdGlvbnNGdW5jLmJpbmQodyksdy5tYXJnaW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkudG9wPXR5cGVvZiBlLnRvcCE9InVuZGVmaW5lZCI/ZS50b3A6aS50b3AsaS5yaWdodD10eXBlb2YgZS5yaWdodCE9InVuZGVmaW5lZCI/ZS5yaWdodDppLnJpZ2h0LGkuYm90dG9tPXR5cGVvZiBlLmJvdHRvbSE9InVuZGVmaW5lZCI/ZS5ib3R0b206aS5ib3R0b20saS5sZWZ0PXR5cGVvZiBlLmxlZnQhPSJ1bmRlZmluZWQiP2UubGVmdDppLmxlZnQsdyk6aX0sdy53aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1lLHcpOnN9LHcuaGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWUsdyk6b30sdy5jb2xvcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1lLnV0aWxzLmdldENvbG9yKG4pLHQuY29sb3IodSksdyk6dX0sdy5zaG93WEF4aXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ZSx3KTphfSx3LnNob3dZQXhpcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1lLHcpOmZ9LHcucmlnaHRBbGlnbllBeGlzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPWUsci5vcmllbnQoZT8icmlnaHQiOiJsZWZ0Iiksdyk6bH0sdy5zdGFnZ2VyTGFiZWxzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPWUsdyk6Y30sdy50b29sdGlwcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1lLHcpOmh9LHcudG9vbHRpcENvbnRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9ZSx3KTpwfSx3Lm5vRGF0YT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1lLHcpOm19LHcudHJhbnNpdGlvbkR1cmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PWUsdyk6eX0sd30sZS5tb2RlbHMuZGlzdHJpYnV0aW9uPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGwoZSl7cmV0dXJuIGUuZWFjaChmdW5jdGlvbihlKXt2YXIgYT1uLShpPT09IngiP3QubGVmdCt0LnJpZ2h0OnQudG9wK3QuYm90dG9tKSxsPWk9PSJ4Ij8ieSI6IngiLGM9ZDMuc2VsZWN0KHRoaXMpO2Y9Znx8dTt2YXIgaD1jLnNlbGVjdEFsbCgiZy5udi1kaXN0cmlidXRpb24iKS5kYXRhKFtlXSkscD1oLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudmQzIG52LWRpc3RyaWJ1dGlvbiIpLGQ9cC5hcHBlbmQoImciKSx2PWguc2VsZWN0KCJnIik7aC5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit0LmxlZnQrIiwiK3QudG9wKyIpIik7dmFyIG09di5zZWxlY3RBbGwoImcubnYtZGlzdCIpLmRhdGEoZnVuY3Rpb24oZSl7cmV0dXJuIGV9LGZ1bmN0aW9uKGUpe3JldHVybiBlLmtleX0pO20uZW50ZXIoKS5hcHBlbmQoImciKSxtLmF0dHIoImNsYXNzIixmdW5jdGlvbihlLHQpe3JldHVybiJudi1kaXN0IG52LXNlcmllcy0iK3R9KS5zdHlsZSgic3Ryb2tlIixmdW5jdGlvbihlLHQpe3JldHVybiBvKGUsdCl9KTt2YXIgZz1tLnNlbGVjdEFsbCgibGluZS5udi1kaXN0IitpKS5kYXRhKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlc30pO2cuZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5hdHRyKGkrIjEiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGYocyhlLHQpKX0pLmF0dHIoaSsiMiIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gZihzKGUsdCkpfSksbS5leGl0KCkuc2VsZWN0QWxsKCJsaW5lLm52LWRpc3QiK2kpLnRyYW5zaXRpb24oKS5hdHRyKGkrIjEiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHUocyhlLHQpKX0pLmF0dHIoaSsiMiIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdShzKGUsdCkpfSkuc3R5bGUoInN0cm9rZS1vcGFjaXR5IiwwKS5yZW1vdmUoKSxnLmF0dHIoImNsYXNzIixmdW5jdGlvbihlLHQpe3JldHVybiJudi1kaXN0IitpKyIgbnYtZGlzdCIraSsiLSIrdH0pLmF0dHIobCsiMSIsMCkuYXR0cihsKyIyIixyKSxnLnRyYW5zaXRpb24oKS5hdHRyKGkrIjEiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHUocyhlLHQpKX0pLmF0dHIoaSsiMiIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdShzKGUsdCkpfSksZj11LmNvcHkoKX0pLGx9dmFyIHQ9e3RvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowfSxuPTQwMCxyPTgsaT0ieCIscz1mdW5jdGlvbihlKXtyZXR1cm4gZVtpXX0sbz1lLnV0aWxzLmRlZmF1bHRDb2xvcigpLHU9ZDMuc2NhbGUubGluZWFyKCksYSxmO3JldHVybiBsLm9wdGlvbnM9ZS51dGlscy5vcHRpb25zRnVuYy5iaW5kKGwpLGwubWFyZ2luPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0LnRvcD10eXBlb2YgZS50b3AhPSJ1bmRlZmluZWQiP2UudG9wOnQudG9wLHQucmlnaHQ9dHlwZW9mIGUucmlnaHQhPSJ1bmRlZmluZWQiP2UucmlnaHQ6dC5yaWdodCx0LmJvdHRvbT10eXBlb2YgZS5ib3R0b20hPSJ1bmRlZmluZWQiP2UuYm90dG9tOnQuYm90dG9tLHQubGVmdD10eXBlb2YgZS5sZWZ0IT0idW5kZWZpbmVkIj9lLmxlZnQ6dC5sZWZ0LGwpOnR9LGwud2lkdGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSxsKTpufSxsLmF4aXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ZSxsKTppfSxsLnNpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSxsKTpyfSxsLmdldERhdGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ZDMuZnVuY3RvcihlKSxsKTpzfSxsLnNjYWxlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWUsbCk6dX0sbC5jb2xvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1lLnV0aWxzLmdldENvbG9yKHQpLGwpOm99LGx9LGUubW9kZWxzLmhpc3RvcmljYWxCYXI9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdyhFKXtyZXR1cm4gRS5lYWNoKGZ1bmN0aW9uKHcpe3ZhciBFPW4tdC5sZWZ0LXQucmlnaHQsUz1yLXQudG9wLXQuYm90dG9tLFQ9ZDMuc2VsZWN0KHRoaXMpO3MuZG9tYWluKGR8fGQzLmV4dGVudCh3WzBdLnZhbHVlcy5tYXAodSkuY29uY2F0KGYpKSksYz9zLnJhbmdlKG18fFtFKi41L3dbMF0udmFsdWVzLmxlbmd0aCxFKih3WzBdLnZhbHVlcy5sZW5ndGgtLjUpL3dbMF0udmFsdWVzLmxlbmd0aF0pOnMucmFuZ2UobXx8WzAsRV0pLG8uZG9tYWluKHZ8fGQzLmV4dGVudCh3WzBdLnZhbHVlcy5tYXAoYSkuY29uY2F0KGwpKSkucmFuZ2UoZ3x8W1MsMF0pLHMuZG9tYWluKClbMF09PT1zLmRvbWFpbigpWzFdJiYocy5kb21haW4oKVswXT9zLmRvbWFpbihbcy5kb21haW4oKVswXS1zLmRvbWFpbigpWzBdKi4wMSxzLmRvbWFpbigpWzFdK3MuZG9tYWluKClbMV0qLjAxXSk6cy5kb21haW4oWy0xLDFdKSksby5kb21haW4oKVswXT09PW8uZG9tYWluKClbMV0mJihvLmRvbWFpbigpWzBdP28uZG9tYWluKFtvLmRvbWFpbigpWzBdK28uZG9tYWluKClbMF0qLjAxLG8uZG9tYWluKClbMV0tby5kb21haW4oKVsxXSouMDFdKTpvLmRvbWFpbihbLTEsMV0pKTt2YXIgTj1ULnNlbGVjdEFsbCgiZy5udi13cmFwLm52LWhpc3RvcmljYWxCYXItIitpKS5kYXRhKFt3WzBdLnZhbHVlc10pLEM9Ti5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnZkMyBudi13cmFwIG52LWhpc3RvcmljYWxCYXItIitpKSxrPUMuYXBwZW5kKCJkZWZzIiksTD1DLmFwcGVuZCgiZyIpLEE9Ti5zZWxlY3QoImciKTtMLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtYmFycyIpLE4uYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrdC5sZWZ0KyIsIit0LnRvcCsiKSIpLFQub24oImNsaWNrIixmdW5jdGlvbihlLHQpe3kuY2hhcnRDbGljayh7ZGF0YTplLGluZGV4OnQscG9zOmQzLmV2ZW50LGlkOml9KX0pLGsuYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIiwibnYtY2hhcnQtY2xpcC1wYXRoLSIraSkuYXBwZW5kKCJyZWN0IiksTi5zZWxlY3QoIiNudi1jaGFydC1jbGlwLXBhdGgtIitpKyIgcmVjdCIpLmF0dHIoIndpZHRoIixFKS5hdHRyKCJoZWlnaHQiLFMpLEEuYXR0cigiY2xpcC1wYXRoIixoPyJ1cmwoI252LWNoYXJ0LWNsaXAtcGF0aC0iK2krIikiOiIiKTt2YXIgTz1OLnNlbGVjdCgiLm52LWJhcnMiKS5zZWxlY3RBbGwoIi5udi1iYXIiKS5kYXRhKGZ1bmN0aW9uKGUpe3JldHVybiBlfSxmdW5jdGlvbihlLHQpe3JldHVybiB1KGUsdCl9KTtPLmV4aXQoKS5yZW1vdmUoKTt2YXIgTT1PLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsMCkuYXR0cigieSIsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS51dGlscy5OYU50b1plcm8obyhNYXRoLm1heCgwLGEodCxuKSkpKX0pLmF0dHIoImhlaWdodCIsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS51dGlscy5OYU50b1plcm8oTWF0aC5hYnMobyhhKHQsbikpLW8oMCkpKX0pLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oZSx0KXtyZXR1cm4idHJhbnNsYXRlKCIrKHModShlLHQpKS1FL3dbMF0udmFsdWVzLmxlbmd0aCouNDUpKyIsMCkifSkub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oZSx0KXtpZighYilyZXR1cm47ZDMuc2VsZWN0KHRoaXMpLmNsYXNzZWQoImhvdmVyIiwhMCkseS5lbGVtZW50TW91c2VvdmVyKHtwb2ludDplLHNlcmllczp3WzBdLHBvczpbcyh1KGUsdCkpLG8oYShlLHQpKV0scG9pbnRJbmRleDp0LHNlcmllc0luZGV4OjAsZTpkMy5ldmVudH0pfSkub24oIm1vdXNlb3V0IixmdW5jdGlvbihlLHQpe2lmKCFiKXJldHVybjtkMy5zZWxlY3QodGhpcykuY2xhc3NlZCgiaG92ZXIiLCExKSx5LmVsZW1lbnRNb3VzZW91dCh7cG9pbnQ6ZSxzZXJpZXM6d1swXSxwb2ludEluZGV4OnQsc2VyaWVzSW5kZXg6MCxlOmQzLmV2ZW50fSl9KS5vbigiY2xpY2siLGZ1bmN0aW9uKGUsdCl7aWYoIWIpcmV0dXJuO3kuZWxlbWVudENsaWNrKHt2YWx1ZTphKGUsdCksZGF0YTplLGluZGV4OnQscG9zOltzKHUoZSx0KSksbyhhKGUsdCkpXSxlOmQzLmV2ZW50LGlkOml9KSxkMy5ldmVudC5zdG9wUHJvcGFnYXRpb24oKX0pLm9uKCJkYmxjbGljayIsZnVuY3Rpb24oZSx0KXtpZighYilyZXR1cm47eS5lbGVtZW50RGJsQ2xpY2soe3ZhbHVlOmEoZSx0KSxkYXRhOmUsaW5kZXg6dCxwb3M6W3ModShlLHQpKSxvKGEoZSx0KSldLGU6ZDMuZXZlbnQsaWQ6aX0pLGQzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpfSk7Ty5hdHRyKCJmaWxsIixmdW5jdGlvbihlLHQpe3JldHVybiBwKGUsdCl9KS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24oZSx0LG4pe3JldHVybihhKGUsdCk8MD8ibnYtYmFyIG5lZ2F0aXZlIjoibnYtYmFyIHBvc2l0aXZlIikrIiBudi1iYXItIituKyItIit0fSkudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oZSx0KXtyZXR1cm4idHJhbnNsYXRlKCIrKHModShlLHQpKS1FL3dbMF0udmFsdWVzLmxlbmd0aCouNDUpKyIsMCkifSkuYXR0cigid2lkdGgiLEUvd1swXS52YWx1ZXMubGVuZ3RoKi45KSxPLnRyYW5zaXRpb24oKS5hdHRyKCJ5IixmdW5jdGlvbih0LG4pe3ZhciByPWEodCxuKTwwP28oMCk6bygwKS1vKGEodCxuKSk8MT9vKDApLTE6byhhKHQsbikpO3JldHVybiBlLnV0aWxzLk5hTnRvWmVybyhyKX0pLmF0dHIoImhlaWdodCIsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS51dGlscy5OYU50b1plcm8oTWF0aC5tYXgoTWF0aC5hYnMobyhhKHQsbikpLW8oMCkpLDEpKX0pfSksd312YXIgdD17dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9LG49OTYwLHI9NTAwLGk9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjFlNCkscz1kMy5zY2FsZS5saW5lYXIoKSxvPWQzLnNjYWxlLmxpbmVhcigpLHU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUueH0sYT1mdW5jdGlvbihlKXtyZXR1cm4gZS55fSxmPVtdLGw9WzBdLGM9ITEsaD0hMCxwPWUudXRpbHMuZGVmYXVsdENvbG9yKCksZCx2LG0sZyx5PWQzLmRpc3BhdGNoKCJjaGFydENsaWNrIiwiZWxlbWVudENsaWNrIiwiZWxlbWVudERibENsaWNrIiwiZWxlbWVudE1vdXNlb3ZlciIsImVsZW1lbnRNb3VzZW91dCIpLGI9ITA7cmV0dXJuIHcuaGlnaGxpZ2h0UG9pbnQ9ZnVuY3Rpb24oZSx0KXtkMy5zZWxlY3QoIi5udi1oaXN0b3JpY2FsQmFyLSIraSkuc2VsZWN0KCIubnYtYmFycyAubnYtYmFyLTAtIitlKS5jbGFzc2VkKCJob3ZlciIsdCl9LHcuY2xlYXJIaWdobGlnaHRzPWZ1bmN0aW9uKCl7ZDMuc2VsZWN0KCIubnYtaGlzdG9yaWNhbEJhci0iK2kpLnNlbGVjdCgiLm52LWJhcnMgLm52LWJhci5ob3ZlciIpLmNsYXNzZWQoImhvdmVyIiwhMSl9LHcuZGlzcGF0Y2g9eSx3Lm9wdGlvbnM9ZS51dGlscy5vcHRpb25zRnVuYy5iaW5kKHcpLHcueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1lLHcpOnV9LHcueT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1lLHcpOmF9LHcubWFyZ2luPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0LnRvcD10eXBlb2YgZS50b3AhPSJ1bmRlZmluZWQiP2UudG9wOnQudG9wLHQucmlnaHQ9dHlwZW9mIGUucmlnaHQhPSJ1bmRlZmluZWQiP2UucmlnaHQ6dC5yaWdodCx0LmJvdHRvbT10eXBlb2YgZS5ib3R0b20hPSJ1bmRlZmluZWQiP2UuYm90dG9tOnQuYm90dG9tLHQubGVmdD10eXBlb2YgZS5sZWZ0IT0idW5kZWZpbmVkIj9lLmxlZnQ6dC5sZWZ0LHcpOnR9LHcud2lkdGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSx3KTpufSx3LmhlaWdodD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLHcpOnJ9LHcueFNjYWxlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPWUsdyk6c30sdy55U2NhbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ZSx3KTpvfSx3LnhEb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9ZSx3KTpkfSx3LnlEb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9ZSx3KTp2fSx3LnhSYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1lLHcpOm19LHcueVJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPWUsdyk6Z30sdy5mb3JjZVg9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ZSx3KTpmfSx3LmZvcmNlWT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1lLHcpOmx9LHcucGFkRGF0YT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1lLHcpOmN9LHcuY2xpcEVkZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ZSx3KTpofSx3LmNvbG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPWUudXRpbHMuZ2V0Q29sb3IodCksdyk6cH0sdy5pZD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1lLHcpOml9LHcuaW50ZXJhY3RpdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9ITEsdyk6Yn0sd30sZS5tb2RlbHMuaGlzdG9yaWNhbEJhckNoYXJ0PWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHgoZSl7cmV0dXJuIGUuZWFjaChmdW5jdGlvbihkKXt2YXIgVD1kMy5zZWxlY3QodGhpcyksTj10aGlzLEM9KHV8fHBhcnNlSW50KFQuc3R5bGUoIndpZHRoIikpfHw5NjApLXMubGVmdC1zLnJpZ2h0LGs9KGF8fHBhcnNlSW50KFQuc3R5bGUoImhlaWdodCIpKXx8NDAwKS1zLnRvcC1zLmJvdHRvbTt4LnVwZGF0ZT1mdW5jdGlvbigpe1QudHJhbnNpdGlvbigpLmR1cmF0aW9uKEUpLmNhbGwoeCl9LHguY29udGFpbmVyPXRoaXMsZy5kaXNhYmxlZD1kLm1hcChmdW5jdGlvbihlKXtyZXR1cm4hIWUuZGlzYWJsZWR9KTtpZigheSl7dmFyIEw7eT17fTtmb3IoTCBpbiBnKWdbTF1pbnN0YW5jZW9mIEFycmF5P3lbTF09Z1tMXS5zbGljZSgwKTp5W0xdPWdbTF19aWYoIWR8fCFkLmxlbmd0aHx8IWQuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlcy5sZW5ndGh9KS5sZW5ndGgpe3ZhciBBPVQuc2VsZWN0QWxsKCIubnYtbm9EYXRhIikuZGF0YShbYl0pO3JldHVybiBBLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLCJudmQzIG52LW5vRGF0YSIpLmF0dHIoImR5IiwiLS43ZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKSxBLmF0dHIoIngiLHMubGVmdCtDLzIpLmF0dHIoInkiLHMudG9wK2svMikudGV4dChmdW5jdGlvbihlKXtyZXR1cm4gZX0pLHh9VC5zZWxlY3RBbGwoIi5udi1ub0RhdGEiKS5yZW1vdmUoKSx2PXQueFNjYWxlKCksbT10LnlTY2FsZSgpO3ZhciBPPVQuc2VsZWN0QWxsKCJnLm52LXdyYXAubnYtaGlzdG9yaWNhbEJhckNoYXJ0IikuZGF0YShbZF0pLE09Ty5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnZkMyBudi13cmFwIG52LWhpc3RvcmljYWxCYXJDaGFydCIpLmFwcGVuZCgiZyIpLF89Ty5zZWxlY3QoImciKTtNLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYteCBudi1heGlzIiksTS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXkgbnYtYXhpcyIpLE0uYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1iYXJzV3JhcCIpLE0uYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1sZWdlbmRXcmFwIiksZiYmKGkud2lkdGgoQyksXy5zZWxlY3QoIi5udi1sZWdlbmRXcmFwIikuZGF0dW0oZCkuY2FsbChpKSxzLnRvcCE9aS5oZWlnaHQoKSYmKHMudG9wPWkuaGVpZ2h0KCksaz0oYXx8cGFyc2VJbnQoVC5zdHlsZSgiaGVpZ2h0IikpfHw0MDApLXMudG9wLXMuYm90dG9tKSxPLnNlbGVjdCgiLm52LWxlZ2VuZFdyYXAiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwiKyAtcy50b3ArIikiKSksTy5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitzLmxlZnQrIiwiK3MudG9wKyIpIiksaCYmXy5zZWxlY3QoIi5udi15Lm52LWF4aXMiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitDKyIsMCkiKSx0LndpZHRoKEMpLmhlaWdodChrKS5jb2xvcihkLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbG9yfHxvKGUsdCl9KS5maWx0ZXIoZnVuY3Rpb24oZSx0KXtyZXR1cm4hZFt0XS5kaXNhYmxlZH0pKTt2YXIgRD1fLnNlbGVjdCgiLm52LWJhcnNXcmFwIikuZGF0dW0oZC5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuZGlzYWJsZWR9KSk7RC50cmFuc2l0aW9uKCkuY2FsbCh0KSxsJiYobi5zY2FsZSh2KS50aWNrU2l6ZSgtaywwKSxfLnNlbGVjdCgiLm52LXgubnYtYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIrbS5yYW5nZSgpWzBdKyIpIiksXy5zZWxlY3QoIi5udi14Lm52LWF4aXMiKS50cmFuc2l0aW9uKCkuY2FsbChuKSksYyYmKHIuc2NhbGUobSkudGlja3Moay8zNikudGlja1NpemUoLUMsMCksXy5zZWxlY3QoIi5udi15Lm52LWF4aXMiKS50cmFuc2l0aW9uKCkuY2FsbChyKSksaS5kaXNwYXRjaC5vbigibGVnZW5kQ2xpY2siLGZ1bmN0aW9uKHQsbil7dC5kaXNhYmxlZD0hdC5kaXNhYmxlZCxkLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5kaXNhYmxlZH0pLmxlbmd0aHx8ZC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZWQ9ITEsTy5zZWxlY3RBbGwoIi5udi1zZXJpZXMiKS5jbGFzc2VkKCJkaXNhYmxlZCIsITEpLGV9KSxnLmRpc2FibGVkPWQubWFwKGZ1bmN0aW9uKGUpe3JldHVybiEhZS5kaXNhYmxlZH0pLHcuc3RhdGVDaGFuZ2UoZyksZS50cmFuc2l0aW9uKCkuY2FsbCh4KX0pLGkuZGlzcGF0Y2gub24oImxlZ2VuZERibGNsaWNrIixmdW5jdGlvbihlKXtkLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5kaXNhYmxlZD0hMH0pLGUuZGlzYWJsZWQ9ITEsZy5kaXNhYmxlZD1kLm1hcChmdW5jdGlvbihlKXtyZXR1cm4hIWUuZGlzYWJsZWR9KSx3LnN0YXRlQ2hhbmdlKGcpLHgudXBkYXRlKCl9KSx3Lm9uKCJ0b29sdGlwU2hvdyIsZnVuY3Rpb24oZSl7cCYmUyhlLE4ucGFyZW50Tm9kZSl9KSx3Lm9uKCJjaGFuZ2VTdGF0ZSIsZnVuY3Rpb24odCl7dHlwZW9mIHQuZGlzYWJsZWQhPSJ1bmRlZmluZWQiJiYoZC5mb3JFYWNoKGZ1bmN0aW9uKGUsbil7ZS5kaXNhYmxlZD10LmRpc2FibGVkW25dfSksZy5kaXNhYmxlZD10LmRpc2FibGVkKSxlLmNhbGwoeCl9KX0pLHh9dmFyIHQ9ZS5tb2RlbHMuaGlzdG9yaWNhbEJhcigpLG49ZS5tb2RlbHMuYXhpcygpLHI9ZS5tb2RlbHMuYXhpcygpLGk9ZS5tb2RlbHMubGVnZW5kKCkscz17dG9wOjMwLHJpZ2h0OjkwLGJvdHRvbTo1MCxsZWZ0OjkwfSxvPWUudXRpbHMuZGVmYXVsdENvbG9yKCksdT1udWxsLGE9bnVsbCxmPSExLGw9ITAsYz0hMCxoPSExLHA9ITAsZD1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiI8aDM+IitlKyI8L2gzPiIrIjxwPiIrbisiIGF0ICIrdCsiPC9wPiJ9LHYsbSxnPXt9LHk9bnVsbCxiPSJObyBEYXRhIEF2YWlsYWJsZS4iLHc9ZDMuZGlzcGF0Y2goInRvb2x0aXBTaG93IiwidG9vbHRpcEhpZGUiLCJzdGF0ZUNoYW5nZSIsImNoYW5nZVN0YXRlIiksRT0yNTA7bi5vcmllbnQoImJvdHRvbSIpLnRpY2tQYWRkaW5nKDcpLHIub3JpZW50KGg/InJpZ2h0IjoibGVmdCIpO3ZhciBTPWZ1bmN0aW9uKGkscyl7aWYocyl7dmFyIG89ZDMuc2VsZWN0KHMpLnNlbGVjdCgic3ZnIiksdT1vLm5vZGUoKT9vLmF0dHIoInZpZXdCb3giKTpudWxsO2lmKHUpe3U9dS5zcGxpdCgiICIpO3ZhciBhPXBhcnNlSW50KG8uc3R5bGUoIndpZHRoIikpL3VbMl07aS5wb3NbMF09aS5wb3NbMF0qYSxpLnBvc1sxXT1pLnBvc1sxXSphfX12YXIgZj1pLnBvc1swXSsocy5vZmZzZXRMZWZ0fHwwKSxsPWkucG9zWzFdKyhzLm9mZnNldFRvcHx8MCksYz1uLnRpY2tGb3JtYXQoKSh0LngoKShpLnBvaW50LGkucG9pbnRJbmRleCkpLGg9ci50aWNrRm9ybWF0KCkodC55KCkoaS5wb2ludCxpLnBvaW50SW5kZXgpKSxwPWQoaS5zZXJpZXMua2V5LGMsaCxpLHgpO2UudG9vbHRpcC5zaG93KFtmLGxdLHAsbnVsbCxudWxsLHMpfTtyZXR1cm4gdC5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlb3Zlci50b29sdGlwIixmdW5jdGlvbihlKXtlLnBvcz1bZS5wb3NbMF0rcy5sZWZ0LGUucG9zWzFdK3MudG9wXSx3LnRvb2x0aXBTaG93KGUpfSksdC5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlb3V0LnRvb2x0aXAiLGZ1bmN0aW9uKGUpe3cudG9vbHRpcEhpZGUoZSl9KSx3Lm9uKCJ0b29sdGlwSGlkZSIsZnVuY3Rpb24oKXtwJiZlLnRvb2x0aXAuY2xlYW51cCgpfSkseC5kaXNwYXRjaD13LHguYmFycz10LHgubGVnZW5kPWkseC54QXhpcz1uLHgueUF4aXM9cixkMy5yZWJpbmQoeCx0LCJkZWZpbmVkIiwiaXNBcmVhIiwieCIsInkiLCJzaXplIiwieFNjYWxlIiwieVNjYWxlIiwieERvbWFpbiIsInlEb21haW4iLCJ4UmFuZ2UiLCJ5UmFuZ2UiLCJmb3JjZVgiLCJmb3JjZVkiLCJpbnRlcmFjdGl2ZSIsImNsaXBFZGdlIiwiY2xpcFZvcm9ub2kiLCJpZCIsImludGVycG9sYXRlIiwiaGlnaGxpZ2h0UG9pbnQiLCJjbGVhckhpZ2hsaWdodHMiLCJpbnRlcmFjdGl2ZSIpLHgub3B0aW9ucz1lLnV0aWxzLm9wdGlvbnNGdW5jLmJpbmQoeCkseC5tYXJnaW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHMudG9wPXR5cGVvZiBlLnRvcCE9InVuZGVmaW5lZCI/ZS50b3A6cy50b3Ascy5yaWdodD10eXBlb2YgZS5yaWdodCE9InVuZGVmaW5lZCI/ZS5yaWdodDpzLnJpZ2h0LHMuYm90dG9tPXR5cGVvZiBlLmJvdHRvbSE9InVuZGVmaW5lZCI/ZS5ib3R0b206cy5ib3R0b20scy5sZWZ0PXR5cGVvZiBlLmxlZnQhPSJ1bmRlZmluZWQiP2UubGVmdDpzLmxlZnQseCk6c30seC53aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1lLHgpOnV9LHguaGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWUseCk6YX0seC5jb2xvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1lLnV0aWxzLmdldENvbG9yKHQpLGkuY29sb3IobykseCk6b30seC5zaG93TGVnZW5kPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPWUseCk6Zn0seC5zaG93WEF4aXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ZSx4KTpsfSx4LnNob3dZQXhpcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1lLHgpOmN9LHgucmlnaHRBbGlnbllBeGlzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPWUsci5vcmllbnQoZT8icmlnaHQiOiJsZWZ0IikseCk6aH0seC50b29sdGlwcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1lLHgpOnB9LHgudG9vbHRpcENvbnRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9ZSx4KTpkfSx4LnN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPWUseCk6Z30seC5kZWZhdWx0U3RhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9ZSx4KTp5fSx4Lm5vRGF0YT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj1lLHgpOmJ9LHgudHJhbnNpdGlvbkR1cmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhFPWUseCk6RX0seH0sZS5tb2RlbHMuaW5kZW50ZWRUcmVlPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGcoZSl7cmV0dXJuIGUuZWFjaChmdW5jdGlvbihlKXtmdW5jdGlvbiBrKGUsdCxuKXtkMy5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtpZihkMy5ldmVudC5zaGlmdEtleSYmIW4pcmV0dXJuIGQzLmV2ZW50LnNoaWZ0S2V5PSExLGUudmFsdWVzJiZlLnZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpeyhlLnZhbHVlc3x8ZS5fdmFsdWVzKSYmayhlLDAsITApfSksITA7aWYoIU8oZSkpcmV0dXJuITA7ZS52YWx1ZXM/KGUuX3ZhbHVlcz1lLnZhbHVlcyxlLnZhbHVlcz1udWxsKTooZS52YWx1ZXM9ZS5fdmFsdWVzLGUuX3ZhbHVlcz1udWxsKSxnLnVwZGF0ZSgpfWZ1bmN0aW9uIEwoZSl7cmV0dXJuIGUuX3ZhbHVlcyYmZS5fdmFsdWVzLmxlbmd0aD9oOmUudmFsdWVzJiZlLnZhbHVlcy5sZW5ndGg/cDoiIn1mdW5jdGlvbiBBKGUpe3JldHVybiBlLl92YWx1ZXMmJmUuX3ZhbHVlcy5sZW5ndGh9ZnVuY3Rpb24gTyhlKXt2YXIgdD1lLnZhbHVlc3x8ZS5fdmFsdWVzO3JldHVybiB0JiZ0Lmxlbmd0aH12YXIgdD0xLG49ZDMuc2VsZWN0KHRoaXMpLGk9ZDMubGF5b3V0LnRyZWUoKS5jaGlsZHJlbihmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZXN9KS5zaXplKFtyLGZdKTtnLnVwZGF0ZT1mdW5jdGlvbigpe24udHJhbnNpdGlvbigpLmR1cmF0aW9uKDYwMCkuY2FsbChnKX0sZVswXXx8KGVbMF09e2tleTphfSk7dmFyIHM9aS5ub2RlcyhlWzBdKSx5PWQzLnNlbGVjdCh0aGlzKS5zZWxlY3RBbGwoImRpdiIpLmRhdGEoW1tzXV0pLGI9eS5lbnRlcigpLmFwcGVuZCgiZGl2IikuYXR0cigiY2xhc3MiLCJudmQzIG52LXdyYXAgbnYtaW5kZW50ZWR0cmVlIiksdz1iLmFwcGVuZCgidGFibGUiKSxFPXkuc2VsZWN0KCJ0YWJsZSIpLmF0dHIoIndpZHRoIiwiMTAwJSIpLmF0dHIoImNsYXNzIixjKTtpZihvKXt2YXIgUz13LmFwcGVuZCgidGhlYWQiKSx4PVMuYXBwZW5kKCJ0ciIpO2wuZm9yRWFjaChmdW5jdGlvbihlKXt4LmFwcGVuZCgidGgiKS5hdHRyKCJ3aWR0aCIsZS53aWR0aD9lLndpZHRoOiIxMCUiKS5zdHlsZSgidGV4dC1hbGlnbiIsZS50eXBlPT0ibnVtZXJpYyI/InJpZ2h0IjoibGVmdCIpLmFwcGVuZCgic3BhbiIpLnRleHQoZS5sYWJlbCl9KX12YXIgVD1FLnNlbGVjdEFsbCgidGJvZHkiKS5kYXRhKGZ1bmN0aW9uKGUpe3JldHVybiBlfSk7VC5lbnRlcigpLmFwcGVuZCgidGJvZHkiKSx0PWQzLm1heChzLGZ1bmN0aW9uKGUpe3JldHVybiBlLmRlcHRofSksaS5zaXplKFtyLHQqZl0pO3ZhciBOPVQuc2VsZWN0QWxsKCJ0ciIpLmRhdGEoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiB1JiYhZS5jaGlsZHJlbj91KGUpOiEwfSl9LGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuaWR8fGUuaWR8fCsrbX0pO04uZXhpdCgpLnJlbW92ZSgpLE4uc2VsZWN0KCJpbWcubnYtdHJlZWljb24iKS5hdHRyKCJzcmMiLEwpLmNsYXNzZWQoImZvbGRlZCIsQSk7dmFyIEM9Ti5lbnRlcigpLmFwcGVuZCgidHIiKTtsLmZvckVhY2goZnVuY3Rpb24oZSx0KXt2YXIgbj1DLmFwcGVuZCgidGQiKS5zdHlsZSgicGFkZGluZy1sZWZ0IixmdW5jdGlvbihlKXtyZXR1cm4odD8wOmUuZGVwdGgqZisxMisoTChlKT8wOjE2KSkrInB4In0sImltcG9ydGFudCIpLnN0eWxlKCJ0ZXh0LWFsaWduIixlLnR5cGU9PSJudW1lcmljIj8icmlnaHQiOiJsZWZ0Iik7dD09MCYmbi5hcHBlbmQoImltZyIpLmNsYXNzZWQoIm52LXRyZWVpY29uIiwhMCkuY2xhc3NlZCgibnYtZm9sZGVkIixBKS5hdHRyKCJzcmMiLEwpLnN0eWxlKCJ3aWR0aCIsIjE0cHgiKS5zdHlsZSgiaGVpZ2h0IiwiMTRweCIpLnN0eWxlKCJwYWRkaW5nIiwiMCAxcHgiKS5zdHlsZSgiZGlzcGxheSIsZnVuY3Rpb24oZSl7cmV0dXJuIEwoZSk/ImlubGluZS1ibG9jayI6Im5vbmUifSkub24oImNsaWNrIixrKSxuLmVhY2goZnVuY3Rpb24obil7IXQmJnYobik/ZDMuc2VsZWN0KHRoaXMpLmFwcGVuZCgiYSIpLmF0dHIoImhyZWYiLHYpLmF0dHIoImNsYXNzIixkMy5mdW5jdG9yKGUuY2xhc3NlcykpLmFwcGVuZCgic3BhbiIpOmQzLnNlbGVjdCh0aGlzKS5hcHBlbmQoInNwYW4iKSxkMy5zZWxlY3QodGhpcykuc2VsZWN0KCJzcGFuIikuYXR0cigiY2xhc3MiLGQzLmZ1bmN0b3IoZS5jbGFzc2VzKSkudGV4dChmdW5jdGlvbih0KXtyZXR1cm4gZS5mb3JtYXQ/ZS5mb3JtYXQodCk6dFtlLmtleV18fCItIn0pfSksZS5zaG93Q291bnQmJihuLmFwcGVuZCgic3BhbiIpLmF0dHIoImNsYXNzIiwibnYtY2hpbGRyZW5Db3VudCIpLE4uc2VsZWN0QWxsKCJzcGFuLm52LWNoaWxkcmVuQ291bnQiKS50ZXh0KGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlcyYmZS52YWx1ZXMubGVuZ3RofHxlLl92YWx1ZXMmJmUuX3ZhbHVlcy5sZW5ndGg/IigiKyhlLnZhbHVlcyYmZS52YWx1ZXMuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiB1P3UoZSk6ITB9KS5sZW5ndGh8fGUuX3ZhbHVlcyYmZS5fdmFsdWVzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gdT91KGUpOiEwfSkubGVuZ3RofHwwKSsiKSI6IiJ9KSl9KSxOLm9yZGVyKCkub24oImNsaWNrIixmdW5jdGlvbihlKXtkLmVsZW1lbnRDbGljayh7cm93OnRoaXMsZGF0YTplLHBvczpbZS54LGUueV19KX0pLm9uKCJkYmxjbGljayIsZnVuY3Rpb24oZSl7ZC5lbGVtZW50RGJsY2xpY2soe3Jvdzp0aGlzLGRhdGE6ZSxwb3M6W2UueCxlLnldfSl9KS5vbigibW91c2VvdmVyIixmdW5jdGlvbihlKXtkLmVsZW1lbnRNb3VzZW92ZXIoe3Jvdzp0aGlzLGRhdGE6ZSxwb3M6W2UueCxlLnldfSl9KS5vbigibW91c2VvdXQiLGZ1bmN0aW9uKGUpe2QuZWxlbWVudE1vdXNlb3V0KHtyb3c6dGhpcyxkYXRhOmUscG9zOltlLngsZS55XX0pfSl9KSxnfXZhciB0PXt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MH0sbj05NjAscj01MDAsaT1lLnV0aWxzLmRlZmF1bHRDb2xvcigpLHM9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjFlNCksbz0hMCx1PSExLGE9Ik5vIERhdGEgQXZhaWxhYmxlLiIsZj0yMCxsPVt7a2V5OiJrZXkiLGxhYmVsOiJOYW1lIix0eXBlOiJ0ZXh0In1dLGM9bnVsbCxoPSJpbWFnZXMvZ3JleS1wbHVzLnBuZyIscD0iaW1hZ2VzL2dyZXktbWludXMucG5nIixkPWQzLmRpc3BhdGNoKCJlbGVtZW50Q2xpY2siLCJlbGVtZW50RGJsY2xpY2siLCJlbGVtZW50TW91c2VvdmVyIiwiZWxlbWVudE1vdXNlb3V0Iiksdj1mdW5jdGlvbihlKXtyZXR1cm4gZS51cmx9LG09MDtyZXR1cm4gZy5vcHRpb25zPWUudXRpbHMub3B0aW9uc0Z1bmMuYmluZChnKSxnLm1hcmdpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odC50b3A9dHlwZW9mIGUudG9wIT0idW5kZWZpbmVkIj9lLnRvcDp0LnRvcCx0LnJpZ2h0PXR5cGVvZiBlLnJpZ2h0IT0idW5kZWZpbmVkIj9lLnJpZ2h0OnQucmlnaHQsdC5ib3R0b209dHlwZW9mIGUuYm90dG9tIT0idW5kZWZpbmVkIj9lLmJvdHRvbTp0LmJvdHRvbSx0LmxlZnQ9dHlwZW9mIGUubGVmdCE9InVuZGVmaW5lZCI/ZS5sZWZ0OnQubGVmdCxnKTp0fSxnLndpZHRoPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUsZyk6bn0sZy5oZWlnaHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSxnKTpyfSxnLmNvbG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUudXRpbHMuZ2V0Q29sb3IodCksc2NhdHRlci5jb2xvcihpKSxnKTppfSxnLmlkPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPWUsZyk6c30sZy5oZWFkZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ZSxnKTpvfSxnLm5vRGF0YT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1lLGcpOmF9LGcuZmlsdGVyWmVybz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1lLGcpOnV9LGcuY29sdW1ucz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1lLGcpOmx9LGcudGFibGVDbGFzcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1lLGcpOmN9LGcuaWNvbk9wZW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ZSxnKTpofSxnLmljb25DbG9zZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1lLGcpOnB9LGcuZ2V0VXJsPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PWUsZyk6dn0sZ30sZS5tb2RlbHMubGVnZW5kPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGMoaCl7cmV0dXJuIGguZWFjaChmdW5jdGlvbihjKXt2YXIgaD1uLXQubGVmdC10LnJpZ2h0LHA9ZDMuc2VsZWN0KHRoaXMpLGQ9cC5zZWxlY3RBbGwoImcubnYtbGVnZW5kIikuZGF0YShbY10pLHY9ZC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnZkMyBudi1sZWdlbmQiKS5hcHBlbmQoImciKSxtPWQuc2VsZWN0KCJnIik7ZC5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit0LmxlZnQrIiwiK3QudG9wKyIpIik7dmFyIGc9bS5zZWxlY3RBbGwoIi5udi1zZXJpZXMiKS5kYXRhKGZ1bmN0aW9uKGUpe3JldHVybiBlfSkseT1nLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1zZXJpZXMiKS5vbigibW91c2VvdmVyIixmdW5jdGlvbihlLHQpe2wubGVnZW5kTW91c2VvdmVyKGUsdCl9KS5vbigibW91c2VvdXQiLGZ1bmN0aW9uKGUsdCl7bC5sZWdlbmRNb3VzZW91dChlLHQpfSkub24oImNsaWNrIixmdW5jdGlvbihlLHQpe2wubGVnZW5kQ2xpY2soZSx0KSxhJiYoZj8oYy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZGlzYWJsZWQ9ITB9KSxlLmRpc2FibGVkPSExKTooZS5kaXNhYmxlZD0hZS5kaXNhYmxlZCxjLmV2ZXJ5KGZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkfSkmJmMuZm9yRWFjaChmdW5jdGlvbihlKXtlLmRpc2FibGVkPSExfSkpLGwuc3RhdGVDaGFuZ2Uoe2Rpc2FibGVkOmMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiEhZS5kaXNhYmxlZH0pfSkpfSkub24oImRibGNsaWNrIixmdW5jdGlvbihlLHQpe2wubGVnZW5kRGJsY2xpY2soZSx0KSxhJiYoYy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZGlzYWJsZWQ9ITB9KSxlLmRpc2FibGVkPSExLGwuc3RhdGVDaGFuZ2Uoe2Rpc2FibGVkOmMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiEhZS5kaXNhYmxlZH0pfSkpfSk7eS5hcHBlbmQoImNpcmNsZSIpLnN0eWxlKCJzdHJva2Utd2lkdGgiLDIpLmF0dHIoImNsYXNzIiwibnYtbGVnZW5kLXN5bWJvbCIpLmF0dHIoInIiLDUpLHkuYXBwZW5kKCJ0ZXh0IikuYXR0cigidGV4dC1hbmNob3IiLCJzdGFydCIpLmF0dHIoImNsYXNzIiwibnYtbGVnZW5kLXRleHQiKS5hdHRyKCJkeSIsIi4zMmVtIikuYXR0cigiZHgiLCI4IiksZy5jbGFzc2VkKCJkaXNhYmxlZCIsZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZWR9KSxnLmV4aXQoKS5yZW1vdmUoKSxnLnNlbGVjdCgiY2lyY2xlIikuc3R5bGUoImZpbGwiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29sb3J8fHMoZSx0KX0pLnN0eWxlKCJzdHJva2UiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29sb3J8fHMoZSx0KX0pLGcuc2VsZWN0KCJ0ZXh0IikudGV4dChpKTtpZihvKXt2YXIgYj1bXTtnLmVhY2goZnVuY3Rpb24odCxuKXt2YXIgcj1kMy5zZWxlY3QodGhpcykuc2VsZWN0KCJ0ZXh0IiksaTt0cnl7aT1yLm5vZGUoKS5nZXRDb21wdXRlZFRleHRMZW5ndGgoKX1jYXRjaChzKXtpPWUudXRpbHMuY2FsY0FwcHJveFRleHRXaWR0aChyKX1iLnB1c2goaSsyOCl9KTt2YXIgdz0wLEU9MCxTPVtdO3doaWxlKEU8aCYmdzxiLmxlbmd0aClTW3ddPWJbd10sRSs9Ylt3KytdO3c9PT0wJiYodz0xKTt3aGlsZShFPmgmJnc+MSl7Uz1bXSx3LS07Zm9yKHZhciB4PTA7eDxiLmxlbmd0aDt4KyspYlt4XT4oU1t4JXddfHwwKSYmKFNbeCV3XT1iW3hdKTtFPVMucmVkdWNlKGZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBlK3R9KX12YXIgVD1bXTtmb3IodmFyIE49MCxDPTA7Tjx3O04rKylUW05dPUMsQys9U1tOXTtnLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oZSx0KXtyZXR1cm4idHJhbnNsYXRlKCIrVFt0JXddKyIsIisoNStNYXRoLmZsb29yKHQvdykqMjApKyIpIn0pLHU/bS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIisobi10LnJpZ2h0LUUpKyIsIit0LnRvcCsiKSIpOm0uYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDAsIit0LnRvcCsiKSIpLHI9dC50b3ArdC5ib3R0b20rTWF0aC5jZWlsKGIubGVuZ3RoL3cpKjIwfWVsc2V7dmFyIGs9NSxMPTUsQT0wLE87Zy5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUscil7dmFyIGk9ZDMuc2VsZWN0KHRoaXMpLnNlbGVjdCgidGV4dCIpLm5vZGUoKS5nZXRDb21wdXRlZFRleHRMZW5ndGgoKSsyODtyZXR1cm4gTz1MLG48dC5sZWZ0K3QucmlnaHQrTytpJiYoTD1PPTUsays9MjApLEwrPWksTD5BJiYoQT1MKSwidHJhbnNsYXRlKCIrTysiLCIraysiKSJ9KSxtLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiKyhuLXQucmlnaHQtQSkrIiwiK3QudG9wKyIpIikscj10LnRvcCt0LmJvdHRvbStrKzE1fX0pLGN9dmFyIHQ9e3RvcDo1LHJpZ2h0OjAsYm90dG9tOjUsbGVmdDowfSxuPTQwMCxyPTIwLGk9ZnVuY3Rpb24oZSl7cmV0dXJuIGUua2V5fSxzPWUudXRpbHMuZGVmYXVsdENvbG9yKCksbz0hMCx1PSEwLGE9ITAsZj0hMSxsPWQzLmRpc3BhdGNoKCJsZWdlbmRDbGljayIsImxlZ2VuZERibGNsaWNrIiwibGVnZW5kTW91c2VvdmVyIiwibGVnZW5kTW91c2VvdXQiLCJzdGF0ZUNoYW5nZSIpO3JldHVybiBjLmRpc3BhdGNoPWwsYy5vcHRpb25zPWUudXRpbHMub3B0aW9uc0Z1bmMuYmluZChjKSxjLm1hcmdpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odC50b3A9dHlwZW9mIGUudG9wIT0idW5kZWZpbmVkIj9lLnRvcDp0LnRvcCx0LnJpZ2h0PXR5cGVvZiBlLnJpZ2h0IT0idW5kZWZpbmVkIj9lLnJpZ2h0OnQucmlnaHQsdC5ib3R0b209dHlwZW9mIGUuYm90dG9tIT0idW5kZWZpbmVkIj9lLmJvdHRvbTp0LmJvdHRvbSx0LmxlZnQ9dHlwZW9mIGUubGVmdCE9InVuZGVmaW5lZCI/ZS5sZWZ0OnQubGVmdCxjKTp0fSxjLndpZHRoPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUsYyk6bn0sYy5oZWlnaHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSxjKTpyfSxjLmtleT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1lLGMpOml9LGMuY29sb3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ZS51dGlscy5nZXRDb2xvcih0KSxjKTpzfSxjLmFsaWduPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWUsYyk6b30sYy5yaWdodEFsaWduPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWUsYyk6dX0sYy51cGRhdGVTdGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1lLGMpOmF9LGMucmFkaW9CdXR0b25Nb2RlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPWUsYyk6Zn0sY30sZS5tb2RlbHMubGluZT1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBtKGcpe3JldHVybiBnLmVhY2goZnVuY3Rpb24obSl7dmFyIGc9ci1uLmxlZnQtbi5yaWdodCxiPWktbi50b3Atbi5ib3R0b20sdz1kMy5zZWxlY3QodGhpcyk7Yz10LnhTY2FsZSgpLGg9dC55U2NhbGUoKSxkPWR8fGMsdj12fHxoO3ZhciBFPXcuc2VsZWN0QWxsKCJnLm52LXdyYXAubnYtbGluZSIpLmRhdGEoW21dKSxTPUUuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52ZDMgbnYtd3JhcCBudi1saW5lIiksVD1TLmFwcGVuZCgiZGVmcyIpLE49Uy5hcHBlbmQoImciKSxDPUUuc2VsZWN0KCJnIik7Ti5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LWdyb3VwcyIpLE4uYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1zY2F0dGVyV3JhcCIpLEUuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrbi5sZWZ0KyIsIituLnRvcCsiKSIpLHQud2lkdGgoZykuaGVpZ2h0KGIpO3ZhciBrPUUuc2VsZWN0KCIubnYtc2NhdHRlcldyYXAiKTtrLnRyYW5zaXRpb24oKS5jYWxsKHQpLFQuYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIiwibnYtZWRnZS1jbGlwLSIrdC5pZCgpKS5hcHBlbmQoInJlY3QiKSxFLnNlbGVjdCgiI252LWVkZ2UtY2xpcC0iK3QuaWQoKSsiIHJlY3QiKS5hdHRyKCJ3aWR0aCIsZykuYXR0cigiaGVpZ2h0IixiKSxDLmF0dHIoImNsaXAtcGF0aCIsbD8idXJsKCNudi1lZGdlLWNsaXAtIit0LmlkKCkrIikiOiIiKSxrLmF0dHIoImNsaXAtcGF0aCIsbD8idXJsKCNudi1lZGdlLWNsaXAtIit0LmlkKCkrIikiOiIiKTt2YXIgTD1FLnNlbGVjdCgiLm52LWdyb3VwcyIpLnNlbGVjdEFsbCgiLm52LWdyb3VwIikuZGF0YShmdW5jdGlvbihlKXtyZXR1cm4gZX0sZnVuY3Rpb24oZSl7cmV0dXJuIGUua2V5fSk7TC5lbnRlcigpLmFwcGVuZCgiZyIpLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsMWUtNikuc3R5bGUoImZpbGwtb3BhY2l0eSIsMWUtNiksTC5leGl0KCkudHJhbnNpdGlvbigpLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsMWUtNikuc3R5bGUoImZpbGwtb3BhY2l0eSIsMWUtNikucmVtb3ZlKCksTC5hdHRyKCJjbGFzcyIsZnVuY3Rpb24oZSx0KXtyZXR1cm4ibnYtZ3JvdXAgbnYtc2VyaWVzLSIrdH0pLmNsYXNzZWQoImhvdmVyIixmdW5jdGlvbihlKXtyZXR1cm4gZS5ob3Zlcn0pLnN0eWxlKCJmaWxsIixmdW5jdGlvbihlLHQpe3JldHVybiBzKGUsdCl9KS5zdHlsZSgic3Ryb2tlIixmdW5jdGlvbihlLHQpe3JldHVybiBzKGUsdCl9KSxMLnRyYW5zaXRpb24oKS5zdHlsZSgic3Ryb2tlLW9wYWNpdHkiLDEpLnN0eWxlKCJmaWxsLW9wYWNpdHkiLC41KTt2YXIgQT1MLnNlbGVjdEFsbCgicGF0aC5udi1hcmVhIikuZGF0YShmdW5jdGlvbihlKXtyZXR1cm4gZihlKT9bZV06W119KTtBLmVudGVyKCkuYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJudi1hcmVhIikuYXR0cigiZCIsZnVuY3Rpb24odCl7cmV0dXJuIGQzLnN2Zy5hcmVhKCkuaW50ZXJwb2xhdGUocCkuZGVmaW5lZChhKS54KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUudXRpbHMuTmFOdG9aZXJvKGQobyh0LG4pKSl9KS55MChmdW5jdGlvbih0LG4pe3JldHVybiBlLnV0aWxzLk5hTnRvWmVybyh2KHUodCxuKSkpfSkueTEoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdihoLmRvbWFpbigpWzBdPD0wP2guZG9tYWluKClbMV0+PTA/MDpoLmRvbWFpbigpWzFdOmguZG9tYWluKClbMF0pfSkuYXBwbHkodGhpcyxbdC52YWx1ZXNdKX0pLEwuZXhpdCgpLnNlbGVjdEFsbCgicGF0aC5udi1hcmVhIikucmVtb3ZlKCksQS50cmFuc2l0aW9uKCkuYXR0cigiZCIsZnVuY3Rpb24odCl7cmV0dXJuIGQzLnN2Zy5hcmVhKCkuaW50ZXJwb2xhdGUocCkuZGVmaW5lZChhKS54KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUudXRpbHMuTmFOdG9aZXJvKGMobyh0LG4pKSl9KS55MChmdW5jdGlvbih0LG4pe3JldHVybiBlLnV0aWxzLk5hTnRvWmVybyhoKHUodCxuKSkpfSkueTEoZnVuY3Rpb24oZSx0KXtyZXR1cm4gaChoLmRvbWFpbigpWzBdPD0wP2guZG9tYWluKClbMV0+PTA/MDpoLmRvbWFpbigpWzFdOmguZG9tYWluKClbMF0pfSkuYXBwbHkodGhpcyxbdC52YWx1ZXNdKX0pO3ZhciBPPUwuc2VsZWN0QWxsKCJwYXRoLm52LWxpbmUiKS5kYXRhKGZ1bmN0aW9uKGUpe3JldHVybltlLnZhbHVlc119KTtPLmVudGVyKCkuYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJudi1saW5lIikuYXR0cigiZCIsZDMuc3ZnLmxpbmUoKS5pbnRlcnBvbGF0ZShwKS5kZWZpbmVkKGEpLngoZnVuY3Rpb24odCxuKXtyZXR1cm4gZS51dGlscy5OYU50b1plcm8oZChvKHQsbikpKX0pLnkoZnVuY3Rpb24odCxuKXtyZXR1cm4gZS51dGlscy5OYU50b1plcm8odih1KHQsbikpKX0pKSxMLmV4aXQoKS5zZWxlY3RBbGwoInBhdGgubnYtbGluZSIpLnRyYW5zaXRpb24oKS5hdHRyKCJkIixkMy5zdmcubGluZSgpLmludGVycG9sYXRlKHApLmRlZmluZWQoYSkueChmdW5jdGlvbih0LG4pe3JldHVybiBlLnV0aWxzLk5hTnRvWmVybyhjKG8odCxuKSkpfSkueShmdW5jdGlvbih0LG4pe3JldHVybiBlLnV0aWxzLk5hTnRvWmVybyhoKHUodCxuKSkpfSkpLE8udHJhbnNpdGlvbigpLmF0dHIoImQiLGQzLnN2Zy5saW5lKCkuaW50ZXJwb2xhdGUocCkuZGVmaW5lZChhKS54KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUudXRpbHMuTmFOdG9aZXJvKGMobyh0LG4pKSl9KS55KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUudXRpbHMuTmFOdG9aZXJvKGgodSh0LG4pKSl9KSksZD1jLmNvcHkoKSx2PWguY29weSgpfSksbX12YXIgdD1lLm1vZGVscy5zY2F0dGVyKCksbj17dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9LHI9OTYwLGk9NTAwLHM9ZS51dGlscy5kZWZhdWx0Q29sb3IoKSxvPWZ1bmN0aW9uKGUpe3JldHVybiBlLnh9LHU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUueX0sYT1mdW5jdGlvbihlLHQpe3JldHVybiFpc05hTih1KGUsdCkpJiZ1KGUsdCkhPT1udWxsfSxmPWZ1bmN0aW9uKGUpe3JldHVybiBlLmFyZWF9LGw9ITEsYyxoLHA9ImxpbmVhciIKO3Quc2l6ZSgxNikuc2l6ZURvbWFpbihbMTYsMjU2XSk7dmFyIGQsdjtyZXR1cm4gbS5kaXNwYXRjaD10LmRpc3BhdGNoLG0uc2NhdHRlcj10LGQzLnJlYmluZChtLHQsImlkIiwiaW50ZXJhY3RpdmUiLCJzaXplIiwieFNjYWxlIiwieVNjYWxlIiwielNjYWxlIiwieERvbWFpbiIsInlEb21haW4iLCJ4UmFuZ2UiLCJ5UmFuZ2UiLCJzaXplRG9tYWluIiwiZm9yY2VYIiwiZm9yY2VZIiwiZm9yY2VTaXplIiwiY2xpcFZvcm9ub2kiLCJ1c2VWb3Jvbm9pIiwiY2xpcFJhZGl1cyIsInBhZERhdGEiLCJoaWdobGlnaHRQb2ludCIsImNsZWFySGlnaGxpZ2h0cyIpLG0ub3B0aW9ucz1lLnV0aWxzLm9wdGlvbnNGdW5jLmJpbmQobSksbS5tYXJnaW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4udG9wPXR5cGVvZiBlLnRvcCE9InVuZGVmaW5lZCI/ZS50b3A6bi50b3Asbi5yaWdodD10eXBlb2YgZS5yaWdodCE9InVuZGVmaW5lZCI/ZS5yaWdodDpuLnJpZ2h0LG4uYm90dG9tPXR5cGVvZiBlLmJvdHRvbSE9InVuZGVmaW5lZCI/ZS5ib3R0b206bi5ib3R0b20sbi5sZWZ0PXR5cGVvZiBlLmxlZnQhPSJ1bmRlZmluZWQiP2UubGVmdDpuLmxlZnQsbSk6bn0sbS53aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLG0pOnJ9LG0uaGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUsbSk6aX0sbS54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWUsdC54KGUpLG0pOm99LG0ueT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1lLHQueShlKSxtKTp1fSxtLmNsaXBFZGdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPWUsbSk6bH0sbS5jb2xvcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1lLnV0aWxzLmdldENvbG9yKG4pLHQuY29sb3IocyksbSk6c30sbS5pbnRlcnBvbGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1lLG0pOnB9LG0uZGVmaW5lZD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1lLG0pOmF9LG0uaXNBcmVhPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPWQzLmZ1bmN0b3IoZSksbSk6Zn0sbX0sZS5tb2RlbHMubGluZUNoYXJ0PWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIE4obSl7cmV0dXJuIG0uZWFjaChmdW5jdGlvbihtKXt2YXIgQz1kMy5zZWxlY3QodGhpcyksaz10aGlzLEw9KGF8fHBhcnNlSW50KEMuc3R5bGUoIndpZHRoIikpfHw5NjApLW8ubGVmdC1vLnJpZ2h0LEE9KGZ8fHBhcnNlSW50KEMuc3R5bGUoImhlaWdodCIpKXx8NDAwKS1vLnRvcC1vLmJvdHRvbTtOLnVwZGF0ZT1mdW5jdGlvbigpe0MudHJhbnNpdGlvbigpLmR1cmF0aW9uKHgpLmNhbGwoTil9LE4uY29udGFpbmVyPXRoaXMsYi5kaXNhYmxlZD1tLm1hcChmdW5jdGlvbihlKXtyZXR1cm4hIWUuZGlzYWJsZWR9KTtpZighdyl7dmFyIE87dz17fTtmb3IoTyBpbiBiKWJbT11pbnN0YW5jZW9mIEFycmF5P3dbT109YltPXS5zbGljZSgwKTp3W09dPWJbT119aWYoIW18fCFtLmxlbmd0aHx8IW0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlcy5sZW5ndGh9KS5sZW5ndGgpe3ZhciBNPUMuc2VsZWN0QWxsKCIubnYtbm9EYXRhIikuZGF0YShbRV0pO3JldHVybiBNLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLCJudmQzIG52LW5vRGF0YSIpLmF0dHIoImR5IiwiLS43ZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKSxNLmF0dHIoIngiLG8ubGVmdCtMLzIpLmF0dHIoInkiLG8udG9wK0EvMikudGV4dChmdW5jdGlvbihlKXtyZXR1cm4gZX0pLE59Qy5zZWxlY3RBbGwoIi5udi1ub0RhdGEiKS5yZW1vdmUoKSxnPXQueFNjYWxlKCkseT10LnlTY2FsZSgpO3ZhciBfPUMuc2VsZWN0QWxsKCJnLm52LXdyYXAubnYtbGluZUNoYXJ0IikuZGF0YShbbV0pLEQ9Xy5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnZkMyBudi13cmFwIG52LWxpbmVDaGFydCIpLmFwcGVuZCgiZyIpLFA9Xy5zZWxlY3QoImciKTtELmFwcGVuZCgicmVjdCIpLnN0eWxlKCJvcGFjaXR5IiwwKSxELmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYteCBudi1heGlzIiksRC5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXkgbnYtYXhpcyIpLEQuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1saW5lc1dyYXAiKSxELmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtbGVnZW5kV3JhcCIpLEQuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1pbnRlcmFjdGl2ZSIpLFAuc2VsZWN0KCJyZWN0IikuYXR0cigid2lkdGgiLEwpLmF0dHIoImhlaWdodCIsQSksbCYmKGkud2lkdGgoTCksUC5zZWxlY3QoIi5udi1sZWdlbmRXcmFwIikuZGF0dW0obSkuY2FsbChpKSxvLnRvcCE9aS5oZWlnaHQoKSYmKG8udG9wPWkuaGVpZ2h0KCksQT0oZnx8cGFyc2VJbnQoQy5zdHlsZSgiaGVpZ2h0IikpfHw0MDApLW8udG9wLW8uYm90dG9tKSxfLnNlbGVjdCgiLm52LWxlZ2VuZFdyYXAiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwiKyAtby50b3ArIikiKSksXy5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitvLmxlZnQrIiwiK28udG9wKyIpIikscCYmUC5zZWxlY3QoIi5udi15Lm52LWF4aXMiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitMKyIsMCkiKSxkJiYocy53aWR0aChMKS5oZWlnaHQoQSkubWFyZ2luKHtsZWZ0Om8ubGVmdCx0b3A6by50b3B9KS5zdmdDb250YWluZXIoQykueFNjYWxlKGcpLF8uc2VsZWN0KCIubnYtaW50ZXJhY3RpdmUiKS5jYWxsKHMpKSx0LndpZHRoKEwpLmhlaWdodChBKS5jb2xvcihtLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbG9yfHx1KGUsdCl9KS5maWx0ZXIoZnVuY3Rpb24oZSx0KXtyZXR1cm4hbVt0XS5kaXNhYmxlZH0pKTt2YXIgSD1QLnNlbGVjdCgiLm52LWxpbmVzV3JhcCIpLmRhdHVtKG0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmRpc2FibGVkfSkpO0gudHJhbnNpdGlvbigpLmNhbGwodCksYyYmKG4uc2NhbGUoZykudGlja3MoTC8xMDApLnRpY2tTaXplKC1BLDApLFAuc2VsZWN0KCIubnYteC5udi1heGlzIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDAsIit5LnJhbmdlKClbMF0rIikiKSxQLnNlbGVjdCgiLm52LXgubnYtYXhpcyIpLnRyYW5zaXRpb24oKS5jYWxsKG4pKSxoJiYoci5zY2FsZSh5KS50aWNrcyhBLzM2KS50aWNrU2l6ZSgtTCwwKSxQLnNlbGVjdCgiLm52LXkubnYtYXhpcyIpLnRyYW5zaXRpb24oKS5jYWxsKHIpKSxpLmRpc3BhdGNoLm9uKCJzdGF0ZUNoYW5nZSIsZnVuY3Rpb24oZSl7Yj1lLFMuc3RhdGVDaGFuZ2UoYiksTi51cGRhdGUoKX0pLHMuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW1vdmUiLGZ1bmN0aW9uKGkpe3QuY2xlYXJIaWdobGlnaHRzKCk7dmFyIGEsZixsLGM9W107bS5maWx0ZXIoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zZXJpZXNJbmRleD10LCFlLmRpc2FibGVkfSkuZm9yRWFjaChmdW5jdGlvbihuLHIpe2Y9ZS5pbnRlcmFjdGl2ZUJpc2VjdChuLnZhbHVlcyxpLnBvaW50WFZhbHVlLE4ueCgpKSx0LmhpZ2hsaWdodFBvaW50KHIsZiwhMCk7dmFyIHM9bi52YWx1ZXNbZl07aWYodHlwZW9mIHM9PSJ1bmRlZmluZWQiKXJldHVybjt0eXBlb2YgYT09InVuZGVmaW5lZCImJihhPXMpLHR5cGVvZiBsPT0idW5kZWZpbmVkIiYmKGw9Ti54U2NhbGUoKShOLngoKShzLGYpKSksYy5wdXNoKHtrZXk6bi5rZXksdmFsdWU6Ti55KCkocyxmKSxjb2xvcjp1KG4sbi5zZXJpZXNJbmRleCl9KX0pO3ZhciBoPW4udGlja0Zvcm1hdCgpKE4ueCgpKGEsZikpO3MudG9vbHRpcC5wb3NpdGlvbih7bGVmdDpsK28ubGVmdCx0b3A6aS5tb3VzZVkrby50b3B9KS5jaGFydENvbnRhaW5lcihrLnBhcmVudE5vZGUpLmVuYWJsZWQodikudmFsdWVGb3JtYXR0ZXIoZnVuY3Rpb24oZSx0KXtyZXR1cm4gci50aWNrRm9ybWF0KCkoZSl9KS5kYXRhKHt2YWx1ZTpoLHNlcmllczpjfSkoKSxzLnJlbmRlckd1aWRlTGluZShsKX0pLHMuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW91dCIsZnVuY3Rpb24oZSl7Uy50b29sdGlwSGlkZSgpLHQuY2xlYXJIaWdobGlnaHRzKCl9KSxTLm9uKCJ0b29sdGlwU2hvdyIsZnVuY3Rpb24oZSl7diYmVChlLGsucGFyZW50Tm9kZSl9KSxTLm9uKCJjaGFuZ2VTdGF0ZSIsZnVuY3Rpb24oZSl7dHlwZW9mIGUuZGlzYWJsZWQhPSJ1bmRlZmluZWQiJiYobS5mb3JFYWNoKGZ1bmN0aW9uKHQsbil7dC5kaXNhYmxlZD1lLmRpc2FibGVkW25dfSksYi5kaXNhYmxlZD1lLmRpc2FibGVkKSxOLnVwZGF0ZSgpfSl9KSxOfXZhciB0PWUubW9kZWxzLmxpbmUoKSxuPWUubW9kZWxzLmF4aXMoKSxyPWUubW9kZWxzLmF4aXMoKSxpPWUubW9kZWxzLmxlZ2VuZCgpLHM9ZS5pbnRlcmFjdGl2ZUd1aWRlbGluZSgpLG89e3RvcDozMCxyaWdodDoyMCxib3R0b206NTAsbGVmdDo2MH0sdT1lLnV0aWxzLmRlZmF1bHRDb2xvcigpLGE9bnVsbCxmPW51bGwsbD0hMCxjPSEwLGg9ITAscD0hMSxkPSExLHY9ITAsbT1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiI8aDM+IitlKyI8L2gzPiIrIjxwPiIrbisiIGF0ICIrdCsiPC9wPiJ9LGcseSxiPXt9LHc9bnVsbCxFPSJObyBEYXRhIEF2YWlsYWJsZS4iLFM9ZDMuZGlzcGF0Y2goInRvb2x0aXBTaG93IiwidG9vbHRpcEhpZGUiLCJzdGF0ZUNoYW5nZSIsImNoYW5nZVN0YXRlIikseD0yNTA7bi5vcmllbnQoImJvdHRvbSIpLnRpY2tQYWRkaW5nKDcpLHIub3JpZW50KHA/InJpZ2h0IjoibGVmdCIpO3ZhciBUPWZ1bmN0aW9uKGkscyl7dmFyIG89aS5wb3NbMF0rKHMub2Zmc2V0TGVmdHx8MCksdT1pLnBvc1sxXSsocy5vZmZzZXRUb3B8fDApLGE9bi50aWNrRm9ybWF0KCkodC54KCkoaS5wb2ludCxpLnBvaW50SW5kZXgpKSxmPXIudGlja0Zvcm1hdCgpKHQueSgpKGkucG9pbnQsaS5wb2ludEluZGV4KSksbD1tKGkuc2VyaWVzLmtleSxhLGYsaSxOKTtlLnRvb2x0aXAuc2hvdyhbbyx1XSxsLG51bGwsbnVsbCxzKX07cmV0dXJuIHQuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW92ZXIudG9vbHRpcCIsZnVuY3Rpb24oZSl7ZS5wb3M9W2UucG9zWzBdK28ubGVmdCxlLnBvc1sxXStvLnRvcF0sUy50b29sdGlwU2hvdyhlKX0pLHQuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW91dC50b29sdGlwIixmdW5jdGlvbihlKXtTLnRvb2x0aXBIaWRlKGUpfSksUy5vbigidG9vbHRpcEhpZGUiLGZ1bmN0aW9uKCl7diYmZS50b29sdGlwLmNsZWFudXAoKX0pLE4uZGlzcGF0Y2g9UyxOLmxpbmVzPXQsTi5sZWdlbmQ9aSxOLnhBeGlzPW4sTi55QXhpcz1yLE4uaW50ZXJhY3RpdmVMYXllcj1zLGQzLnJlYmluZChOLHQsImRlZmluZWQiLCJpc0FyZWEiLCJ4IiwieSIsInNpemUiLCJ4U2NhbGUiLCJ5U2NhbGUiLCJ4RG9tYWluIiwieURvbWFpbiIsInhSYW5nZSIsInlSYW5nZSIsImZvcmNlWCIsImZvcmNlWSIsImludGVyYWN0aXZlIiwiY2xpcEVkZ2UiLCJjbGlwVm9yb25vaSIsInVzZVZvcm9ub2kiLCJpZCIsImludGVycG9sYXRlIiksTi5vcHRpb25zPWUudXRpbHMub3B0aW9uc0Z1bmMuYmluZChOKSxOLm1hcmdpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oby50b3A9dHlwZW9mIGUudG9wIT0idW5kZWZpbmVkIj9lLnRvcDpvLnRvcCxvLnJpZ2h0PXR5cGVvZiBlLnJpZ2h0IT0idW5kZWZpbmVkIj9lLnJpZ2h0Om8ucmlnaHQsby5ib3R0b209dHlwZW9mIGUuYm90dG9tIT0idW5kZWZpbmVkIj9lLmJvdHRvbTpvLmJvdHRvbSxvLmxlZnQ9dHlwZW9mIGUubGVmdCE9InVuZGVmaW5lZCI/ZS5sZWZ0Om8ubGVmdCxOKTpvfSxOLndpZHRoPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWUsTik6YX0sTi5oZWlnaHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ZSxOKTpmfSxOLmNvbG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWUudXRpbHMuZ2V0Q29sb3IodCksaS5jb2xvcih1KSxOKTp1fSxOLnNob3dMZWdlbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ZSxOKTpsfSxOLnNob3dYQXhpcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1lLE4pOmN9LE4uc2hvd1lBeGlzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPWUsTik6aH0sTi5yaWdodEFsaWduWUF4aXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9ZSxyLm9yaWVudChlPyJyaWdodCI6ImxlZnQiKSxOKTpwfSxOLnVzZUludGVyYWN0aXZlR3VpZGVsaW5lPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPWUsZT09PSEwJiYoTi5pbnRlcmFjdGl2ZSghMSksTi51c2VWb3Jvbm9pKCExKSksTik6ZH0sTi50b29sdGlwcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj1lLE4pOnZ9LE4udG9vbHRpcENvbnRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09ZSxOKTptfSxOLnN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPWUsTik6Yn0sTi5kZWZhdWx0U3RhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHc9ZSxOKTp3fSxOLm5vRGF0YT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oRT1lLE4pOkV9LE4udHJhbnNpdGlvbkR1cmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PWUsTik6eH0sTn0sZS5tb2RlbHMubGluZVBsdXNCYXJDaGFydD1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBUKGUpe3JldHVybiBlLmVhY2goZnVuY3Rpb24oZSl7dmFyIGw9ZDMuc2VsZWN0KHRoaXMpLGM9dGhpcyx2PShhfHxwYXJzZUludChsLnN0eWxlKCJ3aWR0aCIpKXx8OTYwKS11LmxlZnQtdS5yaWdodCxOPShmfHxwYXJzZUludChsLnN0eWxlKCJoZWlnaHQiKSl8fDQwMCktdS50b3AtdS5ib3R0b207VC51cGRhdGU9ZnVuY3Rpb24oKXtsLnRyYW5zaXRpb24oKS5jYWxsKFQpfSxiLmRpc2FibGVkPWUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiEhZS5kaXNhYmxlZH0pO2lmKCF3KXt2YXIgQzt3PXt9O2ZvcihDIGluIGIpYltDXWluc3RhbmNlb2YgQXJyYXk/d1tDXT1iW0NdLnNsaWNlKDApOndbQ109YltDXX1pZighZXx8IWUubGVuZ3RofHwhZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUudmFsdWVzLmxlbmd0aH0pLmxlbmd0aCl7dmFyIGs9bC5zZWxlY3RBbGwoIi5udi1ub0RhdGEiKS5kYXRhKFtFXSk7cmV0dXJuIGsuZW50ZXIoKS5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsIm52ZDMgbnYtbm9EYXRhIikuYXR0cigiZHkiLCItLjdlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLGsuYXR0cigieCIsdS5sZWZ0K3YvMikuYXR0cigieSIsdS50b3ArTi8yKS50ZXh0KGZ1bmN0aW9uKGUpe3JldHVybiBlfSksVH1sLnNlbGVjdEFsbCgiLm52LW5vRGF0YSIpLnJlbW92ZSgpO3ZhciBMPWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmRpc2FibGVkJiZlLmJhcn0pLEE9ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuYmFyfSk7bT1BLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5kaXNhYmxlZH0pLmxlbmd0aCYmQS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuZGlzYWJsZWR9KVswXS52YWx1ZXMubGVuZ3RoP3QueFNjYWxlKCk6bi54U2NhbGUoKSxnPW4ueVNjYWxlKCkseT10LnlTY2FsZSgpO3ZhciBPPWQzLnNlbGVjdCh0aGlzKS5zZWxlY3RBbGwoImcubnYtd3JhcC5udi1saW5lUGx1c0JhciIpLmRhdGEoW2VdKSxNPU8uZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52ZDMgbnYtd3JhcCBudi1saW5lUGx1c0JhciIpLmFwcGVuZCgiZyIpLF89Ty5zZWxlY3QoImciKTtNLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYteCBudi1heGlzIiksTS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXkxIG52LWF4aXMiKSxNLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYteTIgbnYtYXhpcyIpLE0uYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1iYXJzV3JhcCIpLE0uYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1saW5lc1dyYXAiKSxNLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtbGVnZW5kV3JhcCIpLHAmJihvLndpZHRoKHYvMiksXy5zZWxlY3QoIi5udi1sZWdlbmRXcmFwIikuZGF0dW0oZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUub3JpZ2luYWxLZXk9ZS5vcmlnaW5hbEtleT09PXVuZGVmaW5lZD9lLmtleTplLm9yaWdpbmFsS2V5LGUua2V5PWUub3JpZ2luYWxLZXkrKGUuYmFyPyIgKGxlZnQgYXhpcykiOiIgKHJpZ2h0IGF4aXMpIiksZX0pKS5jYWxsKG8pLHUudG9wIT1vLmhlaWdodCgpJiYodS50b3A9by5oZWlnaHQoKSxOPShmfHxwYXJzZUludChsLnN0eWxlKCJoZWlnaHQiKSl8fDQwMCktdS50b3AtdS5ib3R0b20pLF8uc2VsZWN0KCIubnYtbGVnZW5kV3JhcCIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3YvMisiLCIrIC11LnRvcCsiKSIpKSxPLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3UubGVmdCsiLCIrdS50b3ArIikiKSx0LndpZHRoKHYpLmhlaWdodChOKS5jb2xvcihlLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbG9yfHxoKGUsdCl9KS5maWx0ZXIoZnVuY3Rpb24odCxuKXtyZXR1cm4hZVtuXS5kaXNhYmxlZCYmIWVbbl0uYmFyfSkpLG4ud2lkdGgodikuaGVpZ2h0KE4pLmNvbG9yKGUubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29sb3J8fGgoZSx0KX0pLmZpbHRlcihmdW5jdGlvbih0LG4pe3JldHVybiFlW25dLmRpc2FibGVkJiZlW25dLmJhcn0pKTt2YXIgRD1fLnNlbGVjdCgiLm52LWJhcnNXcmFwIikuZGF0dW0oTC5sZW5ndGg/TDpbe3ZhbHVlczpbXX1dKSxQPV8uc2VsZWN0KCIubnYtbGluZXNXcmFwIikuZGF0dW0oQVswXSYmIUFbMF0uZGlzYWJsZWQ/QTpbe3ZhbHVlczpbXX1dKTtkMy50cmFuc2l0aW9uKEQpLmNhbGwobiksZDMudHJhbnNpdGlvbihQKS5jYWxsKHQpLHIuc2NhbGUobSkudGlja3Modi8xMDApLnRpY2tTaXplKC1OLDApLF8uc2VsZWN0KCIubnYteC5udi1heGlzIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDAsIitnLnJhbmdlKClbMF0rIikiKSxkMy50cmFuc2l0aW9uKF8uc2VsZWN0KCIubnYteC5udi1heGlzIikpLmNhbGwociksaS5zY2FsZShnKS50aWNrcyhOLzM2KS50aWNrU2l6ZSgtdiwwKSxkMy50cmFuc2l0aW9uKF8uc2VsZWN0KCIubnYteTEubnYtYXhpcyIpKS5zdHlsZSgib3BhY2l0eSIsTC5sZW5ndGg/MTowKS5jYWxsKGkpLHMuc2NhbGUoeSkudGlja3MoTi8zNikudGlja1NpemUoTC5sZW5ndGg/MDotdiwwKSxfLnNlbGVjdCgiLm52LXkyLm52LWF4aXMiKS5zdHlsZSgib3BhY2l0eSIsQS5sZW5ndGg/MTowKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit2KyIsMCkiKSxkMy50cmFuc2l0aW9uKF8uc2VsZWN0KCIubnYteTIubnYtYXhpcyIpKS5jYWxsKHMpLG8uZGlzcGF0Y2gub24oInN0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXtiPWUsUy5zdGF0ZUNoYW5nZShiKSxULnVwZGF0ZSgpfSksUy5vbigidG9vbHRpcFNob3ciLGZ1bmN0aW9uKGUpe2QmJngoZSxjLnBhcmVudE5vZGUpfSksUy5vbigiY2hhbmdlU3RhdGUiLGZ1bmN0aW9uKHQpe3R5cGVvZiB0LmRpc2FibGVkIT0idW5kZWZpbmVkIiYmKGUuZm9yRWFjaChmdW5jdGlvbihlLG4pe2UuZGlzYWJsZWQ9dC5kaXNhYmxlZFtuXX0pLGIuZGlzYWJsZWQ9dC5kaXNhYmxlZCksVC51cGRhdGUoKX0pfSksVH12YXIgdD1lLm1vZGVscy5saW5lKCksbj1lLm1vZGVscy5oaXN0b3JpY2FsQmFyKCkscj1lLm1vZGVscy5heGlzKCksaT1lLm1vZGVscy5heGlzKCkscz1lLm1vZGVscy5heGlzKCksbz1lLm1vZGVscy5sZWdlbmQoKSx1PXt0b3A6MzAscmlnaHQ6NjAsYm90dG9tOjUwLGxlZnQ6NjB9LGE9bnVsbCxmPW51bGwsbD1mdW5jdGlvbihlKXtyZXR1cm4gZS54fSxjPWZ1bmN0aW9uKGUpe3JldHVybiBlLnl9LGg9ZS51dGlscy5kZWZhdWx0Q29sb3IoKSxwPSEwLGQ9ITAsdj1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiI8aDM+IitlKyI8L2gzPiIrIjxwPiIrbisiIGF0ICIrdCsiPC9wPiJ9LG0sZyx5LGI9e30sdz1udWxsLEU9Ik5vIERhdGEgQXZhaWxhYmxlLiIsUz1kMy5kaXNwYXRjaCgidG9vbHRpcFNob3ciLCJ0b29sdGlwSGlkZSIsInN0YXRlQ2hhbmdlIiwiY2hhbmdlU3RhdGUiKTtuLnBhZERhdGEoITApLHQuY2xpcEVkZ2UoITEpLnBhZERhdGEoITApLHIub3JpZW50KCJib3R0b20iKS50aWNrUGFkZGluZyg3KS5oaWdobGlnaHRaZXJvKCExKSxpLm9yaWVudCgibGVmdCIpLHMub3JpZW50KCJyaWdodCIpO3ZhciB4PWZ1bmN0aW9uKG4sbyl7dmFyIHU9bi5wb3NbMF0rKG8ub2Zmc2V0TGVmdHx8MCksYT1uLnBvc1sxXSsoby5vZmZzZXRUb3B8fDApLGY9ci50aWNrRm9ybWF0KCkodC54KCkobi5wb2ludCxuLnBvaW50SW5kZXgpKSxsPShuLnNlcmllcy5iYXI/aTpzKS50aWNrRm9ybWF0KCkodC55KCkobi5wb2ludCxuLnBvaW50SW5kZXgpKSxjPXYobi5zZXJpZXMua2V5LGYsbCxuLFQpO2UudG9vbHRpcC5zaG93KFt1LGFdLGMsbi52YWx1ZTwwPyJuIjoicyIsbnVsbCxvKX07cmV0dXJuIHQuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW92ZXIudG9vbHRpcCIsZnVuY3Rpb24oZSl7ZS5wb3M9W2UucG9zWzBdK3UubGVmdCxlLnBvc1sxXSt1LnRvcF0sUy50b29sdGlwU2hvdyhlKX0pLHQuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW91dC50b29sdGlwIixmdW5jdGlvbihlKXtTLnRvb2x0aXBIaWRlKGUpfSksbi5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlb3Zlci50b29sdGlwIixmdW5jdGlvbihlKXtlLnBvcz1bZS5wb3NbMF0rdS5sZWZ0LGUucG9zWzFdK3UudG9wXSxTLnRvb2x0aXBTaG93KGUpfSksbi5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlb3V0LnRvb2x0aXAiLGZ1bmN0aW9uKGUpe1MudG9vbHRpcEhpZGUoZSl9KSxTLm9uKCJ0b29sdGlwSGlkZSIsZnVuY3Rpb24oKXtkJiZlLnRvb2x0aXAuY2xlYW51cCgpfSksVC5kaXNwYXRjaD1TLFQubGVnZW5kPW8sVC5saW5lcz10LFQuYmFycz1uLFQueEF4aXM9cixULnkxQXhpcz1pLFQueTJBeGlzPXMsZDMucmViaW5kKFQsdCwiZGVmaW5lZCIsInNpemUiLCJjbGlwVm9yb25vaSIsImludGVycG9sYXRlIiksVC5vcHRpb25zPWUudXRpbHMub3B0aW9uc0Z1bmMuYmluZChUKSxULng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ZSx0LngoZSksbi54KGUpLFQpOmx9LFQueT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1lLHQueShlKSxuLnkoZSksVCk6Y30sVC5tYXJnaW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHUudG9wPXR5cGVvZiBlLnRvcCE9InVuZGVmaW5lZCI/ZS50b3A6dS50b3AsdS5yaWdodD10eXBlb2YgZS5yaWdodCE9InVuZGVmaW5lZCI/ZS5yaWdodDp1LnJpZ2h0LHUuYm90dG9tPXR5cGVvZiBlLmJvdHRvbSE9InVuZGVmaW5lZCI/ZS5ib3R0b206dS5ib3R0b20sdS5sZWZ0PXR5cGVvZiBlLmxlZnQhPSJ1bmRlZmluZWQiP2UubGVmdDp1LmxlZnQsVCk6dX0sVC53aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1lLFQpOmF9LFQuaGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPWUsVCk6Zn0sVC5jb2xvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1lLnV0aWxzLmdldENvbG9yKHQpLG8uY29sb3IoaCksVCk6aH0sVC5zaG93TGVnZW5kPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPWUsVCk6cH0sVC50b29sdGlwcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1lLFQpOmR9LFQudG9vbHRpcENvbnRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9ZSxUKTp2fSxULnN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPWUsVCk6Yn0sVC5kZWZhdWx0U3RhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHc9ZSxUKTp3fSxULm5vRGF0YT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oRT1lLFQpOkV9LFR9LGUubW9kZWxzLmxpbmVXaXRoRm9jdXNDaGFydD1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBrKGUpe3JldHVybiBlLmVhY2goZnVuY3Rpb24oZSl7ZnVuY3Rpb24gVShlKXt2YXIgdD0rKGU9PSJlIiksbj10PzE6LTEscj1NLzM7cmV0dXJuIk0iKy41Km4rIiwiK3IrIkE2LDYgMCAwICIrdCsiICIrNi41Km4rIiwiKyhyKzYpKyJWIisoMipyLTYpKyJBNiw2IDAgMCAiK3QrIiAiKy41Km4rIiwiKzIqcisiWiIrIk0iKzIuNSpuKyIsIisocis4KSsiViIrKDIqci04KSsiTSIrNC41Km4rIiwiKyhyKzgpKyJWIisoMipyLTgpfWZ1bmN0aW9uIHooKXthLmVtcHR5KCl8fGEuZXh0ZW50KHcpLEkuZGF0YShbYS5lbXB0eSgpP2cuZG9tYWluKCk6d10pLmVhY2goZnVuY3Rpb24oZSx0KXt2YXIgbj1nKGVbMF0pLXYucmFuZ2UoKVswXSxyPXYucmFuZ2UoKVsxXS1nKGVbMV0pO2QzLnNlbGVjdCh0aGlzKS5zZWxlY3QoIi5sZWZ0IikuYXR0cigid2lkdGgiLG48MD8wOm4pLGQzLnNlbGVjdCh0aGlzKS5zZWxlY3QoIi5yaWdodCIpLmF0dHIoIngiLGcoZVsxXSkpLmF0dHIoIndpZHRoIixyPDA/MDpyKX0pfWZ1bmN0aW9uIFcoKXt3PWEuZW1wdHkoKT9udWxsOmEuZXh0ZW50KCk7dmFyIG49YS5lbXB0eSgpP2cuZG9tYWluKCk6YS5leHRlbnQoKTtpZihNYXRoLmFicyhuWzBdLW5bMV0pPD0xKXJldHVybjtULmJydXNoKHtleHRlbnQ6bixicnVzaDphfSkseigpO3ZhciBzPUguc2VsZWN0KCIubnYtZm9jdXMgLm52LWxpbmVzV3JhcCIpLmRhdHVtKGUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmRpc2FibGVkfSkubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJue2tleTplLmtleSx2YWx1ZXM6ZS52YWx1ZXMuZmlsdGVyKGZ1bmN0aW9uKGUscil7cmV0dXJuIHQueCgpKGUscik+PW5bMF0mJnQueCgpKGUscik8PW5bMV19KX19KSk7cy50cmFuc2l0aW9uKCkuZHVyYXRpb24oTikuY2FsbCh0KSxILnNlbGVjdCgiLm52LWZvY3VzIC5udi14Lm52LWF4aXMiKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oTikuY2FsbChyKSxILnNlbGVjdCgiLm52LWZvY3VzIC5udi15Lm52LWF4aXMiKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oTikuY2FsbChpKX12YXIgUz1kMy5zZWxlY3QodGhpcyksTD10aGlzLEE9KGh8fHBhcnNlSW50KFMuc3R5bGUoIndpZHRoIikpfHw5NjApLWYubGVmdC1mLnJpZ2h0LE89KHB8fHBhcnNlSW50KFMuc3R5bGUoImhlaWdodCIpKXx8NDAwKS1mLnRvcC1mLmJvdHRvbS1kLE09ZC1sLnRvcC1sLmJvdHRvbTtrLnVwZGF0ZT1mdW5jdGlvbigpe1MudHJhbnNpdGlvbigpLmR1cmF0aW9uKE4pLmNhbGwoayl9LGsuY29udGFpbmVyPXRoaXM7aWYoIWV8fCFlLmxlbmd0aHx8IWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlcy5sZW5ndGh9KS5sZW5ndGgpe3ZhciBfPVMuc2VsZWN0QWxsKCIubnYtbm9EYXRhIikuZGF0YShbeF0pO3JldHVybiBfLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLCJudmQzIG52LW5vRGF0YSIpLmF0dHIoImR5IiwiLS43ZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKSxfLmF0dHIoIngiLGYubGVmdCtBLzIpLmF0dHIoInkiLGYudG9wK08vMikudGV4dChmdW5jdGlvbihlKXtyZXR1cm4gZX0pLGt9Uy5zZWxlY3RBbGwoIi5udi1ub0RhdGEiKS5yZW1vdmUoKSx2PXQueFNjYWxlKCksbT10LnlTY2FsZSgpLGc9bi54U2NhbGUoKSx5PW4ueVNjYWxlKCk7dmFyIEQ9Uy5zZWxlY3RBbGwoImcubnYtd3JhcC5udi1saW5lV2l0aEZvY3VzQ2hhcnQiKS5kYXRhKFtlXSksUD1ELmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudmQzIG52LXdyYXAgbnYtbGluZVdpdGhGb2N1c0NoYXJ0IikuYXBwZW5kKCJnIiksSD1ELnNlbGVjdCgiZyIpO1AuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1sZWdlbmRXcmFwIik7dmFyIEI9UC5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LWZvY3VzIik7Qi5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXggbnYtYXhpcyIpLEIuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi15IG52LWF4aXMiKSxCLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtbGluZXNXcmFwIik7dmFyIGo9UC5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LWNvbnRleHQiKTtqLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYteCBudi1heGlzIiksai5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXkgbnYtYXhpcyIpLGouYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1saW5lc1dyYXAiKSxqLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtYnJ1c2hCYWNrZ3JvdW5kIiksai5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXggbnYtYnJ1c2giKSxiJiYodS53aWR0aChBKSxILnNlbGVjdCgiLm52LWxlZ2VuZFdyYXAiKS5kYXR1bShlKS5jYWxsKHUpLGYudG9wIT11LmhlaWdodCgpJiYoZi50b3A9dS5oZWlnaHQoKSxPPShwfHxwYXJzZUludChTLnN0eWxlKCJoZWlnaHQiKSl8fDQwMCktZi50b3AtZi5ib3R0b20tZCksSC5zZWxlY3QoIi5udi1sZWdlbmRXcmFwIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDAsIisgLWYudG9wKyIpIikpLEQuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrZi5sZWZ0KyIsIitmLnRvcCsiKSIpLHQud2lkdGgoQSkuaGVpZ2h0KE8pLmNvbG9yKGUubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29sb3J8fGMoZSx0KX0pLmZpbHRlcihmdW5jdGlvbih0LG4pe3JldHVybiFlW25dLmRpc2FibGVkfSkpLG4uZGVmaW5lZCh0LmRlZmluZWQoKSkud2lkdGgoQSkuaGVpZ2h0KE0pLmNvbG9yKGUubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29sb3J8fGMoZSx0KX0pLmZpbHRlcihmdW5jdGlvbih0LG4pe3JldHVybiFlW25dLmRpc2FibGVkfSkpLEguc2VsZWN0KCIubnYtY29udGV4dCIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIrKE8rZi5ib3R0b20rbC50b3ApKyIpIik7dmFyIEY9SC5zZWxlY3QoIi5udi1jb250ZXh0IC5udi1saW5lc1dyYXAiKS5kYXR1bShlLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5kaXNhYmxlZH0pKTtkMy50cmFuc2l0aW9uKEYpLmNhbGwobiksci5zY2FsZSh2KS50aWNrcyhBLzEwMCkudGlja1NpemUoLU8sMCksaS5zY2FsZShtKS50aWNrcyhPLzM2KS50aWNrU2l6ZSgtQSwwKSxILnNlbGVjdCgiLm52LWZvY3VzIC5udi14Lm52LWF4aXMiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwiK08rIikiKSxhLngoZykub24oImJydXNoIixmdW5jdGlvbigpe3ZhciBlPWsudHJhbnNpdGlvbkR1cmF0aW9uKCk7ay50cmFuc2l0aW9uRHVyYXRpb24oMCksVygpLGsudHJhbnNpdGlvbkR1cmF0aW9uKGUpfSksdyYmYS5leHRlbnQodyk7dmFyIEk9SC5zZWxlY3QoIi5udi1icnVzaEJhY2tncm91bmQiKS5zZWxlY3RBbGwoImciKS5kYXRhKFt3fHxhLmV4dGVudCgpXSkscT1JLmVudGVyKCkuYXBwZW5kKCJnIik7cS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImxlZnQiKS5hdHRyKCJ4IiwwKS5hdHRyKCJ5IiwwKS5hdHRyKCJoZWlnaHQiLE0pLHEuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJyaWdodCIpLmF0dHIoIngiLDApLmF0dHIoInkiLDApLmF0dHIoImhlaWdodCIsTSk7dmFyIFI9SC5zZWxlY3QoIi5udi14Lm52LWJydXNoIikuY2FsbChhKTtSLnNlbGVjdEFsbCgicmVjdCIpLmF0dHIoImhlaWdodCIsTSksUi5zZWxlY3RBbGwoIi5yZXNpemUiKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJkIixVKSxXKCkscy5zY2FsZShnKS50aWNrcyhBLzEwMCkudGlja1NpemUoLU0sMCksSC5zZWxlY3QoIi5udi1jb250ZXh0IC5udi14Lm52LWF4aXMiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwiK3kucmFuZ2UoKVswXSsiKSIpLGQzLnRyYW5zaXRpb24oSC5zZWxlY3QoIi5udi1jb250ZXh0IC5udi14Lm52LWF4aXMiKSkuY2FsbChzKSxvLnNjYWxlKHkpLnRpY2tzKE0vMzYpLnRpY2tTaXplKC1BLDApLGQzLnRyYW5zaXRpb24oSC5zZWxlY3QoIi5udi1jb250ZXh0IC5udi15Lm52LWF4aXMiKSkuY2FsbChvKSxILnNlbGVjdCgiLm52LWNvbnRleHQgLm52LXgubnYtYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIreS5yYW5nZSgpWzBdKyIpIiksdS5kaXNwYXRjaC5vbigic3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe2sudXBkYXRlKCl9KSxULm9uKCJ0b29sdGlwU2hvdyIsZnVuY3Rpb24oZSl7RSYmQyhlLEwucGFyZW50Tm9kZSl9KX0pLGt9dmFyIHQ9ZS5tb2RlbHMubGluZSgpLG49ZS5tb2RlbHMubGluZSgpLHI9ZS5tb2RlbHMuYXhpcygpLGk9ZS5tb2RlbHMuYXhpcygpLHM9ZS5tb2RlbHMuYXhpcygpLG89ZS5tb2RlbHMuYXhpcygpLHU9ZS5tb2RlbHMubGVnZW5kKCksYT1kMy5zdmcuYnJ1c2goKSxmPXt0b3A6MzAscmlnaHQ6MzAsYm90dG9tOjMwLGxlZnQ6NjB9LGw9e3RvcDowLHJpZ2h0OjMwLGJvdHRvbToyMCxsZWZ0OjYwfSxjPWUudXRpbHMuZGVmYXVsdENvbG9yKCksaD1udWxsLHA9bnVsbCxkPTEwMCx2LG0sZyx5LGI9ITAsdz1udWxsLEU9ITAsUz1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiI8aDM+IitlKyI8L2gzPiIrIjxwPiIrbisiIGF0ICIrdCsiPC9wPiJ9LHg9Ik5vIERhdGEgQXZhaWxhYmxlLiIsVD1kMy5kaXNwYXRjaCgidG9vbHRpcFNob3ciLCJ0b29sdGlwSGlkZSIsImJydXNoIiksTj0yNTA7dC5jbGlwRWRnZSghMCksbi5pbnRlcmFjdGl2ZSghMSksci5vcmllbnQoImJvdHRvbSIpLnRpY2tQYWRkaW5nKDUpLGkub3JpZW50KCJsZWZ0Iikscy5vcmllbnQoImJvdHRvbSIpLnRpY2tQYWRkaW5nKDUpLG8ub3JpZW50KCJsZWZ0Iik7dmFyIEM9ZnVuY3Rpb24obixzKXt2YXIgbz1uLnBvc1swXSsocy5vZmZzZXRMZWZ0fHwwKSx1PW4ucG9zWzFdKyhzLm9mZnNldFRvcHx8MCksYT1yLnRpY2tGb3JtYXQoKSh0LngoKShuLnBvaW50LG4ucG9pbnRJbmRleCkpLGY9aS50aWNrRm9ybWF0KCkodC55KCkobi5wb2ludCxuLnBvaW50SW5kZXgpKSxsPVMobi5zZXJpZXMua2V5LGEsZixuLGspO2UudG9vbHRpcC5zaG93KFtvLHVdLGwsbnVsbCxudWxsLHMpfTtyZXR1cm4gdC5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlb3Zlci50b29sdGlwIixmdW5jdGlvbihlKXtlLnBvcz1bZS5wb3NbMF0rZi5sZWZ0LGUucG9zWzFdK2YudG9wXSxULnRvb2x0aXBTaG93KGUpfSksdC5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlb3V0LnRvb2x0aXAiLGZ1bmN0aW9uKGUpe1QudG9vbHRpcEhpZGUoZSl9KSxULm9uKCJ0b29sdGlwSGlkZSIsZnVuY3Rpb24oKXtFJiZlLnRvb2x0aXAuY2xlYW51cCgpfSksay5kaXNwYXRjaD1ULGsubGVnZW5kPXUsay5saW5lcz10LGsubGluZXMyPW4say54QXhpcz1yLGsueUF4aXM9aSxrLngyQXhpcz1zLGsueTJBeGlzPW8sZDMucmViaW5kKGssdCwiZGVmaW5lZCIsImlzQXJlYSIsInNpemUiLCJ4RG9tYWluIiwieURvbWFpbiIsInhSYW5nZSIsInlSYW5nZSIsImZvcmNlWCIsImZvcmNlWSIsImludGVyYWN0aXZlIiwiY2xpcEVkZ2UiLCJjbGlwVm9yb25vaSIsImlkIiksay5vcHRpb25zPWUudXRpbHMub3B0aW9uc0Z1bmMuYmluZChrKSxrLng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQueChlKSxuLngoZSksayk6dC54fSxrLnk9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQueShlKSxuLnkoZSksayk6dC55fSxrLm1hcmdpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZi50b3A9dHlwZW9mIGUudG9wIT0idW5kZWZpbmVkIj9lLnRvcDpmLnRvcCxmLnJpZ2h0PXR5cGVvZiBlLnJpZ2h0IT0idW5kZWZpbmVkIj9lLnJpZ2h0OmYucmlnaHQsZi5ib3R0b209dHlwZW9mIGUuYm90dG9tIT0idW5kZWZpbmVkIj9lLmJvdHRvbTpmLmJvdHRvbSxmLmxlZnQ9dHlwZW9mIGUubGVmdCE9InVuZGVmaW5lZCI/ZS5sZWZ0OmYubGVmdCxrKTpmfSxrLm1hcmdpbjI9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ZSxrKTpsfSxrLndpZHRoPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPWUsayk6aH0say5oZWlnaHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9ZSxrKTpwfSxrLmhlaWdodDI9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9ZSxrKTpkfSxrLmNvbG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPWUudXRpbHMuZ2V0Q29sb3IodCksdS5jb2xvcihjKSxrKTpjfSxrLnNob3dMZWdlbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9ZSxrKTpifSxrLnRvb2x0aXBzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhFPWUsayk6RX0say50b29sdGlwQ29udGVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oUz1lLGspOlN9LGsuaW50ZXJwb2xhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQuaW50ZXJwb2xhdGUoZSksbi5pbnRlcnBvbGF0ZShlKSxrKTp0LmludGVycG9sYXRlKCl9LGsubm9EYXRhPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PWUsayk6eH0say54VGlja0Zvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oci50aWNrRm9ybWF0KGUpLHMudGlja0Zvcm1hdChlKSxrKTpyLnRpY2tGb3JtYXQoKX0say55VGlja0Zvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaS50aWNrRm9ybWF0KGUpLG8udGlja0Zvcm1hdChlKSxrKTppLnRpY2tGb3JtYXQoKX0say5icnVzaEV4dGVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odz1lLGspOnd9LGsudHJhbnNpdGlvbkR1cmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhOPWUsayk6Tn0sa30sZS5tb2RlbHMubGluZVBsdXNCYXJXaXRoRm9jdXNDaGFydD1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBCKGUpe3JldHVybiBlLmVhY2goZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbnQoZSl7dmFyIHQ9KyhlPT0iZSIpLG49dD8xOi0xLHI9cS8zO3JldHVybiJNIisuNSpuKyIsIityKyJBNiw2IDAgMCAiK3QrIiAiKzYuNSpuKyIsIisocis2KSsiViIrKDIqci02KSsiQTYsNiAwIDAgIit0KyIgIisuNSpuKyIsIisyKnIrIloiKyJNIisyLjUqbisiLCIrKHIrOCkrIlYiKygyKnItOCkrIk0iKzQuNSpuKyIsIisocis4KSsiViIrKDIqci04KX1mdW5jdGlvbiBydCgpe2guZW1wdHkoKXx8aC5leHRlbnQoeCksWi5kYXRhKFtoLmVtcHR5KCk/ay5kb21haW4oKTp4XSkuZWFjaChmdW5jdGlvbihlLHQpe3ZhciBuPWsoZVswXSktay5yYW5nZSgpWzBdLHI9ay5yYW5nZSgpWzFdLWsoZVsxXSk7ZDMuc2VsZWN0KHRoaXMpLnNlbGVjdCgiLmxlZnQiKS5hdHRyKCJ3aWR0aCIsbjwwPzA6biksZDMuc2VsZWN0KHRoaXMpLnNlbGVjdCgiLnJpZ2h0IikuYXR0cigieCIsayhlWzFdKSkuYXR0cigid2lkdGgiLHI8MD8wOnIpfSl9ZnVuY3Rpb24gaXQoKXt4PWguZW1wdHkoKT9udWxsOmguZXh0ZW50KCksUz1oLmVtcHR5KCk/ay5kb21haW4oKTpoLmV4dGVudCgpLEQuYnJ1c2goe2V4dGVudDpTLGJydXNoOmh9KSxydCgpLHIud2lkdGgoRikuaGVpZ2h0KEkpLmNvbG9yKGUubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29sb3J8fHcoZSx0KX0pLmZpbHRlcihmdW5jdGlvbih0LG4pe3JldHVybiFlW25dLmRpc2FibGVkJiZlW25dLmJhcn0pKSx0LndpZHRoKEYpLmhlaWdodChJKS5jb2xvcihlLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbG9yfHx3KGUsdCl9KS5maWx0ZXIoZnVuY3Rpb24odCxuKXtyZXR1cm4hZVtuXS5kaXNhYmxlZCYmIWVbbl0uYmFyfSkpO3ZhciBuPUouc2VsZWN0KCIubnYtZm9jdXMgLm52LWJhcnNXcmFwIikuZGF0dW0oVS5sZW5ndGg/VS5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm57a2V5OmUua2V5LHZhbHVlczplLnZhbHVlcy5maWx0ZXIoZnVuY3Rpb24oZSx0KXtyZXR1cm4gci54KCkoZSx0KT49U1swXSYmci54KCkoZSx0KTw9U1sxXX0pfX0pOlt7dmFsdWVzOltdfV0pLGk9Si5zZWxlY3QoIi5udi1mb2N1cyAubnYtbGluZXNXcmFwIikuZGF0dW0oelswXS5kaXNhYmxlZD9be3ZhbHVlczpbXX1dOnoubWFwKGZ1bmN0aW9uKGUsbil7cmV0dXJue2tleTplLmtleSx2YWx1ZXM6ZS52YWx1ZXMuZmlsdGVyKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQueCgpKGUsbik+PVNbMF0mJnQueCgpKGUsbik8PVNbMV19KX19KSk7VS5sZW5ndGg/Qz1yLnhTY2FsZSgpOkM9dC54U2NhbGUoKSxzLnNjYWxlKEMpLnRpY2tzKEYvMTAwKS50aWNrU2l6ZSgtSSwwKSxzLmRvbWFpbihbTWF0aC5jZWlsKFNbMF0pLE1hdGguZmxvb3IoU1sxXSldKSxKLnNlbGVjdCgiLm52LXgubnYtYXhpcyIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihQKS5jYWxsKHMpLG4udHJhbnNpdGlvbigpLmR1cmF0aW9uKFApLmNhbGwociksaS50cmFuc2l0aW9uKCkuZHVyYXRpb24oUCkuY2FsbCh0KSxKLnNlbGVjdCgiLm52LWZvY3VzIC5udi14Lm52LWF4aXMiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwiK0wucmFuZ2UoKVswXSsiKSIpLHUuc2NhbGUoTCkudGlja3MoSS8zNikudGlja1NpemUoLUYsMCksSi5zZWxlY3QoIi5udi1mb2N1cyAubnYteTEubnYtYXhpcyIpLnN0eWxlKCJvcGFjaXR5IixVLmxlbmd0aD8xOjApLGEuc2NhbGUoQSkudGlja3MoSS8zNikudGlja1NpemUoVS5sZW5ndGg/MDotRiwwKSxKLnNlbGVjdCgiLm52LWZvY3VzIC5udi15Mi5udi1heGlzIikuc3R5bGUoIm9wYWNpdHkiLHoubGVuZ3RoPzE6MCkuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrQy5yYW5nZSgpWzFdKyIsMCkiKSxKLnNlbGVjdCgiLm52LWZvY3VzIC5udi15MS5udi1heGlzIikudHJhbnNpdGlvbigpLmR1cmF0aW9uKFApLmNhbGwodSksSi5zZWxlY3QoIi5udi1mb2N1cyAubnYteTIubnYtYXhpcyIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihQKS5jYWxsKGEpfXZhciBOPWQzLnNlbGVjdCh0aGlzKSxqPXRoaXMsRj0odnx8cGFyc2VJbnQoTi5zdHlsZSgid2lkdGgiKSl8fDk2MCktcC5sZWZ0LXAucmlnaHQsST0obXx8cGFyc2VJbnQoTi5zdHlsZSgiaGVpZ2h0IikpfHw0MDApLXAudG9wLXAuYm90dG9tLWcscT1nLWQudG9wLWQuYm90dG9tO0IudXBkYXRlPWZ1bmN0aW9uKCl7Ti50cmFuc2l0aW9uKCkuZHVyYXRpb24oUCkuY2FsbChCKX0sQi5jb250YWluZXI9dGhpcztpZighZXx8IWUubGVuZ3RofHwhZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUudmFsdWVzLmxlbmd0aH0pLmxlbmd0aCl7dmFyIFI9Ti5zZWxlY3RBbGwoIi5udi1ub0RhdGEiKS5kYXRhKFtfXSk7cmV0dXJuIFIuZW50ZXIoKS5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsIm52ZDMgbnYtbm9EYXRhIikuYXR0cigiZHkiLCItLjdlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLFIuYXR0cigieCIscC5sZWZ0K0YvMikuYXR0cigieSIscC50b3ArSS8yKS50ZXh0KGZ1bmN0aW9uKGUpe3JldHVybiBlfSksQn1OLnNlbGVjdEFsbCgiLm52LW5vRGF0YSIpLnJlbW92ZSgpO3ZhciBVPWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmRpc2FibGVkJiZlLmJhcn0pLHo9ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuYmFyfSk7Qz1yLnhTY2FsZSgpLGs9by5zY2FsZSgpLEw9ci55U2NhbGUoKSxBPXQueVNjYWxlKCksTz1pLnlTY2FsZSgpLE09bi55U2NhbGUoKTt2YXIgVz1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5kaXNhYmxlZCYmZS5iYXJ9KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudmFsdWVzLm1hcChmdW5jdGlvbihlLHQpe3JldHVybnt4OnkoZSx0KSx5OmIoZSx0KX19KX0pLFg9ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuZGlzYWJsZWQmJiFlLmJhcn0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZXMubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJue3g6eShlLHQpLHk6YihlLHQpfX0pfSk7Qy5yYW5nZShbMCxGXSksay5kb21haW4oZDMuZXh0ZW50KGQzLm1lcmdlKFcuY29uY2F0KFgpKSxmdW5jdGlvbihlKXtyZXR1cm4gZS54fSkpLnJhbmdlKFswLEZdKTt2YXIgVj1OLnNlbGVjdEFsbCgiZy5udi13cmFwLm52LWxpbmVQbHVzQmFyIikuZGF0YShbZV0pLCQ9Vi5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnZkMyBudi13cmFwIG52LWxpbmVQbHVzQmFyIikuYXBwZW5kKCJnIiksSj1WLnNlbGVjdCgiZyIpOyQuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1sZWdlbmRXcmFwIik7dmFyIEs9JC5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LWZvY3VzIik7Sy5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXggbnYtYXhpcyIpLEsuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi15MSBudi1heGlzIiksSy5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXkyIG52LWF4aXMiKSxLLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtYmFyc1dyYXAiKSxLLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtbGluZXNXcmFwIik7dmFyIFE9JC5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LWNvbnRleHQiKTtRLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYteCBudi1heGlzIiksUS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXkxIG52LWF4aXMiKSxRLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYteTIgbnYtYXhpcyIpLFEuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1iYXJzV3JhcCIpLFEuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1saW5lc1dyYXAiKSxRLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtYnJ1c2hCYWNrZ3JvdW5kIiksUS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXggbnYtYnJ1c2giKSxFJiYoYy53aWR0aChGLzIpLEouc2VsZWN0KCIubnYtbGVnZW5kV3JhcCIpLmRhdHVtKGUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLm9yaWdpbmFsS2V5PWUub3JpZ2luYWxLZXk9PT11bmRlZmluZWQ/ZS5rZXk6ZS5vcmlnaW5hbEtleSxlLmtleT1lLm9yaWdpbmFsS2V5KyhlLmJhcj8iIChsZWZ0IGF4aXMpIjoiIChyaWdodCBheGlzKSIpLGV9KSkuY2FsbChjKSxwLnRvcCE9Yy5oZWlnaHQoKSYmKHAudG9wPWMuaGVpZ2h0KCksST0obXx8cGFyc2VJbnQoTi5zdHlsZSgiaGVpZ2h0IikpfHw0MDApLXAudG9wLXAuYm90dG9tLWcpLEouc2VsZWN0KCIubnYtbGVnZW5kV3JhcCIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0YvMisiLCIrIC1wLnRvcCsiKSIpKSxWLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3AubGVmdCsiLCIrcC50b3ArIikiKSxpLndpZHRoKEYpLmhlaWdodChxKS5jb2xvcihlLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbG9yfHx3KGUsdCl9KS5maWx0ZXIoZnVuY3Rpb24odCxuKXtyZXR1cm4hZVtuXS5kaXNhYmxlZCYmZVtuXS5iYXJ9KSksbi53aWR0aChGKS5oZWlnaHQocSkuY29sb3IoZS5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb2xvcnx8dyhlLHQpfSkuZmlsdGVyKGZ1bmN0aW9uKHQsbil7cmV0dXJuIWVbbl0uZGlzYWJsZWQmJiFlW25dLmJhcn0pKTt2YXIgRz1KLnNlbGVjdCgiLm52LWNvbnRleHQgLm52LWJhcnNXcmFwIikuZGF0dW0oVS5sZW5ndGg/VTpbe3ZhbHVlczpbXX1dKSxZPUouc2VsZWN0KCIubnYtY29udGV4dCAubnYtbGluZXNXcmFwIikuZGF0dW0oelswXS5kaXNhYmxlZD9be3ZhbHVlczpbXX1dOnopO0ouc2VsZWN0KCIubnYtY29udGV4dCIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIrKEkrcC5ib3R0b20rZC50b3ApKyIpIiksRy50cmFuc2l0aW9uKCkuY2FsbChpKSxZLnRyYW5zaXRpb24oKS5jYWxsKG4pLGgueChrKS5vbigiYnJ1c2giLGl0KSx4JiZoLmV4dGVudCh4KTt2YXIgWj1KLnNlbGVjdCgiLm52LWJydXNoQmFja2dyb3VuZCIpLnNlbGVjdEFsbCgiZyIpLmRhdGEoW3h8fGguZXh0ZW50KCldKSxldD1aLmVudGVyKCkuYXBwZW5kKCJnIik7ZXQuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJsZWZ0IikuYXR0cigieCIsMCkuYXR0cigieSIsMCkuYXR0cigiaGVpZ2h0IixxKSxldC5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInJpZ2h0IikuYXR0cigieCIsMCkuYXR0cigieSIsMCkuYXR0cigiaGVpZ2h0IixxKTt2YXIgdHQ9Si5zZWxlY3QoIi5udi14Lm52LWJydXNoIikuY2FsbChoKTt0dC5zZWxlY3RBbGwoInJlY3QiKS5hdHRyKCJoZWlnaHQiLHEpLHR0LnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmFwcGVuZCgicGF0aCIpLmF0dHIoImQiLG50KSxvLnRpY2tzKEYvMTAwKS50aWNrU2l6ZSgtcSwwKSxKLnNlbGVjdCgiLm52LWNvbnRleHQgLm52LXgubnYtYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIrTy5yYW5nZSgpWzBdKyIpIiksSi5zZWxlY3QoIi5udi1jb250ZXh0IC5udi14Lm52LWF4aXMiKS50cmFuc2l0aW9uKCkuY2FsbChvKSxmLnNjYWxlKE8pLnRpY2tzKHEvMzYpLnRpY2tTaXplKC1GLDApLEouc2VsZWN0KCIubnYtY29udGV4dCAubnYteTEubnYtYXhpcyIpLnN0eWxlKCJvcGFjaXR5IixVLmxlbmd0aD8xOjApLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIray5yYW5nZSgpWzBdKyIpIiksSi5zZWxlY3QoIi5udi1jb250ZXh0IC5udi15MS5udi1heGlzIikudHJhbnNpdGlvbigpLmNhbGwoZiksbC5zY2FsZShNKS50aWNrcyhxLzM2KS50aWNrU2l6ZShVLmxlbmd0aD8wOi1GLDApLEouc2VsZWN0KCIubnYtY29udGV4dCAubnYteTIubnYtYXhpcyIpLnN0eWxlKCJvcGFjaXR5Iix6Lmxlbmd0aD8xOjApLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2sucmFuZ2UoKVsxXSsiLDApIiksSi5zZWxlY3QoIi5udi1jb250ZXh0IC5udi15Mi5udi1heGlzIikudHJhbnNpdGlvbigpLmNhbGwobCksYy5kaXNwYXRjaC5vbigic3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe0IudXBkYXRlKCl9KSxELm9uKCJ0b29sdGlwU2hvdyIsZnVuY3Rpb24oZSl7VCYmSChlLGoucGFyZW50Tm9kZSl9KSxpdCgpfSksQn12YXIgdD1lLm1vZGVscy5saW5lKCksbj1lLm1vZGVscy5saW5lKCkscj1lLm1vZGVscy5oaXN0b3JpY2FsQmFyKCksaT1lLm1vZGVscy5oaXN0b3JpY2FsQmFyKCkscz1lLm1vZGVscy5heGlzKCksbz1lLm1vZGVscy5heGlzKCksdT1lLm1vZGVscy5heGlzKCksYT1lLm1vZGVscy5heGlzKCksZj1lLm1vZGVscy5heGlzKCksbD1lLm1vZGVscy5heGlzKCksYz1lLm1vZGVscy5sZWdlbmQoKSxoPWQzLnN2Zy5icnVzaCgpLHA9e3RvcDozMCxyaWdodDozMCxib3R0b206MzAsbGVmdDo2MH0sZD17dG9wOjAscmlnaHQ6MzAsYm90dG9tOjIwLGxlZnQ6NjB9LHY9bnVsbCxtPW51bGwsZz0xMDAseT1mdW5jdGlvbihlKXtyZXR1cm4gZS54fSxiPWZ1bmN0aW9uKGUpe3JldHVybiBlLnl9LHc9ZS51dGlscy5kZWZhdWx0Q29sb3IoKSxFPSEwLFMseD1udWxsLFQ9ITAsTj1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiI8aDM+IitlKyI8L2gzPiIrIjxwPiIrbisiIGF0ICIrdCsiPC9wPiJ9LEMsayxMLEEsTyxNLF89Ik5vIERhdGEgQXZhaWxhYmxlLiIsRD1kMy5kaXNwYXRjaCgidG9vbHRpcFNob3ciLCJ0b29sdGlwSGlkZSIsImJydXNoIiksUD0wO3QuY2xpcEVkZ2UoITApLG4uaW50ZXJhY3RpdmUoITEpLHMub3JpZW50KCJib3R0b20iKS50aWNrUGFkZGluZyg1KSx1Lm9yaWVudCgibGVmdCIpLGEub3JpZW50KCJyaWdodCIpLG8ub3JpZW50KCJib3R0b20iKS50aWNrUGFkZGluZyg1KSxmLm9yaWVudCgibGVmdCIpLGwub3JpZW50KCJyaWdodCIpO3ZhciBIPWZ1bmN0aW9uKG4scil7UyYmKG4ucG9pbnRJbmRleCs9TWF0aC5jZWlsKFNbMF0pKTt2YXIgaT1uLnBvc1swXSsoci5vZmZzZXRMZWZ0fHwwKSxvPW4ucG9zWzFdKyhyLm9mZnNldFRvcHx8MCksZj1zLnRpY2tGb3JtYXQoKSh0LngoKShuLnBvaW50LG4ucG9pbnRJbmRleCkpLGw9KG4uc2VyaWVzLmJhcj91OmEpLnRpY2tGb3JtYXQoKSh0LnkoKShuLnBvaW50LG4ucG9pbnRJbmRleCkpLGM9TihuLnNlcmllcy5rZXksZixsLG4sQik7ZS50b29sdGlwLnNob3coW2ksb10sYyxuLnZhbHVlPDA/Im4iOiJzIixudWxsLHIpfTtyZXR1cm4gdC5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlb3Zlci50b29sdGlwIixmdW5jdGlvbihlKXtlLnBvcz1bZS5wb3NbMF0rcC5sZWZ0LGUucG9zWzFdK3AudG9wXSxELnRvb2x0aXBTaG93KGUpfSksdC5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlb3V0LnRvb2x0aXAiLGZ1bmN0aW9uKGUpe0QudG9vbHRpcEhpZGUoZSl9KSxyLmRpc3BhdGNoLm9uKCJlbGVtZW50TW91c2VvdmVyLnRvb2x0aXAiLGZ1bmN0aW9uKGUpe2UucG9zPVtlLnBvc1swXStwLmxlZnQsZS5wb3NbMV0rcC50b3BdLEQudG9vbHRpcFNob3coZSl9KSxyLmRpc3BhdGNoLm9uKCJlbGVtZW50TW91c2VvdXQudG9vbHRpcCIsZnVuY3Rpb24oZSl7RC50b29sdGlwSGlkZShlKX0pLEQub24oInRvb2x0aXBIaWRlIixmdW5jdGlvbigpe1QmJmUudG9vbHRpcC5jbGVhbnVwKCl9KSxCLmRpc3BhdGNoPUQsQi5sZWdlbmQ9YyxCLmxpbmVzPXQsQi5saW5lczI9bixCLmJhcnM9cixCLmJhcnMyPWksQi54QXhpcz1zLEIueDJBeGlzPW8sQi55MUF4aXM9dSxCLnkyQXhpcz1hLEIueTNBeGlzPWYsQi55NEF4aXM9bCxkMy5yZWJpbmQoQix0LCJkZWZpbmVkIiwic2l6ZSIsImNsaXBWb3Jvbm9pIiwiaW50ZXJwb2xhdGUiKSxCLm9wdGlvbnM9ZS51dGlscy5vcHRpb25zRnVuYy5iaW5kKEIpLEIueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT1lLHQueChlKSxyLngoZSksQik6eX0sQi55PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPWUsdC55KGUpLHIueShlKSxCKTpifSxCLm1hcmdpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocC50b3A9dHlwZW9mIGUudG9wIT0idW5kZWZpbmVkIj9lLnRvcDpwLnRvcCxwLnJpZ2h0PXR5cGVvZiBlLnJpZ2h0IT0idW5kZWZpbmVkIj9lLnJpZ2h0OnAucmlnaHQscC5ib3R0b209dHlwZW9mIGUuYm90dG9tIT0idW5kZWZpbmVkIj9lLmJvdHRvbTpwLmJvdHRvbSxwLmxlZnQ9dHlwZW9mIGUubGVmdCE9InVuZGVmaW5lZCI/ZS5sZWZ0OnAubGVmdCxCKTpwfSxCLndpZHRoPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PWUsQik6dn0sQi5oZWlnaHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09ZSxCKTptfSxCLmNvbG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PWUudXRpbHMuZ2V0Q29sb3IodCksYy5jb2xvcih3KSxCKTp3fSxCLnNob3dMZWdlbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEU9ZSxCKTpFfSxCLnRvb2x0aXBzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhUPWUsQik6VH0sQi50b29sdGlwQ29udGVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTj1lLEIpOk59LEIubm9EYXRhPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPWUsQik6X30sQi5icnVzaEV4dGVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD1lLEIpOnh9LEJ9LGUubW9kZWxzLm11bHRpQmFyPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIE4oZSl7cmV0dXJuIGUuZWFjaChmdW5jdGlvbihlKXt2YXIgTj1uLXQubGVmdC10LnJpZ2h0LEM9ci10LnRvcC10LmJvdHRvbSxrPWQzLnNlbGVjdCh0aGlzKTtwJiZlLmxlbmd0aCYmKHA9W3t2YWx1ZXM6ZVswXS52YWx1ZXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybnt4OmUueCx5OjAsc2VyaWVzOmUuc2VyaWVzLHNpemU6LjAxfX0pfV0pLGMmJihlPWQzLmxheW91dC5zdGFjaygpLm9mZnNldCgiemVybyIpLnZhbHVlcyhmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZXN9KS55KGEpKCFlLmxlbmd0aCYmcD9wOmUpKSxlPWUubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUudmFsdWVzPWUudmFsdWVzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5zZXJpZXM9dCxlfSksZX0pLGMmJmVbMF0udmFsdWVzLm1hcChmdW5jdGlvbih0LG4pe3ZhciByPTAsaT0wO2UubWFwKGZ1bmN0aW9uKGUpe3ZhciB0PWUudmFsdWVzW25dO3Quc2l6ZT1NYXRoLmFicyh0LnkpLHQueTwwPyh0LnkxPWksaS09dC5zaXplKToodC55MT10LnNpemUrcixyKz10LnNpemUpfSl9KTt2YXIgTD1nJiZ5P1tdOmUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlcy5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm57eDp1KGUsdCkseTphKGUsdCkseTA6ZS55MCx5MTplLnkxfX0pfSk7aS5kb21haW4oZ3x8ZDMubWVyZ2UoTCkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnh9KSkucmFuZ2VCYW5kcyhifHxbMCxOXSxFKSxzLmRvbWFpbih5fHxkMy5leHRlbnQoZDMubWVyZ2UoTCkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBjP2UueT4wP2UueTE6ZS55MStlLnk6ZS55fSkuY29uY2F0KGYpKSkucmFuZ2Uod3x8W0MsMF0pLGkuZG9tYWluKClbMF09PT1pLmRvbWFpbigpWzFdJiYoaS5kb21haW4oKVswXT9pLmRvbWFpbihbaS5kb21haW4oKVswXS1pLmRvbWFpbigpWzBdKi4wMSxpLmRvbWFpbigpWzFdK2kuZG9tYWluKClbMV0qLjAxXSk6aS5kb21haW4oWy0xLDFdKSkscy5kb21haW4oKVswXT09PXMuZG9tYWluKClbMV0mJihzLmRvbWFpbigpWzBdP3MuZG9tYWluKFtzLmRvbWFpbigpWzBdK3MuZG9tYWluKClbMF0qLjAxLHMuZG9tYWluKClbMV0tcy5kb21haW4oKVsxXSouMDFdKTpzLmRvbWFpbihbLTEsMV0pKSx4PXh8fGksVD1UfHxzO3ZhciBBPWsuc2VsZWN0QWxsKCJnLm52LXdyYXAubnYtbXVsdGliYXIiKS5kYXRhKFtlXSksTz1BLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudmQzIG52LXdyYXAgbnYtbXVsdGliYXIiKSxNPU8uYXBwZW5kKCJkZWZzIiksXz1PLmFwcGVuZCgiZyIpLEQ9QS5zZWxlY3QoImciKTtfLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtZ3JvdXBzIiksQS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit0LmxlZnQrIiwiK3QudG9wKyIpIiksTS5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLCJudi1lZGdlLWNsaXAtIitvKS5hcHBlbmQoInJlY3QiKSxBLnNlbGVjdCgiI252LWVkZ2UtY2xpcC0iK28rIiByZWN0IikuYXR0cigid2lkdGgiLE4pLmF0dHIoImhlaWdodCIsQyksRC5hdHRyKCJjbGlwLXBhdGgiLGw/InVybCgjbnYtZWRnZS1jbGlwLSIrbysiKSI6IiIpO3ZhciBQPUEuc2VsZWN0KCIubnYtZ3JvdXBzIikuc2VsZWN0QWxsKCIubnYtZ3JvdXAiKS5kYXRhKGZ1bmN0aW9uKGUpe3JldHVybiBlfSxmdW5jdGlvbihlLHQpe3JldHVybiB0fSk7UC5lbnRlcigpLmFwcGVuZCgiZyIpLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsMWUtNikuc3R5bGUoImZpbGwtb3BhY2l0eSIsMWUtNiksUC5leGl0KCkudHJhbnNpdGlvbigpLnNlbGVjdEFsbCgicmVjdC5udi1iYXIiKS5kZWxheShmdW5jdGlvbih0LG4pe3JldHVybiBuKm0vZVswXS52YWx1ZXMubGVuZ3RofSkuYXR0cigieSIsZnVuY3Rpb24oZSl7cmV0dXJuIGM/VChlLnkwKTpUKDApfSkuYXR0cigiaGVpZ2h0IiwwKS5yZW1vdmUoKSxQLmF0dHIoImNsYXNzIixmdW5jdGlvbihlLHQpe3JldHVybiJudi1ncm91cCBudi1zZXJpZXMtIit0fSkuY2xhc3NlZCgiaG92ZXIiLGZ1bmN0aW9uKGUpe3JldHVybiBlLmhvdmVyfSkuc3R5bGUoImZpbGwiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGgoZSx0KX0pLnN0eWxlKCJzdHJva2UiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGgoZSx0KX0pLFAudHJhbnNpdGlvbigpLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsMSkuc3R5bGUoImZpbGwtb3BhY2l0eSIsLjc1KTt2YXIgSD1QLnNlbGVjdEFsbCgicmVjdC5udi1iYXIiKS5kYXRhKGZ1bmN0aW9uKHQpe3JldHVybiBwJiYhZS5sZW5ndGg/cC52YWx1ZXM6dC52YWx1ZXN9KTtILmV4aXQoKS5yZW1vdmUoKTt2YXIgQj1ILmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGEoZSx0KTwwPyJudi1iYXIgbmVnYXRpdmUiOiJudi1iYXIgcG9zaXRpdmUifSkuYXR0cigieCIsZnVuY3Rpb24odCxuLHIpe3JldHVybiBjPzA6cippLnJhbmdlQmFuZCgpL2UubGVuZ3RofSkuYXR0cigieSIsZnVuY3Rpb24oZSl7cmV0dXJuIFQoYz9lLnkwOjApfSkuYXR0cigiaGVpZ2h0IiwwKS5hdHRyKCJ3aWR0aCIsaS5yYW5nZUJhbmQoKS8oYz8xOmUubGVuZ3RoKSkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihlLHQpe3JldHVybiJ0cmFuc2xhdGUoIitpKHUoZSx0KSkrIiwwKSJ9KTtILnN0eWxlKCJmaWxsIixmdW5jdGlvbihlLHQsbil7cmV0dXJuIGgoZSxuLHQpfSkuc3R5bGUoInN0cm9rZSIsZnVuY3Rpb24oZSx0LG4pe3JldHVybiBoKGUsbix0KX0pLm9uKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKHQsbil7ZDMuc2VsZWN0KHRoaXMpLmNsYXNzZWQoImhvdmVyIiwhMCksUy5lbGVtZW50TW91c2VvdmVyKHt2YWx1ZTphKHQsbikscG9pbnQ6dCxzZXJpZXM6ZVt0LnNlcmllc10scG9zOltpKHUodCxuKSkraS5yYW5nZUJhbmQoKSooYz9lLmxlbmd0aC8yOnQuc2VyaWVzKy41KS9lLmxlbmd0aCxzKGEodCxuKSsoYz90LnkwOjApKV0scG9pbnRJbmRleDpuLHNlcmllc0luZGV4OnQuc2VyaWVzLGU6ZDMuZXZlbnR9KX0pLm9uKCJtb3VzZW91dCIsZnVuY3Rpb24odCxuKXtkMy5zZWxlY3QodGhpcykuY2xhc3NlZCgiaG92ZXIiLCExKSxTLmVsZW1lbnRNb3VzZW91dCh7dmFsdWU6YSh0LG4pLHBvaW50OnQsc2VyaWVzOmVbdC5zZXJpZXNdLHBvaW50SW5kZXg6bixzZXJpZXNJbmRleDp0LnNlcmllcyxlOmQzLmV2ZW50fSl9KS5vbigiY2xpY2siLGZ1bmN0aW9uKHQsbil7Uy5lbGVtZW50Q2xpY2soe3ZhbHVlOmEodCxuKSxwb2ludDp0LHNlcmllczplW3Quc2VyaWVzXSxwb3M6W2kodSh0LG4pKStpLnJhbmdlQmFuZCgpKihjP2UubGVuZ3RoLzI6dC5zZXJpZXMrLjUpL2UubGVuZ3RoLHMoYSh0LG4pKyhjP3QueTA6MCkpXSxwb2ludEluZGV4Om4sc2VyaWVzSW5kZXg6dC5zZXJpZXMsZTpkMy5ldmVudH0pLGQzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpfSkub24oImRibGNsaWNrIixmdW5jdGlvbih0LG4pe1MuZWxlbWVudERibENsaWNrKHt2YWx1ZTphKHQsbikscG9pbnQ6dCxzZXJpZXM6ZVt0LnNlcmllc10scG9zOltpKHUodCxuKSkraS5yYW5nZUJhbmQoKSooYz9lLmxlbmd0aC8yOnQuc2VyaWVzKy41KS9lLmxlbmd0aCxzKGEodCxuKSsoYz90LnkwOjApKV0scG9pbnRJbmRleDpuLHNlcmllc0luZGV4OnQuc2VyaWVzLGU6ZDMuZXZlbnR9KSxkMy5ldmVudC5zdG9wUHJvcGFnYXRpb24oKX0pLEguYXR0cigiY2xhc3MiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGEoZSx0KTwwPyJudi1iYXIgbmVnYXRpdmUiOiJudi1iYXIgcG9zaXRpdmUifSkudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oZSx0KXtyZXR1cm4idHJhbnNsYXRlKCIraSh1KGUsdCkpKyIsMCkifSksZCYmKHZ8fCh2PWUubWFwKGZ1bmN0aW9uKCl7cmV0dXJuITB9KSksSC5zdHlsZSgiZmlsbCIsZnVuY3Rpb24oZSx0LG4pe3JldHVybiBkMy5yZ2IoZChlLHQpKS5kYXJrZXIodi5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdH0pLmZpbHRlcihmdW5jdGlvbihlLHQpe3JldHVybiF2W3RdfSlbbl0pLnRvU3RyaW5nKCl9KS5zdHlsZSgic3Ryb2tlIixmdW5jdGlvbihlLHQsbil7cmV0dXJuIGQzLnJnYihkKGUsdCkpLmRhcmtlcih2Lm1hcChmdW5jdGlvbihlLHQpe3JldHVybiB0fSkuZmlsdGVyKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIXZbdF19KVtuXSkudG9TdHJpbmcoKX0pKSxjP0gudHJhbnNpdGlvbigpLmRlbGF5KGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4qbS9lWzBdLnZhbHVlcy5sZW5ndGh9KS5hdHRyKCJ5IixmdW5jdGlvbihlLHQpe3JldHVybiBzKGM/ZS55MTowKX0pLmF0dHIoImhlaWdodCIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gTWF0aC5tYXgoTWF0aC5hYnMocyhlLnkrKGM/ZS55MDowKSktcyhjP2UueTA6MCkpLDEpfSkuYXR0cigieCIsZnVuY3Rpb24odCxuKXtyZXR1cm4gYz8wOnQuc2VyaWVzKmkucmFuZ2VCYW5kKCkvZS5sZW5ndGh9KS5hdHRyKCJ3aWR0aCIsaS5yYW5nZUJhbmQoKS8oYz8xOmUubGVuZ3RoKSk6SC50cmFuc2l0aW9uKCkuZGVsYXkoZnVuY3Rpb24odCxuKXtyZXR1cm4gbiptL2VbMF0udmFsdWVzLmxlbmd0aH0pLmF0dHIoIngiLGZ1bmN0aW9uKHQsbil7cmV0dXJuIHQuc2VyaWVzKmkucmFuZ2VCYW5kKCkvZS5sZW5ndGh9KS5hdHRyKCJ3aWR0aCIsaS5yYW5nZUJhbmQoKS9lLmxlbmd0aCkuYXR0cigieSIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gYShlLHQpPDA/cygwKTpzKDApLXMoYShlLHQpKTwxP3MoMCktMTpzKGEoZSx0KSl8fDB9KS5hdHRyKCJoZWlnaHQiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIE1hdGgubWF4KE1hdGguYWJzKHMoYShlLHQpKS1zKDApKSwxKXx8MH0pLHg9aS5jb3B5KCksVD1zCi5jb3B5KCl9KSxOfXZhciB0PXt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MH0sbj05NjAscj01MDAsaT1kMy5zY2FsZS5vcmRpbmFsKCkscz1kMy5zY2FsZS5saW5lYXIoKSxvPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxZTQpLHU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUueH0sYT1mdW5jdGlvbihlKXtyZXR1cm4gZS55fSxmPVswXSxsPSEwLGM9ITEsaD1lLnV0aWxzLmRlZmF1bHRDb2xvcigpLHA9ITEsZD1udWxsLHYsbT0xMjAwLGcseSxiLHcsRT0uMSxTPWQzLmRpc3BhdGNoKCJjaGFydENsaWNrIiwiZWxlbWVudENsaWNrIiwiZWxlbWVudERibENsaWNrIiwiZWxlbWVudE1vdXNlb3ZlciIsImVsZW1lbnRNb3VzZW91dCIpLHgsVDtyZXR1cm4gTi5kaXNwYXRjaD1TLE4ub3B0aW9ucz1lLnV0aWxzLm9wdGlvbnNGdW5jLmJpbmQoTiksTi54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWUsTik6dX0sTi55PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWUsTik6YX0sTi5tYXJnaW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQudG9wPXR5cGVvZiBlLnRvcCE9InVuZGVmaW5lZCI/ZS50b3A6dC50b3AsdC5yaWdodD10eXBlb2YgZS5yaWdodCE9InVuZGVmaW5lZCI/ZS5yaWdodDp0LnJpZ2h0LHQuYm90dG9tPXR5cGVvZiBlLmJvdHRvbSE9InVuZGVmaW5lZCI/ZS5ib3R0b206dC5ib3R0b20sdC5sZWZ0PXR5cGVvZiBlLmxlZnQhPSJ1bmRlZmluZWQiP2UubGVmdDp0LmxlZnQsTik6dH0sTi53aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLE4pOm59LE4uaGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWUsTik6cn0sTi54U2NhbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ZSxOKTppfSxOLnlTY2FsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1lLE4pOnN9LE4ueERvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz1lLE4pOmd9LE4ueURvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT1lLE4pOnl9LE4ueFJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPWUsTik6Yn0sTi55UmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHc9ZSxOKTp3fSxOLmZvcmNlWT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1lLE4pOmZ9LE4uc3RhY2tlZD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1lLE4pOmN9LE4uY2xpcEVkZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ZSxOKTpsfSxOLmNvbG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPWUudXRpbHMuZ2V0Q29sb3IodCksTik6aH0sTi5iYXJDb2xvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1lLnV0aWxzLmdldENvbG9yKHQpLE4pOmR9LE4uZGlzYWJsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9ZSxOKTp2fSxOLmlkPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWUsTik6b30sTi5oaWRlYWJsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1lLE4pOnB9LE4uZGVsYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09ZSxOKTptfSxOLmdyb3VwU3BhY2luZz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oRT1lLE4pOkV9LE59LGUubW9kZWxzLm11bHRpQmFyQ2hhcnQ9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gQShlKXtyZXR1cm4gZS5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBiPWQzLnNlbGVjdCh0aGlzKSxPPXRoaXMsTT0odXx8cGFyc2VJbnQoYi5zdHlsZSgid2lkdGgiKSl8fDk2MCktby5sZWZ0LW8ucmlnaHQsXz0oYXx8cGFyc2VJbnQoYi5zdHlsZSgiaGVpZ2h0IikpfHw0MDApLW8udG9wLW8uYm90dG9tO0EudXBkYXRlPWZ1bmN0aW9uKCl7Yi50cmFuc2l0aW9uKCkuZHVyYXRpb24oaykuY2FsbChBKX0sQS5jb250YWluZXI9dGhpcyxTLmRpc2FibGVkPWUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiEhZS5kaXNhYmxlZH0pO2lmKCF4KXt2YXIgRDt4PXt9O2ZvcihEIGluIFMpU1tEXWluc3RhbmNlb2YgQXJyYXk/eFtEXT1TW0RdLnNsaWNlKDApOnhbRF09U1tEXX1pZighZXx8IWUubGVuZ3RofHwhZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUudmFsdWVzLmxlbmd0aH0pLmxlbmd0aCl7dmFyIFA9Yi5zZWxlY3RBbGwoIi5udi1ub0RhdGEiKS5kYXRhKFtUXSk7cmV0dXJuIFAuZW50ZXIoKS5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsIm52ZDMgbnYtbm9EYXRhIikuYXR0cigiZHkiLCItLjdlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLFAuYXR0cigieCIsby5sZWZ0K00vMikuYXR0cigieSIsby50b3ArXy8yKS50ZXh0KGZ1bmN0aW9uKGUpe3JldHVybiBlfSksQX1iLnNlbGVjdEFsbCgiLm52LW5vRGF0YSIpLnJlbW92ZSgpLHc9dC54U2NhbGUoKSxFPXQueVNjYWxlKCk7dmFyIEg9Yi5zZWxlY3RBbGwoImcubnYtd3JhcC5udi1tdWx0aUJhcldpdGhMZWdlbmQiKS5kYXRhKFtlXSksQj1ILmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudmQzIG52LXdyYXAgbnYtbXVsdGlCYXJXaXRoTGVnZW5kIikuYXBwZW5kKCJnIiksaj1ILnNlbGVjdCgiZyIpO0IuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi14IG52LWF4aXMiKSxCLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYteSBudi1heGlzIiksQi5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LWJhcnNXcmFwIiksQi5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LWxlZ2VuZFdyYXAiKSxCLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtY29udHJvbHNXcmFwIiksYyYmKGkud2lkdGgoTS1DKCkpLHQuYmFyQ29sb3IoKSYmZS5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7ZS5jb2xvcj1kMy5yZ2IoIiNjY2MiKS5kYXJrZXIodCoxLjUpLnRvU3RyaW5nKCl9KSxqLnNlbGVjdCgiLm52LWxlZ2VuZFdyYXAiKS5kYXR1bShlKS5jYWxsKGkpLG8udG9wIT1pLmhlaWdodCgpJiYoby50b3A9aS5oZWlnaHQoKSxfPShhfHxwYXJzZUludChiLnN0eWxlKCJoZWlnaHQiKSl8fDQwMCktby50b3Atby5ib3R0b20pLGouc2VsZWN0KCIubnYtbGVnZW5kV3JhcCIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0MoKSsiLCIrIC1vLnRvcCsiKSIpKTtpZihsKXt2YXIgRj1be2tleToiR3JvdXBlZCIsZGlzYWJsZWQ6dC5zdGFja2VkKCl9LHtrZXk6IlN0YWNrZWQiLGRpc2FibGVkOiF0LnN0YWNrZWQoKX1dO3Mud2lkdGgoQygpKS5jb2xvcihbIiM0NDQiLCIjNDQ0IiwiIzQ0NCJdKSxqLnNlbGVjdCgiLm52LWNvbnRyb2xzV3JhcCIpLmRhdHVtKEYpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIrIC1vLnRvcCsiKSIpLmNhbGwocyl9SC5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitvLmxlZnQrIiwiK28udG9wKyIpIiksZCYmai5zZWxlY3QoIi5udi15Lm52LWF4aXMiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitNKyIsMCkiKSx0LmRpc2FibGVkKGUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkfSkpLndpZHRoKE0pLmhlaWdodChfKS5jb2xvcihlLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbG9yfHxmKGUsdCl9KS5maWx0ZXIoZnVuY3Rpb24odCxuKXtyZXR1cm4hZVtuXS5kaXNhYmxlZH0pKTt2YXIgST1qLnNlbGVjdCgiLm52LWJhcnNXcmFwIikuZGF0dW0oZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuZGlzYWJsZWR9KSk7SS50cmFuc2l0aW9uKCkuY2FsbCh0KTtpZihoKXtuLnNjYWxlKHcpLnRpY2tzKE0vMTAwKS50aWNrU2l6ZSgtXywwKSxqLnNlbGVjdCgiLm52LXgubnYtYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIrRS5yYW5nZSgpWzBdKyIpIiksai5zZWxlY3QoIi5udi14Lm52LWF4aXMiKS50cmFuc2l0aW9uKCkuY2FsbChuKTt2YXIgcT1qLnNlbGVjdCgiLm52LXgubnYtYXhpcyA+IGciKS5zZWxlY3RBbGwoImciKTtxLnNlbGVjdEFsbCgibGluZSwgdGV4dCIpLnN0eWxlKCJvcGFjaXR5IiwxKTtpZihtKXt2YXIgUj1mdW5jdGlvbihlLHQpe3JldHVybiJ0cmFuc2xhdGUoIitlKyIsIit0KyIpIn0sVT01LHo9MTc7cS5zZWxlY3RBbGwoInRleHQiKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gUigwLG4lMj09MD9VOnopfSk7dmFyIFc9ZDMuc2VsZWN0QWxsKCIubnYteC5udi1heGlzIC5udi13cmFwIGcgZyB0ZXh0IilbMF0ubGVuZ3RoO2ouc2VsZWN0QWxsKCIubnYteC5udi1heGlzIC5udi1heGlzTWF4TWluIHRleHQiKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFIoMCx0PT09MHx8VyUyIT09MD96OlUpfSl9diYmcS5maWx0ZXIoZnVuY3Rpb24odCxuKXtyZXR1cm4gbiVNYXRoLmNlaWwoZVswXS52YWx1ZXMubGVuZ3RoLyhNLzEwMCkpIT09MH0pLnNlbGVjdEFsbCgidGV4dCwgbGluZSIpLnN0eWxlKCJvcGFjaXR5IiwwKSxnJiZxLnNlbGVjdEFsbCgiLnRpY2sgdGV4dCIpLmF0dHIoInRyYW5zZm9ybSIsInJvdGF0ZSgiK2crIiAwLDApIikuc3R5bGUoInRleHQtYW5jaG9yIixnPjA/InN0YXJ0IjoiZW5kIiksai5zZWxlY3QoIi5udi14Lm52LWF4aXMiKS5zZWxlY3RBbGwoImcubnYtYXhpc01heE1pbiB0ZXh0Iikuc3R5bGUoIm9wYWNpdHkiLDEpfXAmJihyLnNjYWxlKEUpLnRpY2tzKF8vMzYpLnRpY2tTaXplKC1NLDApLGouc2VsZWN0KCIubnYteS5udi1heGlzIikudHJhbnNpdGlvbigpLmNhbGwocikpLGkuZGlzcGF0Y2gub24oInN0YXRlQ2hhbmdlIixmdW5jdGlvbihlKXtTPWUsTi5zdGF0ZUNoYW5nZShTKSxBLnVwZGF0ZSgpfSkscy5kaXNwYXRjaC5vbigibGVnZW5kQ2xpY2siLGZ1bmN0aW9uKGUsbil7aWYoIWUuZGlzYWJsZWQpcmV0dXJuO0Y9Ri5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZWQ9ITAsZX0pLGUuZGlzYWJsZWQ9ITE7c3dpdGNoKGUua2V5KXtjYXNlIkdyb3VwZWQiOnQuc3RhY2tlZCghMSk7YnJlYWs7Y2FzZSJTdGFja2VkIjp0LnN0YWNrZWQoITApfVMuc3RhY2tlZD10LnN0YWNrZWQoKSxOLnN0YXRlQ2hhbmdlKFMpLEEudXBkYXRlKCl9KSxOLm9uKCJ0b29sdGlwU2hvdyIsZnVuY3Rpb24oZSl7eSYmTChlLE8ucGFyZW50Tm9kZSl9KSxOLm9uKCJjaGFuZ2VTdGF0ZSIsZnVuY3Rpb24obil7dHlwZW9mIG4uZGlzYWJsZWQhPSJ1bmRlZmluZWQiJiYoZS5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7ZS5kaXNhYmxlZD1uLmRpc2FibGVkW3RdfSksUy5kaXNhYmxlZD1uLmRpc2FibGVkKSx0eXBlb2Ygbi5zdGFja2VkIT0idW5kZWZpbmVkIiYmKHQuc3RhY2tlZChuLnN0YWNrZWQpLFMuc3RhY2tlZD1uLnN0YWNrZWQpLEEudXBkYXRlKCl9KX0pLEF9dmFyIHQ9ZS5tb2RlbHMubXVsdGlCYXIoKSxuPWUubW9kZWxzLmF4aXMoKSxyPWUubW9kZWxzLmF4aXMoKSxpPWUubW9kZWxzLmxlZ2VuZCgpLHM9ZS5tb2RlbHMubGVnZW5kKCksbz17dG9wOjMwLHJpZ2h0OjIwLGJvdHRvbTo1MCxsZWZ0OjYwfSx1PW51bGwsYT1udWxsLGY9ZS51dGlscy5kZWZhdWx0Q29sb3IoKSxsPSEwLGM9ITAsaD0hMCxwPSEwLGQ9ITEsdj0hMCxtPSExLGc9MCx5PSEwLGI9ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm4iPGgzPiIrZSsiPC9oMz4iKyI8cD4iK24rIiBvbiAiK3QrIjwvcD4ifSx3LEUsUz17c3RhY2tlZDohMX0seD1udWxsLFQ9Ik5vIERhdGEgQXZhaWxhYmxlLiIsTj1kMy5kaXNwYXRjaCgidG9vbHRpcFNob3ciLCJ0b29sdGlwSGlkZSIsInN0YXRlQ2hhbmdlIiwiY2hhbmdlU3RhdGUiKSxDPWZ1bmN0aW9uKCl7cmV0dXJuIGw/MTgwOjB9LGs9MjUwO3Quc3RhY2tlZCghMSksbi5vcmllbnQoImJvdHRvbSIpLnRpY2tQYWRkaW5nKDcpLmhpZ2hsaWdodFplcm8oITApLnNob3dNYXhNaW4oITEpLnRpY2tGb3JtYXQoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KSxyLm9yaWVudChkPyJyaWdodCI6ImxlZnQiKS50aWNrRm9ybWF0KGQzLmZvcm1hdCgiLC4xZiIpKSxzLnVwZGF0ZVN0YXRlKCExKTt2YXIgTD1mdW5jdGlvbihpLHMpe3ZhciBvPWkucG9zWzBdKyhzLm9mZnNldExlZnR8fDApLHU9aS5wb3NbMV0rKHMub2Zmc2V0VG9wfHwwKSxhPW4udGlja0Zvcm1hdCgpKHQueCgpKGkucG9pbnQsaS5wb2ludEluZGV4KSksZj1yLnRpY2tGb3JtYXQoKSh0LnkoKShpLnBvaW50LGkucG9pbnRJbmRleCkpLGw9YihpLnNlcmllcy5rZXksYSxmLGksQSk7ZS50b29sdGlwLnNob3coW28sdV0sbCxpLnZhbHVlPDA/Im4iOiJzIixudWxsLHMpfTtyZXR1cm4gdC5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlb3Zlci50b29sdGlwIixmdW5jdGlvbihlKXtlLnBvcz1bZS5wb3NbMF0rby5sZWZ0LGUucG9zWzFdK28udG9wXSxOLnRvb2x0aXBTaG93KGUpfSksdC5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlb3V0LnRvb2x0aXAiLGZ1bmN0aW9uKGUpe04udG9vbHRpcEhpZGUoZSl9KSxOLm9uKCJ0b29sdGlwSGlkZSIsZnVuY3Rpb24oKXt5JiZlLnRvb2x0aXAuY2xlYW51cCgpfSksQS5kaXNwYXRjaD1OLEEubXVsdGliYXI9dCxBLmxlZ2VuZD1pLEEueEF4aXM9bixBLnlBeGlzPXIsZDMucmViaW5kKEEsdCwieCIsInkiLCJ4RG9tYWluIiwieURvbWFpbiIsInhSYW5nZSIsInlSYW5nZSIsImZvcmNlWCIsImZvcmNlWSIsImNsaXBFZGdlIiwiaWQiLCJzdGFja2VkIiwiZGVsYXkiLCJiYXJDb2xvciIsImdyb3VwU3BhY2luZyIpLEEub3B0aW9ucz1lLnV0aWxzLm9wdGlvbnNGdW5jLmJpbmQoQSksQS5tYXJnaW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG8udG9wPXR5cGVvZiBlLnRvcCE9InVuZGVmaW5lZCI/ZS50b3A6by50b3Asby5yaWdodD10eXBlb2YgZS5yaWdodCE9InVuZGVmaW5lZCI/ZS5yaWdodDpvLnJpZ2h0LG8uYm90dG9tPXR5cGVvZiBlLmJvdHRvbSE9InVuZGVmaW5lZCI/ZS5ib3R0b206by5ib3R0b20sby5sZWZ0PXR5cGVvZiBlLmxlZnQhPSJ1bmRlZmluZWQiP2UubGVmdDpvLmxlZnQsQSk6b30sQS53aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1lLEEpOnV9LEEuaGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWUsQSk6YX0sQS5jb2xvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1lLnV0aWxzLmdldENvbG9yKHQpLGkuY29sb3IoZiksQSk6Zn0sQS5zaG93Q29udHJvbHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ZSxBKTpsfSxBLnNob3dMZWdlbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ZSxBKTpjfSxBLnNob3dYQXhpcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1lLEEpOmh9LEEuc2hvd1lBeGlzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPWUsQSk6cH0sQS5yaWdodEFsaWduWUF4aXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9ZSxyLm9yaWVudChlPyJyaWdodCI6ImxlZnQiKSxBKTpkfSxBLnJlZHVjZVhUaWNrcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj1lLEEpOnZ9LEEucm90YXRlTGFiZWxzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPWUsQSk6Z30sQS5zdGFnZ2VyTGFiZWxzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPWUsQSk6bX0sQS50b29sdGlwPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPWUsQSk6Yn0sQS50b29sdGlwcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT1lLEEpOnl9LEEudG9vbHRpcENvbnRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9ZSxBKTpifSxBLnN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhTPWUsQSk6U30sQS5kZWZhdWx0U3RhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9ZSxBKTp4fSxBLm5vRGF0YT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oVD1lLEEpOlR9LEEudHJhbnNpdGlvbkR1cmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhrPWUsQSk6a30sQX0sZS5tb2RlbHMubXVsdGlCYXJIb3Jpem9udGFsPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIE4oZSl7cmV0dXJuIGUuZWFjaChmdW5jdGlvbihlKXt2YXIgaT1uLXQubGVmdC10LnJpZ2h0LGc9ci10LnRvcC10LmJvdHRvbSxOPWQzLnNlbGVjdCh0aGlzKTtwJiYoZT1kMy5sYXlvdXQuc3RhY2soKS5vZmZzZXQoInplcm8iKS52YWx1ZXMoZnVuY3Rpb24oZSl7cmV0dXJuIGUudmFsdWVzfSkueShhKShlKSksZT1lLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiBlLnZhbHVlcz1lLnZhbHVlcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2VyaWVzPXQsZX0pLGV9KSxwJiZlWzBdLnZhbHVlcy5tYXAoZnVuY3Rpb24odCxuKXt2YXIgcj0wLGk9MDtlLm1hcChmdW5jdGlvbihlKXt2YXIgdD1lLnZhbHVlc1tuXTt0LnNpemU9TWF0aC5hYnModC55KSx0Lnk8MD8odC55MT1pLXQuc2l6ZSxpLT10LnNpemUpOih0LnkxPXIscis9dC5zaXplKX0pfSk7dmFyIEM9eSYmYj9bXTplLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZXMubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJue3g6dShlLHQpLHk6YShlLHQpLHkwOmUueTAseTE6ZS55MX19KX0pO3MuZG9tYWluKHl8fGQzLm1lcmdlKEMpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS54fSkpLnJhbmdlQmFuZHMod3x8WzAsZ10sLjEpLG8uZG9tYWluKGJ8fGQzLmV4dGVudChkMy5tZXJnZShDKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHA/ZS55PjA/ZS55MStlLnk6ZS55MTplLnl9KS5jb25jYXQoZikpKSxkJiYhcD9vLnJhbmdlKEV8fFtvLmRvbWFpbigpWzBdPDA/djowLGktKG8uZG9tYWluKClbMV0+MD92OjApXSk6by5yYW5nZShFfHxbMCxpXSkseD14fHxzLFQ9VHx8ZDMuc2NhbGUubGluZWFyKCkuZG9tYWluKG8uZG9tYWluKCkpLnJhbmdlKFtvKDApLG8oMCldKTt2YXIgaz1kMy5zZWxlY3QodGhpcykuc2VsZWN0QWxsKCJnLm52LXdyYXAubnYtbXVsdGliYXJIb3Jpem9udGFsIikuZGF0YShbZV0pLEw9ay5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnZkMyBudi13cmFwIG52LW11bHRpYmFySG9yaXpvbnRhbCIpLEE9TC5hcHBlbmQoImRlZnMiKSxPPUwuYXBwZW5kKCJnIiksTT1rLnNlbGVjdCgiZyIpO08uYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1ncm91cHMiKSxrLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3QubGVmdCsiLCIrdC50b3ArIikiKTt2YXIgXz1rLnNlbGVjdCgiLm52LWdyb3VwcyIpLnNlbGVjdEFsbCgiLm52LWdyb3VwIikuZGF0YShmdW5jdGlvbihlKXtyZXR1cm4gZX0sZnVuY3Rpb24oZSx0KXtyZXR1cm4gdH0pO18uZW50ZXIoKS5hcHBlbmQoImciKS5zdHlsZSgic3Ryb2tlLW9wYWNpdHkiLDFlLTYpLnN0eWxlKCJmaWxsLW9wYWNpdHkiLDFlLTYpLF8uZXhpdCgpLnRyYW5zaXRpb24oKS5zdHlsZSgic3Ryb2tlLW9wYWNpdHkiLDFlLTYpLnN0eWxlKCJmaWxsLW9wYWNpdHkiLDFlLTYpLnJlbW92ZSgpLF8uYXR0cigiY2xhc3MiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIm52LWdyb3VwIG52LXNlcmllcy0iK3R9KS5jbGFzc2VkKCJob3ZlciIsZnVuY3Rpb24oZSl7cmV0dXJuIGUuaG92ZXJ9KS5zdHlsZSgiZmlsbCIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gbChlLHQpfSkuc3R5bGUoInN0cm9rZSIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gbChlLHQpfSksXy50cmFuc2l0aW9uKCkuc3R5bGUoInN0cm9rZS1vcGFjaXR5IiwxKS5zdHlsZSgiZmlsbC1vcGFjaXR5IiwuNzUpO3ZhciBEPV8uc2VsZWN0QWxsKCJnLm52LWJhciIpLmRhdGEoZnVuY3Rpb24oZSl7cmV0dXJuIGUudmFsdWVzfSk7RC5leGl0KCkucmVtb3ZlKCk7dmFyIFA9RC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCxuLHIpe3JldHVybiJ0cmFuc2xhdGUoIitUKHA/dC55MDowKSsiLCIrKHA/MDpyKnMucmFuZ2VCYW5kKCkvZS5sZW5ndGgrcyh1KHQsbikpKSsiKSJ9KTtQLmFwcGVuZCgicmVjdCIpLmF0dHIoIndpZHRoIiwwKS5hdHRyKCJoZWlnaHQiLHMucmFuZ2VCYW5kKCkvKHA/MTplLmxlbmd0aCkpLEQub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24odCxuKXtkMy5zZWxlY3QodGhpcykuY2xhc3NlZCgiaG92ZXIiLCEwKSxTLmVsZW1lbnRNb3VzZW92ZXIoe3ZhbHVlOmEodCxuKSxwb2ludDp0LHNlcmllczplW3Quc2VyaWVzXSxwb3M6W28oYSh0LG4pKyhwP3QueTA6MCkpLHModSh0LG4pKStzLnJhbmdlQmFuZCgpKihwP2UubGVuZ3RoLzI6dC5zZXJpZXMrLjUpL2UubGVuZ3RoXSxwb2ludEluZGV4Om4sc2VyaWVzSW5kZXg6dC5zZXJpZXMsZTpkMy5ldmVudH0pfSkub24oIm1vdXNlb3V0IixmdW5jdGlvbih0LG4pe2QzLnNlbGVjdCh0aGlzKS5jbGFzc2VkKCJob3ZlciIsITEpLFMuZWxlbWVudE1vdXNlb3V0KHt2YWx1ZTphKHQsbikscG9pbnQ6dCxzZXJpZXM6ZVt0LnNlcmllc10scG9pbnRJbmRleDpuLHNlcmllc0luZGV4OnQuc2VyaWVzLGU6ZDMuZXZlbnR9KX0pLm9uKCJjbGljayIsZnVuY3Rpb24odCxuKXtTLmVsZW1lbnRDbGljayh7dmFsdWU6YSh0LG4pLHBvaW50OnQsc2VyaWVzOmVbdC5zZXJpZXNdLHBvczpbcyh1KHQsbikpK3MucmFuZ2VCYW5kKCkqKHA/ZS5sZW5ndGgvMjp0LnNlcmllcysuNSkvZS5sZW5ndGgsbyhhKHQsbikrKHA/dC55MDowKSldLHBvaW50SW5kZXg6bixzZXJpZXNJbmRleDp0LnNlcmllcyxlOmQzLmV2ZW50fSksZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9KS5vbigiZGJsY2xpY2siLGZ1bmN0aW9uKHQsbil7Uy5lbGVtZW50RGJsQ2xpY2soe3ZhbHVlOmEodCxuKSxwb2ludDp0LHNlcmllczplW3Quc2VyaWVzXSxwb3M6W3ModSh0LG4pKStzLnJhbmdlQmFuZCgpKihwP2UubGVuZ3RoLzI6dC5zZXJpZXMrLjUpL2UubGVuZ3RoLG8oYSh0LG4pKyhwP3QueTA6MCkpXSxwb2ludEluZGV4Om4sc2VyaWVzSW5kZXg6dC5zZXJpZXMsZTpkMy5ldmVudH0pLGQzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpfSksUC5hcHBlbmQoInRleHQiKSxkJiYhcD8oRC5zZWxlY3QoInRleHQiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gYShlLHQpPDA/ImVuZCI6InN0YXJ0In0pLmF0dHIoInkiLHMucmFuZ2VCYW5kKCkvKGUubGVuZ3RoKjIpKS5hdHRyKCJkeSIsIi4zMmVtIikudGV4dChmdW5jdGlvbihlLHQpe3JldHVybiBtKGEoZSx0KSl9KSxELnRyYW5zaXRpb24oKS5zZWxlY3QoInRleHQiKS5hdHRyKCJ4IixmdW5jdGlvbihlLHQpe3JldHVybiBhKGUsdCk8MD8tNDpvKGEoZSx0KSktbygwKSs0fSkpOkQuc2VsZWN0QWxsKCJ0ZXh0IikudGV4dCgiIiksRC5hdHRyKCJjbGFzcyIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gYShlLHQpPDA/Im52LWJhciBuZWdhdGl2ZSI6Im52LWJhciBwb3NpdGl2ZSJ9KSxjJiYoaHx8KGg9ZS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4hMH0pKSxELnN0eWxlKCJmaWxsIixmdW5jdGlvbihlLHQsbil7cmV0dXJuIGQzLnJnYihjKGUsdCkpLmRhcmtlcihoLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiB0fSkuZmlsdGVyKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIWhbdF19KVtuXSkudG9TdHJpbmcoKX0pLnN0eWxlKCJzdHJva2UiLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZDMucmdiKGMoZSx0KSkuZGFya2VyKGgubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR9KS5maWx0ZXIoZnVuY3Rpb24oZSx0KXtyZXR1cm4haFt0XX0pW25dKS50b1N0cmluZygpfSkpLHA/RC50cmFuc2l0aW9uKCkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihlLHQpe3JldHVybiJ0cmFuc2xhdGUoIitvKGUueTEpKyIsIitzKHUoZSx0KSkrIikifSkuc2VsZWN0KCJyZWN0IikuYXR0cigid2lkdGgiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIE1hdGguYWJzKG8oYShlLHQpK2UueTApLW8oZS55MCkpfSkuYXR0cigiaGVpZ2h0IixzLnJhbmdlQmFuZCgpKTpELnRyYW5zaXRpb24oKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQsbil7cmV0dXJuInRyYW5zbGF0ZSgiKyhhKHQsbik8MD9vKGEodCxuKSk6bygwKSkrIiwiKyh0LnNlcmllcypzLnJhbmdlQmFuZCgpL2UubGVuZ3RoK3ModSh0LG4pKSkrIikifSkuc2VsZWN0KCJyZWN0IikuYXR0cigiaGVpZ2h0IixzLnJhbmdlQmFuZCgpL2UubGVuZ3RoKS5hdHRyKCJ3aWR0aCIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gTWF0aC5tYXgoTWF0aC5hYnMobyhhKGUsdCkpLW8oMCkpLDEpfSkseD1zLmNvcHkoKSxUPW8uY29weSgpfSksTn12YXIgdD17dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9LG49OTYwLHI9NTAwLGk9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjFlNCkscz1kMy5zY2FsZS5vcmRpbmFsKCksbz1kMy5zY2FsZS5saW5lYXIoKSx1PWZ1bmN0aW9uKGUpe3JldHVybiBlLnh9LGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGUueX0sZj1bMF0sbD1lLnV0aWxzLmRlZmF1bHRDb2xvcigpLGM9bnVsbCxoLHA9ITEsZD0hMSx2PTYwLG09ZDMuZm9ybWF0KCIsLjJmIiksZz0xMjAwLHksYix3LEUsUz1kMy5kaXNwYXRjaCgiY2hhcnRDbGljayIsImVsZW1lbnRDbGljayIsImVsZW1lbnREYmxDbGljayIsImVsZW1lbnRNb3VzZW92ZXIiLCJlbGVtZW50TW91c2VvdXQiKSx4LFQ7cmV0dXJuIE4uZGlzcGF0Y2g9UyxOLm9wdGlvbnM9ZS51dGlscy5vcHRpb25zRnVuYy5iaW5kKE4pLE4ueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1lLE4pOnV9LE4ueT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1lLE4pOmF9LE4ubWFyZ2luPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0LnRvcD10eXBlb2YgZS50b3AhPSJ1bmRlZmluZWQiP2UudG9wOnQudG9wLHQucmlnaHQ9dHlwZW9mIGUucmlnaHQhPSJ1bmRlZmluZWQiP2UucmlnaHQ6dC5yaWdodCx0LmJvdHRvbT10eXBlb2YgZS5ib3R0b20hPSJ1bmRlZmluZWQiP2UuYm90dG9tOnQuYm90dG9tLHQubGVmdD10eXBlb2YgZS5sZWZ0IT0idW5kZWZpbmVkIj9lLmxlZnQ6dC5sZWZ0LE4pOnR9LE4ud2lkdGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSxOKTpufSxOLmhlaWdodD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLE4pOnJ9LE4ueFNjYWxlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPWUsTik6c30sTi55U2NhbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ZSxOKTpvfSxOLnhEb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9ZSxOKTp5fSxOLnlEb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9ZSxOKTpifSxOLnhSYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odz1lLE4pOnd9LE4ueVJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhFPWUsTik6RX0sTi5mb3JjZVk9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ZSxOKTpmfSxOLnN0YWNrZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9ZSxOKTpwfSxOLmNvbG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPWUudXRpbHMuZ2V0Q29sb3IodCksTik6bH0sTi5iYXJDb2xvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1lLnV0aWxzLmdldENvbG9yKHQpLE4pOmN9LE4uZGlzYWJsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ZSxOKTpofSxOLmlkPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUsTik6aX0sTi5kZWxheT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz1lLE4pOmd9LE4uc2hvd1ZhbHVlcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1lLE4pOmR9LE4udmFsdWVGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09ZSxOKTptfSxOLnZhbHVlUGFkZGluZz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj1lLE4pOnZ9LE59LGUubW9kZWxzLm11bHRpQmFySG9yaXpvbnRhbENoYXJ0PWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIFQoZSl7cmV0dXJuIGUuZWFjaChmdW5jdGlvbihoKXt2YXIgZD1kMy5zZWxlY3QodGhpcyksTj10aGlzLEM9KHV8fHBhcnNlSW50KGQuc3R5bGUoIndpZHRoIikpfHw5NjApLW8ubGVmdC1vLnJpZ2h0LGs9KGF8fHBhcnNlSW50KGQuc3R5bGUoImhlaWdodCIpKXx8NDAwKS1vLnRvcC1vLmJvdHRvbTtULnVwZGF0ZT1mdW5jdGlvbigpe2QudHJhbnNpdGlvbigpLmR1cmF0aW9uKFMpLmNhbGwoVCl9LFQuY29udGFpbmVyPXRoaXMsZy5kaXNhYmxlZD1oLm1hcChmdW5jdGlvbihlKXtyZXR1cm4hIWUuZGlzYWJsZWR9KTtpZigheSl7dmFyIEw7eT17fTtmb3IoTCBpbiBnKWdbTF1pbnN0YW5jZW9mIEFycmF5P3lbTF09Z1tMXS5zbGljZSgwKTp5W0xdPWdbTF19aWYoIWh8fCFoLmxlbmd0aHx8IWguZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlcy5sZW5ndGh9KS5sZW5ndGgpe3ZhciBBPWQuc2VsZWN0QWxsKCIubnYtbm9EYXRhIikuZGF0YShbYl0pO3JldHVybiBBLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLCJudmQzIG52LW5vRGF0YSIpLmF0dHIoImR5IiwiLS43ZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKSxBLmF0dHIoIngiLG8ubGVmdCtDLzIpLmF0dHIoInkiLG8udG9wK2svMikudGV4dChmdW5jdGlvbihlKXtyZXR1cm4gZX0pLFR9ZC5zZWxlY3RBbGwoIi5udi1ub0RhdGEiKS5yZW1vdmUoKSx2PXQueFNjYWxlKCksbT10LnlTY2FsZSgpO3ZhciBPPWQuc2VsZWN0QWxsKCJnLm52LXdyYXAubnYtbXVsdGlCYXJIb3Jpem9udGFsQ2hhcnQiKS5kYXRhKFtoXSksTT1PLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudmQzIG52LXdyYXAgbnYtbXVsdGlCYXJIb3Jpem9udGFsQ2hhcnQiKS5hcHBlbmQoImciKSxfPU8uc2VsZWN0KCJnIik7TS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXggbnYtYXhpcyIpLE0uYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi15IG52LWF4aXMiKSxNLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtYmFyc1dyYXAiKSxNLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtbGVnZW5kV3JhcCIpLE0uYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1jb250cm9sc1dyYXAiKSxjJiYoaS53aWR0aChDLUUoKSksdC5iYXJDb2xvcigpJiZoLmZvckVhY2goZnVuY3Rpb24oZSx0KXtlLmNvbG9yPWQzLnJnYigiI2NjYyIpLmRhcmtlcih0KjEuNSkudG9TdHJpbmcoKX0pLF8uc2VsZWN0KCIubnYtbGVnZW5kV3JhcCIpLmRhdHVtKGgpLmNhbGwoaSksby50b3AhPWkuaGVpZ2h0KCkmJihvLnRvcD1pLmhlaWdodCgpLGs9KGF8fHBhcnNlSW50KGQuc3R5bGUoImhlaWdodCIpKXx8NDAwKS1vLnRvcC1vLmJvdHRvbSksXy5zZWxlY3QoIi5udi1sZWdlbmRXcmFwIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrRSgpKyIsIisgLW8udG9wKyIpIikpO2lmKGwpe3ZhciBEPVt7a2V5OiJHcm91cGVkIixkaXNhYmxlZDp0LnN0YWNrZWQoKX0se2tleToiU3RhY2tlZCIsZGlzYWJsZWQ6IXQuc3RhY2tlZCgpfV07cy53aWR0aChFKCkpLmNvbG9yKFsiIzQ0NCIsIiM0NDQiLCIjNDQ0Il0pLF8uc2VsZWN0KCIubnYtY29udHJvbHNXcmFwIikuZGF0dW0oRCkuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDAsIisgLW8udG9wKyIpIikuY2FsbChzKX1PLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK28ubGVmdCsiLCIrby50b3ArIikiKSx0LmRpc2FibGVkKGgubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkfSkpLndpZHRoKEMpLmhlaWdodChrKS5jb2xvcihoLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbG9yfHxmKGUsdCl9KS5maWx0ZXIoZnVuY3Rpb24oZSx0KXtyZXR1cm4haFt0XS5kaXNhYmxlZH0pKTt2YXIgUD1fLnNlbGVjdCgiLm52LWJhcnNXcmFwIikuZGF0dW0oaC5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuZGlzYWJsZWR9KSk7UC50cmFuc2l0aW9uKCkuY2FsbCh0KSxuLnNjYWxlKHYpLnRpY2tzKGsvMjQpLnRpY2tTaXplKC1DLDApLF8uc2VsZWN0KCIubnYteC5udi1heGlzIikudHJhbnNpdGlvbigpLmNhbGwobik7dmFyIEg9Xy5zZWxlY3QoIi5udi14Lm52LWF4aXMiKS5zZWxlY3RBbGwoImciKTtILnNlbGVjdEFsbCgibGluZSwgdGV4dCIpLnN0eWxlKCJvcGFjaXR5IiwxKSxyLnNjYWxlKG0pLnRpY2tzKEMvMTAwKS50aWNrU2l6ZSgtaywwKSxfLnNlbGVjdCgiLm52LXkubnYtYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIraysiKSIpLF8uc2VsZWN0KCIubnYteS5udi1heGlzIikudHJhbnNpdGlvbigpLmNhbGwociksaS5kaXNwYXRjaC5vbigic3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe2c9ZSx3LnN0YXRlQ2hhbmdlKGcpLFQudXBkYXRlKCl9KSxzLmRpc3BhdGNoLm9uKCJsZWdlbmRDbGljayIsZnVuY3Rpb24oZSxuKXtpZighZS5kaXNhYmxlZClyZXR1cm47RD1ELm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD0hMCxlfSksZS5kaXNhYmxlZD0hMTtzd2l0Y2goZS5rZXkpe2Nhc2UiR3JvdXBlZCI6dC5zdGFja2VkKCExKTticmVhaztjYXNlIlN0YWNrZWQiOnQuc3RhY2tlZCghMCl9Zy5zdGFja2VkPXQuc3RhY2tlZCgpLHcuc3RhdGVDaGFuZ2UoZyksVC51cGRhdGUoKX0pLHcub24oInRvb2x0aXBTaG93IixmdW5jdGlvbihlKXtwJiZ4KGUsTi5wYXJlbnROb2RlKX0pLHcub24oImNoYW5nZVN0YXRlIixmdW5jdGlvbihuKXt0eXBlb2Ygbi5kaXNhYmxlZCE9InVuZGVmaW5lZCImJihoLmZvckVhY2goZnVuY3Rpb24oZSx0KXtlLmRpc2FibGVkPW4uZGlzYWJsZWRbdF19KSxnLmRpc2FibGVkPW4uZGlzYWJsZWQpLHR5cGVvZiBuLnN0YWNrZWQhPSJ1bmRlZmluZWQiJiYodC5zdGFja2VkKG4uc3RhY2tlZCksZy5zdGFja2VkPW4uc3RhY2tlZCksZS5jYWxsKFQpfSl9KSxUfXZhciB0PWUubW9kZWxzLm11bHRpQmFySG9yaXpvbnRhbCgpLG49ZS5tb2RlbHMuYXhpcygpLHI9ZS5tb2RlbHMuYXhpcygpLGk9ZS5tb2RlbHMubGVnZW5kKCkuaGVpZ2h0KDMwKSxzPWUubW9kZWxzLmxlZ2VuZCgpLmhlaWdodCgzMCksbz17dG9wOjMwLHJpZ2h0OjIwLGJvdHRvbTo1MCxsZWZ0OjYwfSx1PW51bGwsYT1udWxsLGY9ZS51dGlscy5kZWZhdWx0Q29sb3IoKSxsPSEwLGM9ITAsaD0hMSxwPSEwLGQ9ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm4iPGgzPiIrZSsiIC0gIit0KyI8L2gzPiIrIjxwPiIrbisiPC9wPiJ9LHYsbSxnPXtzdGFja2VkOmh9LHk9bnVsbCxiPSJObyBEYXRhIEF2YWlsYWJsZS4iLHc9ZDMuZGlzcGF0Y2goInRvb2x0aXBTaG93IiwidG9vbHRpcEhpZGUiLCJzdGF0ZUNoYW5nZSIsImNoYW5nZVN0YXRlIiksRT1mdW5jdGlvbigpe3JldHVybiBsPzE4MDowfSxTPTI1MDt0LnN0YWNrZWQoaCksbi5vcmllbnQoImxlZnQiKS50aWNrUGFkZGluZyg1KS5oaWdobGlnaHRaZXJvKCExKS5zaG93TWF4TWluKCExKS50aWNrRm9ybWF0KGZ1bmN0aW9uKGUpe3JldHVybiBlfSksci5vcmllbnQoImJvdHRvbSIpLnRpY2tGb3JtYXQoZDMuZm9ybWF0KCIsLjFmIikpLHMudXBkYXRlU3RhdGUoITEpO3ZhciB4PWZ1bmN0aW9uKGkscyl7dmFyIG89aS5wb3NbMF0rKHMub2Zmc2V0TGVmdHx8MCksdT1pLnBvc1sxXSsocy5vZmZzZXRUb3B8fDApLGE9bi50aWNrRm9ybWF0KCkodC54KCkoaS5wb2ludCxpLnBvaW50SW5kZXgpKSxmPXIudGlja0Zvcm1hdCgpKHQueSgpKGkucG9pbnQsaS5wb2ludEluZGV4KSksbD1kKGkuc2VyaWVzLmtleSxhLGYsaSxUKTtlLnRvb2x0aXAuc2hvdyhbbyx1XSxsLGkudmFsdWU8MD8iZSI6InciLG51bGwscyl9O3JldHVybiB0LmRpc3BhdGNoLm9uKCJlbGVtZW50TW91c2VvdmVyLnRvb2x0aXAiLGZ1bmN0aW9uKGUpe2UucG9zPVtlLnBvc1swXStvLmxlZnQsZS5wb3NbMV0rby50b3BdLHcudG9vbHRpcFNob3coZSl9KSx0LmRpc3BhdGNoLm9uKCJlbGVtZW50TW91c2VvdXQudG9vbHRpcCIsZnVuY3Rpb24oZSl7dy50b29sdGlwSGlkZShlKX0pLHcub24oInRvb2x0aXBIaWRlIixmdW5jdGlvbigpe3AmJmUudG9vbHRpcC5jbGVhbnVwKCl9KSxULmRpc3BhdGNoPXcsVC5tdWx0aWJhcj10LFQubGVnZW5kPWksVC54QXhpcz1uLFQueUF4aXM9cixkMy5yZWJpbmQoVCx0LCJ4IiwieSIsInhEb21haW4iLCJ5RG9tYWluIiwieFJhbmdlIiwieVJhbmdlIiwiZm9yY2VYIiwiZm9yY2VZIiwiY2xpcEVkZ2UiLCJpZCIsImRlbGF5Iiwic2hvd1ZhbHVlcyIsInZhbHVlRm9ybWF0Iiwic3RhY2tlZCIsImJhckNvbG9yIiksVC5vcHRpb25zPWUudXRpbHMub3B0aW9uc0Z1bmMuYmluZChUKSxULm1hcmdpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oby50b3A9dHlwZW9mIGUudG9wIT0idW5kZWZpbmVkIj9lLnRvcDpvLnRvcCxvLnJpZ2h0PXR5cGVvZiBlLnJpZ2h0IT0idW5kZWZpbmVkIj9lLnJpZ2h0Om8ucmlnaHQsby5ib3R0b209dHlwZW9mIGUuYm90dG9tIT0idW5kZWZpbmVkIj9lLmJvdHRvbTpvLmJvdHRvbSxvLmxlZnQ9dHlwZW9mIGUubGVmdCE9InVuZGVmaW5lZCI/ZS5sZWZ0Om8ubGVmdCxUKTpvfSxULndpZHRoPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWUsVCk6dX0sVC5oZWlnaHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ZSxUKTphfSxULmNvbG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPWUudXRpbHMuZ2V0Q29sb3IodCksaS5jb2xvcihmKSxUKTpmfSxULnNob3dDb250cm9scz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1lLFQpOmx9LFQuc2hvd0xlZ2VuZD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1lLFQpOmN9LFQudG9vbHRpcD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1lLFQpOmR9LFQudG9vbHRpcHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9ZSxUKTpwfSxULnRvb2x0aXBDb250ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPWUsVCk6ZH0sVC5zdGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz1lLFQpOmd9LFQuZGVmYXVsdFN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PWUsVCk6eX0sVC5ub0RhdGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9ZSxUKTpifSxULnRyYW5zaXRpb25EdXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oUz1lLFQpOlN9LFR9LGUubW9kZWxzLm11bHRpQ2hhcnQ9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gQyhlKXtyZXR1cm4gZS5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB1PWQzLnNlbGVjdCh0aGlzKSxmPXRoaXM7Qy51cGRhdGU9ZnVuY3Rpb24oKXt1LnRyYW5zaXRpb24oKS5jYWxsKEMpfSxDLmNvbnRhaW5lcj10aGlzO3ZhciBrPShyfHxwYXJzZUludCh1LnN0eWxlKCJ3aWR0aCIpKXx8OTYwKS10LmxlZnQtdC5yaWdodCxMPShpfHxwYXJzZUludCh1LnN0eWxlKCJoZWlnaHQiKSl8fDQwMCktdC50b3AtdC5ib3R0b20sQT1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5kaXNhYmxlZCYmZS50eXBlPT0ibGluZSImJmUueUF4aXM9PTF9KSxPPWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmRpc2FibGVkJiZlLnR5cGU9PSJsaW5lIiYmZS55QXhpcz09Mn0pLE09ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuZGlzYWJsZWQmJmUudHlwZT09ImJhciImJmUueUF4aXM9PTF9KSxfPWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmRpc2FibGVkJiZlLnR5cGU9PSJiYXIiJiZlLnlBeGlzPT0yfSksRD1lLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5kaXNhYmxlZCYmZS50eXBlPT0iYXJlYSImJmUueUF4aXM9PTF9KSxQPWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmRpc2FibGVkJiZlLnR5cGU9PSJhcmVhIiYmZS55QXhpcz09Mn0pLEg9ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuZGlzYWJsZWQmJmUueUF4aXM9PTF9KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudmFsdWVzLm1hcChmdW5jdGlvbihlLHQpe3JldHVybnt4OmUueCx5OmUueX19KX0pLEI9ZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuZGlzYWJsZWQmJmUueUF4aXM9PTJ9KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUudmFsdWVzLm1hcChmdW5jdGlvbihlLHQpe3JldHVybnt4OmUueCx5OmUueX19KX0pO2EuZG9tYWluKGQzLmV4dGVudChkMy5tZXJnZShILmNvbmNhdChCKSksZnVuY3Rpb24oZSl7cmV0dXJuIGUueH0pKS5yYW5nZShbMCxrXSk7dmFyIGo9dS5zZWxlY3RBbGwoImcud3JhcC5tdWx0aUNoYXJ0IikuZGF0YShbZV0pLEY9ai5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwid3JhcCBudmQzIG11bHRpQ2hhcnQiKS5hcHBlbmQoImciKTtGLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwieCBheGlzIiksRi5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInkxIGF4aXMiKSxGLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwieTIgYXhpcyIpLEYuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsaW5lczFXcmFwIiksRi5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxpbmVzMldyYXAiKSxGLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwiYmFyczFXcmFwIiksRi5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImJhcnMyV3JhcCIpLEYuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJzdGFjazFXcmFwIiksRi5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInN0YWNrMldyYXAiKSxGLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibGVnZW5kV3JhcCIpO3ZhciBJPWouc2VsZWN0KCJnIik7cyYmKHgud2lkdGgoay8yKSxJLnNlbGVjdCgiLmxlZ2VuZFdyYXAiKS5kYXR1bShlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5vcmlnaW5hbEtleT1lLm9yaWdpbmFsS2V5PT09dW5kZWZpbmVkP2Uua2V5OmUub3JpZ2luYWxLZXksZS5rZXk9ZS5vcmlnaW5hbEtleSsoZS55QXhpcz09MT8iIjoiIChyaWdodCBheGlzKSIpLGV9KSkuY2FsbCh4KSx0LnRvcCE9eC5oZWlnaHQoKSYmKHQudG9wPXguaGVpZ2h0KCksTD0oaXx8cGFyc2VJbnQodS5zdHlsZSgiaGVpZ2h0IikpfHw0MDApLXQudG9wLXQuYm90dG9tKSxJLnNlbGVjdCgiLmxlZ2VuZFdyYXAiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitrLzIrIiwiKyAtdC50b3ArIikiKSksZC53aWR0aChrKS5oZWlnaHQoTCkuaW50ZXJwb2xhdGUoIm1vbm90b25lIikuY29sb3IoZS5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb2xvcnx8blt0JW4ubGVuZ3RoXX0pLmZpbHRlcihmdW5jdGlvbih0LG4pe3JldHVybiFlW25dLmRpc2FibGVkJiZlW25dLnlBeGlzPT0xJiZlW25dLnR5cGU9PSJsaW5lIn0pKSx2LndpZHRoKGspLmhlaWdodChMKS5pbnRlcnBvbGF0ZSgibW9ub3RvbmUiKS5jb2xvcihlLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbG9yfHxuW3Qlbi5sZW5ndGhdfSkuZmlsdGVyKGZ1bmN0aW9uKHQsbil7cmV0dXJuIWVbbl0uZGlzYWJsZWQmJmVbbl0ueUF4aXM9PTImJmVbbl0udHlwZT09ImxpbmUifSkpLG0ud2lkdGgoaykuaGVpZ2h0KEwpLmNvbG9yKGUubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29sb3J8fG5bdCVuLmxlbmd0aF19KS5maWx0ZXIoZnVuY3Rpb24odCxuKXtyZXR1cm4hZVtuXS5kaXNhYmxlZCYmZVtuXS55QXhpcz09MSYmZVtuXS50eXBlPT0iYmFyIn0pKSxnLndpZHRoKGspLmhlaWdodChMKS5jb2xvcihlLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbG9yfHxuW3Qlbi5sZW5ndGhdfSkuZmlsdGVyKGZ1bmN0aW9uKHQsbil7cmV0dXJuIWVbbl0uZGlzYWJsZWQmJmVbbl0ueUF4aXM9PTImJmVbbl0udHlwZT09ImJhciJ9KSkseS53aWR0aChrKS5oZWlnaHQoTCkuY29sb3IoZS5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb2xvcnx8blt0JW4ubGVuZ3RoXX0pLmZpbHRlcihmdW5jdGlvbih0LG4pe3JldHVybiFlW25dLmRpc2FibGVkJiZlW25dLnlBeGlzPT0xJiZlW25dLnR5cGU9PSJhcmVhIn0pKSxiLndpZHRoKGspLmhlaWdodChMKS5jb2xvcihlLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbG9yfHxuW3Qlbi5sZW5ndGhdfSkuZmlsdGVyKGZ1bmN0aW9uKHQsbil7cmV0dXJuIWVbbl0uZGlzYWJsZWQmJmVbbl0ueUF4aXM9PTImJmVbbl0udHlwZT09ImFyZWEifSkpLEkuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrdC5sZWZ0KyIsIit0LnRvcCsiKSIpO3ZhciBxPUkuc2VsZWN0KCIubGluZXMxV3JhcCIpLmRhdHVtKEEpLFI9SS5zZWxlY3QoIi5iYXJzMVdyYXAiKS5kYXR1bShNKSxVPUkuc2VsZWN0KCIuc3RhY2sxV3JhcCIpLmRhdHVtKEQpLHo9SS5zZWxlY3QoIi5saW5lczJXcmFwIikuZGF0dW0oTyksVz1JLnNlbGVjdCgiLmJhcnMyV3JhcCIpLmRhdHVtKF8pLFg9SS5zZWxlY3QoIi5zdGFjazJXcmFwIikuZGF0dW0oUCksVj1ELmxlbmd0aD9ELm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZXN9KS5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSxuKXtyZXR1cm57eDplLngseTplLnkrdFtuXS55fX0pfSkuY29uY2F0KFt7eDowLHk6MH1dKTpbXSwkPVAubGVuZ3RoP1AubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlc30pLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlLm1hcChmdW5jdGlvbihlLG4pe3JldHVybnt4OmUueCx5OmUueSt0W25dLnl9fSl9KS5jb25jYXQoW3t4OjAseTowfV0pOltdO2guZG9tYWluKGx8fGQzLmV4dGVudChkMy5tZXJnZShIKS5jb25jYXQoViksZnVuY3Rpb24oZSl7cmV0dXJuIGUueX0pKS5yYW5nZShbMCxMXSkscC5kb21haW4oY3x8ZDMuZXh0ZW50KGQzLm1lcmdlKEIpLmNvbmNhdCgkKSxmdW5jdGlvbihlKXtyZXR1cm4gZS55fSkpLnJhbmdlKFswLExdKSxkLnlEb21haW4oaC5kb21haW4oKSksbS55RG9tYWluKGguZG9tYWluKCkpLHkueURvbWFpbihoLmRvbWFpbigpKSx2LnlEb21haW4ocC5kb21haW4oKSksZy55RG9tYWluKHAuZG9tYWluKCkpLGIueURvbWFpbihwLmRvbWFpbigpKSxELmxlbmd0aCYmZDMudHJhbnNpdGlvbihVKS5jYWxsKHkpLFAubGVuZ3RoJiZkMy50cmFuc2l0aW9uKFgpLmNhbGwoYiksTS5sZW5ndGgmJmQzLnRyYW5zaXRpb24oUikuY2FsbChtKSxfLmxlbmd0aCYmZDMudHJhbnNpdGlvbihXKS5jYWxsKGcpLEEubGVuZ3RoJiZkMy50cmFuc2l0aW9uKHEpLmNhbGwoZCksTy5sZW5ndGgmJmQzLnRyYW5zaXRpb24oeikuY2FsbCh2KSx3LnRpY2tzKGsvMTAwKS50aWNrU2l6ZSgtTCwwKSxJLnNlbGVjdCgiLnguYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIrTCsiKSIpLGQzLnRyYW5zaXRpb24oSS5zZWxlY3QoIi54LmF4aXMiKSkuY2FsbCh3KSxFLnRpY2tzKEwvMzYpLnRpY2tTaXplKC1rLDApLGQzLnRyYW5zaXRpb24oSS5zZWxlY3QoIi55MS5heGlzIikpLmNhbGwoRSksUy50aWNrcyhMLzM2KS50aWNrU2l6ZSgtaywwKSxkMy50cmFuc2l0aW9uKEkuc2VsZWN0KCIueTIuYXhpcyIpKS5jYWxsKFMpLEkuc2VsZWN0KCIueTIuYXhpcyIpLnN0eWxlKCJvcGFjaXR5IixCLmxlbmd0aD8xOjApLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2EucmFuZ2UoKVsxXSsiLDApIikseC5kaXNwYXRjaC5vbigic3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe0MudXBkYXRlKCl9KSxULm9uKCJ0b29sdGlwU2hvdyIsZnVuY3Rpb24oZSl7byYmTihlLGYucGFyZW50Tm9kZSl9KX0pLEN9dmFyIHQ9e3RvcDozMCxyaWdodDoyMCxib3R0b206NTAsbGVmdDo2MH0sbj1kMy5zY2FsZS5jYXRlZ29yeTIwKCkucmFuZ2UoKSxyPW51bGwsaT1udWxsLHM9ITAsbz0hMCx1PWZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJuIjxoMz4iK2UrIjwvaDM+IisiPHA+IituKyIgYXQgIit0KyI8L3A+In0sYSxmLGwsYyxhPWQzLnNjYWxlLmxpbmVhcigpLGg9ZDMuc2NhbGUubGluZWFyKCkscD1kMy5zY2FsZS5saW5lYXIoKSxkPWUubW9kZWxzLmxpbmUoKS55U2NhbGUoaCksdj1lLm1vZGVscy5saW5lKCkueVNjYWxlKHApLG09ZS5tb2RlbHMubXVsdGlCYXIoKS5zdGFja2VkKCExKS55U2NhbGUoaCksZz1lLm1vZGVscy5tdWx0aUJhcigpLnN0YWNrZWQoITEpLnlTY2FsZShwKSx5PWUubW9kZWxzLnN0YWNrZWRBcmVhKCkueVNjYWxlKGgpLGI9ZS5tb2RlbHMuc3RhY2tlZEFyZWEoKS55U2NhbGUocCksdz1lLm1vZGVscy5heGlzKCkuc2NhbGUoYSkub3JpZW50KCJib3R0b20iKS50aWNrUGFkZGluZyg1KSxFPWUubW9kZWxzLmF4aXMoKS5zY2FsZShoKS5vcmllbnQoImxlZnQiKSxTPWUubW9kZWxzLmF4aXMoKS5zY2FsZShwKS5vcmllbnQoInJpZ2h0IikseD1lLm1vZGVscy5sZWdlbmQoKS5oZWlnaHQoMzApLFQ9ZDMuZGlzcGF0Y2goInRvb2x0aXBTaG93IiwidG9vbHRpcEhpZGUiKSxOPWZ1bmN0aW9uKHQsbil7dmFyIHI9dC5wb3NbMF0rKG4ub2Zmc2V0TGVmdHx8MCksaT10LnBvc1sxXSsobi5vZmZzZXRUb3B8fDApLHM9dy50aWNrRm9ybWF0KCkoZC54KCkodC5wb2ludCx0LnBvaW50SW5kZXgpKSxvPSh0LnNlcmllcy55QXhpcz09Mj9TOkUpLnRpY2tGb3JtYXQoKShkLnkoKSh0LnBvaW50LHQucG9pbnRJbmRleCkpLGE9dSh0LnNlcmllcy5rZXkscyxvLHQsQyk7ZS50b29sdGlwLnNob3coW3IsaV0sYSx1bmRlZmluZWQsdW5kZWZpbmVkLG4ub2Zmc2V0UGFyZW50KX07cmV0dXJuIGQuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW92ZXIudG9vbHRpcCIsZnVuY3Rpb24oZSl7ZS5wb3M9W2UucG9zWzBdK3QubGVmdCxlLnBvc1sxXSt0LnRvcF0sVC50b29sdGlwU2hvdyhlKX0pLGQuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW91dC50b29sdGlwIixmdW5jdGlvbihlKXtULnRvb2x0aXBIaWRlKGUpfSksdi5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlb3Zlci50b29sdGlwIixmdW5jdGlvbihlKXtlLnBvcz1bZS5wb3NbMF0rdC5sZWZ0LGUucG9zWzFdK3QudG9wXSxULnRvb2x0aXBTaG93KGUpfSksdi5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlb3V0LnRvb2x0aXAiLGZ1bmN0aW9uKGUpe1QudG9vbHRpcEhpZGUoZSl9KSxtLmRpc3BhdGNoLm9uKCJlbGVtZW50TW91c2VvdmVyLnRvb2x0aXAiLGZ1bmN0aW9uKGUpe2UucG9zPVtlLnBvc1swXSt0LmxlZnQsZS5wb3NbMV0rdC50b3BdLFQudG9vbHRpcFNob3coZSl9KSxtLmRpc3BhdGNoLm9uKCJlbGVtZW50TW91c2VvdXQudG9vbHRpcCIsZnVuY3Rpb24oZSl7VC50b29sdGlwSGlkZShlKX0pLGcuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW92ZXIudG9vbHRpcCIsZnVuY3Rpb24oZSl7ZS5wb3M9W2UucG9zWzBdK3QubGVmdCxlLnBvc1sxXSt0LnRvcF0sVC50b29sdGlwU2hvdyhlKX0pLGcuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW91dC50b29sdGlwIixmdW5jdGlvbihlKXtULnRvb2x0aXBIaWRlKGUpfSkseS5kaXNwYXRjaC5vbigidG9vbHRpcFNob3ciLGZ1bmN0aW9uKGUpe2lmKCFNYXRoLnJvdW5kKHkueSgpKGUucG9pbnQpKjEwMCkpcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtkMy5zZWxlY3RBbGwoIi5wb2ludC5ob3ZlciIpLmNsYXNzZWQoImhvdmVyIiwhMSl9LDApLCExO2UucG9zPVtlLnBvc1swXSt0LmxlZnQsZS5wb3NbMV0rdC50b3BdLFQudG9vbHRpcFNob3coZSl9KSx5LmRpc3BhdGNoLm9uKCJ0b29sdGlwSGlkZSIsZnVuY3Rpb24oZSl7VC50b29sdGlwSGlkZShlKX0pLGIuZGlzcGF0Y2gub24oInRvb2x0aXBTaG93IixmdW5jdGlvbihlKXtpZighTWF0aC5yb3VuZChiLnkoKShlLnBvaW50KSoxMDApKXJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZDMuc2VsZWN0QWxsKCIucG9pbnQuaG92ZXIiKS5jbGFzc2VkKCJob3ZlciIsITEpfSwwKSwhMTtlLnBvcz1bZS5wb3NbMF0rdC5sZWZ0LGUucG9zWzFdK3QudG9wXSxULnRvb2x0aXBTaG93KGUpfSksYi5kaXNwYXRjaC5vbigidG9vbHRpcEhpZGUiLGZ1bmN0aW9uKGUpe1QudG9vbHRpcEhpZGUoZSl9KSxkLmRpc3BhdGNoLm9uKCJlbGVtZW50TW91c2VvdmVyLnRvb2x0aXAiLGZ1bmN0aW9uKGUpe2UucG9zPVtlLnBvc1swXSt0LmxlZnQsZS5wb3NbMV0rdC50b3BdLFQudG9vbHRpcFNob3coZSl9KSxkLmRpc3BhdGNoLm9uKCJlbGVtZW50TW91c2VvdXQudG9vbHRpcCIsZnVuY3Rpb24oZSl7VC50b29sdGlwSGlkZShlKX0pLHYuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW92ZXIudG9vbHRpcCIsZnVuY3Rpb24oZSl7ZS5wb3M9W2UucG9zWzBdK3QubGVmdCxlLnBvc1sxXSt0LnRvcF0sVC50b29sdGlwU2hvdyhlKX0pLHYuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW91dC50b29sdGlwIixmdW5jdGlvbihlKXtULnRvb2x0aXBIaWRlKGUpfSksVC5vbigidG9vbHRpcEhpZGUiLGZ1bmN0aW9uKCl7byYmZS50b29sdGlwLmNsZWFudXAoKX0pLEMuZGlzcGF0Y2g9VCxDLmxpbmVzMT1kLEMubGluZXMyPXYsQy5iYXJzMT1tLEMuYmFyczI9ZyxDLnN0YWNrMT15LEMuc3RhY2syPWIsQy54QXhpcz13LEMueUF4aXMxPUUsQy55QXhpczI9UyxDLm9wdGlvbnM9ZS51dGlscy5vcHRpb25zRnVuYy5iaW5kKEMpLEMueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZ2V0WD1lLGQueChlKSxtLngoZSksQyk6Z2V0WH0sQy55PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnZXRZPWUsZC55KGUpLG0ueShlKSxDKTpnZXRZfSxDLnlEb21haW4xPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPWUsQyk6bH0sQy55RG9tYWluMj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1lLEMpOmN9LEMubWFyZ2luPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsQyk6dH0sQy53aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLEMpOnJ9LEMuaGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUsQyk6aX0sQy5jb2xvcj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLHguY29sb3IoZSksQyk6bn0sQy5zaG93TGVnZW5kPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPWUsQyk6c30sQy50b29sdGlwcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1lLEMpOm99LEMudG9vbHRpcENvbnRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ZSxDKTp1fSxDfSxlLm1vZGVscy5vaGxjQmFyPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHgoZSl7cmV0dXJuIGUuZWFjaChmdW5jdGlvbihlKXt2YXIgZz1uLXQubGVmdC10LnJpZ2h0LHg9ci10LnRvcC10LmJvdHRvbSxUPWQzLnNlbGVjdCh0aGlzKTtzLmRvbWFpbih5fHxkMy5leHRlbnQoZVswXS52YWx1ZXMubWFwKHUpLmNvbmNhdChwKSkpLHY/cy5yYW5nZSh3fHxbZyouNS9lWzBdLnZhbHVlcy5sZW5ndGgsZyooZVswXS52YWx1ZXMubGVuZ3RoLS41KS9lWzBdLnZhbHVlcy5sZW5ndGhdKTpzLnJhbmdlKHd8fFswLGddKSxvLmRvbWFpbihifHxbZDMubWluKGVbMF0udmFsdWVzLm1hcChoKS5jb25jYXQoZCkpLGQzLm1heChlWzBdLnZhbHVlcy5tYXAoYykuY29uY2F0KGQpKV0pLnJhbmdlKEV8fFt4LDBdKTtpZihzLmRvbWFpbigpWzBdPT09cy5kb21haW4oKVsxXXx8by5kb21haW4oKVswXT09PW8uZG9tYWluKClbMV0pc2luZ2xlUG9pbnQ9ITA7cy5kb21haW4oKVswXT09PXMuZG9tYWluKClbMV0mJihzLmRvbWFpbigpWzBdP3MuZG9tYWluKFtzLmRvbWFpbigpWzBdLXMuZG9tYWluKClbMF0qLjAxLHMuZG9tYWluKClbMV0rcy5kb21haW4oKVsxXSouMDFdKTpzLmRvbWFpbihbLTEsMV0pKSxvLmRvbWFpbigpWzBdPT09by5kb21haW4oKVsxXSYmKG8uZG9tYWluKClbMF0/by5kb21haW4oW28uZG9tYWluKClbMF0rby5kb21haW4oKVswXSouMDEsby5kb21haW4oKVsxXS1vLmRvbWFpbigpWzFdKi4wMV0pOm8uZG9tYWluKFstMSwxXSkpO3ZhciBOPWQzLnNlbGVjdCh0aGlzKS5zZWxlY3RBbGwoImcubnYtd3JhcC5udi1vaGxjQmFyIikuZGF0YShbZVswXS52YWx1ZXNdKSxDPU4uZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52ZDMgbnYtd3JhcCBudi1vaGxjQmFyIiksaz1DLmFwcGVuZCgiZGVmcyIpLEw9Qy5hcHBlbmQoImciKSxBPU4uc2VsZWN0KCJnIik7TC5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXRpY2tzIiksTi5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit0LmxlZnQrIiwiK3QudG9wKyIpIiksVC5vbigiY2xpY2siLGZ1bmN0aW9uKGUsdCl7Uy5jaGFydENsaWNrKHtkYXRhOmUsaW5kZXg6dCxwb3M6ZDMuZXZlbnQsaWQ6aX0pfSksay5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLCJudi1jaGFydC1jbGlwLXBhdGgtIitpKS5hcHBlbmQoInJlY3QiKSxOLnNlbGVjdCgiI252LWNoYXJ0LWNsaXAtcGF0aC0iK2krIiByZWN0IikuYXR0cigid2lkdGgiLGcpLmF0dHIoImhlaWdodCIseCksQS5hdHRyKCJjbGlwLXBhdGgiLG0/InVybCgjbnYtY2hhcnQtY2xpcC1wYXRoLSIraSsiKSI6IiIpO3ZhciBPPU4uc2VsZWN0KCIubnYtdGlja3MiKS5zZWxlY3RBbGwoIi5udi10aWNrIikuZGF0YShmdW5jdGlvbihlKXtyZXR1cm4gZX0pO08uZXhpdCgpLnJlbW92ZSgpO3ZhciBNPU8uZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24oZSx0LG4pe3JldHVybihmKGUsdCk+bChlLHQpPyJudi10aWNrIG5lZ2F0aXZlIjoibnYtdGljayBwb3NpdGl2ZSIpKyIgbnYtdGljay0iK24rIi0iK3R9KS5hdHRyKCJkIixmdW5jdGlvbih0LG4pe3ZhciByPWcvZVswXS52YWx1ZXMubGVuZ3RoKi45O3JldHVybiJtMCwwbDAsIisobyhmKHQsbikpLW8oYyh0LG4pKSkrImwiKyAtci8yKyIsMGwiK3IvMisiLDBsMCwiKyhvKGgodCxuKSktbyhmKHQsbikpKSsibDAsIisobyhsKHQsbikpLW8oaCh0LG4pKSkrImwiK3IvMisiLDBsIisgLXIvMisiLDB6In0pLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oZSx0KXtyZXR1cm4idHJhbnNsYXRlKCIrcyh1KGUsdCkpKyIsIitvKGMoZSx0KSkrIikifSkub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24odCxuKXtkMy5zZWxlY3QodGhpcykuY2xhc3NlZCgiaG92ZXIiLCEwKSxTLmVsZW1lbnRNb3VzZW92ZXIoe3BvaW50OnQsc2VyaWVzOmVbMF0scG9zOltzKHUodCxuKSksbyhhKHQsbikpXSxwb2ludEluZGV4Om4sc2VyaWVzSW5kZXg6MCxlOmQzLmV2ZW50fSl9KS5vbigibW91c2VvdXQiLGZ1bmN0aW9uKHQsbil7ZDMuc2VsZWN0KHRoaXMpLmNsYXNzZWQoImhvdmVyIiwhMSksUy5lbGVtZW50TW91c2VvdXQoe3BvaW50OnQsc2VyaWVzOmVbMF0scG9pbnRJbmRleDpuLHNlcmllc0luZGV4OjAsZTpkMy5ldmVudH0pfSkub24oImNsaWNrIixmdW5jdGlvbihlLHQpe1MuZWxlbWVudENsaWNrKHt2YWx1ZTphKGUsdCksZGF0YTplLGluZGV4OnQscG9zOltzKHUoZSx0KSksbyhhKGUsdCkpXSxlOmQzLmV2ZW50LGlkOml9KSxkMy5ldmVudC5zdG9wUHJvcGFnYXRpb24oKX0pLm9uKCJkYmxjbGljayIsZnVuY3Rpb24oZSx0KXtTLmVsZW1lbnREYmxDbGljayh7dmFsdWU6YShlLHQpLGRhdGE6ZSxpbmRleDp0LHBvczpbcyh1KGUsdCkpLG8oYShlLHQpKV0sZTpkMy5ldmVudCxpZDppfSksZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9KTtPLmF0dHIoImNsYXNzIixmdW5jdGlvbihlLHQsbil7cmV0dXJuKGYoZSx0KT5sKGUsdCk/Im52LXRpY2sgbmVnYXRpdmUiOiJudi10aWNrIHBvc2l0aXZlIikrIiBudi10aWNrLSIrbisiLSIrdH0pLGQzLnRyYW5zaXRpb24oTykuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihlLHQpe3JldHVybiJ0cmFuc2xhdGUoIitzKHUoZSx0KSkrIiwiK28oYyhlLHQpKSsiKSJ9KS5hdHRyKCJkIixmdW5jdGlvbih0LG4pe3ZhciByPWcvZVswXS52YWx1ZXMubGVuZ3RoKi45O3JldHVybiJtMCwwbDAsIisobyhmKHQsbikpLW8oYyh0LG4pKSkrImwiKyAtci8yKyIsMGwiK3IvMisiLDBsMCwiKyhvKGgodCxuKSktbyhmKHQsbikpKSsibDAsIisobyhsKHQsbikpLW8oaCh0LG4pKSkrImwiK3IvMisiLDBsIisgLXIvMisiLDB6In0pfSkseH12YXIgdD17dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9LG49OTYwLHI9NTAwLGk9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjFlNCkscz1kMy5zY2FsZS5saW5lYXIoKSxvPWQzLnNjYWxlLmxpbmVhcigpLHU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUueH0sYT1mdW5jdGlvbihlKXtyZXR1cm4gZS55fSxmPWZ1bmN0aW9uKGUpe3JldHVybiBlLm9wZW59LGw9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xvc2V9LGM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaGlnaH0saD1mdW5jdGlvbihlKXtyZXR1cm4gZS5sb3d9LHA9W10sZD1bXSx2PSExLG09ITAsZz1lLnV0aWxzLmRlZmF1bHRDb2xvcigpLHksYix3LEUsUz1kMy5kaXNwYXRjaCgiY2hhcnRDbGljayIsImVsZW1lbnRDbGljayIsImVsZW1lbnREYmxDbGljayIsImVsZW1lbnRNb3VzZW92ZXIiLCJlbGVtZW50TW91c2VvdXQiKTtyZXR1cm4geC5kaXNwYXRjaD1TLHgub3B0aW9ucz1lLnV0aWxzLm9wdGlvbnNGdW5jLmJpbmQoeCkseC54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWUseCk6dX0seC55PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWUseCk6YX0seC5vcGVuPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPWUseCk6Zn0seC5jbG9zZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1lLHgpOmx9LHguaGlnaD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1lLHgpOmN9LHgubG93PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPWUseCk6aH0seC5tYXJnaW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQudG9wPXR5cGVvZiBlLnRvcCE9InVuZGVmaW5lZCI/ZS50b3A6dC50b3AsdC5yaWdodD10eXBlb2YgZS5yaWdodCE9InVuZGVmaW5lZCI/ZS5yaWdodDp0LnJpZ2h0LHQuYm90dG9tPXR5cGVvZiBlLmJvdHRvbSE9InVuZGVmaW5lZCI/ZS5ib3R0b206dC5ib3R0b20sdC5sZWZ0PXR5cGVvZiBlLmxlZnQhPSJ1bmRlZmluZWQiP2UubGVmdDp0LmxlZnQseCk6dH0seC53aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLHgpOm59LHguaGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWUseCk6cn0seC54U2NhbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ZSx4KTpzfSx4LnlTY2FsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1lLHgpOm99LHgueERvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT1lLHgpOnl9LHgueURvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj1lLHgpOmJ9LHgueFJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PWUseCk6d30seC55UmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEU9ZSx4KTpFfSx4LmZvcmNlWD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1lLHgpOnB9LHguZm9yY2VZPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPWUseCk6ZH0seC5wYWREYXRhPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PWUseCk6dn0seC5jbGlwRWRnZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1lLHgpOm19LHguY29sb3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ZS51dGlscy5nZXRDb2xvcih0KSx4KTpnfSx4LmlkPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUseCk6aX0seH0sZS5tb2RlbHMucGllPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIEUoZSl7cmV0dXJuIGUuZWFjaChmdW5jdGlvbihlKXtmdW5jdGlvbiBQKGUpe3ZhciB0PShlLnN0YXJ0QW5nbGUrZS5lbmRBbmdsZSkqOTAvTWF0aC5QSS05MDtyZXR1cm4gdD45MD90LTE4MDp0fWZ1bmN0aW9uIEgoZSl7ZS5lbmRBbmdsZT1pc05hTihlLmVuZEFuZ2xlKT8wOmUuZW5kQW5nbGUsZS5zdGFydEFuZ2xlPWlzTmFOKGUuc3RhcnRBbmdsZSk/MDplLnN0YXJ0QW5nbGUsdnx8KGUuaW5uZXJSYWRpdXM9MCk7dmFyIHQ9ZDMuaW50ZXJwb2xhdGUodGhpcy5fY3VycmVudCxlKTtyZXR1cm4gdGhpcy5fY3VycmVudD10KDApLGZ1bmN0aW9uKAplKXtyZXR1cm4gTCh0KGUpKX19ZnVuY3Rpb24gQihlKXtlLmlubmVyUmFkaXVzPTA7dmFyIHQ9ZDMuaW50ZXJwb2xhdGUoe3N0YXJ0QW5nbGU6MCxlbmRBbmdsZTowfSxlKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIEwodChlKSl9fXZhciBvPW4tdC5sZWZ0LXQucmlnaHQsZj1yLXQudG9wLXQuYm90dG9tLEU9TWF0aC5taW4obyxmKS8yLFM9RS1FLzUseD1kMy5zZWxlY3QodGhpcyksVD14LnNlbGVjdEFsbCgiLm52LXdyYXAubnYtcGllIikuZGF0YShlKSxOPVQuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52ZDMgbnYtd3JhcCBudi1waWUgbnYtY2hhcnQtIit1KSxDPU4uYXBwZW5kKCJnIiksaz1ULnNlbGVjdCgiZyIpO0MuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1waWUiKSxULmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3QubGVmdCsiLCIrdC50b3ArIikiKSxrLnNlbGVjdCgiLm52LXBpZSIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK28vMisiLCIrZi8yKyIpIikseC5vbigiY2xpY2siLGZ1bmN0aW9uKGUsdCl7dy5jaGFydENsaWNrKHtkYXRhOmUsaW5kZXg6dCxwb3M6ZDMuZXZlbnQsaWQ6dX0pfSk7dmFyIEw9ZDMuc3ZnLmFyYygpLm91dGVyUmFkaXVzKFMpO2cmJkwuc3RhcnRBbmdsZShnKSx5JiZMLmVuZEFuZ2xlKHkpLHYmJkwuaW5uZXJSYWRpdXMoRSpiKTt2YXIgQT1kMy5sYXlvdXQucGllKCkuc29ydChudWxsKS52YWx1ZShmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD8wOnMoZSl9KSxPPVQuc2VsZWN0KCIubnYtcGllIikuc2VsZWN0QWxsKCIubnYtc2xpY2UiKS5kYXRhKEEpO08uZXhpdCgpLnJlbW92ZSgpO3ZhciBNPU8uZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXNsaWNlIikub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oZSx0KXtkMy5zZWxlY3QodGhpcykuY2xhc3NlZCgiaG92ZXIiLCEwKSx3LmVsZW1lbnRNb3VzZW92ZXIoe2xhYmVsOmkoZS5kYXRhKSx2YWx1ZTpzKGUuZGF0YSkscG9pbnQ6ZS5kYXRhLHBvaW50SW5kZXg6dCxwb3M6W2QzLmV2ZW50LnBhZ2VYLGQzLmV2ZW50LnBhZ2VZXSxpZDp1fSl9KS5vbigibW91c2VvdXQiLGZ1bmN0aW9uKGUsdCl7ZDMuc2VsZWN0KHRoaXMpLmNsYXNzZWQoImhvdmVyIiwhMSksdy5lbGVtZW50TW91c2VvdXQoe2xhYmVsOmkoZS5kYXRhKSx2YWx1ZTpzKGUuZGF0YSkscG9pbnQ6ZS5kYXRhLGluZGV4OnQsaWQ6dX0pfSkub24oImNsaWNrIixmdW5jdGlvbihlLHQpe3cuZWxlbWVudENsaWNrKHtsYWJlbDppKGUuZGF0YSksdmFsdWU6cyhlLmRhdGEpLHBvaW50OmUuZGF0YSxpbmRleDp0LHBvczpkMy5ldmVudCxpZDp1fSksZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9KS5vbigiZGJsY2xpY2siLGZ1bmN0aW9uKGUsdCl7dy5lbGVtZW50RGJsQ2xpY2soe2xhYmVsOmkoZS5kYXRhKSx2YWx1ZTpzKGUuZGF0YSkscG9pbnQ6ZS5kYXRhLGluZGV4OnQscG9zOmQzLmV2ZW50LGlkOnV9KSxkMy5ldmVudC5zdG9wUHJvcGFnYXRpb24oKX0pO08uYXR0cigiZmlsbCIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gYShlLHQpfSkuYXR0cigic3Ryb2tlIixmdW5jdGlvbihlLHQpe3JldHVybiBhKGUsdCl9KTt2YXIgXz1NLmFwcGVuZCgicGF0aCIpLmVhY2goZnVuY3Rpb24oZSl7dGhpcy5fY3VycmVudD1lfSk7ZDMudHJhbnNpdGlvbihPLnNlbGVjdCgicGF0aCIpKS5hdHRyKCJkIixMKS5hdHRyVHdlZW4oImQiLEgpO2lmKGwpe3ZhciBEPWQzLnN2Zy5hcmMoKS5pbm5lclJhZGl1cygwKTtjJiYoRD1MKSxoJiYoRD1kMy5zdmcuYXJjKCkub3V0ZXJSYWRpdXMoTC5vdXRlclJhZGl1cygpKSksTS5hcHBlbmQoImciKS5jbGFzc2VkKCJudi1sYWJlbCIsITApLmVhY2goZnVuY3Rpb24oZSx0KXt2YXIgbj1kMy5zZWxlY3QodGhpcyk7bi5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUpe2lmKG0pe2Uub3V0ZXJSYWRpdXM9UysxMCxlLmlubmVyUmFkaXVzPVMrMTU7dmFyIHQ9KGUuc3RhcnRBbmdsZStlLmVuZEFuZ2xlKS8yKigxODAvTWF0aC5QSSk7cmV0dXJuKGUuc3RhcnRBbmdsZStlLmVuZEFuZ2xlKS8yPE1hdGguUEk/dC09OTA6dCs9OTAsInRyYW5zbGF0ZSgiK0QuY2VudHJvaWQoZSkrIikgcm90YXRlKCIrdCsiKSJ9cmV0dXJuIGUub3V0ZXJSYWRpdXM9RSsxMCxlLmlubmVyUmFkaXVzPUUrMTUsInRyYW5zbGF0ZSgiK0QuY2VudHJvaWQoZSkrIikifSksbi5hcHBlbmQoInJlY3QiKS5zdHlsZSgic3Ryb2tlIiwiI2ZmZiIpLnN0eWxlKCJmaWxsIiwiI2ZmZiIpLmF0dHIoInJ4IiwzKS5hdHRyKCJyeSIsMyksbi5hcHBlbmQoInRleHQiKS5zdHlsZSgidGV4dC1hbmNob3IiLG0/KGUuc3RhcnRBbmdsZStlLmVuZEFuZ2xlKS8yPE1hdGguUEk/InN0YXJ0IjoiZW5kIjoibWlkZGxlIikuc3R5bGUoImZpbGwiLCIjMDAwIil9KSxPLnNlbGVjdCgiLm52LWxhYmVsIikudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oZSl7aWYobSl7ZS5vdXRlclJhZGl1cz1TKzEwLGUuaW5uZXJSYWRpdXM9UysxNTt2YXIgdD0oZS5zdGFydEFuZ2xlK2UuZW5kQW5nbGUpLzIqKDE4MC9NYXRoLlBJKTtyZXR1cm4oZS5zdGFydEFuZ2xlK2UuZW5kQW5nbGUpLzI8TWF0aC5QST90LT05MDp0Kz05MCwidHJhbnNsYXRlKCIrRC5jZW50cm9pZChlKSsiKSByb3RhdGUoIit0KyIpIn1yZXR1cm4gZS5vdXRlclJhZGl1cz1FKzEwLGUuaW5uZXJSYWRpdXM9RSsxNSwidHJhbnNsYXRlKCIrRC5jZW50cm9pZChlKSsiKSJ9KSxPLmVhY2goZnVuY3Rpb24oZSx0KXt2YXIgbj1kMy5zZWxlY3QodGhpcyk7bi5zZWxlY3QoIi5udi1sYWJlbCB0ZXh0Iikuc3R5bGUoInRleHQtYW5jaG9yIixtPyhlLnN0YXJ0QW5nbGUrZS5lbmRBbmdsZSkvMjxNYXRoLlBJPyJzdGFydCI6ImVuZCI6Im1pZGRsZSIpLnRleHQoZnVuY3Rpb24oZSx0KXt2YXIgbj0oZS5lbmRBbmdsZS1lLnN0YXJ0QW5nbGUpLygyKk1hdGguUEkpLHI9e2tleTppKGUuZGF0YSksdmFsdWU6cyhlLmRhdGEpLHBlcmNlbnQ6ZDMuZm9ybWF0KCIlIikobil9O3JldHVybiBlLnZhbHVlJiZuPmQ/cltwXToiIn0pO3ZhciByPW4uc2VsZWN0KCJ0ZXh0Iikubm9kZSgpLmdldEJCb3goKTtuLnNlbGVjdCgiLm52LWxhYmVsIHJlY3QiKS5hdHRyKCJ3aWR0aCIsci53aWR0aCsxMCkuYXR0cigiaGVpZ2h0IixyLmhlaWdodCsxMCkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbigpe3JldHVybiJ0cmFuc2xhdGUoIitbci54LTUsci55LTVdKyIpIn0pfSl9fSksRX12YXIgdD17dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjB9LG49NTAwLHI9NTAwLGk9ZnVuY3Rpb24oZSl7cmV0dXJuIGUueH0scz1mdW5jdGlvbihlKXtyZXR1cm4gZS55fSxvPWZ1bmN0aW9uKGUpe3JldHVybiBlLmRlc2NyaXB0aW9ufSx1PU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxZTQpLGE9ZS51dGlscy5kZWZhdWx0Q29sb3IoKSxmPWQzLmZvcm1hdCgiLC4yZiIpLGw9ITAsYz0hMCxoPSExLHA9ImtleSIsZD0uMDIsdj0hMSxtPSExLGc9ITEseT0hMSxiPS41LHc9ZDMuZGlzcGF0Y2goImNoYXJ0Q2xpY2siLCJlbGVtZW50Q2xpY2siLCJlbGVtZW50RGJsQ2xpY2siLCJlbGVtZW50TW91c2VvdmVyIiwiZWxlbWVudE1vdXNlb3V0Iik7cmV0dXJuIEUuZGlzcGF0Y2g9dyxFLm9wdGlvbnM9ZS51dGlscy5vcHRpb25zRnVuYy5iaW5kKEUpLEUubWFyZ2luPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0LnRvcD10eXBlb2YgZS50b3AhPSJ1bmRlZmluZWQiP2UudG9wOnQudG9wLHQucmlnaHQ9dHlwZW9mIGUucmlnaHQhPSJ1bmRlZmluZWQiP2UucmlnaHQ6dC5yaWdodCx0LmJvdHRvbT10eXBlb2YgZS5ib3R0b20hPSJ1bmRlZmluZWQiP2UuYm90dG9tOnQuYm90dG9tLHQubGVmdD10eXBlb2YgZS5sZWZ0IT0idW5kZWZpbmVkIj9lLmxlZnQ6dC5sZWZ0LEUpOnR9LEUud2lkdGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSxFKTpufSxFLmhlaWdodD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLEUpOnJ9LEUudmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBlLmxvZygicGllLnZhbHVlcygpIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIiksRX0sRS54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUsRSk6aX0sRS55PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPWQzLmZ1bmN0b3IoZSksRSk6c30sRS5kZXNjcmlwdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1lLEUpOm99LEUuc2hvd0xhYmVscz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1lLEUpOmx9LEUubGFiZWxTdW5iZWFtTGF5b3V0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPWUsRSk6bX0sRS5kb251dExhYmVsc091dHNpZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ZSxFKTpofSxFLnBpZUxhYmVsc091dHNpZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ZSxFKTpjfSxFLmxhYmVsVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1lLHA9cHx8ImtleSIsRSk6cH0sRS5kb251dD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj1lLEUpOnZ9LEUuZG9udXRSYXRpbz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj1lLEUpOmJ9LEUuc3RhcnRBbmdsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz1lLEUpOmd9LEUuZW5kQW5nbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9ZSxFKTp5fSxFLmlkPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWUsRSk6dX0sRS5jb2xvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1lLnV0aWxzLmdldENvbG9yKHQpLEUpOmF9LEUudmFsdWVGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ZSxFKTpmfSxFLmxhYmVsVGhyZXNob2xkPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPWUsRSk6ZH0sRX0sZS5tb2RlbHMucGllQ2hhcnQ9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdihlKXtyZXR1cm4gZS5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB1PWQzLnNlbGVjdCh0aGlzKSxhPXRoaXMsZj0oaXx8cGFyc2VJbnQodS5zdHlsZSgid2lkdGgiKSl8fDk2MCktci5sZWZ0LXIucmlnaHQsZD0oc3x8cGFyc2VJbnQodS5zdHlsZSgiaGVpZ2h0IikpfHw0MDApLXIudG9wLXIuYm90dG9tO3YudXBkYXRlPWZ1bmN0aW9uKCl7dS50cmFuc2l0aW9uKCkuY2FsbCh2KX0sdi5jb250YWluZXI9dGhpcyxsLmRpc2FibGVkPWUubWFwKGZ1bmN0aW9uKGUpe3JldHVybiEhZS5kaXNhYmxlZH0pO2lmKCFjKXt2YXIgbTtjPXt9O2ZvcihtIGluIGwpbFttXWluc3RhbmNlb2YgQXJyYXk/Y1ttXT1sW21dLnNsaWNlKDApOmNbbV09bFttXX1pZighZXx8IWUubGVuZ3RoKXt2YXIgZz11LnNlbGVjdEFsbCgiLm52LW5vRGF0YSIpLmRhdGEoW2hdKTtyZXR1cm4gZy5lbnRlcigpLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIiwibnZkMyBudi1ub0RhdGEiKS5hdHRyKCJkeSIsIi0uN2VtIikuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIiksZy5hdHRyKCJ4IixyLmxlZnQrZi8yKS5hdHRyKCJ5IixyLnRvcCtkLzIpLnRleHQoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KSx2fXUuc2VsZWN0QWxsKCIubnYtbm9EYXRhIikucmVtb3ZlKCk7dmFyIHk9dS5zZWxlY3RBbGwoImcubnYtd3JhcC5udi1waWVDaGFydCIpLmRhdGEoW2VdKSxiPXkuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52ZDMgbnYtd3JhcCBudi1waWVDaGFydCIpLmFwcGVuZCgiZyIpLHc9eS5zZWxlY3QoImciKTtiLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtcGllV3JhcCIpLGIuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1sZWdlbmRXcmFwIiksbyYmKG4ud2lkdGgoZikua2V5KHQueCgpKSx5LnNlbGVjdCgiLm52LWxlZ2VuZFdyYXAiKS5kYXR1bShlKS5jYWxsKG4pLHIudG9wIT1uLmhlaWdodCgpJiYoci50b3A9bi5oZWlnaHQoKSxkPShzfHxwYXJzZUludCh1LnN0eWxlKCJoZWlnaHQiKSl8fDQwMCktci50b3Atci5ib3R0b20pLHkuc2VsZWN0KCIubnYtbGVnZW5kV3JhcCIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIrIC1yLnRvcCsiKSIpKSx5LmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3IubGVmdCsiLCIrci50b3ArIikiKSx0LndpZHRoKGYpLmhlaWdodChkKTt2YXIgRT13LnNlbGVjdCgiLm52LXBpZVdyYXAiKS5kYXR1bShbZV0pO2QzLnRyYW5zaXRpb24oRSkuY2FsbCh0KSxuLmRpc3BhdGNoLm9uKCJzdGF0ZUNoYW5nZSIsZnVuY3Rpb24oZSl7bD1lLHAuc3RhdGVDaGFuZ2UobCksdi51cGRhdGUoKX0pLHQuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW91dC50b29sdGlwIixmdW5jdGlvbihlKXtwLnRvb2x0aXBIaWRlKGUpfSkscC5vbigiY2hhbmdlU3RhdGUiLGZ1bmN0aW9uKHQpe3R5cGVvZiB0LmRpc2FibGVkIT0idW5kZWZpbmVkIiYmKGUuZm9yRWFjaChmdW5jdGlvbihlLG4pe2UuZGlzYWJsZWQ9dC5kaXNhYmxlZFtuXX0pLGwuZGlzYWJsZWQ9dC5kaXNhYmxlZCksdi51cGRhdGUoKX0pfSksdn12YXIgdD1lLm1vZGVscy5waWUoKSxuPWUubW9kZWxzLmxlZ2VuZCgpLHI9e3RvcDozMCxyaWdodDoyMCxib3R0b206MjAsbGVmdDoyMH0saT1udWxsLHM9bnVsbCxvPSEwLHU9ZS51dGlscy5kZWZhdWx0Q29sb3IoKSxhPSEwLGY9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIjxoMz4iK2UrIjwvaDM+IisiPHA+Iit0KyI8L3A+In0sbD17fSxjPW51bGwsaD0iTm8gRGF0YSBBdmFpbGFibGUuIixwPWQzLmRpc3BhdGNoKCJ0b29sdGlwU2hvdyIsInRvb2x0aXBIaWRlIiwic3RhdGVDaGFuZ2UiLCJjaGFuZ2VTdGF0ZSIpLGQ9ZnVuY3Rpb24obixyKXt2YXIgaT10LmRlc2NyaXB0aW9uKCkobi5wb2ludCl8fHQueCgpKG4ucG9pbnQpLHM9bi5wb3NbMF0rKHImJnIub2Zmc2V0TGVmdHx8MCksbz1uLnBvc1sxXSsociYmci5vZmZzZXRUb3B8fDApLHU9dC52YWx1ZUZvcm1hdCgpKHQueSgpKG4ucG9pbnQpKSxhPWYoaSx1LG4sdik7ZS50b29sdGlwLnNob3coW3Msb10sYSxuLnZhbHVlPDA/Im4iOiJzIixudWxsLHIpfTtyZXR1cm4gdC5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlb3Zlci50b29sdGlwIixmdW5jdGlvbihlKXtlLnBvcz1bZS5wb3NbMF0rci5sZWZ0LGUucG9zWzFdK3IudG9wXSxwLnRvb2x0aXBTaG93KGUpfSkscC5vbigidG9vbHRpcFNob3ciLGZ1bmN0aW9uKGUpe2EmJmQoZSl9KSxwLm9uKCJ0b29sdGlwSGlkZSIsZnVuY3Rpb24oKXthJiZlLnRvb2x0aXAuY2xlYW51cCgpfSksdi5sZWdlbmQ9bix2LmRpc3BhdGNoPXAsdi5waWU9dCxkMy5yZWJpbmQodix0LCJ2YWx1ZUZvcm1hdCIsInZhbHVlcyIsIngiLCJ5IiwiZGVzY3JpcHRpb24iLCJpZCIsInNob3dMYWJlbHMiLCJkb251dExhYmVsc091dHNpZGUiLCJwaWVMYWJlbHNPdXRzaWRlIiwibGFiZWxUeXBlIiwiZG9udXQiLCJkb251dFJhdGlvIiwibGFiZWxUaHJlc2hvbGQiKSx2Lm9wdGlvbnM9ZS51dGlscy5vcHRpb25zRnVuYy5iaW5kKHYpLHYubWFyZ2luPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyLnRvcD10eXBlb2YgZS50b3AhPSJ1bmRlZmluZWQiP2UudG9wOnIudG9wLHIucmlnaHQ9dHlwZW9mIGUucmlnaHQhPSJ1bmRlZmluZWQiP2UucmlnaHQ6ci5yaWdodCxyLmJvdHRvbT10eXBlb2YgZS5ib3R0b20hPSJ1bmRlZmluZWQiP2UuYm90dG9tOnIuYm90dG9tLHIubGVmdD10eXBlb2YgZS5sZWZ0IT0idW5kZWZpbmVkIj9lLmxlZnQ6ci5sZWZ0LHYpOnJ9LHYud2lkdGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ZSx2KTppfSx2LmhlaWdodD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1lLHYpOnN9LHYuY29sb3I9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ZS51dGlscy5nZXRDb2xvcihyKSxuLmNvbG9yKHUpLHQuY29sb3IodSksdik6dX0sdi5zaG93TGVnZW5kPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWUsdik6b30sdi50b29sdGlwcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1lLHYpOmF9LHYudG9vbHRpcENvbnRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ZSx2KTpmfSx2LnN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPWUsdik6bH0sdi5kZWZhdWx0U3RhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ZSx2KTpjfSx2Lm5vRGF0YT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1lLHYpOmh9LHZ9LGUubW9kZWxzLnNjYXR0ZXI9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gSShxKXtyZXR1cm4gcS5lYWNoKGZ1bmN0aW9uKEkpe2Z1bmN0aW9uIFEoKXtpZighZylyZXR1cm4hMTt2YXIgZSxpPWQzLm1lcmdlKEkubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUudmFsdWVzLm1hcChmdW5jdGlvbihlLG4pe3ZhciByPWYoZSxuKSxpPWwoZSxuKTtyZXR1cm5bbyhyKStNYXRoLnJhbmRvbSgpKjFlLTcsdShpKStNYXRoLnJhbmRvbSgpKjFlLTcsdCxuLGVdfSkuZmlsdGVyKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGIoZVs0XSx0KX0pfSkpO2lmKEQ9PT0hMCl7aWYoeCl7dmFyIGE9WC5zZWxlY3QoImRlZnMiKS5zZWxlY3RBbGwoIi5udi1wb2ludC1jbGlwcyIpLmRhdGEoW3NdKS5lbnRlcigpO2EuYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImNsYXNzIiwibnYtcG9pbnQtY2xpcHMiKS5hdHRyKCJpZCIsIm52LXBvaW50cy1jbGlwLSIrcyk7dmFyIGM9WC5zZWxlY3QoIiNudi1wb2ludHMtY2xpcC0iK3MpLnNlbGVjdEFsbCgiY2lyY2xlIikuZGF0YShpKTtjLmVudGVyKCkuYXBwZW5kKCJjaXJjbGUiKS5hdHRyKCJyIixUKSxjLmV4aXQoKS5yZW1vdmUoKSxjLmF0dHIoImN4IixmdW5jdGlvbihlKXtyZXR1cm4gZVswXX0pLmF0dHIoImN5IixmdW5jdGlvbihlKXtyZXR1cm4gZVsxXX0pLFguc2VsZWN0KCIubnYtcG9pbnQtcGF0aHMiKS5hdHRyKCJjbGlwLXBhdGgiLCJ1cmwoI252LXBvaW50cy1jbGlwLSIrcysiKSIpfWkubGVuZ3RoJiYoaS5wdXNoKFtvLnJhbmdlKClbMF0tMjAsdS5yYW5nZSgpWzBdLTIwLG51bGwsbnVsbF0pLGkucHVzaChbby5yYW5nZSgpWzFdKzIwLHUucmFuZ2UoKVsxXSsyMCxudWxsLG51bGxdKSxpLnB1c2goW28ucmFuZ2UoKVswXS0yMCx1LnJhbmdlKClbMF0rMjAsbnVsbCxudWxsXSksaS5wdXNoKFtvLnJhbmdlKClbMV0rMjAsdS5yYW5nZSgpWzFdLTIwLG51bGwsbnVsbF0pKTt2YXIgaD1kMy5nZW9tLnBvbHlnb24oW1stMTAsLTEwXSxbLTEwLHIrMTBdLFtuKzEwLHIrMTBdLFtuKzEwLC0xMF1dKSxwPWQzLmdlb20udm9yb25vaShpKS5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm57ZGF0YTpoLmNsaXAoZSksc2VyaWVzOmlbdF1bMl0scG9pbnQ6aVt0XVszXX19KSxkPVguc2VsZWN0KCIubnYtcG9pbnQtcGF0aHMiKS5zZWxlY3RBbGwoInBhdGgiKS5kYXRhKHApO2QuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24oZSx0KXtyZXR1cm4ibnYtcGF0aC0iK3R9KSxkLmV4aXQoKS5yZW1vdmUoKSxkLmF0dHIoImQiLGZ1bmN0aW9uKGUpe3JldHVybiBlLmRhdGEubGVuZ3RoPT09MD8iTSAwIDAiOiJNIitlLmRhdGEuam9pbigiTCIpKyJaIn0pO3ZhciB2PWZ1bmN0aW9uKGUsbil7aWYoRilyZXR1cm4gMDt2YXIgcj1JW2Uuc2VyaWVzXTtpZih0eXBlb2Ygcj09InVuZGVmaW5lZCIpcmV0dXJuO3ZhciBpPXIudmFsdWVzW2UucG9pbnRdO24oe3BvaW50Omksc2VyaWVzOnIscG9zOltvKGYoaSxlLnBvaW50KSkrdC5sZWZ0LHUobChpLGUucG9pbnQpKSt0LnRvcF0sc2VyaWVzSW5kZXg6ZS5zZXJpZXMscG9pbnRJbmRleDplLnBvaW50fSl9O2Qub24oImNsaWNrIixmdW5jdGlvbihlKXt2KGUsXy5lbGVtZW50Q2xpY2spfSkub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oZSl7dihlLF8uZWxlbWVudE1vdXNlb3Zlcil9KS5vbigibW91c2VvdXQiLGZ1bmN0aW9uKGUsdCl7dihlLF8uZWxlbWVudE1vdXNlb3V0KX0pfWVsc2UgWC5zZWxlY3QoIi5udi1ncm91cHMiKS5zZWxlY3RBbGwoIi5udi1ncm91cCIpLnNlbGVjdEFsbCgiLm52LXBvaW50Iikub24oImNsaWNrIixmdW5jdGlvbihlLG4pe2lmKEZ8fCFJW2Uuc2VyaWVzXSlyZXR1cm4gMDt2YXIgcj1JW2Uuc2VyaWVzXSxpPXIudmFsdWVzW25dO18uZWxlbWVudENsaWNrKHtwb2ludDppLHNlcmllczpyLHBvczpbbyhmKGksbikpK3QubGVmdCx1KGwoaSxuKSkrdC50b3BdLHNlcmllc0luZGV4OmUuc2VyaWVzLHBvaW50SW5kZXg6bn0pfSkub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oZSxuKXtpZihGfHwhSVtlLnNlcmllc10pcmV0dXJuIDA7dmFyIHI9SVtlLnNlcmllc10saT1yLnZhbHVlc1tuXTtfLmVsZW1lbnRNb3VzZW92ZXIoe3BvaW50Omksc2VyaWVzOnIscG9zOltvKGYoaSxuKSkrdC5sZWZ0LHUobChpLG4pKSt0LnRvcF0sc2VyaWVzSW5kZXg6ZS5zZXJpZXMscG9pbnRJbmRleDpufSl9KS5vbigibW91c2VvdXQiLGZ1bmN0aW9uKGUsdCl7aWYoRnx8IUlbZS5zZXJpZXNdKXJldHVybiAwO3ZhciBuPUlbZS5zZXJpZXNdLHI9bi52YWx1ZXNbdF07Xy5lbGVtZW50TW91c2VvdXQoe3BvaW50OnIsc2VyaWVzOm4sc2VyaWVzSW5kZXg6ZS5zZXJpZXMscG9pbnRJbmRleDp0fSl9KTtGPSExfXZhciBxPW4tdC5sZWZ0LXQucmlnaHQsUj1yLXQudG9wLXQuYm90dG9tLFU9ZDMuc2VsZWN0KHRoaXMpO0k9SS5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS52YWx1ZXM9ZS52YWx1ZXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnNlcmllcz10LGV9KSxlfSk7dmFyIFc9TiYmQyYmQT9bXTpkMy5tZXJnZShJLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZXMubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJue3g6ZihlLHQpLHk6bChlLHQpLHNpemU6YyhlLHQpfX0pfSkpO28uZG9tYWluKE58fGQzLmV4dGVudChXLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS54fSkuY29uY2F0KGQpKSksdyYmSVswXT9vLnJhbmdlKGt8fFsocSpFK3EpLygyKklbMF0udmFsdWVzLmxlbmd0aCkscS1xKigxK0UpLygyKklbMF0udmFsdWVzLmxlbmd0aCldKTpvLnJhbmdlKGt8fFswLHFdKSx1LmRvbWFpbihDfHxkMy5leHRlbnQoVy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUueX0pLmNvbmNhdCh2KSkpLnJhbmdlKEx8fFtSLDBdKSxhLmRvbWFpbihBfHxkMy5leHRlbnQoVy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2l6ZX0pLmNvbmNhdChtKSkpLnJhbmdlKE98fFsxNiwyNTZdKTtpZihvLmRvbWFpbigpWzBdPT09by5kb21haW4oKVsxXXx8dS5kb21haW4oKVswXT09PXUuZG9tYWluKClbMV0pTT0hMDtvLmRvbWFpbigpWzBdPT09by5kb21haW4oKVsxXSYmKG8uZG9tYWluKClbMF0/by5kb21haW4oW28uZG9tYWluKClbMF0tby5kb21haW4oKVswXSouMDEsby5kb21haW4oKVsxXStvLmRvbWFpbigpWzFdKi4wMV0pOm8uZG9tYWluKFstMSwxXSkpLHUuZG9tYWluKClbMF09PT11LmRvbWFpbigpWzFdJiYodS5kb21haW4oKVswXT91LmRvbWFpbihbdS5kb21haW4oKVswXS11LmRvbWFpbigpWzBdKi4wMSx1LmRvbWFpbigpWzFdK3UuZG9tYWluKClbMV0qLjAxXSk6dS5kb21haW4oWy0xLDFdKSksaXNOYU4oby5kb21haW4oKVswXSkmJm8uZG9tYWluKFstMSwxXSksaXNOYU4odS5kb21haW4oKVswXSkmJnUuZG9tYWluKFstMSwxXSksUD1QfHxvLEg9SHx8dSxCPUJ8fGE7dmFyIFg9VS5zZWxlY3RBbGwoImcubnYtd3JhcC5udi1zY2F0dGVyIikuZGF0YShbSV0pLFY9WC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnZkMyBudi13cmFwIG52LXNjYXR0ZXIgbnYtY2hhcnQtIitzKyhNPyIgbnYtc2luZ2xlLXBvaW50IjoiIikpLCQ9Vi5hcHBlbmQoImRlZnMiKSxKPVYuYXBwZW5kKCJnIiksSz1YLnNlbGVjdCgiZyIpO0ouYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1ncm91cHMiKSxKLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtcG9pbnQtcGF0aHMiKSxYLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3QubGVmdCsiLCIrdC50b3ArIikiKSwkLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsIm52LWVkZ2UtY2xpcC0iK3MpLmFwcGVuZCgicmVjdCIpLFguc2VsZWN0KCIjbnYtZWRnZS1jbGlwLSIrcysiIHJlY3QiKS5hdHRyKCJ3aWR0aCIscSkuYXR0cigiaGVpZ2h0IixSKSxLLmF0dHIoImNsaXAtcGF0aCIsUz8idXJsKCNudi1lZGdlLWNsaXAtIitzKyIpIjoiIiksRj0hMDt2YXIgRz1YLnNlbGVjdCgiLm52LWdyb3VwcyIpLnNlbGVjdEFsbCgiLm52LWdyb3VwIikuZGF0YShmdW5jdGlvbihlKXtyZXR1cm4gZX0sZnVuY3Rpb24oZSl7cmV0dXJuIGUua2V5fSk7Ry5lbnRlcigpLmFwcGVuZCgiZyIpLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsMWUtNikuc3R5bGUoImZpbGwtb3BhY2l0eSIsMWUtNiksRy5leGl0KCkucmVtb3ZlKCksRy5hdHRyKCJjbGFzcyIsZnVuY3Rpb24oZSx0KXtyZXR1cm4ibnYtZ3JvdXAgbnYtc2VyaWVzLSIrdH0pLmNsYXNzZWQoImhvdmVyIixmdW5jdGlvbihlKXtyZXR1cm4gZS5ob3Zlcn0pLEcudHJhbnNpdGlvbigpLnN0eWxlKCJmaWxsIixmdW5jdGlvbihlLHQpe3JldHVybiBpKGUsdCl9KS5zdHlsZSgic3Ryb2tlIixmdW5jdGlvbihlLHQpe3JldHVybiBpKGUsdCl9KS5zdHlsZSgic3Ryb2tlLW9wYWNpdHkiLDEpLnN0eWxlKCJmaWxsLW9wYWNpdHkiLC41KTtpZihwKXt2YXIgWT1HLnNlbGVjdEFsbCgiY2lyY2xlLm52LXBvaW50IikuZGF0YShmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZXN9LHkpO1kuZW50ZXIoKS5hcHBlbmQoImNpcmNsZSIpLnN0eWxlKCJmaWxsIixmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbG9yfSkuc3R5bGUoInN0cm9rZSIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb2xvcn0pLmF0dHIoImN4IixmdW5jdGlvbih0LG4pe3JldHVybiBlLnV0aWxzLk5hTnRvWmVybyhQKGYodCxuKSkpfSkuYXR0cigiY3kiLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUudXRpbHMuTmFOdG9aZXJvKEgobCh0LG4pKSl9KS5hdHRyKCJyIixmdW5jdGlvbihlLHQpe3JldHVybiBNYXRoLnNxcnQoYShjKGUsdCkpL01hdGguUEkpfSksWS5leGl0KCkucmVtb3ZlKCksRy5leGl0KCkuc2VsZWN0QWxsKCJwYXRoLm52LXBvaW50IikudHJhbnNpdGlvbigpLmF0dHIoImN4IixmdW5jdGlvbih0LG4pe3JldHVybiBlLnV0aWxzLk5hTnRvWmVybyhvKGYodCxuKSkpfSkuYXR0cigiY3kiLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUudXRpbHMuTmFOdG9aZXJvKHUobCh0LG4pKSl9KS5yZW1vdmUoKSxZLmVhY2goZnVuY3Rpb24oZSx0KXtkMy5zZWxlY3QodGhpcykuY2xhc3NlZCgibnYtcG9pbnQiLCEwKS5jbGFzc2VkKCJudi1wb2ludC0iK3QsITApLmNsYXNzZWQoImhvdmVyIiwhMSl9KSxZLnRyYW5zaXRpb24oKS5hdHRyKCJjeCIsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS51dGlscy5OYU50b1plcm8obyhmKHQsbikpKX0pLmF0dHIoImN5IixmdW5jdGlvbih0LG4pe3JldHVybiBlLnV0aWxzLk5hTnRvWmVybyh1KGwodCxuKSkpfSkuYXR0cigiciIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gTWF0aC5zcXJ0KGEoYyhlLHQpKS9NYXRoLlBJKX0pfWVsc2V7dmFyIFk9Ry5zZWxlY3RBbGwoInBhdGgubnYtcG9pbnQiKS5kYXRhKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlc30pO1kuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5zdHlsZSgiZmlsbCIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb2xvcn0pLnN0eWxlKCJzdHJva2UiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29sb3J9KS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUsdCl7cmV0dXJuInRyYW5zbGF0ZSgiK1AoZihlLHQpKSsiLCIrSChsKGUsdCkpKyIpIn0pLmF0dHIoImQiLGQzLnN2Zy5zeW1ib2woKS50eXBlKGgpLnNpemUoZnVuY3Rpb24oZSx0KXtyZXR1cm4gYShjKGUsdCkpfSkpLFkuZXhpdCgpLnJlbW92ZSgpLEcuZXhpdCgpLnNlbGVjdEFsbCgicGF0aC5udi1wb2ludCIpLnRyYW5zaXRpb24oKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUsdCl7cmV0dXJuInRyYW5zbGF0ZSgiK28oZihlLHQpKSsiLCIrdShsKGUsdCkpKyIpIn0pLnJlbW92ZSgpLFkuZWFjaChmdW5jdGlvbihlLHQpe2QzLnNlbGVjdCh0aGlzKS5jbGFzc2VkKCJudi1wb2ludCIsITApLmNsYXNzZWQoIm52LXBvaW50LSIrdCwhMCkuY2xhc3NlZCgiaG92ZXIiLCExKX0pLFkudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oZSx0KXtyZXR1cm4idHJhbnNsYXRlKCIrbyhmKGUsdCkpKyIsIit1KGwoZSx0KSkrIikifSkuYXR0cigiZCIsZDMuc3ZnLnN5bWJvbCgpLnR5cGUoaCkuc2l6ZShmdW5jdGlvbihlLHQpe3JldHVybiBhKGMoZSx0KSl9KSl9Y2xlYXJUaW1lb3V0KGopLGo9c2V0VGltZW91dChRLDMwMCksUD1vLmNvcHkoKSxIPXUuY29weSgpLEI9YS5jb3B5KCl9KSxJfXZhciB0PXt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MH0sbj05NjAscj01MDAsaT1lLnV0aWxzLmRlZmF1bHRDb2xvcigpLHM9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjFlNSksbz1kMy5zY2FsZS5saW5lYXIoKSx1PWQzLnNjYWxlLmxpbmVhcigpLGE9ZDMuc2NhbGUubGluZWFyKCksZj1mdW5jdGlvbihlKXtyZXR1cm4gZS54fSxsPWZ1bmN0aW9uKGUpe3JldHVybiBlLnl9LGM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2l6ZXx8MX0saD1mdW5jdGlvbihlKXtyZXR1cm4gZS5zaGFwZXx8ImNpcmNsZSJ9LHA9ITAsZD1bXSx2PVtdLG09W10sZz0hMCx5PW51bGwsYj1mdW5jdGlvbihlKXtyZXR1cm4hZS5ub3RBY3RpdmV9LHc9ITEsRT0uMSxTPSExLHg9ITAsVD1mdW5jdGlvbigpe3JldHVybiAyNX0sTj1udWxsLEM9bnVsbCxrPW51bGwsTD1udWxsLEE9bnVsbCxPPW51bGwsTT0hMSxfPWQzLmRpc3BhdGNoKCJlbGVtZW50Q2xpY2siLCJlbGVtZW50TW91c2VvdmVyIiwiZWxlbWVudE1vdXNlb3V0IiksRD0hMCxQLEgsQixqLEY9ITE7cmV0dXJuIEkuY2xlYXJIaWdobGlnaHRzPWZ1bmN0aW9uKCl7ZDMuc2VsZWN0QWxsKCIubnYtY2hhcnQtIitzKyIgLm52LXBvaW50LmhvdmVyIikuY2xhc3NlZCgiaG92ZXIiLCExKX0sSS5oaWdobGlnaHRQb2ludD1mdW5jdGlvbihlLHQsbil7ZDMuc2VsZWN0KCIubnYtY2hhcnQtIitzKyIgLm52LXNlcmllcy0iK2UrIiAubnYtcG9pbnQtIit0KS5jbGFzc2VkKCJob3ZlciIsbil9LF8ub24oImVsZW1lbnRNb3VzZW92ZXIucG9pbnQiLGZ1bmN0aW9uKGUpe2cmJkkuaGlnaGxpZ2h0UG9pbnQoZS5zZXJpZXNJbmRleCxlLnBvaW50SW5kZXgsITApfSksXy5vbigiZWxlbWVudE1vdXNlb3V0LnBvaW50IixmdW5jdGlvbihlKXtnJiZJLmhpZ2hsaWdodFBvaW50KGUuc2VyaWVzSW5kZXgsZS5wb2ludEluZGV4LCExKX0pLEkuZGlzcGF0Y2g9XyxJLm9wdGlvbnM9ZS51dGlscy5vcHRpb25zRnVuYy5iaW5kKEkpLEkueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1kMy5mdW5jdG9yKGUpLEkpOmZ9LEkueT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1kMy5mdW5jdG9yKGUpLEkpOmx9LEkuc2l6ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1kMy5mdW5jdG9yKGUpLEkpOmN9LEkubWFyZ2luPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0LnRvcD10eXBlb2YgZS50b3AhPSJ1bmRlZmluZWQiP2UudG9wOnQudG9wLHQucmlnaHQ9dHlwZW9mIGUucmlnaHQhPSJ1bmRlZmluZWQiP2UucmlnaHQ6dC5yaWdodCx0LmJvdHRvbT10eXBlb2YgZS5ib3R0b20hPSJ1bmRlZmluZWQiP2UuYm90dG9tOnQuYm90dG9tLHQubGVmdD10eXBlb2YgZS5sZWZ0IT0idW5kZWZpbmVkIj9lLmxlZnQ6dC5sZWZ0LEkpOnR9LEkud2lkdGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSxJKTpufSxJLmhlaWdodD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLEkpOnJ9LEkueFNjYWxlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWUsSSk6b30sSS55U2NhbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ZSxJKTp1fSxJLnpTY2FsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1lLEkpOmF9LEkueERvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTj1lLEkpOk59LEkueURvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQz1lLEkpOkN9LEkuc2l6ZURvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT1lLEkpOkF9LEkueFJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhrPWUsSSk6a30sSS55UmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEw9ZSxJKTpMfSxJLnNpemVSYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTz1lLEkpOk99LEkuZm9yY2VYPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPWUsSSk6ZH0sSS5mb3JjZVk9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9ZSxJKTp2fSxJLmZvcmNlU2l6ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1lLEkpOm19LEkuaW50ZXJhY3RpdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ZSxJKTpnfSxJLnBvaW50S2V5PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PWUsSSk6eX0sSS5wb2ludEFjdGl2ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj1lLEkpOmJ9LEkucGFkRGF0YT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odz1lLEkpOnd9LEkucGFkRGF0YU91dGVyPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhFPWUsSSk6RX0sSS5jbGlwRWRnZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oUz1lLEkpOlN9LEkuY2xpcFZvcm9ub2k9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9ZSxJKTp4fSxJLnVzZVZvcm9ub2k9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEQ9ZSxEPT09ITEmJih4PSExKSxJKTpEfSxJLmNsaXBSYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFQ9ZSxJKTpUfSxJLmNvbG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUudXRpbHMuZ2V0Q29sb3IodCksSSk6aX0sSS5zaGFwZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1lLEkpOmh9LEkub25seUNpcmNsZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9ZSxJKTpwfSxJLmlkPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPWUsSSk6c30sSS5zaW5nbGVQb2ludD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTT1lLEkpOk19LEl9LGUubW9kZWxzLnNjYXR0ZXJDaGFydD1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBGKGUpe3JldHVybiBlLmVhY2goZnVuY3Rpb24oZSl7ZnVuY3Rpb24gSygpe2lmKFQpcmV0dXJuIFguc2VsZWN0KCIubnYtcG9pbnQtcGF0aHMiKS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJhbGwiKSwhMTtYLnNlbGVjdCgiLm52LXBvaW50LXBhdGhzIikuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpO3ZhciBpPWQzLm1vdXNlKHRoaXMpO2guZGlzdG9ydGlvbih4KS5mb2N1cyhpWzBdKSxwLmRpc3RvcnRpb24oeCkuZm9jdXMoaVsxXSksWC5zZWxlY3QoIi5udi1zY2F0dGVyV3JhcCIpLmNhbGwodCksYiYmWC5zZWxlY3QoIi5udi14Lm52LWF4aXMiKS5jYWxsKG4pLHcmJlguc2VsZWN0KCIubnYteS5udi1heGlzIikuY2FsbChyKSxYLnNlbGVjdCgiLm52LWRpc3RyaWJ1dGlvblgiKS5kYXR1bShlLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5kaXNhYmxlZH0pKS5jYWxsKG8pLFguc2VsZWN0KCIubnYtZGlzdHJpYnV0aW9uWSIpLmRhdHVtKGUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmRpc2FibGVkfSkpLmNhbGwodSl9dmFyIEM9ZDMuc2VsZWN0KHRoaXMpLGs9dGhpcyxMPShmfHxwYXJzZUludChDLnN0eWxlKCJ3aWR0aCIpKXx8OTYwKS1hLmxlZnQtYS5yaWdodCxJPShsfHxwYXJzZUludChDLnN0eWxlKCJoZWlnaHQiKSl8fDQwMCktYS50b3AtYS5ib3R0b207Ri51cGRhdGU9ZnVuY3Rpb24oKXtDLnRyYW5zaXRpb24oKS5kdXJhdGlvbihEKS5jYWxsKEYpfSxGLmNvbnRhaW5lcj10aGlzLEEuZGlzYWJsZWQ9ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuISFlLmRpc2FibGVkfSk7aWYoIU8pe3ZhciBxO089e307Zm9yKHEgaW4gQSlBW3FdaW5zdGFuY2VvZiBBcnJheT9PW3FdPUFbcV0uc2xpY2UoMCk6T1txXT1BW3FdfWlmKCFlfHwhZS5sZW5ndGh8fCFlLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZXMubGVuZ3RofSkubGVuZ3RoKXt2YXIgUj1DLnNlbGVjdEFsbCgiLm52LW5vRGF0YSIpLmRhdGEoW19dKTtyZXR1cm4gUi5lbnRlcigpLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIiwibnZkMyBudi1ub0RhdGEiKS5hdHRyKCJkeSIsIi0uN2VtIikuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIiksUi5hdHRyKCJ4IixhLmxlZnQrTC8yKS5hdHRyKCJ5IixhLnRvcCtJLzIpLnRleHQoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KSxGfUMuc2VsZWN0QWxsKCIubnYtbm9EYXRhIikucmVtb3ZlKCksUD1QfHxoLEg9SHx8cDt2YXIgVT1DLnNlbGVjdEFsbCgiZy5udi13cmFwLm52LXNjYXR0ZXJDaGFydCIpLmRhdGEoW2VdKSx6PVUuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52ZDMgbnYtd3JhcCBudi1zY2F0dGVyQ2hhcnQgbnYtY2hhcnQtIit0LmlkKCkpLFc9ei5hcHBlbmQoImciKSxYPVUuc2VsZWN0KCJnIik7Vy5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsIm52ZDMgbnYtYmFja2dyb3VuZCIpLFcuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi14IG52LWF4aXMiKSxXLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYteSBudi1heGlzIiksVy5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXNjYXR0ZXJXcmFwIiksVy5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LWRpc3RXcmFwIiksVy5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LWxlZ2VuZFdyYXAiKSxXLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtY29udHJvbHNXcmFwIik7aWYoeSl7dmFyIFY9Uz9MLzI6TDtpLndpZHRoKFYpLFUuc2VsZWN0KCIubnYtbGVnZW5kV3JhcCIpLmRhdHVtKGUpLmNhbGwoaSksYS50b3AhPWkuaGVpZ2h0KCkmJihhLnRvcD1pLmhlaWdodCgpLEk9KGx8fHBhcnNlSW50KEMuc3R5bGUoImhlaWdodCIpKXx8NDAwKS1hLnRvcC1hLmJvdHRvbSksVS5zZWxlY3QoIi5udi1sZWdlbmRXcmFwIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrKEwtVikrIiwiKyAtYS50b3ArIikiKX1TJiYocy53aWR0aCgxODApLmNvbG9yKFsiIzQ0NCJdKSxYLnNlbGVjdCgiLm52LWNvbnRyb2xzV3JhcCIpLmRhdHVtKGopLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIrIC1hLnRvcCsiKSIpLmNhbGwocykpLFUuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrYS5sZWZ0KyIsIithLnRvcCsiKSIpLEUmJlguc2VsZWN0KCIubnYteS5udi1heGlzIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTCsiLDApIiksdC53aWR0aChMKS5oZWlnaHQoSSkuY29sb3IoZS5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb2xvcnx8YyhlLHQpfSkuZmlsdGVyKGZ1bmN0aW9uKHQsbil7cmV0dXJuIWVbbl0uZGlzYWJsZWR9KSksZCE9PTAmJnQueERvbWFpbihudWxsKSx2IT09MCYmdC55RG9tYWluKG51bGwpLFUuc2VsZWN0KCIubnYtc2NhdHRlcldyYXAiKS5kYXR1bShlLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5kaXNhYmxlZH0pKS5jYWxsKHQpO2lmKGQhPT0wKXt2YXIgJD1oLmRvbWFpbigpWzFdLWguZG9tYWluKClbMF07dC54RG9tYWluKFtoLmRvbWFpbigpWzBdLWQqJCxoLmRvbWFpbigpWzFdK2QqJF0pfWlmKHYhPT0wKXt2YXIgSj1wLmRvbWFpbigpWzFdLXAuZG9tYWluKClbMF07dC55RG9tYWluKFtwLmRvbWFpbigpWzBdLXYqSixwLmRvbWFpbigpWzFdK3YqSl0pfSh2IT09MHx8ZCE9PTApJiZVLnNlbGVjdCgiLm52LXNjYXR0ZXJXcmFwIikuZGF0dW0oZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuZGlzYWJsZWR9KSkuY2FsbCh0KSxiJiYobi5zY2FsZShoKS50aWNrcyhuLnRpY2tzKCkmJm4udGlja3MoKS5sZW5ndGg/bi50aWNrcygpOkwvMTAwKS50aWNrU2l6ZSgtSSwwKSxYLnNlbGVjdCgiLm52LXgubnYtYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIrcC5yYW5nZSgpWzBdKyIpIikuY2FsbChuKSksdyYmKHIuc2NhbGUocCkudGlja3Moci50aWNrcygpJiZyLnRpY2tzKCkubGVuZ3RoP3IudGlja3MoKTpJLzM2KS50aWNrU2l6ZSgtTCwwKSxYLnNlbGVjdCgiLm52LXkubnYtYXhpcyIpLmNhbGwocikpLG0mJihvLmdldERhdGEodC54KCkpLnNjYWxlKGgpLndpZHRoKEwpLmNvbG9yKGUubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29sb3J8fGMoZSx0KX0pLmZpbHRlcihmdW5jdGlvbih0LG4pe3JldHVybiFlW25dLmRpc2FibGVkfSkpLFcuc2VsZWN0KCIubnYtZGlzdFdyYXAiKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LWRpc3RyaWJ1dGlvblgiKSxYLnNlbGVjdCgiLm52LWRpc3RyaWJ1dGlvblgiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwiK3AucmFuZ2UoKVswXSsiKSIpLmRhdHVtKGUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmRpc2FibGVkfSkpLmNhbGwobykpLGcmJih1LmdldERhdGEodC55KCkpLnNjYWxlKHApLndpZHRoKEkpLmNvbG9yKGUubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29sb3J8fGMoZSx0KX0pLmZpbHRlcihmdW5jdGlvbih0LG4pe3JldHVybiFlW25dLmRpc2FibGVkfSkpLFcuc2VsZWN0KCIubnYtZGlzdFdyYXAiKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LWRpc3RyaWJ1dGlvblkiKSxYLnNlbGVjdCgiLm52LWRpc3RyaWJ1dGlvblkiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIisoRT9MOi11LnNpemUoKSkrIiwwKSIpLmRhdHVtKGUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmRpc2FibGVkfSkpLmNhbGwodSkpLGQzLmZpc2hleWUmJihYLnNlbGVjdCgiLm52LWJhY2tncm91bmQiKS5hdHRyKCJ3aWR0aCIsTCkuYXR0cigiaGVpZ2h0IixJKSxYLnNlbGVjdCgiLm52LWJhY2tncm91bmQiKS5vbigibW91c2Vtb3ZlIixLKSxYLnNlbGVjdCgiLm52LWJhY2tncm91bmQiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7VD0hVH0pLHQuZGlzcGF0Y2gub24oImVsZW1lbnRDbGljay5mcmVlemVGaXNoZXllIixmdW5jdGlvbigpe1Q9IVR9KSkscy5kaXNwYXRjaC5vbigibGVnZW5kQ2xpY2siLGZ1bmN0aW9uKGUsaSl7ZS5kaXNhYmxlZD0hZS5kaXNhYmxlZCx4PWUuZGlzYWJsZWQ/MDoyLjUsWC5zZWxlY3QoIi5udi1iYWNrZ3JvdW5kIikuc3R5bGUoInBvaW50ZXItZXZlbnRzIixlLmRpc2FibGVkPyJub25lIjoiYWxsIiksWC5zZWxlY3QoIi5udi1wb2ludC1wYXRocyIpLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsZS5kaXNhYmxlZD8iYWxsIjoibm9uZSIpLGUuZGlzYWJsZWQ/KGguZGlzdG9ydGlvbih4KS5mb2N1cygwKSxwLmRpc3RvcnRpb24oeCkuZm9jdXMoMCksWC5zZWxlY3QoIi5udi1zY2F0dGVyV3JhcCIpLmNhbGwodCksWC5zZWxlY3QoIi5udi14Lm52LWF4aXMiKS5jYWxsKG4pLFguc2VsZWN0KCIubnYteS5udi1heGlzIikuY2FsbChyKSk6VD0hMSxGLnVwZGF0ZSgpfSksaS5kaXNwYXRjaC5vbigic3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe0EuZGlzYWJsZWQ9ZS5kaXNhYmxlZCxNLnN0YXRlQ2hhbmdlKEEpLEYudXBkYXRlKCl9KSx0LmRpc3BhdGNoLm9uKCJlbGVtZW50TW91c2VvdmVyLnRvb2x0aXAiLGZ1bmN0aW9uKGUpe2QzLnNlbGVjdCgiLm52LWNoYXJ0LSIrdC5pZCgpKyIgLm52LXNlcmllcy0iK2Uuc2VyaWVzSW5kZXgrIiAubnYtZGlzdHgtIitlLnBvaW50SW5kZXgpLmF0dHIoInkxIixmdW5jdGlvbih0LG4pe3JldHVybiBlLnBvc1sxXS1JfSksZDMuc2VsZWN0KCIubnYtY2hhcnQtIit0LmlkKCkrIiAubnYtc2VyaWVzLSIrZS5zZXJpZXNJbmRleCsiIC5udi1kaXN0eS0iK2UucG9pbnRJbmRleCkuYXR0cigieDIiLGUucG9zWzBdK28uc2l6ZSgpKSxlLnBvcz1bZS5wb3NbMF0rYS5sZWZ0LGUucG9zWzFdK2EudG9wXSxNLnRvb2x0aXBTaG93KGUpfSksTS5vbigidG9vbHRpcFNob3ciLGZ1bmN0aW9uKGUpe04mJkIoZSxrLnBhcmVudE5vZGUpfSksTS5vbigiY2hhbmdlU3RhdGUiLGZ1bmN0aW9uKHQpe3R5cGVvZiB0LmRpc2FibGVkIT0idW5kZWZpbmVkIiYmKGUuZm9yRWFjaChmdW5jdGlvbihlLG4pe2UuZGlzYWJsZWQ9dC5kaXNhYmxlZFtuXX0pLEEuZGlzYWJsZWQ9dC5kaXNhYmxlZCksRi51cGRhdGUoKX0pLFA9aC5jb3B5KCksSD1wLmNvcHkoKX0pLEZ9dmFyIHQ9ZS5tb2RlbHMuc2NhdHRlcigpLG49ZS5tb2RlbHMuYXhpcygpLHI9ZS5tb2RlbHMuYXhpcygpLGk9ZS5tb2RlbHMubGVnZW5kKCkscz1lLm1vZGVscy5sZWdlbmQoKSxvPWUubW9kZWxzLmRpc3RyaWJ1dGlvbigpLHU9ZS5tb2RlbHMuZGlzdHJpYnV0aW9uKCksYT17dG9wOjMwLHJpZ2h0OjIwLGJvdHRvbTo1MCxsZWZ0Ojc1fSxmPW51bGwsbD1udWxsLGM9ZS51dGlscy5kZWZhdWx0Q29sb3IoKSxoPWQzLmZpc2hleWU/ZDMuZmlzaGV5ZS5zY2FsZShkMy5zY2FsZS5saW5lYXIpLmRpc3RvcnRpb24oMCk6dC54U2NhbGUoKSxwPWQzLmZpc2hleWU/ZDMuZmlzaGV5ZS5zY2FsZShkMy5zY2FsZS5saW5lYXIpLmRpc3RvcnRpb24oMCk6dC55U2NhbGUoKSxkPTAsdj0wLG09ITEsZz0hMSx5PSEwLGI9ITAsdz0hMCxFPSExLFM9ISFkMy5maXNoZXllLHg9MCxUPSExLE49ITAsQz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIjxzdHJvbmc+Iit0KyI8L3N0cm9uZz4ifSxrPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4iPHN0cm9uZz4iK24rIjwvc3Ryb25nPiJ9LEw9bnVsbCxBPXt9LE89bnVsbCxNPWQzLmRpc3BhdGNoKCJ0b29sdGlwU2hvdyIsInRvb2x0aXBIaWRlIiwic3RhdGVDaGFuZ2UiLCJjaGFuZ2VTdGF0ZSIpLF89Ik5vIERhdGEgQXZhaWxhYmxlLiIsRD0yNTA7dC54U2NhbGUoaCkueVNjYWxlKHApLG4ub3JpZW50KCJib3R0b20iKS50aWNrUGFkZGluZygxMCksci5vcmllbnQoRT8icmlnaHQiOiJsZWZ0IikudGlja1BhZGRpbmcoMTApLG8uYXhpcygieCIpLHUuYXhpcygieSIpLHMudXBkYXRlU3RhdGUoITEpO3ZhciBQLEgsQj1mdW5jdGlvbihpLHMpe3ZhciBvPWkucG9zWzBdKyhzLm9mZnNldExlZnR8fDApLHU9aS5wb3NbMV0rKHMub2Zmc2V0VG9wfHwwKSxmPWkucG9zWzBdKyhzLm9mZnNldExlZnR8fDApLGw9cC5yYW5nZSgpWzBdK2EudG9wKyhzLm9mZnNldFRvcHx8MCksYz1oLnJhbmdlKClbMF0rYS5sZWZ0KyhzLm9mZnNldExlZnR8fDApLGQ9aS5wb3NbMV0rKHMub2Zmc2V0VG9wfHwwKSx2PW4udGlja0Zvcm1hdCgpKHQueCgpKGkucG9pbnQsaS5wb2ludEluZGV4KSksbT1yLnRpY2tGb3JtYXQoKSh0LnkoKShpLnBvaW50LGkucG9pbnRJbmRleCkpO0MhPW51bGwmJmUudG9vbHRpcC5zaG93KFtmLGxdLEMoaS5zZXJpZXMua2V5LHYsbSxpLEYpLCJuIiwxLHMsIngtbnZ0b29sdGlwIiksayE9bnVsbCYmZS50b29sdGlwLnNob3coW2MsZF0sayhpLnNlcmllcy5rZXksdixtLGksRiksImUiLDEscywieS1udnRvb2x0aXAiKSxMIT1udWxsJiZlLnRvb2x0aXAuc2hvdyhbbyx1XSxMKGkuc2VyaWVzLmtleSx2LG0saSxGKSxpLnZhbHVlPDA/Im4iOiJzIixudWxsLHMpfSxqPVt7a2V5OiJNYWduaWZ5IixkaXNhYmxlZDohMH1dO3JldHVybiB0LmRpc3BhdGNoLm9uKCJlbGVtZW50TW91c2VvdXQudG9vbHRpcCIsZnVuY3Rpb24oZSl7TS50b29sdGlwSGlkZShlKSxkMy5zZWxlY3QoIi5udi1jaGFydC0iK3QuaWQoKSsiIC5udi1zZXJpZXMtIitlLnNlcmllc0luZGV4KyIgLm52LWRpc3R4LSIrZS5wb2ludEluZGV4KS5hdHRyKCJ5MSIsMCksZDMuc2VsZWN0KCIubnYtY2hhcnQtIit0LmlkKCkrIiAubnYtc2VyaWVzLSIrZS5zZXJpZXNJbmRleCsiIC5udi1kaXN0eS0iK2UucG9pbnRJbmRleCkuYXR0cigieDIiLHUuc2l6ZSgpKX0pLE0ub24oInRvb2x0aXBIaWRlIixmdW5jdGlvbigpe04mJmUudG9vbHRpcC5jbGVhbnVwKCl9KSxGLmRpc3BhdGNoPU0sRi5zY2F0dGVyPXQsRi5sZWdlbmQ9aSxGLmNvbnRyb2xzPXMsRi54QXhpcz1uLEYueUF4aXM9cixGLmRpc3RYPW8sRi5kaXN0WT11LGQzLnJlYmluZChGLHQsImlkIiwiaW50ZXJhY3RpdmUiLCJwb2ludEFjdGl2ZSIsIngiLCJ5Iiwic2hhcGUiLCJzaXplIiwieFNjYWxlIiwieVNjYWxlIiwielNjYWxlIiwieERvbWFpbiIsInlEb21haW4iLCJ4UmFuZ2UiLCJ5UmFuZ2UiLCJzaXplRG9tYWluIiwic2l6ZVJhbmdlIiwiZm9yY2VYIiwiZm9yY2VZIiwiZm9yY2VTaXplIiwiY2xpcFZvcm9ub2kiLCJjbGlwUmFkaXVzIiwidXNlVm9yb25vaSIpLEYub3B0aW9ucz1lLnV0aWxzLm9wdGlvbnNGdW5jLmJpbmQoRiksRi5tYXJnaW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEudG9wPXR5cGVvZiBlLnRvcCE9InVuZGVmaW5lZCI/ZS50b3A6YS50b3AsYS5yaWdodD10eXBlb2YgZS5yaWdodCE9InVuZGVmaW5lZCI/ZS5yaWdodDphLnJpZ2h0LGEuYm90dG9tPXR5cGVvZiBlLmJvdHRvbSE9InVuZGVmaW5lZCI/ZS5ib3R0b206YS5ib3R0b20sYS5sZWZ0PXR5cGVvZiBlLmxlZnQhPSJ1bmRlZmluZWQiP2UubGVmdDphLmxlZnQsRik6YX0sRi53aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1lLEYpOmZ9LEYuaGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPWUsRik6bH0sRi5jb2xvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1lLnV0aWxzLmdldENvbG9yKHQpLGkuY29sb3IoYyksby5jb2xvcihjKSx1LmNvbG9yKGMpLEYpOmN9LEYuc2hvd0Rpc3RYPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPWUsRik6bX0sRi5zaG93RGlzdFk9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ZSxGKTpnfSxGLnNob3dDb250cm9scz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oUz1lLEYpOlN9LEYuc2hvd0xlZ2VuZD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT1lLEYpOnl9LEYuc2hvd1hBeGlzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPWUsRik6Yn0sRi5zaG93WUF4aXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHc9ZSxGKTp3fSxGLnJpZ2h0QWxpZ25ZQXhpcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oRT1lLHIub3JpZW50KGU/InJpZ2h0IjoibGVmdCIpLEYpOkV9LEYuZmlzaGV5ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD1lLEYpOnh9LEYueFBhZGRpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9ZSxGKTpkfSxGLnlQYWRkaW5nPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PWUsRik6dn0sRi50b29sdGlwcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTj1lLEYpOk59LEYudG9vbHRpcENvbnRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEw9ZSxGKTpMfSxGLnRvb2x0aXBYQ29udGVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQz1lLEYpOkN9LEYudG9vbHRpcFlDb250ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhrPWUsRik6a30sRi5zdGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT1lLEYpOkF9LEYuZGVmYXVsdFN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhPPWUsRik6T30sRi5ub0RhdGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KF89ZSxGKTpffSxGLnRyYW5zaXRpb25EdXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oRD1lLEYpOkR9LEZ9LGUubW9kZWxzLnNjYXR0ZXJQbHVzTGluZUNoYXJ0PWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIEIoZSl7cmV0dXJuIGUuZWFjaChmdW5jdGlvbihlKXtmdW5jdGlvbiAkKCl7aWYoUylyZXR1cm4gei5zZWxlY3QoIi5udi1wb2ludC1wYXRocyIpLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLCExO3ouc2VsZWN0KCIubnYtcG9pbnQtcGF0aHMiKS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJub25lIik7dmFyIGk9ZDMubW91c2UodGhpcyk7aC5kaXN0b3J0aW9uKEUpLmZvY3VzKGlbMF0pLHAuZGlzdG9ydGlvbihFKS5mb2N1cyhpWzFdKSx6LnNlbGVjdCgiLm52LXNjYXR0ZXJXcmFwIikuZGF0dW0oZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuZGlzYWJsZWR9KSkuY2FsbCh0KSxnJiZ6LnNlbGVjdCgiLm52LXgubnYtYXhpcyIpLmNhbGwobikseSYmei5zZWxlY3QoIi5udi15Lm52LWF4aXMiKS5jYWxsKHIpLHouc2VsZWN0KCIubnYtZGlzdHJpYnV0aW9uWCIpLmRhdHVtKGUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmRpc2FibGVkfSkpLmNhbGwobyksei5zZWxlY3QoIi5udi1kaXN0cmlidXRpb25ZIikuZGF0dW0oZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuZGlzYWJsZWR9KSkuY2FsbCh1KX12YXIgVD1kMy5zZWxlY3QodGhpcyksTj10aGlzLEM9KGZ8fHBhcnNlSW50KFQuc3R5bGUoIndpZHRoIikpfHw5NjApLWEubGVmdC1hLnJpZ2h0LGo9KGx8fHBhcnNlSW50KFQuc3R5bGUoImhlaWdodCIpKXx8NDAwKS1hLnRvcC1hLmJvdHRvbTtCLnVwZGF0ZT1mdW5jdGlvbigpe1QudHJhbnNpdGlvbigpLmR1cmF0aW9uKE0pLmNhbGwoQil9LEIuY29udGFpbmVyPXRoaXMsay5kaXNhYmxlZD1lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4hIWUuZGlzYWJsZWR9KTtpZighTCl7dmFyIEY7TD17fTtmb3IoRiBpbiBrKWtbRl1pbnN0YW5jZW9mIEFycmF5P0xbRl09a1tGXS5zbGljZSgwKTpMW0ZdPWtbRl19aWYoIWV8fCFlLmxlbmd0aHx8IWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlcy5sZW5ndGh9KS5sZW5ndGgpe3ZhciBJPVQuc2VsZWN0QWxsKCIubnYtbm9EYXRhIikuZGF0YShbT10pO3JldHVybiBJLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLCJudmQzIG52LW5vRGF0YSIpLmF0dHIoImR5IiwiLS43ZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKSxJLmF0dHIoIngiLGEubGVmdCtDLzIpLmF0dHIoInkiLGEudG9wK2ovMikudGV4dChmdW5jdGlvbihlKXtyZXR1cm4gZX0pLEJ9VC5zZWxlY3RBbGwoIi5udi1ub0RhdGEiKS5yZW1vdmUoKSxoPXQueFNjYWxlKCkscD10LnlTY2FsZSgpLF89X3x8aCxEPUR8fHA7dmFyIHE9VC5zZWxlY3RBbGwoImcubnYtd3JhcC5udi1zY2F0dGVyQ2hhcnQiKS5kYXRhKFtlXSksUj1xLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudmQzIG52LXdyYXAgbnYtc2NhdHRlckNoYXJ0IG52LWNoYXJ0LSIrdC5pZCgpKSxVPVIuYXBwZW5kKCJnIiksej1xLnNlbGVjdCgiZyIpO1UuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJudmQzIG52LWJhY2tncm91bmQiKS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJub25lIiksVS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXggbnYtYXhpcyIpLFUuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi15IG52LWF4aXMiKSxVLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtc2NhdHRlcldyYXAiKSxVLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtcmVncmVzc2lvbkxpbmVzV3JhcCIpLFUuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1kaXN0V3JhcCIpLFUuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1sZWdlbmRXcmFwIiksVS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LWNvbnRyb2xzV3JhcCIpLHEuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrYS5sZWZ0KyIsIithLnRvcCsiKSIpLGImJnouc2VsZWN0KCIubnYteS5udi1heGlzIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrQysiLDApIiksbSYmKGkud2lkdGgoQy8yKSxxLnNlbGVjdCgiLm52LWxlZ2VuZFdyYXAiKS5kYXR1bShlKS5jYWxsKGkpLGEudG9wIT1pLmhlaWdodCgpJiYoYS50b3A9aS5oZWlnaHQoKSxqPShsfHxwYXJzZUludChULnN0eWxlKCJoZWlnaHQiKSl8fDQwMCktYS50b3AtYS5ib3R0b20pLHEuc2VsZWN0KCIubnYtbGVnZW5kV3JhcCIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0MvMisiLCIrIC1hLnRvcCsiKSIpKSx3JiYocy53aWR0aCgxODApLmNvbG9yKFsiIzQ0NCJdKSx6LnNlbGVjdCgiLm52LWNvbnRyb2xzV3JhcCIpLmRhdHVtKEgpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIrIC1hLnRvcCsiKSIpLmNhbGwocykpLHQud2lkdGgoQykuaGVpZ2h0KGopLmNvbG9yKGUubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29sb3J8fGMoZSx0KX0pLmZpbHRlcihmdW5jdGlvbih0LG4pe3JldHVybiFlW25dLmRpc2FibGVkfSkpLHEuc2VsZWN0KCIubnYtc2NhdHRlcldyYXAiKS5kYXR1bShlLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5kaXNhYmxlZH0pKS5jYWxsKHQpLHEuc2VsZWN0KCIubnYtcmVncmVzc2lvbkxpbmVzV3JhcCIpLmF0dHIoImNsaXAtcGF0aCIsInVybCgjbnYtZWRnZS1jbGlwLSIrdC5pZCgpKyIpIik7dmFyIFc9cS5zZWxlY3QoIi5udi1yZWdyZXNzaW9uTGluZXNXcmFwIikuc2VsZWN0QWxsKCIubnYtcmVnTGluZXMiKS5kYXRhKGZ1bmN0aW9uKGUpe3JldHVybiBlfSk7Vy5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtcmVnTGluZXMiKTt2YXIgWD1XLnNlbGVjdEFsbCgiLm52LXJlZ0xpbmUiKS5kYXRhKGZ1bmN0aW9uKGUpe3JldHVybltlXX0pLFY9WC5lbnRlcigpLmFwcGVuZCgibGluZSIpLmF0dHIoImNsYXNzIiwibnYtcmVnTGluZSIpLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsMCk7WC50cmFuc2l0aW9uKCkuYXR0cigieDEiLGgucmFuZ2UoKVswXSkuYXR0cigieDIiLGgucmFuZ2UoKVsxXSkuYXR0cigieTEiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHAoaC5kb21haW4oKVswXSplLnNsb3BlK2UuaW50ZXJjZXB0KX0pLmF0dHIoInkyIixmdW5jdGlvbihlLHQpe3JldHVybiBwKGguZG9tYWluKClbMV0qZS5zbG9wZStlLmludGVyY2VwdCl9KS5zdHlsZSgic3Ryb2tlIixmdW5jdGlvbihlLHQsbil7cmV0dXJuIGMoZSxuKX0pLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5kaXNhYmxlZHx8dHlwZW9mIGUuc2xvcGU9PSJ1bmRlZmluZWQifHx0eXBlb2YgZS5pbnRlcmNlcHQ9PSJ1bmRlZmluZWQiPzA6MX0pLGcmJihuLnNjYWxlKGgpLnRpY2tzKG4udGlja3MoKT9uLnRpY2tzKCk6Qy8xMDApLnRpY2tTaXplKC1qLDApLHouc2VsZWN0KCIubnYteC5udi1heGlzIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDAsIitwLnJhbmdlKClbMF0rIikiKS5jYWxsKG4pKSx5JiYoci5zY2FsZShwKS50aWNrcyhyLnRpY2tzKCk/ci50aWNrcygpOmovMzYpLnRpY2tTaXplKC1DLDApLHouc2VsZWN0KCIubnYteS5udi1heGlzIikuY2FsbChyKSksZCYmKG8uZ2V0RGF0YSh0LngoKSkuc2NhbGUoaCkud2lkdGgoQykuY29sb3IoZS5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb2xvcnx8YyhlLHQpfSkuZmlsdGVyKGZ1bmN0aW9uKHQsbil7cmV0dXJuIWVbbl0uZGlzYWJsZWR9KSksVS5zZWxlY3QoIi5udi1kaXN0V3JhcCIpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtZGlzdHJpYnV0aW9uWCIpLHouc2VsZWN0KCIubnYtZGlzdHJpYnV0aW9uWCIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIrcC5yYW5nZSgpWzBdKyIpIikuZGF0dW0oZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuZGlzYWJsZWR9KSkuY2FsbChvKSksdiYmKHUuZ2V0RGF0YSh0LnkoKSkuc2NhbGUocCkud2lkdGgoaikuY29sb3IoZS5tYXAoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb2xvcnx8YyhlLHQpfSkuZmlsdGVyKGZ1bmN0aW9uKHQsbil7cmV0dXJuIWVbbl0uZGlzYWJsZWR9KSksVS5zZWxlY3QoIi5udi1kaXN0V3JhcCIpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtZGlzdHJpYnV0aW9uWSIpLHouc2VsZWN0KCIubnYtZGlzdHJpYnV0aW9uWSIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiKyhiP0M6LXUuc2l6ZSgpKSsiLDApIikuZGF0dW0oZS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuZGlzYWJsZWR9KSkuY2FsbCh1KSksZDMuZmlzaGV5ZSYmKHouc2VsZWN0KCIubnYtYmFja2dyb3VuZCIpLmF0dHIoIndpZHRoIixDKS5hdHRyKCJoZWlnaHQiLGopLHouc2VsZWN0KCIubnYtYmFja2dyb3VuZCIpLm9uKCJtb3VzZW1vdmUiLCQpLHouc2VsZWN0KCIubnYtYmFja2dyb3VuZCIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXtTPSFTfSksdC5kaXNwYXRjaC5vbigiZWxlbWVudENsaWNrLmZyZWV6ZUZpc2hleWUiLGZ1bmN0aW9uKCl7Uz0hU30pKSxzLmRpc3BhdGNoLm9uKCJsZWdlbmRDbGljayIsZnVuY3Rpb24oZSxpKXtlLmRpc2FibGVkPSFlLmRpc2FibGVkLEU9ZS5kaXNhYmxlZD8wOjIuNSx6LnNlbGVjdCgiLm52LWJhY2tncm91bmQiKS5zdHlsZSgicG9pbnRlci1ldmVudHMiLGUuZGlzYWJsZWQ/Im5vbmUiOiJhbGwiKSx6LnNlbGVjdCgiLm52LXBvaW50LXBhdGhzIikuc3R5bGUoInBvaW50ZXItZXZlbnRzIixlLmRpc2FibGVkPyJhbGwiOiJub25lIiksZS5kaXNhYmxlZD8oaC5kaXN0b3J0aW9uKEUpLmZvY3VzKDApLHAuZGlzdG9ydGlvbihFKS5mb2N1cygwKSx6LnNlbGVjdCgiLm52LXNjYXR0ZXJXcmFwIikuY2FsbCh0KSx6LnNlbGVjdCgiLm52LXgubnYtYXhpcyIpLmNhbGwobiksei5zZWxlY3QoIi5udi15Lm52LWF4aXMiKS5jYWxsKHIpKTpTPSExLEIudXBkYXRlKCl9KSxpLmRpc3BhdGNoLm9uKCJzdGF0ZUNoYW5nZSIsZnVuY3Rpb24oZSl7az1lLEEuc3RhdGVDaGFuZ2UoayksQi51cGRhdGUoKX0pLHQuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW92ZXIudG9vbHRpcCIsZnVuY3Rpb24oZSl7ZDMuc2VsZWN0KCIubnYtY2hhcnQtIit0LmlkKCkrIiAubnYtc2VyaWVzLSIrZS5zZXJpZXNJbmRleCsiIC5udi1kaXN0eC0iK2UucG9pbnRJbmRleCkuYXR0cigieTEiLGUucG9zWzFdLWopLGQzLnNlbGVjdCgiLm52LWNoYXJ0LSIrdC5pZCgpKyIgLm52LXNlcmllcy0iK2Uuc2VyaWVzSW5kZXgrIiAubnYtZGlzdHktIitlLnBvaW50SW5kZXgpLmF0dHIoIngyIixlLnBvc1swXStvLnNpemUoKSksZS5wb3M9W2UucG9zWzBdK2EubGVmdCxlLnBvc1sxXSthLnRvcF0sQS50b29sdGlwU2hvdyhlKX0pLEEub24oInRvb2x0aXBTaG93IixmdW5jdGlvbihlKXt4JiZQKGUsTi5wYXJlbnROb2RlKX0pLEEub24oImNoYW5nZVN0YXRlIixmdW5jdGlvbih0KXt0eXBlb2YgdC5kaXNhYmxlZCE9InVuZGVmaW5lZCImJihlLmZvckVhY2goZnVuY3Rpb24oZSxuKXtlLmRpc2FibGVkPXQuZGlzYWJsZWRbbl19KSxrLmRpc2FibGVkPXQuZGlzYWJsZWQpLEIudXBkYXRlKCl9KSxfPWguY29weSgpLEQ9cC5jb3B5KCl9KSxCfXZhciB0PWUubW9kZWxzLnNjYXR0ZXIoKSxuPWUubW9kZWxzLmF4aXMoKSxyPWUubW9kZWxzLmF4aXMoKSxpPWUubW9kZWxzLmxlZ2VuZCgpLHM9ZS5tb2RlbHMubGVnZW5kKCksbz1lLm1vZGVscy5kaXN0cmlidXRpb24oKSx1PWUubW9kZWxzLmRpc3RyaWJ1dGlvbigpLGE9e3RvcDozMCxyaWdodDoyMCxib3R0b206NTAsbGVmdDo3NX0sZj1udWxsLGw9bnVsbCxjPWUudXRpbHMuZGVmYXVsdENvbG9yKCksaD1kMy5maXNoZXllP2QzLmZpc2hleWUuc2NhbGUoZDMuc2NhbGUubGluZWFyKS5kaXN0b3J0aW9uKDApOnQueFNjYWxlKCkscD1kMy5maXNoZXllP2QzLmZpc2hleWUuc2NhbGUoZDMuc2NhbGUubGluZWFyKS5kaXN0b3J0aW9uKDApOnQueVNjYWxlKCksZD0hMSx2PSExLG09ITAsZz0hMCx5PSEwLGI9ITEsdz0hIWQzLmZpc2hleWUsRT0wLFM9ITEseD0hMCxUPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4iPHN0cm9uZz4iK3QrIjwvc3Ryb25nPiJ9LE49ZnVuY3Rpb24oZSx0LG4pe3JldHVybiI8c3Ryb25nPiIrbisiPC9zdHJvbmc+In0sQz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4iPGgzPiIrZSsiPC9oMz4iKyI8cD4iK3IrIjwvcD4ifSxrPXt9LEw9bnVsbCxBPWQzLmRpc3BhdGNoKCJ0b29sdGlwU2hvdyIsInRvb2x0aXBIaWRlIiwic3RhdGVDaGFuZ2UiLCJjaGFuZ2VTdGF0ZSIKKSxPPSJObyBEYXRhIEF2YWlsYWJsZS4iLE09MjUwO3QueFNjYWxlKGgpLnlTY2FsZShwKSxuLm9yaWVudCgiYm90dG9tIikudGlja1BhZGRpbmcoMTApLHIub3JpZW50KGI/InJpZ2h0IjoibGVmdCIpLnRpY2tQYWRkaW5nKDEwKSxvLmF4aXMoIngiKSx1LmF4aXMoInkiKSxzLnVwZGF0ZVN0YXRlKCExKTt2YXIgXyxELFA9ZnVuY3Rpb24oaSxzKXt2YXIgbz1pLnBvc1swXSsocy5vZmZzZXRMZWZ0fHwwKSx1PWkucG9zWzFdKyhzLm9mZnNldFRvcHx8MCksZj1pLnBvc1swXSsocy5vZmZzZXRMZWZ0fHwwKSxsPXAucmFuZ2UoKVswXSthLnRvcCsocy5vZmZzZXRUb3B8fDApLGM9aC5yYW5nZSgpWzBdK2EubGVmdCsocy5vZmZzZXRMZWZ0fHwwKSxkPWkucG9zWzFdKyhzLm9mZnNldFRvcHx8MCksdj1uLnRpY2tGb3JtYXQoKSh0LngoKShpLnBvaW50LGkucG9pbnRJbmRleCkpLG09ci50aWNrRm9ybWF0KCkodC55KCkoaS5wb2ludCxpLnBvaW50SW5kZXgpKTtUIT1udWxsJiZlLnRvb2x0aXAuc2hvdyhbZixsXSxUKGkuc2VyaWVzLmtleSx2LG0saSxCKSwibiIsMSxzLCJ4LW52dG9vbHRpcCIpLE4hPW51bGwmJmUudG9vbHRpcC5zaG93KFtjLGRdLE4oaS5zZXJpZXMua2V5LHYsbSxpLEIpLCJlIiwxLHMsInktbnZ0b29sdGlwIiksQyE9bnVsbCYmZS50b29sdGlwLnNob3coW28sdV0sQyhpLnNlcmllcy5rZXksdixtLGkucG9pbnQudG9vbHRpcCxpLEIpLGkudmFsdWU8MD8ibiI6InMiLG51bGwscyl9LEg9W3trZXk6Ik1hZ25pZnkiLGRpc2FibGVkOiEwfV07cmV0dXJuIHQuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW91dC50b29sdGlwIixmdW5jdGlvbihlKXtBLnRvb2x0aXBIaWRlKGUpLGQzLnNlbGVjdCgiLm52LWNoYXJ0LSIrdC5pZCgpKyIgLm52LXNlcmllcy0iK2Uuc2VyaWVzSW5kZXgrIiAubnYtZGlzdHgtIitlLnBvaW50SW5kZXgpLmF0dHIoInkxIiwwKSxkMy5zZWxlY3QoIi5udi1jaGFydC0iK3QuaWQoKSsiIC5udi1zZXJpZXMtIitlLnNlcmllc0luZGV4KyIgLm52LWRpc3R5LSIrZS5wb2ludEluZGV4KS5hdHRyKCJ4MiIsdS5zaXplKCkpfSksQS5vbigidG9vbHRpcEhpZGUiLGZ1bmN0aW9uKCl7eCYmZS50b29sdGlwLmNsZWFudXAoKX0pLEIuZGlzcGF0Y2g9QSxCLnNjYXR0ZXI9dCxCLmxlZ2VuZD1pLEIuY29udHJvbHM9cyxCLnhBeGlzPW4sQi55QXhpcz1yLEIuZGlzdFg9byxCLmRpc3RZPXUsZDMucmViaW5kKEIsdCwiaWQiLCJpbnRlcmFjdGl2ZSIsInBvaW50QWN0aXZlIiwieCIsInkiLCJzaGFwZSIsInNpemUiLCJ4U2NhbGUiLCJ5U2NhbGUiLCJ6U2NhbGUiLCJ4RG9tYWluIiwieURvbWFpbiIsInhSYW5nZSIsInlSYW5nZSIsInNpemVEb21haW4iLCJzaXplUmFuZ2UiLCJmb3JjZVgiLCJmb3JjZVkiLCJmb3JjZVNpemUiLCJjbGlwVm9yb25vaSIsImNsaXBSYWRpdXMiLCJ1c2VWb3Jvbm9pIiksQi5vcHRpb25zPWUudXRpbHMub3B0aW9uc0Z1bmMuYmluZChCKSxCLm1hcmdpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS50b3A9dHlwZW9mIGUudG9wIT0idW5kZWZpbmVkIj9lLnRvcDphLnRvcCxhLnJpZ2h0PXR5cGVvZiBlLnJpZ2h0IT0idW5kZWZpbmVkIj9lLnJpZ2h0OmEucmlnaHQsYS5ib3R0b209dHlwZW9mIGUuYm90dG9tIT0idW5kZWZpbmVkIj9lLmJvdHRvbTphLmJvdHRvbSxhLmxlZnQ9dHlwZW9mIGUubGVmdCE9InVuZGVmaW5lZCI/ZS5sZWZ0OmEubGVmdCxCKTphfSxCLndpZHRoPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPWUsQik6Zn0sQi5oZWlnaHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ZSxCKTpsfSxCLmNvbG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPWUudXRpbHMuZ2V0Q29sb3IodCksaS5jb2xvcihjKSxvLmNvbG9yKGMpLHUuY29sb3IoYyksQik6Y30sQi5zaG93RGlzdFg9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9ZSxCKTpkfSxCLnNob3dEaXN0WT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj1lLEIpOnZ9LEIuc2hvd0NvbnRyb2xzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PWUsQik6d30sQi5zaG93TGVnZW5kPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPWUsQik6bX0sQi5zaG93WEF4aXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ZSxCKTpnfSxCLnNob3dZQXhpcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT1lLEIpOnl9LEIucmlnaHRBbGlnbllBeGlzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPWUsci5vcmllbnQoZT8icmlnaHQiOiJsZWZ0IiksQik6Yn0sQi5maXNoZXllPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhFPWUsQik6RX0sQi50b29sdGlwcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD1lLEIpOnh9LEIudG9vbHRpcENvbnRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEM9ZSxCKTpDfSxCLnRvb2x0aXBYQ29udGVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oVD1lLEIpOlR9LEIudG9vbHRpcFlDb250ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhOPWUsQik6Tn0sQi5zdGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz1lLEIpOmt9LEIuZGVmYXVsdFN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhMPWUsQik6TH0sQi5ub0RhdGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE89ZSxCKTpPfSxCLnRyYW5zaXRpb25EdXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTT1lLEIpOk19LEJ9LGUubW9kZWxzLnNwYXJrbGluZT1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGUpe3JldHVybiBlLmVhY2goZnVuY3Rpb24oZSl7dmFyIGk9bi10LmxlZnQtdC5yaWdodCxkPXItdC50b3AtdC5ib3R0b20sdj1kMy5zZWxlY3QodGhpcyk7cy5kb21haW4obHx8ZDMuZXh0ZW50KGUsdSkpLnJhbmdlKGh8fFswLGldKSxvLmRvbWFpbihjfHxkMy5leHRlbnQoZSxhKSkucmFuZ2UocHx8W2QsMF0pO3ZhciBtPXYuc2VsZWN0QWxsKCJnLm52LXdyYXAubnYtc3BhcmtsaW5lIikuZGF0YShbZV0pLGc9bS5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnZkMyBudi13cmFwIG52LXNwYXJrbGluZSIpLGI9Zy5hcHBlbmQoImciKSx3PW0uc2VsZWN0KCJnIik7bS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit0LmxlZnQrIiwiK3QudG9wKyIpIik7dmFyIEU9bS5zZWxlY3RBbGwoInBhdGgiKS5kYXRhKGZ1bmN0aW9uKGUpe3JldHVybltlXX0pO0UuZW50ZXIoKS5hcHBlbmQoInBhdGgiKSxFLmV4aXQoKS5yZW1vdmUoKSxFLnN0eWxlKCJzdHJva2UiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29sb3J8fGYoZSx0KX0pLmF0dHIoImQiLGQzLnN2Zy5saW5lKCkueChmdW5jdGlvbihlLHQpe3JldHVybiBzKHUoZSx0KSl9KS55KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG8oYShlLHQpKX0pKTt2YXIgUz1tLnNlbGVjdEFsbCgiY2lyY2xlLm52LXBvaW50IikuZGF0YShmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHQpe2lmKHQhPS0xKXt2YXIgbj1lW3RdO3JldHVybiBuLnBvaW50SW5kZXg9dCxufXJldHVybiBudWxsfXZhciB0PWUubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGEoZSx0KX0pLHI9bih0Lmxhc3RJbmRleE9mKG8uZG9tYWluKClbMV0pKSxpPW4odC5pbmRleE9mKG8uZG9tYWluKClbMF0pKSxzPW4odC5sZW5ndGgtMSk7cmV0dXJuW2kscixzXS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUhPW51bGx9KX0pO1MuZW50ZXIoKS5hcHBlbmQoImNpcmNsZSIpLFMuZXhpdCgpLnJlbW92ZSgpLFMuYXR0cigiY3giLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHModShlLGUucG9pbnRJbmRleCkpfSkuYXR0cigiY3kiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG8oYShlLGUucG9pbnRJbmRleCkpfSkuYXR0cigiciIsMikuYXR0cigiY2xhc3MiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHUoZSxlLnBvaW50SW5kZXgpPT1zLmRvbWFpbigpWzFdPyJudi1wb2ludCBudi1jdXJyZW50VmFsdWUiOmEoZSxlLnBvaW50SW5kZXgpPT1vLmRvbWFpbigpWzBdPyJudi1wb2ludCBudi1taW5WYWx1ZSI6Im52LXBvaW50IG52LW1heFZhbHVlIn0pfSksZH12YXIgdD17dG9wOjIscmlnaHQ6MCxib3R0b206MixsZWZ0OjB9LG49NDAwLHI9MzIsaT0hMCxzPWQzLnNjYWxlLmxpbmVhcigpLG89ZDMuc2NhbGUubGluZWFyKCksdT1mdW5jdGlvbihlKXtyZXR1cm4gZS54fSxhPWZ1bmN0aW9uKGUpe3JldHVybiBlLnl9LGY9ZS51dGlscy5nZXRDb2xvcihbIiMwMDAiXSksbCxjLGgscDtyZXR1cm4gZC5vcHRpb25zPWUudXRpbHMub3B0aW9uc0Z1bmMuYmluZChkKSxkLm1hcmdpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odC50b3A9dHlwZW9mIGUudG9wIT0idW5kZWZpbmVkIj9lLnRvcDp0LnRvcCx0LnJpZ2h0PXR5cGVvZiBlLnJpZ2h0IT0idW5kZWZpbmVkIj9lLnJpZ2h0OnQucmlnaHQsdC5ib3R0b209dHlwZW9mIGUuYm90dG9tIT0idW5kZWZpbmVkIj9lLmJvdHRvbTp0LmJvdHRvbSx0LmxlZnQ9dHlwZW9mIGUubGVmdCE9InVuZGVmaW5lZCI/ZS5sZWZ0OnQubGVmdCxkKTp0fSxkLndpZHRoPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUsZCk6bn0sZC5oZWlnaHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSxkKTpyfSxkLng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ZDMuZnVuY3RvcihlKSxkKTp1fSxkLnk9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ZDMuZnVuY3RvcihlKSxkKTphfSxkLnhTY2FsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1lLGQpOnN9LGQueVNjYWxlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWUsZCk6b30sZC54RG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPWUsZCk6bH0sZC55RG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPWUsZCk6Y30sZC54UmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ZSxkKTpofSxkLnlSYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1lLGQpOnB9LGQuYW5pbWF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1lLGQpOml9LGQuY29sb3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ZS51dGlscy5nZXRDb2xvcih0KSxkKTpmfSxkfSxlLm1vZGVscy5zcGFya2xpbmVQbHVzPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHYoZSl7cmV0dXJuIGUuZWFjaChmdW5jdGlvbihjKXtmdW5jdGlvbiBPKCl7aWYoYSlyZXR1cm47dmFyIGU9Qy5zZWxlY3RBbGwoIi5udi1ob3ZlclZhbHVlIikuZGF0YSh1KSxyPWUuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LWhvdmVyVmFsdWUiKS5zdHlsZSgic3Ryb2tlLW9wYWNpdHkiLDApLnN0eWxlKCJmaWxsLW9wYWNpdHkiLDApO2UuZXhpdCgpLnRyYW5zaXRpb24oKS5kdXJhdGlvbigyNTApLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsMCkuc3R5bGUoImZpbGwtb3BhY2l0eSIsMCkucmVtb3ZlKCksZS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKGUpe3JldHVybiJ0cmFuc2xhdGUoIitzKHQueCgpKGNbZV0sZSkpKyIsMCkifSkudHJhbnNpdGlvbigpLmR1cmF0aW9uKDI1MCkuc3R5bGUoInN0cm9rZS1vcGFjaXR5IiwxKS5zdHlsZSgiZmlsbC1vcGFjaXR5IiwxKTtpZighdS5sZW5ndGgpcmV0dXJuO3IuYXBwZW5kKCJsaW5lIikuYXR0cigieDEiLDApLmF0dHIoInkxIiwtbi50b3ApLmF0dHIoIngyIiwwKS5hdHRyKCJ5MiIsYiksci5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsIm52LXhWYWx1ZSIpLmF0dHIoIngiLC02KS5hdHRyKCJ5Iiwtbi50b3ApLmF0dHIoInRleHQtYW5jaG9yIiwiZW5kIikuYXR0cigiZHkiLCIuOWVtIiksQy5zZWxlY3QoIi5udi1ob3ZlclZhbHVlIC5udi14VmFsdWUiKS50ZXh0KGYodC54KCkoY1t1WzBdXSx1WzBdKSkpLHIuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLCJudi15VmFsdWUiKS5hdHRyKCJ4Iiw2KS5hdHRyKCJ5Iiwtbi50b3ApLmF0dHIoInRleHQtYW5jaG9yIiwic3RhcnQiKS5hdHRyKCJkeSIsIi45ZW0iKSxDLnNlbGVjdCgiLm52LWhvdmVyVmFsdWUgLm52LXlWYWx1ZSIpLnRleHQobCh0LnkoKShjW3VbMF1dLHVbMF0pKSl9ZnVuY3Rpb24gTSgpe2Z1bmN0aW9uIHIoZSxuKXt2YXIgcj1NYXRoLmFicyh0LngoKShlWzBdLDApLW4pLGk9MDtmb3IodmFyIHM9MDtzPGUubGVuZ3RoO3MrKylNYXRoLmFicyh0LngoKShlW3NdLHMpLW4pPHImJihyPU1hdGguYWJzKHQueCgpKGVbc10scyktbiksaT1zKTtyZXR1cm4gaX1pZihhKXJldHVybjt2YXIgZT1kMy5tb3VzZSh0aGlzKVswXS1uLmxlZnQ7dT1bcihjLE1hdGgucm91bmQocy5pbnZlcnQoZSkpKV0sTygpfXZhciBtPWQzLnNlbGVjdCh0aGlzKSxnPShyfHxwYXJzZUludChtLnN0eWxlKCJ3aWR0aCIpKXx8OTYwKS1uLmxlZnQtbi5yaWdodCxiPShpfHxwYXJzZUludChtLnN0eWxlKCJoZWlnaHQiKSl8fDQwMCktbi50b3Atbi5ib3R0b207di51cGRhdGU9ZnVuY3Rpb24oKXt2KGUpfSx2LmNvbnRhaW5lcj10aGlzO2lmKCFjfHwhYy5sZW5ndGgpe3ZhciB3PW0uc2VsZWN0QWxsKCIubnYtbm9EYXRhIikuZGF0YShbZF0pO3JldHVybiB3LmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLCJudmQzIG52LW5vRGF0YSIpLmF0dHIoImR5IiwiLS43ZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKSx3LmF0dHIoIngiLG4ubGVmdCtnLzIpLmF0dHIoInkiLG4udG9wK2IvMikudGV4dChmdW5jdGlvbihlKXtyZXR1cm4gZX0pLHZ9bS5zZWxlY3RBbGwoIi5udi1ub0RhdGEiKS5yZW1vdmUoKTt2YXIgRT10LnkoKShjW2MubGVuZ3RoLTFdLGMubGVuZ3RoLTEpO3M9dC54U2NhbGUoKSxvPXQueVNjYWxlKCk7dmFyIFM9bS5zZWxlY3RBbGwoImcubnYtd3JhcC5udi1zcGFya2xpbmVwbHVzIikuZGF0YShbY10pLFQ9Uy5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnZkMyBudi13cmFwIG52LXNwYXJrbGluZXBsdXMiKSxOPVQuYXBwZW5kKCJnIiksQz1TLnNlbGVjdCgiZyIpO04uYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1zcGFya2xpbmVXcmFwIiksTi5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXZhbHVlV3JhcCIpLE4uYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1ob3ZlckFyZWEiKSxTLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK24ubGVmdCsiLCIrbi50b3ArIikiKTt2YXIgaz1DLnNlbGVjdCgiLm52LXNwYXJrbGluZVdyYXAiKTt0LndpZHRoKGcpLmhlaWdodChiKSxrLmNhbGwodCk7dmFyIEw9Qy5zZWxlY3QoIi5udi12YWx1ZVdyYXAiKSxBPUwuc2VsZWN0QWxsKCIubnYtY3VycmVudFZhbHVlIikuZGF0YShbRV0pO0EuZW50ZXIoKS5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsIm52LWN1cnJlbnRWYWx1ZSIpLmF0dHIoImR4IixwPy04OjgpLmF0dHIoImR5IiwiLjllbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIscD8iZW5kIjoic3RhcnQiKSxBLmF0dHIoIngiLGcrKHA/bi5yaWdodDowKSkuYXR0cigieSIsaD9mdW5jdGlvbihlKXtyZXR1cm4gbyhlKX06MCkuc3R5bGUoImZpbGwiLHQuY29sb3IoKShjW2MubGVuZ3RoLTFdLGMubGVuZ3RoLTEpKS50ZXh0KGwoRSkpLE4uc2VsZWN0KCIubnYtaG92ZXJBcmVhIikuYXBwZW5kKCJyZWN0Iikub24oIm1vdXNlbW92ZSIsTSkub24oImNsaWNrIixmdW5jdGlvbigpe2E9IWF9KS5vbigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dT1bXSxPKCl9KSxDLnNlbGVjdCgiLm52LWhvdmVyQXJlYSByZWN0IikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihlKXtyZXR1cm4idHJhbnNsYXRlKCIrIC1uLmxlZnQrIiwiKyAtbi50b3ArIikifSkuYXR0cigid2lkdGgiLGcrbi5sZWZ0K24ucmlnaHQpLmF0dHIoImhlaWdodCIsYituLnRvcCl9KSx2fXZhciB0PWUubW9kZWxzLnNwYXJrbGluZSgpLG49e3RvcDoxNSxyaWdodDoxMDAsYm90dG9tOjEwLGxlZnQ6NTB9LHI9bnVsbCxpPW51bGwscyxvLHU9W10sYT0hMSxmPWQzLmZvcm1hdCgiLHIiKSxsPWQzLmZvcm1hdCgiLC4yZiIpLGM9ITAsaD0hMCxwPSExLGQ9Ik5vIERhdGEgQXZhaWxhYmxlLiI7cmV0dXJuIHYuc3BhcmtsaW5lPXQsZDMucmViaW5kKHYsdCwieCIsInkiLCJ4U2NhbGUiLCJ5U2NhbGUiLCJjb2xvciIpLHYub3B0aW9ucz1lLnV0aWxzLm9wdGlvbnNGdW5jLmJpbmQodiksdi5tYXJnaW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4udG9wPXR5cGVvZiBlLnRvcCE9InVuZGVmaW5lZCI/ZS50b3A6bi50b3Asbi5yaWdodD10eXBlb2YgZS5yaWdodCE9InVuZGVmaW5lZCI/ZS5yaWdodDpuLnJpZ2h0LG4uYm90dG9tPXR5cGVvZiBlLmJvdHRvbSE9InVuZGVmaW5lZCI/ZS5ib3R0b206bi5ib3R0b20sbi5sZWZ0PXR5cGVvZiBlLmxlZnQhPSJ1bmRlZmluZWQiP2UubGVmdDpuLmxlZnQsdik6bn0sdi53aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLHYpOnJ9LHYuaGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUsdik6aX0sdi54VGlja0Zvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1lLHYpOmZ9LHYueVRpY2tGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ZSx2KTpsfSx2LnNob3dWYWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1lLHYpOmN9LHYuYWxpZ25WYWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1lLHYpOmh9LHYucmlnaHRBbGlnblZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPWUsdik6cH0sdi5ub0RhdGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9ZSx2KTpkfSx2fSxlLm1vZGVscy5zdGFja2VkQXJlYT1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBnKGUpe3JldHVybiBlLmVhY2goZnVuY3Rpb24oZSl7dmFyIGE9bi10LmxlZnQtdC5yaWdodCxnPXItdC50b3AtdC5ib3R0b20sYj1kMy5zZWxlY3QodGhpcyk7cD12LnhTY2FsZSgpLGQ9di55U2NhbGUoKSxlPWUubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuc2VyaWVzSW5kZXg9dCxlLnZhbHVlcz1lLnZhbHVlcy5tYXAoZnVuY3Rpb24oZSxuKXtyZXR1cm4gZS5pbmRleD1uLGUuc2VyaWVzSW5kZXg9dCxlfSksZX0pO3ZhciB3PWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmRpc2FibGVkfSk7ZT1kMy5sYXlvdXQuc3RhY2soKS5vcmRlcihsKS5vZmZzZXQoZikudmFsdWVzKGZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlc30pLngobykueSh1KS5vdXQoZnVuY3Rpb24oZSx0LG4pe3ZhciByPXUoZSk9PT0wPzA6bjtlLmRpc3BsYXk9e3k6cix5MDp0fX0pKHcpO3ZhciBFPWIuc2VsZWN0QWxsKCJnLm52LXdyYXAubnYtc3RhY2tlZGFyZWEiKS5kYXRhKFtlXSksUz1FLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudmQzIG52LXdyYXAgbnYtc3RhY2tlZGFyZWEiKSxUPVMuYXBwZW5kKCJkZWZzIiksTj1TLmFwcGVuZCgiZyIpLEM9RS5zZWxlY3QoImciKTtOLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtYXJlYVdyYXAiKSxOLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtc2NhdHRlcldyYXAiKSxFLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3QubGVmdCsiLCIrdC50b3ArIikiKSx2LndpZHRoKGEpLmhlaWdodChnKS54KG8pLnkoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzcGxheS55K2UuZGlzcGxheS55MH0pLmZvcmNlWShbMF0pLmNvbG9yKGUubWFwKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29sb3J8fGkoZSxlLnNlcmllc0luZGV4KX0pKTt2YXIgaz1DLnNlbGVjdCgiLm52LXNjYXR0ZXJXcmFwIikuZGF0dW0oZSk7ay5jYWxsKHYpLFQuYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIiwibnYtZWRnZS1jbGlwLSIrcykuYXBwZW5kKCJyZWN0IiksRS5zZWxlY3QoIiNudi1lZGdlLWNsaXAtIitzKyIgcmVjdCIpLmF0dHIoIndpZHRoIixhKS5hdHRyKCJoZWlnaHQiLGcpLEMuYXR0cigiY2xpcC1wYXRoIixoPyJ1cmwoI252LWVkZ2UtY2xpcC0iK3MrIikiOiIiKTt2YXIgTD1kMy5zdmcuYXJlYSgpLngoZnVuY3Rpb24oZSx0KXtyZXR1cm4gcChvKGUsdCkpfSkueTAoZnVuY3Rpb24oZSl7cmV0dXJuIGQoZS5kaXNwbGF5LnkwKX0pLnkxKGZ1bmN0aW9uKGUpe3JldHVybiBkKGUuZGlzcGxheS55K2UuZGlzcGxheS55MCl9KS5pbnRlcnBvbGF0ZShjKSxBPWQzLnN2Zy5hcmVhKCkueChmdW5jdGlvbihlLHQpe3JldHVybiBwKG8oZSx0KSl9KS55MChmdW5jdGlvbihlKXtyZXR1cm4gZChlLmRpc3BsYXkueTApfSkueTEoZnVuY3Rpb24oZSl7cmV0dXJuIGQoZS5kaXNwbGF5LnkwKX0pLE89Qy5zZWxlY3QoIi5udi1hcmVhV3JhcCIpLnNlbGVjdEFsbCgicGF0aC5udi1hcmVhIikuZGF0YShmdW5jdGlvbihlKXtyZXR1cm4gZX0pO08uZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24oZSx0KXtyZXR1cm4ibnYtYXJlYSBudi1hcmVhLSIrdH0pLmF0dHIoImQiLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIEEoZS52YWx1ZXMsZS5zZXJpZXNJbmRleCl9KS5vbigibW91c2VvdmVyIixmdW5jdGlvbihlLHQpe2QzLnNlbGVjdCh0aGlzKS5jbGFzc2VkKCJob3ZlciIsITApLG0uYXJlYU1vdXNlb3Zlcih7cG9pbnQ6ZSxzZXJpZXM6ZS5rZXkscG9zOltkMy5ldmVudC5wYWdlWCxkMy5ldmVudC5wYWdlWV0sc2VyaWVzSW5kZXg6dH0pfSkub24oIm1vdXNlb3V0IixmdW5jdGlvbihlLHQpe2QzLnNlbGVjdCh0aGlzKS5jbGFzc2VkKCJob3ZlciIsITEpLG0uYXJlYU1vdXNlb3V0KHtwb2ludDplLHNlcmllczplLmtleSxwb3M6W2QzLmV2ZW50LnBhZ2VYLGQzLmV2ZW50LnBhZ2VZXSxzZXJpZXNJbmRleDp0fSl9KS5vbigiY2xpY2siLGZ1bmN0aW9uKGUsdCl7ZDMuc2VsZWN0KHRoaXMpLmNsYXNzZWQoImhvdmVyIiwhMSksbS5hcmVhQ2xpY2soe3BvaW50OmUsc2VyaWVzOmUua2V5LHBvczpbZDMuZXZlbnQucGFnZVgsZDMuZXZlbnQucGFnZVldLHNlcmllc0luZGV4OnR9KX0pLE8uZXhpdCgpLnRyYW5zaXRpb24oKS5hdHRyKCJkIixmdW5jdGlvbihlLHQpe3JldHVybiBBKGUudmFsdWVzLHQpfSkucmVtb3ZlKCksTy5zdHlsZSgiZmlsbCIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb2xvcnx8aShlLGUuc2VyaWVzSW5kZXgpfSkuc3R5bGUoInN0cm9rZSIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb2xvcnx8aShlLGUuc2VyaWVzSW5kZXgpfSksTy50cmFuc2l0aW9uKCkuYXR0cigiZCIsZnVuY3Rpb24oZSx0KXtyZXR1cm4gTChlLnZhbHVlcyx0KX0pLHYuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW92ZXIuYXJlYSIsZnVuY3Rpb24oZSl7Qy5zZWxlY3QoIi5udi1jaGFydC0iK3MrIiAubnYtYXJlYS0iK2Uuc2VyaWVzSW5kZXgpLmNsYXNzZWQoImhvdmVyIiwhMCl9KSx2LmRpc3BhdGNoLm9uKCJlbGVtZW50TW91c2VvdXQuYXJlYSIsZnVuY3Rpb24oZSl7Qy5zZWxlY3QoIi5udi1jaGFydC0iK3MrIiAubnYtYXJlYS0iK2Uuc2VyaWVzSW5kZXgpLmNsYXNzZWQoImhvdmVyIiwhMSl9KX0pLGd9dmFyIHQ9e3RvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowfSxuPTk2MCxyPTUwMCxpPWUudXRpbHMuZGVmYXVsdENvbG9yKCkscz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqMWU1KSxvPWZ1bmN0aW9uKGUpe3JldHVybiBlLnh9LHU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUueX0sYT0ic3RhY2siLGY9Inplcm8iLGw9ImRlZmF1bHQiLGM9ImxpbmVhciIsaD0hMSxwLGQsdj1lLm1vZGVscy5zY2F0dGVyKCksbT1kMy5kaXNwYXRjaCgidG9vbHRpcFNob3ciLCJ0b29sdGlwSGlkZSIsImFyZWFDbGljayIsImFyZWFNb3VzZW92ZXIiLCJhcmVhTW91c2VvdXQiKTtyZXR1cm4gdi5zaXplKDIuMikuc2l6ZURvbWFpbihbMi4yLDIuMl0pLHYuZGlzcGF0Y2gub24oImVsZW1lbnRDbGljay5hcmVhIixmdW5jdGlvbihlKXttLmFyZWFDbGljayhlKX0pLHYuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW92ZXIudG9vbHRpcCIsZnVuY3Rpb24oZSl7ZS5wb3M9W2UucG9zWzBdK3QubGVmdCxlLnBvc1sxXSt0LnRvcF0sbS50b29sdGlwU2hvdyhlKX0pLHYuZGlzcGF0Y2gub24oImVsZW1lbnRNb3VzZW91dC50b29sdGlwIixmdW5jdGlvbihlKXttLnRvb2x0aXBIaWRlKGUpfSksZy5kaXNwYXRjaD1tLGcuc2NhdHRlcj12LGQzLnJlYmluZChnLHYsImludGVyYWN0aXZlIiwic2l6ZSIsInhTY2FsZSIsInlTY2FsZSIsInpTY2FsZSIsInhEb21haW4iLCJ5RG9tYWluIiwieFJhbmdlIiwieVJhbmdlIiwic2l6ZURvbWFpbiIsImZvcmNlWCIsImZvcmNlWSIsImZvcmNlU2l6ZSIsImNsaXBWb3Jvbm9pIiwidXNlVm9yb25vaSIsImNsaXBSYWRpdXMiLCJoaWdobGlnaHRQb2ludCIsImNsZWFySGlnaGxpZ2h0cyIpLGcub3B0aW9ucz1lLnV0aWxzLm9wdGlvbnNGdW5jLmJpbmQoZyksZy54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWQzLmZ1bmN0b3IoZSksZyk6b30sZy55PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWQzLmZ1bmN0b3IoZSksZyk6dX0sZy5tYXJnaW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQudG9wPXR5cGVvZiBlLnRvcCE9InVuZGVmaW5lZCI/ZS50b3A6dC50b3AsdC5yaWdodD10eXBlb2YgZS5yaWdodCE9InVuZGVmaW5lZCI/ZS5yaWdodDp0LnJpZ2h0LHQuYm90dG9tPXR5cGVvZiBlLmJvdHRvbSE9InVuZGVmaW5lZCI/ZS5ib3R0b206dC5ib3R0b20sdC5sZWZ0PXR5cGVvZiBlLmxlZnQhPSJ1bmRlZmluZWQiP2UubGVmdDp0LmxlZnQsZyk6dH0sZy53aWR0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLGcpOm59LGcuaGVpZ2h0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWUsZyk6cn0sZy5jbGlwRWRnZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1lLGcpOmh9LGcuY29sb3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ZS51dGlscy5nZXRDb2xvcih0KSxnKTppfSxnLm9mZnNldD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1lLGcpOmZ9LGcub3JkZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ZSxnKTpsfSxnLnN0eWxlPWZ1bmN0aW9uKGUpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBhO2E9ZTtzd2l0Y2goYSl7Y2FzZSJzdGFjayI6Zy5vZmZzZXQoInplcm8iKSxnLm9yZGVyKCJkZWZhdWx0Iik7YnJlYWs7Y2FzZSJzdHJlYW0iOmcub2Zmc2V0KCJ3aWdnbGUiKSxnLm9yZGVyKCJpbnNpZGUtb3V0Iik7YnJlYWs7Y2FzZSJzdHJlYW0tY2VudGVyIjpnLm9mZnNldCgic2lsaG91ZXR0ZSIpLGcub3JkZXIoImluc2lkZS1vdXQiKTticmVhaztjYXNlImV4cGFuZCI6Zy5vZmZzZXQoImV4cGFuZCIpLGcub3JkZXIoImRlZmF1bHQiKX1yZXR1cm4gZ30sZy5pbnRlcnBvbGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1lLGcpOmN9LGd9LGUubW9kZWxzLnN0YWNrZWRBcmVhQ2hhcnQ9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gTyh5KXtyZXR1cm4geS5lYWNoKGZ1bmN0aW9uKHkpe3ZhciBNPWQzLnNlbGVjdCh0aGlzKSxfPXRoaXMsRD0oYXx8cGFyc2VJbnQoTS5zdHlsZSgid2lkdGgiKSl8fDk2MCktdS5sZWZ0LXUucmlnaHQsUD0oZnx8cGFyc2VJbnQoTS5zdHlsZSgiaGVpZ2h0IikpfHw0MDApLXUudG9wLXUuYm90dG9tO08udXBkYXRlPWZ1bmN0aW9uKCl7TS50cmFuc2l0aW9uKCkuZHVyYXRpb24oTCkuY2FsbChPKX0sTy5jb250YWluZXI9dGhpcyxTLmRpc2FibGVkPXkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiEhZS5kaXNhYmxlZH0pO2lmKCF4KXt2YXIgSDt4PXt9O2ZvcihIIGluIFMpU1tIXWluc3RhbmNlb2YgQXJyYXk/eFtIXT1TW0hdLnNsaWNlKDApOnhbSF09U1tIXX1pZigheXx8IXkubGVuZ3RofHwheS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUudmFsdWVzLmxlbmd0aH0pLmxlbmd0aCl7dmFyIEI9TS5zZWxlY3RBbGwoIi5udi1ub0RhdGEiKS5kYXRhKFtUXSk7cmV0dXJuIEIuZW50ZXIoKS5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsIm52ZDMgbnYtbm9EYXRhIikuYXR0cigiZHkiLCItLjdlbSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLEIuYXR0cigieCIsdS5sZWZ0K0QvMikuYXR0cigieSIsdS50b3ArUC8yKS50ZXh0KGZ1bmN0aW9uKGUpe3JldHVybiBlfSksT31NLnNlbGVjdEFsbCgiLm52LW5vRGF0YSIpLnJlbW92ZSgpLGI9dC54U2NhbGUoKSx3PXQueVNjYWxlKCk7dmFyIGo9TS5zZWxlY3RBbGwoImcubnYtd3JhcC5udi1zdGFja2VkQXJlYUNoYXJ0IikuZGF0YShbeV0pLEY9ai5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnZkMyBudi13cmFwIG52LXN0YWNrZWRBcmVhQ2hhcnQiKS5hcHBlbmQoImciKSxJPWouc2VsZWN0KCJnIik7Ri5hcHBlbmQoInJlY3QiKS5zdHlsZSgib3BhY2l0eSIsMCksRi5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsIm52LXggbnYtYXhpcyIpLEYuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi15IG52LWF4aXMiKSxGLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtc3RhY2tlZFdyYXAiKSxGLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtbGVnZW5kV3JhcCIpLEYuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJudi1jb250cm9sc1dyYXAiKSxGLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibnYtaW50ZXJhY3RpdmUiKSxJLnNlbGVjdCgicmVjdCIpLmF0dHIoIndpZHRoIixEKS5hdHRyKCJoZWlnaHQiLFApO2lmKGgpe3ZhciBxPWM/RC1DOkQ7aS53aWR0aChxKSxJLnNlbGVjdCgiLm52LWxlZ2VuZFdyYXAiKS5kYXR1bSh5KS5jYWxsKGkpLHUudG9wIT1pLmhlaWdodCgpJiYodS50b3A9aS5oZWlnaHQoKSxQPShmfHxwYXJzZUludChNLnN0eWxlKCJoZWlnaHQiKSl8fDQwMCktdS50b3AtdS5ib3R0b20pLEkuc2VsZWN0KCIubnYtbGVnZW5kV3JhcCIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiKyhELXEpKyIsIisgLXUudG9wKyIpIil9aWYoYyl7dmFyIFI9W3trZXk6IlN0YWNrZWQiLGRpc2FibGVkOnQub2Zmc2V0KCkhPSJ6ZXJvIn0se2tleToiU3RyZWFtIixkaXNhYmxlZDp0Lm9mZnNldCgpIT0id2lnZ2xlIn0se2tleToiRXhwYW5kZWQiLGRpc2FibGVkOnQub2Zmc2V0KCkhPSJleHBhbmQifV07Qz1rLmxlbmd0aC8zKjI2MCxSPVIuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBrLmluZGV4T2YoZS5rZXkpPi0xfSkscy53aWR0aChDKS5jb2xvcihbIiM0NDQiLCIjNDQ0IiwiIzQ0NCJdKSxJLnNlbGVjdCgiLm52LWNvbnRyb2xzV3JhcCIpLmRhdHVtKFIpLmNhbGwocyksdS50b3AhPU1hdGgubWF4KHMuaGVpZ2h0KCksaS5oZWlnaHQoKSkmJih1LnRvcD1NYXRoLm1heChzLmhlaWdodCgpLGkuaGVpZ2h0KCkpLFA9KGZ8fHBhcnNlSW50KE0uc3R5bGUoImhlaWdodCIpKXx8NDAwKS11LnRvcC11LmJvdHRvbSksSS5zZWxlY3QoIi5udi1jb250cm9sc1dyYXAiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwiKyAtdS50b3ArIikiKX1qLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3UubGVmdCsiLCIrdS50b3ArIikiKSx2JiZJLnNlbGVjdCgiLm52LXkubnYtYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0QrIiwwKSIpLG0mJihvLndpZHRoKEQpLmhlaWdodChQKS5tYXJnaW4oe2xlZnQ6dS5sZWZ0LHRvcDp1LnRvcH0pLnN2Z0NvbnRhaW5lcihNKS54U2NhbGUoYiksai5zZWxlY3QoIi5udi1pbnRlcmFjdGl2ZSIpLmNhbGwobykpLHQud2lkdGgoRCkuaGVpZ2h0KFApO3ZhciBVPUkuc2VsZWN0KCIubnYtc3RhY2tlZFdyYXAiKS5kYXR1bSh5KTtVLnRyYW5zaXRpb24oKS5jYWxsKHQpLHAmJihuLnNjYWxlKGIpLnRpY2tzKEQvMTAwKS50aWNrU2l6ZSgtUCwwKSxJLnNlbGVjdCgiLm52LXgubnYtYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCIrUCsiKSIpLEkuc2VsZWN0KCIubnYteC5udi1heGlzIikudHJhbnNpdGlvbigpLmR1cmF0aW9uKDApLmNhbGwobikpLGQmJihyLnNjYWxlKHcpLnRpY2tzKHQub2Zmc2V0KCk9PSJ3aWdnbGUiPzA6UC8zNikudGlja1NpemUoLUQsMCkuc2V0VGlja0Zvcm1hdCh0Lm9mZnNldCgpPT0iZXhwYW5kIj9kMy5mb3JtYXQoIiUiKTpFKSxJLnNlbGVjdCgiLm52LXkubnYtYXhpcyIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbigwKS5jYWxsKHIpKSx0LmRpc3BhdGNoLm9uKCJhcmVhQ2xpY2sudG9nZ2xlIixmdW5jdGlvbihlKXt5LmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5kaXNhYmxlZH0pLmxlbmd0aD09PTE/eT15Lm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD0hMSxlfSk6eT15Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiB0LmRpc2FibGVkPW4hPWUuc2VyaWVzSW5kZXgsdH0pLFMuZGlzYWJsZWQ9eS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuISFlLmRpc2FibGVkfSksTi5zdGF0ZUNoYW5nZShTKSxPLnVwZGF0ZSgpfSksaS5kaXNwYXRjaC5vbigic3RhdGVDaGFuZ2UiLGZ1bmN0aW9uKGUpe1MuZGlzYWJsZWQ9ZS5kaXNhYmxlZCxOLnN0YXRlQ2hhbmdlKFMpLE8udXBkYXRlKCl9KSxzLmRpc3BhdGNoLm9uKCJsZWdlbmRDbGljayIsZnVuY3Rpb24oZSxuKXtpZighZS5kaXNhYmxlZClyZXR1cm47Uj1SLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD0hMCxlfSksZS5kaXNhYmxlZD0hMTtzd2l0Y2goZS5rZXkpe2Nhc2UiU3RhY2tlZCI6dC5zdHlsZSgic3RhY2siKTticmVhaztjYXNlIlN0cmVhbSI6dC5zdHlsZSgic3RyZWFtIik7YnJlYWs7Y2FzZSJFeHBhbmRlZCI6dC5zdHlsZSgiZXhwYW5kIil9Uy5zdHlsZT10LnN0eWxlKCksTi5zdGF0ZUNoYW5nZShTKSxPLnVwZGF0ZSgpfSksby5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlbW92ZSIsZnVuY3Rpb24oaSl7dC5jbGVhckhpZ2hsaWdodHMoKTt2YXIgcyxhLGYsYz1bXTt5LmZpbHRlcihmdW5jdGlvbihlLHQpe3JldHVybiBlLnNlcmllc0luZGV4PXQsIWUuZGlzYWJsZWR9KS5mb3JFYWNoKGZ1bmN0aW9uKG4scil7YT1lLmludGVyYWN0aXZlQmlzZWN0KG4udmFsdWVzLGkucG9pbnRYVmFsdWUsTy54KCkpLHQuaGlnaGxpZ2h0UG9pbnQocixhLCEwKTt2YXIgbz1uLnZhbHVlc1thXTtpZih0eXBlb2Ygbz09InVuZGVmaW5lZCIpcmV0dXJuO3R5cGVvZiBzPT0idW5kZWZpbmVkIiYmKHM9byksdHlwZW9mIGY9PSJ1bmRlZmluZWQiJiYoZj1PLnhTY2FsZSgpKE8ueCgpKG8sYSkpKSxjLnB1c2goe2tleTpuLmtleSx2YWx1ZTpPLnkoKShvLGEpLGNvbG9yOmwobixuLnNlcmllc0luZGV4KX0pfSk7dmFyIGg9bi50aWNrRm9ybWF0KCkoTy54KCkocyxhKSk7by50b29sdGlwLnBvc2l0aW9uKHtsZWZ0OmYrdS5sZWZ0LHRvcDppLm1vdXNlWSt1LnRvcH0pLmNoYXJ0Q29udGFpbmVyKF8ucGFyZW50Tm9kZSkuZW5hYmxlZChnKS52YWx1ZUZvcm1hdHRlcihmdW5jdGlvbihlLHQpe3JldHVybiByLnRpY2tGb3JtYXQoKShlKX0pLmRhdGEoe3ZhbHVlOmgsc2VyaWVzOmN9KSgpLG8ucmVuZGVyR3VpZGVMaW5lKGYpfSksby5kaXNwYXRjaC5vbigiZWxlbWVudE1vdXNlb3V0IixmdW5jdGlvbihlKXtOLnRvb2x0aXBIaWRlKCksdC5jbGVhckhpZ2hsaWdodHMoKX0pLE4ub24oInRvb2x0aXBTaG93IixmdW5jdGlvbihlKXtnJiZBKGUsXy5wYXJlbnROb2RlKX0pLE4ub24oImNoYW5nZVN0YXRlIixmdW5jdGlvbihlKXt0eXBlb2YgZS5kaXNhYmxlZCE9InVuZGVmaW5lZCImJih5LmZvckVhY2goZnVuY3Rpb24odCxuKXt0LmRpc2FibGVkPWUuZGlzYWJsZWRbbl19KSxTLmRpc2FibGVkPWUuZGlzYWJsZWQpLHR5cGVvZiBlLnN0eWxlIT0idW5kZWZpbmVkIiYmdC5zdHlsZShlLnN0eWxlKSxPLnVwZGF0ZSgpfSl9KSxPfXZhciB0PWUubW9kZWxzLnN0YWNrZWRBcmVhKCksbj1lLm1vZGVscy5heGlzKCkscj1lLm1vZGVscy5heGlzKCksaT1lLm1vZGVscy5sZWdlbmQoKSxzPWUubW9kZWxzLmxlZ2VuZCgpLG89ZS5pbnRlcmFjdGl2ZUd1aWRlbGluZSgpLHU9e3RvcDozMCxyaWdodDoyNSxib3R0b206NTAsbGVmdDo2MH0sYT1udWxsLGY9bnVsbCxsPWUudXRpbHMuZGVmYXVsdENvbG9yKCksYz0hMCxoPSEwLHA9ITAsZD0hMCx2PSExLG09ITEsZz0hMCx5PWZ1bmN0aW9uKGUsdCxuLHIsaSl7cmV0dXJuIjxoMz4iK2UrIjwvaDM+IisiPHA+IituKyIgb24gIit0KyI8L3A+In0sYix3LEU9ZDMuZm9ybWF0KCIsLjJmIiksUz17c3R5bGU6dC5zdHlsZSgpfSx4PW51bGwsVD0iTm8gRGF0YSBBdmFpbGFibGUuIixOPWQzLmRpc3BhdGNoKCJ0b29sdGlwU2hvdyIsInRvb2x0aXBIaWRlIiwic3RhdGVDaGFuZ2UiLCJjaGFuZ2VTdGF0ZSIpLEM9MjUwLGs9WyJTdGFja2VkIiwiU3RyZWFtIiwiRXhwYW5kZWQiXSxMPTI1MDtuLm9yaWVudCgiYm90dG9tIikudGlja1BhZGRpbmcoNyksci5vcmllbnQodj8icmlnaHQiOiJsZWZ0Iikscy51cGRhdGVTdGF0ZSghMSk7dmFyIEE9ZnVuY3Rpb24oaSxzKXt2YXIgbz1pLnBvc1swXSsocy5vZmZzZXRMZWZ0fHwwKSx1PWkucG9zWzFdKyhzLm9mZnNldFRvcHx8MCksYT1uLnRpY2tGb3JtYXQoKSh0LngoKShpLnBvaW50LGkucG9pbnRJbmRleCkpLGY9ci50aWNrRm9ybWF0KCkodC55KCkoaS5wb2ludCxpLnBvaW50SW5kZXgpKSxsPXkoaS5zZXJpZXMua2V5LGEsZixpLE8pO2UudG9vbHRpcC5zaG93KFtvLHVdLGwsaS52YWx1ZTwwPyJuIjoicyIsbnVsbCxzKX07cmV0dXJuIHQuZGlzcGF0Y2gub24oInRvb2x0aXBTaG93IixmdW5jdGlvbihlKXtlLnBvcz1bZS5wb3NbMF0rdS5sZWZ0LGUucG9zWzFdK3UudG9wXSxOLnRvb2x0aXBTaG93KGUpfSksdC5kaXNwYXRjaC5vbigidG9vbHRpcEhpZGUiLGZ1bmN0aW9uKGUpe04udG9vbHRpcEhpZGUoZSl9KSxOLm9uKCJ0b29sdGlwSGlkZSIsZnVuY3Rpb24oKXtnJiZlLnRvb2x0aXAuY2xlYW51cCgpfSksTy5kaXNwYXRjaD1OLE8uc3RhY2tlZD10LE8ubGVnZW5kPWksTy5jb250cm9scz1zLE8ueEF4aXM9bixPLnlBeGlzPXIsTy5pbnRlcmFjdGl2ZUxheWVyPW8sZDMucmViaW5kKE8sdCwieCIsInkiLCJzaXplIiwieFNjYWxlIiwieVNjYWxlIiwieERvbWFpbiIsInlEb21haW4iLCJ4UmFuZ2UiLCJ5UmFuZ2UiLCJzaXplRG9tYWluIiwiaW50ZXJhY3RpdmUiLCJ1c2VWb3Jvbm9pIiwib2Zmc2V0Iiwib3JkZXIiLCJzdHlsZSIsImNsaXBFZGdlIiwiZm9yY2VYIiwiZm9yY2VZIiwiZm9yY2VTaXplIiwiaW50ZXJwb2xhdGUiKSxPLm9wdGlvbnM9ZS51dGlscy5vcHRpb25zRnVuYy5iaW5kKE8pLE8ubWFyZ2luPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1LnRvcD10eXBlb2YgZS50b3AhPSJ1bmRlZmluZWQiP2UudG9wOnUudG9wLHUucmlnaHQ9dHlwZW9mIGUucmlnaHQhPSJ1bmRlZmluZWQiP2UucmlnaHQ6dS5yaWdodCx1LmJvdHRvbT10eXBlb2YgZS5ib3R0b20hPSJ1bmRlZmluZWQiP2UuYm90dG9tOnUuYm90dG9tLHUubGVmdD10eXBlb2YgZS5sZWZ0IT0idW5kZWZpbmVkIj9lLmxlZnQ6dS5sZWZ0LE8pOnV9LE8ud2lkdGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ZSxPKTphfSxPLmhlaWdodD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1lLE8pOmZ9LE8uY29sb3I9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ZS51dGlscy5nZXRDb2xvcihuKSxpLmNvbG9yKGwpLHQuY29sb3IobCksTyk6bH0sTy5zaG93Q29udHJvbHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ZSxPKTpjfSxPLnNob3dMZWdlbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ZSxPKTpofSxPLnNob3dYQXhpcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1lLE8pOnB9LE8uc2hvd1lBeGlzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPWUsTyk6ZH0sTy5yaWdodEFsaWduWUF4aXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9ZSxyLm9yaWVudChlPyJyaWdodCI6ImxlZnQiKSxPKTp2fSxPLnVzZUludGVyYWN0aXZlR3VpZGVsaW5lPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPWUsZT09PSEwJiYoTy5pbnRlcmFjdGl2ZSghMSksTy51c2VWb3Jvbm9pKCExKSksTyk6bX0sTy50b29sdGlwPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PWUsTyk6eX0sTy50b29sdGlwcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz1lLE8pOmd9LE8udG9vbHRpcENvbnRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9ZSxPKTp5fSxPLnN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhTPWUsTyk6U30sTy5kZWZhdWx0U3RhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9ZSxPKTp4fSxPLm5vRGF0YT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oVD1lLE8pOlR9LE8udHJhbnNpdGlvbkR1cmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhMPWUsTyk6TH0sTy5jb250cm9sc0RhdGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGs9ZSxPKTprfSxyLnNldFRpY2tGb3JtYXQ9ci50aWNrRm9ybWF0LHIudGlja0Zvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oRT1lLHIpOkV9LE99fSkoKTs=' type='text/javascript'></script> <script src='data:application/javascript;base64,KGZ1bmN0aW9uKCkgewogIGQzLmZpc2hleWUgPSB7CiAgICBzY2FsZTogZnVuY3Rpb24oc2NhbGVUeXBlKSB7CiAgICAgIHJldHVybiBkM19maXNoZXllX3NjYWxlKHNjYWxlVHlwZSgpLCAzLCAwKTsKICAgIH0sCiAgICBjaXJjdWxhcjogZnVuY3Rpb24oKSB7CiAgICAgIHZhciByYWRpdXMgPSAyMDAsCiAgICAgICAgICBkaXN0b3J0aW9uID0gMiwKICAgICAgICAgIGswLAogICAgICAgICAgazEsCiAgICAgICAgICBmb2N1cyA9IFswLCAwXTsKCiAgICAgIGZ1bmN0aW9uIGZpc2hleWUoZCkgewogICAgICAgIHZhciBkeCA9IGQueCAtIGZvY3VzWzBdLAogICAgICAgICAgICBkeSA9IGQueSAtIGZvY3VzWzFdLAogICAgICAgICAgICBkZCA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7CiAgICAgICAgaWYgKCFkZCB8fCBkZCA+PSByYWRpdXMpIHJldHVybiB7eDogZC54LCB5OiBkLnksIHo6IDF9OwogICAgICAgIHZhciBrID0gazAgKiAoMSAtIE1hdGguZXhwKC1kZCAqIGsxKSkgLyBkZCAqIC43NSArIC4yNTsKICAgICAgICByZXR1cm4ge3g6IGZvY3VzWzBdICsgZHggKiBrLCB5OiBmb2N1c1sxXSArIGR5ICogaywgejogTWF0aC5taW4oaywgMTApfTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcmVzY2FsZSgpIHsKICAgICAgICBrMCA9IE1hdGguZXhwKGRpc3RvcnRpb24pOwogICAgICAgIGswID0gazAgLyAoazAgLSAxKSAqIHJhZGl1czsKICAgICAgICBrMSA9IGRpc3RvcnRpb24gLyByYWRpdXM7CiAgICAgICAgcmV0dXJuIGZpc2hleWU7CiAgICAgIH0KCiAgICAgIGZpc2hleWUucmFkaXVzID0gZnVuY3Rpb24oXykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhZGl1czsKICAgICAgICByYWRpdXMgPSArXzsKICAgICAgICByZXR1cm4gcmVzY2FsZSgpOwogICAgICB9OwoKICAgICAgZmlzaGV5ZS5kaXN0b3J0aW9uID0gZnVuY3Rpb24oXykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRpc3RvcnRpb247CiAgICAgICAgZGlzdG9ydGlvbiA9ICtfOwogICAgICAgIHJldHVybiByZXNjYWxlKCk7CiAgICAgIH07CgogICAgICBmaXNoZXllLmZvY3VzID0gZnVuY3Rpb24oXykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGZvY3VzOwogICAgICAgIGZvY3VzID0gXzsKICAgICAgICByZXR1cm4gZmlzaGV5ZTsKICAgICAgfTsKCiAgICAgIHJldHVybiByZXNjYWxlKCk7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gZDNfZmlzaGV5ZV9zY2FsZShzY2FsZSwgZCwgYSkgewoKICAgIGZ1bmN0aW9uIGZpc2hleWUoXykgewogICAgICB2YXIgeCA9IHNjYWxlKF8pLAogICAgICAgICAgbGVmdCA9IHggPCBhLAogICAgICAgICAgdiwKICAgICAgICAgIHJhbmdlID0gZDMuZXh0ZW50KHNjYWxlLnJhbmdlKCkpLAogICAgICAgICAgbWluID0gcmFuZ2VbMF0sCiAgICAgICAgICBtYXggPSByYW5nZVsxXSwKICAgICAgICAgIG0gPSBsZWZ0ID8gYSAtIG1pbiA6IG1heCAtIGE7CiAgICAgIGlmIChtID09IDApIG0gPSBtYXggLSBtaW47CiAgICAgIHJldHVybiAobGVmdCA/IC0xIDogMSkgKiBtICogKGQgKyAxKSAvIChkICsgKG0gLyBNYXRoLmFicyh4IC0gYSkpKSArIGE7CiAgICB9CgogICAgZmlzaGV5ZS5kaXN0b3J0aW9uID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkOwogICAgICBkID0gK187CiAgICAgIHJldHVybiBmaXNoZXllOwogICAgfTsKCiAgICBmaXNoZXllLmZvY3VzID0gZnVuY3Rpb24oXykgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBhOwogICAgICBhID0gK187CiAgICAgIHJldHVybiBmaXNoZXllOwogICAgfTsKCiAgICBmaXNoZXllLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGQzX2Zpc2hleWVfc2NhbGUoc2NhbGUuY29weSgpLCBkLCBhKTsKICAgIH07CgogICAgZmlzaGV5ZS5uaWNlID0gc2NhbGUubmljZTsKICAgIGZpc2hleWUudGlja3MgPSBzY2FsZS50aWNrczsKICAgIGZpc2hleWUudGlja0Zvcm1hdCA9IHNjYWxlLnRpY2tGb3JtYXQ7CiAgICByZXR1cm4gZDMucmViaW5kKGZpc2hleWUsIHNjYWxlLCAiZG9tYWluIiwgInJhbmdlIik7CiAgfQp9KSgpOwo=' type='text/javascript'></script> <style> .rChart { display: block; margin-left: auto; margin-right: auto; width: 800px; height: 400px; } </style> </head> <body > <div id = 'inline' class = 'rChart nvd3'></div> <script type='text/javascript'> $(document).ready(function(){ drawinline() }); function drawinline(){ var opts = { "dom": "inline", "width": 800, "height": 400, "x": "SepalWidth", "y": "SepalLength", "group": "Species", "type": "scatterChart", "id": "inline" }, data = [ { "SepalLength": 5.1, "SepalWidth": 3.5, "PetalLength": 1.4, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 4.9, "SepalWidth": 3, "PetalLength": 1.4, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 4.7, "SepalWidth": 3.2, "PetalLength": 1.3, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 4.6, "SepalWidth": 3.1, "PetalLength": 1.5, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 5, "SepalWidth": 3.6, "PetalLength": 1.4, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 5.4, "SepalWidth": 3.9, "PetalLength": 1.7, "PetalWidth": 0.4, "Species": "setosa" }, { "SepalLength": 4.6, "SepalWidth": 3.4, "PetalLength": 1.4, "PetalWidth": 0.3, "Species": "setosa" }, { "SepalLength": 5, "SepalWidth": 3.4, "PetalLength": 1.5, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 4.4, "SepalWidth": 2.9, "PetalLength": 1.4, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 4.9, "SepalWidth": 3.1, "PetalLength": 1.5, "PetalWidth": 0.1, "Species": "setosa" }, { "SepalLength": 5.4, "SepalWidth": 3.7, "PetalLength": 1.5, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 4.8, "SepalWidth": 3.4, "PetalLength": 1.6, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 4.8, "SepalWidth": 3, "PetalLength": 1.4, "PetalWidth": 0.1, "Species": "setosa" }, { "SepalLength": 4.3, "SepalWidth": 3, "PetalLength": 1.1, "PetalWidth": 0.1, "Species": "setosa" }, { "SepalLength": 5.8, "SepalWidth": 4, "PetalLength": 1.2, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 5.7, "SepalWidth": 4.4, "PetalLength": 1.5, "PetalWidth": 0.4, "Species": "setosa" }, { "SepalLength": 5.4, "SepalWidth": 3.9, "PetalLength": 1.3, "PetalWidth": 0.4, "Species": "setosa" }, { "SepalLength": 5.1, "SepalWidth": 3.5, "PetalLength": 1.4, "PetalWidth": 0.3, "Species": "setosa" }, { "SepalLength": 5.7, "SepalWidth": 3.8, "PetalLength": 1.7, "PetalWidth": 0.3, "Species": "setosa" }, { "SepalLength": 5.1, "SepalWidth": 3.8, "PetalLength": 1.5, "PetalWidth": 0.3, "Species": "setosa" }, { "SepalLength": 5.4, "SepalWidth": 3.4, "PetalLength": 1.7, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 5.1, "SepalWidth": 3.7, "PetalLength": 1.5, "PetalWidth": 0.4, "Species": "setosa" }, { "SepalLength": 4.6, "SepalWidth": 3.6, "PetalLength": 1, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 5.1, "SepalWidth": 3.3, "PetalLength": 1.7, "PetalWidth": 0.5, "Species": "setosa" }, { "SepalLength": 4.8, "SepalWidth": 3.4, "PetalLength": 1.9, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 5, "SepalWidth": 3, "PetalLength": 1.6, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 5, "SepalWidth": 3.4, "PetalLength": 1.6, "PetalWidth": 0.4, "Species": "setosa" }, { "SepalLength": 5.2, "SepalWidth": 3.5, "PetalLength": 1.5, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 5.2, "SepalWidth": 3.4, "PetalLength": 1.4, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 4.7, "SepalWidth": 3.2, "PetalLength": 1.6, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 4.8, "SepalWidth": 3.1, "PetalLength": 1.6, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 5.4, "SepalWidth": 3.4, "PetalLength": 1.5, "PetalWidth": 0.4, "Species": "setosa" }, { "SepalLength": 5.2, "SepalWidth": 4.1, "PetalLength": 1.5, "PetalWidth": 0.1, "Species": "setosa" }, { "SepalLength": 5.5, "SepalWidth": 4.2, "PetalLength": 1.4, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 4.9, "SepalWidth": 3.1, "PetalLength": 1.5, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 5, "SepalWidth": 3.2, "PetalLength": 1.2, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 5.5, "SepalWidth": 3.5, "PetalLength": 1.3, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 4.9, "SepalWidth": 3.6, "PetalLength": 1.4, "PetalWidth": 0.1, "Species": "setosa" }, { "SepalLength": 4.4, "SepalWidth": 3, "PetalLength": 1.3, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 5.1, "SepalWidth": 3.4, "PetalLength": 1.5, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 5, "SepalWidth": 3.5, "PetalLength": 1.3, "PetalWidth": 0.3, "Species": "setosa" }, { "SepalLength": 4.5, "SepalWidth": 2.3, "PetalLength": 1.3, "PetalWidth": 0.3, "Species": "setosa" }, { "SepalLength": 4.4, "SepalWidth": 3.2, "PetalLength": 1.3, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 5, "SepalWidth": 3.5, "PetalLength": 1.6, "PetalWidth": 0.6, "Species": "setosa" }, { "SepalLength": 5.1, "SepalWidth": 3.8, "PetalLength": 1.9, "PetalWidth": 0.4, "Species": "setosa" }, { "SepalLength": 4.8, "SepalWidth": 3, "PetalLength": 1.4, "PetalWidth": 0.3, "Species": "setosa" }, { "SepalLength": 5.1, "SepalWidth": 3.8, "PetalLength": 1.6, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 4.6, "SepalWidth": 3.2, "PetalLength": 1.4, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 5.3, "SepalWidth": 3.7, "PetalLength": 1.5, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 5, "SepalWidth": 3.3, "PetalLength": 1.4, "PetalWidth": 0.2, "Species": "setosa" }, { "SepalLength": 7, "SepalWidth": 3.2, "PetalLength": 4.7, "PetalWidth": 1.4, "Species": "versicolor" }, { "SepalLength": 6.4, "SepalWidth": 3.2, "PetalLength": 4.5, "PetalWidth": 1.5, "Species": "versicolor" }, { "SepalLength": 6.9, "SepalWidth": 3.1, "PetalLength": 4.9, "PetalWidth": 1.5, "Species": "versicolor" }, { "SepalLength": 5.5, "SepalWidth": 2.3, "PetalLength": 4, "PetalWidth": 1.3, "Species": "versicolor" }, { "SepalLength": 6.5, "SepalWidth": 2.8, "PetalLength": 4.6, "PetalWidth": 1.5, "Species": "versicolor" }, { "SepalLength": 5.7, "SepalWidth": 2.8, "PetalLength": 4.5, "PetalWidth": 1.3, "Species": "versicolor" }, { "SepalLength": 6.3, "SepalWidth": 3.3, "PetalLength": 4.7, "PetalWidth": 1.6, "Species": "versicolor" }, { "SepalLength": 4.9, "SepalWidth": 2.4, "PetalLength": 3.3, "PetalWidth": 1, "Species": "versicolor" }, { "SepalLength": 6.6, "SepalWidth": 2.9, "PetalLength": 4.6, "PetalWidth": 1.3, "Species": "versicolor" }, { "SepalLength": 5.2, "SepalWidth": 2.7, "PetalLength": 3.9, "PetalWidth": 1.4, "Species": "versicolor" }, { "SepalLength": 5, "SepalWidth": 2, "PetalLength": 3.5, "PetalWidth": 1, "Species": "versicolor" }, { "SepalLength": 5.9, "SepalWidth": 3, "PetalLength": 4.2, "PetalWidth": 1.5, "Species": "versicolor" }, { "SepalLength": 6, "SepalWidth": 2.2, "PetalLength": 4, "PetalWidth": 1, "Species": "versicolor" }, { "SepalLength": 6.1, "SepalWidth": 2.9, "PetalLength": 4.7, "PetalWidth": 1.4, "Species": "versicolor" }, { "SepalLength": 5.6, "SepalWidth": 2.9, "PetalLength": 3.6, "PetalWidth": 1.3, "Species": "versicolor" }, { "SepalLength": 6.7, "SepalWidth": 3.1, "PetalLength": 4.4, "PetalWidth": 1.4, "Species": "versicolor" }, { "SepalLength": 5.6, "SepalWidth": 3, "PetalLength": 4.5, "PetalWidth": 1.5, "Species": "versicolor" }, { "SepalLength": 5.8, "SepalWidth": 2.7, "PetalLength": 4.1, "PetalWidth": 1, "Species": "versicolor" }, { "SepalLength": 6.2, "SepalWidth": 2.2, "PetalLength": 4.5, "PetalWidth": 1.5, "Species": "versicolor" }, { "SepalLength": 5.6, "SepalWidth": 2.5, "PetalLength": 3.9, "PetalWidth": 1.1, "Species": "versicolor" }, { "SepalLength": 5.9, "SepalWidth": 3.2, "PetalLength": 4.8, "PetalWidth": 1.8, "Species": "versicolor" }, { "SepalLength": 6.1, "SepalWidth": 2.8, "PetalLength": 4, "PetalWidth": 1.3, "Species": "versicolor" }, { "SepalLength": 6.3, "SepalWidth": 2.5, "PetalLength": 4.9, "PetalWidth": 1.5, "Species": "versicolor" }, { "SepalLength": 6.1, "SepalWidth": 2.8, "PetalLength": 4.7, "PetalWidth": 1.2, "Species": "versicolor" }, { "SepalLength": 6.4, "SepalWidth": 2.9, "PetalLength": 4.3, "PetalWidth": 1.3, "Species": "versicolor" }, { "SepalLength": 6.6, "SepalWidth": 3, "PetalLength": 4.4, "PetalWidth": 1.4, "Species": "versicolor" }, { "SepalLength": 6.8, "SepalWidth": 2.8, "PetalLength": 4.8, "PetalWidth": 1.4, "Species": "versicolor" }, { "SepalLength": 6.7, "SepalWidth": 3, "PetalLength": 5, "PetalWidth": 1.7, "Species": "versicolor" }, { "SepalLength": 6, "SepalWidth": 2.9, "PetalLength": 4.5, "PetalWidth": 1.5, "Species": "versicolor" }, { "SepalLength": 5.7, "SepalWidth": 2.6, "PetalLength": 3.5, "PetalWidth": 1, "Species": "versicolor" }, { "SepalLength": 5.5, "SepalWidth": 2.4, "PetalLength": 3.8, "PetalWidth": 1.1, "Species": "versicolor" }, { "SepalLength": 5.5, "SepalWidth": 2.4, "PetalLength": 3.7, "PetalWidth": 1, "Species": "versicolor" }, { "SepalLength": 5.8, "SepalWidth": 2.7, "PetalLength": 3.9, "PetalWidth": 1.2, "Species": "versicolor" }, { "SepalLength": 6, "SepalWidth": 2.7, "PetalLength": 5.1, "PetalWidth": 1.6, "Species": "versicolor" }, { "SepalLength": 5.4, "SepalWidth": 3, "PetalLength": 4.5, "PetalWidth": 1.5, "Species": "versicolor" }, { "SepalLength": 6, "SepalWidth": 3.4, "PetalLength": 4.5, "PetalWidth": 1.6, "Species": "versicolor" }, { "SepalLength": 6.7, "SepalWidth": 3.1, "PetalLength": 4.7, "PetalWidth": 1.5, "Species": "versicolor" }, { "SepalLength": 6.3, "SepalWidth": 2.3, "PetalLength": 4.4, "PetalWidth": 1.3, "Species": "versicolor" }, { "SepalLength": 5.6, "SepalWidth": 3, "PetalLength": 4.1, "PetalWidth": 1.3, "Species": "versicolor" }, { "SepalLength": 5.5, "SepalWidth": 2.5, "PetalLength": 4, "PetalWidth": 1.3, "Species": "versicolor" }, { "SepalLength": 5.5, "SepalWidth": 2.6, "PetalLength": 4.4, "PetalWidth": 1.2, "Species": "versicolor" }, { "SepalLength": 6.1, "SepalWidth": 3, "PetalLength": 4.6, "PetalWidth": 1.4, "Species": "versicolor" }, { "SepalLength": 5.8, "SepalWidth": 2.6, "PetalLength": 4, "PetalWidth": 1.2, "Species": "versicolor" }, { "SepalLength": 5, "SepalWidth": 2.3, "PetalLength": 3.3, "PetalWidth": 1, "Species": "versicolor" }, { "SepalLength": 5.6, "SepalWidth": 2.7, "PetalLength": 4.2, "PetalWidth": 1.3, "Species": "versicolor" }, { "SepalLength": 5.7, "SepalWidth": 3, "PetalLength": 4.2, "PetalWidth": 1.2, "Species": "versicolor" }, { "SepalLength": 5.7, "SepalWidth": 2.9, "PetalLength": 4.2, "PetalWidth": 1.3, "Species": "versicolor" }, { "SepalLength": 6.2, "SepalWidth": 2.9, "PetalLength": 4.3, "PetalWidth": 1.3, "Species": "versicolor" }, { "SepalLength": 5.1, "SepalWidth": 2.5, "PetalLength": 3, "PetalWidth": 1.1, "Species": "versicolor" }, { "SepalLength": 5.7, "SepalWidth": 2.8, "PetalLength": 4.1, "PetalWidth": 1.3, "Species": "versicolor" }, { "SepalLength": 6.3, "SepalWidth": 3.3, "PetalLength": 6, "PetalWidth": 2.5, "Species": "virginica" }, { "SepalLength": 5.8, "SepalWidth": 2.7, "PetalLength": 5.1, "PetalWidth": 1.9, "Species": "virginica" }, { "SepalLength": 7.1, "SepalWidth": 3, "PetalLength": 5.9, "PetalWidth": 2.1, "Species": "virginica" }, { "SepalLength": 6.3, "SepalWidth": 2.9, "PetalLength": 5.6, "PetalWidth": 1.8, "Species": "virginica" }, { "SepalLength": 6.5, "SepalWidth": 3, "PetalLength": 5.8, "PetalWidth": 2.2, "Species": "virginica" }, { "SepalLength": 7.6, "SepalWidth": 3, "PetalLength": 6.6, "PetalWidth": 2.1, "Species": "virginica" }, { "SepalLength": 4.9, "SepalWidth": 2.5, "PetalLength": 4.5, "PetalWidth": 1.7, "Species": "virginica" }, { "SepalLength": 7.3, "SepalWidth": 2.9, "PetalLength": 6.3, "PetalWidth": 1.8, "Species": "virginica" }, { "SepalLength": 6.7, "SepalWidth": 2.5, "PetalLength": 5.8, "PetalWidth": 1.8, "Species": "virginica" }, { "SepalLength": 7.2, "SepalWidth": 3.6, "PetalLength": 6.1, "PetalWidth": 2.5, "Species": "virginica" }, { "SepalLength": 6.5, "SepalWidth": 3.2, "PetalLength": 5.1, "PetalWidth": 2, "Species": "virginica" }, { "SepalLength": 6.4, "SepalWidth": 2.7, "PetalLength": 5.3, "PetalWidth": 1.9, "Species": "virginica" }, { "SepalLength": 6.8, "SepalWidth": 3, "PetalLength": 5.5, "PetalWidth": 2.1, "Species": "virginica" }, { "SepalLength": 5.7, "SepalWidth": 2.5, "PetalLength": 5, "PetalWidth": 2, "Species": "virginica" }, { "SepalLength": 5.8, "SepalWidth": 2.8, "PetalLength": 5.1, "PetalWidth": 2.4, "Species": "virginica" }, { "SepalLength": 6.4, "SepalWidth": 3.2, "PetalLength": 5.3, "PetalWidth": 2.3, "Species": "virginica" }, { "SepalLength": 6.5, "SepalWidth": 3, "PetalLength": 5.5, "PetalWidth": 1.8, "Species": "virginica" }, { "SepalLength": 7.7, "SepalWidth": 3.8, "PetalLength": 6.7, "PetalWidth": 2.2, "Species": "virginica" }, { "SepalLength": 7.7, "SepalWidth": 2.6, "PetalLength": 6.9, "PetalWidth": 2.3, "Species": "virginica" }, { "SepalLength": 6, "SepalWidth": 2.2, "PetalLength": 5, "PetalWidth": 1.5, "Species": "virginica" }, { "SepalLength": 6.9, "SepalWidth": 3.2, "PetalLength": 5.7, "PetalWidth": 2.3, "Species": "virginica" }, { "SepalLength": 5.6, "SepalWidth": 2.8, "PetalLength": 4.9, "PetalWidth": 2, "Species": "virginica" }, { "SepalLength": 7.7, "SepalWidth": 2.8, "PetalLength": 6.7, "PetalWidth": 2, "Species": "virginica" }, { "SepalLength": 6.3, "SepalWidth": 2.7, "PetalLength": 4.9, "PetalWidth": 1.8, "Species": "virginica" }, { "SepalLength": 6.7, "SepalWidth": 3.3, "PetalLength": 5.7, "PetalWidth": 2.1, "Species": "virginica" }, { "SepalLength": 7.2, "SepalWidth": 3.2, "PetalLength": 6, "PetalWidth": 1.8, "Species": "virginica" }, { "SepalLength": 6.2, "SepalWidth": 2.8, "PetalLength": 4.8, "PetalWidth": 1.8, "Species": "virginica" }, { "SepalLength": 6.1, "SepalWidth": 3, "PetalLength": 4.9, "PetalWidth": 1.8, "Species": "virginica" }, { "SepalLength": 6.4, "SepalWidth": 2.8, "PetalLength": 5.6, "PetalWidth": 2.1, "Species": "virginica" }, { "SepalLength": 7.2, "SepalWidth": 3, "PetalLength": 5.8, "PetalWidth": 1.6, "Species": "virginica" }, { "SepalLength": 7.4, "SepalWidth": 2.8, "PetalLength": 6.1, "PetalWidth": 1.9, "Species": "virginica" }, { "SepalLength": 7.9, "SepalWidth": 3.8, "PetalLength": 6.4, "PetalWidth": 2, "Species": "virginica" }, { "SepalLength": 6.4, "SepalWidth": 2.8, "PetalLength": 5.6, "PetalWidth": 2.2, "Species": "virginica" }, { "SepalLength": 6.3, "SepalWidth": 2.8, "PetalLength": 5.1, "PetalWidth": 1.5, "Species": "virginica" }, { "SepalLength": 6.1, "SepalWidth": 2.6, "PetalLength": 5.6, "PetalWidth": 1.4, "Species": "virginica" }, { "SepalLength": 7.7, "SepalWidth": 3, "PetalLength": 6.1, "PetalWidth": 2.3, "Species": "virginica" }, { "SepalLength": 6.3, "SepalWidth": 3.4, "PetalLength": 5.6, "PetalWidth": 2.4, "Species": "virginica" }, { "SepalLength": 6.4, "SepalWidth": 3.1, "PetalLength": 5.5, "PetalWidth": 1.8, "Species": "virginica" }, { "SepalLength": 6, "SepalWidth": 3, "PetalLength": 4.8, "PetalWidth": 1.8, "Species": "virginica" }, { "SepalLength": 6.9, "SepalWidth": 3.1, "PetalLength": 5.4, "PetalWidth": 2.1, "Species": "virginica" }, { "SepalLength": 6.7, "SepalWidth": 3.1, "PetalLength": 5.6, "PetalWidth": 2.4, "Species": "virginica" }, { "SepalLength": 6.9, "SepalWidth": 3.1, "PetalLength": 5.1, "PetalWidth": 2.3, "Species": "virginica" }, { "SepalLength": 5.8, "SepalWidth": 2.7, "PetalLength": 5.1, "PetalWidth": 1.9, "Species": "virginica" }, { "SepalLength": 6.8, "SepalWidth": 3.2, "PetalLength": 5.9, "PetalWidth": 2.3, "Species": "virginica" }, { "SepalLength": 6.7, "SepalWidth": 3.3, "PetalLength": 5.7, "PetalWidth": 2.5, "Species": "virginica" }, { "SepalLength": 6.7, "SepalWidth": 3, "PetalLength": 5.2, "PetalWidth": 2.3, "Species": "virginica" }, { "SepalLength": 6.3, "SepalWidth": 2.5, "PetalLength": 5, "PetalWidth": 1.9, "Species": "virginica" }, { "SepalLength": 6.5, "SepalWidth": 3, "PetalLength": 5.2, "PetalWidth": 2, "Species": "virginica" }, { "SepalLength": 6.2, "SepalWidth": 3.4, "PetalLength": 5.4, "PetalWidth": 2.3, "Species": "virginica" }, { "SepalLength": 5.9, "SepalWidth": 3, "PetalLength": 5.1, "PetalWidth": 1.8, "Species": "virginica" } ] if(!(opts.type==="pieChart" || opts.type==="sparklinePlus" || opts.type==="bulletChart")) { var data = d3.nest() .key(function(d){ //return opts.group === undefined ? 'main' : d[opts.group] //instead of main would think a better default is opts.x return opts.group === undefined ? opts.y : d[opts.group]; }) .entries(data); } if (opts.disabled != undefined){ data.map(function(d, i){ d.disabled = opts.disabled[i] }) } nv.addGraph(function() { var chart = nv.models[opts.type]() .width(opts.width) .height(opts.height) if (opts.type != "bulletChart"){ chart .x(function(d) { return d[opts.x] }) .y(function(d) { return d[opts.y] }) } chart.xAxis .axisLabel("Sepal Length") chart.yAxis .axisLabel("Sepal Width") d3.select("#" + opts.id) .append('svg') .datum(data) .transition().duration(500) .call(chart); nv.utils.windowResize(chart.update); return chart; }); }; </script> <script></script> </body> </html>