{"report_id":"44cc004c-ef4b-4e37-936f-fe25e9f9bc4c","version":0,"status":"done","tags":[],"date":"2026-07-27T15:47:12Z","url":{"schema":"https","addr":"store.workshopscommunityratemods.com/sharedfiles/filesdetails/id=35225482502/","fqdn":"store.workshopscommunityratemods.com","domain":"workshopscommunityratemods.com","tld":"com"},"ip":{"addr":"104.21.56.216","port":0,"asn":13335,"as":"CLOUDFLARENET","country":"","country_code":"zz"},"final":{"url":{"schema":"https","addr":"store.workshopscommunityratemods.com/sharedfiles/filesdetails/id=35225482502/","fqdn":"store.workshopscommunityratemods.com","domain":"workshopscommunityratemods.com","tld":"com"},"title":"Steam Workshop::Helmet Utility Device","dom":{"size":5900266,"mime_type":"text/html; charset=utf-8","magic":"JavaScript source, ASCII text","md5":"a39f953975f9feaa8eb0c3aa8124cd57","sha1":"4bc1845fcb9df57afe02d50ee267df8a10a481b4","sha256":"2692b2a3a4cda992f843c09611d6e843986bddaf2544cd7eef1f7f267e58bf8a","sha512":"319703703632068f13a833a38ae254c23fb03e5093102d64b47ae44b6b37016fde79269c88f7a8f70b12d6ec69886ddf2504a59d8d96967959e13928b594c968","ssdeep":"49152:WrF+aVrSYVHcr0DSy8Mnwsi4P+grq1Xia0rBCLEwoCDKI4IH4mdLPqEbRHYY+3/9:vVno","tlshash":"13569db177daf88267671095023a2546ff3c4877b80c89e0f68ca4a437d85cd977af68","dom_hash":"domhash5e267ed8598ab2530c491d016df42444","first_seen":"","last_seen":"","times_seen":0,"resource_available":false,"data":null}},"submit":{"url":{"schema":"https","addr":"store.workshopscommunityratemods.com/sharedfiles/filesdetails/id=35225482502/","fqdn":"store.workshopscommunityratemods.com","domain":"workshopscommunityratemods.com","tld":"com"},"ip":{"addr":"104.21.56.216","port":0,"asn":13335,"as":"CLOUDFLARENET","country":"","country_code":"zz"},"tags":null,"meta":null},"settings":{"access":"public","device_type":"desktop","expires_at":"2027-08-31T15:47:12Z","useragent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0","referer":"","cookies":null,"exit_node":"qguvgzjxzsgb3vs"},"stats":{"alert_count":{"ids":0,"urlquery":0,"analyzer":0}},"detection":{"ids":null,"analyzer":null,"urlquery":null},"summary":[{"fqdn":"store.workshopscommunityratemods.com","ip":{"addr":"172.67.156.9","port":443,"asn":13335,"as":"CLOUDFLARENET","country":"","country_code":"zz"},"domain_registered":"2026-07-26","domain_rank":0,"first_seen":"2026-07-27T15:42:43.612193Z","last_seen":"2026-07-27T15:42:43.612193Z","alert_count":0,"request_count":1,"received_data":5928700,"sent_data":545,"comment":"","tags":null,"fingerprints":[{"name":"Cloudflare","description":"Cloudflare is a web-infrastructure and website-security company, providing content-delivery-network services, DDoS mitigation, Internet security, and distributed domain-name-server services.","website":"https://www.cloudflare.com","common_platform_enumeration":"","icon":"CloudFlare.svg","categories":["CDN"]}]}],"files":null,"artifacts":{"windows_shortcuts":null,"files":null,"telegram":null,"pdfs":null,"clipboard":null},"sensors":{"ids":null,"analyzer":null,"urlquery":null},"javascript":{"script":null,"eval":null,"write":null,"console":null},"http":[{"url":{"schema":"https","addr":"store.workshopscommunityratemods.com/sharedfiles/filesdetails/id=35225482502/","fqdn":"store.workshopscommunityratemods.com","domain":"workshopscommunityratemods.com","tld":"com"},"ip":{"addr":"172.67.156.9","port":443,"asn":13335,"as":"CLOUDFLARENET","country":"","country_code":"zz"},"is_navigation_request":true,"resource_type":"document","requested_by":"","date":"2026-07-27T15:46:34.964Z","timestamp":1785167194964,"http_version":"HTTP/2","security_state":"secure","security_info":{"cipher_suite":"TLS_AES_128_GCM_SHA256","key_group_name":"mlkem768x25519","signature_name":"ECDSA-P256-SHA256","protocol":"TLSv1.3","cert":{"subject":{"commonName":"workshopscommunityratemods.com","organization":""},"issuer":{"commonName":"WE1","organization":"Google Trust Services"},"validity":{"start":"Sun, 26 Jul 2026 08:15:05 GMT","end":"Sat, 24 Oct 2026 09:13:51 GMT"},"fingerprint":{"sha1":"98:65:11:8F:9E:30:C5:AF:28:46:88:64:40:35:2E:EF:DB:22:29:94","sha256":"FB:F0:5D:3A:A9:F4:DF:29:3B:6F:E1:34:3C:96:3F:13:9F:C3:55:47:BE:D4:18:E9:78:E7:BE:59:7E:4C:88:4C"}}},"request":{"raw":"GET /sharedfiles/filesdetails/id=35225482502/ HTTP/1.1\r\nHost: store.workshopscommunityratemods.com\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:134.0) Gecko/20100101 Firefox/134.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.9\r\nAccept-Encoding: gzip, deflate, br, zstd\r\nSec-GPC: 1\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nSec-Fetch-Dest: document\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-Site: none\r\nPriority: u=0, i\r\nPragma: no-cache\r\nCache-Control: no-cache\r\n\r\n","headers":null,"cookies":null,"method":"GET"},"response":{"raw":"HTTP/2 200 \r\ndate: Mon, 27 Jul 2026 15:46:35 GMT\r\ncontent-type: text/html\r\nserver: cloudflare\r\nnel: {\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}\r\nlast-modified: Mon, 27 Jul 2026 10:32:21 GMT\r\nvary: Accept-Encoding\r\nreport-to: {\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=KSII1V7D9qWdUtlllGCkkKzvA%2B5yELndlweAO%2BWtuLB0X1u4wZA%2FwCmwwgbnOLgHlr9SQfWnlmLkkhWQ4AdZ83%2BwPx5%2BBgFBGa5L87sNKUkEkr5VP34cox6TmzoRHgsMhbuFS4EoCYsrvjYSVL50gQLV%2BR8AHTk%3D\"}]}\r\ncf-cache-status: DYNAMIC\r\ncontent-encoding: zstd\r\ncf-ray: a21cc718ac5fc759-OSL\r\nX-Firefox-Spdy: h2\r\n\r\n","headers":null,"cookies":null,"status_code":"200","status_text":"","fingerprints":[{"name":"Cloudflare","description":"Cloudflare is a web-infrastructure and website-security company, providing content-delivery-network services, DDoS mitigation, Internet security, and distributed domain-name-server services.","website":"https://www.cloudflare.com","common_platform_enumeration":"","icon":"CloudFlare.svg","categories":["CDN"]}],"data":{"size":5928077,"size_decoded":1423531,"mime_type":"text/html","magic":"HTML document, ASCII text, with CRLF line terminators","md5":"6227a828091e248cbc8ade3ed6077356","sha1":"c12870320c456aa1d496637b0e29e07833bffc78","sha256":"3a879e4575bb720e1d062e00920e531059fd1b2fd8f5092e093ea45098cd8a0c","sha512":"e3e00e00bb191d3390fccb51b52691b14c8bef20de999ddf8f676f478558b530adbdf6ffd8965ff1f801186583903d643041542dd500ac6e76b2900d2c81b1a7","ssdeep":"24576:lv8WPjqFD8McGpWFPpFF+lWfz5pr9Brur94oxMcor/Wb:lv8WPjqFD8McGpyPpFF+lo5p9Brud","tlshash":"a12529f5364b716a86b73329993b0908fe3d8027610495a8b99c44d46ff0d1897beefc","first_seen":"2026-07-27T15:47:16.528857Z","last_seen":"2026-07-27T15:48:19.916896Z","times_seen":2,"resource_available":false,"data":"PCFET0NUWVBFIGh0bWw+DQoNCjxodG1sIGNsYXNzPSJyZXNwb25zaXZlIERlc2t0b3BVSSIgbGFuZz0iZW4iPg0KPGhlYWQ+PGJhc2UgaHJlZj0iaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20iLz4NCjxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIi8+DQo8bWV0YSBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIiBuYW1lPSJ2aWV3cG9ydCIvPg0KPG1ldGEgY29udGVudD0iIzE3MWEyMSIgbmFtZT0idGhlbWUtY29sb3IiLz4NCjx0aXRsZT5TdGVhbSBXb3Jrc2hvcDo6SGVsbWV0IFV0aWxpdHkgRGV2aWNlPC90aXRsZT4NCjxsaW5rIGhyZWY9Imh0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL2Zhdmljb24uaWNvIiByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIvPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KICAgICAgICB2YXIgX19Qcm90b3R5cGVQcmVzZXJ2ZSA9IFtdOw0KICAgICAgICBfX1Byb3RvdHlwZVByZXNlcnZlWzBdID0gQXJyYXkuZnJvbTsNCiAgICAgICAgX19Qcm90b3R5cGVQcmVzZXJ2ZVsxXSA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXI7DQogICAgICAgIF9fUHJvdG90eXBlUHJlc2VydmVbMl0gPSBBcnJheS5wcm90b3R5cGUuZmxhdE1hcDsNCiAgICAgICAgX19Qcm90b3R5cGVQcmVzZXJ2ZVszXSA9IEFycmF5LnByb3RvdHlwZS5maW5kOw0KICAgICAgICBfX1Byb3RvdHlwZVByZXNlcnZlWzRdID0gQXJyYXkucHJvdG90eXBlLnNvbWU7DQogICAgICAgIF9fUHJvdG90eXBlUHJlc2VydmVbNV0gPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZDsNCiAgICAgICAgX19Qcm90b3R5cGVQcmVzZXJ2ZVs2XSA9IEhUTUxFbGVtZW50LnByb3RvdHlwZS5zY3JvbGxUbzsNCiAgICA8L3NjcmlwdD4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCi8qICBQcm90b3R5cGUgSmF2YVNjcmlwdCBmcmFtZXdvcmssIHZlcnNpb24gMS43DQogKiAgKGMpIDIwMDUtMjAxMCBTYW0gU3RlcGhlbnNvbg0KICoNCiAqICBQcm90b3R5cGUgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFuIE1JVC1zdHlsZSBsaWNlbnNlLg0KICogIEZvciBkZXRhaWxzLCBzZWUgdGhlIFByb3RvdHlwZSB3ZWIgc2l0ZTogaHR0cDovL3d3dy5wcm90b3R5cGVqcy5vcmcvDQogKg0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnZhciBQcm90b3R5cGUgPSB7DQoNCiAgVmVyc2lvbjogJzEuNycsDQoNCiAgQnJvd3NlcjogKGZ1bmN0aW9uKCl7DQogICAgdmFyIHVhID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsNCiAgICB2YXIgaXNPcGVyYSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3aW5kb3cub3BlcmEpID09ICdbb2JqZWN0IE9wZXJhXSc7DQogICAgcmV0dXJuIHsNCiAgICAgIElFOiAgICAgICAgICAgICAhIXdpbmRvdy5hdHRhY2hFdmVudCAmJiAhaXNPcGVyYSwNCiAgICAgIE9wZXJhOiAgICAgICAgICBpc09wZXJhLA0KICAgICAgV2ViS2l0OiAgICAgICAgIHVhLmluZGV4T2YoJ0FwcGxlV2ViS2l0LycpID4gLTEsDQogICAgICBHZWNrbzogICAgICAgICAgdWEuaW5kZXhPZignR2Vja28nKSA+IC0xICYmIHVhLmluZGV4T2YoJ0tIVE1MJykgPT09IC0xLA0KICAgICAgTW9iaWxlU2FmYXJpOiAgIC9BcHBsZS4qTW9iaWxlLy50ZXN0KHVhKQ0KICAgIH0NCiAgfSkoKSwNCg0KICBCcm93c2VyRmVhdHVyZXM6IHsNCiAgICBYUGF0aDogISFkb2N1bWVudC5ldmFsdWF0ZSwNCg0KICAgIFNlbGVjdG9yc0FQSTogISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yLA0KDQogICAgRWxlbWVudEV4dGVuc2lvbnM6IChmdW5jdGlvbigpIHsNCiAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHdpbmRvdy5FbGVtZW50IHx8IHdpbmRvdy5IVE1MRWxlbWVudDsNCiAgICAgIHJldHVybiAhIShjb25zdHJ1Y3RvciAmJiBjb25zdHJ1Y3Rvci5wcm90b3R5cGUpOw0KICAgIH0pKCksDQogICAgU3BlY2lmaWNFbGVtZW50RXh0ZW5zaW9uczogKGZ1bmN0aW9uKCkgew0KICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuSFRNTERpdkVsZW1lbnQgIT09ICd1bmRlZmluZWQnKQ0KICAgICAgICByZXR1cm4gdHJ1ZTsNCg0KICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLA0KICAgICAgICAgIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyksDQogICAgICAgICAgaXNTdXBwb3J0ZWQgPSBmYWxzZTsNCg0KICAgICAgaWYgKGRpdlsnX19wcm90b19fJ10gJiYgKGRpdlsnX19wcm90b19fJ10gIT09IGZvcm1bJ19fcHJvdG9fXyddKSkgew0KICAgICAgICBpc1N1cHBvcnRlZCA9IHRydWU7DQogICAgICB9DQoNCiAgICAgIGRpdiA9IGZvcm0gPSBudWxsOw0KDQogICAgICByZXR1cm4gaXNTdXBwb3J0ZWQ7DQogICAgfSkoKQ0KICB9LA0KDQogIFNjcmlwdEZyYWdtZW50OiAnPHNjcmlwdFtePl0qPihbXFxTXFxzXSo/KTxcL3NjcmlwdD4nLA0KICBKU09ORmlsdGVyOiAvXlwvXCotc2VjdXJlLShbXHNcU10qKVwqXC9ccyokLywNCg0KICBlbXB0eUZ1bmN0aW9uOiBmdW5jdGlvbigpIHsgfSwNCg0KICBLOiBmdW5jdGlvbih4KSB7IHJldHVybiB4IH0NCn07DQoNCmlmIChQcm90b3R5cGUuQnJvd3Nlci5Nb2JpbGVTYWZhcmkpDQogIFByb3RvdHlwZS5Ccm93c2VyRmVhdHVyZXMuU3BlY2lmaWNFbGVtZW50RXh0ZW5zaW9ucyA9IGZhbHNlOw0KDQoNCnZhciBBYnN0cmFjdCA9IHsgfTsNCg0KDQp2YXIgVHJ5ID0gew0KICB0aGVzZTogZnVuY3Rpb24oKSB7DQogICAgdmFyIHJldHVyblZhbHVlOw0KDQogICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgdmFyIGxhbWJkYSA9IGFyZ3VtZW50c1tpXTsNCiAgICAgIHRyeSB7DQogICAgICAgIHJldHVyblZhbHVlID0gbGFtYmRhKCk7DQogICAgICAgIGJyZWFrOw0KICAgICAgfSBjYXRjaCAoZSkgeyB9DQogICAgfQ0KDQogICAgcmV0dXJuIHJldHVyblZhbHVlOw0KICB9DQp9Ow0KDQovKiBCYXNlZCBvbiBBbGV4IEFybmVsbCdzIGluaGVyaXRhbmNlIGltcGxlbWVudGF0aW9uLiAqLw0KDQp2YXIgQ2xhc3MgPSAoZnVuY3Rpb24oKSB7DQoNCiAgdmFyIElTX0RPTlRFTlVNX0JVR0dZID0gKGZ1bmN0aW9uKCl7DQogICAgZm9yICh2YXIgcCBpbiB7IHRvU3RyaW5nOiAxIH0pIHsNCiAgICAgIGlmIChwID09PSAndG9TdHJpbmcnKSByZXR1cm4gZmFsc2U7DQogICAgfQ0KICAgIHJldHVybiB0cnVlOw0KICB9KSgpOw0KDQogIGZ1bmN0aW9uIHN1YmNsYXNzKCkge307DQogIGZ1bmN0aW9uIGNyZWF0ZSgpIHsNCiAgICB2YXIgcGFyZW50ID0gbnVsbCwgcHJvcGVydGllcyA9ICRBKGFyZ3VtZW50cyk7DQogICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKHByb3BlcnRpZXNbMF0pKQ0KICAgICAgcGFyZW50ID0gcHJvcGVydGllcy5zaGlmdCgpOw0KDQogICAgZnVuY3Rpb24ga2xhc3MoKSB7DQogICAgICB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICB9DQoNCiAgICBPYmplY3QuZXh0ZW5kKGtsYXNzLCBDbGFzcy5NZXRob2RzKTsNCiAgICBrbGFzcy5zdXBlcmNsYXNzID0gcGFyZW50Ow0KICAgIGtsYXNzLnN1YmNsYXNzZXMgPSBbXTsNCg0KICAgIGlmIChwYXJlbnQpIHsNCiAgICAgIHN1YmNsYXNzLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7DQogICAgICBrbGFzcy5wcm90b3R5cGUgPSBuZXcgc3ViY2xhc3M7DQogICAgICBwYXJlbnQuc3ViY2xhc3Nlcy5wdXNoKGtsYXNzKTsNCiAgICB9DQoNCiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gcHJvcGVydGllcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykNCiAgICAgIGtsYXNzLmFkZE1ldGhvZHMocHJvcGVydGllc1tpXSk7DQoNCiAgICBpZiAoIWtsYXNzLnByb3RvdHlwZS5pbml0aWFsaXplKQ0KICAgICAga2xhc3MucHJvdG90eXBlLmluaXRpYWxpemUgPSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsNCg0KICAgIGtsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGtsYXNzOw0KICAgIHJldHVybiBrbGFzczsNCiAgfQ0KDQogIGZ1bmN0aW9uIGFkZE1ldGhvZHMoc291cmNlKSB7DQogICAgdmFyIGFuY2VzdG9yICAgPSB0aGlzLnN1cGVyY2xhc3MgJiYgdGhpcy5zdXBlcmNsYXNzLnByb3RvdHlwZSwNCiAgICAgICAgcHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7DQoNCiAgICBpZiAoSVNfRE9OVEVOVU1fQlVHR1kpIHsNCiAgICAgIGlmIChzb3VyY2UudG9TdHJpbmcgIT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykNCiAgICAgICAgcHJvcGVydGllcy5wdXNoKCJ0b1N0cmluZyIpOw0KICAgICAgaWYgKHNvdXJjZS52YWx1ZU9mICE9IE9iamVjdC5wcm90b3R5cGUudmFsdWVPZikNCiAgICAgICAgcHJvcGVydGllcy5wdXNoKCJ2YWx1ZU9mIik7DQogICAgfQ0KDQogICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgIHZhciBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV0sIHZhbHVlID0gc291cmNlW3Byb3BlcnR5XTsNCiAgICAgIGlmIChhbmNlc3RvciAmJiBPYmplY3QuaXNGdW5jdGlvbih2YWx1ZSkgJiYNCiAgICAgICAgICB2YWx1ZS5hcmd1bWVudE5hbWVzKClbMF0gPT0gIiRzdXBlciIpIHsNCiAgICAgICAgdmFyIG1ldGhvZCA9IHZhbHVlOw0KICAgICAgICB2YWx1ZSA9IChmdW5jdGlvbihtKSB7DQogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gYW5jZXN0b3JbbV0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfTsNCiAgICAgICAgfSkocHJvcGVydHkpLndyYXAobWV0aG9kKTsNCg0KICAgICAgICB2YWx1ZS52YWx1ZU9mID0gbWV0aG9kLnZhbHVlT2YuYmluZChtZXRob2QpOw0KICAgICAgICB2YWx1ZS50b1N0cmluZyA9IG1ldGhvZC50b1N0cmluZy5iaW5kKG1ldGhvZCk7DQogICAgICB9DQogICAgICB0aGlzLnByb3RvdHlwZVtwcm9wZXJ0eV0gPSB2YWx1ZTsNCiAgICB9DQoNCiAgICByZXR1cm4gdGhpczsNCiAgfQ0KDQogIHJldHVybiB7DQogICAgY3JlYXRlOiBjcmVhdGUsDQogICAgTWV0aG9kczogew0KICAgICAgYWRkTWV0aG9kczogYWRkTWV0aG9kcw0KICAgIH0NCiAgfTsNCn0pKCk7DQooZnVuY3Rpb24oKSB7DQoNCiAgdmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsDQogICAgICBOVUxMX1RZUEUgPSAnTnVsbCcsDQogICAgICBVTkRFRklORURfVFlQRSA9ICdVbmRlZmluZWQnLA0KICAgICAgQk9PTEVBTl9UWVBFID0gJ0Jvb2xlYW4nLA0KICAgICAgTlVNQkVSX1RZUEUgPSAnTnVtYmVyJywNCiAgICAgIFNUUklOR19UWVBFID0gJ1N0cmluZycsDQogICAgICBPQkpFQ1RfVFlQRSA9ICdPYmplY3QnLA0KICAgICAgRlVOQ1RJT05fQ0xBU1MgPSAnW29iamVjdCBGdW5jdGlvbl0nLA0KICAgICAgQk9PTEVBTl9DTEFTUyA9ICdbb2JqZWN0IEJvb2xlYW5dJywNCiAgICAgIE5VTUJFUl9DTEFTUyA9ICdbb2JqZWN0IE51bWJlcl0nLA0KICAgICAgU1RSSU5HX0NMQVNTID0gJ1tvYmplY3QgU3RyaW5nXScsDQogICAgICBBUlJBWV9DTEFTUyA9ICdbb2JqZWN0IEFycmF5XScsDQogICAgICBEQVRFX0NMQVNTID0gJ1tvYmplY3QgRGF0ZV0nLA0KICAgICAgTkFUSVZFX0pTT05fU1RSSU5HSUZZX1NVUFBPUlQgPSB3aW5kb3cuSlNPTiAmJg0KICAgICAgICB0eXBlb2YgSlNPTi5zdHJpbmdpZnkgPT09ICdmdW5jdGlvbicgJiYNCiAgICAgICAgSlNPTi5zdHJpbmdpZnkoMCkgPT09ICcwJyAmJg0KICAgICAgICB0eXBlb2YgSlNPTi5zdHJpbmdpZnkoUHJvdG90eXBlLkspID09PSAndW5kZWZpbmVkJzsNCg0KICBmdW5jdGlvbiBUeXBlKG8pIHsNCiAgICBzd2l0Y2gobykgew0KICAgICAgY2FzZSBudWxsOiByZXR1cm4gTlVMTF9UWVBFOw0KICAgICAgY2FzZSAodm9pZCAwKTogcmV0dXJuIFVOREVGSU5FRF9UWVBFOw0KICAgIH0NCiAgICB2YXIgdHlwZSA9IHR5cGVvZiBvOw0KICAgIHN3aXRjaCh0eXBlKSB7DQogICAgICBjYXNlICdib29sZWFuJzogcmV0dXJuIEJPT0xFQU5fVFlQRTsNCiAgICAgIGNhc2UgJ251bWJlcic6ICByZXR1cm4gTlVNQkVSX1RZUEU7DQogICAgICBjYXNlICdzdHJpbmcnOiAgcmV0dXJuIFNUUklOR19UWVBFOw0KICAgIH0NCiAgICByZXR1cm4gT0JKRUNUX1RZUEU7DQogIH0NCg0KICBmdW5jdGlvbiBleHRlbmQoZGVzdGluYXRpb24sIHNvdXJjZSkgew0KICAgIGZvciAodmFyIHByb3BlcnR5IGluIHNvdXJjZSkNCiAgICAgIGRlc3RpbmF0aW9uW3Byb3BlcnR5XSA9IHNvdXJjZVtwcm9wZXJ0eV07DQogICAgcmV0dXJuIGRlc3RpbmF0aW9uOw0KICB9DQoNCiAgZnVuY3Rpb24gaW5zcGVjdChvYmplY3QpIHsNCiAgICB0cnkgew0KICAgICAgaWYgKGlzVW5kZWZpbmVkKG9iamVjdCkpIHJldHVybiAndW5kZWZpbmVkJzsNCiAgICAgIGlmIChvYmplY3QgPT09IG51bGwpIHJldHVybiAnbnVsbCc7DQogICAgICByZXR1cm4gb2JqZWN0Lmluc3BlY3QgPyBvYmplY3QuaW5zcGVjdCgpIDogU3RyaW5nKG9iamVjdCk7DQogICAgfSBjYXRjaCAoZSkgew0KICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSByZXR1cm4gJy4uLic7DQogICAgICB0aHJvdyBlOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHRvSlNPTih2YWx1ZSkgew0KICAgIHJldHVybiBTdHIoJycsIHsgJyc6IHZhbHVlIH0sIFtdKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIFN0cihrZXksIGhvbGRlciwgc3RhY2spIHsNCiAgICB2YXIgdmFsdWUgPSBob2xkZXJba2V5XSwNCiAgICAgICAgdHlwZSA9IHR5cGVvZiB2YWx1ZTsNCg0KICAgIGlmIChUeXBlKHZhbHVlKSA9PT0gT0JKRUNUX1RZUEUgJiYgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykgew0KICAgICAgdmFsdWUgPSB2YWx1ZS50b0pTT04oa2V5KTsNCiAgICB9DQoNCiAgICB2YXIgX2NsYXNzID0gX3RvU3RyaW5nLmNhbGwodmFsdWUpOw0KDQogICAgc3dpdGNoIChfY2xhc3MpIHsNCiAgICAgIGNhc2UgTlVNQkVSX0NMQVNTOg0KICAgICAgY2FzZSBCT09MRUFOX0NMQVNTOg0KICAgICAgY2FzZSBTVFJJTkdfQ0xBU1M6DQogICAgICAgIHZhbHVlID0gdmFsdWUudmFsdWVPZigpOw0KICAgIH0NCg0KICAgIHN3aXRjaCAodmFsdWUpIHsNCiAgICAgIGNhc2UgbnVsbDogcmV0dXJuICdudWxsJzsNCiAgICAgIGNhc2UgdHJ1ZTogcmV0dXJuICd0cnVlJzsNCiAgICAgIGNhc2UgZmFsc2U6IHJldHVybiAnZmFsc2UnOw0KICAgIH0NCg0KICAgIHR5cGUgPSB0eXBlb2YgdmFsdWU7DQogICAgc3dpdGNoICh0eXBlKSB7DQogICAgICBjYXNlICdzdHJpbmcnOg0KICAgICAgICByZXR1cm4gdmFsdWUuaW5zcGVjdCh0cnVlKTsNCiAgICAgIGNhc2UgJ251bWJlcic6DQogICAgICAgIHJldHVybiBpc0Zpbml0ZSh2YWx1ZSkgPyBTdHJpbmcodmFsdWUpIDogJ251bGwnOw0KICAgICAgY2FzZSAnb2JqZWN0JzoNCg0KICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gc3RhY2subGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICBpZiAoc3RhY2tbaV0gPT09IHZhbHVlKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoKTsgfQ0KICAgICAgICB9DQogICAgICAgIHN0YWNrLnB1c2godmFsdWUpOw0KDQogICAgICAgIHZhciBwYXJ0aWFsID0gW107DQogICAgICAgIGlmIChfY2xhc3MgPT09IEFSUkFZX0NMQVNTKSB7DQogICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHZhbHVlLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB2YXIgc3RyID0gU3RyKGksIHZhbHVlLCBzdGFjayk7DQogICAgICAgICAgICBwYXJ0aWFsLnB1c2godHlwZW9mIHN0ciA9PT0gJ3VuZGVmaW5lZCcgPyAnbnVsbCcgOiBzdHIpOw0KICAgICAgICAgIH0NCiAgICAgICAgICBwYXJ0aWFsID0gJ1snICsgcGFydGlhbC5qb2luKCcsJykgKyAnXSc7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7DQogICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldLCBzdHIgPSBTdHIoa2V5LCB2YWx1ZSwgc3RhY2spOw0KICAgICAgICAgICAgaWYgKHR5cGVvZiBzdHIgIT09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICAgICBwYXJ0aWFsLnB1c2goa2V5Lmluc3BlY3QodHJ1ZSkrICc6JyArIHN0cik7DQogICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICBwYXJ0aWFsID0gJ3snICsgcGFydGlhbC5qb2luKCcsJykgKyAnfSc7DQogICAgICAgIH0NCiAgICAgICAgc3RhY2sucG9wKCk7DQogICAgICAgIHJldHVybiBwYXJ0aWFsOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHN0cmluZ2lmeShvYmplY3QpIHsNCiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqZWN0KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHRvUXVlcnlTdHJpbmcob2JqZWN0KSB7DQogICAgcmV0dXJuICRIKG9iamVjdCkudG9RdWVyeVN0cmluZygpOw0KICB9DQoNCiAgZnVuY3Rpb24gdG9IVE1MKG9iamVjdCkgew0KICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0LnRvSFRNTCA/IG9iamVjdC50b0hUTUwoKSA6IFN0cmluZy5pbnRlcnByZXQob2JqZWN0KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7DQogICAgaWYgKFR5cGUob2JqZWN0KSAhPT0gT0JKRUNUX1RZUEUpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyB9DQogICAgdmFyIHJlc3VsdHMgPSBbXTsNCiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBvYmplY3QpIHsNCiAgICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7DQogICAgICAgIHJlc3VsdHMucHVzaChwcm9wZXJ0eSk7DQogICAgICB9DQogICAgfQ0KICAgIHJldHVybiByZXN1bHRzOw0KICB9DQoNCiAgZnVuY3Rpb24gdmFsdWVzKG9iamVjdCkgew0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gb2JqZWN0KQ0KICAgICAgcmVzdWx0cy5wdXNoKG9iamVjdFtwcm9wZXJ0eV0pOw0KICAgIHJldHVybiByZXN1bHRzOw0KICB9DQoNCiAgZnVuY3Rpb24gY2xvbmUob2JqZWN0KSB7DQogICAgcmV0dXJuIGV4dGVuZCh7IH0sIG9iamVjdCk7DQogIH0NCg0KICBmdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7DQogICAgcmV0dXJuICEhKG9iamVjdCAmJiBvYmplY3Qubm9kZVR5cGUgPT0gMSk7DQogIH0NCg0KICBmdW5jdGlvbiBpc0FycmF5KG9iamVjdCkgew0KICAgIHJldHVybiBfdG9TdHJpbmcuY2FsbChvYmplY3QpID09PSBBUlJBWV9DTEFTUzsNCiAgfQ0KDQogIHZhciBoYXNOYXRpdmVJc0FycmF5ID0gKHR5cGVvZiBBcnJheS5pc0FycmF5ID09ICdmdW5jdGlvbicpDQogICAgJiYgQXJyYXkuaXNBcnJheShbXSkgJiYgIUFycmF5LmlzQXJyYXkoe30pOw0KDQogIGlmIChoYXNOYXRpdmVJc0FycmF5KSB7DQogICAgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7DQogIH0NCg0KICBmdW5jdGlvbiBpc0hhc2gob2JqZWN0KSB7DQogICAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIEhhc2g7DQogIH0NCg0KICBmdW5jdGlvbiBpc0Z1bmN0aW9uKG9iamVjdCkgew0KICAgIHJldHVybiBfdG9TdHJpbmcuY2FsbChvYmplY3QpID09PSBGVU5DVElPTl9DTEFTUzsNCiAgfQ0KDQogIGZ1bmN0aW9uIGlzU3RyaW5nKG9iamVjdCkgew0KICAgIHJldHVybiBfdG9TdHJpbmcuY2FsbChvYmplY3QpID09PSBTVFJJTkdfQ0xBU1M7DQogIH0NCg0KICBmdW5jdGlvbiBpc051bWJlcihvYmplY3QpIHsNCiAgICByZXR1cm4gX3RvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gTlVNQkVSX0NMQVNTOw0KICB9DQoNCiAgZnVuY3Rpb24gaXNEYXRlKG9iamVjdCkgew0KICAgIHJldHVybiBfdG9TdHJpbmcuY2FsbChvYmplY3QpID09PSBEQVRFX0NMQVNTOw0KICB9DQoNCiAgZnVuY3Rpb24gaXNVbmRlZmluZWQob2JqZWN0KSB7DQogICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICJ1bmRlZmluZWQiOw0KICB9DQoNCiAgZXh0ZW5kKE9iamVjdCwgew0KICAgIGV4dGVuZDogICAgICAgIGV4dGVuZCwNCiAgICBpbnNwZWN0OiAgICAgICBpbnNwZWN0LA0KICAgIHRvSlNPTjogICAgICAgIE5BVElWRV9KU09OX1NUUklOR0lGWV9TVVBQT1JUID8gc3RyaW5naWZ5IDogdG9KU09OLA0KICAgIHRvUXVlcnlTdHJpbmc6IHRvUXVlcnlTdHJpbmcsDQogICAgdG9IVE1MOiAgICAgICAgdG9IVE1MLA0KICAgIGtleXM6ICAgICAgICAgIE9iamVjdC5rZXlzIHx8IGtleXMsDQogICAgdmFsdWVzOiAgICAgICAgdmFsdWVzLA0KICAgIGNsb25lOiAgICAgICAgIGNsb25lLA0KICAgIGlzRWxlbWVudDogICAgIGlzRWxlbWVudCwNCiAgICBpc0FycmF5OiAgICAgICBpc0FycmF5LA0KICAgIGlzSGFzaDogICAgICAgIGlzSGFzaCwNCiAgICBpc0Z1bmN0aW9uOiAgICBpc0Z1bmN0aW9uLA0KICAgIGlzU3RyaW5nOiAgICAgIGlzU3RyaW5nLA0KICAgIGlzTnVtYmVyOiAgICAgIGlzTnVtYmVyLA0KICAgIGlzRGF0ZTogICAgICAgIGlzRGF0ZSwNCiAgICBpc1VuZGVmaW5lZDogICBpc1VuZGVmaW5lZA0KICB9KTsNCn0pKCk7DQpPYmplY3QuZXh0ZW5kKEZ1bmN0aW9uLnByb3RvdHlwZSwgKGZ1bmN0aW9uKCkgew0KICB2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7DQoNCiAgZnVuY3Rpb24gdXBkYXRlKGFycmF5LCBhcmdzKSB7DQogICAgdmFyIGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoLCBsZW5ndGggPSBhcmdzLmxlbmd0aDsNCiAgICB3aGlsZSAobGVuZ3RoLS0pIGFycmF5W2FycmF5TGVuZ3RoICsgbGVuZ3RoXSA9IGFyZ3NbbGVuZ3RoXTsNCiAgICByZXR1cm4gYXJyYXk7DQogIH0NCg0KICBmdW5jdGlvbiBtZXJnZShhcnJheSwgYXJncykgew0KICAgIGFycmF5ID0gc2xpY2UuY2FsbChhcnJheSwgMCk7DQogICAgcmV0dXJuIHVwZGF0ZShhcnJheSwgYXJncyk7DQogIH0NCg0KICBmdW5jdGlvbiBhcmd1bWVudE5hbWVzKCkgew0KICAgIHZhciBuYW1lcyA9IHRoaXMudG9TdHJpbmcoKS5tYXRjaCgvXltcc1woXSpmdW5jdGlvblteKF0qXCgoW14pXSopXCkvKVsxXQ0KICAgICAgLnJlcGxhY2UoL1wvXC8uKj9bXHJcbl18XC9cKig/Oi58W1xyXG5dKSo/XCpcLy9nLCAnJykNCiAgICAgIC5yZXBsYWNlKC9ccysvZywgJycpLnNwbGl0KCcsJyk7DQogICAgcmV0dXJuIG5hbWVzLmxlbmd0aCA9PSAxICYmICFuYW1lc1swXSA/IFtdIDogbmFtZXM7DQogIH0NCg0KICBmdW5jdGlvbiBiaW5kKGNvbnRleHQpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIgJiYgT2JqZWN0LmlzVW5kZWZpbmVkKGFyZ3VtZW50c1swXSkpIHJldHVybiB0aGlzOw0KICAgIHZhciBfX21ldGhvZCA9IHRoaXMsIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7DQogICAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGEgPSBtZXJnZShhcmdzLCBhcmd1bWVudHMpOw0KICAgICAgcmV0dXJuIF9fbWV0aG9kLmFwcGx5KGNvbnRleHQsIGEpOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIGJpbmRBc0V2ZW50TGlzdGVuZXIoY29udGV4dCkgew0KICAgIHZhciBfX21ldGhvZCA9IHRoaXMsIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7DQogICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgICB2YXIgYSA9IHVwZGF0ZShbZXZlbnQgfHwgd2luZG93LmV2ZW50XSwgYXJncyk7DQogICAgICByZXR1cm4gX19tZXRob2QuYXBwbHkoY29udGV4dCwgYSk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gY3VycnkoKSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGhpczsNCiAgICB2YXIgX19tZXRob2QgPSB0aGlzLCBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDApOw0KICAgIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBhID0gbWVyZ2UoYXJncywgYXJndW1lbnRzKTsNCiAgICAgIHJldHVybiBfX21ldGhvZC5hcHBseSh0aGlzLCBhKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBkZWxheSh0aW1lb3V0KSB7DQogICAgdmFyIF9fbWV0aG9kID0gdGhpcywgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsNCiAgICB0aW1lb3V0ID0gdGltZW91dCAqIDEwMDA7DQogICAgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuIF9fbWV0aG9kLmFwcGx5KF9fbWV0aG9kLCBhcmdzKTsNCiAgICB9LCB0aW1lb3V0KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGRlZmVyKCkgew0KICAgIHZhciBhcmdzID0gdXBkYXRlKFswLjAxXSwgYXJndW1lbnRzKTsNCiAgICByZXR1cm4gdGhpcy5kZWxheS5hcHBseSh0aGlzLCBhcmdzKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHdyYXAod3JhcHBlcikgew0KICAgIHZhciBfX21ldGhvZCA9IHRoaXM7DQogICAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGEgPSB1cGRhdGUoW19fbWV0aG9kLmJpbmQodGhpcyldLCBhcmd1bWVudHMpOw0KICAgICAgcmV0dXJuIHdyYXBwZXIuYXBwbHkodGhpcywgYSk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gbWV0aG9kaXplKCkgew0KICAgIGlmICh0aGlzLl9tZXRob2RpemVkKSByZXR1cm4gdGhpcy5fbWV0aG9kaXplZDsNCiAgICB2YXIgX19tZXRob2QgPSB0aGlzOw0KICAgIHJldHVybiB0aGlzLl9tZXRob2RpemVkID0gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgYSA9IHVwZGF0ZShbdGhpc10sIGFyZ3VtZW50cyk7DQogICAgICByZXR1cm4gX19tZXRob2QuYXBwbHkobnVsbCwgYSk7DQogICAgfTsNCiAgfQ0KDQogIHJldHVybiB7DQogICAgYXJndW1lbnROYW1lczogICAgICAgYXJndW1lbnROYW1lcywNCiAgICBiaW5kOiAgICAgICAgICAgICAgICBiaW5kLA0KICAgIGJpbmRBc0V2ZW50TGlzdGVuZXI6IGJpbmRBc0V2ZW50TGlzdGVuZXIsDQogICAgY3Vycnk6ICAgICAgICAgICAgICAgY3VycnksDQogICAgZGVsYXk6ICAgICAgICAgICAgICAgZGVsYXksDQogICAgZGVmZXI6ICAgICAgICAgICAgICAgZGVmZXIsDQogICAgd3JhcDogICAgICAgICAgICAgICAgd3JhcCwNCiAgICBtZXRob2RpemU6ICAgICAgICAgICBtZXRob2RpemUNCiAgfQ0KfSkoKSk7DQoNCg0KDQooZnVuY3Rpb24ocHJvdG8pIHsNCg0KDQogIGZ1bmN0aW9uIHRvSVNPU3RyaW5nKCkgew0KICAgIHJldHVybiB0aGlzLmdldFVUQ0Z1bGxZZWFyKCkgKyAnLScgKw0KICAgICAgKHRoaXMuZ2V0VVRDTW9udGgoKSArIDEpLnRvUGFkZGVkU3RyaW5nKDIpICsgJy0nICsNCiAgICAgIHRoaXMuZ2V0VVRDRGF0ZSgpLnRvUGFkZGVkU3RyaW5nKDIpICsgJ1QnICsNCiAgICAgIHRoaXMuZ2V0VVRDSG91cnMoKS50b1BhZGRlZFN0cmluZygyKSArICc6JyArDQogICAgICB0aGlzLmdldFVUQ01pbnV0ZXMoKS50b1BhZGRlZFN0cmluZygyKSArICc6JyArDQogICAgICB0aGlzLmdldFVUQ1NlY29uZHMoKS50b1BhZGRlZFN0cmluZygyKSArICdaJzsNCiAgfQ0KDQoNCiAgZnVuY3Rpb24gdG9KU09OKCkgew0KICAgIHJldHVybiB0aGlzLnRvSVNPU3RyaW5nKCk7DQogIH0NCg0KICBpZiAoIXByb3RvLnRvSVNPU3RyaW5nKSBwcm90by50b0lTT1N0cmluZyA9IHRvSVNPU3RyaW5nOw0KICBpZiAoIXByb3RvLnRvSlNPTikgcHJvdG8udG9KU09OID0gdG9KU09OOw0KDQp9KShEYXRlLnByb3RvdHlwZSk7DQoNCg0KUmVnRXhwLnByb3RvdHlwZS5tYXRjaCA9IFJlZ0V4cC5wcm90b3R5cGUudGVzdDsNCg0KUmVnRXhwLmVzY2FwZSA9IGZ1bmN0aW9uKHN0cikgew0KICByZXR1cm4gU3RyaW5nKHN0cikucmVwbGFjZSgvKFsuKis/Xj0hOiR7fSgpfFtcXVwvXFxdKS9nLCAnXFwkMScpOw0KfTsNCnZhciBQZXJpb2RpY2FsRXhlY3V0ZXIgPSBDbGFzcy5jcmVhdGUoew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihjYWxsYmFjaywgZnJlcXVlbmN5KSB7DQogICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOw0KICAgIHRoaXMuZnJlcXVlbmN5ID0gZnJlcXVlbmN5Ow0KICAgIHRoaXMuY3VycmVudGx5RXhlY3V0aW5nID0gZmFsc2U7DQoNCiAgICB0aGlzLnJlZ2lzdGVyQ2FsbGJhY2soKTsNCiAgfSwNCg0KICByZWdpc3RlckNhbGxiYWNrOiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwodGhpcy5vblRpbWVyRXZlbnQuYmluZCh0aGlzKSwgdGhpcy5mcmVxdWVuY3kgKiAxMDAwKTsNCiAgfSwNCg0KICBleGVjdXRlOiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLmNhbGxiYWNrKHRoaXMpOw0KICB9LA0KDQogIHN0b3A6IGZ1bmN0aW9uKCkgew0KICAgIGlmICghdGhpcy50aW1lcikgcmV0dXJuOw0KICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7DQogICAgdGhpcy50aW1lciA9IG51bGw7DQogIH0sDQoNCiAgb25UaW1lckV2ZW50OiBmdW5jdGlvbigpIHsNCiAgICBpZiAoIXRoaXMuY3VycmVudGx5RXhlY3V0aW5nKSB7DQogICAgICB0cnkgew0KICAgICAgICB0aGlzLmN1cnJlbnRseUV4ZWN1dGluZyA9IHRydWU7DQogICAgICAgIHRoaXMuZXhlY3V0ZSgpOw0KICAgICAgICB0aGlzLmN1cnJlbnRseUV4ZWN1dGluZyA9IGZhbHNlOw0KICAgICAgfSBjYXRjaChlKSB7DQogICAgICAgIHRoaXMuY3VycmVudGx5RXhlY3V0aW5nID0gZmFsc2U7DQogICAgICAgIHRocm93IGU7DQogICAgICB9DQogICAgfQ0KICB9DQp9KTsNCk9iamVjdC5leHRlbmQoU3RyaW5nLCB7DQogIGludGVycHJldDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHZhbHVlKTsNCiAgfSwNCiAgc3BlY2lhbENoYXI6IHsNCiAgICAnXGInOiAnXFxiJywNCiAgICAnXHQnOiAnXFx0JywNCiAgICAnXG4nOiAnXFxuJywNCiAgICAnXGYnOiAnXFxmJywNCiAgICAnXHInOiAnXFxyJywNCiAgICAnXFwnOiAnXFxcXCcNCiAgfQ0KfSk7DQoNCk9iamVjdC5leHRlbmQoU3RyaW5nLnByb3RvdHlwZSwgKGZ1bmN0aW9uKCkgew0KICB2YXIgTkFUSVZFX0pTT05fUEFSU0VfU1VQUE9SVCA9IHdpbmRvdy5KU09OICYmDQogICAgdHlwZW9mIEpTT04ucGFyc2UgPT09ICdmdW5jdGlvbicgJiYNCiAgICBKU09OLnBhcnNlKCd7InRlc3QiOiB0cnVlfScpLnRlc3Q7DQoNCiAgZnVuY3Rpb24gcHJlcGFyZVJlcGxhY2VtZW50KHJlcGxhY2VtZW50KSB7DQogICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKHJlcGxhY2VtZW50KSkgcmV0dXJuIHJlcGxhY2VtZW50Ow0KICAgIHZhciB0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZShyZXBsYWNlbWVudCk7DQogICAgcmV0dXJuIGZ1bmN0aW9uKG1hdGNoKSB7IHJldHVybiB0ZW1wbGF0ZS5ldmFsdWF0ZShtYXRjaCkgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGdzdWIocGF0dGVybiwgcmVwbGFjZW1lbnQpIHsNCiAgICB2YXIgcmVzdWx0ID0gJycsIHNvdXJjZSA9IHRoaXMsIG1hdGNoOw0KICAgIHJlcGxhY2VtZW50ID0gcHJlcGFyZVJlcGxhY2VtZW50KHJlcGxhY2VtZW50KTsNCg0KICAgIGlmIChPYmplY3QuaXNTdHJpbmcocGF0dGVybikpDQogICAgICBwYXR0ZXJuID0gUmVnRXhwLmVzY2FwZShwYXR0ZXJuKTsNCg0KICAgIGlmICghKHBhdHRlcm4ubGVuZ3RoIHx8IHBhdHRlcm4uc291cmNlKSkgew0KICAgICAgcmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudCgnJyk7DQogICAgICByZXR1cm4gcmVwbGFjZW1lbnQgKyBzb3VyY2Uuc3BsaXQoJycpLmpvaW4ocmVwbGFjZW1lbnQpICsgcmVwbGFjZW1lbnQ7DQogICAgfQ0KDQogICAgd2hpbGUgKHNvdXJjZS5sZW5ndGggPiAwKSB7DQogICAgICBpZiAobWF0Y2ggPSBzb3VyY2UubWF0Y2gocGF0dGVybikpIHsNCiAgICAgICAgcmVzdWx0ICs9IHNvdXJjZS5zbGljZSgwLCBtYXRjaC5pbmRleCk7DQogICAgICAgIHJlc3VsdCArPSBTdHJpbmcuaW50ZXJwcmV0KHJlcGxhY2VtZW50KG1hdGNoKSk7DQogICAgICAgIHNvdXJjZSAgPSBzb3VyY2Uuc2xpY2UobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmVzdWx0ICs9IHNvdXJjZSwgc291cmNlID0gJyc7DQogICAgICB9DQogICAgfQ0KICAgIHJldHVybiByZXN1bHQ7DQogIH0NCg0KICBmdW5jdGlvbiBzdWIocGF0dGVybiwgcmVwbGFjZW1lbnQsIGNvdW50KSB7DQogICAgcmVwbGFjZW1lbnQgPSBwcmVwYXJlUmVwbGFjZW1lbnQocmVwbGFjZW1lbnQpOw0KICAgIGNvdW50ID0gT2JqZWN0LmlzVW5kZWZpbmVkKGNvdW50KSA/IDEgOiBjb3VudDsNCg0KICAgIHJldHVybiB0aGlzLmdzdWIocGF0dGVybiwgZnVuY3Rpb24obWF0Y2gpIHsNCiAgICAgIGlmICgtLWNvdW50IDwgMCkgcmV0dXJuIG1hdGNoWzBdOw0KICAgICAgcmV0dXJuIHJlcGxhY2VtZW50KG1hdGNoKTsNCiAgICB9KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHNjYW4ocGF0dGVybiwgaXRlcmF0b3IpIHsNCiAgICB0aGlzLmdzdWIocGF0dGVybiwgaXRlcmF0b3IpOw0KICAgIHJldHVybiBTdHJpbmcodGhpcyk7DQogIH0NCg0KICBmdW5jdGlvbiB0cnVuY2F0ZShsZW5ndGgsIHRydW5jYXRpb24pIHsNCiAgICBsZW5ndGggPSBsZW5ndGggfHwgMzA7DQogICAgdHJ1bmNhdGlvbiA9IE9iamVjdC5pc1VuZGVmaW5lZCh0cnVuY2F0aW9uKSA/ICcuLi4nIDogdHJ1bmNhdGlvbjsNCiAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBsZW5ndGggPw0KICAgICAgdGhpcy5zbGljZSgwLCBsZW5ndGggLSB0cnVuY2F0aW9uLmxlbmd0aCkgKyB0cnVuY2F0aW9uIDogU3RyaW5nKHRoaXMpOw0KICB9DQoNCiAgZnVuY3Rpb24gc3RyaXAoKSB7DQogICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvXlxzKy8sICcnKS5yZXBsYWNlKC9ccyskLywgJycpOw0KICB9DQoNCiAgZnVuY3Rpb24gc3RyaXBUYWdzKCkgew0KICAgIHJldHVybiB0aGlzLnJlcGxhY2UoLzxcdysoXHMrKCJbXiJdKiJ8J1teJ10qJ3xbXj5dKSspPz58PFwvXHcrPi9naSwgJycpOw0KICB9DQoNCiAgZnVuY3Rpb24gc3RyaXBTY3JpcHRzKCkgew0KICAgIHJldHVybiB0aGlzLnJlcGxhY2UobmV3IFJlZ0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsICdpbWcnKSwgJycpOw0KICB9DQoNCiAgZnVuY3Rpb24gZXh0cmFjdFNjcmlwdHMoKSB7DQogICAgdmFyIG1hdGNoQWxsID0gbmV3IFJlZ0V4cChQcm90b3R5cGUuU2NyaXB0RnJhZ21lbnQsICdpbWcnKSwNCiAgICAgICAgbWF0Y2hPbmUgPSBuZXcgUmVnRXhwKFByb3RvdHlwZS5TY3JpcHRGcmFnbWVudCwgJ2ltJyk7DQogICAgcmV0dXJuICh0aGlzLm1hdGNoKG1hdGNoQWxsKSB8fCBbXSkubWFwKGZ1bmN0aW9uKHNjcmlwdFRhZykgew0KICAgICAgcmV0dXJuIChzY3JpcHRUYWcubWF0Y2gobWF0Y2hPbmUpIHx8IFsnJywgJyddKVsxXTsNCiAgICB9KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGV2YWxTY3JpcHRzKCkgew0KICAgIHJldHVybiB0aGlzLmV4dHJhY3RTY3JpcHRzKCkubWFwKGZ1bmN0aW9uKHNjcmlwdCkgeyByZXR1cm4gZXZhbChzY3JpcHQpIH0pOw0KICB9DQoNCiAgZnVuY3Rpb24gZXNjYXBlSFRNTCgpIHsNCiAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC8mL2csJyZhbXA7JykucmVwbGFjZSgvPC9nLCcmbHQ7JykucmVwbGFjZSgvPi9nLCcmZ3Q7Jyk7DQogIH0NCg0KICBmdW5jdGlvbiB1bmVzY2FwZUhUTUwoKSB7DQogICAgcmV0dXJuIHRoaXMuc3RyaXBUYWdzKCkucmVwbGFjZSgvJmx0Oy9nLCc8JykucmVwbGFjZSgvJmd0Oy9nLCc+JykucmVwbGFjZSgvJmFtcDsvZywnJicpOw0KICB9DQoNCg0KICBmdW5jdGlvbiB0b1F1ZXJ5UGFyYW1zKHNlcGFyYXRvcikgew0KICAgIHZhciBtYXRjaCA9IHRoaXMuc3RyaXAoKS5tYXRjaCgvKFtePyNdKikoIy4qKT8kLyk7DQogICAgaWYgKCFtYXRjaCkgcmV0dXJuIHsgfTsNCg0KICAgIHJldHVybiBtYXRjaFsxXS5zcGxpdChzZXBhcmF0b3IgfHwgJyYnKS5pbmplY3QoeyB9LCBmdW5jdGlvbihoYXNoLCBwYWlyKSB7DQogICAgICBpZiAoKHBhaXIgPSBwYWlyLnNwbGl0KCc9JykpWzBdKSB7DQogICAgICAgIHZhciBrZXkgPSBkZWNvZGVVUklDb21wb25lbnQocGFpci5zaGlmdCgpKSwNCiAgICAgICAgICAgIHZhbHVlID0gcGFpci5sZW5ndGggPiAxID8gcGFpci5qb2luKCc9JykgOiBwYWlyWzBdOw0KDQogICAgICAgIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQpIHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsNCg0KICAgICAgICBpZiAoa2V5IGluIGhhc2gpIHsNCiAgICAgICAgICBpZiAoIU9iamVjdC5pc0FycmF5KGhhc2hba2V5XSkpIGhhc2hba2V5XSA9IFtoYXNoW2tleV1dOw0KICAgICAgICAgIGhhc2hba2V5XS5wdXNoKHZhbHVlKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGhhc2hba2V5XSA9IHZhbHVlOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGhhc2g7DQogICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiB0b0FycmF5KCkgew0KICAgIHJldHVybiB0aGlzLnNwbGl0KCcnKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHN1Y2MoKSB7DQogICAgcmV0dXJuIHRoaXMuc2xpY2UoMCwgdGhpcy5sZW5ndGggLSAxKSArDQogICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuY2hhckNvZGVBdCh0aGlzLmxlbmd0aCAtIDEpICsgMSk7DQogIH0NCg0KICBmdW5jdGlvbiB0aW1lcyhjb3VudCkgew0KICAgIHJldHVybiBjb3VudCA8IDEgPyAnJyA6IG5ldyBBcnJheShjb3VudCArIDEpLmpvaW4odGhpcyk7DQogIH0NCg0KICBmdW5jdGlvbiBjYW1lbGl6ZSgpIHsNCiAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC8tKyguKT8vZywgZnVuY3Rpb24obWF0Y2gsIGNocikgew0KICAgICAgcmV0dXJuIGNociA/IGNoci50b1VwcGVyQ2FzZSgpIDogJyc7DQogICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiBjYXBpdGFsaXplKCkgew0KICAgIHJldHVybiB0aGlzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGhpcy5zdWJzdHJpbmcoMSkudG9Mb3dlckNhc2UoKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHVuZGVyc2NvcmUoKSB7DQogICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvOjovZywgJy8nKQ0KICAgICAgICAgICAgICAgLnJlcGxhY2UoLyhbQS1aXSspKFtBLVpdW2Etel0pL2csICckMV8kMicpDQogICAgICAgICAgICAgICAucmVwbGFjZSgvKFthLXpcZF0pKFtBLVpdKS9nLCAnJDFfJDInKQ0KICAgICAgICAgICAgICAgLnJlcGxhY2UoLy0vZywgJ18nKQ0KICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKCk7DQogIH0NCg0KICBmdW5jdGlvbiBkYXNoZXJpemUoKSB7DQogICAgcmV0dXJuIHRoaXMucmVwbGFjZSgvXy9nLCAnLScpOw0KICB9DQoNCiAgZnVuY3Rpb24gaW5zcGVjdCh1c2VEb3VibGVRdW90ZXMpIHsNCiAgICB2YXIgZXNjYXBlZFN0cmluZyA9IHRoaXMucmVwbGFjZSgvW1x4MDAtXHgxZlxcXS9nLCBmdW5jdGlvbihjaGFyYWN0ZXIpIHsNCiAgICAgIGlmIChjaGFyYWN0ZXIgaW4gU3RyaW5nLnNwZWNpYWxDaGFyKSB7DQogICAgICAgIHJldHVybiBTdHJpbmcuc3BlY2lhbENoYXJbY2hhcmFjdGVyXTsNCiAgICAgIH0NCiAgICAgIHJldHVybiAnXFx1MDAnICsgY2hhcmFjdGVyLmNoYXJDb2RlQXQoKS50b1BhZGRlZFN0cmluZygyLCAxNik7DQogICAgfSk7DQogICAgaWYgKHVzZURvdWJsZVF1b3RlcykgcmV0dXJuICciJyArIGVzY2FwZWRTdHJpbmcucmVwbGFjZSgvIi9nLCAnXFwiJykgKyAnIic7DQogICAgcmV0dXJuICInIiArIGVzY2FwZWRTdHJpbmcucmVwbGFjZSgvJy9nLCAnXFxcJycpICsgIiciOw0KICB9DQoNCiAgZnVuY3Rpb24gdW5maWx0ZXJKU09OKGZpbHRlcikgew0KICAgIHJldHVybiB0aGlzLnJlcGxhY2UoZmlsdGVyIHx8IFByb3RvdHlwZS5KU09ORmlsdGVyLCAnJDEnKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGlzSlNPTigpIHsNCiAgICB2YXIgc3RyID0gdGhpczsNCiAgICBpZiAoc3RyLmJsYW5rKCkpIHJldHVybiBmYWxzZTsNCiAgICBzdHIgPSBzdHIucmVwbGFjZSgvXFwoPzpbIlxcXC9iZm5ydF18dVswLTlhLWZBLUZdezR9KS9nLCAnQCcpOw0KICAgIHN0ciA9IHN0ci5yZXBsYWNlKC8iW14iXFxcblxyXSoifHRydWV8ZmFsc2V8bnVsbHwtP1xkKyg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8vZywgJ10nKTsNCiAgICBzdHIgPSBzdHIucmVwbGFjZSgvKD86Xnw6fCwpKD86XHMqXFspKy9nLCAnJyk7DQogICAgcmV0dXJuICgvXltcXSw6e31cc10qJC8pLnRlc3Qoc3RyKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGV2YWxKU09OKHNhbml0aXplKSB7DQogICAgdmFyIGpzb24gPSB0aGlzLnVuZmlsdGVySlNPTigpLA0KICAgICAgICBjeCA9IC9bXHUwMDAwXHUwMGFkXHUwNjAwLVx1MDYwNFx1MDcwZlx1MTdiNFx1MTdiNVx1MjAwYy1cdTIwMGZcdTIwMjgtXHUyMDJmXHUyMDYwLVx1MjA2Zlx1ZmVmZlx1ZmZmMC1cdWZmZmZdL2c7DQogICAgaWYgKGN4LnRlc3QoanNvbikpIHsNCiAgICAgIGpzb24gPSBqc29uLnJlcGxhY2UoY3gsIGZ1bmN0aW9uIChhKSB7DQogICAgICAgIHJldHVybiAnXFx1JyArICgnMDAwMCcgKyBhLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNCk7DQogICAgICB9KTsNCiAgICB9DQogICAgdHJ5IHsNCiAgICAgIGlmICghc2FuaXRpemUgfHwganNvbi5pc0pTT04oKSkgcmV0dXJuIGV2YWwoJygnICsganNvbiArICcpJyk7DQogICAgfSBjYXRjaCAoZSkgeyB9DQogICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdCYWRseSBmb3JtZWQgSlNPTiBzdHJpbmc6ICcgKyB0aGlzLmluc3BlY3QoKSk7DQogIH0NCg0KICBmdW5jdGlvbiBwYXJzZUpTT04oKSB7DQogICAgdmFyIGpzb24gPSB0aGlzLnVuZmlsdGVySlNPTigpOw0KICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pOw0KICB9DQoNCiAgZnVuY3Rpb24gaW5jbHVkZShwYXR0ZXJuKSB7DQogICAgcmV0dXJuIHRoaXMuaW5kZXhPZihwYXR0ZXJuKSA+IC0xOw0KICB9DQoNCiAgZnVuY3Rpb24gc3RhcnRzV2l0aChwYXR0ZXJuKSB7DQogICAgcmV0dXJuIHRoaXMubGFzdEluZGV4T2YocGF0dGVybiwgMCkgPT09IDA7DQogIH0NCg0KICBmdW5jdGlvbiBlbmRzV2l0aChwYXR0ZXJuKSB7DQogICAgdmFyIGQgPSB0aGlzLmxlbmd0aCAtIHBhdHRlcm4ubGVuZ3RoOw0KICAgIHJldHVybiBkID49IDAgJiYgdGhpcy5pbmRleE9mKHBhdHRlcm4sIGQpID09PSBkOw0KICB9DQoNCiAgZnVuY3Rpb24gZW1wdHkoKSB7DQogICAgcmV0dXJuIHRoaXMgPT0gJyc7DQogIH0NCg0KICBmdW5jdGlvbiBibGFuaygpIHsNCiAgICByZXR1cm4gL15ccyokLy50ZXN0KHRoaXMpOw0KICB9DQoNCiAgZnVuY3Rpb24gaW50ZXJwb2xhdGUob2JqZWN0LCBwYXR0ZXJuKSB7DQogICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSh0aGlzLCBwYXR0ZXJuKS5ldmFsdWF0ZShvYmplY3QpOw0KICB9DQoNCiAgcmV0dXJuIHsNCiAgICBnc3ViOiAgICAgICAgICAgZ3N1YiwNCiAgICBzdWI6ICAgICAgICAgICAgc3ViLA0KICAgIHNjYW46ICAgICAgICAgICBzY2FuLA0KICAgIHRydW5jYXRlOiAgICAgICB0cnVuY2F0ZSwNCiAgICBzdHJpcDogICAgICAgICAgU3RyaW5nLnByb3RvdHlwZS50cmltIHx8IHN0cmlwLA0KICAgIHN0cmlwVGFnczogICAgICBzdHJpcFRhZ3MsDQogICAgc3RyaXBTY3JpcHRzOiAgIHN0cmlwU2NyaXB0cywNCiAgICBleHRyYWN0U2NyaXB0czogZXh0cmFjdFNjcmlwdHMsDQogICAgZXZhbFNjcmlwdHM6ICAgIGV2YWxTY3JpcHRzLA0KICAgIGVzY2FwZUhUTUw6ICAgICBlc2NhcGVIVE1MLA0KICAgIHVuZXNjYXBlSFRNTDogICB1bmVzY2FwZUhUTUwsDQogICAgdG9RdWVyeVBhcmFtczogIHRvUXVlcnlQYXJhbXMsDQogICAgcGFyc2VRdWVyeTogICAgIHRvUXVlcnlQYXJhbXMsDQogICAgdG9BcnJheTogICAgICAgIHRvQXJyYXksDQogICAgc3VjYzogICAgICAgICAgIHN1Y2MsDQogICAgdGltZXM6ICAgICAgICAgIHRpbWVzLA0KICAgIGNhbWVsaXplOiAgICAgICBjYW1lbGl6ZSwNCiAgICBjYXBpdGFsaXplOiAgICAgY2FwaXRhbGl6ZSwNCiAgICB1bmRlcnNjb3JlOiAgICAgdW5kZXJzY29yZSwNCiAgICBkYXNoZXJpemU6ICAgICAgZGFzaGVyaXplLA0KICAgIGluc3BlY3Q6ICAgICAgICBpbnNwZWN0LA0KICAgIHVuZmlsdGVySlNPTjogICB1bmZpbHRlckpTT04sDQogICAgaXNKU09OOiAgICAgICAgIGlzSlNPTiwNCiAgICBldmFsSlNPTjogICAgICAgTkFUSVZFX0pTT05fUEFSU0VfU1VQUE9SVCA/IHBhcnNlSlNPTiA6IGV2YWxKU09OLA0KICAgIGluY2x1ZGU6ICAgICAgICBpbmNsdWRlLA0KICAgIHN0YXJ0c1dpdGg6ICAgICBzdGFydHNXaXRoLA0KICAgIGVuZHNXaXRoOiAgICAgICBlbmRzV2l0aCwNCiAgICBlbXB0eTogICAgICAgICAgZW1wdHksDQogICAgYmxhbms6ICAgICAgICAgIGJsYW5rLA0KICAgIGludGVycG9sYXRlOiAgICBpbnRlcnBvbGF0ZQ0KICB9Ow0KfSkoKSk7DQoNCnZhciBUZW1wbGF0ZSA9IENsYXNzLmNyZWF0ZSh7DQogIGluaXRpYWxpemU6IGZ1bmN0aW9uKHRlbXBsYXRlLCBwYXR0ZXJuKSB7DQogICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlLnRvU3RyaW5nKCk7DQogICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybiB8fCBUZW1wbGF0ZS5QYXR0ZXJuOw0KICB9LA0KDQogIGV2YWx1YXRlOiBmdW5jdGlvbihvYmplY3QpIHsNCiAgICBpZiAob2JqZWN0ICYmIE9iamVjdC5pc0Z1bmN0aW9uKG9iamVjdC50b1RlbXBsYXRlUmVwbGFjZW1lbnRzKSkNCiAgICAgIG9iamVjdCA9IG9iamVjdC50b1RlbXBsYXRlUmVwbGFjZW1lbnRzKCk7DQoNCiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5nc3ViKHRoaXMucGF0dGVybiwgZnVuY3Rpb24obWF0Y2gpIHsNCiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgcmV0dXJuIChtYXRjaFsxXSArICcnKTsNCg0KICAgICAgdmFyIGJlZm9yZSA9IG1hdGNoWzFdIHx8ICcnOw0KICAgICAgaWYgKGJlZm9yZSA9PSAnXFwnKSByZXR1cm4gbWF0Y2hbMl07DQoNCiAgICAgIHZhciBjdHggPSBvYmplY3QsIGV4cHIgPSBtYXRjaFszXSwNCiAgICAgICAgICBwYXR0ZXJuID0gL14oW14uW10rfFxbKCg/Oi4qP1teXFxdKT8pXF0pKFwufFxbfCQpLzsNCg0KICAgICAgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMoZXhwcik7DQogICAgICBpZiAobWF0Y2ggPT0gbnVsbCkgcmV0dXJuIGJlZm9yZTsNCg0KICAgICAgd2hpbGUgKG1hdGNoICE9IG51bGwpIHsNCiAgICAgICAgdmFyIGNvbXAgPSBtYXRjaFsxXS5zdGFydHNXaXRoKCdbJykgPyBtYXRjaFsyXS5yZXBsYWNlKC9cXFxcXS9nLCAnXScpIDogbWF0Y2hbMV07DQogICAgICAgIGN0eCA9IGN0eFtjb21wXTsNCiAgICAgICAgaWYgKG51bGwgPT0gY3R4IHx8ICcnID09IG1hdGNoWzNdKSBicmVhazsNCiAgICAgICAgZXhwciA9IGV4cHIuc3Vic3RyaW5nKCdbJyA9PSBtYXRjaFszXSA/IG1hdGNoWzFdLmxlbmd0aCA6IG1hdGNoWzBdLmxlbmd0aCk7DQogICAgICAgIG1hdGNoID0gcGF0dGVybi5leGVjKGV4cHIpOw0KICAgICAgfQ0KDQogICAgICByZXR1cm4gYmVmb3JlICsgU3RyaW5nLmludGVycHJldChjdHgpOw0KICAgIH0pOw0KICB9DQp9KTsNClRlbXBsYXRlLlBhdHRlcm4gPSAvKF58LnxccnxcbikoI1x7KC4qPylcfSkvOw0KDQp2YXIgJGJyZWFrID0geyB9Ow0KDQp2YXIgRW51bWVyYWJsZSA9IChmdW5jdGlvbigpIHsNCiAgZnVuY3Rpb24gZWFjaChpdGVyYXRvciwgY29udGV4dCkgew0KICAgIHZhciBpbmRleCA9IDA7DQogICAgdHJ5IHsNCiAgICAgIHRoaXMuX2VhY2goZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgICAgaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgrKyk7DQogICAgICB9KTsNCiAgICB9IGNhdGNoIChlKSB7DQogICAgICBpZiAoZSAhPSAkYnJlYWspIHRocm93IGU7DQogICAgfQ0KICAgIHJldHVybiB0aGlzOw0KICB9DQoNCiAgZnVuY3Rpb24gZWFjaFNsaWNlKG51bWJlciwgaXRlcmF0b3IsIGNvbnRleHQpIHsNCiAgICB2YXIgaW5kZXggPSAtbnVtYmVyLCBzbGljZXMgPSBbXSwgYXJyYXkgPSB0aGlzLnRvQXJyYXkoKTsNCiAgICBpZiAobnVtYmVyIDwgMSkgcmV0dXJuIGFycmF5Ow0KICAgIHdoaWxlICgoaW5kZXggKz0gbnVtYmVyKSA8IGFycmF5Lmxlbmd0aCkNCiAgICAgIHNsaWNlcy5wdXNoKGFycmF5LnNsaWNlKGluZGV4LCBpbmRleCtudW1iZXIpKTsNCiAgICByZXR1cm4gc2xpY2VzLmNvbGxlY3QoaXRlcmF0b3IsIGNvbnRleHQpOw0KICB9DQoNCiAgZnVuY3Rpb24gYWxsKGl0ZXJhdG9yLCBjb250ZXh0KSB7DQogICAgaXRlcmF0b3IgPSBpdGVyYXRvciB8fCBQcm90b3R5cGUuSzsNCiAgICB2YXIgcmVzdWx0ID0gdHJ1ZTsNCiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7DQogICAgICByZXN1bHQgPSByZXN1bHQgJiYgISFpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCk7DQogICAgICBpZiAoIXJlc3VsdCkgdGhyb3cgJGJyZWFrOw0KICAgIH0pOw0KICAgIHJldHVybiByZXN1bHQ7DQogIH0NCg0KICBmdW5jdGlvbiBhbnkoaXRlcmF0b3IsIGNvbnRleHQpIHsNCiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LOw0KICAgIHZhciByZXN1bHQgPSBmYWxzZTsNCiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7DQogICAgICBpZiAocmVzdWx0ID0gISFpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkpDQogICAgICAgIHRocm93ICRicmVhazsNCiAgICB9KTsNCiAgICByZXR1cm4gcmVzdWx0Ow0KICB9DQoNCiAgZnVuY3Rpb24gY29sbGVjdChpdGVyYXRvciwgY29udGV4dCkgew0KICAgIGl0ZXJhdG9yID0gaXRlcmF0b3IgfHwgUHJvdG90eXBlLks7DQogICAgdmFyIHJlc3VsdHMgPSBbXTsNCiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7DQogICAgICByZXN1bHRzLnB1c2goaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpKTsNCiAgICB9KTsNCiAgICByZXR1cm4gcmVzdWx0czsNCiAgfQ0KDQogIGZ1bmN0aW9uIGRldGVjdChpdGVyYXRvciwgY29udGV4dCkgew0KICAgIHZhciByZXN1bHQ7DQogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KICAgICAgaWYgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4KSkgew0KICAgICAgICByZXN1bHQgPSB2YWx1ZTsNCiAgICAgICAgdGhyb3cgJGJyZWFrOw0KICAgICAgfQ0KICAgIH0pOw0KICAgIHJldHVybiByZXN1bHQ7DQogIH0NCg0KICBmdW5jdGlvbiBmaW5kQWxsKGl0ZXJhdG9yLCBjb250ZXh0KSB7DQogICAgdmFyIHJlc3VsdHMgPSBbXTsNCiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7DQogICAgICBpZiAoaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpKQ0KICAgICAgICByZXN1bHRzLnB1c2godmFsdWUpOw0KICAgIH0pOw0KICAgIHJldHVybiByZXN1bHRzOw0KICB9DQoNCiAgZnVuY3Rpb24gZ3JlcChmaWx0ZXIsIGl0ZXJhdG9yLCBjb250ZXh0KSB7DQogICAgaXRlcmF0b3IgPSBpdGVyYXRvciB8fCBQcm90b3R5cGUuSzsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KDQogICAgaWYgKE9iamVjdC5pc1N0cmluZyhmaWx0ZXIpKQ0KICAgICAgZmlsdGVyID0gbmV3IFJlZ0V4cChSZWdFeHAuZXNjYXBlKGZpbHRlcikpOw0KDQogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KICAgICAgaWYgKGZpbHRlci5tYXRjaCh2YWx1ZSkpDQogICAgICAgIHJlc3VsdHMucHVzaChpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCkpOw0KICAgIH0pOw0KICAgIHJldHVybiByZXN1bHRzOw0KICB9DQoNCiAgZnVuY3Rpb24gaW5jbHVkZShvYmplY3QpIHsNCiAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24odGhpcy5pbmRleE9mKSkNCiAgICAgIGlmICh0aGlzLmluZGV4T2Yob2JqZWN0KSAhPSAtMSkgcmV0dXJuIHRydWU7DQoNCiAgICB2YXIgZm91bmQgPSBmYWxzZTsNCiAgICB0aGlzLmVhY2goZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgIGlmICh2YWx1ZSA9PSBvYmplY3QpIHsNCiAgICAgICAgZm91bmQgPSB0cnVlOw0KICAgICAgICB0aHJvdyAkYnJlYWs7DQogICAgICB9DQogICAgfSk7DQogICAgcmV0dXJuIGZvdW5kOw0KICB9DQoNCiAgZnVuY3Rpb24gaW5Hcm91cHNPZihudW1iZXIsIGZpbGxXaXRoKSB7DQogICAgZmlsbFdpdGggPSBPYmplY3QuaXNVbmRlZmluZWQoZmlsbFdpdGgpID8gbnVsbCA6IGZpbGxXaXRoOw0KICAgIHJldHVybiB0aGlzLmVhY2hTbGljZShudW1iZXIsIGZ1bmN0aW9uKHNsaWNlKSB7DQogICAgICB3aGlsZShzbGljZS5sZW5ndGggPCBudW1iZXIpIHNsaWNlLnB1c2goZmlsbFdpdGgpOw0KICAgICAgcmV0dXJuIHNsaWNlOw0KICAgIH0pOw0KICB9DQoNCiAgZnVuY3Rpb24gaW5qZWN0KG1lbW8sIGl0ZXJhdG9yLCBjb250ZXh0KSB7DQogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KICAgICAgbWVtbyA9IGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgbWVtbywgdmFsdWUsIGluZGV4KTsNCiAgICB9KTsNCiAgICByZXR1cm4gbWVtbzsNCiAgfQ0KDQogIGZ1bmN0aW9uIGludm9rZShtZXRob2QpIHsNCiAgICB2YXIgYXJncyA9ICRBKGFyZ3VtZW50cykuc2xpY2UoMSk7DQogICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICByZXR1cm4gdmFsdWVbbWV0aG9kXS5hcHBseSh2YWx1ZSwgYXJncyk7DQogICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiBtYXgoaXRlcmF0b3IsIGNvbnRleHQpIHsNCiAgICBpdGVyYXRvciA9IGl0ZXJhdG9yIHx8IFByb3RvdHlwZS5LOw0KICAgIHZhciByZXN1bHQ7DQogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KICAgICAgdmFsdWUgPSBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCk7DQogICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgdmFsdWUgPj0gcmVzdWx0KQ0KICAgICAgICByZXN1bHQgPSB2YWx1ZTsNCiAgICB9KTsNCiAgICByZXR1cm4gcmVzdWx0Ow0KICB9DQoNCiAgZnVuY3Rpb24gbWluKGl0ZXJhdG9yLCBjb250ZXh0KSB7DQogICAgaXRlcmF0b3IgPSBpdGVyYXRvciB8fCBQcm90b3R5cGUuSzsNCiAgICB2YXIgcmVzdWx0Ow0KICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsNCiAgICAgIHZhbHVlID0gaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpOw0KICAgICAgaWYgKHJlc3VsdCA9PSBudWxsIHx8IHZhbHVlIDwgcmVzdWx0KQ0KICAgICAgICByZXN1bHQgPSB2YWx1ZTsNCiAgICB9KTsNCiAgICByZXR1cm4gcmVzdWx0Ow0KICB9DQoNCiAgZnVuY3Rpb24gcGFydGl0aW9uKGl0ZXJhdG9yLCBjb250ZXh0KSB7DQogICAgaXRlcmF0b3IgPSBpdGVyYXRvciB8fCBQcm90b3R5cGUuSzsNCiAgICB2YXIgdHJ1ZXMgPSBbXSwgZmFsc2VzID0gW107DQogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KICAgICAgKGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4KSA/DQogICAgICAgIHRydWVzIDogZmFsc2VzKS5wdXNoKHZhbHVlKTsNCiAgICB9KTsNCiAgICByZXR1cm4gW3RydWVzLCBmYWxzZXNdOw0KICB9DQoNCiAgZnVuY3Rpb24gcGx1Y2socHJvcGVydHkpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlW3Byb3BlcnR5XSk7DQogICAgfSk7DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH0NCg0KICBmdW5jdGlvbiByZWplY3QoaXRlcmF0b3IsIGNvbnRleHQpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIHRoaXMuZWFjaChmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHsNCiAgICAgIGlmICghaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpKQ0KICAgICAgICByZXN1bHRzLnB1c2godmFsdWUpOw0KICAgIH0pOw0KICAgIHJldHVybiByZXN1bHRzOw0KICB9DQoNCiAgZnVuY3Rpb24gc29ydEJ5KGl0ZXJhdG9yLCBjb250ZXh0KSB7DQogICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgew0KICAgICAgcmV0dXJuIHsNCiAgICAgICAgdmFsdWU6IHZhbHVlLA0KICAgICAgICBjcml0ZXJpYTogaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgpDQogICAgICB9Ow0KICAgIH0pLnNvcnQoZnVuY3Rpb24obGVmdCwgcmlnaHQpIHsNCiAgICAgIHZhciBhID0gbGVmdC5jcml0ZXJpYSwgYiA9IHJpZ2h0LmNyaXRlcmlhOw0KICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwOw0KICAgIH0pLnBsdWNrKCd2YWx1ZScpOw0KICB9DQoNCiAgZnVuY3Rpb24gdG9BcnJheSgpIHsNCiAgICByZXR1cm4gdGhpcy5tYXAoKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHppcCgpIHsNCiAgICB2YXIgaXRlcmF0b3IgPSBQcm90b3R5cGUuSywgYXJncyA9ICRBKGFyZ3VtZW50cyk7DQogICAgaWYgKE9iamVjdC5pc0Z1bmN0aW9uKGFyZ3MubGFzdCgpKSkNCiAgICAgIGl0ZXJhdG9yID0gYXJncy5wb3AoKTsNCg0KICAgIHZhciBjb2xsZWN0aW9ucyA9IFt0aGlzXS5jb25jYXQoYXJncykubWFwKCRBKTsNCiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUsIGluZGV4KSB7DQogICAgICByZXR1cm4gaXRlcmF0b3IoY29sbGVjdGlvbnMucGx1Y2soaW5kZXgpKTsNCiAgICB9KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHNpemUoKSB7DQogICAgcmV0dXJuIHRoaXMudG9BcnJheSgpLmxlbmd0aDsNCiAgfQ0KDQogIGZ1bmN0aW9uIGluc3BlY3QoKSB7DQogICAgcmV0dXJuICcjPEVudW1lcmFibGU6JyArIHRoaXMudG9BcnJheSgpLmluc3BlY3QoKSArICc+JzsNCiAgfQ0KDQoNCg0KDQoNCg0KDQoNCg0KICByZXR1cm4gew0KICAgIGVhY2g6ICAgICAgIGVhY2gsDQogICAgZWFjaFNsaWNlOiAgZWFjaFNsaWNlLA0KICAgIGFsbDogICAgICAgIGFsbCwNCiAgICBldmVyeTogICAgICBhbGwsDQogICAgYW55OiAgICAgICAgYW55LA0KICAgIHNvbWU6ICAgICAgIGFueSwNCiAgICBjb2xsZWN0OiAgICBjb2xsZWN0LA0KICAgIG1hcDogICAgICAgIGNvbGxlY3QsDQogICAgZGV0ZWN0OiAgICAgZGV0ZWN0LA0KICAgIGZpbmRBbGw6ICAgIGZpbmRBbGwsDQogICAgc2VsZWN0OiAgICAgZmluZEFsbCwNCiAgICBmaWx0ZXI6ICAgICBmaW5kQWxsLA0KICAgIGdyZXA6ICAgICAgIGdyZXAsDQogICAgaW5jbHVkZTogICAgaW5jbHVkZSwNCiAgICBtZW1iZXI6ICAgICBpbmNsdWRlLA0KICAgIGluR3JvdXBzT2Y6IGluR3JvdXBzT2YsDQogICAgaW5qZWN0OiAgICAgaW5qZWN0LA0KICAgIGludm9rZTogICAgIGludm9rZSwNCiAgICBtYXg6ICAgICAgICBtYXgsDQogICAgbWluOiAgICAgICAgbWluLA0KICAgIHBhcnRpdGlvbjogIHBhcnRpdGlvbiwNCiAgICBwbHVjazogICAgICBwbHVjaywNCiAgICByZWplY3Q6ICAgICByZWplY3QsDQogICAgc29ydEJ5OiAgICAgc29ydEJ5LA0KICAgIHRvQXJyYXk6ICAgIHRvQXJyYXksDQogICAgZW50cmllczogICAgdG9BcnJheSwNCiAgICB6aXA6ICAgICAgICB6aXAsDQogICAgc2l6ZTogICAgICAgc2l6ZSwNCiAgICBpbnNwZWN0OiAgICBpbnNwZWN0LA0KICAgIGZpbmQ6ICAgICAgIGRldGVjdA0KICB9Ow0KfSkoKTsNCg0KZnVuY3Rpb24gJEEoaXRlcmFibGUpIHsNCiAgaWYgKCFpdGVyYWJsZSkgcmV0dXJuIFtdOw0KICBpZiAoJ3RvQXJyYXknIGluIE9iamVjdChpdGVyYWJsZSkpIHJldHVybiBpdGVyYWJsZS50b0FycmF5KCk7DQogIHZhciBsZW5ndGggPSBpdGVyYWJsZS5sZW5ndGggfHwgMCwgcmVzdWx0cyA9IG5ldyBBcnJheShsZW5ndGgpOw0KICB3aGlsZSAobGVuZ3RoLS0pIHJlc3VsdHNbbGVuZ3RoXSA9IGl0ZXJhYmxlW2xlbmd0aF07DQogIHJldHVybiByZXN1bHRzOw0KfQ0KDQoNCmZ1bmN0aW9uICR3KHN0cmluZykgew0KICBpZiAoIU9iamVjdC5pc1N0cmluZyhzdHJpbmcpKSByZXR1cm4gW107DQogIHN0cmluZyA9IHN0cmluZy5zdHJpcCgpOw0KICByZXR1cm4gc3RyaW5nID8gc3RyaW5nLnNwbGl0KC9ccysvKSA6IFtdOw0KfQ0KDQpBcnJheS5mcm9tID0gJEE7DQoNCg0KKGZ1bmN0aW9uKCkgew0KICB2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSwNCiAgICAgIHNsaWNlID0gYXJyYXlQcm90by5zbGljZSwNCiAgICAgIF9lYWNoID0gYXJyYXlQcm90by5mb3JFYWNoOyAvLyB1c2UgbmF0aXZlIGJyb3dzZXIgSlMgMS42IGltcGxlbWVudGF0aW9uIGlmIGF2YWlsYWJsZQ0KDQogIGZ1bmN0aW9uIGVhY2goaXRlcmF0b3IsIGNvbnRleHQpIHsNCiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gdGhpcy5sZW5ndGggPj4+IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgaWYgKGkgaW4gdGhpcykgaXRlcmF0b3IuY2FsbChjb250ZXh0LCB0aGlzW2ldLCBpLCB0aGlzKTsNCiAgICB9DQogIH0NCiAgaWYgKCFfZWFjaCkgX2VhY2ggPSBlYWNoOw0KDQogIGZ1bmN0aW9uIGNsZWFyKCkgew0KICAgIHRoaXMubGVuZ3RoID0gMDsNCiAgICByZXR1cm4gdGhpczsNCiAgfQ0KDQogIGZ1bmN0aW9uIGZpcnN0KCkgew0KICAgIHJldHVybiB0aGlzWzBdOw0KICB9DQoNCiAgZnVuY3Rpb24gbGFzdCgpIHsNCiAgICByZXR1cm4gdGhpc1t0aGlzLmxlbmd0aCAtIDFdOw0KICB9DQoNCiAgZnVuY3Rpb24gY29tcGFjdCgpIHsNCiAgICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24odmFsdWUpIHsNCiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsOw0KICAgIH0pOw0KICB9DQoNCiAgZnVuY3Rpb24gZmxhdHRlbigpIHsNCiAgICByZXR1cm4gdGhpcy5pbmplY3QoW10sIGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSkgew0KICAgICAgaWYgKE9iamVjdC5pc0FycmF5KHZhbHVlKSkNCiAgICAgICAgcmV0dXJuIGFycmF5LmNvbmNhdCh2YWx1ZS5mbGF0dGVuKCkpOw0KICAgICAgYXJyYXkucHVzaCh2YWx1ZSk7DQogICAgICByZXR1cm4gYXJyYXk7DQogICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiB3aXRob3V0KCkgew0KICAgIHZhciB2YWx1ZXMgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7DQogICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgICByZXR1cm4gIXZhbHVlcy5pbmNsdWRlKHZhbHVlKTsNCiAgICB9KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHJldmVyc2UoaW5saW5lKSB7DQogICAgcmV0dXJuIChpbmxpbmUgPT09IGZhbHNlID8gdGhpcy50b0FycmF5KCkgOiB0aGlzKS5fcmV2ZXJzZSgpOw0KICB9DQoNCiAgZnVuY3Rpb24gdW5pcShzb3J0ZWQpIHsNCiAgICByZXR1cm4gdGhpcy5pbmplY3QoW10sIGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSwgaW5kZXgpIHsNCiAgICAgIGlmICgwID09IGluZGV4IHx8IChzb3J0ZWQgPyBhcnJheS5sYXN0KCkgIT0gdmFsdWUgOiAhYXJyYXkuaW5jbHVkZSh2YWx1ZSkpKQ0KICAgICAgICBhcnJheS5wdXNoKHZhbHVlKTsNCiAgICAgIHJldHVybiBhcnJheTsNCiAgICB9KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGludGVyc2VjdChhcnJheSkgew0KICAgIHJldHVybiB0aGlzLnVuaXEoKS5maW5kQWxsKGZ1bmN0aW9uKGl0ZW0pIHsNCiAgICAgIHJldHVybiBhcnJheS5kZXRlY3QoZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIGl0ZW0gPT09IHZhbHVlIH0pOw0KICAgIH0pOw0KICB9DQoNCg0KICBmdW5jdGlvbiBjbG9uZSgpIHsNCiAgICByZXR1cm4gc2xpY2UuY2FsbCh0aGlzLCAwKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHNpemUoKSB7DQogICAgcmV0dXJuIHRoaXMubGVuZ3RoOw0KICB9DQoNCiAgZnVuY3Rpb24gaW5zcGVjdCgpIHsNCiAgICByZXR1cm4gJ1snICsgdGhpcy5tYXAoT2JqZWN0Lmluc3BlY3QpLmpvaW4oJywgJykgKyAnXSc7DQogIH0NCg0KICBmdW5jdGlvbiBpbmRleE9mKGl0ZW0sIGkpIHsNCiAgICBpIHx8IChpID0gMCk7DQogICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoOw0KICAgIGlmIChpIDwgMCkgaSA9IGxlbmd0aCArIGk7DQogICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykNCiAgICAgIGlmICh0aGlzW2ldID09PSBpdGVtKSByZXR1cm4gaTsNCiAgICByZXR1cm4gLTE7DQogIH0NCg0KICBmdW5jdGlvbiBsYXN0SW5kZXhPZihpdGVtLCBpKSB7DQogICAgaSA9IGlzTmFOKGkpID8gdGhpcy5sZW5ndGggOiAoaSA8IDAgPyB0aGlzLmxlbmd0aCArIGkgOiBpKSArIDE7DQogICAgdmFyIG4gPSB0aGlzLnNsaWNlKDAsIGkpLnJldmVyc2UoKS5pbmRleE9mKGl0ZW0pOw0KICAgIHJldHVybiAobiA8IDApID8gbiA6IGkgLSBuIC0gMTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGNvbmNhdCgpIHsNCiAgICB2YXIgYXJyYXkgPSBzbGljZS5jYWxsKHRoaXMsIDApLCBpdGVtOw0KICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgIGl0ZW0gPSBhcmd1bWVudHNbaV07DQogICAgICBpZiAoT2JqZWN0LmlzQXJyYXkoaXRlbSkgJiYgISgnY2FsbGVlJyBpbiBpdGVtKSkgew0KICAgICAgICBmb3IgKHZhciBqID0gMCwgYXJyYXlMZW5ndGggPSBpdGVtLmxlbmd0aDsgaiA8IGFycmF5TGVuZ3RoOyBqKyspDQogICAgICAgICAgYXJyYXkucHVzaChpdGVtW2pdKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGFycmF5LnB1c2goaXRlbSk7DQogICAgICB9DQogICAgfQ0KICAgIHJldHVybiBhcnJheTsNCiAgfQ0KDQogIE9iamVjdC5leHRlbmQoYXJyYXlQcm90bywgRW51bWVyYWJsZSk7DQoNCiAgaWYgKCFhcnJheVByb3RvLl9yZXZlcnNlKQ0KICAgIGFycmF5UHJvdG8uX3JldmVyc2UgPSBhcnJheVByb3RvLnJldmVyc2U7DQoNCiAgT2JqZWN0LmV4dGVuZChhcnJheVByb3RvLCB7DQogICAgX2VhY2g6ICAgICBfZWFjaCwNCiAgICBjbGVhcjogICAgIGNsZWFyLA0KICAgIGZpcnN0OiAgICAgZmlyc3QsDQogICAgbGFzdDogICAgICBsYXN0LA0KICAgIGNvbXBhY3Q6ICAgY29tcGFjdCwNCiAgICBmbGF0dGVuOiAgIGZsYXR0ZW4sDQogICAgd2l0aG91dDogICB3aXRob3V0LA0KICAgIHJldmVyc2U6ICAgcmV2ZXJzZSwNCiAgICB1bmlxOiAgICAgIHVuaXEsDQogICAgaW50ZXJzZWN0OiBpbnRlcnNlY3QsDQogICAgY2xvbmU6ICAgICBjbG9uZSwNCiAgICB0b0FycmF5OiAgIGNsb25lLA0KICAgIHNpemU6ICAgICAgc2l6ZSwNCiAgICBpbnNwZWN0OiAgIGluc3BlY3QNCiAgfSk7DQoNCiAgdmFyIENPTkNBVF9BUkdVTUVOVFNfQlVHR1kgPSAoZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIFtdLmNvbmNhdChhcmd1bWVudHMpWzBdWzBdICE9PSAxOw0KICB9KSgxLDIpDQoNCiAgaWYgKENPTkNBVF9BUkdVTUVOVFNfQlVHR1kpIGFycmF5UHJvdG8uY29uY2F0ID0gY29uY2F0Ow0KDQogIGlmICghYXJyYXlQcm90by5pbmRleE9mKSBhcnJheVByb3RvLmluZGV4T2YgPSBpbmRleE9mOw0KICBpZiAoIWFycmF5UHJvdG8ubGFzdEluZGV4T2YpIGFycmF5UHJvdG8ubGFzdEluZGV4T2YgPSBsYXN0SW5kZXhPZjsNCn0pKCk7DQpmdW5jdGlvbiAkSChvYmplY3QpIHsNCiAgcmV0dXJuIG5ldyBIYXNoKG9iamVjdCk7DQp9Ow0KDQp2YXIgSGFzaCA9IENsYXNzLmNyZWF0ZShFbnVtZXJhYmxlLCAoZnVuY3Rpb24oKSB7DQogIGZ1bmN0aW9uIGluaXRpYWxpemUob2JqZWN0KSB7DQogICAgdGhpcy5fb2JqZWN0ID0gT2JqZWN0LmlzSGFzaChvYmplY3QpID8gb2JqZWN0LnRvT2JqZWN0KCkgOiBPYmplY3QuY2xvbmUob2JqZWN0KTsNCiAgfQ0KDQoNCiAgZnVuY3Rpb24gX2VhY2goaXRlcmF0b3IpIHsNCiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fb2JqZWN0KSB7DQogICAgICB2YXIgdmFsdWUgPSB0aGlzLl9vYmplY3Rba2V5XSwgcGFpciA9IFtrZXksIHZhbHVlXTsNCiAgICAgIHBhaXIua2V5ID0ga2V5Ow0KICAgICAgcGFpci52YWx1ZSA9IHZhbHVlOw0KICAgICAgaXRlcmF0b3IocGFpcik7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHsNCiAgICByZXR1cm4gdGhpcy5fb2JqZWN0W2tleV0gPSB2YWx1ZTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGdldChrZXkpIHsNCiAgICBpZiAodGhpcy5fb2JqZWN0W2tleV0gIT09IE9iamVjdC5wcm90b3R5cGVba2V5XSkNCiAgICAgIHJldHVybiB0aGlzLl9vYmplY3Rba2V5XTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHVuc2V0KGtleSkgew0KICAgIHZhciB2YWx1ZSA9IHRoaXMuX29iamVjdFtrZXldOw0KICAgIGRlbGV0ZSB0aGlzLl9vYmplY3Rba2V5XTsNCiAgICByZXR1cm4gdmFsdWU7DQogIH0NCg0KICBmdW5jdGlvbiB0b09iamVjdCgpIHsNCiAgICByZXR1cm4gT2JqZWN0LmNsb25lKHRoaXMuX29iamVjdCk7DQogIH0NCg0KDQoNCiAgZnVuY3Rpb24ga2V5cygpIHsNCiAgICByZXR1cm4gdGhpcy5wbHVjaygna2V5Jyk7DQogIH0NCg0KICBmdW5jdGlvbiB2YWx1ZXMoKSB7DQogICAgcmV0dXJuIHRoaXMucGx1Y2soJ3ZhbHVlJyk7DQogIH0NCg0KICBmdW5jdGlvbiBpbmRleCh2YWx1ZSkgew0KICAgIHZhciBtYXRjaCA9IHRoaXMuZGV0ZWN0KGZ1bmN0aW9uKHBhaXIpIHsNCiAgICAgIHJldHVybiBwYWlyLnZhbHVlID09PSB2YWx1ZTsNCiAgICB9KTsNCiAgICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2gua2V5Ow0KICB9DQoNCiAgZnVuY3Rpb24gbWVyZ2Uob2JqZWN0KSB7DQogICAgcmV0dXJuIHRoaXMuY2xvbmUoKS51cGRhdGUob2JqZWN0KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHVwZGF0ZShvYmplY3QpIHsNCiAgICByZXR1cm4gbmV3IEhhc2gob2JqZWN0KS5pbmplY3QodGhpcywgZnVuY3Rpb24ocmVzdWx0LCBwYWlyKSB7DQogICAgICByZXN1bHQuc2V0KHBhaXIua2V5LCBwYWlyLnZhbHVlKTsNCiAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiB0b1F1ZXJ5UGFpcihrZXksIHZhbHVlKSB7DQogICAgaWYgKE9iamVjdC5pc1VuZGVmaW5lZCh2YWx1ZSkpIHJldHVybiBrZXk7DQogICAgcmV0dXJuIGtleSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcuaW50ZXJwcmV0KHZhbHVlKSk7DQogIH0NCg0KICBmdW5jdGlvbiB0b1F1ZXJ5U3RyaW5nKCkgew0KICAgIHJldHVybiB0aGlzLmluamVjdChbXSwgZnVuY3Rpb24ocmVzdWx0cywgcGFpcikgew0KICAgICAgdmFyIGtleSA9IGVuY29kZVVSSUNvbXBvbmVudChwYWlyLmtleSksIHZhbHVlcyA9IHBhaXIudmFsdWU7DQoNCiAgICAgIGlmICh2YWx1ZXMgJiYgdHlwZW9mIHZhbHVlcyA9PSAnb2JqZWN0Jykgew0KICAgICAgICBpZiAoT2JqZWN0LmlzQXJyYXkodmFsdWVzKSkgew0KICAgICAgICAgIHZhciBxdWVyeVZhbHVlcyA9IFtdOw0KICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoLCB2YWx1ZTsgaSA8IGxlbjsgaSsrKSB7DQogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1tpXTsNCiAgICAgICAgICAgIHF1ZXJ5VmFsdWVzLnB1c2godG9RdWVyeVBhaXIoa2V5LCB2YWx1ZSkpOw0KICAgICAgICAgIH0NCiAgICAgICAgICByZXR1cm4gcmVzdWx0cy5jb25jYXQocXVlcnlWYWx1ZXMpOw0KICAgICAgICB9DQogICAgICB9IGVsc2UgcmVzdWx0cy5wdXNoKHRvUXVlcnlQYWlyKGtleSwgdmFsdWVzKSk7DQogICAgICByZXR1cm4gcmVzdWx0czsNCiAgICB9KS5qb2luKCcmJyk7DQogIH0NCg0KICBmdW5jdGlvbiBpbnNwZWN0KCkgew0KICAgIHJldHVybiAnIzxIYXNoOnsnICsgdGhpcy5tYXAoZnVuY3Rpb24ocGFpcikgew0KICAgICAgcmV0dXJuIHBhaXIubWFwKE9iamVjdC5pbnNwZWN0KS5qb2luKCc6ICcpOw0KICAgIH0pLmpvaW4oJywgJykgKyAnfT4nOw0KICB9DQoNCiAgZnVuY3Rpb24gY2xvbmUoKSB7DQogICAgcmV0dXJuIG5ldyBIYXNoKHRoaXMpOw0KICB9DQoNCiAgcmV0dXJuIHsNCiAgICBpbml0aWFsaXplOiAgICAgICAgICAgICBpbml0aWFsaXplLA0KICAgIF9lYWNoOiAgICAgICAgICAgICAgICAgIF9lYWNoLA0KICAgIHNldDogICAgICAgICAgICAgICAgICAgIHNldCwNCiAgICBnZXQ6ICAgICAgICAgICAgICAgICAgICBnZXQsDQogICAgdW5zZXQ6ICAgICAgICAgICAgICAgICAgdW5zZXQsDQogICAgdG9PYmplY3Q6ICAgICAgICAgICAgICAgdG9PYmplY3QsDQogICAgdG9UZW1wbGF0ZVJlcGxhY2VtZW50czogdG9PYmplY3QsDQogICAga2V5czogICAgICAgICAgICAgICAgICAga2V5cywNCiAgICB2YWx1ZXM6ICAgICAgICAgICAgICAgICB2YWx1ZXMsDQogICAgaW5kZXg6ICAgICAgICAgICAgICAgICAgaW5kZXgsDQogICAgbWVyZ2U6ICAgICAgICAgICAgICAgICAgbWVyZ2UsDQogICAgdXBkYXRlOiAgICAgICAgICAgICAgICAgdXBkYXRlLA0KICAgIHRvUXVlcnlTdHJpbmc6ICAgICAgICAgIHRvUXVlcnlTdHJpbmcsDQogICAgaW5zcGVjdDogICAgICAgICAgICAgICAgaW5zcGVjdCwNCiAgICB0b0pTT046ICAgICAgICAgICAgICAgICB0b09iamVjdCwNCiAgICBjbG9uZTogICAgICAgICAgICAgICAgICBjbG9uZQ0KICB9Ow0KfSkoKSk7DQoNCkhhc2guZnJvbSA9ICRIOw0KT2JqZWN0LmV4dGVuZChOdW1iZXIucHJvdG90eXBlLCAoZnVuY3Rpb24oKSB7DQogIGZ1bmN0aW9uIHRvQ29sb3JQYXJ0KCkgew0KICAgIHJldHVybiB0aGlzLnRvUGFkZGVkU3RyaW5nKDIsIDE2KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHN1Y2MoKSB7DQogICAgcmV0dXJuIHRoaXMgKyAxOw0KICB9DQoNCiAgZnVuY3Rpb24gdGltZXMoaXRlcmF0b3IsIGNvbnRleHQpIHsNCiAgICAkUigwLCB0aGlzLCB0cnVlKS5lYWNoKGl0ZXJhdG9yLCBjb250ZXh0KTsNCiAgICByZXR1cm4gdGhpczsNCiAgfQ0KDQogIGZ1bmN0aW9uIHRvUGFkZGVkU3RyaW5nKGxlbmd0aCwgcmFkaXgpIHsNCiAgICB2YXIgc3RyaW5nID0gdGhpcy50b1N0cmluZyhyYWRpeCB8fCAxMCk7DQogICAgcmV0dXJuICcwJy50aW1lcyhsZW5ndGggLSBzdHJpbmcubGVuZ3RoKSArIHN0cmluZzsNCiAgfQ0KDQogIGZ1bmN0aW9uIGFicygpIHsNCiAgICByZXR1cm4gTWF0aC5hYnModGhpcyk7DQogIH0NCg0KICBmdW5jdGlvbiByb3VuZCgpIHsNCiAgICByZXR1cm4gTWF0aC5yb3VuZCh0aGlzKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGNlaWwoKSB7DQogICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGZsb29yKCkgew0KICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMpOw0KICB9DQoNCiAgcmV0dXJuIHsNCiAgICB0b0NvbG9yUGFydDogICAgdG9Db2xvclBhcnQsDQogICAgc3VjYzogICAgICAgICAgIHN1Y2MsDQogICAgdGltZXM6ICAgICAgICAgIHRpbWVzLA0KICAgIHRvUGFkZGVkU3RyaW5nOiB0b1BhZGRlZFN0cmluZywNCiAgICBhYnM6ICAgICAgICAgICAgYWJzLA0KICAgIHJvdW5kOiAgICAgICAgICByb3VuZCwNCiAgICBjZWlsOiAgICAgICAgICAgY2VpbCwNCiAgICBmbG9vcjogICAgICAgICAgZmxvb3INCiAgfTsNCn0pKCkpOw0KDQpmdW5jdGlvbiAkUihzdGFydCwgZW5kLCBleGNsdXNpdmUpIHsNCiAgcmV0dXJuIG5ldyBPYmplY3RSYW5nZShzdGFydCwgZW5kLCBleGNsdXNpdmUpOw0KfQ0KDQp2YXIgT2JqZWN0UmFuZ2UgPSBDbGFzcy5jcmVhdGUoRW51bWVyYWJsZSwgKGZ1bmN0aW9uKCkgew0KICBmdW5jdGlvbiBpbml0aWFsaXplKHN0YXJ0LCBlbmQsIGV4Y2x1c2l2ZSkgew0KICAgIHRoaXMuc3RhcnQgPSBzdGFydDsNCiAgICB0aGlzLmVuZCA9IGVuZDsNCiAgICB0aGlzLmV4Y2x1c2l2ZSA9IGV4Y2x1c2l2ZTsNCiAgfQ0KDQogIGZ1bmN0aW9uIF9lYWNoKGl0ZXJhdG9yKSB7DQogICAgdmFyIHZhbHVlID0gdGhpcy5zdGFydDsNCiAgICB3aGlsZSAodGhpcy5pbmNsdWRlKHZhbHVlKSkgew0KICAgICAgaXRlcmF0b3IodmFsdWUpOw0KICAgICAgdmFsdWUgPSB2YWx1ZS5zdWNjKCk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gaW5jbHVkZSh2YWx1ZSkgew0KICAgIGlmICh2YWx1ZSA8IHRoaXMuc3RhcnQpDQogICAgICByZXR1cm4gZmFsc2U7DQogICAgaWYgKHRoaXMuZXhjbHVzaXZlKQ0KICAgICAgcmV0dXJuIHZhbHVlIDwgdGhpcy5lbmQ7DQogICAgcmV0dXJuIHZhbHVlIDw9IHRoaXMuZW5kOw0KICB9DQoNCiAgcmV0dXJuIHsNCiAgICBpbml0aWFsaXplOiBpbml0aWFsaXplLA0KICAgIF9lYWNoOiAgICAgIF9lYWNoLA0KICAgIGluY2x1ZGU6ICAgIGluY2x1ZGUNCiAgfTsNCn0pKCkpOw0KDQoNCg0KdmFyIEFqYXggPSB7DQogIGdldFRyYW5zcG9ydDogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIFRyeS50aGVzZSgNCiAgICAgIGZ1bmN0aW9uKCkge3JldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKX0sDQogICAgICBmdW5jdGlvbigpIHtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQJyl9LA0KICAgICAgZnVuY3Rpb24oKSB7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpfQ0KICAgICkgfHwgZmFsc2U7DQogIH0sDQoNCiAgYWN0aXZlUmVxdWVzdENvdW50OiAwDQp9Ow0KDQpBamF4LlJlc3BvbmRlcnMgPSB7DQogIHJlc3BvbmRlcnM6IFtdLA0KDQogIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgew0KICAgIHRoaXMucmVzcG9uZGVycy5fZWFjaChpdGVyYXRvcik7DQogIH0sDQoNCiAgcmVnaXN0ZXI6IGZ1bmN0aW9uKHJlc3BvbmRlcikgew0KICAgIGlmICghdGhpcy5pbmNsdWRlKHJlc3BvbmRlcikpDQogICAgICB0aGlzLnJlc3BvbmRlcnMucHVzaChyZXNwb25kZXIpOw0KICB9LA0KDQogIHVucmVnaXN0ZXI6IGZ1bmN0aW9uKHJlc3BvbmRlcikgew0KICAgIHRoaXMucmVzcG9uZGVycyA9IHRoaXMucmVzcG9uZGVycy53aXRob3V0KHJlc3BvbmRlcik7DQogIH0sDQoNCiAgZGlzcGF0Y2g6IGZ1bmN0aW9uKGNhbGxiYWNrLCByZXF1ZXN0LCB0cmFuc3BvcnQsIGpzb24pIHsNCiAgICB0aGlzLmVhY2goZnVuY3Rpb24ocmVzcG9uZGVyKSB7DQogICAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24ocmVzcG9uZGVyW2NhbGxiYWNrXSkpIHsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICByZXNwb25kZXJbY2FsbGJhY2tdLmFwcGx5KHJlc3BvbmRlciwgW3JlcXVlc3QsIHRyYW5zcG9ydCwganNvbl0pOw0KICAgICAgICB9IGNhdGNoIChlKSB7IH0NCiAgICAgIH0NCiAgICB9KTsNCiAgfQ0KfTsNCg0KT2JqZWN0LmV4dGVuZChBamF4LlJlc3BvbmRlcnMsIEVudW1lcmFibGUpOw0KDQpBamF4LlJlc3BvbmRlcnMucmVnaXN0ZXIoew0KICBvbkNyZWF0ZTogICBmdW5jdGlvbigpIHsgQWpheC5hY3RpdmVSZXF1ZXN0Q291bnQrKyB9LA0KICBvbkNvbXBsZXRlOiBmdW5jdGlvbigpIHsgQWpheC5hY3RpdmVSZXF1ZXN0Q291bnQtLSB9DQp9KTsNCkFqYXguQmFzZSA9IENsYXNzLmNyZWF0ZSh7DQogIGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHsNCiAgICB0aGlzLm9wdGlvbnMgPSB7DQogICAgICBtZXRob2Q6ICAgICAgICdwb3N0JywNCiAgICAgIGFzeW5jaHJvbm91czogdHJ1ZSwNCiAgICAgIGNvbnRlbnRUeXBlOiAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsDQogICAgICBlbmNvZGluZzogICAgICdVVEYtOCcsDQogICAgICBwYXJhbWV0ZXJzOiAgICcnLA0KICAgICAgZXZhbEpTT046ICAgICB0cnVlLA0KICAgICAgZXZhbEpTOiAgICAgICB0cnVlDQogICAgfTsNCiAgICBPYmplY3QuZXh0ZW5kKHRoaXMub3B0aW9ucywgb3B0aW9ucyB8fCB7IH0pOw0KDQogICAgdGhpcy5vcHRpb25zLm1ldGhvZCA9IHRoaXMub3B0aW9ucy5tZXRob2QudG9Mb3dlckNhc2UoKTsNCg0KICAgIGlmIChPYmplY3QuaXNIYXNoKHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzKSkNCiAgICAgIHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzID0gdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMudG9PYmplY3QoKTsNCiAgfQ0KfSk7DQpBamF4LlJlcXVlc3QgPSBDbGFzcy5jcmVhdGUoQWpheC5CYXNlLCB7DQogIF9jb21wbGV0ZTogZmFsc2UsDQoNCiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oJHN1cGVyLCB1cmwsIG9wdGlvbnMpIHsNCiAgICAkc3VwZXIob3B0aW9ucyk7DQogICAgdGhpcy50cmFuc3BvcnQgPSBBamF4LmdldFRyYW5zcG9ydCgpOw0KICAgIHRoaXMucmVxdWVzdCh1cmwpOw0KICB9LA0KDQogIHJlcXVlc3Q6IGZ1bmN0aW9uKHVybCkgew0KICAgIHRoaXMudXJsID0gdXJsOw0KICAgIHRoaXMubWV0aG9kID0gdGhpcy5vcHRpb25zLm1ldGhvZDsNCiAgICB2YXIgcGFyYW1zID0gT2JqZWN0LmlzU3RyaW5nKHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzKSA/DQogICAgICAgICAgdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMgOg0KICAgICAgICAgIE9iamVjdC50b1F1ZXJ5U3RyaW5nKHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzKTsNCg0KICAgIGlmICghWydnZXQnLCAncG9zdCddLmluY2x1ZGUodGhpcy5tZXRob2QpKSB7DQogICAgICBwYXJhbXMgKz0gKHBhcmFtcyA/ICcmJyA6ICcnKSArICJfbWV0aG9kPSIgKyB0aGlzLm1ldGhvZDsNCiAgICAgIHRoaXMubWV0aG9kID0gJ3Bvc3QnOw0KICAgIH0NCg0KICAgIGlmIChwYXJhbXMgJiYgdGhpcy5tZXRob2QgPT09ICdnZXQnKSB7DQogICAgICB0aGlzLnVybCArPSAodGhpcy51cmwuaW5jbHVkZSgnPycpID8gJyYnIDogJz8nKSArIHBhcmFtczsNCiAgICB9DQoNCiAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbXMudG9RdWVyeVBhcmFtcygpOw0KDQogICAgdHJ5IHsNCiAgICAgIHZhciByZXNwb25zZSA9IG5ldyBBamF4LlJlc3BvbnNlKHRoaXMpOw0KICAgICAgaWYgKHRoaXMub3B0aW9ucy5vbkNyZWF0ZSkgdGhpcy5vcHRpb25zLm9uQ3JlYXRlKHJlc3BvbnNlKTsNCiAgICAgIEFqYXguUmVzcG9uZGVycy5kaXNwYXRjaCgnb25DcmVhdGUnLCB0aGlzLCByZXNwb25zZSk7DQoNCiAgICAgIHRoaXMudHJhbnNwb3J0Lm9wZW4odGhpcy5tZXRob2QudG9VcHBlckNhc2UoKSwgdGhpcy51cmwsDQogICAgICAgIHRoaXMub3B0aW9ucy5hc3luY2hyb25vdXMpOw0KDQogICAgICBpZiAodGhpcy5vcHRpb25zLmFzeW5jaHJvbm91cykgdGhpcy5yZXNwb25kVG9SZWFkeVN0YXRlLmJpbmQodGhpcykuZGVmZXIoMSk7DQoNCiAgICAgIHRoaXMudHJhbnNwb3J0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpOw0KICAgICAgdGhpcy5zZXRSZXF1ZXN0SGVhZGVycygpOw0KDQogICAgICB0aGlzLmJvZHkgPSB0aGlzLm1ldGhvZCA9PSAncG9zdCcgPyAodGhpcy5vcHRpb25zLnBvc3RCb2R5IHx8IHBhcmFtcykgOiBudWxsOw0KICAgICAgdGhpcy50cmFuc3BvcnQuc2VuZCh0aGlzLmJvZHkpOw0KDQogICAgICAvKiBGb3JjZSBGaXJlZm94IHRvIGhhbmRsZSByZWFkeSBzdGF0ZSA0IGZvciBzeW5jaHJvbm91cyByZXF1ZXN0cyAqLw0KICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYXN5bmNocm9ub3VzICYmIHRoaXMudHJhbnNwb3J0Lm92ZXJyaWRlTWltZVR5cGUpDQogICAgICAgIHRoaXMub25TdGF0ZUNoYW5nZSgpOw0KDQogICAgfQ0KICAgIGNhdGNoIChlKSB7DQogICAgICB0aGlzLmRpc3BhdGNoRXhjZXB0aW9uKGUpOw0KICAgIH0NCiAgfSwNCg0KICBvblN0YXRlQ2hhbmdlOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgcmVhZHlTdGF0ZSA9IHRoaXMudHJhbnNwb3J0LnJlYWR5U3RhdGU7DQogICAgaWYgKHJlYWR5U3RhdGUgPiAxICYmICEoKHJlYWR5U3RhdGUgPT0gNCkgJiYgdGhpcy5fY29tcGxldGUpKQ0KICAgICAgdGhpcy5yZXNwb25kVG9SZWFkeVN0YXRlKHRoaXMudHJhbnNwb3J0LnJlYWR5U3RhdGUpOw0KICB9LA0KDQogIHNldFJlcXVlc3RIZWFkZXJzOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgaGVhZGVycyA9IHsNCiAgICAgICdYLVJlcXVlc3RlZC1XaXRoJzogJ1hNTEh0dHBSZXF1ZXN0JywNCiAgICAgICdYLVByb3RvdHlwZS1WZXJzaW9uJzogUHJvdG90eXBlLlZlcnNpb24sDQogICAgICAnQWNjZXB0JzogJ3RleHQvamF2YXNjcmlwdCwgdGV4dC9odG1sLCBhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sLCAqLyonDQogICAgfTsNCg0KICAgIGlmICh0aGlzLm1ldGhvZCA9PSAncG9zdCcpIHsNCiAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtdHlwZSddID0gdGhpcy5vcHRpb25zLmNvbnRlbnRUeXBlICsNCiAgICAgICAgKHRoaXMub3B0aW9ucy5lbmNvZGluZyA/ICc7IGNoYXJzZXQ9JyArIHRoaXMub3B0aW9ucy5lbmNvZGluZyA6ICcnKTsNCg0KICAgICAgLyogRm9yY2UgIkNvbm5lY3Rpb246IGNsb3NlIiBmb3Igb2xkZXIgTW96aWxsYSBicm93c2VycyB0byB3b3JrDQogICAgICAgKiBhcm91bmQgYSBidWcgd2hlcmUgWE1MSHR0cFJlcXVlc3Qgc2VuZHMgYW4gaW5jb3JyZWN0DQogICAgICAgKiBDb250ZW50LWxlbmd0aCBoZWFkZXIuIFNlZSBNb3ppbGxhIEJ1Z3ppbGxhICMyNDY2NTEuDQogICAgICAgKi8NCiAgICAgIGlmICh0aGlzLnRyYW5zcG9ydC5vdmVycmlkZU1pbWVUeXBlICYmDQogICAgICAgICAgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0dlY2tvXC8oXGR7NH0pLykgfHwgWzAsMjAwNV0pWzFdIDwgMjAwNSkNCiAgICAgICAgICAgIGhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSA9ICdjbG9zZSc7DQogICAgfQ0KDQogICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMucmVxdWVzdEhlYWRlcnMgPT0gJ29iamVjdCcpIHsNCiAgICAgIHZhciBleHRyYXMgPSB0aGlzLm9wdGlvbnMucmVxdWVzdEhlYWRlcnM7DQoNCiAgICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbihleHRyYXMucHVzaCkpDQogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBleHRyYXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpICs9IDIpDQogICAgICAgICAgaGVhZGVyc1tleHRyYXNbaV1dID0gZXh0cmFzW2krMV07DQogICAgICBlbHNlDQogICAgICAgICRIKGV4dHJhcykuZWFjaChmdW5jdGlvbihwYWlyKSB7IGhlYWRlcnNbcGFpci5rZXldID0gcGFpci52YWx1ZSB9KTsNCiAgICB9DQoNCiAgICBmb3IgKHZhciBuYW1lIGluIGhlYWRlcnMpDQogICAgICB0aGlzLnRyYW5zcG9ydC5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIGhlYWRlcnNbbmFtZV0pOw0KICB9LA0KDQogIHN1Y2Nlc3M6IGZ1bmN0aW9uKCkgew0KICAgIHZhciBzdGF0dXMgPSB0aGlzLmdldFN0YXR1cygpOw0KICAgIHJldHVybiAhc3RhdHVzIHx8IChzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCkgfHwgc3RhdHVzID09IDMwNDsNCiAgfSwNCg0KICBnZXRTdGF0dXM6IGZ1bmN0aW9uKCkgew0KICAgIHRyeSB7DQogICAgICBpZiAodGhpcy50cmFuc3BvcnQuc3RhdHVzID09PSAxMjIzKSByZXR1cm4gMjA0Ow0KICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0LnN0YXR1cyB8fCAwOw0KICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIDAgfQ0KICB9LA0KDQogIHJlc3BvbmRUb1JlYWR5U3RhdGU6IGZ1bmN0aW9uKHJlYWR5U3RhdGUpIHsNCiAgICB2YXIgc3RhdGUgPSBBamF4LlJlcXVlc3QuRXZlbnRzW3JlYWR5U3RhdGVdLCByZXNwb25zZSA9IG5ldyBBamF4LlJlc3BvbnNlKHRoaXMpOw0KDQogICAgaWYgKHN0YXRlID09ICdDb21wbGV0ZScpIHsNCiAgICAgIHRyeSB7DQogICAgICAgIHRoaXMuX2NvbXBsZXRlID0gdHJ1ZTsNCiAgICAgICAgKHRoaXMub3B0aW9uc1snb24nICsgcmVzcG9uc2Uuc3RhdHVzXQ0KICAgICAgICAgfHwgdGhpcy5vcHRpb25zWydvbicgKyAodGhpcy5zdWNjZXNzKCkgPyAnU3VjY2VzcycgOiAnRmFpbHVyZScpXQ0KICAgICAgICAgfHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pKHJlc3BvbnNlLCByZXNwb25zZS5oZWFkZXJKU09OKTsNCiAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgdGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKTsNCiAgICAgIH0NCg0KICAgICAgdmFyIGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuZ2V0SGVhZGVyKCdDb250ZW50LXR5cGUnKTsNCiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXZhbEpTID09ICdmb3JjZScNCiAgICAgICAgICB8fCAodGhpcy5vcHRpb25zLmV2YWxKUyAmJiB0aGlzLmlzU2FtZU9yaWdpbigpICYmIGNvbnRlbnRUeXBlDQogICAgICAgICAgJiYgY29udGVudFR5cGUubWF0Y2goL15ccyoodGV4dHxhcHBsaWNhdGlvbilcLyh4LSk/KGphdmF8ZWNtYSlzY3JpcHQoOy4qKT9ccyokL2kpKSkNCiAgICAgICAgdGhpcy5ldmFsUmVzcG9uc2UoKTsNCiAgICB9DQoNCiAgICB0cnkgew0KICAgICAgKHRoaXMub3B0aW9uc1snb24nICsgc3RhdGVdIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKShyZXNwb25zZSwgcmVzcG9uc2UuaGVhZGVySlNPTik7DQogICAgICBBamF4LlJlc3BvbmRlcnMuZGlzcGF0Y2goJ29uJyArIHN0YXRlLCB0aGlzLCByZXNwb25zZSwgcmVzcG9uc2UuaGVhZGVySlNPTik7DQogICAgfSBjYXRjaCAoZSkgew0KICAgICAgdGhpcy5kaXNwYXRjaEV4Y2VwdGlvbihlKTsNCiAgICB9DQoNCiAgICBpZiAoc3RhdGUgPT0gJ0NvbXBsZXRlJykgew0KICAgICAgdGhpcy50cmFuc3BvcnQub25yZWFkeXN0YXRlY2hhbmdlID0gUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247DQogICAgfQ0KICB9LA0KDQogIGlzU2FtZU9yaWdpbjogZnVuY3Rpb24oKSB7DQogICAgdmFyIG0gPSB0aGlzLnVybC5tYXRjaCgvXlxzKmh0dHBzPzpcL1wvW15cL10qLyk7DQogICAgcmV0dXJuICFtIHx8IChtWzBdID09ICcje3Byb3RvY29sfS8vI3tkb21haW59I3twb3J0fScuaW50ZXJwb2xhdGUoew0KICAgICAgcHJvdG9jb2w6IGxvY2F0aW9uLnByb3RvY29sLA0KICAgICAgZG9tYWluOiBkb2N1bWVudC5kb21haW4sDQogICAgICBwb3J0OiBsb2NhdGlvbi5wb3J0ID8gJzonICsgbG9jYXRpb24ucG9ydCA6ICcnDQogICAgfSkpOw0KICB9LA0KDQogIGdldEhlYWRlcjogZnVuY3Rpb24obmFtZSkgew0KICAgIHRyeSB7DQogICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSkgfHwgbnVsbDsNCiAgICB9IGNhdGNoIChlKSB7IHJldHVybiBudWxsOyB9DQogIH0sDQoNCiAgZXZhbFJlc3BvbnNlOiBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgcmV0dXJuIGV2YWwoKHRoaXMudHJhbnNwb3J0LnJlc3BvbnNlVGV4dCB8fCAnJykudW5maWx0ZXJKU09OKCkpOw0KICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgIHRoaXMuZGlzcGF0Y2hFeGNlcHRpb24oZSk7DQogICAgfQ0KICB9LA0KDQogIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHsNCiAgICAodGhpcy5vcHRpb25zLm9uRXhjZXB0aW9uIHx8IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uKSh0aGlzLCBleGNlcHRpb24pOw0KICAgIEFqYXguUmVzcG9uZGVycy5kaXNwYXRjaCgnb25FeGNlcHRpb24nLCB0aGlzLCBleGNlcHRpb24pOw0KICB9DQp9KTsNCg0KQWpheC5SZXF1ZXN0LkV2ZW50cyA9DQogIFsnVW5pbml0aWFsaXplZCcsICdMb2FkaW5nJywgJ0xvYWRlZCcsICdJbnRlcmFjdGl2ZScsICdDb21wbGV0ZSddOw0KDQoNCg0KDQoNCg0KDQoNCkFqYXguUmVzcG9uc2UgPSBDbGFzcy5jcmVhdGUoew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihyZXF1ZXN0KXsNCiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0Ow0KICAgIHZhciB0cmFuc3BvcnQgID0gdGhpcy50cmFuc3BvcnQgID0gcmVxdWVzdC50cmFuc3BvcnQsDQogICAgICAgIHJlYWR5U3RhdGUgPSB0aGlzLnJlYWR5U3RhdGUgPSB0cmFuc3BvcnQucmVhZHlTdGF0ZTsNCg0KICAgIGlmICgocmVhZHlTdGF0ZSA+IDIgJiYgIVByb3RvdHlwZS5Ccm93c2VyLklFKSB8fCByZWFkeVN0YXRlID09IDQpIHsNCiAgICAgIHRoaXMuc3RhdHVzICAgICAgID0gdGhpcy5nZXRTdGF0dXMoKTsNCiAgICAgIHRoaXMuc3RhdHVzVGV4dCAgID0gdGhpcy5nZXRTdGF0dXNUZXh0KCk7DQogICAgICB0aGlzLnJlc3BvbnNlVGV4dCA9IFN0cmluZy5pbnRlcnByZXQodHJhbnNwb3J0LnJlc3BvbnNlVGV4dCk7DQogICAgICB0aGlzLmhlYWRlckpTT04gICA9IHRoaXMuX2dldEhlYWRlckpTT04oKTsNCiAgICB9DQoNCiAgICBpZiAocmVhZHlTdGF0ZSA9PSA0KSB7DQogICAgICB2YXIgeG1sID0gdHJhbnNwb3J0LnJlc3BvbnNlWE1MOw0KICAgICAgdGhpcy5yZXNwb25zZVhNTCAgPSBPYmplY3QuaXNVbmRlZmluZWQoeG1sKSA/IG51bGwgOiB4bWw7DQogICAgICB0aGlzLnJlc3BvbnNlSlNPTiA9IHRoaXMuX2dldFJlc3BvbnNlSlNPTigpOw0KICAgIH0NCiAgfSwNCg0KICBzdGF0dXM6ICAgICAgMCwNCg0KICBzdGF0dXNUZXh0OiAnJywNCg0KICBnZXRTdGF0dXM6IEFqYXguUmVxdWVzdC5wcm90b3R5cGUuZ2V0U3RhdHVzLA0KDQogIGdldFN0YXR1c1RleHQ6IGZ1bmN0aW9uKCkgew0KICAgIHRyeSB7DQogICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuc3RhdHVzVGV4dCB8fCAnJzsNCiAgICB9IGNhdGNoIChlKSB7IHJldHVybiAnJyB9DQogIH0sDQoNCiAgZ2V0SGVhZGVyOiBBamF4LlJlcXVlc3QucHJvdG90eXBlLmdldEhlYWRlciwNCg0KICBnZXRBbGxIZWFkZXJzOiBmdW5jdGlvbigpIHsNCiAgICB0cnkgew0KICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7DQogICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gbnVsbCB9DQogIH0sDQoNCiAgZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKG5hbWUpIHsNCiAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0UmVzcG9uc2VIZWFkZXIobmFtZSk7DQogIH0sDQoNCiAgZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7DQogIH0sDQoNCiAgX2dldEhlYWRlckpTT046IGZ1bmN0aW9uKCkgew0KICAgIHZhciBqc29uID0gdGhpcy5nZXRIZWFkZXIoJ1gtSlNPTicpOw0KICAgIGlmICghanNvbikgcmV0dXJuIG51bGw7DQogICAganNvbiA9IGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoanNvbikpOw0KICAgIHRyeSB7DQogICAgICByZXR1cm4ganNvbi5ldmFsSlNPTih0aGlzLnJlcXVlc3Qub3B0aW9ucy5zYW5pdGl6ZUpTT04gfHwNCiAgICAgICAgIXRoaXMucmVxdWVzdC5pc1NhbWVPcmlnaW4oKSk7DQogICAgfSBjYXRjaCAoZSkgew0KICAgICAgdGhpcy5yZXF1ZXN0LmRpc3BhdGNoRXhjZXB0aW9uKGUpOw0KICAgIH0NCiAgfSwNCg0KICBfZ2V0UmVzcG9uc2VKU09OOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgb3B0aW9ucyA9IHRoaXMucmVxdWVzdC5vcHRpb25zOw0KICAgIGlmICghb3B0aW9ucy5ldmFsSlNPTiB8fCAob3B0aW9ucy5ldmFsSlNPTiAhPSAnZm9yY2UnICYmDQogICAgICAhKHRoaXMuZ2V0SGVhZGVyKCdDb250ZW50LXR5cGUnKSB8fCAnJykuaW5jbHVkZSgnYXBwbGljYXRpb24vanNvbicpKSB8fA0KICAgICAgICB0aGlzLnJlc3BvbnNlVGV4dC5ibGFuaygpKQ0KICAgICAgICAgIHJldHVybiBudWxsOw0KICAgIHRyeSB7DQogICAgICByZXR1cm4gdGhpcy5yZXNwb25zZVRleHQuZXZhbEpTT04ob3B0aW9ucy5zYW5pdGl6ZUpTT04gfHwNCiAgICAgICAgIXRoaXMucmVxdWVzdC5pc1NhbWVPcmlnaW4oKSk7DQogICAgfSBjYXRjaCAoZSkgew0KICAgICAgdGhpcy5yZXF1ZXN0LmRpc3BhdGNoRXhjZXB0aW9uKGUpOw0KICAgIH0NCiAgfQ0KfSk7DQoNCkFqYXguVXBkYXRlciA9IENsYXNzLmNyZWF0ZShBamF4LlJlcXVlc3QsIHsNCiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oJHN1cGVyLCBjb250YWluZXIsIHVybCwgb3B0aW9ucykgew0KICAgIHRoaXMuY29udGFpbmVyID0gew0KICAgICAgc3VjY2VzczogKGNvbnRhaW5lci5zdWNjZXNzIHx8IGNvbnRhaW5lciksDQogICAgICBmYWlsdXJlOiAoY29udGFpbmVyLmZhaWx1cmUgfHwgKGNvbnRhaW5lci5zdWNjZXNzID8gbnVsbCA6IGNvbnRhaW5lcikpDQogICAgfTsNCg0KICAgIG9wdGlvbnMgPSBPYmplY3QuY2xvbmUob3B0aW9ucyk7DQogICAgdmFyIG9uQ29tcGxldGUgPSBvcHRpb25zLm9uQ29tcGxldGU7DQogICAgb3B0aW9ucy5vbkNvbXBsZXRlID0gKGZ1bmN0aW9uKHJlc3BvbnNlLCBqc29uKSB7DQogICAgICB0aGlzLnVwZGF0ZUNvbnRlbnQocmVzcG9uc2UucmVzcG9uc2VUZXh0KTsNCiAgICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbihvbkNvbXBsZXRlKSkgb25Db21wbGV0ZShyZXNwb25zZSwganNvbik7DQogICAgfSkuYmluZCh0aGlzKTsNCg0KICAgICRzdXBlcih1cmwsIG9wdGlvbnMpOw0KICB9LA0KDQogIHVwZGF0ZUNvbnRlbnQ6IGZ1bmN0aW9uKHJlc3BvbnNlVGV4dCkgew0KICAgIHZhciByZWNlaXZlciA9IHRoaXMuY29udGFpbmVyW3RoaXMuc3VjY2VzcygpID8gJ3N1Y2Nlc3MnIDogJ2ZhaWx1cmUnXSwNCiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsNCg0KICAgIGlmICghb3B0aW9ucy5ldmFsU2NyaXB0cykgcmVzcG9uc2VUZXh0ID0gcmVzcG9uc2VUZXh0LnN0cmlwU2NyaXB0cygpOw0KDQogICAgaWYgKHJlY2VpdmVyID0gJChyZWNlaXZlcikpIHsNCiAgICAgIGlmIChvcHRpb25zLmluc2VydGlvbikgew0KICAgICAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKG9wdGlvbnMuaW5zZXJ0aW9uKSkgew0KICAgICAgICAgIHZhciBpbnNlcnRpb24gPSB7IH07IGluc2VydGlvbltvcHRpb25zLmluc2VydGlvbl0gPSByZXNwb25zZVRleHQ7DQogICAgICAgICAgcmVjZWl2ZXIuaW5zZXJ0KGluc2VydGlvbik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBvcHRpb25zLmluc2VydGlvbihyZWNlaXZlciwgcmVzcG9uc2VUZXh0KTsNCiAgICAgIH0NCiAgICAgIGVsc2UgcmVjZWl2ZXIudXBkYXRlKHJlc3BvbnNlVGV4dCk7DQogICAgfQ0KICB9DQp9KTsNCg0KQWpheC5QZXJpb2RpY2FsVXBkYXRlciA9IENsYXNzLmNyZWF0ZShBamF4LkJhc2UsIHsNCiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oJHN1cGVyLCBjb250YWluZXIsIHVybCwgb3B0aW9ucykgew0KICAgICRzdXBlcihvcHRpb25zKTsNCiAgICB0aGlzLm9uQ29tcGxldGUgPSB0aGlzLm9wdGlvbnMub25Db21wbGV0ZTsNCg0KICAgIHRoaXMuZnJlcXVlbmN5ID0gKHRoaXMub3B0aW9ucy5mcmVxdWVuY3kgfHwgMik7DQogICAgdGhpcy5kZWNheSA9ICh0aGlzLm9wdGlvbnMuZGVjYXkgfHwgMSk7DQoNCiAgICB0aGlzLnVwZGF0ZXIgPSB7IH07DQogICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7DQogICAgdGhpcy51cmwgPSB1cmw7DQoNCiAgICB0aGlzLnN0YXJ0KCk7DQogIH0sDQoNCiAgc3RhcnQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMub3B0aW9ucy5vbkNvbXBsZXRlID0gdGhpcy51cGRhdGVDb21wbGV0ZS5iaW5kKHRoaXMpOw0KICAgIHRoaXMub25UaW1lckV2ZW50KCk7DQogIH0sDQoNCiAgc3RvcDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy51cGRhdGVyLm9wdGlvbnMub25Db21wbGV0ZSA9IHVuZGVmaW5lZDsNCiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7DQogICAgKHRoaXMub25Db21wbGV0ZSB8fCBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbikuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgfSwNCg0KICB1cGRhdGVDb21wbGV0ZTogZnVuY3Rpb24ocmVzcG9uc2UpIHsNCiAgICBpZiAodGhpcy5vcHRpb25zLmRlY2F5KSB7DQogICAgICB0aGlzLmRlY2F5ID0gKHJlc3BvbnNlLnJlc3BvbnNlVGV4dCA9PSB0aGlzLmxhc3RUZXh0ID8NCiAgICAgICAgdGhpcy5kZWNheSAqIHRoaXMub3B0aW9ucy5kZWNheSA6IDEpOw0KDQogICAgICB0aGlzLmxhc3RUZXh0ID0gcmVzcG9uc2UucmVzcG9uc2VUZXh0Ow0KICAgIH0NCiAgICB0aGlzLnRpbWVyID0gdGhpcy5vblRpbWVyRXZlbnQuYmluZCh0aGlzKS5kZWxheSh0aGlzLmRlY2F5ICogdGhpcy5mcmVxdWVuY3kpOw0KICB9LA0KDQogIG9uVGltZXJFdmVudDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy51cGRhdGVyID0gbmV3IEFqYXguVXBkYXRlcih0aGlzLmNvbnRhaW5lciwgdGhpcy51cmwsIHRoaXMub3B0aW9ucyk7DQogIH0NCn0pOw0KDQoNCmZ1bmN0aW9uICQoZWxlbWVudCkgew0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsNCiAgICBmb3IgKHZhciBpID0gMCwgZWxlbWVudHMgPSBbXSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKQ0KICAgICAgZWxlbWVudHMucHVzaCgkKGFyZ3VtZW50c1tpXSkpOw0KICAgIHJldHVybiBlbGVtZW50czsNCiAgfQ0KICBpZiAoT2JqZWN0LmlzU3RyaW5nKGVsZW1lbnQpKQ0KICAgIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50KTsNCiAgcmV0dXJuIEVsZW1lbnQuZXh0ZW5kKGVsZW1lbnQpOw0KfQ0KDQppZiAoUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5YUGF0aCkgew0KICBkb2N1bWVudC5fZ2V0RWxlbWVudHNCeVhQYXRoID0gZnVuY3Rpb24oZXhwcmVzc2lvbiwgcGFyZW50RWxlbWVudCkgew0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIHF1ZXJ5ID0gZG9jdW1lbnQuZXZhbHVhdGUoZXhwcmVzc2lvbiwgJChwYXJlbnRFbGVtZW50KSB8fCBkb2N1bWVudCwNCiAgICAgIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTsNCiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gcXVlcnkuc25hcHNob3RMZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykNCiAgICAgIHJlc3VsdHMucHVzaChFbGVtZW50LmV4dGVuZChxdWVyeS5zbmFwc2hvdEl0ZW0oaSkpKTsNCiAgICByZXR1cm4gcmVzdWx0czsNCiAgfTsNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCmlmICghTm9kZSkgdmFyIE5vZGUgPSB7IH07DQoNCmlmICghTm9kZS5FTEVNRU5UX05PREUpIHsNCiAgT2JqZWN0LmV4dGVuZChOb2RlLCB7DQogICAgRUxFTUVOVF9OT0RFOiAxLA0KICAgIEFUVFJJQlVURV9OT0RFOiAyLA0KICAgIFRFWFRfTk9ERTogMywNCiAgICBDREFUQV9TRUNUSU9OX05PREU6IDQsDQogICAgRU5USVRZX1JFRkVSRU5DRV9OT0RFOiA1LA0KICAgIEVOVElUWV9OT0RFOiA2LA0KICAgIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTogNywNCiAgICBDT01NRU5UX05PREU6IDgsDQogICAgRE9DVU1FTlRfTk9ERTogOSwNCiAgICBET0NVTUVOVF9UWVBFX05PREU6IDEwLA0KICAgIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6IDExLA0KICAgIE5PVEFUSU9OX05PREU6IDEyDQogIH0pOw0KfQ0KDQoNCg0KKGZ1bmN0aW9uKGdsb2JhbCkgew0KICBmdW5jdGlvbiBzaG91bGRVc2VDYWNoZSh0YWdOYW1lLCBhdHRyaWJ1dGVzKSB7DQogICAgaWYgKHRhZ05hbWUgPT09ICdzZWxlY3QnKSByZXR1cm4gZmFsc2U7DQogICAgaWYgKCd0eXBlJyBpbiBhdHRyaWJ1dGVzKSByZXR1cm4gZmFsc2U7DQogICAgcmV0dXJuIHRydWU7DQogIH0NCg0KICB2YXIgSEFTX0VYVEVOREVEX0NSRUFURV9FTEVNRU5UX1NZTlRBWCA9IChmdW5jdGlvbigpew0KICAgIHRyeSB7DQogICAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCc8aW5wdXQgbmFtZT0ieCI+Jyk7DQogICAgICByZXR1cm4gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIGVsLm5hbWUgPT09ICd4JzsNCiAgICB9DQogICAgY2F0Y2goZXJyKSB7DQogICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KICB9KSgpOw0KDQogIHZhciBlbGVtZW50ID0gZ2xvYmFsLkVsZW1lbnQ7DQoNCiAgZ2xvYmFsLkVsZW1lbnQgPSBmdW5jdGlvbih0YWdOYW1lLCBhdHRyaWJ1dGVzKSB7DQogICAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMgfHwgeyB9Ow0KICAgIHRhZ05hbWUgPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCk7DQogICAgdmFyIGNhY2hlID0gRWxlbWVudC5jYWNoZTsNCg0KICAgIGlmIChIQVNfRVhURU5ERURfQ1JFQVRFX0VMRU1FTlRfU1lOVEFYICYmIGF0dHJpYnV0ZXMubmFtZSkgew0KICAgICAgdGFnTmFtZSA9ICc8JyArIHRhZ05hbWUgKyAnIG5hbWU9IicgKyBhdHRyaWJ1dGVzLm5hbWUgKyAnIj4nOw0KICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMubmFtZTsNCiAgICAgIHJldHVybiBFbGVtZW50LndyaXRlQXR0cmlidXRlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSksIGF0dHJpYnV0ZXMpOw0KICAgIH0NCg0KICAgIGlmICghY2FjaGVbdGFnTmFtZV0pIGNhY2hlW3RhZ05hbWVdID0gRWxlbWVudC5leHRlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKSk7DQoNCiAgICB2YXIgbm9kZSA9IHNob3VsZFVzZUNhY2hlKHRhZ05hbWUsIGF0dHJpYnV0ZXMpID8NCiAgICAgY2FjaGVbdGFnTmFtZV0uY2xvbmVOb2RlKGZhbHNlKSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7DQoNCiAgICByZXR1cm4gRWxlbWVudC53cml0ZUF0dHJpYnV0ZShub2RlLCBhdHRyaWJ1dGVzKTsNCiAgfTsNCg0KICBPYmplY3QuZXh0ZW5kKGdsb2JhbC5FbGVtZW50LCBlbGVtZW50IHx8IHsgfSk7DQogIGlmIChlbGVtZW50KSBnbG9iYWwuRWxlbWVudC5wcm90b3R5cGUgPSBlbGVtZW50LnByb3RvdHlwZTsNCg0KfSkodGhpcyk7DQoNCkVsZW1lbnQuaWRDb3VudGVyID0gMTsNCkVsZW1lbnQuY2FjaGUgPSB7IH07DQoNCkVsZW1lbnQuX3B1cmdlRWxlbWVudCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgdmFyIHVpZCA9IGVsZW1lbnQuX3Byb3RvdHlwZVVJRDsNCiAgaWYgKHVpZCkgew0KICAgIEVsZW1lbnQuc3RvcE9ic2VydmluZyhlbGVtZW50KTsNCiAgICBlbGVtZW50Ll9wcm90b3R5cGVVSUQgPSB2b2lkIDA7DQogICAgZGVsZXRlIEVsZW1lbnQuU3RvcmFnZVt1aWRdOw0KICB9DQp9DQoNCkVsZW1lbnQuTWV0aG9kcyA9IHsNCiAgdmlzaWJsZTogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIHJldHVybiAkKGVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnOw0KICB9LA0KDQogIHRvZ2dsZTogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIEVsZW1lbnRbRWxlbWVudC52aXNpYmxlKGVsZW1lbnQpID8gJ2hpZGUnIDogJ3Nob3cnXShlbGVtZW50KTsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfSwNCg0KICBoaWRlOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9LA0KDQogIHNob3c6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJzsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfSwNCg0KICByZW1vdmU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0sDQoNCiAgdXBkYXRlOiAoZnVuY3Rpb24oKXsNCg0KICAgIHZhciBTRUxFQ1RfRUxFTUVOVF9JTk5FUkhUTUxfQlVHR1kgPSAoZnVuY3Rpb24oKXsNCiAgICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLA0KICAgICAgICAgIGlzQnVnZ3kgPSB0cnVlOw0KICAgICAgZWwuaW5uZXJIVE1MID0gIjxvcHRpb24gdmFsdWU9XCJ0ZXN0XCI+dGVzdDwvb3B0aW9uPiI7DQogICAgICBpZiAoZWwub3B0aW9ucyAmJiBlbC5vcHRpb25zWzBdKSB7DQogICAgICAgIGlzQnVnZ3kgPSBlbC5vcHRpb25zWzBdLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgIT09ICJPUFRJT04iOw0KICAgICAgfQ0KICAgICAgZWwgPSBudWxsOw0KICAgICAgcmV0dXJuIGlzQnVnZ3k7DQogICAgfSkoKTsNCg0KICAgIHZhciBUQUJMRV9FTEVNRU5UX0lOTkVSSFRNTF9CVUdHWSA9IChmdW5jdGlvbigpew0KICAgICAgdHJ5IHsNCiAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGFibGUiKTsNCiAgICAgICAgaWYgKGVsICYmIGVsLnRCb2RpZXMpIHsNCiAgICAgICAgICBlbC5pbm5lckhUTUwgPSAiPHRib2R5Pjx0cj48dGQ+dGVzdDwvdGQ+PC90cj48L3Rib2R5PiI7DQogICAgICAgICAgdmFyIGlzQnVnZ3kgPSB0eXBlb2YgZWwudEJvZGllc1swXSA9PSAidW5kZWZpbmVkIjsNCiAgICAgICAgICBlbCA9IG51bGw7DQogICAgICAgICAgcmV0dXJuIGlzQnVnZ3k7DQogICAgICAgIH0NCiAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICB9DQogICAgfSkoKTsNCg0KICAgIHZhciBMSU5LX0VMRU1FTlRfSU5ORVJIVE1MX0JVR0dZID0gKGZ1bmN0aW9uKCkgew0KICAgICAgdHJ5IHsNCiAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgICAgIGVsLmlubmVySFRNTCA9ICI8bGluaz4iOw0KICAgICAgICB2YXIgaXNCdWdneSA9IChlbC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCk7DQogICAgICAgIGVsID0gbnVsbDsNCiAgICAgICAgcmV0dXJuIGlzQnVnZ3k7DQogICAgICB9IGNhdGNoKGUpIHsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICB9DQogICAgfSkoKTsNCg0KICAgIHZhciBBTllfSU5ORVJIVE1MX0JVR0dZID0gU0VMRUNUX0VMRU1FTlRfSU5ORVJIVE1MX0JVR0dZIHx8DQogICAgIFRBQkxFX0VMRU1FTlRfSU5ORVJIVE1MX0JVR0dZIHx8IExJTktfRUxFTUVOVF9JTk5FUkhUTUxfQlVHR1k7DQoNCiAgICB2YXIgU0NSSVBUX0VMRU1FTlRfUkVKRUNUU19URVhUTk9ERV9BUFBFTkRJTkcgPSAoZnVuY3Rpb24gKCkgew0KICAgICAgdmFyIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSwNCiAgICAgICAgICBpc0J1Z2d5ID0gZmFsc2U7DQogICAgICB0cnkgew0KICAgICAgICBzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSk7DQogICAgICAgIGlzQnVnZ3kgPSAhcy5maXJzdENoaWxkIHx8DQogICAgICAgICAgcy5maXJzdENoaWxkICYmIHMuZmlyc3RDaGlsZC5ub2RlVHlwZSAhPT0gMzsNCiAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgaXNCdWdneSA9IHRydWU7DQogICAgICB9DQogICAgICBzID0gbnVsbDsNCiAgICAgIHJldHVybiBpc0J1Z2d5Ow0KICAgIH0pKCk7DQoNCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZShlbGVtZW50LCBjb250ZW50KSB7DQogICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICAgIHZhciBwdXJnZUVsZW1lbnQgPSBFbGVtZW50Ll9wdXJnZUVsZW1lbnQ7DQoNCiAgICAgIHZhciBkZXNjZW5kYW50cyA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSwNCiAgICAgICBpID0gZGVzY2VuZGFudHMubGVuZ3RoOw0KICAgICAgd2hpbGUgKGktLSkgcHVyZ2VFbGVtZW50KGRlc2NlbmRhbnRzW2ldKTsNCg0KICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50b0VsZW1lbnQpDQogICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnRvRWxlbWVudCgpOw0KDQogICAgICBpZiAoT2JqZWN0LmlzRWxlbWVudChjb250ZW50KSkNCiAgICAgICAgcmV0dXJuIGVsZW1lbnQudXBkYXRlKCkuaW5zZXJ0KGNvbnRlbnQpOw0KDQogICAgICBjb250ZW50ID0gT2JqZWN0LnRvSFRNTChjb250ZW50KTsNCg0KICAgICAgdmFyIHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9VcHBlckNhc2UoKTsNCg0KICAgICAgaWYgKHRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIFNDUklQVF9FTEVNRU5UX1JFSkVDVFNfVEVYVE5PREVfQVBQRU5ESU5HKSB7DQogICAgICAgIGVsZW1lbnQudGV4dCA9IGNvbnRlbnQ7DQogICAgICAgIHJldHVybiBlbGVtZW50Ow0KICAgICAgfQ0KDQogICAgICBpZiAoQU5ZX0lOTkVSSFRNTF9CVUdHWSkgew0KICAgICAgICBpZiAodGFnTmFtZSBpbiBFbGVtZW50Ll9pbnNlcnRpb25UcmFuc2xhdGlvbnMudGFncykgew0KICAgICAgICAgIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHsNCiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTsNCiAgICAgICAgICB9DQogICAgICAgICAgRWxlbWVudC5fZ2V0Q29udGVudEZyb21Bbm9ueW1vdXNFbGVtZW50KHRhZ05hbWUsIGNvbnRlbnQuc3RyaXBTY3JpcHRzKCkpDQogICAgICAgICAgICAuZWFjaChmdW5jdGlvbihub2RlKSB7DQogICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZSkNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9IGVsc2UgaWYgKExJTktfRUxFTUVOVF9JTk5FUkhUTUxfQlVHR1kgJiYgT2JqZWN0LmlzU3RyaW5nKGNvbnRlbnQpICYmIGNvbnRlbnQuaW5kZXhPZignPGxpbmsnKSA+IC0xKSB7DQogICAgICAgICAgd2hpbGUgKGVsZW1lbnQuZmlyc3RDaGlsZCkgew0KICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50LmZpcnN0Q2hpbGQpOw0KICAgICAgICAgIH0NCiAgICAgICAgICB2YXIgbm9kZXMgPSBFbGVtZW50Ll9nZXRDb250ZW50RnJvbUFub255bW91c0VsZW1lbnQodGFnTmFtZSwgY29udGVudC5zdHJpcFNjcmlwdHMoKSwgdHJ1ZSk7DQogICAgICAgICAgbm9kZXMuZWFjaChmdW5jdGlvbihub2RlKSB7IGVsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZSkgfSk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBjb250ZW50LnN0cmlwU2NyaXB0cygpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBlbHNlIHsNCiAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBjb250ZW50LnN0cmlwU2NyaXB0cygpOw0KICAgICAgfQ0KDQogICAgICBjb250ZW50LmV2YWxTY3JpcHRzLmJpbmQoY29udGVudCkuZGVmZXIoKTsNCiAgICAgIHJldHVybiBlbGVtZW50Ow0KICAgIH0NCg0KICAgIHJldHVybiB1cGRhdGU7DQogIH0pKCksDQoNCiAgcmVwbGFjZTogZnVuY3Rpb24oZWxlbWVudCwgY29udGVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudG9FbGVtZW50KSBjb250ZW50ID0gY29udGVudC50b0VsZW1lbnQoKTsNCiAgICBlbHNlIGlmICghT2JqZWN0LmlzRWxlbWVudChjb250ZW50KSkgew0KICAgICAgY29udGVudCA9IE9iamVjdC50b0hUTUwoY29udGVudCk7DQogICAgICB2YXIgcmFuZ2UgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsNCiAgICAgIHJhbmdlLnNlbGVjdE5vZGUoZWxlbWVudCk7DQogICAgICBjb250ZW50LmV2YWxTY3JpcHRzLmJpbmQoY29udGVudCkuZGVmZXIoKTsNCiAgICAgIGNvbnRlbnQgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoY29udGVudC5zdHJpcFNjcmlwdHMoKSk7DQogICAgfQ0KICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoY29udGVudCwgZWxlbWVudCk7DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0sDQoNCiAgaW5zZXJ0OiBmdW5jdGlvbihlbGVtZW50LCBpbnNlcnRpb25zKSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQoNCiAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKGluc2VydGlvbnMpIHx8IE9iamVjdC5pc051bWJlcihpbnNlcnRpb25zKSB8fA0KICAgICAgICBPYmplY3QuaXNFbGVtZW50KGluc2VydGlvbnMpIHx8IChpbnNlcnRpb25zICYmIChpbnNlcnRpb25zLnRvRWxlbWVudCB8fCBpbnNlcnRpb25zLnRvSFRNTCkpKQ0KICAgICAgICAgIGluc2VydGlvbnMgPSB7Ym90dG9tOmluc2VydGlvbnN9Ow0KDQogICAgdmFyIGNvbnRlbnQsIGluc2VydCwgdGFnTmFtZSwgY2hpbGROb2RlczsNCg0KICAgIGZvciAodmFyIHBvc2l0aW9uIGluIGluc2VydGlvbnMpIHsNCiAgICAgIGNvbnRlbnQgID0gaW5zZXJ0aW9uc1twb3NpdGlvbl07DQogICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uLnRvTG93ZXJDYXNlKCk7DQogICAgICBpbnNlcnQgPSBFbGVtZW50Ll9pbnNlcnRpb25UcmFuc2xhdGlvbnNbcG9zaXRpb25dOw0KDQogICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRvRWxlbWVudCkgY29udGVudCA9IGNvbnRlbnQudG9FbGVtZW50KCk7DQogICAgICBpZiAoT2JqZWN0LmlzRWxlbWVudChjb250ZW50KSkgew0KICAgICAgICBpbnNlcnQoZWxlbWVudCwgY29udGVudCk7DQogICAgICAgIGNvbnRpbnVlOw0KICAgICAgfQ0KDQogICAgICBjb250ZW50ID0gT2JqZWN0LnRvSFRNTChjb250ZW50KTsNCg0KICAgICAgdGFnTmFtZSA9ICgocG9zaXRpb24gPT0gJ2JlZm9yZScgfHwgcG9zaXRpb24gPT0gJ2FmdGVyJykNCiAgICAgICAgPyBlbGVtZW50LnBhcmVudE5vZGUgOiBlbGVtZW50KS50YWdOYW1lLnRvVXBwZXJDYXNlKCk7DQoNCiAgICAgIGNoaWxkTm9kZXMgPSBFbGVtZW50Ll9nZXRDb250ZW50RnJvbUFub255bW91c0VsZW1lbnQodGFnTmFtZSwgY29udGVudC5zdHJpcFNjcmlwdHMoKSk7DQoNCiAgICAgIGlmIChwb3NpdGlvbiA9PSAndG9wJyB8fCBwb3NpdGlvbiA9PSAnYWZ0ZXInKSBjaGlsZE5vZGVzLnJldmVyc2UoKTsNCiAgICAgIGNoaWxkTm9kZXMuZWFjaChpbnNlcnQuY3VycnkoZWxlbWVudCkpOw0KDQogICAgICBjb250ZW50LmV2YWxTY3JpcHRzLmJpbmQoY29udGVudCkuZGVmZXIoKTsNCiAgICB9DQoNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfSwNCg0KICB3cmFwOiBmdW5jdGlvbihlbGVtZW50LCB3cmFwcGVyLCBhdHRyaWJ1dGVzKSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgaWYgKE9iamVjdC5pc0VsZW1lbnQod3JhcHBlcikpDQogICAgICAkKHdyYXBwZXIpLndyaXRlQXR0cmlidXRlKGF0dHJpYnV0ZXMgfHwgeyB9KTsNCiAgICBlbHNlIGlmIChPYmplY3QuaXNTdHJpbmcod3JhcHBlcikpIHdyYXBwZXIgPSBuZXcgRWxlbWVudCh3cmFwcGVyLCBhdHRyaWJ1dGVzKTsNCiAgICBlbHNlIHdyYXBwZXIgPSBuZXcgRWxlbWVudCgnZGl2Jywgd3JhcHBlcik7DQogICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkNCiAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQod3JhcHBlciwgZWxlbWVudCk7DQogICAgd3JhcHBlci5hcHBlbmRDaGlsZChlbGVtZW50KTsNCiAgICByZXR1cm4gd3JhcHBlcjsNCiAgfSwNCg0KICBpbnNwZWN0OiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgdmFyIHJlc3VsdCA9ICc8JyArIGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpOw0KICAgICRIKHsnaWQnOiAnaWQnLCAnY2xhc3NOYW1lJzogJ2NsYXNzJ30pLmVhY2goZnVuY3Rpb24ocGFpcikgew0KICAgICAgdmFyIHByb3BlcnR5ID0gcGFpci5maXJzdCgpLA0KICAgICAgICAgIGF0dHJpYnV0ZSA9IHBhaXIubGFzdCgpLA0KICAgICAgICAgIHZhbHVlID0gKGVsZW1lbnRbcHJvcGVydHldIHx8ICcnKS50b1N0cmluZygpOw0KICAgICAgaWYgKHZhbHVlKSByZXN1bHQgKz0gJyAnICsgYXR0cmlidXRlICsgJz0nICsgdmFsdWUuaW5zcGVjdCh0cnVlKTsNCiAgICB9KTsNCiAgICByZXR1cm4gcmVzdWx0ICsgJz4nOw0KICB9LA0KDQogIHJlY3Vyc2l2ZWx5Q29sbGVjdDogZnVuY3Rpb24oZWxlbWVudCwgcHJvcGVydHksIG1heGltdW1MZW5ndGgpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICBtYXhpbXVtTGVuZ3RoID0gbWF4aW11bUxlbmd0aCB8fCAtMTsNCiAgICB2YXIgZWxlbWVudHMgPSBbXTsNCg0KICAgIHdoaWxlIChlbGVtZW50ID0gZWxlbWVudFtwcm9wZXJ0eV0pIHsNCiAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlID09IDEpDQogICAgICAgIGVsZW1lbnRzLnB1c2goRWxlbWVudC5leHRlbmQoZWxlbWVudCkpOw0KICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSBtYXhpbXVtTGVuZ3RoKQ0KICAgICAgICBicmVhazsNCiAgICB9DQoNCiAgICByZXR1cm4gZWxlbWVudHM7DQogIH0sDQoNCiAgYW5jZXN0b3JzOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgcmV0dXJuIEVsZW1lbnQucmVjdXJzaXZlbHlDb2xsZWN0KGVsZW1lbnQsICdwYXJlbnROb2RlJyk7DQogIH0sDQoNCiAgZGVzY2VuZGFudHM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICByZXR1cm4gRWxlbWVudC5zZWxlY3QoZWxlbWVudCwgIioiKTsNCiAgfSwNCg0KICBmaXJzdERlc2NlbmRhbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KS5maXJzdENoaWxkOw0KICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgIT0gMSkgZWxlbWVudCA9IGVsZW1lbnQubmV4dFNpYmxpbmc7DQogICAgcmV0dXJuICQoZWxlbWVudCk7DQogIH0sDQoNCiAgaW1tZWRpYXRlRGVzY2VuZGFudHM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdLCBjaGlsZCA9ICQoZWxlbWVudCkuZmlyc3RDaGlsZDsNCiAgICB3aGlsZSAoY2hpbGQpIHsNCiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSkgew0KICAgICAgICByZXN1bHRzLnB1c2goRWxlbWVudC5leHRlbmQoY2hpbGQpKTsNCiAgICAgIH0NCiAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7DQogICAgfQ0KICAgIHJldHVybiByZXN1bHRzOw0KICB9LA0KDQogIHByZXZpb3VzU2libGluZ3M6IGZ1bmN0aW9uKGVsZW1lbnQsIG1heGltdW1MZW5ndGgpIHsNCiAgICByZXR1cm4gRWxlbWVudC5yZWN1cnNpdmVseUNvbGxlY3QoZWxlbWVudCwgJ3ByZXZpb3VzU2libGluZycpOw0KICB9LA0KDQogIG5leHRTaWJsaW5nczogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIHJldHVybiBFbGVtZW50LnJlY3Vyc2l2ZWx5Q29sbGVjdChlbGVtZW50LCAnbmV4dFNpYmxpbmcnKTsNCiAgfSwNCg0KICBzaWJsaW5nczogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIHJldHVybiBFbGVtZW50LnByZXZpb3VzU2libGluZ3MoZWxlbWVudCkucmV2ZXJzZSgpDQogICAgICAuY29uY2F0KEVsZW1lbnQubmV4dFNpYmxpbmdzKGVsZW1lbnQpKTsNCiAgfSwNCg0KICBtYXRjaDogZnVuY3Rpb24oZWxlbWVudCwgc2VsZWN0b3IpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKHNlbGVjdG9yKSkNCiAgICAgIHJldHVybiBQcm90b3R5cGUuU2VsZWN0b3IubWF0Y2goZWxlbWVudCwgc2VsZWN0b3IpOw0KICAgIHJldHVybiBzZWxlY3Rvci5tYXRjaChlbGVtZW50KTsNCiAgfSwNCg0KICB1cDogZnVuY3Rpb24oZWxlbWVudCwgZXhwcmVzc2lvbiwgaW5kZXgpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gJChlbGVtZW50LnBhcmVudE5vZGUpOw0KICAgIHZhciBhbmNlc3RvcnMgPSBFbGVtZW50LmFuY2VzdG9ycyhlbGVtZW50KTsNCiAgICByZXR1cm4gT2JqZWN0LmlzTnVtYmVyKGV4cHJlc3Npb24pID8gYW5jZXN0b3JzW2V4cHJlc3Npb25dIDoNCiAgICAgIFByb3RvdHlwZS5TZWxlY3Rvci5maW5kKGFuY2VzdG9ycywgZXhwcmVzc2lvbiwgaW5kZXgpOw0KICB9LA0KDQogIGRvd246IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb24sIGluZGV4KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgcmV0dXJuIEVsZW1lbnQuZmlyc3REZXNjZW5kYW50KGVsZW1lbnQpOw0KICAgIHJldHVybiBPYmplY3QuaXNOdW1iZXIoZXhwcmVzc2lvbikgPyBFbGVtZW50LmRlc2NlbmRhbnRzKGVsZW1lbnQpW2V4cHJlc3Npb25dIDoNCiAgICAgIEVsZW1lbnQuc2VsZWN0KGVsZW1lbnQsIGV4cHJlc3Npb24pW2luZGV4IHx8IDBdOw0KICB9LA0KDQogIHByZXZpb3VzOiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBpbmRleCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIGlmIChPYmplY3QuaXNOdW1iZXIoZXhwcmVzc2lvbikpIGluZGV4ID0gZXhwcmVzc2lvbiwgZXhwcmVzc2lvbiA9IGZhbHNlOw0KICAgIGlmICghT2JqZWN0LmlzTnVtYmVyKGluZGV4KSkgaW5kZXggPSAwOw0KDQogICAgaWYgKGV4cHJlc3Npb24pIHsNCiAgICAgIHJldHVybiBQcm90b3R5cGUuU2VsZWN0b3IuZmluZChlbGVtZW50LnByZXZpb3VzU2libGluZ3MoKSwgZXhwcmVzc2lvbiwgaW5kZXgpOw0KICAgIH0gZWxzZSB7DQogICAgICByZXR1cm4gZWxlbWVudC5yZWN1cnNpdmVseUNvbGxlY3QoInByZXZpb3VzU2libGluZyIsIGluZGV4ICsgMSlbaW5kZXhdOw0KICAgIH0NCiAgfSwNCg0KICBuZXh0OiBmdW5jdGlvbihlbGVtZW50LCBleHByZXNzaW9uLCBpbmRleCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIGlmIChPYmplY3QuaXNOdW1iZXIoZXhwcmVzc2lvbikpIGluZGV4ID0gZXhwcmVzc2lvbiwgZXhwcmVzc2lvbiA9IGZhbHNlOw0KICAgIGlmICghT2JqZWN0LmlzTnVtYmVyKGluZGV4KSkgaW5kZXggPSAwOw0KDQogICAgaWYgKGV4cHJlc3Npb24pIHsNCiAgICAgIHJldHVybiBQcm90b3R5cGUuU2VsZWN0b3IuZmluZChlbGVtZW50Lm5leHRTaWJsaW5ncygpLCBleHByZXNzaW9uLCBpbmRleCk7DQogICAgfSBlbHNlIHsNCiAgICAgIHZhciBtYXhpbXVtTGVuZ3RoID0gT2JqZWN0LmlzTnVtYmVyKGluZGV4KSA/IGluZGV4ICsgMSA6IDE7DQogICAgICByZXR1cm4gZWxlbWVudC5yZWN1cnNpdmVseUNvbGxlY3QoIm5leHRTaWJsaW5nIiwgaW5kZXggKyAxKVtpbmRleF07DQogICAgfQ0KICB9LA0KDQoNCiAgc2VsZWN0OiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgdmFyIGV4cHJlc3Npb25zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKS5qb2luKCcsICcpOw0KICAgIHJldHVybiBQcm90b3R5cGUuU2VsZWN0b3Iuc2VsZWN0KGV4cHJlc3Npb25zLCBlbGVtZW50KTsNCiAgfSwNCg0KICBhZGphY2VudDogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIHZhciBleHByZXNzaW9ucyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkuam9pbignLCAnKTsNCiAgICByZXR1cm4gUHJvdG90eXBlLlNlbGVjdG9yLnNlbGVjdChleHByZXNzaW9ucywgZWxlbWVudC5wYXJlbnROb2RlKS53aXRob3V0KGVsZW1lbnQpOw0KICB9LA0KDQogIGlkZW50aWZ5OiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgdmFyIGlkID0gRWxlbWVudC5yZWFkQXR0cmlidXRlKGVsZW1lbnQsICdpZCcpOw0KICAgIGlmIChpZCkgcmV0dXJuIGlkOw0KICAgIGRvIHsgaWQgPSAnYW5vbnltb3VzX2VsZW1lbnRfJyArIEVsZW1lbnQuaWRDb3VudGVyKysgfSB3aGlsZSAoJChpZCkpOw0KICAgIEVsZW1lbnQud3JpdGVBdHRyaWJ1dGUoZWxlbWVudCwgJ2lkJywgaWQpOw0KICAgIHJldHVybiBpZDsNCiAgfSwNCg0KICByZWFkQXR0cmlidXRlOiBmdW5jdGlvbihlbGVtZW50LCBuYW1lKSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7DQogICAgICB2YXIgdCA9IEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy5yZWFkOw0KICAgICAgaWYgKHQudmFsdWVzW25hbWVdKSByZXR1cm4gdC52YWx1ZXNbbmFtZV0oZWxlbWVudCwgbmFtZSk7DQogICAgICBpZiAodC5uYW1lc1tuYW1lXSkgbmFtZSA9IHQubmFtZXNbbmFtZV07DQogICAgICBpZiAobmFtZS5pbmNsdWRlKCc6JykpIHsNCiAgICAgICAgcmV0dXJuICghZWxlbWVudC5hdHRyaWJ1dGVzIHx8ICFlbGVtZW50LmF0dHJpYnV0ZXNbbmFtZV0pID8gbnVsbCA6DQogICAgICAgICBlbGVtZW50LmF0dHJpYnV0ZXNbbmFtZV0udmFsdWU7DQogICAgICB9DQogICAgfQ0KICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lKTsNCiAgfSwNCg0KICB3cml0ZUF0dHJpYnV0ZTogZnVuY3Rpb24oZWxlbWVudCwgbmFtZSwgdmFsdWUpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICB2YXIgYXR0cmlidXRlcyA9IHsgfSwgdCA9IEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy53cml0ZTsNCg0KICAgIGlmICh0eXBlb2YgbmFtZSA9PSAnb2JqZWN0JykgYXR0cmlidXRlcyA9IG5hbWU7DQogICAgZWxzZSBhdHRyaWJ1dGVzW25hbWVdID0gT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSA/IHRydWUgOiB2YWx1ZTsNCg0KICAgIGZvciAodmFyIGF0dHIgaW4gYXR0cmlidXRlcykgew0KICAgICAgbmFtZSA9IHQubmFtZXNbYXR0cl0gfHwgYXR0cjsNCiAgICAgIHZhbHVlID0gYXR0cmlidXRlc1thdHRyXTsNCiAgICAgIGlmICh0LnZhbHVlc1thdHRyXSkgbmFtZSA9IHQudmFsdWVzW2F0dHJdKGVsZW1lbnQsIHZhbHVlKTsNCiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT09IG51bGwpDQogICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpOw0KICAgICAgZWxzZSBpZiAodmFsdWUgPT09IHRydWUpDQogICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIG5hbWUpOw0KICAgICAgZWxzZSBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7DQogICAgfQ0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9LA0KDQogIGdldEhlaWdodDogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIHJldHVybiBFbGVtZW50LmdldERpbWVuc2lvbnMoZWxlbWVudCkuaGVpZ2h0Ow0KICB9LA0KDQogIGdldFdpZHRoOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgcmV0dXJuIEVsZW1lbnQuZ2V0RGltZW5zaW9ucyhlbGVtZW50KS53aWR0aDsNCiAgfSwNCg0KICBjbGFzc05hbWVzOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgcmV0dXJuIG5ldyBFbGVtZW50LkNsYXNzTmFtZXMoZWxlbWVudCk7DQogIH0sDQoNCiAgaGFzQ2xhc3NOYW1lOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsNCiAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KSkpIHJldHVybjsNCiAgICB2YXIgZWxlbWVudENsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lOw0KICAgIHJldHVybiAoZWxlbWVudENsYXNzTmFtZS5sZW5ndGggPiAwICYmIChlbGVtZW50Q2xhc3NOYW1lID09IGNsYXNzTmFtZSB8fA0KICAgICAgbmV3IFJlZ0V4cCgiKF58XFxzKSIgKyBjbGFzc05hbWUgKyAiKFxcc3wkKSIpLnRlc3QoZWxlbWVudENsYXNzTmFtZSkpKTsNCiAgfSwNCg0KICBhZGRDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgew0KICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJuOw0KICAgIGlmICghRWxlbWVudC5oYXNDbGFzc05hbWUoZWxlbWVudCwgY2xhc3NOYW1lKSkNCiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lICs9IChlbGVtZW50LmNsYXNzTmFtZSA/ICcgJyA6ICcnKSArIGNsYXNzTmFtZTsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfSwNCg0KICByZW1vdmVDbGFzc05hbWU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgew0KICAgIGlmICghKGVsZW1lbnQgPSAkKGVsZW1lbnQpKSkgcmV0dXJuOw0KICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWUucmVwbGFjZSgNCiAgICAgIG5ldyBSZWdFeHAoIihefFxccyspIiArIGNsYXNzTmFtZSArICIoXFxzK3wkKSIpLCAnICcpLnN0cmlwKCk7DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0sDQoNCiAgdG9nZ2xlQ2xhc3NOYW1lOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsNCiAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KSkpIHJldHVybjsNCiAgICByZXR1cm4gRWxlbWVudFtFbGVtZW50Lmhhc0NsYXNzTmFtZShlbGVtZW50LCBjbGFzc05hbWUpID8NCiAgICAgICdyZW1vdmVDbGFzc05hbWUnIDogJ2FkZENsYXNzTmFtZSddKGVsZW1lbnQsIGNsYXNzTmFtZSk7DQogIH0sDQoNCiAgY2xlYW5XaGl0ZXNwYWNlOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgdmFyIG5vZGUgPSBlbGVtZW50LmZpcnN0Q2hpbGQ7DQogICAgd2hpbGUgKG5vZGUpIHsNCiAgICAgIHZhciBuZXh0Tm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7DQogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzICYmICEvXFMvLnRlc3Qobm9kZS5ub2RlVmFsdWUpKQ0KICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKG5vZGUpOw0KICAgICAgbm9kZSA9IG5leHROb2RlOw0KICAgIH0NCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfSwNCg0KICBlbXB0eTogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIHJldHVybiAkKGVsZW1lbnQpLmlubmVySFRNTC5ibGFuaygpOw0KICB9LA0KDQogIGRlc2NlbmRhbnRPZjogZnVuY3Rpb24oZWxlbWVudCwgYW5jZXN0b3IpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KSwgYW5jZXN0b3IgPSAkKGFuY2VzdG9yKTsNCg0KICAgIGlmIChlbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKQ0KICAgICAgcmV0dXJuIChlbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGFuY2VzdG9yKSAmIDgpID09PSA4Ow0KDQogICAgaWYgKGFuY2VzdG9yLmNvbnRhaW5zKQ0KICAgICAgcmV0dXJuIGFuY2VzdG9yLmNvbnRhaW5zKGVsZW1lbnQpICYmIGFuY2VzdG9yICE9PSBlbGVtZW50Ow0KDQogICAgd2hpbGUgKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpDQogICAgICBpZiAoZWxlbWVudCA9PSBhbmNlc3RvcikgcmV0dXJuIHRydWU7DQoNCiAgICByZXR1cm4gZmFsc2U7DQogIH0sDQoNCiAgc2Nyb2xsVG86IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICB2YXIgcG9zID0gRWxlbWVudC5jdW11bGF0aXZlT2Zmc2V0KGVsZW1lbnQpOw0KICAgIHdpbmRvdy5zY3JvbGxUbyhwb3NbMF0sIHBvc1sxXSk7DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0sDQoNCiAgZ2V0U3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlKSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgc3R5bGUgPSBzdHlsZSA9PSAnZmxvYXQnID8gJ2Nzc0Zsb2F0JyA6IHN0eWxlLmNhbWVsaXplKCk7DQogICAgdmFyIHZhbHVlID0gZWxlbWVudC5zdHlsZVtzdHlsZV07DQogICAgaWYgKCF2YWx1ZSB8fCB2YWx1ZSA9PSAnYXV0bycpIHsNCiAgICAgIHZhciBjc3MgPSBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpOw0KICAgICAgdmFsdWUgPSBjc3MgPyBjc3Nbc3R5bGVdIDogbnVsbDsNCiAgICB9DQogICAgaWYgKHN0eWxlID09ICdvcGFjaXR5JykgcmV0dXJuIHZhbHVlID8gcGFyc2VGbG9hdCh2YWx1ZSkgOiAxLjA7DQogICAgcmV0dXJuIHZhbHVlID09ICdhdXRvJyA/IG51bGwgOiB2YWx1ZTsNCiAgfSwNCg0KICBnZXRPcGFjaXR5OiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgcmV0dXJuICQoZWxlbWVudCkuZ2V0U3R5bGUoJ29wYWNpdHknKTsNCiAgfSwNCg0KICBzZXRTdHlsZTogZnVuY3Rpb24oZWxlbWVudCwgc3R5bGVzKSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgdmFyIGVsZW1lbnRTdHlsZSA9IGVsZW1lbnQuc3R5bGUsIG1hdGNoOw0KICAgIGlmIChPYmplY3QuaXNTdHJpbmcoc3R5bGVzKSkgew0KICAgICAgZWxlbWVudC5zdHlsZS5jc3NUZXh0ICs9ICc7JyArIHN0eWxlczsNCiAgICAgIHJldHVybiBzdHlsZXMuaW5jbHVkZSgnb3BhY2l0eScpID8NCiAgICAgICAgZWxlbWVudC5zZXRPcGFjaXR5KHN0eWxlcy5tYXRjaCgvb3BhY2l0eTpccyooXGQ/XC4/XGQqKS8pWzFdKSA6IGVsZW1lbnQ7DQogICAgfQ0KICAgIGZvciAodmFyIHByb3BlcnR5IGluIHN0eWxlcykNCiAgICAgIGlmIChwcm9wZXJ0eSA9PSAnb3BhY2l0eScpIGVsZW1lbnQuc2V0T3BhY2l0eShzdHlsZXNbcHJvcGVydHldKTsNCiAgICAgIGVsc2UNCiAgICAgICAgZWxlbWVudFN0eWxlWyhwcm9wZXJ0eSA9PSAnZmxvYXQnIHx8IHByb3BlcnR5ID09ICdjc3NGbG9hdCcpID8NCiAgICAgICAgICAoT2JqZWN0LmlzVW5kZWZpbmVkKGVsZW1lbnRTdHlsZS5zdHlsZUZsb2F0KSA/ICdjc3NGbG9hdCcgOiAnc3R5bGVGbG9hdCcpIDoNCiAgICAgICAgICAgIHByb3BlcnR5XSA9IHN0eWxlc1twcm9wZXJ0eV07DQoNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfSwNCg0KICBzZXRPcGFjaXR5OiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICh2YWx1ZSA9PSAxIHx8IHZhbHVlID09PSAnJykgPyAnJyA6DQogICAgICAodmFsdWUgPCAwLjAwMDAxKSA/IDAgOiB2YWx1ZTsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfSwNCg0KICBtYWtlUG9zaXRpb25lZDogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIHZhciBwb3MgPSBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpOw0KICAgIGlmIChwb3MgPT0gJ3N0YXRpYycgfHwgIXBvcykgew0KICAgICAgZWxlbWVudC5fbWFkZVBvc2l0aW9uZWQgPSB0cnVlOw0KICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7DQogICAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuT3BlcmEpIHsNCiAgICAgICAgZWxlbWVudC5zdHlsZS50b3AgPSAwOw0KICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAwOw0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfSwNCg0KICB1bmRvUG9zaXRpb25lZDogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIGlmIChlbGVtZW50Ll9tYWRlUG9zaXRpb25lZCkgew0KICAgICAgZWxlbWVudC5fbWFkZVBvc2l0aW9uZWQgPSB1bmRlZmluZWQ7DQogICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0NCiAgICAgICAgZWxlbWVudC5zdHlsZS50b3AgPQ0KICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPQ0KICAgICAgICBlbGVtZW50LnN0eWxlLmJvdHRvbSA9DQogICAgICAgIGVsZW1lbnQuc3R5bGUucmlnaHQgPSAnJzsNCiAgICB9DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0sDQoNCiAgbWFrZUNsaXBwaW5nOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgaWYgKGVsZW1lbnQuX292ZXJmbG93KSByZXR1cm4gZWxlbWVudDsNCiAgICBlbGVtZW50Ll9vdmVyZmxvdyA9IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ292ZXJmbG93JykgfHwgJ2F1dG8nOw0KICAgIGlmIChlbGVtZW50Ll9vdmVyZmxvdyAhPT0gJ2hpZGRlbicpDQogICAgICBlbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0sDQoNCiAgdW5kb0NsaXBwaW5nOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgaWYgKCFlbGVtZW50Ll9vdmVyZmxvdykgcmV0dXJuIGVsZW1lbnQ7DQogICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9IGVsZW1lbnQuX292ZXJmbG93ID09ICdhdXRvJyA/ICcnIDogZWxlbWVudC5fb3ZlcmZsb3c7DQogICAgZWxlbWVudC5fb3ZlcmZsb3cgPSBudWxsOw0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9LA0KDQogIGNsb25lUG9zaXRpb246IGZ1bmN0aW9uKGVsZW1lbnQsIHNvdXJjZSkgew0KICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7DQogICAgICBzZXRMZWZ0OiAgICB0cnVlLA0KICAgICAgc2V0VG9wOiAgICAgdHJ1ZSwNCiAgICAgIHNldFdpZHRoOiAgIHRydWUsDQogICAgICBzZXRIZWlnaHQ6ICB0cnVlLA0KICAgICAgb2Zmc2V0VG9wOiAgMCwNCiAgICAgIG9mZnNldExlZnQ6IDANCiAgICB9LCBhcmd1bWVudHNbMl0gfHwgeyB9KTsNCg0KICAgIHNvdXJjZSA9ICQoc291cmNlKTsNCiAgICB2YXIgcCA9IEVsZW1lbnQudmlld3BvcnRPZmZzZXQoc291cmNlKSwgZGVsdGEgPSBbMCwgMF0sIHBhcmVudCA9IG51bGw7DQoNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCg0KICAgIGlmIChFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpID09ICdhYnNvbHV0ZScpIHsNCiAgICAgIHBhcmVudCA9IEVsZW1lbnQuZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpOw0KICAgICAgZGVsdGEgPSBFbGVtZW50LnZpZXdwb3J0T2Zmc2V0KHBhcmVudCk7DQogICAgfQ0KDQogICAgaWYgKHBhcmVudCA9PSBkb2N1bWVudC5ib2R5KSB7DQogICAgICBkZWx0YVswXSAtPSBkb2N1bWVudC5ib2R5Lm9mZnNldExlZnQ7DQogICAgICBkZWx0YVsxXSAtPSBkb2N1bWVudC5ib2R5Lm9mZnNldFRvcDsNCiAgICB9DQoNCiAgICBpZiAob3B0aW9ucy5zZXRMZWZ0KSAgIGVsZW1lbnQuc3R5bGUubGVmdCAgPSAocFswXSAtIGRlbHRhWzBdICsgb3B0aW9ucy5vZmZzZXRMZWZ0KSArICdweCc7DQogICAgaWYgKG9wdGlvbnMuc2V0VG9wKSAgICBlbGVtZW50LnN0eWxlLnRvcCAgID0gKHBbMV0gLSBkZWx0YVsxXSArIG9wdGlvbnMub2Zmc2V0VG9wKSArICdweCc7DQogICAgaWYgKG9wdGlvbnMuc2V0V2lkdGgpICBlbGVtZW50LnN0eWxlLndpZHRoID0gc291cmNlLm9mZnNldFdpZHRoICsgJ3B4JzsNCiAgICBpZiAob3B0aW9ucy5zZXRIZWlnaHQpIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gc291cmNlLm9mZnNldEhlaWdodCArICdweCc7DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0NCn07DQoNCk9iamVjdC5leHRlbmQoRWxlbWVudC5NZXRob2RzLCB7DQogIGdldEVsZW1lbnRzQnlTZWxlY3RvcjogRWxlbWVudC5NZXRob2RzLnNlbGVjdCwNCg0KICBjaGlsZEVsZW1lbnRzOiBFbGVtZW50Lk1ldGhvZHMuaW1tZWRpYXRlRGVzY2VuZGFudHMNCn0pOw0KDQpFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMgPSB7DQogIHdyaXRlOiB7DQogICAgbmFtZXM6IHsNCiAgICAgIGNsYXNzTmFtZTogJ2NsYXNzJywNCiAgICAgIGh0bWxGb3I6ICAgJ2ZvcicNCiAgICB9LA0KICAgIHZhbHVlczogeyB9DQogIH0NCn07DQoNCmlmIChQcm90b3R5cGUuQnJvd3Nlci5PcGVyYSkgew0KICBFbGVtZW50Lk1ldGhvZHMuZ2V0U3R5bGUgPSBFbGVtZW50Lk1ldGhvZHMuZ2V0U3R5bGUud3JhcCgNCiAgICBmdW5jdGlvbihwcm9jZWVkLCBlbGVtZW50LCBzdHlsZSkgew0KICAgICAgc3dpdGNoIChzdHlsZSkgew0KICAgICAgICBjYXNlICdoZWlnaHQnOiBjYXNlICd3aWR0aCc6DQogICAgICAgICAgaWYgKCFFbGVtZW50LnZpc2libGUoZWxlbWVudCkpIHJldHVybiBudWxsOw0KDQogICAgICAgICAgdmFyIGRpbSA9IHBhcnNlSW50KHByb2NlZWQoZWxlbWVudCwgc3R5bGUpLCAxMCk7DQoNCiAgICAgICAgICBpZiAoZGltICE9PSBlbGVtZW50WydvZmZzZXQnICsgc3R5bGUuY2FwaXRhbGl6ZSgpXSkNCiAgICAgICAgICAgIHJldHVybiBkaW0gKyAncHgnOw0KDQogICAgICAgICAgdmFyIHByb3BlcnRpZXM7DQogICAgICAgICAgaWYgKHN0eWxlID09PSAnaGVpZ2h0Jykgew0KICAgICAgICAgICAgcHJvcGVydGllcyA9IFsnYm9yZGVyLXRvcC13aWR0aCcsICdwYWRkaW5nLXRvcCcsDQogICAgICAgICAgICAgJ3BhZGRpbmctYm90dG9tJywgJ2JvcmRlci1ib3R0b20td2lkdGgnXTsNCiAgICAgICAgICB9DQogICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICBwcm9wZXJ0aWVzID0gWydib3JkZXItbGVmdC13aWR0aCcsICdwYWRkaW5nLWxlZnQnLA0KICAgICAgICAgICAgICdwYWRkaW5nLXJpZ2h0JywgJ2JvcmRlci1yaWdodC13aWR0aCddOw0KICAgICAgICAgIH0NCiAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5pbmplY3QoZGltLCBmdW5jdGlvbihtZW1vLCBwcm9wZXJ0eSkgew0KICAgICAgICAgICAgdmFyIHZhbCA9IHByb2NlZWQoZWxlbWVudCwgcHJvcGVydHkpOw0KICAgICAgICAgICAgcmV0dXJuIHZhbCA9PT0gbnVsbCA/IG1lbW8gOiBtZW1vIC0gcGFyc2VJbnQodmFsLCAxMCk7DQogICAgICAgICAgfSkgKyAncHgnOw0KICAgICAgICBkZWZhdWx0OiByZXR1cm4gcHJvY2VlZChlbGVtZW50LCBzdHlsZSk7DQogICAgICB9DQogICAgfQ0KICApOw0KDQogIEVsZW1lbnQuTWV0aG9kcy5yZWFkQXR0cmlidXRlID0gRWxlbWVudC5NZXRob2RzLnJlYWRBdHRyaWJ1dGUud3JhcCgNCiAgICBmdW5jdGlvbihwcm9jZWVkLCBlbGVtZW50LCBhdHRyaWJ1dGUpIHsNCiAgICAgIGlmIChhdHRyaWJ1dGUgPT09ICd0aXRsZScpIHJldHVybiBlbGVtZW50LnRpdGxlOw0KICAgICAgcmV0dXJuIHByb2NlZWQoZWxlbWVudCwgYXR0cmlidXRlKTsNCiAgICB9DQogICk7DQp9DQoNCmVsc2UgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB7DQogIEVsZW1lbnQuTWV0aG9kcy5nZXRTdHlsZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlKSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgc3R5bGUgPSAoc3R5bGUgPT0gJ2Zsb2F0JyB8fCBzdHlsZSA9PSAnY3NzRmxvYXQnKSA/ICdzdHlsZUZsb2F0JyA6IHN0eWxlLmNhbWVsaXplKCk7DQogICAgdmFyIHZhbHVlID0gZWxlbWVudC5zdHlsZVtzdHlsZV07DQogICAgaWYgKCF2YWx1ZSAmJiBlbGVtZW50LmN1cnJlbnRTdHlsZSkgdmFsdWUgPSBlbGVtZW50LmN1cnJlbnRTdHlsZVtzdHlsZV07DQoNCiAgICBpZiAoc3R5bGUgPT0gJ29wYWNpdHknKSB7DQogICAgICBpZiAodmFsdWUgPSAoZWxlbWVudC5nZXRTdHlsZSgnZmlsdGVyJykgfHwgJycpLm1hdGNoKC9hbHBoYVwob3BhY2l0eT0oLiopXCkvKSkNCiAgICAgICAgaWYgKHZhbHVlWzFdKSByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZVsxXSkgLyAxMDA7DQogICAgICByZXR1cm4gMS4wOw0KICAgIH0NCg0KICAgIGlmICh2YWx1ZSA9PSAnYXV0bycpIHsNCiAgICAgIGlmICgoc3R5bGUgPT0gJ3dpZHRoJyB8fCBzdHlsZSA9PSAnaGVpZ2h0JykgJiYgKGVsZW1lbnQuZ2V0U3R5bGUoJ2Rpc3BsYXknKSAhPSAnbm9uZScpKQ0KICAgICAgICByZXR1cm4gZWxlbWVudFsnb2Zmc2V0JyArIHN0eWxlLmNhcGl0YWxpemUoKV0gKyAncHgnOw0KICAgICAgcmV0dXJuIG51bGw7DQogICAgfQ0KICAgIHJldHVybiB2YWx1ZTsNCiAgfTsNCg0KICBFbGVtZW50Lk1ldGhvZHMuc2V0T3BhY2l0eSA9IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7DQogICAgZnVuY3Rpb24gc3RyaXBBbHBoYShmaWx0ZXIpew0KICAgICAgcmV0dXJuIGZpbHRlci5yZXBsYWNlKC9hbHBoYVwoW15cKV0qXCkvZ2ksJycpOw0KICAgIH0NCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICB2YXIgY3VycmVudFN0eWxlID0gZWxlbWVudC5jdXJyZW50U3R5bGU7DQogICAgaWYgKChjdXJyZW50U3R5bGUgJiYgIWN1cnJlbnRTdHlsZS5oYXNMYXlvdXQpIHx8DQogICAgICAoIWN1cnJlbnRTdHlsZSAmJiBlbGVtZW50LnN0eWxlLnpvb20gPT0gJ25vcm1hbCcpKQ0KICAgICAgICBlbGVtZW50LnN0eWxlLnpvb20gPSAxOw0KDQogICAgdmFyIGZpbHRlciA9IGVsZW1lbnQuZ2V0U3R5bGUoJ2ZpbHRlcicpLCBzdHlsZSA9IGVsZW1lbnQuc3R5bGU7DQogICAgaWYgKHZhbHVlID09IDEgfHwgdmFsdWUgPT09ICcnKSB7DQogICAgICAoZmlsdGVyID0gc3RyaXBBbHBoYShmaWx0ZXIpKSA/DQogICAgICAgIHN0eWxlLmZpbHRlciA9IGZpbHRlciA6IHN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgnZmlsdGVyJyk7DQogICAgICByZXR1cm4gZWxlbWVudDsNCiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMC4wMDAwMSkgdmFsdWUgPSAwOw0KICAgIHN0eWxlLmZpbHRlciA9IHN0cmlwQWxwaGEoZmlsdGVyKSArDQogICAgICAnYWxwaGEob3BhY2l0eT0nICsgKHZhbHVlICogMTAwKSArICcpJzsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfTsNCg0KICBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMgPSAoZnVuY3Rpb24oKXsNCg0KICAgIHZhciBjbGFzc1Byb3AgPSAnY2xhc3NOYW1lJywNCiAgICAgICAgZm9yUHJvcCA9ICdmb3InLA0KICAgICAgICBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KDQogICAgZWwuc2V0QXR0cmlidXRlKGNsYXNzUHJvcCwgJ3gnKTsNCg0KICAgIGlmIChlbC5jbGFzc05hbWUgIT09ICd4Jykgew0KICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsICd4Jyk7DQogICAgICBpZiAoZWwuY2xhc3NOYW1lID09PSAneCcpIHsNCiAgICAgICAgY2xhc3NQcm9wID0gJ2NsYXNzJzsNCiAgICAgIH0NCiAgICB9DQogICAgZWwgPSBudWxsOw0KDQogICAgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpOw0KICAgIGVsLnNldEF0dHJpYnV0ZShmb3JQcm9wLCAneCcpOw0KICAgIGlmIChlbC5odG1sRm9yICE9PSAneCcpIHsNCiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnaHRtbEZvcicsICd4Jyk7DQogICAgICBpZiAoZWwuaHRtbEZvciA9PT0gJ3gnKSB7DQogICAgICAgIGZvclByb3AgPSAnaHRtbEZvcic7DQogICAgICB9DQogICAgfQ0KICAgIGVsID0gbnVsbDsNCg0KICAgIHJldHVybiB7DQogICAgICByZWFkOiB7DQogICAgICAgIG5hbWVzOiB7DQogICAgICAgICAgJ2NsYXNzJzogICAgICBjbGFzc1Byb3AsDQogICAgICAgICAgJ2NsYXNzTmFtZSc6ICBjbGFzc1Byb3AsDQogICAgICAgICAgJ2Zvcic6ICAgICAgICBmb3JQcm9wLA0KICAgICAgICAgICdodG1sRm9yJzogICAgZm9yUHJvcA0KICAgICAgICB9LA0KICAgICAgICB2YWx1ZXM6IHsNCiAgICAgICAgICBfZ2V0QXR0cjogZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7DQogICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsNCiAgICAgICAgICB9LA0KICAgICAgICAgIF9nZXRBdHRyMjogZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7DQogICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCAyKTsNCiAgICAgICAgICB9LA0KICAgICAgICAgIF9nZXRBdHRyTm9kZTogZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7DQogICAgICAgICAgICB2YXIgbm9kZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShhdHRyaWJ1dGUpOw0KICAgICAgICAgICAgcmV0dXJuIG5vZGUgPyBub2RlLnZhbHVlIDogIiI7DQogICAgICAgICAgfSwNCiAgICAgICAgICBfZ2V0RXY6IChmdW5jdGlvbigpew0KDQogICAgICAgICAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwgZjsNCiAgICAgICAgICAgIGVsLm9uY2xpY2sgPSBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbjsNCiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGVsLmdldEF0dHJpYnV0ZSgnb25jbGljaycpOw0KDQogICAgICAgICAgICBpZiAoU3RyaW5nKHZhbHVlKS5pbmRleE9mKCd7JykgPiAtMSkgew0KICAgICAgICAgICAgICBmID0gZnVuY3Rpb24oZWxlbWVudCwgYXR0cmlidXRlKSB7DQogICAgICAgICAgICAgICAgYXR0cmlidXRlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsNCiAgICAgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZSkgcmV0dXJuIG51bGw7DQogICAgICAgICAgICAgICAgYXR0cmlidXRlID0gYXR0cmlidXRlLnRvU3RyaW5nKCk7DQogICAgICAgICAgICAgICAgYXR0cmlidXRlID0gYXR0cmlidXRlLnNwbGl0KCd7JylbMV07DQogICAgICAgICAgICAgICAgYXR0cmlidXRlID0gYXR0cmlidXRlLnNwbGl0KCd9JylbMF07DQogICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5zdHJpcCgpOw0KICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT09ICcnKSB7DQogICAgICAgICAgICAgIGYgPSBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGUpIHsNCiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpOw0KICAgICAgICAgICAgICAgIGlmICghYXR0cmlidXRlKSByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlLnN0cmlwKCk7DQogICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbCA9IG51bGw7DQogICAgICAgICAgICByZXR1cm4gZjsNCiAgICAgICAgICB9KSgpLA0KICAgICAgICAgIF9mbGFnOiBmdW5jdGlvbihlbGVtZW50LCBhdHRyaWJ1dGUpIHsNCiAgICAgICAgICAgIHJldHVybiAkKGVsZW1lbnQpLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpID8gYXR0cmlidXRlIDogbnVsbDsNCiAgICAgICAgICB9LA0KICAgICAgICAgIHN0eWxlOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgICAgICAgICByZXR1cm4gZWxlbWVudC5zdHlsZS5jc3NUZXh0LnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgfSwNCiAgICAgICAgICB0aXRsZTogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudGl0bGU7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9KSgpOw0KDQogIEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy53cml0ZSA9IHsNCiAgICBuYW1lczogT2JqZWN0LmV4dGVuZCh7DQogICAgICBjZWxscGFkZGluZzogJ2NlbGxQYWRkaW5nJywNCiAgICAgIGNlbGxzcGFjaW5nOiAnY2VsbFNwYWNpbmcnDQogICAgfSwgRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLnJlYWQubmFtZXMpLA0KICAgIHZhbHVlczogew0KICAgICAgY2hlY2tlZDogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsNCiAgICAgICAgZWxlbWVudC5jaGVja2VkID0gISF2YWx1ZTsNCiAgICAgIH0sDQoNCiAgICAgIHN0eWxlOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZSkgew0KICAgICAgICBlbGVtZW50LnN0eWxlLmNzc1RleHQgPSB2YWx1ZSA/IHZhbHVlIDogJyc7DQogICAgICB9DQogICAgfQ0KICB9Ow0KDQogIEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy5oYXMgPSB7fTsNCg0KICAkdygnY29sU3BhbiByb3dTcGFuIHZBbGlnbiBkYXRlVGltZSBhY2Nlc3NLZXkgdGFiSW5kZXggJyArDQogICAgICAnZW5jVHlwZSBtYXhMZW5ndGggcmVhZE9ubHkgbG9uZ0Rlc2MgZnJhbWVCb3JkZXInKS5lYWNoKGZ1bmN0aW9uKGF0dHIpIHsNCiAgICBFbGVtZW50Ll9hdHRyaWJ1dGVUcmFuc2xhdGlvbnMud3JpdGUubmFtZXNbYXR0ci50b0xvd2VyQ2FzZSgpXSA9IGF0dHI7DQogICAgRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLmhhc1thdHRyLnRvTG93ZXJDYXNlKCldID0gYXR0cjsNCiAgfSk7DQoNCiAgKGZ1bmN0aW9uKHYpIHsNCiAgICBPYmplY3QuZXh0ZW5kKHYsIHsNCiAgICAgIGhyZWY6ICAgICAgICB2Ll9nZXRBdHRyMiwNCiAgICAgIHNyYzogICAgICAgICB2Ll9nZXRBdHRyMiwNCiAgICAgIHR5cGU6ICAgICAgICB2Ll9nZXRBdHRyLA0KICAgICAgYWN0aW9uOiAgICAgIHYuX2dldEF0dHJOb2RlLA0KICAgICAgZGlzYWJsZWQ6ICAgIHYuX2ZsYWcsDQogICAgICBjaGVja2VkOiAgICAgdi5fZmxhZywNCiAgICAgIHJlYWRvbmx5OiAgICB2Ll9mbGFnLA0KICAgICAgbXVsdGlwbGU6ICAgIHYuX2ZsYWcsDQogICAgICBvbmxvYWQ6ICAgICAgdi5fZ2V0RXYsDQogICAgICBvbnVubG9hZDogICAgdi5fZ2V0RXYsDQogICAgICBvbmNsaWNrOiAgICAgdi5fZ2V0RXYsDQogICAgICBvbmRibGNsaWNrOiAgdi5fZ2V0RXYsDQogICAgICBvbm1vdXNlZG93bjogdi5fZ2V0RXYsDQogICAgICBvbm1vdXNldXA6ICAgdi5fZ2V0RXYsDQogICAgICBvbm1vdXNlb3Zlcjogdi5fZ2V0RXYsDQogICAgICBvbm1vdXNlbW92ZTogdi5fZ2V0RXYsDQogICAgICBvbm1vdXNlb3V0OiAgdi5fZ2V0RXYsDQogICAgICBvbmZvY3VzOiAgICAgdi5fZ2V0RXYsDQogICAgICBvbmJsdXI6ICAgICAgdi5fZ2V0RXYsDQogICAgICBvbmtleXByZXNzOiAgdi5fZ2V0RXYsDQogICAgICBvbmtleWRvd246ICAgdi5fZ2V0RXYsDQogICAgICBvbmtleXVwOiAgICAgdi5fZ2V0RXYsDQogICAgICBvbnN1Ym1pdDogICAgdi5fZ2V0RXYsDQogICAgICBvbnJlc2V0OiAgICAgdi5fZ2V0RXYsDQogICAgICBvbnNlbGVjdDogICAgdi5fZ2V0RXYsDQogICAgICBvbmNoYW5nZTogICAgdi5fZ2V0RXYNCiAgICB9KTsNCiAgfSkoRWxlbWVudC5fYXR0cmlidXRlVHJhbnNsYXRpb25zLnJlYWQudmFsdWVzKTsNCg0KICBpZiAoUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5FbGVtZW50RXh0ZW5zaW9ucykgew0KICAgIChmdW5jdGlvbigpIHsNCiAgICAgIGZ1bmN0aW9uIF9kZXNjZW5kYW50cyhlbGVtZW50KSB7DQogICAgICAgIHZhciBub2RlcyA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSwgcmVzdWx0cyA9IFtdOw0KICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgbm9kZSA9IG5vZGVzW2ldOyBpKyspDQogICAgICAgICAgaWYgKG5vZGUudGFnTmFtZSAhPT0gIiEiKSAvLyBGaWx0ZXIgb3V0IGNvbW1lbnQgbm9kZXMuDQogICAgICAgICAgICByZXN1bHRzLnB1c2gobm9kZSk7DQogICAgICAgIHJldHVybiByZXN1bHRzOw0KICAgICAgfQ0KDQogICAgICBFbGVtZW50Lk1ldGhvZHMuZG93biA9IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb24sIGluZGV4KSB7DQogICAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSByZXR1cm4gZWxlbWVudC5maXJzdERlc2NlbmRhbnQoKTsNCiAgICAgICAgcmV0dXJuIE9iamVjdC5pc051bWJlcihleHByZXNzaW9uKSA/IF9kZXNjZW5kYW50cyhlbGVtZW50KVtleHByZXNzaW9uXSA6DQogICAgICAgICAgRWxlbWVudC5zZWxlY3QoZWxlbWVudCwgZXhwcmVzc2lvbilbaW5kZXggfHwgMF07DQogICAgICB9DQogICAgfSkoKTsNCiAgfQ0KDQp9DQoNCmVsc2UgaWYgKFByb3RvdHlwZS5Ccm93c2VyLkdlY2tvICYmIC9ydjoxXC44XC4wLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7DQogIEVsZW1lbnQuTWV0aG9kcy5zZXRPcGFjaXR5ID0gZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAodmFsdWUgPT0gMSkgPyAwLjk5OTk5OSA6DQogICAgICAodmFsdWUgPT09ICcnKSA/ICcnIDogKHZhbHVlIDwgMC4wMDAwMSkgPyAwIDogdmFsdWU7DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH07DQp9DQoNCmVsc2UgaWYgKFByb3RvdHlwZS5Ccm93c2VyLldlYktpdCkgew0KICBFbGVtZW50Lk1ldGhvZHMuc2V0T3BhY2l0eSA9IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlKSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gKHZhbHVlID09IDEgfHwgdmFsdWUgPT09ICcnKSA/ICcnIDoNCiAgICAgICh2YWx1ZSA8IDAuMDAwMDEpID8gMCA6IHZhbHVlOw0KDQogICAgaWYgKHZhbHVlID09IDEpDQogICAgICBpZiAoZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT0gJ0lNRycgJiYgZWxlbWVudC53aWR0aCkgew0KICAgICAgICBlbGVtZW50LndpZHRoKys7IGVsZW1lbnQud2lkdGgtLTsNCiAgICAgIH0gZWxzZSB0cnkgew0KICAgICAgICB2YXIgbiA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcgJyk7DQogICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobik7DQogICAgICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQobik7DQogICAgICB9IGNhdGNoIChlKSB7IH0NCg0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9Ow0KfQ0KDQppZiAoJ291dGVySFRNTCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7DQogIEVsZW1lbnQuTWV0aG9kcy5yZXBsYWNlID0gZnVuY3Rpb24oZWxlbWVudCwgY29udGVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KDQogICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50b0VsZW1lbnQpIGNvbnRlbnQgPSBjb250ZW50LnRvRWxlbWVudCgpOw0KICAgIGlmIChPYmplY3QuaXNFbGVtZW50KGNvbnRlbnQpKSB7DQogICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGNvbnRlbnQsIGVsZW1lbnQpOw0KICAgICAgcmV0dXJuIGVsZW1lbnQ7DQogICAgfQ0KDQogICAgY29udGVudCA9IE9iamVjdC50b0hUTUwoY29udGVudCk7DQogICAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSwgdGFnTmFtZSA9IHBhcmVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCk7DQoNCiAgICBpZiAoRWxlbWVudC5faW5zZXJ0aW9uVHJhbnNsYXRpb25zLnRhZ3NbdGFnTmFtZV0pIHsNCiAgICAgIHZhciBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dCgpLA0KICAgICAgICAgIGZyYWdtZW50cyA9IEVsZW1lbnQuX2dldENvbnRlbnRGcm9tQW5vbnltb3VzRWxlbWVudCh0YWdOYW1lLCBjb250ZW50LnN0cmlwU2NyaXB0cygpKTsNCiAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChlbGVtZW50KTsNCiAgICAgIGlmIChuZXh0U2libGluZykNCiAgICAgICAgZnJhZ21lbnRzLmVhY2goZnVuY3Rpb24obm9kZSkgeyBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHRTaWJsaW5nKSB9KTsNCiAgICAgIGVsc2UNCiAgICAgICAgZnJhZ21lbnRzLmVhY2goZnVuY3Rpb24obm9kZSkgeyBwYXJlbnQuYXBwZW5kQ2hpbGQobm9kZSkgfSk7DQogICAgfQ0KICAgIGVsc2UgZWxlbWVudC5vdXRlckhUTUwgPSBjb250ZW50LnN0cmlwU2NyaXB0cygpOw0KDQogICAgY29udGVudC5ldmFsU2NyaXB0cy5iaW5kKGNvbnRlbnQpLmRlZmVyKCk7DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH07DQp9DQoNCkVsZW1lbnQuX3JldHVybk9mZnNldCA9IGZ1bmN0aW9uKGwsIHQpIHsNCiAgdmFyIHJlc3VsdCA9IFtsLCB0XTsNCiAgcmVzdWx0LmxlZnQgPSBsOw0KICByZXN1bHQudG9wID0gdDsNCiAgcmV0dXJuIHJlc3VsdDsNCn07DQoNCkVsZW1lbnQuX2dldENvbnRlbnRGcm9tQW5vbnltb3VzRWxlbWVudCA9IGZ1bmN0aW9uKHRhZ05hbWUsIGh0bWwsIGZvcmNlKSB7DQogIHZhciBkaXYgPSBuZXcgRWxlbWVudCgnZGl2JyksDQogICAgICB0ID0gRWxlbWVudC5faW5zZXJ0aW9uVHJhbnNsYXRpb25zLnRhZ3NbdGFnTmFtZV07DQoNCiAgdmFyIHdvcmthcm91bmQgPSBmYWxzZTsNCiAgaWYgKHQpIHdvcmthcm91bmQgPSB0cnVlOw0KICBlbHNlIGlmIChmb3JjZSkgew0KICAgIHdvcmthcm91bmQgPSB0cnVlOw0KICAgIHQgPSBbJycsICcnLCAwXTsNCiAgfQ0KDQogIGlmICh3b3JrYXJvdW5kKSB7DQogICAgZGl2LmlubmVySFRNTCA9ICcmbmJzcDsnICsgdFswXSArIGh0bWwgKyB0WzFdOw0KICAgIGRpdi5yZW1vdmVDaGlsZChkaXYuZmlyc3RDaGlsZCk7DQogICAgZm9yICh2YXIgaSA9IHRbMl07IGktLTsgKSB7DQogICAgICBkaXYgPSBkaXYuZmlyc3RDaGlsZDsNCiAgICB9DQogIH0NCiAgZWxzZSB7DQogICAgZGl2LmlubmVySFRNTCA9IGh0bWw7DQogIH0NCiAgcmV0dXJuICRBKGRpdi5jaGlsZE5vZGVzKTsNCn07DQoNCkVsZW1lbnQuX2luc2VydGlvblRyYW5zbGF0aW9ucyA9IHsNCiAgYmVmb3JlOiBmdW5jdGlvbihlbGVtZW50LCBub2RlKSB7DQogICAgZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBlbGVtZW50KTsNCiAgfSwNCiAgdG9wOiBmdW5jdGlvbihlbGVtZW50LCBub2RlKSB7DQogICAgZWxlbWVudC5pbnNlcnRCZWZvcmUobm9kZSwgZWxlbWVudC5maXJzdENoaWxkKTsNCiAgfSwNCiAgYm90dG9tOiBmdW5jdGlvbihlbGVtZW50LCBub2RlKSB7DQogICAgZWxlbWVudC5hcHBlbmRDaGlsZChub2RlKTsNCiAgfSwNCiAgYWZ0ZXI6IGZ1bmN0aW9uKGVsZW1lbnQsIG5vZGUpIHsNCiAgICBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGVsZW1lbnQubmV4dFNpYmxpbmcpOw0KICB9LA0KICB0YWdzOiB7DQogICAgVEFCTEU6ICBbJzx0YWJsZT4nLCAgICAgICAgICAgICAgICAnPC90YWJsZT4nLCAgICAgICAgICAgICAgICAgICAxXSwNCiAgICBUQk9EWTogIFsnPHRhYmxlPjx0Ym9keT4nLCAgICAgICAgICc8L3Rib2R5PjwvdGFibGU+JywgICAgICAgICAgIDJdLA0KICAgIFRSOiAgICAgWyc8dGFibGU+PHRib2R5Pjx0cj4nLCAgICAgJzwvdHI+PC90Ym9keT48L3RhYmxlPicsICAgICAgM10sDQogICAgVEQ6ICAgICBbJzx0YWJsZT48dGJvZHk+PHRyPjx0ZD4nLCAnPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4nLCA0XSwNCiAgICBTRUxFQ1Q6IFsnPHNlbGVjdD4nLCAgICAgICAgICAgICAgICc8L3NlbGVjdD4nLCAgICAgICAgICAgICAgICAgIDFdDQogIH0NCn07DQoNCihmdW5jdGlvbigpIHsNCiAgdmFyIHRhZ3MgPSBFbGVtZW50Ll9pbnNlcnRpb25UcmFuc2xhdGlvbnMudGFnczsNCiAgT2JqZWN0LmV4dGVuZCh0YWdzLCB7DQogICAgVEhFQUQ6IHRhZ3MuVEJPRFksDQogICAgVEZPT1Q6IHRhZ3MuVEJPRFksDQogICAgVEg6ICAgIHRhZ3MuVEQNCiAgfSk7DQp9KSgpOw0KDQpFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkID0gew0KICBoYXNBdHRyaWJ1dGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgew0KICAgIGF0dHJpYnV0ZSA9IEVsZW1lbnQuX2F0dHJpYnV0ZVRyYW5zbGF0aW9ucy5oYXNbYXR0cmlidXRlXSB8fCBhdHRyaWJ1dGU7DQogICAgdmFyIG5vZGUgPSAkKGVsZW1lbnQpLmdldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlKTsNCiAgICByZXR1cm4gISEobm9kZSAmJiBub2RlLnNwZWNpZmllZCk7DQogIH0NCn07DQoNCkVsZW1lbnQuTWV0aG9kcy5CeVRhZyA9IHsgfTsNCg0KT2JqZWN0LmV4dGVuZChFbGVtZW50LCBFbGVtZW50Lk1ldGhvZHMpOw0KDQooZnVuY3Rpb24oZGl2KSB7DQoNCiAgaWYgKCFQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLkVsZW1lbnRFeHRlbnNpb25zICYmIGRpdlsnX19wcm90b19fJ10pIHsNCiAgICB3aW5kb3cuSFRNTEVsZW1lbnQgPSB7IH07DQogICAgd2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZSA9IGRpdlsnX19wcm90b19fJ107DQogICAgUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5FbGVtZW50RXh0ZW5zaW9ucyA9IHRydWU7DQogIH0NCg0KICBkaXYgPSBudWxsOw0KDQp9KShkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7DQoNCkVsZW1lbnQuZXh0ZW5kID0gKGZ1bmN0aW9uKCkgew0KDQogIGZ1bmN0aW9uIGNoZWNrRGVmaWNpZW5jeSh0YWdOYW1lKSB7DQogICAgaWYgKHR5cGVvZiB3aW5kb3cuRWxlbWVudCAhPSAndW5kZWZpbmVkJykgew0KICAgICAgdmFyIHByb3RvID0gd2luZG93LkVsZW1lbnQucHJvdG90eXBlOw0KICAgICAgaWYgKHByb3RvKSB7DQogICAgICAgIHZhciBpZCA9ICdfJyArIChNYXRoLnJhbmRvbSgpKycnKS5zbGljZSgyKSwNCiAgICAgICAgICAgIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsNCiAgICAgICAgcHJvdG9baWRdID0gJ3gnOw0KICAgICAgICB2YXIgaXNCdWdneSA9IChlbFtpZF0gIT09ICd4Jyk7DQogICAgICAgIGRlbGV0ZSBwcm90b1tpZF07DQogICAgICAgIGVsID0gbnVsbDsNCiAgICAgICAgcmV0dXJuIGlzQnVnZ3k7DQogICAgICB9DQogICAgfQ0KICAgIHJldHVybiBmYWxzZTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGV4dGVuZEVsZW1lbnRXaXRoKGVsZW1lbnQsIG1ldGhvZHMpIHsNCiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBtZXRob2RzKSB7DQogICAgICB2YXIgdmFsdWUgPSBtZXRob2RzW3Byb3BlcnR5XTsNCiAgICAgIGlmIChPYmplY3QuaXNGdW5jdGlvbih2YWx1ZSkgJiYgIShwcm9wZXJ0eSBpbiBlbGVtZW50KSkNCiAgICAgICAgZWxlbWVudFtwcm9wZXJ0eV0gPSB2YWx1ZS5tZXRob2RpemUoKTsNCiAgICB9DQogIH0NCg0KICB2YXIgSFRNTE9CSkVDVEVMRU1FTlRfUFJPVE9UWVBFX0JVR0dZID0gY2hlY2tEZWZpY2llbmN5KCdvYmplY3QnKTsNCg0KICBpZiAoUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5TcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zKSB7DQogICAgaWYgKEhUTUxPQkpFQ1RFTEVNRU5UX1BST1RPVFlQRV9CVUdHWSkgew0KICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgaWYgKGVsZW1lbnQgJiYgdHlwZW9mIGVsZW1lbnQuX2V4dGVuZGVkQnlQcm90b3R5cGUgPT0gJ3VuZGVmaW5lZCcpIHsNCiAgICAgICAgICB2YXIgdCA9IGVsZW1lbnQudGFnTmFtZTsNCiAgICAgICAgICBpZiAodCAmJiAoL14oPzpvYmplY3R8YXBwbGV0fGVtYmVkKSQvaS50ZXN0KHQpKSkgew0KICAgICAgICAgICAgZXh0ZW5kRWxlbWVudFdpdGgoZWxlbWVudCwgRWxlbWVudC5NZXRob2RzKTsNCiAgICAgICAgICAgIGV4dGVuZEVsZW1lbnRXaXRoKGVsZW1lbnQsIEVsZW1lbnQuTWV0aG9kcy5TaW11bGF0ZWQpOw0KICAgICAgICAgICAgZXh0ZW5kRWxlbWVudFdpdGgoZWxlbWVudCwgRWxlbWVudC5NZXRob2RzLkJ5VGFnW3QudG9VcHBlckNhc2UoKV0pOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gZWxlbWVudDsNCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIFByb3RvdHlwZS5LOw0KICB9DQoNCiAgdmFyIE1ldGhvZHMgPSB7IH0sIEJ5VGFnID0gRWxlbWVudC5NZXRob2RzLkJ5VGFnOw0KDQogIHZhciBleHRlbmQgPSBPYmplY3QuZXh0ZW5kKGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBpZiAoIWVsZW1lbnQgfHwgdHlwZW9mIGVsZW1lbnQuX2V4dGVuZGVkQnlQcm90b3R5cGUgIT0gJ3VuZGVmaW5lZCcgfHwNCiAgICAgICAgZWxlbWVudC5ub2RlVHlwZSAhPSAxIHx8IGVsZW1lbnQgPT0gd2luZG93KSByZXR1cm4gZWxlbWVudDsNCg0KICAgIHZhciBtZXRob2RzID0gT2JqZWN0LmNsb25lKE1ldGhvZHMpLA0KICAgICAgICB0YWdOYW1lID0gZWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCk7DQoNCiAgICBpZiAoQnlUYWdbdGFnTmFtZV0pIE9iamVjdC5leHRlbmQobWV0aG9kcywgQnlUYWdbdGFnTmFtZV0pOw0KDQogICAgZXh0ZW5kRWxlbWVudFdpdGgoZWxlbWVudCwgbWV0aG9kcyk7DQoNCiAgICBlbGVtZW50Ll9leHRlbmRlZEJ5UHJvdG90eXBlID0gUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247DQogICAgcmV0dXJuIGVsZW1lbnQ7DQoNCiAgfSwgew0KICAgIHJlZnJlc2g6IGZ1bmN0aW9uKCkgew0KICAgICAgaWYgKCFQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLkVsZW1lbnRFeHRlbnNpb25zKSB7DQogICAgICAgIE9iamVjdC5leHRlbmQoTWV0aG9kcywgRWxlbWVudC5NZXRob2RzKTsNCiAgICAgICAgT2JqZWN0LmV4dGVuZChNZXRob2RzLCBFbGVtZW50Lk1ldGhvZHMuU2ltdWxhdGVkKTsNCiAgICAgIH0NCiAgICB9DQogIH0pOw0KDQogIGV4dGVuZC5yZWZyZXNoKCk7DQogIHJldHVybiBleHRlbmQ7DQp9KSgpOw0KDQppZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSkgew0KICBFbGVtZW50Lmhhc0F0dHJpYnV0ZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGF0dHJpYnV0ZSkgew0KICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpOw0KICB9Ow0KfQ0KZWxzZSB7DQogIEVsZW1lbnQuaGFzQXR0cmlidXRlID0gRWxlbWVudC5NZXRob2RzLlNpbXVsYXRlZC5oYXNBdHRyaWJ1dGU7DQp9DQoNCkVsZW1lbnQuYWRkTWV0aG9kcyA9IGZ1bmN0aW9uKG1ldGhvZHMpIHsNCiAgdmFyIEYgPSBQcm90b3R5cGUuQnJvd3NlckZlYXR1cmVzLCBUID0gRWxlbWVudC5NZXRob2RzLkJ5VGFnOw0KDQogIGlmICghbWV0aG9kcykgew0KICAgIE9iamVjdC5leHRlbmQoRm9ybSwgRm9ybS5NZXRob2RzKTsNCiAgICBPYmplY3QuZXh0ZW5kKEZvcm0uRWxlbWVudCwgRm9ybS5FbGVtZW50Lk1ldGhvZHMpOw0KICAgIE9iamVjdC5leHRlbmQoRWxlbWVudC5NZXRob2RzLkJ5VGFnLCB7DQogICAgICAiRk9STSI6ICAgICBPYmplY3QuY2xvbmUoRm9ybS5NZXRob2RzKSwNCiAgICAgICJJTlBVVCI6ICAgIE9iamVjdC5jbG9uZShGb3JtLkVsZW1lbnQuTWV0aG9kcyksDQogICAgICAiU0VMRUNUIjogICBPYmplY3QuY2xvbmUoRm9ybS5FbGVtZW50Lk1ldGhvZHMpLA0KICAgICAgIlRFWFRBUkVBIjogT2JqZWN0LmNsb25lKEZvcm0uRWxlbWVudC5NZXRob2RzKSwNCiAgICAgICJCVVRUT04iOiAgIE9iamVjdC5jbG9uZShGb3JtLkVsZW1lbnQuTWV0aG9kcykNCiAgICB9KTsNCiAgfQ0KDQogIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHsNCiAgICB2YXIgdGFnTmFtZSA9IG1ldGhvZHM7DQogICAgbWV0aG9kcyA9IGFyZ3VtZW50c1sxXTsNCiAgfQ0KDQogIGlmICghdGFnTmFtZSkgT2JqZWN0LmV4dGVuZChFbGVtZW50Lk1ldGhvZHMsIG1ldGhvZHMgfHwgeyB9KTsNCiAgZWxzZSB7DQogICAgaWYgKE9iamVjdC5pc0FycmF5KHRhZ05hbWUpKSB0YWdOYW1lLmVhY2goZXh0ZW5kKTsNCiAgICBlbHNlIGV4dGVuZCh0YWdOYW1lKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGV4dGVuZCh0YWdOYW1lKSB7DQogICAgdGFnTmFtZSA9IHRhZ05hbWUudG9VcHBlckNhc2UoKTsNCiAgICBpZiAoIUVsZW1lbnQuTWV0aG9kcy5CeVRhZ1t0YWdOYW1lXSkNCiAgICAgIEVsZW1lbnQuTWV0aG9kcy5CeVRhZ1t0YWdOYW1lXSA9IHsgfTsNCiAgICBPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTWV0aG9kcy5CeVRhZ1t0YWdOYW1lXSwgbWV0aG9kcyk7DQogIH0NCg0KICBmdW5jdGlvbiBjb3B5KG1ldGhvZHMsIGRlc3RpbmF0aW9uLCBvbmx5SWZBYnNlbnQpIHsNCiAgICBvbmx5SWZBYnNlbnQgPSBvbmx5SWZBYnNlbnQgfHwgZmFsc2U7DQogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gbWV0aG9kcykgew0KICAgICAgdmFyIHZhbHVlID0gbWV0aG9kc1twcm9wZXJ0eV07DQogICAgICBpZiAoIU9iamVjdC5pc0Z1bmN0aW9uKHZhbHVlKSkgY29udGludWU7DQogICAgICBpZiAoIW9ubHlJZkFic2VudCB8fCAhKHByb3BlcnR5IGluIGRlc3RpbmF0aW9uKSkNCiAgICAgICAgZGVzdGluYXRpb25bcHJvcGVydHldID0gdmFsdWUubWV0aG9kaXplKCk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gZmluZERPTUNsYXNzKHRhZ05hbWUpIHsNCiAgICB2YXIga2xhc3M7DQogICAgdmFyIHRyYW5zID0gew0KICAgICAgIk9QVEdST1VQIjogIk9wdEdyb3VwIiwgIlRFWFRBUkVBIjogIlRleHRBcmVhIiwgIlAiOiAiUGFyYWdyYXBoIiwNCiAgICAgICJGSUVMRFNFVCI6ICJGaWVsZFNldCIsICJVTCI6ICJVTGlzdCIsICJPTCI6ICJPTGlzdCIsICJETCI6ICJETGlzdCIsDQogICAgICAiRElSIjogIkRpcmVjdG9yeSIsICJIMSI6ICJIZWFkaW5nIiwgIkgyIjogIkhlYWRpbmciLCAiSDMiOiAiSGVhZGluZyIsDQogICAgICAiSDQiOiAiSGVhZGluZyIsICJINSI6ICJIZWFkaW5nIiwgIkg2IjogIkhlYWRpbmciLCAiUSI6ICJRdW90ZSIsDQogICAgICAiSU5TIjogIk1vZCIsICJERUwiOiAiTW9kIiwgIkEiOiAiQW5jaG9yIiwgIklNRyI6ICJJbWFnZSIsICJDQVBUSU9OIjoNCiAgICAgICJUYWJsZUNhcHRpb24iLCAiQ09MIjogIlRhYmxlQ29sIiwgIkNPTEdST1VQIjogIlRhYmxlQ29sIiwgIlRIRUFEIjoNCiAgICAgICJUYWJsZVNlY3Rpb24iLCAiVEZPT1QiOiAiVGFibGVTZWN0aW9uIiwgIlRCT0RZIjogIlRhYmxlU2VjdGlvbiIsICJUUiI6DQogICAgICAiVGFibGVSb3ciLCAiVEgiOiAiVGFibGVDZWxsIiwgIlREIjogIlRhYmxlQ2VsbCIsICJGUkFNRVNFVCI6DQogICAgICAiRnJhbWVTZXQiLCAiSUZSQU1FIjogIklGcmFtZSINCiAgICB9Ow0KICAgIGlmICh0cmFuc1t0YWdOYW1lXSkga2xhc3MgPSAnSFRNTCcgKyB0cmFuc1t0YWdOYW1lXSArICdFbGVtZW50JzsNCiAgICBpZiAod2luZG93W2tsYXNzXSkgcmV0dXJuIHdpbmRvd1trbGFzc107DQogICAga2xhc3MgPSAnSFRNTCcgKyB0YWdOYW1lICsgJ0VsZW1lbnQnOw0KICAgIGlmICh3aW5kb3dba2xhc3NdKSByZXR1cm4gd2luZG93W2tsYXNzXTsNCiAgICBrbGFzcyA9ICdIVE1MJyArIHRhZ05hbWUuY2FwaXRhbGl6ZSgpICsgJ0VsZW1lbnQnOw0KICAgIGlmICh3aW5kb3dba2xhc3NdKSByZXR1cm4gd2luZG93W2tsYXNzXTsNCg0KICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKSwNCiAgICAgICAgcHJvdG8gPSBlbGVtZW50WydfX3Byb3RvX18nXSB8fCBlbGVtZW50LmNvbnN0cnVjdG9yLnByb3RvdHlwZTsNCg0KICAgIGVsZW1lbnQgPSBudWxsOw0KICAgIHJldHVybiBwcm90bzsNCiAgfQ0KDQogIHZhciBlbGVtZW50UHJvdG90eXBlID0gd2luZG93LkhUTUxFbGVtZW50ID8gSFRNTEVsZW1lbnQucHJvdG90eXBlIDoNCiAgIEVsZW1lbnQucHJvdG90eXBlOw0KDQogIGlmIChGLkVsZW1lbnRFeHRlbnNpb25zKSB7DQogICAgY29weShFbGVtZW50Lk1ldGhvZHMsIGVsZW1lbnRQcm90b3R5cGUpOw0KICAgIGNvcHkoRWxlbWVudC5NZXRob2RzLlNpbXVsYXRlZCwgZWxlbWVudFByb3RvdHlwZSwgdHJ1ZSk7DQogIH0NCg0KICBpZiAoRi5TcGVjaWZpY0VsZW1lbnRFeHRlbnNpb25zKSB7DQogICAgZm9yICh2YXIgdGFnIGluIEVsZW1lbnQuTWV0aG9kcy5CeVRhZykgew0KICAgICAgdmFyIGtsYXNzID0gZmluZERPTUNsYXNzKHRhZyk7DQogICAgICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKGtsYXNzKSkgY29udGludWU7DQogICAgICBjb3B5KFRbdGFnXSwga2xhc3MucHJvdG90eXBlKTsNCiAgICB9DQogIH0NCg0KICBPYmplY3QuZXh0ZW5kKEVsZW1lbnQsIEVsZW1lbnQuTWV0aG9kcyk7DQogIGRlbGV0ZSBFbGVtZW50LkJ5VGFnOw0KDQogIGlmIChFbGVtZW50LmV4dGVuZC5yZWZyZXNoKSBFbGVtZW50LmV4dGVuZC5yZWZyZXNoKCk7DQogIEVsZW1lbnQuY2FjaGUgPSB7IH07DQp9Ow0KDQoNCmRvY3VtZW50LnZpZXdwb3J0ID0gew0KDQogIGdldERpbWVuc2lvbnM6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB7IHdpZHRoOiB0aGlzLmdldFdpZHRoKCksIGhlaWdodDogdGhpcy5nZXRIZWlnaHQoKSB9Ow0KICB9LA0KDQogIGdldFNjcm9sbE9mZnNldHM6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBFbGVtZW50Ll9yZXR1cm5PZmZzZXQoDQogICAgICB3aW5kb3cucGFnZVhPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0LA0KICAgICAgd2luZG93LnBhZ2VZT2Zmc2V0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKTsNCiAgfQ0KfTsNCg0KKGZ1bmN0aW9uKHZpZXdwb3J0KSB7DQogIHZhciBCID0gUHJvdG90eXBlLkJyb3dzZXIsIGRvYyA9IGRvY3VtZW50LCBlbGVtZW50LCBwcm9wZXJ0eSA9IHt9Ow0KDQogIGZ1bmN0aW9uIGdldFJvb3RFbGVtZW50KCkgew0KICAgIGlmIChCLldlYktpdCAmJiAhZG9jLmV2YWx1YXRlKQ0KICAgICAgcmV0dXJuIGRvY3VtZW50Ow0KDQogICAgaWYgKEIuT3BlcmEgJiYgd2luZG93LnBhcnNlRmxvYXQod2luZG93Lm9wZXJhLnZlcnNpb24oKSkgPCA5LjUpDQogICAgICByZXR1cm4gZG9jdW1lbnQuYm9keTsNCg0KICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7DQogIH0NCg0KICBmdW5jdGlvbiBkZWZpbmUoRCkgew0KICAgIGlmICghZWxlbWVudCkgZWxlbWVudCA9IGdldFJvb3RFbGVtZW50KCk7DQoNCiAgICBwcm9wZXJ0eVtEXSA9ICdjbGllbnQnICsgRDsNCg0KICAgIHZpZXdwb3J0WydnZXQnICsgRF0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIGVsZW1lbnRbcHJvcGVydHlbRF1dIH07DQogICAgcmV0dXJuIHZpZXdwb3J0WydnZXQnICsgRF0oKTsNCiAgfQ0KDQogIHZpZXdwb3J0LmdldFdpZHRoICA9IGRlZmluZS5jdXJyeSgnV2lkdGgnKTsNCg0KICB2aWV3cG9ydC5nZXRIZWlnaHQgPSBkZWZpbmUuY3VycnkoJ0hlaWdodCcpOw0KfSkoZG9jdW1lbnQudmlld3BvcnQpOw0KDQoNCkVsZW1lbnQuU3RvcmFnZSA9IHsNCiAgVUlEOiAxDQp9Ow0KDQpFbGVtZW50LmFkZE1ldGhvZHMoew0KICBnZXRTdG9yYWdlOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgaWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkpKSByZXR1cm47DQoNCiAgICB2YXIgdWlkOw0KICAgIGlmIChlbGVtZW50ID09PSB3aW5kb3cpIHsNCiAgICAgIHVpZCA9IDA7DQogICAgfSBlbHNlIHsNCiAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5fcHJvdG90eXBlVUlEID09PSAidW5kZWZpbmVkIikNCiAgICAgICAgZWxlbWVudC5fcHJvdG90eXBlVUlEID0gRWxlbWVudC5TdG9yYWdlLlVJRCsrOw0KICAgICAgdWlkID0gZWxlbWVudC5fcHJvdG90eXBlVUlEOw0KICAgIH0NCg0KICAgIGlmICghRWxlbWVudC5TdG9yYWdlW3VpZF0pDQogICAgICBFbGVtZW50LlN0b3JhZ2VbdWlkXSA9ICRIKCk7DQoNCiAgICByZXR1cm4gRWxlbWVudC5TdG9yYWdlW3VpZF07DQogIH0sDQoNCiAgc3RvcmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGtleSwgdmFsdWUpIHsNCiAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KSkpIHJldHVybjsNCg0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7DQogICAgICBFbGVtZW50LmdldFN0b3JhZ2UoZWxlbWVudCkudXBkYXRlKGtleSk7DQogICAgfSBlbHNlIHsNCiAgICAgIEVsZW1lbnQuZ2V0U3RvcmFnZShlbGVtZW50KS5zZXQoa2V5LCB2YWx1ZSk7DQogICAgfQ0KDQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0sDQoNCiAgcmV0cmlldmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGtleSwgZGVmYXVsdFZhbHVlKSB7DQogICAgaWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkpKSByZXR1cm47DQogICAgdmFyIGhhc2ggPSBFbGVtZW50LmdldFN0b3JhZ2UoZWxlbWVudCksIHZhbHVlID0gaGFzaC5nZXQoa2V5KTsNCg0KICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQodmFsdWUpKSB7DQogICAgICBoYXNoLnNldChrZXksIGRlZmF1bHRWYWx1ZSk7DQogICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTsNCiAgICB9DQoNCiAgICByZXR1cm4gdmFsdWU7DQogIH0sDQoNCiAgY2xvbmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGRlZXApIHsNCiAgICBpZiAoIShlbGVtZW50ID0gJChlbGVtZW50KSkpIHJldHVybjsNCiAgICB2YXIgY2xvbmUgPSBlbGVtZW50LmNsb25lTm9kZShkZWVwKTsNCiAgICBjbG9uZS5fcHJvdG90eXBlVUlEID0gdm9pZCAwOw0KICAgIGlmIChkZWVwKSB7DQogICAgICB2YXIgZGVzY2VuZGFudHMgPSBFbGVtZW50LnNlbGVjdChjbG9uZSwgJyonKSwNCiAgICAgICAgICBpID0gZGVzY2VuZGFudHMubGVuZ3RoOw0KICAgICAgd2hpbGUgKGktLSkgew0KICAgICAgICBkZXNjZW5kYW50c1tpXS5fcHJvdG90eXBlVUlEID0gdm9pZCAwOw0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gRWxlbWVudC5leHRlbmQoY2xvbmUpOw0KICB9LA0KDQogIHB1cmdlOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgaWYgKCEoZWxlbWVudCA9ICQoZWxlbWVudCkpKSByZXR1cm47DQogICAgdmFyIHB1cmdlRWxlbWVudCA9IEVsZW1lbnQuX3B1cmdlRWxlbWVudDsNCg0KICAgIHB1cmdlRWxlbWVudChlbGVtZW50KTsNCg0KICAgIHZhciBkZXNjZW5kYW50cyA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSwNCiAgICAgaSA9IGRlc2NlbmRhbnRzLmxlbmd0aDsNCg0KICAgIHdoaWxlIChpLS0pIHB1cmdlRWxlbWVudChkZXNjZW5kYW50c1tpXSk7DQoNCiAgICByZXR1cm4gbnVsbDsNCiAgfQ0KfSk7DQoNCihmdW5jdGlvbigpIHsNCg0KICBmdW5jdGlvbiB0b0RlY2ltYWwocGN0U3RyaW5nKSB7DQogICAgdmFyIG1hdGNoID0gcGN0U3RyaW5nLm1hdGNoKC9eKFxkKyklPyQvaSk7DQogICAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGw7DQogICAgcmV0dXJuIChOdW1iZXIobWF0Y2hbMV0pIC8gMTAwKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGdldFBpeGVsVmFsdWUodmFsdWUsIHByb3BlcnR5LCBjb250ZXh0KSB7DQogICAgdmFyIGVsZW1lbnQgPSBudWxsOw0KICAgIGlmIChPYmplY3QuaXNFbGVtZW50KHZhbHVlKSkgew0KICAgICAgZWxlbWVudCA9IHZhbHVlOw0KICAgICAgdmFsdWUgPSBlbGVtZW50LmdldFN0eWxlKHByb3BlcnR5KTsNCiAgICB9DQoNCiAgICBpZiAodmFsdWUgPT09IG51bGwpIHsNCiAgICAgIHJldHVybiBudWxsOw0KICAgIH0NCg0KICAgIGlmICgoL14oPzotKT9cZCsoXC5cZCspPyhweCk/JC9pKS50ZXN0KHZhbHVlKSkgew0KICAgICAgcmV0dXJuIHdpbmRvdy5wYXJzZUZsb2F0KHZhbHVlKTsNCiAgICB9DQoNCiAgICB2YXIgaXNQZXJjZW50YWdlID0gdmFsdWUuaW5jbHVkZSgnJScpLCBpc1ZpZXdwb3J0ID0gKGNvbnRleHQgPT09IGRvY3VtZW50LnZpZXdwb3J0KTsNCg0KICAgIGlmICgvXGQvLnRlc3QodmFsdWUpICYmIGVsZW1lbnQgJiYgZWxlbWVudC5ydW50aW1lU3R5bGUgJiYgIShpc1BlcmNlbnRhZ2UgJiYgaXNWaWV3cG9ydCkpIHsNCiAgICAgIHZhciBzdHlsZSA9IGVsZW1lbnQuc3R5bGUubGVmdCwgclN0eWxlID0gZWxlbWVudC5ydW50aW1lU3R5bGUubGVmdDsNCiAgICAgIGVsZW1lbnQucnVudGltZVN0eWxlLmxlZnQgPSBlbGVtZW50LmN1cnJlbnRTdHlsZS5sZWZ0Ow0KICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gdmFsdWUgfHwgMDsNCiAgICAgIHZhbHVlID0gZWxlbWVudC5zdHlsZS5waXhlbExlZnQ7DQogICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBzdHlsZTsNCiAgICAgIGVsZW1lbnQucnVudGltZVN0eWxlLmxlZnQgPSByU3R5bGU7DQoNCiAgICAgIHJldHVybiB2YWx1ZTsNCiAgICB9DQoNCiAgICBpZiAoZWxlbWVudCAmJiBpc1BlcmNlbnRhZ2UpIHsNCiAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IGVsZW1lbnQucGFyZW50Tm9kZTsNCiAgICAgIHZhciBkZWNpbWFsID0gdG9EZWNpbWFsKHZhbHVlKTsNCiAgICAgIHZhciB3aG9sZSA9IG51bGw7DQogICAgICB2YXIgcG9zaXRpb24gPSBlbGVtZW50LmdldFN0eWxlKCdwb3NpdGlvbicpOw0KDQogICAgICB2YXIgaXNIb3Jpem9udGFsID0gcHJvcGVydHkuaW5jbHVkZSgnbGVmdCcpIHx8IHByb3BlcnR5LmluY2x1ZGUoJ3JpZ2h0JykgfHwNCiAgICAgICBwcm9wZXJ0eS5pbmNsdWRlKCd3aWR0aCcpOw0KDQogICAgICB2YXIgaXNWZXJ0aWNhbCA9ICBwcm9wZXJ0eS5pbmNsdWRlKCd0b3AnKSB8fCBwcm9wZXJ0eS5pbmNsdWRlKCdib3R0b20nKSB8fA0KICAgICAgICBwcm9wZXJ0eS5pbmNsdWRlKCdoZWlnaHQnKTsNCg0KICAgICAgaWYgKGNvbnRleHQgPT09IGRvY3VtZW50LnZpZXdwb3J0KSB7DQogICAgICAgIGlmIChpc0hvcml6b250YWwpIHsNCiAgICAgICAgICB3aG9sZSA9IGRvY3VtZW50LnZpZXdwb3J0LmdldFdpZHRoKCk7DQogICAgICAgIH0gZWxzZSBpZiAoaXNWZXJ0aWNhbCkgew0KICAgICAgICAgIHdob2xlID0gZG9jdW1lbnQudmlld3BvcnQuZ2V0SGVpZ2h0KCk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGlmIChpc0hvcml6b250YWwpIHsNCiAgICAgICAgICB3aG9sZSA9ICQoY29udGV4dCkubWVhc3VyZSgnd2lkdGgnKTsNCiAgICAgICAgfSBlbHNlIGlmIChpc1ZlcnRpY2FsKSB7DQogICAgICAgICAgd2hvbGUgPSAkKGNvbnRleHQpLm1lYXN1cmUoJ2hlaWdodCcpOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIHJldHVybiAod2hvbGUgPT09IG51bGwpID8gMCA6IHdob2xlICogZGVjaW1hbDsNCiAgICB9DQoNCiAgICByZXR1cm4gMDsNCiAgfQ0KDQogIGZ1bmN0aW9uIHRvQ1NTUGl4ZWxzKG51bWJlcikgew0KICAgIGlmIChPYmplY3QuaXNTdHJpbmcobnVtYmVyKSAmJiBudW1iZXIuZW5kc1dpdGgoJ3B4JykpIHsNCiAgICAgIHJldHVybiBudW1iZXI7DQogICAgfQ0KICAgIHJldHVybiBudW1iZXIgKyAncHgnOw0KICB9DQoNCiAgZnVuY3Rpb24gaXNEaXNwbGF5ZWQoZWxlbWVudCkgew0KICAgIHZhciBvcmlnaW5hbEVsZW1lbnQgPSBlbGVtZW50Ow0KICAgIHdoaWxlIChlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSkgew0KICAgICAgdmFyIGRpc3BsYXkgPSBlbGVtZW50LmdldFN0eWxlKCdkaXNwbGF5Jyk7DQogICAgICBpZiAoZGlzcGxheSA9PT0gJ25vbmUnKSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgIH0NCiAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQucGFyZW50Tm9kZSk7DQogICAgfQ0KICAgIHJldHVybiB0cnVlOw0KICB9DQoNCiAgdmFyIGhhc0xheW91dCA9IFByb3RvdHlwZS5LOw0KICBpZiAoJ2N1cnJlbnRTdHlsZScgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7DQogICAgaGFzTGF5b3V0ID0gZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgaWYgKCFlbGVtZW50LmN1cnJlbnRTdHlsZS5oYXNMYXlvdXQpIHsNCiAgICAgICAgZWxlbWVudC5zdHlsZS56b29tID0gMTsNCiAgICAgIH0NCiAgICAgIHJldHVybiBlbGVtZW50Ow0KICAgIH07DQogIH0NCg0KICBmdW5jdGlvbiBjc3NOYW1lRm9yKGtleSkgew0KICAgIGlmIChrZXkuaW5jbHVkZSgnYm9yZGVyJykpIGtleSA9IGtleSArICctd2lkdGgnOw0KICAgIHJldHVybiBrZXkuY2FtZWxpemUoKTsNCiAgfQ0KDQogIEVsZW1lbnQuTGF5b3V0ID0gQ2xhc3MuY3JlYXRlKEhhc2gsIHsNCiAgICBpbml0aWFsaXplOiBmdW5jdGlvbigkc3VwZXIsIGVsZW1lbnQsIHByZUNvbXB1dGUpIHsNCiAgICAgICRzdXBlcigpOw0KICAgICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTsNCg0KICAgICAgRWxlbWVudC5MYXlvdXQuUFJPUEVSVElFUy5lYWNoKCBmdW5jdGlvbihwcm9wZXJ0eSkgew0KICAgICAgICB0aGlzLl9zZXQocHJvcGVydHksIG51bGwpOw0KICAgICAgfSwgdGhpcyk7DQoNCiAgICAgIGlmIChwcmVDb21wdXRlKSB7DQogICAgICAgIHRoaXMuX3ByZUNvbXB1dGluZyA9IHRydWU7DQogICAgICAgIHRoaXMuX2JlZ2luKCk7DQogICAgICAgIEVsZW1lbnQuTGF5b3V0LlBST1BFUlRJRVMuZWFjaCggdGhpcy5fY29tcHV0ZSwgdGhpcyApOw0KICAgICAgICB0aGlzLl9lbmQoKTsNCiAgICAgICAgdGhpcy5fcHJlQ29tcHV0aW5nID0gZmFsc2U7DQogICAgICB9DQogICAgfSwNCg0KICAgIF9zZXQ6IGZ1bmN0aW9uKHByb3BlcnR5LCB2YWx1ZSkgew0KICAgICAgcmV0dXJuIEhhc2gucHJvdG90eXBlLnNldC5jYWxsKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSk7DQogICAgfSwNCg0KICAgIHNldDogZnVuY3Rpb24ocHJvcGVydHksIHZhbHVlKSB7DQogICAgICB0aHJvdyAiUHJvcGVydGllcyBvZiBFbGVtZW50LkxheW91dCBhcmUgcmVhZC1vbmx5LiI7DQogICAgfSwNCg0KICAgIGdldDogZnVuY3Rpb24oJHN1cGVyLCBwcm9wZXJ0eSkgew0KICAgICAgdmFyIHZhbHVlID0gJHN1cGVyKHByb3BlcnR5KTsNCiAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IHRoaXMuX2NvbXB1dGUocHJvcGVydHkpIDogdmFsdWU7DQogICAgfSwNCg0KICAgIF9iZWdpbjogZnVuY3Rpb24oKSB7DQogICAgICBpZiAodGhpcy5fcHJlcGFyZWQpIHJldHVybjsNCg0KICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7DQogICAgICBpZiAoaXNEaXNwbGF5ZWQoZWxlbWVudCkpIHsNCiAgICAgICAgdGhpcy5fcHJlcGFyZWQgPSB0cnVlOw0KICAgICAgICByZXR1cm47DQogICAgICB9DQoNCiAgICAgIHZhciBvcmlnaW5hbFN0eWxlcyA9IHsNCiAgICAgICAgcG9zaXRpb246ICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiAgIHx8ICcnLA0KICAgICAgICB3aWR0aDogICAgICBlbGVtZW50LnN0eWxlLndpZHRoICAgICAgfHwgJycsDQogICAgICAgIHZpc2liaWxpdHk6IGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSB8fCAnJywNCiAgICAgICAgZGlzcGxheTogICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ICAgIHx8ICcnDQogICAgICB9Ow0KDQogICAgICBlbGVtZW50LnN0b3JlKCdwcm90b3R5cGVfb3JpZ2luYWxfc3R5bGVzJywgb3JpZ2luYWxTdHlsZXMpOw0KDQogICAgICB2YXIgcG9zaXRpb24gPSBlbGVtZW50LmdldFN0eWxlKCdwb3NpdGlvbicpLA0KICAgICAgIHdpZHRoID0gZWxlbWVudC5nZXRTdHlsZSgnd2lkdGgnKTsNCg0KICAgICAgaWYgKHdpZHRoID09PSAiMHB4IiB8fCB3aWR0aCA9PT0gbnVsbCkgew0KICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KICAgICAgICB3aWR0aCA9IGVsZW1lbnQuZ2V0U3R5bGUoJ3dpZHRoJyk7DQogICAgICB9DQoNCiAgICAgIHZhciBjb250ZXh0ID0gKHBvc2l0aW9uID09PSAnZml4ZWQnKSA/IGRvY3VtZW50LnZpZXdwb3J0IDoNCiAgICAgICBlbGVtZW50LnBhcmVudE5vZGU7DQoNCiAgICAgIGVsZW1lbnQuc2V0U3R5bGUoew0KICAgICAgICBwb3NpdGlvbjogICAnYWJzb2x1dGUnLA0KICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJywNCiAgICAgICAgZGlzcGxheTogICAgJ2Jsb2NrJw0KICAgICAgfSk7DQoNCiAgICAgIHZhciBwb3NpdGlvbmVkV2lkdGggPSBlbGVtZW50LmdldFN0eWxlKCd3aWR0aCcpOw0KDQogICAgICB2YXIgbmV3V2lkdGg7DQogICAgICBpZiAod2lkdGggJiYgKHBvc2l0aW9uZWRXaWR0aCA9PT0gd2lkdGgpKSB7DQogICAgICAgIG5ld1dpZHRoID0gZ2V0UGl4ZWxWYWx1ZShlbGVtZW50LCAnd2lkdGgnLCBjb250ZXh0KTsNCiAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT09ICdhYnNvbHV0ZScgfHwgcG9zaXRpb24gPT09ICdmaXhlZCcpIHsNCiAgICAgICAgbmV3V2lkdGggPSBnZXRQaXhlbFZhbHVlKGVsZW1lbnQsICd3aWR0aCcsIGNvbnRleHQpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSwgcExheW91dCA9ICQocGFyZW50KS5nZXRMYXlvdXQoKTsNCg0KICAgICAgICBuZXdXaWR0aCA9IHBMYXlvdXQuZ2V0KCd3aWR0aCcpIC0NCiAgICAgICAgIHRoaXMuZ2V0KCdtYXJnaW4tbGVmdCcpIC0NCiAgICAgICAgIHRoaXMuZ2V0KCdib3JkZXItbGVmdCcpIC0NCiAgICAgICAgIHRoaXMuZ2V0KCdwYWRkaW5nLWxlZnQnKSAtDQogICAgICAgICB0aGlzLmdldCgncGFkZGluZy1yaWdodCcpIC0NCiAgICAgICAgIHRoaXMuZ2V0KCdib3JkZXItcmlnaHQnKSAtDQogICAgICAgICB0aGlzLmdldCgnbWFyZ2luLXJpZ2h0Jyk7DQogICAgICB9DQoNCiAgICAgIGVsZW1lbnQuc2V0U3R5bGUoeyB3aWR0aDogbmV3V2lkdGggKyAncHgnIH0pOw0KDQogICAgICB0aGlzLl9wcmVwYXJlZCA9IHRydWU7DQogICAgfSwNCg0KICAgIF9lbmQ6IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7DQogICAgICB2YXIgb3JpZ2luYWxTdHlsZXMgPSBlbGVtZW50LnJldHJpZXZlKCdwcm90b3R5cGVfb3JpZ2luYWxfc3R5bGVzJyk7DQogICAgICBlbGVtZW50LnN0b3JlKCdwcm90b3R5cGVfb3JpZ2luYWxfc3R5bGVzJywgbnVsbCk7DQogICAgICBlbGVtZW50LnNldFN0eWxlKG9yaWdpbmFsU3R5bGVzKTsNCiAgICAgIHRoaXMuX3ByZXBhcmVkID0gZmFsc2U7DQogICAgfSwNCg0KICAgIF9jb21wdXRlOiBmdW5jdGlvbihwcm9wZXJ0eSkgew0KICAgICAgdmFyIENPTVBVVEFUSU9OUyA9IEVsZW1lbnQuTGF5b3V0LkNPTVBVVEFUSU9OUzsNCiAgICAgIGlmICghKHByb3BlcnR5IGluIENPTVBVVEFUSU9OUykpIHsNCiAgICAgICAgdGhyb3cgIlByb3BlcnR5IG5vdCBmb3VuZC4iOw0KICAgICAgfQ0KDQogICAgICByZXR1cm4gdGhpcy5fc2V0KHByb3BlcnR5LCBDT01QVVRBVElPTlNbcHJvcGVydHldLmNhbGwodGhpcywgdGhpcy5lbGVtZW50KSk7DQogICAgfSwNCg0KICAgIHRvT2JqZWN0OiBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBhcmdzID0gJEEoYXJndW1lbnRzKTsNCiAgICAgIHZhciBrZXlzID0gKGFyZ3MubGVuZ3RoID09PSAwKSA/IEVsZW1lbnQuTGF5b3V0LlBST1BFUlRJRVMgOg0KICAgICAgIGFyZ3Muam9pbignICcpLnNwbGl0KCcgJyk7DQogICAgICB2YXIgb2JqID0ge307DQogICAgICBrZXlzLmVhY2goIGZ1bmN0aW9uKGtleSkgew0KICAgICAgICBpZiAoIUVsZW1lbnQuTGF5b3V0LlBST1BFUlRJRVMuaW5jbHVkZShrZXkpKSByZXR1cm47DQogICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0KGtleSk7DQogICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSBvYmpba2V5XSA9IHZhbHVlOw0KICAgICAgfSwgdGhpcyk7DQogICAgICByZXR1cm4gb2JqOw0KICAgIH0sDQoNCiAgICB0b0hhc2g6IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIG9iaiA9IHRoaXMudG9PYmplY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICAgIHJldHVybiBuZXcgSGFzaChvYmopOw0KICAgIH0sDQoNCiAgICB0b0NTUzogZnVuY3Rpb24oKSB7DQogICAgICB2YXIgYXJncyA9ICRBKGFyZ3VtZW50cyk7DQogICAgICB2YXIga2V5cyA9IChhcmdzLmxlbmd0aCA9PT0gMCkgPyBFbGVtZW50LkxheW91dC5QUk9QRVJUSUVTIDoNCiAgICAgICBhcmdzLmpvaW4oJyAnKS5zcGxpdCgnICcpOw0KICAgICAgdmFyIGNzcyA9IHt9Ow0KDQogICAgICBrZXlzLmVhY2goIGZ1bmN0aW9uKGtleSkgew0KICAgICAgICBpZiAoIUVsZW1lbnQuTGF5b3V0LlBST1BFUlRJRVMuaW5jbHVkZShrZXkpKSByZXR1cm47DQogICAgICAgIGlmIChFbGVtZW50LkxheW91dC5DT01QT1NJVEVfUFJPUEVSVElFUy5pbmNsdWRlKGtleSkpIHJldHVybjsNCg0KICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmdldChrZXkpOw0KICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgY3NzW2Nzc05hbWVGb3Ioa2V5KV0gPSB2YWx1ZSArICdweCc7DQogICAgICB9LCB0aGlzKTsNCiAgICAgIHJldHVybiBjc3M7DQogICAgfSwNCg0KICAgIGluc3BlY3Q6IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuICIjPEVsZW1lbnQuTGF5b3V0PiI7DQogICAgfQ0KICB9KTsNCg0KICBPYmplY3QuZXh0ZW5kKEVsZW1lbnQuTGF5b3V0LCB7DQogICAgUFJPUEVSVElFUzogJHcoJ2hlaWdodCB3aWR0aCB0b3AgbGVmdCByaWdodCBib3R0b20gYm9yZGVyLWxlZnQgYm9yZGVyLXJpZ2h0IGJvcmRlci10b3AgYm9yZGVyLWJvdHRvbSBwYWRkaW5nLWxlZnQgcGFkZGluZy1yaWdodCBwYWRkaW5nLXRvcCBwYWRkaW5nLWJvdHRvbSBtYXJnaW4tdG9wIG1hcmdpbi1ib3R0b20gbWFyZ2luLWxlZnQgbWFyZ2luLXJpZ2h0IHBhZGRpbmctYm94LXdpZHRoIHBhZGRpbmctYm94LWhlaWdodCBib3JkZXItYm94LXdpZHRoIGJvcmRlci1ib3gtaGVpZ2h0IG1hcmdpbi1ib3gtd2lkdGggbWFyZ2luLWJveC1oZWlnaHQnKSwNCg0KICAgIENPTVBPU0lURV9QUk9QRVJUSUVTOiAkdygncGFkZGluZy1ib3gtd2lkdGggcGFkZGluZy1ib3gtaGVpZ2h0IG1hcmdpbi1ib3gtd2lkdGggbWFyZ2luLWJveC1oZWlnaHQgYm9yZGVyLWJveC13aWR0aCBib3JkZXItYm94LWhlaWdodCcpLA0KDQogICAgQ09NUFVUQVRJT05TOiB7DQogICAgICAnaGVpZ2h0JzogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICBpZiAoIXRoaXMuX3ByZUNvbXB1dGluZykgdGhpcy5fYmVnaW4oKTsNCg0KICAgICAgICB2YXIgYkhlaWdodCA9IHRoaXMuZ2V0KCdib3JkZXItYm94LWhlaWdodCcpOw0KICAgICAgICBpZiAoYkhlaWdodCA8PSAwKSB7DQogICAgICAgICAgaWYgKCF0aGlzLl9wcmVDb21wdXRpbmcpIHRoaXMuX2VuZCgpOw0KICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGJUb3AgPSB0aGlzLmdldCgnYm9yZGVyLXRvcCcpLA0KICAgICAgICAgYkJvdHRvbSA9IHRoaXMuZ2V0KCdib3JkZXItYm90dG9tJyk7DQoNCiAgICAgICAgdmFyIHBUb3AgPSB0aGlzLmdldCgncGFkZGluZy10b3AnKSwNCiAgICAgICAgIHBCb3R0b20gPSB0aGlzLmdldCgncGFkZGluZy1ib3R0b20nKTsNCg0KICAgICAgICBpZiAoIXRoaXMuX3ByZUNvbXB1dGluZykgdGhpcy5fZW5kKCk7DQoNCiAgICAgICAgcmV0dXJuIGJIZWlnaHQgLSBiVG9wIC0gYkJvdHRvbSAtIHBUb3AgLSBwQm90dG9tOw0KICAgICAgfSwNCg0KICAgICAgJ3dpZHRoJzogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICBpZiAoIXRoaXMuX3ByZUNvbXB1dGluZykgdGhpcy5fYmVnaW4oKTsNCg0KICAgICAgICB2YXIgYldpZHRoID0gdGhpcy5nZXQoJ2JvcmRlci1ib3gtd2lkdGgnKTsNCiAgICAgICAgaWYgKGJXaWR0aCA8PSAwKSB7DQogICAgICAgICAgaWYgKCF0aGlzLl9wcmVDb21wdXRpbmcpIHRoaXMuX2VuZCgpOw0KICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIGJMZWZ0ID0gdGhpcy5nZXQoJ2JvcmRlci1sZWZ0JyksDQogICAgICAgICBiUmlnaHQgPSB0aGlzLmdldCgnYm9yZGVyLXJpZ2h0Jyk7DQoNCiAgICAgICAgdmFyIHBMZWZ0ID0gdGhpcy5nZXQoJ3BhZGRpbmctbGVmdCcpLA0KICAgICAgICAgcFJpZ2h0ID0gdGhpcy5nZXQoJ3BhZGRpbmctcmlnaHQnKTsNCg0KICAgICAgICBpZiAoIXRoaXMuX3ByZUNvbXB1dGluZykgdGhpcy5fZW5kKCk7DQoNCiAgICAgICAgcmV0dXJuIGJXaWR0aCAtIGJMZWZ0IC0gYlJpZ2h0IC0gcExlZnQgLSBwUmlnaHQ7DQogICAgICB9LA0KDQogICAgICAncGFkZGluZy1ib3gtaGVpZ2h0JzogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICB2YXIgaGVpZ2h0ID0gdGhpcy5nZXQoJ2hlaWdodCcpLA0KICAgICAgICAgcFRvcCA9IHRoaXMuZ2V0KCdwYWRkaW5nLXRvcCcpLA0KICAgICAgICAgcEJvdHRvbSA9IHRoaXMuZ2V0KCdwYWRkaW5nLWJvdHRvbScpOw0KDQogICAgICAgIHJldHVybiBoZWlnaHQgKyBwVG9wICsgcEJvdHRvbTsNCiAgICAgIH0sDQoNCiAgICAgICdwYWRkaW5nLWJveC13aWR0aCc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgdmFyIHdpZHRoID0gdGhpcy5nZXQoJ3dpZHRoJyksDQogICAgICAgICBwTGVmdCA9IHRoaXMuZ2V0KCdwYWRkaW5nLWxlZnQnKSwNCiAgICAgICAgIHBSaWdodCA9IHRoaXMuZ2V0KCdwYWRkaW5nLXJpZ2h0Jyk7DQoNCiAgICAgICAgcmV0dXJuIHdpZHRoICsgcExlZnQgKyBwUmlnaHQ7DQogICAgICB9LA0KDQogICAgICAnYm9yZGVyLWJveC1oZWlnaHQnOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgICAgIGlmICghdGhpcy5fcHJlQ29tcHV0aW5nKSB0aGlzLl9iZWdpbigpOw0KICAgICAgICB2YXIgaGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7DQogICAgICAgIGlmICghdGhpcy5fcHJlQ29tcHV0aW5nKSB0aGlzLl9lbmQoKTsNCiAgICAgICAgcmV0dXJuIGhlaWdodDsNCiAgICAgIH0sDQoNCiAgICAgICdib3JkZXItYm94LXdpZHRoJzogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICBpZiAoIXRoaXMuX3ByZUNvbXB1dGluZykgdGhpcy5fYmVnaW4oKTsNCiAgICAgICAgdmFyIHdpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aDsNCiAgICAgICAgaWYgKCF0aGlzLl9wcmVDb21wdXRpbmcpIHRoaXMuX2VuZCgpOw0KICAgICAgICByZXR1cm4gd2lkdGg7DQogICAgICB9LA0KDQogICAgICAnbWFyZ2luLWJveC1oZWlnaHQnOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgICAgIHZhciBiSGVpZ2h0ID0gdGhpcy5nZXQoJ2JvcmRlci1ib3gtaGVpZ2h0JyksDQogICAgICAgICBtVG9wID0gdGhpcy5nZXQoJ21hcmdpbi10b3AnKSwNCiAgICAgICAgIG1Cb3R0b20gPSB0aGlzLmdldCgnbWFyZ2luLWJvdHRvbScpOw0KDQogICAgICAgIGlmIChiSGVpZ2h0IDw9IDApIHJldHVybiAwOw0KDQogICAgICAgIHJldHVybiBiSGVpZ2h0ICsgbVRvcCArIG1Cb3R0b207DQogICAgICB9LA0KDQogICAgICAnbWFyZ2luLWJveC13aWR0aCc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgdmFyIGJXaWR0aCA9IHRoaXMuZ2V0KCdib3JkZXItYm94LXdpZHRoJyksDQogICAgICAgICBtTGVmdCA9IHRoaXMuZ2V0KCdtYXJnaW4tbGVmdCcpLA0KICAgICAgICAgbVJpZ2h0ID0gdGhpcy5nZXQoJ21hcmdpbi1yaWdodCcpOw0KDQogICAgICAgIGlmIChiV2lkdGggPD0gMCkgcmV0dXJuIDA7DQoNCiAgICAgICAgcmV0dXJuIGJXaWR0aCArIG1MZWZ0ICsgbVJpZ2h0Ow0KICAgICAgfSwNCg0KICAgICAgJ3RvcCc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgdmFyIG9mZnNldCA9IGVsZW1lbnQucG9zaXRpb25lZE9mZnNldCgpOw0KICAgICAgICByZXR1cm4gb2Zmc2V0LnRvcDsNCiAgICAgIH0sDQoNCiAgICAgICdib3R0b20nOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgICAgIHZhciBvZmZzZXQgPSBlbGVtZW50LnBvc2l0aW9uZWRPZmZzZXQoKSwNCiAgICAgICAgIHBhcmVudCA9IGVsZW1lbnQuZ2V0T2Zmc2V0UGFyZW50KCksDQogICAgICAgICBwSGVpZ2h0ID0gcGFyZW50Lm1lYXN1cmUoJ2hlaWdodCcpOw0KDQogICAgICAgIHZhciBtSGVpZ2h0ID0gdGhpcy5nZXQoJ2JvcmRlci1ib3gtaGVpZ2h0Jyk7DQoNCiAgICAgICAgcmV0dXJuIHBIZWlnaHQgLSBtSGVpZ2h0IC0gb2Zmc2V0LnRvcDsNCiAgICAgIH0sDQoNCiAgICAgICdsZWZ0JzogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICB2YXIgb2Zmc2V0ID0gZWxlbWVudC5wb3NpdGlvbmVkT2Zmc2V0KCk7DQogICAgICAgIHJldHVybiBvZmZzZXQubGVmdDsNCiAgICAgIH0sDQoNCiAgICAgICdyaWdodCc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgdmFyIG9mZnNldCA9IGVsZW1lbnQucG9zaXRpb25lZE9mZnNldCgpLA0KICAgICAgICAgcGFyZW50ID0gZWxlbWVudC5nZXRPZmZzZXRQYXJlbnQoKSwNCiAgICAgICAgIHBXaWR0aCA9IHBhcmVudC5tZWFzdXJlKCd3aWR0aCcpOw0KDQogICAgICAgIHZhciBtV2lkdGggPSB0aGlzLmdldCgnYm9yZGVyLWJveC13aWR0aCcpOw0KDQogICAgICAgIHJldHVybiBwV2lkdGggLSBtV2lkdGggLSBvZmZzZXQubGVmdDsNCiAgICAgIH0sDQoNCiAgICAgICdwYWRkaW5nLXRvcCc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgcmV0dXJuIGdldFBpeGVsVmFsdWUoZWxlbWVudCwgJ3BhZGRpbmdUb3AnKTsNCiAgICAgIH0sDQoNCiAgICAgICdwYWRkaW5nLWJvdHRvbSc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgcmV0dXJuIGdldFBpeGVsVmFsdWUoZWxlbWVudCwgJ3BhZGRpbmdCb3R0b20nKTsNCiAgICAgIH0sDQoNCiAgICAgICdwYWRkaW5nLWxlZnQnOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgICAgIHJldHVybiBnZXRQaXhlbFZhbHVlKGVsZW1lbnQsICdwYWRkaW5nTGVmdCcpOw0KICAgICAgfSwNCg0KICAgICAgJ3BhZGRpbmctcmlnaHQnOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgICAgIHJldHVybiBnZXRQaXhlbFZhbHVlKGVsZW1lbnQsICdwYWRkaW5nUmlnaHQnKTsNCiAgICAgIH0sDQoNCiAgICAgICdib3JkZXItdG9wJzogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICByZXR1cm4gZ2V0UGl4ZWxWYWx1ZShlbGVtZW50LCAnYm9yZGVyVG9wV2lkdGgnKTsNCiAgICAgIH0sDQoNCiAgICAgICdib3JkZXItYm90dG9tJzogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICByZXR1cm4gZ2V0UGl4ZWxWYWx1ZShlbGVtZW50LCAnYm9yZGVyQm90dG9tV2lkdGgnKTsNCiAgICAgIH0sDQoNCiAgICAgICdib3JkZXItbGVmdCc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgcmV0dXJuIGdldFBpeGVsVmFsdWUoZWxlbWVudCwgJ2JvcmRlckxlZnRXaWR0aCcpOw0KICAgICAgfSwNCg0KICAgICAgJ2JvcmRlci1yaWdodCc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgcmV0dXJuIGdldFBpeGVsVmFsdWUoZWxlbWVudCwgJ2JvcmRlclJpZ2h0V2lkdGgnKTsNCiAgICAgIH0sDQoNCiAgICAgICdtYXJnaW4tdG9wJzogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICByZXR1cm4gZ2V0UGl4ZWxWYWx1ZShlbGVtZW50LCAnbWFyZ2luVG9wJyk7DQogICAgICB9LA0KDQogICAgICAnbWFyZ2luLWJvdHRvbSc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgcmV0dXJuIGdldFBpeGVsVmFsdWUoZWxlbWVudCwgJ21hcmdpbkJvdHRvbScpOw0KICAgICAgfSwNCg0KICAgICAgJ21hcmdpbi1sZWZ0JzogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICByZXR1cm4gZ2V0UGl4ZWxWYWx1ZShlbGVtZW50LCAnbWFyZ2luTGVmdCcpOw0KICAgICAgfSwNCg0KICAgICAgJ21hcmdpbi1yaWdodCc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgcmV0dXJuIGdldFBpeGVsVmFsdWUoZWxlbWVudCwgJ21hcmdpblJpZ2h0Jyk7DQogICAgICB9DQogICAgfQ0KICB9KTsNCg0KICBpZiAoJ2dldEJvdW5kaW5nQ2xpZW50UmVjdCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7DQogICAgT2JqZWN0LmV4dGVuZChFbGVtZW50LkxheW91dC5DT01QVVRBVElPTlMsIHsNCiAgICAgICdyaWdodCc6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgdmFyIHBhcmVudCA9IGhhc0xheW91dChlbGVtZW50LmdldE9mZnNldFBhcmVudCgpKTsNCiAgICAgICAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLA0KICAgICAgICAgcFJlY3QgPSBwYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7DQoNCiAgICAgICAgcmV0dXJuIChwUmVjdC5yaWdodCAtIHJlY3QucmlnaHQpLnJvdW5kKCk7DQogICAgICB9LA0KDQogICAgICAnYm90dG9tJzogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICB2YXIgcGFyZW50ID0gaGFzTGF5b3V0KGVsZW1lbnQuZ2V0T2Zmc2V0UGFyZW50KCkpOw0KICAgICAgICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksDQogICAgICAgICBwUmVjdCA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCg0KICAgICAgICByZXR1cm4gKHBSZWN0LmJvdHRvbSAtIHJlY3QuYm90dG9tKS5yb3VuZCgpOw0KICAgICAgfQ0KICAgIH0pOw0KICB9DQoNCiAgRWxlbWVudC5PZmZzZXQgPSBDbGFzcy5jcmVhdGUoew0KICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGxlZnQsIHRvcCkgew0KICAgICAgdGhpcy5sZWZ0ID0gbGVmdC5yb3VuZCgpOw0KICAgICAgdGhpcy50b3AgID0gdG9wLnJvdW5kKCk7DQoNCiAgICAgIHRoaXNbMF0gPSB0aGlzLmxlZnQ7DQogICAgICB0aGlzWzFdID0gdGhpcy50b3A7DQogICAgfSwNCg0KICAgIHJlbGF0aXZlVG86IGZ1bmN0aW9uKG9mZnNldCkgew0KICAgICAgcmV0dXJuIG5ldyBFbGVtZW50Lk9mZnNldCgNCiAgICAgICAgdGhpcy5sZWZ0IC0gb2Zmc2V0LmxlZnQsDQogICAgICAgIHRoaXMudG9wICAtIG9mZnNldC50b3ANCiAgICAgICk7DQogICAgfSwNCg0KICAgIGluc3BlY3Q6IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuICIjPEVsZW1lbnQuT2Zmc2V0IGxlZnQ6ICN7bGVmdH0gdG9wOiAje3RvcH0+Ii5pbnRlcnBvbGF0ZSh0aGlzKTsNCiAgICB9LA0KDQogICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuICJbI3tsZWZ0fSwgI3t0b3B9XSIuaW50ZXJwb2xhdGUodGhpcyk7DQogICAgfSwNCg0KICAgIHRvQXJyYXk6IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuIFt0aGlzLmxlZnQsIHRoaXMudG9wXTsNCiAgICB9DQogIH0pOw0KDQogIGZ1bmN0aW9uIGdldExheW91dChlbGVtZW50LCBwcmVDb21wdXRlKSB7DQogICAgcmV0dXJuIG5ldyBFbGVtZW50LkxheW91dChlbGVtZW50LCBwcmVDb21wdXRlKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIG1lYXN1cmUoZWxlbWVudCwgcHJvcGVydHkpIHsNCiAgICByZXR1cm4gJChlbGVtZW50KS5nZXRMYXlvdXQoKS5nZXQocHJvcGVydHkpOw0KICB9DQoNCiAgZnVuY3Rpb24gZ2V0RGltZW5zaW9ucyhlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgdmFyIGRpc3BsYXkgPSBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdkaXNwbGF5Jyk7DQoNCiAgICBpZiAoZGlzcGxheSAmJiBkaXNwbGF5ICE9PSAnbm9uZScpIHsNCiAgICAgIHJldHVybiB7IHdpZHRoOiBlbGVtZW50Lm9mZnNldFdpZHRoLCBoZWlnaHQ6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0IH07DQogICAgfQ0KDQogICAgdmFyIHN0eWxlID0gZWxlbWVudC5zdHlsZTsNCiAgICB2YXIgb3JpZ2luYWxTdHlsZXMgPSB7DQogICAgICB2aXNpYmlsaXR5OiBzdHlsZS52aXNpYmlsaXR5LA0KICAgICAgcG9zaXRpb246ICAgc3R5bGUucG9zaXRpb24sDQogICAgICBkaXNwbGF5OiAgICBzdHlsZS5kaXNwbGF5DQogICAgfTsNCg0KICAgIHZhciBuZXdTdHlsZXMgPSB7DQogICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJywNCiAgICAgIGRpc3BsYXk6ICAgICdibG9jaycNCiAgICB9Ow0KDQogICAgaWYgKG9yaWdpbmFsU3R5bGVzLnBvc2l0aW9uICE9PSAnZml4ZWQnKQ0KICAgICAgbmV3U3R5bGVzLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsNCg0KICAgIEVsZW1lbnQuc2V0U3R5bGUoZWxlbWVudCwgbmV3U3R5bGVzKTsNCg0KICAgIHZhciBkaW1lbnNpb25zID0gew0KICAgICAgd2lkdGg6ICBlbGVtZW50Lm9mZnNldFdpZHRoLA0KICAgICAgaGVpZ2h0OiBlbGVtZW50Lm9mZnNldEhlaWdodA0KICAgIH07DQoNCiAgICBFbGVtZW50LnNldFN0eWxlKGVsZW1lbnQsIG9yaWdpbmFsU3R5bGVzKTsNCg0KICAgIHJldHVybiBkaW1lbnNpb25zOw0KICB9DQoNCiAgZnVuY3Rpb24gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCg0KICAgIGlmIChpc0RvY3VtZW50KGVsZW1lbnQpIHx8IGlzRGV0YWNoZWQoZWxlbWVudCkgfHwgaXNCb2R5KGVsZW1lbnQpIHx8IGlzSHRtbChlbGVtZW50KSkNCiAgICAgIHJldHVybiAkKGRvY3VtZW50LmJvZHkpOw0KDQogICAgdmFyIGlzSW5saW5lID0gKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ2Rpc3BsYXknKSA9PT0gJ2lubGluZScpOw0KICAgIGlmICghaXNJbmxpbmUgJiYgZWxlbWVudC5vZmZzZXRQYXJlbnQpIHJldHVybiAkKGVsZW1lbnQub2Zmc2V0UGFyZW50KTsNCg0KICAgIHdoaWxlICgoZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkgJiYgZWxlbWVudCAhPT0gZG9jdW1lbnQuYm9keSkgew0KICAgICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgIT09ICdzdGF0aWMnKSB7DQogICAgICAgIHJldHVybiBpc0h0bWwoZWxlbWVudCkgPyAkKGRvY3VtZW50LmJvZHkpIDogJChlbGVtZW50KTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4gJChkb2N1bWVudC5ib2R5KTsNCiAgfQ0KDQoNCiAgZnVuY3Rpb24gY3VtdWxhdGl2ZU9mZnNldChlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgdmFyIHZhbHVlVCA9IDAsIHZhbHVlTCA9IDA7DQogICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkgew0KICAgICAgZG8gew0KICAgICAgICB2YWx1ZVQgKz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7DQogICAgICAgIHZhbHVlTCArPSBlbGVtZW50Lm9mZnNldExlZnQgfHwgMDsNCiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50Ow0KICAgICAgfSB3aGlsZSAoZWxlbWVudCk7DQogICAgfQ0KICAgIHJldHVybiBuZXcgRWxlbWVudC5PZmZzZXQodmFsdWVMLCB2YWx1ZVQpOw0KICB9DQoNCiAgZnVuY3Rpb24gcG9zaXRpb25lZE9mZnNldChlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQoNCiAgICB2YXIgbGF5b3V0ID0gZWxlbWVudC5nZXRMYXlvdXQoKTsNCg0KICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOw0KICAgIGRvIHsNCiAgICAgIHZhbHVlVCArPSBlbGVtZW50Lm9mZnNldFRvcCAgfHwgMDsNCiAgICAgIHZhbHVlTCArPSBlbGVtZW50Lm9mZnNldExlZnQgfHwgMDsNCiAgICAgIGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsNCiAgICAgIGlmIChlbGVtZW50KSB7DQogICAgICAgIGlmIChpc0JvZHkoZWxlbWVudCkpIGJyZWFrOw0KICAgICAgICB2YXIgcCA9IEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJyk7DQogICAgICAgIGlmIChwICE9PSAnc3RhdGljJykgYnJlYWs7DQogICAgICB9DQogICAgfSB3aGlsZSAoZWxlbWVudCk7DQoNCiAgICB2YWx1ZUwgLT0gbGF5b3V0LmdldCgnbWFyZ2luLXRvcCcpOw0KICAgIHZhbHVlVCAtPSBsYXlvdXQuZ2V0KCdtYXJnaW4tbGVmdCcpOw0KDQogICAgcmV0dXJuIG5ldyBFbGVtZW50Lk9mZnNldCh2YWx1ZUwsIHZhbHVlVCk7DQogIH0NCg0KICBmdW5jdGlvbiBjdW11bGF0aXZlU2Nyb2xsT2Zmc2V0KGVsZW1lbnQpIHsNCiAgICB2YXIgdmFsdWVUID0gMCwgdmFsdWVMID0gMDsNCiAgICBkbyB7DQogICAgICB2YWx1ZVQgKz0gZWxlbWVudC5zY3JvbGxUb3AgIHx8IDA7DQogICAgICB2YWx1ZUwgKz0gZWxlbWVudC5zY3JvbGxMZWZ0IHx8IDA7DQogICAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOw0KICAgIH0gd2hpbGUgKGVsZW1lbnQpOw0KICAgIHJldHVybiBuZXcgRWxlbWVudC5PZmZzZXQodmFsdWVMLCB2YWx1ZVQpOw0KICB9DQoNCiAgZnVuY3Rpb24gdmlld3BvcnRPZmZzZXQoZm9yRWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwLCBkb2NCb2R5ID0gZG9jdW1lbnQuYm9keTsNCg0KICAgIHZhciBlbGVtZW50ID0gZm9yRWxlbWVudDsNCiAgICBkbyB7DQogICAgICB2YWx1ZVQgKz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7DQogICAgICB2YWx1ZUwgKz0gZWxlbWVudC5vZmZzZXRMZWZ0IHx8IDA7DQogICAgICBpZiAoZWxlbWVudC5vZmZzZXRQYXJlbnQgPT0gZG9jQm9keSAmJg0KICAgICAgICBFbGVtZW50LmdldFN0eWxlKGVsZW1lbnQsICdwb3NpdGlvbicpID09ICdhYnNvbHV0ZScpIGJyZWFrOw0KICAgIH0gd2hpbGUgKGVsZW1lbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudCk7DQoNCiAgICBlbGVtZW50ID0gZm9yRWxlbWVudDsNCiAgICBkbyB7DQogICAgICBpZiAoZWxlbWVudCAhPSBkb2NCb2R5KSB7DQogICAgICAgIHZhbHVlVCAtPSBlbGVtZW50LnNjcm9sbFRvcCAgfHwgMDsNCiAgICAgICAgdmFsdWVMIC09IGVsZW1lbnQuc2Nyb2xsTGVmdCB8fCAwOw0KICAgICAgfQ0KICAgIH0gd2hpbGUgKGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGUpOw0KICAgIHJldHVybiBuZXcgRWxlbWVudC5PZmZzZXQodmFsdWVMLCB2YWx1ZVQpOw0KICB9DQoNCiAgZnVuY3Rpb24gYWJzb2x1dGl6ZShlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQoNCiAgICBpZiAoRWxlbWVudC5nZXRTdHlsZShlbGVtZW50LCAncG9zaXRpb24nKSA9PT0gJ2Fic29sdXRlJykgew0KICAgICAgcmV0dXJuIGVsZW1lbnQ7DQogICAgfQ0KDQogICAgdmFyIG9mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudChlbGVtZW50KTsNCiAgICB2YXIgZU9mZnNldCA9IGVsZW1lbnQudmlld3BvcnRPZmZzZXQoKSwNCiAgICAgcE9mZnNldCA9IG9mZnNldFBhcmVudC52aWV3cG9ydE9mZnNldCgpOw0KDQogICAgdmFyIG9mZnNldCA9IGVPZmZzZXQucmVsYXRpdmVUbyhwT2Zmc2V0KTsNCiAgICB2YXIgbGF5b3V0ID0gZWxlbWVudC5nZXRMYXlvdXQoKTsNCg0KICAgIGVsZW1lbnQuc3RvcmUoJ3Byb3RvdHlwZV9hYnNvbHV0aXplX29yaWdpbmFsX3N0eWxlcycsIHsNCiAgICAgIGxlZnQ6ICAgZWxlbWVudC5nZXRTdHlsZSgnbGVmdCcpLA0KICAgICAgdG9wOiAgICBlbGVtZW50LmdldFN0eWxlKCd0b3AnKSwNCiAgICAgIHdpZHRoOiAgZWxlbWVudC5nZXRTdHlsZSgnd2lkdGgnKSwNCiAgICAgIGhlaWdodDogZWxlbWVudC5nZXRTdHlsZSgnaGVpZ2h0JykNCiAgICB9KTsNCg0KICAgIGVsZW1lbnQuc2V0U3R5bGUoew0KICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsDQogICAgICB0b3A6ICAgIG9mZnNldC50b3AgKyAncHgnLA0KICAgICAgbGVmdDogICBvZmZzZXQubGVmdCArICdweCcsDQogICAgICB3aWR0aDogIGxheW91dC5nZXQoJ3dpZHRoJykgKyAncHgnLA0KICAgICAgaGVpZ2h0OiBsYXlvdXQuZ2V0KCdoZWlnaHQnKSArICdweCcNCiAgICB9KTsNCg0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9DQoNCiAgZnVuY3Rpb24gcmVsYXRpdml6ZShlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT09ICdyZWxhdGl2ZScpIHsNCiAgICAgIHJldHVybiBlbGVtZW50Ow0KICAgIH0NCg0KICAgIHZhciBvcmlnaW5hbFN0eWxlcyA9DQogICAgIGVsZW1lbnQucmV0cmlldmUoJ3Byb3RvdHlwZV9hYnNvbHV0aXplX29yaWdpbmFsX3N0eWxlcycpOw0KDQogICAgaWYgKG9yaWdpbmFsU3R5bGVzKSBlbGVtZW50LnNldFN0eWxlKG9yaWdpbmFsU3R5bGVzKTsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfQ0KDQogIGlmIChQcm90b3R5cGUuQnJvd3Nlci5JRSkgew0KICAgIGdldE9mZnNldFBhcmVudCA9IGdldE9mZnNldFBhcmVudC53cmFwKA0KICAgICAgZnVuY3Rpb24ocHJvY2VlZCwgZWxlbWVudCkgew0KICAgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCg0KICAgICAgICBpZiAoaXNEb2N1bWVudChlbGVtZW50KSB8fCBpc0RldGFjaGVkKGVsZW1lbnQpIHx8IGlzQm9keShlbGVtZW50KSB8fCBpc0h0bWwoZWxlbWVudCkpDQogICAgICAgICAgcmV0dXJuICQoZG9jdW1lbnQuYm9keSk7DQoNCiAgICAgICAgdmFyIHBvc2l0aW9uID0gZWxlbWVudC5nZXRTdHlsZSgncG9zaXRpb24nKTsNCiAgICAgICAgaWYgKHBvc2l0aW9uICE9PSAnc3RhdGljJykgcmV0dXJuIHByb2NlZWQoZWxlbWVudCk7DQoNCiAgICAgICAgZWxlbWVudC5zZXRTdHlsZSh7IHBvc2l0aW9uOiAncmVsYXRpdmUnIH0pOw0KICAgICAgICB2YXIgdmFsdWUgPSBwcm9jZWVkKGVsZW1lbnQpOw0KICAgICAgICBlbGVtZW50LnNldFN0eWxlKHsgcG9zaXRpb246IHBvc2l0aW9uIH0pOw0KICAgICAgICByZXR1cm4gdmFsdWU7DQogICAgICB9DQogICAgKTsNCg0KICAgIHBvc2l0aW9uZWRPZmZzZXQgPSBwb3NpdGlvbmVkT2Zmc2V0LndyYXAoZnVuY3Rpb24ocHJvY2VlZCwgZWxlbWVudCkgew0KICAgICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgICBpZiAoIWVsZW1lbnQucGFyZW50Tm9kZSkgcmV0dXJuIG5ldyBFbGVtZW50Lk9mZnNldCgwLCAwKTsNCiAgICAgIHZhciBwb3NpdGlvbiA9IGVsZW1lbnQuZ2V0U3R5bGUoJ3Bvc2l0aW9uJyk7DQogICAgICBpZiAocG9zaXRpb24gIT09ICdzdGF0aWMnKSByZXR1cm4gcHJvY2VlZChlbGVtZW50KTsNCg0KICAgICAgdmFyIG9mZnNldFBhcmVudCA9IGVsZW1lbnQuZ2V0T2Zmc2V0UGFyZW50KCk7DQogICAgICBpZiAob2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudC5nZXRTdHlsZSgncG9zaXRpb24nKSA9PT0gJ2ZpeGVkJykNCiAgICAgICAgaGFzTGF5b3V0KG9mZnNldFBhcmVudCk7DQoNCiAgICAgIGVsZW1lbnQuc2V0U3R5bGUoeyBwb3NpdGlvbjogJ3JlbGF0aXZlJyB9KTsNCiAgICAgIHZhciB2YWx1ZSA9IHByb2NlZWQoZWxlbWVudCk7DQogICAgICBlbGVtZW50LnNldFN0eWxlKHsgcG9zaXRpb246IHBvc2l0aW9uIH0pOw0KICAgICAgcmV0dXJuIHZhbHVlOw0KICAgIH0pOw0KICB9IGVsc2UgaWYgKFByb3RvdHlwZS5Ccm93c2VyLldlYmtpdCkgew0KICAgIGN1bXVsYXRpdmVPZmZzZXQgPSBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICAgIHZhciB2YWx1ZVQgPSAwLCB2YWx1ZUwgPSAwOw0KICAgICAgZG8gew0KICAgICAgICB2YWx1ZVQgKz0gZWxlbWVudC5vZmZzZXRUb3AgIHx8IDA7DQogICAgICAgIHZhbHVlTCArPSBlbGVtZW50Lm9mZnNldExlZnQgfHwgMDsNCiAgICAgICAgaWYgKGVsZW1lbnQub2Zmc2V0UGFyZW50ID09IGRvY3VtZW50LmJvZHkpDQogICAgICAgICAgaWYgKEVsZW1lbnQuZ2V0U3R5bGUoZWxlbWVudCwgJ3Bvc2l0aW9uJykgPT0gJ2Fic29sdXRlJykgYnJlYWs7DQoNCiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50Ow0KICAgICAgfSB3aGlsZSAoZWxlbWVudCk7DQoNCiAgICAgIHJldHVybiBuZXcgRWxlbWVudC5PZmZzZXQodmFsdWVMLCB2YWx1ZVQpOw0KICAgIH07DQogIH0NCg0KDQogIEVsZW1lbnQuYWRkTWV0aG9kcyh7DQogICAgZ2V0TGF5b3V0OiAgICAgICAgICAgICAgZ2V0TGF5b3V0LA0KICAgIG1lYXN1cmU6ICAgICAgICAgICAgICAgIG1lYXN1cmUsDQogICAgZ2V0RGltZW5zaW9uczogICAgICAgICAgZ2V0RGltZW5zaW9ucywNCiAgICBnZXRPZmZzZXRQYXJlbnQ6ICAgICAgICBnZXRPZmZzZXRQYXJlbnQsDQogICAgY3VtdWxhdGl2ZU9mZnNldDogICAgICAgY3VtdWxhdGl2ZU9mZnNldCwNCiAgICBwb3NpdGlvbmVkT2Zmc2V0OiAgICAgICBwb3NpdGlvbmVkT2Zmc2V0LA0KICAgIGN1bXVsYXRpdmVTY3JvbGxPZmZzZXQ6IGN1bXVsYXRpdmVTY3JvbGxPZmZzZXQsDQogICAgdmlld3BvcnRPZmZzZXQ6ICAgICAgICAgdmlld3BvcnRPZmZzZXQsDQogICAgYWJzb2x1dGl6ZTogICAgICAgICAgICAgYWJzb2x1dGl6ZSwNCiAgICByZWxhdGl2aXplOiAgICAgICAgICAgICByZWxhdGl2aXplDQogIH0pOw0KDQogIGZ1bmN0aW9uIGlzQm9keShlbGVtZW50KSB7DQogICAgcmV0dXJuIGVsZW1lbnQubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0JPRFknOw0KICB9DQoNCiAgZnVuY3Rpb24gaXNIdG1sKGVsZW1lbnQpIHsNCiAgICByZXR1cm4gZWxlbWVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnSFRNTCc7DQogIH0NCg0KICBmdW5jdGlvbiBpc0RvY3VtZW50KGVsZW1lbnQpIHsNCiAgICByZXR1cm4gZWxlbWVudC5ub2RlVHlwZSA9PT0gTm9kZS5ET0NVTUVOVF9OT0RFOw0KICB9DQoNCiAgZnVuY3Rpb24gaXNEZXRhY2hlZChlbGVtZW50KSB7DQogICAgcmV0dXJuIGVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkgJiYNCiAgICAgIUVsZW1lbnQuZGVzY2VuZGFudE9mKGVsZW1lbnQsIGRvY3VtZW50LmJvZHkpOw0KICB9DQoNCiAgaWYgKCdnZXRCb3VuZGluZ0NsaWVudFJlY3QnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgew0KICAgIEVsZW1lbnQuYWRkTWV0aG9kcyh7DQogICAgICB2aWV3cG9ydE9mZnNldDogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICAgICAgaWYgKGlzRGV0YWNoZWQoZWxlbWVudCkpIHJldHVybiBuZXcgRWxlbWVudC5PZmZzZXQoMCwgMCk7DQoNCiAgICAgICAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLA0KICAgICAgICAgZG9jRWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7DQogICAgICAgIHJldHVybiBuZXcgRWxlbWVudC5PZmZzZXQocmVjdC5sZWZ0IC0gZG9jRWwuY2xpZW50TGVmdCwNCiAgICAgICAgIHJlY3QudG9wIC0gZG9jRWwuY2xpZW50VG9wKTsNCiAgICAgIH0NCiAgICB9KTsNCiAgfQ0KfSkoKTsNCndpbmRvdy4kJCA9IGZ1bmN0aW9uKCkgew0KICB2YXIgZXhwcmVzc2lvbiA9ICRBKGFyZ3VtZW50cykuam9pbignLCAnKTsNCiAgcmV0dXJuIFByb3RvdHlwZS5TZWxlY3Rvci5zZWxlY3QoZXhwcmVzc2lvbiwgZG9jdW1lbnQpOw0KfTsNCg0KUHJvdG90eXBlLlNlbGVjdG9yID0gKGZ1bmN0aW9uKCkgew0KDQogIGZ1bmN0aW9uIHNlbGVjdCgpIHsNCiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCAiUHJvdG90eXBlLlNlbGVjdG9yLnNlbGVjdCIgbXVzdCBiZSBkZWZpbmVkLicpOw0KICB9DQoNCiAgZnVuY3Rpb24gbWF0Y2goKSB7DQogICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgIlByb3RvdHlwZS5TZWxlY3Rvci5tYXRjaCIgbXVzdCBiZSBkZWZpbmVkLicpOw0KICB9DQoNCiAgZnVuY3Rpb24gZmluZChlbGVtZW50cywgZXhwcmVzc2lvbiwgaW5kZXgpIHsNCiAgICBpbmRleCA9IGluZGV4IHx8IDA7DQogICAgdmFyIG1hdGNoID0gUHJvdG90eXBlLlNlbGVjdG9yLm1hdGNoLCBsZW5ndGggPSBlbGVtZW50cy5sZW5ndGgsIG1hdGNoSW5kZXggPSAwLCBpOw0KDQogICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICBpZiAobWF0Y2goZWxlbWVudHNbaV0sIGV4cHJlc3Npb24pICYmIGluZGV4ID09IG1hdGNoSW5kZXgrKykgew0KICAgICAgICByZXR1cm4gRWxlbWVudC5leHRlbmQoZWxlbWVudHNbaV0pOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIGV4dGVuZEVsZW1lbnRzKGVsZW1lbnRzKSB7DQogICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICBFbGVtZW50LmV4dGVuZChlbGVtZW50c1tpXSk7DQogICAgfQ0KICAgIHJldHVybiBlbGVtZW50czsNCiAgfQ0KDQoNCiAgdmFyIEsgPSBQcm90b3R5cGUuSzsNCg0KICByZXR1cm4gew0KICAgIHNlbGVjdDogc2VsZWN0LA0KICAgIG1hdGNoOiBtYXRjaCwNCiAgICBmaW5kOiBmaW5kLA0KICAgIGV4dGVuZEVsZW1lbnRzOiAoRWxlbWVudC5leHRlbmQgPT09IEspID8gSyA6IGV4dGVuZEVsZW1lbnRzLA0KICAgIGV4dGVuZEVsZW1lbnQ6IEVsZW1lbnQuZXh0ZW5kDQogIH07DQp9KSgpOw0KUHJvdG90eXBlLl9vcmlnaW5hbF9wcm9wZXJ0eSA9IHdpbmRvdy5TaXp6bGU7DQovKiENCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIC0gdjEuMA0KICogIENvcHlyaWdodCAyMDA5LCBUaGUgRG9qbyBGb3VuZGF0aW9uDQogKiAgUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLg0KICogIE1vcmUgaW5mb3JtYXRpb246IGh0dHA6Ly9zaXp6bGVqcy5jb20vDQogKi8NCihmdW5jdGlvbigpew0KDQp2YXIgY2h1bmtlciA9IC8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXltcXSciXSspK1xdfFxcLnxbXiA+K34sKFxbXFxdKykrfFs+K35dKShccyosXHMqKT8oKD86LnxccnxcbikqKS9nLA0KCWRvbmUgPSAwLA0KCXRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZywNCgloYXNEdXBsaWNhdGUgPSBmYWxzZSwNCgliYXNlSGFzRHVwbGljYXRlID0gdHJ1ZTsNCg0KWzAsIDBdLnNvcnQoZnVuY3Rpb24oKXsNCgliYXNlSGFzRHVwbGljYXRlID0gZmFsc2U7DQoJcmV0dXJuIDA7DQp9KTsNCg0KdmFyIFNpenpsZSA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkKSB7DQoJcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107DQoJdmFyIG9yaWdDb250ZXh0ID0gY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7DQoNCglpZiAoIGNvbnRleHQubm9kZVR5cGUgIT09IDEgJiYgY29udGV4dC5ub2RlVHlwZSAhPT0gOSApIHsNCgkJcmV0dXJuIFtdOw0KCX0NCg0KCWlmICggIXNlbGVjdG9yIHx8IHR5cGVvZiBzZWxlY3RvciAhPT0gInN0cmluZyIgKSB7DQoJCXJldHVybiByZXN1bHRzOw0KCX0NCg0KCXZhciBwYXJ0cyA9IFtdLCBtLCBzZXQsIGNoZWNrU2V0LCBjaGVjaywgbW9kZSwgZXh0cmEsIHBydW5lID0gdHJ1ZSwgY29udGV4dFhNTCA9IGlzWE1MKGNvbnRleHQpLA0KCQlzb0ZhciA9IHNlbGVjdG9yOw0KDQoJd2hpbGUgKCAoY2h1bmtlci5leGVjKCIiKSwgbSA9IGNodW5rZXIuZXhlYyhzb0ZhcikpICE9PSBudWxsICkgew0KCQlzb0ZhciA9IG1bM107DQoNCgkJcGFydHMucHVzaCggbVsxXSApOw0KDQoJCWlmICggbVsyXSApIHsNCgkJCWV4dHJhID0gbVszXTsNCgkJCWJyZWFrOw0KCQl9DQoJfQ0KDQoJaWYgKCBwYXJ0cy5sZW5ndGggPiAxICYmIG9yaWdQT1MuZXhlYyggc2VsZWN0b3IgKSApIHsNCgkJaWYgKCBwYXJ0cy5sZW5ndGggPT09IDIgJiYgRXhwci5yZWxhdGl2ZVsgcGFydHNbMF0gXSApIHsNCgkJCXNldCA9IHBvc1Byb2Nlc3MoIHBhcnRzWzBdICsgcGFydHNbMV0sIGNvbnRleHQgKTsNCgkJfSBlbHNlIHsNCgkJCXNldCA9IEV4cHIucmVsYXRpdmVbIHBhcnRzWzBdIF0gPw0KCQkJCVsgY29udGV4dCBdIDoNCgkJCQlTaXp6bGUoIHBhcnRzLnNoaWZ0KCksIGNvbnRleHQgKTsNCg0KCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7DQoJCQkJc2VsZWN0b3IgPSBwYXJ0cy5zaGlmdCgpOw0KDQoJCQkJaWYgKCBFeHByLnJlbGF0aXZlWyBzZWxlY3RvciBdICkNCgkJCQkJc2VsZWN0b3IgKz0gcGFydHMuc2hpZnQoKTsNCg0KCQkJCXNldCA9IHBvc1Byb2Nlc3MoIHNlbGVjdG9yLCBzZXQgKTsNCgkJCX0NCgkJfQ0KCX0gZWxzZSB7DQoJCWlmICggIXNlZWQgJiYgcGFydHMubGVuZ3RoID4gMSAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmICFjb250ZXh0WE1MICYmDQoJCQkJRXhwci5tYXRjaC5JRC50ZXN0KHBhcnRzWzBdKSAmJiAhRXhwci5tYXRjaC5JRC50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKSApIHsNCgkJCXZhciByZXQgPSBTaXp6bGUuZmluZCggcGFydHMuc2hpZnQoKSwgY29udGV4dCwgY29udGV4dFhNTCApOw0KCQkJY29udGV4dCA9IHJldC5leHByID8gU2l6emxlLmZpbHRlciggcmV0LmV4cHIsIHJldC5zZXQgKVswXSA6IHJldC5zZXRbMF07DQoJCX0NCg0KCQlpZiAoIGNvbnRleHQgKSB7DQoJCQl2YXIgcmV0ID0gc2VlZCA/DQoJCQkJeyBleHByOiBwYXJ0cy5wb3AoKSwgc2V0OiBtYWtlQXJyYXkoc2VlZCkgfSA6DQoJCQkJU2l6emxlLmZpbmQoIHBhcnRzLnBvcCgpLCBwYXJ0cy5sZW5ndGggPT09IDEgJiYgKHBhcnRzWzBdID09PSAifiIgfHwgcGFydHNbMF0gPT09ICIrIikgJiYgY29udGV4dC5wYXJlbnROb2RlID8gY29udGV4dC5wYXJlbnROb2RlIDogY29udGV4dCwgY29udGV4dFhNTCApOw0KCQkJc2V0ID0gcmV0LmV4cHIgPyBTaXp6bGUuZmlsdGVyKCByZXQuZXhwciwgcmV0LnNldCApIDogcmV0LnNldDsNCg0KCQkJaWYgKCBwYXJ0cy5sZW5ndGggPiAwICkgew0KCQkJCWNoZWNrU2V0ID0gbWFrZUFycmF5KHNldCk7DQoJCQl9IGVsc2Ugew0KCQkJCXBydW5lID0gZmFsc2U7DQoJCQl9DQoNCgkJCXdoaWxlICggcGFydHMubGVuZ3RoICkgew0KCQkJCXZhciBjdXIgPSBwYXJ0cy5wb3AoKSwgcG9wID0gY3VyOw0KDQoJCQkJaWYgKCAhRXhwci5yZWxhdGl2ZVsgY3VyIF0gKSB7DQoJCQkJCWN1ciA9ICIiOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXBvcCA9IHBhcnRzLnBvcCgpOw0KCQkJCX0NCg0KCQkJCWlmICggcG9wID09IG51bGwgKSB7DQoJCQkJCXBvcCA9IGNvbnRleHQ7DQoJCQkJfQ0KDQoJCQkJRXhwci5yZWxhdGl2ZVsgY3VyIF0oIGNoZWNrU2V0LCBwb3AsIGNvbnRleHRYTUwgKTsNCgkJCX0NCgkJfSBlbHNlIHsNCgkJCWNoZWNrU2V0ID0gcGFydHMgPSBbXTsNCgkJfQ0KCX0NCg0KCWlmICggIWNoZWNrU2V0ICkgew0KCQljaGVja1NldCA9IHNldDsNCgl9DQoNCglpZiAoICFjaGVja1NldCApIHsNCgkJdGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyAoY3VyIHx8IHNlbGVjdG9yKTsNCgl9DQoNCglpZiAoIHRvU3RyaW5nLmNhbGwoY2hlY2tTZXQpID09PSAiW29iamVjdCBBcnJheV0iICkgew0KCQlpZiAoICFwcnVuZSApIHsNCgkJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgY2hlY2tTZXQgKTsNCgkJfSBlbHNlIGlmICggY29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSAxICkgew0KCQkJZm9yICggdmFyIGkgPSAwOyBjaGVja1NldFtpXSAhPSBudWxsOyBpKysgKSB7DQoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiAoY2hlY2tTZXRbaV0gPT09IHRydWUgfHwgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgJiYgY29udGFpbnMoY29udGV4dCwgY2hlY2tTZXRbaV0pKSApIHsNCgkJCQkJcmVzdWx0cy5wdXNoKCBzZXRbaV0gKTsNCgkJCQl9DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQlmb3IgKCB2YXIgaSA9IDA7IGNoZWNrU2V0W2ldICE9IG51bGw7IGkrKyApIHsNCgkJCQlpZiAoIGNoZWNrU2V0W2ldICYmIGNoZWNrU2V0W2ldLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0gZWxzZSB7DQoJCW1ha2VBcnJheSggY2hlY2tTZXQsIHJlc3VsdHMgKTsNCgl9DQoNCglpZiAoIGV4dHJhICkgew0KCQlTaXp6bGUoIGV4dHJhLCBvcmlnQ29udGV4dCwgcmVzdWx0cywgc2VlZCApOw0KCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOw0KCX0NCg0KCXJldHVybiByZXN1bHRzOw0KfTsNCg0KU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbihyZXN1bHRzKXsNCglpZiAoIHNvcnRPcmRlciApIHsNCgkJaGFzRHVwbGljYXRlID0gYmFzZUhhc0R1cGxpY2F0ZTsNCgkJcmVzdWx0cy5zb3J0KHNvcnRPcmRlcik7DQoNCgkJaWYgKCBoYXNEdXBsaWNhdGUgKSB7DQoJCQlmb3IgKCB2YXIgaSA9IDE7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrICkgew0KCQkJCWlmICggcmVzdWx0c1tpXSA9PT0gcmVzdWx0c1tpLTFdICkgew0KCQkJCQlyZXN1bHRzLnNwbGljZShpLS0sIDEpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCg0KCXJldHVybiByZXN1bHRzOw0KfTsNCg0KU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbihleHByLCBzZXQpew0KCXJldHVybiBTaXp6bGUoZXhwciwgbnVsbCwgbnVsbCwgc2V0KTsNCn07DQoNClNpenpsZS5maW5kID0gZnVuY3Rpb24oZXhwciwgY29udGV4dCwgaXNYTUwpew0KCXZhciBzZXQsIG1hdGNoOw0KDQoJaWYgKCAhZXhwciApIHsNCgkJcmV0dXJuIFtdOw0KCX0NCg0KCWZvciAoIHZhciBpID0gMCwgbCA9IEV4cHIub3JkZXIubGVuZ3RoOyBpIDwgbDsgaSsrICkgew0KCQl2YXIgdHlwZSA9IEV4cHIub3JkZXJbaV0sIG1hdGNoOw0KDQoJCWlmICggKG1hdGNoID0gRXhwci5sZWZ0TWF0Y2hbIHR5cGUgXS5leGVjKCBleHByICkpICkgew0KCQkJdmFyIGxlZnQgPSBtYXRjaFsxXTsNCgkJCW1hdGNoLnNwbGljZSgxLDEpOw0KDQoJCQlpZiAoIGxlZnQuc3Vic3RyKCBsZWZ0Lmxlbmd0aCAtIDEgKSAhPT0gIlxcIiApIHsNCgkJCQltYXRjaFsxXSA9IChtYXRjaFsxXSB8fCAiIikucmVwbGFjZSgvXFwvZywgIiIpOw0KCQkJCXNldCA9IEV4cHIuZmluZFsgdHlwZSBdKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKTsNCgkJCQlpZiAoIHNldCAhPSBudWxsICkgew0KCQkJCQlleHByID0gZXhwci5yZXBsYWNlKCBFeHByLm1hdGNoWyB0eXBlIF0sICIiICk7DQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCg0KCWlmICggIXNldCApIHsNCgkJc2V0ID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOw0KCX0NCg0KCXJldHVybiB7c2V0OiBzZXQsIGV4cHI6IGV4cHJ9Ow0KfTsNCg0KU2l6emxlLmZpbHRlciA9IGZ1bmN0aW9uKGV4cHIsIHNldCwgaW5wbGFjZSwgbm90KXsNCgl2YXIgb2xkID0gZXhwciwgcmVzdWx0ID0gW10sIGN1ckxvb3AgPSBzZXQsIG1hdGNoLCBhbnlGb3VuZCwNCgkJaXNYTUxGaWx0ZXIgPSBzZXQgJiYgc2V0WzBdICYmIGlzWE1MKHNldFswXSk7DQoNCgl3aGlsZSAoIGV4cHIgJiYgc2V0Lmxlbmd0aCApIHsNCgkJZm9yICggdmFyIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7DQoJCQlpZiAoIChtYXRjaCA9IEV4cHIubWF0Y2hbIHR5cGUgXS5leGVjKCBleHByICkpICE9IG51bGwgKSB7DQoJCQkJdmFyIGZpbHRlciA9IEV4cHIuZmlsdGVyWyB0eXBlIF0sIGZvdW5kLCBpdGVtOw0KCQkJCWFueUZvdW5kID0gZmFsc2U7DQoNCgkJCQlpZiAoIGN1ckxvb3AgPT0gcmVzdWx0ICkgew0KCQkJCQlyZXN1bHQgPSBbXTsNCgkJCQl9DQoNCgkJCQlpZiAoIEV4cHIucHJlRmlsdGVyWyB0eXBlIF0gKSB7DQoJCQkJCW1hdGNoID0gRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSggbWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTEZpbHRlciApOw0KDQoJCQkJCWlmICggIW1hdGNoICkgew0KCQkJCQkJYW55Rm91bmQgPSBmb3VuZCA9IHRydWU7DQoJCQkJCX0gZWxzZSBpZiAoIG1hdGNoID09PSB0cnVlICkgew0KCQkJCQkJY29udGludWU7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlpZiAoIG1hdGNoICkgew0KCQkJCQlmb3IgKCB2YXIgaSA9IDA7IChpdGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgew0KCQkJCQkJaWYgKCBpdGVtICkgew0KCQkJCQkJCWZvdW5kID0gZmlsdGVyKCBpdGVtLCBtYXRjaCwgaSwgY3VyTG9vcCApOw0KCQkJCQkJCXZhciBwYXNzID0gbm90IF4gISFmb3VuZDsNCg0KCQkJCQkJCWlmICggaW5wbGFjZSAmJiBmb3VuZCAhPSBudWxsICkgew0KCQkJCQkJCQlpZiAoIHBhc3MgKSB7DQoJCQkJCQkJCQlhbnlGb3VuZCA9IHRydWU7DQoJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQljdXJMb29wW2ldID0gZmFsc2U7DQoJCQkJCQkJCX0NCgkJCQkJCQl9IGVsc2UgaWYgKCBwYXNzICkgew0KCQkJCQkJCQlyZXN1bHQucHVzaCggaXRlbSApOw0KCQkJCQkJCQlhbnlGb3VuZCA9IHRydWU7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJaWYgKCBmb3VuZCAhPT0gdW5kZWZpbmVkICkgew0KCQkJCQlpZiAoICFpbnBsYWNlICkgew0KCQkJCQkJY3VyTG9vcCA9IHJlc3VsdDsNCgkJCQkJfQ0KDQoJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsNCg0KCQkJCQlpZiAoICFhbnlGb3VuZCApIHsNCgkJCQkJCXJldHVybiBbXTsNCgkJCQkJfQ0KDQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCWlmICggZXhwciA9PSBvbGQgKSB7DQoJCQlpZiAoIGFueUZvdW5kID09IG51bGwgKSB7DQoJCQkJdGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBleHByOw0KCQkJfSBlbHNlIHsNCgkJCQlicmVhazsNCgkJCX0NCgkJfQ0KDQoJCW9sZCA9IGV4cHI7DQoJfQ0KDQoJcmV0dXJuIGN1ckxvb3A7DQp9Ow0KDQp2YXIgRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7DQoJb3JkZXI6IFsgIklEIiwgIk5BTUUiLCAiVEFHIiBdLA0KCW1hdGNoOiB7DQoJCUlEOiAvIygoPzpbXHdcdTAwYzAtXHVGRkZGLV18XFwuKSspLywNCgkJQ0xBU1M6IC9cLigoPzpbXHdcdTAwYzAtXHVGRkZGLV18XFwuKSspLywNCgkJTkFNRTogL1xbbmFtZT1bJyJdKigoPzpbXHdcdTAwYzAtXHVGRkZGLV18XFwuKSspWyciXSpcXS8sDQoJCUFUVFI6IC9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGLV18XFwuKSspXHMqKD86KFxTPz0pXHMqKFsnIl0qKSguKj8pXDN8KVxzKlxdLywNCgkJVEFHOiAvXigoPzpbXHdcdTAwYzAtXHVGRkZGXCotXXxcXC4pKykvLA0KCQlDSElMRDogLzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKChldmVufG9kZHxbXGRuKy1dKilcKSk/LywNCgkJUE9TOiAvOihudGh8ZXF8Z3R8bHR8Zmlyc3R8bGFzdHxldmVufG9kZCkoPzpcKChcZCopXCkpPyg/PVteLV18JCkvLA0KCQlQU0VVRE86IC86KCg/Oltcd1x1MDBjMC1cdUZGRkYtXXxcXC4pKykoPzpcKChbJyJdKikoKD86XChbXlwpXStcKXxbXlwyXChcKV0qKSspXDJcKSk/Lw0KCX0sDQoJbGVmdE1hdGNoOiB7fSwNCglhdHRyTWFwOiB7DQoJCSJjbGFzcyI6ICJjbGFzc05hbWUiLA0KCQkiZm9yIjogImh0bWxGb3IiDQoJfSwNCglhdHRySGFuZGxlOiB7DQoJCWhyZWY6IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJocmVmIik7DQoJCX0NCgl9LA0KCXJlbGF0aXZlOiB7DQoJCSIrIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQsIGlzWE1MKXsNCgkJCXZhciBpc1BhcnRTdHIgPSB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIsDQoJCQkJaXNUYWcgPSBpc1BhcnRTdHIgJiYgIS9cVy8udGVzdChwYXJ0KSwNCgkJCQlpc1BhcnRTdHJOb3RUYWcgPSBpc1BhcnRTdHIgJiYgIWlzVGFnOw0KDQoJCQlpZiAoIGlzVGFnICYmICFpc1hNTCApIHsNCgkJCQlwYXJ0ID0gcGFydC50b1VwcGVyQ2FzZSgpOw0KCQkJfQ0KDQoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGgsIGVsZW07IGkgPCBsOyBpKysgKSB7DQoJCQkJaWYgKCAoZWxlbSA9IGNoZWNrU2V0W2ldKSApIHsNCgkJCQkJd2hpbGUgKCAoZWxlbSA9IGVsZW0ucHJldmlvdXNTaWJsaW5nKSAmJiBlbGVtLm5vZGVUeXBlICE9PSAxICkge30NCg0KCQkJCQljaGVja1NldFtpXSA9IGlzUGFydFN0ck5vdFRhZyB8fCBlbGVtICYmIGVsZW0ubm9kZU5hbWUgPT09IHBhcnQgPw0KCQkJCQkJZWxlbSB8fCBmYWxzZSA6DQoJCQkJCQllbGVtID09PSBwYXJ0Ow0KCQkJCX0NCgkJCX0NCg0KCQkJaWYgKCBpc1BhcnRTdHJOb3RUYWcgKSB7DQoJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsNCgkJCX0NCgkJfSwNCgkJIj4iOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpew0KCQkJdmFyIGlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIjsNCg0KCQkJaWYgKCBpc1BhcnRTdHIgJiYgIS9cVy8udGVzdChwYXJ0KSApIHsNCgkJCQlwYXJ0ID0gaXNYTUwgPyBwYXJ0IDogcGFydC50b1VwcGVyQ2FzZSgpOw0KDQoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgew0KCQkJCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOw0KCQkJCQlpZiAoIGVsZW0gKSB7DQoJCQkJCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOw0KCQkJCQkJY2hlY2tTZXRbaV0gPSBwYXJlbnQubm9kZU5hbWUgPT09IHBhcnQgPyBwYXJlbnQgOiBmYWxzZTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0gZWxzZSB7DQoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgew0KCQkJCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOw0KCQkJCQlpZiAoIGVsZW0gKSB7DQoJCQkJCQljaGVja1NldFtpXSA9IGlzUGFydFN0ciA/DQoJCQkJCQkJZWxlbS5wYXJlbnROb2RlIDoNCgkJCQkJCQllbGVtLnBhcmVudE5vZGUgPT09IHBhcnQ7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlpZiAoIGlzUGFydFN0ciApIHsNCgkJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsNCgkJCQl9DQoJCQl9DQoJCX0sDQoJCSIiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpew0KCQkJdmFyIGRvbmVOYW1lID0gZG9uZSsrLCBjaGVja0ZuID0gZGlyQ2hlY2s7DQoNCgkJCWlmICggIS9cVy8udGVzdChwYXJ0KSApIHsNCgkJCQl2YXIgbm9kZUNoZWNrID0gcGFydCA9IGlzWE1MID8gcGFydCA6IHBhcnQudG9VcHBlckNhc2UoKTsNCgkJCQljaGVja0ZuID0gZGlyTm9kZUNoZWNrOw0KCQkJfQ0KDQoJCQljaGVja0ZuKCJwYXJlbnROb2RlIiwgcGFydCwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MKTsNCgkJfSwNCgkJIn4iOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpew0KCQkJdmFyIGRvbmVOYW1lID0gZG9uZSsrLCBjaGVja0ZuID0gZGlyQ2hlY2s7DQoNCgkJCWlmICggdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICEvXFcvLnRlc3QocGFydCkgKSB7DQoJCQkJdmFyIG5vZGVDaGVjayA9IHBhcnQgPSBpc1hNTCA/IHBhcnQgOiBwYXJ0LnRvVXBwZXJDYXNlKCk7DQoJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsNCgkJCX0NCg0KCQkJY2hlY2tGbigicHJldmlvdXNTaWJsaW5nIiwgcGFydCwgZG9uZU5hbWUsIGNoZWNrU2V0LCBub2RlQ2hlY2ssIGlzWE1MKTsNCgkJfQ0KCX0sDQoJZmluZDogew0KCQlJRDogZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKXsNCgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09ICJ1bmRlZmluZWQiICYmICFpc1hNTCApIHsNCgkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOw0KCQkJCXJldHVybiBtID8gW21dIDogW107DQoJCQl9DQoJCX0sDQoJCU5BTUU6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0LCBpc1hNTCl7DQoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lICE9PSAidW5kZWZpbmVkIiApIHsNCgkJCQl2YXIgcmV0ID0gW10sIHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKG1hdGNoWzFdKTsNCg0KCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHJlc3VsdHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgew0KCQkJCQlpZiAoIHJlc3VsdHNbaV0uZ2V0QXR0cmlidXRlKCJuYW1lIikgPT09IG1hdGNoWzFdICkgew0KCQkJCQkJcmV0LnB1c2goIHJlc3VsdHNbaV0gKTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCXJldHVybiByZXQubGVuZ3RoID09PSAwID8gbnVsbCA6IHJldDsNCgkJCX0NCgkJfSwNCgkJVEFHOiBmdW5jdGlvbihtYXRjaCwgY29udGV4dCl7DQoJCQlyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShtYXRjaFsxXSk7DQoJCX0NCgl9LA0KCXByZUZpbHRlcjogew0KCQlDTEFTUzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTCl7DQoJCQltYXRjaCA9ICIgIiArIG1hdGNoWzFdLnJlcGxhY2UoL1xcL2csICIiKSArICIgIjsNCg0KCQkJaWYgKCBpc1hNTCApIHsNCgkJCQlyZXR1cm4gbWF0Y2g7DQoJCQl9DQoNCgkJCWZvciAoIHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSBjdXJMb29wW2ldKSAhPSBudWxsOyBpKysgKSB7DQoJCQkJaWYgKCBlbGVtICkgew0KCQkJCQlpZiAoIG5vdCBeIChlbGVtLmNsYXNzTmFtZSAmJiAoIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIpLmluZGV4T2YobWF0Y2gpID49IDApICkgew0KCQkJCQkJaWYgKCAhaW5wbGFjZSApDQoJCQkJCQkJcmVzdWx0LnB1c2goIGVsZW0gKTsNCgkJCQkJfSBlbHNlIGlmICggaW5wbGFjZSApIHsNCgkJCQkJCWN1ckxvb3BbaV0gPSBmYWxzZTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9LA0KCQlJRDogZnVuY3Rpb24obWF0Y2gpew0KCQkJcmV0dXJuIG1hdGNoWzFdLnJlcGxhY2UoL1xcL2csICIiKTsNCgkJfSwNCgkJVEFHOiBmdW5jdGlvbihtYXRjaCwgY3VyTG9vcCl7DQoJCQlmb3IgKCB2YXIgaSA9IDA7IGN1ckxvb3BbaV0gPT09IGZhbHNlOyBpKysgKXt9DQoJCQlyZXR1cm4gY3VyTG9vcFtpXSAmJiBpc1hNTChjdXJMb29wW2ldKSA/IG1hdGNoWzFdIDogbWF0Y2hbMV0udG9VcHBlckNhc2UoKTsNCgkJfSwNCgkJQ0hJTEQ6IGZ1bmN0aW9uKG1hdGNoKXsNCgkJCWlmICggbWF0Y2hbMV0gPT0gIm50aCIgKSB7DQoJCQkJdmFyIHRlc3QgPSAvKC0/KShcZCopbigoPzpcK3wtKT9cZCopLy5leGVjKA0KCQkJCQltYXRjaFsyXSA9PSAiZXZlbiIgJiYgIjJuIiB8fCBtYXRjaFsyXSA9PSAib2RkIiAmJiAiMm4rMSIgfHwNCgkJCQkJIS9cRC8udGVzdCggbWF0Y2hbMl0gKSAmJiAiMG4rIiArIG1hdGNoWzJdIHx8IG1hdGNoWzJdKTsNCg0KCQkJCW1hdGNoWzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwOw0KCQkJCW1hdGNoWzNdID0gdGVzdFszXSAtIDA7DQoJCQl9DQoNCgkJCW1hdGNoWzBdID0gZG9uZSsrOw0KDQoJCQlyZXR1cm4gbWF0Y2g7DQoJCX0sDQoJCUFUVFI6IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCwgaXNYTUwpew0KCQkJdmFyIG5hbWUgPSBtYXRjaFsxXS5yZXBsYWNlKC9cXC9nLCAiIik7DQoNCgkJCWlmICggIWlzWE1MICYmIEV4cHIuYXR0ck1hcFtuYW1lXSApIHsNCgkJCQltYXRjaFsxXSA9IEV4cHIuYXR0ck1hcFtuYW1lXTsNCgkJCX0NCg0KCQkJaWYgKCBtYXRjaFsyXSA9PT0gIn49IiApIHsNCgkJCQltYXRjaFs0XSA9ICIgIiArIG1hdGNoWzRdICsgIiAiOw0KCQkJfQ0KDQoJCQlyZXR1cm4gbWF0Y2g7DQoJCX0sDQoJCVBTRVVETzogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90KXsNCgkJCWlmICggbWF0Y2hbMV0gPT09ICJub3QiICkgew0KCQkJCWlmICggKCBjaHVua2VyLmV4ZWMobWF0Y2hbM10pIHx8ICIiICkubGVuZ3RoID4gMSB8fCAvXlx3Ly50ZXN0KG1hdGNoWzNdKSApIHsNCgkJCQkJbWF0Y2hbM10gPSBTaXp6bGUobWF0Y2hbM10sIG51bGwsIG51bGwsIGN1ckxvb3ApOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXZhciByZXQgPSBTaXp6bGUuZmlsdGVyKG1hdGNoWzNdLCBjdXJMb29wLCBpbnBsYWNlLCB0cnVlIF4gbm90KTsNCgkJCQkJaWYgKCAhaW5wbGFjZSApIHsNCgkJCQkJCXJlc3VsdC5wdXNoLmFwcGx5KCByZXN1bHQsIHJldCApOw0KCQkJCQl9DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9IGVsc2UgaWYgKCBFeHByLm1hdGNoLlBPUy50ZXN0KCBtYXRjaFswXSApIHx8IEV4cHIubWF0Y2guQ0hJTEQudGVzdCggbWF0Y2hbMF0gKSApIHsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCg0KCQkJcmV0dXJuIG1hdGNoOw0KCQl9LA0KCQlQT1M6IGZ1bmN0aW9uKG1hdGNoKXsNCgkJCW1hdGNoLnVuc2hpZnQoIHRydWUgKTsNCgkJCXJldHVybiBtYXRjaDsNCgkJfQ0KCX0sDQoJZmlsdGVyczogew0KCQllbmFibGVkOiBmdW5jdGlvbihlbGVtKXsNCgkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSAmJiBlbGVtLnR5cGUgIT09ICJoaWRkZW4iOw0KCQl9LA0KCQlkaXNhYmxlZDogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZTsNCgkJfSwNCgkJY2hlY2tlZDogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gZWxlbS5jaGVja2VkID09PSB0cnVlOw0KCQl9LA0KCQlzZWxlY3RlZDogZnVuY3Rpb24oZWxlbSl7DQoJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsNCgkJCXJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlOw0KCQl9LA0KCQlwYXJlbnQ6IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuICEhZWxlbS5maXJzdENoaWxkOw0KCQl9LA0KCQllbXB0eTogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gIWVsZW0uZmlyc3RDaGlsZDsNCgkJfSwNCgkJaGFzOiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7DQoJCQlyZXR1cm4gISFTaXp6bGUoIG1hdGNoWzNdLCBlbGVtICkubGVuZ3RoOw0KCQl9LA0KCQloZWFkZXI6IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuIC9oXGQvaS50ZXN0KCBlbGVtLm5vZGVOYW1lICk7DQoJCX0sDQoJCXRleHQ6IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuICJ0ZXh0IiA9PT0gZWxlbS50eXBlOw0KCQl9LA0KCQlyYWRpbzogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gInJhZGlvIiA9PT0gZWxlbS50eXBlOw0KCQl9LA0KCQljaGVja2JveDogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gImNoZWNrYm94IiA9PT0gZWxlbS50eXBlOw0KCQl9LA0KCQlmaWxlOiBmdW5jdGlvbihlbGVtKXsNCgkJCXJldHVybiAiZmlsZSIgPT09IGVsZW0udHlwZTsNCgkJfSwNCgkJcGFzc3dvcmQ6IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuICJwYXNzd29yZCIgPT09IGVsZW0udHlwZTsNCgkJfSwNCgkJc3VibWl0OiBmdW5jdGlvbihlbGVtKXsNCgkJCXJldHVybiAic3VibWl0IiA9PT0gZWxlbS50eXBlOw0KCQl9LA0KCQlpbWFnZTogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gImltYWdlIiA9PT0gZWxlbS50eXBlOw0KCQl9LA0KCQlyZXNldDogZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gInJlc2V0IiA9PT0gZWxlbS50eXBlOw0KCQl9LA0KCQlidXR0b246IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuICJidXR0b24iID09PSBlbGVtLnR5cGUgfHwgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAiQlVUVE9OIjsNCgkJfSwNCgkJaW5wdXQ6IGZ1bmN0aW9uKGVsZW0pew0KCQkJcmV0dXJuIC9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChlbGVtLm5vZGVOYW1lKTsNCgkJfQ0KCX0sDQoJc2V0RmlsdGVyczogew0KCQlmaXJzdDogZnVuY3Rpb24oZWxlbSwgaSl7DQoJCQlyZXR1cm4gaSA9PT0gMDsNCgkJfSwNCgkJbGFzdDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gsIGFycmF5KXsNCgkJCXJldHVybiBpID09PSBhcnJheS5sZW5ndGggLSAxOw0KCQl9LA0KCQlldmVuOiBmdW5jdGlvbihlbGVtLCBpKXsNCgkJCXJldHVybiBpICUgMiA9PT0gMDsNCgkJfSwNCgkJb2RkOiBmdW5jdGlvbihlbGVtLCBpKXsNCgkJCXJldHVybiBpICUgMiA9PT0gMTsNCgkJfSwNCgkJbHQ6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsNCgkJCXJldHVybiBpIDwgbWF0Y2hbM10gLSAwOw0KCQl9LA0KCQlndDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpew0KCQkJcmV0dXJuIGkgPiBtYXRjaFszXSAtIDA7DQoJCX0sDQoJCW50aDogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpew0KCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PSBpOw0KCQl9LA0KCQllcTogZnVuY3Rpb24oZWxlbSwgaSwgbWF0Y2gpew0KCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PSBpOw0KCQl9DQoJfSwNCglmaWx0ZXI6IHsNCgkJUFNFVURPOiBmdW5jdGlvbihlbGVtLCBtYXRjaCwgaSwgYXJyYXkpew0KCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwgZmlsdGVyID0gRXhwci5maWx0ZXJzWyBuYW1lIF07DQoNCgkJCWlmICggZmlsdGVyICkgew0KCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOw0KCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gImNvbnRhaW5zIiApIHsNCgkJCQlyZXR1cm4gKGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgIiIpLmluZGV4T2YobWF0Y2hbM10pID49IDA7DQoJCQl9IGVsc2UgaWYgKCBuYW1lID09PSAibm90IiApIHsNCgkJCQl2YXIgbm90ID0gbWF0Y2hbM107DQoNCgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBub3QubGVuZ3RoOyBpIDwgbDsgaSsrICkgew0KCQkJCQlpZiAoIG5vdFtpXSA9PT0gZWxlbSApIHsNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCXJldHVybiB0cnVlOw0KCQkJfQ0KCQl9LA0KCQlDSElMRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpew0KCQkJdmFyIHR5cGUgPSBtYXRjaFsxXSwgbm9kZSA9IGVsZW07DQoJCQlzd2l0Y2ggKHR5cGUpIHsNCgkJCQljYXNlICdvbmx5JzoNCgkJCQljYXNlICdmaXJzdCc6DQoJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZykgKSAgew0KCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgcmV0dXJuIGZhbHNlOw0KCQkJCQl9DQoJCQkJCWlmICggdHlwZSA9PSAnZmlyc3QnKSByZXR1cm4gdHJ1ZTsNCgkJCQkJbm9kZSA9IGVsZW07DQoJCQkJY2FzZSAnbGFzdCc6DQoJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKSApICB7DQoJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSByZXR1cm4gZmFsc2U7DQoJCQkJCX0NCgkJCQkJcmV0dXJuIHRydWU7DQoJCQkJY2FzZSAnbnRoJzoNCgkJCQkJdmFyIGZpcnN0ID0gbWF0Y2hbMl0sIGxhc3QgPSBtYXRjaFszXTsNCg0KCQkJCQlpZiAoIGZpcnN0ID09IDEgJiYgbGFzdCA9PSAwICkgew0KCQkJCQkJcmV0dXJuIHRydWU7DQoJCQkJCX0NCg0KCQkJCQl2YXIgZG9uZU5hbWUgPSBtYXRjaFswXSwNCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsNCg0KCQkJCQlpZiAoIHBhcmVudCAmJiAocGFyZW50LnNpemNhY2hlICE9PSBkb25lTmFtZSB8fCAhZWxlbS5ub2RlSW5kZXgpICkgew0KCQkJCQkJdmFyIGNvdW50ID0gMDsNCgkJCQkJCWZvciAoIG5vZGUgPSBwYXJlbnQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcgKSB7DQoJCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQkJCQlub2RlLm5vZGVJbmRleCA9ICsrY291bnQ7DQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJcGFyZW50LnNpemNhY2hlID0gZG9uZU5hbWU7DQoJCQkJCX0NCg0KCQkJCQl2YXIgZGlmZiA9IGVsZW0ubm9kZUluZGV4IC0gbGFzdDsNCgkJCQkJaWYgKCBmaXJzdCA9PSAwICkgew0KCQkJCQkJcmV0dXJuIGRpZmYgPT0gMDsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCXJldHVybiAoIGRpZmYgJSBmaXJzdCA9PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7DQoJCQkJCX0NCgkJCX0NCgkJfSwNCgkJSUQ6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsNCgkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxICYmIGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpID09PSBtYXRjaDsNCgkJfSwNCgkJVEFHOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7DQoJCQlyZXR1cm4gKG1hdGNoID09PSAiKiIgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSkgfHwgZWxlbS5ub2RlTmFtZSA9PT0gbWF0Y2g7DQoJCX0sDQoJCUNMQVNTOiBmdW5jdGlvbihlbGVtLCBtYXRjaCl7DQoJCQlyZXR1cm4gKCIgIiArIChlbGVtLmNsYXNzTmFtZSB8fCBlbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkgKyAiICIpDQoJCQkJLmluZGV4T2YoIG1hdGNoICkgPiAtMTsNCgkJfSwNCgkJQVRUUjogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpew0KCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwNCgkJCQlyZXN1bHQgPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSA/DQoJCQkJCUV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdKCBlbGVtICkgOg0KCQkJCQllbGVtWyBuYW1lIF0gIT0gbnVsbCA/DQoJCQkJCQllbGVtWyBuYW1lIF0gOg0KCQkJCQkJZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKSwNCgkJCQl2YWx1ZSA9IHJlc3VsdCArICIiLA0KCQkJCXR5cGUgPSBtYXRjaFsyXSwNCgkJCQljaGVjayA9IG1hdGNoWzRdOw0KDQoJCQlyZXR1cm4gcmVzdWx0ID09IG51bGwgPw0KCQkJCXR5cGUgPT09ICIhPSIgOg0KCQkJCXR5cGUgPT09ICI9IiA/DQoJCQkJdmFsdWUgPT09IGNoZWNrIDoNCgkJCQl0eXBlID09PSAiKj0iID8NCgkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA+PSAwIDoNCgkJCQl0eXBlID09PSAifj0iID8NCgkJCQkoIiAiICsgdmFsdWUgKyAiICIpLmluZGV4T2YoY2hlY2spID49IDAgOg0KCQkJCSFjaGVjayA/DQoJCQkJdmFsdWUgJiYgcmVzdWx0ICE9PSBmYWxzZSA6DQoJCQkJdHlwZSA9PT0gIiE9IiA/DQoJCQkJdmFsdWUgIT0gY2hlY2sgOg0KCQkJCXR5cGUgPT09ICJePSIgPw0KCQkJCXZhbHVlLmluZGV4T2YoY2hlY2spID09PSAwIDoNCgkJCQl0eXBlID09PSAiJD0iID8NCgkJCQl2YWx1ZS5zdWJzdHIodmFsdWUubGVuZ3RoIC0gY2hlY2subGVuZ3RoKSA9PT0gY2hlY2sgOg0KCQkJCXR5cGUgPT09ICJ8PSIgPw0KCQkJCXZhbHVlID09PSBjaGVjayB8fCB2YWx1ZS5zdWJzdHIoMCwgY2hlY2subGVuZ3RoICsgMSkgPT09IGNoZWNrICsgIi0iIDoNCgkJCQlmYWxzZTsNCgkJfSwNCgkJUE9TOiBmdW5jdGlvbihlbGVtLCBtYXRjaCwgaSwgYXJyYXkpew0KCQkJdmFyIG5hbWUgPSBtYXRjaFsyXSwgZmlsdGVyID0gRXhwci5zZXRGaWx0ZXJzWyBuYW1lIF07DQoNCgkJCWlmICggZmlsdGVyICkgew0KCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOw0KCQkJfQ0KCQl9DQoJfQ0KfTsNCg0KdmFyIG9yaWdQT1MgPSBFeHByLm1hdGNoLlBPUzsNCg0KZm9yICggdmFyIHR5cGUgaW4gRXhwci5tYXRjaCApIHsNCglFeHByLm1hdGNoWyB0eXBlIF0gPSBuZXcgUmVnRXhwKCBFeHByLm1hdGNoWyB0eXBlIF0uc291cmNlICsgLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlICk7DQoJRXhwci5sZWZ0TWF0Y2hbIHR5cGUgXSA9IG5ldyBSZWdFeHAoIC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2UgKyBFeHByLm1hdGNoWyB0eXBlIF0uc291cmNlICk7DQp9DQoNCnZhciBtYWtlQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0cykgew0KCWFycmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5LCAwICk7DQoNCglpZiAoIHJlc3VsdHMgKSB7DQoJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgYXJyYXkgKTsNCgkJcmV0dXJuIHJlc3VsdHM7DQoJfQ0KDQoJcmV0dXJuIGFycmF5Ow0KfTsNCg0KdHJ5IHsNCglBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsIDAgKTsNCg0KfSBjYXRjaChlKXsNCgltYWtlQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0cykgew0KCQl2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTsNCg0KCQlpZiAoIHRvU3RyaW5nLmNhbGwoYXJyYXkpID09PSAiW29iamVjdCBBcnJheV0iICkgew0KCQkJQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoIHJldCwgYXJyYXkgKTsNCgkJfSBlbHNlIHsNCgkJCWlmICggdHlwZW9mIGFycmF5Lmxlbmd0aCA9PT0gIm51bWJlciIgKSB7DQoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrICkgew0KCQkJCQlyZXQucHVzaCggYXJyYXlbaV0gKTsNCgkJCQl9DQoJCQl9IGVsc2Ugew0KCQkJCWZvciAoIHZhciBpID0gMDsgYXJyYXlbaV07IGkrKyApIHsNCgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIHJldDsNCgl9Ow0KfQ0KDQp2YXIgc29ydE9yZGVyOw0KDQppZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApIHsNCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsNCgkJaWYgKCAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiB8fCAhYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApIHsNCgkJCWlmICggYSA9PSBiICkgew0KCQkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7DQoJCQl9DQoJCQlyZXR1cm4gMDsNCgkJfQ0KDQoJCXZhciByZXQgPSBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgNCA/IC0xIDogYSA9PT0gYiA/IDAgOiAxOw0KCQlpZiAoIHJldCA9PT0gMCApIHsNCgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7DQoJCX0NCgkJcmV0dXJuIHJldDsNCgl9Ow0KfSBlbHNlIGlmICggInNvdXJjZUluZGV4IiBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgKSB7DQoJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7DQoJCWlmICggIWEuc291cmNlSW5kZXggfHwgIWIuc291cmNlSW5kZXggKSB7DQoJCQlpZiAoIGEgPT0gYiApIHsNCgkJCQloYXNEdXBsaWNhdGUgPSB0cnVlOw0KCQkJfQ0KCQkJcmV0dXJuIDA7DQoJCX0NCg0KCQl2YXIgcmV0ID0gYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7DQoJCWlmICggcmV0ID09PSAwICkgew0KCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsNCgkJfQ0KCQlyZXR1cm4gcmV0Ow0KCX07DQp9IGVsc2UgaWYgKCBkb2N1bWVudC5jcmVhdGVSYW5nZSApIHsNCglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsNCgkJaWYgKCAhYS5vd25lckRvY3VtZW50IHx8ICFiLm93bmVyRG9jdW1lbnQgKSB7DQoJCQlpZiAoIGEgPT0gYiApIHsNCgkJCQloYXNEdXBsaWNhdGUgPSB0cnVlOw0KCQkJfQ0KCQkJcmV0dXJuIDA7DQoJCX0NCg0KCQl2YXIgYVJhbmdlID0gYS5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCksIGJSYW5nZSA9IGIub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOw0KCQlhUmFuZ2Uuc2V0U3RhcnQoYSwgMCk7DQoJCWFSYW5nZS5zZXRFbmQoYSwgMCk7DQoJCWJSYW5nZS5zZXRTdGFydChiLCAwKTsNCgkJYlJhbmdlLnNldEVuZChiLCAwKTsNCgkJdmFyIHJldCA9IGFSYW5nZS5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fRU5ELCBiUmFuZ2UpOw0KCQlpZiAoIHJldCA9PT0gMCApIHsNCgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7DQoJCX0NCgkJcmV0dXJuIHJldDsNCgl9Ow0KfQ0KDQooZnVuY3Rpb24oKXsNCgl2YXIgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLA0KCQlpZCA9ICJzY3JpcHQiICsgKG5ldyBEYXRlKS5nZXRUaW1lKCk7DQoJZm9ybS5pbm5lckhUTUwgPSAiPGEgbmFtZT0nIiArIGlkICsgIicvPiI7DQoNCgl2YXIgcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsNCglyb290Lmluc2VydEJlZm9yZSggZm9ybSwgcm9vdC5maXJzdENoaWxkICk7DQoNCglpZiAoICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGlkICkgKSB7DQoJCUV4cHIuZmluZC5JRCA9IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0LCBpc1hNTCl7DQoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7DQoJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsNCgkJCQlyZXR1cm4gbSA/IG0uaWQgPT09IG1hdGNoWzFdIHx8IHR5cGVvZiBtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmIG0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS5ub2RlVmFsdWUgPT09IG1hdGNoWzFdID8gW21dIDogdW5kZWZpbmVkIDogW107DQoJCQl9DQoJCX07DQoNCgkJRXhwci5maWx0ZXIuSUQgPSBmdW5jdGlvbihlbGVtLCBtYXRjaCl7DQoJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsNCgkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxICYmIG5vZGUgJiYgbm9kZS5ub2RlVmFsdWUgPT09IG1hdGNoOw0KCQl9Ow0KCX0NCg0KCXJvb3QucmVtb3ZlQ2hpbGQoIGZvcm0gKTsNCglyb290ID0gZm9ybSA9IG51bGw7IC8vIHJlbGVhc2UgbWVtb3J5IGluIElFDQp9KSgpOw0KDQooZnVuY3Rpb24oKXsNCg0KCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsNCglkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIiIpICk7DQoNCglpZiAoIGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aCA+IDAgKSB7DQoJCUV4cHIuZmluZC5UQUcgPSBmdW5jdGlvbihtYXRjaCwgY29udGV4dCl7DQoJCQl2YXIgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobWF0Y2hbMV0pOw0KDQoJCQlpZiAoIG1hdGNoWzFdID09PSAiKiIgKSB7DQoJCQkJdmFyIHRtcCA9IFtdOw0KDQoJCQkJZm9yICggdmFyIGkgPSAwOyByZXN1bHRzW2ldOyBpKysgKSB7DQoJCQkJCWlmICggcmVzdWx0c1tpXS5ub2RlVHlwZSA9PT0gMSApIHsNCgkJCQkJCXRtcC5wdXNoKCByZXN1bHRzW2ldICk7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlyZXN1bHRzID0gdG1wOw0KCQkJfQ0KDQoJCQlyZXR1cm4gcmVzdWx0czsNCgkJfTsNCgl9DQoNCglkaXYuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyMnPjwvYT4iOw0KCWlmICggZGl2LmZpcnN0Q2hpbGQgJiYgdHlwZW9mIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYNCgkJCWRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpICE9PSAiIyIgKSB7DQoJCUV4cHIuYXR0ckhhbmRsZS5ocmVmID0gZnVuY3Rpb24oZWxlbSl7DQoJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImhyZWYiLCAyKTsNCgkJfTsNCgl9DQoNCglkaXYgPSBudWxsOyAvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQ0KfSkoKTsNCg0KaWYgKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkgKGZ1bmN0aW9uKCl7DQoJdmFyIG9sZFNpenpsZSA9IFNpenpsZSwgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQoJZGl2LmlubmVySFRNTCA9ICI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7DQoNCglpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsICYmIGRpdi5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aCA9PT0gMCApIHsNCgkJcmV0dXJuOw0KCX0NCg0KCVNpenpsZSA9IGZ1bmN0aW9uKHF1ZXJ5LCBjb250ZXh0LCBleHRyYSwgc2VlZCl7DQoJCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50Ow0KDQoJCWlmICggIXNlZWQgJiYgY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiAhaXNYTUwoY29udGV4dCkgKSB7DQoJCQl0cnkgew0KCQkJCXJldHVybiBtYWtlQXJyYXkoIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbChxdWVyeSksIGV4dHJhICk7DQoJCQl9IGNhdGNoKGUpe30NCgkJfQ0KDQoJCXJldHVybiBvbGRTaXp6bGUocXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkKTsNCgl9Ow0KDQoJZm9yICggdmFyIHByb3AgaW4gb2xkU2l6emxlICkgew0KCQlTaXp6bGVbIHByb3AgXSA9IG9sZFNpenpsZVsgcHJvcCBdOw0KCX0NCg0KCWRpdiA9IG51bGw7IC8vIHJlbGVhc2UgbWVtb3J5IGluIElFDQp9KSgpOw0KDQppZiAoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSAoZnVuY3Rpb24oKXsNCgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQoJZGl2LmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7DQoNCglpZiAoIGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoID09PSAwICkNCgkJcmV0dXJuOw0KDQoJZGl2Lmxhc3RDaGlsZC5jbGFzc05hbWUgPSAiZSI7DQoNCglpZiAoIGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoID09PSAxICkNCgkJcmV0dXJuOw0KDQoJRXhwci5vcmRlci5zcGxpY2UoMSwgMCwgIkNMQVNTIik7DQoJRXhwci5maW5kLkNMQVNTID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKSB7DQoJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgew0KCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShtYXRjaFsxXSk7DQoJCX0NCgl9Ow0KDQoJZGl2ID0gbnVsbDsgLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUNCn0pKCk7DQoNCmZ1bmN0aW9uIGRpck5vZGVDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsNCgl2YXIgc2liRGlyID0gZGlyID09ICJwcmV2aW91c1NpYmxpbmciICYmICFpc1hNTDsNCglmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7DQoJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07DQoJCWlmICggZWxlbSApIHsNCgkJCWlmICggc2liRGlyICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKXsNCgkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7DQoJCQkJZWxlbS5zaXpzZXQgPSBpOw0KCQkJfQ0KCQkJZWxlbSA9IGVsZW1bZGlyXTsNCgkJCXZhciBtYXRjaCA9IGZhbHNlOw0KDQoJCQl3aGlsZSAoIGVsZW0gKSB7DQoJCQkJaWYgKCBlbGVtLnNpemNhY2hlID09PSBkb25lTmFtZSApIHsNCgkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07DQoJCQkJCWJyZWFrOw0KCQkJCX0NCg0KCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNYTUwgKXsNCgkJCQkJZWxlbS5zaXpjYWNoZSA9IGRvbmVOYW1lOw0KCQkJCQllbGVtLnNpenNldCA9IGk7DQoJCQkJfQ0KDQoJCQkJaWYgKCBlbGVtLm5vZGVOYW1lID09PSBjdXIgKSB7DQoJCQkJCW1hdGNoID0gZWxlbTsNCgkJCQkJYnJlYWs7DQoJCQkJfQ0KDQoJCQkJZWxlbSA9IGVsZW1bZGlyXTsNCgkJCX0NCg0KCQkJY2hlY2tTZXRbaV0gPSBtYXRjaDsNCgkJfQ0KCX0NCn0NCg0KZnVuY3Rpb24gZGlyQ2hlY2soIGRpciwgY3VyLCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7DQoJdmFyIHNpYkRpciA9IGRpciA9PSAicHJldmlvdXNTaWJsaW5nIiAmJiAhaXNYTUw7DQoJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgew0KCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOw0KCQlpZiAoIGVsZW0gKSB7DQoJCQlpZiAoIHNpYkRpciAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgew0KCQkJCWVsZW0uc2l6Y2FjaGUgPSBkb25lTmFtZTsNCgkJCQllbGVtLnNpenNldCA9IGk7DQoJCQl9DQoJCQllbGVtID0gZWxlbVtkaXJdOw0KCQkJdmFyIG1hdGNoID0gZmFsc2U7DQoNCgkJCXdoaWxlICggZWxlbSApIHsNCgkJCQlpZiAoIGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgew0KCQkJCQltYXRjaCA9IGNoZWNrU2V0W2VsZW0uc2l6c2V0XTsNCgkJCQkJYnJlYWs7DQoJCQkJfQ0KDQoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgew0KCQkJCQlpZiAoICFpc1hNTCApIHsNCgkJCQkJCWVsZW0uc2l6Y2FjaGUgPSBkb25lTmFtZTsNCgkJCQkJCWVsZW0uc2l6c2V0ID0gaTsNCgkJCQkJfQ0KCQkJCQlpZiAoIHR5cGVvZiBjdXIgIT09ICJzdHJpbmciICkgew0KCQkJCQkJaWYgKCBlbGVtID09PSBjdXIgKSB7DQoJCQkJCQkJbWF0Y2ggPSB0cnVlOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KDQoJCQkJCX0gZWxzZSBpZiAoIFNpenpsZS5maWx0ZXIoIGN1ciwgW2VsZW1dICkubGVuZ3RoID4gMCApIHsNCgkJCQkJCW1hdGNoID0gZWxlbTsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJZWxlbSA9IGVsZW1bZGlyXTsNCgkJCX0NCg0KCQkJY2hlY2tTZXRbaV0gPSBtYXRjaDsNCgkJfQ0KCX0NCn0NCg0KdmFyIGNvbnRhaW5zID0gZG9jdW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gPyAgZnVuY3Rpb24oYSwgYil7DQoJcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiAxNjsNCn0gOiBmdW5jdGlvbihhLCBiKXsNCglyZXR1cm4gYSAhPT0gYiAmJiAoYS5jb250YWlucyA/IGEuY29udGFpbnMoYikgOiB0cnVlKTsNCn07DQoNCnZhciBpc1hNTCA9IGZ1bmN0aW9uKGVsZW0pew0KCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSA5ICYmIGVsZW0uZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lICE9PSAiSFRNTCIgfHwNCgkJISFlbGVtLm93bmVyRG9jdW1lbnQgJiYgZWxlbS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiOw0KfTsNCg0KdmFyIHBvc1Byb2Nlc3MgPSBmdW5jdGlvbihzZWxlY3RvciwgY29udGV4dCl7DQoJdmFyIHRtcFNldCA9IFtdLCBsYXRlciA9ICIiLCBtYXRjaCwNCgkJcm9vdCA9IGNvbnRleHQubm9kZVR5cGUgPyBbY29udGV4dF0gOiBjb250ZXh0Ow0KDQoJd2hpbGUgKCAobWF0Y2ggPSBFeHByLm1hdGNoLlBTRVVETy5leGVjKCBzZWxlY3RvciApKSApIHsNCgkJbGF0ZXIgKz0gbWF0Y2hbMF07DQoJCXNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSggRXhwci5tYXRjaC5QU0VVRE8sICIiICk7DQoJfQ0KDQoJc2VsZWN0b3IgPSBFeHByLnJlbGF0aXZlW3NlbGVjdG9yXSA/IHNlbGVjdG9yICsgIioiIDogc2VsZWN0b3I7DQoNCglmb3IgKCB2YXIgaSA9IDAsIGwgPSByb290Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsNCgkJU2l6emxlKCBzZWxlY3Rvciwgcm9vdFtpXSwgdG1wU2V0ICk7DQoJfQ0KDQoJcmV0dXJuIFNpenpsZS5maWx0ZXIoIGxhdGVyLCB0bXBTZXQgKTsNCn07DQoNCg0Kd2luZG93LlNpenpsZSA9IFNpenpsZTsNCg0KfSkoKTsNCg0KOyhmdW5jdGlvbihlbmdpbmUpIHsNCiAgdmFyIGV4dGVuZEVsZW1lbnRzID0gUHJvdG90eXBlLlNlbGVjdG9yLmV4dGVuZEVsZW1lbnRzOw0KDQogIGZ1bmN0aW9uIHNlbGVjdChzZWxlY3Rvciwgc2NvcGUpIHsNCiAgICByZXR1cm4gZXh0ZW5kRWxlbWVudHMoZW5naW5lKHNlbGVjdG9yLCBzY29wZSB8fCBkb2N1bWVudCkpOw0KICB9DQoNCiAgZnVuY3Rpb24gbWF0Y2goZWxlbWVudCwgc2VsZWN0b3IpIHsNCiAgICByZXR1cm4gZW5naW5lLm1hdGNoZXMoc2VsZWN0b3IsIFtlbGVtZW50XSkubGVuZ3RoID09IDE7DQogIH0NCg0KICBQcm90b3R5cGUuU2VsZWN0b3IuZW5naW5lID0gZW5naW5lOw0KICBQcm90b3R5cGUuU2VsZWN0b3Iuc2VsZWN0ID0gc2VsZWN0Ow0KICBQcm90b3R5cGUuU2VsZWN0b3IubWF0Y2ggPSBtYXRjaDsNCn0pKFNpenpsZSk7DQoNCndpbmRvdy5TaXp6bGUgPSBQcm90b3R5cGUuX29yaWdpbmFsX3Byb3BlcnR5Ow0KZGVsZXRlIFByb3RvdHlwZS5fb3JpZ2luYWxfcHJvcGVydHk7DQoNCnZhciBGb3JtID0gew0KICByZXNldDogZnVuY3Rpb24oZm9ybSkgew0KICAgIGZvcm0gPSAkKGZvcm0pOw0KICAgIGZvcm0ucmVzZXQoKTsNCiAgICByZXR1cm4gZm9ybTsNCiAgfSwNCg0KICBzZXJpYWxpemVFbGVtZW50czogZnVuY3Rpb24oZWxlbWVudHMsIG9wdGlvbnMpIHsNCiAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT0gJ29iamVjdCcpIG9wdGlvbnMgPSB7IGhhc2g6ICEhb3B0aW9ucyB9Ow0KICAgIGVsc2UgaWYgKE9iamVjdC5pc1VuZGVmaW5lZChvcHRpb25zLmhhc2gpKSBvcHRpb25zLmhhc2ggPSB0cnVlOw0KICAgIHZhciBrZXksIHZhbHVlLCBzdWJtaXR0ZWQgPSBmYWxzZSwgc3VibWl0ID0gb3B0aW9ucy5zdWJtaXQsIGFjY3VtdWxhdG9yLCBpbml0aWFsOw0KDQogICAgaWYgKG9wdGlvbnMuaGFzaCkgew0KICAgICAgaW5pdGlhbCA9IHt9Ow0KICAgICAgYWNjdW11bGF0b3IgPSBmdW5jdGlvbihyZXN1bHQsIGtleSwgdmFsdWUpIHsNCiAgICAgICAgaWYgKGtleSBpbiByZXN1bHQpIHsNCiAgICAgICAgICBpZiAoIU9iamVjdC5pc0FycmF5KHJlc3VsdFtrZXldKSkgcmVzdWx0W2tleV0gPSBbcmVzdWx0W2tleV1dOw0KICAgICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpOw0KICAgICAgICB9IGVsc2UgcmVzdWx0W2tleV0gPSB2YWx1ZTsNCiAgICAgICAgcmV0dXJuIHJlc3VsdDsNCiAgICAgIH07DQogICAgfSBlbHNlIHsNCiAgICAgIGluaXRpYWwgPSAnJzsNCiAgICAgIGFjY3VtdWxhdG9yID0gZnVuY3Rpb24ocmVzdWx0LCBrZXksIHZhbHVlKSB7DQogICAgICAgIHJldHVybiByZXN1bHQgKyAocmVzdWx0ID8gJyYnIDogJycpICsgZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiBlbGVtZW50cy5pbmplY3QoaW5pdGlhbCwgZnVuY3Rpb24ocmVzdWx0LCBlbGVtZW50KSB7DQogICAgICBpZiAoIWVsZW1lbnQuZGlzYWJsZWQgJiYgZWxlbWVudC5uYW1lKSB7DQogICAgICAgIGtleSA9IGVsZW1lbnQubmFtZTsgdmFsdWUgPSAkKGVsZW1lbnQpLmdldFZhbHVlKCk7DQogICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIGVsZW1lbnQudHlwZSAhPSAnZmlsZScgJiYgKGVsZW1lbnQudHlwZSAhPSAnc3VibWl0JyB8fCAoIXN1Ym1pdHRlZCAmJg0KICAgICAgICAgICAgc3VibWl0ICE9PSBmYWxzZSAmJiAoIXN1Ym1pdCB8fCBrZXkgPT0gc3VibWl0KSAmJiAoc3VibWl0dGVkID0gdHJ1ZSkpKSkgew0KICAgICAgICAgIHJlc3VsdCA9IGFjY3VtdWxhdG9yKHJlc3VsdCwga2V5LCB2YWx1ZSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiByZXN1bHQ7DQogICAgfSk7DQogIH0NCn07DQoNCkZvcm0uTWV0aG9kcyA9IHsNCiAgc2VyaWFsaXplOiBmdW5jdGlvbihmb3JtLCBvcHRpb25zKSB7DQogICAgcmV0dXJuIEZvcm0uc2VyaWFsaXplRWxlbWVudHMoRm9ybS5nZXRFbGVtZW50cyhmb3JtKSwgb3B0aW9ucyk7DQogIH0sDQoNCiAgZ2V0RWxlbWVudHM6IGZ1bmN0aW9uKGZvcm0pIHsNCiAgICB2YXIgZWxlbWVudHMgPSAkKGZvcm0pLmdldEVsZW1lbnRzQnlUYWdOYW1lKCcqJyksDQogICAgICAgIGVsZW1lbnQsDQogICAgICAgIGFyciA9IFsgXSwNCiAgICAgICAgc2VyaWFsaXplcnMgPSBGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnM7DQogICAgZm9yICh2YXIgaSA9IDA7IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsgaSsrKSB7DQogICAgICBhcnIucHVzaChlbGVtZW50KTsNCiAgICB9DQogICAgcmV0dXJuIGFyci5pbmplY3QoW10sIGZ1bmN0aW9uKGVsZW1lbnRzLCBjaGlsZCkgew0KICAgICAgaWYgKHNlcmlhbGl6ZXJzW2NoaWxkLnRhZ05hbWUudG9Mb3dlckNhc2UoKV0pDQogICAgICAgIGVsZW1lbnRzLnB1c2goRWxlbWVudC5leHRlbmQoY2hpbGQpKTsNCiAgICAgIHJldHVybiBlbGVtZW50czsNCiAgICB9KQ0KICB9LA0KDQogIGdldElucHV0czogZnVuY3Rpb24oZm9ybSwgdHlwZU5hbWUsIG5hbWUpIHsNCiAgICBmb3JtID0gJChmb3JtKTsNCiAgICB2YXIgaW5wdXRzID0gZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKTsNCg0KICAgIGlmICghdHlwZU5hbWUgJiYgIW5hbWUpIHJldHVybiAkQShpbnB1dHMpLm1hcChFbGVtZW50LmV4dGVuZCk7DQoNCiAgICBmb3IgKHZhciBpID0gMCwgbWF0Y2hpbmdJbnB1dHMgPSBbXSwgbGVuZ3RoID0gaW5wdXRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICB2YXIgaW5wdXQgPSBpbnB1dHNbaV07DQogICAgICBpZiAoKHR5cGVOYW1lICYmIGlucHV0LnR5cGUgIT0gdHlwZU5hbWUpIHx8IChuYW1lICYmIGlucHV0Lm5hbWUgIT0gbmFtZSkpDQogICAgICAgIGNvbnRpbnVlOw0KICAgICAgbWF0Y2hpbmdJbnB1dHMucHVzaChFbGVtZW50LmV4dGVuZChpbnB1dCkpOw0KICAgIH0NCg0KICAgIHJldHVybiBtYXRjaGluZ0lucHV0czsNCiAgfSwNCg0KICBkaXNhYmxlOiBmdW5jdGlvbihmb3JtKSB7DQogICAgZm9ybSA9ICQoZm9ybSk7DQogICAgRm9ybS5nZXRFbGVtZW50cyhmb3JtKS5pbnZva2UoJ2Rpc2FibGUnKTsNCiAgICByZXR1cm4gZm9ybTsNCiAgfSwNCg0KICBlbmFibGU6IGZ1bmN0aW9uKGZvcm0pIHsNCiAgICBmb3JtID0gJChmb3JtKTsNCiAgICBGb3JtLmdldEVsZW1lbnRzKGZvcm0pLmludm9rZSgnZW5hYmxlJyk7DQogICAgcmV0dXJuIGZvcm07DQogIH0sDQoNCiAgZmluZEZpcnN0RWxlbWVudDogZnVuY3Rpb24oZm9ybSkgew0KICAgIHZhciBlbGVtZW50cyA9ICQoZm9ybSkuZ2V0RWxlbWVudHMoKS5maW5kQWxsKGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgIHJldHVybiAnaGlkZGVuJyAhPSBlbGVtZW50LnR5cGUgJiYgIWVsZW1lbnQuZGlzYWJsZWQ7DQogICAgfSk7DQogICAgdmFyIGZpcnN0QnlJbmRleCA9IGVsZW1lbnRzLmZpbmRBbGwoZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCd0YWJJbmRleCcpICYmIGVsZW1lbnQudGFiSW5kZXggPj0gMDsNCiAgICB9KS5zb3J0QnkoZnVuY3Rpb24oZWxlbWVudCkgeyByZXR1cm4gZWxlbWVudC50YWJJbmRleCB9KS5maXJzdCgpOw0KDQogICAgcmV0dXJuIGZpcnN0QnlJbmRleCA/IGZpcnN0QnlJbmRleCA6IGVsZW1lbnRzLmZpbmQoZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgcmV0dXJuIC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhKSQvaS50ZXN0KGVsZW1lbnQudGFnTmFtZSk7DQogICAgfSk7DQogIH0sDQoNCiAgZm9jdXNGaXJzdEVsZW1lbnQ6IGZ1bmN0aW9uKGZvcm0pIHsNCiAgICBmb3JtID0gJChmb3JtKTsNCiAgICB2YXIgZWxlbWVudCA9IGZvcm0uZmluZEZpcnN0RWxlbWVudCgpOw0KICAgIGlmIChlbGVtZW50KSBlbGVtZW50LmFjdGl2YXRlKCk7DQogICAgcmV0dXJuIGZvcm07DQogIH0sDQoNCiAgcmVxdWVzdDogZnVuY3Rpb24oZm9ybSwgb3B0aW9ucykgew0KICAgIGZvcm0gPSAkKGZvcm0pLCBvcHRpb25zID0gT2JqZWN0LmNsb25lKG9wdGlvbnMgfHwgeyB9KTsNCg0KICAgIHZhciBwYXJhbXMgPSBvcHRpb25zLnBhcmFtZXRlcnMsIGFjdGlvbiA9IGZvcm0ucmVhZEF0dHJpYnV0ZSgnYWN0aW9uJykgfHwgJyc7DQogICAgaWYgKGFjdGlvbi5ibGFuaygpKSBhY3Rpb24gPSB3aW5kb3cubG9jYXRpb24uaHJlZjsNCiAgICBvcHRpb25zLnBhcmFtZXRlcnMgPSBmb3JtLnNlcmlhbGl6ZSh0cnVlKTsNCg0KICAgIGlmIChwYXJhbXMpIHsNCiAgICAgIGlmIChPYmplY3QuaXNTdHJpbmcocGFyYW1zKSkgcGFyYW1zID0gcGFyYW1zLnRvUXVlcnlQYXJhbXMoKTsNCiAgICAgIE9iamVjdC5leHRlbmQob3B0aW9ucy5wYXJhbWV0ZXJzLCBwYXJhbXMpOw0KICAgIH0NCg0KICAgIGlmIChmb3JtLmhhc0F0dHJpYnV0ZSgnbWV0aG9kJykgJiYgIW9wdGlvbnMubWV0aG9kKQ0KICAgICAgb3B0aW9ucy5tZXRob2QgPSBmb3JtLm1ldGhvZDsNCg0KICAgIHJldHVybiBuZXcgQWpheC5SZXF1ZXN0KGFjdGlvbiwgb3B0aW9ucyk7DQogIH0NCn07DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoNCkZvcm0uRWxlbWVudCA9IHsNCiAgZm9jdXM6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAkKGVsZW1lbnQpLmZvY3VzKCk7DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0sDQoNCiAgc2VsZWN0OiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgJChlbGVtZW50KS5zZWxlY3QoKTsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfQ0KfTsNCg0KRm9ybS5FbGVtZW50Lk1ldGhvZHMgPSB7DQoNCiAgc2VyaWFsaXplOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgaWYgKCFlbGVtZW50LmRpc2FibGVkICYmIGVsZW1lbnQubmFtZSkgew0KICAgICAgdmFyIHZhbHVlID0gZWxlbWVudC5nZXRWYWx1ZSgpOw0KICAgICAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkgew0KICAgICAgICB2YXIgcGFpciA9IHsgfTsNCiAgICAgICAgcGFpcltlbGVtZW50Lm5hbWVdID0gdmFsdWU7DQogICAgICAgIHJldHVybiBPYmplY3QudG9RdWVyeVN0cmluZyhwYWlyKTsNCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuICcnOw0KICB9LA0KDQogIGdldFZhbHVlOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgdmFyIG1ldGhvZCA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpOw0KICAgIHJldHVybiBGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnNbbWV0aG9kXShlbGVtZW50KTsNCiAgfSwNCg0KICBzZXRWYWx1ZTogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICB2YXIgbWV0aG9kID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7DQogICAgRm9ybS5FbGVtZW50LlNlcmlhbGl6ZXJzW21ldGhvZF0oZWxlbWVudCwgdmFsdWUpOw0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9LA0KDQogIGNsZWFyOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgJChlbGVtZW50KS52YWx1ZSA9ICcnOw0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9LA0KDQogIHByZXNlbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICByZXR1cm4gJChlbGVtZW50KS52YWx1ZSAhPSAnJzsNCiAgfSwNCg0KICBhY3RpdmF0ZTogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIHRyeSB7DQogICAgICBlbGVtZW50LmZvY3VzKCk7DQogICAgICBpZiAoZWxlbWVudC5zZWxlY3QgJiYgKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9ICdpbnB1dCcgfHwNCiAgICAgICAgICAhKC9eKD86YnV0dG9ufHJlc2V0fHN1Ym1pdCkkL2kudGVzdChlbGVtZW50LnR5cGUpKSkpDQogICAgICAgIGVsZW1lbnQuc2VsZWN0KCk7DQogICAgfSBjYXRjaCAoZSkgeyB9DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0sDQoNCiAgZGlzYWJsZTogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIGVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOw0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9LA0KDQogIGVuYWJsZTogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIGVsZW1lbnQuZGlzYWJsZWQgPSBmYWxzZTsNCiAgICByZXR1cm4gZWxlbWVudDsNCiAgfQ0KfTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnZhciBGaWVsZCA9IEZvcm0uRWxlbWVudDsNCg0KdmFyICRGID0gRm9ybS5FbGVtZW50Lk1ldGhvZHMuZ2V0VmFsdWU7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpGb3JtLkVsZW1lbnQuU2VyaWFsaXplcnMgPSAoZnVuY3Rpb24oKSB7DQogIGZ1bmN0aW9uIGlucHV0KGVsZW1lbnQsIHZhbHVlKSB7DQogICAgc3dpdGNoIChlbGVtZW50LnR5cGUudG9Mb3dlckNhc2UoKSkgew0KICAgICAgY2FzZSAnY2hlY2tib3gnOg0KICAgICAgY2FzZSAncmFkaW8nOg0KICAgICAgICByZXR1cm4gaW5wdXRTZWxlY3RvcihlbGVtZW50LCB2YWx1ZSk7DQogICAgICBkZWZhdWx0Og0KICAgICAgICByZXR1cm4gdmFsdWVTZWxlY3RvcihlbGVtZW50LCB2YWx1ZSk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gaW5wdXRTZWxlY3RvcihlbGVtZW50LCB2YWx1ZSkgew0KICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQodmFsdWUpKQ0KICAgICAgcmV0dXJuIGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsOw0KICAgIGVsc2UgZWxlbWVudC5jaGVja2VkID0gISF2YWx1ZTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHZhbHVlU2VsZWN0b3IoZWxlbWVudCwgdmFsdWUpIHsNCiAgICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuIGVsZW1lbnQudmFsdWU7DQogICAgZWxzZSBlbGVtZW50LnZhbHVlID0gdmFsdWU7DQogIH0NCg0KICBmdW5jdGlvbiBzZWxlY3QoZWxlbWVudCwgdmFsdWUpIHsNCiAgICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKHZhbHVlKSkNCiAgICAgIHJldHVybiAoZWxlbWVudC50eXBlID09PSAnc2VsZWN0LW9uZScgPyBzZWxlY3RPbmUgOiBzZWxlY3RNYW55KShlbGVtZW50KTsNCg0KICAgIHZhciBvcHQsIGN1cnJlbnRWYWx1ZSwgc2luZ2xlID0gIU9iamVjdC5pc0FycmF5KHZhbHVlKTsNCiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbWVudC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgew0KICAgICAgb3B0ID0gZWxlbWVudC5vcHRpb25zW2ldOw0KICAgICAgY3VycmVudFZhbHVlID0gdGhpcy5vcHRpb25WYWx1ZShvcHQpOw0KICAgICAgaWYgKHNpbmdsZSkgew0KICAgICAgICBpZiAoY3VycmVudFZhbHVlID09IHZhbHVlKSB7DQogICAgICAgICAgb3B0LnNlbGVjdGVkID0gdHJ1ZTsNCiAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGVsc2Ugb3B0LnNlbGVjdGVkID0gdmFsdWUuaW5jbHVkZShjdXJyZW50VmFsdWUpOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHNlbGVjdE9uZShlbGVtZW50KSB7DQogICAgdmFyIGluZGV4ID0gZWxlbWVudC5zZWxlY3RlZEluZGV4Ow0KICAgIHJldHVybiBpbmRleCA+PSAwID8gb3B0aW9uVmFsdWUoZWxlbWVudC5vcHRpb25zW2luZGV4XSkgOiBudWxsOw0KICB9DQoNCiAgZnVuY3Rpb24gc2VsZWN0TWFueShlbGVtZW50KSB7DQogICAgdmFyIHZhbHVlcywgbGVuZ3RoID0gZWxlbWVudC5sZW5ndGg7DQogICAgaWYgKCFsZW5ndGgpIHJldHVybiBudWxsOw0KDQogICAgZm9yICh2YXIgaSA9IDAsIHZhbHVlcyA9IFtdOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgIHZhciBvcHQgPSBlbGVtZW50Lm9wdGlvbnNbaV07DQogICAgICBpZiAob3B0LnNlbGVjdGVkKSB2YWx1ZXMucHVzaChvcHRpb25WYWx1ZShvcHQpKTsNCiAgICB9DQogICAgcmV0dXJuIHZhbHVlczsNCiAgfQ0KDQogIGZ1bmN0aW9uIG9wdGlvblZhbHVlKG9wdCkgew0KICAgIHJldHVybiBFbGVtZW50Lmhhc0F0dHJpYnV0ZShvcHQsICd2YWx1ZScpID8gb3B0LnZhbHVlIDogb3B0LnRleHQ7DQogIH0NCg0KICByZXR1cm4gew0KICAgIGlucHV0OiAgICAgICAgIGlucHV0LA0KICAgIGlucHV0U2VsZWN0b3I6IGlucHV0U2VsZWN0b3IsDQogICAgdGV4dGFyZWE6ICAgICAgdmFsdWVTZWxlY3RvciwNCiAgICBzZWxlY3Q6ICAgICAgICBzZWxlY3QsDQogICAgc2VsZWN0T25lOiAgICAgc2VsZWN0T25lLA0KICAgIHNlbGVjdE1hbnk6ICAgIHNlbGVjdE1hbnksDQogICAgb3B0aW9uVmFsdWU6ICAgb3B0aW9uVmFsdWUsDQogICAgYnV0dG9uOiAgICAgICAgdmFsdWVTZWxlY3Rvcg0KICB9Ow0KfSkoKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCg0KQWJzdHJhY3QuVGltZWRPYnNlcnZlciA9IENsYXNzLmNyZWF0ZShQZXJpb2RpY2FsRXhlY3V0ZXIsIHsNCiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oJHN1cGVyLCBlbGVtZW50LCBmcmVxdWVuY3ksIGNhbGxiYWNrKSB7DQogICAgJHN1cGVyKGNhbGxiYWNrLCBmcmVxdWVuY3kpOw0KICAgIHRoaXMuZWxlbWVudCAgID0gJChlbGVtZW50KTsNCiAgICB0aGlzLmxhc3RWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsNCiAgfSwNCg0KICBleGVjdXRlOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7DQogICAgaWYgKE9iamVjdC5pc1N0cmluZyh0aGlzLmxhc3RWYWx1ZSkgJiYgT2JqZWN0LmlzU3RyaW5nKHZhbHVlKSA/DQogICAgICAgIHRoaXMubGFzdFZhbHVlICE9IHZhbHVlIDogU3RyaW5nKHRoaXMubGFzdFZhbHVlKSAhPSBTdHJpbmcodmFsdWUpKSB7DQogICAgICB0aGlzLmNhbGxiYWNrKHRoaXMuZWxlbWVudCwgdmFsdWUpOw0KICAgICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTsNCiAgICB9DQogIH0NCn0pOw0KDQpGb3JtLkVsZW1lbnQuT2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoQWJzdHJhY3QuVGltZWRPYnNlcnZlciwgew0KICBnZXRWYWx1ZTogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIEZvcm0uRWxlbWVudC5nZXRWYWx1ZSh0aGlzLmVsZW1lbnQpOw0KICB9DQp9KTsNCg0KRm9ybS5PYnNlcnZlciA9IENsYXNzLmNyZWF0ZShBYnN0cmFjdC5UaW1lZE9ic2VydmVyLCB7DQogIGdldFZhbHVlOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gRm9ybS5zZXJpYWxpemUodGhpcy5lbGVtZW50KTsNCiAgfQ0KfSk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpBYnN0cmFjdC5FdmVudE9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKHsNCiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCwgY2FsbGJhY2spIHsNCiAgICB0aGlzLmVsZW1lbnQgID0gJChlbGVtZW50KTsNCiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7DQoNCiAgICB0aGlzLmxhc3RWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsNCiAgICBpZiAodGhpcy5lbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAnZm9ybScpDQogICAgICB0aGlzLnJlZ2lzdGVyRm9ybUNhbGxiYWNrcygpOw0KICAgIGVsc2UNCiAgICAgIHRoaXMucmVnaXN0ZXJDYWxsYmFjayh0aGlzLmVsZW1lbnQpOw0KICB9LA0KDQogIG9uRWxlbWVudEV2ZW50OiBmdW5jdGlvbigpIHsNCiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7DQogICAgaWYgKHRoaXMubGFzdFZhbHVlICE9IHZhbHVlKSB7DQogICAgICB0aGlzLmNhbGxiYWNrKHRoaXMuZWxlbWVudCwgdmFsdWUpOw0KICAgICAgdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTsNCiAgICB9DQogIH0sDQoNCiAgcmVnaXN0ZXJGb3JtQ2FsbGJhY2tzOiBmdW5jdGlvbigpIHsNCiAgICBGb3JtLmdldEVsZW1lbnRzKHRoaXMuZWxlbWVudCkuZWFjaCh0aGlzLnJlZ2lzdGVyQ2FsbGJhY2ssIHRoaXMpOw0KICB9LA0KDQogIHJlZ2lzdGVyQ2FsbGJhY2s6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBpZiAoZWxlbWVudC50eXBlKSB7DQogICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZS50b0xvd2VyQ2FzZSgpKSB7DQogICAgICAgIGNhc2UgJ2NoZWNrYm94JzoNCiAgICAgICAgY2FzZSAncmFkaW8nOg0KICAgICAgICAgIEV2ZW50Lm9ic2VydmUoZWxlbWVudCwgJ2NsaWNrJywgdGhpcy5vbkVsZW1lbnRFdmVudC5iaW5kKHRoaXMpKTsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICBFdmVudC5vYnNlcnZlKGVsZW1lbnQsICdjaGFuZ2UnLCB0aGlzLm9uRWxlbWVudEV2ZW50LmJpbmQodGhpcykpOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfSk7DQoNCkZvcm0uRWxlbWVudC5FdmVudE9ic2VydmVyID0gQ2xhc3MuY3JlYXRlKEFic3RyYWN0LkV2ZW50T2JzZXJ2ZXIsIHsNCiAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBGb3JtLkVsZW1lbnQuZ2V0VmFsdWUodGhpcy5lbGVtZW50KTsNCiAgfQ0KfSk7DQoNCkZvcm0uRXZlbnRPYnNlcnZlciA9IENsYXNzLmNyZWF0ZShBYnN0cmFjdC5FdmVudE9ic2VydmVyLCB7DQogIGdldFZhbHVlOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gRm9ybS5zZXJpYWxpemUodGhpcy5lbGVtZW50KTsNCiAgfQ0KfSk7DQooZnVuY3Rpb24oKSB7DQoNCiAgdmFyIEV2ZW50ID0gew0KICAgIEtFWV9CQUNLU1BBQ0U6IDgsDQogICAgS0VZX1RBQjogICAgICAgOSwNCiAgICBLRVlfUkVUVVJOOiAgIDEzLA0KICAgIEtFWV9FU0M6ICAgICAgMjcsDQogICAgS0VZX0xFRlQ6ICAgICAzNywNCiAgICBLRVlfVVA6ICAgICAgIDM4LA0KICAgIEtFWV9SSUdIVDogICAgMzksDQogICAgS0VZX0RPV046ICAgICA0MCwNCiAgICBLRVlfREVMRVRFOiAgIDQ2LA0KICAgIEtFWV9IT01FOiAgICAgMzYsDQogICAgS0VZX0VORDogICAgICAzNSwNCiAgICBLRVlfUEFHRVVQOiAgIDMzLA0KICAgIEtFWV9QQUdFRE9XTjogMzQsDQogICAgS0VZX0lOU0VSVDogICA0NSwNCg0KICAgIGNhY2hlOiB7fQ0KICB9Ow0KDQogIHZhciBkb2NFbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsNCiAgdmFyIE1PVVNFRU5URVJfTU9VU0VMRUFWRV9FVkVOVFNfU1VQUE9SVEVEID0gJ29ubW91c2VlbnRlcicgaW4gZG9jRWwNCiAgICAmJiAnb25tb3VzZWxlYXZlJyBpbiBkb2NFbDsNCg0KDQoNCiAgdmFyIGlzSUVMZWdhY3lFdmVudCA9IGZ1bmN0aW9uKGV2ZW50KSB7IHJldHVybiBmYWxzZTsgfTsNCg0KICBpZiAod2luZG93LmF0dGFjaEV2ZW50KSB7DQogICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICBpc0lFTGVnYWN5RXZlbnQgPSBmdW5jdGlvbihldmVudCkgew0KICAgICAgICByZXR1cm4gIShldmVudCBpbnN0YW5jZW9mIHdpbmRvdy5FdmVudCk7DQogICAgICB9Ow0KICAgIH0gZWxzZSB7DQogICAgICBpc0lFTGVnYWN5RXZlbnQgPSBmdW5jdGlvbihldmVudCkgeyByZXR1cm4gdHJ1ZTsgfTsNCiAgICB9DQogIH0NCg0KICB2YXIgX2lzQnV0dG9uOw0KDQogIGZ1bmN0aW9uIF9pc0J1dHRvbkZvckRPTUV2ZW50cyhldmVudCwgY29kZSkgew0KICAgIHJldHVybiBldmVudC53aGljaCA/IChldmVudC53aGljaCA9PT0gY29kZSArIDEpIDogKGV2ZW50LmJ1dHRvbiA9PT0gY29kZSk7DQogIH0NCg0KICB2YXIgbGVnYWN5QnV0dG9uTWFwID0geyAwOiAxLCAxOiA0LCAyOiAyIH07DQogIGZ1bmN0aW9uIF9pc0J1dHRvbkZvckxlZ2FjeUV2ZW50cyhldmVudCwgY29kZSkgew0KICAgIHJldHVybiBldmVudC5idXR0b24gPT09IGxlZ2FjeUJ1dHRvbk1hcFtjb2RlXTsNCiAgfQ0KDQogIGZ1bmN0aW9uIF9pc0J1dHRvbkZvcldlYktpdChldmVudCwgY29kZSkgew0KICAgIHN3aXRjaCAoY29kZSkgew0KICAgICAgY2FzZSAwOiByZXR1cm4gZXZlbnQud2hpY2ggPT0gMSAmJiAhZXZlbnQubWV0YUtleTsNCiAgICAgIGNhc2UgMTogcmV0dXJuIGV2ZW50LndoaWNoID09IDIgfHwgKGV2ZW50LndoaWNoID09IDEgJiYgZXZlbnQubWV0YUtleSk7DQogICAgICBjYXNlIDI6IHJldHVybiBldmVudC53aGljaCA9PSAzOw0KICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOw0KICAgIH0NCiAgfQ0KDQogIGlmICh3aW5kb3cuYXR0YWNoRXZlbnQpIHsNCiAgICBpZiAoIXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICBfaXNCdXR0b24gPSBfaXNCdXR0b25Gb3JMZWdhY3lFdmVudHM7DQogICAgfSBlbHNlIHsNCiAgICAgIF9pc0J1dHRvbiA9IGZ1bmN0aW9uKGV2ZW50LCBjb2RlKSB7DQogICAgICAgIHJldHVybiBpc0lFTGVnYWN5RXZlbnQoZXZlbnQpID8gX2lzQnV0dG9uRm9yTGVnYWN5RXZlbnRzKGV2ZW50LCBjb2RlKSA6DQogICAgICAgICBfaXNCdXR0b25Gb3JET01FdmVudHMoZXZlbnQsIGNvZGUpOw0KICAgICAgfQ0KICAgIH0NCiAgfSBlbHNlIGlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQpIHsNCiAgICBfaXNCdXR0b24gPSBfaXNCdXR0b25Gb3JXZWJLaXQ7DQogIH0gZWxzZSB7DQogICAgX2lzQnV0dG9uID0gX2lzQnV0dG9uRm9yRE9NRXZlbnRzOw0KICB9DQoNCiAgZnVuY3Rpb24gaXNMZWZ0Q2xpY2soZXZlbnQpICAgeyByZXR1cm4gX2lzQnV0dG9uKGV2ZW50LCAwKSB9DQoNCiAgZnVuY3Rpb24gaXNNaWRkbGVDbGljayhldmVudCkgeyByZXR1cm4gX2lzQnV0dG9uKGV2ZW50LCAxKSB9DQoNCiAgZnVuY3Rpb24gaXNSaWdodENsaWNrKGV2ZW50KSAgeyByZXR1cm4gX2lzQnV0dG9uKGV2ZW50LCAyKSB9DQoNCiAgZnVuY3Rpb24gZWxlbWVudChldmVudCkgew0KICAgIGV2ZW50ID0gRXZlbnQuZXh0ZW5kKGV2ZW50KTsNCg0KICAgIHZhciBub2RlID0gZXZlbnQudGFyZ2V0LCB0eXBlID0gZXZlbnQudHlwZSwNCiAgICAgY3VycmVudFRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7DQoNCiAgICBpZiAoY3VycmVudFRhcmdldCAmJiBjdXJyZW50VGFyZ2V0LnRhZ05hbWUpIHsNCiAgICAgIGlmICh0eXBlID09PSAnbG9hZCcgfHwgdHlwZSA9PT0gJ2Vycm9yJyB8fA0KICAgICAgICAodHlwZSA9PT0gJ2NsaWNrJyAmJiBjdXJyZW50VGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0Jw0KICAgICAgICAgICYmIGN1cnJlbnRUYXJnZXQudHlwZSA9PT0gJ3JhZGlvJykpDQogICAgICAgICAgICBub2RlID0gY3VycmVudFRhcmdldDsNCiAgICB9DQoNCiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkNCiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7DQoNCiAgICByZXR1cm4gRWxlbWVudC5leHRlbmQobm9kZSk7DQogIH0NCg0KICBmdW5jdGlvbiBmaW5kRWxlbWVudChldmVudCwgZXhwcmVzc2lvbikgew0KICAgIHZhciBlbGVtZW50ID0gRXZlbnQuZWxlbWVudChldmVudCk7DQoNCiAgICBpZiAoIWV4cHJlc3Npb24pIHJldHVybiBlbGVtZW50Ow0KICAgIHdoaWxlIChlbGVtZW50KSB7DQogICAgICBpZiAoT2JqZWN0LmlzRWxlbWVudChlbGVtZW50KSAmJiBQcm90b3R5cGUuU2VsZWN0b3IubWF0Y2goZWxlbWVudCwgZXhwcmVzc2lvbikpIHsNCiAgICAgICAgcmV0dXJuIEVsZW1lbnQuZXh0ZW5kKGVsZW1lbnQpOw0KICAgICAgfQ0KICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBwb2ludGVyKGV2ZW50KSB7DQogICAgcmV0dXJuIHsgeDogcG9pbnRlclgoZXZlbnQpLCB5OiBwb2ludGVyWShldmVudCkgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBvaW50ZXJYKGV2ZW50KSB7DQogICAgdmFyIGRvY0VsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsDQogICAgIGJvZHkgPSBkb2N1bWVudC5ib2R5IHx8IHsgc2Nyb2xsTGVmdDogMCB9Ow0KDQogICAgcmV0dXJuIGV2ZW50LnBhZ2VYIHx8IChldmVudC5jbGllbnRYICsNCiAgICAgIChkb2NFbGVtZW50LnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0KSAtDQogICAgICAoZG9jRWxlbWVudC5jbGllbnRMZWZ0IHx8IDApKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBvaW50ZXJZKGV2ZW50KSB7DQogICAgdmFyIGRvY0VsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsDQogICAgIGJvZHkgPSBkb2N1bWVudC5ib2R5IHx8IHsgc2Nyb2xsVG9wOiAwIH07DQoNCiAgICByZXR1cm4gIGV2ZW50LnBhZ2VZIHx8IChldmVudC5jbGllbnRZICsNCiAgICAgICAoZG9jRWxlbWVudC5zY3JvbGxUb3AgfHwgYm9keS5zY3JvbGxUb3ApIC0NCiAgICAgICAoZG9jRWxlbWVudC5jbGllbnRUb3AgfHwgMCkpOw0KICB9DQoNCg0KICBmdW5jdGlvbiBzdG9wKGV2ZW50KSB7DQogICAgRXZlbnQuZXh0ZW5kKGV2ZW50KTsNCiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOw0KDQogICAgZXZlbnQuc3RvcHBlZCA9IHRydWU7DQogIH0NCg0KDQogIEV2ZW50Lk1ldGhvZHMgPSB7DQogICAgaXNMZWZ0Q2xpY2s6ICAgaXNMZWZ0Q2xpY2ssDQogICAgaXNNaWRkbGVDbGljazogaXNNaWRkbGVDbGljaywNCiAgICBpc1JpZ2h0Q2xpY2s6ICBpc1JpZ2h0Q2xpY2ssDQoNCiAgICBlbGVtZW50OiAgICAgZWxlbWVudCwNCiAgICBmaW5kRWxlbWVudDogZmluZEVsZW1lbnQsDQoNCiAgICBwb2ludGVyOiAgcG9pbnRlciwNCiAgICBwb2ludGVyWDogcG9pbnRlclgsDQogICAgcG9pbnRlclk6IHBvaW50ZXJZLA0KDQogICAgc3RvcDogc3RvcA0KICB9Ow0KDQogIHZhciBtZXRob2RzID0gT2JqZWN0LmtleXMoRXZlbnQuTWV0aG9kcykuaW5qZWN0KHsgfSwgZnVuY3Rpb24obSwgbmFtZSkgew0KICAgIG1bbmFtZV0gPSBFdmVudC5NZXRob2RzW25hbWVdLm1ldGhvZGl6ZSgpOw0KICAgIHJldHVybiBtOw0KICB9KTsNCg0KICBpZiAod2luZG93LmF0dGFjaEV2ZW50KSB7DQogICAgZnVuY3Rpb24gX3JlbGF0ZWRUYXJnZXQoZXZlbnQpIHsNCiAgICAgIHZhciBlbGVtZW50Ow0KICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7DQogICAgICAgIGNhc2UgJ21vdXNlb3Zlcic6DQogICAgICAgIGNhc2UgJ21vdXNlZW50ZXInOg0KICAgICAgICAgIGVsZW1lbnQgPSBldmVudC5mcm9tRWxlbWVudDsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgY2FzZSAnbW91c2VvdXQnOg0KICAgICAgICBjYXNlICdtb3VzZWxlYXZlJzoNCiAgICAgICAgICBlbGVtZW50ID0gZXZlbnQudG9FbGVtZW50Ow0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIEVsZW1lbnQuZXh0ZW5kKGVsZW1lbnQpOw0KICAgIH0NCg0KICAgIHZhciBhZGRpdGlvbmFsTWV0aG9kcyA9IHsNCiAgICAgIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7IHRoaXMuY2FuY2VsQnViYmxlID0gdHJ1ZSB9LA0KICAgICAgcHJldmVudERlZmF1bHQ6ICBmdW5jdGlvbigpIHsgdGhpcy5yZXR1cm5WYWx1ZSA9IGZhbHNlIH0sDQogICAgICBpbnNwZWN0OiBmdW5jdGlvbigpIHsgcmV0dXJuICdbb2JqZWN0IEV2ZW50XScgfQ0KICAgIH07DQoNCiAgICBFdmVudC5leHRlbmQgPSBmdW5jdGlvbihldmVudCwgZWxlbWVudCkgew0KICAgICAgaWYgKCFldmVudCkgcmV0dXJuIGZhbHNlOw0KDQogICAgICBpZiAoIWlzSUVMZWdhY3lFdmVudChldmVudCkpIHJldHVybiBldmVudDsNCg0KICAgICAgaWYgKGV2ZW50Ll9leHRlbmRlZEJ5UHJvdG90eXBlKSByZXR1cm4gZXZlbnQ7DQogICAgICBldmVudC5fZXh0ZW5kZWRCeVByb3RvdHlwZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOw0KDQogICAgICB2YXIgcG9pbnRlciA9IEV2ZW50LnBvaW50ZXIoZXZlbnQpOw0KDQogICAgICBPYmplY3QuZXh0ZW5kKGV2ZW50LCB7DQogICAgICAgIHRhcmdldDogZXZlbnQuc3JjRWxlbWVudCB8fCBlbGVtZW50LA0KICAgICAgICByZWxhdGVkVGFyZ2V0OiBfcmVsYXRlZFRhcmdldChldmVudCksDQogICAgICAgIHBhZ2VYOiAgcG9pbnRlci54LA0KICAgICAgICBwYWdlWTogIHBvaW50ZXIueQ0KICAgICAgfSk7DQoNCiAgICAgIE9iamVjdC5leHRlbmQoZXZlbnQsIG1ldGhvZHMpOw0KICAgICAgT2JqZWN0LmV4dGVuZChldmVudCwgYWRkaXRpb25hbE1ldGhvZHMpOw0KDQogICAgICByZXR1cm4gZXZlbnQ7DQogICAgfTsNCiAgfSBlbHNlIHsNCiAgICBFdmVudC5leHRlbmQgPSBQcm90b3R5cGUuSzsNCiAgfQ0KDQogIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgew0KICAgIEV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGUgfHwgZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0hUTUxFdmVudHMnKS5fX3Byb3RvX187DQogICAgT2JqZWN0LmV4dGVuZChFdmVudC5wcm90b3R5cGUsIG1ldGhvZHMpOw0KICB9DQoNCiAgZnVuY3Rpb24gX2NyZWF0ZVJlc3BvbmRlcihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpIHsNCiAgICB2YXIgcmVnaXN0cnkgPSBFbGVtZW50LnJldHJpZXZlKGVsZW1lbnQsICdwcm90b3R5cGVfZXZlbnRfcmVnaXN0cnknKTsNCg0KICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQocmVnaXN0cnkpKSB7DQogICAgICBDQUNIRS5wdXNoKGVsZW1lbnQpOw0KICAgICAgcmVnaXN0cnkgPSBFbGVtZW50LnJldHJpZXZlKGVsZW1lbnQsICdwcm90b3R5cGVfZXZlbnRfcmVnaXN0cnknLCAkSCgpKTsNCiAgICB9DQoNCiAgICB2YXIgcmVzcG9uZGVyc0ZvckV2ZW50ID0gcmVnaXN0cnkuZ2V0KGV2ZW50TmFtZSk7DQogICAgaWYgKE9iamVjdC5pc1VuZGVmaW5lZChyZXNwb25kZXJzRm9yRXZlbnQpKSB7DQogICAgICByZXNwb25kZXJzRm9yRXZlbnQgPSBbXTsNCiAgICAgIHJlZ2lzdHJ5LnNldChldmVudE5hbWUsIHJlc3BvbmRlcnNGb3JFdmVudCk7DQogICAgfQ0KDQogICAgaWYgKHJlc3BvbmRlcnNGb3JFdmVudC5wbHVjaygnaGFuZGxlcicpLmluY2x1ZGUoaGFuZGxlcikpIHJldHVybiBmYWxzZTsNCg0KICAgIHZhciByZXNwb25kZXI7DQogICAgaWYgKGV2ZW50TmFtZS5pbmNsdWRlKCI6IikpIHsNCiAgICAgIHJlc3BvbmRlciA9IGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgICAgIGlmIChPYmplY3QuaXNVbmRlZmluZWQoZXZlbnQuZXZlbnROYW1lKSkNCiAgICAgICAgICByZXR1cm4gZmFsc2U7DQoNCiAgICAgICAgaWYgKGV2ZW50LmV2ZW50TmFtZSAhPT0gZXZlbnROYW1lKQ0KICAgICAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgICAgICBFdmVudC5leHRlbmQoZXZlbnQsIGVsZW1lbnQpOw0KICAgICAgICBoYW5kbGVyLmNhbGwoZWxlbWVudCwgZXZlbnQpOw0KICAgICAgfTsNCiAgICB9IGVsc2Ugew0KICAgICAgaWYgKCFNT1VTRUVOVEVSX01PVVNFTEVBVkVfRVZFTlRTX1NVUFBPUlRFRCAmJg0KICAgICAgIChldmVudE5hbWUgPT09ICJtb3VzZWVudGVyIiB8fCBldmVudE5hbWUgPT09ICJtb3VzZWxlYXZlIikpIHsNCiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gIm1vdXNlZW50ZXIiIHx8IGV2ZW50TmFtZSA9PT0gIm1vdXNlbGVhdmUiKSB7DQogICAgICAgICAgcmVzcG9uZGVyID0gZnVuY3Rpb24oZXZlbnQpIHsNCiAgICAgICAgICAgIEV2ZW50LmV4dGVuZChldmVudCwgZWxlbWVudCk7DQoNCiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBldmVudC5yZWxhdGVkVGFyZ2V0Ow0KICAgICAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQgIT09IGVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgdHJ5IHsgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7IH0NCiAgICAgICAgICAgICAgY2F0Y2goZSkgeyBwYXJlbnQgPSBlbGVtZW50OyB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChwYXJlbnQgPT09IGVsZW1lbnQpIHJldHVybjsNCg0KICAgICAgICAgICAgaGFuZGxlci5jYWxsKGVsZW1lbnQsIGV2ZW50KTsNCiAgICAgICAgICB9Ow0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXNwb25kZXIgPSBmdW5jdGlvbihldmVudCkgew0KICAgICAgICAgIEV2ZW50LmV4dGVuZChldmVudCwgZWxlbWVudCk7DQogICAgICAgICAgaGFuZGxlci5jYWxsKGVsZW1lbnQsIGV2ZW50KTsNCiAgICAgICAgfTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICByZXNwb25kZXIuaGFuZGxlciA9IGhhbmRsZXI7DQogICAgcmVzcG9uZGVyc0ZvckV2ZW50LnB1c2gocmVzcG9uZGVyKTsNCiAgICByZXR1cm4gcmVzcG9uZGVyOw0KICB9DQoNCiAgZnVuY3Rpb24gX2Rlc3Ryb3lDYWNoZSgpIHsNCiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gQ0FDSEUubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgIEV2ZW50LnN0b3BPYnNlcnZpbmcoQ0FDSEVbaV0pOw0KICAgICAgQ0FDSEVbaV0gPSBudWxsOw0KICAgIH0NCiAgfQ0KDQogIHZhciBDQUNIRSA9IFtdOw0KDQogIGlmIChQcm90b3R5cGUuQnJvd3Nlci5JRSkNCiAgICB3aW5kb3cuYXR0YWNoRXZlbnQoJ29udW5sb2FkJywgX2Rlc3Ryb3lDYWNoZSk7DQoNCiAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLldlYktpdCkNCiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5sb2FkJywgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24sIGZhbHNlKTsNCg0KDQogIHZhciBfZ2V0RE9NRXZlbnROYW1lID0gUHJvdG90eXBlLkssDQogICAgICB0cmFuc2xhdGlvbnMgPSB7IG1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLCBtb3VzZWxlYXZlOiAibW91c2VvdXQiIH07DQoNCiAgaWYgKCFNT1VTRUVOVEVSX01PVVNFTEVBVkVfRVZFTlRTX1NVUFBPUlRFRCkgew0KICAgIF9nZXRET01FdmVudE5hbWUgPSBmdW5jdGlvbihldmVudE5hbWUpIHsNCiAgICAgIHJldHVybiAodHJhbnNsYXRpb25zW2V2ZW50TmFtZV0gfHwgZXZlbnROYW1lKTsNCiAgICB9Ow0KICB9DQoNCiAgZnVuY3Rpb24gb2JzZXJ2ZShlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCg0KICAgIHZhciByZXNwb25kZXIgPSBfY3JlYXRlUmVzcG9uZGVyKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcik7DQoNCiAgICBpZiAoIXJlc3BvbmRlcikgcmV0dXJuIGVsZW1lbnQ7DQoNCiAgICBpZiAoZXZlbnROYW1lLmluY2x1ZGUoJzonKSkgew0KICAgICAgaWYgKGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikNCiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJkYXRhYXZhaWxhYmxlIiwgcmVzcG9uZGVyLCBmYWxzZSk7DQogICAgICBlbHNlIHsNCiAgICAgICAgZWxlbWVudC5hdHRhY2hFdmVudCgib25kYXRhYXZhaWxhYmxlIiwgcmVzcG9uZGVyKTsNCiAgICAgICAgZWxlbWVudC5hdHRhY2hFdmVudCgib25sb3NlY2FwdHVyZSIsIHJlc3BvbmRlcik7DQogICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgIHZhciBhY3R1YWxFdmVudE5hbWUgPSBfZ2V0RE9NRXZlbnROYW1lKGV2ZW50TmFtZSk7DQoNCiAgICAgIGlmIChlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIpDQogICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihhY3R1YWxFdmVudE5hbWUsIHJlc3BvbmRlciwgZmFsc2UpOw0KICAgICAgZWxzZQ0KICAgICAgICBlbGVtZW50LmF0dGFjaEV2ZW50KCJvbiIgKyBhY3R1YWxFdmVudE5hbWUsIHJlc3BvbmRlcik7DQogICAgfQ0KDQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0NCg0KICBmdW5jdGlvbiBzdG9wT2JzZXJ2aW5nKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcikgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KDQogICAgdmFyIHJlZ2lzdHJ5ID0gRWxlbWVudC5yZXRyaWV2ZShlbGVtZW50LCAncHJvdG90eXBlX2V2ZW50X3JlZ2lzdHJ5Jyk7DQogICAgaWYgKCFyZWdpc3RyeSkgcmV0dXJuIGVsZW1lbnQ7DQoNCiAgICBpZiAoIWV2ZW50TmFtZSkgew0KICAgICAgcmVnaXN0cnkuZWFjaCggZnVuY3Rpb24ocGFpcikgew0KICAgICAgICB2YXIgZXZlbnROYW1lID0gcGFpci5rZXk7DQogICAgICAgIHN0b3BPYnNlcnZpbmcoZWxlbWVudCwgZXZlbnROYW1lKTsNCiAgICAgIH0pOw0KICAgICAgcmV0dXJuIGVsZW1lbnQ7DQogICAgfQ0KDQogICAgdmFyIHJlc3BvbmRlcnMgPSByZWdpc3RyeS5nZXQoZXZlbnROYW1lKTsNCiAgICBpZiAoIXJlc3BvbmRlcnMpIHJldHVybiBlbGVtZW50Ow0KDQogICAgaWYgKCFoYW5kbGVyKSB7DQogICAgICByZXNwb25kZXJzLmVhY2goZnVuY3Rpb24ocikgew0KICAgICAgICBzdG9wT2JzZXJ2aW5nKGVsZW1lbnQsIGV2ZW50TmFtZSwgci5oYW5kbGVyKTsNCiAgICAgIH0pOw0KICAgICAgcmV0dXJuIGVsZW1lbnQ7DQogICAgfQ0KDQogICAgdmFyIGkgPSByZXNwb25kZXJzLmxlbmd0aCwgcmVzcG9uZGVyOw0KICAgIHdoaWxlIChpLS0pIHsNCiAgICAgIGlmIChyZXNwb25kZXJzW2ldLmhhbmRsZXIgPT09IGhhbmRsZXIpIHsNCiAgICAgICAgcmVzcG9uZGVyID0gcmVzcG9uZGVyc1tpXTsNCiAgICAgICAgYnJlYWs7DQogICAgICB9DQogICAgfQ0KICAgIGlmICghcmVzcG9uZGVyKSByZXR1cm4gZWxlbWVudDsNCg0KICAgIGlmIChldmVudE5hbWUuaW5jbHVkZSgnOicpKSB7DQogICAgICBpZiAoZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKQ0KICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImRhdGFhdmFpbGFibGUiLCByZXNwb25kZXIsIGZhbHNlKTsNCiAgICAgIGVsc2Ugew0KICAgICAgICBlbGVtZW50LmRldGFjaEV2ZW50KCJvbmRhdGFhdmFpbGFibGUiLCByZXNwb25kZXIpOw0KICAgICAgICBlbGVtZW50LmRldGFjaEV2ZW50KCJvbmxvc2VjYXB0dXJlIiwgcmVzcG9uZGVyKTsNCiAgICAgIH0NCiAgICB9IGVsc2Ugew0KICAgICAgdmFyIGFjdHVhbEV2ZW50TmFtZSA9IF9nZXRET01FdmVudE5hbWUoZXZlbnROYW1lKTsNCiAgICAgIGlmIChlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIpDQogICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhY3R1YWxFdmVudE5hbWUsIHJlc3BvbmRlciwgZmFsc2UpOw0KICAgICAgZWxzZQ0KICAgICAgICBlbGVtZW50LmRldGFjaEV2ZW50KCdvbicgKyBhY3R1YWxFdmVudE5hbWUsIHJlc3BvbmRlcik7DQogICAgfQ0KDQogICAgcmVnaXN0cnkuc2V0KGV2ZW50TmFtZSwgcmVzcG9uZGVycy53aXRob3V0KHJlc3BvbmRlcikpOw0KDQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0NCg0KICBmdW5jdGlvbiBmaXJlKGVsZW1lbnQsIGV2ZW50TmFtZSwgbWVtbywgYnViYmxlKSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQoNCiAgICBpZiAoT2JqZWN0LmlzVW5kZWZpbmVkKGJ1YmJsZSkpDQogICAgICBidWJibGUgPSB0cnVlOw0KDQogICAgaWYgKGVsZW1lbnQgPT0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3JlYXRlRXZlbnQgJiYgIWVsZW1lbnQuZGlzcGF0Y2hFdmVudCkNCiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7DQoNCiAgICB2YXIgZXZlbnQ7DQogICAgaWYgKGRvY3VtZW50LmNyZWF0ZUV2ZW50KSB7DQogICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7DQogICAgICBldmVudC5pbml0RXZlbnQoJ2RhdGFhdmFpbGFibGUnLCBidWJibGUsIHRydWUpOw0KICAgIH0gZWxzZSB7DQogICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0KCk7DQogICAgICBldmVudC5ldmVudFR5cGUgPSBidWJibGUgPyAnb25kYXRhYXZhaWxhYmxlJyA6ICdvbmxvc2VjYXB0dXJlJzsNCiAgICB9DQoNCiAgICBldmVudC5ldmVudE5hbWUgPSBldmVudE5hbWU7DQogICAgZXZlbnQubWVtbyA9IG1lbW8gfHwgeyB9Ow0KDQogICAgaWYgKGRvY3VtZW50LmNyZWF0ZUV2ZW50KQ0KICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTsNCiAgICBlbHNlDQogICAgICBlbGVtZW50LmZpcmVFdmVudChldmVudC5ldmVudFR5cGUsIGV2ZW50KTsNCg0KICAgIHJldHVybiBFdmVudC5leHRlbmQoZXZlbnQpOw0KICB9DQoNCiAgRXZlbnQuSGFuZGxlciA9IENsYXNzLmNyZWF0ZSh7DQogICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCwgZXZlbnROYW1lLCBzZWxlY3RvciwgY2FsbGJhY2spIHsNCiAgICAgIHRoaXMuZWxlbWVudCAgID0gJChlbGVtZW50KTsNCiAgICAgIHRoaXMuZXZlbnROYW1lID0gZXZlbnROYW1lOw0KICAgICAgdGhpcy5zZWxlY3RvciAgPSBzZWxlY3RvcjsNCiAgICAgIHRoaXMuY2FsbGJhY2sgID0gY2FsbGJhY2s7DQogICAgICB0aGlzLmhhbmRsZXIgICA9IHRoaXMuaGFuZGxlRXZlbnQuYmluZCh0aGlzKTsNCiAgICB9LA0KDQogICAgc3RhcnQ6IGZ1bmN0aW9uKCkgew0KICAgICAgRXZlbnQub2JzZXJ2ZSh0aGlzLmVsZW1lbnQsIHRoaXMuZXZlbnROYW1lLCB0aGlzLmhhbmRsZXIpOw0KICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIHN0b3A6IGZ1bmN0aW9uKCkgew0KICAgICAgRXZlbnQuc3RvcE9ic2VydmluZyh0aGlzLmVsZW1lbnQsIHRoaXMuZXZlbnROYW1lLCB0aGlzLmhhbmRsZXIpOw0KICAgICAgcmV0dXJuIHRoaXM7DQogICAgfSwNCg0KICAgIGhhbmRsZUV2ZW50OiBmdW5jdGlvbihldmVudCkgew0KICAgICAgdmFyIGVsZW1lbnQgPSBFdmVudC5maW5kRWxlbWVudChldmVudCwgdGhpcy5zZWxlY3Rvcik7DQogICAgICBpZiAoZWxlbWVudCkgdGhpcy5jYWxsYmFjay5jYWxsKHRoaXMuZWxlbWVudCwgZXZlbnQsIGVsZW1lbnQpOw0KICAgIH0NCiAgfSk7DQoNCiAgZnVuY3Rpb24gb24oZWxlbWVudCwgZXZlbnROYW1lLCBzZWxlY3RvciwgY2FsbGJhY2spIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICBpZiAoT2JqZWN0LmlzRnVuY3Rpb24oc2VsZWN0b3IpICYmIE9iamVjdC5pc1VuZGVmaW5lZChjYWxsYmFjaykpIHsNCiAgICAgIGNhbGxiYWNrID0gc2VsZWN0b3IsIHNlbGVjdG9yID0gbnVsbDsNCiAgICB9DQoNCiAgICByZXR1cm4gbmV3IEV2ZW50LkhhbmRsZXIoZWxlbWVudCwgZXZlbnROYW1lLCBzZWxlY3RvciwgY2FsbGJhY2spLnN0YXJ0KCk7DQogIH0NCg0KICBPYmplY3QuZXh0ZW5kKEV2ZW50LCBFdmVudC5NZXRob2RzKTsNCg0KICBPYmplY3QuZXh0ZW5kKEV2ZW50LCB7DQogICAgZmlyZTogICAgICAgICAgZmlyZSwNCiAgICBvYnNlcnZlOiAgICAgICBvYnNlcnZlLA0KICAgIHN0b3BPYnNlcnZpbmc6IHN0b3BPYnNlcnZpbmcsDQogICAgb246ICAgICAgICAgICAgb24NCiAgfSk7DQoNCiAgRWxlbWVudC5hZGRNZXRob2RzKHsNCiAgICBmaXJlOiAgICAgICAgICBmaXJlLA0KDQogICAgb2JzZXJ2ZTogICAgICAgb2JzZXJ2ZSwNCg0KICAgIHN0b3BPYnNlcnZpbmc6IHN0b3BPYnNlcnZpbmcsDQoNCiAgICBvbjogICAgICAgICAgICBvbg0KICB9KTsNCg0KICBPYmplY3QuZXh0ZW5kKGRvY3VtZW50LCB7DQogICAgZmlyZTogICAgICAgICAgZmlyZS5tZXRob2RpemUoKSwNCg0KICAgIG9ic2VydmU6ICAgICAgIG9ic2VydmUubWV0aG9kaXplKCksDQoNCiAgICBzdG9wT2JzZXJ2aW5nOiBzdG9wT2JzZXJ2aW5nLm1ldGhvZGl6ZSgpLA0KDQogICAgb246ICAgICAgICAgICAgb24ubWV0aG9kaXplKCksDQoNCiAgICBsb2FkZWQ6ICAgICAgICBmYWxzZQ0KICB9KTsNCg0KICBpZiAod2luZG93LkV2ZW50KSBPYmplY3QuZXh0ZW5kKHdpbmRvdy5FdmVudCwgRXZlbnQpOw0KICBlbHNlIHdpbmRvdy5FdmVudCA9IEV2ZW50Ow0KfSkoKTsNCg0KKGZ1bmN0aW9uKCkgew0KICAvKiBTdXBwb3J0IGZvciB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBpcyBiYXNlZCBvbiB3b3JrIGJ5IERhbiBXZWJiLA0KICAgICBNYXR0aGlhcyBNaWxsZXIsIERlYW4gRWR3YXJkcywgSm9obiBSZXNpZywgYW5kIERpZWdvIFBlcmluaS4gKi8NCg0KICB2YXIgdGltZXI7DQoNCiAgZnVuY3Rpb24gZmlyZUNvbnRlbnRMb2FkZWRFdmVudCgpIHsNCiAgICBpZiAoZG9jdW1lbnQubG9hZGVkKSByZXR1cm47DQogICAgaWYgKHRpbWVyKSB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVyKTsNCiAgICBkb2N1bWVudC5sb2FkZWQgPSB0cnVlOw0KICAgIGRvY3VtZW50LmZpcmUoJ2RvbTpsb2FkZWQnKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGNoZWNrUmVhZHlTdGF0ZSgpIHsNCiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykgew0KICAgICAgZG9jdW1lbnQuc3RvcE9ic2VydmluZygncmVhZHlzdGF0ZWNoYW5nZScsIGNoZWNrUmVhZHlTdGF0ZSk7DQogICAgICBmaXJlQ29udGVudExvYWRlZEV2ZW50KCk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gcG9sbERvU2Nyb2xsKCkgew0KICAgIHRyeSB7IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgnbGVmdCcpOyB9DQogICAgY2F0Y2goZSkgew0KICAgICAgdGltZXIgPSBwb2xsRG9TY3JvbGwuZGVmZXIoKTsNCiAgICAgIHJldHVybjsNCiAgICB9DQogICAgZmlyZUNvbnRlbnRMb2FkZWRFdmVudCgpOw0KICB9DQoNCiAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsNCiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZmlyZUNvbnRlbnRMb2FkZWRFdmVudCwgZmFsc2UpOw0KICB9IGVsc2Ugew0KICAgIGRvY3VtZW50Lm9ic2VydmUoJ3JlYWR5c3RhdGVjaGFuZ2UnLCBjaGVja1JlYWR5U3RhdGUpOw0KICAgIGlmICh3aW5kb3cgPT0gdG9wKQ0KICAgICAgdGltZXIgPSBwb2xsRG9TY3JvbGwuZGVmZXIoKTsNCiAgfQ0KDQogIEV2ZW50Lm9ic2VydmUod2luZG93LCAnbG9hZCcsIGZpcmVDb250ZW50TG9hZGVkRXZlbnQpOw0KfSkoKTsNCg0KRWxlbWVudC5hZGRNZXRob2RzKCk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBERVBSRUNBVEVEIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpIYXNoLnRvUXVlcnlTdHJpbmcgPSBPYmplY3QudG9RdWVyeVN0cmluZzsNCg0KdmFyIFRvZ2dsZSA9IHsgZGlzcGxheTogRWxlbWVudC50b2dnbGUgfTsNCg0KRWxlbWVudC5NZXRob2RzLmNoaWxkT2YgPSBFbGVtZW50Lk1ldGhvZHMuZGVzY2VuZGFudE9mOw0KDQp2YXIgSW5zZXJ0aW9uID0gew0KICBCZWZvcmU6IGZ1bmN0aW9uKGVsZW1lbnQsIGNvbnRlbnQpIHsNCiAgICByZXR1cm4gRWxlbWVudC5pbnNlcnQoZWxlbWVudCwge2JlZm9yZTpjb250ZW50fSk7DQogIH0sDQoNCiAgVG9wOiBmdW5jdGlvbihlbGVtZW50LCBjb250ZW50KSB7DQogICAgcmV0dXJuIEVsZW1lbnQuaW5zZXJ0KGVsZW1lbnQsIHt0b3A6Y29udGVudH0pOw0KICB9LA0KDQogIEJvdHRvbTogZnVuY3Rpb24oZWxlbWVudCwgY29udGVudCkgew0KICAgIHJldHVybiBFbGVtZW50Lmluc2VydChlbGVtZW50LCB7Ym90dG9tOmNvbnRlbnR9KTsNCiAgfSwNCg0KICBBZnRlcjogZnVuY3Rpb24oZWxlbWVudCwgY29udGVudCkgew0KICAgIHJldHVybiBFbGVtZW50Lmluc2VydChlbGVtZW50LCB7YWZ0ZXI6Y29udGVudH0pOw0KICB9DQp9Ow0KDQp2YXIgJGNvbnRpbnVlID0gbmV3IEVycm9yKCcidGhyb3cgJGNvbnRpbnVlIiBpcyBkZXByZWNhdGVkLCB1c2UgInJldHVybiIgaW5zdGVhZCcpOw0KDQp2YXIgUG9zaXRpb24gPSB7DQogIGluY2x1ZGVTY3JvbGxPZmZzZXRzOiBmYWxzZSwNCg0KICBwcmVwYXJlOiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLmRlbHRhWCA9ICB3aW5kb3cucGFnZVhPZmZzZXQNCiAgICAgICAgICAgICAgICB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdA0KICAgICAgICAgICAgICAgIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdA0KICAgICAgICAgICAgICAgIHx8IDA7DQogICAgdGhpcy5kZWx0YVkgPSAgd2luZG93LnBhZ2VZT2Zmc2V0DQogICAgICAgICAgICAgICAgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcA0KICAgICAgICAgICAgICAgIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wDQogICAgICAgICAgICAgICAgfHwgMDsNCiAgfSwNCg0KICB3aXRoaW46IGZ1bmN0aW9uKGVsZW1lbnQsIHgsIHkpIHsNCiAgICBpZiAodGhpcy5pbmNsdWRlU2Nyb2xsT2Zmc2V0cykNCiAgICAgIHJldHVybiB0aGlzLndpdGhpbkluY2x1ZGluZ1Njcm9sbG9mZnNldHMoZWxlbWVudCwgeCwgeSk7DQogICAgdGhpcy54Y29tcCA9IHg7DQogICAgdGhpcy55Y29tcCA9IHk7DQogICAgdGhpcy5vZmZzZXQgPSBFbGVtZW50LmN1bXVsYXRpdmVPZmZzZXQoZWxlbWVudCk7DQoNCiAgICByZXR1cm4gKHkgPj0gdGhpcy5vZmZzZXRbMV0gJiYNCiAgICAgICAgICAgIHkgPCAgdGhpcy5vZmZzZXRbMV0gKyBlbGVtZW50Lm9mZnNldEhlaWdodCAmJg0KICAgICAgICAgICAgeCA+PSB0aGlzLm9mZnNldFswXSAmJg0KICAgICAgICAgICAgeCA8ICB0aGlzLm9mZnNldFswXSArIGVsZW1lbnQub2Zmc2V0V2lkdGgpOw0KICB9LA0KDQogIHdpdGhpbkluY2x1ZGluZ1Njcm9sbG9mZnNldHM6IGZ1bmN0aW9uKGVsZW1lbnQsIHgsIHkpIHsNCiAgICB2YXIgb2Zmc2V0Y2FjaGUgPSBFbGVtZW50LmN1bXVsYXRpdmVTY3JvbGxPZmZzZXQoZWxlbWVudCk7DQoNCiAgICB0aGlzLnhjb21wID0geCArIG9mZnNldGNhY2hlWzBdIC0gdGhpcy5kZWx0YVg7DQogICAgdGhpcy55Y29tcCA9IHkgKyBvZmZzZXRjYWNoZVsxXSAtIHRoaXMuZGVsdGFZOw0KICAgIHRoaXMub2Zmc2V0ID0gRWxlbWVudC5jdW11bGF0aXZlT2Zmc2V0KGVsZW1lbnQpOw0KDQogICAgcmV0dXJuICh0aGlzLnljb21wID49IHRoaXMub2Zmc2V0WzFdICYmDQogICAgICAgICAgICB0aGlzLnljb21wIDwgIHRoaXMub2Zmc2V0WzFdICsgZWxlbWVudC5vZmZzZXRIZWlnaHQgJiYNCiAgICAgICAgICAgIHRoaXMueGNvbXAgPj0gdGhpcy5vZmZzZXRbMF0gJiYNCiAgICAgICAgICAgIHRoaXMueGNvbXAgPCAgdGhpcy5vZmZzZXRbMF0gKyBlbGVtZW50Lm9mZnNldFdpZHRoKTsNCiAgfSwNCg0KICBvdmVybGFwOiBmdW5jdGlvbihtb2RlLCBlbGVtZW50KSB7DQogICAgaWYgKCFtb2RlKSByZXR1cm4gMDsNCiAgICBpZiAobW9kZSA9PSAndmVydGljYWwnKQ0KICAgICAgcmV0dXJuICgodGhpcy5vZmZzZXRbMV0gKyBlbGVtZW50Lm9mZnNldEhlaWdodCkgLSB0aGlzLnljb21wKSAvDQogICAgICAgIGVsZW1lbnQub2Zmc2V0SGVpZ2h0Ow0KICAgIGlmIChtb2RlID09ICdob3Jpem9udGFsJykNCiAgICAgIHJldHVybiAoKHRoaXMub2Zmc2V0WzBdICsgZWxlbWVudC5vZmZzZXRXaWR0aCkgLSB0aGlzLnhjb21wKSAvDQogICAgICAgIGVsZW1lbnQub2Zmc2V0V2lkdGg7DQogIH0sDQoNCg0KICBjdW11bGF0aXZlT2Zmc2V0OiBFbGVtZW50Lk1ldGhvZHMuY3VtdWxhdGl2ZU9mZnNldCwNCg0KICBwb3NpdGlvbmVkT2Zmc2V0OiBFbGVtZW50Lk1ldGhvZHMucG9zaXRpb25lZE9mZnNldCwNCg0KICBhYnNvbHV0aXplOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgUG9zaXRpb24ucHJlcGFyZSgpOw0KICAgIHJldHVybiBFbGVtZW50LmFic29sdXRpemUoZWxlbWVudCk7DQogIH0sDQoNCiAgcmVsYXRpdml6ZTogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIFBvc2l0aW9uLnByZXBhcmUoKTsNCiAgICByZXR1cm4gRWxlbWVudC5yZWxhdGl2aXplKGVsZW1lbnQpOw0KICB9LA0KDQogIHJlYWxPZmZzZXQ6IEVsZW1lbnQuTWV0aG9kcy5jdW11bGF0aXZlU2Nyb2xsT2Zmc2V0LA0KDQogIG9mZnNldFBhcmVudDogRWxlbWVudC5NZXRob2RzLmdldE9mZnNldFBhcmVudCwNCg0KICBwYWdlOiBFbGVtZW50Lk1ldGhvZHMudmlld3BvcnRPZmZzZXQsDQoNCiAgY2xvbmU6IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0LCBvcHRpb25zKSB7DQogICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwgeyB9Ow0KICAgIHJldHVybiBFbGVtZW50LmNsb25lUG9zaXRpb24odGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpOw0KICB9DQp9Ow0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gZnVuY3Rpb24oaW5zdGFuY2VNZXRob2RzKXsNCiAgZnVuY3Rpb24gaXRlcihuYW1lKSB7DQogICAgcmV0dXJuIG5hbWUuYmxhbmsoKSA/IG51bGwgOiAiW2NvbnRhaW5zKGNvbmNhdCgnICcsIEBjbGFzcywgJyAnKSwgJyAiICsgbmFtZSArICIgJyldIjsNCiAgfQ0KDQogIGluc3RhbmNlTWV0aG9kcy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gUHJvdG90eXBlLkJyb3dzZXJGZWF0dXJlcy5YUGF0aCA/DQogIGZ1bmN0aW9uKGVsZW1lbnQsIGNsYXNzTmFtZSkgew0KICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b1N0cmluZygpLnN0cmlwKCk7DQogICAgdmFyIGNvbmQgPSAvXHMvLnRlc3QoY2xhc3NOYW1lKSA/ICR3KGNsYXNzTmFtZSkubWFwKGl0ZXIpLmpvaW4oJycpIDogaXRlcihjbGFzc05hbWUpOw0KICAgIHJldHVybiBjb25kID8gZG9jdW1lbnQuX2dldEVsZW1lbnRzQnlYUGF0aCgnLi8vKicgKyBjb25kLCBlbGVtZW50KSA6IFtdOw0KICB9IDogZnVuY3Rpb24oZWxlbWVudCwgY2xhc3NOYW1lKSB7DQogICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvU3RyaW5nKCkuc3RyaXAoKTsNCiAgICB2YXIgZWxlbWVudHMgPSBbXSwgY2xhc3NOYW1lcyA9ICgvXHMvLnRlc3QoY2xhc3NOYW1lKSA/ICR3KGNsYXNzTmFtZSkgOiBudWxsKTsNCiAgICBpZiAoIWNsYXNzTmFtZXMgJiYgIWNsYXNzTmFtZSkgcmV0dXJuIGVsZW1lbnRzOw0KDQogICAgdmFyIG5vZGVzID0gJChlbGVtZW50KS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpOw0KICAgIGNsYXNzTmFtZSA9ICcgJyArIGNsYXNzTmFtZSArICcgJzsNCg0KICAgIGZvciAodmFyIGkgPSAwLCBjaGlsZCwgY247IGNoaWxkID0gbm9kZXNbaV07IGkrKykgew0KICAgICAgaWYgKGNoaWxkLmNsYXNzTmFtZSAmJiAoY24gPSAnICcgKyBjaGlsZC5jbGFzc05hbWUgKyAnICcpICYmIChjbi5pbmNsdWRlKGNsYXNzTmFtZSkgfHwNCiAgICAgICAgICAoY2xhc3NOYW1lcyAmJiBjbGFzc05hbWVzLmFsbChmdW5jdGlvbihuYW1lKSB7DQogICAgICAgICAgICByZXR1cm4gIW5hbWUudG9TdHJpbmcoKS5ibGFuaygpICYmIGNuLmluY2x1ZGUoJyAnICsgbmFtZSArICcgJyk7DQogICAgICAgICAgfSkpKSkNCiAgICAgICAgZWxlbWVudHMucHVzaChFbGVtZW50LmV4dGVuZChjaGlsZCkpOw0KICAgIH0NCiAgICByZXR1cm4gZWxlbWVudHM7DQogIH07DQoNCiAgcmV0dXJuIGZ1bmN0aW9uKGNsYXNzTmFtZSwgcGFyZW50RWxlbWVudCkgew0KICAgIHJldHVybiAkKHBhcmVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keSkuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWUpOw0KICB9Ow0KfShFbGVtZW50Lk1ldGhvZHMpOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KRWxlbWVudC5DbGFzc05hbWVzID0gQ2xhc3MuY3JlYXRlKCk7DQpFbGVtZW50LkNsYXNzTmFtZXMucHJvdG90eXBlID0gew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTsNCiAgfSwNCg0KICBfZWFjaDogZnVuY3Rpb24oaXRlcmF0b3IpIHsNCiAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KC9ccysvKS5zZWxlY3QoZnVuY3Rpb24obmFtZSkgew0KICAgICAgcmV0dXJuIG5hbWUubGVuZ3RoID4gMDsNCiAgICB9KS5fZWFjaChpdGVyYXRvcik7DQogIH0sDQoNCiAgc2V0OiBmdW5jdGlvbihjbGFzc05hbWUpIHsNCiAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3NOYW1lOw0KICB9LA0KDQogIGFkZDogZnVuY3Rpb24oY2xhc3NOYW1lVG9BZGQpIHsNCiAgICBpZiAodGhpcy5pbmNsdWRlKGNsYXNzTmFtZVRvQWRkKSkgcmV0dXJuOw0KICAgIHRoaXMuc2V0KCRBKHRoaXMpLmNvbmNhdChjbGFzc05hbWVUb0FkZCkuam9pbignICcpKTsNCiAgfSwNCg0KICByZW1vdmU6IGZ1bmN0aW9uKGNsYXNzTmFtZVRvUmVtb3ZlKSB7DQogICAgaWYgKCF0aGlzLmluY2x1ZGUoY2xhc3NOYW1lVG9SZW1vdmUpKSByZXR1cm47DQogICAgdGhpcy5zZXQoJEEodGhpcykud2l0aG91dChjbGFzc05hbWVUb1JlbW92ZSkuam9pbignICcpKTsNCiAgfSwNCg0KICB0b1N0cmluZzogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuICRBKHRoaXMpLmpvaW4oJyAnKTsNCiAgfQ0KfTsNCg0KT2JqZWN0LmV4dGVuZChFbGVtZW50LkNsYXNzTmFtZXMucHJvdG90eXBlLCBFbnVtZXJhYmxlKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCihmdW5jdGlvbigpIHsNCiAgd2luZG93LlNlbGVjdG9yID0gQ2xhc3MuY3JlYXRlKHsNCiAgICBpbml0aWFsaXplOiBmdW5jdGlvbihleHByZXNzaW9uKSB7DQogICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uLnN0cmlwKCk7DQogICAgfSwNCg0KICAgIGZpbmRFbGVtZW50czogZnVuY3Rpb24ocm9vdEVsZW1lbnQpIHsNCiAgICAgIHJldHVybiBQcm90b3R5cGUuU2VsZWN0b3Iuc2VsZWN0KHRoaXMuZXhwcmVzc2lvbiwgcm9vdEVsZW1lbnQpOw0KICAgIH0sDQoNCiAgICBtYXRjaDogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgcmV0dXJuIFByb3RvdHlwZS5TZWxlY3Rvci5tYXRjaChlbGVtZW50LCB0aGlzLmV4cHJlc3Npb24pOw0KICAgIH0sDQoNCiAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gdGhpcy5leHByZXNzaW9uOw0KICAgIH0sDQoNCiAgICBpbnNwZWN0OiBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiAiIzxTZWxlY3RvcjogIiArIHRoaXMuZXhwcmVzc2lvbiArICI+IjsNCiAgICB9DQogIH0pOw0KDQogIE9iamVjdC5leHRlbmQoU2VsZWN0b3IsIHsNCiAgICBtYXRjaEVsZW1lbnRzOiBmdW5jdGlvbihlbGVtZW50cywgZXhwcmVzc2lvbikgew0KICAgICAgdmFyIG1hdGNoID0gUHJvdG90eXBlLlNlbGVjdG9yLm1hdGNoLA0KICAgICAgICAgIHJlc3VsdHMgPSBbXTsNCg0KICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7DQogICAgICAgIHZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07DQogICAgICAgIGlmIChtYXRjaChlbGVtZW50LCBleHByZXNzaW9uKSkgew0KICAgICAgICAgIHJlc3VsdHMucHVzaChFbGVtZW50LmV4dGVuZChlbGVtZW50KSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiByZXN1bHRzOw0KICAgIH0sDQoNCiAgICBmaW5kRWxlbWVudDogZnVuY3Rpb24oZWxlbWVudHMsIGV4cHJlc3Npb24sIGluZGV4KSB7DQogICAgICBpbmRleCA9IGluZGV4IHx8IDA7DQogICAgICB2YXIgbWF0Y2hJbmRleCA9IDAsIGVsZW1lbnQ7DQogICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsNCiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnRzW2ldOw0KICAgICAgICBpZiAoUHJvdG90eXBlLlNlbGVjdG9yLm1hdGNoKGVsZW1lbnQsIGV4cHJlc3Npb24pICYmIGluZGV4ID09PSBtYXRjaEluZGV4KyspIHsNCiAgICAgICAgICByZXR1cm4gRWxlbWVudC5leHRlbmQoZWxlbWVudCk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KDQogICAgZmluZENoaWxkRWxlbWVudHM6IGZ1bmN0aW9uKGVsZW1lbnQsIGV4cHJlc3Npb25zKSB7DQogICAgICB2YXIgc2VsZWN0b3IgPSBleHByZXNzaW9ucy50b0FycmF5KCkuam9pbignLCAnKTsNCiAgICAgIHJldHVybiBQcm90b3R5cGUuU2VsZWN0b3Iuc2VsZWN0KHNlbGVjdG9yLCBlbGVtZW50IHx8IGRvY3VtZW50KTsNCiAgICB9DQogIH0pOw0KfSkoKTsNCg0KPC9zY3JpcHQ+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQogICAgICAgIEFycmF5LmZyb20gPSBfX1Byb3RvdHlwZVByZXNlcnZlWzBdIHx8IEFycmF5LmZyb207DQogICAgICAgIEFycmF5LnByb3RvdHlwZS5maWx0ZXIgPSBfX1Byb3RvdHlwZVByZXNlcnZlWzFdIHx8IEFycmF5LnByb3RvdHlwZS5maWx0ZXI7DQogICAgICAgIEFycmF5LnByb3RvdHlwZS5mbGF0TWFwID0gX19Qcm90b3R5cGVQcmVzZXJ2ZVsyXSB8fCBBcnJheS5wcm90b3R5cGUuZmxhdE1hcDsNCiAgICAgICAgQXJyYXkucHJvdG90eXBlLmZpbmQgPSBfX1Byb3RvdHlwZVByZXNlcnZlWzNdIHx8IEFycmF5LnByb3RvdHlwZS5maW5kOw0KICAgICAgICBBcnJheS5wcm90b3R5cGUuc29tZSA9IF9fUHJvdG90eXBlUHJlc2VydmVbNF0gfHwgQXJyYXkucHJvdG90eXBlLnNvbWU7DQogICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kID0gX19Qcm90b3R5cGVQcmVzZXJ2ZVs1XSB8fCBGdW5jdGlvbi5wcm90b3R5cGUuYmluZDsNCiAgICAgICAgSFRNTEVsZW1lbnQucHJvdG90eXBlLnNjcm9sbFRvID0gX19Qcm90b3R5cGVQcmVzZXJ2ZVs2XSB8fCBIVE1MRWxlbWVudC5wcm90b3R5cGUuc2Nyb2xsVG87DQogICAgPC9zY3JpcHQ+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQogICAgICAgIHZhciBfX1NjcmlwdGFjdWxvdXNQcmVzZXJ2ZSA9IFtdOw0KICAgICAgICBfX1NjcmlwdGFjdWxvdXNQcmVzZXJ2ZVswXSA9IEFycmF5LmZyb207DQogICAgICAgIF9fU2NyaXB0YWN1bG91c1ByZXNlcnZlWzFdID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQ7DQogICAgICAgIF9fU2NyaXB0YWN1bG91c1ByZXNlcnZlWzJdID0gSFRNTEVsZW1lbnQucHJvdG90eXBlLnNjcm9sbFRvOw0KICAgIDwvc2NyaXB0Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vIHNjcmlwdC5hY3Vsby51cyBzY3JpcHRhY3Vsb3VzLmpzIHYxLjguMSwgVGh1IEphbiAwMyAyMjowNzoxMiAtMDUwMCAyMDA4DQoNCi8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IFRob21hcyBGdWNocyAoaHR0cDovL3NjcmlwdC5hY3Vsby51cywgaHR0cDovL21pci5hY3Vsby51cykNCi8vIA0KLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nDQovLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUNCi8vICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcNCi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwNCi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bw0KLy8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvDQovLyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQovLyANCi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlDQovLyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCi8vDQovLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwNCi8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRg0KLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQNCi8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUNCi8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04NCi8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTg0KLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQovLw0KLy8gRm9yIGRldGFpbHMsIHNlZSB0aGUgc2NyaXB0LmFjdWxvLnVzIHdlYiBzaXRlOiBodHRwOi8vc2NyaXB0LmFjdWxvLnVzLw0KDQp2YXIgU2NyaXB0YWN1bG91cyA9IHsNCiAgVmVyc2lvbjogJzEuOC4xJywNCiAgcmVxdWlyZTogZnVuY3Rpb24obGlicmFyeU5hbWUpIHsNCiAgICAvLyBpbnNlcnRpbmcgdmlhIERPTSBmYWlscyBpbiBTYWZhcmkgMi4wLCBzbyBicnV0ZSBmb3JjZSBhcHByb2FjaA0KICAgIGRvY3VtZW50LndyaXRlKCc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInK2xpYnJhcnlOYW1lKyciPjxcL3NjcmlwdD4nKTsNCiAgfSwNCiAgUkVRVUlSRURfUFJPVE9UWVBFOiAnMS42LjAnLA0KICBsb2FkOiBmdW5jdGlvbigpIHsNCiAgICBmdW5jdGlvbiBjb252ZXJ0VmVyc2lvblN0cmluZyh2ZXJzaW9uU3RyaW5nKXsNCiAgICAgIHZhciByID0gdmVyc2lvblN0cmluZy5zcGxpdCgnLicpOw0KICAgICAgcmV0dXJuIHBhcnNlSW50KHJbMF0pKjEwMDAwMCArIHBhcnNlSW50KHJbMV0pKjEwMDAgKyBwYXJzZUludChyWzJdKTsNCiAgICB9DQogDQogICAgaWYoKHR5cGVvZiBQcm90b3R5cGU9PSd1bmRlZmluZWQnKSB8fCANCiAgICAgICAodHlwZW9mIEVsZW1lbnQgPT0gJ3VuZGVmaW5lZCcpIHx8IA0KICAgICAgICh0eXBlb2YgRWxlbWVudC5NZXRob2RzPT0ndW5kZWZpbmVkJykgfHwNCiAgICAgICAoY29udmVydFZlcnNpb25TdHJpbmcoUHJvdG90eXBlLlZlcnNpb24pIDwgDQogICAgICAgIGNvbnZlcnRWZXJzaW9uU3RyaW5nKFNjcmlwdGFjdWxvdXMuUkVRVUlSRURfUFJPVE9UWVBFKSkpDQogICAgICAgdGhyb3coInNjcmlwdC5hY3Vsby51cyByZXF1aXJlcyB0aGUgUHJvdG90eXBlIEphdmFTY3JpcHQgZnJhbWV3b3JrID49ICIgKw0KICAgICAgICBTY3JpcHRhY3Vsb3VzLlJFUVVJUkVEX1BST1RPVFlQRSk7DQogICAgDQogICAgJEEoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpKS5maW5kQWxsKCBmdW5jdGlvbihzKSB7DQogICAgICByZXR1cm4gKHMuc3JjICYmIHMuc3JjLm1hdGNoKC9zY3JpcHRhY3Vsb3VzXC5qcyhcPy4qKT8kLykpDQogICAgfSkuZWFjaCggZnVuY3Rpb24ocykgew0KICAgICAgdmFyIHBhdGggPSBzLnNyYy5yZXBsYWNlKC9zY3JpcHRhY3Vsb3VzXC5qcyhcPy4qKT8kLywnJyk7DQogICAgICB2YXIgaW5jbHVkZXMgPSBzLnNyYy5tYXRjaCgvXD8uKmxvYWQ9KFthLXosXSopLyk7DQogICAgICAoaW5jbHVkZXMgPyBpbmNsdWRlc1sxXSA6ICdidWlsZGVyLGVmZmVjdHMsZHJhZ2Ryb3AsY29udHJvbHMsc2xpZGVyLHNvdW5kJykuc3BsaXQoJywnKS5lYWNoKA0KICAgICAgIGZ1bmN0aW9uKGluY2x1ZGUpIHsgU2NyaXB0YWN1bG91cy5yZXF1aXJlKHBhdGgraW5jbHVkZSsnLmpzP3N2ZXJzaW9uPTInKSB9KTsNCiAgICB9KTsNCiAgfQ0KfQ0KDQpTY3JpcHRhY3Vsb3VzLmxvYWQoKTsNCi8vIHNjcmlwdC5hY3Vsby51cyBlZmZlY3RzLmpzIHYxLjguMSwgVGh1IEphbiAwMyAyMjowNzoxMiAtMDUwMCAyMDA4DQoNCi8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IFRob21hcyBGdWNocyAoaHR0cDovL3NjcmlwdC5hY3Vsby51cywgaHR0cDovL21pci5hY3Vsby51cykNCi8vIENvbnRyaWJ1dG9yczoNCi8vICBKdXN0aW4gUGFsbWVyIChodHRwOi8vZW5jeXRlbWVkaWEuY29tLykNCi8vICBNYXJrIFBpbGdyaW0gKGh0dHA6Ly9kaXZlaW50b21hcmsub3JnLykNCi8vICBNYXJ0aW4gQmlhbGFzaW5raQ0KLy8gDQovLyBzY3JpcHQuYWN1bG8udXMgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIGFuIE1JVC1zdHlsZSBsaWNlbnNlLg0KLy8gRm9yIGRldGFpbHMsIHNlZSB0aGUgc2NyaXB0LmFjdWxvLnVzIHdlYiBzaXRlOiBodHRwOi8vc2NyaXB0LmFjdWxvLnVzLyANCg0KLy8gY29udmVydHMgcmdiKCkgYW5kICN4eHggdG8gI3h4eHh4eCBmb3JtYXQsICANCi8vIHJldHVybnMgc2VsZiAob3IgZmlyc3QgYXJndW1lbnQpIGlmIG5vdCBjb252ZXJ0YWJsZSAgDQpTdHJpbmcucHJvdG90eXBlLnBhcnNlQ29sb3IgPSBmdW5jdGlvbigpIHsgIA0KICB2YXIgY29sb3IgPSAnIyc7DQogIGlmICh0aGlzLnNsaWNlKDAsNCkgPT0gJ3JnYignKSB7ICANCiAgICB2YXIgY29scyA9IHRoaXMuc2xpY2UoNCx0aGlzLmxlbmd0aC0xKS5zcGxpdCgnLCcpOyAgDQogICAgdmFyIGk9MDsgZG8geyBjb2xvciArPSBwYXJzZUludChjb2xzW2ldKS50b0NvbG9yUGFydCgpIH0gd2hpbGUgKCsraTwzKTsgIA0KICB9IGVsc2UgeyAgDQogICAgaWYgKHRoaXMuc2xpY2UoMCwxKSA9PSAnIycpIHsgIA0KICAgICAgaWYgKHRoaXMubGVuZ3RoPT00KSBmb3IodmFyIGk9MTtpPDQ7aSsrKSBjb2xvciArPSAodGhpcy5jaGFyQXQoaSkgKyB0aGlzLmNoYXJBdChpKSkudG9Mb3dlckNhc2UoKTsgIA0KICAgICAgaWYgKHRoaXMubGVuZ3RoPT03KSBjb2xvciA9IHRoaXMudG9Mb3dlckNhc2UoKTsgIA0KICAgIH0gIA0KICB9ICANCiAgcmV0dXJuIChjb2xvci5sZW5ndGg9PTcgPyBjb2xvciA6IChhcmd1bWVudHNbMF0gfHwgdGhpcykpOyAgDQp9Ow0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KRWxlbWVudC5jb2xsZWN0VGV4dE5vZGVzID0gZnVuY3Rpb24oZWxlbWVudCkgeyAgDQogIHJldHVybiAkQSgkKGVsZW1lbnQpLmNoaWxkTm9kZXMpLmNvbGxlY3QoIGZ1bmN0aW9uKG5vZGUpIHsNCiAgICByZXR1cm4gKG5vZGUubm9kZVR5cGU9PTMgPyBub2RlLm5vZGVWYWx1ZSA6IA0KICAgICAgKG5vZGUuaGFzQ2hpbGROb2RlcygpID8gRWxlbWVudC5jb2xsZWN0VGV4dE5vZGVzKG5vZGUpIDogJycpKTsNCiAgfSkuZmxhdHRlbigpLmpvaW4oJycpOw0KfTsNCg0KRWxlbWVudC5jb2xsZWN0VGV4dE5vZGVzSWdub3JlQ2xhc3MgPSBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHsgIA0KICByZXR1cm4gJEEoJChlbGVtZW50KS5jaGlsZE5vZGVzKS5jb2xsZWN0KCBmdW5jdGlvbihub2RlKSB7DQogICAgcmV0dXJuIChub2RlLm5vZGVUeXBlPT0zID8gbm9kZS5ub2RlVmFsdWUgOiANCiAgICAgICgobm9kZS5oYXNDaGlsZE5vZGVzKCkgJiYgIUVsZW1lbnQuaGFzQ2xhc3NOYW1lKG5vZGUsY2xhc3NOYW1lKSkgPyANCiAgICAgICAgRWxlbWVudC5jb2xsZWN0VGV4dE5vZGVzSWdub3JlQ2xhc3Mobm9kZSwgY2xhc3NOYW1lKSA6ICcnKSk7DQogIH0pLmZsYXR0ZW4oKS5qb2luKCcnKTsNCn07DQoNCkVsZW1lbnQuc2V0Q29udGVudFpvb20gPSBmdW5jdGlvbihlbGVtZW50LCBwZXJjZW50KSB7DQogIGVsZW1lbnQgPSAkKGVsZW1lbnQpOyAgDQogIGVsZW1lbnQuc2V0U3R5bGUoe2ZvbnRTaXplOiAocGVyY2VudC8xMDApICsgJ2VtJ30pOyAgIA0KICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0KSB3aW5kb3cuc2Nyb2xsQnkoMCwwKTsNCiAgcmV0dXJuIGVsZW1lbnQ7DQp9Ow0KDQpFbGVtZW50LmdldElubGluZU9wYWNpdHkgPSBmdW5jdGlvbihlbGVtZW50KXsNCiAgcmV0dXJuICQoZWxlbWVudCkuc3R5bGUub3BhY2l0eSB8fCAnJzsNCn07DQoNCkVsZW1lbnQuZm9yY2VSZXJlbmRlcmluZyA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgdHJ5IHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICB2YXIgbiA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcgJyk7DQogICAgZWxlbWVudC5hcHBlbmRDaGlsZChuKTsNCiAgICBlbGVtZW50LnJlbW92ZUNoaWxkKG4pOw0KICB9IGNhdGNoKGUpIHsgfQ0KfTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnZhciBFZmZlY3QgPSB7DQogIF9lbGVtZW50RG9lc05vdEV4aXN0RXJyb3I6IHsNCiAgICBuYW1lOiAnRWxlbWVudERvZXNOb3RFeGlzdEVycm9yJywNCiAgICBtZXNzYWdlOiAnVGhlIHNwZWNpZmllZCBET00gZWxlbWVudCBkb2VzIG5vdCBleGlzdCwgYnV0IGlzIHJlcXVpcmVkIGZvciB0aGlzIGVmZmVjdCB0byBvcGVyYXRlJw0KICB9LA0KICBUcmFuc2l0aW9uczogew0KICAgIGxpbmVhcjogUHJvdG90eXBlLkssDQogICAgc2lub2lkYWw6IGZ1bmN0aW9uKHBvcykgew0KICAgICAgcmV0dXJuICgtTWF0aC5jb3MocG9zKk1hdGguUEkpLzIpICsgMC41Ow0KICAgIH0sDQogICAgcmV2ZXJzZTogZnVuY3Rpb24ocG9zKSB7DQogICAgICByZXR1cm4gMS1wb3M7DQogICAgfSwNCiAgICBmbGlja2VyOiBmdW5jdGlvbihwb3MpIHsNCiAgICAgIHZhciBwb3MgPSAoKC1NYXRoLmNvcyhwb3MqTWF0aC5QSSkvNCkgKyAwLjc1KSArIE1hdGgucmFuZG9tKCkvNDsNCiAgICAgIHJldHVybiBwb3MgPiAxID8gMSA6IHBvczsNCiAgICB9LA0KICAgIHdvYmJsZTogZnVuY3Rpb24ocG9zKSB7DQogICAgICByZXR1cm4gKC1NYXRoLmNvcyhwb3MqTWF0aC5QSSooOSpwb3MpKS8yKSArIDAuNTsNCiAgICB9LA0KICAgIHB1bHNlOiBmdW5jdGlvbihwb3MsIHB1bHNlcykgeyANCiAgICAgIHB1bHNlcyA9IHB1bHNlcyB8fCA1OyANCiAgICAgIHJldHVybiAoDQogICAgICAgICgocG9zICUgKDEvcHVsc2VzKSkgKiBwdWxzZXMpLnJvdW5kKCkgPT0gMCA/IA0KICAgICAgICAgICAgICAoKHBvcyAqIHB1bHNlcyAqIDIpIC0gKHBvcyAqIHB1bHNlcyAqIDIpLmZsb29yKCkpIDogDQogICAgICAgICAgMSAtICgocG9zICogcHVsc2VzICogMikgLSAocG9zICogcHVsc2VzICogMikuZmxvb3IoKSkNCiAgICAgICAgKTsNCiAgICB9LA0KICAgIHNwcmluZzogZnVuY3Rpb24ocG9zKSB7IA0KICAgICAgcmV0dXJuIDEgLSAoTWF0aC5jb3MocG9zICogNC41ICogTWF0aC5QSSkgKiBNYXRoLmV4cCgtcG9zICogNikpOyANCiAgICB9LA0KICAgIG5vbmU6IGZ1bmN0aW9uKHBvcykgew0KICAgICAgcmV0dXJuIDA7DQogICAgfSwNCiAgICBmdWxsOiBmdW5jdGlvbihwb3MpIHsNCiAgICAgIHJldHVybiAxOw0KICAgIH0NCiAgfSwNCiAgRGVmYXVsdE9wdGlvbnM6IHsNCiAgICBkdXJhdGlvbjogICAxLjAsICAgLy8gc2Vjb25kcw0KICAgIGZwczogICAgICAgIDEwMCwgICAvLyAxMDA9IGFzc3VtZSA2NmZwcyBtYXguDQogICAgc3luYzogICAgICAgZmFsc2UsIC8vIHRydWUgZm9yIGNvbWJpbmluZw0KICAgIGZyb206ICAgICAgIDAuMCwNCiAgICB0bzogICAgICAgICAxLjAsDQogICAgZGVsYXk6ICAgICAgMC4wLA0KICAgIHF1ZXVlOiAgICAgICdwYXJhbGxlbCcNCiAgfSwNCiAgdGFnaWZ5VGV4dDogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIHZhciB0YWdpZnlTdHlsZSA9ICdwb3NpdGlvbjpyZWxhdGl2ZSc7DQogICAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFKSB0YWdpZnlTdHlsZSArPSAnO3pvb206MSc7DQogICAgDQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgJEEoZWxlbWVudC5jaGlsZE5vZGVzKS5lYWNoKCBmdW5jdGlvbihjaGlsZCkgew0KICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlPT0zKSB7DQogICAgICAgIGNoaWxkLm5vZGVWYWx1ZS50b0FycmF5KCkuZWFjaCggZnVuY3Rpb24oY2hhcmFjdGVyKSB7DQogICAgICAgICAgZWxlbWVudC5pbnNlcnRCZWZvcmUoDQogICAgICAgICAgICBuZXcgRWxlbWVudCgnc3BhbicsIHtzdHlsZTogdGFnaWZ5U3R5bGV9KS51cGRhdGUoDQogICAgICAgICAgICAgIGNoYXJhY3RlciA9PSAnICcgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkgOiBjaGFyYWN0ZXIpLCANCiAgICAgICAgICAgICAgY2hpbGQpOw0KICAgICAgICB9KTsNCiAgICAgICAgRWxlbWVudC5yZW1vdmUoY2hpbGQpOw0KICAgICAgfQ0KICAgIH0pOw0KICB9LA0KICBtdWx0aXBsZTogZnVuY3Rpb24oZWxlbWVudCwgZWZmZWN0KSB7DQogICAgdmFyIGVsZW1lbnRzOw0KICAgIGlmICgoKHR5cGVvZiBlbGVtZW50ID09ICdvYmplY3QnKSB8fCANCiAgICAgICAgT2JqZWN0LmlzRnVuY3Rpb24oZWxlbWVudCkpICYmIA0KICAgICAgIChlbGVtZW50Lmxlbmd0aCkpDQogICAgICBlbGVtZW50cyA9IGVsZW1lbnQ7DQogICAgZWxzZQ0KICAgICAgZWxlbWVudHMgPSAkKGVsZW1lbnQpLmNoaWxkTm9kZXM7DQogICAgICANCiAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoew0KICAgICAgc3BlZWQ6IDAuMSwNCiAgICAgIGRlbGF5OiAwLjANCiAgICB9LCBhcmd1bWVudHNbMl0gfHwgeyB9KTsNCiAgICB2YXIgbWFzdGVyRGVsYXkgPSBvcHRpb25zLmRlbGF5Ow0KDQogICAgJEEoZWxlbWVudHMpLmVhY2goIGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4KSB7DQogICAgICBuZXcgZWZmZWN0KGVsZW1lbnQsIE9iamVjdC5leHRlbmQob3B0aW9ucywgeyBkZWxheTogaW5kZXggKiBvcHRpb25zLnNwZWVkICsgbWFzdGVyRGVsYXkgfSkpOw0KICAgIH0pOw0KICB9LA0KICBQQUlSUzogew0KICAgICdzbGlkZSc6ICBbJ1NsaWRlRG93bicsJ1NsaWRlVXAnXSwNCiAgICAnYmxpbmQnOiAgWydCbGluZERvd24nLCdCbGluZFVwJ10sDQogICAgJ2FwcGVhcic6IFsnQXBwZWFyJywnRmFkZSddDQogIH0sDQogIHRvZ2dsZTogZnVuY3Rpb24oZWxlbWVudCwgZWZmZWN0KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgZWZmZWN0ID0gKGVmZmVjdCB8fCAnYXBwZWFyJykudG9Mb3dlckNhc2UoKTsNCiAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoew0KICAgICAgcXVldWU6IHsgcG9zaXRpb246J2VuZCcsIHNjb3BlOihlbGVtZW50LmlkIHx8ICdnbG9iYWwnKSwgbGltaXQ6IDEgfQ0KICAgIH0sIGFyZ3VtZW50c1syXSB8fCB7IH0pOw0KICAgIEVmZmVjdFtlbGVtZW50LnZpc2libGUoKSA/IA0KICAgICAgRWZmZWN0LlBBSVJTW2VmZmVjdF1bMV0gOiBFZmZlY3QuUEFJUlNbZWZmZWN0XVswXV0oZWxlbWVudCwgb3B0aW9ucyk7DQogIH0NCn07DQoNCkVmZmVjdC5EZWZhdWx0T3B0aW9ucy50cmFuc2l0aW9uID0gRWZmZWN0LlRyYW5zaXRpb25zLnNpbm9pZGFsOw0KDQovKiAtLS0tLS0tLS0tLS0tIGNvcmUgZWZmZWN0cyAtLS0tLS0tLS0tLS0tICovDQoNCkVmZmVjdC5TY29wZWRRdWV1ZSA9IENsYXNzLmNyZWF0ZShFbnVtZXJhYmxlLCB7DQogIGluaXRpYWxpemU6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuZWZmZWN0cyAgPSBbXTsNCiAgICB0aGlzLmludGVydmFsID0gbnVsbDsgICAgDQogIH0sDQogIF9lYWNoOiBmdW5jdGlvbihpdGVyYXRvcikgew0KICAgIHRoaXMuZWZmZWN0cy5fZWFjaChpdGVyYXRvcik7DQogIH0sDQogIGFkZDogZnVuY3Rpb24oZWZmZWN0KSB7DQogICAgdmFyIHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOw0KICAgIA0KICAgIHZhciBwb3NpdGlvbiA9IE9iamVjdC5pc1N0cmluZyhlZmZlY3Qub3B0aW9ucy5xdWV1ZSkgPyANCiAgICAgIGVmZmVjdC5vcHRpb25zLnF1ZXVlIDogZWZmZWN0Lm9wdGlvbnMucXVldWUucG9zaXRpb247DQogICAgDQogICAgc3dpdGNoKHBvc2l0aW9uKSB7DQogICAgICBjYXNlICdmcm9udCc6DQogICAgICAgIC8vIG1vdmUgdW5zdGFydGVkIGVmZmVjdHMgYWZ0ZXIgdGhpcyBlZmZlY3QgIA0KICAgICAgICB0aGlzLmVmZmVjdHMuZmluZEFsbChmdW5jdGlvbihlKXsgcmV0dXJuIGUuc3RhdGU9PSdpZGxlJyB9KS5lYWNoKCBmdW5jdGlvbihlKSB7DQogICAgICAgICAgICBlLnN0YXJ0T24gICs9IGVmZmVjdC5maW5pc2hPbjsNCiAgICAgICAgICAgIGUuZmluaXNoT24gKz0gZWZmZWN0LmZpbmlzaE9uOw0KICAgICAgICAgIH0pOw0KICAgICAgICBicmVhazsNCiAgICAgIGNhc2UgJ3dpdGgtbGFzdCc6DQogICAgICAgIHRpbWVzdGFtcCA9IHRoaXMuZWZmZWN0cy5wbHVjaygnc3RhcnRPbicpLm1heCgpIHx8IHRpbWVzdGFtcDsNCiAgICAgICAgYnJlYWs7DQogICAgICBjYXNlICdlbmQnOg0KICAgICAgICAvLyBzdGFydCBlZmZlY3QgYWZ0ZXIgbGFzdCBxdWV1ZWQgZWZmZWN0IGhhcyBmaW5pc2hlZA0KICAgICAgICB0aW1lc3RhbXAgPSB0aGlzLmVmZmVjdHMucGx1Y2soJ2ZpbmlzaE9uJykubWF4KCkgfHwgdGltZXN0YW1wOw0KICAgICAgICBicmVhazsNCiAgICB9DQogICAgDQogICAgZWZmZWN0LnN0YXJ0T24gICs9IHRpbWVzdGFtcDsNCiAgICBlZmZlY3QuZmluaXNoT24gKz0gdGltZXN0YW1wOw0KDQogICAgaWYgKCFlZmZlY3Qub3B0aW9ucy5xdWV1ZS5saW1pdCB8fCAodGhpcy5lZmZlY3RzLmxlbmd0aCA8IGVmZmVjdC5vcHRpb25zLnF1ZXVlLmxpbWl0KSkNCiAgICAgIHRoaXMuZWZmZWN0cy5wdXNoKGVmZmVjdCk7DQogICAgDQogICAgaWYgKCF0aGlzLmludGVydmFsKQ0KICAgICAgdGhpcy5pbnRlcnZhbCA9IHNldEludGVydmFsKHRoaXMubG9vcC5iaW5kKHRoaXMpLCAxNSk7DQogIH0sDQogIHJlbW92ZTogZnVuY3Rpb24oZWZmZWN0KSB7DQogICAgdGhpcy5lZmZlY3RzID0gdGhpcy5lZmZlY3RzLnJlamVjdChmdW5jdGlvbihlKSB7IHJldHVybiBlPT1lZmZlY3QgfSk7DQogICAgaWYgKHRoaXMuZWZmZWN0cy5sZW5ndGggPT0gMCkgew0KICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTsNCiAgICAgIHRoaXMuaW50ZXJ2YWwgPSBudWxsOw0KICAgIH0NCiAgfSwNCiAgbG9vcDogZnVuY3Rpb24oKSB7DQogICAgdmFyIHRpbWVQb3MgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsNCiAgICBmb3IodmFyIGk9MCwgbGVuPXRoaXMuZWZmZWN0cy5sZW5ndGg7aTxsZW47aSsrKSANCiAgICAgIHRoaXMuZWZmZWN0c1tpXSAmJiB0aGlzLmVmZmVjdHNbaV0ubG9vcCh0aW1lUG9zKTsNCiAgfQ0KfSk7DQoNCkVmZmVjdC5RdWV1ZXMgPSB7DQogIGluc3RhbmNlczogJEgoKSwNCiAgZ2V0OiBmdW5jdGlvbihxdWV1ZU5hbWUpIHsNCiAgICBpZiAoIU9iamVjdC5pc1N0cmluZyhxdWV1ZU5hbWUpKSByZXR1cm4gcXVldWVOYW1lOw0KICAgIA0KICAgIHJldHVybiB0aGlzLmluc3RhbmNlcy5nZXQocXVldWVOYW1lKSB8fA0KICAgICAgdGhpcy5pbnN0YW5jZXMuc2V0KHF1ZXVlTmFtZSwgbmV3IEVmZmVjdC5TY29wZWRRdWV1ZSgpKTsNCiAgfQ0KfTsNCkVmZmVjdC5RdWV1ZSA9IEVmZmVjdC5RdWV1ZXMuZ2V0KCdnbG9iYWwnKTsNCg0KRWZmZWN0LkJhc2UgPSBDbGFzcy5jcmVhdGUoew0KICBwb3NpdGlvbjogbnVsbCwNCiAgc3RhcnQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHsNCiAgICBmdW5jdGlvbiBjb2RlRm9yRXZlbnQob3B0aW9ucyxldmVudE5hbWUpew0KICAgICAgcmV0dXJuICgNCiAgICAgICAgKG9wdGlvbnNbZXZlbnROYW1lKydJbnRlcm5hbCddID8gJ3RoaXMub3B0aW9ucy4nK2V2ZW50TmFtZSsnSW50ZXJuYWwodGhpcyk7JyA6ICcnKSArDQogICAgICAgIChvcHRpb25zW2V2ZW50TmFtZV0gPyAndGhpcy5vcHRpb25zLicrZXZlbnROYW1lKycodGhpcyk7JyA6ICcnKQ0KICAgICAgKTsNCiAgICB9DQogICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2l0aW9uID09PSBmYWxzZSkgb3B0aW9ucy50cmFuc2l0aW9uID0gRWZmZWN0LlRyYW5zaXRpb25zLmxpbmVhcjsNCiAgICB0aGlzLm9wdGlvbnMgICAgICA9IE9iamVjdC5leHRlbmQoT2JqZWN0LmV4dGVuZCh7IH0sRWZmZWN0LkRlZmF1bHRPcHRpb25zKSwgb3B0aW9ucyB8fCB7IH0pOw0KICAgIHRoaXMuY3VycmVudEZyYW1lID0gMDsNCiAgICB0aGlzLnN0YXRlICAgICAgICA9ICdpZGxlJzsNCiAgICB0aGlzLnN0YXJ0T24gICAgICA9IHRoaXMub3B0aW9ucy5kZWxheSoxMDAwOw0KICAgIHRoaXMuZmluaXNoT24gICAgID0gdGhpcy5zdGFydE9uKyh0aGlzLm9wdGlvbnMuZHVyYXRpb24qMTAwMCk7DQogICAgdGhpcy5mcm9tVG9EZWx0YSAgPSB0aGlzLm9wdGlvbnMudG8tdGhpcy5vcHRpb25zLmZyb207DQogICAgdGhpcy50b3RhbFRpbWUgICAgPSB0aGlzLmZpbmlzaE9uLXRoaXMuc3RhcnRPbjsNCiAgICB0aGlzLnRvdGFsRnJhbWVzICA9IHRoaXMub3B0aW9ucy5mcHMqdGhpcy5vcHRpb25zLmR1cmF0aW9uOw0KICAgIA0KICAgIGV2YWwoJ3RoaXMucmVuZGVyID0gZnVuY3Rpb24ocG9zKXsgJysNCiAgICAgICdpZiAodGhpcy5zdGF0ZT09ImlkbGUiKXt0aGlzLnN0YXRlPSJydW5uaW5nIjsnKw0KICAgICAgY29kZUZvckV2ZW50KHRoaXMub3B0aW9ucywnYmVmb3JlU2V0dXAnKSsNCiAgICAgICh0aGlzLnNldHVwID8gJ3RoaXMuc2V0dXAoKTsnOicnKSsgDQogICAgICBjb2RlRm9yRXZlbnQodGhpcy5vcHRpb25zLCdhZnRlclNldHVwJykrDQogICAgICAnfTtpZiAodGhpcy5zdGF0ZT09InJ1bm5pbmciKXsnKw0KICAgICAgJ3Bvcz10aGlzLm9wdGlvbnMudHJhbnNpdGlvbihwb3MpKicrdGhpcy5mcm9tVG9EZWx0YSsnKycrdGhpcy5vcHRpb25zLmZyb20rJzsnKw0KICAgICAgJ3RoaXMucG9zaXRpb249cG9zOycrDQogICAgICBjb2RlRm9yRXZlbnQodGhpcy5vcHRpb25zLCdiZWZvcmVVcGRhdGUnKSsNCiAgICAgICh0aGlzLnVwZGF0ZSA/ICd0aGlzLnVwZGF0ZShwb3MpOyc6JycpKw0KICAgICAgY29kZUZvckV2ZW50KHRoaXMub3B0aW9ucywnYWZ0ZXJVcGRhdGUnKSsNCiAgICAgICd9fScpOw0KICAgIA0KICAgIHRoaXMuZXZlbnQoJ2JlZm9yZVN0YXJ0Jyk7DQogICAgaWYgKCF0aGlzLm9wdGlvbnMuc3luYykNCiAgICAgIEVmZmVjdC5RdWV1ZXMuZ2V0KE9iamVjdC5pc1N0cmluZyh0aGlzLm9wdGlvbnMucXVldWUpID8gDQogICAgICAgICdnbG9iYWwnIDogdGhpcy5vcHRpb25zLnF1ZXVlLnNjb3BlKS5hZGQodGhpcyk7DQogIH0sDQogIGxvb3A6IGZ1bmN0aW9uKHRpbWVQb3MpIHsNCiAgICBpZiAodGltZVBvcyA+PSB0aGlzLnN0YXJ0T24pIHsNCiAgICAgIGlmICh0aW1lUG9zID49IHRoaXMuZmluaXNoT24pIHsNCiAgICAgICAgdGhpcy5yZW5kZXIoMS4wKTsNCiAgICAgICAgdGhpcy5jYW5jZWwoKTsNCiAgICAgICAgdGhpcy5ldmVudCgnYmVmb3JlRmluaXNoJyk7DQogICAgICAgIGlmICh0aGlzLmZpbmlzaCkgdGhpcy5maW5pc2goKTsgDQogICAgICAgIHRoaXMuZXZlbnQoJ2FmdGVyRmluaXNoJyk7DQogICAgICAgIHJldHVybjsgIA0KICAgICAgfQ0KICAgICAgdmFyIHBvcyAgID0gKHRpbWVQb3MgLSB0aGlzLnN0YXJ0T24pIC8gdGhpcy50b3RhbFRpbWUsDQogICAgICAgICAgZnJhbWUgPSAocG9zICogdGhpcy50b3RhbEZyYW1lcykucm91bmQoKTsNCiAgICAgIGlmIChmcmFtZSA+IHRoaXMuY3VycmVudEZyYW1lKSB7DQogICAgICAgIHRoaXMucmVuZGVyKHBvcyk7DQogICAgICAgIHRoaXMuY3VycmVudEZyYW1lID0gZnJhbWU7DQogICAgICB9DQogICAgfQ0KICB9LA0KICBjYW5jZWw6IGZ1bmN0aW9uKCkgew0KICAgIGlmICghdGhpcy5vcHRpb25zLnN5bmMpDQogICAgICBFZmZlY3QuUXVldWVzLmdldChPYmplY3QuaXNTdHJpbmcodGhpcy5vcHRpb25zLnF1ZXVlKSA/IA0KICAgICAgICAnZ2xvYmFsJyA6IHRoaXMub3B0aW9ucy5xdWV1ZS5zY29wZSkucmVtb3ZlKHRoaXMpOw0KICAgIHRoaXMuc3RhdGUgPSAnZmluaXNoZWQnOw0KICB9LA0KICBldmVudDogZnVuY3Rpb24oZXZlbnROYW1lKSB7DQogICAgaWYgKHRoaXMub3B0aW9uc1tldmVudE5hbWUgKyAnSW50ZXJuYWwnXSkgdGhpcy5vcHRpb25zW2V2ZW50TmFtZSArICdJbnRlcm5hbCddKHRoaXMpOw0KICAgIGlmICh0aGlzLm9wdGlvbnNbZXZlbnROYW1lXSkgdGhpcy5vcHRpb25zW2V2ZW50TmFtZV0odGhpcyk7DQogIH0sDQogIGluc3BlY3Q6IGZ1bmN0aW9uKCkgew0KICAgIHZhciBkYXRhID0gJEgoKTsNCiAgICBmb3IocHJvcGVydHkgaW4gdGhpcykNCiAgICAgIGlmICghT2JqZWN0LmlzRnVuY3Rpb24odGhpc1twcm9wZXJ0eV0pKSBkYXRhLnNldChwcm9wZXJ0eSwgdGhpc1twcm9wZXJ0eV0pOw0KICAgIHJldHVybiAnIzxFZmZlY3Q6JyArIGRhdGEuaW5zcGVjdCgpICsgJyxvcHRpb25zOicgKyAkSCh0aGlzLm9wdGlvbnMpLmluc3BlY3QoKSArICc+JzsNCiAgfQ0KfSk7DQoNCkVmZmVjdC5QYXJhbGxlbCA9IENsYXNzLmNyZWF0ZShFZmZlY3QuQmFzZSwgew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihlZmZlY3RzKSB7DQogICAgdGhpcy5lZmZlY3RzID0gZWZmZWN0cyB8fCBbXTsNCiAgICB0aGlzLnN0YXJ0KGFyZ3VtZW50c1sxXSk7DQogIH0sDQogIHVwZGF0ZTogZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICB0aGlzLmVmZmVjdHMuaW52b2tlKCdyZW5kZXInLCBwb3NpdGlvbik7DQogIH0sDQogIGZpbmlzaDogZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICB0aGlzLmVmZmVjdHMuZWFjaCggZnVuY3Rpb24oZWZmZWN0KSB7DQogICAgICBlZmZlY3QucmVuZGVyKDEuMCk7DQogICAgICBlZmZlY3QuY2FuY2VsKCk7DQogICAgICBlZmZlY3QuZXZlbnQoJ2JlZm9yZUZpbmlzaCcpOw0KICAgICAgaWYgKGVmZmVjdC5maW5pc2gpIGVmZmVjdC5maW5pc2gocG9zaXRpb24pOw0KICAgICAgZWZmZWN0LmV2ZW50KCdhZnRlckZpbmlzaCcpOw0KICAgIH0pOw0KICB9DQp9KTsNCg0KRWZmZWN0LlR3ZWVuID0gQ2xhc3MuY3JlYXRlKEVmZmVjdC5CYXNlLCB7DQogIGluaXRpYWxpemU6IGZ1bmN0aW9uKG9iamVjdCwgZnJvbSwgdG8pIHsNCiAgICBvYmplY3QgPSBPYmplY3QuaXNTdHJpbmcob2JqZWN0KSA/ICQob2JqZWN0KSA6IG9iamVjdDsNCiAgICB2YXIgYXJncyA9ICRBKGFyZ3VtZW50cyksIG1ldGhvZCA9IGFyZ3MubGFzdCgpLCANCiAgICAgIG9wdGlvbnMgPSBhcmdzLmxlbmd0aCA9PSA1ID8gYXJnc1szXSA6IG51bGw7DQogICAgdGhpcy5tZXRob2QgPSBPYmplY3QuaXNGdW5jdGlvbihtZXRob2QpID8gbWV0aG9kLmJpbmQob2JqZWN0KSA6DQogICAgICBPYmplY3QuaXNGdW5jdGlvbihvYmplY3RbbWV0aG9kXSkgPyBvYmplY3RbbWV0aG9kXS5iaW5kKG9iamVjdCkgOiANCiAgICAgIGZ1bmN0aW9uKHZhbHVlKSB7IG9iamVjdFttZXRob2RdID0gdmFsdWUgfTsNCiAgICB0aGlzLnN0YXJ0KE9iamVjdC5leHRlbmQoeyBmcm9tOiBmcm9tLCB0bzogdG8gfSwgb3B0aW9ucyB8fCB7IH0pKTsNCiAgfSwNCiAgdXBkYXRlOiBmdW5jdGlvbihwb3NpdGlvbikgew0KICAgIHRoaXMubWV0aG9kKHBvc2l0aW9uKTsNCiAgfQ0KfSk7DQoNCkVmZmVjdC5FdmVudCA9IENsYXNzLmNyZWF0ZShFZmZlY3QuQmFzZSwgew0KICBpbml0aWFsaXplOiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLnN0YXJ0KE9iamVjdC5leHRlbmQoeyBkdXJhdGlvbjogMCB9LCBhcmd1bWVudHNbMF0gfHwgeyB9KSk7DQogIH0sDQogIHVwZGF0ZTogUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24NCn0pOw0KDQpFZmZlY3QuT3BhY2l0eSA9IENsYXNzLmNyZWF0ZShFZmZlY3QuQmFzZSwgew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICBpZiAoIXRoaXMuZWxlbWVudCkgdGhyb3coRWZmZWN0Ll9lbGVtZW50RG9lc05vdEV4aXN0RXJyb3IpOw0KICAgIC8vIG1ha2UgdGhpcyB3b3JrIG9uIElFIG9uIGVsZW1lbnRzIHdpdGhvdXQgJ2xheW91dCcNCiAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUgJiYgKCF0aGlzLmVsZW1lbnQuY3VycmVudFN0eWxlLmhhc0xheW91dCkpDQogICAgICB0aGlzLmVsZW1lbnQuc2V0U3R5bGUoe3pvb206IDF9KTsNCiAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoew0KICAgICAgZnJvbTogdGhpcy5lbGVtZW50LmdldE9wYWNpdHkoKSB8fCAwLjAsDQogICAgICB0bzogICAxLjANCiAgICB9LCBhcmd1bWVudHNbMV0gfHwgeyB9KTsNCiAgICB0aGlzLnN0YXJ0KG9wdGlvbnMpOw0KICB9LA0KICB1cGRhdGU6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7DQogICAgdGhpcy5lbGVtZW50LnNldE9wYWNpdHkocG9zaXRpb24pOw0KICB9DQp9KTsNCg0KRWZmZWN0Lk1vdmUgPSBDbGFzcy5jcmVhdGUoRWZmZWN0LkJhc2UsIHsNCiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgaWYgKCF0aGlzLmVsZW1lbnQpIHRocm93KEVmZmVjdC5fZWxlbWVudERvZXNOb3RFeGlzdEVycm9yKTsNCiAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoew0KICAgICAgeDogICAgMCwNCiAgICAgIHk6ICAgIDAsDQogICAgICBtb2RlOiAncmVsYXRpdmUnDQogICAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSk7DQogICAgdGhpcy5zdGFydChvcHRpb25zKTsNCiAgfSwNCiAgc2V0dXA6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuZWxlbWVudC5tYWtlUG9zaXRpb25lZCgpOw0KICAgIHRoaXMub3JpZ2luYWxMZWZ0ID0gcGFyc2VGbG9hdCh0aGlzLmVsZW1lbnQuZ2V0U3R5bGUoJ2xlZnQnKSB8fCAnMCcpOw0KICAgIHRoaXMub3JpZ2luYWxUb3AgID0gcGFyc2VGbG9hdCh0aGlzLmVsZW1lbnQuZ2V0U3R5bGUoJ3RvcCcpICB8fCAnMCcpOw0KICAgIGlmICh0aGlzLm9wdGlvbnMubW9kZSA9PSAnYWJzb2x1dGUnKSB7DQogICAgICB0aGlzLm9wdGlvbnMueCA9IHRoaXMub3B0aW9ucy54IC0gdGhpcy5vcmlnaW5hbExlZnQ7DQogICAgICB0aGlzLm9wdGlvbnMueSA9IHRoaXMub3B0aW9ucy55IC0gdGhpcy5vcmlnaW5hbFRvcDsNCiAgICB9DQogIH0sDQogIHVwZGF0ZTogZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICB0aGlzLmVsZW1lbnQuc2V0U3R5bGUoew0KICAgICAgbGVmdDogKHRoaXMub3B0aW9ucy54ICAqIHBvc2l0aW9uICsgdGhpcy5vcmlnaW5hbExlZnQpLnJvdW5kKCkgKyAncHgnLA0KICAgICAgdG9wOiAgKHRoaXMub3B0aW9ucy55ICAqIHBvc2l0aW9uICsgdGhpcy5vcmlnaW5hbFRvcCkucm91bmQoKSAgKyAncHgnDQogICAgfSk7DQogIH0NCn0pOw0KDQovLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkNCkVmZmVjdC5Nb3ZlQnkgPSBmdW5jdGlvbihlbGVtZW50LCB0b1RvcCwgdG9MZWZ0KSB7DQogIHJldHVybiBuZXcgRWZmZWN0Lk1vdmUoZWxlbWVudCwgDQogICAgT2JqZWN0LmV4dGVuZCh7IHg6IHRvTGVmdCwgeTogdG9Ub3AgfSwgYXJndW1lbnRzWzNdIHx8IHsgfSkpOw0KfTsNCg0KRWZmZWN0LlNjYWxlID0gQ2xhc3MuY3JlYXRlKEVmZmVjdC5CYXNlLCB7DQogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQsIHBlcmNlbnQpIHsNCiAgICB0aGlzLmVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIGlmICghdGhpcy5lbGVtZW50KSB0aHJvdyhFZmZlY3QuX2VsZW1lbnREb2VzTm90RXhpc3RFcnJvcik7DQogICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsNCiAgICAgIHNjYWxlWDogdHJ1ZSwNCiAgICAgIHNjYWxlWTogdHJ1ZSwNCiAgICAgIHNjYWxlQ29udGVudDogdHJ1ZSwNCiAgICAgIHNjYWxlRnJvbUNlbnRlcjogZmFsc2UsDQogICAgICBzY2FsZU1vZGU6ICdib3gnLCAgICAgICAgLy8gJ2JveCcgb3IgJ2NvbnRlbnRzJyBvciB7IH0gd2l0aCBwcm92aWRlZCB2YWx1ZXMNCiAgICAgIHNjYWxlRnJvbTogMTAwLjAsDQogICAgICBzY2FsZVRvOiAgIHBlcmNlbnQNCiAgICB9LCBhcmd1bWVudHNbMl0gfHwgeyB9KTsNCiAgICB0aGlzLnN0YXJ0KG9wdGlvbnMpOw0KICB9LA0KICBzZXR1cDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5yZXN0b3JlQWZ0ZXJGaW5pc2ggPSB0aGlzLm9wdGlvbnMucmVzdG9yZUFmdGVyRmluaXNoIHx8IGZhbHNlOw0KICAgIHRoaXMuZWxlbWVudFBvc2l0aW9uaW5nID0gdGhpcy5lbGVtZW50LmdldFN0eWxlKCdwb3NpdGlvbicpOw0KICAgIA0KICAgIHRoaXMub3JpZ2luYWxTdHlsZSA9IHsgfTsNCiAgICBbJ3RvcCcsJ2xlZnQnLCd3aWR0aCcsJ2hlaWdodCcsJ2ZvbnRTaXplJ10uZWFjaCggZnVuY3Rpb24oaykgew0KICAgICAgdGhpcy5vcmlnaW5hbFN0eWxlW2tdID0gdGhpcy5lbGVtZW50LnN0eWxlW2tdOw0KICAgIH0uYmluZCh0aGlzKSk7DQogICAgICANCiAgICB0aGlzLm9yaWdpbmFsVG9wICA9IHRoaXMuZWxlbWVudC5vZmZzZXRUb3A7DQogICAgdGhpcy5vcmlnaW5hbExlZnQgPSB0aGlzLmVsZW1lbnQub2Zmc2V0TGVmdDsNCiAgICANCiAgICB2YXIgZm9udFNpemUgPSB0aGlzLmVsZW1lbnQuZ2V0U3R5bGUoJ2ZvbnQtc2l6ZScpIHx8ICcxMDAlJzsNCiAgICBbJ2VtJywncHgnLCclJywncHQnXS5lYWNoKCBmdW5jdGlvbihmb250U2l6ZVR5cGUpIHsNCiAgICAgIGlmIChmb250U2l6ZS5pbmRleE9mKGZvbnRTaXplVHlwZSk+MCkgew0KICAgICAgICB0aGlzLmZvbnRTaXplICAgICA9IHBhcnNlRmxvYXQoZm9udFNpemUpOw0KICAgICAgICB0aGlzLmZvbnRTaXplVHlwZSA9IGZvbnRTaXplVHlwZTsNCiAgICAgIH0NCiAgICB9LmJpbmQodGhpcykpOw0KICAgIA0KICAgIHRoaXMuZmFjdG9yID0gKHRoaXMub3B0aW9ucy5zY2FsZVRvIC0gdGhpcy5vcHRpb25zLnNjYWxlRnJvbSkvMTAwOw0KICAgIA0KICAgIHRoaXMuZGltcyA9IG51bGw7DQogICAgaWYgKHRoaXMub3B0aW9ucy5zY2FsZU1vZGU9PSdib3gnKQ0KICAgICAgdGhpcy5kaW1zID0gW3RoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQsIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aF07DQogICAgaWYgKC9eY29udGVudC8udGVzdCh0aGlzLm9wdGlvbnMuc2NhbGVNb2RlKSkNCiAgICAgIHRoaXMuZGltcyA9IFt0aGlzLmVsZW1lbnQuc2Nyb2xsSGVpZ2h0LCB0aGlzLmVsZW1lbnQuc2Nyb2xsV2lkdGhdOw0KICAgIGlmICghdGhpcy5kaW1zKQ0KICAgICAgdGhpcy5kaW1zID0gW3RoaXMub3B0aW9ucy5zY2FsZU1vZGUub3JpZ2luYWxIZWlnaHQsDQogICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNjYWxlTW9kZS5vcmlnaW5hbFdpZHRoXTsNCiAgfSwNCiAgdXBkYXRlOiBmdW5jdGlvbihwb3NpdGlvbikgew0KICAgIHZhciBjdXJyZW50U2NhbGUgPSAodGhpcy5vcHRpb25zLnNjYWxlRnJvbS8xMDAuMCkgKyAodGhpcy5mYWN0b3IgKiBwb3NpdGlvbik7DQogICAgaWYgKHRoaXMub3B0aW9ucy5zY2FsZUNvbnRlbnQgJiYgdGhpcy5mb250U2l6ZSkNCiAgICAgIHRoaXMuZWxlbWVudC5zZXRTdHlsZSh7Zm9udFNpemU6IHRoaXMuZm9udFNpemUgKiBjdXJyZW50U2NhbGUgKyB0aGlzLmZvbnRTaXplVHlwZSB9KTsNCiAgICB0aGlzLnNldERpbWVuc2lvbnModGhpcy5kaW1zWzBdICogY3VycmVudFNjYWxlLCB0aGlzLmRpbXNbMV0gKiBjdXJyZW50U2NhbGUpOw0KICB9LA0KICBmaW5pc2g6IGZ1bmN0aW9uKHBvc2l0aW9uKSB7DQogICAgaWYgKHRoaXMucmVzdG9yZUFmdGVyRmluaXNoKSB0aGlzLmVsZW1lbnQuc2V0U3R5bGUodGhpcy5vcmlnaW5hbFN0eWxlKTsNCiAgfSwNCiAgc2V0RGltZW5zaW9uczogZnVuY3Rpb24oaGVpZ2h0LCB3aWR0aCkgew0KICAgIHZhciBkID0geyB9Ow0KICAgIGlmICh0aGlzLm9wdGlvbnMuc2NhbGVYKSBkLndpZHRoID0gd2lkdGgucm91bmQoKSArICdweCc7DQogICAgaWYgKHRoaXMub3B0aW9ucy5zY2FsZVkpIGQuaGVpZ2h0ID0gaGVpZ2h0LnJvdW5kKCkgKyAncHgnOw0KICAgIGlmICh0aGlzLm9wdGlvbnMuc2NhbGVGcm9tQ2VudGVyKSB7DQogICAgICB2YXIgdG9wZCAgPSAoaGVpZ2h0IC0gdGhpcy5kaW1zWzBdKS8yOw0KICAgICAgdmFyIGxlZnRkID0gKHdpZHRoICAtIHRoaXMuZGltc1sxXSkvMjsNCiAgICAgIGlmICh0aGlzLmVsZW1lbnRQb3NpdGlvbmluZyA9PSAnYWJzb2x1dGUnKSB7DQogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2NhbGVZKSBkLnRvcCA9IHRoaXMub3JpZ2luYWxUb3AtdG9wZCArICdweCc7DQogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2NhbGVYKSBkLmxlZnQgPSB0aGlzLm9yaWdpbmFsTGVmdC1sZWZ0ZCArICdweCc7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNjYWxlWSkgZC50b3AgPSAtdG9wZCArICdweCc7DQogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2NhbGVYKSBkLmxlZnQgPSAtbGVmdGQgKyAncHgnOw0KICAgICAgfQ0KICAgIH0NCiAgICB0aGlzLmVsZW1lbnQuc2V0U3R5bGUoZCk7DQogIH0NCn0pOw0KDQpFZmZlY3QuSGlnaGxpZ2h0ID0gQ2xhc3MuY3JlYXRlKEVmZmVjdC5CYXNlLCB7DQogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICB0aGlzLmVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIGlmICghdGhpcy5lbGVtZW50KSB0aHJvdyhFZmZlY3QuX2VsZW1lbnREb2VzTm90RXhpc3RFcnJvcik7DQogICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsgc3RhcnRjb2xvcjogJyNmZmZmOTknIH0sIGFyZ3VtZW50c1sxXSB8fCB7IH0pOw0KICAgIHRoaXMuc3RhcnQob3B0aW9ucyk7DQogIH0sDQogIHNldHVwOiBmdW5jdGlvbigpIHsNCiAgICAvLyBQcmV2ZW50IGV4ZWN1dGluZyBvbiBlbGVtZW50cyBub3QgaW4gdGhlIGxheW91dCBmbG93DQogICAgaWYgKHRoaXMuZWxlbWVudC5nZXRTdHlsZSgnZGlzcGxheScpPT0nbm9uZScpIHsgdGhpcy5jYW5jZWwoKTsgcmV0dXJuOyB9DQogICAgLy8gRGlzYWJsZSBiYWNrZ3JvdW5kIGltYWdlIGR1cmluZyB0aGUgZWZmZWN0DQogICAgdGhpcy5vbGRTdHlsZSA9IHsgfTsNCiAgICBpZiAoIXRoaXMub3B0aW9ucy5rZWVwQmFja2dyb3VuZEltYWdlKSB7DQogICAgICB0aGlzLm9sZFN0eWxlLmJhY2tncm91bmRJbWFnZSA9IHRoaXMuZWxlbWVudC5nZXRTdHlsZSgnYmFja2dyb3VuZC1pbWFnZScpOw0KICAgICAgdGhpcy5lbGVtZW50LnNldFN0eWxlKHtiYWNrZ3JvdW5kSW1hZ2U6ICdub25lJ30pOw0KICAgIH0NCiAgICBpZiAoIXRoaXMub3B0aW9ucy5lbmRjb2xvcikNCiAgICAgIHRoaXMub3B0aW9ucy5lbmRjb2xvciA9IHRoaXMuZWxlbWVudC5nZXRTdHlsZSgnYmFja2dyb3VuZC1jb2xvcicpLnBhcnNlQ29sb3IoJyNmZmZmZmYnKTsNCiAgICBpZiAoIXRoaXMub3B0aW9ucy5yZXN0b3JlY29sb3IpDQogICAgICB0aGlzLm9wdGlvbnMucmVzdG9yZWNvbG9yID0gdGhpcy5lbGVtZW50LmdldFN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJyk7DQogICAgLy8gaW5pdCBjb2xvciBjYWxjdWxhdGlvbnMNCiAgICB0aGlzLl9iYXNlICA9ICRSKDAsMikubWFwKGZ1bmN0aW9uKGkpeyByZXR1cm4gcGFyc2VJbnQodGhpcy5vcHRpb25zLnN0YXJ0Y29sb3Iuc2xpY2UoaSoyKzEsaSoyKzMpLDE2KSB9LmJpbmQodGhpcykpOw0KICAgIHRoaXMuX2RlbHRhID0gJFIoMCwyKS5tYXAoZnVuY3Rpb24oaSl7IHJldHVybiBwYXJzZUludCh0aGlzLm9wdGlvbnMuZW5kY29sb3Iuc2xpY2UoaSoyKzEsaSoyKzMpLDE2KS10aGlzLl9iYXNlW2ldIH0uYmluZCh0aGlzKSk7DQogIH0sDQogIHVwZGF0ZTogZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICB0aGlzLmVsZW1lbnQuc2V0U3R5bGUoe2JhY2tncm91bmRDb2xvcjogJFIoMCwyKS5pbmplY3QoJyMnLGZ1bmN0aW9uKG0sdixpKXsNCiAgICAgIHJldHVybiBtKygodGhpcy5fYmFzZVtpXSsodGhpcy5fZGVsdGFbaV0qcG9zaXRpb24pKS5yb3VuZCgpLnRvQ29sb3JQYXJ0KCkpOyB9LmJpbmQodGhpcykpIH0pOw0KICB9LA0KICBmaW5pc2g6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuZWxlbWVudC5zZXRTdHlsZShPYmplY3QuZXh0ZW5kKHRoaXMub2xkU3R5bGUsIHsNCiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5vcHRpb25zLnJlc3RvcmVjb2xvcg0KICAgIH0pKTsNCiAgfQ0KfSk7DQoNCkVmZmVjdC5TY3JvbGxUbyA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHNbMV0gfHwgeyB9LA0KICAgIHNjcm9sbE9mZnNldHMgPSBkb2N1bWVudC52aWV3cG9ydC5nZXRTY3JvbGxPZmZzZXRzKCksDQogICAgZWxlbWVudE9mZnNldHMgPSAkKGVsZW1lbnQpLmN1bXVsYXRpdmVPZmZzZXQoKSwNCiAgICBtYXggPSAod2luZG93LmhlaWdodCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCkgLSBkb2N1bWVudC52aWV3cG9ydC5nZXRIZWlnaHQoKTsgIA0KDQogIGlmIChvcHRpb25zLm9mZnNldCkgZWxlbWVudE9mZnNldHNbMV0gKz0gb3B0aW9ucy5vZmZzZXQ7DQoNCiAgcmV0dXJuIG5ldyBFZmZlY3QuVHdlZW4obnVsbCwNCiAgICBzY3JvbGxPZmZzZXRzLnRvcCwNCiAgICBlbGVtZW50T2Zmc2V0c1sxXSA+IG1heCA/IG1heCA6IGVsZW1lbnRPZmZzZXRzWzFdLA0KICAgIG9wdGlvbnMsDQogICAgZnVuY3Rpb24ocCl7IHNjcm9sbFRvKHNjcm9sbE9mZnNldHMubGVmdCwgcC5yb3VuZCgpKSB9DQogICk7DQp9Ow0KDQovKiAtLS0tLS0tLS0tLS0tIGNvbWJpbmF0aW9uIGVmZmVjdHMgLS0tLS0tLS0tLS0tLSAqLw0KDQpFZmZlY3QuRmFkZSA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogIHZhciBvbGRPcGFjaXR5ID0gZWxlbWVudC5nZXRJbmxpbmVPcGFjaXR5KCk7DQogIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7DQogICAgZnJvbTogZWxlbWVudC5nZXRPcGFjaXR5KCkgfHwgMS4wLA0KICAgIHRvOiAgIDAuMCwNCiAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsgDQogICAgICBpZiAoZWZmZWN0Lm9wdGlvbnMudG8hPTApIHJldHVybjsNCiAgICAgIGVmZmVjdC5lbGVtZW50LmhpZGUoKS5zZXRTdHlsZSh7b3BhY2l0eTogb2xkT3BhY2l0eX0pOyANCiAgICB9DQogIH0sIGFyZ3VtZW50c1sxXSB8fCB7IH0pOw0KICByZXR1cm4gbmV3IEVmZmVjdC5PcGFjaXR5KGVsZW1lbnQsb3B0aW9ucyk7DQp9Ow0KDQpFZmZlY3QuQXBwZWFyID0gZnVuY3Rpb24oZWxlbWVudCkgew0KICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsNCiAgZnJvbTogKGVsZW1lbnQuZ2V0U3R5bGUoJ2Rpc3BsYXknKSA9PSAnbm9uZScgPyAwLjAgOiBlbGVtZW50LmdldE9wYWNpdHkoKSB8fCAwLjApLA0KICB0bzogICAxLjAsDQogIC8vIGZvcmNlIFNhZmFyaSB0byByZW5kZXIgZmxvYXRlZCBlbGVtZW50cyBwcm9wZXJseQ0KICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsNCiAgICBlZmZlY3QuZWxlbWVudC5mb3JjZVJlcmVuZGVyaW5nKCk7DQogIH0sDQogIGJlZm9yZVNldHVwOiBmdW5jdGlvbihlZmZlY3QpIHsNCiAgICBlZmZlY3QuZWxlbWVudC5zZXRPcGFjaXR5KGVmZmVjdC5vcHRpb25zLmZyb20pLnNob3coKTsgDQogIH19LCBhcmd1bWVudHNbMV0gfHwgeyB9KTsNCiAgcmV0dXJuIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50LG9wdGlvbnMpOw0KfTsNCg0KRWZmZWN0LlB1ZmYgPSBmdW5jdGlvbihlbGVtZW50KSB7DQogIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICB2YXIgb2xkU3R5bGUgPSB7IA0KICAgIG9wYWNpdHk6IGVsZW1lbnQuZ2V0SW5saW5lT3BhY2l0eSgpLCANCiAgICBwb3NpdGlvbjogZWxlbWVudC5nZXRTdHlsZSgncG9zaXRpb24nKSwNCiAgICB0b3A6ICBlbGVtZW50LnN0eWxlLnRvcCwNCiAgICBsZWZ0OiBlbGVtZW50LnN0eWxlLmxlZnQsDQogICAgd2lkdGg6IGVsZW1lbnQuc3R5bGUud2lkdGgsDQogICAgaGVpZ2h0OiBlbGVtZW50LnN0eWxlLmhlaWdodA0KICB9Ow0KICByZXR1cm4gbmV3IEVmZmVjdC5QYXJhbGxlbCgNCiAgIFsgbmV3IEVmZmVjdC5TY2FsZShlbGVtZW50LCAyMDAsIA0KICAgICAgeyBzeW5jOiB0cnVlLCBzY2FsZUZyb21DZW50ZXI6IHRydWUsIHNjYWxlQ29udGVudDogdHJ1ZSwgcmVzdG9yZUFmdGVyRmluaXNoOiB0cnVlIH0pLCANCiAgICAgbmV3IEVmZmVjdC5PcGFjaXR5KGVsZW1lbnQsIHsgc3luYzogdHJ1ZSwgdG86IDAuMCB9ICkgXSwgDQogICAgIE9iamVjdC5leHRlbmQoeyBkdXJhdGlvbjogMS4wLCANCiAgICAgIGJlZm9yZVNldHVwSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgew0KICAgICAgICBQb3NpdGlvbi5hYnNvbHV0aXplKGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQpDQogICAgICB9LA0KICAgICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7DQogICAgICAgICBlZmZlY3QuZWZmZWN0c1swXS5lbGVtZW50LmhpZGUoKS5zZXRTdHlsZShvbGRTdHlsZSk7IH0NCiAgICAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSkNCiAgICk7DQp9Ow0KDQpFZmZlY3QuQmxpbmRVcCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogIGVsZW1lbnQubWFrZUNsaXBwaW5nKCk7DQogIHJldHVybiBuZXcgRWZmZWN0LlNjYWxlKGVsZW1lbnQsIDAsDQogICAgT2JqZWN0LmV4dGVuZCh7IHNjYWxlQ29udGVudDogZmFsc2UsIA0KICAgICAgc2NhbGVYOiBmYWxzZSwgDQogICAgICByZXN0b3JlQWZ0ZXJGaW5pc2g6IHRydWUsDQogICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsNCiAgICAgICAgZWZmZWN0LmVsZW1lbnQuaGlkZSgpLnVuZG9DbGlwcGluZygpOw0KICAgICAgfSANCiAgICB9LCBhcmd1bWVudHNbMV0gfHwgeyB9KQ0KICApOw0KfTsNCg0KRWZmZWN0LkJsaW5kRG93biA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogIHZhciBlbGVtZW50RGltZW5zaW9ucyA9IGVsZW1lbnQuZ2V0RGltZW5zaW9ucygpOw0KICByZXR1cm4gbmV3IEVmZmVjdC5TY2FsZShlbGVtZW50LCAxMDAsIE9iamVjdC5leHRlbmQoeyANCiAgICBzY2FsZUNvbnRlbnQ6IGZhbHNlLCANCiAgICBzY2FsZVg6IGZhbHNlLA0KICAgIHNjYWxlRnJvbTogMCwNCiAgICBzY2FsZU1vZGU6IHtvcmlnaW5hbEhlaWdodDogZWxlbWVudERpbWVuc2lvbnMuaGVpZ2h0LCBvcmlnaW5hbFdpZHRoOiBlbGVtZW50RGltZW5zaW9ucy53aWR0aH0sDQogICAgcmVzdG9yZUFmdGVyRmluaXNoOiB0cnVlLA0KICAgIGFmdGVyU2V0dXA6IGZ1bmN0aW9uKGVmZmVjdCkgew0KICAgICAgZWZmZWN0LmVsZW1lbnQubWFrZUNsaXBwaW5nKCkuc2V0U3R5bGUoe2hlaWdodDogJzBweCd9KS5zaG93KCk7IA0KICAgIH0sICANCiAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsNCiAgICAgIGVmZmVjdC5lbGVtZW50LnVuZG9DbGlwcGluZygpOw0KICAgIH0NCiAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSkpOw0KfTsNCg0KRWZmZWN0LlN3aXRjaE9mZiA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogIHZhciBvbGRPcGFjaXR5ID0gZWxlbWVudC5nZXRJbmxpbmVPcGFjaXR5KCk7DQogIHJldHVybiBuZXcgRWZmZWN0LkFwcGVhcihlbGVtZW50LCBPYmplY3QuZXh0ZW5kKHsNCiAgICBkdXJhdGlvbjogMC40LA0KICAgIGZyb206IDAsDQogICAgdHJhbnNpdGlvbjogRWZmZWN0LlRyYW5zaXRpb25zLmZsaWNrZXIsDQogICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7DQogICAgICBuZXcgRWZmZWN0LlNjYWxlKGVmZmVjdC5lbGVtZW50LCAxLCB7IA0KICAgICAgICBkdXJhdGlvbjogMC4zLCBzY2FsZUZyb21DZW50ZXI6IHRydWUsDQogICAgICAgIHNjYWxlWDogZmFsc2UsIHNjYWxlQ29udGVudDogZmFsc2UsIHJlc3RvcmVBZnRlckZpbmlzaDogdHJ1ZSwNCiAgICAgICAgYmVmb3JlU2V0dXA6IGZ1bmN0aW9uKGVmZmVjdCkgeyANCiAgICAgICAgICBlZmZlY3QuZWxlbWVudC5tYWtlUG9zaXRpb25lZCgpLm1ha2VDbGlwcGluZygpOw0KICAgICAgICB9LA0KICAgICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsNCiAgICAgICAgICBlZmZlY3QuZWxlbWVudC5oaWRlKCkudW5kb0NsaXBwaW5nKCkudW5kb1Bvc2l0aW9uZWQoKS5zZXRTdHlsZSh7b3BhY2l0eTogb2xkT3BhY2l0eX0pOw0KICAgICAgICB9DQogICAgICB9KQ0KICAgIH0NCiAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSkpOw0KfTsNCg0KRWZmZWN0LkRyb3BPdXQgPSBmdW5jdGlvbihlbGVtZW50KSB7DQogIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICB2YXIgb2xkU3R5bGUgPSB7DQogICAgdG9wOiBlbGVtZW50LmdldFN0eWxlKCd0b3AnKSwNCiAgICBsZWZ0OiBlbGVtZW50LmdldFN0eWxlKCdsZWZ0JyksDQogICAgb3BhY2l0eTogZWxlbWVudC5nZXRJbmxpbmVPcGFjaXR5KCkgfTsNCiAgcmV0dXJuIG5ldyBFZmZlY3QuUGFyYWxsZWwoDQogICAgWyBuZXcgRWZmZWN0Lk1vdmUoZWxlbWVudCwge3g6IDAsIHk6IDEwMCwgc3luYzogdHJ1ZSB9KSwgDQogICAgICBuZXcgRWZmZWN0Lk9wYWNpdHkoZWxlbWVudCwgeyBzeW5jOiB0cnVlLCB0bzogMC4wIH0pIF0sDQogICAgT2JqZWN0LmV4dGVuZCgNCiAgICAgIHsgZHVyYXRpb246IDAuNSwNCiAgICAgICAgYmVmb3JlU2V0dXA6IGZ1bmN0aW9uKGVmZmVjdCkgew0KICAgICAgICAgIGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQubWFrZVBvc2l0aW9uZWQoKTsgDQogICAgICAgIH0sDQogICAgICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgew0KICAgICAgICAgIGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQuaGlkZSgpLnVuZG9Qb3NpdGlvbmVkKCkuc2V0U3R5bGUob2xkU3R5bGUpOw0KICAgICAgICB9IA0KICAgICAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSkpOw0KfTsNCg0KRWZmZWN0LlNoYWtlID0gZnVuY3Rpb24oZWxlbWVudCkgew0KICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsNCiAgICBkaXN0YW5jZTogMjAsDQogICAgZHVyYXRpb246IDAuNQ0KICB9LCBhcmd1bWVudHNbMV0gfHwge30pOw0KICB2YXIgZGlzdGFuY2UgPSBwYXJzZUZsb2F0KG9wdGlvbnMuZGlzdGFuY2UpOw0KICB2YXIgc3BsaXQgPSBwYXJzZUZsb2F0KG9wdGlvbnMuZHVyYXRpb24pIC8gMTAuMDsNCiAgdmFyIG9sZFN0eWxlID0gew0KICAgIHRvcDogZWxlbWVudC5nZXRTdHlsZSgndG9wJyksDQogICAgbGVmdDogZWxlbWVudC5nZXRTdHlsZSgnbGVmdCcpIH07DQogICAgcmV0dXJuIG5ldyBFZmZlY3QuTW92ZShlbGVtZW50LA0KICAgICAgeyB4OiAgZGlzdGFuY2UsIHk6IDAsIGR1cmF0aW9uOiBzcGxpdCwgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7DQogICAgbmV3IEVmZmVjdC5Nb3ZlKGVmZmVjdC5lbGVtZW50LA0KICAgICAgeyB4OiAtZGlzdGFuY2UqMiwgeTogMCwgZHVyYXRpb246IHNwbGl0KjIsICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsNCiAgICBuZXcgRWZmZWN0Lk1vdmUoZWZmZWN0LmVsZW1lbnQsDQogICAgICB7IHg6ICBkaXN0YW5jZSoyLCB5OiAwLCBkdXJhdGlvbjogc3BsaXQqMiwgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgew0KICAgIG5ldyBFZmZlY3QuTW92ZShlZmZlY3QuZWxlbWVudCwNCiAgICAgIHsgeDogLWRpc3RhbmNlKjIsIHk6IDAsIGR1cmF0aW9uOiBzcGxpdCoyLCAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7DQogICAgbmV3IEVmZmVjdC5Nb3ZlKGVmZmVjdC5lbGVtZW50LA0KICAgICAgeyB4OiAgZGlzdGFuY2UqMiwgeTogMCwgZHVyYXRpb246IHNwbGl0KjIsICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsNCiAgICBuZXcgRWZmZWN0Lk1vdmUoZWZmZWN0LmVsZW1lbnQsDQogICAgICB7IHg6IC1kaXN0YW5jZSwgeTogMCwgZHVyYXRpb246IHNwbGl0LCBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsNCiAgICAgICAgZWZmZWN0LmVsZW1lbnQudW5kb1Bvc2l0aW9uZWQoKS5zZXRTdHlsZShvbGRTdHlsZSk7DQogIH19KSB9fSkgfX0pIH19KSB9fSkgfX0pOw0KfTsNCg0KRWZmZWN0LlNsaWRlRG93biA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgZWxlbWVudCA9ICQoZWxlbWVudCkuY2xlYW5XaGl0ZXNwYWNlKCk7DQogIC8vIFNsaWRlRG93biBuZWVkIHRvIGhhdmUgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgd3JhcHBlZCBpbiBhIGNvbnRhaW5lciBlbGVtZW50IHdpdGggZml4ZWQgaGVpZ2h0IQ0KICB2YXIgb2xkSW5uZXJCb3R0b20gPSBlbGVtZW50LmRvd24oKS5nZXRTdHlsZSgnYm90dG9tJyk7DQogIHZhciBlbGVtZW50RGltZW5zaW9ucyA9IGVsZW1lbnQuZ2V0RGltZW5zaW9ucygpOw0KICByZXR1cm4gbmV3IEVmZmVjdC5TY2FsZShlbGVtZW50LCAxMDAsIE9iamVjdC5leHRlbmQoeyANCiAgICBzY2FsZUNvbnRlbnQ6IGZhbHNlLCANCiAgICBzY2FsZVg6IGZhbHNlLCANCiAgICBzY2FsZUZyb206IHdpbmRvdy5vcGVyYSA/IDAgOiAxLA0KICAgIHNjYWxlTW9kZToge29yaWdpbmFsSGVpZ2h0OiBlbGVtZW50RGltZW5zaW9ucy5oZWlnaHQsIG9yaWdpbmFsV2lkdGg6IGVsZW1lbnREaW1lbnNpb25zLndpZHRofSwNCiAgICByZXN0b3JlQWZ0ZXJGaW5pc2g6IHRydWUsDQogICAgYWZ0ZXJTZXR1cDogZnVuY3Rpb24oZWZmZWN0KSB7DQogICAgICBlZmZlY3QuZWxlbWVudC5tYWtlUG9zaXRpb25lZCgpOw0KICAgICAgZWZmZWN0LmVsZW1lbnQuZG93bigpLm1ha2VQb3NpdGlvbmVkKCk7DQogICAgICBpZiAod2luZG93Lm9wZXJhKSBlZmZlY3QuZWxlbWVudC5zZXRTdHlsZSh7dG9wOiAnJ30pOw0KICAgICAgZWZmZWN0LmVsZW1lbnQubWFrZUNsaXBwaW5nKCkuc2V0U3R5bGUoe2hlaWdodDogJzBweCd9KS5zaG93KCk7IA0KICAgIH0sDQogICAgYWZ0ZXJVcGRhdGVJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7DQogICAgICBlZmZlY3QuZWxlbWVudC5kb3duKCkuc2V0U3R5bGUoe2JvdHRvbToNCiAgICAgICAgKGVmZmVjdC5kaW1zWzBdIC0gZWZmZWN0LmVsZW1lbnQuY2xpZW50SGVpZ2h0KSArICdweCcgfSk7IA0KICAgIH0sDQogICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7DQogICAgICBlZmZlY3QuZWxlbWVudC51bmRvQ2xpcHBpbmcoKS51bmRvUG9zaXRpb25lZCgpOw0KICAgICAgZWZmZWN0LmVsZW1lbnQuZG93bigpLnVuZG9Qb3NpdGlvbmVkKCkuc2V0U3R5bGUoe2JvdHRvbTogb2xkSW5uZXJCb3R0b219KTsgfQ0KICAgIH0sIGFyZ3VtZW50c1sxXSB8fCB7IH0pDQogICk7DQp9Ow0KDQpFZmZlY3QuU2xpZGVVcCA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgZWxlbWVudCA9ICQoZWxlbWVudCkuY2xlYW5XaGl0ZXNwYWNlKCk7DQogIHZhciBvbGRJbm5lckJvdHRvbSA9IGVsZW1lbnQuZG93bigpLmdldFN0eWxlKCdib3R0b20nKTsNCiAgdmFyIGVsZW1lbnREaW1lbnNpb25zID0gZWxlbWVudC5nZXREaW1lbnNpb25zKCk7DQogIHJldHVybiBuZXcgRWZmZWN0LlNjYWxlKGVsZW1lbnQsIHdpbmRvdy5vcGVyYSA/IDAgOiAxLA0KICAgT2JqZWN0LmV4dGVuZCh7IHNjYWxlQ29udGVudDogZmFsc2UsIA0KICAgIHNjYWxlWDogZmFsc2UsIA0KICAgIHNjYWxlTW9kZTogJ2JveCcsDQogICAgc2NhbGVGcm9tOiAxMDAsDQogICAgc2NhbGVNb2RlOiB7b3JpZ2luYWxIZWlnaHQ6IGVsZW1lbnREaW1lbnNpb25zLmhlaWdodCwgb3JpZ2luYWxXaWR0aDogZWxlbWVudERpbWVuc2lvbnMud2lkdGh9LA0KICAgIHJlc3RvcmVBZnRlckZpbmlzaDogdHJ1ZSwNCiAgICBhZnRlclNldHVwOiBmdW5jdGlvbihlZmZlY3QpIHsNCiAgICAgIGVmZmVjdC5lbGVtZW50Lm1ha2VQb3NpdGlvbmVkKCk7DQogICAgICBlZmZlY3QuZWxlbWVudC5kb3duKCkubWFrZVBvc2l0aW9uZWQoKTsNCiAgICAgIGlmICh3aW5kb3cub3BlcmEpIGVmZmVjdC5lbGVtZW50LnNldFN0eWxlKHt0b3A6ICcnfSk7DQogICAgICBlZmZlY3QuZWxlbWVudC5tYWtlQ2xpcHBpbmcoKS5zaG93KCk7DQogICAgfSwgIA0KICAgIGFmdGVyVXBkYXRlSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgew0KICAgICAgZWZmZWN0LmVsZW1lbnQuZG93bigpLnNldFN0eWxlKHtib3R0b206DQogICAgICAgIChlZmZlY3QuZGltc1swXSAtIGVmZmVjdC5lbGVtZW50LmNsaWVudEhlaWdodCkgKyAncHgnIH0pOw0KICAgIH0sDQogICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7DQogICAgICBlZmZlY3QuZWxlbWVudC5oaWRlKCkudW5kb0NsaXBwaW5nKCkudW5kb1Bvc2l0aW9uZWQoKTsNCiAgICAgIGVmZmVjdC5lbGVtZW50LmRvd24oKS51bmRvUG9zaXRpb25lZCgpLnNldFN0eWxlKHtib3R0b206IG9sZElubmVyQm90dG9tfSk7DQogICAgfQ0KICAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSkNCiAgKTsNCn07DQoNCi8vIEJ1ZyBpbiBvcGVyYSBtYWtlcyB0aGUgVEQgY29udGFpbmluZyB0aGlzIGVsZW1lbnQgZXhwYW5kIGZvciBhIGluc3RhbmNlIGFmdGVyIGZpbmlzaCANCkVmZmVjdC5TcXVpc2ggPSBmdW5jdGlvbihlbGVtZW50KSB7DQogIHJldHVybiBuZXcgRWZmZWN0LlNjYWxlKGVsZW1lbnQsIHdpbmRvdy5vcGVyYSA/IDEgOiAwLCB7IA0KICAgIHJlc3RvcmVBZnRlckZpbmlzaDogdHJ1ZSwNCiAgICBiZWZvcmVTZXR1cDogZnVuY3Rpb24oZWZmZWN0KSB7DQogICAgICBlZmZlY3QuZWxlbWVudC5tYWtlQ2xpcHBpbmcoKTsgDQogICAgfSwgIA0KICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgew0KICAgICAgZWZmZWN0LmVsZW1lbnQuaGlkZSgpLnVuZG9DbGlwcGluZygpOyANCiAgICB9DQogIH0pOw0KfTsNCg0KRWZmZWN0Lkdyb3cgPSBmdW5jdGlvbihlbGVtZW50KSB7DQogIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoew0KICAgIGRpcmVjdGlvbjogJ2NlbnRlcicsDQogICAgbW92ZVRyYW5zaXRpb246IEVmZmVjdC5UcmFuc2l0aW9ucy5zaW5vaWRhbCwNCiAgICBzY2FsZVRyYW5zaXRpb246IEVmZmVjdC5UcmFuc2l0aW9ucy5zaW5vaWRhbCwNCiAgICBvcGFjaXR5VHJhbnNpdGlvbjogRWZmZWN0LlRyYW5zaXRpb25zLmZ1bGwNCiAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSk7DQogIHZhciBvbGRTdHlsZSA9IHsNCiAgICB0b3A6IGVsZW1lbnQuc3R5bGUudG9wLA0KICAgIGxlZnQ6IGVsZW1lbnQuc3R5bGUubGVmdCwNCiAgICBoZWlnaHQ6IGVsZW1lbnQuc3R5bGUuaGVpZ2h0LA0KICAgIHdpZHRoOiBlbGVtZW50LnN0eWxlLndpZHRoLA0KICAgIG9wYWNpdHk6IGVsZW1lbnQuZ2V0SW5saW5lT3BhY2l0eSgpIH07DQoNCiAgdmFyIGRpbXMgPSBlbGVtZW50LmdldERpbWVuc2lvbnMoKTsgICAgDQogIHZhciBpbml0aWFsTW92ZVgsIGluaXRpYWxNb3ZlWTsNCiAgdmFyIG1vdmVYLCBtb3ZlWTsNCiAgDQogIHN3aXRjaCAob3B0aW9ucy5kaXJlY3Rpb24pIHsNCiAgICBjYXNlICd0b3AtbGVmdCc6DQogICAgICBpbml0aWFsTW92ZVggPSBpbml0aWFsTW92ZVkgPSBtb3ZlWCA9IG1vdmVZID0gMDsgDQogICAgICBicmVhazsNCiAgICBjYXNlICd0b3AtcmlnaHQnOg0KICAgICAgaW5pdGlhbE1vdmVYID0gZGltcy53aWR0aDsNCiAgICAgIGluaXRpYWxNb3ZlWSA9IG1vdmVZID0gMDsNCiAgICAgIG1vdmVYID0gLWRpbXMud2lkdGg7DQogICAgICBicmVhazsNCiAgICBjYXNlICdib3R0b20tbGVmdCc6DQogICAgICBpbml0aWFsTW92ZVggPSBtb3ZlWCA9IDA7DQogICAgICBpbml0aWFsTW92ZVkgPSBkaW1zLmhlaWdodDsNCiAgICAgIG1vdmVZID0gLWRpbXMuaGVpZ2h0Ow0KICAgICAgYnJlYWs7DQogICAgY2FzZSAnYm90dG9tLXJpZ2h0JzoNCiAgICAgIGluaXRpYWxNb3ZlWCA9IGRpbXMud2lkdGg7DQogICAgICBpbml0aWFsTW92ZVkgPSBkaW1zLmhlaWdodDsNCiAgICAgIG1vdmVYID0gLWRpbXMud2lkdGg7DQogICAgICBtb3ZlWSA9IC1kaW1zLmhlaWdodDsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgJ2NlbnRlcic6DQogICAgICBpbml0aWFsTW92ZVggPSBkaW1zLndpZHRoIC8gMjsNCiAgICAgIGluaXRpYWxNb3ZlWSA9IGRpbXMuaGVpZ2h0IC8gMjsNCiAgICAgIG1vdmVYID0gLWRpbXMud2lkdGggLyAyOw0KICAgICAgbW92ZVkgPSAtZGltcy5oZWlnaHQgLyAyOw0KICAgICAgYnJlYWs7DQogIH0NCiAgDQogIHJldHVybiBuZXcgRWZmZWN0Lk1vdmUoZWxlbWVudCwgew0KICAgIHg6IGluaXRpYWxNb3ZlWCwNCiAgICB5OiBpbml0aWFsTW92ZVksDQogICAgZHVyYXRpb246IDAuMDEsIA0KICAgIGJlZm9yZVNldHVwOiBmdW5jdGlvbihlZmZlY3QpIHsNCiAgICAgIGVmZmVjdC5lbGVtZW50LmhpZGUoKS5tYWtlQ2xpcHBpbmcoKS5tYWtlUG9zaXRpb25lZCgpOw0KICAgIH0sDQogICAgYWZ0ZXJGaW5pc2hJbnRlcm5hbDogZnVuY3Rpb24oZWZmZWN0KSB7DQogICAgICBuZXcgRWZmZWN0LlBhcmFsbGVsKA0KICAgICAgICBbIG5ldyBFZmZlY3QuT3BhY2l0eShlZmZlY3QuZWxlbWVudCwgeyBzeW5jOiB0cnVlLCB0bzogMS4wLCBmcm9tOiAwLjAsIHRyYW5zaXRpb246IG9wdGlvbnMub3BhY2l0eVRyYW5zaXRpb24gfSksDQogICAgICAgICAgbmV3IEVmZmVjdC5Nb3ZlKGVmZmVjdC5lbGVtZW50LCB7IHg6IG1vdmVYLCB5OiBtb3ZlWSwgc3luYzogdHJ1ZSwgdHJhbnNpdGlvbjogb3B0aW9ucy5tb3ZlVHJhbnNpdGlvbiB9KSwNCiAgICAgICAgICBuZXcgRWZmZWN0LlNjYWxlKGVmZmVjdC5lbGVtZW50LCAxMDAsIHsNCiAgICAgICAgICAgIHNjYWxlTW9kZTogeyBvcmlnaW5hbEhlaWdodDogZGltcy5oZWlnaHQsIG9yaWdpbmFsV2lkdGg6IGRpbXMud2lkdGggfSwgDQogICAgICAgICAgICBzeW5jOiB0cnVlLCBzY2FsZUZyb206IHdpbmRvdy5vcGVyYSA/IDEgOiAwLCB0cmFuc2l0aW9uOiBvcHRpb25zLnNjYWxlVHJhbnNpdGlvbiwgcmVzdG9yZUFmdGVyRmluaXNoOiB0cnVlfSkNCiAgICAgICAgXSwgT2JqZWN0LmV4dGVuZCh7DQogICAgICAgICAgICAgYmVmb3JlU2V0dXA6IGZ1bmN0aW9uKGVmZmVjdCkgew0KICAgICAgICAgICAgICAgZWZmZWN0LmVmZmVjdHNbMF0uZWxlbWVudC5zZXRTdHlsZSh7aGVpZ2h0OiAnMHB4J30pLnNob3coKTsgDQogICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsNCiAgICAgICAgICAgICAgIGVmZmVjdC5lZmZlY3RzWzBdLmVsZW1lbnQudW5kb0NsaXBwaW5nKCkudW5kb1Bvc2l0aW9uZWQoKS5zZXRTdHlsZShvbGRTdHlsZSk7IA0KICAgICAgICAgICAgIH0NCiAgICAgICAgICAgfSwgb3B0aW9ucykNCiAgICAgICkNCiAgICB9DQogIH0pOw0KfTsNCg0KRWZmZWN0LlNocmluayA9IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7DQogICAgZGlyZWN0aW9uOiAnY2VudGVyJywNCiAgICBtb3ZlVHJhbnNpdGlvbjogRWZmZWN0LlRyYW5zaXRpb25zLnNpbm9pZGFsLA0KICAgIHNjYWxlVHJhbnNpdGlvbjogRWZmZWN0LlRyYW5zaXRpb25zLnNpbm9pZGFsLA0KICAgIG9wYWNpdHlUcmFuc2l0aW9uOiBFZmZlY3QuVHJhbnNpdGlvbnMubm9uZQ0KICB9LCBhcmd1bWVudHNbMV0gfHwgeyB9KTsNCiAgdmFyIG9sZFN0eWxlID0gew0KICAgIHRvcDogZWxlbWVudC5zdHlsZS50b3AsDQogICAgbGVmdDogZWxlbWVudC5zdHlsZS5sZWZ0LA0KICAgIGhlaWdodDogZWxlbWVudC5zdHlsZS5oZWlnaHQsDQogICAgd2lkdGg6IGVsZW1lbnQuc3R5bGUud2lkdGgsDQogICAgb3BhY2l0eTogZWxlbWVudC5nZXRJbmxpbmVPcGFjaXR5KCkgfTsNCg0KICB2YXIgZGltcyA9IGVsZW1lbnQuZ2V0RGltZW5zaW9ucygpOw0KICB2YXIgbW92ZVgsIG1vdmVZOw0KICANCiAgc3dpdGNoIChvcHRpb25zLmRpcmVjdGlvbikgew0KICAgIGNhc2UgJ3RvcC1sZWZ0JzoNCiAgICAgIG1vdmVYID0gbW92ZVkgPSAwOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSAndG9wLXJpZ2h0JzoNCiAgICAgIG1vdmVYID0gZGltcy53aWR0aDsNCiAgICAgIG1vdmVZID0gMDsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgJ2JvdHRvbS1sZWZ0JzoNCiAgICAgIG1vdmVYID0gMDsNCiAgICAgIG1vdmVZID0gZGltcy5oZWlnaHQ7DQogICAgICBicmVhazsNCiAgICBjYXNlICdib3R0b20tcmlnaHQnOg0KICAgICAgbW92ZVggPSBkaW1zLndpZHRoOw0KICAgICAgbW92ZVkgPSBkaW1zLmhlaWdodDsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgJ2NlbnRlcic6ICANCiAgICAgIG1vdmVYID0gZGltcy53aWR0aCAvIDI7DQogICAgICBtb3ZlWSA9IGRpbXMuaGVpZ2h0IC8gMjsNCiAgICAgIGJyZWFrOw0KICB9DQogIA0KICByZXR1cm4gbmV3IEVmZmVjdC5QYXJhbGxlbCgNCiAgICBbIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50LCB7IHN5bmM6IHRydWUsIHRvOiAwLjAsIGZyb206IDEuMCwgdHJhbnNpdGlvbjogb3B0aW9ucy5vcGFjaXR5VHJhbnNpdGlvbiB9KSwNCiAgICAgIG5ldyBFZmZlY3QuU2NhbGUoZWxlbWVudCwgd2luZG93Lm9wZXJhID8gMSA6IDAsIHsgc3luYzogdHJ1ZSwgdHJhbnNpdGlvbjogb3B0aW9ucy5zY2FsZVRyYW5zaXRpb24sIHJlc3RvcmVBZnRlckZpbmlzaDogdHJ1ZX0pLA0KICAgICAgbmV3IEVmZmVjdC5Nb3ZlKGVsZW1lbnQsIHsgeDogbW92ZVgsIHk6IG1vdmVZLCBzeW5jOiB0cnVlLCB0cmFuc2l0aW9uOiBvcHRpb25zLm1vdmVUcmFuc2l0aW9uIH0pDQogICAgXSwgT2JqZWN0LmV4dGVuZCh7ICAgICAgICAgICAgDQogICAgICAgICBiZWZvcmVTdGFydEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsNCiAgICAgICAgICAgZWZmZWN0LmVmZmVjdHNbMF0uZWxlbWVudC5tYWtlUG9zaXRpb25lZCgpLm1ha2VDbGlwcGluZygpOyANCiAgICAgICAgIH0sDQogICAgICAgICBhZnRlckZpbmlzaEludGVybmFsOiBmdW5jdGlvbihlZmZlY3QpIHsNCiAgICAgICAgICAgZWZmZWN0LmVmZmVjdHNbMF0uZWxlbWVudC5oaWRlKCkudW5kb0NsaXBwaW5nKCkudW5kb1Bvc2l0aW9uZWQoKS5zZXRTdHlsZShvbGRTdHlsZSk7IH0NCiAgICAgICB9LCBvcHRpb25zKQ0KICApOw0KfTsNCg0KRWZmZWN0LlB1bHNhdGUgPSBmdW5jdGlvbihlbGVtZW50KSB7DQogIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICB2YXIgb3B0aW9ucyAgICA9IGFyZ3VtZW50c1sxXSB8fCB7IH07DQogIHZhciBvbGRPcGFjaXR5ID0gZWxlbWVudC5nZXRJbmxpbmVPcGFjaXR5KCk7DQogIHZhciB0cmFuc2l0aW9uID0gb3B0aW9ucy50cmFuc2l0aW9uIHx8IEVmZmVjdC5UcmFuc2l0aW9ucy5zaW5vaWRhbDsNCiAgdmFyIHJldmVyc2VyICAgPSBmdW5jdGlvbihwb3MpeyByZXR1cm4gdHJhbnNpdGlvbigxLUVmZmVjdC5UcmFuc2l0aW9ucy5wdWxzZShwb3MsIG9wdGlvbnMucHVsc2VzKSkgfTsNCiAgcmV2ZXJzZXIuYmluZCh0cmFuc2l0aW9uKTsNCiAgcmV0dXJuIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50LCANCiAgICBPYmplY3QuZXh0ZW5kKE9iamVjdC5leHRlbmQoeyAgZHVyYXRpb246IDIuMCwgZnJvbTogMCwNCiAgICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgeyBlZmZlY3QuZWxlbWVudC5zZXRTdHlsZSh7b3BhY2l0eTogb2xkT3BhY2l0eX0pOyB9DQogICAgfSwgb3B0aW9ucyksIHt0cmFuc2l0aW9uOiByZXZlcnNlcn0pKTsNCn07DQoNCkVmZmVjdC5Gb2xkID0gZnVuY3Rpb24oZWxlbWVudCkgew0KICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgdmFyIG9sZFN0eWxlID0gew0KICAgIHRvcDogZWxlbWVudC5zdHlsZS50b3AsDQogICAgbGVmdDogZWxlbWVudC5zdHlsZS5sZWZ0LA0KICAgIHdpZHRoOiBlbGVtZW50LnN0eWxlLndpZHRoLA0KICAgIGhlaWdodDogZWxlbWVudC5zdHlsZS5oZWlnaHQgfTsNCiAgZWxlbWVudC5tYWtlQ2xpcHBpbmcoKTsNCiAgcmV0dXJuIG5ldyBFZmZlY3QuU2NhbGUoZWxlbWVudCwgNSwgT2JqZWN0LmV4dGVuZCh7ICAgDQogICAgc2NhbGVDb250ZW50OiBmYWxzZSwNCiAgICBzY2FsZVg6IGZhbHNlLA0KICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgew0KICAgIG5ldyBFZmZlY3QuU2NhbGUoZWxlbWVudCwgMSwgeyANCiAgICAgIHNjYWxlQ29udGVudDogZmFsc2UsIA0KICAgICAgc2NhbGVZOiBmYWxzZSwNCiAgICAgIGFmdGVyRmluaXNoSW50ZXJuYWw6IGZ1bmN0aW9uKGVmZmVjdCkgew0KICAgICAgICBlZmZlY3QuZWxlbWVudC5oaWRlKCkudW5kb0NsaXBwaW5nKCkuc2V0U3R5bGUob2xkU3R5bGUpOw0KICAgICAgfSB9KTsNCiAgfX0sIGFyZ3VtZW50c1sxXSB8fCB7IH0pKTsNCn07DQoNCkVmZmVjdC5Nb3JwaCA9IENsYXNzLmNyZWF0ZShFZmZlY3QuQmFzZSwgew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgdGhpcy5lbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICBpZiAoIXRoaXMuZWxlbWVudCkgdGhyb3coRWZmZWN0Ll9lbGVtZW50RG9lc05vdEV4aXN0RXJyb3IpOw0KICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7DQogICAgICBzdHlsZTogeyB9DQogICAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSk7DQogICAgDQogICAgaWYgKCFPYmplY3QuaXNTdHJpbmcob3B0aW9ucy5zdHlsZSkpIHRoaXMuc3R5bGUgPSAkSChvcHRpb25zLnN0eWxlKTsNCiAgICBlbHNlIHsNCiAgICAgIGlmIChvcHRpb25zLnN0eWxlLmluY2x1ZGUoJzonKSkNCiAgICAgICAgdGhpcy5zdHlsZSA9IG9wdGlvbnMuc3R5bGUucGFyc2VTdHlsZSgpOw0KICAgICAgZWxzZSB7DQogICAgICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzc05hbWUob3B0aW9ucy5zdHlsZSk7DQogICAgICAgIHRoaXMuc3R5bGUgPSAkSCh0aGlzLmVsZW1lbnQuZ2V0U3R5bGVzKCkpOw0KICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3NOYW1lKG9wdGlvbnMuc3R5bGUpOw0KICAgICAgICB2YXIgY3NzID0gdGhpcy5lbGVtZW50LmdldFN0eWxlcygpOw0KICAgICAgICB0aGlzLnN0eWxlID0gdGhpcy5zdHlsZS5yZWplY3QoZnVuY3Rpb24oc3R5bGUpIHsNCiAgICAgICAgICByZXR1cm4gc3R5bGUudmFsdWUgPT0gY3NzW3N0eWxlLmtleV07DQogICAgICAgIH0pOw0KICAgICAgICBvcHRpb25zLmFmdGVyRmluaXNoSW50ZXJuYWwgPSBmdW5jdGlvbihlZmZlY3QpIHsNCiAgICAgICAgICBlZmZlY3QuZWxlbWVudC5hZGRDbGFzc05hbWUoZWZmZWN0Lm9wdGlvbnMuc3R5bGUpOw0KICAgICAgICAgIGVmZmVjdC50cmFuc2Zvcm1zLmVhY2goZnVuY3Rpb24odHJhbnNmb3JtKSB7DQogICAgICAgICAgICBlZmZlY3QuZWxlbWVudC5zdHlsZVt0cmFuc2Zvcm0uc3R5bGVdID0gJyc7DQogICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgdGhpcy5zdGFydChvcHRpb25zKTsNCiAgfSwNCiAgDQogIHNldHVwOiBmdW5jdGlvbigpew0KICAgIGZ1bmN0aW9uIHBhcnNlQ29sb3IoY29sb3Ipew0KICAgICAgaWYgKCFjb2xvciB8fCBbJ3JnYmEoMCwgMCwgMCwgMCknLCd0cmFuc3BhcmVudCddLmluY2x1ZGUoY29sb3IpKSBjb2xvciA9ICcjZmZmZmZmJzsNCiAgICAgIGNvbG9yID0gY29sb3IucGFyc2VDb2xvcigpOw0KICAgICAgcmV0dXJuICRSKDAsMikubWFwKGZ1bmN0aW9uKGkpew0KICAgICAgICByZXR1cm4gcGFyc2VJbnQoIGNvbG9yLnNsaWNlKGkqMisxLGkqMiszKSwgMTYgKSANCiAgICAgIH0pOw0KICAgIH0NCiAgICB0aGlzLnRyYW5zZm9ybXMgPSB0aGlzLnN0eWxlLm1hcChmdW5jdGlvbihwYWlyKXsNCiAgICAgIHZhciBwcm9wZXJ0eSA9IHBhaXJbMF0sIHZhbHVlID0gcGFpclsxXSwgdW5pdCA9IG51bGw7DQoNCiAgICAgIGlmICh2YWx1ZS5wYXJzZUNvbG9yKCcjenp6enp6JykgIT0gJyN6enp6enonKSB7DQogICAgICAgIHZhbHVlID0gdmFsdWUucGFyc2VDb2xvcigpOw0KICAgICAgICB1bml0ICA9ICdjb2xvcic7DQogICAgICB9IGVsc2UgaWYgKHByb3BlcnR5ID09ICdvcGFjaXR5Jykgew0KICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpOw0KICAgICAgICBpZiAoUHJvdG90eXBlLkJyb3dzZXIuSUUgJiYgKCF0aGlzLmVsZW1lbnQuY3VycmVudFN0eWxlLmhhc0xheW91dCkpDQogICAgICAgICAgdGhpcy5lbGVtZW50LnNldFN0eWxlKHt6b29tOiAxfSk7DQogICAgICB9IGVsc2UgaWYgKEVsZW1lbnQuQ1NTX0xFTkdUSC50ZXN0KHZhbHVlKSkgew0KICAgICAgICAgIHZhciBjb21wb25lbnRzID0gdmFsdWUubWF0Y2goL14oW1wrXC1dP1swLTlcLl0rKSguKikkLyk7DQogICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KGNvbXBvbmVudHNbMV0pOw0KICAgICAgICAgIHVuaXQgPSAoY29tcG9uZW50cy5sZW5ndGggPT0gMykgPyBjb21wb25lbnRzWzJdIDogbnVsbDsNCiAgICAgIH0NCg0KICAgICAgdmFyIG9yaWdpbmFsVmFsdWUgPSB0aGlzLmVsZW1lbnQuZ2V0U3R5bGUocHJvcGVydHkpOw0KICAgICAgcmV0dXJuIHsgDQogICAgICAgIHN0eWxlOiBwcm9wZXJ0eS5jYW1lbGl6ZSgpLCANCiAgICAgICAgb3JpZ2luYWxWYWx1ZTogdW5pdD09J2NvbG9yJyA/IHBhcnNlQ29sb3Iob3JpZ2luYWxWYWx1ZSkgOiBwYXJzZUZsb2F0KG9yaWdpbmFsVmFsdWUgfHwgMCksIA0KICAgICAgICB0YXJnZXRWYWx1ZTogdW5pdD09J2NvbG9yJyA/IHBhcnNlQ29sb3IodmFsdWUpIDogdmFsdWUsDQogICAgICAgIHVuaXQ6IHVuaXQNCiAgICAgIH07DQogICAgfS5iaW5kKHRoaXMpKS5yZWplY3QoZnVuY3Rpb24odHJhbnNmb3JtKXsNCiAgICAgIHJldHVybiAoDQogICAgICAgICh0cmFuc2Zvcm0ub3JpZ2luYWxWYWx1ZSA9PSB0cmFuc2Zvcm0udGFyZ2V0VmFsdWUpIHx8DQogICAgICAgICgNCiAgICAgICAgICB0cmFuc2Zvcm0udW5pdCAhPSAnY29sb3InICYmDQogICAgICAgICAgKGlzTmFOKHRyYW5zZm9ybS5vcmlnaW5hbFZhbHVlKSB8fCBpc05hTih0cmFuc2Zvcm0udGFyZ2V0VmFsdWUpKQ0KICAgICAgICApDQogICAgICApDQogICAgfSk7DQogIH0sDQogIHVwZGF0ZTogZnVuY3Rpb24ocG9zaXRpb24pIHsNCiAgICB2YXIgc3R5bGUgPSB7IH0sIHRyYW5zZm9ybSwgaSA9IHRoaXMudHJhbnNmb3Jtcy5sZW5ndGg7DQogICAgd2hpbGUoaS0tKQ0KICAgICAgc3R5bGVbKHRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3Jtc1tpXSkuc3R5bGVdID0gDQogICAgICAgIHRyYW5zZm9ybS51bml0PT0nY29sb3InID8gJyMnKw0KICAgICAgICAgIChNYXRoLnJvdW5kKHRyYW5zZm9ybS5vcmlnaW5hbFZhbHVlWzBdKw0KICAgICAgICAgICAgKHRyYW5zZm9ybS50YXJnZXRWYWx1ZVswXS10cmFuc2Zvcm0ub3JpZ2luYWxWYWx1ZVswXSkqcG9zaXRpb24pKS50b0NvbG9yUGFydCgpICsNCiAgICAgICAgICAoTWF0aC5yb3VuZCh0cmFuc2Zvcm0ub3JpZ2luYWxWYWx1ZVsxXSsNCiAgICAgICAgICAgICh0cmFuc2Zvcm0udGFyZ2V0VmFsdWVbMV0tdHJhbnNmb3JtLm9yaWdpbmFsVmFsdWVbMV0pKnBvc2l0aW9uKSkudG9Db2xvclBhcnQoKSArDQogICAgICAgICAgKE1hdGgucm91bmQodHJhbnNmb3JtLm9yaWdpbmFsVmFsdWVbMl0rDQogICAgICAgICAgICAodHJhbnNmb3JtLnRhcmdldFZhbHVlWzJdLXRyYW5zZm9ybS5vcmlnaW5hbFZhbHVlWzJdKSpwb3NpdGlvbikpLnRvQ29sb3JQYXJ0KCkgOg0KICAgICAgICAodHJhbnNmb3JtLm9yaWdpbmFsVmFsdWUgKw0KICAgICAgICAgICh0cmFuc2Zvcm0udGFyZ2V0VmFsdWUgLSB0cmFuc2Zvcm0ub3JpZ2luYWxWYWx1ZSkgKiBwb3NpdGlvbikudG9GaXhlZCgzKSArIA0KICAgICAgICAgICAgKHRyYW5zZm9ybS51bml0ID09PSBudWxsID8gJycgOiB0cmFuc2Zvcm0udW5pdCk7DQogICAgdGhpcy5lbGVtZW50LnNldFN0eWxlKHN0eWxlLCB0cnVlKTsNCiAgfQ0KfSk7DQoNCkVmZmVjdC5UcmFuc2Zvcm0gPSBDbGFzcy5jcmVhdGUoew0KICBpbml0aWFsaXplOiBmdW5jdGlvbih0cmFja3Mpew0KICAgIHRoaXMudHJhY2tzICA9IFtdOw0KICAgIHRoaXMub3B0aW9ucyA9IGFyZ3VtZW50c1sxXSB8fCB7IH07DQogICAgdGhpcy5hZGRUcmFja3ModHJhY2tzKTsNCiAgfSwNCiAgYWRkVHJhY2tzOiBmdW5jdGlvbih0cmFja3Mpew0KICAgIHRyYWNrcy5lYWNoKGZ1bmN0aW9uKHRyYWNrKXsNCiAgICAgIHRyYWNrID0gJEgodHJhY2spOw0KICAgICAgdmFyIGRhdGEgPSB0cmFjay52YWx1ZXMoKS5maXJzdCgpOw0KICAgICAgdGhpcy50cmFja3MucHVzaCgkSCh7DQogICAgICAgIGlkczogICAgIHRyYWNrLmtleXMoKS5maXJzdCgpLA0KICAgICAgICBlZmZlY3Q6ICBFZmZlY3QuTW9ycGgsDQogICAgICAgIG9wdGlvbnM6IHsgc3R5bGU6IGRhdGEgfQ0KICAgICAgfSkpOw0KICAgIH0uYmluZCh0aGlzKSk7DQogICAgcmV0dXJuIHRoaXM7DQogIH0sDQogIHBsYXk6IGZ1bmN0aW9uKCl7DQogICAgcmV0dXJuIG5ldyBFZmZlY3QuUGFyYWxsZWwoDQogICAgICB0aGlzLnRyYWNrcy5tYXAoZnVuY3Rpb24odHJhY2spew0KICAgICAgICB2YXIgaWRzID0gdHJhY2suZ2V0KCdpZHMnKSwgZWZmZWN0ID0gdHJhY2suZ2V0KCdlZmZlY3QnKSwgb3B0aW9ucyA9IHRyYWNrLmdldCgnb3B0aW9ucycpOw0KICAgICAgICB2YXIgZWxlbWVudHMgPSBbJChpZHMpIHx8ICQkKGlkcyldLmZsYXR0ZW4oKTsNCiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLm1hcChmdW5jdGlvbihlKXsgcmV0dXJuIG5ldyBlZmZlY3QoZSwgT2JqZWN0LmV4dGVuZCh7IHN5bmM6dHJ1ZSB9LCBvcHRpb25zKSkgfSk7DQogICAgICB9KS5mbGF0dGVuKCksDQogICAgICB0aGlzLm9wdGlvbnMNCiAgICApOw0KICB9DQp9KTsNCg0KRWxlbWVudC5DU1NfUFJPUEVSVElFUyA9ICR3KA0KICAnYmFja2dyb3VuZENvbG9yIGJhY2tncm91bmRQb3NpdGlvbiBib3JkZXJCb3R0b21Db2xvciBib3JkZXJCb3R0b21TdHlsZSAnICsgDQogICdib3JkZXJCb3R0b21XaWR0aCBib3JkZXJMZWZ0Q29sb3IgYm9yZGVyTGVmdFN0eWxlIGJvcmRlckxlZnRXaWR0aCAnICsNCiAgJ2JvcmRlclJpZ2h0Q29sb3IgYm9yZGVyUmlnaHRTdHlsZSBib3JkZXJSaWdodFdpZHRoIGJvcmRlclNwYWNpbmcgJyArDQogICdib3JkZXJUb3BDb2xvciBib3JkZXJUb3BTdHlsZSBib3JkZXJUb3BXaWR0aCBib3R0b20gY2xpcCBjb2xvciAnICsNCiAgJ2ZvbnRTaXplIGZvbnRXZWlnaHQgaGVpZ2h0IGxlZnQgbGV0dGVyU3BhY2luZyBsaW5lSGVpZ2h0ICcgKw0KICAnbWFyZ2luQm90dG9tIG1hcmdpbkxlZnQgbWFyZ2luUmlnaHQgbWFyZ2luVG9wIG1hcmtlck9mZnNldCBtYXhIZWlnaHQgJysNCiAgJ21heFdpZHRoIG1pbkhlaWdodCBtaW5XaWR0aCBvcGFjaXR5IG91dGxpbmVDb2xvciBvdXRsaW5lT2Zmc2V0ICcgKw0KICAnb3V0bGluZVdpZHRoIHBhZGRpbmdCb3R0b20gcGFkZGluZ0xlZnQgcGFkZGluZ1JpZ2h0IHBhZGRpbmdUb3AgJyArDQogICdyaWdodCB0ZXh0SW5kZW50IHRvcCB3aWR0aCB3b3JkU3BhY2luZyB6SW5kZXgnKTsNCiAgDQpFbGVtZW50LkNTU19MRU5HVEggPSAvXigoW1wrXC1dP1swLTlcLl0rKShlbXxleHxweHxpbnxjbXxtbXxwdHxwY3xcJSkpfDAkLzsNCg0KU3RyaW5nLl9fcGFyc2VTdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNClN0cmluZy5wcm90b3R5cGUucGFyc2VTdHlsZSA9IGZ1bmN0aW9uKCl7DQogIHZhciBzdHlsZSwgc3R5bGVSdWxlcyA9ICRIKCk7DQogIGlmIChQcm90b3R5cGUuQnJvd3Nlci5XZWJLaXQpDQogICAgc3R5bGUgPSBuZXcgRWxlbWVudCgnZGl2Jyx7c3R5bGU6dGhpc30pLnN0eWxlOw0KICBlbHNlIHsNCiAgICBTdHJpbmcuX19wYXJzZVN0eWxlRWxlbWVudC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT0iJyArIHRoaXMgKyAnIj48L2Rpdj4nOw0KICAgIHN0eWxlID0gU3RyaW5nLl9fcGFyc2VTdHlsZUVsZW1lbnQuY2hpbGROb2Rlc1swXS5zdHlsZTsNCiAgfQ0KICANCiAgRWxlbWVudC5DU1NfUFJPUEVSVElFUy5lYWNoKGZ1bmN0aW9uKHByb3BlcnR5KXsNCiAgICBpZiAoc3R5bGVbcHJvcGVydHldKSBzdHlsZVJ1bGVzLnNldChwcm9wZXJ0eSwgc3R5bGVbcHJvcGVydHldKTsgDQogIH0pOw0KICANCiAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLklFICYmIHRoaXMuaW5jbHVkZSgnb3BhY2l0eScpKQ0KICAgIHN0eWxlUnVsZXMuc2V0KCdvcGFjaXR5JywgdGhpcy5tYXRjaCgvb3BhY2l0eTpccyooKD86MHwxKT8oPzpcLlxkKik/KS8pWzFdKTsNCg0KICByZXR1cm4gc3R5bGVSdWxlczsNCn07DQoNCmlmIChkb2N1bWVudC5kZWZhdWx0VmlldyAmJiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKSB7DQogIEVsZW1lbnQuZ2V0U3R5bGVzID0gZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIHZhciBjc3MgPSBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKCQoZWxlbWVudCksIG51bGwpOw0KICAgIHJldHVybiBFbGVtZW50LkNTU19QUk9QRVJUSUVTLmluamVjdCh7IH0sIGZ1bmN0aW9uKHN0eWxlcywgcHJvcGVydHkpIHsNCiAgICAgIHN0eWxlc1twcm9wZXJ0eV0gPSBjc3NbcHJvcGVydHldOw0KICAgICAgcmV0dXJuIHN0eWxlczsNCiAgICB9KTsNCiAgfTsNCn0gZWxzZSB7DQogIEVsZW1lbnQuZ2V0U3R5bGVzID0gZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIHZhciBjc3MgPSBlbGVtZW50LmN1cnJlbnRTdHlsZSwgc3R5bGVzOw0KICAgIHN0eWxlcyA9IEVsZW1lbnQuQ1NTX1BST1BFUlRJRVMuaW5qZWN0KHsgfSwgZnVuY3Rpb24ocmVzdWx0cywgcHJvcGVydHkpIHsNCiAgICAgIHJlc3VsdHNbcHJvcGVydHldID0gY3NzW3Byb3BlcnR5XTsNCiAgICAgIHJldHVybiByZXN1bHRzOw0KICAgIH0pOw0KICAgIGlmICghc3R5bGVzLm9wYWNpdHkpIHN0eWxlcy5vcGFjaXR5ID0gZWxlbWVudC5nZXRPcGFjaXR5KCk7DQogICAgcmV0dXJuIHN0eWxlczsNCiAgfTsNCn07DQoNCkVmZmVjdC5NZXRob2RzID0gew0KICBtb3JwaDogZnVuY3Rpb24oZWxlbWVudCwgc3R5bGUpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICBuZXcgRWZmZWN0Lk1vcnBoKGVsZW1lbnQsIE9iamVjdC5leHRlbmQoeyBzdHlsZTogc3R5bGUgfSwgYXJndW1lbnRzWzJdIHx8IHsgfSkpOw0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9LA0KICB2aXN1YWxFZmZlY3Q6IGZ1bmN0aW9uKGVsZW1lbnQsIGVmZmVjdCwgb3B0aW9ucykgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpDQogICAgdmFyIHMgPSBlZmZlY3QuZGFzaGVyaXplKCkuY2FtZWxpemUoKSwga2xhc3MgPSBzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcy5zdWJzdHJpbmcoMSk7DQogICAgbmV3IEVmZmVjdFtrbGFzc10oZWxlbWVudCwgb3B0aW9ucyk7DQogICAgcmV0dXJuIGVsZW1lbnQ7DQogIH0sDQogIGhpZ2hsaWdodDogZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucykgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIG5ldyBFZmZlY3QuSGlnaGxpZ2h0KGVsZW1lbnQsIG9wdGlvbnMpOw0KICAgIHJldHVybiBlbGVtZW50Ow0KICB9DQp9Ow0KDQokdygnZmFkZSBhcHBlYXIgZ3JvdyBzaHJpbmsgZm9sZCBibGluZFVwIGJsaW5kRG93biBzbGlkZVVwIHNsaWRlRG93biAnKw0KICAncHVsc2F0ZSBzaGFrZSBwdWZmIHNxdWlzaCBzd2l0Y2hPZmYgZHJvcE91dCcpLmVhY2goDQogIGZ1bmN0aW9uKGVmZmVjdCkgeyANCiAgICBFZmZlY3QuTWV0aG9kc1tlZmZlY3RdID0gZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucyl7DQogICAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICAgIEVmZmVjdFtlZmZlY3QuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBlZmZlY3Quc3Vic3RyaW5nKDEpXShlbGVtZW50LCBvcHRpb25zKTsNCiAgICAgIHJldHVybiBlbGVtZW50Ow0KICAgIH0NCiAgfQ0KKTsNCg0KJHcoJ2dldElubGluZU9wYWNpdHkgZm9yY2VSZXJlbmRlcmluZyBzZXRDb250ZW50Wm9vbSBjb2xsZWN0VGV4dE5vZGVzIGNvbGxlY3RUZXh0Tm9kZXNJZ25vcmVDbGFzcyBnZXRTdHlsZXMnKS5lYWNoKCANCiAgZnVuY3Rpb24oZikgeyBFZmZlY3QuTWV0aG9kc1tmXSA9IEVsZW1lbnRbZl07IH0NCik7DQoNCkVsZW1lbnQuYWRkTWV0aG9kcyhFZmZlY3QuTWV0aG9kcyk7DQovLyBzY3JpcHQuYWN1bG8udXMgY29udHJvbHMuanMgdjEuOC4xLCBUaHUgSmFuIDAzIDIyOjA3OjEyIC0wNTAwIDIwMDgNCg0KLy8gQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgVGhvbWFzIEZ1Y2hzIChodHRwOi8vc2NyaXB0LmFjdWxvLnVzLCBodHRwOi8vbWlyLmFjdWxvLnVzKQ0KLy8gICAgICAgICAgIChjKSAyMDA1LTIwMDcgSXZhbiBLcnN0aWMgKGh0dHA6Ly9ibG9ncy5sYXcuaGFydmFyZC5lZHUvaXZhbikNCi8vICAgICAgICAgICAoYykgMjAwNS0yMDA3IEpvbiBUaXJzZW4gKGh0dHA6Ly93d3cudGlyc2VuLmNvbSkNCi8vIENvbnRyaWJ1dG9yczoNCi8vICBSaWNoYXJkIExpdnNleQ0KLy8gIFJhaHVsIEJoYXJnYXZhDQovLyAgUm9iIFdpbGxzDQovLyANCi8vIHNjcmlwdC5hY3Vsby51cyBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZSB1bmRlciB0aGUgdGVybXMgb2YgYW4gTUlULXN0eWxlIGxpY2Vuc2UuDQovLyBGb3IgZGV0YWlscywgc2VlIHRoZSBzY3JpcHQuYWN1bG8udXMgd2ViIHNpdGU6IGh0dHA6Ly9zY3JpcHQuYWN1bG8udXMvDQoNCi8vIEF1dG9jb21wbGV0ZXIuQmFzZSBoYW5kbGVzIGFsbCB0aGUgYXV0b2NvbXBsZXRpb24gZnVuY3Rpb25hbGl0eSANCi8vIHRoYXQncyBpbmRlcGVuZGVudCBvZiB0aGUgZGF0YSBzb3VyY2UgZm9yIGF1dG9jb21wbGV0aW9uLiBUaGlzDQovLyBpbmNsdWRlcyBkcmF3aW5nIHRoZSBhdXRvY29tcGxldGlvbiBtZW51LCBvYnNlcnZpbmcga2V5Ym9hcmQNCi8vIGFuZCBtb3VzZSBldmVudHMsIGFuZCBzaW1pbGFyLg0KLy8NCi8vIFNwZWNpZmljIGF1dG9jb21wbGV0ZXJzIG5lZWQgdG8gcHJvdmlkZSwgYXQgdGhlIHZlcnkgbGVhc3QsIA0KLy8gYSBnZXRVcGRhdGVkQ2hvaWNlcyBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBldmVyeSB0aW1lDQovLyB0aGUgdGV4dCBpbnNpZGUgdGhlIG1vbml0b3JlZCB0ZXh0Ym94IGNoYW5nZXMuIFRoaXMgbWV0aG9kIA0KLy8gc2hvdWxkIGdldCB0aGUgdGV4dCBmb3Igd2hpY2ggdG8gcHJvdmlkZSBhdXRvY29tcGxldGlvbiBieQ0KLy8gaW52b2tpbmcgdGhpcy5nZXRUb2tlbigpLCBOT1QgYnkgZGlyZWN0bHkgYWNjZXNzaW5nDQovLyB0aGlzLmVsZW1lbnQudmFsdWUuIFRoaXMgaXMgdG8gYWxsb3cgaW5jcmVtZW50YWwgdG9rZW5pemVkDQovLyBhdXRvY29tcGxldGlvbi4gU3BlY2lmaWMgYXV0by1jb21wbGV0aW9uIGxvZ2ljIChBSkFYLCBldGMpDQovLyBiZWxvbmdzIGluIGdldFVwZGF0ZWRDaG9pY2VzLg0KLy8NCi8vIFRva2VuaXplZCBpbmNyZW1lbnRhbCBhdXRvY29tcGxldGlvbiBpcyBlbmFibGVkIGF1dG9tYXRpY2FsbHkNCi8vIHdoZW4gYW4gYXV0b2NvbXBsZXRlciBpcyBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgJ3Rva2Vucycgb3B0aW9uDQovLyBpbiB0aGUgb3B0aW9ucyBwYXJhbWV0ZXIsIGUuZy46DQovLyBuZXcgQWpheC5BdXRvY29tcGxldGVyKCdpZCcsJ3VwZCcsICcvdXJsLycsIHsgdG9rZW5zOiAnLCcgfSk7DQovLyB3aWxsIGluY3JlbWVudGFsbHkgYXV0b2NvbXBsZXRlIHdpdGggYSBjb21tYSBhcyB0aGUgdG9rZW4uDQovLyBBZGRpdGlvbmFsbHksICcsJyBpbiB0aGUgYWJvdmUgZXhhbXBsZSBjYW4gYmUgcmVwbGFjZWQgd2l0aA0KLy8gYSB0b2tlbiBhcnJheSwgZS5nLiB7IHRva2VuczogWycsJywgJ1xuJ10gfSB3aGljaA0KLy8gZW5hYmxlcyBhdXRvY29tcGxldGlvbiBvbiBtdWx0aXBsZSB0b2tlbnMuIFRoaXMgaXMgbW9zdCANCi8vIHVzZWZ1bCB3aGVuIG9uZSBvZiB0aGUgdG9rZW5zIGlzIFxuIChhIG5ld2xpbmUpLCBhcyBpdCANCi8vIGFsbG93cyBzbWFydCBhdXRvY29tcGxldGlvbiBhZnRlciBsaW5lYnJlYWtzLg0KDQppZih0eXBlb2YgRWZmZWN0ID09ICd1bmRlZmluZWQnKQ0KICB0aHJvdygiY29udHJvbHMuanMgcmVxdWlyZXMgaW5jbHVkaW5nIHNjcmlwdC5hY3Vsby51cycgZWZmZWN0cy5qcyBsaWJyYXJ5Iik7DQoNCnZhciBBdXRvY29tcGxldGVyID0geyB9DQpBdXRvY29tcGxldGVyLkJhc2UgPSBDbGFzcy5jcmVhdGUoew0KICBiYXNlSW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCwgdXBkYXRlLCBvcHRpb25zKSB7DQogICAgZWxlbWVudCAgICAgICAgICA9ICQoZWxlbWVudCkNCiAgICB0aGlzLmVsZW1lbnQgICAgID0gZWxlbWVudDsgDQogICAgdGhpcy51cGRhdGUgICAgICA9ICQodXBkYXRlKTsgIA0KICAgIHRoaXMuaGFzRm9jdXMgICAgPSBmYWxzZTsgDQogICAgdGhpcy5jaGFuZ2VkICAgICA9IGZhbHNlOyANCiAgICB0aGlzLmFjdGl2ZSAgICAgID0gZmFsc2U7IA0KICAgIHRoaXMuaW5kZXggICAgICAgPSAwOyAgICAgDQogICAgdGhpcy5lbnRyeUNvdW50ICA9IDA7DQogICAgdGhpcy5vbGRFbGVtZW50VmFsdWUgPSB0aGlzLmVsZW1lbnQudmFsdWU7DQoNCiAgICBpZih0aGlzLnNldE9wdGlvbnMpDQogICAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7DQogICAgZWxzZQ0KICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7IH07DQoNCiAgICB2YXIgYlNldFdpZHRoID0gdHJ1ZTsNCiAgICBpZiAoIHR5cGVvZiggdGhpcy5vcHRpb25zLnNldFdpZHRoICkgIT0gJ3VuZGVmaW5lZCcgKQ0KICAgICAgYlNldFdpZHRoID0gdGhpcy5vcHRpb25zLnNldFdpZHRoOw0KICAgIA0KICAgIHRoaXMub3B0aW9ucy5wYXJhbU5hbWUgICAgPSB0aGlzLm9wdGlvbnMucGFyYW1OYW1lIHx8IHRoaXMuZWxlbWVudC5uYW1lOw0KICAgIHRoaXMub3B0aW9ucy50b2tlbnMgICAgICAgPSB0aGlzLm9wdGlvbnMudG9rZW5zIHx8IFtdOw0KICAgIHRoaXMub3B0aW9ucy5mcmVxdWVuY3kgICAgPSB0aGlzLm9wdGlvbnMuZnJlcXVlbmN5IHx8IDAuNDsNCiAgICB0aGlzLm9wdGlvbnMubWluQ2hhcnMgICAgID0gdGhpcy5vcHRpb25zLm1pbkNoYXJzIHx8IDE7DQogICAgdGhpcy5vcHRpb25zLm9uU2hvdyAgICAgICA9IHRoaXMub3B0aW9ucy5vblNob3cgfHwgDQogICAgICBmdW5jdGlvbihlbGVtZW50LCB1cGRhdGUpeyANCiAgICAgICAgaWYoIXVwZGF0ZS5zdHlsZS5wb3NpdGlvbiB8fCB1cGRhdGUuc3R5bGUucG9zaXRpb249PSdhYnNvbHV0ZScpIHsNCiAgICAgICAgICB1cGRhdGUuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOw0KICAgICAgICAgIFBvc2l0aW9uLmNsb25lKGVsZW1lbnQsIHVwZGF0ZSwgew0KICAgICAgICAgICAgc2V0SGVpZ2h0OiBmYWxzZSwgDQogICAgICAgICAgICBzZXRXaWR0aDogYlNldFdpZHRoLA0KICAgICAgICAgICAgb2Zmc2V0VG9wOiBlbGVtZW50Lm9mZnNldEhlaWdodA0KICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICAgIEVmZmVjdC5BcHBlYXIodXBkYXRlLHtkdXJhdGlvbjowLjE1fSk7DQogICAgICB9Ow0KICAgIHRoaXMub3B0aW9ucy5vbkhpZGUgPSB0aGlzLm9wdGlvbnMub25IaWRlIHx8IA0KICAgICAgZnVuY3Rpb24oZWxlbWVudCwgdXBkYXRlKXsgbmV3IEVmZmVjdC5GYWRlKHVwZGF0ZSx7ZHVyYXRpb246MC4xNX0pIH07DQoNCiAgICBpZih0eXBlb2YodGhpcy5vcHRpb25zLnRva2VucykgPT0gJ3N0cmluZycpIA0KICAgICAgdGhpcy5vcHRpb25zLnRva2VucyA9IG5ldyBBcnJheSh0aGlzLm9wdGlvbnMudG9rZW5zKTsNCiAgICAvLyBGb3JjZSBjYXJyaWFnZSByZXR1cm5zIGFzIHRva2VuIGRlbGltaXRlcnMgYW55d2F5DQogICAgaWYgKCF0aGlzLm9wdGlvbnMudG9rZW5zLmluY2x1ZGUoJ1xuJykpDQogICAgICB0aGlzLm9wdGlvbnMudG9rZW5zLnB1c2goJ1xuJyk7DQoNCiAgICB0aGlzLm9ic2VydmVyID0gbnVsbDsNCiAgICANCiAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCdhdXRvY29tcGxldGUnLCdvZmYnKTsNCg0KICAgIEVsZW1lbnQuaGlkZSh0aGlzLnVwZGF0ZSk7DQoNCiAgICBFdmVudC5vYnNlcnZlKHRoaXMuZWxlbWVudCwgJ2JsdXInLCB0aGlzLm9uQmx1ci5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpKTsNCiAgICBFdmVudC5vYnNlcnZlKHRoaXMuZWxlbWVudCwgJ2tleWRvd24nLCB0aGlzLm9uS2V5UHJlc3MuYmluZEFzRXZlbnRMaXN0ZW5lcih0aGlzKSk7DQogIH0sDQoNCiAgc2hvdzogZnVuY3Rpb24oKSB7DQogICAgaWYoRWxlbWVudC5nZXRTdHlsZSh0aGlzLnVwZGF0ZSwgJ2Rpc3BsYXknKT09J25vbmUnKSB0aGlzLm9wdGlvbnMub25TaG93KHRoaXMuZWxlbWVudCwgdGhpcy51cGRhdGUpOw0KICAgIGlmKCF0aGlzLmllZml4ICYmIA0KICAgICAgKFByb3RvdHlwZS5Ccm93c2VyLklFKSAmJg0KICAgICAgKEVsZW1lbnQuZ2V0U3R5bGUodGhpcy51cGRhdGUsICdwb3NpdGlvbicpPT0nYWJzb2x1dGUnKSkgew0KICAgICAgbmV3IEluc2VydGlvbi5BZnRlcih0aGlzLnVwZGF0ZSwgDQogICAgICAgJzxpZnJhbWUgaWQ9IicgKyB0aGlzLnVwZGF0ZS5pZCArICdfaWVmaXgiICcrDQogICAgICAgJ3N0eWxlPSJkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5BbHBoYShvcGFjaXR5PTApOyIgJyArDQogICAgICAgJ3NyYz0iamF2YXNjcmlwdDpmYWxzZTsiIGZyYW1lYm9yZGVyPSIwIiBzY3JvbGxpbmc9Im5vIj48L2lmcmFtZT4nKTsNCiAgICAgIHRoaXMuaWVmaXggPSAkKHRoaXMudXBkYXRlLmlkKydfaWVmaXgnKTsNCiAgICB9DQogICAgaWYodGhpcy5pZWZpeCkgc2V0VGltZW91dCh0aGlzLmZpeElFT3ZlcmxhcHBpbmcuYmluZCh0aGlzKSwgNTApOw0KICB9LA0KICANCiAgZml4SUVPdmVybGFwcGluZzogZnVuY3Rpb24oKSB7DQogICAgUG9zaXRpb24uY2xvbmUodGhpcy51cGRhdGUsIHRoaXMuaWVmaXgsIHtzZXRUb3A6KCF0aGlzLnVwZGF0ZS5zdHlsZS5oZWlnaHQpfSk7DQogICAgdGhpcy5pZWZpeC5zdHlsZS56SW5kZXggPSAxOw0KICAgIHRoaXMudXBkYXRlLnN0eWxlLnpJbmRleCA9IDI7DQogICAgRWxlbWVudC5zaG93KHRoaXMuaWVmaXgpOw0KICB9LA0KDQogIGhpZGU6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuc3RvcEluZGljYXRvcigpOw0KICAgIGlmKEVsZW1lbnQuZ2V0U3R5bGUodGhpcy51cGRhdGUsICdkaXNwbGF5JykhPSdub25lJykgdGhpcy5vcHRpb25zLm9uSGlkZSh0aGlzLmVsZW1lbnQsIHRoaXMudXBkYXRlKTsNCiAgICBpZih0aGlzLmllZml4KSBFbGVtZW50LmhpZGUodGhpcy5pZWZpeCk7DQogIH0sDQoNCiAgc3RhcnRJbmRpY2F0b3I6IGZ1bmN0aW9uKCkgew0KICAgIGlmKHRoaXMub3B0aW9ucy5pbmRpY2F0b3IpIEVsZW1lbnQuc2hvdyh0aGlzLm9wdGlvbnMuaW5kaWNhdG9yKTsNCiAgfSwNCg0KICBzdG9wSW5kaWNhdG9yOiBmdW5jdGlvbigpIHsNCiAgICBpZih0aGlzLm9wdGlvbnMuaW5kaWNhdG9yKSBFbGVtZW50LmhpZGUodGhpcy5vcHRpb25zLmluZGljYXRvcik7DQogIH0sDQoNCiAgb25LZXlQcmVzczogZnVuY3Rpb24oZXZlbnQpIHsNCiAgICBpZih0aGlzLmFjdGl2ZSkNCiAgICAgIHN3aXRjaChldmVudC5rZXlDb2RlKSB7DQogICAgICAgY2FzZSBFdmVudC5LRVlfVEFCOg0KICAgICAgIGNhc2UgRXZlbnQuS0VZX1JFVFVSTjoNCiAgICAgICAgIHRoaXMuc2VsZWN0RW50cnkoKTsNCiAgICAgICAgIEV2ZW50LnN0b3AoZXZlbnQpOw0KICAgICAgIGNhc2UgRXZlbnQuS0VZX0VTQzoNCiAgICAgICAgIHRoaXMuaGlkZSgpOw0KICAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTsNCiAgICAgICAgIEV2ZW50LnN0b3AoZXZlbnQpOw0KICAgICAgICAgcmV0dXJuOw0KICAgICAgIGNhc2UgRXZlbnQuS0VZX0xFRlQ6DQogICAgICAgY2FzZSBFdmVudC5LRVlfUklHSFQ6DQogICAgICAgICByZXR1cm47DQogICAgICAgY2FzZSBFdmVudC5LRVlfVVA6DQogICAgICAgICB0aGlzLm1hcmtQcmV2aW91cygpOw0KICAgICAgICAgdGhpcy5yZW5kZXIoKTsNCiAgICAgICAgIEV2ZW50LnN0b3AoZXZlbnQpOw0KICAgICAgICAgcmV0dXJuOw0KICAgICAgIGNhc2UgRXZlbnQuS0VZX0RPV046DQogICAgICAgICB0aGlzLm1hcmtOZXh0KCk7DQogICAgICAgICB0aGlzLnJlbmRlcigpOw0KICAgICAgICAgRXZlbnQuc3RvcChldmVudCk7DQogICAgICAgICByZXR1cm47DQogICAgICB9DQogICAgIGVsc2UgDQogICAgICAgaWYoZXZlbnQua2V5Q29kZT09RXZlbnQuS0VZX1RBQiB8fCBldmVudC5rZXlDb2RlPT1FdmVudC5LRVlfUkVUVVJOIHx8IA0KICAgICAgICAgKFByb3RvdHlwZS5Ccm93c2VyLldlYktpdCA+IDAgJiYgZXZlbnQua2V5Q29kZSA9PSAwKSkgcmV0dXJuOw0KDQogICAgdGhpcy5jaGFuZ2VkID0gdHJ1ZTsNCiAgICB0aGlzLmhhc0ZvY3VzID0gdHJ1ZTsNCg0KICAgIGlmKHRoaXMub2JzZXJ2ZXIpIGNsZWFyVGltZW91dCh0aGlzLm9ic2VydmVyKTsNCiAgICAgIHRoaXMub2JzZXJ2ZXIgPSANCiAgICAgICAgc2V0VGltZW91dCh0aGlzLm9uT2JzZXJ2ZXJFdmVudC5iaW5kKHRoaXMpLCB0aGlzLm9wdGlvbnMuZnJlcXVlbmN5KjEwMDApOw0KICB9LA0KDQogIGFjdGl2YXRlOiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLmNoYW5nZWQgPSBmYWxzZTsNCiAgICB0aGlzLmhhc0ZvY3VzID0gdHJ1ZTsNCiAgICB0aGlzLmdldFVwZGF0ZWRDaG9pY2VzKCk7DQogIH0sDQoNCiAgb25Ib3ZlcjogZnVuY3Rpb24oZXZlbnQpIHsNCiAgICB2YXIgZWxlbWVudCA9IEV2ZW50LmZpbmRFbGVtZW50KGV2ZW50LCAnTEknKTsNCiAgICBpZih0aGlzLmluZGV4ICE9IGVsZW1lbnQuYXV0b2NvbXBsZXRlSW5kZXgpIA0KICAgIHsNCiAgICAgICAgdGhpcy5pbmRleCA9IGVsZW1lbnQuYXV0b2NvbXBsZXRlSW5kZXg7DQogICAgICAgIHRoaXMucmVuZGVyKCk7DQogICAgfQ0KICAgIEV2ZW50LnN0b3AoZXZlbnQpOw0KICB9LA0KICANCiAgb25DbGljazogZnVuY3Rpb24oZXZlbnQpIHsNCiAgICB2YXIgZWxlbWVudCA9IEV2ZW50LmZpbmRFbGVtZW50KGV2ZW50LCAnTEknKTsNCiAgICB0aGlzLmluZGV4ID0gZWxlbWVudC5hdXRvY29tcGxldGVJbmRleDsNCiAgICB0aGlzLnNlbGVjdEVudHJ5KCk7DQogICAgdGhpcy5oaWRlKCk7DQogIH0sDQogIA0KICBvbkJsdXI6IGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgLy8gbmVlZGVkIHRvIG1ha2UgY2xpY2sgZXZlbnRzIHdvcmtpbmcNCiAgICBzZXRUaW1lb3V0KHRoaXMuaGlkZS5iaW5kKHRoaXMpLCAyNTApOw0KICAgIHRoaXMuaGFzRm9jdXMgPSBmYWxzZTsNCiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOyAgICAgDQogIH0sIA0KICANCiAgcmVuZGVyOiBmdW5jdGlvbigpIHsNCiAgICBpZih0aGlzLmVudHJ5Q291bnQgPiAwKSB7DQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZW50cnlDb3VudDsgaSsrKQ0KICAgICAgICB0aGlzLmluZGV4PT1pID8gDQogICAgICAgICAgRWxlbWVudC5hZGRDbGFzc05hbWUodGhpcy5nZXRFbnRyeShpKSwic2VsZWN0ZWQiKSA6IA0KICAgICAgICAgIEVsZW1lbnQucmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZ2V0RW50cnkoaSksInNlbGVjdGVkIik7DQogICAgICBpZih0aGlzLmhhc0ZvY3VzKSB7IA0KICAgICAgICB0aGlzLnNob3coKTsNCiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlOw0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOw0KICAgICAgdGhpcy5oaWRlKCk7DQogICAgfQ0KICB9LA0KICANCiAgbWFya1ByZXZpb3VzOiBmdW5jdGlvbigpIHsNCiAgICBpZih0aGlzLmluZGV4ID4gMCkgdGhpcy5pbmRleC0tDQogICAgICBlbHNlIHRoaXMuaW5kZXggPSB0aGlzLmVudHJ5Q291bnQtMTsNCiAgfSwNCiAgDQogIG1hcmtOZXh0OiBmdW5jdGlvbigpIHsNCiAgICBpZih0aGlzLmluZGV4IDwgdGhpcy5lbnRyeUNvdW50LTEpIHRoaXMuaW5kZXgrKw0KICAgICAgZWxzZSB0aGlzLmluZGV4ID0gMDsNCiAgfSwNCiAgDQogIGdldEVudHJ5OiBmdW5jdGlvbihpbmRleCkgew0KICAgIHJldHVybiAoaW5kZXggPj0gMCAmJiBpbmRleCA8PSB0aGlzLmVudHJ5Q291bnQgKSA/IHRoaXMudXBkYXRlLmZpcnN0Q2hpbGQuY2hpbGROb2Rlc1tpbmRleF0gOiBudWxsOw0KICB9LA0KICANCiAgZ2V0Q3VycmVudEVudHJ5OiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5nZXRFbnRyeSh0aGlzLmluZGV4KTsNCiAgfSwNCiAgDQogIHNlbGVjdEVudHJ5OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOw0KICAgIHRoaXMudXBkYXRlRWxlbWVudCh0aGlzLmdldEN1cnJlbnRFbnRyeSgpKTsNCiAgfSwNCg0KICB1cGRhdGVFbGVtZW50OiBmdW5jdGlvbihzZWxlY3RlZEVsZW1lbnQpIHsNCiAgICBpZiAodGhpcy5vcHRpb25zLnVwZGF0ZUVsZW1lbnQpIHsNCiAgICAgIHRoaXMub3B0aW9ucy51cGRhdGVFbGVtZW50KHNlbGVjdGVkRWxlbWVudCk7DQogICAgICByZXR1cm47DQogICAgfQ0KICAgIGlmICggc2VsZWN0ZWRFbGVtZW50ICkNCiAgICB7DQoJICAgIHZhciB2YWx1ZSA9ICcnOw0KCSAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVjdCkgew0KCSAgICAgIHZhciBub2RlcyA9ICQoc2VsZWN0ZWRFbGVtZW50KS5zZWxlY3QoJy4nICsgdGhpcy5vcHRpb25zLnNlbGVjdCkgfHwgW107DQoJICAgICAgaWYobm9kZXMubGVuZ3RoPjApIHZhbHVlID0gRWxlbWVudC5jb2xsZWN0VGV4dE5vZGVzKG5vZGVzWzBdLCB0aGlzLm9wdGlvbnMuc2VsZWN0KTsNCgkgICAgfSBlbHNlDQoJICAgICAgdmFsdWUgPSBFbGVtZW50LmNvbGxlY3RUZXh0Tm9kZXNJZ25vcmVDbGFzcyhzZWxlY3RlZEVsZW1lbnQsICdpbmZvcm1hbCcpOw0KCSAgICANCgkgICAgdmFyIGJvdW5kcyA9IHRoaXMuZ2V0VG9rZW5Cb3VuZHMoKTsNCgkgICAgaWYgKGJvdW5kc1swXSAhPSAtMSkgew0KCSAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuZWxlbWVudC52YWx1ZS5zdWJzdHIoMCwgYm91bmRzWzBdKTsNCgkgICAgICB2YXIgd2hpdGVzcGFjZSA9IHRoaXMuZWxlbWVudC52YWx1ZS5zdWJzdHIoYm91bmRzWzBdKS5tYXRjaCgvXlxzKy8pOw0KCSAgICAgIGlmICh3aGl0ZXNwYWNlKQ0KCSAgICAgICAgbmV3VmFsdWUgKz0gd2hpdGVzcGFjZVswXTsNCgkgICAgICB0aGlzLmVsZW1lbnQudmFsdWUgPSBuZXdWYWx1ZSArIHZhbHVlICsgdGhpcy5lbGVtZW50LnZhbHVlLnN1YnN0cihib3VuZHNbMV0pOw0KCSAgICB9IGVsc2Ugew0KCSAgICAgIHRoaXMuZWxlbWVudC52YWx1ZSA9IHZhbHVlOw0KCSAgICB9DQoJICAgIHRoaXMub2xkRWxlbWVudFZhbHVlID0gdGhpcy5lbGVtZW50LnZhbHVlOw0KCSAgICB0aGlzLmVsZW1lbnQuZm9jdXMoKTsNCiAgICB9DQogICAgDQogICAgaWYgKHRoaXMub3B0aW9ucy5hZnRlclVwZGF0ZUVsZW1lbnQpDQogICAgICB0aGlzLm9wdGlvbnMuYWZ0ZXJVcGRhdGVFbGVtZW50KHRoaXMuZWxlbWVudCwgc2VsZWN0ZWRFbGVtZW50KTsNCiAgfSwNCg0KICB1cGRhdGVDaG9pY2VzOiBmdW5jdGlvbihjaG9pY2VzKSB7DQogICAgaWYoIXRoaXMuY2hhbmdlZCAmJiB0aGlzLmhhc0ZvY3VzKSB7DQogICAgICB0aGlzLnVwZGF0ZS5pbm5lckhUTUwgPSBjaG9pY2VzOw0KICAgICAgRWxlbWVudC5jbGVhbldoaXRlc3BhY2UodGhpcy51cGRhdGUpOw0KICAgICAgRWxlbWVudC5jbGVhbldoaXRlc3BhY2UodGhpcy51cGRhdGUuZG93bigpKTsNCg0KICAgICAgaWYodGhpcy51cGRhdGUuZmlyc3RDaGlsZCAmJiB0aGlzLnVwZGF0ZS5kb3duKCkuY2hpbGROb2Rlcykgew0KICAgICAgICB0aGlzLmVudHJ5Q291bnQgPSANCiAgICAgICAgICB0aGlzLnVwZGF0ZS5kb3duKCkuY2hpbGROb2Rlcy5sZW5ndGg7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbnRyeUNvdW50OyBpKyspIHsNCiAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLmdldEVudHJ5KGkpOw0KICAgICAgICAgIGVudHJ5LmF1dG9jb21wbGV0ZUluZGV4ID0gaTsNCiAgICAgICAgICB0aGlzLmFkZE9ic2VydmVycyhlbnRyeSk7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7IA0KICAgICAgICB0aGlzLmVudHJ5Q291bnQgPSAwOw0KICAgICAgfQ0KDQogICAgICB0aGlzLnN0b3BJbmRpY2F0b3IoKTsNCiAgICAgIHRoaXMuaW5kZXggPSAoIHRoaXMub3B0aW9ucy5hbGxvd0ZyZWVFbnRyeSA/IC0xIDogMCApOw0KICAgICAgDQogICAgICBpZih0aGlzLmVudHJ5Q291bnQ9PTEgJiYgdGhpcy5vcHRpb25zLmF1dG9TZWxlY3QpIHsNCiAgICAgICAgdGhpcy5zZWxlY3RFbnRyeSgpOw0KICAgICAgICB0aGlzLmhpZGUoKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMucmVuZGVyKCk7DQogICAgICB9DQogICAgfQ0KICB9LA0KDQogIGFkZE9ic2VydmVyczogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIEV2ZW50Lm9ic2VydmUoZWxlbWVudCwgIm1vdXNlb3ZlciIsIHRoaXMub25Ib3Zlci5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpKTsNCiAgICBFdmVudC5vYnNlcnZlKGVsZW1lbnQsICJjbGljayIsIHRoaXMub25DbGljay5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpKTsNCiAgfSwNCg0KICBvbk9ic2VydmVyRXZlbnQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuY2hhbmdlZCA9IGZhbHNlOyAgIA0KICAgIHRoaXMudG9rZW5Cb3VuZHMgPSBudWxsOw0KICAgIGlmKHRoaXMuZ2V0VG9rZW4oKS5sZW5ndGg+PXRoaXMub3B0aW9ucy5taW5DaGFycykgew0KICAgICAgdGhpcy5nZXRVcGRhdGVkQ2hvaWNlcygpOw0KICAgIH0gZWxzZSB7DQogICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOw0KICAgICAgdGhpcy5oaWRlKCk7DQogICAgfQ0KICAgIHRoaXMub2xkRWxlbWVudFZhbHVlID0gdGhpcy5lbGVtZW50LnZhbHVlOw0KICB9LA0KDQogIGdldFRva2VuOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgYm91bmRzID0gdGhpcy5nZXRUb2tlbkJvdW5kcygpOw0KICAgIHJldHVybiB0aGlzLmVsZW1lbnQudmFsdWUuc3Vic3RyaW5nKGJvdW5kc1swXSwgYm91bmRzWzFdKS5zdHJpcCgpOw0KICB9LA0KDQogIGdldFRva2VuQm91bmRzOiBmdW5jdGlvbigpIHsNCiAgICBpZiAobnVsbCAhPSB0aGlzLnRva2VuQm91bmRzKSByZXR1cm4gdGhpcy50b2tlbkJvdW5kczsNCiAgICB2YXIgdmFsdWUgPSB0aGlzLmVsZW1lbnQudmFsdWU7DQogICAgaWYgKHZhbHVlLnN0cmlwKCkuZW1wdHkoKSkgcmV0dXJuIFstMSwgMF07DQogICAgdmFyIGRpZmYgPSBhcmd1bWVudHMuY2FsbGVlLmdldEZpcnN0RGlmZmVyZW5jZVBvcyh2YWx1ZSwgdGhpcy5vbGRFbGVtZW50VmFsdWUpOw0KICAgIHZhciBvZmZzZXQgPSAoZGlmZiA9PSB0aGlzLm9sZEVsZW1lbnRWYWx1ZS5sZW5ndGggPyAxIDogMCk7DQogICAgdmFyIHByZXZUb2tlblBvcyA9IC0xLCBuZXh0VG9rZW5Qb3MgPSB2YWx1ZS5sZW5ndGg7DQogICAgdmFyIHRwOw0KICAgIGZvciAodmFyIGluZGV4ID0gMCwgbCA9IHRoaXMub3B0aW9ucy50b2tlbnMubGVuZ3RoOyBpbmRleCA8IGw7ICsraW5kZXgpIHsNCiAgICAgIHRwID0gdmFsdWUubGFzdEluZGV4T2YodGhpcy5vcHRpb25zLnRva2Vuc1tpbmRleF0sIGRpZmYgKyBvZmZzZXQgLSAxKTsNCiAgICAgIGlmICh0cCA+IHByZXZUb2tlblBvcykgcHJldlRva2VuUG9zID0gdHA7DQogICAgICB0cCA9IHZhbHVlLmluZGV4T2YodGhpcy5vcHRpb25zLnRva2Vuc1tpbmRleF0sIGRpZmYgKyBvZmZzZXQpOw0KICAgICAgaWYgKC0xICE9IHRwICYmIHRwIDwgbmV4dFRva2VuUG9zKSBuZXh0VG9rZW5Qb3MgPSB0cDsNCiAgICB9DQogICAgcmV0dXJuICh0aGlzLnRva2VuQm91bmRzID0gW3ByZXZUb2tlblBvcyArIDEsIG5leHRUb2tlblBvc10pOw0KICB9DQp9KTsNCg0KQXV0b2NvbXBsZXRlci5CYXNlLnByb3RvdHlwZS5nZXRUb2tlbkJvdW5kcy5nZXRGaXJzdERpZmZlcmVuY2VQb3MgPSBmdW5jdGlvbihuZXdTLCBvbGRTKSB7DQogIHZhciBib3VuZGFyeSA9IE1hdGgubWluKG5ld1MubGVuZ3RoLCBvbGRTLmxlbmd0aCk7DQogIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBib3VuZGFyeTsgKytpbmRleCkNCiAgICBpZiAobmV3U1tpbmRleF0gIT0gb2xkU1tpbmRleF0pDQogICAgICByZXR1cm4gaW5kZXg7DQogIHJldHVybiBib3VuZGFyeTsNCn07DQoNCkFqYXguQXV0b2NvbXBsZXRlciA9IENsYXNzLmNyZWF0ZShBdXRvY29tcGxldGVyLkJhc2UsIHsNCiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWxlbWVudCwgdXBkYXRlLCB1cmwsIG9wdGlvbnMpIHsNCiAgICB0aGlzLmJhc2VJbml0aWFsaXplKGVsZW1lbnQsIHVwZGF0ZSwgb3B0aW9ucyk7DQogICAgdGhpcy5vcHRpb25zLmFzeW5jaHJvbm91cyAgPSB0cnVlOw0KICAgIHRoaXMub3B0aW9ucy5vbkNvbXBsZXRlICAgID0gdGhpcy5vbkNvbXBsZXRlLmJpbmQodGhpcyk7DQogICAgdGhpcy5vcHRpb25zLmRlZmF1bHRQYXJhbXMgPSB0aGlzLm9wdGlvbnMucGFyYW1ldGVycyB8fCBudWxsOw0KICAgIHRoaXMudXJsICAgICAgICAgICAgICAgICAgID0gdXJsOw0KICB9LA0KDQogIGdldFVwZGF0ZWRDaG9pY2VzOiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLnN0YXJ0SW5kaWNhdG9yKCk7DQogICAgDQogICAgdmFyIGVudHJ5ID0gZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMub3B0aW9ucy5wYXJhbU5hbWUpICsgJz0nICsgDQogICAgICBlbmNvZGVVUklDb21wb25lbnQodGhpcy5nZXRUb2tlbigpKTsNCg0KICAgIHRoaXMub3B0aW9ucy5wYXJhbWV0ZXJzID0gdGhpcy5vcHRpb25zLmNhbGxiYWNrID8NCiAgICAgIHRoaXMub3B0aW9ucy5jYWxsYmFjayh0aGlzLmVsZW1lbnQsIGVudHJ5KSA6IGVudHJ5Ow0KDQogICAgaWYodGhpcy5vcHRpb25zLmRlZmF1bHRQYXJhbXMpIA0KICAgICAgdGhpcy5vcHRpb25zLnBhcmFtZXRlcnMgKz0gJyYnICsgdGhpcy5vcHRpb25zLmRlZmF1bHRQYXJhbXM7DQogICAgDQogICAgbmV3IEFqYXguUmVxdWVzdCh0aGlzLnVybCwgdGhpcy5vcHRpb25zKTsNCiAgfSwNCg0KICBvbkNvbXBsZXRlOiBmdW5jdGlvbihyZXF1ZXN0KSB7DQogICAgdGhpcy51cGRhdGVDaG9pY2VzKHJlcXVlc3QucmVzcG9uc2VUZXh0KTsNCiAgfQ0KfSk7DQoNCi8vIFRoZSBsb2NhbCBhcnJheSBhdXRvY29tcGxldGVyLiBVc2VkIHdoZW4geW91J2QgcHJlZmVyIHRvDQovLyBpbmplY3QgYW4gYXJyYXkgb2YgYXV0b2NvbXBsZXRpb24gb3B0aW9ucyBpbnRvIHRoZSBwYWdlLCByYXRoZXINCi8vIHRoYW4gc2VuZGluZyBvdXQgQWpheCBxdWVyaWVzLCB3aGljaCBjYW4gYmUgcXVpdGUgc2xvdyBzb21ldGltZXMuDQovLw0KLy8gVGhlIGNvbnN0cnVjdG9yIHRha2VzIGZvdXIgcGFyYW1ldGVycy4gVGhlIGZpcnN0IHR3byBhcmUsIGFzIHVzdWFsLA0KLy8gdGhlIGlkIG9mIHRoZSBtb25pdG9yZWQgdGV4dGJveCwgYW5kIGlkIG9mIHRoZSBhdXRvY29tcGxldGlvbiBtZW51Lg0KLy8gVGhlIHRoaXJkIGlzIHRoZSBhcnJheSB5b3Ugd2FudCB0byBhdXRvY29tcGxldGUgZnJvbSwgYW5kIHRoZSBmb3VydGgNCi8vIGlzIHRoZSBvcHRpb25zIGJsb2NrLg0KLy8NCi8vIEV4dHJhIGxvY2FsIGF1dG9jb21wbGV0aW9uIG9wdGlvbnM6DQovLyAtIGNob2ljZXMgLSBIb3cgbWFueSBhdXRvY29tcGxldGlvbiBjaG9pY2VzIHRvIG9mZmVyDQovLw0KLy8gLSBwYXJ0aWFsU2VhcmNoIC0gSWYgZmFsc2UsIHRoZSBhdXRvY29tcGxldGVyIHdpbGwgbWF0Y2ggZW50ZXJlZA0KLy8gICAgICAgICAgICAgICAgICAgIHRleHQgb25seSBhdCB0aGUgYmVnaW5uaW5nIG9mIHN0cmluZ3MgaW4gdGhlIA0KLy8gICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZSBhcnJheS4gRGVmYXVsdHMgdG8gdHJ1ZSwgd2hpY2ggd2lsbA0KLy8gICAgICAgICAgICAgICAgICAgIG1hdGNoIHRleHQgYXQgdGhlIGJlZ2lubmluZyBvZiBhbnkgKndvcmQqIGluIHRoZQ0KLy8gICAgICAgICAgICAgICAgICAgIHN0cmluZ3MgaW4gdGhlIGF1dG9jb21wbGV0ZSBhcnJheS4gSWYgeW91IHdhbnQgdG8NCi8vICAgICAgICAgICAgICAgICAgICBzZWFyY2ggYW55d2hlcmUgaW4gdGhlIHN0cmluZywgYWRkaXRpb25hbGx5IHNldA0KLy8gICAgICAgICAgICAgICAgICAgIHRoZSBvcHRpb24gZnVsbFNlYXJjaCB0byB0cnVlIChkZWZhdWx0OiBvZmYpLg0KLy8NCi8vIC0gZnVsbFNzZWFyY2ggLSBTZWFyY2ggYW55d2hlcmUgaW4gYXV0b2NvbXBsZXRlIGFycmF5IHN0cmluZ3MuDQovLw0KLy8gLSBwYXJ0aWFsQ2hhcnMgLSBIb3cgbWFueSBjaGFyYWN0ZXJzIHRvIGVudGVyIGJlZm9yZSB0cmlnZ2VyaW5nDQovLyAgICAgICAgICAgICAgICAgICBhIHBhcnRpYWwgbWF0Y2ggKHVubGlrZSBtaW5DaGFycywgd2hpY2ggZGVmaW5lcw0KLy8gICAgICAgICAgICAgICAgICAgaG93IG1hbnkgY2hhcmFjdGVycyBhcmUgcmVxdWlyZWQgdG8gZG8gYW55IG1hdGNoDQovLyAgICAgICAgICAgICAgICAgICBhdCBhbGwpLiBEZWZhdWx0cyB0byAyLg0KLy8NCi8vIC0gaWdub3JlQ2FzZSAtIFdoZXRoZXIgdG8gaWdub3JlIGNhc2Ugd2hlbiBhdXRvY29tcGxldGluZy4NCi8vICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byB0cnVlLg0KLy8NCi8vIEl0J3MgcG9zc2libGUgdG8gcGFzcyBpbiBhIGN1c3RvbSBmdW5jdGlvbiBhcyB0aGUgJ3NlbGVjdG9yJyANCi8vIG9wdGlvbiwgaWYgeW91IHByZWZlciB0byB3cml0ZSB5b3VyIG93biBhdXRvY29tcGxldGlvbiBsb2dpYy4NCi8vIEluIHRoYXQgY2FzZSwgdGhlIG90aGVyIG9wdGlvbnMgYWJvdmUgd2lsbCBub3QgYXBwbHkgdW5sZXNzDQovLyB5b3Ugc3VwcG9ydCB0aGVtLg0KDQpBdXRvY29tcGxldGVyLkxvY2FsID0gQ2xhc3MuY3JlYXRlKEF1dG9jb21wbGV0ZXIuQmFzZSwgew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCB1cGRhdGUsIGFycmF5LCBvcHRpb25zKSB7DQogICAgdGhpcy5iYXNlSW5pdGlhbGl6ZShlbGVtZW50LCB1cGRhdGUsIG9wdGlvbnMpOw0KICAgIHRoaXMub3B0aW9ucy5hcnJheSA9IGFycmF5Ow0KICB9LA0KDQogIGdldFVwZGF0ZWRDaG9pY2VzOiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLnVwZGF0ZUNob2ljZXModGhpcy5vcHRpb25zLnNlbGVjdG9yKHRoaXMpKTsNCiAgfSwNCg0KICBzZXRPcHRpb25zOiBmdW5jdGlvbihvcHRpb25zKSB7DQogICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7DQogICAgICBjaG9pY2VzOiAxMCwNCiAgICAgIHBhcnRpYWxTZWFyY2g6IHRydWUsDQogICAgICBwYXJ0aWFsQ2hhcnM6IDIsDQogICAgICBpZ25vcmVDYXNlOiB0cnVlLA0KICAgICAgZnVsbFNlYXJjaDogZmFsc2UsDQogICAgICBzZWxlY3RvcjogZnVuY3Rpb24oaW5zdGFuY2UpIHsNCiAgICAgICAgdmFyIHJldCAgICAgICA9IFtdOyAvLyBCZWdpbm5pbmcgbWF0Y2hlcw0KICAgICAgICB2YXIgcGFydGlhbCAgID0gW107IC8vIEluc2lkZSBtYXRjaGVzDQogICAgICAgIHZhciBlbnRyeSAgICAgPSBpbnN0YW5jZS5nZXRUb2tlbigpOw0KICAgICAgICB2YXIgY291bnQgICAgID0gMDsNCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluc3RhbmNlLm9wdGlvbnMuYXJyYXkubGVuZ3RoICYmICANCiAgICAgICAgICByZXQubGVuZ3RoIDwgaW5zdGFuY2Uub3B0aW9ucy5jaG9pY2VzIDsgaSsrKSB7IA0KDQogICAgICAgICAgdmFyIGVsZW0gPSBpbnN0YW5jZS5vcHRpb25zLmFycmF5W2ldOw0KICAgICAgICAgIHZhciBmb3VuZFBvcyA9IGluc3RhbmNlLm9wdGlvbnMuaWdub3JlQ2FzZSA/IA0KICAgICAgICAgICAgZWxlbS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZW50cnkudG9Mb3dlckNhc2UoKSkgOiANCiAgICAgICAgICAgIGVsZW0uaW5kZXhPZihlbnRyeSk7DQoNCiAgICAgICAgICB3aGlsZSAoZm91bmRQb3MgIT0gLTEpIHsNCiAgICAgICAgICAgIGlmIChmb3VuZFBvcyA9PSAwICYmIGVsZW0ubGVuZ3RoICE9IGVudHJ5Lmxlbmd0aCkgeyANCiAgICAgICAgICAgICAgcmV0LnB1c2goIjxsaT48c3Ryb25nPiIgKyBlbGVtLnN1YnN0cigwLCBlbnRyeS5sZW5ndGgpICsgIjwvc3Ryb25nPiIgKyANCiAgICAgICAgICAgICAgICBlbGVtLnN1YnN0cihlbnRyeS5sZW5ndGgpICsgIjwvbGk+Iik7DQogICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5sZW5ndGggPj0gaW5zdGFuY2Uub3B0aW9ucy5wYXJ0aWFsQ2hhcnMgJiYgDQogICAgICAgICAgICAgIGluc3RhbmNlLm9wdGlvbnMucGFydGlhbFNlYXJjaCAmJiBmb3VuZFBvcyAhPSAtMSkgew0KICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uub3B0aW9ucy5mdWxsU2VhcmNoIHx8IC9ccy8udGVzdChlbGVtLnN1YnN0cihmb3VuZFBvcy0xLDEpKSkgew0KICAgICAgICAgICAgICAgIHBhcnRpYWwucHVzaCgiPGxpPiIgKyBlbGVtLnN1YnN0cigwLCBmb3VuZFBvcykgKyAiPHN0cm9uZz4iICsNCiAgICAgICAgICAgICAgICAgIGVsZW0uc3Vic3RyKGZvdW5kUG9zLCBlbnRyeS5sZW5ndGgpICsgIjwvc3Ryb25nPiIgKyBlbGVtLnN1YnN0cigNCiAgICAgICAgICAgICAgICAgIGZvdW5kUG9zICsgZW50cnkubGVuZ3RoKSArICI8L2xpPiIpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZvdW5kUG9zID0gaW5zdGFuY2Uub3B0aW9ucy5pZ25vcmVDYXNlID8gDQogICAgICAgICAgICAgIGVsZW0udG9Mb3dlckNhc2UoKS5pbmRleE9mKGVudHJ5LnRvTG93ZXJDYXNlKCksIGZvdW5kUG9zICsgMSkgOiANCiAgICAgICAgICAgICAgZWxlbS5pbmRleE9mKGVudHJ5LCBmb3VuZFBvcyArIDEpOw0KDQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChwYXJ0aWFsLmxlbmd0aCkNCiAgICAgICAgICByZXQgPSByZXQuY29uY2F0KHBhcnRpYWwuc2xpY2UoMCwgaW5zdGFuY2Uub3B0aW9ucy5jaG9pY2VzIC0gcmV0Lmxlbmd0aCkpDQogICAgICAgIHJldHVybiAiPHVsPiIgKyByZXQuam9pbignJykgKyAiPC91bD4iOw0KICAgICAgfQ0KICAgIH0sIG9wdGlvbnMgfHwgeyB9KTsNCiAgfQ0KfSk7DQoNCi8vIEFKQVggaW4tcGxhY2UgZWRpdG9yIGFuZCBjb2xsZWN0aW9uIGVkaXRvcg0KLy8gRnVsbCByZXdyaXRlIGJ5IENocmlzdG9waGUgUG9ydGVuZXV2ZSA8dGRkQHRkZHN3b3JsZC5jb20+IChBcHJpbCAyMDA3KS4NCg0KLy8gVXNlIHRoaXMgaWYgeW91IG5vdGljZSB3ZWlyZCBzY3JvbGxpbmcgcHJvYmxlbXMgb24gc29tZSBicm93c2VycywNCi8vIHRoZSBET00gbWlnaHQgYmUgYSBiaXQgY29uZnVzZWQgd2hlbiB0aGlzIGdldHMgY2FsbGVkIHNvIGRvIHRoaXMNCi8vIHdhaXRzIDEgbXMgKHdpdGggc2V0VGltZW91dCkgdW50aWwgaXQgZG9lcyB0aGUgYWN0aXZhdGlvbg0KRmllbGQuc2Nyb2xsRnJlZUFjdGl2YXRlID0gZnVuY3Rpb24oZmllbGQpIHsNCiAgc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICBGaWVsZC5hY3RpdmF0ZShmaWVsZCk7DQogIH0sIDEpOw0KfQ0KDQpBamF4LkluUGxhY2VFZGl0b3IgPSBDbGFzcy5jcmVhdGUoew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCB1cmwsIG9wdGlvbnMpIHsNCiAgICB0aGlzLnVybCA9IHVybDsNCiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICB0aGlzLnByZXBhcmVPcHRpb25zKCk7DQogICAgdGhpcy5fY29udHJvbHMgPSB7IH07DQogICAgYXJndW1lbnRzLmNhbGxlZS5kZWFsV2l0aERlcHJlY2F0ZWRPcHRpb25zKG9wdGlvbnMpOyAvLyBERVBSRUNBVElPTiBMQVlFUiEhIQ0KICAgIE9iamVjdC5leHRlbmQodGhpcy5vcHRpb25zLCBvcHRpb25zIHx8IHsgfSk7DQogICAgaWYgKCF0aGlzLm9wdGlvbnMuZm9ybUlkICYmIHRoaXMuZWxlbWVudC5pZCkgew0KICAgICAgdGhpcy5vcHRpb25zLmZvcm1JZCA9IHRoaXMuZWxlbWVudC5pZCArICctaW5wbGFjZWVkaXRvcic7DQogICAgICBpZiAoJCh0aGlzLm9wdGlvbnMuZm9ybUlkKSkNCiAgICAgICAgdGhpcy5vcHRpb25zLmZvcm1JZCA9ICcnOw0KICAgIH0NCiAgICBpZiAodGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbCkNCiAgICAgIHRoaXMub3B0aW9ucy5leHRlcm5hbENvbnRyb2wgPSAkKHRoaXMub3B0aW9ucy5leHRlcm5hbENvbnRyb2wpOw0KICAgIGlmICghdGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbCkNCiAgICAgIHRoaXMub3B0aW9ucy5leHRlcm5hbENvbnRyb2xPbmx5ID0gZmFsc2U7DQogICAgdGhpcy5fb3JpZ2luYWxCYWNrZ3JvdW5kID0gdGhpcy5lbGVtZW50LmdldFN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJykgfHwgJ3RyYW5zcGFyZW50JzsNCiAgICB0aGlzLmVsZW1lbnQudGl0bGUgPSB0aGlzLm9wdGlvbnMuY2xpY2tUb0VkaXRUZXh0Ow0KICAgIHRoaXMuX2JvdW5kQ2FuY2VsSGFuZGxlciA9IHRoaXMuaGFuZGxlRm9ybUNhbmNlbGxhdGlvbi5iaW5kKHRoaXMpOw0KICAgIHRoaXMuX2JvdW5kQ29tcGxldGUgPSAodGhpcy5vcHRpb25zLm9uQ29tcGxldGUgfHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pLmJpbmQodGhpcyk7DQogICAgdGhpcy5fYm91bmRGYWlsdXJlSGFuZGxlciA9IHRoaXMuaGFuZGxlQUpBWEZhaWx1cmUuYmluZCh0aGlzKTsNCiAgICB0aGlzLl9ib3VuZFN1Ym1pdEhhbmRsZXIgPSB0aGlzLmhhbmRsZUZvcm1TdWJtaXNzaW9uLmJpbmQodGhpcyk7DQogICAgdGhpcy5fYm91bmRXcmFwcGVySGFuZGxlciA9IHRoaXMud3JhcFVwLmJpbmQodGhpcyk7DQogICAgdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpOw0KICB9LA0KICBjaGVja0ZvckVzY2FwZU9yUmV0dXJuOiBmdW5jdGlvbihlKSB7DQogICAgaWYgKCF0aGlzLl9lZGl0aW5nIHx8IGUuY3RybEtleSB8fCBlLmFsdEtleSB8fCBlLnNoaWZ0S2V5KSByZXR1cm47DQogICAgaWYgKEV2ZW50LktFWV9FU0MgPT0gZS5rZXlDb2RlKQ0KICAgICAgdGhpcy5oYW5kbGVGb3JtQ2FuY2VsbGF0aW9uKGUpOw0KICAgIGVsc2UgaWYgKEV2ZW50LktFWV9SRVRVUk4gPT0gZS5rZXlDb2RlKQ0KICAgICAgdGhpcy5oYW5kbGVGb3JtU3VibWlzc2lvbihlKTsNCiAgfSwNCiAgY3JlYXRlQ29udHJvbDogZnVuY3Rpb24obW9kZSwgaGFuZGxlciwgZXh0cmFDbGFzc2VzKSB7DQogICAgdmFyIGNvbnRyb2wgPSB0aGlzLm9wdGlvbnNbbW9kZSArICdDb250cm9sJ107DQogICAgdmFyIHRleHQgPSB0aGlzLm9wdGlvbnNbbW9kZSArICdUZXh0J107DQogICAgaWYgKCdidXR0b24nID09IGNvbnRyb2wpIHsNCiAgICAgIHZhciBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOw0KICAgICAgYnRuLnR5cGUgPSAnc3VibWl0JzsNCiAgICAgIGJ0bi52YWx1ZSA9IHRleHQ7DQogICAgICBidG4uY2xhc3NOYW1lID0gJ2VkaXRvcl8nICsgbW9kZSArICdfYnV0dG9uJzsNCiAgICAgIGlmICgnY2FuY2VsJyA9PSBtb2RlKQ0KICAgICAgICBidG4ub25jbGljayA9IHRoaXMuX2JvdW5kQ2FuY2VsSGFuZGxlcjsNCiAgICAgIHRoaXMuX2Zvcm0uYXBwZW5kQ2hpbGQoYnRuKTsNCiAgICAgIHRoaXMuX2NvbnRyb2xzW21vZGVdID0gYnRuOw0KICAgIH0gZWxzZSBpZiAoJ2xpbmsnID09IGNvbnRyb2wpIHsNCiAgICAgIHZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KICAgICAgbGluay5ocmVmID0gJyMnOw0KICAgICAgbGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7DQogICAgICBsaW5rLm9uY2xpY2sgPSAnY2FuY2VsJyA9PSBtb2RlID8gdGhpcy5fYm91bmRDYW5jZWxIYW5kbGVyIDogdGhpcy5fYm91bmRTdWJtaXRIYW5kbGVyOw0KICAgICAgbGluay5jbGFzc05hbWUgPSAnZWRpdG9yXycgKyBtb2RlICsgJ19saW5rJzsNCiAgICAgIGlmIChleHRyYUNsYXNzZXMpDQogICAgICAgIGxpbmsuY2xhc3NOYW1lICs9ICcgJyArIGV4dHJhQ2xhc3NlczsNCiAgICAgIHRoaXMuX2Zvcm0uYXBwZW5kQ2hpbGQobGluayk7DQogICAgICB0aGlzLl9jb250cm9sc1ttb2RlXSA9IGxpbms7DQogICAgfQ0KICB9LA0KICBjcmVhdGVFZGl0RmllbGQ6IGZ1bmN0aW9uKCkgew0KICAgIHZhciB0ZXh0ID0gKHRoaXMub3B0aW9ucy5sb2FkVGV4dFVSTCA/IHRoaXMub3B0aW9ucy5sb2FkaW5nVGV4dCA6IHRoaXMuZ2V0VGV4dCgpKTsNCiAgICB2YXIgZmxkOw0KICAgIGlmICgxID49IHRoaXMub3B0aW9ucy5yb3dzICYmICEvXHJ8XG4vLnRlc3QodGhpcy5nZXRUZXh0KCkpKSB7DQogICAgICBmbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOw0KICAgICAgZmxkLnR5cGUgPSAndGV4dCc7DQogICAgICB2YXIgc2l6ZSA9IHRoaXMub3B0aW9ucy5zaXplIHx8IHRoaXMub3B0aW9ucy5jb2xzIHx8IDA7DQogICAgICBpZiAoMCA8IHNpemUpIGZsZC5zaXplID0gc2l6ZTsNCiAgICB9IGVsc2Ugew0KICAgICAgZmxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsNCiAgICAgIGZsZC5yb3dzID0gKDEgPj0gdGhpcy5vcHRpb25zLnJvd3MgPyB0aGlzLm9wdGlvbnMuYXV0b1Jvd3MgOiB0aGlzLm9wdGlvbnMucm93cyk7DQogICAgICBmbGQuY29scyA9IHRoaXMub3B0aW9ucy5jb2xzIHx8IDQwOw0KICAgIH0NCiAgICBmbGQubmFtZSA9IHRoaXMub3B0aW9ucy5wYXJhbU5hbWU7DQogICAgZmxkLnZhbHVlID0gdGV4dDsgLy8gTm8gSFRNTCBicmVha3MgY29udmVyc2lvbiBhbnltb3JlDQogICAgZmxkLmNsYXNzTmFtZSA9ICdlZGl0b3JfZmllbGQnOw0KICAgIGlmICh0aGlzLm9wdGlvbnMuc3VibWl0T25CbHVyKQ0KICAgICAgZmxkLm9uYmx1ciA9IHRoaXMuX2JvdW5kU3VibWl0SGFuZGxlcjsNCiAgICB0aGlzLl9jb250cm9scy5lZGl0b3IgPSBmbGQ7DQogICAgaWYgKHRoaXMub3B0aW9ucy5sb2FkVGV4dFVSTCkNCiAgICAgIHRoaXMubG9hZEV4dGVybmFsVGV4dCgpOw0KICAgIHRoaXMuX2Zvcm0uYXBwZW5kQ2hpbGQodGhpcy5fY29udHJvbHMuZWRpdG9yKTsNCiAgfSwNCiAgY3JlYXRlRm9ybTogZnVuY3Rpb24oKSB7DQogICAgdmFyIGlwZSA9IHRoaXM7DQogICAgZnVuY3Rpb24gYWRkVGV4dChtb2RlLCBjb25kaXRpb24pIHsNCiAgICAgIHZhciB0ZXh0ID0gaXBlLm9wdGlvbnNbJ3RleHQnICsgbW9kZSArICdDb250cm9scyddOw0KICAgICAgaWYgKCF0ZXh0IHx8IGNvbmRpdGlvbiA9PT0gZmFsc2UpIHJldHVybjsNCiAgICAgIGlwZS5fZm9ybS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7DQogICAgfTsNCiAgICB0aGlzLl9mb3JtID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJykpOw0KICAgIHRoaXMuX2Zvcm0uaWQgPSB0aGlzLm9wdGlvbnMuZm9ybUlkOw0KICAgIHRoaXMuX2Zvcm0uYWRkQ2xhc3NOYW1lKHRoaXMub3B0aW9ucy5mb3JtQ2xhc3NOYW1lKTsNCiAgICB0aGlzLl9mb3JtLm9uc3VibWl0ID0gdGhpcy5fYm91bmRTdWJtaXRIYW5kbGVyOw0KICAgIHRoaXMuY3JlYXRlRWRpdEZpZWxkKCk7DQogICAgaWYgKCd0ZXh0YXJlYScgPT0gdGhpcy5fY29udHJvbHMuZWRpdG9yLnRhZ05hbWUudG9Mb3dlckNhc2UoKSkNCiAgICAgIHRoaXMuX2Zvcm0uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnInKSk7DQogICAgaWYgKHRoaXMub3B0aW9ucy5vbkZvcm1DdXN0b21pemF0aW9uKQ0KICAgICAgdGhpcy5vcHRpb25zLm9uRm9ybUN1c3RvbWl6YXRpb24odGhpcywgdGhpcy5fZm9ybSk7DQogICAgYWRkVGV4dCgnQmVmb3JlJywgdGhpcy5vcHRpb25zLm9rQ29udHJvbCB8fCB0aGlzLm9wdGlvbnMuY2FuY2VsQ29udHJvbCk7DQogICAgdGhpcy5jcmVhdGVDb250cm9sKCdvaycsIHRoaXMuX2JvdW5kU3VibWl0SGFuZGxlcik7DQogICAgYWRkVGV4dCgnQmV0d2VlbicsIHRoaXMub3B0aW9ucy5va0NvbnRyb2wgJiYgdGhpcy5vcHRpb25zLmNhbmNlbENvbnRyb2wpOw0KICAgIHRoaXMuY3JlYXRlQ29udHJvbCgnY2FuY2VsJywgdGhpcy5fYm91bmRDYW5jZWxIYW5kbGVyLCAnZWRpdG9yX2NhbmNlbCcpOw0KICAgIGFkZFRleHQoJ0FmdGVyJywgdGhpcy5vcHRpb25zLm9rQ29udHJvbCB8fCB0aGlzLm9wdGlvbnMuY2FuY2VsQ29udHJvbCk7DQogIH0sDQogIGRlc3Ryb3k6IGZ1bmN0aW9uKCkgew0KICAgIGlmICh0aGlzLl9vbGRJbm5lckhUTUwpDQogICAgICB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5fb2xkSW5uZXJIVE1MOw0KICAgIHRoaXMubGVhdmVFZGl0TW9kZSgpOw0KICAgIHRoaXMudW5yZWdpc3Rlckxpc3RlbmVycygpOw0KICB9LA0KICBlbnRlckVkaXRNb2RlOiBmdW5jdGlvbihlKSB7DQogICAgaWYgKHRoaXMuX3NhdmluZyB8fCB0aGlzLl9lZGl0aW5nKSByZXR1cm47DQogICAgdGhpcy5fZWRpdGluZyA9IHRydWU7DQogICAgdGhpcy50cmlnZ2VyQ2FsbGJhY2soJ29uRW50ZXJFZGl0TW9kZScpOw0KICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZXJuYWxDb250cm9sKQ0KICAgICAgdGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbC5oaWRlKCk7DQogICAgdGhpcy5lbGVtZW50LmhpZGUoKTsNCiAgICB0aGlzLmNyZWF0ZUZvcm0oKTsNCiAgICB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5fZm9ybSwgdGhpcy5lbGVtZW50KTsNCiAgICBpZiAoIXRoaXMub3B0aW9ucy5sb2FkVGV4dFVSTCkNCiAgICAgIHRoaXMucG9zdFByb2Nlc3NFZGl0RmllbGQoKTsNCiAgICBpZiAoZSkgRXZlbnQuc3RvcChlKTsNCiAgfSwNCiAgZW50ZXJIb3ZlcjogZnVuY3Rpb24oZSkgew0KICAgIGlmICh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzc05hbWUpDQogICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3NOYW1lKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzTmFtZSk7DQogICAgaWYgKHRoaXMuX3NhdmluZykgcmV0dXJuOw0KICAgIHRoaXMudHJpZ2dlckNhbGxiYWNrKCdvbkVudGVySG92ZXInKTsNCiAgfSwNCiAgZ2V0VGV4dDogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXMuZWxlbWVudC5pbm5lckhUTUw7DQogIH0sDQogIGhhbmRsZUFKQVhGYWlsdXJlOiBmdW5jdGlvbih0cmFuc3BvcnQpIHsNCiAgICB0aGlzLnRyaWdnZXJDYWxsYmFjaygnb25GYWlsdXJlJywgdHJhbnNwb3J0KTsNCiAgICBpZiAodGhpcy5fb2xkSW5uZXJIVE1MKSB7DQogICAgICB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5fb2xkSW5uZXJIVE1MOw0KICAgICAgdGhpcy5fb2xkSW5uZXJIVE1MID0gbnVsbDsNCiAgICB9DQogIH0sDQogIGhhbmRsZUZvcm1DYW5jZWxsYXRpb246IGZ1bmN0aW9uKGUpIHsNCiAgICB0aGlzLndyYXBVcCgpOw0KICAgIGlmIChlKSBFdmVudC5zdG9wKGUpOw0KICB9LA0KICBoYW5kbGVGb3JtU3VibWlzc2lvbjogZnVuY3Rpb24oZSkgew0KICAgIHZhciBmb3JtID0gdGhpcy5fZm9ybTsNCiAgICB2YXIgdmFsdWUgPSAkRih0aGlzLl9jb250cm9scy5lZGl0b3IpOw0KICAgIHRoaXMucHJlcGFyZVN1Ym1pc3Npb24oKTsNCiAgICB2YXIgcGFyYW1zID0gdGhpcy5vcHRpb25zLmNhbGxiYWNrKGZvcm0sIHZhbHVlKSB8fCAnJzsNCiAgICBpZiAoT2JqZWN0LmlzU3RyaW5nKHBhcmFtcykpDQogICAgICBwYXJhbXMgPSBwYXJhbXMudG9RdWVyeVBhcmFtcygpOw0KICAgIHBhcmFtcy5lZGl0b3JJZCA9IHRoaXMuZWxlbWVudC5pZDsNCiAgICBpZiAodGhpcy5vcHRpb25zLmh0bWxSZXNwb25zZSkgew0KICAgICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsgZXZhbFNjcmlwdHM6IHRydWUgfSwgdGhpcy5vcHRpb25zLmFqYXhPcHRpb25zKTsNCiAgICAgIE9iamVjdC5leHRlbmQob3B0aW9ucywgew0KICAgICAgICBwYXJhbWV0ZXJzOiBwYXJhbXMsDQogICAgICAgIG9uQ29tcGxldGU6IHRoaXMuX2JvdW5kV3JhcHBlckhhbmRsZXIsDQogICAgICAgIG9uRmFpbHVyZTogdGhpcy5fYm91bmRGYWlsdXJlSGFuZGxlcg0KICAgICAgfSk7DQogICAgICBuZXcgQWpheC5VcGRhdGVyKHsgc3VjY2VzczogdGhpcy5lbGVtZW50IH0sIHRoaXMudXJsLCBvcHRpb25zKTsNCiAgICB9IGVsc2Ugew0KICAgICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsgbWV0aG9kOiAnZ2V0JyB9LCB0aGlzLm9wdGlvbnMuYWpheE9wdGlvbnMpOw0KICAgICAgT2JqZWN0LmV4dGVuZChvcHRpb25zLCB7DQogICAgICAgIHBhcmFtZXRlcnM6IHBhcmFtcywNCiAgICAgICAgb25Db21wbGV0ZTogdGhpcy5fYm91bmRXcmFwcGVySGFuZGxlciwNCiAgICAgICAgb25GYWlsdXJlOiB0aGlzLl9ib3VuZEZhaWx1cmVIYW5kbGVyDQogICAgICB9KTsNCiAgICAgIG5ldyBBamF4LlJlcXVlc3QodGhpcy51cmwsIG9wdGlvbnMpOw0KICAgIH0NCiAgICBpZiAoZSkgRXZlbnQuc3RvcChlKTsNCiAgfSwNCiAgbGVhdmVFZGl0TW9kZTogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzTmFtZSh0aGlzLm9wdGlvbnMuc2F2aW5nQ2xhc3NOYW1lKTsNCiAgICB0aGlzLnJlbW92ZUZvcm0oKTsNCiAgICB0aGlzLmxlYXZlSG92ZXIoKTsNCiAgICB0aGlzLmVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5fb3JpZ2luYWxCYWNrZ3JvdW5kOw0KICAgIHRoaXMuZWxlbWVudC5zaG93KCk7DQogICAgaWYgKHRoaXMub3B0aW9ucy5leHRlcm5hbENvbnRyb2wpDQogICAgICB0aGlzLm9wdGlvbnMuZXh0ZXJuYWxDb250cm9sLnNob3coKTsNCiAgICB0aGlzLl9zYXZpbmcgPSBmYWxzZTsNCiAgICB0aGlzLl9lZGl0aW5nID0gZmFsc2U7DQogICAgdGhpcy5fb2xkSW5uZXJIVE1MID0gbnVsbDsNCiAgICB0aGlzLnRyaWdnZXJDYWxsYmFjaygnb25MZWF2ZUVkaXRNb2RlJyk7DQogIH0sDQogIGxlYXZlSG92ZXI6IGZ1bmN0aW9uKGUpIHsNCiAgICBpZiAodGhpcy5vcHRpb25zLmhvdmVyQ2xhc3NOYW1lKQ0KICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzTmFtZSh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzc05hbWUpOw0KICAgIGlmICh0aGlzLl9zYXZpbmcpIHJldHVybjsNCiAgICB0aGlzLnRyaWdnZXJDYWxsYmFjaygnb25MZWF2ZUhvdmVyJyk7DQogIH0sDQogIGxvYWRFeHRlcm5hbFRleHQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX2Zvcm0uYWRkQ2xhc3NOYW1lKHRoaXMub3B0aW9ucy5sb2FkaW5nQ2xhc3NOYW1lKTsNCiAgICB0aGlzLl9jb250cm9scy5lZGl0b3IuZGlzYWJsZWQgPSB0cnVlOw0KICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZCh7IG1ldGhvZDogJ2dldCcgfSwgdGhpcy5vcHRpb25zLmFqYXhPcHRpb25zKTsNCiAgICBPYmplY3QuZXh0ZW5kKG9wdGlvbnMsIHsNCiAgICAgIHBhcmFtZXRlcnM6ICdlZGl0b3JJZD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZWxlbWVudC5pZCksDQogICAgICBvbkNvbXBsZXRlOiBQcm90b3R5cGUuZW1wdHlGdW5jdGlvbiwNCiAgICAgIG9uU3VjY2VzczogZnVuY3Rpb24odHJhbnNwb3J0KSB7DQogICAgICAgIHRoaXMuX2Zvcm0ucmVtb3ZlQ2xhc3NOYW1lKHRoaXMub3B0aW9ucy5sb2FkaW5nQ2xhc3NOYW1lKTsNCiAgICAgICAgdmFyIHRleHQgPSB0cmFuc3BvcnQucmVzcG9uc2VUZXh0Ow0KICAgICAgICBpZiAodGhpcy5vcHRpb25zLnN0cmlwTG9hZGVkVGV4dFRhZ3MpDQogICAgICAgICAgdGV4dCA9IHRleHQuc3RyaXBUYWdzKCk7DQogICAgICAgIHRoaXMuX2NvbnRyb2xzLmVkaXRvci52YWx1ZSA9IHRleHQ7DQogICAgICAgIHRoaXMuX2NvbnRyb2xzLmVkaXRvci5kaXNhYmxlZCA9IGZhbHNlOw0KICAgICAgICB0aGlzLnBvc3RQcm9jZXNzRWRpdEZpZWxkKCk7DQogICAgICB9LmJpbmQodGhpcyksDQogICAgICBvbkZhaWx1cmU6IHRoaXMuX2JvdW5kRmFpbHVyZUhhbmRsZXINCiAgICB9KTsNCiAgICBuZXcgQWpheC5SZXF1ZXN0KHRoaXMub3B0aW9ucy5sb2FkVGV4dFVSTCwgb3B0aW9ucyk7DQogIH0sDQogIHBvc3RQcm9jZXNzRWRpdEZpZWxkOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgZnBjID0gdGhpcy5vcHRpb25zLmZpZWxkUG9zdENyZWF0aW9uOw0KICAgIGlmIChmcGMpDQogICAgICAkKHRoaXMuX2NvbnRyb2xzLmVkaXRvcilbJ2ZvY3VzJyA9PSBmcGMgPyAnZm9jdXMnIDogJ2FjdGl2YXRlJ10oKTsNCiAgfSwNCiAgcHJlcGFyZU9wdGlvbnM6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5jbG9uZShBamF4LkluUGxhY2VFZGl0b3IuRGVmYXVsdE9wdGlvbnMpOw0KICAgIE9iamVjdC5leHRlbmQodGhpcy5vcHRpb25zLCBBamF4LkluUGxhY2VFZGl0b3IuRGVmYXVsdENhbGxiYWNrcyk7DQogICAgW3RoaXMuX2V4dHJhRGVmYXVsdE9wdGlvbnNdLmZsYXR0ZW4oKS5jb21wYWN0KCkuZWFjaChmdW5jdGlvbihkZWZzKSB7DQogICAgICBPYmplY3QuZXh0ZW5kKHRoaXMub3B0aW9ucywgZGVmcyk7DQogICAgfS5iaW5kKHRoaXMpKTsNCiAgfSwNCiAgcHJlcGFyZVN1Ym1pc3Npb246IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX3NhdmluZyA9IHRydWU7DQogICAgdGhpcy5yZW1vdmVGb3JtKCk7DQogICAgdGhpcy5sZWF2ZUhvdmVyKCk7DQogICAgdGhpcy5zaG93U2F2aW5nKCk7DQogIH0sDQogIHJlZ2lzdGVyTGlzdGVuZXJzOiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl9saXN0ZW5lcnMgPSB7IH07DQogICAgdmFyIGxpc3RlbmVyOw0KICAgICRIKEFqYXguSW5QbGFjZUVkaXRvci5MaXN0ZW5lcnMpLmVhY2goZnVuY3Rpb24ocGFpcikgew0KICAgICAgbGlzdGVuZXIgPSB0aGlzW3BhaXIudmFsdWVdLmJpbmQodGhpcyk7DQogICAgICB0aGlzLl9saXN0ZW5lcnNbcGFpci5rZXldID0gbGlzdGVuZXI7DQogICAgICBpZiAoIXRoaXMub3B0aW9ucy5leHRlcm5hbENvbnRyb2xPbmx5KQ0KICAgICAgICB0aGlzLmVsZW1lbnQub2JzZXJ2ZShwYWlyLmtleSwgbGlzdGVuZXIpOw0KICAgICAgaWYgKHRoaXMub3B0aW9ucy5leHRlcm5hbENvbnRyb2wpDQogICAgICAgIHRoaXMub3B0aW9ucy5leHRlcm5hbENvbnRyb2wub2JzZXJ2ZShwYWlyLmtleSwgbGlzdGVuZXIpOw0KICAgIH0uYmluZCh0aGlzKSk7DQogIH0sDQogIHJlbW92ZUZvcm06IGZ1bmN0aW9uKCkgew0KICAgIGlmICghdGhpcy5fZm9ybSkgcmV0dXJuOw0KICAgIHRoaXMuX2Zvcm0ucmVtb3ZlKCk7DQogICAgdGhpcy5fZm9ybSA9IG51bGw7DQogICAgdGhpcy5fY29udHJvbHMgPSB7IH07DQogIH0sDQogIHNob3dTYXZpbmc6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX29sZElubmVySFRNTCA9IHRoaXMuZWxlbWVudC5pbm5lckhUTUw7DQogICAgdGhpcy5lbGVtZW50LmlubmVySFRNTCA9IHRoaXMub3B0aW9ucy5zYXZpbmdUZXh0Ow0KICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzc05hbWUodGhpcy5vcHRpb25zLnNhdmluZ0NsYXNzTmFtZSk7DQogICAgdGhpcy5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuX29yaWdpbmFsQmFja2dyb3VuZDsNCiAgICB0aGlzLmVsZW1lbnQuc2hvdygpOw0KICB9LA0KICB0cmlnZ2VyQ2FsbGJhY2s6IGZ1bmN0aW9uKGNiTmFtZSwgYXJnKSB7DQogICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIHRoaXMub3B0aW9uc1tjYk5hbWVdKSB7DQogICAgICB0aGlzLm9wdGlvbnNbY2JOYW1lXSh0aGlzLCBhcmcpOw0KICAgIH0NCiAgfSwNCiAgdW5yZWdpc3Rlckxpc3RlbmVyczogZnVuY3Rpb24oKSB7DQogICAgJEgodGhpcy5fbGlzdGVuZXJzKS5lYWNoKGZ1bmN0aW9uKHBhaXIpIHsNCiAgICAgIGlmICghdGhpcy5vcHRpb25zLmV4dGVybmFsQ29udHJvbE9ubHkpDQogICAgICAgIHRoaXMuZWxlbWVudC5zdG9wT2JzZXJ2aW5nKHBhaXIua2V5LCBwYWlyLnZhbHVlKTsNCiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXh0ZXJuYWxDb250cm9sKQ0KICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZXJuYWxDb250cm9sLnN0b3BPYnNlcnZpbmcocGFpci5rZXksIHBhaXIudmFsdWUpOw0KICAgIH0uYmluZCh0aGlzKSk7DQogIH0sDQogIHdyYXBVcDogZnVuY3Rpb24odHJhbnNwb3J0KSB7DQogICAgdGhpcy5sZWF2ZUVkaXRNb2RlKCk7DQogICAgLy8gQ2FuJ3QgdXNlIHRyaWdnZXJDYWxsYmFjayBkdWUgdG8gYmFja3dhcmQgY29tcGF0aWJpbGl0eTogcmVxdWlyZXMNCiAgICAvLyBiaW5kaW5nICsgZGlyZWN0IGVsZW1lbnQNCiAgICB0aGlzLl9ib3VuZENvbXBsZXRlKHRyYW5zcG9ydCwgdGhpcy5lbGVtZW50KTsNCiAgfQ0KfSk7DQoNCk9iamVjdC5leHRlbmQoQWpheC5JblBsYWNlRWRpdG9yLnByb3RvdHlwZSwgew0KICBkaXNwb3NlOiBBamF4LkluUGxhY2VFZGl0b3IucHJvdG90eXBlLmRlc3Ryb3kNCn0pOw0KDQpBamF4LkluUGxhY2VDb2xsZWN0aW9uRWRpdG9yID0gQ2xhc3MuY3JlYXRlKEFqYXguSW5QbGFjZUVkaXRvciwgew0KICBpbml0aWFsaXplOiBmdW5jdGlvbigkc3VwZXIsIGVsZW1lbnQsIHVybCwgb3B0aW9ucykgew0KICAgIHRoaXMuX2V4dHJhRGVmYXVsdE9wdGlvbnMgPSBBamF4LkluUGxhY2VDb2xsZWN0aW9uRWRpdG9yLkRlZmF1bHRPcHRpb25zOw0KICAgICRzdXBlcihlbGVtZW50LCB1cmwsIG9wdGlvbnMpOw0KICB9LA0KDQogIGNyZWF0ZUVkaXRGaWVsZDogZnVuY3Rpb24oKSB7DQogICAgdmFyIGxpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWxlY3QnKTsNCiAgICBsaXN0Lm5hbWUgPSB0aGlzLm9wdGlvbnMucGFyYW1OYW1lOw0KICAgIGxpc3Quc2l6ZSA9IDE7DQogICAgdGhpcy5fY29udHJvbHMuZWRpdG9yID0gbGlzdDsNCiAgICB0aGlzLl9jb2xsZWN0aW9uID0gdGhpcy5vcHRpb25zLmNvbGxlY3Rpb24gfHwgW107DQogICAgaWYgKHRoaXMub3B0aW9ucy5sb2FkQ29sbGVjdGlvblVSTCkNCiAgICAgIHRoaXMubG9hZENvbGxlY3Rpb24oKTsNCiAgICBlbHNlDQogICAgICB0aGlzLmNoZWNrRm9yRXh0ZXJuYWxUZXh0KCk7DQogICAgdGhpcy5fZm9ybS5hcHBlbmRDaGlsZCh0aGlzLl9jb250cm9scy5lZGl0b3IpOw0KICB9LA0KDQogIGxvYWRDb2xsZWN0aW9uOiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl9mb3JtLmFkZENsYXNzTmFtZSh0aGlzLm9wdGlvbnMubG9hZGluZ0NsYXNzTmFtZSk7DQogICAgdGhpcy5zaG93TG9hZGluZ1RleHQodGhpcy5vcHRpb25zLmxvYWRpbmdDb2xsZWN0aW9uVGV4dCk7DQogICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsgbWV0aG9kOiAnZ2V0JyB9LCB0aGlzLm9wdGlvbnMuYWpheE9wdGlvbnMpOw0KICAgIE9iamVjdC5leHRlbmQob3B0aW9ucywgew0KICAgICAgcGFyYW1ldGVyczogJ2VkaXRvcklkPScgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5lbGVtZW50LmlkKSwNCiAgICAgIG9uQ29tcGxldGU6IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uLA0KICAgICAgb25TdWNjZXNzOiBmdW5jdGlvbih0cmFuc3BvcnQpIHsNCiAgICAgICAgdmFyIGpzID0gdHJhbnNwb3J0LnJlc3BvbnNlVGV4dC5zdHJpcCgpOw0KICAgICAgICBpZiAoIS9eXFsuKlxdJC8udGVzdChqcykpIC8vIFRPRE86IGltcHJvdmUgc2FuaXR5IGNoZWNrDQogICAgICAgICAgdGhyb3cgJ1NlcnZlciByZXR1cm5lZCBhbiBpbnZhbGlkIGNvbGxlY3Rpb24gcmVwcmVzZW50YXRpb24uJzsNCiAgICAgICAgdGhpcy5fY29sbGVjdGlvbiA9IGV2YWwoanMpOw0KICAgICAgICB0aGlzLmNoZWNrRm9yRXh0ZXJuYWxUZXh0KCk7DQogICAgICB9LmJpbmQodGhpcyksDQogICAgICBvbkZhaWx1cmU6IHRoaXMub25GYWlsdXJlDQogICAgfSk7DQogICAgbmV3IEFqYXguUmVxdWVzdCh0aGlzLm9wdGlvbnMubG9hZENvbGxlY3Rpb25VUkwsIG9wdGlvbnMpOw0KICB9LA0KDQogIHNob3dMb2FkaW5nVGV4dDogZnVuY3Rpb24odGV4dCkgew0KICAgIHRoaXMuX2NvbnRyb2xzLmVkaXRvci5kaXNhYmxlZCA9IHRydWU7DQogICAgdmFyIHRlbXBPcHRpb24gPSB0aGlzLl9jb250cm9scy5lZGl0b3IuZmlyc3RDaGlsZDsNCiAgICBpZiAoIXRlbXBPcHRpb24pIHsNCiAgICAgIHRlbXBPcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTsNCiAgICAgIHRlbXBPcHRpb24udmFsdWUgPSAnJzsNCiAgICAgIHRoaXMuX2NvbnRyb2xzLmVkaXRvci5hcHBlbmRDaGlsZCh0ZW1wT3B0aW9uKTsNCiAgICAgIHRlbXBPcHRpb24uc2VsZWN0ZWQgPSB0cnVlOw0KICAgIH0NCiAgICB0ZW1wT3B0aW9uLnVwZGF0ZSgodGV4dCB8fCAnJykuc3RyaXBTY3JpcHRzKCkuc3RyaXBUYWdzKCkpOw0KICB9LA0KDQogIGNoZWNrRm9yRXh0ZXJuYWxUZXh0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl90ZXh0ID0gdGhpcy5nZXRUZXh0KCk7DQogICAgaWYgKHRoaXMub3B0aW9ucy5sb2FkVGV4dFVSTCkNCiAgICAgIHRoaXMubG9hZEV4dGVybmFsVGV4dCgpOw0KICAgIGVsc2UNCiAgICAgIHRoaXMuYnVpbGRPcHRpb25MaXN0KCk7DQogIH0sDQoNCiAgbG9hZEV4dGVybmFsVGV4dDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5zaG93TG9hZGluZ1RleHQodGhpcy5vcHRpb25zLmxvYWRpbmdUZXh0KTsNCiAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoeyBtZXRob2Q6ICdnZXQnIH0sIHRoaXMub3B0aW9ucy5hamF4T3B0aW9ucyk7DQogICAgT2JqZWN0LmV4dGVuZChvcHRpb25zLCB7DQogICAgICBwYXJhbWV0ZXJzOiAnZWRpdG9ySWQ9JyArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmVsZW1lbnQuaWQpLA0KICAgICAgb25Db21wbGV0ZTogUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24sDQogICAgICBvblN1Y2Nlc3M6IGZ1bmN0aW9uKHRyYW5zcG9ydCkgew0KICAgICAgICB0aGlzLl90ZXh0ID0gdHJhbnNwb3J0LnJlc3BvbnNlVGV4dC5zdHJpcCgpOw0KICAgICAgICB0aGlzLmJ1aWxkT3B0aW9uTGlzdCgpOw0KICAgICAgfS5iaW5kKHRoaXMpLA0KICAgICAgb25GYWlsdXJlOiB0aGlzLm9uRmFpbHVyZQ0KICAgIH0pOw0KICAgIG5ldyBBamF4LlJlcXVlc3QodGhpcy5vcHRpb25zLmxvYWRUZXh0VVJMLCBvcHRpb25zKTsNCiAgfSwNCg0KICBidWlsZE9wdGlvbkxpc3Q6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX2Zvcm0ucmVtb3ZlQ2xhc3NOYW1lKHRoaXMub3B0aW9ucy5sb2FkaW5nQ2xhc3NOYW1lKTsNCiAgICB0aGlzLl9jb2xsZWN0aW9uID0gdGhpcy5fY29sbGVjdGlvbi5tYXAoZnVuY3Rpb24oZW50cnkpIHsNCiAgICAgIHJldHVybiAyID09PSBlbnRyeS5sZW5ndGggPyBlbnRyeSA6IFtlbnRyeSwgZW50cnldLmZsYXR0ZW4oKTsNCiAgICB9KTsNCiAgICB2YXIgbWFya2VyID0gKCd2YWx1ZScgaW4gdGhpcy5vcHRpb25zKSA/IHRoaXMub3B0aW9ucy52YWx1ZSA6IHRoaXMuX3RleHQ7DQogICAgdmFyIHRleHRGb3VuZCA9IHRoaXMuX2NvbGxlY3Rpb24uYW55KGZ1bmN0aW9uKGVudHJ5KSB7DQogICAgICByZXR1cm4gZW50cnlbMF0gPT0gbWFya2VyOw0KICAgIH0uYmluZCh0aGlzKSk7DQogICAgdGhpcy5fY29udHJvbHMuZWRpdG9yLnVwZGF0ZSgnJyk7DQogICAgdmFyIG9wdGlvbjsNCiAgICB0aGlzLl9jb2xsZWN0aW9uLmVhY2goZnVuY3Rpb24oZW50cnksIGluZGV4KSB7DQogICAgICBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTsNCiAgICAgIG9wdGlvbi52YWx1ZSA9IGVudHJ5WzBdOw0KICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdGV4dEZvdW5kID8gZW50cnlbMF0gPT0gbWFya2VyIDogMCA9PSBpbmRleDsNCiAgICAgIG9wdGlvbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlbnRyeVsxXSkpOw0KICAgICAgdGhpcy5fY29udHJvbHMuZWRpdG9yLmFwcGVuZENoaWxkKG9wdGlvbik7DQogICAgfS5iaW5kKHRoaXMpKTsNCiAgICB0aGlzLl9jb250cm9scy5lZGl0b3IuZGlzYWJsZWQgPSBmYWxzZTsNCiAgICBGaWVsZC5zY3JvbGxGcmVlQWN0aXZhdGUodGhpcy5fY29udHJvbHMuZWRpdG9yKTsNCiAgfQ0KfSk7DQoNCi8vKioqKiBERVBSRUNBVElPTiBMQVlFUiBGT1IgSW5QbGFjZVtDb2xsZWN0aW9uXUVkaXRvciEgKioqKg0KLy8qKioqIFRoaXMgb25seSAgZXhpc3RzIGZvciBhIHdoaWxlLCAgaW4gb3JkZXIgdG8gIGxldCAqKioqDQovLyoqKiogdXNlcnMgYWRhcHQgdG8gIHRoZSBuZXcgQVBJLiAgUmVhZCB1cCBvbiB0aGUgbmV3ICoqKioNCi8vKioqKiBBUEkgYW5kIGNvbnZlcnQgeW91ciBjb2RlIHRvIGl0IEFTQVAhICAgICAgICAgICAgKioqKg0KDQpBamF4LkluUGxhY2VFZGl0b3IucHJvdG90eXBlLmluaXRpYWxpemUuZGVhbFdpdGhEZXByZWNhdGVkT3B0aW9ucyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsNCiAgaWYgKCFvcHRpb25zKSByZXR1cm47DQogIGZ1bmN0aW9uIGZhbGxiYWNrKG5hbWUsIGV4cHIpIHsNCiAgICBpZiAobmFtZSBpbiBvcHRpb25zIHx8IGV4cHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuOw0KICAgIG9wdGlvbnNbbmFtZV0gPSBleHByOw0KICB9Ow0KICBmYWxsYmFjaygnY2FuY2VsQ29udHJvbCcsIChvcHRpb25zLmNhbmNlbExpbmsgPyAnbGluaycgOiAob3B0aW9ucy5jYW5jZWxCdXR0b24gPyAnYnV0dG9uJyA6DQogICAgb3B0aW9ucy5jYW5jZWxMaW5rID09IG9wdGlvbnMuY2FuY2VsQnV0dG9uID09IGZhbHNlID8gZmFsc2UgOiB1bmRlZmluZWQpKSk7DQogIGZhbGxiYWNrKCdva0NvbnRyb2wnLCAob3B0aW9ucy5va0xpbmsgPyAnbGluaycgOiAob3B0aW9ucy5va0J1dHRvbiA/ICdidXR0b24nIDoNCiAgICBvcHRpb25zLm9rTGluayA9PSBvcHRpb25zLm9rQnV0dG9uID09IGZhbHNlID8gZmFsc2UgOiB1bmRlZmluZWQpKSk7DQogIGZhbGxiYWNrKCdoaWdobGlnaHRDb2xvcicsIG9wdGlvbnMuaGlnaGxpZ2h0Y29sb3IpOw0KICBmYWxsYmFjaygnaGlnaGxpZ2h0RW5kQ29sb3InLCBvcHRpb25zLmhpZ2hsaWdodGVuZGNvbG9yKTsNCn07DQoNCk9iamVjdC5leHRlbmQoQWpheC5JblBsYWNlRWRpdG9yLCB7DQogIERlZmF1bHRPcHRpb25zOiB7DQogICAgYWpheE9wdGlvbnM6IHsgfSwNCiAgICBhdXRvUm93czogMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB3aGVuIG11bHRpLWxpbmUgdy8gcm93cyA9PSAxDQogICAgY2FuY2VsQ29udHJvbDogJ2xpbmsnLCAgICAgICAgICAgICAgICAgICAgICAvLyAnbGluayd8J2J1dHRvbid8ZmFsc2UNCiAgICBjYW5jZWxUZXh0OiAnY2FuY2VsJywNCiAgICBjbGlja1RvRWRpdFRleHQ6ICdDbGljayB0byBlZGl0JywNCiAgICBleHRlcm5hbENvbnRyb2w6IG51bGwsICAgICAgICAgICAgICAgICAgICAgIC8vIGlkfGVsdA0KICAgIGV4dGVybmFsQ29udHJvbE9ubHk6IGZhbHNlLA0KICAgIGZpZWxkUG9zdENyZWF0aW9uOiAnYWN0aXZhdGUnLCAgICAgICAgICAgICAgLy8gJ2FjdGl2YXRlJ3wnZm9jdXMnfGZhbHNlDQogICAgZm9ybUNsYXNzTmFtZTogJ2lucGxhY2VlZGl0b3ItZm9ybScsDQogICAgZm9ybUlkOiBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZHxlbHQNCiAgICBoaWdobGlnaHRDb2xvcjogJyNmZmZmOTknLA0KICAgIGhpZ2hsaWdodEVuZENvbG9yOiAnI2ZmZmZmZicsDQogICAgaG92ZXJDbGFzc05hbWU6ICcnLA0KICAgIGh0bWxSZXNwb25zZTogdHJ1ZSwNCiAgICBsb2FkaW5nQ2xhc3NOYW1lOiAnaW5wbGFjZWVkaXRvci1sb2FkaW5nJywNCiAgICBsb2FkaW5nVGV4dDogJ0xvYWRpbmcuLi4nLA0KICAgIG9rQ29udHJvbDogJ2J1dHRvbicsICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ2xpbmsnfCdidXR0b24nfGZhbHNlDQogICAgb2tUZXh0OiAnb2snLA0KICAgIHBhcmFtTmFtZTogJ3ZhbHVlJywNCiAgICByb3dzOiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIDEgYW5kIG11bHRpLWxpbmUsIHVzZXMgYXV0b1Jvd3MNCiAgICBzYXZpbmdDbGFzc05hbWU6ICdpbnBsYWNlZWRpdG9yLXNhdmluZycsDQogICAgc2F2aW5nVGV4dDogJ1NhdmluZy4uLicsDQogICAgc2l6ZTogMCwNCiAgICBzdHJpcExvYWRlZFRleHRUYWdzOiBmYWxzZSwNCiAgICBzdWJtaXRPbkJsdXI6IGZhbHNlLA0KICAgIHRleHRBZnRlckNvbnRyb2xzOiAnJywNCiAgICB0ZXh0QmVmb3JlQ29udHJvbHM6ICcnLA0KICAgIHRleHRCZXR3ZWVuQ29udHJvbHM6ICcnDQogIH0sDQogIERlZmF1bHRDYWxsYmFja3M6IHsNCiAgICBjYWxsYmFjazogZnVuY3Rpb24oZm9ybSkgew0KICAgICAgcmV0dXJuIEZvcm0uc2VyaWFsaXplKGZvcm0pOw0KICAgIH0sDQogICAgb25Db21wbGV0ZTogZnVuY3Rpb24odHJhbnNwb3J0LCBlbGVtZW50KSB7DQogICAgICAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhpcyBvbmUgaXMgYm91bmQgdG8gdGhlIElQRSwgYW5kIHBhc3Nlcw0KICAgICAgLy8gdGhlIGVsZW1lbnQgZGlyZWN0bHkuICBJdCB3YXMgdG9vIG9mdGVuIGN1c3RvbWl6ZWQsIHNvIHdlIGRvbid0IGJyZWFrIGl0Lg0KICAgICAgbmV3IEVmZmVjdC5IaWdobGlnaHQoZWxlbWVudCwgew0KICAgICAgICBzdGFydGNvbG9yOiB0aGlzLm9wdGlvbnMuaGlnaGxpZ2h0Q29sb3IsIGtlZXBCYWNrZ3JvdW5kSW1hZ2U6IHRydWUgfSk7DQogICAgfSwNCiAgICBvbkVudGVyRWRpdE1vZGU6IG51bGwsDQogICAgb25FbnRlckhvdmVyOiBmdW5jdGlvbihpcGUpIHsNCiAgICAgIGlwZS5lbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGlwZS5vcHRpb25zLmhpZ2hsaWdodENvbG9yOw0KICAgICAgaWYgKGlwZS5fZWZmZWN0KQ0KICAgICAgICBpcGUuX2VmZmVjdC5jYW5jZWwoKTsNCiAgICB9LA0KICAgIG9uRmFpbHVyZTogZnVuY3Rpb24odHJhbnNwb3J0LCBpcGUpIHsNCiAgICAgIGFsZXJ0KCdFcnJvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHNlcnZlcjogJyArIHRyYW5zcG9ydC5yZXNwb25zZVRleHQuc3RyaXBUYWdzKCkpOw0KICAgIH0sDQogICAgb25Gb3JtQ3VzdG9taXphdGlvbjogbnVsbCwgLy8gVGFrZXMgdGhlIElQRSBhbmQgaXRzIGdlbmVyYXRlZCBmb3JtLCBhZnRlciBlZGl0b3IsIGJlZm9yZSBjb250cm9scy4NCiAgICBvbkxlYXZlRWRpdE1vZGU6IG51bGwsDQogICAgb25MZWF2ZUhvdmVyOiBmdW5jdGlvbihpcGUpIHsNCiAgICAgIGlwZS5fZWZmZWN0ID0gbmV3IEVmZmVjdC5IaWdobGlnaHQoaXBlLmVsZW1lbnQsIHsNCiAgICAgICAgc3RhcnRjb2xvcjogaXBlLm9wdGlvbnMuaGlnaGxpZ2h0Q29sb3IsIGVuZGNvbG9yOiBpcGUub3B0aW9ucy5oaWdobGlnaHRFbmRDb2xvciwNCiAgICAgICAgcmVzdG9yZWNvbG9yOiBpcGUuX29yaWdpbmFsQmFja2dyb3VuZCwga2VlcEJhY2tncm91bmRJbWFnZTogdHJ1ZQ0KICAgICAgfSk7DQogICAgfQ0KICB9LA0KICBMaXN0ZW5lcnM6IHsNCiAgICBjbGljazogJ2VudGVyRWRpdE1vZGUnLA0KICAgIGtleWRvd246ICdjaGVja0ZvckVzY2FwZU9yUmV0dXJuJywNCiAgICBtb3VzZW92ZXI6ICdlbnRlckhvdmVyJywNCiAgICBtb3VzZW91dDogJ2xlYXZlSG92ZXInDQogIH0NCn0pOw0KDQpBamF4LkluUGxhY2VDb2xsZWN0aW9uRWRpdG9yLkRlZmF1bHRPcHRpb25zID0gew0KICBsb2FkaW5nQ29sbGVjdGlvblRleHQ6ICdMb2FkaW5nIG9wdGlvbnMuLi4nDQp9Ow0KDQovLyBEZWxheWVkIG9ic2VydmVyLCBsaWtlIEZvcm0uRWxlbWVudC5PYnNlcnZlciwgDQovLyBidXQgd2FpdHMgZm9yIGRlbGF5IGFmdGVyIGxhc3Qga2V5IGlucHV0DQovLyBJZGVhbCBmb3IgbGl2ZS1zZWFyY2ggZmllbGRzDQoNCkZvcm0uRWxlbWVudC5EZWxheWVkT2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50LCBkZWxheSwgY2FsbGJhY2spIHsNCiAgICB0aGlzLmRlbGF5ICAgICA9IGRlbGF5IHx8IDAuNTsNCiAgICB0aGlzLmVsZW1lbnQgICA9ICQoZWxlbWVudCk7DQogICAgdGhpcy5jYWxsYmFjayAgPSBjYWxsYmFjazsNCiAgICB0aGlzLnRpbWVyICAgICA9IG51bGw7DQogICAgdGhpcy5sYXN0VmFsdWUgPSAkRih0aGlzLmVsZW1lbnQpOyANCiAgICBFdmVudC5vYnNlcnZlKHRoaXMuZWxlbWVudCwna2V5dXAnLHRoaXMuZGVsYXllZExpc3RlbmVyLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcykpOw0KICB9LA0KICBkZWxheWVkTGlzdGVuZXI6IGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgaWYodGhpcy5sYXN0VmFsdWUgPT0gJEYodGhpcy5lbGVtZW50KSkgcmV0dXJuOw0KICAgIGlmKHRoaXMudGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTsNCiAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCh0aGlzLm9uVGltZXJFdmVudC5iaW5kKHRoaXMpLCB0aGlzLmRlbGF5ICogMTAwMCk7DQogICAgdGhpcy5sYXN0VmFsdWUgPSAkRih0aGlzLmVsZW1lbnQpOw0KICB9LA0KICBvblRpbWVyRXZlbnQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMudGltZXIgPSBudWxsOw0KICAgIHRoaXMuY2FsbGJhY2sodGhpcy5lbGVtZW50LCAkRih0aGlzLmVsZW1lbnQpKTsNCiAgfQ0KfSk7DQovLyBzY3JpcHQuYWN1bG8udXMgc2xpZGVyLmpzIHYxLjguMSwgVGh1IEphbiAwMyAyMjowNzoxMiAtMDUwMCAyMDA4DQoNCi8vIENvcHlyaWdodCAoYykgMjAwNS0yMDA3IE1hcnR5IEhhdWdodCwgVGhvbWFzIEZ1Y2hzIA0KLy8NCi8vIHNjcmlwdC5hY3Vsby51cyBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZSB1bmRlciB0aGUgdGVybXMgb2YgYW4gTUlULXN0eWxlIGxpY2Vuc2UuDQovLyBGb3IgZGV0YWlscywgc2VlIHRoZSBzY3JpcHQuYWN1bG8udXMgd2ViIHNpdGU6IGh0dHA6Ly9zY3JpcHQuYWN1bG8udXMvDQoNCmlmICghQ29udHJvbCkgdmFyIENvbnRyb2wgPSB7IH07DQoNCi8vIG9wdGlvbnM6DQovLyAgYXhpczogJ3ZlcnRpY2FsJywgb3IgJ2hvcml6b250YWwnIChkZWZhdWx0KQ0KLy8NCi8vIGNhbGxiYWNrczoNCi8vICBvbkNoYW5nZSh2YWx1ZSkNCi8vICBvblNsaWRlKHZhbHVlKQ0KQ29udHJvbC5TbGlkZXIgPSBDbGFzcy5jcmVhdGUoew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihoYW5kbGUsIHRyYWNrLCBvcHRpb25zKSB7DQogICAgdmFyIHNsaWRlciA9IHRoaXM7DQogICAgDQogICAgaWYgKE9iamVjdC5pc0FycmF5KGhhbmRsZSkpIHsNCiAgICAgIHRoaXMuaGFuZGxlcyA9IGhhbmRsZS5jb2xsZWN0KCBmdW5jdGlvbihlKSB7IHJldHVybiAkKGUpIH0pOw0KICAgIH0gZWxzZSB7DQogICAgICB0aGlzLmhhbmRsZXMgPSBbJChoYW5kbGUpXTsNCiAgICB9DQogICAgDQogICAgdGhpcy50cmFjayAgID0gJCh0cmFjayk7DQogICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7IH07DQoNCiAgICB0aGlzLmF4aXMgICAgICA9IHRoaXMub3B0aW9ucy5heGlzIHx8ICdob3Jpem9udGFsJzsNCiAgICB0aGlzLmluY3JlbWVudCA9IHRoaXMub3B0aW9ucy5pbmNyZW1lbnQgfHwgMTsNCiAgICB0aGlzLnN0ZXAgICAgICA9IHBhcnNlSW50KHRoaXMub3B0aW9ucy5zdGVwIHx8ICcxJyk7DQogICAgdGhpcy5yYW5nZSAgICAgPSB0aGlzLm9wdGlvbnMucmFuZ2UgfHwgJFIoMCwxKTsNCiAgICANCiAgICB0aGlzLnZhbHVlICAgICA9IDA7IC8vIGFzc3VyZSBiYWNrd2FyZHMgY29tcGF0DQogICAgdGhpcy52YWx1ZXMgICAgPSB0aGlzLmhhbmRsZXMubWFwKCBmdW5jdGlvbigpIHsgcmV0dXJuIDAgfSk7DQogICAgdGhpcy5zcGFucyAgICAgPSB0aGlzLm9wdGlvbnMuc3BhbnMgPyB0aGlzLm9wdGlvbnMuc3BhbnMubWFwKGZ1bmN0aW9uKHMpeyByZXR1cm4gJChzKSB9KSA6IGZhbHNlOw0KICAgIHRoaXMub3B0aW9ucy5zdGFydFNwYW4gPSAkKHRoaXMub3B0aW9ucy5zdGFydFNwYW4gfHwgbnVsbCk7DQogICAgdGhpcy5vcHRpb25zLmVuZFNwYW4gICA9ICQodGhpcy5vcHRpb25zLmVuZFNwYW4gfHwgbnVsbCk7DQoNCiAgICB0aGlzLnJlc3RyaWN0ZWQgPSB0aGlzLm9wdGlvbnMucmVzdHJpY3RlZCB8fCBmYWxzZTsNCg0KICAgIHRoaXMubWF4aW11bSAgID0gdGhpcy5vcHRpb25zLm1heGltdW0gfHwgdGhpcy5yYW5nZS5lbmQ7DQogICAgdGhpcy5taW5pbXVtICAgPSB0aGlzLm9wdGlvbnMubWluaW11bSB8fCB0aGlzLnJhbmdlLnN0YXJ0Ow0KDQogICAgLy8gV2lsbCBiZSB1c2VkIHRvIGFsaWduIHRoZSBoYW5kbGUgb250byB0aGUgdHJhY2ssIGlmIG5lY2Vzc2FyeQ0KICAgIHRoaXMuYWxpZ25YID0gcGFyc2VJbnQodGhpcy5vcHRpb25zLmFsaWduWCB8fCAnMCcpOw0KICAgIHRoaXMuYWxpZ25ZID0gcGFyc2VJbnQodGhpcy5vcHRpb25zLmFsaWduWSB8fCAnMCcpOw0KICAgIA0KICAgIHRoaXMudHJhY2tMZW5ndGggPSB0aGlzLm1heGltdW1PZmZzZXQoKSAtIHRoaXMubWluaW11bU9mZnNldCgpOw0KDQogICAgdGhpcy5oYW5kbGVMZW5ndGggPSB0aGlzLmlzVmVydGljYWwoKSA/IA0KICAgICAgKHRoaXMuaGFuZGxlc1swXS5vZmZzZXRIZWlnaHQgIT0gMCA/IA0KICAgICAgICB0aGlzLmhhbmRsZXNbMF0ub2Zmc2V0SGVpZ2h0IDogdGhpcy5oYW5kbGVzWzBdLnN0eWxlLmhlaWdodC5yZXBsYWNlKC9weCQvLCIiKSkgOiANCiAgICAgICh0aGlzLmhhbmRsZXNbMF0ub2Zmc2V0V2lkdGggIT0gMCA/IHRoaXMuaGFuZGxlc1swXS5vZmZzZXRXaWR0aCA6IA0KICAgICAgICB0aGlzLmhhbmRsZXNbMF0uc3R5bGUud2lkdGgucmVwbGFjZSgvcHgkLywiIikpOw0KDQogICAgdGhpcy5hY3RpdmUgICA9IGZhbHNlOw0KICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTsNCiAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7DQoNCiAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FibGVkKSB0aGlzLnNldERpc2FibGVkKCk7DQoNCiAgICAvLyBBbGxvd2VkIHZhbHVlcyBhcnJheQ0KICAgIHRoaXMuYWxsb3dlZFZhbHVlcyA9IHRoaXMub3B0aW9ucy52YWx1ZXMgPyB0aGlzLm9wdGlvbnMudmFsdWVzLnNvcnRCeShQcm90b3R5cGUuSykgOiBmYWxzZTsNCiAgICBpZiAodGhpcy5hbGxvd2VkVmFsdWVzKSB7DQogICAgICB0aGlzLm1pbmltdW0gPSB0aGlzLmFsbG93ZWRWYWx1ZXMubWluKCk7DQogICAgICB0aGlzLm1heGltdW0gPSB0aGlzLmFsbG93ZWRWYWx1ZXMubWF4KCk7DQogICAgfQ0KDQogICAgdGhpcy5ldmVudE1vdXNlRG93biA9IHRoaXMuc3RhcnREcmFnLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7DQogICAgdGhpcy5ldmVudE1vdXNlVXAgICA9IHRoaXMuZW5kRHJhZy5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpOw0KICAgIHRoaXMuZXZlbnRNb3VzZU1vdmUgPSB0aGlzLnVwZGF0ZS5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpOw0KDQogICAgLy8gSW5pdGlhbGl6ZSBoYW5kbGVzIGluIHJldmVyc2UgKG1ha2Ugc3VyZSBmaXJzdCBoYW5kbGUgaXMgYWN0aXZlKQ0KICAgIHRoaXMuaGFuZGxlcy5lYWNoKCBmdW5jdGlvbihoLGkpIHsNCiAgICAgIGkgPSBzbGlkZXIuaGFuZGxlcy5sZW5ndGgtMS1pOw0KICAgICAgc2xpZGVyLnNldFZhbHVlKHBhcnNlRmxvYXQoDQogICAgICAgIChPYmplY3QuaXNBcnJheShzbGlkZXIub3B0aW9ucy5zbGlkZXJWYWx1ZSkgPyANCiAgICAgICAgICBzbGlkZXIub3B0aW9ucy5zbGlkZXJWYWx1ZVtpXSA6IHNsaWRlci5vcHRpb25zLnNsaWRlclZhbHVlKSB8fCANCiAgICAgICAgIHNsaWRlci5yYW5nZS5zdGFydCksIGkpOw0KICAgICAgaC5tYWtlUG9zaXRpb25lZCgpLm9ic2VydmUoIm1vdXNlZG93biIsIHNsaWRlci5ldmVudE1vdXNlRG93bik7DQogICAgfSk7DQogICAgDQogICAgdGhpcy50cmFjay5vYnNlcnZlKCJtb3VzZWRvd24iLCB0aGlzLmV2ZW50TW91c2VEb3duKTsNCiAgICBkb2N1bWVudC5vYnNlcnZlKCJtb3VzZXVwIiwgdGhpcy5ldmVudE1vdXNlVXApOw0KICAgIGRvY3VtZW50Lm9ic2VydmUoIm1vdXNlbW92ZSIsIHRoaXMuZXZlbnRNb3VzZU1vdmUpOw0KICAgIA0KICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOw0KICB9LA0KICBkaXNwb3NlOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgc2xpZGVyID0gdGhpczsgICAgDQogICAgRXZlbnQuc3RvcE9ic2VydmluZyh0aGlzLnRyYWNrLCAibW91c2Vkb3duIiwgdGhpcy5ldmVudE1vdXNlRG93bik7DQogICAgRXZlbnQuc3RvcE9ic2VydmluZyhkb2N1bWVudCwgIm1vdXNldXAiLCB0aGlzLmV2ZW50TW91c2VVcCk7DQogICAgRXZlbnQuc3RvcE9ic2VydmluZyhkb2N1bWVudCwgIm1vdXNlbW92ZSIsIHRoaXMuZXZlbnRNb3VzZU1vdmUpOw0KICAgIHRoaXMuaGFuZGxlcy5lYWNoKCBmdW5jdGlvbihoKSB7DQogICAgICBFdmVudC5zdG9wT2JzZXJ2aW5nKGgsICJtb3VzZWRvd24iLCBzbGlkZXIuZXZlbnRNb3VzZURvd24pOw0KICAgIH0pOw0KICB9LA0KICBzZXREaXNhYmxlZDogZnVuY3Rpb24oKXsNCiAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTsNCiAgfSwNCiAgc2V0RW5hYmxlZDogZnVuY3Rpb24oKXsNCiAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7DQogIH0sICANCiAgZ2V0TmVhcmVzdFZhbHVlOiBmdW5jdGlvbih2YWx1ZSl7DQogICAgaWYgKHRoaXMuYWxsb3dlZFZhbHVlcyl7DQogICAgICBpZiAodmFsdWUgPj0gdGhpcy5hbGxvd2VkVmFsdWVzLm1heCgpKSByZXR1cm4odGhpcy5hbGxvd2VkVmFsdWVzLm1heCgpKTsNCiAgICAgIGlmICh2YWx1ZSA8PSB0aGlzLmFsbG93ZWRWYWx1ZXMubWluKCkpIHJldHVybih0aGlzLmFsbG93ZWRWYWx1ZXMubWluKCkpOw0KICAgICAgDQogICAgICB2YXIgb2Zmc2V0ID0gTWF0aC5hYnModGhpcy5hbGxvd2VkVmFsdWVzWzBdIC0gdmFsdWUpOw0KICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5hbGxvd2VkVmFsdWVzWzBdOw0KICAgICAgdGhpcy5hbGxvd2VkVmFsdWVzLmVhY2goIGZ1bmN0aW9uKHYpIHsNCiAgICAgICAgdmFyIGN1cnJlbnRPZmZzZXQgPSBNYXRoLmFicyh2IC0gdmFsdWUpOw0KICAgICAgICBpZiAoY3VycmVudE9mZnNldCA8PSBvZmZzZXQpew0KICAgICAgICAgIG5ld1ZhbHVlID0gdjsNCiAgICAgICAgICBvZmZzZXQgPSBjdXJyZW50T2Zmc2V0Ow0KICAgICAgICB9IA0KICAgICAgfSk7DQogICAgICByZXR1cm4gbmV3VmFsdWU7DQogICAgfQ0KICAgIGlmICh2YWx1ZSA+IHRoaXMucmFuZ2UuZW5kKSByZXR1cm4gdGhpcy5yYW5nZS5lbmQ7DQogICAgaWYgKHZhbHVlIDwgdGhpcy5yYW5nZS5zdGFydCkgcmV0dXJuIHRoaXMucmFuZ2Uuc3RhcnQ7DQogICAgcmV0dXJuIHZhbHVlOw0KICB9LA0KICBzZXRWYWx1ZTogZnVuY3Rpb24oc2xpZGVyVmFsdWUsIGhhbmRsZUlkeCl7DQogICAgaWYgKCF0aGlzLmFjdGl2ZSkgew0KICAgICAgdGhpcy5hY3RpdmVIYW5kbGVJZHggPSBoYW5kbGVJZHggfHwgMDsNCiAgICAgIHRoaXMuYWN0aXZlSGFuZGxlICAgID0gdGhpcy5oYW5kbGVzW3RoaXMuYWN0aXZlSGFuZGxlSWR4XTsNCiAgICAgIHRoaXMudXBkYXRlU3R5bGVzKCk7DQogICAgfQ0KICAgIGhhbmRsZUlkeCA9IGhhbmRsZUlkeCB8fCB0aGlzLmFjdGl2ZUhhbmRsZUlkeCB8fCAwOw0KICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMucmVzdHJpY3RlZCkgew0KICAgICAgaWYgKChoYW5kbGVJZHg+MCkgJiYgKHNsaWRlclZhbHVlPHRoaXMudmFsdWVzW2hhbmRsZUlkeC0xXSkpDQogICAgICAgIHNsaWRlclZhbHVlID0gdGhpcy52YWx1ZXNbaGFuZGxlSWR4LTFdOw0KICAgICAgaWYgKChoYW5kbGVJZHggPCAodGhpcy5oYW5kbGVzLmxlbmd0aC0xKSkgJiYgKHNsaWRlclZhbHVlPnRoaXMudmFsdWVzW2hhbmRsZUlkeCsxXSkpDQogICAgICAgIHNsaWRlclZhbHVlID0gdGhpcy52YWx1ZXNbaGFuZGxlSWR4KzFdOw0KICAgIH0NCiAgICBzbGlkZXJWYWx1ZSA9IHRoaXMuZ2V0TmVhcmVzdFZhbHVlKHNsaWRlclZhbHVlKTsNCiAgICB0aGlzLnZhbHVlc1toYW5kbGVJZHhdID0gc2xpZGVyVmFsdWU7DQogICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWVzWzBdOyAvLyBhc3N1cmUgYmFja3dhcmRzIGNvbXBhdA0KICAgIA0KICAgIHRoaXMuaGFuZGxlc1toYW5kbGVJZHhdLnN0eWxlW3RoaXMuaXNWZXJ0aWNhbCgpID8gJ3RvcCcgOiAnbGVmdCddID0gDQogICAgICB0aGlzLnRyYW5zbGF0ZVRvUHgoc2xpZGVyVmFsdWUpOw0KICAgIA0KICAgIHRoaXMuZHJhd1NwYW5zKCk7DQogICAgaWYgKCF0aGlzLmRyYWdnaW5nIHx8ICF0aGlzLmV2ZW50KSB0aGlzLnVwZGF0ZUZpbmlzaGVkKCk7DQogIH0sDQogIHNldFZhbHVlQnk6IGZ1bmN0aW9uKGRlbHRhLCBoYW5kbGVJZHgpIHsNCiAgICB0aGlzLnNldFZhbHVlKHRoaXMudmFsdWVzW2hhbmRsZUlkeCB8fCB0aGlzLmFjdGl2ZUhhbmRsZUlkeCB8fCAwXSArIGRlbHRhLCANCiAgICAgIGhhbmRsZUlkeCB8fCB0aGlzLmFjdGl2ZUhhbmRsZUlkeCB8fCAwKTsNCiAgfSwNCiAgdHJhbnNsYXRlVG9QeDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICByZXR1cm4gTWF0aC5yb3VuZCgNCiAgICAgICgodGhpcy50cmFja0xlbmd0aC10aGlzLmhhbmRsZUxlbmd0aCkvKHRoaXMucmFuZ2UuZW5kLXRoaXMucmFuZ2Uuc3RhcnQpKSAqIA0KICAgICAgKHZhbHVlIC0gdGhpcy5yYW5nZS5zdGFydCkpICsgInB4IjsNCiAgfSwNCiAgdHJhbnNsYXRlVG9WYWx1ZTogZnVuY3Rpb24ob2Zmc2V0KSB7DQogICAgcmV0dXJuICgob2Zmc2V0Lyh0aGlzLnRyYWNrTGVuZ3RoLXRoaXMuaGFuZGxlTGVuZ3RoKSAqIA0KICAgICAgKHRoaXMucmFuZ2UuZW5kLXRoaXMucmFuZ2Uuc3RhcnQpKSArIHRoaXMucmFuZ2Uuc3RhcnQpOw0KICB9LA0KICBnZXRSYW5nZTogZnVuY3Rpb24ocmFuZ2UpIHsNCiAgICB2YXIgdiA9IHRoaXMudmFsdWVzLnNvcnRCeShQcm90b3R5cGUuSyk7IA0KICAgIHJhbmdlID0gcmFuZ2UgfHwgMDsNCiAgICByZXR1cm4gJFIodltyYW5nZV0sdltyYW5nZSsxXSk7DQogIH0sDQogIG1pbmltdW1PZmZzZXQ6IGZ1bmN0aW9uKCl7DQogICAgcmV0dXJuKHRoaXMuaXNWZXJ0aWNhbCgpID8gdGhpcy5hbGlnblkgOiB0aGlzLmFsaWduWCk7DQogIH0sDQogIG1heGltdW1PZmZzZXQ6IGZ1bmN0aW9uKCl7DQogICAgcmV0dXJuKHRoaXMuaXNWZXJ0aWNhbCgpID8gDQogICAgICAodGhpcy50cmFjay5vZmZzZXRIZWlnaHQgIT0gMCA/IHRoaXMudHJhY2sub2Zmc2V0SGVpZ2h0IDoNCiAgICAgICAgdGhpcy50cmFjay5zdHlsZS5oZWlnaHQucmVwbGFjZSgvcHgkLywiIikpIC0gdGhpcy5hbGlnblkgOiANCiAgICAgICh0aGlzLnRyYWNrLm9mZnNldFdpZHRoICE9IDAgPyB0aGlzLnRyYWNrLm9mZnNldFdpZHRoIDogDQogICAgICAgIHRoaXMudHJhY2suc3R5bGUud2lkdGgucmVwbGFjZSgvcHgkLywiIikpIC0gdGhpcy5hbGlnblgpOw0KICB9LCAgDQogIGlzVmVydGljYWw6ICBmdW5jdGlvbigpew0KICAgIHJldHVybiAodGhpcy5heGlzID09ICd2ZXJ0aWNhbCcpOw0KICB9LA0KICBkcmF3U3BhbnM6IGZ1bmN0aW9uKCkgew0KICAgIHZhciBzbGlkZXIgPSB0aGlzOw0KICAgIGlmICh0aGlzLnNwYW5zKQ0KICAgICAgJFIoMCwgdGhpcy5zcGFucy5sZW5ndGgtMSkuZWFjaChmdW5jdGlvbihyKSB7IHNsaWRlci5zZXRTcGFuKHNsaWRlci5zcGFuc1tyXSwgc2xpZGVyLmdldFJhbmdlKHIpKSB9KTsNCiAgICBpZiAodGhpcy5vcHRpb25zLnN0YXJ0U3BhbikNCiAgICAgIHRoaXMuc2V0U3Bhbih0aGlzLm9wdGlvbnMuc3RhcnRTcGFuLA0KICAgICAgICAkUigwLCB0aGlzLnZhbHVlcy5sZW5ndGg+MSA/IHRoaXMuZ2V0UmFuZ2UoMCkubWluKCkgOiB0aGlzLnZhbHVlICkpOw0KICAgIGlmICh0aGlzLm9wdGlvbnMuZW5kU3BhbikNCiAgICAgIHRoaXMuc2V0U3Bhbih0aGlzLm9wdGlvbnMuZW5kU3BhbiwgDQogICAgICAgICRSKHRoaXMudmFsdWVzLmxlbmd0aD4xID8gdGhpcy5nZXRSYW5nZSh0aGlzLnNwYW5zLmxlbmd0aC0xKS5tYXgoKSA6IHRoaXMudmFsdWUsIHRoaXMubWF4aW11bSkpOw0KICB9LA0KICBzZXRTcGFuOiBmdW5jdGlvbihzcGFuLCByYW5nZSkgew0KICAgIGlmICh0aGlzLmlzVmVydGljYWwoKSkgew0KICAgICAgc3Bhbi5zdHlsZS50b3AgPSB0aGlzLnRyYW5zbGF0ZVRvUHgocmFuZ2Uuc3RhcnQpOw0KICAgICAgc3Bhbi5zdHlsZS5oZWlnaHQgPSB0aGlzLnRyYW5zbGF0ZVRvUHgocmFuZ2UuZW5kIC0gcmFuZ2Uuc3RhcnQgKyB0aGlzLnJhbmdlLnN0YXJ0KTsNCiAgICB9IGVsc2Ugew0KICAgICAgc3Bhbi5zdHlsZS5sZWZ0ID0gdGhpcy50cmFuc2xhdGVUb1B4KHJhbmdlLnN0YXJ0KTsNCiAgICAgIHNwYW4uc3R5bGUud2lkdGggPSB0aGlzLnRyYW5zbGF0ZVRvUHgocmFuZ2UuZW5kIC0gcmFuZ2Uuc3RhcnQgKyB0aGlzLnJhbmdlLnN0YXJ0KTsNCiAgICB9DQogIH0sDQogIHVwZGF0ZVN0eWxlczogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5oYW5kbGVzLmVhY2goIGZ1bmN0aW9uKGgpeyBFbGVtZW50LnJlbW92ZUNsYXNzTmFtZShoLCAnc2VsZWN0ZWQnKSB9KTsNCiAgICBFbGVtZW50LmFkZENsYXNzTmFtZSh0aGlzLmFjdGl2ZUhhbmRsZSwgJ3NlbGVjdGVkJyk7DQogIH0sDQogIHN0YXJ0RHJhZzogZnVuY3Rpb24oZXZlbnQpIHsNCiAgICBpZiAoRXZlbnQuaXNMZWZ0Q2xpY2soZXZlbnQpKSB7DQogICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpew0KICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7DQogICAgICAgIA0KICAgICAgICB2YXIgaGFuZGxlID0gRXZlbnQuZWxlbWVudChldmVudCk7DQogICAgICAgIHZhciBmbEludmVyc2Vab29tID0gMSAvIChkb2N1bWVudC5ib2R5LnN0eWxlLnpvb20gfHwgMSk7DQogICAgICAgIHZhciBwb2ludGVyICA9IFtFdmVudC5wb2ludGVyWChldmVudCkgKiBmbEludmVyc2Vab29tLCBFdmVudC5wb2ludGVyWShldmVudCkgKiBmbEludmVyc2Vab29tXTsNCiAgICAgICAgdmFyIHRyYWNrID0gaGFuZGxlOw0KICAgICAgICBpZiAodHJhY2s9PXRoaXMudHJhY2spIHsNCiAgICAgICAgICB2YXIgb2Zmc2V0cyAgPSBQb3NpdGlvbi5jdW11bGF0aXZlT2Zmc2V0KHRoaXMudHJhY2spOyANCiAgICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7DQogICAgICAgICAgdGhpcy5zZXRWYWx1ZSh0aGlzLnRyYW5zbGF0ZVRvVmFsdWUoIA0KICAgICAgICAgICAodGhpcy5pc1ZlcnRpY2FsKCkgPyBwb2ludGVyWzFdLW9mZnNldHNbMV0gOiBwb2ludGVyWzBdLW9mZnNldHNbMF0pLSh0aGlzLmhhbmRsZUxlbmd0aC8yKQ0KICAgICAgICAgICkpOw0KICAgICAgICAgIHZhciBvZmZzZXRzICA9IFBvc2l0aW9uLmN1bXVsYXRpdmVPZmZzZXQodGhpcy5hY3RpdmVIYW5kbGUpOw0KICAgICAgICAgIHRoaXMub2Zmc2V0WCA9IChwb2ludGVyWzBdIC0gb2Zmc2V0c1swXSk7DQogICAgICAgICAgdGhpcy5vZmZzZXRZID0gKHBvaW50ZXJbMV0gLSBvZmZzZXRzWzFdKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAvLyBmaW5kIHRoZSBoYW5kbGUgKHByZXZlbnRzIGlzc3VlcyB3aXRoIFNhZmFyaSkNCiAgICAgICAgICB3aGlsZSgodGhpcy5oYW5kbGVzLmluZGV4T2YoaGFuZGxlKSA9PSAtMSkgJiYgaGFuZGxlLnBhcmVudE5vZGUpIA0KICAgICAgICAgICAgaGFuZGxlID0gaGFuZGxlLnBhcmVudE5vZGU7DQogICAgICAgICAgICANCiAgICAgICAgICBpZiAodGhpcy5oYW5kbGVzLmluZGV4T2YoaGFuZGxlKSE9LTEpIHsNCiAgICAgICAgICAgIHRoaXMuYWN0aXZlSGFuZGxlICAgID0gaGFuZGxlOw0KICAgICAgICAgICAgdGhpcy5hY3RpdmVIYW5kbGVJZHggPSB0aGlzLmhhbmRsZXMuaW5kZXhPZih0aGlzLmFjdGl2ZUhhbmRsZSk7DQogICAgICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcygpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICB2YXIgb2Zmc2V0cyAgPSBQb3NpdGlvbi5jdW11bGF0aXZlT2Zmc2V0KHRoaXMuYWN0aXZlSGFuZGxlKTsNCiAgICAgICAgICAgIHRoaXMub2Zmc2V0WCA9IChwb2ludGVyWzBdIC0gb2Zmc2V0c1swXSk7DQogICAgICAgICAgICB0aGlzLm9mZnNldFkgPSAocG9pbnRlclsxXSAtIG9mZnNldHNbMV0pOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgRXZlbnQuc3RvcChldmVudCk7DQogICAgfQ0KICB9LA0KICB1cGRhdGU6IGZ1bmN0aW9uKGV2ZW50KSB7DQogICBpZiAodGhpcy5hY3RpdmUpIHsNCiAgICAgIGlmICghdGhpcy5kcmFnZ2luZykgdGhpcy5kcmFnZ2luZyA9IHRydWU7DQogICAgICB0aGlzLmRyYXcoZXZlbnQpOw0KICAgICAgaWYgKFByb3RvdHlwZS5Ccm93c2VyLldlYktpdCkgd2luZG93LnNjcm9sbEJ5KDAsMCk7DQogICAgICBFdmVudC5zdG9wKGV2ZW50KTsNCiAgIH0NCiAgfSwNCiAgZHJhdzogZnVuY3Rpb24oZXZlbnQpIHsNCiAgICB2YXIgZmxJbnZlcnNlWm9vbSA9IDEgLyAoZG9jdW1lbnQuYm9keS5zdHlsZS56b29tIHx8IDEpOw0KICAgIHZhciBwb2ludGVyID0gW0V2ZW50LnBvaW50ZXJYKGV2ZW50KSAqIGZsSW52ZXJzZVpvb20sIEV2ZW50LnBvaW50ZXJZKGV2ZW50KSAqIGZsSW52ZXJzZVpvb21dOw0KICAgIHZhciBvZmZzZXRzID0gUG9zaXRpb24uY3VtdWxhdGl2ZU9mZnNldCh0aGlzLnRyYWNrKTsNCiAgICBwb2ludGVyWzBdIC09IHRoaXMub2Zmc2V0WCArIG9mZnNldHNbMF07DQogICAgcG9pbnRlclsxXSAtPSB0aGlzLm9mZnNldFkgKyBvZmZzZXRzWzFdOw0KICAgIHRoaXMuZXZlbnQgPSBldmVudDsNCiAgICB0aGlzLnNldFZhbHVlKHRoaXMudHJhbnNsYXRlVG9WYWx1ZSggdGhpcy5pc1ZlcnRpY2FsKCkgPyBwb2ludGVyWzFdIDogcG9pbnRlclswXSApKTsNCiAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLm9wdGlvbnMub25TbGlkZSkNCiAgICAgIHRoaXMub3B0aW9ucy5vblNsaWRlKHRoaXMudmFsdWVzLmxlbmd0aD4xID8gdGhpcy52YWx1ZXMgOiB0aGlzLnZhbHVlLCB0aGlzKTsNCiAgfSwNCiAgZW5kRHJhZzogZnVuY3Rpb24oZXZlbnQpIHsNCiAgICBpZiAodGhpcy5hY3RpdmUgJiYgdGhpcy5kcmFnZ2luZykgew0KICAgICAgdGhpcy5maW5pc2hEcmFnKGV2ZW50LCB0cnVlKTsNCiAgICAgIEV2ZW50LnN0b3AoZXZlbnQpOw0KICAgIH0NCiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOw0KICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTsNCiAgfSwgIA0KICBmaW5pc2hEcmFnOiBmdW5jdGlvbihldmVudCwgc3VjY2Vzcykgew0KICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7DQogICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlOw0KICAgIHRoaXMudXBkYXRlRmluaXNoZWQoKTsNCiAgfSwNCiAgdXBkYXRlRmluaXNoZWQ6IGZ1bmN0aW9uKCkgew0KICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMub3B0aW9ucy5vbkNoYW5nZSkgDQogICAgICB0aGlzLm9wdGlvbnMub25DaGFuZ2UodGhpcy52YWx1ZXMubGVuZ3RoPjEgPyB0aGlzLnZhbHVlcyA6IHRoaXMudmFsdWUsIHRoaXMpOw0KICAgIHRoaXMuZXZlbnQgPSBudWxsOw0KICB9DQp9KTsNCi8vIHNjcmlwdC5hY3Vsby51cyBkcmFnZHJvcC5qcyB2MS44LjEsIFRodSBKYW4gMDMgMjI6MDc6MTIgLTA1MDAgMjAwOA0KDQovLyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBUaG9tYXMgRnVjaHMgKGh0dHA6Ly9zY3JpcHQuYWN1bG8udXMsIGh0dHA6Ly9taXIuYWN1bG8udXMpDQovLyAgICAgICAgICAgKGMpIDIwMDUtMjAwNyBTYW1taSBXaWxsaWFtcyAoaHR0cDovL3d3dy5vcmlvbnRyYW5zZmVyLmNvLm56LCBzYW1taUBvcmlvbnRyYW5zZmVyLmNvLm56KQ0KLy8NCi8vIHNjcmlwdC5hY3Vsby51cyBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZSB1bmRlciB0aGUgdGVybXMgb2YgYW4gTUlULXN0eWxlIGxpY2Vuc2UuDQovLyBGb3IgZGV0YWlscywgc2VlIHRoZSBzY3JpcHQuYWN1bG8udXMgd2ViIHNpdGU6IGh0dHA6Ly9zY3JpcHQuYWN1bG8udXMvDQoNCmlmKE9iamVjdC5pc1VuZGVmaW5lZChFZmZlY3QpKQ0KICB0aHJvdygiZHJhZ2Ryb3AuanMgcmVxdWlyZXMgaW5jbHVkaW5nIHNjcmlwdC5hY3Vsby51cycgZWZmZWN0cy5qcyBsaWJyYXJ5Iik7DQoNCnZhciBEcm9wcGFibGVzID0gew0KICBkcm9wczogW10sDQoNCiAgcmVtb3ZlOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgdGhpcy5kcm9wcyA9IHRoaXMuZHJvcHMucmVqZWN0KGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuZWxlbWVudD09JChlbGVtZW50KSB9KTsNCiAgfSwNCg0KICBhZGQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQoew0KICAgICAgZ3JlZWR5OiAgICAgdHJ1ZSwNCiAgICAgIGhvdmVyY2xhc3M6IG51bGwsDQogICAgICB0cmVlOiAgICAgICBmYWxzZQ0KICAgIH0sIGFyZ3VtZW50c1sxXSB8fCB7IH0pOw0KDQogICAgLy8gY2FjaGUgY29udGFpbmVycw0KICAgIGlmKG9wdGlvbnMuY29udGFpbm1lbnQpIHsNCiAgICAgIG9wdGlvbnMuX2NvbnRhaW5lcnMgPSBbXTsNCiAgICAgIHZhciBjb250YWlubWVudCA9IG9wdGlvbnMuY29udGFpbm1lbnQ7DQogICAgICBpZihPYmplY3QuaXNBcnJheShjb250YWlubWVudCkpIHsNCiAgICAgICAgY29udGFpbm1lbnQuZWFjaCggZnVuY3Rpb24oYykgeyBvcHRpb25zLl9jb250YWluZXJzLnB1c2goJChjKSkgfSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBvcHRpb25zLl9jb250YWluZXJzLnB1c2goJChjb250YWlubWVudCkpOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGlmKG9wdGlvbnMuYWNjZXB0KSBvcHRpb25zLmFjY2VwdCA9IFtvcHRpb25zLmFjY2VwdF0uZmxhdHRlbigpOw0KDQogICAgRWxlbWVudC5tYWtlUG9zaXRpb25lZChlbGVtZW50KTsgLy8gZml4IElFDQogICAgb3B0aW9ucy5lbGVtZW50ID0gZWxlbWVudDsNCg0KICAgIHRoaXMuZHJvcHMucHVzaChvcHRpb25zKTsNCiAgfSwNCg0KICBmaW5kRGVlcGVzdENoaWxkOiBmdW5jdGlvbihkcm9wcykgew0KICAgIGRlZXBlc3QgPSBkcm9wc1swXTsNCg0KICAgIGZvciAoaSA9IDE7IGkgPCBkcm9wcy5sZW5ndGg7ICsraSkNCiAgICAgIGlmIChFbGVtZW50LmlzUGFyZW50KGRyb3BzW2ldLmVsZW1lbnQsIGRlZXBlc3QuZWxlbWVudCkpDQogICAgICAgIGRlZXBlc3QgPSBkcm9wc1tpXTsNCg0KICAgIHJldHVybiBkZWVwZXN0Ow0KICB9LA0KDQogIGlzQ29udGFpbmVkOiBmdW5jdGlvbihlbGVtZW50LCBkcm9wKSB7DQogICAgdmFyIGNvbnRhaW5tZW50Tm9kZTsNCiAgICBpZihkcm9wLnRyZWUpIHsNCiAgICAgIGNvbnRhaW5tZW50Tm9kZSA9IGVsZW1lbnQudHJlZU5vZGU7DQogICAgfSBlbHNlIHsNCiAgICAgIGNvbnRhaW5tZW50Tm9kZSA9IGVsZW1lbnQucGFyZW50Tm9kZTsNCiAgICB9DQogICAgcmV0dXJuIGRyb3AuX2NvbnRhaW5lcnMuZGV0ZWN0KGZ1bmN0aW9uKGMpIHsgcmV0dXJuIGNvbnRhaW5tZW50Tm9kZSA9PSBjIH0pOw0KICB9LA0KDQogIGlzQWZmZWN0ZWQ6IGZ1bmN0aW9uKHBvaW50LCBlbGVtZW50LCBkcm9wKSB7DQogICAgcmV0dXJuICgNCiAgICAgIChkcm9wLmVsZW1lbnQhPWVsZW1lbnQpICYmDQogICAgICAoKCFkcm9wLl9jb250YWluZXJzKSB8fA0KICAgICAgICB0aGlzLmlzQ29udGFpbmVkKGVsZW1lbnQsIGRyb3ApKSAmJg0KICAgICAgKCghZHJvcC5hY2NlcHQpIHx8DQogICAgICAgIChFbGVtZW50LmNsYXNzTmFtZXMoZWxlbWVudCkuZGV0ZWN0KA0KICAgICAgICAgIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGRyb3AuYWNjZXB0LmluY2x1ZGUodikgfSApICkpICYmDQogICAgICBQb3NpdGlvbi53aXRoaW4oZHJvcC5lbGVtZW50LCBwb2ludFswXSwgcG9pbnRbMV0pICk7DQogIH0sDQoNCiAgZGVhY3RpdmF0ZTogZnVuY3Rpb24oZHJvcCkgew0KICAgIGlmKGRyb3AuaG92ZXJjbGFzcykNCiAgICAgIEVsZW1lbnQucmVtb3ZlQ2xhc3NOYW1lKGRyb3AuZWxlbWVudCwgZHJvcC5ob3ZlcmNsYXNzKTsNCiAgICB0aGlzLmxhc3RfYWN0aXZlID0gbnVsbDsNCiAgfSwNCg0KICBhY3RpdmF0ZTogZnVuY3Rpb24oZHJvcCkgew0KICAgIGlmKGRyb3AuaG92ZXJjbGFzcykNCiAgICAgIEVsZW1lbnQuYWRkQ2xhc3NOYW1lKGRyb3AuZWxlbWVudCwgZHJvcC5ob3ZlcmNsYXNzKTsNCiAgICB0aGlzLmxhc3RfYWN0aXZlID0gZHJvcDsNCiAgfSwNCg0KICBzaG93OiBmdW5jdGlvbihwb2ludCwgZWxlbWVudCkgew0KICAgIGlmKCF0aGlzLmRyb3BzLmxlbmd0aCkgcmV0dXJuOw0KICAgIHZhciBkcm9wLCBhZmZlY3RlZCA9IFtdOw0KDQogICAgdGhpcy5kcm9wcy5lYWNoKCBmdW5jdGlvbihkcm9wKSB7DQogICAgICBpZihEcm9wcGFibGVzLmlzQWZmZWN0ZWQocG9pbnQsIGVsZW1lbnQsIGRyb3ApKQ0KICAgICAgICBhZmZlY3RlZC5wdXNoKGRyb3ApOw0KICAgIH0pOw0KDQogICAgaWYoYWZmZWN0ZWQubGVuZ3RoPjApDQogICAgICBkcm9wID0gRHJvcHBhYmxlcy5maW5kRGVlcGVzdENoaWxkKGFmZmVjdGVkKTsNCg0KICAgIGlmKHRoaXMubGFzdF9hY3RpdmUgJiYgdGhpcy5sYXN0X2FjdGl2ZSAhPSBkcm9wKSB0aGlzLmRlYWN0aXZhdGUodGhpcy5sYXN0X2FjdGl2ZSk7DQogICAgaWYgKGRyb3ApIHsNCiAgICAgIFBvc2l0aW9uLndpdGhpbihkcm9wLmVsZW1lbnQsIHBvaW50WzBdLCBwb2ludFsxXSk7DQogICAgICBpZihkcm9wLm9uSG92ZXIpDQogICAgICAgIGRyb3Aub25Ib3ZlcihlbGVtZW50LCBkcm9wLmVsZW1lbnQsIFBvc2l0aW9uLm92ZXJsYXAoZHJvcC5vdmVybGFwLCBkcm9wLmVsZW1lbnQpKTsNCg0KICAgICAgaWYgKGRyb3AgIT0gdGhpcy5sYXN0X2FjdGl2ZSkgRHJvcHBhYmxlcy5hY3RpdmF0ZShkcm9wKTsNCiAgICB9DQogIH0sDQoNCiAgZmlyZTogZnVuY3Rpb24oZXZlbnQsIGVsZW1lbnQpIHsNCiAgICBpZighdGhpcy5sYXN0X2FjdGl2ZSkgcmV0dXJuOw0KICAgIFBvc2l0aW9uLnByZXBhcmUoKTsNCg0KICAgIHZhciBmbEludmVyc2Vab29tID0gMSAvIChkb2N1bWVudC5ib2R5LnN0eWxlLnpvb20gfHwgMSk7DQogICAgaWYgKHRoaXMuaXNBZmZlY3RlZChbRXZlbnQucG9pbnRlclgoZXZlbnQpICogZmxJbnZlcnNlWm9vbSwgRXZlbnQucG9pbnRlclkoZXZlbnQpICogZmxJbnZlcnNlWm9vbV0sIGVsZW1lbnQsIHRoaXMubGFzdF9hY3RpdmUpKQ0KICAgICAgaWYgKHRoaXMubGFzdF9hY3RpdmUub25Ecm9wKSB7DQogICAgICAgIHRoaXMubGFzdF9hY3RpdmUub25Ecm9wKGVsZW1lbnQsIHRoaXMubGFzdF9hY3RpdmUuZWxlbWVudCwgZXZlbnQpOw0KICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgIH0NCiAgfSwNCg0KICByZXNldDogZnVuY3Rpb24oKSB7DQogICAgaWYodGhpcy5sYXN0X2FjdGl2ZSkNCiAgICAgIHRoaXMuZGVhY3RpdmF0ZSh0aGlzLmxhc3RfYWN0aXZlKTsNCiAgfQ0KfQ0KDQp2YXIgRHJhZ2dhYmxlcyA9IHsNCiAgZHJhZ3M6IFtdLA0KICBvYnNlcnZlcnM6IFtdLA0KDQogIHJlZ2lzdGVyOiBmdW5jdGlvbihkcmFnZ2FibGUpIHsNCiAgICBpZih0aGlzLmRyYWdzLmxlbmd0aCA9PSAwKSB7DQogICAgICB0aGlzLmV2ZW50TW91c2VVcCAgID0gdGhpcy5lbmREcmFnLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7DQogICAgICB0aGlzLmV2ZW50TW91c2VNb3ZlID0gdGhpcy51cGRhdGVEcmFnLmJpbmRBc0V2ZW50TGlzdGVuZXIodGhpcyk7DQogICAgICB0aGlzLmV2ZW50S2V5cHJlc3MgID0gdGhpcy5rZXlQcmVzcy5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpOw0KDQogICAgICBFdmVudC5vYnNlcnZlKGRvY3VtZW50LCAibW91c2V1cCIsIHRoaXMuZXZlbnRNb3VzZVVwKTsNCiAgICAgIEV2ZW50Lm9ic2VydmUoZG9jdW1lbnQsICJtb3VzZW1vdmUiLCB0aGlzLmV2ZW50TW91c2VNb3ZlKTsNCiAgICAgIEV2ZW50Lm9ic2VydmUoZG9jdW1lbnQsICJrZXlwcmVzcyIsIHRoaXMuZXZlbnRLZXlwcmVzcyk7DQogICAgfQ0KICAgIHRoaXMuZHJhZ3MucHVzaChkcmFnZ2FibGUpOw0KICB9LA0KDQogIHVucmVnaXN0ZXI6IGZ1bmN0aW9uKGRyYWdnYWJsZSkgew0KICAgIHRoaXMuZHJhZ3MgPSB0aGlzLmRyYWdzLnJlamVjdChmdW5jdGlvbihkKSB7IHJldHVybiBkPT1kcmFnZ2FibGUgfSk7DQogICAgaWYodGhpcy5kcmFncy5sZW5ndGggPT0gMCkgew0KICAgICAgRXZlbnQuc3RvcE9ic2VydmluZyhkb2N1bWVudCwgIm1vdXNldXAiLCB0aGlzLmV2ZW50TW91c2VVcCk7DQogICAgICBFdmVudC5zdG9wT2JzZXJ2aW5nKGRvY3VtZW50LCAibW91c2Vtb3ZlIiwgdGhpcy5ldmVudE1vdXNlTW92ZSk7DQogICAgICBFdmVudC5zdG9wT2JzZXJ2aW5nKGRvY3VtZW50LCAia2V5cHJlc3MiLCB0aGlzLmV2ZW50S2V5cHJlc3MpOw0KICAgIH0NCiAgfSwNCg0KICBhY3RpdmF0ZTogZnVuY3Rpb24oZHJhZ2dhYmxlKSB7DQogICAgaWYoZHJhZ2dhYmxlLm9wdGlvbnMuZGVsYXkpIHsNCiAgICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICBEcmFnZ2FibGVzLl90aW1lb3V0ID0gbnVsbDsNCiAgICAgICAgd2luZG93LmZvY3VzKCk7DQogICAgICAgIERyYWdnYWJsZXMuYWN0aXZlRHJhZ2dhYmxlID0gZHJhZ2dhYmxlOw0KICAgICAgfS5iaW5kKHRoaXMpLCBkcmFnZ2FibGUub3B0aW9ucy5kZWxheSk7DQogICAgfSBlbHNlIHsNCiAgICAgIHdpbmRvdy5mb2N1cygpOyAvLyBhbGxvd3Mga2V5cHJlc3MgZXZlbnRzIGlmIHdpbmRvdyBpc24ndCBjdXJyZW50bHkgZm9jdXNlZCwgZmFpbHMgZm9yIFNhZmFyaQ0KICAgICAgdGhpcy5hY3RpdmVEcmFnZ2FibGUgPSBkcmFnZ2FibGU7DQogICAgfQ0KICB9LA0KDQogIGRlYWN0aXZhdGU6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuYWN0aXZlRHJhZ2dhYmxlID0gbnVsbDsNCiAgfSwNCg0KICB1cGRhdGVEcmFnOiBmdW5jdGlvbihldmVudCkgew0KICAgIGlmKCF0aGlzLmFjdGl2ZURyYWdnYWJsZSkgcmV0dXJuOw0KICAgIHZhciBmbEludmVyc2Vab29tID0gMSAvIChkb2N1bWVudC5ib2R5LnN0eWxlLnpvb20gfHwgMSk7DQogICAgdmFyIHBvaW50ZXIgPSBbRXZlbnQucG9pbnRlclgoZXZlbnQpICogZmxJbnZlcnNlWm9vbSwgRXZlbnQucG9pbnRlclkoZXZlbnQpICogZmxJbnZlcnNlWm9vbV07DQogICAgLy8gTW96aWxsYS1iYXNlZCBicm93c2VycyBmaXJlIHN1Y2Nlc3NpdmUgbW91c2Vtb3ZlIGV2ZW50cyB3aXRoDQogICAgLy8gdGhlIHNhbWUgY29vcmRpbmF0ZXMsIHByZXZlbnQgbmVlZGxlc3MgcmVkcmF3aW5nIChtb3ogYnVnPykNCiAgICBpZih0aGlzLl9sYXN0UG9pbnRlciAmJiAodGhpcy5fbGFzdFBvaW50ZXIuaW5zcGVjdCgpID09IHBvaW50ZXIuaW5zcGVjdCgpKSkgcmV0dXJuOw0KICAgIHRoaXMuX2xhc3RQb2ludGVyID0gcG9pbnRlcjsNCg0KICAgIHRoaXMuYWN0aXZlRHJhZ2dhYmxlLnVwZGF0ZURyYWcoZXZlbnQsIHBvaW50ZXIpOw0KICB9LA0KDQogIGVuZERyYWc6IGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgaWYodGhpcy5fdGltZW91dCkgew0KICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpOw0KICAgICAgdGhpcy5fdGltZW91dCA9IG51bGw7DQogICAgfQ0KICAgIGlmKCF0aGlzLmFjdGl2ZURyYWdnYWJsZSkgcmV0dXJuOw0KICAgIHRoaXMuX2xhc3RQb2ludGVyID0gbnVsbDsNCiAgICB0aGlzLmFjdGl2ZURyYWdnYWJsZS5lbmREcmFnKGV2ZW50KTsNCiAgICB0aGlzLmFjdGl2ZURyYWdnYWJsZSA9IG51bGw7DQogIH0sDQoNCiAga2V5UHJlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgaWYodGhpcy5hY3RpdmVEcmFnZ2FibGUpDQogICAgICB0aGlzLmFjdGl2ZURyYWdnYWJsZS5rZXlQcmVzcyhldmVudCk7DQogIH0sDQoNCiAgYWRkT2JzZXJ2ZXI6IGZ1bmN0aW9uKG9ic2VydmVyKSB7DQogICAgdGhpcy5vYnNlcnZlcnMucHVzaChvYnNlcnZlcik7DQogICAgdGhpcy5fY2FjaGVPYnNlcnZlckNhbGxiYWNrcygpOw0KICB9LA0KDQogIHJlbW92ZU9ic2VydmVyOiBmdW5jdGlvbihlbGVtZW50KSB7ICAvLyBlbGVtZW50IGluc3RlYWQgb2Ygb2JzZXJ2ZXIgZml4ZXMgbWVtIGxlYWtzDQogICAgdGhpcy5vYnNlcnZlcnMgPSB0aGlzLm9ic2VydmVycy5yZWplY3QoIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uZWxlbWVudD09ZWxlbWVudCB9KTsNCiAgICB0aGlzLl9jYWNoZU9ic2VydmVyQ2FsbGJhY2tzKCk7DQogIH0sDQoNCiAgbm90aWZ5OiBmdW5jdGlvbihldmVudE5hbWUsIGRyYWdnYWJsZSwgZXZlbnQpIHsgIC8vICdvblN0YXJ0JywgJ29uRW5kJywgJ29uRHJhZycNCiAgICBpZih0aGlzW2V2ZW50TmFtZSsnQ291bnQnXSA+IDApDQogICAgICB0aGlzLm9ic2VydmVycy5lYWNoKCBmdW5jdGlvbihvKSB7DQogICAgICAgIGlmKG9bZXZlbnROYW1lXSkgb1tldmVudE5hbWVdKGV2ZW50TmFtZSwgZHJhZ2dhYmxlLCBldmVudCk7DQogICAgICB9KTsNCiAgICBpZihkcmFnZ2FibGUub3B0aW9uc1tldmVudE5hbWVdKSBkcmFnZ2FibGUub3B0aW9uc1tldmVudE5hbWVdKGRyYWdnYWJsZSwgZXZlbnQpOw0KICB9LA0KDQogIF9jYWNoZU9ic2VydmVyQ2FsbGJhY2tzOiBmdW5jdGlvbigpIHsNCiAgICBbJ29uU3RhcnQnLCdvbkVuZCcsJ29uRHJhZyddLmVhY2goIGZ1bmN0aW9uKGV2ZW50TmFtZSkgew0KICAgICAgRHJhZ2dhYmxlc1tldmVudE5hbWUrJ0NvdW50J10gPSBEcmFnZ2FibGVzLm9ic2VydmVycy5zZWxlY3QoDQogICAgICAgIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG9bZXZlbnROYW1lXTsgfQ0KICAgICAgKS5sZW5ndGg7DQogICAgfSk7DQogIH0NCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnZhciBEcmFnZ2FibGUgPSBDbGFzcy5jcmVhdGUoew0KICBpbml0aWFsaXplOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgdmFyIGRlZmF1bHRzID0gew0KICAgICAgaGFuZGxlOiBmYWxzZSwNCiAgICAgIHJldmVydGVmZmVjdDogZnVuY3Rpb24oZWxlbWVudCwgdG9wX29mZnNldCwgbGVmdF9vZmZzZXQpIHsNCiAgICAgICAgdmFyIGR1ciA9IE1hdGguc3FydChNYXRoLmFicyh0b3Bfb2Zmc2V0XjIpK01hdGguYWJzKGxlZnRfb2Zmc2V0XjIpKSowLjAyOw0KICAgICAgICBuZXcgRWZmZWN0Lk1vdmUoZWxlbWVudCwgeyB4OiAtbGVmdF9vZmZzZXQsIHk6IC10b3Bfb2Zmc2V0LCBkdXJhdGlvbjogZHVyLA0KICAgICAgICAgIHF1ZXVlOiB7c2NvcGU6J19kcmFnZ2FibGUnLCBwb3NpdGlvbjonZW5kJ30NCiAgICAgICAgfSk7DQogICAgICB9LA0KICAgICAgZW5kZWZmZWN0OiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgICAgIHZhciB0b09wYWNpdHkgPSBPYmplY3QuaXNOdW1iZXIoZWxlbWVudC5fb3BhY2l0eSkgPyBlbGVtZW50Ll9vcGFjaXR5IDogMS4wOw0KICAgICAgICBuZXcgRWZmZWN0Lk9wYWNpdHkoZWxlbWVudCwge2R1cmF0aW9uOjAuMiwgZnJvbTowLjcsIHRvOnRvT3BhY2l0eSwNCiAgICAgICAgICBxdWV1ZToge3Njb3BlOidfZHJhZ2dhYmxlJywgcG9zaXRpb246J2VuZCd9LA0KICAgICAgICAgIGFmdGVyRmluaXNoOiBmdW5jdGlvbigpew0KICAgICAgICAgICAgRHJhZ2dhYmxlLl9kcmFnZ2luZ1tlbGVtZW50XSA9IGZhbHNlDQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgIH0sDQogICAgICB6aW5kZXg6IDEwMDAsDQogICAgICByZXZlcnQ6IGZhbHNlLA0KICAgICAgcXVpZXQ6IGZhbHNlLA0KICAgICAgc2Nyb2xsOiBmYWxzZSwNCiAgICAgIHNjcm9sbFNlbnNpdGl2aXR5OiAyMCwNCiAgICAgIHNjcm9sbFNwZWVkOiAxNSwNCiAgICAgIHNuYXA6IGZhbHNlLCAgLy8gZmFsc2UsIG9yIHh5IG9yIFt4LHldIG9yIGZ1bmN0aW9uKHgseSl7IHJldHVybiBbeCx5XSB9DQogICAgICBkZWxheTogMA0KICAgIH07DQoNCiAgICBpZighYXJndW1lbnRzWzFdIHx8IE9iamVjdC5pc1VuZGVmaW5lZChhcmd1bWVudHNbMV0uZW5kZWZmZWN0KSkNCiAgICAgIE9iamVjdC5leHRlbmQoZGVmYXVsdHMsIHsNCiAgICAgICAgc3RhcnRlZmZlY3Q6IGZ1bmN0aW9uKGVsZW1lbnQpIHsNCiAgICAgICAgICBlbGVtZW50Ll9vcGFjaXR5ID0gRWxlbWVudC5nZXRPcGFjaXR5KGVsZW1lbnQpOw0KICAgICAgICAgIERyYWdnYWJsZS5fZHJhZ2dpbmdbZWxlbWVudF0gPSB0cnVlOw0KICAgICAgICAgIG5ldyBFZmZlY3QuT3BhY2l0eShlbGVtZW50LCB7ZHVyYXRpb246MC4yLCBmcm9tOmVsZW1lbnQuX29wYWNpdHksIHRvOjAuN30pOw0KICAgICAgICB9DQogICAgICB9KTsNCg0KICAgIHZhciBvcHRpb25zID0gT2JqZWN0LmV4dGVuZChkZWZhdWx0cywgYXJndW1lbnRzWzFdIHx8IHsgfSk7DQoNCiAgICB0aGlzLmVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KDQogICAgaWYob3B0aW9ucy5oYW5kbGUgJiYgT2JqZWN0LmlzU3RyaW5nKG9wdGlvbnMuaGFuZGxlKSkNCiAgICAgIHRoaXMuaGFuZGxlID0gdGhpcy5lbGVtZW50LmRvd24oJy4nK29wdGlvbnMuaGFuZGxlLCAwKTsNCg0KICAgIGlmKCF0aGlzLmhhbmRsZSkgdGhpcy5oYW5kbGUgPSAkKG9wdGlvbnMuaGFuZGxlKTsNCiAgICBpZighdGhpcy5oYW5kbGUpIHRoaXMuaGFuZGxlID0gdGhpcy5lbGVtZW50Ow0KDQogICAgaWYob3B0aW9ucy5zY3JvbGwgJiYgIW9wdGlvbnMuc2Nyb2xsLnNjcm9sbFRvICYmICFvcHRpb25zLnNjcm9sbC5vdXRlckhUTUwpIHsNCiAgICAgIG9wdGlvbnMuc2Nyb2xsID0gJChvcHRpb25zLnNjcm9sbCk7DQogICAgICB0aGlzLl9pc1Njcm9sbENoaWxkID0gRWxlbWVudC5jaGlsZE9mKHRoaXMuZWxlbWVudCwgb3B0aW9ucy5zY3JvbGwpOw0KICAgIH0NCg0KICAgIEVsZW1lbnQubWFrZVBvc2l0aW9uZWQodGhpcy5lbGVtZW50KTsgLy8gZml4IElFDQoNCiAgICB0aGlzLm9wdGlvbnMgID0gb3B0aW9uczsNCiAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7DQoNCiAgICB0aGlzLmV2ZW50TW91c2VEb3duID0gdGhpcy5pbml0RHJhZy5iaW5kQXNFdmVudExpc3RlbmVyKHRoaXMpOw0KICAgIEV2ZW50Lm9ic2VydmUodGhpcy5oYW5kbGUsICJtb3VzZWRvd24iLCB0aGlzLmV2ZW50TW91c2VEb3duKTsNCg0KICAgIERyYWdnYWJsZXMucmVnaXN0ZXIodGhpcyk7DQogIH0sDQoNCiAgZGVzdHJveTogZnVuY3Rpb24oKSB7DQogICAgRXZlbnQuc3RvcE9ic2VydmluZyh0aGlzLmhhbmRsZSwgIm1vdXNlZG93biIsIHRoaXMuZXZlbnRNb3VzZURvd24pOw0KICAgIERyYWdnYWJsZXMudW5yZWdpc3Rlcih0aGlzKTsNCiAgfSwNCg0KICBjdXJyZW50RGVsdGE6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybihbDQogICAgICBwYXJzZUludChFbGVtZW50LmdldFN0eWxlKHRoaXMuZWxlbWVudCwnbGVmdCcpIHx8ICcwJyksDQogICAgICBwYXJzZUludChFbGVtZW50LmdldFN0eWxlKHRoaXMuZWxlbWVudCwndG9wJykgfHwgJzAnKV0pOw0KICB9LA0KDQogIGluaXREcmFnOiBmdW5jdGlvbihldmVudCkgew0KICAgIGlmKCFPYmplY3QuaXNVbmRlZmluZWQoRHJhZ2dhYmxlLl9kcmFnZ2luZ1t0aGlzLmVsZW1lbnRdKSAmJg0KICAgICAgRHJhZ2dhYmxlLl9kcmFnZ2luZ1t0aGlzLmVsZW1lbnRdKSByZXR1cm47DQogICAgaWYoRXZlbnQuaXNMZWZ0Q2xpY2soZXZlbnQpKSB7DQogICAgICAvLyBhYm9ydCBvbiBmb3JtIGVsZW1lbnRzLCBmaXhlcyBhIEZpcmVmb3ggaXNzdWUNCiAgICAgIHZhciBzcmMgPSBFdmVudC5lbGVtZW50KGV2ZW50KTsNCiAgICAgIGlmKCh0YWdfbmFtZSA9IHNyYy50YWdOYW1lLnRvVXBwZXJDYXNlKCkpICYmICgNCiAgICAgICAgdGFnX25hbWU9PSdJTlBVVCcgfHwNCiAgICAgICAgdGFnX25hbWU9PSdTRUxFQ1QnIHx8DQogICAgICAgIHRhZ19uYW1lPT0nT1BUSU9OJyB8fA0KICAgICAgICB0YWdfbmFtZT09J0JVVFRPTicgfHwNCiAgICAgICAgdGFnX25hbWU9PSdURVhUQVJFQScpKSByZXR1cm47DQoNCiAgICAgIHZhciBmbEludmVyc2Vab29tID0gMSAvIChkb2N1bWVudC5ib2R5LnN0eWxlLnpvb20gfHwgMSk7DQogICAgICB2YXIgcG9pbnRlciA9IFtFdmVudC5wb2ludGVyWChldmVudCkgKiBmbEludmVyc2Vab29tLCBFdmVudC5wb2ludGVyWShldmVudCkgKiBmbEludmVyc2Vab29tXTsNCiAgICAgIHZhciBwb3MgICAgID0gUG9zaXRpb24uY3VtdWxhdGl2ZU9mZnNldCh0aGlzLmVsZW1lbnQpOw0KICAgICAgdGhpcy5vZmZzZXQgPSBbMCwxXS5tYXAoIGZ1bmN0aW9uKGkpIHsgcmV0dXJuIChwb2ludGVyW2ldIC0gcG9zW2ldKSB9KTsNCg0KICAgICAgRHJhZ2dhYmxlcy5hY3RpdmF0ZSh0aGlzKTsNCiAgICAgIEV2ZW50LnN0b3AoZXZlbnQpOw0KICAgIH0NCiAgfSwNCg0KICBzdGFydERyYWc6IGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7DQogICAgaWYoIXRoaXMuZGVsdGEpDQogICAgICB0aGlzLmRlbHRhID0gdGhpcy5jdXJyZW50RGVsdGEoKTsNCg0KICAgIGlmKHRoaXMub3B0aW9ucy56aW5kZXgpIHsNCiAgICAgIHRoaXMub3JpZ2luYWxaID0gcGFyc2VJbnQoRWxlbWVudC5nZXRTdHlsZSh0aGlzLmVsZW1lbnQsJ3otaW5kZXgnKSB8fCAnJyk7DQogICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuekluZGV4ID0gdGhpcy5vcHRpb25zLnppbmRleDsNCiAgICB9DQoNCiAgICBpZih0aGlzLm9wdGlvbnMuZ2hvc3RpbmcpIHsNCiAgICAgIHRoaXMuX2Nsb25lID0gdGhpcy5lbGVtZW50LmNsb25lTm9kZSh0cnVlKTsNCiAgICAgIHRoaXMuZWxlbWVudC5fb3JpZ2luYWxseUFic29sdXRlID0gKHRoaXMuZWxlbWVudC5nZXRTdHlsZSgncG9zaXRpb24nKSA9PSAnYWJzb2x1dGUnKTsNCiAgICAgIGlmICghdGhpcy5lbGVtZW50Ll9vcmlnaW5hbGx5QWJzb2x1dGUpDQogICAgICAgIFBvc2l0aW9uLmFic29sdXRpemUodGhpcy5lbGVtZW50KTsNCiAgICAgIHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLl9jbG9uZSwgdGhpcy5lbGVtZW50KTsNCiAgICB9DQoNCiAgICBpZih0aGlzLm9wdGlvbnMuc2Nyb2xsKSB7DQogICAgICBpZiAodGhpcy5vcHRpb25zLnNjcm9sbCA9PSB3aW5kb3cpIHsNCiAgICAgICAgdmFyIHdoZXJlID0gdGhpcy5fZ2V0V2luZG93U2Nyb2xsKHRoaXMub3B0aW9ucy5zY3JvbGwpOw0KICAgICAgICB0aGlzLm9yaWdpbmFsU2Nyb2xsTGVmdCA9IHdoZXJlLmxlZnQ7DQogICAgICAgIHRoaXMub3JpZ2luYWxTY3JvbGxUb3AgPSB3aGVyZS50b3A7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLm9yaWdpbmFsU2Nyb2xsTGVmdCA9IHRoaXMub3B0aW9ucy5zY3JvbGwuc2Nyb2xsTGVmdDsNCiAgICAgICAgdGhpcy5vcmlnaW5hbFNjcm9sbFRvcCA9IHRoaXMub3B0aW9ucy5zY3JvbGwuc2Nyb2xsVG9wOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIERyYWdnYWJsZXMubm90aWZ5KCdvblN0YXJ0JywgdGhpcywgZXZlbnQpOw0KDQogICAgaWYodGhpcy5vcHRpb25zLnN0YXJ0ZWZmZWN0KSB0aGlzLm9wdGlvbnMuc3RhcnRlZmZlY3QodGhpcy5lbGVtZW50KTsNCiAgfSwNCg0KICB1cGRhdGVEcmFnOiBmdW5jdGlvbihldmVudCwgcG9pbnRlcikgew0KICAgIGlmKCF0aGlzLmRyYWdnaW5nKSB0aGlzLnN0YXJ0RHJhZyhldmVudCk7DQoNCiAgICBpZighdGhpcy5vcHRpb25zLnF1aWV0KXsNCiAgICAgIFBvc2l0aW9uLnByZXBhcmUoKTsNCiAgICAgIERyb3BwYWJsZXMuc2hvdyhwb2ludGVyLCB0aGlzLmVsZW1lbnQpOw0KICAgIH0NCg0KICAgIERyYWdnYWJsZXMubm90aWZ5KCdvbkRyYWcnLCB0aGlzLCBldmVudCk7DQoNCiAgICB0aGlzLmRyYXcocG9pbnRlcik7DQogICAgaWYodGhpcy5vcHRpb25zLmNoYW5nZSkgdGhpcy5vcHRpb25zLmNoYW5nZSh0aGlzKTsNCg0KICAgIGlmKHRoaXMub3B0aW9ucy5zY3JvbGwpIHsNCiAgICAgIHRoaXMuc3RvcFNjcm9sbGluZygpOw0KDQogICAgICB2YXIgcDsNCiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2Nyb2xsID09IHdpbmRvdykgew0KICAgICAgICB3aXRoKHRoaXMuX2dldFdpbmRvd1Njcm9sbCh0aGlzLm9wdGlvbnMuc2Nyb2xsKSkgeyBwID0gWyBsZWZ0LCB0b3AsIGxlZnQrd2lkdGgsIHRvcCtoZWlnaHQgXTsgfQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcCA9IFBvc2l0aW9uLnBhZ2UodGhpcy5vcHRpb25zLnNjcm9sbCk7DQogICAgICAgIHBbMF0gKz0gdGhpcy5vcHRpb25zLnNjcm9sbC5zY3JvbGxMZWZ0ICsgUG9zaXRpb24uZGVsdGFYOw0KICAgICAgICBwWzFdICs9IHRoaXMub3B0aW9ucy5zY3JvbGwuc2Nyb2xsVG9wICsgUG9zaXRpb24uZGVsdGFZOw0KICAgICAgICBwLnB1c2gocFswXSt0aGlzLm9wdGlvbnMuc2Nyb2xsLm9mZnNldFdpZHRoKTsNCiAgICAgICAgcC5wdXNoKHBbMV0rdGhpcy5vcHRpb25zLnNjcm9sbC5vZmZzZXRIZWlnaHQpOw0KICAgICAgfQ0KICAgICAgdmFyIHNwZWVkID0gWzAsMF07DQogICAgICBpZihwb2ludGVyWzBdIDwgKHBbMF0rdGhpcy5vcHRpb25zLnNjcm9sbFNlbnNpdGl2aXR5KSkgc3BlZWRbMF0gPSBwb2ludGVyWzBdLShwWzBdK3RoaXMub3B0aW9ucy5zY3JvbGxTZW5zaXRpdml0eSk7DQogICAgICBpZihwb2ludGVyWzFdIDwgKHBbMV0rdGhpcy5vcHRpb25zLnNjcm9sbFNlbnNpdGl2aXR5KSkgc3BlZWRbMV0gPSBwb2ludGVyWzFdLShwWzFdK3RoaXMub3B0aW9ucy5zY3JvbGxTZW5zaXRpdml0eSk7DQogICAgICBpZihwb2ludGVyWzBdID4gKHBbMl0tdGhpcy5vcHRpb25zLnNjcm9sbFNlbnNpdGl2aXR5KSkgc3BlZWRbMF0gPSBwb2ludGVyWzBdLShwWzJdLXRoaXMub3B0aW9ucy5zY3JvbGxTZW5zaXRpdml0eSk7DQogICAgICBpZihwb2ludGVyWzFdID4gKHBbM10tdGhpcy5vcHRpb25zLnNjcm9sbFNlbnNpdGl2aXR5KSkgc3BlZWRbMV0gPSBwb2ludGVyWzFdLShwWzNdLXRoaXMub3B0aW9ucy5zY3JvbGxTZW5zaXRpdml0eSk7DQogICAgICB0aGlzLnN0YXJ0U2Nyb2xsaW5nKHNwZWVkKTsNCiAgICB9DQoNCiAgICAvLyBmaXggQXBwbGVXZWJLaXQgcmVuZGVyaW5nDQogICAgaWYoUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0KSB3aW5kb3cuc2Nyb2xsQnkoMCwwKTsNCg0KICAgIEV2ZW50LnN0b3AoZXZlbnQpOw0KICB9LA0KDQogIGZpbmlzaERyYWc6IGZ1bmN0aW9uKGV2ZW50LCBzdWNjZXNzKSB7DQogICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlOw0KDQogICAgaWYodGhpcy5vcHRpb25zLnF1aWV0KXsNCiAgICAgIFBvc2l0aW9uLnByZXBhcmUoKTsNCiAgICAgIHZhciBmbEludmVyc2Vab29tID0gMSAvIChkb2N1bWVudC5ib2R5LnN0eWxlLnpvb20gfHwgMSk7DQogICAgICB2YXIgcG9pbnRlciA9IFtFdmVudC5wb2ludGVyWChldmVudCkgKiBmbEludmVyc2Vab29tLCBFdmVudC5wb2ludGVyWShldmVudCkgKiBmbEludmVyc2Vab29tXTsNCiAgICAgIERyb3BwYWJsZXMuc2hvdyhwb2ludGVyLCB0aGlzLmVsZW1lbnQpOw0KICAgIH0NCg0KICAgIGlmKHRoaXMub3B0aW9ucy5naG9zdGluZykgew0KICAgICAgaWYgKCF0aGlzLmVsZW1lbnQuX29yaWdpbmFsbHlBYnNvbHV0ZSkNCiAgICAgICAgUG9zaXRpb24ucmVsYXRpdml6ZSh0aGlzLmVsZW1lbnQpOw0KICAgICAgZGVsZXRlIHRoaXMuZWxlbWVudC5fb3JpZ2luYWxseUFic29sdXRlOw0KICAgICAgRWxlbWVudC5yZW1vdmUodGhpcy5fY2xvbmUpOw0KICAgICAgdGhpcy5fY2xvbmUgPSBudWxsOw0KICAgIH0NCg0KICAgIHZhciBkcm9wcGVkID0gZmFsc2U7DQogICAgaWYoc3VjY2Vzcykgew0KICAgICAgZHJvcHBlZCA9IERyb3BwYWJsZXMuZmlyZShldmVudCwgdGhpcy5lbGVtZW50KTsNCiAgICAgIGlmICghZHJvcHBlZCkgZHJvcHBlZCA9IGZhbHNlOw0KICAgIH0NCiAgICBpZihkcm9wcGVkICYmIHRoaXMub3B0aW9ucy5vbkRyb3BwZWQpIHRoaXMub3B0aW9ucy5vbkRyb3BwZWQodGhpcy5lbGVtZW50KTsNCiAgICBEcmFnZ2FibGVzLm5vdGlmeSgnb25FbmQnLCB0aGlzLCBldmVudCk7DQoNCiAgICB2YXIgcmV2ZXJ0ID0gdGhpcy5vcHRpb25zLnJldmVydDsNCiAgICBpZihyZXZlcnQgJiYgT2JqZWN0LmlzRnVuY3Rpb24ocmV2ZXJ0KSkgcmV2ZXJ0ID0gcmV2ZXJ0KHRoaXMuZWxlbWVudCk7DQoNCiAgICB2YXIgZCA9IHRoaXMuY3VycmVudERlbHRhKCk7DQogICAgaWYocmV2ZXJ0ICYmIHRoaXMub3B0aW9ucy5yZXZlcnRlZmZlY3QpIHsNCiAgICAgIGlmIChkcm9wcGVkID09IDAgfHwgcmV2ZXJ0ICE9ICdmYWlsdXJlJykNCiAgICAgICAgdGhpcy5vcHRpb25zLnJldmVydGVmZmVjdCh0aGlzLmVsZW1lbnQsDQogICAgICAgICAgZFsxXS10aGlzLmRlbHRhWzFdLCBkWzBdLXRoaXMuZGVsdGFbMF0pOw0KICAgIH0gZWxzZSB7DQogICAgICB0aGlzLmRlbHRhID0gZDsNCiAgICB9DQoNCiAgICBpZih0aGlzLm9wdGlvbnMuemluZGV4KQ0KICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnpJbmRleCA9IHRoaXMub3JpZ2luYWxaOw0KDQogICAgaWYodGhpcy5vcHRpb25zLmVuZGVmZmVjdCkNCiAgICAgIHRoaXMub3B0aW9ucy5lbmRlZmZlY3QodGhpcy5lbGVtZW50KTsNCg0KICAgIERyYWdnYWJsZXMuZGVhY3RpdmF0ZSh0aGlzKTsNCiAgICBEcm9wcGFibGVzLnJlc2V0KCk7DQogIH0sDQoNCiAga2V5UHJlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgaWYoZXZlbnQua2V5Q29kZSE9RXZlbnQuS0VZX0VTQykgcmV0dXJuOw0KICAgIHRoaXMuZmluaXNoRHJhZyhldmVudCwgZmFsc2UpOw0KICAgIEV2ZW50LnN0b3AoZXZlbnQpOw0KICB9LA0KDQogIGVuZERyYWc6IGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgaWYoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjsNCiAgICB0aGlzLnN0b3BTY3JvbGxpbmcoKTsNCiAgICB0aGlzLmZpbmlzaERyYWcoZXZlbnQsIHRydWUpOw0KICAgIEV2ZW50LnN0b3AoZXZlbnQpOw0KICB9LA0KDQogIGRyYXc6IGZ1bmN0aW9uKHBvaW50KSB7DQogICAgdmFyIHBvcyA9IFBvc2l0aW9uLmN1bXVsYXRpdmVPZmZzZXQodGhpcy5lbGVtZW50KTsNCiAgICBpZih0aGlzLm9wdGlvbnMuZ2hvc3RpbmcpIHsNCiAgICAgIHZhciByICAgPSBQb3NpdGlvbi5yZWFsT2Zmc2V0KHRoaXMuZWxlbWVudCk7DQogICAgICBwb3NbMF0gKz0gclswXSAtIFBvc2l0aW9uLmRlbHRhWDsNCiAgICAgIHBvc1sxXSArPSByWzFdIC0gUG9zaXRpb24uZGVsdGFZOw0KICAgIH0NCg0KICAgIHZhciBkID0gdGhpcy5jdXJyZW50RGVsdGEoKTsNCg0KICAgIHBvc1swXSAtPSBkWzBdOw0KICAgIHBvc1sxXSAtPSBkWzFdOw0KDQogICAgaWYodGhpcy5vcHRpb25zLnNjcm9sbCAmJiAodGhpcy5vcHRpb25zLnNjcm9sbCAhPSB3aW5kb3cgJiYgdGhpcy5faXNTY3JvbGxDaGlsZCkpIHsNCiAgICAgIHBvc1swXSAtPSB0aGlzLm9wdGlvbnMuc2Nyb2xsLnNjcm9sbExlZnQtdGhpcy5vcmlnaW5hbFNjcm9sbExlZnQ7DQogICAgICBwb3NbMV0gLT0gdGhpcy5vcHRpb25zLnNjcm9sbC5zY3JvbGxUb3AtdGhpcy5vcmlnaW5hbFNjcm9sbFRvcDsNCiAgICB9DQoNCiAgICB2YXIgcCA9IFswLDFdLm1hcChmdW5jdGlvbihpKXsNCiAgICAgIHJldHVybiAocG9pbnRbaV0tcG9zW2ldLXRoaXMub2Zmc2V0W2ldKQ0KICAgIH0uYmluZCh0aGlzKSk7DQoNCiAgICBpZih0aGlzLm9wdGlvbnMuc25hcCkgew0KICAgICAgaWYoT2JqZWN0LmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnNuYXApKSB7DQogICAgICAgIHAgPSB0aGlzLm9wdGlvbnMuc25hcChwWzBdLHBbMV0sdGhpcyk7DQogICAgICB9IGVsc2Ugew0KICAgICAgaWYoT2JqZWN0LmlzQXJyYXkodGhpcy5vcHRpb25zLnNuYXApKSB7DQogICAgICAgIHAgPSBwLm1hcCggZnVuY3Rpb24odiwgaSkgew0KICAgICAgICAgIHJldHVybiAodi90aGlzLm9wdGlvbnMuc25hcFtpXSkucm91bmQoKSp0aGlzLm9wdGlvbnMuc25hcFtpXSB9LmJpbmQodGhpcykpDQogICAgICB9IGVsc2Ugew0KICAgICAgICBwID0gcC5tYXAoIGZ1bmN0aW9uKHYpIHsNCiAgICAgICAgICByZXR1cm4gKHYvdGhpcy5vcHRpb25zLnNuYXApLnJvdW5kKCkqdGhpcy5vcHRpb25zLnNuYXAgfS5iaW5kKHRoaXMpKQ0KICAgICAgfQ0KICAgIH19DQoNCiAgICB2YXIgc3R5bGUgPSB0aGlzLmVsZW1lbnQuc3R5bGU7DQogICAgaWYoKCF0aGlzLm9wdGlvbnMuY29uc3RyYWludCkgfHwgKHRoaXMub3B0aW9ucy5jb25zdHJhaW50PT0naG9yaXpvbnRhbCcpKQ0KICAgICAgc3R5bGUubGVmdCA9IHBbMF0gKyAicHgiOw0KICAgIGlmKCghdGhpcy5vcHRpb25zLmNvbnN0cmFpbnQpIHx8ICh0aGlzLm9wdGlvbnMuY29uc3RyYWludD09J3ZlcnRpY2FsJykpDQogICAgICBzdHlsZS50b3AgID0gcFsxXSArICJweCI7DQoNCiAgICBpZihzdHlsZS52aXNpYmlsaXR5PT0iaGlkZGVuIikgc3R5bGUudmlzaWJpbGl0eSA9ICIiOyAvLyBmaXggZ2Vja28gcmVuZGVyaW5nDQogIH0sDQoNCiAgc3RvcFNjcm9sbGluZzogZnVuY3Rpb24oKSB7DQogICAgaWYodGhpcy5zY3JvbGxJbnRlcnZhbCkgew0KICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnNjcm9sbEludGVydmFsKTsNCiAgICAgIHRoaXMuc2Nyb2xsSW50ZXJ2YWwgPSBudWxsOw0KICAgICAgRHJhZ2dhYmxlcy5fbGFzdFNjcm9sbFBvaW50ZXIgPSBudWxsOw0KICAgIH0NCiAgfSwNCg0KICBzdGFydFNjcm9sbGluZzogZnVuY3Rpb24oc3BlZWQpIHsNCiAgICBpZighKHNwZWVkWzBdIHx8IHNwZWVkWzFdKSkgcmV0dXJuOw0KICAgIHRoaXMuc2Nyb2xsU3BlZWQgPSBbc3BlZWRbMF0qdGhpcy5vcHRpb25zLnNjcm9sbFNwZWVkLHNwZWVkWzFdKnRoaXMub3B0aW9ucy5zY3JvbGxTcGVlZF07DQogICAgdGhpcy5sYXN0U2Nyb2xsZWQgPSBuZXcgRGF0ZSgpOw0KICAgIHRoaXMuc2Nyb2xsSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh0aGlzLnNjcm9sbC5iaW5kKHRoaXMpLCAxMCk7DQogIH0sDQoNCiAgc2Nyb2xsOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgY3VycmVudCA9IG5ldyBEYXRlKCk7DQogICAgdmFyIGRlbHRhID0gY3VycmVudCAtIHRoaXMubGFzdFNjcm9sbGVkOw0KICAgIHRoaXMubGFzdFNjcm9sbGVkID0gY3VycmVudDsNCiAgICBpZih0aGlzLm9wdGlvbnMuc2Nyb2xsID09IHdpbmRvdykgew0KICAgICAgd2l0aCAodGhpcy5fZ2V0V2luZG93U2Nyb2xsKHRoaXMub3B0aW9ucy5zY3JvbGwpKSB7DQogICAgICAgIGlmICh0aGlzLnNjcm9sbFNwZWVkWzBdIHx8IHRoaXMuc2Nyb2xsU3BlZWRbMV0pIHsNCiAgICAgICAgICB2YXIgZCA9IGRlbHRhIC8gMTAwMDsNCiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2Nyb2xsLnNjcm9sbFRvKCBsZWZ0ICsgZCp0aGlzLnNjcm9sbFNwZWVkWzBdLCB0b3AgKyBkKnRoaXMuc2Nyb2xsU3BlZWRbMV0gKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICB0aGlzLm9wdGlvbnMuc2Nyb2xsLnNjcm9sbExlZnQgKz0gdGhpcy5zY3JvbGxTcGVlZFswXSAqIGRlbHRhIC8gMTAwMDsNCiAgICAgIHRoaXMub3B0aW9ucy5zY3JvbGwuc2Nyb2xsVG9wICArPSB0aGlzLnNjcm9sbFNwZWVkWzFdICogZGVsdGEgLyAxMDAwOw0KICAgIH0NCg0KICAgIFBvc2l0aW9uLnByZXBhcmUoKTsNCiAgICBEcm9wcGFibGVzLnNob3coRHJhZ2dhYmxlcy5fbGFzdFBvaW50ZXIsIHRoaXMuZWxlbWVudCk7DQogICAgRHJhZ2dhYmxlcy5ub3RpZnkoJ29uRHJhZycsIHRoaXMpOw0KICAgIGlmICh0aGlzLl9pc1Njcm9sbENoaWxkKSB7DQogICAgICBEcmFnZ2FibGVzLl9sYXN0U2Nyb2xsUG9pbnRlciA9IERyYWdnYWJsZXMuX2xhc3RTY3JvbGxQb2ludGVyIHx8ICRBKERyYWdnYWJsZXMuX2xhc3RQb2ludGVyKTsNCiAgICAgIERyYWdnYWJsZXMuX2xhc3RTY3JvbGxQb2ludGVyWzBdICs9IHRoaXMuc2Nyb2xsU3BlZWRbMF0gKiBkZWx0YSAvIDEwMDA7DQogICAgICBEcmFnZ2FibGVzLl9sYXN0U2Nyb2xsUG9pbnRlclsxXSArPSB0aGlzLnNjcm9sbFNwZWVkWzFdICogZGVsdGEgLyAxMDAwOw0KICAgICAgaWYgKERyYWdnYWJsZXMuX2xhc3RTY3JvbGxQb2ludGVyWzBdIDwgMCkNCiAgICAgICAgRHJhZ2dhYmxlcy5fbGFzdFNjcm9sbFBvaW50ZXJbMF0gPSAwOw0KICAgICAgaWYgKERyYWdnYWJsZXMuX2xhc3RTY3JvbGxQb2ludGVyWzFdIDwgMCkNCiAgICAgICAgRHJhZ2dhYmxlcy5fbGFzdFNjcm9sbFBvaW50ZXJbMV0gPSAwOw0KICAgICAgdGhpcy5kcmF3KERyYWdnYWJsZXMuX2xhc3RTY3JvbGxQb2ludGVyKTsNCiAgICB9DQoNCiAgICBpZih0aGlzLm9wdGlvbnMuY2hhbmdlKSB0aGlzLm9wdGlvbnMuY2hhbmdlKHRoaXMpOw0KICB9LA0KDQogIF9nZXRXaW5kb3dTY3JvbGw6IGZ1bmN0aW9uKHcpIHsNCiAgICB2YXIgVCwgTCwgVywgSDsNCiAgICB3aXRoICh3LmRvY3VtZW50KSB7DQogICAgICBpZiAody5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCkgew0KICAgICAgICBUID0gZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsNCiAgICAgICAgTCA9IGRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0Ow0KICAgICAgfSBlbHNlIGlmICh3LmRvY3VtZW50LmJvZHkpIHsNCiAgICAgICAgVCA9IGJvZHkuc2Nyb2xsVG9wOw0KICAgICAgICBMID0gYm9keS5zY3JvbGxMZWZ0Ow0KICAgICAgfQ0KICAgICAgaWYgKHcuaW5uZXJXaWR0aCkgew0KICAgICAgICBXID0gdy5pbm5lcldpZHRoOw0KICAgICAgICBIID0gdy5pbm5lckhlaWdodDsNCiAgICAgIH0gZWxzZSBpZiAody5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSB7DQogICAgICAgIFcgPSBkb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7DQogICAgICAgIEggPSBkb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0Ow0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgVyA9IGJvZHkub2Zmc2V0V2lkdGg7DQogICAgICAgIEggPSBib2R5Lm9mZnNldEhlaWdodA0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4geyB0b3A6IFQsIGxlZnQ6IEwsIHdpZHRoOiBXLCBoZWlnaHQ6IEggfTsNCiAgfQ0KfSk7DQoNCkRyYWdnYWJsZS5fZHJhZ2dpbmcgPSB7IH07DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQp2YXIgU29ydGFibGVPYnNlcnZlciA9IENsYXNzLmNyZWF0ZSh7DQogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsZW1lbnQsIG9ic2VydmVyKSB7DQogICAgdGhpcy5lbGVtZW50ICAgPSAkKGVsZW1lbnQpOw0KICAgIHRoaXMub2JzZXJ2ZXIgID0gb2JzZXJ2ZXI7DQogICAgdGhpcy5sYXN0VmFsdWUgPSBTb3J0YWJsZS5zZXJpYWxpemUodGhpcy5lbGVtZW50KTsNCiAgfSwNCg0KICBvblN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLmxhc3RWYWx1ZSA9IFNvcnRhYmxlLnNlcmlhbGl6ZSh0aGlzLmVsZW1lbnQpOw0KICB9LA0KDQogIG9uRW5kOiBmdW5jdGlvbigpIHsNCiAgICBTb3J0YWJsZS51bm1hcmsoKTsNCiAgICBpZih0aGlzLmxhc3RWYWx1ZSAhPSBTb3J0YWJsZS5zZXJpYWxpemUodGhpcy5lbGVtZW50KSkNCiAgICAgIHRoaXMub2JzZXJ2ZXIodGhpcy5lbGVtZW50KQ0KICB9DQp9KTsNCg0KdmFyIFNvcnRhYmxlID0gew0KICBTRVJJQUxJWkVfUlVMRTogL15bXl9cLV0oPzpbQS1aYS16MC05XC1cX10qKVtfXSguKikkLywNCg0KICBzb3J0YWJsZXM6IHsgfSwNCg0KICBfZmluZFJvb3RFbGVtZW50OiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgd2hpbGUgKGVsZW1lbnQudGFnTmFtZS50b1VwcGVyQ2FzZSgpICE9ICJCT0RZIikgew0KICAgICAgaWYoZWxlbWVudC5pZCAmJiBTb3J0YWJsZS5zb3J0YWJsZXNbZWxlbWVudC5pZF0pIHJldHVybiBlbGVtZW50Ow0KICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsNCiAgICB9DQogIH0sDQoNCiAgb3B0aW9uczogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSBTb3J0YWJsZS5fZmluZFJvb3RFbGVtZW50KCQoZWxlbWVudCkpOw0KICAgIGlmKCFlbGVtZW50KSByZXR1cm47DQogICAgcmV0dXJuIFNvcnRhYmxlLnNvcnRhYmxlc1tlbGVtZW50LmlkXTsNCiAgfSwNCg0KICBkZXN0cm95OiBmdW5jdGlvbihlbGVtZW50KXsNCiAgICB2YXIgcyA9IFNvcnRhYmxlLm9wdGlvbnMoZWxlbWVudCk7DQoNCiAgICBpZihzKSB7DQogICAgICBEcmFnZ2FibGVzLnJlbW92ZU9ic2VydmVyKHMuZWxlbWVudCk7DQogICAgICBzLmRyb3BwYWJsZXMuZWFjaChmdW5jdGlvbihkKXsgRHJvcHBhYmxlcy5yZW1vdmUoZCkgfSk7DQogICAgICBzLmRyYWdnYWJsZXMuaW52b2tlKCdkZXN0cm95Jyk7DQoNCiAgICAgIGRlbGV0ZSBTb3J0YWJsZS5zb3J0YWJsZXNbcy5lbGVtZW50LmlkXTsNCiAgICB9DQogIH0sDQoNCiAgY3JlYXRlOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsNCiAgICAgIGVsZW1lbnQ6ICAgICBlbGVtZW50LA0KICAgICAgdGFnOiAgICAgICAgICdsaScsICAgICAgIC8vIGFzc3VtZXMgbGkgY2hpbGRyZW4sIG92ZXJyaWRlIHdpdGggdGFnOiAndGFnbmFtZScNCiAgICAgIGRyb3BPbkVtcHR5OiBmYWxzZSwNCiAgICAgIHRyZWU6ICAgICAgICBmYWxzZSwNCiAgICAgIHRyZWVUYWc6ICAgICAndWwnLA0KICAgICAgb3ZlcmxhcDogICAgICd2ZXJ0aWNhbCcsIC8vIG9uZSBvZiAndmVydGljYWwnLCAnaG9yaXpvbnRhbCcNCiAgICAgIGNvbnN0cmFpbnQ6ICAndmVydGljYWwnLCAvLyBvbmUgb2YgJ3ZlcnRpY2FsJywgJ2hvcml6b250YWwnLCBmYWxzZQ0KICAgICAgY29udGFpbm1lbnQ6IGVsZW1lbnQsICAgIC8vIGFsc28gdGFrZXMgYXJyYXkgb2YgZWxlbWVudHMgKG9yIGlkJ3MpOyBvciBmYWxzZQ0KICAgICAgaGFuZGxlOiAgICAgIGZhbHNlLCAgICAgIC8vIG9yIGEgQ1NTIGNsYXNzDQogICAgICBvbmx5OiAgICAgICAgZmFsc2UsDQogICAgICBkZWxheTogICAgICAgMCwNCiAgICAgIGhvdmVyY2xhc3M6ICBudWxsLA0KICAgICAgZ2hvc3Rpbmc6ICAgIGZhbHNlLA0KICAgICAgcXVpZXQ6ICAgICAgIGZhbHNlLA0KICAgICAgc2Nyb2xsOiAgICAgIGZhbHNlLA0KICAgICAgc2Nyb2xsU2Vuc2l0aXZpdHk6IDIwLA0KICAgICAgc2Nyb2xsU3BlZWQ6IDE1LA0KICAgICAgZm9ybWF0OiAgICAgIHRoaXMuU0VSSUFMSVpFX1JVTEUsDQoNCiAgICAgIC8vIHRoZXNlIHRha2UgYXJyYXlzIG9mIGVsZW1lbnRzIG9yIGlkcyBhbmQgY2FuIGJlDQogICAgICAvLyB1c2VkIGZvciBiZXR0ZXIgaW5pdGlhbGl6YXRpb24gcGVyZm9ybWFuY2UNCiAgICAgIGVsZW1lbnRzOiAgICBmYWxzZSwNCiAgICAgIGhhbmRsZXM6ICAgICBmYWxzZSwNCg0KICAgICAgb25DaGFuZ2U6ICAgIFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uLA0KICAgICAgb25VcGRhdGU6ICAgIFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uDQogICAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSk7DQoNCiAgICAvLyBjbGVhciBhbnkgb2xkIHNvcnRhYmxlIHdpdGggc2FtZSBlbGVtZW50DQogICAgdGhpcy5kZXN0cm95KGVsZW1lbnQpOw0KDQogICAgLy8gYnVpbGQgb3B0aW9ucyBmb3IgdGhlIGRyYWdnYWJsZXMNCiAgICB2YXIgb3B0aW9uc19mb3JfZHJhZ2dhYmxlID0gew0KICAgICAgcmV2ZXJ0OiAgICAgIHRydWUsDQogICAgICBxdWlldDogICAgICAgb3B0aW9ucy5xdWlldCwNCiAgICAgIHNjcm9sbDogICAgICBvcHRpb25zLnNjcm9sbCwNCiAgICAgIHNjcm9sbFNwZWVkOiBvcHRpb25zLnNjcm9sbFNwZWVkLA0KICAgICAgc2Nyb2xsU2Vuc2l0aXZpdHk6IG9wdGlvbnMuc2Nyb2xsU2Vuc2l0aXZpdHksDQogICAgICBkZWxheTogICAgICAgb3B0aW9ucy5kZWxheSwNCiAgICAgIGdob3N0aW5nOiAgICBvcHRpb25zLmdob3N0aW5nLA0KICAgICAgY29uc3RyYWludDogIG9wdGlvbnMuY29uc3RyYWludCwNCiAgICAgIGhhbmRsZTogICAgICBvcHRpb25zLmhhbmRsZSB9Ow0KDQogICAgaWYob3B0aW9ucy5zdGFydGVmZmVjdCkNCiAgICAgIG9wdGlvbnNfZm9yX2RyYWdnYWJsZS5zdGFydGVmZmVjdCA9IG9wdGlvbnMuc3RhcnRlZmZlY3Q7DQoNCiAgICBpZihvcHRpb25zLnJldmVydGVmZmVjdCkNCiAgICAgIG9wdGlvbnNfZm9yX2RyYWdnYWJsZS5yZXZlcnRlZmZlY3QgPSBvcHRpb25zLnJldmVydGVmZmVjdDsNCiAgICBlbHNlDQogICAgICBpZihvcHRpb25zLmdob3N0aW5nKSBvcHRpb25zX2Zvcl9kcmFnZ2FibGUucmV2ZXJ0ZWZmZWN0ID0gZnVuY3Rpb24oZWxlbWVudCkgew0KICAgICAgICBlbGVtZW50LnN0eWxlLnRvcCAgPSAwOw0KICAgICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAwOw0KICAgICAgfTsNCg0KICAgIGlmKG9wdGlvbnMuZW5kZWZmZWN0KQ0KICAgICAgb3B0aW9uc19mb3JfZHJhZ2dhYmxlLmVuZGVmZmVjdCA9IG9wdGlvbnMuZW5kZWZmZWN0Ow0KDQogICAgaWYob3B0aW9ucy56aW5kZXgpDQogICAgICBvcHRpb25zX2Zvcl9kcmFnZ2FibGUuemluZGV4ID0gb3B0aW9ucy56aW5kZXg7DQoNCiAgICAvLyBidWlsZCBvcHRpb25zIGZvciB0aGUgZHJvcHBhYmxlcw0KICAgIHZhciBvcHRpb25zX2Zvcl9kcm9wcGFibGUgPSB7DQogICAgICBvdmVybGFwOiAgICAgb3B0aW9ucy5vdmVybGFwLA0KICAgICAgY29udGFpbm1lbnQ6IG9wdGlvbnMuY29udGFpbm1lbnQsDQogICAgICB0cmVlOiAgICAgICAgb3B0aW9ucy50cmVlLA0KICAgICAgaG92ZXJjbGFzczogIG9wdGlvbnMuaG92ZXJjbGFzcywNCiAgICAgIG9uSG92ZXI6ICAgICBTb3J0YWJsZS5vbkhvdmVyDQogICAgfQ0KDQogICAgdmFyIG9wdGlvbnNfZm9yX3RyZWUgPSB7DQogICAgICBvbkhvdmVyOiAgICAgIFNvcnRhYmxlLm9uRW1wdHlIb3ZlciwNCiAgICAgIG92ZXJsYXA6ICAgICAgb3B0aW9ucy5vdmVybGFwLA0KICAgICAgY29udGFpbm1lbnQ6ICBvcHRpb25zLmNvbnRhaW5tZW50LA0KICAgICAgaG92ZXJjbGFzczogICBvcHRpb25zLmhvdmVyY2xhc3MNCiAgICB9DQoNCiAgICAvLyBmaXggZm9yIGdlY2tvIGVuZ2luZQ0KICAgIEVsZW1lbnQuY2xlYW5XaGl0ZXNwYWNlKGVsZW1lbnQpOw0KDQogICAgb3B0aW9ucy5kcmFnZ2FibGVzID0gW107DQogICAgb3B0aW9ucy5kcm9wcGFibGVzID0gW107DQoNCiAgICAvLyBkcm9wIG9uIGVtcHR5IGhhbmRsaW5nDQogICAgaWYob3B0aW9ucy5kcm9wT25FbXB0eSB8fCBvcHRpb25zLnRyZWUpIHsNCiAgICAgIERyb3BwYWJsZXMuYWRkKGVsZW1lbnQsIG9wdGlvbnNfZm9yX3RyZWUpOw0KICAgICAgb3B0aW9ucy5kcm9wcGFibGVzLnB1c2goZWxlbWVudCk7DQogICAgfQ0KDQogICAgKG9wdGlvbnMuZWxlbWVudHMgfHwgdGhpcy5maW5kRWxlbWVudHMoZWxlbWVudCwgb3B0aW9ucykgfHwgW10pLmVhY2goIGZ1bmN0aW9uKGUsaSkgew0KICAgICAgdmFyIGhhbmRsZSA9IG9wdGlvbnMuaGFuZGxlcyA/ICQob3B0aW9ucy5oYW5kbGVzW2ldKSA6DQogICAgICAgIChvcHRpb25zLmhhbmRsZSA/ICQoZSkuc2VsZWN0KCcuJyArIG9wdGlvbnMuaGFuZGxlKVswXSA6IGUpOw0KICAgICAgb3B0aW9ucy5kcmFnZ2FibGVzLnB1c2goDQogICAgICAgIG5ldyBEcmFnZ2FibGUoZSwgT2JqZWN0LmV4dGVuZChvcHRpb25zX2Zvcl9kcmFnZ2FibGUsIHsgaGFuZGxlOiBoYW5kbGUgfSkpKTsNCiAgICAgIERyb3BwYWJsZXMuYWRkKGUsIG9wdGlvbnNfZm9yX2Ryb3BwYWJsZSk7DQogICAgICBpZihvcHRpb25zLnRyZWUpIGUudHJlZU5vZGUgPSBlbGVtZW50Ow0KICAgICAgb3B0aW9ucy5kcm9wcGFibGVzLnB1c2goZSk7DQogICAgfSk7DQoNCiAgICBpZihvcHRpb25zLnRyZWUpIHsNCiAgICAgIChTb3J0YWJsZS5maW5kVHJlZUVsZW1lbnRzKGVsZW1lbnQsIG9wdGlvbnMpIHx8IFtdKS5lYWNoKCBmdW5jdGlvbihlKSB7DQogICAgICAgIERyb3BwYWJsZXMuYWRkKGUsIG9wdGlvbnNfZm9yX3RyZWUpOw0KICAgICAgICBlLnRyZWVOb2RlID0gZWxlbWVudDsNCiAgICAgICAgb3B0aW9ucy5kcm9wcGFibGVzLnB1c2goZSk7DQogICAgICB9KTsNCiAgICB9DQoNCiAgICAvLyBrZWVwIHJlZmVyZW5jZQ0KICAgIHRoaXMuc29ydGFibGVzW2VsZW1lbnQuaWRdID0gb3B0aW9uczsNCg0KICAgIC8vIGZvciBvbnVwZGF0ZQ0KICAgIERyYWdnYWJsZXMuYWRkT2JzZXJ2ZXIobmV3IFNvcnRhYmxlT2JzZXJ2ZXIoZWxlbWVudCwgb3B0aW9ucy5vblVwZGF0ZSkpOw0KDQogIH0sDQoNCiAgLy8gcmV0dXJuIGFsbCBzdWl0YWJsZS1mb3Itc29ydGFibGUgZWxlbWVudHMgaW4gYSBndWFyYW50ZWVkIG9yZGVyDQogIGZpbmRFbGVtZW50czogZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucykgew0KICAgIHJldHVybiBFbGVtZW50LmZpbmRDaGlsZHJlbigNCiAgICAgIGVsZW1lbnQsIG9wdGlvbnMub25seSwgb3B0aW9ucy50cmVlID8gdHJ1ZSA6IGZhbHNlLCBvcHRpb25zLnRhZyk7DQogIH0sDQoNCiAgZmluZFRyZWVFbGVtZW50czogZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucykgew0KICAgIHJldHVybiBFbGVtZW50LmZpbmRDaGlsZHJlbigNCiAgICAgIGVsZW1lbnQsIG9wdGlvbnMub25seSwgb3B0aW9ucy50cmVlID8gdHJ1ZSA6IGZhbHNlLCBvcHRpb25zLnRyZWVUYWcpOw0KICB9LA0KDQogIG9uSG92ZXI6IGZ1bmN0aW9uKGVsZW1lbnQsIGRyb3Bvbiwgb3ZlcmxhcCkgew0KICAgIGlmKEVsZW1lbnQuaXNQYXJlbnQoZHJvcG9uLCBlbGVtZW50KSkgcmV0dXJuOw0KDQogICAgaWYob3ZlcmxhcCA+IC4zMyAmJiBvdmVybGFwIDwgLjY2ICYmIFNvcnRhYmxlLm9wdGlvbnMoZHJvcG9uKS50cmVlKSB7DQogICAgICByZXR1cm47DQogICAgfSBlbHNlIGlmKG92ZXJsYXA+MC41KSB7DQogICAgICBTb3J0YWJsZS5tYXJrKGRyb3BvbiwgJ2JlZm9yZScpOw0KICAgICAgaWYoZHJvcG9uLnByZXZpb3VzU2libGluZyAhPSBlbGVtZW50KSB7DQogICAgICAgIHZhciBvbGRQYXJlbnROb2RlID0gZWxlbWVudC5wYXJlbnROb2RlOw0KICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsgLy8gZml4IGdlY2tvIHJlbmRlcmluZw0KICAgICAgICBkcm9wb24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudCwgZHJvcG9uKTsNCiAgICAgICAgaWYoZHJvcG9uLnBhcmVudE5vZGUhPW9sZFBhcmVudE5vZGUpDQogICAgICAgICAgU29ydGFibGUub3B0aW9ucyhvbGRQYXJlbnROb2RlKS5vbkNoYW5nZShlbGVtZW50KTsNCiAgICAgICAgU29ydGFibGUub3B0aW9ucyhkcm9wb24ucGFyZW50Tm9kZSkub25DaGFuZ2UoZWxlbWVudCk7DQogICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgIFNvcnRhYmxlLm1hcmsoZHJvcG9uLCAnYWZ0ZXInKTsNCiAgICAgIHZhciBuZXh0RWxlbWVudCA9IGRyb3Bvbi5uZXh0U2libGluZyB8fCBudWxsOw0KICAgICAgaWYobmV4dEVsZW1lbnQgIT0gZWxlbWVudCkgew0KICAgICAgICB2YXIgb2xkUGFyZW50Tm9kZSA9IGVsZW1lbnQucGFyZW50Tm9kZTsNCiAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7IC8vIGZpeCBnZWNrbyByZW5kZXJpbmcNCiAgICAgICAgZHJvcG9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG5leHRFbGVtZW50KTsNCiAgICAgICAgaWYoZHJvcG9uLnBhcmVudE5vZGUhPW9sZFBhcmVudE5vZGUpDQogICAgICAgICAgU29ydGFibGUub3B0aW9ucyhvbGRQYXJlbnROb2RlKS5vbkNoYW5nZShlbGVtZW50KTsNCiAgICAgICAgU29ydGFibGUub3B0aW9ucyhkcm9wb24ucGFyZW50Tm9kZSkub25DaGFuZ2UoZWxlbWVudCk7DQogICAgICB9DQogICAgfQ0KICB9LA0KDQogIG9uRW1wdHlIb3ZlcjogZnVuY3Rpb24oZWxlbWVudCwgZHJvcG9uLCBvdmVybGFwKSB7DQogICAgdmFyIG9sZFBhcmVudE5vZGUgPSBlbGVtZW50LnBhcmVudE5vZGU7DQogICAgdmFyIGRyb3Bvbk9wdGlvbnMgPSBTb3J0YWJsZS5vcHRpb25zKGRyb3Bvbik7DQoNCiAgICBpZighRWxlbWVudC5pc1BhcmVudChkcm9wb24sIGVsZW1lbnQpKSB7DQogICAgICB2YXIgaW5kZXg7DQoNCiAgICAgIHZhciBjaGlsZHJlbiA9IFNvcnRhYmxlLmZpbmRFbGVtZW50cyhkcm9wb24sIHt0YWc6IGRyb3Bvbk9wdGlvbnMudGFnLCBvbmx5OiBkcm9wb25PcHRpb25zLm9ubHl9KTsNCiAgICAgIHZhciBjaGlsZCA9IG51bGw7DQoNCiAgICAgIGlmKGNoaWxkcmVuKSB7DQogICAgICAgIHZhciBvZmZzZXQgPSBFbGVtZW50Lm9mZnNldFNpemUoZHJvcG9uLCBkcm9wb25PcHRpb25zLm92ZXJsYXApICogKDEuMCAtIG92ZXJsYXApOw0KDQogICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXggKz0gMSkgew0KICAgICAgICAgIGlmIChvZmZzZXQgLSBFbGVtZW50Lm9mZnNldFNpemUgKGNoaWxkcmVuW2luZGV4XSwgZHJvcG9uT3B0aW9ucy5vdmVybGFwKSA+PSAwKSB7DQogICAgICAgICAgICBvZmZzZXQgLT0gRWxlbWVudC5vZmZzZXRTaXplIChjaGlsZHJlbltpbmRleF0sIGRyb3Bvbk9wdGlvbnMub3ZlcmxhcCk7DQogICAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgLSAoRWxlbWVudC5vZmZzZXRTaXplIChjaGlsZHJlbltpbmRleF0sIGRyb3Bvbk9wdGlvbnMub3ZlcmxhcCkgLyAyKSA+PSAwKSB7DQogICAgICAgICAgICBjaGlsZCA9IGluZGV4ICsgMSA8IGNoaWxkcmVuLmxlbmd0aCA/IGNoaWxkcmVuW2luZGV4ICsgMV0gOiBudWxsOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGNoaWxkID0gY2hpbGRyZW5baW5kZXhdOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIGRyb3Bvbi5pbnNlcnRCZWZvcmUoZWxlbWVudCwgY2hpbGQpOw0KDQogICAgICBTb3J0YWJsZS5vcHRpb25zKG9sZFBhcmVudE5vZGUpLm9uQ2hhbmdlKGVsZW1lbnQpOw0KICAgICAgZHJvcG9uT3B0aW9ucy5vbkNoYW5nZShlbGVtZW50KTsNCiAgICB9DQogIH0sDQoNCiAgdW5tYXJrOiBmdW5jdGlvbigpIHsNCiAgICBpZihTb3J0YWJsZS5fbWFya2VyKSBTb3J0YWJsZS5fbWFya2VyLmhpZGUoKTsNCiAgfSwNCg0KICBtYXJrOiBmdW5jdGlvbihkcm9wb24sIHBvc2l0aW9uKSB7DQogICAgLy8gbWFyayBvbiBnaG9zdGluZyBvbmx5DQogICAgdmFyIHNvcnRhYmxlID0gU29ydGFibGUub3B0aW9ucyhkcm9wb24ucGFyZW50Tm9kZSk7DQogICAgaWYoc29ydGFibGUgJiYgIXNvcnRhYmxlLmdob3N0aW5nKSByZXR1cm47DQoNCiAgICBpZighU29ydGFibGUuX21hcmtlcikgew0KICAgICAgU29ydGFibGUuX21hcmtlciA9DQogICAgICAgICgkKCdkcm9wbWFya2VyJykgfHwgRWxlbWVudC5leHRlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJykpKS4NCiAgICAgICAgICBoaWRlKCkuYWRkQ2xhc3NOYW1lKCdkcm9wbWFya2VyJykuc2V0U3R5bGUoe3Bvc2l0aW9uOidhYnNvbHV0ZSd9KTsNCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IikuaXRlbSgwKS5hcHBlbmRDaGlsZChTb3J0YWJsZS5fbWFya2VyKTsNCiAgICB9DQogICAgdmFyIG9mZnNldHMgPSBQb3NpdGlvbi5jdW11bGF0aXZlT2Zmc2V0KGRyb3Bvbik7DQogICAgU29ydGFibGUuX21hcmtlci5zZXRTdHlsZSh7bGVmdDogb2Zmc2V0c1swXSsncHgnLCB0b3A6IG9mZnNldHNbMV0gKyAncHgnfSk7DQoNCiAgICBpZihwb3NpdGlvbj09J2FmdGVyJykNCiAgICAgIGlmKHNvcnRhYmxlLm92ZXJsYXAgPT0gJ2hvcml6b250YWwnKQ0KICAgICAgICBTb3J0YWJsZS5fbWFya2VyLnNldFN0eWxlKHtsZWZ0OiAob2Zmc2V0c1swXStkcm9wb24uY2xpZW50V2lkdGgpICsgJ3B4J30pOw0KICAgICAgZWxzZQ0KICAgICAgICBTb3J0YWJsZS5fbWFya2VyLnNldFN0eWxlKHt0b3A6IChvZmZzZXRzWzFdK2Ryb3Bvbi5jbGllbnRIZWlnaHQpICsgJ3B4J30pOw0KDQogICAgU29ydGFibGUuX21hcmtlci5zaG93KCk7DQogIH0sDQoNCiAgX3RyZWU6IGZ1bmN0aW9uKGVsZW1lbnQsIG9wdGlvbnMsIHBhcmVudCkgew0KICAgIHZhciBjaGlsZHJlbiA9IFNvcnRhYmxlLmZpbmRFbGVtZW50cyhlbGVtZW50LCBvcHRpb25zKSB8fCBbXTsNCg0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsNCiAgICAgIHZhciBtYXRjaCA9IGNoaWxkcmVuW2ldLmlkLm1hdGNoKG9wdGlvbnMuZm9ybWF0KTsNCg0KICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7DQoNCiAgICAgIHZhciBjaGlsZCA9IHsNCiAgICAgICAgaWQ6IGVuY29kZVVSSUNvbXBvbmVudChtYXRjaCA/IG1hdGNoWzFdIDogbnVsbCksDQogICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsDQogICAgICAgIHBhcmVudDogcGFyZW50LA0KICAgICAgICBjaGlsZHJlbjogW10sDQogICAgICAgIHBvc2l0aW9uOiBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoLA0KICAgICAgICBjb250YWluZXI6ICQoY2hpbGRyZW5baV0pLmRvd24ob3B0aW9ucy50cmVlVGFnKQ0KICAgICAgfQ0KDQogICAgICAvKiBHZXQgdGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgY2hpbGRyZW4gYW5kIHJlY3Vyc2Ugb3ZlciBpdCAqLw0KICAgICAgaWYgKGNoaWxkLmNvbnRhaW5lcikNCiAgICAgICAgdGhpcy5fdHJlZShjaGlsZC5jb250YWluZXIsIG9wdGlvbnMsIGNoaWxkKQ0KDQogICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCAoY2hpbGQpOw0KICAgIH0NCg0KICAgIHJldHVybiBwYXJlbnQ7DQogIH0sDQoNCiAgdHJlZTogZnVuY3Rpb24oZWxlbWVudCkgew0KICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpOw0KICAgIHZhciBzb3J0YWJsZU9wdGlvbnMgPSB0aGlzLm9wdGlvbnMoZWxlbWVudCk7DQogICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHsNCiAgICAgIHRhZzogc29ydGFibGVPcHRpb25zLnRhZywNCiAgICAgIHRyZWVUYWc6IHNvcnRhYmxlT3B0aW9ucy50cmVlVGFnLA0KICAgICAgb25seTogc29ydGFibGVPcHRpb25zLm9ubHksDQogICAgICBuYW1lOiBlbGVtZW50LmlkLA0KICAgICAgZm9ybWF0OiBzb3J0YWJsZU9wdGlvbnMuZm9ybWF0DQogICAgfSwgYXJndW1lbnRzWzFdIHx8IHsgfSk7DQoNCiAgICB2YXIgcm9vdCA9IHsNCiAgICAgIGlkOiBudWxsLA0KICAgICAgcGFyZW50OiBudWxsLA0KICAgICAgY2hpbGRyZW46IFtdLA0KICAgICAgY29udGFpbmVyOiBlbGVtZW50LA0KICAgICAgcG9zaXRpb246IDANCiAgICB9DQoNCiAgICByZXR1cm4gU29ydGFibGUuX3RyZWUoZWxlbWVudCwgb3B0aW9ucywgcm9vdCk7DQogIH0sDQoNCiAgLyogQ29uc3RydWN0IGEgW2ldIGluZGV4IGZvciBhIHBhcnRpY3VsYXIgbm9kZSAqLw0KICBfY29uc3RydWN0SW5kZXg6IGZ1bmN0aW9uKG5vZGUpIHsNCiAgICB2YXIgaW5kZXggPSAnJzsNCiAgICBkbyB7DQogICAgICBpZiAobm9kZS5pZCkgaW5kZXggPSAnWycgKyBub2RlLnBvc2l0aW9uICsgJ10nICsgaW5kZXg7DQogICAgfSB3aGlsZSAoKG5vZGUgPSBub2RlLnBhcmVudCkgIT0gbnVsbCk7DQogICAgcmV0dXJuIGluZGV4Ow0KICB9LA0KDQogIHNlcXVlbmNlOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKHRoaXMub3B0aW9ucyhlbGVtZW50KSwgYXJndW1lbnRzWzFdIHx8IHsgfSk7DQoNCiAgICByZXR1cm4gJCh0aGlzLmZpbmRFbGVtZW50cyhlbGVtZW50LCBvcHRpb25zKSB8fCBbXSkubWFwKCBmdW5jdGlvbihpdGVtKSB7DQogICAgICByZXR1cm4gaXRlbS5pZC5tYXRjaChvcHRpb25zLmZvcm1hdCkgPyBpdGVtLmlkLm1hdGNoKG9wdGlvbnMuZm9ybWF0KVsxXSA6ICcnOw0KICAgIH0pOw0KICB9LA0KDQogIHNldFNlcXVlbmNlOiBmdW5jdGlvbihlbGVtZW50LCBuZXdfc2VxdWVuY2UpIHsNCiAgICBlbGVtZW50ID0gJChlbGVtZW50KTsNCiAgICB2YXIgb3B0aW9ucyA9IE9iamVjdC5leHRlbmQodGhpcy5vcHRpb25zKGVsZW1lbnQpLCBhcmd1bWVudHNbMl0gfHwgeyB9KTsNCg0KICAgIHZhciBub2RlTWFwID0geyB9Ow0KICAgIHRoaXMuZmluZEVsZW1lbnRzKGVsZW1lbnQsIG9wdGlvbnMpLmVhY2goIGZ1bmN0aW9uKG4pIHsNCiAgICAgICAgaWYgKG4uaWQubWF0Y2gob3B0aW9ucy5mb3JtYXQpKQ0KICAgICAgICAgICAgbm9kZU1hcFtuLmlkLm1hdGNoKG9wdGlvbnMuZm9ybWF0KVsxXV0gPSBbbiwgbi5wYXJlbnROb2RlXTsNCiAgICAgICAgbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pOw0KICAgIH0pOw0KDQogICAgbmV3X3NlcXVlbmNlLmVhY2goZnVuY3Rpb24oaWRlbnQpIHsNCiAgICAgIHZhciBuID0gbm9kZU1hcFtpZGVudF07DQogICAgICBpZiAobikgew0KICAgICAgICBuWzFdLmFwcGVuZENoaWxkKG5bMF0pOw0KICAgICAgICBkZWxldGUgbm9kZU1hcFtpZGVudF07DQogICAgICB9DQogICAgfSk7DQogIH0sDQoNCiAgc2VyaWFsaXplOiBmdW5jdGlvbihlbGVtZW50KSB7DQogICAgZWxlbWVudCA9ICQoZWxlbWVudCk7DQogICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZXh0ZW5kKFNvcnRhYmxlLm9wdGlvbnMoZWxlbWVudCksIGFyZ3VtZW50c1sxXSB8fCB7IH0pOw0KICAgIHZhciBuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KA0KICAgICAgKGFyZ3VtZW50c1sxXSAmJiBhcmd1bWVudHNbMV0ubmFtZSkgPyBhcmd1bWVudHNbMV0ubmFtZSA6IGVsZW1lbnQuaWQpOw0KDQogICAgaWYgKG9wdGlvbnMudHJlZSkgew0KICAgICAgcmV0dXJuIFNvcnRhYmxlLnRyZWUoZWxlbWVudCwgYXJndW1lbnRzWzFdKS5jaGlsZHJlbi5tYXAoIGZ1bmN0aW9uIChpdGVtKSB7DQogICAgICAgIHJldHVybiBbbmFtZSArIFNvcnRhYmxlLl9jb25zdHJ1Y3RJbmRleChpdGVtKSArICJbaWRdPSIgKw0KICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChpdGVtLmlkKV0uY29uY2F0KGl0ZW0uY2hpbGRyZW4ubWFwKGFyZ3VtZW50cy5jYWxsZWUpKTsNCiAgICAgIH0pLmZsYXR0ZW4oKS5qb2luKCcmJyk7DQogICAgfSBlbHNlIHsNCiAgICAgIHJldHVybiBTb3J0YWJsZS5zZXF1ZW5jZShlbGVtZW50LCBhcmd1bWVudHNbMV0pLm1hcCggZnVuY3Rpb24oaXRlbSkgew0KICAgICAgICByZXR1cm4gbmFtZSArICJbXT0iICsgZW5jb2RlVVJJQ29tcG9uZW50KGl0ZW0pOw0KICAgICAgfSkuam9pbignJicpOw0KICAgIH0NCiAgfQ0KfQ0KDQovLyBSZXR1cm5zIHRydWUgaWYgY2hpbGQgaXMgY29udGFpbmVkIHdpdGhpbiBlbGVtZW50DQpFbGVtZW50LmlzUGFyZW50ID0gZnVuY3Rpb24oY2hpbGQsIGVsZW1lbnQpIHsNCiAgaWYgKCFjaGlsZC5wYXJlbnROb2RlIHx8IGNoaWxkID09IGVsZW1lbnQpIHJldHVybiBmYWxzZTsNCiAgaWYgKGNoaWxkLnBhcmVudE5vZGUgPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7DQogIHJldHVybiBFbGVtZW50LmlzUGFyZW50KGNoaWxkLnBhcmVudE5vZGUsIGVsZW1lbnQpOw0KfQ0KDQpFbGVtZW50LmZpbmRDaGlsZHJlbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIG9ubHksIHJlY3Vyc2l2ZSwgdGFnTmFtZSkgew0KICBpZighZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHJldHVybiBudWxsOw0KICB0YWdOYW1lID0gdGFnTmFtZS50b1VwcGVyQ2FzZSgpOw0KICBpZihvbmx5KSBvbmx5ID0gW29ubHldLmZsYXR0ZW4oKTsNCiAgdmFyIGVsZW1lbnRzID0gW107DQogICRBKGVsZW1lbnQuY2hpbGROb2RlcykuZWFjaCggZnVuY3Rpb24oZSkgew0KICAgIGlmKGUudGFnTmFtZSAmJiBlLnRhZ05hbWUudG9VcHBlckNhc2UoKT09dGFnTmFtZSAmJg0KICAgICAgKCFvbmx5IHx8IChFbGVtZW50LmNsYXNzTmFtZXMoZSkuZGV0ZWN0KGZ1bmN0aW9uKHYpIHsgcmV0dXJuIG9ubHkuaW5jbHVkZSh2KSB9KSkpKQ0KICAgICAgICBlbGVtZW50cy5wdXNoKGUpOw0KICAgIGlmKHJlY3Vyc2l2ZSkgew0KICAgICAgdmFyIGdyYW5kY2hpbGRyZW4gPSBFbGVtZW50LmZpbmRDaGlsZHJlbihlLCBvbmx5LCByZWN1cnNpdmUsIHRhZ05hbWUpOw0KICAgICAgaWYoZ3JhbmRjaGlsZHJlbikgZWxlbWVudHMucHVzaChncmFuZGNoaWxkcmVuKTsNCiAgICB9DQogIH0pOw0KDQogIHJldHVybiAoZWxlbWVudHMubGVuZ3RoPjAgPyBlbGVtZW50cy5mbGF0dGVuKCkgOiBbXSk7DQp9DQoNCkVsZW1lbnQub2Zmc2V0U2l6ZSA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlKSB7DQogIHJldHVybiBlbGVtZW50WydvZmZzZXQnICsgKCh0eXBlPT0ndmVydGljYWwnIHx8IHR5cGU9PSdoZWlnaHQnKSA/ICdIZWlnaHQnIDogJ1dpZHRoJyldOw0KfQ0KPC9zY3JpcHQ+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQogICAgICAgIEFycmF5LmZyb20gPSBfX1NjcmlwdGFjdWxvdXNQcmVzZXJ2ZVswXSB8fCBBcnJheS5mcm9tOw0KICAgICAgICBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCA9IF9fU2NyaXB0YWN1bG91c1ByZXNlcnZlWzFdIHx8IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kOw0KICAgICAgICBIVE1MRWxlbWVudC5wcm90b3R5cGUuc2Nyb2xsVG8gPSBfX1NjcmlwdGFjdWxvdXNQcmVzZXJ2ZVsyXSB8fCBIVE1MRWxlbWVudC5wcm90b3R5cGUuc2Nyb2xsVG87DQogICAgICAgIGRlbGV0ZSBTdHJpbmdbJ19fcGFyc2VTdHlsZUVsZW1lbnQnXTsgUHJvdG90eXBlLkJyb3dzZXIuV2ViS2l0ID0gdHJ1ZTs8L3NjcmlwdD4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5WQUxWRV9QVUJMSUNfUEFUSCA9ICJodHRwczpcL1wvY29tbXVuaXR5LmFrYW1haS5zdGVhbXN0YXRpYy5jb21cL3B1YmxpY1wvIjs8L3NjcmlwdD4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCg0KDQpmdW5jdGlvbiBSZWdpc3RlclN0ZWFtT25XZWJQYW5lbFNob3duSGFuZGxlciggZiApDQp7DQoJJEooZG9jdW1lbnQpLm9uKCAndmlzaWJpbGl0eWNoYW5nZScsIGZ1bmN0aW9uKCkgew0KCQlpZiAoIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gInZpc2libGUiICkNCgkJCWYoKTsNCgl9KTsNCn0NCg0KZnVuY3Rpb24gUmVnaXN0ZXJTdGVhbU9uV2ViUGFuZWxIaWRkZW5IYW5kbGVyKCBmICkNCnsNCgkkSihkb2N1bWVudCkub24oICd2aXNpYmlsaXR5Y2hhbmdlJywgZnVuY3Rpb24oKSB7DQoJCWlmICggZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAiaGlkZGVuIiApDQoJCQlmKCk7DQoJfSk7DQp9DQoNCg0KDQoNCg0KZnVuY3Rpb24gUmVmcmVzaE5vdGlmaWNhdGlvbkFyZWEoKQ0Kew0KCS8vIHRoZSBuZXcgd2F5IC0gdXBkYXRlcyBib3RoIHRoZSBvbGQgZW52ZWxvcGUgYW5kIHJlc3BvbnNpdmUgbWVudQ0KCVVwZGF0ZU5vdGlmaWNhdGlvbkNvdW50cygpOw0KfQ0KDQpmdW5jdGlvbiB2SUUoKQ0Kew0KCXJldHVybiAobmF2aWdhdG9yLmFwcE5hbWU9PSdNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXInKSA/IHBhcnNlRmxvYXQoICggbmV3IFJlZ0V4cCggIk1TSUUgKFswLTldezEsfVsuMC05XXswLH0pIiApICkuZXhlYyggbmF2aWdhdG9yLnVzZXJBZ2VudCApWzFdICkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gY2hlY2tBYnVzZVN1YiggZWxGb3JtICkNCnsNCglpZiAoICEkSihlbEZvcm0pLmZpbmQoJ2lucHV0W25hbWU9YWJ1c2VUeXBlXTpjaGVja2VkJykubGVuZ3RoICkNCgl7DQoJCWFsZXJ0KCAnUGxlYXNlIHNlbGVjdCBhIHJlYXNvbiBmb3IgcmVwb3J0aW5nIGFidXNlJyApOw0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KDQoJQ01vZGFsLkRpc21pc3NBY3RpdmVNb2RhbCgpOw0KDQoJdmFyIHBhcmFtcyA9ICRKKGVsRm9ybSkuc2VyaWFsaXplQXJyYXkoKTsNCglwYXJhbXMucHVzaCgge25hbWU6ICdqc29uJywgdmFsdWU6IDF9ICk7DQoNCgkkSi5wb3N0KCAnaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vYWN0aW9ucy9SZXBvcnRBYnVzZS8nLCBwYXJhbXMpLmRvbmUoIGZ1bmN0aW9uKCkgew0KCQlTaG93QWxlcnREaWFsb2coICdUaGFuayBZb3UhJywgJ1RoYW5rIHlvdSBmb3IgcmVwb3J0aW5nIG9mZmVuc2l2ZSBjb250ZW50IGFuZCBoZWxwaW5nIHRvIGtlZXAgU3RlYW0gY2xlYW4gYW5kIGZyaWVuZGx5LicgKTsNCgl9KS5mYWlsKCBmdW5jdGlvbigpIHsNCgkJU2hvd0FsZXJ0RGlhbG9nKCAnUmVwb3J0IFZpb2xhdGlvbicsICdUaGVyZSB3YXMgYSBwcm9ibGVtIHNhdmluZyB5b3VyIHJlcG9ydC4gIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJyApOw0KCX0pOw0KCXJldHVybiBmYWxzZTsNCn0NCg0KDQoNCnZhciBnX3doaXRlTGlzdGVkRG9tYWlucyA9IFsNCgkic3RlYW1wb3dlcmVkLmNvbSIsDQoJInN0ZWFtZ2FtZXMuY29tIiwNCgkic3RlYW1jb21tdW5pdHkuY29tIiwNCgkidmFsdmVzb2Z0d2FyZS5jb20iLA0KCSJ5b3V0dWJlLmNvbSIsDQoJInlvdXR1LmJlIiwNCgkibGl2ZS5jb20iLA0KCSJtc24uY29tIiwNCgkibXlzcGFjZS5jb20iLA0KCSJmYWNlYm9vay5jb20iLA0KCSJoaTUuY29tIiwNCgkid2lraXBlZGlhLm9yZyIsDQoJIm9ya3V0LmNvbSIsDQoJImJsb2dnZXIuY29tIiwNCgkiZnJpZW5kc3Rlci5jb20iLA0KCSJmb3RvbG9nLm5ldCIsDQoJImdvb2dsZS5mciIsDQoJImJhaWR1LmNvbSIsDQoJIm1pY3Jvc29mdC5jb20iLA0KCSJzaGFja25ld3MuY29tIiwNCgkiYmJjLmNvLnVrIiwNCgkiY25uLmNvbSIsDQoJImZveHNwb3J0cy5jb20iLA0KCSJwY21hZy5jb20iLA0KCSJueXRpbWVzLmNvbSIsDQoJImZsaWNrci5jb20iLA0KCSJhbWF6b24uY29tIiwNCgkidmVvaC5jb20iLA0KCSJwY2dhbWVyLmNvbSIsDQoJIm1ldGFjcml0aWMuY29tIiwNCgkiZmlsZXBsYW5ldC5jb20iLA0KCSJnYW1lc3BvdC5jb20iLA0KCSJnYW1ldGFwLmNvbSIsDQoJImlnbi5jb20iLA0KCSJrb3Rha3UuY29tIiwNCgkieGZpcmUuY29tIiwNCgkicGNnYW1lcy5nd24uY29tIiwNCgkiZ2FtZXpvbmUuY29tIiwNCgkiZ2FtZXNyYWRhci5jb20iLA0KCSJkaWdnLmNvbSIsDQoJImVuZ2FkZ2V0LmNvbSIsDQoJImdpem1vZG8uY29tIiwNCgkiZ2FtZXNmb3J3aW5kb3dzLmNvbSIsDQoJInhib3guY29tIiwNCgkiY25ldC5jb20iLA0KCSJsNGQuY29tIiwNCgkidGVhbWZvcnRyZXNzLmNvbSIsDQoJInRmMi5jb20iLA0KCSJoYWxmLWxpZmUyLmNvbSIsDQoJImFwZXJ0dXJlc2NpZW5jZS5jb20iLA0KCSJkYXlvZmRlZmVhdC5jb20iLA0KCSJkb3RhMi5jb20iLA0KCSJwbGF5ZG90YS5jb20iLA0KCSJraWNrc3RhcnRlci5jb20iLA0KCSJnYW1pbmdoZWFkcy5jb20iLA0KCSJyZWRkaXQuY29tIiwNCgkiY291bnRlci1zdHJpa2UubmV0IiwNCgkiaW1ndXIuY29tIg0KXTsNCg0KZnVuY3Rpb24gZ2V0SG9zdG5hbWUoIHN0ciApDQp7DQoJdmFyIHJlID0gbmV3IFJlZ0V4cCggJ14oc3RlYW06Ly9vcGVudXJsKF9leHRlcm5hbCk/Lyk/KGZ8aHQpdHBzPzovLyhbXkAvPyNdKkApPyhbXi8jP10rKScsICdpbScgKTsNCglyZXR1cm4gc3RyLnRyaW0oKS5tYXRjaChyZSlbNV0udG9TdHJpbmcoKTsNCn0NCg0KZnVuY3Rpb24gQWxlcnROb25TdGVhbVNpdGUoIGVsZW0gKQ0Kew0KCXZhciB1cmwgPSBlbGVtLmhyZWY7DQoJdmFyIGhvc3RuYW1lID0gZ2V0SG9zdG5hbWUoIHVybCApOw0KCWlmICggaG9zdG5hbWUgKQ0KCXsNCgkJaG9zdG5hbWUgPSBob3N0bmFtZS50b0xvd2VyQ2FzZSgpOw0KCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBnX3doaXRlTGlzdGVkRG9tYWlucy5sZW5ndGg7ICsraSApDQoJCXsNCgkJCXZhciBpbmRleCA9IGhvc3RuYW1lLmxhc3RJbmRleE9mKCBnX3doaXRlTGlzdGVkRG9tYWluc1tpXSApOw0KCQkJaWYgKCBpbmRleCAhPSAtMSAmJiBpbmRleCA9PSAoIGhvc3RuYW1lLmxlbmd0aCAtIGdfd2hpdGVMaXN0ZWREb21haW5zW2ldLmxlbmd0aCApDQoJCQkJICYmICggaW5kZXggPT0gMCB8fCBob3N0bmFtZS5jaGFyQXQoIGluZGV4IC0gMSApID09ICcuJyApICkNCgkJCXsNCgkJCQlyZXR1cm4gdHJ1ZTsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gY29uZmlybSggJ05vdGU6IHRoZSBVUkwgeW91IGhhdmUgY2xpY2tlZCBvbiBpcyBub3QgYW4gb2ZmaWNpYWwgU3RlYW0gd2ViIHNpdGUuXG5cbicNCgkJCQkJCSsgdXJsLnJlcGxhY2UoIG5ldyBSZWdFeHAoICdec3RlYW06Ly9vcGVudXJsKF9leHRlcm5hbCk/LycgKSwgJycgKSArICdcblxuJw0KCQkJCQkJKyAnSWYgdGhpcyB3ZWIgc2l0ZSBhc2tzIGZvciB5b3VyIHVzZXIgbmFtZSBvciBwYXNzd29yZCwgZG8gbm90IGVudGVyIHRoYXQgaW5mb3JtYXRpb24uIFlvdSBjb3VsZCBsb3NlIHlvdXIgU3RlYW0gYWNjb3VudCBhbmQgYWxsIHlvdXIgZ2FtZXMhXG4nDQoJCQkJCQkrICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gdmlzaXQgdGhpcyBwYWdlPyBDbGljayBPSyB0byBjb250aW51ZSBhdCB5b3VyIG93biByaXNrLlxuJyApOw0KCX0NCg0KCVNob3dBbGVydERpYWxvZyggJycsICdUaGUgVVJMIGlzIGJhZGx5IGZvcm1lZC4nKTsNCglyZXR1cm4gZmFsc2U7DQp9DQoNCnZhciBsYXN0RmlsdGVycyA9IG5ldyBPYmplY3QoKTsNCmZ1bmN0aW9uIEZpbHRlckxpc3RGYXN0KCB0YXJnZXQsIHN0ciApDQp7DQoJdmFyIGxhc3RGaWx0ZXIgPSBsYXN0RmlsdGVyc1t0YXJnZXRdOw0KCWlmICggIWxhc3RGaWx0ZXIgKQ0KCQlsYXN0RmlsdGVyID0gJyc7DQoNCglzdHIgPSBzdHIudG9Mb3dlckNhc2UoKTsNCglpZiAoIHN0ciA9PSBsYXN0RmlsdGVyICkNCgkJcmV0dXJuIGZhbHNlOw0KDQoJdmFyIGV4cGFuZGluZyA9IGZhbHNlOw0KCXZhciBjb250cmFjdGluZyA9IGZhbHNlOw0KCWlmICggc3RyLmxlbmd0aCA+IGxhc3RGaWx0ZXIubGVuZ3RoICYmIHN0ci5zdGFydHNXaXRoKCBsYXN0RmlsdGVyICkgKQ0KCQlleHBhbmRpbmcgPSB0cnVlOw0KCWlmICggIXN0ciB8fCBzdHIubGVuZ3RoIDwgbGFzdEZpbHRlci5sZW5ndGggJiYgbGFzdEZpbHRlci5zdGFydHNXaXRoKCBzdHIgKSApDQoJCWNvbnRyYWN0aW5nID0gdHJ1ZTsNCg0KCXZhciBzdHJQYXJ0cyA9IHN0ci5zcGxpdCgvXFcvKTsNCg0KCXZhciBlbGVtVGFyZ2V0ID0gJCh0YXJnZXQpOw0KCXZhciBlbGVtUGFyZW50ID0gZWxlbVRhcmdldC5wYXJlbnROb2RlOw0KCWVsZW1QYXJlbnQucmVtb3ZlQ2hpbGQoIGVsZW1UYXJnZXQgKTsNCg0KCXZhciByZ0NoaWxkcmVuID0gZWxlbVRhcmdldC5jaGlsZE5vZGVzOw0KCWZvciAoIHZhciBpID0gMDsgaSA8IHJnQ2hpbGRyZW4ubGVuZ3RoOyBpKysgKQ0KCXsNCgkJdmFyIGNoaWxkID0gcmdDaGlsZHJlbltpXTsNCgkJaWYgKCBjaGlsZC5ub2RlVHlwZSAhPSBjaGlsZC5FTEVNRU5UX05PREUgKQ0KCQkJY29udGludWU7DQoJCWlmICggZXhwYW5kaW5nICYmIGNoaWxkLnN0eWxlLmRpc3BsYXk9PSdub25lJyB8fCBjb250cmFjdGluZyAmJiBjaGlsZC5zdHlsZS5kaXNwbGF5ICE9ICdub25lJyApDQoJCQljb250aW51ZTsNCgkJaWYgKCAhY2hpbGQubGNUZXh0ICkNCgkJCWNoaWxkLmxjVGV4dCA9IChjaGlsZC5pbm5lclRleHQgfHwgY2hpbGQudGV4dENvbnRlbnQpLnRvTG93ZXJDYXNlKCk7DQoNCgkJdmFyIHRleHQgPSBjaGlsZC5sY1RleHQ7DQoJCXZhciBzaG93ID0gdHJ1ZTsNCgkJZm9yICggdmFyIGlQYXJ0ID0gMDsgc2hvdyAmJiBpUGFydCA8IHN0clBhcnRzLmxlbmd0aDsgaVBhcnQrKyApDQoJCQlpZiAoICF0ZXh0LmluY2x1ZGUoIHN0clBhcnRzW2lQYXJ0XSApICkNCgkJCQlzaG93PWZhbHNlOw0KDQoJCWlmICggc2hvdyApDQoJCQljaGlsZC5zdHlsZS5kaXNwbGF5ID0gJyc7DQoJCWVsc2UNCgkJCWNoaWxkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQoJfQ0KCWxhc3RGaWx0ZXJzW3RhcmdldF0gPSBzdHI7DQoJZWxlbVBhcmVudC5hcHBlbmRDaGlsZCggZWxlbVRhcmdldCApOw0KCXJldHVybiB0cnVlOw0KfQ0KDQoNCi8vIGdvZXMgaW50byBmdWxsc2NyZWVuLCByZXR1cm5pbmcgZmFsc2UgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGl0DQpmdW5jdGlvbiByZXF1ZXN0RnVsbFNjcmVlbiggZWxlbWVudCApDQp7DQoJLy8gU3VwcG9ydHMgbW9zdCBicm93c2VycyBhbmQgdGhlaXIgdmVyc2lvbnMuDQoJdmFyIHJlcXVlc3RNZXRob2QgPSBlbGVtZW50LnJlcXVlc3RGdWxsU2NyZWVuIHx8IGVsZW1lbnQud2Via2l0UmVxdWVzdEZ1bGxTY3JlZW4gfHwgZWxlbWVudC5tb3pSZXF1ZXN0RnVsbFNjcmVlbiB8fCBlbGVtZW50Lm1zUmVxdWVzdEZ1bGxTY3JlZW47DQoNCglpZiAocmVxdWVzdE1ldGhvZCkNCgl7DQoJCS8vIE5hdGl2ZSBmdWxsIHNjcmVlbi4NCgkJcmVxdWVzdE1ldGhvZC5jYWxsKGVsZW1lbnQpOw0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoNCglyZXR1cm4gZmFsc2U7DQp9DQoNCmZ1bmN0aW9uIGV4aXRGdWxsU2NyZWVuKCkNCnsNCglpZiAoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pIHsNCgkJZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTsNCgl9DQoJZWxzZSBpZiAoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbikgew0KCQlkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7DQoJfQ0KCWVsc2UgaWYgKGRvY3VtZW50LndlYmtpdENhbmNlbEZ1bGxTY3JlZW4pIHsNCgkJZG9jdW1lbnQud2Via2l0Q2FuY2VsRnVsbFNjcmVlbigpOw0KCX0NCn0NCg0KZnVuY3Rpb24gUmVjb3JkQUpBWFBhZ2VWaWV3KCB1cmwgKQ0Kew0KCWlmICggdHlwZW9mIGdhICE9ICJ1bmRlZmluZWQiICYmIGdhICkNCgl7DQoJCXZhciByZ1VSTHMgPSBbICdodHRwczovL3N0ZWFtY29tbXVuaXR5LmNvbScsICdodHRwczovL3N0ZWFtY29tbXVuaXR5LmNvbScgXTsNCgkJZm9yICggdmFyIGkgPSAwOyBpIDwgcmdVUkxzLmxlbmd0aDsgKytpICkNCgkJew0KCQkJdmFyIGJhc2VVUkwgPSByZ1VSTHNbaV07DQoJCQl2YXIgaWR4ID0gdXJsLmluZGV4T2YoYmFzZVVSTCk7DQoJCQlpZiAoIGlkeCAhPSAtMSApDQoJCQl7DQoJCQkJdXJsID0gdXJsLnN1YnN0cmluZyggaWR4ICsgYmFzZVVSTC5sZW5ndGggKTsNCgkJCX0NCgkJCWdhKCAnc2VuZCcsICdwYWdldmlldycsIHVybCApOw0KCQkJcmV0dXJuOw0KCQl9DQoJfQ0KfQ0KDQp2YXIgZ19TTlIgPSBmYWxzZTsNCnZhciBnX3N0ckxhbmd1YWdlID0gJ2VuZ2xpc2gnOw0KDQovLyBnaXZlbiBhbiBhcnJheSBvZiBpbXByZXNzaW9ucyBhcyBzdHJpbmdzLCB0aGlzIHdpbGwgaGFuZGxlIGpvaW5pbmcgdGhlbSBhbGwgdG9nZXRoZXIgaW50byBhIHNpbmd1bGFyIHN0cmluZywgYnV0IGVuZm9yY2luZyB0aGF0IGl0IGRvZXNuJ3QNCi8vIGdvIGFib3ZlIHRoZSBjb29raWUgc2l6ZSBsaW1pdCB3aGljaCBjYW4gb3RoZXJ3aXNlIGNhdXNlIHVzZXJzIHRvIGJlY29tZSBzdHVjayBzaW5jZSB0aGUgcGFnZSByZXF1ZXN0cyB3aWxsIHN0YXJ0IGZhaWxpbmcNCmZ1bmN0aW9uIEpvaW5JbXByZXNzaW9uc1VwVG9MaW1pdCggcmdJbXByZXNzaW9ucyApDQp7DQoJLy9jb29raWVzIGdlbmVyYWxseSBjYW4gZ28gdXAgdG8gNGsgYnl0ZXMsIGJ1dCB3ZSBjYW4gaGF2ZSBwcm9ibGVtcyB3aGVuIHdlIHN0YXJ0IGdldHRpbmcgdGhhdCBjbG9zZSwgc28gY3V0IGl0IG9mZiBlYXJsaWVyDQoJdmFyIG5SZW1haW5pbmdMZW4gPSAzMjAwOw0KCXZhciByZXN1bHQgPSAnJzsNCglmb3IgKCB2YXIgaSA9IDA7IGkgPCByZ0ltcHJlc3Npb25zLmxlbmd0aDsgaSsrICkNCgl7DQoJCXZhciBpbXByZXNzaW9uID0gU3RyaW5nKCByZ0ltcHJlc3Npb25zWyBpIF0gKTsNCgkJdmFyIG5JbXByZXNzaW9uTGVuID0gZW5jb2RlVVJJQ29tcG9uZW50KCBpbXByZXNzaW9uICsgJ3wnICkubGVuZ3RoOw0KDQoJCS8vZGlkIHdlIHJ1biBvdXQgb2Ygcm9vbSBpbiBvdXIgbGlzdD8NCgkJaWYgKCBuUmVtYWluaW5nTGVuIDwgbkltcHJlc3Npb25MZW4gKQ0KCQkJYnJlYWs7DQoNCgkJLy9hZGQgdGhlIHNlcGFyYXRvciBpZiBub3QgdGhlIGZpcnN0IGVudHJ5DQoJCWlmICggcmVzdWx0ICE9PSAnJyApDQoJCQlyZXN1bHQgKz0gJ3wnOw0KDQoJCS8vYWRkIG91ciBpbXByZXNzaW9uIGFuZCByZW1vdmUgdGhhdCBzcGFjZSBmcm9tIHdoYXQgaXMgYXZhaWxhYmxlDQoJCXJlc3VsdCArPSBpbXByZXNzaW9uOw0KCQluUmVtYWluaW5nTGVuIC09IG5JbXByZXNzaW9uTGVuOw0KCX0NCg0KCXJldHVybiByZXN1bHQ7DQp9DQoNCmZ1bmN0aW9uIFJlY29yZEFwcEltcHJlc3Npb24oIGFwcGlkLCBzbnIgKQ0Kew0KCWlmICggYXBwaWQgPT0gMCB8fCAhc25yICkNCgkJcmV0dXJuOw0KDQoJaWYgKCB0eXBlb2YgZ19iQWxsb3dBcHBJbXByZXNzaW9ucyA9PSAndW5kZWZpbmVkJyB8fCAhZ19iQWxsb3dBcHBJbXByZXNzaW9ucyApDQoJew0KCQkJCXJldHVybjsNCgl9DQoJDQoJdmFyIHN0ckltcHJlc3Npb25zID0gVl9HZXRDb29raWUoICJhcHBfaW1wcmVzc2lvbnMiICk7DQoJdmFyIHJnSW1wcmVzc2lvbnMgPSBzdHJJbXByZXNzaW9ucyAmJiBzdHJJbXByZXNzaW9ucy5sZW5ndGggIT0gMCA/IHN0ckltcHJlc3Npb25zLnNwbGl0KCAifCIgKSA6IFtdOw0KDQoNCgl2YXIgc3RySW1wcmVzc2lvbkRhdGEgPSBhcHBpZCArICdAJyArIHNucjsNCglyZ0ltcHJlc3Npb25zLnB1c2goIHN0ckltcHJlc3Npb25EYXRhICk7DQoNCglWX1NldENvb2tpZSggImFwcF9pbXByZXNzaW9ucyIsIEpvaW5JbXByZXNzaW9uc1VwVG9MaW1pdCggcmdJbXByZXNzaW9ucyApICk7DQp9DQoNCg0KLy8gZG9lc24ndCBwcm9wZXJseSBoYW5kbGUgY29va2llcyB3aXRoIDsgaW4gdGhlbSAobmVlZHMgdG8gbG9vayBmb3IgZXNjYXBlIGNoYXIpDQpmdW5jdGlvbiBHZXRDb29raWUoIHN0ckNvb2tpZU5hbWUgKQ0Kew0KCXZhciByZ01hdGNoZXMgPSBkb2N1bWVudC5jb29raWUubWF0Y2goICcoXnw7ICknICsgc3RyQ29va2llTmFtZSArICc9KFteO10qKScgKTsNCglpZiAoIHJnTWF0Y2hlcyAmJiByZ01hdGNoZXNbMl0gKQ0KCQlyZXR1cm4gcmdNYXRjaGVzWzJdOw0KCWVsc2UNCgkJcmV0dXJuIG51bGw7DQp9DQoNCmZ1bmN0aW9uIFNldENvb2tpZSggc3RyQ29va2llTmFtZSwgc3RyVmFsdWUsIGV4cGlyeUluRGF5cywgcGF0aCApDQp7DQoJaWYgKCAhZXhwaXJ5SW5EYXlzICkNCgkJZXhwaXJ5SW5EYXlzID0gMDsNCglpZiAoICFwYXRoICkNCgkJcGF0aCA9ICcvJzsNCgkNCgl2YXIgZGF0ZUV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KCWRhdGVFeHBpcmVzLnNldFRpbWUoIGRhdGVFeHBpcmVzLmdldFRpbWUoKSArIDEwMDAgKiA2MCAqIDYwICogMjQgKiBleHBpcnlJbkRheXMgKTsNCglkb2N1bWVudC5jb29raWUgPSBzdHJDb29raWVOYW1lICsgJz0nICsgc3RyVmFsdWUgKyAnOyBleHBpcmVzPScgKyBkYXRlRXhwaXJlcy50b0dNVFN0cmluZygpICsgJztwYXRoPScgKyBwYXRoOw0KfQ0KDQovLyBpbmNsdWRlZCBkYXRhOiBzdHJDb2RlLCBlQ3VycmVuY3lDb2RlLCBzdHJTeW1ib2wsIGJTeW1ib2xJc1ByZWZpeCwgYldob2xlVW5pdHNPbmx5DQpnX3JnQ3VycmVuY3lEYXRhID0geyJVU0QiOnsic3RyQ29kZSI6IlVTRCIsImVDdXJyZW5jeUNvZGUiOjEsInN0clN5bWJvbCI6IiQiLCJiU3ltYm9sSXNQcmVmaXgiOnRydWUsImJXaG9sZVVuaXRzT25seSI6ZmFsc2UsInN0ckRlY2ltYWxTeW1ib2wiOiIuIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLCIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiJ9LCJHQlAiOnsic3RyQ29kZSI6IkdCUCIsImVDdXJyZW5jeUNvZGUiOjIsInN0clN5bWJvbCI6Ilx1MDBhMyIsImJTeW1ib2xJc1ByZWZpeCI6dHJ1ZSwiYldob2xlVW5pdHNPbmx5IjpmYWxzZSwic3RyRGVjaW1hbFN5bWJvbCI6Ii4iLCJzdHJUaG91c2FuZHNTZXBhcmF0b3IiOiIsIiwic3RyU3ltYm9sQW5kTnVtYmVyU2VwYXJhdG9yIjoiIn0sIkVVUiI6eyJzdHJDb2RlIjoiRVVSIiwiZUN1cnJlbmN5Q29kZSI6Mywic3RyU3ltYm9sIjoiXHUyMGFjIiwiYlN5bWJvbElzUHJlZml4IjpmYWxzZSwiYldob2xlVW5pdHNPbmx5IjpmYWxzZSwic3RyRGVjaW1hbFN5bWJvbCI6IiwiLCJzdHJUaG91c2FuZHNTZXBhcmF0b3IiOiIgIiwic3RyU3ltYm9sQW5kTnVtYmVyU2VwYXJhdG9yIjoiIn0sIkNIRiI6eyJzdHJDb2RlIjoiQ0hGIiwiZUN1cnJlbmN5Q29kZSI6NCwic3RyU3ltYm9sIjoiQ0hGIiwiYlN5bWJvbElzUHJlZml4Ijp0cnVlLCJiV2hvbGVVbml0c09ubHkiOmZhbHNlLCJzdHJEZWNpbWFsU3ltYm9sIjoiLiIsInN0clRob3VzYW5kc1NlcGFyYXRvciI6IiAiLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIgIn0sIlJVQiI6eyJzdHJDb2RlIjoiUlVCIiwiZUN1cnJlbmN5Q29kZSI6NSwic3RyU3ltYm9sIjoiXHUwNDQwXHUwNDQzXHUwNDMxLiIsImJTeW1ib2xJc1ByZWZpeCI6ZmFsc2UsImJXaG9sZVVuaXRzT25seSI6dHJ1ZSwic3RyRGVjaW1hbFN5bWJvbCI6IiwiLCJzdHJUaG91c2FuZHNTZXBhcmF0b3IiOiIiLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIgIn0sIkJSTCI6eyJzdHJDb2RlIjoiQlJMIiwiZUN1cnJlbmN5Q29kZSI6Nywic3RyU3ltYm9sIjoiUiQiLCJiU3ltYm9sSXNQcmVmaXgiOnRydWUsImJXaG9sZVVuaXRzT25seSI6ZmFsc2UsInN0ckRlY2ltYWxTeW1ib2wiOiIsIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLiIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiAifSwiSlBZIjp7InN0ckNvZGUiOiJKUFkiLCJlQ3VycmVuY3lDb2RlIjo4LCJzdHJTeW1ib2wiOiJcdTAwYTUiLCJiU3ltYm9sSXNQcmVmaXgiOnRydWUsImJXaG9sZVVuaXRzT25seSI6dHJ1ZSwic3RyRGVjaW1hbFN5bWJvbCI6Ii4iLCJzdHJUaG91c2FuZHNTZXBhcmF0b3IiOiIsIiwic3RyU3ltYm9sQW5kTnVtYmVyU2VwYXJhdG9yIjoiICJ9LCJOT0siOnsic3RyQ29kZSI6Ik5PSyIsImVDdXJyZW5jeUNvZGUiOjksInN0clN5bWJvbCI6ImtyIiwiYlN5bWJvbElzUHJlZml4IjpmYWxzZSwiYldob2xlVW5pdHNPbmx5IjpmYWxzZSwic3RyRGVjaW1hbFN5bWJvbCI6IiwiLCJzdHJUaG91c2FuZHNTZXBhcmF0b3IiOiIuIiwic3RyU3ltYm9sQW5kTnVtYmVyU2VwYXJhdG9yIjoiICJ9LCJJRFIiOnsic3RyQ29kZSI6IklEUiIsImVDdXJyZW5jeUNvZGUiOjEwLCJzdHJTeW1ib2wiOiJScCIsImJTeW1ib2xJc1ByZWZpeCI6dHJ1ZSwiYldob2xlVW5pdHNPbmx5Ijp0cnVlLCJzdHJEZWNpbWFsU3ltYm9sIjoiLiIsInN0clRob3VzYW5kc1NlcGFyYXRvciI6IiAiLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIgIn0sIk1ZUiI6eyJzdHJDb2RlIjoiTVlSIiwiZUN1cnJlbmN5Q29kZSI6MTEsInN0clN5bWJvbCI6IlJNIiwiYlN5bWJvbElzUHJlZml4Ijp0cnVlLCJiV2hvbGVVbml0c09ubHkiOmZhbHNlLCJzdHJEZWNpbWFsU3ltYm9sIjoiLiIsInN0clRob3VzYW5kc1NlcGFyYXRvciI6IiwiLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIifSwiUEhQIjp7InN0ckNvZGUiOiJQSFAiLCJlQ3VycmVuY3lDb2RlIjoxMiwic3RyU3ltYm9sIjoiUCIsImJTeW1ib2xJc1ByZWZpeCI6dHJ1ZSwiYldob2xlVW5pdHNPbmx5IjpmYWxzZSwic3RyRGVjaW1hbFN5bWJvbCI6Ii4iLCJzdHJUaG91c2FuZHNTZXBhcmF0b3IiOiIsIiwic3RyU3ltYm9sQW5kTnVtYmVyU2VwYXJhdG9yIjoiIn0sIlNHRCI6eyJzdHJDb2RlIjoiU0dEIiwiZUN1cnJlbmN5Q29kZSI6MTMsInN0clN5bWJvbCI6IlMkIiwiYlN5bWJvbElzUHJlZml4Ijp0cnVlLCJiV2hvbGVVbml0c09ubHkiOmZhbHNlLCJzdHJEZWNpbWFsU3ltYm9sIjoiLiIsInN0clRob3VzYW5kc1NlcGFyYXRvciI6IiwiLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIifSwiVEhCIjp7InN0ckNvZGUiOiJUSEIiLCJlQ3VycmVuY3lDb2RlIjoxNCwic3RyU3ltYm9sIjoiXHUwZTNmIiwiYlN5bWJvbElzUHJlZml4Ijp0cnVlLCJiV2hvbGVVbml0c09ubHkiOmZhbHNlLCJzdHJEZWNpbWFsU3ltYm9sIjoiLiIsInN0clRob3VzYW5kc1NlcGFyYXRvciI6IiwiLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIifSwiVk5EIjp7InN0ckNvZGUiOiJWTkQiLCJlQ3VycmVuY3lDb2RlIjoxNSwic3RyU3ltYm9sIjoiXHUyMGFiIiwiYlN5bWJvbElzUHJlZml4IjpmYWxzZSwiYldob2xlVW5pdHNPbmx5Ijp0cnVlLCJzdHJEZWNpbWFsU3ltYm9sIjoiLCIsInN0clRob3VzYW5kc1NlcGFyYXRvciI6Ii4iLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIifSwiS1JXIjp7InN0ckNvZGUiOiJLUlciLCJlQ3VycmVuY3lDb2RlIjoxNiwic3RyU3ltYm9sIjoiXHUyMGE5IiwiYlN5bWJvbElzUHJlZml4Ijp0cnVlLCJiV2hvbGVVbml0c09ubHkiOnRydWUsInN0ckRlY2ltYWxTeW1ib2wiOiIuIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLCIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiAifSwiVFJZIjp7InN0ckNvZGUiOiJUUlkiLCJlQ3VycmVuY3lDb2RlIjoxNywic3RyU3ltYm9sIjoiVEwiLCJiU3ltYm9sSXNQcmVmaXgiOmZhbHNlLCJiV2hvbGVVbml0c09ubHkiOmZhbHNlLCJzdHJEZWNpbWFsU3ltYm9sIjoiLCIsInN0clRob3VzYW5kc1NlcGFyYXRvciI6Ii4iLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIgIn0sIlVBSCI6eyJzdHJDb2RlIjoiVUFIIiwiZUN1cnJlbmN5Q29kZSI6MTgsInN0clN5bWJvbCI6Ilx1MjBiNCIsImJTeW1ib2xJc1ByZWZpeCI6ZmFsc2UsImJXaG9sZVVuaXRzT25seSI6dHJ1ZSwic3RyRGVjaW1hbFN5bWJvbCI6IiwiLCJzdHJUaG91c2FuZHNTZXBhcmF0b3IiOiIgIiwic3RyU3ltYm9sQW5kTnVtYmVyU2VwYXJhdG9yIjoiIn0sIk1YTiI6eyJzdHJDb2RlIjoiTVhOIiwiZUN1cnJlbmN5Q29kZSI6MTksInN0clN5bWJvbCI6Ik1leCQiLCJiU3ltYm9sSXNQcmVmaXgiOnRydWUsImJXaG9sZVVuaXRzT25seSI6ZmFsc2UsInN0ckRlY2ltYWxTeW1ib2wiOiIuIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLCIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiAifSwiQ0FEIjp7InN0ckNvZGUiOiJDQUQiLCJlQ3VycmVuY3lDb2RlIjoyMCwic3RyU3ltYm9sIjoiQ0ROJCIsImJTeW1ib2xJc1ByZWZpeCI6dHJ1ZSwiYldob2xlVW5pdHNPbmx5IjpmYWxzZSwic3RyRGVjaW1hbFN5bWJvbCI6Ii4iLCJzdHJUaG91c2FuZHNTZXBhcmF0b3IiOiIsIiwic3RyU3ltYm9sQW5kTnVtYmVyU2VwYXJhdG9yIjoiICJ9LCJBVUQiOnsic3RyQ29kZSI6IkFVRCIsImVDdXJyZW5jeUNvZGUiOjIxLCJzdHJTeW1ib2wiOiJBJCIsImJTeW1ib2xJc1ByZWZpeCI6dHJ1ZSwiYldob2xlVW5pdHNPbmx5IjpmYWxzZSwic3RyRGVjaW1hbFN5bWJvbCI6Ii4iLCJzdHJUaG91c2FuZHNTZXBhcmF0b3IiOiIsIiwic3RyU3ltYm9sQW5kTnVtYmVyU2VwYXJhdG9yIjoiICJ9LCJOWkQiOnsic3RyQ29kZSI6Ik5aRCIsImVDdXJyZW5jeUNvZGUiOjIyLCJzdHJTeW1ib2wiOiJOWiQiLCJiU3ltYm9sSXNQcmVmaXgiOnRydWUsImJXaG9sZVVuaXRzT25seSI6ZmFsc2UsInN0ckRlY2ltYWxTeW1ib2wiOiIuIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLCIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiAifSwiUExOIjp7InN0ckNvZGUiOiJQTE4iLCJlQ3VycmVuY3lDb2RlIjo2LCJzdHJTeW1ib2wiOiJ6XHUwMTQyIiwiYlN5bWJvbElzUHJlZml4IjpmYWxzZSwiYldob2xlVW5pdHNPbmx5IjpmYWxzZSwic3RyRGVjaW1hbFN5bWJvbCI6IiwiLCJzdHJUaG91c2FuZHNTZXBhcmF0b3IiOiIgIiwic3RyU3ltYm9sQW5kTnVtYmVyU2VwYXJhdG9yIjoiICJ9LCJDTlkiOnsic3RyQ29kZSI6IkNOWSIsImVDdXJyZW5jeUNvZGUiOjIzLCJzdHJTeW1ib2wiOiJcdTAwYTUiLCJiU3ltYm9sSXNQcmVmaXgiOnRydWUsImJXaG9sZVVuaXRzT25seSI6ZmFsc2UsInN0ckRlY2ltYWxTeW1ib2wiOiIuIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLCIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiAifSwiSU5SIjp7InN0ckNvZGUiOiJJTlIiLCJlQ3VycmVuY3lDb2RlIjoyNCwic3RyU3ltYm9sIjoiXHUyMGI5IiwiYlN5bWJvbElzUHJlZml4Ijp0cnVlLCJiV2hvbGVVbml0c09ubHkiOnRydWUsInN0ckRlY2ltYWxTeW1ib2wiOiIuIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLCIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiAifSwiQ0xQIjp7InN0ckNvZGUiOiJDTFAiLCJlQ3VycmVuY3lDb2RlIjoyNSwic3RyU3ltYm9sIjoiQ0xQJCIsImJTeW1ib2xJc1ByZWZpeCI6dHJ1ZSwiYldob2xlVW5pdHNPbmx5Ijp0cnVlLCJzdHJEZWNpbWFsU3ltYm9sIjoiLCIsInN0clRob3VzYW5kc1NlcGFyYXRvciI6Ii4iLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIgIn0sIlBFTiI6eyJzdHJDb2RlIjoiUEVOIiwiZUN1cnJlbmN5Q29kZSI6MjYsInN0clN5bWJvbCI6IlNcLy4iLCJiU3ltYm9sSXNQcmVmaXgiOnRydWUsImJXaG9sZVVuaXRzT25seSI6ZmFsc2UsInN0ckRlY2ltYWxTeW1ib2wiOiIuIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLCIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiJ9LCJDT1AiOnsic3RyQ29kZSI6IkNPUCIsImVDdXJyZW5jeUNvZGUiOjI3LCJzdHJTeW1ib2wiOiJDT0wkIiwiYlN5bWJvbElzUHJlZml4Ijp0cnVlLCJiV2hvbGVVbml0c09ubHkiOnRydWUsInN0ckRlY2ltYWxTeW1ib2wiOiIsIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLiIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiAifSwiWkFSIjp7InN0ckNvZGUiOiJaQVIiLCJlQ3VycmVuY3lDb2RlIjoyOCwic3RyU3ltYm9sIjoiUiIsImJTeW1ib2xJc1ByZWZpeCI6dHJ1ZSwiYldob2xlVW5pdHNPbmx5IjpmYWxzZSwic3RyRGVjaW1hbFN5bWJvbCI6Ii4iLCJzdHJUaG91c2FuZHNTZXBhcmF0b3IiOiIgIiwic3RyU3ltYm9sQW5kTnVtYmVyU2VwYXJhdG9yIjoiICJ9LCJIS0QiOnsic3RyQ29kZSI6IkhLRCIsImVDdXJyZW5jeUNvZGUiOjI5LCJzdHJTeW1ib2wiOiJISyQiLCJiU3ltYm9sSXNQcmVmaXgiOnRydWUsImJXaG9sZVVuaXRzT25seSI6ZmFsc2UsInN0ckRlY2ltYWxTeW1ib2wiOiIuIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLCIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiAifSwiVFdEIjp7InN0ckNvZGUiOiJUV0QiLCJlQ3VycmVuY3lDb2RlIjozMCwic3RyU3ltYm9sIjoiTlQkIiwiYlN5bWJvbElzUHJlZml4Ijp0cnVlLCJiV2hvbGVVbml0c09ubHkiOnRydWUsInN0ckRlY2ltYWxTeW1ib2wiOiIuIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLCIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiAifSwiU0FSIjp7InN0ckNvZGUiOiJTQVIiLCJlQ3VycmVuY3lDb2RlIjozMSwic3RyU3ltYm9sIjoiU1IiLCJiU3ltYm9sSXNQcmVmaXgiOmZhbHNlLCJiV2hvbGVVbml0c09ubHkiOmZhbHNlLCJzdHJEZWNpbWFsU3ltYm9sIjoiLiIsInN0clRob3VzYW5kc1NlcGFyYXRvciI6IiwiLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIgIn0sIkFFRCI6eyJzdHJDb2RlIjoiQUVEIiwiZUN1cnJlbmN5Q29kZSI6MzIsInN0clN5bWJvbCI6IkFFRCIsImJTeW1ib2xJc1ByZWZpeCI6ZmFsc2UsImJXaG9sZVVuaXRzT25seSI6ZmFsc2UsInN0ckRlY2ltYWxTeW1ib2wiOiIuIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLCIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiAifSwiU0VLIjp7InN0ckNvZGUiOiJTRUsiLCJlQ3VycmVuY3lDb2RlIjozMywic3RyU3ltYm9sIjoia3IiLCJiU3ltYm9sSXNQcmVmaXgiOmZhbHNlLCJiV2hvbGVVbml0c09ubHkiOmZhbHNlLCJzdHJEZWNpbWFsU3ltYm9sIjoiLiIsInN0clRob3VzYW5kc1NlcGFyYXRvciI6IiwiLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIgIn0sIkFSUyI6eyJzdHJDb2RlIjoiQVJTIiwiZUN1cnJlbmN5Q29kZSI6MzQsInN0clN5bWJvbCI6IkFSUyQiLCJiU3ltYm9sSXNQcmVmaXgiOnRydWUsImJXaG9sZVVuaXRzT25seSI6ZmFsc2UsInN0ckRlY2ltYWxTeW1ib2wiOiIsIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLiIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiAifSwiSUxTIjp7InN0ckNvZGUiOiJJTFMiLCJlQ3VycmVuY3lDb2RlIjozNSwic3RyU3ltYm9sIjoiXHUyMGFhIiwiYlN5bWJvbElzUHJlZml4Ijp0cnVlLCJiV2hvbGVVbml0c09ubHkiOmZhbHNlLCJzdHJEZWNpbWFsU3ltYm9sIjoiLiIsInN0clRob3VzYW5kc1NlcGFyYXRvciI6IiwiLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIifSwiQllOIjp7InN0ckNvZGUiOiJCWU4iLCJlQ3VycmVuY3lDb2RlIjozNiwic3RyU3ltYm9sIjoiQnIiLCJiU3ltYm9sSXNQcmVmaXgiOnRydWUsImJXaG9sZVVuaXRzT25seSI6ZmFsc2UsInN0ckRlY2ltYWxTeW1ib2wiOiIuIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLCIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiJ9LCJLWlQiOnsic3RyQ29kZSI6IktaVCIsImVDdXJyZW5jeUNvZGUiOjM3LCJzdHJTeW1ib2wiOiJcdTIwYjgiLCJiU3ltYm9sSXNQcmVmaXgiOmZhbHNlLCJiV2hvbGVVbml0c09ubHkiOnRydWUsInN0ckRlY2ltYWxTeW1ib2wiOiIsIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiICIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiJ9LCJLV0QiOnsic3RyQ29kZSI6IktXRCIsImVDdXJyZW5jeUNvZGUiOjM4LCJzdHJTeW1ib2wiOiJLRCIsImJTeW1ib2xJc1ByZWZpeCI6ZmFsc2UsImJXaG9sZVVuaXRzT25seSI6ZmFsc2UsInN0ckRlY2ltYWxTeW1ib2wiOiIuIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLCIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiAifSwiUUFSIjp7InN0ckNvZGUiOiJRQVIiLCJlQ3VycmVuY3lDb2RlIjozOSwic3RyU3ltYm9sIjoiUVIiLCJiU3ltYm9sSXNQcmVmaXgiOmZhbHNlLCJiV2hvbGVVbml0c09ubHkiOmZhbHNlLCJzdHJEZWNpbWFsU3ltYm9sIjoiLiIsInN0clRob3VzYW5kc1NlcGFyYXRvciI6IiwiLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIgIn0sIkNSQyI6eyJzdHJDb2RlIjoiQ1JDIiwiZUN1cnJlbmN5Q29kZSI6NDAsInN0clN5bWJvbCI6Ilx1MjBhMSIsImJTeW1ib2xJc1ByZWZpeCI6dHJ1ZSwiYldob2xlVW5pdHNPbmx5Ijp0cnVlLCJzdHJEZWNpbWFsU3ltYm9sIjoiLCIsInN0clRob3VzYW5kc1NlcGFyYXRvciI6Ii4iLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIifSwiVVlVIjp7InN0ckNvZGUiOiJVWVUiLCJlQ3VycmVuY3lDb2RlIjo0MSwic3RyU3ltYm9sIjoiJFUiLCJiU3ltYm9sSXNQcmVmaXgiOnRydWUsImJXaG9sZVVuaXRzT25seSI6dHJ1ZSwic3RyRGVjaW1hbFN5bWJvbCI6IiwiLCJzdHJUaG91c2FuZHNTZXBhcmF0b3IiOiIuIiwic3RyU3ltYm9sQW5kTnVtYmVyU2VwYXJhdG9yIjoiIn0sIkJHTiI6eyJzdHJDb2RlIjoiQkdOIiwiZUN1cnJlbmN5Q29kZSI6NDIsInN0clN5bWJvbCI6Ilx1MDQzYlx1MDQzMiIsImJTeW1ib2xJc1ByZWZpeCI6ZmFsc2UsImJXaG9sZVVuaXRzT25seSI6ZmFsc2UsInN0ckRlY2ltYWxTeW1ib2wiOiIuIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLCIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiAifSwiSFJLIjp7InN0ckNvZGUiOiJIUksiLCJlQ3VycmVuY3lDb2RlIjo0Mywic3RyU3ltYm9sIjoia24iLCJiU3ltYm9sSXNQcmVmaXgiOmZhbHNlLCJiV2hvbGVVbml0c09ubHkiOmZhbHNlLCJzdHJEZWNpbWFsU3ltYm9sIjoiLiIsInN0clRob3VzYW5kc1NlcGFyYXRvciI6IiwiLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIgIn0sIkNaSyI6eyJzdHJDb2RlIjoiQ1pLIiwiZUN1cnJlbmN5Q29kZSI6NDQsInN0clN5bWJvbCI6IktcdTAxMGQiLCJiU3ltYm9sSXNQcmVmaXgiOmZhbHNlLCJiV2hvbGVVbml0c09ubHkiOmZhbHNlLCJzdHJEZWNpbWFsU3ltYm9sIjoiLiIsInN0clRob3VzYW5kc1NlcGFyYXRvciI6IiwiLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIgIn0sIkRLSyI6eyJzdHJDb2RlIjoiREtLIiwiZUN1cnJlbmN5Q29kZSI6NDUsInN0clN5bWJvbCI6ImtyLiIsImJTeW1ib2xJc1ByZWZpeCI6ZmFsc2UsImJXaG9sZVVuaXRzT25seSI6ZmFsc2UsInN0ckRlY2ltYWxTeW1ib2wiOiIuIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLCIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiAifSwiSFVGIjp7InN0ckNvZGUiOiJIVUYiLCJlQ3VycmVuY3lDb2RlIjo0Niwic3RyU3ltYm9sIjoiRnQiLCJiU3ltYm9sSXNQcmVmaXgiOmZhbHNlLCJiV2hvbGVVbml0c09ubHkiOmZhbHNlLCJzdHJEZWNpbWFsU3ltYm9sIjoiLiIsInN0clRob3VzYW5kc1NlcGFyYXRvciI6IiwiLCJzdHJTeW1ib2xBbmROdW1iZXJTZXBhcmF0b3IiOiIgIn0sIlJPTiI6eyJzdHJDb2RlIjoiUk9OIiwiZUN1cnJlbmN5Q29kZSI6NDcsInN0clN5bWJvbCI6ImxlaSIsImJTeW1ib2xJc1ByZWZpeCI6ZmFsc2UsImJXaG9sZVVuaXRzT25seSI6ZmFsc2UsInN0ckRlY2ltYWxTeW1ib2wiOiIuIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiLCIsInN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciI6IiAifSwiUk1CIjp7InN0ckNvZGUiOiJSTUIiLCJlQ3VycmVuY3lDb2RlIjo5MDAwLCJzdHJTeW1ib2wiOiJcdTUyMDBcdTVlMDEiLCJiU3ltYm9sSXNQcmVmaXgiOmZhbHNlLCJiV2hvbGVVbml0c09ubHkiOnRydWUsInN0ckRlY2ltYWxTeW1ib2wiOiIuIiwic3RyVGhvdXNhbmRzU2VwYXJhdG9yIjoiIiwic3RyU3ltYm9sQW5kTnVtYmVyU2VwYXJhdG9yIjoiICJ9LCJOWFAiOnsic3RyQ29kZSI6Ik5YUCIsImVDdXJyZW5jeUNvZGUiOjkwMDEsInN0clN5bWJvbCI6Ilx1YzZkMCIsImJTeW1ib2xJc1ByZWZpeCI6ZmFsc2UsImJXaG9sZVVuaXRzT25seSI6dHJ1ZSwic3RyRGVjaW1hbFN5bWJvbCI6Ii4iLCJzdHJUaG91c2FuZHNTZXBhcmF0b3IiOiIsIiwic3RyU3ltYm9sQW5kTnVtYmVyU2VwYXJhdG9yIjoiIn19Ow0KDQoNCi8vIHRha2VzIGFuIGludGVnZXINCmZ1bmN0aW9uIHZfY3VycmVuY3lmb3JtYXQoIHZhbHVlSW5DZW50cywgY3VycmVuY3lDb2RlLCBjb3VudHJ5Q29kZSApDQp7DQoJdmFyIGN1cnJlbmN5Rm9ybWF0ID0gKHZhbHVlSW5DZW50cyAvIDEwMCkudG9GaXhlZCgyKTsNCg0KCWlmICggZ19yZ0N1cnJlbmN5RGF0YVtjdXJyZW5jeUNvZGVdICkNCgl7DQoJCXZhciBjdXJyZW5jeURhdGEgPSBnX3JnQ3VycmVuY3lEYXRhW2N1cnJlbmN5Q29kZV07DQoJCWlmICggSXNDdXJyZW5jeVdob2xlVW5pdHMoIGN1cnJlbmN5Q29kZSApICkNCgkJew0KCQkJY3VycmVuY3lGb3JtYXQgPSBjdXJyZW5jeUZvcm1hdC5yZXBsYWNlKCAnLjAwJywgJycgKTsNCgkJfQ0KDQoJCWlmICggY3VycmVuY3lEYXRhLnN0ckRlY2ltYWxTeW1ib2wgIT0gJy4nICkNCgkJew0KCQkJY3VycmVuY3lGb3JtYXQgPSBjdXJyZW5jeUZvcm1hdC5yZXBsYWNlKCAnLicsIGN1cnJlbmN5RGF0YS5zdHJEZWNpbWFsU3ltYm9sICk7DQoJCX0NCg0KCQl2YXIgY3VycmVuY3lSZXR1cm4gPSBJc0N1cnJlbmN5U3ltYm9sQmVmb3JlVmFsdWUoIGN1cnJlbmN5Q29kZSApID8NCgkJCSBHZXRDdXJyZW5jeVN5bWJvbCggY3VycmVuY3lDb2RlICkgKyBjdXJyZW5jeURhdGEuc3RyU3ltYm9sQW5kTnVtYmVyU2VwYXJhdG9yICsgY3VycmVuY3lGb3JtYXQNCgkJCSA6IGN1cnJlbmN5Rm9ybWF0ICsgY3VycmVuY3lEYXRhLnN0clN5bWJvbEFuZE51bWJlclNlcGFyYXRvciArIEdldEN1cnJlbmN5U3ltYm9sKCBjdXJyZW5jeUNvZGUgKTsNCg0KCQlpZiAoIGN1cnJlbmN5Q29kZSA9PSAnVVNEJyAmJiB0eXBlb2YoY291bnRyeUNvZGUpICE9ICd1bmRlZmluZWQnICYmIGNvdW50cnlDb2RlICE9ICdVUycgKQ0KCQl7DQoJCQlyZXR1cm4gY3VycmVuY3lSZXR1cm4gKyAnIFVTRCc7DQoJCX0NCgkJZWxzZSBpZiAoIGN1cnJlbmN5Q29kZSA9PSAnRVVSJyApDQoJCXsNCgkJCXJldHVybiBjdXJyZW5jeVJldHVybi5yZXBsYWNlKCAnLDAwJywgJywtLScgKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXJldHVybiBjdXJyZW5jeVJldHVybjsNCgkJfQ0KCX0NCgllbHNlDQoJew0KCQlyZXR1cm4gY3VycmVuY3lGb3JtYXQgKyAnICcgKyBjdXJyZW5jeUNvZGU7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIElzQ3VycmVuY3lTeW1ib2xCZWZvcmVWYWx1ZSggY3VycmVuY3lDb2RlICkNCnsNCglyZXR1cm4gZ19yZ0N1cnJlbmN5RGF0YVtjdXJyZW5jeUNvZGVdICYmIGdfcmdDdXJyZW5jeURhdGFbY3VycmVuY3lDb2RlXS5iU3ltYm9sSXNQcmVmaXg7DQp9DQoNCmZ1bmN0aW9uIElzQ3VycmVuY3lXaG9sZVVuaXRzKCBjdXJyZW5jeUNvZGUgKQ0Kew0KCQlyZXR1cm4gZ19yZ0N1cnJlbmN5RGF0YVtjdXJyZW5jeUNvZGVdICYmIGdfcmdDdXJyZW5jeURhdGFbY3VycmVuY3lDb2RlXS5iV2hvbGVVbml0c09ubHkgJiYgY3VycmVuY3lDb2RlICE9ICdSVUInOw0KfQ0KDQovLyBSZXR1cm4gdGhlIHN5bWJvbCB0byB1c2UgZm9yIGEgY3VycmVuY3kNCmZ1bmN0aW9uIEdldEN1cnJlbmN5U3ltYm9sKCBjdXJyZW5jeUNvZGUgKQ0Kew0KCXJldHVybiBnX3JnQ3VycmVuY3lEYXRhW2N1cnJlbmN5Q29kZV0gPyBnX3JnQ3VycmVuY3lEYXRhW2N1cnJlbmN5Q29kZV0uc3RyU3ltYm9sIDogY3VycmVuY3lDb2RlICsgJyAnOw0KfQ0KDQpmdW5jdGlvbiBHZXRDdXJyZW5jeUNvZGUoIGN1cnJlbmN5SWQgKQ0Kew0KCWZvciAoIHZhciBjb2RlIGluIGdfcmdDdXJyZW5jeURhdGEgKQ0KCXsNCgkJaWYgKCBnX3JnQ3VycmVuY3lEYXRhW2NvZGVdLmVDdXJyZW5jeUNvZGUgPT0gY3VycmVuY3lJZCApDQoJCQlyZXR1cm4gY29kZTsNCgl9DQoJcmV0dXJuICdVbmtub3duJzsNCn0NCg0KZnVuY3Rpb24gR2V0QXZhdGFyVVJMRnJvbUhhc2goIGhhc2gsIHNpemUgKQ0Kew0KICAgIHZhciBzdHJVUkwgPSAnaHR0cHM6Ly9hdmF0YXJzLmFrYW1haS5zdGVhbXN0YXRpYy5jb20vJyArIGhhc2g7DQoNCglpZiAoIHNpemUgPT0gJ2Z1bGwnICkNCgkJc3RyVVJMICs9ICdfZnVsbC5qcGcnOw0KCWVsc2UgaWYgKCBzaXplID09ICdtZWRpdW0nICkNCgkJc3RyVVJMICs9ICdfbWVkaXVtLmpwZyc7DQoJZWxzZQ0KCQlzdHJVUkwgKz0gJy5qcGcnOw0KDQoJcmV0dXJuIHN0clVSTDsNCn0NCg0KDQoNCg0KLy8gbmVlZCB0byBob2xkIG9uIHRvIHRoaXMgc28gaXQgZG9lc24ndCBnZXQgbG9zdCB3aGVuIHdlIHJlbW92ZSgpIHRoZSBkaWFsb2cgZWxlbWVudA0KdmFyIGdfQWJ1c2VNb2RhbENvbnRlbnRzID0gbnVsbDsNCmZ1bmN0aW9uIFNob3dBYnVzZURpYWxvZygpDQp7DQoJaWYgKCAhZ19BYnVzZU1vZGFsQ29udGVudHMgKQ0KCQlnX0FidXNlTW9kYWxDb250ZW50cyA9ICRKKCcjcmVwb3J0QWJ1c2VNb2RhbENvbnRlbnRzJyk7DQoNCglpZiAoIGdfQWJ1c2VNb2RhbENvbnRlbnRzICkNCgl7DQoJCXZhciBNb2RhbCA9IFNob3dEaWFsb2coICdSZXBvcnQgVmlvbGF0aW9uJywgZ19BYnVzZU1vZGFsQ29udGVudHMgKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIFN0YW5kYXJkQ29tbXVuaXR5QmFuKCBzdGVhbWlkLCBlbGVtTGluayApDQp7DQoJJEouZ2V0KCAnaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vYWN0aW9ucy9jb21tdW5pdHliYW5kaWFsb2cnLCB7ICdzZXNzaW9uSUQnIDogZ19zZXNzaW9uSUQsICdzdGVhbUlEJyA6IHN0ZWFtaWQgfSApDQoJLmRvbmUoIGZ1bmN0aW9uKCBkYXRhICkNCgl7DQoJCXZhciAkQ29udGVudCA9ICRKKGRhdGEpOw0KCQl2YXIgTW9kYWwgPSBTaG93Q29uZmlybURpYWxvZyggIkNvbW11bml0eSBCYW4iLCAkQ29udGVudCwgJ1N1Ym1pdCcNCgkJKS5kb25lKAlmdW5jdGlvbiggKSB7DQoNCgkJCXZhciAkRm9ybSA9ICRDb250ZW50LmZpbmQoICdmb3JtI2NvbW11bml0eV9iYW5fZm9ybScgKTsNCg0KCQkJJEoucG9zdCggImh0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL2FjdGlvbnMvU3RhbmRhcmRDb21tdW5pdHlCYW4iLCAkRm9ybS5zZXJpYWxpemUoKSApDQoJCQkuZG9uZSggZnVuY3Rpb24oIGRhdGEgKSB7DQoJCQkJaWYgKCAhJEouaXNFbXB0eU9iamVjdCggZWxlbUxpbmsgKSApDQoJCQkJew0KICAgICAgICAgICAgICAgICAgICAkSihlbGVtTGluaykucmVwbGFjZVdpdGgoICc8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkJhbm5lZDwvc3Bhbj4nICk7DQoJCQkJfQ0KCQkJCWVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsNCgkJCQl9DQoNCgkJCX0pLmZhaWwoIGZ1bmN0aW9uKCBqcXhociApIHsNCgkJCQkvLyBqcXVlcnkgZG9lc24ndCBwYXJzZSBqc29uIG9uIGZhaWwNCgkJCQl2YXIgZGF0YSA9IFZfUGFyc2VKU09OKCBqcXhoci5yZXNwb25zZVRleHQgKTsNCgkJCQlTaG93QWxlcnREaWFsb2coICdDb21tdW5pdHkgQmFuICYgRGVsZXRlIENvbW1lbnRzJywgJ0ZhaWxlZCB3aXRoIGVycm9yIG1lc3NhZ2U6ICcgKyBkYXRhLnN1Y2Nlc3MgKTsNCgkJCX0pOw0KCQl9ICk7DQoNCgl9KS5mYWlsKCBmdW5jdGlvbiggZGF0YSApDQoJew0KCQlTaG93QWxlcnREaWFsb2coICdDb21tdW5pdHkgQmFuICYgRGVsZXRlIENvbW1lbnRzJywgJ1lvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9ucyB0byB2aWV3IHRoaXMgb3IgeW91IGFyZSBub3QgbG9nZ2VkIGluLicgKTsNCgl9KTsNCg0KfQ0KDQpmdW5jdGlvbiBSZXBvcnRQcm9maWxlKCBzdGVhbUlEICkNCnsNCgl2YXIgJENvbnRlbnQgPSAkSignPGRpdiBjbGFzcz0iZ3JvdXBfaW52aXRlX3Rocm9iYmVyIj48aW1nIHNyYz0iaHR0cHM6Ly9jb21tdW5pdHkuYWthbWFpLnN0ZWFtc3RhdGljLmNvbS9wdWJsaWMvaW1hZ2VzL2xvZ2luL3Rocm9iYmVyLmdpZiI+PC9kaXY+Jyk7DQoJdmFyICRNb2RhbCA9IFNob3dEaWFsb2coIG51bGwsICRDb250ZW50ICk7DQoJdmFyIHNVUkwgPSAnaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vYWN0aW9ucy9SZXBvcnRQcm9maWxlLycgKyBzdGVhbUlEOw0KCSRKLmFqYXgoIHsNCgkJdXJsOiBzVVJMLA0KCQl0eXBlOiAnR0VUJw0KCX0pLmRvbmUoIGZ1bmN0aW9uICggZGF0YSApIHsNCgkJdmFyICREaWFsb2dIVE1MID0gJEooIGRhdGEgKTsNCgkJJENvbnRlbnQucmVwbGFjZVdpdGgoICREaWFsb2dIVE1MICk7DQoJCSRNb2RhbC5TZXRNYXhIZWlnaHQoICc4NTAnICk7DQoJfSApOw0KfQ0KDQpmdW5jdGlvbiBDRW1vdGljb25Qb3B1cCggJEVtb3RpY29uQnV0dG9uLCAkVGV4dGFyZWEsIHN0ckJhc2VVUkwgKQ0Kew0KCXRoaXMubV8kRW1vdGljb25CdXR0b24gPSAkRW1vdGljb25CdXR0b247DQoJdGhpcy5tXyRUZXh0QXJlYSA9ICRUZXh0YXJlYTsNCgl0aGlzLm1fc3RyQmFzZVVSTCA9IHN0ckJhc2VVUkwgfHwgJ2h0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tJzsNCg0KCWlmICggQ0Vtb3RpY29uUG9wdXAuc21fZGVmZXJFbW90aWNvbnNMb2FkZWQgPT0gbnVsbCApDQoJCUNFbW90aWNvblBvcHVwLnNtX2RlZmVyRW1vdGljb25zTG9hZGVkID0gbmV3IGpRdWVyeS5EZWZlcnJlZCgpOw0KDQoJdGhpcy5tX2JWaXNpYmxlID0gZmFsc2U7DQoJdGhpcy5tXyRQb3B1cCA9IG51bGw7DQoNCgl2YXIgX3RoaXMgPSB0aGlzOw0KCXRoaXMubV8kRW1vdGljb25CdXR0b24ub25lKCdtb3VzZWVudGVyJywgZnVuY3Rpb24oKSB7IF90aGlzLkxvYWRFbW90aWNvbnMoKTsgfSApOw0KCXRoaXMubV8kRW1vdGljb25CdXR0b24uY2xpY2soIGZ1bmN0aW9uKCkgeyBfdGhpcy5Mb2FkRW1vdGljb25zKCk7IENFbW90aWNvblBvcHVwLnNtX2RlZmVyRW1vdGljb25zTG9hZGVkLmRvbmUoIGZ1bmN0aW9uKCkgeyBfdGhpcy5PbkJ1dHRvbkNsaWNrKCk7IH0gKSB9ICk7DQoJdGhpcy5tX2ZuT25Eb2N1bWVudENsaWNrID0gZnVuY3Rpb24oKSB7IF90aGlzLkRpc21pc3NQb3B1cCgpOyB9Ow0KfQ0KDQpDRW1vdGljb25Qb3B1cC5zbV9yZ0Vtb3RpY29ucyA9IFtdOw0KQ0Vtb3RpY29uUG9wdXAuc21fYkVtb3RpY29uc0xvYWRlZCA9IGZhbHNlOw0KQ0Vtb3RpY29uUG9wdXAuc21fZGVmZXJFbW90aWNvbnNMb2FkZWQgPSBudWxsOw0KDQpDRW1vdGljb25Qb3B1cC5wcm90b3R5cGUuTG9hZEVtb3RpY29ucyA9IGZ1bmN0aW9uKCkNCnsNCglpZiAoIENFbW90aWNvblBvcHVwLnNtX2JFbW90aWNvbnNMb2FkZWQgKQ0KCQlyZXR1cm47DQoNCglDRW1vdGljb25Qb3B1cC5zbV9iRW1vdGljb25zTG9hZGVkID0gdHJ1ZTsNCglDRW1vdGljb25Qb3B1cC5zbV9yZ0Vtb3RpY29ucyA9IFtdOw0KCSRKLmdldCggdGhpcy5tX3N0ckJhc2VVUkwgKyAnL2FjdGlvbnMvRW1vdGljb25MaXN0JyApDQoJCS5kb25lKCBmdW5jdGlvbihkYXRhKSB7DQoJCQlpZiAoIGRhdGEgKQ0KCQkJCUNFbW90aWNvblBvcHVwLnNtX3JnRW1vdGljb25zID0gZGF0YTsNCgkJfSkuYWx3YXlzKCBmdW5jdGlvbigpIHsgQ0Vtb3RpY29uUG9wdXAuc21fZGVmZXJFbW90aWNvbnNMb2FkZWQucmVzb2x2ZSgpIH0gKTsNCn07DQoNCkNFbW90aWNvblBvcHVwLnByb3RvdHlwZS5PbkJ1dHRvbkNsaWNrID0gZnVuY3Rpb24oKQ0Kew0KCWlmICggdGhpcy5tX2JWaXNpYmxlICkNCgl7DQoJCXRoaXMuRGlzbWlzc1BvcHVwKCk7DQoJfQ0KCWVsc2UNCgl7DQoJCWlmICggIXRoaXMubV8kUG9wdXAgKQ0KCQkJdGhpcy5CdWlsZFBvcHVwKCk7DQoJCWVsc2UNCgkJCVBvc2l0aW9uRW1vdGljb25Ib3ZlciggdGhpcy5tXyRQb3B1cCwgdGhpcy5tXyRFbW90aWNvbkJ1dHRvbiApOw0KDQoJCXRoaXMubV8kRW1vdGljb25CdXR0b24uYWRkQ2xhc3MoICdmb2N1cycgKTsNCgkJdGhpcy5tXyRQb3B1cC5zdG9wKCk7DQoJCXRoaXMubV8kUG9wdXAuZmFkZUluKCAnZmFzdCcgKTsNCgkJdGhpcy5tX2JWaXNpYmxlID0gdHJ1ZTsNCg0KCQlpZiAoIHdpbmRvdy5Vc2VTbWFsbFNjcmVlbk1vZGUgJiYgd2luZG93LlVzZVNtYWxsU2NyZWVuTW9kZSgpICkNCgkJew0KCQkJLy8gc2Nyb2xsIHN1Y2ggdGhhdCB0aGUgZW1vdGljb24gYnV0dG9uIGlzIGp1c3QgYWJvdmUgdGhlIHBvcHVwIHdpbmRvdyB3ZSdyZSBzaG93aW5nIGF0IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbg0KCQkJLy8gCXRoZSAxMCBwaXhlbHMgcmVwcmVzZW50cyB0aGUgcG9wdXAgYmVpbmcgcG9zaXRpb25lZCA1cHggZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4sIGFuZCA1cHggYmV0d2VlbiB0aGUgcG9wdXAgYW5kIGJ1dHRvbg0KCQkJJEood2luZG93KS5zY3JvbGxUb3AoIHRoaXMubV8kRW1vdGljb25CdXR0b24ub2Zmc2V0KCkudG9wIC0gJEood2luZG93KS5oZWlnaHQoKSArIHRoaXMubV8kUG9wdXAuaGVpZ2h0KCkgKyB0aGlzLm1fJEVtb3RpY29uQnV0dG9uLmhlaWdodCgpICsgMTAgKTsNCgkJfQ0KDQoJCXZhciBfdGhpcyA9IHRoaXM7DQoJCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsgJEooZG9jdW1lbnQpLm9uZSggJ2NsaWNrLkVtb3RpY29uUG9wdXAnLCBfdGhpcy5tX2ZuT25Eb2N1bWVudENsaWNrICkgfSwgMCApOw0KCX0NCn07DQoNCkNFbW90aWNvblBvcHVwLnByb3RvdHlwZS5EaXNtaXNzUG9wdXAgPSBmdW5jdGlvbigpDQp7DQoJdGhpcy5tXyRQb3B1cC5mYWRlT3V0KCAnZmFzdCcgKTsNCgl0aGlzLm1fJEVtb3RpY29uQnV0dG9uLnJlbW92ZUNsYXNzKCAnZm9jdXMnICk7DQoJdGhpcy5tX2JWaXNpYmxlID0gZmFsc2U7DQoNCgkkSihkb2N1bWVudCkub2ZmKCAnY2xpY2suRW1vdGljb25Qb3B1cCcgKTsNCn07DQoNCkNFbW90aWNvblBvcHVwLnByb3RvdHlwZS5CdWlsZFBvcHVwID0gZnVuY3Rpb24oKQ0Kew0KCXRoaXMubV8kUG9wdXAgPSAkSignPGRpdi8+JywgeydjbGFzcyc6ICdlbW90aWNvbl9wb3B1cF9jdG4nIH0gKTsNCg0KCXZhciAkUG9wdXBJbm5lciA9ICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ2Vtb3RpY29uX3BvcHVwJyB9ICk7DQoJdGhpcy5tXyRQb3B1cC5hcHBlbmQoICRQb3B1cElubmVyICk7DQoJdmFyICRDb250ZW50ID0gJEooJzxkaXYvPicsIHsnY2xhc3MnOiAnZW1vdGljb25fcG9wdXBfY29udGVudCcgfSApOw0KCSRQb3B1cElubmVyLmFwcGVuZCggJENvbnRlbnQgKTsNCg0KCWZvciggdmFyIGkgPSAwOyBpIDwgQ0Vtb3RpY29uUG9wdXAuc21fcmdFbW90aWNvbnMubGVuZ3RoOyBpKysgKQ0KCXsNCgkJdmFyIHN0ckVtb3RpY29uTmFtZSA9IENFbW90aWNvblBvcHVwLnNtX3JnRW1vdGljb25zW2ldLnJlcGxhY2UoIC86L2csICcnICk7DQoJCXZhciBzdHJFbW90aWNvblVSTCA9ICdodHRwczovL2NvbW11bml0eS5ha2FtYWkuc3RlYW1zdGF0aWMuY29tL2Vjb25vbXkvZW1vdGljb24vJyArIHN0ckVtb3RpY29uTmFtZTsNCg0KCQl2YXIgJEVtb3RpY29uID0gJEooJzxkaXYvPicsIHsnY2xhc3MnOiAnZW1vdGljb25fb3B0aW9uJywgJ2RhdGEtZW1vdGljb24nOiBzdHJFbW90aWNvbk5hbWUgfSApOw0KCQl2YXIgJEltZyA9ICRKKCc8aW1nLz4nLCB7J3NyYyc6IHN0ckVtb3RpY29uVVJMLCAnY2xhc3MnOiAnZW1vdGljb24nIH0gKTsNCgkJJEVtb3RpY29uLmFwcGVuZCggJEltZyApOw0KDQoJCSRFbW90aWNvbi5jbGljayggdGhpcy5HZXRFbW90aWNvbkNsaWNrQ2xvc3VyZSggc3RyRW1vdGljb25OYW1lICkgKTsNCg0KCQkkQ29udGVudC5hcHBlbmQoICRFbW90aWNvbiApOw0KCX0NCg0KCSRKKGRvY3VtZW50LmJvZHkpLmFwcGVuZCggdGhpcy5tXyRQb3B1cCApOw0KCVBvc2l0aW9uRW1vdGljb25Ib3ZlciggdGhpcy5tXyRQb3B1cCwgdGhpcy5tXyRFbW90aWNvbkJ1dHRvbiApOw0KfTsNCg0KQ0Vtb3RpY29uUG9wdXAucHJvdG90eXBlLkdldEVtb3RpY29uQ2xpY2tDbG9zdXJlID0gZnVuY3Rpb24gKCBzdHJFbW90aWNvbk5hbWUgKQ0Kew0KCXZhciBfdGhpcyA9IHRoaXM7DQoJdmFyIHN0clRleHRUb0luc2VydCA9ICc6JyArIHN0ckVtb3RpY29uTmFtZSArICc6JzsNCglyZXR1cm4gZnVuY3Rpb24oKSB7DQoJCXZhciBlbFRleHRBcmVhID0gX3RoaXMubV8kVGV4dEFyZWFbMF07DQoJCWlmICggZWxUZXh0QXJlYSApDQoJCXsNCgkJCXZhciBuU2VsZWN0aW9uU3RhcnQgPSBlbFRleHRBcmVhLnNlbGVjdGlvblN0YXJ0Ow0KCQkJZWxUZXh0QXJlYS52YWx1ZSA9IGVsVGV4dEFyZWEudmFsdWUuc3Vic3RyKCAwLCBuU2VsZWN0aW9uU3RhcnQgKSArIHN0clRleHRUb0luc2VydCArIGVsVGV4dEFyZWEudmFsdWUuc3Vic3RyKCBuU2VsZWN0aW9uU3RhcnQgKTsNCgkJCWVsVGV4dEFyZWEuc2VsZWN0aW9uU3RhcnQgPSBuU2VsZWN0aW9uU3RhcnQgKyBzdHJUZXh0VG9JbnNlcnQubGVuZ3RoOw0KCQl9DQoNCgkJX3RoaXMubV8kVGV4dEFyZWEuZm9jdXMoKTsNCg0KCQlfdGhpcy5EaXNtaXNzUG9wdXAoKTsNCg0KCQlpZiAoIHdpbmRvdy5EaXNtaXNzRW1vdGljb25Ib3ZlciApDQoJCQl3aW5kb3cuc2V0VGltZW91dCggRGlzbWlzc0Vtb3RpY29uSG92ZXIsIDEgKTsNCgl9Ow0KfTsNCg0KZnVuY3Rpb24gUG9zaXRpb25FbW90aWNvbkhvdmVyKCAkSG92ZXIsICRUYXJnZXQgKQ0Kew0KCS8vIHdlIHBvc2l0aW9uIGZpeGVkIGluIENTUyBmb3IgcmVzcG9uc2l2ZSBtb2RlDQoJaWYgKCB3aW5kb3cuVXNlU21hbGxTY3JlZW5Nb2RlICYmIHdpbmRvdy5Vc2VTbWFsbFNjcmVlbk1vZGUoKSApDQoJew0KCQkkSG92ZXIuY3NzKCAnbGVmdCcsICcnICkuY3NzKCd0b3AnLCAnJyApOw0KCQlyZXR1cm47DQoJfQ0KDQoJCSRIb3Zlci5jc3MoICd2aXNpYmlsaXR5JywgJ2hpZGRlbicgKTsNCgkkSG92ZXIuc2hvdygpOw0KDQoJdmFyIG9mZnNldCA9ICRUYXJnZXQub2Zmc2V0KCk7DQoJJEhvdmVyLmNzcyggJ2xlZnQnLCBvZmZzZXQubGVmdCArICdweCcgKTsNCgkkSG92ZXIuY3NzKCAndG9wJywgb2Zmc2V0LnRvcCArICdweCcpOw0KDQoJdmFyICRIb3ZlckJveCA9ICRIb3Zlci5jaGlsZHJlbiggJy5lbW90aWNvbl9wb3B1cCcgKTsNCgl2YXIgJEhvdmVyQXJyb3dMZWZ0ID0gJEhvdmVyLmNoaWxkcmVuKCAnLm1pbmlwcm9maWxlX2Fycm93X2xlZnQnICk7DQoJdmFyICRIb3ZlckFycm93UmlnaHQgPSAkSG92ZXIuY2hpbGRyZW4oICcubWluaXByb2ZpbGVfYXJyb3dfcmlnaHQnICk7DQoNCgl2YXIgbldpbmRvd1Njcm9sbFRvcCA9ICRKKHdpbmRvdykuc2Nyb2xsVG9wKCk7DQoJdmFyIG5XaW5kb3dTY3JvbGxMZWZ0ID0gJEood2luZG93KS5zY3JvbGxMZWZ0KCk7DQoJdmFyIG5WaWV3cG9ydFdpZHRoID0gJEood2luZG93KS53aWR0aCgpOw0KCXZhciBuVmlld3BvcnRIZWlnaHQgPSAkSih3aW5kb3cpLmhlaWdodCgpOw0KDQoJCXZhciAkSG92ZXJBcnJvdyA9ICRIb3ZlckFycm93UmlnaHQ7DQoJdmFyIG5Cb3hSaWdodFZpZXdwb3J0ID0gKCBvZmZzZXQubGVmdCAtIG5XaW5kb3dTY3JvbGxMZWZ0ICkgKyAkVGFyZ2V0Lm91dGVyV2lkdGgoKSArICRIb3ZlckJveC53aWR0aCgpOw0KCXZhciBuU3BhY2VSaWdodCA9IG5WaWV3cG9ydFdpZHRoIC0gbkJveFJpZ2h0Vmlld3BvcnQ7DQoJdmFyIG5TcGFjZUxlZnQgPSBvZmZzZXQubGVmdCAtICRIb3Zlci53aWR0aCgpOw0KCWlmICggblNwYWNlTGVmdCA+IDAgfHwgblNwYWNlTGVmdCA+IG5TcGFjZVJpZ2h0KQ0KCXsNCgkJCQkkSG92ZXIuY3NzKCAnbGVmdCcsICggb2Zmc2V0LmxlZnQgLSAkSG92ZXIud2lkdGgoKSAtIDEyKSArICdweCcgKTsNCgkJJEhvdmVyQXJyb3dMZWZ0LmhpZGUoKTsNCgkJJEhvdmVyQXJyb3dSaWdodC5zaG93KCk7DQoJfQ0KCWVsc2UNCgl7DQoJCQkJJEhvdmVyLmNzcyggJ2xlZnQnLCAoIG9mZnNldC5sZWZ0ICsgJFRhcmdldC5vdXRlcldpZHRoKCkgKSArICdweCcgKTsNCgkJJEhvdmVyQXJyb3cgPSAkSG92ZXJBcnJvd0xlZnQ7DQoJCSRIb3ZlckFycm93TGVmdC5zaG93KCk7DQoJCSRIb3ZlckFycm93UmlnaHQuaGlkZSgpOw0KCX0NCg0KCXZhciBuVG9wQWRqdXN0bWVudCA9IDA7DQoNCgkJCWlmICggJFRhcmdldC5oZWlnaHQoKSA8IDQ4ICkNCgkJblRvcEFkanVzdG1lbnQgPSBNYXRoLmZsb29yKCAkVGFyZ2V0LmhlaWdodCgpIC8gMiApIC0gMTI7DQoJdmFyIG5EZXNpcmVkSG92ZXJUb3AgPSBvZmZzZXQudG9wIC0gMCArIG5Ub3BBZGp1c3RtZW50Ow0KCSRIb3Zlci5jc3MoICd0b3AnLCBuRGVzaXJlZEhvdmVyVG9wICsgJ3B4JyApOw0KDQoJLy8gc2VlIGlmIHRoZSBob3ZlciBpcyBjdXQgb2ZmIGJ5IHRoZSBib3R0b20gb2YgdGhlIHdpbmRvdywgYW5kIGJ1bXAgaXQgdXAgaWYgbmVjY2Vzc2FyeQ0KCXZhciBuVGFyZ2V0VG9wVmlld3BvcnQgPSAoIG9mZnNldC50b3AgLSBuV2luZG93U2Nyb2xsVG9wICkgKyBuVG9wQWRqdXN0bWVudDsNCglpZiAoIG5UYXJnZXRUb3BWaWV3cG9ydCArICRIb3ZlckJveC5oZWlnaHQoKSArIDM1ID4gblZpZXdwb3J0SGVpZ2h0ICkNCgl7DQoJCXZhciBuVmlld3BvcnRBZGp1c3RtZW50ID0gKCAkSG92ZXJCb3guaGVpZ2h0KCkgKyAzNSApIC0gKCBuVmlld3BvcnRIZWlnaHQgLSBuVGFyZ2V0VG9wVmlld3BvcnQgKTsNCg0KCQl2YXIgblZpZXdwb3J0QWRqdXN0ZWRIb3ZlclRvcCA9IG9mZnNldC50b3AgLSBuVmlld3BvcnRBZGp1c3RtZW50Ow0KCQkkSG92ZXIuY3NzKCAndG9wJywgblZpZXdwb3J0QWRqdXN0ZWRIb3ZlclRvcCArICdweCcgKTsNCg0KCQkvLyBhcnJvdyBpcyBub3JtYWxseSBvZmZzZXQgMzBwaXhlbHMuICB3ZSBtb3ZlIGl0IGRvd24gdGhlIHNhbWUgZGlzdGFuY2Ugd2UgbW92ZWQgdGhlIGhvdmVyIHVwLCBzbyBpdCBpcyAiZml4ZWQiIHRvIHdoZXJlIGl0IHdhcyBpbml0aWFsbHkNCgkJJEhvdmVyQXJyb3cuY3NzKCAndG9wJywgKCAzMCArIG5EZXNpcmVkSG92ZXJUb3AgLSBuVmlld3BvcnRBZGp1c3RlZEhvdmVyVG9wICkgKyAncHgnICk7DQoJfQ0KCWVsc2UNCgl7DQoJCSRIb3ZlckFycm93LmNzcyggJ3RvcCcsICcnICk7DQoJfQ0KDQoJJEhvdmVyLmhpZGUoKTsNCgkkSG92ZXIuY3NzKCAndmlzaWJpbGl0eScsICcnICk7DQp9DQoNCg0KZnVuY3Rpb24gSW5pdEVjb25vbXlIb3ZlcnMoIHN0ckVjb25vbXlDU1NVUkwsIHN0ckVjb25vbXlDb21tb25KU1VSTCwgc3RyRWNvbm9teUpTVVJMICkNCnsNCgl2YXIgJEhvdmVyID0gJEooJzxkaXYvPicsIHsnY2xhc3MnOiAnZWNvbm9teWl0ZW1faG92ZXInfSApOw0KCXZhciAkSG92ZXJDb250ZW50ID0gJEooJzxkaXYvPicsIHsnY2xhc3MnOiAnZWNvbm9teWl0ZW1faG92ZXJfY29udGVudCd9ICk7DQoJJEhvdmVyLmFwcGVuZCggJEhvdmVyQ29udGVudCApOw0KCSRIb3Zlci5oaWRlKCk7DQoNCgl2YXIgZm5PbmVUaW1lRWNvbm9teVNldHVwID0gZnVuY3Rpb24oKSB7DQoJCSRKKGRvY3VtZW50LmJvZHkpLmFwcGVuZCggJEhvdmVyICk7DQoNCgkJaWYgKCB0eXBlb2YgVXNlcllvdSA9PSAndW5kZWZpbmVkJyApDQoJCXsNCgkJCQkJCXZhciBjc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAibGluayIgKTsNCgkJCWNzcy5zZXRBdHRyaWJ1dGUoICJyZWwiLCAic3R5bGVzaGVldCIgKTsNCgkJCWNzcy5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgInRleHQvY3NzIiApOw0KCQkJY3NzLnNldEF0dHJpYnV0ZSggImhyZWYiLCBzdHJFY29ub215Q1NTVVJMICk7DQoJCQl2YXIganMxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggInNjcmlwdCIgKTsNCgkJCWpzMS5zZXRBdHRyaWJ1dGUoICJ0eXBlIiwgInRleHQvamF2YXNjcmlwdCIgKTsNCgkJCWpzMS5zZXRBdHRyaWJ1dGUoICJzcmMiLCBzdHJFY29ub215Q29tbW9uSlNVUkwgKTsNCgkJCXZhciBqczIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAic2NyaXB0IiApOw0KCQkJanMyLnNldEF0dHJpYnV0ZSggInR5cGUiLCAidGV4dC9qYXZhc2NyaXB0IiApOw0KCQkJanMyLnNldEF0dHJpYnV0ZSggInNyYyIsIHN0ckVjb25vbXlKU1VSTCApOw0KCQkJdmFyIGhlYWQgPSAkSignaGVhZCcpWzBdOw0KCQkJaGVhZC5hcHBlbmRDaGlsZCggY3NzICk7DQoJCQloZWFkLmFwcGVuZENoaWxkKCBqczEgKTsNCgkJCWhlYWQuYXBwZW5kQ2hpbGQoIGpzMiApOw0KCQl9DQoJfTsNCg0KCXZhciBmbkRhdGFGYWN0b3J5ID0gZnVuY3Rpb24oIGtleSApIHsNCgkJdmFyIHJnSXRlbUtleSA9IGtleS5zcGxpdCgnLycpOw0KCQlpZiAoIHJnSXRlbUtleS5sZW5ndGggPj0gMyAmJiByZ0l0ZW1LZXkubGVuZ3RoIDw9IDUgKQ0KCQl7DQoJCQlpZiAoIGZuT25lVGltZUVjb25vbXlTZXR1cCApDQoJCQl7DQoJCQkJZm5PbmVUaW1lRWNvbm9teVNldHVwKCk7DQoJCQkJZm5PbmVUaW1lRWNvbm9teVNldHVwID0gbnVsbDsNCgkJCX0NCg0KCQkJLy8gcG9wIGFtb3VudCBvZmYgdGhlIGVuZCBmaXJzdCBpZiBpdCdzIHByZXNlbnQNCgkJCXZhciBuQW1vdW50Ow0KCQkJdmFyIHN0ckxhc3RFbnRyeSA9IHJnSXRlbUtleVtyZ0l0ZW1LZXkubGVuZ3RoIC0gMV07DQoJCQlpZiAoIHN0ckxhc3RFbnRyeSAmJiBzdHJMYXN0RW50cnkubGVuZ3RoID4gMiAmJiBzdHJMYXN0RW50cnkuc3Vic3RyKCAwLCAyICkgPT0gJ2E6JyApDQoJCQl7DQoJCQkJbkFtb3VudCA9IHN0ckxhc3RFbnRyeS5zdWJzdHIoIDIgKTsNCgkJCQlyZ0l0ZW1LZXkucG9wKCk7DQoJCQl9DQoNCgkJCXZhciBzdHJVUkwgPSBudWxsOw0KCQkJdmFyIGFwcGlkID0gcmdJdGVtS2V5WzBdOw0KCQkJaWYgKCBhcHBpZCA9PSAnY2xhc3NpbmZvJyApDQoJCQl7DQoJCQkJLy8gY2xhc3MgaW5mbyBzdHlsZQ0KCQkJCWFwcGlkID0gcmdJdGVtS2V5WzFdOw0KCQkJCXZhciBjbGFzc2lkID0gcmdJdGVtS2V5WzJdOw0KCQkJCXZhciBpbnN0YW5jZWlkID0gKCByZ0l0ZW1LZXkubGVuZ3RoID4gMyA/IHJnSXRlbUtleVszXSA6IDAgKTsNCgkJCQlzdHJVUkwgPSAnZWNvbm9teS9pdGVtY2xhc3Nob3Zlci8nICsgYXBwaWQgKyAnLycgKyBjbGFzc2lkICsgJy8nICsgaW5zdGFuY2VpZDsNCgkJCQlzdHJVUkwgKz0gJz9jb250ZW50X29ubHk9MSZsPWVuZ2xpc2gnOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCS8vIHJlYWwgYXNzZXQNCgkJCQl2YXIgY29udGV4dGlkID0gcmdJdGVtS2V5WzFdOw0KCQkJCXZhciBhc3NldGlkID0gcmdJdGVtS2V5WzJdOw0KCQkJCXZhciBzdHJVUkwgPSAnZWNvbm9teS9pdGVtaG92ZXIvJyArIGFwcGlkICsgJy8nICsgY29udGV4dGlkICsgJy8nICsgYXNzZXRpZDsNCgkJCQlzdHJVUkwgKz0gJz9jb250ZW50X29ubHk9MSZ0PXEmb21pdF9vd25lcj0xJmw9ZW5nbGlzaCc7DQoJCQkJaWYgKCByZ0l0ZW1LZXkubGVuZ3RoID09IDQgJiYgcmdJdGVtS2V5WzNdICkNCgkJCQl7DQoJCQkJCXZhciBzdHJPd25lciA9IHJnSXRlbUtleVszXTsNCgkJCQkJaWYgKCBzdHJPd25lci5pbmRleE9mKCAnaWQ6JyApID09IDAgKQ0KCQkJCQkJc3RyVVJMICs9ICcmb191cmw9JyArIHN0ck93bmVyLnN1YnN0ciggMyApOw0KCQkJCQllbHNlDQoJCQkJCQlzdHJVUkwgKz0gJyZvPScgKyBzdHJPd25lcjsNCgkJCQl9DQoJCQl9DQoJCQlpZiAoIG5BbW91bnQgJiYgbkFtb3VudCA+IDEgKQ0KCQkJCXN0clVSTCArPSAnJmFtb3VudD0nICsgbkFtb3VudDsNCgkJCXJldHVybiBuZXcgQ0RlbGF5ZWRBSkFYRGF0YSggc3RyVVJMLCAxMDAgKTsNCgkJfQ0KCQllbHNlDQoJCQlyZXR1cm4gbnVsbDsNCgl9Ow0KDQoJdmFyIHJnQ2FsbGJhY2tzID0gQmluZEFKQVhIb3ZlcnMoICRIb3ZlciwgJEhvdmVyQ29udGVudCwgew0KCQlmbkRhdGFGYWN0b3J5OiBmbkRhdGFGYWN0b3J5LA0KCQlzdHJEYXRhTmFtZTogJ2Vjb25vbXktaXRlbScsDQoJCXN0clVSTE1hdGNoOiAnaXRlbWhvdmVyJw0KCX0gKTsNCn0NCg0KZnVuY3Rpb24gU2hvd1RyYWRlT2ZmZXIoIHRyYWRlT2ZmZXJJRCwgcmdQYXJhbXMgKQ0Kew0KCXZhciBzdHJQYXJhbXMgPSAnJzsNCglpZiAoIHJnUGFyYW1zICkNCgkJc3RyUGFyYW1zID0gJz8nICsgJEoucGFyYW0oIHJnUGFyYW1zICk7DQoNCgl2YXIgc3RyS2V5ID0gKCB0cmFkZU9mZmVySUQgPT0gJ25ldycgPyAnTmV3VHJhZGVPZmZlcicgKyByZ1BhcmFtc1sncGFydG5lciddIDogJ1RyYWRlT2ZmZXInICsgdHJhZGVPZmZlcklEICk7DQoNCgl2YXIgd2luSGVpZ2h0ID0gMTEyMDsNCglpZiAoIFN0ZWFtLkJJc1VzZXJJblN0ZWFtQ2xpZW50KCkgJiYgU3RlYW0uR2V0Q2xpZW50UGFja2FnZVZlcnNpb24oKSA8IDE0MDc4MDAyNDggKQ0KCXsNCgkJLy8gd29ya2Fyb3VuZCBmb3IgY2xpZW50IGJyZWFrIHdoZW4gdGhlIHBvcHVwIHdpbmRvdyBpcyB0b28gdGFsbCBmb3IgdGhlIHNjcmVlbi4gIFRyeSBhbmQgcGljayBhIGhlaWdodCB0aGF0IHdpbGwgZml0IGhlcmUuDQoJCXZhciBuQ2xpZW50Q2hyb21lUFggPSA5MjsNCgkJaWYgKCB3aW5kb3cuc2NyZWVuLmF2YWlsSGVpZ2h0ICYmIHdpbmRvdy5zY3JlZW4uYXZhaWxIZWlnaHQgLSBuQ2xpZW50Q2hyb21lUFggPCB3aW5IZWlnaHQgKQ0KCQkJd2luSGVpZ2h0ID0gd2luZG93LnNjcmVlbi5hdmFpbEhlaWdodCAtIG5DbGllbnRDaHJvbWVQWDsNCgl9DQoNCgl2YXIgc3RyVVJMID0gJ2h0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL3RyYWRlb2ZmZXIvJyArIHRyYWRlT2ZmZXJJRCArICcvJyArIHN0clBhcmFtczsNCglpZiAoIFN0ZWFtLkJJc1VzZXJJblN0ZWFtTW9iaWxlQXBwKCkgKQ0KCXsNCgkJd2luZG93LmxvY2F0aW9uID0gc3RyVVJMOw0KCX0NCgllbHNlDQoJew0KCQl2YXIgd2luT2ZmZXIgPSB3aW5kb3cub3Blbiggc3RyVVJMLCBzdHJLZXksICdoZWlnaHQ9JyArIHdpbkhlaWdodCArICcsd2lkdGg9MTAyOCxyZXNpemU9eWVzLHNjcm9sbGJhcnM9eWVzJyApOw0KDQoJCXdpbk9mZmVyLmZvY3VzKCk7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBMb2dvdXQoKQ0Kew0KCVBvc3RUb1VSTFdpdGhTZXNzaW9uKCAnaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vbG9naW4vbG9nb3V0LycgKTsNCn0NCg0KZnVuY3Rpb24gQ2hhbmdlTGFuZ3VhZ2UoIHN0clRhcmdldExhbmd1YWdlLCBiU3RheU9uUGFnZSApDQp7DQoJdmFyIE1vZGFsID0gU2hvd0Jsb2NraW5nV2FpdERpYWxvZyggJ0NoYW5nZSBsYW5ndWFnZScsICcnICk7DQoJJEoucG9zdCggJ2h0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL2FjdGlvbnMvU2V0TGFuZ3VhZ2UvJywge2xhbmd1YWdlOiBzdHJUYXJnZXRMYW5ndWFnZSwgc2Vzc2lvbmlkOiBnX3Nlc3Npb25JRCB9KQ0KCQkuZG9uZSggZnVuY3Rpb24oKSB7DQoJCQlpZiAoIGJTdGF5T25QYWdlICkNCgkJCQlNb2RhbC5EaXNtaXNzKCk7DQoJCQllbHNlDQoJCQl7DQoJCQkJCQkJCWlmKCBnX3N0ZWFtSUQgKQ0KCQkJCQl3aW5kb3cubG9jYXRpb24gPSAnaHR0cHM6Ly9zdG9yZS5zdGVhbXBvd2VyZWQuY29tL2FjY291bnQvbGFuZ3VhZ2VwcmVmZXJlbmNlcy8nOw0KCQkJCWVsc2UgaWYgKCB3aW5kb3cubG9jYXRpb24uaHJlZi5tYXRjaCggL1s/Jl1sPS8gKSApDQoJCQkJCXdpbmRvdy5sb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoIC8oWz8mXSlsPVteJl0qJj8vLCAnJDEnICk7DQoJCQkJZWxzZQ0KCQkJCQl3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7DQoJCQl9DQoJCX0pLmZhaWwoIGZ1bmN0aW9uKCkgew0KCQkJTW9kYWwuRGlzbWlzcygpOw0KCQkJU2hvd0FsZXJ0RGlhbG9nKCAnQ2hhbmdlIGxhbmd1YWdlJywgJ1RoZXJlIHdhcyBhIHByb2JsZW0gY29tbXVuaWNhdGluZyB3aXRoIHRoZSBTdGVhbSBzZXJ2ZXJzLiAgUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nICk7DQoJCX0pOw0KfQ0KDQp2YXIgZ19Db250ZW50RGVzY3JpcHRvclByZWZlcmVuY2VzID0gWyAzLCA0IF07DQp2YXIgZ19VR0NXaXRoTm9CbHVyID0ge307DQp2YXIgZ19iTG9hZGVkVUdDV2l0aE5vQmx1ciA9IGZhbHNlOw0KdmFyIGdfVUdDU2tpcEFkdWx0Q29udGVudENoZWNrRm9yQXBwSUQgPSBmYWxzZTsNCg0KZnVuY3Rpb24gTG9hZFVHQ1dpdGhOb0JsdXIoKQ0Kew0KCWlmICggZ19iTG9hZGVkVUdDV2l0aE5vQmx1ciApDQoJew0KCQlyZXR1cm47DQoJfQ0KDQoJdmFyIHN0clVHQ05vQmx1ciA9IFdlYlN0b3JhZ2UuR2V0TG9jYWwoICdyZ1VHQ05vQmx1cicsIGZhbHNlICk7DQoJaWYgKCBzdHJVR0NOb0JsdXIgIT0gbnVsbCApDQoJew0KCQlnX1VHQ1dpdGhOb0JsdXIgPSBKU09OLnBhcnNlKCBzdHJVR0NOb0JsdXIgKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIFNhdmVVR0NXaXRoTm9CbHVyKCkNCnsNCgl2YXIga2V5cyA9IE9iamVjdC5rZXlzKCBnX1VHQ1dpdGhOb0JsdXIgKTsNCgl2YXIgbWF4S2V5cyA9IDEwMDA7DQoJaWYgKCBrZXlzLmxlbmd0aCA+PSBtYXhLZXlzICkNCgl7DQoJCXZhciByZ1RlbXAgPSBbXTsNCgkJZm9yICggdmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSApDQoJCXsNCgkJCXZhciBrZXkgPSBrZXlzW2ldOw0KCQkJdmFyIHZhbHVlID0gZ19VR0NXaXRoTm9CbHVyW2tleV07DQoJCQlyZ1RlbXAucHVzaCggeyB2OiB2YWx1ZVsndGltZXN0YW1wJ10sIGs6IGtleSB9ICk7DQoJCX0NCgkJcmdUZW1wLnNvcnQoIGZ1bmN0aW9uKCBhLCBiICkgew0KCQkJaWYgKCBhLnYgPiBiLnYgKSB7IHJldHVybiAxOyB9DQoJCQlpZiAoIGEudiA8IGIudiApIHsgcmV0dXJuIC0xOyB9DQoJCQlyZXR1cm4gMDsNCgkJfSk7DQoNCgkJdmFyIGRlbHRhID0gcmdUZW1wLmxlbmd0aCAtIG1heEtleXM7DQoJCWZvciAoIHZhciBpID0gMDsgaSA8IHJnVGVtcC5sZW5ndGggJiYgaSA8IGRlbHRhOyArK2kgKQ0KCQl7DQoJCQl2YXIgYSA9IHJnVGVtcFtpXTsNCgkJCWRlbGV0ZSBnX1VHQ1dpdGhOb0JsdXJbYS5rXTsNCgkJfQ0KCX0NCglXZWJTdG9yYWdlLlNldExvY2FsKCAncmdVR0NOb0JsdXInLCBKU09OLnN0cmluZ2lmeSggZ19VR0NXaXRoTm9CbHVyICksIGZhbHNlICk7DQp9DQoNCmZ1bmN0aW9uIEFwcGx5QWR1bHRDb250ZW50UHJlZmVyZW5jZXMoKQ0Kew0KCUxvYWRVR0NXaXRoTm9CbHVyKCk7DQoNCgl2YXIgZWxlbWVudHNXaXRoQWR1bHRDb250ZW50ID0gJEooICdbZGF0YS1kZXNjaWRzXScpOw0KCWlmICggZWxlbWVudHNXaXRoQWR1bHRDb250ZW50Lmxlbmd0aCA9PSAwICkNCgl7DQoJCXJldHVybjsNCgl9DQoNCglmb3IgKCB2YXIgaSA9IDA7IGkgPCBlbGVtZW50c1dpdGhBZHVsdENvbnRlbnQubGVuZ3RoOyArK2kgKQ0KCXsNCgkJdmFyIGUgPSAkSiggZWxlbWVudHNXaXRoQWR1bHRDb250ZW50W2ldICk7DQoJCUFwcGx5QWR1bHRDb250ZW50UHJlZmVyZW5jZXNIZWxwZXIoIGUsIGdfQ29udGVudERlc2NyaXB0b3JQcmVmZXJlbmNlcywgZmFsc2UgKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIFJlYXBwbHlBZHVsdENvbnRlbnRQcmVmZXJlbmNlcygpDQp7DQoJdmFyIGVsZW1lbnRzV2l0aEFkdWx0Q29udGVudCA9ICRKKCAnW2RhdGEtZGVzY2lkc10nKTsNCglpZiAoIGVsZW1lbnRzV2l0aEFkdWx0Q29udGVudC5sZW5ndGggPT0gMCApDQoJew0KCQlyZXR1cm47DQoJfQ0KDQoJZm9yICggdmFyIGkgPSAwOyBpIDwgZWxlbWVudHNXaXRoQWR1bHRDb250ZW50Lmxlbmd0aDsgKytpICkNCgl7DQoJCXZhciBlID0gJEooIGVsZW1lbnRzV2l0aEFkdWx0Q29udGVudFtpXSApOw0KCQlBcHBseUFkdWx0Q29udGVudFByZWZlcmVuY2VzSGVscGVyKCBlLCBnX0NvbnRlbnREZXNjcmlwdG9yUHJlZmVyZW5jZXMsIHRydWUgKTsNCgl9DQp9DQoNCg0KZnVuY3Rpb24gRWRpdENvbnRlbnREZXNjcmlwdG9ycyggcHVibGlzaGVkZmlsZWlkLCBjYWxsYmFjayApDQp7DQoJJEouZ2V0KCAnaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vc2hhcmVkZmlsZXMvYWpheGVkaXRjb250ZW50ZGVzY3JpcHRvcnMvJywgeyBwdWJsaXNoZWRmaWxlaWQ6IHB1Ymxpc2hlZGZpbGVpZCB9ICkNCgkJLmRvbmUoIGZ1bmN0aW9uKCBqc29uICkgew0KCQkJaWYgKCBqc29uLnN1Y2Nlc3MgPT0gMSApDQoJCQl7DQoJCQkJdmFyIGNvbnRlbnQgPSAkSigganNvbi5odG1sICk7DQoJCQkJdmFyIGRpYWxvZyA9IFNob3dDb25maXJtRGlhbG9nKCAnVXBkYXRlIENvbnRlbnQgRGVzY3JpcHRvcnMnLCBjb250ZW50ICk7DQoNCgkJCQlkaWFsb2cuZG9uZSggZnVuY3Rpb24oKSB7DQoJCQkJCXZhciByZ0NoZWNrYm94ZXMgPSAkSigiaW5wdXQ6Y2hlY2tib3giLCBjb250ZW50ICk7DQoNCgkJCQkJdmFyIGFkZCA9IFtdOw0KCQkJCQl2YXIgcmVtb3ZlID0gW107DQoNCgkJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgcmdDaGVja2JveGVzLmxlbmd0aDsgKytpICkNCgkJCQkJew0KCQkJCQkJbGV0IGNoZWNrYm94ID0gcmdDaGVja2JveGVzW2ldOw0KCQkJCQkJaWYgKCBjaGVja2JveC5jaGVja2VkICYmICFjaGVja2JveC5kaXNhYmxlZCApDQoJCQkJCQl7DQoJCQkJCQkJYWRkLnB1c2goIGNoZWNrYm94LnZhbHVlICk7DQoJCQkJCQl9DQoJCQkJCQllbHNlDQoJCQkJCQl7DQoJCQkJCQkJcmVtb3ZlLnB1c2goIGNoZWNrYm94LnZhbHVlICk7DQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQlpZiAoIGFkZC5sZW5ndGggPT0gMCAmJiByZW1vdmUubGVuZ3RoID09IDAgKQ0KCQkJCQkJcmV0dXJuOw0KDQoJCQkJCSRKLnBvc3QoDQoJCQkJCQknaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vc2hhcmVkZmlsZXMvYWpheHVwZGF0ZWNvbnRlbnRkZXNjcmlwdG9ycy8nLA0KCQkJCQkJeyBzZXNzaW9uaWQ6IGdfc2Vzc2lvbklELCBwdWJsaXNoZWRmaWxlaWQ6IHB1Ymxpc2hlZGZpbGVpZCwgYWRkOiBhZGQsIHJlbW92ZTogcmVtb3ZlIH0sDQoJCQkJCSkuZG9uZSggZnVuY3Rpb24oIGpzb24gKQ0KCQkJCQl7DQoJCQkJCQlpZiAoIGpzb24uc3VjY2VzcyA9PSAxICkNCgkJCQkJCXsNCgkJCQkJCQlpZiAoIGNhbGxiYWNrICkNCgkJCQkJCQl7DQoJCQkJCQkJCWNhbGxiYWNrKCBwdWJsaXNoZWRmaWxlaWQgKTsNCgkJCQkJCQl9DQoJCQkJCQkJZWxzZQ0KCQkJCQkJCXsNCgkJCQkJCQkJd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJCWVsc2UNCgkJCQkJCXsNCgkJCQkJCQlTaG93QWxlcnREaWFsb2coICdVcGRhdGUgQ29udGVudCBEZXNjcmlwdG9ycycsICdUaGVyZSB3YXMgYSBwcm9ibGVtIHVwZGF0aW5nIHRoZSBjb250ZW50IGRlc2NyaXB0b3JzIGZvciB0aGlzIGl0ZW06ICcgKyBqc29uLnN1Y2Nlc3MgKTsNCgkJCQkJCX0NCgkJCQkJfSApOw0KCQkJCX0gKTsNCgkJCX0NCgkJfSApOw0KfQ0KDQpmdW5jdGlvbiBIYW5kbGVSZWxhdGVkQ29udGVudERlc2NyaXB0b3JzKCAkdG9wQ29udGFpbmVyLCAkZWxlbSwgYkFuaW1hdGUgKQ0Kew0KCXZhciBjaGVja2VkID0gJGVsZW0ucHJvcCggImNoZWNrZWQiICkgJiYgISRlbGVtLmF0dHIoICJkaXNhYmxlZCIgKTsNCgl2YXIgZGVzY2lkID0gJGVsZW0udmFsKCk7DQoJdmFyICRjb250YWluZXIgPSAkZWxlbS5jbG9zZXN0KCAnW2RhdGEtcGFyZW50ZGVzY2lkXScgKTsNCgl2YXIgcGFyZW50RGVzY0lEID0gJGNvbnRhaW5lci5kYXRhKCAncGFyZW50ZGVzY2lkJyApOw0KCXZhciBjaGlsZHJlbkRlc2NyaXB0b3JzID0gJHRvcENvbnRhaW5lci5maW5kKCAnW2RhdGEtcGFyZW50ZGVzY2lkPSInICsgZGVzY2lkICsgJyJdJyApOw0KDQoJaWYgKCBjaGVja2VkICkNCgl7DQoJCS8vIGNoZWNrIGFsbCBhbmNlc3RvcnMNCgkJaWYgKCBwYXJlbnREZXNjSUQgKQ0KCQl7DQoJCQl2YXIgJHBhcmVudEVsZW0gPSAkdG9wQ29udGFpbmVyLmZpbmQoICcjZGVzY3JpcHRvcl8nICsgcGFyZW50RGVzY0lEICk7DQoJCQkkcGFyZW50RWxlbS5wcm9wKCAnY2hlY2tlZCcsIHRydWUgKTsNCgkJCUhhbmRsZVJlbGF0ZWRDb250ZW50RGVzY3JpcHRvcnMoICR0b3BDb250YWluZXIsICRwYXJlbnRFbGVtLCBiQW5pbWF0ZSApOw0KCQl9DQoJfQ0KCWVsc2UNCgl7DQoJCWNoaWxkcmVuRGVzY3JpcHRvcnMuZWFjaCggZnVuY3Rpb24oICkgew0KCQkJdmFyIGNoaWxkID0gJEooIHRoaXMgKTsNCgkJCWNoaWxkLmZpbmQoICdpbnB1dFt0eXBlPSJjaGVja2JveCJdJyApLmVhY2goIGZ1bmN0aW9uKCkgew0KCQkJCSRKKCB0aGlzICkucHJvcCggImNoZWNrZWQiLCBmYWxzZSApOw0KCQkJCUhhbmRsZVJlbGF0ZWRDb250ZW50RGVzY3JpcHRvcnMoICR0b3BDb250YWluZXIsICRKKCB0aGlzICksIGJBbmltYXRlICk7DQoJCQl9ICk7DQoJCX0gKTsNCgl9DQp9DQoNCi8vIG92ZXJyaWRlIHdoZXJlIG5lY2Vzc2FyeQ0KZnVuY3Rpb24gSGFuZGxlTmV3RHluYW1pY0xpbmsoIG5ld0R5bmFtaWNMaW5rRWxlbWVudCApDQp7DQoJaWYgKCBuZXdEeW5hbWljTGlua0VsZW1lbnQuaGFzQ2xhc3MoICJoYXNfYWR1bHRfY29udGVudCIgKSApDQoJew0KCQlBcHBseUFkdWx0Q29udGVudFByZWZlcmVuY2VzSGVscGVyKCBuZXdEeW5hbWljTGlua0VsZW1lbnQsIGdfQ29udGVudERlc2NyaXB0b3JQcmVmZXJlbmNlcywgZmFsc2UgKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIFVHQ0FkdWx0Q29udGVudFByZWZlcmVuY2VzTWVudSggZWxTb3VyY2UgKQ0Kew0KCXZhciAkRWwgPSAkSih0aGlzKTsNCgl2YXIgJGVsU291cmNlID0gJEooZWxTb3VyY2UucGFyZW50Tm9kZSk7DQoJJEVsLmVtcHR5KCk7DQoNCgl2YXIgYXBwaWQgPSAkZWxTb3VyY2UuZGF0YSgnYXBwaWQnKTsNCgl2YXIgcHVibGlzaGVkRmlsZUlEID0gJGVsU291cmNlLmRhdGEoJ3B1Ymxpc2hlZGZpbGVpZCcpOw0KDQoJLy8gcHJlZmVyZW5jZXMNCgl7DQoJCXZhciBmblZpZXdQcmVmZXJlbmNlcyA9IGZ1bmN0aW9uICgpDQoJCXsNCgkJCXRvcC5sb2NhdGlvbi5ocmVmID0gJ2h0dHBzOi8vc3RvcmUuc3RlYW1wb3dlcmVkLmNvbS8vYWNjb3VudC9wcmVmZXJlbmNlcy8jQ29tbXVuaXR5Q29udGVudFByZWZlcmVuY2VzJzsNCgkJCXJldHVybiB0cnVlOw0KCQl9Ow0KCQl2YXIgJGVsVmlld1ByZWZlcmVuY2VzID0gJEooICc8ZGl2Lz4nICkuY2xpY2soIGZuVmlld1ByZWZlcmVuY2VzICkudGV4dCggJ0VkaXQgUHJlZmVyZW5jZXMnICkuYWRkQ2xhc3MoICdvcHRpb24nICk7DQoJCSRFbC5hcHBlbmQoICRlbFZpZXdQcmVmZXJlbmNlcyApOw0KCX0NCn0NCg0KZnVuY3Rpb24gQXBwbHlBZHVsdENvbnRlbnRQcmVmZXJlbmNlc0hlbHBlciggZSwgcmdDb250ZW50RGVzY3JpcHRvcnNUb0V4Y2x1ZGUsIGJGb3JjZSApDQp7DQoJaWYgKCAhYkZvcmNlICYmIGUuZGF0YSggJ3Byb2Nlc3NlZF9hZHVsdF9jb250ZW50JykgKQ0KCXsNCgkJcmV0dXJuOw0KCX0NCg0KCWlmICggKCB0eXBlb2YoIGdfYlZpZXdpbmdPd25Qcm9maWxlICkgIT0gJ3VuZGVmaW5lZCcgKSAmJiBnX2JWaWV3aW5nT3duUHJvZmlsZSApDQoJew0KCQllLnJlbW92ZUNsYXNzKCAnaGFzX2FkdWx0X2NvbnRlbnQnICk7DQoJCXJldHVybjsNCgl9DQoNCglpZiAoICggdHlwZW9mKCBnX2JJc0FwcEh1Yk1vZGVyYXRvciApICE9ICd1bmRlZmluZWQnICkgJiYgZ19iSXNBcHBIdWJNb2RlcmF0b3IgKQ0KCXsNCgkJZS5yZW1vdmVDbGFzcyggJ2hhc19hZHVsdF9jb250ZW50JyApOw0KCQlyZXR1cm47DQoJfQ0KDQoJZS5kYXRhKCAncHJvY2Vzc2VkX2FkdWx0X2NvbnRlbnQnLCB0cnVlICk7DQoNCgl2YXIgYklzQW5jaG9yID0gZS5pcygnYScpOw0KDQoJdmFyIHB1Ymxpc2hlZEZpbGVJRCA9IGUuZGF0YSggJ3B1Ymxpc2hlZGZpbGVpZCcgKTsNCgl2YXIgYkNvdW50cnlEaXNhbGxvd2VkID0gZS5kYXRhKCAnYWR1bHQtZGlzYWxsb3dlZCcgKTsNCgl2YXIgcmdDb250ZW50RGVzY3JpcHRvcklEcyA9IGUuZGF0YSggJ2Rlc2NpZHMnICkgPz8gW107DQoJdmFyIGFwcGlkID0gZS5kYXRhKCAnYXBwaWQnICk7DQoJdmFyIGJGb3JjZURlQmx1ciA9ICggcHVibGlzaGVkRmlsZUlEICYmIGdfVUdDV2l0aE5vQmx1ci5oYXNPd25Qcm9wZXJ0eSggcHVibGlzaGVkRmlsZUlEICkgKSB8fCAoIGFwcGlkICYmIGdfVUdDU2tpcEFkdWx0Q29udGVudENoZWNrRm9yQXBwSUQgPT0gYXBwaWQgKTsNCg0KCXZhciBmaWx0ZXJlZEFycmF5ID0gcmdDb250ZW50RGVzY3JpcHRvcklEcy5maWx0ZXIoIGZ1bmN0aW9uKCBkZXNjaWQgKSB7IHJldHVybiByZ0NvbnRlbnREZXNjcmlwdG9yc1RvRXhjbHVkZS5pbmRleE9mKCBkZXNjaWQgKSAhPT0gLTE7IH0gKTsNCgl2YXIgYkhhc0V4Y2x1ZGVkQ29udGVudCA9IGZpbHRlcmVkQXJyYXkubGVuZ3RoICE9IDA7DQoNCglpZiAoIGJGb3JjZURlQmx1ciB8fCAhYkhhc0V4Y2x1ZGVkQ29udGVudCApDQoJew0KCQllLnJlbW92ZUNsYXNzKCAnaGFzX2FkdWx0X2NvbnRlbnQnICk7DQoJfQ0KCWVsc2UgaWYgKCBiSGFzRXhjbHVkZWRDb250ZW50ICkNCgl7DQoJCWUuYWRkQ2xhc3MoICdoYXNfYWR1bHRfY29udGVudCcgKTsNCgl9DQoNCglpZiAoIGUuZGF0YSggJ3VnY2xpbmt0ZXh0b25seScgKSA9PT0gMSB8fCBiQ291bnRyeURpc2FsbG93ZWQgKQ0KCXsNCg0KCX0NCgllbHNlDQoJew0KCQkvLyB3aWRnZXQNCgkJew0KCQkJdmFyICRlbE1lbnUgPSAkSiggJzxkaXY+PC9kaXY+JywgeyAnY2xhc3MnOiAndWdjX29wdGlvbnMnIH0gKS5hcHBlbmQoICRKKCAnPGRpdj4nICkgKTsNCgkJCSRlbE1lbnUudl90b29sdGlwKCB7DQoJCQkJJ3Rvb2x0aXBDbGFzcyc6ICd1Z2Nfb3B0aW9uc190b29sdGlwJywNCgkJCQknbG9jYXRpb24nOiAnYm90dG9tIGxlZnQnLA0KCQkJCSdvZmZzZXRZJzogLTIwLA0KCQkJCSd1c2VDbGlja0V2ZW50JzogdHJ1ZSwNCgkJCQkndXNlTW91c2VFbnRlckV2ZW50JzogZmFsc2UsDQoJCQkJJ3ByZXZlbnREZWZhdWx0JzogdHJ1ZSwNCgkJCQknc3RvcFByb3BhZ2F0aW9uJzogdHJ1ZSwNCgkJCQlmdW5jOiBVR0NBZHVsdENvbnRlbnRQcmVmZXJlbmNlc01lbnUNCgkJCX0gKTsNCgkJCWUuYXBwZW5kKCAkZWxNZW51ICk7DQoJCX0NCg0KCQkvLyB3YXJuaW5nDQoJCWlmICggZS53aWR0aCgpID4gMTAwICYmICFlLmhhc0NsYXNzKCAndWdjX3Nob3dfd2FybmluZ19pbWFnZScgKSAmJiAhZS5oYXNDbGFzcyggJ2R5bmFtaWNsaW5rX2JveCcgKSApDQoJCXsNCgkJCXZhciAkZWxXYXJuaW5nID0gJEooICc8ZGl2PjwvZGl2PicsIHsNCgkJCQknY2xhc3MnOiAndWdjX3dhcm5pbmcnDQoJCQl9ICk7DQoJCQlpZiAoIGUud2lkdGgoKSA+IDM1MCApDQoJCQl7DQoJCQkJJGVsV2FybmluZy5hZGRDbGFzcyggImxhcmdlIiApOw0KCQkJfQ0KDQoJCQlpZiAoIGUuaGVpZ2h0KCkgPiAxMjUgKQ0KCQkJew0KCQkJCWUuYWRkQ2xhc3MoICJ1Z2Nfc2hvd193YXJuaW5nX2ltYWdlIiApOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRlbFdhcm5pbmcuYXBwZW5kKCAkSiggJzxkaXY+JywgeyAnY2xhc3MnOiAndWdjX3dhcm5pbmdfaW1hZ2UnIH0gKSApOw0KCQkJfQ0KDQoJCQkkZWxXYXJuaW5nLmFwcGVuZCggJEooICc8c3Bhbj4nLCB7ICd0ZXh0JzogJ0NvbnRlbnQgbWF5IG5vdCBiZSBhcHByb3ByaWF0ZSBiYXNlZCBvbiB5b3VyIHByZWZlcmVuY2VzICd9ICkgKTsNCg0KCQkJdmFyICRlbE9wdGlvbnMgPSAkSiggJzxkaXY+PC9kaXY+JyApOw0KCQkJdmFyICRlbFZpZXdPcHRpb24gPSAkSiggJzxkaXY+PC9kaXY+Jywgew0KCQkJCSdjbGFzcyc6ICd1Z2NfaW5saW5lX29wdGlvbicsDQoJCQkJJ3RleHQnOiAnVmlldyBDb250ZW50Jw0KCQkJfSApOw0KCQkJJGVsVmlld09wdGlvbi5jbGljayggZnVuY3Rpb24gKCBldmVudCApIHsNCgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KCQkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOw0KCQkJCWlmICggYklzQW5jaG9yICYmICFlLmhhc0NsYXNzKCAibW9kYWxDb250ZW50TGluayIgKSApDQoJCQkJew0KCQkJCQl0b3AubG9jYXRpb24uaHJlZiA9IGVbMF0uaHJlZjsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJZS5yZW1vdmVDbGFzcyggJ2hhc19hZHVsdF9jb250ZW50JyApOw0KCQkJCQllLmNsaWNrKCk7DQoJCQkJCWUuYWRkQ2xhc3MoICdoYXNfYWR1bHRfY29udGVudCcgKTsNCgkJCQl9DQoJCQkJcmV0dXJuIGZhbHNlOw0KCQkJfSApOw0KCQkJJGVsT3B0aW9ucy5hcHBlbmQoICRlbFZpZXdPcHRpb24gKTsNCgkJCSRlbE9wdGlvbnMuYXBwZW5kKCAiJm5ic3A7fCZuYnNwOyIgKTsNCgkJCXZhciAkZWxQcmVmZXJlbmNlc09wdGlvbiA9ICRKKCAnPGRpdj48L2Rpdj4nLCB7DQoJCQkJJ2NsYXNzJzogJ3VnY19pbmxpbmVfb3B0aW9uJywNCgkJCQkndGV4dCc6ICdFZGl0IFByZWZlcmVuY2VzJw0KCQkJfSApOw0KCQkJJGVsUHJlZmVyZW5jZXNPcHRpb24uY2xpY2soIGZ1bmN0aW9uICggZXZlbnQgKQl7DQoJCQkJZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7DQoJCQkJdG9wLmxvY2F0aW9uLmhyZWYgPSAnaHR0cHM6Ly9zdG9yZS5zdGVhbXBvd2VyZWQuY29tL2FjY291bnQvcHJlZmVyZW5jZXMnOw0KCQkJCXJldHVybiBmYWxzZTsNCgkJCX0gKTsNCgkJCSRlbE9wdGlvbnMuYXBwZW5kKCAkZWxQcmVmZXJlbmNlc09wdGlvbiApOw0KDQoJCQkkZWxXYXJuaW5nLmFwcGVuZCggJGVsT3B0aW9ucyApOw0KDQoJCQllLmFwcGVuZCggJGVsV2FybmluZyApOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJZS5hZGRDbGFzcyggInVnY19zaG93X3dhcm5pbmdfaW1hZ2UiICk7DQoJCX0NCgl9DQp9DQoNCg0KDQoNCg0KZnVuY3Rpb24gYWJ1c2VTU0Rlc2NyaXBDaGVjaygpDQp7DQoJdmFyIGNoa2RfaW5hcCA9ICQoJ2FidXNlVHlwZTEnKS5jaGVja2VkOw0KCXZhciBjaGtkX2NwcnQgPSAkKCdhYnVzZVR5cGU1JykuY2hlY2tlZDsNCglpZiAoIGNoa2RfaW5hcCApDQoJew0KCQkkKCdhYnVzZURlc2NyaXB0aW9uTGFiZWwnKS5zZXRTdHlsZSggeyBjb2xvcjogJyM3Nzc3NzcnLCBmb250U3R5bGU6ICdpdGFsaWMnIH0gKTsNCgkJJCgnYWJ1c2VEZXNjcmlwdGlvbkFyZWEnKS5kaXNhYmxlKCk7DQoJCSQoJ2FidXNlRGVzY3JpcHRpb25BcmVhJykuY2xlYXIoKTsNCgl9DQoJZWxzZSBpZiAoIGNoa2RfY3BydCApDQoJew0KCQkkKCdhYnVzZURlc2NyaXB0aW9uTGFiZWwnKS5zZXRTdHlsZSggeyBjb2xvcjogJyM4OTg5ODknLCBmb250U3R5bGU6ICdub3JtYWwnIH0gKTsNCgkJJCgnYWJ1c2VEZXNjcmlwdGlvbkFyZWEnKS5lbmFibGUoKTsNCgkJJCgnYWJ1c2VEZXNjcmlwdGlvbkFyZWEnKS5mb2N1cygpOw0KCX0NCn0NCg0KDQoNCg0KDQoNCmZ1bmN0aW9uIEJpbmRPbkhhc2hDaGFuZ2UoIGZuQ2FsbGJhY2sgKQ0Kew0KCWlmICggJ29uaGFzaGNoYW5nZScgaW4gd2luZG93ICkNCgl7DQoJCUV2ZW50Lm9ic2VydmUoIHdpbmRvdywgJ2hhc2hjaGFuZ2UnLCBmdW5jdGlvbihlKSB7IGZuQ2FsbGJhY2soIHRoaXMubG9jYXRpb24uaGFzaCApOyB9ICk7DQoJfQ0KCWVsc2UNCgl7DQoJCW5ldyBMb2NhdGlvbkhhc2hPYnNlcnZlciggbnVsbCwgMC4xLCBmdW5jdGlvbiggZWwsIGhhc2ggKSB7IGZuQ2FsbGJhY2soIGhhc2ggKTsgfSApOw0KCX0NCn0NCg0KTG9jYXRpb25IYXNoT2JzZXJ2ZXIgPSBDbGFzcy5jcmVhdGUoQWJzdHJhY3QuVGltZWRPYnNlcnZlciwgew0KCWdldFZhbHVlOiBmdW5jdGlvbigpIHsNCgkJcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5oYXNoOw0KCX0NCn0gKTsNCg0KDQp2YXIgQ0F1dG9TaXppbmdUZXh0QXJlYSA9IENsYXNzLmNyZWF0ZSggew0KCW1fZWxUZXh0QXJlYTogbnVsbCwNCgltX25NaW5IZWlnaHQ6IDIwLA0KCW1fbk1heEhlaWdodDogNTAwLA0KCW1fY0N1cnJlbnRTaXplOiBOdW1iZXIuTUFYX1ZBTFVFLA0KCW1fZm5DaGFuZ2VDYWxsYmFjazogbnVsbCwNCgltX25UZXh0QXJlYVBhZGRpbmc6IG51bGwsDQoNCglpbml0aWFsaXplOiBmdW5jdGlvbiggZWxUZXh0QXJlYSwgbk1pbkhlaWdodCwgZm5DaGFuZ2VDYWxsYmFjayApDQoJew0KCQl0aGlzLm1fZWxUZXh0QXJlYSA9IGVsVGV4dEFyZWE7DQoJCXZhciBfdGhpcyA9IHRoaXM7DQoJCSRKKHRoaXMubV9lbFRleHRBcmVhICkub24oICdrZXl1cCBibHVyIGNsaWNrIHBhc3RlIGN1dCcsIGZ1bmN0aW9uKCBlICkgew0KCQkJaWYgKCBlLnR5cGUgPT0gJ3Bhc3RlJyB8fCBlLnR5cGUgPT0gJ2JsdXInICkNCgkJCQlfdGhpcy5PblBhc3RlVGV4dCgpOw0KCQkJZWxzZQ0KCQkJCV90aGlzLk9uVGV4dElucHV0KCk7DQoJCX0pOw0KCQl0aGlzLm1fZWxUZXh0QXJlYS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOw0KDQoJCXRoaXMubV9jRW50cnlMZW5ndGggPSBOdW1iZXIuTUFYX1ZBTFVFOw0KCQl0aGlzLm1fbk1pbkhlaWdodCA9IG5NaW5IZWlnaHQgfHwgMjA7DQoJCXRoaXMubV9mbkNoYW5nZUNhbGxiYWNrID0gZm5DaGFuZ2VDYWxsYmFjayB8fCBudWxsOw0KDQoJCXRoaXMubV9lbFRleHRBcmVhLnN0eWxlLmhlaWdodCA9IHRoaXMubV9uTWluSGVpZ2h0ICsgJ3B4JzsNCg0KCQl0aGlzLk9uVGV4dElucHV0KCk7DQoJfSwNCg0KCUNhbGN1bGF0ZVBhZGRpbmc6IGZ1bmN0aW9uKCkNCgl7DQoJCS8vIGJyaWVmbHkgZW1wdHkgdGhlIHRleHQgYXJlYSBhbmQgc2V0IHRoZSBoZWlnaHQgc28gd2UgY2FuIHNlZSBob3cgbXVjaCBwYWRkaW5nIHRoZXJlIGlzDQoJCXZhciBzdHJDb250ZW50cyA9IHRoaXMubV9lbFRleHRBcmVhLnZhbHVlOw0KCQl0aGlzLm1fZWxUZXh0QXJlYS52YWx1ZSA9ICcnOw0KCQl0aGlzLm1fZWxUZXh0QXJlYS5zdHlsZS5oZWlnaHQgPSB0aGlzLm1fbk1pbkhlaWdodCArICdweCc7DQoJCXRoaXMubV9uVGV4dEFyZWFQYWRkaW5nID0gdGhpcy5tX2VsVGV4dEFyZWEuc2Nyb2xsSGVpZ2h0IC0gdGhpcy5tX25NaW5IZWlnaHQ7DQoJCXRoaXMubV9lbFRleHRBcmVhLnZhbHVlID0gc3RyQ29udGVudHM7DQoJfSwNCg0KCU9uUGFzdGVUZXh0OiBmdW5jdGlvbigpDQoJew0KCQl0aGlzLk9uVGV4dElucHV0LmJpbmQoIHRoaXMgKS5kZWZlcigpOw0KCX0sDQoNCglPblRleHRJbnB1dDogZnVuY3Rpb24oKQ0KCXsNCgkJdmFyIGlTY3JvbGxPZmZzZXQgPSB1bmRlZmluZWQ7DQoJCXZhciBjTmV3TGVuZ3RoID0gdGhpcy5tX2VsVGV4dEFyZWEudmFsdWUubGVuZ3RoOw0KDQoJCS8vIHdlIGRlbGF5IHRoaXMgdW50aWwgZmlyc3QgaW5wdXQgYXMgc29tZSB2YWx1ZXMgZ2V0IHJlcG9ydGVkIGluY29ycmVjdGx5IGlmIHRoZSBlbGVtZW50IGlzbid0IHZpc2libGUuDQoJCWlmICggdGhpcy5tX25UZXh0QXJlYVBhZGRpbmcgPT09IG51bGwgJiYgJEoodGhpcy5tX2VsVGV4dEFyZWEgKS5pcygnOnZpc2libGUnKSApDQoJCQl0aGlzLkNhbGN1bGF0ZVBhZGRpbmcoKTsNCg0KCQkvLyBmb3JjZSBhIHJlc2l6ZQ0KCQlpZiAoIGNOZXdMZW5ndGggPCB0aGlzLm1fY0VudHJ5TGVuZ3RoICkNCgkJew0KCQkJLy8gd2hlbiB3ZSBzaHJpbmsgdGhpcyBib3gsIHdlIG1pZ2h0IHNjcm9sbCB0aGUgd2luZG93LiAgUmVtZW1iZXIgd2hlcmUgd2UgYXJlIHNvIHdlIGNhbiBqdW1wIGJhY2sNCgkJCWlTY3JvbGxPZmZzZXQgPSB3aW5kb3cuc2Nyb2xsWTsNCgkJCXRoaXMubV9lbFRleHRBcmVhLnN0eWxlLmhlaWdodCA9IHRoaXMubV9uTWluSGVpZ2h0ICsgJ3B4JzsNCgkJfQ0KDQoJCWlmICggdGhpcy5tX2VsVGV4dEFyZWEuc2Nyb2xsSGVpZ2h0ID4gdGhpcy5tX25NYXhIZWlnaHQgKQ0KCQl7DQoJCQl0aGlzLm1fZWxUZXh0QXJlYS5zdHlsZS5oZWlnaHQgPSB0aGlzLm1fbk1heEhlaWdodCArICdweCc7DQoJCQl0aGlzLm1fZWxUZXh0QXJlYS5zdHlsZS5vdmVyZmxvdyA9ICdhdXRvJzsNCgkJfQ0KCQllbHNlIGlmICggdGhpcy5tX2VsVGV4dEFyZWEuc2Nyb2xsSGVpZ2h0ICE9IHRoaXMubV9lbFRleHRBcmVhLmdldEhlaWdodCgpICkNCgkJew0KCQkJdmFyIG5IZWlnaHQgPSBNYXRoLm1heCggdGhpcy5tX2VsVGV4dEFyZWEuc2Nyb2xsSGVpZ2h0LCB0aGlzLm1fbk1pbkhlaWdodCApOw0KCQkJdGhpcy5tX2VsVGV4dEFyZWEuc3R5bGUuaGVpZ2h0ID0gKCBuSGVpZ2h0IC0gdGhpcy5tX25UZXh0QXJlYVBhZGRpbmcgKSArICdweCc7DQoNCgkJCWlmICggdGhpcy5tX2VsVGV4dEFyZWEuc3R5bGUub3ZlcmZsb3cgPT0gJ2F1dG8nICkNCgkJCQl0aGlzLm1fZWxUZXh0QXJlYS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOw0KCQl9DQoNCgkJaWYgKCB0aGlzLm1fZm5DaGFuZ2VDYWxsYmFjayApDQoJCQl0aGlzLm1fZm5DaGFuZ2VDYWxsYmFjayggdGhpcy5tX2VsVGV4dEFyZWEgKTsNCg0KCQlpZiAoIGlTY3JvbGxPZmZzZXQgKQ0KCQkJd2luZG93LnNjcm9sbFRvKCB3aW5kb3cuc2Nyb2xsWCwgaVNjcm9sbE9mZnNldCApOw0KDQoJCXRoaXMubV9jRW50cnlMZW5ndGggPSBjTmV3TGVuZ3RoOw0KCX0NCn0pOw0KDQoNCg0KDQoNCmZ1bmN0aW9uIFVwZGF0ZVBhcmFtZXRlckluQ3VycmVudFVSTCggc3RyUGFyYW1OYW1lLCBzdHJQYXJhbVZhbHVlLCByZ1JlbW92ZVBhcmFtZXRlcnMgKQ0Kew0KCXZhciBwYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lOw0KCXZhciBxdWVyeSA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2g7DQoJdmFyIHBhcmFtcyA9IHt9Ow0KCWlmICggcXVlcnkgJiYgcXVlcnkubGVuZ3RoID4gMiApDQoJCXBhcmFtcyA9ICRKLmRlcGFyYW0oIHF1ZXJ5LnN1YnN0ciggMSApICk7DQoNCglpZiAoIHN0clBhcmFtVmFsdWUgPT09IG51bGwgKQ0KCQlkZWxldGUgcGFyYW1zW3N0clBhcmFtTmFtZV07DQoJZWxzZQ0KCQlwYXJhbXNbc3RyUGFyYW1OYW1lXSA9IHN0clBhcmFtVmFsdWU7DQoNCgkvLyBjb21tZW50IHRocmVhZCBzcGVjaWZpYw0KCWlmICggcmdSZW1vdmVQYXJhbWV0ZXJzICkNCgkJZm9yKCB2YXIgaSA9IDA7IGkgPCByZ1JlbW92ZVBhcmFtZXRlcnMubGVuZ3RoOyBpKysgKQ0KCQkJZGVsZXRlIHBhcmFtc1sgcmdSZW1vdmVQYXJhbWV0ZXJzW2ldIF07DQoNCglxdWVyeSA9ICRKLnBhcmFtKCBwYXJhbXMgKTsNCg0KCXJldHVybiBwYXRoICsgKCBxdWVyeSA/ICc/JyArIHF1ZXJ5IDogJycgKTsNCn0NCg0KDQp2YXIgZ19yZ0NvbW1lbnRUaHJlYWRzID0ge307DQpmdW5jdGlvbiBJbml0aWFsaXplQ29tbWVudFRocmVhZCggdHlwZSwgbmFtZSwgcmdDb21tZW50RGF0YSwgdXJsLCBuUXVvdGVCb3hIZWlnaHQgKQ0Kew0KCS8vIHNlZSBpZiB3ZSBoYXZlIGEgY3VzdG9tIGNvbW1lbnQgdGhyZWFkIGNsYXNzIGZvciB0aGlzIHR5cGUNCgl2YXIgY29tbWVudGNsYXNzID0gQ0NvbW1lbnRUaHJlYWQ7DQoJaWYgKCB3aW5kb3dbJ0NDb21tZW50VGhyZWFkJyArIHR5cGVdICkNCgkJY29tbWVudGNsYXNzID0gd2luZG93WydDQ29tbWVudFRocmVhZCcgKyB0eXBlXTsNCg0KCWdfcmdDb21tZW50VGhyZWFkc1tuYW1lXSA9IG5ldyBjb21tZW50Y2xhc3MoIHR5cGUsIG5hbWUsIHJnQ29tbWVudERhdGEsIHVybCwgblF1b3RlQm94SGVpZ2h0ICk7DQp9DQoNCmZ1bmN0aW9uIEJpbmRDb21tZW50VGhyZWFkU3Vic2NyaWJlQnV0dG9ucyggdHlwZSwgb3duZXIsIGdpZGZlYXR1cmUsIGdpZGZlYXR1cmUyLCBidG5TdWJzY3JpYmUsIGJ0blVuc3Vic2NyaWJlICkNCnsNCgl2YXIgQ29tbWVudFRocmVhZCA9IEZpbmRDb21tZW50VGhyZWFkKCB0eXBlLCBvd25lciwgZ2lkZmVhdHVyZSwgZ2lkZmVhdHVyZTIgKTsNCglpZiAoIENvbW1lbnRUaHJlYWQgKQ0KCQlDb21tZW50VGhyZWFkLkJpbmRTdWJzY3JpYmVCdXR0b25zKCBidG5TdWJzY3JpYmUsIGJ0blVuc3Vic2NyaWJlICk7DQp9DQoNCmZ1bmN0aW9uIEZpbmRDb21tZW50VGhyZWFkKCB0eXBlLCBvd25lciwgZ2lkRmVhdHVyZSwgZ2lkRmVhdHVyZTIgKQ0Kew0KCWZvciAoIHZhciBrZXkgaW4gZ19yZ0NvbW1lbnRUaHJlYWRzICkNCgl7DQoJCWlmICggZ19yZ0NvbW1lbnRUaHJlYWRzW2tleV0uQk1hdGNoZXMoIHR5cGUsIG93bmVyLCBnaWRGZWF0dXJlLCBnaWRGZWF0dXJlMiApICkNCgkJCXJldHVybiBnX3JnQ29tbWVudFRocmVhZHNba2V5XTsNCgl9DQoJcmV0dXJuIG51bGw7DQp9DQoNCnZhciBDQ29tbWVudFRocmVhZCA9IENsYXNzLmNyZWF0ZSggew0KDQoJbV9zdHJOYW1lOiBudWxsLA0KCW1fc3RyQ29tbWVudFRocmVhZFR5cGU6IG51bGwsDQoJbV9yZ0NvbW1lbnREYXRhOiBudWxsLA0KCW1fc3RyQWN0aW9uVVJMOiBudWxsLA0KCW1fZWxUZXh0QXJlYTogbnVsbCwNCgltX2NQYWdlU2l6ZTogbnVsbCwNCgltX25RdW90ZUJveEhlaWdodDogNDAsDQoNCgltX2NUb3RhbENvdW50OiAwLA0KCW1faUN1cnJlbnRQYWdlOiAwLA0KCW1fY01heFBhZ2VzOiAwLA0KCW1fY0Ryb3Bkb3duUGFnZXM6IDAsDQoJbV9iTG9hZGluZzogZmFsc2UsDQoJbV9iTG9hZGluZ1VzZXJIYXNVcFZvdGVkIDogZmFsc2UsDQoJbV9jVXBWb3RlczogMCwNCg0KCW1fYkluY2x1ZGVSYXc6IGZhbHNlLA0KCW1fcmdSYXdDb21tZW50Q2FjaGU6IG51bGwsDQoJbV9iSGFzUGFnaW5nOiB0cnVlLA0KCW1fYlRyYWNrTmF2aWdhdGlvbjogZmFsc2UsCS8vIHNob3VsZCB3ZSB0cmFjayBuYXZpZ2F0aW9uIGluIHRoZSBVUkw/DQoNCgkvLyB0aGVzZSB2YXJzIGFyZSBpZCdzIHdlJ2xsIHVwZGF0ZSB3aGVuIHZhbHVlcyBjaGFuZ2UNCgltX3ZvdGVjb3VudElEOiBudWxsLA0KCW1fdm90ZXVwSUQ6IG51bGwsDQoJbV9jb21tZW50Y291bnRJRDogbnVsbCwNCg0KCW1fb1RleHRBcmVhU2l6ZXI6IG51bGwsDQoNCgltX2JTdWJzY3JpYmVkOiBudWxsLA0KCW1fJFN1YnNjcmliZUNoZWNrYm94OiBudWxsLA0KDQoJaW5pdGlhbGl6ZTogZnVuY3Rpb24oIHR5cGUsIG5hbWUsIHJnQ29tbWVudERhdGEsIHVybCwgblF1b3RlQm94SGVpZ2h0ICkNCgl7DQoJCXRoaXMubV9zdHJOYW1lID0gbmFtZTsNCgkJdGhpcy5tX3N0ckNvbW1lbnRUaHJlYWRUeXBlID0gdHlwZTsNCgkJdGhpcy5tX3JnQ29tbWVudERhdGEgPSByZ0NvbW1lbnREYXRhOw0KCQl0aGlzLm1fc3RyQWN0aW9uVVJMID0gdXJsOw0KCQl0aGlzLm1fblF1b3RlQm94SGVpZ2h0ID0gblF1b3RlQm94SGVpZ2h0Ow0KDQoJCXZhciBzdGFydCA9IHJnQ29tbWVudERhdGFbJ3N0YXJ0J10gPyByZ0NvbW1lbnREYXRhWydzdGFydCddIDogMDsNCg0KCQl0aGlzLm1fY1RvdGFsQ291bnQgPSByZ0NvbW1lbnREYXRhWyd0b3RhbF9jb3VudCddOw0KCQl0aGlzLm1fY1BhZ2VTaXplID0gcmdDb21tZW50RGF0YVsncGFnZXNpemUnXTsNCgkJdGhpcy5tX2lDdXJyZW50UGFnZSA9IE1hdGguZmxvb3IoIHN0YXJ0IC8gdGhpcy5tX2NQYWdlU2l6ZSApOw0KCQl0aGlzLm1fY01heFBhZ2VzID0gTWF0aC5jZWlsKCB0aGlzLm1fY1RvdGFsQ291bnQgLyB0aGlzLm1fY1BhZ2VTaXplICk7DQoJCXRoaXMubV9iTG9hZGluZ1VzZXJIYXNVcFZvdGVkID0gcmdDb21tZW50RGF0YVsnaGFzX3Vwdm90ZWQnXTsNCgkJdGhpcy5tX2NVcFZvdGVzID0gcmdDb21tZW50RGF0YVsndXB2b3RlcyddOw0KCQl0aGlzLm1fdm90ZWNvdW50SUQgPSByZ0NvbW1lbnREYXRhWyd2b3RlY291bnRpZCddOw0KCQl0aGlzLm1fdm90ZXVwSUQgPSByZ0NvbW1lbnREYXRhWyd2b3RldXBpZCddOw0KCQl0aGlzLm1fY29tbWVudGNvdW50SUQgPSByZ0NvbW1lbnREYXRhWydjb21tZW50Y291bnRpZCddOw0KDQoJCXRoaXMubV9iU3Vic2NyaWJlZCA9IHJnQ29tbWVudERhdGFbJ3N1YnNjcmliZWQnXTsNCg0KCQl0aGlzLm1fYkhhc1BhZ2luZyA9ICFyZ0NvbW1lbnREYXRhWydub19wYWdpbmcnXTsNCgkJdGhpcy5tX2JUcmFja05hdmlnYXRpb24gPSAhIXJnQ29tbWVudERhdGFbJ3RyYWNrX25hdmlnYXRpb24nXTsNCg0KDQoJCXZhciBzdHJQcmVmaXggPSAnY29tbWVudHRocmVhZF8nICsgdGhpcy5tX3N0ck5hbWU7DQoJCXRoaXMubV9lbFRleHRBcmVhID0gJCggc3RyUHJlZml4ICsgJ190ZXh0YXJlYScpOw0KDQoJCWlmICggcmdDb21tZW50RGF0YVsnY29tbWVudHNfcmF3J10gKQ0KCQl7DQoJCQl0aGlzLm1fYkluY2x1ZGVSYXcgPSB0cnVlOw0KCQkJdGhpcy5tX3JnUmF3Q29tbWVudENhY2hlID0gcmdDb21tZW50RGF0YVsnY29tbWVudHNfcmF3J107DQoJCQlyZ0NvbW1lbnREYXRhWydjb21tZW50c19yYXcnXSA9IHVuZGVmaW5lZDsNCgkJfQ0KDQoJCWlmICggdGhpcy5tX2VsVGV4dEFyZWEgKQ0KCQl7DQoJCQl2YXIgZWxTYXZlQnV0dG9uID0gJCgnY29tbWVudHRocmVhZF8nICsgdGhpcy5tX3N0ck5hbWUgKyAnX3N1Ym1pdF9jb250YWluZXInKTsNCgkJCXZhciBpTWluSGVpZ2h0ID0gdGhpcy5tX25RdW90ZUJveEhlaWdodDsNCgkJCWlmICggdGhpcy5tX3N0ck5hbWUuc3RhcnRzV2l0aCggJ1Byb2ZpbGVfJyApICkNCgkJCQlpTWluSGVpZ2h0ID0gMjA7DQoNCgkJCXRoaXMubV9vVGV4dEFyZWFTaXplciA9IG5ldyBDQXV0b1NpemluZ1RleHRBcmVhKCB0aGlzLm1fZWxUZXh0QXJlYSwgaU1pbkhlaWdodCwgdGhpcy5PblRleHRJbnB1dC5iaW5kKCB0aGlzLCBlbFNhdmVCdXR0b24gKSApOw0KCQl9DQoNCgkJdmFyIF90aGlzID0gdGhpczsNCg0KCQlpZiAoIHRoaXMubV9iSGFzUGFnaW5nICkNCgkJew0KCQkJJChzdHJQcmVmaXggKyAnX3BhZ2VidG5fcHJldicpLm9ic2VydmUoICdjbGljaycsIHRoaXMuT25QYWdpbmdCdXR0b25DbGljay5iaW5kQXNFdmVudExpc3RlbmVyKCB0aGlzICwgdGhpcy5QcmV2UGFnZSApICApOw0KCQkJJChzdHJQcmVmaXggKyAnX2ZwYWdlYnRuX3ByZXYnKS5vYnNlcnZlKCAnY2xpY2snLCB0aGlzLk9uUGFnaW5nQnV0dG9uQ2xpY2suYmluZEFzRXZlbnRMaXN0ZW5lciggdGhpcyAsIHRoaXMuUHJldlBhZ2UgKSAgKTsNCgkJCSQoc3RyUHJlZml4ICsgJ19wYWdlYnRuX25leHQnKS5vYnNlcnZlKCAnY2xpY2snLCB0aGlzLk9uUGFnaW5nQnV0dG9uQ2xpY2suYmluZEFzRXZlbnRMaXN0ZW5lciggdGhpcyAsIHRoaXMuTmV4dFBhZ2UgKSApOw0KCQkJJChzdHJQcmVmaXggKyAnX2ZwYWdlYnRuX25leHQnKS5vYnNlcnZlKCAnY2xpY2snLCB0aGlzLk9uUGFnaW5nQnV0dG9uQ2xpY2suYmluZEFzRXZlbnRMaXN0ZW5lciggdGhpcyAsIHRoaXMuTmV4dFBhZ2UgKSApOw0KDQoJCQlpZiAoIHRoaXMubV9iVHJhY2tOYXZpZ2F0aW9uICYmIHdpbmRvdy5oaXN0b3J5ICYmIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSApDQoJCQl7DQoJCQkJd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKCB7Y29tbWVudF90aHJlYWRfcGFnZTogdGhpcy5tX2lDdXJyZW50UGFnZSB9LCAnJyApOw0KDQoJCQkJJEood2luZG93KS5vbigncG9wc3RhdGUnLCBmdW5jdGlvbiggZSApIHsNCgkJCQkJdmFyIG9TdGF0ZSA9IGUub3JpZ2luYWxFdmVudC5zdGF0ZTsNCg0KCQkJCQlpZiAoIG9TdGF0ZSAmJiB0eXBlb2Ygb1N0YXRlLmNvbW1lbnRfdGhyZWFkX3BhZ2UgIT0gJ3VuZGVmaW5lZCcgKQ0KCQkJCQkJX3RoaXMuR29Ub1BhZ2UoIG9TdGF0ZS5jb21tZW50X3RocmVhZF9wYWdlICk7DQoJCQkJfSk7DQoJCQl9DQoJCX0NCg0KCQl2YXIgZWxGb3JtID0gJCggc3RyUHJlZml4ICsgJ19mb3JtJyk7DQoJCWlmICggZWxGb3JtICkNCgkJew0KCQkJZWxGb3JtLm9ic2VydmUoICdzdWJtaXQnLCB0aGlzLk9uU3VibWl0LmJpbmQoIHRoaXMgKSApOw0KCQl9DQoNCgkJdmFyIGVsU3VibWl0ID0gJChzdHJQcmVmaXggKyAnX3N1Ym1pdCcpOw0KCQlpZiAoIGVsU3VibWl0ICkNCgkJew0KCQkJZWxTdWJtaXQub2JzZXJ2ZSggJ2NsaWNrJywgdGhpcy5PblN1Ym1pdC5iaW5kKCB0aGlzICkgKTsNCgkJfQ0KDQoJCXZhciBlbEF1dG9zdWJzY3JpYmUgPSAkKHN0clByZWZpeCArICdfYXV0b3N1YnNjcmliZScgKTsNCgkJaWYgKCBlbEF1dG9zdWJzY3JpYmUgKQ0KCQl7DQoJCQkvLyBpbml0aWFsaXplIGNoZWNrIHN0YXRlIGJhc2VkIG9uIHByZWZlcmVuY2VzDQoJCQllbEF1dG9zdWJzY3JpYmUuY2hlY2tlZCA9IHRoaXMubV9iU3Vic2NyaWJlZCB8fCBHZXRWYWx1ZUxvY2FsU3RvcmFnZSggJ2ZvcnVtX2F1dG9zdWJzY3JpYmUnLCBmYWxzZSApOw0KCQkJZWxBdXRvc3Vic2NyaWJlLm9ic2VydmUoICdjaGFuZ2UnLCB0aGlzLk9uQXV0b3N1YnNjcmliZVRvZ2dsZS5iaW5kKCB0aGlzICkgKTsNCgkJfQ0KDQoJCXZhciBlbFN1YnNjcmliZSA9ICQoc3RyUHJlZml4ICsgJ19zdWJzY3JpYmUnKTsNCgkJdmFyIGVsVW5zdWJzY3JpYmUgPSAkKHN0clByZWZpeCArICdfdW5zdWJzY3JpYmUnICk7DQoJCWlmICggZWxTdWJzY3JpYmUgJiYgZWxVbnN1YnNjcmliZSApDQoJCXsNCgkJCXRoaXMuQmluZFN1YnNjcmliZUJ1dHRvbnMoIGVsU3Vic2NyaWJlLCBlbFVuc3Vic2NyaWJlICk7DQoJCX0NCg0KCQl0aGlzLm1fJFN1YnNjcmliZUNoZWNrYm94ID0gJEooJyMnICsgc3RyUHJlZml4ICsgJ19zdWJzY3JpYmVfY2hlY2tib3gnKTsNCgkJdGhpcy5tXyRTdWJzY3JpYmVDaGVja2JveC5jbGljayggZnVuY3Rpb24oKSB7DQoJCQlpZiAoIF90aGlzLm1fJFN1YnNjcmliZUNoZWNrYm94Lmhhc0NsYXNzKCAnd2FpdGluZycgKSApDQoJCQkJcmV0dXJuOw0KDQoJCQlpZiAoIF90aGlzLm1fYlN1YnNjcmliZWQgKQ0KCQkJCV90aGlzLlVuc3Vic2NyaWJlKCBmdW5jdGlvbigpIHt9LCAgZnVuY3Rpb24oKSB7U2hvd0FsZXJ0RGlhbG9nKCdTdWJzY3JpYmUgdG8gdGhyZWFkJywgJ1RoZXJlIHdhcyBhIHByb2JsZW0gdXBkYXRpbmcgeW91ciBzdWJzY3JpcHRpb24uICBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicpO30pOw0KCQkJZWxzZQ0KCQkJCV90aGlzLlN1YnNjcmliZSggZnVuY3Rpb24oKSB7fSwgIGZ1bmN0aW9uKCkge1Nob3dBbGVydERpYWxvZygnU3Vic2NyaWJlIHRvIHRocmVhZCcsICdUaGVyZSB3YXMgYSBwcm9ibGVtIHVwZGF0aW5nIHlvdXIgc3Vic2NyaXB0aW9uLiAgUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nKTt9KTsNCgkJfSk7DQoNCgkJdGhpcy5VcGRhdGVQYWdpbmdEaXNwbGF5KCk7DQoJCXRoaXMuSGlnaGxpZ2h0Q29tbWVudCgpOw0KCX0sDQoNCglIaWdobGlnaHRDb21tZW50OiBmdW5jdGlvbigpDQoJew0KCQl2YXIgdXJsUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyggd2luZG93LmxvY2F0aW9uLnNlYXJjaCApOw0KCQl2YXIgZ2lkQ29tbWVudCA9IHVybFBhcmFtcy5nZXQoICdnaWRjb21tZW50aGlnaGxpZ2h0JyApOw0KCQlpZiAoIGdpZENvbW1lbnQgKQ0KCQl7DQoJCQkkSiggIiNjb21tZW50XyIgKyBnaWRDb21tZW50ICkuYWRkQ2xhc3MoICdoaWdobGlnaHRlZCcgKTsNCgkJCXNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgeyAkSiggIiNjb21tZW50XyIgKyBnaWRDb21tZW50IClbMF0uc2Nyb2xsSW50b1ZpZXcoKTsgfSw1MDAgKTsNCgkJfQ0KCX0sDQoNCglCTWF0Y2hlczogZnVuY3Rpb24oIHN0clR5cGUsIHN0ZWFtaWRPd25lciwgZ2lkRmVhdHVyZSwgZ2lkRmVhdHVyZTIgKQ0KCXsNCgkJcmV0dXJuIHRoaXMubV9zdHJDb21tZW50VGhyZWFkVHlwZSA9PSBzdHJUeXBlICYmIHRoaXMubV9yZ0NvbW1lbnREYXRhWydvd25lciddID09IHN0ZWFtaWRPd25lciAmJg0KCQkJdGhpcy5tX3JnQ29tbWVudERhdGFbJ2ZlYXR1cmUnXSA9PSBnaWRGZWF0dXJlICYmIHRoaXMubV9yZ0NvbW1lbnREYXRhWydmZWF0dXJlMiddID09IGdpZEZlYXR1cmUyOw0KCX0sDQoNCglDaGVja1RleHRBcmVhU2l6ZTogZnVuY3Rpb24oKQ0KCXsNCgkJdGhpcy5tX29UZXh0QXJlYVNpemVyLk9uVGV4dElucHV0KCk7DQoJfSwNCg0KCU9uVGV4dElucHV0OiBmdW5jdGlvbiggZWxTYXZlQnV0dG9uLCBlbFRleHRBcmVhICkNCgl7DQoJCWlmICggZWxTYXZlQnV0dG9uICkNCgkJew0KCQkJdmFyIHN0clByZXBvdWxhdGVkVGV4dCA9ICRKKHRoaXMubV9lbFRleHRBcmVhICkuZGF0YSgncHJlcG9wdWxhdGVkLXRleHQnKTsNCgkJCXZhciBiRW50ZXJlZFRleHQgPSBlbFRleHRBcmVhLnZhbHVlLmxlbmd0aCA+IDA7DQoNCgkJCWlmICggYkVudGVyZWRUZXh0ICYmIHN0clByZXBvdWxhdGVkVGV4dCAmJiAhJEoodGhpcy5tX2VsVGV4dEFyZWEgKS5kYXRhKCdyZXBsYWNlZC1wcmVwb3B1bGF0ZWQtdGV4dCcpICkNCgkJCXsNCgkJCQlzdHJQcmVwb3VsYXRlZFRleHQgPSB2X3RyaW0oIHN0clByZXBvdWxhdGVkVGV4dCApLnJlcGxhY2UoIC9bXG5ccl0vZywgJycgKTsNCgkJCQl2YXIgc3RyRW50ZXJlZFRleHQgPSB2X3RyaW0oIGVsVGV4dEFyZWEudmFsdWUgKS5yZXBsYWNlKCAvW1xuXHJdL2csICcnICk7DQoNCgkJCQliRW50ZXJlZFRleHQgPSBzdHJQcmVwb3VsYXRlZFRleHQgIT0gc3RyRW50ZXJlZFRleHQ7DQoNCgkJCQkvLyBzYXZlIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBkb2luZyB0aGlzIGNoZWNrIGFzIHRoZXkgZW50ZXIgbW9yZSB0ZXh0Lg0KCQkJCWlmICggYkVudGVyZWRUZXh0ICkNCgkJCQkJJEoodGhpcy5tX2VsVGV4dEFyZWEgKS5kYXRhKCdyZXBsYWNlZC1wcmVwb3B1bGF0ZWQtdGV4dCcsIHRydWUgKTsNCgkJCX0NCg0KCQkJaWYgKCBiRW50ZXJlZFRleHQgKQ0KCQkJCWVsU2F2ZUJ1dHRvbi5zaG93KCk7DQoJCQllbHNlDQoJCQkJZWxTYXZlQnV0dG9uLmhpZGUoKTsNCgkJfQ0KCX0sDQoNCglHZXRBY3Rpb25VUkw6IGZ1bmN0aW9uKCBhY3Rpb24gKQ0KCXsNCgkJdmFyIHVybCA9IHRoaXMubV9zdHJBY3Rpb25VUkwgKyBhY3Rpb24gKyAnLyc7DQoJCXVybCArPSB0aGlzLm1fcmdDb21tZW50RGF0YVsnb3duZXInXSArICcvJzsNCgkJdXJsICs9IHRoaXMubV9yZ0NvbW1lbnREYXRhWydmZWF0dXJlJ10gKyAnLyc7DQoJCXJldHVybiB1cmw7DQoJfSwNCg0KCVBhcmFtZXRlcnNXaXRoRGVmYXVsdHM6IGZ1bmN0aW9uKCBwYXJhbXMgKQ0KCXsNCgkJaWYgKCAhcGFyYW1zICkNCgkJCXBhcmFtcyA9IHt9Ow0KDQoJCXBhcmFtc1snY291bnQnXSA9IHRoaXMubV9jUGFnZVNpemU7DQoJCXBhcmFtc1snc2Vzc2lvbmlkJ10gPSBnX3Nlc3Npb25JRDsNCg0KCQlpZiAoIHRoaXMubV9yZ0NvbW1lbnREYXRhWydleHRlbmRlZF9kYXRhJ10gKQ0KCQkJcGFyYW1zWydleHRlbmRlZF9kYXRhJ10gPSB0aGlzLm1fcmdDb21tZW50RGF0YVsnZXh0ZW5kZWRfZGF0YSddOw0KDQoJCWlmICggdGhpcy5tX3JnQ29tbWVudERhdGFbJ2ZlYXR1cmUyJ10gKQ0KCQkJcGFyYW1zWydmZWF0dXJlMiddID0gdGhpcy5tX3JnQ29tbWVudERhdGFbJ2ZlYXR1cmUyJ107DQoNCgkJaWYgKCB0aGlzLm1fcmdDb21tZW50RGF0YVsnb2xkZXN0Zmlyc3QnXSApDQoJCQlwYXJhbXNbJ29sZGVzdGZpcnN0J10gPSB0cnVlOw0KDQoJCWlmICggdGhpcy5tX3JnQ29tbWVudERhdGFbJ25ld2VzdGZpcnN0cGFnaW5hdGlvbiddICkNCgkJCXBhcmFtc1snbmV3ZXN0Zmlyc3RwYWdpbmF0aW9uJ10gPSB0cnVlOw0KDQoJCWlmICggdGhpcy5tX3JnQ29tbWVudERhdGFbJ2xhc3R2aXNpdCddICkNCgkJCXBhcmFtc1snbGFzdHZpc2l0J10gPSB0aGlzLm1fcmdDb21tZW50RGF0YVsnbGFzdHZpc2l0J107DQoNCgkJaWYgKCB0aGlzLm1fYkluY2x1ZGVSYXcgKQ0KCQkJcGFyYW1zWydpbmNsdWRlX3JhdyddID0gdHJ1ZTsNCg0KDQoJCXJldHVybiBwYXJhbXM7DQoJfSwNCg0KCU9uU3VibWl0OiBmdW5jdGlvbigpDQoJew0KCQlpZiAoIHRoaXMubV9iTG9hZGluZyApDQoJCQlyZXR1cm47DQoNCgkJdmFyIHN0clByZXBvdWxhdGVkVGV4dCA9ICRKKHRoaXMubV9lbFRleHRBcmVhICkuZGF0YSgncHJlcG9wdWxhdGVkLXRleHQnKTsNCgkJaWYgKCBzdHJQcmVwb3VsYXRlZFRleHQgJiYgdl90cmltKCBzdHJQcmVwb3VsYXRlZFRleHQgKS5yZXBsYWNlKCAvW1xuXHJdL2csICcnICkgPT0gdl90cmltKCB0aGlzLm1fZWxUZXh0QXJlYS52YWx1ZSApLnJlcGxhY2UoIC9bXG5ccl0vZywgJycgKSApDQoJCXsNCgkJCVNob3dBbGVydERpYWxvZyggJycsICdQbGVhc2UgZW50ZXIgYSBjb21tZW50IHRvIHBvc3QuJyApOw0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJdmFyIHBhcmFtcyA9IHRoaXMuUGFyYW1ldGVyc1dpdGhEZWZhdWx0cyggew0KCQkJY29tbWVudDogdGhpcy5tX2VsVGV4dEFyZWEudmFsdWUNCgkJfSApOw0KDQoJCXRoaXMubV9iTG9hZGluZyA9IHRydWU7DQoJCW5ldyBBamF4LlJlcXVlc3QoIHRoaXMuR2V0QWN0aW9uVVJMKCAncG9zdCcgKSwgew0KCQkJbWV0aG9kOiAncG9zdCcsDQoJCQlwYXJhbWV0ZXJzOiBwYXJhbXMsDQoJCQlvblN1Y2Nlc3M6IHRoaXMuT25SZXNwb25zZUFkZENvbW1lbnQuYmluZCggdGhpcywgKyt0aGlzLm1fblJlbmRlckFqYXhTZXF1ZW5jZU51bWJlciApLA0KCQkJb25GYWlsdXJlOiB0aGlzLk9uRmFpbHVyZURpc3BsYXlFcnJvci5iaW5kKCB0aGlzICksDQoJCQlvbkNvbXBsZXRlOiB0aGlzLk9uQUpBWENvbXBsZXRlLmJpbmQoIHRoaXMgKQ0KCQl9ICk7DQoNCgkJdmFyIGVsQXV0b3N1YnNjcmliZSA9ICQoICdjb21tZW50dGhyZWFkXycgKyB0aGlzLm1fc3RyTmFtZSArICdfYXV0b3N1YnNjcmliZScgKTsNCgkJaWYgKCBlbEF1dG9zdWJzY3JpYmUgJiYgZWxBdXRvc3Vic2NyaWJlLmNoZWNrZWQgJiYgIXRoaXMubV9iU3Vic2NyaWJlZCApDQoJCQl0aGlzLlN1YnNjcmliZSgpOw0KDQoJCXJldHVybiBmYWxzZTsNCgl9LA0KDQoJRGVsZXRlQ29tbWVudDogZnVuY3Rpb24oIGdpZENvbW1lbnQsIGJVbmRlbGV0ZSwgZm5PblN1Y2Nlc3MgKQ0KCXsNCgkJaWYgKCB0aGlzLm1fYkxvYWRpbmcgKQ0KCQkJcmV0dXJuOw0KDQoJCXZhciBwYXJhbXMgPSB0aGlzLlBhcmFtZXRlcnNXaXRoRGVmYXVsdHMoIHsNCgkJCWdpZGNvbW1lbnQ6IGdpZENvbW1lbnQsDQoJCQlzdGFydDogdGhpcy5tX2NQYWdlU2l6ZSAqIHRoaXMubV9pQ3VycmVudFBhZ2UNCgkJfSApOw0KDQoJCWlmICggYlVuZGVsZXRlICkNCgkJCXBhcmFtcy51bmRlbGV0ZSA9IDE7DQoNCgkJdGhpcy5tX2JMb2FkaW5nID0gdHJ1ZTsNCgkJbmV3IEFqYXguUmVxdWVzdCggdGhpcy5HZXRBY3Rpb25VUkwoICdkZWxldGUnICksIHsNCgkJCW1ldGhvZDogJ3Bvc3QnLA0KCQkJcGFyYW1ldGVyczogcGFyYW1zLA0KCQkJb25TdWNjZXNzOiBmbk9uU3VjY2VzcyA/IGZuT25TdWNjZXNzIDogdGhpcy5PblJlc3BvbnNlRGVsZXRlQ29tbWVudC5iaW5kKCB0aGlzLCArK3RoaXMubV9uUmVuZGVyQWpheFNlcXVlbmNlTnVtYmVyICksDQoJCQlvbkZhaWx1cmU6IHRoaXMuT25GYWlsdXJlRGlzcGxheUVycm9yLmJpbmQoIHRoaXMgKSwNCgkJCW9uQ29tcGxldGU6IHRoaXMuT25BSkFYQ29tcGxldGUuYmluZCggdGhpcyApDQoJCX0gKTsNCgl9LA0KDQoJTWFya1NwYW06IGZ1bmN0aW9uKCBnaWRDb21tZW50LCBhdXRob3JBY2NvdW50SUQsIGZuT25TdWNjZXNzICkNCgl7DQoJCWlmICggdGhpcy5tX2JMb2FkaW5nICkNCgkJCXJldHVybjsNCg0KCQl2YXIgcGFyYW1zID0gdGhpcy5QYXJhbWV0ZXJzV2l0aERlZmF1bHRzKCB7DQoJCQlnaWRjb21tZW50OiBnaWRDb21tZW50LA0KCQkJYXV0aG9yX2FjY291bnRpZDogYXV0aG9yQWNjb3VudElELA0KCQkJc3RhcnQ6IHRoaXMubV9jUGFnZVNpemUgKiB0aGlzLm1faUN1cnJlbnRQYWdlDQoJCX0gKTsNCg0KCQl2YXIgdGhyZWFkID0gdGhpczsNCg0KCQl2YXIgZGlhbG9nID0gU2hvd0NvbmZpcm1EaWFsb2coICdNYXJrIFN1c3BpY2lvdXMnLCAnVGhpcyB3aWxsIGdpdmUgYSBjb21tdW5pdHkgYmFuIHRvIHRoZSBhdXRob3IsIGFkZCB0aGlzIGNvbW1lbnQgYXMgdHJhaW5pbmcgZGF0YSBzbyB3ZSBjYW4gZmxhZyB0aGVzZSBraW5kcyBvZiBjb21tZW50cyBhdXRvbWF0aWNhbGx5LCBhbmQgY2xlYXIgb3V0IGFsbCB0aGUgYXV0aG9yXCdzIGNvbW1lbnRzLiAgQXJlIHlvdSBzdXJlIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbz8nLCAnTWFyayBTdXNwaWNpb3VzJyApOw0KCQlkaWFsb2cuZG9uZSggZnVuY3Rpb24oKSB7DQoJCQl0aHJlYWQubV9iTG9hZGluZyA9IHRydWU7DQoJCQluZXcgQWpheC5SZXF1ZXN0KCB0aHJlYWQuR2V0QWN0aW9uVVJMKCAnbWFya3NwYW0nICksIHsNCgkJCQltZXRob2Q6ICdwb3N0JywNCgkJCQlwYXJhbWV0ZXJzOiBwYXJhbXMsDQoJCQkJb25TdWNjZXNzOiBmbk9uU3VjY2VzcyA/IGZuT25TdWNjZXNzIDogdGhyZWFkLk9uUmVzcG9uc2VEZWxldGVDb21tZW50LmJpbmQoIHRocmVhZCwgKyt0aHJlYWQubV9uUmVuZGVyQWpheFNlcXVlbmNlTnVtYmVyICksDQoJCQkJb25GYWlsdXJlOiB0aHJlYWQuT25GYWlsdXJlRGlzcGxheUVycm9yLmJpbmQoIHRocmVhZCApLA0KCQkJCW9uQ29tcGxldGU6IHRocmVhZC5PbkFKQVhDb21wbGV0ZS5iaW5kKCB0aHJlYWQgKQ0KCQkJfSApOw0KCQl9ICk7DQoJfSwNCg0KCUNsZWFyQ29udGVudENoZWNrRmxhZzogZnVuY3Rpb24oIGdpZENvbW1lbnQsIGZuT25TdWNjZXNzICkNCgl7DQoJCWlmICggdGhpcy5tX2JMb2FkaW5nICkNCgkJCXJldHVybjsNCg0KCQl2YXIgcGFyYW1zID0gdGhpcy5QYXJhbWV0ZXJzV2l0aERlZmF1bHRzKCB7DQoJCQlnaWRjb21tZW50OiBnaWRDb21tZW50LA0KCQkJc3RhcnQ6IHRoaXMubV9jUGFnZVNpemUgKiB0aGlzLm1faUN1cnJlbnRQYWdlDQoJCX0gKTsNCg0KCQl2YXIgdGhyZWFkID0gdGhpczsNCg0KCQl2YXIgZGlhbG9nID0gU2hvd0NvbmZpcm1EaWFsb2coICdDbGVhciBCYW5uYWJsZSBDb250ZW50IEZsYWcnLCAnVGhpcyB3aWxsIGNsZWFyIHRoZSBiYW5uYWJsZSBjb250ZW50IGNoZWNrIGZsYWcgb24gdGhpcyBjb21tZW50IGFuZCBjYW5ub3QgYmUgdW5kb25lLiBBcmUgeW91IHN1cmUgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvPycsICdDbGVhciBCYW5uYWJsZSBDb250ZW50IEZsYWcnICk7DQoJCWRpYWxvZy5kb25lKCBmdW5jdGlvbigpIHsNCgkJCXRocmVhZC5tX2JMb2FkaW5nID0gdHJ1ZTsNCgkJCW5ldyBBamF4LlJlcXVlc3QoIHRocmVhZC5HZXRBY3Rpb25VUkwoICdjbGVhcmNvbnRlbnRjaGVja2ZsYWcnICksIHsNCgkJCQltZXRob2Q6ICdwb3N0JywNCgkJCQlwYXJhbWV0ZXJzOiBwYXJhbXMsDQoJCQkJb25TdWNjZXNzOiBmbk9uU3VjY2VzcyA/IGZuT25TdWNjZXNzIDogdGhyZWFkLk9uUmVzcG9uc2VEZWxldGVDb21tZW50LmJpbmQoIHRocmVhZCwgKyt0aHJlYWQubV9uUmVuZGVyQWpheFNlcXVlbmNlTnVtYmVyICksDQoJCQkJb25GYWlsdXJlOiB0aHJlYWQuT25GYWlsdXJlRGlzcGxheUVycm9yLmJpbmQoIHRocmVhZCApLA0KCQkJCW9uQ29tcGxldGU6IHRocmVhZC5PbkFKQVhDb21wbGV0ZS5iaW5kKCB0aHJlYWQgKQ0KCQkJfSApOw0KCQl9ICk7DQoJfSwNCg0KCUhpZGVBbmRSZXBvcnQ6IGZ1bmN0aW9uKCBnaWRDb21tZW50LCBiSGlkZSwgZm5PblN1Y2Nlc3MgKQ0KCXsNCgkJaWYgKCB0aGlzLm1fYkxvYWRpbmcgKQ0KCQkJcmV0dXJuOw0KDQoJCXZhciBwYXJhbXMgPSB0aGlzLlBhcmFtZXRlcnNXaXRoRGVmYXVsdHMoIHsNCgkJCWdpZGNvbW1lbnQ6IGdpZENvbW1lbnQsDQoJCQloaWRlOiBiSGlkZSwNCgkJCXN0YXJ0OiB0aGlzLm1fY1BhZ2VTaXplICogdGhpcy5tX2lDdXJyZW50UGFnZQ0KCQl9ICk7DQoNCgkJdGhpcy5tX2JMb2FkaW5nID0gdHJ1ZTsNCgkJbmV3IEFqYXguUmVxdWVzdCggdGhpcy5HZXRBY3Rpb25VUkwoICdoaWRlYW5kcmVwb3J0JyApLCB7DQoJCQltZXRob2Q6ICdwb3N0JywNCgkJCXBhcmFtZXRlcnM6IHBhcmFtcywNCgkJCW9uU3VjY2VzczogZm5PblN1Y2Nlc3MgPyBmbk9uU3VjY2VzcyA6IHRoaXMuT25SZXNwb25zZUhpZGVBbmRSZXBvcnRDb21tZW50LmJpbmQoIHRoaXMsICsrdGhpcy5tX25SZW5kZXJBamF4U2VxdWVuY2VOdW1iZXIgKSwNCgkJCW9uRmFpbHVyZTogdGhpcy5PbkZhaWx1cmVEaXNwbGF5RXJyb3IuYmluZCggdGhpcyApLA0KCQkJb25Db21wbGV0ZTogdGhpcy5PbkFKQVhDb21wbGV0ZS5iaW5kKCB0aGlzICkNCgkJfSApOw0KCX0sDQoNCglPblJlc3BvbnNlSGlkZUFuZFJlcG9ydENvbW1lbnQ6IGZ1bmN0aW9uKCBuQWpheFNlcXVlbmNlTnVtYmVyLCB0cmFuc3BvcnQgKQ0KCXsNCgkJaWYgKCB0cmFuc3BvcnQucmVzcG9uc2VKU09OICYmIHRyYW5zcG9ydC5yZXNwb25zZUpTT04uc3VjY2VzcyApDQoJCQl0aGlzLk9uUmVzcG9uc2VSZW5kZXJDb21tZW50cyggQ0NvbW1lbnRUaHJlYWQuUkVOREVSX0dPVE9DT01NRU5ULCBuQWpheFNlcXVlbmNlTnVtYmVyLCB0cmFuc3BvcnQgKTsNCgkJZWxzZQ0KCQkJdGhpcy5PbkZhaWx1cmVEaXNwbGF5RXJyb3IoIHRyYW5zcG9ydCApOw0KCX0sDQoNCglEaXNwbGF5RWRpdENvbW1lbnQ6IGZ1bmN0aW9uKCBnaWRDb21tZW50ICkNCgl7DQoJCXZhciBlbEZvcm0gPSAkKCdlZGl0Y29tbWVudGZvcm1fJyArIGdpZENvbW1lbnQpOw0KCQl2YXIgZWxUZXh0YXJlYSA9ICQoJ2NvbW1lbnRfZWRpdF90ZXh0XycgKyBnaWRDb21tZW50KTsNCg0KCQl2YXIgZWxDb250ZW50ID0gJCgnY29tbWVudF9jb250ZW50XycgKyBnaWRDb21tZW50KTsNCgkJZWxDb250ZW50LmhpZGUoKTsNCg0KCQlpZiAoIGVsQ29udGVudC5uZXh0KCcuZm9ydW1fYXVkaXQnKSApDQoJCQllbENvbnRlbnQubmV4dCgnLmZvcnVtX2F1ZGl0JykuaGlkZSgpOw0KDQoJCSQoJ2NvbW1lbnRfZWRpdF8nICsgZ2lkQ29tbWVudCkuc2hvdygpOw0KCQkkKCdjb21tZW50X2VkaXRfJyArIGdpZENvbW1lbnQgKyAnX2Vycm9yJykudXBkYXRlKCcnKTsNCg0KCQlpZiAoICFlbFRleHRhcmVhLnZhbHVlIHx8IGVsVGV4dGFyZWEudmFsdWUubGVuZ3RoID09IDAgKQ0KCQkJZWxUZXh0YXJlYS52YWx1ZSA9IHRoaXMubV9yZ1Jhd0NvbW1lbnRDYWNoZVsgZ2lkQ29tbWVudCBdLnRleHQ7DQoNCgkJaWYgKCAhZWxGb3JtLm1fYkV2ZW50c0JvdW5kICkNCgkJew0KCQkJbmV3IENBdXRvU2l6aW5nVGV4dEFyZWEoIGVsVGV4dGFyZWEsIDQwICk7DQoJCQllbEZvcm0ub2JzZXJ2ZSggJ3N1Ym1pdCcsIHRoaXMuU3VibWl0RWRpdENvbW1lbnQuYmluZCggdGhpcywgZWxGb3JtICkgKTsNCgkJCWVsRm9ybS5vYnNlcnZlKCAncmVzZXQnLCB0aGlzLkhpZGVFZGl0Q29tbWVudC5iaW5kKCB0aGlzLCBnaWRDb21tZW50ICkgKTsNCgkJCWVsRm9ybS5tX2JFdmVudHNCb3VuZCA9IHRydWU7DQoJCX0NCgl9LA0KDQoJVm90ZVVwOiBmdW5jdGlvbigpDQoJew0KCQlpZiAoIHRoaXMubV9iTG9hZGluZyApDQoJCQlyZXR1cm47DQoNCgkJdmFyIHBhcmFtcyA9IHRoaXMuUGFyYW1ldGVyc1dpdGhEZWZhdWx0cyggew0KCQkJdm90ZTogdGhpcy5tX2JMb2FkaW5nVXNlckhhc1VwVm90ZWQgPyAwIDogMQkvLyBmbGlwIG91ciB2b3RlDQoJCX0gKTsNCg0KCQl0aGlzLm1fYkxvYWRpbmcgPSB0cnVlOw0KCQluZXcgQWpheC5SZXF1ZXN0KCB0aGlzLkdldEFjdGlvblVSTCggJ3ZvdGV1cCcgKSwgew0KCQkJbWV0aG9kOiAncG9zdCcsDQoJCQlwYXJhbWV0ZXJzOiBwYXJhbXMsDQoJCQlvblN1Y2Nlc3M6IHRoaXMuT25SZXNwb25zZVZvdGVVcC5iaW5kKCB0aGlzLCArK3RoaXMubV9uUmVuZGVyQWpheFNlcXVlbmNlTnVtYmVyICksDQoJCQlvbkZhaWx1cmU6IHRoaXMuT25GYWlsdXJlRGlzcGxheUVycm9yLmJpbmQoIHRoaXMgKSwNCgkJCW9uQ29tcGxldGU6IHRoaXMuT25BSkFYQ29tcGxldGUuYmluZCggdGhpcyApDQoJCX0gKTsNCgl9LA0KDQoJVXBkYXRlQW5zd2VyOiBmdW5jdGlvbiggZ2lkQ29tbWVudCwgYkV4aXN0aW5nICkNCgl7DQoJCS8vIHNlZSBpZiBpdCdzIG9uIHRoZSBjdXJyZW50IHBhZ2UNCgkJaWYgKCB0aGlzLm1fYkxvYWRpbmcgKQ0KCQkJcmV0dXJuOw0KDQoJCWlmICggIWdpZENvbW1lbnQgKQ0KCQl7DQoJCQkkbW9kYWwgPSBTaG93Q29uZmlybURpYWxvZyggJ1JlbW92ZSBBcyBBbnN3ZXInLCAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHVubWFyayB0aGlzIHBvc3QgYXMgdGhlIGFuc3dlciB0byB0aGlzIHRocmVhZD8gWW91IGNhbiB1cGRhdGUgdGhpcyBhdCBhbnkgdGltZS4nLCAnUmVtb3ZlIEFzIEFuc3dlcicgKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXZhciBzdHJNb2RhbEJvZHkgPSAnWW91IGFyZSBhYm91dCB0byBtYXJrIHRoaXMgcG9zdCBhcyB0aGUgYW5zd2VyIHRvIHRoaXMgdGhyZWFkLiBUaGlzIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgb3JpZ2luYWwgcG9zdCBoYXMgYmVlbiBhbnN3ZXJlZCBhbmQgbGluayB0byB0aGlzIHNwZWNpZmljIHBvc3QuIFlvdSBjYW4gcmVtb3ZlIHRoaXMgb3IgaW5kaWNhdGUgYSBkaWZmZXJlbnQgcG9zdCBhcyB0aGUgYW5zd2VyIGF0IGFueSB0aW1lIGlmIHlvdSBjaGFuZ2UgeW91ciBtaW5kLic7DQoJCQlpZiAoIGJFeGlzdGluZyApDQoJCQkJc3RyTW9kYWxCb2R5ID0gJ0EgZGlmZmVyZW50IHBvc3QgaXMgYWxyZWFkeSBzZWxlY3RlZCBhcyB0aGUgYW5zd2VyIHRvIHRoaXMgdGhyZWFkLiBXb3VsZCB5b3UgbGlrZSB0byBjaG9vc2UgdGhpcyBwb3N0IGFzIHRoZSBuZXcgYW5zd2VyPyc7DQoNCgkJCSRtb2RhbCA9IFNob3dDb25maXJtRGlhbG9nKCAnTWFyayBBcyBBbnN3ZXInLCBzdHJNb2RhbEJvZHksICdDaG9vc2UgQW5zd2VyJyApOw0KCQkJJG1vZGFsLlNldE1heFdpZHRoKDUwMCk7DQoJCX0NCg0KCQl2YXIgXyR0aGlzID0gdGhpczsNCg0KCQkkbW9kYWwuZG9uZSggZnVuY3Rpb24oKXsNCg0KCQkJdmFyIHBhcmFtcyA9IF8kdGhpcy5QYXJhbWV0ZXJzV2l0aERlZmF1bHRzKCB7DQoJCQkJZ2lkY29tbWVudGFuc3dlcjogZ2lkQ29tbWVudA0KCQkJfSApOw0KDQoJCQlfJHRoaXMubV9iTG9hZGluZyA9IHRydWU7DQoJCQluZXcgQWpheC5SZXF1ZXN0KCBfJHRoaXMuR2V0QWN0aW9uVVJMKCAndXBkYXRlYW5zd2VyJyApLCB7DQoJCQkJbWV0aG9kOiAncG9zdCcsDQoJCQkJcGFyYW1ldGVyczogcGFyYW1zLA0KCQkJCW9uU3VjY2VzczogZnVuY3Rpb24oKSB7DQoJCQkJCQkJCQkJd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnYycgKyBnaWRDb21tZW50Ow0KCQkJCQl3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7DQoJCQkJfSwNCgkJCQlvbkZhaWx1cmU6IGZ1bmN0aW9uKCB0cmFuc3BvcnQgKSB7DQoJCQkJCWlmICggdHJhbnNwb3J0LnJlc3BvbnNlSlNPTiAmJiB0cmFuc3BvcnQucmVzcG9uc2VKU09OLnN1Y2Nlc3MgKQ0KCQkJCQl7DQoJCQkJCQl2YXIgc3RyRXJyb3IgPSAnVGhlcmUgd2FzIGFuIGlzc3VlIHVwZGF0aW5nIHRoaXMgdG9waWMgYW5zd2VyLiBFcnJvcjogJyArIHRyYW5zcG9ydC5yZXNwb25zZUpTT04uc3VjY2VzczsNCgkJCQkJCWlmICggdHJhbnNwb3J0LnJlc3BvbnNlSlNPTi5zdWNjZXNzID09IDE1ICkNCgkJCQkJCXsNCgkJCQkJCQlzdHJFcnJvciA9ICdZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byB1cGRhdGUgdGhpcyB0b3BpY1wncyBhbnN3ZXIuJw0KCQkJCQkJfQ0KDQoJCQkJCQlTaG93QWxlcnREaWFsb2coICdFcnJvcicsIHN0ckVycm9yICk7DQoJCQkJCX0NCgkJCQl9LA0KCQkJCW9uQ29tcGxldGU6IF8kdGhpcy5PbkFKQVhDb21wbGV0ZS5iaW5kKCBfJHRoaXMgKQ0KCQkJfSk7DQoJCX0gKTsNCg0KCX0sDQoNCglHZXRSYXdDb21tZW50OiBmdW5jdGlvbiggZ2lkQ29tbWVudCApDQoJew0KCQlyZXR1cm4gdGhpcy5tX3JnUmF3Q29tbWVudENhY2hlWyBnaWRDb21tZW50IF07DQoJfSwNCg0KCUdldENvbW1lbnRUZXh0RW50cnlFbGVtZW50OiBmdW5jdGlvbigpDQoJew0KCQlyZXR1cm4gdGhpcy5tX2VsVGV4dEFyZWE7DQoJfSwNCg0KCUhpZGVFZGl0Q29tbWVudDogZnVuY3Rpb24oIGdpZENvbW1lbnQgKQ0KCXsNCgkJJCgnY29tbWVudF9jb250ZW50XycgKyBnaWRDb21tZW50KS5zaG93KCk7DQoJCSQoJ2NvbW1lbnRfZWRpdF8nICsgZ2lkQ29tbWVudCkuaGlkZSgpOw0KCX0sDQoNCglPblJlc3BvbnNlRWRpdENvbW1lbnQ6IGZ1bmN0aW9uKCBnaWRDb21tZW50LCBuQWpheFNlcXVlbmNlTnVtYmVyLCB0cmFuc3BvcnQgKQ0KCXsNCgkJaWYgKCB0cmFuc3BvcnQucmVzcG9uc2VKU09OICYmIHRyYW5zcG9ydC5yZXNwb25zZUpTT04uc3VjY2VzcykNCgkJew0KCQkJLy8gbm8gbmVlZCB0byBoaWRlIGJlY2F1c2UgcmVuZGVyIHdpbGwgcmVwbGFjZSBvdXIgd2hvbGUgZWxlbWVudA0KCQkJdGhpcy5PblJlc3BvbnNlUmVuZGVyQ29tbWVudHMoIENDb21tZW50VGhyZWFkLlJFTkRFUl9ERUxFVEVEUE9TVCwgbkFqYXhTZXF1ZW5jZU51bWJlciwgdHJhbnNwb3J0ICk7CS8vZGlzcGxheSB0aGUgdXBkYXRlZCBjb21tZW50IHRocmVhZA0KCQl9DQoJCWVsc2UNCgkJew0KCQkJdGhpcy5PbkVkaXRGYWlsdXJlRGlzcGxheUVycm9yKCBnaWRDb21tZW50LCB0cmFuc3BvcnQgKTsNCgkJfQ0KCX0sDQoNCglPbkVkaXRGYWlsdXJlRGlzcGxheUVycm9yOiBmdW5jdGlvbiggZ2lkQ29tbWVudCwgdHJhbnNwb3J0ICkNCgl7DQoJCXRoaXMuRGlzcGxheUVycm9yKCAkKCdjb21tZW50X2VkaXRfJyArIGdpZENvbW1lbnQgKyAnX2Vycm9yJyksIHRyYW5zcG9ydCApOw0KCX0sDQoNCglTdWJtaXRFZGl0Q29tbWVudDogZnVuY3Rpb24oIGVsRm9ybSApDQoJew0KCQlpZiAoIHRoaXMubV9iTG9hZGluZyApDQoJCQlyZXR1cm4gZmFsc2U7DQoNCgkJdmFyIGdpZENvbW1lbnQgPSBlbEZvcm0uZWxlbWVudHNbJ2dpZGNvbW1lbnQnXS52YWx1ZTsNCgkJdmFyIHN0ckNvbW1lbnQgPSBlbEZvcm0uZWxlbWVudHNbJ2NvbW1lbnQnXS52YWx1ZTsNCg0KCQl2YXIgcGFyYW1zID0gdGhpcy5QYXJhbWV0ZXJzV2l0aERlZmF1bHRzKCB7DQoJCQlnaWRjb21tZW50OiBnaWRDb21tZW50LA0KCQkJY29tbWVudDogc3RyQ29tbWVudCwNCgkJCXN0YXJ0OiB0aGlzLm1fY1BhZ2VTaXplICogdGhpcy5tX2lDdXJyZW50UGFnZQ0KCQl9ICk7DQoNCgkJdGhpcy5tX2JMb2FkaW5nID0gdHJ1ZTsNCgkJbmV3IEFqYXguUmVxdWVzdCggdGhpcy5HZXRBY3Rpb25VUkwoICdlZGl0JyApLCB7DQoJCQltZXRob2Q6ICdwb3N0JywNCgkJCXBhcmFtZXRlcnM6IHBhcmFtcywNCgkJCW9uU3VjY2VzczogdGhpcy5PblJlc3BvbnNlRWRpdENvbW1lbnQuYmluZCggdGhpcywgZ2lkQ29tbWVudCwgKyt0aGlzLm1fblJlbmRlckFqYXhTZXF1ZW5jZU51bWJlciApLA0KCQkJb25GYWlsdXJlOiB0aGlzLk9uRWRpdEZhaWx1cmVEaXNwbGF5RXJyb3IuYmluZCggdGhpcywgZ2lkQ29tbWVudCApLA0KCQkJb25Db21wbGV0ZTogdGhpcy5PbkFKQVhDb21wbGV0ZS5iaW5kKCB0aGlzICkNCgkJfSApOw0KCQlyZXR1cm4gZmFsc2U7DQoJfSwNCg0KCU9uQUpBWENvbXBsZXRlOiBmdW5jdGlvbigpDQoJew0KCQl0aGlzLm1fYkxvYWRpbmcgPSBmYWxzZTsNCgl9LA0KDQoJT25QYWdpbmdCdXR0b25DbGljazogZnVuY3Rpb24oIGV2ZW50LCBmblRvRXhlY3V0ZSApDQoJew0KCQlldmVudC5zdG9wKCk7DQoJCWZuVG9FeGVjdXRlLmNhbGwoIHRoaXMgKTsNCgl9LA0KDQoJTmV4dFBhZ2U6IGZ1bmN0aW9uKCkNCgl7DQoJCWlmICggdGhpcy5tX2lDdXJyZW50UGFnZSA8IHRoaXMubV9jTWF4UGFnZXMgLSAxICkNCgkJCXRoaXMuR29Ub1BhZ2UoIHRoaXMubV9pQ3VycmVudFBhZ2UgKyAxICk7DQoJfSwNCg0KCVByZXZQYWdlOiBmdW5jdGlvbigpDQoJew0KCQlpZiAoIHRoaXMubV9pQ3VycmVudFBhZ2UgPiAwICkNCgkJCXRoaXMuR29Ub1BhZ2UoIHRoaXMubV9pQ3VycmVudFBhZ2UgLSAxICk7DQoJfSwNCg0KCW1fblJlbmRlckFqYXhTZXF1ZW5jZU51bWJlcjogMCwNCglHb1RvUGFnZTogZnVuY3Rpb24oIGlQYWdlLCBlUmVuZGVyUmVhc29uICkNCgl7DQoJCWlmICggIGlQYWdlID49IHRoaXMubV9jTWF4UGFnZXMgfHwgaVBhZ2UgPCAwIHx8ICggaVBhZ2UgPT0gdGhpcy5tX2lDdXJyZW50UGFnZSAmJiAhdGhpcy5tX2JMb2FkaW5nICkgKQ0KCQkJcmV0dXJuOw0KDQoJCXZhciBwYXJhbXMgPSB0aGlzLlBhcmFtZXRlcnNXaXRoRGVmYXVsdHMoIHsNCgkJCXN0YXJ0OiB0aGlzLm1fY1BhZ2VTaXplICogaVBhZ2UsDQoJCQl0b3RhbGNvdW50OiB0aGlzLm1fY1RvdGFsQ291bnQNCgkJfSApOw0KDQoJCXRoaXMubV9iTG9hZGluZyA9IHRydWU7DQoJCW5ldyBBamF4LlJlcXVlc3QoIHRoaXMuR2V0QWN0aW9uVVJMKCAncmVuZGVyJyApLCB7DQoJCQltZXRob2Q6ICdwb3N0JywNCgkJCXBhcmFtZXRlcnM6IHBhcmFtcywNCgkJCW9uU3VjY2VzczogdGhpcy5PblJlc3BvbnNlUmVuZGVyQ29tbWVudHMuYmluZCggdGhpcywgZVJlbmRlclJlYXNvbiB8fCBDQ29tbWVudFRocmVhZC5SRU5ERVJfR09UT1BBR0UsICsrdGhpcy5tX25SZW5kZXJBamF4U2VxdWVuY2VOdW1iZXIgKSwNCgkJCW9uQ29tcGxldGU6IHRoaXMuT25BSkFYQ29tcGxldGUuYmluZCggdGhpcyApDQoJCX0pOw0KCX0sDQoNCglHb1RvUGFnZVdpdGhDb21tZW50OiBmdW5jdGlvbiggZ2lkQ29tbWVudCwgZVJlbmRlclJlYXNvbiApDQoJew0KCQkvLyBzZWUgaWYgaXQncyBvbiB0aGUgY3VycmVudCBwYWdlDQoJCWlmICggdGhpcy5tX2JMb2FkaW5nIHx8ICQoJ2NvbW1lbnRfJyArIGdpZENvbW1lbnQgKSApDQoJCQlyZXR1cm47DQoNCgkJLy8gbm9wZSwgbG9hZA0KCQl2YXIgcGFyYW1zID0gdGhpcy5QYXJhbWV0ZXJzV2l0aERlZmF1bHRzKCB7DQoJCQlnaWRDb21tZW50OiBnaWRDb21tZW50DQoJCX0gKTsNCg0KCQluZXcgQWpheC5SZXF1ZXN0KCB0aGlzLkdldEFjdGlvblVSTCggJ3JlbmRlcicgKSwgew0KCQkJbWV0aG9kOiAncG9zdCcsDQoJCQlwYXJhbWV0ZXJzOiBwYXJhbXMsDQoJCQlvblN1Y2Nlc3M6IHRoaXMuT25SZXNwb25zZVJlbmRlckNvbW1lbnRzLmJpbmQoIHRoaXMsIGVSZW5kZXJSZWFzb24gfHwgQ0NvbW1lbnRUaHJlYWQuUkVOREVSX0dPVE9DT01NRU5ULCArK3RoaXMubV9uUmVuZGVyQWpheFNlcXVlbmNlTnVtYmVyICksDQoJCQlvbkNvbXBsZXRlOiB0aGlzLk9uQUpBWENvbXBsZXRlLmJpbmQoIHRoaXMgKQ0KCQl9KTsNCgl9LA0KDQoJT25SZXNwb25zZUFkZENvbW1lbnQ6IGZ1bmN0aW9uKCBuQWpheFNlcXVlbmNlTnVtYmVyLCB0cmFuc3BvcnQgKQ0KCXsNCgkJaWYgKCB0cmFuc3BvcnQucmVzcG9uc2VKU09OICYmIHRyYW5zcG9ydC5yZXNwb25zZUpTT04uc3VjY2VzcykNCgkJew0KCQkJJCgnY29tbWVudHRocmVhZF8nICsgdGhpcy5tX3N0ck5hbWUgKyAnX2VudHJ5X2Vycm9yJykuaGlkZSgpOw0KCQkJdGhpcy5tX2VsVGV4dEFyZWEudmFsdWU9Jyc7DQoJCQl0aGlzLkNoZWNrVGV4dEFyZWFTaXplKCk7DQoJCQl0aGlzLk9uUmVzcG9uc2VSZW5kZXJDb21tZW50cyggQ0NvbW1lbnRUaHJlYWQuUkVOREVSX05FV1BPU1QsIG5BamF4U2VxdWVuY2VOdW1iZXIsIHRyYW5zcG9ydCApOwkvL2Rpc3BsYXkgdGhlIHVwZGF0ZWQgY29tbWVudCB0aHJlYWQNCg0KCQkJaWYgKCAkKCdjb21tZW50dGhyZWFkXycgKyB0aGlzLm1fc3RyTmFtZSArICdfc3Vic2NyaWJlb3B0aW9ucycpICkNCgkJCQkkKCdjb21tZW50dGhyZWFkXycgKyB0aGlzLm1fc3RyTmFtZSArICdfc3Vic2NyaWJlb3B0aW9ucycpLnNob3coKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXRoaXMuT25GYWlsdXJlRGlzcGxheUVycm9yKCB0cmFuc3BvcnQgKTsNCgkJfQ0KCX0sDQoNCglPblJlc3BvbnNlRGVsZXRlQ29tbWVudDogZnVuY3Rpb24oIG5BamF4U2VxdWVuY2VOdW1iZXIsIHRyYW5zcG9ydCApDQoJew0KCQlpZiAoIHRyYW5zcG9ydC5yZXNwb25zZUpTT04gJiYgdHJhbnNwb3J0LnJlc3BvbnNlSlNPTi5zdWNjZXNzICkNCgkJCXRoaXMuT25SZXNwb25zZVJlbmRlckNvbW1lbnRzKCBDQ29tbWVudFRocmVhZC5SRU5ERVJfREVMRVRFRFBPU1QsIG5BamF4U2VxdWVuY2VOdW1iZXIsIHRyYW5zcG9ydCApOw0KCQllbHNlDQoJCQl0aGlzLk9uRmFpbHVyZURpc3BsYXlFcnJvciggdHJhbnNwb3J0ICk7DQoJfSwNCg0KCU9uUmVzcG9uc2VWb3RlVXA6IGZ1bmN0aW9uKCBuQWpheFNlcXVlbmNlTnVtYmVyLCB0cmFuc3BvcnQgKQ0KCXsNCgkJaWYgKCB0cmFuc3BvcnQucmVzcG9uc2VKU09OICYmIHRyYW5zcG9ydC5yZXNwb25zZUpTT04uc3VjY2VzcyApDQoJCXsNCgkJCXRoaXMuT25SZXNwb25zZVJlbmRlckNvbW1lbnRzKCBDQ29tbWVudFRocmVhZC5SRU5ERVJfR09UT0NPTU1FTlQsIG5BamF4U2VxdWVuY2VOdW1iZXIsIHRyYW5zcG9ydCApOw0KCQkJdGhpcy5tX2JMb2FkaW5nVXNlckhhc1VwVm90ZWQgPSAhdGhpcy5tX2JMb2FkaW5nVXNlckhhc1VwVm90ZWQ7CS8vIHdlIGNhbiBzd2l0Y2ggdGhpcyB0byBnZXR0aW5nIGZyb20gdGhlIHJlc3BvbnNlIGFmdGVyIDgvMjQvMjAxMg0KCQkJdGhpcy5tX2NVcFZvdGVzID0gdHJhbnNwb3J0LnJlc3BvbnNlSlNPTi51cHZvdGVzOw0KDQoJCQlpZiAoIHRoaXMubV92b3RlY291bnRJRCAmJiAkKHRoaXMubV92b3RlY291bnRJRCkgJiYgdHJhbnNwb3J0LnJlc3BvbnNlSlNPTi52b3RldGV4dCApDQoJCQl7DQoJCQkJJCh0aGlzLm1fdm90ZWNvdW50SUQpLmlubmVySFRNTCA9IHRyYW5zcG9ydC5yZXNwb25zZUpTT04udm90ZXRleHQ7DQoJCQl9DQoNCgkJCWlmICggdGhpcy5tX3ZvdGV1cElEICYmICQodGhpcy5tX3ZvdGV1cElEKSApDQoJCQl7DQoJCQkJaWYgKCB0aGlzLm1fYkxvYWRpbmdVc2VySGFzVXBWb3RlZCApDQoJCQkJCSQodGhpcy5tX3ZvdGV1cElEKS5hZGRDbGFzc05hbWUoJ2FjdGl2ZScpOw0KCQkJCWVsc2UNCgkJCQkJJCh0aGlzLm1fdm90ZXVwSUQpLnJlbW92ZUNsYXNzTmFtZSgnYWN0aXZlJyk7DQoJCQl9DQoJCX0NCgkJZWxzZQ0KCQkJdGhpcy5PbkZhaWx1cmVEaXNwbGF5RXJyb3IoIHRyYW5zcG9ydCApOw0KCX0sDQoNCglPbkZhaWx1cmVEaXNwbGF5RXJyb3I6IGZ1bmN0aW9uKCB0cmFuc3BvcnQgKQ0KCXsNCgkJdGhpcy5EaXNwbGF5RXJyb3IoICQoJ2NvbW1lbnR0aHJlYWRfJyArIHRoaXMubV9zdHJOYW1lICsgJ19lbnRyeV9lcnJvcicpLCB0cmFuc3BvcnQgKTsNCgl9LA0KDQoJRGlzcGxheUVycm9yOiBmdW5jdGlvbiggZWxFcnJvciwgdHJhbnNwb3J0ICkNCgl7DQoJCXZhciBzdHJNZXNzYWdlID0gJ1NvcnJ5LCBzb21lIGtpbmQgb2YgZXJyb3IgaGFzIG9jY3VycmVkOiAnOw0KCQlpZiAoIHRyYW5zcG9ydC5yZXNwb25zZUpTT04gJiYgdHJhbnNwb3J0LnJlc3BvbnNlSlNPTi5lcnJvciApDQoJCQlzdHJNZXNzYWdlICs9IHRyYW5zcG9ydC5yZXNwb25zZUpTT04uZXJyb3I7DQoJCWVsc2UNCgkJCXN0ck1lc3NhZ2UgKz0gJ1RoZXJlIHdhcyBhbiBlcnJvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIG5ldHdvcmsuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJzsNCg0KCQllbEVycm9yLnVwZGF0ZSggc3RyTWVzc2FnZSApOw0KCQllbEVycm9yLnNob3coKTsNCgl9LA0KDQoJT25SZXNwb25zZVJlbmRlckNvbW1lbnRzOiBmdW5jdGlvbiggZVJlbmRlclJlYXNvbiwgbkFqYXhTZXF1ZW5jZU51bWJlciwgdHJhbnNwb3J0ICkNCgl7DQoJCWlmICggdGhpcy5tX25SZW5kZXJBamF4U2VxdWVuY2VOdW1iZXIgIT0gbkFqYXhTZXF1ZW5jZU51bWJlciApDQoJCQlyZXR1cm47DQoNCgkJaWYgKCB0cmFuc3BvcnQucmVzcG9uc2VKU09OICkNCgkJew0KCQkJdmFyIHJlc3BvbnNlID0gdHJhbnNwb3J0LnJlc3BvbnNlSlNPTjsNCgkJCXRoaXMubV9jVG90YWxDb3VudCA9IHJlc3BvbnNlLnRvdGFsX2NvdW50Ow0KCQkJdGhpcy5tX2NNYXhQYWdlcyA9IE1hdGguY2VpbCggcmVzcG9uc2UudG90YWxfY291bnQgLyByZXNwb25zZS5wYWdlc2l6ZSApOw0KCQkJdGhpcy5tX2lDdXJyZW50UGFnZSA9IE1hdGguZmxvb3IoIHJlc3BvbnNlLnN0YXJ0IC8gcmVzcG9uc2UucGFnZXNpemUgKTsNCg0KCQkJaWYgKCByZXNwb25zZS5jb21tZW50c19yYXcgKQ0KCQkJCXRoaXMubV9yZ1Jhd0NvbW1lbnRDYWNoZSA9IHJlc3BvbnNlLmNvbW1lbnRzX3JhdzsNCg0KCQkJaWYgKCB0aGlzLm1fY29tbWVudGNvdW50SUQgJiYgJCh0aGlzLm1fY29tbWVudGNvdW50SUQpICkNCgkJCQkkKHRoaXMubV9jb21tZW50Y291bnRJRCkuaW5uZXJIVE1MID0gdGhpcy5tX2NUb3RhbENvdW50Ow0KDQoJCQlpZiAoIHRoaXMubV9jVG90YWxDb3VudCA8PSByZXNwb25zZS5zdGFydCAmJiB0aGlzLm1faUN1cnJlbnRQYWdlID4gMCApDQoJCQl7DQoJCQkJLy8gdGhpcyBwYWdlIGlzIG5vIGxvZ25lciB2YWxpZCwgZmxpcCBiYWNrIGEgcGFnZSAoZGVmZXJyZWQgc28gdGhhdCB0aGUgQUpBWCBoYW5kbGVyIGV4aXRzIGFuZCByZXNldCBtX2JMb2FkaW5nKQ0KCQkJCXRoaXMuR29Ub1BhZ2UuYmluZCggdGhpcywgdGhpcy5tX2lDdXJyZW50UGFnZSAtIDEgKS5kZWZlcigpOw0KCQkJCXJldHVybjsNCgkJCX0NCg0KCQkJaWYgKCB0aGlzLm1fYlRyYWNrTmF2aWdhdGlvbiAmJiB3aW5kb3cuaGlzdG9yeSAmJiB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUgKQ0KCQkJew0KCQkJCXZhciBwYXJhbXMgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLmxlbmd0aCA/ICRKLmRlcGFyYW0oIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpICkgOiB7fTsNCgkJCQlpZiAoICggIXBhcmFtc1snY3RwJ10gJiYgdGhpcy5tX2lDdXJyZW50UGFnZSAhPSAwICkgfHwgKCBwYXJhbXNbJ2N0cCddICYmIHBhcmFtc1snY3RwJ10gIT0gdGhpcy5tX2lDdXJyZW50UGFnZSArIDEgKSApDQoJCQkJew0KCQkJCQl2YXIgZm5TdGF0ZVVwZGF0ZSA9IHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZS5iaW5kKCB3aW5kb3cuaGlzdG9yeSApOw0KCQkJCQl2YXIgdXJsID0gVXBkYXRlUGFyYW1ldGVySW5DdXJyZW50VVJMKCAnY3RwJywgdGhpcy5tX2lDdXJyZW50UGFnZSA9PSAwID8gbnVsbCA6IHRoaXMubV9pQ3VycmVudFBhZ2UgKyAxLCBbJ3RzY24nXSApOw0KCQkJCQlpZiAoIGVSZW5kZXJSZWFzb24gPT0gQ0NvbW1lbnRUaHJlYWQuUkVOREVSX0dPVE9QQUdFX0hBU0hDSEFOR0UgfHwgZVJlbmRlclJlYXNvbiA9PSBDQ29tbWVudFRocmVhZC5SRU5ERVJfR09UT0NPTU1FTlRfSEFTSENIQU5HRSApDQoJCQkJCXsNCgkJCQkJCWZuU3RhdGVVcGRhdGUgPSB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUuYmluZCggd2luZG93Lmhpc3RvcnkgKTsNCgkJCQkJCWlmICggZVJlbmRlclJlYXNvbiA9PSBDQ29tbWVudFRocmVhZC5SRU5ERVJfR09UT0NPTU1FTlRfSEFTSENIQU5HRSApDQoJCQkJCQkJdXJsICs9IHdpbmRvdy5sb2NhdGlvbi5oYXNoOw0KCQkJCQl9DQoJCQkJCWZuU3RhdGVVcGRhdGUoIHsgY29tbWVudF90aHJlYWRfcGFnZTogdGhpcy5tX2lDdXJyZW50UGFnZSB9LCAnJywgdXJsICk7DQoJCQkJfQ0KCQkJfQ0KDQoJCQl0aGlzLkRvVHJhbnNpdGlvblRvTmV3UG9zdHMoIHJlc3BvbnNlLCBlUmVuZGVyUmVhc29uICk7DQoNCgkJCS8vIGlmIHdlJ3JlIHZpZXdpbmcgdGhlIG1vc3QgcmVjZW50IHBhZ2Ugb2YgY29tbWVudHMsIHJlZnJlc2ggbm90aWZpY2F0aW9ucw0KCQkJaWYgKCAoICF0aGlzLm1fcmdDb21tZW50RGF0YVsnb2xkZXN0Zmlyc3QnXSAmJiB0aGlzLm1faUN1cnJlbnRQYWdlID09IDAgKSB8fA0KCQkJCQl0aGlzLm1fcmdDb21tZW50RGF0YVsnb2xkZXN0Zmlyc3QnXSAmJiAoIHRoaXMubV9pQ3VycmVudFBhZ2UgKyAxICkgKiB0aGlzLm1fY1BhZ2VTaXplID4gdGhpcy5tX2NUb3RhbENvdW50ICkNCgkJCXsNCgkJCQlSZWZyZXNoTm90aWZpY2F0aW9uQXJlYSgpOw0KCQkJfQ0KDQoJCQl0aGlzLlVwZGF0ZVBhZ2luZ0Rpc3BsYXkoKTsNCgkJfQ0KCX0sDQoNCglEb1RyYW5zaXRpb25Ub05ld1Bvc3RzOiBmdW5jdGlvbiggcmVzcG9uc2UsIGVSZW5kZXJSZWFzb24gKQ0KCXsNCgkJdmFyIHN0ck5ld0hUTUwgPSByZXNwb25zZS5jb21tZW50c19odG1sOw0KDQoJCXZhciBlbFBvc3RzID0gJCgnY29tbWVudHRocmVhZF8nICsgdGhpcy5tX3N0ck5hbWUgKyAnX3Bvc3RzJyApOw0KCQl2YXIgZWxDb250YWluZXIgPSAkKCdjb21tZW50dGhyZWFkXycgKyB0aGlzLm1fc3RyTmFtZSArICdfcG9zdGNvbnRhaW5lcicgKTsNCgkJZWxDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQoJCWVsQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGVsQ29udGFpbmVyLmdldEhlaWdodCgpICsgJ3B4JzsNCgkJZWxDb250YWluZXIuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsNCgkJZWxDb250YWluZXIuc3R5bGUuZGlzcGxheSA9IHRoaXMubV9jVG90YWxDb3VudCA/ICdibG9jaycgOiAnbm9uZSc7DQoNCgkJdmFyIGJOZXdQb3N0ID0gKCBlUmVuZGVyUmVhc29uID09IENDb21tZW50VGhyZWFkLlJFTkRFUl9ORVdQT1NUICk7DQoNCgkJaWYgKCBiTmV3UG9zdCAmJiB0aGlzLm1fY1RvdGFsQ291bnQgPD0gdGhpcy5tX2NQYWdlU2l6ZSAmJiAhdGhpcy5tX3JnQ29tbWVudERhdGFbJ29sZGVzdGZpcnN0J10gJiYgIXRoaXMubV9yZ0NvbW1lbnREYXRhWyduZXdlc3RmaXJzdHBhZ2luYXRpb24nXSApDQoJCXsNCgkJCWVsQ29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsNCgkJCWVsUG9zdHMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOw0KCQkJZWxQb3N0cy5zdHlsZS5sZWZ0ID0gJzBweCc7DQoJCQllbFBvc3RzLnN0eWxlLnJpZ2h0ID0gJzBweCc7DQoJCQllbFBvc3RzLnN0eWxlLmJvdHRvbSA9ICcwcHgnOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJZWxQb3N0cy5zdHlsZS5wb3NpdGlvbiA9ICdzdGF0aWMnOw0KCQl9DQoNCgkJZWxQb3N0cy51cGRhdGUoIHN0ck5ld0hUTUwgKTsNCg0KCQlTY3JvbGxUb0lmTm90SW5WaWV3KCAkKCdjb21tZW50dGhyZWFkXycgKyB0aGlzLm1fc3RyTmFtZSArICdfYXJlYScpLCA0MCwgMjAgKTsNCg0KCQlpZiAoIGVsQ29udGFpbmVyLmVmZmVjdCApDQoJCQllbENvbnRhaW5lci5lZmZlY3QuY2FuY2VsKCk7DQoNCgkJKCBmdW5jdGlvbigpIHsNCgkJCWVsQ29udGFpbmVyLmVmZmVjdCA9IG5ldyBFZmZlY3QuTW9ycGgoIGVsQ29udGFpbmVyLCB7IHN0eWxlOiAnaGVpZ2h0OiAnICsgZWxQb3N0cy5nZXRIZWlnaHQoKSArICdweCcsIGR1cmF0aW9uOiAwLjI1LCBhZnRlckZpbmlzaDogZnVuY3Rpb24oKSB7IGVsUG9zdHMuc3R5bGUucG9zaXRpb24gPSAnc3RhdGljJzsgZWxDb250YWluZXIuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nOyBlbENvbnRhaW5lci5zdHlsZS5vdmVyZmxvdyA9ICcnOyAgfSB9ICk7DQoJCX0pLmRlZmVyKCk7DQoJfSwNCg0KCVVwZGF0ZVBhZ2luZ0Rpc3BsYXk6IGZ1bmN0aW9uKCkNCgl7DQoJCWlmICggIXRoaXMubV9iSGFzUGFnaW5nICkNCgkJCXJldHVybjsNCg0KCQl2YXIgc3RyUHJlZml4ID0gJ2NvbW1lbnR0aHJlYWRfJyArIHRoaXMubV9zdHJOYW1lOw0KDQoJCS8vIHRoaXMgZWxlbWVudCBub3QgZGlzcGxheWVkIG9uIHRoZSBmb3J1bSB0b3BpYyBwYWdlDQoJCSQoc3RyUHJlZml4ICsgJ190b3RhbGNvdW50JykgJiYgJChzdHJQcmVmaXggKyAnX3RvdGFsY291bnQnKS51cGRhdGUoIHZfbnVtYmVyZm9ybWF0KCB0aGlzLm1fY1RvdGFsQ291bnQgKSApOw0KDQoJCXZhciByZ1BhZ2luZ0NvbnRyb2xzID0gWyBzdHJQcmVmaXggKyAnX3BhZ2UnLCBzdHJQcmVmaXggKyAnX2ZwYWdlJyBdOw0KCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCByZ1BhZ2luZ0NvbnRyb2xzLmxlbmd0aDsgaSsrICkNCgkJew0KCQkJdmFyIHN0clBhZ2VQcmVmaXggPSByZ1BhZ2luZ0NvbnRyb2xzW2ldOw0KDQoJCQkvLyB0aGVzZSBlbGVtZW50cyBhcmUgZGlzcGxheWVkIG9uIHRoZSBmb3J1bSB0b3BpYyBwYWdlDQoJCQkkKHN0clBhZ2VQcmVmaXggKyAndG90YWwnKSAmJiAkKHN0clBhZ2VQcmVmaXggKyAndG90YWwnKS51cGRhdGUoIHZfbnVtYmVyZm9ybWF0KCB0aGlzLm1fY1RvdGFsQ291bnQgKSApOw0KCQkJJChzdHJQYWdlUHJlZml4ICsgJ3N0YXJ0JykgJiYgJChzdHJQYWdlUHJlZml4ICsgJ3N0YXJ0JykudXBkYXRlKCB2X251bWJlcmZvcm1hdCggdGhpcy5tX2lDdXJyZW50UGFnZSAqIHRoaXMubV9jUGFnZVNpemUgKyAxICkgKTsNCgkJCSQoc3RyUGFnZVByZWZpeCArICdlbmQnKSAmJiAkKHN0clBhZ2VQcmVmaXggKyAnZW5kJykudXBkYXRlKCBNYXRoLm1pbiggKCB0aGlzLm1faUN1cnJlbnRQYWdlICsgMSApICogdGhpcy5tX2NQYWdlU2l6ZSwgdGhpcy5tX2NUb3RhbENvdW50ICkgKTsNCg0KCQkJaWYgKCAkKHN0clBhZ2VQcmVmaXggKyAnY3RuJyApICkNCgkJCXsNCgkJCQlpZiAoIHRoaXMubV9jVG90YWxDb3VudCA+IDAgKQ0KCQkJCQkkKHN0clBhZ2VQcmVmaXggKyAnY3RuJyApLnNob3coKTsNCgkJCQllbHNlDQoJCQkJCSQoc3RyUGFnZVByZWZpeCArICdjdG4nICkuaGlkZSgpOw0KCQkJfQ0KDQoNCgkJCWlmICggdGhpcy5tX2NNYXhQYWdlcyA8PSAxICkNCgkJCXsNCgkJCQkkKHN0clBhZ2VQcmVmaXggKyAnY29udHJvbHMnKS5oaWRlKCk7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJChzdHJQYWdlUHJlZml4ICsgJ2NvbnRyb2xzJykuc2hvdygpOw0KCQkJCWlmICggdGhpcy5tX2lDdXJyZW50UGFnZSA+IDAgKQ0KCQkJCXsNCgkJCQkJJChzdHJQYWdlUHJlZml4ICsgJ2J0bl9wcmV2JykucmVtb3ZlQ2xhc3NOYW1lKCdkaXNhYmxlZCcpOw0KCQkJCQlpZiAoIHRoaXMubV9iVHJhY2tOYXZpZ2F0aW9uICkNCgkJCQkJCSQoc3RyUGFnZVByZWZpeCArICdidG5fcHJldicpLmhyZWYgPSBVcGRhdGVQYXJhbWV0ZXJJbkN1cnJlbnRVUkwoICdjdHAnLCB0aGlzLm1faUN1cnJlbnRQYWdlID09IDEgPyBudWxsIDogdGhpcy5tX2lDdXJyZW50UGFnZSwgWyd0c2NuJ10gKTsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJJChzdHJQYWdlUHJlZml4ICsgJ2J0bl9wcmV2JykuYWRkQ2xhc3NOYW1lKCdkaXNhYmxlZCcpOw0KCQkJCQlpZiAoIHRoaXMubV9iVHJhY2tOYXZpZ2F0aW9uICkNCgkJCQkJCSQoc3RyUGFnZVByZWZpeCArICdidG5fcHJldicpLmhyZWYgPSAnamF2YXNjcmlwdDp2b2lkKDApOyc7DQoJCQkJfQ0KDQoJCQkJaWYgKCB0aGlzLm1faUN1cnJlbnRQYWdlIDwgdGhpcy5tX2NNYXhQYWdlcyAtIDEgKQ0KCQkJCXsNCgkJCQkJJChzdHJQYWdlUHJlZml4ICsgJ2J0bl9uZXh0JykucmVtb3ZlQ2xhc3NOYW1lKCdkaXNhYmxlZCcpOw0KCQkJCQlpZiAoIHRoaXMubV9iVHJhY2tOYXZpZ2F0aW9uICkNCgkJCQkJCSQoc3RyUGFnZVByZWZpeCArICdidG5fbmV4dCcpLmhyZWYgPSBVcGRhdGVQYXJhbWV0ZXJJbkN1cnJlbnRVUkwoICdjdHAnLCB0aGlzLm1faUN1cnJlbnRQYWdlICsgMiwgWyd0c2NuJ10gKTsNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJJChzdHJQYWdlUHJlZml4ICsgJ2J0bl9uZXh0JykuYWRkQ2xhc3NOYW1lKCdkaXNhYmxlZCcpOw0KCQkJCQlpZiAoIHRoaXMubV9iVHJhY2tOYXZpZ2F0aW9uICkNCgkJCQkJCSQoc3RyUGFnZVByZWZpeCArICdidG5fbmV4dCcpLmhyZWYgPSAnamF2YXNjcmlwdDp2b2lkKDApOyc7DQoJCQkJfQ0KDQoJCQkJdmFyIGVsUGFnZUxpbmtzID0gJChzdHJQYWdlUHJlZml4ICsgJ2xpbmtzJyk7DQoJCQkJZWxQYWdlTGlua3MudXBkYXRlKCcnKTsNCgkJCQkvLyB3ZSBhbHdheXMgc2hvdyBmaXJzdCwgbGFzdCwgKyAzIHBhZ2UgbGlua3MgY2xvc2VzdCB0byBjdXJyZW50IHBhZ2UNCgkJCQl2YXIgY1BhZ2VMaW5rc0FoZWFkQmVoaW5kID0gMjsNCgkJCQl2YXIgZmlyc3RQYWdlTGluayA9IE1hdGgubWF4KCB0aGlzLm1faUN1cnJlbnRQYWdlIC0gY1BhZ2VMaW5rc0FoZWFkQmVoaW5kLCAxICk7DQoJCQkJdmFyIGxhc3RQYWdlTGluayA9IE1hdGgubWluKCB0aGlzLm1faUN1cnJlbnRQYWdlICsgKGNQYWdlTGlua3NBaGVhZEJlaGluZCoyKSArICggZmlyc3RQYWdlTGluayAtIHRoaXMubV9pQ3VycmVudFBhZ2UgKSwgdGhpcy5tX2NNYXhQYWdlcyAtIDIgKTsNCg0KCQkJCWlmICggbGFzdFBhZ2VMaW5rIC0gdGhpcy5tX2lDdXJyZW50UGFnZSA8IGNQYWdlTGlua3NBaGVhZEJlaGluZCApDQoJCQkJCWZpcnN0UGFnZUxpbmsgPSBNYXRoLm1heCggdGhpcy5tX2lDdXJyZW50UGFnZSAtIChjUGFnZUxpbmtzQWhlYWRCZWhpbmQqMikgKyAoIGxhc3RQYWdlTGluayAtIHRoaXMubV9pQ3VycmVudFBhZ2UgKSwgMSApOw0KDQoJCQkJdGhpcy5BZGRQYWdlTGluayggZWxQYWdlTGlua3MsIDAgKTsNCgkJCQlpZiAoIGZpcnN0UGFnZUxpbmsgIT0gMSApDQoJCQkJCWVsUGFnZUxpbmtzLmluc2VydCggJyAuLi4gJyApOw0KDQoJCQkJZm9yICggdmFyIGlQYWdlID0gZmlyc3RQYWdlTGluazsgaVBhZ2UgPD0gbGFzdFBhZ2VMaW5rOyBpUGFnZSsrICkNCgkJCQl7DQoJCQkJCXRoaXMuQWRkUGFnZUxpbmsoIGVsUGFnZUxpbmtzLCBpUGFnZSApOw0KCQkJCX0NCg0KCQkJCWlmICggbGFzdFBhZ2VMaW5rICE9IHRoaXMubV9jTWF4UGFnZXMgLSAyICkNCgkJCQkJZWxQYWdlTGlua3MuaW5zZXJ0KCAnIC4uLiAnICk7DQoJCQkJdGhpcy5BZGRQYWdlTGluayggZWxQYWdlTGlua3MsIHRoaXMubV9jTWF4UGFnZXMgLSAxICk7DQoJCQl9DQoNCgkJCS8vIHVwZGF0ZSB0aGUgZHJvcGRvd24gbGlzdCB3aXRoIHRoZSB0b3RhbC4NCgkJCXZhciAkRHJvcGRvd25DdG4gPSAkSiggJyMnICsgc3RyUGFnZVByZWZpeCArICdkcm9wZG93bicpOw0KCQkJdmFyICRTZWxlY3QgPSAkRHJvcGRvd25DdG4uY2hpbGRyZW4oICdzZWxlY3QnICk7DQoNCgkJCWlmICggdHJ1ZSApDQoJCQl7DQoJCQkJaWYgKCAhJFNlbGVjdC5sZW5ndGggKQ0KCQkJCXsNCgkJCQkJJFNlbGVjdCA9ICRKKCc8c2VsZWN0Lz4nKTsNCgkJCQkJdmFyIF90aGlzID0gdGhpczsNCgkJCQkJJFNlbGVjdC5jaGFuZ2UoIGZ1bmN0aW9uKCkgew0KCQkJCQkJdmFyICRTZWxlY3QgPSAkSih0aGlzKTsNCgkJCQkJCV90aGlzLkdvVG9QYWdlKCAkU2VsZWN0LnZhbCgpICk7DQoJCQkJCX0pOw0KCQkJCQkkRHJvcGRvd25DdG4uYXBwZW5kKCAkU2VsZWN0ICk7DQoJCQkJfQ0KDQoJCQkJJFNlbGVjdC5lbXB0eSgpOw0KDQoJCQkJLy8gd2UgYWx3YXlzIHNob3cgZmlyc3QsIGxhc3QsICsgMyBwYWdlIGxpbmtzIGNsb3Nlc3QgdG8gY3VycmVudCBwYWdlDQoJCQkJdmFyIGZuQWRkUGFnZURyb3Bkb3duID0gZnVuY3Rpb24oIGlEcm9wZG93blBhZ2UgKQ0KCQkJCXsNCgkJCQkJJFNlbGVjdC5hcHBlbmQoICRKKCc8b3B0aW9uLz4nLCB7ICd2YWx1ZScgOiBpRHJvcGRvd25QYWdlIH0gKS50ZXh0KCBpRHJvcGRvd25QYWdlID49IDk5OSA/IHZfbnVtYmVyZm9ybWF0KCBpRHJvcGRvd25QYWdlICsgMSApIDogaURyb3Bkb3duUGFnZSArIDEpICk7DQoJCQkJfTsNCg0KCQkJCXZhciBjUGFnZUxpbmtzQWhlYWRCZWhpbmQgPSAxMDsNCgkJCQl2YXIgZmlyc3RQYWdlTGluayA9IE1hdGgubWF4KCB0aGlzLm1faUN1cnJlbnRQYWdlIC0gY1BhZ2VMaW5rc0FoZWFkQmVoaW5kLCAxICk7DQoJCQkJdmFyIGxhc3RQYWdlTGluayA9IE1hdGgubWluKCB0aGlzLm1faUN1cnJlbnRQYWdlICsgKGNQYWdlTGlua3NBaGVhZEJlaGluZCoyKSArICggZmlyc3RQYWdlTGluayAtIHRoaXMubV9pQ3VycmVudFBhZ2UgKSwgdGhpcy5tX2NNYXhQYWdlcyAtIDIgKTsNCg0KCQkJCWlmICggbGFzdFBhZ2VMaW5rIC0gdGhpcy5tX2lDdXJyZW50UGFnZSA8IGNQYWdlTGlua3NBaGVhZEJlaGluZCApDQoJCQkJCWZpcnN0UGFnZUxpbmsgPSBNYXRoLm1heCggdGhpcy5tX2lDdXJyZW50UGFnZSAtIChjUGFnZUxpbmtzQWhlYWRCZWhpbmQqMikgKyAoIGxhc3RQYWdlTGluayAtIHRoaXMubV9pQ3VycmVudFBhZ2UgKSwgMSApOw0KDQoJCQkJZm5BZGRQYWdlRHJvcGRvd24oIDAgKTsNCgkJCQlpZiAoIGZpcnN0UGFnZUxpbmsgIT0gMSApDQoJCQkJCSRTZWxlY3QuYXBwZW5kKCAkSignPG9wdGlvbi8+JywgeyAndmFsdWUnIDogJycsICdkaXNhYmxlZCc6MSB9ICkudGV4dCgnLi4uJykgKTsNCg0KCQkJCWZvciAoIHZhciBpUGFnZSA9IGZpcnN0UGFnZUxpbms7IGlQYWdlIDw9IGxhc3RQYWdlTGluazsgaVBhZ2UrKyApDQoJCQkJew0KCQkJCQlmbkFkZFBhZ2VEcm9wZG93biggaVBhZ2UgKTsNCgkJCQl9DQoNCgkJCQlpZiAoIGxhc3RQYWdlTGluayAhPSB0aGlzLm1fY01heFBhZ2VzIC0gMiApDQoJCQkJCSRTZWxlY3QuYXBwZW5kKCAkSignPG9wdGlvbi8+JywgeyAndmFsdWUnIDogJycsICdkaXNhYmxlZCc6MSB9ICkudGV4dCgnLi4uJykgKTsNCgkJCQlmbkFkZFBhZ2VEcm9wZG93biggdGhpcy5tX2NNYXhQYWdlcyAtIDEgKTsNCgkJCX0NCg0KCQkJJFNlbGVjdC52YWwoIHRoaXMubV9pQ3VycmVudFBhZ2UgKTsNCgkJfQ0KDQoJCXRoaXMubV9jRHJvcGRvd25QYWdlcyA9IHRoaXMubV9jTWF4UGFnZXM7DQoJfSwNCg0KCUFkZFBhZ2VMaW5rOiBmdW5jdGlvbiggZWxQYWdlTGlua3MsIGlQYWdlICkNCgl7DQoJCXZhciBlbDsNCgkJaWYgKCB0aGlzLm1fYlRyYWNrTmF2aWdhdGlvbiApDQoJCQllbCA9IG5ldyBFbGVtZW50KCAnYScsIHsnY2xhc3MnOiAnY29tbWVudHRocmVhZF9wYWdlbGluaycsICdocmVmJzogVXBkYXRlUGFyYW1ldGVySW5DdXJyZW50VVJMKCAnY3RwJywgaVBhZ2UgKyAxLCBbJ3RzY24nXSApIH0gKTsNCgkJZWxzZQ0KCQkJZWwgPSBuZXcgRWxlbWVudCggJ3NwYW4nLCB7J2NsYXNzJzogJ2NvbW1lbnR0aHJlYWRfcGFnZWxpbmsnIH0gKTsNCg0KCQllbC51cGRhdGUoIChpUGFnZSArIDEpICk7DQoNCgkJdmFyIGZuR29Ub1BhZ2UgPSB0aGlzLkdvVG9QYWdlLmJpbmQoIHRoaXMsIGlQYWdlICk7DQoNCgkJaWYgKCBpUGFnZSA9PSB0aGlzLm1faUN1cnJlbnRQYWdlICkNCgkJCWVsLmFkZENsYXNzTmFtZSggJ2FjdGl2ZScgKTsNCgkJZWxzZQ0KCQkJZWwub2JzZXJ2ZSggJ2NsaWNrJywgIGZ1bmN0aW9uKGUpIHsgZS5zdG9wKCk7IGZuR29Ub1BhZ2UoKTsgfSApOw0KDQoJCWVsUGFnZUxpbmtzLmluc2VydCggZWwgKTsNCgkJZWxQYWdlTGlua3MuaW5zZXJ0KCAnICcgKTsNCgl9LA0KDQoJU3Vic2NyaWJlOiBmdW5jdGlvbiggZm5PblN1Y2Nlc3MsIGZuT25GYWlsICkNCgl7DQoJCXZhciBwYXJhbXMgPSB0aGlzLlBhcmFtZXRlcnNXaXRoRGVmYXVsdHMoKTsNCgkJdGhpcy5tXyRTdWJzY3JpYmVDaGVja2JveC5hZGRDbGFzcygnd2FpdGluZycpOw0KDQoJCXZhciBfdGhpcyA9IHRoaXM7DQoJCSRKLnBvc3QoIHRoaXMuR2V0QWN0aW9uVVJMKCAnc3Vic2NyaWJlJyApLCBwYXJhbXMgKQ0KCQkJLmRvbmUoIGZ1bmN0aW9uKCkgew0KCQkJCV90aGlzLk9uU3Vic2NyaXB0aW9uQ2hhbmdlKCB0cnVlLCBmbk9uU3VjY2VzcyApOw0KCQkJfSkNCgkJCS5mYWlsKCBmbk9uRmFpbCApDQoJCQkuYWx3YXlzKCBmdW5jdGlvbigpIHsgX3RoaXMubV8kU3Vic2NyaWJlQ2hlY2tib3gucmVtb3ZlQ2xhc3MoJ3dhaXRpbmcnICkgfSApOw0KCX0sDQoNCglVbnN1YnNjcmliZTogZnVuY3Rpb24oIGZuT25TdWNjZXNzLCBmbk9uRmFpbCApDQoJew0KCQl2YXIgcGFyYW1zID0gdGhpcy5QYXJhbWV0ZXJzV2l0aERlZmF1bHRzKCk7DQoJCXRoaXMubV8kU3Vic2NyaWJlQ2hlY2tib3guYWRkQ2xhc3MoJ3dhaXRpbmcnKTsNCg0KCQl2YXIgX3RoaXMgPSB0aGlzOw0KCQkkSi5wb3N0KCB0aGlzLkdldEFjdGlvblVSTCggJ3Vuc3Vic2NyaWJlJyApLCBwYXJhbXMgKQ0KCQkJLmRvbmUoIGZ1bmN0aW9uKCkgew0KCQkJCV90aGlzLk9uU3Vic2NyaXB0aW9uQ2hhbmdlKCBmYWxzZSwgZm5PblN1Y2Nlc3MgKTsNCgkJCX0pDQoJCQkuZmFpbCggZm5PbkZhaWwgKQ0KCQkJLmFsd2F5cyggZnVuY3Rpb24oKSB7IF90aGlzLm1fJFN1YnNjcmliZUNoZWNrYm94LnJlbW92ZUNsYXNzKCd3YWl0aW5nJyApIH0gKTsNCgl9LA0KDQoJbV9yZ1N1YnNjcmlwdGlvblVwZGF0ZUhhbmRsZXJzOiBudWxsLA0KDQoJQmluZFN1YnNjcmliZUJ1dHRvbnM6IGZ1bmN0aW9uKCBlbEJ0blN1YnNjcmliZSwgZWxCdG5VbnN1YnNjcmliZSApDQoJew0KCQl2YXIgX3RoaXMgPSB0aGlzOw0KDQoJCWlmICggIXRoaXMubV9yZ1N1YnNjcmlwdGlvblVwZGF0ZUhhbmRsZXJzICkNCgkJCXRoaXMubV9yZ1N1YnNjcmlwdGlvblVwZGF0ZUhhbmRsZXJzID0gW107DQoNCgkJdGhpcy5tX3JnU3Vic2NyaXB0aW9uVXBkYXRlSGFuZGxlcnMucHVzaCggZnVuY3Rpb24oKSB7DQoJCQlpZiAoIF90aGlzLm1fYlN1YnNjcmliZWQgKQ0KCQkJew0KCQkJCSRKKGVsQnRuU3Vic2NyaWJlKS5oaWRlKCk7DQoJCQkJJEooZWxCdG5VbnN1YnNjcmliZSkuc2hvdygpOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRKKGVsQnRuU3Vic2NyaWJlKS5zaG93KCk7DQoJCQkJJEooZWxCdG5VbnN1YnNjcmliZSkuaGlkZSgpOw0KCQkJfQ0KCQl9ICk7DQoNCgkJJEooZWxCdG5TdWJzY3JpYmUpLmNsaWNrKCBmdW5jdGlvbigpIHsNCgkJCV90aGlzLlN1YnNjcmliZSggZnVuY3Rpb24oKSB7DQoJCQkJU2hvd0FsZXJ0RGlhbG9nKCdTdWJzY3JpYmUgdG8gdGhyZWFkJywgJ1lvdVwnbGwgcmVjZWl2ZSBhIGNvbW1lbnQgbm90aWZpY2F0aW9uIHdoZW5ldmVyIHNvbWVvbmUgcmVwbGllcyB0byB0aGlzIHRocmVhZC4nKTsNCgkJCX0sIGZ1bmN0aW9uKCkgew0KCQkJCVNob3dBbGVydERpYWxvZygnU3Vic2NyaWJlIHRvIHRocmVhZCcsICdUaGVyZSB3YXMgYSBwcm9ibGVtIHVwZGF0aW5nIHlvdXIgc3Vic2NyaXB0aW9uLiAgUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nKTsNCgkJCX0pOw0KCQl9KTsNCg0KCQkkSihlbEJ0blVuc3Vic2NyaWJlKS5jbGljayggZnVuY3Rpb24oKSB7DQoJCQlfdGhpcy5VbnN1YnNjcmliZSggZnVuY3Rpb24oKSB7DQoJCQkJU2hvd0FsZXJ0RGlhbG9nKCdVbnN1YnNjcmliZSBmcm9tIHRocmVhZCcsICdZb3VcJ2xsIG5vIGxvbmdlciByZWNlaXZlIGNvbW1lbnQgbm90aWZpY2F0aW9ucyBmcm9tIHRoaXMgdGhyZWFkLicpOw0KCQkJfSwgZnVuY3Rpb24oKSB7DQoJCQkJU2hvd0FsZXJ0RGlhbG9nKCdVbnN1YnNjcmliZSBmcm9tIHRocmVhZCcsICdUaGVyZSB3YXMgYSBwcm9ibGVtIHVwZGF0aW5nIHlvdXIgc3Vic2NyaXB0aW9uLiAgUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nKTsNCgkJCX0pOw0KCQl9KTsNCg0KCQl0aGlzLlVwZGF0ZVN1YnNjcmlwdGlvbkRpc3BsYXkoKTsNCgl9LA0KDQoJT25TdWJzY3JpcHRpb25DaGFuZ2U6IGZ1bmN0aW9uKCBiU3Vic2NyaWJlZCwgZm5Qcm94eSwgdHJhbnNwb3J0ICkNCgl7DQoJCXRoaXMubV9iU3Vic2NyaWJlZCA9IGJTdWJzY3JpYmVkOw0KDQoJCWlmICggZm5Qcm94eSApDQoJCQlmblByb3h5KCB0cmFuc3BvcnQgKTsNCg0KCQl0aGlzLlVwZGF0ZVN1YnNjcmlwdGlvbkRpc3BsYXkoKTsNCgl9LA0KDQoJVXBkYXRlU3Vic2NyaXB0aW9uRGlzcGxheTogZnVuY3Rpb24oKQ0KCXsNCgkJaWYgKCB0aGlzLm1fcmdTdWJzY3JpcHRpb25VcGRhdGVIYW5kbGVycyAmJiB0aGlzLm1fcmdTdWJzY3JpcHRpb25VcGRhdGVIYW5kbGVycy5sZW5ndGggKQ0KCQl7DQoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLm1fcmdTdWJzY3JpcHRpb25VcGRhdGVIYW5kbGVycy5sZW5ndGg7IGkrKyApDQoJCQkJKHRoaXMubV9yZ1N1YnNjcmlwdGlvblVwZGF0ZUhhbmRsZXJzW2ldKSgpOw0KCQl9DQoNCgkJaWYgKCB0aGlzLm1fYlN1YnNjcmliZWQgKQ0KCQkJdGhpcy5tXyRTdWJzY3JpYmVDaGVja2JveC5hZGRDbGFzcygnY2hlY2tlZCcpOw0KCQllbHNlDQoJCQl0aGlzLm1fJFN1YnNjcmliZUNoZWNrYm94LnJlbW92ZUNsYXNzKCdjaGVja2VkJyk7DQoNCgkJdmFyIGVsRm9ydW1TdWJzY3JpYmUgPSAkKCdmb3J1bV9zdWJzY3JpYmVfJyArIHRoaXMubV9yZ0NvbW1lbnREYXRhWydmZWF0dXJlMiddICk7DQoJCXZhciBlbEZvcnVtVW5zdWJzY3JpYmUgPSAkKCdmb3J1bV91bnN1YnNjcmliZV8nICsgdGhpcy5tX3JnQ29tbWVudERhdGFbJ2ZlYXR1cmUyJ10gKTsNCgkJaWYgKCBlbEZvcnVtU3Vic2NyaWJlICYmIGVsRm9ydW1VbnN1YnNjcmliZSApDQoJCXsNCgkJCWlmICggdGhpcy5tX2JTdWJzY3JpYmVkICkNCgkJCXsNCgkJCQllbEZvcnVtU3Vic2NyaWJlLmhpZGUoKTsNCgkJCQllbEZvcnVtVW5zdWJzY3JpYmUuc2hvdygpOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCWVsRm9ydW1TdWJzY3JpYmUuc2hvdygpOw0KCQkJCWVsRm9ydW1VbnN1YnNjcmliZS5oaWRlKCk7DQoJCQl9DQoJCX0NCgl9LA0KDQoJT25BdXRvc3Vic2NyaWJlVG9nZ2xlOiBmdW5jdGlvbigpDQoJew0KCQl2YXIgZWxBdXRvc3Vic2NyaWJlID0gJCggJ2NvbW1lbnR0aHJlYWRfJyArIHRoaXMubV9zdHJOYW1lICsgJ19hdXRvc3Vic2NyaWJlJyApOw0KCQlpZiAoIGVsQXV0b3N1YnNjcmliZSApDQoJCXsNCgkJCWlmICggZWxBdXRvc3Vic2NyaWJlLmNoZWNrZWQgKQ0KCQkJCVNldFZhbHVlTG9jYWxTdG9yYWdlKCAnZm9ydW1fYXV0b3N1YnNjcmliZScsIHRydWUgKTsNCgkJCWVsc2UNCgkJCQlVbnNldFZhbHVlTG9jYWxTdG9yYWdlKCAnZm9ydW1fYXV0b3N1YnNjcmliZScgKTsNCgkJfQ0KCX0NCg0KfSApOw0KQ0NvbW1lbnRUaHJlYWQuUkVOREVSX05FV1BPU1QgPSAxOw0KQ0NvbW1lbnRUaHJlYWQuUkVOREVSX0dPVE9QQUdFID0gMjsNCkNDb21tZW50VGhyZWFkLlJFTkRFUl9HT1RPQ09NTUVOVCA9IDM7DQpDQ29tbWVudFRocmVhZC5SRU5ERVJfREVMRVRFRFBPU1QgPSA0Ow0KQ0NvbW1lbnRUaHJlYWQuUkVOREVSX0dPVE9QQUdFX0hBU0hDSEFOR0UgPSA1Ow0KQ0NvbW1lbnRUaHJlYWQuUkVOREVSX0dPVE9DT01NRU5UX0hBU0hDSEFOR0UgPSA2Ow0KDQovLyBzdGF0aWMgYWNjZXNzb3INCkNDb21tZW50VGhyZWFkLkRlbGV0ZUNvbW1lbnQgPSBmdW5jdGlvbiggaWQsIGdpZGNvbW1lbnQgKQ0Kew0KCWlmICggZ19yZ0NvbW1lbnRUaHJlYWRzW2lkXSApDQoJCWdfcmdDb21tZW50VGhyZWFkc1tpZF0uRGVsZXRlQ29tbWVudCggZ2lkY29tbWVudCApOw0KfTsNCkNDb21tZW50VGhyZWFkLlVuRGVsZXRlQ29tbWVudCA9IGZ1bmN0aW9uKCBpZCwgZ2lkY29tbWVudCApDQp7DQoJaWYgKCBnX3JnQ29tbWVudFRocmVhZHNbaWRdICkNCgkJZ19yZ0NvbW1lbnRUaHJlYWRzW2lkXS5EZWxldGVDb21tZW50KCBnaWRjb21tZW50LCB0cnVlICk7DQp9Ow0KQ0NvbW1lbnRUaHJlYWQuTWFya1NwYW0gPSBmdW5jdGlvbiggaWQsIGdpZGNvbW1lbnQsIGF1dGhvckFjY291bnRJRCApDQp7DQoJaWYgKCBnX3JnQ29tbWVudFRocmVhZHNbaWRdICkNCgkJZ19yZ0NvbW1lbnRUaHJlYWRzW2lkXS5NYXJrU3BhbSggZ2lkY29tbWVudCwgYXV0aG9yQWNjb3VudElEICk7DQp9Ow0KQ0NvbW1lbnRUaHJlYWQuQ2xlYXJDb250ZW50Q2hlY2tGbGFnID0gZnVuY3Rpb24oIGlkLCBnaWRjb21tZW50ICkNCnsNCglpZiAoIGdfcmdDb21tZW50VGhyZWFkc1tpZF0gKQ0KCQlnX3JnQ29tbWVudFRocmVhZHNbaWRdLkNsZWFyQ29udGVudENoZWNrRmxhZyggZ2lkY29tbWVudCApOw0KfTsNCi8vIHN0YXRpYyBhY2Nlc3Nvcg0KQ0NvbW1lbnRUaHJlYWQuRWRpdENvbW1lbnQgPSBmdW5jdGlvbiggaWQsIGdpZGNvbW1lbnQgKQ0Kew0KCWlmICggZ19yZ0NvbW1lbnRUaHJlYWRzW2lkXSApDQoJCWdfcmdDb21tZW50VGhyZWFkc1tpZF0uRGlzcGxheUVkaXRDb21tZW50KCBnaWRjb21tZW50ICk7DQp9Ow0KLy8gc3RhdGljIGFjY2Vzc29yDQpDQ29tbWVudFRocmVhZC5Wb3RlVXAgPSBmdW5jdGlvbiggaWQgKQ0Kew0KCWlmICggZ19yZ0NvbW1lbnRUaHJlYWRzW2lkXSApDQoJCWdfcmdDb21tZW50VGhyZWFkc1tpZF0uVm90ZVVwKCk7DQp9Ow0KLy8gc3RhdGljIGFjY2Vzc29yDQpDQ29tbWVudFRocmVhZC5VcGRhdGVBbnN3ZXIgPSBmdW5jdGlvbiggaWQsIGdpZGNvbW1lbnQsIGJFeGlzdGluZyApDQp7DQoJaWYgKCBnX3JnQ29tbWVudFRocmVhZHNbaWRdICkNCgkJZ19yZ0NvbW1lbnRUaHJlYWRzW2lkXS5VcGRhdGVBbnN3ZXIoIGdpZGNvbW1lbnQsIGJFeGlzdGluZyApOw0KfTsNCkNDb21tZW50VGhyZWFkLkZvcm1hdHRpbmdIZWxwUG9wdXAgPSBmdW5jdGlvbiggc3RyQ29tbWVudFRocmVhZFR5cGUgKQ0Kew0KCSRKLmdldCggJ2h0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL2NvbW1lbnQvJyArIHN0ckNvbW1lbnRUaHJlYWRUeXBlICsgJy9mb3JtYXR0aW5naGVscCcsIHthamF4OjF9ICkuZG9uZSggZnVuY3Rpb24oZGF0YSkgew0KCQlTaG93QWxlcnREaWFsb2coICdUZXh0IEZvcm1hdHRpbmcnLCBkYXRhICk7DQoJfSk7DQp9Ow0KQ0NvbW1lbnRUaHJlYWQuU2hvd0RlbGV0ZWRDb21tZW50ID0gZnVuY3Rpb24oIGlkLCBnaWRjb21tZW50ICkNCnsNCgl2YXIgZWxDb21tZW50ID0gJCgnY29tbWVudF8nICsgZ2lkY29tbWVudCk7DQoJdmFyIGVsRGVsZXRlZENvbW1lbnQgPSAkKCdkZWxldGVkX2NvbW1lbnRfJyArIGdpZGNvbW1lbnQgKTsNCgllbENvbW1lbnQuc2hvdygpOw0KCWVsRGVsZXRlZENvbW1lbnQuaGlkZSgpOw0KfTsNCkNDb21tZW50VGhyZWFkLkhpZGVBbmRSZXBvcnQgPSBmdW5jdGlvbiggaWQsIGdpZGNvbW1lbnQsIGJIaWRlICkNCnsNCglpZiAoIGdfcmdDb21tZW50VGhyZWFkc1tpZF0gKQ0KCQlnX3JnQ29tbWVudFRocmVhZHNbaWRdLkhpZGVBbmRSZXBvcnQoIGdpZGNvbW1lbnQsIGJIaWRlICk7DQp9Ow0KQ0NvbW1lbnRUaHJlYWQuU2hvd0hpZGRlbkNvbW1lbnQgPSBmdW5jdGlvbiggaWQsIGdpZGNvbW1lbnQgKQ0Kew0KCXZhciBlbENvbW1lbnQgPSAkKCdjb21tZW50XycgKyBnaWRjb21tZW50KTsNCgl2YXIgZWxIaWRkZW5Db21tZW50ID0gJCgnaGlkZGVuX2NvbW1lbnRfJyArIGdpZGNvbW1lbnQgKTsNCgllbENvbW1lbnQuc2hvdygpOw0KCWVsSGlkZGVuQ29tbWVudC5oaWRlKCk7DQp9Ow0KDQoNCmZ1bmN0aW9uIGxldmVuc2h0ZWluKCBhLCBiICkNCnsNCgl2YXIgYWxlbiA9IGEubGVuZ3RoOw0KCXZhciBibGVuID0gYi5sZW5ndGg7DQoJaWYgKGFsZW4gPT09IDApIHJldHVybiBibGVuOw0KCWlmIChibGVuID09PSAwKSByZXR1cm4gYWxlbjsNCgl2YXIgdG1wLCBpLCBqLCBwcmV2LCB2YWwsIHJvdywgbWEsIG1iLCBtYywgbWQsIGJwcmV2Ow0KDQoJaWYgKGFsZW4gPiBibGVuKSB7DQoJCXRtcCA9IGE7DQoJCWEgPSBiOw0KCQliID0gdG1wOw0KCX0NCg0KCXJvdyA9IG5ldyBJbnQ4QXJyYXkoYWxlbisxKTsNCgkvLyBpbml0IHRoZSByb3cNCglmb3IgKGkgPSAwOyBpIDw9IGFsZW47IGkrKykgew0KCQlyb3dbaV0gPSBpOw0KCX0NCg0KCS8vIGZpbGwgaW4gdGhlIHJlc3QNCglmb3IgKGkgPSAxOyBpIDw9IGJsZW47IGkrKykgew0KCQlwcmV2ID0gaTsNCgkJYnByZXYgPSBiW2kgLSAxXQ0KCQlmb3IgKGogPSAxOyBqIDw9IGFsZW47IGorKykgew0KCQkJaWYgKGJwcmV2ID09PSBhW2ogLSAxXSkgew0KCQkJCXZhbCA9IHJvd1tqLTFdOw0KCQkJfSBlbHNlIHsNCgkJCQltYSA9IHByZXYrMTsNCgkJCQltYiA9IHJvd1tqXSsxOw0KCQkJCW1jID0gbWEgLSAoKG1hIC0gbWIpICYgKChtYiAtIG1hKSA+PiA3KSk7DQoJCQkJbWQgPSByb3dbai0xXSsxOw0KCQkJCXZhbCA9IG1jIC0gKChtYyAtIG1kKSAmICgobWQgLSBtYykgPj4gNykpOw0KCQkJfQ0KCQkJcm93W2ogLSAxXSA9IHByZXY7DQoJCQlwcmV2ID0gdmFsOw0KCQl9DQoJCXJvd1thbGVuXSA9IHByZXY7DQoJfQ0KCXJldHVybiByb3dbYWxlbl07DQp9Ow0KDQoNCkNHYW1lU2VsZWN0b3IgPSBDbGFzcy5jcmVhdGUoIHsNCgliSGF2ZVN1Z2dlc3Rpb25zOiBmYWxzZSwNCgllbElucHV0OiBudWxsLA0KCWVsU3VnZ2VzdGlvbnNDdG46IG51bGwsDQoJZWxTdWdnZXN0aW9uczogbnVsbCwNCglmbk9uQ2xpY2s6IG51bGwsDQoNCgllbEZvY3VzOiBudWxsLA0KCW5BcHBJREZvY3VzOiAwLA0KDQoJaW5pdGlhbGl6ZTogZnVuY3Rpb24oIGVsSW5wdXQsIGVsU3VnZ2VzdGlvbnNDdG4sIGVsU3VnZ2VzdGlvbnMsIGZuT25DbGljayApDQoJew0KCQl0aGlzLmVsSW5wdXQgPSBlbElucHV0Ow0KCQl0aGlzLmVsU3VnZ2VzdGlvbnNDdG4gPSBlbFN1Z2dlc3Rpb25zQ3RuOw0KCQl0aGlzLmVsU3VnZ2VzdGlvbnMgPSBlbFN1Z2dlc3Rpb25zOw0KDQoJCWlmICggIXRoaXMuZWxTdWdnZXN0aW9ucyAmJiAhdGhpcy5lbFN1Z2dlc3Rpb25zQ3RuICkNCgkJew0KCQkJLy8gYnVpbGQgdGhlbQ0KCQkJdGhpcy5lbFN1Z2dlc3Rpb25zID0gbmV3IEVsZW1lbnQoICdkaXYnLCB7J2NsYXNzJzogJ3NoYWRvd19jb250ZW50IHBvcHVwX2JvZHkgcG9wdXBfbWVudScgfSApOw0KCQkJdGhpcy5lbFN1Z2dlc3Rpb25zQ3RuID0gbmV3IEVsZW1lbnQoICdkaXYnLCB7J2NsYXNzJzogJ3BvcHVwX2Jsb2NrJywgc3R5bGU6ICdkaXNwbGF5OiBub25lOyB6LWluZGV4OiAxMjAwOyBwb3NpdGlvbjogZml4ZWQ7IHBhZGRpbmc6IDA7IG1hcmdpbjogMDsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGJvcmRlcjogbm9uZScgfSApOw0KCQkJdGhpcy5lbFN1Z2dlc3Rpb25zQ3RuLnBvcG92ZXIgPSAnbWFudWFsJzsNCgkJCXRoaXMuZWxTdWdnZXN0aW9uc0N0bi51cGRhdGUoICc8ZGl2IGNsYXNzPSJzaGFkb3dfdWwiPjwvZGl2PjxkaXYgY2xhc3M9InNoYWRvd190b3AiPjwvZGl2PjxkaXYgY2xhc3M9InNoYWRvd191ciI+PC9kaXY+PGRpdiBjbGFzcz0ic2hhZG93X2xlZnQiPjwvZGl2PjxkaXYgY2xhc3M9InNoYWRvd19yaWdodCI+PC9kaXY+PGRpdiBjbGFzcz0ic2hhZG93X2JsIj48L2Rpdj48ZGl2IGNsYXNzPSJzaGFkb3dfYm90dG9tIj48L2Rpdj48ZGl2IGNsYXNzPSJzaGFkb3dfYnIiPjwvZGl2PicgKTsNCgkJCXRoaXMuZWxTdWdnZXN0aW9uc0N0bi5pbnNlcnQoIHtib3R0b206IHRoaXMuZWxTdWdnZXN0aW9ucyB9ICk7DQoJCQllbElucHV0LnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIHRoaXMuZWxTdWdnZXN0aW9uc0N0biApOw0KCQl9DQoNCgkJdGhpcy5mbk9uQ2xpY2sgPSBmdW5jdGlvbiggU2VsZWN0b3IsIHJnQXBwRGF0YSApIHsgU2VsZWN0b3IuSGlkZVN1Z2dlc3Rpb25zKCk7IGZuT25DbGljayggU2VsZWN0b3IsIHJnQXBwRGF0YSApOyB9Ow0KDQoJCW5ldyBGb3JtLkVsZW1lbnQuT2JzZXJ2ZXIoIGVsSW5wdXQsIDAuMiwgdGhpcy5PbkdhbWVTZWxlY3RUZXh0RW50cnkuYmluZCh0aGlzKSApOw0KCQllbElucHV0Lm9ic2VydmUoICdibHVyJywgdGhpcy5IaWRlU3VnZ2VzdGlvbnMuYmluZCh0aGlzKSApOw0KCQllbElucHV0Lm9ic2VydmUoICdmb2N1cycsIHRoaXMuU2hvd1N1Z2dlc3Rpb25zLmJpbmQodGhpcykgKTsNCgkJZWxJbnB1dC5vYnNlcnZlKCAna2V5ZG93bicsIHRoaXMuT25HYW1lU2VsZWN0S2V5RG93bi5iaW5kQXNFdmVudExpc3RlbmVyKCB0aGlzLCBlbElucHV0ICkgKTsNCgl9LA0KDQoJU2hvd1N1Z2dlc3Rpb25zOiBmdW5jdGlvbigpDQoJew0KCQlpZiAoICF0aGlzLmVsU3VnZ2VzdGlvbnNDdG4udmlzaWJsZSgpICYmIHRoaXMuYkhhdmVTdWdnZXN0aW9ucyApDQoJCXsNCgkJCUFsaWduTWVudSggdGhpcy5lbElucHV0LCB0aGlzLmVsU3VnZ2VzdGlvbnNDdG4sICdsZWZ0JywgJ2JvdHRvbScsIHRydWUgKTsNCgkJCVNob3dXaXRoRmFkZSggdGhpcy5lbFN1Z2dlc3Rpb25zQ3RuICk7DQoJCQl0cnkgew0KCQkJCXRoaXMuZWxTdWdnZXN0aW9uc0N0bi5zaG93UG9wb3ZlcigpOw0KCQkJfQ0KCQkJY2F0Y2goZSkge30NCgkJfQ0KCX0sDQoNCglIaWRlU3VnZ2VzdGlvbnM6IGZ1bmN0aW9uKCkNCgl7DQoJCUhpZGVXaXRoRmFkZSggdGhpcy5lbFN1Z2dlc3Rpb25zQ3RuICk7DQoJCXRyeSB7DQoJCQl0aGlzLmVsU3VnZ2VzdGlvbnNDdG4uaGlkZVBvcG92ZXIoKTsNCgkJfQ0KCQljYXRjaChlKSB7fQ0KCX0sDQoNCglPbkdhbWVTZWxlY3RUZXh0RW50cnk6IGZ1bmN0aW9uKCBlbElucHV0LCB2YWx1ZSApDQoJew0KCQlpZiAoIHZhbHVlICkNCgkJew0KCQkJbmV3IEFqYXguUmVxdWVzdCggJ2h0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL2FjdGlvbnMvU2VhcmNoQXBwcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KCB2YWx1ZSApLCB7DQoJCQkJbWV0aG9kOiAnZ2V0JywNCgkJCQlvblN1Y2Nlc3M6IHRoaXMuUmVjZWl2ZUdhbWVTZWxlY3RSZXNwb25zZS5iaW5kKCB0aGlzLCB2YWx1ZSApDQoJCQl9ICk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQl0aGlzLmVsU3VnZ2VzdGlvbnMudXBkYXRlKCcnKTsNCgkJCXRoaXMuYkhhdmVTdWdnZXN0aW9ucyA9IGZhbHNlOw0KCQl9DQoJfSwNCg0KCU9uR2FtZVNlbGVjdEtleURvd246IGZ1bmN0aW9uKCBldmVudCwgZWxlbSApDQoJew0KCQlpZiAoIGV2ZW50LmtleUNvZGUgPT0gRXZlbnQuS0VZX0VTQyApDQoJCXsNCgkJCXRoaXMuSGlkZVN1Z2dlc3Rpb25zKCk7DQoJCX0NCgkJZWxzZSBpZiAoIHRoaXMuYkhhdmVTdWdnZXN0aW9ucyApDQoJCXsNCgkJCXZhciBlbE5ld1N1Z2dlc3Rpb24gPSBudWxsOw0KDQoJCQlpZiAoIGV2ZW50LmtleUNvZGUgPT0gRXZlbnQuS0VZX1JFVFVSTiApDQoJCQl7DQoJCQkJaWYgKCB0aGlzLmVsRm9jdXMgKQ0KCQkJCXsNCgkJCQkJdGhpcy5lbEZvY3VzLmZuT25TZWxlY3QoKTsNCgkJCQkJZXZlbnQuc3RvcCgpOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2UgaWYgKCBldmVudC5rZXlDb2RlID09IEV2ZW50LktFWV9VUCApDQoJCQl7DQoJCQkJaWYgKCB0aGlzLmVsRm9jdXMgKQ0KCQkJCQllbE5ld1N1Z2dlc3Rpb24gPSB0aGlzLmVsRm9jdXMucHJldmlvdXMoKTsNCgkJCQlpZiAoICFlbE5ld1N1Z2dlc3Rpb24gKQ0KCQkJCQllbE5ld1N1Z2dlc3Rpb24gPSB0aGlzLmVsU3VnZ2VzdGlvbnMuc2VsZWN0KCI6bGFzdC1jaGlsZCIpWzBdOw0KCQkJfQ0KCQkJZWxzZSBpZiAoIGV2ZW50LmtleUNvZGUgPT0gRXZlbnQuS0VZX0RPV04gKQ0KCQkJew0KCQkJCWlmICggdGhpcy5lbEZvY3VzICkNCgkJCQkJZWxOZXdTdWdnZXN0aW9uID0gdGhpcy5lbEZvY3VzLm5leHQoKTsNCgkJCQlpZiAoICFlbE5ld1N1Z2dlc3Rpb24gKQ0KCQkJCQllbE5ld1N1Z2dlc3Rpb24gPSB0aGlzLmVsU3VnZ2VzdGlvbnMuY2hpbGRFbGVtZW50cygpWzBdOw0KCQkJfQ0KDQoJCQlpZiAoIGVsTmV3U3VnZ2VzdGlvbiApDQoJCQkJdGhpcy5TZXRGb2N1cyggZWxOZXdTdWdnZXN0aW9uICk7DQoJCX0NCgl9LA0KDQoJUmVjZWl2ZUdhbWVTZWxlY3RSZXNwb25zZTogZnVuY3Rpb24oIHZhbHVlLCB0cmFuc3BvcnQgKQ0KCXsNCgkJaWYgKCB0aGlzLmVsSW5wdXQudmFsdWUgPT0gdmFsdWUgKQ0KCQl7DQoNCgkJCXZhciBqc29uID0gdHJhbnNwb3J0LnJlc3BvbnNlSlNPTjsNCgkJCXRoaXMuVXBkYXRlTGlzdFdpdGhPcHRpb25zKCBqc29uICk7DQoNCgkJfQ0KCX0sDQoNCglVcGRhdGVMaXN0V2l0aE9wdGlvbnM6IGZ1bmN0aW9uKCByZ09wdGlvbnMgKQ0KCXsNCgkJdGhpcy5lbFN1Z2dlc3Rpb25zLnVwZGF0ZSgnJyk7DQoJCXRoaXMuZWxGb2N1cyA9IG51bGw7DQoJCWlmICggcmdPcHRpb25zICYmIHJnT3B0aW9ucy5sZW5ndGggKQ0KCQl7DQoJCQlmb3IgKCB2YXIgaT0wOyBpIDwgcmdPcHRpb25zLmxlbmd0aDsgaSsrICkNCgkJCXsNCgkJCQl2YXIgZWxTdWdnZXN0aW9uID0gbmV3IEVsZW1lbnQoICdkaXYnLCB7J2NsYXNzJzogJ2dhbWVfc3VnZ2VzdGlvbiBwb3B1cF9tZW51X2l0ZW0nIH0gKTsNCgkJCQkkSihlbFN1Z2dlc3Rpb24pLnRleHQoIHJnT3B0aW9uc1tpXS5uYW1lICk7DQoNCgkJCQllbFN1Z2dlc3Rpb24uYXBwaWQgPSByZ09wdGlvbnNbaV0uYXBwaWQ7DQoJCQkJZWxTdWdnZXN0aW9uLmZuT25TZWxlY3QgPSB0aGlzLmZuT25DbGljay5iaW5kKCBudWxsLCB0aGlzLCByZ09wdGlvbnNbaV0gKTsNCgkJCQllbFN1Z2dlc3Rpb24uYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgZWxTdWdnZXN0aW9uLmZuT25TZWxlY3QgKTsNCgkJCQllbFN1Z2dlc3Rpb24ub2JzZXJ2ZSggJ21vdXNlb3ZlcicsIHRoaXMuU2V0Rm9jdXMuYmluZCggdGhpcywgZWxTdWdnZXN0aW9uICkgKTsNCg0KCQkJCXRoaXMuZWxTdWdnZXN0aW9ucy5pbnNlcnQoIHtib3R0b206IGVsU3VnZ2VzdGlvbiB9ICk7DQoNCgkJCQlpZiAoIHRoaXMubkFwcElERm9jdXMgPT0gZWxTdWdnZXN0aW9uLmFwcGlkICkNCgkJCQkJdGhpcy5TZXRGb2N1cyggZWxTdWdnZXN0aW9uICk7DQoJCQl9DQoJCQl0aGlzLmJIYXZlU3VnZ2VzdGlvbnMgPSB0cnVlOw0KCQkJdGhpcy5TaG93U3VnZ2VzdGlvbnMoKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXRoaXMuYkhhdmVTdWdnZXN0aW9ucyA9IGZhbHNlOw0KCQkJdGhpcy5IaWRlU3VnZ2VzdGlvbnMoKTsNCgkJfQ0KCX0sDQoNCg0KCVNldEZvY3VzOiBmdW5jdGlvbiggZWxTdWdnZXN0aW9uICkNCgl7DQoJCWlmICggdGhpcy5lbEZvY3VzICkNCgkJCXRoaXMuZWxGb2N1cy5yZW1vdmVDbGFzc05hbWUoICdmb2N1cycgKTsNCg0KCQl0aGlzLmVsRm9jdXMgPSBlbFN1Z2dlc3Rpb247DQoJCXRoaXMubkFwcElERm9jdXMgPSBlbFN1Z2dlc3Rpb24uYXBwaWQ7DQoJCWVsU3VnZ2VzdGlvbi5hZGRDbGFzc05hbWUoICdmb2N1cycgKTsNCgl9DQoNCg0KfSApOw0KDQpDR2FtZVNlbGVjdG9yV29ya3Nob3BHYW1lcyA9IENsYXNzLmNyZWF0ZSggQ0dhbWVTZWxlY3Rvciwgew0KCU9uR2FtZVNlbGVjdFRleHRFbnRyeTogZnVuY3Rpb24oIGVsSW5wdXQsIHZhbHVlICkNCgl7DQoJCWlmICggdmFsdWUgKQ0KCQl7DQoJCQluZXcgQWpheC5SZXF1ZXN0KCAnaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vd29ya3Nob3AvYWpheGZpbmR3b3Jrc2hvcHMvP3NlYXJjaFRleHQ9JyArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKSwgew0KCQkJCW1ldGhvZDogJ2dldCcsDQoJCQkJb25TdWNjZXNzOiB0aGlzLlJlY2VpdmVHYW1lU2VsZWN0UmVzcG9uc2UuYmluZCggdGhpcywgdmFsdWUgKQ0KCQkJfSApOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJdGhpcy5lbFN1Z2dlc3Rpb25zLnVwZGF0ZSgnJyk7DQoJCQl0aGlzLmJIYXZlU3VnZ2VzdGlvbnMgPSBmYWxzZTsNCgkJfQ0KCX0NCn0gKTsNCg0KQ0dhbWVTZWxlY3Rvck93bmVkR2FtZXMgPSBDbGFzcy5jcmVhdGUoIENHYW1lU2VsZWN0b3IsIHsNCg0KCW1fYk93bmVkR2FtZXNSZWFkeTogZmFsc2UsDQoNCglpbml0aWFsaXplOiBmdW5jdGlvbiggJHN1cGVyLCBlbElucHV0LCBlbFN1Z2dlc3Rpb25zQ3RuLCBlbFN1Z2dlc3Rpb25zLCBmbk9uQ2xpY2sgKQ0KCXsNCgkJJHN1cGVyKCBlbElucHV0LCBlbFN1Z2dlc3Rpb25zQ3RuLCBlbFN1Z2dlc3Rpb25zLCBmbk9uQ2xpY2sgKTsNCgkJQ0dhbWVTZWxlY3Rvck93bmVkR2FtZXMuTG9hZE93bmVkR2FtZXMoIHRoaXMuT25Pd25lZEdhbWVzUmVhZHkuYmluZCggdGhpcyApICk7DQoJfSwNCg0KCU9uT3duZWRHYW1lc1JlYWR5OiBmdW5jdGlvbigpDQoJew0KCQl0aGlzLm1fYk93bmVkR2FtZXNSZWFkeSA9IHRydWU7DQoJCXRoaXMuT25HYW1lU2VsZWN0VGV4dEVudHJ5KCB0aGlzLmVsSW5wdXQsIHRoaXMuZWxJbnB1dC52YWx1ZSApOw0KCX0sDQoNCglPbkdhbWVTZWxlY3RUZXh0RW50cnk6IGZ1bmN0aW9uKCBlbElucHV0LCB2YWx1ZSApDQoJew0KCQlpZiAoIHZhbHVlICkNCgkJew0KCQkJaWYgKCAhdGhpcy5tX2JPd25lZEdhbWVzUmVhZHkgKQ0KCQkJew0KCQkJCXRoaXMuZWxTdWdnZXN0aW9ucy51cGRhdGUoICc8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IHdpZHRoOiAyMDBweDsgcGFkZGluZzogNXB4IDA7Ij48aW1nIHNyYz0iaHR0cHM6Ly9jb21tdW5pdHkuYWthbWFpLnN0ZWFtc3RhdGljLmNvbS9wdWJsaWMvaW1hZ2VzL2xvZ2luL3Rocm9iYmVyLmdpZiI+PC9kaXY+JyApOw0KCQkJCXRoaXMuYkhhdmVTdWdnZXN0aW9ucyA9IHRydWU7DQoJCQkJdGhpcy5TaG93U3VnZ2VzdGlvbnMoKTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQl2YXIgc3RyU2VhcmNoU3RyaW5nID0gdmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKTsNCgkJCQl2YXIgcmdUZXJtcyA9IHN0clNlYXJjaFN0cmluZy5zcGxpdCggJyAnICk7DQoJCQkJdmFyIHJnUmVnZXggPSBbXTsNCgkJCQlmb3IgKCB2YXIgaVRlcm0gPSAwOyBpVGVybSA8IHJnVGVybXMubGVuZ3RoOyBpVGVybSsrICkNCgkJCQl7DQoJCQkJCXZhciB0ZXJtID0gVl9Fc2NhcGVSZWdFeHAoIHJnVGVybXNbaVRlcm1dLCAnaScgKTsNCgkJCQkJcmdSZWdleC5wdXNoKCBuZXcgUmVnRXhwKCB0ZXJtICkgKTsNCgkJCQl9DQoJCQkJdmFyIHJnTWF0Y2hpbmdHYW1lcyA9IFtdOw0KCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IENHYW1lU2VsZWN0b3JPd25lZEdhbWVzLnNfcmdPd25lZEdhbWVzLmxlbmd0aDsgaSsrICkNCgkJCQl7DQoJCQkJCXZhciBnYW1lID0gQ0dhbWVTZWxlY3Rvck93bmVkR2FtZXMuc19yZ093bmVkR2FtZXNbaV07DQoJCQkJCWlmICggIWdhbWUubmFtZSB8fCAhZ2FtZS5uYW1lX25vcm1hbGl6ZWQgKQ0KCQkJCQkJY29udGludWU7DQoNCgkJCQkJdmFyIGJNYXRjaCA9IHRydWU7DQoJCQkJCWZvciAoIHZhciBpUmVnZXggPSAwOyBpUmVnZXggPCByZ1JlZ2V4Lmxlbmd0aDsgaVJlZ2V4KysgKQ0KCQkJCQl7DQoJCQkJCQl2YXIgcmVnZXggPSByZ1JlZ2V4W2lSZWdleF07DQoJCQkJCQlpZiAoICFnYW1lLm5hbWVfbm9ybWFsaXplZC5tYXRjaCggcmVnZXggKSAmJiAhZ2FtZS5uYW1lLm1hdGNoKHJlZ2V4KSApDQoJCQkJCQl7DQoJCQkJCQkJYk1hdGNoID0gZmFsc2U7DQoJCQkJCQkJYnJlYWs7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJaWYgKCBiTWF0Y2ggKQ0KCQkJCQl7DQoJCQkJCQlnYW1lLmxldmVuc2h0ZWluID0gbGV2ZW5zaHRlaW4oIGdhbWUubmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpLCBzdHJTZWFyY2hTdHJpbmcgKTsNCgkJCQkJCXJnTWF0Y2hpbmdHYW1lcy5wdXNoKCBnYW1lICk7DQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlyZ01hdGNoaW5nR2FtZXMuc29ydCggZnVuY3Rpb24oIGEsIGIgKSB7DQoJCQkJCWlmICggYS5sZXZlbnNodGVpbiA9PSBiLmxldmVuc2h0ZWluICkNCgkJCQkJew0KCQkJCQkJcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKCBiLm5hbWUgKTsNCgkJCQkJfQ0KCQkJCQlyZXR1cm4gYS5sZXZlbnNodGVpbiAtIGIubGV2ZW5zaHRlaW47DQoJCQkJfSApOw0KDQoJCQkJcmdNYXRjaGluZ0dhbWVzID0gcmdNYXRjaGluZ0dhbWVzLnNsaWNlKCAwLCAxMCApOw0KDQoJCQkJdGhpcy5VcGRhdGVMaXN0V2l0aE9wdGlvbnMoIHJnTWF0Y2hpbmdHYW1lcyApOw0KCQkJfQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJdGhpcy5lbFN1Z2dlc3Rpb25zLnVwZGF0ZSgnJyk7DQoJCQl0aGlzLmJIYXZlU3VnZ2VzdGlvbnMgPSBmYWxzZTsNCgkJfQ0KCX0NCg0KfSApOw0KDQpDR2FtZVNlbGVjdG9yT3duZWRHYW1lcy5zX3JnT3duZWRHYW1lcyA9IG51bGw7DQpDR2FtZVNlbGVjdG9yT3duZWRHYW1lcy5zX2JMb2FkSW5GbGlnaHQgPSBmYWxzZTsNCkNHYW1lU2VsZWN0b3JPd25lZEdhbWVzLnNfcmdPd25lZEdhbWVzUmVhZHlDYWxsYmFja3MgPSBbXTsNCkNHYW1lU2VsZWN0b3JPd25lZEdhbWVzLnNfcmdQYXJhbXMgPSB7fTsNCkNHYW1lU2VsZWN0b3JPd25lZEdhbWVzLkFyZU93bmVkR2FtZXNMb2FkZWQgPSBmdW5jdGlvbigpDQp7DQoJcmV0dXJuIENHYW1lU2VsZWN0b3JPd25lZEdhbWVzLnNfcmdPd25lZEdhbWVzICE9IG51bGw7DQp9Ow0KQ0dhbWVTZWxlY3Rvck93bmVkR2FtZXMuTm9ybWFsaXplR2FtZU5hbWVzID0gZnVuY3Rpb24oIHJnT3duZWRHYW1lcyApDQp7DQoJdmFyIHJlZ2V4Tm9ybWFsaXplID0gbmV3IFJlZ0V4cCggL1tccy4tOiE/LCddKy9nICk7DQoJZm9yKCB2YXIgaT0wOyBpIDwgcmdPd25lZEdhbWVzLmxlbmd0aDsgaSsrICkNCgl7DQoJCXZhciBnYW1lID0gcmdPd25lZEdhbWVzW2ldOw0KCQlnYW1lLm5hbWVfbm9ybWFsaXplZCA9IGdhbWUubmFtZS5yZXBsYWNlKCByZWdleE5vcm1hbGl6ZSwgJycgKS50b0xvd2VyQ2FzZSgpOw0KCX0NCn07DQpDR2FtZVNlbGVjdG9yT3duZWRHYW1lcy5Mb2FkT3duZWRHYW1lcyA9IGZ1bmN0aW9uKCBmbkNhbGxiYWNrICkNCnsNCglpZiAoICFDR2FtZVNlbGVjdG9yT3duZWRHYW1lcy5BcmVPd25lZEdhbWVzTG9hZGVkKCkgKQ0KCXsNCgkJQ0dhbWVTZWxlY3Rvck93bmVkR2FtZXMuc19yZ093bmVkR2FtZXNSZWFkeUNhbGxiYWNrcy5wdXNoKCBmbkNhbGxiYWNrICk7DQoNCgkJaWYgKCBDR2FtZVNlbGVjdG9yT3duZWRHYW1lcy5zX2JMb2FkSW5GbGlnaHQgKQ0KCQkJcmV0dXJuOw0KDQoJCUNHYW1lU2VsZWN0b3JPd25lZEdhbWVzLnNfYkxvYWRJbkZsaWdodCA9IHRydWU7DQoJCXZhciByZ1BhcmFtcyA9IENHYW1lU2VsZWN0b3JPd25lZEdhbWVzLnNfcmdQYXJhbXM7DQoJCXJnUGFyYW1zWydzZXNzaW9uaWQnXSA9IGdfc2Vzc2lvbklEOw0KDQoJCW5ldyBBamF4LlJlcXVlc3QoICdodHRwczovL3N0ZWFtY29tbXVuaXR5LmNvbS9hY3Rpb25zL0dldE93bmVkQXBwcy8nLCB7DQoJCQltZXRob2Q6ICdnZXQnLA0KCQkJcGFyYW1ldGVyczogcmdQYXJhbXMsDQoJCQlvblN1Y2Nlc3M6IGZ1bmN0aW9uKCB0cmFuc3BvcnQgKQ0KCQkJew0KCQkJCUNHYW1lU2VsZWN0b3JPd25lZEdhbWVzLnNfcmdPd25lZEdhbWVzID0gdHJhbnNwb3J0LnJlc3BvbnNlSlNPTiB8fCBbXTsNCg0KCQkJCUNHYW1lU2VsZWN0b3JPd25lZEdhbWVzLk5vcm1hbGl6ZUdhbWVOYW1lcyggQ0dhbWVTZWxlY3Rvck93bmVkR2FtZXMuc19yZ093bmVkR2FtZXMgKTsNCgkJCX0sDQoJCQlvbkZhaWx1cmU6IGZ1bmN0aW9uKCkNCgkJCXsNCgkJCQlDR2FtZVNlbGVjdG9yT3duZWRHYW1lcy5zX3JnT3duZWRHYW1lcyA9IFtdOw0KCQkJfSwNCgkJCW9uQ29tcGxldGU6IGZ1bmN0aW9uKCkNCgkJCXsNCgkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBDR2FtZVNlbGVjdG9yT3duZWRHYW1lcy5zX3JnT3duZWRHYW1lc1JlYWR5Q2FsbGJhY2tzLmxlbmd0aDsgaSsrICkNCgkJCQl7DQoJCQkJCUNHYW1lU2VsZWN0b3JPd25lZEdhbWVzLnNfcmdPd25lZEdhbWVzUmVhZHlDYWxsYmFja3NbaV0oKTsNCgkJCQl9DQoJCQl9DQoJCX0gKTsNCgl9DQoJZWxzZQ0KCXsNCgkJLy8gZGF0YSBpcyBhbHJlYWR5IHJlYWR5DQoJCWZuQ2FsbGJhY2soKTsNCgl9DQp9Ow0KDQpDR2FtZVNlbGVjdG9yUHJvZmlsZVNob3djYXNlR2FtZXMgPSBDbGFzcy5jcmVhdGUoIENHYW1lU2VsZWN0b3JPd25lZEdhbWVzLCB7DQoJaW5pdGlhbGl6ZTogZnVuY3Rpb24oICRzdXBlciwgZWxJbnB1dCwgZWxTdWdnZXN0aW9uc0N0biwgZWxTdWdnZXN0aW9ucywgZm5PbkNsaWNrLCByZ0ZpbHRlcmVkR2FtZXMgKQ0KCXsNCgkJQ0dhbWVTZWxlY3Rvck93bmVkR2FtZXMuc19yZ1BhcmFtc1snZm9yX3Nob3djYXNlJ10gPSAxOw0KCQlpZiAoIHJnRmlsdGVyZWRHYW1lcyApDQoJCXsNCgkJCUNHYW1lU2VsZWN0b3JPd25lZEdhbWVzLnNfcmdPd25lZEdhbWVzID0gcmdGaWx0ZXJlZEdhbWVzOw0KCQkJQ0dhbWVTZWxlY3Rvck93bmVkR2FtZXMuTm9ybWFsaXplR2FtZU5hbWVzKCBDR2FtZVNlbGVjdG9yT3duZWRHYW1lcy5zX3JnT3duZWRHYW1lcyApOw0KCQl9DQoJCSRzdXBlciggZWxJbnB1dCwgZWxTdWdnZXN0aW9uc0N0biwgZWxTdWdnZXN0aW9ucywgZm5PbkNsaWNrICk7DQoJfSwNCn0gKTsNCg0KZnVuY3Rpb24gVGFyZ2V0SXNDaGlsZCggZXZlbnQsIHNlbGVjdG9yICkNCnsNCgl2YXIgZXZ0ID0gZXZlbnQgfHwgd2luZG93LmV2ZW50Ow0KCXZhciByZWx0YXJnZXQgPSBldnQucmVsYXRlZFRhcmdldCB8fCBldnQudG9FbGVtZW50Ow0KCWlmICggIXJlbHRhcmdldCB8fCAhJChyZWx0YXJnZXQpLnVwKCBzZWxlY3RvciApICkNCgkJcmV0dXJuIGZhbHNlOw0KCXJldHVybiB0cnVlOw0KfQ0KDQpmdW5jdGlvbiBhZGRFdmVudChlbCwgZXYsIGZuLCB1c2VDYXB0dXJlKQ0Kew0KCWlmKGVsLmFkZEV2ZW50TGlzdGVuZXIpDQoJew0KCQllbC5hZGRFdmVudExpc3RlbmVyKGV2LCBmbiwgdXNlQ2FwdHVyZSk7DQoJfQ0KCWVsc2UgaWYoZWwuYXR0YWNoRXZlbnQpDQoJew0KCQl2YXIgcmV0ID0gZWwuYXR0YWNoRXZlbnQoIm9uIitldiwgZm4pOw0KCQlyZXR1cm4gcmV0Ow0KCX0NCgllbHNlDQoJew0KCQllbFsib24iK2V2XSA9IGZuOw0KCX0NCn0NCg0KZnVuY3Rpb24gY3JlYXRlUXVlcnkyKCBwb3N0VXJsLCByZXR1cm5GbiwgcG9zdERhdGEgKQ0Kew0KCXZhciB1aWQgPSBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkqMTAwMDAwKTsNCgl2YXIgclVpZCA9ICJyZXF1ZXN0ZXIiK3VpZDsNCglldmFsKHJVaWQrIiA9IG5ldyB4SHR0cFF1ZXJ5X1Bvc3QoKTsiKTsNCglldmFsKHJVaWQrIi5wb3N0VXJsID0gcG9zdFVybDsiKTsNCglldmFsKHJVaWQrIi5yZXR1cm5GbiA9IHJldHVybkZuOyIpOw0KCWV2YWwoclVpZCsiLnBvc3REYXRhID0gcG9zdERhdGE7Iik7DQoJZXZhbChyVWlkKyIuc2VsZlJlZiA9IFwiIityVWlkKyJcIjsiKTsNCglldmFsKHJVaWQrIi5kb1JlcXVlc3QoKTsiKTsNCn0NCg0KdmFyIHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTsNCmZ1bmN0aW9uIHhIdHRwUXVlcnlfUG9zdCgpDQp7DQoJdGhpcy5wb3N0VXJsID0gJyc7DQoJdGhpcy5zZWxmUmVmID0gJyc7DQoJdGhpcy5wb3N0RGF0YSA9ICcnOw0KCXRoaXMuZGF0YUVuY29kZWQgPSBmYWxzZTsNCgl0aGlzLnJldHVybkZuID0gZmFsc2U7DQoJdGhpcy5kb1JlcXVlc3QgPSBmdW5jdGlvbigpDQoJew0KCQlpZiAoIHVwZGF0ZUluUHJvZ3Jlc3MgPT0gdHJ1ZSApDQoJCXsNCgkJCXNldFRpbWVvdXQoIHRoaXMuc2VsZlJlZiArICIuZG9SZXF1ZXN0KCkiLCAyMDAgKTsNCgkJCXJldHVybjsNCgkJfQ0KCQlpZiAoIHRoaXMuZGF0YUVuY29kZWQgPT0gZmFsc2UgKQ0KCQl7DQoJCQl2YXIgcGFpcnMgPSBbXTsNCgkJCXZhciByZWdleHAgPSAvJTIwL2c7DQoJCQlmb3IgKCB2YXIgbmFtZSBpbiB0aGlzLnBvc3REYXRhICkNCgkJCXsNCgkJCQl2YXIgdmFsdWUgPSB0aGlzLnBvc3REYXRhW25hbWVdLnRvU3RyaW5nKCk7DQoJCQkJdmFyIHBhaXIgPSBlbmNvZGVVUklDb21wb25lbnQoIG5hbWUgKS5yZXBsYWNlKCByZWdleHAsICcrJyApICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KCB2YWx1ZSApLnJlcGxhY2UoIHJlZ2V4cCwgJysnICk7DQoJCQkJcGFpcnMucHVzaCggcGFpciApOw0KCQkJfQ0KCQkJdGhpcy5wb3N0RGF0YSA9IHBhaXJzLmpvaW4oICcmJyApOw0KCQkJdGhpcy5kYXRhRW5jb2RlZCA9IHRydWU7DQoJCX0NCgkJdXBkYXRlSW5Qcm9ncmVzcyA9IHRydWU7DQoJCS8vIHJlcSBpcyBpbnRlbnRpb25hbGx5IGEgZ2xvYmFsLiAgVGhlIGNvbnRyYWN0IGZvciB0aGlzIGZ1bmN0aW9uIGlzIHRoYXQgdGhlIGNhbGxlcnMgbG9vayBhdCB0aGUgInJlcSIgZ2xvYmFsIGluIHRoZWlyIGNhbGxiYWNrIHRvIHNlZSByZXN1bHRzLg0KCQlpZiAoIHdpbmRvdy5YTUxIdHRwUmVxdWVzdCApDQoJCXsNCgkJCXJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOw0KCQl9DQoJCWVsc2UgaWYoIHdpbmRvdy5BY3RpdmVYT2JqZWN0ICkNCgkJew0KCQkJcmVxID0gbmV3IEFjdGl2ZVhPYmplY3QoICJNaWNyb3NvZnQuWE1MSFRUUCIgKTsNCgkJfQ0KCQlpZiAoIHJlcSApDQoJCXsNCgkJCXJlcS5vcGVuKCAiUE9TVCIsIHRoaXMucG9zdFVybCwgdHJ1ZSApOw0KCQkJcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMucmV0dXJuRm47DQoJCQlyZXEuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiICk7DQoJCQlyZXEuc2VuZCggdGhpcy5wb3N0RGF0YSApOw0KCQl9DQoJfQ0KfQ0KDQpmdW5jdGlvbiB3aW5EaW0od2gsIHZzKQ0Kew0KCWlmKHdpbmRvdy5pbm5lcldpZHRoKSAvLyBtb3N0IGJyb3dzZXJzIC0gZmYsIHNhZmFyaSwgZXRjDQoJew0KCQlyZXR1cm4gKHdoID09ICd3JyA/ICh2cyA9PSAndicgPyB3aW5kb3cuaW5uZXJXaWR0aCA6IHdpbmRvdy5wYWdlWE9mZnNldCkgOiAodnMgPT0gJ3YnID8gd2luZG93LmlubmVySGVpZ2h0IDogd2luZG93LnBhZ2VZT2Zmc2V0KSk7DQoJfQ0KCWVsc2UgaWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkgLy8gaWUgc3RyaWN0DQoJew0KCQlyZXR1cm4gKHdoID09ICd3JyA/ICh2cyA9PSAndicgPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCkgOiAodnMgPT0gJ3YnID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCA6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApKTsNCgl9DQoJZWxzZSAvLyBpZSBub3JtYWwNCgl7DQoJCXJldHVybiAod2ggPT0gJ3cnID8gKHZzID09ICd2JyA/IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggOiBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpIDogKHZzID09ICd2JyA/IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0IDogZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIGdldEdvb2RFbGVtZW50KGVsLG5uLGNuLG5leHQpDQp7DQoJaWYobmV4dCA9PSAxKQ0KCXsNCgkJZWwgPSBlbC5wYXJlbnROb2RlOw0KCX0NCgl3aGlsZSggZWwubm9kZU5hbWUgJiYgZWwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBubiAmJiBlbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9ICJib2R5IikNCgl7DQoJCWVsID0gZWwucGFyZW50Tm9kZTsNCgl9DQoJdmFyIHRoaXNDbGFzcyA9ICcgJytlbC5jbGFzc05hbWUrJyAnOw0KCWlmKCBlbC5ub2RlTmFtZSAmJiBlbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9ICJib2R5IiAmJiB0aGlzQ2xhc3MuaW5kZXhPZignICcrY24rJyAnKSA9PSAtMSkNCgl7DQoJCXJldHVybiBnZXRHb29kRWxlbWVudChlbCxubixjbiwxKTsNCgl9DQoJZWxzZSBpZih0aGlzQ2xhc3MuaW5kZXhPZignICcrY24rJyAnKSAhPSAtMSkNCgl7DQoJCXJldHVybiBlbDsNCgl9DQoJcmV0dXJuIGZhbHNlOw0KfQ0KZnVuY3Rpb24gYWRkR2FtZUFjdGlvbnMoKQ0Kew0KCWlmKCFkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkNCgl7DQoJCXJldHVybjsNCgl9DQoJdmFyIHBhZ2VEaXZzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOw0KCWZvcih2YXIgeCA9IDA7IHggPCBwYWdlRGl2cy5sZW5ndGg7IHgrKykNCgl7DQoJCXZhciB0ZW1wQ2xhc3NOYW1lID0gIiAiK3BhZ2VEaXZzW3hdLmNsYXNzTmFtZSsiICI7DQoJCXZhciB0ZW1wUGFyZW50Q2xhc3NOYW1lID0gIiAiK3BhZ2VEaXZzW3hdLnBhcmVudE5vZGUuY2xhc3NOYW1lKyIgIjsNCgkJaWYodGVtcENsYXNzTmFtZS5pbmRleE9mKCIgZ2FtZUNvbnRhaW5lciAiKSAhPSAtMSB8fCB0ZW1wUGFyZW50Q2xhc3NOYW1lLmluZGV4T2YoIiBnYW1lQ29udGFpbmVyICIpICE9IC0xKQ0KCQl7DQoJCQlhZGRFdmVudChwYWdlRGl2c1t4XSwgIm1vdXNlb3ZlciIsIGxpc3RJdGVtX2hpbGl0ZSwgZmFsc2UpOw0KCQkJYWRkRXZlbnQocGFnZURpdnNbeF0sICJtb3VzZW91dCIsIGxpc3RJdGVtX2xvbGl0ZSwgZmFsc2UpOw0KCQkJYWRkRXZlbnQocGFnZURpdnNbeF0sICJjbGljayIsIGxpc3RJdGVtX3RvZ2dsZSwgZmFsc2UpOw0KCQl9DQoJfQ0KfQ0KDQpmdW5jdGlvbiBnZXRQb3BQb3MoZSwgcHcsIHBoLCBvZmZzZXQpDQp7DQoJdmFyIHcgPSB3aW5EaW0oJ3cnLCd2Jyk7DQoJdmFyIGggPSB3aW5EaW0oJ2gnLCd2Jyk7DQoJdmFyIHNsID0gd2luRGltKCd3JywncycpOw0KCXZhciBzdCA9IHdpbkRpbSgnaCcsJ3MnKTsNCgkvLyBtb3VzZSB4L3kgd2l0aGluIHZpZXdwb3J0DQoJdmFyIHZtWCA9IGUuY2xpZW50WDsNCgl2YXIgdm1ZID0gZS5jbGllbnRZOw0KCS8vIG1vdXNlIHgveSB3aXRoaW4gZG9jdW1lbnQNCgl2YXIgc21YID0gdm1YICsgc2w7DQoJdmFyIHNtWSA9IHZtWSArIHN0Ow0KCXZhciBsID0gKHB3ID4gdm1YKSA/IChzbVggKyBvZmZzZXQpIDogKHNtWCAtIHB3IC0gb2Zmc2V0KTsNCgl2YXIgdCA9IChwaCA+IHZtWSkgPyAoc21ZICsgb2Zmc2V0KSA6IChzbVkgLSBwaCAtIG9mZnNldCk7DQoJdmFyIHBvcFRMID0gbmV3IEFycmF5KHQsIGwpOw0KCXJldHVybiBwb3BUTDsNCn0NCg0KdmFyIGtlZXBUb29sdGlwID0gZmFsc2U7DQpmdW5jdGlvbiB0b29sdGlwQ3JlYXRlKHRpcEVsLCBlKQ0Kew0KCXZhciB0dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2x0aXAnKTsNCglpZih0dEVsKQ0KCXsNCgkJdHRFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHR0RWwpOw0KCX0NCgl0dEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQoJdHRFbC5pZCA9ICd0b29sdGlwJzsNCgl0dEVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsNCgl0dEVsLmFwcGVuZENoaWxkKHRpcEVsKTsNCglkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdLmFwcGVuZENoaWxkKHR0RWwpOw0KCXZhciB0aXBUTCA9IGdldFBvcFBvcyhlLCB0dEVsLmNsaWVudFdpZHRoLCB0dEVsLmNsaWVudEhlaWdodCwgNik7DQoJdHRFbC5zdHlsZS50b3AgPSB0aXBUTFswXSArICdweCc7DQoJdHRFbC5zdHlsZS5sZWZ0ID0gdGlwVExbMV0gKyAncHgnOw0KfQ0KDQpmdW5jdGlvbiB0b29sdGlwRGVzdHJveShnbykNCnsNCglpZiAoIGdvICE9IDEgKQ0KCXsNCgkJc2V0VGltZW91dCggInRvb2x0aXBEZXN0cm95KDEpIiwgMTAgKTsNCgl9DQoJZWxzZQ0KCXsNCgkJdmFyIHR0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbHRpcCcpOw0KCQlpZih0dEVsKQ0KCQl7DQoJCQl0dEVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodHRFbCk7DQoJCX0NCgl9DQp9DQoNCmZ1bmN0aW9uIGdldEVsZW1lbnQoIGVsZW1lbnRJZCApDQp7DQoJdmFyIGVsZW07DQoJaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCApIC8vIHN0YW5kYXJkIGNvbXBsaWFudCBtZXRob2QNCgkJZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBlbGVtZW50SWQgKTsNCgllbHNlIGlmICggZG9jdW1lbnQuYWxsICkgLy8gb2xkIG1zaWUgdmVyc2lvbnMNCgkJZWxlbSA9IGRvY3VtZW50LmFsbFsgZWxlbWVudElkIF07DQoJZWxzZQ0KCQllbGVtID0gZmFsc2U7DQoNCglyZXR1cm4gZWxlbTsNCn0NCg0KZnVuY3Rpb24gc2V0SW1hZ2UoIGVsZW1lbnRJZCwgc3RySW1hZ2UgKQ0Kew0KCXZhciBpbWFnZUVsZW0gPSBnZXRFbGVtZW50KCBlbGVtZW50SWQgKTsNCglpZiAoICFpbWFnZUVsZW0gKQ0KCQlyZXR1cm47DQoNCglpbWFnZUVsZW0uc3JjID0gc3RySW1hZ2U7DQp9DQoNCmZ1bmN0aW9uIGlTd2FwRnVsbFVSTCggaW1nSUQsIG5ld0ltZyApDQp7DQoJdmFyIG5ld0ltZ1BhdGggPSBuZXdJbWc7DQoJc2V0SW1hZ2UoIGltZ0lELCBuZXdJbWdQYXRoICk7DQp9DQoNCmZ1bmN0aW9uIGlTd2FwKCBpbWdJRCwgbmV3SW1nICkNCnsNCgl2YXIgbmV3SW1nUGF0aCA9ICJodHRwczovL2NvbW11bml0eS5ha2FtYWkuc3RlYW1zdGF0aWMuY29tL3B1YmxpYy9pbWFnZXMvIiArIG5ld0ltZzsNCglzZXRJbWFnZSggaW1nSUQsIG5ld0ltZ1BhdGggKTsNCn0NCg0KDQpmdW5jdGlvbiBMaXN0ZW5Ub0lGcmFtZU1lc3NhZ2UoIGNhbGxiYWNrRnVuYyApDQp7DQoJLy8gUmVzcG9uZCB0byBhIHBvc3RlZCBtZXNzYWdlIGZyb20gb3VyIHN1Yi1mcmFtZQ0KCXZhciBldmVudE1ldGhvZEFsaWFzID0gKCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciApID8gImFkZEV2ZW50TGlzdGVuZXIiIDogImF0dGFjaEV2ZW50IjsNCgl2YXIgZXZlbnRNZXRob2QgPSB3aW5kb3dbZXZlbnRNZXRob2RBbGlhc107DQoJdmFyIG1lc3NhZ2VFdmVudCA9ICggZXZlbnRNZXRob2QgPT09ICJhdHRhY2hFdmVudCIgKSA/ICJvbm1lc3NhZ2UiIDogIm1lc3NhZ2UiOw0KDQoJZXZlbnRNZXRob2QoIG1lc3NhZ2VFdmVudCwgY2FsbGJhY2tGdW5jLCBmYWxzZSApOw0KfQ0KDQp2YXIgZ1NoYXJlUG9wdXAgPSBudWxsOw0KdmFyIGdTaGFyZVJlcXVlc3RVUkwgPSBudWxsOw0KZnVuY3Rpb24gU2hvd1NoYXJlUHVibGlzaGVkRmlsZVBvcHVwKCBwdWJsaXNoZWRGaWxlSUQsIGFwcElEICkNCnsNCglnU2hhcmVSZXF1ZXN0VVJMID0gImh0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL3NoYXJlZGZpbGVzL3NoYXJlb25zdGVhbS8/aWQ9IiArIHB1Ymxpc2hlZEZpbGVJRCArICcmYXBwaWQ9JyArIGFwcElEOw0KDQoJdmFyIHNoYXJlVVJMID0gImh0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL3NoYXJlZGZpbGVzL2ZpbGVkZXRhaWxzLz9pZD0iICsgcHVibGlzaGVkRmlsZUlEOw0KCXZhciBiYXNlU29jaWFsU2hhcmVVUkwgPSAiaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vc2hhcmVkZmlsZXMvc2hhcmUvP2lkPSIgKyBwdWJsaXNoZWRGaWxlSUQ7DQoJU2hvd1NoYXJlUG9wdXAoIHNoYXJlVVJMLCBiYXNlU29jaWFsU2hhcmVVUkwgKTsNCn0NCg0KZnVuY3Rpb24gU2hvd1NoYXJlTmV3c1Bvc3RQb3B1cCggZ2lkLCBhcHBpZCApDQp7DQoJZ1NoYXJlUmVxdWVzdFVSTCA9ICJodHRwczovL3N0ZWFtY29tbXVuaXR5LmNvbS9uZXdzL3NoYXJlb25zdGVhbS8iICsgZ2lkICsgIj9hcHBpZD0iICsgYXBwaWQ7DQoNCgl2YXIgYmFzZVNvY2lhbFNoYXJlVVJMID0gImh0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL25ld3Mvc2hhcmVwb3N0LyIgKyBnaWQ7DQoJdmFyIHNoYXJlVVJMID0gImh0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL25ld3MvcG9zdC8iICsgZ2lkOw0KCVNob3dTaGFyZVBvcHVwKCBzaGFyZVVSTCwgYmFzZVNvY2lhbFNoYXJlVVJMICk7DQp9DQoNCmZ1bmN0aW9uIFNob3dTaGFyZUNsYW5Bbm5vdW5jZW1lbnRQb3B1cCggZ3JvdXBJZCwgZ2lkICkNCnsNCglnU2hhcmVSZXF1ZXN0VVJMID0gImh0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL2dpZC8iICsgZ3JvdXBJZCArICIvYW5ub3VuY2VtZW50cy9zaGFyZW9uc3RlYW0vIiArIGdpZDsNCg0KCXZhciBiYXNlU29jaWFsU2hhcmVVUkwgPSAiaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vZ2lkLyIgKyBncm91cElkICsgIi9hbm5vdW5jZW1lbnRzL3NoYXJlLyIgKyBnaWQ7DQoJdmFyIHNoYXJlVVJMID0gImh0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL2dpZC8iICsgZ3JvdXBJZCArICIvYW5ub3VuY2VtZW50cy9kZXRhaWwvIiArIGdpZDsNCglTaG93U2hhcmVQb3B1cCggc2hhcmVVUkwsIGJhc2VTb2NpYWxTaGFyZVVSTCApOw0KfQ0KDQpmdW5jdGlvbiBTaG93U2hhcmVQb3B1cCggdXJsLCBiYXNlU29jaWFsU2hhcmVVUkwgKQ0Kew0KCXZhciBhcHBlbmRRdWVyeVBhcmFtID0gYmFzZVNvY2lhbFNoYXJlVVJMLmluZGV4T2YoICI/IiApICE9IC0xID8gJyYnIDogJz8nOw0KDQoJJCggIlNoYXJlUG9wdXBMaW5rX0ZhY2Vib29rIiApLmhyZWYgPSBiYXNlU29jaWFsU2hhcmVVUkwgKyBhcHBlbmRRdWVyeVBhcmFtICsgInNpdGU9ZmFjZWJvb2smdD0iICsgTWF0aC5yYW5kb20oKTsNCgkkKCAiU2hhcmVQb3B1cExpbmtfVHdpdHRlciIgKS5ocmVmID0gYmFzZVNvY2lhbFNoYXJlVVJMICsgYXBwZW5kUXVlcnlQYXJhbSArICJzaXRlPXR3aXR0ZXIiOw0KCSQoICJTaGFyZVBvcHVwTGlua19SZWRkaXQiICkuaHJlZiA9IGJhc2VTb2NpYWxTaGFyZVVSTCArIGFwcGVuZFF1ZXJ5UGFyYW0gKyAic2l0ZT1yZWRkaXQiOw0KDQoJJCggIlNoYXJlUG9wdXBJbnB1dCIgKS52YWx1ZSA9IHVybDsNCg0KCWdTaGFyZVBvcHVwID0gU2hvd0RpYWxvZyggJ1NoYXJlJywgJCggJ1NoYXJlUG9wdXAnICkgKTsNCglnU2hhcmVQb3B1cC5TZXRSZW1vdmVDb250ZW50T25EaXNtaXNzYWwoIGZhbHNlICk7DQoJJCggJ1NoYXJlUG9wdXAnICkuc2hvdygpOw0KfQ0KDQp2YXIgZ1NoYXJlT25TdGVhbURpYWxvZyA9IG51bGw7DQpmdW5jdGlvbiBTaGFyZU9uU3RlYW0oKQ0Kew0KCWdTaGFyZVBvcHVwLkRpc21pc3MoKTsNCglnU2hhcmVQb3B1cCA9IG51bGw7DQoNCgkkKCAnU2hhcmVPblN0ZWFtRGlhbG9nQ29udGVudHMnICkuaGlkZSgpOw0KCW5ldyBBamF4LlVwZGF0ZXIoICJTaGFyZU9uU3RlYW1EaWFsb2dDb250ZW50cyIsIGdTaGFyZVJlcXVlc3RVUkwsIHsgZXZhbFNjcmlwdHM6IHRydWUsIG9uTG9hZGVkOiBmdW5jdGlvbigpIHsgU2hvd1dpdGhGYWRlKCAkKCAnU2hhcmVPblN0ZWFtRGlhbG9nQ29udGVudHMnKSApOyB9IH0gKTsNCgkkKCAnU2hhcmVPblN0ZWFtRGlhbG9nJyApLnNob3coKTsNCg0KCXZhciBkZWZlcnJlZCA9IG5ldyBqUXVlcnkuRGVmZXJyZWQoKTsNCgl2YXIgZm5DYW5jZWwgPSBmdW5jdGlvbigpIHsgQ2xvc2VTaGFyZU9uU3RlYW1EaWFsb2coKTsgZGVmZXJyZWQucmVzb2x2ZSgpOyB9Ow0KDQoJZ1NoYXJlT25TdGVhbURpYWxvZyA9IF9CdWlsZERpYWxvZyggICdTaGFyZScsICQoICdTaGFyZU9uU3RlYW1EaWFsb2cnICksIFtdLCBmbkNhbmNlbCwgbnVsbCApOw0KCWRlZmVycmVkLmFsd2F5cyggZnVuY3Rpb24oKSB7IGdTaGFyZU9uU3RlYW1EaWFsb2cuRGlzbWlzcygpOyB9ICk7DQoJZ1NoYXJlT25TdGVhbURpYWxvZy5TaG93KCk7DQoNCgkvLyBhdHRhY2ggdGhlIGRlZmVycmVkJ3MgZXZlbnRzIHRvIHRoZSBtb2RhbA0KCWRlZmVycmVkLnByb21pc2UoIGdTaGFyZU9uU3RlYW1EaWFsb2cgKTsNCg0KCWdTaGFyZU9uU3RlYW1EaWFsb2cuU2V0UmVtb3ZlQ29udGVudE9uRGlzbWlzc2FsKCBmYWxzZSApOw0KfQ0KDQoNCmZ1bmN0aW9uIENsb3NlU2hhcmVPblN0ZWFtRGlhbG9nKCkNCnsNCgkJZ1NoYXJlT25TdGVhbURpYWxvZy5EaXNtaXNzKCk7DQp9DQoNCmZ1bmN0aW9uIFNoYXJlQ29udGVudFRvVXNlclN0YXR1cyggdGV4dCwgdXJsVG9TaGFyZSwgYXBwSUQsIHBvc3R1cmwgKQ0Kew0KCXRleHQgKz0gJ1xuXG4nICsgdXJsVG9TaGFyZTsNCgluZXcgQWpheC5SZXF1ZXN0KCBwb3N0dXJsLCB7DQoJCWluc2VydGlvbjogSW5zZXJ0aW9uLkJvdHRvbSwNCgkJbWV0aG9kOiAncG9zdCcsDQoJCXBhcmFtZXRlcnM6IHsgc2Vzc2lvbmlkOiBnX3Nlc3Npb25JRCwgc3RhdHVzX3RleHQ6IHRleHQsIGFwcGlkOiBhcHBJRCB9LA0KCQlvblN1Y2Nlc3M6IGZ1bmN0aW9uKHRyYW5zcG9ydCkgew0KCQkJQ2xvc2VTaGFyZU9uU3RlYW1EaWFsb2coKTsNCgkJCVNob3dBbGVydERpYWxvZyggJ1NoYXJlJywgJ1RoZSBzdGF0dXMgdXBkYXRlIGhhcyBiZWVuIHBvc3RlZCB0byB5b3VyIEZyaWVuZHMgQWN0aXZpdHkuJyApOw0KCQl9LA0KCQlvbkZhaWx1cmU6IGZ1bmN0aW9uKHRyYW5zcG9ydCkgew0KCQkJU2hvd0FsZXJ0RGlhbG9nKCAnU2hhcmUnLCAnVGhlcmUgd2FzIGEgcHJvYmxlbSBzaGFyaW5nIHRoZSBzdGF0dXMgdXBkYXRlLiAgUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nICk7DQoJCX0NCgl9KTsNCn0NCg0KDQoNCg0KDQo8L3NjcmlwdD4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vKiEgalF1ZXJ5IHYxLjExLjEgfCAoYykgMjAwNSwgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLw0KIWZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YS5kb2N1bWVudD9iKGEsITApOmZ1bmN0aW9uKGEpe2lmKCFhLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBiKGEpfTpiKGEpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ9Yy5zbGljZSxlPWMuY29uY2F0LGY9Yy5wdXNoLGc9Yy5pbmRleE9mLGg9e30saT1oLnRvU3RyaW5nLGo9aC5oYXNPd25Qcm9wZXJ0eSxrPXt9LGw9IjEuMTEuMSIsbT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgbS5mbi5pbml0KGEsYil9LG49L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLG89L14tbXMtLyxwPS8tKFtcZGEtel0pL2dpLHE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfTttLmZuPW0ucHJvdG90eXBlPXtqcXVlcnk6bCxjb25zdHJ1Y3RvcjptLHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/MD5hP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXTpkLmNhbGwodGhpcyl9LHB1c2hTdGFjazpmdW5jdGlvbihhKXt2YXIgYj1tLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gYi5wcmV2T2JqZWN0PXRoaXMsYi5jb250ZXh0PXRoaXMuY29udGV4dCxifSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZWFjaCh0aGlzLGEsYil9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubGVuZ3RoLGM9K2ErKDA+YT9iOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhjPj0wJiZiPmM/W3RoaXNbY11dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpmLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbS5leHRlbmQ9bS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG0uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihtLmlzUGxhaW5PYmplY3QoYyl8fChiPW0uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbS5pc0FycmF5KGEpP2E6W10pOmY9YSYmbS5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1tLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbS5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKGwrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW0udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bS50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXtyZXR1cm4hbS5pc0FycmF5KGEpJiZhLXBhcnNlRmxvYXQoYSk+PTB9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtpZighYXx8Im9iamVjdCIhPT1tLnR5cGUoYSl8fGEubm9kZVR5cGV8fG0uaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFqLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIWouY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfWlmKGsub3duTGFzdClmb3IoYiBpbiBhKXJldHVybiBqLmNhbGwoYSxiKTtmb3IoYiBpbiBhKTtyZXR1cm4gdm9pZCAwPT09Ynx8ai5jYWxsKGEsYil9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/YSsiIjoib2JqZWN0Ij09dHlwZW9mIGF8fCJmdW5jdGlvbiI9PXR5cGVvZiBhP2hbaS5jYWxsKGEpXXx8Im9iamVjdCI6dHlwZW9mIGF9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oYil7YiYmbS50cmltKGIpJiYoYS5leGVjU2NyaXB0fHxmdW5jdGlvbihiKXthLmV2YWwuY2FsbChhLGIpfSkoYil9LGNhbWVsQ2FzZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKG8sIm1zLSIpLnJlcGxhY2UocCxxKX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yi50b0xvd2VyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPTAsZj1hLmxlbmd0aCxnPXIoYSk7aWYoYyl7aWYoZyl7Zm9yKDtmPmU7ZSsrKWlmKGQ9Yi5hcHBseShhW2VdLGMpLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgaWYoZyl7Zm9yKDtmPmU7ZSsrKWlmKGQ9Yi5jYWxsKGFbZV0sZSxhW2VdKSxkPT09ITEpYnJlYWt9ZWxzZSBmb3IoZSBpbiBhKWlmKGQ9Yi5jYWxsKGFbZV0sZSxhW2VdKSxkPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRyaW06ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6KGErIiIpLnJlcGxhY2UobiwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjPWJ8fFtdO3JldHVybiBudWxsIT1hJiYocihPYmplY3QoYSkpP20ubWVyZ2UoYywic3RyaW5nIj09dHlwZW9mIGE/W2FdOmEpOmYuY2FsbChjLGEpKSxjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihnKXJldHVybiBnLmNhbGwoYixhLGMpO2ZvcihkPWIubGVuZ3RoLGM9Yz8wPmM/TWF0aC5tYXgoMCxkK2MpOmM6MDtkPmM7YysrKWlmKGMgaW4gYiYmYltjXT09PWEpcmV0dXJuIGN9cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGEsYil7dmFyIGM9K2IubGVuZ3RoLGQ9MCxlPWEubGVuZ3RoO3doaWxlKGM+ZClhW2UrK109YltkKytdO2lmKGMhPT1jKXdoaWxlKHZvaWQgMCE9PWJbZF0pYVtlKytdPWJbZCsrXTtyZXR1cm4gYS5sZW5ndGg9ZSxhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQsZT1bXSxmPTAsZz1hLmxlbmd0aCxoPSFjO2c+ZjtmKyspZD0hYihhW2ZdLGYpLGQhPT1oJiZlLnB1c2goYVtmXSk7cmV0dXJuIGV9LG1hcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj0wLGc9YS5sZW5ndGgsaD1yKGEpLGk9W107aWYoaClmb3IoO2c+ZjtmKyspZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7ZWxzZSBmb3IoZiBpbiBhKWQ9YihhW2ZdLGYsYyksbnVsbCE9ZCYmaS5wdXNoKGQpO3JldHVybiBlLmFwcGx5KFtdLGkpfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGY7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBiJiYoZj1hW2JdLGI9YSxhPWYpLG0uaXNGdW5jdGlvbihhKT8oYz1kLmNhbGwoYXJndW1lbnRzLDIpLGU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShifHx0aGlzLGMuY29uY2F0KGQuY2FsbChhcmd1bWVudHMpKSl9LGUuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxtLmd1aWQrKyxlKTp2b2lkIDB9LG5vdzpmdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX0sc3VwcG9ydDprfSksbS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7aFsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiByKGEpe3ZhciBiPWEubGVuZ3RoLGM9bS50eXBlKGEpO3JldHVybiJmdW5jdGlvbiI9PT1jfHxtLmlzV2luZG93KGEpPyExOjE9PT1hLm5vZGVUeXBlJiZiPyEwOiJhcnJheSI9PT1jfHwwPT09Ynx8Im51bWJlciI9PXR5cGVvZiBiJiZiPjAmJmItMSBpbiBhfXZhciBzPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHU9InNpenpsZSIrLW5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9Z2IoKSx6PWdiKCksQT1nYigpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPSJ1bmRlZmluZWQiLEQ9MTw8MzEsRT17fS5oYXNPd25Qcm9wZXJ0eSxGPVtdLEc9Ri5wb3AsSD1GLnB1c2gsST1GLnB1c2gsSj1GLnNsaWNlLEs9Ri5pbmRleE9mfHxmdW5jdGlvbihhKXtmb3IodmFyIGI9MCxjPXRoaXMubGVuZ3RoO2M+YjtiKyspaWYodGhpc1tiXT09PWEpcmV0dXJuIGI7cmV0dXJuLTF9LEw9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixNPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixOPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsTz1OLnJlcGxhY2UoInciLCJ3IyIpLFA9IlxcWyIrTSsiKigiK04rIikoPzoiK00rIiooWypeJHwhfl0/PSkiK00rIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitPKyIpKXwpIitNKyIqXFxdIixRPSI6KCIrTisiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrUCsiKSopfC4qKVxcKXwpIixSPW5ldyBSZWdFeHAoIl4iK00rIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTSsiKyQiLCJnIiksUz1uZXcgUmVnRXhwKCJeIitNKyIqLCIrTSsiKiIpLFQ9bmV3IFJlZ0V4cCgiXiIrTSsiKihbPit+XXwiK00rIikiK00rIioiKSxVPW5ldyBSZWdFeHAoIj0iK00rIiooW15cXF0nXCJdKj8pIitNKyIqXFxdIiwiZyIpLFY9bmV3IFJlZ0V4cChRKSxXPW5ldyBSZWdFeHAoIl4iK08rIiQiKSxYPXtJRDpuZXcgUmVnRXhwKCJeIygiK04rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTisiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTi5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrUCksUFNFVURPOm5ldyBSZWdFeHAoIl4iK1EpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTSsiKig/OihbKy1dfCkiK00rIiooXFxkKyl8KSkiK00rIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0wrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitNKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK00rIiooKD86LVxcZCk/XFxkKikiK00rIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFk9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxaPS9eaFxkJC9pLCQ9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLF89L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxhYj0vWyt+XS8sYmI9Lyd8XFwvZyxjYj1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK00rIj98KCIrTSsiKXwuKSIsImlnIiksZGI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9O3RyeXtJLmFwcGx5KEY9Si5jYWxsKHYuY2hpbGROb2Rlcyksdi5jaGlsZE5vZGVzKSxGW3YuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKGViKXtJPXthcHBseTpGLmxlbmd0aD9mdW5jdGlvbihhLGIpe0guYXBwbHkoYSxKLmNhbGwoYikpfTpmdW5jdGlvbihhLGIpe3ZhciBjPWEubGVuZ3RoLGQ9MDt3aGlsZShhW2MrK109YltkKytdKTthLmxlbmd0aD1jLTF9fX1mdW5jdGlvbiBmYihhLGIsZCxlKXt2YXIgZixoLGosayxsLG8scixzLHcseDtpZigoYj9iLm93bmVyRG9jdW1lbnR8fGI6dikhPT1uJiZtKGIpLGI9Ynx8bixkPWR8fFtdLCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGQ7aWYoMSE9PShrPWIubm9kZVR5cGUpJiY5IT09aylyZXR1cm5bXTtpZihwJiYhZSl7aWYoZj1fLmV4ZWMoYSkpaWYoaj1mWzFdKXtpZig5PT09ayl7aWYoaD1iLmdldEVsZW1lbnRCeUlkKGopLCFofHwhaC5wYXJlbnROb2RlKXJldHVybiBkO2lmKGguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNlIGlmKGIub3duZXJEb2N1bWVudCYmKGg9Yi5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGopKSYmdChiLGgpJiZoLmlkPT09ailyZXR1cm4gZC5wdXNoKGgpLGR9ZWxzZXtpZihmWzJdKXJldHVybiBJLmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoaj1mWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEkuYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaikpLGR9aWYoYy5xc2EmJighcXx8IXEudGVzdChhKSkpe2lmKHM9cj11LHc9Yix4PTk9PT1rJiZhLDE9PT1rJiYib2JqZWN0IiE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7bz1nKGEpLChyPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXIucmVwbGFjZShiYiwiXFwkJiIpOmIuc2V0QXR0cmlidXRlKCJpZCIscykscz0iW2lkPSciK3MrIiddICIsbD1vLmxlbmd0aDt3aGlsZShsLS0pb1tsXT1zK3FiKG9bbF0pO3c9YWIudGVzdChhKSYmb2IoYi5wYXJlbnROb2RlKXx8Yix4PW8uam9pbigiLCIpfWlmKHgpdHJ5e3JldHVybiBJLmFwcGx5KGQsdy5xdWVyeVNlbGVjdG9yQWxsKHgpKSxkfWNhdGNoKHkpe31maW5hbGx5e3J8fGIucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGkoYS5yZXBsYWNlKFIsIiQxIiksYixkLGUpfWZ1bmN0aW9uIGdiKCl7dmFyIGE9W107ZnVuY3Rpb24gYihjLGUpe3JldHVybiBhLnB1c2goYysiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBiW2Euc2hpZnQoKV0sYltjKyIgIl09ZX1yZXR1cm4gYn1mdW5jdGlvbiBoYihhKXtyZXR1cm4gYVt1XT0hMCxhfWZ1bmN0aW9uIGliKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24gamIoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1hLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24ga2IoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiYofmIuc291cmNlSW5kZXh8fEQpLSh+YS5zb3VyY2VJbmRleHx8RCk7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIGxiKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG1iKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBuYihhKXtyZXR1cm4gaGIoZnVuY3Rpb24oYil7cmV0dXJuIGI9K2IsaGIoZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBvYihhKXtyZXR1cm4gYSYmdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1DJiZhfWM9ZmIuc3VwcG9ydD17fSxmPWZiLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj8iSFRNTCIhPT1iLm5vZGVOYW1lOiExfSxtPWZiLnNldERvY3VtZW50PWZ1bmN0aW9uKGEpe3ZhciBiLGU9YT9hLm93bmVyRG9jdW1lbnR8fGE6dixnPWUuZGVmYXVsdFZpZXc7cmV0dXJuIGUhPT1uJiY5PT09ZS5ub2RlVHlwZSYmZS5kb2N1bWVudEVsZW1lbnQ/KG49ZSxvPWUuZG9jdW1lbnRFbGVtZW50LHA9IWYoZSksZyYmZyE9PWcudG9wJiYoZy5hZGRFdmVudExpc3RlbmVyP2cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe20oKX0sITEpOmcuYXR0YWNoRXZlbnQmJmcuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixmdW5jdGlvbigpe20oKX0pKSxjLmF0dHJpYnV0ZXM9aWIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NOYW1lPSJpIiwhYS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksYy5nZXRFbGVtZW50c0J5VGFnTmFtZT1pYihmdW5jdGlvbihhKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChlLmNyZWF0ZUNvbW1lbnQoIiIpKSwhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT0kLnRlc3QoZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSYmaWIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSdhJz48L2Rpdj48ZGl2IGNsYXNzPSdhIGknPjwvZGl2PiIsYS5maXJzdENoaWxkLmNsYXNzTmFtZT0iaSIsMj09PWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiaSIpLmxlbmd0aH0pLGMuZ2V0QnlJZD1pYihmdW5jdGlvbihhKXtyZXR1cm4gby5hcHBlbmRDaGlsZChhKS5pZD11LCFlLmdldEVsZW1lbnRzQnlOYW1lfHwhZS5nZXRFbGVtZW50c0J5TmFtZSh1KS5sZW5ndGh9KSxjLmdldEJ5SWQ/KGQuZmluZC5JRD1mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRCeUlkIT09QyYmcCl7dmFyIGM9Yi5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYyYmYy5wYXJlbnROb2RlP1tjXTpbXX19LGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYixkYik7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaWQiKT09PWJ9fSk6KGRlbGV0ZSBkLmZpbmQuSUQsZC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGNiLGRiKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9PUMmJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYyYmYy52YWx1ZT09PWJ9fSksZC5maW5kLlRBRz1jLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGEsYil7cmV0dXJuIHR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09Qz9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOnZvaWQgMH06ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9MCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSk7aWYoIioiPT09YSl7d2hpbGUoYz1mW2UrK10pMT09PWMubm9kZVR5cGUmJmQucHVzaChjKTtyZXR1cm4gZH1yZXR1cm4gZn0sZC5maW5kLkNMQVNTPWMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oYSxiKXtyZXR1cm4gdHlwZW9mIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PUMmJnA/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scj1bXSxxPVtdLChjLnFzYT0kLnRlc3QoZS5xdWVyeVNlbGVjdG9yQWxsKSkmJihpYihmdW5jdGlvbihhKXthLmlubmVySFRNTD0iPHNlbGVjdCBtc2FsbG93Y2xpcD0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsYS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NsaXBePScnXSIpLmxlbmd0aCYmcS5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLGEucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8cS5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK0wrIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIil9KSxpYihmdW5jdGlvbihhKXt2YXIgYj1lLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Yi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxhLmFwcGVuZENoaWxkKGIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIkQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoJiZxLnB1c2goIm5hbWUiK00rIipbKl4kfCF+XT89IiksYS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aHx8cS5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGEucXVlcnlTZWxlY3RvckFsbCgiKiw6eCIpLHEucHVzaCgiLC4qOiIpfSkpLChjLm1hdGNoZXNTZWxlY3Rvcj0kLnRlc3Qocz1vLm1hdGNoZXN8fG8ud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxvLm1vek1hdGNoZXNTZWxlY3Rvcnx8by5vTWF0Y2hlc1NlbGVjdG9yfHxvLm1zTWF0Y2hlc1NlbGVjdG9yKSkmJmliKGZ1bmN0aW9uKGEpe2MuZGlzY29ubmVjdGVkTWF0Y2g9cy5jYWxsKGEsImRpdiIpLHMuY2FsbChhLCJbcyE9JyddOngiKSxyLnB1c2goIiE9IixRKX0pLHE9cS5sZW5ndGgmJm5ldyBSZWdFeHAocS5qb2luKCJ8IikpLHI9ci5sZW5ndGgmJm5ldyBSZWdFeHAoci5qb2luKCJ8IikpLGI9JC50ZXN0KG8uY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHQ9Ynx8JC50ZXN0KG8uY29udGFpbnMpP2Z1bmN0aW9uKGEsYil7dmFyIGM9OT09PWEubm9kZVR5cGU/YS5kb2N1bWVudEVsZW1lbnQ6YSxkPWImJmIucGFyZW50Tm9kZTtyZXR1cm4gYT09PWR8fCEoIWR8fDEhPT1kLm5vZGVUeXBlfHwhKGMuY29udGFpbnM/Yy5jb250YWlucyhkKTphLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGQpKSl9OmZ1bmN0aW9uKGEsYil7aWYoYil3aGlsZShiPWIucGFyZW50Tm9kZSlpZihiPT09YSlyZXR1cm4hMDtyZXR1cm4hMX0sQj1iP2Z1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGw9ITAsMDt2YXIgZD0hYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gZD9kOihkPShhLm93bmVyRG9jdW1lbnR8fGEpPT09KGIub3duZXJEb2N1bWVudHx8Yik/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKToxLDEmZHx8IWMuc29ydERldGFjaGVkJiZiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGEpPT09ZD9hPT09ZXx8YS5vd25lckRvY3VtZW50PT09diYmdCh2LGEpPy0xOmI9PT1lfHxiLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYik/MTprP0suY2FsbChrLGEpLUsuY2FsbChrLGIpOjA6NCZkPy0xOjEpfTpmdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGMsZD0wLGY9YS5wYXJlbnROb2RlLGc9Yi5wYXJlbnROb2RlLGg9W2FdLGk9W2JdO2lmKCFmfHwhZylyZXR1cm4gYT09PWU/LTE6Yj09PWU/MTpmPy0xOmc/MTprP0suY2FsbChrLGEpLUsuY2FsbChrLGIpOjA7aWYoZj09PWcpcmV0dXJuIGtiKGEsYik7Yz1hO3doaWxlKGM9Yy5wYXJlbnROb2RlKWgudW5zaGlmdChjKTtjPWI7d2hpbGUoYz1jLnBhcmVudE5vZGUpaS51bnNoaWZ0KGMpO3doaWxlKGhbZF09PT1pW2RdKWQrKztyZXR1cm4gZD9rYihoW2RdLGlbZF0pOmhbZF09PT12Py0xOmlbZF09PT12PzE6MH0sZSk6bn0sZmIubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBmYihhLG51bGwsbnVsbCxiKX0sZmIubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7aWYoKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLGI9Yi5yZXBsYWNlKFUsIj0nJDEnXSIpLCEoIWMubWF0Y2hlc1NlbGVjdG9yfHwhcHx8ciYmci50ZXN0KGIpfHxxJiZxLnRlc3QoYikpKXRyeXt2YXIgZD1zLmNhbGwoYSxiKTtpZihkfHxjLmRpc2Nvbm5lY3RlZE1hdGNofHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGR9Y2F0Y2goZSl7fXJldHVybiBmYihiLG4sbnVsbCxbYV0pLmxlbmd0aD4wfSxmYi5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybihhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSx0KGEsYil9LGZiLmF0dHI9ZnVuY3Rpb24oYSxiKXsoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSk7dmFyIGU9ZC5hdHRySGFuZGxlW2IudG9Mb3dlckNhc2UoKV0sZj1lJiZFLmNhbGwoZC5hdHRySGFuZGxlLGIudG9Mb3dlckNhc2UoKSk/ZShhLGIsIXApOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09Zj9mOmMuYXR0cmlidXRlc3x8IXA/YS5nZXRBdHRyaWJ1dGUoYik6KGY9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZi5zcGVjaWZpZWQ/Zi52YWx1ZTpudWxsfSxmYi5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9LGZiLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXSxlPTAsZj0wO2lmKGw9IWMuZGV0ZWN0RHVwbGljYXRlcyxrPSFjLnNvcnRTdGFibGUmJmEuc2xpY2UoMCksYS5zb3J0KEIpLGwpe3doaWxlKGI9YVtmKytdKWI9PT1hW2ZdJiYoZT1kLnB1c2goZikpO3doaWxlKGUtLSlhLnNwbGljZShkW2VdLDEpfXJldHVybiBrPW51bGwsYX0sZT1mYi5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9IiIsZD0wLGY9YS5ub2RlVHlwZTtpZihmKXtpZigxPT09Znx8OT09PWZ8fDExPT09Zil7aWYoInN0cmluZyI9PXR5cGVvZiBhLnRleHRDb250ZW50KXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1lKGEpfWVsc2UgaWYoMz09PWZ8fDQ9PT1mKXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKGI9YVtkKytdKWMrPWUoYik7cmV0dXJuIGN9LGQ9ZmIuc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86aGIsbWF0Y2g6WCxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS5yZXBsYWNlKGNiLGRiKSxhWzNdPShhWzNdfHxhWzRdfHxhWzVdfHwiIikucmVwbGFjZShjYixkYiksIn49Ij09PWFbMl0mJihhWzNdPSIgIithWzNdKyIgIiksYS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1hWzFdLnNsaWNlKDAsMyk/KGFbM118fGZiLmVycm9yKGFbMF0pLGFbNF09KyhhWzRdP2FbNV0rKGFbNl18fDEpOjIqKCJldmVuIj09PWFbM118fCJvZGQiPT09YVszXSkpLGFbNV09KyhhWzddK2FbOF18fCJvZGQiPT09YVszXSkpOmFbM10mJmZiLmVycm9yKGFbMF0pLGF9LFBTRVVETzpmdW5jdGlvbihhKXt2YXIgYixjPSFhWzZdJiZhWzJdO3JldHVybiBYLkNISUxELnRlc3QoYVswXSk/bnVsbDooYVszXT9hWzJdPWFbNF18fGFbNV18fCIiOmMmJlYudGVzdChjKSYmKGI9ZyhjLCEwKSkmJihiPWMuaW5kZXhPZigiKSIsYy5sZW5ndGgtYiktYy5sZW5ndGgpJiYoYVswXT1hWzBdLnNsaWNlKDAsYiksYVsyXT1jLnNsaWNlKDAsYikpLGEuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2IsZGIpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09YT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn19LENMQVNTOmZ1bmN0aW9uKGEpe3ZhciBiPXlbYSsiICJdO3JldHVybiBifHwoYj1uZXcgUmVnRXhwKCIoXnwiK00rIikiK2ErIigiK00rInwkKSIpKSYmeShhLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoInN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZSYmYS5jbGFzc05hbWV8fHR5cGVvZiBhLmdldEF0dHJpYnV0ZSE9PUMmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWZiLmF0dHIoZCxhKTtyZXR1cm4gbnVsbD09ZT8iIT0iPT09YjpiPyhlKz0iIiwiPSI9PT1iP2U9PT1jOiIhPSI9PT1iP2UhPT1jOiJePSI9PT1iP2MmJjA9PT1lLmluZGV4T2YoYyk6Iio9Ij09PWI/YyYmZS5pbmRleE9mKGMpPi0xOiIkPSI9PT1iP2MmJmUuc2xpY2UoLWMubGVuZ3RoKT09PWM6In49Ij09PWI/KCIgIitlKyIgIikuaW5kZXhPZihjKT4tMToifD0iPT09Yj9lPT09Y3x8ZS5zbGljZSgwLGMubGVuZ3RoKzEpPT09YysiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj0ibnRoIiE9PWEuc2xpY2UoMCwzKSxnPSJsYXN0IiE9PWEuc2xpY2UoLTQpLGg9Im9mLXR5cGUiPT09YjtyZXR1cm4gMT09PWQmJjA9PT1lP2Z1bmN0aW9uKGEpe3JldHVybiEhYS5wYXJlbnROb2RlfTpmdW5jdGlvbihiLGMsaSl7dmFyIGosayxsLG0sbixvLHA9ZiE9PWc/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixxPWIucGFyZW50Tm9kZSxyPWgmJmIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxzPSFpJiYhaDtpZihxKXtpZihmKXt3aGlsZShwKXtsPWI7d2hpbGUobD1sW3BdKWlmKGg/bC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cjoxPT09bC5ub2RlVHlwZSlyZXR1cm4hMTtvPXA9Im9ubHkiPT09YSYmIW8mJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYobz1bZz9xLmZpcnN0Q2hpbGQ6cS5sYXN0Q2hpbGRdLGcmJnMpe2s9cVt1XXx8KHFbdV09e30pLGo9a1thXXx8W10sbj1qWzBdPT09dyYmalsxXSxtPWpbMF09PT13JiZqWzJdLGw9biYmcS5jaGlsZE5vZGVzW25dO3doaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKDE9PT1sLm5vZGVUeXBlJiYrK20mJmw9PT1iKXtrW2FdPVt3LG4sbV07YnJlYWt9fWVsc2UgaWYocyYmKGo9KGJbdV18fChiW3VdPXt9KSlbYV0pJiZqWzBdPT09dyltPWpbMV07ZWxzZSB3aGlsZShsPSsrbiYmbCYmbFtwXXx8KG09bj0wKXx8by5wb3AoKSlpZigoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKSYmKyttJiYocyYmKChsW3VdfHwobFt1XT17fSkpW2FdPVt3LG1dKSxsPT09YikpYnJlYWs7cmV0dXJuIG0tPWUsbT09PWR8fG0lZD09PTAmJm0vZD49MH19fSxQU0VVRE86ZnVuY3Rpb24oYSxiKXt2YXIgYyxlPWQucHNldWRvc1thXXx8ZC5zZXRGaWx0ZXJzW2EudG9Mb3dlckNhc2UoKV18fGZiLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrYSk7cmV0dXJuIGVbdV0/ZShiKTplLmxlbmd0aD4xPyhjPVthLGEsIiIsYl0sZC5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/aGIoZnVuY3Rpb24oYSxjKXt2YXIgZCxmPWUoYSxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSlkPUsuY2FsbChhLGZbZ10pLGFbZF09IShjW2RdPWZbZ10pfSk6ZnVuY3Rpb24oYSl7cmV0dXJuIGUoYSwwLGMpfSk6ZX19LHBzZXVkb3M6e25vdDpoYihmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGQ9aChhLnJlcGxhY2UoUiwiJDEiKSk7cmV0dXJuIGRbdV0/aGIoZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsZz1kKGEsbnVsbCxlLFtdKSxoPWEubGVuZ3RoO3doaWxlKGgtLSkoZj1nW2hdKSYmKGFbaF09IShiW2hdPWYpKX0pOmZ1bmN0aW9uKGEsZSxmKXtyZXR1cm4gYlswXT1hLGQoYixudWxsLGYsYyksIWMucG9wKCl9fSksaGFzOmhiKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gZmIoYSxiKS5sZW5ndGg+MH19KSxjb250YWluczpoYihmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxlKGIpKS5pbmRleE9mKGEpPi0xfX0pLGxhbmc6aGIoZnVuY3Rpb24oYSl7cmV0dXJuIFcudGVzdChhfHwiIil8fGZiLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2EpLGE9YS5yZXBsYWNlKGNiLGRiKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGIpe3ZhciBjO2RvIGlmKGM9cD9iLmxhbmc6Yi5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGIuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIGM9Yy50b0xvd2VyQ2FzZSgpLGM9PT1hfHwwPT09Yy5pbmRleE9mKGErIi0iKTt3aGlsZSgoYj1iLnBhcmVudE5vZGUpJiYxPT09Yi5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGIpe3ZhciBjPWEubG9jYXRpb24mJmEubG9jYXRpb24uaGFzaDtyZXR1cm4gYyYmYy5zbGljZSgxKT09PWIuaWR9LHJvb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1vfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW4uYWN0aXZlRWxlbWVudCYmKCFuLmhhc0ZvY3VzfHxuLmhhc0ZvY3VzKCkpJiYhIShhLnR5cGV8fGEuaHJlZnx8fmEudGFiSW5kZXgpfSxlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYhIWEuY2hlY2tlZHx8Im9wdGlvbiI9PT1iJiYhIWEuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGEuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oYSl7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWlmKGEubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiFkLnBzZXVkb3MuZW1wdHkoYSl9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4gWi50ZXN0KGEubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4gWS50ZXN0KGEubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYiYnV0dG9uIj09PWEudHlwZXx8ImJ1dHRvbiI9PT1ifSx0ZXh0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWEudHlwZSYmKG51bGw9PShiPWEuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT1iLnRvTG93ZXJDYXNlKCkpfSxmaXJzdDpuYihmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6bmIoZnVuY3Rpb24oYSxiKXtyZXR1cm5bYi0xXX0pLGVxOm5iKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm5bMD5jP2MrYjpjXX0pLGV2ZW46bmIoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxvZGQ6bmIoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MTtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxsdDpuYihmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzstLWQ+PTA7KWEucHVzaChkKTtyZXR1cm4gYX0pLGd0Om5iKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOysrZDxiOylhLnB1c2goZCk7cmV0dXJuIGF9KX19LGQucHNldWRvcy5udGg9ZC5wc2V1ZG9zLmVxO2ZvcihiIGlue3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KWQucHNldWRvc1tiXT1sYihiKTtmb3IoYiBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KWQucHNldWRvc1tiXT1tYihiKTtmdW5jdGlvbiBwYigpe31wYi5wcm90b3R5cGU9ZC5maWx0ZXJzPWQucHNldWRvcyxkLnNldEZpbHRlcnM9bmV3IHBiLGc9ZmIudG9rZW5pemU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPXpbYSsiICJdO2lmKGspcmV0dXJuIGI/MDprLnNsaWNlKDApO2g9YSxpPVtdLGo9ZC5wcmVGaWx0ZXI7d2hpbGUoaCl7KCFjfHwoZT1TLmV4ZWMoaCkpKSYmKGUmJihoPWguc2xpY2UoZVswXS5sZW5ndGgpfHxoKSxpLnB1c2goZj1bXSkpLGM9ITEsKGU9VC5leGVjKGgpKSYmKGM9ZS5zaGlmdCgpLGYucHVzaCh7dmFsdWU6Yyx0eXBlOmVbMF0ucmVwbGFjZShSLCIgIil9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtmb3IoZyBpbiBkLmZpbHRlcikhKGU9WFtnXS5leGVjKGgpKXx8altnXSYmIShlPWpbZ10oZSkpfHwoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZyxtYXRjaGVzOmV9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtpZighYylicmVha31yZXR1cm4gYj9oLmxlbmd0aDpoP2ZiLmVycm9yKGEpOnooYSxpKS5zbGljZSgwKX07ZnVuY3Rpb24gcWIoYSl7Zm9yKHZhciBiPTAsYz1hLmxlbmd0aCxkPSIiO2M+YjtiKyspZCs9YVtiXS52YWx1ZTtyZXR1cm4gZH1mdW5jdGlvbiByYihhLGIsYyl7dmFyIGQ9Yi5kaXIsZT1jJiYicGFyZW50Tm9kZSI9PT1kLGY9eCsrO3JldHVybiBiLmZpcnN0P2Z1bmN0aW9uKGIsYyxmKXt3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpcmV0dXJuIGEoYixjLGYpfTpmdW5jdGlvbihiLGMsZyl7dmFyIGgsaSxqPVt3LGZdO2lmKGcpe3doaWxlKGI9YltkXSlpZigoMT09PWIubm9kZVR5cGV8fGUpJiZhKGIsYyxnKSlyZXR1cm4hMH1lbHNlIHdoaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSl7aWYoaT1iW3VdfHwoYlt1XT17fSksKGg9aVtkXSkmJmhbMF09PT13JiZoWzFdPT09ZilyZXR1cm4galsyXT1oWzJdO2lmKGlbZF09aixqWzJdPWEoYixjLGcpKXJldHVybiEwfX19ZnVuY3Rpb24gc2IoYSl7cmV0dXJuIGEubGVuZ3RoPjE/ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEubGVuZ3RoO3doaWxlKGUtLSlpZighYVtlXShiLGMsZCkpcmV0dXJuITE7cmV0dXJuITB9OmFbMF19ZnVuY3Rpb24gdGIoYSxiLGMpe2Zvcih2YXIgZD0wLGU9Yi5sZW5ndGg7ZT5kO2QrKylmYihhLGJbZF0sYyk7cmV0dXJuIGN9ZnVuY3Rpb24gdWIoYSxiLGMsZCxlKXtmb3IodmFyIGYsZz1bXSxoPTAsaT1hLmxlbmd0aCxqPW51bGwhPWI7aT5oO2grKykoZj1hW2hdKSYmKCFjfHxjKGYsZCxlKSkmJihnLnB1c2goZiksaiYmYi5wdXNoKGgpKTtyZXR1cm4gZ31mdW5jdGlvbiB2YihhLGIsYyxkLGUsZil7cmV0dXJuIGQmJiFkW3VdJiYoZD12YihkKSksZSYmIWVbdV0mJihlPXZiKGUsZikpLGhiKGZ1bmN0aW9uKGYsZyxoLGkpe3ZhciBqLGssbCxtPVtdLG49W10sbz1nLmxlbmd0aCxwPWZ8fHRiKGJ8fCIqIixoLm5vZGVUeXBlP1toXTpoLFtdKSxxPSFhfHwhZiYmYj9wOnViKHAsbSxhLGgsaSkscj1jP2V8fChmP2E6b3x8ZCk/W106ZzpxO2lmKGMmJmMocSxyLGgsaSksZCl7aj11YihyLG4pLGQoaixbXSxoLGkpLGs9ai5sZW5ndGg7d2hpbGUoay0tKShsPWpba10pJiYocltuW2tdXT0hKHFbbltrXV09bCkpfWlmKGYpe2lmKGV8fGEpe2lmKGUpe2o9W10saz1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJmoucHVzaChxW2tdPWwpO2UobnVsbCxyPVtdLGosaSl9az1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJihqPWU/Sy5jYWxsKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj11YihyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6SS5hcHBseShnLHIpfSl9ZnVuY3Rpb24gd2IoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz1yYihmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9cmIoZnVuY3Rpb24oYSl7cmV0dXJuIEsuY2FsbChiLGEpPi0xfSxoLCEwKSxtPVtmdW5jdGlvbihhLGMsZCl7cmV0dXJuIWcmJihkfHxjIT09ail8fCgoYj1jKS5ub2RlVHlwZT9rKGEsYyxkKTpsKGEsYyxkKSl9XTtmPmk7aSsrKWlmKGM9ZC5yZWxhdGl2ZVthW2ldLnR5cGVdKW09W3JiKHNiKG0pLGMpXTtlbHNle2lmKGM9ZC5maWx0ZXJbYVtpXS50eXBlXS5hcHBseShudWxsLGFbaV0ubWF0Y2hlcyksY1t1XSl7Zm9yKGU9KytpO2Y+ZTtlKyspaWYoZC5yZWxhdGl2ZVthW2VdLnR5cGVdKWJyZWFrO3JldHVybiB2YihpPjEmJnNiKG0pLGk+MSYmcWIoYS5zbGljZSgwLGktMSkuY29uY2F0KHt2YWx1ZToiICI9PT1hW2ktMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShSLCIkMSIpLGMsZT5pJiZ3YihhLnNsaWNlKGksZSkpLGY+ZSYmd2IoYT1hLnNsaWNlKGUpKSxmPmUmJnFiKGEpKX1tLnB1c2goYyl9cmV0dXJuIHNiKG0pfWZ1bmN0aW9uIHhiKGEsYil7dmFyIGM9Yi5sZW5ndGg+MCxlPWEubGVuZ3RoPjAsZj1mdW5jdGlvbihmLGcsaCxpLGspe3ZhciBsLG0sbyxwPTAscT0iMCIscj1mJiZbXSxzPVtdLHQ9aix1PWZ8fGUmJmQuZmluZC5UQUcoIioiLGspLHY9dys9bnVsbD09dD8xOk1hdGgucmFuZG9tKCl8fC4xLHg9dS5sZW5ndGg7Zm9yKGsmJihqPWchPT1uJiZnKTtxIT09eCYmbnVsbCE9KGw9dVtxXSk7cSsrKXtpZihlJiZsKXttPTA7d2hpbGUobz1hW20rK10paWYobyhsLGcsaCkpe2kucHVzaChsKTticmVha31rJiYodz12KX1jJiYoKGw9IW8mJmwpJiZwLS0sZiYmci5wdXNoKGwpKX1pZihwKz1xLGMmJnEhPT1wKXttPTA7d2hpbGUobz1iW20rK10pbyhyLHMsZyxoKTtpZihmKXtpZihwPjApd2hpbGUocS0tKXJbcV18fHNbcV18fChzW3FdPUcuY2FsbChpKSk7cz11YihzKX1JLmFwcGx5KGkscyksayYmIWYmJnMubGVuZ3RoPjAmJnArYi5sZW5ndGg+MSYmZmIudW5pcXVlU29ydChpKX1yZXR1cm4gayYmKHc9dixqPXQpLHJ9O3JldHVybiBjP2hiKGYpOmZ9cmV0dXJuIGg9ZmIuY29tcGlsZT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1bXSxmPUFbYSsiICJdO2lmKCFmKXtifHwoYj1nKGEpKSxjPWIubGVuZ3RoO3doaWxlKGMtLSlmPXdiKGJbY10pLGZbdV0/ZC5wdXNoKGYpOmUucHVzaChmKTtmPUEoYSx4YihlLGQpKSxmLnNlbGVjdG9yPWF9cmV0dXJuIGZ9LGk9ZmIuc2VsZWN0PWZ1bmN0aW9uKGEsYixlLGYpe3ZhciBpLGosayxsLG0sbj0iZnVuY3Rpb24iPT10eXBlb2YgYSYmYSxvPSFmJiZnKGE9bi5zZWxlY3Rvcnx8YSk7aWYoZT1lfHxbXSwxPT09by5sZW5ndGgpe2lmKGo9b1swXT1vWzBdLnNsaWNlKDApLGoubGVuZ3RoPjImJiJJRCI9PT0oaz1qWzBdKS50eXBlJiZjLmdldEJ5SWQmJjk9PT1iLm5vZGVUeXBlJiZwJiZkLnJlbGF0aXZlW2pbMV0udHlwZV0pe2lmKGI9KGQuZmluZC5JRChrLm1hdGNoZXNbMF0ucmVwbGFjZShjYixkYiksYil8fFtdKVswXSwhYilyZXR1cm4gZTtuJiYoYj1iLnBhcmVudE5vZGUpLGE9YS5zbGljZShqLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPVgubmVlZHNDb250ZXh0LnRlc3QoYSk/MDpqLmxlbmd0aDt3aGlsZShpLS0pe2lmKGs9altpXSxkLnJlbGF0aXZlW2w9ay50eXBlXSlicmVhaztpZigobT1kLmZpbmRbbF0pJiYoZj1tKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNiLGRiKSxhYi50ZXN0KGpbMF0udHlwZSkmJm9iKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoai5zcGxpY2UoaSwxKSxhPWYubGVuZ3RoJiZxYihqKSwhYSlyZXR1cm4gSS5hcHBseShlLGYpLGU7YnJlYWt9fX1yZXR1cm4obnx8aChhLG8pKShmLGIsIXAsZSxhYi50ZXN0KGEpJiZvYihiLnBhcmVudE5vZGUpfHxiKSxlfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9aWIoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGliKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGpiKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmliKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGpiKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGliKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxqYihMLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxmYn0oYSk7bS5maW5kPXMsbS5leHByPXMuc2VsZWN0b3JzLG0uZXhwclsiOiJdPW0uZXhwci5wc2V1ZG9zLG0udW5pcXVlPXMudW5pcXVlU29ydCxtLnRleHQ9cy5nZXRUZXh0LG0uaXNYTUxEb2M9cy5pc1hNTCxtLmNvbnRhaW5zPXMuY29udGFpbnM7dmFyIHQ9bS5leHByLm1hdGNoLm5lZWRzQ29udGV4dCx1PS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8sdj0vXi5bXjojXFtcLixdKiQvO2Z1bmN0aW9uIHcoYSxiLGMpe2lmKG0uaXNGdW5jdGlvbihiKSlyZXR1cm4gbS5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4hIWIuY2FsbChhLGQsYSkhPT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gbS5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iIT09Y30pO2lmKCJzdHJpbmciPT10eXBlb2YgYil7aWYodi50ZXN0KGIpKXJldHVybiBtLmZpbHRlcihiLGEsYyk7Yj1tLmZpbHRlcihiLGEpfXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gbS5pbkFycmF5KGEsYik+PTAhPT1jfSl9bS5maWx0ZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWJbMF07cmV0dXJuIGMmJihhPSI6bm90KCIrYSsiKSIpLDE9PT1iLmxlbmd0aCYmMT09PWQubm9kZVR5cGU/bS5maW5kLm1hdGNoZXNTZWxlY3RvcihkLGEpP1tkXTpbXTptLmZpbmQubWF0Y2hlcyhhLG0uZ3JlcChiLGZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZX0pKX0sbS5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXSxkPXRoaXMsZT1kLmxlbmd0aDtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIHRoaXMucHVzaFN0YWNrKG0oYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGI9MDtlPmI7YisrKWlmKG0uY29udGFpbnMoZFtiXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IoYj0wO2U+YjtiKyspbS5maW5kKGEsZFtiXSxjKTtyZXR1cm4gYz10aGlzLnB1c2hTdGFjayhlPjE/bS51bmlxdWUoYyk6YyksYy5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiK2E6YSxjfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcodGhpcyxhfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcodGhpcyxhfHxbXSwhMCkpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIXcodGhpcywic3RyaW5nIj09dHlwZW9mIGEmJnQudGVzdChhKT9tKGEpOmF8fFtdLCExKS5sZW5ndGh9fSk7dmFyIHgseT1hLmRvY3VtZW50LHo9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxBPW0uZm4uaW5pdD1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7aWYoIWEpcmV0dXJuIHRoaXM7aWYoInN0cmluZyI9PXR5cGVvZiBhKXtpZihjPSI8Ij09PWEuY2hhckF0KDApJiYiPiI9PT1hLmNoYXJBdChhLmxlbmd0aC0xKSYmYS5sZW5ndGg+PTM/W251bGwsYSxudWxsXTp6LmV4ZWMoYSksIWN8fCFjWzFdJiZiKXJldHVybiFifHxiLmpxdWVyeT8oYnx8eCkuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGIpLmZpbmQoYSk7aWYoY1sxXSl7aWYoYj1iIGluc3RhbmNlb2YgbT9iWzBdOmIsbS5tZXJnZSh0aGlzLG0ucGFyc2VIVE1MKGNbMV0sYiYmYi5ub2RlVHlwZT9iLm93bmVyRG9jdW1lbnR8fGI6eSwhMCkpLHUudGVzdChjWzFdKSYmbS5pc1BsYWluT2JqZWN0KGIpKWZvcihjIGluIGIpbS5pc0Z1bmN0aW9uKHRoaXNbY10pP3RoaXNbY10oYltjXSk6dGhpcy5hdHRyKGMsYltjXSk7cmV0dXJuIHRoaXN9aWYoZD15LmdldEVsZW1lbnRCeUlkKGNbMl0pLGQmJmQucGFyZW50Tm9kZSl7aWYoZC5pZCE9PWNbMl0pcmV0dXJuIHguZmluZChhKTt0aGlzLmxlbmd0aD0xLHRoaXNbMF09ZH1yZXR1cm4gdGhpcy5jb250ZXh0PXksdGhpcy5zZWxlY3Rvcj1hLHRoaXN9cmV0dXJuIGEubm9kZVR5cGU/KHRoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MSx0aGlzKTptLmlzRnVuY3Rpb24oYSk/InVuZGVmaW5lZCIhPXR5cGVvZiB4LnJlYWR5P3gucmVhZHkoYSk6YShtKToodm9pZCAwIT09YS5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KSxtLm1ha2VBcnJheShhLHRoaXMpKX07QS5wcm90b3R5cGU9bS5mbix4PW0oeSk7dmFyIEI9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sQz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTttLmV4dGVuZCh7ZGlyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPWFbYl07d2hpbGUoZSYmOSE9PWUubm9kZVR5cGUmJih2b2lkIDA9PT1jfHwxIT09ZS5ub2RlVHlwZXx8IW0oZSkuaXMoYykpKTE9PT1lLm5vZGVUeXBlJiZkLnB1c2goZSksZT1lW2JdO3JldHVybiBkfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdO2E7YT1hLm5leHRTaWJsaW5nKTE9PT1hLm5vZGVUeXBlJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pLG0uZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oYSl7dmFyIGIsYz1tKGEsdGhpcyksZD1jLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2Q+YjtiKyspaWYobS5jb250YWlucyh0aGlzLGNbYl0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPXQudGVzdChhKXx8InN0cmluZyIhPXR5cGVvZiBhP20oYSxifHx0aGlzLmNvbnRleHQpOjA7ZT5kO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJm0uZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9tLnVuaXF1ZShmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP20uaW5BcnJheSh0aGlzWzBdLG0oYSkpOm0uaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobS51bmlxdWUobS5tZXJnZSh0aGlzLmdldCgpLG0oYSxiKSkpKX0sYWRkQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09YT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihhKSl9fSk7ZnVuY3Rpb24gRChhLGIpe2RvIGE9YVtiXTt3aGlsZShhJiYxIT09YS5ub2RlVHlwZSk7cmV0dXJuIGF9bS5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYxMSE9PWIubm9kZVR5cGU/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBtLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBEKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBtLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBtLnNpYmxpbmcoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBtLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG0ubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDptLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe20uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1tLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW0uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihDW2FdfHwoZT1tLnVuaXF1ZShlKSksQi50ZXN0KGEpJiYoZT1lLnJldmVyc2UoKSkpLHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBFPS9cUysvZyxGPXt9O2Z1bmN0aW9uIEcoYSl7dmFyIGI9RlthXT17fTtyZXR1cm4gbS5lYWNoKGEubWF0Y2goRSl8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bS5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/RlthXXx8RyhhKTptLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmLGcsaD1bXSxpPSFhLm9uY2UmJltdLGo9ZnVuY3Rpb24obCl7Zm9yKGM9YS5tZW1vcnkmJmwsZD0hMCxmPWd8fDAsZz0wLGU9aC5sZW5ndGgsYj0hMDtoJiZlPmY7ZisrKWlmKGhbZl0uYXBwbHkobFswXSxsWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlKXtjPSExO2JyZWFrfWI9ITEsaCYmKGk/aS5sZW5ndGgmJmooaS5zaGlmdCgpKTpjP2g9W106ay5kaXNhYmxlKCkpfSxrPXthZGQ6ZnVuY3Rpb24oKXtpZihoKXt2YXIgZD1oLmxlbmd0aDshZnVuY3Rpb24gZihiKXttLmVhY2goYixmdW5jdGlvbihiLGMpe3ZhciBkPW0udHlwZShjKTsiZnVuY3Rpb24iPT09ZD9hLnVuaXF1ZSYmay5oYXMoYyl8fGgucHVzaChjKTpjJiZjLmxlbmd0aCYmInN0cmluZyIhPT1kJiZmKGMpfSl9KGFyZ3VtZW50cyksYj9lPWgubGVuZ3RoOmMmJihnPWQsaihjKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBoJiZtLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYyl7dmFyIGQ7d2hpbGUoKGQ9bS5pbkFycmF5KGMsaCxkKSk+LTEpaC5zcGxpY2UoZCwxKSxiJiYoZT49ZCYmZS0tLGY+PWQmJmYtLSl9KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/bS5pbkFycmF5KGEsaCk+LTE6ISghaHx8IWgubGVuZ3RoKX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaD1bXSxlPTAsdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBoPWk9Yz12b2lkIDAsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haH0sbG9jazpmdW5jdGlvbigpe3JldHVybiBpPXZvaWQgMCxjfHxrLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sZmlyZVdpdGg6ZnVuY3Rpb24oYSxjKXtyZXR1cm4haHx8ZCYmIWl8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sYj9pLnB1c2goYyk6aihjKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBrLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBrfSxtLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG0uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbS5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBtLkRlZmVycmVkKGZ1bmN0aW9uKGMpe20uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bS5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZtLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5kb25lKGMucmVzb2x2ZSkuZmFpbChjLnJlamVjdCkucHJvZ3Jlc3MoYy5ub3RpZnkpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP20uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbS5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1kLmNhbGwoYXJndW1lbnRzKSxlPWMubGVuZ3RoLGY9MSE9PWV8fGEmJm0uaXNGdW5jdGlvbihhLnByb21pc2UpP2U6MCxnPTE9PT1mP2E6bS5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihlKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZC5jYWxsKGFyZ3VtZW50cyk6ZSxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGU+MSlmb3IoaT1uZXcgQXJyYXkoZSksaj1uZXcgQXJyYXkoZSksaz1uZXcgQXJyYXkoZSk7ZT5iO2IrKyljW2JdJiZtLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5kb25lKGgoYixrLGMpKS5mYWlsKGcucmVqZWN0KS5wcm9ncmVzcyhoKGIsaixpKSk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEg7bS5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbS5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxtLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9tLnJlYWR5V2FpdCsrOm0ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITA/IS0tbS5yZWFkeVdhaXQ6IW0uaXNSZWFkeSl7aWYoIXkuYm9keSlyZXR1cm4gc2V0VGltZW91dChtLnJlYWR5KTttLmlzUmVhZHk9ITAsYSE9PSEwJiYtLW0ucmVhZHlXYWl0PjB8fChILnJlc29sdmVXaXRoKHksW21dKSxtLmZuLnRyaWdnZXJIYW5kbGVyJiYobSh5KS50cmlnZ2VySGFuZGxlcigicmVhZHkiKSxtKHkpLm9mZigicmVhZHkiKSkpfX19KTtmdW5jdGlvbiBJKCl7eS5hZGRFdmVudExpc3RlbmVyPyh5LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEosITEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsSiwhMSkpOih5LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEopLGEuZGV0YWNoRXZlbnQoIm9ubG9hZCIsSikpfWZ1bmN0aW9uIEooKXsoeS5hZGRFdmVudExpc3RlbmVyfHwibG9hZCI9PT1ldmVudC50eXBlfHwiY29tcGxldGUiPT09eS5yZWFkeVN0YXRlKSYmKEkoKSxtLnJlYWR5KCkpfW0ucmVhZHkucHJvbWlzZT1mdW5jdGlvbihiKXtpZighSClpZihIPW0uRGVmZXJyZWQoKSwiY29tcGxldGUiPT09eS5yZWFkeVN0YXRlKXNldFRpbWVvdXQobS5yZWFkeSk7ZWxzZSBpZih5LmFkZEV2ZW50TGlzdGVuZXIpeS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixKLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLEosITEpO2Vsc2V7eS5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixKKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLEopO3ZhciBjPSExO3RyeXtjPW51bGw9PWEuZnJhbWVFbGVtZW50JiZ5LmRvY3VtZW50RWxlbWVudH1jYXRjaChkKXt9YyYmYy5kb1Njcm9sbCYmIWZ1bmN0aW9uIGUoKXtpZighbS5pc1JlYWR5KXt0cnl7Yy5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3JldHVybiBzZXRUaW1lb3V0KGUsNTApfUkoKSxtLnJlYWR5KCl9fSgpfXJldHVybiBILnByb21pc2UoYil9O3ZhciBLPSJ1bmRlZmluZWQiLEw7Zm9yKEwgaW4gbShrKSlicmVhaztrLm93bkxhc3Q9IjAiIT09TCxrLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9ITEsbShmdW5jdGlvbigpe3ZhciBhLGIsYyxkO2M9eS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLGMmJmMuc3R5bGUmJihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9ImRpc3BsYXk6aW5saW5lO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGsuaW5saW5lQmxvY2tOZWVkc0xheW91dD1hPTM9PT1iLm9mZnNldFdpZHRoLGEmJihjLnN0eWxlLnpvb209MSkpLGMucmVtb3ZlQ2hpbGQoZCkpfSksZnVuY3Rpb24oKXt2YXIgYT15LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKG51bGw9PWsuZGVsZXRlRXhwYW5kbyl7ay5kZWxldGVFeHBhbmRvPSEwO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKGIpe2suZGVsZXRlRXhwYW5kbz0hMX19YT1udWxsfSgpLG0uYWNjZXB0RGF0YT1mdW5jdGlvbihhKXt2YXIgYj1tLm5vRGF0YVsoYS5ub2RlTmFtZSsiICIpLnRvTG93ZXJDYXNlKCldLGM9K2Eubm9kZVR5cGV8fDE7cmV0dXJuIDEhPT1jJiY5IT09Yz8hMTohYnx8YiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn07dmFyIE09L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxOPS8oW0EtWl0pL2c7ZnVuY3Rpb24gTyhhLGIsYyl7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpe3ZhciBkPSJkYXRhLSIrYi5yZXBsYWNlKE4sIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSJ0cnVlIj09PWM/ITA6ImZhbHNlIj09PWM/ITE6Im51bGwiPT09Yz9udWxsOitjKyIiPT09Yz8rYzpNLnRlc3QoYyk/bS5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9bS5kYXRhKGEsYixjKX1lbHNlIGM9dm9pZCAwfXJldHVybiBjfWZ1bmN0aW9uIFAoYSl7dmFyIGI7Zm9yKGIgaW4gYSlpZigoImRhdGEiIT09Ynx8IW0uaXNFbXB0eU9iamVjdChhW2JdKSkmJiJ0b0pTT04iIT09YilyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBRKGEsYixkLGUpe2lmKG0uYWNjZXB0RGF0YShhKSl7dmFyIGYsZyxoPW0uZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP20uY2FjaGU6YSxrPWk/YVtoXTphW2hdJiZoOw0KaWYoayYmaltrXSYmKGV8fGpba10uZGF0YSl8fHZvaWQgMCE9PWR8fCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4ga3x8KGs9aT9hW2hdPWMucG9wKCl8fG0uZ3VpZCsrOmgpLGpba118fChqW2tdPWk/e306e3RvSlNPTjptLm5vb3B9KSwoIm9iamVjdCI9PXR5cGVvZiBifHwiZnVuY3Rpb24iPT10eXBlb2YgYikmJihlP2pba109bS5leHRlbmQoaltrXSxiKTpqW2tdLmRhdGE9bS5leHRlbmQoaltrXS5kYXRhLGIpKSxnPWpba10sZXx8KGcuZGF0YXx8KGcuZGF0YT17fSksZz1nLmRhdGEpLHZvaWQgMCE9PWQmJihnW20uY2FtZWxDYXNlKGIpXT1kKSwic3RyaW5nIj09dHlwZW9mIGI/KGY9Z1tiXSxudWxsPT1mJiYoZj1nW20uY2FtZWxDYXNlKGIpXSkpOmY9ZyxmfX1mdW5jdGlvbiBSKGEsYixjKXtpZihtLmFjY2VwdERhdGEoYSkpe3ZhciBkLGUsZj1hLm5vZGVUeXBlLGc9Zj9tLmNhY2hlOmEsaD1mP2FbbS5leHBhbmRvXTptLmV4cGFuZG87aWYoZ1toXSl7aWYoYiYmKGQ9Yz9nW2hdOmdbaF0uZGF0YSkpe20uaXNBcnJheShiKT9iPWIuY29uY2F0KG0ubWFwKGIsbS5jYW1lbENhc2UpKTpiIGluIGQ/Yj1bYl06KGI9bS5jYW1lbENhc2UoYiksYj1iIGluIGQ/W2JdOmIuc3BsaXQoIiAiKSksZT1iLmxlbmd0aDt3aGlsZShlLS0pZGVsZXRlIGRbYltlXV07aWYoYz8hUChkKTohbS5pc0VtcHR5T2JqZWN0KGQpKXJldHVybn0oY3x8KGRlbGV0ZSBnW2hdLmRhdGEsUChnW2hdKSkpJiYoZj9tLmNsZWFuRGF0YShbYV0sITApOmsuZGVsZXRlRXhwYW5kb3x8ZyE9Zy53aW5kb3c/ZGVsZXRlIGdbaF06Z1toXT1udWxsKX19fW0uZXh0ZW5kKHtjYWNoZTp7fSxub0RhdGE6eyJhcHBsZXQgIjohMCwiZW1iZWQgIjohMCwib2JqZWN0ICI6ImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCJ9LGhhc0RhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9YS5ub2RlVHlwZT9tLmNhY2hlW2FbbS5leHBhbmRvXV06YVttLmV4cGFuZG9dLCEhYSYmIVAoYSl9LGRhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBRKGEsYixjKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe3JldHVybiBSKGEsYil9LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gUShhLGIsYywhMCl9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFIoYSxiLCEwKX19KSxtLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPXRoaXNbMF0sZz1mJiZmLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09YSl7aWYodGhpcy5sZW5ndGgmJihlPW0uZGF0YShmKSwxPT09Zi5ub2RlVHlwZSYmIW0uX2RhdGEoZiwicGFyc2VkQXR0cnMiKSkpe2M9Zy5sZW5ndGg7d2hpbGUoYy0tKWdbY10mJihkPWdbY10ubmFtZSwwPT09ZC5pbmRleE9mKCJkYXRhLSIpJiYoZD1tLmNhbWVsQ2FzZShkLnNsaWNlKDUpKSxPKGYsZCxlW2RdKSkpO20uX2RhdGEoZiwicGFyc2VkQXR0cnMiLCEwKX1yZXR1cm4gZX1yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGE/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7bS5kYXRhKHRoaXMsYSl9KTphcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7bS5kYXRhKHRoaXMsYSxiKX0pOmY/TyhmLGEsbS5kYXRhKGYsYSkpOnZvaWQgMH0scmVtb3ZlRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bS5yZW1vdmVEYXRhKHRoaXMsYSl9KX19KSxtLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBhPyhiPShifHwiZngiKSsicXVldWUiLGQ9bS5fZGF0YShhLGIpLGMmJighZHx8bS5pc0FycmF5KGMpP2Q9bS5fZGF0YShhLGIsbS5tYWtlQXJyYXkoYykpOmQucHVzaChjKSksZHx8W10pOnZvaWQgMH0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1tLnF1ZXVlKGEsYiksZD1jLmxlbmd0aCxlPWMuc2hpZnQoKSxmPW0uX3F1ZXVlSG9va3MoYSxiKSxnPWZ1bmN0aW9uKCl7bS5kZXF1ZXVlKGEsYil9OyJpbnByb2dyZXNzIj09PWUmJihlPWMuc2hpZnQoKSxkLS0pLGUmJigiZngiPT09YiYmYy51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIGYuc3RvcCxlLmNhbGwoYSxnLGYpKSwhZCYmZiYmZi5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGEsYil7dmFyIGM9YisicXVldWVIb29rcyI7cmV0dXJuIG0uX2RhdGEoYSxjKXx8bS5fZGF0YShhLGMse2VtcHR5Om0uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe20uX3JlbW92ZURhdGEoYSxiKyJxdWV1ZSIpLG0uX3JlbW92ZURhdGEoYSxjKX0pfSl9fSksbS5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihiPWEsYT0iZngiLGMtLSksYXJndW1lbnRzLmxlbmd0aDxjP20ucXVldWUodGhpc1swXSxhKTp2b2lkIDA9PT1iP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9bS5xdWV1ZSh0aGlzLGEsYik7bS5fcXVldWVIb29rcyh0aGlzLGEpLCJmeCI9PT1hJiYiaW5wcm9ncmVzcyIhPT1jWzBdJiZtLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXttLmRlcXVldWUodGhpcyxhKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD0xLGU9bS5EZWZlcnJlZCgpLGY9dGhpcyxnPXRoaXMubGVuZ3RoLGg9ZnVuY3Rpb24oKXstLWR8fGUucmVzb2x2ZVdpdGgoZixbZl0pfTsic3RyaW5nIiE9dHlwZW9mIGEmJihiPWEsYT12b2lkIDApLGE9YXx8ImZ4Ijt3aGlsZShnLS0pYz1tLl9kYXRhKGZbZ10sYSsicXVldWVIb29rcyIpLGMmJmMuZW1wdHkmJihkKyssYy5lbXB0eS5hZGQoaCkpO3JldHVybiBoKCksZS5wcm9taXNlKGIpfX0pO3ZhciBTPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLFQ9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxVPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9Ynx8YSwibm9uZSI9PT1tLmNzcyhhLCJkaXNwbGF5Iil8fCFtLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKX0sVj1tLmFjY2Vzcz1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgaD0wLGk9YS5sZW5ndGgsaj1udWxsPT1jO2lmKCJvYmplY3QiPT09bS50eXBlKGMpKXtlPSEwO2ZvcihoIGluIGMpbS5hY2Nlc3MoYSxiLGgsY1toXSwhMCxmLGcpfWVsc2UgaWYodm9pZCAwIT09ZCYmKGU9ITAsbS5pc0Z1bmN0aW9uKGQpfHwoZz0hMCksaiYmKGc/KGIuY2FsbChhLGQpLGI9bnVsbCk6KGo9YixiPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gai5jYWxsKG0oYSksYyl9KSksYikpZm9yKDtpPmg7aCsrKWIoYVtoXSxjLGc/ZDpkLmNhbGwoYVtoXSxoLGIoYVtoXSxjKSkpO3JldHVybiBlP2E6aj9iLmNhbGwoYSk6aT9iKGFbMF0sYyk6Zn0sVz0vXig/OmNoZWNrYm94fHJhZGlvKSQvaTshZnVuY3Rpb24oKXt2YXIgYT15LmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9eS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aWYoYi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsay5sZWFkaW5nV2hpdGVzcGFjZT0zPT09Yi5maXJzdENoaWxkLm5vZGVUeXBlLGsudGJvZHk9IWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLGsuaHRtbFNlcmlhbGl6ZT0hIWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsay5odG1sNUNsb25lPSI8Om5hdj48LzpuYXY+IiE9PXkuY3JlYXRlRWxlbWVudCgibmF2IikuY2xvbmVOb2RlKCEwKS5vdXRlckhUTUwsYS50eXBlPSJjaGVja2JveCIsYS5jaGVja2VkPSEwLGMuYXBwZW5kQ2hpbGQoYSksay5hcHBlbmRDaGVja2VkPWEuY2hlY2tlZCxiLmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIsay5ub0Nsb25lQ2hlY2tlZD0hIWIuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlLGMuYXBwZW5kQ2hpbGQoYiksYi5pbm5lckhUTUw9IjxpbnB1dCB0eXBlPSdyYWRpbycgY2hlY2tlZD0nY2hlY2tlZCcgbmFtZT0ndCcvPiIsay5jaGVja0Nsb25lPWIuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGsubm9DbG9uZUV2ZW50PSEwLGIuYXR0YWNoRXZlbnQmJihiLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixmdW5jdGlvbigpe2subm9DbG9uZUV2ZW50PSExfSksYi5jbG9uZU5vZGUoITApLmNsaWNrKCkpLG51bGw9PWsuZGVsZXRlRXhwYW5kbyl7ay5kZWxldGVFeHBhbmRvPSEwO3RyeXtkZWxldGUgYi50ZXN0fWNhdGNoKGQpe2suZGVsZXRlRXhwYW5kbz0hMX19fSgpLGZ1bmN0aW9uKCl7dmFyIGIsYyxkPXkuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zm9yKGIgaW57c3VibWl0OiEwLGNoYW5nZTohMCxmb2N1c2luOiEwfSljPSJvbiIrYiwoa1tiKyJCdWJibGVzIl09YyBpbiBhKXx8KGQuc2V0QXR0cmlidXRlKGMsInQiKSxrW2IrIkJ1YmJsZXMiXT1kLmF0dHJpYnV0ZXNbY10uZXhwYW5kbz09PSExKTtkPW51bGx9KCk7dmFyIFg9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWEpJC9pLFk9L15rZXkvLFo9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51KXxjbGljay8sJD0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sXz0vXihbXi5dKikoPzpcLiguKyl8KSQvO2Z1bmN0aW9uIGFiKCl7cmV0dXJuITB9ZnVuY3Rpb24gYmIoKXtyZXR1cm4hMX1mdW5jdGlvbiBjYigpe3RyeXtyZXR1cm4geS5hY3RpdmVFbGVtZW50fWNhdGNoKGEpe319bS5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG4sbyxwLHEscj1tLl9kYXRhKGEpO2lmKHIpe2MuaGFuZGxlciYmKGk9YyxjPWkuaGFuZGxlcixlPWkuc2VsZWN0b3IpLGMuZ3VpZHx8KGMuZ3VpZD1tLmd1aWQrKyksKGc9ci5ldmVudHMpfHwoZz1yLmV2ZW50cz17fSksKGs9ci5oYW5kbGUpfHwoaz1yLmhhbmRsZT1mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIG09PT1LfHxhJiZtLmV2ZW50LnRyaWdnZXJlZD09PWEudHlwZT92b2lkIDA6bS5ldmVudC5kaXNwYXRjaC5hcHBseShrLmVsZW0sYXJndW1lbnRzKX0say5lbGVtPWEpLGI9KGJ8fCIiKS5tYXRjaChFKXx8WyIiXSxoPWIubGVuZ3RoO3doaWxlKGgtLSlmPV8uZXhlYyhiW2hdKXx8W10sbz1xPWZbMV0scD0oZlsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8mJihqPW0uZXZlbnQuc3BlY2lhbFtvXXx8e30sbz0oZT9qLmRlbGVnYXRlVHlwZTpqLmJpbmRUeXBlKXx8byxqPW0uZXZlbnQuc3BlY2lhbFtvXXx8e30sbD1tLmV4dGVuZCh7dHlwZTpvLG9yaWdUeXBlOnEsZGF0YTpkLGhhbmRsZXI6YyxndWlkOmMuZ3VpZCxzZWxlY3RvcjplLG5lZWRzQ29udGV4dDplJiZtLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoZSksbmFtZXNwYWNlOnAuam9pbigiLiIpfSxpKSwobj1nW29dKXx8KG49Z1tvXT1bXSxuLmRlbGVnYXRlQ291bnQ9MCxqLnNldHVwJiZqLnNldHVwLmNhbGwoYSxkLHAsaykhPT0hMXx8KGEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobyxrLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbyxrKSkpLGouYWRkJiYoai5hZGQuY2FsbChhLGwpLGwuaGFuZGxlci5ndWlkfHwobC5oYW5kbGVyLmd1aWQ9Yy5ndWlkKSksZT9uLnNwbGljZShuLmRlbGVnYXRlQ291bnQrKywwLGwpOm4ucHVzaChsKSxtLmV2ZW50Lmdsb2JhbFtvXT0hMCk7YT1udWxsfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixvLHAscSxyPW0uaGFzRGF0YShhKSYmbS5fZGF0YShhKTtpZihyJiYoaz1yLmV2ZW50cykpe2I9KGJ8fCIiKS5tYXRjaChFKXx8WyIiXSxqPWIubGVuZ3RoO3doaWxlKGotLSlpZihoPV8uZXhlYyhiW2pdKXx8W10sbz1xPWhbMV0scD0oaFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8pe2w9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShkP2wuZGVsZWdhdGVUeXBlOmwuYmluZFR5cGUpfHxvLG49a1tvXXx8W10saD1oWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitwLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGk9Zj1uLmxlbmd0aDt3aGlsZShmLS0pZz1uW2ZdLCFlJiZxIT09Zy5vcmlnVHlwZXx8YyYmYy5ndWlkIT09Zy5ndWlkfHxoJiYhaC50ZXN0KGcubmFtZXNwYWNlKXx8ZCYmZCE9PWcuc2VsZWN0b3ImJigiKioiIT09ZHx8IWcuc2VsZWN0b3IpfHwobi5zcGxpY2UoZiwxKSxnLnNlbGVjdG9yJiZuLmRlbGVnYXRlQ291bnQtLSxsLnJlbW92ZSYmbC5yZW1vdmUuY2FsbChhLGcpKTtpJiYhbi5sZW5ndGgmJihsLnRlYXJkb3duJiZsLnRlYXJkb3duLmNhbGwoYSxwLHIuaGFuZGxlKSE9PSExfHxtLnJlbW92ZUV2ZW50KGEsbyxyLmhhbmRsZSksZGVsZXRlIGtbb10pfWVsc2UgZm9yKG8gaW4gayltLmV2ZW50LnJlbW92ZShhLG8rYltqXSxjLGQsITApO20uaXNFbXB0eU9iamVjdChrKSYmKGRlbGV0ZSByLmhhbmRsZSxtLl9yZW1vdmVEYXRhKGEsImV2ZW50cyIpKX19LHRyaWdnZXI6ZnVuY3Rpb24oYixjLGQsZSl7dmFyIGYsZyxoLGksayxsLG4sbz1bZHx8eV0scD1qLmNhbGwoYiwidHlwZSIpP2IudHlwZTpiLHE9ai5jYWxsKGIsIm5hbWVzcGFjZSIpP2IubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYoaD1sPWQ9ZHx8eSwzIT09ZC5ub2RlVHlwZSYmOCE9PWQubm9kZVR5cGUmJiEkLnRlc3QocCttLmV2ZW50LnRyaWdnZXJlZCkmJihwLmluZGV4T2YoIi4iKT49MCYmKHE9cC5zcGxpdCgiLiIpLHA9cS5zaGlmdCgpLHEuc29ydCgpKSxnPXAuaW5kZXhPZigiOiIpPDAmJiJvbiIrcCxiPWJbbS5leHBhbmRvXT9iOm5ldyBtLkV2ZW50KHAsIm9iamVjdCI9PXR5cGVvZiBiJiZiKSxiLmlzVHJpZ2dlcj1lPzI6MyxiLm5hbWVzcGFjZT1xLmpvaW4oIi4iKSxiLm5hbWVzcGFjZV9yZT1iLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitxLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsYi5yZXN1bHQ9dm9pZCAwLGIudGFyZ2V0fHwoYi50YXJnZXQ9ZCksYz1udWxsPT1jP1tiXTptLm1ha2VBcnJheShjLFtiXSksaz1tLmV2ZW50LnNwZWNpYWxbcF18fHt9LGV8fCFrLnRyaWdnZXJ8fGsudHJpZ2dlci5hcHBseShkLGMpIT09ITEpKXtpZighZSYmIWsubm9CdWJibGUmJiFtLmlzV2luZG93KGQpKXtmb3IoaT1rLmRlbGVnYXRlVHlwZXx8cCwkLnRlc3QoaStwKXx8KGg9aC5wYXJlbnROb2RlKTtoO2g9aC5wYXJlbnROb2RlKW8ucHVzaChoKSxsPWg7bD09PShkLm93bmVyRG9jdW1lbnR8fHkpJiZvLnB1c2gobC5kZWZhdWx0Vmlld3x8bC5wYXJlbnRXaW5kb3d8fGEpfW49MDt3aGlsZSgoaD1vW24rK10pJiYhYi5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWIudHlwZT1uPjE/aTprLmJpbmRUeXBlfHxwLGY9KG0uX2RhdGEoaCwiZXZlbnRzIil8fHt9KVtiLnR5cGVdJiZtLl9kYXRhKGgsImhhbmRsZSIpLGYmJmYuYXBwbHkoaCxjKSxmPWcmJmhbZ10sZiYmZi5hcHBseSYmbS5hY2NlcHREYXRhKGgpJiYoYi5yZXN1bHQ9Zi5hcHBseShoLGMpLGIucmVzdWx0PT09ITEmJmIucHJldmVudERlZmF1bHQoKSk7aWYoYi50eXBlPXAsIWUmJiFiLmlzRGVmYXVsdFByZXZlbnRlZCgpJiYoIWsuX2RlZmF1bHR8fGsuX2RlZmF1bHQuYXBwbHkoby5wb3AoKSxjKT09PSExKSYmbS5hY2NlcHREYXRhKGQpJiZnJiZkW3BdJiYhbS5pc1dpbmRvdyhkKSl7bD1kW2ddLGwmJihkW2ddPW51bGwpLG0uZXZlbnQudHJpZ2dlcmVkPXA7dHJ5e2RbcF0oKX1jYXRjaChyKXt9bS5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLGwmJihkW2ddPWwpfXJldHVybiBiLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGEpe2E9bS5ldmVudC5maXgoYSk7dmFyIGIsYyxlLGYsZyxoPVtdLGk9ZC5jYWxsKGFyZ3VtZW50cyksaj0obS5fZGF0YSh0aGlzLCJldmVudHMiKXx8e30pW2EudHlwZV18fFtdLGs9bS5ldmVudC5zcGVjaWFsW2EudHlwZV18fHt9O2lmKGlbMF09YSxhLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWsucHJlRGlzcGF0Y2h8fGsucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGEpIT09ITEpe2g9bS5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsYSxqKSxiPTA7d2hpbGUoKGY9aFtiKytdKSYmIWEuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7YS5jdXJyZW50VGFyZ2V0PWYuZWxlbSxnPTA7d2hpbGUoKGU9Zi5oYW5kbGVyc1tnKytdKSYmIWEuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSkoIWEubmFtZXNwYWNlX3JlfHxhLm5hbWVzcGFjZV9yZS50ZXN0KGUubmFtZXNwYWNlKSkmJihhLmhhbmRsZU9iaj1lLGEuZGF0YT1lLmRhdGEsYz0oKG0uZXZlbnQuc3BlY2lhbFtlLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8ZS5oYW5kbGVyKS5hcHBseShmLmVsZW0saSksdm9pZCAwIT09YyYmKGEucmVzdWx0PWMpPT09ITEmJihhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBrLnBvc3REaXNwYXRjaCYmay5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGEpLGEucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnPVtdLGg9Yi5kZWxlZ2F0ZUNvdW50LGk9YS50YXJnZXQ7aWYoaCYmaS5ub2RlVHlwZSYmKCFhLmJ1dHRvbnx8ImNsaWNrIiE9PWEudHlwZSkpZm9yKDtpIT10aGlzO2k9aS5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1pLm5vZGVUeXBlJiYoaS5kaXNhYmxlZCE9PSEwfHwiY2xpY2siIT09YS50eXBlKSl7Zm9yKGU9W10sZj0wO2g+ZjtmKyspZD1iW2ZdLGM9ZC5zZWxlY3RvcisiICIsdm9pZCAwPT09ZVtjXSYmKGVbY109ZC5uZWVkc0NvbnRleHQ/bShjLHRoaXMpLmluZGV4KGkpPj0wOm0uZmluZChjLHRoaXMsbnVsbCxbaV0pLmxlbmd0aCksZVtjXSYmZS5wdXNoKGQpO2UubGVuZ3RoJiZnLnB1c2goe2VsZW06aSxoYW5kbGVyczplfSl9cmV0dXJuIGg8Yi5sZW5ndGgmJmcucHVzaCh7ZWxlbTp0aGlzLGhhbmRsZXJzOmIuc2xpY2UoaCl9KSxnfSxmaXg6ZnVuY3Rpb24oYSl7aWYoYVttLmV4cGFuZG9dKXJldHVybiBhO3ZhciBiLGMsZCxlPWEudHlwZSxmPWEsZz10aGlzLmZpeEhvb2tzW2VdO2d8fCh0aGlzLmZpeEhvb2tzW2VdPWc9Wi50ZXN0KGUpP3RoaXMubW91c2VIb29rczpZLnRlc3QoZSk/dGhpcy5rZXlIb29rczp7fSksZD1nLnByb3BzP3RoaXMucHJvcHMuY29uY2F0KGcucHJvcHMpOnRoaXMucHJvcHMsYT1uZXcgbS5FdmVudChmKSxiPWQubGVuZ3RoO3doaWxlKGItLSljPWRbYl0sYVtjXT1mW2NdO3JldHVybiBhLnRhcmdldHx8KGEudGFyZ2V0PWYuc3JjRWxlbWVudHx8eSksMz09PWEudGFyZ2V0Lm5vZGVUeXBlJiYoYS50YXJnZXQ9YS50YXJnZXQucGFyZW50Tm9kZSksYS5tZXRhS2V5PSEhYS5tZXRhS2V5LGcuZmlsdGVyP2cuZmlsdGVyKGEsZik6YX0scHJvcHM6ImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG51bGw9PWEud2hpY2gmJihhLndoaWNoPW51bGwhPWIuY2hhckNvZGU/Yi5jaGFyQ29kZTpiLmtleUNvZGUpLGF9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPWIuYnV0dG9uLGc9Yi5mcm9tRWxlbWVudDtyZXR1cm4gbnVsbD09YS5wYWdlWCYmbnVsbCE9Yi5jbGllbnRYJiYoZD1hLnRhcmdldC5vd25lckRvY3VtZW50fHx5LGU9ZC5kb2N1bWVudEVsZW1lbnQsYz1kLmJvZHksYS5wYWdlWD1iLmNsaWVudFgrKGUmJmUuc2Nyb2xsTGVmdHx8YyYmYy5zY3JvbGxMZWZ0fHwwKS0oZSYmZS5jbGllbnRMZWZ0fHxjJiZjLmNsaWVudExlZnR8fDApLGEucGFnZVk9Yi5jbGllbnRZKyhlJiZlLnNjcm9sbFRvcHx8YyYmYy5zY3JvbGxUb3B8fDApLShlJiZlLmNsaWVudFRvcHx8YyYmYy5jbGllbnRUb3B8fDApKSwhYS5yZWxhdGVkVGFyZ2V0JiZnJiYoYS5yZWxhdGVkVGFyZ2V0PWc9PT1hLnRhcmdldD9iLnRvRWxlbWVudDpnKSxhLndoaWNofHx2b2lkIDA9PT1mfHwoYS53aGljaD0xJmY/MToyJmY/Mzo0JmY/MjowKSxhfX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYodGhpcyE9PWNiKCkmJnRoaXMuZm9jdXMpdHJ5e3JldHVybiB0aGlzLmZvY3VzKCksITF9Y2F0Y2goYSl7fX0sZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzPT09Y2IoKSYmdGhpcy5ibHVyPyh0aGlzLmJsdXIoKSwhMSk6dm9pZCAwfSxkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbS5ub2RlTmFtZSh0aGlzLCJpbnB1dCIpJiYiY2hlY2tib3giPT09dGhpcy50eXBlJiZ0aGlzLmNsaWNrPyh0aGlzLmNsaWNrKCksITEpOnZvaWQgMH0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG0ubm9kZU5hbWUoYS50YXJnZXQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe3ZvaWQgMCE9PWEucmVzdWx0JiZhLm9yaWdpbmFsRXZlbnQmJihhLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9YS5yZXN1bHQpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW0uZXh0ZW5kKG5ldyBtLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7ZD9tLmV2ZW50LnRyaWdnZXIoZSxudWxsLGIpOm0uZXZlbnQuZGlzcGF0Y2guY2FsbChiLGUpLGUuaXNEZWZhdWx0UHJldmVudGVkKCkmJmMucHJldmVudERlZmF1bHQoKX19LG0ucmVtb3ZlRXZlbnQ9eS5yZW1vdmVFdmVudExpc3RlbmVyP2Z1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Im9uIitiO2EuZGV0YWNoRXZlbnQmJih0eXBlb2YgYVtkXT09PUsmJihhW2RdPW51bGwpLGEuZGV0YWNoRXZlbnQoZCxjKSl9LG0uRXZlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIG0uRXZlbnQ/KGEmJmEudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWEsdGhpcy50eXBlPWEudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1hLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWEuZGVmYXVsdFByZXZlbnRlZCYmYS5yZXR1cm5WYWx1ZT09PSExP2FiOmJiKTp0aGlzLnR5cGU9YSxiJiZtLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxtLm5vdygpLHZvaWQodGhpc1ttLmV4cGFuZG9dPSEwKSk6bmV3IG0uRXZlbnQoYSxiKX0sbS5FdmVudC5wcm90b3R5cGU9e2lzRGVmYXVsdFByZXZlbnRlZDpiYixpc1Byb3BhZ2F0aW9uU3RvcHBlZDpiYixpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpiYixwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1hYixhJiYoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6YS5yZXR1cm5WYWx1ZT0hMSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWFiLGEmJihhLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKSxhLmNhbmNlbEJ1YmJsZT0hMCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPWFiLGEmJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uJiZhLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSxtLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQiLHBvaW50ZXJlbnRlcjoicG9pbnRlcm92ZXIiLHBvaW50ZXJsZWF2ZToicG9pbnRlcm91dCJ9LGZ1bmN0aW9uKGEsYil7bS5ldmVudC5zcGVjaWFsW2FdPXtkZWxlZ2F0ZVR5cGU6YixiaW5kVHlwZTpiLGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYyxkPXRoaXMsZT1hLnJlbGF0ZWRUYXJnZXQsZj1hLmhhbmRsZU9iajtyZXR1cm4oIWV8fGUhPT1kJiYhbS5jb250YWlucyhkLGUpKSYmKGEudHlwZT1mLm9yaWdUeXBlLGM9Zi5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9YiksY319fSksay5zdWJtaXRCdWJibGVzfHwobS5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gbS5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6dm9pZCBtLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGM9bS5ub2RlTmFtZShiLCJpbnB1dCIpfHxtLm5vZGVOYW1lKGIsImJ1dHRvbiIpP2IuZm9ybTp2b2lkIDA7YyYmIW0uX2RhdGEoYywic3VibWl0QnViYmxlcyIpJiYobS5ldmVudC5hZGQoYywic3VibWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGU9ITB9KSxtLl9kYXRhKGMsInN1Ym1pdEJ1YmJsZXMiLCEwKSl9KX0scG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGUmJihkZWxldGUgYS5fc3VibWl0X2J1YmJsZSx0aGlzLnBhcmVudE5vZGUmJiFhLmlzVHJpZ2dlciYmbS5ldmVudC5zaW11bGF0ZSgic3VibWl0Iix0aGlzLnBhcmVudE5vZGUsYSwhMCkpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG0uZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSksay5jaGFuZ2VCdWJibGVzfHwobS5ldmVudC5zcGVjaWFsLmNoYW5nZT17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gWC50ZXN0KHRoaXMubm9kZU5hbWUpPygoImNoZWNrYm94Ij09PXRoaXMudHlwZXx8InJhZGlvIj09PXRoaXMudHlwZSkmJihtLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXsiY2hlY2tlZCI9PT1hLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLG0uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmIWEuaXNUcmlnZ2VyJiYodGhpcy5fanVzdF9jaGFuZ2VkPSExKSxtLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSwhMCl9KSksITEpOnZvaWQgbS5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7WC50ZXN0KGIubm9kZU5hbWUpJiYhbS5fZGF0YShiLCJjaGFuZ2VCdWJibGVzIikmJihtLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7IXRoaXMucGFyZW50Tm9kZXx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fG0uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksbS5fZGF0YShiLCJjaGFuZ2VCdWJibGVzIiwhMCkpfSl9LGhhbmRsZTpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtyZXR1cm4gdGhpcyE9PWJ8fGEuaXNTaW11bGF0ZWR8fGEuaXNUcmlnZ2VyfHwicmFkaW8iIT09Yi50eXBlJiYiY2hlY2tib3giIT09Yi50eXBlP2EuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpOnZvaWQgMH0sdGVhcmRvd246ZnVuY3Rpb24oKXtyZXR1cm4gbS5ldmVudC5yZW1vdmUodGhpcywiLl9jaGFuZ2UiKSwhWC50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGsuZm9jdXNpbkJ1YmJsZXN8fG0uZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz1mdW5jdGlvbihhKXttLmV2ZW50LnNpbXVsYXRlKGIsYS50YXJnZXQsbS5ldmVudC5maXgoYSksITApfTttLmV2ZW50LnNwZWNpYWxbYl09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGU9bS5fZGF0YShkLGIpO2V8fGQuYWRkRXZlbnRMaXN0ZW5lcihhLGMsITApLG0uX2RhdGEoZCxiLChlfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1tLl9kYXRhKGQsYiktMTtlP20uX2RhdGEoZCxiLGUpOihkLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxjLCEwKSxtLl9yZW1vdmVEYXRhKGQsYikpfX19KSxtLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7InN0cmluZyIhPXR5cGVvZiBiJiYoYz1jfHxiLGI9dm9pZCAwKTtmb3IoZiBpbiBhKXRoaXMub24oZixiLGMsYVtmXSxlKTtyZXR1cm4gdGhpc31pZihudWxsPT1jJiZudWxsPT1kPyhkPWIsYz1iPXZvaWQgMCk6bnVsbD09ZCYmKCJzdHJpbmciPT10eXBlb2YgYj8oZD1jLGM9dm9pZCAwKTooZD1jLGM9YixiPXZvaWQgMCkpLGQ9PT0hMSlkPWJiO2Vsc2UgaWYoIWQpcmV0dXJuIHRoaXM7cmV0dXJuIDE9PT1lJiYoZz1kLGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG0oKS5vZmYoYSksZy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGQuZ3VpZD1nLmd1aWR8fChnLmd1aWQ9bS5ndWlkKyspKSx0aGlzLmVhY2goZnVuY3Rpb24oKXttLmV2ZW50LmFkZCh0aGlzLGEsZCxjLGIpfSl9LG9uZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoYSYmYS5wcmV2ZW50RGVmYXVsdCYmYS5oYW5kbGVPYmopcmV0dXJuIGQ9YS5oYW5kbGVPYmosbShhLmRlbGVnYXRlVGFyZ2V0KS5vZmYoZC5uYW1lc3BhY2U/ZC5vcmlnVHlwZSsiLiIrZC5uYW1lc3BhY2U6ZC5vcmlnVHlwZSxkLnNlbGVjdG9yLGQuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIGEpe2ZvcihlIGluIGEpdGhpcy5vZmYoZSxiLGFbZV0pO3JldHVybiB0aGlzfXJldHVybihiPT09ITF8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGM9YixiPXZvaWQgMCksYz09PSExJiYoYz1iYiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bS5ldmVudC5yZW1vdmUodGhpcyxhLGMsYil9KX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXttLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpc1swXTtyZXR1cm4gYz9tLmV2ZW50LnRyaWdnZXIoYSxiLGMsITApOnZvaWQgMH19KTtmdW5jdGlvbiBkYihhKXt2YXIgYj1lYi5zcGxpdCgifCIpLGM9YS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aWYoYy5jcmVhdGVFbGVtZW50KXdoaWxlKGIubGVuZ3RoKWMuY3JlYXRlRWxlbWVudChiLnBvcCgpKTtyZXR1cm4gY312YXIgZWI9ImFiYnJ8YXJ0aWNsZXxhc2lkZXxhdWRpb3xiZGl8Y2FudmFzfGRhdGF8ZGF0YWxpc3R8ZGV0YWlsc3xmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8aGVhZGVyfGhncm91cHxtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRpbWV8dmlkZW8iLGZiPS8galF1ZXJ5XGQrPSIoPzpudWxsfFxkKykiL2csZ2I9bmV3IFJlZ0V4cCgiPCg/OiIrZWIrIilbXFxzLz5dIiwiaSIpLGhiPS9eXHMrLyxpYj0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLGpiPS88KFtcdzpdKykvLGtiPS88dGJvZHkvaSxsYj0vPHwmIz9cdys7LyxtYj0vPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLG5iPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLG9iPS9eJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxwYj0vXnRydWVcLyguKikvLHFiPS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZyxyYj17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6ay5odG1sU2VyaWFsaXplP1swLCIiLCIiXTpbMSwiWDxkaXY+IiwiPC9kaXY+Il19LHNiPWRiKHkpLHRiPXNiLmFwcGVuZENoaWxkKHkuY3JlYXRlRWxlbWVudCgiZGl2IikpO3JiLm9wdGdyb3VwPXJiLm9wdGlvbixyYi50Ym9keT1yYi50Zm9vdD1yYi5jb2xncm91cD1yYi5jYXB0aW9uPXJiLnRoZWFkLHJiLnRoPXJiLnRkO2Z1bmN0aW9uIHViKGEsYil7dmFyIGMsZCxlPTAsZj10eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9PUs/YS5nZXRFbGVtZW50c0J5VGFnTmFtZShifHwiKiIpOnR5cGVvZiBhLnF1ZXJ5U2VsZWN0b3JBbGwhPT1LP2EucXVlcnlTZWxlY3RvckFsbChifHwiKiIpOnZvaWQgMDtpZighZilmb3IoZj1bXSxjPWEuY2hpbGROb2Rlc3x8YTtudWxsIT0oZD1jW2VdKTtlKyspIWJ8fG0ubm9kZU5hbWUoZCxiKT9mLnB1c2goZCk6bS5tZXJnZShmLHViKGQsYikpO3JldHVybiB2b2lkIDA9PT1ifHxiJiZtLm5vZGVOYW1lKGEsYik/bS5tZXJnZShbYV0sZik6Zn1mdW5jdGlvbiB2YihhKXtXLnRlc3QoYS50eXBlKSYmKGEuZGVmYXVsdENoZWNrZWQ9YS5jaGVja2VkKX1mdW5jdGlvbiB3YihhLGIpe3JldHVybiBtLm5vZGVOYW1lKGEsInRhYmxlIikmJm0ubm9kZU5hbWUoMTEhPT1iLm5vZGVUeXBlP2I6Yi5maXJzdENoaWxkLCJ0ciIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24geGIoYSl7cmV0dXJuIGEudHlwZT0obnVsbCE9PW0uZmluZC5hdHRyKGEsInR5cGUiKSkrIi8iK2EudHlwZSxhfWZ1bmN0aW9uIHliKGEpe3ZhciBiPXBiLmV4ZWMoYS50eXBlKTtyZXR1cm4gYj9hLnR5cGU9YlsxXTphLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGF9ZnVuY3Rpb24gemIoYSxiKXtmb3IodmFyIGMsZD0wO251bGwhPShjPWFbZF0pO2QrKyltLl9kYXRhKGMsImdsb2JhbEV2YWwiLCFifHxtLl9kYXRhKGJbZF0sImdsb2JhbEV2YWwiKSl9ZnVuY3Rpb24gQWIoYSxiKXtpZigxPT09Yi5ub2RlVHlwZSYmbS5oYXNEYXRhKGEpKXt2YXIgYyxkLGUsZj1tLl9kYXRhKGEpLGc9bS5fZGF0YShiLGYpLGg9Zi5ldmVudHM7aWYoaCl7ZGVsZXRlIGcuaGFuZGxlLGcuZXZlbnRzPXt9O2ZvcihjIGluIGgpZm9yKGQ9MCxlPWhbY10ubGVuZ3RoO2U+ZDtkKyspbS5ldmVudC5hZGQoYixjLGhbY11bZF0pfWcuZGF0YSYmKGcuZGF0YT1tLmV4dGVuZCh7fSxnLmRhdGEpKX19ZnVuY3Rpb24gQmIoYSxiKXt2YXIgYyxkLGU7aWYoMT09PWIubm9kZVR5cGUpe2lmKGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCFrLm5vQ2xvbmVFdmVudCYmYlttLmV4cGFuZG9dKXtlPW0uX2RhdGEoYik7Zm9yKGQgaW4gZS5ldmVudHMpbS5yZW1vdmVFdmVudChiLGQsZS5oYW5kbGUpO2IucmVtb3ZlQXR0cmlidXRlKG0uZXhwYW5kbyl9InNjcmlwdCI9PT1jJiZiLnRleHQhPT1hLnRleHQ/KHhiKGIpLnRleHQ9YS50ZXh0LHliKGIpKToib2JqZWN0Ij09PWM/KGIucGFyZW50Tm9kZSYmKGIub3V0ZXJIVE1MPWEub3V0ZXJIVE1MKSxrLmh0bWw1Q2xvbmUmJmEuaW5uZXJIVE1MJiYhbS50cmltKGIuaW5uZXJIVE1MKSYmKGIuaW5uZXJIVE1MPWEuaW5uZXJIVE1MKSk6ImlucHV0Ij09PWMmJlcudGVzdChhLnR5cGUpPyhiLmRlZmF1bHRDaGVja2VkPWIuY2hlY2tlZD1hLmNoZWNrZWQsYi52YWx1ZSE9PWEudmFsdWUmJihiLnZhbHVlPWEudmFsdWUpKToib3B0aW9uIj09PWM/Yi5kZWZhdWx0U2VsZWN0ZWQ9Yi5zZWxlY3RlZD1hLmRlZmF1bHRTZWxlY3RlZDooImlucHV0Ij09PWN8fCJ0ZXh0YXJlYSI9PT1jKSYmKGIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlKX19bS5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGk9bS5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSk7aWYoay5odG1sNUNsb25lfHxtLmlzWE1MRG9jKGEpfHwhZ2IudGVzdCgiPCIrYS5ub2RlTmFtZSsiPiIpP2Y9YS5jbG9uZU5vZGUoITApOih0Yi5pbm5lckhUTUw9YS5vdXRlckhUTUwsdGIucmVtb3ZlQ2hpbGQoZj10Yi5maXJzdENoaWxkKSksIShrLm5vQ2xvbmVFdmVudCYmay5ub0Nsb25lQ2hlY2tlZHx8MSE9PWEubm9kZVR5cGUmJjExIT09YS5ub2RlVHlwZXx8bS5pc1hNTERvYyhhKSkpZm9yKGQ9dWIoZiksaD11YihhKSxnPTA7bnVsbCE9KGU9aFtnXSk7KytnKWRbZ10mJkJiKGUsZFtnXSk7aWYoYilpZihjKWZvcihoPWh8fHViKGEpLGQ9ZHx8dWIoZiksZz0wO251bGwhPShlPWhbZ10pO2crKylBYihlLGRbZ10pO2Vsc2UgQWIoYSxmKTtyZXR1cm4gZD11YihmLCJzY3JpcHQiKSxkLmxlbmd0aD4wJiZ6YihkLCFpJiZ1YihhLCJzY3JpcHQiKSksZD1oPWU9bnVsbCxmfSxidWlsZEZyYWdtZW50OmZ1bmN0aW9uKGEsYixjLGQpe2Zvcih2YXIgZSxmLGcsaCxpLGosbCxuPWEubGVuZ3RoLG89ZGIoYikscD1bXSxxPTA7bj5xO3ErKylpZihmPWFbcV0sZnx8MD09PWYpaWYoIm9iamVjdCI9PT1tLnR5cGUoZikpbS5tZXJnZShwLGYubm9kZVR5cGU/W2ZdOmYpO2Vsc2UgaWYobGIudGVzdChmKSl7aD1ofHxvLmFwcGVuZENoaWxkKGIuY3JlYXRlRWxlbWVudCgiZGl2IikpLGk9KGpiLmV4ZWMoZil8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksbD1yYltpXXx8cmIuX2RlZmF1bHQsaC5pbm5lckhUTUw9bFsxXStmLnJlcGxhY2UoaWIsIjwkMT48LyQyPiIpK2xbMl0sZT1sWzBdO3doaWxlKGUtLSloPWgubGFzdENoaWxkO2lmKCFrLmxlYWRpbmdXaGl0ZXNwYWNlJiZoYi50ZXN0KGYpJiZwLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShoYi5leGVjKGYpWzBdKSksIWsudGJvZHkpe2Y9InRhYmxlIiE9PWl8fGtiLnRlc3QoZik/Ijx0YWJsZT4iIT09bFsxXXx8a2IudGVzdChmKT8wOmg6aC5maXJzdENoaWxkLGU9ZiYmZi5jaGlsZE5vZGVzLmxlbmd0aDt3aGlsZShlLS0pbS5ub2RlTmFtZShqPWYuY2hpbGROb2Rlc1tlXSwidGJvZHkiKSYmIWouY2hpbGROb2Rlcy5sZW5ndGgmJmYucmVtb3ZlQ2hpbGQoail9bS5tZXJnZShwLGguY2hpbGROb2RlcyksaC50ZXh0Q29udGVudD0iIjt3aGlsZShoLmZpcnN0Q2hpbGQpaC5yZW1vdmVDaGlsZChoLmZpcnN0Q2hpbGQpO2g9by5sYXN0Q2hpbGR9ZWxzZSBwLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShmKSk7aCYmby5yZW1vdmVDaGlsZChoKSxrLmFwcGVuZENoZWNrZWR8fG0uZ3JlcCh1YihwLCJpbnB1dCIpLHZiKSxxPTA7d2hpbGUoZj1wW3ErK10paWYoKCFkfHwtMT09PW0uaW5BcnJheShmLGQpKSYmKGc9bS5jb250YWlucyhmLm93bmVyRG9jdW1lbnQsZiksaD11YihvLmFwcGVuZENoaWxkKGYpLCJzY3JpcHQiKSxnJiZ6YihoKSxjKSl7ZT0wO3doaWxlKGY9aFtlKytdKW9iLnRlc3QoZi50eXBlfHwiIikmJmMucHVzaChmKX1yZXR1cm4gaD1udWxsLG99LGNsZWFuRGF0YTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZCxlLGYsZyxoPTAsaT1tLmV4cGFuZG8saj1tLmNhY2hlLGw9ay5kZWxldGVFeHBhbmRvLG49bS5ldmVudC5zcGVjaWFsO251bGwhPShkPWFbaF0pO2grKylpZigoYnx8bS5hY2NlcHREYXRhKGQpKSYmKGY9ZFtpXSxnPWYmJmpbZl0pKXtpZihnLmV2ZW50cylmb3IoZSBpbiBnLmV2ZW50cyluW2VdP20uZXZlbnQucmVtb3ZlKGQsZSk6bS5yZW1vdmVFdmVudChkLGUsZy5oYW5kbGUpO2pbZl0mJihkZWxldGUgaltmXSxsP2RlbGV0ZSBkW2ldOnR5cGVvZiBkLnJlbW92ZUF0dHJpYnV0ZSE9PUs/ZC5yZW1vdmVBdHRyaWJ1dGUoaSk6ZFtpXT1udWxsLGMucHVzaChmKSl9fX0pLG0uZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBWKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIHZvaWQgMD09PWE/bS50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8eSkuY3JlYXRlVGV4dE5vZGUoYSkpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGI9d2IodGhpcyxhKTtiLmFwcGVuZENoaWxkKGEpfX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj13Yih0aGlzLGEpO2IuaW5zZXJ0QmVmb3JlKGEsYi5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMubmV4dFNpYmxpbmcpfSl9LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPWE/bS5maWx0ZXIoYSx0aGlzKTp0aGlzLGU9MDtudWxsIT0oYz1kW2VdKTtlKyspYnx8MSE9PWMubm9kZVR5cGV8fG0uY2xlYW5EYXRhKHViKGMpKSxjLnBhcmVudE5vZGUmJihiJiZtLmNvbnRhaW5zKGMub3duZXJEb2N1bWVudCxjKSYmemIodWIoYywic2NyaXB0IikpLGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKSk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhLGI9MDtudWxsIT0oYT10aGlzW2JdKTtiKyspezE9PT1hLm5vZGVUeXBlJiZtLmNsZWFuRGF0YSh1YihhLCExKSk7d2hpbGUoYS5maXJzdENoaWxkKWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLm9wdGlvbnMmJm0ubm9kZU5hbWUoYSwic2VsZWN0IikmJihhLm9wdGlvbnMubGVuZ3RoPTApfXJldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGIpe3JldHVybiBhPW51bGw9PWE/ITE6YSxiPW51bGw9PWI/YTpiLHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIG0uY2xvbmUodGhpcyxhLGIpfSl9LGh0bWw6ZnVuY3Rpb24oYSl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdfHx7fSxjPTAsZD10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT1hKXJldHVybiAxPT09Yi5ub2RlVHlwZT9iLmlubmVySFRNTC5yZXBsYWNlKGZiLCIiKTp2b2lkIDA7aWYoISgic3RyaW5nIiE9dHlwZW9mIGF8fG1iLnRlc3QoYSl8fCFrLmh0bWxTZXJpYWxpemUmJmdiLnRlc3QoYSl8fCFrLmxlYWRpbmdXaGl0ZXNwYWNlJiZoYi50ZXN0KGEpfHxyYlsoamIuZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pKXthPWEucmVwbGFjZShpYiwiPCQxPjwvJDI+Iik7dHJ5e2Zvcig7ZD5jO2MrKyliPXRoaXNbY118fHt9LDE9PT1iLm5vZGVUeXBlJiYobS5jbGVhbkRhdGEodWIoYiwhMSkpLGIuaW5uZXJIVE1MPWEpO2I9MH1jYXRjaChlKXt9fWImJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGIpe2E9dGhpcy5wYXJlbnROb2RlLG0uY2xlYW5EYXRhKHViKHRoaXMpKSxhJiZhLnJlcGxhY2VDaGlsZChiLHRoaXMpfSksYSYmKGEubGVuZ3RofHxhLm5vZGVUeXBlKT90aGlzOnRoaXMucmVtb3ZlKCl9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGEsYil7YT1lLmFwcGx5KFtdLGEpO3ZhciBjLGQsZixnLGgsaSxqPTAsbD10aGlzLmxlbmd0aCxuPXRoaXMsbz1sLTEscD1hWzBdLHE9bS5pc0Z1bmN0aW9uKHApO2lmKHF8fGw+MSYmInN0cmluZyI9PXR5cGVvZiBwJiYhay5jaGVja0Nsb25lJiZuYi50ZXN0KHApKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9bi5lcShjKTtxJiYoYVswXT1wLmNhbGwodGhpcyxjLGQuaHRtbCgpKSksZC5kb21NYW5pcChhLGIpfSk7aWYobCYmKGk9bS5idWlsZEZyYWdtZW50KGEsdGhpc1swXS5vd25lckRvY3VtZW50LCExLHRoaXMpLGM9aS5maXJzdENoaWxkLDE9PT1pLmNoaWxkTm9kZXMubGVuZ3RoJiYoaT1jKSxjKSl7Zm9yKGc9bS5tYXAodWIoaSwic2NyaXB0IikseGIpLGY9Zy5sZW5ndGg7bD5qO2orKylkPWksaiE9PW8mJihkPW0uY2xvbmUoZCwhMCwhMCksZiYmbS5tZXJnZShnLHViKGQsInNjcmlwdCIpKSksYi5jYWxsKHRoaXNbal0sZCxqKTtpZihmKWZvcihoPWdbZy5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxtLm1hcChnLHliKSxqPTA7Zj5qO2orKylkPWdbal0sb2IudGVzdChkLnR5cGV8fCIiKSYmIW0uX2RhdGEoZCwiZ2xvYmFsRXZhbCIpJiZtLmNvbnRhaW5zKGgsZCkmJihkLnNyYz9tLl9ldmFsVXJsJiZtLl9ldmFsVXJsKGQuc3JjKTptLmdsb2JhbEV2YWwoKGQudGV4dHx8ZC50ZXh0Q29udGVudHx8ZC5pbm5lckhUTUx8fCIiKS5yZXBsYWNlKHFiLCIiKSkpO2k9Yz1udWxsfXJldHVybiB0aGlzfX0pLG0uZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7bS5mblthXT1mdW5jdGlvbihhKXtmb3IodmFyIGMsZD0wLGU9W10sZz1tKGEpLGg9Zy5sZW5ndGgtMTtoPj1kO2QrKyljPWQ9PT1oP3RoaXM6dGhpcy5jbG9uZSghMCksbShnW2RdKVtiXShjKSxmLmFwcGx5KGUsYy5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBDYixEYj17fTtmdW5jdGlvbiBFYihiLGMpe3ZhciBkLGU9bShjLmNyZWF0ZUVsZW1lbnQoYikpLmFwcGVuZFRvKGMuYm9keSksZj1hLmdldERlZmF1bHRDb21wdXRlZFN0eWxlJiYoZD1hLmdldERlZmF1bHRDb21wdXRlZFN0eWxlKGVbMF0pKT9kLmRpc3BsYXk6bS5jc3MoZVswXSwiZGlzcGxheSIpO3JldHVybiBlLmRldGFjaCgpLGZ9ZnVuY3Rpb24gRmIoYSl7dmFyIGI9eSxjPURiW2FdO3JldHVybiBjfHwoYz1FYihhLGIpLCJub25lIiE9PWMmJmN8fChDYj0oQ2J8fG0oIjxpZnJhbWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iKSkuYXBwZW5kVG8oYi5kb2N1bWVudEVsZW1lbnQpLGI9KENiWzBdLmNvbnRlbnRXaW5kb3d8fENiWzBdLmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsYi53cml0ZSgpLGIuY2xvc2UoKSxjPUViKGEsYiksQ2IuZGV0YWNoKCkpLERiW2FdPWMpLGN9IWZ1bmN0aW9uKCl7dmFyIGE7ay5zaHJpbmtXcmFwQmxvY2tzPWZ1bmN0aW9uKCl7aWYobnVsbCE9YSlyZXR1cm4gYTthPSExO3ZhciBiLGMsZDtyZXR1cm4gYz15LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sYyYmYy5zdHlsZT8oYj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4IixjLmFwcGVuZENoaWxkKGQpLmFwcGVuZENoaWxkKGIpLHR5cGVvZiBiLnN0eWxlLnpvb20hPT1LJiYoYi5zdHlsZS5jc3NUZXh0PSItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Y29udGVudC1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6MDtwYWRkaW5nOjFweDt3aWR0aDoxcHg7em9vbToxIixiLmFwcGVuZENoaWxkKHkuY3JlYXRlRWxlbWVudCgiZGl2IikpLnN0eWxlLndpZHRoPSI1cHgiLGE9MyE9PWIub2Zmc2V0V2lkdGgpLGMucmVtb3ZlQ2hpbGQoZCksYSk6dm9pZCAwfX0oKTt2YXIgR2I9L15tYXJnaW4vLEhiPW5ldyBSZWdFeHAoIl4oIitTKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksSWIsSmIsS2I9L14odG9wfHJpZ2h0fGJvdHRvbXxsZWZ0KSQvO2EuZ2V0Q29tcHV0ZWRTdHlsZT8oSWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCl9LEpiPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8SWIoYSksZz1jP2MuZ2V0UHJvcGVydHlWYWx1ZShiKXx8Y1tiXTp2b2lkIDAsYyYmKCIiIT09Z3x8bS5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSl8fChnPW0uc3R5bGUoYSxiKSksSGIudGVzdChnKSYmR2IudGVzdChiKSYmKGQ9aC53aWR0aCxlPWgubWluV2lkdGgsZj1oLm1heFdpZHRoLGgubWluV2lkdGg9aC5tYXhXaWR0aD1oLndpZHRoPWcsZz1jLndpZHRoLGgud2lkdGg9ZCxoLm1pbldpZHRoPWUsaC5tYXhXaWR0aD1mKSksdm9pZCAwPT09Zz9nOmcrIiJ9KTp5LmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihJYj1mdW5jdGlvbihhKXtyZXR1cm4gYS5jdXJyZW50U3R5bGV9LEpiPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8SWIoYSksZz1jP2NbYl06dm9pZCAwLG51bGw9PWcmJmgmJmhbYl0mJihnPWhbYl0pLEhiLnRlc3QoZykmJiFLYi50ZXN0KGIpJiYoZD1oLmxlZnQsZT1hLnJ1bnRpbWVTdHlsZSxmPWUmJmUubGVmdCxmJiYoZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGgubGVmdD0iZm9udFNpemUiPT09Yj8iMWVtIjpnLGc9aC5waXhlbExlZnQrInB4IixoLmxlZnQ9ZCxmJiYoZS5sZWZ0PWYpKSx2b2lkIDA9PT1nP2c6ZysiInx8ImF1dG8ifSk7ZnVuY3Rpb24gTGIoYSxiKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7dmFyIGM9YSgpO2lmKG51bGwhPWMpcmV0dXJuIGM/dm9pZCBkZWxldGUgdGhpcy5nZXQ6KHRoaXMuZ2V0PWIpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fSFmdW5jdGlvbigpe3ZhciBiLGMsZCxlLGYsZyxoO2lmKGI9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxjPWQmJmQuc3R5bGUpe2MuY3NzVGV4dD0iZmxvYXQ6bGVmdDtvcGFjaXR5Oi41IixrLm9wYWNpdHk9IjAuNSI9PT1jLm9wYWNpdHksay5jc3NGbG9hdD0hIWMuY3NzRmxvYXQsYi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGIuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIixrLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09Yi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxrLmJveFNpemluZz0iIj09PWMuYm94U2l6aW5nfHwiIj09PWMuTW96Qm94U2l6aW5nfHwiIj09PWMuV2Via2l0Qm94U2l6aW5nLG0uZXh0ZW5kKGsse3JlbGlhYmxlSGlkZGVuT2Zmc2V0czpmdW5jdGlvbigpe3JldHVybiBudWxsPT1nJiZpKCksZ30sYm94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZiYmaSgpLGZ9LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZSYmaSgpLGV9LHJlbGlhYmxlTWFyZ2luUmlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09aCYmaSgpLGh9fSk7ZnVuY3Rpb24gaSgpe3ZhciBiLGMsZCxpO2M9eS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLGMmJmMuc3R5bGUmJihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksYi5zdHlsZS5jc3NUZXh0PSItd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjElO3RvcDoxJTtib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjRweDtwb3NpdGlvbjphYnNvbHV0ZSIsZT1mPSExLGg9ITAsYS5nZXRDb21wdXRlZFN0eWxlJiYoZT0iMSUiIT09KGEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfHx7fSkudG9wLGY9IjRweCI9PT0oYS5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCl8fHt3aWR0aDoiNHB4In0pLndpZHRoLGk9Yi5hcHBlbmRDaGlsZCh5LmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxpLnN0eWxlLmNzc1RleHQ9Yi5zdHlsZS5jc3NUZXh0PSItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Y29udGVudC1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6MDtwYWRkaW5nOjAiLGkuc3R5bGUubWFyZ2luUmlnaHQ9aS5zdHlsZS53aWR0aD0iMCIsYi5zdHlsZS53aWR0aD0iMXB4IixoPSFwYXJzZUZsb2F0KChhLmdldENvbXB1dGVkU3R5bGUoaSxudWxsKXx8e30pLm1hcmdpblJpZ2h0KSksYi5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGk9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxpWzBdLnN0eWxlLmNzc1RleHQ9Im1hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtkaXNwbGF5Om5vbmUiLGc9MD09PWlbMF0ub2Zmc2V0SGVpZ2h0LGcmJihpWzBdLnN0eWxlLmRpc3BsYXk9IiIsaVsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixnPTA9PT1pWzBdLm9mZnNldEhlaWdodCksYy5yZW1vdmVDaGlsZChkKSl9fX0oKSxtLnN3YXA9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O3ZhciBNYj0vYWxwaGFcKFteKV0qXCkvaSxOYj0vb3BhY2l0eVxzKj1ccyooW14pXSopLyxPYj0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sUGI9bmV3IFJlZ0V4cCgiXigiK1MrIikoLiopJCIsImkiKSxRYj1uZXcgUmVnRXhwKCJeKFsrLV0pPSgiK1MrIikiLCJpIiksUmI9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFNiPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxUYj1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIFViKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1UYi5sZW5ndGg7d2hpbGUoZS0tKWlmKGI9VGJbZV0rYyxiIGluIGEpcmV0dXJuIGI7cmV0dXJuIGR9ZnVuY3Rpb24gVmIoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bS5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlUoZCkmJihmW2ddPW0uX2RhdGEoZCwib2xkZGlzcGxheSIsRmIoZC5ub2RlTmFtZSkpKSk6KGU9VShkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZtLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzptLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIFdiKGEsYixjKXt2YXIgZD1QYi5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIFhiKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1tLmNzcyhhLGMrVFtmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gWWIoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPUliKGEpLGc9ay5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW0uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1KYihhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLEhiLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYoay5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK1hiKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1tLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPUpiKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6ay5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1tLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1tLmNzc1Byb3BzW2hdfHwobS5jc3NQcm9wc1toXT1VYihpLGgpKSxnPW0uY3NzSG9va3NbYl18fG0uY3NzSG9va3NbaF0sdm9pZCAwPT09YylyZXR1cm4gZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl07aWYoZj10eXBlb2YgYywic3RyaW5nIj09PWYmJihlPVFiLmV4ZWMoYykpJiYoYz0oZVsxXSsxKSplWzJdK3BhcnNlRmxvYXQobS5jc3MoYSxiKSksZj0ibnVtYmVyIiksbnVsbCE9YyYmYz09PWMmJigibnVtYmVyIiE9PWZ8fG0uY3NzTnVtYmVyW2hdfHwoYys9InB4Iiksay5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW0uY2FtZWxDYXNlKGIpO3JldHVybiBiPW0uY3NzUHJvcHNbaF18fChtLmNzc1Byb3BzW2hdPVViKGEuc3R5bGUsaCkpLGc9bS5jc3NIb29rc1tiXXx8bS5jc3NIb29rc1toXSxnJiYiZ2V0ImluIGcmJihmPWcuZ2V0KGEsITAsYykpLHZvaWQgMD09PWYmJihmPUpiKGEsYixkKSksIm5vcm1hbCI9PT1mJiZiIGluIFNiJiYoZj1TYltiXSksIiI9PT1jfHxjPyhlPXBhcnNlRmxvYXQoZiksYz09PSEwfHxtLmlzTnVtZXJpYyhlKT9lfHwwOmYpOmZ9fSksbS5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGM/T2IudGVzdChtLmNzcyhhLCJkaXNwbGF5IikpJiYwPT09YS5vZmZzZXRXaWR0aD9tLnN3YXAoYSxSYixmdW5jdGlvbigpe3JldHVybiBZYihhLGIsZCl9KTpZYihhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJkliKGEpO3JldHVybiBXYihhLGMsZD9YYihhLGIsZCxrLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bS5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksay5vcGFjaXR5fHwobS5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gTmIudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW0uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1tLnRyaW0oZi5yZXBsYWNlKE1iLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPU1iLnRlc3QoZik/Zi5yZXBsYWNlKE1iLGUpOmYrIiAiK2UpfX0pLG0uY3NzSG9va3MubWFyZ2luUmlnaHQ9TGIoay5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/bS5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LEpiLFthLCJtYXJnaW5SaWdodCJdKTp2b2lkIDB9KSxtLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYStiXT17ZXhwYW5kOmZ1bmN0aW9uKGMpe2Zvcih2YXIgZD0wLGU9e30sZj0ic3RyaW5nIj09dHlwZW9mIGM/Yy5zcGxpdCgiICIpOltjXTs0PmQ7ZCsrKWVbYStUW2RdK2JdPWZbZF18fGZbZC0yXXx8ZlswXTtyZXR1cm4gZX19LEdiLnRlc3QoYSl8fChtLmNzc0hvb2tzW2ErYl0uc2V0PVdiKX0pLG0uZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9e30sZz0wO2lmKG0uaXNBcnJheShiKSl7Zm9yKGQ9SWIoYSksZT1iLmxlbmd0aDtlPmc7ZysrKWZbYltnXV09bS5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP20uc3R5bGUoYSxiLGMpOm0uY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIFZiKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIFZiKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oYSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYT9hP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe1UodGhpcyk/bSh0aGlzKS5zaG93KCk6bSh0aGlzKS5oaWRlKCl9KX19KTtmdW5jdGlvbiBaYihhLGIsYyxkLGUpe3JldHVybiBuZXcgWmIucHJvdG90eXBlLmluaXQoYSxiLGMsZCxlKX1tLlR3ZWVuPVpiLFpiLnByb3RvdHlwZT17Y29uc3RydWN0b3I6WmIsaW5pdDpmdW5jdGlvbihhLGIsYyxkLGUsZil7dGhpcy5lbGVtPWEsdGhpcy5wcm9wPWMsdGhpcy5lYXNpbmc9ZXx8InN3aW5nIix0aGlzLm9wdGlvbnM9Yix0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9ZCx0aGlzLnVuaXQ9Znx8KG0uY3NzTnVtYmVyW2NdPyIiOiJweCIpDQp9LGN1cjpmdW5jdGlvbigpe3ZhciBhPVpiLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpaYi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1aYi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5wb3M9Yj10aGlzLm9wdGlvbnMuZHVyYXRpb24/bS5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6YSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqYit0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxjJiZjLnNldD9jLnNldCh0aGlzKTpaYi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxaYi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9WmIucHJvdG90eXBlLFpiLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gbnVsbD09YS5lbGVtW2EucHJvcF18fGEuZWxlbS5zdHlsZSYmbnVsbCE9YS5lbGVtLnN0eWxlW2EucHJvcF0/KGI9bS5jc3MoYS5lbGVtLGEucHJvcCwiIiksYiYmImF1dG8iIT09Yj9iOjApOmEuZWxlbVthLnByb3BdfSxzZXQ6ZnVuY3Rpb24oYSl7bS5meC5zdGVwW2EucHJvcF0/bS5meC5zdGVwW2EucHJvcF0oYSk6YS5lbGVtLnN0eWxlJiYobnVsbCE9YS5lbGVtLnN0eWxlW20uY3NzUHJvcHNbYS5wcm9wXV18fG0uY3NzSG9va3NbYS5wcm9wXSk/bS5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCk6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0sWmIucHJvcEhvb2tzLnNjcm9sbFRvcD1aYi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxtLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4uNS1NYXRoLmNvcyhhKk1hdGguUEkpLzJ9fSxtLmZ4PVpiLnByb3RvdHlwZS5pbml0LG0uZnguc3RlcD17fTt2YXIgJGIsX2IsYWM9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGJjPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIitTKyIpKFthLXolXSopJCIsImkiKSxjYz0vcXVldWVIb29rcyQvLGRjPVtpY10sZWM9eyIqIjpbZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmNyZWF0ZVR3ZWVuKGEsYiksZD1jLmN1cigpLGU9YmMuZXhlYyhiKSxmPWUmJmVbM118fChtLmNzc051bWJlclthXT8iIjoicHgiKSxnPShtLmNzc051bWJlclthXXx8InB4IiE9PWYmJitkKSYmYmMuZXhlYyhtLmNzcyhjLmVsZW0sYSkpLGg9MSxpPTIwO2lmKGcmJmdbM10hPT1mKXtmPWZ8fGdbM10sZT1lfHxbXSxnPStkfHwxO2RvIGg9aHx8Ii41IixnLz1oLG0uc3R5bGUoYy5lbGVtLGEsZytmKTt3aGlsZShoIT09KGg9Yy5jdXIoKS9kKSYmMSE9PWgmJi0taSl9cmV0dXJuIGUmJihnPWMuc3RhcnQ9K2d8fCtkfHwwLGMudW5pdD1mLGMuZW5kPWVbMV0/ZysoZVsxXSsxKSplWzJdOitlWzJdKSxjfV19O2Z1bmN0aW9uIGZjKCl7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXskYj12b2lkIDB9KSwkYj1tLm5vdygpfWZ1bmN0aW9uIGdjKGEsYil7dmFyIGMsZD17aGVpZ2h0OmF9LGU9MDtmb3IoYj1iPzE6MDs0PmU7ZSs9Mi1iKWM9VFtlXSxkWyJtYXJnaW4iK2NdPWRbInBhZGRpbmciK2NdPWE7cmV0dXJuIGImJihkLm9wYWNpdHk9ZC53aWR0aD1hKSxkfWZ1bmN0aW9uIGhjKGEsYixjKXtmb3IodmFyIGQsZT0oZWNbYl18fFtdKS5jb25jYXQoZWNbIioiXSksZj0wLGc9ZS5sZW5ndGg7Zz5mO2YrKylpZihkPWVbZl0uY2FsbChjLGIsYSkpcmV0dXJuIGR9ZnVuY3Rpb24gaWMoYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGwsbj10aGlzLG89e30scD1hLnN0eWxlLHE9YS5ub2RlVHlwZSYmVShhKSxyPW0uX2RhdGEoYSwiZnhzaG93Iik7Yy5xdWV1ZXx8KGg9bS5fcXVldWVIb29rcyhhLCJmeCIpLG51bGw9PWgudW5xdWV1ZWQmJihoLnVucXVldWVkPTAsaT1oLmVtcHR5LmZpcmUsaC5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7aC51bnF1ZXVlZHx8aSgpfSksaC51bnF1ZXVlZCsrLG4uYWx3YXlzKGZ1bmN0aW9uKCl7bi5hbHdheXMoZnVuY3Rpb24oKXtoLnVucXVldWVkLS0sbS5xdWV1ZShhLCJmeCIpLmxlbmd0aHx8aC5lbXB0eS5maXJlKCl9KX0pKSwxPT09YS5ub2RlVHlwZSYmKCJoZWlnaHQiaW4gYnx8IndpZHRoImluIGIpJiYoYy5vdmVyZmxvdz1bcC5vdmVyZmxvdyxwLm92ZXJmbG93WCxwLm92ZXJmbG93WV0saj1tLmNzcyhhLCJkaXNwbGF5IiksbD0ibm9uZSI9PT1qP20uX2RhdGEoYSwib2xkZGlzcGxheSIpfHxGYihhLm5vZGVOYW1lKTpqLCJpbmxpbmUiPT09bCYmIm5vbmUiPT09bS5jc3MoYSwiZmxvYXQiKSYmKGsuaW5saW5lQmxvY2tOZWVkc0xheW91dCYmImlubGluZSIhPT1GYihhLm5vZGVOYW1lKT9wLnpvb209MTpwLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxjLm92ZXJmbG93JiYocC5vdmVyZmxvdz0iaGlkZGVuIixrLnNocmlua1dyYXBCbG9ja3MoKXx8bi5hbHdheXMoZnVuY3Rpb24oKXtwLm92ZXJmbG93PWMub3ZlcmZsb3dbMF0scC5vdmVyZmxvd1g9Yy5vdmVyZmxvd1sxXSxwLm92ZXJmbG93WT1jLm92ZXJmbG93WzJdfSkpO2ZvcihkIGluIGIpaWYoZT1iW2RdLGFjLmV4ZWMoZSkpe2lmKGRlbGV0ZSBiW2RdLGY9Znx8InRvZ2dsZSI9PT1lLGU9PT0ocT8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09ZXx8IXJ8fHZvaWQgMD09PXJbZF0pY29udGludWU7cT0hMH1vW2RdPXImJnJbZF18fG0uc3R5bGUoYSxkKX1lbHNlIGo9dm9pZCAwO2lmKG0uaXNFbXB0eU9iamVjdChvKSkiaW5saW5lIj09PSgibm9uZSI9PT1qP0ZiKGEubm9kZU5hbWUpOmopJiYocC5kaXNwbGF5PWopO2Vsc2V7cj8iaGlkZGVuImluIHImJihxPXIuaGlkZGVuKTpyPW0uX2RhdGEoYSwiZnhzaG93Iix7fSksZiYmKHIuaGlkZGVuPSFxKSxxP20oYSkuc2hvdygpOm4uZG9uZShmdW5jdGlvbigpe20oYSkuaGlkZSgpfSksbi5kb25lKGZ1bmN0aW9uKCl7dmFyIGI7bS5fcmVtb3ZlRGF0YShhLCJmeHNob3ciKTtmb3IoYiBpbiBvKW0uc3R5bGUoYSxiLG9bYl0pfSk7Zm9yKGQgaW4gbylnPWhjKHE/cltkXTowLGQsbiksZCBpbiByfHwocltkXT1nLnN0YXJ0LHEmJihnLmVuZD1nLnN0YXJ0LGcuc3RhcnQ9IndpZHRoIj09PWR8fCJoZWlnaHQiPT09ZD8xOjApKX19ZnVuY3Rpb24gamMoYSxiKXt2YXIgYyxkLGUsZixnO2ZvcihjIGluIGEpaWYoZD1tLmNhbWVsQ2FzZShjKSxlPWJbZF0sZj1hW2NdLG0uaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9bS5jc3NIb29rc1tkXSxnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX1mdW5jdGlvbiBrYyhhLGIsYyl7dmFyIGQsZSxmPTAsZz1kYy5sZW5ndGgsaD1tLkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIGkuZWxlbX0pLGk9ZnVuY3Rpb24oKXtpZihlKXJldHVybiExO2Zvcih2YXIgYj0kYnx8ZmMoKSxjPU1hdGgubWF4KDAsai5zdGFydFRpbWUrai5kdXJhdGlvbi1iKSxkPWMvai5kdXJhdGlvbnx8MCxmPTEtZCxnPTAsaT1qLnR3ZWVucy5sZW5ndGg7aT5nO2crKylqLnR3ZWVuc1tnXS5ydW4oZik7cmV0dXJuIGgubm90aWZ5V2l0aChhLFtqLGYsY10pLDE+ZiYmaT9jOihoLnJlc29sdmVXaXRoKGEsW2pdKSwhMSl9LGo9aC5wcm9taXNlKHtlbGVtOmEscHJvcHM6bS5leHRlbmQoe30sYiksb3B0czptLmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fX0sYyksb3JpZ2luYWxQcm9wZXJ0aWVzOmIsb3JpZ2luYWxPcHRpb25zOmMsc3RhcnRUaW1lOiRifHxmYygpLGR1cmF0aW9uOmMuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9bS5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGQpLGR9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7aWYoZSlyZXR1cm4gdGhpcztmb3IoZT0hMDtkPmM7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj9oLnJlc29sdmVXaXRoKGEsW2osYl0pOmgucmVqZWN0V2l0aChhLFtqLGJdKSx0aGlzfX0pLGs9ai5wcm9wcztmb3IoamMoayxqLm9wdHMuc3BlY2lhbEVhc2luZyk7Zz5mO2YrKylpZihkPWRjW2ZdLmNhbGwoaixhLGssai5vcHRzKSlyZXR1cm4gZDtyZXR1cm4gbS5tYXAoayxoYyxqKSxtLmlzRnVuY3Rpb24oai5vcHRzLnN0YXJ0KSYmai5vcHRzLnN0YXJ0LmNhbGwoYSxqKSxtLmZ4LnRpbWVyKG0uZXh0ZW5kKGkse2VsZW06YSxhbmltOmoscXVldWU6ai5vcHRzLnF1ZXVlfSkpLGoucHJvZ3Jlc3Moai5vcHRzLnByb2dyZXNzKS5kb25lKGoub3B0cy5kb25lLGoub3B0cy5jb21wbGV0ZSkuZmFpbChqLm9wdHMuZmFpbCkuYWx3YXlzKGoub3B0cy5hbHdheXMpfW0uQW5pbWF0aW9uPW0uZXh0ZW5kKGtjLHt0d2VlbmVyOmZ1bmN0aW9uKGEsYil7bS5pc0Z1bmN0aW9uKGEpPyhiPWEsYT1bIioiXSk6YT1hLnNwbGl0KCIgIik7Zm9yKHZhciBjLGQ9MCxlPWEubGVuZ3RoO2U+ZDtkKyspYz1hW2RdLGVjW2NdPWVjW2NdfHxbXSxlY1tjXS51bnNoaWZ0KGIpfSxwcmVmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtiP2RjLnVuc2hpZnQoYSk6ZGMucHVzaChhKX19KSxtLnNwZWVkPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiYib2JqZWN0Ij09dHlwZW9mIGE/bS5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxtLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIW0uaXNGdW5jdGlvbihiKSYmYn07cmV0dXJuIGQuZHVyYXRpb249bS5meC5vZmY/MDoibnVtYmVyIj09dHlwZW9mIGQuZHVyYXRpb24/ZC5kdXJhdGlvbjpkLmR1cmF0aW9uIGluIG0uZnguc3BlZWRzP20uZnguc3BlZWRzW2QuZHVyYXRpb25dOm0uZnguc3BlZWRzLl9kZWZhdWx0LChudWxsPT1kLnF1ZXVlfHxkLnF1ZXVlPT09ITApJiYoZC5xdWV1ZT0iZngiKSxkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oKXttLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWUmJm0uZGVxdWV1ZSh0aGlzLGQucXVldWUpfSxkfSxtLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihVKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1tLmlzRW1wdHlPYmplY3QoYSksZj1tLnNwZWVkKGIsYyxkKSxnPWZ1bmN0aW9uKCl7dmFyIGI9a2ModGhpcyxtLmV4dGVuZCh7fSxhKSxmKTsoZXx8bS5fZGF0YSh0aGlzLCJmaW5pc2giKSkmJmIuc3RvcCghMCl9O3JldHVybiBnLmZpbmlzaD1nLGV8fGYucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShmLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj1hLnN0b3A7ZGVsZXRlIGEuc3RvcCxiKGMpfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihjPWIsYj1hLGE9dm9pZCAwKSxiJiZhIT09ITEmJnRoaXMucXVldWUoYXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ITAsZT1udWxsIT1hJiZhKyJxdWV1ZUhvb2tzIixmPW0udGltZXJzLGc9bS5fZGF0YSh0aGlzKTtpZihlKWdbZV0mJmdbZV0uc3RvcCYmZChnW2VdKTtlbHNlIGZvcihlIGluIGcpZ1tlXSYmZ1tlXS5zdG9wJiZjYy50ZXN0KGUpJiZkKGdbZV0pO2ZvcihlPWYubGVuZ3RoO2UtLTspZltlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZltlXS5xdWV1ZSE9PWF8fChmW2VdLmFuaW0uc3RvcChjKSxiPSExLGYuc3BsaWNlKGUsMSkpOyhifHwhYykmJm0uZGVxdWV1ZSh0aGlzLGEpfSl9LGZpbmlzaDpmdW5jdGlvbihhKXtyZXR1cm4gYSE9PSExJiYoYT1hfHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYixjPW0uX2RhdGEodGhpcyksZD1jW2ErInF1ZXVlIl0sZT1jW2ErInF1ZXVlSG9va3MiXSxmPW0udGltZXJzLGc9ZD9kLmxlbmd0aDowO2ZvcihjLmZpbmlzaD0hMCxtLnF1ZXVlKHRoaXMsYSxbXSksZSYmZS5zdG9wJiZlLnN0b3AuY2FsbCh0aGlzLCEwKSxiPWYubGVuZ3RoO2ItLTspZltiXS5lbGVtPT09dGhpcyYmZltiXS5xdWV1ZT09PWEmJihmW2JdLmFuaW0uc3RvcCghMCksZi5zcGxpY2UoYiwxKSk7Zm9yKGI9MDtnPmI7YisrKWRbYl0mJmRbYl0uZmluaXNoJiZkW2JdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSBjLmZpbmlzaH0pfX0pLG0uZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24oYSxiKXt2YXIgYz1tLmZuW2JdO20uZm5bYl09ZnVuY3Rpb24oYSxkLGUpe3JldHVybiBudWxsPT1hfHwiYm9vbGVhbiI9PXR5cGVvZiBhP2MuYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShnYyhiLCEwKSxhLGQsZSl9fSksbS5lYWNoKHtzbGlkZURvd246Z2MoInNob3ciKSxzbGlkZVVwOmdjKCJoaWRlIiksc2xpZGVUb2dnbGU6Z2MoInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxiKXttLmZuW2FdPWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsYSxjLGQpfX0pLG0udGltZXJzPVtdLG0uZngudGljaz1mdW5jdGlvbigpe3ZhciBhLGI9bS50aW1lcnMsYz0wO2ZvcigkYj1tLm5vdygpO2M8Yi5sZW5ndGg7YysrKWE9YltjXSxhKCl8fGJbY10hPT1hfHxiLnNwbGljZShjLS0sMSk7Yi5sZW5ndGh8fG0uZnguc3RvcCgpLCRiPXZvaWQgMH0sbS5meC50aW1lcj1mdW5jdGlvbihhKXttLnRpbWVycy5wdXNoKGEpLGEoKT9tLmZ4LnN0YXJ0KCk6bS50aW1lcnMucG9wKCl9LG0uZnguaW50ZXJ2YWw9MTMsbS5meC5zdGFydD1mdW5jdGlvbigpe19ifHwoX2I9c2V0SW50ZXJ2YWwobS5meC50aWNrLG0uZnguaW50ZXJ2YWwpKX0sbS5meC5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChfYiksX2I9bnVsbH0sbS5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sbS5mbi5kZWxheT1mdW5jdGlvbihhLGIpe3JldHVybiBhPW0uZng/bS5meC5zcGVlZHNbYV18fGE6YSxiPWJ8fCJmeCIsdGhpcy5xdWV1ZShiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9c2V0VGltZW91dChiLGEpO2Muc3RvcD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChkKX19KX0sZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlO2I9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxiLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLGIuaW5uZXJIVE1MPSIgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdLGM9eS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSxlPWMuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLGQuc3R5bGUuY3NzVGV4dD0idG9wOjFweCIsay5nZXRTZXRBdHRyaWJ1dGU9InQiIT09Yi5jbGFzc05hbWUsay5zdHlsZT0vdG9wLy50ZXN0KGQuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxrLmhyZWZOb3JtYWxpemVkPSIvYSI9PT1kLmdldEF0dHJpYnV0ZSgiaHJlZiIpLGsuY2hlY2tPbj0hIWEudmFsdWUsay5vcHRTZWxlY3RlZD1lLnNlbGVjdGVkLGsuZW5jdHlwZT0hIXkuY3JlYXRlRWxlbWVudCgiZm9ybSIpLmVuY3R5cGUsYy5kaXNhYmxlZD0hMCxrLm9wdERpc2FibGVkPSFlLmRpc2FibGVkLGE9eS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGEuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLGsuaW5wdXQ9IiI9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKSxhLnZhbHVlPSJ0IixhLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksay5yYWRpb1ZhbHVlPSJ0Ij09PWEudmFsdWV9KCk7dmFyIGxjPS9cci9nO20uZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD1tLmlzRnVuY3Rpb24oYSksdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe3ZhciBlOzE9PT10aGlzLm5vZGVUeXBlJiYoZT1kP2EuY2FsbCh0aGlzLGMsbSh0aGlzKS52YWwoKSk6YSxudWxsPT1lP2U9IiI6Im51bWJlciI9PXR5cGVvZiBlP2UrPSIiOm0uaXNBcnJheShlKSYmKGU9bS5tYXAoZSxmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjphKyIifSkpLGI9bS52YWxIb29rc1t0aGlzLnR5cGVdfHxtLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sYiYmInNldCJpbiBiJiZ2b2lkIDAhPT1iLnNldCh0aGlzLGUsInZhbHVlIil8fCh0aGlzLnZhbHVlPWUpKX0pO2lmKGUpcmV0dXJuIGI9bS52YWxIb29rc1tlLnR5cGVdfHxtLnZhbEhvb2tzW2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sYiYmImdldCJpbiBiJiZ2b2lkIDAhPT0oYz1iLmdldChlLCJ2YWx1ZSIpKT9jOihjPWUudmFsdWUsInN0cmluZyI9PXR5cGVvZiBjP2MucmVwbGFjZShsYywiIik6bnVsbD09Yz8iIjpjKX19fSksbS5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1tLmZpbmQuYXR0cihhLCJ2YWx1ZSIpO3JldHVybiBudWxsIT1iP2I6bS50cmltKG0udGV4dChhKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXtmb3IodmFyIGIsYyxkPWEub3B0aW9ucyxlPWEuc2VsZWN0ZWRJbmRleCxmPSJzZWxlY3Qtb25lIj09PWEudHlwZXx8MD5lLGc9Zj9udWxsOltdLGg9Zj9lKzE6ZC5sZW5ndGgsaT0wPmU/aDpmP2U6MDtoPmk7aSsrKWlmKGM9ZFtpXSwhKCFjLnNlbGVjdGVkJiZpIT09ZXx8KGsub3B0RGlzYWJsZWQ/Yy5kaXNhYmxlZDpudWxsIT09Yy5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikpfHxjLnBhcmVudE5vZGUuZGlzYWJsZWQmJm0ubm9kZU5hbWUoYy5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoYj1tKGMpLnZhbCgpLGYpcmV0dXJuIGI7Zy5wdXNoKGIpfXJldHVybiBnfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9YS5vcHRpb25zLGY9bS5tYWtlQXJyYXkoYiksZz1lLmxlbmd0aDt3aGlsZShnLS0paWYoZD1lW2ddLG0uaW5BcnJheShtLnZhbEhvb2tzLm9wdGlvbi5nZXQoZCksZik+PTApdHJ5e2Quc2VsZWN0ZWQ9Yz0hMH1jYXRjaChoKXtkLnNjcm9sbEhlaWdodH1lbHNlIGQuc2VsZWN0ZWQ9ITE7cmV0dXJuIGN8fChhLnNlbGVjdGVkSW5kZXg9LTEpLGV9fX19KSxtLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXttLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbS5pc0FycmF5KGIpP2EuY2hlY2tlZD1tLmluQXJyYXkobShhKS52YWwoKSxiKT49MDp2b2lkIDB9fSxrLmNoZWNrT258fChtLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09PWEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6YS52YWx1ZX0pfSk7dmFyIG1jLG5jLG9jPW0uZXhwci5hdHRySGFuZGxlLHBjPS9eKD86Y2hlY2tlZHxzZWxlY3RlZCkkL2kscWM9ay5nZXRTZXRBdHRyaWJ1dGUscmM9ay5pbnB1dDttLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBWKHRoaXMsbS5hdHRyLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXttLnJlbW92ZUF0dHIodGhpcyxhKX0pfX0pLG0uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9YS5ub2RlVHlwZTtpZihhJiYzIT09ZiYmOCE9PWYmJjIhPT1mKXJldHVybiB0eXBlb2YgYS5nZXRBdHRyaWJ1dGU9PT1LP20ucHJvcChhLGIsYyk6KDE9PT1mJiZtLmlzWE1MRG9jKGEpfHwoYj1iLnRvTG93ZXJDYXNlKCksZD1tLmF0dHJIb29rc1tiXXx8KG0uZXhwci5tYXRjaC5ib29sLnRlc3QoYik/bmM6bWMpKSx2b2lkIDA9PT1jP2QmJiJnZXQiaW4gZCYmbnVsbCE9PShlPWQuZ2V0KGEsYikpP2U6KGU9bS5maW5kLmF0dHIoYSxiKSxudWxsPT1lP3ZvaWQgMDplKTpudWxsIT09Yz9kJiYic2V0ImluIGQmJnZvaWQgMCE9PShlPWQuc2V0KGEsYyxiKSk/ZTooYS5zZXRBdHRyaWJ1dGUoYixjKyIiKSxjKTp2b2lkIG0ucmVtb3ZlQXR0cihhLGIpKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT0wLGY9YiYmYi5tYXRjaChFKTtpZihmJiYxPT09YS5ub2RlVHlwZSl3aGlsZShjPWZbZSsrXSlkPW0ucHJvcEZpeFtjXXx8YyxtLmV4cHIubWF0Y2guYm9vbC50ZXN0KGMpP3JjJiZxY3x8IXBjLnRlc3QoYyk/YVtkXT0hMTphW20uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYyldPWFbZF09ITE6bS5hdHRyKGEsYywiIiksYS5yZW1vdmVBdHRyaWJ1dGUocWM/YzpkKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oYSxiKXtpZighay5yYWRpb1ZhbHVlJiYicmFkaW8iPT09YiYmbS5ub2RlTmFtZShhLCJpbnB1dCIpKXt2YXIgYz1hLnZhbHVlO3JldHVybiBhLnNldEF0dHJpYnV0ZSgidHlwZSIsYiksYyYmKGEudmFsdWU9YyksYn19fX19KSxuYz17c2V0OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYj09PSExP20ucmVtb3ZlQXR0cihhLGMpOnJjJiZxY3x8IXBjLnRlc3QoYyk/YS5zZXRBdHRyaWJ1dGUoIXFjJiZtLnByb3BGaXhbY118fGMsYyk6YVttLmNhbWVsQ2FzZSgiZGVmYXVsdC0iK2MpXT1hW2NdPSEwLGN9fSxtLmVhY2gobS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24oYSxiKXt2YXIgYz1vY1tiXXx8bS5maW5kLmF0dHI7b2NbYl09cmMmJnFjfHwhcGMudGVzdChiKT9mdW5jdGlvbihhLGIsZCl7dmFyIGUsZjtyZXR1cm4gZHx8KGY9b2NbYl0sb2NbYl09ZSxlPW51bGwhPWMoYSxiLGQpP2IudG9Mb3dlckNhc2UoKTpudWxsLG9jW2JdPWYpLGV9OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYz92b2lkIDA6YVttLmNhbWVsQ2FzZSgiZGVmYXVsdC0iK2IpXT9iLnRvTG93ZXJDYXNlKCk6bnVsbH19KSxyYyYmcWN8fChtLmF0dHJIb29rcy52YWx1ZT17c2V0OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5ub2RlTmFtZShhLCJpbnB1dCIpP3ZvaWQoYS5kZWZhdWx0VmFsdWU9Yik6bWMmJm1jLnNldChhLGIsYyl9fSkscWN8fChtYz17c2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmdldEF0dHJpYnV0ZU5vZGUoYyk7cmV0dXJuIGR8fGEuc2V0QXR0cmlidXRlTm9kZShkPWEub3duZXJEb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoYykpLGQudmFsdWU9Yis9IiIsInZhbHVlIj09PWN8fGI9PT1hLmdldEF0dHJpYnV0ZShjKT9iOnZvaWQgMH19LG9jLmlkPW9jLm5hbWU9b2MuY29vcmRzPWZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6KGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmIiIhPT1kLnZhbHVlP2QudmFsdWU6bnVsbH0sbS52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuZ2V0QXR0cmlidXRlTm9kZShiKTtyZXR1cm4gYyYmYy5zcGVjaWZpZWQ/Yy52YWx1ZTp2b2lkIDB9LHNldDptYy5zZXR9LG0uYXR0ckhvb2tzLmNvbnRlbnRlZGl0YWJsZT17c2V0OmZ1bmN0aW9uKGEsYixjKXttYy5zZXQoYSwiIj09PWI/ITE6YixjKX19LG0uZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXttLmF0dHJIb29rc1tiXT17c2V0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIiI9PT1jPyhhLnNldEF0dHJpYnV0ZShiLCJhdXRvIiksYyk6dm9pZCAwfX19KSksay5zdHlsZXx8KG0uYXR0ckhvb2tzLnN0eWxlPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dHx8dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0PWIrIiJ9fSk7dmFyIHNjPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmplY3QpJC9pLHRjPS9eKD86YXxhcmVhKSQvaTttLmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihhLGIpe3JldHVybiBWKHRoaXMsbS5wcm9wLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGEpe3JldHVybiBhPW0ucHJvcEZpeFthXXx8YSx0aGlzLmVhY2goZnVuY3Rpb24oKXt0cnl7dGhpc1thXT12b2lkIDAsZGVsZXRlIHRoaXNbYV19Y2F0Y2goYil7fX0pfX0pLG0uZXh0ZW5kKHtwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn0scHJvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGc9YS5ub2RlVHlwZTtpZihhJiYzIT09ZyYmOCE9PWcmJjIhPT1nKXJldHVybiBmPTEhPT1nfHwhbS5pc1hNTERvYyhhKSxmJiYoYj1tLnByb3BGaXhbYl18fGIsZT1tLnByb3BIb29rc1tiXSksdm9pZCAwIT09Yz9lJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDphW2JdPWM6ZSYmImdldCJpbiBlJiZudWxsIT09KGQ9ZS5nZXQoYSxiKSk/ZDphW2JdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bS5maW5kLmF0dHIoYSwidGFiaW5kZXgiKTtyZXR1cm4gYj9wYXJzZUludChiLDEwKTpzYy50ZXN0KGEubm9kZU5hbWUpfHx0Yy50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDotMX19fX0pLGsuaHJlZk5vcm1hbGl6ZWR8fG0uZWFjaChbImhyZWYiLCJzcmMiXSxmdW5jdGlvbihhLGIpe20ucHJvcEhvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKGIsNCl9fX0pLGsub3B0U2VsZWN0ZWR8fChtLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmKGIuc2VsZWN0ZWRJbmRleCxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KSxudWxsfX0pLG0uZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7bS5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLGsuZW5jdHlwZXx8KG0ucHJvcEZpeC5lbmN0eXBlPSJlbmNvZGluZyIpO3ZhciB1Yz0vW1x0XHJcblxmXS9nO20uZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaD0wLGk9dGhpcy5sZW5ndGgsaj0ic3RyaW5nIj09dHlwZW9mIGEmJmE7aWYobS5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bSh0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihqKWZvcihiPShhfHwiIikubWF0Y2goRSl8fFtdO2k+aDtoKyspaWYoYz10aGlzW2hdLGQ9MT09PWMubm9kZVR5cGUmJihjLmNsYXNzTmFtZT8oIiAiK2MuY2xhc3NOYW1lKyIgIikucmVwbGFjZSh1YywiICIpOiIgIikpe2Y9MDt3aGlsZShlPWJbZisrXSlkLmluZGV4T2YoIiAiK2UrIiAiKTwwJiYoZCs9ZSsiICIpO2c9bS50cmltKGQpLGMuY2xhc3NOYW1lIT09ZyYmKGMuY2xhc3NOYW1lPWcpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaD0wLGk9dGhpcy5sZW5ndGgsaj0wPT09YXJndW1lbnRzLmxlbmd0aHx8InN0cmluZyI9PXR5cGVvZiBhJiZhO2lmKG0uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20odGhpcykucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoailmb3IoYj0oYXx8IiIpLm1hdGNoKEUpfHxbXTtpPmg7aCsrKWlmKGM9dGhpc1toXSxkPTE9PT1jLm5vZGVUeXBlJiYoYy5jbGFzc05hbWU/KCIgIitjLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodWMsIiAiKToiIikpe2Y9MDt3aGlsZShlPWJbZisrXSl3aGlsZShkLmluZGV4T2YoIiAiK2UrIiAiKT49MClkPWQucmVwbGFjZSgiICIrZSsiICIsIiAiKTtnPWE/bS50cmltKGQpOiIiLGMuY2xhc3NOYW1lIT09ZyYmKGMuY2xhc3NOYW1lPWcpfXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhO3JldHVybiJib29sZWFuIj09dHlwZW9mIGImJiJzdHJpbmciPT09Yz9iP3RoaXMuYWRkQ2xhc3MoYSk6dGhpcy5yZW1vdmVDbGFzcyhhKTp0aGlzLmVhY2gobS5pc0Z1bmN0aW9uKGEpP2Z1bmN0aW9uKGMpe20odGhpcykudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsYyx0aGlzLmNsYXNzTmFtZSxiKSxiKX06ZnVuY3Rpb24oKXtpZigic3RyaW5nIj09PWMpe3ZhciBiLGQ9MCxlPW0odGhpcyksZj1hLm1hdGNoKEUpfHxbXTt3aGlsZShiPWZbZCsrXSllLmhhc0NsYXNzKGIpP2UucmVtb3ZlQ2xhc3MoYik6ZS5hZGRDbGFzcyhiKX1lbHNlKGM9PT1LfHwiYm9vbGVhbiI9PT1jKSYmKHRoaXMuY2xhc3NOYW1lJiZtLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKSx0aGlzLmNsYXNzTmFtZT10aGlzLmNsYXNzTmFtZXx8YT09PSExPyIiOm0uX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIil9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIgIithKyIgIixjPTAsZD10aGlzLmxlbmd0aDtkPmM7YysrKWlmKDE9PT10aGlzW2NdLm5vZGVUeXBlJiYoIiAiK3RoaXNbY10uY2xhc3NOYW1lKyIgIikucmVwbGFjZSh1YywiICIpLmluZGV4T2YoYik+PTApcmV0dXJuITA7cmV0dXJuITF9fSksbS5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7bS5mbltiXT1mdW5jdGlvbihhLGMpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihiLG51bGwsYSxjKTp0aGlzLnRyaWdnZXIoYil9fSksbS5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfSxiaW5kOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5vbihhLG51bGwsYixjKX0sdW5iaW5kOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub2ZmKGEsbnVsbCxiKX0sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYixhLGMsZCl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYXx8IioqIixjKX19KTt2YXIgdmM9bS5ub3coKSx3Yz0vXD8vLHhjPS8oLCl8KFxbfHspfCh9fF0pfCIoPzpbXiJcXFxyXG5dfFxcWyJcXFwvYmZucnRdfFxcdVtcZGEtZkEtRl17NH0pKiJccyo6P3x0cnVlfGZhbHNlfG51bGx8LT8oPyEwXGQpXGQrKD86XC5cZCt8KSg/OltlRV1bKy1dP1xkK3wpL2c7bS5wYXJzZUpTT049ZnVuY3Rpb24oYil7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKyIiKTt2YXIgYyxkPW51bGwsZT1tLnRyaW0oYisiIik7cmV0dXJuIGUmJiFtLnRyaW0oZS5yZXBsYWNlKHhjLGZ1bmN0aW9uKGEsYixlLGYpe3JldHVybiBjJiZiJiYoZD0wKSwwPT09ZD9hOihjPWV8fGIsZCs9IWYtIWUsIiIpfSkpP0Z1bmN0aW9uKCJyZXR1cm4gIitlKSgpOm0uZXJyb3IoIkludmFsaWQgSlNPTjogIitiKX0sbS5wYXJzZVhNTD1mdW5jdGlvbihiKXt2YXIgYyxkO2lmKCFifHwic3RyaW5nIiE9dHlwZW9mIGIpcmV0dXJuIG51bGw7dHJ5e2EuRE9NUGFyc2VyPyhkPW5ldyBET01QYXJzZXIsYz1kLnBhcnNlRnJvbVN0cmluZyhiLCJ0ZXh0L3htbCIpKTooYz1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGMuYXN5bmM9ImZhbHNlIixjLmxvYWRYTUwoYikpfWNhdGNoKGUpe2M9dm9pZCAwfXJldHVybiBjJiZjLmRvY3VtZW50RWxlbWVudCYmIWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHxtLmVycm9yKCJJbnZhbGlkIFhNTDogIitiKSxjfTt2YXIgeWMsemMsQWM9LyMuKiQvLEJjPS8oWz8mXSlfPVteJl0qLyxDYz0vXiguKj8pOlsgXHRdKihbXlxyXG5dKilccj8kL2dtLERjPS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLEVjPS9eKD86R0VUfEhFQUQpJC8sRmM9L15cL1wvLyxHYz0vXihbXHcuKy1dKzopKD86XC9cLyg/OlteXC8/I10qQHwpKFteXC8/IzpdKikoPzo6KFxkKyl8KXwpLyxIYz17fSxJYz17fSxKYz0iKi8iLmNvbmNhdCgiKiIpO3RyeXt6Yz1sb2NhdGlvbi5ocmVmfWNhdGNoKEtjKXt6Yz15LmNyZWF0ZUVsZW1lbnQoImEiKSx6Yy5ocmVmPSIiLHpjPXpjLmhyZWZ9eWM9R2MuZXhlYyh6Yy50b0xvd2VyQ2FzZSgpKXx8W107ZnVuY3Rpb24gTGMoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7InN0cmluZyIhPXR5cGVvZiBiJiYoYz1iLGI9IioiKTt2YXIgZCxlPTAsZj1iLnRvTG93ZXJDYXNlKCkubWF0Y2goRSl8fFtdO2lmKG0uaXNGdW5jdGlvbihjKSl3aGlsZShkPWZbZSsrXSkiKyI9PT1kLmNoYXJBdCgwKT8oZD1kLnNsaWNlKDEpfHwiKiIsKGFbZF09YVtkXXx8W10pLnVuc2hpZnQoYykpOihhW2RdPWFbZF18fFtdKS5wdXNoKGMpfX1mdW5jdGlvbiBNYyhhLGIsYyxkKXt2YXIgZT17fSxmPWE9PT1JYztmdW5jdGlvbiBnKGgpe3ZhciBpO3JldHVybiBlW2hdPSEwLG0uZWFjaChhW2hdfHxbXSxmdW5jdGlvbihhLGgpe3ZhciBqPWgoYixjLGQpO3JldHVybiJzdHJpbmciIT10eXBlb2Yganx8Znx8ZVtqXT9mPyEoaT1qKTp2b2lkIDA6KGIuZGF0YVR5cGVzLnVuc2hpZnQoaiksZyhqKSwhMSl9KSxpfXJldHVybiBnKGIuZGF0YVR5cGVzWzBdKXx8IWVbIioiXSYmZygiKiIpfWZ1bmN0aW9uIE5jKGEsYil7dmFyIGMsZCxlPW0uYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IoZCBpbiBiKXZvaWQgMCE9PWJbZF0mJigoZVtkXT9hOmN8fChjPXt9KSlbZF09YltkXSk7cmV0dXJuIGMmJm0uZXh0ZW5kKCEwLGEsYyksYX1mdW5jdGlvbiBPYyhhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLmNvbnRlbnRzLGk9YS5kYXRhVHlwZXM7d2hpbGUoIioiPT09aVswXSlpLnNoaWZ0KCksdm9pZCAwPT09ZSYmKGU9YS5taW1lVHlwZXx8Yi5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKGUpZm9yKGcgaW4gaClpZihoW2ddJiZoW2ddLnRlc3QoZSkpe2kudW5zaGlmdChnKTticmVha31pZihpWzBdaW4gYylmPWlbMF07ZWxzZXtmb3IoZyBpbiBjKXtpZighaVswXXx8YS5jb252ZXJ0ZXJzW2crIiAiK2lbMF1dKXtmPWc7YnJlYWt9ZHx8KGQ9Zyl9Zj1mfHxkfXJldHVybiBmPyhmIT09aVswXSYmaS51bnNoaWZ0KGYpLGNbZl0pOnZvaWQgMH1mdW5jdGlvbiBQYyhhLGIsYyxkKXt2YXIgZSxmLGcsaCxpLGo9e30saz1hLmRhdGFUeXBlcy5zbGljZSgpO2lmKGtbMV0pZm9yKGcgaW4gYS5jb252ZXJ0ZXJzKWpbZy50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbZ107Zj1rLnNoaWZ0KCk7d2hpbGUoZilpZihhLnJlc3BvbnNlRmllbGRzW2ZdJiYoY1thLnJlc3BvbnNlRmllbGRzW2ZdXT1iKSwhaSYmZCYmYS5kYXRhRmlsdGVyJiYoYj1hLmRhdGFGaWx0ZXIoYixhLmRhdGFUeXBlKSksaT1mLGY9ay5zaGlmdCgpKWlmKCIqIj09PWYpZj1pO2Vsc2UgaWYoIioiIT09aSYmaSE9PWYpe2lmKGc9altpKyIgIitmXXx8alsiKiAiK2ZdLCFnKWZvcihlIGluIGopaWYoaD1lLnNwbGl0KCIgIiksaFsxXT09PWYmJihnPWpbaSsiICIraFswXV18fGpbIiogIitoWzBdXSkpe2c9PT0hMD9nPWpbZV06altlXSE9PSEwJiYoZj1oWzBdLGsudW5zaGlmdChoWzFdKSk7YnJlYWt9aWYoZyE9PSEwKWlmKGcmJmFbInRocm93cyJdKWI9ZyhiKTtlbHNlIHRyeXtiPWcoYil9Y2F0Y2gobCl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6Zz9sOiJObyBjb252ZXJzaW9uIGZyb20gIitpKyIgdG8gIitmfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOmJ9fW0uZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDp6Yyx0eXBlOiJHRVQiLGlzTG9jYWw6RGMudGVzdCh5Y1sxXSksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpKYyx0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDoveG1sLyxodG1sOi9odG1sLyxqc29uOi9qc29uL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOm0ucGFyc2VKU09OLCJ0ZXh0IHhtbCI6bS5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/TmMoTmMoYSxtLmFqYXhTZXR0aW5ncyksYik6TmMobS5hamF4U2V0dGluZ3MsYSl9LGFqYXhQcmVmaWx0ZXI6TGMoSGMpLGFqYXhUcmFuc3BvcnQ6TGMoSWMpLGFqYXg6ZnVuY3Rpb24oYSxiKXsib2JqZWN0Ij09dHlwZW9mIGEmJihiPWEsYT12b2lkIDApLGI9Ynx8e307dmFyIGMsZCxlLGYsZyxoLGksaixrPW0uYWpheFNldHVwKHt9LGIpLGw9ay5jb250ZXh0fHxrLG49ay5jb250ZXh0JiYobC5ub2RlVHlwZXx8bC5qcXVlcnkpP20obCk6bS5ldmVudCxvPW0uRGVmZXJyZWQoKSxwPW0uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLHE9ay5zdGF0dXNDb2RlfHx7fSxyPXt9LHM9e30sdD0wLHU9ImNhbmNlbGVkIix2PXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoMj09PXQpe2lmKCFqKXtqPXt9O3doaWxlKGI9Q2MuZXhlYyhmKSlqW2JbMV0udG9Mb3dlckNhc2UoKV09YlsyXX1iPWpbYS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09Yj9udWxsOmJ9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiAyPT09dD9mOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHR8fChhPXNbY109c1tjXXx8YSxyW2FdPWIpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIHR8fChrLm1pbWVUeXBlPWEpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oYSl7dmFyIGI7aWYoYSlpZigyPnQpZm9yKGIgaW4gYSlxW2JdPVtxW2JdLGFbYl1dO2Vsc2Ugdi5hbHdheXMoYVt2LnN0YXR1c10pO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihhKXt2YXIgYj1hfHx1O3JldHVybiBpJiZpLmFib3J0KGIpLHgoMCxiKSx0aGlzfX07aWYoby5wcm9taXNlKHYpLmNvbXBsZXRlPXAuYWRkLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsay51cmw9KChhfHxrLnVybHx8emMpKyIiKS5yZXBsYWNlKEFjLCIiKS5yZXBsYWNlKEZjLHljWzFdKyIvLyIpLGsudHlwZT1iLm1ldGhvZHx8Yi50eXBlfHxrLm1ldGhvZHx8ay50eXBlLGsuZGF0YVR5cGVzPW0udHJpbShrLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goRSl8fFsiIl0sbnVsbD09ay5jcm9zc0RvbWFpbiYmKGM9R2MuZXhlYyhrLnVybC50b0xvd2VyQ2FzZSgpKSxrLmNyb3NzRG9tYWluPSEoIWN8fGNbMV09PT15Y1sxXSYmY1syXT09PXljWzJdJiYoY1szXXx8KCJodHRwOiI9PT1jWzFdPyI4MCI6IjQ0MyIpKT09PSh5Y1szXXx8KCJodHRwOiI9PT15Y1sxXT8iODAiOiI0NDMiKSkpKSxrLmRhdGEmJmsucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2Ygay5kYXRhJiYoay5kYXRhPW0ucGFyYW0oay5kYXRhLGsudHJhZGl0aW9uYWwpKSxNYyhIYyxrLGIsdiksMj09PXQpcmV0dXJuIHY7aD1rLmdsb2JhbCxoJiYwPT09bS5hY3RpdmUrKyYmbS5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxrLnR5cGU9ay50eXBlLnRvVXBwZXJDYXNlKCksay5oYXNDb250ZW50PSFFYy50ZXN0KGsudHlwZSksZT1rLnVybCxrLmhhc0NvbnRlbnR8fChrLmRhdGEmJihlPWsudXJsKz0od2MudGVzdChlKT8iJiI6Ij8iKStrLmRhdGEsZGVsZXRlIGsuZGF0YSksay5jYWNoZT09PSExJiYoay51cmw9QmMudGVzdChlKT9lLnJlcGxhY2UoQmMsIiQxXz0iK3ZjKyspOmUrKHdjLnRlc3QoZSk/IiYiOiI/IikrIl89Iit2YysrKSksay5pZk1vZGlmaWVkJiYobS5sYXN0TW9kaWZpZWRbZV0mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLG0ubGFzdE1vZGlmaWVkW2VdKSxtLmV0YWdbZV0mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsbS5ldGFnW2VdKSksKGsuZGF0YSYmay5oYXNDb250ZW50JiZrLmNvbnRlbnRUeXBlIT09ITF8fGIuY29udGVudFR5cGUpJiZ2LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsay5jb250ZW50VHlwZSksdi5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGsuZGF0YVR5cGVzWzBdJiZrLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dP2suYWNjZXB0c1trLmRhdGFUeXBlc1swXV0rKCIqIiE9PWsuZGF0YVR5cGVzWzBdPyIsICIrSmMrIjsgcT0wLjAxIjoiIik6ay5hY2NlcHRzWyIqIl0pO2ZvcihkIGluIGsuaGVhZGVycyl2LnNldFJlcXVlc3RIZWFkZXIoZCxrLmhlYWRlcnNbZF0pO2lmKGsuYmVmb3JlU2VuZCYmKGsuYmVmb3JlU2VuZC5jYWxsKGwsdixrKT09PSExfHwyPT09dCkpcmV0dXJuIHYuYWJvcnQoKTt1PSJhYm9ydCI7Zm9yKGQgaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pdltkXShrW2RdKTtpZihpPU1jKEljLGssYix2KSl7di5yZWFkeVN0YXRlPTEsaCYmbi50cmlnZ2VyKCJhamF4U2VuZCIsW3Ysa10pLGsuYXN5bmMmJmsudGltZW91dD4wJiYoZz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7di5hYm9ydCgidGltZW91dCIpfSxrLnRpbWVvdXQpKTt0cnl7dD0xLGkuc2VuZChyLHgpfWNhdGNoKHcpe2lmKCEoMj50KSl0aHJvdyB3O3goLTEsdyl9fWVsc2UgeCgtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24geChhLGIsYyxkKXt2YXIgaixyLHMsdSx3LHg9YjsyIT09dCYmKHQ9MixnJiZjbGVhclRpbWVvdXQoZyksaT12b2lkIDAsZj1kfHwiIix2LnJlYWR5U3RhdGU9YT4wPzQ6MCxqPWE+PTIwMCYmMzAwPmF8fDMwND09PWEsYyYmKHU9T2Moayx2LGMpKSx1PVBjKGssdSx2LGopLGo/KGsuaWZNb2RpZmllZCYmKHc9di5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHcmJihtLmxhc3RNb2RpZmllZFtlXT13KSx3PXYuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx3JiYobS5ldGFnW2VdPXcpKSwyMDQ9PT1hfHwiSEVBRCI9PT1rLnR5cGU/eD0ibm9jb250ZW50IjozMDQ9PT1hP3g9Im5vdG1vZGlmaWVkIjooeD11LnN0YXRlLHI9dS5kYXRhLHM9dS5lcnJvcixqPSFzKSk6KHM9eCwoYXx8IXgpJiYoeD0iZXJyb3IiLDA+YSYmKGE9MCkpKSx2LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD0oYnx8eCkrIiIsaj9vLnJlc29sdmVXaXRoKGwsW3IseCx2XSk6by5yZWplY3RXaXRoKGwsW3YseCxzXSksdi5zdGF0dXNDb2RlKHEpLHE9dm9pZCAwLGgmJm4udHJpZ2dlcihqPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW3YsayxqP3I6c10pLHAuZmlyZVdpdGgobCxbdix4XSksaCYmKG4udHJpZ2dlcigiYWpheENvbXBsZXRlIixbdixrXSksLS1tLmFjdGl2ZXx8bS5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIHZ9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBtLmdldChhLGIsYywianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbS5nZXQoYSx2b2lkIDAsYiwic2NyaXB0Iil9fSksbS5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGEsYil7bVtiXT1mdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gbS5pc0Z1bmN0aW9uKGMpJiYoZT1lfHxkLGQ9YyxjPXZvaWQgMCksbS5hamF4KHt1cmw6YSx0eXBlOmIsZGF0YVR5cGU6ZSxkYXRhOmMsc3VjY2VzczpkfSl9fSksbS5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXttLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksbS5fZXZhbFVybD1mdW5jdGlvbihhKXtyZXR1cm4gbS5hamF4KHt1cmw6YSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfSxtLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihhKXtpZihtLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXttKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsYikpfSk7aWYodGhpc1swXSl7dmFyIGI9bShhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApO3RoaXNbMF0ucGFyZW50Tm9kZSYmYi5pbnNlcnRCZWZvcmUodGhpc1swXSksYi5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzO3doaWxlKGEuZmlyc3RDaGlsZCYmMT09PWEuZmlyc3RDaGlsZC5ub2RlVHlwZSlhPWEuZmlyc3RDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2gobS5pc0Z1bmN0aW9uKGEpP2Z1bmN0aW9uKGIpe20odGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX06ZnVuY3Rpb24oKXt2YXIgYj1tKHRoaXMpLGM9Yi5jb250ZW50cygpO2MubGVuZ3RoP2Mud3JhcEFsbChhKTpiLmFwcGVuZChhKX0pfSx3cmFwOmZ1bmN0aW9uKGEpe3ZhciBiPW0uaXNGdW5jdGlvbihhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe20odGhpcykud3JhcEFsbChiP2EuY2FsbCh0aGlzLGMpOmEpfSl9LHVud3JhcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKXttLm5vZGVOYW1lKHRoaXMsImJvZHkiKXx8bSh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSkuZW5kKCl9fSksbS5leHByLmZpbHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGEpe3JldHVybiBhLm9mZnNldFdpZHRoPD0wJiZhLm9mZnNldEhlaWdodDw9MHx8IWsucmVsaWFibGVIaWRkZW5PZmZzZXRzKCkmJiJub25lIj09PShhLnN0eWxlJiZhLnN0eWxlLmRpc3BsYXl8fG0uY3NzKGEsImRpc3BsYXkiKSl9LG0uZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIW0uZXhwci5maWx0ZXJzLmhpZGRlbihhKX07dmFyIFFjPS8lMjAvZyxSYz0vXFtcXSQvLFNjPS9ccj9cbi9nLFRjPS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxVYz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24gVmMoYSxiLGMsZCl7dmFyIGU7aWYobS5pc0FycmF5KGIpKW0uZWFjaChiLGZ1bmN0aW9uKGIsZSl7Y3x8UmMudGVzdChhKT9kKGEsZSk6VmMoYSsiWyIrKCJvYmplY3QiPT10eXBlb2YgZT9iOiIiKSsiXSIsZSxjLGQpfSk7ZWxzZSBpZihjfHwib2JqZWN0IiE9PW0udHlwZShiKSlkKGEsYik7ZWxzZSBmb3IoZSBpbiBiKVZjKGErIlsiK2UrIl0iLGJbZV0sYyxkKX1tLnBhcmFtPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPWZ1bmN0aW9uKGEsYil7Yj1tLmlzRnVuY3Rpb24oYik/YigpOm51bGw9PWI/IiI6YixkW2QubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoYSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiKX07aWYodm9pZCAwPT09YiYmKGI9bS5hamF4U2V0dGluZ3MmJm0uYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKSxtLmlzQXJyYXkoYSl8fGEuanF1ZXJ5JiYhbS5pc1BsYWluT2JqZWN0KGEpKW0uZWFjaChhLGZ1bmN0aW9uKCl7ZSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihjIGluIGEpVmMoYyxhW2NdLGIsZSk7cmV0dXJuIGQuam9pbigiJiIpLnJlcGxhY2UoUWMsIisiKX0sbS5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBtLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9bS5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGE/bS5tYWtlQXJyYXkoYSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBhPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhbSh0aGlzKS5pcygiOmRpc2FibGVkIikmJlVjLnRlc3QodGhpcy5ub2RlTmFtZSkmJiFUYy50ZXN0KGEpJiYodGhpcy5jaGVja2VkfHwhVy50ZXN0KGEpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPW0odGhpcykudmFsKCk7cmV0dXJuIG51bGw9PWM/bnVsbDptLmlzQXJyYXkoYyk/bS5tYXAoYyxmdW5jdGlvbihhKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKFNjLCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZShTYywiXHJcbiIpfX0pLmdldCgpfX0pLG0uYWpheFNldHRpbmdzLnhocj12b2lkIDAhPT1hLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0xvY2FsJiYvXihnZXR8cG9zdHxoZWFkfHB1dHxkZWxldGV8b3B0aW9ucykkL2kudGVzdCh0aGlzLnR5cGUpJiZaYygpfHwkYygpfTpaYzt2YXIgV2M9MCxYYz17fSxZYz1tLmFqYXhTZXR0aW5ncy54aHIoKTthLkFjdGl2ZVhPYmplY3QmJm0oYSkub24oInVubG9hZCIsZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gWGMpWGNbYV0odm9pZCAwLCEwKX0pLGsuY29ycz0hIVljJiYid2l0aENyZWRlbnRpYWxzImluIFljLFljPWsuYWpheD0hIVljLFljJiZtLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24oYSl7aWYoIWEuY3Jvc3NEb21haW58fGsuY29ycyl7dmFyIGI7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEueGhyKCksZz0rK1djO2lmKGYub3BlbihhLnR5cGUsYS51cmwsYS5hc3luYyxhLnVzZXJuYW1lLGEucGFzc3dvcmQpLGEueGhyRmllbGRzKWZvcihlIGluIGEueGhyRmllbGRzKWZbZV09YS54aHJGaWVsZHNbZV07YS5taW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlJiZmLm92ZXJyaWRlTWltZVR5cGUoYS5taW1lVHlwZSksYS5jcm9zc0RvbWFpbnx8Y1siWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoY1siWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihlIGluIGMpdm9pZCAwIT09Y1tlXSYmZi5zZXRSZXF1ZXN0SGVhZGVyKGUsY1tlXSsiIik7Zi5zZW5kKGEuaGFzQ29udGVudCYmYS5kYXRhfHxudWxsKSxiPWZ1bmN0aW9uKGMsZSl7dmFyIGgsaSxqO2lmKGImJihlfHw0PT09Zi5yZWFkeVN0YXRlKSlpZihkZWxldGUgWGNbZ10sYj12b2lkIDAsZi5vbnJlYWR5c3RhdGVjaGFuZ2U9bS5ub29wLGUpNCE9PWYucmVhZHlTdGF0ZSYmZi5hYm9ydCgpO2Vsc2V7aj17fSxoPWYuc3RhdHVzLCJzdHJpbmciPT10eXBlb2YgZi5yZXNwb25zZVRleHQmJihqLnRleHQ9Zi5yZXNwb25zZVRleHQpO3RyeXtpPWYuc3RhdHVzVGV4dH1jYXRjaChrKXtpPSIifWh8fCFhLmlzTG9jYWx8fGEuY3Jvc3NEb21haW4/MTIyMz09PWgmJihoPTIwNCk6aD1qLnRleHQ/MjAwOjQwNH1qJiZkKGgsaSxqLGYuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpfSxhLmFzeW5jPzQ9PT1mLnJlYWR5U3RhdGU/c2V0VGltZW91dChiKTpmLm9ucmVhZHlzdGF0ZWNoYW5nZT1YY1tnXT1iOmIoKX0sYWJvcnQ6ZnVuY3Rpb24oKXtiJiZiKHZvaWQgMCwhMCl9fX19KTtmdW5jdGlvbiBaYygpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiAkYygpe3RyeXtyZXR1cm4gbmV3IGEuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaChiKXt9fW0uYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovKD86amF2YXxlY21hKXNjcmlwdC99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZ2xvYmFsRXZhbChhKSxhfX19KSxtLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oYSl7dm9pZCAwPT09YS5jYWNoZSYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIsYS5nbG9iYWw9ITEpfSksbS5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBiLGM9eS5oZWFkfHxtKCJoZWFkIilbMF18fHkuZG9jdW1lbnRFbGVtZW50O3JldHVybntzZW5kOmZ1bmN0aW9uKGQsZSl7Yj15LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGIuYXN5bmM9ITAsYS5zY3JpcHRDaGFyc2V0JiYoYi5jaGFyc2V0PWEuc2NyaXB0Q2hhcnNldCksYi5zcmM9YS51cmwsYi5vbmxvYWQ9Yi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oYSxjKXsoY3x8IWIucmVhZHlTdGF0ZXx8L2xvYWRlZHxjb21wbGV0ZS8udGVzdChiLnJlYWR5U3RhdGUpKSYmKGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYiksYj1udWxsLGN8fGUoMjAwLCJzdWNjZXNzIikpfSxjLmluc2VydEJlZm9yZShiLGMuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7YiYmYi5vbmxvYWQodm9pZCAwLCEwKX19fX0pO3ZhciBfYz1bXSxhZD0vKD0pXD8oPz0mfCQpfFw/XD8vO20uYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgYT1fYy5wb3AoKXx8bS5leHBhbmRvKyJfIit2YysrO3JldHVybiB0aGlzW2FdPSEwLGF9fSksbS5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihiLGMsZCl7dmFyIGUsZixnLGg9Yi5qc29ucCE9PSExJiYoYWQudGVzdChiLnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiBiLmRhdGEmJiEoYi5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZhZC50ZXN0KGIuZGF0YSkmJiJkYXRhIik7cmV0dXJuIGh8fCJqc29ucCI9PT1iLmRhdGFUeXBlc1swXT8oZT1iLmpzb25wQ2FsbGJhY2s9bS5pc0Z1bmN0aW9uKGIuanNvbnBDYWxsYmFjayk/Yi5qc29ucENhbGxiYWNrKCk6Yi5qc29ucENhbGxiYWNrLGg/YltoXT1iW2hdLnJlcGxhY2UoYWQsIiQxIitlKTpiLmpzb25wIT09ITEmJihiLnVybCs9KHdjLnRlc3QoYi51cmwpPyImIjoiPyIpK2IuanNvbnArIj0iK2UpLGIuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBnfHxtLmVycm9yKGUrIiB3YXMgbm90IGNhbGxlZCIpLGdbMF19LGIuZGF0YVR5cGVzWzBdPSJqc29uIixmPWFbZV0sYVtlXT1mdW5jdGlvbigpe2c9YXJndW1lbnRzfSxkLmFsd2F5cyhmdW5jdGlvbigpe2FbZV09ZixiW2VdJiYoYi5qc29ucENhbGxiYWNrPWMuanNvbnBDYWxsYmFjayxfYy5wdXNoKGUpKSxnJiZtLmlzRnVuY3Rpb24oZikmJmYoZ1swXSksZz1mPXZvaWQgMH0pLCJzY3JpcHQiKTp2b2lkIDB9KSxtLnBhcnNlSFRNTD1mdW5jdGlvbihhLGIsYyl7aWYoIWF8fCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gbnVsbDsiYm9vbGVhbiI9PXR5cGVvZiBiJiYoYz1iLGI9ITEpLGI9Ynx8eTt2YXIgZD11LmV4ZWMoYSksZT0hYyYmW107cmV0dXJuIGQ/W2IuY3JlYXRlRWxlbWVudChkWzFdKV06KGQ9bS5idWlsZEZyYWdtZW50KFthXSxiLGUpLGUmJmUubGVuZ3RoJiZtKGUpLnJlbW92ZSgpLG0ubWVyZ2UoW10sZC5jaGlsZE5vZGVzKSl9O3ZhciBiZD1tLmZuLmxvYWQ7bS5mbi5sb2FkPWZ1bmN0aW9uKGEsYixjKXtpZigic3RyaW5nIiE9dHlwZW9mIGEmJmJkKXJldHVybiBiZC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGQsZSxmLGc9dGhpcyxoPWEuaW5kZXhPZigiICIpO3JldHVybiBoPj0wJiYoZD1tLnRyaW0oYS5zbGljZShoLGEubGVuZ3RoKSksYT1hLnNsaWNlKDAsaCkpLG0uaXNGdW5jdGlvbihiKT8oYz1iLGI9dm9pZCAwKTpiJiYib2JqZWN0Ij09dHlwZW9mIGImJihmPSJQT1NUIiksZy5sZW5ndGg+MCYmbS5hamF4KHt1cmw6YSx0eXBlOmYsZGF0YVR5cGU6Imh0bWwiLGRhdGE6Yn0pLmRvbmUoZnVuY3Rpb24oYSl7ZT1hcmd1bWVudHMsZy5odG1sKGQ/bSgiPGRpdj4iKS5hcHBlbmQobS5wYXJzZUhUTUwoYSkpLmZpbmQoZCk6YSl9KS5jb21wbGV0ZShjJiZmdW5jdGlvbihhLGIpe2cuZWFjaChjLGV8fFthLnJlc3BvbnNlVGV4dCxiLGFdKX0pLHRoaXN9LG0uZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGEpe3JldHVybiBtLmdyZXAobS50aW1lcnMsZnVuY3Rpb24oYil7cmV0dXJuIGE9PT1iLmVsZW19KS5sZW5ndGh9O3ZhciBjZD1hLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtmdW5jdGlvbiBkZChhKXtyZXR1cm4gbS5pc1dpbmRvdyhhKT9hOjk9PT1hLm5vZGVUeXBlP2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OiExfW0ub2Zmc2V0PXtzZXRPZmZzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGs9bS5jc3MoYSwicG9zaXRpb24iKSxsPW0oYSksbj17fTsic3RhdGljIj09PWsmJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLGg9bC5vZmZzZXQoKSxmPW0uY3NzKGEsInRvcCIpLGk9bS5jc3MoYSwibGVmdCIpLGo9KCJhYnNvbHV0ZSI9PT1rfHwiZml4ZWQiPT09aykmJm0uaW5BcnJheSgiYXV0byIsW2YsaV0pPi0xLGo/KGQ9bC5wb3NpdGlvbigpLGc9ZC50b3AsZT1kLmxlZnQpOihnPXBhcnNlRmxvYXQoZil8fDAsZT1wYXJzZUZsb2F0KGkpfHwwKSxtLmlzRnVuY3Rpb24oYikmJihiPWIuY2FsbChhLGMsaCkpLG51bGwhPWIudG9wJiYobi50b3A9Yi50b3AtaC50b3ArZyksbnVsbCE9Yi5sZWZ0JiYobi5sZWZ0PWIubGVmdC1oLmxlZnQrZSksInVzaW5nImluIGI/Yi51c2luZy5jYWxsKGEsbik6bC5jc3Mobil9fSxtLmZuLmV4dGVuZCh7b2Zmc2V0OmZ1bmN0aW9uKGEpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMD09PWE/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oYil7bS5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsYSxiKX0pO3ZhciBiLGMsZD17dG9wOjAsbGVmdDowfSxlPXRoaXNbMF0sZj1lJiZlLm93bmVyRG9jdW1lbnQ7aWYoZilyZXR1cm4gYj1mLmRvY3VtZW50RWxlbWVudCxtLmNvbnRhaW5zKGIsZSk/KHR5cGVvZiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCE9PUsmJihkPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpLGM9ZGQoZikse3RvcDpkLnRvcCsoYy5wYWdlWU9mZnNldHx8Yi5zY3JvbGxUb3ApLShiLmNsaWVudFRvcHx8MCksbGVmdDpkLmxlZnQrKGMucGFnZVhPZmZzZXR8fGIuc2Nyb2xsTGVmdCktKGIuY2xpZW50TGVmdHx8MCl9KTpkfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBhLGIsYz17dG9wOjAsbGVmdDowfSxkPXRoaXNbMF07cmV0dXJuImZpeGVkIj09PW0uY3NzKGQsInBvc2l0aW9uIik/Yj1kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihhPXRoaXMub2Zmc2V0UGFyZW50KCksYj10aGlzLm9mZnNldCgpLG0ubm9kZU5hbWUoYVswXSwiaHRtbCIpfHwoYz1hLm9mZnNldCgpKSxjLnRvcCs9bS5jc3MoYVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxjLmxlZnQrPW0uY3NzKGFbMF0sImJvcmRlckxlZnRXaWR0aCIsITApKSx7dG9wOmIudG9wLWMudG9wLW0uY3NzKGQsIm1hcmdpblRvcCIsITApLGxlZnQ6Yi5sZWZ0LWMubGVmdC1tLmNzcyhkLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fGNkO3doaWxlKGEmJiFtLm5vZGVOYW1lKGEsImh0bWwiKSYmInN0YXRpYyI9PT1tLmNzcyhhLCJwb3NpdGlvbiIpKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF8fGNkfSl9fSksbS5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGEsYil7dmFyIGM9L1kvLnRlc3QoYik7bS5mblthXT1mdW5jdGlvbihkKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEsZCxlKXt2YXIgZj1kZChhKTtyZXR1cm4gdm9pZCAwPT09ZT9mP2IgaW4gZj9mW2JdOmYuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W2RdOmFbZF06dm9pZChmP2Yuc2Nyb2xsVG8oYz9tKGYpLnNjcm9sbExlZnQoKTplLGM/ZTptKGYpLnNjcm9sbFRvcCgpKTphW2RdPWUpfSxhLGQsYXJndW1lbnRzLmxlbmd0aCxudWxsKX19KSxtLmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oYSxiKXttLmNzc0hvb2tzW2JdPUxiKGsucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihhLGMpe3JldHVybiBjPyhjPUpiKGEsYiksSGIudGVzdChjKT9tKGEpLnBvc2l0aW9uKClbYl0rInB4IjpjKTp2b2lkIDB9KX0pLG0uZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGEsYil7bS5lYWNoKHtwYWRkaW5nOiJpbm5lciIrYSxjb250ZW50OmIsIiI6Im91dGVyIithfSxmdW5jdGlvbihjLGQpe20uZm5bZF09ZnVuY3Rpb24oZCxlKXt2YXIgZj1hcmd1bWVudHMubGVuZ3RoJiYoY3x8ImJvb2xlYW4iIT10eXBlb2YgZCksZz1jfHwoZD09PSEwfHxlPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiBWKHRoaXMsZnVuY3Rpb24oYixjLGQpe3ZhciBlO3JldHVybiBtLmlzV2luZG93KGIpP2IuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2FdOjk9PT1iLm5vZGVUeXBlPyhlPWIuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KGIuYm9keVsic2Nyb2xsIithXSxlWyJzY3JvbGwiK2FdLGIuYm9keVsib2Zmc2V0IithXSxlWyJvZmZzZXQiK2FdLGVbImNsaWVudCIrYV0pKTp2b2lkIDA9PT1kP20uY3NzKGIsYyxnKTptLnN0eWxlKGIsYyxkLGcpfSxiLGY/ZDp2b2lkIDAsZixudWxsKX19KX0pLG0uZm4uc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sbS5mbi5hbmRTZWxmPW0uZm4uYWRkQmFjaywiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gbX0pO3ZhciBlZD1hLmpRdWVyeSxmZD1hLiQ7cmV0dXJuIG0ubm9Db25mbGljdD1mdW5jdGlvbihiKXtyZXR1cm4gYS4kPT09bSYmKGEuJD1mZCksYiYmYS5qUXVlcnk9PT1tJiYoYS5qUXVlcnk9ZWQpLG19LHR5cGVvZiBiPT09SyYmKGEualF1ZXJ5PWEuJD1tKSxtfSk7DQo8L3NjcmlwdD4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vKiBSZXF1aXJlcyBqUXVlcnkNCiAqDQogKiBUaGlzIHBsdWdpbiB3aWxsIGNyZWF0ZSBkaXYuanNUb29sdGlwIGVsZW1lbnRzIChvciBjb25maWd1cmUgeW91ciBvd24hKSBpbiBib2R5IGZvciBldmVyeSB0b29sdGlwIG9uIHRoZSBwYWdlLiBTb21lDQogKiBiYXNpYyBDU1MgaXMgYXBwbGllZCBhdXRvbWFnaWNhbGx5LCBidXQgeW91J2xsIHdhbnQgdG8gc3R5bGUgaXQgb24geW91ciBvd24gZnJvbSB0aGVyZS4gVGhpcyBjb2RlIHdpbGwgYmUgYXBwbGllZCB0bw0KICogZXZlcnkgZWxlbWVudCBpbiB5b3VyIC52X3Rvb2x0aXAoKSBzZWxlY3Rvciwgc28gZ2l2aW5nIGl0IGEgY29tbW9uIHNlbGVjdG9yIGxpa2UgJy50b29sdGlwJyBpcyBpZGVhbC4NCiAqDQogKiBPcHRpb25zOg0KICogLSBsb2NhdGlvbjogV2hlcmUgdGhlIHRvb2x0aXAgc2hvdWxkIHNwYXduIGluIHJlbGF0aW9uIHRvIGl0J3MgcGFyZW50DQogKiAtIG9mZnNldE46IEhvdyBtYW55IHBpeGVscyB0byBhZGQNCiAqIC0gdHJhY2tNb3VzZTogU2hvdWxkIHdlIHRyYWNrIHRoZSBtb3VzZSBjdXJzb3IgaW5zdGVhZCBvZiB0aGUgcGFyZW50Pw0KICogLSBzdXBwcmVzc09uQ2xpY2s6IFNob3VsZCB3ZSBoaWRlIGlmIGEgdXNlciBjbGlja3MgdGhlIHRhcmdldD8NCiAqIC0gc3VwcHJlc3NXaGlsZVRvZ2dsZWQ6IFNob3VsZCB3ZSBpZ25vcmUgZXZlbnRzIGlmIHRoZSB0YXJnZXQgaGFzIHRoZSAndG9nZ2xlZCcgY2xhc3M/DQogKiAtIHRvb2x0aXBDbGFzczogY3NzIGNsYXNzIHRvIGFwcGx5IHRvIHRvb2x0aXAgZWxlbWVudHMNCiAqIC0gZmFkZVNwZWVkOglUaW1lIChpbiBtaWxsaXNlY29uZHMpIHRvIHNwZW5kIGZhZGluZyBpbi9vdXQuIFNldCB0byAwIHRvIGRpc2FibGUuDQogKiAtIGFsbG93SG92ZXI6IFNob3VsZCB3ZSBrZWVwIHRoZSB0b29sdGlwIG9wZW4gaWYgd2UgbW91c2UgZGlyZWN0bHkgb24gdG8gdGhlIHRvb2x0aXA/IChZb3VyIHRvb2x0aXAgd2lsbCBuZWVkIHRvIHNwYXduIGluc2lkZSBpdCdzIG93bmVyJ3MgYm94IGZvciB0aGlzIHRvIHdvcmspDQogKiAtIHRvb2x0aXBQYXJlbnQ6IE1vcmUgZ2VuZXJhbGx5IHVzZWxlc3MgcHJvcGVydGllcyBmb3Igc3VwZXJuYXY6IExldHMgdXMgc3BlY2lmeSB3aGljaCBlbGVtZW50IHRvIHBhcmVudCB0aGUgdG9vbHRpcHMgdG8uIFlPVSBQUk9CQUJMWSBET04nVCBORUVEIFRISVMuDQogKiAtIGNvcnJlY3RGb3JTY3JlZW5TaXplOiBBZGp1c3QgdG9vbHRpcCBwb3NpdGlvbiB0byBlbnN1cmUgaXQgZG9lc24ndCByZW5kZXIgb3V0c2lkZSBvZiB0aGUgdmlld3BvcnQNCiAqIC0gc2l6ZUNvcnJlY3Rpb25YUGFkZGluZzogSG93IGZhciB3ZSBzaG91bGQga2VlcCB0aGUgdG9vbHRpcCBmcm9tIHRoZSB3aW5kb3cgZWRnZQ0KICogLSB1c2VDbGlja0V2ZW50OiBTaG91bGQgd2UgdXNlIHRoZSBtb3VzZSBjbGljayBldmVudCBpbnN0ZWFkIG9mIGhvdmVyPw0KICogLSBpbmhlcml0UGFyZW50TWluV2lkdGg6IFNob3VsZCB3ZSBzZXQgbWluLXdpZHRoIGJhc2VkIG9uIG91ciBwYXJlbnQncyB3aWR0aD8NCiAqIC0gcGFyZW50QWN0aXZlQ1NTQ2xhc3M6IFdoYXQgQ1NTIGNsYXNzIHNob3VsZCB3ZSBhZGQgdG8gb3VyIHBhcmVudCB3aGlsZSB3ZSdyZSB2aXNpYmxlPw0KICogLSBjaGlsZEFjdGl2ZUNTU0NsYXNzOiBXaGF0IENTUyBjbGFzcyBzaG91bGQgd2UgYWRkIHRvIHRoZSB0b29sdGlwIHdoZW4gYWN0aXZlIChNb3N0bHkgdXNlZnVsIGZvciB0cmlnZ2VyaW5nIENTUyB0cmFuc2l0aW9ucw0KICogLSBmdW5jTmFtZTogR2xvYmFsIG5hbWUgb2YgYSBmdW5jdGlvbiB0byBjYWxsIG9uIGhvdmVyIChJdCBzZWFyY2hlcyB0aGUgZ2xvYmFsIHdpbmRvdyBvYmplY3Q7IG5vdCBzYWZlIGluc2lkZSAidXNlIHN0cmljdCINCiAqIC0gZnVuYzogQWN0dWFsIEpTIGNvZGUgdG8gcnVuLg0KICogLSByZXNwb25zaXZlTW9kZTogZW5hYmxlIHdoZW4gaW4gcmVzcG9uc2l2ZSBtb2RlL21vYmlsZS90YWJsZXQsIHJlcXVpcmVzIHRvb2x0aXAgZWxlbWVudHMgdG8gYmUgZGVjb3JhdGVkIHdpdGggZGF0YS10b29sdGlwLXJlc3BvbnNpdmUgdG8gZW5hYmxlIGluIHJlc3BvbnNpdmUgbW9kZQ0KICovDQovKiA8c2NyaXB0PiAqLw0KKGZ1bmN0aW9uKCAkICl7DQoJbGV0IGdfbmV4dFRvb2x0aXBJZCA9IDA7DQoJdmFyIG1ldGhvZHMgPSB7DQoNCgkJaW5pdCA6IGZ1bmN0aW9uKCBvcHRpb25zICkgew0KDQoJCQl2YXIgc2V0dGluZ3MgPSAkLmV4dGVuZCggew0KCQkJCSdsb2NhdGlvbicJCQk6ICd0b3AnLA0KCQkJCSdvZmZzZXRYJwkJCTogMCwNCgkJCQknb2Zmc2V0WScJCQk6IC0xMCwNCgkJCQkndHJhY2tNb3VzZScJCTogZmFsc2UsDQoJCQkJJ3RyYWNrTW91c2VDZW50ZXJlZCc6IHRydWUsDQoJCQkJJ3N1cHByZXNzT25DbGljaycJOiB0cnVlLA0KCQkJCSdzdXBwcmVzc1doaWxlVG9nZ2xlZCc6IHRydWUsDQoJCQkJJ3Rvb2x0aXBDbGFzcycJCTogJ2pzVG9vbHRpcCcsDQoJCQkJJ2ZhZGVTcGVlZCcJCQk6IDE1MCwNCgkJCQknYWxsb3dIb3ZlcicJCTogdHJ1ZSwNCgkJCQkndG9vbHRpcFBhcmVudCcJCTogJ2JvZHknLA0KCQkJCSdjb3JyZWN0Rm9yU2NyZWVuU2l6ZSc6IHRydWUsDQoJCQkJJ3NpemVDb3JyZWN0aW9uWFBhZGRpbmcnOiAxNSwNCgkJCQknc2l6ZUNvcnJlY3Rpb25ZUGFkZGluZyc6IDEwLA0KCQkJCSd1c2VDbGlja0V2ZW50JwkJOiBmYWxzZSwNCgkJCQkndXNlQ29udGV4dE1lbnVFdmVudCcJOiBmYWxzZSwNCgkJCQkndXNlTW91c2VFbnRlckV2ZW50Jwk6IHRydWUsDQoJCQkJJ3VzZU1vdXNlTGVhdmVFdmVudCcJOiB0cnVlLA0KCQkJCSdwcmV2ZW50RGVmYXVsdCcJOiB0cnVlLA0KCQkJCSdzdG9wUHJvcGFnYXRpb24nCTogZmFsc2UsDQoJCQkJJ2luaGVyaXRQYXJlbnRNaW5XaWR0aCcJOiBmYWxzZSwNCgkJCQkncGFyZW50QWN0aXZlQ1NTQ2xhc3MnCTogZmFsc2UsDQoJCQkJJ2RhdGFOYW1lJwkJCTogJ3Rvb2x0aXBDb250ZW50JywNCgkJCQknZnVuY05hbWUnCQkJOiAndG9vbHRpcEZ1bmMnLA0KCQkJCSdmdW5jJwkJCQk6IGZhbHNlLA0KCQkJCSdkaXNhYmxlT25Ub3VjaERldmljZScJOiBmYWxzZSwNCgkJCQknY2hpbGRBY3RpdmVDU1NDbGFzcycgOiBmYWxzZSwNCgkJCQknZGVzdHJveVdoZW5Eb25lJzogdHJ1ZSwNCgkJCQknY3JlYXRlT25Mb2FkJzogZmFsc2UsDQoJCQkJJ3JlcGxhY2VFeGlzdGluZyc6IHRydWUsIC8vIHNob3VsZCB3ZSBzdG9tcCBvbiBleGlzdGluZyB0b29sdGlwcz8NCgkJCQknZGVmYXVsdFR5cGUnOiAnaHRtbCcsIC8vIGRlZmF1bHQgdG9vbHRpcCB0eXBlIGlmIG5vdCBzcGVjaWZpZWQuDQoJCQkJJ3Jlc3BvbnNpdmVNb2RlJzogZmFsc2UsDQoJCQkJJ2FwcGVhcmFuY2VEZWxheU1zJzogMCwgLy8gSG93IGxvbmcgZG8gd2Ugd2FpdCBhZnRlciB0aGUgdHJpZ2dlciB0byBzaG93IHRoZSB0b29sdGlwIChvciB0byBzdGFydCBmYWRlLWluKQ0KCQkJfSwgb3B0aW9ucyk7DQoNCg0KDQoNCgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsNCg0KCQkJCXZhciAkdGFyZ2V0ID0gJCh0aGlzKTsNCg0KCQkJCWlmICggc2V0dGluZ3MucmVzcG9uc2l2ZU1vZGUgJiYgIXRoaXMuaGFzQXR0cmlidXRlKCdkYXRhLXRvb2x0aXAtcmVzcG9uc2l2ZScgKSApDQoJCQkJCXJldHVybjsNCg0KCQkJCWlmKCAkdGFyZ2V0LmRhdGEoJ3Rvb2x0aXAuc2V0dGluZ3MnKSAmJiAhc2V0dGluZ3MucmVwbGFjZUV4aXN0aW5nKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQlpZiggc2V0dGluZ3MudXNlQ2xpY2tFdmVudCApDQoJCQkJew0KCQkJCQkkdGFyZ2V0LmJpbmQoJ2NsaWNrLnRvb2x0aXAnLCBtZXRob2RzLnNob3cpOw0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkkdGFyZ2V0LmJpbmQoJ3ZncF9vbmZvY3VzLnRvb2x0aXAnLCBtZXRob2RzLnNob3cgKTsNCgkJCQkJJHRhcmdldC5iaW5kKCd2Z3Bfb25ibHVyLnRvb2x0aXAnLCBtZXRob2RzLmhpZGUgKTsNCgkJCQl9DQoNCgkJCQlpZiggc2V0dGluZ3MudXNlQ29udGV4dE1lbnVFdmVudCApDQoJCQkJew0KCQkJCQkkdGFyZ2V0LmJpbmQoJ2NvbnRleHRtZW51LnRvb2x0aXAnLCBtZXRob2RzLnNob3cpOw0KCQkJCX0NCgkJCQlpZiggc2V0dGluZ3MudXNlTW91c2VFbnRlckV2ZW50ICkNCgkJCQl7DQoJCQkJCSR0YXJnZXQuYmluZCgnbW91c2VlbnRlci50b29sdGlwJywgbWV0aG9kcy5zaG93KTsNCgkJCQl9DQoJCQkJaWYoIHNldHRpbmdzLnVzZU1vdXNlTGVhdmVFdmVudCApDQoJCQkJew0KCQkJCQkkdGFyZ2V0LmJpbmQoJ21vdXNlbGVhdmUudG9vbHRpcCcsIG1ldGhvZHMuaGlkZSk7DQoJCQkJfQ0KDQoJCQkJaWYgKCBzZXR0aW5ncy5kaXNhYmxlT25Ub3VjaERldmljZSApDQoJCQkJew0KCQkJCQkvLyBpZiB3ZSBnZXQgYSB0b3VjaCBldmVudCwgZGlzYWJsZSB0b29sdGlwIGV2ZW50cyBvbiB0aGlzIG9iamVjdC4gIFRoaXMgZmlyZXMgYmVmb3JlIG1vdXNlIGV2ZW50cywgc28gd2UNCgkJCQkJLy8JY2FuIHByZXZlbnQgdGhlIGhvdmVyIGZyb20gc2hvd2luZy4NCgkJCQkJLy8JKHdlIGNvdWxkIHByZXZlbnREZWZhdWx0KCksIGJ1dCB0aGF0IHdpbGwgcHJldmVudCB0aGUgYWN0dWFsIGNsaWNrIGV2ZW50IHRoYXQncyBjb21pbmcgdG9vKQ0KCQkJCQkkdGFyZ2V0LmJpbmQoJ3RvdWNoc3RhcnQudG9vbHRpcCcsIGZ1bmN0aW9uKGUpIHsgJHRhcmdldC5kYXRhKCdpblRvdWNoRXZlbnQnLCB0cnVlKTsgfSk7DQoJCQkJCSR0YXJnZXQuYmluZCgnbW91c2V1cC50b29sdGlwJywgZnVuY3Rpb24oZSkgeyAkdGFyZ2V0LmRhdGEoJ2luVG91Y2hFdmVudCcsIGZhbHNlKTsgfSk7DQoJCQkJfQ0KDQoJCQkJJHRhcmdldC5kYXRhKCd0b29sdGlwLnNldHRpbmdzJywgc2V0dGluZ3MpOw0KCQkJCSR0YXJnZXQuZGF0YSgndG9vbHRpcC5pZCcsIGdfbmV4dFRvb2x0aXBJZCsrKTsNCg0KCQkJCWlmKCBzZXR0aW5ncy5jcmVhdGVPbkxvYWQgKQ0KCQkJCQltZXRob2RzLmdldHRvb2x0aXAoIHRoaXMsIHNldHRpbmdzICk7DQoJCQl9KTsNCg0KCQl9LA0KCQlkZXN0cm95IDogZnVuY3Rpb24oKSB7DQoNCgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsNCgkJCQkkKHdpbmRvdykudW5iaW5kKCcudG9vbHRpcCcpOw0KCQkJfSkNCg0KCQl9LA0KCQlnZXR0b29sdGlwIDogZnVuY3Rpb24oIGVsZW1lbnQsIHNldHRpbmdzICkgew0KCQkJdmFyICRlbGVtZW50PSAkKGVsZW1lbnQpOw0KCQkJdmFyIHRvb2xEaXYgPSAkZWxlbWVudC5kYXRhKCJ0b29sdGlwLmVsZW1lbnQiKTsNCgkJCXZhciB0b29sSWQgPSAkZWxlbWVudC5kYXRhKCJ0b29sdGlwLmlkIik7DQoJCQlpZiAoICF0b29sRGl2ICkNCgkJCXsNCgkJCQl0b29sRGl2ID0gJCgnPGRpdiAvPicpOw0KDQoJCQkJaWYoIHNldHRpbmdzLnN1cHByZXNzT25DbGljayApDQoJCQkJew0KCQkJCQl0b29sRGl2LmJpbmQoJ2NsaWNrLnRvb2x0aXAnLCBqUXVlcnkucHJveHkobWV0aG9kcy5oaWRlLCBlbGVtZW50KSk7DQoJCQkJfQ0KCQkJCXRvb2xEaXYuaGlkZSgpOw0KCQkJCXRvb2xEaXYuYWRkQ2xhc3Moc2V0dGluZ3MudG9vbHRpcENsYXNzKTsNCgkJCQlpZiAoICRlbGVtZW50LmRhdGEoICd0b29sdGlwLWNsYXNzJyApICkNCgkJCQl7DQoJCQkJCXRvb2xEaXYuYWRkQ2xhc3MoICRlbGVtZW50LmRhdGEoICd0b29sdGlwLWNsYXNzJyApICk7DQoJCQkJfQ0KCQkJCXRvb2xEaXYuY3NzKHsNCgkJCQkJcG9zaXRpb246ICdhYnNvbHV0ZScsDQoJCQkJCSd6LWluZGV4JzogMTUwMA0KCQkJCX0pOw0KCQkJCXRvb2xEaXYuYXR0cignaWQnLCAndG9vbHRpcC0nICsgdG9vbElkKTsNCgkJCQl2YXIgdHlwZSA9ICRlbGVtZW50LmRhdGEoJ3Rvb2x0aXAtdHlwZScpOw0KCQkJCWlmKCAhdHlwZSApDQoJCQkJCXR5cGUgPSBzZXR0aW5ncy5kZWZhdWx0VHlwZTsNCg0KCQkJCXZhciBjb250ZW50ID0gJyc7DQoJCQkJaWYgKCBzZXR0aW5ncy5kYXRhQXR0ciApDQoJCQkJCWNvbnRlbnQgPSAkZWxlbWVudC5hdHRyKCBzZXR0aW5ncy5kYXRhQXR0ciApOw0KCQkJCWVsc2UgaWYgKCBzZXR0aW5ncy5kYXRhTmFtZSApDQoJCQkJCWNvbnRlbnQgPSAkZWxlbWVudC5kYXRhKHNldHRpbmdzLmRhdGFOYW1lKTsNCg0KCQkJCWlmKCB0eXBlID09ICd0ZXh0JykNCgkJCQl7DQoJCQkJCXRvb2xEaXYudGV4dCggY29udGVudCApOw0KCQkJCX0NCgkJCQllbHNlIGlmICggdHlwZSA9PSAnc2VsZWN0b3InICkNCgkJCQl7DQoJCQkJCXZhciB0b29sRWxlbWVudCA9ICQoIGNvbnRlbnQsICRlbGVtZW50LnBhcmVudCgpICk7DQoJCQkJCXRvb2xEaXYuZGF0YSggJ29yaWdpbmFsUGFyZW50JywgdG9vbEVsZW1lbnQucGFyZW50KCkgKTsNCgkJCQkJdG9vbERpdi5hcHBlbmQoIHRvb2xFbGVtZW50LnNob3coKSApOw0KCQkJCQl0b29sRGl2LmRhdGEoICdwcmVzZXJ2ZUNvbnRlbnQnLCB0cnVlICk7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCXRvb2xEaXYuaHRtbCggY29udGVudCApOw0KCQkJCX0NCg0KCQkJCWlmICggdHlwZW9mKCBnX1RleHRGaWx0ZXIgKSAhPT0gJ3VuZGVmaW5lZCcgJiYgZ19UZXh0RmlsdGVyICE9IG51bGwgKQ0KCQkJCXsNCgkJCQkJZ19UZXh0RmlsdGVyLkZpbHRlckVsZW1lbnQoIHRvb2xEaXYgKTsNCgkJCQl9DQoNCgkJCQkkKCBzZXR0aW5ncy50b29sdGlwUGFyZW50IHx8ICRlbGVtZW50LnBhcmVudCgpICkuYXBwZW5kKHRvb2xEaXYpOw0KCQkJCSRlbGVtZW50LmRhdGEoInRvb2x0aXAuZWxlbWVudCIsIHRvb2xEaXYpOw0KDQoJCQl9DQoNCgkJCXZhciBmdW5jTmFtZSA9IHNldHRpbmdzLmZ1bmNOYW1lICYmICQoZWxlbWVudCkuZGF0YSggc2V0dGluZ3MuZnVuY05hbWUgKTsNCgkJCWlmKCBmdW5jTmFtZSApDQoJCQl7DQoJCQkJaWYoIHR5cGUgPT0gJ3RleHQnKQ0KCQkJCQl0b29sRGl2LnRleHQoIHdpbmRvd1tmdW5jTmFtZV0oZWxlbWVudCkgKTsNCgkJCQllbHNlDQoJCQkJCXRvb2xEaXYuaHRtbCggd2luZG93W2Z1bmNOYW1lXShlbGVtZW50KSApOw0KCQkJfQ0KDQoJCQlpZiggc2V0dGluZ3MuZnVuYyApDQoJCQkJc2V0dGluZ3MuZnVuYy5iaW5kKHRvb2xEaXYpKGVsZW1lbnQpOw0KDQoJCQlyZXR1cm4gdG9vbERpdjsNCgkJfSwNCgkJdXBkYXRlcG9zaXRpb24gOiBmdW5jdGlvbigpIHsNCgkJICAgIHZhciBuZXdQb3NpdGlvbiA9IHt9Ow0KCQkgICAgdmFyIHNldHRpbmdzID0gJCh0aGlzKS5kYXRhKCd0b29sdGlwLnNldHRpbmdzJyk7DQoJCSAgICB2YXIgdG9vbERpdiA9IG1ldGhvZHMuZ2V0dG9vbHRpcCggdGhpcywgc2V0dGluZ3MgKTsNCg0KCQkgICAgdmFyIHBhcmVudFBvc2l0aW9uID0gJCh0aGlzKS5vZmZzZXQoKTsNCg0KCQkgICAgY29uc3QgYlJUTCA9IHRvb2xEaXZbMF0ubWF0Y2hlcyggJzpkaXIocnRsKScgKTsNCgkJICAgIHN3aXRjaCggc2V0dGluZ3MubG9jYXRpb24gKQ0KCQkgICAgew0KCQkJCWNhc2UgJ3RvcCc6DQoJCQkJCWlmICggYlJUTCApDQoJCQkJCXsNCgkJCQkJCW5ld1Bvc2l0aW9uID0gew0KCQkJCQkJCWxlZnQ6IHBhcmVudFBvc2l0aW9uLmxlZnQgKyAkKHRoaXMpLm91dGVyV2lkdGgoKSAtIHRvb2xEaXYub3V0ZXJXaWR0aCgpICsgc2V0dGluZ3Mub2Zmc2V0WCwNCgkJCQkJCQl0b3A6IHBhcmVudFBvc2l0aW9uLnRvcCAtIHRvb2xEaXYub3V0ZXJIZWlnaHQoKSArIHNldHRpbmdzLm9mZnNldFkNCgkJCQkJCX07DQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQluZXdQb3NpdGlvbiA9IHsNCgkJCQkJCQlsZWZ0OiBwYXJlbnRQb3NpdGlvbi5sZWZ0ICsgc2V0dGluZ3Mub2Zmc2V0WCwNCgkJCQkJCQl0b3A6IHBhcmVudFBvc2l0aW9uLnRvcCAtIHRvb2xEaXYub3V0ZXJIZWlnaHQoKSArIHNldHRpbmdzLm9mZnNldFkNCgkJCQkJCX07DQoJCQkJCX0NCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlICdib3R0b20nOg0KCQkJCQlpZiAoIGJSVEwgKQ0KCQkJCQl7DQoJCQkJCQluZXdQb3NpdGlvbiA9IHsNCgkJCQkJCQlsZWZ0OiBwYXJlbnRQb3NpdGlvbi5sZWZ0ICsgJCh0aGlzKS5vdXRlcldpZHRoKCkgLSB0b29sRGl2Lm91dGVyV2lkdGgoKSArIHNldHRpbmdzLm9mZnNldFgsDQoJCQkJCQkJdG9wOiBwYXJlbnRQb3NpdGlvbi50b3AgKyAkKHRoaXMpLm91dGVySGVpZ2h0KCkgKyBzZXR0aW5ncy5vZmZzZXRZDQoJCQkJCQl9Ow0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJbmV3UG9zaXRpb24gPSB7DQoJCQkJCQkJbGVmdDogcGFyZW50UG9zaXRpb24ubGVmdCArIHNldHRpbmdzLm9mZnNldFgsDQoJCQkJCQkJdG9wOiBwYXJlbnRQb3NpdGlvbi50b3AgKyAkKHRoaXMpLm91dGVySGVpZ2h0KCkgKyBzZXR0aW5ncy5vZmZzZXRZDQoJCQkJCQl9Ow0KCQkJCQl9DQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAnYm90dG9tIGxlZnQnOg0KCQkJCQlpZiAoIGJSVEwgKQ0KCQkJCQl7DQoJCQkJCQluZXdQb3NpdGlvbiA9IHsNCgkJCQkJCQlsZWZ0OiBwYXJlbnRQb3NpdGlvbi5sZWZ0ICsgc2V0dGluZ3Mub2Zmc2V0WCwNCgkJCQkJCQl0b3A6IHBhcmVudFBvc2l0aW9uLnRvcCArICQodGhpcykub3V0ZXJIZWlnaHQoKSArIHNldHRpbmdzLm9mZnNldFkNCgkJCQkJCX07DQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQluZXdQb3NpdGlvbiA9IHsNCgkJCQkJCQlsZWZ0OiBwYXJlbnRQb3NpdGlvbi5sZWZ0ICsgc2V0dGluZ3Mub2Zmc2V0WCAtIHRvb2xEaXYub3V0ZXJXaWR0aCgpICsgJEoodGhpcykub3V0ZXJXaWR0aCgpLA0KCQkJCQkJCXRvcDogcGFyZW50UG9zaXRpb24udG9wICsgJCh0aGlzKS5vdXRlckhlaWdodCgpICsgc2V0dGluZ3Mub2Zmc2V0WQ0KCQkJCQkJfTsNCgkJCQkJfQ0KCQkJCQlicmVhazsNCg0KCQkJCWRlZmF1bHQ6DQoJCQkJCWNvbnNvbGUubG9nKCJJbnZhbGlkIGxvY2F0aW9uIHBhc3NlZCB0byB2X3Rvb2x0aXA6ICVzIiwgc2V0dGluZ3MubG9jYXRpb24pOw0KCQkgICAgfQ0KCQkgICAgLy8gQ29ycmVjdCBmb3Igd2luZG93IHNpemUNCgkJICAgIGlmKCBzZXR0aW5ncy5jb3JyZWN0Rm9yU2NyZWVuU2l6ZSApDQoJCSAgICB7DQoJCSAgICAgICAgdmFyIHJpZ2h0RWRnZSA9IG5ld1Bvc2l0aW9uLmxlZnQgKyB0b29sRGl2LndpZHRoKCk7DQoJCSAgICAgICAgdmFyIHdpbmRvd1JpZ2h0RWRnZSA9ICQod2luZG93KS53aWR0aCgpIC0gc2V0dGluZ3Muc2l6ZUNvcnJlY3Rpb25YUGFkZGluZyArICQod2luZG93KS5zY3JvbGxMZWZ0KCk7DQoJCSAgICAgICAgdmFyIHdpbmRvd0xlZnRFZGdlID0gICQod2luZG93KS5zY3JvbGxMZWZ0KCkgKyBzZXR0aW5ncy5zaXplQ29ycmVjdGlvblhQYWRkaW5nOw0KDQoJCSAgICAgICAgaWYoIHJpZ2h0RWRnZSA+IHdpbmRvd1JpZ2h0RWRnZSApDQoJCSAgICAgICAgICAgIG5ld1Bvc2l0aW9uLmxlZnQgPSB3aW5kb3dSaWdodEVkZ2UgLSB0b29sRGl2LndpZHRoKCkgLSBzZXR0aW5ncy5zaXplQ29ycmVjdGlvblhQYWRkaW5nOw0KDQoJCSAgICAgICAgaWYoIG5ld1Bvc2l0aW9uLmxlZnQgPCB3aW5kb3dMZWZ0RWRnZSApDQoJCSAgICAgICAgICAgIG5ld1Bvc2l0aW9uLmxlZnQgPSB3aW5kb3dMZWZ0RWRnZTsNCg0KCQkJCWlmICggbmV3UG9zaXRpb24udG9wIDwgMCApDQoJCQkJCW5ld1Bvc2l0aW9uLnRvcCA9IHBhcmVudFBvc2l0aW9uLnRvcCArICQodGhpcykuaGVpZ2h0KCkgKyBzZXR0aW5ncy5zaXplQ29ycmVjdGlvbllQYWRkaW5nIC0gc2V0dGluZ3Mub2Zmc2V0WTsNCgkJICAgIH0NCg0KCQkgICAgdG9vbERpdi5jc3MobmV3UG9zaXRpb24pOw0KCQl9LA0KCQlyZXBvc2l0aW9uIDogZnVuY3Rpb24oZXZlbnQpIHsNCgkJCXZhciBuZXdQb3NpdGlvbiA9IHt9Ow0KCQkJdmFyIHNldHRpbmdzID0gJCh0aGlzKS5kYXRhKCd0b29sdGlwLnNldHRpbmdzJyk7DQoJCQl2YXIgdG9vbERpdiA9IG1ldGhvZHMuZ2V0dG9vbHRpcCggdGhpcywgc2V0dGluZ3MgKTsNCg0KCQkJdmFyIHBhcmVudFBvc2l0aW9uID0gJCh0aGlzKS5vZmZzZXQoKTsNCg0KCQkJaWYoIHNldHRpbmdzLnRyYWNrTW91c2UgKQ0KCQkJew0KCQkJCWlmICggc2V0dGluZ3MudHJhY2tNb3VzZUNlbnRlcmVkICkNCgkJCQkJbmV3UG9zaXRpb24ubGVmdCA9IGV2ZW50LnBhZ2VYIC0gdG9vbERpdi5vdXRlcldpZHRoKCkgLyAyOw0KCQkJCWVsc2UNCgkJCQkJbmV3UG9zaXRpb24ubGVmdCA9IGV2ZW50LnBhZ2VYICsgc2V0dGluZ3Mub2Zmc2V0WTsNCg0KCQkJCWlmICggc2V0dGluZ3MubG9jYXRpb24gPT0gJ3RvcCcgKQ0KCQkJCQluZXdQb3NpdGlvbi50b3AgPSBldmVudC5wYWdlWSAtIHRvb2xEaXYub3V0ZXJIZWlnaHQoKSArIHNldHRpbmdzLm9mZnNldFk7DQoJCQkJZWxzZQ0KCQkJCQluZXdQb3NpdGlvbi50b3AgPSBldmVudC5wYWdlWSArIHNldHRpbmdzLm9mZnNldFk7DQoNCgkJCX0gZWxzZSB7DQoJCQkJY29uc3QgYlJUTCA9IHRvb2xEaXZbMF0ubWF0Y2hlcyggJzpkaXIocnRsKScgKTsNCgkJCQlzd2l0Y2goIHNldHRpbmdzLmxvY2F0aW9uICkNCgkJCQl7DQoJCQkJCWNhc2UgJ3RvcCc6DQoJCQkJCQlpZiAoIGJSVEwgKQ0KCQkJCQkJew0KCQkJCQkJCW5ld1Bvc2l0aW9uID0gew0KCQkJCQkJCQlsZWZ0OiBwYXJlbnRQb3NpdGlvbi5sZWZ0ICsgJCh0aGlzKS5vdXRlcldpZHRoKCkgLSB0b29sRGl2Lm91dGVyV2lkdGgoKSArIHNldHRpbmdzLm9mZnNldFgsDQoJCQkJCQkJCXRvcDogcGFyZW50UG9zaXRpb24udG9wIC0gdG9vbERpdi5vdXRlckhlaWdodCgpICsgc2V0dGluZ3Mub2Zmc2V0WQ0KCQkJCQkJCX07DQoJCQkJCQl9DQoJCQkJCQllbHNlDQoJCQkJCQl7DQoJCQkJCQkJbmV3UG9zaXRpb24gPSB7DQoJCQkJCQkJCWxlZnQ6IHBhcmVudFBvc2l0aW9uLmxlZnQgKyBzZXR0aW5ncy5vZmZzZXRYLA0KCQkJCQkJCQl0b3A6IHBhcmVudFBvc2l0aW9uLnRvcCAtIHRvb2xEaXYub3V0ZXJIZWlnaHQoKSArIHNldHRpbmdzLm9mZnNldFkNCgkJCQkJCQl9Ow0KCQkJCQkJfQ0KCQkJCQkJYnJlYWs7DQoNCgkJCQkJY2FzZSAnYm90dG9tJzoNCgkJCQkJCWlmICggYlJUTCApDQoJCQkJCQl7DQoJCQkJCQkJbmV3UG9zaXRpb24gPSB7DQoJCQkJCQkJCWxlZnQ6IHBhcmVudFBvc2l0aW9uLmxlZnQgKyAkKHRoaXMpLm91dGVyV2lkdGgoKSAtIHRvb2xEaXYub3V0ZXJXaWR0aCgpICsgc2V0dGluZ3Mub2Zmc2V0WCwNCgkJCQkJCQkJdG9wOiBwYXJlbnRQb3NpdGlvbi50b3AgKyAkKHRoaXMpLm91dGVySGVpZ2h0KCkgKyBzZXR0aW5ncy5vZmZzZXRZDQoJCQkJCQkJfTsNCgkJCQkJCX0NCgkJCQkJCWVsc2UNCgkJCQkJCXsNCgkJCQkJCQluZXdQb3NpdGlvbiA9IHsNCgkJCQkJCQkJbGVmdDogcGFyZW50UG9zaXRpb24ubGVmdCArIHNldHRpbmdzLm9mZnNldFgsDQoJCQkJCQkJCXRvcDogcGFyZW50UG9zaXRpb24udG9wICsgJCh0aGlzKS5vdXRlckhlaWdodCgpICsgc2V0dGluZ3Mub2Zmc2V0WQ0KCQkJCQkJCX07DQoJCQkJCQl9DQoJCQkJCQlicmVhazsNCg0KCQkJCQljYXNlICdib3R0b20gbGVmdCc6DQoJCQkJCQlpZiAoIGJSVEwgKQ0KCQkJCQkJew0KCQkJCQkJCW5ld1Bvc2l0aW9uID0gew0KCQkJCQkJCQlsZWZ0OiBwYXJlbnRQb3NpdGlvbi5sZWZ0ICsgc2V0dGluZ3Mub2Zmc2V0WCwNCgkJCQkJCQkJdG9wOiBwYXJlbnRQb3NpdGlvbi50b3AgKyAkKHRoaXMpLm91dGVySGVpZ2h0KCkgKyBzZXR0aW5ncy5vZmZzZXRZDQoJCQkJCQkJfTsNCgkJCQkJCX0NCgkJCQkJCWVsc2UNCgkJCQkJCXsNCgkJCQkJCQluZXdQb3NpdGlvbiA9IHsNCgkJCQkJCQkJbGVmdDogcGFyZW50UG9zaXRpb24ubGVmdCArIHNldHRpbmdzLm9mZnNldFggLSB0b29sRGl2Lm91dGVyV2lkdGgoKSArICRKKHRoaXMpLm91dGVyV2lkdGgoKSwNCgkJCQkJCQkJdG9wOiBwYXJlbnRQb3NpdGlvbi50b3AgKyAkKHRoaXMpLm91dGVySGVpZ2h0KCkgKyBzZXR0aW5ncy5vZmZzZXRZDQoJCQkJCQkJfTsNCgkJCQkJCX0NCgkJCQkJCWJyZWFrOw0KDQoJCQkJCWNhc2UgJ21vdXNlJzoNCgkJCQkJCW5ld1Bvc2l0aW9uID0gew0KCQkJCQkJCWxlZnQ6IGV2ZW50LnBhZ2VYICsgc2V0dGluZ3Mub2Zmc2V0WCwNCgkJCQkJCQl0b3A6IGV2ZW50LnBhZ2VZICsgc2V0dGluZ3Mub2Zmc2V0WQ0KCQkJCQkJfQ0KDQoJCQkJCWRlZmF1bHQ6DQoJCQkJCQljb25zb2xlLmxvZygiSW52YWxpZCBsb2NhdGlvbiBwYXNzZWQgdG8gdl90b29sdGlwOiAlcyIsIHNldHRpbmdzLmxvY2F0aW9uKTsNCgkJCQl9DQoJCQl9DQoJCQkvLyBDb3JyZWN0IGZvciB3aW5kb3cgc2l6ZQ0KCQkJaWYoIHNldHRpbmdzLmNvcnJlY3RGb3JTY3JlZW5TaXplICkNCgkJCXsNCgkJCQl2YXIgcmlnaHRFZGdlID0gbmV3UG9zaXRpb24ubGVmdCArIHRvb2xEaXYud2lkdGgoKTsNCgkJCQl2YXIgd2luZG93UmlnaHRFZGdlID0gJCh3aW5kb3cpLndpZHRoKCkgLSBzZXR0aW5ncy5zaXplQ29ycmVjdGlvblhQYWRkaW5nICsgJCh3aW5kb3cpLnNjcm9sbExlZnQoKTsNCgkJCQl2YXIgd2luZG93TGVmdEVkZ2UgPSAgJCh3aW5kb3cpLnNjcm9sbExlZnQoKSArIHNldHRpbmdzLnNpemVDb3JyZWN0aW9uWFBhZGRpbmc7DQoNCgkJCQlpZiggcmlnaHRFZGdlID4gd2luZG93UmlnaHRFZGdlICkNCgkJCQkJbmV3UG9zaXRpb24ubGVmdCA9IHdpbmRvd1JpZ2h0RWRnZSAtIHRvb2xEaXYud2lkdGgoKSAtIHNldHRpbmdzLnNpemVDb3JyZWN0aW9uWFBhZGRpbmc7DQoNCgkJCQlpZiggbmV3UG9zaXRpb24ubGVmdCA8IHdpbmRvd0xlZnRFZGdlICkNCgkJCQkJbmV3UG9zaXRpb24ubGVmdCA9IHdpbmRvd0xlZnRFZGdlOw0KDQoJCQkJaWYgKCBuZXdQb3NpdGlvbi50b3AgPCAwICkNCgkJCQkJbmV3UG9zaXRpb24udG9wID0gcGFyZW50UG9zaXRpb24udG9wICsgJCh0aGlzKS5oZWlnaHQoKSArIHNldHRpbmdzLnNpemVDb3JyZWN0aW9uWVBhZGRpbmcgLSBzZXR0aW5ncy5vZmZzZXRZOw0KCQkJfQ0KDQoJCQl0b29sRGl2LmNzcyhuZXdQb3NpdGlvbik7DQoJCX0sDQoJCXNob3cgOiBmdW5jdGlvbihldmVudCkgew0KCQkJdmFyIHNldHRpbmdzID0gJCh0aGlzKS5kYXRhKCd0b29sdGlwLnNldHRpbmdzJykgfHwge307DQoNCgkJCWlmICggc2V0dGluZ3MuZGlzYWJsZU9uVG91Y2hEZXZpY2UgJiYgJCh0aGlzICkuZGF0YSgnaW5Ub3VjaEV2ZW50JykgKQ0KCQkJew0KCQkJCXJldHVybjsNCgkJCX0NCg0KCQkJdmFyIHRvb2xEaXYgPSBtZXRob2RzLmdldHRvb2x0aXAoIHRoaXMsIHNldHRpbmdzICk7DQoNCgkJCWlmKCB0b29sRGl2LmlzKCc6ZW1wdHknKSApDQoJCQkJcmV0dXJuOw0KDQoJCQlpZiggZXZlbnQudHlwZSA9PSAiY2xpY2siICYmIGV2ZW50LmN1cnJlbnRUYXJnZXQgIT0gdGhpcyApDQoJCQkJcmV0dXJuOw0KDQoJCQlpZiggc2V0dGluZ3Muc3VwcHJlc3NXaGlsZVRvZ2dsZWQgJiYgJCh0aGlzKS5oYXNDbGFzcygndG9nZ2xlZCcpICkNCgkJCQlyZXR1cm4gZmFsc2U7DQoNCgkJCXZhciB0aXBFbGVtID0gdGhpczsNCgkJCWlmICggIXNldHRpbmdzLnRyYWNrTW91c2UgKQ0KCQkJew0KCQkJCXRvb2xEaXYuZmluZCggJ2ltZycgKS5vbiggJ2xvYWQnLCBmdW5jdGlvbigpIHsgalF1ZXJ5LnByb3h5KG1ldGhvZHMudXBkYXRlcG9zaXRpb24sIHRpcEVsZW0pKCkgfSApOw0KCQkJfQ0KDQoJCQlpZiggc2V0dGluZ3MucHJldmVudERlZmF1bHQgKQ0KCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQoNCgkJCWlmKCBzZXR0aW5ncy5zdG9wUHJvcGFnYXRpb24gKQ0KCQkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOw0KDQoJCQlpZiggc2V0dGluZ3MucGFyZW50QWN0aXZlQ1NTQ2xhc3MgKQ0KCQkJCSQodGhpcykuYWRkQ2xhc3Moc2V0dGluZ3MucGFyZW50QWN0aXZlQ1NTQ2xhc3MpOw0KDQoJCQlpZiggc2V0dGluZ3MuaW5oZXJpdFBhcmVudE1pbldpZHRoICkNCgkJCXsNCgkJCQl2YXIgcGFyZW50V2lkdGggPSAkKHRoaXMpLm91dGVyV2lkdGgoKTsNCgkJCQl2YXIgbG9jYWxQYWRkaW5nID0gdG9vbERpdi5vdXRlcldpZHRoKCkgLSB0b29sRGl2LndpZHRoKCk7DQoJCQkJdG9vbERpdi5jc3MoeydtaW4td2lkdGgnOiArIChwYXJlbnRXaWR0aCAtIGxvY2FsUGFkZGluZykgKyAicHgifSk7DQoJCQl9DQoNCgkJCXRvb2xEaXZbMF0ucG9wb3ZlciA9ICdtYW51YWwnOw0KCQkJdG9vbERpdi5jc3MoJ2luc2V0JywgJ3Vuc2V0Jyk7DQoJCQl0b29sRGl2LmNzcygnYm9yZGVyJywgJ25vbmUnKTsNCgkJCXRvb2xEaXYuY3NzKCdvdmVyZmxvdycsICdpbml0aWFsJyk7DQoNCgkJCXRvb2xEaXYuc3RvcCh0cnVlLCB0cnVlKTsNCgkJCWlmKCBzZXR0aW5ncy5mYWRlU3BlZWQgPiAwICkNCgkJCQl0b29sRGl2LmRlbGF5KCBzZXR0aW5ncy5hcHBlYXJhbmNlRGVsYXlNcyApLmZhZGVUbyggc2V0dGluZ3MuZmFkZVNwZWVkLCAxICk7DQoJCQllbHNlDQoJCQkJdG9vbERpdi5kZWxheSggc2V0dGluZ3MuYXBwZWFyYW5jZURlbGF5TXMgKS5zaG93KCk7DQoNCgkJCWlmKCBzZXR0aW5ncy5hbGxvd0hvdmVyICkNCgkJCXsNCgkJCQlpZiggc2V0dGluZ3MudXNlQ2xpY2tFdmVudCApDQoJCQkJCXRvb2xEaXYuYmluZCgnY2xpY2sudG9vbHRpcCcsIGpRdWVyeS5wcm94eShtZXRob2RzLnNob3csIHRoaXMpKTsNCgkJCQllbHNlIGlmKCBzZXR0aW5ncy51c2VDb250ZXh0TWVudUV2ZW50ICkNCgkJCQkJdG9vbERpdi5iaW5kKCdjb250ZXh0bWVudS50b29sdGlwJywgalF1ZXJ5LnByb3h5KG1ldGhvZHMuc2hvdywgdGhpcykpOw0KCQkJCWVsc2UNCgkJCQkJdG9vbERpdi5iaW5kKCdtb3VzZWVudGVyLnRvb2x0aXAnLCBqUXVlcnkucHJveHkobWV0aG9kcy5zaG93LCB0aGlzKSk7DQoJCQkJdG9vbERpdi5iaW5kKCdtb3VzZWxlYXZlLnRvb2x0aXAnLCBqUXVlcnkucHJveHkobWV0aG9kcy5oaWRlLCB0aGlzKSk7DQoJCQl9DQoNCgkJCWlmKCBzZXR0aW5ncy50cmFja01vdXNlICkNCgkJCQkkKHRoaXMpLmJpbmQoJ21vdXNlbW92ZS50b29sdGlwJywgbWV0aG9kcy5yZXBvc2l0aW9uKTsNCgkJCWpRdWVyeS5wcm94eShtZXRob2RzLnJlcG9zaXRpb24sIHRoaXMpKGV2ZW50KTsNCg0KCQkJaWYoIHNldHRpbmdzLmNoaWxkQWN0aXZlQ1NTQ2xhc3MgKQ0KCQkJew0KCQkJCXRvb2xEaXYuY3NzKCdvcGFjaXR5Jyk7DQoJCQkJdG9vbERpdi5hZGRDbGFzcyhzZXR0aW5ncy5jaGlsZEFjdGl2ZUNTU0NsYXNzKTsNCg0KCQkJfQ0KDQoJCQl0b29sRGl2WzBdLnNob3dQb3BvdmVyKCk7DQoNCgkJCXRvb2xEaXYuY3NzKCdwb2ludGVyLWV2ZW50cycsJ2F1dG8nKTsNCg0KCQkJJCh0aGlzKS50cmlnZ2VyKCd2X3Rvb2x0aXBfc2hvd24nLCBbIHRvb2xEaXYgXSApOw0KDQoJCQkkKHRoaXMpLmF0dHIoJ2FyaWEtZGVzY3JpYmVkYnknLCAndG9vbHRpcC0nICsgJCh0aGlzKS5kYXRhKCJ0b29sdGlwLmlkIikpOw0KDQoJCX0sDQoJCWhpZGUgOiBmdW5jdGlvbihldmVudCkgew0KCQkJdmFyIHRvb2xEaXYgPSAkKHRoaXMpLmRhdGEoJ3Rvb2x0aXAuZWxlbWVudCcpOw0KCQkJdmFyIHNldHRpbmdzID0gJCh0aGlzKS5kYXRhKCd0b29sdGlwLnNldHRpbmdzJykgfHwge307DQoNCgkJCS8vIHRoZSBlbGVtZW50IG1heSBub3QgaGF2ZSBiZWVuIGNyZWF0ZWQgeWV0IC0gaW4gd2hpY2ggY2FzZSB0aGVyZSBpcyBub3RoaW5nIHRvIGhpZGUNCgkJCWlmICggIXRvb2xEaXYgfHwgIXRvb2xEaXYubGVuZ3RoICkNCgkJCQlyZXR1cm47DQoNCg0KCQkJaWYoIGV2ZW50ICYmIGV2ZW50LnR5cGUgIT0gJ2NsaWNrJyApDQoJCQl7DQoJCQkJLy8gTW92aW5nIGJldHdlZW4gdGhlIGNsaWNrIHRhcmdldCBhbmQgaXQncyBjaGlsZHJlbg0KCQkJCWlmKCBldmVudC5yZWxhdGVkVGFyZ2V0ICYmICggdGhpcyA9PSBldmVudC5yZWxhdGVkVGFyZ2V0IHx8IHRoaXMuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkgKSApDQoJCQkJCXJldHVybjsNCgkJCQkvLyBNb3ZpbmcgdG8gdGhlIHRvb2x0aXAgb3Igb25lIG9mIGl0J3MgY2hpbGRyZW4NCgkJCQllbHNlIGlmKCBldmVudC5yZWxhdGVkVGFyZ2V0ICYmICggZXZlbnQucmVsYXRlZFRhcmdldCA9PSB0b29sRGl2WzBdIHx8IHRvb2xEaXZbMF0uY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCApICkgKQ0KCQkJCQlyZXR1cm47DQoJCQl9DQoNCgkJCWlmKCBzZXR0aW5ncy50cmFja01vdXNlICkNCgkJCQkkKHRoaXMpLnVuYmluZCgnbW91c2Vtb3ZlLnRvb2x0aXAnKTsNCg0KCQkJdG9vbERpdi51bmJpbmQoJ21vdXNlZW50ZXIudG9vbHRpcCcpOw0KCQkJdG9vbERpdi51bmJpbmQoJ21vdXNlbGVhdmUudG9vbHRpcCcpOw0KDQoJCQlpZiggc2V0dGluZ3MucGFyZW50QWN0aXZlQ1NTQ2xhc3MgKQ0KCQkJCSQodGhpcykucmVtb3ZlQ2xhc3Moc2V0dGluZ3MucGFyZW50QWN0aXZlQ1NTQ2xhc3MpOw0KDQoNCgkJCS8vIENsZWFyIHRoZSBhbmltYXRpb24gcXVldWUgc28gYXBwZWFyYW5jZSBkZWxheXMgYW5kIGZhZGluZyBhcmUgYWJvcnRlZA0KCQkJdG9vbERpdi5zdG9wKCB0cnVlICk7DQoJCQlpZiggc2V0dGluZ3MuZmFkZVNwZWVkID4gMCAmJiB0b29sRGl2LmlzKCc6dmlzaWJsZScpICkNCgkJCXsNCgkJCQl0b29sRGl2LmZhZGVUbyggc2V0dGluZ3MuZmFkZVNwZWVkLCAwLCBmdW5jdGlvbigpIHsNCgkJCQkJaWYgKCBzZXR0aW5ncy5kZXN0cm95V2hlbkRvbmUgKQ0KCQkJCQl7DQoJCQkJCQltZXRob2RzLmRlc3Ryb3l0b29sdGlwKCB0b29sRGl2ICk7DQoJCQkJCX0NCgkJCQkJaWYgKCB0b29sRGl2WzBdLnBvcG92ZXIgKQ0KCQkJCQl7DQoJCQkJCQl0b29sRGl2WzBdLmhpZGVQb3BvdmVyKCk7DQoJCQkJCX0NCgkJCQl9ICk7DQoJCQl9IGVsc2UgaWYoIHNldHRpbmdzLmNoaWxkQWN0aXZlQ1NTQ2xhc3MgKQ0KCQkJew0KCQkJCXRvb2xEaXYuY3NzKCdvcGFjaXR5Jyk7DQoJCQkJdG9vbERpdi5yZW1vdmVDbGFzcyhzZXR0aW5ncy5jaGlsZEFjdGl2ZUNTU0NsYXNzKTsNCgkJCQkvLyBOb3RlOiBUaGlzIGNhbGxiYWNrIGlzbid0IHJlbGlhYmxlLCBzbyB3ZSBtYXkgZW5kIHVwIGp1bmtpbmcgdXAgdGhlIGRvbSB3aXRoIGEgZmV3IHNwYXJlIGNvcGllcw0KCQkJCS8vIE5vdCBhIGh1Z2UgZGVhbCBpbiBtb3N0IGNhc2VzLCBidXQga2VlcCBpbiBtaW5kIGlmIHlvdSdyZSB1c2luZyB0aGlzIG9uIHBhZ2VzIHdoaWNoIG1heSBleGlzdCBmb3INCgkJCQkvLyBsb25nIHBlcmlvZHMgb2YgdGltZSB3aXRob3V0IHJlbG9hZGluZy4NCgkJCQlpZiggc2V0dGluZ3MuZGVzdHJveVdoZW5Eb25lICkNCgkJCQl7DQoJCQkJCXRvb2xEaXYub24gKCAidHJhbnNpdGlvbmVuZCIsIGZ1bmN0aW9uICgpIHsNCgkJCQkJCW1ldGhvZHMuZGVzdHJveXRvb2x0aXAgKCB0b29sRGl2ICk7DQoJCQkJCQlpZiAoIHRvb2xEaXZbMF0ucG9wb3ZlciApDQoJCQkJCQl7DQoJCQkJCQkJdG9vbERpdlswXS5oaWRlUG9wb3ZlcigpOw0KCQkJCQkJfQ0KCQkJCQl9ICk7DQoNCgkJCQkJLy8gVHJhbnNpdGlvbmVuZCBtYXkgbm90IGZpcmUgdW5kZXIgdmFyaW91cyBjb25kaXRpb25zLCBzbyBKVVNUIElOIENBU0UuLi4uDQoJCQkJCXNldFRpbWVvdXQoIGZ1bmN0aW9uKCl7DQoJCQkJCQltZXRob2RzLmRlc3Ryb3l0b29sdGlwICggdG9vbERpdiApOw0KCQkJCQkJaWYgKCB0b29sRGl2WzBdLnBvcG92ZXIgKQ0KCQkJCQkJew0KCQkJCQkJCXRvb2xEaXZbMF0uaGlkZVBvcG92ZXIoKTsNCgkJCQkJCX0NCgkJCQkJfSwgMTAwMCk7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCWlmICggdG9vbERpdlswXS5wb3BvdmVyICkNCgkJCQkJew0KCQkJCQkJdG9vbERpdlswXS5oaWRlUG9wb3ZlcigpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCWlmKCBzZXR0aW5ncy5kZXN0cm95V2hlbkRvbmUgKQ0KCQkJCQltZXRob2RzLmRlc3Ryb3l0b29sdGlwKCB0b29sRGl2ICk7DQoNCgkJCQlpZiAoIHRvb2xEaXZbMF0ucG9wb3ZlciApDQoJCQkJew0KCQkJCQl0b29sRGl2WzBdLmhpZGVQb3BvdmVyKCk7DQoJCQkJfQ0KCQkJfQ0KCQkJaWYoIHNldHRpbmdzLmRlc3Ryb3lXaGVuRG9uZSApDQoJCQkJJCh0aGlzKS5yZW1vdmVEYXRhKCd0b29sdGlwLmVsZW1lbnQnKTsNCgkJCWVsc2UNCgkJCQl0b29sRGl2LmNzcygncG9pbnRlci1ldmVudHMnLCdub25lJyk7DQoNCgkJCSQodGhpcykudHJpZ2dlciggJ3ZfdG9vbHRpcF9oaWRkZW4nICk7DQoJCX0sDQoJCWRlc3Ryb3l0b29sdGlwOiBmdW5jdGlvbiggdG9vbERpdiApDQoJCXsNCgkJCWlmICggdG9vbERpdiApDQoJCQl7DQoJCQkJaWYgKCAkKHRvb2xEaXYgKS5kYXRhKCdwcmVzZXJ2ZUNvbnRlbnQnKSApDQoJCQkJew0KCQkJCQkkKCB0b29sRGl2LmRhdGEoICdvcmlnaW5hbFBhcmVudCcpICkuYXBwZW5kKCAkKHRvb2xEaXYgKS5jaGlsZHJlbigpLmhpZGUoKSk7DQoJCQkJfQ0KDQoJCQkJJCh0b29sRGl2KS5yZW1vdmUoKTsNCgkJCX0NCgkJfQ0KCX07DQoNCgkkLmZuLnZfdG9vbHRpcCA9IGZ1bmN0aW9uKCBtZXRob2QgKSB7DQoNCgkJaWYgKCBtZXRob2RzW21ldGhvZF0gKSB7DQoJCQlyZXR1cm4gbWV0aG9kc1ttZXRob2RdLmFwcGx5KCB0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzLCAxICkpOw0KCQl9IGVsc2UgaWYgKCB0eXBlb2YgbWV0aG9kID09PSAnb2JqZWN0JyB8fCAhIG1ldGhvZCApIHsNCgkJCXJldHVybiBtZXRob2RzLmluaXQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOw0KCQl9IGVsc2Ugew0KCQkJJC5lcnJvciggJ01ldGhvZCAnICsgIG1ldGhvZCArICcgZG9lcyBub3QgZXhpc3Qgb24galF1ZXJ5LnRvb2x0aXAnICk7DQoJCX0NCg0KCX07DQoNCg0KfSkoIGpRdWVyeSApOw0KDQoNCjwvc2NyaXB0Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KU3RlYW0gPSB7DQoJc21fYkluaXRpYWxpemVkOiBmYWxzZSwNCglzbV9iVXNlckluQ2xpZW50OiBmYWxzZSwNCglzbV9iVXNlckluR2FtZU92ZXJsYXk6IGZhbHNlLA0KCXNtX2JVc2VySW5UZW5mb290QnJvd3NlcjogZmFsc2UsDQoJc21fYlVzZXJJbkdhbWVwYWRVSTogZmFsc2UsDQoJc21fYlVzZXJJbk1vYmlsZUNoYXQ6IGZhbHNlLA0KCXNtX2JVc2VySW5Nb2JpbGVBcHA6IGZhbHNlLA0KDQoJQklzVXNlckluU3RlYW1DbGllbnQ6IGZ1bmN0aW9uKCkNCgl7DQoJCWlmICggIVN0ZWFtLnNtX2JJbml0aWFsaXplZCApDQoJCQlTdGVhbS5Jbml0KCk7DQoNCgkJcmV0dXJuIFN0ZWFtLnNtX2JVc2VySW5DbGllbnQ7DQoJfSwNCg0KCUJJc1VzZXJJbkdhbWVwYWRVSTogZnVuY3Rpb24oKQ0KCXsNCgkJaWYgKCAhU3RlYW0uc21fYkluaXRpYWxpemVkICkNCgkJCVN0ZWFtLkluaXQoKTsNCg0KCQlyZXR1cm4gU3RlYW0uc21fYlVzZXJJbkdhbWVwYWRVSTsNCgl9LA0KDQoJQklzVXNlckluR2FtZU92ZXJsYXk6IGZ1bmN0aW9uKCkNCgl7DQoJCWlmICggIVN0ZWFtLnNtX2JJbml0aWFsaXplZCApDQoJCQlTdGVhbS5Jbml0KCk7DQoNCgkJcmV0dXJuIFN0ZWFtLnNtX2JVc2VySW5HYW1lT3ZlcmxheQ0KCX0sDQoNCglCSXNVc2VySW5TdGVhbVRlbmZvb3RCcm93c2VyOiBmdW5jdGlvbigpDQoJew0KCQlpZiAoICFTdGVhbS5zbV9iSW5pdGlhbGl6ZWQgKQ0KCQkJU3RlYW0uSW5pdCgpOw0KDQoJCXJldHVybiBTdGVhbS5zbV9iVXNlckluVGVuZm9vdEJyb3dzZXI7DQoJfSwNCg0KCUJJc1VzZXJJbkNsaWVudE9yT3ZlcmxheTogZnVuY3Rpb24oKQ0KCXsNCgkJaWYgKCAhU3RlYW0uc21fYkluaXRpYWxpemVkICkNCgkJCVN0ZWFtLkluaXQoKTsNCg0KCQlyZXR1cm4gU3RlYW0uc21fYlVzZXJJbkNsaWVudCB8fCBTdGVhbS5zbV9iVXNlckluR2FtZU92ZXJsYXk7DQoJfSwNCg0KCUJJc1VzZXJJblN0ZWFtTW9iaWxlQ2hhdDogZnVuY3Rpb24oKQ0KCXsNCgkJaWYgKCAhU3RlYW0uc21fYkluaXRpYWxpemVkICkNCgkJCVN0ZWFtLkluaXQoKTsNCg0KCQlyZXR1cm4gU3RlYW0uc21fYlVzZXJJbk1vYmlsZUNoYXQ7DQoJfSwNCg0KCUJJc1VzZXJJblN0ZWFtTW9iaWxlQXBwOiBmdW5jdGlvbigpDQoJew0KCQlpZiAoICFTdGVhbS5zbV9iSW5pdGlhbGl6ZWQgKQ0KCQkJU3RlYW0uSW5pdCgpOw0KDQoJCXJldHVybiBTdGVhbS5zbV9iVXNlckluTW9iaWxlQXBwOw0KCX0sDQoNCglHZXRDbGllbnRQYWNrYWdlVmVyc2lvbjogZnVuY3Rpb24oKQ0KCXsNCgkJaWYgKCAhU3RlYW0uQklzVXNlckluQ2xpZW50T3JPdmVybGF5KCkgKQ0KCQkJcmV0dXJuIDA7DQoNCgkJaWYgKCB0eXBlb2YgbmF2aWdhdG9yICE9ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgKQ0KCQl7DQoJCQl2YXIgbWF0Y2hlcyA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goIC9WYWx2ZSAoPzxmYW1pbHk+U3RlYW0gKD86Q2xpZW50fEdhbWVPdmVybGF5fFRlbmZvb3R8Q2xpZW50VUl8R2FtZXBhZCg/OiBWUik/KD86XC9TdGVhbSBEZWNrKT8pKSggXFsoPzxiZXRhaWQ+W15cXV0qKVxdKT8oXC8oPzxsYXVuY2hlcj5bQS1aYS16MC05X10rKSk/XC8oPzx2ZXJzaW9uPlswLTldKikvICk7DQoJCQlpZiAoIG1hdGNoZXMgJiYgbWF0Y2hlcy5ncm91cHMgJiYgbWF0Y2hlcy5ncm91cHMudmVyc2lvbiApDQoJCQkJcmV0dXJuIG1hdGNoZXMuZ3JvdXBzLnZlcnNpb247DQoJCX0NCg0KCQlyZXR1cm4gMDsNCgl9LA0KDQoJSW5pdDogZnVuY3Rpb24oKQ0KCXsNCgkJdmFyIGZuQ2hlY2tBZ2VudCA9IGZ1bmN0aW9uKCBzdHJVQU1hdGNoLCBzdHJVUkxQYXJhbSApDQoJCXsNCgkJCWlmICggd2luZG93LmxvY2F0aW9uLmhyZWYubWF0Y2goICdbPyZdJyArIHN0clVSTFBhcmFtICsgJz0nICkgKQ0KCQkJCXJldHVybiB0cnVlOw0KDQoJCQlpZiAoIHR5cGVvZiBuYXZpZ2F0b3IgIT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIHN0clVBTWF0Y2ggKSAhPSAtMSApDQoJCQkJcmV0dXJuIHRydWU7DQoNCgkJCXJldHVybiBmYWxzZTsNCgkJfTsNCg0KCQlTdGVhbS5zbV9iVXNlckluR2FtZXBhZFVJID0gZm5DaGVja0FnZW50KCAnVmFsdmUgU3RlYW0gR2FtZXBhZCcsICdmb3JjZV90ZW5mb290X2NsaWVudF92aWV3JyApOw0KCQlTdGVhbS5zbV9iVXNlckluVGVuZm9vdEJyb3dzZXIgPSBmbkNoZWNrQWdlbnQoICdWYWx2ZSBTdGVhbSBUZW5mb290JywgJ2ZvcmNlX3RlbmZvb3RfY2xpZW50X3ZpZXcnICk7DQoJCVN0ZWFtLnNtX2JVc2VySW5HYW1lT3ZlcmxheSA9IGZuQ2hlY2tBZ2VudCggJ1ZhbHZlIFN0ZWFtIEdhbWVPdmVybGF5JywgJ2ZvcmNlX292ZXJsYXlfdmlldycgKTsNCgkJU3RlYW0uc21fYlVzZXJJbkNsaWVudCA9IFN0ZWFtLnNtX2JVc2VySW5UZW5mb290QnJvd3NlciB8fCBTdGVhbS5zbV9iVXNlckluR2FtZXBhZFVJIHx8IGZuQ2hlY2tBZ2VudCggJ1ZhbHZlIFN0ZWFtIENsaWVudCcsICdmb3JjZV9jbGllbnRfdmlldycgKTsNCgkJU3RlYW0uc21fYlVzZXJJbk1vYmlsZUNoYXQgPSBmbkNoZWNrQWdlbnQoICdWYWx2ZSBTdGVhbSBNb2JpbGUgQ2hhdCcsICdmb3JjZV9tb2JpbGVfY2hhdF92aWV3JyApOw0KCQlTdGVhbS5zbV9iVXNlckluTW9iaWxlQXBwID0gZm5DaGVja0FnZW50KCAnVmFsdmUgU3RlYW0gQXBwJywgJ2ZvcmNlX21vYmlsZV9hcHBfdmlldycgKTsNCg0KCQlTdGVhbS5zbV9iSW5pdGlhbGl6ZWQgPSB0cnVlOw0KCX0sDQoNCglMaW5rSW5OZXdXaW5kb3c6IGZ1bmN0aW9uKCAkQSApDQoJew0KCQlpZiAoIFN0ZWFtLkJJc1VzZXJJblN0ZWFtQ2xpZW50KCkgJiYgIVN0ZWFtLkJJc1VzZXJJblN0ZWFtVGVuZm9vdEJyb3dzZXIoKSApDQoJCQkkQS5hdHRyKCAnaHJlZicsICdzdGVhbTovL29wZW51cmxfZXh0ZXJuYWwvJyArICRBLmF0dHIoJ2hyZWYnKSApOw0KCQllbHNlDQoJCQkkQS5hdHRyKCAndGFyZ2V0JywgJ19ibGFuaycgKTsNCgl9DQp9Ow0KDQpmdW5jdGlvbiBPcGVuRnJpZW5kQ2hhdCggc3RlYW1pZCwgYWNjb3VudGlkICkNCnsNCglpZiAoIFN0ZWFtLkJJc1VzZXJJbkNsaWVudE9yT3ZlcmxheSgpICkNCgl7DQoJCXdpbmRvdy5sb2NhdGlvbiA9ICdzdGVhbTovL2ZyaWVuZHMvbWVzc2FnZS8nICsgc3RlYW1pZDsNCgl9DQoJZWxzZSBpZiAoIFN0ZWFtLkJJc1VzZXJJblN0ZWFtTW9iaWxlQ2hhdCgpICkNCgl7DQoJCXdpbmRvdy5sb2NhdGlvbiA9ICdzdGVhbWNoYXRtb2JpbGU6Ly9mcmllbmQvJyArIHN0ZWFtaWQ7DQoJfQ0KCWVsc2UgaWYgKCBTdGVhbS5CSXNVc2VySW5TdGVhbU1vYmlsZUFwcCgpICkNCgl7DQoJCQkJd2luZG93LmxvY2F0aW9uID0gJ2h0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL2NoYXQvZnJpZW5kLycgKyBzdGVhbWlkOw0KCX0NCgllbHNlDQoJew0KCQlPcGVuRnJpZW5kQ2hhdEluV2ViQ2hhdCggc3RlYW1pZCwgYWNjb3VudGlkICk7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBPcGVuRnJpZW5kQ2hhdEluV2ViQ2hhdCggc3RlYW1pZCwgYWNjb3VudGlkICkNCnsNCglMYXVuY2hXZWJDaGF0KCB7IGZyaWVuZDogYWNjb3VudGlkIH0sIHtjb21tYW5kOiAnU2hvd0ZyaWVuZENoYXREaWFsb2cnLCBzdGVhbWlkOiBzdGVhbWlkfSApOw0KfQ0KDQpmdW5jdGlvbiBPcGVuR3JvdXBDaGF0KCBzdGVhbWlkICkNCnsNCglpZiAoIFN0ZWFtLkJJc1VzZXJJblN0ZWFtTW9iaWxlQ2hhdCgpICkNCgl7DQoJCXdpbmRvdy5sb2NhdGlvbiA9ICdzdGVhbWNoYXRtb2JpbGU6Ly9ncm91cC8nICsgc3RlYW1pZDsNCgl9DQoJZWxzZSBpZiAoIFN0ZWFtLkJJc1VzZXJJblN0ZWFtTW9iaWxlQXBwKCkgKQ0KCXsNCgkJCQl3aW5kb3cubG9jYXRpb24gPSAnaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vY2hhdC9ncm91cC8nICsgc3RlYW1pZDsNCgl9DQoJZWxzZQ0KCXsNCgkJd2luZG93LmxvY2F0aW9uID0gJ3N0ZWFtOi8vZnJpZW5kcy9qb2luY2hhdC8nICsgc3RlYW1pZDsNCgl9DQp9DQoNCg0KLy8gcHJvdG8gZnVuY3Rpb25zIHVzZWQgdG8gYWNjZXB0IGFuIGlkIG9yIGFuIGVsZW1lbnQuDQovLyBUaGlzIGNhbiBiZSB1c2VkIHRvIG1pZ3JhdGUgdGhlbSB0byByZXR1cm5pbmcganF1ZXJ5IGluc3RlYWQgb2YgcHJvdG8td3JhcHBlZCBlbGVtZW50DQpmdW5jdGlvbiAkSkZyb21JRE9yRWxlbWVudCggZWxlbSApDQp7DQoJaWYgKCBlbGVtIGluc3RhbmNlb2YgalF1ZXJ5ICkNCgkJcmV0dXJuIGVsZW07DQoJZWxzZSBpZiAoIHR5cGVvZiBlbGVtID09ICdzdHJpbmcnICkNCgkJcmV0dXJuICRKKCcjJyArIGVsZW0ucmVwbGFjZSggL1wuLywgJ1xcLicgKSApOw0KCWVsc2UNCgkJcmV0dXJuICRKKCBlbGVtICk7DQp9DQoNCi8qKglTaG93IGEgcG9wdXAgZGlhbG9nIGxpa2UgY29uZmlybSgpLCB3aXRoIHR3byBidXR0b25zLiAgQ2xpY2tpbmcgb2sgcmVzb2x2ZXMgd2l0aCBkb25lKCksIGNhbmNlbCBvciBjbG9zaW5nIHRoZSB3aW5kb3cgcmVzb2x2ZXMgd2l0aCBmYWlsKCkNCiAqDQogKiBAcGFyYW0gc3RyVGl0bGUJCQlUaXRsZSBiYXIgdGV4dA0KICogQHBhcmFtIHN0ckRlc2NyaXB0aW9uCU1lc3NhZ2UgdGV4dA0KICogQHBhcmFtIHN0ck9LQnV0dG9uCQlUZXh0IHRvIHNob3cgb24gT0sgYnV0dG9uIChkZWZhdWx0ICJPSyIpDQogKiBAcGFyYW0gc3RyQ2FuY2VsQnV0dG9uCVRleHQgdG8gc2hvdyBvbiBDYW5jZWwgYnV0dG9uIChkZWZhdWx0ICJDYW5jZWwiKQ0KICogQHBhcmFtIHN0clNlY29uZGFyeUFjdGlvbkJ1dHRvbglBZGQgYSBzZWNvbmRhcnkgb2sgYnV0dG9uICh0aHJlZSBidXR0b25zIHRvdGFsKS4gIFJlc29sdmVzIHdpdGggZG9uZSgpIGxpa2UgT0sgYnV0IHBhc3NlcyAnU0VDT05EQVJZJyBhcyBhcmd1bWVudCB0byBoYW5kbGVyDQogKiBAcmV0dXJucyBDTW9kYWwNCiAqLw0KZnVuY3Rpb24gU2hvd0NvbmZpcm1EaWFsb2coIHN0clRpdGxlLCBzdHJEZXNjcmlwdGlvbiwgc3RyT0tCdXR0b24sIHN0ckNhbmNlbEJ1dHRvbiwgc3RyU2Vjb25kYXJ5QWN0aW9uQnV0dG9uLCByZ01vZGFsUGFyYW1zICkNCnsNCglpZiAoICFzdHJPS0J1dHRvbiApDQoJCXN0ck9LQnV0dG9uID0gJ09LJzsNCglpZiAoICFzdHJDYW5jZWxCdXR0b24gKQ0KCQlzdHJDYW5jZWxCdXR0b24gPSAnQ2FuY2VsJzsNCg0KCXZhciBkZWZlcnJlZCA9IG5ldyBqUXVlcnkuRGVmZXJyZWQoKTsNCgl2YXIgZm5PSyA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZXNvbHZlKCAnT0snICk7IH07DQoJdmFyIGZuU2Vjb25kYXJ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlc29sdmUoICdTRUNPTkRBUlknICk7IH07DQoJdmFyIGZuQ2FuY2VsID0gZnVuY3Rpb24oIGJXYXNDYW5jZWxCdXR0b24gKSB7IGRlZmVycmVkLnJlamVjdCggYldhc0NhbmNlbEJ1dHRvbiApOyB9Ow0KDQoJdmFyIHJnQnV0dG9ucyA9IFtdOw0KDQoJdmFyICRPS0J1dHRvbiA9IF9CdWlsZERpYWxvZ0J1dHRvbiggc3RyT0tCdXR0b24sIHRydWUgKTsNCgkkT0tCdXR0b24uY2xpY2soIGZuT0sgKTsNCglyZ0J1dHRvbnMucHVzaCggJE9LQnV0dG9uICk7DQoNCglpZiAoIHN0clNlY29uZGFyeUFjdGlvbkJ1dHRvbiApDQoJew0KCQl2YXIgJFNlY29uZGFyeUFjdGlvbkJ1dHRvbiA9IF9CdWlsZERpYWxvZ0J1dHRvbiggc3RyU2Vjb25kYXJ5QWN0aW9uQnV0dG9uLCBmYWxzZSwge3N0ckNsYXNzTmFtZTogJ2J0bl9ibHVlX3N0ZWFtdWkgYnRuX21lZGl1bScgfSApOw0KCQkkU2Vjb25kYXJ5QWN0aW9uQnV0dG9uLmNsaWNrKCBmblNlY29uZGFyeSApOw0KCQlyZ0J1dHRvbnMucHVzaCggJFNlY29uZGFyeUFjdGlvbkJ1dHRvbiApOw0KCX0NCg0KCXZhciAkQ2FuY2VsQnV0dG9uID0gX0J1aWxkRGlhbG9nQnV0dG9uKCBzdHJDYW5jZWxCdXR0b24gKTsNCgkkQ2FuY2VsQnV0dG9uLmNsaWNrKCBmdW5jdGlvbigpIHsgZm5DYW5jZWwoIHRydWUgKTsgfSApOw0KCXJnQnV0dG9ucy5wdXNoKCAkQ2FuY2VsQnV0dG9uICk7DQoNCgl2YXIgTW9kYWwgPSBfQnVpbGREaWFsb2coIHN0clRpdGxlLCBzdHJEZXNjcmlwdGlvbiwgcmdCdXR0b25zLCBmbkNhbmNlbCwgcmdNb2RhbFBhcmFtcyApOw0KCU1vZGFsLlNob3coKTsNCg0KCV9CaW5kT25FbnRlcktleVByZXNzRm9yRGlhbG9nKCBNb2RhbCwgZGVmZXJyZWQsIGZuT0sgKTsNCg0KCWRlZmVycmVkLmFsd2F5cyggZnVuY3Rpb24oKSB7IE1vZGFsLkRpc21pc3MoKTsgfSApOw0KCS8vIGF0dGFjaCB0aGUgZGVmZXJyZWQncyBldmVudHMgdG8gdGhlIG1vZGFsDQoJZGVmZXJyZWQucHJvbWlzZSggTW9kYWwgKTsNCg0KCXJldHVybiBNb2RhbDsNCn0NCg0KLyoqCVNob3cgYSBkaWFsb2cgd2l0aCBhIHNpbmdsZSBidXR0b24sIGxpa2UgYWxlcnQoKS4gIEJ1dHRvbiBjbGljayBvciBjbG9zaW5nIHRoZSBtb2RhbCByZXNvbHZlIGRlZmVycmVkIHdpdGggZG9uZSgpLg0KICoNCiAqIEBwYXJhbSBzdHJUaXRsZQkJCVRpdGxlIGJhciB0ZXh0DQogKiBAcGFyYW0gc3RyRGVzY3JpcHRpb24JTWVzc2FnZSB0ZXh0DQogKiBAcGFyYW0gc3RyT0tCdXR0b24JCVRleHQgb24gdGhlIE9LIGJ1dHRvbiAoIk9LIiBieSBkZWZhdWx0KQ0KICogQHJldHVybnMgQ01vZGFsDQogKi8NCmZ1bmN0aW9uIFNob3dBbGVydERpYWxvZyggc3RyVGl0bGUsIHN0ckRlc2NyaXB0aW9uLCBzdHJPS0J1dHRvbiwgcmdNb2RhbFBhcmFtcyApDQp7DQoJaWYgKCAhc3RyT0tCdXR0b24gKQ0KCQlzdHJPS0J1dHRvbiA9ICdPSyc7DQoNCgl2YXIgZGVmZXJyZWQgPSBuZXcgalF1ZXJ5LkRlZmVycmVkKCk7DQoJdmFyIGZuT0sgPSBmdW5jdGlvbiggYldhc0NhbmNlbEJ1dHRvbiApIHsgZGVmZXJyZWQucmVzb2x2ZSggYldhc0NhbmNlbEJ1dHRvbiApOyB9Ow0KDQoJdmFyICRPS0J1dHRvbiA9IF9CdWlsZERpYWxvZ0J1dHRvbiggc3RyT0tCdXR0b24gKTsNCgkkT0tCdXR0b24uY2xpY2soIGZ1bmN0aW9uKCkgeyBmbk9LKCB0cnVlICk7IH0gKTsNCg0KCXZhciBNb2RhbCA9IF9CdWlsZERpYWxvZyggc3RyVGl0bGUsIHN0ckRlc2NyaXB0aW9uLCBbICRPS0J1dHRvbiBdLCBmbk9LLCByZ01vZGFsUGFyYW1zICk7DQoJZGVmZXJyZWQuYWx3YXlzKCBmdW5jdGlvbigpIHsgTW9kYWwuRGlzbWlzcygpOyB9ICk7DQoJTW9kYWwuU2hvdygpOw0KDQoJX0JpbmRPbkVudGVyS2V5UHJlc3NGb3JEaWFsb2coIE1vZGFsLCBkZWZlcnJlZCwgZm5PSyApOw0KDQoJLy8gYXR0YWNoIHRoZSBkZWZlcnJlZCdzIGV2ZW50cyB0byB0aGUgbW9kYWwNCglkZWZlcnJlZC5wcm9taXNlKCBNb2RhbCApOw0KDQoJcmV0dXJuIE1vZGFsOw0KDQp9DQoNCi8qKglTaG93IGEgcG9wdXAgZGlhbG9nLiAgSGFzIG5vIGJ1dHRvbnMuICBDbG9zaW5nIHRoZSBkaWFsb2cgcmVzb2x2ZXMgZGVmZXJyZWQgd2l0aCBkb25lKCkuDQogKg0KICogQHBhcmFtIHN0clRpdGxlCQkJVGl0bGUgYmFyIHRleHQNCiAqIEBwYXJhbSBzdHJEZXNjcmlwdGlvbglNZXNzYWdlIHRleHQNCiAqIEBwYXJhbSByZ01vZGFsUGFyYW1zCQlTZWUgQ01vZGFsDQogKiBAcmV0dXJucyBDTW9kYWwNCiAqLw0KZnVuY3Rpb24gU2hvd0RpYWxvZyggc3RyVGl0bGUsIHN0ckRlc2NyaXB0aW9uLCByZ01vZGFsUGFyYW1zICkNCnsNCgl2YXIgZGVmZXJyZWQgPSBuZXcgalF1ZXJ5LkRlZmVycmVkKCk7DQoJdmFyIGZuT0sgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZSgpOyB9Ow0KDQoJdmFyIE1vZGFsID0gX0J1aWxkRGlhbG9nKCBzdHJUaXRsZSwgc3RyRGVzY3JpcHRpb24sIFtdLCBmbk9LLCByZ01vZGFsUGFyYW1zICk7DQoJZGVmZXJyZWQuYWx3YXlzKCBmdW5jdGlvbigpIHsgTW9kYWwuRGlzbWlzcygpOyB9ICk7DQoJTW9kYWwuU2hvdygpOw0KDQoJLy8gYXR0YWNoIHRoZSBkZWZlcnJlZCdzIGV2ZW50cyB0byB0aGUgbW9kYWwNCglkZWZlcnJlZC5wcm9taXNlKCBNb2RhbCApOw0KDQoJcmV0dXJuIE1vZGFsOw0KfQ0KDQovKioNCiAqIFNob3cgYSBkaWFsb2csIGJ1dCB0YWtlIHRoZSBhcmd1bWVudHMgYXMgYW4gb2JqZWN0IGEgbGEgUmVhY3QuDQogKiBAcmV0dXJucyBDTW9kYWwNCiAqLw0KZnVuY3Rpb24gU2hvd1Byb21wdERpYWxvZ1dpdGhQcm9wcyggcmdQYXJhbXMgKQ0Kew0KCWxldCB7IHN0ck9LQnV0dG9uLCBzdHJDYW5jZWxCdXR0b24sIHN0clRpdGxlLCBzdHJEZXNjcmlwdGlvbiwgZGVmYXVsdFZhbHVlLCBpbnB1dFR5cGUsIGlucHV0TWF4U2l6ZSwgYk5vUHJvbWlzZURpc21pc3MsIGJJbnB1dFJlYWRPbmx5IH0gPSByZ1BhcmFtczsNCglpZiAoICFzdHJPS0J1dHRvbiApDQoJCXN0ck9LQnV0dG9uID0gJ09LJzsNCglpZiAoICFzdHJDYW5jZWxCdXR0b24gKQ0KCQlzdHJDYW5jZWxCdXR0b24gPSAnQ2FuY2VsJzsNCglpZiAoICFpbnB1dFR5cGUgKQ0KCQlpbnB1dFR5cGUgPSAndGV4dCc7DQoNCgl2YXIgJEJvZHkgPSAkSignPGZvcm0vPicpOw0KCXZhciAkSW5wdXQgPSAkSignPGlucHV0Lz4nLCB7dHlwZTogaW5wdXRUeXBlLCAnY2xhc3MnOiAnJyB9ICkudmFsKCBkZWZhdWx0VmFsdWUgKTsNCglpZiAoIGlucHV0TWF4U2l6ZSApDQoJew0KCQkkSW5wdXQuYXR0ciggJ21heGxlbmd0aCcsIGlucHV0TWF4U2l6ZSApOw0KCX0NCglpZiAoIGJJbnB1dFJlYWRPbmx5ICkNCgl7DQoJCSRJbnB1dC5hdHRyKCAncmVhZG9ubHknLCB0cnVlICk7DQoJfQ0KCSRCb2R5LmFwcGVuZCggJEooJzxkaXYvPicsIHsnY2xhc3MnOiAnbmV3bW9kYWxfcHJvbXB0X2Rlc2NyaXB0aW9uJyB9ICkuYXBwZW5kKCBzdHJEZXNjcmlwdGlvbiApICk7DQoJJEJvZHkuYXBwZW5kKCAkSignPGRpdi8+JywgeydjbGFzcyc6ICduZXdtb2RhbF9wcm9tcHRfaW5wdXQgZ3JheV9iZXZlbCBmb3JfdGV4dF9pbnB1dCBmdWxsd2lkdGgnIH0gKS5hcHBlbmQoICRJbnB1dCApICk7DQoNCgl2YXIgZGVmZXJyZWQgPSBuZXcgalF1ZXJ5LkRlZmVycmVkKCk7DQoJdmFyIGZuT0sgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZSggJElucHV0LnZhbCgpICk7IH07DQoJdmFyIGZuQ2FuY2VsID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlamVjdCgpOyB9Ow0KDQoJJEJvZHkuc3VibWl0KCBmdW5jdGlvbiggZXZlbnQgKSB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGZuT0soKTsgfSApOw0KDQoJdmFyIGVsQnV0dG9uTGFiZWwgPSAkSiggJzxzcGFuLz4nICkudGV4dCggc3RyT0tCdXR0b24gKTsNCgl2YXIgJE9LQnV0dG9uID0gJEooJzxidXR0b24vPicsIHt0eXBlOiAnc3VibWl0JywgJ2NsYXNzJzogJ2J0bl9ncmVlbl93aGl0ZV9pbm5lcmZhZGUgYnRuX21lZGl1bScgfSApLmFwcGVuZCggZWxCdXR0b25MYWJlbCApOw0KCSRPS0J1dHRvbi5jbGljayggZm5PSyApOw0KCXZhciAkQ2FuY2VsQnV0dG9uID0gX0J1aWxkRGlhbG9nQnV0dG9uKCBzdHJDYW5jZWxCdXR0b24gKTsNCgkkQ2FuY2VsQnV0dG9uLmNsaWNrKCBmbkNhbmNlbCApOw0KDQoJdmFyIE1vZGFsID0gX0J1aWxkRGlhbG9nKCBzdHJUaXRsZSwgJEJvZHksIFsgJE9LQnV0dG9uLCAkQ2FuY2VsQnV0dG9uIF0sIGZuQ2FuY2VsLCByZ1BhcmFtcyApOw0KCWlmKCAhYk5vUHJvbWlzZURpc21pc3MgKQ0KCQlkZWZlcnJlZC5hbHdheXMoIGZ1bmN0aW9uKCkgeyBNb2RhbC5EaXNtaXNzKCk7IH0gKTsNCg0KCU1vZGFsLlNob3coKTsNCg0KCSRJbnB1dC5mb2N1cygpOw0KDQoJLy8gYXR0YWNoIHRoZSBkZWZlcnJlZCdzIGV2ZW50cyB0byB0aGUgbW9kYWwNCglkZWZlcnJlZC5wcm9taXNlKCBNb2RhbCApOw0KDQoJcmV0dXJuIE1vZGFsOw0KfQ0KDQovKioNCiAqIEEgd3JhcHBlciBhcm91bmQgU2hvd0RpYWxvZ1Byb21wdCB0byBiZSBjb21wYXRpYmxlIHdpdGggZXhpc3RpbmcgY29kZS4gUHJlZmVyIFNob3dQcm9tcHREaWFsb2dXaXRoUHJvcHMgaW5zdGVhZC4NCiAqIEByZXR1cm5zIENNb2RhbA0KICovDQpmdW5jdGlvbiBTaG93UHJvbXB0RGlhbG9nKCBzdHJUaXRsZSwgc3RyRGVzY3JpcHRpb24sIHN0ck9LQnV0dG9uLCBzdHJDYW5jZWxCdXR0b24sIHJnTW9kYWxQYXJhbXMsIGRlZmF1bHRWYWx1ZSApDQp7DQoJbGV0IHJnUGFyYW1zID0ge307DQoJaWYgKCByZ01vZGFsUGFyYW1zICkNCgkJT2JqZWN0LmFzc2lnbiggcmdQYXJhbXMsIHJnTW9kYWxQYXJhbXMgKTsNCglyZ1BhcmFtcy5zdHJUaXRsZSA9IHN0clRpdGxlOw0KCXJnUGFyYW1zLnN0ckRlc2NyaXB0aW9uID0gc3RyRGVzY3JpcHRpb247DQoJcmdQYXJhbXMuc3RyT0tCdXR0b24gPSBzdHJPS0J1dHRvbjsNCglyZ1BhcmFtcy5zdHJDYW5jZWxCdXR0b24gPSBzdHJDYW5jZWxCdXR0b247DQoJcmdQYXJhbXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOw0KCXJldHVybiBTaG93UHJvbXB0RGlhbG9nV2l0aFByb3BzKCByZ1BhcmFtcyApOw0KfQ0KDQovKioNCiAqIEByZXR1cm5zIENNb2RhbA0KICovDQpmdW5jdGlvbiBTaG93UHJvbXB0V2l0aFRleHRBcmVhRGlhbG9nKCBzdHJUaXRsZSwgc3RySW5pdGlhbFRleHQsIHN0ck9LQnV0dG9uLCBzdHJDYW5jZWxCdXR0b24sIHRleHRBcmVhTWF4TGVuZ3RoLCBzdHJEZXNjcmlwdGlvbiApDQp7DQoJaWYgKCAhc3RyT0tCdXR0b24gKQ0KCQlzdHJPS0J1dHRvbiA9ICdPSyc7DQoJaWYgKCAhc3RyQ2FuY2VsQnV0dG9uICkNCgkJc3RyQ2FuY2VsQnV0dG9uID0gJ0NhbmNlbCc7DQoNCgl2YXIgJEJvZHkgPSAkSignPGZvcm0vPicpOw0KCXZhciAkVGV4dEFyZWEgPSAkSignPHRleHRhcmVhLz4nLCB7ICdjbGFzcyc6ICduZXdtb2RhbF9wcm9tcHRfdGV4dGFyZWEnIH0gKTsNCgkkVGV4dEFyZWEudGV4dCggc3RySW5pdGlhbFRleHQgKTsNCglpZiAoIHRleHRBcmVhTWF4TGVuZ3RoICkNCgl7DQoJCSRUZXh0QXJlYS5hdHRyKCAnbWF4bGVuZ3RoJywgdGV4dEFyZWFNYXhMZW5ndGggKTsNCgkJJFRleHRBcmVhLmJpbmQoICJrZXl1cCBjaGFuZ2UiLA0KCQkJZnVuY3Rpb24oKQ0KCQkJew0KCQkJCXZhciBzdHIgPSAkSih0aGlzKS52YWwoKTsNCgkJCQl2YXIgbXggPSBwYXJzZUludCgkSih0aGlzKS5hdHRyKCdtYXhsZW5ndGgnKSk7DQoJCQkJaWYgKHN0ci5sZW5ndGggPiBteCkNCgkJCQl7DQoJCQkJCSRKKHRoaXMpLnZhbChzdHIuc3Vic3RyKDAsIG14KSk7DQoJCQkJCXJldHVybiBmYWxzZTsNCgkJCQl9DQoJCQl9DQoJCSk7DQoJfQ0KDQoJaWYgKCBzdHJEZXNjcmlwdGlvbiApDQoJew0KCQkkQm9keS5hcHBlbmQoICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ25ld21vZGFsX3Byb21wdF93aXRoX3RleHRhcmVhIG5ld21vZGFsX3Byb21wdF9kZXNjcmlwdGlvbicgfSApLnRleHQoIHN0ckRlc2NyaXB0aW9uICkgKTsNCgl9DQoNCgkkQm9keS5hcHBlbmQoICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ25ld21vZGFsX3Byb21wdF93aXRoX3RleHRhcmVhIGdyYXlfYmV2ZWwgZnVsbHdpZHRoJyB9ICkuYXBwZW5kKCAkVGV4dEFyZWEgKSApOw0KDQoJdmFyIGRlZmVycmVkID0gbmV3IGpRdWVyeS5EZWZlcnJlZCgpOw0KCXZhciBmbk9LID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlc29sdmUoICRUZXh0QXJlYS52YWwoKSApOyB9Ow0KCXZhciBmbkNhbmNlbCA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZWplY3QoKTsgfTsNCg0KCSRCb2R5LnN1Ym1pdCggZnVuY3Rpb24oIGV2ZW50ICkgeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBmbk9LKCk7IH0gKTsNCg0KCXZhciBlbEJ1dHRvbkxhYmVsID0gJEooICc8c3Bhbi8+JyApLnRleHQoIHN0ck9LQnV0dG9uICk7DQoJdmFyICRPS0J1dHRvbiA9ICRKKCc8YnV0dG9uLz4nLCB7dHlwZTogJ3N1Ym1pdCcsICdjbGFzcyc6ICdidG5fZ3JlZW5fd2hpdGVfaW5uZXJmYWRlIGJ0bl9tZWRpdW0nIH0gKS5hcHBlbmQoIGVsQnV0dG9uTGFiZWwgKTsNCgkkT0tCdXR0b24uY2xpY2soIGZuT0sgKTsNCgl2YXIgJENhbmNlbEJ1dHRvbiA9IF9CdWlsZERpYWxvZ0J1dHRvbiggc3RyQ2FuY2VsQnV0dG9uICk7DQoJJENhbmNlbEJ1dHRvbi5jbGljayggZm5DYW5jZWwgKTsNCg0KCXZhciBNb2RhbCA9IF9CdWlsZERpYWxvZyggc3RyVGl0bGUsICRCb2R5LCBbICRPS0J1dHRvbiwgJENhbmNlbEJ1dHRvbiBdLCBmbkNhbmNlbCApOw0KCWRlZmVycmVkLmFsd2F5cyggZnVuY3Rpb24oKSB7IE1vZGFsLkRpc21pc3MoKTsgfSApOw0KCU1vZGFsLlNob3coKTsNCg0KCSRUZXh0QXJlYS5mb2N1cygpOw0KDQoJLy8gYXR0YWNoIHRoZSBkZWZlcnJlZCdzIGV2ZW50cyB0byB0aGUgbW9kYWwNCglkZWZlcnJlZC5wcm9taXNlKCBNb2RhbCApOw0KDQoJcmV0dXJuIE1vZGFsOw0KfQ0KDQovKioNCiAqIEByZXR1cm5zIENNb2RhbA0KICovDQpmdW5jdGlvbiBTaG93RWRpdGFibGVQcm9tcHQoIHN0clRpdGxlLCBvYmosIG9uT2ssIG9uQ2FuY2VsKQ0Kew0KCXN0ckVkaXRCdXR0b24gPSAnRWRpdCc7DQoJc3RyT0tCdXR0b24gPSAnT0snOw0KCXN0ckNhbmNlbEJ1dHRvbiA9ICdDYW5jZWwnOw0KDQoJdmFyICRCb2R5ID0gJEooJzxmb3JtLz4nKTsNCgl2YXIgJFRleHRBcmVhID0gJEooJzx0ZXh0YXJlYS8+JywgeydjbGFzcyc6ICduZXdtb2RhbF9wcm9tcHRfdGV4dGFyZWEnLCAnaWQnOiAnanNvbl93aW5kb3cnfSk7DQoJJFRleHRBcmVhWzBdLnJlYWRPbmx5ID0gdHJ1ZTsNCgkkVGV4dEFyZWEudGV4dCggSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKSApOw0KCSRCb2R5LmFwcGVuZCggJEooJzxkaXYvPicsIHsnY2xhc3MnOiAnbmV3bW9kYWxfcHJvbXB0X3dpdGhfdGV4dGFyZWEgZ3JheV9iZXZlbCBmdWxsd2lkdGggJyB9ICkuYXBwZW5kKCAkVGV4dEFyZWEgKSApOw0KDQoJJEJvZHkuc3VibWl0KCBmdW5jdGlvbiggZXZlbnQgKSB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGZuT0soKTsgfSApOw0KDQoJdmFyIGVsQnV0dG9uTGFiZWwgPSAkSiggJzxzcGFuLz4nICkudGV4dCggc3RyT0tCdXR0b24gKTsNCgl2YXIgZGVmZXJyZWRBY3Rpb24gPSBuZXcgalF1ZXJ5LkRlZmVycmVkKCk7DQoNCgl2YXIgZWRpdEJ1dHRvbkxhYmVsID0gJEooICc8c3Bhbi8+JyApLnRleHQoIHN0ckVkaXRCdXR0b24gKTsNCgl2YXIgJEVkaXRCdXR0b24gPSAkSignPGJ1dHRvbi8+Jywge3R5cGU6ICdidXR0b24nLCAnY2xhc3MnOiAnYnRuX2RhcmtyZWRfd2hpdGVfaW5uZXJmYWRlIGJ0bl9tZWRpdW0nIH0gKS5hcHBlbmQoIGVkaXRCdXR0b25MYWJlbCApOw0KCSRFZGl0QnV0dG9uLmNsaWNrKCBmdW5jdGlvbigpIHsNCgkJJEVkaXRCdXR0b25bMF0uZGlzYWJsZSgpOw0KCQkkT0tCdXR0b25bMF0uZW5hYmxlKCk7DQoJCSRUZXh0QXJlYVswXS5yZWFkT25seSA9IGZhbHNlOw0KCQkkVGV4dEFyZWEuZm9jdXMoKTsNCgl9KQ0KDQoJdmFyICRPS0J1dHRvbiA9ICRKKCc8YnV0dG9uLz4nLCB7dHlwZTogJ3N1Ym1pdCcsICdjbGFzcyc6ICdidG5fZ3JlZW5fd2hpdGVfaW5uZXJmYWRlIGJ0bl9tZWRpdW0nIH0gKS5hcHBlbmQoIGVsQnV0dG9uTGFiZWwgKTsNCgkkT0tCdXR0b24uY2xpY2soIGZ1bmN0aW9uKCkgeyBkZWZlcnJlZEFjdGlvbi5yZXNvbHZlKCAkVGV4dEFyZWEudmFsKCkgKTsgfSApOw0KCSRPS0J1dHRvblswXS5kaXNhYmxlZCA9IHRydWU7DQoNCglmbkNhbmNlbCA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZEFjdGlvbi5yZWplY3QoKTsgfTsNCgl2YXIgJENhbmNlbEJ1dHRvbiA9IF9CdWlsZERpYWxvZ0J1dHRvbiggc3RyQ2FuY2VsQnV0dG9uICk7DQoJJENhbmNlbEJ1dHRvbi5jbGljayggZm5DYW5jZWwgKTsNCg0KCXZhciBNb2RhbCA9IF9CdWlsZERpYWxvZyggc3RyVGl0bGUsICRCb2R5LCBbICRFZGl0QnV0dG9uLCAkT0tCdXR0b24sICRDYW5jZWxCdXR0b24gXSwgZm5DYW5jZWwgKTsNCglkZWZlcnJlZEFjdGlvbi5hbHdheXMoIGZ1bmN0aW9uKCkgeyBNb2RhbC5EaXNtaXNzKCk7IH0gKTsNCg0KCWlmIChvbk9rKQ0KCQlkZWZlcnJlZEFjdGlvbi5kb25lKG9uT2spOw0KCWlmIChvbkNhbmNlbCkNCgkJZGVmZXJyZWRBY3Rpb24uZmFpbChvbkNhbmNlbCk7DQoNCglNb2RhbC5TaG93KCk7DQoNCgkkVGV4dEFyZWEuZm9jdXMoKTsNCg0KCS8vIGF0dGFjaCB0aGUgZGVmZXJyZWQncyBldmVudHMgdG8gdGhlIG1vZGFsDQoJZGVmZXJyZWRBY3Rpb24ucHJvbWlzZSggTW9kYWwgKTsNCg0KCXJldHVybiBNb2RhbDsNCn0NCg0KLyoqDQogKiBAcmV0dXJucyBDTW9kYWwNCiAqLw0KZnVuY3Rpb24gU2hvd0Jsb2NraW5nV2FpdERpYWxvZyggc3RyVGl0bGUsIHN0ckRlc2NyaXB0aW9uICkNCnsNCgl2YXIgZGVmZXJyZWQgPSBuZXcgalF1ZXJ5LkRlZmVycmVkKCk7DQoJdmFyIGZuT0sgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZSgpOyB9Ow0KDQoJdmFyIGNvbnRhaW5lciA9ICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ3dhaXRpbmdfZGlhbG9nX2NvbnRhaW5lcid9ICk7DQoJdmFyIHRocm9iYmVyID0gJEooJzxkaXYvPicsIHsnY2xhc3MnOiAnd2FpdGluZ19kaWFsb2dfdGhyb2JiZXInfSApOw0KCWNvbnRhaW5lci5hcHBlbmQoIHRocm9iYmVyICk7DQoJY29udGFpbmVyLmFwcGVuZCggc3RyRGVzY3JpcHRpb24gKTsNCglpZiAoICFzdHJEZXNjcmlwdGlvbiApDQoJew0KCQljb250YWluZXIuYWRkQ2xhc3MoICd3YWl0aW5nX2RpYWxvZ19jZW50ZXJlZCcgKTsNCgl9DQoNCgl2YXIgTW9kYWwgPSBfQnVpbGREaWFsb2coIHN0clRpdGxlLCBjb250YWluZXIsIFtdLCBmbk9LLCB7IGJFeHBsaWNpdERpc21pc3NhbE9ubHk6IHRydWUgfSApOw0KCWRlZmVycmVkLmFsd2F5cyggZnVuY3Rpb24oKSB7IE1vZGFsLkRpc21pc3MoKTsgfSApOw0KCU1vZGFsLlNob3coKTsNCg0KCS8vIGF0dGFjaCB0aGUgZGVmZXJyZWQncyBldmVudHMgdG8gdGhlIG1vZGFsDQoJZGVmZXJyZWQucHJvbWlzZSggTW9kYWwgKTsNCg0KCXJldHVybiBNb2RhbDsNCn0NCg0KZnVuY3Rpb24gX0JpbmRPbkVudGVyS2V5UHJlc3NGb3JEaWFsb2coIE1vZGFsLCBkZWZlcnJlZCwgZm5PbkVudGVyICkNCnsNCgl2YXIgZm5PbktleVVwID0gZnVuY3Rpb24oIGV2ZW50ICkgew0KCQlpZiAoIE1vZGFsLkJJc0FjdGl2ZU1vZGFsKCkgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICYmIGV2ZW50LndoaWNoID09IDEzICYmICggIWV2ZW50LnRhcmdldCB8fCBldmVudC50YXJnZXQubm9kZU5hbWUgIT0gJ1RFWFRBUkVBJyApICkNCgkJCWZuT25FbnRlcigpOw0KCX07DQoJJEooZG9jdW1lbnQpLm9uKCAna2V5dXAuU2hhcmVkQ29uZmlybURpYWxvZycsIGZuT25LZXlVcCApOw0KCWRlZmVycmVkLmFsd2F5cyggZnVuY3Rpb24oKSB7ICRKKGRvY3VtZW50KS5vZmYoICdrZXl1cC5TaGFyZWRDb25maXJtRGlhbG9nJyApOyB9ICk7DQp9DQoNCi8qKg0KICogQHJldHVybnMgQ01vZGFsDQogKiBAcHJpdmF0ZQ0KICovDQpmdW5jdGlvbiBfQnVpbGREaWFsb2coIHN0clRpdGxlLCBzdHJEZXNjcmlwdGlvbiwgcmdCdXR0b25zLCBmbk9uQ2FuY2VsLCByZ01vZGFsUGFyYW1zICkNCnsNCgl2YXIgJERpYWxvZyA9ICRKKCc8ZGlhbG9nLz4nLCB7J2NsYXNzJzogJ25ld21vZGFsJ30gKTsNCgl2YXIgJENsb3NlQnV0dG9uID0gJEooJzxkaXYvPicsIHsnY2xhc3MnOiAnbmV3bW9kYWxfY2xvc2UnLCAnZGF0YS1wYW5lbCc6ICd7ImZvY3VzYWJsZSI6dHJ1ZSwiY2xpY2tPbkFjdGl2YXRlIjp0cnVlfScgfSApOw0KCXZhciAkSGVhZGVyID0gKCAkSignPGRpdi8+JywgeydjbGFzcyc6ICduZXdtb2RhbF9oZWFkZXInIH0pICk7DQoJdmFyICRUb3BCYXIgPSAoICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ21vZGFsX3RvcF9iYXInIH0pICk7DQoJaWYgKCBzdHJUaXRsZSApDQoJCSRIZWFkZXIuYXBwZW5kKCAkQ2xvc2VCdXR0b24gKS5hcHBlbmQoICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ3RpdGxlX3RleHQnIH0gKS50ZXh0KCBzdHJUaXRsZSApICk7DQogICAgaWYgKCByZ01vZGFsUGFyYW1zICYmIHJnTW9kYWxQYXJhbXMuc3RyU3ViVGl0bGUgKSB7DQogICAgICAgIHZhciAkU3ViVGl0bGUgPSAocmdNb2RhbFBhcmFtcy5zdHJTdWJUaXRsZSk7DQogICAgICAgICRIZWFkZXIuYXBwZW5kKCAkSignPGRpdi8+JywgeydjbGFzcyc6ICdzdWJ0aXRsZV90ZXh0JyB9ICkudGV4dCggJFN1YlRpdGxlICkgKQ0KICAgIH0NCgkkSGVhZGVyID0gJEooJzxkaXYvPicsIHsnY2xhc3MnOiAnbmV3bW9kYWxfaGVhZGVyX2JvcmRlcid9KS5hcHBlbmQoICRIZWFkZXIgKTsNCgkkRGlhbG9nLmFwcGVuZCggJFRvcEJhciApLmFwcGVuZCggJEhlYWRlciApOw0KCXZhciAkQ29udGVudCA9ICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ25ld21vZGFsX2NvbnRlbnQnIH0gKTsNCgkkQ29udGVudC5hcHBlbmQoICRKKCc8ZGl2Lz4nKS5hcHBlbmQoIHN0ckRlc2NyaXB0aW9uICkgKTsNCg0KCWlmICggcmdCdXR0b25zLmxlbmd0aCA+IDAgKQ0KCXsNCgkJdmFyICRCdXR0b25zID0gJEooJzxkaXYvPicsIHsnY2xhc3MnOiAnbmV3bW9kYWxfYnV0dG9ucycsICdkYXRhLXBhbmVsJzogJ3siZmxvdy1jaGlsZHJlbiI6InJvdyJ9JyB9ICk7DQoJCSRDb250ZW50LmFwcGVuZCggJEJ1dHRvbnMgKTsNCgkJZm9yKCB2YXIgaSA9IDA7IGkgPCByZ0J1dHRvbnMubGVuZ3RoOyBpKysgKQ0KCQl7DQoJCQl2YXIgJEJ1dHRvbiA9IHJnQnV0dG9uc1tpXTsNCgkJCWlmICggaSA9PSAwICkNCgkJCQkkQnV0dG9uLmF0dHIoICdkYXRhLXBhbmVsJywgJ3siYXV0b0ZvY3VzIjp0cnVlLCJmb2N1c2FibGUiOnRydWUsImNsaWNrT25BY3RpdmF0ZSI6dHJ1ZX0nICk7DQoJCQllbHNlDQoJCQkJJEJ1dHRvbi5hdHRyKCAnZGF0YS1wYW5lbCcsICd7ImZvY3VzYWJsZSI6dHJ1ZSwiY2xpY2tPbkFjdGl2YXRlIjp0cnVlfScgKTsNCgkJCSRCdXR0b25zLmFwcGVuZCggJEJ1dHRvbiApOw0KCQl9DQoJfQ0KDQoJJERpYWxvZy5hcHBlbmQoICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ25ld21vZGFsX2NvbnRlbnRfYm9yZGVyJyB9ICkuYXBwZW5kKCAkQ29udGVudCApICk7DQoNCglpZiAoIHJnTW9kYWxQYXJhbXMgJiYgcmdNb2RhbFBhcmFtcy5iRXhwbGljaXREaXNtaXNzYWxPbmx5ICkNCgkJJENsb3NlQnV0dG9uLmhpZGUoKTsNCg0KCXZhciBNb2RhbCA9IG5ldyBDTW9kYWwoICREaWFsb2csIHJnTW9kYWxQYXJhbXMgKTsNCglpZiAoIGZuT25DYW5jZWwgKQ0KCXsNCgkJTW9kYWwuT25EaXNtaXNzKCBmbk9uQ2FuY2VsICk7DQoJCSRDbG9zZUJ1dHRvbi5jbGljayggZnVuY3Rpb24oKSB7IE1vZGFsLkRpc21pc3MoKTsgfSApOw0KCX0NCg0KCS8vIG9uIHJlc3BvbnNpdmUgcGFnZXMsIHRoZSAnbmV3bW9kYWwnIGVsZW1lbnQgY292ZXJzIHRoZSB3aG9sZSB2aWV3YWJsZSBhcmVhIChzbyB0aGF0IHdlIGNhbiBjb250cm9sIHNjcm9sbGluZw0KCS8vIGlmIHRoZSBtb2RhbCBpcyB2ZXJ5IHRhbGwpLiAgSWYgdGhlIG1vZGFsIGRvZXNuJ3QgY292ZXIgdGhlIHdob2xlIGFyZWEsIHdlIGRpc21pc3Mgb24gY2xpY2tzIHRvIHRoaXMgYmFja2dyb3VuZA0KCS8vCWFyZWENCglpZiAoIE1vZGFsLm1fZm5CYWNrZ3JvdW5kQ2xpY2sgKQ0KCXsNCgkJJERpYWxvZy5jbGljayggZnVuY3Rpb24oZSkgeyBpZiAoIGUudGFyZ2V0ID09IHRoaXMgKSBNb2RhbC5tX2ZuQmFja2dyb3VuZENsaWNrKCk7IH0gKTsNCgl9DQoNCglNb2RhbC5TZXRSZW1vdmVDb250ZW50T25EaXNtaXNzYWwoIHRydWUgKTsNCg0KCXJldHVybiBNb2RhbDsNCn0NCg0KZnVuY3Rpb24gX0J1aWxkRGlhbG9nQnV0dG9uKCBzdHJUZXh0LCBiQWN0aXZlLCByZ09wdGlvbnMgKQ0Kew0KCWlmICggIXJnT3B0aW9ucyApDQoJCXJnT3B0aW9ucyA9IHt9Ow0KDQoJdmFyIHN0ckNsYXNzTmFtZSA9IGJBY3RpdmUgPyAnYnRuX2dyZWVuX3N0ZWFtdWkgYnRuX21lZGl1bScgOiAnYnRuX2dyZXlfc3RlYW11aSBidG5fbWVkaXVtJzsNCglpZiAoIHJnT3B0aW9ucy5zdHJDbGFzc05hbWUgKQ0KCQlzdHJDbGFzc05hbWUgPSByZ09wdGlvbnMuc3RyQ2xhc3NOYW1lOw0KDQoJdmFyIGVsQnV0dG9uTGFiZWwgPSAkSiggJzxzcGFuLz4nICkuaHRtbCggc3RyVGV4dCApOw0KCXZhciBlbEJ1dHRvbiA9ICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogc3RyQ2xhc3NOYW1lIH0gKS5hcHBlbmQoIGVsQnV0dG9uTGFiZWwgKTsNCglyZXR1cm4gZWxCdXR0b247DQp9DQoNCi8qKglJbXBsZW1lbnRlZCBmb3IgR2FtZXBhZDogc2hvdyBjb250ZW50IGluIGEgZnVsbHNjcmVlbiwgYm9yZGVybGVzcywgbW9kYWwgd2hpY2ggZ2V0cyBuYXZpZ2F0aW9uIHN1cHBvcnQuDQogKiAgVXNlZCBvbiB0aGUgYXBwIGRldGFpbHMgcGFnZSB0byBzaG93IHNjcmVlbnNob3RzIGluIGZ1bGwgc2NyZWVuLg0KICogIENsb3NpbmcgdGhlIGRpYWxvZyByZXNvbHZlcyBkZWZlcnJlZCB3aXRoIGRvbmUoKS4NCiAqDQogKiBAcmV0dXJucyBDTW9kYWwNCiAqLw0KZnVuY3Rpb24gR1BTaG93RnVsbFNjcmVlbk1vZGFsKCBjb250ZW50ICkNCnsNCgl2YXIgZGVmZXJyZWQgPSBuZXcgalF1ZXJ5LkRlZmVycmVkKCk7DQoJdmFyIGZuT0sgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZSgpOyB9Ow0KDQoJdmFyIE1vZGFsID0gX0J1aWxHUEZ1bGxTY3JlZW5Nb2RhbCggY29udGVudCwgZm5PSyApOw0KCWRlZmVycmVkLmFsd2F5cyggZnVuY3Rpb24oKSB7IE1vZGFsLkRpc21pc3MoKTsgfSApOw0KCU1vZGFsLlNob3coKTsNCg0KCS8vIGF0dGFjaCB0aGUgZGVmZXJyZWQncyBldmVudHMgdG8gdGhlIG1vZGFsDQoJZGVmZXJyZWQucHJvbWlzZSggTW9kYWwgKTsNCg0KCXJldHVybiBNb2RhbDsNCn0NCg0KZnVuY3Rpb24gX0J1aWxHUEZ1bGxTY3JlZW5Nb2RhbCggY29udGVudCwgZm5PbkNhbmNlbCApDQp7DQoJCXZhciAkRGlhbG9nID0gJEooJzxkaWFsb2cvPicpLmFwcGVuZCggJEooJzxkaXYvPicsIHsnc3R5bGUnOiAnZGlzcGxheTpmbGV4J30gKS5hcHBlbmQoIGNvbnRlbnQgKSApOw0KCXZhciBNb2RhbCA9IG5ldyBDTW9kYWwoICREaWFsb2cgKTsNCg0KCU1vZGFsLlNldFJlbW92ZUNvbnRlbnRPbkRpc21pc3NhbCggdHJ1ZSApOw0KCWlmICggZm5PbkNhbmNlbCApDQoJew0KCQlNb2RhbC5PbkRpc21pc3MoIGZuT25DYW5jZWwgKTsNCgl9DQoNCglyZXR1cm4gTW9kYWw7DQp9DQoNCi8qIG1vZGFsIHBhcmFtczoNCgliRXhwbGljaXREaXNtaXNzYWxPbmx5IC0gYnkgZGVmYXVsdCwgY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgbW9kYWwgZGlzbWlzc2VzIGl0LiAgU2V0IHRoaXMgdG8gdHJ1ZSB0byBvdmVycmlkZSB0aGF0IGJlaGF2aW9yDQoJYklnbm9yZVJlc2l6ZUV2ZW50cyAtIGRvbid0IHJlc2l6ZSB0aGUgbW9kYWwgd2hlbiB0aGUgd2luZG93IHJlc2l6ZXMNCiAqLw0KDQpmdW5jdGlvbiBDTW9kYWwoICRDb250ZW50LCByZ1BhcmFtcyApDQp7DQoJcmdQYXJhbXMgPSByZ1BhcmFtcyB8fCB7fTsNCg0KCXRoaXMubV8kQ29udGVudCA9ICRDb250ZW50Ow0KCXRoaXMubV9iVmlzaWJsZSA9IGZhbHNlOw0KDQoJdGhpcy5tX2JJZ25vcmVSZXNpemVFdmVudHMgPSByZ1BhcmFtcy5iSWdub3JlUmVzaXplRXZlbnRzOw0KCXRoaXMubV9mblNpemluZyA9IG51bGw7DQoJdGhpcy5tX2ZuQmFja2dyb3VuZENsaWNrID0gbnVsbDsNCgl0aGlzLm1fZm5PblJlc2l6ZSA9IG51bGw7DQoJdGhpcy5tX2JEaXNtaXNzT25CYWNrZ3JvdW5kQ2xpY2sgPSAhcmdQYXJhbXMuYkV4cGxpY2l0RGlzbWlzc2FsT25seTsNCgl0aGlzLm1fbk1heFdpZHRoID0gcmdQYXJhbXMubk1heFdpZHRoIHx8IDA7DQoJdGhpcy5tX25NYXhIZWlnaHQgPSByZ1BhcmFtcy5uTWF4SGVpZ2h0IHx8IDA7DQoNCgl0aGlzLm1fZm5PbkRpc21pc3MgPSBudWxsOw0KCXRoaXMubV9mbkdQT25DbG9zZU1vZGFsID0gbnVsbDsNCgl0aGlzLm1fYlJlbW92ZUNvbnRlbnRPbkRpc21pc3NhbCA9IGZhbHNlOw0KDQoJdGhpcy5tX25Jbml0aWFsT2Zmc2V0VG9wID0gJEood2luZG93KS5zY3JvbGxUb3AoKTsNCgl0aGlzLm1fbkluaXRpYWxPZmZzZXRMZWZ0ID0gJEood2luZG93KS5zY3JvbGxMZWZ0KCk7DQoJdGhpcy5tXyRDb250ZW50LmNzcyggJ3Bvc2l0aW9uJywgJ2ZpeGVkJyApOw0KCXRoaXMubV8kQ29udGVudC5jc3MoICd6LWluZGV4JywgMTAwMCApOw0KCXRoaXMubV8kQ29udGVudC5jc3MoICdvdXRsaW5lJywgJ25vbmUnICk7DQoNCgkvKiBkZWZhdWx0IGdhbWVwYWQgYmVoYXZpb3IgaXMgQiBidXR0b24gY2xvc2VzIHRoZSBkaWFsb2cgKi8NCglpZiAoICF0aGlzLm1fJENvbnRlbnQuYXR0cigncGFuZWwnICkgKQ0KCQl0aGlzLm1fJENvbnRlbnQuYXR0ciggJ2RhdGEtcGFuZWwnLCAneyJvbkNhbmNlbEJ1dHRvbiI6IkNNb2RhbC5EaXNtaXNzQWN0aXZlTW9kYWwoKSJ9JyApOw0KDQoJdGhpcy5tXyRTdGFuZGFyZENvbnRlbnQgPSBudWxsOw0KCXRoaXMubV8kU2l6ZWRDb250ZW50ID0gbnVsbDsNCgl0aGlzLk9uQ29udGVudENoYW5nZWQoKTsJLy90aGlzIHdpbGwgbG9vayBmb3IgU3RhbmRhcmRDb250ZW50IGFuZCBTaXplZENvbnRlbnQgaW4gdGhlIG1vZGFsIGJvZHkNCg0KDQoJdmFyIF9tb2RhbCA9IHRoaXM7DQoJdGhpcy5tX2ZuQmFja2dyb3VuZENsaWNrID0gZnVuY3Rpb24oKSB7IGlmICggX21vZGFsLkJJc0FjdGl2ZU1vZGFsKCkgJiYgX21vZGFsLm1fYkRpc21pc3NPbkJhY2tncm91bmRDbGljayApIHsgX21vZGFsLkRpc21pc3MoKTsgfSB9Ow0KCXRoaXMubV9mbk9uRXNjYXBlS2V5UHJlc3MgPSBmdW5jdGlvbiggZXZlbnQgKSB7IGlmICggX21vZGFsLkJJc0FjdGl2ZU1vZGFsKCkgJiYgZXZlbnQud2hpY2ggPT0gMjcgKSBfbW9kYWwubV9mbkJhY2tncm91bmRDbGljaygpOyB9Ow0KCXRoaXMubV9mblNpemluZyA9IGZ1bmN0aW9uKCkgeyBfbW9kYWwuQWRqdXN0U2l6aW5nKCk7IH07DQoNCgkvKiBtYWtlIHN1cmUgdGhlIGNvbnRlbnQgaXMgcGFyZW50ZWQgY29ycmVjdGx5ICovDQoJJEooZG9jdW1lbnQuYm9keSkuYXBwZW5kKCB0aGlzLm1fJENvbnRlbnQgKTsNCn0NCg0KQ01vZGFsLnByb3RvdHlwZS5PbkRpc21pc3MgPSBmdW5jdGlvbiggZm4gKQ0Kew0KCXRoaXMubV9mbk9uRGlzbWlzcyA9IGZuOw0KfTsNCg0KQ01vZGFsLnByb3RvdHlwZS5PblJlc2l6ZSA9IGZ1bmN0aW9uKCBmbiApDQp7DQoJdGhpcy5tX2ZuT25SZXNpemUgPSBmbjsNCn07DQoNCi8qKg0KICogQHJldHVybnMgalF1ZXJ5DQogKi8NCkNNb2RhbC5wcm90b3R5cGUuR2V0Q29udGVudCA9IGZ1bmN0aW9uICgpDQp7DQoJcmV0dXJuIHRoaXMubV8kQ29udGVudDsNCn07DQoNCkNNb2RhbC5wcm90b3R5cGUuR2V0Qm91bmRPblJlc2l6ZUV2ZW50ID0gZnVuY3Rpb24oKQ0Kew0KCS8vIGluIGNhc2Ugc29tZW9uZSBvdXRzaWRlIG5lZWRzIHRvIHRlbGwgdGhlIG1vZGFsIHRvIHJlc2l6ZSBvbiBjZXJ0YWluIGV2ZW50cyAoZWcgaW1hZ2VzIG9yIGlmcmFtZXMgbG9hZGluZyBpbiB0aGUgbW9kYWwpDQoJcmV0dXJuIHRoaXMubV9mblNpemluZzsNCn07DQoNCkNNb2RhbC5wcm90b3R5cGUuT25Db250ZW50Q2hhbmdlZCA9IGZ1bmN0aW9uKCkNCnsNCgkvLyBtYWtlIHN1cmUgd2UncmUgaG9sZGluZyB0aGUgcmlnaHQgZWxlbWVudHMNCgl0aGlzLm1fJFN0YW5kYXJkQ29udGVudCA9IHRoaXMubV8kQ29udGVudC5maW5kKCAnLm5ld21vZGFsX2NvbnRlbnQnICk7DQoJaWYgKCAhdGhpcy5tXyRTdGFuZGFyZENvbnRlbnQubGVuZ3RoICkNCgkJdGhpcy5tXyRTdGFuZGFyZENvbnRlbnQgPSB0aGlzLm1fJENvbnRlbnQ7DQoJdGhpcy5tXyRTaXplZENvbnRlbnQgPSB0aGlzLm1fJENvbnRlbnQuZmluZCggJy5uZXdtb2RhbF9zaXplZF9jb250ZW50JyApOw0KfTsNCg0KQ01vZGFsLnByb3RvdHlwZS5TZXRSZW1vdmVDb250ZW50T25EaXNtaXNzYWwgPSBmdW5jdGlvbiAoIGJSZW1vdmVDb250ZW50ICkNCnsNCgl0aGlzLm1fYlJlbW92ZUNvbnRlbnRPbkRpc21pc3NhbCA9IGJSZW1vdmVDb250ZW50Ow0KfTsNCg0KQ01vZGFsLnByb3RvdHlwZS5TZXREaXNtaXNzT25CYWNrZ3JvdW5kQ2xpY2sgPSBmdW5jdGlvbiAoIGJEaXNtaXNzT25CYWNrZ3JvdW5kQ2xpY2sgKQ0Kew0KCXRoaXMubV9iRGlzbWlzc09uQmFja2dyb3VuZENsaWNrID0gYkRpc21pc3NPbkJhY2tncm91bmRDbGljazsNCn07DQoNCkNNb2RhbC5wcm90b3R5cGUuU2V0TWF4V2lkdGggPSBmdW5jdGlvbiAoIG5NYXhXaWR0aCApDQp7DQoJdGhpcy5tX25NYXhXaWR0aCA9IG5NYXhXaWR0aDsNCglpZiAoIHRoaXMubV9iVmlzaWJsZSApDQoJCXRoaXMuQWRqdXN0U2l6aW5nKCk7DQp9Ow0KDQpDTW9kYWwucHJvdG90eXBlLlNldE1heEhlaWdodCA9IGZ1bmN0aW9uICggbk1heEhlaWdodCApDQp7DQoJdGhpcy5tX25NYXhIZWlnaHQgPSBuTWF4SGVpZ2h0Ow0KCWlmICggdGhpcy5tX2JWaXNpYmxlICkNCgkJdGhpcy5BZGp1c3RTaXppbmcoKTsNCn07DQoNCkNNb2RhbC5wcm90b3R5cGUuQWRqdXN0U2l6aW5nID0gZnVuY3Rpb24oIGR1cmF0aW9uICkNCnsNCglpZiAoICF0aGlzLm1fJENvbnRlbnQgKQ0KCQlyZXR1cm47DQoNCgl2YXIgYlJlc3BvbnNpdmVTY3JlZW4gPSB3aW5kb3cuVXNlVG91Y2hGcmllbmRseU1vZGUgJiYgVXNlVG91Y2hGcmllbmRseU1vZGUoKTsNCgl2YXIgYlVzZUdhbWVwYWRTY3JlZW5Nb2RlID0gd2luZG93LlVzZUdhbWVwYWRTY3JlZW5Nb2RlICYmIHdpbmRvdy5Vc2VHYW1lcGFkU2NyZWVuTW9kZSgpOw0KDQoJdmFyIG5WaWV3cG9ydFdpZHRoID0gZG9jdW1lbnQuY29tcGF0TW9kZSA9PT0gJ0JhY2tDb21wYXQnID8gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCA6ICRKKHdpbmRvdykud2lkdGgoKTsNCgl2YXIgblZpZXdwb3J0SGVpZ2h0ID0gZG9jdW1lbnQuY29tcGF0TW9kZSA9PT0gJ0JhY2tDb21wYXQnID8gZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQgOiAkSih3aW5kb3cpLmhlaWdodCgpOw0KDQoJdmFyIG5NYXhXaWR0aCA9IE1hdGgubWF4KCBuVmlld3BvcnRXaWR0aCAtICggYlJlc3BvbnNpdmVTY3JlZW4/IDI0IDogODAgKSwgYlJlc3BvbnNpdmVTY3JlZW4gPyAyMDAgOiA1MDAgKTsNCgl2YXIgbk1heEhlaWdodCA9IE1hdGguZmxvb3IoIG5WaWV3cG9ydEhlaWdodCAtIDEyMCApOw0KDQoJaWYgKCB0aGlzLm1fbk1heFdpZHRoICYmIG5NYXhXaWR0aCA+IHRoaXMubV9uTWF4V2lkdGggKQ0KCXsNCgkJbk1heFdpZHRoID0gdGhpcy5tX25NYXhXaWR0aDsNCgl9DQoNCglpZiAoIHRoaXMubV9uTWF4SGVpZ2h0ICYmIG5NYXhIZWlnaHQgPiB0aGlzLm1fbk1heEhlaWdodCApDQoJew0KCQluTWF4SGVpZ2h0ID0gdGhpcy5tX25NYXhIZWlnaHQ7DQoJfQ0KDQoJLy8gaWYgdGhlIG1vZGFsIGhhcyBhICduZXdtb2RhbF9zaXplZF9jb250ZW50JyBkaXYsIGl0IHdhbnRzIHRvIGJlIHRoZSBtYXggaGVpZ2h0LCBzbyBzZXQgaXQgbm93DQoJLy8JYmVmb3JlIHdlIGNvbXB1dGUgaGVpZ2h0CSggIi0gMTgiIGlzIGEgZnVkZ2UgZm9yIGEgcG9zc2libGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIgKQ0KCXRoaXMubV8kU2l6ZWRDb250ZW50LmNzcyggJ21pbi1oZWlnaHQnLCAoIG5NYXhIZWlnaHQgLSAxOCApICsgJ3B4JyApOw0KCWlmICggdGhpcy5tX2ZuT25SZXNpemUgKQ0KCXsNCgkJdGhpcy5tX2ZuT25SZXNpemUoIG5NYXhXaWR0aCAtIDQwLCBuTWF4SGVpZ2h0ICk7DQoJfQ0KDQoJaWYgKCAhZHVyYXRpb24gKQ0KCXsNCgkJLy8gc2V0IHNpemVzIHJpZ2h0IGF3YXkgc28gd2UgY2FuIGNhbGN1bGF0ZSBhIGdvb2QgbGVmdCBhbmQgdG9wDQoJCXRoaXMubV8kQ29udGVudC5jc3MoICdtYXgtd2lkdGgnLCAgbk1heFdpZHRoICsgJ3B4JyApOw0KCQlpZiAoICFiUmVzcG9uc2l2ZVNjcmVlbiApDQoJCXsNCgkJCXRoaXMubV8kU3RhbmRhcmRDb250ZW50LmNzcyggJ21heC1oZWlnaHQnLCAgbk1heEhlaWdodCArICdweCcgKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXRoaXMubV8kU3RhbmRhcmRDb250ZW50LmNzcyggJ21heC1oZWlnaHQnLCAnJyApOw0KCQl9DQoJfQ0KDQoJdmFyIG5Db250ZW50V2lkdGggPSB0aGlzLm1fJENvbnRlbnQud2lkdGgoKTsNCgl2YXIgbkNvbnRlbnRIZWlnaHQgPSB0aGlzLm1fJENvbnRlbnQuaGVpZ2h0KCk7DQoJdmFyIG5MZWZ0ID0gTWF0aC5tYXgoIE1hdGguZmxvb3IoICggblZpZXdwb3J0V2lkdGggLSBuQ29udGVudFdpZHRoICkgLyAyICksIDEyICk7DQoJdmFyIG5Ub3AgPSBNYXRoLm1heCggTWF0aC5mbG9vciggKCBuVmlld3BvcnRIZWlnaHQgLSBuQ29udGVudEhlaWdodCApIC8gMiApLCAxMiApOw0KDQoJLy8gb25seSB1c2UgYWJzb2x1dGUgcG9zaXRpb24gb24gbW9iaWxlIHNjcmVlbnMNCglpZiAoIGJSZXNwb25zaXZlU2NyZWVuICYmICFiVXNlR2FtZXBhZFNjcmVlbk1vZGUgKQ0KCXsNCgkJbkxlZnQgKz0gdGhpcy5tX25Jbml0aWFsT2Zmc2V0TGVmdDsNCgkJblRvcCArPSB0aGlzLm1fbkluaXRpYWxPZmZzZXRUb3A7DQoJCXRoaXMubV8kQ29udGVudC5jc3MoICdwb3NpdGlvbicsICdhYnNvbHV0ZScgKTsNCgl9DQoJZWxzZQ0KCXsNCgkJdGhpcy5tXyRDb250ZW50LmNzcyggJ3Bvc2l0aW9uJywgJ2ZpeGVkJyApOw0KCX0NCg0KCWlmICggZHVyYXRpb24gKQ0KCXsNCgkJdGhpcy5tXyRDb250ZW50LmFuaW1hdGUoIHsgJ21heC13aWR0aCc6IG5NYXhXaWR0aCwgbGVmdDogbkxlZnQsIHRvcDogblRvcCB9LCBkdXJhdGlvbiApOw0KCQl0aGlzLm1fJFN0YW5kYXJkQ29udGVudC5hbmltYXRlKCB7J21heC1oZWlnaHQnOiBuTWF4SGVpZ2h0IH0sIGR1cmF0aW9uICk7DQoJfQ0KCWVsc2UNCgl7DQoJCXRoaXMubV8kQ29udGVudC5jc3MoICdsZWZ0JywgbkxlZnQgKTsNCgkJdGhpcy5tXyRDb250ZW50LmNzcyggJ3RvcCcsIG5Ub3AgKTsNCgl9DQp9Ow0KDQpDTW9kYWwucHJvdG90eXBlLlNob3cgPSBmdW5jdGlvbigpDQp7DQoJaWYgKCB0aGlzLm1fYlZpc2libGUgKQ0KCQlyZXR1cm47DQoNCglDTW9kYWwuU2hvd01vZGFsQmFja2dyb3VuZCgpOw0KDQoJaWYgKCAhdGhpcy5tX2JJZ25vcmVSZXNpemVFdmVudHMgKQ0KCXsNCgkJJEood2luZG93KS5vbiggJ3Jlc2l6ZScsIG51bGwsIHRoaXMubV9mblNpemluZyApOw0KCX0NCglDTW9kYWwuc18kQmFja2dyb3VuZC5vbiggJ2NsaWNrLkNNb2RhbCcsIHRoaXMubV9mbkJhY2tncm91bmRDbGljayApOw0KCSRKKGRvY3VtZW50KS5vbiggJ2tleXVwLkNNb2RhbCcsIHRoaXMubV9mbk9uRXNjYXBlS2V5UHJlc3MgKTsNCg0KCXRoaXMuQWRqdXN0U2l6aW5nKCk7DQoNCgkvLyBpZiB3ZSdyZSBpbiBnYW1lcGFkLCBub3RpZnkgZ2FtZXBhZCBuYXZpZ2F0aW9uIG9mIHRoZSBtb2RhbA0KCWlmICggdHlwZW9mIEdQT25TaG93aW5nTW9kYWxXaW5kb3cgPT09ICJmdW5jdGlvbiIgKQ0KCQl0aGlzLm1fZm5HUE9uQ2xvc2VNb2RhbCA9IEdQT25TaG93aW5nTW9kYWxXaW5kb3coIHRoaXMubV8kQ29udGVudC5nZXQoIDAgKSApOw0KDQoJdGhpcy5tXyRDb250ZW50WzBdLnNob3dNb2RhbCgpOw0KDQoJLy8gcmVzaXplIGFzIGFueSBjaGlsZCBpbWFnZSBlbGVtZW50cyBsb2FkIGluLg0KCXRoaXMubV8kQ29udGVudC5maW5kKCdpbWcnKS5sb2FkKCB0aGlzLm1fZm5TaXppbmcgKTsNCg0KCXRoaXMubV9iVmlzaWJsZSA9IHRydWU7DQoJQ01vZGFsLlB1c2hBY3RpdmVNb2RhbCggdGhpcyApOw0KDQoJdmFyIF90aGlzID0gdGhpczsNCglpZiAoIHR5cGVvZiBHUE5hdkZvY3VzQ2hpbGQgIT09ICd1bmRlZmluZWQnICkNCgkJd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgeyBHUE5hdkZvY3VzQ2hpbGQoIF90aGlzLm1fJENvbnRlbnQgKSB9LCAxICk7CX07DQoNCkNNb2RhbC5wcm90b3R5cGUuRGlzbWlzcyA9IGZ1bmN0aW9uKCkNCnsNCglpZiAoICF0aGlzLm1fYlZpc2libGUgKQ0KCQlyZXR1cm47DQoNCgl0aGlzLm1fYlZpc2libGUgPSBmYWxzZTsNCg0KCS8vIHRlbGwgZ2FtZXBhZCBuYXZpZ2F0aW9uIHdlJ3JlIGNsb3NpbmcgdGhpcyBtb2RhbA0KCWlmICggdGhpcy5tX2ZuR1BPbkNsb3NlTW9kYWwgKQ0KCXsNCgkJdGhpcy5tX2ZuR1BPbkNsb3NlTW9kYWwoKTsNCgkJdGhpcy5tX2ZuR1BPbkNsb3NlTW9kYWwgPSBudWxsOw0KCX0NCg0KCXRoaXMubV8kQ29udGVudD8uWzBdLmNsb3NlKCk7DQoNCglpZiAoICF0aGlzLm1fYklnbm9yZVJlc2l6ZUV2ZW50cyApDQoJew0KCQkkSih3aW5kb3cpLm9mZiggJ3Jlc2l6ZScsIG51bGwsIHRoaXMubV9mblNpemluZyApOw0KCX0NCg0KCWlmICggdGhpcy5tX2ZuT25EaXNtaXNzICkNCgkJdGhpcy5tX2ZuT25EaXNtaXNzKCk7DQoNCglpZiAoIHRoaXMubV9iUmVtb3ZlQ29udGVudE9uRGlzbWlzc2FsICkNCgl7DQoJCXRoaXMubV8kQ29udGVudC5yZW1vdmUoKTsNCgkJdGhpcy5tXyRDb250ZW50ID0gbnVsbDsNCgl9DQoNCglDTW9kYWwuUG9wQWN0aXZlTW9kYWwoIHRoaXMgKTsNCglpZiAoICFDTW9kYWwuc19yZ01vZGFsU3RhY2subGVuZ3RoICkNCgl7DQoJCUNNb2RhbC5zXyRCYWNrZ3JvdW5kLm9mZiggJ2NsaWNrLkNNb2RhbCcsIHRoaXMubV9mbkJhY2tncm91bmRDbGljayApOw0KCQkkSihkb2N1bWVudCkub2ZmKCAna2V5dXAuQ01vZGFsJywgdGhpcy5tX2ZuT25Fc2NhcGVLZXlQcmVzcyApOw0KCQlDTW9kYWwuSGlkZU1vZGFsQmFja2dyb3VuZCgpOw0KCX0NCn07DQoNCkNNb2RhbC5wcm90b3R5cGUuQklzQWN0aXZlTW9kYWwgPSBmdW5jdGlvbigpDQp7DQoJcmV0dXJuIENNb2RhbC5zX3JnTW9kYWxTdGFjay5sZW5ndGggJiYgQ01vZGFsLnNfcmdNb2RhbFN0YWNrWyBDTW9kYWwuc19yZ01vZGFsU3RhY2subGVuZ3RoIC0gMSBdID09IHRoaXM7DQp9Ow0KDQovKiBzdGF0aWMgKi8NCkNNb2RhbC5TaG93TW9kYWxCYWNrZ3JvdW5kID0gZnVuY3Rpb24oKQ0Kew0KCWlmICggIUNNb2RhbC5zXyRCYWNrZ3JvdW5kICkNCgl7DQoJCUNNb2RhbC5zXyRCYWNrZ3JvdW5kID0gJEooJzxkaXYvPicsIHsnY2xhc3MnOiAnbmV3bW9kYWxfYmFja2dyb3VuZCd9KTsNCgkJQ01vZGFsLnNfJEJhY2tncm91bmQuY3NzKCAnb3BhY2l0eScsIDAgKTsNCgkJJEooZG9jdW1lbnQuYm9keSkuYXBwZW5kKCBDTW9kYWwuc18kQmFja2dyb3VuZCApOw0KCX0NCglDTW9kYWwuc18kQmFja2dyb3VuZC5zdG9wKCk7CS8vIHN0b3AgcnVubmluZyBhbmltYXRpb25zDQoJQ01vZGFsLnNfJEJhY2tncm91bmQuZmFkZVRvKCAyMDAsIDAuOCApOw0KfTsNCg0KQ01vZGFsLkhpZGVNb2RhbEJhY2tncm91bmQgPSBmdW5jdGlvbigpDQp7DQoJaWYgKCBDTW9kYWwuc18kQmFja2dyb3VuZCApDQoJew0KCQlDTW9kYWwuc18kQmFja2dyb3VuZC5zdG9wKCk7CS8vIHN0b3AgcnVubmluZyBhbmltYXRpb25zDQoJCUNNb2RhbC5zXyRCYWNrZ3JvdW5kLmZhZGVPdXQoIDIwMCwgMCApOw0KCX0NCn07DQoNCkNNb2RhbC5zX3JnTW9kYWxTdGFjayA9IFtdOw0KQ01vZGFsLkdldEFjdGl2ZU1vZGFsID0gZnVuY3Rpb24oKQ0Kew0KCWlmICggQ01vZGFsLnNfcmdNb2RhbFN0YWNrLmxlbmd0aCApDQoJCXJldHVybiBDTW9kYWwuc19yZ01vZGFsU3RhY2tbQ01vZGFsLnNfcmdNb2RhbFN0YWNrLmxlbmd0aC0xXTsNCgllbHNlDQoJCXJldHVybiBudWxsOw0KfTsNCkNNb2RhbC5EaXNtaXNzQWN0aXZlTW9kYWwgPSBmdW5jdGlvbigpDQp7DQoJaWYgKCBDTW9kYWwuc19yZ01vZGFsU3RhY2subGVuZ3RoICkNCgkJQ01vZGFsLnNfcmdNb2RhbFN0YWNrW0NNb2RhbC5zX3JnTW9kYWxTdGFjay5sZW5ndGgtMV0uRGlzbWlzcygpOw0KfTsNCg0KQ01vZGFsLlB1c2hBY3RpdmVNb2RhbCA9IGZ1bmN0aW9uKCBNb2RhbCApDQp7DQoJZm9yICggdmFyIGkgPSAwOyBpIDwgQ01vZGFsLnNfcmdNb2RhbFN0YWNrLmxlbmd0aDsgaSsrICkNCgl7DQoJCS8vIHB1c2ggYmVsb3cgYmFja2dyb3VuZA0KCQlDTW9kYWwuc19yZ01vZGFsU3RhY2tbaV0ubV8kQ29udGVudC5jc3MoICd6LWluZGV4JywgODk5ICk7DQoJfQ0KCUNNb2RhbC5zX3JnTW9kYWxTdGFjay5wdXNoKCBNb2RhbCApOw0KfTsNCg0KQ01vZGFsLlBvcEFjdGl2ZU1vZGFsID0gZnVuY3Rpb24oIE1vZGFsICkNCnsNCglmb3IgKCB2YXIgaSA9IDA7IGkgPCBDTW9kYWwuc19yZ01vZGFsU3RhY2subGVuZ3RoOyBpKysgKQ0KCXsNCgkJaWYgKCBDTW9kYWwuc19yZ01vZGFsU3RhY2tbaV0gPT0gTW9kYWwgKQ0KCQl7DQoJCQlDTW9kYWwuc19yZ01vZGFsU3RhY2suc3BsaWNlKCBpLCAxICk7DQoJCQlicmVhazsNCgkJfQ0KCX0NCg0KCWlmICggQ01vZGFsLnNfcmdNb2RhbFN0YWNrLmxlbmd0aCApDQoJCUNNb2RhbC5zX3JnTW9kYWxTdGFja1sgQ01vZGFsLnNfcmdNb2RhbFN0YWNrLmxlbmd0aCAtIDEgXS5tXyRDb250ZW50LmNzcyggJ3otaW5kZXgnLCAxMDAwICk7DQp9Ow0KDQovLyB0aGlzIHdpbGwgc2V0IHRoZSByaWdodCBoZWFkZXJzIGZvciBhIGNyb3NzLWRvbWFpbiByZXF1ZXN0IHRvIGNvbW11bml0eQ0KZnVuY3Rpb24gR2V0RGVmYXVsdENvbW11bml0eUFKQVhQYXJhbXMoIHBhdGgsIG1ldGhvZCApDQp7DQoJdmFyIHJnUGFyYW1zID0geyB1cmw6ICdodHRwczovL3N0ZWFtY29tbXVuaXR5LmNvbS8nICsgcGF0aCB9Ow0KCWlmICggbWV0aG9kICkNCgkJcmdQYXJhbXMudHlwZSA9IG1ldGhvZDsNCg0KCS8vIGlmIHRoaXMganMgZmlsZSB3YXMgaG9zdGVkIG9mZiB0aGUgc3RvcmUsIGFkZCBDT1JTIHJlcXVlc3QgaGVhZGVycw0KCWlmICggd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZiggJ2h0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tLycgKSAhPSAwICkNCgl7DQoJCXJnUGFyYW1zLmNyb3NzRG9tYWluID0gdHJ1ZTsNCgkJcmdQYXJhbXMueGhyRmllbGRzID0geyB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfTsNCgl9DQoJcmV0dXJuIHJnUGFyYW1zOw0KfQ0KDQpmdW5jdGlvbiBDcm9zc0RvbWFpblBvc3QoIHVybCwgcGFyYW1zICkNCnsNCgkJcmV0dXJuICRKLmFqYXgoIHsNCgkJdHlwZTogJ3Bvc3QnLA0KCQl1cmw6IHVybCwNCgkJZGF0YTogcGFyYW1zLA0KCQljcm9zc0RvbWFpbjogdHJ1ZSwNCgkJeGhyRmllbGRzOiB7IHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9DQoJfSApOw0KfQ0KDQovLyBzcHBlZCBvZiB0aGUgbWluaXByb2ZpbGUgZmFkaW5nIGluIGFuZCBvdXQNCnZhciBNSU5JUFJPRklMRV9BTklNX1NQRUVEID0gMTUwOw0KLy8gaG93IGxvbmcgdGhlIG1vdXNlIG11c3QgcmVtYWluIG92ZXIgYW4gZWxlbWVudCBiZWZvcmUgd2UnbGwgbWFrZSBhbiBBSkFYIGNhbGwNCnZhciBNSU5JUFJPRklMRV9ERUxBWV9CRUZPUkVfQUpBWCA9IDEwMDsNCi8vIHRoZSBkZWxheSBiZWZvcmUgd2UnbGwgc2hvdyB0aGUgaG92ZXIsIG11c3QgYmUgbG9uZ2VyIHRoYW4gREVMQVlfQkVGT1JFX0FKQVgNCnZhciBNSU5JUFJPRklMRV9ERUxBWV9CRUZPUkVfU0hPVyA9IDI1MDsNCg0KZnVuY3Rpb24gQ0RlbGF5ZWRBSkFYRGF0YSggc3RyVVJMLCBtc0RlbGF5QmVmb3JlQUpBWCApDQp7DQoJdGhpcy5tXyREYXRhID0gbnVsbDsNCgl0aGlzLm1fYkFKQVhGYWlsZWQgPSBmYWxzZTsNCgl0aGlzLm1fdGltZXJEZWxheWVkQUpBWCA9IG51bGw7DQoJdGhpcy5tX2JBSkFYUmVxdWVzdE1hZGUgPSBmYWxzZTsNCgl0aGlzLm1fbXNEZWxheUJlZm9yZUFKQVggPSBtc0RlbGF5QmVmb3JlQUpBWDsNCgl0aGlzLm1fc3RyVVJMID0gc3RyVVJMOw0KDQoJdGhpcy5tX2ZuT25BSkFYQ29tcGxldGUgPSBudWxsOw0KfQ0KDQpDRGVsYXllZEFKQVhEYXRhLnByb3RvdHlwZS5HZXRBSkFYUGFyYW1zID0gZnVuY3Rpb24oKQ0Kew0KCXJldHVybiBHZXREZWZhdWx0Q29tbXVuaXR5QUpBWFBhcmFtcyggdGhpcy5tX3N0clVSTCwgJ0dFVCcgKTsNCn07DQoNCkNEZWxheWVkQUpBWERhdGEucHJvdG90eXBlLlF1ZXVlQWpheFJlcXVlc3RJZk5lY2Vzc2FyeSA9IGZ1bmN0aW9uKCkNCnsNCglpZiAoICF0aGlzLm1fJERhdGEgJiYgIXRoaXMubV9iQUpBWFJlcXVlc3RNYWRlICkNCgl7DQoJCXZhciBfdGhpcyA9IHRoaXM7DQoJCXRoaXMubV90aW1lckRlbGF5ZWRBSkFYID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgew0KCQkJX3RoaXMubV90aW1lckRlbGF5ZWRBSkFYID0gbnVsbDsNCgkJCV90aGlzLm1fYkFKQVhSZXF1ZXN0TWFkZSA9IHRydWU7DQoJCQl2YXIgcmdBSkFYUGFyYW1zID0gX3RoaXMuR2V0QUpBWFBhcmFtcygpOw0KCQkJJEouYWpheCggcmdBSkFYUGFyYW1zICkNCgkJCQkuZG9uZSggZnVuY3Rpb24oZGF0YSkgew0KCQkJCQlfdGhpcy5tXyREYXRhID0gJEooZGF0YSk7DQoJCQkJCWlmICggX3RoaXMubV9mbk9uQUpBWENvbXBsZXRlICkNCgkJCQkJCV90aGlzLm1fZm5PbkFKQVhDb21wbGV0ZSgpOw0KCQkJCX0pLmZhaWwoIGZ1bmN0aW9uKCkgew0KCQkJCQlfdGhpcy5tX2JBSkFYRmFpbGVkID0gdHJ1ZTsNCgkJCQl9KTsNCgkJfSwgdGhpcy5tX21zRGVsYXlCZWZvcmVBSkFYICk7DQoJfQ0KfTsNCg0KQ0RlbGF5ZWRBSkFYRGF0YS5wcm90b3R5cGUuQ2FuY2VsQUpBWCA9IGZ1bmN0aW9uKCkNCnsNCglpZiAoIHRoaXMubV90aW1lckRlbGF5ZWRBSkFYICkNCgkJd2luZG93LmNsZWFyVGltZW91dCggdGhpcy5tX3RpbWVyRGVsYXllZEFKQVggKTsNCg0KCXRoaXMubV9mbk9uQUpBWENvbXBsZXRlID0gbnVsbDsNCn07DQoNCkNEZWxheWVkQUpBWERhdGEucHJvdG90eXBlLlJ1bldoZW5BSkFYUmVhZHkgPSBmdW5jdGlvbiggZm5PblJlYWR5ICkNCnsNCglpZiAoIHRoaXMubV8kRGF0YSApDQoJCWZuT25SZWFkeSgpOw0KCWVsc2UgaWYgKCAhdGhpcy5tX2JBSkFYRmFpbGVkICkNCgl7DQoJCXRoaXMubV9mbk9uQUpBWENvbXBsZXRlID0gZm5PblJlYWR5Ow0KCQl0aGlzLlF1ZXVlQWpheFJlcXVlc3RJZk5lY2Vzc2FyeSgpOw0KCX0NCgkvLyBpZiBhamF4IGZhaWxlZCB3ZSB3aWxsIG5vdCBjYWxsIGZuT25SZWFkeQ0KfTsNCg0KQ0RlbGF5ZWRBSkFYRGF0YS5wcm90b3R5cGUuU2hvdyA9IGZ1bmN0aW9uKCAkSG92ZXJDb250ZW50ICkNCnsNCgkkSG92ZXJDb250ZW50LmNoaWxkcmVuKCkuZGV0YWNoKCk7DQoJJEhvdmVyQ29udGVudC5hcHBlbmQoIHRoaXMubV8kRGF0YSApOw0KfTsNCg0KLy8gdGltZSB0aGUgY29va2llIHByZWZlcmVuY2VzIHBvcHVwIHdhaXRzIGJlZm9yZSBhcHBlYXJpbmcNCnZhcglDT09LSUVfUFJFRkVSRU5DRVNfUE9QVVBfREVMQVkgPSA0MDAwOw0KDQpmdW5jdGlvbiBJbml0Q29va2llUHJlZmVyZW5jZXNQb3B1cCgpDQp7DQoJDQoJdmFyICRwb3B1cERpYWxvZyA9ICRKKCAnI2Nvb2tpZVByZWZQb3B1cCcgKTsNCglpZiAoICRwb3B1cERpYWxvZy5sZW5ndGggPT0gMCApDQoJew0KCQkkQWxsb3dVUkwgPSBlbmNvZGVVUkkoICdodHRwczovL3N0b3JlLnN0ZWFtcG93ZXJlZC5jb20vJyArICdhY2NvdW50L2FqYXhzZXRjb29raWVwcmVmZXJlbmNlcycpOw0KDQoJCXZhciAkQ1BvcHVwQ29udGVudCA9ICRKKCAiPHN0eWxlPlxuLnJlcGx5QnV0dG9uIHtcblx0d2lkdGg6IDEwMCU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIG1hcmdpbi1ib3R0b206IDRweDtcbn1cblxuLmJ1dHRvbkdyb3VwIHtcblx0ZmxleDogMTglO1xuXHRtYXJnaW4tbGVmdDogMjBweDtcblx0bWFyZ2luLXJpZ2h0OiAwcHg7XG59XG4uY29va2llTWVzc2FnZSB7XG5cdGZsZXg6IDg1JTtcblx0bWFyZ2luOiBhdXRvO1xufVxuLnBvcHVwVGV4dFRpdGxlIHtcblx0cGFkZGluZy1ib3R0b206IDEwcHg7XG4gICAgZm9udC1zaXplOiAxM3B4O1xuICAgIGxpbmUtaGVpZ2h0OiAxN3B4O1xuICAgIGNvbG9yOiAjYzZkNGRmO1xufVxuLnBvcHVwVGV4dFRpdGxlIGEge1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuLmNvb2tpZXByZWZlcmVuY2VzX3BvcHVwIHtcblx0ZGlzcGxheTogbm9uZTtcblx0cG9zaXRpb246IGZpeGVkO1xuXHRib3R0b206IDA7XG5cdHdpZHRoOiAxMDAlO1xuXHR6LWluZGV4OiAyMDAwO1xuXHRwYWRkaW5nLXRvcDogMTBweDtcbn1cbi5jb29raWVwcmVmZXJlbmNlc19wb3B1cF9jb250ZW50IHtcblx0ZGlzcGxheTogZmxleDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuXHR3aWR0aDogOTAlO1xuXHRtYXJnaW46IGF1dG87XG5cdG1hcmdpbi1ib3R0b206IDIwcHg7XG5cdHBhZGRpbmc6IDE2cHggMTZweCAxMHB4IDE2cHg7XG4gICAgbWF4LXdpZHRoOiA5ODBweDtcblx0YmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwLjg1ZGVnLCAjMzMzODQwIDAuNTglLCAjMjUyODJFIDc0LjkyJSk7XG5cdGJveC1zaGFkb3c6IDBweCAwcHggMTBweCAjMDAwMDAwO1xuICAgIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzAwQ0NGRjtcbn1cbkBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6IDkxMHB4KSB7XG4gICAgYm9keS5yZXNwb25zaXZlX3BhZ2UgLmNvb2tpZXByZWZlcmVuY2VzX3BvcHVwX2NvbnRlbnQge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIH1cbiAgICBib2R5LnJlc3BvbnNpdmVfcGFnZSAuY29va2llcHJlZmVyZW5jZXNfcG9wdXBfY29udGVudCAuY29va2llTWVzc2FnZSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XG4gICAgfVxuICAgIGJvZHkucmVzcG9uc2l2ZV9wYWdlIC5jb29raWVwcmVmZXJlbmNlc19wb3B1cF9jb250ZW50IC5idXR0b25Hcm91cCB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHg7XG4gICAgfVxuICAgIGJvZHkucmVzcG9uc2l2ZV9wYWdlIC5jb29raWVwcmVmZXJlbmNlc19wb3B1cF9jb250ZW50IC5idXR0b25Hcm91cCAucmVwbHlCdXR0b24ge1xuICAgICAgICB3aWR0aDogdW5zZXQ7XG4gICAgfVxufVxuPFwvc3R5bGU+XG5cbjxkaXYgaWQ9XCJjb29raWVQcmVmUG9wdXBcIiBjbGFzcz1cImNvb2tpZXByZWZlcmVuY2VzX3BvcHVwXCI+XG5cdDxkaXYgY2xhc3M9XCJjb29raWVwcmVmZXJlbmNlc19wb3B1cF9jb250ZW50XCI+XG5cdFx0PGRpdiBjbGFzcz1cImNvb2tpZU1lc3NhZ2VcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJwb3B1cFRleHRUaXRsZVwiPkRvIHlvdSBtaW5kIGlmIHdlIHVzZSBvcHRpb25hbCBjb29raWVzIHRvIHByb3ZpZGUgeW91IHBlcnNvbmFsaXplZCBjb250ZW50IGFuZCB0byBhbmFseXplIHNpdGUgdHJhZmZpYz88XC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwicG9wdXBUZXh0VGl0bGVcIj5XZSBkb24ndCB1c2UgYSBsb3Qgb2YgY29va2llczsgeW91IGNhbiBzZWUgYW5kIG1hbmFnZSB0aGVtIGF0IGFueSB0aW1lIG9uIG91ciA8YSBocmVmPVwiaHR0cHM6XC9cL3N0b3JlLnN0ZWFtcG93ZXJlZC5jb21cL2FjY291bnRcL2Nvb2tpZXByZWZlcmVuY2VzXCI+Q29va2llIFNldHRpbmdzIHBhZ2U8XC9hPi4gSWYgeW91IGNsaWNrICdBY2NlcHQgQWxsLCcgeW91IGNvbnNlbnQgdG8gdGhlIHVzZSBvZiBjb29raWVzIG9uIFN0ZWFtIHdlYnNpdGVzLiBMZWFybiBtb3JlIGFib3V0IGNvb2tpZXMgaW4gb3VyIDxhIGhyZWY9XCJodHRwczpcL1wvc3RvcmUuc3RlYW1wb3dlcmVkLmNvbVwvcHJpdmFjeV9hZ3JlZW1lbnRcIj5Qcml2YWN5IFBvbGljeTxcL2E+LjxcL2Rpdj5cblx0XHQ8XC9kaXY+XG5cdFx0PGRpdiBjbGFzcz1cImJ1dHRvbkdyb3VwXCI+XG5cdFx0XHQ8ZGl2IGlkPVwiYWNjZXB0QWxsQnV0dG9uXCIgY2xhc3M9XCJidG5fYmx1ZV9zdGVhbXVpIGJ0bl9tZWRpdW0gcmVwbHlCdXR0b25cIj48c3Bhbj5BY2NlcHQgQWxsPFwvc3Bhbj48XC9kaXY+XG5cdFx0XHQ8ZGl2IGlkPVwicmVqZWN0QWxsQnV0dG9uXCIgY2xhc3M9XCJidG5fZ3JleV9zdGVhbXVpIGJ0bl9tZWRpdW0gcmVwbHlCdXR0b25cIj48c3Bhbj5SZWplY3QgQWxsPFwvc3Bhbj48XC9kaXY+XG5cdFx0PFwvZGl2PlxuXHQ8XC9kaXY+XG48XC9kaXY+XG4iICk7DQoNCgkJdmFyICRvbkFjY2VwdEJ1dHRvbiA9ICRDUG9wdXBDb250ZW50LmZpbmQoICcjYWNjZXB0QWxsQnV0dG9uJyApOw0KCQl2YXIgJG9uUmVqZWN0QnV0dG9uID0gJENQb3B1cENvbnRlbnQuZmluZCggJyNyZWplY3RBbGxCdXR0b24nICk7DQoNCgkJaWYgKCAkb25BY2NlcHRCdXR0b24ubGVuZ3RoID09IDAgfHwgJG9uUmVqZWN0QnV0dG9uLmxlbmd0aCA9PSAwICkNCgkJew0KCQkJLy8gdGVtcGxhdGUgYXBwZWFycyBicm9rZW4NCgkJCWNvbnNvbGUuZXJyb3IoInVuYWJsZSB0byBkaXNwbGF5IHByZWZlcmVuY2VzIHBvcHVwIik7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQl2YXIgZm5Qb3N0UHJlZmVyZW5jZSA9IGZ1bmN0aW9uICggYkFsbG93Q2hvaWNlICkNCgkJew0KCQkJJEouYWpheCggeyB0eXBlOiAiUE9TVCIsDQoJCQkJCQl1cmw6ICRBbGxvd1VSTCwNCgkJCQkJCWRhdGE6IHsgYkFsbG93OiBiQWxsb3dDaG9pY2UsIHNlc3Npb25pZDogZ19zZXNzaW9uSUQgfSwNCgkJCQkJCWNyb3NzRG9tYWluOiB0cnVlLA0KCQkJCQkJeGhyRmllbGRzOiB7IHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9DQoJCQl9ICkuZG9uZSggZnVuY3Rpb24gKCBkYXRhICkNCgkJCXsNCgkJCQlpZiAoIGRhdGEgJiYgZGF0YS50cmFuc2Zlcl91cmxzICYmIGRhdGEudHJhbnNmZXJfcGFyYW1zICkNCgkJCQl7DQoJCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IGRhdGEudHJhbnNmZXJfdXJscy5sZW5ndGg7IGkrKyApDQoJCQkJCXsNCgkJCQkJCSRKLmFqYXgoIHsgdHlwZTogIlBPU1QiLA0KCQkJCQkJCQkJdXJsOiBkYXRhLnRyYW5zZmVyX3VybHNbaV0sDQoJCQkJCQkJCQlkYXRhOiB7IHRyYW5zZmVyX3BhcmFtczogZGF0YS50cmFuc2Zlcl9wYXJhbXMgfSwNCgkJCQkJCQkJCWNyb3NzRG9tYWluOiB0cnVlLA0KCQkJCQkJCQkJeGhyRmllbGRzOiB7IHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9DQoJCQkJCQl9ICk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9KTsNCgkJCSRKKCAnI2Nvb2tpZVByZWZQb3B1cCcgKS5oaWRlKCk7DQoNCgkJfQ0KDQoJCSRvbkFjY2VwdEJ1dHRvbi5vbignY2xpY2snLCAnJywgZnVuY3Rpb24oKSB7DQoJCQlmblBvc3RQcmVmZXJlbmNlKCAxICk7DQoJCX0gKTsNCg0KCQkkb25SZWplY3RCdXR0b24ub24oJ2NsaWNrJywgJycsIGZ1bmN0aW9uICgpDQoJCXsNCgkJCWZuUG9zdFByZWZlcmVuY2UoIDAgKTsNCgkJfSApOw0KDQoJCSRKKCdib2R5JykuYXBwZW5kKCAkQ1BvcHVwQ29udGVudCApOw0KDQoJCXRpbWVyQ29va2llUG9wdXAgPSB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7DQoJCQkkSigiI2Nvb2tpZVByZWZQb3B1cCIpLnNob3coKTsNCgkJfSwgQ09PS0lFX1BSRUZFUkVOQ0VTX1BPUFVQX0RFTEFZICk7DQoJfQ0KfQ0KDQovLyBUaGUgL21pbmlwcm9maWxlLyBpcyBjYWNoZWFibGUuIFdlIG5lZWQgdG8gc3BlY2lmeSB0aGUgb3JpZ2luIFVSTCBvZiB0aGUgcmVxdWVzdCB0byBhdm9pZCBDT1JTIHNlZSBjbCA1NzczMjEwDQpmdW5jdGlvbiBJbml0TWluaXByb2ZpbGVIb3ZlcnMoIG9yaWdpbiApDQp7DQoJdmFyICRIb3ZlciA9ICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ21pbmlwcm9maWxlX2hvdmVyJ30gKTsNCgl2YXIgJEhvdmVyQ29udGVudCA9ICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ21pbmlwcm9maWxlX2hvdmVyX2lubmVyIHNoYWRvd19jb250ZW50J30gKTsNCg0KCSRIb3Zlci5hcHBlbmQoICRKKCc8ZGl2IGNsYXNzPSJzaGFkb3dfdWwiPjwvZGl2PjxkaXYgY2xhc3M9InNoYWRvd190b3AiPjwvZGl2PjxkaXYgY2xhc3M9InNoYWRvd191ciI+PC9kaXY+PGRpdiBjbGFzcz0ic2hhZG93X2xlZnQiPjwvZGl2PjxkaXYgY2xhc3M9InNoYWRvd19yaWdodCI+PC9kaXY+PGRpdiBjbGFzcz0ic2hhZG93X2JsIj48L2Rpdj48ZGl2IGNsYXNzPSJzaGFkb3dfYm90dG9tIj48L2Rpdj48ZGl2IGNsYXNzPSJzaGFkb3dfYnIiPjwvZGl2PicpLCAkSG92ZXJDb250ZW50ICk7DQoNCgkkSG92ZXIuaGlkZSgpOw0KCSRKKGRvY3VtZW50LmJvZHkpLmFwcGVuZCggJEhvdmVyICk7DQoNCgl2YXIgZm5EYXRhRmFjdG9yeSA9IGZ1bmN0aW9uKCBrZXkgKSB7DQogICAgLy8ga2V5IGlzIGVpdGhlciBhIG51bWJlciAoYWNjb3VudGlkKSBvciBhIHN0cmluZyBvZiAiYWNjb3VudGlkX2FwcGlkIg0KCQl2YXIgcmdLZXkgPSB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiA/IGtleS5zcGxpdCggL18vICkgOiBbIGtleSBdOw0KCQl2YXIgc3RyVVJMID0gJ21pbmlwcm9maWxlLycgKyByZ0tleVswXTsNCg0KCQlpZiAoIHJnS2V5WzFdICkNCiAgICAgICAgew0KCQkJc3RyVVJMICs9ICc/YXBwaWQ9JyArIHJnS2V5WzFdOw0KDQoJCQlpZiggb3JpZ2luICkNCgkJCXsNCgkJCQlzdHJVUkwgKz0gJyZvcmlnaW49JyArIG9yaWdpbjsNCgkJCX0NCiAgICAgICAgfQ0KCQllbHNlIGlmKCBvcmlnaW4gKQ0KCQl7DQoJCQlzdHJVUkwgKz0gJz9vcmlnaW49JyArIG9yaWdpbjsNCgkJfQ0KDQoJCXJldHVybiBuZXcgQ0RlbGF5ZWRBSkFYRGF0YSggc3RyVVJMLCBNSU5JUFJPRklMRV9ERUxBWV9CRUZPUkVfQUpBWCApOw0KCX07DQoNCgl2YXIgZm5SZWFkS2V5ID0gZnVuY3Rpb24gKCAkVGFyZ2V0ICkgew0KCQl2YXIgYXBwaWQgPSAkVGFyZ2V0LnBhcmVudHMoJ1tkYXRhLW1pbmlwcm9maWxlLWFwcGlkXScpLmZpcnN0KCkuZGF0YSgnbWluaXByb2ZpbGUtYXBwaWQnKTsNCgkJaWYoIGFwcGlkICApDQoJCXsNCgkJCXJldHVybiAkVGFyZ2V0LmRhdGEoJ21pbmlwcm9maWxlJykgKyAnXycgKyBhcHBpZDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXJldHVybiAkVGFyZ2V0LmRhdGEoJ21pbmlwcm9maWxlJykNCgkJfQ0KCX07DQoNCgl2YXIgcmdDYWxsYmFja3MgPSBCaW5kQUpBWEhvdmVycyggJEhvdmVyLCAkSG92ZXJDb250ZW50LCB7DQoJCWZuRGF0YUZhY3Rvcnk6IGZuRGF0YUZhY3RvcnksDQoJCWZuUG9zaXRpb25Ib3ZlcjogUG9zaXRpb25NaW5pcHJvZmlsZUhvdmVyLA0KCQlmblJlYWRLZXk6IGZuUmVhZEtleSwNCgkJc3RyRGF0YU5hbWU6ICdtaW5pcHJvZmlsZScsDQoJCXN0clVSTE1hdGNoOiAnbWluaXByb2ZpbGUnDQoJfSAgKTsNCn0NCg0KZnVuY3Rpb24gX1JlZ2lzdGVyQUpBWEhvdmVySGlkZUZ1bmN0aW9uKCBmbkhpZGUgKQ0Kew0KCWlmICggdHlwZW9mIGdfcmdmbkhpZGVBSkFYSG92ZXIgPT0gJ3VuZGVmaW5lZCcgKQ0KCXsNCgkJZ19yZ2ZuSGlkZUFKQVhIb3ZlciA9IFtdOw0KCQkkSih3aW5kb3cpLmJsdXIoIEhpZGVBSkFYSG92ZXJzICk7DQoJfQ0KDQoJZ19yZ2ZuSGlkZUFKQVhIb3Zlci5wdXNoKCBmbkhpZGUgKTsNCn0NCg0KZnVuY3Rpb24gSGlkZUFKQVhIb3ZlcnMoKQ0Kew0KCWlmICggdHlwZW9mIGdfcmdmbkhpZGVBSkFYSG92ZXIgIT0gJ3VuZGVmaW5lZCcgKQ0KCXsNCgkJZm9yICggdmFyIGkgPSAwOyBpIDwgZ19yZ2ZuSGlkZUFKQVhIb3Zlci5sZW5ndGg7IGkrKyApDQoJCQlnX3JnZm5IaWRlQUpBWEhvdmVyW2ldKCk7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBCaW5kQUpBWEhvdmVycyggJEhvdmVyLCAkSG92ZXJDb250ZW50LCBvUGFyYW1zICkNCnsNCgl2YXIgZm5EYXRhRmFjdG9yeSA9IG9QYXJhbXMuZm5EYXRhRmFjdG9yeTsNCgl2YXIgZm5Qb3NpdGlvbkhvdmVyID0gb1BhcmFtcy5mblBvc2l0aW9uSG92ZXIgfHwgUG9zaXRpb25NaW5pcHJvZmlsZUhvdmVyOw0KCXZhciBzdHJEYXRhTmFtZSA9IG9QYXJhbXMuc3RyRGF0YU5hbWU7DQoJdmFyIHN0clVSTE1hdGNoID0gb1BhcmFtcy5zdHJVUkxNYXRjaDsNCgl2YXIgZm5SZWFkS2V5ID0gZnVuY3Rpb24oICRFbGVtZW50ICkgeyByZXR1cm4gJEVsZW1lbnQuZGF0YSggc3RyRGF0YU5hbWUgKTsgfTsNCglpZiAoIG9QYXJhbXMuZm5SZWFkS2V5ICkNCgkJZm5SZWFkS2V5ID0gb1BhcmFtcy5mblJlYWRLZXk7DQoJdmFyIHN0clNlbGVjdG9yID0gb1BhcmFtcy5zdHJTZWxlY3RvciB8fCAnW2RhdGEtJyArIHN0ckRhdGFOYW1lICsgJ10nOw0KCXZhciBuRGVsYXlCZWZvcmVTaG93ID0gb1BhcmFtcy5uRGVsYXlCZWZvcmVTaG93IHx8IE1JTklQUk9GSUxFX0RFTEFZX0JFRk9SRV9TSE9XOw0KDQoJLy8gaW5kZXhlZCBieSBhY2NvdW50aWQNCgl2YXIgcmdIb3ZlckRhdGEgPSB7fTsNCgl2YXIgSG92ZXJUYXJnZXQgPSBudWxsOw0KCXZhciB0aW1lckhvdmVyID0gbnVsbDsNCg0KCXZhciBmbk9uSG92ZXIgPSBmdW5jdGlvbiggJFRhcmdldCwga2V5ICkgew0KDQoJCXZhciBiSG92ZXJWaXNpYmxlID0gKCAkSG92ZXIuY3NzKCdkaXNwbGF5JykgIT0gJ25vbmUnICk7DQoNCgkJdmFyIEhvdmVyRGF0YSA9IHJnSG92ZXJEYXRhW2tleV07DQoJCWlmICggIUhvdmVyRGF0YSApDQoJCXsNCgkJCUhvdmVyRGF0YSA9IHJnSG92ZXJEYXRhW2tleV0gPSBmbkRhdGFGYWN0b3J5KCBrZXkgKTsNCgkJfQ0KDQoJCWlmICggSG92ZXJUYXJnZXQgPT0gSG92ZXJEYXRhICYmIGJIb3ZlclZpc2libGUgKQ0KCQl7DQoJCQkvL3JlYWxseSBvbmx5IHdhbnQgdG8gZG8gdGhpcyB3aGlsZSBmYWRpbmcgb3V0DQoJCQkkSG92ZXIuc3RvcCgpOw0KCQkJZm5Qb3NpdGlvbkhvdmVyKCAkSG92ZXIsICRUYXJnZXQgKTsNCgkJCSRIb3Zlci5zaG93KCk7CS8vIFBvc2l0aW9uTWluaXByb2ZpbGUgdG9nZ2xlcyB2aXNpYmlsaXR5DQoJCQkkSG92ZXIuZmFkZVRvKCBNSU5JUFJPRklMRV9BTklNX1NQRUVELCAxLjAgKTsNCgkJfQ0KCQllbHNlIGlmICggIXRpbWVySG92ZXIgfHwgSG92ZXJEYXRhICE9IEhvdmVyVGFyZ2V0ICkNCgkJew0KCQkJLy8gdGhpcyBpcyB0aGUgbmV3IHRhcmdldA0KCQkJaWYgKCBIb3ZlclRhcmdldCAmJiBIb3ZlclRhcmdldCAhPSBIb3ZlckRhdGEgKQ0KCQkJCUhvdmVyVGFyZ2V0LkNhbmNlbEFKQVgoKTsNCgkJCUhvdmVyVGFyZ2V0ID0gSG92ZXJEYXRhOw0KDQoJCQlpZiAoIHRpbWVySG92ZXIgKQ0KCQkJew0KCQkJCXdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVySG92ZXIgKTsNCgkJCQl0aW1lckhvdmVyID0gbnVsbDsNCgkJCX0NCg0KCQkJSG92ZXJEYXRhLlF1ZXVlQWpheFJlcXVlc3RJZk5lY2Vzc2FyeSgpOw0KDQoJCQl0aW1lckhvdmVyID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgew0KCQkJCXdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVySG92ZXIgKTsNCgkJCQl0aW1lckhvdmVyID0gbnVsbDsNCg0KCQkJCUhvdmVyRGF0YS5SdW5XaGVuQUpBWFJlYWR5KCBmdW5jdGlvbigpIHsNCgkJCQkJSG92ZXJEYXRhLlNob3coICRIb3ZlckNvbnRlbnQgKTsNCgkJCQkJJEhvdmVyLnN0b3AoKTsNCgkJCQkJJEhvdmVyLmNzcyggJ29wYWNpdHknLCAnJyApOyAvL2NsZWFuIHVwIGpxdWVyeSBhbmltYXRpb24NCgkJCQkJZm5Qb3NpdGlvbkhvdmVyKCAkSG92ZXIsICRUYXJnZXQgKTsNCgkJCQkJJEhvdmVyLmZhZGVJbiggTUlOSVBST0ZJTEVfQU5JTV9TUEVFRCApOw0KCQkJCQl2YXIgdmlkZW9FbGVtID0gJEhvdmVyLmZpbmQoICd2aWRlbycgKTsNCgkJCQkJaWYgKCB2aWRlb0VsZW0ubGVuZ3RoICE9IDAgKQ0KCQkJCQl7DQoJCQkJCQl2YXIgcGxheVByb21pc2UgPSB2aWRlb0VsZW1bMF0ucGxheSgpOw0KCQkJCQkJaWYgKCBwbGF5UHJvbWlzZSApDQoJCQkJCQl7DQoJCQkJCQkJcGxheVByb21pc2UuY2F0Y2goIGZ1bmN0aW9uKCBlICkgew0KCQkJCQkJCX0gKTsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCX0gKTsNCgkJCX0sIG5EZWxheUJlZm9yZVNob3cgKTsNCgkJfQ0KCX07DQoNCgl2YXIgZm5DYW5jZWxIb3ZlciA9IGZ1bmN0aW9uKCBrZXkgKQ0KCXsNCgkJdmFyIGJIb3ZlclZpc2libGUgPSAoICRIb3Zlci5jc3MoJ2Rpc3BsYXknKSAhPSAnbm9uZScgKTsNCg0KCQlpZiAoIGtleSApDQoJCXsNCgkJCXZhciBIb3ZlckRhdGEgPSByZ0hvdmVyRGF0YVtrZXldOw0KCQkJaWYgKCBIb3ZlckRhdGEgKQ0KCQkJew0KCQkJCUhvdmVyRGF0YS5DYW5jZWxBSkFYKCk7DQoJCQl9DQoJCX0NCg0KCQlpZiAoIHRpbWVySG92ZXIgKQ0KCQl7DQoJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lckhvdmVyICk7DQoJCQl0aW1lckhvdmVyID0gbnVsbDsNCgkJfQ0KDQoJCWlmICggYkhvdmVyVmlzaWJsZSApDQoJCXsNCgkJCSRIb3Zlci5zdG9wKCk7DQoJCQkkSG92ZXIuZmFkZU91dCggTUlOSVBST0ZJTEVfQU5JTV9TUEVFRCApOw0KCQl9DQoJfTsNCg0KCXZhciBzdHJFdmVudE5hbWVzcGFjZSA9ICdBamF4SG92ZXInICsgc3RyRGF0YU5hbWU7DQoJJEooZG9jdW1lbnQgKS5vbiggJ21vdXNlZW50ZXIuJyArIHN0ckV2ZW50TmFtZXNwYWNlICsgJyB0b3VjaGVuZC4nICsgc3RyRXZlbnROYW1lc3BhY2UsIHN0clNlbGVjdG9yLCBmdW5jdGlvbihlKSB7DQoJCXZhciAkVGFyZ2V0ID0gJEoodGhpcyk7DQoJCWZuT25Ib3ZlciggJFRhcmdldCwgZm5SZWFkS2V5KCAkVGFyZ2V0KSApOw0KDQoJCS8vIFByZXZlbnQgY2xpY2sgaWYgd2UncmUgc3RpY2t5DQoJCWlmICggdHlwZW9mICRUYXJnZXQuZGF0YSgnc3RpY2t5aG92ZXInKSAhPT0gJ3VuZGVmaW5lZCcgKQ0KCQl7DQoJCQllLnByZXZlbnREZWZhdWx0KCk7DQoJCX0NCgl9ICk7DQoJJEooZG9jdW1lbnQgKS5vbiggJ2NsaWNrLicgKyBzdHJFdmVudE5hbWVzcGFjZSArICcgbW91c2VsZWF2ZS4nICsgc3RyRXZlbnROYW1lc3BhY2UsIHN0clNlbGVjdG9yLCBmdW5jdGlvbihlKSB7DQoJCXZhciAkVGFyZ2V0ID0gJEoodGhpcyk7DQoNCgkJLy8gQ2FuY2VsIGlmIHdlJ3JlIG5vdCBzdGlja3kNCgkJaWYgKCB0eXBlb2YgJFRhcmdldC5kYXRhKCdzdGlja3lob3ZlcicpID09ICd1bmRlZmluZWQnICkNCgkJew0KCQkJZm5DYW5jZWxIb3ZlcigpOw0KCQl9DQoJfSApOw0KCS8vIENhbmNlbCB3aGVuIGNsaWNraW5nL3RvdWNoaW5nIGVsc2V3aGVyZSByZWdhcmRsZXNzIGlmIHN0aWNreQ0KCSRKKGRvY3VtZW50ICkub24oICdjbGljaycsIG51bGwsIGZuQ2FuY2VsSG92ZXIgKTsNCg0KCS8vIHJlZ2lzdGVyIHRoaXMgaG92ZXIgc28gSGlkZUFKQVhIb3ZlcnMoKSBjYW4gaGlkZSBpdCB3aGVuIGludm9rZWQNCglfUmVnaXN0ZXJBSkFYSG92ZXJIaWRlRnVuY3Rpb24oIGZuQ2FuY2VsSG92ZXIgKTsNCg0KCXJldHVybiB7DQoJCWZuQ2FuY2VsSG92ZXI6IGZuQ2FuY2VsSG92ZXINCgl9Ow0KfQ0KDQpmdW5jdGlvbiBQb3NpdGlvbk1pbmlwcm9maWxlSG92ZXIoICRIb3ZlciwgJFRhcmdldCwgb1BhcmFtcyApDQp7DQoJaWYgKCAhb1BhcmFtcyApDQoJCW9QYXJhbXMgPSB7fTsNCgl2YXIgYlByZWZlclJpZ2h0U2lkZSA9IG9QYXJhbXMuYlByZWZlclJpZ2h0U2lkZSB8fCBmYWxzZTsNCgl2YXIgblB4QXJyb3dPdmVybGFwID0gKCBvUGFyYW1zLm5QeEFycm93T3ZlcmxhcCAhPSB1bmRlZmluZWQgKSA/IG9QYXJhbXMublB4QXJyb3dPdmVybGFwIDogMjsNCg0KCSRIb3Zlci5jc3MoICd2aXNpYmlsaXR5JywgJ2hpZGRlbicgKTsNCgkkSG92ZXIuc2hvdygpOw0KDQoJdmFyIG9mZnNldCA9ICRUYXJnZXQub2Zmc2V0KCk7DQoJJEhvdmVyLmNzcyggJ2xlZnQnLCBvZmZzZXQubGVmdCArICdweCcgKTsNCgkkSG92ZXIuY3NzKCAndG9wJywgb2Zmc2V0LnRvcCArICdweCcpOw0KDQoJdmFyICRIb3ZlckJveCA9ICRIb3Zlci5jaGlsZHJlbiggJy5zaGFkb3dfY29udGVudCcgKTsNCglpZiAoICEkSG92ZXJCb3gubGVuZ3RoICkNCgkJJEhvdmVyQm94ID0gJEooICRIb3Zlci5jaGlsZHJlbigpWzBdICk7DQoNCgl2YXIgJEhvdmVyQXJyb3dMZWZ0ID0gJEhvdmVyLmNoaWxkcmVuKCAnLmhvdmVyX2Fycm93LmxlZnQnICk7DQoJdmFyICRIb3ZlckFycm93UmlnaHQgPSAkSG92ZXIuY2hpbGRyZW4oICcuaG92ZXJfYXJyb3cucmlnaHQnICk7DQoNCgl2YXIgbldpbmRvd1Njcm9sbFRvcCA9ICRKKHdpbmRvdykuc2Nyb2xsVG9wKCk7DQoJdmFyIG5XaW5kb3dTY3JvbGxMZWZ0ID0gJEood2luZG93KS5zY3JvbGxMZWZ0KCk7DQoJdmFyIG5WaWV3cG9ydFdpZHRoID0gJEood2luZG93KS53aWR0aCgpOw0KCXZhciBuVmlld3BvcnRIZWlnaHQgPSAkSih3aW5kb3cpLmhlaWdodCgpOw0KDQoJCXZhciAkSG92ZXJBcnJvdyA9ICRIb3ZlckFycm93UmlnaHQ7DQoJdmFyIG5Cb3hSaWdodFZpZXdwb3J0ID0gKCBvZmZzZXQubGVmdCAtIG5XaW5kb3dTY3JvbGxMZWZ0ICkgKyAkVGFyZ2V0Lm91dGVyV2lkdGgoKSArICRIb3ZlckJveC53aWR0aCgpICsgMTQ7DQoJdmFyIG5TcGFjZVJpZ2h0ID0gblZpZXdwb3J0V2lkdGggLSBuQm94UmlnaHRWaWV3cG9ydDsNCgl2YXIgblNwYWNlTGVmdCA9IG9mZnNldC5sZWZ0IC0gJEhvdmVyLndpZHRoKCk7DQoJaWYgKCAoICggblNwYWNlTGVmdCA+IDAgfHwgblNwYWNlTGVmdCA+IG5TcGFjZVJpZ2h0ICkgJiYgIWJQcmVmZXJSaWdodFNpZGUgKSB8fCAoIGJQcmVmZXJSaWdodFNpZGUgJiYgblNwYWNlUmlnaHQgPCAxNCAmJiBuU3BhY2VMZWZ0ID4gblNwYWNlUmlnaHQgKSApDQoJew0KCQkJCSRIb3Zlci5jc3MoICdsZWZ0JywgKCBvZmZzZXQubGVmdCAtICRIb3Zlci53aWR0aCgpICsgblB4QXJyb3dPdmVybGFwICsgMyApICsgJ3B4JyApOw0KCQkkSG92ZXJBcnJvd0xlZnQuaGlkZSgpOw0KCQkkSG92ZXJBcnJvd1JpZ2h0LnNob3coKTsNCgl9DQoJZWxzZQ0KCXsNCgkJCQkkSG92ZXIuY3NzKCAnbGVmdCcsICggb2Zmc2V0LmxlZnQgKyAkVGFyZ2V0Lm91dGVyV2lkdGgoKSAtIG5QeEFycm93T3ZlcmxhcCApICsgJ3B4JyApOw0KCQkkSG92ZXJBcnJvdyA9ICRIb3ZlckFycm93TGVmdDsNCgkJJEhvdmVyQXJyb3dMZWZ0LnNob3coKTsNCgkJJEhvdmVyQXJyb3dSaWdodC5oaWRlKCk7DQoJfQ0KDQoJdmFyIG5Ub3BBZGp1c3RtZW50ID0gMDsNCg0KCQkJaWYgKCAkVGFyZ2V0LmhlaWdodCgpIDwgNDggKQ0KCQluVG9wQWRqdXN0bWVudCA9IE1hdGguZmxvb3IoICRUYXJnZXQuaGVpZ2h0KCkgLyAyICkgLSAyNDsNCgl2YXIgbkRlc2lyZWRIb3ZlclRvcCA9IG9mZnNldC50b3AgLSAxNSArIG5Ub3BBZGp1c3RtZW50Ow0KCSRIb3Zlci5jc3MoICd0b3AnLCBuRGVzaXJlZEhvdmVyVG9wICsgJ3B4JyApOw0KDQoJLy8gc2VlIGlmIHRoZSBob3ZlciBpcyBjdXQgb2ZmIGJ5IHRoZSBib3R0b20gb2YgdGhlIHdpbmRvdywgYW5kIGJ1bXAgaXQgdXAgaWYgbmVjY2Vzc2FyeQ0KCXZhciBuVGFyZ2V0VG9wVmlld3BvcnQgPSAoIG9mZnNldC50b3AgLSBuV2luZG93U2Nyb2xsVG9wICkgKyBuVG9wQWRqdXN0bWVudDsNCglpZiAoIG5UYXJnZXRUb3BWaWV3cG9ydCArICRIb3ZlckJveC5oZWlnaHQoKSArIDM1ID4gblZpZXdwb3J0SGVpZ2h0ICkNCgl7DQoJCXZhciBuVmlld3BvcnRBZGp1c3RtZW50ID0gKCAkSG92ZXJCb3guaGVpZ2h0KCkgKyAzNSApIC0gKCBuVmlld3BvcnRIZWlnaHQgLSBuVGFyZ2V0VG9wVmlld3BvcnQgKTsNCg0KCQkvLyBpZiB0aGUgaG92ZXIgaGFzIHRoZSAiaW4tZ2FtZSIgYmxvY2sgYXQgdGhlIGJvdHRvbSwgd2UgbmVlZCB0byBoYXZlIG1vcmUgc3BhY2UgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaG92ZXINCgkJLy8Jc28gdGhhdCB0aGUgYXJyb3cgd2lsbCBhcHBlYXIgaW4gdGhlIGJsdWUgcGFydCBvZiB0aGUgaG92ZXIuICBUaGlzIG1lYW5zIHRoZSBnYW1lIGluZm8gbWF5IGJlIG9mZi1zY3JlZW4gYmVsb3cuDQoJCXZhciBiSGF2ZUluR2FtZUluZm8gPSAkSG92ZXJCb3guZmluZCgnLm1pbmlwcm9maWxlX2luZ2FtZScpLmxlbmd0aCA+IDA7DQoJCXZhciBuSG92ZXJCb3hCb3R0b21NaW5pbXVtID0gKCBiSGF2ZUluR2FtZUluZm8gPyA3OCA6IDI0ICk7CS8vIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBzcGFjZSB3ZSBuZWVkIGJlbG93IHRoZSBhcnJvdw0KCQluVmlld3BvcnRBZGp1c3RtZW50ID0gTWF0aC5taW4oICRIb3ZlckJveC5oZWlnaHQoKSAtIG5Ib3ZlckJveEJvdHRvbU1pbmltdW0sIG5WaWV3cG9ydEFkanVzdG1lbnQgKTsNCg0KCQl2YXIgblZpZXdwb3J0QWRqdXN0ZWRIb3ZlclRvcCA9IG9mZnNldC50b3AgLSBuVmlld3BvcnRBZGp1c3RtZW50Ow0KCQkkSG92ZXIuY3NzKCAndG9wJywgblZpZXdwb3J0QWRqdXN0ZWRIb3ZlclRvcCArICdweCcgKTsNCg0KCQkvLyBhcnJvdyBpcyBub3JtYWxseSBvZmZzZXQgMzBwaXhlbHMuICB3ZSBtb3ZlIGl0IGRvd24gdGhlIHNhbWUgZGlzdGFuY2Ugd2UgbW92ZWQgdGhlIGhvdmVyIHVwLCBzbyBpdCBpcyAiZml4ZWQiIHRvIHdoZXJlIGl0IHdhcyBpbml0aWFsbHkNCgkJJEhvdmVyQXJyb3cuY3NzKCAndG9wJywgKCAzMCArIG5EZXNpcmVkSG92ZXJUb3AgLSBuVmlld3BvcnRBZGp1c3RlZEhvdmVyVG9wICkgKyAncHgnICk7DQoJfQ0KCWVsc2UNCgl7DQoJCSRIb3ZlckFycm93LmNzcyggJ3RvcCcsICcnICk7DQoJfQ0KDQoJJEhvdmVyLmhpZGUoKTsNCgkkSG92ZXIuY3NzKCAndmlzaWJpbGl0eScsICcnICk7DQp9DQoNCg0KLyogRW1vdGljb24gaG92ZXJzICovDQoNCmZ1bmN0aW9uIENFbW90aWNvbkRlbGF5ZWRBSkFYRGF0YSggc3RyRW1vdGljb25OYW1lLCBtc0RlbGF5QmVmb3JlQUpBWCApDQp7DQoJQ0RlbGF5ZWRBSkFYRGF0YS5hcHBseSggdGhpcywgWyAnZWNvbm9teS9lbW90aWNvbmhvdmVyLycgKyBzdHJFbW90aWNvbk5hbWUgKyAnL2pzb25wLmpzJywgbXNEZWxheUJlZm9yZUFKQVggXSk7DQoJdGhpcy5tX3N0ckVtb3RpY29uTmFtZSA9IHN0ckVtb3RpY29uTmFtZTsNCn0NCg0KLy8gc3ViY2xhc3MgQ0RlbGF5ZWRBSkFYRGF0YSBzbyB3ZSBjYW4gcmVxdWVzdCB2aWEgSlNPTlANCkNFbW90aWNvbkRlbGF5ZWRBSkFYRGF0YS5wcm90b3R5cGUgPSBuZXcgQ0RlbGF5ZWRBSkFYRGF0YTsNCkNFbW90aWNvbkRlbGF5ZWRBSkFYRGF0YS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDRW1vdGljb25EZWxheWVkQUpBWERhdGE7DQoNCkNFbW90aWNvbkRlbGF5ZWRBSkFYRGF0YS5wcm90b3R5cGUuR2V0QUpBWFBhcmFtcyA9IGZ1bmN0aW9uKCkNCnsNCglyZXR1cm4gew0KCQl1cmw6ICdodHRwczovL2NvbW11bml0eS5ha2FtYWkuc3RlYW1zdGF0aWMuY29tLycgKyB0aGlzLm1fc3RyVVJMLA0KCQlkYXRhVHlwZTogJ2pzb25wJywNCgkJanNvbnBDYWxsYmFjazogJ09uTG9hZEVtb3RpY29uXycgKyB0aGlzLm1fc3RyRW1vdGljb25OYW1lLAkvL2NvbnNpc3RlbnQgbmFtZSBmb3IgY2FjaGFiaWxpdHkNCgkJY2FjaGU6IHRydWUsDQoJCWRhdGE6IHtsOiAnZW5nbGlzaCcgfQ0KCX0NCn07DQoNCmZ1bmN0aW9uIEluaXRFbW90aWNvbkhvdmVycygpDQp7DQoJdmFyICRIb3ZlciA9ICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ2Vtb3RpY29uX2hvdmVyJ30gKTsNCgl2YXIgJEhvdmVyQ29udGVudCA9ICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ2Vtb3RpY29uX2hvdmVyX2NvbnRlbnQnfSApOw0KCSRIb3Zlci5hcHBlbmQoICRIb3ZlckNvbnRlbnQsICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ2hvdmVyX2Fycm93IGxlZnQgZW1vdGljb25faG92ZXJfYXJyb3cnIH0gKSwgJEooJzxkaXYvPicsIHsnY2xhc3MnOiAnaG92ZXJfYXJyb3cgcmlnaHQgZW1vdGljb25faG92ZXJfYXJyb3cnIH0gKSApOw0KCSRIb3Zlci5oaWRlKCk7DQoNCgl2YXIgZm5PbmVUaW1lRW1vdGljb25TZXR1cCA9IGZ1bmN0aW9uKCkgew0KCQkkSihkb2N1bWVudC5ib2R5KS5hcHBlbmQoICRIb3ZlciApOw0KCX07DQoNCgl2YXIgZm5SZWFkS2V5ID0gZnVuY3Rpb24gKCAkRWxlbWVudCApIHsNCgkJaWYgKCAkRWxlbWVudC5kYXRhKCdlbW90aWNvbicpICkNCgkJew0KCQkJcmV0dXJuICRFbGVtZW50LmRhdGEoJ2Vtb3RpY29uJyk7DQoJCX0NCgkJZWxzZSBpZiAoICRFbGVtZW50LmF0dHIoICdzcmMnICkgKQ0KCQl7DQoJCQl2YXIgcmdNYXRjaGVzID0gJEVsZW1lbnQuYXR0ciggJ3NyYycgKS5tYXRjaCggJ2Vtb3RpY29uLyguKikkJyApOw0KCQkJaWYgKCByZ01hdGNoZXMgJiYgcmdNYXRjaGVzWzFdICkNCgkJCXsNCgkJCQl2YXIgc3RyRW1vdGljb24gPSByZ01hdGNoZXNbMV07DQoJCQkJaWYgKCBzdHJFbW90aWNvbi5sZW5ndGggPiAxICkNCgkJCQl7DQoJCQkJCWlmICggc3RyRW1vdGljb25bMF0gPT0gJzonICkNCgkJCQkJCXN0ckVtb3RpY29uID0gc3RyRW1vdGljb24uc3Vic3RyKCAxICk7DQoJCQkJCWlmICggc3RyRW1vdGljb25bIHN0ckVtb3RpY29uLmxlbmd0aCAtIDEgXSA9PSAnOicgKQ0KCQkJCQkJc3RyRW1vdGljb24gPSBzdHJFbW90aWNvbi5zdWJzdHIoIDAsIHN0ckVtb3RpY29uLmxlbmd0aCAtIDEgKTsNCgkJCQl9DQoJCQkJcmV0dXJuIHN0ckVtb3RpY29uOw0KCQkJfQ0KCQl9DQoNCgkJcmV0dXJuIG51bGw7DQoJfTsNCg0KCXZhciBmbkRhdGFGYWN0b3J5ID0gZnVuY3Rpb24oIGtleSApCXsNCgkJaWYgKCBmbk9uZVRpbWVFbW90aWNvblNldHVwICkNCgkJew0KCQkJZm5PbmVUaW1lRW1vdGljb25TZXR1cCgpOw0KCQkJZm5PbmVUaW1lRW1vdGljb25TZXR1cCA9IG51bGw7DQoJCX0NCg0KCQlyZXR1cm4gbmV3IENFbW90aWNvbkRlbGF5ZWRBSkFYRGF0YSgga2V5LCA1MCApOw0KCX07DQoNCgl2YXIgcmdDYWxsYmFja3MgPSBCaW5kQUpBWEhvdmVycyggJEhvdmVyLCAkSG92ZXJDb250ZW50LCB7DQoJCWZuRGF0YUZhY3Rvcnk6IGZuRGF0YUZhY3RvcnksDQoJCWZuUG9zaXRpb25Ib3ZlcjogZnVuY3Rpb24oICRIb3ZlciwgJFRhcmdldCApIHsNCgkJCVBvc2l0aW9uTWluaXByb2ZpbGVIb3ZlciggJEhvdmVyLCAkVGFyZ2V0LCB7DQoJCQkJYlByZWZlclJpZ2h0U2lkZTogdHJ1ZSwNCgkJCQluUHhBcnJvd092ZXJsYXA6IDANCgkJCX0gKTsNCgkJCS8vc2xpZGUgaXQgZG93biBhIGxpdHRsZSBmb3IgZW1vdGljb24gb3B0aW9uIHBvcHVwDQoJCQlpZiAoICRUYXJnZXQuaGFzQ2xhc3MoJ2Vtb3RpY29uX29wdGlvbicpICkNCgkJCQkkSG92ZXIuY3NzKCAndG9wJywgcGFyc2VJbnQoICRIb3Zlci5jc3MoJ3RvcCcpICkgKyA1ICk7DQoJCX0sDQoJCWZuUmVhZEtleTogZm5SZWFkS2V5LA0KCQlzdHJTZWxlY3RvcjogJ2ltZy5lbW90aWNvbicsDQoJCXN0clVSTE1hdGNoOiAnZW1vdGljb25ob3ZlcicsDQoJCW5EZWxheUJlZm9yZVNob3c6IDUwDQoJfSApOw0KDQoJd2luZG93LkRpc21pc3NFbW90aWNvbkhvdmVyID0gcmdDYWxsYmFja3MuZm5DYW5jZWxIb3ZlcjsNCn0NCg0KZnVuY3Rpb24gVl9Fc2NhcGVSZWdFeHAoIHN0ciApDQp7DQoJcmV0dXJuIHN0ci5yZXBsYWNlKCAvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyApOw0KfQ0KDQpmdW5jdGlvbiBWX0VzY2FwZUhUTUwoIHN0ciApDQp7DQoJcmV0dXJuIFN0cmluZyhzdHIpLnJlcGxhY2UoIC8mL2csICcmYW1wOycgKS5yZXBsYWNlKCAvWyJdL2csICcmcXVvdDsnICkucmVwbGFjZSggL1snXS9nLCAnJiMzOTsnICkucmVwbGFjZSggLzwvZywgJyZsdDsnKS5yZXBsYWNlKCAvPi9nLCAnJmd0OycpOw0KfQ0KDQpmdW5jdGlvbiB2X3RyaW0oIHN0ciApDQp7DQoJaWYgKCBzdHIudHJpbSApDQoJCXJldHVybiBzdHIudHJpbSgpOw0KCWVsc2UNCgl7DQoJCXJldHVybiBzdHIucmVwbGFjZSgvXlxzKy8sICcnKS5yZXBsYWNlKC9ccyskLywgJycpOw0KCX0NCn0NCg0KZnVuY3Rpb24gVl9QYXJzZUpTT04oIHN0ciApDQp7DQoJaWYgKCB0eXBlb2YgSlNPTiA9PSAnb2JqZWN0JyAmJiBKU09OLnBhcnNlICkNCgkJcmV0dXJuIEpTT04ucGFyc2UoIHN0ciApOwkvLyBidWlsdC1pbiAvIGpzb24yLmpzDQoJZWxzZQ0KCQlzdHIuZXZhbEpTT04oKTsJCQkJLy8gcHJvdG90eXBlDQp9DQoNCmZ1bmN0aW9uIFZfVG9KU09OKCBvYmplY3QgKQ0Kew0KCWlmICggdHlwZW9mIEpTT04gPT0gJ29iamVjdCcgJiYgSlNPTi5zdHJpbmdpZnkgKQ0KCQlyZXR1cm4gSlNPTi5zdHJpbmdpZnkoIG9iamVjdCApOwkvLyBidWlsdC1pbiAvIGpzb24yLmpzDQoJZWxzZQ0KCQlPYmplY3QudG9KU09OKCBvYmplY3QgKTsJCQkJLy8gcHJvdG90eXBlDQp9DQoNCmZ1bmN0aW9uIFZfSXNKU09OKCBzdHIgKQ0Kew0KCXRyeQ0KCXsNCgkJaWYoIHR5cGVvZiBKU09OID09ICdvYmplY3QnICYmIEpTT04ucGFyc2UgKQ0KCQl7DQoJCQl2YXIgbyA9IEpTT04ucGFyc2Uoc3RyKTsNCgkJCWlmICggbyAhPT0gbnVsbCApDQoJCQkJcmV0dXJuIHRydWU7DQoNCgkJfSBlbHNlIHsNCgkJCXJldHVybiBzdHIuaXNKU09OKCk7DQoJCX0NCgl9DQoJY2F0Y2ggKGUpIHsgfQ0KCXJldHVybiBmYWxzZTsNCn0NCg0KDQpmdW5jdGlvbiBWX0dldENvb2tpZSggc3RyQ29va2llTmFtZSApDQp7DQoJdmFyIHJnTWF0Y2hlcyA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaCggJyhefDsgKScgKyBzdHJDb29raWVOYW1lICsgJz0oW147XSopJyApOw0KCWlmICggcmdNYXRjaGVzICYmIHJnTWF0Y2hlc1syXSApDQoJCXJldHVybiByZ01hdGNoZXNbMl07DQoJZWxzZQ0KCQlyZXR1cm4gbnVsbDsNCn0NCg0KDQpmdW5jdGlvbiBWX0dldERlY29kZWRDb29raWUoIHN0ckNvb2tpZU5hbWUgKQ0Kew0KCXZhciB2YWx1ZSA9IFZfR2V0Q29va2llKCBzdHJDb29raWVOYW1lICk7DQoJcmV0dXJuIHZhbHVlICYmIGRlY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTsNCn0NCg0KZnVuY3Rpb24gVl9TZXRDb29raWUoIHN0ckNvb2tpZU5hbWUsIHN0clZhbHVlLCBleHBpcnlJbkRheXMsIHBhdGggKQ0Kew0KCWlmICggIXBhdGggKQ0KCQlwYXRoID0gJy8nOw0KDQoJdmFyIHN0ckRhdGUgPSAnJzsNCg0KCWlmKCB0eXBlb2YgZXhwaXJ5SW5EYXlzICE9ICd1bmRlZmluZWQnICYmIGV4cGlyeUluRGF5cyApDQoJew0KCQl2YXIgZGF0ZUV4cGlyZXMgPSBuZXcgRGF0ZSgpOw0KCQlkYXRlRXhwaXJlcy5zZXRUaW1lKCBkYXRlRXhwaXJlcy5nZXRUaW1lKCkgKyAxMDAwICogNjAgKiA2MCAqIDI0ICogZXhwaXJ5SW5EYXlzICk7DQoJCXN0ckRhdGUgPSAnOyBleHBpcmVzPScgKyBkYXRlRXhwaXJlcy50b0dNVFN0cmluZygpOw0KCX0NCg0KCWRvY3VtZW50LmNvb2tpZSA9IHN0ckNvb2tpZU5hbWUgKyAnPScgKyBzdHJWYWx1ZSArIHN0ckRhdGUgKyAnO3BhdGg9JyArIHBhdGg7DQp9DQoNCmZ1bmN0aW9uIF9HZXRTdG9yYWdlRnJvbUNvb2tpZSgpDQp7DQoJdmFyIG9TdG9yYWdlID0ge307DQoNCgl2YXIgc3RyU3RvcmFnZUpTT04gPSBWX0dldENvb2tpZSggJ3N0b3JhZ2UnICk7DQoJaWYgKCBzdHJTdG9yYWdlSlNPTiApDQoJew0KCQl0cnkgew0KCQkJb1N0b3JhZ2UgPSBWX1BhcnNlSlNPTihkZWNvZGVVUklDb21wb25lbnQoc3RyU3RvcmFnZUpTT04pKTsNCgkJfQ0KCQljYXRjaCAoZSkgew0KCQkJb1N0b3JhZ2UgPSB7fTsNCgkJfQ0KCX0NCg0KCXJldHVybiBvU3RvcmFnZTsNCn0NCg0KZnVuY3Rpb24gQkluc2lkZUlGcmFtZSgpDQp7DQoJdHJ5DQoJew0KCQlyZXR1cm4gd2luZG93LnNlbGYgIT09IHdpbmRvdy50b3A7DQoJfQ0KCWNhdGNoKCBlICkNCgl7DQoJCXJldHVybiB0cnVlOw0KCX0NCn0NCg0KZnVuY3Rpb24gU2V0VmFsdWVMb2NhbFN0b3JhZ2UoIHN0clByZWZlcmVuY2VOYW1lLCB2YWx1ZSApDQp7DQoJaWYgKCAhQkluc2lkZUlGcmFtZSgpICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UgKQ0KCXsNCgkJd2luZG93LmxvY2FsU3RvcmFnZVtzdHJQcmVmZXJlbmNlTmFtZV0gPSB2YWx1ZTsNCgl9DQoJZWxzZQ0KCXsNCgkJdmFyIG9TdG9yYWdlID0gX0dldFN0b3JhZ2VGcm9tQ29va2llKCk7DQoNCgkJb1N0b3JhZ2Vbc3RyUHJlZmVyZW5jZU5hbWVdID0gdmFsdWU7DQoNCgkJVl9TZXRDb29raWUoICdzdG9yYWdlJywgZW5jb2RlVVJJQ29tcG9uZW50KCBWX1RvSlNPTiggb1N0b3JhZ2UgKSApLCAzNjUgKQ0KCX0NCn0NCg0KZnVuY3Rpb24gVW5zZXRWYWx1ZUxvY2FsU3RvcmFnZSggc3RyUHJlZmVyZW5jZU5hbWUgKQ0Kew0KCWlmICggIUJJbnNpZGVJRnJhbWUoKSAmJiB3aW5kb3cubG9jYWxTdG9yYWdlICkNCgl7DQoJCWRlbGV0ZSB3aW5kb3cubG9jYWxTdG9yYWdlW3N0clByZWZlcmVuY2VOYW1lXTsNCgl9DQoJZWxzZQ0KCXsNCgkJdmFyIG9TdG9yYWdlID0gX0dldFN0b3JhZ2VGcm9tQ29va2llKCk7DQoNCgkJZGVsZXRlIG9TdG9yYWdlW3N0clByZWZlcmVuY2VOYW1lXTsNCg0KCQlWX1NldENvb2tpZSggJ3N0b3JhZ2UnLCBlbmNvZGVVUklDb21wb25lbnQoIFZfVG9KU09OKCBvU3RvcmFnZSApICksIDM2NSApDQoJfQ0KfQ0KDQpmdW5jdGlvbiBHZXRWYWx1ZUxvY2FsU3RvcmFnZSggc3RyUHJlZmVyZW5jZU5hbWUsIGRlZmF1bHRWYWx1ZSApDQp7DQoJaWYgKCAhQkluc2lkZUlGcmFtZSgpICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UgKQ0KCXsNCgkJcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RyUHJlZmVyZW5jZU5hbWVdIHx8IGRlZmF1bHRWYWx1ZTsNCgl9DQoJZWxzZQ0KCXsNCgkJdmFyIG9TdG9yYWdlID0gX0dldFN0b3JhZ2VGcm9tQ29va2llKCk7DQoNCgkJcmV0dXJuIG9TdG9yYWdlW3N0clByZWZlcmVuY2VOYW1lXSB8fCBkZWZhdWx0VmFsdWU7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBEeW5hbWljTGlua19QbGF5WW91VHViZVZpZGVvSW5saW5lKCBlbGVtLCB2aWRlb2lkICkNCnsNCgl2YXIgZWwgPSAkSihlbGVtKTsNCgl2YXIgeW91dHViZXVybCA9IGxvY2F0aW9uLnByb3RvY29sICsgJy8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLycgKyB2aWRlb2lkICsgJz9zaG93aW5mbz0wJmF1dG9oaWRlPTEmZnM9MSZoZD0xJm1vZGVzdGJyYW5kaW5nPTEmcmVsPTAmc2hvd3NlYXJjaD0wJndtb2RlPWRpcmVjdCZhdXRvcGxheT0xJzsNCgl2YXIgd3JhcHBlciA9ICRKKCAnPGRpdi8+JywgeyAnY2xhc3MnOiAnZHluYW1pY2xpbmtfeW91dHViZXZpZXd2aWRlbycgfSApOw0KCXZhciBlbWJlZF93cmFwcGVyID0gJEooICc8ZGl2Lz4nLCB7ICdjbGFzcycgOiAnZHluYW1pY2xpbmtfeW91dHViZXZpZXd2aWRlb2VtYmVkZGVkJywgJ2ZyYW1lYm9yZGVyJyA6ICcwJyB9ICk7DQoJdmFyIGlmcmFtZUNvbnRlbnQgPSAkSiggJzxpZnJhbWUvPicsIHsgJ2ZyYW1lYm9yZGVyJyA6ICcwJywgc3JjOiB5b3V0dWJldXJsLCAnYWxsb3dmdWxsc2NyZWVuJzogJycgfSApOw0KCWlmICggZWwubGVuZ3RoICkNCgl7DQoJCWVtYmVkX3dyYXBwZXIuYXBwZW5kKCBpZnJhbWVDb250ZW50ICk7DQoJCXdyYXBwZXIuYXBwZW5kKCBlbWJlZF93cmFwcGVyICk7DQoJCWVsLmFmdGVyKCB3cmFwcGVyICk7DQoJCWVsLnJlbW92ZSgpOw0KCX0NCn0NCg0KZnVuY3Rpb24gRHluYW1pY0xpbmtfUGxheVZpbWVvVmlkZW9JbmxpbmUoIGVsZW0sIHZpZGVvaWQgKQ0Kew0KCXZhciBlbCA9ICRKKGVsZW0pOw0KCXZhciB2aWRlb3VybCA9ICdodHRwczovL3BsYXllci52aW1lby5jb20vdmlkZW8vJyArIHZpZGVvaWQgKyAnP2JhZGdlPTAmYXV0b3BhdXNlPTAmYXV0b3BsYXk9MSZwbGF5ZXJfaWQ9MCc7DQoJdmFyIHdyYXBwZXIgPSAkSiggJzxkaXYvPicsIHsgJ2NsYXNzJzogJ2R5bmFtaWNsaW5rX3lvdXR1YmV2aWV3dmlkZW8nIH0gKTsNCgl2YXIgZW1iZWRfd3JhcHBlciA9ICRKKCAnPGRpdi8+JywgeyAnY2xhc3MnIDogJ2R5bmFtaWNsaW5rX3lvdXR1YmV2aWV3dmlkZW9lbWJlZGRlZCcsICdmcmFtZWJvcmRlcicgOiAnMCcgfSApOw0KCXZhciBpZnJhbWVDb250ZW50ID0gJEooICc8aWZyYW1lLz4nLCB7ICdmcmFtZWJvcmRlcicgOiAnMCcsIHNyYzogdmlkZW91cmwsIHdlYmtpdGFsbG93ZnVsbHNjcmVlbiA6ICcnLCBtb3phbGxvd2Z1bGxzY3JlZW4gOiAnJywgYWxsb3dmdWxsc2NyZWVuIDogJycgfSApOw0KCWlmICggZWwubGVuZ3RoICkNCgl7DQoJCWVtYmVkX3dyYXBwZXIuYXBwZW5kKCBpZnJhbWVDb250ZW50ICk7DQoJCXdyYXBwZXIuYXBwZW5kKCBlbWJlZF93cmFwcGVyICk7DQoJCWVsLmFmdGVyKCB3cmFwcGVyICk7DQoJCWVsLnJlbW92ZSgpOw0KCX0NCn0NCg0KZnVuY3Rpb24gRHluYW1pY0xpbmtfU2hvd1NrZXRjaGZhYk1vZGVsSW5saW5lKCBlbGVtLCBkZXRhaWxzICkNCnsNCgl2YXIgdXJsID0gImh0dHBzOi8vc2tldGNoZmFiLmNvbS9tb2RlbHMvIiArIGRldGFpbHMubW9kZWxpZCArICIvZW1iZWQ/YXV0b3N0YXJ0PTEiOw0KCXZhciBlbCA9ICRKKGVsZW0pOw0KCXZhciB3cmFwcGVyID0gJEooICc8ZGl2Lz4nLCB7ICdjbGFzcycgOiAnZHluYW1pY2xpbmtfc2tldGNoZmFibW9kZWxlbWJlZGRlZCcsICdmcmFtZWJvcmRlcicgOiAnMCcgfSApOw0KCXZhciBpZnJhbWVDb250ZW50ID0gJEooICc8aWZyYW1lLz4nLCB7ICdmcmFtZWJvcmRlcicgOiAnMCcsICJtb3phbGxvd2Z1bGxzY3JlZW4iIDogdHJ1ZSwgIndlYmtpdGFsbG93ZnVsbHNjcmVlbiIgOiB0cnVlLCBzcmM6IHVybCB9ICk7DQoJaWYgKCBlbC5sZW5ndGggKQ0KCXsNCgkJd3JhcHBlci5hcHBlbmQoIGlmcmFtZUNvbnRlbnQgKTsNCgkJZWwuYWZ0ZXIoIHdyYXBwZXIgKTsNCgkJZWwucmVtb3ZlKCk7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBSZXBsYWNlRHluYW1pY0xpbmsoIGlkLCBzdHJIVE1MICkNCnsNCgl2YXIgZWwgPSAkSignIycraWQpOw0KCWlmICggZWwubGVuZ3RoICYmIHN0ckhUTUwubGVuZ3RoID4gMCApDQoJew0KCQl2YXIgbmV3RWwgPSAkSiggc3RySFRNTCApOw0KCQllbC5hZnRlciggbmV3RWwgKTsNCgkJZWwucmVtb3ZlKCk7DQoNCgkJaWYgKCB0eXBlb2Ygd2luZG93WydIYW5kbGVOZXdEeW5hbWljTGluayddID09PSAiZnVuY3Rpb24iICkNCgkJew0KCQkJSGFuZGxlTmV3RHluYW1pY0xpbmsoIG5ld0VsICk7DQoJCX0NCgl9DQp9DQoNCmZ1bmN0aW9uIFNob3dCYW5uZWREeW5hbWljTGluayggZWwgKQ0Kew0KCWVsID0gJEooIGVsICk7DQoJaWYgKCBlbC5sZW5ndGggPiAwICkNCgl7DQoJCXZhciBiYW5uZWRDb250ZW50VVJMID0gZWwuZGF0YSggJ2Jhbm5lZHVybCcgKTsNCgkJdmFyIGxpbmsgPSAkSiggIjxhPiIsIHsgaHJlZjogYmFubmVkQ29udGVudFVSTCwgdGV4dDogYmFubmVkQ29udGVudFVSTCB9ICk7DQoJCWVsLmh0bWwoIGxpbmsgKTsNCgkJZWwuYXR0ciggJ29uY2xpY2snLCAnJyApOw0KCX0NCn0NCg0KQ1Njcm9sbE9mZnNldFdhdGNoZXIuc21fV2F0Y2hlcnNNYXAgPSBuZXcgTWFwKCk7DQpmdW5jdGlvbiBDU2Nyb2xsT2Zmc2V0V2F0Y2hlciggZWwsIGZuQ2FsbGJhY2ssIG5CdWZmZXJIZWlnaHQgKQ0Kew0KCXRoaXMubV8kRWxlbWVudCA9ICRKKCBlbCApOw0KCXRoaXMubkJ1ZmZlckhlaWdodCA9IG5CdWZmZXJIZWlnaHQgPT09IHVuZGVmaW5lZCA/IDUwMCA6IG5CdWZmZXJIZWlnaHQ7DQoJdGhpcy5mbk9uSGl0ID0gZm5DYWxsYmFjazsNCgl0aGlzLm9ic2VydmVyID0gbnVsbDsNCg0KCWlmICggIUNTY3JvbGxPZmZzZXRXYXRjaGVyLnNtX1dhdGNoZXJzTWFwLmhhcyggdGhpcy5tXyRFbGVtZW50ICkgKQ0KCXsNCgkJdGhpcy5vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlciggdGhpcy5mbkNhbGxiYWNrLmJpbmQoIHRoaXMgKSwgew0KCQkJcm9vdE1hcmdpbjogdGhpcy5uQnVmZmVySGVpZ2h0ICsgJ3B4IDBweCAnICsgdGhpcy5uQnVmZmVySGVpZ2h0ICsgJ3B4IDBweCcsDQoJCQl0aHJlc2hvbGQ6IDANCgkJfSk7DQoNCgkJdGhpcy5vYnNlcnZlci5vYnNlcnZlKCB0aGlzLm1fJEVsZW1lbnQuZ2V0KDApICk7DQoJCUNTY3JvbGxPZmZzZXRXYXRjaGVyLnNtX1dhdGNoZXJzTWFwLnNldCggdGhpcy5tXyRFbGVtZW50LCB0aGlzICk7DQoJfQ0KfQ0KDQpDU2Nyb2xsT2Zmc2V0V2F0Y2hlci5wcm90b3R5cGUuZm5DYWxsYmFjayA9IGZ1bmN0aW9uKCBlbnRyaWVzICkNCnsNCgllbnRyaWVzLmZvckVhY2goICggZW50cnkgKSA9Pg0KCXsNCgkJaWYgKCBlbnRyeS5pc0ludGVyc2VjdGluZyApDQoJCXsNCgkJCXRoaXMuZm5PbkhpdCgpOw0KCQkJdGhpcy5EZWNvbnN0cnVjdCgpOw0KCQl9DQoJfSk7DQp9Ow0KDQpDU2Nyb2xsT2Zmc2V0V2F0Y2hlci5wcm90b3R5cGUuRGVjb25zdHJ1Y3QgPSBmdW5jdGlvbigpDQp7DQoJdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7DQoJQ1Njcm9sbE9mZnNldFdhdGNoZXIuc21fV2F0Y2hlcnNNYXAuZGVsZXRlKCB0aGlzLm1fJEVsZW1lbnQgKTsNCn07DQoNCkNTY3JvbGxPZmZzZXRXYXRjaGVyLnByb3RvdHlwZS5NYW51YWxSZWNhbGNPYnNlcnZlciA9IGZ1bmN0aW9uKCkNCnsNCgl2YXIgc3VwcG9ydFBhZ2VPZmZzZXQgPSB3aW5kb3cucGFnZVlPZmZzZXQgIT09IHVuZGVmaW5lZDsNCgl2YXIgaXNDU1MxQ29tcGF0ID0gKChkb2N1bWVudC5jb21wYXRNb2RlIHx8ICIiKSA9PT0gIkNTUzFDb21wYXQiKTsNCg0KCXZhciBuU2Nyb2xsWSA9IHN1cHBvcnRQYWdlT2Zmc2V0ID8gd2luZG93LnBhZ2VZT2Zmc2V0IDogaXNDU1MxQ29tcGF0ID8gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA6IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wOw0KCXZhciBuT2Zmc2V0Qm90dG9tID0gblNjcm9sbFkgKyB3aW5kb3cuaW5uZXJIZWlnaHQ7DQoNCgljb25zdCBuT2Zmc2V0VG9wVHJpZ2dlciA9IHRoaXMubV8kRWxlbWVudC5vZmZzZXQoKS50b3AgLSB0aGlzLm5CdWZmZXJIZWlnaHQ7DQoJaWYgKCBuT2Zmc2V0Qm90dG9tID4gbk9mZnNldFRvcFRyaWdnZXIgKQ0KCXsNCgkJdGhpcy5mbk9uSGl0KCk7DQoJCXRoaXMuRGVjb25zdHJ1Y3QoKTsNCgl9DQp9Ow0KDQpDU2Nyb2xsT2Zmc2V0V2F0Y2hlci5Gb3JjZVJlY2FsYyA9IGZ1bmN0aW9uKCkNCnsNCglmb3IgKCBjb25zdCBba2V5LCB3YXRjaGVyXSBvZiBDU2Nyb2xsT2Zmc2V0V2F0Y2hlci5zbV9XYXRjaGVyc01hcCApIHsNCgkJd2F0Y2hlci5NYW51YWxSZWNhbGNPYnNlcnZlcigpOw0KCX0NCn07DQoNCmZ1bmN0aW9uIExvYWRJbWFnZUdyb3VwT25TY3JvbGwoIGVsVGFyZ2V0LCBzdHJHcm91cCApDQp7DQoJdmFyICRFbGVtZW50ID0gJEooICcjJyArIGVsVGFyZ2V0ICk7DQoJaWYgKCAkRWxlbWVudC5sZW5ndGggKQ0KCQluZXcgQ1Njcm9sbE9mZnNldFdhdGNoZXIoICRFbGVtZW50LCBmdW5jdGlvbigpIHsgTG9hZERlbGF5ZWRJbWFnZXMoc3RyR3JvdXApOyB9ICk7DQp9DQoNCmZ1bmN0aW9uIExvYWREZWxheWVkSW1hZ2VzKCBncm91cCwgYkZvcmNlICkNCnsNCglpZiAoICggdHlwZW9mIGdfcmdEZWxheWVkTG9hZEltYWdlcyAhPSAndW5kZWZpbmVkJyAmJiBnX3JnRGVsYXllZExvYWRJbWFnZXNbZ3JvdXBdICkgfHwgYkZvcmNlICkNCgl7DQoJCSRKKCdbZGF0YS1kZWxheWVkLWltYWdlLWdyb3VwPScgKyBncm91cCArICddJykuZWFjaCggZnVuY3Rpb24oKQ0KCQl7DQoJCQkkSih0aGlzKS5hdHRyKCdzcmMnLCAkSih0aGlzKS5hdHRyKCdkYXRhLWRlbGF5ZWQtaW1hZ2UnKSApOw0KCQl9KTsNCg0KCQlkZWxldGUgZ19yZ0RlbGF5ZWRMb2FkSW1hZ2VzW2dyb3VwXTsNCgl9DQp9DQoNCldlYlN0b3JhZ2UgPSB7DQoJR2V0TG9jYWw6IGZ1bmN0aW9uICgga2V5LCBiU2Vzc2lvbk9ubHkgKQ0KCXsNCgkJdmFyIHR5cGUgPSAoIGJTZXNzaW9uT25seSApID8gJ3Nlc3Npb24nIDogJ2xvY2FsJzsNCg0KCQlpZiAoICF3aW5kb3dbdHlwZSArICdTdG9yYWdlJ10gKQ0KCQkJcmV0dXJuIFdlYlN0b3JhZ2UuR2V0Q29va2llKCBrZXkgKTsNCg0KCQl2YXIgc3RvcmFnZSA9IHdpbmRvd1t0eXBlICsgJ1N0b3JhZ2UnXTsNCgkJdmFyIHZhbHVlOw0KCQl0cnkgew0KCQkJdmFsdWUgPSBzdG9yYWdlLmdldEl0ZW0oa2V5KTsNCgkJfSBjYXRjaChlcnIpIHsNCgkJCS8vIHN0b3JhZ2UuZ2V0SXRlbSBjYW4gdGhyb3cgU2VjdXJpdHlFcnJvciBiYXNlZCBvbiB1c2VyJ3MgYnJvd3NlciBzZXR0aW5nLg0KCQkJdmFsdWUgPSBudWxsOw0KCQl9DQoNCgkJdHJ5IHsNCgkJCXZhbHVlID0gVl9QYXJzZUpTT04oIHZhbHVlICk7DQoJCX0gY2F0Y2goZXJyKXsNCgkJCXJldHVybiBudWxsOw0KCQl9DQoNCgkJaWYoIHZhbHVlID09IG51bGwgKQ0KCQl7DQoJCQkvLyBDaGVjayBpZiB3ZSBoYXZlIHRoZSB2YWx1ZSBzdG9yZWQgaW4gYSBjb29raWUgaW5zdGVhZC4gSWYgc28sIG1vdmUgdGhhdCB0byBMUyBhbmQgcmVtb3ZlIHRoZSBjb29raWUNCgkJCXZhbHVlID0gVl9HZXRDb29raWUoIGtleSApOw0KCQkJaWYoIHZhbHVlICE9IG51bGwgKQ0KCQkJew0KCQkJCVdlYlN0b3JhZ2UuU2V0TG9jYWwoIGtleSwgdmFsdWUsIGJTZXNzaW9uT25seSApOw0KCQkJCVdlYlN0b3JhZ2UuQ2xlYXJDb29raWUoIGtleSApOw0KCQkJfQ0KCQl9DQoJCXJldHVybiB2YWx1ZTsNCgl9LA0KCUdldExvY2FsU2Vzc2lvbjogZnVuY3Rpb24oIGtleSApDQoJew0KCQlyZXR1cm4gV2ViU3RvcmFnZS5HZXRMb2NhbCgga2V5LCB0cnVlICk7DQoJfSwNCglTZXRMb2NhbDogZnVuY3Rpb24gKCBrZXksIHZhbHVlLCBiU2Vzc2lvbk9ubHkgKQ0KCXsNCgkJdmFyIHR5cGUgPSAoIGJTZXNzaW9uT25seSApID8gJ3Nlc3Npb24nIDogJ2xvY2FsJzsNCg0KCQlpZiAoICF3aW5kb3dbdHlwZSArICdTdG9yYWdlJ10gKQ0KCQkJcmV0dXJuIFdlYlN0b3JhZ2UuU2V0Q29va2llKCBrZXksIHZhbHVlLCAoIGJTZXNzaW9uT25seSApID8gbnVsbCA6IDM2NSApOw0KDQoJCXZhbHVlID0gVl9Ub0pTT04oIHZhbHVlICk7DQoNCgkJdmFyIHN0b3JhZ2UgPSB3aW5kb3dbdHlwZSArICdTdG9yYWdlJ107DQoJCXN0b3JhZ2Uuc2V0SXRlbSgga2V5LCB2YWx1ZSApOw0KCX0sDQoJU2V0TG9jYWxTZXNzaW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApDQoJew0KCQlXZWJTdG9yYWdlLlNldExvY2FsKCBrZXksIHZhbHVlLCB0cnVlICk7DQoJfSwNCglHZXRDb29raWU6IGZ1bmN0aW9uKCBrZXkgKQ0KCXsNCgkJdmFyIGtleVZhbHVlID0gVl9HZXRDb29raWUoIGtleSApOw0KCQlpZiAoIGtleVZhbHVlICkNCgkJCWtleVZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KCBrZXlWYWx1ZSApOw0KDQoJCXJldHVybiBWX0lzSlNPTigga2V5VmFsdWUgKSA/IFZfUGFyc2VKU09OKCBrZXlWYWx1ZSApIDoga2V5VmFsdWU7DQoJfSwNCglTZXRDb29raWU6IGZ1bmN0aW9uKCBrZXksIHZhbHVlLCBkdXJhdGlvbiApDQoJew0KCQl2YWx1ZSA9IGVuY29kZVVSSUNvbXBvbmVudCggVl9Ub0pTT04oIHZhbHVlICkgKTsNCgkJVl9TZXRDb29raWUoIGtleSwgdmFsdWUsIGR1cmF0aW9uICk7DQoJfSwNCglDbGVhckNvb2tpZTogZnVuY3Rpb24oIGtleSApDQoJew0KCQlXZWJTdG9yYWdlLlNldENvb2tpZShrZXksIG51bGwsIC0xICk7DQoJfSwNCglSZW1vdmVMb2NhbCA6IGZ1bmN0aW9uICgga2V5LCBiU2Vzc2lvbk9ubHkgKQ0KCXsNCgkJdmFyIHR5cGUgPSAoIGJTZXNzaW9uT25seSApID8gJ3Nlc3Npb24nIDogJ2xvY2FsJzsNCg0KCQlpZiAoICF3aW5kb3dbdHlwZSArICdTdG9yYWdlJ10gKQ0KCQkJcmV0dXJuIFdlYlN0b3JhZ2UuQ2xlYXJDb29raWUoIGtleSApOw0KDQoJCXZhciBzdG9yYWdlID0gd2luZG93W3R5cGUgKyAnU3RvcmFnZSddOw0KDQoJCXN0b3JhZ2UucmVtb3ZlSXRlbSgga2V5ICk7DQoJfQ0KfTsNCg0KLy8gdGFrZXMgYW4gaW50ZWdlcg0KZnVuY3Rpb24gdl9udW1iZXJmb3JtYXQoIG4sIGRlY2ltYWxzLCBzdHJEZWNpbWFsU3ltYm9sLCBzdHJUaG91c2FuZHNTZXBlcmF0b3IgKQ0Kew0KCWlmICggdHlwZW9mIHN0ckRlY2ltYWxTeW1ib2wgPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHN0clRob3VzYW5kc1NlcGVyYXRvciA9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgTnVtYmVyICE9ICd1bmRlZmluZWQnICYmIHR5cGVvZiBOdW1iZXIudG9Mb2NhbGVTdHJpbmcgIT0gJ3VuZGVmaW5lZCcgKQ0KCXsNCgkJdmFyIG9wdGlvbnMgPSB7fTsNCgkJaWYgKCB0eXBlb2YgZGVjaW1hbHMgIT0gJ3VuZGVmaW5lZCcgJiYgZGVjaW1hbHMgIT09IDAgKQ0KCQl7DQoJCQlvcHRpb25zLm1pbmltdW1GcmFjdGlvbkRpZ2l0cyA9IGRlY2ltYWxzOw0KCQkJb3B0aW9ucy5tYXhpbXVtRnJhY3Rpb25EaWdpdHMgPSBkZWNpbWFsczsNCgkJfQ0KDQoJCXZhciBudW0gPSBuZXcgTnVtYmVyKG4pOw0KCQl0cnkNCgkJew0KCQkJcmV0dXJuIG51bS50b0xvY2FsZVN0cmluZyggZmFsc2UsIG9wdGlvbnMgKTsNCgkJfQ0KCQljYXRjaCggZSApDQoJCXsNCgkJCXJldHVybiBudW0udG9TdHJpbmcoKTsNCgkJfQ0KCX0NCg0KCXZhciBzdHIgPSAnJyArICggbiA/IG4gOiAwICk7DQoJdmFyIGxlbiA9IHN0ci5pbmRleE9mKCAnLicgKTsNCglpZiAoIGxlbiA9PSAtMSApDQoJCWxlbiA9IHN0ci5sZW5ndGg7DQoJdmFyIG91dCA9ICcnOw0KCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkNCgl7DQoJCXZhciBjID0gc3RyLmNoYXJBdChpKTsNCgkJb3V0ICs9IGM7DQoJCWlmICggaSA8IGxlbiAtIDEgJiYgKGxlbiAtIGkgLSAxKSAlIDMgPT0gMCAmJiBjICE9ICctJyApDQoJCQlvdXQgKz0gKCB0eXBlb2Ygc3RyVGhvdXNhbmRzU2VwZXJhdG9yID09ICd1bmRlZmluZWQnID8gJywnIDogc3RyVGhvdXNhbmRzU2VwZXJhdG9yICk7DQoJfQ0KCWlmICggKCBsZW4gPCBzdHIubGVuZ3RoIHx8IGRlY2ltYWxzICkgJiYgdHlwZW9mIGRlY2ltYWxzICE9ICd1bmRlZmluZWQnICYmIGRlY2ltYWxzICE9PSAwICkNCgl7DQoJCWxlbisrOw0KCQlvdXQgKz0gKCB0eXBlb2Ygc3RyRGVjaW1hbFN5bWJvbCA9PSAndW5kZWZpbmVkJyA/ICcsJyA6IHN0ckRlY2ltYWxTeW1ib2wgKTsNCgkJZm9yICggdmFyIGkgPSAwOyBpIDwgKCBkZWNpbWFscyA/IGRlY2ltYWxzIDogc3RyLmxlbmd0aCAtIGxlbiApOyBpKysgKQ0KCQl7DQoJCQlpZiAoIGxlbiArIGkgPCBzdHIubGVuZ3RoICkNCgkJCQlvdXQgKz0gc3RyLmNoYXJBdCggbGVuICsgaSApOw0KCQkJZWxzZQ0KCQkJCW91dCArPSAnMCc7DQoJCX0NCgl9DQoNCglyZXR1cm4gb3V0Ow0KfQ0KDQoNCmZ1bmN0aW9uIHZfc2h1ZmZsZSggcmdBcnJheSApDQp7DQoJZm9yICggdmFyIGkgPSAwOyBpIDwgcmdBcnJheS5sZW5ndGg7IGkrKyApDQoJew0KCQl2YXIgaVN3YXAgPSBNYXRoLmZsb29yKCBNYXRoLnJhbmRvbSgpICogKCByZ0FycmF5Lmxlbmd0aCAtIGkgKSArIGkgKTsNCgkJaWYgKCBpU3dhcCAhPSBpICkNCgkJew0KCQkJdmFyIHRlbXAgPSByZ0FycmF5W2lTd2FwXTsNCgkJCXJnQXJyYXlbaVN3YXBdID0gcmdBcnJheVtpXTsNCgkJCXJnQXJyYXlbaV0gPSB0ZW1wOw0KCQl9DQoJfQ0KDQoJcmV0dXJuIHJnQXJyYXk7DQp9DQoNCg0KZnVuY3Rpb24gVXBkYXRlRm9ybWF0dGVkTnVtYmVyKCBlbGVtZW50LCBkZWx0YSApDQp7DQoJdmFyICRFbGVtZW50ID0gJEooZWxlbWVudCk7DQoJJEVsZW1lbnQudGV4dCggdl9udW1iZXJmb3JtYXQoIHBhcnNlSW50KCAkRWxlbWVudC50ZXh0KCkucmVwbGFjZSggLywvLCAnJyApICkgKyBkZWx0YSApICk7DQp9DQoNCmZ1bmN0aW9uIFJhdGVBbm5vdW5jZW1lbnQoIHJhdGVVUkwsIGdpZCwgYlZvdGVVcCwgY2xhbklEICkNCnsNCglpZiAoIGJWb3RlVXAgJiYgJEooJyNWb3RlVXBCdG5fJyArIGdpZCkuaGFzQ2xhc3MoICJidG5fYWN0aXZlIiApICkNCgl7DQoJCXJldHVybjsNCgl9DQoJaWYgKCAhYlZvdGVVcCAmJiAkSignI1ZvdGVEb3duQnRuXycgKyBnaWQpLmhhc0NsYXNzKCAiYnRuX2FjdGl2ZSIgKSApDQoJew0KCQlyZXR1cm47DQoJfQ0KDQoJcmF0ZVVSTCA9IHJhdGVVUkwgKyBnaWQ7DQoJJEoucG9zdCggcmF0ZVVSTCwgew0KCQkJJ3ZvdGV1cCcgOiBiVm90ZVVwLA0KCQkJJ2NsYW5pZCcgOiBjbGFuSUQsDQoJCQknc2Vzc2lvbmlkJyA6IGdfc2Vzc2lvbklEDQoJCX0NCgkpLmRvbmUoIGZ1bmN0aW9uKCBqc29uICkgew0KDQoJCXZhciB2b3Rlc1VwQ291bnQgPSAkSignI1ZvdGVzVXBDb3VudF8nICsgZ2lkKTsNCgkJaWYgKCB2b3Rlc1VwQ291bnQgKQ0KCQl7DQoJCQl2YXIgaW5jcmVtZW50ID0gMDsNCgkJCWlmICggYlZvdGVVcCApDQoJCQl7DQoJCQkJaW5jcmVtZW50ID0gMTsNCgkJCX0NCgkJCWVsc2UgaWYgKCAkSignI1ZvdGVVcEJ0bl8nICsgZ2lkKS5oYXNDbGFzcyggJ2J0bl9hY3RpdmUnICkgKQ0KCQkJew0KCQkJCWluY3JlbWVudCA9IC0xOw0KCQkJfQ0KCQkJVXBkYXRlRm9ybWF0dGVkTnVtYmVyKCB2b3Rlc1VwQ291bnQsIGluY3JlbWVudCApOw0KDQoJCQlpZiAoIHBhcnNlSW50KCB2b3Rlc1VwQ291bnQuaHRtbCgpLnJlcGxhY2UoLywvZywgJycpICkgPT0gMCApDQoJCQl7DQoJCQkJJEooJyNWb3Rlc1VwQ291bnRDb250YWluZXJfJyArIGdpZCkuaGlkZSgpOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRKKCcjVm90ZXNVcENvdW50Q29udGFpbmVyXycgKyBnaWQpLnNob3coKTsNCgkJCX0NCgkJfQ0KDQoJCWlmICggYlZvdGVVcCApDQoJCXsNCgkJCSRKKCcjVm90ZVVwQnRuXycgKyBnaWQpLmFkZENsYXNzKCAiYnRuX2FjdGl2ZSIgKTsNCgkJCSRKKCcjVm90ZURvd25CdG5fJyArIGdpZCkucmVtb3ZlQ2xhc3MoICJidG5fYWN0aXZlIiApOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJEooJyNWb3RlRG93bkJ0bl8nICsgZ2lkKS5hZGRDbGFzcyggImJ0bl9hY3RpdmUiICk7DQoJCQkkSignI1ZvdGVVcEJ0bl8nICsgZ2lkKS5yZW1vdmVDbGFzcyggImJ0bl9hY3RpdmUiICk7DQoJCX0NCg0KDQoNCgl9ICkNCgkuZmFpbCggZnVuY3Rpb24oIGpxeGhyICkgew0KCQl2YXIgcmVzcG9uc2VKU09OID0ganF4aHIucmVzcG9uc2VUZXh0LmV2YWxKU09OKCk7DQoJCXN3aXRjaCAoIHJlc3BvbnNlSlNPTi5zdWNjZXNzICkNCgkJew0KCQkJY2FzZSAyMToNCgkJCQlTaG93QWxlcnREaWFsb2coICdFcnJvcicsICdZb3UgbXVzdCBiZSBsb2dnZWQgaW4gdG8gcGVyZm9ybSB0aGF0IGFjdGlvbi4nICk7DQoJCQkJYnJlYWs7DQoJCQljYXNlIDI0Og0KCQkJCVNob3dBbGVydERpYWxvZyggJ0Vycm9yJywNCgkJCQkJJ1lvdXIgYWNjb3VudCBkb2VzIG5vdCBtZWV0IHRoZSByZXF1aXJlbWVudHMgdG8gdXNlIHRoaXMgZmVhdHVyZS4gPGEgY2xhc3M9IndoaXRlTGluayIgaHJlZj0iaHR0cHM6Ly9oZWxwLnN0ZWFtcG93ZXJlZC5jb20vZW4vd2l6YXJkL0hlbHBXaXRoTGltaXRlZEFjY291bnQiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vcmVmZXJyZXIiPlZpc2l0IFN0ZWFtIFN1cHBvcnQ8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLicNCgkJCQkpOw0KCQkJCWJyZWFrOw0KCQkJY2FzZSAxNToNCgkJCQlTaG93QWxlcnREaWFsb2coICdFcnJvcicsICdZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byBwZXJmb3JtIHRoYXQgYWN0aW9uLicgKTsNCgkJCQlicmVhazsNCgkJCWRlZmF1bHQ6DQoJCQkJU2hvd0FsZXJ0RGlhbG9nKCAnRXJyb3InLCAnVGhlcmUgd2FzIGFuIGVycm9yIGVuY291bnRlcmVkIHdoaWxlIHByb2Nlc3NpbmcgeW91ciByZXF1ZXN0OiAnICsgcmVzcG9uc2VKU09OLnN1Y2Nlc3MgKTsNCgkJCQlicmVhazsNCgkJfQ0KCX0gKTsNCglyZXR1cm4gZmFsc2U7DQp9DQoNCmZ1bmN0aW9uIEdldFJlc3BvbnNpdmVIZWFkZXJGaXhlZE9mZnNldEFkanVzdG1lbnQoKQ0Kew0KCS8vIGZvciByZXNwb25zaXZlIHBhZ2VzIC0gd2UgbmVlZCB0byBhZGp1c3QgZm9yIHRoZSBtZW51DQoJdmFyICRSZXNwb25zaXZlSGVhZGVyID0gJEooJy5yZXNwb25zaXZlX2hlYWRlcjp2aXNpYmxlJyk7DQoJaWYgKCAkUmVzcG9uc2l2ZUhlYWRlci5sZW5ndGggJiYgJFJlc3BvbnNpdmVIZWFkZXIuY3NzKCdwb3NpdGlvbicpID09ICdmaXhlZCcgKQ0KCQlyZXR1cm4gJFJlc3BvbnNpdmVIZWFkZXIub3V0ZXJIZWlnaHQoKTsNCgllbHNlDQoJCXJldHVybiAwOw0KfQ0KDQovKiBTY3JvbGwgdG8gYW4gZWxlbWVudCBpZiBpdCdzIG5vdCBhbHJlYWR5IGluIHZpZXcuICBJZiBpdCdzIGF0IHRoZSBib3R0b20gb2YgdGhlIHZpZXdwb3J0LCB0aGVuIGl0IHdpbGwgYmUNCiBzY3JvbGxlZCB0byB0aGUgdG9wIGlmIGxlc3MgdGhhbiBuUmVxdWlyZWRQaXhlbHNUb1Nob3cgYXJlIHZpc2libGUgKGRlZmF1bHRzIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGVsZW1lbnQpDQogKi8NCmZ1bmN0aW9uIFNjcm9sbFRvSWZOb3RJblZpZXcoIGVsZW0sIG5SZXF1aXJlZFBpeGVsc1RvU2hvdywgblNwYWNpbmdCZWZvcmUsIG5BbmltYXRpb25TcGVlZCApDQp7DQoJdmFyICRFbGVtID0gJEpGcm9tSURPckVsZW1lbnQoZWxlbSk7DQoNCglpZiAoIHR5cGVvZiBuU3BhY2luZ0JlZm9yZSA9PSAndW5kZWZpbmVkJyApDQoJCW5TcGFjaW5nQmVmb3JlID0gMDsNCg0KCS8vIGZvciByZXNwb25zaXZlIHBhZ2VzIC0gd2UgbmVlZCB0byBhZGp1c3QgZm9yIHRoZSBtZW51DQoJblNwYWNpbmdCZWZvcmUgKz0gR2V0UmVzcG9uc2l2ZUhlYWRlckZpeGVkT2Zmc2V0QWRqdXN0bWVudCgpOw0KDQoJdmFyIGVsZW1Ub3AgPSAkRWxlbS5vZmZzZXQoKS50b3A7DQoJdmFyIG5WaWV3cG9ydE9mZnNldFRvcCA9IGVsZW1Ub3AgLSAkSih3aW5kb3cpLnNjcm9sbFRvcCgpOw0KCXZhciBiTmVlZFRvU2Nyb2xsID0gZmFsc2U7DQoJaWYgKCBuVmlld3BvcnRPZmZzZXRUb3AgPCAwICkNCgl7DQoJCWJOZWVkVG9TY3JvbGwgPSB0cnVlOw0KCX0NCgllbHNlDQoJew0KCQlpZiAoICFuUmVxdWlyZWRQaXhlbHNUb1Nob3cgKQ0KCQkJblJlcXVpcmVkUGl4ZWxzVG9TaG93ID0gJEVsZW0ub3V0ZXJIZWlnaHQoKTsNCg0KCQl2YXIgblZpZXdwb3J0T2Zmc2V0Qm90dG9tID0gblZpZXdwb3J0T2Zmc2V0VG9wICsgblJlcXVpcmVkUGl4ZWxzVG9TaG93Ow0KDQoJCWlmICggblZpZXdwb3J0T2Zmc2V0Qm90dG9tID4gJEood2luZG93KS5oZWlnaHQoKSApDQoJCQliTmVlZFRvU2Nyb2xsID0gdHJ1ZTsNCgl9DQoNCglpZiAoIGJOZWVkVG9TY3JvbGwgKQ0KCXsNCgkJaWYgKCBuU3BhY2luZ0JlZm9yZSApDQoJCQluVmlld3BvcnRPZmZzZXRUb3AgLT0gblNwYWNpbmdCZWZvcmU7DQoNCgkJaWYgKCB0eXBlb2YgbkFuaW1hdGlvblNwZWVkICE9ICd1bmRlZmluZWQnICkNCgkJCSRKKCdodG1sLCBib2R5JyApLmFuaW1hdGUoIHtzY3JvbGxUb3A6IG5WaWV3cG9ydE9mZnNldFRvcH0sIG5BbmltYXRpb25TcGVlZCApOw0KCQllbHNlDQoJCQl3aW5kb3cuc2Nyb2xsQnkoIDAsIG5WaWV3cG9ydE9mZnNldFRvcCApOw0KCX0NCn0NCg0KDQpmdW5jdGlvbiBDQWpheEluZmluaXRlU2Nyb2xsaW5nQ29udHJvbHMoIHJnU2VhcmNoRGF0YSwgdXJsICkNCnsNCgl0aGlzLm1fc3RyQWN0aW9uVVJMID0gbnVsbDsNCgl0aGlzLm1fY1BhZ2VTaXplID0gbnVsbDsNCgl0aGlzLm1fc3RyRWxlbWVudFByZWZpeCA9ICIiOw0KCXRoaXMubV9zdHJDbGFzc1ByZWZpeCA9ICIiOw0KCXRoaXMubV9TdHJSb3dzSWQgPSAiIjsNCgl0aGlzLm1fcmdTdGF0aWNQYXJhbXMgPSBudWxsOw0KDQoJdGhpcy5tX2JMb2FkaW5nID0gZmFsc2U7DQoNCgl0aGlzLm1fZm5QcmVSZXF1ZXN0SGFuZGxlciA9IG51bGw7DQoJdGhpcy5tX2ZuUmVzcG9uc2VIYW5kbGVyID0gbnVsbDsNCgl0aGlzLm1fZm5QYWdlQ2hhbmdpbmdIYW5kbGVyID0gbnVsbDsNCgl0aGlzLm1fZm5QYWdlQ2hhbmdlZEhhbmRsZXIgPSBudWxsOw0KCXRoaXMubV9mblJhd1Njcm9sbEhhbmRsZXIgPSBudWxsOw0KDQoJdGhpcy5tX0xvYWRpbmdEaWFsb2cgPSBudWxsOw0KCXRoaXMubV9iUmVzdG9yaW5nU2Nyb2xsVG9wID0gZmFsc2U7DQoNCgl0aGlzLm1fc3RyQWN0aW9uVVJMID0gdXJsOw0KDQoJdGhpcy5tX3N0clF1ZXJ5ID0gcmdTZWFyY2hEYXRhWydxdWVyeSddOw0KCXRoaXMubV9jVG90YWxDb3VudCA9IHJnU2VhcmNoRGF0YVsndG90YWxfY291bnQnXTsNCgl0aGlzLm1faUN1cnJlbnRQYWdlID0gcmdTZWFyY2hEYXRhWydwYWdlJ10gfHwgMDsNCgl0aGlzLm1fY1BhZ2VTaXplID0gcmdTZWFyY2hEYXRhWydwYWdlc2l6ZSddOw0KCXRoaXMubV9jTWF4UGFnZXMgPSBNYXRoLmNlaWwoIHRoaXMubV9jVG90YWxDb3VudCAvIHRoaXMubV9jUGFnZVNpemUgKTsNCg0KCXRoaXMubV9pVHJpZ2dlckhlaWdodCA9IHJnU2VhcmNoRGF0YVsndHJpZ2dlcl9oZWlnaHQnXSB8fCA3NTA7CS8vIEhvdyBtYW55IHB4IGZyb20gdGhlIGJvdHRvbSBzaG91bGQgd2UgdHJpZ2dlciBhIHBhZ2UgbG9hZC4NCg0KCXRoaXMubV9pQ29vbGRvd25UaW1lID0gMDsgICAgICAgLy8gbXMgZnJvbSB0aGUgZXBvY2ggd2hlbiB3ZSBjYW4gbmV4dCB1cGRhdGUuDQoJdGhpcy5tX2lDb29sZG93bkludGVydmFsID0gMjAwOyAvLyBNaW5pbXVtIHRpbWUgKGluIG1zKSBiZXR3ZWVuIHVwZGF0ZXMNCg0KCWlmICggcmdTZWFyY2hEYXRhWydwcmVmaXgnXSApDQoJCXRoaXMubV9zdHJFbGVtZW50UHJlZml4ID0gcmdTZWFyY2hEYXRhWydwcmVmaXgnXTsNCg0KCS8vIFJvd3MgZWxlbWVudCBuYW1lIHRoYXQncyB1cGRhdGVkIHdoZW4gd2Ugc2Nyb2xsLg0KCXRoaXMubV9TdHJSb3dzSWQgPSB0aGlzLm1fc3RyRWxlbWVudFByZWZpeCArICdSb3dzJzsNCg0KCWlmICggcmdTZWFyY2hEYXRhWydjbGFzc19wcmVmaXgnXSApDQoJCXRoaXMubV9zdHJDbGFzc1ByZWZpeCA9IHJnU2VhcmNoRGF0YVsnY2xhc3NfcHJlZml4J107DQoNCgkvLyBXZSB3YW50IG91ciBoYW5kbGVycyB0byBnZXQgYSBjb3B5IG9mIG91ciBpbmZpbml0ZVNjcm9sbCBvYmplY3Qgd2hlbiB0aGV5J3JlIGNhbGxlZCwgc28gd2Ugc2F2ZSBpdA0KCS8vIGludG8gYSB2YXIgYW5kIGJ1aWxkIGEgY2xvc3VyZSBhcm91bmQgaXQuDQoJdmFyIHRoaXNDb250cm9sID0gdGhpczsNCg0KCS8vIEJ5IHNhdmluZyB0aGUgYm91bmQgc2Nyb2xsLWhhbmRsZXIgdG8gYSB2YXJpYWJsZSwgd2UgY2FuIHRoZW4gdW5sb2FkIGl0IHdoZW4gb3VyIHNlYXJjaA0KCS8vIG9wdGlvbnMgYXJlIHVwYWRhdGVkLg0KCXRoaXMubV9mblJhd1Njcm9sbEhhbmRsZXIgPSBmdW5jdGlvbigpIHsgdGhpc0NvbnRyb2wuT25TY3JvbGwoKSB9Ow0KCSRKKGRvY3VtZW50KS5zY3JvbGwoIHRoaXMubV9mblJhd1Njcm9sbEhhbmRsZXIgKTsNCg0KCS8vIElmIHdlIGhhdmUgYSBfc2Nyb2xsX3RvcCBlbGVtZW50LCB0aGVuIHNldCBvdXIgT25VbmxvYWQgaGFuZGxlci4NCglpZiAoICRKKCAiIyIgKyB0aGlzLm1fc3RyRWxlbWVudFByZWZpeCArICdfc2Nyb2xsX3RvcCcpLmxlbmd0aCApDQoJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCBmdW5jdGlvbigpIHsgdGhpc0NvbnRyb2wuT25VbmxvYWQoKSB9ICk7DQoNCgkvLyBPcHRpb25hbDogRHluYW1pYyBkYXRhIHJldHVybmVkIGZyb20gdGhlIGxhc3QgcmVxdWVzdCwgdG8gcHJvdmlkZWQgdG8gdGhlIG5leHQgcmVxdWVzdC4gTGV0cyB0aGVtDQoJLy8gYmVpbmcgc3RyaW5nZWQgdG9nZXRoZXIgd2l0aCBzb21lIG1lbW9yeQ0KCXRoaXMubV9yZ0R5bmFtaWNEYXRhID0gbnVsbDsNCg0KCXRoaXMuUmVzdG9yZVNjcm9sbFRvcCggdHJ1ZSApOw0KfQ0KDQpDQWpheEluZmluaXRlU2Nyb2xsaW5nQ29udHJvbHMucHJvdG90eXBlLkRvbmVSZXN0b3JlU2Nyb2xsVG9wID0gZnVuY3Rpb24oKQ0Kew0KCXRoaXMuQ2xlYXJMb2FkaW5nRGlhbG9nKCk7DQoJdGhpcy5tX2JSZXN0b3JpbmdTY3JvbGxUb3AgPSBmYWxzZTsNCn07DQoNCkNBamF4SW5maW5pdGVTY3JvbGxpbmdDb250cm9scy5wcm90b3R5cGUuQ2xlYXJMb2FkaW5nRGlhbG9nID0gZnVuY3Rpb24oKQ0Kew0KCWlmICggdGhpcy5tX0xvYWRpbmdEaWFsb2cgKQ0KCXsNCgkJdGhpcy5tX0xvYWRpbmdEaWFsb2cuRGlzbWlzcygpOw0KCQl0aGlzLm1fTG9hZGluZ0RpYWxvZyA9IG51bGw7DQoJfQ0KfTsNCg0KLy8gU3RvcHMgdGhpcyBpbmZpbml0ZSBzY3JvbGwgaGFuZGxlci4NCkNBamF4SW5maW5pdGVTY3JvbGxpbmdDb250cm9scy5wcm90b3R5cGUuU3RvcCA9IGZ1bmN0aW9uKCkNCnsNCgkvLyBDbGVhciBsb2FkaW5nIG5vdGlmaWVycy4NCgl0aGlzLkNsZWFyTG9hZGluZ0RpYWxvZygpOw0KCXRoaXMuSGlkZVRocm9iYmVyKCk7DQoNCgkvLyBDbGVhciBzY2hlZHVsZWQgc2Nyb2xsLCBpZiB0aGVyZSBpcyBvbmUuDQoJaWYgKCB0aGlzLm1fb1NjaGVkdWxlZFNjcm9sbCApDQoJCWNsZWFyVGltZW91dCggdGhpcy5tX29TY2hlZHVsZWRTY3JvbGwgKTsNCg0KCS8vIFVuaG9vayBzY3JvbGwgaGFuZGxlci4NCgkkSihkb2N1bWVudCkub2ZmKCAic2Nyb2xsIiwgdGhpcy5tX2ZuUmF3U2Nyb2xsSGFuZGxlciApOw0KDQoJLy8gVE9ETzogRG8gd2UgbmVlZCB0byBjYWxsIG9yIGNsZWFyIEJlZm9yZVVubG9hZD8NCn07DQoNCkNBamF4SW5maW5pdGVTY3JvbGxpbmdDb250cm9scy5wcm90b3R5cGUuUmVzdG9yZVNjcm9sbFRvcCA9IGZ1bmN0aW9uKCBiRm9yY2UgKQ0Kew0KCXRoaXMubV9iUmVzdG9yaW5nU2Nyb2xsVG9wIHw9IGJGb3JjZTsNCglpZiAoICF0aGlzLm1fYlJlc3RvcmluZ1Njcm9sbFRvcCApDQoJew0KCQlyZXR1cm47DQoJfQ0KCXZhciBzY3JvbGxUb3BQcmV2aW91cyA9IHBhcnNlSW50KCAkSiggIiMiICsgdGhpcy5tX3N0ckVsZW1lbnRQcmVmaXggKyAnX3Njcm9sbF90b3AnKS52YWwoKSApOw0KCWlmICggc2Nyb2xsVG9wUHJldmlvdXMgKQ0KCXsNCgkJdmFyIHZpZXdwb3J0ID0gZG9jdW1lbnQudmlld3BvcnQuZ2V0RGltZW5zaW9ucygpOyAvLyBHZXRzIHRoZSB2aWV3cG9ydCBhcyBhbiBvYmplY3QgbGl0ZXJhbA0KCQl2YXIgd2luZG93SGVpZ2h0ID0gdmlld3BvcnQuaGVpZ2h0OyAvLyBVc2FibGUgd2luZG93IGhlaWdodA0KCQl2YXIgYm9keUhlaWdodCA9ICQoZG9jdW1lbnQuYm9keSkuZ2V0SGVpZ2h0KCk7DQoNCgkJLy8gZG9uZT8NCgkJaWYgKCBzY3JvbGxUb3BQcmV2aW91cyA8IGJvZHlIZWlnaHQgLSB3aW5kb3dIZWlnaHQgKQ0KCQl7DQoJCQl0aGlzLkRvbmVSZXN0b3JlU2Nyb2xsVG9wKCk7DQoJCQl3aW5kb3cuc2Nyb2xsVG8oIDAsIHNjcm9sbFRvcFByZXZpb3VzICk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQlpZiAoIHRoaXMubV9Mb2FkaW5nRGlhbG9nID09IG51bGwgKQ0KCQkJew0KCQkJCXRoaXMubV9Mb2FkaW5nRGlhbG9nID0gU2hvd0Jsb2NraW5nV2FpdERpYWxvZyggJ1BsZWFzZSBXYWl0JywgJ1JldHVybmluZyB0byB3aGVyZSB5b3Ugd2VyZSBsYXN0IG9uIHRoaXMgcGFnZS4uLicgKTsNCgkJCX0NCgkJCXdpbmRvdy5zY3JvbGxUbyggMCwgc2Nyb2xsVG9wUHJldmlvdXMgKTsNCgkJfQ0KCX0NCn07DQoNCkNBamF4SW5maW5pdGVTY3JvbGxpbmdDb250cm9scy5wcm90b3R5cGUuT25VbmxvYWQgPSBmdW5jdGlvbigpDQp7DQoJdmFyIHNjcm9sbE9mZnNldCA9IGRvY3VtZW50LnZpZXdwb3J0LmdldFNjcm9sbE9mZnNldHMoKTsNCgl2YXIgc2Nyb2xsVG9wID0gc2Nyb2xsT2Zmc2V0LnRvcDsNCgkkSiggIiMiICsgdGhpcy5tX3N0ckVsZW1lbnRQcmVmaXggKyAnX3Njcm9sbF90b3AnKS52YWwoIHNjcm9sbFRvcCApOw0KfTsNCg0KQ0FqYXhJbmZpbml0ZVNjcm9sbGluZ0NvbnRyb2xzLnByb3RvdHlwZS5PblNjcm9sbCA9IGZ1bmN0aW9uKCkNCnsNCglpZiAoIHRoaXMubV9iTG9hZGluZyApDQoJCXJldHVybjsNCg0KCXZhciBpTm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7DQoNCgkvLyBIb3cgc29vbiBjYW4gd2Ugc2Nyb2xsPw0KCXZhciBpU2Nyb2xsV2FpdCA9IHRoaXMubV9pQ29vbGRvd25UaW1lIC0gaU5vdzsNCg0KCS8vIElmIHdlIGhhdmVuJ3QgcmVhY2hlZCBvdXIgY29vbGRvd24sIGRvIG5vdGhpbmcuDQoJaWYgKCBpU2Nyb2xsV2FpdCA+IDAgKQ0KCXsNCgkJLy8gY29uc29sZS5sb2coIkluZmluaVNjcm9sbGluZyB0b28gZmFzdDsgZW5nYWdpbmcgdGhyb3R0bGUiKTsNCg0KCQkvLyBTY2hlZHVsZSBhIHNjcm9sbCBldmVudCBmb3Igd2hlbiB0aGV5IHdvdWxkIGJlIGFsbG93ZWQgdG8gc2Nyb2xsLiBXaXRob3V0IHRoaXMsIHRoZQ0KCQkvLyB1c2VyIG5lZWRzIHRvIGppZ2dsZSB0aGVpciBzY3JvbGxiYXIuDQoJCWlmICggdGhpcy5tX29TY2hlZHVsZWRTY3JvbGwgPT0gbnVsbCApDQoJCXsNCgkJCXRoaXMubV9vU2NoZWR1bGVkU2Nyb2xsID0gc2V0VGltZW91dCggdGhpcy5tX2ZuUmF3U2Nyb2xsSGFuZGxlciwgaVNjcm9sbFdhaXQgKTsNCgkJCXRoaXMuU2hvd1Rocm9iYmVyKCk7IC8vIFNob3cgdGhyb2JiZXIgd2hpbGUgd2FpdGluZyB0byBiZWdpbiBsb2FkLg0KCQl9DQoNCgkJcmV0dXJuOw0KCX0NCg0KCXRoaXMubV9vU2NoZWR1bGVkU2Nyb2xsID0gbnVsbDsNCg0KCS8vIFRoZSBib3R0b20gb2Ygb3VyIHNjcmVlbiBpcyBlcXVhbCB0byBob3cgZmFyIHdlJ3ZlIHNjcm9sbGVkLCBwbHVzIHRoZSBoZWlnaHQgb2Ygb3VyIHdpbmRvdy4NCgl2YXIgbkN1cnJlbnRTY3JvbGwgPSAkSih3aW5kb3cpLnNjcm9sbFRvcCgpICsgJEood2luZG93KS5oZWlnaHQoKTsNCg0KCXZhciByb3dzID0gJEooJyMnICsgdGhpcy5tX1N0clJvd3NJZCk7DQoJdmFyIG9mZnNldCA9IHJvd3Mub2Zmc2V0KCk7DQoNCgkvLyBUaGUgYm90dG9tIG9mIG91ciBjb250ZW50IGlzIHRoZSBoZWlnaHQgb2Ygb3VyIHJlc3VsdHMsIHBsdXMgaXRzIG9mZnNldCBmcm9tIHRoZSB0b3Agb2YgdGhlIHBhZ2UuDQoJLy8gV2Ugd2FudCB0byB0cmlnZ2VyIGEgbG9hZCB0aGlzLm1faVRyaWdnZXJIZWlnaHQgYmVmb3JlIHRoZSB1c2VyIHNlZXMgdGhhdC4NCgl2YXIgblRyaWdnZXJQb2ludCA9IHJvd3MuaGVpZ2h0KCkgKyBvZmZzZXQudG9wIC0gdGhpcy5tX2lUcmlnZ2VySGVpZ2h0Ow0KDQoJaWYgKCBuQ3VycmVudFNjcm9sbCA+ICBuVHJpZ2dlclBvaW50ICkNCgl7DQoJCXRoaXMubV9pQ29vbGRvd25UaW1lID0gaU5vdyArIHRoaXMubV9pQ29vbGRvd25JbnRlcnZhbDsNCg0KCQl0aGlzLk5leHRQYWdlKCk7DQoJfQ0KfTsNCg0KQ0FqYXhJbmZpbml0ZVNjcm9sbGluZ0NvbnRyb2xzLnByb3RvdHlwZS5HZXRBY3Rpb25VUkwgPSBmdW5jdGlvbiggYWN0aW9uICkNCnsNCgl2YXIgdXJsID0gdGhpcy5tX3N0ckFjdGlvblVSTCArIGFjdGlvbiArICcvJzsNCglyZXR1cm4gdXJsOw0KfTsNCg0KQ0FqYXhJbmZpbml0ZVNjcm9sbGluZ0NvbnRyb2xzLnByb3RvdHlwZS5TZXRQcmVSZXF1ZXN0SGFuZGxlciA9IGZ1bmN0aW9uKCBmbkhhbmRsZXIgKQ0Kew0KCXRoaXMubV9mblByZVJlcXVlc3RIYW5kbGVyID0gZm5IYW5kbGVyOw0KfTsNCg0KQ0FqYXhJbmZpbml0ZVNjcm9sbGluZ0NvbnRyb2xzLnByb3RvdHlwZS5TZXRSZXNwb25zZUhhbmRsZXIgPSBmdW5jdGlvbiggZm5IYW5kbGVyICkNCnsNCgl0aGlzLm1fZm5SZXNwb25zZUhhbmRsZXIgPSBmbkhhbmRsZXI7DQp9Ow0KDQpDQWpheEluZmluaXRlU2Nyb2xsaW5nQ29udHJvbHMucHJvdG90eXBlLlNldFBhZ2VDaGFuZ2luZ0hhbmRsZXIgPSBmdW5jdGlvbiAoIGZuSGFuZGxlciApDQp7DQoJdGhpcy5tX2ZuUGFnZUNoYW5naW5nSGFuZGxlciA9IGZuSGFuZGxlcjsNCn07DQoNCkNBamF4SW5maW5pdGVTY3JvbGxpbmdDb250cm9scy5wcm90b3R5cGUuU2V0UGFnZUNoYW5nZWRIYW5kbGVyID0gZnVuY3Rpb24gKCBmbkhhbmRsZXIgKQ0Kew0KCXRoaXMubV9mblBhZ2VDaGFuZ2VkSGFuZGxlciA9IGZuSGFuZGxlcjsNCn07DQoNCkNBamF4SW5maW5pdGVTY3JvbGxpbmdDb250cm9scy5wcm90b3R5cGUuU2V0U3RhdGljUGFyYW1ldGVycyA9IGZ1bmN0aW9uICggcmdQYXJhbXMgKQ0Kew0KCXRoaXMubV9yZ1N0YXRpY1BhcmFtcyA9IHJnUGFyYW1zOw0KfTsNCg0KQ0FqYXhJbmZpbml0ZVNjcm9sbGluZ0NvbnRyb2xzLnByb3RvdHlwZS5PbkFKQVhDb21wbGV0ZSA9IGZ1bmN0aW9uKCkNCnsNCgl0aGlzLm1fYkxvYWRpbmcgPSBmYWxzZTsNCn07DQoNCkNBamF4SW5maW5pdGVTY3JvbGxpbmdDb250cm9scy5wcm90b3R5cGUuTmV4dFBhZ2UgPSBmdW5jdGlvbigpDQp7DQoJaWYgKCB0aGlzLm1faUN1cnJlbnRQYWdlIDwgdGhpcy5tX2NNYXhQYWdlcyAtIDEgKSB7DQoJCXRoaXMuTG9hZFBhZ2UoIHRoaXMubV9pQ3VycmVudFBhZ2UgKyAxICk7DQoJfQ0KCWVsc2UNCgl7DQoJCS8vIFdlJ3JlIHJlYWNoZWQgdGhlIGVuZCBvZiBvdXIgcmVzdWx0cyENCgkJdGhpcy5TdG9wKCk7DQoJfQ0KDQp9Ow0KDQpDQWpheEluZmluaXRlU2Nyb2xsaW5nQ29udHJvbHMucHJvdG90eXBlLkxvYWRQYWdlID0gZnVuY3Rpb24oIGlQYWdlLCBiRm9yY2UgKQ0Kew0KCWlmICggdHlwZW9mKCBiRm9yY2UgKT09ICd1bmRlZmluZWQnIHx8ICFiRm9yY2UgKQ0KCXsNCgkJaWYgKCB0aGlzLm1fYkxvYWRpbmcgfHwgaVBhZ2UgPj0gdGhpcy5tX2NNYXhQYWdlcyB8fCBpUGFnZSA8IDAgKQ0KCQl7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJZWxzZSBpZiAoIGlQYWdlID09IHRoaXMubV9pQ3VycmVudFBhZ2UgKQ0KCQl7DQoJCQl0aGlzLlJlc3RvcmVTY3JvbGxUb3AoIGZhbHNlICk7DQoJCX0NCgl9DQoNCgl2YXIgcGFyYW1zID0gew0KCQlxdWVyeTogdGhpcy5tX3N0clF1ZXJ5LA0KCQlzdGFydDogdGhpcy5tX2NQYWdlU2l6ZSAqIGlQYWdlLA0KCQljb3VudDogdGhpcy5tX2NQYWdlU2l6ZSwNCgkJZHluYW1pY19kYXRhOiB0aGlzLm1fcmdEeW5hbWljRGF0YSwNCgl9Ow0KDQoJaWYgKCB0aGlzLm1fcmdTdGF0aWNQYXJhbXMgIT0gbnVsbCApDQoJew0KCQlmb3IgKCB2YXIgc1BhcmFtTmFtZSBpbiB0aGlzLm1fcmdTdGF0aWNQYXJhbXMgKQ0KCQl7DQoNCgkJCWlmICggdHlwZW9mIHNQYXJhbU5hbWUgIT0gInN0cmluZyIgKQ0KCQkJCWNvbnRpbnVlOw0KDQoJCQl2YXIgdHlwZU9mUGFyYW0gPSB0eXBlb2YgdGhpcy5tX3JnU3RhdGljUGFyYW1zW3NQYXJhbU5hbWVdOw0KDQoJCQlpZiAoIHR5cGVPZlBhcmFtICE9ICJzdHJpbmciICYmIHR5cGVPZlBhcmFtICE9ICJudW1iZXIiICYmIHR5cGVPZlBhcmFtICE9ICJib29sZWFuIiApDQoJCQkJY29udGludWU7DQoNCgkJCXBhcmFtc1tzUGFyYW1OYW1lXSA9IHRoaXMubV9yZ1N0YXRpY1BhcmFtc1tzUGFyYW1OYW1lXTsNCgkJfQ0KCX0NCg0KCWlmICggdGhpcy5tX2ZuUGFnZUNoYW5naW5nSGFuZGxlciAhPSBudWxsICkNCgkJdGhpcy5tX2ZuUGFnZUNoYW5naW5nSGFuZGxlciggaVBhZ2UgKTsNCg0KCWlmICggdGhpcy5tX2ZuUHJlUmVxdWVzdEhhbmRsZXIgIT0gbnVsbCApDQoJCXRoaXMubV9mblByZVJlcXVlc3RIYW5kbGVyKCBwYXJhbXMgKTsNCg0KCXRoaXMuU2hvd1Rocm9iYmVyKCk7DQoNCgl0aGlzLm1fYkxvYWRpbmcgPSB0cnVlOw0KDQoJbmV3IEFqYXguUmVxdWVzdCggdGhpcy5HZXRBY3Rpb25VUkwoICcnICksIHsNCgkJbWV0aG9kOiAnZ2V0JywNCgkJcGFyYW1ldGVyczogcGFyYW1zLA0KCQlvblN1Y2Nlc3M6IHRoaXMuT25SZXNwb25zZVJlbmRlclJlc3VsdHMuYmluZCggdGhpcyApLA0KCQlvbkNvbXBsZXRlOiB0aGlzLk9uQUpBWENvbXBsZXRlLmJpbmQoIHRoaXMgKQ0KCX0pOw0KDQoJcmV0dXJuIHRydWU7DQp9Ow0KDQpDQWpheEluZmluaXRlU2Nyb2xsaW5nQ29udHJvbHMucHJvdG90eXBlLkdldFRocm9iYmVyID0gZnVuY3Rpb24oKSB7DQoJLy8gTkI6IFRoaXMgaXMgdXNpbmcgcHJvdG90eXBlLCAqbm90KiBqUXVlcnksIGhlbmNlIHRoZSBsYWNrIG9mICdKJy4NCglyZXR1cm4gJCh0aGlzLm1fc3RyRWxlbWVudFByZWZpeCArICdfbG9hZGluZycpOw0KfTsNCg0KQ0FqYXhJbmZpbml0ZVNjcm9sbGluZ0NvbnRyb2xzLnByb3RvdHlwZS5IaWRlVGhyb2JiZXIgPSBmdW5jdGlvbigpIHsNCgl2YXIgdGhyb2JiZXIgPSB0aGlzLkdldFRocm9iYmVyKCk7DQoNCglpZiAodGhyb2JiZXIpDQoJCXRocm9iYmVyLmhpZGUoKTsNCn07DQoNCkNBamF4SW5maW5pdGVTY3JvbGxpbmdDb250cm9scy5wcm90b3R5cGUuU2hvd1Rocm9iYmVyID0gZnVuY3Rpb24oKSB7DQoJdmFyIHRocm9iYmVyID0gdGhpcy5HZXRUaHJvYmJlcigpOw0KDQoJaWYgKHRocm9iYmVyKQ0KCQl0aHJvYmJlci5zaG93KCk7DQp9Ow0KDQpDQWpheEluZmluaXRlU2Nyb2xsaW5nQ29udHJvbHMucHJvdG90eXBlLk9uUmVzcG9uc2VSZW5kZXJSZXN1bHRzID0gZnVuY3Rpb24oIHRyYW5zcG9ydCApDQp7DQoNCglpZiAoIHRyYW5zcG9ydC5yZXNwb25zZUpTT04gJiYgdHJhbnNwb3J0LnJlc3BvbnNlSlNPTi5zdWNjZXNzICkNCgl7DQoJCXRoaXMuSGlkZVRocm9iYmVyKCk7DQoNCgkJaWYgKCB0eXBlb2YgUmVjb3JkQUpBWFBhZ2VWaWV3ICE9PSAidW5kZWZpbmVkIiApDQoJCXsNCgkJCVJlY29yZEFKQVhQYWdlVmlldyggdHJhbnNwb3J0LnJlcXVlc3QudXJsICk7DQoJCX0NCg0KCQl2YXIgcmVzcG9uc2UgPSB0cmFuc3BvcnQucmVzcG9uc2VKU09OOw0KCQl0aGlzLm1fY1RvdGFsQ291bnQgPSByZXNwb25zZS50b3RhbF9jb3VudDsNCgkJdGhpcy5tX2NNYXhQYWdlcyA9IE1hdGguY2VpbCggcmVzcG9uc2UudG90YWxfY291bnQgLyB0aGlzLm1fY1BhZ2VTaXplICk7DQoJCXRoaXMubV9pQ3VycmVudFBhZ2UgPSBNYXRoLmZsb29yKCByZXNwb25zZS5zdGFydCAvIHRoaXMubV9jUGFnZVNpemUgKTsNCg0KCQlpZiAoIHRoaXMubV9pQ3VycmVudFBhZ2UgIT0gMCAmJiB0aGlzLm1fY1RvdGFsQ291bnQgPD0gcmVzcG9uc2Uuc3RhcnQgKQ0KCQl7DQoJCQkvLyB0aGlzIHBhZ2UgaXMgbm8gbG9uZ2VyIHZhbGlkLCBmbGlwIGJhY2sgYSBwYWdlIChkZWZlcnJlZCBzbyB0aGF0IHRoZSBBSkFYIGhhbmRsZXIgZXhpdHMgYW5kIHJlc2V0IG1fYkxvYWRpbmcpDQoJCQl0aGlzLkRvbmVSZXN0b3JlU2Nyb2xsVG9wKCk7DQoJCQlyZXR1cm47DQoJCX0NCg0KCQl2YXIgZWxSZXN1bHRzID0gJCh0aGlzLm1fU3RyUm93c0lkKTsNCg0KCQllbFJlc3VsdHMuaW5zZXJ0KCByZXNwb25zZS5yZXN1bHRzX2h0bWwgKTsNCg0KCQl0aGlzLm1fcmdEeW5hbWljRGF0YSA9ICggcmVzcG9uc2UuZHluYW1pY19kYXRhICkgPyByZXNwb25zZS5keW5hbWljX2RhdGEgOiBudWxsOw0KDQoJCWlmICggdGhpcy5tX2ZuUmVzcG9uc2VIYW5kbGVyICE9IG51bGwgKQ0KCQl7DQoJCQl0aGlzLm1fZm5SZXNwb25zZUhhbmRsZXIoIHJlc3BvbnNlICk7DQoJCX0NCg0KCQlpZiAoIHRoaXMubV9mblBhZ2VDaGFuZ2VkSGFuZGxlciAhPSBudWxsICkNCgkJCXRoaXMubV9mblBhZ2VDaGFuZ2VkSGFuZGxlciggdGhpcy5tX2lDdXJyZW50UGFnZSwgZWxSZXN1bHRzICk7DQoNCgkJdGhpcy5tX2JMb2FkaW5nID0gZmFsc2U7DQoJCWlmICggdGhpcy5tX2lDdXJyZW50UGFnZSA8IHRoaXMubV9jTWF4UGFnZXMgLSAxICkNCgkJew0KCQkJdGhpcy5SZXN0b3JlU2Nyb2xsVG9wKCBmYWxzZSApOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJdGhpcy5Eb25lUmVzdG9yZVNjcm9sbFRvcCgpOw0KCQl9DQoJfQ0KCWVsc2UNCgl7DQoJCXRoaXMuRG9uZVJlc3RvcmVTY3JvbGxUb3AoKTsNCgl9DQp9Ow0KDQpmdW5jdGlvbiBDQWpheFBhZ2luZ0NvbnRyb2xzKCByZ1NlYXJjaERhdGEsIHVybCApDQp7DQoJdGhpcy5tX3N0ckFjdGlvblVSTCA9IG51bGw7DQoJdGhpcy5tX2NQYWdlU2l6ZSA9IG51bGw7DQoJdGhpcy5tX3N0ckVsZW1lbnRQcmVmaXggPSAiIjsNCgl0aGlzLm1fc3RyQ2xhc3NQcmVmaXggPSAiIjsNCgl0aGlzLm1fcmdTdGF0aWNQYXJhbXMgPSBudWxsOw0KDQoJdGhpcy5tX3N0clF1ZXJ5ID0gbnVsbDsNCgl0aGlzLm1fY1RvdGFsQ291bnQgPSAwOw0KCXRoaXMubV9pQ3VycmVudFBhZ2UgPSAwOw0KCXRoaXMubV9jTWF4UGFnZXMgPSAwOw0KCXRoaXMubV9iTG9hZGluZyA9IGZhbHNlOw0KDQoJdGhpcy5tX2ZuUHJlUmVxdWVzdEhhbmRsZXIgPSBudWxsOw0KCXRoaXMubV9mblJlc3BvbnNlSGFuZGxlciA9IG51bGw7DQoJdGhpcy5tX2ZuUGFnZUNoYW5naW5nSGFuZGxlciA9IG51bGw7DQoJdGhpcy5tX2ZuUGFnZUNoYW5nZWRIYW5kbGVyID0gbnVsbDsNCg0KDQoJdGhpcy5tX3N0ckFjdGlvblVSTCA9IHVybDsNCg0KCXRoaXMubV9zdHJRdWVyeSA9IHJnU2VhcmNoRGF0YVsncXVlcnknXTsNCgl0aGlzLm1fY1RvdGFsQ291bnQgPSByZ1NlYXJjaERhdGFbJ3RvdGFsX2NvdW50J107DQoJdGhpcy5tX2lDdXJyZW50UGFnZSA9IDA7DQoJdGhpcy5tX2NQYWdlU2l6ZSA9IHJnU2VhcmNoRGF0YVsncGFnZXNpemUnXTsNCgl0aGlzLm1fY01heFBhZ2VzID0gTWF0aC5jZWlsKCB0aGlzLm1fY1RvdGFsQ291bnQgLyB0aGlzLm1fY1BhZ2VTaXplICk7DQoJdGhpcy5tX3N0ckRlZmF1bHRBY3Rpb24gPSB0eXBlb2YgcmdTZWFyY2hEYXRhWydhY3Rpb24nXSAhPSAndW5kZWZpbmVkJyA/IHJnU2VhcmNoRGF0YVsnYWN0aW9uJ10gOiAncmVuZGVyJzsNCgl0aGlzLm1fcmdBdmFpbGFibGVTaXplcyA9IFtdOw0KDQoJaWYgKCByZ1NlYXJjaERhdGFbJ3ByZWZpeCddICkNCgkJdGhpcy5tX3N0ckVsZW1lbnRQcmVmaXggPSByZ1NlYXJjaERhdGFbJ3ByZWZpeCddOw0KDQoJaWYgKCByZ1NlYXJjaERhdGFbJ2NsYXNzX3ByZWZpeCddICkNCgkJdGhpcy5tX3N0ckNsYXNzUHJlZml4ID0gcmdTZWFyY2hEYXRhWydjbGFzc19wcmVmaXgnXTsNCg0KCSQodGhpcy5tX3N0ckVsZW1lbnRQcmVmaXggKyAnX2J0bl9wcmV2Jykub2JzZXJ2ZSggJ2NsaWNrJywgdGhpcy5QcmV2UGFnZS5iaW5kKCB0aGlzICkgKTsNCgkkKHRoaXMubV9zdHJFbGVtZW50UHJlZml4ICsgJ19idG5fbmV4dCcpLm9ic2VydmUoICdjbGljaycsIHRoaXMuTmV4dFBhZ2UuYmluZCggdGhpcyApICk7DQoJdmFyIGVsUGFnZVNpemVDdG4gPSAkKHRoaXMubV9zdHJFbGVtZW50UHJlZml4ICsgJ19wYWdpbmdfc2l6ZV9jdG4nKTsNCglmb3IoIHZhciBpID0gMDsgZWxQYWdlU2l6ZUN0biAmJiBpIDwgJCggZWxQYWdlU2l6ZUN0biApLmNoaWxkcmVuLmxlbmd0aDsgKytpICkNCgl7DQoJCSQodGhpcy5tX3N0ckVsZW1lbnRQcmVmaXggKyAnX3BhZ2luZ19zaXplXycgKyBpICkub2JzZXJ2ZSggJ2NsaWNrJywgdGhpcy5PbkNoYW5nZVNpemUuYmluZCggdGhpcyApICk7DQoNCgkJdGhpcy5tX3JnQXZhaWxhYmxlU2l6ZXMucHVzaCggJCggZWxQYWdlU2l6ZUN0biApLmNoaWxkcmVuW2ldLmRhdGFzZXQuc2l6ZSApOw0KCX0NCg0KCXRoaXMuVXBkYXRlUGFnaW5nRGlzcGxheSgpOw0KfQ0KDQpDQWpheFBhZ2luZ0NvbnRyb2xzLnByb3RvdHlwZS5HZXRBY3Rpb25VUkwgPSBmdW5jdGlvbiggYWN0aW9uICkNCnsNCgl2YXIgdXJsID0gYWN0aW9uID8gdGhpcy5tX3N0ckFjdGlvblVSTCArIGFjdGlvbiArICcvJyA6IHRoaXMubV9zdHJBY3Rpb25VUkw7DQoJcmV0dXJuIHVybDsNCn07DQoNCkNBamF4UGFnaW5nQ29udHJvbHMucHJvdG90eXBlLlNldFByZVJlcXVlc3RIYW5kbGVyID0gZnVuY3Rpb24oIGZuSGFuZGxlciApDQp7DQoJdGhpcy5tX2ZuUHJlUmVxdWVzdEhhbmRsZXIgPSBmbkhhbmRsZXI7DQp9Ow0KDQpDQWpheFBhZ2luZ0NvbnRyb2xzLnByb3RvdHlwZS5TZXRSZXNwb25zZUhhbmRsZXIgPSBmdW5jdGlvbiggZm5IYW5kbGVyICkNCnsNCgl0aGlzLm1fZm5SZXNwb25zZUhhbmRsZXIgPSBmbkhhbmRsZXI7DQp9Ow0KDQpDQWpheFBhZ2luZ0NvbnRyb2xzLnByb3RvdHlwZS5TZXRQYWdlQ2hhbmdpbmdIYW5kbGVyID0gZnVuY3Rpb24gKCBmbkhhbmRsZXIgKQ0Kew0KCXRoaXMubV9mblBhZ2VDaGFuZ2luZ0hhbmRsZXIgPSBmbkhhbmRsZXI7DQp9Ow0KDQpDQWpheFBhZ2luZ0NvbnRyb2xzLnByb3RvdHlwZS5TZXRQYWdlQ2hhbmdlZEhhbmRsZXIgPSBmdW5jdGlvbiAoIGZuSGFuZGxlciApDQp7DQoJdGhpcy5tX2ZuUGFnZUNoYW5nZWRIYW5kbGVyID0gZm5IYW5kbGVyOw0KfTsNCg0KQ0FqYXhQYWdpbmdDb250cm9scy5wcm90b3R5cGUuU2V0U3RhdGljUGFyYW1ldGVycyA9IGZ1bmN0aW9uICggcmdQYXJhbXMgKQ0Kew0KCXRoaXMubV9yZ1N0YXRpY1BhcmFtcyA9IHJnUGFyYW1zOw0KfTsNCg0KQ0FqYXhQYWdpbmdDb250cm9scy5wcm90b3R5cGUuT25BSkFYQ29tcGxldGUgPSBmdW5jdGlvbigpDQp7DQoJdGhpcy5tX2JMb2FkaW5nID0gZmFsc2U7DQp9Ow0KDQpDQWpheFBhZ2luZ0NvbnRyb2xzLnByb3RvdHlwZS5PbkNoYW5nZVNpemUgPSBmdW5jdGlvbiggZXZlbnQgKQ0Kew0KCWlmKCBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LmRhdGFzZXQuc2l6ZSAhPSB0aGlzLm1fY1BhZ2VTaXplICkNCgl7DQoJCXRoaXMubV9jUGFnZVNpemUgPSBldmVudC50YXJnZXQuZGF0YXNldC5zaXplOw0KCQl0aGlzLkdvVG9QYWdlKCAwLCB0cnVlICk7DQoJfQ0KfTsNCg0KQ0FqYXhQYWdpbmdDb250cm9scy5wcm90b3R5cGUuTmV4dFBhZ2UgPSBmdW5jdGlvbigpDQp7DQoJaWYgKCB0aGlzLm1faUN1cnJlbnRQYWdlIDwgdGhpcy5tX2NNYXhQYWdlcyAtIDEgKQ0KCQl0aGlzLkdvVG9QYWdlKCB0aGlzLm1faUN1cnJlbnRQYWdlICsgMSApOw0KfTsNCg0KQ0FqYXhQYWdpbmdDb250cm9scy5wcm90b3R5cGUuUHJldlBhZ2UgPSBmdW5jdGlvbigpDQp7DQoJaWYgKCB0aGlzLm1faUN1cnJlbnRQYWdlID4gMCApDQoJCXRoaXMuR29Ub1BhZ2UoIHRoaXMubV9pQ3VycmVudFBhZ2UgLSAxICk7DQp9Ow0KDQpDQWpheFBhZ2luZ0NvbnRyb2xzLnByb3RvdHlwZS5Hb1RvUGFnZSA9IGZ1bmN0aW9uKCBpUGFnZSwgYkZvcmNlICkNCnsNCglpZiAoIHR5cGVvZiggYkZvcmNlICk9PSAndW5kZWZpbmVkJyB8fCAhYkZvcmNlICkNCgl7DQoJCWlmICggdGhpcy5tX2JMb2FkaW5nIHx8IGlQYWdlID49IHRoaXMubV9jTWF4UGFnZXMgfHwgaVBhZ2UgPCAwIHx8IGlQYWdlID09IHRoaXMubV9pQ3VycmVudFBhZ2UgKQ0KCQkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCXZhciBwYXJhbXMgPSB7DQoJCXF1ZXJ5OiB0aGlzLm1fc3RyUXVlcnksDQoJCXN0YXJ0OiB0aGlzLm1fY1BhZ2VTaXplICogaVBhZ2UsDQoJCWNvdW50OiB0aGlzLm1fY1BhZ2VTaXplDQoJfTsNCg0KCWlmICggdGhpcy5tX3JnU3RhdGljUGFyYW1zICE9IG51bGwgKQ0KCXsNCgkJZm9yICggdmFyIHNQYXJhbU5hbWUgaW4gdGhpcy5tX3JnU3RhdGljUGFyYW1zICkNCgkJew0KCQkJaWYgKCB0eXBlb2Ygc1BhcmFtTmFtZSAhPSAic3RyaW5nIiApDQoJCQkJY29udGludWU7DQoNCgkJCXBhcmFtc1tzUGFyYW1OYW1lXSA9IHRoaXMubV9yZ1N0YXRpY1BhcmFtc1tzUGFyYW1OYW1lXTsNCgkJfQ0KCX0NCg0KCWlmICggdGhpcy5tX2ZuUGFnZUNoYW5naW5nSGFuZGxlciAhPSBudWxsICkNCgkJdGhpcy5tX2ZuUGFnZUNoYW5naW5nSGFuZGxlciggaVBhZ2UgKTsNCg0KCWlmICggdGhpcy5tX2ZuUHJlUmVxdWVzdEhhbmRsZXIgIT0gbnVsbCApDQoJCXRoaXMubV9mblByZVJlcXVlc3RIYW5kbGVyKCBwYXJhbXMgKTsNCg0KCXRoaXMubV9iTG9hZGluZyA9IHRydWU7DQoJbmV3IEFqYXguUmVxdWVzdCggdGhpcy5HZXRBY3Rpb25VUkwoIHRoaXMubV9zdHJEZWZhdWx0QWN0aW9uICksIHsNCgkJbWV0aG9kOiAnZ2V0JywNCgkJcGFyYW1ldGVyczogcGFyYW1zLA0KCQlvblN1Y2Nlc3M6IHRoaXMuT25SZXNwb25zZVJlbmRlclJlc3VsdHMuYmluZCggdGhpcyApLA0KCQlvbkNvbXBsZXRlOiB0aGlzLk9uQUpBWENvbXBsZXRlLmJpbmQoIHRoaXMgKQ0KCX0pOw0KDQoJcmV0dXJuIHRydWU7DQp9Ow0KDQpDQWpheFBhZ2luZ0NvbnRyb2xzLnByb3RvdHlwZS5PblJlc3BvbnNlUmVuZGVyUmVzdWx0cyA9IGZ1bmN0aW9uKCB0cmFuc3BvcnQgKQ0Kew0KCWlmICggdHJhbnNwb3J0LnJlc3BvbnNlSlNPTiAmJiB0cmFuc3BvcnQucmVzcG9uc2VKU09OLnN1Y2Nlc3MgKQ0KCXsNCgkJaWYgKCB0eXBlb2YgUmVjb3JkQUpBWFBhZ2VWaWV3ICE9PSAidW5kZWZpbmVkIiApDQoJCXsNCgkJCVJlY29yZEFKQVhQYWdlVmlldyggdHJhbnNwb3J0LnJlcXVlc3QudXJsICk7DQoJCX0NCg0KCQl2YXIgcmVzcG9uc2UgPSB0cmFuc3BvcnQucmVzcG9uc2VKU09OOw0KCQl0aGlzLm1fY1RvdGFsQ291bnQgPSByZXNwb25zZS50b3RhbF9jb3VudDsNCgkJdGhpcy5tX2NNYXhQYWdlcyA9IE1hdGguY2VpbCggcmVzcG9uc2UudG90YWxfY291bnQgLyB0aGlzLm1fY1BhZ2VTaXplICk7DQoJCXRoaXMubV9pQ3VycmVudFBhZ2UgPSBNYXRoLmZsb29yKCByZXNwb25zZS5zdGFydCAvIHRoaXMubV9jUGFnZVNpemUgKTsNCg0KCQlpZiAoIHRoaXMubV9pQ3VycmVudFBhZ2UgIT0gMCAmJiB0aGlzLm1fY1RvdGFsQ291bnQgPD0gcmVzcG9uc2Uuc3RhcnQgKQ0KCQl7DQoJCQkvLyB0aGlzIHBhZ2UgaXMgbm8gbG9uZ2VyIHZhbGlkLCBmbGlwIGJhY2sgYSBwYWdlIChkZWZlcnJlZCBzbyB0aGF0IHRoZSBBSkFYIGhhbmRsZXIgZXhpdHMgYW5kIHJlc2V0IG1fYkxvYWRpbmcpDQoJCQl0aGlzLkdvVG9QYWdlLmJpbmQoIHRoaXMsIHRoaXMubV9pQ3VycmVudFBhZ2UgLSAxICkuZGVmZXIoKTsNCg0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJdmFyIGVsUmVzdWx0cyA9ICQodGhpcy5tX3N0ckVsZW1lbnRQcmVmaXggKyAnUm93cycpOw0KDQoJCWlmKCBlbFJlc3VsdHMpDQoJCQllbFJlc3VsdHMudXBkYXRlKCByZXNwb25zZS5yZXN1bHRzX2h0bWwgKTsNCg0KCQlpZiAoIHRoaXMubV9mblJlc3BvbnNlSGFuZGxlciAhPSBudWxsICkNCgkJCXRoaXMubV9mblJlc3BvbnNlSGFuZGxlciggcmVzcG9uc2UgKTsNCg0KCQl0aGlzLlVwZGF0ZVBhZ2luZ0Rpc3BsYXkoKTsNCg0KCQlTY3JvbGxUb0lmTm90SW5WaWV3KCAkKHRoaXMubV9zdHJFbGVtZW50UHJlZml4ICsgJ1RhYmxlJyksIDQwICk7DQoJfQ0KfTsNCg0KQ0FqYXhQYWdpbmdDb250cm9scy5wcm90b3R5cGUuVXBkYXRlUGFnaW5nRGlzcGxheSA9IGZ1bmN0aW9uKCkNCnsNCgl2YXIgZWxlbU5vUmVzdWx0cyA9ICQodGhpcy5tX3N0ckVsZW1lbnRQcmVmaXggKyAnX25vX3Jlc3VsdHMnKTsNCglpZiAoIHRoaXMubV9jVG90YWxDb3VudCA9PSAwICkNCgl7DQoJCSQodGhpcy5tX3N0ckVsZW1lbnRQcmVmaXggKyAnX2N0bicpLmhpZGUoKTsNCgkJaWYgKCBlbGVtTm9SZXN1bHRzICkNCgkJCWVsZW1Ob1Jlc3VsdHMuc2hvdygpOw0KCX0NCgllbHNlDQoJew0KCQkkKHRoaXMubV9zdHJFbGVtZW50UHJlZml4ICsgJ19jdG4nKS5zaG93KCk7DQoJCWlmICggZWxlbU5vUmVzdWx0cyApDQoJCQllbGVtTm9SZXN1bHRzLmhpZGUoKTsNCg0KCQkkKHRoaXMubV9zdHJFbGVtZW50UHJlZml4ICsgJ190b3RhbCcpLnVwZGF0ZSggdl9udW1iZXJmb3JtYXQoIHRoaXMubV9jVG90YWxDb3VudCApICk7DQoJCSQodGhpcy5tX3N0ckVsZW1lbnRQcmVmaXggKyAnX3N0YXJ0JykudXBkYXRlKCB2X251bWJlcmZvcm1hdCggdGhpcy5tX2lDdXJyZW50UGFnZSAqIHRoaXMubV9jUGFnZVNpemUgKyAxICkgKTsNCgkJJCh0aGlzLm1fc3RyRWxlbWVudFByZWZpeCArICdfZW5kJykudXBkYXRlKCBNYXRoLm1pbiggKCB0aGlzLm1faUN1cnJlbnRQYWdlICsgMSApICogdGhpcy5tX2NQYWdlU2l6ZSwgdGhpcy5tX2NUb3RhbENvdW50ICkgKTsNCgl9DQoNCgkJaWYoIHRoaXMubV9yZ0F2YWlsYWJsZVNpemVzICYmIHRoaXMubV9yZ0F2YWlsYWJsZVNpemVzLmxlbmd0aCA+IDAgKQ0KCXsNCgkJaWYoIHRoaXMubV9jVG90YWxDb3VudCA8PSB0aGlzLm1fcmdBdmFpbGFibGVTaXplc1swXSApDQoJCXsNCgkJCSQodGhpcy5tX3N0ckVsZW1lbnRQcmVmaXggKyAnX3Blcl9wYWdlX2N0bicpLmhpZGUoKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSQodGhpcy5tX3N0ckVsZW1lbnRQcmVmaXggKyAnX3Blcl9wYWdlX2N0bicpLnNob3coKTsNCgkJfQ0KCX0NCg0KCWlmICggdGhpcy5tX2NNYXhQYWdlcyA8PSAxICkNCgl7DQoJCSQodGhpcy5tX3N0ckVsZW1lbnRQcmVmaXggKyAnX2NvbnRyb2xzJykuaGlkZSgpOw0KCX0NCgllbHNlDQoJew0KCQkkKHRoaXMubV9zdHJFbGVtZW50UHJlZml4ICsgJ19jb250cm9scycpLnNob3coKTsNCgkJaWYgKCB0aGlzLm1faUN1cnJlbnRQYWdlID4gMCApDQoJCQkkKHRoaXMubV9zdHJFbGVtZW50UHJlZml4ICsgJ19idG5fcHJldicpLnJlbW92ZUNsYXNzTmFtZSgnZGlzYWJsZWQnKTsNCgkJZWxzZQ0KCQkJJCh0aGlzLm1fc3RyRWxlbWVudFByZWZpeCArICdfYnRuX3ByZXYnKS5hZGRDbGFzc05hbWUoJ2Rpc2FibGVkJyk7DQoNCgkJaWYgKCB0aGlzLm1faUN1cnJlbnRQYWdlIDwgdGhpcy5tX2NNYXhQYWdlcyAtIDEgKQ0KCQkJJCh0aGlzLm1fc3RyRWxlbWVudFByZWZpeCArICdfYnRuX25leHQnKS5yZW1vdmVDbGFzc05hbWUoJ2Rpc2FibGVkJyk7DQoJCWVsc2UNCgkJCSQodGhpcy5tX3N0ckVsZW1lbnRQcmVmaXggKyAnX2J0bl9uZXh0JykuYWRkQ2xhc3NOYW1lKCdkaXNhYmxlZCcpOw0KDQoJCXZhciBlbFBhZ2VMaW5rcyA9ICQodGhpcy5tX3N0ckVsZW1lbnRQcmVmaXggKyAnX2xpbmtzJyk7DQoJCWVsUGFnZUxpbmtzLnVwZGF0ZSgnJyk7DQoJCS8vIHdlIGFsd2F5cyBzaG93IGZpcnN0LCBsYXN0LCArIDMgcGFnZSBsaW5rcyBjbG9zZXN0IHRvIGN1cnJlbnQgcGFnZQ0KCQl2YXIgY1BhZ2VMaW5rc0FoZWFkQmVoaW5kID0gMjsNCgkJdmFyIGZpcnN0UGFnZUxpbmsgPSBNYXRoLm1heCggdGhpcy5tX2lDdXJyZW50UGFnZSAtIGNQYWdlTGlua3NBaGVhZEJlaGluZCwgMSApOw0KCQl2YXIgbGFzdFBhZ2VMaW5rID0gTWF0aC5taW4oIHRoaXMubV9pQ3VycmVudFBhZ2UgKyAoY1BhZ2VMaW5rc0FoZWFkQmVoaW5kKjIpICsgKCBmaXJzdFBhZ2VMaW5rIC0gdGhpcy5tX2lDdXJyZW50UGFnZSApLCB0aGlzLm1fY01heFBhZ2VzIC0gMiApOw0KDQoJCWlmICggbGFzdFBhZ2VMaW5rIC0gdGhpcy5tX2lDdXJyZW50UGFnZSA8IGNQYWdlTGlua3NBaGVhZEJlaGluZCApDQoJCQlmaXJzdFBhZ2VMaW5rID0gTWF0aC5tYXgoIHRoaXMubV9pQ3VycmVudFBhZ2UgLSAoY1BhZ2VMaW5rc0FoZWFkQmVoaW5kKjIpICsgKCBsYXN0UGFnZUxpbmsgLSB0aGlzLm1faUN1cnJlbnRQYWdlICksIDEgKTsNCg0KCQl0aGlzLkFkZFBhZ2VMaW5rKCBlbFBhZ2VMaW5rcywgMCApOw0KCQlpZiAoIGZpcnN0UGFnZUxpbmsgIT0gMSApDQoJCQllbFBhZ2VMaW5rcy5pbnNlcnQoICcgLi4uICcgKTsNCg0KCQlmb3IgKCB2YXIgaVBhZ2UgPSBmaXJzdFBhZ2VMaW5rOyBpUGFnZSA8PSBsYXN0UGFnZUxpbms7IGlQYWdlKysgKQ0KCQl7DQoJCQl0aGlzLkFkZFBhZ2VMaW5rKCBlbFBhZ2VMaW5rcywgaVBhZ2UgKTsNCgkJfQ0KDQoJCWlmICggbGFzdFBhZ2VMaW5rICE9IHRoaXMubV9jTWF4UGFnZXMgLSAyICkNCgkJCWVsUGFnZUxpbmtzLmluc2VydCggJyAuLi4gJyApOw0KCQl0aGlzLkFkZFBhZ2VMaW5rKCBlbFBhZ2VMaW5rcywgdGhpcy5tX2NNYXhQYWdlcyAtIDEgKTsNCgl9DQoNCgkJaWYoIHRoaXMubV9yZ0F2YWlsYWJsZVNpemVzLmluZGV4T2YoIHRoaXMubV9jUGFnZVNpemUgKSA+IC0xICkNCgl7DQoJCWZvciggdmFyIGkgPSAwOyBpIDwgdGhpcy5tX3JnQXZhaWxhYmxlU2l6ZXMubGVuZ3RoOyArKyBpICkNCgkJew0KCQkJdmFyIGVsU2l6ZUl0ZW0gPSAkKHRoaXMubV9zdHJFbGVtZW50UHJlZml4ICsgJ19wYWdpbmdfc2l6ZV8nICsgaSApOw0KCQkJaWYoIGVsU2l6ZUl0ZW0uZGF0YXNldC5zaXplID09IHRoaXMubV9jUGFnZVNpemUgKQ0KCQkJew0KCQkJCWVsU2l6ZUl0ZW0uYWRkQ2xhc3NOYW1lKCAnc2l6ZV9zZWxlY3RlZCcgKTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQllbFNpemVJdGVtLnJlbW92ZUNsYXNzTmFtZSggJ3NpemVfc2VsZWN0ZWQnICk7DQoJCQl9DQoJCX0NCgl9DQoNCglpZiAoIHRoaXMubV9mblBhZ2VDaGFuZ2VkSGFuZGxlciAhPSBudWxsICkNCgkJdGhpcy5tX2ZuUGFnZUNoYW5nZWRIYW5kbGVyKCB0aGlzLm1faUN1cnJlbnRQYWdlICk7DQp9Ow0KDQpDQWpheFBhZ2luZ0NvbnRyb2xzLnByb3RvdHlwZS5BZGRQYWdlTGluayA9IGZ1bmN0aW9uKCBlbFBhZ2VMaW5rcywgaVBhZ2UgKQ0Kew0KCXZhciBlbCA9IG5ldyBFbGVtZW50KCAnc3BhbicsIHsnY2xhc3MnOiAoIHRoaXMubV9zdHJDbGFzc1ByZWZpeCAhPSAiIiA/IHRoaXMubV9zdHJDbGFzc1ByZWZpeCA6IHRoaXMubV9zdHJFbGVtZW50UHJlZml4ICkgKyAnX3BhZ2luZ19wYWdlbGluaycgfSApOw0KCWVsLnVwZGF0ZSggKGlQYWdlICsgMSkgKyAnICcgKTsNCg0KCWlmICggaVBhZ2UgPT0gdGhpcy5tX2lDdXJyZW50UGFnZSApDQoJCWVsLmFkZENsYXNzTmFtZSggJ2FjdGl2ZScgKTsNCgllbHNlDQoJCWVsLm9ic2VydmUoICdjbGljaycsIHRoaXMuR29Ub1BhZ2UuYmluZCggdGhpcywgaVBhZ2UgKSApOw0KDQoJZWxQYWdlTGlua3MuaW5zZXJ0KCBlbCApOw0KfTsNCg0KDQpmdW5jdGlvbiBDU2xpZGVyKCAkQ29udGFpbmVyLCAkR3JhYmJlciwgYXJncyApDQp7DQoJdGhpcy5tXyRDb250YWluZXIgPSAkQ29udGFpbmVyOw0KCXRoaXMubV8kR3JhYmJlciA9ICRHcmFiYmVyIHx8ICRDb250YWluZXIuZmluZCgnLmhhbmRsZScpOw0KCXRoaXMubV9uTWluVmFsID0gYXJncy5taW4gfHwgMDsNCgl0aGlzLm1fbk1heFZhbCA9IGFyZ3MubWF4IHx8IDEwMDsNCgl0aGlzLm1fbkluY3JlbWVudCA9IGFyZ3MuaW5jcmVtZW50IHx8IDE7DQoJdGhpcy5tX25WYWx1ZSA9IGFyZ3MudmFsdWUgfHwgMDsNCgl0aGlzLm1fZm5PbkNoYW5nZSA9IGFyZ3MuZm5PbkNoYW5nZSB8fCBmdW5jdGlvbiggdmFsdWUsIGJJbkRyYWcgKSB7fTsNCg0KCXRoaXMubV8kR3JhYmJlci5jc3MoICdwb3NpdGlvbicsICdhYnNvbHV0ZScgKTsNCgl0aGlzLkNhbGNSYXRpb3MoKTsNCgl0aGlzLlNldFZhbHVlKCB0aGlzLm1fblZhbHVlICk7DQoNCgl2YXIgZm5HZXRQYWdlWCA9IGZ1bmN0aW9uKCBldmVudCApDQoJew0KCQlpZiAoIGV2ZW50LnR5cGUuaW5kZXhPZiggJ3RvdWNoJyApID09IDAgKQ0KCQl7DQoJCQl2YXIgVG91Y2hFdmVudCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQ7DQoJCQl2YXIgcmdUb3VjaGVzID0gVG91Y2hFdmVudCA/IFRvdWNoRXZlbnQudG91Y2hlcyA6IG51bGw7DQoJCQlpZiAoICFyZ1RvdWNoZXMgfHwgcmdUb3VjaGVzLmxlbmd0aCA8IDEgKQ0KCQkJCXJldHVybiBldmVudC5wYWdlWCB8fCAwOwkvL3Byb2JhYmx5IHdyb25nDQoJCQlyZXR1cm4gcmdUb3VjaGVzWzBdLnBhZ2VYIHx8IDA7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQlyZXR1cm4gZXZlbnQucGFnZVggfHwgMDsNCgkJfQ0KCX07DQoNCgl2YXIgX3RoaXMgPSB0aGlzOw0KCXRoaXMubV8kQ29udGFpbmVyLm9uKCAnbW91c2Vkb3duIHRvdWNoc3RhcnQnLCBmdW5jdGlvbiggZXZlbnQgKSB7DQoJCV90aGlzLkNhbGNSYXRpb3MoKTsNCg0KCQlpZiAoICFfdGhpcy5tXyRHcmFiYmVyLmlzKCBldmVudC50YXJnZXQgKSApDQoJCXsNCgkJCS8vIGp1bXAgdGhlIGdyYWJiZXIgdG8gdGhpcyBwb3NpdGlvbiBhbmQgc3RhcnQgdGhlIGRyYWcNCgkJCXZhciBuUG9zaXRpb24gPSBmbkdldFBhZ2VYKCBldmVudCApIC0gX3RoaXMubV8kQ29udGFpbmVyLm9mZnNldCgpLmxlZnQ7DQoJCQkvLyB3ZSB3YW50IHRoZSBncmFiYmVyIGNlbnRlcmVkIHVuZGVyIHRoZSBtb3N1ZSBpZiBwb3NzaWJsZQ0KCQkJblBvc2l0aW9uIC09IE1hdGguZmxvb3IoIF90aGlzLm1fJEdyYWJiZXIud2lkdGgoKSAvIDIgKTsNCgkJCXZhciBuTmV3UG9zaXRpb24gPSBNYXRoLm1pbiggTWF0aC5tYXgoIG5Qb3NpdGlvbiwgMCApLCBfdGhpcy5tX25XaWR0aCApOw0KDQoJCQlfdGhpcy5tXyRHcmFiYmVyLmNzcygnbGVmdCcsIG5OZXdQb3NpdGlvbiArICdweCcgKTsNCgkJCV90aGlzLm1fblZhbHVlID0gbk5ld1Bvc2l0aW9uIC8gX3RoaXMubV9mbFJhdGlvOw0KCQkJaWYgKCBfdGhpcy5tX25JbmNyZW1lbnQgPiAxICYmIF90aGlzLm1fblZhbHVlIDwgX3RoaXMubV9uTWF4VmFsICkgew0KCQkJCS8vX3RoaXMubV9uVmFsdWUgKz0gX3RoaXMubV9uSW5jcmVtZW50IC0gMTsNCgkJCQlfdGhpcy5tX25WYWx1ZSA9IHBhcnNlSW50KF90aGlzLm1fblZhbHVlIC8gX3RoaXMubV9uSW5jcmVtZW50KSAqIF90aGlzLm1fbkluY3JlbWVudDsNCgkJCX0NCg0KCQkJX3RoaXMubV9mbk9uQ2hhbmdlKCBfdGhpcy5tX25WYWx1ZSwgdHJ1ZSApOw0KCQl9DQoJCXZhciBuSW5pdGlhbFBvc2l0aW9uID0gcGFyc2VJbnQoIF90aGlzLm1fJEdyYWJiZXIuY3NzKCdsZWZ0JykgKTsNCgkJdmFyIG5TdGFydERyYWdYID0gZm5HZXRQYWdlWCggZXZlbnQgKTsNCg0KCQkkSihkb2N1bWVudCkub24oICdtb3VzZW1vdmUuQ1NsaWRlciB0b3VjaG1vdmUuQ1NsaWRlcicsIGZ1bmN0aW9uKCBldmVudCApIHsNCgkJCXZhciBuRGVsdGEgPSBmbkdldFBhZ2VYKCBldmVudCApIC0gblN0YXJ0RHJhZ1g7DQoNCgkJCXZhciBuTmV3UG9zaXRpb24gPSBNYXRoLm1pbiggTWF0aC5tYXgoIG5Jbml0aWFsUG9zaXRpb24gKyBuRGVsdGEsIDAgKSwgX3RoaXMubV9uV2lkdGggKTsNCg0KCQkJX3RoaXMubV8kR3JhYmJlci5jc3MoJ2xlZnQnLCBuTmV3UG9zaXRpb24gKyAncHgnICk7DQoJCQlfdGhpcy5tX25WYWx1ZSA9IG5OZXdQb3NpdGlvbiAvIF90aGlzLm1fZmxSYXRpbzsNCgkJCWlmICggX3RoaXMubV9uSW5jcmVtZW50ID4gMSAgJiYgX3RoaXMubV9uVmFsdWUgPCBfdGhpcy5tX25NYXhWYWwgKSB7DQoJCQkJLy9fdGhpcy5tX25WYWx1ZSArPSBfdGhpcy5tX25JbmNyZW1lbnQgLSAxOw0KCQkJCV90aGlzLm1fblZhbHVlID0gcGFyc2VJbnQoX3RoaXMubV9uVmFsdWUgLyBfdGhpcy5tX25JbmNyZW1lbnQpICogX3RoaXMubV9uSW5jcmVtZW50Ow0KCQkJfQ0KDQoJCQlfdGhpcy5tX2ZuT25DaGFuZ2UoIF90aGlzLm1fblZhbHVlLCB0cnVlICk7DQoJCX0pOw0KCQkkSihkb2N1bWVudCkub24oICdtb3VzZXVwLkNTbGlkZXIgdG91Y2hlbmQuQ1NsaWRlcicsIGZ1bmN0aW9uKCBldmVudCApIHsNCgkJCSRKKGRvY3VtZW50KS5vZmYoJy5DU2xpZGVyJyk7DQoJCQlfdGhpcy5tX2ZuT25DaGFuZ2UoIF90aGlzLm1fblZhbHVlLCBmYWxzZSApOw0KCQl9KTsNCg0KCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KCX0pOw0KfQ0KDQpDU2xpZGVyLnByb3RvdHlwZS5DYWxjUmF0aW9zID0gZnVuY3Rpb24oKQ0Kew0KCXZhciBuR3JhYmJlcldpZHRoID0gdGhpcy5tXyRHcmFiYmVyLndpZHRoKCk7DQoJdGhpcy5tX25XaWR0aCA9IHRoaXMubV8kQ29udGFpbmVyLndpZHRoKCkgLSBuR3JhYmJlcldpZHRoOw0KDQoJdGhpcy5tX2ZsUmF0aW8gPSB0aGlzLm1fbldpZHRoIC8gKCB0aGlzLm1fbk1heFZhbCAtIHRoaXMubV9uTWluVmFsICk7DQp9Ow0KDQpDU2xpZGVyLnByb3RvdHlwZS5TZXRWYWx1ZSA9IGZ1bmN0aW9uKCBuVmFsdWUsIG5BbmltYXRpb25TcGVlZCApDQp7DQoJdGhpcy5tX25WYWx1ZSA9IE1hdGgubWluKCBNYXRoLm1heCggblZhbHVlLCB0aGlzLm1fbk1pblZhbCApLCB0aGlzLm1fbk1heFZhbCApOw0KDQoJdmFyIG5OZXdQb3NpdGlvbiA9IE1hdGguZmxvb3IoICggdGhpcy5tX25WYWx1ZSAtIHRoaXMubV9uTWluVmFsICkgKiB0aGlzLm1fZmxSYXRpbyApOw0KDQoJdGhpcy5tXyRHcmFiYmVyLnN0b3AoKTsNCglpZiAoIG5BbmltYXRpb25TcGVlZCApDQoJCXRoaXMubV8kR3JhYmJlci5hbmltYXRlKCB7bGVmdDogbk5ld1Bvc2l0aW9uIH0sIG5BbmltYXRpb25TcGVlZCApOw0KCWVsc2UNCgkJdGhpcy5tXyRHcmFiYmVyLmNzcyggJ2xlZnQnLCAgbk5ld1Bvc2l0aW9uICsgJ3B4JyApOw0KfTsNCg0KQ1NsaWRlci5wcm90b3R5cGUuR2V0VmFsdWUgPSBmdW5jdGlvbigpDQp7DQoJcmV0dXJuIHRoaXMubV9uVmFsdWU7DQp9Ow0KDQpDU2xpZGVyLnByb3RvdHlwZS5HZXRNaW4gPSBmdW5jdGlvbigpDQp7DQoJcmV0dXJuIHRoaXMubV9uTWluVmFsOw0KfTsNCg0KQ1NsaWRlci5wcm90b3R5cGUuR2V0TWF4ID0gZnVuY3Rpb24oKQ0Kew0KCXJldHVybiB0aGlzLm1fbk1heFZhbDsNCn07DQoNCkNTbGlkZXIucHJvdG90eXBlLlNldFJhbmdlID0gZnVuY3Rpb24oIG5NaW5WYWwsIG5NYXhWYWwsIG5WYWx1ZSApDQp7DQoJdGhpcy5tX25NaW5WYWwgPSBuTWluVmFsOw0KCXRoaXMubV9uTWF4VmFsID0gbk1heFZhbDsNCglpZiAoIHR5cGVvZiBuVmFsdWUgIT0gJ3VuZGVmaW5lZCcgKQ0KCQl0aGlzLm1fblZhbHVlID0gblZhbHVlOw0KCXRoaXMuQ2FsY1JhdGlvcygpOw0KCXRoaXMuU2V0VmFsdWUoIHRoaXMubV9uVmFsdWUgKTsNCn07DQoNCkNTbGlkZXIucHJvdG90eXBlLlNldEluY3JlbWVudCA9IGZ1bmN0aW9uKCBuSW5jcmVtZW50ICkNCnsNCgl0aGlzLm1fbkluY3JlbWVudCA9IG5JbmNyZW1lbnQ7DQp9Ow0KDQpmdW5jdGlvbiBDU2Nyb2xsU2xpZGVyKCAkU2Nyb2xsLCAkQ29udGFpbmVyLCAkR3JhYmJlciwgYXJncyApDQp7DQoJdGhpcy5tXyRTY3JvbGwgPSAkU2Nyb2xsOw0KCXRoaXMubV8kU2xpZGVyQ3RuID0gJENvbnRhaW5lcjsNCg0KCXZhciAkU2xpZGVyID0gJENvbnRhaW5lci5jaGlsZHJlbignLnNsaWRlcicpOw0KDQoJdGhpcy5tX1NsaWRlciA9IG5ldyBDU2xpZGVyKCAkU2xpZGVyLmxlbmd0aCA/ICRTbGlkZXIgOiAkQ29udGFpbmVyLCAkR3JhYmJlciwgeyBmbk9uQ2hhbmdlOiAkSi5wcm94eSggdGhpcy5PblNsaWRlckNoYW5nZSwgdGhpcyApfSApOw0KDQoJdGhpcy5tXyRTY3JvbGwuY3NzKCdvdmVyZmxvd1gnLCAnc2Nyb2xsJyk7DQoJLy8gYWRkIG1vbWVudHVtIG9uIGlPUw0KCXRoaXMubV8kU2Nyb2xsLmNzcygnLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmcnLCAndG91Y2gnKTsNCg0KCXZhciBfdGhpcyA9IHRoaXM7DQoJdmFyIGJEaWRJbml0aWFsUmVjYWxjID0gZmFsc2U7DQoJdGhpcy5tXyRTY3JvbGwub24oICdzY3JvbGwuU2Nyb2xsU2xpZGVyJywgZnVuY3Rpb24oKSB7DQoJCWlmICggIWJEaWRJbml0aWFsUmVjYWxjICkNCgkJew0KCQkJLy8gd2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzIGFsbCB0aGUgdGltZSwgYnV0IG9uIHNvbWUgYnJvd3NlcnMgdGhlIGZpcnN0IGNhbGwgdG8NCgkJCS8vCXVwZGF0ZSByYW5nZXMgaXMgdG9vIGVhcmx5IGFuZCB2YWx1ZXMgZG9uJ3QgY29tcHV0ZSBjb3JyZWN0bHkuDQoJCQlfdGhpcy5VcGRhdGVSYW5nZXMoKTsNCgkJCWJEaWRJbml0aWFsUmVjYWxjID0gdHJ1ZTsNCgkJfQ0KCQlfdGhpcy5tX1NsaWRlci5TZXRWYWx1ZSggX3RoaXMubV8kU2Nyb2xsLnNjcm9sbExlZnQoKSApOw0KCX0pOw0KCSRKKHdpbmRvdykub24oJ3Jlc2l6ZS5TY3JvbGxTbGlkZXInLCBmdW5jdGlvbigpIHsNCgkJX3RoaXMuVXBkYXRlUmFuZ2VzKCk7DQoJfSApOw0KCXRoaXMubV8kU2Nyb2xsLm9uKCAndl9jb250ZW50c2NoYW5nZWQnLCBmdW5jdGlvbigpIHsNCgkJX3RoaXMuVXBkYXRlUmFuZ2VzKCk7DQoJfSApOw0KDQoJdGhpcy5VcGRhdGVSYW5nZXMoKTsNCn0NCg0KQ1Njcm9sbFNsaWRlci5wcm90b3R5cGUuU2V0VmFsdWUgPSBmdW5jdGlvbiggdmFsdWUsIG5BbmltYXRpb25TcGVlZCApIHsNCglpZiAoIG5BbmltYXRpb25TcGVlZCApDQoJew0KCQl0aGlzLm1fJFNjcm9sbC5zdG9wKCkuYW5pbWF0ZSggeydzY3JvbGxMZWZ0JzogdmFsdWUgfSwgbkFuaW1hdGlvblNwZWVkICk7DQoJfQ0KCWVsc2UNCgl7DQoJCXRoaXMubV8kU2Nyb2xsLnN0b3AoKS5zY3JvbGxMZWZ0KCB2YWx1ZSApOw0KCX0NCn07DQoNCkNTY3JvbGxTbGlkZXIucHJvdG90eXBlLkdldFZhbHVlID0gZnVuY3Rpb24oKSB7DQoJcmV0dXJuIHRoaXMubV9TbGlkZXIuR2V0VmFsdWUoKTsNCn07DQoNCkNTY3JvbGxTbGlkZXIucHJvdG90eXBlLlVwZGF0ZVJhbmdlcyA9IGZ1bmN0aW9uKCkNCnsNCgl2YXIgblBhcmVudFdpZHRoID0gdGhpcy5tXyRTY3JvbGwud2lkdGgoKTsNCgl2YXIgblNjcm9sbFdpZHRoID0gdGhpcy5tXyRTY3JvbGxbMF0uc2Nyb2xsV2lkdGg7DQoNCglpZiAoIG5TY3JvbGxXaWR0aCA8PSBuUGFyZW50V2lkdGggKQ0KCXsNCgkJdGhpcy5tXyRTbGlkZXJDdG4uaGlkZSgpOw0KCX0NCgllbHNlDQoJew0KCQl0aGlzLm1fU2xpZGVyLlNldFJhbmdlKCAwLCBuU2Nyb2xsV2lkdGggLSBuUGFyZW50V2lkdGgsIHRoaXMubV8kU2Nyb2xsLnNjcm9sbExlZnQoKSApOw0KCQl0aGlzLm1fJFNsaWRlckN0bi5zaG93KCk7DQoJfQ0KfTsNCg0KQ1Njcm9sbFNsaWRlci5wcm90b3R5cGUuT25TbGlkZXJDaGFuZ2UgPSBmdW5jdGlvbiggdmFsdWUsIGJJbkRyYWcgKQ0Kew0KCXRoaXMubV8kU2Nyb2xsLnN0b3AoKS5zY3JvbGxMZWZ0KCB2YWx1ZSApOw0KfTsNCg0KZnVuY3Rpb24gSXNWYWxpZEVtYWlsQWRkcmVzcyggZW1haWwgKQ0Kew0KCXZhciBlbWFpbF9yZWdleCA9IC9eKCgiW1x3LVxzXSsiKXwoW1x3LV0rKD86XC5bXHctXSspKil8KCJbXHctXHNdKyIpKFtcdy1dKyg/OlwuW1x3LV0rKSopKShAKCg/Oltcdy1dK1wuKSpcd1tcdy1dezAsNjZ9KVwuKFthLXpdezIsNn0oPzpcLlthLXpdezJ9KT8pJCl8KEBcWz8oKDI1WzAtNV1cLnwyWzAtNF1bMC05XVwufDFbMC05XXsyfVwufFswLTldezEsMn1cLikpKCgyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMC05XXsxLDJ9KVwuKXsyfSgyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMC05XXsxLDJ9KVxdPyQpL2k7DQoJcmV0dXJuICggZW1haWwgIT0gJycgJiYgZW1haWxfcmVnZXgudGVzdChlbWFpbCkgKTsNCn0NCg0KDQooZnVuY3Rpb24gKCQpIHsNCiAgJC5kZXBhcmFtID0gZnVuY3Rpb24gKHBhcmFtcywgY29lcmNlKSB7DQogICAgdmFyIG9iaiA9IHt9LA0KICAgICAgICBjb2VyY2VfdHlwZXMgPSB7ICd0cnVlJzogITAsICdmYWxzZSc6ICExLCAnbnVsbCc6IG51bGwgfTsNCg0KICAgICQuZWFjaChwYXJhbXMucmVwbGFjZSgvXCsvZywgJyAnKS5zcGxpdCgnJicpLCBmdW5jdGlvbiAoaix2KSB7DQogICAgICB2YXIgcGFyYW0gPSB2LnNwbGl0KCc9JyksDQogICAgICAgICAga2V5ID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcmFtWzBdKSwNCiAgICAgICAgICB2YWwsDQogICAgICAgICAgY3VyID0gb2JqLA0KICAgICAgICAgIGkgPSAwLA0KDQogICAgICAgICAga2V5cyA9IGtleS5zcGxpdCgnXVsnKSwNCiAgICAgICAgICBrZXlzX2xhc3QgPSBrZXlzLmxlbmd0aCAtIDE7DQoNCiAgICAgIGlmICgvXFsvLnRlc3Qoa2V5c1swXSkgJiYgL1xdJC8udGVzdChrZXlzW2tleXNfbGFzdF0pKSB7DQogICAgICAgIGtleXNba2V5c19sYXN0XSA9IGtleXNba2V5c19sYXN0XS5yZXBsYWNlKC9cXSQvLCAnJyk7DQoNCiAgICAgICAga2V5cyA9IGtleXMuc2hpZnQoKS5zcGxpdCgnWycpLmNvbmNhdChrZXlzKTsNCg0KICAgICAgICBrZXlzX2xhc3QgPSBrZXlzLmxlbmd0aCAtIDE7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBrZXlzX2xhc3QgPSAwOw0KICAgICAgfQ0KDQogICAgICBpZiAocGFyYW0ubGVuZ3RoID09PSAyKSB7DQogICAgICAgIHZhbCA9IGRlY29kZVVSSUNvbXBvbmVudChwYXJhbVsxXSk7DQoNCiAgICAgICAgaWYgKGNvZXJjZSkgew0KICAgICAgICAgIHZhbCA9IHZhbCAmJiAhaXNOYU4odmFsKSAgICAgICAgICAgICAgPyArdmFsICAgICAgICAgICAgICAvLyBudW1iZXINCiAgICAgICAgICAgICAgOiB2YWwgPT09ICd1bmRlZmluZWQnICAgICAgICAgICAgID8gdW5kZWZpbmVkICAgICAgICAgLy8gdW5kZWZpbmVkDQogICAgICAgICAgICAgIDogY29lcmNlX3R5cGVzW3ZhbF0gIT09IHVuZGVmaW5lZCA/IGNvZXJjZV90eXBlc1t2YWxdIC8vIHRydWUsIGZhbHNlLCBudWxsDQogICAgICAgICAgICAgIDogdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCBrZXlzX2xhc3QgKSB7DQogICAgICAgICAgZm9yICg7IGkgPD0ga2V5c19sYXN0OyBpKyspIHsNCiAgICAgICAgICAgIGtleSA9IGtleXNbaV0gPT09ICcnID8gY3VyLmxlbmd0aCA6IGtleXNbaV07DQoNCgkJCQkJCWlmICggdHlwZW9mIGN1ciAhPSAnb2JqZWN0JyApDQoJCQkJYnJlYWs7DQoNCiAgICAgICAgICAgIGN1ciA9IGN1cltrZXldID0gaSA8IGtleXNfbGFzdA0KICAgICAgICAgICAgICA/IGN1cltrZXldIHx8IChrZXlzW2krMV0gJiYgaXNOYU4oa2V5c1tpKzFdKSA/IHt9IDogW10pDQogICAgICAgICAgICAgIDogdmFsOw0KICAgICAgICAgIH0NCg0KICAgICAgICB9IGVsc2Ugew0KDQogICAgICAgICAgaWYgKCQuaXNBcnJheShvYmpba2V5XSkpIHsNCiAgICAgICAgICAgIG9ialtrZXldLnB1c2goIHZhbCApOw0KDQogICAgICAgICAgfSBlbHNlIGlmIChvYmpba2V5XSAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICBvYmpba2V5XSA9IFtvYmpba2V5XSwgdmFsXTsNCg0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBvYmpba2V5XSA9IHZhbDsNCiAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgfSBlbHNlIGlmIChrZXkpIHsNCiAgICAgICAgb2JqW2tleV0gPSBjb2VyY2UNCiAgICAgICAgICA/IHVuZGVmaW5lZA0KICAgICAgICAgIDogJyc7DQogICAgICB9DQogICAgfSk7DQoNCiAgICByZXR1cm4gb2JqOw0KICB9Ow0KfSkoalF1ZXJ5KTsNCg0KLyoqDQogKiBHZW5lcmljIHNlYXJjaCBmaWVsZCB0aGF0IGhhbmRsZXM6DQogKiAxLikgU2hvd2luZyBkZWZhdWx0IHRleHQgaWYgdGhlIGlucHV0IGZpZWxkIGlzIGVtcHR5DQogKiAyLikgV2hlbiB0aGUgaW5wdXQgZmllbGQgZ2V0cyBmb2N1cywgdGhlIHRleHQgZmllbGQgY2xlYXJzDQogKiAzLikgQWRkaW5nIENTUyBjbGFzcyB0byB0aGUgaW5wdXQgZmllbGQgd2hlbiBpdCBpcyBkZWZhdWx0IHRleHQNCiAqIDQuKSBXaGVuIHRoZSB1c2VyIHByZXNzZXMgcmV0dXJuL2VudGVyIGluICB0aGUgZmllbGQNCiAqDQogKiBDYWxsIENsZWFySWZEZWZhdWx0VmFsdWUoKSBiZWZvcmUgc3VibWl0dGluZyB0aGUgZm9ybQ0KICovDQpmdW5jdGlvbiBTZWFyY2hGaWVsZFdpdGhUZXh0KCBlbGVtSUQsIGRlZmF1bHRTZWFyY2hUZXh0LCBvbkVudGVyRnVuYywgZGVmYXVsdFRleHRDU1NDbGFzcyApDQp7DQoJdmFyIGVsZW0gPSAkKCBlbGVtSUQgKTsNCg0KCXRoaXMuZWxlbSA9IGVsZW07DQoJdGhpcy5kZWZhdWx0U2VhcmNoVGV4dCA9IGRlZmF1bHRTZWFyY2hUZXh0Ow0KCXRoaXMuZGVmYXVsdFRleHRDU1NDbGFzcyA9IGRlZmF1bHRUZXh0Q1NTQ2xhc3M7DQoJdGhpcy5vbkVudGVyRnVuYyA9IG9uRW50ZXJGdW5jOw0KDQoJRXZlbnQub2JzZXJ2ZSggZWxlbSwgJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGlja09yRm9jdXMuYmluZCh0aGlzKSk7DQoJRXZlbnQub2JzZXJ2ZSggZWxlbSwgJ2ZvY3VzJywgdGhpcy5oYW5kbGVDbGlja09yRm9jdXMuYmluZCh0aGlzKSk7DQoJRXZlbnQub2JzZXJ2ZSggZWxlbSwgJ2JsdXInLCB0aGlzLmhhbmRsZUJsdXIuYmluZCh0aGlzKSk7DQoJRXZlbnQub2JzZXJ2ZSggZWxlbSwgJ2tleXByZXNzJywgdGhpcy5oYW5kbGVLZXlwcmVzcy5iaW5kKHRoaXMpKTsNCglFdmVudC5vYnNlcnZlKCBlbGVtLmZvcm0sICdzdWJtaXQnLCB0aGlzLkNsZWFySWZEZWZhdWx0VmFsdWUuYmluZCh0aGlzKSk7DQoNCgl0aGlzLmhhbmRsZUJsdXIoKTsNCn0NCg0KU2VhcmNoRmllbGRXaXRoVGV4dC5wcm90b3R5cGUuaGFuZGxlQ2xpY2tPckZvY3VzID0gZnVuY3Rpb24oKQ0Kew0KCWlmICggdGhpcy5lbGVtLnZhbHVlID09IHRoaXMuZGVmYXVsdFNlYXJjaFRleHQgKQ0KCXsNCgkJdGhpcy5lbGVtLnZhbHVlID0gJyc7DQoJCWlmICggdGhpcy5kZWZhdWx0VGV4dENTU0NsYXNzICkNCgkJCXRoaXMuZWxlbS5yZW1vdmVDbGFzc05hbWUoIHRoaXMuZGVmYXVsdFRleHRDU1NDbGFzcyApOw0KCX0NCn07DQoNClNlYXJjaEZpZWxkV2l0aFRleHQucHJvdG90eXBlLmhhbmRsZUJsdXIgPSBmdW5jdGlvbigpDQp7DQoJaWYgKCB0aGlzLmVsZW0udmFsdWUgPT0gJycpDQoJew0KCQl0aGlzLmVsZW0udmFsdWUgPSB0aGlzLmRlZmF1bHRTZWFyY2hUZXh0Ow0KCQlpZiAoIHRoaXMuZGVmYXVsdFRleHRDU1NDbGFzcyApDQoJCQl0aGlzLmVsZW0uYWRkQ2xhc3NOYW1lKCB0aGlzLmRlZmF1bHRUZXh0Q1NTQ2xhc3MgKTsNCgl9DQp9Ow0KDQpTZWFyY2hGaWVsZFdpdGhUZXh0LnByb3RvdHlwZS5oYW5kbGVLZXlwcmVzcyA9IGZ1bmN0aW9uKCkNCnsNCglpZiAoICF0aGlzLm9uRW50ZXJGdW5jICkNCgkJcmV0dXJuOw0KDQoJdmFyIGtleUNvZGUgPSBudWxsOw0KCWlmKCBldmVudC53aGljaCApDQoJew0KCQlrZXlDb2RlID0gZXZlbnQud2hpY2g7DQoJfQ0KCWVsc2UgaWYoIGV2ZW50LmtleUNvZGUgKQ0KCXsNCgkJa2V5Q29kZSA9IGV2dC5rZXlDb2RlOw0KCX0NCglpZiAoIDEzID09IGtleUNvZGUgKQ0KCXsNCgkJdGhpcy5vbkVudGVyRnVuYygpOw0KCX0NCn07DQoNClNlYXJjaEZpZWxkV2l0aFRleHQucHJvdG90eXBlLkNsZWFySWZEZWZhdWx0VmFsdWUgPSBmdW5jdGlvbigpDQp7DQoJaWYgKCB0aGlzLmVsZW0udmFsdWUgPT0gdGhpcy5kZWZhdWx0U2VhcmNoVGV4dCApDQoJew0KCQl0aGlzLmVsZW0udmFsdWUgPSAnJzsNCgl9DQp9Ow0KDQoNCmZ1bmN0aW9uIENXZWJBUEkoIHN0cldlYkFQSUhvc3QsIHN0clNlY3VyZVdlYkFQSUhvc3QsIHN0ck9BdXRoMlRva2VuICkNCnsNCgl0aGlzLm1fc3RySG9zdCA9IHN0cldlYkFQSUhvc3Q7DQoJdGhpcy5tX3N0clNlY3VyZVdlYkFQSUhvc3QgPSBzdHJTZWN1cmVXZWJBUElIb3N0Ow0KCXRoaXMubV9zdHJPQXV0aDJUb2tlbiA9IHN0ck9BdXRoMlRva2VuOw0KfQ0KDQpDV2ViQVBJLnByb3RvdHlwZS5CdWlsZFVSTCA9IGZ1bmN0aW9uKCBzdHJJbnRlcmZhY2UsIHN0ck1ldGhvZCwgYlNlY3VyZSwgc3RyVmVyc2lvbiApDQp7DQoJaWYgKCAhc3RyVmVyc2lvbiApDQoJCXN0clZlcnNpb24gPSAndjAwMDEnOw0KDQoJdmFyIHN0clVSTCA9ICggYlNlY3VyZSA/IHRoaXMubV9zdHJTZWN1cmVXZWJBUElIb3N0IDogdGhpcy5tX3N0ckhvc3QgKTsNCglzdHJVUkwgKz0gc3RySW50ZXJmYWNlICsgJy8nICsgc3RyTWV0aG9kICsgJy8nICsgc3RyVmVyc2lvbiArICcvJzsNCg0KCXJldHVybiBzdHJVUkw7DQp9Ow0KDQpDV2ViQVBJLnByb3RvdHlwZS5FeGVjSlNPTlAgPSBmdW5jdGlvbiggc3RySW50ZXJmYWNlLCBzdHJNZXRob2QsIHJnUGFyYW1zLCBiU2VjdXJlLCBzdHJWZXJzaW9uLCBjVGltZW91dFNlY3MgKQ0Kew0KCXJnUGFyYW1zLmFjY2Vzc190b2tlbiA9IHRoaXMubV9zdHJPQXV0aDJUb2tlbjsNCg0KCXZhciByZ0pRdWVyeVBhcmFtcyA9IHsNCgkJdXJsOiB0aGlzLkJ1aWxkVVJMKCBzdHJJbnRlcmZhY2UsIHN0ck1ldGhvZCwgYlNlY3VyZSwgc3RyVmVyc2lvbiApLA0KCQlkYXRhVHlwZTogJ2pzb25wJywNCgkJanNvbnA6ICdqc29ucCcsCQkJCWRhdGE6IHJnUGFyYW1zDQoJfTsNCg0KCWlmICggY1RpbWVvdXRTZWNzICkNCgkJcmdKUXVlcnlQYXJhbXNbJ3RpbWVvdXQnXSA9IGNUaW1lb3V0U2VjcyAqIDEwMDA7DQoNCglyZXR1cm4gJEouYWpheCggcmdKUXVlcnlQYXJhbXMgKTsNCg0KCS8qDQoJLy8gdXNpbmcganNvbnAgcGx1Z2luIGluc3RlYWQgb2YgYnVpbHQtaW4ganF1ZXJ5IGpzb25wIGhhbmRsaW5nLiAgdGhpcyBsaWJyYXJ5IHN1cHBvc2VkbHkNCgkvLwl3b3JrcyBhcm91bmQgdGhlIGZpcmVmb3ggIndhaXRpbmcgZm9yIGhvc3QuLi4iIGlzc3VlLCBidXQgaXQgZG9lc24ndCB3b3JrLg0KCXJldHVybiAkSi5qc29ucCh7DQoJCXVybDogdGhpcy5CdWlsZFVSTCggc3RySW50ZXJmYWNlLCBzdHJNZXRob2QsIGJTZWN1cmUsIHN0clZlcnNpb24gKSwNCgkJY2FsbGJhY2tQYXJhbWV0ZXI6ICdqc29ucCcsCQkJCWRhdGE6IHJnUGFyYW1zDQoJfSk7DQoJKi8NCn07DQoNCi8vIFNlbmQgYSAiYmVhY29uIiwgd2hpY2ggaXMgc3BlY2lmaWNhbGx5IGludGVuZGVkIGZvciB1c2UgaW4gT25VbmxvYWQgZXZlbnRzIChhcyBvdXRzZGFuZGluZyBBSkFYL0pTT05QIHJlcXVlc3RzIG1heSBiZSBjYW5jZWxsZWQpDQovLyBhcyBvZiBzZXB0IDIwMTUsIG9ubHkgY2hyb21lIGFuZCBmaXJlZm94IHN1cHBvcnQgdGhpcywgbm8gaU9TIG9yIElFIHN1cHBvcnQuICBDaGVjayBmb3Igc3VwcG9ydCBiZWZvcmUgY2FsbGluZy4NCi8vIEJlYWNvbnMgYXJlIChwZXIgc3BlYykgYWx3YXlzIGEgUE9TVCByZXF1ZXN0LCBhbmQgYWx3YXlzIGluY2x1ZGUgQ09SUyBoZWFkZXJzLiAgV2ViQVBJIHJlc3BvbmRlcyBwcm9wZXJseSB0byBDT1JTIGZvciBWYWx2ZSBkb21haW5zLg0KQ1dlYkFQSS5wcm90b3R5cGUuRXhlY0JlYWNvbiA9IGZ1bmN0aW9uKCBzdHJJbnRlcmZhY2UsIHN0ck1ldGhvZCwgcmdQYXJhbXMsIGJTZWN1cmUsIHN0clZlcnNpb24gKQ0Kew0KCXJnUGFyYW1zLmFjY2Vzc190b2tlbiA9IHRoaXMubV9zdHJPQXV0aDJUb2tlbjsNCg0KCXZhciBmZFBhcmFtcyA9IG5ldyBGb3JtRGF0YSgpOw0KCWZvciAoIHZhciBrZXkgaW4gcmdQYXJhbXMgKQ0KCQlmZFBhcmFtcy5hcHBlbmQoIGtleSwgcmdQYXJhbXNba2V5XSApOw0KDQoJbmF2aWdhdG9yLnNlbmRCZWFjb24oIHRoaXMuQnVpbGRVUkwoIHN0ckludGVyZmFjZSwgc3RyTWV0aG9kLCBiU2VjdXJlLCBzdHJWZXJzaW9uICksIGZkUGFyYW1zICk7DQp9Ow0KDQoNCkNXZWJBUEkucHJvdG90eXBlLkV4ZWNQT1NUID0gZnVuY3Rpb24oIHN0ckludGVyZmFjZSwgc3RyTWV0aG9kLCByZ1BhcmFtcywgYlNlY3VyZSwgc3RyVmVyc2lvbiApDQp7DQoJcmdQYXJhbXMuYWNjZXNzX3Rva2VuID0gdGhpcy5tX3N0ck9BdXRoMlRva2VuOw0KCXJnUGFyYW1zLmZvcm1hdCA9ICdqc29uJzsNCg0KCXJldHVybiAkSi5hamF4KCB7DQoJCXVybDogdGhpcy5CdWlsZFVSTCggc3RySW50ZXJmYWNlLCBzdHJNZXRob2QsIGJTZWN1cmUsIHN0clZlcnNpb24gKSwNCgkJdHlwZTogJ1BPU1QnLA0KCQlkYXRhOiByZ1BhcmFtcw0KCX0pOw0KfTsNCg0KLy8gcmVnaXN0ZXIgc29tZSBldmVudHMgdG8gZGlzbWlzcyBwb3B1cCAoaWUsIHVzZXIgY2xpY2tpbmcgZWxzZXdoZXJlIG9uIHRoZSB3aW5kb3csIGVzY2FwZSkNCi8vICAgY2xlYW5zIHVwIGV2ZW50IGJpbmRzIGFmdGVyd2FyZHMuICBjbGlja3MgdG8gY2hpbGRyZW4gb2YgImVsZW1JZ25vcmUiIHdpbGwgbm90IGRpc21pc3MgcG9wdXANCmZ1bmN0aW9uIFJlZ2lzdGVyUG9wdXBEaXNtaXNzYWwoIGRpc21pc3NGdW5jLCBlbGVtSWdub3JlICkNCnsNCgl2YXIgJElnbm9yZSA9ICRKRnJvbUlET3JFbGVtZW50KCBlbGVtSWdub3JlICk7DQoJLy8gZGVsYXkgcmVnaXN0cmF0aW9uIGJ5IG9uZSBmcmFtZSBzbyB0aGF0IHdlIGRvbid0IGNhdGNoIHRoZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGlzIHBvcHVwLg0KCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsNCgkJJEooZG9jdW1lbnQpLm9uKCdjbGljay5SZWdpc3RlclBvcHVwRGlzbWlzc2FsIGtleWRvd24uUmVnaXN0ZXJQb3B1cERpc21pc3NhbCcsIGZ1bmN0aW9uIChldmVudCkgew0KDQoJCQlpZiAoZXZlbnQua2V5Q29kZSAmJiBldmVudC5rZXlDb2RlICE9IDI3IC8qIEtFWV9FU0MgKi8pIHsNCgkJCQlyZXR1cm47DQoJCQl9DQoJCQl2YXIgZWxlbSA9ICRKKGV2ZW50LnRhcmdldCk7DQoNCgkJCWlmICggJElnbm9yZS5sZW5ndGggJiYgJEouY29udGFpbnMoICRJZ25vcmVbMF0sIGVsZW1bMF0gKSApDQoJCQkJcmV0dXJuOw0KDQoJCQlkaXNtaXNzRnVuYygpOw0KCQkJVW5yZWdpc3RlclBvcHVwRGlzbWlzc2FsKCBlbGVtSWdub3JlICk7DQoJCX0pOw0KDQoJCS8vIHN1cHBvcnQgZ2FtZXBhZCBCIGJ1dHRvbiB0byBkaXNtaXNzDQoJCSRJZ25vcmUub24oICd2Z3Bfb25jYW5jZWwnLCBmdW5jdGlvbiAoIGV2ZW50ICkgew0KCQkJZGlzbWlzc0Z1bmMoKTsNCgkJCVVucmVnaXN0ZXJQb3B1cERpc21pc3NhbCggZWxlbUlnbm9yZSApOw0KDQoJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsNCgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQoJCX0pOw0KCX0sIDEgKTsNCn0NCg0KLyogQ2xlYW51cCBmdW5jdGlvbiBmb3IgdGhlIGFib3ZlIFJlZ2lzdGVyUG9wdXBEaXNtaXNzYWwoKQ0KICAgVGhpcyBuZWVkcyB0byBiZSBhY2Nlc3NpYmxlIHRvIHBvcHVwIG93bmVycyBzbyB0aGV5IGNhbiBjYWxsIHRoaXMgaWYgdGhleSdyZSBjbG9zaW5nIHRoZSBwb3B1cCAqLw0KZnVuY3Rpb24gVW5yZWdpc3RlclBvcHVwRGlzbWlzc2FsKCBlbGVtSWdub3JlICkNCnsNCgkkSihkb2N1bWVudCkub2ZmKCAnLlJlZ2lzdGVyUG9wdXBEaXNtaXNzYWwnICk7DQoNCglpZiAoIGVsZW1JZ25vcmUgKQ0KCXsNCgkJLy8gdW5yZWdpc3RlciBnYW1lcGFkIEIgYnV0dG9uIHByZXNzIGhhbmRsaW5nDQoJCSRKRnJvbUlET3JFbGVtZW50KCBlbGVtSWdub3JlICkub2ZmKCAndmdwX29uY2FuY2VsJyApOw0KCX0NCn0NCg0KDQpmdW5jdGlvbiBTaG93TWVudSggZWxlbUxpbmssIGVsZW1Qb3B1cCwgYWxpZ24sIHZhbGlnbiwgYkxpbmtIYXNCb3JkZXIgKQ0Kew0KCXZhciAkUG9wdXAgPSAkSkZyb21JRE9yRWxlbWVudChlbGVtUG9wdXApOw0KDQoJLy8gSWYgd2UncmUgaW4gdGFibGV0IHNjcmVlbiBtb2RlIHB1dCB0aGUgbWVudSBjb250ZW50IGluIGEgbW9kYWwgZGlhbG9nDQoJdmFyIGJVc2VHYW1lcGFkU2NyZWVuTW9kZSA9IHdpbmRvdy5Vc2VHYW1lcGFkU2NyZWVuTW9kZSAmJiB3aW5kb3cuVXNlR2FtZXBhZFNjcmVlbk1vZGUoKTsNCglpZiAoIGJVc2VHYW1lcGFkU2NyZWVuTW9kZSApDQoJew0KCQkvLyBkZXRhY2ggdGhpcyBlbGVtZW50IGFuZCB3aGVuIHRoZSBkaWFsb2cgY2xvc2VzIHJlLWF0dGFjaCB0byB0aGUgZG9jdW1lbnQgYm9keQ0KCQkkUG9wdXAuZGV0YWNoKCk7DQoJCXZhciBvcmlnaW5hbFBvcHVwUG9zaXRpb24gPSAkUG9wdXAuY3NzKCAncG9zaXRpb24nICk7DQoJCSRQb3B1cC5jc3MoICdwb3NpdGlvbicsICdzdGF0aWMnICk7IC8vIGNsZWFyIHBvc3NpYmxlIGFic29sdXRlIHBvc2l0aW9uaW5nDQoJCSRQb3B1cC5zaG93KCk7DQoNCgkJU2hvd0RpYWxvZyggJycsICRQb3B1cCApLmFsd2F5cygNCgkJCWZ1bmN0aW9uKCkgew0KCQkJCS8vIHNhdmUgaXQgYXdheSBhZ2FpbiBmb3IgbGF0ZXINCgkJCQkkUG9wdXAuaGlkZSgpOw0KCQkJCSRQb3B1cC5jc3MoICdwb3NpdGlvbicsIG9yaWdpbmFsUG9wdXBQb3NpdGlvbiApOyAvLyByZXN0b3JlIHBvc2l0aW9uaW5nDQoJCQkJJEooIGRvY3VtZW50LmJvZHkgKS5hcHBlbmQoICRQb3B1cCApOw0KCQkJfQ0KCQkpOw0KDQoJCXJldHVybjsNCgl9DQoNCgl2YXIgJExpbmsgPSAkSkZyb21JRE9yRWxlbWVudChlbGVtTGluayk7DQoJaWYgKCAkTGluay5oYXNDbGFzcygnZm9jdXMnKSApDQoJew0KCQlIaWRlTWVudSggZWxlbUxpbmssIGVsZW1Qb3B1cCApOw0KCQlyZXR1cm47DQoJfQ0KDQoJQWxpZ25NZW51KCAkTGluaywgJFBvcHVwLCBhbGlnbiwgdmFsaWduLCBiTGlua0hhc0JvcmRlciApOw0KDQoJU2hvd1dpdGhGYWRlKCAkUG9wdXAgKTsNCgkkTGluay5hZGRDbGFzcygnZm9jdXMnKTsNCglSZWdpc3RlclBvcHVwRGlzbWlzc2FsKCBmdW5jdGlvbigpIHsgSGlkZU1lbnUoIGVsZW1MaW5rLCBlbGVtUG9wdXAgKTsgfSwgJFBvcHVwICk7DQoNCgkvLyBJZiB3ZSB1c2UgdGhpcyBjb250cm9sIG9uIGdhbWVwYWQgKGhhdmVuJ3QgZm91bmQgYW4gZXhhbXBsZSB5ZXQgd2UncmUgZ29pbmcgdG8ga2VlcCkgdGhlbiB3ZSdsbCBuZWVkIHRvDQoJLy8gYWRkIGNhbGxpbmc6IEdQT25TaG93aW5nTW9kYWxXaW5kb3coICRQb3B1cFswXSApLiAgU2VlIHNoYXJlZF9yZXNwb25zaXZlX2FkYXB0ZXIuanMgZm9yIGV4YW1wbGUNCn0NCg0KZnVuY3Rpb24gSGlkZU1lbnUoIGVsZW1MaW5rLCBlbGVtUG9wdXAgKQ0Kew0KCXZhciAkTGluayA9ICRKRnJvbUlET3JFbGVtZW50KGVsZW1MaW5rKTsNCgl2YXIgJFBvcHVwID0gJEpGcm9tSURPckVsZW1lbnQoZWxlbVBvcHVwKTsNCg0KCSRMaW5rLmRhdGEoICdtZW51LWFjdGl2ZScsIGZhbHNlICk7DQoJSGlkZVdpdGhGYWRlKCAkUG9wdXAgKTsNCgkkTGluay5yZW1vdmVDbGFzcyggJ2ZvY3VzJyApOw0KDQoJVW5yZWdpc3RlclBvcHVwRGlzbWlzc2FsKCBlbGVtUG9wdXAgKTsNCn0NCg0KZnVuY3Rpb24gSGlkZU1lbnVGYXN0KCBlbGVtTGluaywgZWxlbVBvcHVwICkNCnsNCgl2YXIgJExpbmsgPSAkSkZyb21JRE9yRWxlbWVudChlbGVtTGluayk7DQoJdmFyICRQb3B1cCA9ICRKRnJvbUlET3JFbGVtZW50KGVsZW1Qb3B1cCk7DQoNCgkkUG9wdXAuaGlkZSgpOw0KCSRMaW5rLnJlbW92ZUNsYXNzKCAnZm9jdXMnICk7DQoNCglVbnJlZ2lzdGVyUG9wdXBEaXNtaXNzYWwoIGVsZW1Qb3B1cCApOw0KfQ0KDQoNCmZ1bmN0aW9uIFJlZ2lzdGVyRmx5b3V0KCBlbGVtTGluaywgZWxlbVBvcHVwLCBhbGlnbiwgdmFsaWduLCBiTGlua0hhc0JvcmRlciApDQp7DQoJdmFyICRMaW5rID0gJEpGcm9tSURPckVsZW1lbnQoIGVsZW1MaW5rICk7DQoJdmFyICRQb3B1cCA9ICRKRnJvbUlET3JFbGVtZW50KCBlbGVtUG9wdXAgKTsNCg0KCSRMaW5rLm9uKCAnbW91c2VlbnRlcicsIGZ1bmN0aW9uKCBldmVudCApIHsNCgkJRmx5b3V0TWVudSggJExpbmssICRQb3B1cCwgYWxpZ24sIHZhbGlnbiwgYkxpbmtIYXNCb3JkZXIgKTsNCgl9KTsNCg0KCSRMaW5rLmFkZCggJFBvcHVwICkub24oICdtb3VzZWxlYXZlJywgZnVuY3Rpb24oIGV2ZW50ICkgew0KCQlIaWRlRmx5b3V0TWVudSggZXZlbnQsICRMaW5rLCAkUG9wdXAgKTsNCgl9KTsNCn0NCg0KZnVuY3Rpb24gVXNlU21hbGxTY3JlZW5NZW51KCkNCnsNCgkvLyB0aGUgbmV3IG1vYmlsZSBhcHAgdXNlcyB0aGUgc21hbGwgc2NyZWVuIG1lbnUgcmVnYXJkbGVzcyBvZiBzY3JlZW4gc2l6ZQ0KCXJldHVybiAoIHdpbmRvdy5Vc2VTbWFsbFNjcmVlbk1vZGUgJiYgd2luZG93LlVzZVNtYWxsU2NyZWVuTW9kZSgpICkgfHwgKCB3aW5kb3cuVXNlTmV3TW9iaWxlQXBwTW9kZSAmJiB3aW5kb3cuVXNlTmV3TW9iaWxlQXBwTW9kZSgpICk7DQp9DQoNCmZ1bmN0aW9uIEZseW91dE1lbnUoIGVsZW1MaW5rLCBlbGVtUG9wdXAsIGFsaWduLCB2YWxpZ24sIGJMaW5rSGFzQm9yZGVyLCBlbGVtQWx0ZXJuYXRlQWxpZ25UbyApDQp7DQoJdmFyICRMaW5rID0gJEpGcm9tSURPckVsZW1lbnQoZWxlbUxpbmspOw0KCXZhciAkUG9wdXAgPSAkSkZyb21JRE9yRWxlbWVudChlbGVtUG9wdXApOw0KDQoJaWYgKCAhJFBvcHVwLmlzKCc6dmlzaWJsZScpIHx8ICRQb3B1cC5jc3MoJ29wYWNpdHknKSA8IDEuMCApDQoJew0KCQlpZiAoICRQb3B1cC5oYXNDbGFzcyggJ3Jlc3BvbnNpdmVfc2xpZGVkb3duJykgJiYgVXNlU21hbGxTY3JlZW5NZW51KCkgKQ0KCQl7DQoJCQkkUG9wdXAuc3RvcCgpLnNsaWRlRG93bigpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJLy8gUmVzcG9uc2l2ZSBtb2RlIGNhbGxzIHNsaWRlRG93biwgd2hpY2ggYXBwbGllcyBwb3NpdGlvbjogcmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQgYW5kIHdlIG5lZWQgdG8gY2xlYXIgaXQuDQoJCQkvLyBUaGlzIHdpbGwgb25seSBoYXBwZW4gaWYgdGhlIHVzZXIgaW50ZXJhY3RlZCB3aXRoIHRoZSBtZW51IGluIHRoZSByZXNwb25zaXZlIG1vZGUsIHRoZW4gcmVzaXplZA0KCQkJLy8gdGhlaXIgd2luZG93IHRvIGJlIGxhcmdlIGFuZCBob3ZlcmVkIHRoZSBlbGVtZW50cy4NCgkJCSRQb3B1cC5jc3MoIHsgcG9zaXRpb246ICcnIH0gKTsNCgkJCUFsaWduTWVudSggJExpbmssICRQb3B1cCwgYWxpZ24sIHZhbGlnbiwgYkxpbmtIYXNCb3JkZXIsIGVsZW1BbHRlcm5hdGVBbGlnblRvIHx8IG51bGwgKTsNCgkJCVNob3dXaXRoRmFkZSggJFBvcHVwICk7DQoJCX0NCg0KCQkkTGluay5hZGRDbGFzcygnZm9jdXMnKTsNCgl9DQoNCn0NCg0KZnVuY3Rpb24gSGlkZUZseW91dE1lbnUoIGV2ZW50LCBlbGVtTGluaywgZWxlbVBvcHVwICkNCnsNCgl2YXIgJExpbmsgPSAkSkZyb21JRE9yRWxlbWVudChlbGVtTGluayk7DQoJdmFyICRQb3B1cCA9ICRKRnJvbUlET3JFbGVtZW50KGVsZW1Qb3B1cCk7DQoNCglpZiAoICEkTGluay5oYXNDbGFzcygnZm9jdXMnKSApDQoJCXJldHVybjsNCg0KCWlmICggZXZlbnQgKQ0KCXsNCgkJdmFyIHJlbHRhcmdldCA9ICRKKCBldmVudC5yZWxhdGVkVGFyZ2V0ICk7DQoJCWlmICggIXJlbHRhcmdldC5sZW5ndGggfHwNCgkJCSggJExpbmsubGVuZ3RoICYmICRKLmNvbnRhaW5zKCAkTGlua1swXSwgcmVsdGFyZ2V0WzBdICkgKSB8fA0KCQkJKCAkUG9wdXAubGVuZ3RoICYmICRKLmNvbnRhaW5zKCAkUG9wdXBbMF0sIHJlbHRhcmdldFswXSApICkgfHwNCgkJCSRMaW5rLmlzKCByZWx0YXJnZXQgKSApDQoJCQlyZXR1cm47DQoJfQ0KCS8vIHN0YXJ0IGhpZGluZyBpbiBhIGxpdHRsZSBiaXQsIGhhdmUgdG8gbGV0IHRoZSBmYWRlIGluIGFuaW1hdGlvbiBzdGFydCBiZWZvcmUgd2UgY2FuIGNhbmNlbCBpdA0KDQoJaWYgKCAkUG9wdXAuaGFzQ2xhc3MoICdyZXNwb25zaXZlX3NsaWRlZG93bicpICYmIFVzZVNtYWxsU2NyZWVuTWVudSgpICkNCgkJJFBvcHVwLnN0b3AoKS5zbGlkZVVwKCk7DQoJZWxzZQ0KCQl3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7IEhpZGVXaXRoRmFkZSggJFBvcHVwICk7IH0sIDMzICk7DQoNCgkkTGluay5yZW1vdmVDbGFzcygnZm9jdXMnKTsNCgkkSihkb2N1bWVudCkub2ZmKCcuRmx5b3V0RGlzbWlzcycpOw0KfQ0KDQpmdW5jdGlvbiBBbGlnbk1lbnUoIGVsZW1MaW5rLCBlbGVtUG9wdXAsIGFsaWduLCB2YWxpZ24sIGJMaW5rSGFzQm9yZGVyLCBlbGVtQWx0ZXJuYXRlQWxpZ25UbyApDQp7DQoJLy8gYWx0ZXJuYXRlIGFsaWduIHRvIGlzIHVzZWQgdG8gYWxpZ24gdGhlIGdlbnJlIG1lbnUgb24gdGhlIHN0b3JlOyBpdCdzIG9ubHkgdXNlZCBmb3IgaG9yaXpvbnRhbCBhbGlnbm1lbnQsDQoJLy8gdHJ5aW5nIHRvIGFsaWduIHRvIGl0IHZlcnRpY2FsbHkgbWVzc2VzIHVwIHJlc3BvbnNpdmUgdmlldy4NCgl2YXIgJExpbmtWZXJ0aWNhbCA9ICRKRnJvbUlET3JFbGVtZW50KGVsZW1MaW5rKTsNCgl2YXIgJExpbmtIb3Jpem9udGFsID0gZWxlbUFsdGVybmF0ZUFsaWduVG8gPyAkSkZyb21JRE9yRWxlbWVudChlbGVtQWx0ZXJuYXRlQWxpZ25UbykgOiAkTGlua1ZlcnRpY2FsOw0KDQoJdmFyIGFsaWduID0gYWxpZ24gPyBhbGlnbiA6ICdsZWZ0JzsNCgkvLyBmbGlwIGFsaWdubWVudHMgZm9yIFJUTA0KCWlmICggJExpbmtWZXJ0aWNhbD8uWzBdPy5tYXRjaGVzKCAnOmRpcihydGwpJyApID8/IGRvY3VtZW50LmRpciA9PT0gInJ0bCIgKQ0KCXsNCgkJaWYgKCBhbGlnbiA9PT0gJ2xlZnQnICkNCgkJew0KCQkJYWxpZ24gPSAncmlnaHQnOw0KCQl9DQoJCWVsc2UgaWYgKCBhbGlnbiA9PT0gJ3JpZ2h0JyApDQoJCXsNCgkJCWFsaWduID0gJ2xlZnQnOw0KCQl9DQoJCWVsc2UgaWYgKCBhbGlnbiA9PT0gJ2xlZnRzdWJtZW51JyApDQoJCXsNCgkJCWFsaWduID0gJ3JpZ2h0c3VibWVudSc7DQoJCX0NCgkJZWxzZSBpZiAoIGFsaWduID09PSAncmlnaHRzdWJtZW51JyApDQoJCXsNCgkJCWFsaWduID0gJ2xlZnRzdWJtZW51JzsNCgkJfQ0KCX0NCg0KCXZhciAkUG9wdXAgPSAkSkZyb21JRE9yRWxlbWVudChlbGVtUG9wdXApOw0KDQoNCgl2YXIgb2Zmc2V0TGlua1ZlcnRpY2FsID0gJExpbmtWZXJ0aWNhbC5vZmZzZXQoKTsNCgl2YXIgb2Zmc2V0TGlua0hvcml6b250YWwgPSAkTGlua0hvcml6b250YWwub2Zmc2V0KCk7DQoJdmFyIG5XaW5kb3dTY3JvbGxUb3AgPSAkSih3aW5kb3cpLnNjcm9sbFRvcCgpOw0KCXZhciBuVmlld3BvcnRIZWlnaHQgPSAkSih3aW5kb3cpLmhlaWdodCgpOw0KDQoJdmFyIG5MaW5rVmlld3BvcnRUb3AgPSBvZmZzZXRMaW5rVmVydGljYWwudG9wIC0gbldpbmRvd1Njcm9sbFRvcDsNCg0KCS8vIGFkZCBhIGxpdHRsZSBiaXQgb2YgcGFkZGluZyBzbyB3ZSBkb24ndCBwb3NpdGlvbiBpdCBmbHVzaCB0byBhbiBlZGdlIGlmIHBvc3NpYmxlDQoJdmFyIG5Qb3B1cEhlaWdodCA9ICRQb3B1cC5oZWlnaHQoKSArIDg7DQoNCglpZiAoICF2YWxpZ24gKQ0KCXsNCgkJLy9pZiB0aGVyZSdzIG5vdCBlbm91Z2ggcm9vbSBiZXR3ZWVuIG91ciBzcG90IGFuZCB0aGUgdG9wIG9mIHRoZSBkb2N1bWVudCwgd2UgZGVmaW5pdGVseSB3YW50IHRvIGRyb3AgZG93bg0KCQlpZiAoIG5XaW5kb3dTY3JvbGxUb3AgKyBvZmZzZXRMaW5rVmVydGljYWwudG9wIDwgblBvcHVwSGVpZ2h0ICkNCgkJew0KCQkJdmFsaWduID0gJ2JvdHRvbSc7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQl2YXIgblNwYWNlQWJvdmUgPSBuTGlua1ZpZXdwb3J0VG9wOw0KCQkJdmFyIG5TcGFjZUJlbG93ID0gblZpZXdwb3J0SGVpZ2h0IC0gKCBuTGlua1ZpZXdwb3J0VG9wICsgJExpbmtWZXJ0aWNhbC5oZWlnaHQoKSApOw0KCQkJLy9vdGhlcndpc2Ugd2Ugb25seSB3YW50IHRvIGRyb3AgZG93biBpZiB3ZSd2ZSBnb3QgZW5vdWdoIHNwYWNlIGJlbG93IHVzIChtZWFzdXJlZCBiYXNlZCBvbiB2aWV3IGFyZWEpDQoJCQkvLyBvciBpZiB0aGVyZSdzIG5vdCBlbm91Z2ggc3BhY2UgYWJvdmUgdG8gcG9wIGluIGVpdGhlciBkaXJlY3Rpb24gYW5kIHRoZXJlJ3MgbW9yZSBzcGFjZSBiZWxvdw0KCQkJaWYgKCBuU3BhY2VCZWxvdyA+IG5Qb3B1cEhlaWdodCB8fCAoIG5TcGFjZUFib3ZlIDwgblBvcHVwSGVpZ2h0ICYmIG5TcGFjZUJlbG93ID4gblNwYWNlQWJvdmUgKSApDQoJCQkJdmFsaWduID0gJ2JvdHRvbSc7DQoJCQllbHNlDQoJCQkJdmFsaWduID0gJ3RvcCc7DQoNCgkJfQ0KCX0NCg0KCXZhciBib3JkZXJweCA9IGJMaW5rSGFzQm9yZGVyID8gMSA6IDA7DQoJdmFyIHNoYWRvd3B4ID0gJFBvcHVwLmhhc0NsYXNzKCAncG9wdXBfYmxvY2tfbmV3JyApID8gMCA6IDEyOw0KCXZhciBvZmZzZXRMZWZ0ID0gMDsNCg0KCWlmICggYWxpZ24gPT0gJ2xlZnQnICkNCgl7DQoJCS8vZWxlbVBvcHVwLnN0eWxlLmxlZnQgPSAoIGVsZW1MaW5rLnBvc2l0aW9uZWRPZmZzZXQoKVswXSAtIDEyICkgKyAncHgnOw0KCQlvZmZzZXRMZWZ0ID0gLXNoYWRvd3B4IC0gYm9yZGVycHg7DQoJfQ0KCWVsc2UgaWYgKCBhbGlnbiA9PSAncmlnaHQnICkNCgl7DQoJCS8vZWxlbVBvcHVwLnN0eWxlLmxlZnQgPSAoIGVsZW1MaW5rLnBvc2l0aW9uZWRPZmZzZXQoKVswXSArIGVsZW1MaW5rLmdldFdpZHRoKCkgLSBlbGVtUG9wdXAuZ2V0V2lkdGgoKSArIDEzICkgKyAncHgnOw0KCQlvZmZzZXRMZWZ0ID0gJExpbmtIb3Jpem9udGFsLm91dGVyV2lkdGgoKSAtICRQb3B1cC5vdXRlcldpZHRoKCkgKyBzaGFkb3dweCArIGJvcmRlcnB4Ow0KCX0NCgllbHNlIGlmICggYWxpZ24gPT0gJ2xlZnRzdWJtZW51JyApDQoJew0KCQkvL2VsZW1Qb3B1cC5zdHlsZS5sZWZ0ID0gKCBlbGVtTGluay5wb3NpdGlvbmVkT2Zmc2V0KClbMF0gLSBlbGVtUG9wdXAuZ2V0V2lkdGgoKSArIDEyICkgKyAncHgnOw0KCQlvZmZzZXRMZWZ0ID0gLSRQb3B1cC5vdXRlcldpZHRoKCkgKyBzaGFkb3dweCAtIGJvcmRlcnB4Ow0KCX0NCgllbHNlIGlmICggYWxpZ24gPT0gJ3JpZ2h0c3VibWVudScgKQ0KCXsNCgkJLy9lbGVtUG9wdXAuc3R5bGUubGVmdCA9ICggZWxlbUxpbmsucG9zaXRpb25lZE9mZnNldCgpWzBdICsgZWxlbUxpbmsuZ2V0V2lkdGgoKSAtIDEyICkgKyAncHgnOw0KCQlvZmZzZXRMZWZ0ID0gJExpbmtIb3Jpem9udGFsLm91dGVyV2lkdGgoKSAgLSBzaGFkb3dweCArIDIgKiBib3JkZXJweDsNCgl9DQoNCgl2YXIgb2Zmc2V0VG9wID0gMDsNCglpZiAoIHZhbGlnbiA9PSAnYm90dG9tJyApDQoJew0KCQkvL2VsZW1Qb3B1cC5zdHlsZS50b3AgPSAoIGVsZW1MaW5rLnBvc2l0aW9uZWRPZmZzZXQoKVsxXSArIGVsZW1MaW5rLmdldEhlaWdodCgpIC0gMTIgKSArICdweCc7DQoJCW9mZnNldFRvcCA9ICRMaW5rVmVydGljYWwub3V0ZXJIZWlnaHQoKSAtIHNoYWRvd3B4Ow0KCX0NCgllbHNlIGlmICggdmFsaWduID09ICd0b3AnICkNCgl7DQoJCS8vZWxlbVBvcHVwLnN0eWxlLnRvcCA9ICggZWxlbUxpbmsucG9zaXRpb25lZE9mZnNldCgpWzFdIC0gZWxlbVBvcHVwLmdldEhlaWdodCgpICsgMTIgKSArICdweCc7DQoJCW9mZnNldFRvcCA9IC0kUG9wdXAub3V0ZXJIZWlnaHQoKSArIHNoYWRvd3B4Ow0KCX0NCgllbHNlIGlmICggdmFsaWduID09ICdib3R0b21zdWJtZW51JyApDQoJew0KCQkvL2VsZW1Qb3B1cC5zdHlsZS50b3AgPSAoIGVsZW1MaW5rLnBvc2l0aW9uZWRPZmZzZXQoKVsxXSAtIDEyICkgKyAncHgnOw0KCQlvZmZzZXRUb3AgPSAtc2hhZG93cHg7DQoJfQ0KDQoNCgl2YXIgYlBvcHVwSGlkZGVuID0gISRQb3B1cC5pcygnOnZpc2libGUnKTsNCg0KCWlmICggYlBvcHVwSGlkZGVuICkNCgl7DQoJCS8vIElFIGNhbid0IGRvIHRoaXMgd2l0aCBkaXNwbGF5OiBub25lIGVsZW1lbnRzDQoJCSRQb3B1cC5jc3MoICd2aXNpYmlsaXR5JywgJ2hpZGRlbicgKTsNCgkJJFBvcHVwLnNob3coKTsNCgl9DQoNCgkkUG9wdXAub2Zmc2V0KCB7DQoJCXRvcDogTWF0aC5tYXgoIG9mZnNldExpbmtWZXJ0aWNhbC50b3AgKyBvZmZzZXRUb3AsIDAgKSwNCgkJbGVmdDogTWF0aC5tYXgoIG9mZnNldExpbmtIb3Jpem9udGFsLmxlZnQgKyBvZmZzZXRMZWZ0LCAwICkNCgl9KTsNCg0KCWlmICggYlBvcHVwSGlkZGVuICkNCgl7DQoJCS8vIHJlc3RvcmUgdmlzaWJpbGl0eQ0KCQkkUG9wdXAuaGlkZSgpOw0KCQkkUG9wdXAuY3NzKCAndmlzaWJpbGl0eScsICd2aXNpYmxlJyApOw0KCX0NCn0NCg0KZnVuY3Rpb24gQmluZEF1dG9GbHlvdXRFdmVudHMoKQ0Kew0KCXZhciBmblNob3dGbHlvdXQgPSBmdW5jdGlvbiggJFRhYiwgYklzSG92ZXIsIGJUYWtlRm9jdXMgKQ0KCXsNCgkJdmFyICRDb250ZW50ID0gJEooJyMnICsgJFRhYi5kYXRhKCdmbHlvdXQnKSApOw0KCQl2YXIgYlJlc3BvbnNpdmVTbGlkZWRvd25NZW51ID0gVXNlU21hbGxTY3JlZW5NZW51KCkgJiYgJENvbnRlbnQuaGFzQ2xhc3MoJ3Jlc3BvbnNpdmVfc2xpZGVkb3duJyk7DQoNCgkJaWYgKCAhJENvbnRlbnQubGVuZ3RoIHx8ICRDb250ZW50LmRhdGEoJ2ZseW91dC1ldmVudC1ydW5uaW5nJykgfHwNCgkJCShiSXNIb3ZlciAmJiBiUmVzcG9uc2l2ZVNsaWRlZG93bk1lbnUgKSApDQoJCQlyZXR1cm47DQoNCgkJJENvbnRlbnQuZGF0YSggJ2ZseW91dC1ldmVudC1ydW5uaW5nJywgdHJ1ZSApOw0KCQl3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7ICRDb250ZW50LmRhdGEoJ2ZseW91dC1ldmVudC1ydW5uaW5nJywgZmFsc2UgKTsgfSwgMSApOw0KDQoJCWlmICggJENvbnRlbnQuaXMoJzp2aXNpYmxlJykgKQ0KCQl7DQoJCQlpZiAoICFiSXNIb3ZlciApDQoJCQkJSGlkZUZseW91dE1lbnUoIG51bGwsICRUYWIsICRDb250ZW50ICk7DQoNCgkJCXJldHVybjsNCgkJfQ0KDQoJCWlmICggISRDb250ZW50LmRhdGEoJ2ZseW91dC1ldmVudHMtYm91bmQnKSApDQoJCXsNCgkJCSRDb250ZW50Lm9uKCdtb3VzZWxlYXZlLkZseW91dCcsIGZ1bmN0aW9uKCBlICkgew0KCQkJCWlmICggVXNlU21hbGxTY3JlZW5NZW51KCkgJiYgJENvbnRlbnQuaGFzQ2xhc3MoJ3Jlc3BvbnNpdmVfc2xpZGVkb3duJykgKQ0KCQkJCQlyZXR1cm47DQoNCgkJCQlpZiAoICRUYWIuaXMoIGUucmVsYXRlZFRhcmdldCApIHx8ICRKLmNvbnRhaW5zKCAkVGFiWzBdLCBlLnJlbGF0ZWRUYXJnZXQgKSApDQoJCQkJCXJldHVybjsNCg0KCQkJCUhpZGVGbHlvdXRNZW51KCBudWxsLCAkVGFiLCAkQ29udGVudCApOw0KCQkJfSk7DQoNCgkJCSRDb250ZW50LmFkZCgkVGFiKS5vbigndmdwX29uY2FuY2VsJywgZnVuY3Rpb24oIGUgKSB7DQoJCQkJSGlkZUZseW91dE1lbnUoIG51bGwsICRUYWIsICRDb250ZW50ICk7DQoJCQkJaWYgKCB0eXBlb2YgR1BOYXZGb2N1c0NoaWxkICE9ICd1bmRlZmluZWQnICkNCgkJCQkJR1BOYXZGb2N1c0NoaWxkKCAkVGFiICk7DQoJCQl9KTsNCg0KCQkJJENvbnRlbnQub24oJ3ZncF9vbmJsdXInLCBmdW5jdGlvbiggZSApIHsNCgkJCQl2YXIgbm9kZSA9IGUub3JpZ2luYWxFdmVudC5kZXRhaWwuZm9jdXNlZE5vZGU7DQoJCQkJY29uc29sZS5sb2coIG5vZGUgKTsNCgkJCQlpZiAoICFub2RlIHx8ICEkSi5jb250YWlucyggZS5jdXJyZW50VGFyZ2V0LCBub2RlLkVsZW1lbnQgKSApDQoJCQkJCUhpZGVGbHlvdXRNZW51KCBudWxsLCAkVGFiLCAkQ29udGVudCApOw0KCQkJfSk7DQoNCgkJCSRDb250ZW50LmRhdGEoJ2ZseW91dC1ldmVudHMtYm91bmQnLCB0cnVlICk7DQoJCX0NCg0KDQoJCUZseW91dE1lbnUoICRUYWIsICRDb250ZW50LCAkVGFiLmRhdGEoJ2ZseW91dC1hbGlnbicpLCAkVGFiLmRhdGEoJ2ZseW91dC12YWxpZ24nKSwgZmFsc2UsICRUYWIuZGF0YSgnZmx5b3V0LWFsaWduLXRvLWVsZW1lbnQnICkgKTsNCg0KCQlpZiAoIGJUYWtlRm9jdXMgJiYgdHlwZW9mIEdQTmF2Rm9jdXNDaGlsZCAhPT0gJ3VuZGVmaW5lZCcgKQ0KCQl7DQoJCQl3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7DQoJCQkJY29uc29sZS5sb2coICdSZXF1ZXN0IGZvY3VzIGluJywgJENvbnRlbnRbMF0gKTsNCgkJCQlHUE5hdkZvY3VzQ2hpbGQoICRDb250ZW50ICk7DQoJCQl9LCA1ICk7DQoJCX0NCg0KCQlpZiAoIHdpbmRvdy5Vc2VUb3VjaEZyaWVuZGx5TW9kZSAmJiB3aW5kb3cuVXNlVG91Y2hGcmllbmRseU1vZGUoKSApDQoJCXsNCgkJCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsNCgkJCQkkSihkb2N1bWVudCkub24oJ2NsaWNrLkZseW91dERpc21pc3MnLCBmdW5jdGlvbihlKSB7DQoJCQkJCWlmICggJEouY29udGFpbnMoICRDb250ZW50WzBdLCBlLnRhcmdldCApIHx8ICRDb250ZW50LmlzKCBlLnRhcmdldCApICkNCgkJCQkJCXJldHVybjsNCg0KCQkJCQlIaWRlRmx5b3V0TWVudSggbnVsbCwgJFRhYiwgJENvbnRlbnQgKTsNCgkJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOw0KCQkJCX0pOw0KCQkJfSwgMSApOw0KCQl9DQoJfTsNCg0KCSRKKGRvY3VtZW50KS5vbiggJ21vdXNlZW50ZXIuRmx5b3V0IGNsaWNrLkZseW91dCcsICcuZmx5b3V0X3RhYicsIGZ1bmN0aW9uKGUpIHsNCgkJdmFyICRUYWIgPSAkSih0aGlzKTsNCgkJdmFyIG1zRGVsYXkgPSAkVGFiLmRhdGEoJ2ZseW91dC1kZWxheScpOw0KDQoJCXZhciBiSXNIb3ZlciA9IGUudHlwZSA9PSAnbW91c2VlbnRlcic7DQoNCgkJaWYgKCAhYklzSG92ZXIgfHwgIW1zRGVsYXkgKQ0KCQl7DQoJCQlmblNob3dGbHlvdXQoICRUYWIsIGJJc0hvdmVyICk7DQoJCX0NCgkJZWxzZSBpZiAoICEkVGFiLmRhdGEoICdpRmx5b3V0SW50ZXJ2YWwnICkgKQ0KCQl7DQoJCQl2YXIgZm5DbGVhbnVwRmx5b3V0SW50ZXJ2YWwgPSBmdW5jdGlvbigpIHsNCgkJCQkkVGFiLnJlbW92ZURhdGEoICdpRmx5b3V0SW50ZXJ2YWwnICk7DQoJCQkJJFRhYi5vZmYoICdtb3VzZWxlYXZlLkZseW91dENhbmNlbCcgKTsNCgkJCX0NCgkJCSRUYWIub24oICdtb3VzZWxlYXZlLkZseW91dENhbmNlbCcsIGZ1bmN0aW9uKGUpIHsNCgkJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCAkVGFiLmRhdGEoJ2lGbHlvdXRJbnRlcnZhbCcpICk7DQoJCQkJZm5DbGVhbnVwRmx5b3V0SW50ZXJ2YWwoKTsNCgkJCX0pOw0KCQkJJFRhYi5kYXRhKCAnaUZseW91dEludGVydmFsJywgd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgew0KCQkJCWZuQ2xlYW51cEZseW91dEludGVydmFsKCk7DQoJCQkJZm5TaG93Rmx5b3V0KCAkVGFiLCBiSXNIb3ZlciApOw0KCQkJfSwgbXNEZWxheSApICk7DQoJCX0NCg0KCX0pOw0KDQoJJEooZG9jdW1lbnQpLm9uKCdtb3VzZWxlYXZlLkZseW91dCcsICcuZmx5b3V0X3RhYicsIGZ1bmN0aW9uKGUpIHsNCgkJdmFyICRUYWIgPSAkSih0aGlzKTsNCgkJdmFyICRDb250ZW50ID0gJEooJyMnICsgJFRhYi5kYXRhKCdmbHlvdXQnKSApOw0KCQl2YXIgYlJlc3BvbnNpdmVTbGlkZWRvd25NZW51ID0gVXNlU21hbGxTY3JlZW5NZW51KCkgJiYgJENvbnRlbnQuaGFzQ2xhc3MoJ3Jlc3BvbnNpdmVfc2xpZGVkb3duJyk7DQoNCgkJaWYgKCAhJENvbnRlbnQubGVuZ3RoIHx8ICRDb250ZW50LmRhdGEoJ2ZseW91dC1ldmVudC1ydW5uaW5nJykgfHwgYlJlc3BvbnNpdmVTbGlkZWRvd25NZW51IHx8DQoJCQkkQ29udGVudC5pcyggZS5yZWxhdGVkVGFyZ2V0ICkgfHwgJEouY29udGFpbnMoICRDb250ZW50WzBdLCBlLnJlbGF0ZWRUYXJnZXQgKSApDQoJCQlyZXR1cm47DQoNCgkJaWYgKCAkQ29udGVudC5pcygnOnZpc2libGUnKSApDQoJCXsNCgkJCUhpZGVGbHlvdXRNZW51KCBudWxsLCAkVGFiLCAkQ29udGVudCApOw0KDQoJCQlyZXR1cm47DQoJCX0NCgl9KTsNCg0KCQkkSihkb2N1bWVudCkub24oJ3ZncF9vbm9rJywgJy5mbHlvdXRfdGFiJywgZnVuY3Rpb24oIGUgKSB7DQoJCWZuU2hvd0ZseW91dCggJEoodGhpcyksIGZhbHNlLCB0cnVlICk7DQoJCWUuc3RvcFByb3BhZ2F0aW9uKCk7DQoJfSk7DQp9DQoNCmZ1bmN0aW9uIFBvbGxPblVzZXJBY3Rpb25BZnRlckludGVydmFsKCBzdHJOYW1lc3BhY2UsIG5Qb2xsSW50ZXJ2YWwsIGZuQ2FsbGJhY2ssIG5Qb2xsSW1tZWRpYXRlSW50ZXJ2YWwgKQ0Kew0KCXZhciBiQ2FsbGJhY2tJbnZva2VkID0gZmFsc2U7DQoJdmFyIHRzTGFzdFVzZXJBY3Rpb24gPSAkSi5ub3coKTsNCgl2YXIgZm5JbnZva2VDYWxsYmFja09uTmV4dFVzZXJBY3Rpb247DQoNCgl2YXIgc3RyRXZlbnRzID0gWyd0b3VjaHN0YXJ0JywnbW91c2Vtb3ZlJywnZm9jdXMnLCdzY3JvbGwnLCcnXS5qb2luKCAnLicgKyBzdHJOYW1lc3BhY2UgKyAnICcgKTsNCg0KCXZhciBmbkRvUG9sbCA9IGZ1bmN0aW9uKCkgew0KCQlpZiAoICFiQ2FsbGJhY2tJbnZva2VkICkNCgkJCWZuQ2FsbGJhY2soKTsNCgkJYkNhbGxiYWNrSW52b2tlZCA9IHRydWU7DQoJCWZuSW52b2tlQ2FsbGJhY2tPbk5leHRVc2VyQWN0aW9uKCk7DQoJfTsNCg0KCWZuSW52b2tlQ2FsbGJhY2tPbk5leHRVc2VyQWN0aW9uID0gZnVuY3Rpb24oKSB7DQoJCXdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsNCgkJCWJDYWxsYmFja0ludm9rZWQgPSBmYWxzZTsNCgkJCWlmICggblBvbGxJbW1lZGlhdGVJbnRlcnZhbCAmJiAkSi5ub3coKSA8PSB0c0xhc3RVc2VyQWN0aW9uICsgblBvbGxJbW1lZGlhdGVJbnRlcnZhbCApDQoJCQl7DQoJCQkJZm5Eb1BvbGwoKTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkSih3aW5kb3cpLm9uKCBzdHJFdmVudHMsIGZ1bmN0aW9uKCkgew0KCQkJCQkkSih3aW5kb3cgKS5vZmYoICcuJyArIHN0ck5hbWVzcGFjZSApOw0KCQkJCQl0c0xhc3RVc2VyQWN0aW9uID0gJEoubm93KCk7DQoJCQkJCWZuRG9Qb2xsKCk7DQoJCQkJfSk7DQoJCQl9DQoJCX0sIG5Qb2xsSW50ZXJ2YWwgKTsNCgl9Ow0KDQoJZm5JbnZva2VDYWxsYmFja09uTmV4dFVzZXJBY3Rpb24oKTsNCn0NCg0KdmFyIERFTEFZX0JFVFdFRU5fTk9USUZJQ0FUSU9OX0NPVU5UX1BPTExTX01TID0gNjAgKiAxMDAwOw0KZnVuY3Rpb24gRW5hYmxlTm90aWZpY2F0aW9uQ291bnRQb2xsaW5nKCkNCnsNCglQb2xsT25Vc2VyQWN0aW9uQWZ0ZXJJbnRlcnZhbCggJ05vdGlmaWNhdGlvbkNvdW50UG9sbCcsIERFTEFZX0JFVFdFRU5fTk9USUZJQ0FUSU9OX0NPVU5UX1BPTExTX01TLCBVcGRhdGVOb3RpZmljYXRpb25Db3VudHMgKTsNCn0NCg0KZnVuY3Rpb24gVXBkYXRlTm90aWZpY2F0aW9uQ291bnRzKCkNCnsNCglpZiAoIHdpbmRvdy5SZWZyZXNoU3RlYW1Ob3RpZmljYXRpb25zICkNCgkJd2luZG93LlJlZnJlc2hTdGVhbU5vdGlmaWNhdGlvbnMoKTsNCn0NCg0KZnVuY3Rpb24gUG9zdFRvVVJMV2l0aFNlc3Npb24oIHVybCwgcmdQYXJhbXMgKQ0Kew0KCXZhciAkRm9ybSA9ICRKKCc8Zm9ybS8+JywgeydhY3Rpb24nOiB1cmwsICdtZXRob2QnOiAnUE9TVCcgfSApOw0KDQoJLy8gc2l0ZSBtdXN0IHNldCB0aGlzIGpzIHZhciBvciBwYXNzIHRvIHRoaXMgZnVuY3Rpb24NCglpZiAoIHR5cGVvZiBnX3Nlc3Npb25JRCAhPSAndW5kZWZpbmVkJyApDQoJCSRGb3JtLmFwcGVuZCggJEooJzxpbnB1dC8+Jywgeyd0eXBlJzogJ2hpZGRlbicsICduYW1lJzogJ3Nlc3Npb25pZCcsICd2YWx1ZSc6IGdfc2Vzc2lvbklEIH0gKSApOw0KDQoJaWYgKCByZ1BhcmFtcyApDQoJew0KCQlmb3IgKCB2YXIgbmFtZSBpbiByZ1BhcmFtcyApDQoJCQkkRm9ybS5hcHBlbmQoICRKKCc8aW5wdXQvPicsIHsndHlwZSc6ICdoaWRkZW4nLCAnbmFtZSc6IG5hbWUsICd2YWx1ZSc6IHJnUGFyYW1zW25hbWVdIH0gKSApOw0KCX0NCgkkRm9ybS5hcHBlbmRUbyggJ2JvZHknICk7DQoJJEZvcm0uc3VibWl0KCk7DQp9DQoNCg0KZnVuY3Rpb24gU2hvd1dpdGhGYWRlKCBlbGVtLCBzcGVlZCApDQp7DQoJdmFyICRFbGVtID0gJEpGcm9tSURPckVsZW1lbnQoZWxlbSk7DQoNCgkkRWxlbS5zdG9wKCk7DQoJJEVsZW0uZmFkZVRvKCBzcGVlZCB8fCAyMDAsIDEuMCApOwkvL2ZhZGVUbyByYXRoZXIgdGhhbiBmYWRlSW4gaW4gY2FzZSBpdCB3YXMgYWxyZWFkeSBpbiBhIGZhZGUNCn0NCg0KZnVuY3Rpb24gSGlkZVdpdGhGYWRlKCBlbGVtLCBzcGVlZCApDQp7DQoJdmFyICRFbGVtID0gJEpGcm9tSURPckVsZW1lbnQoZWxlbSk7DQoNCgkkRWxlbS5zdG9wKCk7DQoJJEVsZW0uZmFkZU91dCggc3BlZWQgfHwgMjAwICk7DQp9DQoNCg0KZnVuY3Rpb24gTGF1bmNoV2ViQ2hhdCggcGFyYW1zLCBwYXJhbXNGcmllbmRzVUkgKQ0Kew0KCXZhciB3aW5DaGF0ID0gd2luZG93Lm9wZW4oICcnLCAnU3RlYW1XZWJDaGF0JywgJ2hlaWdodD03OTAsd2lkdGg9MTAxNSxyZXNpemU9eWVzLHNjcm9sbGJhcnM9eWVzJyApOw0KCWlmICggIXdpbkNoYXQgKQ0KCXsNCgkJLy8gcG9wdXAgYmxvY2tlZCAtIHRoaXMgc29tZXRpbWVzIGhhcHBlbnMgd2hlbiBjaGF0IGlzIGluaXRpYXRlZCBmcm9tIHRoZSBzdG9yZS4gIGp1c3Qgcm9sbCB3aXRoIGl0Lg0KCQlyZXR1cm47DQoJfQ0KDQoJdmFyIGJOZXdQb3B1cCA9IGZhbHNlOw0KCXZhciBiQ3Jvc3NPcmlnaW4gPSBmYWxzZTsNCg0KCXRyeSB7DQoJCWJOZXdQb3B1cCA9ICh3aW5DaGF0LmxvY2F0aW9uID09ICAnYWJvdXQ6YmxhbmsnICk7DQoJfQ0KCWNhdGNoICggZSApDQoJew0KCQkvLyBjcm9zcy1vcmlnaW4gZXhjZXB0aW9uIG9uIGh0dHAgcGFnZXMgZXRjDQoJCWJDcm9zc09yaWdpbiA9IHRydWU7DQoJfQ0KDQoJaWYgKCBiTmV3UG9wdXAgKQ0KCXsNCgkJaWYgKCBwYXJhbXMgKQ0KCQkJU2V0VmFsdWVMb2NhbFN0b3JhZ2UoICdyZ0NoYXRTdGFydHVwUGFyYW0nLCBWX1RvSlNPTiggcGFyYW1zICkgKTsNCg0KCQlpZiAoIHBhcmFtc0ZyaWVuZHNVSSApDQoJCXsNCgkJCXZhciBmbkJvdW5kTWVzc2FnZUxpc3RlbmVyID0gZnVuY3Rpb24oIGV2ZW50ICkNCgkJCXsNCgkJCQlpZiAoIGV2ZW50LnNvdXJjZSA9PSB3aW5DaGF0ICYmIGV2ZW50LmRhdGEgPT0gIkZyaWVuZHNVSVJlYWR5IiAmJg0KCQkJCQlldmVudC5vcmlnaW4gPT0gJ2h0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tJykNCgkJCQl7DQoJCQkJCXdpbkNoYXQucG9zdE1lc3NhZ2UoIHBhcmFtc0ZyaWVuZHNVSSwgJ2h0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tLycgKTsNCgkJCQkJd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdtZXNzYWdlJywgZm5Cb3VuZE1lc3NhZ2VMaXN0ZW5lciApOw0KCQkJCX0NCgkJCX07DQoJCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ21lc3NhZ2UnLCBmbkJvdW5kTWVzc2FnZUxpc3RlbmVyICk7DQoJCX0NCg0KCQkvLyBjcmVhdGVkIGEgbmV3IHdpbmRvdywgc2V0IHRoZSB1cmwNCgkJd2luQ2hhdC5sb2NhdGlvbiA9ICdodHRwczovL3N0ZWFtY29tbXVuaXR5LmNvbS9jaGF0Lyc7DQoJfQ0KCWVsc2UNCgl7DQoJCWlmICggcGFyYW1zICYmICFiQ3Jvc3NPcmlnaW4gJiYgd2luQ2hhdC5PbldlYmNoYXRMYXVuY2hVUkwgKQ0KCQkJd2luQ2hhdC5PbldlYmNoYXRMYXVuY2hVUkwoIHBhcmFtcyApOw0KDQoJCWlmICggcGFyYW1zRnJpZW5kc1VJICkNCgkJCXdpbkNoYXQucG9zdE1lc3NhZ2UoIHBhcmFtc0ZyaWVuZHNVSSwgJ2h0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tLycgKTsNCgl9DQoJd2luQ2hhdC5mb2N1cygpOw0KfQ0KDQpmdW5jdGlvbiBTaG93U3VwcG9ydEFsZXJ0cyh1cmwpDQp7DQoJd2luZG93Lm9wZW4oIHVybCwgJ1N1cHBvcnRBbGVydHMnLCAnaGVpZ2h0PTcwMCx3aWR0aD03MDAscmVzaXplPXllcyxzY3JvbGxiYXJzPXllcycgKTsNCn0NCg0KZnVuY3Rpb24gVW5sb2NrRmFtaWx5Vmlldyggc3RyVVJMICkNCnsNCgl3aW5kb3cubG9jYXRpb24gPSBzdHJVUkw7DQp9DQoNCmZ1bmN0aW9uIExvY2tGYW1pbHlWaWV3KCBiU3RvcmUgKQ0Kew0KDQoJdmFyIHVybEZpcnN0ID0gJyc7DQoJdmFyIHVybFNlY29uZCA9ICcnOw0KCWlmICggYlN0b3JlICkNCgl7DQoJCXVybEZpcnN0ID0gJ2h0dHBzOi8vc3RvcmUuc3RlYW1wb3dlcmVkLmNvbS8nOw0KCQl1cmxTZWNvbmQgPSAnaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vJzsNCgl9DQoJZWxzZQ0KCXsNCgkJdXJsRmlyc3QgPSAnaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vJzsNCgkJdXJsU2Vjb25kID0gJ2h0dHBzOi8vc3RvcmUuc3RlYW1wb3dlcmVkLmNvbS8nOw0KCX0NCg0KCVNob3dDb25maXJtRGlhbG9nKCAnUmV0dXJuIHRvIEZhbWlseSBWaWV3JywNCgkJJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZXR1cm4gdG8gRmFtaWx5IFZpZXc/JywNCgkJJ1JldHVybiB0byBGYW1pbHkgVmlldycNCgkpLmRvbmUoIGZ1bmN0aW9uKCkgew0KCQlTaG93QmxvY2tpbmdXYWl0RGlhbG9nKCAnUmV0dXJuIHRvIEZhbWlseSBWaWV3JyApOw0KDQoJCUNyb3NzRG9tYWluUG9zdCggdXJsRmlyc3QgKyAnL3BhcmVudGFsL2FqYXhsb2NrJywge30gKS50aGVuKCBmdW5jdGlvbigpIHsNCgkJCSRKLndoZW4oDQoJCQkJCQkJCQlDcm9zc0RvbWFpblBvc3QoICdodHRwczovL2NoZWNrb3V0LnN0ZWFtcG93ZXJlZC5jb20vcGFyZW50YWwvYWpheGxvY2snLCB7fSApLA0KCQkJCQkJCQlDcm9zc0RvbWFpblBvc3QoICdodHRwczovL3N0ZWFtLnR2L3BhcmVudGFsL2FqYXhsb2NrJywge30gKSwNCgkJCQlDcm9zc0RvbWFpblBvc3QoIHVybFNlY29uZCArICdwYXJlbnRhbC9hamF4bG9jaycsIHt9ICkNCgkJCSkuYWx3YXlzKCBmdW5jdGlvbigpDQoJCQl7DQoJCQkJd2luZG93LmxvY2F0aW9uID0gdXJsRmlyc3Q7DQoJCQl9ICk7DQoJCX0pOw0KCX0gKTsNCn0NCg0KZnVuY3Rpb24gc2V0VGltZXpvbmVDb29raWVzKCkNCnsNCgl2YXIgbm93ID0gbmV3IERhdGUoKTsNCgl2YXIgZXhwaXJlID0gbmV3IERhdGUoKTsNCg0KCS8vIE9uZSB5ZWFyIGV4cGlyYXRpb24sIHRoaXMgd2F5IHdlIGRvbid0IG5lZWQgdG8gd2FpdCBhdCBsZWFzdCBvbmUgcGFnZQ0KCS8vIGxvYWQgdG8gaGF2ZSBhY2N1cmF0ZSB0aW1lem9uZSBpbmZvIGVhY2ggc2Vzc2lvbiwgYnV0IG9ubHkgZWFjaCB0aW1lIHRoZSB1c2VyDQoJLy8gY29tZXMgd2l0aCBjbGVhcmVkIGNvb2tpZXMNCglleHBpcmUuc2V0VGltZSggbm93LmdldFRpbWUoKSArIDM2MDAwMDAqMjQqMzY1ICk7DQoJdmFyIHR6T2Zmc2V0ID0gbm93LmdldFRpbWV6b25lT2Zmc2V0KCkgKiAtMSAqIDYwOw0KCXZhciBpc0RTVCA9IDA7DQoNCgl2YXIgc2FtZVNpdGUgPSAnJzsNCglpZiAoIHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PSAnaHR0cHMnICkNCgkJc2FtZVNpdGUgPSAnOyBTZWN1cmU7IFNhbWVTaXRlPU5vbmU7Jw0KCWRvY3VtZW50LmNvb2tpZSA9ICJ0aW1lem9uZU9mZnNldD0iICsgdHpPZmZzZXQgKyAiLCIgKyBpc0RTVCArICI7ZXhwaXJlcz0iK2V4cGlyZS50b0dNVFN0cmluZygpICsgIjtwYXRoPS8iICsgc2FtZVNpdGU7DQp9DQoNCmZ1bmN0aW9uIEZsdXNoU3R5bGVDaGFuZ2VzKCBlbGVtZW50ICkNCnsNCgkkSiggZWxlbWVudCApLmNzcyggJ29wYWNpdHknKTsNCn0NCg0KdmFyIGtfRVNjcm9sbGJhckRpcmVjdGlvblZlcnRpY2FsID0gMTsNCnZhciBrX0VTY3JvbGxiYXJEaXJlY3Rpb25Ib3Jpem9udGFsID0gMjsNCg0Kd2luZG93LlZTY3JvbGxiYXIgPSBmdW5jdGlvbiggZWxlVGFyZ2V0LCBlbGVIYW5kbGUsIGRpcmVjdGlvbiApDQp7DQoJdGhpcy5tX2VsZUhhbmRsZSA9IGVsZUhhbmRsZTsNCgl0aGlzLm1fZWxlVGFyZ2V0ID0gZWxlVGFyZ2V0Ow0KDQoJdmFyIGluc3RhbmNlID0gdGhpczsNCg0KCXZhciBwcm9wT2Zmc2V0LCBwcm9wU2l6ZSwgcHJvcE91dGVyU2l6ZSwgcHJvcERpbWVuc2lvbiwgcHJvcFBhZ2UsIGRpcmVjdGlvbkludmVydCwgcHJvcE9mZnNldEV2ZW50Ow0KDQoJaWYoIGRpcmVjdGlvbiA9PSBrX0VTY3JvbGxiYXJEaXJlY3Rpb25WZXJ0aWNhbCkNCgl7DQoJCXByb3BPZmZzZXQgPSAndG9wJzsNCgkJcHJvcFNpemUgPSAnaGVpZ2h0JzsNCgkJcHJvcE91dGVyU2l6ZSA9ICdvdXRlckhlaWdodCc7DQoJCXByb3BEaW1lbnNpb24gPSAneSc7DQoJCXByb3BQYWdlID0gJ3BhZ2VZJzsNCgkJcHJvcE9mZnNldEV2ZW50ID0gJ29mZnNldFknOw0KCX0gZWxzZSBpZiggZGlyZWN0aW9uID09IGtfRVNjcm9sbGJhckRpcmVjdGlvbkhvcml6b250YWwgKQ0KCXsNCgkJcHJvcE9mZnNldCA9ICdsZWZ0JzsNCgkJcHJvcFNpemUgPSAnd2lkdGgnOw0KCQlwcm9wT3V0ZXJTaXplID0gJ291dGVyV2lkdGgnOw0KCQlwcm9wRGltZW5zaW9uID0gJ3gnOw0KCQlwcm9wUGFnZSA9ICdwYWdlWCc7DQoJCXByb3BPZmZzZXRFdmVudCA9ICdvZmZzZXRYJzsNCg0KCQl0aGlzLm1fZWxlVGFyZ2V0LmZpcnN0KCkuY3NzKHsnd2hpdGUtc3BhY2UnOiAnbm93cmFwJ30pOw0KCX0NCg0KCS8vIFNldCB1cCBzb21lIENTUyBwcm9wZXJ0aWVzIHdlIG5lZWQNCgl0aGlzLm1fZWxlSGFuZGxlLmNzcyh7cG9zaXRpb246ICdhYnNvbHV0ZSd9KTsNCglpZiggdGhpcy5tX2VsZUhhbmRsZS5wYXJlbnQoKS5jc3MoJ3Bvc2l0aW9uJykgPT0gJ3N0YXRpYycgKQ0KCQl0aGlzLm1fZWxlSGFuZGxlLnBhcmVudCgpLmNzcyh7cG9zaXRpb246ICdyZWxhdGl2ZSd9KTsgLy8gTmVlZHMgdG8gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUsIG9ubHkgc2V0IGl0IGlmIHdlIGRpZG4ndCBkbyBpdCBpbiBDU1MNCgl0aGlzLm1fZWxlVGFyZ2V0LmNzcyh7cG9zaXRpb246ICdyZWxhdGl2ZScsIGZsb2F0OiAnbGVmdCd9KTsNCgl0aGlzLm1fZWxlVGFyZ2V0LmNzcyhwcm9wT2Zmc2V0LCAnMHB4Jyk7DQoJdGhpcy5tX2VsZVRhcmdldC5hZGRDbGFzcygnYW5pbWF0aW5nJyk7DQoJdGhpcy5tX2VsZVRhcmdldC5wYXJlbnQoKS5hZGRDbGFzcygndl9zY3JvbGxiYXJfdGFyZ2V0Jyk7DQoJdGhpcy5tX2VsZVRhcmdldC5wYXJlbnQoKS5jc3Moe3Bvc2l0aW9uOiAncmVsYXRpdmUnLCBvdmVyZmxvdzogJ2hpZGRlbid9KTsNCgl0aGlzLm1fbkRlc2lyZWRQb3NpdGlvbiA9IDA7DQoJdGhpcy5tX2ZsUGVyY2VudCA9IDA7DQoNCg0KCXZhciBmdW5jVXBkYXRlID0gZnVuY3Rpb24oIGJEaXNhYmxlVHJhbnNpdGlvbnMgKQ0KCXsNCgkJdmFyIGJTY3JvbGxlZCA9IHRydWU7DQoJCWlmKCBpbnN0YW5jZS5tX2VsZVRhcmdldFtwcm9wU2l6ZV0oKSAtIGluc3RhbmNlLm1fZWxlVGFyZ2V0LnBhcmVudCgpW3Byb3BTaXplXSgpIDw9IDAgKQ0KCQl7DQoJCQlpbnN0YW5jZS5tX2VsZUhhbmRsZS5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsNCgkJCWluc3RhbmNlLm1fZmxQZXJjZW50ID0gMDsNCgkJCWJTY3JvbGxlZCA9IGZhbHNlOw0KCQl9IGVsc2UNCgkJCWluc3RhbmNlLm1fZWxlSGFuZGxlLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOw0KDQoJCWlmKCBpbnN0YW5jZS5tX2ZsUGVyY2VudCA8IDAgKQ0KCQkJaW5zdGFuY2UubV9mbFBlcmNlbnQgPSAwOw0KDQoJCWlmKCBpbnN0YW5jZS5tX2ZsUGVyY2VudCA+IDEgKQ0KCQkJaW5zdGFuY2UubV9mbFBlcmNlbnQgPSAxOw0KDQoNCgkJdmFyIHBlcmNlbnQgPSBpbnN0YW5jZS5tX2ZsUGVyY2VudDsNCg0KCQlpZiggYkRpc2FibGVUcmFuc2l0aW9ucyApDQoJCQlpbnN0YW5jZS5EaXNhYmxlVHJhbnNpdGlvbnMoKTsNCg0KCQlpbnN0YW5jZS5tX25EZXNpcmVkUG9zaXRpb24gPSAtcGVyY2VudCAqICggaW5zdGFuY2UubV9lbGVUYXJnZXRbcHJvcFNpemVdKCkgLSBpbnN0YW5jZS5tX2VsZVRhcmdldC5wYXJlbnQoKVtwcm9wU2l6ZV0oKSk7DQoNCgkJLy8gVXBkYXRlIGNvbnRhaW5lcg0KCQlpbnN0YW5jZS5tX2VsZVRhcmdldFswXS5zdHlsZVtwcm9wT2Zmc2V0XSA9IGluc3RhbmNlLm1fbkRlc2lyZWRQb3NpdGlvbiArICdweCc7DQoNCgkJLy8gVXBkYXRlIHNjcm9sbCBoYW5kbGUNCgkJdmFyIGhhbmRsZU1heCA9IGluc3RhbmNlLm1fZWxlSGFuZGxlLnBhcmVudCgpW3Byb3BTaXplXSgpIC0gaW5zdGFuY2UubV9lbGVIYW5kbGVbcHJvcE91dGVyU2l6ZV0oKTsNCgkJaW5zdGFuY2UubV9lbGVIYW5kbGVbMF0uc3R5bGVbcHJvcE9mZnNldF0gPSAoIHBlcmNlbnQgKiBoYW5kbGVNYXggKSArICdweCc7DQoNCgkJaWYoIGJEaXNhYmxlVHJhbnNpdGlvbnMgKQ0KCQkJaW5zdGFuY2UuRW5hYmxlVHJhbnNpdGlvbnMoKTsNCg0KCQlyZXR1cm4gYlNjcm9sbGVkOw0KCX07DQoNCgl2YXIgZnVuY01vdXNlTW92ZSA9IGZ1bmN0aW9uKCBldmVudCApIHsNCgkJdmFyIGxvY2FsRGltZW5zaW9uID0gZXZlbnRbcHJvcFBhZ2VdIC0gaW5zdGFuY2UubV9lbGVIYW5kbGUucGFyZW50KCkub2Zmc2V0KClbcHJvcE9mZnNldF07DQoJCXZhciBsb2NhbE1heCA9IGluc3RhbmNlLm1fZWxlSGFuZGxlLnBhcmVudCgpW3Byb3BTaXplXSgpIC0gaW5zdGFuY2UubV9lbGVIYW5kbGVbcHJvcE91dGVyU2l6ZV0oKTsNCg0KCQl2YXIgcGVyY2VudCA9IGxvY2FsRGltZW5zaW9uIC8gbG9jYWxNYXg7DQoJCWluc3RhbmNlLm1fZmxQZXJjZW50ID0gcGVyY2VudDsNCg0KCQlpZiggZnVuY1VwZGF0ZSh0cnVlKSApDQoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KDQoNCgl9Ow0KDQoJJEooZWxlVGFyZ2V0KS5iaW5kKCdtb3VzZXdoZWVsIERPTU1vdXNlU2Nyb2xsJyxmdW5jdGlvbiggZXZlbnQgKXsNCgkJdmFyIGRlbHRhID0gZXZlbnQub3JpZ2luYWxFdmVudC53aGVlbERlbHRhIHx8IGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGV0YWlsICogLTEyOw0KDQoJCXZhciBsb2NhbFkgPSBpbnN0YW5jZS5tX25EZXNpcmVkUG9zaXRpb24gKiAtMTsNCgkJdmFyIGxvY2FsTWF4ID0gaW5zdGFuY2UubV9lbGVUYXJnZXRbcHJvcE91dGVyU2l6ZV0oKSAtIGluc3RhbmNlLm1fZWxlVGFyZ2V0LnBhcmVudCgpW3Byb3BTaXplXSgpOw0KDQoJCWlmKCBsb2NhbFkgPD0gMCAmJiBkZWx0YSA+IDAgfHwgbG9jYWxZID09IGxvY2FsTWF4ICYmIGRlbHRhIDwgMCApDQoJCQlyZXR1cm47DQoNCgkJbG9jYWxZIC09IGRlbHRhOw0KDQoJCWlmKCBsb2NhbFkgPCAwICkgbG9jYWxZID0gMDsNCgkJaWYoIGxvY2FsWSA+IGxvY2FsTWF4ICApIGxvY2FsWSA9IGxvY2FsTWF4Ow0KDQoJCXZhciBwZXJjZW50ID0gbG9jYWxZIC8gbG9jYWxNYXg7DQoNCgkJaW5zdGFuY2UubV9mbFBlcmNlbnQgPSBwZXJjZW50Ow0KDQoJCWlmKCBmdW5jVXBkYXRlKCkgKQ0KCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsNCgl9KTsNCg0KCSRKKGVsZUhhbmRsZS5wYXJlbnQoKSkuYmluZCgnY2xpY2snLGZ1bmN0aW9uKCBldmVudCApew0KCQl2YXIgbG9jYWxZID0gaW5zdGFuY2UubV9lbGVUYXJnZXQucG9zaXRpb24oKVtwcm9wT2Zmc2V0XSAqIC0xOw0KCQl2YXIgbG9jYWxNYXggPSBpbnN0YW5jZS5tX2VsZVRhcmdldFtwcm9wT3V0ZXJTaXplXSgpIC0gaW5zdGFuY2UubV9lbGVUYXJnZXQucGFyZW50KClbcHJvcFNpemVdKCk7DQoNCgkJdmFyIHN0ZXAgPSBpbnN0YW5jZS5tX2VsZVRhcmdldC5wYXJlbnQoKVtwcm9wU2l6ZV0oKTsNCg0KCQlpZiggZXZlbnRbcHJvcE9mZnNldEV2ZW50XSA8IGluc3RhbmNlLm1fZWxlSGFuZGxlLnBvc2l0aW9uKClbcHJvcE9mZnNldF0gKQ0KCQkJc3RlcCAqPSAtMTsNCg0KCQlsb2NhbFkgKz0gc3RlcDsNCg0KCQlpZiggbG9jYWxZIDwgMCApIGxvY2FsWSA9IDA7DQoJCWlmKCBsb2NhbFkgPiBsb2NhbE1heCAgKSBsb2NhbFkgPSBsb2NhbE1heDsNCg0KCQl2YXIgcGVyY2VudCA9IGxvY2FsWSAvIGxvY2FsTWF4Ow0KDQoJCWluc3RhbmNlLm1fZmxQZXJjZW50ID0gcGVyY2VudDsNCg0KCQlpZiggZnVuY1VwZGF0ZSgpICkNCgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQoJfSk7DQoNCgllbGVIYW5kbGUubW91c2Vkb3duKGZ1bmN0aW9uKCBldmVudCApew0KCQkkSih3aW5kb3cpLmJpbmQoJ21vdXNlbW92ZS5zY3JvbGwnLCBmdW5jTW91c2VNb3ZlKTsNCgkJZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7DQoJfSk7DQoNCgllbGVIYW5kbGUuY2xpY2soZnVuY3Rpb24oIGV2ZW50ICl7DQoJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOw0KCX0pOw0KDQoJJEood2luZG93KS5tb3VzZXVwKGZ1bmN0aW9uKCBldmVudCApew0KCQkkSih3aW5kb3cpLnVuYmluZCgnbW91c2Vtb3ZlLnNjcm9sbCcpOw0KCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsNCgl9KTsNCg0KCS8vIFJlc2V0cyBzY3JvbGwgcG9zaXRpb24gdG8gMCBhbmQgdXBkYXRlcyB0aGUgd2luZG93LiBVc2VmdWwgd2hlbiBhZGRpbmcvcmVtb3ZpbmcgZWxlbWVudHMgb3IgcmVzaXppbmcgdGhlIHNjcm9sbCBhcmVhDQoJdGhpcy5SZXNldCA9IGZ1bmN0aW9uKCkgew0KCQlpbnN0YW5jZS5tX2ZsUGVyY2VudCA9IDA7DQoNCgkJcmV0dXJuIGZ1bmNVcGRhdGUodHJ1ZSk7DQoJfTsNCg0KCS8vIEVuc3VyZXMgdGFyZ2V0IGVsZW1lbnQgaXMgdmlzaWJsZS4gVGhpcyBpcyB0YWtlbiBmcm9tIHBvc2l0aW9uKCkgKE5PVCBPRkZTRVQpIHNvIHRoZSBlbGVtZW50IG11c3QgYmUgYSBkaXJlY3QgY2hpbGQgb2YgdGhlIHNjcm9sbCBhcmVhDQoJdGhpcy5FbnN1cmVWaXNpYmxlID0gZnVuY3Rpb24oIGVsZSApIHsNCgkJdmFyICRlbGUgPSAkSihlbGUpOw0KCQl2YXIgZWxlU2l6ZSA9ICRlbGVbcHJvcE91dGVyU2l6ZV0odHJ1ZSk7DQoJCXZhciBtaW5FZGdlID0gJGVsZS5wb3NpdGlvbigpW3Byb3BPZmZzZXRdIC0gKGVsZVNpemUgKiAwLjUpOw0KCQl2YXIgbWF4RWRnZSA9IG1pbkVkZ2UgKyAoZWxlU2l6ZSAqIDIpOw0KDQoNCgkJdmFyIHZpZXdwb3J0TWF4ID0gaW5zdGFuY2UubV9lbGVUYXJnZXRbcHJvcE91dGVyU2l6ZV0oKSAtIGluc3RhbmNlLm1fZWxlVGFyZ2V0LnBhcmVudCgpW3Byb3BTaXplXSgpOw0KCQl2YXIgdmlld3BvcnRTaXplID0gaW5zdGFuY2UubV9lbGVUYXJnZXQucGFyZW50KClbcHJvcFNpemVdKCk7DQoJCXZhciB2aWV3cG9ydFBvc2l0aW9uID0gaW5zdGFuY2UubV9lbGVUYXJnZXQucG9zaXRpb24oKVtwcm9wT2Zmc2V0XSAqIC0xOw0KDQoJCWlmKCB2aWV3cG9ydFBvc2l0aW9uID4gbWluRWRnZSApDQoJCQlpbnN0YW5jZS5tX2ZsUGVyY2VudCA9IG1pbkVkZ2UgLyB2aWV3cG9ydE1heDsNCgkJZWxzZSBpZiggKCB2aWV3cG9ydFBvc2l0aW9uICsgdmlld3BvcnRTaXplICkgPCBtYXhFZGdlICkNCgkJCWluc3RhbmNlLm1fZmxQZXJjZW50ID0gKCBtYXhFZGdlIC0gdmlld3BvcnRTaXplICkgLyB2aWV3cG9ydE1heDsNCg0KCQlyZXR1cm4gZnVuY1VwZGF0ZSgpOw0KCX07DQoNCgl0aGlzLkVuYWJsZVRyYW5zaXRpb25zID0gZnVuY3Rpb24oKSB7DQoJCWluc3RhbmNlLm1fZWxlVGFyZ2V0LmFkZENsYXNzKCdhbmltYXRpbmcnKTsNCgl9Ow0KDQoJdGhpcy5EaXNhYmxlVHJhbnNpdGlvbnMgPSBmdW5jdGlvbigpIHsNCgkJaW5zdGFuY2UubV9lbGVUYXJnZXQucmVtb3ZlQ2xhc3MoJ2FuaW1hdGluZycpOw0KCX07DQoNCglmdW5jVXBkYXRlKHRydWUpOw0KDQoNCn07DQoNCmZ1bmN0aW9uIEluaXRBdXRvQ29tcGxldGUoIGVsSW5wdXQsIGZuU2VhcmNoLCBmbk9uQ2hhbmdlICkNCnsNCglyZXR1cm4gbmV3IENBdXRvQ29tcGxldGUoIGVsSW5wdXQsIGZuU2VhcmNoLCBmbk9uQ2hhbmdlICk7DQp9DQoNCmZ1bmN0aW9uIENBdXRvQ29tcGxldGUoIGVsSW5wdXQsIGZuU2VhcmNoLCBmbk9uQ2hhbmdlICkNCnsNCgl0aGlzLm1fYlN1cHByZXNzZU5leHRLZXlVcCA9IGZhbHNlOw0KCXRoaXMubV9oU2VhcmNoVGltZW91dCA9IDA7DQoJdGhpcy5tX3N0ckxhc3RTZWFyY2ggPSAnJzsNCg0KCXRoaXMubV8kSW5wdXQgPSAkSiggZWxJbnB1dCApOw0KCXRoaXMubV9mblNlYXJjaCA9IGZuU2VhcmNoOw0KCXRoaXMubV9mbk9uQ2hhbmdlID0gZm5PbkNoYW5nZTsNCg0KCQl2YXIgc3RyTmFtZSA9IHRoaXMubV8kSW5wdXQuYXR0ciggJ25hbWUnICk7DQoJaWYgKCAhc3RyTmFtZSApDQoJCXN0ck5hbWUgPSAndW5rbm93bic7DQoNCglzdHJOYW1lID0gc3RyTmFtZSArICdfYXV0b2NvbXBsZXRlJzsNCg0KCXRoaXMubV8kUG9wdXAgPSAkSiAoICc8ZGl2IGNsYXNzPSInICsgc3RyTmFtZSArICciPjwvZGl2PicgKTsNCgl0aGlzLm1fJFBvcHVwLmNzcyggJ3dpZHRoJywgdGhpcy5tXyRJbnB1dC5vdXRlcldpZHRoKCkgKyAncHgnICk7DQoJdGhpcy5tXyRJbnB1dC5hZnRlciggdGhpcy5tXyRQb3B1cCApOw0KCXRoaXMubV8kUG9wdXAuaGlkZSgpOw0KDQoJdmFyIF90aGlzID0gdGhpczsNCgl0aGlzLm1fJElucHV0Lm9uKCAna2V5ZG93bi5hdXRvY29tcGxldGUnLCBmdW5jdGlvbiggZXZlbnQgKSB7IF90aGlzLk9uSW5wdXRLZXlEb3duKCBldmVudCApOyB9ICk7DQoJdGhpcy5tXyRJbnB1dC5vbiggJ2tleXVwLmF1dG9jb21wbGV0ZScsIGZ1bmN0aW9uKCBldmVudCApIHsgX3RoaXMuT25JbnB1dEtleVVwKCBldmVudCApOyB9ICk7DQoJdGhpcy5tXyRJbnB1dC5vbiggJ2JsdXIuYXV0b2NvbXBsZXRlJywgZnVuY3Rpb24oIGV2ZW50ICkgeyBfdGhpcy5PbklucHV0Qmx1ciggZXZlbnQgKTsgfSApOw0KCXRoaXMubV8kSW5wdXQub24oICdjaGFuZ2UgaW5wdXQgcGFzdGUnLCBmdW5jdGlvbiggZXZlbnQgKSB7IF90aGlzLk9uSW5wdXRDaGFuZ2UoIGV2ZW50ICk7IH0gKTsNCg0KCXRoaXMubV8kUG9wdXAub24oICdtb3VzZWRvd24uYXV0b2NvbXBsZXRlJywgZnVuY3Rpb24oIGV2ZW50ICkgeyBfdGhpcy5tXyRQb3B1cC5kYXRhKCAnbW91c2Vkb3duJywgdHJ1ZSApOyB9ICk7DQoJdGhpcy5tXyRQb3B1cC5vbiggJ21vdXNldXAuYXV0b2NvbXBsZXRlJywgZnVuY3Rpb24oIGV2ZW50ICkgeyBfdGhpcy5tXyRQb3B1cC5kYXRhKCAnbW91c2Vkb3duJywgZmFsc2UgKTsgfSApOw0KfQ0KDQpDQXV0b0NvbXBsZXRlLktFWV9FTlRFUiA9IDEzOw0KQ0F1dG9Db21wbGV0ZS5LRVlfVVAgPSAzODsNCkNBdXRvQ29tcGxldGUuS0VZX0RPV04gPSA0MDsNCg0KQ0F1dG9Db21wbGV0ZS5wcm90b3R5cGUuT25JbnB1dENoYW5nZSA9IGZ1bmN0aW9uKCBldmVudCApDQp7DQoJCWlmICggdGhpcy5tX2ZuT25DaGFuZ2UgKQ0KCQl0aGlzLm1fZm5PbkNoYW5nZSggdGhpcy5tXyRJbnB1dCwgbnVsbCApOw0KDQoJaWYgKCB0aGlzLm1faFNlYXJjaFRpbWVvdXQgPT0gMCApDQoJew0KCQl2YXIgX3RoaXMgPSB0aGlzOw0KCQl2YXIgZm5Eb1NlYXJjaCA9IGZ1bmN0aW9uKCkNCgkJew0KCQkJX3RoaXMubV9oU2VhcmNoVGltZW91dCA9IDA7DQoJCQl2YXIgc3RyU2VhcmNoID0gX3RoaXMubV8kSW5wdXQudmFsKCk7DQoJCQlpZiAoIHN0clNlYXJjaCA9PSBfdGhpcy5tX3N0ckxhc3RTZWFyY2ggKQ0KCQkJCXJldHVybjsNCg0KCQkJX3RoaXMubV9zdHJMYXN0U2VhcmNoID0gc3RyU2VhcmNoOw0KCQkJX3RoaXMubV9mblNlYXJjaCggX3RoaXMubV8kSW5wdXQsIHN0clNlYXJjaCwgZnVuY3Rpb24oICRDb250ZW50cyApIHsgX3RoaXMuU2V0UG9wdXBDb250ZW50cyggJENvbnRlbnRzICk7IH0gKTsNCgkJfTsNCg0KCQl0aGlzLm1faFNlYXJjaFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggZm5Eb1NlYXJjaCwgMzAwICk7DQoJfQ0KfQ0KDQpDQXV0b0NvbXBsZXRlLnByb3RvdHlwZS5TZXRQb3B1cENvbnRlbnRzID0gZnVuY3Rpb24oICRDb250ZW50cyApDQp7DQoJaWYgKCAhJENvbnRlbnRzICkNCgl7DQoJCXRoaXMuQ2xvc2VQb3B1cCgpOw0KCQlyZXR1cm47DQoJfQ0KDQoJdGhpcy5tXyRQb3B1cC5odG1sKCAnJyApOw0KCXRoaXMubV8kUG9wdXAuYXBwZW5kKCAkQ29udGVudHMgKTsNCg0KCXZhciBfdGhpcyA9IHRoaXM7DQoJdGhpcy5tXyRQb3B1cC5jaGlsZHJlbigpLm9uKCAnY2xpY2suYXV0b2NvbXBsZXRlJywgZnVuY3Rpb24oIGV2ZW50ICkgeyBfdGhpcy5TZWxlY3RTdWdnZXN0aW9uKCAkSiggdGhpcyApICk7IH0gKTsNCgl0aGlzLm1fJFBvcHVwLnNob3coKTsNCn0NCg0KQ0F1dG9Db21wbGV0ZS5wcm90b3R5cGUuT25JbnB1dEJsdXIgPSBmdW5jdGlvbiggZXZlbnQgKQ0Kew0KCWlmICggIXRoaXMubV8kUG9wdXAuZGF0YSggJ21vdXNlZG93bicgKSApDQoJCXRoaXMuQ2xvc2VQb3B1cCgpOw0KfQ0KDQpDQXV0b0NvbXBsZXRlLnByb3RvdHlwZS5TZWxlY3RTdWdnZXN0aW9uID0gZnVuY3Rpb24oICRTdWdnZXN0aW9uICkNCnsNCglpZiAoICRTdWdnZXN0aW9uLmxlbmd0aCA9PSAwICkNCgkJcmV0dXJuOw0KDQoJdGhpcy5tXyRJbnB1dC52YWwoICRTdWdnZXN0aW9uLmRhdGEoICdzdWdnZXN0aW9uJyApICk7DQoJaWYgKCB0aGlzLm1fZm5PbkNoYW5nZSApDQoJCXRoaXMubV9mbk9uQ2hhbmdlKCB0aGlzLm1fJElucHV0LCAkU3VnZ2VzdGlvbiApOw0KDQoJdGhpcy5DbG9zZVBvcHVwKCk7DQoJdGhpcy5tXyRJbnB1dC5mb2N1cygpOw0KfQ0KDQpDQXV0b0NvbXBsZXRlLnByb3RvdHlwZS5DbG9zZVBvcHVwID0gZnVuY3Rpb24oKQ0Kew0KCWlmICggdGhpcy5tX2hTZWFyY2hUaW1lb3V0ICE9IDAgKQ0KCXsNCgkJd2luZG93LmNsZWFyVGltZW91dCggdGhpcy5tX2hTZWFyY2hUaW1lb3V0ICk7DQoJCXRoaXMubV9oU2VhcmNoVGltZW91dCA9IDA7DQoJfQ0KDQoJdGhpcy5tX3N0ckxhc3RTZWFyY2ggPSAnJzsNCgl0aGlzLm1fJFBvcHVwLmhpZGUoKTsNCn0NCg0KQ0F1dG9Db21wbGV0ZS5wcm90b3R5cGUuT25JbnB1dEtleURvd24gPSBmdW5jdGlvbiggZXZlbnQgKQ0Kew0KCXZhciAkQ3VyU3VnZ2VzdGlvbiA9IHRoaXMubV8kUG9wdXAuY2hpbGRyZW4oJy5mb2N1cycpOw0KCXZhciAkTmV3U3VnZ2VzdGlvbiA9ICRKKCk7DQoNCglpZiAoIGV2ZW50LmtleUNvZGUgPT0gQ0F1dG9Db21wbGV0ZS5LRVlfRU5URVIgKQ0KCXsNCgkJdGhpcy5TZWxlY3RTdWdnZXN0aW9uKCAkQ3VyU3VnZ2VzdGlvbiApOw0KCQl0aGlzLm1fYlN1cHByZXNzTmV4dEtleVVwID0gdHJ1ZTsNCgkJZXZlbnQucHJldmVudERlZmF1bHQoKTsNCgkJcmV0dXJuOw0KCX0NCg0KCWlmICggZXZlbnQua2V5Q29kZSA9PSBDQXV0b0NvbXBsZXRlLktFWV9VUCB8fCBldmVudC5rZXlDb2RlID09IENBdXRvQ29tcGxldGUuS0VZX0RPV04gKQ0KCXsNCgkJaWYgKCBldmVudC5rZXlDb2RlID09IENBdXRvQ29tcGxldGUuS0VZX1VQICkNCgkJew0KCQkJaWYgKCAkQ3VyU3VnZ2VzdGlvbi5sZW5ndGggKQ0KCQkJCSROZXdTdWdnZXN0aW9uID0gJEN1clN1Z2dlc3Rpb24ucHJldigpOw0KCQkJaWYgKCAhJE5ld1N1Z2dlc3Rpb24ubGVuZ3RoICkNCgkJCQkkTmV3U3VnZ2VzdGlvbiA9IHRoaXMubV8kUG9wdXAuY2hpbGRyZW4oICdkaXY6bGFzdC1jaGlsZCcgKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCWlmICggJEN1clN1Z2dlc3Rpb24ubGVuZ3RoICkNCgkJCQkkTmV3U3VnZ2VzdGlvbiA9ICRDdXJTdWdnZXN0aW9uLm5leHQoKTsNCgkJCWlmICggISROZXdTdWdnZXN0aW9uLmxlbmd0aCApDQoJCQkJJE5ld1N1Z2dlc3Rpb24gPSB0aGlzLm1fJFBvcHVwLmNoaWxkcmVuKCAnZGl2OmZpcnN0LWNoaWxkJyApOw0KCQl9DQoNCgkJaWYgKCAkTmV3U3VnZ2VzdGlvbi5sZW5ndGggICkNCgkJew0KCQkJJEN1clN1Z2dlc3Rpb24ucmVtb3ZlQ2xhc3MoICdmb2N1cycgKTsNCgkJCSROZXdTdWdnZXN0aW9uLmFkZENsYXNzKCAnZm9jdXMnICk7DQoJCX0NCg0KCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQoJfQ0KfQ0KDQpDQXV0b0NvbXBsZXRlLnByb3RvdHlwZS5PbklucHV0S2V5VXAgPSBmdW5jdGlvbiggZXZlbnQgKQ0Kew0KCWlmICggdGhpcy5tX2JTdXBwcmVzc05leHRLZXlVcCAmJiBldmVudC5rZXlDb2RlID09IENBdXRvQ29tcGxldGUuS0VZX0VOVEVSICkNCgl7DQoJCXRoaXMubV9iU3VwcHJlc3NOZXh0S2V5VXAgPSBmYWxzZTsNCgkJZXZlbnQucHJldmVudERlZmF1bHQoKTsNCgl9DQp9DQoNCg0KDQpmdW5jdGlvbiBHZXRDdXJyZW50U2Nyb2xsUGVyY2VudGFnZSgpDQp7DQoJdmFyIHMgPSAkSih3aW5kb3cpLnNjcm9sbFRvcCgpOw0KCXZhciBkID0gJEooZG9jdW1lbnQpLmhlaWdodCgpOw0KCXZhciBjID0gJEood2luZG93KS5oZWlnaHQoKTsNCgl2YXIgc2Nyb2xsUGVyY2VudCA9IChzIC8gKGQtYykpICogMTAwOw0KCXJldHVybiBzY3JvbGxQZXJjZW50Ow0KfQ0KDQovLyBAZWxlbUlEIGlkIG9mIHRoZSBlbGVtZW50DQovLyBAZml4ZWRPZmZzZXRUb3Agb2Zmc2V0IGZyb20gdGhlIHRvcCB3aGVuIGZpeGVkDQovLyBAYlNjcm9sbFdpdGhQYWdlSWZUb29UYWxsIGlmIHRoZSBlbGVtZW50IGlzIHRhbGxlciB0aGFuIHRoZSBwYWdlLCB0aGVuIGl0IHdpbGwgInNjcm9sbCIgd2l0aCB0aGUgcGFnZSBpZiB0aGlzIGlzIHRydWUNCi8vIEBkb2NIZWlnaHRPZmZzZXQgaWYgYlNjcm9sbFdpdGhQYWdlSWZUb29UYWxsIGlzIHNldCB0byB0cnVlLCB0aGVuIHRoaXMgaXMgaG93IG11Y2ggdGhlIGRvY3VtZW50IGhlaWdodCBpcyByZWR1Y2VkIGJ5IChyZWNvbW1lbmQgdGhpcyB0byBiZSAxMzAgZm9yIHRoZSB0eXBpY2FsIGZvb3RlcikNCmZ1bmN0aW9uIEZpeGVkRWxlbWVudE9uU2Nyb2xsV3JhcHBlciAoIGVsZW1JRCwgZml4ZWRPZmZzZXRUb3AsIGJTY3JvbGxXaXRoUGFnZUlmVG9vVGFsbCwgZG9jSGVpZ2h0T2Zmc2V0LCBwYXJhbXMgKQ0Kew0KCXBhcmFtcyA9ICRKLmV4dGVuZCggew0KCQlmaXhlZENsYXNzOiBudWxsDQoJfSwgcGFyYW1zICk7DQoNCgl0aGlzLmZpeGVkRWxlbWVudCA9ICQoIGVsZW1JRCApOw0KCXRoaXMuJEZpeGVkRWxlbWVudCA9ICRKRnJvbUlET3JFbGVtZW50KCBlbGVtSUQgKTsNCgl0aGlzLmZpeGVkT2Zmc2V0VG9wID0gdHlwZW9mIGZpeGVkT2Zmc2V0VG9wICE9ICJ1bmRlZmluZWQiID8gZml4ZWRPZmZzZXRUb3AgOiAwOw0KCXRoaXMuYlNjcm9sbFdpdGhQYWdlSWZUb29UYWxsID0gdHlwZW9mIGJTY3JvbGxXaXRoUGFnZUlmVG9vVGFsbCAhPSAidW5kZWZpbmVkIiA/IGJTY3JvbGxXaXRoUGFnZUlmVG9vVGFsbCA6IGZhbHNlOw0KCXRoaXMuZG9jSGVpZ2h0T2Zmc2V0ID0gdHlwZW9mIGRvY0hlaWdodE9mZnNldCAhPSAidW5kZWZpbmVkIiA/IGRvY0hlaWdodE9mZnNldCA6IDA7DQoJdGhpcy5ob21lUG9zbiA9IHsgeDogdGhpcy5maXhlZEVsZW1lbnQuY3VtdWxhdGl2ZU9mZnNldCgpWzBdLCB5OiB0aGlzLmZpeGVkRWxlbWVudC5jdW11bGF0aXZlT2Zmc2V0KClbMV0gfTsNCgl0aGlzLmZpeGVkQ2xhc3MgPSBwYXJhbXMuZml4ZWRDbGFzczsNCg0KDQoJdGhpcy4kRml4ZWRFbGVtZW50UGFkZGluZyA9ICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ0ZpeGVkRWxlbWVudE9uU2Nyb2xsV3JhcHBlcl9wYWRkaW5nJywgJ2lkJzogJ1Njcm9sbFdyYXBwZXJQYWRkaW5nXycgKyBlbGVtSUQgfSApLmhpZGUoKTsNCgl0aGlzLmZpeGVkRWxlbWVudC5pbnNlcnQoIHsgYmVmb3JlOiB0aGlzLiRGaXhlZEVsZW1lbnRQYWRkaW5nWzBdIH0gKTsNCg0KCXZhciBfdGhpcyA9IHRoaXM7DQoJJEood2luZG93KS5vbiggJ3Njcm9sbC5GaXhlZEVsZW1lbnRPblNjcm9sbFdyYXBwZXIgaGFzaGNoYW5nZS5GaXhlZEVsZW1lbnRPblNjcm9sbFdyYXBwZXInLCBmdW5jdGlvbigpIHsgX3RoaXMuaGFuZGxlU2Nyb2xsKCkgfSApOw0KCSRKKHdpbmRvdykub24oICdyZXNpemUuRml4ZWRFbGVtZW50T25TY3JvbGxXcmFwcGVyJywgZnVuY3Rpb24oKSB7IF90aGlzLmhhbmRsZVNjcm9sbCggdHJ1ZSAvKiBmb3JjZSByZWNhbGMgKi8gKSB9ICk7DQoJdGhpcy5oYW5kbGVTY3JvbGwoKTsNCn0NCg0KRml4ZWRFbGVtZW50T25TY3JvbGxXcmFwcGVyLnByb3RvdHlwZS5CSXNGaXhlZCA9IGZ1bmN0aW9uKCkNCnsNCglpZiAoIHRoaXMuZml4ZWRDbGFzcyApDQoJCXJldHVybiB0aGlzLiRGaXhlZEVsZW1lbnQuaGFzQ2xhc3MoIHRoaXMuZml4ZWRDbGFzcyApOw0KCWVsc2UNCgkJcmV0dXJuIHRoaXMuJEZpeGVkRWxlbWVudC5jc3MoICdwb3NpdGlvbicgKSA9PSAnZml4ZWQnOw0KfQ0KDQpGaXhlZEVsZW1lbnRPblNjcm9sbFdyYXBwZXIucHJvdG90eXBlLmhhbmRsZVNjcm9sbCA9IGZ1bmN0aW9uKCBiRm9yY2VSZWNhbGMgKQ0Kew0KCXRoaXMuc2Nyb2xsT2Zmc2V0ID0gZG9jdW1lbnQudmlld3BvcnQuZ2V0U2Nyb2xsT2Zmc2V0cygpLnRvcDsNCgl2YXIgb2Zmc2V0VG9wID0gdGhpcy5maXhlZE9mZnNldFRvcCArIEdldFJlc3BvbnNpdmVIZWFkZXJGaXhlZE9mZnNldEFkanVzdG1lbnQoKTsNCg0KCWlmICggYkZvcmNlUmVjYWxjICYmICF0aGlzLkJJc0ZpeGVkKCkgKQ0KCQl0aGlzLmhvbWVQb3NuID0geyB4OiB0aGlzLmZpeGVkRWxlbWVudC5jdW11bGF0aXZlT2Zmc2V0KClbMF0sIHk6IHRoaXMuZml4ZWRFbGVtZW50LmN1bXVsYXRpdmVPZmZzZXQoKVsxXSB9Ow0KDQoJaWYgKCB0aGlzLnNjcm9sbE9mZnNldCA+ICggdGhpcy5ob21lUG9zbi55IC0gb2Zmc2V0VG9wICkgKQ0KCXsNCgkJaWYgKCAhdGhpcy5CSXNGaXhlZCgpIHx8IGJGb3JjZVJlY2FsYyApDQoJCXsNCgkJCWlmICggdGhpcy5maXhlZENsYXNzICkNCgkJCQl0aGlzLiRGaXhlZEVsZW1lbnQuYWRkQ2xhc3MoIHRoaXMuZml4ZWRDbGFzcyApOw0KCQkJZWxzZQ0KCQkJCXRoaXMuJEZpeGVkRWxlbWVudC5jc3MoICdwb3NpdGlvbicsICdmaXhlZCcgKTsNCg0KCQkJdGhpcy5maXhlZEVsZW1lbnQuc3R5bGUudG9wID0gb2Zmc2V0VG9wICsgJ3B4JzsNCgkJCXRoaXMuZml4ZWRFbGVtZW50LnN0eWxlLmxlZnQgPSB0aGlzLmhvbWVQb3NuLng7DQoNCgkJCS8vIGpxdWVyeSBzaG93KCkgc2V0cyBkaXNwbGF5IHRvIGJsb2NrLCB3aGljaCBwcmV2ZW50cyBjc3MgZnJvbSBoaWRpbmcgdGhpcyBlbGVtZW50IGlmIG5lZWRlZC4NCgkJCXRoaXMuJEZpeGVkRWxlbWVudFBhZGRpbmcuY3NzKCAnZGlzcGxheScsICcnICk7DQoJCQl0aGlzLiRGaXhlZEVsZW1lbnRQYWRkaW5nLmNzcyggJ2hlaWdodCcsIHRoaXMuZml4ZWRFbGVtZW50LmdldEhlaWdodCgpICsgJ3B4JyApOw0KCQl9DQoNCgkJaWYgKCB0aGlzLmJTY3JvbGxXaXRoUGFnZUlmVG9vVGFsbCApDQoJCXsNCgkJCS8vIHRoaXMgZm9yY2VzIHRoZSBlbGVtZW50IHRvIHNjcm9sbCBvZmYgdGhlIHBhZ2UsIGJ1dCB0aGVyZSdzIGVub3VnaCB0aGF0IGlzbid0IG9uIHRoZSBwYWdlLCAic2Nyb2xsIiB0aGlzIGd1eSBwZXJjZW50YWdlLXdpc2UNCgkJCXZhciBlbGVtSGVpZ2h0ID0gdGhpcy5maXhlZEVsZW1lbnQuZ2V0SGVpZ2h0KCkgKyBvZmZzZXRUb3A7DQoJCQlpZiAoIGVsZW1IZWlnaHQgPiBkb2N1bWVudC52aWV3cG9ydC5nZXRIZWlnaHQoKSApDQoJCQl7DQoJCQkJdmFyIGN1cnJlbnRTY3JvbGxQZXJjZW50YWdlID0gR2V0Q3VycmVudFNjcm9sbFBlcmNlbnRhZ2UoKTsNCgkJCQl2YXIgaGVpZ2h0RGlmZiA9IGVsZW1IZWlnaHQgLSAoIGRvY3VtZW50LnZpZXdwb3J0LmdldEhlaWdodCgpIC0gdGhpcy5kb2NIZWlnaHRPZmZzZXQgKTsNCgkJCQlvZmZzZXRUb3AgLT0gTWF0aC5mbG9vciggaGVpZ2h0RGlmZiAqIGN1cnJlbnRTY3JvbGxQZXJjZW50YWdlIC8gMTAwICk7DQoJCQkJdGhpcy5maXhlZEVsZW1lbnQuc3R5bGUudG9wID0gb2Zmc2V0VG9wICsgJ3B4JzsNCgkJCX0NCgkJfQ0KCX0NCgllbHNlDQoJew0KCQlpZiAoIHRoaXMuQklzRml4ZWQoKSApDQoJCXsNCgkJCWlmICggdGhpcy5maXhlZENsYXNzICkNCgkJCQl0aGlzLiRGaXhlZEVsZW1lbnQucmVtb3ZlQ2xhc3MoIHRoaXMuZml4ZWRDbGFzcyApOw0KCQkJZWxzZQ0KCQkJCXRoaXMuJEZpeGVkRWxlbWVudC5jc3MoICdwb3NpdGlvbicsICcnICk7DQoNCgkJCXRoaXMuJEZpeGVkRWxlbWVudC5jc3MoICd0b3AnLCAnJyApLmNzcyggJ2xlZnQnLCAnJyApOw0KCQkJdGhpcy4kRml4ZWRFbGVtZW50UGFkZGluZy5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7DQoJCX0NCgl9DQp9DQoNCi8vIGdlbmVyYWwgdGV4dCBzdWdnZXN0aW9uIGNvbnRyb2wNCg0KLy8gZm5TdWdnZXN0Rm9yVGVybSB3aWxsIGJlIGNhbGxlZCB3aXRoIHR3byB2YWx1ZXMsIHRoZSBjdXJyZW50IHN0cmluZyB0byBnZXQgc3VnZ2VzdGlvbnMgZm9yLA0KLy8JYW5kIHRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2l0aCB0aGUgbmV3IHZhbHVlcy4gIFlvdSBzaG91bGQgYWx3YXlzIGludm9rZSB0aGUgY2FsbGJhY2sgcGVyIGNhbGwNCi8vCXRvIGZuU3VnZ2VzdEZvclRlcm0sIGJ1dCBjYW4gZGVsYXkgZHVlIHRvIGFqYXggaWYgbmVlZGVkLg0KDQovLyBzdXBwb3J0ZWQgb3B0aW9uczoNCi8vCWJEb0VtcHR5U2VhcmNoT25GaXJzdEZvY3VzIC0gcnVuIGEgc2VhcmNoIGZvciAiIiAob3Igd2hhdGV2ZXIgaXMgaW4gdGhlIGJveCkgd2hlbiB0aGUgdGV4dCBpbnB1dCBpcyBmaXJzdCBpbnRlcmFjdGVkIHdpdGgNCmZ1bmN0aW9uIENUZXh0SW5wdXRTdWdnZXN0KCAkSW5wdXRFbGVtZW50LCBmblN1Z2dlc3RGb3JUZXJtLCBmbk9uU3VnZ2VzdCwgc3RyQ3NzQ2xhc3MsIG9wdHMgKQ0Kew0KCXRoaXMuSW5pdCggJElucHV0RWxlbWVudCwgZm5TdWdnZXN0Rm9yVGVybSwgZm5PblN1Z2dlc3QsIHN0ckNzc0NsYXNzLCBvcHRzICk7DQp9DQoNCkNUZXh0SW5wdXRTdWdnZXN0LnByb3RvdHlwZS5Jbml0ID0gZnVuY3Rpb24oICRJbnB1dEVsZW1lbnQsIGZuU3VnZ2VzdEZvclRlcm0sIGZuT25TdWdnZXN0LCBzdHJDc3NDbGFzcywgb3B0cyApDQp7DQoJb3B0cyA9IG9wdHMgPyBvcHRzIDoge307DQoJaWYoICFzdHJDc3NDbGFzcyApDQoJCXN0ckNzc0NsYXNzID0gJ3BvcHVwX2Jsb2NrX25ldyc7DQoJdGhpcy5tX2JIYXZlU3VnZ2VzdGlvbnMgPSBmYWxzZTsNCgl0aGlzLm1fJElucHV0ID0gJElucHV0RWxlbWVudDsNCgl0aGlzLm1fZm5TdWdnZXN0Rm9yVGVybSA9IGZuU3VnZ2VzdEZvclRlcm07DQoJdGhpcy5tX2ZuT25TdWdnZXN0ID0gZm5PblN1Z2dlc3QgfHwgZnVuY3Rpb24oIHRlcm0gKSB7fTsNCgl0aGlzLm1fc3RyTGFzdFZhbCA9IG9wdHMuYkRvRW1wdHlTZWFyY2hPbkZpcnN0Rm9jdXMgPyB1bmRlZmluZWQgOiAnJzsJLy8gJycgaXMgdGhlIHZhbHVlIGluIHRoZSBpbnB1dCB3aGVuIGl0J3MgZW1wdHkNCgl0aGlzLm1fYWxpZ24gPSAnbGVmdCc7DQoJdGhpcy5tX3ZhbGlnbiA9ICdib3R0b20nOw0KDQoJdGhpcy5tXyRGb2N1cyA9ICRKKCk7DQoJdGhpcy5tX3N0ckxhc3RGb2N1c1ZhbCA9IG51bGw7DQoNCgl0aGlzLm1fbk5leHRSZXF1ZXN0SUQgPSAxOw0KCXRoaXMubV9uUmVxdWVzdElEUmVjdmQgPSAwOw0KDQoNCgl0aGlzLm1fJFN1Z2dlc3Rpb25zQ3RuID0gJEooJzxkaXYvPicsIHsnY2xhc3MnOiBzdHJDc3NDbGFzcywgc3R5bGU6ICdkaXNwbGF5OiBub25lOycgfSApOw0KCXRoaXMubV8kU3VnZ2VzdGlvbnMgPSAkSignPGRpdi8+JywgeydjbGFzcyc6ICdwb3B1cF9ib2R5IHBvcHVwX21lbnUnIH0gKTsNCgl0aGlzLm1fJFN1Z2dlc3Rpb25zQ3RuLmFwcGVuZCggdGhpcy5tXyRTdWdnZXN0aW9ucyApOw0KDQoJdGhpcy5tXyRTdWdnZXN0aW9uc0N0bi5oaWRlKCk7DQoJdGhpcy5tXyRJbnB1dFswXS5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKCB0aGlzLm1fJFN1Z2dlc3Rpb25zQ3RuWzBdICk7DQoNCgl2YXIgekluZGV4ID0gMjAwOwkvL25vcm1hbCBwb3B1cCB6aW5kZXgNCgl0aGlzLm1fJElucHV0LnBhcmVudHMoKS5lYWNoKCBmdW5jdGlvbigpIHsNCgkJdmFyIHpJbmRleFBhcmVudCA9ICRKKHRoaXMpLmNzcygnekluZGV4Jyk7DQoJCWlmICggekluZGV4UGFyZW50ICE9ICdhdXRvJyAmJiB6SW5kZXhQYXJlbnQgIT0gMCApDQoJCXsNCgkJCXpJbmRleCA9IHpJbmRleFBhcmVudDsNCgkJfQ0KCX0pOw0KCXRoaXMubV8kU3VnZ2VzdGlvbnNDdG4uY3NzKCAnekluZGV4JywgekluZGV4ICsgMjAgKTsNCg0KCXZhciBfdGhpcyA9IHRoaXM7DQoJdGhpcy5tXyRJbnB1dC5vbiggJ2tleXVwLkNUZXh0SW5wdXRTdWdnZXN0IGNsaWNrLkNUZXh0SW5wdXRTdWdnZXN0JywgZnVuY3Rpb24oIGV2ZW50ICkgeyBfdGhpcy5PblRleHRDaGFuZ2VkKCBldmVudCApIH0gKTsNCgl0aGlzLm1fJElucHV0Lm9uKCAncGFzdGUuQ1RleHRJbnB1dFN1Z2dlc3QgY3V0LkNUZXh0SW5wdXRTdWdnZXN0JywgZnVuY3Rpb24oKSB7IHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsgX3RoaXMuT25UZXh0Q2hhbmdlZCgpIH0sIDEgKTsgfSApOw0KCXRoaXMubV8kSW5wdXQub24oICdrZXlkb3duLkNUZXh0SW5wdXRTdWdnZXN0JywgZnVuY3Rpb24oIGV2ZW50ICkgeyBfdGhpcy5PbktleURvd24oIGV2ZW50ICkgfSApOw0KCXRoaXMubV8kSW5wdXQub24oICdmb2N1cy5DVGV4dElucHV0U3VnZ2VzdCcsIGZ1bmN0aW9uKCkgeyBfdGhpcy5TaG93U3VnZ2VzdGlvbnMoKSB9ICk7DQoJdGhpcy5tXyRJbnB1dC5vbiggJ2JsdXIuQ1RleHRJbnB1dFN1Z2dlc3QnLCBmdW5jdGlvbigpIHsgX3RoaXMuSGlkZVN1Z2dlc3Rpb25zKCkgfSApOw0KfQ0KDQpDVGV4dElucHV0U3VnZ2VzdC5wcm90b3R5cGUuU2V0QWxpZ25tZW50ID0gZnVuY3Rpb24oIGFsaWduLCB2YWxpZ24gKQ0Kew0KCXRoaXMubV9hbGlnbiA9IGFsaWduIHx8ICdsZWZ0JzsNCgl0aGlzLm1fdmFsaWduID0gdmFsaWduIHx8ICdib3R0b20nOw0KfTsNCg0KQ1RleHRJbnB1dFN1Z2dlc3QucHJvdG90eXBlLlNldFN1Z2dlc3Rpb25zQ29udGFpbmVySWQgPSBmdW5jdGlvbiggc3RyU3VnZ2VzdGlvbnNDdG5JZCApDQp7DQoJdGhpcy5tXyRTdWdnZXN0aW9uc0N0bi5hdHRyKCAnaWQnLCBzdHJTdWdnZXN0aW9uc0N0bklkICk7DQp9Ow0KDQpDVGV4dElucHV0U3VnZ2VzdC5wcm90b3R5cGUuU2hvd1N1Z2dlc3Rpb25zID0gZnVuY3Rpb24oKQ0Kew0KCWlmICggIXRoaXMubV8kU3VnZ2VzdGlvbnNDdG4uZmluZCgnOnZpc2libGUnKS5sZW5ndGggKQ0KCXsNCgkJaWYgKCB0aGlzLm1fYkhhdmVTdWdnZXN0aW9ucyApDQoJCXsNCgkJCUFsaWduTWVudSh0aGlzLm1fJElucHV0WzBdLCB0aGlzLm1fJFN1Z2dlc3Rpb25zQ3RuWzBdLCB0aGlzLm1fYWxpZ24sIHRoaXMubV92YWxpZ24sIHRydWUpOw0KCQkJdGhpcy5tXyRTdWdnZXN0aW9uc0N0bi5mYWRlSW4oJ2Zhc3QnKTsNCgkJfQ0KCQllbHNlIGlmICggdGhpcy5tX3N0ckxhc3RWYWwgPT09IHVuZGVmaW5lZCApDQoJCXsNCgkJCS8vIHJ1biBhbiBpbml0aWFsIHF1ZXJ5LiAgVGhpcyB3aWxsIHNldCBtX3N0ckxhc3RWYWwgdG8gZW1wdHkgc3RyaW5nIChvciB3aGF0ZXZlciBlbHNlIGlzIGluIHRoZSBib3gsDQoJCQkvLyAgaWYgc29tZXRoaW5nIGNhbWUgZnJvbSBicm93c2VyIGhpc3RvcnkpDQoJCQl0aGlzLk9uVGV4dENoYW5nZWQoIHVuZGVmaW5lZCApOw0KCQl9DQoJfQ0KfTsNCg0KQ1RleHRJbnB1dFN1Z2dlc3QucHJvdG90eXBlLkhpZGVTdWdnZXN0aW9ucyA9IGZ1bmN0aW9uKCkNCnsNCglpZiAoIHRoaXMubV9iSGF2ZVN1Z2dlc3Rpb25zICkNCgkJdGhpcy5tXyRTdWdnZXN0aW9uc0N0bi5mYWRlT3V0KCAnZmFzdCcgKTsNCgllbHNlDQoJCXRoaXMubV8kU3VnZ2VzdGlvbnNDdG4uaGlkZSgpOw0KfTsNCg0KQ1RleHRJbnB1dFN1Z2dlc3QucHJvdG90eXBlLk9uU3VnZ2VzdGlvblNlbGVjdGVkID0gZnVuY3Rpb24oICRTdWdnZXN0aW9uICkNCnsNCgl0aGlzLm1fJElucHV0LnZhbCggJFN1Z2dlc3Rpb24udGV4dCgpICk7DQoNCgl0aGlzLm1fYkhhdmVTdWdnZXN0aW9ucyA9IGZhbHNlOw0KCXRoaXMubV8kRm9jdXMgPSAkSigpOw0KCXRoaXMuSGlkZVN1Z2dlc3Rpb25zKCk7DQoNCgl0aGlzLm1fZm5PblN1Z2dlc3QoICRTdWdnZXN0aW9uLnRleHQoKSApOw0KfTsNCg0KQ1RleHRJbnB1dFN1Z2dlc3QucHJvdG90eXBlLlNldFN1Z2dlc3Rpb25zID0gZnVuY3Rpb24oIHJnU3VnZ2VzdGlvbnMgKQ0Kew0KCXZhciBzdHJMYXN0Rm9jdXMgPSB0aGlzLm1fc3RyTGFzdEZvY3VzVmFsOw0KDQoJdGhpcy5tXyRTdWdnZXN0aW9ucy5lbXB0eSgpOw0KDQoJdGhpcy5tXyRGb2N1cyA9ICRKKCk7DQoJdGhpcy5tX3N0ckxhc3RGb2N1cyA9IG51bGw7DQoNCglpZiAoIHJnU3VnZ2VzdGlvbnMgJiYgcmdTdWdnZXN0aW9ucy5sZW5ndGggKQ0KCXsNCgkJdmFyIF90aGlzID0gdGhpczsNCgkJZm9yICggdmFyIGkgPSAwOyBpIDwgcmdTdWdnZXN0aW9ucy5sZW5ndGg7IGkrKyApDQoJCXsNCgkJCXZhciAkU3VnZ2VzdGlvbiA9ICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ3N1Z2dlc3Rpb25faXRlbSBwb3B1cF9tZW51X2l0ZW0nIH0gKTsNCgkJCSRTdWdnZXN0aW9uLnRleHQoIHJnU3VnZ2VzdGlvbnNbaV0gKTsNCgkJCSRTdWdnZXN0aW9uLmNsaWNrKCAkSi5wcm94eSggdGhpcy5PblN1Z2dlc3Rpb25TZWxlY3RlZCwgdGhpcywgJFN1Z2dlc3Rpb24gKSApOw0KCQkJJFN1Z2dlc3Rpb24ubW91c2VlbnRlciggJEoucHJveHkoIHRoaXMuU2V0Rm9jdXMsIHRoaXMsICRTdWdnZXN0aW9uICkgKTsNCg0KCQkJdGhpcy5tXyRTdWdnZXN0aW9ucy5hcHBlbmQoICRTdWdnZXN0aW9uICk7DQoNCgkJCWlmICggcmdTdWdnZXN0aW9uc1tpXSA9PSBzdHJMYXN0Rm9jdXMgKQ0KCQkJCXRoaXMuU2V0Rm9jdXMoICRTdWdnZXN0aW9uICk7DQoJCX0NCgkJdGhpcy5tX2JIYXZlU3VnZ2VzdGlvbnMgPSB0cnVlOw0KCQl0aGlzLlNob3dTdWdnZXN0aW9ucygpOw0KCX0NCgllbHNlDQoJew0KCQl0aGlzLm1fYkhhdmVTdWdnZXN0aW9ucyA9IGZhbHNlOw0KCQl0aGlzLkhpZGVTdWdnZXN0aW9ucygpOw0KCX0NCn07DQoNCkNUZXh0SW5wdXRTdWdnZXN0LnByb3RvdHlwZS5PblRleHRDaGFuZ2VkID0gZnVuY3Rpb24oIGV2ZW50ICkNCnsNCglpZiAoIGV2ZW50ICYmICggZXZlbnQud2hpY2ggPT0gMTMgfHwgZXZlbnQud2hpY2ggPT0gMjcgKSApDQoJCXJldHVybjsNCg0KCXZhciB2YWx1ZSA9IHRoaXMubV8kSW5wdXQudmFsKCkudHJpbSgpOw0KCWlmICggdmFsdWUgIT09IHRoaXMubV9zdHJMYXN0VmFsICkNCgl7DQoJCXZhciBfdGhpcyA9IHRoaXM7DQoJCXZhciBuUmVxdWVzdElEID0gdGhpcy5tX25OZXh0UmVxdWVzdElEKys7DQoJCXRoaXMubV9mblN1Z2dlc3RGb3JUZXJtKCB2YWx1ZSwgZnVuY3Rpb24oIHJnU3VnZ2VzdGlvbnMgKSB7DQoJCQkvLyB3ZSd2ZSBhbHJlYWR5IHJlY2lldmVkIGEgbW9yZSByZWNlbnQgcmVzcG9uc2UsIHRoaXMgaXMgb3V0LW9mLW9yZGVyDQoJCQlpZiAoIF90aGlzLm1fblJlcXVlc3RJRFJlY3ZkID4gblJlcXVlc3RJRCApDQoJCQkJcmV0dXJuOw0KDQoJCQlfdGhpcy5tX25SZXF1ZXN0SURSZWN2ZCA9IG5SZXF1ZXN0SUQ7DQoJCQlfdGhpcy5TZXRTdWdnZXN0aW9ucyggcmdTdWdnZXN0aW9ucyApOw0KCQl9ICk7DQoNCgkJdGhpcy5tX3N0ckxhc3RWYWwgPSB2YWx1ZTsNCgl9DQp9Ow0KDQpDVGV4dElucHV0U3VnZ2VzdC5wcm90b3R5cGUuT25LZXlEb3duID0gZnVuY3Rpb24oIGV2ZW50ICkNCnsNCglpZiAoIGV2ZW50LndoaWNoID09IDI3ICkNCgl7DQoJCXRoaXMuSGlkZVN1Z2dlc3Rpb25zKCk7DQoJfQ0KCWVsc2UgaWYgKCB0aGlzLm1fYkhhdmVTdWdnZXN0aW9ucyApDQoJew0KCQl2YXIgJE5ld1N1Z2dlc3Rpb24gPSBudWxsOw0KCQlpZiAoIGV2ZW50LndoaWNoID09IDEzICkNCgkJew0KCQkJaWYgKCB0aGlzLm1fJEZvY3VzLmxlbmd0aCAmJiB0aGlzLm1fYkhhdmVTdWdnZXN0aW9ucyApDQoJCQl7DQoJCQkJdGhpcy5PblN1Z2dlc3Rpb25TZWxlY3RlZCggdGhpcy5tXyRGb2N1cyApOw0KCQkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOw0KCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQoJCQl9DQoJCX0NCgkJZWxzZSBpZiAoIGV2ZW50LndoaWNoID09IDM4IC8qIHVwIGFycm93ICovICkNCgkJew0KCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsNCgkJCWlmICggdGhpcy5tXyRGb2N1cy5sZW5ndGggKQ0KCQkJCSROZXdTdWdnZXN0aW9uID0gdGhpcy5tXyRGb2N1cy5wcmV2KCk7DQoJCQlpZiAoICEkTmV3U3VnZ2VzdGlvbiApDQoJCQkJJE5ld1N1Z2dlc3Rpb24gPSB0aGlzLm1fJFN1Z2dlc3Rpb25zLmNoaWxkcmVuKCkubGFzdCgpOw0KCQl9DQoJCWVsc2UgaWYgKCBldmVudC53aGljaCA9PSA0MCAvKiBkb3duIGFycm93ICovICkNCgkJCXsNCgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KCQkJCWlmICggdGhpcy5tXyRGb2N1cy5sZW5ndGggKQ0KCQkJCQkkTmV3U3VnZ2VzdGlvbiA9IHRoaXMubV8kRm9jdXMubmV4dCgpOw0KCQkJCWlmICggISROZXdTdWdnZXN0aW9uICkNCgkJCQkJJE5ld1N1Z2dlc3Rpb24gPSB0aGlzLm1fJFN1Z2dlc3Rpb25zLmNoaWxkcmVuKCkuZmlyc3QoKTsNCgkJCX0NCg0KCQlpZiAoICROZXdTdWdnZXN0aW9uICkNCgkJCXRoaXMuU2V0Rm9jdXMoICROZXdTdWdnZXN0aW9uICk7DQoJfQ0KfTsNCg0KQ1RleHRJbnB1dFN1Z2dlc3QucHJvdG90eXBlLlNldEZvY3VzID0gZnVuY3Rpb24oICRTdWdnZXN0aW9uICkNCnsNCgl0aGlzLm1fJEZvY3VzLnJlbW92ZUNsYXNzKCAnZm9jdXMnICk7DQoJdGhpcy5tXyRGb2N1cyA9ICRTdWdnZXN0aW9uOw0KCXRoaXMubV8kRm9jdXMuYWRkQ2xhc3MoICdmb2N1cycgKTsNCgl0aGlzLm1fc3RyTGFzdEZvY3VzVmFsID0gJFN1Z2dlc3Rpb24udGV4dCgpOw0KfTsNCg0KQ1RleHRJbnB1dFN1Z2dlc3QucHJvdG90eXBlLkRlc3Ryb3kgPSBmdW5jdGlvbigpDQp7DQoJdGhpcy5tXyRTdWdnZXN0aW9uc0N0bi5yZW1vdmUoKTsNCgl0aGlzLm1fJElucHV0Lm9mZiggJy5DVGV4dElucHV0U3VnZ2VzdCcgKTsNCn07DQoNCi8qKg0KICogU2ltaWxhciB0byBDVGV4dElucHV0U3VnZ2VzdCwgYnV0IGFwcGxpZXMgc3R5bGluZyB1c2luZyB0aGUgYXBwX3R5cGUgdmFsdWUgb2YgZWFjaCBzdWdnZXN0aW9uDQogKg0KICogRWFjaCBzdWdnZXN0aW9uIHNob3VsZCBpbmNsdWRlIHRoZSBzdWdnZXN0aW9uIHRleHQsIGFuZCB0aGUgYXBwX3R5cGUNCiAqDQogKiBAcGFyYW0gJElucHV0RWxlbWVudA0KICogQHBhcmFtIGZuU3VnZ2VzdEZvclRlcm0NCiAqIEBwYXJhbSBmbk9uU3VnZ2VzdA0KICogQGNvbnN0cnVjdG9yDQogKi8NCmZ1bmN0aW9uIENBcHBUeXBlSW5wdXRTdWdnZXN0KCAkSW5wdXRFbGVtZW50LCBmblN1Z2dlc3RGb3JUZXJtLCBmbk9uU3VnZ2VzdCwgc3RyQ3NzQ2xhc3MgKQ0Kew0KCXRoaXMuSW5pdCggJElucHV0RWxlbWVudCwgZm5TdWdnZXN0Rm9yVGVybSwgZm5PblN1Z2dlc3QsIHN0ckNzc0NsYXNzLCB7IGJEb0VtcHR5U2VhcmNoT25GaXJzdEZvY3VzOiB0cnVlIH0gKTsNCn0NCg0KQ0FwcFR5cGVJbnB1dFN1Z2dlc3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ1RleHRJbnB1dFN1Z2dlc3QucHJvdG90eXBlICk7DQoNCkNBcHBUeXBlSW5wdXRTdWdnZXN0LnByb3RvdHlwZS5TZXRTdWdnZXN0aW9ucyA9IGZ1bmN0aW9uKCByZ1N1Z2dlc3Rpb25zICkNCnsNCgl2YXIgc3RyTGFzdEZvY3VzID0gdGhpcy5tX3N0ckxhc3RGb2N1c1ZhbDsNCg0KCXRoaXMubV8kU3VnZ2VzdGlvbnMuZW1wdHkoKTsNCg0KCXRoaXMubV8kRm9jdXMgPSAkSigpOw0KCXRoaXMubV9zdHJMYXN0Rm9jdXMgPSBudWxsOw0KDQoJaWYgKCByZ1N1Z2dlc3Rpb25zICYmIHJnU3VnZ2VzdGlvbnMubGVuZ3RoICkNCgl7DQoJCXZhciBfdGhpcyA9IHRoaXM7DQoJCWZvciAoIHZhciBpID0gMDsgaSA8IHJnU3VnZ2VzdGlvbnMubGVuZ3RoOyBpKysgKQ0KCQl7DQoJCQl2YXIgcmVzdWx0Q2xhc3MgPSAnc3VnZ2VzdGlvbl9pdGVtIHBvcHVwX21lbnVfaXRlbSc7DQoJCQl2YXIgc3VnZ2VzdGlvblRleHQgPSByZ1N1Z2dlc3Rpb25zW2ldWzBdOw0KDQoJCQlpZiAoIHR5cGVvZiByZ1N1Z2dlc3Rpb25zW2ldWzFdICE9PSAndW5kZWZpbmVkJyApDQoJCQl7DQoJCQkJc3dpdGNoICggcGFyc2VJbnQoIHJnU3VnZ2VzdGlvbnNbaV1bMV0gKSApDQoJCQkJew0KCQkJCQljYXNlIDE6DQoJCQkJCQlyZXN1bHRDbGFzcyArPSAnIGFwcF9HYW1lJzsNCgkJCQkJCXN1Z2dlc3Rpb25UZXh0ID0gJ1tHYW1lXSAnICsgc3VnZ2VzdGlvblRleHQ7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAyOg0KCQkJCQkJc3VnZ2VzdGlvblRleHQgPSAnW0FwcGxpY2F0aW9uXSAnICsgc3VnZ2VzdGlvblRleHQ7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSA0Og0KCQkJCQkJc3VnZ2VzdGlvblRleHQgPSAnW1Rvb2xdICcgKyBzdWdnZXN0aW9uVGV4dDsNCgkJCQkJCWJyZWFrOw0KCQkJCQljYXNlIDg6DQoJCQkJCQlyZXN1bHRDbGFzcyArPSAnIGFwcF9EZW1vJzsNCgkJCQkJCXN1Z2dlc3Rpb25UZXh0ID0gJ1tEZW1vXSAnICsgc3VnZ2VzdGlvblRleHQ7DQoJCQkJCQlicmVhazsNCgkJCQkJY2FzZSAxNjoNCgkJCQkJCXN1Z2dlc3Rpb25UZXh0ID0gJ1tNZWRpYV0gJyArIHN1Z2dlc3Rpb25UZXh0Ow0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgMzI6DQoJCQkJCQlyZXN1bHRDbGFzcyArPSAnIGFwcF9ETEMnOw0KCQkJCQkJc3VnZ2VzdGlvblRleHQgPSAnW0RMQ10gJyArIHN1Z2dlc3Rpb25UZXh0Ow0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgMjU2Og0KCQkJCQkJc3VnZ2VzdGlvblRleHQgPSAnW0NvbmZpZ10gJyArIHN1Z2dlc3Rpb25UZXh0Ow0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgMjA0ODoNCgkJCQkJCXJlc3VsdENsYXNzICs9ICcgYXBwX01vdmllJzsNCgkJCQkJCXN1Z2dlc3Rpb25UZXh0ID0gJ1tWaWRlb10gJyArIHN1Z2dlc3Rpb25UZXh0Ow0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgODE5MjoNCgkJCQkJCXJlc3VsdENsYXNzICs9ICcgYXBwX011c2ljJzsNCgkJCQkJCXN1Z2dlc3Rpb25UZXh0ID0gJ1tNdXNpY10gJyArIHN1Z2dlc3Rpb25UZXh0Ow0KCQkJCQkJYnJlYWs7DQoJCQkJCWNhc2UgNjU1MzY6DQoJCQkJCQlyZXN1bHRDbGFzcyArPSAnIGFwcF9CZXRhJzsNCgkJCQkJCXN1Z2dlc3Rpb25UZXh0ID0gJ1tCZXRhXSAnICsgc3VnZ2VzdGlvblRleHQ7DQoJCQkJCQlicmVhazsNCgkJCQl9DQoJCQl9DQoNCgkJCXZhciAkU3VnZ2VzdGlvbiA9ICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogcmVzdWx0Q2xhc3MgfSApOw0KCQkJJFN1Z2dlc3Rpb24udGV4dCggc3VnZ2VzdGlvblRleHQgKTsNCg0KCQkJJFN1Z2dlc3Rpb24uY2xpY2soICRKLnByb3h5KCB0aGlzLk9uU3VnZ2VzdGlvblNlbGVjdGVkLCB0aGlzLCAkU3VnZ2VzdGlvbiApICk7DQoJCQkkU3VnZ2VzdGlvbi5tb3VzZWVudGVyKCAkSi5wcm94eSggdGhpcy5TZXRGb2N1cywgdGhpcywgJFN1Z2dlc3Rpb24gKSApOw0KDQoJCQl0aGlzLm1fJFN1Z2dlc3Rpb25zLmFwcGVuZCggJFN1Z2dlc3Rpb24gKTsNCg0KCQkJaWYgKCByZ1N1Z2dlc3Rpb25zW2ldID09IHN0ckxhc3RGb2N1cyApDQoJCQkJdGhpcy5TZXRGb2N1cyggJFN1Z2dlc3Rpb24gKTsNCgkJfQ0KCQl0aGlzLm1fYkhhdmVTdWdnZXN0aW9ucyA9IHRydWU7DQoJCXRoaXMuU2hvd1N1Z2dlc3Rpb25zKCk7DQoJfQ0KCWVsc2UNCgl7DQoJCXRoaXMubV9iSGF2ZVN1Z2dlc3Rpb25zID0gZmFsc2U7DQoJCXRoaXMuSGlkZVN1Z2dlc3Rpb25zKCk7DQoJfQ0KfTsNCg0KDQpmdW5jdGlvbiBJbml0QkJDb2RlVmlkZW9zKCBiQWxsb3dBdXRvUGxheSApDQp7DQoJdmFyIHZpZGVvcyA9ICRKKCAidmlkZW8iICk7DQoJaWYgKCB2aWRlb3MubGVuZ3RoICE9IDAgKQ0KCXsNCgkJZm9yICggdmFyIGkgPSAwOyBpIDwgdmlkZW9zLmxlbmd0aDsgKytpICkNCgkJew0KCQkJdmFyIHZpZGVvID0gdmlkZW9zW2ldOw0KCQkJdmFyICR2aWRlbyA9ICRKKCB2aWRlbyApOw0KDQoJCQlpZiAoICR2aWRlby5oYXNDbGFzcygiYmJfdmlkZW9fbG9vcCIpICkNCgkJCXsNCgkJCQl2aWRlby5zZXRBdHRyaWJ1dGUoJ2xvb3AnLCAnbG9vcCcpOw0KCQkJfQ0KDQoJCQlpZiAoICR2aWRlby5oYXNDbGFzcygiYmJfdmlkZW9fY29udHJvbHMiKSApDQoJCQl7DQoJCQkJdmlkZW8uc2V0QXR0cmlidXRlKCAnY29udHJvbHMnLCAnY29udHJvbHMnICk7DQoJCQl9DQoNCgkJCWlmICggYkFsbG93QXV0b1BsYXkgKQ0KCQkJew0KCQkJCSR2aWRlby51bmJpbmQoJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScpOw0KDQoJCQkJdmlkZW8ucHJlbG9hZCA9ICR2aWRlby5oYXNDbGFzcygiYmJfdmlkZW9fcHJlbG9hZCIpID8gJ2F1dG8nIDogJ21ldGFkYXRhJzsNCg0KCQkJCWlmICggJHZpZGVvLmhhc0NsYXNzKCJiYl92aWRlb19hdXRvcGxheSIpICkNCgkJCQl7DQoJCQkJCXZpZGVvLmF1dG9wbGF5ID0gJ2F1dG9wbGF5JzsNCgkJCQl9DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJdmlkZW8ucHJlbG9hZCA9ICdtZXRhZGF0YSc7DQoJCQkJJHZpZGVvLmhvdmVyKCBmdW5jdGlvbiB0b2dnbGVDb250cm9scygpIHsNCgkJCQkJaWYgKCB0aGlzLmhhc0F0dHJpYnV0ZSgiY29udHJvbHMiKSApIHsNCgkJCQkJCXRoaXMucmVtb3ZlQXR0cmlidXRlKCJjb250cm9scyIpDQoJCQkJCX0gZWxzZSB7DQoJCQkJCQl0aGlzLnNldEF0dHJpYnV0ZSgiY29udHJvbHMiLCAiY29udHJvbHMiKQ0KCQkJCQl9DQoJCQkJfSApOw0KCQkJfQ0KCQl9DQoJfQ0KfQ0KDQoNCi8qKg0KICogR2VuZXJpYyBpbnRlcmZhY2UgZm9yIGhhbmRsaW5nIGFqYXgtZHJpdmVuIHN1Yi1wYWdlcy4NCiAqDQogKiBAcGFyYW0gZWxUYXJnZXQgRWxlbWVudCB0byBkdW1wIGNvbnRlbnQgaW50bw0KICogQHBhcmFtIHN0ckJhc2VVUkwgQmFzZSBVUkwgdG8gYXR0YWNoIG5hdiBwYXJhbXMNCiAqIEBwYXJhbSBzdHJJbnN0YW5jZUlkIFVuaXF1ZSBmbGFnIHRvIGxvb2sgZm9yIHdoZW4gc2Nhbm5pbmcgZm9yIHN0YXRlIGNoYW5nZSBldmVudHMuIGFsc28gZGV0ZXJtaW5lcyBvdXIgZGF0YSBzZWxlY3Rvcg0KICogCQkJCQkJT25seSBuZWVkZWQgaWYgeW91J3JlIHVzaW5nIG1vcmUgdGhhbiBvbmUgQ0FqYXhTdWJQYWdlQ29udHJvbGxlciBvbiB0aGUgc2FtZSBwYWdlLg0KICogQHBhcmFtIHN0ckRlZmF1bHRMb2NhdGlvbiBVc2VkIHdoZW4gbm8gbmF2aWQgaXMgcHJvdmlkZWQNCiAqIEBjb25zdHJ1Y3Rvcg0KICovDQp2YXIgQ0FqYXhTdWJQYWdlQ29udHJvbGxlciA9IGZ1bmN0aW9uKCBlbFRhcmdldCwgc3RyQmFzZVVSTCwgc3RySW5zdGFuY2VJZCwgc3RyRGVmYXVsdExvY2F0aW9uICkNCnsNCgl0aGlzLmVsVGFyZ2V0ID0gZWxUYXJnZXQ7DQoJdGhpcy5zdHJCYXNlVVJMID0gc3RyQmFzZVVSTDsNCgl0aGlzLnN0clN0YXRlSUQgPSBzdHJJbnN0YW5jZUlkIHx8ICduYXZpZCc7DQoJdGhpcy5zdHJEZWZhdWx0TG9jYXRpb24gPSBzdHJEZWZhdWx0TG9jYXRpb24gfHwgJyc7DQoNCgl0aGlzLnJnT3JpZ2luYWxFdmVudCA9IHsnaHRtbCc6dGhpcy5lbFRhcmdldC5pbm5lckhUTUwsJ3RpdGxlJzpkb2N1bWVudC50aXRsZSwgJ2lkJzogdGhpcy5zdHJTdGF0ZUlEfTsNCg0KCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIHRoaXMuT25XaW5kb3dQb3BTdGF0ZS5iaW5kKHRoaXMpKTsNCg0KCXRoaXMuSW5zdHJ1bWVudExpbmtzKCBkb2N1bWVudCApOw0KDQoJdmFyIF90aGlzID0gdGhpczsNCglzZXRUaW1lb3V0KCBmdW5jdGlvbigpeyAkSihfdGhpcy5lbFRhcmdldCkuY2hpbGRyZW4oKS50cmlnZ2VyKCdsb2FkJyk7IH0sIDEpOw0KDQoJdmFyIHN0ckxvY2F0aW9uID0gIHdpbmRvdy5sb2NhdGlvbi5ocmVmLnN1YnN0cmluZyhzdHJCYXNlVVJMLmxlbmd0aCk7DQoJdGhpcy5QYWludExpbmtzKHN0ckxvY2F0aW9uIHx8IHRoaXMuc3RyRGVmYXVsdExvY2F0aW9uKTsNCg0KDQp9Ow0KDQovKioNCiAqIFJlZ2lzdGVyIGNsaWNrIGhhbmRsZXJzLiBUaGlzIGFsc28gc2V0cyB0aGUgaHJlZiBmb3IgYnJvd3NlciBsaW5rIHByZXZpZXcgYW5kIGZhbGxiYWNrIGZvciBub24tY2xpY2sgbmF2aWdhdGlvbg0KICogZXZlbnRzLCBzdWNoIGFzIG9wZW5pbmcgaW4gYSBuZXcgdGFiL3dpbmRvdyB2aWEgbWlkZGxlIGNsaWNrLg0KICogQHBhcmFtIGVsVGFyZ2V0IEVsZW1lbnQgdG8gcXVlcnkgZnJvbS4NCiAqIEBjb25zdHJ1Y3Rvcg0KICovDQpDQWpheFN1YlBhZ2VDb250cm9sbGVyLnByb3RvdHlwZS5JbnN0cnVtZW50TGlua3MgPSBmdW5jdGlvbiggZWxUYXJnZXQgKQ0Kew0KCS8vdmFyIHJnTGlua3MgPSBlbFRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS0nK3RoaXMuc3RyU3RhdGVJRCsnXScpOw0KCXZhciByZ0xpbmtzID0gJEooJ1tkYXRhLScrdGhpcy5zdHJTdGF0ZUlEKyddJywgZWxUYXJnZXQpOw0KCWZvciggdmFyIGk9MDsgaTxyZ0xpbmtzLmxlbmd0aDsgaSsrKQ0KCXsNCgkJcmdMaW5rc1tpXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuTmF2aWdhdGUuYmluZCh0aGlzLCByZ0xpbmtzW2ldLmRhdGFzZXRbIHRoaXMuc3RyU3RhdGVJRCBdLCByZ0xpbmtzW2ldLmRhdGFzZXRbICd0aXRsZScgXSApICk7DQoJCXJnTGlua3NbaV0uaHJlZiA9IHRoaXMuc3RyQmFzZVVSTCArIHJnTGlua3NbaV0uZGF0YXNldFsgdGhpcy5zdHJTdGF0ZUlEIF07DQoJfQ0KfTsNCg0KLyoqDQogKiBBZGRzICdhY3RpdmUnIGNsYXNzIHRvIGxpbmsgdGhhdCB3YXMgY2xpY2tlZCBvciBpcyBjdXJyZW50bHkgYWN0aXZlLg0KICogQGNvbnN0cnVjdG9yDQogKi8NCkNBamF4U3ViUGFnZUNvbnRyb2xsZXIucHJvdG90eXBlLlBhaW50TGlua3MgPSBmdW5jdGlvbiggc3RyTG9jYXRpb24gKQ0Kew0KCS8vIEZpZ3VyZSBvdXQgd2hpY2ggbGluayB3ZSBjbGlja2VkIGFuZCBwYWludCBpdCB3aXRoIHRoZSBjb3JyZWN0IGNsYXNzDQoJdmFyIHJnTGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS0nK3RoaXMuc3RyU3RhdGVJRCsnXScpOw0KCWZvciggdmFyIGk9MDsgaTxyZ0xpbmtzLmxlbmd0aDsgaSsrKQ0KCXsNCgkJaWYoIHJnTGlua3NbaV0uZGF0YXNldFsgdGhpcy5zdHJTdGF0ZUlEIF0gPT0gc3RyTG9jYXRpb24gfHwgcmdMaW5rc1tpXS5kYXRhc2V0WyB0aGlzLnN0clN0YXRlSUQgXSArICcvJyA9PSBzdHJMb2NhdGlvbiApDQoJCQlyZ0xpbmtzW2ldLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOw0KCQllbHNlDQoJCQlyZ0xpbmtzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOw0KCX0NCn07DQoNCi8qKg0KICogQ2FsbCB0byBuYXZpZ2F0ZSB0aGUgc3ViLWZyYW1lLg0KICoNCiAqIEBwYXJhbSBzdHJMb2NhdGlvbiBBc3N1bWVkIHRvIGJlIHN0ckJhc2VVUkwgKyBzdHJMb2NhdGlvbi4gVHJhaWxpbmcgc2xhc2ggc2hvdWxkIGJlIG9uIHN0ckJhc2VVUkwgYWxyZWFkeS4NCiAqIEBwYXJhbSBzdHJwYWdlVGl0bGUgT3B0aW9uYWw6IFJlcGxhY2UgcGFnZSB0aXRsZSB3aXRoIHRoaXMgbmV3IHZhbHVlLg0KICogQGNvbnN0cnVjdG9yDQogKi8NCkNBamF4U3ViUGFnZUNvbnRyb2xsZXIucHJvdG90eXBlLk5hdmlnYXRlID0gZnVuY3Rpb24oIHN0ckxvY2F0aW9uLCBzdHJQYWdlVGl0bGUsIGV2ZW50ICkNCnsNCgl2YXIgX3RoaXMgPSB0aGlzOw0KCXZhciBzdHJVUkwgPSB0aGlzLnN0ckJhc2VVUkwgKyBzdHJMb2NhdGlvbjsNCg0KCXRoaXMuZWxUYXJnZXQuY2xhc3NMaXN0LmFkZCgnbG9hZGluZycpOw0KDQoJdGhpcy5QYWludExpbmtzKCBzdHJMb2NhdGlvbiApOw0KDQoJLy8gVHJpZ2dlciB0aGUgInNhdmVmb3JtIiBldmVudCB3aGljaCB3ZSBtYXkgaGF2ZSBib3VuZCB0byBkbyB0aGluZ3MuDQoJJEooICdmb3JtJywgdGhpcy5lbFRhcmdldCApLnRyaWdnZXIoJ3NhdmVmb3JtJyk7DQoNCgkkSi5hamF4KHsNCgkJdXJsOiBzdHJVUkwsDQoJCWRhdGFUeXBlOiAiaHRtbCIsDQoJCWNhY2hlOiB0cnVlLCAvKiBMZXQgdGhlIGJyb3dzZXIgZGVjaWRlIGNhY2hpbmcgcnVsZXMgKi8NCgkJZGF0YTogeyAnYWpheCc6IDEgfQ0KCX0pLmRvbmUoZnVuY3Rpb24oIHJlc3VsdCApIHsNCg0KCQl2YXIgZWxOZXdDb250ZW50cyA9ICRKKCByZXN1bHQgKTsNCg0KCQkkSihfdGhpcy5lbFRhcmdldCkuZW1wdHkoKTsNCgkJJEooX3RoaXMuZWxUYXJnZXQpLmFwcGVuZCggZWxOZXdDb250ZW50cyApOw0KDQoNCgkJX3RoaXMuZWxUYXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgnbG9hZGluZycpOw0KDQoJCSRKKCBlbE5ld0NvbnRlbnRzICkudHJpZ2dlcignbG9hZCcpOw0KDQoJCV90aGlzLkluc3RydW1lbnRMaW5rcyggX3RoaXMuZWxUYXJnZXQgKTsNCgkJaWYoIHN0clBhZ2VUaXRsZSApDQoJCQlkb2N1bWVudC50aXRsZSA9IHN0clBhZ2VUaXRsZTsNCg0KCQkkSignLnRvb2x0aXAnLCBfdGhpcy5lbFRhcmdldCkudl90b29sdGlwKCk7DQoNCgkJd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHsnaHRtbCc6cmVzdWx0LCd0aXRsZSc6c3RyUGFnZVRpdGxlLCAnaWQnOiBfdGhpcy5zdHJTdGF0ZUlEfSwgJycsIHN0clVSTCApOw0KCX0pOw0KDQoJaWYoIGV2ZW50ICkNCgkJZXZlbnQucHJldmVudERlZmF1bHQoKTsNCg0KfTsNCg0KLyoqDQogKiBJbnRlcm5hbCBldmVudCBoYW5kbGVyIGZvciB0aGUgImJhY2siIGJ1dHRvbi4NCiAqIEBwYXJhbSBFdmVudCBldmVudA0KICogQGNvbnN0cnVjdG9yDQogKi8NCkNBamF4U3ViUGFnZUNvbnRyb2xsZXIucHJvdG90eXBlLk9uV2luZG93UG9wU3RhdGUgPSBmdW5jdGlvbiggZXZlbnQgKQ0Kew0KCS8vIFJldmVydCB0byBvdXIgb3JpZ2luYWwgc3RhdGUgaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZSBzdGFjay4NCg0KCWlmKGV2ZW50LnN0YXRlID09IG51bGwpDQoJew0KCQlldmVudC5zdGF0ZSA9IDU7DQoJfQ0KDQoJdmFyIHN0YXRlID0gZXZlbnQuc3RhdGUgfHwgdGhpcy5yZ09yaWdpbmFsRXZlbnQ7DQoNCglpZiggc3RhdGUgJiYgc3RhdGUuaWQgPT0gdGhpcy5zdHJTdGF0ZUlEKQ0KCXsNCgkJdmFyIHN0ckxvY2F0aW9uID0gIHdpbmRvdy5sb2NhdGlvbi5ocmVmLnN1YnN0cmluZyh0aGlzLnN0ckJhc2VVUkwubGVuZ3RoKTsNCgkJdGhpcy5QYWludExpbmtzKCBzdHJMb2NhdGlvbiApOw0KDQoJCXZhciBlbE5ld0NvbnRlbnRzID0gJEooc3RhdGUuaHRtbCk7DQoJCSRKKHRoaXMuZWxUYXJnZXQpLmVtcHR5KCk7DQoJCSRKKHRoaXMuZWxUYXJnZXQpLmFwcGVuZChlbE5ld0NvbnRlbnRzKTsNCgkJaWYoIHN0YXRlLnRpdGxlICkNCgkJCWRvY3VtZW50LnRpdGxlID0gc3RhdGUudGl0bGU7DQoNCgkJJEooIGVsTmV3Q29udGVudHMgKS50cmlnZ2VyKCdsb2FkJyk7DQoJCXRoaXMuSW5zdHJ1bWVudExpbmtzKCBlbE5ld0NvbnRlbnRzICk7DQoJfQ0KfTsNCg0KZnVuY3Rpb24gU2V0dXBBbmltYXRlT25Ib3ZlckltYWdlcygpDQp7DQoJdmFyICRJbWFnZXMgPSAkSiggJ1tkYXRhLWFuaW1hdGUtb24taG92ZXItc3JjXScsIGRvY3VtZW50ICk7DQoJaWYgKCAkSW1hZ2VzLmxlbmd0aCApDQoJew0KCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCAkSW1hZ2VzLmxlbmd0aDsgKytpICkNCgkJew0KCQkJdmFyIGltZyA9ICRKKCAkSW1hZ2VzW2ldICk7DQoJCQlpbWcuZGF0YSggJ3N0YXRpYy1zcmMnLCBpbWcuYXR0ciggJ3NyYycpICk7DQoJCQlpbWcuaG92ZXIoDQoJCQkJZnVuY3Rpb24oKSB7DQoJCQkJCXZhciB0aGlzSW1hZ2UgPSAkSiggdGhpcyApOw0KCQkJCQl0aGlzSW1hZ2UuYXR0ciggJ3NyYycsIHRoaXNJbWFnZS5kYXRhKCAnYW5pbWF0ZS1vbi1ob3Zlci1zcmMnICkgKTsNCgkJCQl9LA0KCQkJCWZ1bmN0aW9uKCkgew0KCQkJCQl2YXIgdGhpc0ltYWdlID0gJEooIHRoaXMgKTsNCgkJCQkJdGhpc0ltYWdlLmF0dHIoICdzcmMnLCB0aGlzSW1hZ2UuZGF0YSggJ3N0YXRpYy1zcmMnICkgKTsNCgkJCQl9DQoJCQkpOw0KCQl9DQoJfQ0KfQ0KDQpmdW5jdGlvbiBCaW5kVG9vbHRpcHMoc2VsZWN0b3IsIHJnT3B0aW9ucykNCnsNCgkvLyBTdGFuZGFyZCB0b29sdGlwcw0KCXZhciAkVGV4dFRvb2x0aXBzID0gJEooICdbZGF0YS10b29sdGlwLXRleHRdJywgc2VsZWN0b3IpOw0KCWlmICggJFRleHRUb29sdGlwcy5sZW5ndGggKQ0KCQkkVGV4dFRvb2x0aXBzLnZfdG9vbHRpcCggeyAndG9vbHRpcENsYXNzJzogcmdPcHRpb25zLnRvb2x0aXBDU1NDbGFzcywgJ2RhdGFOYW1lJzogJ3Rvb2x0aXBUZXh0JywgJ2RlZmF1bHRUeXBlJzogJ3RleHQnLCAncmVwbGFjZUV4aXN0aW5nJzogZmFsc2UsICdyZXNwb25zaXZlTW9kZSc6IHdpbmRvdy5Vc2VTbWFsbFNjcmVlbk1vZGUgJiYgd2luZG93LlVzZVNtYWxsU2NyZWVuTW9kZSgpLCAnYXBwZWFyYW5jZURlbGF5TXMnOiByZ09wdGlvbnMuYXBwZWFyYW5jZURlbGF5TXMgPz8gMCB9ICk7DQoNCgl2YXIgJEhUTUxUb29sdGlwcyA9ICRKKCAnW2RhdGEtdG9vbHRpcC1odG1sXScsIHNlbGVjdG9yKTsNCglpZiAoICRIVE1MVG9vbHRpcHMubGVuZ3RoICkNCgkJJEhUTUxUb29sdGlwcy52X3Rvb2x0aXAoIHsgJ3Rvb2x0aXBDbGFzcyc6IHJnT3B0aW9ucy50b29sdGlwQ1NTQ2xhc3MsICdkYXRhTmFtZSc6ICd0b29sdGlwSHRtbCcsICdkZWZhdWx0VHlwZSc6ICdodG1sJywgJ3JlcGxhY2VFeGlzdGluZyc6IGZhbHNlLCAncmVzcG9uc2l2ZU1vZGUnOiB3aW5kb3cuVXNlU21hbGxTY3JlZW5Nb2RlICYmIHdpbmRvdy5Vc2VTbWFsbFNjcmVlbk1vZGUoKSwgJ2FwcGVhcmFuY2VEZWxheU1zJzogcmdPcHRpb25zLmFwcGVhcmFuY2VEZWxheU1zID8/IDAgfSApOw0KfQ0KDQpmdW5jdGlvbiBTaG93VG9vbHRpcE1lbnVBc1BvcHVwKCB0b29sRGl2ICkNCnsNCgl2YXIgJFBvcHVwID0gJEooIHRvb2xEaXYgKTsNCgkvLyBkZXRhY2ggdGhpcyBlbGVtZW50IGFuZCB3aGVuIHRoZSBkaWFsb2cgY2xvc2VzIHJlLWF0dGFjaCB0byB0aGUgZG9jdW1lbnQgYm9keQ0KCSRQb3B1cC5kZXRhY2goKTsNCgl2YXIgb3JpZ2luYWxQb3B1cFBvc2l0aW9uID0gJFBvcHVwLmNzcyggJ3Bvc2l0aW9uJyApOw0KCSRQb3B1cC5jc3MoICdwb3NpdGlvbicsICdzdGF0aWMnICk7IC8vIGNsZWFyIHBvc3NpYmxlIGFic29sdXRlIHBvc2l0aW9uaW5nDQoJJFBvcHVwLnNob3coKTsNCg0KCXZhciBkaWFsb2cgPSBTaG93RGlhbG9nKCAnJywgJFBvcHVwICkuYWx3YXlzKA0KCQlmdW5jdGlvbigpIHsNCgkJCS8vIHNhdmUgaXQgYXdheSBhZ2FpbiBmb3IgbGF0ZXINCgkJCSRQb3B1cC5oaWRlKCk7DQoJCQkkUG9wdXAuY3NzKCAncG9zaXRpb24nLCBvcmlnaW5hbFBvcHVwUG9zaXRpb24gKTsgLy8gcmVzdG9yZSBwb3NpdGlvbmluZw0KCQkJJEooIGRvY3VtZW50LmJvZHkgKS5hcHBlbmQoICRQb3B1cCApOw0KCQl9DQoJKTsNCglyZXR1cm4gZGlhbG9nOw0KfQ0KDQovKioNCiAqIEJpbmRzIHN0YW5kYXJkIHRvb2x0aXBzIGZvciB0aGUgY3VycmVudCBzaXRlLiBUaGlzIGZ1bmN0aW9uIGFsc28gYmluZHMgYSBtdXRhdGlvbm9ic2VydmVyIHRvIGJpbmQgYW55IGZ1dHVyZSBlbGVtZW50cyB3aXRob3V0IGFkZGl0aW9uYWwgd29yaw0KICogQHBhcmFtIHN0ckNTU0NsYXNzDQogKiBAY29uc3RydWN0b3INCiAqLw0KdmFyIGdfVG9vbHRpcE11dGF0aW9uT2JzZXJ2ZXI7DQp2YXIgZ19iVG9vbHRpcE11dGF0aW9uT2JzZXJ2ZXJEaXNhYmxlZCA9IGZhbHNlOw0KZnVuY3Rpb24gU2V0dXBUb29sdGlwcyggcmdPcHRpb25zICkNCnsNCglmdW5jdGlvbiBJbm5lclNldHVwVG9vbHRpcHMoKSB7DQoNCiAgICAgICAgQmluZFRvb2x0aXBzKGRvY3VtZW50LCByZ09wdGlvbnMpOw0KDQogICAgICAgIGlmIChnX1Rvb2x0aXBNdXRhdGlvbk9ic2VydmVyIHx8IGdfYlRvb2x0aXBNdXRhdGlvbk9ic2VydmVyRGlzYWJsZWQpDQogICAgICAgICAgICByZXR1cm47DQoNCiAgICAgICAgdHJ5DQoJCXsNCiAgICAgICAgICAgIHZhciBjb25maWcgPSB7DQogICAgICAgICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwJLy8gbm90IGNsZWFyIGlmIHdlIGFjdHVhbGx5IHN1cHBvcnQgdGhpcywgYXMgd2Ugb25seSBsb29rIGF0IGFkZGVkTm9kZXMNCiAgICAgICAgICAgICAgICBjaGlsZExpc3Q6IHRydWUsDQogICAgICAgICAgICAgICAgc3VidHJlZTogdHJ1ZSwNCiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFsiZGF0YS10b29sdGlwLWh0bWwiLCAiZGF0YS10b29sdGlwLXRleHQiXQ0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gKG11dGF0aW9uc0xpc3QpDQoJCQl7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRhdGlvbnNMaXN0Lmxlbmd0aDsgaSsrKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG11dGF0aW9uID0gbXV0YXRpb25zTGlzdFtpXTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uLmFkZGVkTm9kZXMgJiYgbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGgpDQogICAgICAgICAgICAgICAgICAgICAgICBCaW5kVG9vbHRpcHMobXV0YXRpb24uYWRkZWROb2RlcywgcmdPcHRpb25zKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICAvLyBDcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgbGlua2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbg0KICAgICAgICAgICAgZ19Ub29sdGlwTXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTsNCg0KICAgICAgICAgICAgLy8gU3RhcnQgb2JzZXJ2aW5nIHRoZSB0YXJnZXQgbm9kZSBmb3IgY29uZmlndXJlZCBtdXRhdGlvbnMNCiAgICAgICAgICAgIGdfVG9vbHRpcE11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudCwgY29uZmlnKTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaCAoZSkNCgkJew0KICAgICAgICAgICAgLy8gU3dhbGxvdyBleGNlcHRpb25zIGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgbXV0YXRpb25vYnNlcnZlcnMNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIElubmVyU2V0dXBUb29sdGlwcygpOw0KICAgICRKKCB3aW5kb3cgKS5vbiggJ1Jlc3BvbnNpdmVfU21hbGxTY3JlZW5Nb2RlVG9nZ2xlZCcsIElubmVyU2V0dXBUb29sdGlwcyApOw0KfQ0KDQovLyBmb3IgcGVyZiBzZW5zaXRpdmUgcGFnZXMNCmZ1bmN0aW9uIERpc2FibGVUb29sdGlwTXV0YXRpb25PYnNlcnZlcigpDQp7DQoJZ19iVG9vbHRpcE11dGF0aW9uT2JzZXJ2ZXJEaXNhYmxlZCA9IHRydWU7DQoNCglpZiAoIGdfVG9vbHRpcE11dGF0aW9uT2JzZXJ2ZXIgKQ0KCXsNCgkJZ19Ub29sdGlwTXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7DQoJCWdfVG9vbHRpcE11dGF0aW9uT2JzZXJ2ZXIgPSBudWxsOw0KCX0NCn0NCg0KZnVuY3Rpb24gVmlld1RpdGxlc1dpdGhEZXNjcmlwdG9ycyggZGVzY2lkICkNCnsNCgl2YXIgd2FpdERpYWxvZyA9IFNob3dCbG9ja2luZ1dhaXREaWFsb2coICdFeGFtcGxlIFByb2R1Y3RzJywgJ1BsZWFzZSB3YWl0IHdoaWxlIHdlIGZpbmQgc29tZSBleGFtcGxlIHByb2R1Y3RzLi4uJyApOw0KDQoJJEouZ2V0KCAnaHR0cHM6Ly9zdG9yZS5zdGVhbXBvd2VyZWQuY29tL3NlYXJjaC9yZXN1bHRzLycsDQoJCXsNCgkJCSdmaWx0ZXInIDogJ2V4YW1wbGVzZm9yY29udGVudGRlc2NyaXB0b3JzJywNCgkJCSdpZ25vcmVfcHJlZmVyZW5jZXMnIDogMSwNCgkJCSdjYXRlZ29yeTEnIDogJzk5Miw5OTQsOTk4JywgCQkJJ2Rlc2NpZHNbXScgOiBkZXNjaWQsDQoJCQknanNvbicgOiAxLA0KCQl9DQoJKS5kb25lKCBmdW5jdGlvbiggcmVzcG9uc2UgKSB7DQoJCXdhaXREaWFsb2cuRGlzbWlzcygpOw0KDQoJCXZhciBjb250ZW50ID0gJEooICI8ZGl2PiIgKTsNCgkJY29udGVudC5hcHBlbmQoICRKKCAiPGRpdj4iLCB7IGNsYXNzOiAnY29udGVudF9kZXNjcmlwdG9yc19leGFtcGxlc19kZXNjJywgdGV4dDogcmVzcG9uc2UuZGVzYyB9ICkgKTsNCg0KCQlpZiAoIHJlc3BvbnNlLml0ZW1zLmxlbmd0aCAhPSAwICkNCgkJew0KCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgcmVzcG9uc2UuaXRlbXMubGVuZ3RoICYmIGkgPCAxMDsgKytpICkNCgkJCXsNCgkJCQl2YXIgaXRlbSA9IHJlc3BvbnNlLml0ZW1zW2ldOw0KCQkJCXZhciBlbGVtID0gJEooICI8ZGl2PiIsIHsgY2xhc3M6ICdjb250ZW50X2Rlc2NyaXB0b3JzX2V4YW1wbGVfYXBwJyB9ICk7DQoJCQkJZWxlbS5hcHBlbmQoICRKKCAiPGltZz4iLCB7ICBjbGFzczogJ2FwcF9sb2dvJywgc3JjOiBpdGVtLmxvZ28gfSApICk7DQoJCQkJZWxlbS5hcHBlbmQoICRKKCAiPGRpdj4iLCB7IGNsYXNzOiAnYXBwX25hbWUnLCB0ZXh0OiBpdGVtLm5hbWUgfSApICk7DQoJCQkJY29udGVudC5hcHBlbmQoIGVsZW0gKTsNCgkJCX0NCgkJfQ0KCQllbHNlDQoJCXsNCgkJCWNvbnRlbnQuYXBwZW5kKCAkSiggIjxkaXY+IiwgeyBjbGFzczogIm5vX2l0ZW1zIiwgdGV4dDogJ05vIFByb2R1Y3RzIEZvdW5kJyB9ICkgKTsNCgkJfQ0KDQoJCXZhciBkaWFsb2cgPSBTaG93QWxlcnREaWFsb2coICdFeGFtcGxlIFByb2R1Y3RzJywgY29udGVudCApOw0KCX0gKTsNCn0NCg0KDQoNCi8vIEVsZW1lbnQgYXBwZWFyYW5jZSBtb250aW9yLiBEZXNpZ25lZCB0byByZXBsYWNlIGpRdWVyeS5hcHBlYXINCg0KdmFyIENBcHBlYXJNb25pdG9yID0gZnVuY3Rpb24oIGZuT25BcHBlYXIsIGJDaGVja0FueUludGVyc2VjdGlvbiApew0KCXRoaXMucmdNb25pdG9yZWRFbGVtZW50cyA9IFtdOw0KCXRoaXMuYlJ1bm5pbmcgPSBmYWxzZTsNCgl0aGlzLnVuVGltZXJGcmVxdWVuY3kgPSA1MDA7DQoJdGhpcy5iUmVnaXN0ZXJlZFdpbmRvd0V2ZW50ID0gZmFsc2U7DQoJdGhpcy5mbk9uQXBwZWFyID0gZm5PbkFwcGVhcjsNCgl0aGlzLmJDaGVja0FueUludGVyc2VjdGlvbiA9IGJDaGVja0FueUludGVyc2VjdGlvbiB8fCBmYWxzZTsNCn07DQoNCkNBcHBlYXJNb25pdG9yLnByb3RvdHlwZS5SZWdpc3RlclNjcm9sbEV2ZW50ID0gZnVuY3Rpb24oIGVsVGFyZ2V0ICkNCnsNCgl2YXIgaW5zdGFuY2UgPSB0aGlzOw0KDQoJZWxUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lciggJ3Njcm9sbCcsICgpID0+IHsNCgkJaWYoIGluc3RhbmNlLmJSdW5uaW5nIHx8IGluc3RhbmNlLnJnTW9uaXRvcmVkRWxlbWVudHMubGVuZ3RoID09PSAwICkNCgkJCXJldHVybjsNCg0KCQlpbnN0YW5jZS5iUnVubmluZyA9IHRydWU7DQoJCXNldFRpbWVvdXQoIGluc3RhbmNlLkNoZWNrVmlzaWJpbGl0eUludGVybmFsLmJpbmQoaW5zdGFuY2UpLCBpbnN0YW5jZS51blRpbWVyRnJlcXVlbmN5ICk7DQoJfSwgeyBwYXNzaXZlOiB0cnVlIH0gKTsNCn0NCg0KQ0FwcGVhck1vbml0b3IucHJvdG90eXBlLkNoZWNrVmlzaWJpbGl0eSA9IGZ1bmN0aW9uKCkNCnsNCgkvLyB3aGVuIGl0ZW1zIGFyZSBhZGRlZCB0aGV5IHdpbGwgc2NoZWR1bGUgYW4gaW1tZWRpYXRlIGNoZWNrLiAgRGVsYXkgZm9yIGEgYml0DQoJaWYgKCB0aGlzLm1faUNoZWNrVmlzaWJpbGl0eVJlcXVlc3RJbnRlcnZhbCApDQoJew0KCQl3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aGlzLm1faUNoZWNrVmlzaWJpbGl0eVJlcXVlc3RJbnRlcnZhbCApOw0KCX0NCg0KCXRoaXMubV9pQ2hlY2tWaXNpYmlsaXR5UmVxdWVzdEludGVydmFsID0gc2V0VGltZW91dCggdGhpcy5DaGVja1Zpc2liaWxpdHlJbnRlcm5hbC5iaW5kKHRoaXMpLCB0aGlzLnVuVGltZXJGcmVxdWVuY3kgKTsNCn07DQoNCkNBcHBlYXJNb25pdG9yLnByb3RvdHlwZS5DaGVja1Zpc2liaWxpdHlJbnRlcm5hbCA9IGZ1bmN0aW9uKCkNCnsNCgkvLyBXYWxrIGJhY2t3YXJkcyBzbyB3ZSBjYW4gc2xpY2Ugd2hpbGUgd2UgaXRlcmF0ZQ0KCWZvciggdmFyIGk9dGhpcy5yZ01vbml0b3JlZEVsZW1lbnRzLmxlbmd0aC0xOyBpPj0wOyBpLS0pDQoJew0KCQl2YXIgcmdNb25pdG9yZWQgPSB0aGlzLnJnTW9uaXRvcmVkRWxlbWVudHNbaV07DQoJCWlmKCB0aGlzLmJJc0VsZW1lbnRWaXNpYmxlKCByZ01vbml0b3JlZC5lbGVtZW50ICkgKQ0KCQl7DQoJCQl0aGlzLnJnTW9uaXRvcmVkRWxlbWVudHMuc3BsaWNlKGksMSk7DQoJCQl0aGlzLmZuT25BcHBlYXIoIHJnTW9uaXRvcmVkLmVsZW1lbnQgKTsNCgkJfSBlbHNlIGlmKCAhZG9jdW1lbnQuYm9keS5jb250YWlucyggcmdNb25pdG9yZWQuZWxlbWVudCApICkNCgkJew0KCQkJdGhpcy5yZ01vbml0b3JlZEVsZW1lbnRzLnNwbGljZShpLDEpOw0KCQl9DQoJfQ0KDQoJdGhpcy5iUnVubmluZyA9IGZhbHNlOw0KCXRoaXMubV9pQ2hlY2tWaXNpYmlsaXR5UmVxdWVzdEludGVydmFsID0gdW5kZWZpbmVkOw0KfTsNCg0KQ0FwcGVhck1vbml0b3IucHJvdG90eXBlLmJJc0VsZW1lbnRWaXNpYmxlID0gZnVuY3Rpb24oIGVsRWxlbWVudCApDQp7DQoJaWYoICFlbEVsZW1lbnQgKQ0KCQlyZXR1cm47DQoNCgkvLyBDaGVjayBwaHlzaWNhbCBwb3NpdGlvbiB2cyB2aWV3cG9ydC4gVGhpcyBpcyBsaWtlbHkgdGhlIGZhc3Rlc3QgZWFybHktb3V0Lg0KCXZhciByZWN0RWxlbWVudCA9IGVsRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsNCg0KCWlmICggdGhpcy5iQ2hlY2tBbnlJbnRlcnNlY3Rpb24gKQ0KCXsNCgkJaWYgKCByZWN0RWxlbWVudC5sZWZ0ID4gd2luZG93LmlubmVyV2lkdGggfHwgcmVjdEVsZW1lbnQucmlnaHQgPCAwICkNCgkJCXJldHVybiBmYWxzZTsNCg0KCQlpZiAoIHJlY3RFbGVtZW50LnRvcCA+IHdpbmRvdy5pbm5lckhlaWdodCB8fCByZWN0RWxlbWVudC5ib3R0b20gPCAwICkNCgkJCXJldHVybiBmYWxzZTsNCgl9DQoJZWxzZQ0KCXsNCgkJaWYgKCAhKCByZWN0RWxlbWVudC50b3AgPj0gMCAmJiByZWN0RWxlbWVudC5sZWZ0ID49IDANCgkJCQkmJiByZWN0RWxlbWVudC5ib3R0b20gPD0gd2luZG93LmlubmVySGVpZ2h0ICYmIHJlY3RFbGVtZW50LnJpZ2h0IDw9IHdpbmRvdy5pbm5lcldpZHRoICkgKQ0KCQkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCS8vIEFzayBqUXVlcnkgdG8gY29tcHV0ZSB2aXNpYmlsaXR5LCBzaW5jZSBpdCBrbm93cyBhbGwgdGhlIGVkZ2UgY2FzZXMuDQoJaWYoICEkSihlbEVsZW1lbnQpLmlzKCc6dmlzaWJsZScpKQ0KCQlyZXR1cm4gZmFsc2U7DQoNCglyZXR1cm4gdHJ1ZTsNCg0KfTsNCg0KQ0FwcGVhck1vbml0b3IucHJvdG90eXBlLlJlZ2lzdGVyRWxlbWVudCA9IGZ1bmN0aW9uKCBlbFRhcmdldCApDQp7DQoJaWYoICRKKGVsVGFyZ2V0KS5kYXRhKCdtYW51YWwtdHJhY2tpbmcnICkgKQ0KCQlyZXR1cm47DQoNCgl0aGlzLnJnTW9uaXRvcmVkRWxlbWVudHMucHVzaCh7DQoJCWVsZW1lbnQ6IGVsVGFyZ2V0DQoJfSk7DQoNCgkvLyBSZWdpc3RlciB0aGUgd2luZG93IHNjcm9sbCBldmVudCBPTkxZIGFmdGVyIHdlIGhhdmUgc29tZXRoaW5nIHRvIG1vbml0b3INCglpZiggIXRoaXMuYlJlZ2lzdGVyZWRXaW5kb3dFdmVudCApDQoJew0KCQl0aGlzLlJlZ2lzdGVyU2Nyb2xsRXZlbnQoIHdpbmRvdyApOw0KCQl0aGlzLmJSZWdpc3RlcmVkV2luZG93RXZlbnQgPSB0cnVlOw0KCX0NCn07DQoNCkNBcHBlYXJNb25pdG9yLnByb3RvdHlwZS5UcmFja0FwcGVhcmFuY2VJZlZpc2libGUgPSBmdW5jdGlvbiggZWxUYXJnZXQgKQ0Kew0KCXZhciBfdGhpcyA9IHRoaXM7DQoJd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgew0KCQkvLyBFbnN1cmUgd2UncmUgYWN0dWFsbHkgaW4gdGhlIHZpZXdwb3J0IChDYXJvdXNlbCBtYXkgYmUgc2Nyb2xsaW5nIG91dCBvZiB2aWV3IGFuZCBjYWxsaW5nIHRoaXMpDQoJCS8vIHRoaXMgdHJpZ2dlcnMgbGF5b3V0LCBzbyB3ZSBkZWxheSB0aGlzIGNoZWNrIGEgbGl0dGxlIGJpdCB0byBnaXZlIHRoZSBwYWdlIHRpbWUgdG8gc2V0dGxlIHdoYXRldmVyDQoJCS8vIGNoYW5nZSBtYXkgY3VycmVudGx5IGJlIGluLWZsaWdodA0KCQlpZiggIV90aGlzLmJJc0VsZW1lbnRWaXNpYmxlKCBlbFRhcmdldCApICkNCgkJCXJldHVybjsNCg0KCQlfdGhpcy5UcmFja0FwcGVhcmFuY2UoIGVsVGFyZ2V0ICk7DQoJfSwgMTApOw0KfTsNCg0KQ0FwcGVhck1vbml0b3IucHJvdG90eXBlLlRyYWNrQXBwZWFyYW5jZSA9IGZ1bmN0aW9uKCBlbFRhcmdldCApDQp7DQoJLy8gRmluZCBvdXIgZWxlbWVudCwgc3BsaWNlIGl0IG91dCBpZiB3ZSB3ZXJlIHRyYWNraW5nIGl0DQoJZm9yKCB2YXIgaT10aGlzLnJnTW9uaXRvcmVkRWxlbWVudHMubGVuZ3RoLTE7IGk+PTA7IGktLSkNCgl7DQoJCXZhciByZ01vbml0b3JlZCA9IHRoaXMucmdNb25pdG9yZWRFbGVtZW50c1tpXTsNCgkJaWYoICByZ01vbml0b3JlZC5lbGVtZW50ID09PSBlbFRhcmdldCApDQoJCXsNCgkJCXRoaXMucmdNb25pdG9yZWRFbGVtZW50cy5zcGxpY2UoaSwxKTsNCgkJfQ0KCX0NCgkvLyBUcmlnZ2VyIGl0LCBldmVuIGlmIHdlIHdlcmVuJ3QgYWN0dWFsbHkgdHJhY2tpbmcgaXQNCgl0aGlzLmZuT25BcHBlYXIoIGVsVGFyZ2V0ICk7DQp9Ow0KDQpDQXBwZWFyTW9uaXRvci5wcm90b3R5cGUuQ2xlYXJFbGVtZW50cyA9IGZ1bmN0aW9uKCkNCnsNCgl0aGlzLnJnTW9uaXRvcmVkRWxlbWVudHMgPSBbXTsNCn0NCg0KLy8gZ2FtZXBhZCBuYXZpZ2F0aW9uIHdyYXBwZXJzLCB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZXNlIGFyZSBzdG9yZWQgaW4gbGVnYWN5X3dlYi4NCi8vIG9uY2UgbGVnYWN5IHdlYiBpbml0aWFsaXplcywgdGhlc2UgZnVuY3Rpb25zIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHJlYWwgdGhpbmcuICBJbiB0aGUgbWVhbiB0aW1lLA0KLy8gd2Ugd2lsbCBxdWV1ZSBhbnkgY29tbWFuZHMgYW5kIHNlbmQgdGhlbSB3aGVuIHJlYWR5Lg0KdmFyIGdfcmdRdWV1ZWRHYW1lcGFkQ29tbWFuZHMgPSBbXTsNCnZhciBnX3JnT25SZWFkeUNhbGxiYWNrcyA9IFtdOw0KdmFyIGdfYkdhbWVwYWROYXZSZWFkeSA9IGZhbHNlOw0KZnVuY3Rpb24gUnVuV2hlbkdhbWVwYWROYXZSZWFkeSggY2FsbGJhY2sgKQ0Kew0KCWlmICggZ19iR2FtZXBhZE5hdlJlYWR5ICkNCgkJY2FsbGJhY2soKTsNCgllbHNlDQoJCWdfcmdPblJlYWR5Q2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrICk7DQp9DQp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3ZncF9nYW1lcGFkbmF2cmVhZHknLCBmdW5jdGlvbigpIHsNCgkJZ19yZ1F1ZXVlZEdhbWVwYWRDb21tYW5kcy5mb3JFYWNoKCBmdW5jdGlvbiggY29tbWFuZCApIHsgd2luZG93W2NvbW1hbmQubmFtZV0uYXBwbHkoIHdpbmRvdywgY29tbWFuZC5hcmdzICk7IH0gKTsNCglnX3JnUXVldWVkR2FtZXBhZENvbW1hbmRzID0gW107DQoNCglnX3JnT25SZWFkeUNhbGxiYWNrcy5mb3JFYWNoKCBmdW5jdGlvbiggZm4gKSB7IGZuKCk7IH0gKTsNCglnX3JnT25SZWFkeUNhbGxiYWNrcyA9IFtdOw0KfSk7DQoNCmZ1bmN0aW9uIEluc3RydW1lbnRGb2N1c0VsZW1lbnRzKCBlbGVtZW50ICkNCnsNCglnX3JnUXVldWVkR2FtZXBhZENvbW1hbmRzLnB1c2goIHsgbmFtZTogJ0luc3RydW1lbnRGb2N1c0VsZW1lbnRzJywgYXJnczogYXJndW1lbnRzIH0gKTsNCn0NCmZ1bmN0aW9uIEZvcmNlVXBkYXRlRm9jdXNFbGVtZW50cyggZWxlbWVudCApDQp7DQoJZ19yZ1F1ZXVlZEdhbWVwYWRDb21tYW5kcy5wdXNoKCB7IG5hbWU6ICdGb3JjZVVwZGF0ZUZvY3VzRWxlbWVudHMnLCBhcmdzOiBhcmd1bWVudHMgfSApOw0KfQ0KZnVuY3Rpb24gR1BOYXZGb2N1c0NoaWxkKCBlbGVtZW50ICkNCnsNCglnX3JnUXVldWVkR2FtZXBhZENvbW1hbmRzLnB1c2goIHsgbmFtZTogJ0dQTmF2Rm9jdXNDaGlsZCcsIGFyZ3M6IGFyZ3VtZW50cyB9ICk7DQp9DQpmdW5jdGlvbiBHUE9uU2hvd2luZ01vZGFsV2luZG93KCBlbGVtZW50ICkNCnsNCglnX3JnUXVldWVkR2FtZXBhZENvbW1hbmRzLnB1c2goIHsgbmFtZTogJ0dQT25TaG93aW5nTW9kYWxXaW5kb3cnLCBhcmdzOiBhcmd1bWVudHMgfSApOw0KfQ0KZnVuY3Rpb24gR1BTaG93VmlydHVhbEtleWJvYXJkKCBiU2hvd0tleWJvYXJkICkNCnsNCglnX3JnUXVldWVkR2FtZXBhZENvbW1hbmRzLnB1c2goIHsgbmFtZTogJ0dQU2hvd1ZpcnR1YWxLZXlib2FyZCcsIGFyZ3M6IGFyZ3VtZW50cyB9ICk7DQp9DQpmdW5jdGlvbiBHUE5hdlVwZGF0ZUFjdGlvbkRlc2NyaXB0aW9ucyggZWxlbWVudCwgYWN0aW9uRGVzY3JpcHRpb25zICkNCnsNCglnX3JnUXVldWVkR2FtZXBhZENvbW1hbmRzLnB1c2goIHsgbmFtZTogJ0dQTmF2VXBkYXRlQWN0aW9uRGVzY3JpcHRpb25zJywgYXJnczogYXJndW1lbnRzIH0gKTsNCn0NCg0KdmFyIFNldEdQRm9jdXNSZXN0b3JlVGltZW91dCA9IGZ1bmN0aW9uKCl7fTsgLy8gbm8gb3AgdW5sZXNzIEluaXRpYWxpemVHUEZvY3VzUmVzdG9yZVRpbWVvdXQgaXMgY2FsbGVkDQpmdW5jdGlvbiBJbml0aWFsaXplR1BGb2N1c1Jlc3RvcmVUaW1lb3V0KCBiVXNlV2luZG93T25sb2FkID0gdHJ1ZSApDQp7DQoJdmFyIG5HUEZvY3VzUmVzdG9yZVRpbWVvdXRJRDsNCglTZXRHUEZvY3VzUmVzdG9yZVRpbWVvdXQgPSBmdW5jdGlvbiggZGVsYXkgPSAyMDAgKQ0KCXsNCgkJaWYgKCBuR1BGb2N1c1Jlc3RvcmVUaW1lb3V0SUQgKQ0KCQkJd2luZG93LmNsZWFyVGltZW91dCggbkdQRm9jdXNSZXN0b3JlVGltZW91dElEICk7DQoNCgkJdGhpcy5uR1BGb2N1c1Jlc3RvcmVUaW1lb3V0SUQgPSB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKXsNCgkJCVNldEdQRm9jdXNSZXN0b3JlVGltZW91dCA9IGZ1bmN0aW9uKCl7fTsJLy8gb25seSBmaXJlIG9uY2UNCgkJCXdpbmRvdy5fX2JGb2N1c1Jlc3RvcmVSZWFkeSA9IHRydWU7DQoJCQl3aW5kb3cucG9zdE1lc3NhZ2UoICdGb2N1c1Jlc3RvcmVSZWFkeScgKTsNCgkJfSwgZGVsYXkgKTsNCgl9DQoNCgkvLyB0aGlzIHdhaXRzIGZvciBhbGwgaW1hZ2VzIG9uIHRoZSBwYWdlIHRvIGZpbmlzaCBkb3dubG9hZGluZw0KCWlmICggYlVzZVdpbmRvd09ubG9hZCApDQoJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAibG9hZCIsIGZ1bmN0aW9uKCl7IFNldEdQRm9jdXNSZXN0b3JlVGltZW91dCgpOyB9ICk7DQp9DQoNCmZ1bmN0aW9uIEhhbmRsZU92ZXJsYXlXaW5kb3dQaW5uZWRWaWV3KCBiUGlubmVkLCBiU2hvd1Bpbm5lZFZpZXcgKQ0Kew0KCSRKKCAnYm9keScgKS50b2dnbGVDbGFzcyggJ092ZXJsYXlXaW5kb3dQaW5uZWQnLCBiUGlubmVkICk7DQoJJEooICdib2R5JyApLnRvZ2dsZUNsYXNzKCAnT3ZlcmxheVdpbmRvd1Bpbm5lZFZpZXcnLCBiU2hvd1Bpbm5lZFZpZXcgKTsNCn0NCg0KdmFyIGdfb1JlYWN0TmF0aXZlU2V0SGVhZGVyOw0KZnVuY3Rpb24gSW5pdFJlYWN0TmF0aXZlU2V0SGVhZGVyRGF0YSggcmdJbml0aWFsUmVhY3ROYXRpdmVIZWFkZXJEYXRhLCBmblBvc3REYXRhICkNCnsNCglnX29SZWFjdE5hdGl2ZVNldEhlYWRlciA9IHsNCgkJcmdEYXRhOiByZ0luaXRpYWxSZWFjdE5hdGl2ZUhlYWRlckRhdGEsDQoJCWZuUG9zdERhdGE6IGZuUG9zdERhdGENCgl9Ow0KCVVwZGF0ZVJlYWN0TmF0aXZlQ2xpZW50SGVhZGVyRGF0YSgpOw0KfQ0KDQpmdW5jdGlvbiBTZXRSZWFjdE5hdGl2ZUhlYWRlckNhcnRJdGVtQ291bnQoIG5DYXJ0SXRlbUNvdW50ICkNCnsNCglpZiAoICFnX29SZWFjdE5hdGl2ZVNldEhlYWRlciApDQoJCXJldHVybjsJLy8gbm90IGluIHJlYWN0IG5hdGl2ZSBjbGllbnQNCg0KCQlpZiAoIG5DYXJ0SXRlbUNvdW50ID09IGdfb1JlYWN0TmF0aXZlU2V0SGVhZGVyLnJnRGF0YVsnY2FydF9pdGVtX2NvdW50J10gKQ0KCQlyZXR1cm47DQoNCglpZiAoIG5DYXJ0SXRlbUNvdW50ICkNCgkJZ19vUmVhY3ROYXRpdmVTZXRIZWFkZXIucmdEYXRhWydjYXJ0X2l0ZW1fY291bnQnXSA9IG5DYXJ0SXRlbUNvdW50Ow0KCWVsc2UNCgkJZGVsZXRlIGdfb1JlYWN0TmF0aXZlU2V0SGVhZGVyLnJnRGF0YVsnY2FydF9pdGVtX2NvdW50J107DQoNCglVcGRhdGVSZWFjdE5hdGl2ZUNsaWVudEhlYWRlckRhdGEoKTsNCn0NCg0KZnVuY3Rpb24gVXBkYXRlUmVhY3ROYXRpdmVDbGllbnRIZWFkZXJEYXRhKCkNCnsNCglpZiAoIGdfb1JlYWN0TmF0aXZlU2V0SGVhZGVyICkNCgl7DQoJCWdfb1JlYWN0TmF0aXZlU2V0SGVhZGVyLmZuUG9zdERhdGEoIGdfb1JlYWN0TmF0aXZlU2V0SGVhZGVyLnJnRGF0YSApOw0KCX0NCn0NCg0KDQpmdW5jdGlvbiBJbml0QXV0b0NvbGxhcHNlUmVhZE1vcmUoIGVsVGFyZ2V0cyApDQp7DQoJJEooIGVsVGFyZ2V0cyApLmVhY2goIGZ1bmN0aW9uKCkgew0KCQl2YXIgY29udGVudCA9IHRoaXM7DQoJCXZhciAkQ29udGVudCA9ICRKKGNvbnRlbnQpOw0KCQkkQ29udGVudC53cmFwKCAkSignPGRpdi8+JywgeydjbGFzcyc6ICdzaGFyZWRfYXV0b2NvbGxhcHNlX2N0bicgfSApICk7DQoNCgkJdmFyICRDb250YWluZXIgPSAkQ29udGVudC5wYXJlbnQoKTsNCg0KCQl2YXIgJFJlYWRNb3JlID0gJEooJzxkaXYvPicsIHsnY2xhc3MnOiAnc2hhcmVkX2F1dG9jb2xsYXBzZV9yZWFkbW9yZScgfSkudGV4dCggJ1JFQUQgTU9SRScgKTsNCgkJdmFyICRGYWRlID0gJEooJzxkaXYvPicsIHsnY2xhc3MnOiAnc2hhcmVkX2F1dG9jb2xsYXBzZV9mYWRlJyB9ICkuYXBwZW5kKCAkUmVhZE1vcmUgKTsNCgkJJENvbnRhaW5lci5hcHBlbmQoICRGYWRlICk7DQoNCgkJdmFyIG5JbnRlcnZhbCA9IDA7DQoJCXZhciBuTWF4SGVpZ2h0ID0gcGFyc2VJbnQoICRDb250ZW50LmNzcygnbWF4LWhlaWdodCcpICk7DQoJCXZhciBiTWF4SGVpZ2h0U2V0ID0gdHJ1ZTsNCg0KCQkkQ29udGVudC5vbiggJ3NoYXJlZF9hdXRvY29sbGFwc2VfZXhwYW5kJywgZnVuY3Rpb24oKSB7DQoJCQlpZiAoICRDb250YWluZXIuaGFzQ2xhc3MoICdjb2xsYXBzZWQnICkgKQ0KCQkJew0KCQkJCSRDb250YWluZXIucmVtb3ZlQ2xhc3MoICdjb2xsYXBzZWQnICk7DQoJCQkJJENvbnRhaW5lci5hZGRDbGFzcyggJ2V4cGFuZGVkJyApOw0KDQoJCQkJaWYgKCBiTWF4SGVpZ2h0U2V0ICkNCgkJCQl7DQoJCQkJCSRDb250ZW50LmFuaW1hdGUoIHsnbWF4LWhlaWdodCc6IGNvbnRlbnQuc2Nyb2xsSGVpZ2h0ICsgMjAgKyAncHgnfSwgJ2Zhc3QnLCBudWxsLCBmdW5jdGlvbigpIHsgJENvbnRlbnQuY3NzKCdtYXgtaGVpZ2h0JywgJ25vbmUnICk7IH0gKTsNCgkJCQl9DQoJCQkJd2luZG93LmNsZWFySW50ZXJ2YWwoIG5JbnRlcnZhbCApOw0KCQkJfQ0KCQl9KTsNCg0KCQkkUmVhZE1vcmUuY2xpY2soIGZ1bmN0aW9uKCkgeyAkQ29udGVudC50cmlnZ2VyKCdzaGFyZWRfYXV0b2NvbGxhcHNlX2V4cGFuZCcpOyB9ICk7DQoNCgkJdmFyIGZuQ2hlY2tIZWlnaHQgPSBmdW5jdGlvbiAoKQl7DQoJCQlpZiAoIGNvbnRlbnQuc2Nyb2xsSGVpZ2h0ID4gbk1heEhlaWdodCArIDMwICkNCgkJCXsNCgkJCQkkQ29udGVudC5jc3MoICdtYXgtaGVpZ2h0Jywgbk1heEhlaWdodCArICdweCcgKTsNCgkJCQkkQ29udGFpbmVyLmFkZENsYXNzKCAnY29sbGFwc2VkJyApOw0KCQkJCXdpbmRvdy5jbGVhckludGVydmFsKCBuSW50ZXJ2YWwgKTsNCgkJCQliTWF4SGVpZ2h0U2V0ID0gdHJ1ZTsNCgkJCX0NCgkJCWVsc2UgaWYgKCBiTWF4SGVpZ2h0U2V0ICkNCgkJCXsNCgkJCQkkQ29udGVudC5jc3MoICdtYXgtaGVpZ2h0JywgJ25vbmUnICk7DQoJCQkJYk1heEhlaWdodFNldCA9IGZhbHNlOw0KCQkJfQ0KCQl9Ow0KDQoJCW5JbnRlcnZhbCA9IHdpbmRvdy5zZXRJbnRlcnZhbCggZm5DaGVja0hlaWdodCwgMjUwICk7DQoJCWZuQ2hlY2tIZWlnaHQoKTsNCgl9KTsNCn0NCg0KDQpsZXQgZ19iVXNlTmF2aWdhdGlvbkFQSSA9ICEhKCB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5uYXZpZ2F0aW9uICk7DQpsZXQgZ19iQm91bmROYXZFdmVudCA9IGZhbHNlOw0KDQpmdW5jdGlvbiBCaW5kTmF2RXZlbnQoKQ0Kew0KCWlmICggIWdfYkJvdW5kTmF2RXZlbnQgKQ0KCXsNCgkJd2luZG93Lm5hdmlnYXRpb24uYWRkRXZlbnRMaXN0ZW5lcignbmF2aWdhdGUnLCBmdW5jdGlvbiAoZSkNCgkJew0KCQkJaWYgKCBlLmluZm8gPT0gJ2xvY2FsJyApDQoJCQl7DQoJCQkJZS5pbnRlcmNlcHQoew0KCQkJCQlhc3luYyBoYW5kbGVyKCkgew0KCQkJCQkJCQkJCQl9LA0KCQkJCX0pOw0KCQkJfQ0KCQl9KTsNCgkJZ19iQm91bmROYXZFdmVudCA9IHRydWU7DQoJfQ0KfQ0KDQovKioNCiAqIFVwZGF0ZSBoaXN0b3J5IHN0YXRlLCBlaXRoZXIgdGhlIGJyb3dzZXIgaGlzdG9yeSBBUEkgb3IgbmF2aWdhdGlvbiBBUEksIHdoaWNoZXZlciB3ZSBhcmUgdXNpbmcuDQogKiBAcGFyYW0gZm5VcGRhdGVyIGFuZCB1cGRhdGVyIHRoYXQgd2lsbCByZWNlaXZlIGN1cnJlbnQgc3RhdGUgYW5kIHNob3VsZCByZXR1cm4gbmV3IHN0YXRlLCBlZyBgKCBzdGF0ZSApID0+ICggeyAuLi5zdGF0ZSwgLi4ueW91clN0YXRlIH0gKWANCiAqLw0KZnVuY3Rpb24gUmVwbGFjZUhpc3RvcnlTdGF0ZSggZm5VcGRhdGVyIC8qIDogKCBzdGF0ZTogVCApID0+IFQgKi8gKQ0Kew0KCWNvbnN0IG5ld1N0YXRlID0gZm5VcGRhdGVyKCBHZXRIaXN0b3J5U3RhdGUoKSApOw0KCWlmICggZ19iVXNlTmF2aWdhdGlvbkFQSSApDQoJew0KCQl3aW5kb3cubmF2aWdhdGlvbi51cGRhdGVDdXJyZW50RW50cnkoIHsgc3RhdGU6IG5ld1N0YXRlIH0gKTsNCgl9DQoJZWxzZQ0KCXsNCgkJaGlzdG9yeS5yZXBsYWNlU3RhdGUoIG5ld1N0YXRlLCAnJyApOw0KCX0NCn0NCg0KDQovKioNCiAqIFJlcGxhY2UgdGhlIGN1cnJlbnQgYnJvd3NlciBVUkwsIG5hdmlnYXRpb24gQVBJLWF3YXJlDQogKi8NCmZ1bmN0aW9uIFJlcGxhY2VIaXN0b3J5VVJMKCB1cmwgLyo6IHN0cmluZyB8IFVSTCAqLyApDQp7DQoJbGV0IHN0clVSTCA9IHR5cGVvZiB1cmwgPT0gInN0cmluZyIgPyB1cmwgOiB1cmwudG9TdHJpbmcoKTsNCglpZiAoIGdfYlVzZU5hdmlnYXRpb25BUEkgKQ0KCXsNCgkJaWYgKCB3aW5kb3cubmF2aWdhdGlvbi5jdXJyZW50RW50cnkudXJsICE9IHN0clVSTCApDQoJCXsNCgkJCUJpbmROYXZFdmVudCgpOw0KCQkJd2luZG93Lm5hdmlnYXRpb24ubmF2aWdhdGUoIHN0clVSTCwgeyBzdGF0ZTogd2luZG93Lm5hdmlnYXRpb24uY3VycmVudEVudHJ5LmdldFN0YXRlKCksIGhpc3Rvcnk6ICJyZXBsYWNlIiwgaW5mbzogImxvY2FsIiB9ICk7DQoJCX0NCgl9DQoJZWxzZQ0KCXsNCgkJaWYgKCB3aW5kb3cubG9jYXRpb24uaHJlZiAhPSBzdHJVUkwgKQ0KCQkJaGlzdG9yeS5yZXBsYWNlU3RhdGUoIGhpc3Rvcnkuc3RhdGUsICcnLCBzdHJVUkwgKTsNCgl9DQp9DQoNCg0KLyoqDQogKiBSZXBsYWNlIHRoZSBjdXJyZW50IGJyb3dzZXIgVVJMIGFuZCBzdGF0ZSwgbmF2aWdhdGlvbiBBUEktYXdhcmUNCiAqIEBwYXJhbSBmblVwZGF0ZXINCiAqIEBwYXJhbSB1cmwNCiAqLw0KZnVuY3Rpb24gUmVwbGFjZUhpc3RvcnlTdGF0ZUFuZFVSTCggZm5VcGRhdGVyIC8qOiAoIHN0YXRlOiBUICkgPT4gVCovLCB1cmwgLyo6IHN0cmluZyB8IFVSTCovLCBiUHVzaFN0YXRlICkNCnsNCglsZXQgbmV3U3RhdGUgPSBmblVwZGF0ZXIoIEdldEhpc3RvcnlTdGF0ZSgpICk7DQoJaWYgKCBnX2JVc2VOYXZpZ2F0aW9uQVBJICkNCgl7DQoJCUJpbmROYXZFdmVudCgpOw0KCQl3aW5kb3cubmF2aWdhdGlvbi5uYXZpZ2F0ZSggdHlwZW9mIHVybCA9PSAic3RyaW5nIiA/IHVybCA6IHVybC50b1N0cmluZygpLCB7IHN0YXRlOiBuZXdTdGF0ZSwgaGlzdG9yeTogYlB1c2hTdGF0ZSA/ICJwdXNoIiA6ICJyZXBsYWNlIiwgaW5mbzogImxvY2FsIiB9ICk7DQoJfQ0KCWVsc2UNCgl7DQoJCWlmICggYlB1c2hTdGF0ZSApDQoJCQloaXN0b3J5LnB1c2hTdGF0ZSggbmV3U3RhdGUsICcnLCB1cmwgKTsNCgkJZWxzZQ0KCQkJaGlzdG9yeS5yZXBsYWNlU3RhdGUoIG5ld1N0YXRlLCAnJywgdXJsICk7DQoJfQ0KfQ0KDQoNCi8qKg0KICogR2V0IGN1cnJlbnQgc3RhdGUsIE5hdmlnYXRpb24gQVBJLWF3YXJlLiAgU2hvdWxkIGJlIHBhaXJlZCB3aXRoIFJlcGxhY2VIaXN0b3J5U3RhdGUuDQogKg0KICogR3VhcmFudHRlZCB0byByZXR1cm4gYW4gb2JqZWN0DQogKi8NCmZ1bmN0aW9uIEdldEhpc3RvcnlTdGF0ZSgpDQp7DQoJbGV0IHN0YXRlOw0KCWlmICggZ19iVXNlTmF2aWdhdGlvbkFQSSApDQoJCXN0YXRlID0gd2luZG93Lm5hdmlnYXRpb24uY3VycmVudEVudHJ5LmdldFN0YXRlKCk7DQoJZWxzZQ0KCQlzdGF0ZSA9IHdpbmRvdy5oaXN0b3J5ICYmIHdpbmRvdy5oaXN0b3J5LnN0YXRlOw0KDQoJcmV0dXJuIHN0YXRlID8gc3RhdGUgOiB7fTsNCn0NCg0KPC9zY3JpcHQ+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIEluaXRSZWZyZXNoICk7DQoNCmZ1bmN0aW9uIEluaXRSZWZyZXNoKCkNCnsNCglpZiAoIHR5cGVvZiB3aW5kb3cuZ193YXBpdCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHdpbmRvdy5nX3dhcGl0RXhwaXJ5ID09PSAnbnVtYmVyJyApDQoJew0KCQl0cnkNCgkJew0KCQkJdmFyIGV4cGlyeTsNCg0KCQkJaWYgKCB0eXBlb2Ygd2luZG93Lmdfd2FwaXQgPT09ICdzdHJpbmcnICkNCgkJCXsNCgkJCQl2YXIgYm9keSA9IEpTT04ucGFyc2UoIGF0b2IoIHdpbmRvdy5nX3dhcGl0LnNwbGl0KCAnLicgKVsxXSApICk7DQoJCQkJaWYgKCB0eXBlb2YgYm9keS5leHAgPT09ICdudW1iZXInICkNCgkJCQl7DQoJCQkJCWV4cGlyeSA9IGJvZHkuZXhwOw0KCQkJCX0NCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQlleHBpcnkgPSB3aW5kb3cuZ193YXBpdEV4cGlyeTsNCgkJCX0NCg0KCQkJCQkJdmFyIG9mZnNldCA9IE1hdGguZmxvb3IoIE1hdGgucmFuZG9tKCkgKiA2MDAgKSArIDE4MDA7DQoJCQl2YXIgdGltZW91dCA9ICggZXhwaXJ5IC0gb2Zmc2V0ICkgKiAxMDAwIC0gRGF0ZS5ub3coKTsNCgkJCQkJCXdpbmRvdy5zZXRUaW1lb3V0KCBBdXRvUmVmcmVzaCwgdGltZW91dCApOw0KCQl9DQoJCWNhdGNoICggZXJyICkge30NCgl9DQp9DQoNCmZ1bmN0aW9uIEF1dG9SZWZyZXNoKCkNCnsNCgkJaWYgKCB3aW5kb3cuZ193YXBpdFJlZnJlc2hFbmFibGVkICkNCgkJUmVmcmVzaCgpOw0KfQ0KDQpmdW5jdGlvbiBSZWZyZXNoKCBvblJlZnJlc2hlZCApDQp7DQoJDQoJJEouYWpheCggew0KCQl0eXBlOiAnUE9TVCcsDQoJCXVybDogJ2h0dHBzOi8vbG9naW4uc3RlYW1wb3dlcmVkLmNvbS9qd3QvYWpheHJlZnJlc2gnLA0KCQlkYXRhOiB7IHJlZGlyOiB3aW5kb3cubG9jYXRpb24uaHJlZiB9LA0KCQljcm9zc0RvbWFpbjogdHJ1ZSwNCgkJeGhyRmllbGRzOiB7IHdpdGhDcmVkZW50aWFsczogdHJ1ZSB9LA0KCX0gKS5kb25lKCBmdW5jdGlvbiggcmVzcG9uc2UgKQ0KCXsNCgkJDQoJCWlmICggIXJlc3BvbnNlLnN1Y2Nlc3MgKQ0KCQkJcmV0dXJuOw0KDQoJCSRKLmFqYXgoIHsNCgkJCXR5cGU6ICdQT1NUJywNCgkJCXVybDogcmVzcG9uc2UubG9naW5fdXJsLA0KCQkJZGF0YTogT2JqZWN0LmFzc2lnbiggcmVzcG9uc2UsIHsgcHJpb3I6IHdpbmRvdy5nX3dhcGl0IH0gKSwNCgkJfSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZSApDQoJCXsNCgkJCQ0KCQkJaWYgKCByZXNwb25zZS5yZXN1bHQgPT09IDEgJiYgcmVzcG9uc2UudG9rZW4gKQ0KCQkJew0KCQkJCXdpbmRvdy5nX3dhcGl0ID0gcmVzcG9uc2UudG9rZW47DQoJCQkJd2luZG93Lmdfd2FwaXRFeHBpcnkgPSByZXNwb25zZS5ydEV4cGlyeTsNCgkJCQlJbml0UmVmcmVzaCgpOw0KDQoJCQkJaWYgKCB0eXBlb2Ygb25SZWZyZXNoZWQgPT09ICdmdW5jdGlvbicgKQ0KCQkJCQlvblJlZnJlc2hlZCggcmVzcG9uc2UudG9rZW4gKTsNCgkJCX0NCgkJfSApOw0KCX0gKTsNCn0NCg0Kd2luZG93Lmdfd2FwaXRSZWZyZXNoID0gUmVmcmVzaDsNCndpbmRvdy5nX3dhcGl0UmVmcmVzaEVuYWJsZWQgPSB0cnVlOw0KPC9zY3JpcHQ+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+T2JqZWN0LnNlYWwgJiYgW09iamVjdCwgQXJyYXksIFN0cmluZywgTnVtYmVyXS5tYXAoZnVuY3Rpb24gKGJ1aWx0aW4pIHsgT2JqZWN0LnNlYWwoYnVpbHRpbi5wcm90b3R5cGUpOyB9KTs8L3NjcmlwdD4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4kSiA9IGpRdWVyeS5ub0NvbmZsaWN0KCk7DQogICAgICAgIGlmICh0eXBlb2YgSlNPTiAhPSAnb2JqZWN0JyB8fCAhSlNPTi5zdHJpbmdpZnkgfHwgIUpTT04ucGFyc2UpIHsgZG9jdW1lbnQud3JpdGUoIjxzY3IiICsgImlwdCB0eXBlPVwidGV4dFwvamF2YXNjcmlwdFwiIHNyYz1cImh0dHBzOlwvXC9jb21tdW5pdHkuYWthbWFpLnN0ZWFtc3RhdGljLmNvbVwvcHVibGljXC9qYXZhc2NyaXB0XC9qc29uMi5qcz92PTU0TktOZ2x2R1RPOCZhbXA7bD1lbmdsaXNoJmFtcDtfY2RuPWFrYW1haVwiPjxcL3NjcmlwdD5cbiIpOyB9Ow0KICAgIDwvc2NyaXB0Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKGV2ZW50KSB7DQogICAgICAgICAgICBTZXR1cFRvb2x0aXBzKHsgdG9vbHRpcENTU0NsYXNzOiAnY29tbXVuaXR5X3Rvb2x0aXAnIH0pOw0KICAgICAgICB9KTsNCiAgICA8L3NjcmlwdD4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij52YXIgZ19mbk1vZGFsRGlzbWlzc0hhbmRsZXIgPSBmYWxzZTsNCnZhciBnX2JJc01vYmlsZUNvbnRyb2xsZXIgPSBmYWxzZTsNCg0KZnVuY3Rpb24gc2hvd0dvdFN0ZWFtTW9kYWwoIGNvbnRlbnRFbCwgc3RlYW1VUkwsIGFwcE5hbWUgKQ0Kew0KCSQoJ2dvdFN0ZWFtX1N0ZWFtVVJMJykuaHJlZiA9IHN0ZWFtVVJMOw0KCSQoJ2dvdFN0ZWFtX0FwcE5hbWUnKS51cGRhdGUoIGFwcE5hbWUgKTsNCglzaG93TW9kYWwoIGNvbnRlbnRFbCApOw0KfQ0KDQpmdW5jdGlvbiBzaG93Q29udGVudEFzTW9kYWwoIGlkTW9kYWwsIGVsQ29udGVudCwgYkV4cGxpY2l0RGlzbWlzc2FsT25seSApDQp7DQoJdmFyIGVsTW9kYWwgPSAkKGlkTW9kYWwpOw0KCXZhciBlbE1vZGFsQ29udGVudCA9IGVsTW9kYWwuZG93bignLm1vZGFsX2JveF9jdG4nKTsNCg0KCWlmICggZWxDb250ZW50LnBhcmVudE5vZGUgIT0gZWxNb2RhbENvbnRlbnQgKQ0KCXsNCgkJaWYgKCBlbENvbnRlbnQucGFyZW50Tm9kZSApDQoJCQllbENvbnRlbnQucmVtb3ZlKCk7DQoNCgkJZWxNb2RhbENvbnRlbnQuYXBwZW5kQ2hpbGQoIGVsQ29udGVudCApOw0KCX0NCgllbENvbnRlbnQuc2libGluZ3MoKS5pbnZva2UoJ2hpZGUnKTsNCgllbENvbnRlbnQuc2hvdygpOw0KCQ0KCXNob3dNb2RhbCggZWxNb2RhbCwgYkV4cGxpY2l0RGlzbWlzc2FsT25seSApOw0KfQ0KDQpmdW5jdGlvbiBzaG93TW9kYWwoIGNvbnRlbnRFbCwgYkV4cGxpY2l0RGlzbWlzYWxPbmx5LCBiSWdub3JlUmVzaXplQW5kU2Nyb2xsRXZlbnRzICkNCnsNCgl2YXIgY0VsID0gJChjb250ZW50RWwpOw0KCWlmICggY0VsLmlzX3Zpc2libGVfbW9kYWwgKQ0KCXsNCgkJbW9kYWxTaXppbmcoIGNFbCwgdHJ1ZSApOw0KCQlyZXR1cm47DQoJfQ0KDQoJdmFyIGJnRWwgPSAkKCdtb2RhbEJHJyk7DQoJaWYoIWJnRWwpDQoJew0KCQliZ0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQoJCSRKKGRvY3VtZW50LmJvZHkgKS5hcHBlbmQoYmdFbCk7DQoJCWJnRWwuaWQgPSAnbW9kYWxCRyc7DQoJfQ0KCWlmICggYmdFbC5lZmZlY3QgKQ0KCQliZ0VsLmVmZmVjdC5jYW5jZWwoKTsNCgliZ0VsLnNldE9wYWNpdHkoIDAgKTsNCgliZ0VsLmVmZmVjdCA9IG5ldyBFZmZlY3QuQXBwZWFyKCBiZ0VsLCB7IGZyb206IDAuMCwgdG86IDAuNywgZHVyYXRpb246IDAuNCB9ICk7DQoNCg0KCS8vIG1ha2Ugc3VyZSB3ZSdyZSBzYXZlIHRvIHBvc2l0aW9uIHJlbGF0aXZlIHRvIGJvZHkNCglpZiAoIGNFbC5wYXJlbnROb2RlICE9IGRvY3VtZW50LmJvZHkgKQ0KCQkkKGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKCBjRWwgKTsNCg0KCWNFbC5zaG93KCk7DQoNCglpZiAoICFnX2JJc01vYmlsZUNvbnRyb2xsZXIgKQ0KCXsNCgkJbW9kYWxTaXppbmcoIGNFbCwgdHJ1ZSApOw0KDQoJCWNFbC5zaXppbmdMaXN0ZW5lciA9IG1vZGFsU2l6aW5nLmJpbmQoIG51bGwsIGNFbCwgZmFsc2UgKTsNCgl9DQoNCgkvLyBza2lwIHJlZ2lzdGVyaW5nIHRoZSByZXNpemUvc2Nyb2xsIGV2ZW50cyBvbiBpcGhvbmUgYXMgd2UgZG9uJ3QgY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBjb3JyZWN0bHkNCglpZiAoICFQcm90b3R5cGUuQnJvd3Nlci5Nb2JpbGVTYWZhcmkgJiYgIWdfYklzTW9iaWxlQ29udHJvbGxlciAmJiAoIGJJZ25vcmVSZXNpemVBbmRTY3JvbGxFdmVudHMgPT0gbnVsbCB8fCBiSWdub3JlUmVzaXplQW5kU2Nyb2xsRXZlbnRzID09IGZhbHNlICkgKQ0KCXsNCgkJRXZlbnQub2JzZXJ2ZSggd2luZG93LCAncmVzaXplJywgY0VsLnNpemluZ0xpc3RlbmVyICk7DQoJCUV2ZW50Lm9ic2VydmUoIHdpbmRvdywgJ3Njcm9sbCcsIGNFbC5zaXppbmdMaXN0ZW5lciApOw0KCX0NCgkNCglpZiAoICFiRXhwbGljaXREaXNtaXNhbE9ubHkgKQ0KCXsNCgkJY0VsLmlkZW50aWZ5KCk7IAkvL2FzayBwcm90b3R5cGUgdG8gZ2VuZXJhdGUgYW4gaWQNCgkJKGZ1bmN0aW9uICgpIHsNCgkJCWdfZm5Nb2RhbERpc21pc3NIYW5kbGVyID0gUmVnaXN0ZXJQb3B1cERpc21pc3NhbCggaGlkZU1vZGFsLmJpbmQoIG51bGwsIGNFbCApLCBjRWwsIHRydWUgKTsNCgkJfSkuZGVmZXIoKTsNCgl9DQoNCgljRWwuaXNfdmlzaWJsZV9tb2RhbCA9IHRydWU7DQp9DQoNCmZ1bmN0aW9uIG1vZGFsU2l6aW5nKCBjRWwsIGJGaXJzdCApDQp7DQoJdmFyIGZsSW52ZXJzZVpvb20gPSAxIC8gKGRvY3VtZW50LmJvZHkuc3R5bGUuem9vbSB8fCAxKTsNCgl2YXIgdyA9IGRvY3VtZW50LnZpZXdwb3J0LmdldFdpZHRoKCkgKiBmbEludmVyc2Vab29tOw0KCXZhciBoID0gZG9jdW1lbnQudmlld3BvcnQuZ2V0SGVpZ2h0KCkgKiBmbEludmVyc2Vab29tOw0KCXZhciBzbCA9IGRvY3VtZW50LnZpZXdwb3J0LmdldFNjcm9sbE9mZnNldHMoKS5sZWZ0Ow0KCXZhciBzdCA9IGRvY3VtZW50LnZpZXdwb3J0LmdldFNjcm9sbE9mZnNldHMoKS50b3A7DQoNCgl2YXIgY3cgPSBjRWwub2Zmc2V0V2lkdGg7DQoJdmFyIGNoID0gY0VsLm9mZnNldEhlaWdodDsNCg0KDQoJdmFyIHQgPSAoTWF0aC5mbG9vcigoaCAvIDIpIC0gKGNoIC8gMikpICsgc3QpOw0KCXZhciBsID0gKE1hdGguZmxvb3IoKHcgLyAyKSAtIChjdyAvIDIpKSArIHNsKTsNCg0KCWlmICggY2ggPCBkb2N1bWVudC52aWV3cG9ydC5nZXRIZWlnaHQoKSApDQoJCWNFbC5zdHlsZS50b3AgPSAodCA8IDAgPyAwIDogdCkgKyAncHgnOw0KCWVsc2UgaWYgKCBiRmlyc3QgKQ0KCQljRWwuc3R5bGUudG9wID0gc3QgKyAncHgnOw0KDQoJaWYgKCBjdyA8IGRvY3VtZW50LnZpZXdwb3J0LmdldFdpZHRoKCkgKQ0KCQljRWwuc3R5bGUubGVmdCA9IChsIDwgMCA/IDAgOiBsICkgKyAncHgnOw0KCWVsc2UgaWYgKCBiRmlyc3QgKQ0KCQljRWwuc3R5bGUubGVmdCA9IHNsICsgJ3B4JzsNCn0NCg0KZnVuY3Rpb24gaGlkZU1vZGFsKGNvbnRlbnRFbCkNCnsNCgl2YXIgY0VsID0gJChjb250ZW50RWwpOw0KDQoJaWYgKCAhY0VsLmlzX3Zpc2libGVfbW9kYWwgKQ0KCQlyZXR1cm47DQoJDQoJdmFyIGJnRWwgPSAkKCdtb2RhbEJHJyk7DQoJaWYgKCBiZ0VsLmVmZmVjdCApDQoJCWJnRWwuZWZmZWN0LmNhbmNlbCgpOw0KCWJnRWwuZWZmZWN0ID0gbmV3IEVmZmVjdC5GYWRlKCBiZ0VsLCB7IGR1cmF0aW9uOiAwLjIgfSApOw0KCWNFbC5oaWRlKCk7DQoJDQoJY3VycmVudE1vZGFsID0gZmFsc2U7DQoNCg0KCWlmICggIVByb3RvdHlwZS5Ccm93c2VyLk1vYmlsZVNhZmFyaSApDQoJew0KCQlFdmVudC5zdG9wT2JzZXJ2aW5nKCB3aW5kb3csICdyZXNpemUnLCBjRWwuc2l6aW5nTGlzdGVuZXIgKTsNCgkJRXZlbnQuc3RvcE9ic2VydmluZyggd2luZG93LCAnc2Nyb2xsJywgY0VsLnNpemluZ0xpc3RlbmVyICk7DQoJfQ0KCWlmICggZ19mbk1vZGFsRGlzbWlzc0hhbmRsZXIgKSANCgl7DQoJCWdfZm5Nb2RhbERpc21pc3NIYW5kbGVyLnVucmVnaXN0ZXIoKTsNCgkJZ19mbk1vZGFsRGlzbWlzc0hhbmRsZXIgPSBmYWxzZTsNCgl9DQoJDQoJaWYgKCBjRWwuT25Nb2RhbERpc21pc3NhbCApDQoJCWNFbC5Pbk1vZGFsRGlzbWlzc2FsKCk7DQoNCgljRWwuaXNfdmlzaWJsZV9tb2RhbCA9IGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBtb2RhbEFsZXJ0KG1zZykNCnsNCgltb2RhbEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGFsQWxlcnQnKTsNCglpZihtb2RhbEVsKQ0KCXsNCgkJZm9yKHg9MDt4PG1vZGFsRWwuY2hpbGROb2Rlcy5sZW5ndGg7eCsrKQ0KCQl7DQoJCQltb2RhbEVsLnJlbW92ZUNoaWxkKG1vZGFsRWwuY2hpbGROb2Rlc1t4XSk7DQoJCX0NCgkJbW9kYWxFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG1vZGFsRWwpOw0KCX0NCgkNCgltb2RhbEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQoJDQp9DQoNCjwvc2NyaXB0Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KZnVuY3Rpb24gQ3JlYXRlRGF0ZVJhbmdlSW5wdXQoIGNvbnRhaW5lciwgaWQgKQ0Kew0KCXZhciBzb3VyY2VJbnB1dCA9ICRKKCBpZCApOw0KCXZhciBkYXRlT2JqID0gbmV3IERhdGUoIHNvdXJjZUlucHV0LnZhbCgpICogMTAwMCApOw0KCXZhciBkYXRlT3B0aW9ucyA9IHsgZGF5OiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycsIHllYXI6ICdudW1lcmljJywgdGltZVpvbmU6ICdVVEMnIH07DQoJdmFyIGRhdGVTdHJpbmcgPSBkYXRlT2JqLnRvTG9jYWxlRGF0ZVN0cmluZyggdW5kZWZpbmVkLCBkYXRlT3B0aW9ucyApOw0KCXZhciBpbnB1dCA9ICRKKCAnPGlucHV0Lz4nLCB7IHR5cGU6ICdpbnB1dCcsIGNsYXNzOiAnZGF0ZV9yYW5nZV9maWx0ZXJfaW5wdXQnLCB2YWx1ZTogc291cmNlSW5wdXQudmFsKCkgPT0gMCA/ICcnIDogZGF0ZVN0cmluZyB9ICk7DQoJY29udGFpbmVyLmFwcGVuZCggaW5wdXQgKTsNCg0KCWlucHV0LmRhdGVwaWNrZXIoIHsNCgkJZGF0ZUZvcm1hdDogJ0AnLA0KCQlzaG93T3RoZXJNb250aHM6IHRydWUsDQoJCWNoYW5nZU1vbnRoOiB0cnVlLA0KCQljaGFuZ2VZZWFyOiB0cnVlLA0KCQltYXhEYXRlOiAiKzFkIiwNCgkJZGVmYXVsdERhdGU6IHNvdXJjZUlucHV0LnZhbCgpICE9IDAgPyBkYXRlT2JqIDogbnVsbCwNCgkJb25TZWxlY3Q6IGZ1bmN0aW9uKCBuZXdEYXRlLCBpbnN0YW5jZSApIHsNCgkJCXZhciBkYXRlT2JqID0gbmV3IERhdGUoIHBhcnNlSW50KCBuZXdEYXRlICkgKTsNCgkJCXZhciBkYXRlT3B0aW9ucyA9IHsgZGF5OiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycsIHllYXI6ICdudW1lcmljJywgdGltZVpvbmU6ICdVVEMnIH07DQoJCQl2YXIgZGF0ZVN0cmluZyA9IGRhdGVPYmoudG9Mb2NhbGVEYXRlU3RyaW5nKCB1bmRlZmluZWQsIGRhdGVPcHRpb25zICk7DQoJCQkkSiggdGhpcyApLnZhbCggZGF0ZVN0cmluZyApOw0KCQl9DQoJfSApOw0KDQoJcmV0dXJuIGlucHV0Ow0KfQ0KDQpmdW5jdGlvbiBTaG93RGF0ZVJhbmdlU2VsZWN0aW9uRGlhbG9nKCkNCnsNCgl2YXIgY29udGVudCA9ICRKKCAnPGRpdi8+JywgeyBjbGFzczogJ2RhdGVfcmFuZ2VfZmlsdGVyX2RpYWxvZycgfSApOw0KDQoJY29udGVudC5hcHBlbmQoICRKKCAnPGRpdi8+JywgeyBjbGFzczogJ3RpdGxlJywgdGV4dDogJ1Bvc3RlZCBkYXRlJyB9ICkgKTsNCgl2YXIgY3JlYXRlZENvbnRhaW5lciA9ICRKKCAnPGRpdi8+JywgeyBjbGFzczogJ2RhdGVfcmFuZ2VfZmlsdGVyX2RhdGVzJyB9ICk7DQoJY3JlYXRlZENvbnRhaW5lci5hcHBlbmQoICRKKCAnPGRpdi8+JywgeyBjbGFzczogJ2RhdGVfcmFuZ2Vfd29yZCcsIHRleHQ6ICdCZXR3ZWVuJyB9ICkgKTsNCgl2YXIgY3JlYXRlZF9kYXRlX3JhbmdlX3N0YXJ0ID0gQ3JlYXRlRGF0ZVJhbmdlSW5wdXQoIGNyZWF0ZWRDb250YWluZXIsICIjY3JlYXRlZF9kYXRlX3JhbmdlX2ZpbHRlcl9zdGFydCIgKTsNCgljcmVhdGVkQ29udGFpbmVyLmFwcGVuZCggY3JlYXRlZF9kYXRlX3JhbmdlX3N0YXJ0ICk7DQoJY3JlYXRlZENvbnRhaW5lci5hcHBlbmQoICRKKCAnPGRpdi8+JywgeyBjbGFzczogJ2RhdGVfcmFuZ2Vfd29yZCcsIHRleHQ6ICdBbmQnIH0gKSApOw0KCXZhciBjcmVhdGVkX2RhdGVfcmFuZ2VfZW5kID0gQ3JlYXRlRGF0ZVJhbmdlSW5wdXQoIGNyZWF0ZWRDb250YWluZXIsICIjY3JlYXRlZF9kYXRlX3JhbmdlX2ZpbHRlcl9lbmQiICk7DQoJY3JlYXRlZENvbnRhaW5lci5hcHBlbmQoIGNyZWF0ZWRfZGF0ZV9yYW5nZV9lbmQgKTsNCgljb250ZW50LmFwcGVuZCggY3JlYXRlZENvbnRhaW5lciApOw0KDQoJY29udGVudC5hcHBlbmQoICRKKCAnPGRpdi8+JywgeyBjbGFzczogJ3RpdGxlJywgdGV4dDogJ0RhdGUgbGFzdCB1cGRhdGVkJ30gKSApOw0KCXZhciB1cGRhdGVkQ29udGFpbmVyID0gJEooICc8ZGl2Lz4nLCB7IGNsYXNzOiAnZGF0ZV9yYW5nZV9maWx0ZXJfZGF0ZXMnIH0gKTsNCgl1cGRhdGVkQ29udGFpbmVyLmFwcGVuZCggJEooICc8ZGl2Lz4nLCB7IGNsYXNzOiAnZGF0ZV9yYW5nZV93b3JkJywgdGV4dDogJ0JldHdlZW4nIH0gKSApOw0KCXZhciB1cGRhdGVkX2RhdGVfcmFuZ2Vfc3RhcnQgPSBDcmVhdGVEYXRlUmFuZ2VJbnB1dCggdXBkYXRlZENvbnRhaW5lciwgIiN1cGRhdGVkX2RhdGVfcmFuZ2VfZmlsdGVyX3N0YXJ0IiApOw0KCXVwZGF0ZWRDb250YWluZXIuYXBwZW5kKCB1cGRhdGVkX2RhdGVfcmFuZ2Vfc3RhcnQgKTsNCgl1cGRhdGVkQ29udGFpbmVyLmFwcGVuZCggJEooICc8ZGl2Lz4nLCB7IGNsYXNzOiAnZGF0ZV9yYW5nZV93b3JkJywgdGV4dDogJ0FuZCcgfSApICk7DQoJdmFyIHVwZGF0ZV9kYXRlX3JhbmdlX2VuZCA9IENyZWF0ZURhdGVSYW5nZUlucHV0KCB1cGRhdGVkQ29udGFpbmVyLCAiI3VwZGF0ZWRfZGF0ZV9yYW5nZV9maWx0ZXJfZW5kIiApOw0KCXVwZGF0ZWRDb250YWluZXIuYXBwZW5kKCB1cGRhdGVfZGF0ZV9yYW5nZV9lbmQgKTsNCgljb250ZW50LmFwcGVuZCggdXBkYXRlZENvbnRhaW5lciApOw0KDQoJdmFyIGRpYWxvZyA9IFNob3dDb25maXJtRGlhbG9nKCAnRmlsdGVyIGJ5IERhdGUnLCBjb250ZW50ICk7DQoJZGlhbG9nLmRvbmUoIGZ1bmN0aW9uKCkgew0KCQkkSiggJyNjcmVhdGVkX2RhdGVfcmFuZ2VfZmlsdGVyX3N0YXJ0JyApLnZhbCggRGF0ZS5wYXJzZSggY3JlYXRlZF9kYXRlX3JhbmdlX3N0YXJ0LnZhbCgpICkgLyAxMDAwICk7DQoJCSRKKCAnI2NyZWF0ZWRfZGF0ZV9yYW5nZV9maWx0ZXJfZW5kJyApLnZhbCggRGF0ZS5wYXJzZSggIGNyZWF0ZWRfZGF0ZV9yYW5nZV9lbmQudmFsKCkgKSAvIDEwMDAgKTsNCgkJJEooICcjdXBkYXRlZF9kYXRlX3JhbmdlX2ZpbHRlcl9zdGFydCcgKS52YWwoIERhdGUucGFyc2UoICB1cGRhdGVkX2RhdGVfcmFuZ2Vfc3RhcnQudmFsKCkgKSAvIDEwMDAgKTsNCgkJJEooICcjdXBkYXRlZF9kYXRlX3JhbmdlX2ZpbHRlcl9lbmQnICkudmFsKCBEYXRlLnBhcnNlKCAgdXBkYXRlX2RhdGVfcmFuZ2VfZW5kLnZhbCgpICkgLyAxMDAwICk7DQoJCUZpbHRlckJ5VGFncygpOw0KCX0gKTsNCn0NCg0KZnVuY3Rpb24gRG93bmxvYWRGaWxlKCBwdWJsaXNoRmlsZUlELCByZXZpc2lvbiwgbWFuaWZlc3RpZCApDQp7DQogICAgJEoucG9zdCggImh0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL3NoYXJlZGZpbGVzL2Rvd25sb2FkZmlsZS8/aWQ9IiArIHB1Ymxpc2hGaWxlSUQgKyAiJnJldmlzaW9uPSIgKyByZXZpc2lvbiArICImbWFuaWZlc3RpZD0iICsgbWFuaWZlc3RpZCApDQoNCiAgICAuZG9uZSggZnVuY3Rpb24ocmVzcG9uc2UpIHsNCiAgICAgICAgaWYgKCByZXNwb25zZS5zdWNjZXNzID09IDEgKQ0KICAgICAgICB7DQogICAgICAgICAgICAvLyBOZWVkIHRvIG1ha2Ugc3VyZSB0aGUgZmlsZW5hbWUgaXMgc2V0LCBpbiBjYXNlIHRoZXJlIGlzIG5vIENvbnRlbnQtRGlzcG9zaXRpb24gb24gdGhlIHJlc3VsdA0KICAgICAgICAgICAgLy8gU28gY29vayB1cCBhbiBhbmNob3IsIHNldCB0aGUgaHJlZiBhbmQgZG93bmxvYWQgYXR0cmlidXRlcywgYW5kIGNsaWNrIGl0Lg0KICAgICAgICAgICAgLy8gQXBwYXJlbnRseSB0aGUgZG93bmxvYWQgYXR0cmlidXRlIGRvZXMgbm90IHdvcmsgb24gSUUuIC4gLg0KICAgICAgICAgICAgdmFyIGYgPSAkSigiPGE+IikuaGlkZSgpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOw0KICAgICAgICAgICAgZi5hdHRyKCJocmVmIiwgcmVzcG9uc2UudXJsICk7DQogICAgICAgICAgICBmWzBdLmRvd25sb2FkID0gcmVzcG9uc2UuZmlsZW5hbWU7DQogICAgICAgICAgICBmWzBdLmNsaWNrKCk7DQogICAgICAgICAgICBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHsgZi5yZW1vdmUoKSB9LCAwICk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBTaG93QWxlcnREaWFsb2coICdFcnJvcicsICdVbmFibGUgdG8gZG93bmxvYWQgZmlsZTogJyArIHJlc3BvbnNlLm1lc3NhZ2UgKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KfQ0KDQpmdW5jdGlvbiBTaGFyZWRGaWxlc1NlbGVjdEFwcCggd29ya3Nob3BBcHBVUkwgKQ0Kew0KCUhpZGVNZW51KCAkKCdhcHBzZWxlY3QnKSwgJCgnYXBwc2VsZWN0X29wdGlvbnMnKSApOw0KDQoJd2luZG93LmxvY2F0aW9uID0gd29ya3Nob3BBcHBVUkw7DQp9DQoNCmZ1bmN0aW9uIFNoYXJlZEZpbGVzU2VsZWN0VHJlbmREYXlQZXJpb2QoIHdvcmtzaG9wRGF5VVJMICkNCnsNCglIaWRlTWVudSggJCgnZGF5c2VsZWN0JyksICQoJ2RheXNlbGVjdF9vcHRpb25zJykgKTsNCg0KCXdpbmRvdy5sb2NhdGlvbiA9IHdvcmtzaG9wRGF5VVJMOw0KfQ0KDQpmdW5jdGlvbiBEaXNwbGF5RXJyb3JNZXNzYWdlKCBzdHJNZXNzYWdlICkNCnsNCgkkKCdzYXZlZF9wYXltZW50X2luZm8nKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KCSQoJ2Vycm9yX2Rpc3BsYXknKS5pbm5lckhUTUwgPSBzdHJNZXNzYWdlOw0KCSQoJ2Vycm9yX2Rpc3BsYXknKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCglFZmZlY3QuU2Nyb2xsVG8oICdlcnJvcl9kaXNwbGF5JyApOw0KDQoJbmV3IEVmZmVjdC5IaWdobGlnaHQoICdlcnJvcl9kaXNwbGF5JywgeyBlbmRjb2xvciA6ICcjMDAwMDAwJywgc3RhcnRjb2xvciA6ICcjZmY5OTAwJyB9ICk7DQp9DQoNCmZ1bmN0aW9uIFZhbGlkYXRpb25NYXJrRmllbGRCYWQoIGVsZW0gKQ0Kew0KCWlmICggJChlbGVtKS5oYXNDbGFzc05hbWUoICdoaWdobGlnaHRfb25fZXJyb3InICkgKQ0KCQluZXcgRWZmZWN0Lk1vcnBoKCBlbGVtLCB7c3R5bGU6ICdjb2xvcjogI0ZGOTkwMCcsIGR1cmF0aW9uOiAwLjUgfSApOw0KCWVsc2UNCgkJbmV3IEVmZmVjdC5Nb3JwaCggZWxlbSwge3N0eWxlOiAnYm9yZGVyLWNvbG9yOiAjRkY5OTAwJywgZHVyYXRpb246IDAuNSB9ICkNCn0NCg0KZnVuY3Rpb24gVmFsaWRhdGlvbk1hcmtGaWVsZE9rKCBlbGVtICkNCnsNCglpZiAoICQoZWxlbSkuaGFzQ2xhc3NOYW1lKCAnaGlnaGxpZ2h0X29uX2Vycm9yJyApICkNCgkJJChlbGVtKS5zdHlsZS5jb2xvcj0nJzsNCgllbHNlDQoJCSQoZWxlbSkuc3R5bGUuYm9yZGVyQ29sb3IgPSAnJzsNCn0NCg0KZnVuY3Rpb24gUmVwb3J0SlNFcnJvciggbWVzc2FnZSwgZSApDQp7DQoJdHJ5DQoJew0KCQlpZiAodHlwZW9mIGUgPT0gJ3N0cmluZycpDQogICAgCQllID0gbmV3IEVycm9yKGUpOw0KDQoJCURpc3BsYXlFcnJvck1lc3NhZ2UoIG1lc3NhZ2UgKyAiOiAiICsgZSApOw0KCX0NCgljYXRjaCggZSApDQoJew0KCQkJfQ0KfQ0KDQp2YXIgcmdJQkFOQ291bnRyaWVzID0gew0KCUFEIDogMSwNCglBVCA6IDEsDQoJQkUgOiAxLA0KCUJBIDogMSwNCglCRyA6IDEsDQoJSFIgOiAxLA0KCUNZIDogMSwNCglDWiA6IDEsDQoJREsgOiAxLA0KCUVFIDogMSwNCglGSSA6IDEsDQoJRlIgOiAxLA0KCURFIDogMSwNCglHSSA6IDEsDQoJR1IgOiAxLA0KCUhVIDogMSwNCglJUyA6IDEsDQoJSUUgOiAxLA0KCUlUIDogMSwNCglMViA6IDEsDQoJTEkgOiAxLA0KCUxUIDogMSwNCglMVSA6IDEsDQoJTUsgOiAxLA0KCU1UIDogMSwNCglNQyA6IDEsDQoJTUUgOiAxLA0KCU5MIDogMSwNCglOTyA6IDEsDQoJUEwgOiAxLA0KCVBUIDogMSwNCglSTyA6IDEsDQoJU00gOiAxLA0KCVJTIDogMSwNCglTSyA6IDEsDQoJU0kgOiAxLA0KCUVTIDogMSwNCglTRSA6IDEsDQoJQ0ggOiAxLA0KCVRSIDogMSwNCglHQiA6IDENCn07DQoNCmZ1bmN0aW9uIElzSUJBTkNvdW50cnkoIGNvdW50cnlDb2RlICkNCnsNCglyZXR1cm4gcmdJQkFOQ291bnRyaWVzWyBjb3VudHJ5Q29kZSBdICE9IG51bGw7DQp9DQoNCnZhciByZ1VTQVRheFRyZWF0aWVzID0gew0KCUFNIDoJMCwNCglBVSA6CTUsDQoJQVQgOgkwLA0KCUFaIDoJMCwNCglCRCA6CTEwLA0KCUJCIDoJNSwNCglCWSA6CTAsDQoJQkUgOgkwLA0KCUJHIDoJNSwNCglDQSA6CTAsDQoJQ04gOgkxMCwNCglDWSA6CTAsDQoJQ1ogOgkwLA0KCURLIDoJMCwNCglFRyA6CTE1LA0KCUVFIDoJMTAsDQoJRkkgOgkwLA0KCUZSIDoJMCwNCglERSA6CTAsDQoJR1IgOgkwLA0KCUhVIDoJMCwNCglJUyA6CTAsDQoJSU4gOgkxNSwNCglJRCA6CTEwLA0KCUlFIDoJMCwNCglJTCA6CTEwLA0KCUlUIDoJMCwNCglKTSA6CTEwLA0KCUpQIDoJMCwNCglLWiA6CTEwLA0KCUtSIDoJMTAsDQoJS0cgOgkwLA0KCUxWIDoJMTAsDQoJTFQgOgkxMCwNCglMVSA6CTAsDQoJTVQgOgkxMCwNCglNWCA6CTEwLA0KCU1EIDoJMCwNCglNQSA6CTEwLA0KCU5MIDoJMCwNCglOWiA6CTUsDQoJTk8gOgkwLA0KCVBLIDoJMCwNCglQSCA6CTE1LA0KCVBMIDoJMTAsDQoJUFQgOgkxMCwNCglSTyA6CTEwLA0KCVJVIDoJMCwNCglTSyA6CTAsDQoJU0kgOgk1LA0KCVpBIDoJMCwNCglFUyA6CTUsDQoJTEsgOgkxMCwNCglTRSA6CTAsDQoJQ0ggOgkwLA0KCVRKIDoJMCwNCglUSCA6CTUsDQoJVFQgOgkwLA0KCVROIDoJMTUsDQoJVFIgOgkxMCwNCglUTSA6CTAsDQoJVUEgOgkxMCwNCglHQiA6CTAsDQoJVVMgOgkwLA0KCVVaIDoJMCwNCglWRSA6CTEwDQp9Ow0KDQpmdW5jdGlvbiBVcGRhdGVUYXhSZXF1aXJlbWVudCgpDQp7DQoJaWYgKCAkSigiI3RheF91c2EiKS5sZW5ndGggPT0gMCApDQoJew0KCQlyZXR1cm47DQoJfQ0KDQoJdHJ5DQoJew0KCQkJCSQoJ3RheF91c2EnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KCQkkKCd0YXhfdXNhX3RyZWF0eScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQoJCSQoJ3RheF91c2Ffbm9fdHJlYXR5Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCg0KCQlpZiAoICQoJ2NvdW50cnknKS52YWx1ZSA9PSAnVVMnIHx8ICRKKCcjdXNjaXRpemVuJykucHJvcCgnY2hlY2tlZCcpICkNCgkJew0KCQkJJCgndGF4X3VzYScpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJZm9yICggdmFyIGtleSBpbiByZ1VTQVRheFRyZWF0aWVzICkNCgkJew0KCQkJaWYgKCAkKCdjb3VudHJ5JykudmFsdWUgPT0ga2V5ICkNCgkJCXsNCgkJCQkkKCd0YXhfdXNhX3RyZWF0eScpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KCQkJCXJldHVybjsNCgkJCX0NCgkJfQ0KDQoJCSQoJ3RheF91c2Ffbm9fdHJlYXR5Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQoJfQ0KCWNhdGNoKCBlICkNCgl7DQoJCVJlcG9ydEpTRXJyb3IoICdGYWlsZWQgaW4gVXBkYXRlVGF4UmVxdWlyZW1lbnQoKScsIGUgKTsNCgl9DQp9DQoNCnZhciBnVmFsaWRGaWVsZEFscGhhTnVtZXJpY1JlZ2V4ID0gL15bQS1aYS16MC05ICYuLCMnXC9cLV0rJC8NCg0KZnVuY3Rpb24gT25Jc0NvbXBhbnlDaGFuZ2UoKQ0Kew0KCWlmICggJCgnaXNjb21wYW55JykuY2hlY2tlZCApDQoJew0KCQkkKCdsYXN0bmFtZWJsb2NrJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCgkJJEooJyN1c2NpdGl6ZW5ibG9jaycpLmhpZGUoKTsNCgkJJEooJyN1c2NpdGl6ZW4nKS5wcm9wKCAnY2hlY2tlZCcsIGZhbHNlICk7DQoJCSQoJ2ZpcnN0bmFtZWxhYmVsJykuaW5uZXJIVE1MID0gJ0NvbXBhbnkgTmFtZSc7DQoJfQ0KCWVsc2UNCgl7DQoJCSQoJ2xhc3RuYW1lYmxvY2snKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCgkJJEooJ3VzY2l0aXplbmJsb2NrJykuc2hvdygpOw0KCQkkKCdmaXJzdG5hbWVsYWJlbCcpLmlubmVySFRNTCA9ICdGaXJzdCBOYW1lIChhcyB3cml0dGVuIG9uIGJhbmsgcmVjb3JkcyknOw0KCX0NCn0NCg0KZnVuY3Rpb24gT25VU0FDaXRpemVuQ2hhbmdlKCkNCnsNCglVcGRhdGVUYXhSZXF1aXJlbWVudCgpOw0KfQ0KDQpmdW5jdGlvbiBPbkxvYWRfVXNlclBheW1lbnRGb3JtKCkNCnsNCglPbklzQ29tcGFueUNoYW5nZSgpOw0KCVVwZGF0ZVRheFJlcXVpcmVtZW50KCk7DQoJVXBkYXRlQmFua0luZm8oKTsNCn0NCg0KZnVuY3Rpb24gVXBkYXRlQ291bnRyeVNlbGVjdFN0YXRlKCkNCnsNCgl0cnkNCgl7DQoJCWlmICggJCgnY291bnRyeScpLnZhbHVlID09ICdVUycgKQ0KCQl7DQoJCQkkKCdzdGF0ZV9pbnB1dCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQoJCQkkKCdzdGF0ZV9zZWxlY3QnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSQoJ3N0YXRlX2lucHV0Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQoJCQkkKCdzdGF0ZV9pbnB1dCcpLnZhbHVlID0gJyc7DQoJCQkkKCdzdGF0ZV9zZWxlY3QnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KCQl9DQoJCVVwZGF0ZVRheFJlcXVpcmVtZW50KCk7DQoJfQ0KCWNhdGNoKCBlICkNCgl7DQoJCVJlcG9ydEpTRXJyb3IoICdGYWlsZWQgaW4gVXBkYXRlU3RhdGVTZWxlY3RTdGF0ZSgpJywgZSApOw0KCX0NCn0NCg0KZnVuY3Rpb24gVXBkYXRlQmFua0luZm8oKQ0Kew0KCWlmICggJEooICIjYmFua2FjY291bnRudW1iZXJyb3ciKS5sZW5ndGggPT0gMCApDQoJew0KCQlyZXR1cm47DQoJfQ0KDQoJdHJ5DQoJew0KCQkJCSQoJ2JhbmthY2NvdW50bnVtYmVycm93Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQoJCSQoJ2Jhbmtyb3V0aW5nbnVtYmVycm93Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCgkJJCgnYmFua2liYW5yb3cnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KCQkkKCdiYW5rc3dpZnRyb3cnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KDQoJCSQoJ2JhbmtzdGF0ZV9pbnB1dCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQoJCSQoJ2JhbmtzdGF0ZV9zZWxlY3QnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KDQoJCQkJaWYgKCAkKCdiYW5rY291bnRyeScpLnZhbHVlID09ICdVUycgKQ0KCQl7DQoJCQkkKCdiYW5rc3RhdGVfc2VsZWN0Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQoJCQkkKCdiYW5rcm91dGluZ251bWJlcnJvdycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KCQkJJCgnYmFua3JvdXRpbmdudW1iZXJsYWJlbCcpLmlubmVySFRNTCA9ICdSb3V0aW5nIE51bWJlcic7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkKCdiYW5rc3RhdGVfaW5wdXQnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCg0KCQkJaWYgKCAkKCdiYW5rY291bnRyeScpLnZhbHVlID09ICdDQScgKQ0KCQkJew0KCQkJCSQoJ2Jhbmtyb3V0aW5nbnVtYmVycm93Jykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7DQoJCQkJJCgnYmFua3JvdXRpbmdudW1iZXJsYWJlbCcpLmlubmVySFRNTCA9ICdDYW5hZGlhbiBUcmFuc2l0IE51bWJlcic7DQoJCQl9DQoJCQllbHNlIGlmICggSXNJQkFOQ291bnRyeSggJCgnYmFua2NvdW50cnknKS52YWx1ZSApICkNCgkJCXsNCgkJCQkkKCdiYW5raWJhbnJvdycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KCQkJCSQoJ2Jhbmtzd2lmdHJvdycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOw0KCQkJCSQoJ2JhbmthY2NvdW50bnVtYmVycm93Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkKCdiYW5rc3dpZnRyb3cnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCgkJCX0NCgkJfQ0KCX0NCgljYXRjaCggZSApDQoJew0KCQlSZXBvcnRKU0Vycm9yKCAnRmFpbGVkIGluIFVwZGF0ZUJhbmtJbmZvKCknLCBlICk7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBJc1ZhbGlkUmVxdWlyZWRGaWVsZCggZmllbGROYW1lLCByZWdleCApDQp7DQoJdmFyIGZpZWxkID0gJEooIGZpZWxkTmFtZSApOw0KCXZhciB2YWx1ZSA9IGZpZWxkLnZhbCgpOw0KCXZhbHVlID0gdl90cmltKCB2YWx1ZSApOw0KCWlmICggdmFsdWUubGVuZ3RoID09IDAgKQ0KCXsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCWlmICggIXJlZ2V4LnRlc3QoIHZhbHVlICkgKQ0KCXsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCWZpZWxkLnZhbCggdmFsdWUgKTsNCglyZXR1cm4gdHJ1ZTsNCn0NCg0KZnVuY3Rpb24gVmFsaWRhdGVVc2VyUGF5bWVudEluZm8oIGJhc2VVUkwgKQ0Kew0KCQl2YXIgZXJyb3JTdHJpbmcgPSAnJzsNCg0KCWJPayA9IHRydWU7DQoNCgkJdHJ5DQoJew0KCQlpZiAoICQoJ2NvdW50cnknKS52YWx1ZSA9PSAnVVMnICkNCgkJew0KCQkJJCgnc3RhdGUnKS52YWx1ZSA9ICQoJ3N0YXRlX3NlbGVjdCcpLnZhbHVlOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJCgnc3RhdGUnKS52YWx1ZSA9ICQoJ3N0YXRlX2lucHV0JykudmFsdWU7DQoJCX0NCg0KCQkJCWlmICggJEooICIjZmlyc3RuYW1lIikubGVuZ3RoICE9IDAgKQ0KCQl7DQoJCQlpZiAoICQoICdpc2NvbXBhbnknICkuY2hlY2tlZCApDQoJCQl7DQoJCQkJaWYgKCAhSXNWYWxpZFJlcXVpcmVkRmllbGQoICIjZmlyc3RuYW1lIiwgZ1ZhbGlkRmllbGRBbHBoYU51bWVyaWNSZWdleCApICkNCgkJCQl7DQoJCQkJCWVycm9yU3RyaW5nICs9ICdQbGVhc2UgZW50ZXIgYSBjb21wYW55IG5hbWUuPGJyLz4nOw0KCQkJCX0NCgkJCQkkKCAnbGFzdG5hbWUnICkudmFsdWUgPSAnJzsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQlpZiAoICFJc1ZhbGlkUmVxdWlyZWRGaWVsZCggIiNmaXJzdG5hbWUiLCBnVmFsaWRGaWVsZEFscGhhTnVtZXJpY1JlZ2V4ICkgKQ0KCQkJCXsNCgkJCQkJZXJyb3JTdHJpbmcgKz0gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGZpcnN0IG5hbWUuPGJyLz4nOw0KCQkJCX0NCgkJCQlpZiAoICFJc1ZhbGlkUmVxdWlyZWRGaWVsZCggIiNsYXN0bmFtZSIsIGdWYWxpZEZpZWxkQWxwaGFOdW1lcmljUmVnZXggKSApDQoJCQkJew0KCQkJCQllcnJvclN0cmluZyArPSAnUGxlYXNlIGVudGVyIGEgdmFsaWQgbGFzdCBuYW1lLjxici8+JzsNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQkJCWlmICggIUlzVmFsaWRSZXF1aXJlZEZpZWxkKCAiI2FkZHJlc3MxIiwgZ1ZhbGlkRmllbGRBbHBoYU51bWVyaWNSZWdleCApICkNCgkJew0KCQkJZXJyb3JTdHJpbmcgKz0gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGFkZHJlc3MuPGJyLz4nOw0KCQl9DQoJCWlmICggIUlzVmFsaWRSZXF1aXJlZEZpZWxkKCAiI2NpdHkiLCBnVmFsaWRGaWVsZEFscGhhTnVtZXJpY1JlZ2V4ICkgKQ0KCQl7DQoJCQllcnJvclN0cmluZyArPSAnUGxlYXNlIGVudGVyIGEgdmFsaWQgY2l0eS48YnIvPic7DQoJCX0NCgkJaWYgKCAkKCdjb3VudHJ5JykudmFsdWUgPT0gJ1VTJyB8fCAkKCdjb3VudHJ5JykudmFsdWUgPT0gJ1VBJyApDQoJCXsNCgkJCWlmICggIUlzVmFsaWRSZXF1aXJlZEZpZWxkKCAiI3ppcCIsIGdWYWxpZEZpZWxkQWxwaGFOdW1lcmljUmVnZXggKSApDQoJCQl7DQoJCQkJZXJyb3JTdHJpbmcgKz0gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIHppcCBvciBwb3N0YWwgY29kZS48YnIvPic7DQoJCQl9DQoJCX0NCgkJaWYgKCAkKCAncGhvbmUnICkudmFsdWUubGVuZ3RoIDwgMSApDQoJCXsNCgkJCWVycm9yU3RyaW5nICs9ICdQbGVhc2UgZW50ZXIgeW91ciBwaG9uZSBudW1iZXIsIGluY2x1ZGluZyBhcmVhIGNvZGUuPGJyLz4nOw0KCQl9DQoJfQ0KCWNhdGNoKGUpDQoJew0KCQlSZXBvcnRKU0Vycm9yKCAnRmFpbGVkIHZhbGlkYXRpbmcgcGF5bWVudCBpbmZvIGZvcm0nLCBlICk7DQoJfQ0KDQoJdHJ5DQoJew0KCQkJCWlmICggZXJyb3JTdHJpbmcgIT0gJycgKQ0KCQl7DQoJCQl2YXIgcmdFcnJvcnMgPSBlcnJvclN0cmluZy5zcGxpdCggJzxici8+JyApOw0KCQkJRGlzcGxheUVycm9yTWVzc2FnZSggZXJyb3JTdHJpbmcgKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCS8vIHN1Ym1pdCB0aGUgZm9ybQ0KCQkJJEouYWpheCggew0KCQkJCXVybDogYmFzZVVSTCArICcvYWpheHNhdmV1c2VycGF5bWVudGluZm8vJywNCgkJCQltZXRob2Q6ICJQT1NUIiwNCgkJCQlkYXRhOiAkSiggIiNXb3Jrc2hvcFBheW1lbnRJbmZvRm9ybSIgKS5zZXJpYWxpemUoKSwNCgkJCQlzdWNjZXNzIDogZnVuY3Rpb24oIHJlc3BvbnNlICkgew0KCQkJCQl2YXIgZGlhbG9nID0gU2hvd0FsZXJ0RGlhbG9nKCAnU2F2ZWQhJywgcmVzcG9uc2UucmVkaXJlY3RfdXJsLmxlbmd0aCAhPSAwID8gJ1lvdXIgY29udGFjdCBhbmQgYWRkcmVzcyBpbmZvcm1hdGlvbiBoYXZlIGJlZW4gc2F2ZWQuIFNpbmNlIHlvdSB1cGRhdGVkIHlvdXIgY291bnRyeSwgeW91IHdpbGwgbm93IGJlIHJlZGlyZWN0ZWQgdG8gYW4gZXh0ZXJuYWwgc2VydmljZSB0byB1cGRhdGUgeW91ciB0YXggaW5mb3JtYXRpb24uJyA6ICdZb3VyIGNvbnRhY3QgYW5kIGFkZHJlc3MgaW5mb3JtYXRpb24gaGF2ZSBiZWVuIHNhdmVkLiBJZiB5b3UgaGF2ZW5cJ3QgYWxyZWFkeSwgcGxlYXNlIGZpbGwgaW4geW91ciBiYW5rIGFjY291bnQgYW5kIHRheCBpbmZvcm1hdGlvbi4nICk7DQoJCQkJCWRpYWxvZy5kb25lKCBmdW5jdGlvbigpIHsNCgkJCQkJCWlmICggcmVzcG9uc2UucmVkaXJlY3RfdXJsLmxlbmd0aCAhPSAwICkNCgkJCQkJCXsNCgkJCQkJCQl0b3AubG9jYXRpb24uYXNzaWduKCByZXNwb25zZS5yZWRpcmVjdF91cmwgKTsNCgkJCQkJCX0NCgkJCQkJCWVsc2UNCgkJCQkJCXsNCgkJCQkJCQl0b3AubG9jYXRpb24ucmVsb2FkKCk7DQoJCQkJCQl9DQoJCQkJCX0gKTsNCgkJCQl9LA0KCQkJCWVycm9yOiBmdW5jdGlvbigganFYSFIgKSB7DQoJCQkJCXZhciBqc29uID0ganFYSFIucmVzcG9uc2VKU09OOw0KCQkJCQlpZiAoIGpzb24uaGFzT3duUHJvcGVydHkoICJtc2ciICkgKQ0KCQkJCQl7DQoJCQkJCQlTaG93QWxlcnREaWFsb2coICdFcnJvcicsIGpzb24ubXNnICk7DQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQlTaG93QWxlcnREaWFsb2coICdFcnJvcicsICdBbiB1bmtub3duIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBzYXZlIHlvdXIgY29udGFjdCBpbmZvcm1hdGlvbi4nICk7DQoJCQkJCX0NCgkJCQl9DQoJCQl9ICk7DQoJCX0NCgl9DQoJY2F0Y2goZSkNCgl7DQoJCVJlcG9ydEpTRXJyb3IoICdGYWlsZWQgc2hvd2luZyBlcnJvciBvciBzdWJtaXR0aW5nIHBheW1lbnQgaW5mbyBmb3JtJywgZSApOw0KCX0NCn0NCg0KZnVuY3Rpb24gdmFsaWRhdGVGaWVsZHMoKQ0Kew0KCQl2YXIgZXJyb3JTdHJpbmcgPSAnJzsNCg0KCWJPayA9IHRydWU7DQoNCgkJdHJ5DQoJew0KCQlpZiAoICQoJ2NvdW50cnknKS52YWx1ZSA9PSAnVVMnICkNCgkJew0KCQkJJCgnc3RhdGUnKS52YWx1ZSA9ICQoJ3N0YXRlX3NlbGVjdCcpLnZhbHVlOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJCgnc3RhdGUnKS52YWx1ZSA9ICQoJ3N0YXRlX2lucHV0JykudmFsdWU7DQoJCX0NCg0KCQlpZiAoICQoJ2Jhbmtjb3VudHJ5JykudmFsdWUgPT0gJ1VTJyApDQoJCXsNCgkJCSQoJ2JhbmtzdGF0ZScpLnZhbHVlID0gJCgnYmFua3N0YXRlX3NlbGVjdCcpLnZhbHVlOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJCgnYmFua3N0YXRlJykudmFsdWUgPSAkKCdiYW5rc3RhdGVfaW5wdXQnKS52YWx1ZTsNCgkJfQ0KDQoJCWlmICggIUlzSUJBTkNvdW50cnkoICQoJ2Jhbmtjb3VudHJ5JykudmFsdWUgKSApDQoJCXsNCgkJCSQoJ2JhbmtpYmFuJykudmFsdWUgPSAnJzsNCgkJfQ0KDQoJCQkJaWYgKCAkKCAnaXNjb21wYW55JyApLmNoZWNrZWQgKQ0KCQl7DQoJCQlpZiAoICFJc1ZhbGlkUmVxdWlyZWRGaWVsZCggIiNmaXJzdG5hbWUiLCBnVmFsaWRGaWVsZEFscGhhTnVtZXJpY1JlZ2V4ICkgKQ0KCQkJew0KCQkJCWVycm9yU3RyaW5nICs9ICdQbGVhc2UgZW50ZXIgYSBjb21wYW55IG5hbWUuPGJyLz4nOw0KCQkJfQ0KCQkgCSQoICdsYXN0bmFtZScgKS52YWx1ZSA9ICcnOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJaWYgKCAhSXNWYWxpZFJlcXVpcmVkRmllbGQoICIjZmlyc3RuYW1lIiwgZ1ZhbGlkRmllbGRBbHBoYU51bWVyaWNSZWdleCApICkNCgkJCXsNCgkJCQllcnJvclN0cmluZyArPSAnUGxlYXNlIGVudGVyIGEgdmFsaWQgZmlyc3QgbmFtZS48YnIvPic7DQoJCQl9DQoJCQlpZiAoICFJc1ZhbGlkUmVxdWlyZWRGaWVsZCggIiNsYXN0bmFtZSIsIGdWYWxpZEZpZWxkQWxwaGFOdW1lcmljUmVnZXggKSApDQoJCQl7DQoJCQkJZXJyb3JTdHJpbmcgKz0gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGxhc3QgbmFtZS48YnIvPic7DQoJCQl9DQoJCX0NCgkJaWYgKCAhSXNWYWxpZEVtYWlsQWRkcmVzcyggJCggJ2VtYWlsJyApLnZhbHVlICkgKQ0KCQl7DQoJCQllcnJvclN0cmluZyArPSAnUGxlYXNlIGVudGVyIGEgdmFsaWQgZW1haWwgYWRkcmVzcy48YnIvPic7DQoJCX0NCg0KCQkJCWlmICggIUlzVmFsaWRSZXF1aXJlZEZpZWxkKCAiI2FkZHJlc3MxIiwgZ1ZhbGlkRmllbGRBbHBoYU51bWVyaWNSZWdleCApICkNCgkJew0KCQkJZXJyb3JTdHJpbmcgKz0gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGFkZHJlc3MuPGJyLz4nOw0KCQl9DQoJCWlmICggIUlzVmFsaWRSZXF1aXJlZEZpZWxkKCAiI2NpdHkiLCBnVmFsaWRGaWVsZEFscGhhTnVtZXJpY1JlZ2V4ICkgKQ0KCQl7DQoJCQllcnJvclN0cmluZyArPSAnUGxlYXNlIGVudGVyIGEgdmFsaWQgY2l0eS48YnIvPic7DQoJCX0NCg0KCQlpZiAoICQoJ2NvdW50cnknKS52YWx1ZSA9PSAnVVMnIHx8ICQoJ2NvdW50cnknKS52YWx1ZSA9PSAnVUEnICkNCgkJew0KCQkJaWYgKCAkKCAnemlwJyApLnZhbHVlLmxlbmd0aCA8IDEgKQ0KCQkJew0KCQkJCWVycm9yU3RyaW5nICs9ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCB6aXAgb3IgcG9zdGFsIGNvZGUuPGJyLz4nOw0KCQkJfQ0KCQl9DQoNCgkJaWYgKCAkKCAncGhvbmUnICkudmFsdWUubGVuZ3RoIDwgMSApDQoJCXsNCgkJCWVycm9yU3RyaW5nICs9ICdQbGVhc2UgZW50ZXIgeW91ciBwaG9uZSBudW1iZXIsIGluY2x1ZGluZyBhcmVhIGNvZGUuPGJyLz4nOw0KCQl9DQoNCgkJCQlpZiAoICFJc1ZhbGlkUmVxdWlyZWRGaWVsZCggIiNiYW5rbmFtZSIsIGdWYWxpZEZpZWxkQWxwaGFOdW1lcmljUmVnZXggKSApDQoJCXsNCgkJCWVycm9yU3RyaW5nICs9ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBiYW5rIG5hbWUuPGJyLz4nOw0KCQl9DQoJCWlmICggIUlzVmFsaWRSZXF1aXJlZEZpZWxkKCAiI2JhbmthY2NvdW50aG9sZGVybmFtZSIsIGdWYWxpZEZpZWxkQWxwaGFOdW1lcmljUmVnZXggKSApDQoJCXsNCgkJCWVycm9yU3RyaW5nICs9ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBiYW5rIGFjY291bnQgaG9sZGVyIG5hbWUgKG11c3QgbWF0Y2ggYmFuayByZWNvcmRzKS48YnIvPic7DQoJCX0NCg0KCQkJCWlmICggIUlzVmFsaWRSZXF1aXJlZEZpZWxkKCAiI2JhbmthZGRyZXNzMSIsIGdWYWxpZEZpZWxkQWxwaGFOdW1lcmljUmVnZXggKSApDQoJCXsNCgkJCWVycm9yU3RyaW5nICs9ICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBhZGRyZXNzIGZvciB5b3VyIGJhbmsuPGJyLz4nOw0KCQl9DQoJCWlmICggIUlzVmFsaWRSZXF1aXJlZEZpZWxkKCAiI2JhbmtjaXR5IiwgZ1ZhbGlkRmllbGRBbHBoYU51bWVyaWNSZWdleCApICkNCgkJew0KCQkJZXJyb3JTdHJpbmcgKz0gJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGNpdHkgZm9yIHlvdXIgYmFuay48YnIvPic7DQoJCX0NCgkJaWYgKCAkKCdiYW5rY291bnRyeScpLnZhbHVlID09ICdVUycgfHwgJCgnYmFua2NvdW50cnknKS52YWx1ZSA9PSAnVUEnICkNCgkJew0KCQkJaWYgKCAkKCAnYmFua3ppcCcgKS52YWx1ZS5sZW5ndGggPCAxICkNCgkJCXsNCgkJCQllcnJvclN0cmluZyArPSAnUGxlYXNlIGVudGVyIGEgdmFsaWQgemlwIG9yIHBvc3RhbCBjb2RlIGZvciB5b3VyIGJhbmsuPGJyLz4nOw0KCQkJfQ0KCQl9DQoNCgkJCQlpZiAoICQoICdiYW5rYWNjb3VudG51bWJlcicgKS52YWx1ZS5sZW5ndGggPCAxICYmICFJc0lCQU5Db3VudHJ5KCAkKCdiYW5rY291bnRyeScpLnZhbHVlICkgKQ0KCQl7DQoJCQllcnJvclN0cmluZyArPSAnUGxlYXNlIGVudGVyIHlvdXIgYmFuayBhY2NvdW50IG51bWJlci48YnIvPic7DQoJCX0NCgkJaWYgKCAkKCAnYmFua2NvdW50cnknICkudmFsdWUgPT0gJ1VTJyApDQoJCXsNCgkJCSQoJ2JhbmtpYmFuJykudmFsdWUgPSAnJzsNCgkJCSQoJ3N3aWZ0Y29kZScpLnZhbHVlID0gJyc7DQoJCQlpZiAoICQoICdiYW5rYWNjb3VudHJvdXRpbmdudW1iZXInICkudmFsdWUubGVuZ3RoICE9IDkgJiYgJCggJ2JhbmthY2NvdW50cm91dGluZ251bWJlcicgKS52YWx1ZSAhPSAkKCAnc3RvcmVkcm91dGluZ251bWJlcicgKS52YWx1ZSkNCgkJCXsNCgkJCQllcnJvclN0cmluZyArPSAnUGxlYXNlIGVudGVyIHlvdXIgYmFua1wncyByb3V0aW5nIG51bWJlciAoOSBkaWdpdHMpLjxici8+JzsNCgkJCX0NCgkJfQ0KCQllbHNlIGlmICggJCggJ2Jhbmtjb3VudHJ5JyApLnZhbHVlID09ICdDQScgKQ0KCQl7DQoJCQkkKCdiYW5raWJhbicpLnZhbHVlID0gJyc7DQoJCQkkKCdzd2lmdGNvZGUnKS52YWx1ZSA9ICcnOw0KCQkJaWYgKCAkKCAnYmFua2FjY291bnRyb3V0aW5nbnVtYmVyJyApLnZhbHVlLmxlbmd0aCAhPSA5ICYmICQoICdiYW5rYWNjb3VudHJvdXRpbmdudW1iZXInICkudmFsdWUgIT0gJCggJ3N0b3JlZHJvdXRpbmdudW1iZXInICkudmFsdWUpDQoJCQl7DQoJCQkJZXJyb3JTdHJpbmcgKz0gJ1BsZWFzZSBlbnRlciB0aGUgQ2FuYWRpYW4gVHJhbnNpdCBOdW1iZXIgKDkgZGlnaXRzIHdpdGggYSBsZWFkaW5nIDApLjxici8+JzsNCgkJCX0NCgkJfQ0KCQllbHNlIGlmICggSXNJQkFOQ291bnRyeSggJCgnYmFua2NvdW50cnknKS52YWx1ZSApICkNCgkJew0KCQkJaWYgKCAkKCAnYmFua2liYW4nICkudmFsdWUubGVuZ3RoIDwgMSApDQoJCQl7DQoJCQkJZXJyb3JTdHJpbmcgKz0gJ1BsZWFzZSBlbnRlciB5b3VyIGJhbmtcJ3MgSUJBTi48YnIvPic7DQoJCQl9DQoJCQlpZiAoICQoICdzd2lmdGNvZGUnICkudmFsdWUubGVuZ3RoIDwgMSApDQoJCQl7DQoJCQkJZXJyb3JTdHJpbmcgKz0gJ1BsZWFzZSBlbnRlciB5b3VyIGJhbmtcJ3MgU1dJRlQgY29kZS48YnIvPic7DQoJCQl9DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkKCdiYW5raWJhbicpLnZhbHVlID0gJyc7DQoJCQlpZiAoICQoICdzd2lmdGNvZGUnICkudmFsdWUubGVuZ3RoIDwgMSApDQoJCQl7DQoJCQkJZXJyb3JTdHJpbmcgKz0gJ1BsZWFzZSBlbnRlciB5b3VyIGJhbmtcJ3MgU1dJRlQgY29kZS48YnIvPic7DQoJCQl9DQoJCX0NCgl9DQoJY2F0Y2goZSkNCgl7DQoJCVJlcG9ydEpTRXJyb3IoICdGYWlsZWQgdmFsaWRhdGluZyBwYXltZW50IGluZm8gZm9ybScsIGUgKTsNCgl9DQoNCgl0cnkNCgl7DQoJCQkJaWYgKCBlcnJvclN0cmluZyAhPSAnJyApDQoJCXsNCgkJCXZhciByZ0Vycm9ycyA9IGVycm9yU3RyaW5nLnNwbGl0KCAnPGJyLz4nICk7DQoJCQlEaXNwbGF5RXJyb3JNZXNzYWdlKCBlcnJvclN0cmluZyApOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJLy8gc3VibWl0IHRoZSBmb3JtDQoJCQlkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggJ1dvcmtzaG9wUGF5bWVudEluZm9Gb3JtJyApLnN1Ym1pdCgpOw0KCQl9DQoJfQ0KCWNhdGNoKGUpDQoJew0KCQlSZXBvcnRKU0Vycm9yKCAnRmFpbGVkIHNob3dpbmcgZXJyb3Igb3Igc3VibWl0dGluZyBwYXltZW50IGluZm8gZm9ybScsIGUgKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIFNoYXJlZEZpbGVCaW5kTW91c2VIb3ZlciggZWxlbUlkLCBsb2dnZWRJbiwgaXRlbURhdGEgKQ0Kew0KCXZhciBlbGVtID0gJCggZWxlbUlkICk7DQoJRXZlbnQub2JzZXJ2ZSggZWxlbSwgIm1vdXNlb3ZlciIsIGZ1bmN0aW9uKCkgeyBTaGFyZWRGaWxlSG92ZXIoIGVsZW0sIG51bGwsIGl0ZW1EYXRhWydpZCddLCBsb2dnZWRJbiwgaXRlbURhdGEgKTsgfSApOw0KCUV2ZW50Lm9ic2VydmUoIGVsZW0sICJtb3VzZW91dCIsIGZ1bmN0aW9uKCBldmVudCApIHsgSGlkZVdvcmtzaG9wSXRlbUhvdmVyKCBlbGVtLCBldmVudCApOyB9ICk7DQp9DQoNCmZ1bmN0aW9uIFNoYXJlZEZpbGVIb3ZlciggZWxlbSwgZXZlbnQsIGlkLCBsb2dnZWRJbiwgaXRlbURhdGEgKQ0Kew0KCWRpdkhvdmVyID0gJCgnd29ya3Nob3BfaXRlbV9ob3ZlcicpOw0KCWlmICghZXZlbnQpIHZhciBldmVudCA9IHdpbmRvdy5ldmVudDsNCgllbGVtID0gJChlbGVtKTsNCg0KCXZhciBob3ZlciA9ICQoZGl2SG92ZXIpOw0KCWlmICggaG92ZXIudmlzaWJsZSgpICYmIGhvdmVyLnRhcmdldCA9PSBlbGVtICkNCgl7DQoJCXJldHVybjsNCgl9DQoJZWxzZSBpZiAoICggIWhvdmVyLnZpc2libGUoKSB8fCBob3Zlci50YXJnZXQgIT0gZWxlbSApICkNCgl7DQoJCXZhciBkZXNjcmlwdGlvbiA9IGl0ZW1EYXRhWydkZXNjcmlwdGlvbiddID8gaXRlbURhdGFbJ2Rlc2NyaXB0aW9uJ10gOiAnJzsNCgkJaWYgKCBkZXNjcmlwdGlvbi5sZW5ndGggPT0gMCApDQoJCXsNCgkJCWRlc2NyaXB0aW9uID0gaXRlbURhdGFbJ3Nob3J0X2Rlc2NyaXB0aW9uJ10gPyBpdGVtRGF0YVsnc2hvcnRfZGVzY3JpcHRpb24nXSA6ICcnOw0KCQl9DQoJCWhvdmVyLmRvd24oJy5jb250ZW50JykudXBkYXRlKCAnPGRpdiBjbGFzcz0iaG92ZXJXb3Jrc2hvcEl0ZW1UaXRsZSI+JyArIGl0ZW1EYXRhWyd0aXRsZSddICsgJzwvZGl2PicgKyAnPGRpdiBjbGFzcz0iaG92ZXJXb3Jrc2hvcEl0ZW1EZXNjIj4nICsgZGVzY3JpcHRpb24gKyAnPC9kaXY+JyApOw0KCQlpZiAoIGl0ZW1EYXRhWyd1c2VyX3N1YnNjcmliZWQnXSApDQoJCXsNCgkJCSQoICdob3Zlcl9zdWJzY3JpYmVkJyApLnNob3coKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSQoICdob3Zlcl9zdWJzY3JpYmVkJyApLmhpZGUoKTsNCgkJfQ0KCQlpZiAoIGl0ZW1EYXRhWyd1c2VyX2Zhdm9yaXRlZCddICkNCgkJew0KCQkJJCggJ2hvdmVyX2Zhdm9yaXRlZCcgKS5zaG93KCk7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkKCAnaG92ZXJfZmF2b3JpdGVkJyApLmhpZGUoKTsNCgkJfQ0KCQlpZiAoIGl0ZW1EYXRhWydwbGF5ZWQnXSApDQoJCXsNCgkJCSQoICdob3Zlcl9wbGF5ZWQnICkuc2hvdygpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJCggJ2hvdmVyX3BsYXllZCcgKS5oaWRlKCk7DQoJCX0NCgkJaWYgKCBpdGVtRGF0YVsndXNlcl9zdWJzY3JpYmVkJ10gfHwgaXRlbURhdGFbJ3VzZXJfZmF2b3JpdGVkJ10gfHwgaXRlbURhdGFbJ3BsYXllZCddICkNCgkJew0KCQkJJCggJ2hvdmVyX3VzZXJfYWN0aW9uX2hpc3RvcnknICkuc2hvdygpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJCggJ2hvdmVyX3VzZXJfYWN0aW9uX2hpc3RvcnknICkuaGlkZSgpOw0KCQl9DQoNCgkJdmFyIGhvdmVyU3Vic2NyaXB0aW9ucyA9ICQoICdob3Zlcl9zdWJzY3JpcHRpb25zJyApOw0KDQoJCS8vIHJldHJpZXZlIGZhdm9yaXRlZCBieSBmcmllbmRzIGluZm8NCgkJdmFyIHRhcmdldElkID0gImZhdm9yaXRlZF9ieV9mcmllbmRzXyIgKyBpZDsNCgkJdmFyIGVsZW1EYXRhID0gJCggdGFyZ2V0SWQgKTsNCgkJU2hvd1dvcmtzaG9wSXRlbUhvdmVyKCBlbGVtLCBkaXZIb3ZlciwgbG9nZ2VkSW4gPyB0YXJnZXRJZCA6IG51bGwgKTsNCgkJaWYgKCBsb2dnZWRJbiAmJiAhZWxlbURhdGEgJiYgIWVsZW0uYWpheFJlcXVlc3QgKQ0KCQl7DQoJCQl2YXIgbmV3RGl2ID0gbmV3IEVsZW1lbnQoICdkaXYnLCB7IGlkOiB0YXJnZXRJZCB9ICk7DQoJCQlob3ZlclN1YnNjcmlwdGlvbnMuZG93bignLmNvbnRlbnROb1RvcFBhZGRpbmcnKS5hcHBlbmRDaGlsZCggbmV3RGl2ICk7DQoJCQl3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7DQoJCQkJaWYgKCAhZWxlbS5hamF4UmVxdWVzdCApIHsNCgkJCQkJZWxlbS5hamF4UmVxdWVzdCA9IG5ldyBBamF4LlVwZGF0ZXIoIG5ld0RpdiwNCgkJCQkJCQkJJ2h0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL3NoYXJlZGZpbGVzL2ZyaWVuZHN3aG9mYXZvcml0ZWRmaWxlP2lkPScgKyBpZCArICcmYXBwaWQ9JyArIGl0ZW1EYXRhWydhcHBpZCddLA0KCQkJCQkJCQl7IG1ldGhvZDogJ2dldCcsIG9uQ29tcGxldGU6IGZ1bmN0aW9uKCkgeyBVcGRhdGVXb3Jrc2hvcEl0ZW1Ib3ZlciggZWxlbSwgZGl2SG92ZXIsIHRhcmdldElkICk7IH0gfSApOw0KCQkJCX0NCgkJCX0sIDAgKTsNCgkJfQ0KCX0NCn0NCg0KZnVuY3Rpb24gSGlkZVdvcmtzaG9wSXRlbUhvdmVyKCBlbGVtLCBldmVudCApDQp7DQoJZGl2SG92ZXIgPSAkKCd3b3Jrc2hvcF9pdGVtX2hvdmVyJyk7DQoJaWYgKCFldmVudCkgdmFyIGV2ZW50ID0gd2luZG93LmV2ZW50Ow0KCXZhciByZWx0YXJnZXQgPSAoZXZlbnQucmVsYXRlZFRhcmdldCkgPyBldmVudC5yZWxhdGVkVGFyZ2V0IDogZXZlbnQudG9FbGVtZW50Ow0KCWlmICggcmVsdGFyZ2V0ICYmICQocmVsdGFyZ2V0KS51cCggJyMnICsgZWxlbS5pZGVudGlmeSgpICkgKQ0KCXsNCgkJcmV0dXJuOw0KCX0NCglkaXZIb3Zlci5oaWRlKCk7DQp9DQoNCmZ1bmN0aW9uIFVwZGF0ZVdvcmtzaG9wSXRlbUhvdmVyKCBlbGVtLCBkaXZIb3ZlciwgdGFyZ2V0Q29udGVudCApDQp7DQoJZGl2SG92ZXIgPSAkKCd3b3Jrc2hvcF9pdGVtX2hvdmVyJyk7DQoJaWYgKCAhZGl2SG92ZXIudmlzaWJsZSgpICkNCgkJcmV0dXJuOw0KCVNob3dXb3Jrc2hvcEl0ZW1Ib3ZlciggZWxlbSwgZGl2SG92ZXIsIHRhcmdldENvbnRlbnQgKTsNCn0NCg0KZnVuY3Rpb24gU2hvd1dvcmtzaG9wSXRlbUhvdmVyKCBlbGVtLCBkaXZIb3ZlciwgdGFyZ2V0Q29udGVudCApDQp7DQoJdmFyIGhvdmVyID0gJChkaXZIb3Zlcik7DQoJaG92ZXIuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nOw0KCWhvdmVyLnNob3coKTsNCg0KCWlmICggdGFyZ2V0Q29udGVudCA9PSBudWxsIHx8ICQoIHRhcmdldENvbnRlbnQgKSA9PSBudWxsICkNCgl7DQoJCSQoICdob3Zlcl9zdWJzY3JpcHRpb25zJyApLmhpZGUoKTsNCgl9DQoJZWxzZQ0KCXsNCgkJJCggdGFyZ2V0Q29udGVudCApLnNpYmxpbmdzKCkuaW52b2tlKCdoaWRlJyk7DQoJCSQoIHRhcmdldENvbnRlbnQgKS5zaG93KCk7DQoJCWlmICggJCggdGFyZ2V0Q29udGVudCApLmNoaWxkRWxlbWVudHMoKS5zaXplKCkgPiAwICkNCgkJew0KCQkJJCggJ2hvdmVyX3N1YnNjcmlwdGlvbnMnICkuc2hvdygpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJCggJ2hvdmVyX3N1YnNjcmlwdGlvbnMnICkuaGlkZSgpOw0KCQl9DQoJfQ0KDQoJaG92ZXIuY2xvbmVQb3NpdGlvbiggZWxlbSwge3NldFdpZHRoOiBmYWxzZSwgc2V0SGVpZ2h0OiBmYWxzZX0gKTsNCgl2YXIgaG92ZXJfYm94ID0gaG92ZXIuZG93biggJy5ob3Zlcl9ib3gnICk7DQoNCgl2YXIgbkhvdmVySG9yaXpvbnRhbFBhZGRpbmcgPSA4Ow0KCXZhciBib3hSaWdodFZpZXdwb3J0ID0gZWxlbS52aWV3cG9ydE9mZnNldCgpLmxlZnQgKyBwYXJzZUludCggZWxlbS5nZXREaW1lbnNpb25zKCkud2lkdGggKSArIGhvdmVyX2JveC5nZXRXaWR0aCgpICsgKCAyNCAtIG5Ib3Zlckhvcml6b250YWxQYWRkaW5nICk7DQoJdmFyIG5TcGFjZVJpZ2h0ID0gZG9jdW1lbnQudmlld3BvcnQuZ2V0V2lkdGgoKSAtIGJveFJpZ2h0Vmlld3BvcnQ7DQoJdmFyIG5TcGFjZUxlZnQgPSBwYXJzZUludCggaG92ZXIuc3R5bGUubGVmdCApIC0gaG92ZXIuZ2V0V2lkdGgoKTsNCglpZiAoIGJveFJpZ2h0Vmlld3BvcnQgPiBkb2N1bWVudC52aWV3cG9ydC5nZXRXaWR0aCgpICYmIG5TcGFjZUxlZnQgPiBuU3BhY2VSaWdodCkNCgl7DQoJCQkJaG92ZXIuc3R5bGUubGVmdCA9ICggcGFyc2VJbnQoIGhvdmVyLnN0eWxlLmxlZnQgKSAtIGhvdmVyLmdldFdpZHRoKCkgKyBuSG92ZXJIb3Jpem9udGFsUGFkZGluZyApICsgJ3B4JzsNCgl9DQoJZWxzZQ0KCXsNCgkJCQlob3Zlci5zdHlsZS5sZWZ0ID0gKCBwYXJzZUludCggaG92ZXIuc3R5bGUubGVmdCApICsgcGFyc2VJbnQoIGVsZW0uZ2V0RGltZW5zaW9ucygpLndpZHRoICkgLSBuSG92ZXJIb3Jpem9udGFsUGFkZGluZyApICsgJ3B4JzsNCgl9DQoNCgl2YXIgblRvcEFkanVzdG1lbnQgPSAwOw0KDQoJCQlpZiAoIGVsZW0uZ2V0RGltZW5zaW9ucygpLmhlaWdodCA8IDk4ICkNCgkJblRvcEFkanVzdG1lbnQgPSAgZWxlbS5nZXREaW1lbnNpb25zKCkuaGVpZ2h0IC8gMiAtIDQ5Ow0KCWhvdmVyLnN0eWxlLnRvcCA9ICggKCBwYXJzZUludCggaG92ZXIuc3R5bGUudG9wICkgLSAxMyApICsgblRvcEFkanVzdG1lbnQgKSArICdweCc7DQoNCgl2YXIgYm94VG9wVmlld3BvcnQgPSBlbGVtLnZpZXdwb3J0T2Zmc2V0KCkudG9wICsgblRvcEFkanVzdG1lbnQ7DQoJaWYgKCBib3hUb3BWaWV3cG9ydCArIGhvdmVyX2JveC5nZXRIZWlnaHQoKSArIDggPiBkb2N1bWVudC52aWV3cG9ydC5nZXRIZWlnaHQoKSApDQoJew0KCQl2YXIgblZpZXdwb3J0QWRqdXN0bWVudCA9ICggaG92ZXJfYm94LmdldEhlaWdodCgpICsgOCApIC0gKCBkb2N1bWVudC52aWV3cG9ydC5nZXRIZWlnaHQoKSAtIGJveFRvcFZpZXdwb3J0ICk7DQoJCQkJblZpZXdwb3J0QWRqdXN0bWVudCA9IE1hdGgubWluKCBob3Zlcl9ib3guZ2V0SGVpZ2h0KCkgLSA3NCwgblZpZXdwb3J0QWRqdXN0bWVudCApOw0KCQlob3Zlci5zdHlsZS50b3AgPSAoIHBhcnNlSW50KCBob3Zlci5zdHlsZS50b3AgKSAtIG5WaWV3cG9ydEFkanVzdG1lbnQgKSArICdweCc7DQoJfQ0KDQoJaG92ZXIuaGlkZSgpOw0KCWhvdmVyLnN0eWxlLnZpc2liaWxpdHkgPSAnJzsNCg0KCWhvdmVyLnNob3coKTsNCn0NCg0KZnVuY3Rpb24gVG9nZ2xlTW9kYWxNZWRpYURldGFpbHMoKQ0Kew0KCWlmICggJCgnTW9kYWxEZXRhaWxzQ29udGFpbmVyJykudmlzaWJsZSgpICkNCgl7DQoJCSQoJ01vZGFsRGV0YWlsc0NvbnRhaW5lcicpLmhpZGUoKTsNCgkJJCgnU2hvd01vZGFsQ29tbWVudHNBbmREZXRhaWxzQnRuJykuc2hvdygpOw0KCQkkKCdIaWRlTW9kYWxDb21tZW50c0FuZERldGFpbHNCdG4nKS5oaWRlKCk7DQoJfQ0KCWVsc2UNCgl7DQoJCSQoJ01vZGFsRGV0YWlsc0NvbnRhaW5lcicpLnNob3coKTsNCgkJJCgnU2hvd01vZGFsQ29tbWVudHNBbmREZXRhaWxzQnRuJykuaGlkZSgpOw0KCQkkKCdIaWRlTW9kYWxDb21tZW50c0FuZERldGFpbHNCdG4nKS5zaG93KCk7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBUb2dnbGVQb3B1cFZpc2liaWxpdHkoIHBvcHVwSWQsIGJ1dHRvbklkICkNCnsNCglpZiAoICQocG9wdXBJZCkudmlzaWJsZSgpICkNCgl7DQoJCUhpZGVXaXRoRmFkZSggJChwb3B1cElkKSApOw0KCQkkKGJ1dHRvbklkKS5yZW1vdmVDbGFzc05hbWUoICd0b2dnbGVkJyApOw0KCX0NCgllbHNlDQoJew0KCQlTaG93V2l0aEZhZGUoICQocG9wdXBJZCkgKTsNCgkJJChidXR0b25JZCkuYWRkQ2xhc3NOYW1lKCAndG9nZ2xlZCcgKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIEhpZGVHcmVlbmxpZ2h0Q2FsbG91dCgpDQp7DQoJJCgnR3JlZW5saWdodF9DYWxsb3V0JykuaGlkZSgpOw0KCVNldENvb2tpZSgnaGlkZUdyZWVubGlnaHRDYWxsb3V0JywgMSwgMzY1LCAnLycpOw0KfQ0KDQpmdW5jdGlvbiB0b2dnbGVBdXRvUGxheSgpDQp7DQoJdmFyIGJ1dHRvbiA9ICQoJ3dvcmtzaG9wX2F1dG9wbGF5Jyk7DQoJdmFyIHZhbHVlPSJmYWxzZSI7DQoNCglpZiggYnV0dG9uLmhhc0NsYXNzTmFtZSgndG9nZ2xlZCcpICkNCgl7DQoJCXZhbHVlID0gInRydWUiOw0KCQlidXR0b24ucmVtb3ZlQ2xhc3NOYW1lKCd0b2dnbGVkJyk7DQoJfSBlbHNlIHsNCgkJdmFsdWUgPSAiZmFsc2UiOw0KCQlidXR0b24uYWRkQ2xhc3NOYW1lKCd0b2dnbGVkJyk7DQoJfQ0KDQoJdmFyIGV4ZGF0ZT1uZXcgRGF0ZSgpOw0KCWV4ZGF0ZS5zZXREYXRlKGV4ZGF0ZS5nZXREYXRlKCkgKyAzNjUpOw0KCXZhciBjX3ZhbHVlPWVzY2FwZSh2YWx1ZSkgKyAiOyBleHBpcmVzPSIrZXhkYXRlLnRvVVRDU3RyaW5nKCk7DQoJZG9jdW1lbnQuY29va2llPSJiR2FtZUhpZ2hsaWdodEF1dG9wbGF5RGlzYWJsZWQ9IiArIGNfdmFsdWU7DQp9DQoNCmZ1bmN0aW9uIFNob3dFbmxhcmdlZEltYWdlUHJldmlldyggaW1hZ2VVUkwgKQ0Kew0KCXZhciBlbmxhcmdlZEltYWdlID0gJEooICc8aW1nLz4nLCB7aWQ6ICdlbmxhcmdlZF9pbWFnZV9jYXJvdXNlbCcsIHNyYzppbWFnZVVSTCB9ICk7DQoJdmFyIERpYWxvZyA9IFNob3dEaWFsb2coICcnLCBlbmxhcmdlZEltYWdlLnNob3coKSApOw0KDQoJCQlFdmVudC5vYnNlcnZlKCAnZW5sYXJnZWRfaW1hZ2VfY2Fyb3VzZWwnLCAnbG9hZCcsIGZ1bmN0aW9uKCkgeyBEaWFsb2cuQWRqdXN0U2l6aW5nKCk7IH0gKTsNCg0KCXJldHVybiBmYWxzZTsNCn0NCg0KZnVuY3Rpb24gU2hvd0VubGFyZ2VkSW1hZ2VQcmV2aWV3RnJvbUhpZ2hsaWdodFBsYXllciggaWQsIEhpZ2hsaWdodFBsYXllciApDQp7DQoJdmFyIHJnU2NyZWVuc2hvdHMgPSBIaWdobGlnaHRQbGF5ZXIuR2V0RnVsbFNjcmVlbnNob3RVUkxzKCk7DQoJdmFyIHJnU2NyZWVuc2hvdFVSTHMgPSBbXTsNCgl2YXIgaUN1ckluZGV4ID0gMDsNCglmb3IgKCB2YXIgaSA9IDA7IGkgPCByZ1NjcmVlbnNob3RzLmxlbmd0aDsgKytpICkNCgl7DQoJCXZhciBpdGVtID0gcmdTY3JlZW5zaG90c1tpXTsNCgkJcmdTY3JlZW5zaG90VVJMcy5wdXNoKCBpdGVtLnVybCApOw0KCQlpZiAoIGl0ZW0ucHJldmlld2lkID09IGlkICkNCgkJCWlDdXJJbmRleCA9IGk7DQoJfQ0KDQoJdmFyIGNvbnRlbnQgPSAkSiggJzxkaXYvPicsIHsgY2xhc3M6ICdlbmxhcmdlZF9pbWFnZV92aWV3ZXInIH0gKTsNCgl2YXIgY29udGFpbmVyID0gJEooICc8ZGl2Lz4nLCB7IGNsYXNzOiAnZW5sYXJnZWRfaW1hZ2VfY29udGFpbmVyJyB9ICk7DQoJdmFyIGVubGFyZ2VkSW1hZ2UgPSAkSiggJzxpbWcvPicsIHsgY2xhc3M6ICdlbmxhcmdlZF9pbWFnZScsIHNyYzogcmdTY3JlZW5zaG90VVJMc1tpZF0gfSApOw0KCWNvbnRhaW5lci5hcHBlbmQoIGVubGFyZ2VkSW1hZ2UgKTsNCgljb250ZW50LmFwcGVuZCggY29udGFpbmVyICk7DQoNCgl2YXIgJEZvb3RlciA9ICAkSignPGRpdi8+JywgeydjbGFzcyc6ICdwb3B1cF9tb2RhbF9mb290ZXInIH0gKTsNCgl2YXIgJFNjcmVlbnNob3RDb3VudCA9ICRKKCc8ZGl2Lz4nKTsNCg0KCXZhciAkQnRuUHJldiA9ICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ2J0bnY2X2JsdWVfaG92ZXJmYWRlIGJ0bl9tZWRpdW0gcHJldmlvdXMnfSkuYXBwZW5kKCAkSignPHNwYW4vPicpLnRleHQoICdQcmV2aW91cycgKSApOw0KCXZhciAkQnRuTmV4dCA9ICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ2J0bnY2X2JsdWVfaG92ZXJmYWRlIGJ0bl9tZWRpdW0gbmV4dCd9KS5hcHBlbmQoICRKKCc8c3Bhbi8+JykudGV4dCggJ05leHQnICkgKTsNCg0KCWVubGFyZ2VkSW1hZ2UubG9hZCggZnVuY3Rpb24oKSB7DQoJCWVubGFyZ2VkSW1hZ2Uuc3RvcCgpOw0KCQllbmxhcmdlZEltYWdlLmZhZGVUbyggJ2Zhc3QnLCAxLjAgKTsNCgl9ICk7DQoNCgl2YXIgZm5TaG93U2NyZWVuc2hvdCA9IGZ1bmN0aW9uKCBpbmRleCApDQoJew0KCQllbmxhcmdlZEltYWdlLnN0b3AoKTsNCgkJZW5sYXJnZWRJbWFnZS5mYWRlVG8oICdmYXN0JywgMC4xICk7DQoJCWVubGFyZ2VkSW1hZ2UuYXR0ciggJ3NyYycsIHJnU2NyZWVuc2hvdFVSTHNbaW5kZXhdICk7DQoJfTsNCgl2YXIgZm5OZXh0U2NyZWVuc2hvdCA9IGZ1bmN0aW9uKCkgew0KCQlpQ3VySW5kZXggPSAoIGlDdXJJbmRleCArIDEgKSAlIHJnU2NyZWVuc2hvdFVSTHMubGVuZ3RoOw0KCQlmblNob3dTY3JlZW5zaG90KCBpQ3VySW5kZXggKTsNCgkJZm5VcGRhdGVGb290ZXIoKTsNCgl9Ow0KCXZhciBmblByZXZTY3JlZW5zaG90ID0gZnVuY3Rpb24oKSB7DQoJCWlDdXJJbmRleCA9ICggaUN1ckluZGV4IC0gMSArIHJnU2NyZWVuc2hvdFVSTHMubGVuZ3RoICkgJSByZ1NjcmVlbnNob3RVUkxzLmxlbmd0aDsNCgkJZm5TaG93U2NyZWVuc2hvdCggaUN1ckluZGV4ICk7DQoJCWZuVXBkYXRlRm9vdGVyKCk7DQoJfTsNCgl2YXIgZm5VcGRhdGVGb290ZXIgPSBmdW5jdGlvbigpDQoJew0KCQkkU2NyZWVuc2hvdENvdW50LnRleHQoICclMSRzIG9mICUyJHMgSW1hZ2VzJy5yZXBsYWNlKCAvJTFcJHMvLCBpQ3VySW5kZXggKyAxICkucmVwbGFjZSggLyUyXCRzLywgcmdTY3JlZW5zaG90VVJMcy5sZW5ndGggKSApOw0KCX07DQoNCgllbmxhcmdlZEltYWdlLmNsaWNrKCBmbk5leHRTY3JlZW5zaG90ICk7DQoJJEJ0bk5leHQuY2xpY2soIGZuTmV4dFNjcmVlbnNob3QgKTsNCgkkQnRuUHJldi5jbGljayggZm5QcmV2U2NyZWVuc2hvdCApOw0KDQoNCgkkRm9vdGVyLmFwcGVuZCggJEJ0blByZXYsICRTY3JlZW5zaG90Q291bnQsICRCdG5OZXh0ICk7DQoJY29udGVudC5hcHBlbmQoICRGb290ZXIgKTsNCg0KCWZuU2hvd1NjcmVlbnNob3QoIGlDdXJJbmRleCApOw0KCWZuVXBkYXRlRm9vdGVyKCk7DQoNCglIaWdobGlnaHRQbGF5ZXIuUGF1c2VDeWNsZSgpOw0KDQoJJEooZG9jdW1lbnQpLm9uKCdrZXlkb3duLldvcmtzaG9wSW1hZ2VzJywgZnVuY3Rpb24oIGV2ZW50ICkgew0KCQlpZiAoIGV2ZW50LndoaWNoID09IDM3IC8qIGxlZnQgKi8gfHwgZXZlbnQud2hpY2ggPT0gMzggLyogdXAgKi8gKQ0KCQl7DQoJCQlmblByZXZTY3JlZW5zaG90KCk7DQoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KCQl9DQoJCWVsc2UgaWYgKCBldmVudC53aGljaCA9PSAzOSAvKiByaWdodCAqLyB8fCBldmVudC53aGljaCA9PSA0MCAvKiBkb3duICovIHx8IGV2ZW50LndoaWNoID09IDMyIC8qIHNwYWNlYmFyICovICkNCgkJew0KCQkJZm5OZXh0U2NyZWVuc2hvdCgpOw0KCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsNCgkJfQ0KCX0pOw0KDQoJdmFyIERpYWxvZyA9IFNob3dEaWFsb2coICcnLCBjb250ZW50ICkuZG9uZSggKCkgPT4gew0KCSAgICBIaWdobGlnaHRQbGF5ZXIuUmVzdW1lQ3ljbGUoKTsNCgkJJEooZG9jdW1lbnQpLm9mZigna2V5ZG93bi5Xb3Jrc2hvcEltYWdlcycpOw0KCX0gKTsNCg0KDQoNCglyZXR1cm4gZmFsc2U7DQp9DQoNCnZhciBiUmV0cmlldmVkRnJpZW5kc1BpY2tlciA9IGZhbHNlOw0KdmFyIGdGcmllbmRzUGlja2VyID0gbnVsbDsNCmZ1bmN0aW9uIFNob3dDb250cmlidXRvckRpYWxvZyggcHVibGlzaGVkZmlsZWlkICkNCnsNCgl2YXIgd2FpdERpYWxvZyA9IFNob3dCbG9ja2luZ1dhaXREaWFsb2coICdNYW5hZ2UgQ29udHJpYnV0b3JzJywgJ0xvYWRpbmcgRnJpZW5kcyBMaXN0JyApOw0KDQoJJEouZ2V0KCAiaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vc2hhcmVkZmlsZXMvY29udHJpYnV0b3JwaWNrZXIvIiArIHB1Ymxpc2hlZGZpbGVpZCwNCgkJe30sDQoJCWZ1bmN0aW9uKCBkYXRhLCB0ZXh0U3RhdHVzLCBqcVhIUiApIHsNCgkJCXdhaXREaWFsb2cuRGlzbWlzcygpOw0KCQkJZ0ZyaWVuZHNQaWNrZXIgPSBTaG93QWxlcnREaWFsb2coICdNYW5hZ2UgQ29udHJpYnV0b3JzJywgJzxkaXYgY2xhc3M9ImZyaWVuZHNQaWNrZXIiIGlkPSJmcmllbmRzUGlja2VyIj4nICsgZGF0YSArICc8L2Rpdj4nLCAnQ2FuY2VsJyApOw0KCQl9DQoJKTsNCn0NCg0KZnVuY3Rpb24gQWRkQ29udHJpYnV0b3IoIHN0ZWFtaWQsIHByb2ZpbGVOYW1lLCBhdmF0YXJMaW5rICkNCnsNCgl2YXIgb3B0aW9ucyA9IHsNCgkJbWV0aG9kOiAncG9zdCcsDQoJCXBvc3RCb2R5OiAnc3RlYW1pZD0nICsgc3RlYW1pZCArICcmc2Vzc2lvbmlkPScgKyBnX3Nlc3Npb25JRCArICcmaWQ9JyArIHB1Ymxpc2hlZGZpbGVpZCwNCgkJb25TdWNjZXNzOiAoZnVuY3Rpb24ocHVibGlzaGVkZmlsZWlkKXsNCgkJCXJldHVybiBmdW5jdGlvbih0cmFuc3BvcnQpDQoJCQl7DQoJCQkJZ0ZyaWVuZHNQaWNrZXIuRGlzbWlzcygpOw0KDQoJCQkJdmFyIHJlc3BvbnNlSlNPTiA9IHRyYW5zcG9ydC5yZXNwb25zZUpTT047DQoJCQkJc3dpdGNoICggcmVzcG9uc2VKU09OLnN1Y2Nlc3MgKQ0KCQkJCXsNCgkJCQkJY2FzZSAxOg0KCQkJCQkJLy8gR3JleSBvdXQgbW9kYWwgb3Igc2hvdyBzcGlubmVyPw0KCQkJCQkJbG9jYXRpb24ucmVsb2FkKCk7DQoJCQkJCQlicmVhazsNCgkJCQkJZGVmYXVsdDoNCgkJCQkJCVNob3dBbGVydERpYWxvZyggJ0Vycm9yJywgJ1RoZSBzcGVjaWZpZWQgcHJvZmlsZSBjb3VsZCBub3QgYmUgZm91bmQuJyApOw0KCQkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJfQ0KCQl9KHB1Ymxpc2hlZGZpbGVpZCkpDQoJfTsNCgluZXcgQWpheC5SZXF1ZXN0KA0KCQknaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vc2hhcmVkZmlsZXMvYWRkY29udHJpYnV0b3InLA0KCQlvcHRpb25zDQoJKTsNCg0KfQ0KDQpmdW5jdGlvbiBSZW1vdmVDb250cmlidXRvciggc3RlYW1pZCwgcHJvZmlsZU5hbWUsIGF2YXRhckxpbmsgKQ0Kew0KCXZhciBvcHRpb25zID0gew0KCQltZXRob2Q6ICdwb3N0JywNCgkJcG9zdEJvZHk6ICdzdGVhbWlkPScgKyBzdGVhbWlkICsgJyZzZXNzaW9uaWQ9JyArIGdfc2Vzc2lvbklEICsgJyZpZD0nICsgcHVibGlzaGVkZmlsZWlkLA0KCQlvblN1Y2Nlc3M6IChmdW5jdGlvbihwdWJsaXNoZWRmaWxlaWQpew0KCQkJcmV0dXJuIGZ1bmN0aW9uKHRyYW5zcG9ydCkNCgkJCXsNCgkJCQl2YXIganNvbiA9IHRyYW5zcG9ydC5yZXNwb25zZVRleHQuZXZhbEpTT04oKTsNCg0KCQkJCS8vIEdyZXkgb3V0IG1vZGFsIG9yIHNob3cgc3Bpbm5lcj8NCgkJCQlnRnJpZW5kc1BpY2tlci5EaXNtaXNzKCk7DQoJCQkJbG9jYXRpb24ucmVsb2FkKCk7DQoJCQl9DQoJCX0ocHVibGlzaGVkZmlsZWlkKSkNCgl9Ow0KCW5ldyBBamF4LlJlcXVlc3QoDQoJCSdodHRwczovL3N0ZWFtY29tbXVuaXR5LmNvbS9zaGFyZWRmaWxlcy9yZW1vdmVjb250cmlidXRvcicsDQoJCW9wdGlvbnMNCgkpOw0KDQp9DQoNCmZ1bmN0aW9uIEFjY2VwdFNwbGl0KCBwdWJsaXNoZWRmaWxlaWQgKQ0Kew0KCXZhciBvcHRpb25zID0gew0KCQltZXRob2Q6ICdwb3N0JywNCgkJcG9zdEJvZHk6ICdpZD0nICsgcHVibGlzaGVkZmlsZWlkICsgJyZzZXNzaW9uaWQ9JyArIGdfc2Vzc2lvbklELA0KCQlvblN1Y2Nlc3M6IChmdW5jdGlvbihwdWJsaXNoZWRmaWxlaWQpew0KCQkJcmV0dXJuIGZ1bmN0aW9uKHRyYW5zcG9ydCkNCgkJCXsNCgkJCQlsb2NhdGlvbi5yZWxvYWQoKTsNCgkJCX0NCgkJfShwdWJsaXNoZWRmaWxlaWQpKQ0KCX07DQoJbmV3IEFqYXguUmVxdWVzdCgNCgkJJ2h0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL3NoYXJlZGZpbGVzL2FjY2VwdHNwbGl0JywNCgkJb3B0aW9ucw0KCSk7DQoNCn0NCg0KZnVuY3Rpb24gRmluYWxpemVDb250cmlidXRvcnMoIHB1Ymxpc2hlZGZpbGVpZCApDQp7DQoJaWYgKCBjb25maXJtKCAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGZpbmFsaXplIHRoZSBjb250cmlidXRvcnM/IFlvdSB3aWxsIGJlIHVuYWJsZSB0byBhZGQgb3IgcmVtb3ZlIHRoZW0gYWZ0ZXIgdGhpcyBzdGVwLicgKSAhPSB0cnVlICkNCgl7DQoJCXJldHVybjsNCgl9DQoNCgl2YXIgb3B0aW9ucyA9IHsNCgkJbWV0aG9kOiAncG9zdCcsDQoJCXBvc3RCb2R5OiAnaWQ9JyArIHB1Ymxpc2hlZGZpbGVpZCArICcmc2Vzc2lvbmlkPScgKyBnX3Nlc3Npb25JRCwNCgkJb25TdWNjZXNzOiAoZnVuY3Rpb24ocHVibGlzaGVkZmlsZWlkKXsNCgkJCXJldHVybiBmdW5jdGlvbih0cmFuc3BvcnQpDQoJCQl7DQoJCQkJbG9jYXRpb24ucmVsb2FkKCk7DQoJCQl9DQoJCX0ocHVibGlzaGVkZmlsZWlkKSkNCgl9Ow0KCW5ldyBBamF4LlJlcXVlc3QoDQoJCSdodHRwczovL3N0ZWFtY29tbXVuaXR5LmNvbS9zaGFyZWRmaWxlcy9maW5hbGl6ZWNvbnRyaWJ1dG9ycycsDQoJCW9wdGlvbnMNCgkpOw0KfQ0KDQpmdW5jdGlvbiBLVlByb21wdCggdGl0bGUsIGRlc2NyaXB0aW9uLCBrZXksIHZhbHVlICkNCnsNCgkkKCdQcm9tcHRUaXRsZScpLmlubmVySFRNTCA9IHRpdGxlIDsNCgkkKCdQcm9tcHREZXNjcmlwdGlvbicpLmlubmVySFRNTCA9IGRlc2NyaXB0aW9uIDsNCgkkKCdQcm9tcHRWYWx1ZScpLnZhbHVlID0gdmFsdWU7DQoJJCgnUHJvbXB0VmFsdWUnKS5uYW1lID0ga2V5Ow0KCXNob3dNb2RhbCgnUHJvbXB0TW9kYWwnKTsNCn0NCg0KZnVuY3Rpb24gSGlnaGxpZ2h0U2VhcmNoVGV4dCggdGV4dCwgZWxlbSApDQp7DQoJaWYgKCEoZWxlbSBpbnN0YW5jZW9mIE5vZGUpIHx8IGVsZW0ubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKQ0KCQlyZXR1cm47DQoNCgl2YXIgY2hpbGRyZW4gPSBlbGVtLmNoaWxkTm9kZXM7DQoNCglmb3IgKHZhciBpPTA7IGNoaWxkcmVuW2ldOyArK2kpDQoJew0KCQlub2RlID0gY2hpbGRyZW5baV07DQoNCgkJaWYgKG5vZGUubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUgKQ0KCQl7DQoJCQl2YXIgc3RyRXNjYXBlZCA9ICRKKCc8ZGl2PicpLnRleHQobm9kZS5ub2RlVmFsdWUpLmh0bWwoKTsNCgkJCXN0clJlcGxhY2UgPSBzdHJFc2NhcGVkLnJlcGxhY2UoIG5ldyBSZWdFeHAoJygnICsgdGV4dC5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csICJcXCQmIikgICsgJyknLCAnZ2knICksICc8c3BhbiBjbGFzcz0ic2VhcmNoZWRGb3JUZXh0Ij4kMTwvc3Bhbj4nKTsNCgkJCWVsZVJlcGxhY2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCgkJCWVsZVJlcGxhY2UuaW5uZXJIVE1MID0gc3RyUmVwbGFjZTsNCg0KCQkJd2hpbGUoIGVsZVJlcGxhY2UuZmlyc3RDaGlsZCApDQoJCQkJbm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlUmVwbGFjZS5maXJzdENoaWxkLCBub2RlICk7DQoNCgkJCW5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggbm9kZSApOw0KCQl9DQoJCWVsc2UgaWYgKCBub2RlLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFICkNCgkJCUhpZ2hsaWdodFNlYXJjaFRleHQodGV4dCwgbm9kZSk7DQoJfQ0KfQ0KDQp2YXIgZ0V4dGVybmFsVGFnU2VsZWN0b3JXYWl0RGlhbG9nID0gbnVsbDsNCg0KZnVuY3Rpb24gU2hvd0V4dGVybmFsVGFnU2VsZWN0b3JEaWFsb2dfT25Mb2FkKCkNCnsNCglpZiAoIGdFeHRlcm5hbFRhZ1NlbGVjdG9yV2FpdERpYWxvZyApDQoJew0KCQlnRXh0ZXJuYWxUYWdTZWxlY3RvcldhaXREaWFsb2cuRGlzbWlzcygpOw0KCQlnRXh0ZXJuYWxUYWdTZWxlY3RvcldhaXREaWFsb2cgPSBudWxsOw0KCX0NCgkkKCAnRXh0ZXJuYWxUYWdTZWxlY3RvckRpYWxvZ0lGcmFtZScgKS5zaG93KCk7DQp9DQoNCmZ1bmN0aW9uIFNob3dFeHRlcm5hbFRhZ1NlbGVjdG9yRGlhbG9nKCB1cmwsIGZvcm1JRCwgc3VibWl0RnVuY0NCICkNCnsNCglpZiAoIGdFeHRlcm5hbFRhZ1NlbGVjdG9yV2FpdERpYWxvZyApDQoJew0KCQlnRXh0ZXJuYWxUYWdTZWxlY3RvcldhaXREaWFsb2cuRGlzbWlzcygpOw0KCQlnRXh0ZXJuYWxUYWdTZWxlY3RvcldhaXREaWFsb2cgPSBudWxsOw0KCX0NCglnRXh0ZXJuYWxUYWdTZWxlY3RvcldhaXREaWFsb2cgPSBTaG93QmxvY2tpbmdXYWl0RGlhbG9nKCAnUGxlYXNlIFdhaXQnLCAnTG9hZGluZyBvcHRpb25zLi4uJyApOw0KDQoJJCggJ0V4dGVybmFsVGFnU2VsZWN0b3JEaWFsb2dJRnJhbWUnICkuaGlkZSgpOw0KCSQoICdFeHRlcm5hbFRhZ1NlbGVjdG9yRGlhbG9nSUZyYW1lJyApLnNyYyA9IHVybDsNCglzaG93TW9kYWwoICdFeHRlcm5hbFRhZ1NlbGVjdG9yRGlhbG9nJyApOw0KDQoJTGlzdGVuVG9JRnJhbWVNZXNzYWdlKA0KCQlmdW5jdGlvbiggZXZlbnQgKSB7DQoJCQl2YXIgYWxsb3dlZEhvc3ROYW1lID0gJ2h0dHBzOi8vJyArIGdldEhvc3RuYW1lKCB1cmwgKTsNCgkJCWlmICggZXZlbnQub3JpZ2luICE9PSBhbGxvd2VkSG9zdE5hbWUgKQ0KCQkJCXJldHVybjsNCg0KCQkJdmFyIG1zZyA9IGV2ZW50LmRhdGEuZXZhbEpTT04oKTsNCg0KCQkJdmFyIG1zZ1R5cGUgPSBtc2dbJ21ldGhvZCddOw0KDQoJCQlzd2l0Y2goIG1zZ1R5cGUgKQ0KCQkJew0KCQkJCWNhc2UgJ3Jlc2l6ZSc6DQoJCQkJew0KCQkJCQl2YXIgaGVpZ2h0ID0gbXNnWydoZWlnaHQnXTsNCgkJCQkJdmFyIHdpZHRoID0gbXNnWyd3aWR0aCddOw0KCQkJCQkvLyBzaG93IHRoZSBpZnJhbWUgYW5kIHNpemUgaXQNCgkJCQkJJCggJ0V4dGVybmFsVGFnU2VsZWN0b3JEaWFsb2dJRnJhbWUnICkuc2hvdygpOw0KCQkJCQkkKCAnRXh0ZXJuYWxUYWdTZWxlY3RvckRpYWxvZ0lGcmFtZScgKS5lZmZlY3QgPSBuZXcgRWZmZWN0Lk1vcnBoKCAnRXh0ZXJuYWxUYWdTZWxlY3RvckRpYWxvZ0lGcmFtZScsIHsgZHVyYXRpb246IDAuMiwgc3R5bGU6ICdoZWlnaHQ6ICcgKyBoZWlnaHQgKyAncHg7IHdpZHRoOiAnICsgd2lkdGggKyAncHgnIH0gKTsNCgkJCQkJLy8gY2VudGVyIHRoZSBkaWFsb2cgdmVydGljYWxseSBhbmQgc2l6ZSBpdA0KCQkJCQl2YXIgZmxJbnZlcnNlWm9vbSA9IDEgLyAoZG9jdW1lbnQuYm9keS5zdHlsZS56b29tIHx8IDEpOw0KCQkJCQl2YXIgdyA9IGRvY3VtZW50LnZpZXdwb3J0LmdldFdpZHRoKCkgKiBmbEludmVyc2Vab29tOw0KCQkJCQl2YXIgaCA9IGRvY3VtZW50LnZpZXdwb3J0LmdldEhlaWdodCgpICogZmxJbnZlcnNlWm9vbTsNCgkJCQkJdmFyIHNsID0gZG9jdW1lbnQudmlld3BvcnQuZ2V0U2Nyb2xsT2Zmc2V0cygpLmxlZnQ7DQoJCQkJCXZhciBzdCA9IGRvY3VtZW50LnZpZXdwb3J0LmdldFNjcm9sbE9mZnNldHMoKS50b3A7DQoJCQkJCXZhciBjdyA9IHdpZHRoOw0KCQkJCQl2YXIgY2ggPSBoZWlnaHQ7DQoJCQkJCXZhciBuZXdUb3AgPSAoTWF0aC5mbG9vcigoaCAvIDIpIC0gKGhlaWdodCAvIDIpKSArIHN0KTsNCgkJCQkJdmFyIG5ld0xlZnQgPSAoTWF0aC5mbG9vcigodyAvIDIpIC0gKGN3IC8gMikpICsgc2wpOw0KCQkJCQkkKCAnRXh0ZXJuYWxUYWdTZWxlY3RvckRpYWxvZycgKS5lZmZlY3QgPSBuZXcgRWZmZWN0Lk1vcnBoKCAnRXh0ZXJuYWxUYWdTZWxlY3RvckRpYWxvZycsIHsgZHVyYXRpb246IDAuMiwgc3R5bGU6ICdoZWlnaHQ6ICcgKyBoZWlnaHQgKyAncHg7IHdpZHRoOiAnICsgd2lkdGggKyAncHg7IHRvcDogJyArIG5ld1RvcCArICdweDsgbGVmdDogJyArIG5ld0xlZnQgKyAncHg7JyB9ICk7DQoJCQkJfQ0KCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSAnc2V0ZmlsdGVyJzoNCgkJCQl7DQoJCQkJCXZhciB0YWdzID0gbXNnWyd0YWdzJ107DQoNCgkJCQkJdmFyIGlucHV0RmllbGRzID0gJCggZm9ybUlEICkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0Jyk7DQoJCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IGlucHV0RmllbGRzLmxlbmd0aDsgKytpICkNCgkJCQkJew0KCQkJCQkJdmFyIGlucHV0ID0gaW5wdXRGaWVsZHNbaV07DQoJCQkJCQlpZiAoIGlucHV0LmNoZWNrZWQgPT09IHRydWUgKQ0KCQkJCQkJew0KCQkJCQkJCWlucHV0LmNoZWNrZWQgPSBmYWxzZTsNCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IHRhZ3MubGVuZ3RoOyArK2kgKQ0KCQkJCQl7DQoJCQkJCQl2YXIgZWxlbSA9IG5ldyBFbGVtZW50KCAnaW5wdXQnLCB7ICduYW1lJyA6ICJyZXF1aXJlZHRhZ3NbXSIsICd2YWx1ZScgOiB0YWdzW2ldLCAnY2hlY2tlZCcgOiAndHJ1ZScgfSApOw0KCQkJCQkJJCggZm9ybUlEICkuYXBwZW5kQ2hpbGQoIGVsZW0gKTsNCgkJCQkJfQ0KDQoJCQkJCXN1Ym1pdEZ1bmNDQigpOw0KCQkJCX0NCgkJCQlicmVhazsNCgkJCX0gLy8gc3dpdGNoDQoJCX0NCgkpDQp9DQoNCmZ1bmN0aW9uIEluY2x1ZGVUYWcoIGVsZW0gKQ0Kew0KCWlmICggZWxlbS5jaGVja2VkICkNCgl7DQoJCXZhciBleGNsdWRlZFRhZyA9ICRKKCAnI2V4Y2x1ZGV0YWdfJyArIGVsZW0uaWQgKTsNCgkJZXhjbHVkZWRUYWcucmVtb3ZlQ2xhc3MoICdjaGVja2VkJyApOw0KCX0NCg0KCUZpbHRlckJ5VGFncygpOw0KfQ0KDQpmdW5jdGlvbiBFeGNsdWRlVGFnKCBlbGVtICkNCnsNCgllbGVtID0gJEooIGVsZW0gKTsNCgllbGVtLnRvZ2dsZUNsYXNzKCAnY2hlY2tlZCcgKTsNCg0KCXZhciB0YWdDaGVja2JveCA9ICRKKCAiIyIgKyBlbGVtLmRhdGEoICd0YWdpZCcgKSApOw0KCWlmICggZWxlbS5oYXNDbGFzcyggJ2NoZWNrZWQnICkgKQ0KCXsNCgkJdGFnQ2hlY2tib3hbMF0uY2hlY2tlZCA9IGZhbHNlOw0KCX0NCg0KCUZpbHRlckJ5VGFncygpOw0KfQ0KDQovKioNCiAqIFNlcnZpY2UgUHJvdmlkZXIgUmV2ZW51ZSBTaGFyaW5nDQogKi8NCnZhciBnU2VydmljZVByb3ZpZGVyUmV2ZW51ZVNsaWRlcnMgPSBBcnJheSgpOw0KDQpmdW5jdGlvbiBQaWNrV29ya3Nob3BTZXJ2aWNlUHJvdmlkZXJzKCBwdWJsaXNoZWRGaWxlSUQsIGFwcElEICkNCnsNCgkvLyBwYXNzIHRocm91Z2ggY3VycmVudCB2YWx1ZXMNCgl2YXIgc3BsaXRzID0gQXJyYXkoKTsNCglmb3IgKCB2YXIgaSA9IDA7IGkgPCBnU2VydmljZVByb3ZpZGVyUmV2ZW51ZVNsaWRlcnMubGVuZ3RoOyArK2kgKQ0KCXsNCgkJdmFyIHNsaWRlciA9IGdTZXJ2aWNlUHJvdmlkZXJSZXZlbnVlU2xpZGVyc1tpXTsNCgkJc3BsaXRzLnB1c2goIHsgJ3N0ZWFtaWQnIDogc2xpZGVyLkdldFN0ZWFtSUQoKSwgJ3NwbGl0JyA6IHNsaWRlci5HZXRWYWx1ZSgpIH0gKTsNCgl9DQoNCgkkSi5wb3N0KCAnaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vc2hhcmVkZmlsZXMvYWpheGdldHNlcnZpY2Vwcm92aWRlcnMnLCB7DQoJCQknaWQnIDogcHVibGlzaGVkRmlsZUlELA0KCQkJJ2FwcGlkJyA6IGFwcElELA0KCQkJJ3NwbGl0cycgOiBzcGxpdHMsDQoJCQknc2Vzc2lvbmlkJyA6IGdfc2Vzc2lvbklEDQoJCX0NCgkpLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZSApIHsNCgkJdmFyIHN0clRpdGxlID0gJ1NlbGVjdCBzZXJ2aWNlIHByb3ZpZGVycyc7DQoJCXZhciBzdHJTYXZlQ2hhbmdlcyA9ICdDb250aW51ZSc7DQoJCXZhciBzdHJEZXNjcmlwdGlvbiA9IHJlc3BvbnNlOw0KCQl2YXIgZGlhbG9nID0gU2hvd0NvbmZpcm1EaWFsb2coIHN0clRpdGxlLCBzdHJEZXNjcmlwdGlvbiwgc3RyU2F2ZUNoYW5nZXMgKTsNCg0KCQlkaWFsb2cuU2V0UmVtb3ZlQ29udGVudE9uRGlzbWlzc2FsKCBmYWxzZSApOw0KDQoJCWRpYWxvZy5kb25lKCBmdW5jdGlvbigpIHsNCgkJCS8vIGJ1aWxkIGxpc3Qgb2Ygc2VydmljZSBwcm92aWRlcnMNCgkJCXZhciBzZXJ2aWNlX3Byb3ZpZGVycyA9IEFycmF5KCk7DQoJCQl2YXIgY2hlY2tib3hlcyA9IGRpYWxvZy5HZXRDb250ZW50KCkuZmluZCgnaW5wdXRbdHlwZT0iY2hlY2tib3giXScpOw0KCQkJdmFyIGV4aXN0aW5nVmFsdWVzID0gZGlhbG9nLkdldENvbnRlbnQoKS5maW5kKCdpbnB1dFt0eXBlPSJoaWRkZW4iXScpOw0KCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgY2hlY2tib3hlcy5sZW5ndGg7ICsraSApDQoJCQl7DQoJCQkJdmFyIGNoZWNrYm94ID0gY2hlY2tib3hlc1tpXTsNCgkJCQlpZiAoIGNoZWNrYm94LmNoZWNrZWQgKQ0KCQkJCXsNCgkJCQkJc2VydmljZV9wcm92aWRlcnMucHVzaCggeyAnc3RlYW1pZCcgOiBjaGVja2JveC52YWx1ZSwgJ3NwbGl0JyA6IGV4aXN0aW5nVmFsdWVzW2ldLnZhbHVlIH0gKTsNCgkJCQl9DQoJCQl9DQoNCgkJCS8vIGdldCBleGlzdGluZyByZXZlbnVlIHNwbGl0cywgYWRkaW5nIG5ldyBhbmQgcmVtb3Zpbmcgb2xkDQoJCQkkSi5wb3N0KCAnaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vc2hhcmVkZmlsZXMvYWpheGdldHNlcnZpY2Vwcm92aWRlcnNwbGl0cycsIHsNCgkJCQkJJ2lkJyA6IHB1Ymxpc2hlZEZpbGVJRCwNCgkJCQkJJ3Nlc3Npb25pZCcgOiBnX3Nlc3Npb25JRCwNCgkJCQkJJ3NlcnZpY2VfcHJvdmlkZXJzJyA6IHNlcnZpY2VfcHJvdmlkZXJzLA0KCQkJCQknb3ZlcnJpZGUnIDogdHJ1ZQ0KCQkJCX0NCgkJCSkuZG9uZSggZnVuY3Rpb24oIHJlc3BvbnNlICkgew0KCQkJCWdTZXJ2aWNlUHJvdmlkZXJSZXZlbnVlU2xpZGVycyA9IEFycmF5KCk7DQoJCQkJJEooJyNTZXJ2aWNlUHJvdmlkZXJzJykucmVwbGFjZVdpdGgoIHJlc3BvbnNlICk7DQoJCQl9KTsNCg0KCQkJZGlhbG9nLkdldENvbnRlbnQoKS5yZW1vdmUoKTsNCgkJfSk7DQoNCgkJZGlhbG9nLmZhaWwoIGZ1bmN0aW9uKCkgew0KCQkJZGlhbG9nLkdldENvbnRlbnQoKS5yZW1vdmUoKTsNCgkJfSk7DQoJfSApOw0KfQ0KDQp2YXIgZ05vcm1hbGl6aW5nU2VydmljZVByb3ZpZGVyUmV2ZW51ZVNsaWRlcnMgPSBmYWxzZTsNCg0KZnVuY3Rpb24gTm9ybWFsaXplU2VydmljZVByb3ZpZGVyUmV2ZW51ZSggY2hhbmdpbmdTbGlkZXIgKQ0Kew0KCWlmICggZ05vcm1hbGl6aW5nU2VydmljZVByb3ZpZGVyUmV2ZW51ZVNsaWRlcnMgKQ0KCQlyZXR1cm47DQoNCglnTm9ybWFsaXppbmdTZXJ2aWNlUHJvdmlkZXJSZXZlbnVlU2xpZGVycyA9IHRydWU7DQoJdmFyIHRvdGFsID0gMDsNCglmb3IgKCB2YXIgaSA9IDA7IGkgPCBnU2VydmljZVByb3ZpZGVyUmV2ZW51ZVNsaWRlcnMubGVuZ3RoOyArK2kgKQ0KCXsNCgkJdmFyIHNsaWRlciA9IGdTZXJ2aWNlUHJvdmlkZXJSZXZlbnVlU2xpZGVyc1tpXTsNCgkJdG90YWwgKz0gc2xpZGVyLkdldFZhbHVlKCk7DQoJfQ0KCXdoaWxlICggdG90YWwgPiAxMDAgKQ0KCXsNCgkJZm9yICggdmFyIGkgPSAwOyBpIDwgZ1NlcnZpY2VQcm92aWRlclJldmVudWVTbGlkZXJzLmxlbmd0aCAmJiB0b3RhbCA+IDEwMDsgKytpICkNCgkJew0KCQkJdmFyIHNsaWRlciA9IGdTZXJ2aWNlUHJvdmlkZXJSZXZlbnVlU2xpZGVyc1tpXTsNCgkJCWlmICggY2hhbmdpbmdTbGlkZXIgIT0gc2xpZGVyICkNCgkJCXsNCgkJCQl2YXIgdmFsdWUgPSBzbGlkZXIuR2V0VmFsdWUoKTsNCgkJCQlpZiAoIHZhbHVlID4gMCApDQoJCQkJew0KCQkJCQlzbGlkZXIuU2V0VmFsdWUoIHZhbHVlIC0gMSApOw0KCQkJCQl0b3RhbCAtPSAxOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCglnTm9ybWFsaXppbmdTZXJ2aWNlUHJvdmlkZXJSZXZlbnVlU2xpZGVycyA9IGZhbHNlOw0KfQ0KDQpmdW5jdGlvbiBTYXZlV29ya3Nob3BTZXJ2aWNlUHJvdmlkZXJzKCBwdWJsaXNoZWRGaWxlSUQgKQ0Kew0KCXZhciBzcGxpdHMgPSBBcnJheSgpOw0KCXZhciB0b3RhbCA9IDA7DQoJZm9yICggdmFyIGkgPSAwOyBpIDwgZ1NlcnZpY2VQcm92aWRlclJldmVudWVTbGlkZXJzLmxlbmd0aDsgKytpICkNCgl7DQoJCXZhciBzbGlkZXIgPSBnU2VydmljZVByb3ZpZGVyUmV2ZW51ZVNsaWRlcnNbaV07DQoJCXNwbGl0cy5wdXNoKCB7ICdzdGVhbWlkJyA6IHNsaWRlci5HZXRTdGVhbUlEKCksICdwZXJjZW50YWdlJyA6IHNsaWRlci5HZXRWYWx1ZSgpIH0gKTsNCgkJdG90YWwgKz0gc2xpZGVyLkdldFZhbHVlKCk7DQoJfQ0KCWlmICggdG90YWwgIT0gMCAmJiB0b3RhbCAhPSAxMDAgKQ0KCXsNCgkJU2hvd0FsZXJ0RGlhbG9nKCAnRXJyb3InLCAnVGhlIHNlcnZpY2UgcHJvdmlkZXIgcmV2ZW51ZSBwZXJjZW50YWdlcyBtdXN0IHRvdGFsIHVwIHRvIDEwMC4nICk7DQoJCXJldHVybjsNCgl9DQoNCgkkSiggIiNTYXZpbmdTZXJ2aWNlUHJvdmlkZXJSZXZlbnVlU2hhcmVzIiApLnNob3coKTsNCgkkSiggIiNTYXZlZFNlcnZpY2VQcm92aWRlclJldmVudWVTaGFyZXMiICkuaGlkZSgpOw0KDQoJJEoucG9zdCggJ2h0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL3NoYXJlZGZpbGVzL2FqYXhzZXRzZXJ2aWNlcHJvdmlkZXJzcGxpdHMnLCB7DQoJCQknaWQnIDogcHVibGlzaGVkRmlsZUlELA0KCQkJJ3NwbGl0cycgOiBzcGxpdHMsDQoJCQknc2Vzc2lvbmlkJyA6IGdfc2Vzc2lvbklEDQoJCX0NCgkpLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZSApIHsNCgkJJEooICIjU2F2aW5nU2VydmljZVByb3ZpZGVyUmV2ZW51ZVNoYXJlcyIgKS5oaWRlKCk7DQoJCSRKKCAiI1NhdmVkU2VydmljZVByb3ZpZGVyUmV2ZW51ZVNoYXJlcyIgKS5zaG93KCk7DQoJfSApLmZhaWwoIGZ1bmN0aW9uKCBqcXhociApIHsNCgkJdmFyIHJnUmVzdWx0cyA9IGpxeGhyLnJlc3BvbnNlVGV4dC5ldmFsSlNPTigpOw0KCQlzd2l0Y2ggKCByZ1Jlc3VsdHNbJ3N1Y2Nlc3MnXSApDQoJCXsNCgkJCWNhc2UgMTQ6DQoJCQkJU2hvd0FsZXJ0RGlhbG9nKCAnRXJyb3InLCAnWW91IGNhbm5vdCBjaG9vc2UgYSB0aGlyZCBwYXJ0eSBvcmdhbml6YXRpb24gdGhhdCBpcyBhbHNvIGEgbm9ybWFsIGNvbnRyaWJ1dG9yIG9uIHlvdXIgaXRlbS4nICk7DQoJCQkJYnJlYWs7DQoJCQlkZWZhdWx0Og0KCQkJCVNob3dBbGVydERpYWxvZyggJ0Vycm9yJywgJ0FuIGVycm9yIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSBwcm9jZXNzaW5nIHlvdXIgcmVxdWVzdDonICsgJyAnICsgcmdSZXN1bHRzWydzdWNjZXNzJ10gKTsNCgkJCQlicmVhazsNCgkJfQ0KCQkkSiggIiNTYXZpbmdTZXJ2aWNlUHJvdmlkZXJSZXZlbnVlU2hhcmVzIiApLmhpZGUoKTsNCgl9KTsNCn0NCg0KdmFyIFNlcnZpY2VQcm92aWRlclJldmVudWVTbGlkZXIgPSBDbGFzcy5jcmVhdGUoIHsNCgltX3N0ZWFtSUQ6IG51bGwsDQoJbV9lbGVtU2xpZGVyOiBudWxsLA0KCW1fZWxlbVNsaWRlckJHRmlsbDogbnVsbCwNCgltX2VsZW1JbnB1dDogbnVsbCwNCgltX2VsZW1EaXNwbGF5OiBudWxsLA0KCW1fc2xpZGVyOiBudWxsLA0KDQoJaW5pdGlhbGl6ZTogZnVuY3Rpb24oIGFyZ3MgKQ0KCXsNCgkJdGhpcy5tX3N0ZWFtSUQgPSBhcmdzLnN0ZWFtSUQ7DQoJCXRoaXMubV9lbGVtU2xpZGVyID0gJCggYXJncy5lbGVtU2xpZGVyICk7DQoJCXRoaXMubV9lbGVtU2xpZGVyQkdGaWxsID0gJCggYXJncy5lbGVtU2xpZGVyQkdGaWxsICk7DQoJCXRoaXMubV9lbGVtSW5wdXQgPSAkKCBhcmdzLmVsZW1JbnB1dCApOw0KCQl0aGlzLm1fZWxlbURpc3BsYXkgPSAkKCBhcmdzLmVsZW1EaXNwbGF5ICk7DQoJCXRoaXMubV9zbGlkZXIgPSBuZXcgQ29udHJvbC5TbGlkZXIoDQoJCQl0aGlzLm1fZWxlbVNsaWRlci5kb3duKCcuaGFuZGxlJyksDQoJCQl0aGlzLm1fZWxlbVNsaWRlciwNCgkJCXsNCgkJCQlyYW5nZTogJFIoIDAsIDEwMCApLA0KCQkJCXNsaWRlclZhbHVlOiBhcmdzLnNwbGl0LA0KCQkJCWluY3JlbWVudDogMSwNCgkJCQlvblNsaWRlOiB0aGlzLlNsaWRlck9uQ2hhbmdlLmJpbmQoIHRoaXMgKSwNCgkJCQlvbkNoYW5nZTogdGhpcy5TbGlkZXJPbkNoYW5nZS5iaW5kKCB0aGlzICkNCgkJCX0NCgkJKTsNCg0KCQl0aGlzLm1fZWxlbVNsaWRlckJHRmlsbC5zdHlsZS53aWR0aCA9IGFyZ3Muc3BsaXQgKyAnJSc7DQoNCgkJZ1NlcnZpY2VQcm92aWRlclJldmVudWVTbGlkZXJzLnB1c2goIHRoaXMgKTsNCgl9LA0KDQoJU2xpZGVyT25DaGFuZ2U6IGZ1bmN0aW9uKCB2YWx1ZSApDQoJew0KCQl2YWx1ZSA9IE1hdGguY2VpbCggdmFsdWUgKTsNCgkJdGhpcy5tX2VsZW1JbnB1dC52YWx1ZSA9IHZhbHVlOw0KCQl0aGlzLm1fZWxlbURpc3BsYXkuaW5uZXJIVE1MID0gdmFsdWUgKyAnJSc7DQoJCXRoaXMubV9lbGVtU2xpZGVyQkdGaWxsLnN0eWxlLndpZHRoID0gdmFsdWUgKyAnJSc7DQoJCU5vcm1hbGl6ZVNlcnZpY2VQcm92aWRlclJldmVudWUoIHRoaXMgKTsNCgl9LA0KDQoJR2V0U3RlYW1JRDogZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHRoaXMubV9zdGVhbUlEOw0KCX0sDQoNCglHZXRWYWx1ZTogZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuIHBhcnNlSW50KCB0aGlzLm1fZWxlbUlucHV0LnZhbHVlICk7DQoJfSwNCg0KCVNldFZhbHVlOiBmdW5jdGlvbiggdmFsdWUgKQ0KCXsNCgkJaWYgKCB2YWx1ZSAhPSB0aGlzLkdldFZhbHVlKCkgKQ0KCQl7DQoJCQl0aGlzLm1fc2xpZGVyLnNldFZhbHVlKCB2YWx1ZSApOw0KCQkJdGhpcy5tX2VsZW1JbnB1dC52YWx1ZSA9IHZhbHVlOw0KCQkJdGhpcy5tX2VsZW1EaXNwbGF5LmlubmVySFRNTCA9IHZhbHVlICsgJyUnOw0KCQkJdGhpcy5tX2VsZW1TbGlkZXJCR0ZpbGwuc3R5bGUud2lkdGggPSB2YWx1ZSArICclJzsNCgkJfQ0KCX0NCn0gKTsNCg0KDQovLyBlbmFibGUgc2Vla2luZyB2aWEgZHBhZA0KZnVuY3Rpb24gR2FtZXBhZFlvdVR1YmVWaWRlb09uRGlyZWN0aW9uKCBldmVudCAvKiBHYW1lcGFkRXZlbnQgKi8sIHl0cGxheWVyICkNCnsNCgkvLyBvbmx5IGhhbmRsZSB0aGUgbmF2aWdhdGlvbiBpZiB3ZSdyZSBpbiBmdWxsc2NyZWVuDQoJaWYgKCB5dHBsYXllciAmJiAoIGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnQgKSApDQoJew0KCQljb25zdCBuUG9zaXRpb25TdGVwID0gMTA7DQoJCWlmICggZXZlbnQuZGV0YWlsLmJ1dHRvbiA9PSAxMSAmJiB5dHBsYXllci5nZXRDdXJyZW50VGltZSgpID4gMCApIC8vIGxlZnQNCgkJCXl0cGxheWVyLnNlZWtUbyggTWF0aC5tYXgoIHl0cGxheWVyLmdldEN1cnJlbnRUaW1lKCkgLSBuUG9zaXRpb25TdGVwLCAwICkgKTsNCgkJZWxzZSBpZiAoIGV2ZW50LmRldGFpbC5idXR0b24gPT0gMTIgJiYgeXRwbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKSA8IHl0cGxheWVyLmdldER1cmF0aW9uKCkgKSAvLyByaWdodA0KCQkJeXRwbGF5ZXIuc2Vla1RvKCBNYXRoLm1pbiggeXRwbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKSArIG5Qb3NpdGlvblN0ZXAsIHl0cGxheWVyLmdldER1cmF0aW9uKCkgKSApOw0KDQoJCXJldHVybiB0cnVlOyAvLyByZXR1cm4gdHJ1ZSBmb3IgbW92ZXVwLCBtb3ZlZG93biB0byBwcmV2ZW50IGRwYWQgbmF2aWdhdGlvbiBvdXQgb2YgdGhlIHZpZGVvDQoJfQ0KDQoJcmV0dXJuIGZhbHNlOyAvLyBhbGxvdyBldmVudCB0byBwcm9wb2dhdGUNCn0NCg0KZnVuY3Rpb24gR2FtZXBhZFlvdVR1YmVWaWRlb09uQ2FuY2VsKCB5dHBsYXllciApDQp7DQoJLy8gaWYgd2UncmUgaW4gZnVsbHNjcmVlbiBwYXVzZSB0aGUgdmlkZW8gYW5kIGV4aXQgZnVsbHNjcmVlbg0KCWlmICggZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudCApDQoJew0KCQlHYW1lcGFkWW91VHViZVZpZGVvUGF1c2UoIHl0cGxheWVyICk7DQoJCUdhbWVwYWRZb3VUdWJlVmlkZW9TZXRGdWxsc2NyZWVuKCB5dHBsYXllciwgZmFsc2UgKTsNCgkJcmV0dXJuIHRydWU7DQoJfQ0KDQoJcmV0dXJuIGZhbHNlOyAvLyBhbGxvdyBldmVudCB0byBwcm9wYWdhdGUNCn0NCg0KZnVuY3Rpb24gR2FtZXBhZFlvdVR1YmVWaWRlb1NldEZ1bGxzY3JlZW4oIHl0cGxheWVyLCBiRnVsbHNjcmVlbiApDQp7DQoJdmFyIHZpZGVvSUZyYW1lID0geXRwbGF5ZXIuZ2V0SWZyYW1lKCk7DQoNCglpZiAoIGJGdWxsc2NyZWVuICkNCgl7DQoJCWlmICggIWRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50ICYmICFkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCAmJiAhZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQgJiYgIWRvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnQgKQ0KCQl7DQoJCQlpZiAoIHZpZGVvSUZyYW1lLnJlcXVlc3RGdWxsc2NyZWVuICkgew0KCQkJCXZpZGVvSUZyYW1lLnJlcXVlc3RGdWxsc2NyZWVuKCkuY2F0Y2goICggZSApID0+IHsgY29uc29sZS5lcnJvciggInJlcXVlc3RGdWxsc2NyZWVuIGV4Y2VwdGlvbjoiLCBlICk7IH0gKTsNCgkJCX0gZWxzZSBpZiAoIHZpZGVvSUZyYW1lLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuICkgew0KCQkJCXZpZGVvSUZyYW1lLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKCkuY2F0Y2goICggZSApID0+IHsgY29uc29sZS5lcnJvciggIndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuIGV4Y2VwdGlvbiIsIGUgKTsgfSApOw0KCQkJfSBlbHNlIGlmICggdmlkZW8ubW96UmVxdWVzdEZ1bGxTY3JlZW4gKSB7DQoJCQkJdmlkZW9JRnJhbWUubW96UmVxdWVzdEZ1bGxTY3JlZW4oKS5jYXRjaCggKCBlICkgPT4geyBjb25zb2xlLmVycm9yKCAibW96UmVxdWVzdEZ1bGxTY3JlZW4gZXhjZXB0aW9uIiwgZSApOyB9ICk7DQoJCQl9IGVsc2UgaWYgKCB2aWRlby5tc1JlcXVlc3RGdWxsc2NyZWVuICkgew0KCQkJCXZpZGVvSUZyYW1lLm1zUmVxdWVzdEZ1bGxzY3JlZW4oKS5jYXRjaCggKCBlICkgPT4geyBjb25zb2xlLmVycm9yKCAibXNSZXF1ZXN0RnVsbHNjcmVlbiBleGNlcHRpb24iLCBlICk7IH0gKTsNCgkJCX0NCgkJfQ0KCX0NCgllbHNlIGlmICggZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudCApDQoJew0KCQlpZiAoIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuICkgew0KCQkJZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKS5jYXRjaCggKCBlICkgPT4geyBjb25zb2xlLmVycm9yKCAiZXhpdEZ1bGxzY3JlZW4gZXhjZXB0aW9uOiIsIGUgKTsgfSApOw0KCQl9IGVsc2UgaWYgKCBkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbiApIHsNCgkJCWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCkuY2F0Y2goICggZSApID0+IHsgY29uc29sZS5lcnJvciggIndlYmtpdEV4aXRGdWxsc2NyZWVuIGV4Y2VwdGlvbiIsIGUgKTsgfSApOw0KCQl9IGVsc2UgaWYgKCBkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuICkgew0KCQkJZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpLmNhdGNoKCAoIGUgKSA9PiB7IGNvbnNvbGUuZXJyb3IoICJtb3pDYW5jZWxGdWxsU2NyZWVuIGV4Y2VwdGlvbiIsIGUgKTsgfSApOw0KCQl9IGVsc2UgaWYgKCBkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuICkgew0KCQkJZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpLmNhdGNoKCAoIGUgKSA9PiB7IGNvbnNvbGUuZXJyb3IoICJtc1JlcXVlc3RGdWxsc2NyZWVuIGV4Y2VwdGlvbiIsIGUgKTsgfSApOw0KCQl9DQoNCgkJLy8gbWFrZSBzdXJlIHdlIHNjcm9sbCB0byB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHZpZGVvDQoJCXNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHsgdmlkZW9JRnJhbWUuc2Nyb2xsSW50b1ZpZXcoKSB9LCAwICk7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBHYW1lcGFkWW91VHViZVZpZGVvUGF1c2UoIHl0cGxheWVyICkNCnsNCgl5dHBsYXllci5wYXVzZVZpZGVvKCk7DQp9DQoNCmZ1bmN0aW9uIEdhbWVwYWRZb3VUdWJlVmlkZW9Ub2dnbGVQbGF5KCB5dHBsYXllciApDQp7DQoJaWYgKCB5dHBsYXllci5nZXRQbGF5ZXJTdGF0ZSgpICE9IDEgKQ0KCXsNCgkJeXRwbGF5ZXIucGxheVZpZGVvKCk7DQoJCUdhbWVwYWRZb3VUdWJlVmlkZW9TZXRGdWxsc2NyZWVuKCB5dHBsYXllciwgdHJ1ZSApOw0KCX0NCgllbHNlDQoJew0KCQl5dHBsYXllci5wYXVzZVZpZGVvKCk7DQoJfQ0KfQ0KZnVuY3Rpb24gR2FtZXBhZFlvdVR1YmVWaWRlb1RvZ2dsZU11dGUoIHl0cGxheWVyICkNCnsNCglpZiAoIHl0cGxheWVyLmlzTXV0ZWQoKSApDQoJew0KCQl5dHBsYXllci51bk11dGUoKTsNCgl9DQoJZWxzZQ0KCXsNCgkJeXRwbGF5ZXIubXV0ZSgpOw0KCX0NCn0NCg0KZnVuY3Rpb24gRGVsZXRlU2F2ZWRXb3Jrc2hvcFNlYXJjaFF1ZXJ5KCBhcHBpZCwgcXVlcnlpZCApDQp7DQoJdmFyIGRpYWxvZyA9IFNob3dDb25maXJtRGlhbG9nKCAnRGVsZXRlJywgJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBzYXZlZCBzZWFyY2ggcXVlcnk/JyApOw0KCWRpYWxvZy5kb25lKCBmdW5jdGlvbigpIHsNCgkJJEoucG9zdCggJ2h0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL3NoYXJlZGZpbGVzL2FqYXhzYXZlZHdlYnF1ZXJ5ZGVsZXRlJywgeyAnc2Vzc2lvbmlkJyA6IGdfc2Vzc2lvbklELCAnYXBwaWQnOiBhcHBpZCwgJ3F1ZXJ5aWQnOiBxdWVyeWlkIH0gKQ0KCQkuZG9uZSggZnVuY3Rpb24oKSB7DQoJCQl0b3AubG9jYXRpb24ucmVsb2FkKCk7DQoJCX0gKS5mYWlsKCBmdW5jdGlvbigpIHsNCgkJCVNob3dBbGVydERpYWxvZyggJ0Vycm9yJywgJ0ZhaWxlZCB0byBkZWxldGUgeW91ciBzYXZlZCBzZWFyY2ggcXVlcnkuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJyApOw0KCQl9ICk7DQoJfSApOw0KfQ0KDQoNCmZ1bmN0aW9uIFNhdmVXb3Jrc2hvcFNlYXJjaFF1ZXJ5KCBhcHBpZCwgcGFyYW1zICkNCnsNCgkkSi5nZXQoICdodHRwczovL3N0ZWFtY29tbXVuaXR5LmNvbS9zaGFyZWRmaWxlcy9hamF4c2F2ZWR3ZWJxdWVyaWVzZ2V0LycsIHsgYXBwaWQ6IGFwcGlkIH0gKQ0KCQkuZG9uZSggZnVuY3Rpb24oIGpzb24gKSB7DQoJCWlmICgganNvbi5zdWNjZXNzICE9ICcxJyApDQoJCXsNCgkJCVNob3dBbGVydERpYWxvZyggJ0Vycm9yJywgJ1VuYWJsZSB0byByZXRyaWV2ZSB5b3VyIHNhdmVkIHNlYXJjaCBxdWVyaWVzIScgKTsNCgkJCXJldHVybjsNCgkJfQ0KDQoJCXBhcmFtc1snc2Vzc2lvbmlkJ10gPSBnX3Nlc3Npb25JRDsNCgkJcGFyYW1zWydhcHBpZCddID0gYXBwaWQ7DQoJCXBhcmFtc1sncXVlcnlpZCddID0gMDsNCg0KCQl2YXIgcmdNb2RhbFBhcmFtcyA9IHsgJ2lucHV0TWF4U2l6ZSc6IDQ1IH07DQoJCXZhciBkaWFsb2cgPSBTaG93UHJvbXB0RGlhbG9nKCAnU2F2ZSBZb3VyIFNlYXJjaCBRdWVyeScsICdZb3VyIHNlYXJjaCBxdWVyeSBuYW1lOicsICdTYXZlIFF1ZXJ5JywgbnVsbCwgcmdNb2RhbFBhcmFtcyApOw0KCQl2YXIgaW5wdXQgPSBkaWFsb2cubV8kQ29udGVudC5maW5kKCAnaW5wdXQnICk7DQoJCWlucHV0LnNlbGVjdCgpOw0KDQoJCWlmICgganNvbi5xdWVyaWVzICYmIGpzb24ucXVlcmllcy5sZW5ndGggIT0gMCApDQoJCXsNCgkJCXZhciBjb250YWluZXIgPSAkSiggJzxkaXYvPicsIHsgY2xhc3M6ICduZXdtb2RhbF9wcm9tcHRfZGVzY3JpcHRpb24gc2F2ZWRfd29ya3Nob3BfcXVlcnlfZGlhbG9nJyB9ICk7DQoJCQljb250YWluZXIuYXBwZW5kKCAkSiggJzxkaXYvPicsIHsgdGV4dDogJ1NlbGVjdCBhbiBleGlzdGluZyBzZWFyY2ggcXVlcnkgdG8gdXBkYXRlIGl0LicgfSApICk7DQoNCgkJCXZhciBxdWVyaWVzID0gJEooICc8ZGl2Lz4nICk7DQoJCQl2YXIgc2VsZWN0ID0gJEooICc8c2VsZWN0Lz4nICk7DQoJCQlzZWxlY3Qub24oICdjaGFuZ2UnLCBmdW5jdGlvbigpIHsNCgkJCQlwYXJhbXNbJ3F1ZXJ5aWQnXSA9IHRoaXMudmFsdWU7DQoJCQkJaWYgKCB0aGlzLnZhbHVlICE9IDAgKQ0KCQkJCXsNCgkJCQkJdmFyIHNlbGVjdGVkVGV4dCA9ICRKKCB0aGlzICkuZmluZCgib3B0aW9uOnNlbGVjdGVkIikudGV4dCgpOw0KCQkJCQlpbnB1dC52YWwoIHNlbGVjdGVkVGV4dCApOw0KCQkJCX0NCgkJCX0gKTsNCg0KCQkJdmFyIG5ld09wdGlvbiA9ICRKKCAnPG9wdGlvbi8+JywgeyB2YWx1ZTogMCwgdGV4dDogJzxOZXcgU2F2ZWQgU2VhcmNoPicgfSApOw0KCQkJc2VsZWN0LmFwcGVuZCggbmV3T3B0aW9uICk7DQoJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBqc29uLnF1ZXJpZXMubGVuZ3RoOyArK2kgKQ0KCQkJew0KCQkJCXZhciBxdWVyeSA9IGpzb24ucXVlcmllc1tpXTsNCgkJCQl2YXIgb3B0aW9uID0gJEooICc8b3B0aW9uLz4nLCB7IHZhbHVlOiBxdWVyeS5xdWVyeWlkLCB0ZXh0OiBxdWVyeS5xdWVyeV9uYW1lIH0gKTsNCgkJCQlzZWxlY3QuYXBwZW5kKCBvcHRpb24gKTsNCgkJCX0NCg0KCQkJcXVlcmllcy5hcHBlbmQoICRKKCAiPGJyLz4iICkgKTsNCgkJCXF1ZXJpZXMuYXBwZW5kKCBzZWxlY3QgKTsNCg0KCQkJY29udGFpbmVyLmFwcGVuZCggcXVlcmllcyApOw0KCQkJaW5wdXQucGFyZW50KCkucGFyZW50KCkuYXBwZW5kKCBjb250YWluZXIgKTsNCgkJfQ0KDQoJCWRpYWxvZy5kb25lKCBmdW5jdGlvbiggcXVlcnlOYW1lICkgew0KCQkJcXVlcnlOYW1lID0gdl90cmltKCBxdWVyeU5hbWUgKTsNCgkJCWlmICggcXVlcnlOYW1lLmxlbmd0aCA9PSAwICkNCgkJCQlyZXR1cm47DQoNCgkJCXBhcmFtc1sncXVlcnlOYW1lJ10gPSBxdWVyeU5hbWU7DQoNCgkJCSRKLnBvc3QoICdodHRwczovL3N0ZWFtY29tbXVuaXR5LmNvbS9zaGFyZWRmaWxlcy9hamF4c2F2ZWR3ZWJxdWVyeXVwZGF0ZScsIHBhcmFtcyApDQoJCQkJLmRvbmUoIGZ1bmN0aW9uKCkgew0KCQkJCQlTaG93QWxlcnREaWFsb2coICdTYXZlZCEnLCAnU2F2ZWQgeW91ciBzZWFyY2ggcXVlcnknICk7DQoJCQkJfSApLmZhaWwoIGZ1bmN0aW9uKCkgew0KCQkJCVNob3dBbGVydERpYWxvZyggJ0Vycm9yJywgJ1RoZXJlIHdhcyBhIHByb2JsZW0gdHJ5aW5nIHRvIHNhdmUgeW91ciBzZWFyY2ggcXVlcnkuICBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicgKTsNCgkJCX0gKTsNCgkJfSApOw0KDQoJfSApOw0KfQ0KDQpmdW5jdGlvbiBQdWJsaXNoZWRGaWxlX1Nob3dNb3JlQXdhcmRzKCBlbGVtICkNCnsNCgllbGVtID0gJEooIGVsZW0gKTsNCgl2YXIgY29udGFpbmVyID0gZWxlbS5jbG9zZXN0KCAiLnJldmlld19hd2FyZF9jdG4iICk7DQoJY29udGFpbmVyLmFkZENsYXNzKCAic2hvd19hbGxfYXdhcmRzIiApOw0KfQ0KDQo8L3NjcmlwdD4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCmZ1bmN0aW9uIFZvdGVVcChpdGVtX2lkKQ0Kew0KCXNob3dNb2RhbCggJ05vdExvZ2dlZEluV2FybmluZycsIHRydWUgKTsNCn0NCg0KZnVuY3Rpb24gVm90ZURvd24oaXRlbV9pZCkNCnsNCglzaG93TW9kYWwoICdOb3RMb2dnZWRJbldhcm5pbmcnLCB0cnVlICk7DQp9DQoNCmZ1bmN0aW9uIFZvdGVMYXRlcihpdGVtX2lkKQ0Kew0KCXNob3dNb2RhbCggJ05vdExvZ2dlZEluV2FybmluZycsIHRydWUgKTsNCn0NCg0KZnVuY3Rpb24gUmVwb3J0SXRlbSgpDQp7DQoJc2hvd01vZGFsKCAnTm90TG9nZ2VkSW5XYXJuaW5nJywgdHJ1ZSApOw0KfQ0KDQpmdW5jdGlvbiBTdWJzY3JpYmVJdGVtKCkNCnsNCglzaG93TW9kYWwoICdOb3RMb2dnZWRJbldhcm5pbmcnLCB0cnVlICk7DQp9DQoNCmZ1bmN0aW9uIFN1YnNjcmliZUlubGluZUl0ZW0oIGlkLCBhcHBJRCApDQp7DQoJc2hvd01vZGFsKCAnTm90TG9nZ2VkSW5XYXJuaW5nJywgdHJ1ZSApOw0KfQ0KDQpmdW5jdGlvbiBGYXZvcml0ZUl0ZW0oKQ0Kew0KCXNob3dNb2RhbCggJ05vdExvZ2dlZEluV2FybmluZycsIHRydWUgKTsNCn0NCg0KZnVuY3Rpb24gRm9sbG93SXRlbShpdGVtX2lkLCBhcHBfaWQpDQp7DQoJc2hvd01vZGFsKCAnTm90TG9nZ2VkSW5XYXJuaW5nJywgdHJ1ZSApOw0KfQ0KDQpmdW5jdGlvbiBTdWJzY3JpYmVDb2xsZWN0aW9uKCBpZCwgYXBwSUQgKQ0Kew0KCXNob3dNb2RhbCggJ05vdExvZ2dlZEluV2FybmluZycsIHRydWUgKTsNCn0NCg0KZnVuY3Rpb24gU3Vic2NyaWJlQ29sbGVjdGlvbkl0ZW0oIGlkLCBhcHBJRCApDQp7DQoJc2hvd01vZGFsKCAnTm90TG9nZ2VkSW5XYXJuaW5nJywgdHJ1ZSApOw0KfQ0KDQpmdW5jdGlvbiBTaG93QWRkVG9Db2xsZWN0aW9uKCBpZCwgYXBwSUQgKQ0Kew0KCXNob3dNb2RhbCggJ05vdExvZ2dlZEluV2FybmluZycsIHRydWUgKTsNCn0NCg0KZnVuY3Rpb24gUHVibGlzaGVkRmlsZUF3YXJkKCBpZCwgZmlsZVR5cGUsIGN1cnJlbnRTZWxlY3Rpb24gKQ0Kew0KCXNob3dNb2RhbCggJ05vdExvZ2dlZEluV2FybmluZycsIHRydWUgKTsNCn0NCg0KPC9zY3JpcHQ+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQp2YXIgeXRwbGF5ZXIgPSBudWxsOw0KCQkNCmZ1bmN0aW9uIHVwZGF0ZUhUTUwoZWxtSWQsIHZhbHVlKSB7DQogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsbUlkKS5pbm5lckhUTUwgPSB2YWx1ZTsNCn0NCg0KZnVuY3Rpb24gb25Zb3VUdWJlUGxheWVyUmVhZHkocGxheWVySWQpIHsNCgl2YXIgc3RyVGFyZ2V0ID0gJ21vdmllXycgKyBwbGF5ZXJJZDsNCgl5dHBsYXllciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBzdHJUYXJnZXQgKTsNCgl5dHBsYXllci5hZGRFdmVudExpc3RlbmVyKCJvblN0YXRlQ2hhbmdlIiwgIm9ueXRwbGF5ZXJTdGF0ZUNoYW5nZSIpOw0KCXl0cGxheWVyLmFkZEV2ZW50TGlzdGVuZXIoIm9uRXJyb3IiLCAib25QbGF5ZXJFcnJvciIpOw0KCS8vIGZvciBub3csIGRpc2FibGUgYXV0by1wbGF5DQoJLy9pZiAoIEJJc1VzZXJHYW1lSGlnaGxpZ2h0QXV0b3BsYXlFbmFibGVkKCkgKQ0KCXsNCgkJeXRwbGF5ZXIucGxheVZpZGVvKCk7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBvblBsYXllckVycm9yKGVycm9yQ29kZSkgew0KCU9uTW92aWVDb21wbGV0ZSgpOyAvLyBTa2lwIQ0KfQ0KDQpmdW5jdGlvbiBvbnl0cGxheWVyU3RhdGVDaGFuZ2UoIHN0YXRlICkgew0KCWlmICggc3RhdGUuZGF0YSA9PSAwICkNCgl7DQoJCU9uTW92aWVDb21wbGV0ZSgpOw0KCX0NCn0NCg0KdmFyIGdfcGxheWVyID0gbnVsbDsNCg0KZnVuY3Rpb24gT25Nb3ZpZUNvbXBsZXRlKCkNCnsNCglpZiAoIGdfcGxheWVyICkNCgl7DQoJCXNldFRpbWVvdXQoIGdfcGxheWVyLk9uTW92aWVDb21wbGV0ZS5iaW5kKCBnX3BsYXllciwgZ19wbGF5ZXIubV9hY3RpdmVJdGVtICksIDIwMDAgKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIG11dGVfc2Vzc2lvbiggYk11dGVkICkNCnsNCglTZXRHYW1lSGlnaGxpZ2h0QXVkaW9FbmFibGVkKCAhYk11dGVkICk7DQp9DQoNCmZ1bmN0aW9uIGF1dG9fcGxheSggYkVuYWJsZWQgKQ0Kew0KCVNldEdhbWVIaWdobGlnaHRBdXRvcGxheUVuYWJsZWQoIGJFbmFibGVkICk7DQp9DQoNCmZ1bmN0aW9uIEJJc1VzZXJHYW1lSGlnaGxpZ2h0QXV0b3BsYXlFbmFibGVkKCkNCnsNCglpZiggdHlwZW9mKCBiU2tpcFZpZGVvcyApICE9ICJ1bmRlZmluZWQiICYmIGJTa2lwVmlkZW9zID09IHRydWUgKQ0KCQlyZXR1cm4gZmFsc2U7DQoNCgkvLyB0aGUgY29va2llIGlzIHN0b3JlZCBhcyB0aGUgaW52ZXJzZQ0KCXZhciByZ01hdGNoZXMgPSBkb2N1bWVudC5jb29raWUubWF0Y2goIC8oXnw7ICliR2FtZUhpZ2hsaWdodEF1dG9wbGF5RGlzYWJsZWQ9KFteO10qKS8gKTsNCglyZXR1cm4gISggcmdNYXRjaGVzICYmIHJnTWF0Y2hlc1syXSA9PSAidHJ1ZSIgKTsNCn0NCg0KZnVuY3Rpb24gU2V0R2FtZUhpZ2hsaWdodEF1dG9wbGF5RW5hYmxlZCggYkVuYWJsZWQgKQ0Kew0KCXZhciBkYXRlRXhwaXJlcyA9IG5ldyBEYXRlKCk7DQoJZGF0ZUV4cGlyZXMuc2V0VGltZSggZGF0ZUV4cGlyZXMuZ2V0VGltZSgpICsgMTAwMCAqIDYwICogNjAgKiAyNCAqIDM2NSAqIDEwICk7DQoJZG9jdW1lbnQuY29va2llID0gJ2JHYW1lSGlnaGxpZ2h0QXV0b3BsYXlEaXNhYmxlZD0nICsgKCFiRW5hYmxlZCA/ICd0cnVlJyA6ICdmYWxzZScpICsgJzsgZXhwaXJlcz0nICsgZGF0ZUV4cGlyZXMudG9HTVRTdHJpbmcoKSArICc7cGF0aD0vJzsNCn0NCg0KZnVuY3Rpb24gQklzVXNlckdhbWVIaWdobGlnaHRBdWRpb0VuYWJsZWQoKQ0Kew0KCXZhciByZ01hdGNoZXMgPSBkb2N1bWVudC5jb29raWUubWF0Y2goIC8oXnw7ICliR2FtZUhpZ2hsaWdodEF1ZGlvRW5hYmxlZD0oW147XSopLyApOw0KCXJldHVybiAoIHJnTWF0Y2hlcyAmJiByZ01hdGNoZXNbMl0gPT0gInRydWUiICk7DQp9DQoNCmZ1bmN0aW9uIFNldEdhbWVIaWdobGlnaHRBdWRpb0VuYWJsZWQoIGJFbmFibGVkICkNCnsNCglkb2N1bWVudC5jb29raWUgPSAnYkdhbWVIaWdobGlnaHRBdWRpb0VuYWJsZWQ9JyArIChiRW5hYmxlZCA/ICd0cnVlJyA6ICdmYWxzZScpICsgJzsgcGF0aD0vJzsNCn0NCg0KdmFyIEhpZ2hsaWdodFBsYXllciA9IENsYXNzLmNyZWF0ZSggew0KCW1fZWxlbUNvbnRhaW5lcjogbnVsbCwNCgltX2VsZW1QbGF5ZXJBcmVhOiBudWxsLA0KCW1fZWxlbVN0cmlwOiBudWxsLA0KCW1fZWxlbVN0cmlwU2Nyb2xsOiBudWxsLA0KCW1fZWxlbVNlbGVjdG9yOiBudWxsLA0KCW1fc2xpZGVyOiBudWxsLA0KCW1fYWN0aXZlSXRlbTogbnVsbCwNCgltX3JnTW92aWVGbGFzaHZhcnM6IG51bGwsDQoJbV9yZ0RlZmF1bHRNb3ZpZUZsYXNodmFyczogbnVsbCwNCgltX3JnU2NyZWVuc2hvdFVSTHM6IG51bGwsDQoJbV9yZ0Z1bGxTY3JlZW5zaG90VVJMczogbnVsbCwNCgltX3JnU2tldGNoZmFiTW9kZWxzOiBudWxsLA0KCW1fYlZpZGVvT25seU1vZGU6IGZhbHNlLA0KICAgIG1fYlBhdXNlZDogZmFsc2UsDQoNCgltX3RpbWVySW50ZXJ2YWw6IGZhbHNlLA0KCW1fYkRpc2FibGVTbGlkZXI6IGZhbHNlLA0KDQoJaW5pdGlhbGl6ZTogZnVuY3Rpb24oIGFyZ3MgKQ0KCXsNCgkJdGhpcy5tX2VsZW1QbGF5ZXJBcmVhID0gJChhcmdzLmVsZW1QbGF5ZXJBcmVhKTsNCgkJdGhpcy5tX2VsZW1TdHJpcCA9ICQoYXJncy5lbGVtU3RyaXApOw0KCQl0aGlzLm1fZWxlbVN0cmlwU2Nyb2xsID0gJChhcmdzLmVsZW1TdHJpcFNjcm9sbCk7DQoJCXRoaXMubV9yZ01vdmllRmxhc2h2YXJzID0gYXJncy5yZ01vdmllRmxhc2h2YXJzIHx8IG5ldyBBcnJheSgpOw0KCQl0aGlzLm1fcmdTY3JlZW5zaG90VVJMcyA9IGFyZ3MucmdTY3JlZW5zaG90VVJMcyB8fCBuZXcgQXJyYXkoKTsNCgkJdGhpcy5tX3JnRnVsbFNjcmVlbnNob3RVUkxzID0gYXJncy5yZ0Z1bGxTY3JlZW5zaG90VVJMcyB8fCBuZXcgQXJyYXkoKTsNCgkJdGhpcy5tX3JnU2tldGNoZmFiTW9kZWxzID0gYXJncy5yZ1NrZXRjaGZhYk1vZGVscyB8fCBuZXcgQXJyYXkoKTsNCgkJdGhpcy5tX3JnRGVmYXVsdE1vdmllRmxhc2h2YXJzID0gJEgoIGFyZ3MucmdEZWZhdWx0TW92aWVGbGFzaHZhcnMgfHwge30gKTsNCgkJdGhpcy5tX2JWaWRlb09ubHlNb2RlID0gYXJncy5iVmlkZW9Pbmx5TW9kZTsNCg0KCQlpZiAoICF0aGlzLm1fZWxlbVN0cmlwICkNCgkJew0KCQkJcmV0dXJuOw0KCQl9DQoNCgkJLy9tYWtlIGFsbCB0aGUgc3RyaXAgaXRlbXMgY2xpY2thYmxlDQoJCXZhciB0aGlzQ2xvc3VyZSA9IHRoaXM7DQoNCgkJdGhpcy5tX2VsZW1TdHJpcC5zZWxlY3QoICcuaGlnaGxpZ2h0X3N0cmlwX2l0ZW0nICkuZWFjaCgNCgkJCQlmdW5jdGlvbihlbGVtVGh1bWIpIHsNCgkJCQkJRXZlbnQub2JzZXJ2ZSggZWxlbVRodW1iLCAnY2xpY2snLCB0aGlzQ2xvc3VyZS5IaWdobGlnaHRJdGVtLmJpbmQoIHRoaXNDbG9zdXJlLCBlbGVtVGh1bWIgKSApOw0KCQkJCQlFdmVudC5vYnNlcnZlKCBlbGVtVGh1bWIsICdmb2N1cycsIHRoaXNDbG9zdXJlLkhpZ2hsaWdodEl0ZW0uYmluZCggdGhpc0Nsb3N1cmUsIGVsZW1UaHVtYiApICk7DQoJCQkJfQ0KCQkpOw0KDQoJCXRoaXMubV9lbGVtU2VsZWN0b3IgPSB0aGlzLm1fZWxlbVN0cmlwID8gdGhpcy5tX2VsZW1TdHJpcC5kb3duKCcuaGlnaGxpZ2h0X3NlbGVjdG9yJykgOiBudWxsOw0KDQoJCXZhciBlbGVtU2xpZGVyID0gJChhcmdzLmVsZW1TbGlkZXIpOw0KCQl2YXIgblNsaWRlcldpZHRoID0gdGhpcy5tX2VsZW1TdHJpcFNjcm9sbC5nZXRXaWR0aCgpIC0gdGhpcy5tX2VsZW1TdHJpcC5nZXRXaWR0aCgpOw0KCQlpZiAoIG5TbGlkZXJXaWR0aCA+IDAgKQ0KCQl7DQoJCQl0aGlzLnNsaWRlciA9IG5ldyBDb250cm9sLlNsaWRlciggZWxlbVNsaWRlci5kb3duKCcuaGFuZGxlJyksIGVsZW1TbGlkZXIsIHsNCgkJICAgICAgICByYW5nZTogJFIoIDAsIG5TbGlkZXJXaWR0aCApLA0KCQkgICAgICAgIHNsaWRlclZhbHVlOiAwLA0KCQkgICAgICAgIG9uU2xpZGU6IHRoaXMuU2xpZGVyT25DaGFuZ2UuYmluZCggdGhpcyApLA0KCQkgICAgICAgIG9uQ2hhbmdlOiB0aGlzLlNsaWRlck9uQ2hhbmdlLmJpbmQoIHRoaXMgKQ0KCSAgICAgCX0pOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJZWxlbVNsaWRlci5oaWRlKCk7DQoJCX0NCg0KCQl2YXIgY0l0ZW1zID0gdGhpcy5tX2VsZW1QbGF5ZXJBcmVhLnNlbGVjdCggJy5oaWdobGlnaHRfcGxheWVyX2l0ZW0nICkubGVuZ3RoOw0KCQlpZiAoIGNJdGVtcyA9PSAxICkNCgkJew0KCQkJCQkJdGhpcy5tX2VsZW1TdHJpcC5oaWRlKCk7DQoJCX0NCg0KCQl0aGlzLm1fZWxlbUNvbnRhaW5lciA9ICQoYXJncy5lbGVtQ29udGFpbmVyKSB8fCB0aGlzLm1fZWxlbVBsYXllckFyZWEudXAoJy5oaWdobGlnaHRfY3RuJyk7DQoJCXRoaXMubV9lbGVtQ29udGFpbmVyLm9ic2VydmUoICdtb3VzZW92ZXInLCB0aGlzLm1vdXNlT3Zlci5iaW5kQXNFdmVudExpc3RlbmVyKCB0aGlzICkgKTsNCgkJdGhpcy5tX2VsZW1Db250YWluZXIub2JzZXJ2ZSggJ21vdXNlb3V0JywgdGhpcy5tb3VzZU91dC5iaW5kQXNFdmVudExpc3RlbmVyKCB0aGlzICkgKTsNCgkJdGhpcy5tX2VsZW1Db250YWluZXIub2JzZXJ2ZSggJ2ZvY3VzaW4nLCB0aGlzLm1vdXNlT3Zlci5iaW5kQXNFdmVudExpc3RlbmVyKCB0aGlzICkgKTsNCgkJdGhpcy5tX2VsZW1Db250YWluZXIub2JzZXJ2ZSggJ2ZvY3Vzb3V0JywgdGhpcy5tb3VzZU91dC5iaW5kQXNFdmVudExpc3RlbmVyKCB0aGlzICkgKTsNCg0KCQl2YXIgZmlyc3RJdGVtID0gJChhcmdzLmZpcnN0SXRlbSkgfHwgdGhpcy5tX2VsZW1QbGF5ZXJBcmVhLmRvd24oICcuaGlnaGxpZ2h0X3BsYXllcl9pdGVtJyApOw0KDQoNCgkJaWYgKCAhdGhpcy5tX2JWaWRlb09ubHlNb2RlICYmICFCSXNVc2VyR2FtZUhpZ2hsaWdodEF1dG9wbGF5RW5hYmxlZCgpICkNCgkJew0KCQkJZmlyc3RJdGVtID0gdGhpcy5tX2VsZW1QbGF5ZXJBcmVhLmRvd24oICcuaGlnaGxpZ2h0X3NjcmVlbnNob3QnICk7DQoJCX0NCg0KCQl0aGlzLkhpZ2hsaWdodEl0ZW0oIGZpcnN0SXRlbSApOw0KDQoJCVJlZ2lzdGVyU3RlYW1PbldlYlBhbmVsU2hvd25IYW5kbGVyKCB0aGlzLk9uV2ViUGFuZWxTaG93bi5iaW5kKCB0aGlzICkgKTsNCgkJUmVnaXN0ZXJTdGVhbU9uV2ViUGFuZWxIaWRkZW5IYW5kbGVyKCB0aGlzLk9uV2ViUGFuZWxIaWRkZW4uYmluZCggdGhpcyApICk7DQoNCgkJZ19wbGF5ZXIgPSB0aGlzOw0KCX0sDQoNCglIaWdobGlnaHRJdGVtOiBmdW5jdGlvbiggZWxlbSApDQoJew0KCQlpZiAoIHRoaXMuQklzTW92aWUoIGVsZW0gKSApDQoJCQl0aGlzLkhpZ2hsaWdodE1vdmllKCB0aGlzLkdldE1vdmllSWQoIGVsZW0gKSApOw0KCQllbHNlIGlmICggdGhpcy5CSXNTY3JlZW5zaG90KCBlbGVtICkgKQ0KCQkJdGhpcy5IaWdobGlnaHRTY3JlZW5zaG90KCB0aGlzLkdldFNjcmVlbnNob3RJZCggZWxlbSApICk7DQoJCWVsc2UgaWYgKCB0aGlzLkJJc1NrZXRjaGZhYk1vZGVsKCBlbGVtICkgKQ0KCQkJdGhpcy5IaWdobGlnaHRTa2V0Y2hmYWJNb2RlbCggdGhpcy5HZXRTa2V0Y2hmYWJNb2RlbElkKCBlbGVtICkgKTsNCg0KCQkvLyBwcmVsb2FkIHRoZSBuZXh0IHNjcmVlbnNob3QgaW4tb3JkZXINCgkJdmFyIG5leHRJdGVtID0gdGhpcy5tX2FjdGl2ZUl0ZW0ubmV4dCggJy5oaWdobGlnaHRfcGxheWVyX2l0ZW0nICk7DQoJCWlmICggbmV4dEl0ZW0gJiYgdGhpcy5CSXNTY3JlZW5zaG90KCBuZXh0SXRlbSApICkNCgkJCXRoaXMuTG9hZFNjcmVlbnNob3QoIHRoaXMuR2V0U2NyZWVuc2hvdElkKCBuZXh0SXRlbSApICk7DQoJfSwNCg0KCUhpZ2hsaWdodE1vdmllOiBmdW5jdGlvbiggaWQgKQ0KCXsNCgkJaWYgKCB0aGlzLm1fYWN0aXZlSXRlbSAmJiB0aGlzLkJJc01vdmllKCB0aGlzLm1fYWN0aXZlSXRlbSApDQoJCQkJJiYgdGhpcy5HZXRNb3ZpZUlkKCB0aGlzLm1fYWN0aXZlSXRlbSApID09IGlkICkNCgkJCXJldHVybjsNCgkJdGhpcy5Mb2FkTW92aWUoIGlkICk7DQoNCgkJdGhpcy5UcmFuc2l0aW9uVG8oICQoJ2hpZ2hsaWdodF9tb3ZpZV8nICsgaWQgKSApOw0KCQl0aGlzLkhpZ2hsaWdodFN0cmlwSXRlbSggJ3RodW1iX21vdmllXycgKyBpZCApOw0KCX0sDQoNCglIaWdobGlnaHRTY3JlZW5zaG90OiBmdW5jdGlvbiggaWQgKQ0KCXsNCgkJdGhpcy5Mb2FkU2NyZWVuc2hvdCggaWQgKTsNCg0KCQl0aGlzLlRyYW5zaXRpb25UbyggJCgnaGlnaGxpZ2h0X3NjcmVlbnNob3RfJyArIGlkKSApOw0KCQl0aGlzLkhpZ2hsaWdodFN0cmlwSXRlbSggJ3RodW1iX3NjcmVlbnNob3RfJyArIGlkICk7DQoNCgkJLy8gYWZ0ZXIgc2hvd2luZyBhdCBsZWFzdCBvbmUgc2NyZWVuc2hvdCwgc2hvdyBvbmx5IHNjcmVlbnNob3RzIGZyb20gdGhhdCBwb2ludCBvbndhcmQNCgkJdGhpcy5iU2NyZWVuc2hvdHNPbmx5ID0gdHJ1ZTsNCgkJdGhpcy5TdGFydFRpbWVyKCk7DQoJfSwNCg0KCUhpZ2hsaWdodFNrZXRjaGZhYk1vZGVsOiBmdW5jdGlvbiggaWQgKQ0KCXsNCgkJdGhpcy5Mb2FkU2tldGNoZmFiTW9kZWwoIGlkICk7DQoNCgkJdGhpcy5UcmFuc2l0aW9uVG8oICQoJ2hpZ2hsaWdodF9za2V0Y2hmYWJfbW9kZWxfJyArIGlkKSApOw0KCQl0aGlzLkhpZ2hsaWdodFN0cmlwSXRlbSggJ3RodW1iX3NrZXRjaGZhYl9tb2RlbF8nICsgaWQgKTsNCgl9LA0KDQoJTG9hZE1vdmllOiBmdW5jdGlvbiggaWQgKQ0KCXsNCgkJdmFyIHN0clRhcmdldCA9ICdtb3ZpZV8nICsgaWQ7DQoJCXZhciByZ0ZsYXNoVmFycyA9IHRoaXMubV9yZ0RlZmF1bHRNb3ZpZUZsYXNodmFycy5tZXJnZSggdGhpcy5tX3JnTW92aWVGbGFzaHZhcnNbICdtb3ZpZV8nICsgaWQgXSApLnRvT2JqZWN0KCk7DQoNCgkJaWYgKCAkKHN0clRhcmdldCkgJiYgJChzdHJUYXJnZXQpLnRhZ05hbWUgPT0gJ0RJVicgKQ0KCQl7DQoJCQlwbGF5ZXIgPSBuZXcgWVQuUGxheWVyKHN0clRhcmdldCwgew0KCQkJCWhlaWdodDogcmdGbGFzaFZhcnNbJ1NUQUdFX0hFSUdIVCddLA0KCQkJCXdpZHRoOiByZ0ZsYXNoVmFyc1snU1RBR0VfV0lEVEgnXSwNCgkJCQl2aWRlb0lkOiByZ0ZsYXNoVmFyc1snWU9VVFVCRV9WSURFT19JRCddLA0KCQkJCXBsYXllclZhcnM6IHsgJ2F1dG9wbGF5JzogMSB9LA0KCQkJCWV2ZW50czogew0KCQkJCQknb25TdGF0ZUNoYW5nZSc6IG9ueXRwbGF5ZXJTdGF0ZUNoYW5nZSwNCgkJCQkJJ29uRXJyb3InOiBvblBsYXllckVycm9yDQoJCQkJfQ0KCQkJfSk7DQoNCgkJCSQoc3RyVGFyZ2V0KS5zaG93KCk7DQoJCX0NCgl9LA0KDQoJTG9hZFNjcmVlbnNob3Q6IGZ1bmN0aW9uKCBpZCApDQoJew0KCQl2YXIgdGFyZ2V0ID0gJCggJ2hpZ2hsaWdodF9zY3JlZW5zaG90XycgKyBpZCApOw0KCQlpZiAoIHRhcmdldCApDQoJCXsNCgkJCXZhciB1cmwgPSB0aGlzLm1fcmdTY3JlZW5zaG90VVJMc1sgaWQgXTsNCgkJCXZhciBpbWcgPSB0YXJnZXQuZG93bignaW1nJyk7DQoJCQlpZiAoIGltZy5zcmMgIT0gdXJsICkNCgkJCQlpbWcuc3JjID0gdXJsOw0KDQoJCX0NCgl9LA0KDQoJTG9hZFNrZXRjaGZhYk1vZGVsOiBmdW5jdGlvbiggaWQgKQ0KCXsNCgkJdmFyIHRhcmdldCA9ICQoICdoaWdobGlnaHRfc2tldGNoZmFiX21vZGVsXycgKyBpZCApOw0KCQlpZiAoIHRhcmdldCApDQoJCXsNCgkJCXZhciBtb2RlbGlkID0gdGhpcy5tX3JnU2tldGNoZmFiTW9kZWxzWyBpZCBdOw0KCQkJdmFyIGlmcmFtZSA9IHRhcmdldC5kb3duKCdpZnJhbWUnKTsNCgkJCXZhciB1cmwgPSAiaHR0cHM6Ly9za2V0Y2hmYWIuY29tL21vZGVscy8iICsgbW9kZWxpZCArICIvZW1iZWQ/YXV0b3N0YXJ0PTEiDQoJCQlpZiAoIGlmcmFtZS5zcmMgIT0gdXJsICkNCgkJCQlpZnJhbWUuc3JjID0gdXJsOw0KCQl9DQoJfSwNCg0KCVRyYW5zaXRpb25UbzogZnVuY3Rpb24oIGVsZW0gKQ0KCXsNCgkJaWYgKCB0aGlzLm1fYWN0aXZlSXRlbSApDQoJCXsNCgkJCWlmICggdGhpcy5CSXNNb3ZpZSggdGhpcy5tX2FjdGl2ZUl0ZW0gKSApDQoJCQl7DQoJCQkJLy9zdG9wIG1vdmllcw0KCQkJCXZhciBtb3ZpZWlkID0gdGhpcy5HZXRNb3ZpZUlkKCB0aGlzLm1fYWN0aXZlSXRlbSApOw0KCQkJCXZhciBlbGVtQ29udGFpbmVyID0gJCgnaGlnaGxpZ2h0X21vdmllXycgKyBtb3ZpZWlkKTsNCgkJCQlpZiAoIGVsZW1Db250YWluZXIuZG93bignLmZsYXNoX2N0bicpICkNCgkJCQkJZWxlbUNvbnRhaW5lciA9IGVsZW1Db250YWluZXIuZG93bignLmZsYXNoX2N0bicpOw0KCQkJCXZhciBzdHJUYXJnZXQgPSAnbW92aWVfJyArIG1vdmllaWQ7DQoJCQkJZWxlbUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBpZD0iJyArIHN0clRhcmdldCArICciPjwvZGl2Pic7DQoNCgkJCQl0aGlzLm1fYWN0aXZlSXRlbS5oaWRlKCk7DQoJCQl9DQoJCQllbHNlIGlmICggdGhpcy5CSXNTa2V0Y2hmYWJNb2RlbCggdGhpcy5tX2FjdGl2ZUl0ZW0gKSApDQoJCQl7DQoJCQkJdGhpcy5tX2FjdGl2ZUl0ZW0uaGlkZSgpOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCS8vKGNyb3NzKSBmYWRlIHNjcmVlbnNob3RzDQoJCQkJaWYgKCAkKHRoaXMubV9hY3RpdmVJdGVtKS5lZmZlY3QgKSAkKHRoaXMubV9hY3RpdmVJdGVtKS5lZmZlY3QuY2FuY2VsKCk7DQoJCQkJJCh0aGlzLm1fYWN0aXZlSXRlbSkuZWZmZWN0ID0gRWZmZWN0LkZhZGUoIHRoaXMubV9hY3RpdmVJdGVtLCB7ZHVyYXRpb246IDAuNCB9ICk7DQoJCQl9DQoJCX0NCg0KCQlpZiAoIHRoaXMuQklzTW92aWUoIGVsZW0gKSApDQoJCXsNCgkJCWVsZW0uc2hvdygpOw0KCQl9DQoJCWVsc2UgaWYgKCB0aGlzLkJJc1NrZXRjaGZhYk1vZGVsKCBlbGVtICkgKQ0KCQl7DQoJCQllbGVtLnNob3coKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCWlmICggZWxlbS5lZmZlY3QgKSBlbGVtLmVmZmVjdC5jYW5jZWwoKTsNCgkJCWVsZW0uZWZmZWN0ID0gbmV3IEVmZmVjdC5BcHBlYXIoIGVsZW0sIHtkdXJhdGlvbjogMC40IH0gKTsNCgkJfQ0KDQoJCXRoaXMubV9hY3RpdmVJdGVtID0gZWxlbTsNCgl9LA0KDQoJSGlnaGxpZ2h0U3RyaXBJdGVtOiBmdW5jdGlvbiggZWxlbSApDQoJew0KCQl2YXIgZWxlbSA9ICQoZWxlbSk7DQoJCWlmICggIWVsZW0gKQ0KCQkJcmV0dXJuOw0KCQllbGVtLnNpYmxpbmdzKCkuaW52b2tlKCAncmVtb3ZlQ2xhc3NOYW1lJywgJ2ZvY3VzJyApOw0KCQllbGVtLmFkZENsYXNzTmFtZSggJ2ZvY3VzJyApOw0KDQoJCS8vDQoJCXZhciBuU3RyaXBXaWR0aCA9IHRoaXMubV9lbGVtU3RyaXAuZ2V0V2lkdGgoKTsNCgkJdmFyIG5Ub3RhbFN0cmlwV2lkdGggPSB0aGlzLm1fZWxlbVN0cmlwU2Nyb2xsLmdldFdpZHRoKCk7DQoJCXZhciBuU2Nyb2xsT2Zmc2V0ID0gdGhpcy5tX2VsZW1TdHJpcFNjcm9sbC5vZmZzZXRMZWZ0Ow0KDQoJCXZhciBuVGh1bWJSaWdodEVkZ2UgPSBlbGVtLm9mZnNldExlZnQgKyBlbGVtLmdldFdpZHRoKCkgICsgMjsNCgkJdmFyIG5UaHVtYkxlZnRFZGdlID0gZWxlbS5vZmZzZXRMZWZ0Ow0KDQoJCXZhciBuVGFyZ2V0U2Nyb2xsT2Zmc2V0ID0gbnVsbDsNCgkJdmFyIGJOZWVkU2Nyb2xsID0gZmFsc2U7DQoNCgkJaWYgKCBuVGh1bWJSaWdodEVkZ2UgKyBuU2Nyb2xsT2Zmc2V0ID4gblN0cmlwV2lkdGggKQ0KCQl7DQoJCQliTmVlZFNjcm9sbCA9IHRydWU7DQoJCQluVGFyZ2V0U2Nyb2xsT2Zmc2V0ID0gblRodW1iTGVmdEVkZ2U7DQoJCX0NCgkJZWxzZSBpZiAoIG5UaHVtYkxlZnRFZGdlIDwgLW5TY3JvbGxPZmZzZXQgKQ0KCQl7DQoJCQliTmVlZFNjcm9sbCA9IHRydWU7DQoJCQkvLyBpZiB3ZSdyZSBzY3JvbGxpbmcgdG8gdGhlIGxlZnQsIHRyeSB0byBzY3JvbGwgYWxsIHRoZSB3YXkNCgkJCS8vICAgYmFjayB0byB0aGUgc3RhcnQgaWYgdGhhdCB3aWxsIHdvcmssIG90aGVyd2lzZSBzY3JvbGwgc3VjaA0KCQkJLy8gICB0aGF0IHRoZSBsZWZ0IGVkZ2UgaXMgaW4gdmlldw0KCQkJaWYgKCBuVGh1bWJSaWdodEVkZ2UgPCBuU3RyaXBXaWR0aCApDQoJCQkJblRhcmdldFNjcm9sbE9mZnNldCA9IDA7DQoJCQllbHNlDQoJCQkJblRhcmdldFNjcm9sbE9mZnNldCA9IE1hdGgubWF4KCAwLCBuVGh1bWJMZWZ0RWRnZSApOw0KCQl9DQoNCgkJdGhpcy5tX2VsZW1TZWxlY3Rvci5zdHlsZS5sZWZ0ID0gZWxlbS5vZmZzZXRMZWZ0ICsgJ3B4JzsNCg0KCQlpZiAoIGJOZWVkU2Nyb2xsICYmIHRoaXMuc2xpZGVyICkNCgkJew0KCQkJaWYgKCB0aGlzLm1fZWxlbVN0cmlwU2Nyb2xsLmVmZmVjdCApIHRoaXMubV9lbGVtU3RyaXBTY3JvbGwuZWZmZWN0LmNhbmNlbCgpOw0KCQkJdGhpcy5tX2VsZW1TdHJpcFNjcm9sbC5lZmZlY3QgPSBuZXcgRWZmZWN0LlR3ZWVuKCBudWxsLCB0aGlzLnNsaWRlci52YWx1ZSwgblRhcmdldFNjcm9sbE9mZnNldCwgdGhpcy5zbGlkZXIuc2V0VmFsdWUuYmluZCggdGhpcy5zbGlkZXIgKSApOw0KDQoJCX0NCgl9LA0KDQoJQklzTW92aWU6IGZ1bmN0aW9uIChlbGVtICkNCgl7DQoJCXJldHVybiBlbGVtLmhhc0NsYXNzTmFtZSggJ2hpZ2hsaWdodF9tb3ZpZScgKSB8fCBlbGVtLmhhc0NsYXNzTmFtZSggJ2hpZ2hsaWdodF9zdHJpcF9tb3ZpZScgKTsNCgl9LA0KDQoJQklzU2NyZWVuc2hvdDogZnVuY3Rpb24gKCBlbGVtICkNCgl7DQoJCXJldHVybiBlbGVtLmhhc0NsYXNzTmFtZSggJ2hpZ2hsaWdodF9zY3JlZW5zaG90JyApIHx8IGVsZW0uaGFzQ2xhc3NOYW1lKCAnaGlnaGxpZ2h0X3N0cmlwX3NjcmVlbnNob3QnICk7DQoJfSwNCg0KCUJJc1NrZXRjaGZhYk1vZGVsIDogZnVuY3Rpb24gKCBlbGVtICkNCgl7DQoJCXJldHVybiBlbGVtLmhhc0NsYXNzTmFtZSggJ2hpZ2hsaWdodF9za2V0Y2hmYWJfbW9kZWwnICkgfHwgZWxlbS5oYXNDbGFzc05hbWUoICdoaWdobGlnaHRfc3RyaXBfc2tldGNoZmFiX21vZGVsJyApOw0KCX0sDQoNCglHZXRNb3ZpZUlkOiBmdW5jdGlvbiggZWxlbSApDQoJew0KCQlyZXR1cm4gZWxlbS5pZC5yZXBsYWNlKCAvKGhpZ2hsaWdodHx0aHVtYilfbW92aWVfLywgJycgKTsNCgl9LA0KDQoJR2V0U2NyZWVuc2hvdElkOiBmdW5jdGlvbiggZWxlbSApDQoJew0KCQlyZXR1cm4gZWxlbS5pZC5yZXBsYWNlKCAvKGhpZ2hsaWdodHx0aHVtYilfc2NyZWVuc2hvdF8vLCAnJyApOw0KCX0sDQoNCglHZXRTa2V0Y2hmYWJNb2RlbElkOiBmdW5jdGlvbiggZWxlbSApDQoJew0KCQlyZXR1cm4gZWxlbS5pZC5yZXBsYWNlKCAvKGhpZ2hsaWdodHx0aHVtYilfc2tldGNoZmFiX21vZGVsXy8sICcnICk7DQoJfSwNCg0KCVRyYW5zaXRpb246IGZ1bmN0aW9uKCkNCgl7DQoJCXZhciBjbGFzc05hbWUgPSAnLmhpZ2hsaWdodF9wbGF5ZXJfaXRlbSc7DQoJCWlmICggdGhpcy5iU2NyZWVuc2hvdHNPbmx5ICkNCgkJCWNsYXNzTmFtZSA9ICcuaGlnaGxpZ2h0X3NjcmVlbnNob3QnOw0KDQoJCXZhciBuZXh0SXRlbSA9IHRoaXMubV9hY3RpdmVJdGVtLm5leHQoIGNsYXNzTmFtZSApOw0KCQlpZiAoICFuZXh0SXRlbSApDQoJCXsNCgkJCW5leHRJdGVtID0gdGhpcy5tX2VsZW1QbGF5ZXJBcmVhLmRvd24oIGNsYXNzTmFtZSApOw0KCQl9DQoJCWlmICggbmV4dEl0ZW0gKQ0KCQl7DQoJCQl0aGlzLkhpZ2hsaWdodEl0ZW0oIG5leHRJdGVtICk7DQoJCX0NCgl9LA0KDQoJU3RhcnRUaW1lcjogZnVuY3Rpb24oKQ0KCXsNCgkJdGhpcy5DbGVhckludGVydmFsKCk7DQoJCXRoaXMuaW50ZXJ2YWwgPSB3aW5kb3cuc2V0VGltZW91dCggdGhpcy5UcmFuc2l0aW9uLmJpbmQoIHRoaXMgKSwgNTAwMCApOw0KCX0sDQoNCglDbGVhckludGVydmFsOiBmdW5jdGlvbigpDQoJew0KCQlpZiAoIHRoaXMuaW50ZXJ2YWwgKQ0KCQl7DQoJCQl3aW5kb3cuY2xlYXJJbnRlcnZhbCggdGhpcy5pbnRlcnZhbCApOw0KCQkJdGhpcy5pbnRlcnZhbCA9IGZhbHNlOw0KCQl9DQoJfSwNCg0KCVNsaWRlck9uQ2hhbmdlOiBmdW5jdGlvbiggdmFsdWUgKQ0KCXsNCgkJdGhpcy5tX2VsZW1TdHJpcFNjcm9sbC5zdHlsZS5sZWZ0ID0gLSB2YWx1ZSArICdweCc7DQoJfSwNCg0KCVN0b3BDeWNsZTogZnVuY3Rpb24oKQ0KCXsNCgkJdGhpcy5DbGVhckludGVydmFsKCk7DQoJfSwNCg0KCVN0YXJ0Q3ljbGU6IGZ1bmN0aW9uKCkNCgl7DQoJCWlmICggIXRoaXMubV9iUGF1c2VkICYmIHRoaXMuQklzU2NyZWVuc2hvdCggdGhpcy5tX2FjdGl2ZUl0ZW0gKSApDQogICAgCQkJdGhpcy5TdGFydFRpbWVyKCk7DQoJfSwNCg0KCVBhdXNlQ3ljbGU6IGZ1bmN0aW9uKCkNCgl7DQoJCXRoaXMuU3RvcEN5Y2xlKCk7DQoJCXRoaXMubV9iUGF1c2VkID0gdHJ1ZTsNCgl9LA0KDQoJUmVzdW1lQ3ljbGU6IGZ1bmN0aW9uKCkNCgl7DQoJCXRoaXMubV9iUGF1c2VkID0gZmFsc2U7DQoJCXRoaXMuU3RhcnRDeWNsZSgpOw0KCX0sDQoNCglHZXRGdWxsU2NyZWVuc2hvdFVSTHM6IGZ1bmN0aW9uKCkNCgl7DQoJCXJldHVybiB0aGlzLm1fcmdGdWxsU2NyZWVuc2hvdFVSTHM7DQoJfSwNCg0KCU9uTW92aWVDb21wbGV0ZTogZnVuY3Rpb24oIG1vdmllSXRlbSApDQoJew0KCQlpZiAoIHRoaXMubV9hY3RpdmVJdGVtID09IG1vdmllSXRlbSApDQoJCQl0aGlzLlRyYW5zaXRpb24oKTsNCgl9LA0KDQoJT25XZWJQYW5lbEhpZGRlbjogZnVuY3Rpb24oKQ0KCXsNCgkJdGhpcy5TdG9wQ3ljbGUoKTsNCgkJaWYgKCB0aGlzLm1fYWN0aXZlSXRlbSAmJiB0aGlzLkJJc01vdmllKCB0aGlzLm1fYWN0aXZlSXRlbSApICkNCgkJew0KCQkJcGF1c2UoKTsNCgkJfQ0KCX0sDQoNCglPbldlYlBhbmVsU2hvd246IGZ1bmN0aW9uKCkNCgl7DQoJCXRoaXMuU3RhcnRDeWNsZSgpOw0KCX0sDQoNCgltb3VzZU92ZXI6IGZ1bmN0aW9uKCBldmVudCApDQoJew0KCQl0aGlzLlN0b3BDeWNsZSgpOw0KCX0sDQoNCgltb3VzZU91dDogZnVuY3Rpb24oIGV2ZW50ICkNCgl7DQogICAgCXZhciByZWx0YXJnZXQgPSAoZXZlbnQucmVsYXRlZFRhcmdldCkgPyBldmVudC5yZWxhdGVkVGFyZ2V0IDogZXZlbnQudG9FbGVtZW50Ow0KICAgIAlpZiAoIHJlbHRhcmdldCAmJiAoICQocmVsdGFyZ2V0KS51cCggJ2hpZ2hsaWdodF9jdG4nICkgPT0gdGhpcy5tX2VsZW1Db250YWluZXIgKSApDQogICAgCQlyZXR1cm47DQoNCgkJdGhpcy5TdGFydEN5Y2xlKCk7DQoJfQ0KfSApOw0KDQoNCjwvc2NyaXB0Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPih0eXBlb2YgTG9jYWxpemF0aW9uTWFuaWZlc3RSZWFkeSAhPSAndW5kZWZpbmVkJyA/IExvY2FsaXphdGlvbk1hbmlmZXN0UmVhZHkgOiAoZnVuY3Rpb24oKXsgaWYgKCAhd2luZG93LmdfcmdQZW5kaW5nTG9jTWFuaWZlc3RzICkgd2luZG93LmdfcmdQZW5kaW5nTG9jTWFuaWZlc3RzID0gW107IHdpbmRvdy5nX3JnUGVuZGluZ0xvY01hbmlmZXN0cy5wdXNoKCBhcmd1bWVudHMgKTsgfSkpKCAnbG95YWx0eXJld2FyZHMnLCAnbWFuaWZlc3QnLCB7IlJld2FyZHNSZWFjdGlvbl8xIjoiRGVlcCBUaG91Z2h0cyIsIlJld2FyZHNSZWFjdGlvbl8yIjoiSGVhcnR3YXJtaW5nIiwiUmV3YXJkc1JlYWN0aW9uXzMiOiJIaWxhcmlvdXMiLCJSZXdhcmRzUmVhY3Rpb25fNCI6IkhvdCBUYWtlIiwiUmV3YXJkc1JlYWN0aW9uXzUiOiJQb2V0cnkiLCJSZXdhcmRzUmVhY3Rpb25fNiI6IkV4dHJhIEhlbHBmdWwifSk7DQo8L3NjcmlwdD4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4idXNlIHN0cmljdCI7DQoNCi8vIGJ1aWxkIG91ciBtZW51IG9uIGluaXQNCmpRdWVyeSggZnVuY3Rpb24oJCkgew0KCXZhciBtcVF1ZXJ5U21hbGxNb2RlID0gd2luZG93Lm1hdGNoTWVkaWEgPyB3aW5kb3cubWF0Y2hNZWRpYSgiKG1heC13aWR0aDogOTEwcHgpIikgOiB7bWF0Y2hlczogZmFsc2V9Ow0KCXZhciBtcU1vYmlsZU1vZGUgPSB3aW5kb3cubWF0Y2hNZWRpYSA/IHdpbmRvdy5tYXRjaE1lZGlhKCIobWF4LXdpZHRoOiA1MDBweCkiKSA6IHttYXRjaGVzOiBmYWxzZX07DQoJdmFyIG1xV2lkZU1vZGUgPSB3aW5kb3cubWF0Y2hNZWRpYSA/IHdpbmRvdy5tYXRjaE1lZGlhKCIobWluLXdpZHRoOiAxNDAwcHgpIikgOiB7bWF0Y2hlczogZmFsc2V9Ow0KDQoJdmFyICRIVE1MID0gJEooJ2h0bWwnKTsNCgl3aW5kb3cuVXNlVG91Y2hGcmllbmRseU1vZGUgPSBmdW5jdGlvbigpIHsNCgkJcmV0dXJuICRIVE1MLmhhc0NsYXNzKCAncmVzcG9uc2l2ZScgKSAmJiAoIG1xUXVlcnlTbWFsbE1vZGUubWF0Y2hlcyB8fCAkSFRNTC5oYXNDbGFzcygndG91Y2gnKSApOw0KCX07DQoJd2luZG93LlVzZVNtYWxsU2NyZWVuTW9kZSA9IGZ1bmN0aW9uKCkgew0KCQlyZXR1cm4gJEhUTUwuaGFzQ2xhc3MoICdyZXNwb25zaXZlJyApICYmICggbXFRdWVyeVNtYWxsTW9kZS5tYXRjaGVzICk7DQoJfTsNCgl3aW5kb3cuVXNlTW9iaWxlU2NyZWVuTW9kZSA9IGZ1bmN0aW9uKCkgew0KCQlyZXR1cm4gJEhUTUwuaGFzQ2xhc3MoICdyZXNwb25zaXZlJyApICYmIG1xTW9iaWxlTW9kZS5tYXRjaGVzOw0KCX07DQoJd2luZG93LlVzZUdhbWVwYWRTY3JlZW5Nb2RlID0gZnVuY3Rpb24oKSB7DQoJCXJldHVybiAkSFRNTC5oYXNDbGFzcyggJ3Jlc3BvbnNpdmUnICkgJiYgJEhUTUwuaGFzQ2xhc3MoICdHYW1lcGFkTW9kZScgKTsNCgl9Ow0KCXdpbmRvdy5Vc2VOZXdNb2JpbGVBcHBNb2RlID0gZnVuY3Rpb24oKSB7DQoJCS8vIHRoZSBuZXcgbW9iaWxlIGFwcCBjYW4gcnVuIG9uIHNjcmVlbiB3aWR0aHMgd2lkZXIgdGhhbiByZXNwb25zaXZlX2Nzc19tYXh3aWR0aA0KCQlyZXR1cm4gJEhUTUwuaGFzQ2xhc3MoICdyZXNwb25zaXZlJyApICYmICRIVE1MLmhhc0NsYXNzKCAncm5fbW9iaWxlX2FwcCcgKTsNCgl9Ow0KCXdpbmRvdy5Vc2VXaWRlU2NyZWVuTW9kZSA9IGZ1bmN0aW9uKCkgew0KCQlyZXR1cm4gJEhUTUwuaGFzQ2xhc3MoICdyZXNwb25zaXZlJyApICYmIG1xV2lkZU1vZGUubWF0Y2hlczsNCgl9Ow0KDQoJLy8gbWFpbiBtZW51DQoNCgl2YXIgJE1lbnUgPSAkKCcjcmVzcG9uc2l2ZV9wYWdlX21lbnUnKTsNCgl2YXIgJEZyYW1lID0gJCgnLnJlc3BvbnNpdmVfcGFnZV9mcmFtZScpOw0KCXZhciAkQ29udGVudEN0biA9ICQoJy5yZXNwb25zaXZlX3BhZ2VfY29udGVudCcgKTsNCgl2YXIgJENvbnRlbnRPdmVybGF5ID0gJCgnLnJlc3BvbnNpdmVfcGFnZV9jb250ZW50X292ZXJsYXknKTsNCg0KCXZhciBmblJlc2V0TWVudVN0YXRlID0gZnVuY3Rpb24oKSB7DQoJCSRGcmFtZS5yZW1vdmVDbGFzcyggJ21haW5tZW51X2FjdGl2ZScpOw0KCQkkRnJhbWUucmVtb3ZlQ2xhc3MoJ2xvY2FsbWVudV9hY3RpdmUnKTsNCgkJJEooZG9jdW1lbnQuYm9keSkucmVtb3ZlQ2xhc3MoICdvdmVyZmxvd19oaWRkZW4nICk7DQoNCgkJJENvbnRlbnRPdmVybGF5Lm9mZiggJ2NsaWNrLlJlcG9uc2l2ZU1lbnVEaXNtaXNzJyk7DQoJfTsNCg0KCSRKKGRvY3VtZW50KS5vbignY2xpY2suT25DbGlja0Rpc21pc3NNZW51JywgJy5yZXNwb25zaXZlX09uQ2xpY2tEaXNtaXNzTWVudScsIGZuUmVzZXRNZW51U3RhdGUgKTsNCg0KCXZhciBzdHJMYXN0RXhwYW5kZWRTdWJtZW51ID0gV2ViU3RvcmFnZS5HZXRMb2NhbFNlc3Npb24oICdyZXNwb25zaXZlTWVudUxhc3RTdWJtZW51JyApOw0KDQoJdmFyIGZuTWFrZUV4cGFuZGFibGVNZW51SXRlbSA9IGZ1bmN0aW9uKCAkTWVudUl0ZW0sICRTdWJtZW51ICkNCgl7DQoJCSRNZW51SXRlbS5hcHBlbmQoICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ2NoZXZyb24nIH0gKSApOw0KDQoNCgkJdmFyICRTdWJtZW51V3JhcHBlciA9ICRKKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ21lbnVpdGVtX3N1Ym1lbnVfd3JhcHBlcicgfSk7DQoJCSRNZW51SXRlbS5hZnRlciggJFN1Ym1lbnVXcmFwcGVyLmFwcGVuZCggJFN1Ym1lbnUgKSApOw0KCQkkU3VibWVudS53cmFwKCAkKCc8ZGl2Lz4nLCB7J2NsYXNzJzogJ2lubmVyX2JvcmRlcnMnIH0gKSApOw0KDQoJCS8vIGlmIHRoaXMgd2FzIHRoZSBsYXN0IHVzZWQgc3VibWVudSwgc3RhcnQgd2l0aCBpdCBleHBhbmRlZA0KCQlpZiAoIHN0ckxhc3RFeHBhbmRlZFN1Ym1lbnUgJiYgc3RyTGFzdEV4cGFuZGVkU3VibWVudSA9PSAkU3VibWVudS5kYXRhKCdzdWJtZW51aWQnKSApDQoJCXsNCgkJCSRTdWJtZW51V3JhcHBlci5jc3MoICdoZWlnaHQnLCAkU3VibWVudS5oZWlnaHQoKSArICdweCcgKTsNCgkJCSRNZW51SXRlbS5hZGRDbGFzcyggJ3N1Ym1lbnVfYWN0aXZlJyApOw0KCQkJJFN1Ym1lbnVXcmFwcGVyLmFkZENsYXNzKCdhY3RpdmUnKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRTdWJtZW51V3JhcHBlci5jc3MoICdoZWlnaHQnLCAwICk7DQoJCX0NCg0KCQkkU3VibWVudS5zaG93KCk7DQoNCgkJJE1lbnVJdGVtLmNsaWNrKCBmdW5jdGlvbihlKSB7DQoJCQllLnByZXZlbnREZWZhdWx0KCk7DQoJCQlpZiAoICRTdWJtZW51V3JhcHBlci5oYXNDbGFzcygnYWN0aXZlJyApICkNCgkJCXsNCgkJCQkkU3VibWVudVdyYXBwZXIucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScgKS5jc3MoJ2hlaWdodCcsMCk7DQoJCQkJJE1lbnVJdGVtLnJlbW92ZUNsYXNzKCdzdWJtZW51X2FjdGl2ZScpOw0KCQkJCVdlYlN0b3JhZ2UuU2V0TG9jYWxTZXNzaW9uKCAncmVzcG9uc2l2ZU1lbnVMYXN0U3VibWVudScsIG51bGwgKTsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkU3VibWVudVdyYXBwZXIuc2libGluZ3MoICcubWVudWl0ZW1fc3VibWVudV93cmFwcGVyLmFjdGl2ZScgKS5jc3MoJ2hlaWdodCcsMCApLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsNCgkJCQkkTWVudUl0ZW0uc2libGluZ3MoJy5tZW51aXRlbScpLnJlbW92ZUNsYXNzKCdzdWJtZW51X2FjdGl2ZScpOw0KCQkJCSRTdWJtZW51V3JhcHBlci5jc3MoICdoZWlnaHQnLCAkU3VibWVudS5oZWlnaHQoKSArICdweCcgKTsNCgkJCQkkTWVudUl0ZW0uYWRkQ2xhc3MoICdzdWJtZW51X2FjdGl2ZScgKTsNCgkJCQkkU3VibWVudVdyYXBwZXIuYWRkQ2xhc3MoJ2FjdGl2ZScpOw0KCQkJCVdlYlN0b3JhZ2UuU2V0TG9jYWxTZXNzaW9uKCAncmVzcG9uc2l2ZU1lbnVMYXN0U3VibWVudScsICRTdWJtZW51LmRhdGEoJ3N1Ym1lbnVpZCcpICk7DQoJCQl9DQoJCX0pOw0KCX07DQoNCgl2YXIgZm5CdWlsZE1lbnVFdmVudHMgPSBmdW5jdGlvbiggJE1lbnUsIHN0ck1lbnVOYW1lLCBmbkZpcnN0VGltZUluaXRpYWxpemF0aW9uICkNCgl7DQoJCXZhciBzdHJBY3RpdmVDbGFzcyA9IHN0ck1lbnVOYW1lICsgJ19hY3RpdmUnOw0KCQl2YXIgZm5HUE9uQ2xvc2luZ01vZGFsV2luZG93ID0gbnVsbDsNCg0KCQl2YXIgZm5EaXNtaXNzTWVudSA9IGZ1bmN0aW9uKCkgew0KCQkJJENvbnRlbnRDdG4ub2ZmKCAnY2xpY2suUmVwb25zaXZlTWVudURpc21pc3MnKTsNCgkJCSRGcmFtZS5yZW1vdmVDbGFzcyhzdHJBY3RpdmVDbGFzcyk7DQoJCQkkSihkb2N1bWVudC5ib2R5KS5yZW1vdmVDbGFzcygnb3ZlcmZsb3dfaGlkZGVuJyApOw0KDQoJCQkvLyB0ZWxsIGdhbWVwYWQgbmF2aWdhdGlvbiB3ZSdyZSBjbG9zaW5nIHRoZSBtZW51DQoJCQlpZiAoIGZuR1BPbkNsb3NpbmdNb2RhbFdpbmRvdyApDQoJCQl7DQoJCQkJZm5HUE9uQ2xvc2luZ01vZGFsV2luZG93KCk7DQoJCQkJZm5HUE9uQ2xvc2luZ01vZGFsV2luZG93ID0gbnVsbDsNCgkJCX0NCg0KCQkJd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgew0KCQkJCWlmICggISRGcmFtZS5oYXNDbGFzcygnbWFpbm1lbnVfYWN0aXZlJykgJiYgISRGcmFtZS5oYXNDbGFzcygnbG9jYWxtZW51X2FjdGl2ZScpICkNCgkJCQl7DQoJCQkJCWZuUmVzZXRNZW51U3RhdGUoKTsNCgkJCQl9DQoJCQl9LCA1MDAgKTsNCgkJfTsNCg0KCQl2YXIgYkluaXRpYWxpemVkID0gZmFsc2U7DQoJCXZhciBmbkFjdGl2YXRlTWVudSA9IGZ1bmN0aW9uKCkgew0KCQkJaWYgKCAhYkluaXRpYWxpemVkICkNCgkJCXsNCgkJCQlmbkZpcnN0VGltZUluaXRpYWxpemF0aW9uICYmIGZuRmlyc3RUaW1lSW5pdGlhbGl6YXRpb24oKTsNCgkJCQliSW5pdGlhbGl6ZWQgPSB0cnVlOw0KCQkJfQ0KDQoJCQlpZiAoICRGcmFtZS5oYXNDbGFzcyggc3RyQWN0aXZlQ2xhc3MgKSApDQoJCQl7DQoJCQkJZm5EaXNtaXNzTWVudSgpOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRKKGRvY3VtZW50LmJvZHkpLmFkZENsYXNzKCdvdmVyZmxvd19oaWRkZW4nICk7DQoJCQkJJE1lbnUucmVtb3ZlQ2xhc3MoJ3NlY29uZGFyeV9hY3RpdmUnKTsNCgkJCQkkRnJhbWUuYWRkQ2xhc3MoIHN0ckFjdGl2ZUNsYXNzICk7DQoJCQkJJENvbnRlbnRPdmVybGF5Lm9uZSggJ2NsaWNrLlJlc3BvbnNpdmVNZW51RGlzbWlzcycsIGZ1bmN0aW9uKCkgew0KCQkJCQlmbkRpc21pc3NNZW51KCk7DQoJCQkJfSk7DQoNCgkJCQkvLyB0ZWxsIGdhbWVwYWQgbmF2aWdhdGlvbiB0byB0cmVhdCB0aGlzIG1lbnUgYXMgYSBtb2RhbCBkaWFsb2cNCgkJCQlpZiAoIHR5cGVvZiBHUE9uU2hvd2luZ01vZGFsV2luZG93ID09PSAiZnVuY3Rpb24iICkNCgkJCQkJZm5HUE9uQ2xvc2luZ01vZGFsV2luZG93ID0gR1BPblNob3dpbmdNb2RhbFdpbmRvdyggJE1lbnUuZ2V0KCAwICkgKTsNCgkJCX0NCgkJfTsNCg0KCQlyZXR1cm4geyBmbkFjdGl2YXRlTWVudTogZm5BY3RpdmF0ZU1lbnUsIGZuRGlzbWlzc01lbnU6IGZuRGlzbWlzc01lbnUgfTsNCgl9Ow0KDQoJdmFyIGZuSW5pdE1haW5NZW51ID0gZnVuY3Rpb24oKSB7DQoJCSQoJy5yZXNwb25zaXZlX3BhZ2VfbWVudScgKS5maW5kKCAnLnN1cGVybmF2JykuZWFjaCggZnVuY3Rpb24oKSB7DQoJCQl2YXIgJEVsZW1lbnQgPSAkKHRoaXMpOw0KCQkJJEVsZW1lbnQuYXR0cignaHJlZicsJycpOw0KCQkJdmFyIHN0clN1Ym1lbnVTZWxlY3RvciA9ICRFbGVtZW50LmRhdGEoJ3Rvb2x0aXAtY29udGVudCcpOw0KCQkJdmFyICRTdWJtZW51ID0gJEVsZW1lbnQucGFyZW50KCkuZmluZChzdHJTdWJtZW51U2VsZWN0b3IpOw0KCQkJaWYgKCAkU3VibWVudS5sZW5ndGggKQ0KCQkJew0KCQkJCWZuTWFrZUV4cGFuZGFibGVNZW51SXRlbSggJEVsZW1lbnQsICRTdWJtZW51ICk7DQoJCQl9DQoJCX0pOw0KDQoJCXZhciAkTm90aWZpY2F0aW9uSXRlbSA9ICRNZW51LmZpbmQoICcubm90aWZpY2F0aW9uc19pdGVtJyApOw0KCQl2YXIgJE5vdGlmaWNhdGlvblN1Ym1lbnUgPSAkTWVudS5maW5kKCcubm90aWZpY2F0aW9uX3N1Ym1lbnUnKTsNCgkJaWYgKCAkTm90aWZpY2F0aW9uSXRlbS5sZW5ndGggJiYgJE5vdGlmaWNhdGlvblN1Ym1lbnUubGVuZ3RoICkNCgkJew0KCQkJZm5NYWtlRXhwYW5kYWJsZU1lbnVJdGVtKCAkTm90aWZpY2F0aW9uSXRlbSwgJE5vdGlmaWNhdGlvblN1Ym1lbnUgKTsNCgkJfQ0KCQlSZXNwb25zaXZlX0J1aWxkQ2hhbmdlTGFuZ3VhZ2VPcHRpb24oICRNZW51LmZpbmQoICcuY2hhbmdlX2xhbmd1YWdlX2FjdGlvbicgKSApOw0KCX07DQoNCgl2YXIgTWFpbk1lbnVFdmVudHMgPSBudWxsOw0KCWlmICggJE1lbnUubGVuZ3RoICkNCgl7DQoJCU1haW5NZW51RXZlbnRzID0gZm5CdWlsZE1lbnVFdmVudHMoICRNZW51LCAnbWFpbm1lbnUnLCBmbkluaXRNYWluTWVudSApOw0KDQoNCgkJJCgnI3Jlc3BvbnNpdmVfbWVudV9sb2dvJyApLmNsaWNrKCBmdW5jdGlvbiggZSApIHsNCgkJCU1haW5NZW51RXZlbnRzLmZuQWN0aXZhdGVNZW51KCk7DQoJCX0gKTsNCgl9DQoNCg0KCS8vIGxvY2FsIChwYWdlLXNwZWNpZmljKSBtZW51DQoNCgl2YXIgJExvY2FsTWVudUNvbnRlbnQgPSAkKCcucmVzcG9uc2l2ZV9sb2NhbF9tZW51Jyk7DQoJdmFyICRMb2NhbE1lbnUgPSBudWxsOw0KCXZhciBMb2NhbE1lbnVFdmVudHMgPSBudWxsOw0KCWlmICggJExvY2FsTWVudUNvbnRlbnQubGVuZ3RoICkNCgl7DQoJCXZhciBiTG9jYWxNZW51RW5hYmVkID0gZmFsc2U7DQoJCXZhciByZ01lbnVDb250ZW50cyA9IFtdOw0KDQoJCXZhciBmbkluaXRMb2NhbE1lbnUgPSBmdW5jdGlvbigpIHsNCgkJCWlmICggcmdNZW51Q29udGVudHMubGVuZ3RoICkNCgkJCQlyZXR1cm47DQoNCgkJCWZvciAoIHZhciBpID0gMDsgaSA8ICRMb2NhbE1lbnVDb250ZW50Lmxlbmd0aDsgaSsrICkNCgkJCXsNCgkJCQl2YXIgJExvY2FsTWVudUVsZW1lbnQgPSAkKCRMb2NhbE1lbnVDb250ZW50W2ldICkud3JhcCggJEooJzxkaXYvPicsIHsnY2xhc3MnOiAncmVzcG9uc2l2ZV9sb2NhbF9tZW51X3BsYWNlaG9sZGVyJyB9ICkgKTsNCgkJCQl2YXIgJExvY2FsTWVudVdyYXBwZXIgPSAkKCRMb2NhbE1lbnVDb250ZW50W2ldKS5wYXJlbnQoKTsNCgkJCQlyZ01lbnVDb250ZW50cy5wdXNoKCB7DQoJCQkJCXdyYXBwZXI6ICRMb2NhbE1lbnVXcmFwcGVyLA0KCQkJCQljb250ZW50OiAkTG9jYWxNZW51RWxlbWVudA0KCQkJCX0pOw0KCQkJfQ0KCQl9Ow0KDQoJCSRMb2NhbE1lbnUgPSAkSignI3Jlc3BvbnNpdmVfcGFnZV9sb2NhbF9tZW51Jyk7DQoJCXZhciAkQWZmb3JkYW5jZSA9ICRKKCcucmVzcG9uc2l2ZV9sb2NhbF9tZW51X3RhYicpOw0KDQoJCUxvY2FsTWVudUV2ZW50cyA9IGZuQnVpbGRNZW51RXZlbnRzKCAkTG9jYWxNZW51LCAnbG9jYWxtZW51JyApOw0KDQoJCSRBZmZvcmRhbmNlLmNsaWNrKCBmdW5jdGlvbiggZSApIHsNCgkJCUxvY2FsTWVudUV2ZW50cy5mbkFjdGl2YXRlTWVudSgpOw0KCQl9KTsNCg0KCQlnX2ZuQWN0aXZhdGVMb2NhbE1lbnUgPSBMb2NhbE1lbnVFdmVudHMuZm5BY3RpdmF0ZU1lbnU7DQoNCgkJJCh3aW5kb3cgKS5vbiggJ1Jlc3BvbnNpdmVfU21hbGxTY3JlZW5Nb2RlVG9nZ2xlZC5SZXBvbnNpdmVMb2NhbE1lbnUnLCBmdW5jdGlvbigpIHsNCgkJCXZhciBiU2hvdWxkVXNlUmVzcG9uc2l2ZU1lbnUgPSBVc2VTbWFsbFNjcmVlbk1vZGUoKSB8fCBVc2VHYW1lcGFkU2NyZWVuTW9kZSgpOw0KCQkJaWYgKCBiTG9jYWxNZW51RW5hYmVkICE9IGJTaG91bGRVc2VSZXNwb25zaXZlTWVudSApDQoJCQl7DQoJCQkJaWYgKCBiU2hvdWxkVXNlUmVzcG9uc2l2ZU1lbnUgKQ0KCQkJCXsNCgkJCQkJJEFmZm9yZGFuY2UuYWRkQ2xhc3MoICdhY3RpdmUnICk7DQoJCQkJCWZuSW5pdExvY2FsTWVudSgpOw0KCQkJCQkkTG9jYWxNZW51LmZpbmQoJy5sb2NhbG1lbnVfY29udGVudCcgKS5hcHBlbmQoICRMb2NhbE1lbnVDb250ZW50ICk7DQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCWZuUmVzZXRNZW51U3RhdGUoKTsNCgkJCQkJJEFmZm9yZGFuY2UucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOw0KCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCByZ01lbnVDb250ZW50cy5sZW5ndGg7IGkrKyApDQoJCQkJCXsNCgkJCQkJCXJnTWVudUNvbnRlbnRzW2ldLndyYXBwZXIuYXBwZW5kKCByZ01lbnVDb250ZW50c1tpXS5jb250ZW50ICk7DQoJCQkJCX0NCgkJCQl9DQoJCQkJYkxvY2FsTWVudUVuYWJlZCA9IGJTaG91bGRVc2VSZXNwb25zaXZlTWVudTsNCgkJCX0NCgkJfSApLnRyaWdnZXIoICdSZXNwb25zaXZlX1NtYWxsU2NyZWVuTW9kZVRvZ2dsZWQuUmVwb25zaXZlTG9jYWxNZW51Jyk7DQoNCgkJLy8gbWVudSBpcyBhdmFpbGFibGUsIHNvIHNldCB0aGUgYWN0aW9uIGRlc2NyaXB0aW9uIGZvciB0aGUgcGFnZSBjb250ZW50Lg0KCQlHUE5hdlVwZGF0ZUFjdGlvbkRlc2NyaXB0aW9ucyggJCgnI3Jlc3BvbnNpdmVfcGFnZV90ZW1wbGF0ZV9jb250ZW50JyksIHsgb25PcHRpb25zQWN0aW9uRGVzY3JpcHRpb246J01lbnUnIH0gKTsNCgkJJCgnI3Jlc3BvbnNpdmVfcGFnZV90ZW1wbGF0ZV9jb250ZW50Jykub24oICd2Z3Bfb25vcHRpb25zJywgZnVuY3Rpb24oKSB7IExvY2FsTWVudUV2ZW50cy5mbkFjdGl2YXRlTWVudSgpOyB9ICk7DQoJfQ0KDQoJUmVzcG9uc2l2ZV9Jbml0TWVudVN3aXBlcyggJCwgJE1lbnUsICRMb2NhbE1lbnUsIE1haW5NZW51RXZlbnRzLCBMb2NhbE1lbnVFdmVudHMgKTsNCg0KCVJlc3BvbnNpdmVfSW5pdFRvdWNoRGV0ZWN0aW9uKCAkICk7DQoNCglSZXNwb25zaXZlX0luaXRUYWJTZWxlY3QoICQgKTsNCg0KCVJlc3BvbnNpdmVfSW5pdFJlc3BvbnNpdmVUb2dnbGVFdmVudHMoICQgKTsNCg0KCVJlc3BvbnNpdmVfSW5pdEpRUGxvdEhvb2tzKCAkICk7DQoNCglpZiAoIHdpbmRvdy5Vc2VHYW1lcGFkU2NyZWVuTW9kZSAmJiB3aW5kb3cuVXNlR2FtZXBhZFNjcmVlbk1vZGUoKSApDQoJCVJlc3BvbnNpdmVfSW5pdEZvckdhbWVwYWQoICQgKTsNCn0pOw0KDQpmdW5jdGlvbiBSZXNwb25zaXZlX0luaXRGb3JHYW1lcGFkKCAkICkNCnsNCgkvLyBzdXBwb3J0IHVzaW5nIGdhbWVwYWQgdG8gY2hhbmdlIHNsaWRlciBwb3NpdGlvbg0KCSQoICdpbnB1dFt0eXBlPXJhbmdlXScgKS5vbiggJ3ZncF9vbmRpcmVjdGlvbicsIGZ1bmN0aW9uKCBldmVudCApIHsNCg0KCQlpZiAoIGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGV0YWlsLmJ1dHRvbiA9PSAxMSB8fCBldmVudC5vcmlnaW5hbEV2ZW50LmRldGFpbC5idXR0b24gPT0gMTIgKQ0KCQl7DQoJCQlpZiAoIGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGV0YWlsLmJ1dHRvbiA9PSAxMSApIC8vIEVHYW1lcGFkQnV0dG9uLkRJUl9MRUZUDQoJCQkJdGhpcy5zdGVwRG93bigpOw0KCQkJZWxzZSBpZiAoIGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGV0YWlsLmJ1dHRvbiA9PSAxMiApIC8vIEVHYW1lcGFkQnV0dG9uLkRJUl9SSUdIVA0KCQkJCXRoaXMuc3RlcFVwKCk7DQoNCgkJCSQoIHRoaXMgKS50cmlnZ2VyKCAnaW5wdXQnICkudHJpZ2dlciggJ2NoYW5nZScgKTsNCg0KCQkJcmV0dXJuIGZhbHNlOyAvLyBwcmV2ZW50IHRoZSBtZXNzYWdlIGZyb20gcHJvcGFnYXRpbmcNCgkJfQ0KCX0gKTsNCn0NCg0KZnVuY3Rpb24gUmVzcG9uc2l2ZV9Jbml0TWVudVN3aXBlcyggJCwgJE1lbnUsICRMb2NhbE1lbnUsIE1haW5NZW51RXZlbnRzLCBMb2NhbE1lbnVFdmVudHMgKQ0Kew0KCWlmICggIU1haW5NZW51RXZlbnRzICYmICFMb2NhbE1lbnVFdmVudHMgKQ0KCQlyZXR1cm47DQoNCgl2YXIgJEZyYW1lID0gJCgnLnJlc3BvbnNpdmVfcGFnZV9mcmFtZScpOw0KCS8vIHNldCB1cCB0b3VjaCBkcmFnIGV2ZW50cw0KCXZhciBiSW5NYWluTWVudURyYWcgPSBmYWxzZTsNCgl2YXIgYkluTG9jYWxNZW51RHJhZyA9IGZhbHNlOw0KCXZhciBiSW5EaXNtaXNzTWVudURyYWcgPSBmYWxzZTsNCgl2YXIgYkxvb2tzTGlrZVN3aXBlID0gZmFsc2U7DQoJdmFyIG5EcmFnTWVudVdpZHRoID0gMDsNCg0KCXZhciBuQ3VyRHJhZ09mZnNldCA9IDA7DQoJdmFyIG5Ub3VjaFN0YXJ0UGFnZVggPSAwOwkvLyBwYWdlL0NTUyBjb29yZGluYXRlcyBiZWNhdXNlIHRoYXQncyBob3cgd2UgbWVhc3VyZSB0aGUgbWVudSB3aWR0aA0KCXZhciBuVG91Y2hTdGFydFBhZ2VZID0gMDsNCg0KCXZhciBmbkdldFNpbmdsZVRvdWNoID0gZnVuY3Rpb24oZSkgew0KCQl2YXIgVG91Y2hFdmVudCA9IGUub3JpZ2luYWxFdmVudDsNCgkJdmFyIHJnVG91Y2hlcyA9IFRvdWNoRXZlbnQgPyBUb3VjaEV2ZW50LnRvdWNoZXMgOiBudWxsOw0KCQlpZiAoICFyZ1RvdWNoZXMgfHwgcmdUb3VjaGVzLmxlbmd0aCAhPSAxICkNCgkJCXJldHVybiBudWxsOw0KCQlyZXR1cm4gcmdUb3VjaGVzWzBdOw0KCX07DQoJdmFyIGZuQ2FuY2VsRHJhZyA9IGZ1bmN0aW9uKCkNCgl7DQoJCSRGcmFtZS5yZW1vdmVDbGFzcygnaW5fbWVudV9kcmFnJyk7DQoJCWlmICggYkxvb2tzTGlrZVN3aXBlICkNCgkJew0KCQkJdmFyIERyYWdNZW51RXZlbnRzID0gYkluTWFpbk1lbnVEcmFnID8gTWFpbk1lbnVFdmVudHMgOiBMb2NhbE1lbnVFdmVudHM7DQoJCQl2YXIgJERyYWdNZW51ID0gYkluTWFpbk1lbnVEcmFnID8gJE1lbnUgOiAkTG9jYWxNZW51Ow0KCQkJJERyYWdNZW51LnBhcmVudHMoJy5yZXNwb25zaXZlX3BhZ2VfbWVudV9jdG4nICkuY3NzKCAnbGVmdCcsICcnICkuY3NzKCAncmlnaHQnLCAnJyApOw0KCQkJaWYgKCAoICFiSW5EaXNtaXNzTWVudURyYWcgJiYgbkN1ckRyYWdPZmZzZXQgPCBuRHJhZ01lbnVXaWR0aCAvIDIgKSB8fA0KCQkJCSggYkluRGlzbWlzc01lbnVEcmFnICYmIG5DdXJEcmFnT2Zmc2V0ID4gbkRyYWdNZW51V2lkdGggLyAyICkgKQ0KCQkJew0KCQkJCURyYWdNZW51RXZlbnRzLmZuRGlzbWlzc01lbnUoKTsNCgkJCX0NCgkJfQ0KDQoJCWJJbkxvY2FsTWVudURyYWcgPSBiSW5NYWluTWVudURyYWcgPSBiTG9va3NMaWtlU3dpcGUgPSBiSW5EaXNtaXNzTWVudURyYWcgPSBmYWxzZTsNCgl9Ow0KCSQod2luZG93ICkub24oJ3RvdWNoc3RhcnQuUmVzcG9uc2l2ZU1lbnVBY3RpdmF0ZScsIGZ1bmN0aW9uKGUpIHsNCgkJaWYgKCAhVXNlU21hbGxTY3JlZW5Nb2RlKCkgKQ0KCQkJcmV0dXJuOw0KDQoJCWlmICggZSAmJiBlLnRhcmdldCAmJiAkKCBlLnRhcmdldCApLnBhcmVudHMoICcucmVzcG9uc2l2ZV9tZW51X2lnbm9yZV90b3VjaCcgKS5sZW5ndGggPiAwICkNCgkJCXJldHVybjsNCg0KCQl2YXIgVG91Y2ggPSBmbkdldFNpbmdsZVRvdWNoKGUpOw0KCQlpZiAoICFUb3VjaCApDQoJCQlyZXR1cm47DQoNCgkJaWYgKCAkRnJhbWUuaGFzQ2xhc3MoJ21haW5tZW51X2FjdGl2ZScpICkNCgkJew0KCQkJaWYgKCBUb3VjaC5jbGllbnRYID4gJE1lbnUud2lkdGgoKSAqIDAuOSApDQoJCQl7DQoJCQkJYkluTWFpbk1lbnVEcmFnID0gdHJ1ZTsNCgkJCQliSW5EaXNtaXNzTWVudURyYWcgPSB0cnVlOw0KCQkJfQ0KCQl9DQoJCWVsc2UgaWYgKCAkRnJhbWUuaGFzQ2xhc3MoJ2xvY2FsbWVudV9hY3RpdmUnKSApDQoJCXsNCgkJCWlmICggVG91Y2guY2xpZW50WCA8ICggd2luZG93LmlubmVyV2lkdGggLSAkTG9jYWxNZW51LndpZHRoKCkgKiAwLjkgKSApDQoJCQl7DQoJCQkJYkluTG9jYWxNZW51RHJhZyA9IHRydWU7DQoJCQkJYkluRGlzbWlzc01lbnVEcmFnID0gdHJ1ZTsNCgkJCX0NCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXZhciBuQ2xpZW50WEFzUGN0ID0gMTAwICogVG91Y2guY2xpZW50WCAvIHdpbmRvdy5pbm5lcldpZHRoOw0KCQkJYkluRGlzbWlzc01lbnVEcmFnID0gZmFsc2U7DQoJCQlpZiAoIG5DbGllbnRYQXNQY3QgPiA5MyAmJiBMb2NhbE1lbnVFdmVudHMgKQ0KCQkJCWJJbkxvY2FsTWVudURyYWcgPSB0cnVlOw0KCQkJZWxzZSBpZiAoIG5DbGllbnRYQXNQY3QgPCA3ICYmIE1haW5NZW51RXZlbnRzICkNCgkJCQliSW5NYWluTWVudURyYWcgPSB0cnVlOw0KCQl9DQoNCgkJaWYgKCBiSW5Mb2NhbE1lbnVEcmFnIHx8IGJJbk1haW5NZW51RHJhZyApDQoJCXsNCgkJCWJMb29rc0xpa2VTd2lwZSA9IGZhbHNlOw0KCQkJblRvdWNoU3RhcnRQYWdlWCA9IFRvdWNoLnBhZ2VYOw0KCQkJblRvdWNoU3RhcnRQYWdlWSA9IFRvdWNoLnBhZ2VZOw0KCQl9DQoJfSk7DQoJJCh3aW5kb3cgKS5vbigndG91Y2htb3ZlLlJlc3BvbnNpdmVNZW51QWN0aXZlJywgZnVuY3Rpb24oZSkgew0KCQlpZiAoICFiSW5Mb2NhbE1lbnVEcmFnICYmICFiSW5NYWluTWVudURyYWcgKQ0KCQkJcmV0dXJuOw0KDQoJCXZhciBUb3VjaCA9IGZuR2V0U2luZ2xlVG91Y2goZSk7DQoJCWlmICggIVRvdWNoICkNCgkJCXJldHVybjsNCgkJdmFyIG5EZWx0YVBhZ2VYID0gVG91Y2gucGFnZVggLSBuVG91Y2hTdGFydFBhZ2VYOw0KCQl2YXIgbkRlbHRhUGFnZVkgPSBUb3VjaC5wYWdlWSAtIG5Ub3VjaFN0YXJ0UGFnZVk7DQoNCgkJaWYgKCAoIGJJbkxvY2FsTWVudURyYWcgJiYgIWJJbkRpc21pc3NNZW51RHJhZyApIHx8ICggYkluTWFpbk1lbnVEcmFnICYmIGJJbkRpc21pc3NNZW51RHJhZyApICkNCgkJCW5EZWx0YVBhZ2VYID0gLW5EZWx0YVBhZ2VYOw0KDQoJCXZhciBEcmFnTWVudUV2ZW50cyA9IGJJbk1haW5NZW51RHJhZyA/IE1haW5NZW51RXZlbnRzIDogTG9jYWxNZW51RXZlbnRzOw0KCQl2YXIgJERyYWdNZW51ID0gYkluTWFpbk1lbnVEcmFnID8gJE1lbnUgOiAkTG9jYWxNZW51Ow0KDQoJCWlmICggIWJMb29rc0xpa2VTd2lwZSAmJiBuRGVsdGFQYWdlWCA+IDI1ICYmIG5EZWx0YVBhZ2VYID4gbkRlbHRhUGFnZVkgKiAyICkNCgkJew0KCQkJLy8gaG9yaXpvbnRhbCBkcmFnDQoJCQkkRnJhbWUuYWRkQ2xhc3MoJ2luX21lbnVfZHJhZycpOw0KCQkJaWYgKCAhYkluRGlzbWlzc01lbnVEcmFnICkNCgkJCQlEcmFnTWVudUV2ZW50cy5mbkFjdGl2YXRlTWVudSgpOw0KCQkJLy8kRnJhbWUuYWRkQ2xhc3MoIGJJbkxvY2FsTWVudURyYWcgPyAnbG9jYWxtZW51X2FjdGl2ZScgOiAnbWFpbm1lbnVfYWN0aXZlJyApOw0KCQkJbkRyYWdNZW51V2lkdGggPSAkRHJhZ01lbnUud2lkdGgoKTsNCgkJCWJMb29rc0xpa2VTd2lwZSA9IHRydWU7DQoJCX0NCgkJZWxzZSBpZiAoIG5EZWx0YVBhZ2VZID4gMiAqIG5EZWx0YVBhZ2VYICkNCgkJew0KCQkJLy8gbG9va3MgbGlrZSBzY3JvbGxpbmc/DQoJCQlmbkNhbmNlbERyYWcoKTsNCgkJCXJldHVybjsNCgkJfQ0KDQoNCgkJaWYgKCBiTG9va3NMaWtlU3dpcGUgKQ0KCQl7DQoJCQluQ3VyRHJhZ09mZnNldCA9IE1hdGgubWF4KCBNYXRoLm1pbiggbkRlbHRhUGFnZVgsIG5EcmFnTWVudVdpZHRoICksIDAgKTsNCg0KCQkJdmFyIG5PZmZzZXQgPSBiSW5EaXNtaXNzTWVudURyYWcgPyAtbkN1ckRyYWdPZmZzZXQgOiAtKG5EcmFnTWVudVdpZHRoIC0gbkN1ckRyYWdPZmZzZXQpOw0KDQoJCQkkRHJhZ01lbnUucGFyZW50cygnLnJlc3BvbnNpdmVfcGFnZV9tZW51X2N0bicgKS5jc3MoIGJJbkxvY2FsTWVudURyYWcgPyAncmlnaHQnIDogJ2xlZnQnLCBuT2Zmc2V0ICsgJ3B4JyApOw0KCQl9DQoJfSk7DQoJJCh3aW5kb3cgKS5vbigndG91Y2hlbmQuUmVzcG9uc2l2ZU1lbnVBY3RpdmF0ZSB0b3VjaGNhbmNlbC5SZXNwb25zaXZlTWVudUFjdGl2YXRlJywgZnVuY3Rpb24oZSkgew0KCQlmbkNhbmNlbERyYWcoKTsNCgl9KTsNCn0NCg0KdmFyIGdfbXFsUG9pbnRlcjsNCmZ1bmN0aW9uIFJlc3BvbnNpdmVfSW5pdFRvdWNoRGV0ZWN0aW9uKCAkICkNCnsNCgl2YXIgJEhUTUw9ICRKKCdodG1sJyk7DQoJaWYgKCAkSFRNTC5oYXNDbGFzcygncmVzcG9uc2l2ZScpICkNCgl7DQoJCS8vIFRvIHVwZGF0ZSB0b3VjaCBtb2RlIHN0YXRlLCBib3RoIHNldC9jbGVhciB0aGUgY2xhc3Mgb24gdGhlIGN1cnJlbnQgcGFnZSwgYW5kIHNldC9jbGVhciBhIHNlc3Npb24gY29va2llDQoJCS8vIChvYnNlcnZlZCBieSBwaHAgY29kZSkgc28gdGhlIGJlaGF2aW9yIHBlcnNpc3RzIGFjcm9zcyBzdWJzZXF1ZW50IGxvYWRzL3JlbG9hZHMuDQoJCWNvbnN0IGZuVXBkYXRlVG91Y2ggPSAoIHRvdWNoICkgPT4gew0KCQkJaWYgKHRvdWNoKSB7DQoJCQkJaWYgKCEkSFRNTC5oYXNDbGFzcygndG91Y2gnKSkgew0KCQkJCQkkSFRNTC5hZGRDbGFzcygndG91Y2gnKTsNCgkJCQl9DQoJCQkJVl9TZXRDb29raWUoICJzdHJSZXNwb25zaXZlVmlld1ByZWZzIiwgJ3RvdWNoJywgMCApOw0KCQkJfSBlbHNlIHsNCgkJCQlpZiAoJEhUTUwuaGFzQ2xhc3MoJ3RvdWNoJykpIHsNCgkJCQkJJEhUTUwucmVtb3ZlQ2xhc3MoJ3RvdWNoJyk7DQoJCQkJfQ0KCQkJCVZfU2V0Q29va2llKCAic3RyUmVzcG9uc2l2ZVZpZXdQcmVmcyIsIG51bGwsIC0xICk7DQoJCQl9DQoJCX0NCg0KCQkvLyBEZXRlY3QgaWYgd2UncmUgaW4gdG91Y2ggbW9kZSBieSBsb29raW5nIGZvciBhIGNvYXJzZSBwb2ludGVyLg0KCQlnX21xbFBvaW50ZXIgPSB3aW5kb3cubWF0Y2hNZWRpYSgiKHBvaW50ZXI6IGNvYXJzZSkiKTsNCg0KCQkvLyBGb3JjZSBhbiBpbW1lZGlhdGUgdXBkYXRlLCB0aGVuIHVwZGF0ZSBvbiBhbnkgZnV0dXJlIGNoYW5nZXMuDQoJCWZuVXBkYXRlVG91Y2goZ19tcWxQb2ludGVyLm1hdGNoZXMpOw0KCQlnX21xbFBvaW50ZXIub25jaGFuZ2UgPSAoZSkgPT4gZm5VcGRhdGVUb3VjaChlLm1hdGNoZXMpOw0KCX0NCn0NCg0KZnVuY3Rpb24gUmVzcG9uc2l2ZV9Jbml0VGFiU2VsZWN0KCAkICkNCnsNCgkvLyBoYW5kbGUgYW55IHRhYiBkcm9wZG93bnMNCgkkSihkb2N1bWVudCkub24oJ2NoYW5nZS5SZXNwb25zaXZlVGFiU2VsZWN0JywgJ3NlbGVjdC5yZXNwb25zaXZlX3RhYl9zZWxlY3QnLCBmdW5jdGlvbigpIHsNCgkJUmVzcG9uc2l2ZV9TZXRMb2NhdGlvbigkSih0aGlzKS52YWwoKSk7DQoJfSk7DQp9DQoNCmZ1bmN0aW9uIFJlc3BvbnNpdmVfU2V0TG9jYXRpb24oICR1cmwgKQ0Kew0KCWlmICh3aW5kb3cubG9jYXRpb24gIT0gJHVybCkgew0KCQl3aW5kb3cubG9jYXRpb24gPSAkdXJsOw0KCX0NCn0NCg0KZnVuY3Rpb24gUmVzcG9uc2l2ZV9CdWlsZENoYW5nZUxhbmd1YWdlT3B0aW9uKCAkTWVudUl0ZW0gKQ0Kew0KCSRNZW51SXRlbS5jbGljayggZnVuY3Rpb24oKSB7DQoJCXZhciAkTGFuZ3VhZ2VGb3JtID0gJEooJzxmb3JtLz4nLCB7J2NsYXNzJzogJ3Jlc3BvbnNpdmVfY2hhbmdlX2xhbmd1YWdlX2Zvcm0nIH0gKTsNCgkJdmFyICRTZWxlY3RCb3ggPSAkSignPHNlbGVjdC8+JywgeydjbGFzcyc6ICdyZXNwb25zaXZlX2NoYW5nZV9sYW5ndWFnZV9zZWxlY3QnIH0gKTsNCgkJJFNlbGVjdEJveC5hcHBlbmQoDQoJCQkkSignPG9wdGlvbi8+Jywge3ZhbHVlOiAiZW5nbGlzaCJ9ICkudGV4dCggJ0VuZ2xpc2gnICkNCgkJKTsNCgkJCQkJJFNlbGVjdEJveC5hcHBlbmQoDQoJCQkJJEooJzxvcHRpb24vPicsIHt2YWx1ZTogInNjaGluZXNlIn0gKS50ZXh0KCAn566A5L2T5Lit5paHIChTaW1wbGlmaWVkIENoaW5lc2UpJyApDQoJCQkpOw0KCQkJCQkkU2VsZWN0Qm94LmFwcGVuZCgNCgkJCQkkSignPG9wdGlvbi8+Jywge3ZhbHVlOiAidGNoaW5lc2UifSApLnRleHQoICfnuYHpq5TkuK3mlocgKFRyYWRpdGlvbmFsIENoaW5lc2UpJyApDQoJCQkpOw0KCQkJCQkkU2VsZWN0Qm94LmFwcGVuZCgNCgkJCQkkSignPG9wdGlvbi8+Jywge3ZhbHVlOiAiamFwYW5lc2UifSApLnRleHQoICfml6XmnKzoqp4gKEphcGFuZXNlKScgKQ0KCQkJKTsNCgkJCQkJJFNlbGVjdEJveC5hcHBlbmQoDQoJCQkJJEooJzxvcHRpb24vPicsIHt2YWx1ZTogImtvcmVhbmEifSApLnRleHQoICftlZzqta3slrQgKEtvcmVhbiknICkNCgkJCSk7DQoJCQkJCSRTZWxlY3RCb3guYXBwZW5kKA0KCQkJCSRKKCc8b3B0aW9uLz4nLCB7dmFsdWU6ICJ0aGFpIn0gKS50ZXh0KCAn4LmE4LiX4LiiIChUaGFpKScgKQ0KCQkJKTsNCgkJCQkJJFNlbGVjdEJveC5hcHBlbmQoDQoJCQkJJEooJzxvcHRpb24vPicsIHt2YWx1ZTogImJ1bGdhcmlhbiJ9ICkudGV4dCggJ9CR0YrQu9Cz0LDRgNGB0LrQuCAoQnVsZ2FyaWFuKScgKQ0KCQkJKTsNCgkJCQkJJFNlbGVjdEJveC5hcHBlbmQoDQoJCQkJJEooJzxvcHRpb24vPicsIHt2YWx1ZTogImN6ZWNoIn0gKS50ZXh0KCAnxIxlxaF0aW5hIChDemVjaCknICkNCgkJCSk7DQoJCQkJCSRTZWxlY3RCb3guYXBwZW5kKA0KCQkJCSRKKCc8b3B0aW9uLz4nLCB7dmFsdWU6ICJkYW5pc2gifSApLnRleHQoICdEYW5zayAoRGFuaXNoKScgKQ0KCQkJKTsNCgkJCQkJJFNlbGVjdEJveC5hcHBlbmQoDQoJCQkJJEooJzxvcHRpb24vPicsIHt2YWx1ZTogImdlcm1hbiJ9ICkudGV4dCggJ0RldXRzY2ggKEdlcm1hbiknICkNCgkJCSk7DQoJCQkJCSRTZWxlY3RCb3guYXBwZW5kKA0KCQkJCSRKKCc8b3B0aW9uLz4nLCB7dmFsdWU6ICJzcGFuaXNoIn0gKS50ZXh0KCAnRXNwYcOxb2wgLSBFc3Bhw7FhIChTcGFuaXNoIC0gU3BhaW4pJyApDQoJCQkpOw0KCQkJCQkkU2VsZWN0Qm94LmFwcGVuZCgNCgkJCQkkSignPG9wdGlvbi8+Jywge3ZhbHVlOiAibGF0YW0ifSApLnRleHQoICdFc3Bhw7FvbCAtIExhdGlub2Ftw6lyaWNhIChTcGFuaXNoIC0gTGF0aW4gQW1lcmljYSknICkNCgkJCSk7DQoJCQkJCSRTZWxlY3RCb3guYXBwZW5kKA0KCQkJCSRKKCc8b3B0aW9uLz4nLCB7dmFsdWU6ICJncmVlayJ9ICkudGV4dCggJ86VzrvOu863zr3Ouc66zqwgKEdyZWVrKScgKQ0KCQkJKTsNCgkJCQkJJFNlbGVjdEJveC5hcHBlbmQoDQoJCQkJJEooJzxvcHRpb24vPicsIHt2YWx1ZTogImZyZW5jaCJ9ICkudGV4dCggJ0ZyYW7Dp2FpcyAoRnJlbmNoKScgKQ0KCQkJKTsNCgkJCQkJJFNlbGVjdEJveC5hcHBlbmQoDQoJCQkJJEooJzxvcHRpb24vPicsIHt2YWx1ZTogIml0YWxpYW4ifSApLnRleHQoICdJdGFsaWFubyAoSXRhbGlhbiknICkNCgkJCSk7DQoJCQkJCSRTZWxlY3RCb3guYXBwZW5kKA0KCQkJCSRKKCc8b3B0aW9uLz4nLCB7dmFsdWU6ICJodW5nYXJpYW4ifSApLnRleHQoICdNYWd5YXIgKEh1bmdhcmlhbiknICkNCgkJCSk7DQoJCQkJCSRTZWxlY3RCb3guYXBwZW5kKA0KCQkJCSRKKCc8b3B0aW9uLz4nLCB7dmFsdWU6ICJkdXRjaCJ9ICkudGV4dCggJ05lZGVybGFuZHMgKER1dGNoKScgKQ0KCQkJKTsNCgkJCQkJJFNlbGVjdEJveC5hcHBlbmQoDQoJCQkJJEooJzxvcHRpb24vPicsIHt2YWx1ZTogIm5vcndlZ2lhbiJ9ICkudGV4dCggJ05vcnNrIChOb3J3ZWdpYW4pJyApDQoJCQkpOw0KCQkJCQkkU2VsZWN0Qm94LmFwcGVuZCgNCgkJCQkkSignPG9wdGlvbi8+Jywge3ZhbHVlOiAicG9saXNoIn0gKS50ZXh0KCAnUG9sc2tpIChQb2xpc2gpJyApDQoJCQkpOw0KCQkJCQkkU2VsZWN0Qm94LmFwcGVuZCgNCgkJCQkkSignPG9wdGlvbi8+Jywge3ZhbHVlOiAicG9ydHVndWVzZSJ9ICkudGV4dCggJ1BvcnR1Z3XDqnMgKFBvcnR1Z3Vlc2UgLSBQb3J0dWdhbCknICkNCgkJCSk7DQoJCQkJCSRTZWxlY3RCb3guYXBwZW5kKA0KCQkJCSRKKCc8b3B0aW9uLz4nLCB7dmFsdWU6ICJicmF6aWxpYW4ifSApLnRleHQoICdQb3J0dWd1w6pzIC0gQnJhc2lsIChQb3J0dWd1ZXNlIC0gQnJhemlsKScgKQ0KCQkJKTsNCgkJCQkJJFNlbGVjdEJveC5hcHBlbmQoDQoJCQkJJEooJzxvcHRpb24vPicsIHt2YWx1ZTogInJvbWFuaWFuIn0gKS50ZXh0KCAnUm9tw6JuxIMgKFJvbWFuaWFuKScgKQ0KCQkJKTsNCgkJCQkJJFNlbGVjdEJveC5hcHBlbmQoDQoJCQkJJEooJzxvcHRpb24vPicsIHt2YWx1ZTogInJ1c3NpYW4ifSApLnRleHQoICfQoNGD0YHRgdC60LjQuSAoUnVzc2lhbiknICkNCgkJCSk7DQoJCQkJCSRTZWxlY3RCb3guYXBwZW5kKA0KCQkJCSRKKCc8b3B0aW9uLz4nLCB7dmFsdWU6ICJmaW5uaXNoIn0gKS50ZXh0KCAnU3VvbWkgKEZpbm5pc2gpJyApDQoJCQkpOw0KCQkJCQkkU2VsZWN0Qm94LmFwcGVuZCgNCgkJCQkkSignPG9wdGlvbi8+Jywge3ZhbHVlOiAic3dlZGlzaCJ9ICkudGV4dCggJ1N2ZW5za2EgKFN3ZWRpc2gpJyApDQoJCQkpOw0KCQkJCQkkU2VsZWN0Qm94LmFwcGVuZCgNCgkJCQkkSignPG9wdGlvbi8+Jywge3ZhbHVlOiAidHVya2lzaCJ9ICkudGV4dCggJ1TDvHJrw6dlIChUdXJraXNoKScgKQ0KCQkJKTsNCgkJCQkJJFNlbGVjdEJveC5hcHBlbmQoDQoJCQkJJEooJzxvcHRpb24vPicsIHt2YWx1ZTogInZpZXRuYW1lc2UifSApLnRleHQoICdUaeG6v25nIFZp4buHdCAoVmlldG5hbWVzZSknICkNCgkJCSk7DQoJCQkJCSRTZWxlY3RCb3guYXBwZW5kKA0KCQkJCSRKKCc8b3B0aW9uLz4nLCB7dmFsdWU6ICJ1a3JhaW5pYW4ifSApLnRleHQoICfQo9C60YDQsNGX0L3RgdGM0LrQsCAoVWtyYWluaWFuKScgKQ0KCQkJKTsNCgkJDQoJCXZhciBNb2RhbCA9IG51bGw7DQoNCgkJdmFyIGZuQ2hhbmdlTGFuZ3VhZ2UgPSBmdW5jdGlvbigpIHsNCgkJCWlmICggJFNlbGVjdEJveC52YWwoKSAhPSAiZW5nbGlzaCIgKQ0KCQkJCUNoYW5nZUxhbmd1YWdlKCAkU2VsZWN0Qm94LnZhbCgpICk7DQoJCQlNb2RhbCAmJiBNb2RhbC5EaXNtaXNzKCk7DQoJCX07DQoNCgkJJExhbmd1YWdlRm9ybS5zdWJtaXQoIGZ1bmN0aW9uKGUpIHsNCgkJCWUucHJldmVudERlZmF1bHQoKTsNCgkJCWZuQ2hhbmdlTGFuZ3VhZ2UoKTsNCgkJfSk7DQoJCSRTZWxlY3RCb3guY2hhbmdlKCBmbkNoYW5nZUxhbmd1YWdlICk7DQoNCgkJJExhbmd1YWdlRm9ybS5hcHBlbmQoICRTZWxlY3RCb3ggKTsNCgkJJExhbmd1YWdlRm9ybS5hcHBlbmQoICRKKCc8aW5wdXQvPicsIHt0eXBlOiAnc3VibWl0J30gKS5oaWRlKCkgKTsNCgkJTW9kYWwgPSBTaG93Q29uZmlybURpYWxvZyggJ0NoYW5nZSBsYW5ndWFnZScsICRMYW5ndWFnZUZvcm0sICdDaGFuZ2UgbGFuZ3VhZ2UnICkuZG9uZSggZm5DaGFuZ2VMYW5ndWFnZSApOw0KCQkkU2VsZWN0Qm94LmZvY3VzKCk7DQoJfSk7DQp9DQoNCmZ1bmN0aW9uIFJlc3BvbnNpdmVfUmVxdWVzdERlc2t0b3BWaWV3KCkNCnsNCgkvLyB3ZSBjYW4gZHluYW1pY2FsbHkgc3dpdGNoLCBidXQgdGhpcyBkb2Vzbid0IHRyaWdnZXIgdGhlIHBob25lIHRvIHpvb20gb3V0IGFuZCBzb21lIGVsZW1lbnRzIGRvbid0IHJlc2l6ZSByaWdodA0KCS8qDQoJJEooJ2h0bWwnICkucmVtb3ZlQ2xhc3MoJ3Jlc3BvbnNpdmUgdG91Y2gnICkuYWRkQ2xhc3MoJ2ZvcmNlX2Rlc2t0b3AnKTsNCgkkSignbWV0YVtuYW1lPXZpZXdwb3J0XScgKS5hdHRyKCd2YWx1ZScsICcnICk7DQoJJEood2luZG93ICkudHJpZ2dlcigncmVzaXplJyk7DQoJKi8NCglSZXNwb25zaXZlX1VwZGF0ZVJlc3BvbnNpdmVQcmVmcyggJ2Rlc2t0b3AnLCB0cnVlICk7DQoJd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOw0KfQ0KDQpmdW5jdGlvbiBSZXNwb25zaXZlX1JlcXVlc3RNb2JpbGVWaWV3KCkNCnsNCgkvKg0KCSRKKCdodG1sJyApLnJlbW92ZUNsYXNzKCdmb3JjZV9kZXNrdG9wJyApLmFkZENsYXNzKCdyZXNwb25zaXZlJyk7DQoJJEooJ21ldGFbbmFtZT12aWV3cG9ydF0nICkuYXR0cigndmFsdWUnLCAnd2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MScgKTsNCgkkSih3aW5kb3cgKS50cmlnZ2VyKCdyZXNpemUnKTsNCgkqLw0KCVJlc3BvbnNpdmVfVXBkYXRlUmVzcG9uc2l2ZVByZWZzKCAnZGVza3RvcCcsIGZhbHNlICk7DQoJd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOw0KfQ0KDQoNCmZ1bmN0aW9uIFJlc3BvbnNpdmVfVXBkYXRlUmVzcG9uc2l2ZVByZWZzKCBzdHJGbGFnLCBiRW5hYmxlZCApDQp7DQoJaWYgKCBiRW5hYmxlZCApDQoJew0KCQlWX1NldENvb2tpZSggInN0clJlc3BvbnNpdmVWaWV3UHJlZnMiLCBzdHJGbGFnLCAzNjUgKTsNCgl9DQoJZWxzZQ0KCXsNCgkJVl9TZXRDb29raWUoICJzdHJSZXNwb25zaXZlVmlld1ByZWZzIiwgbnVsbCwgLTEgKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIFJlc3BvbnNpdmVfSW5pdFJlc3BvbnNpdmVUb2dnbGVFdmVudHMoICQgKQ0Kew0KCS8vIGluaXRpYWxseSB1bmRlZmluZWQsIHNvIHdlIHdpbGwgZmlyZSB0aGUgZXZlbnRzIGF0IGF0IHN0YXJ0DQoJdmFyIGJUb3VjaEZyaWVuZGx5LCBiU21hbGxTY3JlZW4sIGJNb2JpbGVTY3JlZW4sIGJHYW1lcGFkOw0KDQoJJCh3aW5kb3cpLm9uKCdyZXNpemUuUmVzcG9uc2l2ZVRvZ2dsZScsIGZ1bmN0aW9uKCkgew0KCQlpZiAoIHdpbmRvdy5Vc2VUb3VjaEZyaWVuZGx5TW9kZSgpICE9PSBiVG91Y2hGcmllbmRseSApDQoJCXsNCgkJCWJUb3VjaEZyaWVuZGx5ID0gd2luZG93LlVzZVRvdWNoRnJpZW5kbHlNb2RlKCk7DQoJCQkkKHdpbmRvdykudHJpZ2dlcignUmVzcG9uc2l2ZV9Ub3VjaEZyaWVuZGx5TW9kZVRvZ2dsZWQnKTsNCgkJfQ0KDQoJCWlmICggd2luZG93LlVzZVNtYWxsU2NyZWVuTW9kZSgpICE9PSBiU21hbGxTY3JlZW4gKQ0KCQl7DQoJCQliU21hbGxTY3JlZW4gPSB3aW5kb3cuVXNlU21hbGxTY3JlZW5Nb2RlKCk7DQoJCQkkKHdpbmRvdykudHJpZ2dlcignUmVzcG9uc2l2ZV9TbWFsbFNjcmVlbk1vZGVUb2dnbGVkJyk7DQoJCX0NCg0KCQlpZiAoIHdpbmRvdy5Vc2VNb2JpbGVTY3JlZW5Nb2RlKCkgIT09IGJNb2JpbGVTY3JlZW4gKQ0KCQl7DQoJCQliTW9iaWxlU2NyZWVuID0gd2luZG93LlVzZU1vYmlsZVNjcmVlbk1vZGUoKTsNCgkJCSQod2luZG93KS50cmlnZ2VyKCdSZXNwb25zaXZlX01vYmlsZVNjcmVlbk1vZGVUb2dnbGVkJyk7DQoJCX0NCg0KCQlpZiAoIHdpbmRvdy5Vc2VHYW1lcGFkU2NyZWVuTW9kZSgpICE9PSBiR2FtZXBhZCApDQoJCXsNCgkJCWJHYW1lcGFkID0gd2luZG93LlVzZUdhbWVwYWRTY3JlZW5Nb2RlKCk7DQoJCQkkKHdpbmRvdykudHJpZ2dlcignUmVzcG9uc2l2ZV9HYW1lcGFkU2NyZWVuTW9kZVRvZ2dsZWQnKTsNCgkJfQ0KDQoNCgl9ICkudHJpZ2dlciggJ3Jlc2l6ZS5SZXNwb25zaXZlVG9nZ2xlJyApOw0KfQ0KDQovKiByZXBhcmVudCBlbGVtZW50IHdoZW4gc2NyZWVuIHdpZHRoIGlzIHVwIHRvIE1PQklMRV9SRVNQT05TSVZFX0NTU19NQVhXSURUSCAqLw0KZnVuY3Rpb24gUmVzcG9uc2l2ZV9SZXBhcmVudEl0ZW1zSW5Nb2JpbGVNb2RlKCBzdHJJdGVtU2VsZWN0b3IsICRDdG5PckZuICkNCnsNCglyZXR1cm4gX1Jlc3BvbnNpdmVfUmVwYXJlbnRJdGVtcyggc3RySXRlbVNlbGVjdG9yLCAkQ3RuT3JGbiwgZnVuY3Rpb24oKSB7IHJldHVybiB3aW5kb3cuVXNlTW9iaWxlU2NyZWVuTW9kZSAmJiB3aW5kb3cuVXNlTW9iaWxlU2NyZWVuTW9kZSgpOyB9LCAnUmVzcG9uc2l2ZV9Nb2JpbGVTY3JlZW5Nb2RlVG9nZ2xlZCcgKTsNCn0NCg0KLyogcmVwYXJlbnQgZWxlbWVudCB3aGVuIHdlJ3JlIHJlbmRlcmluZyBpbiB0aGUgZ2FtZXBhZCBsYXlvdXQgKHdoaWNoIGNvdWxkIGJlIGFueSBzY3JlZW4gc2l6ZSBnaXZlbiBkb2NrZWQgdGFibGV0LCBzdGVhbSBtYWNoaW5lLCBzY2VuYXJpb3MpICovDQpmdW5jdGlvbiBSZXNwb25zaXZlX1JlcGFyZW50SXRlbXNJbkdhbWVwYWRNb2RlKCBzdHJJdGVtU2VsZWN0b3IsICRDdG5PckZuICkNCnsNCglyZXR1cm4gX1Jlc3BvbnNpdmVfUmVwYXJlbnRJdGVtcyggc3RySXRlbVNlbGVjdG9yLCAkQ3RuT3JGbiwgZnVuY3Rpb24oKSB7IHJldHVybiB3aW5kb3cuVXNlR2FtZXBhZFNjcmVlbk1vZGUgJiYgd2luZG93LlVzZUdhbWVwYWRTY3JlZW5Nb2RlKCk7IH0sICdSZXNwb25zaXZlX0dhbWVwYWRTY3JlZW5Nb2RlVG9nZ2xlZCcgKTsNCn0NCg0KLyogcmVwYXJlbnQgZWxlbWVudCB3aGVuIHNjcmVlbiB3aWR0aCBpcyB1cCB0byBSRVNQT05TSVZFX0NTU19NQVhXSURUSCwgb3Igd2UncmUgaW4gR2FtZXBhZFNjcmVlbk1vZGUgKi8NCmZ1bmN0aW9uIFJlc3BvbnNpdmVfUmVwYXJlbnRJdGVtc0luUmVzcG9uc2l2ZU1vZGUoIHN0ckl0ZW1TZWxlY3RvciwgJEN0bk9yRm4gKQ0Kew0KCXZhciBmblNob3VsZFJlcGFyZW50ID0gZnVuY3Rpb24oKQ0KCXsNCgkJcmV0dXJuICggKCB3aW5kb3cuVXNlU21hbGxTY3JlZW5Nb2RlICYmIHdpbmRvdy5Vc2VTbWFsbFNjcmVlbk1vZGUoKSApIHx8DQoJCQkoIHdpbmRvdy5Vc2VHYW1lcGFkU2NyZWVuTW9kZSAmJiB3aW5kb3cuVXNlR2FtZXBhZFNjcmVlbk1vZGUoKSApICk7DQoJfQ0KDQoJcmV0dXJuIF9SZXNwb25zaXZlX1JlcGFyZW50SXRlbXMoIHN0ckl0ZW1TZWxlY3RvciwgJEN0bk9yRm4sIGZuU2hvdWxkUmVwYXJlbnQsICdSZXNwb25zaXZlX1NtYWxsU2NyZWVuTW9kZVRvZ2dsZWQnICk7DQp9DQoNCmZ1bmN0aW9uIF9SZXNwb25zaXZlX1JlcGFyZW50SXRlbXMoIHN0ckl0ZW1TZWxlY3RvciwgJEN0bk9yRm4sIGZuU2hvdWxkUmVwYXJlbnQsIGJFdmVudCApDQp7DQoJdmFyIGZuUmVwYXJlbnRJdGVtcyA9IGZ1bmN0aW9uKCkgew0KDQoJCXZhciAkTW92ZUVsZW1lbnRzID0gJEooc3RySXRlbVNlbGVjdG9yKTsNCgkJJE1vdmVFbGVtZW50cy5lYWNoKCBmdW5jdGlvbigpIHsNCgkJCXZhciAkRWxlbWVudCA9ICRKKHRoaXMpOw0KCQkJdmFyICRPcmlnaW5hbFNwb3QgPSAkRWxlbWVudC5kYXRhKCdvcmlnaW5hbFNwb3QnICsgYkV2ZW50KTsNCg0KCQkJaWYgKCBmblNob3VsZFJlcGFyZW50KCkgKQ0KCQkJew0KICAgICAgICAgICAgICAgIGlmICggISRPcmlnaW5hbFNwb3QgKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAJJE9yaWdpbmFsU3BvdCA9ICRKKCAnPGRpdi8+JyApOw0KICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5hZnRlciggJE9yaWdpbmFsU3BvdCApOw0KICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5kYXRhKCdvcmlnaW5hbFNwb3QnICsgYkV2ZW50LCAkT3JpZ2luYWxTcG90ICk7DQogICAgICAgICAgICAgICAgfQ0KDQoJCQkJdmFyICRDdG47DQoJCQkJaWYgKCB0eXBlb2YgJEN0bk9yRm4gPT09ICdmdW5jdGlvbicgKSB7DQoJCQkJCSRDdG4gPSAkQ3RuT3JGbiggJEVsZW1lbnQgKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQkkQ3RuID0gJEN0bk9yRm47DQoJCQkJfQ0KDQoJCQkJJEN0bi5hcHBlbmQoICRFbGVtZW50ICk7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJaWYgKCAkT3JpZ2luYWxTcG90ICkNCgkJCQl7DQoJCQkJCS8vIElmIHdlJ3ZlIHRyYWNrZWQgYW4gb3JpZ2luYWwgcGFyZW50LCBwdXQgdXMgYmFjaw0KCQkJCQkkT3JpZ2luYWxTcG90LmFmdGVyKCAkRWxlbWVudCApOw0KCQkJCQkkT3JpZ2luYWxTcG90LnJlbW92ZSgpOw0KCQkJCQkkRWxlbWVudC5yZW1vdmVEYXRhKCAnb3JpZ2luYWxTcG90JyArIGJFdmVudCApOw0KCQkJCX0NCgkJCQkvLyBPdGhlcndpc2UsIHdlIHNob3VsZCBhbHJlYWR5IGJlIHdoZXJlIHdlIHdhbnQNCgkJCX0NCgkJfSk7DQoNCgl9Ow0KDQoJZm5SZXBhcmVudEl0ZW1zKCk7DQoJJEooIHdpbmRvdyApLm9uKCBiRXZlbnQsIGZuUmVwYXJlbnRJdGVtcyApOw0KfQ0KDQpmdW5jdGlvbiBSZXNwb25zaXZlX0luaXRKUVBsb3RIb29rcyggJCApDQp7DQoJaWYgKCAkLmpxcGxvdCApDQoJew0KCQkkLmpxcGxvdC5wb3N0SW5pdEhvb2tzLnB1c2goIGZ1bmN0aW9uKCBuYW1lLCBkYXRhLCBvcHRpb25zICkgew0KCQkJdmFyIGpxcGxvdCA9IHRoaXM7DQoJCQl2YXIgYldhc0luUmVzcG9uc2l2ZU1vZGU7DQoNCgkJCS8vcmVwbG90dGluZyBpcyB2ZXJ5IGV4cGVuc2l2ZSwgc28gd2UgdHJ5IHRvIGRlbGF5IGlmIHRoZSB1c2VyIGlzIGFjdGl2ZWx5IHJlc2l6aW5nDQoJCQl2YXIgaVJlcGxvdEludGVydmFsOw0KCQkJJEood2luZG93KS5yZXNpemUoIGZ1bmN0aW9uKCkgew0KCQkJCWlmICggKCBVc2VTbWFsbFNjcmVlbk1vZGUoKSB8fCBiV2FzSW5SZXNwb25zaXZlTW9kZSApICkNCgkJCQl7DQoJCQkJCWlmICggaVJlcGxvdEludGVydmFsICkNCgkJCQkJew0KCQkJCQkJLy8gd2Ugd2lsbCByZXNjaGVkdWxlIGZvciAxMDBtcyBmcm9tIG5vdw0KCQkJCQkJd2luZG93LmNsZWFySW50ZXJ2YWwoIGlSZXBsb3RJbnRlcnZhbCApOw0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJLy9pbnRlcnZhbCBoYXNuJ3QgYmVlbiBzY2hlZHVsZWQgeWV0LCBtdXN0IGJlIHRoZSBmaXJzdCByZXNpemUuDQoJCQkJCQkvLyBzZXQgb3ZlcmZsb3cgdG8gaGlkZGVuIHNvIHRoZSBwbG90IGRvZXNuJ3Qgc3RyZXRjaCB0aGUgcGFnZSB3aGlsZSByZXNpemluZw0KCQkJCQkJanFwbG90LnRhcmdldC5jc3MoICdvdmVyZmxvdycsICdoaWRkZW4nICk7DQoJCQkJCX0NCg0KCQkJCQlpUmVwbG90SW50ZXJ2YWwgPSB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7DQoJCQkJCQlpUmVwbG90SW50ZXJ2YWwgPSBudWxsOw0KDQoJCQkJCQlqcXBsb3QucmVwbG90KCk7DQoNCgkJCQkJCWpxcGxvdC50YXJnZXQuY3NzKCAnb3ZlcmZsb3cnLCAnJyApOw0KCQkJCQl9LCAxMDAgKTsNCg0KCQkJCQliV2FzSW5SZXNwb25zaXZlTW9kZSA9IFVzZVNtYWxsU2NyZWVuTW9kZSgpOw0KCQkJCX0NCgkJCX0pOw0KCQl9KTsNCgl9DQp9DQoNCi8vIEVuYWJsZSB0b2dnbGluZyB0aGUgbG9jYWwgbWVudSB2aWEgSlMNCi8vIEFkZGVkIHNvIHNlYXJjaCBjYW4gc3VwcG9ydCB1c2Ugb2YgYSBnYW1lcGFkIGJ1dHRvbiB0byBvcGVuIHRoZSBmaWx0ZXIgd2luZG93DQp2YXIgZ19mbkFjdGl2YXRlTG9jYWxNZW51ID0gZmFsc2U7DQpmdW5jdGlvbiBSZXNwb25zaXZlX1RvZ2dsZUxvY2FsTWVudSgpDQp7DQoJaWYgKCBnX2ZuQWN0aXZhdGVMb2NhbE1lbnUgKQ0KCQlnX2ZuQWN0aXZhdGVMb2NhbE1lbnUoKTsNCgllbHNlDQoJCWNvbnNvbGUuZXJyb3IoImF0dGVtcHRlZCB0byBvcGVuIGEgbG9jYWwgbWVudSB3aGljaCBkb2VzIG5vdCBleGlzdCIpOw0KfQ0KPC9zY3JpcHQ+DQo8bWV0YSBjb250ZW50PSJzdW1tYXJ5X2xhcmdlX2ltYWdlIiBuYW1lPSJ0d2l0dGVyOmNhcmQiLz4NCjxtZXRhIGNvbnRlbnQ9IkBzdGVhbSIgbmFtZT0idHdpdHRlcjpzaXRlIj4NCjxtZXRhIGNvbnRlbnQ9IlN0ZWFtIFdvcmtzaG9wOjpIZWxtZXQgVXRpbGl0eSBEZXZpY2UiIHByb3BlcnR5PSJvZzp0aXRsZSI+DQo8bWV0YSBjb250ZW50PSJTdGVhbSBXb3Jrc2hvcDo6SGVsbWV0IFV0aWxpdHkgRGV2aWNlIiBwcm9wZXJ0eT0idHdpdHRlcjp0aXRsZSI+DQo8bWV0YSBjb250ZW50PSJ3ZWJzaXRlIiBwcm9wZXJ0eT0ib2c6dHlwZSIvPg0KPG1ldGEgY29udGVudD0iaHR0cHM6Ly9pbWFnZXMuc3RlYW11c2VyY29udGVudC5jb20vdWdjLzE2ODA5MTcxMDU4NjQxNDAxNTg4LzI5QUUzQjdFMDhCMkFBRjI3NDk3QUIwMDZBRkUwM0M3QjhBMjM4NUQvP2ltdz01MTImYW1wOyZhbXA7aW1hPWZpdCZhbXA7aW1wb2xpY3k9TGV0dGVyYm94JmFtcDtpbWNvbG9yPSUyMzAwMDAwMCZhbXA7bGV0dGVyYm94PWZhbHNlIiBwcm9wZXJ0eT0ib2c6aW1hZ2UiPg0KPG1ldGEgY29udGVudD0iaHR0cHM6Ly9pbWFnZXMuc3RlYW11c2VyY29udGVudC5jb20vdWdjLzE2ODA5MTcxMDU4NjQxNDAxNTg4LzI5QUUzQjdFMDhCMkFBRjI3NDk3QUIwMDZBRkUwM0M3QjhBMjM4NUQvP2ltdz01MTImYW1wOyZhbXA7aW1hPWZpdCZhbXA7aW1wb2xpY3k9TGV0dGVyYm94JmFtcDtpbWNvbG9yPSUyMzAwMDAwMCZhbXA7bGV0dGVyYm94PWZhbHNlIiBuYW1lPSJ0d2l0dGVyOmltYWdlIj4NCjwvbWV0YT48L21ldGE+PC9tZXRhPjwvbWV0YT48L21ldGE+PHN0eWxlPi8qDQogRm9udDogCQlNb3RpdmEgU2Fucw0KIFVSTDogCQlodHRwOi8vd3d3LnlvdXdvcmtmb3J0aGVtLmNvbS9wcm9kdWN0LnBocD9za3U9VDI5ODINCiBGb3VuZHJ5OiAJTmlyYW1la2tvDQogRm91bmRyeTogCWh0dHA6Ly93d3cueW91d29ya2ZvcnRoZW0uY29tL2Rlc2lnbmVyLzI5My9uaXJhbWVra28NCiBDb3B5cmlnaHQ6CUNvcHlyaWdodCAgMjAxMSBieSBSb2RyaWdvIFNhaWFuaS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiBWZXJzaW9uOiAJMS4wDQogQ3JlYXRlZDoJQXVndXN0IDA5LCAyMDEyDQogTGljZW5zZTogCWh0dHA6Ly93d3cueW91d29ya2ZvcnRoZW0uY29tL2ZvbnQtbGljZW5zZQ0KIExpY2Vuc2U6IAlUaGUgV2ViRm9udChzKSBsaXN0ZWQgaW4gdGhpcyBkb2N1bWVudCBtdXN0IGZvbGxvdyB0aGUgWW91V29ya0ZvclRoZW0NCgkJCSBXZWJGb250IGxpY2Vuc2UgcnVsZXMuIEFsbCBvdGhlciBwYXJ0aWVzIGFyZSBzdHJpY3RseSByZXN0cmljdGVkDQoJCQkgZnJvbSB1c2luZyB0aGUgV2ViRm9udHMocykgbGlzdGVkIHdpdGhvdXQgYSBwdXJjaGFzZWQgbGljZW5zZS4NCgkJCSBBbGwgZGV0YWlscyBhYm92ZSBtdXN0IGFsd2F5cyByZW1haW4gdW5hbHRlcmVkIGFuZCB2aXNpYmxlIGluIHlvdXIgQ1NTLg0KICovDQoNCkBmb250LWZhY2Ugew0KCWZvbnQtZmFtaWx5OiAnTW90aXZhIFNhbnMnOw0KCXNyYzogdXJsKCdkYXRhOmZvbnQvdHRmO2Jhc2U2NCxBQUVBQUFBU0FRQUFCQUFnUkZOSlJ3QUFBQUVBQWQ4MEFBQUFDRWRFUlVZTnRnNDBBQUFCTEFBQUFFQkhVRTlUT2o1OWp3QUFBV3dBQUhWNlIxTlZRdUZrd2RzQUFIYm9BQUFicEU5VEx6SjFOcDRJQUFDU2pBQUFBR0JqYldGdzltU0xvd0FBa3V3QUFBV09ZM1owSUVhL0NaUUFBYzk4QUFBQXlHWndaMjJlTmlIU0FBSFFSQUFBRGhWbllYTndBQUFBRUFBQnozUUFBQUFJWjJ4NVpvcGZiY0lBQUpoOEFBRUI3bWhsWVdRWHRQdElBQUdhYkFBQUFEWm9hR1ZoQnI4R1J3QUJtcVFBQUFBa2FHMTBlSWJqYkpZQUFacklBQUFNNW14dlkyRkRTQUthQUFHbnNBQUFCcVp0WVhod0JLQVBFd0FCcmxnQUFBQWdibUZ0WmRXSWttd0FBYTU0QUFBRGIzQnZjM1NoODhRWUFBR3g2QUFBSFl0d2NtVndtcW1tamdBQjNsd0FBQURXQUFFQUFBQU1BQUFBQUFBQUFBSUFDQUFDQU5rQUFRRGJBUmtBQVFFYkFYTUFBUUYwQVhVQUFnRjJBYXNBQVFHdEFpOEFBUU1BQXhJQUF3TWdBMUVBQXdBQkFBQUFDZ0R3QTBRQUFrUkdURlFBRG14aGRHNEFJQUFFQUFBQUFQLy9BQVFBQUFBTEFCWUFJUUE2QUFsQldrVWdBRWhEUVZRZ0FGWkRVbFFnQUdSTFFWb2dBSEpOVDB3Z0FJQk9URVFnQUk1U1QwMGdBSnhVUVZRZ0FLcFVVa3NnQUxnQUFQLy9BQVFBQVFBTUFCY0FJZ0FBLy84QUJBQUNBQTBBR0FBakFBRC8vd0FFQUFNQURnQVpBQ1FBQVAvL0FBUUFCQUFQQUJvQUpRQUEvLzhBQkFBRkFCQUFHd0FtQUFELy93QUVBQVlBRVFBY0FDY0FBUC8vQUFRQUJ3QVNBQjBBS0FBQS8vOEFCQUFJQUJNQUhnQXBBQUQvL3dBRUFBa0FGQUFmQUNvQUFQLy9BQVFBQ2dBVkFDQUFLd0FzWTNCemNBRUtZM0J6Y0FFUVkzQnpjQUVXWTNCemNBRWNZM0J6Y0FFaVkzQnpjQUVvWTNCemNBRXVZM0J6Y0FFMFkzQnpjQUU2WTNCemNBRkFZM0J6Y0FGR2EyVnliZ0ZNYTJWeWJnRlVhMlZ5YmdGY2EyVnliZ0ZrYTJWeWJnRnNhMlZ5YmdGMGEyVnliZ0Y4YTJWeWJnR0VhMlZ5YmdHTWEyVnliZ0dVYTJWeWJnR2NiV0Z5YXdHa2JXRnlhd0dxYldGeWF3R3diV0Z5YXdHMmJXRnlhd0c4YldGeWF3SENiV0Z5YXdISWJXRnlhd0hPYldGeWF3SFViV0Z5YXdIYWJXRnlhd0hnYld0dGF3SG1iV3R0YXdId2JXdHRhd0g2Yld0dGF3SUViV3R0YXdJT2JXdHRhd0lZYld0dGF3SWliV3R0YXdJc2JXdHRhd0kyYld0dGF3SkFiV3R0YXdKS0FBQUFBUUFBQUFBQUFRQUFBQUFBQVFBQUFBQUFBUUFBQUFBQUFRQUFBQUFBQVFBQUFBQUFBUUFBQUFBQUFRQUFBQUFBQVFBQUFBQUFBUUFBQUFBQUFRQUFBQUFBQWdBQkFBSUFBQUFDQUFFQUFnQUFBQUlBQVFBQ0FBQUFBZ0FCQUFJQUFBQUNBQUVBQWdBQUFBSUFBUUFDQUFBQUFnQUJBQUlBQUFBQ0FBRUFBZ0FBQUFJQUFRQUNBQUFBQWdBQkFBSUFBQUFDQUFFQUFnQUFBQUVBQXdBQUFBRUFBd0FBQUFFQUF3QUFBQUVBQXdBQUFBRUFBd0FBQUFFQUF3QUFBQUVBQXdBQUFBRUFBd0FBQUFFQUF3QUFBQUVBQXdBQUFBRUFBd0FBQUFNQUJBQUZBQVlBQUFBREFBUUFCUUFHQUFBQUF3QUVBQVVBQmdBQUFBTUFCQUFGQUFZQUFBQURBQVFBQlFBR0FBQUFBd0FFQUFVQUJnQUFBQU1BQkFBRkFBWUFBQUFEQUFRQUJRQUdBQUFBQXdBRUFBVUFCZ0FBQUFNQUJBQUZBQVlBQUFBREFBUUFCUUFHQUFjQUVBQVlBQ1lBT2dCQ0FFb0FVZ0FCQUFBQUFRQktBQUlBQ0FBRUFFd0FkZ0NhQVpRQUFnQUlBQWNCK2lZc01IbzJqanpPUFB3L2ZBQUVBQUFBQVQrQUFBWUFBQUFCWHhBQUJnQUFBQUZmbmdBR0FBQUFBV0lzQUFGandBQUZBQVVBQ2dBQlk4WUFCQUFBQUFRQUVnQVlBQjRBSkFBQkFydi94QUFCQXJ6L3hBQUJBcnYveEFBQkFyei94QUFDWTZZQUJBQUFaaHBtSGdBQkFBb0FBUC9wLzliLzZmLzQvL2IvL1AvNy8vNy8vZ0FDWTRvQUJBQUFabzVuTGdBTkFBa0FBUC9KLzhzQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELzlBQWYvLzcvL2dBQUFBQUFBUCs4Lzd3QUFBQUFBQUFBQVAvdkFBQUFBQUFBQUFBQUFBQUFBQUFBQVAveEFBQUFBQUFBQUFELzVBQVVBQUFBQUFBRi8vRUFBQUFBQUFBQUFBQUFBQUFBQVAvdEFBQUFBQUFBQUFELzhRQUFBQUFBQUFBQUFBQUFBUC9uLys0QUFBQUFBQUFBQUFBQUFBQUFBUC8rQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC8rLy80QUFBQUFBQUFBQUFBQUFBQUFBQUFDQUFVQUFBQUFBQUFBQVAvM0FBQUFBUC81Ly9jQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvK0FBQUFBbUxNQUFRQUFHYThadGdBQlFBS0FBRC80Zi9wLzlqL3d2LzBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvckFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQS82d0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC9FQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELzlBQUJZbXdBQkFBQUFSQUNLZ0k4QWtZQ1VBSmFBbVFDYmdKNEFvSUNqQUtXQXFBQ3FnSzBBcjRDeUFMU0F0d0M1Z01BQXdvREpBTktBM0FEbGdPOEErSUVDQVF1QkZRRmFnV1FCY1lGN0FZU0JqZ0diZ2VFQjRvSGtBZTJCOXdJQWdnb0NFNEloQWlxQ01RSTNnajRDUklKTEFsR0NWQUpiZ21NQ2FvSnlBbm1DaHdLVWdxSUNyNEs5QXNxQzBnTFpndUVDNklMd0F2ZUMrd01DZ3dvREVZTVpBeUNES0FNdmd6Y0RQb05BQTBHRFF3TkVnMFlEUjROSkEwcURUQU5OZzA4RFVJTlNBMU9EVlFOV2cxZ0RXWU5iQTF5RFhnTmZnMkVEWW9OeEEzS0RkQU4yZzNnRGVZTjdBNENEZ2dPRGc0c0RuNE94QTdPRHRnTzRnN3NEdllQQkE4T0R4Z1BWZzlnRDJvUGRBOStENGdQa2crY0Q2WVBzQS9DRUFRUUloQ2NFTG9SQkJGR0VjZ1I1aElFRWlJU1pCSnFFcXdTMmhOY0UySVRhQk51RTNRVGVoT0FFNTRUdkJRT0ZEd1V1aFRBRk00VTNCVHFGUGdWQmhVVUZSNFZMQlU2RlhnVmhoV2dGYm9WMUJYK0ZoZ1dMaFpFRmxvV2NCYUdGcHdXcmhhOEZzb1cyQmJtRnZRWEFoY1FGeDRYTEJjNkYxZ1haaGQwRjRJWGtCZXVGOHdYM2hma0Yrb1g4QmYyRi93WUFoZ1VHQ1lZT0JoS0dGd1pYaGx3R25JYmRCdUdHNWdicWh1OEc4NGI0QnZ5SEFRY0Zod3dIRW9jWkJ4K0hKZ2RtaDIwSHJZZTFCL2VIL2dnRWlBc0lTNGhTQ0pLSW1RaWhpS2dJcm9pMUNMdUl3Z2pJaU04STBZalVDTmFJMlFqYmlONEk0b2pvQ08ySTh3ajRpUDRKQTRrRkNRYUpDQWtKaVFzQUFRQkNRQWFBUW9BR2dFTEFCb0JEQUFhQUFJQkFBQUFBUWdBQWdBQ0FRQUFBQUVJQUFJQUFnRUFBQUFCQ0FBQ0FBSUJBQUFBQVFnQUFnQUNBUUFBQUFFSUFBSUFBZ0VBQUFBQkNBQUNBQUlCQUFBQUFRZ0FBZ0FDQVFBQUFBRUlBQUlBQWdFQUFBQUJDQUFDQUFJQkFBQUFBUWdBQWdBQ0FRQUFBQUVJQUFJQUFnRUFBQUFCQ0FBQ0FBSUJBQUFBQVFnQUFnQUNBUUFBQUFFSUFBSUFBZ0VBQUFBQkNBQUNBQUlCQUFBQUFRZ0FBZ0FDQVFBQUFBRUlBQUlBQmdFQUFBQUJDQUFDQVFrQUx3RUtBQzhCQ3dBdkFRd0FMd0FDQVFBQUFBRUlBQUlBQmdEL0FBSUJBQUFTQVFnQUZnRzgvLzRCdlFBQ0FjVUFGQUFKQUVjQUR3QktBQThBVGdBWEFQOEFCUUVJQUFjQnV3QUpBYjBBQ1FIQUFBd0J4UUFIQUFrQVJ3QVBBRW9BRHdCT0FCY0Evd0FGQVFnQUJ3RzdBQWtCdlFBSkFjQUFEQUhGQUFjQUNRQkhBQThBU2dBUEFFNEFGd0QvQUFVQkNBQUhBYnNBQ1FHOUFBa0J3QUFNQWNVQUJ3QUpBRWNBRHdCS0FBOEFUZ0FYQVA4QUJRRUlBQWNCdXdBSkFiMEFDUUhBQUF3QnhRQUhBQWtBUndBUEFFb0FEd0JPQUJjQS93QUZBUWdBQndHN0FBa0J2UUFKQWNBQURBSEZBQWNBQ1FCSEFBOEFTZ0FQQUU0QUZ3RC9BQVVCQ0FBSEFic0FDUUc5QUFrQndBQU1BY1VBQndBSkFFY0FEd0JLQUE4QVRnQVhBUDhBQlFFSUFBY0J1d0FKQWIwQUNRSEFBQXdCeFFBSEFBa0FSd0FQQUVvQUR3Qk9BQmNBL3dBRkFRZ0FCd0c3QUFrQnZRQUpBY0FBREFIRkFBY0FSUUJIQUE4QVNnQVBBRTRBRndEL0FBVUJDQUFIQVhZQUJ3R1BBQWNCbGdBSEFaY0FCd0dZQUFjQm1RQUhBWm9BQndHYkFBY0JuQUFIQVowQUJ3R2VBQWNCbndBSEFhQUFCd0doQUFjQm9nQUhBYU1BQndHa0FBY0JwUUFIQWFZQUJ3R25BQWNCcUFBSEFha0FCd0dxQUFjQnF3QUhBYTBBQndHMEFBY0J0UUFIQWJZQUJ3RzNBQWNCdUFBSEFia0FCd0c2QUFjQnV3QUpBYndBQndHOUFBVUJ2Z0FIQWI4QUJ3SEFBQTRCd1FBSEFjSUFCd0hEQUFjQnhBQUhBY1VBQndIS0FBY0J5d0FIQWN3QUJ3SE5BQWNCemdBSEFjOEFCd0hRQUFjQjBRQUhBZElBQndIVEFBY0IxQUFIQWRVQUJ3SFdBQWNCMXdBSEFkZ0FCd0h5QUFjQjh3QUhBZlVBQndIMkFBY0I5d0FIQWZnQUJ3QUpBRWNBRHdCS0FBOEFUZ0FYQVA4QUJRRUlBQWNCdXdBSkFiMEFDUUhBQUF3QnhRQUhBQTBBUndBUEFFb0FEd0JPQUJjQS93QUZBUWdBQndFSkFBa0JDZ0FKQVFzQUNRRU1BQWtCdXdBSkFiMEFDUUhBQUF3QnhRQUhBQWtBUndBUEFFb0FEd0JPQUJjQS93QUZBUWdBQndHN0FBa0J2UUFKQWNBQURBSEZBQWNBQ1FCSEFBOEFTZ0FQQUU0QUZ3RC9BQVVCQ0FBSEFic0FDUUc5QUFrQndBQU1BY1VBQndBSkFFY0FEd0JLQUE4QVRnQVhBUDhBQlFFSUFBY0J1d0FKQWIwQUNRSEFBQXdCeFFBSEFBMEFSd0FQQUVvQUR3Qk9BQmNBL3dBRkFRZ0FCd0VKQUJFQkNnQVJBUXNBRVFFTUFCRUJ1d0FKQWIwQUNRSEFBQXdCeFFBSEFFVUFHZ0FQQUNFQUR3QWlBQThBSXdBUEFDUUFEd0FsQUE4QUpnQVBBQ2NBRHdBb0FBOEFLUUFQQUNvQUR3QXJBQThBTEFBUEFDMEFEd0F1QUE4QUx3QVBBREFBRHdBeEFBOEFNZ0FQQURNQUR3QTBBQThBTlFBUEFEWUFEd0EzQUE4QVBnQVBBRDhBRHdCQUFBOEFRUUFQQUVJQUR3QkRBQThBUkFBUEFFVUFEd0JHQUE4QVJ3QVBBRWdBRHdCSkFBOEFTZ0FQQUVzQUR3Qk1BQThBVFFBUEFFNEFGd0JTQUE4QVV3QVBBRlFBRHdCVkFBOEFWZ0FQQUZjQUR3QllBQThBV1FBUEFGb0FEd0JiQUE4QVhBQVBBRjBBRHdCZUFBOEFYd0FQQUdBQUR3QjZBQThBZXdBUEFIMEFEd0IrQUE4QWZ3QVBBSUFBRHdDSEFBOEEvd0FGQVFnQUJ3RzdBQWtCdlFBSkFjQUFEQUhGQUFjQUFRSEZBQWtBQVFIRkFBa0FDUUJIQUE4QVNnQVBBRTRBRndEL0FBVUJDQUFIQWJzQUNRRzlBQWtCd0FBTUFjVUFCd0FKQUVjQUR3QktBQThBVGdBWEFQOEFCUUVJQUFjQnV3QUpBYjBBQ1FIQUFBd0J4UUFIQUFrQVJ3QVBBRW9BRHdCT0FCY0Evd0FGQVFnQUJ3RzdBQWtCdlFBSkFjQUFEQUhGQUFjQUNRQkhBQThBU2dBUEFFNEFGd0QvQUFVQkNBQUhBYnNBQ1FHOUFBa0J3QUFNQWNVQUJ3QUpBRWNBRHdCS0FBOEFUZ0FYQVA4QUJRRUlBQWNCdXdBSkFiMEFDUUhBQUF3QnhRQUhBQTBBUndBUEFFb0FEd0JPQUJjQS93QUZBUWdBQndFSkFBY0JDZ0FIQVFzQUJ3RU1BQWNCdXdBSkFiMEFDUUhBQUF3QnhRQUhBQWtBUndBUEFFb0FEd0JPQUJjQS93QUZBUWdBQndHN0FBa0J2UUFKQWNBQURBSEZBQWNBQmdEK0FBY0JBQUFIQVFNQUNRRUlBQWNCd0FBSEFjVUFCd0FHQVA0QUJ3RUFBQWNCQXdBSkFRZ0FCd0hBQUFjQnhRQUhBQVlBL2dBSEFRQUFCd0VEQUFrQkNBQUhBY0FBQndIRkFBY0FCZ0QrQUFjQkFBQUhBUU1BQ1FFSUFBY0J3QUFIQWNVQUJ3QUdBUDRBQndFQUFBY0JBd0FKQVFnQUJ3SEFBQWNCeFFBSEFBWUEvZ0FIQVFBQUJ3RURBQWtCQ0FBSEFjQUFCd0hGQUFjQUFnRUFBQUFCQ0FBQ0FBY0JBQUFnQVFnQUl3RzhBQUlCdlFBSEFjRC85Z0hELy9nQnhRQVpBQWNCQUFBZ0FRZ0FJd0c4QUFJQnZRQUhBY0QvOWdIRC8vZ0J4UUFaQUFjQkFBQWdBUWdBSXdHOEFBSUJ2UUFIQWNELzlnSEQvL2dCeFFBWkFBY0JBQUFnQVFnQUl3RzhBQUlCdlFBSEFjRC85Z0hELy9nQnhRQVpBQWNCQUFBZ0FRZ0FJd0c4QUFJQnZRQUhBY0QvOWdIRC8vZ0J4UUFaQUEwQVJ3QXhBRTRBUFFEK0FEWUJBQUFzQVFNQU1BRUlBQ2tCdkFBdkFiMEFPd0crQUNnQndBQTdBY0VBS0FIREFERUJ4UUE1QUEwQVJ3QXhBRTRBUFFEK0FEWUJBQUFzQVFNQU1BRUlBQ2tCdkFBdkFiMEFPd0crQUNnQndBQTdBY0VBS0FIREFERUJ4UUE1QUEwQVJ3QXhBRTRBUFFEK0FEWUJBQUFzQVFNQU1BRUlBQ2tCdkFBdkFiMEFPd0crQUNnQndBQTdBY0VBS0FIREFERUJ4UUE1QUEwQVJ3QXhBRTRBUFFEK0FEWUJBQUFzQVFNQU1BRUlBQ2tCdkFBdkFiMEFPd0crQUNnQndBQTdBY0VBS0FIREFERUJ4UUE1QUEwQVJ3QXhBRTRBUFFEK0FEWUJBQUFzQVFNQU1BRUlBQ2tCdkFBdkFiMEFPd0crQUNnQndBQTdBY0VBS0FIREFERUJ4UUE1QUEwQVJ3QXhBRTRBUFFEK0FEWUJBQUFzQVFNQU1BRUlBQ2tCdkFBdkFiMEFPd0crQUNnQndBQTdBY0VBS0FIREFERUJ4UUE1QUFjQUdmK2ZBUUFBREFFSUFCMEJ2UC85QWIwQUVRSERBQW9CeFFBZEFBY0FHZit1QVFNQUZBRUlBQjBCdkFBTUFiMEFEQUhEQUF3QnhRQWJBQWNBR2YrdUFRTUFGQUVJQUIwQnZBQU1BYjBBREFIREFBd0J4UUFiQUFjQUdmK3VBUU1BRkFFSUFCMEJ2QUFNQWIwQURBSERBQXdCeFFBYkFBY0FHZit1QVFNQUZBRUlBQjBCdkFBTUFiMEFEQUhEQUF3QnhRQWJBQWNBR2YrdUFRTUFGQUVJQUIwQnZBQU1BYjBBREFIREFBd0J4UUFiQUFNQkNBQUpBYjBBQ1FIRkFBd0FCd0VBQUE0QkF3QUhBUWdBREFHOEFBVUJ2UUFUQWNNQUJRSEZBQllBQndFQUFBNEJBd0FIQVFnQURBRzhBQVVCdlFBVEFjTUFCUUhGQUJZQUJ3RUFBQTRCQXdBSEFRZ0FEQUc4QUFVQnZRQVRBY01BQlFIRkFCWUFCd0VBQUE0QkF3QUhBUWdBREFHOEFBVUJ2UUFUQWNNQUJRSEZBQllBQndFQUFBNEJBd0FIQVFnQURBRzhBQVVCdlFBVEFjTUFCUUhGQUJZQUJ3RUFBQTRCQXdBSEFRZ0FEQUc4QUFVQnZRQVRBY01BQlFIRkFCWUFCd0VBQUE0QkF3QUhBUWdBREFHOEFBVUJ2UUFUQWNNQUJRSEZBQllBQndFQUFBNEJBd0FIQVFnQURBRzhBQVVCdlFBVEFjTUFCUUhGQUJZQUJ3RUFBQTRCQXdBSEFRZ0FEQUc4QUFVQnZRQVRBY01BQlFIRkFCWUFBUUVJQUFrQUFRRUlBQWtBQVFFSUFBa0FBUUVJQUFrQUFRRURBQWtBQVFFREFBa0FBUUVEQUFrQUFRRURBQWtBQVFFREFBa0FBUUVEQUFrQUFRRURBQWtBQVFFREFBa0FBUUVEQUFrQUFRRURBQWtBQVFFREFBa0FBUUVEQUFrQUFRRURBQWtBQVFFREFBa0FBUUVEQUFrQUFRRURBQWtBQVFFREFBa0FBUUVEQUFrQUFRRURBQWtBQVFFREFBa0FEZ0VEQUFrQkNRQlpBUW9BV1FFTEFGa0JEQUJaQVdmLytBRm8vL2dCYWYvNEFXci8rQUZyLy9nQmJQLzRBVzMvK0FGdS8vZ0JiLy80QUFFQkF3QUpBQUVCQXdBSkFBSUJBQUFIQVFNQUV3QUJBUU1BQndBQkFRTUFCd0FCQVFNQUJ3QUZBUU1BQndFSkFBY0JDZ0FIQVFzQUJ3RU1BQWNBQVFFREFBY0FBUUVEQUFjQUJ3RDRBQWNBL3dBSkFRQUFCUUVEQUFjQkJnQUZBUWdBRVFFVUFCa0FGQUM5QUFjQXZnQU1BTDhBQndEQUFBVUF3UUFIQU1JQUJ3REpBQWNBMEFBSEFOLy8vd0RxQUFJQTh2LzlBUDRBVEFEL0FDWUJBQUJFQVFNQVN3RUdBQ1lCQ0FCTUFTai8vd0V0Ly84Qk9nQVZBQkVBK0FBSEFQb0FEQUQ3QUF3QS9BQU1BUDBBREFEK0FBd0Evd0FKQVFBQUJRRUJBQXdCQWdBTUFRTUFCd0VFQUF3QkJRQU1BUVlBQlFFSEFBd0JDQUFZQVJRQUdRQUNBUUFBQndFREFCTUFBZ0VBQUFjQkF3QVRBQUlCQUFBSEFRTUFFd0FDQVFBQUJ3RURBQk1BQWdFQUFBY0JBd0FUQUFNQkFBQUhBUU1BRXdLc0FBVUFBZ0VBQUFjQkF3QVRBQUlCQUFBSEFRTUFFd0FQQVBvQURnRDdBQTRBL0FBT0FQMEFEZ0QrQUE0QS93QU9BUUFBQndFQkFBNEJBZ0FPQVFNQUV3RUVBQTRCQlFBT0FRWUFEZ0VIQUE0QkNBQU9BQUlCQUFBSEFRTUFFd0FDQVFBQUJ3RURBQk1BQWdFQUFBY0JBd0FUQUFJQkFBQUhBUU1BRXdBQ0FRQUFCd0VEQUJNQUFnRUFBQWNCQXdBVEFBSUJBQUFIQVFNQUV3QUNBUUFBQndFREFCTUFBZ0VBQUFjQkF3QVRBQVFBK0FBSEFQOEFDUUVEQUNvQkJnQUhBQkFBK0FBRkFQb0FBQUQ3QUFBQS9BQUFBUDBBQUFEK0FDY0Evd0FQQVFBQUl3RUJBQUFCQWdBQUFRTUFEd0VFQUFBQkJRQUFBUVlBR1FFSEFBQUJDQUFjQUFjQStBQUZBUDRBSndEL0FBOEJBQUFqQVFNQUR3RUdBQmtCQ0FBWEFCNEEwZ0FIQVBjQUJ3RDRBQVVBK1FBSEFQb0FGUUQ3QUJVQS9BQVZBUDBBRlFEK0FDY0Evd0FQQVFBQUl3RUJBQlVCQWdBVkFRTUFEd0VFQUJVQkJRQVZBUVlBR1FFSEFCVUJDQUFYQVEwQUJ3RU9BQWNCRHdBSEFSQUFCd0VSQUFjQkVnQUhBUk1BQndFVUFBY0JOZ0FIQVVJQUJ3S21BQTRBQndENEFBVUEvZ0FuQVA4QUR3RUFBQ01CQXdBUEFRWUFHUUVJQUJjQUVnRDRBQVVBK2dBT0FQc0FEZ0Q4QUE0QS9RQU9BUDRBSndEL0FBOEJBQUFxQVFFQURnRUNBQTRCQXdBaUFRUUFEZ0VGQUE0QkJnQVpBUWNBRGdFSUFCY0NwZ0FKQXE0QUJRQVFBUGdBQlFENkFBSUErd0FDQVB3QUFnRDlBQUlBL2dBbkFQOEFEd0VBQUNNQkFRQUNBUUlBQWdFREFBOEJCQUFDQVFVQUFnRUdBQmtCQndBQ0FRZ0FLZ0FnQU5JQUFnRDNBQUlBK0FBSkFQa0FBZ0Q2QUMwQSt3QXRBUHdBTFFEOUFDMEEvZ0FuQVA4QUR3RUFBRFFCQVFBdEFRSUFMUUVEQUM4QkJBQXRBUVVBTFFFR0FCa0JCd0F0QVFnQU5BRU5BQUlCRGdBQ0FROEFBZ0VRQUFJQkVRQUNBUklBQWdFVEFBSUJGQUFDQVRZQUFnRkNBQUlDcGdBRkFxd0FBZ0t1QUFjQUJ3RDRBQVVBL2dBbkFQOEFEd0VBQUNNQkF3QVBBUVlBR1FFSUFCY0FCd0Q0QUFVQS9nQW5BUDhBRHdFQUFDTUJBd0FQQVFZQUdRRUlBQmNBQndENEFBVUEvZ0FuQVA4QUR3RUFBQ01CQXdBUEFRWUFHUUVJQUJjQUVBRDRBQVVBK2dBSkFQc0FDUUQ4QUFrQS9RQUpBUDRBSndEL0FBOEJBQUFqQVFFQUNRRUNBQWtCQXdBV0FRUUFDUUVGQUFrQkJnQVpBUWNBQ1FFSUFCY0FBUUVJQUFjQUVBRDRBQVVBK2dBZ0FQc0FJQUQ4QUNBQS9RQWdBUDRBSndEL0FCa0JBQUFnQVFFQUlBRUNBQ0FCQXdBUEFRUUFJQUVGQUNBQkJnQVpBUWNBSUFFSUFDOEFDd0Q0QUFVQS9nQW5BUDhBRHdFQUFDTUJBd0FQQVFZQUdRRUlBQmNCQ1FBcUFRb0FLZ0VMQUNvQkRBQXFBQ0FBMGdBSEFQY0FCd0Q0QUFVQStRQUhBUG9BTXdEN0FETUEvQUF6QVAwQU13RCtBQ2NBL3dBZUFRQUFJd0VCQURNQkFnQXpBUU1BTVFFRUFETUJCUUF6QVFZQUpRRUhBRE1CQ0FBMEFRMEFCd0VPQUFjQkR3QUhBUkFBQndFUkFBY0JFZ0FIQVJNQUJ3RVVBQWNCTmdBSEFVSUFCd0ttQUF3Q3FnQUhBcTRBQ1FBQkFRZ0FCd0FCQVFnQUJ3QUJBUWdBQndBQkFRZ0FCd0FCQVJ6LzR3QUJBUnovNHdBSEFQZ0FCd0QvQUFrQkFBQUZBUU1BQndFR0FBVUJDQUFSQVJRQUdRQUhBUGdBQndEL0FBa0JBQUFGQVFNQUJ3RUdBQVVCQ0FBUkFSUUFHUUFVQUwwQUJ3QytBQXdBdndBSEFNQUFCUURCQUFjQXdnQUhBTWtBQndEUUFBY0EzLy8vQU9vQUFnRHkvLzBBL2dCTUFQOEFKZ0VBQUVRQkF3QkxBUVlBSmdFSUFFd0JLUC8vQVMzLy93RTZBQlVBQ3dENEFBY0Evd0FKQVFBQUJRRURBQWNCQmdBRkFRZ0FFUUVKQUJrQkNnQVpBUXNBR1FFTUFCa0JGQUFaQUI4QThBQVBBUGdBQndEL0FBa0JBQUFGQVFNQUJ3RUdBQVVCQ0FBUkFSUUFHUUZEQUJZQlJBQVdBVVVBRmdGR0FCWUJSd0FXQVdBQUZnRmhBQllCWWdBV0FXTUFGZ0ZrQUJZQlpRQVdBV1lBQ1FGbkFBd0JhQUFNQVdrQURBRnFBQXdCYXdBTUFXd0FEQUZ0QUF3QmJnQU1BVzhBREFGMEFBOEJkUUFQQUFFQkNBQUhBQU1CQUFBTUFRWUFCd0VJQUJFQUF3RUFBQXdCQmdBSEFRZ0FFUUFEQVFBQURBRUdBQWNCQ0FBUkFBTUJBQUFNQVFZQUJ3RUlBQkVBQXdFQUFBd0JCZ0FIQVFnQUVRQURBUUFBREFFR0FBY0JDQUFSQUFJQkFBQUhBUU1BRXdBREFQNEFCd0VBQUFjQkF3QVJBQU1BL2dBSEFRQUFCd0VEQUJFQUR3RDZBQWNBK3dBSEFQd0FCd0Q5QUFjQS9nQUhBUDhBQndFQUFBY0JBUUFIQVFJQUJ3RURBQkVCQkFBSEFRVUFCd0VHQUFjQkJ3QUhBUWdBQndBREFQNEFCd0VBQUFjQkF3QVJBQVlBL2dBTUFQOEFBZ0VBQUF3QkF3QVRBUVlBQlFFSUFBd0FCZ0QrQUF3QS93QUNBUUFBREFFREFCTUJCZ0FGQVFnQURBQUdBUDRBREFEL0FBSUJBQUFNQVFNQUV3RUdBQVVCQ0FBTUFBb0EvZ0FNQVA4QUFnRUFBQXdCQXdBVEFRWUFCUUVJQUF3QkNRQWdBUW9BSUFFTEFDQUJEQUFnQUFZQS9nQU1BUDhBQWdFQUFBd0JBd0FUQVFZQUJRRUlBQXdBQlFENEFBY0Evd0FZQVFBQUtnRUdBQk1CQ0FBMEFBVUErQUFIQVA4QUdBRUFBQ29CQmdBVEFRZ0FOQUFGQVBnQUJ3RC9BQmdCQUFBcUFRWUFFd0VJQURRQUJRRDRBQWNBL3dBWUFRQUFLZ0VHQUJNQkNBQTBBQVVBK0FBSEFQOEFHQUVBQUNvQkJnQVRBUWdBTkFBRkFQZ0FCd0QvQUJnQkFBQXFBUVlBRXdFSUFEUUFCQUVKQUIwQkNnQWRBUXNBSFFFTUFCMEFBd0R4Lyt3Q21QL0VBcG4velFBREFQSC83QUtZLzhRQ21mL05BQU1BOGYvc0Fwai94QUtaLzgwQUF3RHgvK3dDbVAvRUFwbi96UUFEQVBILzdBS1kvOFFDbWYvTkFBTUE4Zi9zQXBqL3hBS1ovODBBQXdEeC8rNENtUC9FQXBuL3pRQURBUEgvN0FLWS84UUNtZi9OQUFNQThmL3NBcGoveEFLWi84MEFBd0R4Lyt3Q21QL0VBcG4velFBSEFQSC83QUVKQUJnQkNnQVlBUXNBR0FFTUFCZ0NtUC9FQXBuL3pRQURBUEgvN0FLWS84UUNtZi9OQUFNQThmL3NBcGoveEFLWi84MEFBd0R4Lyt3Q21QL0VBcG4velFBREFQSC83QUtZLzhRQ21mL05BQWNBK0FBRkFQNEFKd0QvQUE4QkFBQWpBUU1BRHdFR0FCa0JDQUFYQUFjQStBQUhBUDhBQ1FFQUFBVUJBd0FIQVFZQUJRRUlBQkVCRkFBWkFBUUJ1d0FNQWIwQUJ3SEFBQkVCeFFBRkFBRUJ3QUFBQUFFQndBQUZBQUVCd0FBQUFBRUJ3QUFBQUFFQndBQUFBQUVCd0FBQUFBUUJ1d0FNQWIwQUJ3SEFBQkVCeFFBRkFBUUJ1d0FNQWIwQUJ3SEFBQkVCeFFBRkFBUUJ1d0FNQWIwQUJ3SEFBQkVCeFFBRkFBUUJ1d0FNQWIwQUJ3SEFBQkVCeFFBRkFBUUJ1d0FNQWIwQUJ3SEFBQkVCeFFBRkFFQUJkZ0FBQVk4QUFBR1dBQUFCbHdBQUFaZ0FBQUdaQUFBQm1nQUFBWnNBQUFHY0FBQUJuUUFBQVo0QUFBR2ZBQUFCb0FBQUFhRUFBQUdpQUFBQm93QUFBYVFBQUFHbEFBQUJwZ0FBQWFjQUFBR29BQUFCcVFBQUFhb0FBQUdyQUFBQnJRQUFBYlFBQUFHMUFBQUJ0Z0FBQWJjQUFBRzRBQUFCdVFBQUFib0FBQUc3QUF3QnZBQUFBYjBBQndHK0FBQUJ2d0FBQWNBQUVRSEJBQUlCd2dBQUFjTUFBQUhFQUFBQnhRQUZBY29BQUFITEFBQUJ6QUFBQWMwQUFBSE9BQUFCendBQUFkQUFBQUhSQUFBQjBnQUFBZE1BQUFIVUFBQUIxUUFBQWRZQUFBSFhBQUFCMkFBQUFmSUFBQUh6QUFBQjlRQUFBZllBQUFIM0FBQUIrQUFBQUFRQnV3QU1BYjBBQndIQUFCRUJ4UUFGQUVBQmRnQUZBWThBQlFHV0FBVUJsd0FGQVpnQUJRR1pBQVVCbWdBRkFac0FCUUdjQUFVQm5RQUZBWjRBQlFHZkFBVUJvQUFGQWFFQUJRR2lBQVVCb3dBRkFhUUFCUUdsQUFVQnBnQUZBYWNBQlFHb0FBVUJxUUFGQWFvQUJRR3JBQVVCclFBRkFiUUFCUUcxQUFVQnRnQUZBYmNBQlFHNEFBVUJ1UUFGQWJvQUJRRzdBQXdCdkFBRkFiMEFCd0crQUFVQnZ3QUZBY0FBRVFIQkFBVUJ3Z0FGQWNNQUJRSEVBQVVCeFFBRkFjb0FCUUhMQUFVQnpBQUZBYzBBQlFIT0FBVUJ6d0FGQWRBQUJRSFJBQVVCMGdBRkFkTUFCUUhVQUFVQjFRQUZBZFlBQlFIWEFBVUIyQUFGQWZJQUJRSHpBQVVCOVFBRkFmWUFCUUgzQUFVQitBQUZBRUFCZGdBSkFZOEFDUUdXQUFrQmx3QUpBWmdBQ1FHWkFBa0JtZ0FKQVpzQUNRR2NBQWtCblFBSkFaNEFDUUdmQUFrQm9BQUpBYUVBQ1FHaUFBa0Jvd0FKQWFRQUNRR2xBQWtCcGdBSkFhY0FDUUdvQUFrQnFRQUpBYW9BQ1FHckFBa0JyUUFKQWJRQUNRRzFBQWtCdGdBSkFiY0FDUUc0QUFrQnVRQUpBYm9BQ1FHN0FBd0J2QUFKQWIwQUJ3RytBQWtCdndBSkFjQUFEQUhCQUFrQndnQUpBY01BQ1FIRUFBa0J4UUFIQWNvQUNRSExBQWtCekFBSkFjMEFDUUhPQUFrQnp3QUpBZEFBQ1FIUkFBa0IwZ0FKQWRNQUNRSFVBQWtCMVFBSkFkWUFDUUhYQUFrQjJBQUpBZklBQ1FIekFBa0I5UUFKQWZZQUNRSDNBQWtCK0FBSkFBUUJ1d0FNQWIwQUJ3SEFBQkVCeFFBRkFBUUJ1d0FNQWIwQUJ3SEFBQkVCeFFBRkFBUUJ1d0FNQWIwQUJ3SEFBQkVCeFFBRkFBUUJ1d0FNQWIwQUJ3SEFBQkVCeFFBRkFBUUJ1d0FNQWIwQUJ3SEFBQkVCeFFBRkFBUUJ1d0FNQWIwQUJ3SEFBQkVCeFFBRkFBUUJ1d0FNQWIwQUJ3SEFBQkVCeFFBRkFBUUJ1d0FNQWIwQUJ3SEFBQkVCeFFBRkFBUUJ1d0FNQWIwQUJ3SEFBQkVCeFFBRkFBWUJ1d0FUQWJ3QUJ3RzlBQTRCd0FBQUFjTUFCd0hGQUFrQUJnRzdBQk1CdkFBSEFiMEFEZ0hBQUFBQnd3QUhBY1VBQ1FBR0Fic0FFd0c4QUFjQnZRQU9BY0FBQUFIREFBY0J4UUFKQUFZQnV3QVRBYndBQndHOUFBNEJ3QUFBQWNNQUJ3SEZBQWtBQmdHN0FCTUJ2QUFIQWIwQURnSEFBQUFCd3dBSEFjVUFDUUJBQVhZQUFBR1BBQUFCbGdBQUFaY0FBQUdZQUFBQm1RQUFBWm9BQUFHYkFBQUJuQUFBQVowQUFBR2VBQUFCbndBQUFhQUFBQUdoQUFBQm9nQUFBYU1BQUFHa0FBQUJwUUFBQWFZQUFBR25BQUFCcUFBQUFha0FBQUdxQUFBQnF3QUFBYTBBQUFHMEFBQUJ0UUFBQWJZQUFBRzNBQUFCdUFBQUFia0FBQUc2QUFBQnV3QVRBYndBQndHOUFBNEJ2Z0FBQWI4QUFBSEFBQ1VCd1FBQUFjSUFBQUhEQUFjQnhBQUFBY1VBQ1FIS0FBQUJ5d0FBQWN3QUFBSE5BQUFCemdBQUFjOEFBQUhRQUFBQjBRQUFBZElBQUFIVEFBQUIxQUFBQWRVQUFBSFdBQUFCMXdBQUFkZ0FBQUh5QUFBQjh3QUFBZlVBQUFIMkFBQUI5d0FBQWZnQUFBQUdBYnNBRXdHOEFBY0J2UUFPQWNBQUFBSERBQWNCeFFBSkFFQUJkZ0FNQVk4QURBR1dBQXdCbHdBTUFaZ0FEQUdaQUF3Qm1nQU1BWnNBREFHY0FBd0JuUUFNQVo0QURBR2ZBQXdCb0FBTUFhRUFEQUdpQUF3Qm93QU1BYVFBREFHbEFBd0JwZ0FNQWFjQURBR29BQXdCcVFBTUFhb0FEQUdyQUF3QnJRQU1BYlFBREFHMUFBd0J0Z0FNQWJjQURBRzRBQXdCdVFBTUFib0FEQUc3QUJzQnZBQUhBYjBBQ1FHK0FBd0J2d0FNQWNBQUlBSEJBQXdCd2dBTUFjTUFCd0hFQUF3QnhRQUhBY29BREFITEFBd0J6QUFNQWMwQURBSE9BQXdCendBTUFkQUFEQUhSQUF3QjBnQU1BZE1BREFIVUFBd0IxUUFNQWRZQURBSFhBQXdCMkFBTUFmSUFEQUh6QUF3QjlRQU1BZllBREFIM0FBd0IrQUFNQUFjQnV3QVRBYndBR3dHOUFBNEJ3QUFBQWNNQUJ3SEZBQjBDcmdBRkFFSUJkZ0FIQVk4QUJ3R1dBQWNCbHdBSEFaZ0FCd0daQUFjQm1nQUhBWnNBQndHY0FBY0JuUUFIQVo0QUJ3R2ZBQWNCb0FBSEFhRUFCd0dpQUFjQm93QUhBYVFBQndHbEFBY0JwZ0FIQWFjQUJ3R29BQWNCcVFBSEFhb0FCd0dyQUFjQnJRQUhBYlFBQndHMUFBY0J0Z0FIQWJjQUJ3RzRBQWNCdVFBSEFib0FCd0c3QUJNQnZBQUhBYjBBSndHK0FBY0J2d0FIQWNBQUd3SEJBQWNCd2dBSEFjTUFGZ0hFQUFjQnhRQXZBY29BQndITEFBY0J6QUFIQWMwQUJ3SE9BQWNCendBSEFkQUFCd0hSQUFjQjBnQUhBZE1BQndIVUFBY0IxUUFIQWRZQUJ3SFhBQWNCMkFBSEFmSUFCd0h6QUFjQjlRQUhBZllBQndIM0FBY0IrQUFIQXF3QUJRS3VBQWtBQmdHN0FCTUJ2QUFIQWIwQURnSEFBQUFCd3dBSEFjVUFDUUFHQWJzQUV3RzhBQWNCdlFBT0FjQUFBQUhEQUFjQnhRQUpBQVlCdXdBVEFid0FCd0c5QUE0QndBQUFBY01BQndIRkFBa0FRQUYyQUFVQmp3QUZBWllBQlFHWEFBVUJtQUFGQVprQUJRR2FBQVVCbXdBRkFad0FCUUdkQUFVQm5nQUZBWjhBQlFHZ0FBVUJvUUFGQWFJQUJRR2pBQVVCcEFBRkFhVUFCUUdtQUFVQnB3QUZBYWdBQlFHcEFBVUJxZ0FGQWFzQUJRR3RBQVVCdEFBRkFiVUFCUUcyQUFVQnR3QUZBYmdBQlFHNUFBVUJ1Z0FGQWJzQUV3RzhBQWNCdlFBT0FiNEFCUUcvQUFVQndBQUFBY0VBQlFIQ0FBVUJ3d0FIQWNRQUJRSEZBQWNCeWdBRkFjc0FCUUhNQUFVQnpRQUZBYzRBQlFIUEFBVUIwQUFGQWRFQUJRSFNBQVVCMHdBRkFkUUFCUUhWQUFVQjFnQUZBZGNBQlFIWUFBVUI4Z0FGQWZNQUJRSDFBQVVCOWdBRkFmY0FCUUg0QUFVQUJnRzdBQk1CdkFBSEFiMEFEZ0hBQUFBQnd3QUhBY1VBQ1FCQUFYWUFCd0dQQUFjQmxnQUhBWmNBQndHWUFBY0JtUUFIQVpvQUJ3R2JBQWNCbkFBSEFaMEFCd0dlQUFjQm53QUhBYUFBQndHaEFBY0JvZ0FIQWFNQUJ3R2tBQWNCcFFBSEFhWUFCd0duQUFjQnFBQUhBYWtBQndHcUFBY0Jxd0FIQWEwQUJ3RzBBQWNCdFFBSEFiWUFCd0czQUFjQnVBQUhBYmtBQndHNkFBY0J1d0FUQWJ3QUJ3RzlBQmtCdmdBSEFiOEFCd0hBQUFBQndRQUhBY0lBQndIREFBY0J4QUFIQWNVQUpRSEtBQWNCeXdBSEFjd0FCd0hOQUFjQnpnQUhBYzhBQndIUUFBY0IwUUFIQWRJQUJ3SFRBQWNCMUFBSEFkVUFCd0hXQUFjQjF3QUhBZGdBQndIeUFBY0I4d0FIQWZVQUJ3SDJBQWNCOXdBSEFmZ0FCd0FHQWJzQUV3RzhBQWNCdlFBT0FjQUFBQUhEQUFjQnhRQUpBQWdCdXdBcUFid0FCd0c5QUNVQndBQXNBY01BS0FIRkFERUNwZ0FiQXE0QURnQUdBYnNBRXdHOEFBY0J2UUFPQWNBQUFBSERBQWNCeFFBSkFBWUJ1d0FUQWJ3QUJ3RzlBQTRCd0FBQUFjTUFCd0hGQUFrQUJnRzdBQk1CdkFBSEFiMEFEZ0hBQUFBQnd3QUhBY1VBQ1FBR0Fic0FFd0c4QUFjQnZRQU9BY0FBQUFIREFBY0J4UUFKQUFZQnV3QVRBYndBQndHOUFBNEJ3QUFBQWNNQUJ3SEZBQWtBQmdHN0FCTUJ2QUFIQWIwQURnSEFBQUFCd3dBSEFjVUFDUUFHQWJzQUV3RzhBQWNCdlFBT0FjQUFBQUhEQUFjQnhRQUpBQUlCdlFBRkFjVUFDUUFDQWIwQUJRSEZBQWtBQWdHOUFBVUJ4UUFKQUFJQnZRQUZBY1VBQ1FBQ0FiMEFCUUhGQUFrQUFnRzlBQVVCeFFBSkFBUUJ1d0FNQWIwQUJ3SEFBQkVCeFFBRkFBVUJ2QUFuQWIwQUdBSEFBQWtCd3dBVEFjVUFNd0FGQWJ3QUp3RzlBQmdCd0FBSkFjTUFFd0hGQURNQUJRRzhBQ2NCdlFBWUFjQUFDUUhEQUJNQnhRQXpBQVVCdkFBbkFiMEFHQUhBQUFrQnd3QVRBY1VBTXdBRkFid0FKd0c5QUJnQndBQUpBY01BRXdIRkFETUFCUUc4QUNjQnZRQVlBY0FBQ1FIREFCTUJ4UUF6QUFFQ21mK1JBQUVDbWYrUkFBRUNtZitSQUFFQ21mK1JBQUVDbWYrUkFBRUNtZitSQUFJL0ZnQUVBQUJDZUVOT0FCY0FPUUFBLytiL3MvL24vOFgvei8vRi8vRC8yUC83QUFqLzhmK2gvKzMvMGYvdi84Ly8yLy9KLzluLy9nQUcvLzcvOS8vKy8vNy8vdi83Ly83Lzh2LzdBQUwvL2dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvN0FBQS8vSC8rLy92QUFBQUFBQUFBQUFBQUFBQS8vNEFBQUFBLy93QUFQLzdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvKy8vNy8vdi9hLy92Ly9nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQS8vTC8vd0FBQUFJQUFnQUNBQUFBQUFBQUFBci8rd0FBLy83Lzl2LysvL0VBQVAveEFBQUFBQUFBLy84QUFBQUFBQWNBQVAvNEFBQUFBUC8rQUFBQUFQLzRBQUQvK3dBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdBQ0FBQUFBQUFBQUFjQUFqLyt3QUEvLzRBQUFBQS8vc0FBUC8wQUFBQUJRQVAvLzcvL2dBQS8vdi8rd0FBLy80QUFQLzdBQUQvK3dBQS8vai8vQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRHdBQUFCSUFEd0FLQUFBQUFQLzcvOTMvNkFBQS8vc0FBQUFBQUFBQUJmLytBQVgvd2dBSS8ra0FDQUFBLy92LytnQUEvL1FBQVAveEFBRC8rZitSLzg3LzBRQUEvKzcvOXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC8rQUFBLy83Ly92L2NBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvLzRBQVAvK0FBQUFBQUFBQUFBQUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvLzcvL2dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFCZi8vQUFVQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvL0VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvK3dBQS8vNEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC9wLytyLzdBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQS8rSUFBUC83QUFBQUFBQUEvLzhBQUFBQ0FCYi81Ly9rLy9mLzRQLzMvOWIvNS8vYi8rSUFEd0FILy9iLyt3QUFBQWYvOGYveEFBQUFBUC8rQUFVQUFBQUFBQUlBQlFBQUFBVUFBUC8yLzdYLytBQUZBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBLzlML2pmL3AvN3IvelArY0FBQUFBQUFBQUNNQUFQL0UvL24vdC8veC84VC96UC9kLzhRQUZBQU1BQUwvL2dBQUFBQUFBUC9wQUFEL3VBQUFBQUlBQUFBQUFBQUFCUUFBQUFBQUFBQUFBQUFBQUFBQS84Y0FCUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvLy8vMmdBQS8rRC8rLy9RLy9nQUFBQU0vK3IvL3YvaEFBSUFBQUFBQUFBQUFBQUFBQUQvM3YvYS8vNEFBZ0FBLy80QUFBQUFBQUFBQUFBQUFBQUFBUC9CLytELzhRQUFBQUQvK0FBQUFBQUFBUC83QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEd0FBQUE4QUQvLzlBQUFBQUFBSS84bi8vZ0FBQUJRQUZnQUFBQndBS0FBVUFDUC95Zi83QUFBQUZBQUFBQWdBQUFBQUFBQUFBQUFBQUJJQUQvK1AvODcvNEFBQUFBQUFBQUFBQUFBQUR3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvNUFBQUFBQUFBQUFyLy9nQUFBQW9BQUFBQUFBZ0FDQUFBQUFJQUNBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXdBQ0FBQUFBQUFCUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQS8vb0FBUC8rQUFBQUFBQUFBQUQvL1FBQS8vMEFBQUFBLy9zQUFQL3NBQUQvL2dBQUFBQUFBQUFBQUFVQUFBQUFBQUFBQUFBQUFBRC8rd0FBLy80QUFBQUFBQUFBQUFBQUFBQUFBUC8rQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQS85MEFGd0FBQUFvQUNnQVYvL2NBQUFBQS82UC9sd0FBLy9qLytQL0QvN3ovNXYvQi85ei96d0FBLzZnQUFBQUFBQnovdXYrMy83d0FBUCtvLzlML3QvOXkvNjcvcEFBQS84a0FBQUFBLzYvL3VmL3BBQUQvMFArYkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBLy9qLzlnQUFBQUFBQUFBQUFBQUFBUC8yQUFELzlQLzJBQUFBQUFBQUFBQUFBQUFBQUFBQUFQLzJBQUQvL2dBQS8rWC82Z0FBQUFBQUFBQUFBQUQvK0FBQUFBRC84UUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTHdBTUFDSUFJQUFxQUFBQU1RQWIvL2ovK0FBQUFBSUFBQUFBQUFBQUFBQUFBQUQvK3dBVy8rNEFEd0FXQUNBQUFnQUEvL2dBQUFBQUFBQUFBQUFBLy9ULzlBQUNBRFlBQUFBWkFBQUFBQUFBQUFBQUFnQUFBQ0lBSFFBSkFCRUFEQUFKQUFjQUJ3QUhBQXdBRGdBQS85NEFFZ0FBQUJRQURBQU8vOVlBQVAvKy84ei95QUFBLy80QUFQL3UvKzRBQVAvdEFBRC94UUFGLzh3QUFBQUNBQUQvNnYvYS8rSUFBUC9XLys3LzcvK3IvNmYvdndBQS8vSC85QUFBLzhuLzUvLzJBQUQvNmdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBLy9RQUZBQUFBQlFBREFBTS85b0FBQUFBLytQLzFnQUFBQU1BQUFBQS8vWUFBZ0FBLy92L3lRQUYvOTBBQUFBQUFBei83di94Lys0QUFQL3FBQUQvK3dBQS83WC8wUUFBLy9RQUFBQUFBQUQvK2YvMkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvOWdBQVAvMkFBSUFBZ0FGLytjQUFBQUNBQm4vNmdBQS8vbi81UC8wLytELzNmL1cvK0lBQWdBUkFBSUFBQUFBQUF6LzhmLzJBQUFBQUFBQUFBY0FBQUFBQUFZQUJ3QUEvLzRBQUFBQkFBQUFBQUFIQUFBQUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQS85UUFGUUFBQUFZQUJRQUgvK3dBQUFBQS84TC9zUUFBLy92LzcvL3MvK2NBQVAvcUFBRC9wQUFGLzdyLysvLzNBQVgvelAvVC85TUFBUC9DLytULzIvK1QvNlQvdlAvei85Z0FBQUFBQUFELzF2LzBBQUQvN1AreUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBLy9nQUFQLzRBQUFBQUFBQS8rRUFBQUFBQUFyLzhRQUFBQUQvK0FBQS85Ly8rUC9mLy9NQUFBQUFBQUFBQUFBQUFBSUFBUC80QUFBQUFQL3hBQUlBQUFBQS8vZ0FBZ0FBQUFVQUFBQUFBQUFBQUFBQUFBQUFCUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ05ONEFCQUFBT3o0OFJBQVdBQ01BQVArTUFCei85di9wLy9FQUNQL3ZBQWovL3YvKy8vVC8rd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvaFFBQS8rd0FBUC8rQUFELzl2LytBQUFBQUFBQUFBTC84Zi80QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvMDBBQUFBQS84di8rZi8yLy9ZQUFQL3hBQUQvOXdBQUFBQUFBUC9TQUFVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdBQUQvK0FBSUFCSUFCUUFJQUFVQUNnQU9BQVVBQ3YvdUFBQUFBQUFDQUFnQUNQL1kvL2YvNlFBSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVovL2dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvOS8vKy8rY0FBUC8rQUFBQUFQLytBQUlBQUFBQUFBQUFBQUFBQUFELy9nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFjQUFBQUFBQUFBQUFBQUFBa0FEQUFBQUFBQUFBQUFBQUlBQWdBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFaLy9nQUFBQUFBQUFBQUFBQUFBQUFCUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQS84Z0FBUC9uQUFBQUFBQU0vLzRBQ0FBQUFBQUFBQUFBLy9iLy9RQUFBQUFBQUFBQUFBRC8vZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC8vZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBVEFBUUFEZ0FGQUFVQUFBQVJBQXdBSHdBWUFBd0FEZ0FBQUFBQUdBQTdBRDBBQUFBUkFBQUFRQUFZQUJvQU5nQWlBQkVBRVFBVEFBVUFGUUFPQUFBQUFBQUEvMzhBQUFBQS8rSC8rd0FBLy9vQUFBQUFBQUQvK2YvK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELy9nQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFQK2MvLzRBQVAvaC8rMy84Zi9xLy92LytBQUFBQUFBQVAvd0FBQUFBQUFBQUFBQUFQL2tBQUFBQUFBQUFBQUFBQUFBLzhNQUFBQUFBQUFBQUFBQS84di8rUC83QUFBQUFBQTVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBLzZQLy92L25BQUFBREFBT0FCSUFBQUFLLy80QUFBQU0vKzMvOUFBQS8vZ0FBQUFBLzZiLzl2LzNBQUFBQUFBQUFBQUFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUCtOQUFELzlnQUEvLzRBQVAvNy8vNEFBQUFBQUFBQUFBQUEvL2dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC8wZ0FBLys0QUFBQUFBQUwvL3dBQUFBSUFBQUFBQUFELy9nQUFBQUFBQWdBRkFBY0FBQUFBQUFBQUJ3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDdi83QUFBQUdRQWJBQllBQ0FBUEFBd0FCUUFXLy80QUFBQUFBQVVBQUFBQUFBRC8vZ0FBQUFBQUFBQUFBQVVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVArdi8vNy83QUFBQUEwQUJ3QUNBQUFBQkFBQUFBQUFEUC95Lyt3QUFBQUFBQUFBQVAvQy8vei8rd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvNFFBQy8rd0FBQUFGQUFjQUF3QUFBQVVBQUFBQUFBWC8rUC91QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvOFlBQVAveEFBQUFBQUFDQUFBQUNnQUNBQUFBQUFBRi8vb0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUFCUUFBQUFBQUFBQUpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJdTJnQUVBQUEzV2pnWUFCWUFKQUFBLzlULzZ2L3cvN2YvNHYvRy8vSC92di85Ly9yLzZ2L20vL0FBQlFBRi8vNy85Ly92Ly9ELyt3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvK3ovL3YvMC8vdi83di80QUFBQUFBQUFBQUQvOXYvNEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELzVQLzQvL2ovOVFBQS8vZ0FBdi80QUFBQUFBQUFBQUQvK0FBQUFBQUFBQUFBQUFBQUFQL2FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELytBQUFBQVVBQUFBRkFBQUFCUUFDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELytQLzRBQUlBQUFBRkFBQUFCUUFBQUFBQUFBQUFBQUQvd2YvR0FBQUFBQUFBQUFBQUFQK1pBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC8rQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFQLzRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWtBR1FBRkFBY0FCd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvOVAvK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELzd2LzRBQUQvL2dBQUFBTC8vUUFDQUFBQUFBQUFBQUFBQlFBUEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELzVBQUEvNmovOXYvV0FBRC90d0FJQUFBQUFBQUFBQUFBQWdBU0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF2LzQvK0VBQVAvdS8vVC81UC8zQUFBQUFBQUFBQUQvNVAvMEFBQUFBQUFBQUFBQUFQL2FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvL2dBQS8vVC8vZ0FBQUFBQUFBQUFBQUQvNFAvQkFBQUFBQUFBQUFBQUFQK2pBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvKy8vK0FBRC83Z0FBQUFBQUFBQUFBQUFBQWdBTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvL1FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELzMvLzRBQVVBQUFBSEFBQUFDUUFDQUFBQUFBQUFBQUQvc2YvQkFBQUFBQUFBQUFBQUFQK2dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvL2dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvNnYvK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFnQUFBQllBQWdBYkFBd0FIUUFNQUFBQUFBQUFBQUQvL2dBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGdBSkFCTUFEQUFGQUFjQUJ3QUZBQXdBREFBRkFBa0FEQUFBQUFELzl3QUdBQWNBQUFBb0FBQUFFUUFGQUFBQUFBQUFBQUQvMC8vV0FBQUFBQUFBQUFBQUFQKzNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELzdBQUFBQUFBQUFBQUFBRC8rQUFDQUFBQUFBQUFBQUFBQWdBQ0FBQUFBQUFBQUFBQUFQL3hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELzNmLzJBQWdBQUFBSkFBQUFEQUFDQUFBQUFBQUFBQUQveHYvUUFBQUFBQUFBQUFBQUFQK01BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBQ0FBSUFCUUFNQUFBQUFBQUFBQUFBQUFBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFnQUFBQUFBQUFBQUFBQUFBQUFDSjBBQUJBQUFLYlF6WEFBQkFBOEFBUC9pLy9qLzRQL2kvK1QvN1AvaC8vai85di91Ly9qLytQLzMvLzRBQWloOEFBUUFBRE9xTkFJQURBQWFBQUQvNFFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvOW9BSHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvMC85Ty82OEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELzRRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvM0wvcmYvTC81Y0FJUC9zLytuL3RQK2cvOHovdC8vNC80d0FEQUFILy9rQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJNQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQS84c0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUCtoQUFBQUQvL2hBQUFBQVArNUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC9wUC9oLytuL3l3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBLyt3QUFBQUFBQUFBQUFBQS85QUFBQUFKLy9FQURBQUEvODRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvVEFBRC8rd0FBLytILy9nQUFBQUFBQUFBQUFBRC8rUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvNWdBQUFBQUFBQUFBQUFELzl3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvK1FBQUFBQUFBQUFBQUFBQUFJbUpnQUVBQUF5ZkRLRUFBSUFBZ0FBQUFJQUFBQUZBQUVtRmlZbUFBUUFEQUVpQUVVQUFoS1FBQUlTbGdBQ0Vwd0FBaEtpQUFJU3FBQURFd2dBQWhLdUFBSVN0QUFDRXJRQUFoS3VBQUlTdWdBQ0VxNEFBaExBQUFJU3VnQURFdzRBQUJKZ0FBQVNaZ0FBRW13QUFSS0tBQUlTeGdBQ0Vzd0FBaExTQUFJUzJBQUNFdDRBQWhMR0FBSVM1QUFDRXVvQUFoTEdBQUlTOEFBQ0VzWUFBaEwyQUFJUzhBQURFeFFBQUJKZ0FBQVNjZ0FBRW5nQUFSS0tBQUlTdEFBQ0VwQUFBaEtXQUFJU25BQUNFcUlBQWhLb0FBSVNyZ0FDRXJRQUFoSzBBQUlTcmdBQ0Vyb0FBaEt1QUFJUy9BQUNFcm9BQXhNT0FBQVNZQUFBRW40QUFCS0VBQUVTaWdBQ0VwQUFBaEtRQUFJU2tBQUNFcEFBQWhNQ0FBSVN0QUFDRXJRQUFoSzBBQUlTdEFBQ0VxNEFBaEt1QUFJU3JnQUNFcTRDS1JJRUVnb1NFQUFBRWdRU0NoSVdBQUFTQkJJS0Vod0FBQklFRWdvU0lnQUFFaWdTQ2hJY0FBQVNCQklLRWk0QUFCSUVFZ29TTkFBQUVnUVNDaEk2QUFBU0JCSUtFa0FBQUJJRUVnb1NSZ0FBRWdRU0NoSk1BQUFTS0JJS0VrWUFBQklFRWdvU1VnQUFFZ1FTQ2hKWUFBQVNCQklLRWw0QUFCSUVFZ29TWkFBQUVpZ1NDaElRQUFBU0JCSUtFbW9BQUJJRUVnb1NjQUFBRWdRU0NoSjJBQUFTQkJJS0VoQUFBQklFRWdvU2ZBQUFFZ1FTQ2hLQ0FBQVNpQUFBRW80QUFCS1VBQUFTbWdBQUVxQUFBQkttQUFBU29BQUFFcXdBQUJLZ0FBQVNzZ0FBRXJnQUFCS21BQUFTb0FBQUVyNEFBQktnQUFBU3BnQUFFc1FBQUJMS0FBQVN4QUFBRXNvQUFCTEVBQUFTMEFBQUVzUUFBQkxLQUFBUzFoTGNFdUlBQUJMV0V0d1M2QUFBRXRZUzNCTHVBQUFTMWhMY0V2UUFBQkxXRXR3UytnQUFFdFlTM0JNQUFBQVRCaExjRXZvQUFCTFdFdHdUREFBQUV0WVMzQk1TQUFBUzFoTGNFeGdBQUJMV0V0d1RIZ0FBRXRZUzNCTGlBQUFUQmhMY0V1SUFBQkxXRXR3VEpBQUFFdFlTM0JNcUFBQVMxaExjRXpBQUFCTFdFdHdTNGdBQUV0WVMzQk0yQUFBVFBBQUFFMElBQUJOSUFBQVRUZ0FBRTBnQUFCTlVBQUFUU0FBQUUxb0FBQk5JQUFBVFlBQUFFMllBQUJOT0FBQVRTQUFBRTA0QUFCTnNBQUFUY2dBQUUyd0FBQk55QUFBVGJBQUFFM2dBQUJOK0U0UVRpZ0FBRTVBVGhCT1dBQUFUZmhPRUU1d0FBQk4rRTRRVG9nQUFFMzRUaEJPb0FBQVRmaE9FRTY0QUFCTitFNFFUdEFBQUUzNFRoQk9LQUFBVHVoT0VFNG9BQUJOK0U0UVR3QUFBRTM0VGhCUEdBQUFUZmhPRUU4d0FBQk4rRTRRVGlnQUFFMzRUaEJQU0FBQVQyQUFBRTk0QUFCUFlBQUFUNUFBQUU5Z0FBQlBxQUFBVDhBQUFFL1lBQUJQOEFBQVQ5Z0FBRXp3QUFCUUNGQWdUUEFBQUU2Z1VDQk04QUFBVUFoUUlGQTRBQUJRQ0ZBZ1RQQUFBRkFJVUNCUVVBQUFVR2hRZ0ZDWUFBQlFzQUFBVGJBQUFGRElBQUJOc0FBQVVPQUFBRTJ3QUFCUStBQUFVUkFBQUZESUFBQk5zQUFBVU1nQUFFMndBQUJSS0FBQVVVQlJXRkZ3VVloUlFGRllVYUJSaUZGQVVWaFJ1RkdJVVVCUldGSFFVWWhSUUZGWVVlaFJpRkZBVVZoU0FGR0lVaGhSV0ZIb1VZaFJRRkZZVWpCUmlGRkFVVmhTU0ZHSVVVQlJXRkpnVVloUlFGRllVbmhSaUZJWVVWaFJjRkdJVVVCUldGS1FVWWhSUUZGWVVxaFJpRkZBVVZoUmNGR0lVVUJSV0ZHZ1VZaFNHRkZZVVhCUmlGRkFVVmhTa0ZHSVVVQlJXRktvVVloUlFGRllVc0JSaUZGQVVWaFMyRkdJVVVCUldGTHdVWWhSUUZGWVVYQlJpRkZBVVZoU3dGR0lVd2dBQUZNZ0FBQlRPQUFBVTFBQUFGTm9BQUJUZ0FBQVVVQlJXRkZ3VVloVG1BQUFVN0FBQUZPWUFBQlR5QUFBVTVnQUFGUGdBQUJUK0FBQVU3QUFBRlFRQUFCVUtBQUFWQkFBQUZSQUFBQlVFQUFBVkZnQUFGUndBQUJVS0FBQVZCQUFBRlNJQUFCVW9BQUFWQ2dBQUZTNEFBQlUwQUFBVk9nQUFGVUFBQUJWR0FBQVZUQUFBRlVZQUFCVk1BQUFWUmdBQUZWSUFBQlZZQUFBVlRBQUFGVjRBQUJWTUFBQVZaQlZxRlhBVmRoVmtGV29WZkJWMkZXUVZhaFdDRlhZVlpCVnFGWWdWZGhWa0ZXb1ZqaFYyRldRVmFoV1VGWFlWWkJWcUZab1ZkaFZrRldvVmxCVjJGV1FWYWhXZ0ZYWVZaQlZxRmFZVmRoV3NGV29WY0JWMkZXUVZhaFd5RlhZVlpCVnFGYmdWZGhWa0ZXb1ZjQlYyRldRVmFoVjhGWFlWckJWcUZYQVZkaFZrRldvVnNoVjJGV1FWYWhXNEZYWVZaQlZxRmI0VmRoVmtGV29WeEJWMkZXUVZhaFhLRlhZVlpCVnFGWEFWZGhWa0ZXb1YwQlYyRldRVmFoVytGWFlWMWdBQUZkd0FBQlhpQUFBVjZBQUFGZUlBQUJYdUFBQVY0Z0FBRmZRQUFCWGlBQUFWK2dBQUZlSUFBQllBQUFBU2xBQUFFcG9BQUJZR0FBQVdEQUFBRmdZQUFCTDBBQUFXQmdBQUZoSUFBQllHQUFBV0dBQUFGaDRBQUJZTUFBQVdCZ0FBRmlRQUFCWUdBQUFXS2dBQUZnWUFBQll3QUFBV0JnQUFGallBQUJZOEFBQVdRZ0FBRmp3QUFCWklBQUFXUEFBQUZrNEFBQlk4QUFBV1FnQUFGbFFXV2haZ0FBQVdWQlphRm1ZQUFCWlVGbG9XWUFBQUZsUVdXaFpzQUFBV2NoWmFGbmdBQUJaVUZsb1dmZ0FBRmxRV1doYUVBQUFXVkJaYUZvb0FBQlpVRmxvV2tBQUFGbFFXV2hhV0FBQVdWQlphRnB3QUFCWnlGbG9Xb2dBQUZsUVdXaGFvQUFBV1ZCWmFGcTRBQUJaVUZsb1d0QUFBRmxRV1doYTZBQUFXY2haYUZtQUFBQlpVRmxvV3dBQUFGbFFXV2hiR0FBQVdWQlphRnN3QUFCWlVGbG9XWUFBQUZsUVdXaGJTQUFBV1ZCWmFGbUFBQUJiWUFBQVczZ0FBRnVRQUFCYnFBQUFXOEFBQUZ2WUFBQmJ3QUFBVy9BQUFGdkFBQUJjQ0FBQVhDQUFBRnZZQUFCYndBQUFYRGdBQUZ2QUFBQmIyQUFBWEZBQUFGeG9YSUJjVUFBQVhHaGNnRnhRQUFCY21GeUFWQkJjc0Z6SUFBQlVFRnl3WE9BQUFGUVFYTEJjeUFBQVZCQmNzRnZ3QUFCVUVGeXdYUGdBQUZRUVhMQmRFQUFBWFNoY3NGMUFBQUJVRUZ5d1hWZ0FBRlFRWExCZGNBQUFWQkJjc0YySUFBQlVFRnl3WGFBQUFGUVFYTEJjeUFBQVhTaGNzRnpJQUFCVUVGeXdYYmdBQUZRUVhMQmQwQUFBVkJCY3NGM29BQUJVRUZ5d1hNZ0FBRlFRWExCY3lBQUFYZ0JlR0Y0d0FBQmVTQUFBWG1BQUFGNTRBQUJjYUFBQVhuZ0FBRnhvQUFCZWVBQUFYcEFBQUY1NEFBQmVxQUFBWG5nQUFGN0FBQUJlZUFBQVhHZ0FBRjdZQUFCYnFBQUFYdGdBQUY3d0FBQmUyQUFBWHdnQUFGOGdYemhmVUFBQVh5QmZPRjlRQUFCZklGODRYMmdBQUY4Z1h6aGZnQUFBWHlCZk9GK1lBQUJmSUY4NFg3QUFBRjhnWHpoZnlBQUFYeUJmT0Y5UUFBQmY0Rjg0WDFBQUFGOGdYemhmK0FBQVh5QmZPR0FRQUFCZ0tGODRZRUFBQUY4Z1h6aGdXQUFBWHlCZk9GOVFBQUJmSUY4NFgxQUFBR0J3QUFCZ2lBQUFZSEFBQUdDSUFBQmdjQUFBWUtBQUFHQndBQUJndUFBQVdWQUFBR0RRQUFCZzZBQUFZTkFBQUdFQUFBQmhHR0V3WVFBQUFHRklZVEJoQUFBQVlSaGhNR0ZnQUFCaEdHRXdZUUFBQUdFWVlUQmhlQUFBWVpCaHFHSEFBQUJoMkFBQVlmQUFBR0lJQUFCaDhBQUFZaUFBQUdId0FBQmlPQUFBWWxBQUFHSUlBQUJoOEFBQVlnZ0FBR0pvWW9CaW1HS3dZbWhpZ0dMSVlyQmlhR0tBWXVCaXNHSm9Zb0JpK0dLd1ltaGlnR01RWXJCaWFHS0FZeWhpc0dOQVlvQmpFR0t3WW1oaWdHTllZckJpYUdLQVkzQmlzR0pvWW9CamlHS3dZbWhpZ0dPZ1lyQmpRR0tBWXBoaXNHSm9Zb0JqdUdLd1ltaGlnR1BRWXJCaWFHS0FZcGhpc0dKb1lvQml5R0t3WTBCaWdHS1lZckJpYUdLQVk3aGlzR0pvWW9CajBHS3dZbWhpZ0dLWVlyQmlhR0tBWStoaXNHSm9Zb0JrQUdLd1ltaGlnR1FZWXJCaWFHS0FZcGhpc0dRd0FBQmtTQUFBWWZBQUFGeG9BQUJrWUFBQVpIZ0FBR1NRQUFCa3FBQUFaTUFBQUdUWUFBQmt3QUFBWlBBQUFHVEFBQUJsQ0FBQVpTQUFBR1RZQUFCbE9BQUFaVkFBQUdVNEFBQmxhQUFBWlRnQUFHV0FBQUJsbUFBQVpWQUFBR1U0QUFCbHNBQUFaY2dBQUdWUUFBQmw0QUFBWmZnQUFHWVFBQUJtS0daQVpoQUFBR1pZWmtCbUVBQUFaaWhtUUdad0FBQm1LR1pBWm9nQUFHWW9aa0JoOEdhZ1hHaG11R0h3WnFCbTBHYTRZZkJtb0dib1pyaGg4R2FnWWpobXVHSHdacUJlcUdhNFlmQm1vR2NBWnJoaDhHYWdaeGhtdUdId1pxQm5NR2E0WWZCbW9HZElacmhoOEdhZ1oyQm11R2Q0WnFCY2FHYTRZZkJtb0dlUVpyaGg4R2FnWjZobXVHSHdacUJjYUdhNFlmQm1vR2JRWnJobmVHYWdYR2htdUdId1pxQm5rR2E0WWZCbW9HZW9acmhoOEdhZ1hHaG11R0h3WnFCbndHYTRZZkJtb0dmWVpyaGg4R2FnWEdobXVHSHdacUJuOEdhNFlmQm1vRnhvWnJob0NBQUFhQ0FBQUdnNEFBQm9VQUFBYURnQUFHaG9BQUJvT0FBQWFJQUFBR2c0QUFCb21BQUFhRGdBQUdpd0FBQm95QUFBYU9BQUFHajRBQUJwRUFBQWFQZ0FBR2tvQUFCbytBQUFhVUFBQUdqNEFBQnBXQUFBYVhBQUFHa1FBQUJvK0FBQWFZZ0FBR2o0QUFCcG9BQUFhUGdBQUdtNEFBQm8rQUFBYVJBQUFHblFBQUJwNkFBQWFkQUFBR29BQUFCcDBBQUFhaGdBQUduUUFBQnA2QUFBWEZBQUFHb3dBQUJsNEdhZ2FrZ0FBR1hnWnFCcVlBQUFaZUJtb0dwNEFBQmw0R2FnYXBBQUFHcW9acUJxZUFBQVplQm1vR3JBQUFCbDRHYWdhdGdBQUdYZ1pxQnE4QUFBWmVCbW9Hc0lBQUJsNEdhZ2F5QUFBR1hnWnFCck9BQUFhcWhtb0dzZ0FBQmw0R2FnYTFBQUFHWGdacUJyYUFBQVplQm1vR3J3QUFCbDRHYWdhNEFBQUdxb1pxQnFTQUFBWmVCbW9HdVlBQUJsNEdhZ2E3QUFBR1hnWnFCcnlBQUFaZUJtb0dwSUFBQmw0R2FnYStBQUFHWGdacUJyK0FBQWJCQUFBR3dvQUFCc1FBQUFiRmdBQUd4d0FBQnNpQUFBYkhBQUFHeWdBQUJzY0FBQWJMZ0FBR3pRQUFCc2lBQUFiSEFBQUd6b0FBQnNjQUFBYklnQUFHMEFBQUJxU0FBQWJRQUFBRzBZQUFCdEFBQUFhd2dBQUcwQUFBQnRHQUFBVUZCdE1HMUlBQUJRVUcwd2JXQUFBRkJRYlRCdGVBQUFVRkJ0TUcyUUFBQlFVRzB3YmFnQUFGQlFiVEJ0d0FBQWJkaHRNRzJvQUFCUVVHMHdiZkFBQUZCUWJUQnVDQUFBVUZCdE1HNGdBQUJRVUcwd2JqZ0FBRkJRYlRCdFNBQUFiZGh0TUcxSUFBQlFVRzB3YmxBQUFGQlFiVEJ1YUFBQVVGQnRNRzZBQUFCUVVHMHdiVWdBQUZCUWJUQnVtQUFBYnJBQUFHN0lBQUJZOEFBQWJJZ0FBRmp3QUFCdTRBQUFXUEFBQUc3NEFBQlk4QUFBYnhBQUFHOG9BQUJzaUFBQVdQQUFBR3lJQUFCWThBQUFiMEFBQUZqd0FBQnZRQUFBV1BBQUFHOVlBQUJ2Y0crSWI2QUFBRzl3YjRodm9BQUFiM0J2aUcrNEFBQnZjRytJYjlBQUFHOXdiNGh2NkFBQWIzQnZpSEFBQUFCdmNHK0ljQmdBQUc5d2I0aHZvQUFBY0RCdmlHK2dBQUJ2Y0crSWNFZ0FBRzl3YjRod1lBQUFVSmh2aUhCNEFBQnZjRytJY0pBQUFHOXdiNGh2b0FBQWIzQnZpSENvQUFCd3dBQUFjTmdBQUhEQUFBQncyQUFBY01BQUFIRHdBQUJ3d0FBQWNRZ0FBRlFRQUFCeElBQUFjVGdBQUhFZ0FBQm9DQUFBY1ZCeGFHZ0lBQUJ4Z0hGb2FBZ0FBSEZRY1doeG1BQUFjVkJ4YUdnSUFBQnhVSEZvWEZBQUFIR3djY2h4NEFBQWNmZ0FBRXRZQUFCeUVBQUFTMWdBQUhJb0FBQkxXQUFBY2tBQUFISllBQUJ5RUFBQVMxZ0FBSElRQUFCTFdBQUFjbkFBQUhLSWNxQnl1SExRY29oeW9ITG9jdEJ5aUhLZ2N3QnkwSEtJY3FCekdITFFjb2h5b0hNd2N0QnlpSEtnYzBoeTBITmdjcUJ6TUhMUWNvaHlvSE40Y3RCeWlIS2djNUJ5MEhLSWNxQnpxSExRY29oeW9IUEFjdEJ6WUhLZ2NyaHkwSEtJY3FCejJITFFjb2h5b0hQd2N0QnlpSEtnY3JoeTBIS0ljcUJ5NkhMUWMyQnlvSEs0Y3RCeWlIS2djOWh5MEhLSWNxQno4SExRY29oeW9IUUljdEJ5aUhLZ2RDQnkwSEtJY3FCME9ITFFjb2h5b0hLNGN0QnlpSEtnZEFoeTBIUlFBQUIwYUFBQWRJQUFBRzFJQUFCMG1BQUFkTEFBQUhLSWNxQnl1SExRYkVBQUFIVElBQUJzUUFBQWJaQUFBR3hBQUFCMDRBQUFVRGdBQUhUSUFBQjArQUFBZFJBQUFIVDRBQUIxS0FBQWRQZ0FBSFZBQUFCMVdBQUFkUkFBQUhUNEFBQjFjQUFBZFlnQUFIVVFBQUIxb0FBQWRiZ0FBSFdnQUFCMTBBQUFkYUFBQUhYb0FBQjJBQUFBZGJnQUFIWVlBQUIxdUFBQWRqQjJTSFpnZG5oMk1IWklkcEIyZUhZd2RraDJxSFo0ZGpCMlNHeWdkbmgyTUhaSWRzQjJlSFl3ZGtoMjJIWjRkakIyU0hid2RuaDJNSFpJZHdoMmVIWXdka2gzSUhaNGRqQjJTSGM0ZG5oM1VIWklkbUIyZUhZd2RraDNhSFo0ZGpCMlNIZUFkbmgyTUhaSWRtQjJlSFl3ZGtoMmtIWjRkMUIyU0haZ2RuaDJNSFpJZDJoMmVIWXdka2gzZ0haNGRqQjJTSGVZZG5oMk1IWklkN0IyZUhZd2RraDN5SFo0ZGpCMlNIWmdkbmgyTUhaSWQrQjJlSFl3ZGtoM21IWjRYRkFBQUdvd0FBQm8rQUFBZC9nQUFHajRBQUI0RUFBQWFQZ0FBSGdvQUFCbytBQUFlRUFBQUdqNEFBQjRXQUFBWmVBQUFIaHdBQUI0aUFBQWVLQUFBSGlJQUFCNHVBQUFlSWdBQUhqUUFBQjRpQUFBZU9nQUFIa0FBQUI0b0FBQWVJZ0FBSGtZQUFCNGlBQUFlVEFBQUhpSUFBQjVTQUFBZUlnQUFIbGdBQUI1ZUFBQWVaQUFBSGw0QUFCNXFBQUFlWGdBQUhuQUFBQjVlQUFBZVpBQUFBQUgvY3dBQUFBSC9rd0FBQUFIL1ZRQUFBQUgvZmdBQUFBSC9Wd0FBQUFIL2ZRQUFBQUgvV0FBQUFBSC9pQUFBQUFIL1h3SU1BQUgvZ0FJTUFBSC9sZ0lNQUFIL1BBSU1BQUgvT2dJTUFBSC9YZ0lNQUFIL1lRSU1BQUgvWUFJTUFBSC9nd0lNQUFIL1hnSzhBQUgvZ0FLN0FBSC9sZ0s3QUFIL1BRSzhBQUgvT2dLOEFBSC9aUUs4QUFIL1lRSzhBQUgvWUFLOEFBSCs3UUs4QUFIK0hnSU1BQUgvWHdLZEFBSC9XQUlNQUFIK2lBSU1BQUgrRmdMRkFBRUJWZ0FBQUFFQ1R3QUFBQUVCVkFLOEFBRUJWQU40QUFFQlZBTmhBQUVCVkFQeUFBRUJWdjlTQUFFQlZBUDBBQUVCVkFRRkFBRUJWQVA4QUFFQlVRTjRBQUVCVkFOK0FBRUJWUU80QUFFQlZBTzZBQUVCVlFQcEFBRUJWQVA1QUFFQlZBTW9BQUVCTkFONUFBRUJXUU9UQUFFQlZBTnNBQUVCVkFPZEFBRUJWUU45QUFFQnhRQUFBQUVCNmdLOEFBRUJRZ0FBQUFFQlFnSzhBQUVCYndBQUFBRUJlUUs4QUFFQmVRTjRBQUVCZGdONEFBRUJlUDh1QUFFQmVRTitBQUVCWGdBQUFBRUJQZ0s4QUFFQk9nTjRBQUVCUlFBQUFBRUNHUUFBQUFFQlBBSzhBQUVCUEFONEFBRUJQQU5oQUFFQk9RTjRBQUVCUEFOK0FBRUJQQU80QUFFQlJQOVNBQUVCUEFPNkFBRUJQQVBwQUFFQlBBUDVBQUVCUEFNb0FBRUJIQU41QUFFQlFRT1RBQUVCUEFOc0FBRUJQQU45QUFFQkVnQUFBQUVCRWdLOEFBRUJoZ0FBQUFFQmhRSzhBQUVCaFFOaEFBRUJnUU40QUFFQmhRTitBQUVCaGY4eUFBRUJjZ0FBQUFFQmNBSzhBQUVCY0FOK0FBRUFpUUFBQUFFQXVBQUFBQUVBaVFLOEFBRUI1d0FBQUFFQ0t3SzhBQUVBaVFONEFBRUFpUU5oQUFFQWhnTjRBQUVBaVFOK0FBRUFpUU1vQUFFQWlmOVNBQUVBYVFONUFBRUFqZ09UQUFFQWlRTnNBQUVBaWdOOUFBRUExUUFBQUFFQkdRSzhBQUVCR1FONEFBRUJHUU4rQUFFQlZBQUFBQUVCVXdLOEFBRUJVLzh5QUFFQWh3SzhBQUVBN2dIWUFBRUJFdjh5QUFFQkhnQUFBQUVBa3dLOEFBRUErZ0hZQUFFQnZRQUFBQUVCdlFLOEFBRUJjZ0s4QUFFQmNnTjRBQUVCYndONEFBRUJjdjh5QUFFQmN3TjlBQUVCaHdBQUFBRUJrZ0FLQUFFQmh3SzhBQUVCaHdMSUFBRUJoZ040QUFFQmh3TmhBQUVCZ3dONEFBRUJod04rQUFFQmh3TzRBQUVCaHY5U0FBRUJod082QUFFQmh3UHBBQUVCaHdQNUFBRUJoZ01vQUFFQlpnTjVBQUVCakFPVEFBRUJod045QUFFQnJBTjZBQUVCaHdOc0FBRUJ0QUFBQUFFQnZnSzhBQUVCS0FBQUFBRUJLQUs4QUFFQkl3QUFBQUVCSXdLOEFBRUJRd0FBQUFFQk93SzhBQUVCT3dONEFBRUJOd040QUFFQlEvOHlBQUVCSUFBQUFBRUJHd0s4QUFFQkd3TjRBQUVCR0FONEFBRUJLdjh1QUFFQkd3TitBQUVCSVA4eUFBRUJWUUFBQUFFQlZRSzhBQUVCVWdBQUFBRUJVZ0s4QUFFQkpBQUFBQUVCTEFLOEFBRUJLUU40QUFFQkxmOHVBQUVCSS84eUFBRUJad0FBQUFFQnNnQUFBQUVCWndLOEFBRUNhZ0s4QUFFQlp3TjRBQUVCWndOaEFBRUJaQU40QUFFQlp3TitBQUVCWndNb0FBRUJad1BrQUFFQlNnUGtBQUVCWndQWUFBRUJaLzlTQUFFQlJ3TjVBQUVCYkFPVEFBRUJhQU45QUFFQmpRTjZBQUVCWndOc0FBRUJad09kQUFFQlVRQUFBQUVCVVFLOEFBRUI5UUFBQUFFQjlRSzhBQUVCOVFONEFBRUI5UU4rQUFFQjlRTW9BQUVCMVFONUFBRUJNUUFBQUFFQk9nSzhBQUVCT1FOK0FBRUJPUU1vQUFFQk1mOVNBQUVCR1FONUFBRUJQd09UQUFFQk9nTnNBQUVCT2dOOUFBRUJPd0FBQUFFQk5nSzhBQUVCTmdONEFBRUJNZ040QUFFQkRRQUFBQUVDREFBRUFBRUJGQUlNQUFFQkZRTElBQUVCRkFOT0FBRUJEZjlTQUFFQkZBS3hBQUVBOXdOT0FBRUJDd05wQUFFQkZBTWdBQUVCRVFMSUFBRUJGUUxPQUFFQmxBTTRBQUVCRkFMT0FBRUJkZ000QUFFQmlnTk1BQUVCRkFNVEFBRUJGUUtzQUFFQTlBTElBQUVCR1FMakFBRUJGUUs4QUFFQkZRTDhBQUVCc2dBQUFBRUJ5Z0lNQUFFQkx3QUFBQUVBZlFMd0FBRUJId0FBQUFFQklnSU1BQUVCSWdMSUFBRUJJQUxJQUFFQktmOHVBQUVCSWdMT0FBRUJGZ0FBQUFFQktRSU1BQUVDQlFJTUFBRUJ1QUtsQUFFQmhBQUFBQUVCSkFJTUFBRUJKQUxJQUFFQkpRTE9BQUVCcEFNNEFBRUJJUDlTQUFFQkpBTE9BQUVCaGdNNEFBRUJtZ05NQUFFQkpBTVRBQUVCSlFLc0FBRUJCQUxJQUFFQktRTGpBQUVCSkFLOEFBRUJGQUFBQUFFQXRBSU1BQUVCR0FJTUFBRUFyd0FBQUFFQXRnTHdBQUVCS2Y4eUFBRUJKZ0xJQUFFQktRTE9BQUVCTEFMYUFBRUJMQUFBQUFFQW1BS2xBQUVBZlFPeUFBRUFmd0FBQUFFQXJBQUFBQUVBZmdJTUFBRUFmZ0xJQUFFQWZnS3hBQUVBZXdMSUFBRUFmZ0xPQUFFQWZ3S3NBQUVBZi85U0FBRUFYZ0xJQUFFQWd3TGpBQUVCZXY4eUFBRUJod0lNQUFFQWZ3SzhBQUVBZmY4eUFBRUFpZ0lNQUFFQWlnTElBQUVBaWdMT0FBRUFnZ0x3QUFFQkMvOHlBQUVBZ0FBQUFBRUFlUUx3QUFFQXF3SU1BQUVBZVFPc0FBRUFmdjh5QUFFQWhnQUFBQUVBZndMd0FBRUFzUUlNQUFFQnZ3QUFBQUVCdndJTUFBRUJLUUFBQUFFQktBSU1BQUVCS0FMSUFBRUJKUUxJQUFFQkp2OHlBQUVCTGdBQUFBRUI5QUFJQUFFQkxnSU1BQUVCTGdJWkFBRUJMZ0xJQUFFQkxnS3hBQUVCS3dMSUFBRUJMZ0xPQUFFQnJnTTRBQUVCTHY5U0FBRUJrQU00QUFFQnBBTk1BQUVCTGdNVEFBRUJMZ0tzQUFFQkRnTElBQUVCTXdMakFBRUJWQUxLQUFFQkxnSzhBQUVCSndJTUFBRUI3QUFBQUFFQitRSU1BQUVCT0FBQUFBRUJPQUlNQUFFQktnQUFBQUVCS2dJTUFBRUFoQUFBQUFFQXp3SU1BQUVBendMSUFBRUF6QUxJQUFFQWdmOHlBQUVBK2dBQUFBRUE4Z0lNQUFFQThnTElBQUVBOEFMSUFBRUJCUDh1QUFFQThnTE9BQUVBOS84eUFBRUJHd0FBQUFFQkVBTHdBQUVBNEFBQUFBRUF0UUtUQUFFQTNnSU1BQUVBcVFFMkFBRUE2djh1QUFFQTNmOHlBQUVCOEFBQUFBRUJ0d0lNQUFFQktRTElBQUVCS1FLeEFBRUJLUUtzQUFFQktBTlpBQUVCS0FLZEFBRUJDd05aQUFFQktBTk5BQUVCS1A5U0FBRUJDQUxJQUFFQkxRTGpBQUVCVGdMS0FBRUJLUUs4QUFFQktRTDhBQUVCQ2dBQUFBRUJDZ0lNQUFFQmlRQUFBQUVCZ3dJTUFBRUJnd0xJQUFFQmd3TE9BQUVCZ3dLc0FBRUJZd0xJQUFFQkFBQUFBQUVCQUFJTUFBRUJud0FBQUFFQkd3SU1BQUVCSEFMSUFBRUJIQUxPQUFFQkhBS3NBQUVCbnY5U0FBRUErd0xJQUFFQklBTGpBQUVCSEFLOEFBRUE4QUFBQUFFQTl3SU1BQUVBK0FMSUFBRUE5UUxJQUFFQkZnSTVBQUVCR1FJNUFBRUJHUUwxQUFFQkdRTGVBQUVCR1FON0FBRUJHLzlTQUFFQS9BTjdBQUVCRHdPUUFBRUJHUU5ZQUFFQkZnTDFBQUVCR1FMN0FBRUJtUU5sQUFFQmV3TmxBQUVCandONUFBRUJHUUxaQUFFQStRTDFBQUVCSGdNUUFBRUJHZ0xwQUFFQkdnTXBBQUVCR2dMNkFBRUJaZ0FBQUFFQnlnSTVBQUVCRlFBQUFBRUJGUUk1QUFFQk9nQUFBQUVCTkFJNUFBRUJOQUwxQUFFQk1BTDFBQUVCUS84dUFBRUJNd0w3QUFFQkxRQUFBQUVBbkFFekFBRUJ3Z0FBQUFFQkR3STVBQUVCRHdMMUFBRUJEd0xlQUFFQkN3TDFBQUVCRHdMN0FBRUJqd05sQUFFQkhmOVNBQUVCY1FObEFBRUJEd05tQUFFQkR3TkFBQUVCRGdMWkFBRUE3Z0wxQUFFQkV3TVFBQUVCRHdMcEFBRUJEd0w2QUFFQTlBQUFBQUVBOUFJNUFBRUJOQUxlQUFFQk1RTDFBQUVCTkFMN0FBRUJPUDh5QUFFQk93STVBQUVCT3dMN0FBRUFnZ0FBQUFFQXJnQUFBQUVBZ3dJNUFBRUFnd0wxQUFFQWd3TGVBQUVBZndMMUFBRUFnZ0w3QUFFQWdnTFpBQUVBZ3Y5U0FBRUFZZ0wxQUFFQWh3TVFBQUVCL2dJNUFBRUFnd0xwQUFFQWd3TDZBQUVBdWdBQUFBRUErd0k1QUFFQSt3TDFBQUVBK3dMN0FBRUJHZ0k1QUFFQkhmOHlBQUVBb1FJNUFBRUEyZ0ZWQUFFQW9nTDFBQUVCQi84eUFBRUFyUUk1QUFFQTVnRlZBQUVCZXdBQUFBRUJld0k1QUFFQlFRSTVBQUVCUVFMMUFBRUJQZ0wxQUFFQlF2OHlBQUVCUWdMNkFBRUJTQUFBQUFFQm9RQUFBQUVCU1FJNUFBRUJTUUpIQUFFQlNRTDFBQUVCU1FMZUFBRUJSUUwxQUFFQlNRTDdBQUVCeVFObEFBRUJTUDlTQUFFQnF3TmxBQUVCdndONUFBRUJTUU5ZQUFFQlNBTFpBQUVCS0FMMUFBRUJUUU1RQUFFQlNRTDZBQUVCYmdMM0FBRUJTUUxwQUFFQmFnQUFBQUVCaFFJNUFBRUJEd0FBQUFFQkFRQUFBQUVCQVFJNUFBRUJDd0k1QUFFQkNBTDFBQUVBOFFBQUFBRUE5Z0k1QUFFQTlnTDFBQUVBOHdMMUFBRUErdjh1QUFFQTlnTDdBQUVBNy84eUFBRUJBd0FBQUFFQkF3STVBQUVCQWdFd0FBRUJBQUwxQUFFQkMvOHVBQUVCQVA4eUFBRUJOUUFBQUFFQmNRQUFBQUVCTndJNUFBRUJ4UUk1QUFFQk9BTDFBQUVCT0FMZUFBRUJOd0w3QUFFQk53TFpBQUVCTndPR0FBRUJOd0xLQUFFQkdnT0dBQUVCTndONkFBRUJOUDlTQUFFQkZ3TDFBQUVCUEFNUUFBRUJPQUw2QUFFQlhRTDNBQUVCT0FMcEFBRUJPQU1wQUFFQm53STVBQUVCbndMMUFBRUJud0w3QUFFQm53TFpBQUVCZndMMUFBRUJHd0k1QUFFQkNBQUFBQUVCQmdJNUFBRUJCZ0wxQUFFQkJnTDdBQUVCQlFMWkFBRUJDUDlTQUFFQTVRTDFBQUVCQ2dNUUFBRUJCZ0xwQUFFQkJnTDZBQUVBK0FBQUFBRUEvd0k1QUFFQS93TDFBQUVBL0FMMUFBRUdzQWJHQUFFQURBQXlBQWtBQUFBOEFBQUFRZ0FBQUVnQUFBQThBQUFBVGdBQUFGUUFBQUE4QUFBQVdnQUFBR0FBQ2dCQUFFWUFUQUJTQUVBQVdBQk1BRUFBWGdCTUFBSC9jd0FBQUFIL2t3QUFBQUgvVlFBQUFBSC9mZ0FBQUFIL1Z3QUFBQUgvZlFBQUFBSC9XQUFBQUFIL2MvOVNBQUgva1A4eUFBSC9ZUDh1QUFFQWhmOHVBQUgvZnY4eUFBSC9ldjh5QUFFR1NBWnFBQUVBREFEaUFEVUFBQUU2QUFBQlFBQUFBVVlBQUFGTUFBQUJVZ0FBQVZnQUFBRmVBQUFCWGdBQUFWZ0FBQUZrQUFBQldBQUFBV29BQUFGa0FBQUJjQUFBQVhZQUFBRjhBQUFCZ2dBQUFZZ0FBQUZ3QUFBQmpnQUFBWlFBQUFGd0FBQUJtZ0FBQVhBQUFBR2dBQUFCbWdBQUFWNEFBQUU2QUFBQlFBQUFBVVlBQUFGTUFBQUJVZ0FBQVZnQUFBRmVBQUFCWGdBQUFWZ0FBQUZrQUFBQldBQUFBYVlBQUFGa0FBQUJPZ0FBQVRvQUFBRTZBQUFCT2dBQUFhd0FBQUZlQUFBQlhnQUFBVjRBQUFGZUFBQUJXQUFBQVZnQUFBRllBQUFCV0FBeEFOd0E0Z0RvQU80QTlBRDZBUUFCQmdFTUFKb0JFZ0VZQVI0QkpBRXFBVEFCTmdFOEFVSUJTQUZPQVZRQldnRmdBV1lCYkFGeUFYZ0JmZ0dFQVlvQmtBR1dBTndBNGdEb0FPNEE5QUQ2QVFBQkJnRU1BSm9CbkFFWUFhSUJxQURXQWE0QUFmOWZBZ3dBQWYrQUFnd0FBZitXQWd3QUFmODhBZ3dBQWY4NkFnd0FBZjllQWd3QUFmOWhBZ3dBQWY5Z0Fnd0FBZitEQWd3QUFmOWVBcndBQWYrQUFyc0FBZitXQXJzQUFmODlBcndBQWY4NkFyd0FBZjlsQXJ3QUFmOWhBcndBQWY5Z0Fyd0FBZjd0QXJ3QUFmNGVBZ3dBQWY5ZkFwMEFBZjlmQXF3QUFmOTJBc2dBQWY4OEFzZ0FBZjlnQXNvQUFmOWVBczRBQWY5ZUFzZ0FBZjloQXJFQUFmOWVBdndBQWY5Z0FzMEFBZitJQXVNQUFmOWdBdzBBQVFDeEFxd0FBUUNlQXNnQUFRQmNBc2dBQVFDd0Fzb0FBUUN5QXM0QUFRQ3lBc2dBQVFDUkF2d0FBUUNnQXJ3QUFmOWVBMXdBQWY5MkEzZ0FBZjg5QTNnQUFmOWdBM29BQWY5ZUEzNEFBZjlpQTNnQUFmOWhBMkVBQWY5ZUE1MEFBZjlnQTMwQUFmOWVBMndBQWY3eUE1TUFBZjlnQTcwQUFmOWlBcElBQWY0akF1TUFBZjlCQTFrQUFmOWZBMWtBQWY5ZkEwMEFBUU95QkNBQUFRQU1BT0lBTlFBQUFPZ0FBQUR1QUFBQTlBQUFBUG9BQUFFQUFBQUJCZ0FBQVF3QUFBRU1BQUFCQmdBQUFSSUFBQUVHQUFBQkdBQUFBUklBQUFFZUFBQUJKQUFBQVNvQUFBRXdBQUFCTmdBQUFSNEFBQUU4QUFBQlFnQUFBUjRBQUFGSUFBQUJIZ0FBQVU0QUFBRklBQUFCREFBQUFPZ0FBQUR1QUFBQTlBQUFBUG9BQUFFQUFBQUJCZ0FBQVF3QUFBRU1BQUFCQmdBQUFSSUFBQUVHQUFBQlZBQUFBUklBQUFEb0FBQUE2QUFBQU9nQUFBRG9BQUFCV2dBQUFRd0FBQUVNQUFBQkRBQUFBUXdBQUFFR0FBQUJCZ0FBQVFZQUFBRUdBQWdBaWdDUUFKWUFuQUNpQUtnQXJnQzBBQUgvWHdJTUFBSC9nQUlNQUFIL2xnSU1BQUgvUEFJTUFBSC9PZ0lNQUFIL1hnSU1BQUgvWVFJTUFBSC9ZQUlNQUFIL2d3SU1BQUgvWGdLOEFBSC9nQUs3QUFIL2xnSzdBQUgvUFFLOEFBSC9PZ0s4QUFIL1pRSzhBQUgvWVFLOEFBSC9ZQUs4QUFIKzdRSzhBQUgrSGdJTUFBSC9Yd0tkQUFIL1lnTk9BQUgvUkFOT0FBSC9XQU5wQUFIL1lnTWdBQUgvM2dNNEFBSC93UU00QUFILzFBTk1BQUgvWGdNVEFBSUFBZ0FDQUxrQUFBSXlBak1BdUFBQ0FBRUN1UUs4QUFBQUFRQUNBdTRDK3dBQkFCd0NOZ0kzQWpvQ1BBSTlBajRDUHdKRUFrWUNSd0pJQWtrQ1lBSmtBbVVDYWdKdUFtOENkQUo0QW5rQ2ZRS0NBb01DaGdLTkFvOENsUUFCQUFnQ21BS1pBcHdDbndLZ0FxVUN0d0s0QUFJQUpBQVdBQllBQUFBWkFCa0FBUUFsQURjQUFnQStBRUVBRlFCREFFNEFHUUJTQUZNQUpRQmFBR0FBSndCdkFIUUFMZ0I1QUhrQU5BQ0pBSTBBTlFDYkFLQUFPZ0NtQU5FQVFBRFRBTmtBYkFEYkFPNEFjd0R3QVBBQWh3RDZBUklBaUFFVUFSUUFvUUVhQVJvQW9nRXFBUzhBb3dFMEFUUUFxUUU0QVRzQXFnRkRBVWNBcmdGVkFWb0Fzd0ZkQVYwQXVRRmdBV1VBdWdGbkFXOEF3QUYwQVhVQXlRR09BWTRBeXdHUUFaVUF6QUdhQWFzQTBnRzBBY1VBNUFIU0FkZ0E5Z0huQWV3QS9RSHhBZkVCQXdJUkFoWUJCQUljQWlFQkNnQUNBQU1BQWdCWEFBQUFXUUM1QUZZQ01nSXpBTGNBQWdBQ0FMb0JFZ0FBQVJRQmRRQlpBQUlBQWdGMkFjOEFBQUhSQWk4QVdnQUJBQk1DbUFLWkFwd0NvQUtsQXFZQ3FRS3JBcTBDc1FLeUFyTUN0QUs1QXJvQ3V3SzhBc0VDd2dBQkFBSUNNQUl4QUFJQUFnTUFBeElBQUFNZ0ExRUFFd0FDQUFVQUFnRFpBQUFBMndFWkFOZ0JHd0Z6QVJjQmRnR3JBWEFCclFJdkFhWUFBZ0FEQXc4REVRQUFBeTRETUFBREEwRURRd0FHQUFFQUNnTVBBeEFERVFNZUF5NERMd013QTBFRFFnTkRBQUlBQlFNQUF3UUFBQU1HQXcwQUJRTWdBeXdBRFFNeUF6OEFHZ05GQTFFQUtBQUNBQXdEQUFNQUFBQURBZ01FQUFFREJnTU5BQVFERXdNVEFBd0RGUU1aQUEwREd3TWJBQklESFFNZEFCTURJQU1nQUJRRElnTXNBQlVETWdNekFDQUROUU0vQUNJRFJRTklBQzBBQWdBQkEwb0RVUUFBQUFJQUFBQUNBQmdDTndJM0FBZ0NPQUk0QUFVQ09RSTVBQVFDT3dJN0FBWUNQUUk5QUFrQ1F3SkRBQVFDUlFKRkFBWUNSd0pIQUFrQ1lnSmlBQUlDWXdKakFBRUNaQUprQUFNQ1p3Sm5BQWNDYkFKc0FBSUNiUUp0QUFFQ2JnSnVBQU1DY1FKeEFBY0NkZ0oyQUFJQ2R3SjNBQUVDZUFKNEFBTUNld0o3QUFjQ2dBS0FBQUlDZ1FLQkFBRUNnZ0tDQUFNQ2hRS0ZBQWNBQWdBYUFqWUNOZ0FIQWpjQ053QUNBandDUEFBTEFqMENQUUFLQWo0Q1BnQUlBajhDUHdBSkFrWUNSZ0FMQWtjQ1J3QUtBa2dDU0FBSUFra0NTUUFKQW1BQ1lBQUdBbVFDWkFBTUFtVUNaUUFFQW1vQ2FnQUdBbTRDYmdBTUFtOENid0FFQW5RQ2RBQUdBbmdDZUFBTUFua0NlUUFFQW4wQ2ZRQUdBb0lDZ2dBTUFvTUNnd0FFQW9ZQ2hnQUJBbzBDalFBRUFvOENqd0FEQXBVQ2xRQUZBQUlBRmdJd0FqQUFBUUl4QWpFQUFnSmlBbUlBQXdKa0FtUUFCZ0psQW1VQUJBSm1BbVlBQlFKc0Ftd0FBd0p1QW00QUJnSnZBbThBQkFKd0FuQUFCUUoyQW5ZQUF3SjRBbmdBQmdKNUFua0FCQUo2QW5vQUJRS0FBb0FBQXdLQ0FvSUFCZ0tEQW9NQUJBS0VBb1FBQlFLR0FvWUFDQUtOQW8wQUJBTHVBdTRBQndMN0F2c0FCd0FDQUFRQ253S2ZBQUVDb0FLZ0FBSUNwUUtsQUFRQ3R3SzRBQU1BQWdBTEFwZ0NtUUFEQXB3Q25BQURBcDhDbndBSEFxQUNvQUFHQXFVQ3BRQUpBcW9DcWdBRkFxc0Nxd0FCQXJjQ3VBQUlBcmtDdVFBRUFyc0N1d0FFQXI4Q3Z3QUNBQUlBSXdBWkFCa0FBd0FhQUJvQUFRQWJBQ0FBQWdBaEFDUUFDZ0FsQURZQUF3QTNBRGNBQkFBNEFEMEFCUUErQUVFQUJnQkNBRUlBQndCREFFNEFCZ0JQQUZFQUJ3QlNBRk1BQ0FCVUFGY0FDUUJaQUZrQUNRQmFBR0FBQmdCaEFHNEFDZ0J2QUhRQUZnQjFBSGdBQ2dCNUFIa0FBd0I2QUhzQUN3QjhBSHdBQ2dCOUFJQUFEQUNCQUlZQURRQ0hBSWNBQVFDSUFJZ0FDZ0NKQUkwQURnQ09BSm9BRHdDYkFLQUFFQUNoQUtVQUR3Q21BS1lBRVFDbkFLc0FFZ0NzQUt3QUV3Q3RBTFVBRkFDMkFMa0FGUUl6QWpNQUNnQUNBRjhBQWdBWkFDSUFHZ0FhQUNjQUd3QWdBQUVBSVFBM0FDY0FPQUE5QUFFQVBnQk9BQ2NBVHdCUkFCUUFVZ0JnQUNjQVlRQjVBQUVBZWdCN0FDY0FmQUI4QUFFQWZRQ0FBQ2NBZ1FDR0FDUUFod0NIQUNjQWlBQ0lBQUVBaVFDTkFBSUFqZ0NsQUFNQXBnQ21BQVFBcHdDckFBVUFyQUNzQUJVQXJRQzFBQVlBdGdDNUFEQUF1Z0RSQUJZQTBnRFNBQmdBMHdEdkFBc0E4QUR3QUJjQThRRDJBQXNBOXdENUFCZ0ErZ0VJQUJrQkNRRU1BQWtCRFFFVUFCZ0JGUUViQUJvQkhBRTBBQXNCTlFFMUFCd0JOZ0UyQUJnQk53RTNBQXNCT0FFN0FCb0JQQUZCQUI0QlFnRkNBQmdCUXdGSEFBMEJTQUZmQUJvQllBRmxBQkFCWmdGbUFCOEJad0Z2QUJJQmNBRnpBQ0FCZEFGMUFCY0JkZ0YyQUNVQmR3R09BQ01CandHUEFDVUJrQUdWQUJzQmxnR3JBQ1VCckFHc0FCc0JyUUd0QUNVQnJnR3pBQnNCdEFIRkFDVUJ4Z0hKQUFvQnlnSFlBQ1VCMlFIeEFCc0I4Z0h6QUNVQjlBSDBBQnNCOVFINEFDVUIrUUgrQUNrQi93SURBQTRDQkFJYkFBOENIQUloQUJFQ0lnSWlBQ29DSXdJckFCTUNMQUl2QUN3Q01nSXlBQ0lDTXdJekFBRUNOQUkwQUJ3Q1BRSTlBRGdDUndKSEFEZ0NtQUtaQUNFQ21nS2JBQzBDbkFLY0FDRUNud0tmQURZQ293S2pBQ3NDcFFLbEFDWUNwZ0ttQUFnQ3FnS3FBQzhDckFLc0FERUNyUUt0QURJQ3JnS3VBQzRDcndLdkFEUUNzQUt3QURVQ3NRSzBBQ2dDdGdLMkFETUN1UUs1QUF3Q3VnSzZBQjBDdXdLN0FBd0N2QUs4QUIwQ3dnTENBRGNDN2dMdUFBY0Mrd0w3QUFjQUFnQXJBTkVBMFFBQ0FOSUEwZ0FNQU5NQTJBQUJBTmtBMlFBSkFOb0EyZ0FNQU5zQTJ3QUtBTndBM0FBSkFOMEE3Z0FDQU84QTd3QU1BUEFBOEFBREFQRUE5Z0FFQVBjQStRQUxBUG9CQkFBR0FRVUJCUUFIQVFZQkNBQUdBUWtCREFBSEFRMEJEZ0FJQVE4QkVBQUpBUkVCRVFBS0FSSUJFZ0FKQVJRQkZBQUpBUlVCR1FBTEFSb0JHZ0FIQVJzQkd3QUxBUndCS1FBTUFTb0JMd0FWQVRBQk13QU1BVFFCTkFBQ0FUVUJOZ0FNQVRjQk53QU5BVGdCT3dBT0FUd0JRUUFQQVVJQlFnQUZBVU1CUndBUUFVZ0JWQUFMQVZVQldnQVJBVnNCWHdBTEFXQUJaUUFTQVdZQlpnQVRBV2NCYndBU0FYQUJjd0FVQVhRQmRBQUdBWFVCZFFBSkFBSUFNUUNKQUkwQUFRQ21BS1lBRHdDNkFORUFEUURTQU5JQUVBRFRBTzhBQXdEd0FQQUFDUUR4QVBZQUF3RDNBUGtBRUFENkFRZ0FDZ0VKQVF3QUFnRU5BUlFBRUFFVkFSc0FIZ0VjQVRRQUF3RTFBVFVBSVFFMkFUWUFFQUUzQVRjQUF3RTRBVHNBSGdFOEFVRUFGQUZDQVVJQUVBRkRBVWNBREFGSUFWOEFIZ0ZnQVdVQUJRRm1BV1lBQmdGbkFXOEFCd0Z3QVhNQUNBRjBBWFVBQ1FJMEFqUUFJUUtZQXBrQUV3S2NBcHdBRXdLZEFwMEFIQUtmQXA4QUdRS2pBcU1BR3dLbEFxVUFGUUttQXFZQUZnS3FBcW9BR0FLc0Fxd0FFUUt0QXEwQUZ3S3VBcTRBRWdLdkFxOEFId0sxQXJVQUlnSzJBcllBSFFLNUFya0FCQUs2QXJvQUdnSzdBcnNBQkFLOEFyd0FHZ0xCQXNFQUlBTENBc0lBQ3dMdUF1NEFEZ0w3QXZzQURnQUNBQjhCZGdGMkFBRUJqZ0dPQUFNQmp3R1BBQUVCa0FHVkFBSUJsZ0daQUFvQm1nR3JBQU1CckFHc0FBb0JyUUd0QUFRQnJnR3pBQVVCdEFIRkFBWUJ4Z0hKQUFjQnlnSExBQWdCekFIUEFBa0IwUUhSQUFrQjBnSFlBQVlCMlFIbUFBb0I1d0hzQUJVQjdRSHdBQW9COFFIeEFBTUI4Z0h6QUFzQjlBSDBBQW9COVFINEFBd0IrUUgrQUEwQi93SURBQTRDQkFJUUFBOENFUUlXQUJBQ0Z3SWJBQThDSEFJaEFCRUNJZ0lpQUJJQ0l3SXJBQk1DTEFJdkFCUUFBZ0JBQUJvQUdnQUtBQnNBSUFBQkFDRUFOd0FLQURnQVBRQUJBRDRBVGdBS0FGSUFZQUFLQUdFQWVRQUJBSG9BZXdBS0FId0FmQUFCQUgwQWdBQUtBSWNBaHdBS0FJZ0FpQUFCQUlrQWpRQUxBS1lBcGdBTUFLMEF0UUFOQU5NQTd3QVJBUEVBOWdBUkFSVUJHd0FRQVJ3Qk5BQVJBVGNCTndBUkFUZ0JPd0FRQVVnQlh3QVFBV0FCWlFBU0FXY0Jid0FUQVhBQmN3QVVBWFlCZGdBZEFYY0JqZ0FPQVk4Qmp3QWRBWkFCbFFBQ0FaWUJxd0FkQWF3QnJBQUNBYTBCclFBZEFhNEJzd0FDQWJRQnhRQWRBY1lCeVFBUEFjb0IyQUFkQWRrQjhRQUNBZklCOHdBZEFmUUI5QUFDQWZVQitBQWRBZmtCL2dBREFmOENBd0FFQWdRQ0d3QUZBaHdDSVFBR0FpSUNJZ0FIQWlNQ0t3QUlBaXdDTHdBSkFqTUNNd0FCQXBnQ21RQVZBcHdDbkFBVkFwOENud0FnQXFNQ293QWJBcVFDcEFBZUFxWUNwZ0FYQXFvQ3FnQWFBcXdDckFBV0FxMENyUUFZQXE0Q3JnQVpBcm9DdWdBaUFyd0N2QUFpQXNFQ3dRQWhBc0lDd2dBakFzUUN4QUFmQXNVQ3hRQWNBQUlBRkFBQ0FCa0FBUUFiQUNBQUFnQTRBRDBBQWdCUEFGRUFEQUJoQUhrQUFnQjhBSHdBQWdDSUFJZ0FBZ0NKQUkwQURRQ21BS1lBQXdDbkFLc0FCQUNzQUt3QUJRQ3RBTFVBQmdDMkFMa0FCd0VKQVF3QURnRThBVUVBQ0FGZ0FXVUFDUUZtQVdZQUNnRndBWE1BQ3dJeUFqSUFBUUl6QWpNQUFnQUNBQTRDbUFLWkFBUUNuQUtjQUFRQ29BS2dBQVVDcFFLbEFBa0NwZ0ttQUFvQ3FRS3BBQU1DclFLdEFBRUNzUUswQUFJQ3VRSzVBQWNDdWdLNkFBZ0N1d0s3QUFjQ3ZBSzhBQWdDd1FMQkFBWUN3Z0xDQUFzQUFnQXBBQUlBR1FBREFCc0FJQUFHQURnQVBRQUdBRThBVVFBVUFHRUFlUUFHQUh3QWZBQUdBSWdBaUFBR0FJa0FqUUFFQUtZQXBnQUZBS3dBckFBUkFLMEF0UUFIQUxZQXVRQVNBTG9BMFFBVkFOTUE3d0FKQVBBQThBQUJBUEVBOWdBSkFRa0JEQUFDQVJVQkd3QVdBUndCTkFBSkFUY0JOd0FKQVRnQk93QVdBVHdCUVFBWEFVTUJSd0FaQVVnQlh3QVdBV0FCWlFBTkFXY0Jid0FUQVhRQmRRQUJBWGNCamdBWUFaQUJsUUFLQWF3QnJBQUtBYTRCc3dBS0FjWUJ5UUFJQWRrQjhRQUtBZlFCOUFBS0FmOENBd0FNQWh3Q0lRQU9BaUlDSWdBUEFpTUNLd0FRQWpFQ01RQUxBaklDTWdBREFqTUNNd0FHQUFFQ01RQUJBQUVBQWdBQ0FqMENQUUFCQWtjQ1J3QUJBQUFBQVFBQUFBb0NJQXVxQUFKRVJreFVBQTVzWVhSdUFEb0FCQUFBQUFELy93QVJBQUFBQ3dBV0FDRUFMQUEzQUVJQVRRQmhBR3dBZHdDQ0FJMEFtQUNqQUs0QXVRQTZBQWxCV2tVZ0FHSkRRVlFnQUl4RFVsUWdBTFpMUVZvZ0FPQk5UMHdnQVFwT1RFUWdBVFJTVDAwZ0FWNVVRVlFnQVloVVVrc2dBYklBQVAvL0FCRUFBUUFNQUJjQUlnQXRBRGdBUXdCT0FHSUFiUUI0QUlNQWpnQ1pBS1FBcndDNkFBRC8vd0FTQUFJQURRQVlBQ01BTGdBNUFFUUFUd0JZQUdNQWJnQjVBSVFBandDYUFLVUFzQUM3QUFELy93QVNBQU1BRGdBWkFDUUFMd0E2QUVVQVVBQlpBR1FBYndCNkFJVUFrQUNiQUtZQXNRQzhBQUQvL3dBU0FBUUFEd0FhQUNVQU1BQTdBRVlBVVFCYUFHVUFjQUI3QUlZQWtRQ2NBS2NBc2dDOUFBRC8vd0FTQUFVQUVBQWJBQ1lBTVFBOEFFY0FVZ0JiQUdZQWNRQjhBSWNBa2dDZEFLZ0Fzd0MrQUFELy93QVNBQVlBRVFBY0FDY0FNZ0E5QUVnQVV3QmNBR2NBY2dCOUFJZ0Frd0NlQUtrQXRBQy9BQUQvL3dBU0FBY0FFZ0FkQUNnQU13QStBRWtBVkFCZEFHZ0Fjd0IrQUlrQWxBQ2ZBS29BdFFEQUFBRC8vd0FTQUFnQUV3QWVBQ2tBTkFBL0FFb0FWUUJlQUdrQWRBQi9BSW9BbFFDZ0FLc0F0Z0RCQUFELy93QVNBQWtBRkFBZkFDb0FOUUJBQUVzQVZnQmZBR29BZFFDQUFJc0FsZ0NoQUt3QXR3RENBQUQvL3dBU0FBb0FGUUFnQUNzQU5nQkJBRXdBVndCZ0FHc0FkZ0NCQUl3QWx3Q2lBSzBBdUFEREFNUmhZV3gwQkpwaFlXeDBCS0poWVd4MEJLcGhZV3gwQkxKaFlXeDBCTHBoWVd4MEJNSmhZV3gwQk1waFlXeDBCTkpoWVd4MEJOcGhZV3gwQk9KaFlXeDBCT3BqTW5OakJQSmpNbk5qQlBoak1uTmpCUDVqTW5OakJRUmpNbk5qQlFwak1uTmpCUkJqTW5OakJSWmpNbk5qQlJ4ak1uTmpCU0pqTW5OakJTaGpNbk5qQlM1allYTmxCVFJqWVhObEJUcGpZWE5sQlVCallYTmxCVVpqWVhObEJVeGpZWE5sQlZKallYTmxCVmhqWVhObEJWNWpZWE5sQldSallYTmxCV3BqWVhObEJYQmpZMjF3QlhaalkyMXdCWDVqWTIxd0JZWmpZMjF3Qlk1alkyMXdCWlpqWTIxd0JaNWpZMjF3QmFaalkyMXdCYTVqWTIxd0JiWmpZMjF3QmI1alkyMXdCY1prYm05dEJjNWtibTl0QmRSa2JtOXRCZHBrYm05dEJlQmtibTl0QmVaa2JtOXRCZXhrYm05dEJmSmtibTl0QmZoa2JtOXRCZjVrYm05dEJnUmtibTl0QmdwbWNtRmpCaEJtY21GakJocG1jbUZqQmlSbWNtRmpCaTVtY21GakJqaG1jbUZqQmtKbWNtRmpCa3htY21GakJsWm1jbUZqQm1CbWNtRmpCbXBtY21GakJuUnNhV2RoQm41c2FXZGhCb1JzYVdkaEJvcHNhV2RoQnBCc2FXZGhCcFpzYVdkaEJweHNhV2RoQnFKc2FXZGhCcWhzYVdkaEJxNXNhV2RoQnJSc2FXZGhCcnBzYm5WdEJzQnNiblZ0QnNac2JuVnRCc3hzYm5WdEJ0SnNiblZ0QnRoc2JuVnRCdDVzYm5WdEJ1UnNiblZ0QnVwc2JuVnRCdkJzYm5WdEJ2WnNiblZ0QnZ4c2IyTnNCd0pzYjJOc0J3aHNiMk5zQnc1c2IyTnNCeFJzYjJOc0J4cHNiMk5zQnlCc2IyTnNCeVpzYjJOc0J5eHNiMk5zQnpKdWRXMXlCemh1ZFcxeUJ6NXVkVzF5QjBSdWRXMXlCMHB1ZFcxeUIxQnVkVzF5QjFadWRXMXlCMXh1ZFcxeUIySnVkVzF5QjJodWRXMXlCMjV1ZFcxeUIzUnZiblZ0QjNwdmJuVnRCNEJ2Ym5WdEI0WnZiblZ0QjR4dmJuVnRCNUp2Ym5WdEI1aHZiblZ0QjU1dmJuVnRCNlJ2Ym5WdEI2cHZiblZ0QjdCdmJuVnRCN1p2Y21SdUI3eHZjbVJ1QjhKdmNtUnVCOGh2Y21SdUI4NXZjbVJ1QjlSdmNtUnVCOXB2Y21SdUIrQnZjbVJ1QitadmNtUnVCK3h2Y21SdUIvSnZjbVJ1Qi9od2JuVnRCLzV3Ym5WdENBUndiblZ0Q0Fwd2JuVnRDQkJ3Ym5WdENCWndiblZ0Q0J4d2JuVnRDQ0p3Ym5WdENDaHdiblZ0Q0M1d2JuVnRDRFJ3Ym5WdENEcHphVzVtQ0VCemFXNW1DRVp6YVc1bUNFeHphVzVtQ0ZKemFXNW1DRmh6YVc1bUNGNXphVzVtQ0dSemFXNW1DR3B6YVc1bUNIQnphVzVtQ0haemFXNW1DSHh6YldOd0NJSnpiV053Q0loemJXTndDSTV6YldOd0NKUnpiV053Q0pwemJXTndDS0J6YldOd0NLWnpiV053Q0t4emJXTndDTEp6YldOd0NMaHpiV053Q0w1emRXSnpDTVJ6ZFdKekNNcHpkV0p6Q05CemRXSnpDTlp6ZFdKekNOeHpkV0p6Q09KemRXSnpDT2h6ZFdKekNPNXpkV0p6Q1BSemRXSnpDUHB6ZFdKekNRQnpkWEJ6Q1FaemRYQnpDUXh6ZFhCekNSSnpkWEJ6Q1JoemRYQnpDUjV6ZFhCekNTUnpkWEJ6Q1NwemRYQnpDVEJ6ZFhCekNUWnpkWEJ6Q1R4emRYQnpDVUowYm5WdENVaDBiblZ0Q1U1MGJuVnRDVlIwYm5WdENWcDBiblZ0Q1dCMGJuVnRDV1owYm5WdENXeDBiblZ0Q1hKMGJuVnRDWGgwYm5WdENYNTBiblZ0Q1lRQUFBQUNBQUFBQVFBQUFBSUFBQUFCQUFBQUFnQUFBQUVBQUFBQ0FBQUFBUUFBQUFJQUFBQUJBQUFBQWdBQUFBRUFBQUFDQUFBQUFRQUFBQUlBQUFBQkFBQUFBZ0FBQUFFQUFBQUNBQUFBQVFBQUFBSUFBQUFCQUFBQUFRQWFBQUFBQVFBYUFBQUFBUUFhQUFBQUFRQWFBQUFBQVFBYUFBQUFBUUFhQUFBQUFRQWFBQUFBQVFBYUFBQUFBUUFhQUFBQUFRQWFBQUFBQVFBYUFBQUFBUUFjQUFBQUFRQWNBQUFBQVFBY0FBQUFBUUFjQUFBQUFRQWNBQUFBQVFBY0FBQUFBUUFjQUFBQUFRQWNBQUFBQVFBY0FBQUFBUUFjQUFBQUFRQWNBQUFBQWdBQ0FBTUFBQUFDQUFJQUF3QUFBQUlBQWdBREFBQUFBZ0FDQUFNQUFBQUNBQUlBQXdBQUFBSUFBZ0FEQUFBQUFnQUNBQU1BQUFBQ0FBSUFBd0FBQUFJQUFnQURBQUFBQWdBQ0FBTUFBQUFDQUFJQUF3QUFBQUVBRVFBQUFBRUFFUUFBQUFFQUVRQUFBQUVBRVFBQUFBRUFFUUFBQUFFQUVRQUFBQUVBRVFBQUFBRUFFUUFBQUFFQUVRQUFBQUVBRVFBQUFBRUFFUUFBQUFNQUVnQVRBQlFBQUFBREFCSUFFd0FVQUFBQUF3QVNBQk1BRkFBQUFBTUFFZ0FUQUJRQUFBQURBQklBRXdBVUFBQUFBd0FTQUJNQUZBQUFBQU1BRWdBVEFCUUFBQUFEQUJJQUV3QVVBQUFBQXdBU0FCTUFGQUFBQUFNQUVnQVRBQlFBQUFBREFCSUFFd0FVQUFBQUFRQWRBQUFBQVFBZEFBQUFBUUFkQUFBQUFRQWRBQUFBQVFBZEFBQUFBUUFkQUFBQUFRQWRBQUFBQVFBZEFBQUFBUUFkQUFBQUFRQWRBQUFBQVFBZEFBQUFBUUFXQUFBQUFRQVdBQUFBQVFBV0FBQUFBUUFXQUFBQUFRQVdBQUFBQVFBV0FBQUFBUUFXQUFBQUFRQVdBQUFBQVFBV0FBQUFBUUFXQUFBQUFRQVdBQUFBQVFBTEFBQUFBUUFFQUFBQUFRQUtBQUFBQVFBSEFBQUFBUUFHQUFBQUFRQU1BQUFBQVFBRkFBQUFBUUFJQUFBQUFRQUpBQUFBQVFBUUFBQUFBUUFRQUFBQUFRQVFBQUFBQVFBUUFBQUFBUUFRQUFBQUFRQVFBQUFBQVFBUUFBQUFBUUFRQUFBQUFRQVFBQUFBQVFBUUFBQUFBUUFRQUFBQUFRQVpBQUFBQVFBWkFBQUFBUUFaQUFBQUFRQVpBQUFBQVFBWkFBQUFBUUFaQUFBQUFRQVpBQUFBQVFBWkFBQUFBUUFaQUFBQUFRQVpBQUFBQVFBWkFBQUFBUUFWQUFBQUFRQVZBQUFBQVFBVkFBQUFBUUFWQUFBQUFRQVZBQUFBQVFBVkFBQUFBUUFWQUFBQUFRQVZBQUFBQVFBVkFBQUFBUUFWQUFBQUFRQVZBQUFBQVFBWEFBQUFBUUFYQUFBQUFRQVhBQUFBQVFBWEFBQUFBUUFYQUFBQUFRQVhBQUFBQVFBWEFBQUFBUUFYQUFBQUFRQVhBQUFBQVFBWEFBQUFBUUFYQUFBQUFRQU9BQUFBQVFBT0FBQUFBUUFPQUFBQUFRQU9BQUFBQVFBT0FBQUFBUUFPQUFBQUFRQU9BQUFBQVFBT0FBQUFBUUFPQUFBQUFRQU9BQUFBQVFBT0FBQUFBUUFiQUFBQUFRQWJBQUFBQVFBYkFBQUFBUUFiQUFBQUFRQWJBQUFBQVFBYkFBQUFBUUFiQUFBQUFRQWJBQUFBQVFBYkFBQUFBUUFiQUFBQUFRQWJBQUFBQVFBTkFBQUFBUUFOQUFBQUFRQU5BQUFBQVFBTkFBQUFBUUFOQUFBQUFRQU5BQUFBQVFBTkFBQUFBUUFOQUFBQUFRQU5BQUFBQVFBTkFBQUFBUUFOQUFBQUFRQVBBQUFBQVFBUEFBQUFBUUFQQUFBQUFRQVBBQUFBQVFBUEFBQUFBUUFQQUFBQUFRQVBBQUFBQVFBUEFBQUFBUUFQQUFBQUFRQVBBQUFBQVFBUEFBQUFBUUFZQUFBQUFRQVlBQUFBQVFBWUFBQUFBUUFZQUFBQUFRQVlBQUFBQVFBWUFBQUFBUUFZQUFBQUFRQVlBQUFBQVFBWUFBQUFBUUFZQUFBQUFRQVlBQ01BU0FCUUFGZ0FaZ0J3QUhvQWdnQ0tBSklBbWdDaUFLb0FzZ0MrQU1ZQXpnRFdBTjRBNWdEdUFQWUJBQUVLQVJJQkdnRWlBU29CTWdFNkFVSUJTZ0ZTQVZvQllnRnFBQUVBQUFBQkJ1QUFBd0FBQUFFSjJnQUdBQUFBQkFFYUFTd0JRQUZTQUFZQUFBQUNBVllCYUFBR0FBQUFBZ0Z3QVlRQUFRQUFBQUVCamdBQkFBQUFBUUdVQUFFQUFBQUJBWm9BQVFBQUFBRUJtQUFCQUFBQUFRR1dBQUVBQUFBQkFaUUFBUUFBQUFFQmtnQUdBQUFBQXdHUUFhSUJzQUFCQUFBQUFRRzJBQUVBQUFBQkFiUUFBUUFBQUFFQnNnQUJBQUFBQVFIRUFBRUFBQUFCQWNJQUFRQUFBQUVCd0FBQkFBQUFBUUcrQUFZQUFBQUNBYndCemdBR0FBQUFBZ0hXQWVnQUFRQUFBQUVCOEFBQkFBQUFBUUlHQUFFQUFBQUJBZ1FBQVFBQUFBRUNBZ0FCQUFBQUFRSXNBQUVBQUFBQkErZ0FBUUFBQUFFRnBnQUVBQWdBQVFYTUFBRUFBQUFCQzN3QUFRQUFBQUVMb2dBQkFBQUFBUXVnQUFFQUFBQUJDNlFBQVFBQUFBRUxvZ0FEQUFBQUFRdW9BQUVMc0FBQkFBQUFIZ0FEQUFBQUFRdVdBQUlMcmd1ZUFBRUFBQUFlQUFNQUFRdW1BQUVMcGdBQUFBRUFBQUFlQUFNQUFRdWtBQUVMbEFBQUFBRUFBQUFlQUFNQUFBQUJDNElBQVF1aUFBRUFBQUFlQUFNQUFRdVFBQUVMY0FBQUFBRUFBQUFlQUFNQUFRdUlBQUVMamdBQkM0Z0FBUUFBQUI4QUF3QUJDNEFBQVF0NkFBRUxnQUFCQUFBQUlBQUNDM0lBQkFDR0FJMEJRUUZIQUFJTFpBQUVBSVlBalFGQkFVY0FBUXRpQUFjQUFRdGNBQWNBQVF0V0FBY0FBUXRRQUFjQUFRdEtBQWNBQXdBQkMwb0FBUXRRQUFBQUFRQUFBQ0FBQXdBQUFBRUxSQUFCQzBvQUFBQURBQUVMVWdBQkN6WUFBQUFCQUFBQUlBQUJDMFlBS0FBQkMwQUFLQUFDQ3pvQUNnSi9BbndDZlFKK0FvQUNnUUtDQW9NQ2hBS0ZBQUVMSUFBOEFBRUxHZ0F5QUFFTEh2L2hBQUVMRGdBOEFBTUFBUXNZQUFFTEhnQUFBQUVBQUFBaEFBTUFBUXNXQUFFTERBQUFBQUVBQUFBaEFBTUFBUXJrQUFFTERnQUFBQUVBQUFBaUFBTUFBUXJTQUFFTEJBQUFBQUVBQUFBaUFBSUsrZ0FNQWpZQ053STRBamtDT2dJN0Fqd0NQUUkrQWo4Q3pBTE9BQUVLN1Avc0FBRUs4QUFVQUFJSzlBQVdBa0FDUVFKQ0FrTUNSQUpGQWtZQ1J3SklBa2tDVkFKVkFsWUNWd0pZQWxrQ1dnSmJBbHdDWFFMVEF0UUFBZ3JlQU44QmR3RjRBWGtCZWdGN0FYd0JmUUYrQVg4QmdBR0JBWUlCZ3dHRUFZVUJoZ0dIQVlnQmlRR0tBWXNCakFHTkFZNEJqd0dRQVpFQmtnR1RBWlFCbFFHV0FaY0JtQUdaQVpvQm13R2NBWjBCbmdHZkFhQUJvUUdpQWFNQnBBR2xBYVlCcHdHb0Fha0JxZ0dyQWEwQnJnR3ZBYkFCc1FHeUFiTUJ0QUcxQWJZQnR3SENBYmtCdWdHN0Fid0J2UUcrQWI4QndBSEJBY01CeEFIRkFjWUJ5QUhKQWNvQnl3SE1BYzBCemdIUEFkQUIwUUhTQWRNQjFBSFZBZFlCMXdIWUFka0IyZ0hiQWR3QjNRSGVBZDhCNEFIaEFlSUI0d0hrQWVVQjVnSG5BZWdCNlFIcUFlc0I3QUh0QWU0Qjd3SHdBZkVCOGdIekFmUUI5UUgyQWZjQitBSDVBZm9CK3dIOEFmMEIvZ0YyQWF3Qi93SUFBZ0VDQWdJREFnUUNCUUlHQWdjQ0NBSUpBZ29DQ3dJTUFnMENEZ0lQQWhBQ0VRSVNBaE1DRkFJVkFoWUNGd0lZQWhrQ0dnSWJBaHdDSFFJZUFoOENJQUloQWlJQ0l3SWtBaVVDSmdJbkFpZ0NLUUlxQWlzQ0xBSXRBaTRDTHdLT0FvOENrQUtSQXBJQ2t3S1VBcFVDbGdLWEFzVUN4Z0xIQXNnQ3lRTERBc1FDL1FMK0F2OEMvQU16QXpRRE5RTTJBemNET0FNNUF6b0RPd004QXowRFBnTS9BMEFEUVFOQ0EwTURSQUFDQ1ZvQTRBRjNBWGdCZVFGNkFYc0JmQUY5QVg0QmZ3R0FBWUVCZ2dHREFZUUJoUUdHQVljQmlBR0pBWW9CaXdHTUFZMEJqZ0dQQVpBQmtRR1NBWk1CbEFHVkFaWUJsd0dZQVprQm1nR2JBWndCblFHZUFaOEJvQUdoQWFJQm93R2tBYVVCcGdHbkFhZ0JxUUdxQWFzQnJBR3RBYTRCcndHd0FiRUJzZ0d6QWJRQnRRRzJBYmNCdUFHNUFib0J1d0c4QWIwQnZnRy9BY0FCd1FIQ0FjTUJ4QUhGQWNZQnh3SElBY2tCeWdITEFjd0J6UUhPQWM4QjBBSFJBZElCMHdIVUFkVUIxZ0hYQWRnQjJRSGFBZHNCM0FIZEFkNEIzd0hnQWVFQjRnSGpBZVFCNVFIbUFlY0I2QUhwQWVvQjZ3SHNBZTBCN2dIdkFmQUI4UUh5QWZNQjlBSDFBZllCOXdINEFma0IrZ0g3QWZ3Qi9RSCtBZjhDQUFJQkFnSUNBd0lFQWdVQ0JnSUhBZ2dDQ1FJS0Fnc0NEQUlOQWc0Q0R3SVFBaEVDRWdJVEFoUUNGUUlXQWhjQ0dBSVpBaG9DR3dJY0FoMENIZ0lmQWlBQ0lRSWlBaU1DSkFJbEFpWUNKd0lvQWlrQ0tnSXJBaXdDTFFJdUFpOENqZ0tQQXBBQ2tRS1NBcE1DbEFLVkFwWUNsd0xGQXNZQ3h3TElBc2tDd3dMRUF2MEMvZ0wvQXZ3RE13TTBBelVETmdNM0F6Z0RPUU02QXpzRFBBTTlBejREUHdOQUEwRURRZ05EQTBRQUFnZlVBQlFDcHdMN0F5QURJUU1pQXlNREpBTWxBeVlESndNb0F5a0RLZ01yQXl3RExRTXVBeThETUFNeEFBRUh3Z0FCQUFnQUFnQUdBQXdCZEFBQ0FQb0JkUUFDQVE4QUFnZXVBWDRCZUFGNUFYb0Jld0Y4QVgwQmZnRi9BWUFCZ1FHQ0FZTUJoQUdGQVlZQmh3R0lBWWtCaWdHTEFZd0JqUUdPQVk4QmtBR1JBWklCa3dHVUFaVUJsZ0dYQVpnQm1RR2FBWnNCbkFHZEFaNEJud0dnQWFFQm9nR2pBYVFCcFFHbUFhY0JxQUdwQWFvQnF3R3RBYTRCcndHd0FiRUJzZ0d6QWJRQnRRRzJBYmNCd2dHNUFib0J1d0c4QWIwQnZnRy9BY0FCd1FIREFjUUJ4UUhJQWNrQnlnSExBY3dCelFIT0FjOEIwQUhSQWRJQjB3SFVBZFVCMWdIWEFkZ0IyZ0hiQWR3QjNRSGVBZDhCNEFIaEFlSUI0d0hrQWVVQjVnSG5BZWdCNlFIcUFlc0I3QUh0QWU0Qjd3SHdBZkVCOGdIekFmUUI5UUgyQWZjQitBSDVBZm9CK3dIOUFmNEJkZ0dzQWY4Q0FBSUJBZ01DQkFJRkFnWUNCd0lJQWdrQ0NnSUxBZ3dDRFFJT0FnOENFQUlSQWhJQ0V3SVVBaFVDRmdJWEFoZ0NHUUlhQWhzQ0hBSWRBaDRDSHdJZ0FpRUNJZ0lqQWlRQ0pRSW1BaWNDS0FJcEFpb0NLd0lzQWkwQ0xnSXZBWGdCZVFGNkFYc0JmQUY5QVg0QmZ3R0FBWUVCZ2dHREFZUUJoUUdHQVljQmlBR0pBWW9CaXdHTUFZMEJqZ0dQQVpBQmtRR1NBWk1CbEFHVkFaWUJsd0dZQVprQm1nR2JBWndCblFHZUFaOEJvQUdoQWFJQm93R2tBYVVCcGdHbkFhZ0JxUUdxQWFzQnJBR3RBYTRCcndHd0FiRUJzZ0d6QWJRQnRRRzJBYmdCdVFHNkFic0J2QUc5QWI0QnZ3SEFBY0VCd2dIREFjUUJ4UUhIQWNnQnlRSEtBY3NCekFITkFjNEJ6d0hRQWRFQjBnSFRBZFFCMVFIV0FkY0IyQUhhQWRzQjNBSGRBZDRCM3dIZ0FlRUI0Z0hqQWVRQjVRSG1BZWNCNkFIcEFlb0I2d0hzQWUwQjdnSHZBZkFCOFFIeUFmTUI5QUgxQWZZQjl3SDRBZmtCK2dIN0FmMEIvZ0gvQWdBQ0FRSURBZ1FDQlFJR0FnY0NDQUlKQWdvQ0N3SU1BZzBDRGdJUEFoQUNFUUlTQWhNQ0ZBSVZBaFlDRndJWUFoa0NHZ0liQWh3Q0hRSWVBaDhDSUFJaEFpSUNJd0lrQWlVQ0pnSW5BaWdDS1FJcUFpc0NMQUl0QWk0Q0x3Sm9BbWtDYWdKckFtd0NiUUp1QW04Q2NBSnhBc1VDeGdMSEFzZ0NoZ0xKQXNNQ3hBTFVBczRDL2dML0F2c0MvQUFCQlM0QVNRQ1lBSjRBcEFDcUFMQUF0Z0M4QU1JQXlBRE9BTlFBMmdEcUFQb0JDZ0VhQVNvQk9nRktBVm9CYWdGNkFZQUJoZ0dNQVpJQm1BR2VBYVFCcWdHd0FiWUJ2QUhDQWNnQnpnSFVBZG9CNEFIbUFld0I4Z0gyQWZvQi9nSUNBZ1lDQ2dJT0FoSUNGZ0lhQWlBQ0pnSXNBakFDTmdJOEFrSUNTQUpPQWxRQ1dnSmdBbVlDYkFKeUFuZ0NmZ0tFQW9vQ2tBS1dBQUlDTUFGM0FBSUFVQUhHQUFJQ01RSFpBQUlBaGdIOEFBSUFqUUlDQUFJQ01BRjNBQUlCQVFHM0FBSUJDd0hHQUFJQ01RSFpBQUlCUVFIOEFBSUJSd0lDQUFjQ1hnSi9BbklDYUFKS0FrQUNqZ0FIQWw4Q2ZBSnpBbWtDU3dKQkFvOEFCd0pnQW4wQ2RBSnFBa3dDUWdLUUFBY0NZUUorQW5VQ2F3Sk5Ba01Da1FBSEFtSUNnQUoyQW13Q1RnSkVBcElBQndKakFvRUNkd0p0QWs4Q1JRS1RBQWNDWkFLQ0FuZ0NiZ0pRQWtZQ2xBQUhBbVVDZ3dKNUFtOENVUUpIQXBVQUJ3Sm1Bb1FDZWdKd0FsSUNTQUtXQUFjQ1p3S0ZBbnNDY1FKVEFra0Nsd0FDQWpZQ1ZBQUNBamNDVlFBQ0FqZ0NWZ0FDQWprQ1Z3QUNBam9DV0FBQ0Fqc0NXUUFDQWp3Q1dnQUNBajBDV3dBQ0FqNENYQUFDQWo4Q1hRQUNBallDVkFBQ0FqY0NWUUFDQWpnQ1ZnQUNBamtDVndBQ0Fqb0NXQUFDQWpzQ1dRQUNBandDV2dBQ0FqMENXd0FDQWo0Q1hBQUNBajhDWFFBQkFrQUFBUUpCQUFFQ1FnQUJBa01BQVFKRUFBRUNSUUFCQWtZQUFRSkhBQUVDU0FBQkFra0FBZ0tvQXFjQUFnTEpBcWNBQWdMVEF2MEFBUUxNQUFJRE13TWdBQUlETkFNaEFBSUROUU1pQUFJRE5nTWpBQUlETndNa0FBSURPQU1sQUFJRE9RTW1BQUlET2dNbkFBSURPd01vQUFJRFBBTXBBQUlEUFFNcUFBSURQZ01yQUFJRFB3TXNBQUlEUUFNdEFBSURRUU11QUFJRFFnTXZBQUlEUXdNd0FBSURSQU14QUFJREFnQVVBUHNCQ2dNZ0F5RURJZ01qQXlRREpRTW1BeWNES0FNcEF5b0RLd01zQXkwRExnTXZBekFETVFBQkFIb0FCd0FDQXVvQUF3QlFBUXNDcHdBQkFNci85Z0FDQXVJQUJBSXdBakVDTUFJeEFBRUFBZ0Q2QVFrQUFnQUNBd0FEQkFBQUF3WUREUUFGQUFFQUJBTU9BdzhERVFNU0FBSUFBZ01BQXdRQUFBTUdBeElBQlFBQ0FBSUFBZ0M1QUFBQ01nSXpBTGdBQWdBQkF5QURNUUFBQUFFQUFRRVBBQUVBQVFLaEFBRUFBUUJVQUFFQUJBQ0VBSXdCUHdGR0FBRUFBUUQ2QUFFQUFRRDhBQUVBQVFFSkFBRUFBUUJQQUFJQUF3TUFBd1FBQUFNR0F4SUFCUU1nQXpFQUVnQUJBQUVBUXdBQ0FBRUNOZ0kvQUFBQUFRQUJBcVVBQVFBQkFvWUFBZ0FCQW5JQ2V3QUFBQUlBQVFKb0FuRUFBQUFCQUFJQUFnQzZBQUVBQWdCaEFSd0FBZ0FDQWtBQ1NRQUFBdE1DMUFBS0FBSUFBUUpLQWwwQUFBQUNBQUVDTmdKSkFBQUFBZ0FFQWpZQ1B3QUFBa29DVXdBS0Fzd0N6QUFVQXM0Q3pnQVZBQUlBQ2dBQ0FMa0FBQUkyQWo4QXVBS2RBcUFBd2dLbkFxY0F4Z0twQXFvQXh3TE1Bc3dBeVFMckF1d0F5Z0x2QXU4QXpBTUFBd1FBelFNR0F4SUEwZ0FDQUFvQXVnRkJBQUFCUXdGekFJZ0NOZ0kvQUxrQ25RS2dBTU1DcUFLcUFNY0N6QUxNQU1vQzZ3THNBTXNDN3dMdkFNMERBQU1FQU00REJnTVNBTk1BQWdBRUFxZ0NxQUFBQXU0QzdnQUJBd0FEQkFBQ0F3WURFZ0FIQUFFQUFRRHdBQUlBRlFBREFFNEFBQUJRQUdBQVRBQmlBSU1BWFFDRkFJc0Fmd0NOQUxrQWhnQzdBUGtBc3dEN0FRZ0E4Z0VLQVJzQkFBRWRBVDRCRWdGQUFVRUJOQUZEQVVVQk5nRkhBWE1CT1FKeUFuc0JaZ0tkQXFBQmNBS2xBcVVCZEFLbkFxY0JkUUtwQXFvQmRnTE9BczRCZUFMVUF0UUJlUUxyQXV3QmVnTHVBdThCZkFBQ0FCSUFBZ0FDQUFBQVR3QlBBQUVBWVFCaEFBSUFoQUNFQUFNQWpBQ01BQVFBdWdDNkFBVUErZ0Q2QUFZQkNRRUpBQWNCSEFFY0FBZ0JQd0UvQUFrQlJnRkdBQW9DTmdKZEFBc0NvUUtoQURNQ3FBS29BRFFDekFMTUFEVUMwd0xUQURZREFBTUVBRGNEQmdNU0FEd0FBZ0FFQVBvQStnQUFBUWtCQ1FBQkF3QURCQUFDQXdZREVnQUhBQUVBQXdCUEFRa0NvUUFCQUFRQUFnQmhBTG9CSEFBRUFpNEJrQUFGQUFnQ2lnSllBQUFBU3dLS0FsZ0FBQUZlQURJQk9nQUFBQUFGQUFBQUFBQUFBQ0FBQUFjQUFBQUFBQUFBQUFBQUFBQlFiR0YxQU1BQUlQc0NBOTcvRUFESUJFSUJWQ0FBQVpNQUFBQUFBZ3dDdkFBQUFDQUFBd0FBQUFJQUFBQURBQUFBRkFBREFBRUFBQUFVQUFRRmVnQUFBSFFBUUFBRkFEUUFMd0E1QUg0Qk53RklBWDRCandHU0FhRUJzQUhjQWVjQ0d3SXpBamNDV1FMSEF0MERCQU1NQXhJREd3TWpBeWdEbEFPcEE3d0R3QjZGSHA0ZStTQUpJQlFnR2lBZUlDSWdKaUF3SURvZ1JDQndJSGtnckNFaUlTNGhYaUlDSWc4aUVpSWFJaDRpS3lKSUltQWlaU1hLK3dMLy93QUFBQ0FBTUFBNkFLQUJPUUZLQVk4QmtnR2dBYThCelFIbUFoZ0NNZ0kzQWxrQ3hnTFlBd0FEQmdNU0F4c0RJd01tQTVRRHFRTzhBOEFlZ0I2ZUhxQWdDU0FUSUJnZ0hDQWdJQ1lnTUNBNUlFUWdjQ0IwSUt3aElpRXVJVnNpQWlJUEloRWlHaUllSWlzaVNDSmdJbVFseXZzQi8vOEFBQUlHQUFBQUFBQUFBQUQrK1FFK0FBQUFBQUFBQUFBQUFBQUEvdFArbGdCU0FBQUFBQUFBLy92LzgvL3MvK3IrbnY2Sy9uaitkUUFBNGVrQUFPTEM0cUFBQUFBQUFBRGlkdUs4NG9iaVF1SVA0Z3ppSStIUzRjemhMK0RvNE5jQUFPRE80TWJndXVDWTRIb0FBTjBqQm5NQUFRQjBBQUFBa0FFWUFrWUNaQUFBQUFBQ3lBTEtBc3dDNmdMc0F2SUFBQUFBQUFBQzdnTDRBd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBdndBQUFNRUFBQUFBQU95QTdZRHVnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFPbUFBQUFBQUFBQUFBQUFBT2VBQUFBQUFBQUFBRUNuUUxCQXFRQ3pnTHJBdThDd2dLcEFxb0Nvd0xWQXBrQ3NRS1lBcVVDbWdLYkF0d0MyUUxiQXA4QzdnQUNBQm9BR3dBaEFDVUFOd0E0QUQ0QVFRQlBBRklBVkFCYUFGc0FZUUI2QUh3QWZRQ0JBSWtBamdDbUFLY0FyQUN0QUxZQ3JRS21BcTRDNHdLMUF4VUF1Z0RTQU5NQTJRRGRBUEFBOFFEM0FQb0JDUUVOQVE4QkZRRVdBUndCTlFFM0FUZ0JQQUZEQVVnQllBRmhBV1lCWndGd0Fxc0M5Z0tzQXVFQ3lnS2VBc3dDMFFMTkF0SUM5d0x4QXhNQzhnSXdBcjBDNGdLeUF2TURIUUwxQXQ4Q2ZRSitBeFlDNlFMd0FxRURIZ0o4QWpFQ3ZnS0lBb2NDaVFLZ0FCTUFBd0FMQUJnQUVRQVhBQmtBSGdBeUFDWUFLUUF2QUVvQVF3QkdBRWNBSWdCZ0FHMEFZZ0JsQUhnQWF3TFhBSGNBbVFDUEFKSUFrd0N1QUhzQlFnRExBTHNBd3dEUUFNa0F6d0RSQU5ZQTZnRGVBT0VBNXdFREFQd0Evd0VBQU5vQkd3RW9BUjBCSUFFekFTWUMyQUV5QVZNQlNRRk1BVTBCYUFFMkFXb0FGUUROQUFRQXZBQVdBTTRBSEFEVUFCOEExd0FnQU5nQUhRRFZBQ01BMndBa0FOd0FOQURzQUNjQTN3QXdBT2dBTlFEdEFDZ0E0QUE3QVBRQU9RRHlBRDBBOWdBOEFQVUFRQUQ1QUQ4QStBQk9BUWdBVEFFR0FFUUEvUUJOQVFjQVNBRDdBRUlCQlFCUkFRd0FVd0VPQUZVQkVBQlhBUklBVmdFUkFGZ0JFd0JaQVJRQVhBRVhBRjRCR1FCZEFSZ0FYd0VhQUhZQk1RQmpBUjRBZFFFd0FIa0JOQUIrQVRrQWdBRTdBSDhCT2dDQ0FUMEFoUUZBQUlRQlB3Q0RBVDRBakFGR0FJc0JSUUNLQVVRQXBRRmZBS0lCWEFDUUFVb0FwQUZlQUtFQld3Q2pBVjBBcVFGakFLOEJhUUN3QUxjQmNRQzVBWE1BdUFGeUFHOEJLZ0NiQVZVQUNnRENBRVVBL2dCa0FSOEFrUUZMQUpjQlVRQ1VBVTRBbFFGUEFKWUJVQUE2QVBNQWhnRkJBSTBCUndDMEFXNERHZ01VQXhzREh3TWNBeGNEQWdNREF3WURDZ01MQXdnREFRTUFBd3dEQ1FNRUF3Y0Fxd0ZsQUtnQllnQ3FBV1FBRWdES0FCUUF6QUFNQU1RQURnREdBQThBeHdBUUFNZ0FEUURGQUFVQXZRQUhBTDhBQ0FEQUFBa0F3UUFHQUw0QU1RRHBBRE1BNndBMkFPNEFLZ0RpQUN3QTVBQXRBT1VBTGdEbUFDc0E0d0JMQVFRQVNRRUNBR3dCSndCdUFTa0FaZ0VoQUdnQkl3QnBBU1FBYWdFbEFHY0JJZ0J3QVNzQWNnRXRBSE1CTGdCMEFTOEFjUUVzQUpnQlVnQ2FBVlFBbkFGV0FKNEJXQUNmQVZrQW9BRmFBSjBCVndDeUFXd0FzUUZyQUxNQmJRQzFBVzhDdXdLOEFyY0N1UUs2QXJnQytBTDVBcUlDNXdMV0F0NEMzUUFBQUFJQVd3QUFBZXNDdkFBREFBY0FIMEFjQUFJQ0FGOEFBQUJJVFFBREF3RmZBQUVCU1FGT0VSRVJFQVFLR2lzVElSRWhBU0VSSVZzQmtQNXdBVlArNmdFV0FyejlSQUtCL2JzQUFBQUNBQm9BQUFLU0Fyd0FCd0FLQUI5QUhBQUVBQUVBQkFGb0FBTURTRTBDQVFBQVNRQk9FaEVSRVJBRkNoc3JJU01uSVFjakFUTUhBeUVDa21jOC9zbzhZd0VGYXphQUFRQ25wd0s4WWY2YS8vOEFHZ0FBQXBJRGVBQWlBQUlBQUFBREF5TUNHQUFBLy84QUdnQUFBcElEZUFBaUFBSUFBQUFEQXljQjh3QUEvLzhBR2dBQUFwSUQxd0FpQUFJQUFBRUhBMG9COGdDWUFBaXhBZ0t3bUxBMUt3QUEvLzhBR3Y5TkFwSURlQUFpQUFJQUFBQWpBeTRCNHdBQUFBTURKd0h6QUFELy93QWFBQUFDa2dQWEFDSUFBZ0FBQVFjRFN3SHpBSmdBQ0xFQ0FyQ1lzRFVyQUFELy93QWFBQUFDa2dQMUFDSUFBZ0FBQVFjRFRBSHpBSmdBQ0xFQ0FyQ1lzRFVyQUFELy93QWFBQUFDa2dQaEFDSUFBZ0FBQVFjRFRRSHpBSmdBQ0xFQ0FyQ1lzRFVyQUFELy93QWFBQUFDa2dONEFDSUFBZ0FBQUFNREpnSHdBQUQvL3dBYUFBQUNrZ04rQUNJQUFnQUFBQU1ESlFIMkFBRC8vd0FhQUFBQ2tnUEtBQ0lBQWdBQUFRY0RUZ0gyQUtBQUNMRUNBckNnc0RVckFBRC8vd0FhLzAwQ2tnTitBQ0lBQWdBQUFDTURMZ0hqQUFBQUF3TWxBZllBQVAvL0FCb0FBQUtTQThvQUlnQUNBQUFCQndOUEFmWUFvQUFJc1FJQ3NLQ3dOU3NBQVAvL0FCb0FBQUtTQTlnQUlnQUNBQUFCQndOUUFmWUFvQUFJc1FJQ3NLQ3dOU3NBQVAvL0FCb0FBQUtTQStrQUlnQUNBQUFCQndOUkFmWUFvQUFJc1FJQ3NLQ3dOU3NBQUFBRUFCb0FBQUtTQTFJQUN3QVhBQjhBSWdBL1FEd0NBUUFLQXdrREFRY0FBV2tBQ0FBRkJBZ0ZhQUFIQjBoTkJnRUVCRWtFVGd3TUFBQWlJUjhlSFJ3Ykdoa1lEQmNNRmhJUUFBc0FDaVFMQ2hjckVpWTFORFl6TWhZVkZBWWpNaVkxTkRZek1oWVZGQVlqRXlNbklRY2pBVE1IQXlIaEhCd1hHQndjR0tJZEhCZ1hHeHNYNFdjOC9zbzhZd0VGYXphQUFRQUM2aG9aR2hzYkdoa2FHaGthR3hzYUdScjlGcWVuQXJ4aC9wb0EvLzhBR3Y5TkFwSUN2QUFpQUFJQUFBQURBeTRCNHdBQS8vOEFHZ0FBQXBJRGVRQWlBQUlBQUFFSEF5SUJ2d0FCQUFpeEFnR3dBYkExS3dBQS8vOEFHZ0FBQXBJRGxRQWlBQUlBQUFBREF5c0NaZ0FBLy84QUdnQUFBcElEVlFBaUFBSUFBQUFEQXlvQjlnQUFBQUlBR3Y4dUFwSUN2QUFXQUJrQU5VQXlEQUVEQWdNQkFBTUNUQUFHQUFJREJnSm9BQVFFU0UwRkFRTURTVTBBQUFBQllRQUJBVlVCVGhRUkVSRVdJeUFIQ2gwckJETXlOd2NHSXlJbU5UUTJOeWNoQnlNQk13RWpCaFVEQXlFQ0dTUU5EQVVRSVNndE1pbzQvc284WXdFRmF3RUlRemJGZ0FFQW1RSXlDU29pSTB3aW5LY0N2UDFFUGpJQ3kvNmEvLzhBR2dBQUFwSURuUUFpQUFJQUFBQURBeWdCOWdBQS8vOEFHZ0FBQXBJRGZRQWlBQUlBQUFBREF5a0I5UUFBQUFJQUdnQUFBMFFDdkFBUEFCSUFRa0EvRUFFQkFBRk1BQUVBQWdnQkFtY0FDQUFGQXdnRlp3QUFBQWRmQ1FFSEIwaE5BQU1EQkY4R0FRUUVTUVJPQUFBU0VRQVBBQThSRVJFUkVSRVJDZ29kS3dFVklSVWhGU0VWSVJVaE5TTUhJd0VYQXpNRFJQN0NBUmorNkFFKy9tWGtSV1lCWXl5OXZRSzhVOTFUNWxPTmpRSzhZUDZBQUFBREFGc0FBQUpLQXJ3QURnQVdBQjRBUEVBNURnRUZBZ0ZNQUFJQUJRUUNCV2NHQVFNREFWOEFBUUZJVFFjQkJBUUFYd0FBQUVrQVRoZ1hEdzhkR3hjZUdCNFBGZzhWSnlFa0NBb1pLd0FXRlJRR0l5TVJNeklXRlJRR0J5Y1ZNekkyTlRRakV6STJOVFFqSXhVQjkxT0djUG5mY0hRNEwvNTJRMDZVSGxCT21wVUJaRnRIWUdJQ3ZGbFJORlVYKytWQU9HMzk0ajgzZWU4QUFBQUJBRGIvOHdKeUFza0FHd0EwUURFQ0FRQUREd01DQVFBUUFRSUJBMHdBQUFBRFlRUUJBd05RVFFBQkFRSmhBQUlDVVFKT0FBQUFHd0FhSlNVa0JRb1pLd0FXRndjbUl5SUdCaFVVRmpNeU5qY1hCZ1lqSWlZbU5UUTJOak1CeG5Rb0xreG5RV28vZ21nNlhDb3hMWDFMWHBOV1Y1WmZBc2toSGtneVBYNWVpb2toSWtRb0xGQ2plSGVrVUFBQUFQLy9BRGIvOHdKeUEzZ0FJZ0FiQUFBQUF3TWpBajBBQVAvL0FEYi84d0p5QTNnQUlnQWJBQUFBQXdNbUFoVUFBQUFCQURiL0xnSnlBc2tBTlFCWlFGWWhBUVFETGlJQ0JRUXZGZ0lHQlRNVkFnSUhGQWtDQVFJSUFRQUJCa3dJQVFjQUFnRUhBbWtBQkFRRFlRQURBMUJOQUFVRkJtRUFCZ1pSVFFBQkFRQmhBQUFBVlFCT0FBQUFOUUEwRlNVa0tpUWxKQWtLSFNzRUZoVVVCaU1pSmljM0ZoWXpNalkxTkNZaklnY25OeTRDTlRRMk5qTXlGaGNISmlNaUJnWVZGQll6TWpZM0Z3WUdCd2MyTXdHbE1ENHhGU3NNREFraUVCY2NHUkVXRGhrbVU0RkpWNVpmUkhRb0xreG5RV28vZ21nNlhDb3hMSGxJSWdnV095WWVKeXdNQ0M4SUN4RVFEaEVHSFVBSVZaMXZkNlJRSVI1SU1qMStYb3FKSVNKRUp5d0JNZ1QvL3dBMi8vTUNjZ04rQUNJQUd3QUFBQU1ESlFJYkFBRC8vd0EyLy9NQ2NnTitBQ0lBR3dBQUFRY0RJUUg1QUFFQUNMRUJBYkFCc0RVckFBQUFBZ0JiQUFBQ2dBSzhBQW9BRWdBdFFDb0ZBUU1EQUY4RUFRQUFTRTBBQWdJQlh3QUJBVWtCVGdzTEFRQUxFZ3NSRGd3SkJ3QUtBUW9HQ2hZckFUSVdGaFVVQmdZakl4RVhFVE1nRVRRbUl3RW5ZNXRiVzV4aXpGNW1BUDkvZ0FLOFNadDFkS0JQQXJ4VS9lNEJEWWQrQUFJQUZnQUFBb0FDdkFBT0FCb0FQMEE4QmdFREJ3RUNCQU1DWndBRkJRQmZDQUVBQUVoTkNRRUVCQUZmQUFFQlNRRk9FQThCQUJrWUZ4WVZFdzhhRUJvTkRBc0tDUWNBRGdFT0Nnb1dLd0V5RmhZVkZBWUdJeU1SSXpVekVSTWdFVFFtSXlNVk14VWpGUUVuWTV0Ylc1eGl6RVZGeEFEL2Y0Qm1sWlVDdkVtYmRYU2dUd0ZEUndFeS9ab0JEWWQrM2tmdEFQLy9BRnNBQUFLQUEzZ0FJZ0FoQUFBQUF3TW1BZGtBQVAvL0FCWUFBQUtBQXJ3QUFnQWlBQUFBQVFCYkFBQUNHUUs4QUFzQUtVQW1BQUlBQXdRQ0EyY0FBUUVBWHdBQUFFaE5BQVFFQlY4QUJRVkpCVTRSRVJFUkVSQUdDaHdyRXlFVklSVWhGU0VWSVJVaFd3RysvcDhCTi83SkFXSCtRZ0s4VWQxUzZGUUEvLzhBV3dBQUFoa0RlQUFpQUNVQUFBQURBeU1DQUFBQS8vOEFXd0FBQWhrRGVBQWlBQ1VBQUFBREF5Y0Iyd0FBLy84QVd3QUFBaGtEZUFBaUFDVUFBQUFEQXlZQjJBQUEvLzhBV3dBQUFoa0RmZ0FpQUNVQUFBQURBeVVCM2dBQS8vOEFXd0FBQWlJRHlnQWlBQ1VBQUFFSEEwNEIzUUNnQUFpeEFRS3dvTEExS3dBQS8vOEFXLzlOQWhrRGZnQWlBQ1VBQUFBakF5NEIwUUFBQUFNREpRSGVBQUQvL3dCYkFBQUNHUVBLQUNJQUpRQUFBUWNEVHdIZUFLQUFDTEVCQXJDZ3NEVXJBQUQvL3dCYkFBQUNHUVBZQUNJQUpRQUFBUWNEVUFIZEFLQUFDTEVCQXJDZ3NEVXJBQUQvL3dCYkFBQUNHUVBwQUNJQUpRQUFBUWNEVVFIZUFLQUFDTEVCQXJDZ3NEVXJBQUFBQXdCYkFBQUNHUU5TQUFzQUZ3QWpBRXBBUndJQkFBc0RDZ01CQkFBQmFRQUdBQWNJQmdkbkFBVUZCRjhBQkFSSVRRQUlDQWxmQUFrSlNRbE9EQXdBQUNNaUlTQWZIaDBjR3hvWkdBd1hEQllTRUFBTEFBb2tEQW9YS3hJbU5UUTJNeklXRlJRR0l6SW1OVFEyTXpJV0ZSUUdJd1VoRlNFVklSVWhGU0VWSWNrY0hCY1lIQndZb2gwY0dCY2JHeGYrd2dHKy9wOEJOLzdKQVdIK1FnTHFHaGthR3hzYUdSb2FHUm9iR3hvWkdpNVIzVkxvVkFBQS8vOEFXd0FBQWhrRGZnQWlBQ1VBQUFFSEF5RUJ2QUFCQUFpeEFRR3dBYkExS3dBQS8vOEFXLzlOQWhrQ3ZBQWlBQ1VBQUFBREF5NEIwUUFBLy84QVd3QUFBaGtEZVFBaUFDVUFBQUVIQXlJQnB3QUJBQWl4QVFHd0FiQTFLd0FBLy84QVd3QUFBaGtEbFFBaUFDVUFBQUFEQXlzQ1RnQUEvLzhBV3dBQUFoa0RWUUFpQUNVQUFBQURBeW9CM2dBQUFBRUFXLzh1QWg4Q3ZBQWJBRVpBUXdFQkJ3RUJUQllCQVFGTEFBUUFCUVlFQldjQUF3TUNYd0FDQWtoTkFBWUdBVjhBQVFGSlRRZ0JCd2NBWVFBQUFGVUFUZ0FBQUJzQUdoRVJFUkVSRlNNSkNoMHJCRGNIQmlNaUpqVTBOamNoRVNFVklSVWhGU0VWSVJVakJoVVVNd0lUREFVUUlTZ3RLeVQrZUFHKy9wOEJOLzdKQVdFQk5pU1pBaklKS2lJZ1JpQUN2RkhkVXVoVVBqSXAvLzhBV3dBQUFoa0RmUUFpQUNVQUFBQURBeWtCM0FBQUFBRUFXd0FBQWZVQ3ZBQUpBQ05BSUFBREFBUUFBd1JuQUFJQ0FWOEFBUUZJVFFBQUFFa0FUaEVSRVJFUUJRb2JLek1qRVNFVklSVWhGU0c0WFFHYS9zTUJGZjdyQXJ4UjlGRUFBQUFCQURiLzh3S0hBc2tBSGdBK1FEc0JBUUFGQWdFREFCTU9BZ0VDQTB3QUF3QUNBUU1DWndBQUFBVmhCZ0VGQlZCTkFBRUJCR0VBQkFSUkJFNEFBQUFlQUIwakVSTWxJd2NLR3lzQUZ3Y21JeUlHRlJRV0ZqTXlOamMxSXpVaEVRWUdJeUltSmpVME5qWXpBaFJqTWxSdWJIODZhVVE3V2hqUEFTb3JpMVpabEZoV2wySUN5VlJEUW8yR1duNUFLUjJwVHY3ZU5EMU9vbmwycEZNQUFBRC8vd0EyLy9NQ2h3TjRBQ0lBT0FBQUFBTURKd0lrQUFELy93QTIvL01DaHdONEFDSUFPQUFBQUFNREpnSWdBQUQvL3dBMi8vTUNod04rQUNJQU9BQUFBQU1ESlFJbkFBRC8vd0EyL3pJQ2h3TEpBQ0lBT0FBQUFBTURMd0lJQUFELy93QTIvL01DaHdOK0FDSUFPQUFBQVFjRElRSUZBQUVBQ0xFQkFiQUJzRFVyQUFBQUFRQmJBQUFDaVFLOEFBc0FKMEFrQmdFRkFBSUJCUUpuQkFFQUFFaE5Bd0VCQVVrQlRnQUFBQXNBQ3hFUkVSRVJCd29iS3dFUk14RWpFU0VSSXhFekVRSXRYRnoraTExZEFZb0JNdjFFQVRuK3h3SzgvczRBQUFJQUlBQUFBc0lDdkFBVEFCY0FOa0F6Q0FZQ0FBc0ZBZ0VLQUFGbkFBb0FBd0lLQTJjSkFRY0hTRTBFQVFJQ1NRSk9GeFlWRkJNU0VSRVJFUkVSRVJFUURBb2ZLd0V6RlNNUkl4RWhFU01SSXpVek5UTVZJVFV6QVNFMUlRS0pPVGxjL290ZE96dGRBWFZjL2k4QmRmNkxBazVCL2ZNQk9mN0hBZzFCYm01dS9zNkQvLzhBV3dBQUFva0RmZ0FpQUQ0QUFBQURBeVVDRWdBQUFBRUFXd0FBQUxnQ3ZBQURBQk5BRUFBQUFFaE5BQUVCU1FGT0VSQUNDaGdyRXpNUkkxdGRYUUs4L1VULy93QmIvL01DYmdLOEFDSUFRUUFBQUFNQVR3RVNBQUQvL3dCUUFBQUJDd040QUNJQVFRQUFBQU1ESXdGTkFBRC8vLy80QUFBQkdnTjRBQ0lBUVFBQUFBTURKd0VvQUFELy8vLzlBQUFCRUFONEFDSUFRUUFBQUFNREpnRWxBQUQvLy8vL0FBQUJFZ04rQUNJQVFRQUFBQU1ESlFFckFBQUFBLy82QUFBQkdBTlNBQXNBRndBYkFEQkFMUUlCQUFjREJnTUJCQUFCYVFBRUJFaE5BQVVGU1FWT0RBd0FBQnNhR1JnTUZ3d1dFaEFBQ3dBS0pBZ0tGeXNTSmpVME5qTXlGaFVVQmlNeUpqVTBOak15RmhVVUJpTUhNeEVqRmh3Y0Z4Z2NIQmlpSFJ3WUZ4c2JGNHRkWFFMcUdoa2FHeHNhR1JvYUdSb2JHeG9aR2k3OVJBQUEvLzhBVGdBQUFNVURmZ0FpQUVFQUFBRUhBeUVCQ1FBQkFBaXhBUUd3QWJBMUt3QUEvLzhBVWY5TkFNRUN2QUFpQUVFQUFBQURBeTRCRmdBQS8vLy85QUFBQUxnRGVRQWlBRUVBQUFFSEF5SUE5QUFCQUFpeEFRR3dBYkExS3dBQS8vOEFQUUFBQU40RGxRQWlBRUVBQUFBREF5c0Jtd0FBLy84QUZRQUFBUDBEVlFBaUFFRUFBQUFEQXlvQkt3QUFBQUVBTS84dUFMNEN2QUFUQURCQUxRRUJBd0VCVEE0QkFRRkxBQUlDU0UwQUFRRkpUUVFCQXdNQVlRQUFBRlVBVGdBQUFCTUFFaEVWSXdVS0dTc1dOd2NHSXlJbU5UUTJOeU1STXhFakJoVVVNN0lNQlJFZ0tDMHJKQ2RkQVRZa21RSXlDU29pSUVZZ0FyejlSRDR5S2YvLy8rOEFBQUVsQTMwQUlnQkJBQUFBQXdNcEFTb0FBQUFCQUF6Lzh3RmNBcndBREFBcFFDWUNBUUFCQVFFQ0FBSk1BQUVCU0UwQUFBQUNZUU1CQWdKUkFrNEFBQUFNQUFzU0l3UUtHQ3NXSnpjV016STFFVE1SRkFZak1DUUlLQ2FjWG9KeURRbFRCcDBCMXY0dmpHei8vd0FNLy9NQm13TjRBQ0lBVHdBQUFBTURJd0hkQUFELy93QU0vL01Cb2dOK0FDSUFUd0FBQUFNREpRRzdBQUFBQVFCYkFBQUNkZ0s4QUFzQUgwQWNDUVFEQXdBQ0FVd0RBUUlDU0UwQkFRQUFTUUJPRWhFVEVRUUtHaXNCQVNNQkJ4VWpFVE1SQVRNQk1RRkZlLzcxTjE1ZUFUSjBBWHYraFFFMk8vc0N2UDZ2QVZILy93QmIveklDZGdLOEFDSUFVZ0FBQUFNREx3SFdBQUFBQVFCYkFBQUNDQUs4QUFVQUdVQVdBQUVCU0UwQUFnSUFZQUFBQUVrQVRoRVJFQU1LR1NzaElSRXpFU0VDQ1A1VFhRRlFBcno5bC8vL0FFMEFBQUlJQTNnQUlnQlVBQUFBQXdNakFVb0FBUC8vQUZzQUFBSUlBcndBSWdCVUFBQUJCd01GQVpiL3pBQUpzUUVCdVAvTXNEVXJBUC8vQUZ2L01nSUlBcndBSWdCVUFBQUFBd012QVpVQUFQLy9BRnNBQUFJSUFyd0FJZ0JVQUFBQUF3S25BaHdBQUFBQkFBd0FBQUlVQXJ3QURRQW1RQ01OREFzSUJ3WUZBQWdBQWdGTUFBSUNTRTBBQUFBQllBQUJBVWtCVGhVUkVRTUtHU3NURVNFVklSRUhOVGNSTXhFM0ZjUUJVUDVUVzF0ZGh3RmkvdkZUQVRZblN5Y0JPLzd3T2tvQUFBRUFXd0FBQXg4Q3ZBQU1BRXhMc0IxUVdMWUlCUUlCQUFGTUc3WUlCUUlDQUFGTVdVdXdIVkJZUUE0RUFRQUFTRTBEQWdJQkFVa0JUaHRBRWdRQkFBQklUUUFDQWtsTkF3RUJBVWtCVGxtM0VSSVNFUkVGQ2hzckpSTXpFU01SQXlNREVTTVJNd0hBK21WYjUwTG9XRjkvQWozOVJBSU4vZnNDQWYzM0Fyd0FBUUJiQUFBQ2t3SzhBQWtBSGtBYkJRQUNBUUFCVEFNQkFBQklUUUlCQVFGSkFVNFJFaEVSQkFvYUt5VVJNeEVqQVJFakVUTUNOVjVRL25WZFVhTUNHZjFFQWhmOTZRSzhBQUFBLy84QVd3QUFBcE1EZUFBaUFGc0FBQUFEQXlNQ05nQUEvLzhBV3dBQUFwTURlQUFpQUZzQUFBQURBeVlDRGdBQS8vOEFXLzh5QXBNQ3ZBQWlBRnNBQUFBREF5OEI5UUFBQUFFQVcvOHZBcE1DdkFBV0FEZEFOQlVRRHdNQ0F3a0JBUUlJQVFBQkEwd0ZCQUlEQTBoTkFBSUNTVTBBQVFFQVlRQUFBRlVBVGdBQUFCWUFGaEVWSXlVR0Nob3JBUkVqRlJRR0l5SW5OeFl6TWpZMU5RRVJJeEV6QVJFQ2t3RmhhRGdiQ3g0aFFEditmVjFSQVlrQ3ZQMUVJMWRYQzBrR016VW1BZ3o5NlFLOC9lY0NHUUFBQVAvL0FGc0FBQUtUQTMwQUlnQmJBQUFBQXdNcEFoTUFBQUFDQURiLzh3TFdBc2tBRHdBZkFDeEFLUVVCQXdNQllRUUJBUUZRVFFBQ0FnQmhBQUFBVVFCT0VCQUFBQkFmRUI0WUZnQVBBQTRtQmdvWEt3QVdGaFVVQmdZaklpWW1OVFEyTmpNT0FoVVVGaFl6TWpZMk5UUW1KaU1CMzVoZlg1bFhXSnBmWDVwWVJHdy9QbXREUW0xQ1FHMURBc2xPbzNoNHBWQlFwWGg0bzA1VlBYeGFXWDlCUDM5YldYdytBUC8vQURiLzh3TFdBM2dBSWdCaEFBQUFBd01qQWtvQUFQLy9BRGIvOHdMV0EzZ0FJZ0JoQUFBQUF3TW5BaVlBQVAvL0FEYi84d0xXQTNnQUlnQmhBQUFBQXdNbUFpSUFBUC8vQURiLzh3TFdBMzRBSWdCaEFBQUFBd01sQWlrQUFQLy9BRGIvOHdMV0E4b0FJZ0JoQUFBQkJ3Tk9BaWdBb0FBSXNRSUNzS0N3TlNzQUFQLy9BRGIvVFFMV0EzNEFJZ0JoQUFBQUl3TXVBaE1BQUFBREF5VUNLUUFBLy84QU52L3pBdFlEeWdBaUFHRUFBQUVIQTA4Q0tRQ2dBQWl4QWdLd29MQTFLd0FBLy84QU52L3pBdFlEMkFBaUFHRUFBQUVIQTFBQ0tBQ2dBQWl4QWdLd29MQTFLd0FBLy84QU52L3pBdFlENlFBaUFHRUFBQUVIQTFFQ0tRQ2dBQWl4QWdLd29MQTFLd0FBQUFRQU52L3pBdFlEVWdBTEFCY0FKd0EzQUVoQVJRSUJBQWtEQ0FNQkJRQUJhUXNCQndjRllRb0JCUVZRVFFBR0JnUmhBQVFFVVFST0tDZ1lHQXdNQUFBb055ZzJNQzRZSnhnbUlCNE1Gd3dXRWhBQUN3QUtKQXdLRnlzQUpqVTBOak15RmhVVUJpTXlKalUwTmpNeUZoVVVCaU1HRmhZVkZBWUdJeUltSmpVME5qWXpEZ0lWRkJZV016STJOalUwSmlZakFSTWNIQmNZSEJ3WW9oMGNHQmNiR3hjRW1GOWZtVmRZbWw5Zm1saEViRDgrYTBOQ2JVSkFiVU1DNmhvWkdoc2JHaGthR2hrYUd4c2FHUm9oVHFONGVLVlFVS1Y0ZUtOT1ZUMThXbGwvUVQ5L1cxbDhQdi8vQURiL1RRTFdBc2tBSWdCaEFBQUFBd011QWhNQUFQLy9BRGIvOHdMV0Eza0FJZ0JoQUFBQkJ3TWlBZkVBQVFBSXNRSUJzQUd3TlNzQUFQLy9BRGIvOHdMV0E1VUFJZ0JoQUFBQUF3TXJBcGtBQUFBQ0FEYi84d0xXQTBrQUhBQXNBRGRBTkJ3QkJBSUJUQUFEQVFPRkFBSUNTRTBBQkFRQllRQUJBVkJOQmdFRkJRQmhBQUFBVVFCT0hSMGRMQjByS3hNakppVUhDaHNyQUJZVkZBWUdJeUltSmpVME5qWXpNaGNYRmpNeU5qVTFNeFVVQmdjQ05qWTFOQ1ltSXlJR0JoVVVGaFl6QXBWQlg1bFhXSnBmWDVwWUl5SWJOaHNjR1V3dkxwWnRRa0J0UTBKc1B6NXJRd0pVa1dONHBWQlFwWGg0bzA0R0JBZ2NIbGhWTURzSC9jWS9mMXRaZkQ0OWZGcFpmMEVBLy84QU52L3pBdFlEZUFBaUFHOEFBQUFEQXlNQ1NnQUEvLzhBTnY5TkF0WURTUUFpQUc4QUFBQURBeTRDRXdBQS8vOEFOdi96QXRZRGVRQWlBRzhBQUFFSEF5SUI4UUFCQUFpeEFnR3dBYkExS3dBQS8vOEFOdi96QXRZRGxRQWlBRzhBQUFBREF5c0NtUUFBLy84QU52L3pBdFlEZlFBaUFHOEFBQUFEQXlrQ0p3QUEvLzhBTnYvekF0WURlZ0FpQUdFQUFBQURBeVFDVFFBQS8vOEFOdi96QXRZRFZRQWlBR0VBQUFBREF5b0NLUUFBQUFNQU52K2VBdFlESEFBWEFDRUFLZ0JCUUQ0VkFRSUJLQ2NiR2dRREFnd0pBZ0FEQTB3WEZnSUJTZ3NLQWdCSkFBSUNBV0VBQVFGUVRRUUJBd01BWVFBQUFGRUFUaUlpSWlvaUtTZ3FKZ1VLR1NzQkZoWVZGQVlHSXlJbkJ5YzNKaVkxTkRZMk16SVhOeGNBRmhjQkppTWlCZ1lWQURZMk5UUW5BUll6QWxVOFJWK1pWMDVJUWpsQ1BFWmZtbGhSUkVFNi9nRXBKUUVLTUR0Q2JEOEJMbTFDVHY3MU1EZ0NpQzZVWm5pbFVDQjFJM1V1bG1aNG8wNGdjeC8rSEc4a0FkWVlQWHhhL3VjL2YxdUxTLzRvRi8vL0FEYi84d0xXQTMwQUlnQmhBQUFBQXdNcEFpY0FBQUFDQURZQUFBTXJBcndBRWdBYkFEcEFOd0FCQUFJREFRSm5DUVlDQUFBRlh3Z0JCUVZJVFFjQkF3TUVYd0FFQkVrRVRoUVRBQUFhR0JNYkZCc0FFZ0FSSVJFUkVSRUtDaHNyQVJVaEZTRVZJUlVoRlNFaUppWTFORFkyTXdjaUJoVVVGak16RVFNci90Z0JBdjcrQVNqK2IybWhXbHVoYWdwMWhZUjJFd0s4VWVCTjdWRlFubkZ4blU5T2szeDlrZ0llQUFBQUFnQmJBQUFDS0FLOEFBc0FFd0F3UUMwR0FRTUFBUUlEQVdjQUJBUUFYd0FBQUVoTkJRRUNBa2tDVGcwTUFBQVNFQXdURFJNQUN3QUxKU0VIQ2hnck14RXpNaFlWRkFZR0l5TVJFekkyTlRRakl4RmIySGQrT0c1T2ZIVktUcGgxQXJ4d1lFQm5QZjc0QVZsTVJJTCs3Z0FBQUFBQ0FGc0FBQUllQXJ3QURRQVZBRFJBTVFBQUJ3RUZCQUFGWndBRUFBRUNCQUZuQmdFREEwaE5BQUlDU1FKT0RnNEFBQTRWRGhRUkR3QU5BQTBSSlNFSUNoa3JFeFV6TWhZVkZBWUdJeU1WSXhFWEVUTXlOalUwSTdsNmMzZzFha3Q3WGw1dFNFNldBcngzZEY0L1pEdVZBcnpJL3ZCS1JJSUFBQUFBQWdBMi8xOEMxZ0xKQUJJQUlnQXdRQzBDQVFBREFVd0VBd0lBU1FBQ0FnRmhBQUVCVUUwRUFRTURBR0VBQUFCUkFFNFRFeE1pRXlFcUppVUZDaGtySkFZSEZ3Y2xJeUltSmpVME5qWXpNaFlXRlFBMk5qVTBKaVlqSWdZR0ZSUVdGak1DMW5WZTB5dis2dzlZbWw5Zm1saFltRi8rOEcxQ1FHMURRbXcvUG10RDJxMGtZRXFVVUtWNGVLTk9UcU40L3VnL2YxdFpmRDQ5ZkZwWmYwRUFBQUlBV3dBQUFtWUN2QUFPQUJjQUswQW9EZ0VCQkFGTUFBUUFBUUFFQVdjQUJRVURYd0FEQTBoTkFnRUFBRWtBVGlRbUlSRWhFQVlLSENzaEl3TWpJeEVqRVRNeUZoVVVCZ2NsTXpJMk5UUW1JeU1DWm1taEVKUmQ4SVIzU1ViL0FaMUVTMHhYaVFFSy92WUN2SEJkVG04WVFVNDlRMElBLy84QVd3QUFBbVlEZUFBaUFIMEFBQUFEQXlNQi93QUEvLzhBV3dBQUFtWURlQUFpQUgwQUFBQURBeVlCMWdBQS8vOEFXLzh5QW1ZQ3ZBQWlBSDBBQUFBREF5OEJ4Z0FBQUFFQUtmLzBBaGNDeVFBckFEUkFNUUlCQUFNWkF3SUNBQmdCQVFJRFRBQUFBQU5oQkFFREExQk5BQUlDQVdFQUFRRlJBVTRBQUFBckFDb2xMU1VGQ2hrckFCWVhCeVltSXlJR0ZSUVdGaGNlQWhVVUJnWWpJaVluTnhZV016STJOVFFtSmljdUFqVTBOall6QVhOb0xDa25XeTFEVGlzK09VbFNQRDF4VFQ2RE1pRXViek5QVENrK04wWlhQVHR0U1FMSkpCMUhHeDg1TXlBdkhoY2VLa3M0UFZ3ekl4OU1HaDgrTWlFdkhoVWFMVTg4TmxVd0FQLy9BQ24vOUFJWEEzZ0FJZ0NCQUFBQUF3TWpBZDhBQVAvL0FDbi85QUlYQTNnQUlnQ0JBQUFBQXdNbUFiY0FBQUFCQUNuL0xnSVhBc2tBUkFCVVFGRTFBUWdITmlBQ0JnZ2ZBUUFHR3dNQ0JBRWFEd0lEQkE0QkFnTUdUQUFCQUFRREFRUnBBQWdJQjJFQUJ3ZFFUUUFHQmdCaEJRRUFBRkZOQUFNREFtRUFBZ0pWQWs0bExTVVRKQ1VrSWhFSkNoOHJKQVlIQnpZek1oWVZGQVlqSWlZbk54WVdNekkyTlRRbUl5SUhKemNtSmljM0ZoWXpNalkxTkNZbUp5NENOVFEyTmpNeUZoY0hKaVlqSWdZVkZCWVdGeDRDRlFJWGQyZ2pDQllrTUQ0eEZTc01EQWtpRUJjY0dSRVdEaGttT25RdUlTNXZNMDlNS1Q0M1JsYzlPMjFKUldnc0tTZGJMVU5PS3o0NVNWSThhVzBITkFRbUhpY3NEQWd2Q0FzUkVBNFJCaDFBQXlJY1RCb2ZQakloTHg0VkdpMVBQRFpWTUNRZFJ4c2ZPVE1nTHg0WEhpcExPQUQvL3dBcC8vUUNGd04rQUNJQWdRQUFBQU1ESlFHOUFBRC8vd0FwL3pJQ0Z3TEpBQ0lBZ1FBQUFBTURMd0dqQUFBQUFRQmIvL01DY0FMSkFDWUFna3V3RWxCWVFCQW1GaFVEQWdNTEFRRUNDZ0VBQVFOTUcwQVFKaFlWQXdJREN3RUJBZ29CQkFFRFRGbExzQkpRV0VBZUFBSURBUU1DQVlBQUF3TUZZUUFGQlZCTkFBRUJBR0VFQVFBQVVRQk9HMEFpQUFJREFRTUNBWUFBQXdNRllRQUZCVkJOQUFRRVNVMEFBUUVBWVFBQUFGRUFUbGxBQ1NRVEpCUWxKZ1lLSENzQkZoWVZGQVlHSXlJbUp6Y1dGak15TmpVMEppTTFOelFtSXlJR0ZSRWpFVFEyTmpNeUZoVUJuMXAzT0dJK0gwc2JFUlk3R1RsSVpYR2FUVDgrVVYwL2JrVnJlZ0Z2Q0YxVE9Wa3lEUTFQQ2d3K01EZEtQWTQyUkV0Sy9oc0I3RVpqTkhKbUFBSUFOdi96QXBBQ3lRQVlBQjhBUFVBNkZSUUNBUUlCVEFBQkFBUUZBUVJuQUFJQ0EyRUdBUU1EVUUwSEFRVUZBR0VBQUFCUkFFNFpHUUFBR1I4Wkhod2JBQmdBRnlJVkpnZ0tHU3NBRmhZVkZBWUdJeUltSmpVME55RW1KaU1pQmdjbk5qWXpFalkzSVFZV013RzFqVTVVamxoWmdrVUZBZk1JYzJVMWNpOHJOWTVGWFhJSi9tY0NhRjRDeVZPaGMzdWxUMWFWWGg4b2RYMHNLa016TlAxK2VuWnFoZ0FBQUFFQUZRQUFBajBDdkFBSEFCdEFHQU1CQVFFQ1h3QUNBa2hOQUFBQVNRQk9FUkVSRUFRS0dpc2hJeEVqTlNFVkl3RlhYZVVDS09ZQ2ExRlJBQUVBRlFBQUFqMEN2QUFQQUM5QUxBVUJBUVFCQWdNQkFtY0dBUUFBQjE4SUFRY0hTRTBBQXdOSkEwNEFBQUFQQUE4UkVSRVJFUkVSQ1FvZEt3RVZJeFV6RlNNUkl4RWpOVE0xSXpVQ1BlWnRiVjF1YnVVQ3ZGSGdSLzY4QVVSSDRGRUFBUC8vQUJVQUFBSTlBM2dBSWdDSkFBQUFBd01tQWNnQUFBQUJBQlgvTGdJOUFyd0FJZ0JEUUVBYUFnSUVBUmtPQWdNRURRRUNBd05NQUFFQUJBTUJCR2tJQVFZR0IxOEFCd2RJVFFVQkFBQkpUUUFEQXdKaEFBSUNWUUpPRVJFUkV5UWxKQ0lRQ1FvZkt5RWpCell6TWhZVkZBWWpJaVluTnhZV016STJOVFFtSXlJSEp6Y2pFU00xSVJVakFWY1ZLZ2dXSkRBK01SVXJEQXdKSWhBWEhCa1JGZzRaTFJYbEFpam1Qd1FtSGljc0RBZ3ZDQXNSRUE0UkJoMUxBbXRSVWYvL0FCWC9NZ0k5QXJ3QUlnQ0pBQUFBQXdNdkFhWUFBQUFCQUZ2Lzh3SnpBcndBRVFBaFFCNENBUUFBU0UwQUFRRURZUVFCQXdOUkEwNEFBQUFSQUJBVEl4TUZDaGtyRmlZMUVUTVJGQll6TWpZMUVUTVJGQVlqOHBkZFcxUlVXMTJYZFEyQ2lBRy8vajFUVzF0VEFjUCtRWWlDLy84QVcvL3pBbk1EZUFBaUFJNEFBQUFEQXlNQ0t3QUEvLzhBVy8vekFuTURlQUFpQUk0QUFBQURBeWNDQmdBQS8vOEFXLy96QW5NRGVBQWlBSTRBQUFBREF5WUNBd0FBLy84QVcvL3pBbk1EZmdBaUFJNEFBQUFEQXlVQ0NRQUFBQU1BVy8vekFuTURVZ0FMQUJjQUtRQS9RRHdDQVFBSkF3Z0RBUVFBQVdrR0FRUUVTRTBBQlFVSFlRb0JCd2RSQjA0WUdBd01BQUFZS1Jnb0pTUWhIeHdiREJjTUZoSVFBQXNBQ2lRTENoY3JFaVkxTkRZek1oWVZGQVlqTWlZMU5EWXpNaFlWRkFZakFpWTFFVE1SRkJZek1qWTFFVE1SRkFZajlCd2NGeGdjSEJpaUhSd1lGeHNiRjlLWFhWdFVWRnRkbDNVQzZob1pHaHNiR2hrYUdoa2FHeHNhR1JyOUNZS0lBYi8rUFZOYlcxTUJ3LzVCaUlJQUFBQUFCQUJiLy9NQ2N3UFZBQU1BRHdBYkFDMEFTVUJHQUFBQUFRSUFBV2NFQVFJTEJRb0RBd1lDQTJrSUFRWUdTRTBBQndjSllRd0JDUWxSQ1U0Y0hCQVFCQVFjTFJ3c0tTZ2xJeUFmRUJzUUdoWVVCQThFRGlVUkVBMEtHU3NCTXdjakJpWTFORFl6TWhZVkZBWWpNaVkxTkRZek1oWVZGQVlqQWlZMUVUTVJGQll6TWpZMUVUTVJGQVlqQVc5Z1Z6MUhIQndYR0J3Y0dLSWRIQmdYR3hzWDBwZGRXMVJVVzEyWGRRUFZhWUlhR1JvYkd4b1pHaG9aR2hzYkdoa2EvUW1DaUFHLy9qMVRXMXRUQWNQK1FZaUNBQVFBVy8vekFuTUQyQUFHQUJJQUhnQXdBRlZBVWdVQkFBRUJUQXNDQWdFQUFZVUFBQU1BaFEwR0FnTUZEQUlFQndNRWFna0JCd2RJVFFBS0NnaGhBQWdJVVFoT0V4TUhCd0FBTGl3cEtDVWpJQjhUSGhNZEdSY0hFZ2NSRFFzQUJnQUdFUkVPQ2hnckFRY2pKek1YTndZbU5UUTJNeklXRlJRR0l6WVdGUlFHSXlJbU5UUTJNeGN6RVJRR0l5SW1OUkV6RVJRV016STJOUUhzYVRodlV6ZzVyQndjRnhnY0hCalFHeHNYRngwY0dGSmRsM1YxbDExYlZGUmJBOWhyYXprNTdob1pHaHNiR2hrYWFCc2FHUm9hR1JvYmx2NUJpSUtDaUFHLy9qMVRXMXRUQUFRQVcvL3pBbk1EMVFBREFBOEFHd0F0QUZCQVRRQUFDZ0VCQWdBQlp3UUJBZ3dGQ3dNREJnSURhUWdCQmdaSVRRQUhCd2xoRFFFSkNWRUpUaHdjRUJBRUJBQUFIQzBjTENrb0pTTWdIeEFiRUJvV0ZBUVBCQTRLQ0FBREFBTVJEZ29YS3dFbk14Y0dKalUwTmpNeUZoVVVCaU15SmpVME5qTXlGaFVVQmlNQ0pqVVJNeEVVRmpNeU5qVVJNeEVVQmlNQlRsVmVOSmNjSEJjWUhCd1lvaDBjR0JjYkd4ZlNsMTFiVkZSYlhaZDFBMnhwYVlJYUdSb2JHeG9aR2hvWkdoc2JHaGthL1FtQ2lBRy8vajFUVzF0VEFjUCtRWWlDQUFRQVcvL3pBbk1EdFFBREFBOEFHd0F0QUVsQVJnQUFBQUVDQUFGbkJBRUNDd1VLQXdNR0FnTnBDQUVHQmtoTkFBY0hDV0VNQVFrSlVRbE9IQndRRUFRRUhDMGNMQ2tvSlNNZ0h4QWJFQm9XRkFRUEJBNGxFUkFOQ2hrckV6TVZJeFltTlRRMk16SVdGUlFHSXpJbU5UUTJNeklXRlJRR0l3SW1OUkV6RVJRV016STJOUkV6RVJRR0krL3c4QVVjSEJjWUhCd1lvaDBjR0JjYkd4ZlNsMTFiVkZSYlhaZDFBN1UybFJvWkdoc2JHaGthR2hrYUd4c2FHUnI5Q1lLSUFiLytQVk5iVzFNQncvNUJpSUlBQVAvL0FGdi9UUUp6QXJ3QUlnQ09BQUFBQXdNdUFmUUFBUC8vQUZ2Lzh3SnpBM2tBSWdDT0FBQUJCd01pQWRJQUFRQUlzUUVCc0FHd05Tc0FBUC8vQUZ2Lzh3SnpBNVVBSWdDT0FBQUFBd01yQW5rQUFBQUJBRnYvOHdMbkEwSUFHUUJ5UzdBSlVGaEFHd0FBQXdDRkFBRUJBMThGQVFNRFNFMEFCQVFDWVFBQ0FsRUNUaHRMc0FwUVdFQWNBQUFEQXdCd0FBRUJBMThGQVFNRFNFMEFCQVFDWVFBQ0FsRUNUaHRBR3dBQUF3Q0ZBQUVCQTE4RkFRTURTRTBBQkFRQ1lRQUNBbEVDVGxsWlFBa2pJeE1qRXhBR0Nod3JBVE1WRkFZSEVSUUdJeUltTlJFekVSUVdNekkyTlJFek1qVUNtMHc4T0pkMWRaZGRXMVJVVzFVd0EwSklOejBDL25tSWdvS0lBYi8rUFZOYlcxTUJ3enNBQUFELy93QmIvL01DNXdONEFDSUFtd0FBQUFNREl3SXJBQUQvL3dCYi8wMEM1d05DQUNJQW13QUFBQU1ETGdIMEFBRC8vd0JiLy9NQzV3TjVBQ0lBbXdBQUFRY0RJZ0hTQUFFQUNMRUJBYkFCc0RVckFBRC8vd0JiLy9NQzV3T1ZBQ0lBbXdBQUFBTURLd0o1QUFELy93QmIvL01DNXdOOUFDSUFtd0FBQUFNREtRSUlBQUQvL3dCYi8vTUNjd042QUNJQWpnQUFBQU1ESkFJdUFBRC8vd0JiLy9NQ2N3TlZBQ0lBamdBQUFBTURLZ0lKQUFBQUFRQmIveTRDY3dLOEFDRUFMVUFxQ3dFQkF3Rk1CQUVBQUVoTkFBVUZBMkVBQXdOUlRRQUJBUUpoQUFJQ1ZRSk9JeE1sSXljUUJnb2NLd0V6RVJRR0J3WVZGRE15TndjR0l5SW1OVFEyTnlNaUpqVVJNeEVVRmpNeU5qVUNGbDF0V2pBa0RRd0ZFQ0VvTFNNZUNIV1hYVnRVVkZzQ3ZQNUJjb0FTT1RBcEFqSUpLaUlkUGg2Q2lBRy8vajFUVzF0VEFBQUEvLzhBVy8vekFuTURuUUFpQUk0QUFBQURBeWdDQ1FBQS8vOEFXLy96QW5NRGZRQWlBSTRBQUFBREF5a0NDQUFBQUFFQUVBQUFBcEVDdkFBR0FCdEFHQVFCQUFFQlRBSUJBUUZJVFFBQUFFa0FUaElSRUFNS0dTc2hJd0V6RXhNekFZaHUvdlptM2RkbkFyejlvZ0plQUFBQkFCQUFBQVBVQXJ3QURBQWdRQjBLQlFJQkFBRk1CQU1DQUFCSVRRSUJBUUZKQVU0U0VSSVJFUVVLR3lzbEV6TURJd01ESXdNekV4TXpBczJuWU5kZnJheGYxbVNsc0ZkOUFqLzlSQUl3L2RBQ3ZQMitBa0wvL3dBUUFBQUQxQU40QUNJQXB3QUFBQU1ESXdLNUFBRC8vd0FRQUFBRDFBTitBQ0lBcHdBQUFBTURKUUtYQUFBQUF3QVFBQUFEMUFOU0FBc0FGd0FrQUVCQVBTSWRBZ1VFQVV3Q0FRQUtBd2tEQVFRQUFXa0lCd0lFQkVoTkJnRUZCVWtGVGd3TUFBQWtJeUVnSHg0Y0d4b1pEQmNNRmhJUUFBc0FDaVFMQ2hjckFDWTFORFl6TWhZVkZBWWpNaVkxTkRZek1oWVZGQVlqRXhNekF5TURBeU1ETXhNVE13R0NIQndYR0J3Y0dLSWRIQmdYR3hzWGU2ZGcxMSt0ckYvV1pLV3dWd0xxR2hrYUd4c2FHUm9hR1JvYkd4b1pHdjJUQWovOVJBSXcvZEFDdlAyK0FrSUEvLzhBRUFBQUE5UURlUUFpQUtjQUFBRUhBeUlDWUFBQkFBaXhBUUd3QWJBMUt3QUFBQUVBRGdBQUFuVUN2QUFMQUNCQUhRc0lCUUlFQVFBQlRBTUJBQUJJVFFJQkFRRkpBVTRTRWhJUUJBb2FLd0V6QXdFakF3TWpFd016RXdIaWVlNEJDSGJJdUhIMTZuaW9BcnordFA2UUFTWCsyd0ZyQVZIKzlnQUJBQTRBQUFKVUFyd0FDQUFkUUJvSUJRSURBQUVCVEFJQkFRRklUUUFBQUVrQVRoSVNFQU1LR1NzaEl4RURNeE1UTXdNQllWNzFicmk0YVBNQkdBR2svclFCVFA1YkFQLy9BQTRBQUFKVUEzZ0FJZ0N0QUFBQUF3TWpBZjBBQVAvL0FBNEFBQUpVQTM0QUlnQ3RBQUFBQXdNbEFkc0FBQUFEQUE0QUFBSlVBMUlBQ3dBWEFDQUFPMEE0SUIwYUF3UUZBVXdDQVFBSUF3Y0RBUVVBQVdrR0FRVUZTRTBBQkFSSkJFNE1EQUFBSHg0Y0d4a1lEQmNNRmhJUUFBc0FDaVFKQ2hjckVpWTFORFl6TWhZVkZBWWpNaVkxTkRZek1oWVZGQVlqQXlNUkF6TVRFek1EeGh3Y0Z4Z2NIQmlpSFJ3WUZ4c2JGelZlOVc2NHVHanpBdW9hR1JvYkd4b1pHaG9aR2hzYkdoa2EvUllCR0FHay9yUUJUUDViLy84QUR2OU5BbFFDdkFBaUFLMEFBQUFEQXk0QnZnQUEvLzhBRGdBQUFsUURlUUFpQUswQUFBRUhBeUlCcEFBQkFBaXhBUUd3QWJBMUt3QUEvLzhBRGdBQUFsUURsUUFpQUswQUFBQURBeXNDVEFBQS8vOEFEZ0FBQWxRRFZRQWlBSzBBQUFBREF5b0IzQUFBLy84QURnQUFBbFFEZlFBaUFLMEFBQUFEQXlrQjJnQUFBQUVBTFFBQUFrQUN2QUFKQUNsQUpnQUJBZ01GQVFFQUFrd0FBZ0lEWHdBREEwaE5BQUFBQVY4QUFRRkpBVTRSRWhFUkJBb2FLd0VCSVJVaE5RRWhOU0VDTHY1dEFhWDk3UUdUL29NQjZ3SjQvZGxSU1FJaVVmLy9BQzBBQUFKQUEzZ0FJZ0MyQUFBQUF3TWpBZm9BQVAvL0FDMEFBQUpBQTNnQUlnQzJBQUFBQXdNbUFkRUFBUC8vQUMwQUFBSkFBMzRBSWdDMkFBQUJCd01oQWJZQUFRQUlzUUVCc0FHd05Tc0FBQUFDQUMzLzh3SVRBaGtBSWdBdkFIVkFGUjBCQkFVY0FRTUVGZ0VHQXlZbEN3VUVBQVlFVEV1d0NsQllRQ0FBQXdBR0FBTUdhUUFFQkFWaEFBVUZVMDBJQndJQUFBRmhBZ0VCQVVrQlRodEFJQUFEQUFZQUF3WnBBQVFFQldFQUJRVlRUUWdIQWdBQUFXRUNBUUVCVVFGT1dVQVFJeU1qTHlNdUtDTWxKQ01rRWdrS0hTc2xGQll6TWpjSEJpTWlKaWNHSXlJbU5UUTJNeklXRnpVMEppTWlCeWMyTXpJV0ZRSTJOelVtSmlNaUJoVVVGak1CMkJJVUJSQUhFU0lqS1FkRmFrbGhlRnNnUnhkRk9FMURKMU55WTJiQ1VCa1ZSeDA0U2p3cGFSY1VBandMSXlaUFRVaFBUZ2dGUlRzMU16cEZYbDMrM1Nva1RnVUlLaTRwS0FELy93QXQvL01DRXdMSUFDSUF1Z0FBQUFNREF3SFpBQUQvL3dBdC8vTUNFd0xMQUNJQXVnQUFBQUlER2x3QUFBRC8vd0F0Ly9NQ0V3TS9BQ0lBdWdBQUFBTURTZ0d6QUFELy93QXQvMUVDRXdMTEFDSUF1Z0FBQUNNRER3R2FBQUFBQXdNSUFiTUFBUC8vQUMzLzh3SVRBejhBSWdDNkFBQUFBd05MQWJNQUFQLy9BQzMvOHdJVEExMEFJZ0M2QUFBQUF3Tk1BYk1BQVAvL0FDMy84d0lUQTBrQUlnQzZBQUFBQXdOTkFiTUFBUC8vQUMzLzh3SVRBc2NBSWdDNkFBQUFBd01IQWJNQUFQLy9BQzMvOHdJVEFzNEFJZ0M2QUFBQUFnTVlZd0FBQVAvL0FDMy84d0lUQXlvQUlnQzZBQUFBQXdOT0FiWUFBUC8vQUMzL1VRSVRBczRBSWdDNkFBQUFJd01QQVpvQUFBQURBd1lCdGdBQS8vOEFMZi96QWhNREtnQWlBTG9BQUFBREEwOEJ0Z0FBLy84QUxmL3pBaE1ET0FBaUFMb0FBQUFEQTFBQnRnQUEvLzhBTGYvekFoTURTUUFpQUxvQUFBQURBMUVCdGdBQS8vOEFMZi96QWhNQ3lnQWlBTG9BQUFBQ0F4TmtBQUFBLy84QUxmOVJBaE1DR1FBaUFMb0FBQUFEQXc4Qm1nQUEvLzhBTGYvekFoTUN5QUFpQUxvQUFBQURBd0lCZndBQS8vOEFMZi96QWhNQzVnQWlBTG9BQUFBREF3d0JrUUFBLy84QUxmL3pBaE1DcEFBaUFMb0FBQUFEQXdzQnR3QUFBQUlBTGY4eUFoWUNHUUF1QURzQVlVQmVIUUVEQkJ3QkFnTVdBUWNDTWpFb0N3UUZCd2tCQVFVQkFRWUJCa3dBQWdBSEJRSUhhUUFEQXdSaEFBUUVVMDBLQ0FJRkJRRmhBQUVCVVUwSkFRWUdBR0lBQUFCTkFFNHZMd0FBTHpzdk9qWTBBQzRBTFJVakpTUW5Jd3NLSENzRU53Y0dJeUltTlRRM0ppY0dJeUltTlRRMk16SVdGelUwSmlNaUJ5YzJNeklXRlJVVUZqTXlOd2NIQmhVVU15WTJOelVtSmlNaUJoVVVGak1DREFvRUVoNHBMVUU3REVWcVNXRjRXeUJIRjBVNFRVTW5VM0pqWmhJVUJSQUhBakVsNkZBWkZVY2RPRW84S1pVQ013Z3FJamxEQlVOUFRVaFBUZ2dGUlRzMU16cEZYbDMxRnhRQ1BBRS9NQ25RS2lST0JRZ3FMaWtvLy84QUxmL3pBaE1EQVFBaUFMb0FBQUFEQXdrQnR3QUEvLzhBTGYvekFoTUN6UUFpQUxvQUFBQUNBeHhOQUFBQUFBTUFMZi8wQTFVQ0dBQXNBRE1BUHdFRFM3QVlVRmhBRmlNQkJRWXBJZ0lFQlJ3QkFBUTBFUXdMQkFFQUJFd2JTN0FiVUZoQUZpTUJCUVlwSWdJRUJSd0JDZ1EwRVF3TEJBRUFCRXdiUUJZakFRVUdLU0lDQkFVY0FRb0pOQkVNQ3dRQkFBUk1XVmxMc0JoUVdFQWxEUWtDQkFvQkFBRUVBR2tJQVFVRkJtRU1Cd0lHQmxOTkN3RUJBUUpoQXdFQ0FsRUNUaHRMc0J0UVdFQXFBQW9BQkFwWkRRa0NCQUFBQVFRQVp3Z0JCUVVHWVF3SEFnWUdVMDBMQVFFQkFtRURBUUlDVVFKT0cwQXJBQVFBQ2dBRUNta05BUWtBQUFFSkFHY0lBUVVGQm1FTUJ3SUdCbE5OQ3dFQkFRSmhBd0VDQWxFQ1RsbFpRQnd0TFFBQVBUczNOUzB6TFRNeEx3QXNBQ3NrSkNRakpTSVVEZ29kS3dBV0ZSUUhJUllXTXpJMk54Y0dCaU1pSndZR0l5SW1OVFEyTXpJWE5UUW1JeUlISnpZMk16SVdGelkyTXhjbUppTWlCZ2NISmlNaUJoVVVGak15TmpjQzZHMEQvbzhHVmtndVVoNGhJR2MvaVVFaWJVSlNaSDlpUGpsQk9sQkhLQ3RmUDBOU0ZpQmpQWDhFUkQ5Q1R3UmNSeTFFU1Q0dVBWWUNBaGlMYnhzYlUxVWZHVGNqS21zeU9WTkxWVTBMTER3N01qc2dJeTQwTVRIdFQxUlZUa1FMS0RNdktqODBBQUlBVWYvekFpb0M4QUFVQUNJQXMwdXdFbEJZUUE4QkFRVUFHQmNDQkFVUUFRRUVBMHdiUUE4QkFRVUFHQmNDQkFVUUFRSUVBMHhaUzdBU1VGaEFIUVlCQXdOS1RRY0JCUVVBWVFBQUFGTk5BQVFFQVdFQ0FRRUJVUUZPRzB1d0hWQllRQ0VHQVFNRFNrMEhBUVVGQUdFQUFBQlRUUUFDQWtsTkFBUUVBV0VBQVFGUkFVNGJRQ0VIQVFVRkFHRUFBQUJUVFFZQkF3TUNYd0FDQWtsTkFBUUVBV0VBQVFGUkFVNVpXVUFVRlJVQUFCVWlGU0VjR2dBVUFCUVVKaVFJQ2hrckV4RXpOall6TWhZV0ZSUUdCaU1pSmljakJ5TVJFZ1lIRlJZV016STJOalUwSmlPckFoMVVNVUJrTnp4dFNTNU9IQU1RUE1OSEloUkdMaTFHS0ZGQUF2RCs0Q01tUG5oVFdZRkRKQ0k1QXZEKzJpZ3M4aDhrTWwwL1dHTUFBQUVBTGYvekFmSUNHUUFiQURSQU1RSUJBQU1QQXdJQkFCQUJBZ0VEVEFBQUFBTmhCQUVEQTFOTkFBRUJBbUVBQWdKUkFrNEFBQUFiQUJva0pTVUZDaGtyQUJZWEJ5WW1JeUlHRlJRV0ZqTXlOeGNHQmlNaUppWTFORFkyTXdGbFh5TXFJRDRzUzE4dFRqRlBReXNnWkQ1S2RVUkZkVVlDR1NFZVFCa1labHcrV2k4MlBDQXBRWDVYVlh0QUFBQUEvLzhBTGYvekFmSUN5QUFpQU5NQUFBQURBd01CNWdBQS8vOEFMZi96QWZJQ3h3QWlBTk1BQUFBQ0F4bHVBQUFBQUFFQUxmOHVBZklDR1FBMEFGbEFWaUFCQkFNdElRSUZCQzRXQWdZRk1oVUNBZ2NVQ1FJQkFnZ0JBQUVHVEFnQkJ3QUNBUWNDYVFBRUJBTmhBQU1EVTAwQUJRVUdZUUFHQmxGTkFBRUJBR0VBQUFCVkFFNEFBQUEwQURNVUpTVXBKQ1VrQ1FvZEt3UVdGUlFHSXlJbUp6Y1dGak15TmpVMEppTWlCeWMzSmlZMU5EWTJNeklXRndjbUppTWlCaFVVRmhZek1qY1hCZ1lIQnpZekFWY3ZQakFWS3d3TENTTVFGaDBaRWhVT0dpaGhlRVYxUmpoZkl5b2dQaXhMWHkxT01VOURLeDloUENFSUZqc21IaWNzREFndkNBc1JFQTRSQmgxQkRaQjJWWHRBSVI1QUdSaG1YRDVhTHpZOEh5a0JNZ1FBQVAvL0FDMy84d0h5QXM0QUlnRFRBQUFBQXdNR0FjUUFBUC8vQUMzLzh3SHlBczRBSWdEVEFBQUFBd01VQUw4QUFBQUNBQzMvOHdJRkF2QUFFZ0FnQUp0QUR3a0JCQUFXRlFJRkJBNEJBZ1VEVEV1d0VsQllRQjBBQVFGS1RRQUVCQUJoQUFBQVUwMEhBUVVGQW1FR0F3SUNBa2tDVGh0THNCMVFXRUFoQUFFQlNrMEFCQVFBWVFBQUFGTk5BQUlDU1UwSEFRVUZBMkVHQVFNRFVRTk9HMEFoQUFRRUFHRUFBQUJUVFFBQkFRSmZBQUlDU1UwSEFRVUZBMkVHQVFNRFVRTk9XVmxBRkJNVEFBQVRJQk1mR1JjQUVnQVJFUkltQ0FvWkt4WW1KalUwTmpZek1oY1JNeEVqSnlNR0JpTTJOamMxSmlNaUJnWVZGQllXTTlwcVEwQm9QR0U1V2tBT0F4eFVMalpHR1RsUUtVVXFMRVVuRFRsN1gxbDhQamNCRHYwUVBTQXFVU2dpL0Q0cFdFRkFWeXNBQWdBdC8vTUNKUUwwQUJ3QUtBQTRRRFVRQVFJQkFVd2NHeG9ZRnhVVUV4SUpBVW9BQWdJQllRQUJBVk5OQkFFREF3QmhBQUFBVVFCT0hSMGRLQjBuSXlFbUpBVUtHQ3NCRmhVVUJpTWlKaVkxTkRZMk16SVdGeVluQnljM0ppYzNGaGMzRndJMk5UUW1JeUlHRlJRV013R1Rrb1oxUlhORlFtNUJNRThiSWtoNUdHY29KQ2s2TDJBWWNsaGJSMGxUVmtrQ2o0emhrcDA4ZkZ0YmVqc2tJVnBDUEN3ekhCTTFIaVF3TFAyTmFGcGFhR2RiV21nQS8vOEFMZi96QW9RQzhBQWlBTmtBQUFBREF3VUNyQUFBQUFJQUxmL3pBamNDOEFBYUFDZ0E3VUFQRXdFSUF5Z2JBZ2tJQlFFQkNRTk1TN0FTVUZoQUtBQUdCa3BOQkFFQUFBVmZDZ2NDQlFWSVRRQUlDQU5oQUFNRFUwMEFDUWtCWVFJQkFRRkpBVTRiUzdBV1VGaEFMQUFHQmtwTkJBRUFBQVZmQ2djQ0JRVklUUUFJQ0FOaEFBTURVMDBBQVFGSlRRQUpDUUpoQUFJQ1VRSk9HMHV3SFZCWVFDb0tCd0lGQkFFQUF3VUFad0FHQmtwTkFBZ0lBMkVBQXdOVFRRQUJBVWxOQUFrSkFtRUFBZ0pSQWs0YlFDb0tCd0lGQkFFQUF3VUFad0FJQ0FOaEFBTURVMDBBQmdZQlh3QUJBVWxOQUFrSkFtRUFBZ0pSQWs1WldWbEFGQUFBSmlRZUhBQWFBQm9SRVJJbUpCRVJDd29kS3dFVkl4RWpKeU1HQmlNaUppWTFORFkyTXpJWE5TTTFNelV6RlFNbUl5SUdCaFVVRmhZek1qWTNBamN5UUE0REhGUXVQR3BEUUdnOFlUbHFhbHBhT1ZBcFJTb3NSU2NxUmhrQ3BUYjlrVDBnS2psN1gxbDhQamVOTmt0TC91VStLVmhCUUZjcktDSUFBZ0F0Ly9JQ0NnSWFBQmNBSGdCQVFEMExBUUVBREFFQ0FRSk1BQVFBQUFFRUFHY0hBUVVGQTJFR0FRTURVMDBBQVFFQ1lRQUNBbEVDVGhnWUFBQVlIaGdkR3hvQUZ3QVdKU0VWQ0FvWkt3QVdGaFVVQnlFV016STJOeGNHQmlNaUppWTFORFkyTXdZR0J5RW1KaU1CYkdnMkJmNkVENTB6VXg0cUttcEdSbkpFUG5GSlFsVUdBUzREU0VNQ0drQndSUm9oclNBYU95TW5QWHRaVm41RFNWVlFUVmdBQUFELy93QXQvL0lDQ2dMSUFDSUEzUUFBQUFNREF3SG9BQUQvL3dBdC8vSUNDZ0xMQUNJQTNRQUFBQUlER213QUFBRC8vd0F0Ly9JQ0NnTEhBQ0lBM1FBQUFBSURHWEFBQUFELy93QXQvL0lDQ2dMT0FDSUEzUUFBQUFJREdITUFBQUQvL3dBdC8vSUNDd01xQUNJQTNRQUFBQU1EVGdIR0FBRC8vd0F0LzFFQ0NnTE9BQ0lBM1FBQUFDTUREd0d0QUFBQUF3TUdBY1lBQVAvL0FDMy84Z0lLQXlvQUlnRGRBQUFBQXdOUEFjWUFBUC8vQUMzLzhnSUtBemdBSWdEZEFBQUFBd05RQWNZQUFQLy9BQzMvOGdJS0Ewa0FJZ0RkQUFBQUF3TlJBY1lBQVAvL0FDMy84Z0lLQXNvQUlnRGRBQUFBQWdNVGRBQUFBUC8vQUMzLzhnSUtBczRBSWdEZEFBQUFBd01VQU1JQUFQLy9BQzMvVVFJS0Fob0FJZ0RkQUFBQUF3TVBBYTBBQVAvL0FDMy84Z0lLQXNnQUlnRGRBQUFBQXdNQ0FZOEFBUC8vQUMzLzhnSUtBdVlBSWdEZEFBQUFBd01NQWFFQUFQLy9BQzMvOGdJS0FxUUFJZ0RkQUFBQUF3TUxBY1lBQUFBQ0FDMy9MZ0lLQWhvQUpnQXRBRkZBVGdzQkFRQWNEQUlFQVJRQkFnUURUQUFHQUFBQkJnQm5DUUVIQndWaENBRUZCVk5OQUFFQkJHRUFCQVJSVFFBQ0FnTmhBQU1EVlFOT0p5Y0FBQ2N0Snl3cUtRQW1BQ1VsSXlnaEZRb0tHeXNBRmhZVkZBY2hGak15TmpjWEJnY0dGUlF6TWpjSEJpTWlKalUwTndZaklpWW1OVFEyTmpNR0JnY2hKaVlqQVd4b05nWCtoQStkTTFNZUtqbEtMaVVPQ2dRU0hpa3RQZ2tSUm5KRVBuRkpRbFVHQVM0RFNFTUNHa0J3UlJvaHJTQWFPekFSUEM4cEFqTUlLaUk1UUFFOWUxbFdma05KVlZCTldBRC8vd0F0Ly9JQ0NnTE5BQ0lBM1FBQUFBSURIRjBBQUFBQUFnQXUvL0lDQ3dJYUFCY0FIZ0JBUUQwVUFRSURFd0VCQWdKTUFBRUFCQVVCQkdjQUFnSURZUVlCQXdOVFRRY0JCUVVBWVFBQUFGRUFUaGdZQUFBWUhoZ2RHeG9BRndBV0lSVW1DQW9aS3dBV0ZoVVVCZ1lqSWlZbU5UUTNJU1lqSWdZSEp6WTJNeEkyTnlFV0ZqTUJWWEpFUG5GSlIyZzJCUUY4RDUwelV4NHFLbXBHUmxVRy90SURTRU1DR2oxN1dWWitRMEJ3UlJvaHJTQWFPeU1uL2lGVlVFMVlBQUFBQVFBaUFBQUJZQUw5QUJRQU4wQTBBUUVBQmdJQkFRQUNUQWNCQmdBQUFRWUFhUVFCQWdJQlh3VUJBUUZMVFFBREEwa0RUZ0FBQUJRQUV4RVJFUkVTSXdnS0hDc0FGd2NtSXlJVkZUTVZJeEVqRVNNMU16VTBOak1CUFNNUEdSMVFnWUZiVGs1VVNnTDlDMGNIU1YxTi9rRUJ2MDFjU2tzQUFnQXQveWdDRGdJWkFCMEFLZ0N4UUJjQ0FRWUFKeVlDQlFZVEFRTUZEUUVDQXd3QkFRSUZURXV3RWxCWVFDSUlBUVlHQUdFSEJBSUFBRXROQUFVRkEyRUFBd05KVFFBQ0FnRmhBQUVCVlFGT0cwdXdJVkJZUUNZQUFBQkxUUWdCQmdZRVlRY0JCQVJUVFFBRkJRTmhBQU1EU1UwQUFnSUJZUUFCQVZVQlRodEFKQUFGQUFNQ0JRTnBBQUFBUzAwSUFRWUdCR0VIQVFRRVUwMEFBZ0lCWVFBQkFWVUJUbGxaUUJVZUhnQUFIaW9lS1NRaUFCMEFIQ1FrSXhRSkNob3JBQllYTXpjekVSUUdJeUltSnpjV016STJOVFVHSXlJbUpqVTBOall6QmdZVkZCWXpNalkzTlNZbUl3RlVUUm9FRmptQmJ6MW5KQ1ZCWFVkV1FscERiRDVHY1VBNlgxWkZLVWtjRlVBc0Foa2ZHaXorQlhaekloeEVNa0JFVVQ0OGRGQldlRHhSWGxsVVhTTWo2UmtnLy84QUxmOG9BZzRDeXdBaUFQRUFBQUFDQXhweEFBQUEvLzhBTGY4b0FnNEN4d0FpQVBFQUFBQURBd2NCeUFBQS8vOEFMZjhvQWc0Q3pnQWlBUEVBQUFBREF3WUJ5d0FBQUFNQUxmOG9BZzRDMmdBREFDRUFMZ0RSUUJjR0FRZ0NLeW9DQndnWEFRVUhFUUVFQlJBQkF3UUZURXV3RWxCWVFDd0FBQUFCWHdBQkFVcE5DZ0VJQ0FKaENRWUNBZ0pMVFFBSEJ3VmhBQVVGU1UwQUJBUURZUUFEQTFVRFRodExzQ0ZRV0VBd0FBQUFBVjhBQVFGS1RRQUNBa3ROQ2dFSUNBWmhDUUVHQmxOTkFBY0hCV0VBQlFWSlRRQUVCQU5oQUFNRFZRTk9HMEF1QUFjQUJRUUhCV2tBQUFBQlh3QUJBVXBOQUFJQ1MwMEtBUWdJQm1FSkFRWUdVMDBBQkFRRFlRQURBMVVEVGxsWlFCY2lJZ1FFSWk0aUxTZ21CQ0VFSUNRa0l4VVJFQXNLSENzQkl6Y3pCaFlYTXpjekVSUUdJeUltSnpjV016STJOVFVHSXlJbUpqVTBOall6QmdZVkZCWXpNalkzTlNZbUl3RlNVQ2d0QTAwYUJCWTVnVzg5WnlRbFFWMUhWa0phUTJ3K1JuRkFPbDlXUlNsSkhCVkFMQUpCbWNFZkdpeitCWFp6SWh4RU1rQkVVVDQ4ZEZCV2VEeFJYbGxVWFNNajZSa2cvLzhBTGY4b0FnNEN6Z0FpQVBFQUFBQURBeFFBeGdBQUFBRUFVUUFBQWdZQzhBQVNBRW0yRGdBQ0FRSUJURXV3SFZCWVFCWUFCQVJLVFFBQ0FnQmhBQUFBVTAwREFRRUJTUUZPRzBBV0FBSUNBR0VBQUFCVFRRQUVCQUZmQXdFQkFVa0JUbG0zRVJJakV5SUZDaHNyRXpZMk16SVdGUkVqRVRRbUl5SUhFU01STTZvbVVUUk5aRnBBTWxFK1dsa0J4QzBvVzFiK21BRlRQalpnL3BrQzhBQUJBQ0VBQUFJR0F2QUFHZ0NWdGhjS0FnQUJBVXhMc0JaUVdFQWpBQVVGU2swSEFRTURCRjhHQVFRRVNFMEFBUUVJWVFrQkNBaFRUUUlCQUFCSkFFNGJTN0FkVUZoQUlRWUJCQWNCQXdnRUEyY0FCUVZLVFFBQkFRaGhDUUVJQ0ZOTkFnRUFBRWtBVGh0QUlRWUJCQWNCQXdnRUEyY0FBUUVJWVFrQkNBaFRUUUFGQlFCZkFnRUFBRWtBVGxsWlFCRUFBQUFhQUJrUkVSRVJFUklqRXdvS0hpc0FGaFVSSXhFMEppTWlCeEVqRVNNMU16VXpGVE1WSXhVMk5qTUJvbVJhUURKUlBsb3dNRmx0YlNaUk5BSVpXMWIrbUFGVFBqWmcvcGtDYnpaTFN6YXJMU2dBQUFELy8vL3pBQUFDQmdPeUFDSUE5d0FBQVFjREpRRWZBRFFBQ0xFQkFiQTBzRFVyQUFELy93QkVBQUFBdXdMT0FDSUErd0FBQUFNREFRRC9BQUFBQVFCU0FBQUFyQUlNQUFNQUUwQVFBQUFBUzAwQUFRRkpBVTRSRUFJS0dDc1RNeEVqVWxwYUFnejk5UC8vQUVvQUFBRURBc2dBSWdEN0FBQUFBd01EQVVJQUFQLy8vKzBBQUFFUEFzc0FJZ0Q3QUFBQUF3TUlBUjBBQVAvLy8vRUFBQUVFQXNjQUlnRDdBQUFBQXdNSEFSMEFBUC8vLy9RQUFBRUhBczRBSWdEN0FBQUFBd01HQVNBQUFQLy8vL1lBQUFFR0Fzb0FJZ0Q3QUFBQUFnTVR6Z0FBQVAvL0FFUUFBQUM3QXM0QUlnRDdBQUFBQXdNQkFQOEFBUC8vQUVUL1VRQzdBczRBSWdENkFBQUFBd01QQVF3QUFQLy8vK2tBQUFDc0FzZ0FJZ0Q3QUFBQUF3TUNBT2tBQVAvL0FETUFBQURUQXVZQUlnRDdBQUFBQXdNTUFQc0FBUC8vQUVUL0xnSERBczRBSWdENkFBQUFBd0VKQVAwQUFQLy9BQWNBQUFEM0FxUUFJZ0Q3QUFBQUF3TUxBU0VBQUFBQ0FDei9MZ0M3QXM0QUN3QWZBRUJBUFE4QkFnUUJUQndCQkFGTEJnRUJBUUJoQUFBQVVFMEFCUVZMVFFBRUJFbE5BQUlDQTJFQUF3TlZBMDRBQUJzYUdSZ1RFUTRNQUFzQUNpUUhDaGNyRWlZMU5EWXpNaFlWRkFZakFqTXlOd2NHSXlJbU5UUTJOeU1STXhFakJoVm1JaUlaR1NNakdRWWxEZ29FRWg0cExTa2lKVm9CTWdKYkhod2NIUjBjSEI3OURBSXpDQ29pSUVVaEFnejk5RDh4QUFBQS8vLy8zd0FBQVJVQ3pRQWlBUHNBQUFBQ0F4eTNBQUFBLy8vL3VmOHVBTVlDemdBaUFRb0FBQUFEQXdFQkNnQUFBQUgvdWY4dUFMY0NEQUFOQUNsQUpnSUJBQUVCQVFJQUFrd0FBUUZMVFFBQUFBSmhBd0VDQWxVQ1RnQUFBQTBBREJNakJBb1lLd1luTnhZek1qWTFFVE1SRkFZakpTSVFHaHd3TGxwZlN0SU9TQWNxTXdJeS9iaEpUUUQvLy8rNS95NEJEd0xJQUNJQkNnQUFBQU1EQXdGT0FBRC8vLys1L3k0QkV3TE9BQ0lCQ2dBQUFBTURCZ0VzQUFBQUFRQlJBQUFDRVFMd0FBc0FSYmNKQkFNREFBTUJURXV3SFZCWVFCRUFBZ0pLVFFBREEwdE5BUUVBQUVrQVRodEFGd0FDQWdCZkFRRUFBRWxOQUFNRFMwMEJBUUFBU1FCT1diWVNFUk1SQkFvYUt3RVRJeWNIRlNNUk14RTNNd0VvNlcrMVFscGEybXNCTVA3UTcwaW5BdkQrSWZzQUFBRC8vd0JSL3pJQ0VRTHdBQ0lCRFFBQUFBTURFQUY3QUFBQUFRQlJBQUFBcXdMd0FBTUFLRXV3SFZCWVFBc0FBQUJLVFFBQkFVa0JUaHRBQ3dBQUFBRmZBQUVCU1FGT1diUVJFQUlLR0NzVE14RWpVVnBhQXZEOUVBQUFBUC8vQUVBQUFBRDdBNndBSWdFUEFBQUJCd01qQVQwQU5BQUlzUUVCc0RTd05Tc0FBUC8vQUZFQUFBRXFBdkFBSWdFUEFBQUFBd01GQVZJQUFQLy9BRkgvTWdDckF2QUFJZ0VQQUFBQUF3TVFBTzRBQVAvL0FGRUFBQUZkQXZBQUlnRVBBQUFBQXdLb0FQc0FBQUFCQUFRQUFBRUxBdkFBQ3dBM1FBMEpDQWNHQXdJQkFBZ0FBUUZNUzdBZFVGaEFDd0FCQVVwTkFBQUFTUUJPRzBBTEFBRUJBRjhBQUFCSkFFNVp0QlVVQWdvWUt4TTNGUWNSSXhFSE5UY1JNN0ZhV2xwVFUxb0IyaTFWTGY1N0FWZ3FWU29CUXdBQUFBRUFVUUFBQXkwQ0dRQWlBRmxBQ1I4WUV3b0VBQUVCVEV1d0VsQllRQllEQVFFQkJXRUlCd1lEQlFWTFRRUUNBZ0FBU1FCT0cwQWFBQVVGUzAwREFRRUJCbUVJQndJR0JsTk5CQUlDQUFCSkFFNVpRQkFBQUFBaUFDRWtFUk1qRXlJVENRb2RLd0FXRlJFakVUUWpJZ1lIRVNNUk5DWWpJZ1lIRVNNUk14Y3pOall6TWhZWE5qWXpBdFJaVzFzcVJCeGNOQ2dyUnhkYlJnd0RJRWsxT1VvVklsUTBBaGxkVi82YkFWNXJMekQrbGdGaE56RTBLLzZXQWd4TExpb3RNREVzQUFBQkFGRUFBQUlHQWhrQUV3Qk50aElEQWdJREFVeExzQkpRV0VBVEFBTURBR0VCQVFBQVMwMEZCQUlDQWtrQ1RodEFGd0FBQUV0TkFBTURBV0VBQVFGVFRRVUVBZ0lDU1FKT1dVQU5BQUFBRXdBVEl4TWtFUVlLR2lzekVUTVhNelkyTXpJV0ZSRWpFVFFtSXlJSEVWRStEZ01tVlR4VFhGb3pNR0JBQWd4UUxpOVpWZjZWQVZGQU5XSCttd0FBQVAvL0FGRUFBQUlHQXNnQUlnRVdBQUFBQXdNREFld0FBUC8vQUZFQUFBSUdBc2NBSWdFV0FBQUFBZ01aY3dBQUFQLy9BRkgvTWdJR0Foa0FJZ0VXQUFBQUF3TVFBWllBQUFBQkFGSC9MZ0lHQWhrQUhRQnBRQThjQXdJRkJCRUJBd1VRQVFJREEweExzQkpRV0VBY0FBUUVBR0VCQVFBQVMwMEdBUVVGU1UwQUF3TUNZUUFDQWxVQ1RodEFJQUFBQUV0TkFBUUVBV0VBQVFGVFRRWUJCUVZKVFFBREF3SmhBQUlDVlFKT1dVQU9BQUFBSFFBZEpTTWxKQkVIQ2hzck14RXpGek0yTmpNeUZoVVJGQVlqSWljM0ZqTXlOalVSTkNZaklnY1JVVDRPQXlaV09WVmNYVTB1SUJRYkdDZ3ZNekZmUUFJTVVDNHZXVlgrV1UxSkRFa0pNUzBCZVVFMFlmNmJBQUQvL3dCUkFBQUNCZ0xOQUNJQkZnQUFBQUlESEdFQUFBQUFBZ0F0Ly9NQ0x3SVpBQThBR3dBc1FDa0ZBUU1EQVdFRUFRRUJVMDBBQWdJQVlRQUFBRkVBVGhBUUFBQVFHeEFhRmhRQUR3QU9KZ1lLRnlzQUZoWVZGQVlHSXlJbUpqVTBOall6QmdZVkZCWXpNalkxTkNZakFYTjFSMGQxUlVWMVIwZDFSVXhZV0V4TVdWbE1BaGs4ZTF4Y2V6dzhlMXhjZXp4UVoxeGNaMmhiVzJqLy93QXQvL01DTHdMSUFDSUJIQUFBQUFNREF3SHlBQUQvL3dBdC8vTUNMd0xMQUNJQkhBQUFBQU1EQ0FITkFBRC8vd0F0Ly9NQ0x3TEhBQ0lCSEFBQUFBTURCd0hOQUFELy93QXQvL01DTHdMT0FDSUJIQUFBQUFJREdId0FBQUQvL3dBdC8vTUNMd01xQUNJQkhBQUFBQU1EVGdIUUFBRC8vd0F0LzFFQ0x3TE9BQ0lCSEFBQUFDTUREd0c3QUFBQUF3TUdBZEFBQVAvL0FDMy84d0l2QXlvQUlnRWNBQUFBQXdOUEFkQUFBUC8vQUMzLzh3SXZBemdBSWdFY0FBQUFBd05RQWRBQUFQLy9BQzMvOHdJdkEwa0FJZ0VjQUFBQUF3TlJBZEFBQVAvL0FDMy84d0l2QXNvQUlnRWNBQUFBQWdNVGZRQUFBUC8vQUMzL1VRSXZBaGtBSWdFY0FBQUFBd01QQWJzQUFQLy9BQzMvOHdJdkFzZ0FJZ0VjQUFBQUF3TUNBWmtBQVAvL0FDMy84d0l2QXVZQUlnRWNBQUFBQXdNTUFhc0FBQUFDQUMzLzh3SXZBb0VBR2dBbUFHMUxzQlpRV0xVYUFRUUJBVXdidFJvQkJBSUJURmxMc0JaUVdFQWNBQU1CQTRVQUJBUUJZUUlCQVFGVFRRWUJCUVVBWVFBQUFGRUFUaHRBSUFBREFRT0ZBQUlDUzAwQUJBUUJZUUFCQVZOTkJnRUZCUUJoQUFBQVVRQk9XVUFPR3hzYkpoc2xLUk1pSmlRSENoc3JBQlVVQmdZaklpWW1OVFEyTmpNeUZ4WXpNalkxTlRNVkZBWUhBalkxTkNZaklnWVZGQll6QWk5SGRVVkZkVWRIZFVVWkhpZ1NJQnRMSmlSaFdWbE1URmhZVEFHU2pGeDdQRHg3WEZ4N1BBVUdHaHc5T2lrM0MvNW5hRnRiYUdkY1hHY0EvLzhBTGYvekFpOEN5QUFpQVNvQUFBQURBd01COGdBQS8vOEFMZjlSQWk4Q2dRQWlBU29BQUFBREF3OEJ1d0FBLy84QUxmL3pBaThDeUFBaUFTb0FBQUFEQXdJQm1RQUEvLzhBTGYvekFpOEM1Z0FpQVNvQUFBQURBd3dCcXdBQS8vOEFMZi96QWk4Q3pRQWlBU29BQUFBQ0F4eG5BQUFBLy84QUxmL3pBaThDeWdBaUFSd0FBQUFEQXhjQXBBQUEvLzhBTGYvekFpOENwQUFpQVJ3QUFBQURBd3NCMEFBQUFBTUFMZitsQWk4Q2FBQVhBQjhBSndCSFFFUVZBUUlCSlNRZEhBUURBZ3dKQWdBREEwd1hGZ0lCU2dzS0FnQkpCQUVDQWdGaEFBRUJVMDBGQVFNREFHRUFBQUJSQUU0Z0lCZ1lJQ2NnSmhnZkdCNHFKZ1lLR0NzQkZoWVZGQVlHSXlJbkJ5YzNKaVkxTkRZMk16SVhOeGNFQmhVVUZ4TW1JeEkyTlRRbkF4WXpBY1l4T0VkMVJUWXdNalEwTVRoSGRVVTRNREV6L3VoWU5iQWRKRXhaTjY0ZUlnSHRJblJSWEhzOEVtQWNYaUowVVZ4N1BCTmlHNFJuWEdZekFWQU0vbnBvVzJVMS9xNExBQUFBLy84QUxmL3pBaThDelFBaUFSd0FBQUFDQXh4bkFBQUFBQU1BTGYvekE2WUNHUUFqQUNvQU5nQ3FTN0FkVUZoQUVDQUJCd1lTQ3dJQkFBSk1EQUVCQVVzYlFCQWdBUWNJRWdzQ0FRQUNUQXdCQVFGTFdVdXdIVkJZUUNRTEFRY0FBQUVIQUdjSUFRWUdCR0VLQlFJRUJGTk5EQWtDQVFFQ1lRTUJBZ0pSQWs0YlFDOExBUWNBQUFFSEFHY0FCZ1lFWVFvRkFnUUVVMDBBQ0FnRVlRb0ZBZ1FFVTAwTUNRSUJBUUpoQXdFQ0FsRUNUbGxBSGlzckpDUUFBQ3MyS3pVeEx5UXFKQ29vSmdBakFDSW1KQ1FpRlEwS0d5c0FGaFlWRkFjaEZoWXpNamNYQmdZaklpWW5CZ1lqSWlZbU5UUTJOak15RmhjMk5qTVhKaVlqSWdZSEJqWTFOQ1lqSWdZVkZCWXpBd1pwTndUK2h3Uk9WbGxIS0NScFAwbHhJQnh6UTBKdlEwTndRMEZ5SFJ0c1JJNENUa0ZCVFFTM1ZGUktTVmRXU2dJWlFYRklFU1JEYWp3OElTazhRRDQrUDMxWFYzMC9Qa0JCUGUxTVdWWlA2V2hiWEdkb1cxdG9BQUFBQUFJQVVmOHlBaUFDR1FBVEFDRUFia0FNRnhZUEF3UUZDZ0VBQkFKTVM3QVNVRmhBSFFjQkJRVUNZUVlEQWdJQ1MwMEFCQVFBWVFBQUFGRk5BQUVCVFFGT0cwQWhBQUlDUzAwSEFRVUZBMkVHQVFNRFUwMEFCQVFBWVFBQUFGRk5BQUVCVFFGT1dVQVVGQlFBQUJRaEZDQWJHUUFUQUJJUkV5WUlDaGtyQUJZV0ZSUUdCaU1pSmljVkl4RXpGek0yTmpNR0JnY1JGaFl6TWpZMk5UUW1Jd0dHWVRsRGJrQXJQaHRhUHhJQ0lrNDJQa1FkR2pNbktrd3ZVVHNDR1RwMlZsYURSeEFTNHdMYVN5d3NVREF4L3YwVkVURmRRRjVlQUFJQVVmOHlBaUFDOEFBU0FCOEFja0FNRlJRQkF3UUZEd0VCQkFKTVM3QWRVRmhBSVFZQkF3TktUUWNCQlFVQVlRQUFBRk5OQUFRRUFXRUFBUUZSVFFBQ0FrMENUaHRBSVFZQkF3QURoUWNCQlFVQVlRQUFBRk5OQUFRRUFXRUFBUUZSVFFBQ0FrMENUbGxBRkJNVEFBQVRIeE1lR1JjQUVnQVNFaVlrQ0FvWkt4TVJNelkyTXpJV0ZoVVVCZ1lqSWljVkl4RVNCeEVXRmpNeU5qWTFOQ1lqcHdNZlRUUThZVGxDYmo1VE5GcVZPeG96SnlsTU1GQTdBdkQrMXlncU9uZFhWWUpISWVJRHZ2N1pZZjc4RkJFdlhrRmZYUUFBQUFJQUxmOHlBZ2dDR1FBUkFCNEFjVUFQQVFFRkFCd2JBZ1FGQndFQ0JBTk1TN0FTVUZoQUhRY0JCUVVBWVFZREFnQUFTMDBBQkFRQ1lRQUNBbEZOQUFFQlRRRk9HMEFoQUFBQVMwMEhBUVVGQTJFR0FRTURVMDBBQkFRQ1lRQUNBbEZOQUFFQlRRRk9XVUFVRWhJQUFCSWVFaDBhR0FBUkFCQWlFUk1JQ2hrckFCY3pOek1SSXpVR0l5SW1KalUwTmpZekRnSVZGQllXTXpJM0VTWWpBWGs5QXhrMld6MVRQbTVFU0hFOUlVc3RNa29rU1RvM1J3SVpPQ3Y5SnVzcVFIeFhXbnc5VVN0WVFFTldLREFCR2pvQUFBQUFBUUJSQUFBQllRSVpBQTRBWmt1d0VsQllRQXdOQ1FNREF3SUJUQWdCQUVvYlFBME5DUU1EQXdJQlRBZ0JBQUZMV1V1d0VsQllRQklBQWdJQVlRRUJBQUJMVFFRQkF3TkpBMDRiUUJZQUFBQkxUUUFDQWdGaEFBRUJVMDBFQVFNRFNRTk9XVUFNQUFBQURnQU9JeU1SQlFvWkt6TVJNeGN6TmpNeUZ3Y21JeUlIRVZGRUVBTWxXeVVVRHhvYlVDTUNERTFhRFZFSmNQNnNBQUQvL3dCUkFBQUJZUUxJQUNJQk9BQUFBQU1EQXdHVEFBRC8vd0JCQUFBQllRTEhBQ0lCT0FBQUFBSURHUm9BQUFELy93QlIveklCWVFJWkFDSUJPQUFBQUFNREVBRHhBQUFBQVFBdC8vTUJzUUlaQUNrQU5FQXhBZ0VBQXhnREFnSUFGd0VCQWdOTUFBQUFBMkVFQVFNRFUwMEFBZ0lCWVFBQkFWRUJUZ0FBQUNrQUtDVXNKUVVLR1NzQUZoY0hKaVlqSWdZVkZCWVdGeDRDRlJRR0l5SW1KemNXRmpNeU5qVTBKaVluTGdJMU5EWXpBU3BhSGg4ZFNTUXRPQjRzS1RWRk1HOWRObUVoSFI1T0tqYy9IeTBxTkVFdWFWTUNHUm9WUXhJV0tDQVdIeE1ORUNBOU1FcFlIaHRJR1JvdEpCZ2dGQTRSSHprdVJWRUFBQUQvL3dBdC8vTUJzUUxJQUNJQlBBQUFBQU1EQXdHMkFBRC8vd0F0Ly9NQnNRTEhBQ0lCUEFBQUFBSURHVDRBQUFBQUFRQXQveTRCc1FJWkFFTUFVa0JQTkFFSEJqVWdBZ1VISHdFRUJSc0RBZ01BR2c4Q0FnTU9BUUVDQmt3QUFBQURBZ0FEYVFBSEJ3WmhBQVlHVTAwQUJRVUVZUUFFQkZGTkFBSUNBV0VBQVFGVkFVNGxMQ1VUSkNVa0pBZ0tIaXNrQmdjSE5qTXlGaFVVQmlNaUppYzNGaFl6TWpZMU5DWWpJZ2NuTnlZbUp6Y1dGak15TmpVMEppWW5MZ0kxTkRZek1oWVhCeVltSXlJR0ZSUVdGaGNlQWhVQnNWVkpJd2dXSkM4K01CVXJEQXNKSXhBV0hSa1NGUTRhSmpSZElSMGVUaW8zUHg4dEtqUkJMbWxUTVZvZUh4MUpKQzA0SGl3cE5VVXdWbFVMTlFRbUhpY3NEQWd2Q0FzUkVBNFJCaDArQVI0YVNCa2FMU1FZSUJRT0VSODVMa1ZSR2hWREVoWW9JQllmRXcwUUlEMHdBQUQvL3dBdC8vTUJzUUxPQUNJQlBBQUFBQU1EQmdHVUFBRC8vd0F0L3pJQnNRSVpBQ0lCUEFBQUFBTURFQUZuQUFBQUFRQlIvL1VDSUFMOEFESUFiRXV3RmxCWVFBb1dBUUVDRlFFQUFRSk1HMEFLRmdFQkFoVUJBd0VDVEZsTHNCWlFXRUFWQlFFRUFBSUJCQUpwQUFFQkFHRURBUUFBVVFCT0cwQVpCUUVFQUFJQkJBSnBBQU1EU1UwQUFRRUFZUUFBQUZFQVRsbEFFUUFBQURJQU1TOHVLeWtaRnhNUkJnb1dLd0FXRlJRR0J3WUdGUlFXRng0Q0ZSUUdJeUltSnpjV016STJOVFFtSnlZbU5UUTJOelkyTlRRbUl5SUdGUkVqRVRRekFYVm5IaHdTRUJzZUlDa2VZbFVmUFJZU015Z3ZNU2dwSnlVVkZoY1lOVEUzT0Z2TUF2eFVTeXc5SXhnYUR4TWVGaGdwUHl4T1dnMExSUk0yS0NjeUlCNHZJeHNvSEI0dklDMHZSMVg5N2dJUDdRQUFBQUVBR3YvekFWUUNrd0FWQUQxQU9nWUJBUUlTQVFVQUV3RUdCUU5NQUFJQkFvVUVBUUFBQVY4REFRRUJTMDBBQlFVR1lnY0JCZ1pSQms0QUFBQVZBQlFqRVJFU0VSSUlDaHdyRmpVUkl6VXpOVGN6RlRNVkl4RVVGak15TnhjR0kzRlhWeXd2Z0lBWUV4NG5HRE02RFhJQldrMU5Pb2ROL3JZYUdCRkVIUUFBQVFBYS8vTUJWQUtUQUIwQVEwQkFEUUVFQlIwQkNnRUNUQUFGQkFXRkNBRUNDUUVCQ2dJQlp3Y0JBd01FWHdZQkJBUkxUUUFLQ2dCaUFBQUFVUUJPSEJvWEZoRVJFUklSRVJFU0lRc0tIeXNsQmlNaU5UVWpOVE0xSXpVek5UY3pGVE1WSXhVekZTTVZGQll6TWpjQlZETTZkajgvVjFjc0w0Q0FYRndZRXg0bkVCMXltemFKVFUwNmgwMkpOb3NhR0JFQS8vOEFHdi96QVYwQzhBQWlBVU1BQUFBREF3VUJoUUFBQUFFQUd2OHVBVlFDa3dBdkFHTkFZQjBCQkFVcEFRZ0RLaFlDQ1FndEZRSUNDaFFKQWdFQ0NBRUFBUVpNQUFVRUJZVUxBUW9BQWdFS0Ftb0hBUU1EQkY4R0FRUUVTMDBBQ0FnSllRQUpDVkZOQUFFQkFHRUFBQUJWQUU0QUFBQXZBQzRzS3lNUkVSSVJGaVFsSkF3S0h5c0VGaFVVQmlNaUppYzNGaFl6TWpZMU5DWWpJZ2NuTnlZMUVTTTFNelUzTXhVekZTTVJGQll6TWpjWEJnY0hOak1CR0M4K01CVXJEQXNKSXhBV0hSa1NGUTRhSjFWWFZ5d3ZnSUFZRXg0bkdDd3hJUWdXT3lZZUp5d01DQzhJQ3hFUURoRUdIVUVPWVFGYVRVMDZoMDMrdGhvWUVVUVpBek1FQUFELy93QWEveklCVkFLVEFDSUJRd0FBQUFNREVBRk5BQUFBQVFCUi8vUUNBQUlNQUJJQVJiWVNCQUlFQUFGTVM3QVVVRmhBRWdNQkFBQkxUUUFFQkFGaEFnRUJBVWtCVGh0QUZnTUJBQUJMVFFBQkFVbE5BQVFFQW1FQUFnSlJBazVadHlJVEl4RVFCUW9iS3dFekVTTW5CZ1lqSWlZMUVUTVJGRE15TmpjQnAxbEJFeU5UTzAxZFdXRXdTU01DRFAzMFRpd3VYRjRCWHY2M2ZqRXJBQUFBLy84QVVmLzBBZ0FDeUFBaUFVZ0FBQUFEQXdNQjdRQUEvLzhBVWYvMEFnQUN5d0FpQVVnQUFBQURBd2dCeUFBQS8vOEFVZi8wQWdBQ3h3QWlBVWdBQUFBREF3Y0J4d0FBLy84QVVmLzBBZ0FDemdBaUFVZ0FBQUFDQXhoM0FBQUEvLzhBVWYvMEFnQUN5Z0FpQVVnQUFBQUNBeE40QUFBQS8vOEFVZi8wQWdBRFNnQWlBVWdBQUFBREEwWUJ5Z0FBLy84QVVmLzBBZ0FEVGdBaUFVZ0FBQUFEQTBjQnlnQUEvLzhBVWYvMEFnQURTZ0FpQVVnQUFBQURBMFVCeWdBQS8vOEFVZi8wQWdBREtnQWlBVWdBQUFBREEwZ0J5Z0FBLy84QVVmOVJBZ0FDREFBaUFVZ0FBQUFEQXc4QnRRQUEvLzhBVWYvMEFnQUN5QUFpQVVnQUFBQURBd0lCa3dBQS8vOEFVZi8wQWdBQzVnQWlBVWdBQUFBREF3d0JwUUFBQUFFQVVmLzBBbUlDZ1FBYkFGSzNGZ2dGQXdRREFVeExzQlJRV0VBWEFBQURBSVVGQVFNRFMwMEFCQVFCWVFJQkFRRkpBVTRiUUJzQUFBTUFoUVVCQXdOTFRRQUJBVWxOQUFRRUFtRUFBZ0pSQWs1WlFBa2pJaE1qRlJBR0Nod3JBVE1WRkFZSEVTTW5CZ1lqSWlZMUVUTVJGRE15TmpjUk16STJOUUlXVERJd1FSTWpVenROWFZsaE1Fa2pOUjhiQW9FOE1Ea0kvaXhPTEM1Y1hnRmUvcmQrTVNzQmF4b2IvLzhBVWYvMEFtSUN5QUFpQVZVQUFBQURBd01CN1FBQS8vOEFVZjlSQW1JQ2dRQWlBVlVBQUFBREF3OEJ0UUFBLy84QVVmLzBBbUlDeUFBaUFWVUFBQUFEQXdJQmt3QUEvLzhBVWYvMEFtSUM1Z0FpQVZVQUFBQURBd3dCcFFBQS8vOEFVZi8wQW1JQ3pRQWlBVlVBQUFBQ0F4eGlBQUFBLy84QVVmLzBBZ0FDeWdBaUFVZ0FBQUFEQXhjQW5nQUEvLzhBVWYvMEFnQUNwQUFpQVVnQUFBQURBd3NCeXdBQUFBRUFVZjh1QWdBQ0RBQWhBSDFMc0JSUVdFQVBIeEVDQlFRUUFRQUZCd0VCQUFOTUcwQVBIeEVDQlFRUUFRQUZCd0VCQXdOTVdVdXdGRkJZUUJ3R0FRUUVTMDBBQlFVQVlRTUJBQUJKVFFBQkFRSmhBQUlDVlFKT0cwQWdCZ0VFQkV0TkFBQUFTVTBBQlFVRFlRQURBMUZOQUFFQkFtRUFBZ0pWQWs1WlFBb1RJaE1vSXlNUUJ3b2RLeUVqQmhVVU16STNCd1lqSWlZMU5EWTNKd1lHSXlJbU5SRXpFUlF6TWpZM0VUTUNBQkV5SlE0S0JCSWVLUzBxSkJJalV6dE5YVmxoTUVraldUOHhLUUl6Q0NvaUlVZ2dTeXd1WEY0Qlh2NjNmakVyQVd2Ly93QlIvL1FDQUFNQkFDSUJTQUFBQUFNRENRSExBQUQvL3dCUi8vUUNBQUxOQUNJQlNBQUFBQUlESEdJQUFBQUFBUUFPQUFBQ0JnSU1BQVlBRlVBU0FnRUFBRXROQUFFQlNRRk9FUkVSQXdvWkt5VVRNd01qQXpNQkNaMWcxRmpNWVY0QnJ2MzBBZ3dBQUFBQUFRQVRBQUFDL2dJTUFBd0FJRUFkQ2dVQ0FRQUJUQVFEQWdBQVMwMENBUUVCU1FGT0VoRVNFUkVGQ2hzckpSTXpBeU1EQXlNRE14TVRNd0luZ0ZlNFFJU0pRS1piYzRZK2RRR1gvZlFCZy81OUFneitiZ0dTLy84QUV3QUFBdjRDeUFBaUFXRUFBQUFEQXdNQ1J3QUEvLzhBRXdBQUF2NEN6Z0FpQVdFQUFBQURBeGdBMFFBQS8vOEFFd0FBQXY0Q3lnQWlBV0VBQUFBREF4TUEwZ0FBLy84QUV3QUFBdjRDeUFBaUFXRUFBQUFEQXhVQXhRQUFBQUVBRUFBQUFlOENEQUFQQUNCQUhROExCd01FQVFBQlRBTUJBQUJMVFFJQkFRRkpBVTRqRWlNUUJBb2FLd0V6RlFjVEZTTW5CeU0xRXljMU14Y0JlbWl3dldtR2lHakF0bXg1QWd3RCsvNzFBODdPQXdFTitBUytBQUFBQVFBYS95OENHd0lNQUJJQUowQWtFZzhJQXdJQUJ3RUJBZ0pNQXdFQUFFdE5BQUlDQVdJQUFRRlZBVTRVSkNNUUJBb2FLd0V6QXdZR0l5SW5OeFlXTXpJMk56Y0RNeE1CdlY3TUlGOUhMU2tRRENNT0lUc1JDdDFmcWdJTS9kTllXQTFHQkFZeExCc0NIUDVBQUFBQS8vOEFHdjh2QWhzQ3lBQWlBV2NBQUFBREF3TUI0QUFBLy84QUd2OHZBaHNDemdBaUFXY0FBQUFDQXhocUFBQUEvLzhBR3Y4dkFoc0N5Z0FpQVdjQUFBQUNBeE5yQUFBQS8vOEFHdjh2QWhzQ0RBQWlBV2NBQUFBREF3OENLd0FBLy84QUd2OHZBaHNDeUFBaUFXY0FBQUFEQXdJQmhnQUEvLzhBR3Y4dkFoc0M1Z0FpQVdjQUFBQURBd3dCbUFBQS8vOEFHdjh2QWhzQ3BBQWlBV2NBQUFBREF3c0J2Z0FBLy84QUd2OHZBaHNDelFBaUFXY0FBQUFDQXh4VUFBQUFBQUVBS0FBQUFiZ0NEQUFKQUNsQUpnSUJBd0FIQVFJQkFrd0FBd01BWHdBQUFFdE5BQUVCQWw4QUFnSkpBazRTRVJJUUJBb2FLeE1oRlFFaEZTRTFBU0V4QVgzKzRRRXAvbkFCR3Y3dkFneEcvb2hPUWdGN0FQLy9BQ2dBQUFHNEFzZ0FJZ0Z3QUFBQUF3TURBYndBQVAvL0FDZ0FBQUc0QXNjQUlnRndBQUFBQWdNWlF3QUFBUC8vQUNnQUFBRzRBczRBSWdGd0FBQUFBd01VQUpVQUFQLy9BQ0lBQUFJbkF2MEFJZ0R3QUFBQUF3RDZBV3dBQVAvL0FDSUFBQUlMQXYwQUlnRHdBQUFBQXdFUEFXQUFBQUFCQUZYLzlBSUJBa2NBSWdDQ1M3QVZVRmhBRUNJVEVnTUNBd29CQVFJSkFRQUJBMHdiUUJBaUV4SURBZ01LQVFFQ0NRRUVBUU5NV1V1d0ZWQllRQjRBQWdNQkF3SUJnQUFEQXdWaEFBVUZNRTBBQVFFQVlRUUJBQUF4QUU0YlFDSUFBZ01CQXdJQmdBQURBd1ZoQUFVRk1FMEFCQVF0VFFBQkFRQmhBQUFBTVFCT1dVQUpJeE1rRXlRbEJnZ2NLd0VXRmhVVUJpTWlKaWMzRmpNeU5qVTBJelUzTkNZaklnWVZFU01STkRZek1oWVZBVzFEVVdGTUZ6VVVEaVVsS1RLUlpUTXdNemxYYlZsV1lnRXFCMGhCU2x3TENVb1JNU2xmTkc0ck16OCsvb01CaVZ4aVhWWUFBZ0FZQUFBQ0hRSTVBQWNBQ2dBZlFCd0FCQUFCQUFRQmFBQURBeXhOQWdFQUFDMEFUaElSRVJFUUJRZ2JLeUVqSnlNSEl4TXpCd016QWgxYksvc3JXZEJqTW1USmZId0NPVlArM3dBQUFQLy9BQmdBQUFJZEF2VUFJZ0YzQUFBQkJ3TTJBZDBBTFFBSXNRSUJzQzJ3TlNzQUFQLy9BQmdBQUFJZEF2Z0FJZ0YzQUFBQkJ3TTZBYmdBTFFBSXNRSUJzQzJ3TlNzQUFBQUVBQmdBQUFJZEEyd0FBd0FSQUJrQUhBQkpRRVlFQVFJQkF3RUNBNEFBQUFBQkFnQUJad0FEQ3dFRkNRTUZhUUFLQUFjR0NnZG9BQWtKTEUwSUFRWUdMUVpPQkFRY0d4a1lGeFlWRkJNU0JCRUVFQklpRXhFUURBZ2JLd0V6QnlNR0pqY3pCaFl6TWpZbk14WUdJd0VqSnlNSEl4TXpCd016QVNGZ1Z6MFRVUVk0QWk0bEpTMEJPZ1ZTUGdFRld5djdLMW5RWXpKa3lRTnNhWDg2TUJvZEhoa3dPdjE4Zkh3Q09WUCszd0FBLy84QUdQOVJBaDBDK0FBaUFYY0FBQUFqQTBFQnFBQUFBUWNET2dHNEFDMEFDTEVEQWJBdHNEVXJBQUFBQkFBWUFBQUNIUU5zQUFNQUVRQVpBQndBVWtCUEJBRUNBQU1BQWdPQUN3RUJBQUFDQVFCbkFBTU1BUVVKQXdWcEFBb0FCd1lLQjJnQUNRa3NUUWdCQmdZdEJrNEVCQUFBSEJzWkdCY1dGUlFURWdRUkJCQU9EUXNKQndZQUF3QURFUTBJRnlzQkZ5TW5GaVkzTXdZV016STJKek1XQmlNQkl5Y2pCeU1UTXdjRE13RUpORDFWTDFFR09BSXVKU1V0QVRvRlVqNEJCVnNyK3l0WjBHTXlaTWtEYkdscDZEb3dHaDBlR1RBNi9YeDhmQUk1VS83ZkFBUUFHQUFBQWgwRGV3QU5BQnNBSXdBbUFGZEFWQU1CQUFFTEFRSUFDZ0VEQWdOTUJBRUNBQU1BQWdPQUFBRUFBQUlCQUdrQUF3c0JCUWtEQldrQUNnQUhCZ29IYUFBSkNTeE5DQUVHQmkwR1RnNE9KaVVqSWlFZ0h4NGRIQTRiRGhvU0lob2lFUXdJR3lzQUppTTFOak15RmhVVUJ5YzJOUVltTnpNR0ZqTXlOaWN6RmdZakFTTW5Jd2NqRXpNSEF6TUJGeVVrQ2hFek9VSWdKRDFSQmpnQ0xpVWxMUUU2QlZJK0FRVmJLL3NyV2RCak1tVEpBejRVS0FFb0lqTWFJUkVXcURvd0doMGVHVEE2L1h4OGZBSTVVLzdmQUFBQUFBUUFHQUFBQWgwRGJBQVlBQ1lBTGdBeEFHNUFheEFCQVFBREFRSURBZ0VGQWdOTUR3RUFTZzRIQWdVQ0JBSUZCSUFBQUEwQkF3SUFBMmtBQVFBQ0JRRUNhUUFFQUFZTEJBWnBBQXdBQ1FnTUNXZ0FDd3NzVFFvQkNBZ3RDRTRaR1FBQU1UQXVMU3dyS2lrb0p4a21HU1lrSWlBZkhSc0FHQUFYSkNRbER3Z1pLeElHQnljMk5qTXlGaGNXRmpNeU5qY1hCaU1pSmljbUppTUhCaFl6TWpZbk14WUdJeUltTndFakp5TUhJeE16QndNejFSY0tLZzR3SEJBY0VnTWJEQkVYRFNZak13OGFFeEVVQ3g0Q0xpVWxMUUU2QlZJK1BsRUdBWTViSy9zcldkQmpNbVRKQXk4VEZCQW9KZ3NLQVE4V0ZSVk9DZ3NKQ0VFYUhSNFpNRG82TVAwU2ZId0NPVlArMy8vL0FCZ0FBQUlkQXZRQUlnRjNBQUFCQndNNUFiZ0FMUUFJc1FJQnNDMndOU3NBQVAvL0FCZ0FBQUlkQXZzQUlnRjNBQUFCQndNNEFic0FMUUFJc1FJQnNDMndOU3NBQUFBRUFCZ0FBQUlkQTFjQUF3QUtBQklBRlFCTlFFb0ZBUUlEQVV3QUF3RUNBUU1DZ0FvRUFnSUlBUUlJZmdBQUFBRURBQUZuQUFrQUJnVUpCbWdBQ0Fnc1RRY0JCUVV0QlU0RUJCVVVFaEVRRHc0TkRBc0VDZ1FLRVJNUkVBc0lHaXNCTXdjakJ5Y0hJemN6RnhNakp5TUhJeE16QndNekFhRmZWejBhT0RaVmN6UnRlbHNyK3l0WjBHTXlaTWtEVjJwdE1EQm5aLzJBZkh3Q09WUCszd0QvL3dBWS8xRUNIUUw3QUNJQmR3QUFBQ01EUVFHb0FBQUJCd000QWJzQUxRQUlzUU1Cc0Myd05Tc0FBQUFFQUJnQUFBSWRBMWNBQXdBS0FCSUFGUUNPdFFVQkFnTUJURXV3REZCWVFDMEFBd0FDQUFNQ2dBc0VBZ0lJQUFKd0NnRUJBQUFEQVFCbkFBa0FCZ1VKQm1nQUNBZ3NUUWNCQlFVdEJVNGJRQzRBQXdBQ0FBTUNnQXNFQWdJSUFBSUlmZ29CQVFBQUF3RUFad0FKQUFZRkNRWm9BQWdJTEUwSEFRVUZMUVZPV1VBZUJBUUFBQlVVRWhFUUR3NE5EQXNFQ2dRS0NRZ0hCZ0FEQUFNUkRBZ1hLd0VYSXljWEp3Y2pOek1YRXlNbkl3Y2pFek1IQXpNQmlEUThWU2M0TmxWek5HMTZXeXY3SzFuUVl6Smt5UU5YYW1yWE1EQm5aLzJBZkh3Q09WUCszd0FBQVAvL0FCZ0FBQUlkQTJVQUlnRjNBQUFCQndOUUFic0FMUUFJc1FJQ3NDMndOU3NBQUFBRUFCZ0FBQUlkQTJ3QUdBQWZBQ2NBS2dDeFFCWVBBUUVBQXdFQ0F3SUJCQUllQVFVRUJFd09BUUJLUzdBS1VGaEFOUUFFQWdVQ0JBV0FEUVlDQlFvQ0JYQUFBQXdCQXdJQUEya0FBUUFDQkFFQ2FRQUxBQWdIQ3dob0FBb0tMRTBKQVFjSExRZE9HMEEyQUFRQ0JRSUVCWUFOQmdJRkNnSUZDbjRBQUF3QkF3SUFBMmtBQVFBQ0JBRUNhUUFMQUFnSEN3aG9BQW9LTEUwSkFRY0hMUWRPV1VBZ0dSa0FBQ29wSnlZbEpDTWlJU0FaSHhrZkhSd2JHZ0FZQUJjbEl5VU9DQmtyRWdZSEp6WTJNeklXRnhZek1qWTNGd1lHSXlJbUp5WW1Jd2MzTXhjakp3Y0JJeWNqQnlNVE13Y0RNOVVZQ2lvUE1Cc1FIUkliRGhJWERDY1NLaHNQR1JNQ0lBNVdjelJ0VVRnMkFUbGJLL3NyV2RCak1tVEpBeTRURkJFb0pnc0tFQmNVRmlZb0Nnc0JFSzVuWnpBdy9ZQjhmQUk1VS83ZkFBQUEvLzhBR0FBQUFoMEM5d0FpQVhjQUFBRUhBek1CdXdBdEFBaXhBZ0t3TGJBMUt3QUEvLzhBR1A5UkFoMENPUUFpQVhjQUFBQURBMEVCcUFBQS8vOEFHQUFBQWgwQzlRQWlBWGNBQUFFSEF6VUJoQUF0QUFpeEFnR3dMYkExS3dBQS8vOEFHQUFBQWgwREV3QWlBWGNBQUFFSEF6NEMrd0F0QUFpeEFnR3dMYkExS3dBQS8vOEFHQUFBQWgwQzBRQWlBWGNBQUFFSEF6MEJ2QUF0QUFpeEFnR3dMYkExS3dBQUFBSUFHUDh1QWgwQ09RQVdBQmtBTWtBdkRBRURBZ01CQUFNQ1RBQUdBQUlEQmdKb0FBQUFBUUFCWlFBRUJDeE5CUUVEQXkwRFRoUVJFUkVXSXlBSENCMHJCRE15TndjR0l5SW1OVFEyTnljakJ5TVRNeE1qQmhVREF6TUJ2aVVPQ2dRU0hpa3RLeVVxK3l0WjBHUFNMVEtsWk1tWkFqTUlLaUlpUnlGNGZBSTUvY2MvTVFKVy90OEFBQUQvL3dBWUFBQUNIUU11QUNJQmR3QUFBUWNET3dHOEFDMEFDTEVDQXJBdHNEVXJBQUQvL3dBWUFBQUNIUUw2QUNJQmR3QUFBUWNEUEFHNkFDMEFDTEVDQWJBdHNEVXJBQUFBQWdBWUFBQUNud0k1QUE4QUVnQkNRRDhRQVFFQUFVd0FBUUFDQ0FFQ1p3QUlBQVVEQ0FWbkFBQUFCMThKQVFjSExFMEFBd01FWHdZQkJBUXRCRTRBQUJJUkFBOEFEeEVSRVJFUkVSRUtDQjByQVJVakZUTVZJeFV6RlNFMUl3Y2pBUmNETXdLZjlOUFQ5UDYxcGpsZEFSTXBoSVFDT1V5alRxOU5mSHdDT1ZmKzR3QUFBd0JWQUFBQjhBSTVBQTBBRmdBZUFEeEFPUTBCQlFJQlRBQUNBQVVFQWdWbkJnRURBd0ZmQUFFQkxFMEhBUVFFQUY4QUFBQXRBRTRZRnc0T0hSc1hIaGdlRGhZT0ZTWWhKQWdJR1NzQUZoVVVCaU1qRVRNeUZoVVVCeWNWTXpJMk5UUW1JeE15TlRRbUl5TVZBYlE4WlZiZ3YxcGNUYzloTURFeE1CUnRNRGw1QVNKR1BFcFdBamxIUmxVcXdha3dLU29tL2x4ZUt5NjNBQUFBQVFBdC8vTUIrd0pIQUJrQU5FQXhBUUVBQXcwQ0FnRUFEZ0VDQVFOTUFBQUFBMkVFQVFNRE1FMEFBUUVDWVFBQ0FqRUNUZ0FBQUJrQUdDUWtKQVVJR1NzQUZ3Y21KaU1pQmhVVUZqTXlOeGNHQmlNaUppWTFORFkyTXdHb1RTa2JSQ1ZVYUdsVVIwY2tIbUk4U24xTFRIeEpBa2MrUVJVYmJtNXJjRFZER2laQmhXSmtoMEVBLy84QUxmL3pBZnNDOVFBaUFaQUFBQUVIQXpZQitBQXRBQWl4QVFHd0xiQTFLd0FBLy84QUxmL3pBZnNDOUFBaUFaQUFBQUVIQXprQjBnQXRBQWl4QVFHd0xiQTFLd0FBQUFFQUxmOHVBZnNDUndBekFGWkFVeUFCQkFNc0lRSUZCQzBXQWdZRk1SVUNBZ2NVQ1FJQkFnZ0JBQUVHVEFnQkJ3QUNBUWNDYVFBQkFBQUJBR1VBQkFRRFlRQURBekJOQUFVRkJtRUFCZ1l4Qms0QUFBQXpBRElVSkNRcUpDVWtDUWdkS3dRV0ZSUUdJeUltSnpjV0ZqTXlOalUwSmlNaUJ5YzNMZ0kxTkRZMk16SVhCeVltSXlJR0ZSUVdNekkzRndZR0J3YzJNd0Z3TUQ0eEZTc01EQWtpRUJjY0dSRVdEaGttUTIxQlRIeEphazBwRzBRbFZHaHBWRWRISkJ4WU55SUlGanNtSGljc0RBZ3ZDQXNSRUE0UkJoMUFCMFYvVzJTSFFUNUJGUnR1Ym10d05VTVhKZ015QkFELy93QXQvL01CK3dMN0FDSUJrQUFBQVFjRE9BSFZBQzBBQ0xFQkFiQXRzRFVyQUFELy93QXQvL01CK3dMN0FDSUJrQUFBQVFjRE5BRzBBQzBBQ0xFQkFiQXRzRFVyQUFBQUFnQlZBQUFDSUFJNUFBZ0FFUUFzUUNrQUF3TUFYd0FBQUN4TkJRRUNBZ0ZmQkFFQkFTMEJUZ29KQUFBUURna1JDaEVBQ0FBSElRWUlGeXN6RVRNeUZoVVVCaU1uTWpZMU5DWWpJeEZWc29PV21JRU5abVJrWmtzQ09ZZVFrNDlOWkhCdFgvNWdBQUFDQUNVQUFBSWdBamtBREFBWkFEOUFQQVlCQXdjQkFnUURBbWNBQlFVQVh3Z0JBQUFzVFFrQkJBUUJYd0FCQVMwQlRnNE5BUUFZRnhZVkZCSU5HUTRaQ3dvSkNBY0ZBQXdCREFvSUZpc0JNaFlWRkFZakl6VWpOVE1SRXpJMk5UUW1JeU1WTXhVakZRRUhnNWFZZ2JJd01LVm1aR1JtUzJ4c0FqbUhrSk9QL1RZQkJ2NFVaSEJ0WDdvMnNBQUFBUC8vQUZVQUFBSWdBdlFBSWdHV0FBQUJCd001QWJnQUxRQUlzUUlCc0Myd05Tc0FBUC8vQUNVQUFBSWdBamtBQWdHWEFBQUFBUUJWQUFBQndnSTVBQXNBS1VBbUFBTUFCQVVEQkdjQUFnSUJYd0FCQVN4TkFBVUZBRjhBQUFBdEFFNFJFUkVSRVJBR0NCd3JJU0VSSVJVaEZUTVZJeFVoQWNMK2t3RnQvdTMwOUFFVEFqbE1vMDJ3QUFBQS8vOEFWUUFBQWNJQzlRQWlBWm9BQUFFSEF6WUIwd0F0QUFpeEFRR3dMYkExS3dBQS8vOEFWUUFBQWNJQytBQWlBWm9BQUFFSEF6b0JyZ0F0QUFpeEFRR3dMYkExS3dBQS8vOEFWUUFBQWNJQzlBQWlBWm9BQUFFSEF6a0JyUUF0QUFpeEFRR3dMYkExS3dBQS8vOEFWUUFBQWNJQyt3QWlBWm9BQUFFSEF6Z0JzUUF0QUFpeEFRR3dMYkExS3dBQS8vOEFWUUFBQWZZRFZ3QWlBWm9BQUFFSEEwNEJzUUF0QUFpeEFRS3dMYkExS3dBQS8vOEFWZjlSQWNJQyt3QWlBWm9BQUFBakEwRUJxZ0FBQVFjRE9BR3hBQzBBQ0xFQ0FiQXRzRFVyQUFELy93QlZBQUFCd2dOWEFDSUJtZ0FBQVFjRFR3R3hBQzBBQ0xFQkFyQXRzRFVyQUFELy93QlZBQUFCeWdOVkFDSUJtZ0FBQVFjRFVBR3dBQjBBQ0xFQkFyQWRzRFVyQUFELy93QlZBQUFCd2dOMkFDSUJtZ0FBQVFjRFVRR3hBQzBBQ0xFQkFyQXRzRFVyQUFELy93QlZBQUFCd2dMM0FDSUJtZ0FBQVFjRE13R3dBQzBBQ0xFQkFyQXRzRFVyQUFELy93QlZBQUFCd2dMN0FDSUJtZ0FBQVFjRE5BR1BBQzBBQ0xFQkFiQXRzRFVyQUFELy93QlYvMUVCd2dJNUFDSUJtZ0FBQUFNRFFRR3FBQUQvL3dCVkFBQUJ3Z0wxQUNJQm1nQUFBUWNETlFGNUFDMEFDTEVCQWJBdHNEVXJBQUQvL3dCVkFBQUJ3Z01UQUNJQm1nQUFBUWNEUGdMd0FDMEFDTEVCQWJBdHNEVXJBQUQvL3dCVkFBQUJ3Z0xSQUNJQm1nQUFBUWNEUFFHeEFDMEFDTEVCQWJBdHNEVXJBQUFBQVFCVi95NEJ6UUk1QUJvQVEwQkFBUUVIQVFGTUZnRUJBVXNBQkFBRkJnUUZad2dCQndBQUJ3QmxBQU1EQWw4QUFnSXNUUUFHQmdGZkFBRUJMUUZPQUFBQUdnQVpFUkVSRVJFVkl3a0lIU3NFTndjR0l5SW1OVFEyTnlFUklSVWhGVE1WSXhVaEZRWVZGRE1Cd3dvRUVoNHBMU2tpL3NjQmJmN3Q5UFFCRXpJbG1RSXpDQ29pSUVVaEFqbE1vMDJ3VFQ4eEtRQUFBUC8vQUZVQUFBSENBdm9BSWdHYUFBQUJCd004QWE4QUxRQUlzUUVCc0Myd05Tc0FBQUFDQUMzLzh3STJBa2NBR0FBZkFFQkFQUlVCQWdNVUFRRUNBa3dBQVFBRUJRRUVad0FDQWdOaEJnRURBekJOQndFRkJRQmhBQUFBTVFCT0dSa0FBQmtmR1I0Y0d3QVlBQmNpRlNZSUNCa3JBQllXRlJRR0JpTWlKaVkxTkRjaEppWWpJZ1lISnpZMk14STJOeUVXRmpNQmVYcERSbmhLU25WQ0F3R3BDRjFSSzA4aEt5aHFPRkZZQ1A2c0JGeEtBa2RGaFZ4ZWlVZEZnRlVZR1ZsZ0d4ZERIaUg5K2w5WVVHY0FBQUFBQVFCVkFBQUJ1Z0k1QUFrQUkwQWdBQU1BQkFBREJHY0FBZ0lCWHdBQkFTeE5BQUFBTFFCT0VSRVJFUkFGQ0Jzck15TVJJUlVoRlRNVkk2eFhBV1grOHUvdkFqbE13azRBQVFBdC8vUUNFZ0pGQUJ3QU8wQTREd0VEQWhBQkFBTWFBUVFGQWdFQkJBUk1BQUFBQlFRQUJXY0FBd01DWVFBQ0FqQk5BQVFFQVdFQUFRRXhBVTRTSkNNbUl4QUdDQndyQVRNVkJnWWpJaVltTlRRMk5qTXlGd2NtSXlJR0ZSUVdNekkzTlNNQkorc2dkMEZKZWtwTGZreHJWeXhGVkZkZ1lsaEFPNVlCUHYwZkxqK0dZMldGUHo5RU0yOW9hbkloa3dBQS8vOEFMZi8wQWhJQytBQWlBYTRBQUFFSEF6b0Iwd0F0QUFpeEFRR3dMYkExS3dBQS8vOEFMZi8wQWhJQzlBQWlBYTRBQUFFSEF6a0Iwd0F0QUFpeEFRR3dMYkExS3dBQS8vOEFMZi8wQWhJQyt3QWlBYTRBQUFFSEF6Z0IxZ0F0QUFpeEFRR3dMYkExS3dBQS8vOEFMZjh5QWhJQ1JRQWlBYTRBQUFBREEwSUJ2Z0FBLy84QUxmLzBBaElDK3dBaUFhNEFBQUVIQXpRQnRRQXRBQWl4QVFHd0xiQTFLd0FBQUFFQVZRQUFBaUlDT1FBTEFDZEFKQVlCQlFBQ0FRVUNad1FCQUFBc1RRTUJBUUV0QVU0QUFBQUxBQXNSRVJFUkVRY0lHeXNCTlRNUkl6VWhGU01STXhVQnhseGMvdWxhV2dFOS9QM0g3dTRDT2Z3QUFBSUFKd0FBQWs0Q09RQVRBQmNBTmtBekNBWUNBQXNGQWdFS0FBRm5BQW9BQXdJS0EyY0pBUWNITEUwRUFRSUNMUUpPRnhZVkZCTVNFUkVSRVJFUkVSRVFEQWdmS3dFekZTTVJJelVoRlNNUkl6VXpOVE1WSVRVekJTRTFJUUlpTEN4Yy91bGFMaTVhQVJkYy9vMEJGLzdwQWRZOC9tYnU3Z0dhUEdOalkveGRBQUFBLy84QVZRQUFBaUlDK3dBaUFiUUFBQUVIQXpnQjNRQXRBQWl4QVFHd0xiQTFLd0FBQUFFQVZRQUFBSzRDT1FBREFCTkFFQUFBQUN4TkFBRUJMUUZPRVJBQ0NCZ3JFek1SSTFWWldRSTUvY2YvL3dCVkFBQUFyZ0k1QUFJQnR3QUEvLzhBVHdBQUFRZ0M5UUFpQWJjQUFBRUhBellCUndBdEFBaXhBUUd3TGJBMUt3QUEvLy8vOGdBQUFSUUMrQUFpQWJjQUFBRUhBem9CSWdBdEFBaXhBUUd3TGJBMUt3QUEvLy8vOVFBQUFRZ0M5QUFpQWJjQUFBRUhBemtCSVFBdEFBaXhBUUd3TGJBMUt3QUEvLy8vK0FBQUFRc0Mrd0FpQWJjQUFBRUhBemdCSkFBdEFBaXhBUUd3TGJBMUt3QUEvLy8vK2dBQUFRb0M5d0FpQWJjQUFBRUhBek1CSkFBdEFBaXhBUUt3TGJBMUt3QUEvLzhBU0FBQUFMOEMrd0FpQWJjQUFBRUhBelFCQXdBdEFBaXhBUUd3TGJBMUt3QUEvLzhBVGY5UkFMWUNPUUFpQWJjQUFBQURBMEVCRHdBQS8vLy83UUFBQUs0QzlRQWlBYmNBQUFFSEF6VUE3UUF0QUFpeEFRR3dMYkExS3dBQS8vOEFOd0FBQU5jREV3QWlBYmNBQUFFSEF6NENaQUF0QUFpeEFRR3dMYkExS3dBQS8vOEFWZi96QWlrQ09RQWlBYmNBQUFBREFjWUJBd0FBLy84QUN3QUFBUHNDMFFBaUFiY0FBQUVIQXowQkpRQXRBQWl4QVFHd0xiQTFLd0FBQUFFQUx2OHVBTGdDT1FBVEFDMUFLZ0VCQXdFQlRBNEJBUUZMQkFFREFBQURBR1VBQWdJc1RRQUJBUzBCVGdBQUFCTUFFaEVWSXdVSUdTc1dOd2NHSXlJbU5UUTJOeU1STXhFakJoVVVNNjRLQkJJZUtTMHBJaVJaQVRJbG1RSXpDQ29pSUVVaEFqbjl4ejh4S1FBQUFQLy8vK2dBQUFFZUF2b0FJZ0czQUFBQkJ3TThBU01BTFFBSXNRRUJzQzJ3TlNzQUFQLy9BQWYvOHdFbUFqa0FBZ0hIQUFBQUFRQUgvL01CSmdJNUFBd0FJMEFnQlFFQkFnUUJBQUVDVEFBQ0FqaE5BQUVCQUdJQUFBQkFBRTRUSXlFRENSa3JKUlFqSWljM0ZqTXlOalVSTXdFbXdENGhDeDRuTjBCWXFMVU1UQWcwTkFHT0FBRC8vd0FILy9NQmdBTDFBQ0lCeHdBQUFRY0ROZ0cvQUMwQUNMRUJBYkF0c0RVckFBRC8vd0FILy9NQmhBTDdBQ0lCeGdBQUFRY0RPQUdkQUMwQUNMRUJBYkF0c0RVckFBQUFBUUJWQUFBQ0dnSTVBQXNBSDBBY0NRUURBd0FDQVV3REFRSUNMRTBCQVFBQUxRQk9FaEVURVFRSUdpc0JFeU1uQnhVakVUTVJFek1CSWZsMHZ6aGFXdWx2QVRQK3pmQS9zUUk1L3VjQkdmLy9BRlgvTWdJYUFqa0FJZ0hLQUFBQUF3TkNBYU1BQUFBQkFGVUFBQUcvQWprQUJRQVpRQllBQUFBc1RRQUJBUUpnQUFJQ0xRSk9FUkVRQXdnWkt4TXpFU0VWSVZWWUFSTCtsZ0k1L2haUC8vOEFWUUFBQWI4QzlRQWlBY3dBQUFFSEF6WUJaZ0F0QUFpeEFRR3dMYkExS3dBQS8vOEFWUUFBQWI4Q09RQWlBY3dBQUFFSEF3VUJndjlKQUFteEFRRzQvMG13TlNzQS8vOEFWZjh5QWI4Q09RQWlBY3dBQUFBREEwSUJqUUFBLy84QVZRQUFBYjhDT1FBaUFjd0FBQUFEQXNrQjFnQUFBQUVBRndBQUFjc0NPUUFOQUNaQUl3ME1Dd2dIQmdVQUNBQUNBVXdBQWdJc1RRQUFBQUZnQUFFQkxRRk9GUkVSQXdnWkt4TVZJUlVoTlFjMU56VXpGVGNWdVFFUy9wWktTbGhXQVJ2TVQvd1pRUnI3M1I1Q0FBQUJBRlVBQUFLaEFqa0FEQUJNUzdBYlVGaTJDQVVDQVFBQlRCdTJDQVVDQWdBQlRGbExzQnRRV0VBT0JBRUFBQ3hOQXdJQ0FRRXRBVTRiUUJJRUFRQUFMRTBBQWdJdFRRTUJBUUV0QVU1WnR4RVNFaEVSQlFnYkt5VVRNeEVqRVFNakF4RWpFVE1CZnN0WVdMRTN1Vk5iZkFHOS9jY0JtdjV2QVpIK1pnSTVBQUVBVlFBQUFqSUNPUUFKQUI1QUd3VUFBZ0VBQVV3REFRQUFMRTBDQVFFQkxRRk9FUklSRVFRSUdpc2xFVE1SSXdFUkl4RXpBZHBZVWY3TFYxR1BBYXI5eHdHay9sd0NPUUFBQVAvL0FGVUFBQUl5QXZVQUlnSFRBQUFCQndNMkFnVUFMUUFJc1FFQnNDMndOU3NBQVAvL0FGVUFBQUl5QXZRQUlnSFRBQUFCQndNNUFlQUFMUUFJc1FFQnNDMndOU3NBQVAvL0FGWC9NZ0l5QWprQUlnSFRBQUFBQXdOQ0FjZ0FBQUFCQUZYL013SXlBamtBRkFBdVFDc1VEdzREQXdBSUFRSURCd0VCQWdOTUFBSUFBUUlCWlFRQkFBQXNUUUFEQXkwRFRoRVZJeU1RQlFnYkt3RXpFUlFHSXlJbk54WXpNalkxTlFFUkl4RXpBUUhhV0dGb09Cc0xIaUZBTy83UlYxRUJOQUk1L2FoWFZ3dEpCak0xSHdHYy9sd0NPZjVXQVAvL0FGVUFBQUl5QXZvQUlnSFRBQUFCQndNOEFlSUFMUUFJc1FFQnNDMndOU3NBQUFBQ0FDMy84d0pqQWtjQUR3QWNBQ3hBS1FBQ0FnQmhBQUFBTUUwRkFRTURBV0VFQVFFQk1RRk9FQkFBQUJBY0VCc1hGUUFQQUE0bUJnZ1hLeFltSmpVME5qWXpNaFlXRlJRR0JpTStBalUwSmlNaUJoVVVGalAyZ0VsS2dsUlFma2hKZ0ZFNFZpOW1WRmhwYUZZTlI0WmJYSWRKUjRWWlhZbEpVVGRsUTJCeWRHSmtkLy8vQUMzLzh3SmpBdlVBSWdIWkFBQUJCd00yQWcwQUxRQUlzUUlCc0Myd05Tc0FBUC8vQUMzLzh3SmpBdmdBSWdIWkFBQUJCd002QWVnQUxRQUlzUUlCc0Myd05Tc0FBUC8vQUMzLzh3SmpBdlFBSWdIWkFBQUJCd001QWVjQUxRQUlzUUlCc0Myd05Tc0FBUC8vQUMzLzh3SmpBdnNBSWdIWkFBQUJCd000QWVzQUxRQUlzUUlCc0Myd05Tc0FBUC8vQUMzLzh3SmpBMWNBSWdIWkFBQUJCd05PQWVzQUxRQUlzUUlDc0Myd05Tc0FBUC8vQUMzL1VRSmpBdnNBSWdIWkFBQUFJd05CQWRVQUFBRUhBemdCNndBdEFBaXhBd0d3TGJBMUt3QUEvLzhBTGYvekFtTURWd0FpQWRrQUFBRUhBMDhCNndBdEFBaXhBZ0t3TGJBMUt3QUEvLzhBTGYvekFtTURaUUFpQWRrQUFBRUhBMUFCNndBdEFBaXhBZ0t3TGJBMUt3QUFBQVFBTGYvekFtTURiQUFZQUI4QUx3QThBTDFBRmc4QkFRQURBUUlEQWdFRUFoNEJCUVFFVEE0QkFFcExzQXBRV0VBNEFBUUNCUUlFQllBTUJnSUZDQUlGY0FBQUN3RURBZ0FEYVFBQkFBSUVBUUpwQUFrSkNHRU5BUWdJTUUwT0FRb0tCMkVBQndjeEIwNGJRRGtBQkFJRkFnUUZnQXdHQWdVSUFnVUlmZ0FBQ3dFREFnQURhUUFCQUFJRUFRSnBBQWtKQ0dFTkFRZ0lNRTBPQVFvS0IyRUFCd2N4QjA1WlFDWXdNQ0FnR1JrQUFEQThNRHMzTlNBdklDNG9KaGtmR1I4ZEhCc2FBQmdBRnlVakpROElHU3NBQmdjbk5qWXpNaFlYRmpNeU5qY1hCZ1lqSWlZbkppWWpCemN6RnlNbkJ4NENGUlFHQmlNaUppWTFORFkyTXhJMk5qVTBKaU1pQmhVVUZqTUJCUmdLS2c4d0d4QWRFaHNPRWhjTUp4SXFHdzhaRXdJZ0RsWnpORzFST0RhSmZraEpnRkZUZ0VsS2dsUTBWaTltVkZocGFGWURMaE1VRVNnbUN3b1FGeFFXSmlnS0N3RVFybWRuTURBNVI0VlpYWWxKUjRaYlhJZEovZjAzWlVOZ2NuUmlaSGNBLy84QUxmL3pBbU1DOXdBaUFka0FBQUVIQXpNQjZnQXRBQWl4QWdLd0xiQTFLd0FBLy84QUxmOVJBbU1DUndBaUFka0FBQUFEQTBFQjFRQUEvLzhBTGYvekFtTUM5UUFpQWRrQUFBRUhBelVCc3dBdEFBaXhBZ0d3TGJBMUt3QUEvLzhBTGYvekFtTURFd0FpQWRrQUFBRUhBejRES2dBdEFBaXhBZ0d3TGJBMUt3QUFBQUlBTGYvekFtTUNyd0FkQUNvQWJVdXdHRkJZdFIwQkJBRUJUQnUxSFFFRUFnRk1XVXV3R0ZCWVFCd0FBd0VEaFFBRUJBRmhBZ0VCQVRCTkJnRUZCUUJoQUFBQU1RQk9HMEFnQUFNQkE0VUFBZ0lzVFFBRUJBRmhBQUVCTUUwR0FRVUZBR0VBQUFBeEFFNVpRQTRlSGg0cUhpa3FFeUpHSlFjSUd5c0FGaFVVQmdZaklpWW1OVFEyTmpjek16SVhGak15TmpVMU14VVVCZ2NDTmpZMU5DWWpJZ1lWRkJZekFpNDFTWUJSVTRCSlNJRlRBZ0lrSXhRU0lCdExJaUI5Vmk5bVZGaHBhRllCNTNsTVhZbEpSNFpiVzRkSkFRZ0RHaHc5T2ljMURQNDNOMlZEWUhKMFltUjNBQUQvL3dBdC8vTUNZd0wxQUNJQjV3QUFBUWNETmdJTkFDMEFDTEVDQWJBdHNEVXJBQUQvL3dBdC8xRUNZd0t2QUNJQjV3QUFBQU1EUVFIVkFBRC8vd0F0Ly9NQ1l3TDFBQ0lCNXdBQUFRY0ROUUd6QUMwQUNMRUNBYkF0c0RVckFBRC8vd0F0Ly9NQ1l3TVRBQ0lCNXdBQUFRY0RQZ01xQUMwQUNMRUNBYkF0c0RVckFBRC8vd0F0Ly9NQ1l3TDZBQ0lCNXdBQUFRY0RQQUhwQUMwQUNMRUNBYkF0c0RVckFBRC8vd0F0Ly9NQ1l3TDNBQ0lCMlFBQUFRY0ROd0lQQUMwQUNMRUNBckF0c0RVckFBRC8vd0F0Ly9NQ1l3TFJBQ0lCMlFBQUFRY0RQUUhyQUMwQUNMRUNBYkF0c0RVckFBQUFBd0F0LzZjQ1l3S1ZBQmNBSUFBcUFFRkFQaFVCQWdFb0p4c2FCQU1DREFrQ0FBTURUQmNXQWdGS0N3b0NBRWtBQWdJQllRQUJBVEJOQkFFREF3QmhBQUFBTVFCT0lTRWhLaUVwS0NvbUJRZ1pLd0VXRmhVVUJnWWpJaWNISnpjbUpqVTBOall6TWhjM0Z3QVdGeE1tSXlJR0ZSWTJOalUwSmljREZqTUI1RHhEU1lCUk9TMHNPQ3c4UWtxQ1ZEUXNMVGIrZXlRaXVCMGdXR24yVmk4bUlyY2ZJd0lmSklKWFhZbEpFRndhWENXQ1YxeUhTUTlkR2Y1cFd4MEJmd2wwWXRzM1pVTTVXUnYrZnd2Ly93QXQvL01DWXdMNkFDSUIyUUFBQVFjRFBBSHBBQzBBQ0xFQ0FiQXRzRFVyQUFBQUFnQXRBQUFDb1FJNUFCSUFIQUEvUUR3QUF3QUVCUU1FWndZQkFnSUJYd0FCQVN4TkNRY0NCUVVBWHdnQkFBQXRBRTRURXdFQUV4d1RHeFlVRVJBUERnME1Dd29KQndBU0FSSUtDQllySVNJbUpqVTBOall6SVJVakZUTVZJeFV6RlNVUkl5SUdGUlFXRmpNQlBrZDhUazU5U0FGaDhORFE4UDY0RzFOa01GTTBPNEJpWTM4NlRLTk9yMDFKQWFSb1owUmdNUUFBQUFBQ0FGVUFBQUhtQWprQUNnQVRBREJBTFFZQkF3QUJBZ01CWndBRUJBQmZBQUFBTEUwRkFRSUNMUUpPREFzQUFCSVFDeE1NRXdBS0FBb2tJUWNJR0NzekVUTXlGaFVVQmlNakZSTXlOalUwSmlNakZWWEZaR2h0WUcxZ1BVTkRQV0FDT1dOVlZHbkVBUkU3TlRVMzNBQUFBZ0JWQUFBQnlRSTVBQXdBRlFBMFFERUFBUUFGQkFFRlp3Y0JCQUFDQXdRQ1p3QUFBQ3hOQmdFREF5MERUZzROQUFBVUVnMFZEaFVBREFBTUpDRVJDQWdaS3pNUk14VXpNaFlWRkFZakl4VTNNalkxTkNZakl4VlZWMUpoYW14WldFYzhRRDg5UndJNVhXUlVWR2hvdERzMU5EZmJBQUFBQWdBdC8zNENZd0pIQUJFQUhnQXFRQ2NDQVFBQ0FVd0VBd0lBU1FBREF3RmhBQUVCTUUwQUFnSUFZUUFBQURFQVRpVWxKaFVFQ0JvckpBWUhGd2NuTGdJMU5EWTJNeklXRmhVRUZqTXlOalkxTkNZaklnWVZBbU5jVDRnMXkxQjlSa3FDVkZCK1NQNG9hRlk0Vmk5bVZGaHB1WklnUUVsMUFrbUVXVnlIU1VlRldXZDNOMlZEWUhKMFlnQUNBRlVBQUFIOEFqa0FEQUFWQURGQUxnd0JBUVFCVEFBRUFBRUFCQUZuQmdFRkJRTmZBQU1ETEUwQ0FRQUFMUUJPRFEwTkZRMFVKaUVSRVJBSENCc3JJU01uSXhVakVUTXlGUlFHQndNVk16STJOVFFtSXdIOGFYTnhXc3JGTmpUTGFUYzVPRGpPemdJNXJqNWRGQUVSMURrME5ETUFBUC8vQUZVQUFBSDhBdlVBSWdIMUFBQUJCd00yQWM4QUxRQUlzUUlCc0Myd05Tc0FBUC8vQUZVQUFBSDhBdlFBSWdIMUFBQUJCd001QWFvQUxRQUlzUUlCc0Myd05Tc0FBUC8vQUZYL01nSDhBamtBSWdIMUFBQUFBd05DQVpnQUFBQUJBQzcvOHdHNUFrY0FKZ0EwUURFQkFRQURGd0lDQWdBV0FRRUNBMHdBQUFBRFlRUUJBd013VFFBQ0FnRmhBQUVCTVFGT0FBQUFKZ0FsSkN3a0JRZ1pLd0FYQnlZbUl5SUdGUlFXRmhjZUFoVVVCaU1pSmljM0ZqTXlOalUwSmljdUFqVTBOak1CWEU4a0hra2xNamNoTVN3M1F5OXZYak5rSnh4RldUNDZQajgyUXk5bFdnSkhOa0FWRnlzakd5WVpFUlVrUURCTVhCd1pSQ3N0SlNjc0dCVWxRREJJVi8vL0FDNy84d0c1QXZVQUlnSDVBQUFCQndNMkFib0FMUUFJc1FFQnNDMndOU3NBQVAvL0FDNy84d0c1QXZRQUlnSDVBQUFCQndNNUFaVUFMUUFJc1FFQnNDMndOU3NBQUFBQkFDNy9MZ0c1QWtjQVFBQlBRRXd4QVFjR01pQUNCUWNmQVFRRkd3TUNBd0FhRHdJQ0F3NEJBUUlHVEFBQUFBTUNBQU5wQUFJQUFRSUJaUUFIQndaaEFBWUdNRTBBQlFVRVlRQUVCREVFVGlRckpCTWtKU1FrQ0FnZUt5UUdCd2MyTXpJV0ZSUUdJeUltSnpjV0ZqTXlOalUwSmlNaUJ5YzNKaVluTnhZek1qWTFOQ1luTGdJMU5EWXpNaGNISmlZaklnWVZGQllXRng0Q0ZRRzVYMU1pQ0JZa01ENHhGU3NNREFraUVCY2NHUkVXRGhrbUxsY2lIRVZaUGpvK1B6WkRMMlZhWWs4a0hra2xNamNoTVN3M1F5OVZXZ2N6QkNZZUp5d01DQzhJQ3hFUURoRUdIVDhER3haRUt5MGxKeXdZRlNWQU1FaFhOa0FWRnlzakd5WVpFUlVrUURBQUFQLy9BQzcvOHdHNUF2c0FJZ0g1QUFBQkJ3TTRBWmdBTFFBSXNRRUJzQzJ3TlNzQUFQLy9BQzcvTWdHNUFrY0FJZ0g1QUFBQUF3TkNBWFVBQUFBQkFDRUFBQUhsQWprQUJ3QWJRQmdEQVFFQkFGOEFBQUFzVFFBQ0FpMENUaEVSRVJBRUNCb3JFeUVWSXhFakVTTWhBY1MyV0xZQ09VNytGUUhyQUFBQUFRQWhBQUFCNVFJNUFBOEFMMEFzQlFFQkJBRUNBd0VDWndZQkFBQUhYd2dCQndjc1RRQURBeTBEVGdBQUFBOEFEeEVSRVJFUkVSRUpDQjByQVJVakZUTVZJeFVqTlNNMU16VWpOUUhsdGxKU1dFeE10Z0k1VHJzMit2bzJ1MDcvL3dBaEFBQUI1UUwwQUNJQi93QUFBUWNET1FHaUFDMEFDTEVCQWJBdHNEVXJBQUFBQVFBaC95NEI1UUk1QUNJQVFFQTlHZ0lDQkFFWkRnSURCQTBCQWdNRFRBQUJBQVFEQVFScEFBTUFBZ01DWlFnQkJnWUhYd0FIQnl4TkJRRUFBQzBBVGhFUkVSTWtKU1FpRUFrSUh5c2hJd2MyTXpJV0ZSUUdJeUltSnpjV0ZqTXlOalUwSmlNaUJ5YzNJeEVqTlNFVkl3RXZEeW9JRmlRd1BqRVZLd3dNQ1NJUUZ4d1pFUllPR1MwV3RnSEV0ajhFSmg0bkxBd0lMd2dMRVJBT0VRWWRTd0hyVGs0QUFBRC8vd0FoL3pJQjVRSTVBQ0lCL3dBQUFBTURRZ0dHQUFBQUFRQlYvL01DRXdJNUFCRUFHMEFZQXdFQkFTeE5BQUlDQUdFQUFBQXhBRTRUSXhNaUJBZ2FLeVVVQmlNaUpqVVJNeEVVRmpNeU5qVVJNd0lUZldKaGZsaEdRVUpHVjgxdmEydHZBV3oraURoRlJUZ0JlQUFBLy84QVZmL3pBaE1DOVFBaUFnUUFBQUVIQXpZQi9BQXRBQWl4QVFHd0xiQTFLd0FBLy84QVZmL3pBaE1DK0FBaUFnUUFBQUVIQXpvQjF3QXRBQWl4QVFHd0xiQTFLd0FBLy84QVZmL3pBaE1DOUFBaUFnUUFBQUVIQXprQjFnQXRBQWl4QVFHd0xiQTFLd0FBLy84QVZmL3pBaE1DK3dBaUFnUUFBQUVIQXpnQjJRQXRBQWl4QVFHd0xiQTFLd0FBLy84QVZmL3pBaE1DOXdBaUFnUUFBQUVIQXpNQjJRQXRBQWl4QVFLd0xiQTFLd0FBQUFRQVZmL3pBaE1EZHdBREFBOEFHd0F0QUVSQVFRQUFBQUVDQUFGbkJBRUNDd1VLQXdNSEFnTnBDUUVIQnl4TkFBZ0lCbUVBQmdZeEJrNFFFQVFFTFN3cEp5UWpJQjRRR3hBYUZoUUVEd1FPSlJFUURBZ1pLd0V6QnlNR0pqVTBOak15RmhVVUJpTXlKalUwTmpNeUZoVVVCaU1URkFZaklpWTFFVE1SRkJZek1qWTFFVE1CUDJCWFBVRWNIQmNYSEJ3WGxoMGRGeGNiR3hlRmZXSmhmbGhHUVVKR1Z3TjNhWVFiR1JrYkd4a1pHeHNaR1JzYkdSa2Iva052YTJ0dkFXeitpRGhGUlRnQmVBQUFBQVFBVmYvekFoTURld0FHQUJJQUhnQXdBSVcxQlFFQUFRRk1TN0FLVUZoQUtRc0NBZ0VBQXdGd0FBQURBSVVNQmdJREJRRUVCd01FYWdrQkJ3Y3NUUUFLQ2doaEFBZ0lNUWhPRzBBb0N3SUNBUUFCaFFBQUF3Q0ZEQVlDQXdVQkJBY0RCR29KQVFjSExFMEFDZ29JWVFBSUNERUlUbGxBSHhNVEFBQXVMQ2tvSlNNZ0h4TWVFeDBaRnhBT0NnZ0FCZ0FHRVJFTkNCZ3JBUWNqSnpNWE53WTJNeklXRlJRR0l5SW1OVFlXRlJRR0l5SW1OVFEyTXhjekVSUUdJeUltTlJFekVSUVdNekkyTlFHOGFUaHZVemc1d2h3WEZ4d2NGeGNjOXhzYkZ4Y2RIUmN1VjMxaVlYNVlSa0ZDUmdON2JHdzZPcVFiR3hrWkd4c1pOQnNaR1JzYkdSa2J1ZjZVYjJ0cmJ3RnMvb2c0UlVVNEFBUUFWZi96QWhNRGR3QURBQThBR3dBdEFFdEFTQUFBQ2dFQkFnQUJad1FCQWd3RkN3TURCd0lEYVFrQkJ3Y3NUUUFJQ0FaaEFBWUdNUVpPRUJBRUJBQUFMU3dwSnlRaklCNFFHeEFhRmhRRUR3UU9DZ2dBQXdBREVRMElGeXNCSnpNWEJpWTFORFl6TWhZVkZBWWpNaVkxTkRZek1oWVZGQVlqRXhRR0l5SW1OUkV6RVJRV016STJOUkV6QVI1VlhqU1JIQndYRnh3Y0Y1WWRIUmNYR3hzWGhYMWlZWDVZUmtGQ1JsY0REbWxwaEJzWkdSc2JHUmtiR3hrWkd4c1pHUnYrUTI5cmEyOEJiUDZJT0VWRk9BRjRBQUFBQkFCVi8vTUNFd05YQUFNQUR3QWJBQzBBUkVCQkFBQUFBUUlBQVdjRUFRSUxCUW9EQXdjQ0Eya0pBUWNITEUwQUNBZ0dZUUFHQmpFR1RoQVFCQVF0TENrbkpDTWdIaEFiRUJvV0ZBUVBCQTRsRVJBTUNCa3JFek1WSXhZbU5UUTJNeklXRlJRR0l6SW1OVFEyTXpJV0ZSUUdJeE1VQmlNaUpqVVJNeEVVRmpNeU5qVVJNNy93OEFzY0hCY1hIQndYbGgwZEZ4Y2JHeGVGZldKaGZsaEdRVUpHVndOWE5wY2JHUmtiR3hrWkd4c1pHUnNiR1JrYi9rTnZhMnR2QVd6K2lEaEZSVGdCZVAvL0FGWC9VUUlUQWprQUlnSUVBQUFBQXdOQkFjRUFBUC8vQUZYLzh3SVRBdlVBSWdJRUFBQUJCd00xQWFJQUxRQUlzUUVCc0Myd05Tc0FBUC8vQUZYLzh3SVRBeE1BSWdJRUFBQUJCd00rQXhrQUxRQUlzUUVCc0Myd05Tc0FBQUFCQUZYLzh3SndBcTRBR2dBblFDUUZBUU1DQVV3QUFBSUFoUVFCQWdJc1RRQURBd0ZoQUFFQk1RRk9JeU1USnhBRkNCc3JBVE1WRkFZSEVSUUdJeUltTlJFekVSUVdNekkyTlJFek1qWTFBaVJNTUMxOVltRitXRVpCUWtZdUh4c0Nyand1T2dqK3kyOXJhMjhCYlA2SU9FVkZPQUY0R2hzQUFBRC8vd0JWLy9NQ2NBTDFBQ0lDRVFBQUFRY0ROZ0g4QUMwQUNMRUJBYkF0c0RVckFBRC8vd0JWLzFFQ2NBS3VBQ0lDRVFBQUFBTURRUUhCQUFELy93QlYvL01DY0FMMUFDSUNFUUFBQVFjRE5RR2lBQzBBQ0xFQkFiQXRzRFVyQUFELy93QlYvL01DY0FNVEFDSUNFUUFBQVFjRFBnTVpBQzBBQ0xFQkFiQXRzRFVyQUFELy93QlYvL01DY0FMNkFDSUNFUUFBQVFjRFBBSFlBQzBBQ0xFQkFiQXRzRFVyQUFELy93QlYvL01DRXdMM0FDSUNCQUFBQVFjRE53SCtBQzBBQ0xFQkFyQXRzRFVyQUFELy93QlYvL01DRXdMUkFDSUNCQUFBQVFjRFBRSGFBQzBBQ0xFQkFiQXRzRFVyQUFBQUFRQlYveTRDRXdJNUFCOEFLa0FuQ3dFQkF3Rk1BQUVBQWdFQ1pRUUJBQUFzVFFBRkJRTmhBQU1ETVFOT0l4TVVJeWNRQmdnY0t3RXpFUlFHQndZVkZETXlOd2NHSXlJbU5UUTNKaVkxRVRNUkZCWXpNalkxQWJ4WFhVd3JKUTRLQkJJZUtTMCtYM3hZUmtGQ1JnSTUvcFJmYVEwN0xTa0NNd2dxSWpsQUFXdHVBV3oraURoRlJUZ0FBUC8vQUZYLzh3SVRBeTRBSWdJRUFBQUJCd003QWRvQUxRQUlzUUVDc0Myd05Tc0FBUC8vQUZYLzh3SVRBdm9BSWdJRUFBQUJCd004QWRnQUxRQUlzUUVCc0Myd05Tc0FBQUFCQUE4QUFBSWVBamtBQmdBVlFCSUNBUUFBTEUwQUFRRXRBVTRSRVJFRENCa3JKUk16QXlNRE13RVpwR0hhVzlwaVpnSFQvY2NDT1FBQUFBQUJBQmNBQUFNc0Fqb0FEQUFnUUIwS0JRSUJBQUZNQkFNQ0FBQXNUUUlCQVFFdEFVNFNFUklSRVFVSUd5c2xFek1ESXdNREl3TXpFeE16QWxaOVdhcFJqcEJScTJCNmpGQjVBY0Q5eHdHNC9rZ0NPZjVDQWIvLy93QVhBQUFETEFMMUFDSUNIUUFBQVFjRE5nSmpBQzBBQ0xFQkFiQXRzRFVyQUFELy93QVhBQUFETEFMN0FDSUNIUUFBQVFjRE9BSkJBQzBBQ0xFQkFiQXRzRFVyQUFELy93QVhBQUFETEFMM0FDSUNIUUFBQVFjRE13SkJBQzBBQ0xFQkFyQXRzRFVyQUFELy93QVhBQUFETEFMMUFDSUNIUUFBQVFjRE5RSUtBQzBBQ0xFQkFiQXRzRFVyQUFBQUFRQWZBQUFDR1FJNUFBc0FIMEFjQ1FZREF3QUNBVXdEQVFJQ0xFMEJBUUFBTFFCT0VoSVNFUVFJR2lzQkV5TW5CeU1UQXpNWE56TUJUY3hzbDVKbHliMXFpSU5uQVNiKzJ1SGhBU2NCRXRYVkFBQUFBUUFRQUFBQjh3STVBQWdBSEVBWkJnTUNBUUFCVEFJQkFBQXNUUUFCQVMwQlRoSVNFUU1JR1NzQkV6TURGU00xQXpNQkNZMWR3RmpMWVFFdEFReitwTjNkQVZ3QUFBRC8vd0FRQUFBQjh3TDFBQ0lDSXdBQUFRY0ROZ0hLQUMwQUNMRUJBYkF0c0RVckFBRC8vd0FRQUFBQjh3TDdBQ0lDSXdBQUFRY0RPQUdvQUMwQUNMRUJBYkF0c0RVckFBRC8vd0FRQUFBQjh3TDNBQ0lDSXdBQUFRY0RNd0duQUMwQUNMRUJBckF0c0RVckFBRC8vd0FRLzFFQjh3STVBQ0lDSXdBQUFBTURRUUdWQUFELy93QVFBQUFCOHdMMUFDSUNJd0FBQVFjRE5RRndBQzBBQ0xFQkFiQXRzRFVyQUFELy93QVFBQUFCOHdNVEFDSUNJd0FBQVFjRFBnTG5BQzBBQ0xFQkFiQXRzRFVyQUFELy93QVFBQUFCOHdMUkFDSUNJd0FBQVFjRFBRR29BQzBBQ0xFQkFiQXRzRFVyQUFELy93QVFBQUFCOHdMNkFDSUNJd0FBQVFjRFBBR21BQzBBQ0xFQkFiQXRzRFVyQUFBQUFRQXBBQUFCelFJNUFBa0FLVUFtQUFFQ0F3VUJBUUFDVEFBQ0FnTmZBQU1ETEUwQUFBQUJYd0FCQVMwQlRoRVNFUkVFQ0JvckFRRWhGU0UxQVNFMUlRSEYvdEFCT1A1Y0FUTCs1d0dEQWZ2K1ZFOC9BYXhPLy84QUtRQUFBYzBDOVFBaUFpd0FBQUVIQXpZQnd3QXRBQWl4QVFHd0xiQTFLd0FBLy84QUtRQUFBYzBDOUFBaUFpd0FBQUVIQXprQm5nQXRBQWl4QVFHd0xiQTFLd0FBLy84QUtRQUFBYzBDK3dBaUFpd0FBQUVIQXpRQmZ3QXRBQWl4QVFHd0xiQTFLd0FBQUFJQU1BRitBV0VDeHdBZ0FDd0FWMEJVRndFREJCWUJBZ01RQVFZQ0pDTUNCUVlGQVFBRkJVd0FCQUFEQWdRRGFRQUNBQVlGQWdacENRY0lBd1VBQUFWWkNRY0lBd1VGQUdFQkFRQUZBRkVoSVFBQUlTd2hLeWNsQUNBQUh5UWtKQ01pQ2dzYkt3RUhCaU1pSndZR0l5SW1OVFEyTXpJWE5UUW1JeUlISnpZMk16SVdGUlVVTXdZMk56VW1JeUlHRlJRV013RmhCQlVSTFF3U05od3VQRVk4SWlZaUlpY3VGUkZBSXpzK0dJNHFEU0FiSWlzZUd3RzBNQVlwRWhjMUt6QXZCeGNrSHhZc0RSUTNOWThZQXhNT053Z1pHaFlYQUFJQUt3RjhBV2dDeHdBTEFCY0FMMEFzQkFFQkJRRURBZ0VEYVFBQ0FBQUNXUUFDQWdCaEFBQUNBRkVNREFBQURCY01GaElRQUFzQUNpUUdDeGNyQUJZVkZBWWpJaVkxTkRZekJnWVZGQll6TWpZMU5DWWpBUkZYVzBkRlZscEhLakV4S0Njd01DY0N4MWhLVGx0WlMwMWFPam94TWpvNk1qRTZBQUFDQUJvQUFBS1NBcndBQXdBR0FCbEFGZ0FBQUJwTkFBSUNBV0FBQVFFYkFVNFNFUkFEQnhrckFUTUJJUUVESVFFZmF3RUkvWWdCT3JzQmRnSzgvVVFDVy8zMEFBRUFOZ0FBQXRZQ3lBQWpBQ3BBSnhRR0FnRUFBVXdBQWdJRllRQUZCUnBOQkFFQUFBRmZBd0VCQVJzQlRpWVJGeWNSRWdZSEhDc0FCZ2N6RlNFMU5qWTFOQ1ltSXlJR0JoVVVGaGNWSVRVekppWTFORFkyTXpJV0ZoVUMxbE0va3Y3OFNWby9iRUpDYlVGYVNQNzhpanhPWVp0WFdKaGRBUStXTFV3K05veHBWSGcrUG5sVlo0NDBQa3dza0dWdm5VOVNtMmdBQUFBQUFRQlIveklDRVFJTUFCTUFWa0FMRXdRQ0JRQUpBUUVGQWt4THNCUlFXRUFYQkFFQUFCeE5BQVVGQVdFQ0FRRUJHMDBBQXdNZUEwNGJRQnNFQVFBQUhFMEFBUUViVFFBRkJRSmhBQUlDSFUwQUF3TWVBMDVaUUFrakVSSWpFUkFHQnh3ckFUTVJJeWNHQmlNaUp4VWpFVE1SRkJZek1qY0J0MXBDRXg5SE1GZ2tXVmxJTmxRN0Fnejk5RXdyTFNyc0F0citzanc5WUFBQkFFZi8rUUpYQWd3QUZBQlR0UWNCQVFBQlRFdXdJbEJZUUJnRkF3SUFBQVpmQUFZR0hFMEFBUUVDWVFRQkFnSWRBazRiUUJ3RkF3SUFBQVpmQUFZR0hFMEFCQVFiVFFBQkFRSmhBQUlDSFFKT1dVQUtFUkVSRWlRVEVBY0hIU3NCSXhFVUZqTXlOd2NHSXlJMUVTTVJJeEVqTlNFQ1Ywb1JGQVVRQnhFaVdzdGFSd0lRQWIvK3FoY1VBandMYXdGYi9rRUJ2MDBBQUFJQU5QL3pBbHNDeVFBUEFCc0FMRUFwQlFFREF3RmhCQUVCQVZCTkFBSUNBR0VBQUFCUkFFNFFFQUFBRUJzUUdoWVVBQThBRGlZR0NoY3JBQllXRlJRR0JpTWlKaVkxTkRZMk13WUdGUlFXTXpJMk5UUW1Jd0dYZTBsS2ZVMU1mRXRMZjA1VllsOVNVMkJiVXdMSlRxRjNlS1pTVDZKM2Q2VlNVWldIaEpPVWlJV1NBQUVBTmdBQUFkNEN2QUFLQUNsQUpna0lCd01BQXdGTUJBRURBMGhOQWdFQUFBRmdBQUVCU1FGT0FBQUFDZ0FLRVJFUkJRb1pLd0VSTXhVaE5UTVJCeWMzQVZhSS9uQ3FvU0hiQXJ6OW1GUlVBZjVKUm0wQUFBQUJBRVFBQUFJNEFzZ0FIUUF0UUNvU0FRSURFUUVBQWdRQkFRQURUQUFDQWdOaEFBTURVRTBBQUFBQlh3QUJBVWtCVGlVcUVSQUVDaG9yTnlFVklUVTNOamMrQWpVMEppTWlCZ2NuTmpZek1oWVdGUlFHQmdlNkFYNytETWNNR0RZNEpGWkhNVjRpSnkxNVFFcHRPaTFPUTFWVlU2NExGQzg0UkNrL1FpSVpReUVxTVZrNk5seFJPZ0FBQUFFQUgvL3pBalFDeVFBbkFFSkFQeVVrQWdNRUJnRUNBeElCQVFJUkFRQUJCRXdBQXdBQ0FRTUNad0FFQkFWaEJnRUZCVkJOQUFFQkFHRUFBQUJSQUU0QUFBQW5BQ1lrSVNNa0xRY0tHeXNBRmhZVkZBWUhGUllXRlJRR0JpTWlKaWMzRmpNeU5qVTBJeU0xTXpJMk5UUW1JeUlISnpZekFYSnNOa1k2UmxwS2dsRklnUzh1Vm5KWVpjUkxSVXBpV0VkaVVpMWxpd0xKTFV3d04xZ1VBd3BhU0Q5ak9Ta2xSVUpNUDN0T1BUY3dQRDg5VXdBQUFBQUNBQzRBQUFKWkFyd0FDZ0FOQURKQUx3c0JBQVFKQVFFQUFrd0ZBUUFEQVFFQ0FBRm5CZ0VFQkVoTkFBSUNTUUpPQUFBTkRBQUtBQW9SRVJFUkJ3b2FLd0VSTXhVakZTTTFJVFVCQndFaEFlNXJhMkQrb0FGckIvOEFBUUFDdlA1SFRMZTNRZ0hEZS83Q0FBQUJBRkgvOHdKQUFyd0FIZ0EvUUR3REFRUUJIUndSQXdNRUVBRUNBd05NQUFFQUJBTUJCR2tBQUFBRlh3WUJCUVZJVFFBREF3SmhBQUlDVVFKT0FBQUFIZ0FlSkNRbEl4RUhDaHNyQVJVaEZUWTJNeklXRlJRR0JpTWlKaWMzRmpNeU5qVTBKaU1pQmdjbkVRSVYvcndoVXl0ZGMwT0FXVUJ0SmloSllWbGtTVUFzVFNoQUFyeFIzUlVWYTJkSmJqd2dJVVF6VlV0RFJSb2RLQUZlQUFBQUFnQXovL01DUkFMSkFCb0FKZ0JGUUVJUUFRSUJFUUVEQWlNWEFnVUVBMHdHQVFNQUJBVURCR2tBQWdJQllRQUJBVkJOQndFRkJRQmhBQUFBVVFCT0d4c0FBQnNtR3lVaEh3QWFBQmtrSlNZSUNoa3JBQllXRlJRR0JpTWlKalUwTmpZek1oY0hKaVlqSWdZSE5qWXpFalkxTkNZaklnWUhGaFl6QVp0cFFFSjJUSDJRVkl0VloxZ29JRkVvWEhVREtHMDRMVnRWUXpaaUlRdFlTd0c5TUdKSVJHNCtyNjJGcVV3MFNCUVhnWlVwTXY2R1YwTkZTelV0WW1ZQUFBQUFBUUFkQUFBQ0VnSzhBQVlBSDBBY0FnRUNBQUZNQUFJQ0FGOEFBQUJJVFFBQkFVa0JUaEVTRUFNS0dTc1RJUlVCSXdFaEhRSDEvc3huQVRiK2NBSzhULzJUQW1jQUFBQUFBd0F6Ly9NQ1B3TEpBQnNBSndBMEFFUkFRUlFHQWdVQ0FVd0FBZ2dCQlFRQ0JXa0hBUU1EQVdFR0FRRUJVRTBBQkFRQVlRQUFBRkVBVGlnb0hCd0FBQ2cwS0RNdkxSd25IQ1lpSUFBYkFCb3NDUW9YS3dBV0ZoVVVCZ2NXRmhVVUJnWWpJaVltTlRRMk55WW1OVFEyTmpNR0JoVVVGak15TmpVMEppTUNCZ1lWRkJZek1qWTFOQ1lqQVlCc096NHlPMDFDZVU1TWRrRlBPek05TzJ0SFFrNVJQejlRVFVJd1RpdGFUMDVaWEVvQ3lTMVROVGhSRWc1bVFqeGZOVFJmUEVGbUVCSlBOelpUTDFBN016VThQRFV6Ty83ZEpEOG9QMGxIUEQ5UkFBQUNBRFAvOHdKRUFza0FHd0FuQUVWQVFoNFFBZ1VFQ2dFQkFna0JBQUVEVEFjQkJRQUNBUVVDYVFBRUJBTmhCZ0VEQTFCTkFBRUJBR0VBQUFCUkFFNGNIQUFBSENjY0ppSWdBQnNBR2lRbEpRZ0tHU3NBRmhVVUJnWWpJaVluTnhZV016STJOd1lHSXlJbUpqVTBOall6RWpZM0ppWWpJZ1lWRkJZekFiV1BVb2xWUUhFakp5WmVMVmh5QkNwd09qdG1Qa0YzVENObEpBcFhUVWxiVWtJQ3lhK3VoYWhNSUJOSUZCWjlraWN3TVdKR1JtOC8vb1F5S21acVYwWkZTZ0FDQUMvLzh3SXBBaGtBRHdBZUFDeEFLUVVCQXdNQllRUUJBUUZUVFFBQ0FnQmhBQUFBVVFCT0VCQUFBQkFlRUIwWUZnQVBBQTRtQmdvWEt3QVdGaFVVQmdZaklpWW1OVFEyTmpNT0FoVVVGaFl6TWpZMk5UUW1Jd0YrYmoxR2RrZEljRDlHZVVneVRDd3BTQzB1U3lwVlJRSVpRM2xPVllGR1JudFBWSDVFVURGWk9qbFlNVE5kTzFWbUFBRUFPUUFBQWJRQ0RBQUtBQ2xBSmdrSUJ3TUFBd0ZNQkFFREEwdE5BZ0VBQUFGZ0FBRUJTUUZPQUFBQUNnQUtFUkVSQlFvWkt3RVJNeFVoTlRNUkJ5YzNBVHQ1L3BTWWhpSEJBZ3orUUV4TUFWOUpQRzRBQUFBQkFDVUFBQUhHQWhrQUdBQXpRREFWQVFJREZBRUFBZ29CQVFBRFRBQUNBZ05oQkFFREExTk5BQUFBQVY4QUFRRkpBVTRBQUFBWUFCY25FUllGQ2hrckFCWVZGQVlIQnlFVklUVTNOalkxTkNZaklnWUhKelkyTXdGTWFFSlhlUUVrL2wraVRrTkNOU2hRSFNNcFp6b0NHVlJLTW1CQlcwMURkenBOS3k0eUhSYzhIaWNBQUFBQUFRQUMvME1CK1FJWkFDZ0FiVUFXSlFFRUJTUUJBd1FGQVFJREVRRUJBaEFCQUFFRlRFdXdIVkJZUUI0QUF3QUNBUU1DYVFBRUJBVmhCZ0VGQlZOTkFBRUJBR0VBQUFCTkFFNGJRQnNBQXdBQ0FRTUNhUUFCQUFBQkFHVUFCQVFGWVFZQkJRVlRCRTVaUUE0QUFBQW9BQ2NrSVNRa0xBY0tHeXNBRmhVVUJnY1ZGaFlWRkFZR0l5SW1KemNXTXpJMk5UUW1JeU0xTXpJMk5UUW1JeUlISnpZMk13Rm5jMGc0UmxsRWVVOUdleW9wVzJOVFhGNVpQemxIV0VVL1VsSWlLSEErQWhsZFREeFlEd01LWFVvL1lUWW9KRUE4VFQwK1AwdytPak00THo4ZEl3QUFBZ0FNLzFBQ09BSU1BQW9BRFFCUFFBb0xBUUFFQ0FFQkFBSk1TN0FoVUZoQUZ3QUNBUUtHQUFRRVMwMEZBUUFBQVY4REFRRUJTUUZPRzBBVkFBSUJBb1lGQVFBREFRRUNBQUZuQUFRRVN3Uk9XVUFKRWhJUkVSRVFCZ29jS3lVekZTTVZJelVoTlFFekJ3RWhBY3hzYkYzK25RRnJWVnIrOXdFSldFbS92MFlCdDIvK3V3QUFBQUVBSlA5REFoNENEQUFlQUdoQUVRTUJCQUVkSEJFREF3UUNUQkFCQXdGTFM3QWRVRmhBSGdBQkFBUURBUVJwQUFBQUJWOEdBUVVGUzAwQUF3TUNZUUFDQWswQ1RodEFHd0FCQUFRREFRUnBBQU1BQWdNQ1pRQUFBQVZmQmdFRkJVc0FUbGxBRGdBQUFCNEFIaVFsSlNNUkJ3b2JLd0VWSVJVMk5qTXlGaFVVQmdZaklpWW5OeFlXTXpJMk5UUW1JeUlISnhFQjlmNjhIRkl0WUhKQ2UxTkRmQ3NvS1dZMFVHQlFQMUJJUHdJTVVOa1RHRzVtUzI4OUtTZElJeVZWVEVaSk9DTUJYZ0FBQWdBei8vTUNPd0xKQUJvQUpnQkZRRUlSQVFJQkVnRURBaU1YQWdVRUEwd0dBUU1BQkFVREJHa0FBZ0lCWVFBQkFWQk5Cd0VGQlFCaEFBQUFVUUJPR3hzQUFCc21HeVVoSHdBYUFCa2tKU1lJQ2hrckFCWVdGUlFHQmlNaUpqVTBOall6TWhZWEJ5WWpJZ1lITmpZekVqWTFOQ1lqSWdZSEZoWXpBWjFrT2o5MVRIeU1WWTVXTUZvY0lFRktYSFVHS0dSQ0tWaFFQenBqSWdwWVRBSE9ObVpFUjNOQnNLSityMWNaRWtjaWhZZ3VOUDUxV2t0SFVUa3laMnNBQUFBQUFRQVYvMUFCNWdJTUFBWUFIMEFjQWdFQ0FBRk1BQUVDQVlZQUFnSUFYd0FBQUVzQ1RoRVNFQU1LR1NzVElSVUJJd0VoRlFIUi9yNWtBVUgrbEFJTVRmMlJBbWtBQUFBQUF3QXQvL1lDSmdMSkFCc0FKd0F6QUVSQVFSUUdBZ1VDQVV3QUFnZ0JCUVFDQldrSEFRTURBV0VHQVFFQlVFMEFCQVFBWVFBQUFGRUFUaWdvSEJ3QUFDZ3pLREl1TEJ3bkhDWWlJQUFiQUJvc0NRb1hLd0FXRmhVVUJnY1dGaFVVQmdZaklpWW1OVFEyTnlZbU5UUTJOak1HQmhVVUZqTXlOalUwSmlNQ0JoVVVGak15TmpVMEppTUJiV1U0T3pjOFVqNTBUazF4TzA4K05ENDZaME05U2swNE4weEdPa2xiVmtsS1YxcEdBc2t0VWpRM1VSTU9aMFk2WERRMFhEcEZaaEFTVURZMVV5NU5PekkwUERzMU1qdisxMDArT2t0TE96MU5BQUlBSS85REFpc0NHUUFaQUNVQWJrQVBIQThDQlFRS0FRRUNDUUVBQVFOTVM3QWRVRmhBSHdjQkJRQUNBUVVDYVFBRUJBTmhCZ0VEQTFOTkFBRUJBR0VBQUFCTkFFNGJRQndIQVFVQUFnRUZBbWtBQVFBQUFRQmxBQVFFQTJFR0FRTURVd1JPV1VBVUdob0FBQm9sR2lRZ0hnQVpBQmdqSkNVSUNoa3JBQllWRkFZR0l5SW1KemNXTXpJMk53WWpJaVltTlRRMk5qTVNOamNtSmlNaUJoVVVGak1CbjR4VmoxYzBZeUVnVVV0Y2R3ZFhkRUZsT2o5MVRDWmlJZ2xaVEVoWVVFSUNHYkNpZnE5WEhCUkhKNE9IWWpabFJFaDFRdjV3T3pGbmJWeE5SMUFBQUFJQU4vL3lBbE1DeVFBUEFCc0FMRUFwQlFFREF3RmhCQUVCQVZCTkFBSUNBR0VBQUFCUkFFNFFFQUFBRUJzUUdoWVVBQThBRGlZR0NoY3JBQllXRlJRR0JpTWlKaVkxTkRZMk13WUdGUlFXTXpJMk5UUW1Jd0dQZTBsSmUwcEtlMGxKZTBwUVcxdFFVRnRiVUFMSlQ2UjZkNk5RVUtOM2VxUlBWWktHaEpHU2c0YVNBQUVBZkFBQUFpWUN2QUFLQUNsQUpna0lCd01BQXdGTUJBRURBMGhOQWdFQUFBRmdBQUVCU1FGT0FBQUFDZ0FLRVJFUkJRb1pLd0VSTXhVaE5UTVJCeWMzQVo2SS9tK3FvaUhiQXJ6OWxWRlJBZ0ZKUm0wQUFQLy9BRXdBQUFKQUFzZ0FBZ0k0Q0FBQUFRQTMvL01DVEFMSUFDb0FSVUJDS0FFRUJTY0JBd1FHQVFJREVnRUJBaEVCQUFFRlRBQURBQUlCQXdKbkFBUUVCV0VHQVFVRlVFMEFBUUVBWVFBQUFGRUFUZ0FBQUNvQUtTUWhKU1V0QndvYkt3QVdGaFVVQmdjVkZoWVZGQVlHSXlJbUp6Y1dGak15TmpZMU5DWWpJelV6TWpZMU5DWWpJZ2NuTmpNQmltdzJSVHRGVzBtQlVVbUNMeTRuWkRnOVZ5MWdZbEJKU21GV1NsNVNMMmVLQXNndFRDMDhWaFFFQ1YxRFFHVTNLU1ZKSGlVbFBpVS9PVkE2T0M4N1AwRlRBQUFBQUFJQUp3QUFBbEFDdkFBS0FBMEFNa0F2RFFFQUJBa0JBUUFDVEFVQkFBTUJBUUlBQVdjR0FRUUVTRTBBQWdKSkFrNEFBQXdMQUFvQUNoRVJFUkVIQ2hvckFSRXpGU01WSXpVaE5RRUJJUkVCNTJscFgvNmZBVy8rOVFEL0FyeitTRTIzdDBRQndmNUlBVGNBQUFFQVVQL3pBajhDdmdBZEFEOUFQQU1CQkFFY0d4QURBd1FQQVFJREEwd0FBUUFFQXdFRWFRQUFBQVZmQmdFRkJVaE5BQU1EQW1FQUFnSlJBazRBQUFBZEFCMGtKQ1lpRVFjS0d5c0JGU0VWTmpNeUZoWVZGQVlHSXlJbk54WVdNekkyTlRRbUl5SUhKeEVDRWY2dlBWcythVUJDZlZXTlRpZ21WVFZTWkZkRlZFZENBcjVYMlNvdllFVkliVHhCU1JzWVUwZEJSVFluQVdNQUFBSUFQLy8wQWswQ3lBQWJBQ2NBUlVCQ0FnRUFBd01CQVFBZUNRSUVCUU5NQUFFSEFRVUVBUVZwQUFBQUEyRUdBUU1EVUUwQUJBUUNZUUFDQWxFQ1Rod2NBQUFjSnh3bUlpQUFHd0FhSmlRbENBb1pLd0FXRndjbUppTWlCZ2MyTmpNeUZoWVZGQVlHSXlJbU5UUTJOak1DQmdjV0ZqTXlOalUwSmlNQnJHRW9MaUpWTFZWd0FpbGZRRHRyUTBKMFNJS09VWVZQUjFrZkJGZElTMXBaUlFMSUhSdEpGQmVCa3lvdUwyQkZRMjArcnJKL3AwNytuVEVyVzJWVVFrQkdBQUVBUmdBQUFrSUN2QUFHQUI5QUhBSUJBUUlCVEFBQ0FnQmZBQUFBU0UwQUFRRkpBVTRSRWhBRENoa3JFeUVYQVNNQklVWUIrd0greTJ3QlBQNXBBcnhZL1p3Q1p3QUFBQU1BUWYvekFrd0N5QUFiQUNjQU13QkVRRUVVQmdJRkFnRk1BQUlJQVFVRUFnVnBCd0VEQXdGaEJnRUJBVkJOQUFRRUFHRUFBQUJSQUU0b0tCd2NBQUFvTXlneUxpd2NKeHdtSWlBQUd3QWFMQWtLRnlzQUZoWVZGQVlIRmhZVkZBWUdJeUltSmpVME5qY21KalUwTmpZekJnWVZGQll6TWpZMU5DWWpBZ1lWRkJZek1qWTFOQ1lqQVk1dE96czFPVTA5ZGxKVWRqeE5PelU5UEd4SVFrMVJQajlRVEVOSlhsZFFVRlJiU1FMSUxWRTFOMUlURDJOQlBtQTFORjQ5UTJRUUUxSTNOVkV0VWpveE16azVNekk1L3R4S096MUpTVDA3U2dBQ0FEdi85QUpPQXNnQUdBQWxBRVZBUWlFTkFnUUZDQUVCQWdjQkFBRURUQUFFQUFJQkJBSnBCd0VGQlFOaEJnRURBMUJOQUFFQkFHRUFBQUJSQUU0WkdRQUFHU1VaSkI4ZEFCZ0FGeVFqSkFnS0dTc0FGaFVVQmlNaUp6Y1dNekkyTndZR0l5SW1KalUwTmpZekJnWVZGQll6TWpZM0xnSWpBYnVUclk1elh5RlFZbUY3QWpKalFqeG1Qa055UkVOV1NrRTdjeGdETTFBdEFzaW5wTTI4TzBzeWlKRXVLREpqUmtSbk4xVk1QMEJKTXlZL1ZDZ0FBZ0E1Ly9NQ01nSVpBQThBSGdBc1FDa0ZBUU1EQVdFRUFRRUJVMDBBQWdJQVlRQUFBRkVBVGhBUUFBQVFIaEFkR0JZQUR3QU9KZ1lLRnlzQUZoWVZGQVlHSXlJbUpqVTBOall6RGdJVkZCWVdNekkyTmpVMEppTUJoMjQ5Um5aSFNIQStSbmhJTWt3c0tVZ3RMa3NxVlVVQ0dVTjVUbFdCUmtaN1QxUitSRkF4V1RvNFdURXpYVHRWWmdBQkFISUFBQUlSQWd3QUNnQXBRQ1lKQ0FjREFBTUJUQVFCQXdOTFRRSUJBQUFCWUFBQkFVa0JUZ0FBQUFvQUNoRVJFUVVLR1NzQkVUTVZJVFV6RVFjbk53R0ZqUDVqdFpZaDBnSU0va0JNVEFGZlVEdDJBQUFBQVFCZ0FBQUNKd0laQUJnQU0wQXdEZ0VCQWcwQkF3RURBUUFEQTB3QUFRRUNZUUFDQWxOTkJBRURBd0JmQUFBQVNRQk9BQUFBR0FBWUpTY1JCUW9aS3lVVklUVStBalUwSmlNaUJnY25Oall6TWhZVkZBWUdCd0luL2ptUml6RS9OeXhUSHlNcGJUOVpaemgrZFUxTlExeG5RaU14TUJ3WVBCOG1VVWd4VldKTEFBQUFBUUF4LzBNQ0t3SVpBQ2dBYlVBV0pRRUVCU1FCQXdRRkFRSURFUUVCQWhBQkFBRUZURXV3SFZCWVFCNEFBd0FDQVFNQ2FRQUVCQVZoQmdFRkJWTk5BQUVCQUdFQUFBQk5BRTRiUUJzQUF3QUNBUU1DYVFBQkFBQUJBR1VBQkFRRllRWUJCUVZUQkU1WlFBNEFBQUFvQUNja0lTUWtMQWNLR3lzQUZoVVVCZ2NWRmhZVkZBWUdJeUltSnpjV016STJOVFFtSXlNMU16STJOVFFtSXlJSEp6WTJNd0daYzBnNFJsbEVlazlGZlNzcVdXVlVYVjVjUGpoSldVWkFVbElqS1hFL0FobGRURHhZRHdNS1hVby9ZVFlvSkVBOFRUMC9Qa3crT2pNNEx6OGRJd0FBQWdBci8xQUNVZ0lNQUFvQURRQlBRQW9MQVFBRUNBRUJBQUpNUzdBaFVGaEFGd0FDQVFLR0FBUUVTMDBGQVFBQUFWOERBUUVCU1FGT0cwQVZBQUlCQW9ZRkFRQURBUUVDQUFGbkFBUUVTd1JPV1VBSkVoSVJFUkVRQmdvY0t5VXpGU01WSXpVaE5RRXpCd0VoQWV0bloxMytuUUZxVmxyKzlnRUtXRW0vdjBZQnQyLyt1d0FBQUFFQU8vOURBalVDREFBZUFHaEFFUU1CQkFFZEhCRURBd1FDVEJBQkF3RkxTN0FkVUZoQUhnQUJBQVFEQVFScEFBQUFCVjhHQVFVRlMwMEFBd01DWVFBQ0FrMENUaHRBR3dBQkFBUURBUVJwQUFNQUFnTUNaUUFBQUFWZkJnRUZCVXNBVGxsQURnQUFBQjRBSGlRbEpTTVJCd29iS3dFVklSVTJOak15RmhVVUJnWWpJaVluTnhZV016STJOVFFtSXlJSEp4RUNEUDY4SEZJdFlISkNlMU5EZlNvb0tXWTBVR0JRUDFCSVFBSU1VTmtUR0c1bVMyODlLU2RJSXlWVlRFWkpPQ01CWGdBQUFnQTYvL01DUXdMSkFCb0FKZ0JGUUVJUkFRSUJFZ0VEQWlNWEFnVUVBMHdHQVFNQUJBVURCR2tBQWdJQllRQUJBVkJOQndFRkJRQmhBQUFBVVFCT0d4c0FBQnNtR3lVaEh3QWFBQmtrSlNZSUNoa3JBQllXRlJRR0JpTWlKalUwTmpZek1oWVhCeVlqSWdZSE5qWXpFalkxTkNZaklnWUhGaFl6QWFSbE9rQjFUSHVOVlk1WE1Gb2NJRUpKWEhVR0tXUkFLbGhRUHpwaUl3bFpUQUhPTm1aRVIzTkJzS0ovcmxjWkVrY2loWWN0TlA1MVdrdEhVVGt4WjJ3QUFBQUFBUUJLLzFBQ1FBSU1BQVlBSDBBY0FnRUNBQUZNQUFFQ0FZWUFBZ0lBWHdBQUFFc0NUaEVTRUFNS0dTc1RJUlVCSXdFaFNnSDIvcnBrQVVYK2J3SU1UZjJSQW1rQUFBQUFBd0E1Ly9ZQ013TEpBQnNBSndBekFFUkFRUlFHQWdVQ0FVd0FBZ2dCQlFRQ0JXa0hBUU1EQVdFR0FRRUJVRTBBQkFRQVlRQUFBRkVBVGlnb0hCd0FBQ2d6S0RJdUxCd25IQ1lpSUFBYkFCb3NDUW9YS3dBV0ZoVVVCZ2NXRmhVVUJnWWpJaVltTlRRMk55WW1OVFEyTmpNR0JoVVVGak15TmpVMEppTUNCaFVVRmpNeU5qVTBKaU1CZW1VNFBEYzhVejUwVDAxeE8xQStORDg2YUVNOVMwNDROMHhIT1VsYlZVbExWMXBHQXNrdFVqUTNVUk1PWjBZNlhEUTBYRHBGWmhBU1VUVTFVeTVOT3pJMFBEdzBNanYrMTAwK09rdExPejFOQUFJQU5mOURBajRDR1FBWkFDVUFia0FQSEE4Q0JRUUtBUUVDQ1FFQUFRTk1TN0FkVUZoQUh3Y0JCUUFDQVFVQ2FRQUVCQU5oQmdFREExTk5BQUVCQUdFQUFBQk5BRTRiUUJ3SEFRVUFBZ0VGQW1rQUFRQUFBUUJsQUFRRUEyRUdBUU1EVXdST1dVQVVHaG9BQUJvbEdpUWdIZ0FaQUJnakpDVUlDaGtyQUJZVkZBWUdJeUltSnpjV016STJOd1lqSWlZbU5UUTJOak1TTmpjbUppTWlCaFVVRmpNQnNZMVdqMWMwWXlFZ1VVeGNkZ2RZYzBGbE9qOTFUU1ZqSVFsWVRVaFlVRUlDR2JDaWZxOVhIQlJISjRPR1lUWmxSRWgxUXY1d09qRm9iVnhOUjFBQS8vOEFKUDlpQVhrQkFnRUhBbWdBQVA5cUFBbXhBQUs0LzJxd05Tc0FBQUQvL3dBLy8yb0JRZ0Q1QVFjQ2FRQUEvMm9BQ2JFQUFiai9hckExS3dBQUFQLy9BQ0gvYWdGTUFRSUJCd0pxQUFEL2FnQUpzUUFCdVA5cXNEVXJBQUFBLy84QUt2OWlBVjBCQWdFSEFtc0FBUDlxQUFteEFBRzQvMnF3TlNzQUFBRC8vd0FqLzJvQlpBRDVBUWNDYkFBQS8yb0FDYkVBQXJqL2FyQTFLd0FBQVAvL0FEZi9ZZ0ZkQVBrQkJ3SnRBQUQvYWdBSnNRQUJ1UDlxc0RVckFBQUEvLzhBTHY5aUFXd0JBZ0VIQW00QUFQOXFBQW14QUFLNC8ycXdOU3NBQUFELy93QVovMm9CUFFENUFRY0Nid0FBLzJvQUNiRUFBYmovYXJBMUt3QUFBUC8vQUMvL1lnRndBUUlCQndKd0FBRC9hZ0FKc1FBRHVQOXFzRFVyQUFBQS8vOEFLLzlpQVdrQkFnRUhBbkVBQVA5cUFBbXhBQUs0LzJxd05Tc0FBQUFBQWdBay8vZ0JlUUdZQUFzQUZ3QXFRQ2NFQVFFRkFRTUNBUU5wQUFJQ0FHRUFBQUJSQUU0TURBQUFEQmNNRmhJUUFBc0FDaVFHQ2hjckFCWVZGQVlqSWlZMU5EWXpCZ1lWRkJZek1qWTFOQ1lqQVIxY1hrMU5YVjlQTURBd0xDMHZMaTBCbUhGZVgzSnRYR0oxUUU1S1FrWkpSMGhJQUFBQUFRQS9BQUFCUWdHUEFBb0FJMEFnQ2drSUF3RUFBVXdBQUFFQWhRTUJBUUVDWUFBQ0Fra0NUaEVSRVJBRUNob3JFek1STXhVaE5UTTFCeWU5TTFMKy9XZFJGZ0dQL3JBL1AvOGlOd0FBQUFBQkFDRUFBQUZNQVpnQUZnQXhRQzRUQVFJREVnRUFBZ2tCQVFBRFRBUUJBd0FDQUFNQ2FRQUFBQUZmQUFFQlNRRk9BQUFBRmdBVkp4RVZCUW9aS3hJV0ZSUUdCek1WSVRVK0FqVTBKaU1pQnljMk5qUDBUVkJrdi83ZlVWRWpLU016TUNBZVRDZ0JtRU0zTDJKTVFUdEFTVFViSVNBaU14Y2JBQUFBQVFBcS8vZ0JYUUdZQUNVQVBVQTZIQUVFQlJzQkF3UWxBUUlEQ1FFQkFnZ0JBQUVGVEFBRkFBUURCUVJwQUFNQUFnRURBbWtBQVFFQVlRQUFBRkVBVGlRa0lTTWtKQVlLSENza0ZoVVVCaU1pSmljM0ZqTXlOalUwSXlNMU16WTJOVFFtSXlJSEp6WTJNeklXRlJRR0J3RXZMbHRJS2t3YUhEazRLUzVZTFNVbEt5SWpOalFkRzBzcVFFc2xKTkF5SnpoSEdSVTRKQ0lmT2prQkhCb1hHeUF4RlJzN0toOHhDd0FBQUFJQUl3QUFBV1FCandBS0FBMEFNVUF1REFFQkFBb0JBZ0VDVEFZRkFnRUVBUUlEQVFKbkFBQUFBMThBQXdOSkEwNExDd3NOQ3cwUkVSRVJFQWNLR3lzVE14VXpGU01WSXpVak5UYzFCK2srUFQxSHZiMTBBWS94UEdKaU93R1FrQUFBQUFBQkFEZi8rQUZkQVk4QUhRQTlRRG9EQVFRQkhCc1FBd01FRHdFQ0F3Tk1CZ0VGQUFBQkJRQm5BQUVBQkFNQkJHa0FBd01DWVFBQ0FsRUNUZ0FBQUIwQUhTUWtKQ01SQndvYkt3RVZJeFUyTmpNeUZoVVVCaU1pSmljM0ZqTXlOalUwSmlNaUJnY25OUUZCc1EwckZqcEZYRW9rUXhrYU1ESXNMeU1oRmk0UE1RR1BRVndJQ2tRNVFVNFVFelVjS2lVZ0l3OE5GY3dBQUFJQUx2LzRBV3dCbUFBVkFDRUFSa0JEQVFFQUF3SUJBUUFIQVFVQkdBRUVCUVJNQmdFREFBQUJBd0JwQUFFSEFRVUVBUVZwQUFRRUFtRUFBZ0pSQWs0V0ZnQUFGaUVXSUJ3YUFCVUFGQ1FqSXdnS0dTc0FGd2NtSXlJR0J6WXpNaFlWRkFZaklpWTFORFl6QmdZSEZoWXpNalkxTkNZakFTdzBIaVkwTWprQkswSTJUVkZJVFZoblVTWTFEUU12SlNNcEtCOEJtQ1UzSER4SUtVRTZQVTFsWkhGbTJCMFNLekFvSGg0bUFBQUFBUUFaQUFBQlBRR1BBQVlBSFVBYUFnRUNBQUZNQUFBQUFnRUFBbWNBQVFGSkFVNFJFaEFEQ2hrckV5RVZBeU1USXhrQkpLdFJwczRCanpYK3BnRk1BQU1BTC8vNEFYQUJtQUFXQUNJQUxnQTdRRGdXQ3dJRUFnRk1BQUVHQVFNQ0FRTnBBQUlBQkFVQ0JHa0hBUVVGQUdFQUFBQlJBRTRqSXhjWEl5NGpMU2tuRnlJWElTb3BKQWdLR1Nza0ZoVVVCaU1pSmpVME5qY21OVFEyTXpJV0ZSUUdCeVlHRlJRV016STJOVFFtSXhJMk5UUW1JeUlHRlJRV013RkhLVnBHU0ZrcUlEcFJRRUJTSVJ0MUtDZ2ZJQ2dvSUNncUxTVWxMaXNveWpFa04wWkdOaVF4RGhzN0x6dzhNQ0FxQzRRY0dSa2FHaGtaSFA3YkpCMGVKQ1FlSENVQUFBQUNBQ3YvK0FGcEFaZ0FGUUFnQUVGQVBoc0JCQVVOQVFJRUNRRUJBZ2dCQUFFRVRBWUJBd0FGQkFNRmFRQUVBQUlCQkFKcEFBRUJBR0VBQUFCUkFFNEFBQjRjR1JjQUZRQVVJaVFrQndvWkt3QVdGUlFHSXlJbUp6Y1dNekkzQmlNaUpqVTBOak1HRmpNeU5qY21JeUlHRlFFVVZXbFFJMEFYSFNVemFBZ3pPVGROVlVWT0pTQVhNUllKVGlJcUFaaHBZVzluRWhFM0dYNG9SRHcvU3FrakVoRm5KaUlBQVAvL0FDUUJKUUY1QXNVQkJ3Sm9BQUFCTFFBSnNRQUN1QUV0c0RVckFBQUEvLzhBUHdFdEFVSUN2QUVIQW1rQUFBRXRBQW14QUFHNEFTMndOU3NBQUFELy93QWhBUzBCVEFMRkFRY0NhZ0FBQVMwQUNiRUFBYmdCTGJBMUt3QUFBUC8vQUNvQkpRRmRBc1VCQndKckFBQUJMUUFKc1FBQnVBRXRzRFVyQUFBQS8vOEFJd0V0QVdRQ3ZBRUhBbXdBQUFFdEFBbXhBQUs0QVMyd05Tc0FBQUQvL3dBM0FTVUJYUUs4QVFjQ2JRQUFBUzBBQ2JFQUFiZ0JMYkExS3dBQUFQLy9BQzRCSlFGc0FzVUJCd0p1QUFBQkxRQUpzUUFDdUFFdHNEVXJBQUFBLy84QUdRRXRBVDBDdkFFSEFtOEFBQUV0QUFteEFBRzRBUzJ3TlNzQUFBRC8vd0F2QVNnQmNBTElBUWNDY0FBQUFUQUFDYkVBQTdnQk1MQTFLd0FBQVAvL0FDc0JKUUZwQXNVQkJ3SnhBQUFCTFFBSnNRQUN1QUV0c0RVckFBQUEvLzhBUHdHMEFVSURRd0VIQW1rQUFBRzBBQW14QUFHNEFiU3dOU3NBQUFELy93QWhBYlFCVEFOTUFRY0NhZ0FBQWJRQUNiRUFBYmdCdExBMUt3QUFBUC8vQUNvQnJBRmRBMHdCQndKckFBQUJ0QUFKc1FBQnVBRzBzRFVyQUFBQS8vOEFKQUdzQVhrRFRBRUhBbWdBQUFHMEFBbXhBQUs0QWJTd05Tc0FBQUQvL3dBakFiUUJaQU5EQVFjQ2JBQUFBYlFBQ2JFQUFyZ0J0TEExS3dBQUFQLy9BRGNCckFGZEEwTUJCd0p0QUFBQnRBQUpzUUFCdUFHMHNEVXJBQUFBLy84QUxnR3NBV3dEVEFFSEFtNEFBQUcwQUFteEFBSzRBYlN3TlNzQUFBRC8vd0FaQWJRQlBRTkRBUWNDYndBQUFiUUFDYkVBQWJnQnRMQTFLd0FBQVAvL0FDOEJyQUZ3QTB3QkJ3SndBQUFCdEFBSnNRQUR1QUcwc0RVckFBQUEvLzhBS3dHc0FXa0RUQUVIQW5FQUFBRzBBQW14QUFLNEFiU3dOU3NBQUFBQUFmK3AvNElCRGdMeEFBTUFMa3V3RzFCWVFBd0NBUUVBQVlZQUFBQktBRTRiUUFvQUFBRUFoUUlCQVFGMldVQUtBQUFBQXdBREVRTUtGeXNIQVRNQlZ3RWdSZjdoZmdOdi9KRUEvLzhBUC8rQ0EzVUM4UUFpQW5NQUFBQWpBb1lCYlFBQUFBTUNhZ0lwQUFELy93QS8vNElEZ1FMeEFDSUNjd0FBQUNNQ2hnRnRBQUFBQXdKc0FoMEFBUC8vQUNyL2dnT2tBdkVBSWdKMUFBQUFJd0tHQVpBQUFBQURBbXdDUUFBQS8vOEFQLytDQTVjQzhRQWlBbk1BQUFBakFvWUJiUUFBQUFNQ2NBSW5BQUQvL3dBcS80SUR1Z0x4QUNJQ2RRQUFBQ01DaGdHUUFBQUFBd0p3QWtvQUFQLy9BRGYvZ2dPOUF2RUFJZ0ozQUFBQUl3S0dBWk1BQUFBREFuQUNUUUFBLy84QUdmK0NBMnNDOFFBaUFua0FBQUFqQW9ZQlFRQUFBQU1DY0FIN0FBQUFBZ0EyLy9NQ0t3SkdBQThBSEFBc1FDa0ZBUU1EQVdFRUFRRUJNRTBBQWdJQVlRQUFBREVBVGhBUUFBQVFIQkFiRmhRQUR3QU9KZ1lJRnlzQUZoWVZGQVlHSXlJbUpqVTBOall6QmdZVkZCWXpNalkyTlRRbUl3RjdjVDlDZFVwSWJ6MUFja3BNVmxKSk1Vd3FWMG9DUmthRFdGMktTMGVGV1Z5SlNVeDRaMlYzT1dsRVlYUUFBQUVBT1FBQUFac0NPUUFLQUNsQUpna0lCd01BQXdGTUJBRURBeXhOQWdFQUFBRmdBQUVCTFFGT0FBQUFDZ0FLRVJFUkJRZ1pLd0VSTXhVaE5UTVJCeWMzQVNaMS9ycCtleCt3QWpuK0ZVNU9BWXc2UFZ3QUFBQUJBRU1BQUFIVEFrWUFGZ0F6UURBVUFRSURFd0VBQWdvQkFRQURUQUFDQWdOaEJBRURBekJOQUFBQUFWOEFBUUV0QVU0QUFBQVdBQlVuRVJZRkNCa3JBQllWRkFZSEJ5RVZJVFUzTmpZMU5DWWpJZ2NuTmpNQlVtdEZSWGdCR1A1M21rbzRTRGRFT3lWVllBSkdXazQrWnoxdVRrZUxRbElwTkRVcVB6a0FBQUVBSXYvMEFjZ0NSUUFvQUVWQVFpVUJCQVVrQVFNRUJRRUNBeEVCQVFJUUFRQUJCVXdBQXdBQ0FRTUNhUUFFQkFWaEJnRUZCVEJOQUFFQkFHRUFBQUF4QUU0QUFBQW9BQ2NrSVNRa0xBY0lHeXNBRmhVVUJnY1ZGaFlWRkFZR0l5SW1KemNXTXpJMk5UUW1JeU0xTXpJMk5UUW1JeUlISnpZMk13Rk9YakVyTmtJNVprRTZhU01sUlZwQ1NVaEpSVDA1UlRnMFQwVWxKV1UyQWtWT095cExFUU1JVERjeVVqQWtJRG96T2k4eEwwY3ZMQ2NxTVRrZkl3QUFBZ0E2QUFBQjdnSTVBQW9BRFFBeVFDOExBUUFFQ1FFQkFBSk1CUUVBQXdFQkFnQUJad1lCQkFRc1RRQUNBaTBDVGdBQURRd0FDZ0FLRVJFUkVRY0lHaXNCRVRNVkl4VWpOU0UxQVFjSE13R2NVbEpTL3ZBQkhReTR1QUk1L3BwRmpvNDhBVzl3OWdBQkFGVC85QUhnQWprQUhRQS9RRHdEQVFRQkhCc1FBd01FRHdFQ0F3Tk1BQUVBQkFNQkJHa0FBQUFGWHdZQkJRVXNUUUFEQXdKaEFBSUNNUUpPQUFBQUhRQWRKQ1VsSWhFSENCc3JBUlVoRlRZek1oWVZGQVlHSXlJbUp6Y1dGak15TmpVMEppTWlCeWNSQWIzKyt6QkVWR0ExWkVRelhSOGRJRXdpUVVwRE5UdzNOd0k1VHFjallVNDZXREljR0Q4VUZFSTFNanN0SUFFakFBQUNBRTcvOUFIOUFrUUFHUUFrQUVoQVJSQUJBZ0VSQVFNQ0Z3RUVBeUlCQlFRRVRBWUJBd0FFQlFNRWFRQUNBZ0ZoQUFFQk1FMEhBUVVGQUdFQUFBQXhBRTRhR2dBQUdpUWFJeUFlQUJrQUdDVWtKZ2dJR1NzQUZoWVZGQVlHSXlJbU5UUTJNeklXRndjbUppTWlCZ2MyTXhJMk5UUW1JeUlHQnhZekFYUlZORFJmUG1aNGlHMDFWQndrR1VnaVJsZ0JURlVnUkVNeEswZ2FGSElCWmlaT09EZGFOWkNQbkpVY0ZEOFFGbWx3UlA3WlF6SXpPQ2tobGdBQUFBRUFIQUFBQWFjQ09RQUdBQjlBSEFJQkFnQUJUQUFDQWdCZkFBQUFMRTBBQVFFdEFVNFJFaEFEQ0JrckV5RVZBeU1USVJ3QmkrbFg1LzdPQWpsRC9nb0I3UUFBQXdBeS8vTUIxUUpHQUJrQUpRQXhBRVJBUVJNRkFnVUNBVXdBQWdnQkJRUUNCV2tIQVFNREFXRUdBUUVCTUUwQUJBUUFZUUFBQURFQVRpWW1HaG9BQUNZeEpqQXNLaG9sR2lRZ0hnQVpBQmdyQ1FnWEt3QVdGUlFHQnhZV0ZSUUdCaU1pSmlZMU5EWTNKaVkxTkRZekJnWVZGQll6TWpZMU5DWWpCZ1lWRkJZek1qWTFOQ1lqQVZoc0x5WXNPak5mUVVGZU1Ub3NKakZyVmpBN1BTOHVQVG94T0VkRFBEdEFRemdDUmxORkxVUU5FRTgwTVUwc0xVd3dOVkFPRDBRc1JWTkpMeWtwTHk4cEtTL3hPaTh0T3pzdU1EZ0FBQUFBQWdBai8vVUJ6UUpGQUJZQUlnQklRRVVaQVFVRURRRUNCUWdCQVFJSEFRQUJCRXdIQVFVQUFnRUZBbWtBQkFRRFlRWUJBd013VFFBQkFRQmhBQUFBTVFCT0Z4Y0FBQmNpRnlFZEd3QVdBQlVqSXlRSUNCa3JBQllWRkFZaklpYzNGak15TmpjR0l5SW1KalUwTmpNU05qY21KaU1pQmhVVUZqTUJXbk9LY0U5T0d6MUFURndFUkZjd1ZqWnlYU1ZQRUFwRU56WkdRVFFDUlk2TW9KWW9RQjlzYlVFblVUdFhaZjdhS2lGSlNEMDFNamdBQVFCTS8vUUF5Z0IxQUFzQUdVQVdBZ0VCQVFCaEFBQUFVUUJPQUFBQUN3QUtKQU1LRnlzMkZoVVVCaU1pSmpVME5qT25JeU1jSFNJaUhYVWpIaDRpSWg0ZUl3QUJBRVAvZ1FESkFITUFEd0FYUUJRSkJnVURBRWtCQVFBQWRnQUFBQThBRGdJS0ZpczJGaFVVQmdjbk5qWTNKaVkxTkRZenB5SXpOUjRiSXdZWElDTWFjeVVpTEZza0dCYzJHZ0loR0JzZEFBSUFUUC8yQU1rQ0dBQUxBQmNBTEVBcEJBRUJBUUJoQUFBQVUwMEFBZ0lEWVFVQkF3TlJBMDRNREFBQURCY01GaElRQUFzQUNpUUdDaGNyRWlZMU5EWXpNaFlWRkFZakFpWTFORFl6TWhZVkZBWWpiaUlpSEJ3akl4d2NJaUljSENNakhBR1hJeDBlSXlNZUhTUCtYeUllSGlNakhoNGlBQUlBVGYrQkFOUUNGd0FMQUJzQUpVQWlHdzhDQWtrQUFnRUNoZ01CQVFFQVlRQUFBRk1CVGdBQUZoUUFDd0FLSkFRS0Z5c1NKalUwTmpNeUZoVVVCaU1ETmpZM0ppWTFORFl6TWhZVkZBWUhlU0lpSEJ3akl4eElHaUFGRlI4aEdSMGdNVElCbGlNZEhpTWpIaDBqL2dNWE54a0RJUmNhSGljaEsxd2pBQUQvL3dCMC8vUUN6UUIxQUNJQ21DZ0FBQ01DbUFFV0FBQUFBd0tZQWdNQUFBQUNBRmovOUFEV0Fyd0FBd0FQQUNWQUlnQUJBUUJmQUFBQVNFMEVBUU1EQW1FQUFnSlJBazRFQkFRUEJBNGxFUkFGQ2hrckV6TURJeFlXRlJRR0l5SW1OVFEyTTJOcEUwWkFJeU1jSFNJaUhRSzgvZ2hQSXg0ZUlpSWVIaU1BQUFBQ0FGai9VUURXQWhrQUN3QVBBQ1JBSVFBREFBSURBbU1FQVFFQkFHRUFBQUJUQVU0QUFBOE9EUXdBQ3dBS0pBVUtGeXNTSmpVME5qTXlGaFVVQmlNVEl4TXpleU1qSEIwaUloMDBhUk5HQVpnakhoNGlJaDRlSS8yNUFmZ0FBQUFDQUNQLzlBSElBc2dBSEFBb0FEOUFQQmtCQVFJWUFRQUJBa3dBQUFFRUFRQUVnQUFCQVFKaEJRRUNBbEJOQmdFRUJBTmhBQU1EVVFOT0hSMEFBQjBvSFNjaklRQWNBQnNwR3djS0dDc0FGaFlWRkFZR0J3NENGU00wTmpZM05qWTFOQ1lqSWdjbk5qWXpFaFlWRkFZaklpWTFORFl6QVROaE5CZ2lIaUVxSFZFZkxTSWpJVWcrVmtZa0oyczdEU0lpSFJ3aUlod0N5QzFQTWlJMUpSd2RMa1V1UEZRekhSOHVJVEE0TjBNZUpQMnRJeDRlSWlJZUhpTUFBQUlBTVA5RkFkVUNHUUFMQUNjQWFVQUtJd0VEQWlRQkJBTUNURXV3R1ZCWVFCOEFBZ0VEQVFJRGdBVUJBUUVBWVFBQUFGTk5BQU1EQkdJR0FRUUVUUVJPRzBBY0FBSUJBd0VDQTRBQUF3WUJCQU1FWmdVQkFRRUFZUUFBQUZNQlRsbEFGQXdNQUFBTUp3d21JaUFYRmdBTEFBb2tCd29YS3hJbU5UUTJNeklXRlJRR0l3SW1KalUwTmpjK0FqVXpGQVlHQndZR0ZSUVdNekkzRndZR0kvc2lJaDBjSXlNY1VXTTBMQzBpS1J4U0lDd2lKQ0ZJUGxWSEpDZHJPZ0dZSXg0ZUlpSWVIaVA5clMxUE1qRS9KeDh1UkM0N1ZETWRIeTBpTVRnNFJCNGtBQUFBQUFFQVFBRUlBT01CcmdBTEFCOUFIQUlCQVFBQUFWa0NBUUVCQUdFQUFBRUFVUUFBQUFzQUNpUURDaGNyRWhZVkZBWWpJaVkxTkRZenRDOHZJeUl2THlJQnJpb29LU3NyS1NncUFBQUJBRHNBNXdFQ0FiSUFDd0FlUUJzQUFBRUJBRmtBQUFBQllRSUJBUUFCVVFBQUFBc0FDaVFEQ2hjck5pWTFORFl6TWhZVkZBWWpkVG82S1NrN1BDam5OVEV4TkRReE1UVUFBQUFBQVFBOUFTc0I2QUs4QUJFQUprQWpFUkFQRGcwTUN3Z0hCZ1VFQXdJT0FBRUJUQUFBQUFGZkFBRUJTQUJPR0JBQ0NoZ3JBU00zQnljM0p6Y1hKek1ITnhjSEZ3Y25BVDFWRUpJbm82VW5sQkZWRkpjb3E2d29sd0VybzJkQ1NVeEZacCtlWlVOT1NFRm1BQUFBQWdBaUFBQUNpZ0s4QUJzQUh3QjZTN0FmVUZoQUtBNEhBZ0VHQkFJQ0F3RUNad3dCQ2dwSVRROElBZ0FBQ1Y4UURRc0RDUWxMVFFVQkF3TkpBMDRiUUNZUURRc0RDUThJQWdBQkNRQm9EZ2NDQVFZRUFnSURBUUpuREFFS0NraE5CUUVEQTBrRFRsbEFIZ0FBSHg0ZEhBQWJBQnNhR1JnWEZoVVVFeEVSRVJFUkVSRVJFUkVLSHlzQkZTTUhNeFVqQnlNM0l3Y2pOeU0xTXpjak5UTTNNd2N6TnpNSEJ6TTNJd0tLblJlZXBSbEFHYUFhUVJxTWxCaVhueGxBR1o4WVB4ajlueGlnQWZ3OXVqM0l5TWpJUGJvOXdNREF3UGU2QUFBQUFBRUFDdis2QVVRQzhBQURBQzVMc0IxUVdFQU1BZ0VCQUFHR0FBQUFTZ0JPRzBBS0FBQUJBSVVDQVFFQmRsbEFDZ0FBQUFNQUF4RURDaGNyRnhNekF3cnFVT3BHQXpiOHlnQUFBQUFCQUFyL3VnRkVBdkFBQXdBbVM3QWRVRmhBQ3dBQkFBR0dBQUFBU2dCT0cwQUpBQUFCQUlVQUFRRjJXYlFSRUFJS0dDc1RNeE1qQ2xEcVVBTHcvTW9BQWY4OEFUUC95UUhEQUFzQUgwQWNBZ0VCQUFBQldRSUJBUUVBWVFBQUFRQlJBQUFBQ3dBS0pBTUtGeXNDRmhVVUJpTWlKalUwTmpOZ0tTa2RIaWtxSFFIREpDTWtKU1VrSXlRQUFBSC81d0U3QUdJQnVBQUxBQjVBR3dBQUFRRUFXUUFBQUFGaEFnRUJBQUZSQUFBQUN3QUtKQU1LRnlzU0pqVTBOak15RmhVVUJpTUxKQ1FaR2lRakd3RTdJUjRlSUNBZUh5QUFBQUFCQUVyL21BRS9BeGtBRHdBR3N3OEpBVElyQVE0Q0ZSUVdGaGNISmlZMU5EWTNBVDhyUERvNlFpVW1Tb1dHU0FMdkswMmxkM2VvV0NNcE5OQy92OUV1QUFBQUFBRUFLditZQVI4REdRQVBBQWF6QmdBQk1pc1RGaFlWRkFZSEp6NENOVFFtSmlkUlNJYUZTaVlsUWpvNk9pd0RHUzdSdjcvUU5Da2pXS2gzZDZWTExRQUJBRWYvc1FGWEF4TUFJUUFkUUJvYUdSRUlBQVVBQVFGTUFBRUFBWVVBQUFCMklTQVRFZ0lLRmlzQkJnWVZGUlFHQmdjVkhnSVZGUlFXRnhVaUpqVTFOQ1luTlRZMk5UVTBOak1CVnk0MUd5Y1JFU2NiTlM1VVlURXFLRE5pVXdMY0JUd3ltQnd2SGdRREJCOHZHNWt4UGdVMlhFMkFNalFFUEFjMEw0Qk1YUUFBQUFBQkFDNy9zUUUrQXhNQUlRQWJRQmdoR0JBSUJ3VUJBQUZNQUFBQkFJVUFBUUYySFJBQ0NoZ3JFeklXRlJVVUZoY1ZCZ1lWRlJRR0l6VTJOalUxTkRZMk56VXVBalUxTkNZbkxsTmlNeWdxTVdGVUxqVWJKeEVSSnhzMUxnTVRYVXlBTHpRSFBBUTBNb0JOWERZRlBqR1pHeThmQkFNRUhpOGNtREk4QlFBQUFBRUFTZitKQVBNREdRQUhBQ0pBSHdBQUFBRUNBQUZuQUFJREF3SlhBQUlDQTE4QUF3SURUeEVSRVJBRUNob3JFek1WSXhFekZTTkpxbHRicWdNWlJmejZSUUFBQVFBei80a0EzQU1aQUFjQUlrQWZBQUFBQXdJQUEyY0FBZ0VCQWxjQUFnSUJYd0FCQWdGUEVSRVJFQVFLR2lzVE14RWpOVE1SSXpPcHFWcGFBeG44Y0VVREJnQUJBRWtCZGdEd0EzOEFEUUFHc3cwSEFUSXJFd1lHRlJRV0Z3Y21KalUwTmpmd01DNHRMeTg4T2prOUExb3diVUUvYlRJb05JQlNVSDAyQUFBQkFFTUJkZ0RwQTM4QURBQUdzd1lBQVRJckV4WVdGUlFHQnljMk5qVTBKM1E4T1RrOE1EQXRYZ04vTlgxUlVvQTBLREp0UDRCZUFBRUFTUUVBQVc0QlRRQURBQmhBRlFBQUFRRUFWd0FBQUFGZkFBRUFBVThSRUFJS0dDc1RJUlVoU1FFbC90c0JUVTBBQVAvL0FFa0JBQUZ1QVUwQUFnS3hBQUFBQVFCSkFOMENDZ0VzQUFNQUdFQVZBQUFCQVFCWEFBQUFBVjhBQVFBQlR4RVFBZ29ZS3hNaEZTRkpBY0grUHdFc1R3QUFBQUVBU1FEZEEwa0JMQUFEQUJoQUZRQUFBUUVBVndBQUFBRmZBQUVBQVU4UkVBSUtHQ3NUSVJVaFNRTUEvUUFCTEU4QUFBQUJBRUwvc2dLRC8va0FBd0Fnc1Faa1JFQVZBQUFCQVFCWEFBQUFBVjhBQVFBQlR4RVFBZ29ZSzdFR0FFUVhJUlVoUWdKQi9iOEhSd0FBQUFBQkFFa0Njd0ZBQXJZQUF3QVRRQkFBQVFFQVh3QUFBRWdCVGhFUUFnb1lLeE16RlNOSjkvY0N0a01BQUFFQUkvK01BS29BZmdBUEFCQkFEUThEQWdCSkFBQUFkaWdCQ2hjckZ6WTJOeVltTlRRMk16SVdGUlFHQnlNYkpBWVZIeUVZR3lJek5Wd1hOaG9ESUJnYkhTWWhMRnNrLy84QUkvK01BVThBZmdBaUFyY0FBQUFEQXJjQXBRQUEvLzhBTndIWUFXSUN5UUFpQXJzQUFBQURBcnNBcFFBQS8vOEFJd0hZQVU4Q3lRQWlBcndBQUFBREFyd0FwUUFBQUFFQU53SFlBTDBDeVFBUEFCZEFGQWtHQlFNQVNnRUJBQUIyQUFBQUR3QU9BZ29XS3hJbU5UUTJOeGNHQmdjV0ZoVVVCaU5aSWpNMUhoc2pCaFFnSVJrQjJDVWhMRnNrRnhjMkd3SWdHQnNkQUFBQUFBRUFJd0hZQUtvQ3lRQVBBQmxBRmdrR0JRTUFTUUVCQUFCUUFFNEFBQUFQQUE0Q0NoWXJFaFlWRkFZSEp6WTJOeVltTlRRMk00Z2lNelVmR3lRR0ZSOGhHQUxKSlNFc1d5UVlGellhQXlBWEhCd0FBQUlBSEFCRkFhQUJ1UUFGQUFzQUNMVUpCd01CQWpJck53Y25OeGNIQlFjbk54Y0g2VE9hbHpkM0FTMHptNWsxZG5NdXVic3RqWXd1dWJzdGpRQUFBQUFDQUQ4QVJRSERBYmtBQlFBTEFBaTFDUWNEQVFJeUt4TTNGd2NuUHdJWEJ5YzNQemFZbXpOMlFUYVhtak4yQVl3dHU3a3VqSTB0dTdrdWpBQUJBRVlBUlFFVUFia0FCUUFHc3dVQkFUSXJOemNYQnhjSFJwZzJkbll6L3JzdGpZd3VBQUFBQVFCUUFFVUJIZ0c1QUFVQUJyTURBUUV5S3hNM0Z3Y25OMUEybUpzemRnR01MYnU1TG93QUFBSUFaUUhlQVZRQ3ZBQURBQWNBRjBBVUF3RUJBUUJmQWdFQUFFZ0JUaEVSRVJBRUNob3JFek1ISXpjekJ5TmxWdzQ2aVZjT093SzgzdDdlQUFFQVRnSGVBS1VDdkFBREFCTkFFQUFCQVFCZkFBQUFTQUZPRVJBQ0NoZ3JFek1ISTA1WERqb0N2TjRBQVFCSy81RUJLUUtLQUE0QUJyTUlBQUV5S3dVdUFqVTBOalkzRndZVkZCWVhBUWd0UzBaRlRpb2hqVnN6YnlKT25uRnhuazRkSzNyVmhxTXNBQUFBQUFFQUt2K1JBUWdDaWdBT0FBYXpEZ1lCTWlzWE5qWTFOQ2MzSGdJVkZBWUdCeW96V293Z0trNUZSa3NzUlMyamhkTjhLeDFPbm5GeG4wMGlBQUlBWGYvMEFOd0NPUUFEQUE4QUpVQWlBQUFBQVY4QUFRRXNUUUFDQWdOaEJBRURBekVEVGdRRUJBOEVEaVVSRUFVSUdTczNJd016QWlZMU5EWXpNaFlWRkFZandFY1FaMDhrSkJ3YkpDUWJ1QUdCL2JzZ0hoMGlJaDBlSUFBQUFBSUFYZitnQU53QjVRQUxBQThBS2tBbkJBRUJBQUFDQVFCcEFBSURBd0pYQUFJQ0ExOEFBd0lEVHdBQUR3NE5EQUFMQUFva0JRZ1hLeElXRlJRR0l5SW1OVFEyTXdjekV5TzRKQ1FiSENRa0hDTkdFR1lCNVNBZUhTSWlIUjRneFA1L0FBQUNBREgvOUFGN0FrWUFHZ0FtQURoQU5Rd0JBQUVMQVFJQUFrd0FBZ0FEQUFJRGdBQUFBQUZoQUFFQk1FMEFBd01FWVFVQkJBUXhCRTRiR3hzbUd5VWxHU1FvQmdnYUt6YzBOamMyTmpVMEppTWlCeWMyTmpNeUZoVVVCZ2NHQmhVVkl4WW1OVFEyTXpJV0ZSUUdJNklpSWh3Y0xTazlNeWNlVmpKT1ZpZ21IeDFQQ3lRa0hCd2pJeHpWSmpVaUd5a2FKU1lsUEJZZVNqMHBPeVFlSnhnVzBDQWVIU0lpSFI0Z0FBQUFBZ0E2LzVJQmhBSGxBQXNBSmdBK1FEc1hBUUlFR0FFREFnSk1BQVFBQWdBRUFvQUZBUUVBQUFRQkFHa0FBZ01EQWxrQUFnSURZZ0FEQWdOU0FBQW1KUndhRmhRQUN3QUtKQVlJRnlzQUZoVVVCaU1pSmpVME5qTVhGQVlIQmdZVkZCWXpNamNYQmdZaklpWTFORFkzTmpZMU5UTUJDQ1FrSEJ3akl4d25JeUVkR3kwcVBETW5IbFl4VGxjb0poNGVUd0hsSUI0ZElpSWRIaURoSnpZZ0hTY2FKU1lsUEJjZVN6MG9PeVVjS1JjWEFBQUFBZjlhQVFuLzFBR0ZBQXNBSDBBY0FnRUJBQUFCV1FJQkFRRUFZUUFBQVFCUkFBQUFDd0FLSkFNSUZ5c0NGaFVVQmlNaUpqVTBOak5QSXlNYUdTUWtHUUdGSHg4ZUlDQWVIeDhBQUFFQU5QL3lBZmtDM0FBZ0FFOUFFaE1SRGdNQ0FTQVVBZ01DQmdNQ0FBTURURXV3STFCWVFCVUFBZ0lCWHdBQkFVcE5BQU1EQUY4QUFBQkpBRTRiUUJJQUF3QUFBd0JqQUFJQ0FWOEFBUUZLQWs1WnRpVW1HaFFFQ2hvckpRWUdCeGNqTnk0Q05UUTJOamNuTXdjV0Z3Y21KaU1pQmhVVUZoWXpNamNCK1J0VE5BUkZBMEpvT3pwalBnTkZBbDFDS2lBK0sweGZMazR4VGtPWUd5Y0ZYMTRIUkhsUlRYVkVDR2xvQnpkQUdSaG1YRDVhTHpZQUFBQUNBQzBBU2dKSkFtRUFHd0FuQUVwQVJ4Z1dFaEFFQWdFWkR3c0JCQU1DQ2dnRUFnUUFBd05NRnhFQ0FVb0pBd0lBU1FBQkFBSURBUUpwQkFFREFBQURXUVFCQXdNQVlRQUFBd0JSSEJ3Y0p4d21LeXdsQlFvWkt3QUhGd2NuQmlNaUp3Y25OeVkxTkRjbk54YzJNeklYTnhjSEZoVUdOalUwSmlNaUJoVVVGak1DSlNsTk1FODZWbE02VGpKTkt5eE1NRkE3VUZFOVVERlBLNjlPVFQwOVRVNDhBUUU1VERKT0p5ZE9NVXc3VWxVNVRqRlFKaWRRTUU4N1VwQk5RMFJNVEVSRFRRQUFBQUVBS2YrUEFnOERKUUF2QUYxQUZSOGRHZ01FQXlBSkFnSUVDQUVBQWdVQkFRQUVURXV3REZCWVFCa0FBUUFBQVhFQUF3QUVBZ01FYVFBQ0FnQmhBQUFBVVFCT0cwQVlBQUVBQVlZQUF3QUVBZ01FYVFBQ0FnQmhBQUFBVVFCT1diY21IaWNSRVFVS0d5c2tCZ2NYSXpjbUppYzNGaFl6TWpZMU5DWW1KeTRDTlRRMk55Y3pCeFlYQnlZbUl5SUdGUlFXRmhjWEhnSVZBZzkzYUFWTUJUUm5LaUF0YURWTVR5azhSMFJWTlcxaEJFd0ZaRk1wS0Y0dVFFc25QVGtwUDB3cWFtNEhabWNGSUJsTkdSMDlNQ0l1SEJ3Yk1FbzNUMlVIWGw4SU4wY2JIVGd2SVM0ZkZoQVpMME15QUFBQUFBRUFKdi8wQW84Q3lBQXFBRXhBU1JVQkJnVVdBUVFHS2dFTEFRTk1Cd0VFQ0FFREFnUURad2tCQWdvQkFRc0NBV2NBQmdZRllRQUZCVkJOQUFzTEFHRUFBQUJSQUU0cEp5VWtJeUlSRWlRaUVSTVJFaUlNQ2g4ckpRWUdJeUltSnlNMU15WTFOeU0xTXpZMk16SVdGd2NtSXlJR0J5RUhJUVlWRkJjaEJ5RVdGak15TndLUEtuaE5hcHdaVzFNQ0FWSmJHYUJ4U204bk5GRmFTbWtWQVY4UC9xWUNBd0ZLRC83UkZtWkNaRlJMSkROL2ZVQWVFU3hBZm44c0lFSTVWbEpBR2c4YUdFQlBWMEFBQUFFQUN2K1JBWGNDK3dBZkFFSkFQeEVCQkFNU0FRSUVBZ0VBQVFFQkJ3QUVUQUFEQUFRQ0F3UnBBQUFJQVFjQUIyVUdBUUVCQWw4RkFRSUNTd0ZPQUFBQUh3QWVFUk1qSXhFVEl3a0tIU3NXSnpjV016STJOUkVqTlRNMU5EWXpNaGNISmlNaUJoVVZNeFVqRVJRR0l6RW5FUmdmR3g1UVVGVkxKaVlSR0J3aUtvU0VTVDV2RGtjSUpDTUJua2xhVEVrTVNRZ2xJbHRKL21OS1N3QUFBQUFCQUZULzh3SWFBc2tBTFFEK1M3QVNVRmhBRlJnQkJRUVpBUU1GSndzQ0FRUUFDQU5NQ2dFQVNSdExzQlJRV0VBWUdBRUZCQmtCQXdVbkFRSUpDQXNDQWdBSkJFd0tBUUJKRzBBY0dBRUZCQmtCQXdVbkFRSUpDQXNCQVFrRVRBSUJBUUZMQ2dFQVNWbFpTN0FTVUZoQUlnWUJBd2NCQWdnREFtY0FCUVVFWVFBRUJGQk5DZ2tDQ0FnQVlRRUJBQUJSQUU0YlM3QVVVRmhBTEFZQkF3Y0JBZ2dEQW1jQUJRVUVZUUFFQkZCTkFBZ0lBR0VCQVFBQVVVMEtBUWtKQUdFQkFRQUFVUUJPRzBBcUJnRURCd0VDQ0FNQ1p3QUZCUVJoQUFRRVVFMEFDQWdCWVFBQkFVbE5DZ0VKQ1FCaEFBQUFVUUJPV1ZsQUVnQUFBQzBBTENVUkV5VWpFUlVpSXdzS0h5c2tOeGNHSXlJbkppTWlCeWMyTlRVak5UTTFORFl6TWhZWEJ5WW1JeUlHRlJVekZTTVZGQVlITmpNeUZ4WXpBYzByRVRKR0p6UXNIRTR3SEVaQVFHcFVPMTRwTGlOQkpqVXowOU1hSENRZ0hTd25Ja1lKVUF3R0JneElKRkdVU0lKY1h4c2VTUmdWTnoxMFNJWXROQk1KQmdjQUFBQUJBQ0FBQUFKbUFyd0FHQUE1UURZWUFRRUFBVXdKQVFFSUFRSURBUUpvQndFREJnRUVCUU1FWndvQkFBQklUUUFGQlVrRlRoY1dGUlFoRVJFUkVSSVJFUkFMQ2g4ckFUTURNeFVqQnhVekZTTVZJelVqTlRNMUp5TTFNd016RXdIK2FNdWF3Z0hEdzEzRnhRSEVuYzF3dGdLOC9ySkJBa0ZDcUtoQ1FnRkJBVTcrd1FBQkFFbi9xQUcyQWhRQUhRQXVRQ3NSRHd3REFnRWRFZ0lEQWdZREFnQURBMHdBQXdBQUF3QmpBQUlDQVY4QUFRRkxBazRrSmhnVUJBb2FLeVVHQmdjWEl6Y21KalUwTmpjbk13Y1dGd2NtSmlNaUJoVVVGak15TndHMkYwUXFCRVVFU1dKZlVRUkhCVU15SUJvdklqbEdTVGcvTVRnVklBTllXdzUzVzExd0MxbFlCU2xBRXhKTFJraFFLZ0FBQUFBQkFDNy9vUUdwQXAwQUx3QTFRRElmSFJvREF3SWdDUUlCQXdnRkFnTUFBUU5NQUFJQUF3RUNBMmtBQVFBQUFWa0FBUUVBWHdBQUFRQlBKaDRuRXdRS0dpc2tCZ2NYSXpjbUppYzNGaFl6TWpZMU5DWW1KeTRDTlRRMk55Y3pCeFlYQnlZbUl5SUdGUlFXRmhjV0Z4WVdGUUdwVWtnRVNnTXBWQ0VjSVZBbU9EZ2RNVEV6UUNaUlJRSklBMDA5SlIxSElpMDBIQzRzQ1JKR1FsdFpDMVpVQXhzV1JSUVdMeWNaSWhrVkZDazlMajlUQ0ZoWUJ5MUJGaGdySnhraUZ4TURDQjVFT2dBQUFBRUFNZ0JtQWlJQ1NBQUxBQ1pBSXdBRkFBSUZWd1FCQUFNQkFRSUFBV2NBQlFVQ1h3QUNCUUpQRVJFUkVSRVFCZ29jS3dFekZTTVZJelVqTlRNMU13RlIwZEZOMHRKTkFYMU15OHRNeXdBQUFRQXlBVElDSWdGOEFBTUFHRUFWQUFBQkFRQlhBQUFBQVY4QUFRQUJUeEVRQWdvWUt4TWhGU0V5QWZEK0VBRjhTZ0FBQUFFQU1RQmVBaU1DVVFBTEFBYXpCQUFCTWlzQkZ3Y1hCeWNISnpjbk54Y0I3RGZDd1RYQ3d6ZkN3ampCQWxFNHdzSTN3OE0zdzhJMXdRQUFBQU1BTWdCZEFpSUNVUUFMQUE4QUd3QThRRGtHQVFFQUFBSUJBR2tBQWdBREJRSURad2NCQlFRRUJWa0hBUVVGQkdFQUJBVUVVUkFRQUFBUUd4QWFGaFFQRGcwTUFBc0FDaVFJQ2hjckFCWVZGQVlqSWlZMU5EWXpCeUVWSVFRV0ZSUUdJeUltTlRRMk13RkZKaWNhR3lZbUcvZ0I4UDRRQVJNbUpoc2JKaVliQWxFaUlDQWhJU0FnSXRSTVVTSWdJQ0VoSUNBaUFBQUFBZ0F5QU13Q0lnSGlBQU1BQndBaVFCOEFBQUFCQWdBQlp3QUNBd01DVndBQ0FnTmZBQU1DQTA4UkVSRVFCQW9hS3hNaEZTRVZJUlVoTWdIdy9oQUI4UDRRQWVKS2drb0FBUUF5QUVvQ0lnSmtBQk1BY2t1d0NsQllRQ29BQ0FjSENIQUFBd0lDQTNFS0NRSUhCZ0VBQVFjQWFBVUJBUUlDQVZjRkFRRUJBbDhFQVFJQkFrOGJRQ2dBQ0FjSWhRQURBZ09HQ2drQ0J3WUJBQUVIQUdnRkFRRUNBZ0ZYQlFFQkFRSmZCQUVDQVFKUFdVQVNBQUFBRXdBVEVSRVJFUkVSRVJFUkN3b2ZLd0VWSXdjekZTRUhJemNqTlRNM0l6VWhOek1IQWlLOUwreisraTlHTDZTK0wrMEJCeTlHTHdIaVNvSktnb0pLZ2txQ2dnQUFBUUJVQUZFQ0RBSmRBQVlBQnJNRUFRRXlLeE0zQlJVRkp5VlZJUUdXL21zakFXVUNHa1BvUHVZN3lnQUJBRWdBVVFJQUFsMEFCZ0FHc3dZREFUSXJBUVVGQnlVMUpRSC8vcDBCWkNQK2F3R1dBaDNHeVQzb1BlY0FBQUFDQURJQVRnSWlBbDBBQmdBS0FDRkFIZ1lGQkFNQ0FRWUJTZ0FCQUFBQlZ3QUJBUUJmQUFBQkFFOFJGd0lLR0NzVE53VVZCU2NsRXlFMUlUSVpBZGYrS1JrQm9rNytFQUh3QWhoRnFWT21RNDMrdzBvQUFBQUFBZ0F5QUU0Q0lnSmRBQVlBQ2dBaFFCNEdCUVFEQWdFR0FVb0FBUUFBQVZjQUFRRUFYd0FBQVFCUEVSY0NDaGdyQVJjRkJRY2xOUUVoTlNFQ0NSbitYZ0dpR2Y0cEFmRCtFQUh3QWwxRmpZMURwbFArbWtvQUFBSUFNZ0JPQWlJQ2JRQUxBQThBT0VBMUJBRUFBd0VCQWdBQlp3Z0JCUUFDQndVQ1p3QUhCZ1lIVndBSEJ3WmZBQVlIQms4QUFBOE9EUXdBQ3dBTEVSRVJFUkVKQ2hzckFSVXpGU01WSXpVak5UTTFBU0UxSVFGUTB0SkwwOU1CSGY0UUFmQUNiYlJLdExSS3RQM2hTZ0FDQURJQXZBSWlBZklBRlFBckFGdEFXQklJQWdJQkV3Y0NBd0FvSGdJR0JTa2RBZ2NFQkV3QUFRQUFBd0VBYVFBQ0NBRURCUUlEYVFBR0JBY0dXUUFGQUFRSEJRUnBBQVlHQjJFSkFRY0dCMUVXRmdBQUZpc1dLaWNsSVI4Y0dnQVZBQlFrSXlRS0Noa3JBQ1luSmlZaklnYzFOak15RmhjV0ZqTXlOeFVHSXdZbUp5WW1JeUlITlRZek1oWVhGaFl6TWpjVkJpTUJleThmSkRNalBVUkdQaUUwSUNFeEh6aE9Ra2NlTHg4a015TTlSRW83SURRZ0lURWZPRTVDUndGekRRd09EU0ZHSmc0TkRRMGpSaWUzRFF3T0RTRkhKUTRORFEwalJpY0FBQUVBUGdFV0FoWUJtQUFaQURTeEJtUkVRQ2tBQkFFQUJGa0dCUUlEQUFFQUF3RnBBQVFFQUdFQ0FRQUVBRkVBQUFBWkFCa2tJaElrSWdjS0d5dXhCZ0JFQVFZR0l5SW1KeVltSXlJR0J5TTJOak15RmhjV0ZqTXlOamNDRmd4S01CYzFKU1VvRWhrYUIwZ0tReThXTUNjaUxSTWJKQVlCbUVFK0Rnd01DaGdiUHo4TURRc01IQmdBQUFBQUFRQXlBSmdDSWdHWkFBVUFIa0FiQUFFQ0FZWUFBQUlDQUZjQUFBQUNYd0FDQUFKUEVSRVFBd29aS3hNaEVTTTFJVElCOEUvK1h3R1ovdisxQUFBQUFBRUFQd0dnQWxvQzhnQUdBQ2V4Qm1SRVFCd0RBUUFDQVV3REFRSUFBb1VCQVFBQWRnQUFBQVlBQmhJUkJBb1lLN0VHQUVRQkV5TURBeU1UQVhqaVlxdXNZdUlDOHY2dUFRTCsvZ0ZTQUFBQUF3QVZBSDRDNEFIbEFCY0FJd0F1QUVwQVJ5c2FGQWdFQlFRQlRBZ0RBZ0lHQVFRRkFnUnBDZ2NKQXdVQUFBVlpDZ2NKQXdVRkFHRUJBUUFGQUZFa0pCZ1lBQUFrTGlRdEtpZ1lJeGdpSGh3QUZ3QVdKQ1FrQ3dvWkt3QVdGUlFHSXlJbUp3WUdJeUltTlRRMk16SVdGelkyTXdBMk55WW1JeUlHRlJRV015QTJOVFFtSXlJSEZoWXpBb1phWDFCQVdTWWtZRHRHV0dOUlAxY21JbDg1L3F0Qkp5VTdLaXMxTWlvQmx6SXpLVWRGSlR3ckFlUmZVRkpsUURnMlFWNU9WR1pBT0RkQS91RXhNanM3UFRJd09qa3lNVDFrT2pzQUFRQU0vMmNCNmdMSkFCb0FLa0FuRFFFQ0FRNEJBQUlhQVFNQUEwd0FBQUFEQUFObEFBSUNBV0VBQVFGUUFrNGxKQ1VpQkFvYUt4Y1dGak15TmpjVE5qWXpNaFlYQnlZaklnWUhBd1lHSXlJbUp4OE9LQkltS3dZcUIxVkZIRGtNRGlRa0p5Z0ZLZ2hZUkJzN0VEd0dCelJKQWZGVVVBb0dTd3d5UC80U1lGUUxDQUFBQVFBYy8yY0IrQUs4QUFzQUgwQWNCQUVDQVFLR0JRTUNBUUVBWHdBQUFFZ0JUaEVSRVJFUkVBWUtIQ3NUSVJVakVTTVJJeEVqRVNNY0FkdzZWcnhXT2dLOFVmejhBd1Q4L0FNRUFBRUFHUDluQWVBQ3ZBQUxBQ3RBS0FRQkFnRUpBd0lEQWdJQkFBTURUQUFEQUFBREFHTUFBZ0lCWHdBQkFVZ0NUaElSRkJBRUNob3JCU0UxRXdNMUlSVWhFd01oQWVEK09McTZBY2orbmJ1N0FXT1pUd0ZnQVZkUFZmNnYvcWNBQUFFQVlmOW5BakVDdkFBSUFDRkFIZ2dIQmdNQ0FRRk1BQUlCQW9ZQUFRRUFYd0FBQUVnQlRoRVJFQU1LR1NzQk14VWpBeU1uTnhjQm5aUlRxMUNDTzFvQ3ZGUDgvcjB3aHdBQUFQLy9BRkgvTWdJUkFnd0FBZ0kwQUFBQUFnQXgvL01DS0FMekFCTUFId0F2UUN3UUFRSUJBVXdUQVFGS0FBSUNBV0VBQVFGVFRRUUJBd01BWVFBQUFGRUFUaFFVRkI4VUhpa21KUVVLR1NzQkZoWVZGQVlqSWlZbU5UUTJOak15RnlZbUp4STJOVFFtSXlJR0ZSUVdNd0VMbG9lRmRrUnpSVUp0UVdNNEgyOVFsbGhiU0VoVVYwa0M4MDdxbVpLZFBIeGJXM3M3UmxGeExQMkVhRnBhYUdkYldtZ0FBQVVBSlAvMEF1RUN5QUFMQUE4QUd3QW5BRE1Ba2t1d0ZGQllRQ3NMQVFVS0FRRUdCUUZwQUFZQUNBa0dDR29BQkFRQVlRTUJBQUJRVFEwQkNRa0NZUXdIQWdJQ1NRSk9HMEF6Q3dFRkNnRUJCZ1VCYVFBR0FBZ0pCZ2hxQUFNRFNFMEFCQVFBWVFBQUFGQk5BQUlDU1UwTkFRa0pCMkVNQVFjSFVRZE9XVUFtS0NnY0hCQVFBQUFvTXlneUxpd2NKeHdtSWlBUUd4QWFGaFFQRGcwTUFBc0FDaVFPQ2hjckVpWTFORFl6TWhZVkZBWWpFeU1CTXdRMk5UUW1JeUlHRlJRV013QW1OVFEyTXpJV0ZSUUdJelkyTlRRbUl5SUdGUlFXTTN0WFYwSkRWVlZEQkU0QjJVMytTeWdvSnlZc0t5Y0JTbGhYUTBKV1ZrSW5LQ2duSnlzckp3R0ZWa3hMVmxaTVMxYitld0s4L1RVek1qVTJNVEkyL2pWV1RFMVZWa3hMVnpzMU1qSTJOekV4TmdBQUFBQUhBQ1QvOUFSREFzZ0FDd0FQQUJzQUp3QXpBRDhBU3dDdVM3QVVVRmhBTVE4QkJRNEJBUVlGQVdrSUFRWU1BUW9MQmdwcUFBUUVBR0VEQVFBQVVFMFREUklEQ3dzQ1lSRUpFQWNFQWdKSkFrNGJRRGtQQVFVT0FRRUdCUUZwQ0FFR0RBRUtDd1lLYWdBREEwaE5BQVFFQUdFQUFBQlFUUUFDQWtsTkV3MFNBd3NMQjJFUkNSQURCd2RSQjA1WlFEWkFRRFEwS0NnY0hCQVFBQUJBUzBCS1JrUTBQelErT2pnb015Z3lMaXdjSnh3bUlpQVFHeEFhRmhRUERnME1BQXNBQ2lRVUNoY3JFaVkxTkRZek1oWVZGQVlqRXlNQk13UTJOVFFtSXlJR0ZSUVdNd0FtTlRRMk16SVdGUlFHSXlBbU5UUTJNeklXRlJRR0l5UTJOVFFtSXlJR0ZSUVdNeUEyTlRRbUl5SUdGUlFXTTN0WFYwSkRWVlZEQWs0QjJFNytUU2dvSnlZc0t5Y0JTbGhYUTBKV1ZrSUJJRmRXUTBKV1ZrTCt4U2dvSnljckt5Y0JpU2dvSnlZckt5WUJoVlpNUzFaV1RFdFcvbnNDdlAwMU16STFOakV5TnY0MVZreE5WVlpNUzFkV1RFMVZWa3hMVnpzMU1qSTJOekV4TmpVeU1qWTNNVEUyQUFJQUhBQUFBYkFDZGdBRkFBa0FJMEFnQ1FnSEJBRUZBUUFCVEFBQUFBRmZBZ0VCQVVrQlRnQUFBQVVBQlJJRENoY3JNd01UTXhNREF3Y1hON1NZbUdTWW1EQnhjVzBCUEFFNi9zYit4QUlxN3ZEd0FBSUFMdjl4QTBVQ2d3QTRBRVVBWGtCYkZRRUlBajBXQWdNSUNnRUFBeXdCQlFBdEFRWUZCVXdLQVFjQUJBSUhCR2tBQWdBSUF3SUlhUXNKQWdNQkFRQUZBd0JwQUFVR0JnVlpBQVVGQm1FQUJnVUdVVGs1QUFBNVJUbEVRRDRBT0FBM0pTWWtKaVVqSmd3S0hTc0FGaFlWRkFZR0l5SW1Kd1lqSWlZMU5EWTJNeklYQndZVkZCWXpNalkxTkNZaklnWUdGUlFXRmpNeU5qY1hCZ1lqSWlZbU5UUTJOak1TTnpRM055WWpJZ1lWRkJZekFrV21XakpjUHljNER6Rk1PMUU0WkVGSFB4MEJIaGczUXBlSFlaeGJVSWhUSkdFakZTaG1NbU9zYW0vQmVBSWlBaGNmSVQxRkxDUUNnMDZUWjBwMVF4d2JNMVZVUUY0ekdzc0hEU0VnWlZlQWhGR2FhbUNKUnc4TFFROFJVYWw5ZXJ0bS9mMHVDQlNrQjA0K05UUUFBQUFEQUUvLzd3S29Bc2tBSUFBdEFEY0FPVUEyTUM4a0lCMGNHUmdNQWdvREFnRk1BUUVBU1FBQ0FnRmhBQUVCVUUwRUFRTURBR0VBQUFCUkFFNHVMaTQzTGpZcktTc2tCUW9ZS3lVSEp3WUdJeUltTlRRMk56Y21KalUwTmpNeUZoVVVCd2NYTmpjM0Z3Y0dCd0FXRmhjM05qVTBKaU1pQmhVU055Y0hCZ1lWRkJZekFxZzZjeXBwUm1adE9Uc2JPVE5tVzFSbFppdVFBeFFxU3lnUEYvNmZGaUlqSlU4NExEVTJ0aittSlNVaFBEa3NQV3cyTVZ0S05Ga3JGRGROTjB4ZFUwUmRVQ0dIQlRGbkgyVW5MQUZoS2lNZkd6bEJLU1l5TFA0blQ1d2RHellmS3pNQUFBQUFBUUJFQUFBQnJ3SzhBQTBBSjBBa0J3RUFBUUZNQUFFQkExOEVBUU1EU0UwQ0FRQUFTUUJPQUFBQURRQU1FUkVSQlFvWkt3RVJJeEVqRVNNUkppWTFORFl6QWE5Rk8wVlVVbGxoQXJ6OVJBSjcvWVVCY1FsWVNFdFhBQUFDQUVyLzhRRzBBc2tBTVFBOUFGRkFUZ0lCQUFNckF3SUZBQm9TQWdJRUdRRUJBZ1JNQndFRkFBUUFCUVNBQUFRQ0FBUUNmZ0FBQUFOaEJnRURBMUJOQUFJQ0FXSUFBUUZSQVU0eU1nQUFNajB5UERnMkFERUFNQ1F2SlFnS0dTc0FGaGNISmlZaklnWVZGQllXRnhZV0ZSUUhGaFVVQmlNaUp6Y1dGak15TmpVMEppY21KeVltTlRRMk55WW1OVFEyTXdJR0ZSUVdNekkyTlRRbUl3RXZUeHNYR1VFZk16UWpNakZFU0dKaFpWaGdUQmtiU3lZMk5qWTVKdzB5T0RFc0tURmZWREkyTlM4dk5qY3VBc2tSREQ4S0N5VWZHeUFRREJFNE9sTW1IMUEvVENWQkR4QWxKQ0lkREFrRUVUczFLMEFORHowblAwWCs1aXdtSnlvcUp5WXNBQU1BTGYveUF3RUN5Z0FQQUI4QU9BQmtzUVprUkVCWktBRUZCRFVwQWdZRk5nRUhCZ05NQUFBQUFnUUFBbWtBQkFBRkJnUUZhUUFHQ2dFSEF3WUhhUWtCQXdFQkExa0pBUU1EQVdFSUFRRURBVkVnSUJBUUFBQWdPQ0EzTXpFdEt5Y2xFQjhRSGhnV0FBOEFEaVlMQ2hjcnNRWUFSQVFtSmpVME5qWXpNaFlXRlJRR0JpTStBalUwSmlZaklnWUdGUlFXRmpNbUpqVTBOall6TWhjSEppWWpJZ1lWRkJZek1qWTNGd1lqQVRhbVkyT21ZbUdtWW1LbVlWT0pVRkNKVTFPS1VWQ0tWRTVuTWxFd1R6RWFHeW9mTmtKSE5pQXdGUnd6VWc1YXBtMXRwVmxacFcxdHBsbzdTNHRjWElwS1M0cGJYSXRMZW1CY1BsUXBLekFTRUVROVBFWVNFakl0QUFRQUxmL3lBd0VDeWdBUEFCOEFMUUExQUd5eEJtUkVRR0VtQVFZSUFVd0hBUVVHQWdZRkFvQUtBUUVMQVFNRUFRTnBEQUVFRFFFSkNBUUphUUFJQUFZRkNBWm5BQUlBQUFKWkFBSUNBR0VBQUFJQVVTNHVJU0FRRUFBQUxqVXVOREV2TENzcUtTZ25JQzBoTFJBZkVCNFlGZ0FQQUE0bURnb1hLN0VHQUVRQUZoWVZGQVlHSXlJbUpqVTBOall6RGdJVkZCWVdNekkyTmpVMEppWWpGeklXRlJRR0J4Y2pKeU1WSXhFWEZUTXlOalUwSXdINXBtSmlwbUZpcG1OanBtSlRpbEZRaWxSVGlWQlFpVk1GUWpza0hWUkVSMGs1T1VBZkkwSUN5bG1sYlcybVdscW1iVzJsV1R0TGlsdGNpMHRMaTF4Y2lrcDNPaTBqTWc2ZGpJd0Jaelp4SVJvMkFBSUFRQUUvQXl3Q3ZBQUhBQlFBTzBBNEZBOE1Bd1lCQVV3QUJnRUNBUVlDZ0FNQkFRRUFYd2dFQWdBQVNFMEhCUUlDQWdCZkNBUUNBQUJJQWs0UkVoSVJFUkVSRVJBSkNoOHJFeUVWSXhFakVTTWxNeEVqTlFjakp4VWpFVE1YUUFFc2NrcHdBcmcwU25RWmNFZzhpd0s4UlA3SEFUbEUvb1BreE1QakFYMzFBQUFBQUFJQU1RRzVBVXdDeFFBTEFCY0FON0VHWkVSQUxBUUJBUVVCQXdJQkEya0FBZ0FBQWxrQUFnSUFZUUFBQWdCUkRBd0FBQXdYREJZU0VBQUxBQW9rQmdvWEs3RUdBRVFTRmhVVUJpTWlKalUwTmpNR0JoVVVGak15TmpVMEppUDRWRlE2T2xOVE9oNGxKUjRmSlNVZkFzVkdRVUZFUkVGQlJrTWpJU0VqSXlFaEl3QUFBQUVBVy8rdkFKZ0RQd0FEQUJGQURnQUFBUUNGQUFFQmRoRVFBZ29ZS3hNekVTTmJQVDBEUC94d0FBQUFBZ0JiLzY4QW1BTS9BQU1BQndBaVFCOEFBUUFBQXdFQVp3QURBZ0lEVndBREF3SmZBQUlEQWs4UkVSRVFCQW9hS3hNakVUTVJJeEV6bUQwOVBUMEJ5UUYyL0hBQmVnQUFBUUFqQUFBQmdBSzhBQXNBSTBBZ0FBVUZTRTBEQVFFQkFGOEVBUUFBUzAwQUFnSkpBazRSRVJFUkVSQUdDaHdyRXpNVkl4RWpFU00xTXpVei9ZT0RWb1NFVmdJTVN2NCtBY0pLc0FBQUFBQUJBQ01BQUFGdkFyMEFFd0EzUURRRkFRRUVBUUlEQVFKbkFBZ0lTRTBHQVFBQUIxOEtDUUlIQjB0TkFBTURTUU5PQUFBQUV3QVRFUkVSRVJFUkVSRVJDd29mS3dFVkl4VXpGU01SSXhFak5UTTFJelV6TlRNVkFXOThmSHhWZTN0N2UxVUNGa3R4VFA3eUFRNU1jVXVucHdBQUFBSUFLQUFBQXpBQ3hBQWFBQ29BUDBBOEFBTUJBZ0VEQW9BSUFRVUFBUU1GQVdjQUJnWUFZUUFBQUZCTkFBSUNCR0VIQVFRRVNRUk9IQnNBQUNRaUd5b2NLUUFhQUJrU0p4SW1DUW9hS3lBbUpqVTBOall6TWhZWElTSUdGUlVVRmhZek1qWTNNd1lHSXhNeU5qVTFOQ1ltSXlJR0JoVVZGRE1CTzdCalk3RndyczRJL1pjSUIwRnZSRWVESzBoRmpHempDZ1pNY3pWQWIwUVBWNkJxYWFGWnZhOEdESzBVUEMwL01rNC9BVzRIQ2FzYlBpa3VQQkc1Q1FELy93QXQvOVVEUkFMbkFRWUM3djlrQUFpeEFBS3daTEExS3dBQUFBTUFUZi96QWhrQ1JRQWRBQ2tBTXdBNVFEWXRMQ0FkR3hvWUZ3c0NDZ01DQVFFQUF3Sk1BQUlDQVdFQUFRRXdUUVFCQXdNQVlRQUFBREVBVGlvcUtqTXFNaWNsS2lRRkNCZ3JKUWNuQmdZaklpWTFORFkzSmlZMU5EWXpNaFlWRkFZSEZ6WTNGd1lIQUJZWE5qWTFOQ1lqSWdZVkVqWTNKd1lHRlJRV013SVpOVTBrU3pSUVZ6b3pLaVJWUmtKUlBUbHBIU0JDS3lIKytoOGNLaXdsSUNNcFhqVVpleVFtTENrd05Fd3ZKa3MvTlU0bUxFRW1QMDFETnpGT0xHYzJSUmxjT0FFZU5DQWZNeDhlSVNnZC9ub2dJM3NmTlI4aEtnQUFBUC8vQUVuL3FBRzJBaFFBQWdMVEFBQUFCUUFrLy9jQ2J3SkZBQXNBRHdBWkFDVUFMd0NTUzdBYlVGaEFLd3NCQlFvQkFRWUZBV2tBQmdBSUNRWUlhZ0FFQkFCaEF3RUFBREJORFFFSkNRSmhEQWNDQWdJdEFrNGJRRE1MQVFVS0FRRUdCUUZwQUFZQUNBa0dDR29BQXdNc1RRQUVCQUJoQUFBQU1FMEFBZ0l0VFEwQkNRa0hZUXdCQndjeEIwNVpRQ1ltSmhvYUVCQUFBQ1l2Smk0cUtCb2xHaVFnSGhBWkVCZ1VFZzhPRFF3QUN3QUtKQTRJRnlzU0pqVTBOak15RmhVVUJpTURJd0V6QkRVMEl5SUdGUlFXTXdBbU5UUTJNeklXRlJRR0l6WTFOQ01pQmhVVUZqTnVTa280T1VwSk9oTTlBWjQrL3JJK0hTRWhIUUVOU2tvNU9VcEpPajA5SGlBZ0hnRkFSajA5UlVZOVBVWCt3QUk4eDA1TktDVWxLZjZDUlQ0K1JVWTlQVVkyVFU0cEpTVW9BQUFBQUFjQUpQLzNBNW9DUlFBTEFBOEFHUUFsQURFQU93QkdBSzVMc0J0UVdFQXhEd0VGRGdFQkJnVUJhUWdCQmd3QkNnc0dDbW9BQkFRQVlRTUJBQUF3VFJNTkVnTUxDd0poRVFrUUJ3UUNBaTBDVGh0QU9ROEJCUTRCQVFZRkFXa0lBUVlNQVFvTEJncHFBQU1ETEUwQUJBUUFZUUFBQURCTkFBSUNMVTBURFJJREN3c0hZUkVKRUFNSEJ6RUhUbGxBTmp3OE1qSW1KaG9hRUJBQUFEeEdQRVZCUHpJN01qbzJOQ1l4SmpBc0tob2xHaVFnSGhBWkVCZ1VFZzhPRFF3QUN3QUtKQlFJRnlzU0pqVTBOak15RmhVVUJpTURJd0V6QkRVMEl5SUdGUlFXTXdBbU5UUTJNeklXRlJRR0l6SW1OVFEyTXpJV0ZSUUdJeVkxTkNNaUJoVVVGak1nTlRRbUl5SUdGUlFXTTI1S1NqZzVTa2s2RXowQm5qNytzajRkSVNFZEFRMUtTams1U2trNjhrbEtPRGxLU1RydVBSNGdJQjRCYUI0ZUhpRWdId0ZBUmowOVJVWTlQVVgrd0FJOHgwNU5LQ1VsS2Y2Q1JUNCtSVVk5UFVaRlBqNUZSajA5UmpaTlRpa2xKU2hOSmlncEpTVW9BQUFDL3RZQ1lmL21Bc29BQ3dBWEFES3hCbVJFUUNjQ0FRQUJBUUJaQWdFQUFBRmhCUU1FQXdFQUFWRU1EQUFBREJjTUZoSVFBQXNBQ2lRR0NoY3JzUVlBUkFBbU5UUTJNeklXRlJRR0l6SW1OVFEyTXpJV0ZSUUdJLzd5SEJ3WEZ4d2NGNVFkSEJnV0hCd1dBbUViR1JvYkd4b2FHaHNaR2hzYkdoa2JBQUFBQUFIL1JRSmIvN3dDemdBTEFDZXhCbVJFUUJ3Q0FRRUFBQUZaQWdFQkFRQmhBQUFCQUZFQUFBQUxBQW9rQXdvWEs3RUdBRVFDRmhVVUJpTWlKalUwTmpObkl5TVpHU0lpR1FMT0hSd2NIaDRjSEIwQUFBSC9BQUpPLzcwQ3lBQURBQm14Qm1SRVFBNEFBQUVBaFFBQkFYWVJFQUlLR0N1eEJnQkVBVE1YSS84QWRVaEJBc2g2QUFBQi93Z0NUdi9CQXNnQUF3QVpzUVprUkVBT0FBQUJBSVVBQVFGMkVSQUNDaGdyc1FZQVJBTXpCeU94Y25oQkFzaDZBQUFBQXY3WEFsTC82QUxLQUFNQUJ3QWxzUVprUkVBYUF3RUJBQUFCVndNQkFRRUFYd0lCQUFFQVR4RVJFUkFFQ2hvcnNRWUFSQU1qTnpNWEl6Y3o4ellUWFR3M1BWOENVbmg0ZUFBQUFBSC9nZ0pXLzlnQzhBQURBQzFMc0IxUVdFQUxBQUVCQUY4QUFBQktBVTRiUUJBQUFBRUJBRmNBQUFBQlh3QUJBQUZQV2JRUkVBSUtHQ3NETXdjamVWRXBMUUx3bWdBQUFBSCsxQUpZLytjQ3pnQUdBQ2V4Qm1SRVFCd0RBUUFDQVV3REFRSUFBb1VCQVFBQWRnQUFBQVlBQmhJUkJBb1lLN0VHQUVRREZ5TW5CeU0zaFd4Uk56Vldjd0xPZGpjM2RnQUFBQUFCL3RRQ1ZmL25Bc2NBQmdBYnNRWmtSRUFRQWdFQUFRQ0ZBQUVCZGhFUkVRTUtHU3V4QmdCRUF6Y3pCeU1uTTU4NFRtZzhiMVlDakR0eWNnQUIvdEFDVWYveUFzc0FEUUF1c1Faa1JFQWpCQU1DQVFJQmhRQUNBQUFDV1FBQ0FnQmhBQUFDQUZFQUFBQU5BQTBpRWlJRkNoa3JzUVlBUkFNR0JpTWlKaWN6RmhZek1qWTNEZ2xSTnpkU0NEc0dMaUloTEFZQ3l6cEFRRG9lSWlFZkFBQUFBdjcxQWp6L3h3TUJBQXNBRndBNHNRWmtSRUF0QUFBQUFnTUFBbWtGQVFNQkFRTlpCUUVEQXdGaEJBRUJBd0ZSREF3QUFBd1hEQllTRUFBTEFBb2tCZ29YSzdFR0FFUUNKalUwTmpNeUZoVVVCaU0yTmpVMEppTWlCaFVVRmpQUk9qb3ZManM3TGhZWUdCWVlHQmtYQWp3NEtpczRPU29xT0RBZEZSWWNIQllWSFFBQUFmN0ZBbGIvK3dMTkFCZ0FOYkVHWkVSQUtoZ0JBd0lNQ3dJQUFRSk1BQU1CQUFOWkFBSUFBUUFDQVdrQUF3TUFZUUFBQXdCUkpDVWtJUVFLR2l1eEJnQkVBd1lqSWlZbkppWWpJZ1lISnpZMk16SVdGeFlXTXpJMk53VWtQQkViRXhJV0RSRVpDaTRPTlI0VEhoUVJGQXNSRlFzQ3MxME9EUXdNRnhjVUx5OFFEZ3dMSEJjQUFBSCs1Z0pzLzlZQ3BBQURBQ0N4Qm1SRVFCVUFBQUVCQUZjQUFBQUJYd0FCQUFGUEVSQUNDaGdyc1FZQVJBRXpGU1ArNXZEd0FxUTRBQUFBQUFIL09BSXkvOWdDNWdBT0FDcXhCbVJFUUI4R0FRQUJBVXdPQVFCSkFBRUFBQUZaQUFFQkFHRUFBQUVBVVNJVUFnb1lLN0VHQUVRRE5qVTBKZ2MxTmpNeUZoVVVCZ2U1UlNzcEZnbzRTRHMxQWxzVEhCTVdBVElDTEN3aUxnd0FBQUgvSVFJcy81NEREUUFQQUIreEJtUkVRQlFKQmdVREFFb0JBUUFBZGdBQUFBOEFEZ0lLRml1eEJnQkVBaVkxTkRZM0Z3WUdCeFlXRlJRR0k4QWZMekljR1NJRkV4MGZGZ0lzSWg4cFZTSVdGVFFZQWg0V0dSc0FBQUFBQWY2SUFjZi9md0owQUJJQWRMRUdaRVJMc0F4UVdFQVpBQUFEQXdCd0JBRURBUUVEV1FRQkF3TUJZZ0lCQVFNQlVodExzQlpRV0VBWUFBQURBSVVFQVFNQkFRTlpCQUVEQXdGaUFnRUJBd0ZTRzBBZEFBQURBSVVBQkFJQkJGa0FBd0FDQVFNQ2FRQUVCQUZpQUFFRUFWSlpXYmNqRVJJakVBVUtHeXV4QmdCRUF6TVZGQVlqSWljbUl6VXlGeFlXTXpJMk5jeExSVDhMTFNZVkZpWUhJUTBnR3dKME9qZzdCUVk2QmdFRUdod0FBQUFBQWY4Ky8xSC9wLys3QUFzQUo3RUdaRVJBSEFJQkFRQUFBVmtDQVFFQkFHRUFBQUVBVVFBQUFBc0FDaVFEQ2hjcnNRWUFSQVlXRlJRR0l5SW1OVFEyTTNnZkh4WVZIeDhWUlJzYUdoc2JHaG9iQUFBQUFmOWwvekwvdXYvTEFBTUFJTEVHWkVSQUZRQUFBUUVBVndBQUFBRmZBQUVBQVU4UkVBSUtHQ3V4QmdCRUJ6TUhJNVpRS0MwMW1RQUIvd0wvTHYrOUFBY0FHZ0J0c1Faa1JFQVBHQUVEQUJjTUFnSURDd0VCQWdOTVM3QVVVRmhBSHdBQUJBTUVBSElBQkFBREFnUURhUUFDQVFFQ1dRQUNBZ0ZoQUFFQ0FWRWJRQ0FBQUFRREJBQURnQUFFQUFNQ0JBTnBBQUlCQVFKWkFBSUNBV0VBQVFJQlVWbTNFeVFsSkNFRkNoc3JzUVlBUkFjMk16SVdGUlFHSXlJbUp6Y1dGak15TmpVMEppTWlCeWMzTTdVSUZpUXdQakVWS3d3TUNTSVFGeHdaRVJjTkdURTBQd1FtSGljc0RBZ3ZDQXNSRUE0UkJoMVNBQUFCL3dqL0x2K1NBQTBBRHdBc3NRWmtSRUFoREFZRkF3QktBQUFCQVFCWkFBQUFBV0VDQVFFQUFWRUFBQUFQQUE0cEF3b1hLN0VHQUVRR0pqVTBOamNYQmhVVU16STNCd1lqeXkweEtTVXlKUTRLQkJJZTBpb2lKRTBpRFQ4eEtRSXpDQUQvL3dBb0FtRUJPQUxLQUFNREFBRlNBQUFBQVAvL0FDZ0NXd0NmQXM0QUF3TUJBT01BQUFBQS8vOEFLQUpPQU9VQ3lBQURBd0lCS0FBQUFBRC8vd0FvQWs0QTRRTElBQU1EQXdFZ0FBQUFBUC8vQUNnQ1VnRTVBc29BQXdNRUFWRUFBQUFBLy84QUp3SllBVG9DemdBREF3WUJVd0FBQUFELy93QW5BbFVCT2dMSEFBTURCd0ZUQUFBQUFQLy9BQ2dDVVFGS0Fzc0FBd01JQVZnQUFBQUEvLzhBS0FJOEFQb0RBUUFEQXdrQk13QUFBQUQvL3dBb0FsWUJYZ0xOQUFNRENnRmpBQUFBQVAvL0FDZ0NiQUVZQXFRQUF3TUxBVUlBQUFBQS8vOEFKLzh1QU9JQUJ3QURBeEVCSlFBQUFBRC8vd0FuL3k0QXNRQU5BQU1ERWdFZkFBQUFBQUFDL3M4RENmL3RBM0lBQ3dBWEFDcEFKd0lCQUFFQkFGa0NBUUFBQVdFRkF3UURBUUFCVVF3TUFBQU1Gd3dXRWhBQUN3QUtKQVlLRnlzQUpqVTBOak15RmhVVUJpTXlKalUwTmpNeUZoVVVCaVArNnh3Y0Z4Y2NIQmVoSEJ3WUZod2NGZ01KR3hrYUd4c2FHUnNhR2hvYkd4b1pHd0FBQUFBQi8wVURDLys4QTMwQUN3QWZRQndDQVFFQUFBRlpBZ0VCQVFCaEFBQUJBRkVBQUFBTEFBb2tBd29YS3dJV0ZSUUdJeUltTlRRMk0yY2pJeGtaSWlJWkEzMGRIQndkSFJ3Y0hRQUFBZjhBQXYzL3ZRTjRBQU1BRVVBT0FBQUJBSVVBQVFGMkVSQUNDaGdyQVRNWEkvOEFkVWhCQTNoN0FBQUIvd01DL3YrK0EzZ0FBd0FSUUE0QUFBRUFoUUFCQVhZUkVBSUtHQ3NETXdjanRuUjVRZ040ZWdBQUFBTCsxd01DLytnRGVnQURBQWNBSFVBYUF3RUJBQUFCVndNQkFRRUFYd0lCQUFFQVR4RVJFUkFFQ2hvckF5TTNNeGNqTnpQek5oTmRQRGM5WHdNQ2VIaDRBQUFBQWY3VUF3ai81d04rQUFZQUgwQWNBd0VBQWdGTUF3RUNBQUtGQVFFQUFIWUFBQUFHQUFZU0VRUUtHQ3NERnlNbkJ5TTNoV3hSTnpWV2N3TitkamMzZGdBQUFBQUIvdGdEQi8vckEzZ0FCZ0FUUUJBQ0FRQUJBSVVBQVFGMkVSRVJBd29aS3dNM013Y2pKek9iTjA5cE8yOVZBejQ2Y1hFQUFmN1FBdi8vOGdONEFBMEFKa0FqQkFNQ0FRSUJoUUFDQUFBQ1dRQUNBZ0JoQUFBQ0FGRUFBQUFOQUEwaUVpSUZDaGtyQXdZR0l5SW1Kek1XRmpNeU5qY09DVkUzTjFJSU93WXVJaUVzQmdONE9qOC9PaDRoSVI0QUFBQUMvdlVDMlAvSEE1MEFDd0FYQURCQUxRQUFBQUlEQUFKcEJRRURBUUVEV1FVQkF3TUJZUVFCQVFNQlVRd01BQUFNRnd3V0VoQUFDd0FLSkFZS0Z5c0NKalUwTmpNeUZoVVVCaU0yTmpVMEppTWlCaFVVRmpQUk9qb3ZManM3TGhZWUdCWVlHQmtYQXRnNEtpczRPU29xT0RBZEZSWWNIQllWSFFBQUFmN0ZBd2IvK3dOOUFCZ0FMVUFxR0FFREFnd0xBZ0FCQWt3QUF3RUFBMWtBQWdBQkFBSUJhUUFEQXdCaEFBQURBRkVrSlNRaEJBb2FLd01HSXlJbUp5WW1JeUlHQnljMk5qTXlGaGNXRmpNeU5qY0ZKRHdSR3hNU0ZnMFJHUW91RGpVZUV4NFVFUlFMRVJVTEEyTmREZzBNREJjWEZDOHZFQTRNQ3h3WEFBQUIvdW9ESC8vU0ExVUFBd0FZUUJVQUFBRUJBRmNBQUFBQlh3QUJBQUZQRVJBQ0NoZ3JBVE1WSS83cTZPZ0RWVFlBQUFBQUFmNmlBdUwvUXdPVkFBNEFJa0FmQmdFQUFRRk1EZ0VBU1FBQkFBQUJXUUFCQVFCaEFBQUJBRkVpRkFJS0dDc0JOalUwSmdjMU5qTXlGaFVVQmdmK3NrVXNLUW9UUDBVN05RTUxFeHdURmdFeUFTMHFJaTRNQUFIL0lRTGMvNTREdlFBUEFCZEFGQWtHQlFNQVNnRUJBQUIyQUFBQUR3QU9BZ29XS3dJbU5UUTJOeGNHQmdjV0ZoVVVCaVBBSHk4eUhCa2lCUk1kSHhZQzNDSWZLVlVpRmhVMEdBSWVGaGtiQUFBQUFBSCtGZ0o4LzBrRFJnQVNBQ1ZBSWdBQUF3Q0ZBQUlDQTJFQUF3TlFUUUFCQVFSaEFBUUVTQUZPSXhFU0l4QUZDaHNyQVRNVkZBWWpJaWNtSXpVeUZoY1dNekkyTmY3OVRFSS9JVEk4SXgwOEJqZ2JIQmtEUmxVNVBBa0tOZ2dCQ0J3ZUFBQUIvenYvVGYrci83NEFDd0FmUUJ3Q0FRRUFBQUZaQWdFQkFRQmhBQUFCQUZFQUFBQUxBQW9rQXdvWEt3WVdGUlFHSXlJbU5UUTJNM1loSVJnV0lTRVdRaDBjR3gwZEd4c2VBQUFBQWY5Uy96TC9xUC9MQUFNQUUwQVFBQUFBQVY4QUFRRk5BVTRSRUFJS0dDc0hNd2NqcUZBb0xqV1pBQUFCL3dML0x2KzlBQWNBR2dCYlFBOFlBUU1BRnd3Q0FnTUxBUUVDQTB4THNCUlFXRUFhQUFBRUF3UUFjZ0FFQUFNQ0JBTnBBQUlDQVdFQUFRRlZBVTRiUUJzQUFBUURCQUFEZ0FBRUFBTUNCQU5wQUFJQ0FXRUFBUUZWQVU1WnR4TWtKU1FoQlFvYkt3YzJNeklXRlJRR0l5SW1KemNXRmpNeU5qVTBKaU1pQnljM003VUlGaVF3UGpFVkt3d01DU0lRRnh3WkVSY05HVEUwUHdRbUhpY3NEQWd2Q0FzUkVBNFJCaDFTQUFBQUFBSC9BLzh1LzQ0QURRQVBBQjlBSEF3R0JRTUFTZ0FBQUFGaEFnRUJBVlVCVGdBQUFBOEFEaWtEQ2hjckJpWTFORFkzRndZVkZETXlOd2NHSTlBdE5Dc2xOaVFOREFVUklOSXFJaVJOSWcwK01pa0NNZ2tBQUFBQi90RUNWLy93QXNFQURRQWVRQnNBQWdBQUFnQmxCQU1DQVFGSUFVNEFBQUFOQUEwaUVpSUZDaGtyQXhZR0l5SW1Oek1HRmpNeU5pY1ZCVkkrUGxFR09BSXVKU1V0QVFMQk1EbzZNQm9kSGhrQUFQLy8vdFlDWWYvbUFzb0FBZ01BQUFELy8vOUZBbHYvdkFMT0FBSURBUUFBLy8vL0FBSk8vNzBDeUFBQ0F3SUFBUC8vL3dnQ1R2L0JBc2dBQWdNREFBRC8vLzdYQWxMLzZBTEtBQUlEQkFBQS8vLysxQUpZLytjQ3pnQUNBd1lBQVAvLy90UUNWZi9uQXNjQUFnTUhBQUQvLy83UUFsSC84Z0xMQUFJRENBQUEvLy8rOVFJOC84Y0RBUUFDQXdrQUFQLy8vc1VDVnYvN0FzMEFBZ01LQUFELy8vN21BbXovMWdLa0FBSURDd0FBLy8vOTB3SXkvbk1DNWdBREF3eittd0FBQUFELy8vOGhBaXovbmdNTkFBSUREUUFBLy8vK2lBSEgvMzhDZEFBQ0F3NEFBUC8vL3o3L1VmK24vN3NBQWdNUEFBRC8vLzlQL3pML3BQL0xBQUlERU9vQUFBSC9Bdjh1LzcwQUJ3QWFBR1ZBRHhnQkF3QVhEQUlDQXdzQkFRSURURXV3RTFCWVFCOEFBQVFEQkFCeUFBUUFBd0lFQTJrQUFnRUJBbGtBQWdJQllRQUJBZ0ZSRzBBZ0FBQUVBd1FBQTRBQUJBQURBZ1FEYVFBQ0FRRUNXUUFDQWdGaEFBRUNBVkZadHhNa0pTUWhCUWdiS3djMk16SVdGUlFHSXlJbUp6Y1dGak15TmpVMEppTWlCeWMzTTdVSUZpUXdQakVWS3d3TUNTSVFGeHdaRVJjTkdURTBQd1FtSGljc0RBZ3ZDQXNSRUE0UkJoMVNBUC8vL3dqL0x2K1NBQTBBQWdNU0FBQUFBLzdWQWwzLzV3TktBQU1BRHdBYkFEVkFNZ0FBQmdFQkFnQUJad2dGQndNREF3SmhCQUVDQWxBRFRoQVFCQVFBQUJBYkVCb1dGQVFQQkE0S0NBQURBQU1SQ1FvWEt3TW5NeGNHSmpVME5qTXlGaFVVQmlNeUpqVTBOak15RmhVVUJpTzdWVjQwa1J3Y0Z4Y2NIQmVXSFIwWEZ4c2JGd0xoYVdtRUd4a1pHeHNaR1JzYkdSa2JHeGtaR3dBRC90VUNYZi9uQTBvQUF3QVBBQnNBTGtBckFBQUFBUUlBQVdjSEJRWURBd01DWVFRQkFnSlFBMDRRRUFRRUVCc1FHaFlVQkE4RURpVVJFQWdLR1NzRE13Y2pCaVkxTkRZek1oWVZGQVlqTWlZMU5EWXpNaFlWRkFZam1tQlhQVUVjSEJjWEhCd1hsaDBkRnhjYkd4Y0RTbW1FR3hrWkd4c1pHUnNiR1JrYkd4a1pHd0FEL3RNQ1hmL25BMDRBQmdBU0FCNEFNa0F2QWdFQUFRQ0ZBQUVFQVlVRkFRTURCR0VJQmdjREJBUlFBMDRURXdjSEV4NFRIUmtYQnhJSEVTVVJFUkVKQ2hvckF6Y3pCeU1uTXdZV0ZSUUdJeUltTlRRMk16SVdGUlFHSXlJbU5UUTJNNkk1VEdrNGIxTUhIQndYRnh3Y0Y4UWJHeGNYSFIwWEF4UTZiR3lKR3hrWkd4c1pHUnNiR1JrYkd4a1pHd0FEL3RVQ1hmL25BeW9BQXdBUEFCc0FMa0FyQUFBQUFRSUFBV2NIQlFZREF3TUNZUVFCQWdKUUEwNFFFQVFFRUJzUUdoWVVCQThFRGlVUkVBZ0tHU3NCTXhVakZpWTFORFl6TWhZVkZBWWpNaVkxTkRZek1oWVZGQVlqL3VidzhBc2NIQmNYSEJ3WGxoMGRGeGNiR3hjREtqYVhHeGtaR3hzWkdSc2JHUmtiR3hrWkd3QUIvdE1DNHYvakEwNEFCZ0FUUUJBQ0FRQUJBSVVBQVFGMkVSRVJBd29aS3dNM013Y2pKek9pT1V4cE9HOVRBeFE2Ykd3QUF2N1JBbGYvOEFNL0FBTUFFUUFvUUNVQUFBQUJBd0FCWndBRUFBSUVBbVVHQlFJREEwZ0RUZ1FFQkJFRUVTSVNJeEVRQndvYkt3TXpCeU1YRmdZaklpWTNNd1lXTXpJMko1ZGdWejIyQlZJK1BsRUdPQUl1SlNVdEFRTS9hUlV3T2pvd0doMGVHUUFDL3RFQ1YvL3dBejhBQXdBUkFERkFMZ0FBQmdFQkF3QUJad0FFQUFJRUFtVUhCUUlEQTBnRFRnUUVBQUFFRVFRUkR3MExDZ2dHQUFNQUF4RUlDaGNyQXljekZ4Y1dCaU1pSmpjekJoWXpNalludUZWZU5HWUZVajQrVVFZNEFpNGxKUzBCQXRacGFSVXdPam93R2gwZUdRQUFBQUwrMFFKWC8vQURYUUFOQUJzQU1rQXZCZ0VBQVEwQkF3QUNUQUFCQUFBREFRQnBBQVFBQWdRQ1pRWUZBZ01EU0FOT0RnNE9HdzRiSWhJbkloUUhDaHNyQXpZMU5DWWpOVFl6TWhZVkZBY1hGZ1lqSWlZM013WVdNekkySjhVbEppUUpFalE3UlpBRlVqNCtVUVk0QWk0bEpTMEJBdVFSRmhNVUtnRXBKRFFhQVRBNk9qQWFIUjRaQUFBQUF2N1JBbGYvOEFOSkFCZ0FKZ0JBUUQwTUFRQUJDd0VGQUFKTUdBRUNTZ0FDQUFFQUFnRnBBQU1BQUFVREFHa0FCZ0FFQmdSbENBY0NCUVZJQlU0WkdSa21HU1lpRWlVa0pTUWhDUW9kS3dNR0l5SW1KeVltSXlJR0J5YzJOak15RmhjV0ZqTXlOamNYRmdZaklpWTNNd1lXTXpJMkp4RWpNdzhhRXhFVUN4QVhDaW9PTUJ3UUhCSURHd3dSRncwaUJWSStQbEVHT0FJdUpTVXRBUU0wVGdvTENRZ1RGQkFvSmdzS0FROFdGWWd3T2pvd0doMGVHUUFBQUFBQy90UUNVd0JGQXlvQUF3QUtBRE5BTUFrQkF3SUJUQVlFQWdNQ0E0WUFBQVVCQVFJQUFXY0FBZ0pJQWs0RUJBQUFCQW9FQ2dnSEJnVUFBd0FERVFjS0Z5c0ROek1IQlRjekZ5TW5CMDgxWDFmKzVuTTBiVkU0TmdMQWFtcHRaMmN3TUFBQUF2N1VBbE1BQVFNcUFBTUFDZ0JXdFFrQkF3SUJURXV3REZCWVFCY0dCQUlEQWdBRGNRVUJBUUFBQWdFQVp3QUNBa2dDVGh0QUZnWUVBZ01DQTRZRkFRRUFBQUlCQUdjQUFnSklBazVaUUJRRUJBQUFCQW9FQ2dnSEJnVUFBd0FERVFjS0Z5c0RGeU1uQnpjekZ5TW5Cek0wUEZXY2N6UnRVVGcyQXlwcWF0ZG5aekF3QUFBQUFBTCsxQUpUQUJvRE9BQU9BQlVBUEVBNURBRUFBUVVCQWdBVUJBSURBZ05NQmdRQ0F3SURoZ1VCQVFBQUFnRUFhUUFDQWtnQ1RnOFBBQUFQRlE4VkV4SVJFQUFPQUEwYUJ3b1hLd0lXRlJRSEp6WTJOVFFtSXpVMk13YzNNeGNqSndjZk9VSWZFeEVtSXhJSTJuTTBiVkU0TmdNNEtDTXlHaUVKRWdzU0ZTY0M1V2RuTURBQUFBQUMvczRDVS8vc0Ewa0FHQUFmQUUxQVNnOEJBUUFEQVFJREFnRUVBaDRCQlFRRVRBNEJBRW9JQmdJRkJBV0dBQUFIQVFNQ0FBTnBBQUVBQWdRQkFta0FCQVJJQkU0WkdRQUFHUjhaSHgwY0d4b0FHQUFYSlNNbENRb1pLd0lHQnljMk5qTXlGaGNXTXpJMk54Y0dCaU1pSmljbUppTUhOek1YSXljSDVoZ0tLZzh3R3hBZEVoc09FaGNNSnhJcUd3OFpFd0lnRGxaek5HMVJPRFlEREJNVUVDZ21Dd29RRnhRVkppZ0tDd0VRdVdkbk1EQUFBQUFBQVFBQUFBUUQxK0lqNGR0ZkR6ejFBQWNENkFBQUFBRGJRR0dnQUFBQUFOdEFVZEQ5MC84b0JFTUQ5UUFBQUFjQUFnQUFBQUFBQUFBQkFBQUQzdjhRQU1nRVovM1QvNjRFUXdBQkFBQUFBQUFBQUFBQUFBQUFBQUFESVFKRkFGc0JJQUFBQXEwQUdnS3RBQm9DclFBYUFxMEFHZ0t0QUJvQ3JRQWFBcTBBR2dLdEFCb0NyUUFhQXEwQUdnS3RBQm9DclFBYUFxMEFHZ0t0QUJvQ3JRQWFBcTBBR2dLdEFCb0NyUUFhQXEwQUdnS3RBQm9DclFBYUFxMEFHZ0t0QUJvRGVBQWFBbmdBV3dLTUFEWUNqQUEyQW93QU5nS01BRFlDakFBMkFvd0FOZ0syQUZzQ3RnQVdBcllBV3dLMkFCWUNUUUJiQWswQVd3Sk5BRnNDVFFCYkFrMEFXd0pOQUZzQ1RRQmJBazBBV3dKTkFGc0NUUUJiQWswQVd3Sk5BRnNDVFFCYkFrMEFXd0pOQUZzQ1RRQmJBazBBV3dKTkFGc0NFZ0JiQXNrQU5nTEpBRFlDeVFBMkFza0FOZ0xKQURZQ3lRQTJBdVFBV3dMa0FDQUM1QUJiQVJJQVd3TEpBRnNCRWdCUUFSTC8rQUVTLy8wQkV2Ly9BUkwvK2dFU0FFNEJFZ0JSQVJMLzlBRVNBRDBCRWdBVkFSSUFNd0VTLys4QnR3QU1BYmNBREFHM0FBd0Nmd0JiQW44QVd3SWNBRnNDSEFCTkFod0FXd0ljQUZzQ0hBQmJBaWdBREFONUFGc0M3UUJiQXUwQVd3THRBRnNDN1FCYkF1MEFXd0x0QUZzRERBQTJBd3dBTmdNTUFEWUREQUEyQXd3QU5nTU1BRFlEREFBMkF3d0FOZ01NQURZRERBQTJBd3dBTmdNTUFEWUREQUEyQXd3QU5nTU1BRFlEREFBMkF3d0FOZ01NQURZRERBQTJBd3dBTmdNTUFEWUREQUEyQXd3QU5nTU1BRFlEWHdBMkFqd0FXd0l5QUZzRERBQTJBb0FBV3dLQUFGc0NnQUJiQW9BQVd3SS9BQ2tDUHdBcEFqOEFLUUkvQUNrQ1B3QXBBajhBS1FLZUFGc0N4Z0EyQWxFQUZRSlJBQlVDVVFBVkFsRUFGUUpSQUJVQ3pnQmJBczRBV3dMT0FGc0N6Z0JiQXM0QVd3TE9BRnNDemdCYkFzNEFXd0xPQUZzQ3pnQmJBczRBV3dMT0FGc0N6Z0JiQXM0QVd3TE9BRnNDemdCYkFzNEFXd0xPQUZzQ3pnQmJBczRBV3dMT0FGc0N6Z0JiQXM0QVd3TE9BRnNDb1FBUUErUUFFQVBrQUJBRDVBQVFBK1FBRUFQa0FCQUNoQUFPQW1NQURnSmpBQTRDWXdBT0FtTUFEZ0pqQUE0Q1l3QU9BbU1BRGdKakFBNENZd0FPQW00QUxRSnVBQzBDYmdBdEFtNEFMUUl1QUMwQ0xnQXRBaTRBTFFJdUFDMENMZ0F0QWk0QUxRSXVBQzBDTGdBdEFpNEFMUUl1QUMwQ0xnQXRBaTRBTFFJdUFDMENMZ0F0QWk0QUxRSXVBQzBDTGdBdEFpNEFMUUl1QUMwQ0xnQXRBaTRBTFFJdUFDMENMZ0F0QTRFQUxRSllBRkVDRHdBdEFnOEFMUUlQQUMwQ0R3QXRBZzhBTFFJUEFDMENWUUF0QWxJQUxRSlZBQzBDVlFBdEFqZ0FMUUk0QUMwQ09BQXRBamdBTFFJNEFDMENPQUF0QWpnQUxRSTRBQzBDT0FBdEFqZ0FMUUk0QUMwQ09BQXRBamdBTFFJNEFDMENPQUF0QWpnQUxRSTRBQzBDT0FBdEFqZ0FMZ0ZlQUNJQ1ZRQXRBbFVBTFFKVkFDMENWUUF0QWxVQUxRSlZBQzBDVGdCUkFrNEFJUUpPLy9NQS9RQkVBUDBBVWdEOUFFb0EvZi90QVAzLzhRRDkvL1FBL2YvMkFQMEFSQUQ5QUVRQS9mL3BBUDBBTXdJR0FFUUEvUUFIQVAwQUxBRDkvOThCQ2YrNUFRbi91UUVKLzdrQkNmKzVBaGdBVVFJWUFGRUErd0JSQVBzQVFBRDdBRkVBK3dCUkFVUUFVUUVIQUFRRGRRQlJBazRBVVFKT0FGRUNUZ0JSQWs0QVVRSk9BRkVDVGdCUkFsd0FMUUpjQUMwQ1hBQXRBbHdBTFFKY0FDMENYQUF0QWx3QUxRSmNBQzBDWEFBdEFsd0FMUUpjQUMwQ1hBQXRBbHdBTFFKY0FDMENYQUF0QWx3QUxRSmNBQzBDWEFBdEFsd0FMUUpjQUMwQ1hBQXRBbHdBTFFKY0FDMENYQUF0QTlFQUxRSk5BRkVDVFFCUkFsQUFMUUZ6QUZFQmN3QlJBWE1BUVFGekFGRUIzQUF0QWR3QUxRSGNBQzBCM0FBdEFkd0FMUUhjQUMwQ1FBQlJBWE1BR2dGekFCb0Jjd0FhQVhNQUdnRnpBQm9DU0FCUkFrZ0FVUUpJQUZFQ1NBQlJBa2dBVVFKSUFGRUNTQUJSQWtnQVVRSklBRkVDU0FCUkFrZ0FVUUpJQUZFQ1NBQlJBbHNBVVFKYkFGRUNXd0JSQWxzQVVRSmJBRkVDV3dCUkFrZ0FVUUpJQUZFQ1NBQlJBa2dBVVFKSUFGRUNFd0FPQXhFQUV3TVJBQk1ERVFBVEF4RUFFd01SQUJNQi9nQVFBaWtBR2dJcEFCb0NLUUFhQWlrQUdnSXBBQm9DS1FBYUFpa0FHZ0lwQUJvQ0tRQWFBZHNBS0FIYkFDZ0Iyd0FvQWRzQUtBSnBBQ0lDV3dBaUFpWUFWUUkxQUJnQ05RQVlBalVBR0FJMUFCZ0NOUUFZQWpVQUdBSTFBQmdDTlFBWUFqVUFHQUkxQUJnQ05RQVlBalVBR0FJMUFCZ0NOUUFZQWpVQUdBSTFBQmdDTlFBWUFqVUFHQUkxQUJnQ05RQVlBalVBR0FJMUFCZ0NOUUFZQXRjQUdBSVVBRlVDSUFBdEFpQUFMUUlnQUMwQ0lBQXRBaUFBTFFJZ0FDMENUZ0JWQWs0QUpRSk9BRlVDVGdBbEFmb0FWUUg2QUZVQitnQlZBZm9BVlFINkFGVUIrZ0JWQWZvQVZRSDZBRlVCK2dCVkFmb0FWUUg2QUZVQitnQlZBZm9BVlFINkFGVUIrZ0JWQWZvQVZRSDZBRlVCK2dCVkFtTUFMUUhtQUZVQ1FRQXRBa0VBTFFKQkFDMENRUUF0QWtFQUxRSkJBQzBDZGdCVkFuWUFKd0oyQUZVQkF3QlZBUU1BVlFFREFFOEJBLy95QVFQLzlRRUQvL2dCQS8vNkFRTUFTQUVEQUUwQkEvL3RBUU1BTndKOUFGVUJBd0FMQVFNQUxnRUQvK2dCZXdBSEFYc0FCd0Y3QUFjQmV3QUhBaXNBVlFJckFGVUIxZ0JWQWRZQVZRSFdBRlVCMWdCVkFkWUFWUUhpQUJjQzlnQlZBb2NBVlFLSEFGVUNod0JWQW9jQVZRS0hBRlVDaHdCVkFwQUFMUUtRQUMwQ2tBQXRBcEFBTFFLUUFDMENrQUF0QXBBQUxRS1FBQzBDa0FBdEFwQUFMUUtRQUMwQ2tBQXRBcEFBTFFLUUFDMENrQUF0QXBBQUxRS1FBQzBDa0FBdEFwQUFMUUtRQUMwQ2tBQXRBcEFBTFFLUUFDMENrQUF0QXRrQUxRSVRBRlVCOWdCVkFwQUFMUUlpQUZVQ0lnQlZBaUlBVlFJaUFGVUI0d0F1QWVNQUxnSGpBQzRCNHdBdUFlTUFMZ0hqQUM0Q0JnQWhBZ1lBSVFJR0FDRUNCZ0FoQWdZQUlRSm9BRlVDYUFCVkFtZ0FWUUpvQUZVQ2FBQlZBbWdBVlFKb0FGVUNhQUJWQW1nQVZRSm9BRlVDYUFCVkFtZ0FWUUpvQUZVQ2FBQlZBbWdBVlFKb0FGVUNhQUJWQW1nQVZRSm9BRlVDYUFCVkFtZ0FWUUpvQUZVQ2FBQlZBbWdBVlFJdEFBOERRd0FYQTBNQUZ3TkRBQmNEUXdBWEEwTUFGd0k0QUI4Q0F3QVFBZ01BRUFJREFCQUNBd0FRQWdNQUVBSURBQkFDQXdBUUFnTUFFQUlEQUJBQjlnQXBBZllBS1FIMkFDa0I5Z0FwQVk0QU1BR1RBQ3NDclFBYUF3d0FOZ0pZQUZFQ2xRQkhBbzRBTkFJdEFEWUNlUUJFQW1jQUh3S01BQzRDZmdCUkFtc0FNd0pEQUIwQ2N3QXpBbTRBTXdKWkFDOEJ5UUE1QWZjQUpRSXFBQUlDU1FBTUFrWUFKQUo0QURNQi9BQVZBbElBTFFKZ0FDTUNpZ0EzQW9vQWZBS0tBRXdDaWdBM0Fvb0FKd0tLQUZBQ2lnQS9Bb29BUmdLS0FFRUNpZ0E3QW13QU9RSnNBSElDYkFCZ0Ftd0FNUUpzQUNzQ2JBQTdBbXdBT2dKc0FFb0NiQUE1QW13QU5RR2RBQ1FCYlFBL0FYb0FJUUdRQUNvQmhRQWpBWk1BTndHWUFDNEJVQUFaQVo4QUx3R1pBQ3NCblFBa0FXMEFQd0Y2QUNFQmtBQXFBWVVBSXdHVEFEY0JtQUF1QVZBQUdRR2ZBQzhCbVFBckFaMEFKQUZ0QUQ4QmVnQWhBWkFBS2dHRkFDTUJrd0EzQVpnQUxnRlFBQmtCbndBdkFaa0FLd0Z0QUQ4QmVnQWhBWkFBS2dHZEFDUUJoUUFqQVpNQU53R1lBQzRCVUFBWkFaOEFMd0daQUNzQXZQK3BBNk1BUHdPaUFEOER4UUFxQThZQVB3UHBBQ29EN0FBM0E1b0FHUUpoQURZQjZBQTVBaGtBUXdINUFDSUNKZ0E2QWgwQVZBSkZBRTRCMkFBY0FnWUFNZ0grQUNNQkZnQk1BUThBUXdFVkFFd0JGUUJOQTBFQWRBRXVBRmdCTGdCWUFmZ0FJd0g0QURBQklnQkFBVDBBT3dJbEFEMENyQUFpQVU0QUNnRk9BQW9BQVA4OEFFbi81d0ZwQUVvQmFRQXFBWVVBUndHRkFDNEJKUUJKQVNVQU13RXFBRWtCS2dCREFiY0FTUUczQUVrQ1V3QkpBNUVBU1FMRkFFSUJpUUJKQU9FQUl3R0dBQ01CaGdBM0FZWUFJd0RoQURjQTRRQWpBZDhBSEFIZkFEOEJYZ0JHQVdnQVVBRzVBR1VBOHdCT0FWSUFTZ0ZTQUNvQk9RQmRBVGtBWFFHMUFERUJ0UUE2QUFEL1dnRWdBQUFBS3dBQUFoc0FOQUoyQUMwQ053QXBBcVlBSmdHVkFBb0NUQUJVQW9VQUlBSUJBRWtCMUFBdUFsUUFNZ0pVQURJQ1ZBQXhBbFFBTWdKVUFESUNWQUF5QWxRQVZBSlVBRWdDVkFBeUFsUUFNZ0pVQURJQ1ZBQXlBbFFBUGdKVUFESUNxd0EvQXZVQUZRSDJBQXdDRkFBY0FnZ0FHQUpTQUdFQ1dBQlJBbGdBTVFNRkFDUUVad0FrQWN3QUhBTnpBQzRDM1FCUEFna0FSQUg1QUVvRExnQXRBeTRBTFFObEFFQUJmQUF4QVBJQVd3RHlBRnNCcEFBakFaSUFJd05ZQUNnRGNRQXRBbDhBVFFJQkFFa0Nrd0FrQTc0QUpBQUEvdFlBQVA5RkFBRC9BQUFBL3dnQUFQN1hBQUQvZ2dBQS90UUFBUDdVQUFEKzBBQUEvdlVBQVA3RkFBRCs1Z0FBL3pnQUFQOGhBQUQraUFBQS96NEFBUDlsQUFEL0FnQUEvd2dCWUFBb0FNY0FLQUVOQUNnQkNRQW9BV0FBS0FGakFDY0JZd0FuQVhFQUtBRWlBQ2dCaHdBb0FVQUFLQUVLQUNjQTJnQW5BQUQrei85Ri93RC9BLzdYL3RUKzJQN1EvdlgreGY3cS9xTC9JZjRXL3p2L1V2OEMvd1ArMGY3Vy8wWC9BUDhJL3RmKzFQN1UvdEQrOWY3Ri91YjkwLzhoL29qL1B2OVAvd0wvQ1A3Vi90WCswLzdWL3RQKzBmN1IvdEgrMGY3VS90VCsxUDdPQUFBQUFBQW1BQ1lBVGdCYUFHWUFlQUNJQUpvQXJBQytBTW9BMWdEb0FQZ0JDZ0VjQVM0QmhnR1NBYVFCc0FHOEFnUUNFQUljQW1BQ3JnTDJBd0lERGdPSUE1UURwZ1BlQkNnRU5BUThCR2dFZEFTQUJJd0VtQVNxQkxvRXpBVGVCUEFGVEFWZUJXb0ZmQVdJQlpRRjRnWHVCaFFHWkFad0Jud0dpQWFVQnFZRzBnY1VCeUFITmdkQ0IwNEhXZ2RtQjNJSHRnZklCOVFINWdmeUIvNElOZ2hDQ0c0SWVnaUdDTEFJdkFqWUNPUUk5Z2tDQ1E0SlBBbDhDYUlKcmdtNkNjWUtDZ29XQ2w0S2FncDJDb0lLamdxZ0NyQUt3Z3JVQ3VZTFdndG1DM2dMaEF2aUMrNEwrZ3dNREJnTUpBd3dERHdNcEF5d0RQb05OQTF5RGNJTi9nNEtEaFlPSWc1K0Rvb09sZzhpRHk0UE9nKzBFQWdRSmhCWUVHUVF1QkRFRVBJUS9oRUtFUllSSWhHQUVlZ1NXaExHRXk0VE9oTk1FMWdUdWhQR0U5SVQ1QlB3RS93VUNCUVVGRjRVYWhSMkZKWVV3aFRPRk5vVk5oVklGWFFWbUJXa0ZiQVdBaFlPRmlBV0xCWTRGa1FXY0JaOEZvZ1dtaGNhRnlZWE1oYytGMDRYV2hkbUYzSVhmaGVLRjVZWHBoZXlGNzRYeWhmV0YrSVg3aGY2R0FZWWloaVdHS0laZ0JvUUdsZ2FaQnB3R3VvYTloc0NHNEliM2h2cUhKd2M4Qno4SFFnZEZCMGdIU3dkUEIxSUhWUWRZQjFzSFhnZGhCMlFIWndkcUI0V0hpSWVkaDZ5SDBvZlZoOWlIMjRnSENBb0lHd2c0Q0R5SVA0aEZDRWdJU3doT0NGRUlWQWhYQ0ZvSVhRaGdDR01JWmdoNmlIMklnSWlNQ0k4SWtnaWhDS1FJcklpeENMUUl0d2k2Q01jSTM0anhpUFNJOTRqNmlSTUpGZ2ttaVNtSkxJa3ZpVEtKTllrNWlUeUpQNGxDaVVXSlNJbExpVTZKYW9sdGlYQ0pjNGwyaVhtSmZJbC9pWmtKbkFuR0NlRUovQW9XaWlvS0xRb3dDak1LU1lwTWlrK0tjZ3AxQ25nS21BcW9DcnFLdllyYkN0NEs3d3J5Q3ZVSytBcjdDdjRMQVFzRUN3Y0xDZ3NOQ3hBTEV3c29DeXNMTGdzeEN6UUxOd3M2Q3owTFdRdGNDMThMWm90eGkzU0xkNHQ2aTMyTGlRdVhDNW9MblF1Z0M2TUxwZ3VwQzZ3THJ3dTZDNzBMd0F2REM4WUx5UXZtQy9BTDlJdjVEQThNRkl3cmpFYU1hQXhzakhFTWhReUtqS2NNcTR6VGpOZ00yd3pmak9RTTZJejZEUDZOQXcwVGpTY05PQTA4alVFTlhvMWpEV2VOZEkyR2pZc05qUTJZRFp5Tm9RMmxqYW9Ocm8yMERiaU52UTNCamNZTnlvM05qZElOMW8zYkRlNE44bzRJRGhFT0k0NG9EaXlPTVE0MERqaU9RdzVUamxnT1hZNWZqbVFPYUk1dERuR09kZzU2am4yT2dnNkdqb21Pamc2Y0RxQ09vbzZ0RHJHT3RnN0FEc01PeWc3T2p0TU8xZzdaRHVRTzlBNzlqd0lQQm84Smp4aVBIUTh0anpJUE5vODdEeitQUkE5SmowNFBVbytCRDRXUGlJK05ENUdQcncremo3YVB1dysvajhRUHlJL05EK2FQNncvK0VBd1FHeEFza0R1UVFCQkVrRWVRWEpCaEVHV1FocENMRUk0UWxoQ2lFS2FRdTVDK2tNbVF6aERTa05jUTI1RGdFUG1SSEJFMmtVK1JVcEZYRVZ1UmF4RnZrWEtSZHhGN2tZQVJoSkdKRVpxUm54R2prYXNSdGhHNmtiOFJ3NUhJRWRLUjI1SGdFZVNSNlJIc0VmQ1I5Ukg1a2Y0U0NSSU5raElTRnBJeGtrRVNTWkpja20rU2dwS1RFcDRTcjVMR2t0UVM2Qk1BRXdrVEpSTTlFMDZUV1pOcWs0Y1RtQk94RThrVDBoUHRsQW9VR3BRbGxDZVVRQlJObEdFVWVSU0NGSjJVdEpUR0ZORVU0WlQrRlE4VktCVkFGVWtWWkpXQkZZVVZpUldORlpFVmxSV1pGWjBWb1JXbEZha1Z1QlhDRmRHVjV4WHpsZ2FXSEpZa2xqMFdVaFpXRmxvV1hoWmlGbVlXYWhadUZuSVdkaFo2Rm40V2doYUdGb29XamhhU0ZwWVdtaGFlRnFJV3E1YXZsck9XdDVhN2xyK1d3NWJIbHRpVzQ1Ynpsd3NYR0JjcmwwTVhTNWRtbDMwWGhaZVBsNTZYcnBleWw3Nlh5cGZpRi82WUNCZ1JtQjhZT3BoRUdFd1lWWmhmR0dlWWI1aUFHSkFZbUppaEdLaVlyNWkyR0xnWXZwakZHTXlZMGhqYkdONFk0UmprR082WStSa0JHUWlaRFprU21Sb1pINWtubVM4Wk94bEhtVjBaYzVsOUdYMFpmUm1VR2EwWnl4bmttZmlhS0pvNUdrc2FaQnB1R25TYWZCcVBHcGdhcnBxMEdyb2F4UnJRR3Q0YStoc0xteE9iSFpzNG0wa2JVcHRlbTJnYmFodDhtNktiMDV2ZUhBS2NINXdySEV1Y2JKeU5uSjRjcnB5MEhMMGN4eHpWbk8wYzhKME1IUTRkTXAxaG5YR2RmQjJDbllrZGtwMmJuYVVkckoyNUhjbWQycDNpSGU0ZCtaNFFIaHFlSVo0NW5rWWVTSjVMSGsyZVVCNVNubFVlVjU1YUhseWVYeDVobm1RZVpwNTFubjhlaEo2S0hwS2VteDZobnEwZXZKN01udE1lM2g3b252VWUvcDhFSHhvZkpSOHZuekdmTTU4MW56ZWZPWjg3bnoyZlA1OUJuME9mUlo5SUgwb2ZUQjlPSDFBZlp4OXBIM3FmaXgrZEg2MmZ0Qi9CSDgrZjRSLzRvQVVnRmlBbklEM0FBQUFBUUFBQTFJQVRBQUhBRmtBQlFBQ0FDZ0FWQUNOQUFBQWlRNFZBQU1BQXdBQUFCWUJEZ0FCQUFBQUFBQUFBRG9BQUFBQkFBQUFBQUFCQUFzQU9nQUJBQUFBQUFBQ0FBY0FSUUFCQUFBQUFBQURBQjBBVEFBQkFBQUFBQUFFQUJNQWFRQUJBQUFBQUFBRkFBMEFmQUFCQUFBQUFBQUdBQklBaVFBQkFBQUFBQUFJQUFRQW13QUJBQUFBQUFBSkFBNEFud0FCQUFBQUFBQUxBQThBclFBQkFBQUFBQUFNQUE4QXZBQURBQUVFQ1FBQUFIUUF5d0FEQUFFRUNRQUJBQllCUHdBREFBRUVDUUFDQUE0QlZRQURBQUVFQ1FBREFEb0JZd0FEQUFFRUNRQUVBQ1lCblFBREFBRUVDUUFGQUJvQnd3QURBQUVFQ1FBR0FDUUIzUUFEQUFFRUNRQUlBQWdDQVFBREFBRUVDUUFKQUJ3Q0NRQURBQUVFQ1FBTEFCNENKUUFEQUFFRUNRQU1BQjRDUTBOdmNIbHlhV2RvZENDcElESXdNVElzSURJd01UY3NJREl3TWpBZ1lua2dVR3hoZFM0Z1FXeHNJSEpwWjJoMGN5QnlaWE5sY25abFpDNU5iM1JwZG1FZ1UyRnVjMUpsWjNWc1lYSTBMakF4TlR0UWJHRjFPMDF2ZEdsMllWTmhibk10VW1WbmRXeGhjazF2ZEdsMllTQlRZVzV6SUZKbFozVnNZWEpXWlhKemFXOXVJRFF1TURFMVRXOTBhWFpoVTJGdWN5MVNaV2QxYkdGeVVHeGhkVkp2WkhKcFoyOGdVMkZwWVc1cGFIUjBjSE02THk5d2JHRjFMbU52YUhSMGNITTZMeTl3YkdGMUxtTnZBRU1BYndCd0FIa0FjZ0JwQUdjQWFBQjBBQ0FBcVFBZ0FESUFNQUF4QURJQUxBQWdBRElBTUFBeEFEY0FMQUFnQURJQU1BQXlBREFBSUFCaUFIa0FJQUJRQUd3QVlRQjFBQzRBSUFCQkFHd0FiQUFnQUhJQWFRQm5BR2dBZEFCekFDQUFjZ0JsQUhNQVpRQnlBSFlBWlFCa0FDNEFUUUJ2QUhRQWFRQjJBR0VBSUFCVEFHRUFiZ0J6QUZJQVpRQm5BSFVBYkFCaEFISUFOQUF1QURBQU1RQTFBRHNBVUFCc0FHRUFkUUE3QUUwQWJ3QjBBR2tBZGdCaEFGTUFZUUJ1QUhNQUxRQlNBR1VBWndCMUFHd0FZUUJ5QUUwQWJ3QjBBR2tBZGdCaEFDQUFVd0JoQUc0QWN3QWdBRklBWlFCbkFIVUFiQUJoQUhJQVZnQmxBSElBY3dCcEFHOEFiZ0FnQURRQUxnQXdBREVBTlFCTkFHOEFkQUJwQUhZQVlRQlRBR0VBYmdCekFDMEFVZ0JsQUdjQWRRQnNBR0VBY2dCUUFHd0FZUUIxQUZJQWJ3QmtBSElBYVFCbkFHOEFJQUJUQUdFQWFRQmhBRzRBYVFCb0FIUUFkQUJ3QUhNQU9nQXZBQzhBY0FCc0FHRUFkUUF1QUdNQWJ3Qm9BSFFBZEFCd0FITUFPZ0F2QUM4QWNBQnNBR0VBZFFBdUFHTUFid0FBQWdBQUFBQUFBUC9PQURJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTlNBQUFBQXdBa0FNa0JBZ0VEQVFRQkJRRUdBUWNCQ0FESEFRa0JDZ0VMQVF3QkRRQmlBUTRBclFFUEFSQUJFUUJqQUs0QWtBQWxBQ1lBL1FEL0FHUUJFZ0VUQUNjQTZRRVVBUlVBS0FCbEFSWUJGd0RJQVJnQkdRRWFBUnNCSEFES0FSMEJIZ0RMQVI4QklBRWhBU0lBS1FBcUFQZ0JJd0VrQVNVQkpnQXJBU2NCS0FBc0FTa0F6QUVxQVNzQXpRRE9BUG9CTEFEUEFTMEJMZ0V2QVRBQUxRRXhBVElBTGdFekFDOEJOQUUxQVRZQk53RGlBREFBTVFFNEFUa0JPZ0U3QUdZQU1nRFFBVHdCUFFEUkFUNEJQd0ZBQVVFQlFnQm5BVU1BMHdGRUFVVUJSZ0ZIQVVnQlNRRktBVXNCVEFDUkFLOEFzQUF6QU8wQU5BQTFBVTBCVGdGUEFEWUJVQURrQVBzQlVRRlNBVk1CVkFBM0FWVUJWZ0ZYQVZnQU9BRFVBVmtCV2dEVkFHZ0JXd0ZjQVYwQlhnRmZBTllCWUFGaEFXSUJZd0ZrQVdVQlpnRm5BV2dCYVFGcUFXc0FPUUE2QVd3QmJRRnVBVzhBT3dBOEFPc0JjQUM3QVhFQmNnRnpBWFFCZFFBOUFYWUE1Z0YzQUVRQWFRRjRBWGtCZWdGN0FYd0JmUUYrQUdzQmZ3R0FBWUVCZ2dHREFHd0JoQUJxQVlVQmhnR0hBRzRBYlFDZ0FFVUFSZ0QrQVFBQWJ3R0lBWWtBUndEcUFZb0JBUUJJQUhBQml3R01BSElCalFHT0FZOEJrQUdSQUhNQmtnR1RBSEVCbEFHVkFaWUJsd0dZQUVrQVNnRDVBWmtCbWdHYkFad0FTd0dkQVo0QVRBRFhBSFFCbndHZ0FIWUFkd0doQWFJQWRRR2pBYVFCcFFHbUFhY0FUUUdvQWFrQnFnQk9BYXNBVHdHc0FhMEJyZ0d2QU9NQVVBQlJBYkFCc1FHeUFiTUFlQUJTQUhrQnRBRzFBSHNCdGdHM0FiZ0J1UUc2QUh3QnV3QjZBYndCdlFHK0FiOEJ3QUhCQWNJQnd3SEVBS0VBZlFDeEFGTUE3Z0JVQUZVQnhRSEdBY2NBVmdISUFPVUEvQUhKQWNvQWlRQlhBY3NCekFITkFjNEFXQUIrQWM4QjBBQ0FBSUVCMFFIU0FkTUIxQUhWQUg4QjFnSFhBZGdCMlFIYUFkc0IzQUhkQWQ0QjN3SGdBZUVBV1FCYUFlSUI0d0hrQWVVQVd3QmNBT3dCNWdDNkFlY0I2QUhwQWVvQjZ3QmRBZXdBNXdIdEFNQUF3UUh1QWU4QjhBSHhBZklCOHdIMEFmVUI5Z0gzQWZnQitRSDZBZnNCL0FIOUFmNEIvd0lBQWdFQ0FnSURBZ1FDQlFJR0FnY0NDQUlKQWdvQ0N3SU1BZzBDRGdJUEFoQUNFUUlTQWhNQ0ZBSVZBaFlDRndJWUFoa0NHZ0liQWh3Q0hRSWVBaDhDSUFJaEFpSUNJd0lrQWlVQ0pnSW5BaWdDS1FJcUFpc0NMQUl0QWk0Q0x3SXdBakVDTWdJekFqUUNOUUkyQWpjQ09BSTVBam9DT3dJOEFqMENQZ0kvQWtBQ1FRSkNBa01DUkFKRkFrWUNSd0pJQWtrQ1NnSkxBa3dDVFFKT0FrOENVQUpSQWxJQ1V3SlVBbFVDVmdKWEFsZ0NXUUphQWxzQ1hBSmRBbDRDWHdKZ0FtRUNZZ0pqQW1RQ1pRSm1BbWNDYUFKcEFtb0Nhd0pzQW0wQ2JnSnZBbkFDY1FKeUFuTUNkQUoxQW5ZQ2R3SjRBbmtDZWdKN0Fud0NmUUorQW44Q2dBS0JBb0lDZ3dLRUFvVUNoZ0tIQW9nQ2lRS0tBb3NDakFLTkFvNENqd0tRQXBFQ2tnS1RBcFFDbFFLV0FwY0NtQUtaQXBvQ213S2NBcDBDbmdLZkFxQUNvUUtpQXFNQ3BBS2xBcVlDcHdDZEFKNENxQUtwQXFvQW13QVRBQlFBRlFBV0FCY0FHQUFaQUJvQUd3QWNBcXNDckFLdEFxNENyd0t3QXJFQ3NnS3pBclFDdFFLMkFyY0N1QUs1QXJvQ3V3SzhBcjBDdmdLL0FzQUN3UUxDQXNNQ3hBTEZBc1lDeHdMSUFza0N5Z0xMQXN3Q3pRTE9BczhDMEFMUkF0SUMwd0xVQXRVQzFnTFhBdGdDMlFMYUF0c0MzQUxkQXQ0QzN3TGdBdUVDNGdMakF1UUM1UUxtQXVjQzZBTHBBdW9DNndMc0F1MEM3Z0x2QXZBQXZBRDBBUFVBOWdMeEF2SUM4d0wwQXZVQzlnTDNBdmdDK1FMNkF2c0MvQUw5QXY0QUVRQVBBQjBBSGdDckFBUUFvd0FpQUtJQXd3Q0hBQTBBQmdBU0FEOEMvd01BQUFzQURBQmVBR0FBUGdCQUF3RURBZ0FRQXdNQXNnQ3pBRUlEQkFERUFNVUF0QUMxQUxZQXR3Q3BBS29BdmdDL0FBVUFDZ01GQXdZREJ3TUlBd2tEQ2dNTEF3d0REUUNFQUwwQUJ3TU9BS1lBaFFDV0F3OERFQUFPQU84QThBQzRBQ0FBandBaEFCOEFsUUNVQUpNQXB3QmhBS1FBUVFDU0FKd0FtZ0NaQUtVREVRQ1lBQWdBeGdDNUFDTUFDUUNJQUlZQWl3Q0tBSXdBZ3dCZkFPZ0FnZ0RDQXhJREV3TVVBeFVERmdNWEF4Z0RHUU1hQXhzREhBTWRBeDRESHdNZ0F5RURJZ01qQXlRREpRTW1BeWNES0FNcEF5b0FqZ0RjQUVNQWpRRGZBTmdBNFFEYkFOMEEyUURhQU40QTRBTXJBeXdETFFNdUF5OERNQU14QXpJRE13TTBBelVETmdNM0F6Z0RPUU02QXpzRFBBTTlBejREUHdOQUEwRURRZ05EQTBRRFJRTkdBMGNEU0FOSkEwb0RTd05NQTAwRFRnTlBBMUFEVVFOU0ExTURWQU5WQTFZRFZ3TllBMWtEV2dOYkExd0dRV0p5WlhabEIzVnVhVEZGUVVVSGRXNXBNVVZDTmdkMWJta3hSVUl3QjNWdWFURkZRaklIZFc1cE1VVkNOQWQxYm1rd01VTkVCM1Z1YVRGRlFUUUhkVzVwTVVWQlF3ZDFibWt4UlVFMkIzVnVhVEZGUVRnSGRXNXBNVVZCUVFkMWJta3hSVUV3QjNWdWFURkZRVElIUVcxaFkzSnZiZ2RCYjJkdmJtVnJDME5qYVhKamRXMW1iR1Y0Q2tOa2IzUmhZMk5sYm5RR1JHTmhjbTl1QmtSamNtOWhkQVpGWW5KbGRtVUdSV05oY205dUIzVnVhVEZGUWtVSGRXNXBNVVZETmdkMWJta3hSVU13QjNWdWFURkZReklIZFc1cE1VVkROQXBGWkc5MFlXTmpaVzUwQjNWdWFURkZRamdIZFc1cE1VVkNRUWRGYldGamNtOXVCMFZ2WjI5dVpXc0hkVzVwTVVWQ1F3WkhZMkZ5YjI0TFIyTnBjbU4xYldac1pYZ0hkVzVwTURFeU1ncEhaRzkwWVdOalpXNTBCRWhpWVhJTFNHTnBjbU4xYldac1pYZ0NTVW9HU1dKeVpYWmxCM1Z1YVRBeFEwWUhkVzVwTVVWRFFRZDFibWt4UlVNNEIwbHRZV055YjI0SFNXOW5iMjVsYXdaSmRHbHNaR1VMZFc1cE1EQTBRVEF6TURFTFNtTnBjbU4xYldac1pYZ0hkVzVwTURFek5nWk1ZV04xZEdVR1RHTmhjbTl1QjNWdWFUQXhNMElFVEdSdmRBWk9ZV04xZEdVR1RtTmhjbTl1QjNWdWFUQXhORFVEUlc1bkJrOWljbVYyWlFkMWJta3dNVVF4QjNWdWFURkZSREFIZFc1cE1VVkVPQWQxYm1reFJVUXlCM1Z1YVRGRlJEUUhkVzVwTVVWRU5nZDFibWt4UlVOREIzVnVhVEZGUTBVRlQyaHZjbTRIZFc1cE1VVkVRUWQxYm1reFJVVXlCM1Z1YVRGRlJFTUhkVzVwTVVWRVJRZDFibWt4UlVVd0RVOW9kVzVuWVhKMWJXeGhkWFFIVDIxaFkzSnZiZ1pTWVdOMWRHVUdVbU5oY205dUIzVnVhVEF4TlRZR1UyRmpkWFJsQzFOamFYSmpkVzFtYkdWNEIzVnVhVEF5TVRnSGRXNXBNVVU1UlFkMWJta3dNVGhHQkZSaVlYSUdWR05oY205dUIzVnVhVEF4TmpJSGRXNXBNREl4UVFaVlluSmxkbVVIZFc1cE1ERkVNd2QxYm1rd01VUTNCM1Z1YVRBeFJEa0hkVzVwTURGRVFnZDFibWt3TVVRMUIzVnVhVEZGUlRRSGRXNXBNVVZGTmdWVmFHOXliZ2QxYm1reFJVVTRCM1Z1YVRGRlJqQUhkVzVwTVVWRlFRZDFibWt4UlVWREIzVnVhVEZGUlVVTlZXaDFibWRoY25WdGJHRjFkQWRWYldGamNtOXVCMVZ2WjI5dVpXc0ZWWEpwYm1jR1ZYUnBiR1JsQmxkaFkzVjBaUXRYWTJseVkzVnRabXhsZUFsWFpHbGxjbVZ6YVhNR1YyZHlZWFpsQzFsamFYSmpkVzFtYkdWNEIzVnVhVEZGUmpRR1dXZHlZWFpsQjNWdWFURkZSallIZFc1cE1ESXpNZ2QxYm1reFJVWTRCbHBoWTNWMFpRcGFaRzkwWVdOalpXNTBCbUZpY21WMlpRZDFibWt4UlVGR0IzVnVhVEZGUWpjSGRXNXBNVVZDTVFkMWJta3hSVUl6QjNWdWFURkZRalVIZFc1cE1ERkRSUWQxYm1reFJVRTFCM1Z1YVRGRlFVUUhkVzVwTVVWQk53ZDFibWt4UlVFNUIzVnVhVEZGUVVJSGRXNXBNVVZCTVFkMWJta3hSVUV6QjJGdFlXTnliMjRIWVc5bmIyNWxhd3RqWTJseVkzVnRabXhsZUFwalpHOTBZV05qWlc1MEJtUmpZWEp2YmdabFluSmxkbVVHWldOaGNtOXVCM1Z1YVRGRlFrWUhkVzVwTVVWRE53ZDFibWt4UlVNeEIzVnVhVEZGUXpNSGRXNXBNVVZETlFwbFpHOTBZV05qWlc1MEIzVnVhVEZGUWprSGRXNXBNVVZDUWdkbGJXRmpjbTl1QjJWdloyOXVaV3NIZFc1cE1VVkNSQWQxYm1rd01qVTVCbWRqWVhKdmJndG5ZMmx5WTNWdFpteGxlQWQxYm1rd01USXpDbWRrYjNSaFkyTmxiblFFYUdKaGNndG9ZMmx5WTNWdFpteGxlQVpwWW5KbGRtVUhkVzVwTURGRU1BbHBMbXh2WTJ4VVVrc0hkVzVwTVVWRFFnZDFibWt4UlVNNUFtbHFCMmx0WVdOeWIyNEhhVzluYjI1bGF3WnBkR2xzWkdVSGRXNXBNREl6Tnd0MWJta3dNRFpCTURNd01RdHFZMmx5WTNWdFpteGxlQWQxYm1rd01UTTNCbXhoWTNWMFpRWnNZMkZ5YjI0SGRXNXBNREV6UXdSc1pHOTBCbTVoWTNWMFpRWnVZMkZ5YjI0SGRXNXBNREUwTmdObGJtY0diMkp5WlhabEIzVnVhVEF4UkRJSGRXNXBNVVZFTVFkMWJta3hSVVE1QjNWdWFURkZSRE1IZFc1cE1VVkVOUWQxYm1reFJVUTNCM1Z1YVRGRlEwUUhkVzVwTVVWRFJnVnZhRzl5YmdkMWJta3hSVVJDQjNWdWFURkZSVE1IZFc1cE1VVkVSQWQxYm1reFJVUkdCM1Z1YVRGRlJURU5iMmgxYm1kaGNuVnRiR0YxZEFkdmJXRmpjbTl1Qm5KaFkzVjBaUVp5WTJGeWIyNEhkVzVwTURFMU53WnpZV04xZEdVTGMyTnBjbU4xYldac1pYZ0hkVzVwTURJeE9RUjBZbUZ5Qm5SallYSnZiZ2QxYm1rd01UWXpCM1Z1YVRBeU1VSUdkV0p5WlhabEIzVnVhVEF4UkRRSGRXNXBNREZFT0FkMWJta3dNVVJCQjNWdWFUQXhSRU1IZFc1cE1ERkVOZ2QxYm1reFJVVTFCM1Z1YVRGRlJUY0ZkV2h2Y200SGRXNXBNVVZGT1FkMWJta3hSVVl4QjNWdWFURkZSVUlIZFc1cE1VVkZSQWQxYm1reFJVVkdEWFZvZFc1bllYSjFiV3hoZFhRSGRXMWhZM0p2YmdkMWIyZHZibVZyQlhWeWFXNW5CblYwYVd4a1pRWjNZV04xZEdVTGQyTnBjbU4xYldac1pYZ0pkMlJwWlhKbGMybHpCbmRuY21GMlpRdDVZMmx5WTNWdFpteGxlQWQxYm1reFJVWTFCbmxuY21GMlpRZDFibWt4UlVZM0IzVnVhVEF5TXpNSGRXNXBNVVZHT1FaNllXTjFkR1VLZW1SdmRHRmpZMlZ1ZEFwMWJta3hSVGxGTG5OakJHRXVjMk1KWVdGamRYUmxMbk5qQ1dGaWNtVjJaUzV6WXdwMWJta3hSVUZHTG5OakNuVnVhVEZGUWpjdWMyTUtkVzVwTVVWQ01TNXpZd3AxYm1reFJVSXpMbk5qQ25WdWFURkZRalV1YzJNS2RXNXBNREZEUlM1ell3NWhZMmx5WTNWdFpteGxlQzV6WXdwMWJta3hSVUUxTG5OakNuVnVhVEZGUVVRdWMyTUtkVzVwTVVWQk55NXpZd3AxYm1reFJVRTVMbk5qQ25WdWFURkZRVUl1YzJNTVlXUnBaWEpsYzJsekxuTmpDblZ1YVRGRlFURXVjMk1KWVdkeVlYWmxMbk5qQ25WdWFURkZRVE11YzJNS1lXMWhZM0p2Ymk1ell3cGhiMmR2Ym1WckxuTmpDR0Z5YVc1bkxuTmpDV0YwYVd4a1pTNXpZd1ZoWlM1ell3UmlMbk5qQkdNdWMyTUpZMkZqZFhSbExuTmpDV05qWVhKdmJpNXpZd3RqWTJWa2FXeHNZUzV6WXc1alkybHlZM1Z0Wm14bGVDNXpZdzFqWkc5MFlXTmpaVzUwTG5OakJHUXVjMk1HWlhSb0xuTmpDV1JqWVhKdmJpNXpZd2xrWTNKdllYUXVjMk1FWlM1ell3bGxZV04xZEdVdWMyTUpaV0p5WlhabExuTmpDV1ZqWVhKdmJpNXpZdzVsWTJseVkzVnRabXhsZUM1ell3cDFibWt4UlVKR0xuTmpDblZ1YVRGRlF6Y3VjMk1LZFc1cE1VVkRNUzV6WXdwMWJta3hSVU16TG5OakNuVnVhVEZGUXpVdWMyTU1aV1JwWlhKbGMybHpMbk5qRFdWa2IzUmhZMk5sYm5RdWMyTUtkVzVwTVVWQ09TNXpZd2xsWjNKaGRtVXVjMk1LZFc1cE1VVkNRaTV6WXdwbGJXRmpjbTl1TG5OakNtVnZaMjl1WldzdWMyTUtkVzVwTVVWQ1JDNXpZd3AxYm1rd01qVTVMbk5qQkdZdWMyTUVaeTV6WXdsblluSmxkbVV1YzJNSloyTmhjbTl1TG5OakRtZGphWEpqZFcxbWJHVjRMbk5qQ25WdWFUQXhNak11YzJNTloyUnZkR0ZqWTJWdWRDNXpZd1JvTG5OakIyaGlZWEl1YzJNT2FHTnBjbU4xYldac1pYZ3VjMk1FYVM1ell3dGtiM1JzWlhOemFTNXpZd2xwWVdOMWRHVXVjMk1KYVdKeVpYWmxMbk5qQ25WdWFUQXhSREF1YzJNT2FXTnBjbU4xYldac1pYZ3VjMk1NYVdScFpYSmxjMmx6TG5OakRHa3VjMk11Ykc5amJGUlNTd3AxYm1reFJVTkNMbk5qQ1dsbmNtRjJaUzV6WXdwMWJta3hSVU01TG5OakJXbHFMbk5qQ21sdFlXTnliMjR1YzJNS2FXOW5iMjVsYXk1ell3bHBkR2xzWkdVdWMyTUVhaTV6WXdwMWJta3dNak0zTG5OakRuVnVhVEF3TmtFd016QXhMbk5qRG1wamFYSmpkVzFtYkdWNExuTmpCR3N1YzJNS2RXNXBNREV6Tnk1ell3UnNMbk5qQ1d4aFkzVjBaUzV6WXdsc1kyRnliMjR1YzJNS2RXNXBNREV6UXk1ell3ZHNaRzkwTG5OakNXeHpiR0Z6YUM1ell3UnRMbk5qQkc0dWMyTUpibUZqZFhSbExuTmpDVzVqWVhKdmJpNXpZd3AxYm1rd01UUTJMbk5qQm1WdVp5NXpZd2x1ZEdsc1pHVXVjMk1FYnk1ell3bHZZV04xZEdVdWMyTUpiMkp5WlhabExuTmpDblZ1YVRBeFJESXVjMk1PYjJOcGNtTjFiV1pzWlhndWMyTUtkVzVwTVVWRU1TNXpZd3AxYm1reFJVUTVMbk5qQ25WdWFURkZSRE11YzJNS2RXNXBNVVZFTlM1ell3cDFibWt4UlVRM0xuTmpERzlrYVdWeVpYTnBjeTV6WXdwMWJta3hSVU5FTG5OakNXOW5jbUYyWlM1ell3cDFibWt4UlVOR0xuTmpDRzlvYjNKdUxuTmpDblZ1YVRGRlJFSXVjMk1LZFc1cE1VVkZNeTV6WXdwMWJta3hSVVJFTG5OakNuVnVhVEZGUkVZdWMyTUtkVzVwTVVWRk1TNXpZeEJ2YUhWdVoyRnlkVzFzWVhWMExuTmpDbTl0WVdOeWIyNHVjMk1KYjNOc1lYTm9Mbk5qQ1c5MGFXeGtaUzV6WXdWdlpTNXpZd1J3TG5OakNIUm9iM0p1TG5OakJIRXVjMk1FY2k1ell3bHlZV04xZEdVdWMyTUpjbU5oY205dUxuTmpDblZ1YVRBeE5UY3VjMk1FY3k1ell3bHpZV04xZEdVdWMyTUpjMk5oY205dUxuTmpDM05qWldScGJHeGhMbk5qRG5OamFYSmpkVzFtYkdWNExuTmpDblZ1YVRBeU1Ua3VjMk1FZEM1ell3ZDBZbUZ5TG5OakNYUmpZWEp2Ymk1ell3cDFibWt3TVRZekxuTmpDblZ1YVRBeU1VSXVjMk1FZFM1ell3bDFZV04xZEdVdWMyTUpkV0p5WlhabExuTmpDblZ1YVRBeFJEUXVjMk1PZFdOcGNtTjFiV1pzWlhndWMyTU1kV1JwWlhKbGMybHpMbk5qQ25WdWFUQXhSRGd1YzJNS2RXNXBNREZFUVM1ell3cDFibWt3TVVSRExuTmpDblZ1YVRBeFJEWXVjMk1LZFc1cE1VVkZOUzV6WXdsMVozSmhkbVV1YzJNS2RXNXBNVVZGTnk1ell3aDFhRzl5Ymk1ell3cDFibWt4UlVVNUxuTmpDblZ1YVRGRlJqRXVjMk1LZFc1cE1VVkZRaTV6WXdwMWJta3hSVVZFTG5OakNuVnVhVEZGUlVZdWMyTVFkV2gxYm1kaGNuVnRiR0YxZEM1ell3cDFiV0ZqY205dUxuTmpDblZ2WjI5dVpXc3VjMk1JZFhKcGJtY3VjMk1KZFhScGJHUmxMbk5qQkhZdWMyTUVkeTV6WXdsM1lXTjFkR1V1YzJNT2QyTnBjbU4xYldac1pYZ3VjMk1NZDJScFpYSmxjMmx6TG5OakNYZG5jbUYyWlM1ell3UjRMbk5qQkhrdWMyTUplV0ZqZFhSbExuTmpEbmxqYVhKamRXMW1iR1Y0TG5OakRIbGthV1Z5WlhOcGN5NXpZd3AxYm1reFJVWTFMbk5qQ1hsbmNtRjJaUzV6WXdwMWJta3hSVVkzTG5OakNuVnVhVEF5TXpNdWMyTUtkVzVwTVVWR09TNXpZd1I2TG5OakNYcGhZM1YwWlM1ell3bDZZMkZ5YjI0dWMyTU5lbVJ2ZEdGalkyVnVkQzV6WXdkMWJta3dNemswQjNWdWFUQXpRVGtIZFc1cE1ETkNRd2g2WlhKdkxtOXpaZ2R2Ym1VdWIzTm1CM1IzYnk1dmMyWUpkR2h5WldVdWIzTm1DR1p2ZFhJdWIzTm1DR1pwZG1VdWIzTm1CM05wZUM1dmMyWUpjMlYyWlc0dWIzTm1DV1ZwWjJoMExtOXpaZ2h1YVc1bExtOXpaZ2Q2WlhKdkxuUm1CbTl1WlM1MFpnWjBkMjh1ZEdZSWRHaHlaV1V1ZEdZSFptOTFjaTUwWmdkbWFYWmxMblJtQm5OcGVDNTBaZ2h6WlhabGJpNTBaZ2hsYVdkb2RDNTBaZ2R1YVc1bExuUm1DWHBsY204dWRHOXpaZ2h2Ym1VdWRHOXpaZ2gwZDI4dWRHOXpaZ3AwYUhKbFpTNTBiM05tQ1dadmRYSXVkRzl6WmdsbWFYWmxMblJ2YzJZSWMybDRMblJ2YzJZS2MyVjJaVzR1ZEc5elpncGxhV2RvZEM1MGIzTm1DVzVwYm1VdWRHOXpaZ2w2WlhKdkxuTjFZbk1JYjI1bExuTjFZbk1JZEhkdkxuTjFZbk1LZEdoeVpXVXVjM1ZpY3dsbWIzVnlMbk4xWW5NSlptbDJaUzV6ZFdKekNITnBlQzV6ZFdKekNuTmxkbVZ1TG5OMVluTUtaV2xuYUhRdWMzVmljd2x1YVc1bExuTjFZbk1KZW1WeWJ5NWtibTl0Q0c5dVpTNWtibTl0Q0hSM2J5NWtibTl0Q25Sb2NtVmxMbVJ1YjIwSlptOTFjaTVrYm05dENXWnBkbVV1Wkc1dmJRaHphWGd1Wkc1dmJRcHpaWFpsYmk1a2JtOXRDbVZwWjJoMExtUnViMjBKYm1sdVpTNWtibTl0Q1hwbGNtOHViblZ0Y2dodmJtVXViblZ0Y2doMGQyOHViblZ0Y2dwMGFISmxaUzV1ZFcxeUNXWnZkWEl1Ym5WdGNnbG1hWFpsTG01MWJYSUljMmw0TG01MWJYSUtjMlYyWlc0dWJuVnRjZ3BsYVdkb2RDNXVkVzF5Q1c1cGJtVXViblZ0Y2dkMWJta3dNRUk1QjNWdWFUQXdRaklIZFc1cE1EQkNNd2w2WlhKdkxuTjFjSE1KWm05MWNpNXpkWEJ6Q1dacGRtVXVjM1Z3Y3doemFYZ3VjM1Z3Y3dwelpYWmxiaTV6ZFhCekNtVnBaMmgwTG5OMWNITUpibWx1WlM1emRYQnpDVzl1WldWcFoyaDBhQXgwYUhKbFpXVnBaMmgwYUhNTFptbDJaV1ZwWjJoMGFITU1jMlYyWlc1bGFXZG9kR2h6QjNwbGNtOHVjMk1HYjI1bExuTmpCblIzYnk1ell3aDBhSEpsWlM1ell3ZG1iM1Z5TG5OakIyWnBkbVV1YzJNR2MybDRMbk5qQ0hObGRtVnVMbk5qQ0dWcFoyaDBMbk5qQjI1cGJtVXVjMk1iY0dWeWFXOWtZMlZ1ZEdWeVpXUXViRzlqYkVOQlZDNWpZWE5sRm5CbGNtbHZaR05sYm5SbGNtVmtMbXh2WTJ4RFFWUU5jR0Z5Wlc1c1pXWjBMbk4xY0E1d1lYSmxibkpwWjJoMExuTjFjQWQxYm1rd01FRkVDbWg1Y0dobGJpNXpkWEFNY0dGeVpXNXNaV1owTG5OakRYQmhjbVZ1Y21sbmFIUXVjMk1KWlhoamJHRnRMbk5qRFdWNFkyeGhiV1J2ZDI0dWMyTUxjWFZsYzNScGIyNHVjMk1QY1hWbGMzUnBiMjVrYjNkdUxuTmpHWEJsY21sdlpHTmxiblJsY21Wa0xteHZZMnhEUVZRdWMyTUhkVzVwTURCQk1BZDFibWt5TURBNUJFVjFjbThJWTJWdWRDNXZjMllLWkc5c2JHRnlMbTl6WmdkMWJta3dNRUkxQ1dWemRHbHRZWFJsWkFkaGRDNWpZWE5sREdGdGNHVnljMkZ1WkM1ell3ZGpaVzUwTG5OakNuQmxjbU5sYm5RdWMyTU9jR1Z5ZEdodmRYTmhibVF1YzJNSGRXNXBNRE13T0FkMWJta3dNekEzQ1dkeVlYWmxZMjl0WWdsaFkzVjBaV052YldJSGRXNXBNRE13UWd0MWJta3dNekJETG1Gc2RBZDFibWt3TXpBeUIzVnVhVEF6TUVNSGRXNXBNRE13TmdkMWJta3dNekJCQ1hScGJHUmxZMjl0WWdkMWJta3dNekEwRFdodmIydGhZbTkyWldOdmJXSUhkVzVwTURNeE1nZDFibWt3TXpGQ0RHUnZkR0psYkc5M1kyOXRZZ2QxYm1rd016STJCM1Z1YVRBek1qY0hkVzVwTURNeU9BeDFibWt3TXpBNExtTmhjMlVNZFc1cE1ETXdOeTVqWVhObERtZHlZWFpsWTI5dFlpNWpZWE5sRG1GamRYUmxZMjl0WWk1allYTmxESFZ1YVRBek1FSXVZMkZ6WlF4MWJta3dNekF5TG1OaGMyVU1kVzVwTURNd1F5NWpZWE5sREhWdWFUQXpNRFl1WTJGelpReDFibWt3TXpCQkxtTmhjMlVPZEdsc1pHVmpiMjFpTG1OaGMyVU1kVzVwTURNd05DNWpZWE5sRW1odmIydGhZbTkyWldOdmJXSXVZMkZ6WlF4MWJta3dNekV5TG1OaGMyVU1kVzVwTURNeFFpNWpZWE5sRVdSdmRHSmxiRzkzWTI5dFlpNWpZWE5sREhWdWFUQXpNall1WTJGelpReDFibWt3TXpJM0xtTmhjMlVNZFc1cE1ETXlPQzVqWVhObEVYVnVhVEF6TURZdWRtbGxkQzVqWVhObENuVnVhVEF6TURndWMyTUtkVzVwTURNd055NXpZd3huY21GMlpXTnZiV0l1YzJNTVlXTjFkR1ZqYjIxaUxuTmpDblZ1YVRBek1FSXVjMk1LZFc1cE1ETXdNaTV6WXdwMWJta3dNekJETG5OakNuVnVhVEF6TURZdWMyTUtkVzVwTURNd1FTNXpZd3gwYVd4a1pXTnZiV0l1YzJNS2RXNXBNRE13TkM1ell4Qm9iMjlyWVdKdmRtVmpiMjFpTG5OakNuVnVhVEF6TVRJdWMyTUtkVzVwTURNeFFpNXpZdzlrYjNSaVpXeHZkMk52YldJdWMyTUtkVzVwTURNeU5pNXpZd3AxYm1rd016STNMbk5qQ25WdWFUQXpNamd1YzJNVWRXNXBNRE13T0Y5MWJta3dNekF3TG5acFpYUVVkVzVwTURNd09GOTFibWt3TXpBeExuWnBaWFFRZFc1cE1ETXdPREF6TUVNdWRtbGxkQkIxYm1rd016QTRNRE13TkM1MmFXVjBESFZ1YVRBek1FTXVkbWxsZEJCMWJta3dNekEyTURNd01TNTJhV1YwRUhWdWFUQXpNRFl3TXpBd0xuWnBaWFFRZFc1cE1ETXdOakF6TURrdWRtbGxkQkIxYm1rd016QTJNRE13TXk1MmFXVjBFSFZ1YVRBek1ESXdNekF4TG5acFpYUVFkVzVwTURNd01qQXpNREF1ZG1sbGRCQjFibWt3TXpBeU1ETXdPUzUyYVdWMEVIVnVhVEF6TURJd016QXpMblpwWlhRQUFBRUFBZi8vQUE4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBWUFCZ0FXZ0JhQXNnQUFBSU0vL24vTWdSQy9xd0N5QUFBQWd6LytmOHlCRUwrckFCZEFGMEFVUUJSQWprQUFBUkMvcXdDUi8vekJFTCtyQUJkQUYwQVVRQlJBamtDT1FBQUFBQUVRdjZzQWprQ1IvL3ovL1FFUXY2c0FGd0FYQUJRQUZBQ3ZBQUFBdDhDREFBQS96SUVRdjZzQXNuLzh3TGZBaG4vOC84dUJFTCtyQUJPQUU0QVFBQkFBME1CdEFSQy9xd0RUQUdzQkVMK3JMQUFMQ0N3QUZWWVJWa2dJRXU0QUE1UlM3QUdVMXBZc0RRYnNDaFpZR1lnaWxWWXNBSWxZYmtJQUFnQVkyTWpZaHNoSWJBQVdiQUFReU5Fc2dBQkFFTmdRaTJ3QVN5d0lHQm1MYkFDTENNaEl5RXRzQU1zSUdTekF4UVZBRUpEc0JORElHQmdRckVDRkVOQ3NTVURRN0FDUTFSNElMQU1JN0FDUTBOaFpMQUVVSGl5QWdJQ1EyQkNzQ0ZsSENHd0FrTkRzZzRWQVVJY0lMQUNReU5Dc2hNQkUwTmdRaU93QUZCWVpWbXlGZ0VDUTJCQ0xiQUVMTEFESzdBVlExZ2pJU01oc0JaRFF5T3dBRkJZWlZrYklHUWdzTUJRc0FRbVdySW9BUTFEUldORnNBWkZXQ0d3QXlWWlVsdFlJU01oRzRwWUlMQlFVRmdoc0VCWkd5Q3dPRkJZSWJBNFdWa2dzUUVOUTBWalJXRmtzQ2hRV0NHeEFRMURSV05GSUxBd1VGZ2hzREJaR3lDd3dGQllJR1lnaW9waElMQUtVRmhnR3lDd0lGQllJYkFLWUJzZ3NEWlFXQ0d3Tm1BYllGbFpXUnV3QWlXd0RFTmpzQUJTV0xBQVM3QUtVRmdoc0F4REcwdXdIbEJZSWJBZVMyRzRFQUJqc0F4RFk3Z0ZBR0paV1dSaFdiQUJLMWxaSTdBQVVGaGxXVmtnWkxBV1F5TkNXUzJ3QlN3Z1JTQ3dCQ1ZoWkNDd0IwTlFXTEFISTBLd0NDTkNHeUVoV2JBQllDMndCaXdqSVNNaHNBTXJJR1N4QjJKQ0lMQUlJMEt3QmtWWUc3RUJEVU5GWTdFQkRVT3dCV0JGWTdBRktpRWdzQWhESUlvZ2lyQUJLN0V3QlNXd0JDWlJXR0JRRzJGU1dWZ2pXU0ZaSUxCQVUxaXdBU3NiSWJCQVdTT3dBRkJZWlZrdHNBY3NzQWxESzdJQUFnQkRZRUl0c0Fnc3NBa2pRaU1nc0FBalFtR3dBbUptc0FGanNBRmdzQWNxTGJBSkxDQWdSU0N3RGtOanVBUUFZaUN3QUZCWXNFQmdXV2F3QVdOZ1JMQUJZQzJ3Q2l5eUNRNEFRMFZDS2lHeUFBRUFRMkJDTGJBTExMQUFReU5Fc2dBQkFFTmdRaTJ3REN3Z0lFVWdzQUVySTdBQVE3QUVKV0FnUllvallTQmtJTEFnVUZnaHNBQWJzREJRV0xBZ0c3QkFXVmtqc0FCUVdHVlpzQU1sSTJGRVJMQUJZQzJ3RFN3Z0lFVWdzQUVySTdBQVE3QUVKV0FnUllvallTQmtzQ1JRV0xBQUc3QkFXU093QUZCWVpWbXdBeVVqWVVSRXNBRmdMYkFPTENDd0FDTkNzdzBNQUFORlVGZ2hHeU1oV1NvaExiQVBMTEVDQWtXd1pHRkVMYkFRTExBQllDQWdzQTlEU3JBQVVGZ2dzQThqUWxtd0VFTktzQUJTV0NDd0VDTkNXUzJ3RVN3Z3NCQmlackFCWXlDNEJBQmppaU5oc0JGRFlDQ0tZQ0N3RVNOQ0l5MndFaXhMVkZpeEJHUkVXU1N3RFdVamVDMndFeXhMVVZoTFUxaXhCR1JFV1JzaFdTU3dFMlVqZUMyd0ZDeXhBQkpEVlZpeEVoSkRzQUZoUXJBUksxbXdBRU93QWlWQ3NROENKVUt4RUFJbFFyQUJGaU1nc0FNbFVGaXhBUUJEWUxBRUpVS0tpaUNLSTJHd0VDb2hJN0FCWVNDS0kyR3dFQ29oRzdFQkFFTmdzQUlsUXJBQ0pXR3dFQ29oV2JBUFEwZXdFRU5IWUxBQ1lpQ3dBRkJZc0VCZ1dXYXdBV01nc0E1RFk3Z0VBR0lnc0FCUVdMQkFZRmxtc0FGallMRUFBQk1qUkxBQlE3QUFQcklCQVFGRFlFSXRzQlVzQUxFQUFrVlVXTEFTSTBJZ1JiQU9JMEt3RFNPd0JXQkNJTEFVSTBJZ1lMQUJZYmNZR0FFQUVRQVRBRUpDUW9wZ0lMQVVRMkN3RkNOQ3NSUUlLN0NMS3hzaVdTMndGaXl4QUJVckxiQVhMTEVCRlNzdHNCZ3NzUUlWS3kyd0dTeXhBeFVyTGJBYUxMRUVGU3N0c0Jzc3NRVVZLeTJ3SEN5eEJoVXJMYkFkTExFSEZTc3RzQjRzc1FnVkt5MndIeXl4Q1JVckxiQXJMQ01nc0JCaVpyQUJZN0FHWUV0VVdDTWdMckFCWFJzaElWa3RzQ3dzSXlDd0VHSm1zQUZqc0JaZ1MxUllJeUF1c0FGeEd5RWhXUzJ3TFN3aklMQVFZbWF3QVdPd0ptQkxWRmdqSUM2d0FYSWJJU0ZaTGJBZ0xBQ3dEeXV4QUFKRlZGaXdFaU5DSUVXd0RpTkNzQTBqc0FWZ1FpQmdzQUZodFJnWUFRQVJBRUpDaW1DeEZBZ3JzSXNyR3lKWkxiQWhMTEVBSUNzdHNDSXNzUUVnS3kyd0l5eXhBaUFyTGJBa0xMRURJQ3N0c0NVc3NRUWdLeTJ3Sml5eEJTQXJMYkFuTExFR0lDc3RzQ2dzc1FjZ0t5MndLU3l4Q0NBckxiQXFMTEVKSUNzdHNDNHNJRHl3QVdBdHNDOHNJR0N3R0dBZ1F5T3dBV0JEc0FJbFliQUJZTEF1S2lFdHNEQXNzQzhyc0M4cUxiQXhMQ0FnUnlBZ3NBNURZN2dFQUdJZ3NBQlFXTEJBWUZsbXNBRmpZQ05oT0NNZ2lsVllJRWNnSUxBT1EyTzRCQUJpSUxBQVVGaXdRR0JaWnJBQlkyQWpZVGdiSVZrdHNESXNBTEVBQWtWVVdMRU9Da1ZDc0FFV3NERXFzUVVCRlVWWU1Ga2JJbGt0c0RNc0FMQVBLN0VBQWtWVVdMRU9Da1ZDc0FFV3NERXFzUVVCRlVWWU1Ga2JJbGt0c0RRc0lEV3dBV0F0c0RVc0FMRU9Da1ZDc0FGRlk3Z0VBR0lnc0FCUVdMQkFZRmxtc0FGanNBRXJzQTVEWTdnRUFHSWdzQUJRV0xCQVlGbG1zQUZqc0FFcnNBQVd0QUFBQUFBQVJENGpPTEUwQVJVcUlTMndOaXdnUENCSElMQU9RMk80QkFCaUlMQUFVRml3UUdCWlpyQUJZMkN3QUVOaE9DMndOeXd1Rnp3dHNEZ3NJRHdnUnlDd0RrTmp1QVFBWWlDd0FGQllzRUJnV1dhd0FXTmdzQUJEWWJBQlEyTTRMYkE1TExFQ0FCWWxJQzRnUjdBQUkwS3dBaVZKaW9wSEkwY2pZU0JZWWhzaFdiQUJJMEt5T0FFQkZSUXFMYkE2TExBQUZyQVhJMEt3QkNXd0JDVkhJMGNqWWJFTUFFS3dDME1yWllvdUl5QWdQSW80TGJBN0xMQUFGckFYSTBLd0JDV3dCQ1VnTGtjalJ5TmhJTEFHSTBLeERBQkNzQXRES3lDd1lGQllJTEJBVVZpekJDQUZJQnV6QkNZRkdsbENRaU1nc0FwRElJb2pSeU5ISTJFalJtQ3dCa093QW1JZ3NBQlFXTEJBWUZsbXNBRmpZQ0N3QVNzZ2lvcGhJTEFFUTJCa0k3QUZRMkZrVUZpd0JFTmhHN0FGUTJCWnNBTWxzQUppSUxBQVVGaXdRR0JaWnJBQlkyRWpJQ0N3QkNZalJtRTRHeU93Q2tOR3NBSWxzQXBEUnlOSEkyRmdJTEFHUTdBQ1lpQ3dBRkJZc0VCZ1dXYXdBV05nSXlDd0FTc2pzQVpEWUxBQks3QUZKV0d3QlNXd0FtSWdzQUJRV0xCQVlGbG1zQUZqc0FRbVlTQ3dCQ1ZnWkNPd0F5VmdaRkJZSVJzaklWa2pJQ0N3QkNZalJtRTRXUzJ3UEN5d0FCYXdGeU5DSUNBZ3NBVW1JQzVISTBjallTTThPQzJ3UFN5d0FCYXdGeU5DSUxBS0kwSWdJQ0JHSTBld0FTc2pZVGd0c0Q0c3NBQVdzQmNqUXJBREpiQUNKVWNqUnlOaHNBQlVXQzRnUENNaEc3QUNKYkFDSlVjalJ5TmhJTEFGSmJBRUpVY2pSeU5oc0FZbHNBVWxTYkFDSldHNUNBQUlBR05qSXlCWVloc2hXV080QkFCaUlMQUFVRml3UUdCWlpyQUJZMkFqTGlNZ0lEeUtPQ01oV1Myd1B5eXdBQmF3RnlOQ0lMQUtReUF1UnlOSEkyRWdZTEFnWUdhd0FtSWdzQUJRV0xCQVlGbG1zQUZqSXlBZ1BJbzRMYkJBTENNZ0xrYXdBaVZHc0JkRFdGQWJVbGxZSUR4WkxyRXdBUlFyTGJCQkxDTWdMa2F3QWlWR3NCZERXRkliVUZsWUlEeFpMckV3QVJRckxiQkNMQ01nTGthd0FpVkdzQmREV0ZBYlVsbFlJRHhaSXlBdVJyQUNKVWF3RjBOWVVodFFXVmdnUEZrdXNUQUJGQ3N0c0VNc3NEb3JJeUF1UnJBQ0pVYXdGME5ZVUJ0U1dWZ2dQRmt1c1RBQkZDc3RzRVFzc0RzcmlpQWdQTEFHSTBLS09DTWdMa2F3QWlWR3NCZERXRkFiVWxsWUlEeFpMckV3QVJRcnNBWkRMckF3S3kyd1JTeXdBQmF3QkNXd0JDWWdJQ0JHSTBkaHNBd2pRaTVISTBjalliQUxReXNqSUR3Z0xpTTRzVEFCRkNzdHNFWXNzUW9FSlVLd0FCYXdCQ1d3QkNVZ0xrY2pSeU5oSUxBR0kwS3hEQUJDc0F0REt5Q3dZRkJZSUxCQVVWaXpCQ0FGSUJ1ekJDWUZHbGxDUWlNZ1I3QUdRN0FDWWlDd0FGQllzRUJnV1dhd0FXTmdJTEFCS3lDS2ltRWdzQVJEWUdRanNBVkRZV1JRV0xBRVEyRWJzQVZEWUZtd0F5V3dBbUlnc0FCUVdMQkFZRmxtc0FGalliQUNKVVpoT0NNZ1BDTTRHeUVnSUVZalI3QUJLeU5oT0NGWnNUQUJGQ3N0c0Vjc3NRQTZLeTZ4TUFFVUt5MndTQ3l4QURzcklTTWdJRHl3QmlOQ0l6aXhNQUVVSzdBR1F5NndNQ3N0c0Vrc3NBQVZJRWV3QUNOQ3NnQUJBUlVVRXk2d05pb3RzRW9zc0FBVklFZXdBQ05Dc2dBQkFSVVVFeTZ3TmlvdHNFc3NzUUFCRkJPd055b3RzRXdzc0RrcUxiQk5MTEFBRmtVaklDNGdSb29qWVRpeE1BRVVLeTJ3VGl5d0NpTkNzRTByTGJCUExMSUFBRVlyTGJCUUxMSUFBVVlyTGJCUkxMSUJBRVlyTGJCU0xMSUJBVVlyTGJCVExMSUFBRWNyTGJCVUxMSUFBVWNyTGJCVkxMSUJBRWNyTGJCV0xMSUJBVWNyTGJCWExMTUFBQUJES3kyd1dDeXpBQUVBUXlzdHNGa3Nzd0VBQUVNckxiQmFMTE1CQVFCREt5MndXeXl6QUFBQlF5c3RzRndzc3dBQkFVTXJMYkJkTExNQkFBRkRLeTJ3WGl5ekFRRUJReXN0c0Y4c3NnQUFSU3N0c0dBc3NnQUJSU3N0c0dFc3NnRUFSU3N0c0dJc3NnRUJSU3N0c0dNc3NnQUFTQ3N0c0dRc3NnQUJTQ3N0c0dVc3NnRUFTQ3N0c0dZc3NnRUJTQ3N0c0djc3N3QUFBRVFyTGJCb0xMTUFBUUJFS3kyd2FTeXpBUUFBUkNzdHNHb3Nzd0VCQUVRckxiQnJMTE1BQUFGRUt5MndiQ3l6QUFFQlJDc3RzRzBzc3dFQUFVUXJMYkJ1TExNQkFRRkVLeTJ3Ynl5eEFEd3JMckV3QVJRckxiQndMTEVBUEN1d1FDc3RzSEVzc1FBOEs3QkJLeTJ3Y2l5d0FCYXhBRHdyc0VJckxiQnpMTEVCUEN1d1FDc3RzSFFzc1FFOEs3QkJLeTJ3ZFN5d0FCYXhBVHdyc0VJckxiQjJMTEVBUFNzdXNUQUJGQ3N0c0hjc3NRQTlLN0JBS3kyd2VDeXhBRDByc0VFckxiQjVMTEVBUFN1d1Fpc3RzSG9zc1FFOUs3QkFLeTJ3ZXl5eEFUMHJzRUVyTGJCOExMRUJQU3V3UWlzdHNIMHNzUUErS3k2eE1BRVVLeTJ3Zml5eEFENHJzRUFyTGJCL0xMRUFQaXV3UVNzdHNJQXNzUUErSzdCQ0t5MndnU3l4QVQ0cnNFQXJMYkNDTExFQlBpdXdRU3N0c0lNc3NRRStLN0JDS3kyd2hDeXhBRDhyTHJFd0FSUXJMYkNGTExFQVB5dXdRQ3N0c0lZc3NRQS9LN0JCS3kyd2h5eXhBRDhyc0VJckxiQ0lMTEVCUHl1d1FDc3RzSWtzc1FFL0s3QkJLeTJ3aWl5eEFUOHJzRUlyTGJDTExMSUxBQU5GVUZpd0JodXlCQUlEUlZnaklSc2hXVmxDSzdBSVpiQURKRkI0c1FVQkZVVllNRmt0QUFBQUFFdTRBREJTV0xFQkFZNVpzQUc1Q0FBSUFHTndzUUFIUXJZQVV6OEFJd1VBS3JFQUIwSkFERm9FUmdnMkJpb0VHQWNGQ2lxeEFBZENRQXhnQWxBR1BnUXdBaUVGQlFvcXNRQU1RcjRXd0JIQURjQUt3QVpBQUFVQUN5cXhBQkZDdmdCQUFFQUFRQUJBQUVBQUJRQUxLcmtBQXdBQVJMRWtBWWhSV0xCQWlGaTVBQU1BQUVTeEtBR0lVVmk0Q0FDSVdMa0FBd0FBUkZrYnNTY0JpRkZZdWdpQUFBRUVRSWhqVkZpNUFBTUFBRVJaV1ZsWldVQU1YQVJJQ0RnR0xBUWFCd1VPS3JnQi80V3dCSTJ4QWdCRXN3VmtCZ0JFUkFBQUFBQUFBUUFBQUFBPScpIGZvcm1hdCgndHJ1ZXR5cGUnKTsNCglmb250LXdlaWdodDogbm9ybWFsOw0KCWZvbnQtc3R5bGU6IG5vcm1hbDsNCn0NCg0KQGZvbnQtZmFjZSB7DQoJZm9udC1mYW1pbHk6ICdNb3RpdmEgU2Fucyc7DQoJc3JjOiB1cmwoJ2RhdGE6Zm9udC90dGY7YmFzZTY0LEFBRUFBQUFTQVFBQUJBQWdSRk5KUndBQUFBRUFBZDhjQUFBQUNFZEVSVVlOdGc0MEFBQUJMQUFBQUVCSFVFOVR0NjF1S1FBQUFXd0FBSFZxUjFOVlF1Rmt3ZHNBQUhiWUFBQWJwRTlUTHpKMDBwMENBQUNTZkFBQUFHQmpiV0Z3OW1TTG93QUFrdHdBQUFXT1kzWjBJRVlwQ1E4QUFjOWtBQUFBeUdad1oyMmVOaUhTQUFIUUxBQUFEaFZuWVhOd0FBQUFFQUFCejF3QUFBQUlaMng1WnVDS3JtUUFBSmhzQUFFQnRtaGxZV1FYay90QkFBR2FKQUFBQURab2FHVmhCcDRHS3dBQm1sd0FBQUFrYUcxMGVIYkJlQUFBQVpxQUFBQU01bXh2WTJHbjkyZldBQUduYUFBQUJxWnRZWGh3QktBUEZnQUJyaEFBQUFBZ2JtRnRaWDljNXJrQUFhNHdBQUFEbjNCdmMzU2g4OFFZQUFHeDBBQUFIWXR3Y21Wd21xbW1qZ0FCM2tRQUFBRFdBQUVBQUFBTUFBQUFBQUFBQUFJQUNBQUNBTmtBQVFEYkFSa0FBUUViQVhNQUFRRjBBWFVBQWdGMkFhc0FBUUd0QWk4QUFRTUFBeElBQXdNZ0ExRUFBd0FCQUFBQUNnRHdBMFFBQWtSR1RGUUFEbXhoZEc0QUlBQUVBQUFBQVAvL0FBUUFBQUFMQUJZQUlRQTZBQWxCV2tVZ0FFaERRVlFnQUZaRFVsUWdBR1JMUVZvZ0FISk5UMHdnQUlCT1RFUWdBSTVTVDAwZ0FKeFVRVlFnQUtwVVVrc2dBTGdBQVAvL0FBUUFBUUFNQUJjQUlnQUEvLzhBQkFBQ0FBMEFHQUFqQUFELy93QUVBQU1BRGdBWkFDUUFBUC8vQUFRQUJBQVBBQm9BSlFBQS8vOEFCQUFGQUJBQUd3QW1BQUQvL3dBRUFBWUFFUUFjQUNjQUFQLy9BQVFBQndBU0FCMEFLQUFBLy84QUJBQUlBQk1BSGdBcEFBRC8vd0FFQUFrQUZBQWZBQ29BQVAvL0FBUUFDZ0FWQUNBQUt3QXNZM0J6Y0FFS1kzQnpjQUVRWTNCemNBRVdZM0J6Y0FFY1kzQnpjQUVpWTNCemNBRW9ZM0J6Y0FFdVkzQnpjQUUwWTNCemNBRTZZM0J6Y0FGQVkzQnpjQUZHYTJWeWJnRk1hMlZ5YmdGVWEyVnliZ0ZjYTJWeWJnRmthMlZ5YmdGc2EyVnliZ0YwYTJWeWJnRjhhMlZ5YmdHRWEyVnliZ0dNYTJWeWJnR1VhMlZ5YmdHY2JXRnlhd0drYldGeWF3R3FiV0Z5YXdHd2JXRnlhd0cyYldGeWF3RzhiV0Z5YXdIQ2JXRnlhd0hJYldGeWF3SE9iV0Z5YXdIVWJXRnlhd0hhYldGeWF3SGdiV3R0YXdIbWJXdHRhd0h3Yld0dGF3SDZiV3R0YXdJRWJXdHRhd0lPYld0dGF3SVliV3R0YXdJaWJXdHRhd0lzYld0dGF3STJiV3R0YXdKQWJXdHRhd0pLQUFBQUFRQUFBQUFBQVFBQUFBQUFBUUFBQUFBQUFRQUFBQUFBQVFBQUFBQUFBUUFBQUFBQUFRQUFBQUFBQVFBQUFBQUFBUUFBQUFBQUFRQUFBQUFBQVFBQUFBQUFBZ0FCQUFJQUFBQUNBQUVBQWdBQUFBSUFBUUFDQUFBQUFnQUJBQUlBQUFBQ0FBRUFBZ0FBQUFJQUFRQUNBQUFBQWdBQkFBSUFBQUFDQUFFQUFnQUFBQUlBQVFBQ0FBQUFBZ0FCQUFJQUFBQUNBQUVBQWdBQUFBRUFBd0FBQUFFQUF3QUFBQUVBQXdBQUFBRUFBd0FBQUFFQUF3QUFBQUVBQXdBQUFBRUFBd0FBQUFFQUF3QUFBQUVBQXdBQUFBRUFBd0FBQUFFQUF3QUFBQU1BQkFBRkFBWUFBQUFEQUFRQUJRQUdBQUFBQXdBRUFBVUFCZ0FBQUFNQUJBQUZBQVlBQUFBREFBUUFCUUFHQUFBQUF3QUVBQVVBQmdBQUFBTUFCQUFGQUFZQUFBQURBQVFBQlFBR0FBQUFBd0FFQUFVQUJnQUFBQU1BQkFBRkFBWUFBQUFEQUFRQUJRQUdBQWNBRUFBWUFDWUFPZ0JDQUVvQVVnQUJBQUFBQVFCS0FBSUFDQUFFQUV3QWRnQ2NBWllBQWdBSUFBY0IvQ1l1TUh3MmtEelFQUDQvZmdBRUFBQUFBVCtDQUFZQUFBQUJYd1lBQmdBQUFBRmZsQUFHQUFBQUFXSWNBQUZqcWdBRkFBVUFDZ0FCWTdBQUJBQUFBQVFBRWdBWUFCNEFKQUFCQXJ2L3hBQUJBcnoveEFBQkFydi94QUFCQXJ6L3hBQUNZNUFBQkFBQVpnUm1DQUFCQUFzQUFQL2wvOWYvL3YvbC8vZi85di8rLy83Ly8vLy9BQUpqY2dBRUFBQm1mR2NjQUEwQUNRQUEvOGIveHdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvMUFDVC8vLy8vQUFBQUFBQUEvN3YvdXdBQUFBQUFBQUFBLyt3QUFBQUFBQUFBQUFBQUFBQUFBQUFBLys0QUFBQUFBQUFBQVAvakFCUUFBQUFBQUFMLzlBQUFBQUFBQUFBQUFBQUFBQUFBLytzQUFBQUFBQUFBQVAvdUFBQUFBQUFBQUFBQUFBQUEvK1QvN1FBQUFBQUFBQUFBQUFBQUFBQUEvLzhBQUFBQUFBQUFBQUFBQUFBQUFBQUEvLy8vL3dBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQWdBQUFBQUFBQUFBLy93QUFBQUEvLzMvL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBLy84QUFBQUNZclFBQkFBQVpxcG14Z0FGQUFvQUFQL2MvK1gvMlAvRC8vc0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUCtkQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEL25RQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvOFFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvN0FBRmlWQUFFQUFBQkVBSXFBandDUmdKUUFsb0NaQUp1QW5nQ2dnS01BcFlDb0FLcUFyUUN2Z0xJQXRJQzNBTG1Bd0FEQ2dNa0Ewb0RjQU9XQTd3RDRnUUlCQzRFVkFWcUJaQUZ4Z1hzQmhJR09BWnVCNFFIaWdlUUI3WUgzQWdDQ0NnSVRnaUVDS29JeEFqZUNQZ0pFZ2tzQ1VZSlVBbHVDWXdKcWduSUNlWUtIQXBTQ29nS3ZncjBDeW9MU0F0bUM0UUxvZ3ZBQzk0TDdBd0tEQ2dNUmd4a0RJSU1vQXkrRE53TStnMEFEUVlOREEwU0RSZ05IZzBrRFNvTk1BMDJEVHdOUWcxSURVNE5WQTFhRFdBTlpnMXNEWElOZUExK0RZUU5pZzNFRGNvTjBBM2FEZUFONWczc0RnSU9DQTRPRGl3T2ZnN0VEczRPMkE3aUR1d085ZzhFRHc0UEdBOVdEMkFQYWc5MEQzNFBpQStTRDV3UHBnK3dEOElRQkJBaUVKd1F1aEVFRVVZUnlCSG1FZ1FTSWhKa0Vtb1NyQkxhRTF3VFloTm9FMjRUZEJONkU0QVRuaE84RkE0VVBCUzZGTUFVemhUY0ZPb1UrQlVHRlJRVkhoVXNGVG9WZUJXR0ZhQVZ1aFhVRmY0V0dCWXVGa1FXV2had0ZvWVduQmF1RnJ3V3loYllGdVlXOUJjQ0Z4QVhIaGNzRnpvWFdCZG1GM1FYZ2hlUUY2NFh6QmZlRitRWDZoZndGL1lYL0JnQ0dCUVlKaGc0R0VvWVhCbGVHWEFhY2h0MEc0WWJtQnVxRzd3YnpodmdHL0ljQkJ3V0hEQWNTaHhrSEg0Y21CMmFIYlFldGg3VUg5NGYrQ0FTSUN3aExpRklJa29pWkNLR0lxQWl1aUxVSXU0akNDTWlJendqUmlOUUkxb2paQ051STNnamlpT2dJN1lqekNQaUkvZ2tEaVFVSkJva0lDUW1KQ3dBQkFFSkFDSUJDZ0FpQVFzQUlnRU1BQ0lBQWdFQUFBQUJDQUFCQUFJQkFBQUFBUWdBQVFBQ0FRQUFBQUVJQUFFQUFnRUFBQUFCQ0FBQkFBSUJBQUFBQVFnQUFRQUNBUUFBQUFFSUFBRUFBZ0VBQUFBQkNBQUJBQUlCQUFBQUFRZ0FBUUFDQVFBQUFBRUlBQUVBQWdFQUFBQUJDQUFCQUFJQkFBQUFBUWdBQVFBQ0FRQUFBQUVJQUFFQUFnRUFBQUFCQ0FBQkFBSUJBQUFBQVFnQUFRQUNBUUFBQUFFSUFBRUFBZ0VBQUFBQkNBQUJBQUlCQUFBQUFRZ0FBUUFHQVFBQUFBRUlBQUVCQ1FBckFRb0FLd0VMQUNzQkRBQXJBQUlCQUFBQUFRZ0FBUUFHQVA4QUFRRUFBQk1CQ0FBVkFiei8vd0c5QUFFQnhRQVVBQWtBUndBU0FFb0FFZ0JPQUJzQS93QUNBUWdBQXdHN0FBUUJ2UUFFQWNBQUJRSEZBQU1BQ1FCSEFCSUFTZ0FTQUU0QUd3RC9BQUlCQ0FBREFic0FCQUc5QUFRQndBQUZBY1VBQXdBSkFFY0FFZ0JLQUJJQVRnQWJBUDhBQWdFSUFBTUJ1d0FFQWIwQUJBSEFBQVVCeFFBREFBa0FSd0FTQUVvQUVnQk9BQnNBL3dBQ0FRZ0FBd0c3QUFRQnZRQUVBY0FBQlFIRkFBTUFDUUJIQUJJQVNnQVNBRTRBR3dEL0FBSUJDQUFEQWJzQUJBRzlBQVFCd0FBRkFjVUFBd0FKQUVjQUVnQktBQklBVGdBYkFQOEFBZ0VJQUFNQnV3QUVBYjBBQkFIQUFBVUJ4UUFEQUFrQVJ3QVNBRW9BRWdCT0FCc0Evd0FDQVFnQUF3RzdBQVFCdlFBRUFjQUFCUUhGQUFNQUNRQkhBQklBU2dBU0FFNEFHd0QvQUFJQkNBQURBYnNBQkFHOUFBUUJ3QUFGQWNVQUF3QkZBRWNBRWdCS0FCSUFUZ0FiQVA4QUFnRUlBQU1CZGdBREFZOEFBd0dXQUFNQmx3QURBWmdBQXdHWkFBTUJtZ0FEQVpzQUF3R2NBQU1CblFBREFaNEFBd0dmQUFNQm9BQURBYUVBQXdHaUFBTUJvd0FEQWFRQUF3R2xBQU1CcGdBREFhY0FBd0dvQUFNQnFRQURBYW9BQXdHckFBTUJyUUFEQWJRQUF3RzFBQU1CdGdBREFiY0FBd0c0QUFNQnVRQURBYm9BQXdHN0FBUUJ2QUFEQWIwQUFnRytBQU1CdndBREFjQUFCZ0hCQUFNQndnQURBY01BQXdIRUFBTUJ4UUFEQWNvQUF3SExBQU1CekFBREFjMEFBd0hPQUFNQnp3QURBZEFBQXdIUkFBTUIwZ0FEQWRNQUF3SFVBQU1CMVFBREFkWUFBd0hYQUFNQjJBQURBZklBQXdIekFBTUI5UUFEQWZZQUF3SDNBQU1CK0FBREFBa0FSd0FTQUVvQUVnQk9BQnNBL3dBQ0FRZ0FBd0c3QUFRQnZRQUVBY0FBQlFIRkFBTUFEUUJIQUJJQVNnQVNBRTRBR3dEL0FBSUJDQUFEQVFrQUJBRUtBQVFCQ3dBRUFRd0FCQUc3QUFRQnZRQUVBY0FBQlFIRkFBTUFDUUJIQUJJQVNnQVNBRTRBR3dEL0FBSUJDQUFEQWJzQUJBRzlBQVFCd0FBRkFjVUFBd0FKQUVjQUVnQktBQklBVGdBYkFQOEFBZ0VJQUFNQnV3QUVBYjBBQkFIQUFBVUJ4UUFEQUFrQVJ3QVNBRW9BRWdCT0FCc0Evd0FDQVFnQUF3RzdBQVFCdlFBRUFjQUFCUUhGQUFNQURRQkhBQklBU2dBU0FFNEFHd0QvQUFJQkNBQURBUWtBQndFS0FBY0JDd0FIQVF3QUJ3RzdBQVFCdlFBRUFjQUFCUUhGQUFNQVJRQWFBQklBSVFBU0FDSUFFZ0FqQUJJQUpBQVNBQ1VBRWdBbUFCSUFKd0FTQUNnQUVnQXBBQklBS2dBU0FDc0FFZ0FzQUJJQUxRQVNBQzRBRWdBdkFCSUFNQUFTQURFQUVnQXlBQklBTXdBU0FEUUFFZ0ExQUJJQU5nQVNBRGNBRWdBK0FCSUFQd0FTQUVBQUVnQkJBQklBUWdBU0FFTUFFZ0JFQUJJQVJRQVNBRVlBRWdCSEFCSUFTQUFTQUVrQUVnQktBQklBU3dBU0FFd0FFZ0JOQUJJQVRnQWJBRklBRWdCVEFCSUFWQUFTQUZVQUVnQldBQklBVndBU0FGZ0FFZ0JaQUJJQVdnQVNBRnNBRWdCY0FCSUFYUUFTQUY0QUVnQmZBQklBWUFBU0FIb0FFZ0I3QUJJQWZRQVNBSDRBRWdCL0FCSUFnQUFTQUljQUVnRC9BQUlCQ0FBREFic0FCQUc5QUFRQndBQUZBY1VBQXdBQkFjVUFCQUFCQWNVQUJBQUpBRWNBRWdCS0FCSUFUZ0FiQVA4QUFnRUlBQU1CdXdBRUFiMEFCQUhBQUFVQnhRQURBQWtBUndBU0FFb0FFZ0JPQUJzQS93QUNBUWdBQXdHN0FBUUJ2UUFFQWNBQUJRSEZBQU1BQ1FCSEFCSUFTZ0FTQUU0QUd3RC9BQUlCQ0FBREFic0FCQUc5QUFRQndBQUZBY1VBQXdBSkFFY0FFZ0JLQUJJQVRnQWJBUDhBQWdFSUFBTUJ1d0FFQWIwQUJBSEFBQVVCeFFBREFBa0FSd0FTQUVvQUVnQk9BQnNBL3dBQ0FRZ0FBd0c3QUFRQnZRQUVBY0FBQlFIRkFBTUFEUUJIQUJJQVNnQVNBRTRBR3dEL0FBSUJDQUFEQVFrQUF3RUtBQU1CQ3dBREFRd0FBd0c3QUFRQnZRQUVBY0FBQlFIRkFBTUFDUUJIQUJJQVNnQVNBRTRBR3dEL0FBSUJDQUFEQWJzQUJBRzlBQVFCd0FBRkFjVUFBd0FHQVA0QUF3RUFBQU1CQXdBRUFRZ0FBd0hBQUFNQnhRQURBQVlBL2dBREFRQUFBd0VEQUFRQkNBQURBY0FBQXdIRkFBTUFCZ0QrQUFNQkFBQURBUU1BQkFFSUFBTUJ3QUFEQWNVQUF3QUdBUDRBQXdFQUFBTUJBd0FFQVFnQUF3SEFBQU1CeFFBREFBWUEvZ0FEQVFBQUF3RURBQVFCQ0FBREFjQUFBd0hGQUFNQUJnRCtBQU1CQUFBREFRTUFCQUVJQUFNQndBQURBY1VBQXdBQ0FRQUFBQUVJQUFFQUJ3RUFBQjhCQ0FBZ0Fid0FBUUc5QUFNQndQLzJBY1AvOXdIRkFCWUFCd0VBQUI4QkNBQWdBYndBQVFHOUFBTUJ3UC8yQWNQLzl3SEZBQllBQndFQUFCOEJDQUFnQWJ3QUFRRzlBQU1Cd1AvMkFjUC85d0hGQUJZQUJ3RUFBQjhCQ0FBZ0Fid0FBUUc5QUFNQndQLzJBY1AvOXdIRkFCWUFCd0VBQUI4QkNBQWdBYndBQVFHOUFBTUJ3UC8yQWNQLzl3SEZBQllBRFFCSEFDWUFUZ0F4QVA0QUxnRUFBQjRCQXdBZ0FRZ0FIUUc4QUNzQnZRQXdBYjRBS0FIQUFEQUJ3UUFvQWNNQUxBSEZBQzhBRFFCSEFDWUFUZ0F4QVA0QUxnRUFBQjRCQXdBZ0FRZ0FIUUc4QUNzQnZRQXdBYjRBS0FIQUFEQUJ3UUFvQWNNQUxBSEZBQzhBRFFCSEFDWUFUZ0F4QVA0QUxnRUFBQjRCQXdBZ0FRZ0FIUUc4QUNzQnZRQXdBYjRBS0FIQUFEQUJ3UUFvQWNNQUxBSEZBQzhBRFFCSEFDWUFUZ0F4QVA0QUxnRUFBQjRCQXdBZ0FRZ0FIUUc4QUNzQnZRQXdBYjRBS0FIQUFEQUJ3UUFvQWNNQUxBSEZBQzhBRFFCSEFDWUFUZ0F4QVA0QUxnRUFBQjRCQXdBZ0FRZ0FIUUc4QUNzQnZRQXdBYjRBS0FIQUFEQUJ3UUFvQWNNQUxBSEZBQzhBRFFCSEFDWUFUZ0F4QVA0QUxnRUFBQjRCQXdBZ0FRZ0FIUUc4QUNzQnZRQXdBYjRBS0FIQUFEQUJ3UUFvQWNNQUxBSEZBQzhBQndBWi82a0JBQUFGQVFnQUdBRzgvL2tCdlFBTkFjTUFDZ0hGQUJnQUJ3QVovN1VCQXdBVUFRZ0FHQUc4QUFzQnZRQUZBY01BQ3dIRkFCY0FCd0FaLzdVQkF3QVVBUWdBR0FHOEFBc0J2UUFGQWNNQUN3SEZBQmNBQndBWi83VUJBd0FVQVFnQUdBRzhBQXNCdlFBRkFjTUFDd0hGQUJjQUJ3QVovN1VCQXdBVUFRZ0FHQUc4QUFzQnZRQUZBY01BQ3dIRkFCY0FCd0FaLzdVQkF3QVVBUWdBR0FHOEFBc0J2UUFGQWNNQUN3SEZBQmNBQXdFSUFBUUJ2UUFFQWNVQUJRQUhBUUFBQmdFREFBTUJDQUFGQWJ3QUFnRzlBQTRCd3dBQ0FjVUFEd0FIQVFBQUJnRURBQU1CQ0FBRkFid0FBZ0c5QUE0Qnd3QUNBY1VBRHdBSEFRQUFCZ0VEQUFNQkNBQUZBYndBQWdHOUFBNEJ3d0FDQWNVQUR3QUhBUUFBQmdFREFBTUJDQUFGQWJ3QUFnRzlBQTRCd3dBQ0FjVUFEd0FIQVFBQUJnRURBQU1CQ0FBRkFid0FBZ0c5QUE0Qnd3QUNBY1VBRHdBSEFRQUFCZ0VEQUFNQkNBQUZBYndBQWdHOUFBNEJ3d0FDQWNVQUR3QUhBUUFBQmdFREFBTUJDQUFGQWJ3QUFnRzlBQTRCd3dBQ0FjVUFEd0FIQVFBQUJnRURBQU1CQ0FBRkFid0FBZ0c5QUE0Qnd3QUNBY1VBRHdBSEFRQUFCZ0VEQUFNQkNBQUZBYndBQWdHOUFBNEJ3d0FDQWNVQUR3QUJBUWdBQkFBQkFRZ0FCQUFCQVFnQUJBQUJBUWdBQkFBQkFRTUFCQUFCQVFNQUJBQUJBUU1BQkFBQkFRTUFCQUFCQVFNQUJBQUJBUU1BQkFBQkFRTUFCQUFCQVFNQUJBQUJBUU1BQkFBQkFRTUFCQUFCQVFNQUJBQUJBUU1BQkFBQkFRTUFCQUFCQVFNQUJBQUJBUU1BQkFBQkFRTUFCQUFCQVFNQUJBQUJBUU1BQkFBQkFRTUFCQUFCQVFNQUJBQU9BUU1BQkFFSkFGUUJDZ0JVQVFzQVZBRU1BRlFCWi8vM0FXai85d0ZwLy9jQmF2LzNBV3YvOXdGcy8vY0JiZi8zQVc3Lzl3RnYvL2NBQVFFREFBUUFBUUVEQUFRQUFnRUFBQU1CQXdBSUFBRUJBd0FEQUFFQkF3QURBQUVCQXdBREFBVUJBd0FEQVFrQUF3RUtBQU1CQ3dBREFRd0FBd0FCQVFNQUF3QUJBUU1BQXdBSEFQZ0FBd0QvQUFRQkFBQUNBUU1BQXdFR0FBSUJDQUFOQVJRQUZnQVVBTDBBQXdDK0FBVUF2d0FEQU1BQUFnREJBQU1Bd2dBREFNa0FBd0RRQUFNQTMvLzZBT3IvK3dEeS8va0EvZ0E5QVA4QUZnRUFBRFFCQXdBM0FRWUFGZ0VJQUQwQktQLzZBUzMvK2dFNkFBa0FFUUQ0QUFNQStnQUZBUHNBQlFEOEFBVUEvUUFGQVA0QUJRRC9BQVFCQUFBQ0FRRUFCUUVDQUFVQkF3QURBUVFBQlFFRkFBVUJCZ0FDQVFjQUJRRUlBQkFCRkFBV0FBSUJBQUFEQVFNQUNBQUNBUUFBQXdFREFBZ0FBZ0VBQUFNQkF3QUlBQUlCQUFBREFRTUFDQUFDQVFBQUF3RURBQWdBQXdFQUFBTUJBd0FJQXF3QUFnQUNBUUFBQXdFREFBZ0FBZ0VBQUFNQkF3QUlBQThBK2dBR0FQc0FCZ0Q4QUFZQS9RQUdBUDRBQmdEL0FBWUJBQUFEQVFFQUJnRUNBQVlCQXdBSUFRUUFCZ0VGQUFZQkJnQUdBUWNBQmdFSUFBWUFBZ0VBQUFNQkF3QUlBQUlCQUFBREFRTUFDQUFDQVFBQUF3RURBQWdBQWdFQUFBTUJBd0FJQUFJQkFBQURBUU1BQ0FBQ0FRQUFBd0VEQUFnQUFnRUFBQU1CQXdBSUFBSUJBQUFEQVFNQUNBQUNBUUFBQXdFREFBZ0FCQUQ0QUFNQS93QUVBUU1BSXdFR0FBTUFFQUQ0QUFJQStnQUFBUHNBQUFEOEFBQUEvUUFBQVA0QUhBRC9BQklCQUFBbUFRRUFBQUVDQUFBQkF3QVNBUVFBQUFFRkFBQUJCZ0FXQVFjQUFBRUlBQjBBQndENEFBSUEvZ0FjQVA4QUVnRUFBQ1lCQXdBU0FRWUFGZ0VJQUJzQUhnRFNBQU1BOXdBREFQZ0FBZ0Q1QUFNQStnQUpBUHNBQ1FEOEFBa0EvUUFKQVA0QUhBRC9BQklCQUFBbUFRRUFDUUVDQUFrQkF3QVNBUVFBQ1FFRkFBa0JCZ0FXQVFjQUNRRUlBQnNCRFFBREFRNEFBd0VQQUFNQkVBQURBUkVBQXdFU0FBTUJFd0FEQVJRQUF3RTJBQU1CUWdBREFxWUFCZ0FIQVBnQUFnRCtBQndBL3dBU0FRQUFKZ0VEQUJJQkJnQVdBUWdBR3dBU0FQZ0FBZ0Q2QUFZQSt3QUdBUHdBQmdEOUFBWUEvZ0FjQVA4QUVnRUFBQ2tCQVFBR0FRSUFCZ0VEQUJvQkJBQUdBUVVBQmdFR0FCWUJCd0FHQVFnQUd3S21BQVFDcmdBQ0FCQUErQUFDQVBvQUFRRDdBQUVBL0FBQkFQMEFBUUQrQUJ3QS93QVNBUUFBSmdFQkFBRUJBZ0FCQVFNQUVnRUVBQUVCQlFBQkFRWUFGZ0VIQUFFQkNBQWpBQ0FBMGdBQkFQY0FBUUQ0QUFRQStRQUJBUG9BS2dEN0FDb0EvQUFxQVAwQUtnRCtBQndBL3dBU0FRQUFMUUVCQUNvQkFnQXFBUU1BS3dFRUFDb0JCUUFxQVFZQUZnRUhBQ29CQ0FBdEFRMEFBUUVPQUFFQkR3QUJBUkFBQVFFUkFBRUJFZ0FCQVJNQUFRRVVBQUVCTmdBQkFVSUFBUUttQUFJQ3JBQUJBcTRBQXdBSEFQZ0FBZ0QrQUJ3QS93QVNBUUFBSmdFREFCSUJCZ0FXQVFnQUd3QUhBUGdBQWdEK0FCd0Evd0FTQVFBQUpnRURBQklCQmdBV0FRZ0FHd0FIQVBnQUFnRCtBQndBL3dBU0FRQUFKZ0VEQUJJQkJnQVdBUWdBR3dBUUFQZ0FBZ0Q2QUFRQSt3QUVBUHdBQkFEOUFBUUEvZ0FjQVA4QUVnRUFBQ1lCQVFBRUFRSUFCQUVEQUJVQkJBQUVBUVVBQkFFR0FCWUJCd0FFQVFnQUd3QUJBUWdBQXdBUUFQZ0FBZ0Q2QUJrQSt3QVpBUHdBR1FEOUFCa0EvZ0FjQVA4QUZnRUFBQmtCQVFBWkFRSUFHUUVEQUJJQkJBQVpBUVVBR1FFR0FCWUJCd0FaQVFnQUt3QUxBUGdBQWdEK0FCd0Evd0FTQVFBQUpnRURBQklCQmdBV0FRZ0FHd0VKQUNNQkNnQWpBUXNBSXdFTUFDTUFJQURTQUFNQTl3QURBUGdBQWdENUFBTUErZ0FuQVBzQUp3RDhBQ2NBL1FBbkFQNEFIQUQvQUI0QkFBQW1BUUVBSndFQ0FDY0JBd0FtQVFRQUp3RUZBQ2NCQmdBaEFRY0FKd0VJQUMwQkRRQURBUTRBQXdFUEFBTUJFQUFEQVJFQUF3RVNBQU1CRXdBREFSUUFBd0UyQUFNQlFnQURBcVlBQlFLcUFBTUNyZ0FFQUFFQkNBQURBQUVCQ0FBREFBRUJDQUFEQUFFQkNBQURBQUVCSFAvb0FBRUJIUC9vQUFjQStBQURBUDhBQkFFQUFBSUJBd0FEQVFZQUFnRUlBQTBCRkFBV0FBY0ErQUFEQVA4QUJBRUFBQUlCQXdBREFRWUFBZ0VJQUEwQkZBQVdBQlFBdlFBREFMNEFCUUMvQUFNQXdBQUNBTUVBQXdEQ0FBTUF5UUFEQU5BQUF3RGYvL29BNnYvN0FQTC8rUUQrQUQwQS93QVdBUUFBTkFFREFEY0JCZ0FXQVFnQVBRRW8vL29CTGYvNkFUb0FDUUFMQVBnQUF3RC9BQVFCQUFBQ0FRTUFBd0VHQUFJQkNBQU5BUWtBRmdFS0FCWUJDd0FXQVF3QUZnRVVBQllBSHdEd0FBd0ErQUFEQVA4QUJBRUFBQUlCQXdBREFRWUFBZ0VJQUEwQkZBQVdBVU1BRlFGRUFCVUJSUUFWQVVZQUZRRkhBQlVCWUFBVkFXRUFGUUZpQUJVQll3QVZBV1FBRlFGbEFCVUJaZ0FFQVdjQUN3Rm9BQXNCYVFBTEFXb0FDd0ZyQUFzQmJBQUxBVzBBQ3dGdUFBc0Jid0FMQVhRQURBRjFBQXdBQVFFSUFBTUFBd0VBQUFVQkJnQURBUWdBQndBREFRQUFCUUVHQUFNQkNBQUhBQU1CQUFBRkFRWUFBd0VJQUFjQUF3RUFBQVVCQmdBREFRZ0FCd0FEQVFBQUJRRUdBQU1CQ0FBSEFBTUJBQUFGQVFZQUF3RUlBQWNBQWdFQUFBTUJBd0FJQUFNQS9nQURBUUFBQXdFREFBY0FBd0QrQUFNQkFBQURBUU1BQndBUEFQb0FBd0Q3QUFNQS9BQURBUDBBQXdEK0FBTUEvd0FEQVFBQUF3RUJBQU1CQWdBREFRTUFCd0VFQUFNQkJRQURBUVlBQXdFSEFBTUJDQUFEQUFNQS9nQURBUUFBQXdFREFBY0FCZ0QrQUFVQS93QUJBUUFBQlFFREFBZ0JCZ0FDQVFnQUJRQUdBUDRBQlFEL0FBRUJBQUFGQVFNQUNBRUdBQUlCQ0FBRkFBWUEvZ0FGQVA4QUFRRUFBQVVCQXdBSUFRWUFBZ0VJQUFVQUNnRCtBQVVBL3dBQkFRQUFCUUVEQUFnQkJnQUNBUWdBQlFFSkFCa0JDZ0FaQVFzQUdRRU1BQmtBQmdEK0FBVUEvd0FCQVFBQUJRRURBQWdCQmdBQ0FRZ0FCUUFGQVBnQUF3RC9BQkFCQUFBakFRWUFEZ0VJQUMwQUJRRDRBQU1BL3dBUUFRQUFJd0VHQUE0QkNBQXRBQVVBK0FBREFQOEFFQUVBQUNNQkJnQU9BUWdBTFFBRkFQZ0FBd0QvQUJBQkFBQWpBUVlBRGdFSUFDMEFCUUQ0QUFNQS93QVFBUUFBSXdFR0FBNEJDQUF0QUFVQStBQURBUDhBRUFFQUFDTUJCZ0FPQVFnQUxRQUVBUWtBR0FFS0FCZ0JDd0FZQVF3QUdBQURBUEgvN0FLWS84UUNtZi9JQUFNQThmL3NBcGoveEFLWi84Z0FBd0R4Lyt3Q21QL0VBcG4veUFBREFQSC83QUtZLzhRQ21mL0lBQU1BOGYvc0Fwai94QUtaLzhnQUF3RHgvK3dDbVAvRUFwbi95QUFEQVBILzdRS1kvOFFDbWYvSUFBTUE4Zi9zQXBqL3hBS1ovOGdBQXdEeC8rd0NtUC9FQXBuL3lBQURBUEgvN0FLWS84UUNtZi9JQUFjQThmL3NBUWtBQ2dFS0FBb0JDd0FLQVF3QUNnS1kvOFFDbWYvSUFBTUE4Zi9zQXBqL3hBS1ovOGdBQXdEeC8rd0NtUC9FQXBuL3lBQURBUEgvN0FLWS84UUNtZi9JQUFNQThmL3NBcGoveEFLWi84Z0FCd0Q0QUFJQS9nQWNBUDhBRWdFQUFDWUJBd0FTQVFZQUZnRUlBQnNBQndENEFBTUEvd0FFQVFBQUFnRURBQU1CQmdBQ0FRZ0FEUUVVQUJZQUJBRzdBQVVCdlFBREFjQUFCd0hGQUFJQUFRSEFBQUFBQVFIQUFBSUFBUUhBQUFBQUFRSEFBQUFBQVFIQUFBQUFBUUhBQUFBQUJBRzdBQVVCdlFBREFjQUFCd0hGQUFJQUJBRzdBQVVCdlFBREFjQUFCd0hGQUFJQUJBRzdBQVVCdlFBREFjQUFCd0hGQUFJQUJBRzdBQVVCdlFBREFjQUFCd0hGQUFJQUJBRzdBQVVCdlFBREFjQUFCd0hGQUFJQVFBRjJBQUFCandBQUFaWUFBQUdYQUFBQm1BQUFBWmtBQUFHYUFBQUJtd0FBQVp3QUFBR2RBQUFCbmdBQUFaOEFBQUdnQUFBQm9RQUFBYUlBQUFHakFBQUJwQUFBQWFVQUFBR21BQUFCcHdBQUFhZ0FBQUdwQUFBQnFnQUFBYXNBQUFHdEFBQUJ0QUFBQWJVQUFBRzJBQUFCdHdBQUFiZ0FBQUc1QUFBQnVnQUFBYnNBQlFHOEFBQUJ2UUFEQWI0QUFBRy9BQUFCd0FBSEFjRUFBUUhDQUFBQnd3QUFBY1FBQUFIRkFBSUJ5Z0FBQWNzQUFBSE1BQUFCelFBQUFjNEFBQUhQQUFBQjBBQUFBZEVBQUFIU0FBQUIwd0FBQWRRQUFBSFZBQUFCMWdBQUFkY0FBQUhZQUFBQjhnQUFBZk1BQUFIMUFBQUI5Z0FBQWZjQUFBSDRBQUFBQkFHN0FBVUJ2UUFEQWNBQUJ3SEZBQUlBUUFGMkFBSUJqd0FDQVpZQUFnR1hBQUlCbUFBQ0Faa0FBZ0dhQUFJQm13QUNBWndBQWdHZEFBSUJuZ0FDQVo4QUFnR2dBQUlCb1FBQ0FhSUFBZ0dqQUFJQnBBQUNBYVVBQWdHbUFBSUJwd0FDQWFnQUFnR3BBQUlCcWdBQ0Fhc0FBZ0d0QUFJQnRBQUNBYlVBQWdHMkFBSUJ0d0FDQWJnQUFnRzVBQUlCdWdBQ0Fic0FCUUc4QUFJQnZRQURBYjRBQWdHL0FBSUJ3QUFIQWNFQUFnSENBQUlCd3dBQ0FjUUFBZ0hGQUFJQnlnQUNBY3NBQWdITUFBSUJ6UUFDQWM0QUFnSFBBQUlCMEFBQ0FkRUFBZ0hTQUFJQjB3QUNBZFFBQWdIVkFBSUIxZ0FDQWRjQUFnSFlBQUlCOGdBQ0FmTUFBZ0gxQUFJQjlnQUNBZmNBQWdINEFBSUFRQUYyQUFRQmp3QUVBWllBQkFHWEFBUUJtQUFFQVprQUJBR2FBQVFCbXdBRUFad0FCQUdkQUFRQm5nQUVBWjhBQkFHZ0FBUUJvUUFFQWFJQUJBR2pBQVFCcEFBRUFhVUFCQUdtQUFRQnB3QUVBYWdBQkFHcEFBUUJxZ0FFQWFzQUJBR3RBQVFCdEFBRUFiVUFCQUcyQUFRQnR3QUVBYmdBQkFHNUFBUUJ1Z0FFQWJzQUJRRzhBQVFCdlFBREFiNEFCQUcvQUFRQndBQUZBY0VBQkFIQ0FBUUJ3d0FFQWNRQUJBSEZBQU1CeWdBRUFjc0FCQUhNQUFRQnpRQUVBYzRBQkFIUEFBUUIwQUFFQWRFQUJBSFNBQVFCMHdBRUFkUUFCQUhWQUFRQjFnQUVBZGNBQkFIWUFBUUI4Z0FFQWZNQUJBSDFBQVFCOWdBRUFmY0FCQUg0QUFRQUJBRzdBQVVCdlFBREFjQUFCd0hGQUFJQUJBRzdBQVVCdlFBREFjQUFCd0hGQUFJQUJBRzdBQVVCdlFBREFjQUFCd0hGQUFJQUJBRzdBQVVCdlFBREFjQUFCd0hGQUFJQUJBRzdBQVVCdlFBREFjQUFCd0hGQUFJQUJBRzdBQVVCdlFBREFjQUFCd0hGQUFJQUJBRzdBQVVCdlFBREFjQUFCd0hGQUFJQUJBRzdBQVVCdlFBREFjQUFCd0hGQUFJQUJBRzdBQVVCdlFBREFjQUFCd0hGQUFJQUJnRzdBQWdCdkFBREFiMEFCZ0hBQUFBQnd3QURBY1VBQkFBR0Fic0FDQUc4QUFNQnZRQUdBY0FBQUFIREFBTUJ4UUFFQUFZQnV3QUlBYndBQXdHOUFBWUJ3QUFBQWNNQUF3SEZBQVFBQmdHN0FBZ0J2QUFEQWIwQUJnSEFBQUFCd3dBREFjVUFCQUFHQWJzQUNBRzhBQU1CdlFBR0FjQUFBQUhEQUFNQnhRQUVBRUFCZGdBQUFZOEFBQUdXQUFBQmx3QUFBWmdBQUFHWkFBQUJtZ0FBQVpzQUFBR2NBQUFCblFBQUFaNEFBQUdmQUFBQm9BQUFBYUVBQUFHaUFBQUJvd0FBQWFRQUFBR2xBQUFCcGdBQUFhY0FBQUdvQUFBQnFRQUFBYW9BQUFHckFBQUJyUUFBQWJRQUFBRzFBQUFCdGdBQUFiY0FBQUc0QUFBQnVRQUFBYm9BQUFHN0FBZ0J2QUFEQWIwQUJnRytBQUFCdndBQUFjQUFHd0hCQUFBQndnQUFBY01BQXdIRUFBQUJ4UUFFQWNvQUFBSExBQUFCekFBQUFjMEFBQUhPQUFBQnp3QUFBZEFBQUFIUkFBQUIwZ0FBQWRNQUFBSFVBQUFCMVFBQUFkWUFBQUhYQUFBQjJBQUFBZklBQUFIekFBQUI5UUFBQWZZQUFBSDNBQUFCK0FBQUFBWUJ1d0FJQWJ3QUF3RzlBQVlCd0FBQUFjTUFBd0hGQUFRQVFBRjJBQVVCandBRkFaWUFCUUdYQUFVQm1BQUZBWmtBQlFHYUFBVUJtd0FGQVp3QUJRR2RBQVVCbmdBRkFaOEFCUUdnQUFVQm9RQUZBYUlBQlFHakFBVUJwQUFGQWFVQUJRR21BQVVCcHdBRkFhZ0FCUUdwQUFVQnFnQUZBYXNBQlFHdEFBVUJ0QUFGQWJVQUJRRzJBQVVCdHdBRkFiZ0FCUUc1QUFVQnVnQUZBYnNBRndHOEFBTUJ2UUFFQWI0QUJRRy9BQVVCd0FBWkFjRUFCUUhDQUFVQnd3QURBY1FBQlFIRkFBTUJ5Z0FGQWNzQUJRSE1BQVVCelFBRkFjNEFCUUhQQUFVQjBBQUZBZEVBQlFIU0FBVUIwd0FGQWRRQUJRSFZBQVVCMWdBRkFkY0FCUUhZQUFVQjhnQUZBZk1BQlFIMUFBVUI5Z0FGQWZjQUJRSDRBQVVBQndHN0FBZ0J2QUFYQWIwQUJnSEFBQUFCd3dBREFjVUFHQUt1QUFJQVFnRjJBQU1CandBREFaWUFBd0dYQUFNQm1BQURBWmtBQXdHYUFBTUJtd0FEQVp3QUF3R2RBQU1CbmdBREFaOEFBd0dnQUFNQm9RQURBYUlBQXdHakFBTUJwQUFEQWFVQUF3R21BQU1CcHdBREFhZ0FBd0dwQUFNQnFnQURBYXNBQXdHdEFBTUJ0QUFEQWJVQUF3RzJBQU1CdHdBREFiZ0FBd0c1QUFNQnVnQURBYnNBQ0FHOEFBTUJ2UUFpQWI0QUF3Ry9BQU1Cd0FBWEFjRUFBd0hDQUFNQnd3QVZBY1FBQXdIRkFDc0J5Z0FEQWNzQUF3SE1BQU1CelFBREFjNEFBd0hQQUFNQjBBQURBZEVBQXdIU0FBTUIwd0FEQWRRQUF3SFZBQU1CMWdBREFkY0FBd0hZQUFNQjhnQURBZk1BQXdIMUFBTUI5Z0FEQWZjQUF3SDRBQU1DckFBQ0FxNEFCQUFHQWJzQUNBRzhBQU1CdlFBR0FjQUFBQUhEQUFNQnhRQUVBQVlCdXdBSUFid0FBd0c5QUFZQndBQUFBY01BQXdIRkFBUUFCZ0c3QUFnQnZBQURBYjBBQmdIQUFBQUJ3d0FEQWNVQUJBQkFBWFlBQWdHUEFBSUJsZ0FDQVpjQUFnR1lBQUlCbVFBQ0Fab0FBZ0diQUFJQm5BQUNBWjBBQWdHZUFBSUJud0FDQWFBQUFnR2hBQUlCb2dBQ0FhTUFBZ0drQUFJQnBRQUNBYVlBQWdHbkFBSUJxQUFDQWFrQUFnR3FBQUlCcXdBQ0FhMEFBZ0cwQUFJQnRRQUNBYllBQWdHM0FBSUJ1QUFDQWJrQUFnRzZBQUlCdXdBSUFid0FBd0c5QUFZQnZnQUNBYjhBQWdIQUFBQUJ3UUFDQWNJQUFnSERBQU1CeEFBQ0FjVUFBd0hLQUFJQnl3QUNBY3dBQWdITkFBSUJ6Z0FDQWM4QUFnSFFBQUlCMFFBQ0FkSUFBZ0hUQUFJQjFBQUNBZFVBQWdIV0FBSUIxd0FDQWRnQUFnSHlBQUlCOHdBQ0FmVUFBZ0gyQUFJQjl3QUNBZmdBQWdBR0Fic0FDQUc4QUFNQnZRQUdBY0FBQUFIREFBTUJ4UUFFQUVBQmRnQURBWThBQXdHV0FBTUJsd0FEQVpnQUF3R1pBQU1CbWdBREFac0FBd0djQUFNQm5RQURBWjRBQXdHZkFBTUJvQUFEQWFFQUF3R2lBQU1Cb3dBREFhUUFBd0dsQUFNQnBnQURBYWNBQXdHb0FBTUJxUUFEQWFvQUF3R3JBQU1CclFBREFiUUFBd0cxQUFNQnRnQURBYmNBQXdHNEFBTUJ1UUFEQWJvQUF3RzdBQWdCdkFBREFiMEFGZ0crQUFNQnZ3QURBY0FBQUFIQkFBTUJ3Z0FEQWNNQUF3SEVBQU1CeFFBaEFjb0FBd0hMQUFNQnpBQURBYzBBQXdIT0FBTUJ6d0FEQWRBQUF3SFJBQU1CMGdBREFkTUFBd0hVQUFNQjFRQURBZFlBQXdIWEFBTUIyQUFEQWZJQUF3SHpBQU1COVFBREFmWUFBd0gzQUFNQitBQURBQVlCdXdBSUFid0FBd0c5QUFZQndBQUFBY01BQXdIRkFBUUFDQUc3QUNNQnZBQURBYjBBSVFIQUFDUUJ3d0FvQWNVQUxBS21BQmNDcmdBR0FBWUJ1d0FJQWJ3QUF3RzlBQVlCd0FBQUFjTUFBd0hGQUFRQUJnRzdBQWdCdkFBREFiMEFCZ0hBQUFBQnd3QURBY1VBQkFBR0Fic0FDQUc4QUFNQnZRQUdBY0FBQUFIREFBTUJ4UUFFQUFZQnV3QUlBYndBQXdHOUFBWUJ3QUFBQWNNQUF3SEZBQVFBQmdHN0FBZ0J2QUFEQWIwQUJnSEFBQUFCd3dBREFjVUFCQUFHQWJzQUNBRzhBQU1CdlFBR0FjQUFBQUhEQUFNQnhRQUVBQVlCdXdBSUFid0FBd0c5QUFZQndBQUFBY01BQXdIRkFBUUFBZ0c5QUFJQnhRQUVBQUlCdlFBQ0FjVUFCQUFDQWIwQUFnSEZBQVFBQWdHOUFBSUJ4UUFFQUFJQnZRQUNBY1VBQkFBQ0FiMEFBZ0hGQUFRQUJBRzdBQVVCdlFBREFjQUFCd0hGQUFJQUJRRzhBQndCdlFBS0FjQUFCQUhEQUFnQnhRQW5BQVVCdkFBY0FiMEFDZ0hBQUFRQnd3QUlBY1VBSndBRkFid0FIQUc5QUFvQndBQUVBY01BQ0FIRkFDY0FCUUc4QUJ3QnZRQUtBY0FBQkFIREFBZ0J4UUFuQUFVQnZBQWNBYjBBQ2dIQUFBUUJ3d0FJQWNVQUp3QUZBYndBSEFHOUFBb0J3QUFFQWNNQUNBSEZBQ2NBQVFLWi80WUFBUUtaLzRZQUFRS1ovNFlBQVFLWi80WUFBUUtaLzRZQUFRS1ovNFlBQWo3K0FBUUFBRUptUXp3QUZ3QTVBQUQvNmYrMy8rci95di9VLzhyLzd2L1kvLzRBQ2YvMC81Ny84di9WLy9QLzFQL2YvOHovM3YvL0FBTC8vLy84Ly8vLy8vLy8vLzcvLy8vNi8vNEFBZi8vQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC9zQUFELzlQLysvL01BQUFBQUFBQUFBQUFBQUFELy93QUFBQUQvL2dBQS8vNEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBLy8vLy8vLy8vOVAvL3YvL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELzlBQUFBQUFBQVFBQkFBRUFBQUFBQUFBQUN2LytBQUQvLy8vMi8vLy85QUFBLy9RQUFBQUFBQUFBQUFBQUFBQUFBd0FBLy9jQUFBQUEvLzhBQUFBQS8vY0FBUC80QUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDUUFKQUFBQUFBQUFBQ01BQ2YvK0FBRC8vd0FBQUFELy9nQUEvL1VBQUFBSUFCTC8vLy8vQUFELy92LytBQUQvL3dBQS8vNEFBUC8rQUFELzkvLy9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFTQUFBQUV3QVNBQW9BQUFBQS8vNy80UC9yQUFELy9nQUFBQUFBQUFBQy8vOEFBdi9EQUFuLzZ3QUpBQUQvL3YvOUFBRC85UUFBLy9RQUFQLzkvNGIvMC8vVkFBRC83Zi84QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFQLzNBQUQvLy8vLy85b0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC8vd0FBLy84QUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC8vLy8vQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBQUFBQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC83Z0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC8rQUFELy93QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvK1gvNi8vc0FBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELzRnQUEvLzRBQUFBQUFBQUFBQUFBQUFFQUZmL3EvK1AvL1AvaC8vei8zZi9xLzkvLzRnQVNBQVAvOXYvK0FBQUFBLy91Ly9RQUFBQUEvLzhBQWdBQUFBQUFBUUFDQUFBQUFnQUEvL2Ivc3YvM0FBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQveXYrSy8rWC91di9OLzV3QUFBQUFBQUFBSmdBQS84VC8vZit6Lys3L3hQL04vK0QveEFBVUFBc0FBZi8vQUFBQUFBQUEvK1VBQVArNUFBQUFBUUFBQUFBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFEL3l3QUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC9aQUFELzRQLysvOC8vOXdBQUFBWC82Ly8vLzl3QUFRQUFBQUFBQUFBQUFBQUFBUC9nLzluLy93QUJBQUQvL3dBQUFBQUFBQUFBQUFBQUFBQUEvNzMvNGYvMEFBQUFBUC8zQUFBQUFBQUEvLzRBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVNBQUFBRWdBUy8vOEFBQUFBQUFuL3pQLy9BQUFBRkFBVkFBQUFIUUFvQUJRQUlQL00vLzRBQUFBVUFBQUFDUUFBQUFBQUFBQUFBQUFBRXdBUy80di8xUC9oQUFBQUFBQUFBQUFBQUFBU0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBLy8wQUFBQUFBQUFBQ3YvL0FBQUFDZ0FBQUFBQUNRQUpBQUFBQVFBSkFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDd0FKQUFBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELy9RQUEvLzhBQUFBQUFBQUFBUC8vQUFELy93QUFBQUQvL2dBQS8rd0FBUC8vQUFBQUFBQUFBQUFBQWdBQUFBQUFBQUFBQUFBQUFQLytBQUQvL3dBQUFBQUFBQUFBQUFBQUFBQUEvLzhBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELzJnQWJBQUFBQ2dBS0FCVC8vQUFBQUFEL24vK1VBQUQvOS8vMy83Ny9yLy9lLzdmL3p2L1VBQUQvb1FBQUFBQUFIZit5LzdQL3N3QUEvNkgveXYrei8yMy9yLytsQUFEL3hnQUFBQUQvcXYrMC8rVUFBUC9KLzVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvOS8vMkFBQUFBQUFBQUFBQUFBQUEvL1lBQVAvMS8vWUFBQUFBQUFBQUFBQUFBQUFBQUFBQS8vWUFBUC8vQUFELzZmL3JBQUFBQUFBQUFBQUFBUC8zQUFBQUFQL3VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFyQUFVQUdnQVpBQ01BQUFBc0FCZi85Ly8zQUFBQUFRQUFBQUFBQUFBQUFBQUFBUC8rQUEvLzdRQU1BQThBR2YvN0FBRC85d0FBQUFBQUFBQUFBQUQvOWYvMUFBRUFMZ0FBQUJZQUFBQUFBQUFBQUFBQkFBQUFHZ0FZQUFRQUJ3QUZBQVFBQXdBREFBTUFCUUFHQUFELzN3QVRBQUFBRkFBTEFBdi8xd0FBLy8vL3pmL0tBQUQvL3dBQS8rMy83UUFBLyt3QUFQL0tBQUwvelFBQUFBRUFBUC9yLzluLzRnQUEvOWYvN2Yvei82di9yUC9DQUFELzlQLzdBQUQveHYvcS8vWUFBUC9yQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvOVFBVUFBQUFGQUFMQUF2LzJRQUFBQUQvNlAvWEFBQUFCd0FBQUFELzlnQUJBQUQvK1AvTUFBTC80QUFBQUFBQUJmL3QvL1QvN1FBQS8rc0FBUC8rQUFEL3VQL1ZBQUQvOVFBQUFBQUFBUC85Ly9ZQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC8yQUFBLy9ZQUFRQUJBQUwvNUFBQUFBRUFGdi9yQUFELy9mL2ovL1gvNGYvYS85Zi80Z0FCQUEwQUFRQUFBQUFBQmYvdS8vWUFBQUFBQUFBQUF3QUFBQUFBQWdBREFBRC8vd0FBQUFBQUFBQUFBQU1BQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFELzFnQVVBQUFBQWdBQ0FBUC83QUFBQUFEL3cvK3lBQUQvL3Yvei8rei82Z0FBLytzQUFQK2xBQUwvdXYvKy8vVUFBdi9OLzliLzFnQUEvOFAvNC8vZi81ai9wdi9CLy9YLzJBQUFBQUFBQVAvWC8vVUFBUC9zLzZzQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvOXdBQS8vY0FBQUFBQUFELzNBQUFBQUFBQ3YvdUFBQUFBUC8zQUFELzIvLzMvOXYvN3dBQUFBQUFBQUFBQUFBQUFRQUEvL2NBQUFBQS8rNEFBUUFBQUFELzl3QUJBQUFBQWdBQUFBQUFBQUFBQUFBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJMHhnQUVBQUE3TER3eUFCWUFJd0FBLzRRQURQLzIvK1gvOUFBSi8vTUFDZi8vLy8vLysvLytBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUDk3QUFELzdBQUEvLzhBQVAvMi8vOEFBQUFBQUFBQUFmL3UvL2NBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC9SUUFBQUFEL3dmLzYvL1gvOWdBQS8rNEFBUC84QUFBQUFBQUEvOG9BQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCOEFBUC8zQUFrQUV3QUNBQWtBQ0FBS0FBWUFBZ0FLLyswQUFBQUFBQUVBQ1FBSi85ai85di9sQUFNQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCYi85d0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC84Ly8vLzZnQUEvLzhBQUFBQS8vOEFBUUFBQUFBQUFBQUFBQUFBQVAvL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXdBQUFBQUFBQUFBQUFBQUJBQUZBQUFBQUFBQUFBQUFBUUFCQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQmIvOXdBQUFBQUFBQUFBQUFBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEL3dBQUEvK29BQUFBQUFBdi8vd0FKQUFBQUFBQUFBQUQvOXYvL0FBQUFBQUFBQUFBQUFQLy9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFQLy9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFqLy9BQUdBQUlBQWdBQUFBY0FCUUFUQUFvQUJRQUdBQUFBQUFBS0FEQUFNUUFBQUFjQUFBQXlBQW9BQ3dBdUFCb0FCd0FIQUFnQUFnQUpBQVlBQUFBQUFBRC9ld0FBQUFELzNQLytBQUQvL2dBQUFBQUFBUC85Ly84QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvL0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQS81ei8vd0FBLzl6LzhQLzAvK3YvL3YvM0FBQUFBQUFBLyswQUFBQUFBQUFBQUFBQS8rTUFBQUFBQUFBQUFBQUFBQUQvdUFBQUFBQUFBQUFBQUFEL3dmLzMvLzRBQUFBQUFEVUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvbi8vLy8rY0FBQUFMQUF3QUV3QUFBQXIvL3dBQUFBdi83UC8xQUFELzl3QUFBQUQvb1AvMi8vd0FBQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvNG9BQVAvMkFBRC8vd0FBLy83Ly93QUFBQUFBQUFBQUFBRC85d0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFQL0tBQUQvN1FBQUFBQUFBZi8vQUFBQUFRQUFBQUFBQVAvL0FBQUFBQUFCQUFJQUF3QUFBQUFBQUFBREFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUsvLzRBQUFBV0FCY0FGUUFKQUF3QUN3QUNBQlgvL3dBQUFBQUFBZ0FBQUFBQUFQLy9BQUFBQUFBQUFBQUFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBLzZyLy8vL3NBQUFBQ3dBREFBRUFBQUFCQUFBQUFBQUwvL0gvN0FBQUFBQUFBQUFBLzhQLy8vLytBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC9jQUFILzdBQUFBQUlBQXdBQkFBQUFBZ0FBQUFBQUF2LzMvKzBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC92d0FBLys0QUFBQUFBQUVBQUFBS0FBRUFBQUFBQUFMLzl3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBLy84QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUNBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWk3Q0FBUUFBRGRJT0FZQUZnQWtBQUQvMS8vci8rNy9zLy9pLzhYLzd2KzgvL24vL3YvMy8vWC8rUUFDQUFMLy8vLzgvL24vK2YvK0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC83UC8vLy9YLy92L3QvL2NBQUFBQUFBQUFBUC8yLy9jQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvai8vZi85Ly8xQUFELzl3QUIvL2NBQUFBQUFBQUFBUC8zQUFBQUFBQUFBQUFBQUFBQS85TUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvM0FBQUFBZ0FBQUFJQUFBQUNBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvMy8vY0FBUUFBQUFJQUFBQUNBQUFBQUFBQUFBQUFBUCs5Lzc4QUFBQUFBQUFBQUFBQS80OEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFQLzNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQS8vY0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFXQUFJQUF3QURBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC8xLy84QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvdC8vY0FBUC8vQUFBQUFmLzVBQUVBQUFBQUFBQUFBQUFDQUF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvakFBRC9wdi8yLzljQUFQK3pBQWtBQUFBQUFBQUFBQUFCQUJNQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQi8vZi8zUUFBLyszLzlmL2ovL1lBQUFBQUFBQUFBUC9qLy9VQUFBQUFBQUFBQUFBQS85TUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC8vQUFELysvLy9BQUFBQUFBQUFBQUFBUC9oLzcwQUFBQUFBQUFBQUFBQS81OEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC8rLy84QUFQL3RBQUFBQUFBQUFBQUFBQUFCQUFzQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC8vQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvYi8vY0FBZ0FBQUFNQUFBQUVBQUVBQUFBQUFBQUFBUCt0LzcwQUFBQUFBQUFBQUFBQS81Z0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC85d0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC9yLy84QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFEd0FCQUJFQUJRQVNBQVVBQUFBQUFBQUFBUC8vQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHQUFRQUNBQUZBQUlBQXdBREFBSUFCUUFGQUFJQUJBQUZBQUFBQVAvNEFBZ0FBd0FBQUNnQUFBQU5BQUlBQUFBQUFBQUFBUC9XLzljQUFBQUFBQUFBQUFBQS83TUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvc0FBQUFBQUFBQUFBQUFQLzNBQUVBQUFBQUFBQUFBQUFCQUFFQUFBQUFBQUFBQUFBQS8rNEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvYi8vWUFBd0FBQUFRQUFBQUZBQUVBQUFBQUFBQUFBUC9FLzg4QUFBQUFBQUFBQUFBQS80UUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFRQUNBQXNBQUFBQUFBQUFBQUFBQUFrQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUluS0FBRUFBQXBuRE5LQUFFQUR3QUEvK0wvOS8vaC8rTC80Ly9zLzl6LzkvLzIvKzMvK2YvOS8vei8vd0FDS0dRQUJBQUFNNWd6OEFBTUFCb0FBUC9jQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC8wd0FOQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC9RLzBmL3FnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVAvY0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCTC9iZityLzhIL21nQWYvK3ovNWYrbS81ai96Zit6Ly9mL2hBQUZBQVAvL1FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEL3dRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEvNTRBQUFBTS85d0FBQUFBLzdRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFQK2wvOXovNWYvQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvN0FBQUFBQUFBQUFBQUFEL3p3QUFBQVQvN2dBRkFBRC96Z0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBLzlZQUFQLytBQUQvOC8vL0FBQUFBQUFBQUFBQUFQLzlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUC8xQUFBQUFBQUFBQUFBQVAvOEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC85QUFBQUFBQUFBQUFBQUFBQWlZT0FBUUFBREpxTW5JQUFnQUNBQUFBQVFBQUFBSUFBU1grSmc0QUJBQU1BU0lBUlFBQ0VwQUFBaEtXQUFJU25BQUNFcUlBQWhLb0FBTVRBZ0FDRXBBQUFoS3VBQUlTdEFBQ0VwQUFBaEswQUFJU2tBQUNFcm9BQWhLdUFBTVRDQUFBRW1BQUFCSm1BQUFTYkFBQkVvb0FBaExBQUFJU3hnQUNFc3dBQWhMU0FBSVMyQUFDRXNBQUFoTGVBQUlTNUFBQ0VzQUFBaExrQUFJU3dBQUNFdW9BQWhMd0FBTVREZ0FBRW1BQUFCSnlBQUFTZUFBQkVvb0FBaEswQUFJU2tBQUNFcFlBQWhLY0FBSVNvZ0FDRXFnQUFoS1FBQUlTcmdBQ0VyUUFBaEtRQUFJU3RBQUNFcEFBQWhMMkFBSVNyZ0FERXdnQUFCSmdBQUFTZmdBQUVvUUFBUktLQUFJU2tBQUNFcEFBQWhLUUFBSVNrQUFDRXZ3QUFoSzBBQUlTdEFBQ0VyUUFBaEswQUFJU2tBQUNFcEFBQWhLUUFBSVNrQUlwRWY0U0JCSUtBQUFSL2hJRUVoQUFBQkgrRWdRU0ZnQUFFZjRTQkJJY0FBQVNJaElFRWhZQUFCSCtFZ1FTS0FBQUVmNFNCQkl1QUFBUi9oSUVFalFBQUJIK0VnUVNPZ0FBRWY0U0JCSkFBQUFSL2hJRUVrWUFBQklpRWdRU1FBQUFFZjRTQkJKTUFBQVIvaElFRWxJQUFCSCtFZ1FTV0FBQUVmNFNCQkplQUFBU0loSUVFZ29BQUJIK0VnUVNaQUFBRWY0U0JCSnFBQUFSL2hJRUVuQUFBQkgrRWdRU0NnQUFFZjRTQkJKMkFBQVIvaElFRW53QUFCS0NBQUFTaUFBQUVvNEFBQktVQUFBU21nQUFFcUFBQUJLYUFBQVNwZ0FBRXBvQUFCS3NBQUFTc2dBQUVxQUFBQkthQUFBU3VBQUFFcG9BQUJLZ0FBQVN2Z0FBRXNRQUFCSytBQUFTeEFBQUVyNEFBQkxLQUFBU3ZnQUFFc1FBQUJMUUV0WVMzQUFBRXRBUzFoTGlBQUFTMEJMV0V1Z0FBQkxRRXRZUzdnQUFFdEFTMWhMMEFBQVMwQkxXRXZvQUFCTUFFdFlTOUFBQUV0QVMxaE1HQUFBUzBCTFdFd3dBQUJMUUV0WVRFZ0FBRXRBUzFoTVlBQUFTMEJMV0V0d0FBQk1BRXRZUzNBQUFFdEFTMWhNZUFBQVMwQkxXRXlRQUFCTFFFdFlUS2dBQUV0QVMxaExjQUFBUzBCTFdFekFBQUJNMkFBQVRQQUFBRTBJQUFCTklBQUFUUWdBQUUwNEFBQk5DQUFBVFZBQUFFMElBQUJOYUFBQVRZQUFBRTBnQUFCTkNBQUFUU0FBQUVwb0FBQk5tQUFBU21nQUFFMllBQUJLYUFBQVRiQUFBRTNJVGVCTitBQUFUaEJONEU0b0FBQk55RTNnVGtBQUFFM0lUZUJPV0FBQVRjaE40RTV3QUFCTnlFM2dUb2dBQUUzSVRlQk9vQUFBVGNoTjRFMzRBQUJPdUUzZ1RmZ0FBRTNJVGVCTzBBQUFUY2hONEU3b0FBQk55RTNnVHdBQUFFM0lUZUJOK0FBQVRjaE40RThZQUFCUE1BQUFUMGdBQUU4d0FBQlBZQUFBVHpBQUFFOTRBQUJQa0FBQVQ2Z0FBRS9BQUFCUHFBQUFUOWdBQUUvd1VBaFAyQUFBVG5CUUNFL1lBQUJQOEZBSVVDQUFBRS93VUFoUDJBQUFUL0JRQ0ZBNEFBQlFVRkJvVUlBQUFGQ1lBQUJRc0FBQVVNZ0FBRkN3QUFCUTRBQUFVTEFBQUZENEFBQlJFQUFBVU1nQUFGQ3dBQUJReUFBQVVMQUFBRkVvQUFCTkNGRkFVVmhSY0UwSVVVQlJpRkZ3VFFoUlFGR2dVWEJOQ0ZGQVViaFJjRTBJVVVCUjBGRndUUWhSUUZIb1VYQlNBRkZBVWRCUmNFMElVVUJTR0ZGd1RRaFJRRkl3VVhCTkNGRkFVa2hSY0UwSVVVQlNZRkZ3VWdCUlFGRllVWEJOQ0ZGQVVuaFJjRTBJVVVCU2tGRndUUWhSUUZGWVVYQk5DRkZBVVloUmNGSUFVVUJSV0ZGd1RRaFJRRko0VVhCTkNGRkFVcEJSY0UwSVVVQlNxRkZ3VFFoUlFGTEFVWEJOQ0ZGQVV0aFJjRTBJVVVCUldGRndUUWhSUUZLb1VYQlM4QUFBVXdnQUFGTWdBQUJUT0FBQVUxQUFBRk5vQUFCTkNGRkFVVmhSY0ZPQUFBQlRtQUFBVTRBQUFGT3dBQUJUZ0FBQVU4Z0FBRlBnQUFCVG1BQUFVL2dBQUZRUUFBQlQrQUFBVkNnQUFGUDRBQUJVUUFBQVZGZ0FBRlFRQUFCVCtBQUFWSEFBQUZTSUFBQlVFQUFBUi9nQUFGU2dBQUJQa0FBQVQ2Z0FBRlM0QUFCVTBBQUFWTGdBQUZUUUFBQlV1QUFBVk9nQUFGVUFBQUJVMEFBQVZSZ0FBRlRRQUFCVk1GVklWV0JWZUZVd1ZVaFZrRlY0VlRCVlNGV29WWGhWTUZWSVZjQlZlRlV3VlVoVjJGVjRWVEJWU0ZYd1ZYaFZNRlZJVmdoVmVGVXdWVWhWOEZWNFZUQlZTRllnVlhoVk1GVklWamhWZUZaUVZVaFZZRlY0VlRCVlNGWm9WWGhWTUZWSVZvQlZlRlV3VlVoVllGVjRWVEJWU0ZXUVZYaFdVRlZJVldCVmVGVXdWVWhXYUZWNFZUQlZTRmFBVlhoVk1GVklWcGhWZUZVd1ZVaFdzRlY0VlRCVlNGYklWWGhWTUZWSVZXQlZlRlV3VlVoVzRGVjRWVEJWU0ZhWVZYaFcrQUFBVnhBQUFGY29BQUJYUUFBQVZ5Z0FBRmRZQUFCWEtBQUFWM0FBQUZjb0FBQlhpQUFBVnlnQUFGZWdBQUJYdUFBQVY5QUFBRmZvQUFCWUFBQUFWK2dBQUZnWUFBQlg2QUFBV0RBQUFGZm9BQUJZU0FBQVdHQUFBRmdBQUFCWDZBQUFXSGdBQUZmb0FBQllrQUFBVitnQUFGaW9BQUJYNkFBQVdNQUFBRmU0QUFCWUFBQUFWN2dBQUZnWUFBQlh1QUFBV05nQUFGZTRBQUJZQUFBQVdQQlpDRmtnQUFCWThGa0lXVGdBQUZqd1dRaFpJQUFBV1BCWkNGbFFBQUJaYUZrSVdZQUFBRmp3V1FoWm1BQUFXUEJaQ0Ztd0FBQlk4RmtJV2NnQUFGandXUWhaNEFBQVdQQlpDRm40QUFCWThGa0lXaEFBQUZsb1dRaForQUFBV1BCWkNGb29BQUJZOEZrSVdrQUFBRmp3V1FoYVdBQUFXUEJaQ0Zwd0FBQlphRmtJV1NBQUFGandXUWhhaUFBQVdQQlpDRnFnQUFCWThGa0lXcmdBQUZqd1dRaFpJQUFBV1BCWkNGclFBQUJZOEZrSVdTQUFBRnJvQUFCYkFBQUFXeGdBQUZzd0FBQlV1QUFBVzBnQUFGUzRBQUJiWUFBQVZMZ0FBRnQ0QUFCYmtBQUFXMGdBQUZTNEFBQmJxQUFBVkxnQUFGdElBQUJid0FBQVc5aGI4RnZBQUFCYjJGdndXOEFBQUZ3SVcvQmNJRnc0VzlnQUFGd2dYRGhjVUFBQVhDQmNPRnZZQUFCY0lGdzRYR2dBQUZ3Z1hEaGNnQUFBWENCY09GeVlBQUJjc0Z3NFhJQUFBRndnWERoY3lBQUFYQ0JjT0Z6Z0FBQmNJRnc0WFBnQUFGd2dYRGhkRUFBQVhDQmNPRnZZQUFCY3NGdzRXOWdBQUZ3Z1hEaGRLQUFBWENCY09GMUFBQUJjSUZ3NFhWZ0FBRndnWERoYjJBQUFYQ0JjT0Z2WUFBQmRjRjJJWGFBQUFGMjRBQUJkMEFBQVhlZ0FBRjRBQUFCZDZBQUFYZ0FBQUYzb0FBQmJZQUFBWGVnQUFGNFlBQUJkNkFBQVhqQUFBRjNvQUFCZUFBQUFYa2dBQUY1Z0FBQmVTQUFBWG5nQUFGNUlBQUJla0FBQVhxaGV3RjdZQUFCZXFGN0FYdGdBQUY2b1hzQmU4QUFBWHFoZXdGOElBQUJlcUY3QVh5QUFBRjZvWHNCZk9BQUFYcWhld0Y5UUFBQmVxRjdBWHRnQUFGOW9Yc0JlMkFBQVhxaGV3RitBQUFCZXFGN0FYNWdBQUYrd1hzQmZ5QUFBWHFoZXdGL2dBQUJlcUY3QVh0Z0FBRjZvWHNCZTJBQUFYL2dBQUdBUUFBQmYrQUFBWUJBQUFGLzRBQUJnS0FBQVgvZ0FBR0JBQUFCZ1dBQUFZSEFBQUdDSUFBQmdjQUFBWHFnQUFHQ2dZTGhlcUFBQVlOQmd1RjZvQUFCZ29HQzRZT2dBQUdDZ1lMaGVxQUFBWUtCZ3VHRUFBQUJoR0dFd1lVZ0FBR0ZnQUFCaGVBQUFXOWdBQUdGNEFBQmNVQUFBWVhnQUFGeG9BQUJWR0FBQVc5Z0FBR0Y0QUFCYjJBQUFZWkJocUdIQVlkaGhrR0dvWWZCaDJHR1FZYWhpQ0dIWVlaQmhxR0lnWWRoaGtHR29ZamhoMkdHUVlhaGlVR0hZWW1oaHFHSTRZZGhoa0dHb1lvQmgyR0dRWWFoaW1HSFlZWkJocUdLd1lkaGhrR0dvWXNoaDJHSm9ZYWhod0dIWVlaQmhxR0xnWWRoaGtHR29ZdmhoMkdHUVlhaGh3R0hZWVpCaHFHSHdZZGhpYUdHb1ljQmgyR0dRWWFoaTRHSFlZWkJocUdMNFlkaGhrR0dvWWNCaDJHR1FZYWhqRUdIWVlaQmhxR01vWWRoaGtHR29XOWhoMkdHUVlhaGh3R0hZWTBBQUFHTllBQUJqY0FBQVhnQUFBRnNZQUFCamlBQUFZNkFBQUdPNEFBQmowQUFBWStnQUFHUFFBQUJrQUFBQVk5QUFBR1FZQUFCa01BQUFZK2dBQUdSSUFBQmtZQUFBWkVnQUFHUjRBQUJrU0FBQVpKQUFBR1NvQUFCa1lBQUFaRWdBQUdUQUFBQmsyQUFBWkdBQUFHVHdBQUJsQ0FBQVpTQUFBR1U0WlZCbElBQUFaV2hsVUdVZ0FBQmxPR1ZRWllBQUFHVTRaVkJsbUFBQVpUaGxVR0Y0WmJCYjJHWElZWGhsc0dYZ1pjaGhlR1d3WmZobHlHRjRaYkJtRUdYSVlYaGxzRjRZWmNoaGVHV3daaWhseUdGNFpiQm1RR1hJWVhobHNHWllaY2hoZUdXd1puQmx5R0Y0WmJCbWlHWElacUJsc0Z2WVpjaGhlR1d3WnJobHlHRjRaYkJkUUdYSVlYaGxzRnZZWmNoaGVHV3daZUJseUdhZ1piQmIyR1hJWVhobHNHYTRaY2hoZUdXd1hVQmx5R0Y0WmJCYjJHWElZWGhsc0diUVpjaGhlR1d3WnVobHlHRjRaYkJiMkdYSVlYaGxzR2NBWmNoaGVHV3dXOWhseUdjWUFBQm5NQUFBWjBnQUFHZGdBQUJuU0FBQVozZ0FBR2RJQUFCbmtBQUFaMGdBQUdlb0FBQm5TQUFBWjhBQUFHUklBQUJuMkFBQVovQUFBR2dJQUFCbjhBQUFhQ0FBQUdmd0FBQm9PQUFBWi9BQUFHaFFBQUJvYUFBQWFBZ0FBR2Z3QUFCb2dBQUFaL0FBQUdpWUFBQm44QUFBYUxBQUFHZndBQUJvQ0FBQWFNZ0FBR2pnQUFCb3lBQUFhUGdBQUdqSUFBQnBFQUFBYU1nQUFHamdBQUJrOEFBQWFTZ0FBR2xBYVZocGNBQUFhVUJwV0dtSUFBQnBRR2xZYWFBQUFHbEFhVmhwdUFBQWFkQnBXR21nQUFCcFFHbFlhZWdBQUdsQWFWaHFBQUFBYVVCcFdHb1lBQUJwUUdsWWFqQUFBR2xBYVZocVNBQUFhVUJwV0dwZ0FBQnAwR2xZYWtnQUFHbEFhVmhxZUFBQWFVQnBXR3FRQUFCcFFHbFlhcWdBQUdsQWFWaHF3QUFBYWRCcFdHbHdBQUJwUUdsWWF0Z0FBR2xBYVZocThBQUFhVUJwV0dzSUFBQnBRR2xZYVhBQUFHbEFhVmhySUFBQWFVQnBXR3M0QUFCclVBQUFhMmdBQUd1QUFBQnJtQUFBVjdnQUFHdXdBQUJYdUFBQWE4Z0FBRmU0QUFCcjRBQUFhL2dBQUd1d0FBQlh1QUFBYkJBQUFGZTRBQUJyc0FBQWJDZ0FBR3hBQUFCc0tBQUFiRmdBQUd3b0FBQnNjQUFBYkNnQUFHeFlBQUJRT0d5SWJLQUFBRkE0Ykloc3VBQUFVRGhzaUd6UUFBQlFPR3lJYk9nQUFGQTRiSWh0QUFBQVVEaHNpRzBZQUFCdE1HeUliUUFBQUZBNGJJaHRTQUFBVURoc2lHMWdBQUJRT0d5SWJYZ0FBRkE0YklodGtBQUFVRGhzaUd5Z0FBQnRNR3lJYktBQUFGQTRiSWh0cUFBQVVEaHNpRzNBQUFCUU9HeUliZGdBQUZBNGJJaHNvQUFBVURoc2lHM3dBQUJ1Q0FBQWJpQUFBRzQ0QUFCdVVBQUFiamdBQUc1b0FBQnVPQUFBYm9BQUFHNDRBQUJ1bUFBQWJyQUFBRzVRQUFCdU9BQUFibEFBQUc3SUFBQnU0QUFBYnNnQUFHN2dBQUJ1eUFBQWJ2Z0FBR0VBYnhCdktBQUFZUUJ2RUc4b0FBQmhBRzhRYjBBQUFHRUFieEJ2V0FBQVlRQnZFRzl3QUFCaEFHOFFiNGdBQUdFQWJ4QnZvQUFBWVFCdkVHOG9BQUJ2dUc4UWJ5Z0FBR0VBYnhCdjBBQUFZUUJ2RUcvb0FBQndBRzhRY0JnQUFHRUFieEJ3TUFBQVlRQnZFRzhvQUFCaEFHOFFjRWdBQUhCZ0FBQndlQUFBY0dBQUFIQjRBQUJ3WUFBQWNKQUFBSEJnQUFCd3FBQUFhVUFBQUhEQUFBQncyQUFBY01BQUFHQllBQUJ3OEhFSVlGZ0FBSEVnY1FoZ1dBQUFjUEJ4Q0dDSUFBQnc4SEVJWUZnQUFIRHdjUWhkY0FBQWNUaHhVSEZvQUFCeGdBQUFjWmdBQUhHd0FBQnhtQUFBY2NnQUFIR1lBQUJ4NEFBQWNmZ0FBSEd3QUFCeG1BQUFjYkFBQUhHWUFBQnlFQUFBY2loeVFISlljbkJ5S0hKQWNvaHljSElvY2tCeW9ISndjaWh5UUhLNGNuQnlLSEpBY3RCeWNISW9ja0J5NkhKd2N3QnlRSExRY25CeUtISkFjeGh5Y0hJb2NrQnpNSEp3Y2loeVFITkljbkJ5S0hKQWMyQnljSE1BY2tCeVdISndjaWh5UUhONGNuQnlLSEpBYzVCeWNISW9ja0J5V0hKd2NpaHlRSEtJY25CekFISkFjbGh5Y0hJb2NrQnplSEp3Y2loeVFIT1FjbkJ5S0hKQWM2aHljSElvY2tCendISndjaWh5UUhQWWNuQnlLSEpBY2xoeWNISW9ja0J6cUhKd2MvQUFBSFFJQUFCTTJBQUFiS0FBQUhRZ0FBQjBPQUFBY2loeVFISlljbkIwVUFBQWRHZ0FBSFJRQUFCMGdBQUFkRkFBQUhTWUFBQjBzQUFBZEdnQUFIVElBQUIwNEFBQWRNZ0FBSFQ0QUFCMHlBQUFkUkFBQUhVb0FBQjA0QUFBZE1nQUFIVkFBQUIxV0FBQWRPQUFBSFZ3QUFCMWlBQUFkWEFBQUhXZ0FBQjFjQUFBZGJnQUFIWFFBQUIxaUFBQWRlZ0FBSFdJQUFCMkFIWVlidUIyTUhZQWRoaDJTSFl3ZGdCMkdIWmdkakIyQUhZWWRuaDJNSFlBZGhodStIWXdkZ0IyR0hhUWRqQjJBSFlZZHFoMk1IWUFkaGgyd0hZd2RnQjJHSGJZZGpCMkFIWVlkdkIyTUhjSWRoaHU0SFl3ZGdCMkdIY2dkakIyQUhZWWR6aDJNSFlBZGhodTRIWXdkZ0IyR0haSWRqQjNDSFlZYnVCMk1IWUFkaGgzSUhZd2RnQjJHSGM0ZGpCMkFIWVlkMUIyTUhZQWRoaDNhSFl3ZGdCMkdIZUFkakIyQUhZWWJ1QjJNSFlBZGhoM21IWXdkZ0IyR0hkUWRqQms4QUFBYVNnQUFIZXdBQUIzeUFBQWQ3QUFBSGZnQUFCM3NBQUFkL2dBQUhld0FBQjRFQUFBZDdBQUFIZ29BQUI0UUFBQWNNQUFBSGhZQUFCNGNBQUFlRmdBQUhpSUFBQjRXQUFBZUtBQUFIaFlBQUI0dUFBQWVOQUFBSGh3QUFCNFdBQUFlT2dBQUhoWUFBQjVBQUFBZUZnQUFIa1lBQUI0V0FBQWVUQUFBSGxJQUFCNVlBQUFlVWdBQUhsNEFBQjVTQUFBZVpBQUFIbElBQUI1WUFBQUFBZitBQUFBQUFmK1NBQUFBQWY5ZkFBQUFBZjk1QUFBQUFmOWhBQUFBQWY5NEFBQUFBZjlpQUFBQUFmOTlBQUFBQWY5bEFnd0FBZitGQWd3QUFmK2FBZ3dBQWY5R0Fnd0FBZjlFQWd3QUFmOXBBZ3dBQWY5bUFnd0FBZitNQWd3QUFmOWxBcndBQWYrRkFyc0FBZithQXJzQUFmOUdBcndBQWY5RUFyd0FBZjlxQXJ3QUFmOW1BcndBQWY3MUFyd0FBZjlwQXJ3QUFmNFpBZ3dBQWY5bEFwa0FBZjlnQWd3QUFmNlBBZ3dBQWY0T0FzY0FBUUZRQUFBQUFRSlRBQUFBQVFGUEFyd0FBUUZQQTNFQUFRRlBBMVlBQVFGUEErb0FBUUZRLzFZQUFRRlBBK3NBQVFGUEEvd0FBUUZQQS9JQUFRRkxBM0VBQVFGUEEzY0FBUUZQQTdJQUFRRlBBN01BQVFGUEE5OEFBUUZQQSs4QUFRRlBBeDhBQVFFcEEzRUFBUUZSQTRrQUFRRlBBMndBQVFGUEE1RUFBUUZQQTNVQUFRR3pBQUFBQVFIYkFyd0FBUUUvQUFBQUFRRS9BcndBQVFGdUFBQUFBUUYxQXJ3QUFRRjFBM0VBQVFGeEEzRUFBUUYxL3pBQUFRRjFBM2NBQVFGYkFBQUFBUUU2QXJ3QUFRRTJBM0VBQVFGSkFBQUFBUUlWQUFBQUFRRStBcndBQVFFK0EzRUFBUUUvQTFZQUFRRTZBM0VBQVFFK0EzY0FBUUUrQTdJQUFRRkovMVlBQVFFK0E3TUFBUUUrQTk4QUFRRStBKzhBQVFFK0F4OEFBUUVZQTNFQUFRRkJBNGtBQVFFK0Eyd0FBUUUrQTNVQUFRRU5BQUFBQVFFTkFyd0FBUUdGQUFBQUFRR0JBcndBQVFHQ0ExWUFBUUY5QTNFQUFRR0JBM2NBQVFHRi96Y0FBUUZzQXJ3QUFRRnNBM2NBQVFDRkFBQUFBUUNxQUFBQUFRQ0ZBcndBQVFIWkFBQUFBUUlkQXJ3QUFRQ0ZBM0VBQVFDRkExWUFBUUNCQTNFQUFRQ0ZBM2NBQVFDRkF4OEFBUUNGLzFZQUFRQmZBM0VBQVFDSEE0a0FBUUNGQTJ3QUFRQ0ZBM1VBQVFEUEFBQUFBUUVUQXJ3QUFRRVRBM0VBQVFFVEEzY0FBUUZOQUFBQUFRRk5BcndBQVFGTi96Y0FBUUVPQUFBQUFRQ0NBcndBQVFEZ0FkZ0FBUUVPL3pjQUFRRVpBQUFBQVFDTkFyd0FBUURyQWRnQUFRRzhBQUFBQVFHOEFyd0FBUUZ3QUFBQUFRRndBcndBQVFGd0EzRUFBUUZzQTNFQUFRRncvemNBQVFGd0EzVUFBUUdIQUFvQUFRR0ZBcndBQVFHRkFzZ0FBUUdGQTNFQUFRR0ZBMVlBQVFHQkEzRUFBUUdGQTNjQUFRR0ZBN0lBQVFHRi8xWUFBUUdGQTdNQUFRR0ZBOThBQVFHRkErOEFBUUdGQXg4QUFRRmZBM0VBQVFHSEE0a0FBUUdGQTNVQUFRR29BM0lBQVFHRkEyd0FBUUd2QUFBQUFRR3hBcndBQVFFakFBQUFBUUVqQXJ3QUFRRWdBQUFBQVFFZ0Fyd0FBUUU5QUFBQUFRRTVBcndBQVFFNUEzRUFBUUUxQTNFQUFRRTkvemNBQVFFZkFBQUFBUUVXQXJ3QUFRRVdBM0VBQVFFU0EzRUFBUUVsL3pBQUFRRVdBM2NBQVFFZi96Y0FBUUZRQXJ3QUFRRWlBQUFBQVFFb0Fyd0FBUUVrQTNFQUFRRW8vekFBQVFFaS96Y0FBUUZuQUFBQUFRR3ZBQUFBQVFGbkFyd0FBUUpwQXJ3QUFRRm5BM0VBQVFGbkExWUFBUUZqQTNFQUFRRm5BM2NBQVFGbkF4OEFBUUZuQTlRQUFRRkNBOVFBQVFGbkE4OEFBUUZuLzFZQUFRRkJBM0VBQVFGcEE0a0FBUUZuQTNVQUFRR0tBM0lBQVFGbkEyd0FBUUZuQTVFQUFRRkxBQUFBQVFGTEFyd0FBUUh5QUFBQUFRSHlBcndBQVFIeUEzRUFBUUh5QTNjQUFRSHlBeDhBQVFITUEzRUFBUUU3QUFBQUFRRTdBcndBQVFFckFBQUFBUUV5QXJ3QUFRRXlBM0VBQVFFeUEzY0FBUUV5QXg4QUFRRXIvMVlBQVFFTUEzRUFBUUUxQTRrQUFRRXlBMndBQVFFeUEzVUFBUUV1QTNFQUFRRUxBQUFBQVFJR0FBUUFBUUVVQWd3QUFRRVVBc0VBQVFFVUEwWUFBUUVMLzFZQUFRRVVBcVlBQVFEdkEwWUFBUUVJQTEwQUFRRVVBeGtBQVFFUUFzRUFBUUVVQXNjQUFRR05BekFBQVFGb0F6QUFBUUdCQTBVQUFRRVVBd3NBQVFFVUFxQUFBUUR1QXNFQUFRRVZBdGtBQVFFVUFyd0FBUUVVQXZNQUFRRzBBQUFBQVFITUFnd0FBUUV0QUFBQUFRQjdBdkFBQVFFa0Fnd0FBUUVrQXNFQUFRRWdBc0VBQVFFcS96QUFBUUVrQXNjQUFRRVlBQUFBQVFFbUFnd0FBUUg3QWd3QUFRRzJBcUlBQVFFY0FBQUFBUUY0QUFBQUFRRW1Bc0VBQVFFaUFzRUFBUUVtQXNjQUFRR2ZBekFBQVFFYy8xWUFBUUY2QXpBQUFRR1RBMFVBQVFFbUF3c0FBUUVtQXFBQUFRRUFBc0VBQVFFb0F0a0FBUUVtQXJ3QUFRRVJBQUFBQVFDL0Fnd0FBUUViQWd3QUFRQ3JBQUFBQVFDdUF2QUFBUUVuL3pJQUFRRW5BZ3dBQVFFbkFzY0FBUUVyQXRVQUFRRXFBQUFBQVFCNkF2QUFBUUNYQXFJQUFRQjZBNnNBQVFCN0FBQUFBUUNmQUFBQUFRQjZBZ3dBQVFCNkFzRUFBUUI2QXFZQUFRQjJBc0VBQVFCNkFzY0FBUUI2QXFBQUFRQjcvMVlBQVFCVUFzRUFBUUI4QXRrQUFRRnEveklBQVFGNkFnd0FBUUI2QXJ3QUFRQjEveklBQVFDRkFnd0FBUUNGQXNFQUFRQ0ZBc2NBQVFFR0FBQUFBUUIrQXZBQUFRRUMvemNBQVFCMEF2QUFBUUNlQWd3QUFRQjBBNlVBQVFCMy96Y0FBUUI5QUFBQUFRQjJBdkFBQVFDZ0Fnd0FBUUc5QUFBQUFRRzlBZ3dBQVFFbUFBQUFBUUVzQUFBQUFRSU1BQWtBQVFFc0Fnd0FBUUVzQWhrQUFRRXNBc0VBQVFFdEFxWUFBUUVwQXNFQUFRRXNBc2NBQVFHbEF6QUFBUUVzLzFZQUFRR0FBekFBQVFHWkEwVUFBUUVzQXdzQUFRRXRBcUFBQVFFR0FzRUFBUUV1QXRrQUFRRlBBc0lBQVFFc0Fyd0FBUUh4QUFBQUFRSDhBZ3dBQVFFbkFBQUFBUUV0QWd3QUFRRW9BQUFBQVFFb0Fnd0FBUUIvQUFBQUFRREtBZ3dBQVFES0FzRUFBUURHQXNFQUFRQjcvemNBQVFEN0FBQUFBUUR3QWd3QUFRRHhBc0VBQVFEdEFzRUFBUUVFL3pBQUFRRHdBc2NBQVFEMy96Y0FBUUVRQUFBQUFRRURBdkFBQVFEYUFBQUFBUUN0QXBJQUFRRFNBZ3dBQVFDbUFUY0FBUURpL3pBQUFRRFcvemNBQVFIckFBQUFBUUhCQWd3QUFRRW5Bc0VBQVFFbkFxWUFBUUVqQXNFQUFRRW5BcUFBQVFFbUEwOEFBUUVtQXBrQUFRRUJBMDhBQVFFbUEwa0FBUUVuLzFZQUFRRUJBc0VBQVFGS0FzSUFBUUVuQXJ3QUFRRW5Bdk1BQVFFREFBQUFBUUVEQWd3QUFRR0dBQUFBQVFGL0Fnd0FBUUYvQXNFQUFRRi9Bc2NBQVFGL0FxQUFBUUZaQXNFQUFRRDdBZ3dBQVFHTUFBQUFBUUVWQWd3QUFRRVZBc0VBQVFFV0FzY0FBUUVXQXFBQUFRR00vMVlBQVFEd0FzRUFBUUVYQXRrQUFRRVZBcndBQVFEdEFBQUFBUUQyQWd3QUFRRDJBc0VBQVFEekFzRUFBUUVRQWprQUFRRVdBQUFBQVFIdUFBQUFBUUVWQWprQUFRRVZBdTRBQVFFVkF0TUFBUUVWQTNNQUFRRVcvMVlBQVFEd0EzTUFBUUVKQTRnQUFRRVZBMHNBQVFFUkF1NEFBUUVWQXZRQUFRR09BMTBBQVFGcEExMEFBUUdDQTNJQUFRRVZBMGtBQVFFVkFzMEFBUUR2QXU0QUFRRVhBd1lBQVFFVkF1a0FBUUVWQXlBQUFRRVZBdklBQVFGY0FBQUFBUUc4QWprQUFRRVNBQUFBQVFFU0Fqa0FBUUV4QWprQUFRRXlBdTRBQVFFdUF1NEFBUUZBL3pBQUFRRXhBdlFBQVFFcEFBQUFBUUVVQWprQUFRQ1pBVEVBQVFFUUF1NEFBUUc5QUFBQUFRRU5BamtBQVFFTkF1NEFBUUVOQXRNQUFRRUpBdTRBQVFFTkF2UUFBUUdHQTEwQUFRRVovMVlBQVFGaEExMEFBUUVOQTF3QUFRRU5BemdBQVFFTkFzMEFBUURuQXU0QUFRRVBBd1lBQVFFTkF1a0FBUUVOQXZJQUFRRDFBQUFBQVFEMUFqa0FBUUU1QUFBQUFRRXlBamtBQVFFekF0TUFBUUV2QXU0QUFRRXlBdlFBQVFFMS96Y0FBUUUxQUFBQUFRRTFBamtBQVFFMUF2UUFBUUNoQUFBQUFRQitBamtBQVFCK0F1NEFBUUIrQXRNQUFRQjZBdTRBQVFCK0F2UUFBUUI5QXMwQUFRQjkvMVlBQVFCWUF1NEFBUUIvQXdZQUFRR3dBQUFBQVFIMEFqa0FBUUIrQXVrQUFRQjlBdklBQVFDMkFBQUFBUUQ2QWprQUFRRDZBdTRBQVFENkF2UUFBUUVUQWprQUFRRVMvemNBQVFDakFqa0FBUUROQVZVQUFRQ2pBdTRBQVFDdUFqa0FBUURZQVZVQUFRRjVBQUFBQVFGNUFqa0FBUUU4QUFBQUFRRkFBamtBQVFGQkF1NEFBUUU5QXU0QUFRRTQvemNBQVFGQUF2SUFBUUZIQUFBQUFRR2ZBQUFBQVFGSEFqa0FBUUZJQWtZQUFRRkhBdTRBQVFGSEF0TUFBUUZEQXU0QUFRRkhBdlFBQVFIQUExMEFBUUZILzFZQUFRR2JBMTBBQVFHMEEzSUFBUUZIQTBrQUFRRkhBczBBQVFFaEF1NEFBUUZKQXdZQUFRRkhBdklBQVFGcUF1OEFBUUZIQXVrQUFRRmtBQUFBQVFGOUFqa0FBUUQ5QUFBQUFRRDlBamtBQVFFTUFBQUFBUUVIQWprQUFRRUlBdTRBQVFFRUF1NEFBUUVJL3pjQUFRRHVBQUFBQVFEd0Fqa0FBUUR3QXU0QUFRRHNBdTRBQVFEei96QUFBUUR3QXZRQUFRRHEvemNBQVFFQ0FBQUFBUUVDQWprQUFRRUNBUzBBQVFEL0F1NEFBUUVJL3pBQUFRRCsvemNBQVFFeUFBQUFBUUZyQUFBQUFRSFBBamtBQVFFMUF1NEFBUUUxQXRNQUFRRXhBdTRBQVFFMUFzMEFBUUUxQTN3QUFRRTFBc1lBQVFFUUEzd0FBUUUxQTNZQUFRRXovMVlBQVFFUEF1NEFBUUUzQXdZQUFRRTFBdklBQVFGWUF1OEFBUUUxQXVrQUFRRTFBeUFBQVFHZ0FBQUFBUUdnQWprQUFRR2dBdTRBQVFHZ0F2UUFBUUdnQXMwQUFRRjZBdTRBQVFFVEFBQUFBUUVFQUFBQUFRRUFBamtBQVFFQUF1NEFBUUVBQXZRQUFRRUFBczBBQVFFRi8xWUFBUURhQXU0QUFRRUNBd1lBQVFFQUF1a0FBUUVBQXZJQUFRRDRBQUFBQVFFQkFqa0FBUUVCQXU0QUFRRCtBdTRBQVFha0Jyb0FBUUFNQURJQUNRQUFBRHdBQUFCQ0FBQUFTQUFBQUR3QUFBQk9BQUFBVkFBQUFEd0FBQUJhQUFBQVlBQUtBRUFBUmdCTUFGSUFRQUJZQUV3QVFBQmVBRXdBQWYrQUFBQUFBZitTQUFBQUFmOWZBQUFBQWY5NUFBQUFBZjloQUFBQUFmOTRBQUFBQWY5aUFBQUFBZitBLzFZQUFmK08vemNBQWY5by96QUFBUUNCL3pBQUFmOTUvemNBQWY5MC96Y0FBUVk4Qmw0QUFRQU1BT0lBTlFBQUFUb0FBQUZBQUFBQlJnQUFBVXdBQUFGU0FBQUJPZ0FBQVZnQUFBRmVBQUFCT2dBQUFWNEFBQUU2QUFBQlpBQUFBVmdBQUFGcUFBQUJjQUFBQVhZQUFBRjhBQUFCZ2dBQUFXb0FBQUdJQUFBQmpnQUFBV29BQUFHT0FBQUJhZ0FBQVpRQUFBR2FBQUFCWGdBQUFUb0FBQUZBQUFBQlJnQUFBVXdBQUFGU0FBQUJPZ0FBQVZnQUFBRmVBQUFCT2dBQUFWNEFBQUU2QUFBQm9BQUFBVmdBQUFFNkFBQUJPZ0FBQVRvQUFBRTZBQUFCcGdBQUFWNEFBQUZlQUFBQlhnQUFBVjRBQUFFNkFBQUJPZ0FBQVRvQUFBRTZBREVBMWdEY0FPSUE2QUR1QVBRQStnRUFBUVlBbEFFTUFSSUJHQUVlQVNRQktnRXdBVFlCUEFGQ0FVZ0JUZ0ZVQVZvQllBRm1BV3dCY2dGNEFYNEJoQUdLQVpBQTFnRGNBT0lBNkFEdUFQUUErZ0VBQVFZQWxBR1dBUklCbkFHaUFOQUJxQUFCLzJVQ0RBQUIvNFVDREFBQi81b0NEQUFCLzBZQ0RBQUIvMFFDREFBQi8ya0NEQUFCLzJZQ0RBQUIvNHdDREFBQi8yVUN2QUFCLzRVQ3V3QUIvNW9DdXdBQi8wWUN2QUFCLzBRQ3ZBQUIvMm9DdkFBQi8yWUN2QUFCL3ZVQ3ZBQUIvMmtDdkFBQi9oa0NEQUFCLzJVQ21RQUIvMlVDb0FBQi8zUUN3UUFCLzBZQ3dRQUIvMmNDd2dBQi8yVUN4d0FCLzJVQ3dRQUIvMllDcGdBQi8yVUM4d0FCLzJZQ3hRQUIvNDRDMlFBQi8ya0RCQUFCQUtrQ29BQUJBSThDd1FBQkFGMEN3UUFCQUtnQ3dnQUJBS3NDeHdBQkFLc0N3UUFCQUlrQzh3QUJBSnNDdkFBQi8yVURVQUFCLzNRRGNBQUIvMFlEY1FBQi8yY0RjZ0FCLzJVRGR3QUIvMmNEY1FBQi8yWURWZ0FCLzJVRGtRQUIvMllEZFFBQi8yVURiQUFCL3ZjRGlRQUIvMmtEdEFBQi8yY0NrUUFCL2hzQzJRQUIvMEFEVHdBQi8yVURUd0FCLzJVRFNRQUJBNndFR2dBQkFBd0E0Z0ExQUFBQTZBQUFBTzRBQUFEMEFBQUErZ0FBQVFBQUFBRG9BQUFCQmdBQUFRd0FBQURvQUFBQkRBQUFBT2dBQUFFU0FBQUJCZ0FBQVJnQUFBRWVBQUFCSkFBQUFTb0FBQUV3QUFBQkdBQUFBVFlBQUFFOEFBQUJHQUFBQVR3QUFBRVlBQUFCUWdBQUFVZ0FBQUVNQUFBQTZBQUFBTzRBQUFEMEFBQUErZ0FBQVFBQUFBRG9BQUFCQmdBQUFRd0FBQURvQUFBQkRBQUFBT2dBQUFGT0FBQUJCZ0FBQU9nQUFBRG9BQUFBNkFBQUFPZ0FBQUZVQUFBQkRBQUFBUXdBQUFFTUFBQUJEQUFBQU9nQUFBRG9BQUFBNkFBQUFPZ0FDQUNFQUlvQWtBQ1dBSndBb2dDb0FLNEFBZjlsQWd3QUFmK0ZBZ3dBQWYrYUFnd0FBZjlHQWd3QUFmOUVBZ3dBQWY5cEFnd0FBZjltQWd3QUFmK01BZ3dBQWY5bEFyd0FBZitGQXJzQUFmK2FBcnNBQWY5R0Fyd0FBZjlFQXJ3QUFmOXFBcndBQWY5bUFyd0FBZjcxQXJ3QUFmOXBBcndBQWY0WkFnd0FBZjlsQXBrQUFmOW5BMFlBQWY5Q0EwWUFBZjliQTEwQUFmOW5BeGtBQWYvZUF6QUFBZis1QXpBQUFmL1NBMFVBQWY5bEF3c0FBZ0FDQUFJQXVRQUFBaklDTXdDNEFBSUFBUUs1QXJ3QUFBQUJBQUlDN2dMN0FBRUFIQUkyQWpjQ09nSThBajBDUGdJL0FrUUNSZ0pIQWtnQ1NRSmdBbVFDWlFKcUFtNENid0owQW5nQ2VRSjlBb0lDZ3dLR0FvMENqd0tWQUFFQUNBS1lBcGtDbkFLZkFxQUNwUUszQXJnQUFnQWtBQllBRmdBQUFCa0FHUUFCQUNVQU53QUNBRDRBUVFBVkFFTUFUZ0FaQUZJQVV3QWxBRm9BWUFBbkFHOEFkQUF1QUhrQWVRQTBBSWtBalFBMUFKc0FvQUE2QUtZQTBRQkFBTk1BMlFCc0FOc0E3Z0J6QVBBQThBQ0hBUG9CRWdDSUFSUUJGQUNoQVJvQkdnQ2lBU29CTHdDakFUUUJOQUNwQVRnQk93Q3FBVU1CUndDdUFWVUJXZ0N6QVYwQlhRQzVBV0FCWlFDNkFXY0Jid0RBQVhRQmRRREpBWTRCamdETEFaQUJsUURNQVpvQnF3RFNBYlFCeFFEa0FkSUIyQUQyQWVjQjdBRDlBZkVCOFFFREFoRUNGZ0VFQWh3Q0lRRUtBQUlBQXdBQ0FGY0FBQUJaQUxrQVZnSXlBak1BdHdBQ0FBSUF1Z0VTQUFBQkZBRjFBRmtBQWdBQ0FYWUJ6d0FBQWRFQ0x3QmFBQUVBRXdLWUFwa0NuQUtnQXFVQ3BnS3BBcXNDclFLeEFySUNzd0swQXJrQ3VnSzdBcndDd1FMQ0FBRUFBZ0l3QWpFQUFnQUNBd0FERWdBQUF5QURVUUFUQUFJQUJRQUNBTmtBQUFEYkFSa0EyQUViQVhNQkZ3RjJBYXNCY0FHdEFpOEJwZ0FDQUFNRER3TVJBQUFETGdNd0FBTURRUU5EQUFZQUFRQUtBdzhERUFNUkF4NERMZ012QXpBRFFRTkNBME1BQWdBRkF3QURCQUFBQXdZRERRQUZBeUFETEFBTkF6SURQd0FhQTBVRFVRQW9BQUlBREFNQUF3QUFBQU1DQXdRQUFRTUdBdzBBQkFNVEF4TUFEQU1WQXhrQURRTWJBeHNBRWdNZEF4MEFFd01nQXlBQUZBTWlBeXdBRlFNeUF6TUFJQU0xQXo4QUlnTkZBMGdBTFFBQ0FBRURTZ05SQUFBQUFnQUFBQUlBR1FJM0FqY0FDUUk0QWpnQUJnSTVBamtBQlFJN0Fqc0FCd0k5QWowQUNnSkRBa01BQlFKRkFrVUFCd0pIQWtjQUNnSmlBbUlBQWdKakFtTUFBUUprQW1RQUJBSm5BbWNBQ0FKc0Ftd0FBZ0p0QW0wQUFRSnVBbTRBQkFKeEFuRUFDQUoyQW5ZQUFnSjNBbmNBQVFKNEFuZ0FCQUo3QW5zQUNBS0FBb0FBQWdLQkFvRUFBUUtDQW9JQUJBS0ZBb1VBQ0FLVkFwVUFBd0FDQUJvQ05nSTJBQWNDTndJM0FBSUNQQUk4QUFzQ1BRSTlBQW9DUGdJK0FBZ0NQd0kvQUFrQ1JnSkdBQXNDUndKSEFBb0NTQUpJQUFnQ1NRSkpBQWtDWUFKZ0FBWUNaQUprQUF3Q1pRSmxBQVFDYWdKcUFBWUNiZ0p1QUF3Q2J3SnZBQVFDZEFKMEFBWUNlQUo0QUF3Q2VRSjVBQVFDZlFKOUFBWUNnZ0tDQUF3Q2d3S0RBQVFDaGdLR0FBRUNqUUtOQUFRQ2p3S1BBQU1DbFFLVkFBVUFBZ0FXQWpBQ01BQUJBakVDTVFBQ0FtSUNZZ0FEQW1RQ1pBQUdBbVVDWlFBRUFtWUNaZ0FGQW13Q2JBQURBbTRDYmdBR0FtOENid0FFQW5BQ2NBQUZBbllDZGdBREFuZ0NlQUFHQW5rQ2VRQUVBbm9DZWdBRkFvQUNnQUFEQW9JQ2dnQUdBb01DZ3dBRUFvUUNoQUFGQW9ZQ2hnQUlBbzBDalFBRUF1NEM3Z0FIQXZzQyt3QUhBQUlBQkFLZkFwOEFBUUtnQXFBQUFnS2xBcVVBQkFLM0FyZ0FBd0FDQUFzQ21BS1pBQU1DbkFLY0FBTUNud0tmQUFjQ29BS2dBQVlDcFFLbEFBa0NxZ0txQUFVQ3F3S3JBQUVDdHdLNEFBZ0N1UUs1QUFRQ3V3SzdBQVFDdndLL0FBSUFBZ0FqQUJrQUdRQURBQm9BR2dBQkFCc0FJQUFDQUNFQUpBQUtBQ1VBTmdBREFEY0FOd0FFQURnQVBRQUZBRDRBUVFBR0FFSUFRZ0FIQUVNQVRnQUdBRThBVVFBSEFGSUFVd0FJQUZRQVZ3QUpBRmtBV1FBSkFGb0FZQUFHQUdFQWJnQUtBRzhBZEFBV0FIVUFlQUFLQUhrQWVRQURBSG9BZXdBTEFId0FmQUFLQUgwQWdBQU1BSUVBaGdBTkFJY0Fod0FCQUlnQWlBQUtBSWtBalFBT0FJNEFtZ0FQQUpzQW9BQVFBS0VBcFFBUEFLWUFwZ0FSQUtjQXF3QVNBS3dBckFBVEFLMEF0UUFVQUxZQXVRQVZBak1DTXdBS0FBSUFYd0FDQUJrQUlnQWFBQm9BSndBYkFDQUFBUUFoQURjQUp3QTRBRDBBQVFBK0FFNEFKd0JQQUZFQUZBQlNBR0FBSndCaEFIa0FBUUI2QUhzQUp3QjhBSHdBQVFCOUFJQUFKd0NCQUlZQUpBQ0hBSWNBSndDSUFJZ0FBUUNKQUkwQUFnQ09BS1VBQXdDbUFLWUFCQUNuQUtzQUJRQ3NBS3dBRlFDdEFMVUFCZ0MyQUxrQU1BQzZBTkVBRmdEU0FOSUFHQURUQU84QUN3RHdBUEFBRndEeEFQWUFDd0QzQVBrQUdBRDZBUWdBR1FFSkFRd0FDUUVOQVJRQUdBRVZBUnNBR2dFY0FUUUFDd0UxQVRVQUhBRTJBVFlBR0FFM0FUY0FDd0U0QVRzQUdnRThBVUVBSGdGQ0FVSUFHQUZEQVVjQURRRklBVjhBR2dGZ0FXVUFFQUZtQVdZQUh3Rm5BVzhBRWdGd0FYTUFJQUYwQVhVQUZ3RjJBWFlBSlFGM0FZNEFJd0dQQVk4QUpRR1FBWlVBR3dHV0Fhc0FKUUdzQWF3QUd3R3RBYTBBSlFHdUFiTUFHd0cwQWNVQUpRSEdBY2tBQ2dIS0FkZ0FKUUhaQWZFQUd3SHlBZk1BSlFIMEFmUUFHd0gxQWZnQUpRSDVBZjRBS1FIL0FnTUFEZ0lFQWhzQUR3SWNBaUVBRVFJaUFpSUFLZ0lqQWlzQUV3SXNBaThBTEFJeUFqSUFJZ0l6QWpNQUFRSTBBalFBSEFJOUFqMEFPQUpIQWtjQU9BS1lBcGtBSVFLYUFwc0FMUUtjQXB3QUlRS2ZBcDhBTmdLakFxTUFLd0tsQXFVQUpnS21BcVlBQ0FLcUFxb0FMd0tzQXF3QU1RS3RBcTBBTWdLdUFxNEFMZ0t2QXE4QU5BS3dBckFBTlFLeEFyUUFLQUsyQXJZQU13SzVBcmtBREFLNkFyb0FIUUs3QXJzQURBSzhBcndBSFFMQ0FzSUFOd0x1QXU0QUJ3TDdBdnNBQndBQ0FDc0EwUURSQUFJQTBnRFNBQXdBMHdEWUFBRUEyUURaQUFrQTJnRGFBQXdBMndEYkFBb0EzQURjQUFrQTNRRHVBQUlBN3dEdkFBd0E4QUR3QUFNQThRRDJBQVFBOXdENUFBc0ErZ0VFQUFZQkJRRUZBQWNCQmdFSUFBWUJDUUVNQUFjQkRRRU9BQWdCRHdFUUFBa0JFUUVSQUFvQkVnRVNBQWtCRkFFVUFBa0JGUUVaQUFzQkdnRWFBQWNCR3dFYkFBc0JIQUVwQUF3QktnRXZBQlVCTUFFekFBd0JOQUUwQUFJQk5RRTJBQXdCTndFM0FBMEJPQUU3QUE0QlBBRkJBQThCUWdGQ0FBVUJRd0ZIQUJBQlNBRlVBQXNCVlFGYUFCRUJXd0ZmQUFzQllBRmxBQklCWmdGbUFCTUJad0Z2QUJJQmNBRnpBQlFCZEFGMEFBWUJkUUYxQUFrQUFnQXhBSWtBalFBQkFLWUFwZ0FQQUxvQTBRQU5BTklBMGdBUUFOTUE3d0FEQVBBQThBQUpBUEVBOWdBREFQY0ErUUFRQVBvQkNBQUtBUWtCREFBQ0FRMEJGQUFRQVJVQkd3QWVBUndCTkFBREFUVUJOUUFoQVRZQk5nQVFBVGNCTndBREFUZ0JPd0FlQVR3QlFRQVVBVUlCUWdBUUFVTUJSd0FNQVVnQlh3QWVBV0FCWlFBRkFXWUJaZ0FHQVdjQmJ3QUhBWEFCY3dBSUFYUUJkUUFKQWpRQ05BQWhBcGdDbVFBVEFwd0NuQUFUQXAwQ25RQWNBcDhDbndBWkFxTUNvd0FiQXFVQ3BRQVZBcVlDcGdBV0Fxb0NxZ0FZQXF3Q3JBQVJBcTBDclFBWEFxNENyZ0FTQXE4Q3J3QWZBclVDdFFBaUFyWUN0Z0FkQXJrQ3VRQUVBcm9DdWdBYUFyc0N1d0FFQXJ3Q3ZBQWFBc0VDd1FBZ0FzSUN3Z0FMQXU0QzdnQU9BdnNDK3dBT0FBSUFId0YyQVhZQUFRR09BWTRBQXdHUEFZOEFBUUdRQVpVQUFnR1dBWmtBQ2dHYUFhc0FBd0dzQWF3QUNnR3RBYTBBQkFHdUFiTUFCUUcwQWNVQUJnSEdBY2tBQndIS0Fjc0FDQUhNQWM4QUNRSFJBZEVBQ1FIU0FkZ0FCZ0haQWVZQUNnSG5BZXdBRlFIdEFmQUFDZ0h4QWZFQUF3SHlBZk1BQ3dIMEFmUUFDZ0gxQWZnQURBSDVBZjRBRFFIL0FnTUFEZ0lFQWhBQUR3SVJBaFlBRUFJWEFoc0FEd0ljQWlFQUVRSWlBaUlBRWdJakFpc0FFd0lzQWk4QUZBQUNBRUFBR2dBYUFBb0FHd0FnQUFFQUlRQTNBQW9BT0FBOUFBRUFQZ0JPQUFvQVVnQmdBQW9BWVFCNUFBRUFlZ0I3QUFvQWZBQjhBQUVBZlFDQUFBb0Fod0NIQUFvQWlBQ0lBQUVBaVFDTkFBc0FwZ0NtQUF3QXJRQzFBQTBBMHdEdkFCRUE4UUQyQUJFQkZRRWJBQkFCSEFFMEFCRUJOd0UzQUJFQk9BRTdBQkFCU0FGZkFCQUJZQUZsQUJJQlp3RnZBQk1CY0FGekFCUUJkZ0YyQUIwQmR3R09BQTRCandHUEFCMEJrQUdWQUFJQmxnR3JBQjBCckFHc0FBSUJyUUd0QUIwQnJnR3pBQUlCdEFIRkFCMEJ4Z0hKQUE4QnlnSFlBQjBCMlFIeEFBSUI4Z0h6QUIwQjlBSDBBQUlCOVFINEFCMEIrUUgrQUFNQi93SURBQVFDQkFJYkFBVUNIQUloQUFZQ0lnSWlBQWNDSXdJckFBZ0NMQUl2QUFrQ013SXpBQUVDbUFLWkFCVUNuQUtjQUJVQ253S2ZBQ0FDb3dLakFCc0NwQUtrQUI0Q3BnS21BQmNDcWdLcUFCb0NyQUtzQUJZQ3JRS3RBQmdDcmdLdUFCa0N1Z0s2QUNJQ3ZBSzhBQ0lDd1FMQkFDRUN3Z0xDQUNNQ3hBTEVBQjhDeFFMRkFCd0FBZ0FVQUFJQUdRQUJBQnNBSUFBQ0FEZ0FQUUFDQUU4QVVRQU1BR0VBZVFBQ0FId0FmQUFDQUlnQWlBQUNBSWtBalFBTkFLWUFwZ0FEQUtjQXF3QUVBS3dBckFBRkFLMEF0UUFHQUxZQXVRQUhBUWtCREFBT0FUd0JRUUFJQVdBQlpRQUpBV1lCWmdBS0FYQUJjd0FMQWpJQ01nQUJBak1DTXdBQ0FBSUFEZ0tZQXBrQUJBS2NBcHdBQkFLZ0FxQUFCUUtsQXFVQUNRS21BcVlBQ2dLcEFxa0FBd0t0QXEwQUFRS3hBclFBQWdLNUFya0FCd0s2QXJvQUNBSzdBcnNBQndLOEFyd0FDQUxCQXNFQUJnTENBc0lBQ3dBQ0FDa0FBZ0FaQUFNQUd3QWdBQVlBT0FBOUFBWUFUd0JSQUJRQVlRQjVBQVlBZkFCOEFBWUFpQUNJQUFZQWlRQ05BQVFBcGdDbUFBVUFyQUNzQUJFQXJRQzFBQWNBdGdDNUFCSUF1Z0RSQUJVQTB3RHZBQWtBOEFEd0FBRUE4UUQyQUFrQkNRRU1BQUlCRlFFYkFCWUJIQUUwQUFrQk53RTNBQWtCT0FFN0FCWUJQQUZCQUJjQlF3RkhBQmtCU0FGZkFCWUJZQUZsQUEwQlp3RnZBQk1CZEFGMUFBRUJkd0dPQUJnQmtBR1ZBQW9CckFHc0FBb0JyZ0d6QUFvQnhnSEpBQWdCMlFIeEFBb0I5QUgwQUFvQi93SURBQXdDSEFJaEFBNENJZ0lpQUE4Q0l3SXJBQkFDTVFJeEFBc0NNZ0l5QUFNQ013SXpBQVlBQVFJeEFBRUFBUUFDQUFJQ1BRSTlBQUVDUndKSEFBRUFBQUFCQUFBQUNnSWdDNm9BQWtSR1RGUUFEbXhoZEc0QU9nQUVBQUFBQVAvL0FCRUFBQUFMQUJZQUlRQXNBRGNBUWdCTkFHRUFiQUIzQUlJQWpRQ1lBS01BcmdDNUFEb0FDVUZhUlNBQVlrTkJWQ0FBakVOU1ZDQUF0a3RCV2lBQTRFMVBUQ0FCQ2s1TVJDQUJORkpQVFNBQlhsUkJWQ0FCaUZSU1N5QUJzZ0FBLy84QUVRQUJBQXdBRndBaUFDMEFPQUJEQUU0QVlnQnRBSGdBZ3dDT0FKa0FwQUN2QUxvQUFQLy9BQklBQWdBTkFCZ0FJd0F1QURrQVJBQlBBRmdBWXdCdUFIa0FoQUNQQUpvQXBRQ3dBTHNBQVAvL0FCSUFBd0FPQUJrQUpBQXZBRG9BUlFCUUFGa0FaQUJ2QUhvQWhRQ1FBSnNBcGdDeEFMd0FBUC8vQUJJQUJBQVBBQm9BSlFBd0FEc0FSZ0JSQUZvQVpRQndBSHNBaGdDUkFKd0Fwd0N5QUwwQUFQLy9BQklBQlFBUUFCc0FKZ0F4QUR3QVJ3QlNBRnNBWmdCeEFId0Fod0NTQUowQXFBQ3pBTDRBQVAvL0FCSUFCZ0FSQUJ3QUp3QXlBRDBBU0FCVEFGd0Fad0J5QUgwQWlBQ1RBSjRBcVFDMEFMOEFBUC8vQUJJQUJ3QVNBQjBBS0FBekFENEFTUUJVQUYwQWFBQnpBSDRBaVFDVUFKOEFxZ0MxQU1BQUFQLy9BQklBQ0FBVEFCNEFLUUEwQUQ4QVNnQlZBRjRBYVFCMEFIOEFpZ0NWQUtBQXF3QzJBTUVBQVAvL0FCSUFDUUFVQUI4QUtnQTFBRUFBU3dCV0FGOEFhZ0IxQUlBQWl3Q1dBS0VBckFDM0FNSUFBUC8vQUJJQUNnQVZBQ0FBS3dBMkFFRUFUQUJYQUdBQWF3QjJBSUVBakFDWEFLSUFyUUM0QU1NQXhHRmhiSFFFbW1GaGJIUUVvbUZoYkhRRXFtRmhiSFFFc21GaGJIUUV1bUZoYkhRRXdtRmhiSFFFeW1GaGJIUUUwbUZoYkhRRTJtRmhiSFFFNG1GaGJIUUU2bU15YzJNRThtTXljMk1FK0dNeWMyTUUvbU15YzJNRkJHTXljMk1GQ21NeWMyTUZFR015YzJNRkZtTXljMk1GSEdNeWMyTUZJbU15YzJNRktHTXljMk1GTG1OaGMyVUZOR05oYzJVRk9tTmhjMlVGUUdOaGMyVUZSbU5oYzJVRlRHTmhjMlVGVW1OaGMyVUZXR05oYzJVRlhtTmhjMlVGWkdOaGMyVUZhbU5oYzJVRmNHTmpiWEFGZG1OamJYQUZmbU5qYlhBRmhtTmpiWEFGam1OamJYQUZsbU5qYlhBRm5tTmpiWEFGcG1OamJYQUZybU5qYlhBRnRtTmpiWEFGdm1OamJYQUZ4bVJ1YjIwRnptUnViMjBGMUdSdWIyMEYybVJ1YjIwRjRHUnViMjBGNW1SdWIyMEY3R1J1YjIwRjhtUnViMjBGK0dSdWIyMEYvbVJ1YjIwR0JHUnViMjBHQ21aeVlXTUdFR1p5WVdNR0dtWnlZV01HSkdaeVlXTUdMbVp5WVdNR09HWnlZV01HUW1aeVlXTUdUR1p5WVdNR1ZtWnlZV01HWUdaeVlXTUdhbVp5WVdNR2RHeHBaMkVHZm14cFoyRUdoR3hwWjJFR2lteHBaMkVHa0d4cFoyRUdsbXhwWjJFR25HeHBaMkVHb214cFoyRUdxR3hwWjJFR3JteHBaMkVHdEd4cFoyRUd1bXh1ZFcwR3dHeHVkVzBHeG14dWRXMEd6R3h1ZFcwRzBteHVkVzBHMkd4dWRXMEczbXh1ZFcwRzVHeHVkVzBHNm14dWRXMEc4R3h1ZFcwRzlteHVkVzBHL0d4dlkyd0hBbXh2WTJ3SENHeHZZMndIRG14dlkyd0hGR3h2WTJ3SEdteHZZMndISUd4dlkyd0hKbXh2WTJ3SExHeHZZMndITW01MWJYSUhPRzUxYlhJSFBtNTFiWElIUkc1MWJYSUhTbTUxYlhJSFVHNTFiWElIVm01MWJYSUhYRzUxYlhJSFltNTFiWElIYUc1MWJYSUhibTUxYlhJSGRHOXVkVzBIZW05dWRXMEhnRzl1ZFcwSGhtOXVkVzBIakc5dWRXMEhrbTl1ZFcwSG1HOXVkVzBIbm05dWRXMEhwRzl1ZFcwSHFtOXVkVzBIc0c5dWRXMEh0bTl5Wkc0SHZHOXlaRzRId205eVpHNEh5Rzl5Wkc0SHptOXlaRzRIMUc5eVpHNEgybTl5Wkc0SDRHOXlaRzRINW05eVpHNEg3Rzl5Wkc0SDhtOXlaRzRIK0hCdWRXMEgvbkJ1ZFcwSUJIQnVkVzBJQ25CdWRXMElFSEJ1ZFcwSUZuQnVkVzBJSEhCdWRXMElJbkJ1ZFcwSUtIQnVkVzBJTG5CdWRXMElOSEJ1ZFcwSU9uTnBibVlJUUhOcGJtWUlSbk5wYm1ZSVRITnBibVlJVW5OcGJtWUlXSE5wYm1ZSVhuTnBibVlJWkhOcGJtWUlhbk5wYm1ZSWNITnBibVlJZG5OcGJtWUlmSE50WTNBSWduTnRZM0FJaUhOdFkzQUlqbk50WTNBSWxITnRZM0FJbW5OdFkzQUlvSE50WTNBSXBuTnRZM0FJckhOdFkzQUlzbk50WTNBSXVITnRZM0FJdm5OMVluTUl4SE4xWW5NSXluTjFZbk1JMEhOMVluTUkxbk4xWW5NSTNITjFZbk1JNG5OMVluTUk2SE4xWW5NSTduTjFZbk1JOUhOMVluTUkrbk4xWW5NSkFITjFjSE1KQm5OMWNITUpESE4xY0hNSkVuTjFjSE1KR0hOMWNITUpIbk4xY0hNSkpITjFjSE1KS25OMWNITUpNSE4xY0hNSk5uTjFjSE1KUEhOMWNITUpRblJ1ZFcwSlNIUnVkVzBKVG5SdWRXMEpWSFJ1ZFcwSlduUnVkVzBKWUhSdWRXMEpablJ1ZFcwSmJIUnVkVzBKY25SdWRXMEplSFJ1ZFcwSmZuUnVkVzBKaEFBQUFBSUFBQUFCQUFBQUFnQUFBQUVBQUFBQ0FBQUFBUUFBQUFJQUFBQUJBQUFBQWdBQUFBRUFBQUFDQUFBQUFRQUFBQUlBQUFBQkFBQUFBZ0FBQUFFQUFBQUNBQUFBQVFBQUFBSUFBQUFCQUFBQUFnQUFBQUVBQUFBQkFCb0FBQUFCQUJvQUFBQUJBQm9BQUFBQkFCb0FBQUFCQUJvQUFBQUJBQm9BQUFBQkFCb0FBQUFCQUJvQUFBQUJBQm9BQUFBQkFCb0FBQUFCQUJvQUFBQUJBQndBQUFBQkFCd0FBQUFCQUJ3QUFBQUJBQndBQUFBQkFCd0FBQUFCQUJ3QUFBQUJBQndBQUFBQkFCd0FBQUFCQUJ3QUFBQUJBQndBQUFBQkFCd0FBQUFDQUFJQUF3QUFBQUlBQWdBREFBQUFBZ0FDQUFNQUFBQUNBQUlBQXdBQUFBSUFBZ0FEQUFBQUFnQUNBQU1BQUFBQ0FBSUFBd0FBQUFJQUFnQURBQUFBQWdBQ0FBTUFBQUFDQUFJQUF3QUFBQUlBQWdBREFBQUFBUUFSQUFBQUFRQVJBQUFBQVFBUkFBQUFBUUFSQUFBQUFRQVJBQUFBQVFBUkFBQUFBUUFSQUFBQUFRQVJBQUFBQVFBUkFBQUFBUUFSQUFBQUFRQVJBQUFBQXdBU0FCTUFGQUFBQUFNQUVnQVRBQlFBQUFBREFCSUFFd0FVQUFBQUF3QVNBQk1BRkFBQUFBTUFFZ0FUQUJRQUFBQURBQklBRXdBVUFBQUFBd0FTQUJNQUZBQUFBQU1BRWdBVEFCUUFBQUFEQUJJQUV3QVVBQUFBQXdBU0FCTUFGQUFBQUFNQUVnQVRBQlFBQUFBQkFCMEFBQUFCQUIwQUFBQUJBQjBBQUFBQkFCMEFBQUFCQUIwQUFBQUJBQjBBQUFBQkFCMEFBQUFCQUIwQUFBQUJBQjBBQUFBQkFCMEFBQUFCQUIwQUFBQUJBQllBQUFBQkFCWUFBQUFCQUJZQUFBQUJBQllBQUFBQkFCWUFBQUFCQUJZQUFBQUJBQllBQUFBQkFCWUFBQUFCQUJZQUFBQUJBQllBQUFBQkFCWUFBQUFCQUFzQUFBQUJBQVFBQUFBQkFBb0FBQUFCQUFjQUFBQUJBQVlBQUFBQkFBd0FBQUFCQUFVQUFBQUJBQWdBQUFBQkFBa0FBQUFCQUJBQUFBQUJBQkFBQUFBQkFCQUFBQUFCQUJBQUFBQUJBQkFBQUFBQkFCQUFBQUFCQUJBQUFBQUJBQkFBQUFBQkFCQUFBQUFCQUJBQUFBQUJBQkFBQUFBQkFCa0FBQUFCQUJrQUFBQUJBQmtBQUFBQkFCa0FBQUFCQUJrQUFBQUJBQmtBQUFBQkFCa0FBQUFCQUJrQUFBQUJBQmtBQUFBQkFCa0FBQUFCQUJrQUFBQUJBQlVBQUFBQkFCVUFBQUFCQUJVQUFBQUJBQlVBQUFBQkFCVUFBQUFCQUJVQUFBQUJBQlVBQUFBQkFCVUFBQUFCQUJVQUFBQUJBQlVBQUFBQkFCVUFBQUFCQUJjQUFBQUJBQmNBQUFBQkFCY0FBQUFCQUJjQUFBQUJBQmNBQUFBQkFCY0FBQUFCQUJjQUFBQUJBQmNBQUFBQkFCY0FBQUFCQUJjQUFBQUJBQmNBQUFBQkFBNEFBQUFCQUE0QUFBQUJBQTRBQUFBQkFBNEFBQUFCQUE0QUFBQUJBQTRBQUFBQkFBNEFBQUFCQUE0QUFBQUJBQTRBQUFBQkFBNEFBQUFCQUE0QUFBQUJBQnNBQUFBQkFCc0FBQUFCQUJzQUFBQUJBQnNBQUFBQkFCc0FBQUFCQUJzQUFBQUJBQnNBQUFBQkFCc0FBQUFCQUJzQUFBQUJBQnNBQUFBQkFCc0FBQUFCQUEwQUFBQUJBQTBBQUFBQkFBMEFBQUFCQUEwQUFBQUJBQTBBQUFBQkFBMEFBQUFCQUEwQUFBQUJBQTBBQUFBQkFBMEFBQUFCQUEwQUFBQUJBQTBBQUFBQkFBOEFBQUFCQUE4QUFBQUJBQThBQUFBQkFBOEFBQUFCQUE4QUFBQUJBQThBQUFBQkFBOEFBQUFCQUE4QUFBQUJBQThBQUFBQkFBOEFBQUFCQUE4QUFBQUJBQmdBQUFBQkFCZ0FBQUFCQUJnQUFBQUJBQmdBQUFBQkFCZ0FBQUFCQUJnQUFBQUJBQmdBQUFBQkFCZ0FBQUFCQUJnQUFBQUJBQmdBQUFBQkFCZ0FJd0JJQUZBQVdBQm1BSEFBZWdDQ0FJb0FrZ0NhQUtJQXFnQ3lBTDRBeGdET0FOWUEzZ0RtQU80QTlnRUFBUW9CRWdFYUFTSUJLZ0V5QVRvQlFnRktBVklCV2dGaUFXb0FBUUFBQUFFRzRBQURBQUFBQVFuYUFBWUFBQUFFQVJvQkxBRkFBVklBQmdBQUFBSUJWZ0ZvQUFZQUFBQUNBWEFCaEFBQkFBQUFBUUdPQUFFQUFBQUJBWlFBQVFBQUFBRUJtZ0FCQUFBQUFRR1lBQUVBQUFBQkFaWUFBUUFBQUFFQmxBQUJBQUFBQVFHU0FBWUFBQUFEQVpBQm9nR3dBQUVBQUFBQkFiWUFBUUFBQUFFQnRBQUJBQUFBQVFHeUFBRUFBQUFCQWNRQUFRQUFBQUVCd2dBQkFBQUFBUUhBQUFFQUFBQUJBYjRBQmdBQUFBSUJ2QUhPQUFZQUFBQUNBZFlCNkFBQkFBQUFBUUh3QUFFQUFBQUJBZ1lBQVFBQUFBRUNCQUFCQUFBQUFRSUNBQUVBQUFBQkFpd0FBUUFBQUFFRDZBQUJBQUFBQVFXbUFBUUFDQUFCQmN3QUFRQUFBQUVMZkFBQkFBQUFBUXVpQUFFQUFBQUJDNkFBQVFBQUFBRUxwQUFCQUFBQUFRdWlBQU1BQUFBQkM2Z0FBUXV3QUFFQUFBQWVBQU1BQUFBQkM1WUFBZ3V1QzU0QUFRQUFBQjRBQXdBQkM2WUFBUXVtQUFBQUFRQUFBQjRBQXdBQkM2UUFBUXVVQUFBQUFRQUFBQjRBQXdBQUFBRUxnZ0FCQzZJQUFRQUFBQjRBQXdBQkM1QUFBUXR3QUFBQUFRQUFBQjRBQXdBQkM0Z0FBUXVPQUFFTGlBQUJBQUFBSHdBREFBRUxnQUFCQzNvQUFRdUFBQUVBQUFBZ0FBSUxjZ0FFQUlZQWpRRkJBVWNBQWd0a0FBUUFoZ0NOQVVFQlJ3QUJDMklBQndBQkMxd0FCd0FCQzFZQUJ3QUJDMUFBQndBQkMwb0FCd0FEQUFFTFNnQUJDMUFBQUFBQkFBQUFJQUFEQUFBQUFRdEVBQUVMU2dBQUFBTUFBUXRTQUFFTE5nQUFBQUVBQUFBZ0FBRUxSZ0FvQUFFTFFBQW9BQUlMT2dBS0FuOENmQUo5QW40Q2dBS0JBb0lDZ3dLRUFvVUFBUXNnQUR3QUFRc2FBRElBQVFzZS8rRUFBUXNPQUR3QUF3QUJDeGdBQVFzZUFBQUFBUUFBQUNFQUF3QUJDeFlBQVFzTUFBQUFBUUFBQUNFQUF3QUJDdVFBQVFzT0FBQUFBUUFBQUNJQUF3QUJDdElBQVFzRUFBQUFBUUFBQUNJQUFncjZBQXdDTmdJM0FqZ0NPUUk2QWpzQ1BBSTlBajRDUHdMTUFzNEFBUXJzLyt3QUFRcndBQlFBQWdyMEFCWUNRQUpCQWtJQ1F3SkVBa1VDUmdKSEFrZ0NTUUpVQWxVQ1ZnSlhBbGdDV1FKYUFsc0NYQUpkQXRNQzFBQUNDdDRBM3dGM0FYZ0JlUUY2QVhzQmZBRjlBWDRCZndHQUFZRUJnZ0dEQVlRQmhRR0dBWWNCaUFHSkFZb0Jpd0dNQVkwQmpnR1BBWkFCa1FHU0FaTUJsQUdWQVpZQmx3R1lBWmtCbWdHYkFad0JuUUdlQVo4Qm9BR2hBYUlCb3dHa0FhVUJwZ0duQWFnQnFRR3FBYXNCclFHdUFhOEJzQUd4QWJJQnN3RzBBYlVCdGdHM0FjSUJ1UUc2QWJzQnZBRzlBYjRCdndIQUFjRUJ3d0hFQWNVQnhnSElBY2tCeWdITEFjd0J6UUhPQWM4QjBBSFJBZElCMHdIVUFkVUIxZ0hYQWRnQjJRSGFBZHNCM0FIZEFkNEIzd0hnQWVFQjRnSGpBZVFCNVFIbUFlY0I2QUhwQWVvQjZ3SHNBZTBCN2dIdkFmQUI4UUh5QWZNQjlBSDFBZllCOXdINEFma0IrZ0g3QWZ3Qi9RSCtBWFlCckFIL0FnQUNBUUlDQWdNQ0JBSUZBZ1lDQndJSUFna0NDZ0lMQWd3Q0RRSU9BZzhDRUFJUkFoSUNFd0lVQWhVQ0ZnSVhBaGdDR1FJYUFoc0NIQUlkQWg0Q0h3SWdBaUVDSWdJakFpUUNKUUltQWljQ0tBSXBBaW9DS3dJc0FpMENMZ0l2QW80Q2p3S1FBcEVDa2dLVEFwUUNsUUtXQXBjQ3hRTEdBc2NDeUFMSkFzTUN4QUw5QXY0Qy93TDhBek1ETkFNMUF6WUROd000QXprRE9nTTdBendEUFFNK0F6OERRQU5CQTBJRFF3TkVBQUlKV2dEZ0FYY0JlQUY1QVhvQmV3RjhBWDBCZmdGL0FZQUJnUUdDQVlNQmhBR0ZBWVlCaHdHSUFZa0JpZ0dMQVl3QmpRR09BWThCa0FHUkFaSUJrd0dVQVpVQmxnR1hBWmdCbVFHYUFac0JuQUdkQVo0Qm53R2dBYUVCb2dHakFhUUJwUUdtQWFjQnFBR3BBYW9CcXdHc0FhMEJyZ0d2QWJBQnNRR3lBYk1CdEFHMUFiWUJ0d0c0QWJrQnVnRzdBYndCdlFHK0FiOEJ3QUhCQWNJQnd3SEVBY1VCeGdISEFjZ0J5UUhLQWNzQnpBSE5BYzRCendIUUFkRUIwZ0hUQWRRQjFRSFdBZGNCMkFIWkFkb0Iyd0hjQWQwQjNnSGZBZUFCNFFIaUFlTUI1QUhsQWVZQjV3SG9BZWtCNmdIckFld0I3UUh1QWU4QjhBSHhBZklCOHdIMEFmVUI5Z0gzQWZnQitRSDZBZnNCL0FIOUFmNEIvd0lBQWdFQ0FnSURBZ1FDQlFJR0FnY0NDQUlKQWdvQ0N3SU1BZzBDRGdJUEFoQUNFUUlTQWhNQ0ZBSVZBaFlDRndJWUFoa0NHZ0liQWh3Q0hRSWVBaDhDSUFJaEFpSUNJd0lrQWlVQ0pnSW5BaWdDS1FJcUFpc0NMQUl0QWk0Q0x3S09BbzhDa0FLUkFwSUNrd0tVQXBVQ2xnS1hBc1VDeGdMSEFzZ0N5UUxEQXNRQy9RTCtBdjhDL0FNekF6UUROUU0yQXpjRE9BTTVBem9ET3dNOEF6MERQZ00vQTBBRFFRTkNBME1EUkFBQ0I5UUFGQUtuQXZzRElBTWhBeUlESXdNa0F5VURKZ01uQXlnREtRTXFBeXNETEFNdEF5NERMd013QXpFQUFRZkNBQUVBQ0FBQ0FBWUFEQUYwQUFJQStnRjFBQUlCRHdBQ0I2NEJmZ0Y0QVhrQmVnRjdBWHdCZlFGK0FYOEJnQUdCQVlJQmd3R0VBWVVCaGdHSEFZZ0JpUUdLQVlzQmpBR05BWTRCandHUUFaRUJrZ0dUQVpRQmxRR1dBWmNCbUFHWkFab0Jtd0djQVowQm5nR2ZBYUFCb1FHaUFhTUJwQUdsQWFZQnB3R29BYWtCcWdHckFhMEJyZ0d2QWJBQnNRR3lBYk1CdEFHMUFiWUJ0d0hDQWJrQnVnRzdBYndCdlFHK0FiOEJ3QUhCQWNNQnhBSEZBY2dCeVFIS0Fjc0J6QUhOQWM0Qnp3SFFBZEVCMGdIVEFkUUIxUUhXQWRjQjJBSGFBZHNCM0FIZEFkNEIzd0hnQWVFQjRnSGpBZVFCNVFIbUFlY0I2QUhwQWVvQjZ3SHNBZTBCN2dIdkFmQUI4UUh5QWZNQjlBSDFBZllCOXdINEFma0IrZ0g3QWYwQi9nRjJBYXdCL3dJQUFnRUNBd0lFQWdVQ0JnSUhBZ2dDQ1FJS0Fnc0NEQUlOQWc0Q0R3SVFBaEVDRWdJVEFoUUNGUUlXQWhjQ0dBSVpBaG9DR3dJY0FoMENIZ0lmQWlBQ0lRSWlBaU1DSkFJbEFpWUNKd0lvQWlrQ0tnSXJBaXdDTFFJdUFpOEJlQUY1QVhvQmV3RjhBWDBCZmdGL0FZQUJnUUdDQVlNQmhBR0ZBWVlCaHdHSUFZa0JpZ0dMQVl3QmpRR09BWThCa0FHUkFaSUJrd0dVQVpVQmxnR1hBWmdCbVFHYUFac0JuQUdkQVo0Qm53R2dBYUVCb2dHakFhUUJwUUdtQWFjQnFBR3BBYW9CcXdHc0FhMEJyZ0d2QWJBQnNRR3lBYk1CdEFHMUFiWUJ1QUc1QWJvQnV3RzhBYjBCdmdHL0FjQUJ3UUhDQWNNQnhBSEZBY2NCeUFISkFjb0J5d0hNQWMwQnpnSFBBZEFCMFFIU0FkTUIxQUhWQWRZQjF3SFlBZG9CMndIY0FkMEIzZ0hmQWVBQjRRSGlBZU1CNUFIbEFlWUI1d0hvQWVrQjZnSHJBZXdCN1FIdUFlOEI4QUh4QWZJQjh3SDBBZlVCOWdIM0FmZ0IrUUg2QWZzQi9RSCtBZjhDQUFJQkFnTUNCQUlGQWdZQ0J3SUlBZ2tDQ2dJTEFnd0NEUUlPQWc4Q0VBSVJBaElDRXdJVUFoVUNGZ0lYQWhnQ0dRSWFBaHNDSEFJZEFoNENId0lnQWlFQ0lnSWpBaVFDSlFJbUFpY0NLQUlwQWlvQ0t3SXNBaTBDTGdJdkFtZ0NhUUpxQW1zQ2JBSnRBbTRDYndKd0FuRUN4UUxHQXNjQ3lBS0dBc2tDd3dMRUF0UUN6Z0wrQXY4Qyt3TDhBQUVGTGdCSkFKZ0FuZ0NrQUtvQXNBQzJBTHdBd2dESUFNNEExQURhQU9vQStnRUtBUm9CS2dFNkFVb0JXZ0ZxQVhvQmdBR0dBWXdCa2dHWUFaNEJwQUdxQWJBQnRnRzhBY0lCeUFIT0FkUUIyZ0hnQWVZQjdBSHlBZllCK2dIK0FnSUNCZ0lLQWc0Q0VnSVdBaG9DSUFJbUFpd0NNQUkyQWp3Q1FnSklBazRDVkFKYUFtQUNaZ0pzQW5JQ2VBSitBb1FDaWdLUUFwWUFBZ0l3QVhjQUFnQlFBY1lBQWdJeEFka0FBZ0NHQWZ3QUFnQ05BZ0lBQWdJd0FYY0FBZ0VCQWJjQUFnRUxBY1lBQWdJeEFka0FBZ0ZCQWZ3QUFnRkhBZ0lBQndKZUFuOENjZ0pvQWtvQ1FBS09BQWNDWHdKOEFuTUNhUUpMQWtFQ2p3QUhBbUFDZlFKMEFtb0NUQUpDQXBBQUJ3SmhBbjRDZFFKckFrMENRd0tSQUFjQ1lnS0FBbllDYkFKT0FrUUNrZ0FIQW1NQ2dRSjNBbTBDVHdKRkFwTUFCd0prQW9JQ2VBSnVBbEFDUmdLVUFBY0NaUUtEQW5rQ2J3SlJBa2NDbFFBSEFtWUNoQUo2QW5BQ1VnSklBcFlBQndKbkFvVUNld0p4QWxNQ1NRS1hBQUlDTmdKVUFBSUNOd0pWQUFJQ09BSldBQUlDT1FKWEFBSUNPZ0pZQUFJQ093SlpBQUlDUEFKYUFBSUNQUUpiQUFJQ1BnSmNBQUlDUHdKZEFBSUNOZ0pVQUFJQ053SlZBQUlDT0FKV0FBSUNPUUpYQUFJQ09nSllBQUlDT3dKWkFBSUNQQUphQUFJQ1BRSmJBQUlDUGdKY0FBSUNQd0pkQUFFQ1FBQUJBa0VBQVFKQ0FBRUNRd0FCQWtRQUFRSkZBQUVDUmdBQkFrY0FBUUpJQUFFQ1NRQUNBcWdDcHdBQ0Fza0Nwd0FDQXRNQy9RQUJBc3dBQWdNekF5QUFBZ00wQXlFQUFnTTFBeUlBQWdNMkF5TUFBZ00zQXlRQUFnTTRBeVVBQWdNNUF5WUFBZ002QXljQUFnTTdBeWdBQWdNOEF5a0FBZ005QXlvQUFnTStBeXNBQWdNL0F5d0FBZ05BQXkwQUFnTkJBeTRBQWdOQ0F5OEFBZ05EQXpBQUFnTkVBekVBQWdNQ0FCUUErd0VLQXlBRElRTWlBeU1ESkFNbEF5WURKd01vQXlrREtnTXJBeXdETFFNdUF5OERNQU14QUFFQWVnQUhBQUlDNmdBREFGQUJDd0tuQUFFQXl2LzJBQUlDNGdBRUFqQUNNUUl3QWpFQUFRQUNBUG9CQ1FBQ0FBSURBQU1FQUFBREJnTU5BQVVBQVFBRUF3NEREd01SQXhJQUFnQUNBd0FEQkFBQUF3WURFZ0FGQUFJQUFnQUNBTGtBQUFJeUFqTUF1QUFDQUFFRElBTXhBQUFBQVFBQkFROEFBUUFCQXFFQUFRQUJBRlFBQVFBRUFJUUFqQUUvQVVZQUFRQUJBUG9BQVFBQkFQd0FBUUFCQVFrQUFRQUJBRThBQWdBREF3QURCQUFBQXdZREVnQUZBeUFETVFBU0FBRUFBUUJEQUFJQUFRSTJBajhBQUFBQkFBRUNwUUFCQUFFQ2hnQUNBQUVDY2dKN0FBQUFBZ0FCQW1nQ2NRQUFBQUVBQWdBQ0FMb0FBUUFDQUdFQkhBQUNBQUlDUUFKSkFBQUMwd0xVQUFvQUFnQUJBa29DWFFBQUFBSUFBUUkyQWtrQUFBQUNBQVFDTmdJL0FBQUNTZ0pUQUFvQ3pBTE1BQlFDemdMT0FCVUFBZ0FLQUFJQXVRQUFBallDUHdDNEFwMENvQURDQXFjQ3B3REdBcWtDcWdESEFzd0N6QURKQXVzQzdBREtBdThDN3dETUF3QURCQUROQXdZREVnRFNBQUlBQ2dDNkFVRUFBQUZEQVhNQWlBSTJBajhBdVFLZEFxQUF3d0tvQXFvQXh3TE1Bc3dBeWdMckF1d0F5d0x2QXU4QXpRTUFBd1FBemdNR0F4SUEwd0FDQUFRQ3FBS29BQUFDN2dMdUFBRURBQU1FQUFJREJnTVNBQWNBQVFBQkFQQUFBZ0FWQUFNQVRnQUFBRkFBWUFCTUFHSUFnd0JkQUlVQWl3Qi9BSTBBdVFDR0FMc0ErUUN6QVBzQkNBRHlBUW9CR3dFQUFSMEJQZ0VTQVVBQlFRRTBBVU1CUlFFMkFVY0Jjd0U1QW5JQ2V3Rm1BcDBDb0FGd0FxVUNwUUYwQXFjQ3B3RjFBcWtDcWdGMkFzNEN6Z0Y0QXRRQzFBRjVBdXNDN0FGNkF1NEM3d0Y4QUFJQUVnQUNBQUlBQUFCUEFFOEFBUUJoQUdFQUFnQ0VBSVFBQXdDTUFJd0FCQUM2QUxvQUJRRDZBUG9BQmdFSkFRa0FCd0VjQVJ3QUNBRS9BVDhBQ1FGR0FVWUFDZ0kyQWwwQUN3S2hBcUVBTXdLb0FxZ0FOQUxNQXN3QU5RTFRBdE1BTmdNQUF3UUFOd01HQXhJQVBBQUNBQVFBK2dENkFBQUJDUUVKQUFFREFBTUVBQUlEQmdNU0FBY0FBUUFEQUU4QkNRS2hBQUVBQkFBQ0FHRUF1Z0VjQUFRQ0tBRXNBQVVBQ0FLS0FsZ0FBQUJMQW9vQ1dBQUFBVjRBTWdFNkFBQUFBQVFBQUFBQUFBQUFJQUFBQndBQUFBQUFBQUFBQUFBQUFGQnNZWFVBd0FBZyt3SUQzdjhRQU1nRVFnRlVJQUFCa3dBQUFBQUNEQUs4QUFBQUlBQURBQUFBQWdBQUFBTUFBQUFVQUFNQUFRQUFBQlFBQkFWNkFBQUFkQUJBQUFVQU5BQXZBRGtBZmdFM0FVZ0JmZ0dQQVpJQm9RR3dBZHdCNXdJYkFqTUNOd0paQXNjQzNRTUVBd3dERWdNYkF5TURLQU9VQTZrRHZBUEFIb1Vlbmg3NUlBa2dGQ0FhSUI0Z0lpQW1JREFnT2lCRUlIQWdlU0NzSVNJaExpRmVJZ0lpRHlJU0lob2lIaUlySWtnaVlDSmxKY3I3QXYvL0FBQUFJQUF3QURvQW9BRTVBVW9CandHU0FhQUJyd0hOQWVZQ0dBSXlBamNDV1FMR0F0Z0RBQU1HQXhJREd3TWpBeVlEbEFPcEE3d0R3QjZBSHA0ZW9DQUpJQk1nR0NBY0lDQWdKaUF3SURrZ1JDQndJSFFnckNFaUlTNGhXeUlDSWc4aUVTSWFJaDRpS3lKSUltQWlaQ1hLK3dILy93QUFBZ1lBQUFBQUFBQUFBUDc1QVQ0QUFBQUFBQUFBQUFBQUFBRCswLzZXQUZJQUFBQUFBQUQvKy8vei8rei82djZlL29yK2VQNTFBQURoNlFBQTRzTGlvQUFBQUFBQUFPSjI0cnppaHVKQzRnL2lET0lqNGRMaHpPRXY0T2pnMXdBQTRNN2d4dUM2NEpqZ2VnQUEzU01HY3dBQkFIUUFBQUNRQVJnQ1JnSmtBQUFBQUFMSUFzb0N6QUxxQXV3QzhnQUFBQUFBQUFMdUF2Z0RBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUMvQUFBQXdRQUFBQUFBN0lEdGdPNkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTZZQUFBQUFBQUFBQUFBQUE1NEFBQUFBQUFBQUFRS2RBc0VDcEFMT0F1c0M3d0xDQXFrQ3FnS2pBdFVDbVFLeEFwZ0NwUUthQXBzQzNBTFpBdHNDbndMdUFBSUFHZ0FiQUNFQUpRQTNBRGdBUGdCQkFFOEFVZ0JVQUZvQVd3QmhBSG9BZkFCOUFJRUFpUUNPQUtZQXB3Q3NBSzBBdGdLdEFxWUNyZ0xqQXJVREZRQzZBTklBMHdEWkFOMEE4QUR4QVBjQStnRUpBUTBCRHdFVkFSWUJIQUUxQVRjQk9BRThBVU1CU0FGZ0FXRUJaZ0ZuQVhBQ3F3TDJBcXdDNFFMS0FwNEN6QUxSQXMwQzBnTDNBdkVERXdMeUFqQUN2UUxpQXJJQzh3TWRBdlVDM3dKOUFuNERGZ0xwQXZBQ29RTWVBbndDTVFLK0FvZ0Nod0tKQXFBQUV3QURBQXNBR0FBUkFCY0FHUUFlQURJQUpnQXBBQzhBU2dCREFFWUFSd0FpQUdBQWJRQmlBR1VBZUFCckF0Y0Fkd0NaQUk4QWtnQ1RBSzRBZXdGQ0FNc0F1d0REQU5BQXlRRFBBTkVBMWdEcUFONEE0UURuQVFNQS9BRC9BUUFBMmdFYkFTZ0JIUUVnQVRNQkpnTFlBVElCVXdGSkFVd0JUUUZvQVRZQmFnQVZBTTBBQkFDOEFCWUF6Z0FjQU5RQUh3RFhBQ0FBMkFBZEFOVUFJd0RiQUNRQTNBQTBBT3dBSndEZkFEQUE2QUExQU8wQUtBRGdBRHNBOUFBNUFQSUFQUUQyQUR3QTlRQkFBUGtBUHdENEFFNEJDQUJNQVFZQVJBRDlBRTBCQndCSUFQc0FRZ0VGQUZFQkRBQlRBUTRBVlFFUUFGY0JFZ0JXQVJFQVdBRVRBRmtCRkFCY0FSY0FYZ0VaQUYwQkdBQmZBUm9BZGdFeEFHTUJIZ0IxQVRBQWVRRTBBSDRCT1FDQUFUc0Fmd0U2QUlJQlBRQ0ZBVUFBaEFFL0FJTUJQZ0NNQVVZQWl3RkZBSW9CUkFDbEFWOEFvZ0ZjQUpBQlNnQ2tBVjRBb1FGYkFLTUJYUUNwQVdNQXJ3RnBBTEFBdHdGeEFMa0Jjd0M0QVhJQWJ3RXFBSnNCVlFBS0FNSUFSUUQrQUdRQkh3Q1JBVXNBbHdGUkFKUUJUZ0NWQVU4QWxnRlFBRG9BOHdDR0FVRUFqUUZIQUxRQmJnTWFBeFFER3dNZkF4d0RGd01DQXdNREJnTUtBd3NEQ0FNQkF3QUREQU1KQXdRREJ3Q3JBV1VBcUFGaUFLb0JaQUFTQU1vQUZBRE1BQXdBeEFBT0FNWUFEd0RIQUJBQXlBQU5BTVVBQlFDOUFBY0F2d0FJQU1BQUNRREJBQVlBdmdBeEFPa0FNd0RyQURZQTdnQXFBT0lBTEFEa0FDMEE1UUF1QU9ZQUt3RGpBRXNCQkFCSkFRSUFiQUVuQUc0QktRQm1BU0VBYUFFakFHa0JKQUJxQVNVQVp3RWlBSEFCS3dCeUFTMEFjd0V1QUhRQkx3QnhBU3dBbUFGU0FKb0JWQUNjQVZZQW5nRllBSjhCV1FDZ0FWb0FuUUZYQUxJQmJBQ3hBV3NBc3dGdEFMVUJid0s3QXJ3Q3R3SzVBcm9DdUFMNEF2a0NvZ0xuQXRZQzNnTGRBQUFBQWdCZ0FBQUI1d0s4QUFNQUJ3QWZRQndBQWdJQVh3QUFBRWhOQUFNREFWOEFBUUZKQVU0UkVSRVFCQW9hS3hNaEVTRUJJUkVoWUFHSC9ua0JVUDdvQVJnQ3ZQMUVBb2I5c1FBQUFBSUFIUUFBQW9NQ3ZBQUhBQW9BSDBBY0FBUUFBUUFFQVdnQUF3TklUUUlCQUFCSkFFNFNFUkVSRUFVS0d5c2hJeWNoQnlNQk13Y0RJUUtEVTBEK3ZFRk9BUVJjTDRzQkZyS3lBcnhKL29ELy93QWRBQUFDZ3dOeEFDSUFBZ0FBQUFNREl3SUpBQUQvL3dBZEFBQUNnd054QUNJQUFnQUFBQU1ESndIb0FBRC8vd0FkQUFBQ2d3UFJBQ0lBQWdBQUFRY0RTZ0hvQUpjQUNMRUNBckNYc0RVckFBRC8vd0FkLzFRQ2d3TnhBQ0lBQWdBQUFDTURMZ0hRQUFBQUF3TW5BZWdBQVAvL0FCMEFBQUtEQTlFQUlnQUNBQUFCQndOTEFlZ0Fsd0FJc1FJQ3NKZXdOU3NBQVAvL0FCMEFBQUtEQSt3QUlnQUNBQUFCQndOTUFlZ0Fsd0FJc1FJQ3NKZXdOU3NBQVAvL0FCMEFBQUtEQTlrQUlnQUNBQUFCQndOTkFlZ0Fsd0FJc1FJQ3NKZXdOU3NBQVAvL0FCMEFBQUtEQTNFQUlnQUNBQUFBQXdNbUFlVUFBUC8vQUIwQUFBS0RBM2NBSWdBQ0FBQUFBd01sQWVvQUFQLy9BQjBBQUFLREE4VUFJZ0FDQUFBQkJ3Tk9BZW9Bb0FBSXNRSUNzS0N3TlNzQUFQLy9BQjMvVkFLREEzY0FJZ0FDQUFBQUl3TXVBZEFBQUFBREF5VUI2Z0FBLy84QUhRQUFBb01EeFFBaUFBSUFBQUVIQTA4QjZ3Q2dBQWl4QWdLd29MQTFLd0FBLy84QUhRQUFBb01EMUFBaUFBSUFBQUVIQTFBQjZnQ2dBQWl4QWdLd29MQTFLd0FBLy84QUhRQUFBb01ENGdBaUFBSUFBQUVIQTFFQjZnQ2dBQWl4QWdLd29MQTFLd0FBQUFRQUhRQUFBb01EUndBTEFCY0FId0FpQUQ5QVBBSUJBQW9EQ1FNQkJ3QUJhUUFJQUFVRUNBVm9BQWNIU0UwR0FRUUVTUVJPREF3QUFDSWhIeDRkSEJzYUdSZ01Gd3dXRWhBQUN3QUtKQXNLRnlzU0pqVTBOak15RmhVVUJpTXlKalUwTmpNeUZoVVVCaU1USXljaEJ5TUJNd2NESWVFWkdSUVdHaG9XbmhrWkZoVVpHUlhhVTBEK3ZFRk9BUVJjTDRzQkZnTHBHQmNYR0JnWEZ4Z1lGeGNZR0JjWEdQMFhzcklDdkVuK2dBRC8vd0FkLzFRQ2d3SzhBQ0lBQWdBQUFBTURMZ0hRQUFELy93QWRBQUFDZ3dOeEFDSUFBZ0FBQVFjRElnRzFBQUVBQ0xFQ0FiQUJzRFVyQUFELy93QWRBQUFDZ3dPS0FDSUFBZ0FBQUFNREt3SmFBQUQvL3dBZEFBQUNnd05SQUNJQUFnQUFBQU1ES2dIcUFBQUFBZ0FkL3pBQ2d3SzhBQllBR1FBMVFESU1BUU1DQXdFQUF3Sk1BQVlBQWdNR0FtZ0FCQVJJVFFVQkF3TkpUUUFBQUFGaEFBRUJWUUZPRkJFUkVSWWpJQWNLSFNzRU16STNCd1lqSWlZMU5EWTNKeUVISXdFekFTTUdGUU1ESVFJWkpRNEtCQklZSlNvdEp6Myt2RUZPQVFSY0FRWXhPY3VMQVJhZ0Fpb0lLU0FpVFNLb3NnSzgvVVJETXdMcC9vRC8vd0FkQUFBQ2d3T1JBQ0lBQWdBQUFBTURLQUhxQUFELy93QWRBQUFDZ3dOMUFDSUFBZ0FBQUFNREtRSHBBQUFBQWdBZEFBQURNUUs4QUE4QUV3QkNRRDhUQVFFQUFVd0FBUUFDQ0FFQ1p3QUlBQVVEQ0FWbkFBQUFCMThKQVFjSFNFMEFBd01FWHdZQkJBUkpCRTRBQUJJUkFBOEFEeEVSRVJFUkVSRUtDaDByQVJVaEZTRVZJUlVoRlNFMUl3Y2pBUmNETXhFRE1mNjVBU0wrM2dGSC9tL3JTRkFCWGlUS3l3SzhRdlpDL2tTVGt3SzhTLzVqQVo0QUFBQURBR0FBQUFJL0Fyd0FEZ0FXQUI0QVBFQTVEZ0VGQWdGTUFBSUFCUVFDQldjR0FRTURBVjhBQVFGSVRRY0JCQVFBWHdBQUFFa0FUaGdYRHc4ZEd4Y2VHQjRQRmc4Vkp5RWtDQW9aS3dBV0ZSUUdJeU1STXpJV0ZSUUdCd0VWTXpJMk5UUWpFekkyTlRRakl4RUI1bG1GYmUzU2JYTThMUDhBZlVwV294OVpWNnVlQVdSYlNXRmZBcnhZVURaWEZnRUwrVVk5ZHYzRVJEdUYvdndBQUFBQUFRQTYvL01DYlFMSkFCc0FNVUF1QWdFQUF4QVBBd01CQUFKTUFBQUFBMkVFQVFNRFVFMEFBUUVDWVFBQ0FsRUNUZ0FBQUJzQUdpUW1KQVVLR1NzQUZoY0hKaU1pQmdZVkZCWVdNekkzRndZR0l5SW1KalUwTmpZekFjTnhLQ1pRYWtSd1FrSnVSblZUS1MxOFNGeVJWVmFUWEFMSklSNDRORUNIWkdTRFBVVTJKeXhPcEh0NG8wNEFBUC8vQURyLzh3SnRBM0VBSWdBYkFBQUFBd01qQWk4QUFQLy9BRHIvOHdKdEEzRUFJZ0FiQUFBQUF3TW1BZ3NBQUFBQkFEci9NQUp0QXNrQU5BQlpRRllnQVFRRExpMGhBd1VFRmdFR0JUSVZBZ0lIRkFrQ0FRSUlBUUFCQmt3SUFRY0FBZ0VIQW1rQUJBUURZUUFEQTFCTkFBVUZCbUVBQmdaUlRRQUJBUUJoQUFBQVZRQk9BQUFBTkFBekZDWWtLU1FsSkFrS0hTc0VGaFVVQmlNaUppYzNGaFl6TWpZMU5DWWpJZ2NuTnlZbU5UUTJOak15RmhjSEppTWlCZ1lWRkJZV016STNGd1lHQndjMk13R2dManN1RlNnTUN3a2hFUlllR1JFWURSZ25nSnhXazF4RWNTZ21VR3BFY0VKQ2JrWjFVeWt0ZUVjaENCWThKUjBuS3d3Skt3Z0xFaEFQRVFjYlFneTJxWGlqVGlFZU9EUkFoMlJrZ3oxRk5pY3JBVFVHQUFELy93QTYvL01DYlFOM0FDSUFHd0FBQUFNREpRSVFBQUQvL3dBNi8vTUNiUU4xQUNJQUd3QUFBUWNESVFIeEFBRUFDTEVCQWJBQnNEVXJBQUFBQWdCZ0FBQUNkd0s4QUFvQUVnQXRRQ29GQVFNREFGOEVBUUFBU0UwQUFnSUJYd0FCQVVrQlRnc0xBUUFMRWdzUkRnd0pCd0FLQVFvR0NoWXJBVElXRmhVVUJnWWpJeEVYRVRNZ0VUUW1Jd0VsWUpoYVdwbGZ4VXB3QVJDSGlRSzhSNXAzZHFCT0FyeEMvY3NCSDQrSEFBSUFGd0FBQW5jQ3ZBQU9BQm9BUDBBOEJnRURCd0VDQkFNQ1p3QUZCUUJmQ0FFQUFFaE5DUUVFQkFGZkFBRUJTUUZPRUE4QkFCa1lGeFlWRXc4YUVCb05EQXNLQ1FjQURnRU9DZ29XS3dFeUZoWVZGQVlHSXlNUkl6VXpFUk1nRVRRbUl5TVZNeFVqRVFFbFlKaGFXcGxmeFVsSnVnRVFoNGx3bXBvQ3ZFZWFkM2FnVGdGS1BRRTEvWWtCSDQrSDh6MysrLy8vQUdBQUFBSjNBM0VBSWdBaEFBQUFBd01tQWRBQUFQLy9BQmNBQUFKM0Fyd0FBZ0FpQUFBQUFRQmdBQUFDRlFLOEFBc0FLVUFtQUFJQUF3UUNBMmNBQVFFQVh3QUFBRWhOQUFRRUJWOEFCUVZKQlU0UkVSRVJFUkFHQ2h3ckV5RVZJUlVoRlNFUklSVWhZQUcxL3BVQlF2NitBV3YrU3dLOFFmUkMvdjlFLy84QVlBQUFBaFVEY1FBaUFDVUFBQUFEQXlNQitBQUEvLzhBWUFBQUFoVURjUUFpQUNVQUFBQURBeWNCMkFBQS8vOEFZQUFBQWhVRGNRQWlBQ1VBQUFBREF5WUIxQUFBLy84QVlBQUFBaFVEZHdBaUFDVUFBQUFEQXlVQjJRQUEvLzhBWUFBQUFoZ0R4UUFpQUNVQUFBRUhBMDRCMlFDZ0FBaXhBUUt3b0xBMUt3QUEvLzhBWVA5VUFoVURkd0FpQUNVQUFBQWpBeTRCeVFBQUFBTURKUUhaQUFELy93QmdBQUFDRlFQRkFDSUFKUUFBQVFjRFR3SGFBS0FBQ0xFQkFyQ2dzRFVyQUFELy93QmdBQUFDRlFQVUFDSUFKUUFBQVFjRFVBSFpBS0FBQ0xFQkFyQ2dzRFVyQUFELy93QmdBQUFDRlFQaUFDSUFKUUFBQVFjRFVRSFpBS0FBQ0xFQkFyQ2dzRFVyQUFBQUF3QmdBQUFDRlFOSEFBc0FGd0FqQUVwQVJ3SUJBQXNEQ2dNQkJBQUJhUUFHQUFjSUJnZG5BQVVGQkY4QUJBUklUUUFJQ0FsZkFBa0pTUWxPREF3QUFDTWlJU0FmSGgwY0d4b1pHQXdYREJZU0VBQUxBQW9rREFvWEt4SW1OVFEyTXpJV0ZSUUdJekltTlRRMk16SVdGUlFHSXdVaEZTRVZJUlVoRVNFVklkQVpHUlFXR2hvV25oa1pGaFVaR1JYK3lBRzEvcFVCUXY2K0FXditTd0xwR0JjWEdCZ1hGeGdZRnhjWUdCY1hHQzFCOUVMKy8wUUEvLzhBWUFBQUFoVURkUUFpQUNVQUFBRUhBeUVCdWdBQkFBaXhBUUd3QWJBMUt3QUEvLzhBWVA5VUFoVUN2QUFpQUNVQUFBQURBeTRCeVFBQS8vOEFZQUFBQWhVRGNRQWlBQ1VBQUFFSEF5SUJwQUFCQUFpeEFRR3dBYkExS3dBQS8vOEFZQUFBQWhVRGlnQWlBQ1VBQUFBREF5c0NTZ0FBLy84QVlBQUFBaFVEVVFBaUFDVUFBQUFEQXlvQjJRQUFBQUVBWVA4d0FoZ0N2QUFiQUVaQVF3RUJCd0VCVEJZQkFRRkxBQVFBQlFZRUJXY0FBd01DWHdBQ0FraE5BQVlHQVY4QUFRRkpUUWdCQndjQVlRQUFBRlVBVGdBQUFCc0FHaEVSRVJFUkZTTUpDaDByQkRjSEJpTWlKalUwTmpjaEVTRVZJUlVoRlNFUklSVWpCaFVVTXdJT0NnUVNHQ1VxS0NIK2ZBRzEvcFVCUXY2K0FXc0JPU1dnQWlvSUtTQWZSeUVDdkVIMFF2Ny9SRU16S2dBQUFQLy9BR0FBQUFJVkEzVUFJZ0FsQUFBQUF3TXBBZGdBQUFBQkFHQUFBQUh2QXJ3QUNRQWpRQ0FBQXdBRUFBTUVad0FDQWdGZkFBRUJTRTBBQUFCSkFFNFJFUkVSRUFVS0d5c3pJeEVoRlNFUklSVWhxa29Cai82N0FSeis1QUs4UXY3N1FnQUFBUUE2Ly9RQ2dRTEpBQ0FBTzBBNEF3SUNBd0FWRUFJQkFnSk1BQU1BQWdFREFtY0FBQUFGWVFZQkJRVlFUUUFCQVFSaEFBUUVVUVJPQUFBQUlBQWZJeEVUSlNVSENoc3JBQllYQnlZbUl5SUdGUlFXRmpNeU5qYzFJelVoRVFZR0l5SW1KalUwTmpZekFkTnpLeXNxWmpseWhUNXVTVUZpR3R3QkpTcUtWVm1RVlZLVVlRTEpNaVExSWlhV2oyQ0dSREFndUQvKzZqVS9UcUo1ZHFSUy8vOEFPdi8wQW9FRGNRQWlBRGdBQUFBREF5Y0NHd0FBLy84QU92LzBBb0VEY1FBaUFEZ0FBQUFEQXlZQ0Z3QUEvLzhBT3YvMEFvRURkd0FpQURnQUFBQURBeVVDSEFBQS8vOEFPdjgzQW9FQ3lRQWlBRGdBQUFBREF5OENEQUFBLy84QU92LzBBb0VEZFFBaUFEZ0FBQUVIQXlFQi9RQUJBQWl4QVFHd0FiQTFLd0FBQUFFQVlBQUFBbndDdkFBTEFDZEFKQVlCQlFBQ0FRVUNad1FCQUFCSVRRTUJBUUZKQVU0QUFBQUxBQXNSRVJFUkVRY0tHeXNCRVRNUkl4RWhFU01STXhFQ00wbEovbmRLU2dHRUFUajlSQUZDL3I0Q3ZQN0lBQUFDQUNNQUFBSzVBcndBRXdBWEFEWkFNd2dHQWdBTEJRSUJDZ0FCWndBS0FBTUNDZ05uQ1FFSEIwaE5CQUVDQWtrQ1RoY1dGUlFURWhFUkVSRVJFUkVSRUF3S0h5c0JNeFVqRVNNUklSRWpFU00xTXpVekZTRTFNd0VoTlNFQ2ZEMDlTZjUzU2owOVNnR0pTZjR1QVluK2R3SkpPUDN2QVVMK3ZnSVJPSE56Yy83SWpmLy9BR0FBQUFKOEEzY0FJZ0ErQUFBQUF3TWxBZ2NBQUFBQkFHQUFBQUNxQXJ3QUF3QVRRQkFBQUFCSVRRQUJBVWtCVGhFUUFnb1lLeE16RVNOZ1Nrb0N2UDFFLy84QVlQL3pBbFlDdkFBaUFFRUFBQUFEQUU4QkNnQUEvLzhBVGdBQUFQMERjUUFpQUVFQUFBQURBeU1CUHdBQS8vLy8rd0FBQVE0RGNRQWlBRUVBQUFBREF5Y0JIZ0FBLy8vLy93QUFBUVFEY1FBaUFFRUFBQUFEQXlZQkd3QUEvLzhBQWdBQUFRZ0Rkd0FpQUVFQUFBQURBeVVCSUFBQUFBUC8vZ0FBQVEwRFJ3QUxBQmNBR3dBd1FDMENBUUFIQXdZREFRUUFBV2tBQkFSSVRRQUZCVWtGVGd3TUFBQWJHaGtZREJjTUZoSVFBQXNBQ2lRSUNoY3JFaVkxTkRZek1oWVZGQVlqTWlZMU5EWXpNaFlWRkFZakJ6TVJJeGNaR1JRV0dob1duaGtaRmhVWkdSVi9Ta29DNlJnWEZ4Z1lGeGNZR0JjWEdCZ1hGeGd0L1VRQUFQLy9BRk1BQUFDNUEzVUFJZ0JCQUFBQkJ3TWhBUUVBQVFBSXNRRUJzQUd3TlNzQUFQLy9BRlAvVkFDMkFyd0FJZ0JCQUFBQUF3TXVBUVVBQVAvLy8vZ0FBQUNxQTNFQUlnQkJBQUFCQndNaUFPc0FBUUFJc1FFQnNBR3dOU3NBQVAvL0FEd0FBQURSQTRvQUlnQkJBQUFBQXdNckFaQUFBUC8vQUJjQUFBRHpBMUVBSWdCQkFBQUFBd01xQVNBQUFBQUJBREQvTUFDdEFyd0FFd0F3UUMwQkFRTUJBVXdPQVFFQlN3QUNBa2hOQUFFQlNVMEVBUU1EQUdFQUFBQlZBRTRBQUFBVEFCSVJGU01GQ2hrckZqY0hCaU1pSmpVME5qY2pFVE1SSXdZVkZET2pDZ1FTR0NVcUtDRVpTZ0U1SmFBQ0tnZ3BJQjlISVFLOC9VUkRNeXIvLy8veUFBQUJHUU4xQUNJQVFRQUFBQU1ES1FFZkFBQUFBUUFLLy9NQlRBSzhBQTBBS1VBbUFnRUFBUUVCQWdBQ1RBQUJBVWhOQUFBQUFtRURBUUlDVVFKT0FBQUFEUUFNRXlNRUNoZ3JGaWMzRmpNeU5qVVJNeEVVQmlNc0lnY3BJMUpUU29CeERRaEVCbEpXQWR2K0tvcHBBUC8vQUFyLzh3R0xBM0VBSWdCUEFBQUFBd01qQWMwQUFQLy9BQXIvOHdHV0EzY0FJZ0JQQUFBQUF3TWxBYTRBQUFBQkFHQUFBQUpoQXJ3QUN3QWZRQndKQkFNREFBSUJUQU1CQWdKSVRRRUJBQUJKQUU0U0VSTVJCQW9hS3dFQkl3RUhFU01STXhFQk13RVdBVXRqL3VRM1Mwc0JRMXdCZGY2TEFUODcvdndDdlA2aEFWOEFBQUQvL3dCZy96Y0NZUUs4QUNJQVVnQUFBQU1ETHdIVUFBQUFBUUJnQUFBQi93SzhBQVVBR1VBV0FBRUJTRTBBQWdJQVh3QUFBRWtBVGhFUkVBTUtHU3NoSVJFekVTRUIvLzVoU2dGVkFyejlodi8vQUVvQUFBSC9BM0VBSWdCVUFBQUFBd01qQVRzQUFQLy9BR0FBQUFIL0Fyd0FJZ0JVQUFBQkJ3TUZBWUgvekFBSnNRRUJ1UC9Nc0RVckFQLy9BR0QvTndIL0Fyd0FJZ0JVQUFBQUF3TXZBWlVBQVAvL0FHQUFBQUgvQXJ3QUlnQlVBQUFBQXdLbkFoTUFBQUFCQUE4QUFBSUtBcndBRFFBbVFDTU5EQXNJQndZRkFBZ0FBZ0ZNQUFJQ1NFMEFBQUFCWHdBQkFVa0JUaFVSRVFNS0dTc1RFU0VWSVJFSE5UY1JNeEUzRmJVQlZmNWhYRnhLaXdGbC90MUNBVUFvUGljQlAvN21PendBQUFFQVlBQUFBeGNDdkFBTUFDQkFIUWdGQWdFQUFVd0VBUUFBU0UwREFnSUJBVWtCVGhFU0VoRVJCUW9iS3lVQk14RWpFUU1qQXhFakVUTUJ2Z0VIVWtuMk9mZElUMlFDV1AxRUFpZjkzQUlrL2RrQ3ZBQUFBQUFCQUdBQUFBS01BcndBQ1FBZVFCc0ZBQUlCQUFGTUF3RUFBRWhOQWdFQkFVa0JUaEVTRVJFRUNob3JKUkV6RVNNQkVTTVJNd0pDU2tEK1hrcEJnZ0k2L1VRQ09mM0hBcndBQUFELy93QmdBQUFDakFOeEFDSUFXd0FBQUFNREl3SXFBQUQvL3dCZ0FBQUNqQU54QUNJQVd3QUFBQU1ESmdJR0FBRC8vd0JnL3pjQ2pBSzhBQ0lBV3dBQUFBTURMd0gzQUFBQUFRQmcvekVDakFLOEFCUUFNVUF1RkE4T0F3TUFDQUVDQXdjQkFRSURUQVFCQUFCSVRRQURBMGxOQUFJQ0FXRUFBUUZOQVU0UkZTTWpFQVVLR3lzQk14RVVCaU1pSnpjV016STJOVFVCRVNNUk13RUNRa3BnYUM4WkJpRWRSVUQrWlVwQkFhRUN2UDBlVlZRSlBBVTJPU29DTC8zSEFyejl4Z0FBLy84QVlBQUFBb3dEZFFBaUFGc0FBQUFEQXlrQ0NnQUFBQUlBT3YvekF0QUN5UUFQQUI4QUxFQXBCUUVEQXdGaEJBRUJBVkJOQUFJQ0FHRUFBQUJSQUU0UUVBQUFFQjhRSGhnV0FBOEFEaVlHQ2hjckFCWVdGUlFHQmlNaUppWTFORFkyTXc0Q0ZSUVdGak15TmpZMU5DWW1Jd0hibDE1ZWwxWlZsMTllbDFaSWMwUkNja2RHZFVkRmRFY0N5VTZqZUhpbFVGQ2xlSGlqVGtOQmhHQmVoMFpFaDJCZmhFSUEvLzhBT3YvekF0QURjUUFpQUdFQUFBQURBeU1DUHdBQS8vOEFPdi96QXRBRGNRQWlBR0VBQUFBREF5Y0NIZ0FBLy84QU92L3pBdEFEY1FBaUFHRUFBQUFEQXlZQ0d3QUEvLzhBT3YvekF0QURkd0FpQUdFQUFBQURBeVVDSUFBQS8vOEFPdi96QXRBRHhRQWlBR0VBQUFFSEEwNENJQUNnQUFpeEFnS3dvTEExS3dBQS8vOEFPdjlVQXRBRGR3QWlBR0VBQUFBakF5NENCUUFBQUFNREpRSWdBQUQvL3dBNi8vTUMwQVBGQUNJQVlRQUFBUWNEVHdJaEFLQUFDTEVDQXJDZ3NEVXJBQUQvL3dBNi8vTUMwQVBVQUNJQVlRQUFBUWNEVUFJZ0FLQUFDTEVDQXJDZ3NEVXJBQUQvL3dBNi8vTUMwQVBpQUNJQVlRQUFBUWNEVVFJZ0FLQUFDTEVDQXJDZ3NEVXJBQUFBQkFBNi8vTUMwQU5IQUFzQUZ3QW5BRGNBU0VCRkFnRUFDUU1JQXdFRkFBRnBDd0VIQndWaENnRUZCVkJOQUFZR0JHRUFCQVJSQkU0b0tCZ1lEQXdBQUNnM0tEWXdMaGduR0NZZ0hnd1hEQllTRUFBTEFBb2tEQW9YS3dBbU5UUTJNeklXRlJRR0l6SW1OVFEyTXpJV0ZSUUdJd1lXRmhVVUJnWWpJaVltTlRRMk5qTU9BaFVVRmhZek1qWTJOVFFtSmlNQkZ4a1pGQllhR2hhZUdSa1dGUmtaRlFTWFhsNlhWbFdYWDE2WFZraHpSRUp5UjBaMVIwVjBSd0xwR0JjWEdCZ1hGeGdZRnhjWUdCY1hHQ0JPbzNoNHBWQlFwWGg0bzA1RFFZUmdYb2RHUklkZ1g0UkMvLzhBT3Y5VUF0QUN5UUFpQUdFQUFBQURBeTRDQlFBQS8vOEFPdi96QXRBRGNRQWlBR0VBQUFFSEF5SUI2d0FCQUFpeEFnR3dBYkExS3dBQS8vOEFPdi96QXRBRGlnQWlBR0VBQUFBREF5c0NrQUFBQUFJQU92L3pBdEFEUndBY0FDd0FOMEEwSEFFRUFnRk1BQU1CQTRVQUFnSklUUUFFQkFGaEFBRUJVRTBHQVFVRkFHRUFBQUJSQUU0ZEhSMHNIU3NyRXlNbUpRY0tHeXNBRmhVVUJnWWpJaVltTlRRMk5qTXlGeFlXTXpJMk5UVXpGUlFHQndJMk5qVTBKaVlqSWdZR0ZSUVdGak1DaTBWZWwxWlZsMTllbDFZbUlBZEVIeHNaUXk0dWlYVkhSWFJIUm5ORVFuSkhBbHVWWm5pbFVGQ2xlSGlqVGdjQkNoMGVWVk11T0FiOXJrU0hZRitFUWtHRVlGNkhSZ0QvL3dBNi8vTUMwQU54QUNJQWJ3QUFBQU1ESXdJL0FBRC8vd0E2LzFRQzBBTkhBQ0lBYndBQUFBTURMZ0lGQUFELy93QTYvL01DMEFOeEFDSUFid0FBQVFjRElnSHJBQUVBQ0xFQ0FiQUJzRFVyQUFELy93QTYvL01DMEFPS0FDSUFid0FBQUFNREt3S1FBQUQvL3dBNi8vTUMwQU4xQUNJQWJ3QUFBQU1ES1FJZkFBRC8vd0E2Ly9NQzBBTnlBQ0lBWVFBQUFBTURKQUpCQUFELy93QTYvL01DMEFOUkFDSUFZUUFBQUFNREtnSWdBQUFBQXdBNi82TUMwQU1aQUJjQUlRQXJBRVZBUWhVQkFnRXBLQnNhQkFNQ0NRRUFBd05NREFFREFVc1hGZ0lCU2dzS0FnQkpBQUlDQVdFQUFRRlFUUVFCQXdNQVlRQUFBRkVBVGlJaUlpc2lLaWdxSmdVS0dTc0JGaFlWRkFZR0l5SW5CeWMzSmlZMU5EWTJNeklYTnhjQUZoY0JKaU1pQmdZVkFEWTJOVFFtSndFV013SlBQRVZlbDFaUlNFSXlRenhGWHBkV1UwVkJNLzMxTGlvQkhUVkRSbk5FQVVGMVJ5OHAvdUkwUUFLSUxaUm5lS1ZRSkhRZWRTNldabmlqVGlKeUhQNFdlQ2NCOWh4QmhHRCsxVVNIWUU1MEp2NEpIQUQvL3dBNi8vTUMwQU4xQUNJQVlRQUFBQU1ES1FJZkFBQUFBZ0E2QUFBRElBSzhBQklBSFFBNlFEY0FBUUFDQXdFQ1p3a0dBZ0FBQlY4SUFRVUZTRTBIQVFNREJGOEFCQVJKQkU0VUV3QUFIQm9USFJRZEFCSUFFU0VSRVJFUkNnb2JLd0VWSVJVaEZTRVJJUlVoSWlZbU5UUTJOak1ISWdZR0ZSUVdGak16RVFNZy90TUJCdjc2QVMzK2RtZWRXRmlmYVFoVGVUOC9lRlFYQXJ3LytUNysrVDlSbm05d25WRStSNEpYVm9KSEFqOEFBQUFBQWdCZ0FBQUNHd0s4QUFzQUV3QXdRQzBHQVFNQUFRSURBV2NBQkFRQVh3QUFBRWhOQlFFQ0Fra0NUZzBNQUFBU0VBd1REUk1BQ3dBTEpTRUhDaGdyTXhFek1oWVZGQVlHSXlNUkV6STJOVFFqSXhGZ3puUjVObXBNaFg1UVZhVitBcnh0WGo1bU8vN3VBVlJSUzR2KzJRQUFBQUFDQUdBQUFBSVVBcndBRFFBV0FEUkFNUUFBQndFRkJBQUZad0FFQUFFQ0JBRm5CZ0VEQTBoTkFBSUNTUUpPRGc0QUFBNFdEaFVSRHdBTkFBMFJKU0VJQ2hrckV4VXpNaFlWRkFZR0l5TVZJeEVYRVRNeU5qVTBKaU9yZ1hKMk5XaEtna3RMZDA5VlUxRUN2SHR2WFQ1a09wa0N2TDMrMjFGS1NFSUFBZ0E2LzJjQzBBTEpBQk1BSXdBd1FDMENBUUFEQVV3RUF3SUFTUUFDQWdGaEFBRUJVRTBFQVFNREFHRUFBQUJSQUU0VUZCUWpGQ0lxSmlZRkNoa3JKQVlIRndjbEJpTWlKaVkxTkRZMk16SVdGaFVBTmpZMU5DWW1JeUlHQmhVVUZoWXpBdEIxWHRJai92UUpFbFdYWDE2WFZsYVhYdjczZFVkRmRFZEdjMFJDY2tmWnJpTmtQWTBCVUtWNGVLTk9UcU40L3RaRWgyQmZoRUpCaEdCZWgwWUFBQUFDQUdBQUFBSmFBcndBRGdBWEFDdEFLQTRCQVFRQlRBQUVBQUVBQkFGbkFBVUZBMThBQXdOSVRRSUJBQUJKQUU0a0ppRVJJUkFHQ2h3cklTTURJeU1SSXhFek1oWVZGQVlISnpNeU5qVTBKaU1qQWxwVXB4R2tTdW1BY1VwSS9xMUhUbEZjbFFFVS91d0N2RzVhVFhFV05sUkJTRWdBQVAvL0FHQUFBQUphQTNFQUlnQjlBQUFBQXdNakFmTUFBUC8vQUdBQUFBSmFBM0VBSWdCOUFBQUFBd01tQWM4QUFQLy9BR0QvTndKYUFyd0FJZ0I5QUFBQUF3TXZBY1FBQUFBQkFDdi85QUlQQXNrQUtnQXhRQzRZQXdJREFnQVhBUUVDQWt3QUFBQURZUVFCQXdOUVRRQUNBZ0ZoQUFFQlVRRk9BQUFBS2dBcEpTMGtCUW9aS3dBV0Z3Y21JeUlHRlJRV0ZoY2VBaFVVQmdZaklpWW5OeFlXTXpJMk5UUW1KaWN1QWpVME5qWXpBVzlrS3lCWldVbFdMa0U4U2xFOE9tNUxQb0V5SEM1d05GWlRMVUU3UmxVOU9XbEhBc2trSERrNlFEY2pNeUVaSHl0Sk5UdGFNaU1mUFJzZlJEY2tNeUVZR3kxTk96UlNMd0FBQVAvL0FDdi85QUlQQTNFQUlnQ0JBQUFBQXdNakFkQUFBUC8vQUN2LzlBSVBBM0VBSWdDQkFBQUFBd01tQWF3QUFBQUJBQ3YvTUFJUEFza0FRd0JSUUU0Mk5TQURCZ2dmQVFBR0d3TUNCQUVhRHdJREJBNEJBZ01GVEFBQkFBUURBUVJwQUFnSUIyRUFCd2RRVFFBR0JnQmhCUUVBQUZGTkFBTURBbUVBQWdKVkFrNGtMU1VUSkNVa0loRUpDaDhySkFZSEJ6WXpNaFlWRkFZaklpWW5OeFlXTXpJMk5UUW1JeUlISnpjbUppYzNGaFl6TWpZMU5DWW1KeTRDTlRRMk5qTXlGaGNISmlNaUJoVVVGaFlYSGdJVkFnOTJaeUlJRmlJdU95NFZLQXdMQ1NFUkZoNFpFUmdOR0NjNWRDNGNMbkEwVmxNdFFUdEdWVDA1YVVkRlpDc2dXVmxKVmk1QlBFcFJQR1pzQlRjR0pSMG5Ld3dKS3dnTEVoQVBFUWNiUWdNaUhEMGJIMFEzSkRNaEdCc3RUVHMwVWk4a0hEazZRRGNqTXlFWkh5dEpOUUFBQVAvL0FDdi85QUlQQTNjQUlnQ0JBQUFBQXdNbEFiRUFBUC8vQUN2L053SVBBc2tBSWdDQkFBQUFBd012QWFZQUFBQUJBR0QvOUFKaEFza0FKZ0NDUzdBVVVGaEFFQ1lXRlFNQ0F3c0JBUUlLQVFBQkEwd2JRQkFtRmhVREFnTUxBUUVDQ2dFRUFRTk1XVXV3RkZCWVFCNEFBZ01CQXdJQmdBQURBd1ZoQUFVRlVFMEFBUUVBWVFRQkFBQlJBRTRiUUNJQUFnTUJBd0lCZ0FBREF3VmhBQVVGVUUwQUJBUkpUUUFCQVFCaEFBQUFVUUJPV1VBSkpCTWtGQ1VtQmdvY0t3RVdGaFVVQmdZaklpWW5OeFlXTXpJMk5UUW1CelUzTkNZaklnWVZFU01STkRZMk16SVdGUUdHWFg0M1lEc2ZTUjBRRlQ4YlBVNXJlYVZSUWtGV1N6eHBRMlYxQVc4SFhsWTNXREVPRFVBS0RrUTBPMDhCT1pRNlNVMU0vaEVCK1Q5ZU0zQmlBQUFBQUFJQU9mL3pBb1VDeVFBWEFCOEFQVUE2RkJNQ0FRSUJUQUFCQUFRRkFRUm5BQUlDQTJFR0FRTURVRTBIQVFVRkFHRUFBQUJSQUU0WUdBQUFHQjhZSGhzYUFCY0FGaUlWSlFnS0dTc0FGaFVVQmdZaklpWW1OVFEzSVNZbUl5SUdCeWMyTmpNU05qY2hCaFlXTXdIaHBGR0xXRlovUXdRQit3VjdiRFozTXlNMmprTm1lUW4rVFFNdllFTUN5YnlyZTZWUFZaWmVJeDJBaWk4dU5EVTMvVzJGZ1VwM1JRQUFBQUVBRkFBQUFqVUN2QUFIQUJ0QUdBTUJBUUVDWHdBQ0FraE5BQUFBU1FCT0VSRVJFQVFLR2lzaEl4RWpOU0VWSXdGS1N1d0NJZXNDZWtKQ0FBRUFGQUFBQWpVQ3ZBQVBBQzlBTEFVQkFRUUJBZ01CQW1jR0FRQUFCMThJQVFjSFNFMEFBd05KQTA0QUFBQVBBQThSRVJFUkVSRVJDUW9kS3dFVkl4VXpGU01SSXhFak5UTTFJelVDTmV0eGNVcHljdXdDdkVMelBmNjJBVW85ODBJQUFQLy9BQlFBQUFJMUEzRUFJZ0NKQUFBQUF3TW1BYjRBQUFBQkFCVC9NQUkxQXJ3QUlnQkRRRUFhQWdJRUFSa09BZ01FRFFFQ0F3Tk1BQUVBQkFNQkJHa0lBUVlHQjE4QUJ3ZElUUVVCQUFCSlRRQURBd0poQUFJQ1ZRSk9FUkVSRXlRbEpDSVFDUW9mS3lFakJ6WXpNaFlWRkFZaklpWW5OeFlXTXpJMk5UUW1JeUlISnpjakVTTTFJUlVqQVVvT0tRZ1dJaTQ3TGhVb0RBc0pJUkVXSGhrUkdBMFlMUS9zQWlIclFnWWxIU2NyREFrckNBc1NFQThSQnh0TkFucENRdi8vQUJUL053STFBcndBSWdDSkFBQUFBd012QWFrQUFBQUJBR0QvOHdKdEFyd0FFd0FoUUI0Q0FRQUFTRTBBQVFFRFlRUUJBd05SQTA0QUFBQVRBQklUSXhRRkNoa3JCQ1ltTlJFekVSUVdNekkyTlJFekVSUUdCaU1CSG5kSFNtTmFXbUpLUjNaSkRUZDNXd0hBL2p0WlkyTlpBY1grUUZ0M053RC8vd0JnLy9NQ2JRTnhBQ0lBamdBQUFBTURJd0loQUFELy93QmcvL01DYlFOeEFDSUFqZ0FBQUFNREp3SUFBQUQvL3dCZy8vTUNiUU54QUNJQWpnQUFBQU1ESmdIOUFBRC8vd0JnLy9NQ2JRTjNBQ0lBamdBQUFBTURKUUlDQUFBQUF3QmcvL01DYlFOSEFBc0FGd0FyQUQ5QVBBSUJBQWtEQ0FNQkJBQUJhUVlCQkFSSVRRQUZCUWRoQ2dFSEIxRUhUaGdZREF3QUFCZ3JHQ29tSlNJZ0hSd01Gd3dXRWhBQUN3QUtKQXNLRnlzU0pqVTBOak15RmhVVUJpTXlKalUwTmpNeUZoVVVCaU1DSmlZMUVUTVJGQll6TWpZMUVUTVJGQVlHSS9rWkdSUVdHaG9XbmhrWkZoVVpHUldqZDBkS1kxcGFZa3BIZGtrQzZSZ1hGeGdZRnhjWUdCY1hHQmdYRnhqOUNqZDNXd0hBL2p0WlkyTlpBY1grUUZ0M053QUFCQUJnLy9NQ2JRUElBQU1BRHdBYkFDOEFmMHV3Q2xCWVFDa0FBQUVDQUhBQUFRSUJoUVFCQWdzRkNnTURCZ0lEYWdnQkJnWklUUUFIQndsaERBRUpDVkVKVGh0QUtBQUFBUUNGQUFFQ0FZVUVBUUlMQlFvREF3WUNBMm9JQVFZR1NFMEFCd2NKWVF3QkNRbFJDVTVaUUNBY0hCQVFCQVFjTHh3dUtpa21KQ0VnRUJzUUdoWVVCQThFRGlVUkVBMEtHU3NCTXdjakJpWTFORFl6TWhZVkZBWWpNaVkxTkRZek1oWVZGQVlqQWlZbU5SRXpFUlFXTXpJMk5SRXpFUlFHQmlNQmRGUlZOME1aR1JRV0dob1duaGtaRmhVWkdSV2pkMGRLWTFwYVlrcEhka2tEeUdaNUdCY1hHQmdYRnhnWUZ4Y1lHQmNYR1AwS04zZGJBY0QrTzFsalkxa0J4ZjVBVzNjM0FBUUFZUC96QW0wRHl3QUdBQklBSGdBeUFJdTFCUUVBQVFGTVM3QUtVRmhBS2dzQ0FnRUFBd0Z3QUFBREFJVU5CZ0lEQlF3Q0JBY0RCR29KQVFjSFNFMEFDZ29JWVFBSUNGRUlUaHRBS1FzQ0FnRUFBWVVBQUFNQWhRMEdBZ01GREFJRUJ3TUVhZ2tCQndkSVRRQUtDZ2hoQUFnSVVRaE9XVUFqRXhNSEJ3QUFNQzRyS2lZa0lCOFRIaE1kR1JjSEVnY1JEUXNBQmdBR0VSRU9DaGdyQVFjakp6TVhOd1ltTlRRMk16SVdGUlFHSXpZV0ZSUUdJeUltTlRRMk14Y3pFUlFHQmlNaUppWTFFVE1SRkJZek1qWTFBZVpuTVcxTE96dXBHUmtVRmhvYUZza1pHUlVXR1JrV1lrcEhka2xKZDBkS1kxcGFZZ1BMWjJjNk91SVlGeGNZR0JjWEdGNFlGeGNZR0JjWEdJditRRnQzTnpkM1d3SEEvanRaWTJOWkFBUUFZUC96QW0wRHlBQURBQThBR3dBdkFJZExzQXBRV0VBcUFBQUJBZ0J3Q2dFQkFnR0ZCQUVDREFVTEF3TUdBZ05xQ0FFR0JraE5BQWNIQ1dFTkFRa0pVUWxPRzBBcEFBQUJBSVVLQVFFQ0FZVUVBUUlNQlFzREF3WUNBMm9JQVFZR1NFMEFCd2NKWVEwQkNRbFJDVTVaUUNZY0hCQVFCQVFBQUJ3dkhDNHFLU1lrSVNBUUd4QWFGaFFFRHdRT0NnZ0FBd0FERVE0S0Z5c0JKek1YQmlZMU5EWXpNaFlWRkFZak1pWTFORFl6TWhZVkZBWWpBaVltTlJFekVSUVdNekkyTlJFekVSUUdCaU1CVUZSVE9JNFpHUlFXR2hvV25oa1pGaFVaR1JXamQwZEtZMXBhWWtwSGRra0RZbVptZVJnWEZ4Z1lGeGNZR0JjWEdCZ1hGeGo5Q2pkM1d3SEEvanRaWTJOWkFjWCtRRnQzTndBQUFBQUVBR0QvOHdKdEE2WUFBd0FQQUJzQUx3QkpRRVlBQUFBQkFnQUJad1FCQWdzRkNnTURCZ0lEYVFnQkJnWklUUUFIQndsaERBRUpDVkVKVGh3Y0VCQUVCQnd2SEM0cUtTWWtJU0FRR3hBYUZoUUVEd1FPSlJFUURRb1pLeE16RlNNV0pqVTBOak15RmhVVUJpTXlKalUwTmpNeUZoVVVCaU1DSmlZMUVUTVJGQll6TWpZMUVUTVJGQVlHSS9UbTVnVVpHUlFXR2hvV25oa1pGaFVaR1JXamQwZEtZMXBhWWtwSGRra0RwakNOR0JjWEdCZ1hGeGdZRnhjWUdCY1hHUDBLTjNkYkFjRCtPMWxqWTFrQnhmNUFXM2MzLy84QVlQOVVBbTBDdkFBaUFJNEFBQUFEQXk0QjV3QUEvLzhBWVAvekFtMERjUUFpQUk0QUFBRUhBeUlCelFBQkFBaXhBUUd3QWJBMUt3QUEvLzhBWVAvekFtMERpZ0FpQUk0QUFBQURBeXNDY2dBQUFBRUFZUC96QXQ4RFBnQWNBRTVMc0FwUVdFQWNBQUFEQXdCd0FBRUJBMThGQVFNRFNFMEFCQVFDWVFBQ0FsRUNUaHRBR3dBQUF3Q0ZBQUVCQTE4RkFRTURTRTBBQkFRQ1lRQUNBbEVDVGxsQUNTTWpGQ1FURUFZS0hDc0JNeFVVQmdjUkZBWUdJeUltSmpVUk14RVVGak15TmpVUk16STJOUUtjUXpvNFIzWkpTWGRIU21OYVdtSkhHaGdEUGtRME9RSCtjRnQzTnpkM1d3SEEvanRaWTJOWkFjVWVId0FBLy84QVlQL3pBdDhEY1FBaUFKc0FBQUFEQXlNQ0lRQUEvLzhBWVA5VUF0OERQZ0FpQUpzQUFBQURBeTRCNXdBQS8vOEFZUC96QXQ4RGNRQWlBSnNBQUFFSEF5SUJ6UUFCQUFpeEFRR3dBYkExS3dBQS8vOEFZUC96QXQ4RGlnQWlBSnNBQUFBREF5c0NjZ0FBLy84QVlQL3pBdDhEZFFBaUFKc0FBQUFEQXlrQ0FRQUEvLzhBWVAvekFtMERjZ0FpQUk0QUFBQURBeVFDSXdBQS8vOEFZUC96QW0wRFVRQWlBSTRBQUFBREF5b0NBZ0FBQUFFQVlQOHdBbTBDdkFBaUFDMUFLZ3NCQVFNQlRBUUJBQUJJVFFBRkJRTmhBQU1EVVUwQUFRRUNZUUFDQWxVQ1RpTVVKU01uRUFZS0hDc0JNeEVVQmdjR0ZSUXpNamNIQmlNaUpqVTBOamNqSWlZbU5SRXpFUlFXTXpJMk5RSWpTbXhaTXlVT0NnUVNHQ1VxSUJ3S1NYZEhTbU5hV21JQ3ZQNUFjb0FSUGpFcUFpb0lLU0FjUUI0M2Qxc0J3UDQ3V1dOaldmLy9BR0QvOHdKdEE1RUFJZ0NPQUFBQUF3TW9BZ0lBQVAvL0FHRC84d0p0QTNVQUlnQ09BQUFBQXdNcEFnRUFBQUFCQUJJQUFBS0RBcndBQmdBYlFCZ0VBUUFCQVV3Q0FRRUJTRTBBQUFCSkFFNFNFUkFEQ2hrcklTTUJNeE1UTXdGN1gvNzJVZXZrVVFLOC9ZY0NlUUFBQVFBU0FBQUR6UUs4QUF3QUlFQWRDZ1VDQVFBQlRBUURBZ0FBU0UwQ0FRRUJTUUZPRWhFU0VSRUZDaHNySlJNekF5TURBeU1ETXhNVE13TE9zazNXVXJlMVV0VlBzTHBPWUFKYy9VUUNULzJ4QXJ6OW9RSmYvLzhBRWdBQUE4MERjUUFpQUtjQUFBQURBeU1DckFBQS8vOEFFZ0FBQTgwRGR3QWlBS2NBQUFBREF5VUNqUUFBQUFNQUVnQUFBODBEUndBTEFCY0FKQUJBUUQwaUhRSUZCQUZNQWdFQUNnTUpBd0VFQUFGcENBY0NCQVJJVFFZQkJRVkpCVTRNREFBQUpDTWhJQjhlSEJzYUdRd1hEQllTRUFBTEFBb2tDd29YS3dBbU5UUTJNeklXRlJRR0l6SW1OVFEyTXpJV0ZSUUdJeE1UTXdNakF3TWpBek1URXpNQmhCa1pGQllhR2hhZUdSa1dGUmtaRllLeVRkWlN0N1ZTMVUrd3VrNEM2UmdYRnhnWUZ4Y1lHQmNYR0JnWEZ4ajlkd0pjL1VRQ1QvMnhBcno5b1FKZkFQLy9BQklBQUFQTkEzRUFJZ0NuQUFBQkJ3TWlBbGdBQVFBSXNRRUJzQUd3TlNzQUFBQUJBQklBQUFKakFyd0FDd0FnUUIwTENBVUNCQUVBQVV3REFRQUFTRTBDQVFFQlNRRk9FaElTRUFRS0dpc0JNd01CSXdNREl4TURNeE1CNVdMckFRZGgxTUphOCtsaXRBSzgvclQra0FFei9zMEJhd0ZSL3VnQUFRQVNBQUFDUlFLOEFBZ0FIVUFhQ0FVQ0F3QUJBVXdDQVFFQlNFMEFBQUJKQUU0U0VoQURDaGtySVNNUkF6TVRFek1EQVZGSzlWZkZ3MVQwQVJnQnBQNmhBVi8rWEFELy93QVNBQUFDUlFOeEFDSUFyUUFBQUFNREl3SHNBQUQvL3dBU0FBQUNSUU4zQUNJQXJRQUFBQU1ESlFITkFBQUFBd0FTQUFBQ1JRTkhBQXNBRndBZ0FEdEFPQ0FkR2dNRUJRRk1BZ0VBQ0FNSEF3RUZBQUZwQmdFRkJVaE5BQVFFU1FST0RBd0FBQjhlSEJzWkdBd1hEQllTRUFBTEFBb2tDUW9YS3hJbU5UUTJNeklXRlJRR0l6SW1OVFEyTXpJV0ZSUUdJd01qRVFNekV4TXpBOFFaR1JRV0dob1duaGtaRmhVWkdSVTdTdlZYeGNOVTlBTHBHQmNYR0JnWEZ4Z1lGeGNZR0JjWEdQMFhBUmdCcFA2aEFWLytYUC8vQUJML1ZBSkZBcndBSWdDdEFBQUFBd011QWFzQUFQLy9BQklBQUFKRkEzRUFJZ0N0QUFBQkJ3TWlBWmdBQVFBSXNRRUJzQUd3TlNzQUFQLy9BQklBQUFKRkE0b0FJZ0N0QUFBQUF3TXJBajRBQVAvL0FCSUFBQUpGQTFFQUlnQ3RBQUFBQXdNcUFjMEFBUC8vQUJJQUFBSkZBM1VBSWdDdEFBQUFBd01wQWN3QUFBQUJBREFBQUFJOEFyd0FDUUFwUUNZQUFRSURCUUVCQUFKTUFBSUNBMThBQXdOSVRRQUFBQUZmQUFFQlNRRk9FUklSRVFRS0dpc0JBU0VWSVRVQklUVWhBaW4rWGdHMS9mUUJvLzUwQWVJQ2cvMi9RajRDUEVMLy93QXdBQUFDUEFOeEFDSUF0Z0FBQUFNREl3SHNBQUQvL3dBd0FBQUNQQU54QUNJQXRnQUFBQU1ESmdISUFBRC8vd0F3QUFBQ1BBTjFBQ0lBdGdBQUFRY0RJUUd1QUFFQUNMRUJBYkFCc0RVckFBQUFBZ0F3Ly9NQ0RRSVpBQ01BTHdCOVFCSWRIQUlEQkJZQkJnTW5KZ3NGQkFBR0EweExzQnRRV0VBZ0FBTUFCZ0FEQm1rQUJBUUZZUUFGQlZOTkNBY0NBQUFCWVFJQkFRRkpBVTRiUUNzQUF3QUdBQU1HYVFBRUJBVmhBQVVGVTAwSUJ3SUFBQUZoQUFFQlNVMElCd0lBQUFKaEFBSUNVUUpPV1VBUUpDUWtMeVF1SnlRa0pDUWpJZ2tLSFNzbEZCWXpNamNIQmlNaUppY0dCaU1pSmpVME5qTXlGelUwSmlNaUJ5YzJOak15RmhVQ05qYzFKaU1pQmhVVUZqTUIwUklVRGdnSERoMGpKZ1VpWERoSVgzcGJQa1pMT2sxSElTbGRPbDlqdkZvYVVURStVVUF0WFJZVkFqQUlJeWNuTEV4SFVFc09UejQ2TmpBaEpGMWMvdEV1SmxVTkxUSXRLZ0QvL3dBdy8vTUNEUUxCQUNJQXVnQUFBQU1EQXdIT0FBRC8vd0F3Ly9NQ0RRTEVBQ0lBdWdBQUFBSURHbU1BQUFELy93QXcvL01DRFFNNkFDSUF1Z0FBQUFNRFNnR3RBQUQvL3dBdy8xWUNEUUxFQUNJQXVnQUFBQ01ERHdHTEFBQUFBd01JQWEwQUFQLy9BREQvOHdJTkF6b0FJZ0M2QUFBQUF3TkxBYTBBQVAvL0FERC84d0lOQTFVQUlnQzZBQUFBQXdOTUFhMEFBUC8vQURELzh3SU5BMElBSWdDNkFBQUFBd05OQWEwQUFQLy9BREQvOHdJTkFzRUFJZ0M2QUFBQUF3TUhBYXNBQVAvL0FERC84d0lOQXNjQUlnQzZBQUFBQWdNWWFRQUFBUC8vQURELzh3SU5BeVVBSWdDNkFBQUFBd05PQWE4QUFQLy9BREQvVmdJTkFzY0FJZ0M2QUFBQUl3TVBBWXNBQUFBREF3WUJyd0FBLy84QU1QL3pBZzBESlFBaUFMb0FBQUFEQTA4QnJ3QUEvLzhBTVAvekFnMEROQUFpQUxvQUFBQURBMUFCcndBQS8vOEFNUC96QWcwRFFnQWlBTG9BQUFBREExRUJyd0FBLy84QU1QL3pBZzBDd3dBaUFMb0FBQUFDQXhOckFBQUEvLzhBTVA5V0FnMENHUUFpQUxvQUFBQURBdzhCaXdBQS8vOEFNUC96QWcwQ3dRQWlBTG9BQUFBREF3SUJlZ0FBLy84QU1QL3pBZzBDMndBaUFMb0FBQUFEQXd3QmlBQUEvLzhBTVAvekFnMENvQUFpQUxvQUFBQURBd3NCcndBQUFBSUFNUDgwQWhBQ0dRQXdBRHdBWGtCYkh4NENBZ01ZQVFjQ05ETXJEUVFGQndvQkFRVUJBUVlCQlV3QUFnQUhCUUlIYVFBREF3UmhBQVFFVTAwS0NBSUZCUUZoQUFFQlVVMEpBUVlHQUdJQUFBQk5BRTR4TVFBQU1Ud3hPemMxQURBQUx5VWtKQ1FxSXdzS0hDc0VOd2NHSXlJbU5UUTJOeVltSndZR0l5SW1OVFEyTXpJWE5UUW1JeUlISnpZMk16SVdGUkVVRmpNeU53Y0dGUlF6SmpZM05TWWpJZ1lWRkJZekFnUU1CUk1XSmlvaEhSMGhCU0pjT0VoZmVscytSa3M2VFVjaEtWMDZYMk1TRkE0SUJ6TWs0bG9hVVRFK1VVQXRuQUlyQnlnaEhrSWZBeU1rSnl4TVIxQkxEazgrT2pZd0lTUmRYUDc5RmhVQ01FRTFLczB1SmxVTkxUSXRLZ0FBQVAvL0FERC84d0lOQXZVQUlnQzZBQUFBQXdNSkFhOEFBUC8vQURELzh3SU5Bc1VBSWdDNkFBQUFBZ01jVkFBQUFBQURBREQvOUFOV0FoZ0FMQUF6QUQ4QTMwdXdGRkJZUUJNcEl5SURCQVVjQVFBRU5CRU1Dd1FCQUFOTUcwQVVLU01pQXdRRk5CRU1Dd1FCQUFKTUhBRUpBVXRaUzdBVVVGaEFKUTBKQWdRS0FRQUJCQUJwQ0FFRkJRWmhEQWNDQmdaVFRRc0JBUUVDWVFNQkFnSlJBazRiUzdBV1VGaEFLZ0FFQ1FBRVdRMEJDUW9CQUFFSkFHa0lBUVVGQm1FTUJ3SUdCbE5OQ3dFQkFRSmhBd0VDQWxFQ1RodEFLd0FFQUFvQUJBcHBEUUVKQUFBQkNRQm5DQUVGQlFaaERBY0NCZ1pUVFFzQkFRRUNZUU1CQWdKUkFrNVpXVUFjTFMwQUFEMDdOelV0TXkwek1TOEFMQUFySkNRa0l5VWlGQTRLSFNzQUZoVVVCeUVXRmpNeU5qY1hCZ1lqSWljR0JpTWlKalUwTmpNeUZ6VTBKaU1pQnljMk5qTXlGaGMyTmpNWEppWWpJZ1lIQnlZaklnWVZGQll6TWpZM0F1dHJBdjZGQlZ0T01GWWRIQ0pqUUl3L0lXMUVVR1NDWWo0K1JUMVRTU0lzV3o1RlVCY2VaVCtMQTBsR1NGWUVTVU02UzFGRE5FTmVBUUlZam5BUEhsdGZJaHN2SWl0dk5EdFNTMVpNRERCQlFUVXlIeU14TmpNMDhWZGNYbFU3REN3NE5TMUhPd0FDQUZiLzh3SWxBdkFBRkFBaUFHOUFDUmdYRUFFRUJBVUJURXV3R0ZCWVFDRUdBUU1EU2swSEFRVUZBR0VBQUFCVFRRQUNBa2xOQUFRRUFXRUFBUUZSQVU0YlFDRUdBUU1BQTRVSEFRVUZBR0VBQUFCVFRRQUNBa2xOQUFRRUFXRUFBUUZSQVU1WlFCUVZGUUFBRlNJVklSd2FBQlFBRkJRbUpBZ0tHU3NURVRNMk5qTXlGaFlWRkFZR0l5SW1KeU1ISXhFU0JnY1ZGaFl6TWpZMk5UUW1JNTRDSDFneVFXTTRQRzVKTGxFYkF3NHh1MDBtRjBzek1Fd3NWMFVDOFA3YkpTaytlRk5aZ1VNa0l6b0M4UDdvS3pIK0l5ZzFaRU5lYXdBQUFRQXcvL01COFFJWkFCb0FNa0F2RHc0Q0F3RUFBVXdCQVFBQlN3QUFBQU5oQkFFREExTk5BQUVCQW1FQUFnSlJBazRBQUFBYUFCa2tKU1FGQ2hrckFCY0hKaVlqSWdZVkZCWVdNekkzRndZR0l5SW1KalUwTmpZekFaeEtKaUZBTDFGbE1WTTBVa2dsSUdNL1NIUkRSWE5FQWhsQU14b1piV05EWURNNU1CNHJRWDVYVlh0QS8vOEFNUC96QWZFQ3dRQWlBTk1BQUFBREF3TUIzZ0FBLy84QU1QL3pBZkVDd1FBaUFOTUFBQUFDQXhsMUFBQUFBQUVBTVA4d0FmRUNHUUEwQUZwQVZ5NHRJUU1GQkJZQkJnVXlGUUlDQnhRSkFnRUNDQUVBQVFWTUlBRUVBVXNJQVFjQUFnRUhBbWtBQkFRRFlRQURBMU5OQUFVRkJtRUFCZ1pSVFFBQkFRQmhBQUFBVlFCT0FBQUFOQUF6RkNVa0tpUWxKQWtLSFNzRUZoVVVCaU1pSmljM0ZoWXpNalkxTkNZaklnY25OeTRDTlRRMk5qTXlGd2NtSmlNaUJoVVVGaFl6TWpjWEJnWUhCell6QVZVdU95NFZLUXNMQ1NFUkZoMFlFaGNOR0NkQVl6aEZjMFJ3U2lZaFFDOVJaVEZUTkZKSUpSOWdQQ0VJRmp3bEhTY3JEQWtyQ0FzUkVROFJCeHRDQ0VSNFVGVjdRRUF6R2hsdFkwTmdNemt3SFNzQk5RWUFBUC8vQURELzh3SHhBc2NBSWdEVEFBQUFBd01HQWI4QUFQLy9BREQvOHdIeEFzVUFJZ0RUQUFBQUF3TVVBTW9BQUFBQ0FERC84d0g3QXZBQUVnQWdBSEpBREFrQkJBQVdGUTREQlFRQ1RFdXdHRkJZUUNFQUFRRktUUUFFQkFCaEFBQUFVMDBBQWdKSlRRY0JCUVVEWVFZQkF3TlJBMDRiUUNFQUFRQUJoUUFFQkFCaEFBQUFVMDBBQWdKSlRRY0JCUVVEWVFZQkF3TlJBMDVaUUJRVEV3QUFFeUFUSHhrWEFCSUFFUkVTSmdnS0dTc1dKaVkxTkRZMk16SVhFVE1SSXljakJnWWpOalkzRVNZaklnWUdGUlFXRmpQY2FVTS9hRDFsT2tneURRTWRWUzgxU3hzL1ZDdE1MeTlNS2cwNGUxOVpmRDg2QVJIOUVENGdLMElwSkFFVFF5MWVSMFZmTFFBQ0FERC84d0llQXZJQUd3QW9BRGhBTlE4QkF3SUJUQnNhR1JjV0ZCTVNFUWtCU2dBQ0FnRmhBQUVCVTAwRUFRTURBR0VBQUFCUkFFNGNIQndvSENjaklTWWtCUW9ZS3dFV0ZSUUdJeUltSmpVME5qWXpNaGNtSndjbk55WW5OeFlYTnhjQ05qVTBKaVlqSWdZVkZCWXpBWXFVZzNORGNVUkNiVUZvT3lkTGdCWnVIVEVnT0RCa0ZtaGZMbEF6VGx0ZlR3S09qdVdPbWp4OFcxdDdPMHhnUno4cU5oY2NMQjBtTVNuOWZYRmhRRjh5YjJKaGNRRC8vd0F3Ly9NQ2RBTHdBQ0lBMlFBQUFBTURCUUtjQUFBQUFnQXcvL01DTVFMd0FCb0FLQUNFUUF3VEFRZ0RLQnNGQXdrSUFreExzQmhRV0VBcUNnY0NCUVFCQUFNRkFHY0FCZ1pLVFFBSUNBTmhBQU1EVTAwQUFRRkpUUUFKQ1FKaEFBSUNVUUpPRzBBcUFBWUZCb1VLQndJRkJBRUFBd1VBWndBSUNBTmhBQU1EVTAwQUFRRkpUUUFKQ1FKaEFBSUNVUUpPV1VBVUFBQW1KQjRjQUJvQUdoRVJFaVlrRVJFTENoMHJBUlVqRVNNbkl3WUdJeUltSmpVME5qWXpNaGMxSXpVek5UTVZBeVlqSWdZR0ZSUVdGak15TmpjQ01UWXlEUU1kVlM4OGFVTS9hRDFsT205dlNFZy9WQ3RNTHk5TUtpNUxHd0tpTVAyT1BpQXJPSHRmV1h3L09wTXdUazcrODBNdFhrZEZYeTBwSkFBQUFnQXcvL01DQndJWkFCZ0FId0E5UURvTkRBSUJBQUZNQUFRQUFBRUVBR2NIQVFVRkEyRUdBUU1EVTAwQUFRRUNZUUFDQWxFQ1Roa1pBQUFaSHhrZUhCc0FHQUFYSlNJVkNBb1pLd0FXRmhVVUJ5RVdGak15TmpjWEJnWWpJaVltTlRRMk5qTUdCZ2NoSmlZakFXdG5OUVQrZGdoZlVUUlZIeVlxYUVoRGIwTTliMGxKWGdVQlNnTlBTZ0laUUhCRkhSaGdYU0ViTHlRb1BYcFpWMzFDUGw1VVVtQUFBQUQvL3dBdy8vTUNCd0xCQUNJQTNRQUFBQU1EQXdIZ0FBRC8vd0F3Ly9NQ0J3TEVBQ0lBM1FBQUFBSURHblVBQUFELy93QXcvL01DQndMQkFDSUEzUUFBQUFJREdYY0FBQUQvL3dBdy8vTUNCd0xIQUNJQTNRQUFBQUlER0hzQUFBRC8vd0F3Ly9NQ0J3TWxBQ0lBM1FBQUFBTURUZ0hCQUFELy93QXcvMVlDQndMSEFDSUEzUUFBQUNNRER3R2NBQUFBQXdNR0FjRUFBUC8vQURELzh3SUhBeVVBSWdEZEFBQUFBd05QQWNFQUFQLy9BREQvOHdJSEF6UUFJZ0RkQUFBQUF3TlFBY0VBQVAvL0FERC84d0lIQTBJQUlnRGRBQUFBQXdOUkFjRUFBUC8vQURELzh3SUhBc01BSWdEZEFBQUFBZ01UZlFBQUFQLy9BREQvOHdJSEFzVUFJZ0RkQUFBQUF3TVVBTXdBQVAvL0FERC9WZ0lIQWhrQUlnRGRBQUFBQXdNUEFad0FBUC8vQURELzh3SUhBc0VBSWdEZEFBQUFBd01DQVl3QUFQLy9BREQvOHdJSEF0c0FJZ0RkQUFBQUF3TU1BWnNBQVAvL0FERC84d0lIQXFBQUlnRGRBQUFBQXdNTEFjRUFBQUFDQUREL01BSUhBaGtBSndBdUFGRkFUZzBNQWdFQUhRRUVBUlVCQWdRRFRBQUdBQUFCQmdCbkNRRUhCd1ZoQ0FFRkJWTk5BQUVCQkdFQUJBUlJUUUFDQWdOaEFBTURWUU5PS0NnQUFDZ3VLQzByS2dBbkFDWWxJeWdpRlFvS0d5c0FGaFlWRkFjaEZoWXpNalkzRndZSEJoVVVNekkzQndZaklpWTFORGNHSXlJbUpqVTBOall6QmdZSElTWW1Jd0ZyWnpVRS9uWUlYMUUwVlI4bVBrMHZKQTBNQlJNV0ppbzVDQkJEYjBNOWIwbEpYZ1VCU2dOUFNnSVpRSEJGSFJoZ1hTRWJMelVRUFRNcUFpc0hLQ0U0UXdFOWVsbFhmVUkrWGxSU1lBQUEvLzhBTVAvekFnY0N4UUFpQU4wQUFBQUNBeHhtQUFBQUFBSUFNUC96QWdjQ0dRQVlBQjhBUFVBNkZSUUNBUUlCVEFBQkFBUUZBUVJuQUFJQ0EyRUdBUU1EVTAwSEFRVUZBR0VBQUFCUkFFNFpHUUFBR1I4Wkhod2JBQmdBRnlJVkpnZ0tHU3NBRmhZVkZBWUdJeUltSmpVME55RW1KaU1pQmdjbk5qWXpFalkzSVJZV013RlZiME05YjBsR1p6VUVBWW9JWDFFMFZSOG1LbWhJU1Y0Ri9yWURUMG9DR1QxNldWZDlRa0J3UlIwWVlGMGhHeThrS1A0WVhsUlNZQUFBQUFFQUpnQUFBVllDL1FBVUFEZEFOQUVCQUFZQ0FRRUFBa3dIQVFZQUFBRUdBR2tFQVFJQ0FWOEZBUUVCUzAwQUF3TkpBMDRBQUFBVUFCTVJFUkVSRWlNSUNod3JBQmNISmlNaUZSVXpGU01SSXhFak5UTTFORFl6QVRVaERSZ2RWb1dGU1U5UFVFUUMvUXM3QjAxbFBmNHhBYzg5WTBoR0FBSUFNUDhwQWdZQ0dRQWRBQ29BaDBBWUFnRUdBQ2NtQWdVR0RRRUNBd3dCQVFJRVRCTUJCUUZMUzdBaFVGaEFKZ0FBQUV0TkNBRUdCZ1JoQndFRUJGTk5BQVVGQTJFQUF3TkpUUUFDQWdGaEFBRUJWUUZPRzBBa0FBVUFBd0lGQTJrQUFBQkxUUWdCQmdZRVlRY0JCQVJUVFFBQ0FnRmhBQUVCVlFGT1dVQVZIaDRBQUI0cUhpa2tJZ0FkQUJ3a0pDTVVDUW9hS3dBV0Z6TTNNeEVVQmlNaUppYzNGak15TmpVMUJpTWlKaVkxTkRZMk13WUdGUlFXTXpJMk54RW1KaU1CV2s0YkJCVXFlMm84WmlRZ1JGeEpXME5mUTJ3K1NISkJSMmhkU3l4UEh4WkZMd0laSHhrci9mOXljQ01jTnpSRVIxbEFPM0pSV0hrN1FXZGhYR1VtSmdFQUdpTUEvLzhBTVA4cEFnWUN4QUFpQVBFQUFBQUNBeHAzQUFBQS8vOEFNUDhwQWdZQ3dRQWlBUEVBQUFBREF3Y0J2d0FBLy84QU1QOHBBZ1lDeHdBaUFQRUFBQUFEQXdZQndnQUFBQU1BTVA4cEFnWUMxUUFEQUNFQUxnQ2RRQmdHQVFnQ0t5b0NCd2dSQVFRRkVBRURCQVJNRndFSEFVdExzQ0ZRV0VBd0FBQUFBVjhBQVFGS1RRQUNBa3ROQ2dFSUNBWmhDUUVHQmxOTkFBY0hCV0VBQlFWSlRRQUVCQU5oQUFNRFZRTk9HMEF1QUFjQUJRUUhCV2tBQUFBQlh3QUJBVXBOQUFJQ1MwMEtBUWdJQm1FSkFRWUdVMDBBQkFRRFlRQURBMVVEVGxsQUZ5SWlCQVFpTGlJdEtDWUVJUVFnSkNRakZSRVFDd29jS3dFak56TVdGaGN6TnpNUkZBWWpJaVluTnhZek1qWTFOUVlqSWlZbU5UUTJOak1HQmhVVUZqTXlOamNSSmlZakFVdEhKaWNKVGhzRUZTcDdhanhtSkNCRVhFbGJRMTlEYkQ1SWNrRkhhRjFMTEU4ZkZrVXZBa0dVdkI4WksvMy9jbkFqSERjMFJFZFpRRHR5VVZoNU8wRm5ZVnhsSmlZQkFCb2pBQUFBLy84QU1QOHBBZ1lDeFFBaUFQRUFBQUFEQXhRQXpRQUFBQUVBVmdBQUFmd0M4QUFUQUVtMkR3QUNBUUlCVEV1d0dGQllRQllBQkFSS1RRQUNBZ0JoQUFBQVUwMERBUUVCU1FGT0cwQVdBQVFBQklVQUFnSUFZUUFBQUZOTkF3RUJBVWtCVGxtM0VSSWpGQ0lGQ2hzckV6WTJNeklXRmhVUkl4RTBKaU1pQnhFakVUT2RKMUkwTUZFeFNFYzNWa0pJUndIQkxpb25UemorbFFGWlJEcGwvbzRDOEFBQUFRQWxBQUFCL0FMd0FCc0FhYllZQ3dJQUFRRk1TN0FZVUZoQUlRWUJCQWNCQXdnRUEyY0FCUVZLVFFBQkFRaGhDUUVJQ0ZOTkFnRUFBRWtBVGh0QUlRQUZCQVdGQmdFRUJ3RURDQVFEWndBQkFRaGhDUUVJQ0ZOTkFnRUFBRWtBVGxsQUVRQUFBQnNBR2hFUkVSRVJFaU1VQ2dvZUt3QVdGaFVSSXhFMEppTWlCeEVqRVNNMU16VXpGVE1WSXhVMk5qTUJlbEV4U0VjM1ZrSklNVEZIZFhVblVqUUNHU2RQT1A2VkFWbEVPbVgramdKeU1FNU9NTEV1S3YvLy8vY0FBQUg4QTZzQUlnRDNBQUFCQndNbEFSVUFOQUFJc1FFQnNEU3dOU3NBQVAvL0FFZ0FBQUN1QXNVQUlnRDdBQUFBQXdNQkFQWUFBQUFCQUZjQUFBQ2ZBZ3dBQXdBVFFCQUFBQUJMVFFBQkFVa0JUaEVRQWdvWUt4TXpFU05YU0VnQ0RQMzAvLzhBUlFBQUFQTUN3UUFpQVBzQUFBQURBd01CTkFBQS8vLy84QUFBQVFNQ3hBQWlBUHNBQUFBREF3Z0JFd0FBLy8vLzh3QUFBUGtDd1FBaUFQc0FBQUFEQXdjQkVRQUEvLy8vOXdBQUFQMEN4d0FpQVBzQUFBQURBd1lCRlFBQS8vLy8rUUFBQVBvQ3d3QWlBUHNBQUFBQ0F4UFJBQUFBLy84QVNBQUFBSzRDeFFBaUFQc0FBQUFEQXdFQTlnQUEvLzhBU1A5V0FLNEN4UUFpQVBvQUFBQURBdzhBK3dBQS8vLy83UUFBQUo4Q3dRQWlBUHNBQUFBREF3SUE0QUFBLy84QU1nQUFBTWNDMndBaUFQc0FBQUFEQXd3QTd3QUEvLzhBU1A4d0FhMEN4UUFpQVBvQUFBQURBUWtBOVFBQS8vOEFCd0FBQU8wQ29BQWlBUHNBQUFBREF3c0JGUUFBQUFJQUt2OHdBSzRDeFFBTEFCOEFRRUE5RHdFQ0JBRk1IQUVFQVVzR0FRRUJBR0VBQUFCUVRRQUZCVXROQUFRRVNVMEFBZ0lEWVFBREExVURUZ0FBR3hvWkdCTVJEZ3dBQ3dBS0pBY0tGeXNTSmpVME5qTXlGaFVVQmlNQ016STNCd1lqSWlZMU5EWTNJeEV6RVNNR0ZXVWRIUlVWSHg4VkR5UU5EQVVURmlZcUpTQVlTQUV6QWw4YUdSa2FHaGtaR3YwQkFpc0hLQ0VmU0NBQ0RQMzBRVFVBQUFELy8vL2pBQUFCQ2dMRkFDSUErd0FBQUFJREhMc0FBQUQvLy8rOS96QUF1QUxGQUNJQkNnQUFBQU1EQVFFQUFBQUFBZis5L3pBQXFRSU1BQTBBS1VBbUFnRUFBUUVCQWdBQ1RBQUJBVXROQUFBQUFtRURBUUlDVlFKT0FBQUFEUUFNRXlNRUNoZ3JCaWMzRmpNeU5qVVJNeEVVQmlNbUhRMFhHek15U0ZwSTBBczhCeTQzQWpmOXMwaEhBUC8vLzczL01BRCtBc0VBSWdFS0FBQUFBd01EQVQ4QUFQLy8vNzMvTUFFSUFzY0FJZ0VLQUFBQUF3TUdBU0FBQUFBQkFGWUFBQUlDQXZBQUN3QS90d2tFQXdNQUF3Rk1TN0FZVUZoQUVRQUNBa3BOQUFNRFMwMEJBUUFBU1FCT0cwQVJBQUlEQW9VQUF3TkxUUUVCQUFCSkFFNVp0aElSRXhFRUNob3JBUk1qSndjVkl4RXpFUk16QVJYdFhNRkhTRWpzVlFFdi90SDZUcXdDOFA0UkFRdi8vd0JXL3pjQ0FnTHdBQ0lCRFFBQUFBTURFQUYwQUFBQUFRQldBQUFBbmdMd0FBTUFLRXV3R0ZCWVFBc0FBQUJLVFFBQkFVa0JUaHRBQ3dBQUFRQ0ZBQUVCU1FGT1diUVJFQUlLR0NzVE14RWpWa2hJQXZEOUVBQUFBUC8vQUQwQUFBRHNBNlVBSWdFUEFBQUJCd01qQVM0QU5BQUlzUUVCc0RTd05Tc0FBUC8vQUZZQUFBRVhBdkFBSWdFUEFBQUFBd01GQVQ4QUFQLy9BRkgvTndDZUF2QUFJZ0VQQUFBQUF3TVFBT2tBQVAvL0FGWUFBQUZHQXZBQUlnRVBBQUFBQXdLb0FQUUFBQUFCQUFVQUFBRDhBdkFBQ3dBM1FBMEpDQWNHQXdJQkFBZ0FBUUZNUzdBWVVGaEFDd0FCQVVwTkFBQUFTUUJPRzBBTEFBRUFBWVVBQUFCSkFFNVp0QlVVQWdvWUt4TTNGUWNSSXhFSE5UY1JNNkJjWEVoVFUwZ0IxakJFTWY1dkFXc3NSU3dCUUFBQUFBRUFWZ0FBQXlNQ0dRQWlBRFpBTXg4WUV3b0VBQUVCVEFBRkJVdE5Bd0VCQVFaaENBY0NCZ1pUVFFRQ0FnQUFTUUJPQUFBQUlnQWhKQkVUSXhNaUV3a0tIU3NBRmhVUkl4RTBJeUlHQnhFakVUUW1JeUlHQnhFakVUTVhNelkyTXpJV0Z6WTJNd0xMV0Vsa0xVZ2dTVG9yTDAwWVNUZ01BeUZITmpsSUZpVlVNZ0laWFZuK25RRmdlREl6L28wQlpENDJPQzMralFJTVRDNHJMVEV5TEFBQkFGWUFBQUg4QWhrQUZBQXVRQ3NUQXdJQ0F3Rk1BQUFBUzAwQUF3TUJZUUFCQVZOTkJRUUNBZ0pKQWs0QUFBQVVBQlFqRXlRUkJnb2FLek1STXhjek5qWXpNaFlWRVNNUk5DWWpJZ1lIRVZZekN3TW1WVDVTV2tnM05UVlZJZ0lNVVM0d1dGWCtsQUZZUmprek5mNlJBQUFBLy84QVZnQUFBZndDd1FBaUFSWUFBQUFEQXdNQjRBQUEvLzhBVmdBQUFmd0N3UUFpQVJZQUFBQUNBeGwzQUFBQS8vOEFWdjgzQWZ3Q0dRQWlBUllBQUFBREF4QUJsQUFBQUFFQVZ2OHdBZndDR1FBZEFFQkFQUndEQWdVRUVRRURCUkFCQWdNRFRBQUFBRXROQUFRRUFXRUFBUUZUVFFZQkJRVkpUUUFEQXdKaEFBSUNWUUpPQUFBQUhRQWRKU01sSkJFSENoc3JNeEV6RnpNMk5qTXlGaFVSRkFZaklpYzNGak15TmpVUk5DWWpJZ2NSVmpNTEF5VldPbFZiV2tna0p4SWRHQ3N6T0RWb1F3SU1VUzB4VjFiK1UwcEZDajBKTlRFQmhFWTVhUDZSQUFBQS8vOEFWZ0FBQWZ3Q3hRQWlBUllBQUFBQ0F4eG1BQUFBQUFJQU1QL3pBaWtDR1FBUEFCc0FMRUFwQlFFREF3RmhCQUVCQVZOTkFBSUNBR0VBQUFCUkFFNFFFQUFBRUJzUUdoWVVBQThBRGlZR0NoY3JBQllXRlJRR0JpTWlKaVkxTkRZMk13WUdGUlFXTXpJMk5UUW1Jd0Z4Y2taR2NrVkVja1pHY2tSUllXRlJVbUJnVWdJWk8zeGNYSHc3TzN4Y1hIdzdRVzlqWTI5d1ltSncvLzhBTVAvekFpa0N3UUFpQVJ3QUFBQURBd01CNWdBQS8vOEFNUC96QWlrQ3hBQWlBUndBQUFBREF3Z0J4Z0FBLy84QU1QL3pBaWtDd1FBaUFSd0FBQUFEQXdjQnhBQUEvLzhBTVAvekFpa0N4d0FpQVJ3QUFBQURBeGdBZ1FBQS8vOEFNUC96QWlrREpRQWlBUndBQUFBREEwNEJ4d0FBLy84QU1QOVdBaWtDeHdBaUFSd0FBQUFqQXc4QnJBQUFBQU1EQmdISEFBRC8vd0F3Ly9NQ0tRTWxBQ0lCSEFBQUFBTURUd0hIQUFELy93QXcvL01DS1FNMEFDSUJIQUFBQUFNRFVBSEhBQUQvL3dBdy8vTUNLUU5DQUNJQkhBQUFBQU1EVVFISEFBRC8vd0F3Ly9NQ0tRTERBQ0lCSEFBQUFBTURFd0NFQUFELy93QXcvMVlDS1FJWkFDSUJIQUFBQUFNRER3R3NBQUQvL3dBdy8vTUNLUUxCQUNJQkhBQUFBQU1EQWdHU0FBRC8vd0F3Ly9NQ0tRTGJBQ0lCSEFBQUFBTUREQUdoQUFBQUFnQXcvL01DS1FLQ0FCc0FKd0J0UzdBWVVGaTFHd0VFQVFGTUc3VWJBUVFDQVV4WlM3QVlVRmhBSEFBREFRT0ZBQVFFQVdFQ0FRRUJVMDBHQVFVRkFHRUFBQUJSQUU0YlFDQUFBd0VEaFFBQ0FrdE5BQVFFQVdFQUFRRlRUUVlCQlFVQVlRQUFBRkVBVGxsQURod2NIQ2NjSmlnVEl5WWxCd29iS3dBV0ZSUUdCaU1pSmlZMU5EWTJNeklYRmhZek1qWTFOVE1WRkFjQ05qVTBKaU1pQmhVVUZqTUIrVEJHY2tWRWNrWkdja1FZSEFja0RpQWNRa2hSWUdCU1VXRmhVUUhBYjB0Y2ZEczdmRnhjZkRzRkFRUWFHejQ4VHhUK1VYQmlZbkJ2WTJOdkFBRC8vd0F3Ly9NQ0tRTEJBQ0lCS2dBQUFBTURBd0htQUFELy93QXcvMVlDS1FLQ0FDSUJLZ0FBQUFNRER3R3NBQUQvL3dBdy8vTUNLUUxCQUNJQktnQUFBQU1EQWdHU0FBRC8vd0F3Ly9NQ0tRTGJBQ0lCS2dBQUFBTUREQUdoQUFELy93QXcvL01DS1FMRkFDSUJLZ0FBQUFJREhHMEFBQUQvL3dBdy8vTUNLUUxDQUNJQkhBQUFBQU1ERndDbkFBRC8vd0F3Ly9NQ0tRS2dBQ0lCSEFBQUFBTURDd0hIQUFBQUF3QXcvNmdDS1FKa0FCY0FId0FvQUVkQVJCVUJBZ0VtSlIwY0JBTUNEQWtDQUFNRFRCY1dBZ0ZLQ3dvQ0FFa0VBUUlDQVdFQUFRRlRUUVVCQXdNQVlRQUFBRkVBVGlBZ0dCZ2dLQ0FuR0I4WUhpb21CZ29ZS3dFV0ZoVVVCZ1lqSWljSEp6Y21KalUwTmpZek1oYzNGd1FHRlJRWEV5WWpFalkxTkNZbkF4WXpBY0V3T0VaeVJUY3ZNUzh5TVRkR2NrUTZMakV0L3VsaFByNGlLRkpnSUI2OElpWUI3aUoxVVZ4OE94TmVHRjhoZEZKY2ZEc1VYeGgwYjJOd09RRnREdjVjY0dJNFZocitsQTcvL3dBdy8vTUNLUUxGQUNJQkhBQUFBQUlESEcwQUFBQUFBd0F3Ly9NRHFnSVpBQ1FBS3dBM0FGRkFUaUVCQndZVERRd0RBUUFDVEFzQkJ3QUFBUWNBWndnQkJnWUVZUW9GQWdRRVUwME1DUUlCQVFKaEF3RUNBbEVDVGl3c0pTVUFBQ3czTERZeU1DVXJKU3NwSndBa0FDTW1KQ1FqRlEwS0d5c0FGaFlWRkFjaEhnSXpNamNYQmdZaklpWW5CZ1lqSWlZbU5UUTJOak15RmhjMk5qTVhKaVlqSWdZSEJqWTFOQ1lqSWdZVkZCWXpBd3BwTndQK2V3RWdUMEZlUmlRbFpEOUtkUjBaZUVWQ2JrRkNia0pEZGhzWmIwYWJBbFZIUjFRRXJGdGJVRTlmWDA4Q0dVRnpTUllZSzFVOVB6RWhLMEZEUVVOQmZGWldmRUZEUkVSRDhWSmhYbFgwY0dKaWNIQmlZWEVBQUFBQ0FGYi9NZ0lhQWhrQUV3QWhBRVJBUVJjV0R3TUVCUW9CQUFRQ1RBQUNBa3ROQndFRkJRTmhCZ0VEQTFOTkFBUUVBR0VBQUFCUlRRQUJBVTBCVGhRVUFBQVVJUlFnR3hrQUV3QVNFUk1tQ0FvWkt3QVdGaFVVQmdZaklpWW5GU01STXhjek5qWXpCZ1lIRVJZV016STJOalUwSmlNQmdHRTVRMjArTGtJZVNETVBBeUZSTnp0TElCMDRLeXhTTkZnL0FoazZkbGRVZzBnVEUrY0Myazh1TGtFMk4vN3hGeE0wWkVWbFpBQUFBQUlBVnY4eUFob0M4QUFUQUNFQWNrQU1GeFlCQXdRRkVBRUJCQUpNUzdBWVVGaEFJUVlCQXdOS1RRY0JCUVVBWVFBQUFGTk5BQVFFQVdFQUFRRlJUUUFDQWswQ1RodEFJUVlCQXdBRGhRY0JCUVVBWVFBQUFGTk5BQVFFQVdFQUFRRlJUUUFDQWswQ1RsbEFGQlFVQUFBVUlSUWdHeGtBRXdBVEV5WWtDQW9aS3hNUk16WTJNeklXRmhVVUJnWWpJaVluRlNNUkVnWUhFUllXTXpJMk5qVTBKaU9hQXlCUU56MWhPRU50UFM1REhraXpTeUFkTnl3c1VqUllQd0x3L3M4c0xqcDJWMVNEU0JNVDV3TysvdWczTnY3eEdCSXpaVVZsWkFBQ0FERC9NZ0grQWhrQUVRQWZBRWRBUkFFQkJRQWRIQUlFQlFjQkFnUURUQUFBQUV0TkJ3RUZCUU5oQmdFREExTk5BQVFFQW1FQUFnSlJUUUFCQVUwQlRoSVNBQUFTSHhJZUdoZ0FFUUFRSWhFVENBb1pLd0FYTXpjekVTTTFCaU1pSmlZMU5EWTJNdzRDRlJRV0ZqTXlOamNSSmlNQmZqNERHQ2RJUDFnOGJrVkljVDhyVVRFM1R5Y3VRaDQ4VEFJWk9DdjlKdTh1UG4xWVdudzlRaTVmUmtoZEtoMFhBVEk4QUFBQUFRQldBQUFCVkFJWkFBOEFNVUF1Q1FFQUFRNEtBd01EQWdKTUFBQUFTMDBBQWdJQllRQUJBVk5OQkFFREEwa0RUZ0FBQUE4QUR5TWtFUVVLR1NzekVUTVhNelkyTXpJWEJ5WWpJZ2NSVmpZT0F4RkVMQ01URFJnY1VpUUNERTB0TFF4Q0NIRCtuZi8vQUZZQUFBRlVBc0VBSWdFNEFBQUFBd01EQVlRQUFQLy9BRU1BQUFGVUFzRUFJZ0U0QUFBQUFnTVpHd0FBQVAvL0FGWC9Od0ZVQWhrQUlnRTRBQUFBQXdNUUFPMEFBQUFCQUMvLzh3R3FBaGtBS0FBMFFERUNBUUFER0FNQ0FnQVhBUUVDQTB3QUFBQURZUVFCQXdOVFRRQUNBZ0ZoQUFFQlVRRk9BQUFBS0FBbkpTd2xCUW9aS3dBV0Z3Y21KaU1pQmhVVUZoWVhIZ0lWRkFZaklpWW5OeFlXTXpJMk5UUW1KeTRDTlRRMk13RW1WeDRiSFVra01qMGdNQ3MxUkM5cld6VmVJaG9kVUNzN1JENUFOVUF0WjFBQ0dSb1ZPQklYTGlNWkloUU9FU0E3TDBkWUh4czhHaHd6S0NZcEZSSWVPU3hEVHdBQS8vOEFMLy96QWFvQ3dRQWlBVHdBQUFBREF3TUJxd0FBLy84QUwvL3pBYW9Dd1FBaUFUd0FBQUFDQXhsQ0FBQUFBQUVBTC84d0Fhb0NHUUJDQUZKQVR6TUJCd1kwSUFJRkJ4OEJCQVViQXdJREFCb1BBZ0lERGdFQkFnWk1BQUFBQXdJQUEya0FCd2NHWVFBR0JsTk5BQVVGQkdFQUJBUlJUUUFDQWdGaEFBRUJWUUZPSlNzbEV5UWxKQ1FJQ2g0ckpBWUhCell6TWhZVkZBWWpJaVluTnhZV016STJOVFFtSXlJSEp6Y2lKaWMzRmhZek1qWTFOQ1luTGdJMU5EWXpNaFlYQnlZbUl5SUdGUlFXRmhjZUFoVUJxbEZISXdnV0lpNDdMaFVwQ3dzSklSRVdIUmdTRncwWUpqVmVJaG9kVUNzN1JENUFOVUF0WjFBdlZ4NGJIVWtrTWowZ01DczFSQzlVVXdzNEJpVWRKeXNNQ1NzSUN4RVJEeEVIRzBBZkd6d2FIRE1vSmlrVkVoNDVMRU5QR2hVNEVoY3VJeGtpRkE0UklEc3ZBQUQvL3dBdi8vTUJxZ0xIQUNJQlBBQUFBQU1EQmdHTEFBRC8vd0F2L3pjQnFnSVpBQ0lCUEFBQUFBTURFQUZwQUFBQUFRQlcvL1VDRFFMOEFETUFiRXV3RmxCWVFBb1dBUUVDRlFFQUFRSk1HMEFLRmdFQkFoVUJBd0VDVEZsTHNCWlFXRUFWQlFFRUFBSUJCQUpwQUFFQkFHRURBUUFBVVFCT0cwQVpCUUVFQUFJQkJBSnBBQU1EU1UwQUFRRUFZUUFBQUZFQVRsbEFFUUFBQURNQU1pOHVLeWtaRnhNUkJnb1dLd0FXRlJRR0J3WUdGUlFXRng0Q0ZSUUdJeUltSnpjV016STJOVFFtSnlZbU5UUTJOelkyTlRRbUl5SUdGUkVqRVRRMk13RnBZQjRjRVJJZEh4OHBIVjFRSGp3WEVUSXRNaklwS2lZbUZSWVlHVGMwT3p0SllHSUMvRkZIS2o0a0ZpQVFGU0lZR1NrL0trcFpEZ3M2RmprcktUWWpIekVqR2lrZUh6SWhMekJNWGYzc0FoTnhlQUFBQUFBQkFCMy84d0ZFQXBJQUZnQTlRRG9IQVFFQ0V3RUZBQlFCQmdVRFRBQUNBUUtGQkFFQUFBRmZBd0VCQVV0TkFBVUZCbUlIQVFZR1VRWk9BQUFBRmdBVkl4RVJFaEVUQ0FvY0t4WW1OUkVqTlRNMU56TVZNeFVqRVJRV016STNGd1lqcnpsWldTVWtnSUFZRXgwcEZERXdEVFUwQVhNOVVqU0dQZjZaR3hrUk54c0FBQUFCQUIzLzh3RkVBcElBSGdCRFFFQU9BUVFGSGdFS0FRSk1BQVVFQllVSUFRSUpBUUVLQWdGbkJ3RURBd1JmQmdFRUJFdE5BQW9LQUdJQUFBQlJBRTRkR3hnWEVSRVJFaEVSRVJNaEN3b2ZLeVVHSXlJbU5UVWpOVE0xSXpVek5UY3pGVE1WSXhVekZTTVZGQll6TWpjQlJERXdORGxDUWxsWkpTU0FnR0ppR0JNZEtRNGJOVFNyTUpnOVVqU0dQWmd3bnhzWkVRQUEvLzhBSGYvekFVb0M4QUFpQVVNQUFBQURBd1VCY2dBQUFBRUFIZjh3QVVRQ2tnQXdBR05BWUI0QkJBVXFBUWdES3hZQ0NRZ3VGUUlDQ2hRSkFnRUNDQUVBQVFaTUFBVUVCWVVMQVFvQUFnRUtBbWtIQVFNREJGOEdBUVFFUzAwQUNBZ0pZUUFKQ1ZGTkFBRUJBR0VBQUFCVkFFNEFBQUF3QUM4dExDTVJFUklSRnlRbEpBd0tIeXNFRmhVVUJpTWlKaWMzRmhZek1qWTFOQ1lqSWdjbk55WW1OUkVqTlRNMU56TVZNeFVqRVJRV016STNGd1lIQnpZekFRMHVPeTRWS1FzTENTRVJGaDBZRWhjTkdDY2xLRmxaSlNTQWdCZ1RIU2tVTFNraENCWThKUjBuS3d3Skt3Z0xFUkVQRVFjYlF3Y3pMQUZ6UFZJMGhqMyttUnNaRVRjWkFqVUdBQUFBLy84QUhmODNBVVFDa2dBaUFVTUFBQUFEQXhBQlNBQUFBQUVBVnYvMEFmY0NEQUFTQUVXMkVnUUNCQUFCVEV1d0ZGQllRQklEQVFBQVMwMEFCQVFCWVFJQkFRRkpBVTRiUUJZREFRQUFTMDBBQVFGSlRRQUVCQUpoQUFJQ1VRSk9XYmNpRXlNUkVBVUtHeXNCTXhFakp3WUdJeUltTlJFekVSUXpNalkzQWE5SU5oQWpWenhKWEVob05FNG5BZ3o5OUZBdEwxdGdBVjMrczRvMExRQUFBUC8vQUZiLzlBSDNBc0VBSWdGSUFBQUFBd01EQWVFQUFQLy9BRmIvOUFIM0FzUUFJZ0ZJQUFBQUF3TUlBY0FBQVAvL0FGYi85QUgzQXNFQUlnRklBQUFBQXdNSEFiNEFBUC8vQUZiLzlBSDNBc2NBSWdGSUFBQUFBZ01ZZkFBQUFQLy9BRmIvOUFIM0FzTUFJZ0ZJQUFBQUFnTVRmZ0FBQVAvL0FGYi85QUgzQTBNQUlnRklBQUFBQXdOR0FjRUFBUC8vQUZiLzlBSDNBMFlBSWdGSUFBQUFBd05IQWNFQUFQLy9BRmIvOUFIM0EwTUFJZ0ZJQUFBQUF3TkZBY0VBQVAvL0FGYi85QUgzQXlFQUlnRklBQUFBQXdOSUFjRUFBUC8vQUZiL1ZnSDNBZ3dBSWdGSUFBQUFBd01QQWFjQUFQLy9BRmIvOUFIM0FzRUFJZ0ZJQUFBQUF3TUNBWTBBQVAvL0FGYi85QUgzQXRzQUlnRklBQUFBQXdNTUFac0FBQUFCQUZiLzlBSlVBb0FBR2dCU3R4VUhCQU1FQXdGTVM3QVVVRmhBRndBQUF3Q0ZCUUVEQTB0TkFBUUVBV0VDQVFFQlNRRk9HMEFiQUFBREFJVUZBUU1EUzAwQUFRRkpUUUFFQkFKaEFBSUNVUUpPV1VBSkl5SVRJeFFRQmdvY0t3RXpGUlFIRVNNbkJnWWpJaVkxRVRNUkZETXlOamNSTXpJMk5RSVJRMTAyRUNOWFBFbGNTR2cwVGljbkh4d0NnRDFhRHY0bFVDMHZXMkFCWGY2emlqUXRBWFlhR3dBQUFQLy9BRmIvOUFKVUFzRUFJZ0ZWQUFBQUF3TURBZUVBQVAvL0FGYi9WZ0pVQW9BQUlnRlZBQUFBQXdNUEFhY0FBUC8vQUZiLzlBSlVBc0VBSWdGVkFBQUFBd01DQVkwQUFQLy9BRmIvOUFKVUF0c0FJZ0ZWQUFBQUF3TU1BWnNBQVAvL0FGYi85QUpVQXNVQUlnRlZBQUFBQWdNY1p3QUFBUC8vQUZiLzlBSDNBc0lBSWdGSUFBQUFBd01YQUtJQUFQLy9BRmIvOUFIM0FxQUFJZ0ZJQUFBQUF3TUxBY0lBQUFBQkFGYi9NQUgzQWd3QUlRQjlTN0FVVUZoQUR4OFJBZ1VFRUFFQUJRY0JBUUFEVEJ0QUR4OFJBZ1VFRUFFQUJRY0JBUU1EVEZsTHNCUlFXRUFjQmdFRUJFdE5BQVVGQUdFREFRQUFTVTBBQVFFQ1lRQUNBbFVDVGh0QUlBWUJCQVJMVFFBQUFFbE5BQVVGQTJFQUF3TlJUUUFCQVFKaEFBSUNWUUpPV1VBS0V5SVRLQ01qRUFjS0hTc2hJd1lWRkRNeU53Y0dJeUltTlRRMk55Y0dCaU1pSmpVUk14RVVNekkyTnhFekFmY05NeVFOREFVVEZpWXFLQ0lQSTFjOFNWeElhRFJPSjBoQk5Tb0NLd2NvSVNGS0lVc3RMMXRnQVYzK3M0bzBMUUYyLy84QVZ2LzBBZmNDOVFBaUFVZ0FBQUFEQXdrQndnQUEvLzhBVnYvMEFmY0N4UUFpQVVnQUFBQUNBeHhuQUFBQUFBRUFFQUFBQWZjQ0RBQUdBQlZBRWdJQkFBQkxUUUFCQVVrQlRoRVJFUU1LR1NzbEV6TURJd016QVFLcFROTkp5MHhMQWNIOTlBSU1BQUFBQUFFQUZRQUFBdmdDREFBTUFDQkFIUW9GQWdFQUFVd0VBd0lBQUV0TkFnRUJBVWtCVGhJUkVoRVJCUW9iS3lVVE13TWpBd01qQXpNVEV6TUNKNHRHdHplTGp6YWxTM3FQTkYwQnIvMzBBWnIrWmdJTS9sWUJxdi8vQUJVQUFBTDRBc0VBSWdGaEFBQUFBd01EQWprQUFQLy9BQlVBQUFMNEFzY0FJZ0ZoQUFBQUF3TVlBTlFBQVAvL0FCVUFBQUw0QXNNQUlnRmhBQUFBQXdNVEFOWUFBUC8vQUJVQUFBTDRBc0VBSWdGaEFBQUFBd01WQU1vQUFBQUJBQklBQUFIa0Fnd0FEd0FnUUIwUEN3Y0RCQUVBQVV3REFRQUFTMDBDQVFFQlNRRk9JeElqRUFRS0dpc0JNeFVIRXhVakp3Y2pOUk1uTlRNWEFZQlZzY0JYa1pWVndiUlhoUUlNQXZ2Kzh3TGIyd0lCRC9nRHlBQUFBQUVBSFA4eEFnNENEQUFTQUNkQUpCSVBDQU1DQUFjQkFRSUNUQU1CQUFCTFRRQUNBZ0ZoQUFFQlRRRk9GQ1FqRUFRS0dpc0JNd01HQmlNaUp6Y1dGak15TmpjM0F6TVRBY1JLemlCZFJDUWxEZ29nRFNVK0VnemdUYlVDRFAzVVZsa0xPUU1HTmpFZUFoditMZ0FBQVAvL0FCei9NUUlPQXNFQUlnRm5BQUFBQXdNREFjOEFBUC8vQUJ6L01RSU9Bc2NBSWdGbkFBQUFBZ01ZYXdBQUFQLy9BQnovTVFJT0FzTUFJZ0ZuQUFBQUFnTVRiUUFBQVAvL0FCei9NUUlPQWd3QUlnRm5BQUFBQXdNUEFnd0FBUC8vQUJ6L01RSU9Bc0VBSWdGbkFBQUFBd01DQVh3QUFQLy9BQnovTVFJT0F0c0FJZ0ZuQUFBQUF3TU1BWW9BQVAvL0FCei9NUUlPQXFBQUlnRm5BQUFBQXdNTEFiQUFBUC8vQUJ6L01RSU9Bc1VBSWdGbkFBQUFBZ01jVmdBQUFBQUJBQ2dBQUFHd0Fnd0FDUUFwUUNZQ0FRTUFCd0VDQVFKTUFBTURBRjhBQUFCTFRRQUJBUUpmQUFJQ1NRSk9FaEVTRUFRS0dpc1RJUlVCSVJVaE5RRWhNZ0YxL3RJQk4vNTRBU2orNGdJTVBQNXZQemNCbFFELy93QW9BQUFCc0FMQkFDSUJjQUFBQUFNREF3R3dBQUQvL3dBb0FBQUJzQUxCQUNJQmNBQUFBQUlER1VnQUFBRC8vd0FvQUFBQnNBTEZBQ0lCY0FBQUFBTURGQUNjQUFELy93QW1BQUFDQ1FMOUFDSUE4QUFBQUFNQStnRmJBQUQvL3dBbUFBQUI5QUw5QUNJQThBQUFBQU1CRHdGV0FBQUFBUUJZLy9RQjh3SkdBQ1VCaWt1d0NWQllRQkFsRmhVREFnTUxBUUVDQ2dFQUFRTk1HMHV3Q2xCWVFCQWxGaFVEQWdNTEFRRUNDZ0VFQVFOTUcwdXdEMUJZUUJBbEZoVURBZ01MQVFFQ0NnRUFBUU5NRzB1d0VGQllRQkFsRmhVREFnTUxBUUVDQ2dFRUFRTk1HMHV3RlZCWVFCQWxGaFVEQWdNTEFRRUNDZ0VBQVFOTUcwQVFKUllWQXdJREN3RUJBZ29CQkFFRFRGbFpXVmxaUzdBSlVGaEFIZ0FDQXdFREFnR0FBQU1EQldFQUJRVXdUUUFCQVFCaEJBRUFBREVBVGh0THNBcFFXRUFpQUFJREFRTUNBWUFBQXdNRllRQUZCVEJOQUFRRUxVMEFBUUVBWVFBQUFERUFUaHRMc0E5UVdFQWVBQUlEQVFNQ0FZQUFBd01GWVFBRkJUQk5BQUVCQUdFRUFRQUFNUUJPRzB1d0VGQllRQ0lBQWdNQkF3SUJnQUFEQXdWaEFBVUZNRTBBQkFRdFRRQUJBUUJoQUFBQU1RQk9HMHV3RlZCWVFCNEFBZ01CQXdJQmdBQURBd1ZoQUFVRk1FMEFBUUVBWVFRQkFBQXhBRTRiUUNJQUFnTUJBd0lCZ0FBREF3VmhBQVVGTUUwQUJBUXRUUUFCQVFCaEFBQUFNUUJPV1ZsWldWbEFDU01USkJRbEpnWUlIQ3NCRmhZVkZBWUdJeUltSnpjV0ZqTXlOalUwSmdjMU56UW1JeUlHRlJFakVUUTJNeklXRlFGWlExY3NUUzhZTkJRTUVDd1RMRGhLVVc0M05EYzhSMmRXVlZzQktRVklRekJMS2dzTFBBZ0tOaXd3T0FFd2RDODNRMEgrZlFHT1dHQmNWQUFBQUFJQUhBQUFBaEFDT1FBSEFBb0FIMEFjQUFRQUFRQUVBV2dBQXdNc1RRSUJBQUF0QUU0U0VSRVJFQVVJR3lzaEl5Y2hCeU1UTXdjRE13SVFTaS8rK3k1SXoxUXJiTm1GaFFJNVFmN0xBQUQvL3dBY0FBQUNFQUx1QUNJQmR3QUFBUWNETmdIUEFDMEFDTEVDQWJBdHNEVXJBQUQvL3dBY0FBQUNFQUx4QUNJQmR3QUFBUWNET2dHdUFDMEFDTEVDQWJBdHNEVXJBQUFBQkFBY0FBQUNFQU5uQUFNQUVRQVpBQndBU0VCRkFBQUJBSVVBQVFJQmhRUUJBZ01DaFFBREN3RUZDUU1GYWdBS0FBY0dDZ2RvQUFrSkxFMElBUVlHTFFaT0JBUWNHeGtZRnhZVkZCTVNCQkVFRUJJaUV4RVFEQWdiS3dFekJ5TUdKamN6QmhZek1qWW5NeFlHSXhNakp5RUhJeE16QndNekFTRlZWVGdRVVFZeUFqQW1KaTRDTlFWUk8veEtMLzc3TGtqUFZDdHMyUU5uWm5zNEx4c2VIaHN2T1AxNmhZVUNPVUgreXdBQUFQLy9BQnovVmdJUUF2RUFJZ0YzQUFBQUl3TkJBWllBQUFFSEF6b0JyZ0F0QUFpeEF3R3dMYkExS3dBQUFBUUFIQUFBQWhBRFp3QURBQkVBR1FBY0FGRkFUZ3NCQVFBQmhRQUFBZ0NGQkFFQ0F3S0ZBQU1NQVFVSkF3VnFBQW9BQndZS0IyZ0FDUWtzVFFnQkJnWXRCazRFQkFBQUhCc1pHQmNXRlJRVEVnUVJCQkFPRFFzSkJ3WUFBd0FERVEwSUZ5c1RGeU1uRmlZM013WVdNekkySnpNV0JpTVRJeWNoQnlNVE13Y0RNLzA0TjFRdlVRWXlBakFtSmk0Q05RVlJPL3hLTC83N0xralBWQ3RzMlFOblptYmhPQzhiSGg0Ykx6ajllb1dGQWpsQi9zc0FBQUFFQUJ3QUFBSVFBM2NBRGdBY0FDUUFKd0JYUUZRREFRQUJDd0VDQUFvQkF3SURUQVFCQWdBREFBSURnQUFCQUFBQ0FRQnBBQU1MQVFVSkF3VnBBQW9BQndZS0IyZ0FDUWtzVFFnQkJnWXRCazRQRHljbUpDTWlJU0FmSGgwUEhBOGJFaUliSWhFTUNCc3JBQ1lqTlRZek1oWVZGQWNuTmpZMUJpWTNNd1lXTXpJMkp6TVdCaU1USXljaEJ5TVRNd2NETXdFWktDVVNCakk1UGg0VUVrQlJCaklDTUNZbUxnSTFCVkU3L0Vvdi92c3VTTTlVSzJ6WkF6d1ZKQUluSXpFWUhnb1NES1E0THhzZUhoc3ZPUDE2aFlVQ09VSCt5d0FFQUJ3QUFBSVFBMlVBR0FBbUFDNEFNUUJ1UUdzUEFRRUFBd0VDQXdJQkJRSURUQTRCQUVvT0J3SUZBZ1FDQlFTQUFBQU5BUU1DQUFOcEFBRUFBZ1VCQW1rQUJBQUdDd1FHYVFBTUFBa0lEQWxvQUFzTExFMEtBUWdJTFFoT0dSa0FBREV3TGkwc0t5b3BLQ2NaSmhrbUpDSWdIeDBiQUJnQUZ5VWpKUThJR1NzU0JnY25Oall6TWhZWEZqTXlOamNYQmdZaklpWW5KaVlqQndZV016STJKek1XQmlNaUpqY0JJeWNoQnlNVE13Y0RNOUVYQ2lZUExoa1FIQkliRGhFV0RTTVRKeGtQR3hFUEZRc2hBakFtSmk0Q05RVlJPenRSQmdHQ1NpLysreTVJejFRcmJOa0RMQklVRUNZakN3b1FGUllWSlNRS0NnZ0pQeHNlSGhzdk9EZ3YvUk9GaFFJNVFmN0xBQUFBLy84QUhBQUFBaEFDN2dBaUFYY0FBQUVIQXprQnJBQXRBQWl4QWdHd0xiQTFLd0FBLy84QUhBQUFBaEFDOUFBaUFYY0FBQUVIQXpnQnNBQXRBQWl4QWdHd0xiQTFLd0FBQUFRQUhBQUFBaEFEVWdBREFBb0FFZ0FWQUVwQVJ3VUJBZ01CVEFBQUFRQ0ZBQUVEQVlVQUF3SURoUW9FQWdJSUFvVUFDUUFHQlFrR2FBQUlDQ3hOQndFRkJTMEZUZ1FFRlJRU0VSQVBEZzBNQ3dRS0JBb1JFeEVRQ3dnYUt3RXpCeU1ISndjak56TVhFeU1uSVFjakV6TUhBek1CbTFSVk9CSTdOMHh4S210NFNpLysreTVJejFRcmJOa0RVbWRxTHk5alkvMS9oWVVDT1VIK3l3QUFBUC8vQUJ6L1ZnSVFBdlFBSWdGM0FBQUFJd05CQVpZQUFBRUhBemdCc0FBdEFBaXhBd0d3TGJBMUt3QUFBQVFBSEFBQUFoQURVZ0FEQUFvQUVnQVZBRlZBVWdVQkFnTUJUQUFBQVFNQkFBT0FBQU1DQVFNQ2Znb0JBUXNFQWdJSUFRSm5BQWtBQmdVSkJtZ0FDQWdzVFFjQkJRVXRCVTRFQkFBQUZSUVNFUkFQRGcwTUN3UUtCQW9KQ0FjR0FBTUFBeEVNQ0JjckFSY2pKeGNuQnlNM014Y1RJeWNoQnlNVE13Y0RNd0YyT0RkVUxUczNUSEVxYTNoS0wvNzdMa2pQVkN0czJRTlNaMmZSTHk5alkvMS9oWVVDT1VIK3l3QUFBUC8vQUJ3QUFBSVFBMkVBSWdGM0FBQUJCd05RQWJBQUxRQUlzUUlDc0Myd05Tc0FBQUFFQUJ3QUFBSVFBMk1BRndBZUFDWUFLUUN4UUJZUEFRRUFBd0VDQXdJQkJBSWRBUVVFQkV3T0FRQktTN0FLVUZoQU5RQUVBZ1VDQkFXQURRWUNCUW9DQlhBQUFBd0JBd0lBQTJrQUFRQUNCQUVDYVFBTEFBZ0hDd2hvQUFvS0xFMEpBUWNITFFkT0cwQTJBQVFDQlFJRUJZQU5CZ0lGQ2dJRkNuNEFBQXdCQXdJQUEya0FBUUFDQkFFQ2FRQUxBQWdIQ3dob0FBb0tMRTBKQVFjSExRZE9XVUFnR0JnQUFDa29KaVVrSXlJaElCOFlIaGdlSEJzYUdRQVhBQllsSXlVT0NCa3JFZ1lISnpZMk16SVdGeFl6TWpZM0Z3WUdJeUltSnlZakJ6Y3pGeU1uQndFakp5RUhJeE16QndNejBSY0tKZzh1R1JBY0Voc09FUlVQSWhNbkdROGJFUjRRVUhFcWEwZzdOd0V5U2kvKyt5NUl6MVFyYk5rREtoSVVFQ1lqQ3dvUUZSWVZKU1FLQ2hHcFkyTXZMLzEvaFlVQ09VSCt5d0QvL3dBY0FBQUNFQUx3QUNJQmR3QUFBUWNETXdHd0FDMEFDTEVDQXJBdHNEVXJBQUQvL3dBYy8xWUNFQUk1QUNJQmR3QUFBQU1EUVFHV0FBRC8vd0FjQUFBQ0VBTHVBQ0lCZHdBQUFRY0ROUUY3QUMwQUNMRUNBYkF0c0RVckFBRC8vd0FjQUFBQ0VBTUlBQ0lCZHdBQUFRY0RQZ0w4QUMwQUNMRUNBYkF0c0RVckFBRC8vd0FjQUFBQ0VBTE5BQ0lCZHdBQUFRY0RQUUd3QUMwQUNMRUNBYkF0c0RVckFBQUFBZ0FjL3pBQ0VBSTVBQllBR1FBeVFDOE1BUU1DQXdFQUF3Sk1BQVlBQWdNR0FtZ0FBQUFCQUFGbEFBUUVMRTBGQVFNRExRTk9GQkVSRVJZaklBY0lIU3NFTXpJM0J3WWpJaVkxTkRZM0p5RUhJeE16RXlNR0ZRTURNd0c2SkEwTUJSTVdKaW9wSWkzKyt5NUl6MVRSSXpPbWJObWdBaXNIS0NFaFN5Ri9oUUk1L2NkQk5RSnUvc3NBQVAvL0FCd0FBQUlRQXlJQUlnRjNBQUFCQndNN0FiQUFMUUFJc1FJQ3NDMndOU3NBQVAvL0FCd0FBQUlRQXZJQUlnRjNBQUFCQndNOEFhOEFMUUFJc1FJQnNDMndOU3NBQUFBQ0FCd0FBQUtIQWprQUR3QVNBRUpBUHhBQkFRQUJUQUFCQUFJSUFRSm5BQWdBQlFNSUJXY0FBQUFIWHdrQkJ3Y3NUUUFEQXdSZkJnRUVCQzBFVGdBQUVoRUFEd0FQRVJFUkVSRVJFUW9JSFNzQkZTTVZNeFVqRlRNVklUVWpCeU1CRndNekFvZjMxOWYzL3NLblBFb0JDaU9MaXdJNVA3WkF4RUNGaFFJNVJQN09BQUFEQUZnQUFBSGxBamtBRFFBV0FCNEFQRUE1RFFFRkFnRk1BQUlBQlFRQ0JXY0dBUU1EQVY4QUFRRXNUUWNCQkFRQVh3QUFBQzBBVGhnWERnNGRHeGNlR0I0T0ZnNFZKaUVrQ0FnWkt3QVdGUlFHSXlNUk16SVZGQVlISnhVek1qWTFOQ1lqRXpJMU5DWWpJeFVCcVR4aVZOZXpzaUVwMG1nMU5qWTFHWFkxUFlVQkpVZzlTVmNDT1kwb1BSak11RFF0TGluK1JHVXZNOGNBQUFBQkFERC84d0g0QWtZQUdRQXhRQzRCQVFBRERnMENBd0VBQWt3QUFBQURZUVFCQXdNd1RRQUJBUUpoQUFJQ01RSk9BQUFBR1FBWUpDUWtCUWdaS3dBWEJ5WW1JeUlHRlJRV016STNGd1lHSXlJbUpqVTBOall6QWFOTkloeElKMWx2Y0ZsS1N4OGdZRHRIZTB0TGVrY0NSajAzRngxMGRYRjRPVGdhS0VHR1kyU0ZRUC8vQURELzh3SDRBdTRBSWdHUUFBQUJCd00yQWV3QUxRQUlzUUVCc0Myd05Tc0FBUC8vQURELzh3SDRBdTRBSWdHUUFBQUJCd001QWNrQUxRQUlzUUVCc0Myd05Tc0FBQUFCQUREL01BSDRBa1lBTXdCWFFGUWdBUVFETFN3aEF3VUVNUlVDQWdjVUNRSUJBZ2dCQUFFRlRCWUJCZ0ZMQ0FFSEFBSUJCd0pwQUFFQUFBRUFaUUFFQkFOaEFBTURNRTBBQlFVR1lRQUdCakVHVGdBQUFETUFNaFFrSkNva0pTUUpDQjByQkJZVkZBWWpJaVluTnhZV016STJOVFFtSXlJSEp6Y3VBalUwTmpZek1oY0hKaVlqSWdZVkZCWXpNamNYQmdZSEJ6WXpBV3N1T3k0VktBd0xDU0VSRmg0WkVSZ05HQ1pCYlVKTGVrZG5UU0ljU0NkWmIzQlpTa3NmSGxnMklRZ1dQQ1VkSnlzTUNTc0lDeElRRHhFSEcwRUdSb0ZjWklWQVBUY1hIWFIxY1hnNU9Ca21BelVHLy84QU1QL3pBZmdDOUFBaUFaQUFBQUVIQXpnQnpBQXRBQWl4QVFHd0xiQTFLd0FBLy84QU1QL3pBZmdDOGdBaUFaQUFBQUVIQXpRQnJRQXRBQWl4QVFHd0xiQTFLd0FBQUFJQVdBQUFBaFVDT1FBSUFCRUFMRUFwQUFNREFGOEFBQUFzVFFVQkFnSUJYd1FCQVFFdEFVNEtDUUFBRUE0SkVRb1JBQWdBQnlFR0NCY3JNeEV6TWhZVkZBWWpKekkyTlRRbUl5TVJXS2FDbFplQURXMXNhMjVSQWptR2twR1FRR2w0ZG1QK1JnQUFBZ0FuQUFBQ0ZRSTVBQXdBR1FBL1FEd0dBUU1IQVFJRUF3Sm5BQVVGQUY4SUFRQUFMRTBKQVFRRUFWOEFBUUV0QVU0T0RRRUFHQmNXRlJRU0RSa09HUXNLQ1FnSEJRQU1BUXdLQ0JZckV6SVdGUlFHSXlNUkl6VXpFUk15TmpVMEppTWpGVE1WSXhYK2dwV1hnS1l4TVpsdGJHdHVVWFIwQWptR2twR1FBUUV3QVFqK0IybDRkbVBKTU1FQUFBRC8vd0JZQUFBQ0ZRTHVBQ0lCbGdBQUFRY0RPUUdyQUMwQUNMRUNBYkF0c0RVckFBRC8vd0FuQUFBQ0ZRSTVBQUlCbHdBQUFBRUFXQUFBQWIwQ09RQUxBQ2xBSmdBREFBUUZBd1JuQUFJQ0FWOEFBUUVzVFFBRkJRQmZBQUFBTFFCT0VSRVJFUkVRQmdnY0t5RWhFU0VWSVJVekZTTVZJUUc5L3BzQlpmN2ovdjRCSFFJNVA3VkF4UUFBQVAvL0FGZ0FBQUc5QXU0QUlnR2FBQUFCQndNMkFjY0FMUUFJc1FFQnNDMndOU3NBQVAvL0FGZ0FBQUc5QXZFQUlnR2FBQUFCQndNNkFhWUFMUUFJc1FFQnNDMndOU3NBQVAvL0FGZ0FBQUc5QXU0QUlnR2FBQUFCQndNNUFhUUFMUUFJc1FFQnNDMndOU3NBQVAvL0FGZ0FBQUc5QXZRQUlnR2FBQUFCQndNNEFhZ0FMUUFJc1FFQnNDMndOU3NBQVAvL0FGZ0FBQUhuQTFJQUlnR2FBQUFCQndOT0FhZ0FMUUFJc1FFQ3NDMndOU3NBQVAvL0FGai9WZ0c5QXZRQUlnR2FBQUFBSXdOQkFaa0FBQUVIQXpnQnFBQXRBQWl4QWdHd0xiQTFLd0FBLy84QVdBQUFBYjBEVWdBaUFab0FBQUVIQTA4QnFBQXRBQWl4QVFLd0xiQTFLd0FBLy84QVdBQUFBY0FEVVFBaUFab0FBQUVIQTFBQnFBQWRBQWl4QVFLd0hiQTFLd0FBLy84QVdBQUFBYjBEYndBaUFab0FBQUVIQTFFQnFBQXRBQWl4QVFLd0xiQTFLd0FBLy84QVdBQUFBYjBDOEFBaUFab0FBQUVIQXpNQnFBQXRBQWl4QVFLd0xiQTFLd0FBLy84QVdBQUFBYjBDOGdBaUFab0FBQUVIQXpRQmlRQXRBQWl4QVFHd0xiQTFLd0FBLy84QVdQOVdBYjBDT1FBaUFab0FBQUFEQTBFQm1RQUEvLzhBV0FBQUFiMEM3Z0FpQVpvQUFBRUhBelVCY3dBdEFBaXhBUUd3TGJBMUt3QUEvLzhBV0FBQUFiMERDQUFpQVpvQUFBRUhBejRDOUFBdEFBaXhBUUd3TGJBMUt3QUEvLzhBV0FBQUFiMEN6UUFpQVpvQUFBRUhBejBCcUFBdEFBaXhBUUd3TGJBMUt3QUFBQUVBV1A4d0FjY0NPUUFhQUVOQVFBRUJCd0VCVEJZQkFRRkxBQVFBQlFZRUJXY0lBUWNBQUFjQVpRQURBd0pmQUFJQ0xFMEFCZ1lCWHdBQkFTMEJUZ0FBQUJvQUdSRVJFUkVSRlNNSkNCMHJCRGNIQmlNaUpqVTBOamNoRVNFVklSVXpGU01WSVJVR0ZSUXpBYnNNQlJNV0ppb2xJUDdLQVdYKzQvNytBUjB6SktBQ0t3Y29JUjlJSUFJNVA3VkF4VUJCTlNvQUFBRC8vd0JZQUFBQnZRTHlBQ0lCbWdBQUFRY0RQQUduQUMwQUNMRUJBYkF0c0RVckFBQUFBZ0F4Ly9NQ0xnSkdBQmNBSHdCQVFEMFVBUUlERXdFQkFnSk1BQUVBQkFVQkJHY0FBZ0lEWVFZQkF3TXdUUWNCQlFVQVlRQUFBREVBVGhnWUFBQVlIeGdlR3hvQUZ3QVdJaFVtQ0FnWkt3QVdGaFVVQmdZaklpWW1OVFEzSVNZbUl5SUhKelkyTXhJMk55RWVBak1CZG5oQVEzVktTSEpCQWdHdkJtTldWVXNsSldvNFZXQUkvcFlCTFZFMUFrWkdoRnRkaVVoRWYxWWRFR0ZyTmpjZUl2M3RhR0E0V3pVQUFRQllBQUFCdFFJNUFBa0FJMEFnQUFNQUJBQURCR2NBQWdJQlh3QUJBU3hOQUFBQUxRQk9FUkVSRVJBRkNCc3JNeU1SSVJVaEZUTVZJNTlIQVYzKzZ2YjJBamsvMGtBQUFRQXcvL1FDREFKRkFCMEFPRUExRHdFREFoQUJBQU1iQWdJRUJRTk1BQUFBQlFRQUJXY0FBd01DWVFBQ0FqQk5BQVFFQVdFQUFRRXhBVTRTSkNRbUl4QUdDQndyQVRNVkJnWWpJaVltTlRRMk5qTXlGd2NtSmlNaUJoVVVGak15TnpVakFTYm1IWFpBU0hoSlMzeEthbFVtSFZJdlhHZHFYVVZBbndFNStod3ZRSVZqWklWQVFEZ1lIbmR1Y0hzbW9nQUEvLzhBTVAvMEFnd0M4UUFpQWE0QUFBRUhBem9CekFBdEFBaXhBUUd3TGJBMUt3QUEvLzhBTVAvMEFnd0M3Z0FpQWE0QUFBRUhBemtCeWdBdEFBaXhBUUd3TGJBMUt3QUEvLzhBTVAvMEFnd0M5QUFpQWE0QUFBRUhBemdCelFBdEFBaXhBUUd3TGJBMUt3QUEvLzhBTVA4M0Fnd0NSUUFpQWE0QUFBQURBMElCd1FBQS8vOEFNUC8wQWd3QzhnQWlBYTRBQUFFSEF6UUJyZ0F0QUFpeEFRR3dMYkExS3dBQUFBRUFXQUFBQWhNQ09RQUxBQ2RBSkFZQkJRQUNBUVVDWndRQkFBQXNUUU1CQVFFdEFVNEFBQUFMQUFzUkVSRVJFUWNJR3lzQkVUTVJJelVoRlNNUk14RUJ5a2xKL3RaSVNBRTJBUVA5eC9UMEFqbisvUUFBQUFBQ0FDb0FBQUpBQWprQUV3QVhBRFpBTXdnR0FnQUxCUUlCQ2dBQlp3QUtBQU1DQ2dObkNRRUhCeXhOQkFFQ0FpMENUaGNXRlJRVEVoRVJFUkVSRVJFUkVBd0lIeXNCTXhVakVTTTFJUlVqRVNNMU16VXpGU0UxTXdFaE5TRUNFeTB0U2Y3V1NDNHVTQUVxU2Y2TkFTcisxZ0hRTi81bjlQUUJtVGRwYVduKy9XTUFBUC8vQUZnQUFBSVRBdlFBSWdHMEFBQUJCd000QWRBQUxRQUlzUUVCc0Myd05Tc0FBQUFCQUZnQUFBQ2hBamtBQXdBVFFCQUFBQUFzVFFBQkFTMEJUaEVRQWdnWUt4TXpFU05ZU1VrQ09mM0gvLzhBV0FBQUFLRUNPUUFDQWJjQUFQLy9BRWtBQUFEM0F1NEFJZ0czQUFBQkJ3TTJBVGdBTFFBSXNRRUJzQzJ3TlNzQUFQLy8vL1FBQUFFSEF2RUFJZ0czQUFBQkJ3TTZBUmNBTFFBSXNRRUJzQzJ3TlNzQUFQLy8vL2NBQUFEOUF1NEFJZ0czQUFBQkJ3TTVBUlVBTFFBSXNRRUJzQzJ3TlNzQUFQLy8vL3NBQUFFQkF2UUFJZ0czQUFBQkJ3TTRBUmtBTFFBSXNRRUJzQzJ3TlNzQUFQLy8vL3dBQUFEOUF2QUFJZ0czQUFBQkJ3TXpBUmdBTFFBSXNRRUNzQzJ3TlNzQUFQLy9BRXNBQUFDeEF2SUFJZ0czQUFBQkJ3TTBBUGtBTFFBSXNRRUJzQzJ3TlNzQUFQLy9BRTMvVmdDc0Fqa0FJZ0czQUFBQUF3TkJBUDBBQVAvLy8vRUFBQUNpQXU0QUlnRzNBQUFCQndNMUFPUUFMUUFJc1FFQnNDMndOU3NBQVAvL0FEVUFBQURLQXdnQUlnRzNBQUFCQndNK0FtUUFMUUFJc1FFQnNDMndOU3NBQVAvL0FGai84d0lWQWprQUlnRzNBQUFBQXdIR0FQb0FBUC8vQUFzQUFBRHhBczBBSWdHM0FBQUJCd005QVJrQUxRQUlzUUVCc0Myd05Tc0FBQUFCQUMzL01BQ3JBamtBRWdBdFFDb0JBUU1CQVV3T0FRRUJTd1FCQXdBQUF3QmxBQUlDTEUwQUFRRXRBVTRBQUFBU0FCRVJGU01GQ0JrckZqY0hCaU1pSmpVME5qY2pFVE1SQmhVVU01OE1CUk1XSmlvbElCcEpNeVNnQWlzSEtDRWZTQ0FDT2YzSFFUVXFBUC8vLytvQUFBRVJBdklBSWdHM0FBQUJCd004QVJjQUxRQUlzUUVCc0Myd05Tc0FBUC8vQUFqLzh3RWJBamtBQWdISEFBQUFBUUFJLy9NQkd3STVBQTBBSTBBZ0JnRUJBZ1VCQUFFQ1RBQUNBamhOQUFFQkFHRUFBQUJBQUU0VEl5SURDUmtySlJRR0l5SW5OeFl6TWpZMUVUTUJHMTFoTkNFSEhpWThSVWVsV0ZvTFBRYzNPQUdXQUFBQS8vOEFDUC96QVhNQzdnQWlBY2NBQUFFSEF6WUJ0QUF0QUFpeEFRR3dMYkExS3dBQS8vOEFDUC96QVgwQzlBQWlBY1lBQUFFSEF6Z0JsUUF0QUFpeEFRR3dMYkExS3dBQUFBRUFXQUFBQWdnQ09RQUxBQjlBSEFrRUF3TUFBZ0ZNQXdFQ0FpeE5BUUVBQUMwQVRoSVJFeEVFQ0JvckFSTWpKd2NWSXhFekVSTXpBUXIrWWMwNlNFajNYQUV3L3RENVFyY0NPZjdhQVNiLy93QlkvemNDQ0FJNUFDSUJ5Z0FBQUFNRFFnR2VBQUFBQVFCWUFBQUJ1Z0k1QUFVQUdVQVdBQUFBTEUwQUFRRUNZQUFDQWkwQ1RoRVJFQU1JR1NzVE14RWhGU0ZZU0FFYS9wNENPZjRJUWYvL0FGZ0FBQUc2QXU0QUlnSE1BQUFCQndNMkFWMEFMUUFJc1FFQnNDMndOU3NBQVAvL0FGZ0FBQUc2QWprQUlnSE1BQUFCQndNRkFXMy9TUUFKc1FFQnVQOUpzRFVyQVAvL0FGai9Od0c2QWprQUlnSE1BQUFBQXdOQ0FZNEFBUC8vQUZnQUFBRzZBamtBSWdITUFBQUFBd0xKQWM4QUFBQUJBQmtBQUFIRkFqa0FEUUFtUUNNTkRBc0lCd1lGQUFnQUFnRk1BQUlDTEUwQUFBQUJZQUFCQVMwQlRoVVJFUU1JR1NzVEZTRVZJVFVITlRjUk14VTNGYXNCR3Y2ZVNrcElWd0VZMTBIK0d6b2JBUUhuSHpvQUFRQllBQUFDbUFJNUFBd0FJRUFkQ0FVQ0FRQUJUQVFCQUFBc1RRTUNBZ0VCTFFGT0VSSVNFUkVGQ0JzckpSTXpFU01SQXlNREVTTVJNd0Y4MUVoSHZUSEZSa3RpQWRmOXh3R3YvbFVCcXY1U0Fqa0FBUUJZQUFBQ0tnSTVBQWtBSGtBYkJRQUNBUUFCVEFNQkFBQXNUUUlCQVFFdEFVNFJFaEVSQkFnYUt5VVJNeEVqQVJFakVUTUI0MGREL3JoSFJYWUJ3LzNIQWNMK1BnSTVBQUFBLy84QVdBQUFBaW9DN2dBaUFkTUFBQUVIQXpZQit3QXRBQWl4QVFHd0xiQTFLd0FBLy84QVdBQUFBaW9DN2dBaUFkTUFBQUVIQXprQjJBQXRBQWl4QVFHd0xiQTFLd0FBLy84QVdQODNBaW9DT1FBaUFkTUFBQUFEQTBJQnhBQUFBQUVBV1A4eUFpb0NPUUFVQURSQU1STU9EUU1DQXdjQkFRSUdBUUFCQTB3QUFRQUFBUUJsQlFRQ0F3TXNUUUFDQWkwQ1RnQUFBQlFBRkJFVkl5TUdDQm9yQVJFVUJpTWlKemNXTXpJMk5UVUJFU01STXdFUkFpcGdhQzhaQmlFZFJVRCt2RWRGQVVZQ09mMmlWVlFKUEFVMk9TUUJ2ZjQrQWpuK1BRSERBQUQvL3dCWUFBQUNLZ0x5QUNJQjB3QUFBUWNEUEFIYUFDMEFDTEVCQWJBdHNEVXJBQUFBQWdBdy8vTUNYZ0pHQUE4QUh3QXNRQ2tBQWdJQVlRQUFBREJOQlFFREF3RmhCQUVCQVRFQlRoQVFBQUFRSHhBZUdCWUFEd0FPSmdZSUZ5c1dKaVkxTkRZMk16SVdGaFVVQmdZalBnSTFOQ1ltSXlJR0JoVVVGaFl6OVg5R1NJRlVVSHhGUm41U1BGd3pNbHM3UGw0ME0xMDlEVW1HV1ZxSFNrZUVXRnlKUzBFN2JVaERaamc1YVVWR2Fqb0FBQUQvL3dBdy8vTUNYZ0x1QUNJQjJRQUFBUWNETmdJQkFDMEFDTEVDQWJBdHNEVXJBQUQvL3dBdy8vTUNYZ0x4QUNJQjJRQUFBUWNET2dIZ0FDMEFDTEVDQWJBdHNEVXJBQUQvL3dBdy8vTUNYZ0x1QUNJQjJRQUFBUWNET1FIZUFDMEFDTEVDQWJBdHNEVXJBQUQvL3dBdy8vTUNYZ0wwQUNJQjJRQUFBUWNET0FIaUFDMEFDTEVDQWJBdHNEVXJBQUQvL3dBdy8vTUNYZ05TQUNJQjJRQUFBUWNEVGdIaUFDMEFDTEVDQXJBdHNEVXJBQUQvL3dBdy8xWUNYZ0wwQUNJQjJRQUFBQ01EUVFISEFBQUJCd000QWVJQUxRQUlzUU1Cc0Myd05Tc0FBUC8vQURELzh3SmVBMUlBSWdIWkFBQUJCd05QQWVJQUxRQUlzUUlDc0Myd05Tc0FBUC8vQURELzh3SmVBMkVBSWdIWkFBQUJCd05RQWVJQUxRQUlzUUlDc0Myd05Tc0FBQUFFQURELzh3SmVBMk1BRndBZUFDNEFQZ0M5UUJZUEFRRUFBd0VDQXdJQkJBSWRBUVVFQkV3T0FRQktTN0FLVUZoQU9BQUVBZ1VDQkFXQURBWUNCUWdDQlhBQUFBc0JBd0lBQTJrQUFRQUNCQUVDYVFBSkNRaGhEUUVJQ0RCTkRnRUtDZ2RoQUFjSE1RZE9HMEE1QUFRQ0JRSUVCWUFNQmdJRkNBSUZDSDRBQUFzQkF3SUFBMmtBQVFBQ0JBRUNhUUFKQ1FoaERRRUlDREJORGdFS0NnZGhBQWNITVFkT1dVQW1MeThmSHhnWUFBQXZQaTg5TnpVZkxoOHRKeVVZSGhnZUhCc2FHUUFYQUJZbEl5VVBDQmtyQUFZSEp6WTJNeklXRnhZek1qWTNGd1lHSXlJbUp5WWpCemN6RnlNbkJ4NENGUlFHQmlNaUppWTFORFkyTXhJMk5qVTBKaVlqSWdZR0ZSUVdGak1CQXhjS0pnOHVHUkFjRWhzT0VSVVBJaE1uR1E4YkVSNFFVSEVxYTBnN040MThSVVorVWxOL1JraUJWRGRjTXpKYk96NWVORE5kUFFNcUVoUVFKaU1MQ2hBVkZoVWxKQW9LRWFsall5OHZPMGVFV0Z5SlMwbUdXVnFIU3YzdU8yMUlRMlk0T1dsRlJtbzZBQUFBLy84QU1QL3pBbDRDOEFBaUFka0FBQUVIQXpNQjRnQXRBQWl4QWdLd0xiQTFLd0FBLy84QU1QOVdBbDRDUmdBaUFka0FBQUFEQTBFQnh3QUEvLzhBTVAvekFsNEM3Z0FpQWRrQUFBRUhBelVCclFBdEFBaXhBZ0d3TGJBMUt3QUEvLzhBTVAvekFsNERDQUFpQWRrQUFBRUhBejRETGdBdEFBaXhBZ0d3TGJBMUt3QUFBQUlBTVAvekFsNENyd0FjQUN3QWJVdXdHMUJZdFJ3QkJBRUJUQnUxSEFFRUFnRk1XVXV3RzFCWVFCd0FBd0VEaFFBRUJBRmhBZ0VCQVRCTkJnRUZCUUJoQUFBQU1RQk9HMEFnQUFNQkE0VUFBZ0lzVFFBRUJBRmhBQUVCTUUwR0FRVUZBR0VBQUFBeEFFNVpRQTRkSFIwc0hTc3FFeUpHSlFjSUd5c0FGaFVVQmdZaklpWW1OVFEyTmpjek16SVhGak15TmpVMU14VVVCd0kyTmpVMEppWWpJZ1lHRlJRV0ZqTUNKamhHZmxKVGYwWkdnRklDQXg4bUVoRWdIRUpBYjF3ek1sczdQbDQwTTEwOUFlMTdUMXlKUzBtR1dWbUhTZ0VIQXhvYlBqeExGdjRpTzIxSVEyWTRPV2xGUm1vNi8vOEFNUC96QWw0QzdnQWlBZWNBQUFFSEF6WUNBUUF0QUFpeEFnR3dMYkExS3dBQS8vOEFNUDlXQWw0Q3J3QWlBZWNBQUFBREEwRUJ4d0FBLy84QU1QL3pBbDRDN2dBaUFlY0FBQUVIQXpVQnJRQXRBQWl4QWdHd0xiQTFLd0FBLy84QU1QL3pBbDREQ0FBaUFlY0FBQUVIQXo0RExnQXRBQWl4QWdHd0xiQTFLd0FBLy84QU1QL3pBbDRDOGdBaUFlY0FBQUVIQXp3QjRRQXRBQWl4QWdHd0xiQTFLd0FBLy84QU1QL3pBbDRDN3dBaUFka0FBQUVIQXpjQ0F3QXRBQWl4QWdLd0xiQTFLd0FBLy84QU1QL3pBbDRDelFBaUFka0FBQUVIQXowQjRnQXRBQWl4QWdHd0xiQTFLd0FBQUFNQU1QK3FBbDRDa0FBWEFDRUFLd0JCUUQ0VkFRSUJLU2diR2dRREFnd0pBZ0FEQTB3WEZnSUJTZ3NLQWdCSkFBSUNBV0VBQVFFd1RRUUJBd01BWVFBQUFERUFUaUlpSWlzaUtpZ3FKZ1VJR1NzQkZoWVZGQVlHSXlJbkJ5YzNKaVkxTkRZMk16SVhOeGNBRmhjVEppTWlCZ1lWQkRZMk5UUW1Kd01XTXdIaE8wSkdmbEk3TUN3d0xEdENTSUZVTkRBc0wvNXZLaWZJSVNnK1hqUUJDVnd6S2lmSUpTa0NIeVdDVlZ5SlN4SmJHRnNraEZaYWgwb1FXaGorWm1RZUFaME1PV2xGNmp0dFNENWdIZjVqRHYvL0FERC84d0plQXZJQUlnSFpBQUFCQndNOEFlRUFMUUFJc1FJQnNDMndOU3NBQUFBQ0FEQUFBQUtTQWprQUVnQWNBRDlBUEFBREFBUUZBd1JuQmdFQ0FnRmZBQUVCTEUwSkJ3SUZCUUJmQ0FFQUFDMEFUaE1UQVFBVEhCTWJGaFFSRUE4T0RRd0xDZ2tIQUJJQkVnb0lGaXNoSWlZbU5UUTJOak1oRlNNVk14VWpGVE1WSlJFaklnWVZGQllXTXdFMFFuWk1USGhFQVZyMjE5ZjIvc01hV1dreldEYzdnR0pqZnpvL3RrREVRRHNCdjIxdlNXWTBBQUFBQUFJQVdBQUFBZHNDT1FBS0FCTUFNRUF0QmdFREFBRUNBd0ZuQUFRRUFGOEFBQUFzVFFVQkFnSXRBazRNQ3dBQUVoQUxFd3dUQUFvQUNpUWhCd2dZS3pNUk16SVdGUlFHSXlNVkV6STJOVFFtSXlNVldMNWdaV2xkZG1oQ1NVaERhQUk1WUZOU1o4MEJEajQ2T1R2c0FBQUNBRmdBQUFHOEFqa0FEQUFWQURSQU1RQUJBQVVFQVFWbkJ3RUVBQUlEQkFKbkFBQUFMRTBHQVFNRExRTk9EZzBBQUJRU0RSVU9GUUFNQUF3a0lSRUlDQmtyTXhFekZUTXlGaFVVQmlNakZUY3lOalUwSmlNakZWaEhXRnhwYUZWZ1RFSkdSa0pNQWpsaVlGSlNabTJzUURrM1BPd0FBQUFDQUREL2h3SmVBa1lBRVFBaEFDcEFKd0lCQUFJQlRBUURBZ0JKQUFNREFXRUFBUUV3VFFBQ0FnQmhBQUFBTVFCT0ppWW1GUVFJR2lza0JnY1hCeWN1QWpVME5qWXpNaFlXRlFRV0ZqTXlOalkxTkNZbUl5SUdCaFVDWG1GVWppbk1VWHhGU0lGVVVIeEYvaDB6WFQwOFhETXlXenMrWGpTMmx4MC9QR3dCU29WWVdvZEtSNFJZUzJvNk8yMUlRMlk0T1dsRkFBQUFBQUlBV0FBQUFlb0NPUUFNQUJVQU1VQXVEQUVCQkFGTUFBUUFBUUFFQVdjR0FRVUZBMThBQXdNc1RRSUJBQUF0QUU0TkRRMFZEUlFtSVJFUkVBY0lHeXNoSXljakZTTVJNeklWRkFZSEF4VXpNalkxTkNZakFlcFZlWHhJdjd3Mk44WnhQRHc3UGRmWEFqbXBQMTBUQVJua1BUZzVOZ0FBLy84QVdBQUFBZW9DN2dBaUFmVUFBQUVIQXpZQndnQXRBQWl4QWdHd0xiQTFLd0FBLy84QVdBQUFBZW9DN2dBaUFmVUFBQUVIQXprQm53QXRBQWl4QWdHd0xiQTFLd0FBLy84QVdQODNBZW9DT1FBaUFmVUFBQUFEQTBJQmxBQUFBQUVBTVAvekFhOENSZ0FvQURSQU1RRUJBQU1YQWdJQ0FCWUJBUUlEVEFBQUFBTmhCQUVEQXpCTkFBSUNBV0VBQVFFeEFVNEFBQUFvQUNjbExDUUZDQmtyQUJjSEppWWpJZ1lWRkJZV0Z4NENGUlFHSXlJbUp6Y1dGak15TmpVMEppWW5MZ0kxTkRZekFWWkxIaDlKSmpZN0l6UXROa0l2YUYwellpVVlJVklzUWo4ak5TdzNRUzVmV0FKR05UVVdHREFuSFNvYkV4WWtQeTlKV2h3YU54WVdNeWdlS3hzU0Z5US9MMFZUQUFELy93QXcvL01CcndMdUFDSUIrUUFBQVFjRE5nR3FBQzBBQ0xFQkFiQXRzRFVyQUFELy93QXcvL01CcndMdUFDSUIrUUFBQVFjRE9RR0hBQzBBQ0xFQkFiQXRzRFVyQUFBQUFRQXcvekFCcndKR0FFSUFVVUJPTXdFSUJ6UWdBZ1lJSHdFQUJoc0RBZ1FCR2c4Q0F3UU9BUUlEQmt3QUFRQUVBd0VFYVFBREFBSURBbVVBQ0FnSFlRQUhCekJOQUFZR0FHRUZBUUFBTVFCT0pDd2xFeVFsSkNJUkNRZ2ZLeVFHQndjMk16SVdGUlFHSXlJbUp6Y1dGak15TmpVMEppTWlCeWMzSmlZbk54WVdNekkyTlRRbUppY3VBalUwTmpNeUZ3Y21KaU1pQmhVVUZoWVhIZ0lWQWE5ZFV5RUlGaUl1T3k0VktBd0xDU0VSRmg0WkVSZ05HQ1l0VmlBWUlWSXNRajhqTlN3M1FTNWZXR0ZMSGg5SkpqWTdJelF0TmtJdlVsa0ZOZ1lsSFNjckRBa3JDQXNTRUE4UkJ4dEJBeHNYTnhZV015Z2VLeHNTRnlRL0wwVlROVFVXR0RBbkhTb2JFeFlrUHk4QUFQLy9BREQvOHdHdkF2UUFJZ0g1QUFBQkJ3TTRBWXNBTFFBSXNRRUJzQzJ3TlNzQUFQLy9BREQvTndHdkFrWUFJZ0g1QUFBQUF3TkNBWFlBQUFBQkFDTUFBQUhoQWprQUJ3QWJRQmdEQVFFQkFGOEFBQUFzVFFBQ0FpMENUaEVSRVJBRUNCb3JFeUVWSXhFakVTTWpBYjY3Ujd3Q09VRCtCd0g1QUFBQUFRQWpBQUFCNFFJNUFBOEFMMEFzQlFFQkJBRUNBd0VDWndZQkFBQUhYd2dCQndjc1RRQURBeTBEVGdBQUFBOEFEeEVSRVJFUkVSRUpDQjByQVJVakZUTVZJeFVqTlNNMU16VWpOUUhodTFkWFIwOVB2QUk1UU13dy9mMHd6RUQvL3dBakFBQUI0UUx1QUNJQi93QUFBUWNET1FHYUFDMEFDTEVCQWJBdHNEVXJBQUFBQVFBai96QUI0UUk1QUNJQVFFQTlHZ0lDQkFFWkRnSURCQTBCQWdNRFRBQUJBQVFEQVFScEFBTUFBZ01DWlFnQkJnWUhYd0FIQnl4TkJRRUFBQzBBVGhFUkVSTWtKU1FpRUFrSUh5c2hJd2MyTXpJV0ZSUUdJeUltSnpjV0ZqTXlOalUwSmlNaUJ5YzNJeEVqTlNFVkl3RW1DaWtJRmlJdU95NFZLQXdMQ1NFUkZoNFpFUmdOR0MwUXZBRyt1MElHSlIwbkt3d0pLd2dMRWhBUEVRY2JUUUg1UUVBQUFBRC8vd0FqL3pjQjRRSTVBQ0lCL3dBQUFBTURRZ0dLQUFBQUFRQlkvL01DREFJNUFCRUFHMEFZQXdFQkFTeE5BQUlDQUdFQUFBQXhBRTRUSXhNaUJBZ2FLeVVVQmlNaUpqVVJNeEVVRmpNeU5qVVJNd0lNZTE5ZmUwaExSMGRNUjhodVoyZHVBWEgrZ2p0TFN6c0JmZ0FBLy84QVdQL3pBZ3dDN2dBaUFnUUFBQUVIQXpZQjd3QXRBQWl4QVFHd0xiQTFLd0FBLy84QVdQL3pBZ3dDOFFBaUFnUUFBQUVIQXpvQnpnQXRBQWl4QVFHd0xiQTFLd0FBLy84QVdQL3pBZ3dDN2dBaUFnUUFBQUVIQXprQnpBQXRBQWl4QVFHd0xiQTFLd0FBLy84QVdQL3pBZ3dDOUFBaUFnUUFBQUVIQXpnQjBBQXRBQWl4QVFHd0xiQTFLd0FBLy84QVdQL3pBZ3dDOEFBaUFnUUFBQUVIQXpNQjBBQXRBQWl4QVFLd0xiQTFLd0FBQUFRQVdQL3pBZ3dEY0FBREFBOEFHd0F0QUhsTHNBcFFXRUFvQUFBQkFnQndBQUVDQVlVRUFRSUxCUW9EQXdjQ0Eyb0pBUWNITEUwQUNBZ0dZUUFHQmpFR1RodEFKd0FBQVFDRkFBRUNBWVVFQVFJTEJRb0RBd2NDQTJvSkFRY0hMRTBBQ0FnR1lRQUdCakVHVGxsQUhCQVFCQVF0TENrbkpDTWdIaEFiRUJvV0ZBUVBCQTRsRVJBTUNCa3JBVE1ISXdZbU5UUTJNeklXRlJRR0l6SW1OVFEyTXpJV0ZSUUdJeE1VQmlNaUpqVVJNeEVVRmpNeU5qVVJNd0ZDVkZVM1BSa1pGUllaR1JhUkdob1dGQmtaRklON1gxOTdTRXRIUjB4SEEzQm5laGtYRnhnWUZ4Y1pHUmNYR0JnWEZ4bitPVzVuWjI0QmNmNkNPMHRMT3dGK0FBQUVBRmovOHdJTUEzTUFCZ0FTQUI0QU1BQ0Z0UVVCQUFFQlRFdXdDbEJZUUNrTEFnSUJBQU1CY0FBQUF3Q0ZEQVlDQXdVQkJBY0RCR29KQVFjSExFMEFDZ29JWVFBSUNERUlUaHRBS0FzQ0FnRUFBWVVBQUFNQWhRd0dBZ01GQVFRSEF3UnFDUUVIQnl4TkFBb0tDR0VBQ0FneENFNVpRQjhURXdBQUxpd3BLQ1VqSUI4VEhoTWRHUmNRRGdvSUFBWUFCaEVSRFFnWUt3RUhJeWN6RnpjR05qTXlGaFVVQmlNaUpqVTJGaFVVQmlNaUpqVTBOak1YTXhFVUJpTWlKalVSTXhFVUZqTXlOalVCdEdjeGJVczdPN3daRlJZWkdSWVZHZWtaR1JRV0dob1dQRWQ3WDE5N1NFdEhSMHdEYzJob096dWRHQmdYRnhrWkZ5OFlGeGNaR1JjWEdMWCtqMjVuWjI0QmNmNkNPMHRMT3dBRUFGai84d0lNQTNBQUF3QVBBQnNBTFFDQlM3QUtVRmhBS1FBQUFRSUFjQW9CQVFJQmhRUUJBZ3dGQ3dNREJ3SURhZ2tCQndjc1RRQUlDQVpoQUFZR01RWk9HMEFvQUFBQkFJVUtBUUVDQVlVRUFRSU1CUXNEQXdjQ0Eyb0pBUWNITEUwQUNBZ0dZUUFHQmpFR1RsbEFJaEFRQkFRQUFDMHNLU2NrSXlBZUVCc1FHaFlVQkE4RURnb0lBQU1BQXhFTkNCY3JBU2N6RndZbU5UUTJNeklXRlJRR0l6SW1OVFEyTXpJV0ZSUUdJeE1VQmlNaUpqVVJNeEVVRmpNeU5qVVJNd0VlVkZNNGlCa1pGUllaR1JhUkdob1dGQmtaRklON1gxOTdTRXRIUjB4SEF3bG5aM29aRnhjWUdCY1hHUmtYRnhnWUZ4Y1ovamx1WjJkdUFYSCtnanRMU3pzQmZnQUVBRmovOHdJTUEwNEFBd0FQQUJzQUxRQkVRRUVBQUFBQkFnQUJad1FCQWdzRkNnTURCd0lEYVFrQkJ3Y3NUUUFJQ0FaaEFBWUdNUVpPRUJBRUJDMHNLU2NrSXlBZUVCc1FHaFlVQkE4RURpVVJFQXdJR1NzVE14VWpGaVkxTkRZek1oWVZGQVlqTWlZMU5EWXpNaFlWRkFZakV4UUdJeUltTlJFekVSUVdNekkyTlJFend1Ym1DeGtaRlJZWkdSYVJHaG9XRkJrWkZJTjdYMTk3U0V0SFIweEhBMDR3anhrWEZ4Z1lGeGNaR1JjWEdCZ1hGeG4rT1c1bloyNEJjZjZDTzB0TE93RisvLzhBV1A5V0Fnd0NPUUFpQWdRQUFBQURBMEVCc3dBQS8vOEFXUC96QWd3QzdnQWlBZ1FBQUFFSEF6VUJtd0F0QUFpeEFRR3dMYkExS3dBQS8vOEFXUC96QWd3RENBQWlBZ1FBQUFFSEF6NERIQUF0QUFpeEFRR3dMYkExS3dBQUFBRUFXUC96QW1NQ3JRQWFBQ2RBSkFVQkF3SUJUQUFBQWdDRkJBRUNBaXhOQUFNREFXRUFBUUV4QVU0akl4TW5FQVVJR3lzQk14VVVCZ2NSRkFZaklpWTFFVE1SRkJZek1qWTFFVE15TmpVQ0lFTXNLM3RmWDN0SVMwZEhUQ0FmSEFLdFBTczFCLzYvYm1kbmJnRngvb0k3UzBzN0FYNGFHd0FBQVAvL0FGai84d0pqQXU0QUlnSVJBQUFCQndNMkFlOEFMUUFJc1FFQnNDMndOU3NBQVAvL0FGai9WZ0pqQXEwQUlnSVJBQUFBQXdOQkFiTUFBUC8vQUZqLzh3SmpBdTRBSWdJUkFBQUJCd00xQVpzQUxRQUlzUUVCc0Myd05Tc0FBUC8vQUZqLzh3SmpBd2dBSWdJUkFBQUJCd00rQXh3QUxRQUlzUUVCc0Myd05Tc0FBUC8vQUZqLzh3SmpBdklBSWdJUkFBQUJCd004QWM4QUxRQUlzUUVCc0Myd05Tc0FBUC8vQUZqLzh3SU1BdThBSWdJRUFBQUJCd00zQWZFQUxRQUlzUUVDc0Myd05Tc0FBUC8vQUZqLzh3SU1BczBBSWdJRUFBQUJCd005QWRBQUxRQUlzUUVCc0Myd05Tc0FBQUFCQUZqL01BSU1BamtBSUFBcVFDY0xBUUVEQVV3QUFRQUNBUUpsQkFFQUFDeE5BQVVGQTJFQUF3TXhBMDRqRXhVakp4QUdDQndyQVRNUkZBWUhCaFVVTXpJM0J3WWpJaVkxTkRZM0ppWTFFVE1SRkJZek1qWTFBY1ZIWFV3c0pBME1CUk1XSmlvZUcxNTVTRXRIUjB3Q09mNlBYMmNMT3pJcUFpc0hLQ0VkUHg0QloyMEJjZjZDTzB0TE93QUFBUC8vQUZqLzh3SU1BeUlBSWdJRUFBQUJCd003QWRBQUxRQUlzUUVDc0Myd05Tc0FBUC8vQUZqLzh3SU1BdklBSWdJRUFBQUJCd004QWM4QUxRQUlzUUVCc0Myd05Tc0FBQUFCQUJJQUFBSU9BamtBQmdBVlFCSUNBUUFBTEUwQUFRRXRBVTRSRVJFRENCa3JKUk16QXlNRE13RVNyRkRhUjl0UVZRSGsvY2NDT1FBQUFBQUJBQnNBQUFNbUFqb0FEQUFnUUIwS0JRSUJBQUZNQkFNQ0FBQXNUUUlCQVFFdEFVNFNFUklSRVFVSUd5c2xFek1ESXdNREl3TXpFeE16QWxpR1NLeERsSmRFclU2RmswWm5BZEw5eHdIUy9pNENPZjR3QWRILy93QWJBQUFESmdMdUFDSUNIUUFBQVFjRE5nSmFBQzBBQ0xFQkFiQXRzRFVyQUFELy93QWJBQUFESmdMMEFDSUNIUUFBQVFjRE9BSTdBQzBBQ0xFQkFiQXRzRFVyQUFELy93QWJBQUFESmdMd0FDSUNIUUFBQVFjRE13STdBQzBBQ0xFQkFyQXRzRFVyQUFELy93QWJBQUFESmdMdUFDSUNIUUFBQVFjRE5RSUdBQzBBQ0xFQkFiQXRzRFVyQUFBQUFRQWtBQUFDQkFJNUFBc0FIMEFjQ1FZREF3QUNBVXdEQVFJQ0xFMEJBUUFBTFFCT0VoSVNFUVFJR2lzQkV5TW5CeU1UQXpNWE56TUJPOGxXbnBwU3hMdFdrWXhVQVNYKzIrdnJBU1VCRk4vZkFBQUFBUUFXQUFBQjVnSTVBQWdBSEVBWkJnTUNBUUFCVEFJQkFBQXNUUUFCQVMwQlRoSVNFUU1JR1NzQkV6TURGU00xQXpNQkJaVk12a2pLVHdFZ0FSbitwTjNkQVZ3QUFBRC8vd0FXQUFBQjVnTHVBQ0lDSXdBQUFRY0ROZ0c2QUMwQUNMRUJBYkF0c0RVckFBRC8vd0FXQUFBQjVnTDBBQ0lDSXdBQUFRY0RPQUdiQUMwQUNMRUJBYkF0c0RVckFBRC8vd0FXQUFBQjVnTHdBQ0lDSXdBQUFRY0RNd0diQUMwQUNMRUJBckF0c0RVckFBRC8vd0FXLzFZQjVnSTVBQ0lDSXdBQUFBTURRUUdGQUFELy93QVdBQUFCNWdMdUFDSUNJd0FBQVFjRE5RRm1BQzBBQ0xFQkFiQXRzRFVyQUFELy93QVdBQUFCNWdNSUFDSUNJd0FBQVFjRFBnTG5BQzBBQ0xFQkFiQXRzRFVyQUFELy93QVdBQUFCNWdMTkFDSUNJd0FBQVFjRFBRR2JBQzBBQ0xFQkFiQXRzRFVyQUFELy93QVdBQUFCNWdMeUFDSUNJd0FBQVFjRFBBR2FBQzBBQ0xFQkFiQXRzRFVyQUFBQUFRQXNBQUFCeVFJNUFBa0FLVUFtQUFFQ0F3VUJBUUFDVEFBQ0FnTmZBQU1ETEUwQUFBQUJYd0FCQVMwQlRoRVNFUkVFQ0JvckFRRWhGU0UxQVNFMUlRSEMvc0lCUmY1akFVRCsyd0Y3QWdYK1BFRTBBY1kvLy84QUxBQUFBY2tDN2dBaUFpd0FBQUVIQXpZQnV3QXRBQWl4QVFHd0xiQTFLd0FBLy84QUxBQUFBY2tDN2dBaUFpd0FBQUVIQXprQm1RQXRBQWl4QVFHd0xiQTFLd0FBLy84QUxBQUFBY2tDOGdBaUFpd0FBQUVIQXpRQmZRQXRBQWl4QVFHd0xiQTFLd0FBQUFJQU5nR0ZBVndDeUFBZ0FDd0FVVUJPRndFREJCWUJBZ01RQVFjQ0p5WUNCUWNGQVFBRkJVd0FCQUFEQWdRRGFRQUNBQWNGQWdkcEJnZ0NCUUFBQlZrR0NBSUZCUUJoQVFFQUJRQlJBQUFxS0NRaUFDQUFIeVFrSkNNaUNRc2JLd0VIQmlNaUp3WUdJeUltTlRRMk16SVhOVFFtSXlJSEp6WTJNeklXRlJVVU15WVdNekkyTnpVbUl5SUdGUUZjQkE4VEtna1ROeHN0TzBZOElTY2pJeWtzRXhFK0lUYzhGOTRnSFJvdERpWVpKUzRCcnlRRktCTVdNeW93TFFjYUppRVdKUTBUTnpXVkdCd2FGQTQrQ1J3Y0FBQUFBZ0F3QVlNQll3TElBQXNBRndBdlFDd0VBUUVGQVFNQ0FRTnBBQUlBQUFKWkFBSUNBR0VBQUFJQVVRd01BQUFNRnd3V0VoQUFDd0FLSkFZTEZ5c0FGaFVVQmlNaUpqVTBOak1HQmhVVUZqTXlOalUwSmlNQkQxUlhSa05UVmtZdE5EUXJLek16S3dMSVYwaE1XbGhJUzFveFBqUTBQajQwTkQ0QUFBSUFIUUFBQW9NQ3ZBQURBQVlBR1VBV0FBQUFHazBBQWdJQllBQUJBUnNCVGhJUkVBTUhHU3NCTXdFaEFRTWhBU0ZjQVFiOW1nRXh5d0dXQXJ6OVJBSnovYzRBQVFBNkFBQUMwQUxJQUNNQUtrQW5GQVlDQVFBQlRBQUNBZ1ZoQUFVRkdrMEVBUUFBQVY4REFRRUJHd0ZPSmhFWEp4RVNCZ2NjS3dBR0J6TVZJelUyTmpVMEppWWpJZ1lHRlJRV0Z4VWpOVE1tSmpVME5qWXpNaFlXRlFMUVdFS2ErazFnUkhKR1JuVkdZRTc2azBCVFlKbFZWNVpiQVFxZExqOHhPWkp1V1lCQ1FvRmFicE0yTVQ4dGxXdHduVTlTbTJnQUFBRUFWdjh5QWdZQ0RBQVVBRlpBQ3hRRUFnVUFDZ0VCQlFKTVM3QVVVRmhBRndRQkFBQWNUUUFGQlFGaEFnRUJBUnROQUFNREhnTk9HMEFiQkFFQUFCeE5BQUVCRzAwQUJRVUNZUUFDQWgxTkFBTURIZ05PV1VBSkl4RVRJeEVRQmdjY0t3RXpFU01uQmdZaklpWW5GU01STXhFVUZqTXlOd0crU0RZUUlrWXpMVWNUU0VoT09sbytBZ3o5OUU0dExSY1k4UUxhL3FrK1FtWUFBQUVBVFAvOEFsRUNEQUFVQUN0QUtBY0JBUUFCVEFVREFnQUFCbDhBQmdZY1RRQUJBUUpoQkFFQ0FoMENUaEVSRVJJakl4QUhCeDByQVNNUkZCWXpNamNIQmlNaU5SRWpFU01SSXpVaEFsRlBFaFFPQ0FjTkhsSGNTRXNDQlFIUC9vNFdGUUl3Q0dBQmMvNHhBYzg5QUFBQ0FEYi85QUpNQXNrQUR3QWNBQ3hBS1FVQkF3TUJZUVFCQVFGUVRRQUNBZ0JoQUFBQVVRQk9FQkFBQUJBY0VCc1hGUUFQQUE0bUJnb1hLd0FXRmhVVUJnWWpJaVltTlRRMk5qTU9BaFVVRmpNeU5qVTBKaU1CajNkR1NIbEtTbmxJU254S08xZ3habGhZWjJKWUFzbFBvWGQ1cFZCT29uZDVwVkJDUm9kZmk1dWNrSTJaQUFBQUFRQTNBQUFCelFLOEFBb0FLVUFtQ1FnSEF3QURBVXdFQVFNRFNFMENBUUFBQVY4QUFRRkpBVTRBQUFBS0FBb1JFUkVGQ2hrckFSRXpGU0UxTXhFSEp6Y0JSSW4rZ0sybkhOY0N2UDJJUkVRQ0kwODZhZ0FBQUFFQVNBQUFBalVDeUFBY0FDdEFLQkVRQWdBQ0FVd0VBUUFCU3dBQ0FnTmhBQU1EVUUwQUFBQUJYd0FCQVVrQlRpVXBFUkFFQ2hvck55RVZJVFUzTno0Q05UUW1JeUlHQnljMk5qTXlGaFlWRkFZR0I2WUJqLzRUeHlrM1BTZGFURE5pSXlJdGVEOUlhamN2VDBoRlJVV3dKQzgrU1N4RFNDVWFNeU1yTWxnNE9GeFJQd0FBQUFBQkFDTC84d0l4QXNrQUtBQS9RRHdtSlFJREJBWUJBZ01TRVFJQkFnTk1BQU1BQWdFREFta0FCQVFGWVFZQkJRVlFUUUFCQVFCaEFBQUFVUUJPQUFBQUtBQW5KQ0VrSkMwSENoc3JBQllXRlJRR0J4VVdGaFVVQmdZaklpWW5OeFl6TWpZMU5DWWpJelV6TWpZMU5DWWpJZ2NuTmpNQmNXbzFTRHBHWFVtQlVVYUFMaWhhYzE1dmJXaEdRVkJyWDB4a1Z5WmppUUxKTFV3dk9Wa1RBd2xhU0Q1a09Tb2tOME5UUkVORFFVTTlORUJDTUZRQUFBQUFBZ0F4QUFBQ1VnSzhBQW9BRFFBeVFDOExBUUFFQ1FFQkFBSk1CUUVBQXdFQkFnQUJad1lCQkFSSVRRQUNBa2tDVGdBQURRd0FDZ0FLRVJFUkVRY0tHaXNCRVRNVkl4VWpOU0UxQVFjQklRSGtibTVNL3BrQmNRZis2UUVYQXJ6K1FqKy92emdCeFduK3F3QUFBUUJYLy9NQ1BBSzhBQjRBUDBBOEF3RUVBUjBjRVFNREJCQUJBZ01EVEFBQkFBUURBUVJwQUFBQUJWOEdBUVVGU0UwQUF3TUNZUUFDQWxFQ1RnQUFBQjRBSGlRa0pTTVJCd29iS3dFVklSVTJOak15RmhVVUJnWWpJaVluTnhZek1qWTFOQ1lqSWdZSEp4RUNFZjYySTFZdFhYSkJmVmMrYXlja1JtUmZiVTVGTGxJck5RSzhRZklXRjJ0b1NHdzhJQ0UxTkY1UVNVc2FIeU1CV3dBQUFBSUFOdi96QWpvQ3lRQWFBQ2NBUlVCQ0VBRUNBUkVCQXdJa0Z3SUZCQU5NQmdFREFBUUZBd1JwQUFJQ0FXRUFBUUZRVFFjQkJRVUFZUUFBQUZFQVRoc2JBQUFiSnhzbUlpQUFHZ0FaSkNVbUNBb1pLd0FXRmhVVUJnWWpJaVkxTkRZMk16SVhCeVltSXlJR0J6WTJNeEkyTmpVMEppTWlCZ2NXRmpNQmtHbEJRWFJMZW9wVGhsSmhXQ0VpVVNoZ2ZRRW9jam9lVVN4ZFJ6dG9KUXRlVWdHN0wyTklRMjArcjZ1R3FrdzBPaFVYamFNdE4vNTZLMHd2UzFFNU1tcHRBQUVBSHdBQUFoRUN2QUFHQUI5QUhBSUJBZ0FCVEFBQ0FnQmZBQUFBU0UwQUFRRkpBVTRSRWhBRENoa3JFeUVWQVNNQklSOEI4djdBVkFGRS9sNEN2RUw5aGdKNEFBQUFBQU1BTnYvekFqWUN5UUFiQUNjQU5RQkVRRUVVQmdJRkFnRk1BQUlJQVFVRUFnVnBCd0VEQXdGaEJnRUJBVkJOQUFRRUFHRUFBQUJSQUU0b0tCd2NBQUFvTlNnMEx5MGNKeHdtSWlBQUd3QWFMQWtLRnlzQUZoWVZGQVlIRmhZVkZBWUdJeUltSmpVME5qY21KalUwTmpZekJnWVZGQll6TWpZMU5DWWpBZ1lHRlJRV016STJOVFFtSmlNQmZXZzVQelE4VDBGMVRVdHpQMUU4TkQ4NWFVWkpWVmxGUlZkVVNEWlVMbUZXVldBdVVqVUN5UzFSTkRkU0V3NW5SRHRlTmpSZVBVSnBEaEpQTnpSVEwwRS9PRGxBUURrNFAvN1hKMFVzUkU1TVFTMUhLUUFBQUFJQU52L3pBam9DeVFBYkFDY0FSVUJDSGhBQ0JRUUtBUUVDQ1FFQUFRTk1Cd0VGQUFJQkJRSnBBQVFFQTJFR0FRTURVRTBBQVFFQVlRQUFBRkVBVGh3Y0FBQWNKeHdtSWlBQUd3QWFKQ1VsQ0FvWkt3QVdGUlFHQmlNaUppYzNGaFl6TWpZM0JnWWpJaVltTlRRMk5qTVNOamNtSmlNaUJoVVVGak1Cc0lwUmhGSS9ieVFnS0dJc1huY0RLM1k3T1dVL1FYUktKRzRsQ2wxVFVHSlpSZ0xKcjYyR3FVc2ZFem9VRm9pZ0tUUXdZVVpHYmo3K2V6WXVibkZmUzBsUUFBSUFOUC96QWlZQ0dRQVBBQjRBTEVBcEJRRURBd0ZoQkFFQkFWTk5BQUlDQUdFQUFBQlJBRTRRRUFBQUVCNFFIUmdXQUE4QURpWUdDaGNyQUJZV0ZSUUdCaU1pSmlZMU5EWTJNdzRDRlJRV0ZqTXlOalkxTkNZakFYMXRQRU4wUjBkdlBrUjJTRFZUTUMxT01USlNMbHhMQWhsRGVVMVRna2hHZkU1U2ZrWkJOV0UrUEY0Mk9HUS9XbThBQVFBL0FBQUJyUUlNQUFvQUtVQW1DUWdIQXdBREFVd0VBUU1EUzAwQ0FRQUFBV0FBQVFGSkFVNEFBQUFLQUFvUkVSRUZDaGtyQVJFekZTRTFNeEVISnpjQk1YeituNXVNSEw4Q0RQNHpQejhCZTA0eGJ3QUFBQUVBS0FBQUFjUUNHUUFYQURCQUxSVVVBZ0FDQ2dFQkFBSk1BQUlDQTJFRUFRTURVMDBBQUFBQlh3QUJBVWtCVGdBQUFCY0FGaWNSRmdVS0dTc0FGaFVVQmdjSElSVWhOVGMyTmpVMEppTWlCZ2NuTmpNQlMyWkZYWUlCTi81a3BsSkhSamtwVlI0Z1hXc0NHVlZKTW1ORllqODZmVDFSTGpBMkh4Z3dSd0FBQVFBRS8wTUI5UUlaQUNnQWFrQVRKUUVFQlNRQkF3UUZBUUlERVJBQ0FRSUVURXV3SFZCWVFCNEFBd0FDQVFNQ2FRQUVCQVZoQmdFRkJWTk5BQUVCQUdFQUFBQk5BRTRiUUJzQUF3QUNBUU1DYVFBQkFBQUJBR1VBQkFRRllRWUJCUVZUQkU1WlFBNEFBQUFvQUNja0lTUWtMQWNLR3lzQUZoVVVCZ2NWRmhZVkZBWUdJeUltSnpjV016STJOVFFtSXlNMU16STJOVFFtSXlJSEp6WTJNd0ZsY0VzNFIxeEJkMDVFZXl3bVcybFpZbVpmT3paTVgwdERWbFFmS1c4OEFobGNURDVhRFFNSlhrcytZRFlxSlROQlZFSkRSVUZEUGpjOU1qTWRJd0FDQUF2L1VBSXVBZ3dBQ2dBTkFFOUFDZ3NCQUFRSUFRRUFBa3hMc0J0UVdFQVhBQUlCQW9ZQUJBUkxUUVVCQUFBQlh3TUJBUUZKQVU0YlFCVUFBZ0VDaGdVQkFBTUJBUUlBQVdjQUJBUkxCRTVaUUFrU0VoRVJFUkFHQ2h3ckpUTVZJeFVqTlNFMUFUTUhBU0VCdjI5dlNmNlZBWEZEUi83aEFSOU5POExDT0FIQ1hmNmVBQUFBQVFBbi8wTUNHQUlNQUI4QVpFQU5Bd0VFQVI0ZEVSQUVBd1FDVEV1d0hWQllRQjRBQVFBRUF3RUVhUUFBQUFWZkJnRUZCVXROQUFNREFtRUFBZ0pOQWs0YlFCc0FBUUFFQXdFRWFRQURBQUlEQW1VQUFBQUZYd1lCQlFWTEFFNVpRQTRBQUFBZkFCOGtKU1VqRVFjS0d5c0JGU0VWTmpZek1oWVZGQVlHSXlJbUp6Y1dGak15TmpVMEppTWlCZ2NuRVFIdS9yWWJWaTloYzBGNFVFSjVMU1FwWnpWVloxWkVKMU1tTmdJTVFPd1RHWEJsU200OEtpZzVKQ1pkVWt4UEhCMGVBVmtBQUFBQ0FEWC84d0kwQXNrQUdnQW1BRVZBUWhFQkFnRVNBUU1DSXhjQ0JRUURUQVlCQXdBRUJRTUVhUUFDQWdGaEFBRUJVRTBIQVFVRkFHRUFBQUJSQUU0Ykd3QUFHeVliSlNFZkFCb0FHU1FsSmdnS0dTc0FGaFlWRkFZR0l5SW1OVFEyTmpNeUZoY0hKaU1pQmdjMk5qTVNOalUwSmlNaUJnY1dGak1CbG1RNlAzTkxlb2hUakZVdVZod2JRa2xoZlFZcWFVVXpYMVpFUDJvbENXQlNBYzQzWmtSSGNrR3dvWDZ3VnhrU09DS1NrakU1L21aa1VVMVpRRGh1ZFFBQUFBQUJBQlQvVUFIZUFnd0FCZ0FmUUJ3Q0FRSUFBVXdBQVFJQmhnQUNBZ0JmQUFBQVN3Sk9FUklRQXdvWkt4TWhGUUVqQVNFVUFjcitzbEFCVC82RkFndy8vWU1DZWdBQUFBQURBQzMvOXdJY0Fza0FIQUFvQURRQVJFQkJGUVlDQlFJQlRBQUNDQUVGQkFJRmFRY0JBd01CWVFZQkFRRlFUUUFFQkFCaEFBQUFVUUJPS1NrZEhRQUFLVFFwTXk4dEhTZ2RKeU1oQUJ3QUd5MEpDaGNyQUJZV0ZSUUdCeDRDRlJRR0JpTWlKaVkxTkRZM0ppWTFORFkyTXdZR0ZSUVdNekkyTlRRbUl3SUdGUlFXTXpJMk5UUW1Jd0ZvWWpVOU55ZENLRHh4VGt4dk9WSS9OajQ0WkVKQ1VWTTlQRk5NUDFCaVhGQlJYbUpNQXNrdFVUTTFVaFFKTkZFdk9WdzBORnM2UjJjUEUxRTJORkV0UUQ4Mk9EOC9PRFkvL3ROVFEwQlFVVUJDVXdBQUFBSUFJZjlEQWlBQ0dRQVpBQ1VBYmtBUEhBOENCUVFLQVFFQ0NRRUFBUU5NUzdBZFVGaEFId2NCQlFBQ0FRVUNhUUFFQkFOaEJnRURBMU5OQUFFQkFHRUFBQUJOQUU0YlFCd0hBUVVBQWdFRkFta0FBUUFBQVFCbEFBUUVBMkVHQVFNRFV3Uk9XVUFVR2hvQUFCb2xHaVFnSGdBWkFCZ2pKQ1VJQ2hrckFCWVZGQVlHSXlJbUp6Y1dNekkyTndZaklpWW1OVFEyTmpNU05qY21KaU1pQmhVVUZqTUJsNGxVakZVellDSWJWa3BoZlFWWmVrRmxPajl6U3locEpBaGdVazlmV0VjQ0diR2dmckJYSEJVM0o1Q1NhVFptUkVkelF2NWpRRFp3ZG1WU1RWZ0FBQUlBUFAvekFrNEN5UUFQQUJzQUxFQXBCUUVEQXdGaEJBRUJBVkJOQUFJQ0FHRUFBQUJSQUU0UUVBQUFFQnNRR2hZVUFBOEFEaVlHQ2hjckFCWVdGUlFHQmlNaUppWTFORFkyTXdZR0ZSUVdNekkyTlRRbUl3R09lRWhJZVVoSWVVaEllRWxXWldWV1ZtVmtWd0xKVDZSN2Q2SlBUNkozZTZSUFJwcU9pcGlaaVk2YUFBRUFoZ0FBQWg0Q3ZBQUtBQ2xBSmdrSUJ3TUFBd0ZNQkFFREEwaE5BZ0VBQUFGZkFBRUJTUUZPQUFBQUNnQUtFUkVSQlFvWkt3RVJNeFVoTlRNUkJ5YzNBWldKL242dHB4elhBcno5aGtKQ0FpVlBPbW9BQVAvL0FGSUFBQUkvQXNnQUFnSTRDZ0FBQVFBOC8vTUNTd0xJQUNvQVAwQThLQ2NDQXdRR0FRSURFaEVDQVFJRFRBQURBQUlCQXdKbkFBUUVCV0VHQVFVRlVFMEFBUUVBWVFBQUFGRUFUZ0FBQUNvQUtTUWhKU1V0QndvYkt3QVdGaFVVQmdjVkZoWVZGQVlHSXlJbUp6Y1dGak15TmpZMU5DWWpJelV6TWpZMU5DWWpJZ2NuTmpNQmkyczFSenRHWEVpQVVVZUFMeWtuWmpwQ1hqRm9iRWhEVUdsZFRtRlZLV1NKQXNnc1N5dzlXQlFEQ0Y5RFFHUTRLU1U4SGlZcFF5ZEZQVVZBUFRKQVFqVlRBQUFDQUNrQUFBSkxBcndBQ2dBTkFESkFMdzBCQUFRSkFRRUFBa3dGQVFBREFRRUNBQUZuQmdFRUJFaE5BQUlDU1FKT0FBQU1Dd0FLQUFvUkVSRVJCd29hS3dFUk14VWpGU00xSVRVQkFTRVJBZDV0YlV2K2xnRnovdUlCRlFLOC9rTkF2Nzg1QWNUK1F3RlJBQUFCQUZqLzh3STlBcjhBSFFBL1FEd0RBUVFCSEJzUUF3TUVEd0VDQXdOTUFBRUFCQU1CQkdrQUFBQUZYd1lCQlFWSVRRQURBd0poQUFJQ1VRSk9BQUFBSFFBZEpDTW1JaEVIQ2hzckFSVWhGVFl6TWhZV0ZSUUdCaU1pSnpjV016STJOVFFtSXlJR0J5Y1JBZ3orcUVCZVAydEJRWHBVaUU0a1JHdFpiRjlLTGxFbU53Sy9SKzh0TGw5RlNHMDhRVG96VzB0SFN4c2RJd0ZoQUFBQ0FFVC85QUpJQXNnQUdnQW1BRVZBUWdJQkFBTURBUUVBSFFnQ0JBVURUQUFCQndFRkJBRUZhUUFBQUFOaEJnRURBMUJOQUFRRUFtRUFBZ0pSQWs0Ykd3QUFHeVliSlNFZkFCb0FHU1lrSkFnS0dTc0FGaGNISmlNaUJnYzJOak15RmhZVkZBWUdJeUltTlRRMk5qTUNCZ2NXRmpNeU5qVTBKaU1CcDE4cEtFdGRXWGNCSzJGRU9teEVRbk5HZ0lsUWdVeEpZU0VFWDA5U1lXRk1Bc2djR3p3c2pLRXRNUzVmUmtKclBxNnlnS2ROL3FZMkwySnRYRWhGU3dBQUFBQUJBRXNBQUFJL0Fyd0FCZ0FmUUJ3Q0FRRUNBVXdBQWdJQVh3QUFBRWhOQUFFQlNRRk9FUklRQXdvWkt4TWhGUUVqQVNGTEFmVCt2MVVCUi81YkFyeEYvWWtDZUFBQUFBQURBRWIvOHdKR0FzZ0FHd0FuQURRQVJFQkJGQVlDQlFJQlRBQUNDQUVGQkFJRmFRY0JBd01CWVFZQkFRRlFUUUFFQkFCaEFBQUFVUUJPS0NnY0hBQUFLRFFvTXk4dEhDY2NKaUlnQUJzQUdpMEpDaGNyQUJZV0ZSUUdCeDRDRlJRR0JpTWlKalUwTmpjbUpqVTBOall6QmdZVkZCWXpNalkxTkNZakFnWUdGUlFXTXpJMk5UUW1Jd0dOYVRrOE55VS9KanR6VVh5RlVUczJQVGxwUmtkVldVTkVXRk5KTlZJdVhWaFhXMkpRQXNndFVESTRVaFFKTkU0dFBWNDFjbDFFWnc0VVVqZ3lVQzFEUGpVM1BqMDROVDcrMVNWQ0trSk9Ua0pBVVFBQUFBSUFRUC8wQWtrQ3lBQVpBQ1lBUlVCQ0lnNENCQVVKQVFFQ0NBRUFBUU5NQUFRQUFnRUVBbWtIQVFVRkEyRUdBUU1EVUUwQUFRRUFZUUFBQUZFQVRob2FBQUFhSmhvbElCNEFHUUFZSkNRa0NBb1pLd0FXRlJRR0l5SW1KemNXTXpJMk53WUdJeUltSmpVME5qWXpCZ1lWRkJZek1qWTNMZ0lqQWJxUHFJNUFaQzhnVW1Sb2dRRTJaVWM5WkR4Q2IwRkhYbEJHUUg0YUF6aFdNUUxJcHFMUXZDRWNQVFNVblM4cE1tSkZRbVEyUmxOQ1JrNDJLRVJjS3dBQUFnQTgvL01DTHdJWkFBOEFIZ0FzUUNrRkFRTURBV0VFQVFFQlUwMEFBZ0lBWVFBQUFGRUFUaEFRQUFBUUhoQWRHQllBRHdBT0pnWUtGeXNBRmhZVkZBWUdJeUltSmpVME5qWXpEZ0lWRkJZV016STJOalUwSmlNQmhtMDhRM1ZIUm04L1JIZElOVk13TEU4d00xRXZYRXdDR1VONVRWT0NTRVo4VGxKK1JrRTFZVDQ4WGpZNFpEOWFid0FCQUhnQUFBSU9BZ3dBQ2dBcFFDWUpDQWNEQUFNQlRBUUJBd05MVFFJQkFBQUJZQUFCQVVrQlRnQUFBQW9BQ2hFUkVRVUtHU3NCRVRNVklUVXpFUWNuTndGK2tQNXR1YUFjMHdJTS9qTS9Qd0Y4V0RGNEFBQUFBUUJrQUFBQ0p3SVpBQmdBTUVBdERnMENBd0VEQVFBREFrd0FBUUVDWVFBQ0FsTk5CQUVEQXdCZkFBQUFTUUJPQUFBQUdBQVlKU2NSQlFvWkt5VVZJVFUrQWpVMEppTWlCZ2NuTmpZek1oWVZGQVlHQndJbi9qMldrVE5DT3k1WElTQXFhejFZWkR1RGZqOC9PbUJ0UlNVME5CNFpNQjhvVWtjeVdHWlJBQUFCQURYL1F3SW5BaGtBS0FCcVFCTWxBUVFGSkFFREJBVUJBZ01SRUFJQkFnUk1TN0FkVUZoQUhnQURBQUlCQXdKcEFBUUVCV0VHQVFVRlUwMEFBUUVBWVFBQUFFMEFUaHRBR3dBREFBSUJBd0pwQUFFQUFBRUFaUUFFQkFWaEJnRUZCVk1FVGxsQURnQUFBQ2dBSnlRaEpDUXNCd29iS3dBV0ZSUUdCeFVXRmhVVUJnWWpJaVluTnhZek1qWTFOQ1lqSXpVek1qWTFOQ1lqSWdjbk5qWXpBWmR3U3poSFhFRjNUa1I4TENaYmFWcGlabUE3TmsxZlMwTlhWQjhwYnowQ0dWeE1QbG9OQXdsZVN6NWdOaW9sTTBGVVFrTkZRVU0rTnoweU14MGpBQUlBTC85UUFsQUNEQUFLQUEwQVQwQUtDd0VBQkFnQkFRQUNURXV3RzFCWVFCY0FBZ0VDaGdBRUJFdE5CUUVBQUFGZkF3RUJBVWtCVGh0QUZRQUNBUUtHQlFFQUF3RUJBZ0FCWndBRUJFc0VUbGxBQ1JJU0VSRVJFQVlLSENzbE14VWpGU00xSVRVQk13Y0JJUUhqYlcxSi9wVUJjVU5IL3VFQkgwMDd3c0k0QWNKZC9wNEFBQUFCQUVML1F3SXpBZ3dBSHdCa1FBMERBUVFCSGgwUkVBUURCQUpNUzdBZFVGaEFIZ0FCQUFRREFRUnBBQUFBQlY4R0FRVUZTMDBBQXdNQ1lRQUNBazBDVGh0QUd3QUJBQVFEQVFScEFBTUFBZ01DWlFBQUFBVmZCZ0VGQlVzQVRsbEFEZ0FBQUI4QUh5UWxKU01SQndvYkt3RVZJUlUyTmpNeUZoVVVCZ1lqSWlZbk54WVdNekkyTlRRbUl5SUdCeWNSQWduK3RodFdMMkZ6UVhoUVFua3RKQ2xuTlZWblZrUW5VeVkyQWd4QTdCTVpjR1ZLYmp3cUtEa2tKbDFTVEU4Y0hSNEJXUUFBQUFJQVB2L3pBajBDeVFBYUFDWUFSVUJDRVFFQ0FSSUJBd0lqRndJRkJBTk1CZ0VEQUFRRkF3UnBBQUlDQVdFQUFRRlFUUWNCQlFVQVlRQUFBRkVBVGhzYkFBQWJKaHNsSVI4QUdnQVpKQ1VtQ0FvWkt3QVdGaFVVQmdZaklpWTFORFkyTXpJV0Z3Y21JeUlHQnpZMk14STJOVFFtSXlJR0J4WVdNd0dmWkRvL2MwdDZpRk9NVlM1V0hCdENTV0Y5QmlwcFJUTmZWa1EvYWlVSllGSUJ6amRtUkVkeVFiQ2hmckJYR1JJNElwS1NNVG4rWm1SUlRWbEFPRzUxQUFBQUFBRUFUZjlRQWo0Q0RBQUdBQjlBSEFJQkFnQUJUQUFCQWdHR0FBSUNBRjhBQUFCTEFrNFJFaEFEQ2hrckV5RVZBU01CSVUwQjhmNndVQUZSL2w0Q0RELzlnd0o2QUFBQUFBTUFQdi8zQWk0Q3lRQWNBQ2dBTkFCRVFFRVZCZ0lGQWdGTUFBSUlBUVVFQWdWcEJ3RURBd0ZoQmdFQkFWQk5BQVFFQUdFQUFBQlJBRTRwS1IwZEFBQXBOQ2t6THkwZEtCMG5JeUVBSEFBYkxRa0tGeXNBRmhZVkZBWUhIZ0lWRkFZR0l5SW1KalUwTmpjbUpqVTBOall6QmdZVkZCWXpNalkxTkNZakFnWVZGQll6TWpZMU5DWWpBWGxpTlR3NEowTW9QSEpPVEc4NVV6ODJQamhrUWtOUlZEMDhVMHhBVDJKY1QxSmRZVXdDeVMxUk16WlJGQWswVVM4NVhEUTBXenBHYUE4VFVUWTBVUzFBUHpZNFB6ODROai8rMDFORFFGQlJRRUpUQUFBQUFnQTYvME1DT1FJWkFCa0FKUUJ1UUE4Y0R3SUZCQW9CQVFJSkFRQUJBMHhMc0IxUVdFQWZCd0VGQUFJQkJRSnBBQVFFQTJFR0FRTURVMDBBQVFFQVlRQUFBRTBBVGh0QUhBY0JCUUFDQVFVQ2FRQUJBQUFCQUdVQUJBUURZUVlCQXdOVEJFNVpRQlFhR2dBQUdpVWFKQ0FlQUJrQUdDTWtKUWdLR1NzQUZoVVVCZ1lqSWlZbk54WXpNalkzQmlNaUppWTFORFkyTXhJMk55WW1JeUlHRlJRV013R3hpRlNNVlROZ0lodFdTbUY5QlZsNlFXVTZQM05MS0dra0NHQlNUMTlZUndJWnNLRitzRmNjRlRjbmtKSnBObVpFUjNOQy9tTkFObkIyWlZKTldBRC8vd0FtLzJVQmNBRUNBUWNDYUFBQS8yMEFDYkVBQXJqL2JiQTFLd0FBQVAvL0FFSC9iUUU4QVBvQkJ3SnBBQUQvYlFBSnNRQUJ1UDl0c0RVckFBQUEvLzhBSXY5dEFVWUJBZ0VIQW1vQUFQOXRBQW14QUFHNC8yMndOU3NBQUFELy93QXEvMlVCV0FFQ0FRY0Nhd0FBLzIwQUNiRUFBYmovYmJBMUt3QUFBUC8vQUNUL2JRRmRBUG9CQndKc0FBRC9iUUFKc1FBQ3VQOXRzRFVyQUFBQS8vOEFPdjlsQVZnQStnRUhBbTBBQVA5dEFBbXhBQUc0LzIyd05Tc0FBQUQvL3dBdi8yVUJhQUVDQVFjQ2JnQUEvMjBBQ2JFQUFyai9iYkExS3dBQUFQLy9BQnYvYlFFNUFQb0JCd0p2QUFEL2JRQUpzUUFCdVA5dHNEVXJBQUFBLy84QU1QOWxBV29CQWdFSEFuQUFBUDl0QUFteEFBTzQvMjJ3TlNzQUFBRC8vd0F0LzJVQlpBRUNBUWNDY1FBQS8yMEFDYkVBQXJqL2JiQTFLd0FBQUFBQ0FDYi8rQUZ3QVpVQUN3QVhBQ3BBSndRQkFRVUJBd0lCQTJrQUFnSUFZUUFBQUZFQVRnd01BQUFNRnd3V0VoQUFDd0FLSkFZS0Z5c0FGaFVVQmlNaUpqVTBOak1HQmhVVUZqTXlOalUwSmlNQkYxbGJTMHBhWEUweU5ESXZMek15TGdHVmNGMWVjbXhiWVhVNVVreEVTVTVKU0V3QUFBQUJBRUVBQUFFOEFZMEFDZ0FqUUNBS0NRZ0RBUUFCVEFBQUFRQ0ZBd0VCQVFKZ0FBSUNTUUpPRVJFUkVBUUtHaXNUTXhFekZTTTFNeEVISjc0cVZQdG9VeFVCamY2cU56Y0JEU1V3QUFBQUFBRUFJZ0FBQVVZQmxRQVhBREZBTGhRQkFnTVRBUUFDQ1FFQkFBTk1CQUVEQUFJQUF3SnBBQUFBQVY4QUFRRkpBVTRBQUFBWEFCWW5FUlVGQ2hrckVoWVZGQVlITXhVaE5UNENOVFFtSXlJR0J5YzJOalB1UzFGbHcvN2xVbFFrTENRZE5STWVIVW9uQVpWQ055NW5Uemd5UVU0NUhTTWlGUThyRmh3QUFBQUFBUUFxLy9nQldBR1ZBQ1lBUFVBNkhRRUVCUndCQXdRbUFRSURDUUVCQWdnQkFBRUZUQUFGQUFRREJRUnBBQU1BQWdFREFta0FBUUVBWVFBQUFGRUFUaVFrSVNRa0pBWUtIQ3NrRmhVVUJpTWlKaWMzRmpNeU5qVTBKaU1qTlRNMk5qVTBKaU1pQnljMk5qTXlGaFVVQmdjQktEQlpSaXRLR2gwMFBDc3hMakVuSHlndkpDUTNOUm9hU2lrOVNDY2kwRE1vTmtjYUZqRW5KU0lmSHpRQkhod1lIaUVxRlJzNktoNHpDUUFBQUFBQ0FDUUFBQUZkQVkwQUNnQU5BREZBTGd3QkFRQUtBUUlCQWt3R0JRSUJCQUVDQXdFQ1p3QUFBQU5mQUFNRFNRTk9Dd3NMRFFzTkVSRVJFUkFIQ2hzckV6TVZNeFVqRlNNMUl6VTNOUWZzTkQwOVByNitmQUdOOFRWblp6UUJsNWNBQUFBQUFRQTYvL2dCV0FHTkFCd0FQVUE2QXdFRUFSc2FEd01EQkE0QkFnTURUQVlCQlFBQUFRVUFad0FCQUFRREFRUnBBQU1EQW1FQUFnSlJBazRBQUFBY0FCd2tJeVFqRVFjS0d5c0JGU01WTmpZek1oWVZGQVlqSWljM0ZqTXlOalUwSmlNaUJnY25OUUU4c3cwdEZqbEdXa2xHTlJvdE15NHlKaU1YTUJBcUFZMDVZZ2dMUlRsQlRpZ3VIUzBvSWljUERoUElBQUlBTC8vNEFXZ0JsUUFXQUNJQVJrQkRBUUVBQXdJQkFRQUhBUVVCR1FFRUJRUk1CZ0VEQUFBQkF3QnBBQUVIQVFVRUFRVnBBQVFFQW1FQUFnSlJBazRYRndBQUZ5SVhJUjBiQUJZQUZTUWtJd2dLR1NzQUZ3Y21JeUlHRlRZMk16SVdGUlFHSXlJbU5UUTJNd1lHQnhZV016STJOVFFtSXdFbk54NG5Oak04RmpraE5rNVNSVXhXWms0bk9Rd0NNeWdsTFNzaUFaVW1NQjQvVGhZV1FUczhUR1JrY1dUUkh4TXVOQ3NnSUNrQUFRQWJBQUFCT1FHTkFBWUFIVUFhQWdFQ0FBRk1BQUFBQWdFQUFtY0FBUUZKQVU0UkVoQURDaGtyRXlFVkF5TVRJeHNCSHJCR3F0SUJqUy8rb2dGVEFBTUFNUC80QVdvQmxRQVlBQ1FBTUFBN1FEZ1lEQUlFQWdGTUFBRUdBUU1DQVFOcEFBSUFCQVVDQkdrSEFRVUZBR0VBQUFCUkFFNGxKUmtaSlRBbEx5c3BHU1FaSXlvckpBZ0tHU3NrRmhVVUJpTWlKaVkxTkRZM0ppWTFORFl6TWhZVkZBWUhKZ1lWRkJZek1qWTFOQ1lqRWpZMU5DWWpJZ1lWRkJZekFUNHNXRVV1U0NjdUlSc2lUVDg5VHlNYmNDb3FJaUVyS3lFcUxDOG5LREV1SzhreEpEVkhJVGdpSlRJTUN5c2dManM3THlBckNvZ2RHeG9iR3hvYkhmN1NKaDRnSmljZkhpWUFBZ0F0Ly9nQlpBR1ZBQllBSVFCQlFENGNBUVFGRGdFQ0JBa0JBUUlJQVFBQkJFd0dBUU1BQlFRREJXa0FCQUFDQVFRQ2FRQUJBUUJoQUFBQVVRQk9BQUFmSFJvWUFCWUFGU01rSkFjS0dTc0FGaFVVQmlNaUppYzNGak15TmpjR0l5SW1OVFEyTXdZV016STJOeVlqSWdZVkFSQlVhVXdqUGhZZEtDOHlQZ1EwT3paT1ZFTlVKeU1ZTnhZS1V5VXRBWlZuWVhCbEZCSXVHMEJKSzBNOFBVcXBKUlVUYkNra0FBQUEvLzhBSmdFbkFYQUN4QUVIQW1nQUFBRXZBQW14QUFLNEFTK3dOU3NBQUFELy93QkJBUzhCUEFLOEFRY0NhUUFBQVM4QUNiRUFBYmdCTDdBMUt3QUFBUC8vQUNJQkx3RkdBc1FCQndKcUFBQUJMd0FKc1FBQnVBRXZzRFVyQUFBQS8vOEFLZ0VuQVZnQ3hBRUhBbXNBQUFFdkFBbXhBQUc0QVMrd05Tc0FBQUQvL3dBa0FTOEJYUUs4QVFjQ2JBQUFBUzhBQ2JFQUFyZ0JMN0ExS3dBQUFQLy9BRG9CSndGWUFyd0JCd0p0QUFBQkx3QUpzUUFCdUFFdnNEVXJBQUFBLy84QUx3RW5BV2dDeEFFSEFtNEFBQUV2QUFteEFBSzRBUyt3TlNzQUFBRC8vd0FiQVM4Qk9RSzhBUWNDYndBQUFTOEFDYkVBQWJnQkw3QTFLd0FBQVAvL0FEQUJLd0ZxQXNnQkJ3SndBQUFCTXdBSnNRQUR1QUV6c0RVckFBQUEvLzhBTFFFbkFXUUN4QUVIQW5FQUFBRXZBQW14QUFLNEFTK3dOU3NBQUFELy93QkJBYlFCUEFOQkFRY0NhUUFBQWJRQUNiRUFBYmdCdExBMUt3QUFBUC8vQUNJQnRBRkdBMGtCQndKcUFBQUJ0QUFKc1FBQnVBRzBzRFVyQUFBQS8vOEFLZ0dzQVZnRFNRRUhBbXNBQUFHMEFBbXhBQUc0QWJTd05Tc0FBQUQvL3dBbUFhd0JjQU5KQVFjQ2FBQUFBYlFBQ2JFQUFyZ0J0TEExS3dBQUFQLy9BQ1FCdEFGZEEwRUJCd0pzQUFBQnRBQUpzUUFDdUFHMHNEVXJBQUFBLy84QU9nR3NBVmdEUVFFSEFtMEFBQUcwQUFteEFBRzRBYlN3TlNzQUFBRC8vd0F2QWF3QmFBTkpBUWNDYmdBQUFiUUFDYkVBQXJnQnRMQTFLd0FBQVAvL0FCc0J0QUU1QTBFQkJ3SnZBQUFCdEFBSnNRQUJ1QUcwc0RVckFBQUEvLzhBTUFHc0FXb0RTUUVIQW5BQUFBRzBBQW14QUFPNEFiU3dOU3NBQUFELy93QXRBYXdCWkFOSkFRY0NjUUFBQWJRQUNiRUFBcmdCdExBMUt3QUFBQUFCLzYzL2hnRUVBdXdBQXdBdVM3QWJVRmhBREFJQkFRQUJoZ0FBQUVvQVRodEFDZ0FBQVFDRkFnRUJBWFpaUUFvQUFBQURBQU1SQXdvWEt3Y0JNd0ZUQVJ3Ny91VjZBMmI4bWdELy93QkIvNFlEWXdMc0FDSUNjd0FBQUNNQ2hnRnFBQUFBQXdKcUFoMEFBUC8vQUVIL2hnTnZBdXdBSWdKekFBQUFJd0tHQVdvQUFBQURBbXdDRWdBQS8vOEFLditHQTVBQzdBQWlBblVBQUFBakFvWUJpd0FBQUFNQ2JBSXpBQUQvL3dCQi80WURoZ0xzQUNJQ2N3QUFBQ01DaGdGcUFBQUFBd0p3QWh3QUFQLy9BQ3IvaGdPbkF1d0FJZ0oxQUFBQUl3S0dBWXNBQUFBREFuQUNQUUFBLy84QU92K0dBNjRDN0FBaUFuY0FBQUFqQW9ZQmtnQUFBQU1DY0FKRUFBRC8vd0FiLzRZRFhRTHNBQ0lDZVFBQUFDTUNoZ0ZCQUFBQUF3SndBZk1BQUFBQ0FEci85QUlrQWtVQUR3QWNBQ3hBS1FVQkF3TUJZUVFCQVFFd1RRQUNBZ0JoQUFBQU1RQk9FQkFBQUJBY0VCc1dGQUFQQUE0bUJnZ1hLd0FXRmhVVUJnWWpJaVltTlRRMk5qTUdCaFVVRmpNeU5qWTFOQ1lqQVhsdVBVQnpTa2RzT2o1dlNWQmRXVXcwVVM1ZVR3SkZSNEpXWEl0TFNJTlhYSWxLUG9GdGFYNDliMGhtZXdBQUFRQThBQUFCandJNUFBb0FLVUFtQ1FnSEF3QURBVXdFQVFNRExFMENBUUFBQVdBQUFRRXRBVTRBQUFBS0FBb1JFUkVGQ0JrckFSRXpGU0UxTXhFSEp6Y0JHblgreUg5K0hLd0NPZjRJUVVFQnFUNHlXd0FBQUFFQVNBQUFBZEFDUlFBWEFETkFNQlFCQWdNVEFRQUNDZ0VCQUFOTUFBSUNBMkVFQVFNRE1FMEFBQUFCWHdBQkFTMEJUZ0FBQUJjQUZpY1JGZ1VJR1NzQUZoVVVCZ2NISVJVaE5UYzJOalUwSmlNaUJ5YzJOak1CVW1kSVJvQUJKZjU3bWs4OVN6cEZQeUFwVkRNQ1JWaE5RR2xBZGtFOWpFZFpMRGc0TERRYkhRQUFBQUVBSS8vMEFjTUNSUUFvQUQ5QVBDVWtBZ01FQlFFQ0F4RVFBZ0VDQTB3QUF3QUNBUU1DYVFBRUJBVmhCZ0VGQlRCTkFBRUJBR0VBQUFBeEFFNEFBQUFvQUNja0lTUWtMQWNJR3lzQUZoVVVCZ2NWRmhZVkZBWUdJeUltSnpjV016STJOVFFtSXlNMU16STJOVFFtSXlJSEp6WTJNd0ZLWFRNcU5rTTRaa0E0WnlNZ1NGeEZUMDFRUHprOFN6MDNVa1lnSjJJMUFrVk9PaXRNRUFJSVREa3hVakFrSHpFMlFETTFORDh5TUNzdE5DOGdJd0FBQUFBQ0FEMEFBQUhvQWprQUNnQU5BREpBTHdzQkFBUUpBUUVBQWt3RkFRQURBUUVDQUFGbkJnRUVCQ3hOQUFJQ0xRSk9BQUFOREFBS0FBb1JFUkVSQndnYUt3RVJNeFVqRlNNMUlUVUJCd016QVpWVFUwWCs3UUVlQ3NiR0FqbitsVHFVbERNQmNtUCsrQUFBQUFBQkFGbi85QUhjQWprQUhRQS9RRHdEQVFRQkhCc1FBd01FRHdFQ0F3Tk1BQUVBQkFNQkJHa0FBQUFGWHdZQkJRVXNUUUFEQXdKaEFBSUNNUUpPQUFBQUhRQWRKQ1VsSWhFSENCc3JBUlVoRlRZek1oWVZGQVlHSXlJbUp6Y1dGak15TmpVMEppTWlCeWNSQWJqKytUQkdWV0EwWWtNeVdoNGNIMHNpUkU5SE9VQTRMd0k1UWJja1lFODVXREVjR0RNVkZFZzZOa0F2SFFFaEFBQUNBRlAvOUFINUFrVUFHUUFsQUVWQVFoQUJBZ0VSQVFNQ0loY0NCUVFEVEFZQkF3QUVCUU1FYVFBQ0FnRmhBQUVCTUUwSEFRVUZBR0VBQUFBeEFFNGFHZ0FBR2lVYUpDQWVBQmtBR0NVa0pnZ0lHU3NBRmhZVkZBWUdJeUltTlRRMk16SVdGd2NtSmlNaUJnYzJNeEkyTlRRbUl5SUdCeFlXTXdGd1ZEVXpYajFrZElWck0xTWNJQmxLSTBoYkFVMVpKMGxJTlMxTkhBbEhQZ0ZqSlUwNU4xazBqNCtlbFJ3VU5oSVdjWHBIL3M5S056YzhLeVJQVmdBQUFBRUFId0FBQWFZQ09RQUdBQjlBSEFJQkFnQUJUQUFDQWdCZkFBQUFMRTBBQVFFdEFVNFJFaEFEQ0JrckV5RVZBeU1USVI4QmgvRkk3LzdEQWprNS9nQUIrZ0FBQXdBMS8vUUIwQUpGQUJrQUpRQXhBRVJBUVJNRkFnVUNBVXdBQWdnQkJRUUNCV2tIQVFNREFXRUdBUUVCTUUwQUJBUUFZUUFBQURFQVRpWW1HaG9BQUNZeEpqQXNLaG9sR2lRZ0hnQVpBQmdyQ1FnWEt3QVdGUlFHQnhZV0ZSUUdCaU1pSmlZMU5EWTNKaVkxTkRZekJnWVZGQll6TWpZMU5DWWpCZ1lWRkJZek1qWTFOQ1lqQVZacE1DY3RPekZkUUVCZE1Ed3RKekZuVlRVL1FqTXlRajQyUFUxSlFVQkVSejBDUlZKRExFUU9EbEkyTUV3c0xFd3ZOMUlNRDBZc1FsSTlNaXdzTWpJc0xETDRQak13UHo4eU5Ec0FBQUFBQWdBbi8vUUJ4d0pGQUJjQUl3QkZRRUlhRGdJRkJBa0JBUUlJQVFBQkEwd0hBUVVBQWdFRkFta0FCQVFEWVFZQkF3TXdUUUFCQVFCaEFBQUFNUUJPR0JnQUFCZ2pHQ0llSEFBWEFCWWpKQ1FJQ0JrckFCWVZGQVlqSWlZbk54WXpNalkzQmlNaUppWTFORFl6RWpZM0ppWWpJZ1lWRkJZekFWaHZobTR0U2lVYVBVQk9ZQVJLVlRGVk5IRmFKMU1SQ1VnN09VeEdOd0pGall1Z21SY1ROaUoxZGtFb1R6bFZaUDdVTENOUlRrSTVOajBBQVFCTy8vUUF3Z0JyQUFzQUdVQVdBZ0VCQVFCaEFBQUFVUUJPQUFBQUN3QUtKQU1LRnlzMkZoVVVCaU1pSmpVME5qT2lJQ0FhR2lBZ0dtc2hHeHNnSUJzYklRQUJBRWovaVFEREFHY0FEd0FYUUJRSkJnVURBRWtCQVFBQWRnQUFBQThBRGdJS0ZpczJGaFVVQmdjbk5qWTNKaVkxTkRZenBoMHRNeHNhSUFVVEhCNFhaeUllS0ZNakZCYzBHQUlkRlJnYkFBSUFUdi8xQU1FQ0dBQUxBQmNBTEVBcEJBRUJBUUJoQUFBQVUwMEFBZ0lEWVFVQkF3TlJBMDRNREFBQURCY01GaElRQUFzQUNpUUdDaGNyRWlZMU5EWXpNaFlWRkFZakFpWTFORFl6TWhZVkZBWWpiaUFnR2hvZkh4b2FJQ0FhR2g4ZkdnR2lIeHNiSVNBY0d4LytVeUFiR3lBZ0d4c2dBQUlBVC8rSkFNOENGd0FMQUJzQUpVQWlHdzhDQWtrQUFnRUNoZ01CQVFFQVlRQUFBRk1CVGdBQUZoUUFDd0FLSkFRS0Z5c1NKalUwTmpNeUZoVVVCaU1ETmpZM0ppWTFORFl6TWhZVkZBWUhleDhmR2hvZ0lCcEdHaDhFRWh3ZEdCa2RMVElCb1I4YkhDQWdIQnNmL2Z3WE5CZ0NIUlVZR3lNZEoxUWpBQUQvL3dCMi8vUUN1Z0JyQUNJQ21DZ0FBQ01DbUFFUUFBQUFBd0tZQWZnQUFBQUNBRm4vOUFETkFyd0FBd0FQQUNWQUlnQUJBUUJmQUFBQVNFMEVBUU1EQW1FQUFnSlJBazRFQkFRUEJBNGxFUkFGQ2hrckV6TURJeFlXRlJRR0l5SW1OVFEyTTJoWEVUazRJQ0FhR2lBZ0dnSzgvZ0ZTSVJzYklDQWJHeUVBQUFBQ0FGbi9VUUROQWhrQUN3QVBBQ1JBSVFBREFBSURBbU1FQVFFQkFHRUFBQUJUQVU0QUFBOE9EUXdBQ3dBS0pBVUtGeXNTSmpVME5qTXlGaFVVQmlNVEl4TXplU0FnR2hvZ0lCb3JWeEU1QWFJaEd4c2dJQnNiSWYydkFmOEFBQUFDQUNULzlBSEFBc2dBSEFBb0FEeEFPUmtZQWdBQkFVd0FBQUVFQVFBRWdBQUJBUUpoQlFFQ0FsQk5CZ0VFQkFOaEFBTURVUU5PSFIwQUFCMG9IU2NqSVFBY0FCc3BHd2NLR0NzQUZoWVZGQVlHQnc0Q0ZTTTBOalkzTmpZMU5DWWpJZ2NuTmpZekVoWVZGQVlqSWlZMU5EWXpBUzVnTWhnaUhpTXFIVVFoTENVbUkwMURXVWNoSm1nNkN4OGZHaG9nSUJvQ3lDMVBNU0kwSlJzZk1Fa3hQVlkwSUNFd0l6UTlPamdlSlAyaklCd2JJQ0FiSENBQUFnQTEvMFVCMGdJWkFBc0FLQUJsdGlVa0FnTUNBVXhMc0JsUVdFQWZBQUlCQXdFQ0E0QUZBUUVCQUdFQUFBQlRUUUFEQXdSaUJnRUVCRTBFVGh0QUhBQUNBUU1CQWdPQUFBTUdBUVFEQkdZRkFRRUJBR0VBQUFCVEFVNVpRQlFNREFBQURDZ01KeU1oR0JjQUN3QUtKQWNLRnlzQUpqVTBOak15RmhVVUJpTUNKaVkxTkRZMk56NENOVE1VQmdZSEJnWVZGQll6TWpjWEJnWWpBUDhnSUJvYUlDQWFVV0F6R0NJZUlpc2VReUV0SkNZaVRVSllTQ0ltYURzQm9pRWJHeUFnR3hzaC9hTXRUekVpTkNVYkhqQkpNVDFXTkI4aUx5TTBQVGs0SGlNQUFBQUFBUUJGQVFzQTRBR29BQXNBSDBBY0FnRUJBQUFCV1FJQkFRRUFZUUFBQVFCUkFBQUFDd0FLSkFNS0Z5c1NGaFVVQmlNaUpqVTBOak96TFMwaElDMHRJQUdvSmljbktTa25KeVlBQUFFQVFRRHFBUDhCcmdBTEFCNUFHd0FBQVFFQVdRQUFBQUZoQWdFQkFBRlJBQUFBQ3dBS0pBTUtGeXMySmpVME5qTXlGaFVVQmlONU9EZ25Kemc0Sitvek1DOHlNaTh3TXdBQUFBQUJBRHdCT2dIWEFyd0FFUUFtUUNNUkVBOE9EUXdMQ0FjR0JRUURBZzRBQVFGTUFBQUFBVjhBQVFGSUFFNFlFQUlLR0NzQkl6Y0hKemNuTnhjbk13YzNGd2NYQnljQkwwa05reUNmb3lPVERVa1FseUtvcUNLV0FUcWZaRGRPVGp4am01dGpPVk5LTjJJQUFBQUNBQ1VBQUFLS0Fyd0FHd0FmQUhwTHNCbFFXRUFvRGdjQ0FRWUVBZ0lEQVFKbkRBRUtDa2hORHdnQ0FBQUpYeEFOQ3dNSkNVdE5CUUVEQTBrRFRodEFKaEFOQ3dNSkR3Z0NBQUVKQUdnT0J3SUJCZ1FDQWdNQkFtY01BUW9LU0UwRkFRTURTUU5PV1VBZUFBQWZIaDBjQUJzQUd4b1pHQmNXRlJRVEVSRVJFUkVSRVJFUkVRb2ZLd0VWSXdjekZTTUhJemNqQnlNM0l6VXpOeU0xTXpjekJ6TTNNd2NITXpjakFvcWVHYUNtR2pjYXFCbzVHNUdZR1p1aUdqY1pwaGszR2YybkdhY0IrRFRETk0zTnpjMDB3elRFeE1URTk4TUFBQUFBQVFBSy83b0JPd0x3QUFNQUxrdXdHRkJZUUF3Q0FRRUFBWVlBQUFCS0FFNGJRQW9BQUFFQWhRSUJBUUYyV1VBS0FBQUFBd0FERVFNS0Z5c1hFek1EQ3UxRTdVWUROdnpLQUFBQUFBRUFDdis2QVRzQzhBQURBQ1pMc0JoUVdFQUxBQUVBQVlZQUFBQktBRTRiUUFrQUFBRUFoUUFCQVhaWnRCRVFBZ29ZS3hNekV5TUtSTzFFQXZEOHlnQUIvMFFCTlAvRUFiWUFDd0FmUUJ3Q0FRRUFBQUZaQWdFQkFRQmhBQUFCQUZFQUFBQUxBQW9rQXdvWEt3SVdGUlFHSXlJbU5UUTJNMkVsSlJzYkpTVWJBYllnSUNFaElTRWdJQUFBQWYvbkFVQUFVZ0dzQUFzQUhrQWJBQUFCQVFCWkFBQUFBV0VDQVFFQUFWRUFBQUFMQUFva0F3b1hLeEltTlRRMk16SVdGUlFHSXdZZkh4WVhIeDhYQVVBY0doc2JHeHNhSEFBQUFBRUFUditaQVRnREd3QVFBQWF6RUFrQk1pc0JEZ0lWRkJZV0Z3Y21KalUwTmpZM0FUY0VXRWM5UVNZZFJZaE5XeVFDK0FSVnhueDhyVlVqSXkvU3c0dStYeFlBQVFBcy81a0JGZ01iQUJBQUJyTUhBQUV5S3hNZUFoVVVCZ2NuUGdJMU5DWW1KMG9rVzAySVJSMG5RRDA5TmpBREd4WmZ2b3ZEMGk4akpsS3RmSHlxUXpJQUFBQUJBRW4vdVFGUEF3NEFJUUFkUUJvYUdSRUlBQVVBQVFGTUFBRUFBWVVBQUFCMklTQVRFZ0lLRmlzQkJnWVZGUlFHQmdjVkhnSVZGUlFXRnhVaUpqVTFOQ1luTlRZMk5UVTBOak1CVHk0MUhDZ1JFU2djTmkxUVd6SXBKelJjVHdMZ0JVQXpreDB3SHdNRUF5QXhISk16UVFZc1hFdDlNamNGTWdjM0wzeExYUUFBQUFBQkFESC91UUUzQXc0QUlRQWJRQmdoR0JBSUJ3VUJBQUZNQUFBQkFJVUFBUUYySFJBQ0NoZ3JFeklXRlJVVUZoY1ZCZ1lWRlJRR0l6VTJOalUxTkRZMk56VXVBalUxTkNZbk1VNWRNeWdwTWx4UExUWWNLQkVSS0J3MUxnTU9YVXQ4THpnR01nVTNNbjFMWEN3R1FUT1RIREVnQXdRREh6QWRrek5BQlFBQUFBRUFUZitOQU9VREhBQUhBQ0pBSHdBQUFBRUNBQUZuQUFJREF3SlhBQUlDQTE4QUF3SURUeEVSRVJBRUNob3JFek1WSXhFekZTTk5tRlZWbUFNY08vem5Pd0FBQVFBNC80MEEwQU1jQUFjQUlrQWZBQUFBQXdJQUEyY0FBZ0VCQWxjQUFnSUJYd0FCQWdGUEVSRVJFQVFLR2lzVE14RWpOVE1SSXppWW1GVlZBeHo4Y1RzREdRQUJBRTBCZWdEckEzb0FEUUFHc3cwSEFUSXJFd1lHRlJRV0Z3Y21KalUwTmpmck1TOHRNU2M4T1RrOEExc3piVDQvYlRNa05IOVFUbmsyQUFBQkFFTUJlZ0RpQTNvQURBQUdzd1lBQVRJckV4WVdGUlFHQnljMk5qVTBKMnc5T1RvOEpqRXRZUU42Tm5wTlQzODFKRE50UDNwa0FBRUFUUUVGQVdjQlJBQURBQmhBRlFBQUFRRUFWd0FBQUFGZkFBRUFBVThSRUFJS0dDc1RJUlVoVFFFYS91WUJSRDhBQVAvL0FFMEJCUUZuQVVRQUFnS3hBQUFBQVFCTkFPVUNDd0VrQUFNQUdFQVZBQUFCQVFCWEFBQUFBVjhBQVFBQlR4RVFBZ29ZS3hNaEZTRk5BYjcrUWdFa1B3QUFBQUVBVFFEbEExTUJKQUFEQUJoQUZRQUFBUUVBVndBQUFBRmZBQUVBQVU4UkVBSUtHQ3NUSVJVaFRRTUcvUG9CSkQ4QUFBQUJBRVQvd1FLRy8vZ0FBd0Fnc1Faa1JFQVZBQUFCQVFCWEFBQUFBVjhBQVFBQlR4RVFBZ29ZSzdFR0FFUVhJUlVoUkFKQy9iNElOd0FBQUFBQkFFMENmUUU3QXJFQUF3QVRRQkFBQVFFQVh3QUFBRWdCVGhFUUFnb1lLeE16RlNOTjd1NENzVFFBQUFFQUkvK1RBSjRBY1FBUEFCQkFEUThEQWdCSkFBQUFkaWdCQ2hjckZ6WTJOeVltTlRRMk16SVdGUlFHQnlNYUlBUVNIQjRYR1IwdU0xa1hOQmdESEJVWUd5SWRLRlFqLy84QUkvK1RBVGNBY1FBaUFyY0FBQUFEQXJjQW1RQUEvLzhBTndIckFVd0N5UUFpQXJzQUFBQURBcnNBbVFBQS8vOEFJd0hyQVRjQ3lRQWlBcndBQUFBREFyd0FtUUFBQUFFQU53SHJBTE1DeVFBUEFCZEFGQWtHQlFNQVNnRUJBQUIyQUFBQUR3QU9BZ29XS3hJbU5UUTJOeGNHQmdjV0ZoVVVCaU5WSGk0ekd4c2dCQkljSGhjQjZ5SWRLRk1rRlJjMEdBTWNGUmdhQUFBQUFBRUFJd0hyQUo0Q3lRQVBBQmxBRmdrR0JRTUFTUUVCQUFCUUFFNEFBQUFQQUE0Q0NoWXJFaFlWRkFZSEp6WTJOeVltTlRRMk00RWRMak1hR2lBRUVod2VGd0xKSXgwb1V5TVVGelFZQXh3VkdCc0FBQUlBSFFCTEFZa0J0QUFGQUFzQUNMVUpCd01CQWpJck53Y25OeGNIQlFjbk54Y0gzeXlXbEM5M0FTQXNscFF1ZG5FbXRMVW1qbzhtdExVbWpnQUFBQUFDQUVNQVN3R3ZBYlFBQlFBTEFBaTFDUWNEQVFJeUt4TTNGd2NuUHdJWEJ5YzNReStVbGkxM015K1RsUzE0QVk0bXRiUW1qNDRtdGJRbWp3QUJBRThBU3dFU0FiUUFCUUFHc3dVQkFUSXJOemNYQnhjSFQ1UXZkM2NzLzdVbWpvOG1BQUFBQVFCWEFFc0JHZ0cwQUFVQUJyTURBUUV5S3hNM0Z3Y25OMWN2bEpZdGR3R09KclcwSm84QUFBSUFhd0hlQVVVQ3ZBQURBQWNBRjBBVUF3RUJBUUJmQWdFQUFFZ0JUaEVSRVJBRUNob3JFek1ISXpjekJ5TnJUUXd6Z0V3TE5BSzgzdDdlQUFFQVZ3SGVBS01DdkFBREFCTkFFQUFCQVFCZkFBQUFTQUZPRVJBQ0NoZ3JFek1ISTFkTUN6UUN2TjRBQVFCTy81WUJJZ0tDQUE4QUJyTUdBQUV5S3dVdUFqVTBOeGNPQWhVVUZoWVhBUWdwU2tlNUd5QTZOVFU3SDJvZVNwOXorSG9qSEVXTVltT1BTUndBQUFFQUxQK1dBUUVDZ2dBUEFBYXpEd2NCTWlzWE5qVTBKaVluTng0Q0ZSUUdCZ2Nza0RVNEloc25TMGRIU2lsSGZkcGlpMFFlSXhwSm5YSnpuMG9lQUFBQ0FHYi85QURhQWprQUF3QVBBQ1ZBSWdBQUFBRmZBQUVCTEUwQUFnSURZUVFCQXdNeEEwNEVCQVFQQkE0bEVSQUZDQmtyTnlNRE13SW1OVFEyTXpJV0ZSUUdJNzA4RFZkRklDQWFHU0VnR3JRQmhmMjdIaHdiSUNBYkhCNEFBQUFDQUdiL3BBRGFBZWtBQ3dBUEFDcEFKd1FCQVFBQUFnRUFhUUFDQXdNQ1Z3QUNBZ05mQUFNQ0EwOEFBQThPRFF3QUN3QUtKQVVJRnlzU0ZoVVVCaU1pSmpVME5qTUhNeE1qdWlBaEdSb2dJQm9lUEExV0Fla2VIQnNnSUJzY0hzRCtld0FBQWdBeS8vUUJiQUpHQUJvQUpnQTRRRFVNQVFBQkN3RUNBQUpNQUFJQUF3QUNBNEFBQUFBQllRQUJBVEJOQUFNREJHRUZBUVFFTVFST0d4c2JKaHNsSlJra0tBWUlHaXMzTkRZM05qWTFOQ1lqSWdjbk5qWXpNaFlWRkFZSEJnWVZGU01XSmpVME5qTXlGaFVVQmlPaElpTWRIakFzUGpJakhWRXZTMUlvSlI0ZFF3WWdJUmthSUNBYTBpWTFKUndzSENjcEpUSVZIa283S0R3a0hpa1lHTTRlSEJzZ0lCc2NIZ0FBQUFJQVAvK1hBWG9CNlFBTEFDVUFQa0E3RndFQ0JCZ0JBd0lDVEFBRUFBSUFCQUtBQlFFQkFBQUVBUUJwQUFJREF3SlpBQUlDQTJJQUF3SURVZ0FBSlNRYkdSWVVBQXNBQ2lRR0NCY3JBQllWRkFZaklpWTFORFl6RnhRR0J3WUdGUlFXTXpJM0Z3WWpJaVkxTkRZM05qWTFOVE1CQkNBZ0doa2hJQm9oSWlNZEhpOHNQaklrU0ZaTFVpZ2xIeDFEQWVrZUhCc2dJQnNjSHQ0bU5TVWNMQnduS1NVeU0wbzdLRHdrSHlnWUdBQUFBZjlmQVFqLzBBRjdBQXNBSDBBY0FnRUJBQUFCV1FJQkFRRUFZUUFBQVFCUkFBQUFDd0FLSkFNSUZ5c0NGaFVVQmlNaUpqVTBOak5QSHg4WkZ5SWlGd0Y3SEIwZEhSMGRIUndBQUFFQU52L3lBZmNDM0FBaEFGbEFGUTRCQWdFaEZBSUVBd1lEQWdBRUEwd1RBUU1CUzB1d0kxQllRQmdBQWdBREJBSURhZ0FCQVVwTkFBUUVBRjhBQUFCSkFFNGJRQlVBQWdBREJBSURhZ0FFQUFBRUFHTUFBUUZLQVU1WnR5VWtFUm9VQlFvYkt5VUdCZ2NYSXpjdUFqVTBOalkzSnpNSEZoY0hKaVlqSWdZVkZCWVdNekkyTndIM0hGTTBBajhDUVdjN09tSThBVDhDWGtRbUlVQXZVV1V4VXpRdVNpS1lHaWtGWGw0R1JIbFNUWFZFQ0dsb0Jqa3pHaGx0WTBOZ014OGFBQUFDQURBQVVRSTFBbFFBR3dBbkFHcEFJUmdXRWhBRUFnRVpEd3NCQkFNQ0NnZ0VBZ1FBQXdOTUZ4RUNBVW9KQXdJQVNVdXdHVkJZUUJNRUFRTUFBQU1BWlFBQ0FnRmhBQUVCVXdKT0cwQWFBQUVBQWdNQkFta0VBUU1BQUFOWkJBRURBd0JoQUFBREFGRlpRQXdjSEJ3bkhDWXJMQ1VGQ2hrckpBY1hCeWNHSXlJbkJ5YzNKalUwTnljM0Z6WXpNaGMzRndjV0ZRWTJOVFFtSXlJR0ZSUVdNd0lVS1VvclRqaFNUenBNTFVzc0xFb3NURHRPVHp0TkxFd3JwRk5UUGo5VFV6Ly9OMG90U3lZbVN5eEpPVkpTT1VzdFRTVW5UU3ROT1ZDWFVVWkhVRkJIUmxFQUFBQUFBUUFyLzVFQ0JnTWo="}},"time_used":102,"timings":{"blocked":-1,"dns":3,"connect":1,"send":0,"wait":83,"receive":0,"ssl":15},"alerts":{"ids":null,"analyzer":null,"urlquery":null}}]}
