{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Robot Framework Jupyter example\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [], "source": [ "*** Settings ***\n", "\n", "Library SeleniumLibrary\n", "Library SeleniumScreenshots\n", "\n", "Suite teardown Close all browsers" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "d34851d39f3949a3a9492cb1e25904f6", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Box(children=(Button(description='Open url', style=ButtonStyle()), Label(value='url='), Text(value='')), layou…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0c11e01ca2444f9fba5790ae78f2dddb", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "*** Keywords ***\n", "\n", "Open url\n", " [Arguments] ${url}\n", " Open browser ${url} browser=headlessfirefox alias=singleton\n", " Set window size 800 900" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "text/html": [ "<p><a href=\"about:\" onClick=\"javascript:(function(el){var w=window.open();var d='PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KPG1ldGEgaHR0cC1lcXVpdj0iUHJhZ21hIiBjb250ZW50PSJuby1jYWNoZSI+CjxtZXRhIGh0dHAtZXF1aXY9IkV4cGlyZXMiIGNvbnRlbnQ9Ii0xIj4KPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIj4KPG1ldGEgY29udGVudD0iUm9ib3QgRnJhbWV3b3JrIDQuMC4zIChQeXRob24gMy45LjYgb24gbGludXgpIiBuYW1lPSJHZW5lcmF0b3IiPgo8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBRUFJQUJvQkFBQUZnQUFBQ2dBQUFBUUFBQUFJQUFBQUFFQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLY0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQXFBQUFBQUFBQUFBQUFBQUFBQUFBQUxJQUFBRC9BQUFBNEFBQUFOd0FBQURjQUFBQTNBQUFBTndBQUFEY0FBQUEzQUFBQU53QUFBRGNBQUFBNEFBQUFQOEFBQUN4QUFBQUFBQUFBS1lBQUFEL0FBQUF1d0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQy9BQUFBL3dBQUFLa0FBQUQ2QUFBQXpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU44QUFBRC9BQUFBK2dBQUFNTUFBQUFBQUFBQUFnQUFBR3NBQUFCckFBQUFhd0FBQUdzQUFBQnJBQUFBYXdBQUFHc0FBQUJyQUFBQURBQUFBQUFBQUFEYUFBQUEvd0FBQVBvQUFBRERBQUFBQUFBQUFJc0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFORUFBQUFBQUFBQTJnQUFBUDhBQUFENkFBQUF3d0FBQUFBQUFBQUFBQUFBTWdBQUFESUFBQUF5QUFBQU1nQUFBRElBQUFBeUFBQUFNZ0FBQURJQUFBQUZBQUFBQUFBQUFOb0FBQUQvQUFBQStnQUFBTU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGFBQUFBL3dBQUFQb0FBQUREQUFBQUFBQUFBRHdBQUFCOEFBQUFBQUFBQUdBQUFBQmNBQUFBQUFBQUFIOEFBQUJLQUFBQUFBQUFBQUFBQUFBQUFBQUEyZ0FBQVA4QUFBRDZBQUFBd3dBQUFBQUFBQURDQUFBQS93QUFBQ2tBQUFEcUFBQUE0UUFBQUFBQUFBRDdBQUFBL3dBQUFMQUFBQUFHQUFBQUFBQUFBTm9BQUFEL0FBQUErZ0FBQU1NQUFBQUFBQUFBSXdBQUFQNEFBQUQvQUFBQS93QUFBR0FBQUFBQUFBQUFBQUFBQU1rQUFBRC9BQUFBaWdBQUFBQUFBQURhQUFBQS93QUFBUG9BQUFEREFBQUFBQUFBQUFBQUFBQUlBQUFBY0FBQUFCa0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFZ0FBQUFBQUFBQUFBQUFBMmdBQUFQOEFBQUQ3QUFBQXl3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU40QUFBRC9BQUFBcXdBQUFQOEFBQUN2QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTElBQUFEL0FBQUFzZ0FBQUFBQUFBQzVBQUFBL3dBQUFNb0FBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQUFBREFBQUFBd0FBQUFNa0FBQUQvQUFBQXZBQUFBQUFBQUFBQUFBQUFBQUFBQUt3QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBclFBQUFBQUFBQUFBd0FNQUFJQUJBQUFmK0FBQVAvd0FBRC84QUFBZ0JBQUFQL3dBQUQvOEFBQS8vQUFBSkl3QUFESEVBQUEvL0FBQVAvd0FBQi80QUFDQUFRQUF3QU1BQUE9PSI+CjxzdHlsZSBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyI+Ci8qIEdlbmVyaWMgYW5kIG1pc2Mgc3R5bGVzICovCmJvZHkgewogICAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICBjb2xvcjogYmxhY2s7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQp0YWJsZSB7CiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBmb250LXNpemU6IDFlbTsKfQp0aCwgdGQgewogICAgdmVydGljYWwtYWxpZ246IHRvcDsKfQpiciB7CiAgICBtc28tZGF0YS1wbGFjZW1lbnQ6IHNhbWUtY2VsbDsgLyogbWFpbnRhaW4gbGluZSBicmVha3MgaW4gRXhjZWwgKi8KfQpociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KYSwgYTpsaW5rLCBhOnZpc2l0ZWQgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgY29sb3I6ICMxNWM7Cn0KYSA+IGltZyB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjMTVjICFpbXBvcnRhbnQ7Cn0KYTpob3ZlciwgYTphY3RpdmUgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICBjb2xvcjogIzYxYzsKfQoucGFyZW50LW5hbWUgewogICAgZm9udC1zaXplOiAwLjdlbTsKICAgIGxldHRlci1zcGFjaW5nOiAtMC4wN2VtOwp9Ci5tZXNzYWdlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKfQovKiBIZWFkZXJzICovCiNoZWFkZXIgewogICAgd2lkdGg6IDY1ZW07CiAgICBoZWlnaHQ6IDNlbTsKICAgIG1hcmdpbjogNnB4IDA7Cn0KaDEgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBtYXJnaW46IDAgMCAwLjVlbSAwOwogICAgd2lkdGg6IDc1JTsKfQpoMiB7CiAgICBjbGVhcjogbGVmdDsKfQojZ2VuZXJhdGVkIHsKICAgIGZsb2F0OiByaWdodDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLyogRG9jdW1lbnRhdGlvbiBoZWFkZXJzICovCi5kb2MgPiBoMiB7CiAgICBmb250LXNpemU6IDEuMmVtOwp9Ci5kb2MgPiBoMyB7CiAgICBmb250LXNpemU6IDEuMWVtOwp9Ci5kb2MgPiBoNCB7CiAgICBmb250LXNpemU6IDEuMGVtOwp9Ci8qIFN0YXR1cyB0ZXh0IGNvbG9ycyAtLSAhaW1wb3J0YW50IGFsbG93cyB1c2luZyB0aGVtIGluIGxpbmtzICovCi5mYWlsIHsKICAgIGNvbG9yOiAjY2UzZTAxICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoucGFzcyB7CiAgICBjb2xvcjogIzA5OGEwOSAhaW1wb3J0YW50Owp9Ci5za2lwIHsKICAgIGNvbG9yOiAjOTI3MjAxICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoubGFiZWwgewogICAgcGFkZGluZzogMnB4IDVweDsKICAgIGZvbnQtc2l6ZTogMC43NWVtOwogICAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogYmxhY2s7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9Ci5sYWJlbC5kZWJ1ZywgLmxhYmVsLnRyYWNlLCAubGFiZWwuZXJyb3IsIC5sYWJlbC5rZXl3b3JkIHsKICAgIGxldHRlci1zcGFjaW5nOiAwOwp9Ci5sYWJlbC5wYXNzLCAubGFiZWwuZmFpbCwgLmxhYmVsLmVycm9yLCAubGFiZWwuc2tpcCwgLmxhYmVsLndhcm4gewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLmxhYmVsLnBhc3MgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzk3YmQ2MTsKICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7Cn0KLmxhYmVsLmZhaWwsIC5sYWJlbC5lcnJvciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2UzZTAxOwogICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKfQoubGFiZWwuc2tpcCwgLmxhYmVsLndhcm4gewogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZDg0ZjsKICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7Cn0KLyogVG9wIHJpZ2h0IGhlYWRlciAqLwojdG9wLXJpZ2h0LWhlYWRlciB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDA7CiAgICByaWdodDogMDsKICAgIHotaW5kZXg6IDEwMDA7CiAgICB3aWR0aDogMTJlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQojcmVwb3J0LW9yLWxvZy1saW5rIGEgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiBibGFjazsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMWVtOwogICAgcGFkZGluZzogMC4zZW0gMDsKICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKfQojcmVwb3J0LW9yLWxvZy1saW5rIGE6aG92ZXIgewogICAgY29sb3I6ICNkZGQ7Cn0KI2xvZy1sZXZlbC1zZWxlY3RvciB7CiAgICBwYWRkaW5nOiAwLjNlbSAwOwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6ICNkZGQ7Cn0KLyogU3RhdGlzdGljcyB0YWJsZSAqLwouc3RhdGlzdGljcyB7CiAgICB3aWR0aDogNjVlbTsKICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICBlbXB0eS1jZWxsczogc2hvdzsKICAgIG1hcmdpbi1ib3R0b206IDFlbTsKfQouc3RhdGlzdGljcyB0cjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiAjZjRmNGY0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci5zdGF0aXN0aWNzIHRoLCAuc3RhdGlzdGljcyB0ZCB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgcGFkZGluZzogMC4xZW0gMC4zZW07Cn0KLnN0YXRpc3RpY3MgdGggewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKICAgIHBhZGRpbmc6IDAuMmVtIDAuM2VtOwp9Ci5zdGF0aXN0aWNzIHRkIHsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KLnN0YXRzLWNvbC1zdGF0IHsKICAgIHdpZHRoOiA0LjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc3RhdHMtY29sLWVsYXBzZWQgewogICAgd2lkdGg6IDUuNWVtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5zdGF0cy1jb2wtZ3JhcGggewogICAgd2lkdGg6IDllbTsKfQp0aC5zdGF0cy1jb2wtZ3JhcGg6aG92ZXIgewogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5zdGF0LW5hbWUgewogICAgZmxvYXQ6IGxlZnQ7Cn0KLnN0YXQtbmFtZSBhLCAuc3RhdC1uYW1lIHNwYW4gewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLnRhZy1saW5rcyB7CiAgICBmb250LXNpemU6IDAuOWVtOwogICAgZmxvYXQ6IHJpZ2h0OwogICAgbWFyZ2luLXRvcDogMC4wNWVtOwp9Ci50YWctbGlua3Mgc3BhbiB7CiAgICBtYXJnaW4tbGVmdDogMC4yZW07Cn0KLyogU3RhdGlzdGljcyBncmFwaCAqLwouZ3JhcGgsIC5lbXB0eS1ncmFwaCB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgd2lkdGg6IGF1dG87CiAgICBoZWlnaHQ6IDdweDsKICAgIHBhZGRpbmc6IDA7CiAgICBiYWNrZ3JvdW5kOiAjYWFhOwp9Ci5lbXB0eS1ncmFwaCB7CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9Ci5wYXNzLWJhciwgLmZhaWwtYmFyLCAuc2tpcC1iYXIgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBoZWlnaHQ6IDEwMCU7Cn0KLmZhaWwtYmFyIHsKICAgIGJhY2tncm91bmQ6ICNjZTNlMDE7Cn0KLnBhc3MtYmFyIHsKICAgIGJhY2tncm91bmQ6ICM5N2JkNjE7Cn0KLnNraXAtYmFyIHsKICAgIGJhY2tncm91bmQ6ICNmZWQ4NGY7Cn0KLyogVGFibGVzb3J0ZXIgLSBhZGFwdGVkIGZyb20gcHJvdmlkZWQgQmx1ZSBTa2luICovCi50YWJsZXNvcnRlci1oZWFkZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBSUFBQUg5L2Z3QUFBQ0g1QkFFQUFBRUFMQUFBQUFBTEFBa0FBQUlSakFPbkJyM2NuSXIwV1VqVHJDOWU5QlFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIHJpZ2h0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci50YWJsZXNvcnRlci1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKfQoudGFibGVzb3J0ZXItaGVhZGVyQXNjIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhDd0FKQUtFQUFBQUFBSDkvZndBQUFBQUFBQ0g1QkFFQUFBSUFMQUFBQUFBTEFBa0FBQUlVbEJXbkZyM2NuSXIwV1FPeUJtdnpwMTNDcHhRQU93PT0pOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYyAhaW1wb3J0YW50Owp9Ci50YWJsZXNvcnRlci1oZWFkZXJEZXNjIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhDd0FKQUtFQUFBQUFBSDkvZndBQUFBQUFBQ0g1QkFFQUFBSUFMQUFBQUFBTEFBa0FBQUlVbEFXbkJyM2NuSXIwV1JPeURtdnpwMTNDcHhRQU93PT0pOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYyAhaW1wb3J0YW50Owp9Ci5zb3J0ZXItZmFsc2UgewogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQouc29ydGVyLWZhbHNlOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIj4KLyogSWNvbnMgYXJlIGZyb20gT3BlbiBJY29uaWMgPGh0dHBzOi8vdXNlaWNvbmljLmNvbS9vcGVuLz4uCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gKi8KLyogQ29udGFpbmVycyAqLwouc3VpdGUsIC50ZXN0LCAjZXJyb3JzIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBwYWRkaW5nOiAwLjNlbSAwLjJlbTsKICAgIG1hcmdpbjogMC4yZW0gMDsKfQoudGVzdCB7CiAgICBib3JkZXItc3R5bGU6IGRhc2hlZDsKfQojZXJyb3JzLCAubWVzc2FnZXMgewogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXItc3BhY2luZzogMDsKfQouY2hpbGRyZW4gewogICAgZGlzcGxheTogbm9uZTsKICAgIG1hcmdpbi1sZWZ0OiAxLjRlbTsKfQouc3VpdGUsIC50ZXN0LCAua2V5d29yZCB7CiAgICBtYXJnaW4tbGVmdDogLTAuMmVtOwp9CiNzMSwgLnN1aXRlID4gLmNoaWxkcmVuID4gLmtleXdvcmQgewogICAgbWFyZ2luLWxlZnQ6IDA7Cn0KLyogU3VpdGUsIHRlc3QgYW5kIGt3IGhlYWRlcnMgKi8KLmVsZW1lbnQtaGVhZGVyIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9Ci5lbGVtZW50LWhlYWRlcjpob3ZlciB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwogICAgYm9yZGVyLWNvbG9yOiAjY2NjOwp9Ci5lbGVtZW50LWhlYWRlci10b2dnbGUgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogM3B4OwogICAgdG9wOiA1cHg7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVlBQUFBR0NBUUFBQUJLeFNmREFBQUFBbUpMUjBRQS80ZVB6TDhBQUFBSmNFaFpjd0FBQ3hNQUFBc1RBUUNhbkJnQUFBQUhkRWxOUlFmZUNSMEpDaFNrWnoyMEFBQUFHa2xFUVZRSTEyTmdRQUtNREt6SW5QOElEaE9xTWs0RzdBQUFOUXdCRTQyN1BZVUFBQUFBU1VWT1JLNUNZSUk9KTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTRJaUJvWldsbmFIUTlJamdpSUhacFpYZENiM2c5SWpBZ01DQTRJRGdpUGdvZ0lEeHdZWFJvSUdROUlrMHdJREIyTW1nNGRpMHlhQzA0ZWlJZ2RISmhibk5tYjNKdFBTSjBjbUZ1YzJ4aGRHVW9NQ0F6S1NJZ0x6NEtQQzl6ZG1jKyksIG5vbmU7CiAgICBoZWlnaHQ6IDEwcHg7CiAgICB3aWR0aDogMTBweDsKICAgIGJhY2tncm91bmQtc2l6ZTogNnB4IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBib3JkZXItcmFkaXVzOiAycHg7Cn0KLmNsb3NlZCA+IC5lbGVtZW50LWhlYWRlci10b2dnbGUgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVlBQUFBR0NBUUFBQUJLeFNmREFBQUFBbUpMUjBRQS80ZVB6TDhBQUFBSmNFaFpjd0FBQ3hNQUFBc1RBUUNhbkJnQUFBQUhkRWxOUlFmZUNSMEpDREhkVll0eEFBQUFNMGxFUVZRSTEwM01NUXFBTUJRRndWSHlJVGFCM1ArVzFzS3pTQkMzbVc2aFJGdzBwVUI1RHZGMWJ1OUZOMFJNM1gvd0FrOThDVW52RlRha0FBQUFBRWxGVGtTdVFtQ0MpOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJNElpQm9aV2xuYUhROUlqZ2lJSFpwWlhkQ2IzZzlJakFnTUNBNElEZ2lQZ29nSUR4d1lYUm9JR1E5SWsweklEQjJNMmd0TTNZeWFETjJNMmd5ZGkwemFETjJMVEpvTFROMkxUTm9MVEo2SWlBdlBnbzhMM04yWno0PSksIG5vbmU7Cn0KLmVsZW1lbnQtaGVhZGVyOmhvdmVyID4gLmVsZW1lbnQtaGVhZGVyLXRvZ2dsZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9Ci5lbGVtZW50LWhlYWRlci1yaWdodDpob3ZlciB+IC5lbGVtZW50LWhlYWRlci10b2dnbGUgewogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KLmVsZW1lbnQtaGVhZGVyLWxlZnQgewogICAgcGFkZGluZzogM3B4IDgwcHggM3B4IDIwcHg7Cn0KLmVsZW1lbnQtaGVhZGVyLXJpZ2h0IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiAwOwogICAgcGFkZGluZzogM3B4OwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5uYW1lIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9Ci5lbGFwc2VkIHsKICAgIGZsb2F0OiByaWdodDsKICAgIGNvbG9yOiAjNjY2OwogICAgcGFkZGluZy1sZWZ0OiAxZW07Cn0KLmxpbmsgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQWdBQUFBSUNBWUFBQURFRDc2TEFBQUFCSE5DU1ZRSUNBZ0lmQWhraUFBQUFBbHdTRmx6QUFBTEV3QUFDeE1CQUpxY0dBQUFBSGxKUkVGVUdKVnR6ckVKd21BUUJ0Q242QVN1SUtUSUJoWTJnbWdoQmlKWUIxdWR3azEwQjhGSmJLTUJjUUZidGJrZkpIclZ3ZnUrNC9pZEpSNjRZOUg3RTNoaWdqNU8zUzhZNDRBcExuamhuWENOR2hWMnlOR2dnREp3aUMwMmdhdlVicERGdnNjUm80UWRYT01LREhCdWZ6M0hMWUt6Tm40QWJTa1YzZm5jR1FZQUFBQUFTVVZPUks1Q1lJST0pOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJNElpQm9aV2xuYUhROUlqZ2lJSFpwWlhkQ2IzZzlJakFnTUNBNElEZ2lQZ29nSUR4d1lYUm9JR1E5SWswMUxqZzRMakF6WXkwdU1UZ3VNREV0TGpNMkxqQXpMUzQxTXk0d09TMHVNamN1TVMwdU5UTXVNalV0TGpjMUxqUTNZUzQxTGpVZ01DQXhJREFnTGpZNUxqWTVZeTR4TVMwdU1URXVNalF0TGpFM0xqTTRMUzR5TWk0ek5TMHVNVEl1TnpndExqQTNJREV1TURZdU1qSXVNemt1TXprdU16a2dNUzR3TkNBd0lERXVORFJzTFRFdU5TQXhMalZqTFM0ME5DNDBOQzB1T0M0ME9DMHhMakEyTGpRM0xTNHlOaTB1TURFdExqUXhMUzR4TXkwdU5ERXRMakV6WVM0MUxqVWdNQ0F4SURBdExqVXVPRGh6TGpNMExqSXlMamcwTGpJMVl5NDFMakF6SURFdU1pMHVNVFlnTVM0NE1TMHVOemhzTVM0MUxURXVOV011TnpndExqYzRMamM0TFRJdU1EUWdNQzB5TGpneExTNHlPQzB1TWpndExqWXhMUzQwTlMwdU9UY3RMalV6TFM0eE9DMHVNRFF0TGpNNExTNHdOQzB1TlRZdExqQXplbTB0TWlBeUxqTXhZeTB1TlMwdU1ESXRNUzR4T1M0eE5TMHhMamM0TGpjMWJDMHhMalVnTVM0MVl5MHVOemd1TnpndExqYzRJREl1TURRZ01DQXlMamd4TGpVMkxqVTJJREV1TXpZdU56SWdNaTR3Tmk0ME55NHlOeTB1TVM0MU15MHVNalV1TnpVdExqUTNZUzQxTGpVZ01DQXhJREF0TGpZNUxTNDJPV010TGpFeExqRXhMUzR5TkM0eE55MHVNemd1TWpJdExqTTFMakV5TFM0M09DNHdOeTB4TGpBMkxTNHlNaTB1TXprdExqTTVMUzR6T1MweExqQTBJREF0TVM0ME5Hd3hMalV0TVM0MVl5NDBMUzQwTGpjMUxTNDBOU0F4TGpBekxTNDBOQzR5T0M0d01TNDBOeTR3T1M0ME55NHdPV0V1TlM0MUlEQWdNU0F3SUM0ME5DMHVPRGh6TFM0ek5DMHVNaTB1T0RRdExqSXllaUlLSUNBdlBnbzhMM04yWno0PSksIG5vbmU7Cn0KLmV4cGFuZCB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBZ0FBQUFJQ0FZQUFBREVENzZMQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUFMRXdBQUN4TUJBSnFjR0FBQUFEdEpSRUZVR0pWallDQUNLREF3TUJ5QTBsakZEakF3TVB4bllHQjRBQlZRZ0xML1ErVlFCQjZnc2VHbUlpdkNrRVJYaEZVU1dSRk9TYXdBQUVsN0UzdXYxaU1jQUFBQUFFbEZUa1N1UW1DQyk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0k0SWlCb1pXbG5hSFE5SWpnaUlIWnBaWGRDYjNnOUlqQWdNQ0E0SURnaVBnb2dJRHh3WVhSb0lHUTlJazB4TGpVZ01Hd3RNUzQxSURFdU5TQTBJRFFnTkMwMExURXVOUzB4TGpVdE1pNDFJREl1TlMweUxqVXRNaTQxZWlJZ2RISmhibk5tYjNKdFBTSjBjbUZ1YzJ4aGRHVW9NQ0F4S1NJZ0x6NEtQQzl6ZG1jKyksIG5vbmU7Cn0KLmNvbGxhcHNlIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFnQUFBQUlDQVlBQUFERUQ3NkxBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQUxFd0FBQ3hNQkFKcWNHQUFBQUM1SlJFRlVHSlZqWUNBUk5FQXhUc24vVUl5aENGa1NReEc2VGhRK0M1SXBqV2hHMXlOYjRZREZUZGpFTUFFQUNpOFErKzlZOVRBQUFBQUFTVVZPUks1Q1lJST0pOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJNElpQm9aV2xuYUhROUlqZ2lJSFpwWlhkQ2IzZzlJakFnTUNBNElEZ2lQZ29nSUR4d1lYUm9JR1E5SWswMElEQnNMVFFnTkNBeExqVWdNUzQxSURJdU5TMHlMalVnTWk0MUlESXVOU0F4TGpVdE1TNDFMVFF0TkhvaUlIUnlZVzV6Wm05eWJUMGlkSEpoYm5Oc1lYUmxLREFnTVNraUlDOCtDand2YzNablBnPT0pLCBub25lOwp9Ci5leHBhbmQsIC5jb2xsYXBzZSwgLmxpbmsgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIG1hcmdpbjogMCA0cHg7CiAgICBoZWlnaHQ6IDE0cHg7CiAgICB3aWR0aDogMTRweDsKICAgIGJhY2tncm91bmQtc2l6ZTogOHB4IDhweDsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9Ci5saW5rIHsKICAgIGJhY2tncm91bmQtc2l6ZTogMTBweCAxMHB4Owp9Ci5lbGVtZW50LWhlYWRlcjpob3ZlciBhIHsKICAgIHZpc2liaWxpdHk6IHZpc2libGU7Cn0KLmV4cGFuZDpob3ZlciwgLmNvbGxhcHNlOmhvdmVyLCAubGluazpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9Ci8qIE1lc3NhZ2VzIGFuZCBlcnJvcnMgKi8KLm1lc3NhZ2VzIC50aW1lLCAubWVzc2FnZXMgLm1lc3NhZ2UgewogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogMS4xZW07Cn0KI2Vycm9ycyAubWVzc2FnZSB7CiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgZm9udC1zaXplOiAxLjJlbTsKfQoubWVzc2FnZS1yb3cgewogICAgaGVpZ2h0OiAyMHB4Owp9Ci50aW1lIHsKICAgIHdpZHRoOiA3LjVlbTsKfQouZXJyb3ItdGltZSB7CiAgICB3aWR0aDogMTFlbTsKICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5sZXZlbCB7CiAgICB3aWR0aDogNWVtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5zZWxlY3QtbWVzc2FnZSB7CiAgICB3aWR0aDogMjRweDsKfQouc2VsZWN0LW1lc3NhZ2UgPiBkaXYgewogICAgZmxvYXQ6IHJpZ2h0OwogICAgbWFyZ2luLXJpZ2h0OiAycHg7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICB3aWR0aDogMTZweDsKICAgIGJhY2tncm91bmQtc2l6ZTogMTJweCAxMnB4OwogICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsKfQoubWVzc2FnZS1yb3c6aG92ZXIgLnNlbGVjdC1tZXNzYWdlIGRpdiB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBd0FBQUFNQ0FRQUFBRDhmSlJzQUFBQUFtSkxSMFFBLzRlUHpMOEFBQUFKY0VoWmN3QUFDeE1BQUFzVEFRQ2FuQmdBQUFBSGRFbE5SUWZlQ1IwTU96aFdLWlFPQUFBQVNVbEVRVlFZMDMyUHNSSEFJQXdEWDlCa2ljRCtXOFVNRXFlZ0FRSldLWi8rM3NMWkpoRkdRRVp6TmFJYTRpYmg2NkVuODY3Vk5hSWVvUDVXcHBOdUlHb0FsT20zZzVWQzFBZFllUXYxQlpQUlNnQUFBQUJKUlU1RXJrSmdnZz09KTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTRJaUJvWldsbmFIUTlJamdpSUhacFpYZENiM2c5SWpBZ01DQTRJRGdpUGdvZ0lEeHdZWFJvSUdROUlrMHdJREIyTVdnNGRpMHhhQzA0ZW0wd0lESjJNV2cyZGkweGFDMDJlbTB3SURKMk1XZzRkaTB4YUMwNGVtMHdJREoyTVdnMmRpMHhhQzAyZWlJZ0x6NEtQQzl6ZG1jKyksIG5vbmU7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9Ci5zZWxlY3QtbWVzc2FnZTpob3ZlciBkaXYgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQovKiBNZXNzYWdlIHRhYmxlcyAtIHRoZXNlIE1VU1QgTk9UIGJlIGNvbWJpbmVkIHRvZ2V0aGVyIGJlY2F1c2Ugb3RoZXJ3aXNlCiAgIGR5bmFtaWNhbGx5IGFsdGVyaW5nIHRoZW0gYmFzZWQgb24gdmlzaWJsZSBsb2cgbGV2ZWwgaXMgbm90IHBvc3NpYmxlLiAqLwoudHJhY2UtbWVzc2FnZSB7CiAgICBkaXNwbGF5OiB0YWJsZTsKfQouZGVidWctbWVzc2FnZSB7CiAgICBkaXNwbGF5OiB0YWJsZTsKfQovKiBNZXRhZGF0YSAqLwoubWV0YWRhdGEgewogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXItc3BhY2luZzogMC4yZW07Cn0KLm1ldGFkYXRhIHRoIHsKICAgIHdpZHRoOiAxMmVtOwogICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KLm1ldGFkYXRhIHRkIHsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cn0KLmtleXdvcmQtbWV0YWRhdGEgewogICAgZm9udC1zaXplOiAwLjllbTsKfQovKiBDdXN0b20gc3R5bGVzIGZvciBzdGF0aXN0aWNzICovCiN0b3RhbC1zdGF0cyB0cjpob3ZlciwgI3RhZy1zdGF0cyB0cjpob3ZlciB7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJwcmludCIgdHlwZT0idGV4dC9jc3MiPgpib2R5IHsKICAgIGJhY2tncm91bmQ6IHdoaXRlICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nOiAwOwogICAgZm9udC1zaXplOiA4cHQ7Cn0KYTpsaW5rLCBhOnZpc2l0ZWQgewogICAgY29sb3I6IGJsYWNrOwp9CiNoZWFkZXIgewogICAgd2lkdGg6IGF1dG87Cn0KLmRldGFpbHMsIC5zdGF0aXN0aWNzIHsKICAgIHdpZHRoOiAxMDAlOwp9CiNnZW5lcmF0ZWQtYWdvLCAjdG9wLXJpZ2h0LWhlYWRlciwgI25vcm1hbC1zZWxlY3RvciwgI3NlYXJjaC1idXR0b25zLAouZm9sZGluZy1idXR0b24sIC5leHBhbmQsIC5oaWRkZW4sIC5kZXRhaWxzLWNvbC10b2dnbGUgewogICAgZGlzcGxheTogbm9uZTsKfQouZWxlbWVudC1oZWFkZXItdGV4dCwgLmNoaWxkcmVuIHsKICAgIG1hcmdpbjogMDsKfQojdGVzdC1kZXRhaWxzIHsKICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQojdGVzdC1kZXRhaWxzIHRoLCAjdGVzdC1kZXRhaWxzIHRkIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0KLmRldGFpbHMtY29sLWhlYWRlciB7CiAgICBwYWRkaW5nOiAwOwp9CiNwcmludC1zZWxlY3RvciB7CiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOwp9Ci50YWJsZXNvcnRlci1oZWFkZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgIGJhY2tncm91bmQ6ICNkZGQgIWltcG9ydGFudDsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgojamF2YXNjcmlwdC1kaXNhYmxlZCB7CiAgICB3aWR0aDogNjAwcHg7CiAgICBtYXJnaW46IDEwMHB4IGF1dG8gMCBhdXRvOwogICAgcGFkZGluZzogMjBweDsKICAgIGNvbG9yOiBibGFjazsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9CiNqYXZhc2NyaXB0LWRpc2FibGVkIGgxIHsKICAgIHdpZHRoOiAxMDAlOwogICAgZmxvYXQ6IG5vbmU7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgdWwgewogICAgZm9udC1zaXplOiAxLjJlbTsKfQojamF2YXNjcmlwdC1kaXNhYmxlZCBsaSB7CiAgICBtYXJnaW46IDAuNWVtIDA7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgYiB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIj4KLmRvYyA+ICogewogICAgbWFyZ2luOiAwLjdlbSAxZW0gMC4xZW0gMWVtOwogICAgcGFkZGluZzogMDsKfQouZG9jID4gcCwgLmRvYyA+IGgxLCAuZG9jID4gaDIsIC5kb2MgPiBoMywgLmRvYyA+IGg0IHsKICAgIG1hcmdpbjogMC43ZW0gMCAwLjFlbSAwOwp9Ci5kb2MgPiAqOmZpcnN0LWNoaWxkIHsKICAgIG1hcmdpbi10b3A6IDAuMWVtOwp9Ci5kb2MgdGFibGUgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGVtcHR5LWNlbGxzOiBzaG93OwogICAgZm9udC1zaXplOiAwLjllbTsKfQouZG9jIHRhYmxlIHRoLCAuZG9jIHRhYmxlIHRkIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIHBhZGRpbmc6IDAuMWVtIDAuM2VtOwogICAgaGVpZ2h0OiAxLjJlbTsKfQouZG9jIHRhYmxlIHRoIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTsKfQouZG9jIHByZSB7CiAgICBmb250LXNpemU6IDEuMWVtOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgIGJhY2tncm91bmQ6ICNmNGY0ZjQ7Cn0KLmRvYyBjb2RlIHsKICAgIHBhZGRpbmc6IDAgMC4yZW07CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogICAgYmFja2dyb3VuZDogI2VlZTsKfQouZG9jIGxpIHsKICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IGluc2lkZTsKICAgIGxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOwp9Ci5kb2MgaW1nIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0KLmRvYyBociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KPC9zdHlsZT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp2YXIgTEVWRUxTID0ge1RSQUNFOiAwLCBERUJVRzogMSwgSU5GTzogMiwgV0FSTjogMywgRkFJTDogNCwgTk9ORTogNX07CmZ1bmN0aW9uIHRvZ2dsZVN1aXRlKHN1aXRlSWQpIHsKICAgIHRvZ2dsZUVsZW1lbnQoc3VpdGVJZCwgWydrZXl3b3JkJywgJ3N1aXRlJywgJ3Rlc3QnXSk7Cn0KZnVuY3Rpb24gdG9nZ2xlVGVzdCh0ZXN0SWQpIHsKICAgIHRvZ2dsZUVsZW1lbnQodGVzdElkLCBbJ2tleXdvcmQnXSk7Cn0KZnVuY3Rpb24gdG9nZ2xlS2V5d29yZChrd0lkKSB7CiAgICB0b2dnbGVFbGVtZW50KGt3SWQsIFsna2V5d29yZCddKTsKfQpmdW5jdGlvbiB0b2dnbGVFbGVtZW50KGVsZW1lbnRJZCwgY2hpbGRyZW5OYW1lcykgewogICAgdmFyIGVsZW1lbnQgPSAkKCcjJyArIGVsZW1lbnRJZCk7CiAgICB2YXIgY2hpbGRyZW4gPSBlbGVtZW50LmNoaWxkcmVuKCcuY2hpbGRyZW4nKTsKICAgIGNoaWxkcmVuLnRvZ2dsZSgxMDAsICcnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgZWxlbWVudC5jaGlsZHJlbignLmVsZW1lbnQtaGVhZGVyJykudG9nZ2xlQ2xhc3MoJ2Nsb3NlZCcpOwogICAgfSk7CiAgICBwb3B1bGF0ZUNoaWxkcmVuKGVsZW1lbnRJZCwgY2hpbGRyZW4sIGNoaWxkcmVuTmFtZXMpOwp9CmZ1bmN0aW9uIHBvcHVsYXRlQ2hpbGRyZW4oZWxlbWVudElkLCBjaGlsZEVsZW1lbnQsIGNoaWxkcmVuTmFtZXMpIHsKICAgIGlmICghY2hpbGRFbGVtZW50Lmhhc0NsYXNzKCdwb3B1bGF0ZWQnKSkgewogICAgICAgIHZhciBlbGVtZW50ID0gd2luZG93LnRlc3RkYXRhLmZpbmRMb2FkZWQoZWxlbWVudElkKTsKICAgICAgICB2YXIgY2FsbGJhY2sgPSBkcmF3Q2FsbGJhY2soZWxlbWVudCwgY2hpbGRFbGVtZW50LCBjaGlsZHJlbk5hbWVzKTsKICAgICAgICBlbGVtZW50LmNhbGxXaGVuQ2hpbGRyZW5SZWFkeShjYWxsYmFjayk7CiAgICAgICAgY2hpbGRFbGVtZW50LmFkZENsYXNzKCdwb3B1bGF0ZWQnKTsKICAgIH0KfQpmdW5jdGlvbiBkcmF3Q2FsbGJhY2soZWxlbWVudCwgY2hpbGRFbGVtZW50LCBjaGlsZHJlbk5hbWVzKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgIHV0aWwubWFwKGNoaWxkcmVuTmFtZXMsIGZ1bmN0aW9uIChjaGlsZE5hbWUpIHsKICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gZWxlbWVudFtjaGlsZE5hbWUgKyAncyddKCk7CiAgICAgICAgICAgIHV0aWwubWFwKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHsKICAgICAgICAgICAgICAgICQudG1wbChjaGlsZC50ZW1wbGF0ZSwgY2hpbGQpLmFwcGVuZFRvKGNoaWxkRWxlbWVudCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfQp9CmZ1bmN0aW9uIGV4cGFuZFN1aXRlKHN1aXRlKSB7CiAgICBpZiAoc3VpdGUuc3RhdHVzID09ICJQQVNTIikKICAgICAgICBleHBhbmRFbGVtZW50KHN1aXRlKTsKICAgIGVsc2UKICAgICAgICBleHBhbmRGYWlsZWQoc3VpdGUpOwp9CmZ1bmN0aW9uIGV4cGFuZEVsZW1lbnQoaXRlbSwgcmV0cnlDb3VudCkgewogICAgcmV0cnlDb3VudCA9IHR5cGVvZiByZXRyeUNvdW50ICE9PSAndW5kZWZpbmVkJyA/IHJldHJ5Q291bnQgOiAzOwogICAgdmFyIGVsZW1lbnQgPSAkKCcjJyArIGl0ZW0uaWQpOwogICAgdmFyIGNoaWxkcmVuID0gZWxlbWVudC5jaGlsZHJlbignLmNoaWxkcmVuJyk7CiAgICAvLyAuY3NzIGlzIGZhc3RlciB0aGFuIC5zaG93IGFuZCAuc2hvdyB3LyBjYWxsYmFjayBpcyB0ZXJyaWJseSBzbG93CiAgICBjaGlsZHJlbi5jc3MoeydkaXNwbGF5JzogJ2Jsb2NrJ30pOwogICAgLy8gaW4gcmFyZSBjYXNlcyBvbiBsYXJnZSBsb2dzIGNvbmN1cnJlbnQgZXhwYW5kaW5nIGZhaWxzID0+IHJldHJ5CiAgICBpZiAoY2hpbGRyZW4uY3NzKCdkaXNwbGF5JykgIT0gJ2Jsb2NrJyAmJiByZXRyeUNvdW50ID4gMCkgewogICAgICAgIGNvbnNvbGUuZGVidWcoJ2V4cGFuZEVsZW1lbnQgJytpdGVtLmlkKycgZmFpbGVkISBwbGFubmluZyByZXRyeS4uLicpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGV4cGFuZEVsZW1lbnQoaXRlbSwgcmV0cnlDb3VudC0xKTsgfSwgMCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcG9wdWxhdGVDaGlsZHJlbihpdGVtLmlkLCBjaGlsZHJlbiwgaXRlbS5jaGlsZHJlbk5hbWVzKTsKICAgIGVsZW1lbnQuY2hpbGRyZW4oJy5lbGVtZW50LWhlYWRlcicpLnJlbW92ZUNsYXNzKCdjbG9zZWQnKTsKfQpmdW5jdGlvbiBleHBhbmRFbGVtZW50V2l0aElkKGVsZW1lbnRpZCkgewogICAgZXhwYW5kRWxlbWVudCh3aW5kb3cudGVzdGRhdGEuZmluZExvYWRlZChlbGVtZW50aWQpKTsKfQpmdW5jdGlvbiBleHBhbmRFbGVtZW50c1dpdGhJZHMoaWRzKSB7CiAgICB1dGlsLm1hcChpZHMsIGV4cGFuZEVsZW1lbnRXaXRoSWQpOwp9CmZ1bmN0aW9uIGxvYWRBbmRFeHBhbmRFbGVtZW50SWRzKGlkcykgewogICAgZm9yICh2YXIgaSBpbiBpZHMpIHsKICAgICAgICB3aW5kb3cudGVzdGRhdGEuZW5zdXJlTG9hZGVkKGlkc1tpXSwgZXhwYW5kRWxlbWVudHNXaXRoSWRzKTsKICAgIH0KfQpmdW5jdGlvbiBleHBhbmRGYWlsZWQoZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQuc3RhdHVzID09ICJGQUlMIikgewogICAgICAgIHdpbmRvdy5lbGVtZW50c1RvRXhwYW5kID0gW2VsZW1lbnRdOwogICAgICAgIHdpbmRvdy5leHBhbmREZWNpZGVyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgcmV0dXJuIGUuc3RhdHVzID09ICJGQUlMIjsKICAgICAgICB9OwogICAgICAgIGV4cGFuZFJlY3Vyc2l2ZWx5KCk7CiAgICB9Cn0KZnVuY3Rpb24gZXhwYW5kQWxsKGVsZW1lbnRJZCkgewogICAgd2luZG93LmVsZW1lbnRzVG9FeHBhbmQgPSBbd2luZG93LnRlc3RkYXRhLmZpbmRMb2FkZWQoZWxlbWVudElkKV07CiAgICB3aW5kb3cuZXhwYW5kRGVjaWRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07CiAgICBleHBhbmRSZWN1cnNpdmVseSgpOwp9CmZ1bmN0aW9uIGV4cGFuZFJlY3Vyc2l2ZWx5KCkgewogICAgaWYgKCF3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5sZW5ndGgpCiAgICAgICAgcmV0dXJuOwogICAgdmFyIGVsZW1lbnQgPSB3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5wb3AoKTsKICAgIGlmICghZWxlbWVudCB8fCBlbGVtZW50SGlkZGVuQnlVc2VyKGVsZW1lbnQuaWQpKSB7CiAgICAgICAgd2luZG93LmVsZW1lbnRzVG9FeHBhbmQgPSBbXTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBleHBhbmRFbGVtZW50KGVsZW1lbnQpOwogICAgZWxlbWVudC5jYWxsV2hlbkNoaWxkcmVuUmVhZHkoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oKTsKICAgICAgICBmb3IgKHZhciBpID0gY2hpbGRyZW4ubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgICAgICBpZiAoY2hpbGQudHlwZSAhPSAnbWVzc2FnZScgJiYgd2luZG93LmV4cGFuZERlY2lkZXIoY2hpbGQpKQogICAgICAgICAgICAgICAgd2luZG93LmVsZW1lbnRzVG9FeHBhbmQucHVzaChjaGlsZCk7CiAgICAgICAgfQogICAgICAgIGlmICh3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5sZW5ndGgpCiAgICAgICAgICAgIHNldFRpbWVvdXQoZXhwYW5kUmVjdXJzaXZlbHksIDApOwogICAgfSk7Cn0KZnVuY3Rpb24gZWxlbWVudEhpZGRlbkJ5VXNlcihpZCkgewogICAgdmFyIGVsZW1lbnQgPSAkKCcjJyArIGlkKTsKICAgIHJldHVybiAhZWxlbWVudC5pcygiOnZpc2libGUiKTsKfQpmdW5jdGlvbiBjb2xsYXBzZUFsbChpZCkgewogICAgdmFyIGVsZW1lbnQgPSAkKCcjJyArIGlkKTsKICAgIGVsZW1lbnQuZmluZCgnLmNoaWxkcmVuJykuY3NzKHsnZGlzcGxheSc6ICdub25lJ30pOwogICAgZWxlbWVudC5maW5kKCcuZWxlbWVudC1oZWFkZXInKS5hZGRDbGFzcygnY2xvc2VkJyk7Cn0KZnVuY3Rpb24gbG9nTGV2ZWxTZWxlY3RlZChsZXZlbCkgewogICAgdmFyIGFuY2hvcnMgPSBnZXRWaWV3QW5jaG9yRWxlbWVudHMoKTsKICAgIHNldE1lc3NhZ2VWaXNpYmlsaXR5KGxldmVsKTsKICAgIHNjcm9sbFRvU2hvcnRlc3RWaXNpYmxlQW5jaG9yRWxlbWVudChhbmNob3JzKTsKfQpmdW5jdGlvbiBnZXRWaWV3QW5jaG9yRWxlbWVudHMoKSB7CiAgICB2YXIgZWxlbTEgPSAkKGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoMTAwLCAwKSk7CiAgICB2YXIgZWxlbTIgPSAkKGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoMTAwLCAyMCkpOwogICAgcmV0dXJuIFtlbGVtMSwgZWxlbTJdOwp9CmZ1bmN0aW9uIHNjcm9sbFRvU2hvcnRlc3RWaXNpYmxlQW5jaG9yRWxlbWVudChhbmNob3JzKSB7CiAgICBhbmNob3JzID0gdXRpbC5tYXAoYW5jaG9ycywgY2xvc2VzdFZpc2libGVQYXJlbnQpOwogICAgdmFyIHNob3J0ZXN0ID0gYW5jaG9yc1swXTsKICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYW5jaG9ycy5sZW5ndGg7IGkrKykKICAgICAgICBpZiAoc2hvcnRlc3QuaGVpZ2h0KCkgPiBhbmNob3JzW2ldLmhlaWdodCgpKQogICAgICAgICAgICBzaG9ydGVzdCA9IGFuY2hvcnNbaV07CiAgICBzaG9ydGVzdC5nZXQoKVswXS5zY3JvbGxJbnRvVmlldyh0cnVlKTsKfQpmdW5jdGlvbiBzZXRNZXNzYWdlVmlzaWJpbGl0eShsZXZlbCkgewogICAgbGV2ZWwgPSBwYXJzZUludChsZXZlbCk7CiAgICBjaGFuZ2VDbGFzc0Rpc3BsYXkoIi50cmFjZS1tZXNzYWdlIiwgbGV2ZWwgPD0gTEVWRUxTLlRSQUNFKTsKICAgIGNoYW5nZUNsYXNzRGlzcGxheSgiLmRlYnVnLW1lc3NhZ2UiLCBsZXZlbCA8PSBMRVZFTFMuREVCVUcpOwogICAgY2hhbmdlQ2xhc3NEaXNwbGF5KCIuaW5mby1tZXNzYWdlIiwgbGV2ZWwgPD0gTEVWRUxTLklORk8pOwp9CmZ1bmN0aW9uIGNsb3Nlc3RWaXNpYmxlUGFyZW50KGVsZW0pIHsKICAgIHdoaWxlICghZWxlbS5pcygiOnZpc2libGUiKSkKICAgICAgICBlbGVtID0gZWxlbS5wYXJlbnQoKTsKICAgIHJldHVybiBlbGVtOwp9CmZ1bmN0aW9uIGNoYW5nZUNsYXNzRGlzcGxheShjbGF6eiwgdmlzaWJsZSkgewogICAgdmFyIHN0eWxlcyA9IGRvY3VtZW50LnN0eWxlU2hlZXRzOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgcnVsZXMgPSBnZXRSdWxlcyhzdHlsZXNbaV0pOwogICAgICAgIGlmIChydWxlcyA9PT0gbnVsbCkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBydWxlcy5sZW5ndGg7IGorKykKICAgICAgICAgICAgaWYgKHJ1bGVzW2pdLnNlbGVjdG9yVGV4dCA9PT0gY2xhenopCiAgICAgICAgICAgICAgICBydWxlc1tqXS5zdHlsZS5kaXNwbGF5ID0gdmlzaWJsZSA/ICJ0YWJsZSIgOiAibm9uZSI7CiAgICB9Cn0KZnVuY3Rpb24gZ2V0UnVsZXMoc3R5bGUpIHsKICAgIC8vIFdpdGggQ2hyb21lIGV4dGVybmFsIENTUyBmaWxlcyBzZWVtIHRvIGhhdmUgb25seSBudWxsIHJvbGVzIGFuZCB3aXRoCiAgICAvLyBGaXJlZm94IGFjY2Vzc2luZyBydWxlcyBjYW4gcmVzdWx0IHRvIHNlY3VyaXR5IGVycm9yLgogICAgLy8gTmVpdGhlciBvZiB0aGVzZSBhcmUgYSBwcm9ibGVtIG9uIHdpdGggZ2VuZXJhdGVkIGxvZ3MuCiAgICB0cnkgewogICAgICAgIHJldHVybiBzdHlsZS5jc3NSdWxlcyB8fCBzdHlsZS5ydWxlczsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQpmdW5jdGlvbiBzZWxlY3RNZXNzYWdlKHBhcmVudElkKSB7CiAgICB2YXIgZWxlbWVudCA9ICQoJyMnICsgcGFyZW50SWQpLmZpbmQoJy5tZXNzYWdlJykuZ2V0KDApOwogICAgc2VsZWN0VGV4dChlbGVtZW50KTsKfQpmdW5jdGlvbiBzZWxlY3RUZXh0KGVsZW1lbnQpIHsKICAgIC8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvOTg1MjcyCiAgICB2YXIgcmFuZ2UsIHNlbGVjdGlvbjsKICAgIGlmIChkb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSkgeyAgLy8gSUUgOAogICAgICAgIHJhbmdlID0gZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsKICAgICAgICByYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChlbGVtZW50KTsKICAgICAgICByYW5nZS5zZWxlY3QoKTsKICAgIH0gZWxzZSBpZiAod2luZG93LmdldFNlbGVjdGlvbikgeyAgLy8gT3RoZXJzCiAgICAgICAgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAgIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7CiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7CiAgICB9Cn0KZnVuY3Rpb24gTG9nTGV2ZWxDb250cm9sbGVyKG1pbkxldmVsLCBkZWZhdWx0TGV2ZWwpIHsKICAgIG1pbkxldmVsID0gTEVWRUxTW21pbkxldmVsXTsKICAgIGRlZmF1bHRMZXZlbCA9IExFVkVMU1tkZWZhdWx0TGV2ZWxdOwogICAgZnVuY3Rpb24gc2hvd0xvZ0xldmVsU2VsZWN0b3IoKSB7CiAgICAgICAgcmV0dXJuIG1pbkxldmVsIDwgTEVWRUxTLklORk87CiAgICB9CiAgICBmdW5jdGlvbiBkZWZhdWx0TG9nTGV2ZWwoKSB7CiAgICAgICAgaWYgKG1pbkxldmVsID4gZGVmYXVsdExldmVsKQogICAgICAgICAgICByZXR1cm4gbWluTGV2ZWw7CiAgICAgICAgcmV0dXJuIGRlZmF1bHRMZXZlbDsKICAgIH0KICAgIGZ1bmN0aW9uIHNob3dUcmFjZSgpIHsKICAgICAgICByZXR1cm4gbWluTGV2ZWwgPT0gTEVWRUxTLlRSQUNFOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBzaG93TG9nTGV2ZWxTZWxlY3Rvcjogc2hvd0xvZ0xldmVsU2VsZWN0b3IsCiAgICAgICAgZGVmYXVsdExvZ0xldmVsOiBkZWZhdWx0TG9nTGV2ZWwsCiAgICAgICAgc2hvd1RyYWNlOiBzaG93VHJhY2UKICAgIH07Cn0KPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLyohIGpRdWVyeSB2My41LjEgfCAoYykgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lLmRvY3VtZW50P3QoZSwhMCk6ZnVuY3Rpb24oZSl7aWYoIWUuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIHQoZSl9OnQoZSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKEMsZSl7InVzZSBzdHJpY3QiO3ZhciB0PVtdLHI9T2JqZWN0LmdldFByb3RvdHlwZU9mLHM9dC5zbGljZSxnPXQuZmxhdD9mdW5jdGlvbihlKXtyZXR1cm4gdC5mbGF0LmNhbGwoZSl9OmZ1bmN0aW9uKGUpe3JldHVybiB0LmNvbmNhdC5hcHBseShbXSxlKX0sdT10LnB1c2gsaT10LmluZGV4T2Ysbj17fSxvPW4udG9TdHJpbmcsdj1uLmhhc093blByb3BlcnR5LGE9di50b1N0cmluZyxsPWEuY2FsbChPYmplY3QpLHk9e30sbT1mdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmIm51bWJlciIhPXR5cGVvZiBlLm5vZGVUeXBlfSx4PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiZlPT09ZS53aW5kb3d9LEU9Qy5kb2N1bWVudCxjPXt0eXBlOiEwLHNyYzohMCxub25jZTohMCxub01vZHVsZTohMH07ZnVuY3Rpb24gYihlLHQsbil7dmFyIHIsaSxvPShuPW58fEUpLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2lmKG8udGV4dD1lLHQpZm9yKHIgaW4gYykoaT10W3JdfHx0LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUocikpJiZvLnNldEF0dHJpYnV0ZShyLGkpO24uaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfWZ1bmN0aW9uIHcoZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP25bby5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9dmFyIGY9IjMuNS4xIixTPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBTLmZuLmluaXQoZSx0KX07ZnVuY3Rpb24gcChlKXt2YXIgdD0hIWUmJiJsZW5ndGgiaW4gZSYmZS5sZW5ndGgsbj13KGUpO3JldHVybiFtKGUpJiYheChlKSYmKCJhcnJheSI9PT1ufHwwPT09dHx8Im51bWJlciI9PXR5cGVvZiB0JiYwPHQmJnQtMSBpbiBlKX1TLmZuPVMucHJvdG90eXBlPXtqcXVlcnk6Zixjb25zdHJ1Y3RvcjpTLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gcy5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/cy5jYWxsKHRoaXMpOmU8MD90aGlzW2UrdGhpcy5sZW5ndGhdOnRoaXNbZV19LHB1c2hTdGFjazpmdW5jdGlvbihlKXt2YXIgdD1TLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxlKTtyZXR1cm4gdC5wcmV2T2JqZWN0PXRoaXMsdH0sZWFjaDpmdW5jdGlvbihlKXtyZXR1cm4gUy5lYWNoKHRoaXMsZSl9LG1hcDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy5tYXAodGhpcyxmdW5jdGlvbihlLHQpe3JldHVybiBuLmNhbGwoZSx0LGUpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGV2ZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy5ncmVwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4odCsxKSUyfSkpfSxvZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy5ncmVwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCUyfSkpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxuPStlKyhlPDA/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soMDw9biYmbjx0P1t0aGlzW25dXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDp1LHNvcnQ6dC5zb3J0LHNwbGljZTp0LnNwbGljZX0sUy5leHRlbmQ9Uy5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLG8sYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsbD0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGw9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fG0oYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW3NdKSlmb3IodCBpbiBlKXI9ZVt0XSwiX19wcm90b19fIiE9PXQmJmEhPT1yJiYobCYmciYmKFMuaXNQbGFpbk9iamVjdChyKXx8KGk9QXJyYXkuaXNBcnJheShyKSkpPyhuPWFbdF0sbz1pJiYhQXJyYXkuaXNBcnJheShuKT9bXTppfHxTLmlzUGxhaW5PYmplY3Qobik/bjp7fSxpPSExLGFbdF09Uy5leHRlbmQobCxvLHIpKTp2b2lkIDAhPT1yJiYoYVt0XT1yKSk7cmV0dXJuIGF9LFMuZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhmK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKGUpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuISghZXx8IltvYmplY3QgT2JqZWN0XSIhPT1vLmNhbGwoZSkpJiYoISh0PXIoZSkpfHwiZnVuY3Rpb24iPT10eXBlb2Yobj12LmNhbGwodCwiY29uc3RydWN0b3IiKSYmdC5jb25zdHJ1Y3RvcikmJmEuY2FsbChuKT09PWwpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oZSx0LG4pe2IoZSx7bm9uY2U6dCYmdC5ub25jZX0sbil9LGVhY2g6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTA7aWYocChlKSl7Zm9yKG49ZS5sZW5ndGg7cjxuO3IrKylpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWt9ZWxzZSBmb3IociBpbiBlKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlicmVhaztyZXR1cm4gZX0sbWFrZUFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8W107cmV0dXJuIG51bGwhPWUmJihwKE9iamVjdChlKSk/Uy5tZXJnZShuLCJzdHJpbmciPT10eXBlb2YgZT9bZV06ZSk6dS5jYWxsKG4sZSkpLG59LGluQXJyYXk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBudWxsPT10Py0xOmkuY2FsbCh0LGUsbil9LG1lcmdlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPSt0Lmxlbmd0aCxyPTAsaT1lLmxlbmd0aDtyPG47cisrKWVbaSsrXT10W3JdO3JldHVybiBlLmxlbmd0aD1pLGV9LGdyZXA6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1bXSxpPTAsbz1lLmxlbmd0aCxhPSFuO2k8bztpKyspIXQoZVtpXSxpKSE9PWEmJnIucHVzaChlW2ldKTtyZXR1cm4gcn0sbWFwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89MCxhPVtdO2lmKHAoZSkpZm9yKHI9ZS5sZW5ndGg7bzxyO28rKyludWxsIT0oaT10KGVbb10sbyxuKSkmJmEucHVzaChpKTtlbHNlIGZvcihvIGluIGUpbnVsbCE9KGk9dChlW29dLG8sbikpJiZhLnB1c2goaSk7cmV0dXJuIGcoYSl9LGd1aWQ6MSxzdXBwb3J0Onl9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoUy5mbltTeW1ib2wuaXRlcmF0b3JdPXRbU3ltYm9sLml0ZXJhdG9yXSksUy5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe25bIltvYmplY3QgIit0KyJdIl09dC50b0xvd2VyQ2FzZSgpfSk7dmFyIGQ9ZnVuY3Rpb24obil7dmFyIGUsZCxiLG8saSxoLGYsZyx3LHUsbCxULEMsYSxFLHYscyxjLHksUz0ic2l6emxlIisxKm5ldyBEYXRlLHA9bi5kb2N1bWVudCxrPTAscj0wLG09dWUoKSx4PXVlKCksQT11ZSgpLE49dWUoKSxEPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10JiYobD0hMCksMH0saj17fS5oYXNPd25Qcm9wZXJ0eSx0PVtdLHE9dC5wb3AsTD10LnB1c2gsSD10LnB1c2gsTz10LnNsaWNlLFA9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspaWYoZVtuXT09PXQpcmV0dXJuIG47cmV0dXJuLTF9LFI9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixNPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixJPSIoPzpcXFxcW1xcZGEtZkEtRl17MSw2fSIrTSsiP3xcXFxcW15cXHJcXG5cXGZdfFtcXHctXXxbXlwwLVxceDdmXSkrIixXPSJcXFsiK00rIiooIitJKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrSSsiKSl8KSIrTSsiKlxcXSIsRj0iOigiK0krIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK1crIikqKXwuKilcXCl8KSIsQj1uZXcgUmVnRXhwKE0rIisiLCJnIiksJD1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLF89bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSx6PW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksVT1uZXcgUmVnRXhwKE0rInw+IiksWD1uZXcgUmVnRXhwKEYpLFY9bmV3IFJlZ0V4cCgiXiIrSSsiJCIpLEc9e0lEOm5ldyBSZWdFeHAoIl4jKCIrSSsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitJKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitJKyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrVyksUFNFVURPOm5ldyBSZWdFeHAoIl4iK0YpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTSsiKig/OihbKy1dfCkiK00rIiooXFxkKyl8KSkiK00rIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK1IrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitNKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK00rIiooKD86LVxcZCk/XFxkKikiK00rIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFk9L0hUTUwkL2ksUT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLEo9L15oXGQkL2ksSz0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLGVlPS9bK35dLyx0ZT1uZXcgUmVnRXhwKCJcXFxcW1xcZGEtZkEtRl17MSw2fSIrTSsiP3xcXFxcKFteXFxyXFxuXFxmXSkiLCJnIiksbmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj0iMHgiK2Uuc2xpY2UoMSktNjU1MzY7cmV0dXJuIHR8fChuPDA/U3RyaW5nLmZyb21DaGFyQ29kZShuKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKG4+PjEwfDU1Mjk2LDEwMjMmbnw1NjMyMCkpfSxyZT0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxpZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PyJcMCI9PT1lPyJcdWZmZmQiOmUuc2xpY2UoMCwtMSkrIlxcIitlLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2V9LG9lPWZ1bmN0aW9uKCl7VCgpfSxhZT1iZShmdW5jdGlvbihlKXtyZXR1cm4hMD09PWUuZGlzYWJsZWQmJiJmaWVsZHNldCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7SC5hcHBseSh0PU8uY2FsbChwLmNoaWxkTm9kZXMpLHAuY2hpbGROb2RlcyksdFtwLmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlKXtIPXthcHBseTp0Lmxlbmd0aD9mdW5jdGlvbihlLHQpe0wuYXBwbHkoZSxPLmNhbGwodCkpfTpmdW5jdGlvbihlLHQpe3ZhciBuPWUubGVuZ3RoLHI9MDt3aGlsZShlW24rK109dFtyKytdKTtlLmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBzZSh0LGUsbixyKXt2YXIgaSxvLGEscyx1LGwsYyxmPWUmJmUub3duZXJEb2N1bWVudCxwPWU/ZS5ub2RlVHlwZTo5O2lmKG49bnx8W10sInN0cmluZyIhPXR5cGVvZiB0fHwhdHx8MSE9PXAmJjkhPT1wJiYxMSE9PXApcmV0dXJuIG47aWYoIXImJihUKGUpLGU9ZXx8QyxFKSl7aWYoMTEhPT1wJiYodT1aLmV4ZWModCkpKWlmKGk9dVsxXSl7aWYoOT09PXApe2lmKCEoYT1lLmdldEVsZW1lbnRCeUlkKGkpKSlyZXR1cm4gbjtpZihhLmlkPT09aSlyZXR1cm4gbi5wdXNoKGEpLG59ZWxzZSBpZihmJiYoYT1mLmdldEVsZW1lbnRCeUlkKGkpKSYmeShlLGEpJiZhLmlkPT09aSlyZXR1cm4gbi5wdXNoKGEpLG59ZWxzZXtpZih1WzJdKXJldHVybiBILmFwcGx5KG4sZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KSksbjtpZigoaT11WzNdKSYmZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkobixlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaSkpLG59aWYoZC5xc2EmJiFOW3QrIiAiXSYmKCF2fHwhdi50ZXN0KHQpKSYmKDEhPT1wfHwib2JqZWN0IiE9PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpe2lmKGM9dCxmPWUsMT09PXAmJihVLnRlc3QodCl8fHoudGVzdCh0KSkpeyhmPWVlLnRlc3QodCkmJnllKGUucGFyZW50Tm9kZSl8fGUpPT09ZSYmZC5zY29wZXx8KChzPWUuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXMucmVwbGFjZShyZSxpZSk6ZS5zZXRBdHRyaWJ1dGUoImlkIixzPVMpKSxvPShsPWgodCkpLmxlbmd0aDt3aGlsZShvLS0pbFtvXT0ocz8iIyIrczoiOnNjb3BlIikrIiAiK3hlKGxbb10pO2M9bC5qb2luKCIsIil9dHJ5e3JldHVybiBILmFwcGx5KG4sZi5xdWVyeVNlbGVjdG9yQWxsKGMpKSxufWNhdGNoKGUpe04odCwhMCl9ZmluYWxseXtzPT09UyYmZS5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gZyh0LnJlcGxhY2UoJCwiJDEiKSxlLG4scil9ZnVuY3Rpb24gdWUoKXt2YXIgcj1bXTtyZXR1cm4gZnVuY3Rpb24gZSh0LG4pe3JldHVybiByLnB1c2godCsiICIpPmIuY2FjaGVMZW5ndGgmJmRlbGV0ZSBlW3Iuc2hpZnQoKV0sZVt0KyIgIl09bn19ZnVuY3Rpb24gbGUoZSl7cmV0dXJuIGVbU109ITAsZX1mdW5jdGlvbiBjZShlKXt2YXIgdD1DLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dHJ5e3JldHVybiEhZSh0KX1jYXRjaChlKXtyZXR1cm4hMX1maW5hbGx5e3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHQ9bnVsbH19ZnVuY3Rpb24gZmUoZSx0KXt2YXIgbj1lLnNwbGl0KCJ8Iikscj1uLmxlbmd0aDt3aGlsZShyLS0pYi5hdHRySGFuZGxlW25bcl1dPXR9ZnVuY3Rpb24gcGUoZSx0KXt2YXIgbj10JiZlLHI9biYmMT09PWUubm9kZVR5cGUmJjE9PT10Lm5vZGVUeXBlJiZlLnNvdXJjZUluZGV4LXQuc291cmNlSW5kZXg7aWYocilyZXR1cm4gcjtpZihuKXdoaWxlKG49bi5uZXh0U2libGluZylpZihuPT09dClyZXR1cm4tMTtyZXR1cm4gZT8xOi0xfWZ1bmN0aW9uIGRlKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBoZShuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09dHx8ImJ1dHRvbiI9PT10KSYmZS50eXBlPT09bn19ZnVuY3Rpb24gZ2UodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJmb3JtImluIGU/ZS5wYXJlbnROb2RlJiYhMT09PWUuZGlzYWJsZWQ/ImxhYmVsImluIGU/ImxhYmVsImluIGUucGFyZW50Tm9kZT9lLnBhcmVudE5vZGUuZGlzYWJsZWQ9PT10OmUuZGlzYWJsZWQ9PT10OmUuaXNEaXNhYmxlZD09PXR8fGUuaXNEaXNhYmxlZCE9PSF0JiZhZShlKT09PXQ6ZS5kaXNhYmxlZD09PXQ6ImxhYmVsImluIGUmJmUuZGlzYWJsZWQ9PT10fX1mdW5jdGlvbiB2ZShhKXtyZXR1cm4gbGUoZnVuY3Rpb24obyl7cmV0dXJuIG89K28sbGUoZnVuY3Rpb24oZSx0KXt2YXIgbixyPWEoW10sZS5sZW5ndGgsbyksaT1yLmxlbmd0aDt3aGlsZShpLS0pZVtuPXJbaV1dJiYoZVtuXT0hKHRbbl09ZVtuXSkpfSl9KX1mdW5jdGlvbiB5ZShlKXtyZXR1cm4gZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZlfWZvcihlIGluIGQ9c2Uuc3VwcG9ydD17fSxpPXNlLmlzWE1MPWZ1bmN0aW9uKGUpe3ZhciB0PWUubmFtZXNwYWNlVVJJLG49KGUub3duZXJEb2N1bWVudHx8ZSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiFZLnRlc3QodHx8biYmbi5ub2RlTmFtZXx8IkhUTUwiKX0sVD1zZS5zZXREb2N1bWVudD1mdW5jdGlvbihlKXt2YXIgdCxuLHI9ZT9lLm93bmVyRG9jdW1lbnR8fGU6cDtyZXR1cm4gciE9QyYmOT09PXIubm9kZVR5cGUmJnIuZG9jdW1lbnRFbGVtZW50JiYoYT0oQz1yKS5kb2N1bWVudEVsZW1lbnQsRT0haShDKSxwIT1DJiYobj1DLmRlZmF1bHRWaWV3KSYmbi50b3AhPT1uJiYobi5hZGRFdmVudExpc3RlbmVyP24uYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixvZSwhMSk6bi5hdHRhY2hFdmVudCYmbi5hdHRhY2hFdmVudCgib251bmxvYWQiLG9lKSksZC5zY29wZT1jZShmdW5jdGlvbihlKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZChDLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSwidW5kZWZpbmVkIiE9dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbCYmIWUucXVlcnlTZWxlY3RvckFsbCgiOnNjb3BlIGZpZWxkc2V0IGRpdiIpLmxlbmd0aH0pLGQuYXR0cmlidXRlcz1jZShmdW5jdGlvbihlKXtyZXR1cm4gZS5jbGFzc05hbWU9ImkiLCFlLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxkLmdldEVsZW1lbnRzQnlUYWdOYW1lPWNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGVuZENoaWxkKEMuY3JlYXRlQ29tbWVudCgiIikpLCFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPUsudGVzdChDLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGQuZ2V0QnlJZD1jZShmdW5jdGlvbihlKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChlKS5pZD1TLCFDLmdldEVsZW1lbnRzQnlOYW1lfHwhQy5nZXRFbGVtZW50c0J5TmFtZShTKS5sZW5ndGh9KSxkLmdldEJ5SWQ/KGIuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSh0ZSxuZSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiaWQiKT09PXR9fSxiLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJkUpe3ZhciBuPXQuZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIG4/W25dOltdfX0pOihiLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgbj1lLnJlcGxhY2UodGUsbmUpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD0idW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiB0JiZ0LnZhbHVlPT09bn19LGIuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmRSl7dmFyIG4scixpLG89dC5nZXRFbGVtZW50QnlJZChlKTtpZihvKXtpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb107aT10LmdldEVsZW1lbnRzQnlOYW1lKGUpLHI9MDt3aGlsZShvPWlbcisrXSlpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb119cmV0dXJuW119fSksYi5maW5kLlRBRz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGUsdCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6ZC5xc2E/dC5xdWVyeVNlbGVjdG9yQWxsKGUpOnZvaWQgMH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sYi5maW5kLkNMQVNTPWQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmRSlyZXR1cm4gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpfSxzPVtdLHY9W10sKGQucXNhPUsudGVzdChDLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKGNlKGZ1bmN0aW9uKGUpe3ZhciB0O2EuYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPSI8YSBpZD0nIitTKyInPjwvYT48c2VsZWN0IGlkPSciK1MrIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmdi5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8di5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK1IrIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitTKyItXSIpLmxlbmd0aHx8di5wdXNoKCJ+PSIpLCh0PUMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJuYW1lIiwiIiksZS5hcHBlbmRDaGlsZCh0KSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPScnXSIpLmxlbmd0aHx8di5wdXNoKCJcXFsiK00rIipuYW1lIitNKyIqPSIrTSsiKig/OicnfFwiXCIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8di5wdXNoKCI6Y2hlY2tlZCIpLGUucXVlcnlTZWxlY3RvckFsbCgiYSMiK1MrIisqIikubGVuZ3RofHx2LnB1c2goIi4jLitbK35dIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJcXFxmIiksdi5wdXNoKCJbXFxyXFxuXFxmXSIpfSksY2UoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7dmFyIHQ9Qy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3Quc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksZS5hcHBlbmRDaGlsZCh0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmdi5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZD0hMCwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJnYucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSx2LnB1c2goIiwuKjoiKX0pKSwoZC5tYXRjaGVzU2VsZWN0b3I9Sy50ZXN0KGM9YS5tYXRjaGVzfHxhLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEub01hdGNoZXNTZWxlY3Rvcnx8YS5tc01hdGNoZXNTZWxlY3RvcikpJiZjZShmdW5jdGlvbihlKXtkLmRpc2Nvbm5lY3RlZE1hdGNoPWMuY2FsbChlLCIqIiksYy5jYWxsKGUsIltzIT0nJ106eCIpLHMucHVzaCgiIT0iLEYpfSksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSkscz1zLmxlbmd0aCYmbmV3IFJlZ0V4cChzLmpvaW4oInwiKSksdD1LLnRlc3QoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikseT10fHxLLnRlc3QoYS5jb250YWlucyk/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KXdoaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxEPXQ/ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gbD0hMCwwO3ZhciBuPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBufHwoMSYobj0oZS5vd25lckRvY3VtZW50fHxlKT09KHQub3duZXJEb2N1bWVudHx8dCk/ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KToxKXx8IWQuc29ydERldGFjaGVkJiZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpPT09bj9lPT1DfHxlLm93bmVyRG9jdW1lbnQ9PXAmJnkocCxlKT8tMTp0PT1DfHx0Lm93bmVyRG9jdW1lbnQ9PXAmJnkocCx0KT8xOnU/UCh1LGUpLVAodSx0KTowOjQmbj8tMToxKX06ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gbD0hMCwwO3ZhciBuLHI9MCxpPWUucGFyZW50Tm9kZSxvPXQucGFyZW50Tm9kZSxhPVtlXSxzPVt0XTtpZighaXx8IW8pcmV0dXJuIGU9PUM/LTE6dD09Qz8xOmk/LTE6bz8xOnU/UCh1LGUpLVAodSx0KTowO2lmKGk9PT1vKXJldHVybiBwZShlLHQpO249ZTt3aGlsZShuPW4ucGFyZW50Tm9kZSlhLnVuc2hpZnQobik7bj10O3doaWxlKG49bi5wYXJlbnROb2RlKXMudW5zaGlmdChuKTt3aGlsZShhW3JdPT09c1tyXSlyKys7cmV0dXJuIHI/cGUoYVtyXSxzW3JdKTphW3JdPT1wPy0xOnNbcl09PXA/MTowfSksQ30sc2UubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBzZShlLG51bGwsbnVsbCx0KX0sc2UubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7aWYoVChlKSxkLm1hdGNoZXNTZWxlY3RvciYmRSYmIU5bdCsiICJdJiYoIXN8fCFzLnRlc3QodCkpJiYoIXZ8fCF2LnRlc3QodCkpKXRyeXt2YXIgbj1jLmNhbGwoZSx0KTtpZihufHxkLmRpc2Nvbm5lY3RlZE1hdGNofHxlLmRvY3VtZW50JiYxMSE9PWUuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIG59Y2F0Y2goZSl7Tih0LCEwKX1yZXR1cm4gMDxzZSh0LEMsbnVsbCxbZV0pLmxlbmd0aH0sc2UuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZS5vd25lckRvY3VtZW50fHxlKSE9QyYmVChlKSx5KGUsdCl9LHNlLmF0dHI9ZnVuY3Rpb24oZSx0KXsoZS5vd25lckRvY3VtZW50fHxlKSE9QyYmVChlKTt2YXIgbj1iLmF0dHJIYW5kbGVbdC50b0xvd2VyQ2FzZSgpXSxyPW4mJmouY2FsbChiLmF0dHJIYW5kbGUsdC50b0xvd2VyQ2FzZSgpKT9uKGUsdCwhRSk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1yP3I6ZC5hdHRyaWJ1dGVzfHwhRT9lLmdldEF0dHJpYnV0ZSh0KToocj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9LHNlLmVzY2FwZT1mdW5jdGlvbihlKXtyZXR1cm4oZSsiIikucmVwbGFjZShyZSxpZSl9LHNlLmVycm9yPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitlKX0sc2UudW5pcXVlU29ydD1mdW5jdGlvbihlKXt2YXIgdCxuPVtdLHI9MCxpPTA7aWYobD0hZC5kZXRlY3REdXBsaWNhdGVzLHU9IWQuc29ydFN0YWJsZSYmZS5zbGljZSgwKSxlLnNvcnQoRCksbCl7d2hpbGUodD1lW2krK10pdD09PWVbaV0mJihyPW4ucHVzaChpKSk7d2hpbGUoci0tKWUuc3BsaWNlKG5bcl0sMSl9cmV0dXJuIHU9bnVsbCxlfSxvPXNlLmdldFRleHQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj0iIixyPTAsaT1lLm5vZGVUeXBlO2lmKGkpe2lmKDE9PT1pfHw5PT09aXx8MTE9PT1pKXtpZigic3RyaW5nIj09dHlwZW9mIGUudGV4dENvbnRlbnQpcmV0dXJuIGUudGV4dENvbnRlbnQ7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKW4rPW8oZSl9ZWxzZSBpZigzPT09aXx8ND09PWkpcmV0dXJuIGUubm9kZVZhbHVlfWVsc2Ugd2hpbGUodD1lW3IrK10pbis9byh0KTtyZXR1cm4gbn0sKGI9c2Uuc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86bGUsbWF0Y2g6RyxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKHRlLG5lKSxlWzNdPShlWzNdfHxlWzRdfHxlWzVdfHwiIikucmVwbGFjZSh0ZSxuZSksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fHNlLmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKCJldmVuIj09PWVbM118fCJvZGQiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fCJvZGQiPT09ZVszXSkpOmVbM10mJnNlLmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuPSFlWzZdJiZlWzJdO3JldHVybiBHLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXT9lWzJdPWVbNF18fGVbNV18fCIiOm4mJlgudGVzdChuKSYmKHQ9aChuLCEwKSkmJih0PW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtdCktbi5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1uLnNsaWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UodGUsbmUpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09ZT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dH19LENMQVNTOmZ1bmN0aW9uKGUpe3ZhciB0PW1bZSsiICJdO3JldHVybiB0fHwodD1uZXcgUmVnRXhwKCIoXnwiK00rIikiK2UrIigiK00rInwkKSIpKSYmbShlLGZ1bmN0aW9uKGUpe3JldHVybiB0LnRlc3QoInN0cmluZyI9PXR5cGVvZiBlLmNsYXNzTmFtZSYmZS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihuLHIsaSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXNlLmF0dHIoZSxuKTtyZXR1cm4gbnVsbD09dD8iIT0iPT09cjohcnx8KHQrPSIiLCI9Ij09PXI/dD09PWk6IiE9Ij09PXI/dCE9PWk6Il49Ij09PXI/aSYmMD09PXQuaW5kZXhPZihpKToiKj0iPT09cj9pJiYtMTx0LmluZGV4T2YoaSk6IiQ9Ij09PXI/aSYmdC5zbGljZSgtaS5sZW5ndGgpPT09aToifj0iPT09cj8tMTwoIiAiK3QucmVwbGFjZShCLCIgIikrIiAiKS5pbmRleE9mKGkpOiJ8PSI9PT1yJiYodD09PWl8fHQuc2xpY2UoMCxpLmxlbmd0aCsxKT09PWkrIi0iKSl9fSxDSElMRDpmdW5jdGlvbihoLGUsdCxnLHYpe3ZhciB5PSJudGgiIT09aC5zbGljZSgwLDMpLG09Imxhc3QiIT09aC5zbGljZSgtNCkseD0ib2YtdHlwZSI9PT1lO3JldHVybiAxPT09ZyYmMD09PXY/ZnVuY3Rpb24oZSl7cmV0dXJuISFlLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbD15IT09bT8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLGM9ZS5wYXJlbnROb2RlLGY9eCYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHA9IW4mJiF4LGQ9ITE7aWYoYyl7aWYoeSl7d2hpbGUobCl7YT1lO3doaWxlKGE9YVtsXSlpZih4P2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWY6MT09PWEubm9kZVR5cGUpcmV0dXJuITE7dT1sPSJvbmx5Ij09PWgmJiF1JiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKHU9W20/Yy5maXJzdENoaWxkOmMubGFzdENoaWxkXSxtJiZwKXtkPShzPShyPShpPShvPShhPWMpW1NdfHwoYVtTXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdfHxbXSlbMF09PT1rJiZyWzFdKSYmclsyXSxhPXMmJmMuY2hpbGROb2Rlc1tzXTt3aGlsZShhPSsrcyYmYSYmYVtsXXx8KGQ9cz0wKXx8dS5wb3AoKSlpZigxPT09YS5ub2RlVHlwZSYmKytkJiZhPT09ZSl7aVtoXT1bayxzLGRdO2JyZWFrfX1lbHNlIGlmKHAmJihkPXM9KHI9KGk9KG89KGE9ZSlbU118fChhW1NdPXt9KSlbYS51bmlxdWVJRF18fChvW2EudW5pcXVlSURdPXt9KSlbaF18fFtdKVswXT09PWsmJnJbMV0pLCExPT09ZCl3aGlsZShhPSsrcyYmYSYmYVtsXXx8KGQ9cz0wKXx8dS5wb3AoKSlpZigoeD9hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1mOjE9PT1hLm5vZGVUeXBlKSYmKytkJiYocCYmKChpPShvPWFbU118fChhW1NdPXt9KSlbYS51bmlxdWVJRF18fChvW2EudW5pcXVlSURdPXt9KSlbaF09W2ssZF0pLGE9PT1lKSlicmVhaztyZXR1cm4oZC09dik9PT1nfHxkJWc9PTAmJjA8PWQvZ319fSxQU0VVRE86ZnVuY3Rpb24oZSxvKXt2YXIgdCxhPWIucHNldWRvc1tlXXx8Yi5zZXRGaWx0ZXJzW2UudG9Mb3dlckNhc2UoKV18fHNlLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrZSk7cmV0dXJuIGFbU10/YShvKToxPGEubGVuZ3RoPyh0PVtlLGUsIiIsb10sYi5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/bGUoZnVuY3Rpb24oZSx0KXt2YXIgbixyPWEoZSxvKSxpPXIubGVuZ3RoO3doaWxlKGktLSllW249UChlLHJbaV0pXT0hKHRbbl09cltpXSl9KTpmdW5jdGlvbihlKXtyZXR1cm4gYShlLDAsdCl9KTphfX0scHNldWRvczp7bm90OmxlKGZ1bmN0aW9uKGUpe3ZhciByPVtdLGk9W10scz1mKGUucmVwbGFjZSgkLCIkMSIpKTtyZXR1cm4gc1tTXT9sZShmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPXMoZSxudWxsLHIsW10pLGE9ZS5sZW5ndGg7d2hpbGUoYS0tKShpPW9bYV0pJiYoZVthXT0hKHRbYV09aSkpfSk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByWzBdPWUscyhyLG51bGwsbixpKSxyWzBdPW51bGwsIWkucG9wKCl9fSksaGFzOmxlKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gMDxzZSh0LGUpLmxlbmd0aH19KSxjb250YWluczpsZShmdW5jdGlvbih0KXtyZXR1cm4gdD10LnJlcGxhY2UodGUsbmUpLGZ1bmN0aW9uKGUpe3JldHVybi0xPChlLnRleHRDb250ZW50fHxvKGUpKS5pbmRleE9mKHQpfX0pLGxhbmc6bGUoZnVuY3Rpb24obil7cmV0dXJuIFYudGVzdChufHwiIil8fHNlLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK24pLG49bi5yZXBsYWNlKHRlLG5lKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGUpe3ZhciB0O2Rve2lmKHQ9RT9lLmxhbmc6ZS5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGUuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuKHQ9dC50b0xvd2VyQ2FzZSgpKT09PW58fDA9PT10LmluZGV4T2YobisiLSIpfXdoaWxlKChlPWUucGFyZW50Tm9kZSkmJjE9PT1lLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5sb2NhdGlvbiYmbi5sb2NhdGlvbi5oYXNoO3JldHVybiB0JiZ0LnNsaWNlKDEpPT09ZS5pZH0scm9vdDpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWF9LGZvY3VzOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09Qy5hY3RpdmVFbGVtZW50JiYoIUMuaGFzRm9jdXN8fEMuaGFzRm9jdXMoKSkmJiEhKGUudHlwZXx8ZS5ocmVmfHx+ZS50YWJJbmRleCl9LGVuYWJsZWQ6Z2UoITEpLGRpc2FibGVkOmdlKCEwKSxjaGVja2VkOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmISFlLmNoZWNrZWR8fCJvcHRpb24iPT09dCYmISFlLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCwhMD09PWUuc2VsZWN0ZWR9LGVtcHR5OmZ1bmN0aW9uKGUpe2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZylpZihlLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihlKXtyZXR1cm4hYi5wc2V1ZG9zLmVtcHR5KGUpfSxoZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIEoudGVzdChlLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIFEudGVzdChlLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmImJ1dHRvbiI9PT1lLnR5cGV8fCJidXR0b24iPT09dH0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1lLnR5cGUmJihudWxsPT0odD1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09dC50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6dmUoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OnZlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuW3QtMV19KSxlcTp2ZShmdW5jdGlvbihlLHQsbil7cmV0dXJuW248MD9uK3Q6bl19KSxldmVuOnZlKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjx0O24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksb2RkOnZlKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTE7bjx0O24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksbHQ6dmUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0OnQ8bj90Om47MDw9LS1yOyllLnB1c2gocik7cmV0dXJuIGV9KSxndDp2ZShmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9uK3Q6bjsrK3I8dDspZS5wdXNoKHIpO3JldHVybiBlfSl9fSkucHNldWRvcy5udGg9Yi5wc2V1ZG9zLmVxLHtyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSliLnBzZXVkb3NbZV09ZGUoZSk7Zm9yKGUgaW57c3VibWl0OiEwLHJlc2V0OiEwfSliLnBzZXVkb3NbZV09aGUoZSk7ZnVuY3Rpb24gbWUoKXt9ZnVuY3Rpb24geGUoZSl7Zm9yKHZhciB0PTAsbj1lLmxlbmd0aCxyPSIiO3Q8bjt0Kyspcis9ZVt0XS52YWx1ZTtyZXR1cm4gcn1mdW5jdGlvbiBiZShzLGUsdCl7dmFyIHU9ZS5kaXIsbD1lLm5leHQsYz1sfHx1LGY9dCYmInBhcmVudE5vZGUiPT09YyxwPXIrKztyZXR1cm4gZS5maXJzdD9mdW5jdGlvbihlLHQsbil7d2hpbGUoZT1lW3VdKWlmKDE9PT1lLm5vZGVUeXBlfHxmKXJldHVybiBzKGUsdCxuKTtyZXR1cm4hMX06ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPVtrLHBdO2lmKG4pe3doaWxlKGU9ZVt1XSlpZigoMT09PWUubm9kZVR5cGV8fGYpJiZzKGUsdCxuKSlyZXR1cm4hMH1lbHNlIHdoaWxlKGU9ZVt1XSlpZigxPT09ZS5ub2RlVHlwZXx8ZilpZihpPShvPWVbU118fChlW1NdPXt9KSlbZS51bmlxdWVJRF18fChvW2UudW5pcXVlSURdPXt9KSxsJiZsPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKWU9ZVt1XXx8ZTtlbHNle2lmKChyPWlbY10pJiZyWzBdPT09ayYmclsxXT09PXApcmV0dXJuIGFbMl09clsyXTtpZigoaVtjXT1hKVsyXT1zKGUsdCxuKSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gd2UoaSl7cmV0dXJuIDE8aS5sZW5ndGg/ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWkubGVuZ3RoO3doaWxlKHItLSlpZighaVtyXShlLHQsbikpcmV0dXJuITE7cmV0dXJuITB9OmlbMF19ZnVuY3Rpb24gVGUoZSx0LG4scixpKXtmb3IodmFyIG8sYT1bXSxzPTAsdT1lLmxlbmd0aCxsPW51bGwhPXQ7czx1O3MrKykobz1lW3NdKSYmKG4mJiFuKG8scixpKXx8KGEucHVzaChvKSxsJiZ0LnB1c2gocykpKTtyZXR1cm4gYX1mdW5jdGlvbiBDZShkLGgsZyx2LHksZSl7cmV0dXJuIHYmJiF2W1NdJiYodj1DZSh2KSkseSYmIXlbU10mJih5PUNlKHksZSkpLGxlKGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzPVtdLHU9W10sbD10Lmxlbmd0aCxjPWV8fGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspc2UoZSx0W3JdLG4pO3JldHVybiBufShofHwiKiIsbi5ub2RlVHlwZT9bbl06bixbXSksZj0hZHx8IWUmJmg/YzpUZShjLHMsZCxuLHIpLHA9Zz95fHwoZT9kOmx8fHYpP1tdOnQ6ZjtpZihnJiZnKGYscCxuLHIpLHYpe2k9VGUocCx1KSx2KGksW10sbixyKSxvPWkubGVuZ3RoO3doaWxlKG8tLSkoYT1pW29dKSYmKHBbdVtvXV09IShmW3Vbb11dPWEpKX1pZihlKXtpZih5fHxkKXtpZih5KXtpPVtdLG89cC5sZW5ndGg7d2hpbGUoby0tKShhPXBbb10pJiZpLnB1c2goZltvXT1hKTt5KG51bGwscD1bXSxpLHIpfW89cC5sZW5ndGg7d2hpbGUoby0tKShhPXBbb10pJiYtMTwoaT15P1AoZSxhKTpzW29dKSYmKGVbaV09ISh0W2ldPWEpKX19ZWxzZSBwPVRlKHA9PT10P3Auc3BsaWNlKGwscC5sZW5ndGgpOnApLHk/eShudWxsLHQscCxyKTpILmFwcGx5KHQscCl9KX1mdW5jdGlvbiBFZShlKXtmb3IodmFyIGksdCxuLHI9ZS5sZW5ndGgsbz1iLnJlbGF0aXZlW2VbMF0udHlwZV0sYT1vfHxiLnJlbGF0aXZlWyIgIl0scz1vPzE6MCx1PWJlKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09aX0sYSwhMCksbD1iZShmdW5jdGlvbihlKXtyZXR1cm4tMTxQKGksZSl9LGEsITApLGM9W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj0hbyYmKG58fHQhPT13KXx8KChpPXQpLm5vZGVUeXBlP3UoZSx0LG4pOmwoZSx0LG4pKTtyZXR1cm4gaT1udWxsLHJ9XTtzPHI7cysrKWlmKHQ9Yi5yZWxhdGl2ZVtlW3NdLnR5cGVdKWM9W2JlKHdlKGMpLHQpXTtlbHNle2lmKCh0PWIuZmlsdGVyW2Vbc10udHlwZV0uYXBwbHkobnVsbCxlW3NdLm1hdGNoZXMpKVtTXSl7Zm9yKG49KytzO248cjtuKyspaWYoYi5yZWxhdGl2ZVtlW25dLnR5cGVdKWJyZWFrO3JldHVybiBDZSgxPHMmJndlKGMpLDE8cyYmeGUoZS5zbGljZSgwLHMtMSkuY29uY2F0KHt2YWx1ZToiICI9PT1lW3MtMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZSgkLCIkMSIpLHQsczxuJiZFZShlLnNsaWNlKHMsbikpLG48ciYmRWUoZT1lLnNsaWNlKG4pKSxuPHImJnhlKGUpKX1jLnB1c2godCl9cmV0dXJuIHdlKGMpfXJldHVybiBtZS5wcm90b3R5cGU9Yi5maWx0ZXJzPWIucHNldWRvcyxiLnNldEZpbHRlcnM9bmV3IG1lLGg9c2UudG9rZW5pemU9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHMsdSxsPXhbZSsiICJdO2lmKGwpcmV0dXJuIHQ/MDpsLnNsaWNlKDApO2E9ZSxzPVtdLHU9Yi5wcmVGaWx0ZXI7d2hpbGUoYSl7Zm9yKG8gaW4gbiYmIShyPV8uZXhlYyhhKSl8fChyJiYoYT1hLnNsaWNlKHJbMF0ubGVuZ3RoKXx8YSkscy5wdXNoKGk9W10pKSxuPSExLChyPXouZXhlYyhhKSkmJihuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpyWzBdLnJlcGxhY2UoJCwiICIpfSksYT1hLnNsaWNlKG4ubGVuZ3RoKSksYi5maWx0ZXIpIShyPUdbb10uZXhlYyhhKSl8fHVbb10mJiEocj11W29dKHIpKXx8KG49ci5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOm8sbWF0Y2hlczpyfSksYT1hLnNsaWNlKG4ubGVuZ3RoKSk7aWYoIW4pYnJlYWt9cmV0dXJuIHQ/YS5sZW5ndGg6YT9zZS5lcnJvcihlKTp4KGUscykuc2xpY2UoMCl9LGY9c2UuY29tcGlsZT1mdW5jdGlvbihlLHQpe3ZhciBuLHYseSxtLHgscixpPVtdLG89W10sYT1BW2UrIiAiXTtpZighYSl7dHx8KHQ9aChlKSksbj10Lmxlbmd0aDt3aGlsZShuLS0pKGE9RWUodFtuXSkpW1NdP2kucHVzaChhKTpvLnB1c2goYSk7KGE9QShlLCh2PW8sbT0wPCh5PWkpLmxlbmd0aCx4PTA8di5sZW5ndGgscj1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyx1PTAsbD0iMCIsYz1lJiZbXSxmPVtdLHA9dyxkPWV8fHgmJmIuZmluZC5UQUcoIioiLGkpLGg9ays9bnVsbD09cD8xOk1hdGgucmFuZG9tKCl8fC4xLGc9ZC5sZW5ndGg7Zm9yKGkmJih3PXQ9PUN8fHR8fGkpO2whPT1nJiZudWxsIT0obz1kW2xdKTtsKyspe2lmKHgmJm8pe2E9MCx0fHxvLm93bmVyRG9jdW1lbnQ9PUN8fChUKG8pLG49IUUpO3doaWxlKHM9dlthKytdKWlmKHMobyx0fHxDLG4pKXtyLnB1c2gobyk7YnJlYWt9aSYmKGs9aCl9bSYmKChvPSFzJiZvKSYmdS0tLGUmJmMucHVzaChvKSl9aWYodSs9bCxtJiZsIT09dSl7YT0wO3doaWxlKHM9eVthKytdKXMoYyxmLHQsbik7aWYoZSl7aWYoMDx1KXdoaWxlKGwtLSljW2xdfHxmW2xdfHwoZltsXT1xLmNhbGwocikpO2Y9VGUoZil9SC5hcHBseShyLGYpLGkmJiFlJiYwPGYubGVuZ3RoJiYxPHUreS5sZW5ndGgmJnNlLnVuaXF1ZVNvcnQocil9cmV0dXJuIGkmJihrPWgsdz1wKSxjfSxtP2xlKHIpOnIpKSkuc2VsZWN0b3I9ZX1yZXR1cm4gYX0sZz1zZS5zZWxlY3Q9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLGM9IXImJmgoZT1sLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1jLmxlbmd0aCl7aWYoMjwobz1jWzBdPWNbMF0uc2xpY2UoMCkpLmxlbmd0aCYmIklEIj09PShhPW9bMF0pLnR5cGUmJjk9PT10Lm5vZGVUeXBlJiZFJiZiLnJlbGF0aXZlW29bMV0udHlwZV0pe2lmKCEodD0oYi5maW5kLklEKGEubWF0Y2hlc1swXS5yZXBsYWNlKHRlLG5lKSx0KXx8W10pWzBdKSlyZXR1cm4gbjtsJiYodD10LnBhcmVudE5vZGUpLGU9ZS5zbGljZShvLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPUcubmVlZHNDb250ZXh0LnRlc3QoZSk/MDpvLmxlbmd0aDt3aGlsZShpLS0pe2lmKGE9b1tpXSxiLnJlbGF0aXZlW3M9YS50eXBlXSlicmVhaztpZigodT1iLmZpbmRbc10pJiYocj11KGEubWF0Y2hlc1swXS5yZXBsYWNlKHRlLG5lKSxlZS50ZXN0KG9bMF0udHlwZSkmJnllKHQucGFyZW50Tm9kZSl8fHQpKSl7aWYoby5zcGxpY2UoaSwxKSwhKGU9ci5sZW5ndGgmJnhlKG8pKSlyZXR1cm4gSC5hcHBseShuLHIpLG47YnJlYWt9fX1yZXR1cm4obHx8ZihlLGMpKShyLHQsIUUsbiwhdHx8ZWUudGVzdChlKSYmeWUodC5wYXJlbnROb2RlKXx8dCksbn0sZC5zb3J0U3RhYmxlPVMuc3BsaXQoIiIpLnNvcnQoRCkuam9pbigiIik9PT1TLGQuZGV0ZWN0RHVwbGljYXRlcz0hIWwsVCgpLGQuc29ydERldGFjaGVkPWNlKGZ1bmN0aW9uKGUpe3JldHVybiAxJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oQy5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKX0pLGNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGZlKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihlLHQsbil7aWYoIW4pcmV0dXJuIGUuZ2V0QXR0cmlidXRlKHQsInR5cGUiPT09dC50b0xvd2VyQ2FzZSgpPzE6Mil9KSxkLmF0dHJpYnV0ZXMmJmNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGlucHV0Lz4iLGUuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGZlKCJ2YWx1ZSIsZnVuY3Rpb24oZSx0LG4pe2lmKCFuJiYiaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiBlLmRlZmF1bHRWYWx1ZX0pLGNlKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxmZShSLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZighbilyZXR1cm4hMD09PWVbdF0/dC50b0xvd2VyQ2FzZSgpOihyPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6bnVsbH0pLHNlfShDKTtTLmZpbmQ9ZCxTLmV4cHI9ZC5zZWxlY3RvcnMsUy5leHByWyI6Il09Uy5leHByLnBzZXVkb3MsUy51bmlxdWVTb3J0PVMudW5pcXVlPWQudW5pcXVlU29ydCxTLnRleHQ9ZC5nZXRUZXh0LFMuaXNYTUxEb2M9ZC5pc1hNTCxTLmNvbnRhaW5zPWQuY29udGFpbnMsUy5lc2NhcGVTZWxlY3Rvcj1kLmVzY2FwZTt2YXIgaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9W10saT12b2lkIDAhPT1uO3doaWxlKChlPWVbdF0pJiY5IT09ZS5ub2RlVHlwZSlpZigxPT09ZS5ub2RlVHlwZSl7aWYoaSYmUyhlKS5pcyhuKSlicmVhaztyLnB1c2goZSl9cmV0dXJuIHJ9LFQ9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49W107ZTtlPWUubmV4dFNpYmxpbmcpMT09PWUubm9kZVR5cGUmJmUhPT10JiZuLnB1c2goZSk7cmV0dXJuIG59LGs9Uy5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtmdW5jdGlvbiBBKGUsdCl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX12YXIgTj0vXjwoW2Etel1bXlwvXDA+Olx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaTtmdW5jdGlvbiBEKGUsbixyKXtyZXR1cm4gbShuKT9TLmdyZXAoZSxmdW5jdGlvbihlLHQpe3JldHVybiEhbi5jYWxsKGUsdCxlKSE9PXJ9KTpuLm5vZGVUeXBlP1MuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09biE9PXJ9KToic3RyaW5nIiE9dHlwZW9mIG4/Uy5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuLTE8aS5jYWxsKG4sZSkhPT1yfSk6Uy5maWx0ZXIobixlLHIpfVMuZmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP1MuZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106Uy5maW5kLm1hdGNoZXMoZSxTLmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LFMuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxpPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayhTKGUpLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7dDxyO3QrKylpZihTLmNvbnRhaW5zKGlbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLHQ9MDt0PHI7dCsrKVMuZmluZChlLGlbdF0sbik7cmV0dXJuIDE8cj9TLnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhEKHRoaXMsZXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhEKHRoaXMsZXx8W10sITApKX0saXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFEKHRoaXMsInN0cmluZyI9PXR5cGVvZiBlJiZrLnRlc3QoZSk/UyhlKTplfHxbXSwhMSkubGVuZ3RofX0pO3ZhciBqLHE9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsoUy5mbi5pbml0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKCFlKXJldHVybiB0aGlzO2lmKG49bnx8aiwic3RyaW5nIj09dHlwZW9mIGUpe2lmKCEocj0iPCI9PT1lWzBdJiYiPiI9PT1lW2UubGVuZ3RoLTFdJiYzPD1lLmxlbmd0aD9bbnVsbCxlLG51bGxdOnEuZXhlYyhlKSl8fCFyWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoclsxXSl7aWYodD10IGluc3RhbmNlb2YgUz90WzBdOnQsUy5tZXJnZSh0aGlzLFMucGFyc2VIVE1MKHJbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6RSwhMCkpLE4udGVzdChyWzFdKSYmUy5pc1BsYWluT2JqZWN0KHQpKWZvcihyIGluIHQpbSh0aGlzW3JdKT90aGlzW3JdKHRbcl0pOnRoaXMuYXR0cihyLHRbcl0pO3JldHVybiB0aGlzfXJldHVybihpPUUuZ2V0RWxlbWVudEJ5SWQoclsyXSkpJiYodGhpc1swXT1pLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXMpOm0oZSk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KGUpOmUoUyk6Uy5tYWtlQXJyYXkoZSx0aGlzKX0pLnByb3RvdHlwZT1TLmZuLGo9UyhFKTt2YXIgTD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxIPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2Z1bmN0aW9uIE8oZSx0KXt3aGlsZSgoZT1lW3RdKSYmMSE9PWUubm9kZVR5cGUpO3JldHVybiBlfVMuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9UyhlLHRoaXMpLG49dC5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxuO2UrKylpZihTLmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT0ic3RyaW5nIiE9dHlwZW9mIGUmJlMoZSk7aWYoIWsudGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT8tMTxhLmluZGV4KG4pOjE9PT1uLm5vZGVUeXBlJiZTLmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtvLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKDE8by5sZW5ndGg/Uy51bmlxdWVTb3J0KG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/aS5jYWxsKFMoZSksdGhpc1swXSk6aS5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhTLnVuaXF1ZVNvcnQoUy5tZXJnZSh0aGlzLmdldCgpLFMoZSx0KSkpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSksUy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBoKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaChlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gTyhlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBPKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBoKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIGgoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGgoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBoKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBUKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gVChlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZS5jb250ZW50RG9jdW1lbnQmJnIoZS5jb250ZW50RG9jdW1lbnQpP2UuY29udGVudERvY3VtZW50OihBKGUsInRlbXBsYXRlIikmJihlPWUuY29udGVudHx8ZSksUy5tZXJnZShbXSxlLmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKHIsaSl7Uy5mbltyXT1mdW5jdGlvbihlLHQpe3ZhciBuPVMubWFwKHRoaXMsaSxlKTtyZXR1cm4iVW50aWwiIT09ci5zbGljZSgtNSkmJih0PWUpLHQmJiJzdHJpbmciPT10eXBlb2YgdCYmKG49Uy5maWx0ZXIodCxuKSksMTx0aGlzLmxlbmd0aCYmKEhbcl18fFMudW5pcXVlU29ydChuKSxMLnRlc3QocikmJm4ucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgUD0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIFIoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gTShlKXt0aHJvdyBlfWZ1bmN0aW9uIEkoZSx0LG4scil7dmFyIGk7dHJ5e2UmJm0oaT1lLnByb21pc2UpP2kuY2FsbChlKS5kb25lKHQpLmZhaWwobik6ZSYmbShpPWUudGhlbik/aS5jYWxsKGUsdCxuKTp0LmFwcGx5KHZvaWQgMCxbZV0uc2xpY2UocikpfWNhdGNoKGUpe24uYXBwbHkodm9pZCAwLFtlXSl9fVMuQ2FsbGJhY2tzPWZ1bmN0aW9uKHIpe3ZhciBlLG47cj0ic3RyaW5nIj09dHlwZW9mIHI/KGU9cixuPXt9LFMuZWFjaChlLm1hdGNoKFApfHxbXSxmdW5jdGlvbihlLHQpe25bdF09ITB9KSxuKTpTLmV4dGVuZCh7fSxyKTt2YXIgaSx0LG8sYSxzPVtdLHU9W10sbD0tMSxjPWZ1bmN0aW9uKCl7Zm9yKGE9YXx8ci5vbmNlLG89aT0hMDt1Lmxlbmd0aDtsPS0xKXt0PXUuc2hpZnQoKTt3aGlsZSgrK2w8cy5sZW5ndGgpITE9PT1zW2xdLmFwcGx5KHRbMF0sdFsxXSkmJnIuc3RvcE9uRmFsc2UmJihsPXMubGVuZ3RoLHQ9ITEpfXIubWVtb3J5fHwodD0hMSksaT0hMSxhJiYocz10P1tdOiIiKX0sZj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIHMmJih0JiYhaSYmKGw9cy5sZW5ndGgtMSx1LnB1c2godCkpLGZ1bmN0aW9uIG4oZSl7Uy5lYWNoKGUsZnVuY3Rpb24oZSx0KXttKHQpP3IudW5pcXVlJiZmLmhhcyh0KXx8cy5wdXNoKHQpOnQmJnQubGVuZ3RoJiYic3RyaW5nIiE9PXcodCkmJm4odCl9KX0oYXJndW1lbnRzKSx0JiYhaSYmYygpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gUy5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihlLHQpe3ZhciBuO3doaWxlKC0xPChuPVMuaW5BcnJheSh0LHMsbikpKXMuc3BsaWNlKG4sMSksbjw9bCYmbC0tfSksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiBlPy0xPFMuaW5BcnJheShlLHMpOjA8cy5sZW5ndGh9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHMmJihzPVtdKSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9dT1bXSxzPXQ9IiIsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hc30sbG9jazpmdW5jdGlvbigpe3JldHVybiBhPXU9W10sdHx8aXx8KHM9dD0iIiksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISFhfSxmaXJlV2l0aDpmdW5jdGlvbihlLHQpe3JldHVybiBhfHwodD1bZSwodD10fHxbXSkuc2xpY2U/dC5zbGljZSgpOnRdLHUucHVzaCh0KSxpfHxjKCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIW99fTtyZXR1cm4gZn0sUy5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGUpe3ZhciBvPVtbIm5vdGlmeSIsInByb2dyZXNzIixTLkNhbGxiYWNrcygibWVtb3J5IiksUy5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxpPSJwZW5kaW5nIixhPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBpfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gcy5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LCJjYXRjaCI6ZnVuY3Rpb24oZSl7cmV0dXJuIGEudGhlbihudWxsLGUpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzO3JldHVybiBTLkRlZmVycmVkKGZ1bmN0aW9uKHIpe1MuZWFjaChvLGZ1bmN0aW9uKGUsdCl7dmFyIG49bShpW3RbNF1dKSYmaVt0WzRdXTtzW3RbMV1dKGZ1bmN0aW9uKCl7dmFyIGU9biYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSYmbShlLnByb21pc2UpP2UucHJvbWlzZSgpLnByb2dyZXNzKHIubm90aWZ5KS5kb25lKHIucmVzb2x2ZSkuZmFpbChyLnJlamVjdCk6clt0WzBdKyJXaXRoIl0odGhpcyxuP1tlXTphcmd1bWVudHMpfSl9KSxpPW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24odCxuLHIpe3ZhciB1PTA7ZnVuY3Rpb24gbChpLG8sYSxzKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLHI9YXJndW1lbnRzLGU9ZnVuY3Rpb24oKXt2YXIgZSx0O2lmKCEoaTx1KSl7aWYoKGU9YS5hcHBseShuLHIpKT09PW8ucHJvbWlzZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvbiIpO3Q9ZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpJiZlLnRoZW4sbSh0KT9zP3QuY2FsbChlLGwodSxvLFIscyksbCh1LG8sTSxzKSk6KHUrKyx0LmNhbGwoZSxsKHUsbyxSLHMpLGwodSxvLE0scyksbCh1LG8sUixvLm5vdGlmeVdpdGgpKSk6KGEhPT1SJiYobj12b2lkIDAscj1bZV0pLChzfHxvLnJlc29sdmVXaXRoKShuLHIpKX19LHQ9cz9lOmZ1bmN0aW9uKCl7dHJ5e2UoKX1jYXRjaChlKXtTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJlMuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhlLHQuc3RhY2tUcmFjZSksdTw9aSsxJiYoYSE9PU0mJihuPXZvaWQgMCxyPVtlXSksby5yZWplY3RXaXRoKG4scikpfX07aT90KCk6KFMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYodC5zdGFja1RyYWNlPVMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLEMuc2V0VGltZW91dCh0KSl9fXJldHVybiBTLkRlZmVycmVkKGZ1bmN0aW9uKGUpe29bMF1bM10uYWRkKGwoMCxlLG0ocik/cjpSLGUubm90aWZ5V2l0aCkpLG9bMV1bM10uYWRkKGwoMCxlLG0odCk/dDpSKSksb1syXVszXS5hZGQobCgwLGUsbShuKT9uOk0pKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT9TLmV4dGVuZChlLGEpOmF9fSxzPXt9O3JldHVybiBTLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBuPXRbMl0scj10WzVdO2FbdFsxXV09bi5hZGQsciYmbi5hZGQoZnVuY3Rpb24oKXtpPXJ9LG9bMy1lXVsyXS5kaXNhYmxlLG9bMy1lXVszXS5kaXNhYmxlLG9bMF1bMl0ubG9jayxvWzBdWzNdLmxvY2spLG4uYWRkKHRbM10uZmlyZSksc1t0WzBdXT1mdW5jdGlvbigpe3JldHVybiBzW3RbMF0rIldpdGgiXSh0aGlzPT09cz92b2lkIDA6dGhpcyxhcmd1bWVudHMpLHRoaXN9LHNbdFswXSsiV2l0aCJdPW4uZmlyZVdpdGh9KSxhLnByb21pc2UocyksZSYmZS5jYWxsKHMscyksc30sd2hlbjpmdW5jdGlvbihlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHQ9bixyPUFycmF5KHQpLGk9cy5jYWxsKGFyZ3VtZW50cyksbz1TLkRlZmVycmVkKCksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7clt0XT10aGlzLGlbdF09MTxhcmd1bWVudHMubGVuZ3RoP3MuY2FsbChhcmd1bWVudHMpOmUsLS1ufHxvLnJlc29sdmVXaXRoKHIsaSl9fTtpZihuPD0xJiYoSShlLG8uZG9uZShhKHQpKS5yZXNvbHZlLG8ucmVqZWN0LCFuKSwicGVuZGluZyI9PT1vLnN0YXRlKCl8fG0oaVt0XSYmaVt0XS50aGVuKSkpcmV0dXJuIG8udGhlbigpO3doaWxlKHQtLSlJKGlbdF0sYSh0KSxvLnJlamVjdCk7cmV0dXJuIG8ucHJvbWlzZSgpfX0pO3ZhciBXPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1MuRGVmZXJyZWQuZXhjZXB0aW9uSG9vaz1mdW5jdGlvbihlLHQpe0MuY29uc29sZSYmQy5jb25zb2xlLndhcm4mJmUmJlcudGVzdChlLm5hbWUpJiZDLmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIitlLm1lc3NhZ2UsZS5zdGFjayx0KX0sUy5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbihlKXtDLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBlfSl9O3ZhciBGPVMuRGVmZXJyZWQoKTtmdW5jdGlvbiBCKCl7RS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCKSxDLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLEIpLFMucmVhZHkoKX1TLmZuLnJlYWR5PWZ1bmN0aW9uKGUpe3JldHVybiBGLnRoZW4oZSlbImNhdGNoIl0oZnVuY3Rpb24oZSl7Uy5yZWFkeUV4Y2VwdGlvbihlKX0pLHRoaXN9LFMuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKGUpeyghMD09PWU/LS1TLnJlYWR5V2FpdDpTLmlzUmVhZHkpfHwoUy5pc1JlYWR5PSEwKSE9PWUmJjA8LS1TLnJlYWR5V2FpdHx8Ri5yZXNvbHZlV2l0aChFLFtTXSl9fSksUy5yZWFkeS50aGVuPUYudGhlbiwiY29tcGxldGUiPT09RS5yZWFkeVN0YXRlfHwibG9hZGluZyIhPT1FLnJlYWR5U3RhdGUmJiFFLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9DLnNldFRpbWVvdXQoUy5yZWFkeSk6KEUuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiksQy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixCKSk7dmFyICQ9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSl7dmFyIHM9MCx1PWUubGVuZ3RoLGw9bnVsbD09bjtpZigib2JqZWN0Ij09PXcobikpZm9yKHMgaW4gaT0hMCxuKSQoZSx0LHMsbltzXSwhMCxvLGEpO2Vsc2UgaWYodm9pZCAwIT09ciYmKGk9ITAsbShyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbChTKGUpLG4pfSkpLHQpKWZvcig7czx1O3MrKyl0KGVbc10sbixhP3I6ci5jYWxsKGVbc10scyx0KGVbc10sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LF89L14tbXMtLyx6PS8tKFthLXpdKS9nO2Z1bmN0aW9uIFUoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIFgoZSl7cmV0dXJuIGUucmVwbGFjZShfLCJtcy0iKS5yZXBsYWNlKHosVSl9dmFyIFY9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBHKCl7dGhpcy5leHBhbmRvPVMuZXhwYW5kbytHLnVpZCsrfUcudWlkPTEsRy5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdHx8KHQ9e30sVihlKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXQ6T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdGhpcy5leHBhbmRvLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pKSksdH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPXRoaXMuY2FjaGUoZSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KWlbWCh0KV09bjtlbHNlIGZvcihyIGluIHQpaVtYKHIpXT10W3JdO3JldHVybiBpfSxnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmNhY2hlKGUpOmVbdGhpcy5leHBhbmRvXSYmZVt0aGlzLmV4cGFuZG9dW1godCldfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10fHx0JiYic3RyaW5nIj09dHlwZW9mIHQmJnZvaWQgMD09PW4/dGhpcy5nZXQoZSx0KToodGhpcy5zZXQoZSx0LG4pLHZvaWQgMCE9PW4/bjp0KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lW3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09dCl7bj0odD1BcnJheS5pc0FycmF5KHQpP3QubWFwKFgpOih0PVgodCkpaW4gcj9bdF06dC5tYXRjaChQKXx8W10pLmxlbmd0aDt3aGlsZShuLS0pZGVsZXRlIHJbdFtuXV19KHZvaWQgMD09PXR8fFMuaXNFbXB0eU9iamVjdChyKSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGVbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09dCYmIVMuaXNFbXB0eU9iamVjdCh0KX19O3ZhciBZPW5ldyBHLFE9bmV3IEcsSj0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLEs9L1tBLVpdL2c7ZnVuY3Rpb24gWihlLHQsbil7dmFyIHIsaTtpZih2b2lkIDA9PT1uJiYxPT09ZS5ub2RlVHlwZSlpZihyPSJkYXRhLSIrdC5yZXBsYWNlKEssIi0kJiIpLnRvTG93ZXJDYXNlKCksInN0cmluZyI9PXR5cGVvZihuPWUuZ2V0QXR0cmlidXRlKHIpKSl7dHJ5e249InRydWUiPT09KGk9bil8fCJmYWxzZSIhPT1pJiYoIm51bGwiPT09aT9udWxsOmk9PT0raSsiIj8raTpKLnRlc3QoaSk/SlNPTi5wYXJzZShpKTppKX1jYXRjaChlKXt9US5zZXQoZSx0LG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59Uy5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIFEuaGFzRGF0YShlKXx8WS5oYXNEYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gUS5hY2Nlc3MoZSx0LG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7US5yZW1vdmUoZSx0KX0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBZLmFjY2VzcyhlLHQsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7WS5yZW1vdmUoZSx0KX19KSxTLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihuLGUpe3ZhciB0LHIsaSxvPXRoaXNbMF0sYT1vJiZvLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09bil7aWYodGhpcy5sZW5ndGgmJihpPVEuZ2V0KG8pLDE9PT1vLm5vZGVUeXBlJiYhWS5nZXQobywiaGFzRGF0YUF0dHJzIikpKXt0PWEubGVuZ3RoO3doaWxlKHQtLSlhW3RdJiYwPT09KHI9YVt0XS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpJiYocj1YKHIuc2xpY2UoNSkpLFoobyxyLGlbcl0pKTtZLnNldChvLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gaX1yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIG4/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7US5zZXQodGhpcyxuKX0pOiQodGhpcyxmdW5jdGlvbihlKXt2YXIgdDtpZihvJiZ2b2lkIDA9PT1lKXJldHVybiB2b2lkIDAhPT0odD1RLmdldChvLG4pKT90OnZvaWQgMCE9PSh0PVoobyxuKSk/dDp2b2lkIDA7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7US5zZXQodGhpcyxuLGUpfSl9LG51bGwsZSwxPGFyZ3VtZW50cy5sZW5ndGgsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1EucmVtb3ZlKHRoaXMsZSl9KX19KSxTLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKGUpcmV0dXJuIHQ9KHR8fCJmeCIpKyJxdWV1ZSIscj1ZLmdldChlLHQpLG4mJighcnx8QXJyYXkuaXNBcnJheShuKT9yPVkuYWNjZXNzKGUsdCxTLm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXX0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ImZ4Ijt2YXIgbj1TLnF1ZXVlKGUsdCkscj1uLmxlbmd0aCxpPW4uc2hpZnQoKSxvPVMuX3F1ZXVlSG9va3MoZSx0KTsiaW5wcm9ncmVzcyI9PT1pJiYoaT1uLnNoaWZ0KCksci0tKSxpJiYoImZ4Ij09PXQmJm4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBvLnN0b3AsaS5jYWxsKGUsZnVuY3Rpb24oKXtTLmRlcXVldWUoZSx0KX0sbykpLCFyJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4gWS5nZXQoZSxuKXx8WS5hY2Nlc3MoZSxuLHtlbXB0eTpTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtZLnJlbW92ZShlLFt0KyJxdWV1ZSIsbl0pfSl9KX19KSxTLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24odCxuKXt2YXIgZT0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmKG49dCx0PSJmeCIsZS0tKSxhcmd1bWVudHMubGVuZ3RoPGU/Uy5xdWV1ZSh0aGlzWzBdLHQpOnZvaWQgMD09PW4/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1TLnF1ZXVlKHRoaXMsdCxuKTtTLl9xdWV1ZUhvb2tzKHRoaXMsdCksImZ4Ij09PXQmJiJpbnByb2dyZXNzIiE9PWVbMF0mJlMuZGVxdWV1ZSh0aGlzLHQpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZGVxdWV1ZSh0aGlzLGUpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTEsaT1TLkRlZmVycmVkKCksbz10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8aS5yZXNvbHZlV2l0aChvLFtvXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZT1lfHwiZngiO3doaWxlKGEtLSkobj1ZLmdldChvW2FdLGUrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksaS5wcm9taXNlKHQpfX0pO3ZhciBlZT0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSx0ZT1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrZWUrIikoW2EteiVdKikkIiwiaSIpLG5lPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0scmU9RS5kb2N1bWVudEVsZW1lbnQsaWU9ZnVuY3Rpb24oZSl7cmV0dXJuIFMuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfSxvZT17Y29tcG9zZWQ6ITB9O3JlLmdldFJvb3ROb2RlJiYoaWU9ZnVuY3Rpb24oZSl7cmV0dXJuIFMuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHxlLmdldFJvb3ROb2RlKG9lKT09PWUub3duZXJEb2N1bWVudH0pO3ZhciBhZT1mdW5jdGlvbihlLHQpe3JldHVybiJub25lIj09PShlPXR8fGUpLnN0eWxlLmRpc3BsYXl8fCIiPT09ZS5zdHlsZS5kaXNwbGF5JiZpZShlKSYmIm5vbmUiPT09Uy5jc3MoZSwiZGlzcGxheSIpfTtmdW5jdGlvbiBzZShlLHQsbixyKXt2YXIgaSxvLGE9MjAscz1yP2Z1bmN0aW9uKCl7cmV0dXJuIHIuY3VyKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIFMuY3NzKGUsdCwiIil9LHU9cygpLGw9biYmblszXXx8KFMuY3NzTnVtYmVyW3RdPyIiOiJweCIpLGM9ZS5ub2RlVHlwZSYmKFMuY3NzTnVtYmVyW3RdfHwicHgiIT09bCYmK3UpJiZ0ZS5leGVjKFMuY3NzKGUsdCkpO2lmKGMmJmNbM10hPT1sKXt1Lz0yLGw9bHx8Y1szXSxjPSt1fHwxO3doaWxlKGEtLSlTLnN0eWxlKGUsdCxjK2wpLCgxLW8pKigxLShvPXMoKS91fHwuNSkpPD0wJiYoYT0wKSxjLz1vO2MqPTIsUy5zdHlsZShlLHQsYytsKSxuPW58fFtdfXJldHVybiBuJiYoYz0rY3x8K3V8fDAsaT1uWzFdP2MrKG5bMV0rMSkqblsyXTorblsyXSxyJiYoci51bml0PWwsci5zdGFydD1jLHIuZW5kPWkpKSxpfXZhciB1ZT17fTtmdW5jdGlvbiBsZShlLHQpe2Zvcih2YXIgbixyLGksbyxhLHMsdSxsPVtdLGM9MCxmPWUubGVuZ3RoO2M8ZjtjKyspKHI9ZVtjXSkuc3R5bGUmJihuPXIuc3R5bGUuZGlzcGxheSx0Pygibm9uZSI9PT1uJiYobFtjXT1ZLmdldChyLCJkaXNwbGF5Iil8fG51bGwsbFtjXXx8KHIuc3R5bGUuZGlzcGxheT0iIikpLCIiPT09ci5zdHlsZS5kaXNwbGF5JiZhZShyKSYmKGxbY109KHU9YT1vPXZvaWQgMCxhPShpPXIpLm93bmVyRG9jdW1lbnQscz1pLm5vZGVOYW1lLCh1PXVlW3NdKXx8KG89YS5ib2R5LmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudChzKSksdT1TLmNzcyhvLCJkaXNwbGF5Iiksby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pLCJub25lIj09PXUmJih1PSJibG9jayIpLHVlW3NdPXUpKSkpOiJub25lIiE9PW4mJihsW2NdPSJub25lIixZLnNldChyLCJkaXNwbGF5IixuKSkpO2ZvcihjPTA7YzxmO2MrKyludWxsIT1sW2NdJiYoZVtjXS5zdHlsZS5kaXNwbGF5PWxbY10pO3JldHVybiBlfVMuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIGxlKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIGxlKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZT9lP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2FlKHRoaXMpP1ModGhpcykuc2hvdygpOlModGhpcykuaGlkZSgpfSl9fSk7dmFyIGNlLGZlLHBlPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLGRlPS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKS9pLGhlPS9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaTtjZT1FLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChFLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSwoZmU9RS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGZlLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxmZS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksY2UuYXBwZW5kQ2hpbGQoZmUpLHkuY2hlY2tDbG9uZT1jZS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsY2UuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+Iix5Lm5vQ2xvbmVDaGVja2VkPSEhY2UuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlLGNlLmlubmVySFRNTD0iPG9wdGlvbj48L29wdGlvbj4iLHkub3B0aW9uPSEhY2UubGFzdENoaWxkO3ZhciBnZT17dGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2Z1bmN0aW9uIHZlKGUsdCl7dmFyIG47cmV0dXJuIG49InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHx8IioiKToidW5kZWZpbmVkIiE9dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbD9lLnF1ZXJ5U2VsZWN0b3JBbGwodHx8IioiKTpbXSx2b2lkIDA9PT10fHx0JiZBKGUsdCk/Uy5tZXJnZShbZV0sbik6bn1mdW5jdGlvbiB5ZShlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylZLnNldChlW25dLCJnbG9iYWxFdmFsIiwhdHx8WS5nZXQodFtuXSwiZ2xvYmFsRXZhbCIpKX1nZS50Ym9keT1nZS50Zm9vdD1nZS5jb2xncm91cD1nZS5jYXB0aW9uPWdlLnRoZWFkLGdlLnRoPWdlLnRkLHkub3B0aW9ufHwoZ2Uub3B0Z3JvdXA9Z2Uub3B0aW9uPVsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0pO3ZhciBtZT0vPHwmIz9cdys7LztmdW5jdGlvbiB4ZShlLHQsbixyLGkpe2Zvcih2YXIgbyxhLHMsdSxsLGMsZj10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxwPVtdLGQ9MCxoPWUubGVuZ3RoO2Q8aDtkKyspaWYoKG89ZVtkXSl8fDA9PT1vKWlmKCJvYmplY3QiPT09dyhvKSlTLm1lcmdlKHAsby5ub2RlVHlwZT9bb106byk7ZWxzZSBpZihtZS50ZXN0KG8pKXthPWF8fGYuYXBwZW5kQ2hpbGQodC5jcmVhdGVFbGVtZW50KCJkaXYiKSkscz0oZGUuZXhlYyhvKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSx1PWdlW3NdfHxnZS5fZGVmYXVsdCxhLmlubmVySFRNTD11WzFdK1MuaHRtbFByZWZpbHRlcihvKSt1WzJdLGM9dVswXTt3aGlsZShjLS0pYT1hLmxhc3RDaGlsZDtTLm1lcmdlKHAsYS5jaGlsZE5vZGVzKSwoYT1mLmZpcnN0Q2hpbGQpLnRleHRDb250ZW50PSIifWVsc2UgcC5wdXNoKHQuY3JlYXRlVGV4dE5vZGUobykpO2YudGV4dENvbnRlbnQ9IiIsZD0wO3doaWxlKG89cFtkKytdKWlmKHImJi0xPFMuaW5BcnJheShvLHIpKWkmJmkucHVzaChvKTtlbHNlIGlmKGw9aWUobyksYT12ZShmLmFwcGVuZENoaWxkKG8pLCJzY3JpcHQiKSxsJiZ5ZShhKSxuKXtjPTA7d2hpbGUobz1hW2MrK10paGUudGVzdChvLnR5cGV8fCIiKSYmbi5wdXNoKG8pfXJldHVybiBmfXZhciBiZT0vXmtleS8sd2U9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLFRlPS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiBDZSgpe3JldHVybiEwfWZ1bmN0aW9uIEVlKCl7cmV0dXJuITF9ZnVuY3Rpb24gU2UoZSx0KXtyZXR1cm4gZT09PWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBFLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX0oKT09KCJmb2N1cyI9PT10KX1mdW5jdGlvbiBrZShlLHQsbixyLGksbyl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIHQpe2ZvcihzIGluInN0cmluZyIhPXR5cGVvZiBuJiYocj1yfHxuLG49dm9pZCAwKSx0KWtlKGUscyxuLHIsdFtzXSxvKTtyZXR1cm4gZX1pZihudWxsPT1yJiZudWxsPT1pPyhpPW4scj1uPXZvaWQgMCk6bnVsbD09aSYmKCJzdHJpbmciPT10eXBlb2Ygbj8oaT1yLHI9dm9pZCAwKTooaT1yLHI9bixuPXZvaWQgMCkpLCExPT09aSlpPUVlO2Vsc2UgaWYoIWkpcmV0dXJuIGU7cmV0dXJuIDE9PT1vJiYoYT1pLChpPWZ1bmN0aW9uKGUpe3JldHVybiBTKCkub2ZmKGUpLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSkuZ3VpZD1hLmd1aWR8fChhLmd1aWQ9Uy5ndWlkKyspKSxlLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LmFkZCh0aGlzLHQsaSxyLG4pfSl9ZnVuY3Rpb24gQWUoZSxpLG8pe28/KFkuc2V0KGUsaSwhMSksUy5ldmVudC5hZGQoZSxpLHtuYW1lc3BhY2U6ITEsaGFuZGxlcjpmdW5jdGlvbihlKXt2YXIgdCxuLHI9WS5nZXQodGhpcyxpKTtpZigxJmUuaXNUcmlnZ2VyJiZ0aGlzW2ldKXtpZihyLmxlbmd0aCkoUy5ldmVudC5zcGVjaWFsW2ldfHx7fSkuZGVsZWdhdGVUeXBlJiZlLnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYocj1zLmNhbGwoYXJndW1lbnRzKSxZLnNldCh0aGlzLGksciksdD1vKHRoaXMsaSksdGhpc1tpXSgpLHIhPT0obj1ZLmdldCh0aGlzLGkpKXx8dD9ZLnNldCh0aGlzLGksITEpOm49e30sciE9PW4pcmV0dXJuIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksZS5wcmV2ZW50RGVmYXVsdCgpLG4udmFsdWV9ZWxzZSByLmxlbmd0aCYmKFkuc2V0KHRoaXMsaSx7dmFsdWU6Uy5ldmVudC50cmlnZ2VyKFMuZXh0ZW5kKHJbMF0sUy5FdmVudC5wcm90b3R5cGUpLHIuc2xpY2UoMSksdGhpcyl9KSxlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpKX19KSk6dm9pZCAwPT09WS5nZXQoZSxpKSYmUy5ldmVudC5hZGQoZSxpLENlKX1TLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx2PVkuZ2V0KHQpO2lmKFYodCkpe24uaGFuZGxlciYmKG49KG89bikuaGFuZGxlcixpPW8uc2VsZWN0b3IpLGkmJlMuZmluZC5tYXRjaGVzU2VsZWN0b3IocmUsaSksbi5ndWlkfHwobi5ndWlkPVMuZ3VpZCsrKSwodT12LmV2ZW50cyl8fCh1PXYuZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCkpLChhPXYuaGFuZGxlKXx8KGE9di5oYW5kbGU9ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBTJiZTLmV2ZW50LnRyaWdnZXJlZCE9PWUudHlwZT9TLmV2ZW50LmRpc3BhdGNoLmFwcGx5KHQsYXJndW1lbnRzKTp2b2lkIDB9KSxsPShlPShlfHwiIikubWF0Y2goUCl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0pZD1nPShzPVRlLmV4ZWMoZVtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCYmKGY9Uy5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShpP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkLGY9Uy5ldmVudC5zcGVjaWFsW2RdfHx7fSxjPVMuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOmksbmVlZHNDb250ZXh0OmkmJlMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChpKSxuYW1lc3BhY2U6aC5qb2luKCIuIil9LG8pLChwPXVbZF0pfHwoKHA9dVtkXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKHQscixoLGEpfHx0LmFkZEV2ZW50TGlzdGVuZXImJnQuYWRkRXZlbnRMaXN0ZW5lcihkLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwodCxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLGk/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpwLnB1c2goYyksUy5ldmVudC5nbG9iYWxbZF09ITApfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx2PVkuaGFzRGF0YShlKSYmWS5nZXQoZSk7aWYodiYmKHU9di5ldmVudHMpKXtsPSh0PSh0fHwiIikubWF0Y2goUCl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0paWYoZD1nPShzPVRlLmV4ZWModFtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCl7Zj1TLmV2ZW50LnNwZWNpYWxbZF18fHt9LHA9dVtkPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9bz1wLmxlbmd0aDt3aGlsZShvLS0pYz1wW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxzJiYhcy50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJigiKioiIT09cnx8IWMuc2VsZWN0b3IpfHwocC5zcGxpY2UobywxKSxjLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbChlLGMpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbChlLGgsdi5oYW5kbGUpfHxTLnJlbW92ZUV2ZW50KGUsZCx2LmhhbmRsZSksZGVsZXRlIHVbZF0pfWVsc2UgZm9yKGQgaW4gdSlTLmV2ZW50LnJlbW92ZShlLGQrdFtsXSxuLHIsITApO1MuaXNFbXB0eU9iamVjdCh1KSYmWS5yZW1vdmUoZSwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHM9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLHU9Uy5ldmVudC5maXgoZSksbD0oWS5nZXQodGhpcywiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW3UudHlwZV18fFtdLGM9Uy5ldmVudC5zcGVjaWFsW3UudHlwZV18fHt9O2ZvcihzWzBdPXUsdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspc1t0XT1hcmd1bWVudHNbdF07aWYodS5kZWxlZ2F0ZVRhcmdldD10aGlzLCFjLnByZURpc3BhdGNofHwhMSE9PWMucHJlRGlzcGF0Y2guY2FsbCh0aGlzLHUpKXthPVMuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLHUsbCksdD0wO3doaWxlKChpPWFbdCsrXSkmJiF1LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe3UuY3VycmVudFRhcmdldD1pLmVsZW0sbj0wO3doaWxlKChvPWkuaGFuZGxlcnNbbisrXSkmJiF1LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpdS5ybmFtZXNwYWNlJiYhMSE9PW8ubmFtZXNwYWNlJiYhdS5ybmFtZXNwYWNlLnRlc3Qoby5uYW1lc3BhY2UpfHwodS5oYW5kbGVPYmo9byx1LmRhdGE9by5kYXRhLHZvaWQgMCE9PShyPSgoUy5ldmVudC5zcGVjaWFsW28ub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxvLmhhbmRsZXIpLmFwcGx5KGkuZWxlbSxzKSkmJiExPT09KHUucmVzdWx0PXIpJiYodS5wcmV2ZW50RGVmYXVsdCgpLHUuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gYy5wb3N0RGlzcGF0Y2gmJmMucG9zdERpc3BhdGNoLmNhbGwodGhpcyx1KSx1LnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzPVtdLHU9dC5kZWxlZ2F0ZUNvdW50LGw9ZS50YXJnZXQ7aWYodSYmbC5ub2RlVHlwZSYmISgiY2xpY2siPT09ZS50eXBlJiYxPD1lLmJ1dHRvbikpZm9yKDtsIT09dGhpcztsPWwucGFyZW50Tm9kZXx8dGhpcylpZigxPT09bC5ub2RlVHlwZSYmKCJjbGljayIhPT1lLnR5cGV8fCEwIT09bC5kaXNhYmxlZCkpe2ZvcihvPVtdLGE9e30sbj0wO248dTtuKyspdm9pZCAwPT09YVtpPShyPXRbbl0pLnNlbGVjdG9yKyIgIl0mJihhW2ldPXIubmVlZHNDb250ZXh0Py0xPFMoaSx0aGlzKS5pbmRleChsKTpTLmZpbmQoaSx0aGlzLG51bGwsW2xdKS5sZW5ndGgpLGFbaV0mJm8ucHVzaChyKTtvLmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6b30pfXJldHVybiBsPXRoaXMsdTx0Lmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6dC5zbGljZSh1KX0pLHN9LGFkZFByb3A6ZnVuY3Rpb24odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoUy5FdmVudC5wcm90b3R5cGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0Om0oZSk/ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIGUodGhpcy5vcmlnaW5hbEV2ZW50KX06ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFt0XX0sc2V0OmZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KX19KX0sZml4OmZ1bmN0aW9uKGUpe3JldHVybiBlW1MuZXhwYW5kb10/ZTpuZXcgUy5FdmVudChlKX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGNsaWNrOntzZXR1cDpmdW5jdGlvbihlKXt2YXIgdD10aGlzfHxlO3JldHVybiBwZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJkEodCwiaW5wdXQiKSYmQWUodCwiY2xpY2siLENlKSwhMX0sdHJpZ2dlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzfHxlO3JldHVybiBwZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJkEodCwiaW5wdXQiKSYmQWUodCwiY2xpY2siKSwhMH0sX2RlZmF1bHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQ7cmV0dXJuIHBlLnRlc3QodC50eXBlKSYmdC5jbGljayYmQSh0LCJpbnB1dCIpJiZZLmdldCh0LCJjbGljayIpfHxBKHQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUucmVzdWx0JiZlLm9yaWdpbmFsRXZlbnQmJihlLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZS5yZXN1bHQpfX19fSxTLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUsdCxuKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXImJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4pfSxTLkV2ZW50PWZ1bmN0aW9uKGUsdCl7aWYoISh0aGlzIGluc3RhbmNlb2YgUy5FdmVudCkpcmV0dXJuIG5ldyBTLkV2ZW50KGUsdCk7ZSYmZS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9ZSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWUuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09ZS5kZWZhdWx0UHJldmVudGVkJiYhMT09PWUucmV0dXJuVmFsdWU/Q2U6RWUsdGhpcy50YXJnZXQ9ZS50YXJnZXQmJjM9PT1lLnRhcmdldC5ub2RlVHlwZT9lLnRhcmdldC5wYXJlbnROb2RlOmUudGFyZ2V0LHRoaXMuY3VycmVudFRhcmdldD1lLmN1cnJlbnRUYXJnZXQsdGhpcy5yZWxhdGVkVGFyZ2V0PWUucmVsYXRlZFRhcmdldCk6dGhpcy50eXBlPWUsdCYmUy5leHRlbmQodGhpcyx0KSx0aGlzLnRpbWVTdGFtcD1lJiZlLnRpbWVTdGFtcHx8RGF0ZS5ub3coKSx0aGlzW1MuZXhwYW5kb109ITB9LFMuRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpTLkV2ZW50LGlzRGVmYXVsdFByZXZlbnRlZDpFZSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpFZSxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpFZSxpc1NpbXVsYXRlZDohMSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1DZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1DZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9Q2UsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LFMuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCwiY2hhciI6ITAsY29kZTohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbihlKXt2YXIgdD1lLmJ1dHRvbjtyZXR1cm4gbnVsbD09ZS53aGljaCYmYmUudGVzdChlLnR5cGUpP251bGwhPWUuY2hhckNvZGU/ZS5jaGFyQ29kZTplLmtleUNvZGU6IWUud2hpY2gmJnZvaWQgMCE9PXQmJndlLnRlc3QoZS50eXBlKT8xJnQ/MToyJnQ/Mzo0JnQ/MjowOmUud2hpY2h9fSxTLmV2ZW50LmFkZFByb3ApLFMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXtTLmV2ZW50LnNwZWNpYWxbZV09e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIEFlKHRoaXMsZSxTZSksITF9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gQWUodGhpcyxlKSwhMH0sZGVsZWdhdGVUeXBlOnR9fSksUy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLGkpe1MuZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOmksYmluZFR5cGU6aSxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLnJlbGF0ZWRUYXJnZXQscj1lLmhhbmRsZU9iajtyZXR1cm4gbiYmKG49PT10aGlzfHxTLmNvbnRhaW5zKHRoaXMsbikpfHwoZS50eXBlPXIub3JpZ1R5cGUsdD1yLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT1pKSx0fX19KSxTLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGtlKHRoaXMsZSx0LG4scil9LG9uZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4ga2UodGhpcyxlLHQsbixyLDEpfSxvZmY6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7aWYoZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5oYW5kbGVPYmopcmV0dXJuIHI9ZS5oYW5kbGVPYmosUyhlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2U/ci5vcmlnVHlwZSsiLiIrci5uYW1lc3BhY2U6ci5vcmlnVHlwZSxyLnNlbGVjdG9yLHIuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIGUpe2ZvcihpIGluIGUpdGhpcy5vZmYoaSx0LGVbaV0pO3JldHVybiB0aGlzfXJldHVybiExIT09dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHR8fChuPXQsdD12b2lkIDApLCExPT09biYmKG49RWUpLHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQucmVtb3ZlKHRoaXMsZSxuLHQpfSl9fSk7dmFyIE5lPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLERlPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGplPS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZztmdW5jdGlvbiBxZShlLHQpe3JldHVybiBBKGUsInRhYmxlIikmJkEoMTEhPT10Lm5vZGVUeXBlP3Q6dC5maXJzdENoaWxkLCJ0ciIpJiZTKGUpLmNoaWxkcmVuKCJ0Ym9keSIpWzBdfHxlfWZ1bmN0aW9uIExlKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gSGUoZSl7cmV0dXJuInRydWUvIj09PShlLnR5cGV8fCIiKS5zbGljZSgwLDUpP2UudHlwZT1lLnR5cGUuc2xpY2UoNSk6ZS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxlfWZ1bmN0aW9uIE9lKGUsdCl7dmFyIG4scixpLG8sYSxzO2lmKDE9PT10Lm5vZGVUeXBlKXtpZihZLmhhc0RhdGEoZSkmJihzPVkuZ2V0KGUpLmV2ZW50cykpZm9yKGkgaW4gWS5yZW1vdmUodCwiaGFuZGxlIGV2ZW50cyIpLHMpZm9yKG49MCxyPXNbaV0ubGVuZ3RoO248cjtuKyspUy5ldmVudC5hZGQodCxpLHNbaV1bbl0pO1EuaGFzRGF0YShlKSYmKG89US5hY2Nlc3MoZSksYT1TLmV4dGVuZCh7fSxvKSxRLnNldCh0LGEpKX19ZnVuY3Rpb24gUGUobixyLGksbyl7cj1nKHIpO3ZhciBlLHQsYSxzLHUsbCxjPTAsZj1uLmxlbmd0aCxwPWYtMSxkPXJbMF0saD1tKGQpO2lmKGh8fDE8ZiYmInN0cmluZyI9PXR5cGVvZiBkJiYheS5jaGVja0Nsb25lJiZEZS50ZXN0KGQpKXJldHVybiBuLmVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bi5lcShlKTtoJiYoclswXT1kLmNhbGwodGhpcyxlLHQuaHRtbCgpKSksUGUodCxyLGksbyl9KTtpZihmJiYodD0oZT14ZShyLG5bMF0ub3duZXJEb2N1bWVudCwhMSxuLG8pKS5maXJzdENoaWxkLDE9PT1lLmNoaWxkTm9kZXMubGVuZ3RoJiYoZT10KSx0fHxvKSl7Zm9yKHM9KGE9Uy5tYXAodmUoZSwic2NyaXB0IiksTGUpKS5sZW5ndGg7YzxmO2MrKyl1PWUsYyE9PXAmJih1PVMuY2xvbmUodSwhMCwhMCkscyYmUy5tZXJnZShhLHZlKHUsInNjcmlwdCIpKSksaS5jYWxsKG5bY10sdSxjKTtpZihzKWZvcihsPWFbYS5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxTLm1hcChhLEhlKSxjPTA7YzxzO2MrKyl1PWFbY10saGUudGVzdCh1LnR5cGV8fCIiKSYmIVkuYWNjZXNzKHUsImdsb2JhbEV2YWwiKSYmUy5jb250YWlucyhsLHUpJiYodS5zcmMmJiJtb2R1bGUiIT09KHUudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/Uy5fZXZhbFVybCYmIXUubm9Nb2R1bGUmJlMuX2V2YWxVcmwodS5zcmMse25vbmNlOnUubm9uY2V8fHUuZ2V0QXR0cmlidXRlKCJub25jZSIpfSxsKTpiKHUudGV4dENvbnRlbnQucmVwbGFjZShqZSwiIiksdSxsKSl9cmV0dXJuIG59ZnVuY3Rpb24gUmUoZSx0LG4pe2Zvcih2YXIgcixpPXQ/Uy5maWx0ZXIodCxlKTplLG89MDtudWxsIT0ocj1pW29dKTtvKyspbnx8MSE9PXIubm9kZVR5cGV8fFMuY2xlYW5EYXRhKHZlKHIpKSxyLnBhcmVudE5vZGUmJihuJiZpZShyKSYmeWUodmUociwic2NyaXB0IikpLHIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKSk7cmV0dXJuIGV9Uy5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LGNsb25lOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjPWUuY2xvbmVOb2RlKCEwKSxmPWllKGUpO2lmKCEoeS5ub0Nsb25lQ2hlY2tlZHx8MSE9PWUubm9kZVR5cGUmJjExIT09ZS5ub2RlVHlwZXx8Uy5pc1hNTERvYyhlKSkpZm9yKGE9dmUoYykscj0wLGk9KG89dmUoZSkpLmxlbmd0aDtyPGk7cisrKXM9b1tyXSx1PWFbcl0sdm9pZCAwLCJpbnB1dCI9PT0obD11Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpJiZwZS50ZXN0KHMudHlwZSk/dS5jaGVja2VkPXMuY2hlY2tlZDoiaW5wdXQiIT09bCYmInRleHRhcmVhIiE9PWx8fCh1LmRlZmF1bHRWYWx1ZT1zLmRlZmF1bHRWYWx1ZSk7aWYodClpZihuKWZvcihvPW98fHZlKGUpLGE9YXx8dmUoYykscj0wLGk9by5sZW5ndGg7cjxpO3IrKylPZShvW3JdLGFbcl0pO2Vsc2UgT2UoZSxjKTtyZXR1cm4gMDwoYT12ZShjLCJzY3JpcHQiKSkubGVuZ3RoJiZ5ZShhLCFmJiZ2ZShlLCJzY3JpcHQiKSksY30sY2xlYW5EYXRhOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHIsaT1TLmV2ZW50LnNwZWNpYWwsbz0wO3ZvaWQgMCE9PShuPWVbb10pO28rKylpZihWKG4pKXtpZih0PW5bWS5leHBhbmRvXSl7aWYodC5ldmVudHMpZm9yKHIgaW4gdC5ldmVudHMpaVtyXT9TLmV2ZW50LnJlbW92ZShuLHIpOlMucmVtb3ZlRXZlbnQobixyLHQuaGFuZGxlKTtuW1kuZXhwYW5kb109dm9pZCAwfW5bUS5leHBhbmRvXSYmKG5bUS5leHBhbmRvXT12b2lkIDApfX19KSxTLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiBSZSh0aGlzLGUsITApfSxyZW1vdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIFJlKHRoaXMsZSl9LHRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT9TLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gUGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fHFlKHRoaXMsZSkuYXBwZW5kQ2hpbGQoZSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBQZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9cWUodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBQZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBQZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PTA7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYoUy5jbGVhbkRhdGEodmUoZSwhMSkpLGUudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWUmJmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBTLmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09ZSYmMT09PXQubm9kZVR5cGUpcmV0dXJuIHQuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmIU5lLnRlc3QoZSkmJiFnZVsoZGUuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9Uy5odG1sUHJlZmlsdGVyKGUpO3RyeXtmb3IoO248cjtuKyspMT09PSh0PXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKHZlKHQsITEpKSx0LmlubmVySFRNTD1lKTt0PTB9Y2F0Y2goZSl7fX10JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIG49W107cmV0dXJuIFBlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTtTLmluQXJyYXkodGhpcyxuKTwwJiYoUy5jbGVhbkRhdGEodmUodGhpcykpLHQmJnQucmVwbGFjZUNoaWxkKGUsdGhpcykpfSxuKX19KSxTLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLGEpe1MuZm5bZV09ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49W10scj1TKGUpLGk9ci5sZW5ndGgtMSxvPTA7bzw9aTtvKyspdD1vPT09aT90aGlzOnRoaXMuY2xvbmUoITApLFMocltvXSlbYV0odCksdS5hcHBseShuLHQuZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgTWU9bmV3IFJlZ0V4cCgiXigiK2VlKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksSWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiB0JiZ0Lm9wZW5lcnx8KHQ9QyksdC5nZXRDb21wdXRlZFN0eWxlKGUpfSxXZT1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXt9O2ZvcihpIGluIHQpb1tpXT1lLnN0eWxlW2ldLGUuc3R5bGVbaV09dFtpXTtmb3IoaSBpbiByPW4uY2FsbChlKSx0KWUuc3R5bGVbaV09b1tpXTtyZXR1cm4gcn0sRmU9bmV3IFJlZ0V4cChuZS5qb2luKCJ8IiksImkiKTtmdW5jdGlvbiBCZShlLHQsbil7dmFyIHIsaSxvLGEscz1lLnN0eWxlO3JldHVybihuPW58fEllKGUpKSYmKCIiIT09KGE9bi5nZXRQcm9wZXJ0eVZhbHVlKHQpfHxuW3RdKXx8aWUoZSl8fChhPVMuc3R5bGUoZSx0KSksIXkucGl4ZWxCb3hTdHlsZXMoKSYmTWUudGVzdChhKSYmRmUudGVzdCh0KSYmKHI9cy53aWR0aCxpPXMubWluV2lkdGgsbz1zLm1heFdpZHRoLHMubWluV2lkdGg9cy5tYXhXaWR0aD1zLndpZHRoPWEsYT1uLndpZHRoLHMud2lkdGg9cixzLm1pbldpZHRoPWkscy5tYXhXaWR0aD1vKSksdm9pZCAwIT09YT9hKyIiOmF9ZnVuY3Rpb24gJGUoZSx0KXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7aWYoIWUoKSlyZXR1cm4odGhpcy5nZXQ9dCkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2RlbGV0ZSB0aGlzLmdldH19fSFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtpZihsKXt1LnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGwuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIscmUuYXBwZW5kQ2hpbGQodSkuYXBwZW5kQ2hpbGQobCk7dmFyIGU9Qy5nZXRDb21wdXRlZFN0eWxlKGwpO249IjElIiE9PWUudG9wLHM9MTI9PT10KGUubWFyZ2luTGVmdCksbC5zdHlsZS5yaWdodD0iNjAlIixvPTM2PT09dChlLnJpZ2h0KSxyPTM2PT09dChlLndpZHRoKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaT0xMj09PXQobC5vZmZzZXRXaWR0aC8zKSxyZS5yZW1vdmVDaGlsZCh1KSxsPW51bGx9fWZ1bmN0aW9uIHQoZSl7cmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdChlKSl9dmFyIG4scixpLG8sYSxzLHU9RS5jcmVhdGVFbGVtZW50KCJkaXYiKSxsPUUuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5zdHlsZSYmKGwuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixsLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIseS5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWwuc3R5bGUuYmFja2dyb3VuZENsaXAsUy5leHRlbmQoeSx7Ym94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLHJ9LHBpeGVsQm94U3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxvfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxufSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLHN9LHNjcm9sbGJveFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLGl9LHJlbGlhYmxlVHJEaW1lbnNpb25zOmZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI7cmV0dXJuIG51bGw9PWEmJihlPUUuY3JlYXRlRWxlbWVudCgidGFibGUiKSx0PUUuY3JlYXRlRWxlbWVudCgidHIiKSxuPUUuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4Iix0LnN0eWxlLmhlaWdodD0iMXB4IixuLnN0eWxlLmhlaWdodD0iOXB4IixyZS5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZCh0KS5hcHBlbmRDaGlsZChuKSxyPUMuZ2V0Q29tcHV0ZWRTdHlsZSh0KSxhPTM8cGFyc2VJbnQoci5oZWlnaHQpLHJlLnJlbW92ZUNoaWxkKGUpKSxhfX0pKX0oKTt2YXIgX2U9WyJXZWJraXQiLCJNb3oiLCJtcyJdLHplPUUuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsVWU9e307ZnVuY3Rpb24gWGUoZSl7dmFyIHQ9Uy5jc3NQcm9wc1tlXXx8VWVbZV07cmV0dXJuIHR8fChlIGluIHplP2U6VWVbZV09ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksbj1fZS5sZW5ndGg7d2hpbGUobi0tKWlmKChlPV9lW25dK3QpaW4gemUpcmV0dXJuIGV9KGUpfHxlKX12YXIgVmU9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLEdlPS9eLS0vLFllPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxRZT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn07ZnVuY3Rpb24gSmUoZSx0LG4pe3ZhciByPXRlLmV4ZWModCk7cmV0dXJuIHI/TWF0aC5tYXgoMCxyWzJdLShufHwwKSkrKHJbM118fCJweCIpOnR9ZnVuY3Rpb24gS2UoZSx0LG4scixpLG8pe3ZhciBhPSJ3aWR0aCI9PT10PzE6MCxzPTAsdT0wO2lmKG49PT0ocj8iYm9yZGVyIjoiY29udGVudCIpKXJldHVybiAwO2Zvcig7YTw0O2ErPTIpIm1hcmdpbiI9PT1uJiYodSs9Uy5jc3MoZSxuK25lW2FdLCEwLGkpKSxyPygiY29udGVudCI9PT1uJiYodS09Uy5jc3MoZSwicGFkZGluZyIrbmVbYV0sITAsaSkpLCJtYXJnaW4iIT09biYmKHUtPVMuY3NzKGUsImJvcmRlciIrbmVbYV0rIldpZHRoIiwhMCxpKSkpOih1Kz1TLmNzcyhlLCJwYWRkaW5nIituZVthXSwhMCxpKSwicGFkZGluZyIhPT1uP3UrPVMuY3NzKGUsImJvcmRlciIrbmVbYV0rIldpZHRoIiwhMCxpKTpzKz1TLmNzcyhlLCJib3JkZXIiK25lW2FdKyJXaWR0aCIsITAsaSkpO3JldHVybiFyJiYwPD1vJiYodSs9TWF0aC5tYXgoMCxNYXRoLmNlaWwoZVsib2Zmc2V0Iit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0tby11LXMtLjUpKXx8MCksdX1mdW5jdGlvbiBaZShlLHQsbil7dmFyIHI9SWUoZSksaT0oIXkuYm94U2l6aW5nUmVsaWFibGUoKXx8bikmJiJib3JkZXItYm94Ij09PVMuY3NzKGUsImJveFNpemluZyIsITEsciksbz1pLGE9QmUoZSx0LHIpLHM9Im9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSk7aWYoTWUudGVzdChhKSl7aWYoIW4pcmV0dXJuIGE7YT0iYXV0byJ9cmV0dXJuKCF5LmJveFNpemluZ1JlbGlhYmxlKCkmJml8fCF5LnJlbGlhYmxlVHJEaW1lbnNpb25zKCkmJkEoZSwidHIiKXx8ImF1dG8iPT09YXx8IXBhcnNlRmxvYXQoYSkmJiJpbmxpbmUiPT09Uy5jc3MoZSwiZGlzcGxheSIsITEscikpJiZlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiYoaT0iYm9yZGVyLWJveCI9PT1TLmNzcyhlLCJib3hTaXppbmciLCExLHIpLChvPXMgaW4gZSkmJihhPWVbc10pKSwoYT1wYXJzZUZsb2F0KGEpfHwwKStLZShlLHQsbnx8KGk/ImJvcmRlciI6ImNvbnRlbnQiKSxvLHIsYSkrInB4In1mdW5jdGlvbiBldChlLHQsbixyLGkpe3JldHVybiBuZXcgZXQucHJvdG90eXBlLmluaXQoZSx0LG4scixpKX1TLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPUJlKGUsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGdyaWRBcmVhOiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTdGFydDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUmJjMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmZS5zdHlsZSl7dmFyIGksbyxhLHM9WCh0KSx1PUdlLnRlc3QodCksbD1lLnN0eWxlO2lmKHV8fCh0PVhlKHMpKSxhPVMuY3NzSG9va3NbdF18fFMuY3NzSG9va3Nbc10sdm9pZCAwPT09bilyZXR1cm4gYSYmImdldCJpbiBhJiZ2b2lkIDAhPT0oaT1hLmdldChlLCExLHIpKT9pOmxbdF07InN0cmluZyI9PT0obz10eXBlb2YgbikmJihpPXRlLmV4ZWMobikpJiZpWzFdJiYobj1zZShlLHQsaSksbz0ibnVtYmVyIiksbnVsbCE9biYmbj09biYmKCJudW1iZXIiIT09b3x8dXx8KG4rPWkmJmlbM118fChTLmNzc051bWJlcltzXT8iIjoicHgiKSkseS5jbGVhckNsb25lU3R5bGV8fCIiIT09bnx8MCE9PXQuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwobFt0XT0iaW5oZXJpdCIpLGEmJiJzZXQiaW4gYSYmdm9pZCAwPT09KG49YS5zZXQoZSxuLHIpKXx8KHU/bC5zZXRQcm9wZXJ0eSh0LG4pOmxbdF09bikpfX0sY3NzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzPVgodCk7cmV0dXJuIEdlLnRlc3QodCl8fCh0PVhlKHMpKSwoYT1TLmNzc0hvb2tzW3RdfHxTLmNzc0hvb2tzW3NdKSYmImdldCJpbiBhJiYoaT1hLmdldChlLCEwLG4pKSx2b2lkIDA9PT1pJiYoaT1CZShlLHQscikpLCJub3JtYWwiPT09aSYmdCBpbiBRZSYmKGk9UWVbdF0pLCIiPT09bnx8bj8obz1wYXJzZUZsb2F0KGkpLCEwPT09bnx8aXNGaW5pdGUobyk/b3x8MDppKTppfX0pLFMuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oZSx1KXtTLmNzc0hvb2tzW3VdPXtnZXQ6ZnVuY3Rpb24oZSx0LG4pe2lmKHQpcmV0dXJuIVZlLnRlc3QoUy5jc3MoZSwiZGlzcGxheSIpKXx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aD9aZShlLHUsbik6V2UoZSxZZSxmdW5jdGlvbigpe3JldHVybiBaZShlLHUsbil9KX0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPUllKGUpLG89IXkuc2Nyb2xsYm94U2l6ZSgpJiYiYWJzb2x1dGUiPT09aS5wb3NpdGlvbixhPShvfHxuKSYmImJvcmRlci1ib3giPT09Uy5jc3MoZSwiYm94U2l6aW5nIiwhMSxpKSxzPW4/S2UoZSx1LG4sYSxpKTowO3JldHVybiBhJiZvJiYocy09TWF0aC5jZWlsKGVbIm9mZnNldCIrdVswXS50b1VwcGVyQ2FzZSgpK3Uuc2xpY2UoMSldLXBhcnNlRmxvYXQoaVt1XSktS2UoZSx1LCJib3JkZXIiLCExLGkpLS41KSkscyYmKHI9dGUuZXhlYyh0KSkmJiJweCIhPT0oclszXXx8InB4IikmJihlLnN0eWxlW3VdPXQsdD1TLmNzcyhlLHUpKSxKZSgwLHQscyl9fX0pLFMuY3NzSG9va3MubWFyZ2luTGVmdD0kZSh5LnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuKHBhcnNlRmxvYXQoQmUoZSwibWFyZ2luTGVmdCIpKXx8ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LVdlKGUse21hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSkpKyJweCJ9KSxTLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihpLG8pe1MuY3NzSG9va3NbaStvXT17ZXhwYW5kOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49e30scj0ic3RyaW5nIj09dHlwZW9mIGU/ZS5zcGxpdCgiICIpOltlXTt0PDQ7dCsrKW5baStuZVt0XStvXT1yW3RdfHxyW3QtMl18fHJbMF07cmV0dXJuIG59fSwibWFyZ2luIiE9PWkmJihTLmNzc0hvb2tzW2krb10uc2V0PUplKX0pLFMuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89e30sYT0wO2lmKEFycmF5LmlzQXJyYXkodCkpe2ZvcihyPUllKGUpLGk9dC5sZW5ndGg7YTxpO2ErKylvW3RbYV1dPVMuY3NzKGUsdFthXSwhMSxyKTtyZXR1cm4gb31yZXR1cm4gdm9pZCAwIT09bj9TLnN0eWxlKGUsdCxuKTpTLmNzcyhlLHQpfSxlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX19KSwoKFMuVHdlZW49ZXQpLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZXQsaW5pdDpmdW5jdGlvbihlLHQsbixyLGksbyl7dGhpcy5lbGVtPWUsdGhpcy5wcm9wPW4sdGhpcy5lYXNpbmc9aXx8Uy5lYXNpbmcuX2RlZmF1bHQsdGhpcy5vcHRpb25zPXQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PW98fChTLmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGU9ZXQucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGUmJmUuZ2V0P2UuZ2V0KHRoaXMpOmV0LnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihlKXt2YXIgdCxuPWV0LnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9dD1TLmVhc2luZ1t0aGlzLmVhc2luZ10oZSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qZSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz10PWUsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKnQrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksbiYmbi5zZXQ/bi5zZXQodGhpcyk6ZXQucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0pLmluaXQucHJvdG90eXBlPWV0LnByb3RvdHlwZSwoZXQucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiAxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsIT1lLmVsZW1bZS5wcm9wXSYmbnVsbD09ZS5lbGVtLnN0eWxlW2UucHJvcF0/ZS5lbGVtW2UucHJvcF06KHQ9Uy5jc3MoZS5lbGVtLGUucHJvcCwiIikpJiYiYXV0byIhPT10P3Q6MH0sc2V0OmZ1bmN0aW9uKGUpe1MuZnguc3RlcFtlLnByb3BdP1MuZnguc3RlcFtlLnByb3BdKGUpOjEhPT1lLmVsZW0ubm9kZVR5cGV8fCFTLmNzc0hvb2tzW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtYZShlLnByb3ApXT9lLmVsZW1bZS5wcm9wXT1lLm5vdzpTLnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KX19fSkuc2Nyb2xsVG9wPWV0LnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LFMuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sUy5meD1ldC5wcm90b3R5cGUuaW5pdCxTLmZ4LnN0ZXA9e307dmFyIHR0LG50LHJ0LGl0LG90PS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxhdD0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIHN0KCl7bnQmJighMT09PUUuaGlkZGVuJiZDLnJlcXVlc3RBbmltYXRpb25GcmFtZT9DLnJlcXVlc3RBbmltYXRpb25GcmFtZShzdCk6Qy5zZXRUaW1lb3V0KHN0LFMuZnguaW50ZXJ2YWwpLFMuZngudGljaygpKX1mdW5jdGlvbiB1dCgpe3JldHVybiBDLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0dD12b2lkIDB9KSx0dD1EYXRlLm5vdygpfWZ1bmN0aW9uIGx0KGUsdCl7dmFyIG4scj0wLGk9e2hlaWdodDplfTtmb3IodD10PzE6MDtyPDQ7cis9Mi10KWlbIm1hcmdpbiIrKG49bmVbcl0pXT1pWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoaS5vcGFjaXR5PWkud2lkdGg9ZSksaX1mdW5jdGlvbiBjdChlLHQsbil7Zm9yKHZhciByLGk9KGZ0LnR3ZWVuZXJzW3RdfHxbXSkuY29uY2F0KGZ0LnR3ZWVuZXJzWyIqIl0pLG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIGZ0KG8sZSx0KXt2YXIgbixhLHI9MCxpPWZ0LnByZWZpbHRlcnMubGVuZ3RoLHM9Uy5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSB1LmVsZW19KSx1PWZ1bmN0aW9uKCl7aWYoYSlyZXR1cm4hMTtmb3IodmFyIGU9dHR8fHV0KCksdD1NYXRoLm1heCgwLGwuc3RhcnRUaW1lK2wuZHVyYXRpb24tZSksbj0xLSh0L2wuZHVyYXRpb258fDApLHI9MCxpPWwudHdlZW5zLmxlbmd0aDtyPGk7cisrKWwudHdlZW5zW3JdLnJ1bihuKTtyZXR1cm4gcy5ub3RpZnlXaXRoKG8sW2wsbix0XSksbjwxJiZpP3Q6KGl8fHMubm90aWZ5V2l0aChvLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgobyxbbF0pLCExKX0sbD1zLnByb21pc2Uoe2VsZW06byxwcm9wczpTLmV4dGVuZCh7fSxlKSxvcHRzOlMuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpTLmVhc2luZy5fZGVmYXVsdH0sdCksb3JpZ2luYWxQcm9wZXJ0aWVzOmUsb3JpZ2luYWxPcHRpb25zOnQsc3RhcnRUaW1lOnR0fHx1dCgpLGR1cmF0aW9uOnQuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49Uy5Ud2VlbihvLGwub3B0cyxlLHQsbC5vcHRzLnNwZWNpYWxFYXNpbmdbZV18fGwub3B0cy5lYXNpbmcpO3JldHVybiBsLnR3ZWVucy5wdXNoKG4pLG59LHN0b3A6ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPWU/bC50d2VlbnMubGVuZ3RoOjA7aWYoYSlyZXR1cm4gdGhpcztmb3IoYT0hMDt0PG47dCsrKWwudHdlZW5zW3RdLnJ1bigxKTtyZXR1cm4gZT8ocy5ub3RpZnlXaXRoKG8sW2wsMSwwXSkscy5yZXNvbHZlV2l0aChvLFtsLGVdKSk6cy5yZWplY3RXaXRoKG8sW2wsZV0pLHRoaXN9fSksYz1sLnByb3BzO2ZvcighZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhO2ZvcihuIGluIGUpaWYoaT10W3I9WChuKV0sbz1lW25dLEFycmF5LmlzQXJyYXkobykmJihpPW9bMV0sbz1lW25dPW9bMF0pLG4hPT1yJiYoZVtyXT1vLGRlbGV0ZSBlW25dKSwoYT1TLmNzc0hvb2tzW3JdKSYmImV4cGFuZCJpbiBhKWZvcihuIGluIG89YS5leHBhbmQobyksZGVsZXRlIGVbcl0sbyluIGluIGV8fChlW25dPW9bbl0sdFtuXT1pKTtlbHNlIHRbcl09aX0oYyxsLm9wdHMuc3BlY2lhbEVhc2luZyk7cjxpO3IrKylpZihuPWZ0LnByZWZpbHRlcnNbcl0uY2FsbChsLG8sYyxsLm9wdHMpKXJldHVybiBtKG4uc3RvcCkmJihTLl9xdWV1ZUhvb2tzKGwuZWxlbSxsLm9wdHMucXVldWUpLnN0b3A9bi5zdG9wLmJpbmQobikpLG47cmV0dXJuIFMubWFwKGMsY3QsbCksbShsLm9wdHMuc3RhcnQpJiZsLm9wdHMuc3RhcnQuY2FsbChvLGwpLGwucHJvZ3Jlc3MobC5vcHRzLnByb2dyZXNzKS5kb25lKGwub3B0cy5kb25lLGwub3B0cy5jb21wbGV0ZSkuZmFpbChsLm9wdHMuZmFpbCkuYWx3YXlzKGwub3B0cy5hbHdheXMpLFMuZngudGltZXIoUy5leHRlbmQodSx7ZWxlbTpvLGFuaW06bCxxdWV1ZTpsLm9wdHMucXVldWV9KSksbH1TLkFuaW1hdGlvbj1TLmV4dGVuZChmdCx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWF0ZVR3ZWVuKGUsdCk7cmV0dXJuIHNlKG4uZWxlbSxlLHRlLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7bShlKT8odD1lLGU9WyIqIl0pOmU9ZS5tYXRjaChQKTtmb3IodmFyIG4scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluPWVbcl0sZnQudHdlZW5lcnNbbl09ZnQudHdlZW5lcnNbbl18fFtdLGZ0LnR3ZWVuZXJzW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcnM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjLGY9IndpZHRoImluIHR8fCJoZWlnaHQiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsZz1lLm5vZGVUeXBlJiZhZShlKSx2PVkuZ2V0KGUsImZ4c2hvdyIpO2ZvcihyIGluIG4ucXVldWV8fChudWxsPT0oYT1TLl9xdWV1ZUhvb2tzKGUsImZ4IikpLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHM9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHMoKX0pLGEudW5xdWV1ZWQrKyxwLmFsd2F5cyhmdW5jdGlvbigpe3AuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLFMucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSksdClpZihpPXRbcl0sb3QudGVzdChpKSl7aWYoZGVsZXRlIHRbcl0sbz1vfHwidG9nZ2xlIj09PWksaT09PShnPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1pfHwhdnx8dm9pZCAwPT09dltyXSljb250aW51ZTtnPSEwfWRbcl09diYmdltyXXx8Uy5zdHlsZShlLHIpfWlmKCh1PSFTLmlzRW1wdHlPYmplY3QodCkpfHwhUy5pc0VtcHR5T2JqZWN0KGQpKWZvcihyIGluIGYmJjE9PT1lLm5vZGVUeXBlJiYobi5vdmVyZmxvdz1baC5vdmVyZmxvdyxoLm92ZXJmbG93WCxoLm92ZXJmbG93WV0sbnVsbD09KGw9diYmdi5kaXNwbGF5KSYmKGw9WS5nZXQoZSwiZGlzcGxheSIpKSwibm9uZSI9PT0oYz1TLmNzcyhlLCJkaXNwbGF5IikpJiYobD9jPWw6KGxlKFtlXSwhMCksbD1lLnN0eWxlLmRpc3BsYXl8fGwsYz1TLmNzcyhlLCJkaXNwbGF5IiksbGUoW2VdKSkpLCgiaW5saW5lIj09PWN8fCJpbmxpbmUtYmxvY2siPT09YyYmbnVsbCE9bCkmJiJub25lIj09PVMuY3NzKGUsImZsb2F0IikmJih1fHwocC5kb25lKGZ1bmN0aW9uKCl7aC5kaXNwbGF5PWx9KSxudWxsPT1sJiYoYz1oLmRpc3BsYXksbD0ibm9uZSI9PT1jPyIiOmMpKSxoLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxuLm92ZXJmbG93JiYoaC5vdmVyZmxvdz0iaGlkZGVuIixwLmFsd2F5cyhmdW5jdGlvbigpe2gub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxoLm92ZXJmbG93WD1uLm92ZXJmbG93WzFdLGgub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSksdT0hMSxkKXV8fCh2PyJoaWRkZW4iaW4gdiYmKGc9di5oaWRkZW4pOnY9WS5hY2Nlc3MoZSwiZnhzaG93Iix7ZGlzcGxheTpsfSksbyYmKHYuaGlkZGVuPSFnKSxnJiZsZShbZV0sITApLHAuZG9uZShmdW5jdGlvbigpe2ZvcihyIGluIGd8fGxlKFtlXSksWS5yZW1vdmUoZSwiZnhzaG93IiksZClTLnN0eWxlKGUscixkW3JdKX0pKSx1PWN0KGc/dltyXTowLHIscCksciBpbiB2fHwodltyXT11LnN0YXJ0LGcmJih1LmVuZD11LnN0YXJ0LHUuc3RhcnQ9MCkpfV0scHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD9mdC5wcmVmaWx0ZXJzLnVuc2hpZnQoZSk6ZnQucHJlZmlsdGVycy5wdXNoKGUpfX0pLFMuc3BlZWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUmJiJvYmplY3QiPT10eXBlb2YgZT9TLmV4dGVuZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fG0oZSkmJmUsZHVyYXRpb246ZSxlYXNpbmc6biYmdHx8dCYmIW0odCkmJnR9O3JldHVybiBTLmZ4Lm9mZj9yLmR1cmF0aW9uPTA6Im51bWJlciIhPXR5cGVvZiByLmR1cmF0aW9uJiYoci5kdXJhdGlvbiBpbiBTLmZ4LnNwZWVkcz9yLmR1cmF0aW9uPVMuZnguc3BlZWRzW3IuZHVyYXRpb25dOnIuZHVyYXRpb249Uy5meC5zcGVlZHMuX2RlZmF1bHQpLG51bGwhPXIucXVldWUmJiEwIT09ci5xdWV1ZXx8KHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bShyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmUy5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LFMuZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKGFlKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1TLmlzRW1wdHlPYmplY3QodCksbz1TLnNwZWVkKGUsbixyKSxhPWZ1bmN0aW9uKCl7dmFyIGU9ZnQodGhpcyxTLmV4dGVuZCh7fSx0KSxvKTsoaXx8WS5nZXQodGhpcywiZmluaXNoIikpJiZlLnN0b3AoITApfTtyZXR1cm4gYS5maW5pc2g9YSxpfHwhMT09PW8ucXVldWU/dGhpcy5lYWNoKGEpOnRoaXMucXVldWUoby5xdWV1ZSxhKX0sc3RvcDpmdW5jdGlvbihpLGUsbyl7dmFyIGE9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChvKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBpJiYobz1lLGU9aSxpPXZvaWQgMCksZSYmdGhpcy5xdWV1ZShpfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT0hMCx0PW51bGwhPWkmJmkrInF1ZXVlSG9va3MiLG49Uy50aW1lcnMscj1ZLmdldCh0aGlzKTtpZih0KXJbdF0mJnJbdF0uc3RvcCYmYShyW3RdKTtlbHNlIGZvcih0IGluIHIpclt0XSYmclt0XS5zdG9wJiZhdC50ZXN0KHQpJiZhKHJbdF0pO2Zvcih0PW4ubGVuZ3RoO3QtLTspblt0XS5lbGVtIT09dGhpc3x8bnVsbCE9aSYmblt0XS5xdWV1ZSE9PWl8fChuW3RdLmFuaW0uc3RvcChvKSxlPSExLG4uc3BsaWNlKHQsMSkpOyFlJiZvfHxTLmRlcXVldWUodGhpcyxpKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuITEhPT1hJiYoYT1hfHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSx0PVkuZ2V0KHRoaXMpLG49dFthKyJxdWV1ZSJdLHI9dFthKyJxdWV1ZUhvb2tzIl0saT1TLnRpbWVycyxvPW4/bi5sZW5ndGg6MDtmb3IodC5maW5pc2g9ITAsUy5xdWV1ZSh0aGlzLGEsW10pLHImJnIuc3RvcCYmci5zdG9wLmNhbGwodGhpcywhMCksZT1pLmxlbmd0aDtlLS07KWlbZV0uZWxlbT09PXRoaXMmJmlbZV0ucXVldWU9PT1hJiYoaVtlXS5hbmltLnN0b3AoITApLGkuc3BsaWNlKGUsMSkpO2ZvcihlPTA7ZTxvO2UrKyluW2VdJiZuW2VdLmZpbmlzaCYmbltlXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgdC5maW5pc2h9KX19KSxTLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGUscil7dmFyIGk9Uy5mbltyXTtTLmZuW3JdPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZT9pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUobHQociwhMCksZSx0LG4pfX0pLFMuZWFjaCh7c2xpZGVEb3duOmx0KCJzaG93Iiksc2xpZGVVcDpsdCgiaGlkZSIpLHNsaWRlVG9nZ2xlOmx0KCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGUscil7Uy5mbltlXT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuYW5pbWF0ZShyLGUsdCxuKX19KSxTLnRpbWVycz1bXSxTLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSx0PTAsbj1TLnRpbWVycztmb3IodHQ9RGF0ZS5ub3coKTt0PG4ubGVuZ3RoO3QrKykoZT1uW3RdKSgpfHxuW3RdIT09ZXx8bi5zcGxpY2UodC0tLDEpO24ubGVuZ3RofHxTLmZ4LnN0b3AoKSx0dD12b2lkIDB9LFMuZngudGltZXI9ZnVuY3Rpb24oZSl7Uy50aW1lcnMucHVzaChlKSxTLmZ4LnN0YXJ0KCl9LFMuZnguaW50ZXJ2YWw9MTMsUy5meC5zdGFydD1mdW5jdGlvbigpe250fHwobnQ9ITAsc3QoKSl9LFMuZnguc3RvcD1mdW5jdGlvbigpe250PW51bGx9LFMuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LFMuZm4uZGVsYXk9ZnVuY3Rpb24ocixlKXtyZXR1cm4gcj1TLmZ4JiZTLmZ4LnNwZWVkc1tyXXx8cixlPWV8fCJmeCIsdGhpcy5xdWV1ZShlLGZ1bmN0aW9uKGUsdCl7dmFyIG49Qy5zZXRUaW1lb3V0KGUscik7dC5zdG9wPWZ1bmN0aW9uKCl7Qy5jbGVhclRpbWVvdXQobil9fSl9LHJ0PUUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxpdD1FLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKEUuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLHJ0LnR5cGU9ImNoZWNrYm94Iix5LmNoZWNrT249IiIhPT1ydC52YWx1ZSx5Lm9wdFNlbGVjdGVkPWl0LnNlbGVjdGVkLChydD1FLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnZhbHVlPSJ0IixydC50eXBlPSJyYWRpbyIseS5yYWRpb1ZhbHVlPSJ0Ij09PXJ0LnZhbHVlO3ZhciBwdCxkdD1TLmV4cHIuYXR0ckhhbmRsZTtTLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiAkKHRoaXMsUy5hdHRyLGUsdCwxPGFyZ3VtZW50cy5sZW5ndGgpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLnJlbW92ZUF0dHIodGhpcyxlKX0pfX0pLFMuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgZS5nZXRBdHRyaWJ1dGU/Uy5wcm9wKGUsdCxuKTooMT09PW8mJlMuaXNYTUxEb2MoZSl8fChpPVMuYXR0ckhvb2tzW3QudG9Mb3dlckNhc2UoKV18fChTLmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP3B0OnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCBTLnJlbW92ZUF0dHIoZSx0KTppJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjooZS5zZXRBdHRyaWJ1dGUodCxuKyIiKSxuKTppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOm51bGw9PShyPVMuZmluZC5hdHRyKGUsdCkpP3ZvaWQgMDpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZigheS5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmQShlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXQmJnQubWF0Y2goUCk7aWYoaSYmMT09PWUubm9kZVR5cGUpd2hpbGUobj1pW3IrK10pZS5yZW1vdmVBdHRyaWJ1dGUobil9fSkscHQ9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuITE9PT10P1MucmVtb3ZlQXR0cihlLG4pOmUuc2V0QXR0cmlidXRlKG4sbiksbn19LFMuZWFjaChTLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihlLHQpe3ZhciBhPWR0W3RdfHxTLmZpbmQuYXR0cjtkdFt0XT1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gbnx8KGk9ZHRbb10sZHRbb109cixyPW51bGwhPWEoZSx0LG4pP286bnVsbCxkdFtvXT1pKSxyfX0pO3ZhciBodD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLGd0PS9eKD86YXxhcmVhKSQvaTtmdW5jdGlvbiB2dChlKXtyZXR1cm4oZS5tYXRjaChQKXx8W10pLmpvaW4oIiAiKX1mdW5jdGlvbiB5dChlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn1mdW5jdGlvbiBtdChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lOiJzdHJpbmciPT10eXBlb2YgZSYmZS5tYXRjaChQKXx8W119Uy5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJCh0aGlzLFMucHJvcCxlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbUy5wcm9wRml4W2VdfHxlXX0pfX0pLFMuZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiAxPT09byYmUy5pc1hNTERvYyhlKXx8KHQ9Uy5wcm9wRml4W3RdfHx0LGk9Uy5wcm9wSG9va3NbdF0pLHZvaWQgMCE9PW4/aSYmInNldCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6ZVt0XT1uOmkmJiJnZXQiaW4gaSYmbnVsbCE9PShyPWkuZ2V0KGUsdCkpP3I6ZVt0XX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PVMuZmluZC5hdHRyKGUsInRhYmluZGV4Iik7cmV0dXJuIHQ/cGFyc2VJbnQodCwxMCk6aHQudGVzdChlLm5vZGVOYW1lKXx8Z3QudGVzdChlLm5vZGVOYW1lKSYmZS5ocmVmPzA6LTF9fX0scHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9fSkseS5vcHRTZWxlY3RlZHx8KFMucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7dCYmKHQuc2VsZWN0ZWRJbmRleCx0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxTLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe1MucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxTLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLmFkZENsYXNzKHQuY2FsbCh0aGlzLGUseXQodGhpcykpKX0pO2lmKChlPW10KHQpKS5sZW5ndGgpd2hpbGUobj10aGlzW3UrK10paWYoaT15dChuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIrdnQoaSkrIiAiKXthPTA7d2hpbGUobz1lW2ErK10pci5pbmRleE9mKCIgIitvKyIgIik8MCYmKHIrPW8rIiAiKTtpIT09KHM9dnQocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLGEscyx1PTA7aWYobSh0KSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykucmVtb3ZlQ2xhc3ModC5jYWxsKHRoaXMsZSx5dCh0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCIiKTtpZigoZT1tdCh0KSkubGVuZ3RoKXdoaWxlKG49dGhpc1t1KytdKWlmKGk9eXQobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK3Z0KGkpKyIgIil7YT0wO3doaWxlKG89ZVthKytdKXdoaWxlKC0xPHIuaW5kZXhPZigiICIrbysiICIpKXI9ci5yZXBsYWNlKCIgIitvKyIgIiwiICIpO2khPT0ocz12dChyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGksdCl7dmFyIG89dHlwZW9mIGksYT0ic3RyaW5nIj09PW98fEFycmF5LmlzQXJyYXkoaSk7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdCYmYT90P3RoaXMuYWRkQ2xhc3MoaSk6dGhpcy5yZW1vdmVDbGFzcyhpKTptKGkpP3RoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLnRvZ2dsZUNsYXNzKGkuY2FsbCh0aGlzLGUseXQodGhpcyksdCksdCl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSx0LG4scjtpZihhKXt0PTAsbj1TKHRoaXMpLHI9bXQoaSk7d2hpbGUoZT1yW3QrK10pbi5oYXNDbGFzcyhlKT9uLnJlbW92ZUNsYXNzKGUpOm4uYWRkQ2xhc3MoZSl9ZWxzZSB2b2lkIDAhPT1pJiYiYm9vbGVhbiIhPT1vfHwoKGU9eXQodGhpcykpJiZZLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIixlKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixlfHwhMT09PWk/IiI6WS5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj0wO3Q9IiAiK2UrIiAiO3doaWxlKG49dGhpc1tyKytdKWlmKDE9PT1uLm5vZGVUeXBlJiYtMTwoIiAiK3Z0KHl0KG4pKSsiICIpLmluZGV4T2YodCkpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIHh0PS9cci9nO1MuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24obil7dmFyIHIsZSxpLHQ9dGhpc1swXTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1tKG4pLHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgdDsxPT09dGhpcy5ub2RlVHlwZSYmKG51bGw9PSh0PWk/bi5jYWxsKHRoaXMsZSxTKHRoaXMpLnZhbCgpKTpuKT90PSIiOiJudW1iZXIiPT10eXBlb2YgdD90Kz0iIjpBcnJheS5pc0FycmF5KHQpJiYodD1TLm1hcCh0LGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOmUrIiJ9KSksKHI9Uy52YWxIb29rc1t0aGlzLnR5cGVdfHxTLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYic2V0ImluIHImJnZvaWQgMCE9PXIuc2V0KHRoaXMsdCwidmFsdWUiKXx8KHRoaXMudmFsdWU9dCkpfSkpOnQ/KHI9Uy52YWxIb29rc1t0LnR5cGVdfHxTLnZhbEhvb2tzW3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYiZ2V0ImluIHImJnZvaWQgMCE9PShlPXIuZ2V0KHQsInZhbHVlIikpP2U6InN0cmluZyI9PXR5cGVvZihlPXQudmFsdWUpP2UucmVwbGFjZSh4dCwiIik6bnVsbD09ZT8iIjplOnZvaWQgMH19KSxTLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PVMuZmluZC5hdHRyKGUsInZhbHVlIik7cmV0dXJuIG51bGwhPXQ/dDp2dChTLnRleHQoZSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk9ZS5vcHRpb25zLG89ZS5zZWxlY3RlZEluZGV4LGE9InNlbGVjdC1vbmUiPT09ZS50eXBlLHM9YT9udWxsOltdLHU9YT9vKzE6aS5sZW5ndGg7Zm9yKHI9bzwwP3U6YT9vOjA7cjx1O3IrKylpZigoKG49aVtyXSkuc2VsZWN0ZWR8fHI9PT1vKSYmIW4uZGlzYWJsZWQmJighbi5wYXJlbnROb2RlLmRpc2FibGVkfHwhQShuLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZih0PVMobikudmFsKCksYSlyZXR1cm4gdDtzLnB1c2godCl9cmV0dXJuIHN9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1lLm9wdGlvbnMsbz1TLm1ha2VBcnJheSh0KSxhPWkubGVuZ3RoO3doaWxlKGEtLSkoKHI9aVthXSkuc2VsZWN0ZWQ9LTE8Uy5pbkFycmF5KFMudmFsSG9va3Mub3B0aW9uLmdldChyKSxvKSkmJihuPSEwKTtyZXR1cm4gbnx8KGUuc2VsZWN0ZWRJbmRleD0tMSksb319fX0pLFMuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe1MudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIGUuY2hlY2tlZD0tMTxTLmluQXJyYXkoUyhlKS52YWwoKSx0KX19LHkuY2hlY2tPbnx8KFMudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjplLnZhbHVlfSl9KSx5LmZvY3VzaW49Im9uZm9jdXNpbiJpbiBDO3ZhciBidD0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sd3Q9ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKX07Uy5leHRlbmQoUy5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1LGwsYyxmLHA9W258fEVdLGQ9di5jYWxsKGUsInR5cGUiKT9lLnR5cGU6ZSxoPXYuY2FsbChlLCJuYW1lc3BhY2UiKT9lLm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKG89Zj1hPW49bnx8RSwzIT09bi5ub2RlVHlwZSYmOCE9PW4ubm9kZVR5cGUmJiFidC50ZXN0KGQrUy5ldmVudC50cmlnZ2VyZWQpJiYoLTE8ZC5pbmRleE9mKCIuIikmJihkPShoPWQuc3BsaXQoIi4iKSkuc2hpZnQoKSxoLnNvcnQoKSksdT1kLmluZGV4T2YoIjoiKTwwJiYib24iK2QsKGU9ZVtTLmV4cGFuZG9dP2U6bmV3IFMuRXZlbnQoZCwib2JqZWN0Ij09dHlwZW9mIGUmJmUpKS5pc1RyaWdnZXI9cj8yOjMsZS5uYW1lc3BhY2U9aC5qb2luKCIuIiksZS5ybmFtZXNwYWNlPWUubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK2guam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxlLnJlc3VsdD12b2lkIDAsZS50YXJnZXR8fChlLnRhcmdldD1uKSx0PW51bGw9PXQ/W2VdOlMubWFrZUFycmF5KHQsW2VdKSxjPVMuZXZlbnQuc3BlY2lhbFtkXXx8e30scnx8IWMudHJpZ2dlcnx8ITEhPT1jLnRyaWdnZXIuYXBwbHkobix0KSkpe2lmKCFyJiYhYy5ub0J1YmJsZSYmIXgobikpe2ZvcihzPWMuZGVsZWdhdGVUeXBlfHxkLGJ0LnRlc3QocytkKXx8KG89by5wYXJlbnROb2RlKTtvO289by5wYXJlbnROb2RlKXAucHVzaChvKSxhPW87YT09PShuLm93bmVyRG9jdW1lbnR8fEUpJiZwLnB1c2goYS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3d8fEMpfWk9MDt3aGlsZSgobz1wW2krK10pJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWY9byxlLnR5cGU9MTxpP3M6Yy5iaW5kVHlwZXx8ZCwobD0oWS5nZXQobywiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW2UudHlwZV0mJlkuZ2V0KG8sImhhbmRsZSIpKSYmbC5hcHBseShvLHQpLChsPXUmJm9bdV0pJiZsLmFwcGx5JiZWKG8pJiYoZS5yZXN1bHQ9bC5hcHBseShvLHQpLCExPT09ZS5yZXN1bHQmJmUucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGUudHlwZT1kLHJ8fGUuaXNEZWZhdWx0UHJldmVudGVkKCl8fGMuX2RlZmF1bHQmJiExIT09Yy5fZGVmYXVsdC5hcHBseShwLnBvcCgpLHQpfHwhVihuKXx8dSYmbShuW2RdKSYmIXgobikmJigoYT1uW3VdKSYmKG5bdV09bnVsbCksUy5ldmVudC50cmlnZ2VyZWQ9ZCxlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmYuYWRkRXZlbnRMaXN0ZW5lcihkLHd0KSxuW2RdKCksZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCx3dCksUy5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLGEmJihuW3VdPWEpKSxlLnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1TLmV4dGVuZChuZXcgUy5FdmVudCxuLHt0eXBlOmUsaXNTaW11bGF0ZWQ6ITB9KTtTLmV2ZW50LnRyaWdnZXIocixudWxsLHQpfX0pLFMuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQudHJpZ2dlcihlLHQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzWzBdO2lmKG4pcmV0dXJuIFMuZXZlbnQudHJpZ2dlcihlLHQsbiwhMCl9fSkseS5mb2N1c2lufHxTLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKG4scil7dmFyIGk9ZnVuY3Rpb24oZSl7Uy5ldmVudC5zaW11bGF0ZShyLGUudGFyZ2V0LFMuZXZlbnQuZml4KGUpKX07Uy5ldmVudC5zcGVjaWFsW3JdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcyx0PVkuYWNjZXNzKGUscik7dHx8ZS5hZGRFdmVudExpc3RlbmVyKG4saSwhMCksWS5hY2Nlc3MoZSxyLCh0fHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jdW1lbnR8fHRoaXMsdD1ZLmFjY2VzcyhlLHIpLTE7dD9ZLmFjY2VzcyhlLHIsdCk6KGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLGksITApLFkucmVtb3ZlKGUscikpfX19KTt2YXIgVHQ9Qy5sb2NhdGlvbixDdD17Z3VpZDpEYXRlLm5vdygpfSxFdD0vXD8vO1MucGFyc2VYTUw9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoIWV8fCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gbnVsbDt0cnl7dD0obmV3IEMuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoZSwidGV4dC94bWwiKX1jYXRjaChlKXt0PXZvaWQgMH1yZXR1cm4gdCYmIXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHxTLmVycm9yKCJJbnZhbGlkIFhNTDogIitlKSx0fTt2YXIgU3Q9L1xbXF0kLyxrdD0vXHI/XG4vZyxBdD0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksTnQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIER0KG4sZSxyLGkpe3ZhciB0O2lmKEFycmF5LmlzQXJyYXkoZSkpUy5lYWNoKGUsZnVuY3Rpb24oZSx0KXtyfHxTdC50ZXN0KG4pP2kobix0KTpEdChuKyJbIisoIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT10P2U6IiIpKyJdIix0LHIsaSl9KTtlbHNlIGlmKHJ8fCJvYmplY3QiIT09dyhlKSlpKG4sZSk7ZWxzZSBmb3IodCBpbiBlKUR0KG4rIlsiK3QrIl0iLGVbdF0scixpKX1TLnBhcmFtPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPWZ1bmN0aW9uKGUsdCl7dmFyIG49bSh0KT90KCk6dDtyW3IubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoZSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChudWxsPT1uPyIiOm4pfTtpZihudWxsPT1lKXJldHVybiIiO2lmKEFycmF5LmlzQXJyYXkoZSl8fGUuanF1ZXJ5JiYhUy5pc1BsYWluT2JqZWN0KGUpKVMuZWFjaChlLGZ1bmN0aW9uKCl7aSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihuIGluIGUpRHQobixlW25dLHQsaSk7cmV0dXJuIHIuam9pbigiJiIpfSxTLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIFMucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT1TLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gZT9TLm1ha2VBcnJheShlKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFTKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmTnQudGVzdCh0aGlzLm5vZGVOYW1lKSYmIUF0LnRlc3QoZSkmJih0aGlzLmNoZWNrZWR8fCFwZS50ZXN0KGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPVModGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4/bnVsbDpBcnJheS5pc0FycmF5KG4pP1MubWFwKG4sZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6dC5uYW1lLHZhbHVlOmUucmVwbGFjZShrdCwiXHJcbiIpfX0pOntuYW1lOnQubmFtZSx2YWx1ZTpuLnJlcGxhY2Uoa3QsIlxyXG4iKX19KS5nZXQoKX19KTt2YXIganQ9LyUyMC9nLHF0PS8jLiokLyxMdD0vKFs/Jl0pXz1bXiZdKi8sSHQ9L14oLio/KTpbIFx0XSooW15cclxuXSopJC9nbSxPdD0vXig/OkdFVHxIRUFEKSQvLFB0PS9eXC9cLy8sUnQ9e30sTXQ9e30sSXQ9IiovIi5jb25jYXQoIioiKSxXdD1FLmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiBGdChvKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXsic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT0iKiIpO3ZhciBuLHI9MCxpPWUudG9Mb3dlckNhc2UoKS5tYXRjaChQKXx8W107aWYobSh0KSl3aGlsZShuPWlbcisrXSkiKyI9PT1uWzBdPyhuPW4uc2xpY2UoMSl8fCIqIiwob1tuXT1vW25dfHxbXSkudW5zaGlmdCh0KSk6KG9bbl09b1tuXXx8W10pLnB1c2godCl9fWZ1bmN0aW9uIEJ0KHQsaSxvLGEpe3ZhciBzPXt9LHU9dD09PU10O2Z1bmN0aW9uIGwoZSl7dmFyIHI7cmV0dXJuIHNbZV09ITAsUy5lYWNoKHRbZV18fFtdLGZ1bmN0aW9uKGUsdCl7dmFyIG49dChpLG8sYSk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBufHx1fHxzW25dP3U/IShyPW4pOnZvaWQgMDooaS5kYXRhVHlwZXMudW5zaGlmdChuKSxsKG4pLCExKX0pLHJ9cmV0dXJuIGwoaS5kYXRhVHlwZXNbMF0pfHwhc1siKiJdJiZsKCIqIil9ZnVuY3Rpb24gJHQoZSx0KXt2YXIgbixyLGk9Uy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIHQpdm9pZCAwIT09dFtuXSYmKChpW25dP2U6cnx8KHI9e30pKVtuXT10W25dKTtyZXR1cm4gciYmUy5leHRlbmQoITAsZSxyKSxlfVd0LmhyZWY9VHQuaHJlZixTLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6VHQuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8udGVzdChUdC5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpJdCx0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpKU09OLnBhcnNlLCJ0ZXh0IHhtbCI6Uy5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/JHQoJHQoZSxTLmFqYXhTZXR0aW5ncyksdCk6JHQoUy5hamF4U2V0dGluZ3MsZSl9LGFqYXhQcmVmaWx0ZXI6RnQoUnQpLGFqYXhUcmFuc3BvcnQ6RnQoTXQpLGFqYXg6ZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLHQ9dHx8e307dmFyIGMsZixwLG4sZCxyLGgsZyxpLG8sdj1TLmFqYXhTZXR1cCh7fSx0KSx5PXYuY29udGV4dHx8dixtPXYuY29udGV4dCYmKHkubm9kZVR5cGV8fHkuanF1ZXJ5KT9TKHkpOlMuZXZlbnQseD1TLkRlZmVycmVkKCksYj1TLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx3PXYuc3RhdHVzQ29kZXx8e30sYT17fSxzPXt9LHU9ImNhbmNlbGVkIixUPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoaCl7aWYoIW4pe249e307d2hpbGUodD1IdC5leGVjKHApKW5bdFsxXS50b0xvd2VyQ2FzZSgpKyIgIl09KG5bdFsxXS50b0xvd2VyQ2FzZSgpKyIgIl18fFtdKS5jb25jYXQodFsyXSl9dD1uW2UudG9Mb3dlckNhc2UoKSsiICJdfXJldHVybiBudWxsPT10P251bGw6dC5qb2luKCIsICIpfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gaD9wOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09aCYmKGU9c1tlLnRvTG93ZXJDYXNlKCldPXNbZS50b0xvd2VyQ2FzZSgpXXx8ZSxhW2VdPXQpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWgmJih2Lm1pbWVUeXBlPWUpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZSlpZihoKVQuYWx3YXlzKGVbVC5zdGF0dXNdKTtlbHNlIGZvcih0IGluIGUpd1t0XT1bd1t0XSxlW3RdXTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8dTtyZXR1cm4gYyYmYy5hYm9ydCh0KSxsKDAsdCksdGhpc319O2lmKHgucHJvbWlzZShUKSx2LnVybD0oKGV8fHYudXJsfHxUdC5ocmVmKSsiIikucmVwbGFjZShQdCxUdC5wcm90b2NvbCsiLy8iKSx2LnR5cGU9dC5tZXRob2R8fHQudHlwZXx8di5tZXRob2R8fHYudHlwZSx2LmRhdGFUeXBlcz0odi5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKFApfHxbIiJdLG51bGw9PXYuY3Jvc3NEb21haW4pe3I9RS5jcmVhdGVFbGVtZW50KCJhIik7dHJ5e3IuaHJlZj12LnVybCxyLmhyZWY9ci5ocmVmLHYuY3Jvc3NEb21haW49V3QucHJvdG9jb2wrIi8vIitXdC5ob3N0IT1yLnByb3RvY29sKyIvLyIrci5ob3N0fWNhdGNoKGUpe3YuY3Jvc3NEb21haW49ITB9fWlmKHYuZGF0YSYmdi5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiB2LmRhdGEmJih2LmRhdGE9Uy5wYXJhbSh2LmRhdGEsdi50cmFkaXRpb25hbCkpLEJ0KFJ0LHYsdCxUKSxoKXJldHVybiBUO2ZvcihpIGluKGc9Uy5ldmVudCYmdi5nbG9iYWwpJiYwPT1TLmFjdGl2ZSsrJiZTLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLHYudHlwZT12LnR5cGUudG9VcHBlckNhc2UoKSx2Lmhhc0NvbnRlbnQ9IU90LnRlc3Qodi50eXBlKSxmPXYudXJsLnJlcGxhY2UocXQsIiIpLHYuaGFzQ29udGVudD92LmRhdGEmJnYucHJvY2Vzc0RhdGEmJjA9PT0odi5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYodi5kYXRhPXYuZGF0YS5yZXBsYWNlKGp0LCIrIikpOihvPXYudXJsLnNsaWNlKGYubGVuZ3RoKSx2LmRhdGEmJih2LnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIHYuZGF0YSkmJihmKz0oRXQudGVzdChmKT8iJiI6Ij8iKSt2LmRhdGEsZGVsZXRlIHYuZGF0YSksITE9PT12LmNhY2hlJiYoZj1mLnJlcGxhY2UoTHQsIiQxIiksbz0oRXQudGVzdChmKT8iJiI6Ij8iKSsiXz0iK0N0Lmd1aWQrKytvKSx2LnVybD1mK28pLHYuaWZNb2RpZmllZCYmKFMubGFzdE1vZGlmaWVkW2ZdJiZULnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixTLmxhc3RNb2RpZmllZFtmXSksUy5ldGFnW2ZdJiZULnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLFMuZXRhZ1tmXSkpLCh2LmRhdGEmJnYuaGFzQ29udGVudCYmITEhPT12LmNvbnRlbnRUeXBlfHx0LmNvbnRlbnRUeXBlKSYmVC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLHYuY29udGVudFR5cGUpLFQuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0Iix2LmRhdGFUeXBlc1swXSYmdi5hY2NlcHRzW3YuZGF0YVR5cGVzWzBdXT92LmFjY2VwdHNbdi5kYXRhVHlwZXNbMF1dKygiKiIhPT12LmRhdGFUeXBlc1swXT8iLCAiK0l0KyI7IHE9MC4wMSI6IiIpOnYuYWNjZXB0c1siKiJdKSx2LmhlYWRlcnMpVC5zZXRSZXF1ZXN0SGVhZGVyKGksdi5oZWFkZXJzW2ldKTtpZih2LmJlZm9yZVNlbmQmJighMT09PXYuYmVmb3JlU2VuZC5jYWxsKHksVCx2KXx8aCkpcmV0dXJuIFQuYWJvcnQoKTtpZih1PSJhYm9ydCIsYi5hZGQodi5jb21wbGV0ZSksVC5kb25lKHYuc3VjY2VzcyksVC5mYWlsKHYuZXJyb3IpLGM9QnQoTXQsdix0LFQpKXtpZihULnJlYWR5U3RhdGU9MSxnJiZtLnRyaWdnZXIoImFqYXhTZW5kIixbVCx2XSksaClyZXR1cm4gVDt2LmFzeW5jJiYwPHYudGltZW91dCYmKGQ9Qy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VC5hYm9ydCgidGltZW91dCIpfSx2LnRpbWVvdXQpKTt0cnl7aD0hMSxjLnNlbmQoYSxsKX1jYXRjaChlKXtpZihoKXRocm93IGU7bCgtMSxlKX19ZWxzZSBsKC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiBsKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD10O2h8fChoPSEwLGQmJkMuY2xlYXJUaW1lb3V0KGQpLGM9dm9pZCAwLHA9cnx8IiIsVC5yZWFkeVN0YXRlPTA8ZT80OjAsaT0yMDA8PWUmJmU8MzAwfHwzMDQ9PT1lLG4mJihzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczt3aGlsZSgiKiI9PT11WzBdKXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj1lLm1pbWVUeXBlfHx0LmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IoaSBpbiBzKWlmKHNbaV0mJnNbaV0udGVzdChyKSl7dS51bnNoaWZ0KGkpO2JyZWFrfWlmKHVbMF1pbiBuKW89dVswXTtlbHNle2ZvcihpIGluIG4pe2lmKCF1WzBdfHxlLmNvbnZlcnRlcnNbaSsiICIrdVswXV0pe289aTticmVha31hfHwoYT1pKX1vPW98fGF9aWYobylyZXR1cm4gbyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dfSh2LFQsbikpLCFpJiYtMTxTLmluQXJyYXkoInNjcmlwdCIsdi5kYXRhVHlwZXMpJiYodi5jb252ZXJ0ZXJzWyJ0ZXh0IHNjcmlwdCJdPWZ1bmN0aW9uKCl7fSkscz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9e30sYz1lLmRhdGFUeXBlcy5zbGljZSgpO2lmKGNbMV0pZm9yKGEgaW4gZS5jb252ZXJ0ZXJzKWxbYS50b0xvd2VyQ2FzZSgpXT1lLmNvbnZlcnRlcnNbYV07bz1jLnNoaWZ0KCk7d2hpbGUobylpZihlLnJlc3BvbnNlRmllbGRzW29dJiYobltlLnJlc3BvbnNlRmllbGRzW29dXT10KSwhdSYmciYmZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSksdT1vLG89Yy5zaGlmdCgpKWlmKCIqIj09PW8pbz11O2Vsc2UgaWYoIioiIT09dSYmdSE9PW8pe2lmKCEoYT1sW3UrIiAiK29dfHxsWyIqICIrb10pKWZvcihpIGluIGwpaWYoKHM9aS5zcGxpdCgiICIpKVsxXT09PW8mJihhPWxbdSsiICIrc1swXV18fGxbIiogIitzWzBdXSkpeyEwPT09YT9hPWxbaV06ITAhPT1sW2ldJiYobz1zWzBdLGMudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoITAhPT1hKWlmKGEmJmVbInRocm93cyJdKXQ9YSh0KTtlbHNlIHRyeXt0PWEodCl9Y2F0Y2goZSl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6YT9lOiJObyBjb252ZXJzaW9uIGZyb20gIit1KyIgdG8gIitvfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOnR9fSh2LHMsVCxpKSxpPyh2LmlmTW9kaWZpZWQmJigodT1ULmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpJiYoUy5sYXN0TW9kaWZpZWRbZl09dSksKHU9VC5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpKSYmKFMuZXRhZ1tmXT11KSksMjA0PT09ZXx8IkhFQUQiPT09di50eXBlP2w9Im5vY29udGVudCI6MzA0PT09ZT9sPSJub3Rtb2RpZmllZCI6KGw9cy5zdGF0ZSxvPXMuZGF0YSxpPSEoYT1zLmVycm9yKSkpOihhPWwsIWUmJmx8fChsPSJlcnJvciIsZTwwJiYoZT0wKSkpLFQuc3RhdHVzPWUsVC5zdGF0dXNUZXh0PSh0fHxsKSsiIixpP3gucmVzb2x2ZVdpdGgoeSxbbyxsLFRdKTp4LnJlamVjdFdpdGgoeSxbVCxsLGFdKSxULnN0YXR1c0NvZGUodyksdz12b2lkIDAsZyYmbS50cmlnZ2VyKGk/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbVCx2LGk/bzphXSksYi5maXJlV2l0aCh5LFtULGxdKSxnJiYobS50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtULHZdKSwtLVMuYWN0aXZlfHxTLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gVH0sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFMuZ2V0KGUsdCxuLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbihlLHQpe3JldHVybiBTLmdldChlLHZvaWQgMCx0LCJzY3JpcHQiKX19KSxTLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSxpKXtTW2ldPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBtKHQpJiYocj1yfHxuLG49dCx0PXZvaWQgMCksUy5hamF4KFMuZXh0ZW5kKHt1cmw6ZSx0eXBlOmksZGF0YVR5cGU6cixkYXRhOnQsc3VjY2VzczpufSxTLmlzUGxhaW5PYmplY3QoZSkmJmUpKX19KSxTLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZS5oZWFkZXJzKSJjb250ZW50LXR5cGUiPT09dC50b0xvd2VyQ2FzZSgpJiYoZS5jb250ZW50VHlwZT1lLmhlYWRlcnNbdF18fCIiKX0pLFMuX2V2YWxVcmw9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBTLmFqYXgoe3VybDplLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsY2FjaGU6ITAsYXN5bmM6ITEsZ2xvYmFsOiExLGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oKXt9fSxkYXRhRmlsdGVyOmZ1bmN0aW9uKGUpe1MuZ2xvYmFsRXZhbChlLHQsbil9fSl9LFMuZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0aGlzWzBdJiYobShlKSYmKGU9ZS5jYWxsKHRoaXNbMF0pKSx0PVMoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJnQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLHQubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpczt3aGlsZShlLmZpcnN0RWxlbWVudENoaWxkKWU9ZS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gZX0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKG4pe3JldHVybiBtKG4pP3RoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLndyYXBJbm5lcihuLmNhbGwodGhpcyxlKSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1TKHRoaXMpLHQ9ZS5jb250ZW50cygpO3QubGVuZ3RoP3Qud3JhcEFsbChuKTplLmFwcGVuZChuKX0pfSx3cmFwOmZ1bmN0aW9uKHQpe3ZhciBuPW0odCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLndyYXBBbGwobj90LmNhbGwodGhpcyxlKTp0KX0pfSx1bndyYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucGFyZW50KGUpLm5vdCgiYm9keSIpLmVhY2goZnVuY3Rpb24oKXtTKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KSx0aGlzfX0pLFMuZXhwci5wc2V1ZG9zLmhpZGRlbj1mdW5jdGlvbihlKXtyZXR1cm4hUy5leHByLnBzZXVkb3MudmlzaWJsZShlKX0sUy5leHByLnBzZXVkb3MudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4hIShlLm9mZnNldFdpZHRofHxlLm9mZnNldEhlaWdodHx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCl9LFMuYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IEMuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goZSl7fX07dmFyIF90PXswOjIwMCwxMjIzOjIwNH0senQ9Uy5hamF4U2V0dGluZ3MueGhyKCk7eS5jb3JzPSEhenQmJiJ3aXRoQ3JlZGVudGlhbHMiaW4genQseS5hamF4PXp0PSEhenQsUy5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGkpe3ZhciBvLGE7aWYoeS5jb3JzfHx6dCYmIWkuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkueGhyKCk7aWYoci5vcGVuKGkudHlwZSxpLnVybCxpLmFzeW5jLGkudXNlcm5hbWUsaS5wYXNzd29yZCksaS54aHJGaWVsZHMpZm9yKG4gaW4gaS54aHJGaWVsZHMpcltuXT1pLnhockZpZWxkc1tuXTtmb3IobiBpbiBpLm1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUmJnIub3ZlcnJpZGVNaW1lVHlwZShpLm1pbWVUeXBlKSxpLmNyb3NzRG9tYWlufHxlWyJYLVJlcXVlc3RlZC1XaXRoIl18fChlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0IiksZSlyLnNldFJlcXVlc3RIZWFkZXIobixlW25dKTtvPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe28mJihvPWE9ci5vbmxvYWQ9ci5vbmVycm9yPXIub25hYm9ydD1yLm9udGltZW91dD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLCJhYm9ydCI9PT1lP3IuYWJvcnQoKToiZXJyb3IiPT09ZT8ibnVtYmVyIiE9dHlwZW9mIHIuc3RhdHVzP3QoMCwiZXJyb3IiKTp0KHIuc3RhdHVzLHIuc3RhdHVzVGV4dCk6dChfdFtyLnN0YXR1c118fHIuc3RhdHVzLHIuc3RhdHVzVGV4dCwidGV4dCIhPT0oci5yZXNwb25zZVR5cGV8fCJ0ZXh0Iil8fCJzdHJpbmciIT10eXBlb2Ygci5yZXNwb25zZVRleHQ/e2JpbmFyeTpyLnJlc3BvbnNlfTp7dGV4dDpyLnJlc3BvbnNlVGV4dH0sci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0sci5vbmxvYWQ9bygpLGE9ci5vbmVycm9yPXIub250aW1lb3V0PW8oImVycm9yIiksdm9pZCAwIT09ci5vbmFib3J0P3Iub25hYm9ydD1hOnIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09PXIucmVhZHlTdGF0ZSYmQy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7byYmYSgpfSl9LG89bygiYWJvcnQiKTt0cnl7ci5zZW5kKGkuaGFzQ29udGVudCYmaS5kYXRhfHxudWxsKX1jYXRjaChlKXtpZihvKXRocm93IGV9fSxhYm9ydDpmdW5jdGlvbigpe28mJm8oKX19fSksUy5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGUpe2UuY3Jvc3NEb21haW4mJihlLmNvbnRlbnRzLnNjcmlwdD0hMSl9KSxTLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L1xiKD86amF2YXxlY21hKXNjcmlwdFxiL30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihlKXtyZXR1cm4gUy5nbG9iYWxFdmFsKGUpLGV9fX0pLFMuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihlKXt2b2lkIDA9PT1lLmNhY2hlJiYoZS5jYWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIil9KSxTLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24obil7dmFyIHIsaTtpZihuLmNyb3NzRG9tYWlufHxuLnNjcmlwdEF0dHJzKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsdCl7cj1TKCI8c2NyaXB0PiIpLmF0dHIobi5zY3JpcHRBdHRyc3x8e30pLnByb3Aoe2NoYXJzZXQ6bi5zY3JpcHRDaGFyc2V0LHNyYzpuLnVybH0pLm9uKCJsb2FkIGVycm9yIixpPWZ1bmN0aW9uKGUpe3IucmVtb3ZlKCksaT1udWxsLGUmJnQoImVycm9yIj09PWUudHlwZT80MDQ6MjAwLGUudHlwZSl9KSxFLmhlYWQuYXBwZW5kQ2hpbGQoclswXSl9LGFib3J0OmZ1bmN0aW9uKCl7aSYmaSgpfX19KTt2YXIgVXQsWHQ9W10sVnQ9Lyg9KVw/KD89JnwkKXxcP1w/LztTLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9WHQucG9wKCl8fFMuZXhwYW5kbysiXyIrQ3QuZ3VpZCsrO3JldHVybiB0aGlzW2VdPSEwLGV9fSksUy5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9ITEhPT1lLmpzb25wJiYoVnQudGVzdChlLnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiBlLmRhdGEmJjA9PT0oZS5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZWdC50ZXN0KGUuZGF0YSkmJiJkYXRhIik7aWYoYXx8Impzb25wIj09PWUuZGF0YVR5cGVzWzBdKXJldHVybiByPWUuanNvbnBDYWxsYmFjaz1tKGUuanNvbnBDYWxsYmFjayk/ZS5qc29ucENhbGxiYWNrKCk6ZS5qc29ucENhbGxiYWNrLGE/ZVthXT1lW2FdLnJlcGxhY2UoVnQsIiQxIityKTohMSE9PWUuanNvbnAmJihlLnVybCs9KEV0LnRlc3QoZS51cmwpPyImIjoiPyIpK2UuanNvbnArIj0iK3IpLGUuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBvfHxTLmVycm9yKHIrIiB3YXMgbm90IGNhbGxlZCIpLG9bMF19LGUuZGF0YVR5cGVzWzBdPSJqc29uIixpPUNbcl0sQ1tyXT1mdW5jdGlvbigpe289YXJndW1lbnRzfSxuLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PWk/UyhDKS5yZW1vdmVQcm9wKHIpOkNbcl09aSxlW3JdJiYoZS5qc29ucENhbGxiYWNrPXQuanNvbnBDYWxsYmFjayxYdC5wdXNoKHIpKSxvJiZtKGkpJiZpKG9bMF0pLG89aT12b2lkIDB9KSwic2NyaXB0In0pLHkuY3JlYXRlSFRNTERvY3VtZW50PSgoVXQ9RS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLmJvZHkpLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1VdC5jaGlsZE5vZGVzLmxlbmd0aCksUy5wYXJzZUhUTUw9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiJzdHJpbmciIT10eXBlb2YgZT9bXTooImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKSx0fHwoeS5jcmVhdGVIVE1MRG9jdW1lbnQ/KChyPSh0PUUuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKSkuY3JlYXRlRWxlbWVudCgiYmFzZSIpKS5ocmVmPUUubG9jYXRpb24uaHJlZix0LmhlYWQuYXBwZW5kQ2hpbGQocikpOnQ9RSksbz0hbiYmW10sKGk9Ti5leGVjKGUpKT9bdC5jcmVhdGVFbGVtZW50KGlbMV0pXTooaT14ZShbZV0sdCxvKSxvJiZvLmxlbmd0aCYmUyhvKS5yZW1vdmUoKSxTLm1lcmdlKFtdLGkuY2hpbGROb2RlcykpKTt2YXIgcixpLG99LFMuZm4ubG9hZD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9dGhpcyxzPWUuaW5kZXhPZigiICIpO3JldHVybi0xPHMmJihyPXZ0KGUuc2xpY2UocykpLGU9ZS5zbGljZSgwLHMpKSxtKHQpPyhuPXQsdD12b2lkIDApOnQmJiJvYmplY3QiPT10eXBlb2YgdCYmKGk9IlBPU1QiKSwwPGEubGVuZ3RoJiZTLmFqYXgoe3VybDplLHR5cGU6aXx8IkdFVCIsZGF0YVR5cGU6Imh0bWwiLGRhdGE6dH0pLmRvbmUoZnVuY3Rpb24oZSl7bz1hcmd1bWVudHMsYS5odG1sKHI/UygiPGRpdj4iKS5hcHBlbmQoUy5wYXJzZUhUTUwoZSkpLmZpbmQocik6ZSl9KS5hbHdheXMobiYmZnVuY3Rpb24oZSx0KXthLmVhY2goZnVuY3Rpb24oKXtuLmFwcGx5KHRoaXMsb3x8W2UucmVzcG9uc2VUZXh0LHQsZV0pfSl9KSx0aGlzfSxTLmV4cHIucHNldWRvcy5hbmltYXRlZD1mdW5jdGlvbih0KXtyZXR1cm4gUy5ncmVwKFMudGltZXJzLGZ1bmN0aW9uKGUpe3JldHVybiB0PT09ZS5lbGVtfSkubGVuZ3RofSxTLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbD1TLmNzcyhlLCJwb3NpdGlvbiIpLGM9UyhlKSxmPXt9OyJzdGF0aWMiPT09bCYmKGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1jLm9mZnNldCgpLG89Uy5jc3MoZSwidG9wIiksdT1TLmNzcyhlLCJsZWZ0IiksKCJhYnNvbHV0ZSI9PT1sfHwiZml4ZWQiPT09bCkmJi0xPChvK3UpLmluZGV4T2YoImF1dG8iKT8oYT0ocj1jLnBvc2l0aW9uKCkpLnRvcCxpPXIubGVmdCk6KGE9cGFyc2VGbG9hdChvKXx8MCxpPXBhcnNlRmxvYXQodSl8fDApLG0odCkmJih0PXQuY2FsbChlLG4sUy5leHRlbmQoe30scykpKSxudWxsIT10LnRvcCYmKGYudG9wPXQudG9wLXMudG9wK2EpLG51bGwhPXQubGVmdCYmKGYubGVmdD10LmxlZnQtcy5sZWZ0K2kpLCJ1c2luZyJpbiB0P3QudXNpbmcuY2FsbChlLGYpOigibnVtYmVyIj09dHlwZW9mIGYudG9wJiYoZi50b3ArPSJweCIpLCJudW1iZXIiPT10eXBlb2YgZi5sZWZ0JiYoZi5sZWZ0Kz0icHgiKSxjLmNzcyhmKSl9fSxTLmZuLmV4dGVuZCh7b2Zmc2V0OmZ1bmN0aW9uKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMD09PXQ/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uy5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsdCxlKX0pO3ZhciBlLG4scj10aGlzWzBdO3JldHVybiByP3IuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGg/KGU9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldyx7dG9wOmUudG9wK24ucGFnZVlPZmZzZXQsbGVmdDplLmxlZnQrbi5wYWdlWE9mZnNldH0pOnt0b3A6MCxsZWZ0OjB9OnZvaWQgMH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgZSx0LG4scj10aGlzWzBdLGk9e3RvcDowLGxlZnQ6MH07aWYoImZpeGVkIj09PVMuY3NzKHIsInBvc2l0aW9uIikpdD1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Vsc2V7dD10aGlzLm9mZnNldCgpLG49ci5vd25lckRvY3VtZW50LGU9ci5vZmZzZXRQYXJlbnR8fG4uZG9jdW1lbnRFbGVtZW50O3doaWxlKGUmJihlPT09bi5ib2R5fHxlPT09bi5kb2N1bWVudEVsZW1lbnQpJiYic3RhdGljIj09PVMuY3NzKGUsInBvc2l0aW9uIikpZT1lLnBhcmVudE5vZGU7ZSYmZSE9PXImJjE9PT1lLm5vZGVUeXBlJiYoKGk9UyhlKS5vZmZzZXQoKSkudG9wKz1TLmNzcyhlLCJib3JkZXJUb3BXaWR0aCIsITApLGkubGVmdCs9Uy5jc3MoZSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpfXJldHVybnt0b3A6dC50b3AtaS50b3AtUy5jc3MociwibWFyZ2luVG9wIiwhMCksbGVmdDp0LmxlZnQtaS5sZWZ0LVMuY3NzKHIsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9mZnNldFBhcmVudDt3aGlsZShlJiYic3RhdGljIj09PVMuY3NzKGUsInBvc2l0aW9uIikpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8cmV9KX19KSxTLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24odCxpKXt2YXIgbz0icGFnZVlPZmZzZXQiPT09aTtTLmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKHgoZSk/cj1lOjk9PT1lLm5vZGVUeXBlJiYocj1lLmRlZmF1bHRWaWV3KSx2b2lkIDA9PT1uKXJldHVybiByP3JbaV06ZVt0XTtyP3Iuc2Nyb2xsVG8obz9yLnBhZ2VYT2Zmc2V0Om4sbz9uOnIucGFnZVlPZmZzZXQpOmVbdF09bn0sdCxlLGFyZ3VtZW50cy5sZW5ndGgpfX0pLFMuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihlLG4pe1MuY3NzSG9va3Nbbl09JGUoeS5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gdD1CZShlLG4pLE1lLnRlc3QodCk/UyhlKS5wb3NpdGlvbigpW25dKyJweCI6dH0pfSksUy5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxzKXtTLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6cywiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKHIsbyl7Uy5mbltvXT1mdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGgmJihyfHwiYm9vbGVhbiIhPXR5cGVvZiBlKSxpPXJ8fCghMD09PWV8fCEwPT09dD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIHgoZSk/MD09PW8uaW5kZXhPZigib3V0ZXIiKT9lWyJpbm5lciIrYV06ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWUubm9kZVR5cGU/KHI9ZS5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoZS5ib2R5WyJzY3JvbGwiK2FdLHJbInNjcm9sbCIrYV0sZS5ib2R5WyJvZmZzZXQiK2FdLHJbIm9mZnNldCIrYV0sclsiY2xpZW50IithXSkpOnZvaWQgMD09PW4/Uy5jc3MoZSx0LGkpOlMuc3R5bGUoZSx0LG4saSl9LHMsbj9lOnZvaWQgMCxuKX19KX0pLFMuZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGUsdCl7Uy5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vbih0LGUpfX0pLFMuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vbihlLG51bGwsdCxuKX0sdW5iaW5kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub2ZmKGUsbnVsbCx0KX0sZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24odCxlLG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihlLCIqKiIpOnRoaXMub2ZmKHQsZXx8IioqIixuKX0saG92ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodHx8ZSl9fSksUy5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsbil7Uy5mbltuXT1mdW5jdGlvbihlLHQpe3JldHVybiAwPGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vbihuLG51bGwsZSx0KTp0aGlzLnRyaWdnZXIobil9fSk7dmFyIEd0PS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZztTLnByb3h5PWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKG49ZVt0XSx0PWUsZT1uKSxtKGUpKXJldHVybiByPXMuY2FsbChhcmd1bWVudHMsMiksKGk9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0fHx0aGlzLHIuY29uY2F0KHMuY2FsbChhcmd1bWVudHMpKSl9KS5ndWlkPWUuZ3VpZD1lLmd1aWR8fFMuZ3VpZCsrLGl9LFMuaG9sZFJlYWR5PWZ1bmN0aW9uKGUpe2U/Uy5yZWFkeVdhaXQrKzpTLnJlYWR5KCEwKX0sUy5pc0FycmF5PUFycmF5LmlzQXJyYXksUy5wYXJzZUpTT049SlNPTi5wYXJzZSxTLm5vZGVOYW1lPUEsUy5pc0Z1bmN0aW9uPW0sUy5pc1dpbmRvdz14LFMuY2FtZWxDYXNlPVgsUy50eXBlPXcsUy5ub3c9RGF0ZS5ub3csUy5pc051bWVyaWM9ZnVuY3Rpb24oZSl7dmFyIHQ9Uy50eXBlKGUpO3JldHVybigibnVtYmVyIj09PXR8fCJzdHJpbmciPT09dCkmJiFpc05hTihlLXBhcnNlRmxvYXQoZSkpfSxTLnRyaW09ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6KGUrIiIpLnJlcGxhY2UoR3QsIiIpfSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gU30pO3ZhciBZdD1DLmpRdWVyeSxRdD1DLiQ7cmV0dXJuIFMubm9Db25mbGljdD1mdW5jdGlvbihlKXtyZXR1cm4gQy4kPT09UyYmKEMuJD1RdCksZSYmQy5qUXVlcnk9PT1TJiYoQy5qUXVlcnk9WXQpLFN9LCJ1bmRlZmluZWQiPT10eXBlb2YgZSYmKEMualF1ZXJ5PUMuJD1TKSxTfSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAqIGpRdWVyeSBUZW1wbGF0ZXMgUGx1Z2luIDEuMC4wcHJlCiAqIGh0dHA6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdG1wbAogKiBSZXF1aXJlcyBqUXVlcnkgMS40LjIKICoKICogQ29weXJpZ2h0IFNvZnR3YXJlIEZyZWVkb20gQ29uc2VydmFuY3ksIEluYy4KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICovCihmdW5jdGlvbihhKXt2YXIgcj1hLmZuLmRvbU1hbmlwLGQ9Il90bXBsaXRlbSIscT0vXltePF0qKDxbXHdcV10rPilbXj5dKiR8XHtce1whIC8sYj17fSxmPXt9LGUscD17a2V5OjAsZGF0YTp7fX0saT0wLGM9MCxsPVtdO2Z1bmN0aW9uIGcoZyxkLGgsZSl7dmFyIGM9e2RhdGE6ZXx8KGU9PT0wfHxlPT09ZmFsc2UpP2U6ZD9kLmRhdGE6e30sX3dyYXA6ZD9kLl93cmFwOm51bGwsdG1wbDpudWxsLHBhcmVudDpkfHxudWxsLG5vZGVzOltdLGNhbGxzOnUsbmVzdDp3LHdyYXA6eCxodG1sOnYsdXBkYXRlOnR9O2cmJmEuZXh0ZW5kKGMsZyx7bm9kZXM6W10scGFyZW50OmR9KTtpZihoKXtjLnRtcGw9aDtjLl9jdG50PWMuX2N0bnR8fGMudG1wbChhLGMpO2Mua2V5PSsraTsobC5sZW5ndGg/ZjpiKVtpXT1jfXJldHVybiBjfWEuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGYsZCl7YS5mbltmXT1mdW5jdGlvbihuKXt2YXIgZz1bXSxpPWEobiksayxoLG0sbCxqPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2U9Ynx8e307aWYoaiYmai5ub2RlVHlwZT09PTExJiZqLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmaS5sZW5ndGg9PT0xKXtpW2RdKHRoaXNbMF0pO2c9dGhpc31lbHNle2ZvcihoPTAsbT1pLmxlbmd0aDtoPG07aCsrKXtjPWg7az0oaD4wP3RoaXMuY2xvbmUodHJ1ZSk6dGhpcykuZ2V0KCk7YShpW2hdKVtkXShrKTtnPWcuY29uY2F0KGspfWM9MDtnPXRoaXMucHVzaFN0YWNrKGcsZixpLnNlbGVjdG9yKX1sPWU7ZT1udWxsO2EudG1wbC5jb21wbGV0ZShsKTtyZXR1cm4gZ319KTthLmZuLmV4dGVuZCh7dG1wbDpmdW5jdGlvbihkLGMsYil7cmV0dXJuIGEudG1wbCh0aGlzWzBdLGQsYyxiKX0sdG1wbEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gYS50bXBsSXRlbSh0aGlzWzBdKX0sdGVtcGxhdGU6ZnVuY3Rpb24oYil7cmV0dXJuIGEudGVtcGxhdGUoYix0aGlzWzBdKX0sZG9tTWFuaXA6ZnVuY3Rpb24oZCxtLGspe2lmKGRbMF0mJmEuaXNBcnJheShkWzBdKSl7dmFyIGc9YS5tYWtlQXJyYXkoYXJndW1lbnRzKSxoPWRbMF0saj1oLmxlbmd0aCxpPTAsZjt3aGlsZShpPGomJiEoZj1hLmRhdGEoaFtpKytdLCJ0bXBsSXRlbSIpKSk7aWYoZiYmYylnWzJdPWZ1bmN0aW9uKGIpe2EudG1wbC5hZnRlck1hbmlwKHRoaXMsYixrKX07ci5hcHBseSh0aGlzLGcpfWVsc2Ugci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Yz0wOyFlJiZhLnRtcGwuY29tcGxldGUoYik7cmV0dXJuIHRoaXN9fSk7YS5leHRlbmQoe3RtcGw6ZnVuY3Rpb24oZCxoLGUsYyl7dmFyIGksaz0hYztpZihrKXtjPXA7ZD1hLnRlbXBsYXRlW2RdfHxhLnRlbXBsYXRlKG51bGwsZCk7Zj17fX1lbHNlIGlmKCFkKXtkPWMudG1wbDtiW2Mua2V5XT1jO2Mubm9kZXM9W107Yy53cmFwcGVkJiZuKGMsYy53cmFwcGVkKTtyZXR1cm4gYShqKGMsbnVsbCxjLnRtcGwoYSxjKSkpfWlmKCFkKXJldHVybltdO2lmKHR5cGVvZiBoPT09ImZ1bmN0aW9uIiloPWguY2FsbChjfHx7fSk7ZSYmZS53cmFwcGVkJiZuKGUsZS53cmFwcGVkKTtpPWEuaXNBcnJheShoKT9hLm1hcChoLGZ1bmN0aW9uKGEpe3JldHVybiBhP2coZSxjLGQsYSk6bnVsbH0pOltnKGUsYyxkLGgpXTtyZXR1cm4gaz9hKGooYyxudWxsLGkpKTppfSx0bXBsSXRlbTpmdW5jdGlvbihiKXt2YXIgYztpZihiIGluc3RhbmNlb2YgYSliPWJbMF07d2hpbGUoYiYmYi5ub2RlVHlwZT09PTEmJiEoYz1hLmRhdGEoYiwidG1wbEl0ZW0iKSkmJihiPWIucGFyZW50Tm9kZSkpO3JldHVybiBjfHxwfSx0ZW1wbGF0ZTpmdW5jdGlvbihjLGIpe2lmKGIpe2lmKHR5cGVvZiBiPT09InN0cmluZyIpYj1vKGIpO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIGEpYj1iWzBdfHx7fTtpZihiLm5vZGVUeXBlKWI9YS5kYXRhKGIsInRtcGwiKXx8YS5kYXRhKGIsInRtcGwiLG8oYi5pbm5lckhUTUwpKTtyZXR1cm4gdHlwZW9mIGM9PT0ic3RyaW5nIj8oYS50ZW1wbGF0ZVtjXT1iKTpifXJldHVybiBjP3R5cGVvZiBjIT09InN0cmluZyI/YS50ZW1wbGF0ZShudWxsLGMpOmEudGVtcGxhdGVbY118fGEudGVtcGxhdGUobnVsbCxxLnRlc3QoYyk/YzphKGMpKTpudWxsfSxlbmNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuKCIiK2EpLnNwbGl0KCImIikuam9pbigiJmFtcDsiKS5zcGxpdCgiPCIpLmpvaW4oIiZsdDsiKS5zcGxpdCgiPiIpLmpvaW4oIiZndDsiKS5zcGxpdCgnIicpLmpvaW4oIiYjMzQ7Iikuc3BsaXQoIiciKS5qb2luKCImIzM5OyIpfX0pO2EuZXh0ZW5kKGEudG1wbCx7dGFnOnt0bXBsOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiJpZigkbm90bnVsbF8xKXtfXz1fXy5jb25jYXQoJGl0ZW0ubmVzdCgkMSwkMikpO30ifSx3cmFwOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiIkaXRlbS5jYWxscyhfXywkMSwkMik7X189W107IixjbG9zZToiY2FsbD0kaXRlbS5jYWxscygpO19fPWNhbGwuXy5jb25jYXQoJGl0ZW0ud3JhcChjYWxsLF9fKSk7In0sZWFjaDp7X2RlZmF1bHQ6eyQyOiIkaW5kZXgsICR2YWx1ZSJ9LG9wZW46ImlmKCRub3RudWxsXzEpeyQuZWFjaCgkMWEsZnVuY3Rpb24oJDIpe3dpdGgodGhpcyl7IixjbG9zZToifX0pO30ifSwiaWYiOntvcGVuOiJpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsiLGNsb3NlOiJ9In0sImVsc2UiOntfZGVmYXVsdDp7JDE6InRydWUifSxvcGVuOiJ9ZWxzZSBpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsifSxodG1sOntvcGVuOiJpZigkbm90bnVsbF8xKXtfXy5wdXNoKCQxYSk7fSJ9LCI9Ijp7X2RlZmF1bHQ6eyQxOiIkZGF0YSJ9LG9wZW46ImlmKCRub3RudWxsXzEpe19fLnB1c2goJC5lbmNvZGUoJDFhKSk7fSJ9LCIhIjp7b3BlbjoiIn19LGNvbXBsZXRlOmZ1bmN0aW9uKCl7Yj17fX0sYWZ0ZXJNYW5pcDpmdW5jdGlvbihmLGIsZCl7dmFyIGU9Yi5ub2RlVHlwZT09PTExP2EubWFrZUFycmF5KGIuY2hpbGROb2Rlcyk6Yi5ub2RlVHlwZT09PTE/W2JdOltdO2QuY2FsbChmLGIpO20oZSk7YysrfX0pO2Z1bmN0aW9uIGooZSxnLGYpe3ZhciBiLGM9Zj9hLm1hcChmLGZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2Uua2V5P2EucmVwbGFjZSgvKDxcdyspKD89W1xzPl0pKD8hW14+XSpfdG1wbGl0ZW0pKFtePl0qKS9nLCIkMSAiK2QrJz0iJytlLmtleSsnIiAkMicpOmE6aihhLGUsYS5fY3RudCl9KTplO2lmKGcpcmV0dXJuIGM7Yz1jLmpvaW4oIiIpO2MucmVwbGFjZSgvXlxzKihbXjxcc11bXjxdKik/KDxbXHdcV10rPikoW14+XSpbXj5cc10pP1xzKiQvLGZ1bmN0aW9uKGYsYyxlLGQpe2I9YShlKS5nZXQoKTttKGIpO2lmKGMpYj1rKGMpLmNvbmNhdChiKTtpZihkKWI9Yi5jb25jYXQoayhkKSl9KTtyZXR1cm4gYj9iOmsoYyl9ZnVuY3Rpb24gayhjKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlubmVySFRNTD1jO3JldHVybiBhLm1ha2VBcnJheShiLmNoaWxkTm9kZXMpfWZ1bmN0aW9uIG8oYil7cmV0dXJuIG5ldyBGdW5jdGlvbigialF1ZXJ5IiwiJGl0ZW0iLCJ2YXIgJD1qUXVlcnksY2FsbCxfXz1bXSwkZGF0YT0kaXRlbS5kYXRhO3dpdGgoJGRhdGEpe19fLnB1c2goJyIrYS50cmltKGIpLnJlcGxhY2UoLyhbXFwnXSkvZywiXFwkMSIpLnJlcGxhY2UoL1tcclx0XG5dL2csIiAiKS5yZXBsYWNlKC9cJFx7KFteXH1dKilcfS9nLCJ7ez0gJDF9fSIpLnJlcGxhY2UoL1x7XHsoXC8/KShcdyt8LikoPzpcKCgoPzpbXlx9XXxcfSg/IVx9KSkqPyk/XCkpPyg/OlxzKyguKj8pPyk/KFwoKCg/OlteXH1dfFx9KD8hXH0pKSo/KVwpKT9ccypcfVx9L2csZnVuY3Rpb24obSxsLGssZyxiLGMsZCl7dmFyIGo9YS50bXBsLnRhZ1trXSxpLGUsZjtpZighail0aHJvdyJVbmtub3duIHRlbXBsYXRlIHRhZzogIitrO2k9ai5fZGVmYXVsdHx8W107aWYoYyYmIS9cdyQvLnRlc3QoYikpe2IrPWM7Yz0iIn1pZihiKXtiPWgoYik7ZD1kPyIsIitoKGQpKyIpIjpjPyIpIjoiIjtlPWM/Yi5pbmRleE9mKCIuIik+LTE/YitoKGMpOiIoIitiKyIpLmNhbGwoJGl0ZW0iK2Q6YjtmPWM/ZToiKHR5cGVvZigiK2IrIik9PT0nZnVuY3Rpb24nPygiK2IrIikuY2FsbCgkaXRlbSk6KCIrYisiKSkifWVsc2UgZj1lPWkuJDF8fCJudWxsIjtnPWgoZyk7cmV0dXJuIicpOyIraltsPyJjbG9zZSI6Im9wZW4iXS5zcGxpdCgiJG5vdG51bGxfMSIpLmpvaW4oYj8idHlwZW9mKCIrYisiKSE9PSd1bmRlZmluZWQnICYmICgiK2IrIikhPW51bGwiOiJ0cnVlIikuc3BsaXQoIiQxYSIpLmpvaW4oZikuc3BsaXQoIiQxIikuam9pbihlKS5zcGxpdCgiJDIiKS5qb2luKGd8fGkuJDJ8fCIiKSsiX18ucHVzaCgnIn0pKyInKTt9cmV0dXJuIF9fOyIpfWZ1bmN0aW9uIG4oYyxiKXtjLl93cmFwPWooYyx0cnVlLGEuaXNBcnJheShiKT9iOltxLnRlc3QoYik/YjphKGIpLmh0bWwoKV0pLmpvaW4oIiIpfWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGE/YS5yZXBsYWNlKC9cXCcvZywiJyIpLnJlcGxhY2UoL1xcXFwvZywiXFwiKTpudWxsfWZ1bmN0aW9uIHMoYil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5hcHBlbmRDaGlsZChiLmNsb25lTm9kZSh0cnVlKSk7cmV0dXJuIGEuaW5uZXJIVE1MfWZ1bmN0aW9uIG0obyl7dmFyIG49Il8iK2MsayxqLGw9e30sZSxwLGg7Zm9yKGU9MCxwPW8ubGVuZ3RoO2U8cDtlKyspe2lmKChrPW9bZV0pLm5vZGVUeXBlIT09MSljb250aW51ZTtqPWsuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTtmb3IoaD1qLmxlbmd0aC0xO2g+PTA7aC0tKW0oaltoXSk7bShrKX1mdW5jdGlvbiBtKGope3ZhciBwLGg9aixrLGUsbTtpZihtPWouZ2V0QXR0cmlidXRlKGQpKXt3aGlsZShoLnBhcmVudE5vZGUmJihoPWgucGFyZW50Tm9kZSkubm9kZVR5cGU9PT0xJiYhKHA9aC5nZXRBdHRyaWJ1dGUoZCkpKTtpZihwIT09bSl7aD1oLnBhcmVudE5vZGU/aC5ub2RlVHlwZT09PTExPzA6aC5nZXRBdHRyaWJ1dGUoZCl8fDA6MDtpZighKGU9YlttXSkpe2U9ZlttXTtlPWcoZSxiW2hdfHxmW2hdKTtlLmtleT0rK2k7YltpXT1lfWMmJm8obSl9ai5yZW1vdmVBdHRyaWJ1dGUoZCl9ZWxzZSBpZihjJiYoZT1hLmRhdGEoaiwidG1wbEl0ZW0iKSkpe28oZS5rZXkpO2JbZS5rZXldPWU7aD1hLmRhdGEoai5wYXJlbnROb2RlLCJ0bXBsSXRlbSIpO2g9aD9oLmtleTowfWlmKGUpe2s9ZTt3aGlsZShrJiZrLmtleSE9aCl7ay5ub2Rlcy5wdXNoKGopO2s9ay5wYXJlbnR9ZGVsZXRlIGUuX2N0bnQ7ZGVsZXRlIGUuX3dyYXA7YS5kYXRhKGosInRtcGxJdGVtIixlKX1mdW5jdGlvbiBvKGEpe2E9YStuO2U9bFthXT1sW2FdfHxnKGUsYltlLnBhcmVudC5rZXkrbl18fGUucGFyZW50KX19fWZ1bmN0aW9uIHUoYSxkLGMsYil7aWYoIWEpcmV0dXJuIGwucG9wKCk7bC5wdXNoKHtfOmEsdG1wbDpkLGl0ZW06dGhpcyxkYXRhOmMsb3B0aW9uczpifSl9ZnVuY3Rpb24gdyhkLGMsYil7cmV0dXJuIGEudG1wbChhLnRlbXBsYXRlKGQpLGMsYix0aGlzKX1mdW5jdGlvbiB4KGIsZCl7dmFyIGM9Yi5vcHRpb25zfHx7fTtjLndyYXBwZWQ9ZDtyZXR1cm4gYS50bXBsKGEudGVtcGxhdGUoYi50bXBsKSxiLmRhdGEsYyxiLml0ZW0pfWZ1bmN0aW9uIHYoZCxjKXt2YXIgYj10aGlzLl93cmFwO3JldHVybiBhLm1hcChhKGEuaXNBcnJheShiKT9iLmpvaW4oIiIpOmIpLmZpbHRlcihkfHwiKiIpLGZ1bmN0aW9uKGEpe3JldHVybiBjP2EuaW5uZXJUZXh0fHxhLnRleHRDb250ZW50OmEub3V0ZXJIVE1MfHxzKGEpfSl9ZnVuY3Rpb24gdCgpe3ZhciBiPXRoaXMubm9kZXM7YS50bXBsKG51bGwsbnVsbCxudWxsLHRoaXMpLmluc2VydEJlZm9yZShiWzBdKTthKGIpLnJlbW92ZSgpfX0pKGpRdWVyeSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiFmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImpxdWVyeSJdLGUpOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUocmVxdWlyZSgianF1ZXJ5IikpOmUoalF1ZXJ5KX0oZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1lLnRhYmxlc29ydGVyPXt2ZXJzaW9uOiIyLjMwLjUiLHBhcnNlcnM6W10sd2lkZ2V0czpbXSxkZWZhdWx0czp7dGhlbWU6ImRlZmF1bHQiLHdpZHRoRml4ZWQ6ITEsc2hvd1Byb2Nlc3Npbmc6ITEsaGVhZGVyVGVtcGxhdGU6Intjb250ZW50fSIsb25SZW5kZXJUZW1wbGF0ZTpudWxsLG9uUmVuZGVySGVhZGVyOm51bGwsY2FuY2VsU2VsZWN0aW9uOiEwLHRhYkluZGV4OiEwLGRhdGVGb3JtYXQ6Im1tZGR5eXl5Iixzb3J0TXVsdGlTb3J0S2V5OiJzaGlmdEtleSIsc29ydFJlc2V0S2V5OiJjdHJsS2V5Iix1c051bWJlckZvcm1hdDohMCxkZWxheUluaXQ6ITEsc2VydmVyU2lkZVNvcnRpbmc6ITEscmVzb3J0OiEwLGhlYWRlcnM6e30saWdub3JlQ2FzZTohMCxzb3J0Rm9yY2U6bnVsbCxzb3J0TGlzdDpbXSxzb3J0QXBwZW5kOm51bGwsc29ydFN0YWJsZTohMSxzb3J0SW5pdGlhbE9yZGVyOiJhc2MiLHNvcnRMb2NhbGVDb21wYXJlOiExLHNvcnRSZXNldDohMSxzb3J0UmVzdGFydDohMSxlbXB0eVRvOiJib3R0b20iLHN0cmluZ1RvOiJtYXgiLGR1cGxpY2F0ZVNwYW46ITAsdGV4dEV4dHJhY3Rpb246ImJhc2ljIix0ZXh0QXR0cmlidXRlOiJkYXRhLXRleHQiLHRleHRTb3J0ZXI6bnVsbCxudW1iZXJTb3J0ZXI6bnVsbCxpbml0V2lkZ2V0czohMCx3aWRnZXRDbGFzczoid2lkZ2V0LXtuYW1lfSIsd2lkZ2V0czpbXSx3aWRnZXRPcHRpb25zOnt6ZWJyYTpbImV2ZW4iLCJvZGQiXX0saW5pdGlhbGl6ZWQ6bnVsbCx0YWJsZUNsYXNzOiIiLGNzc0FzYzoiIixjc3NEZXNjOiIiLGNzc05vbmU6IiIsY3NzSGVhZGVyOiIiLGNzc0hlYWRlclJvdzoiIixjc3NQcm9jZXNzaW5nOiIiLGNzc0NoaWxkUm93OiJ0YWJsZXNvcnRlci1jaGlsZFJvdyIsY3NzSW5mb0Jsb2NrOiJ0YWJsZXNvcnRlci1pbmZvT25seSIsY3NzTm9Tb3J0OiJ0YWJsZXNvcnRlci1ub1NvcnQiLGNzc0lnbm9yZVJvdzoidGFibGVzb3J0ZXItaWdub3JlUm93Iixjc3NJY29uOiJ0YWJsZXNvcnRlci1pY29uIixjc3NJY29uTm9uZToiIixjc3NJY29uQXNjOiIiLGNzc0ljb25EZXNjOiIiLGNzc0ljb25EaXNhYmxlZDoiIixwb2ludGVyQ2xpY2s6ImNsaWNrIixwb2ludGVyRG93bjoibW91c2Vkb3duIixwb2ludGVyVXA6Im1vdXNldXAiLHNlbGVjdG9ySGVhZGVyczoiPiB0aGVhZCB0aCwgPiB0aGVhZCB0ZCIsc2VsZWN0b3JTb3J0OiJ0aCwgdGQiLHNlbGVjdG9yUmVtb3ZlOiIucmVtb3ZlLW1lIixkZWJ1ZzohMSxoZWFkZXJMaXN0OltdLGVtcHRpZXM6e30sc3RyaW5nczp7fSxwYXJzZXJzOltdLGdsb2JhbGl6ZTowLGltZ0F0dHI6MH0sY3NzOnt0YWJsZToidGFibGVzb3J0ZXIiLGNzc0hhc0NoaWxkOiJ0YWJsZXNvcnRlci1oYXNDaGlsZFJvdyIsY2hpbGRSb3c6InRhYmxlc29ydGVyLWNoaWxkUm93Iixjb2xncm91cDoidGFibGVzb3J0ZXItY29sZ3JvdXAiLGhlYWRlcjoidGFibGVzb3J0ZXItaGVhZGVyIixoZWFkZXJSb3c6InRhYmxlc29ydGVyLWhlYWRlclJvdyIsaGVhZGVySW46InRhYmxlc29ydGVyLWhlYWRlci1pbm5lciIsaWNvbjoidGFibGVzb3J0ZXItaWNvbiIscHJvY2Vzc2luZzoidGFibGVzb3J0ZXItcHJvY2Vzc2luZyIsc29ydEFzYzoidGFibGVzb3J0ZXItaGVhZGVyQXNjIixzb3J0RGVzYzoidGFibGVzb3J0ZXItaGVhZGVyRGVzYyIsc29ydE5vbmU6InRhYmxlc29ydGVyLWhlYWRlclVuU29ydGVkIn0sbGFuZ3VhZ2U6e3NvcnRBc2M6IkFzY2VuZGluZyBzb3J0IGFwcGxpZWQsICIsc29ydERlc2M6IkRlc2NlbmRpbmcgc29ydCBhcHBsaWVkLCAiLHNvcnROb25lOiJObyBzb3J0IGFwcGxpZWQsICIsc29ydERpc2FibGVkOiJzb3J0aW5nIGlzIGRpc2FibGVkIixuZXh0QXNjOiJhY3RpdmF0ZSB0byBhcHBseSBhbiBhc2NlbmRpbmcgc29ydCIsbmV4dERlc2M6ImFjdGl2YXRlIHRvIGFwcGx5IGEgZGVzY2VuZGluZyBzb3J0IixuZXh0Tm9uZToiYWN0aXZhdGUgdG8gcmVtb3ZlIHRoZSBzb3J0In0scmVnZXg6e3RlbXBsYXRlQ29udGVudDovXHtjb250ZW50XH0vZyx0ZW1wbGF0ZUljb246L1x7aWNvblx9L2csdGVtcGxhdGVOYW1lOi9ce25hbWVcfS9pLHNwYWNlczovXHMrL2csbm9uV29yZDovXFcvZyxmb3JtRWxlbWVudHM6LyhpbnB1dHxzZWxlY3R8YnV0dG9ufHRleHRhcmVhKS9pLGNodW5rOi8oXihbK1wtXT8oPzpcZCopKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPyk/JHxeMHhbMC05YS1mXSskfFxkKykvZ2ksY2h1bmtzOi8oXlxcMHxcXDAkKS8saGV4Oi9eMHhbMC05YS1mXSskL2ksY29tbWE6LywvZyxkaWdpdE5vblVTOi9bXHN8XC5dL2csZGlnaXROZWdhdGl2ZVRlc3Q6L15ccypcKFsuXGRdK1wpLyxkaWdpdE5lZ2F0aXZlUmVwbGFjZTovXlxzKlwoKFsuXGRdKylcKS8sZGlnaXRUZXN0Oi9eW1wtKyhdP1xkK1spXT8kLyxkaWdpdFJlcGxhY2U6L1ssLiciXHNdL2d9LHN0cmluZzp7bWF4OjEsbWluOi0xLGVtcHR5bWluOjEsZW1wdHltYXg6LTEsemVybzowLG5vbmU6MCwibnVsbCI6MCx0b3A6ITAsYm90dG9tOiExfSxrZXlDb2Rlczp7ZW50ZXI6MTN9LGRhdGVzOnt9LGluc3RhbmNlTWV0aG9kczp7fSxzZXR1cDpmdW5jdGlvbihyLG8pe2lmKHImJnIudEhlYWQmJjAhPT1yLnRCb2RpZXMubGVuZ3RoJiYhMCE9PXIuaGFzSW5pdGlhbGl6ZWQpe3ZhciBzPSIiLGE9ZShyKSxuPWUubWV0YWRhdGE7ci5oYXNJbml0aWFsaXplZD0hMSxyLmlzUHJvY2Vzc2luZz0hMCxyLmNvbmZpZz1vLGUuZGF0YShyLCJ0YWJsZXNvcnRlciIsbyksdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIkluaXRpYWxpemluZyB0YWJsZXNvcnRlciB2Iit0LnZlcnNpb24pLGUuZGF0YShyLCJzdGFydG92ZXJhbGx0aW1lciIsbmV3IERhdGUpKSxvLnN1cHBvcnRzRGF0YU9iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZVswXT1wYXJzZUludChlWzBdLDEwKSxlWzBdPjF8fDE9PT1lWzBdJiZwYXJzZUludChlWzFdLDEwKT49NH0oZS5mbi5qcXVlcnkuc3BsaXQoIi4iKSksby5lbXB0eVRvPW8uZW1wdHlUby50b0xvd2VyQ2FzZSgpLG8uc3RyaW5nVG89by5zdHJpbmdUby50b0xvd2VyQ2FzZSgpLG8ubGFzdD17c29ydExpc3Q6W10sY2xpY2tlZEluZGV4Oi0xfSwvdGFibGVzb3J0ZXJcLS8udGVzdChhLmF0dHIoImNsYXNzIikpfHwocz0iIiE9PW8udGhlbWU/IiB0YWJsZXNvcnRlci0iK28udGhlbWU6IiIpLG8ubmFtZXNwYWNlP28ubmFtZXNwYWNlPSIuIitvLm5hbWVzcGFjZS5yZXBsYWNlKHQucmVnZXgubm9uV29yZCwiIik6by5uYW1lc3BhY2U9Ii50YWJsZXNvcnRlciIrTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMiksby50YWJsZT1yLG8uJHRhYmxlPWEuYWRkQ2xhc3ModC5jc3MudGFibGUrIiAiK28udGFibGVDbGFzcytzKyIgIitvLm5hbWVzcGFjZS5zbGljZSgxKSkuYXR0cigicm9sZSIsImdyaWQiKSxvLiRoZWFkZXJzPWEuZmluZChvLnNlbGVjdG9ySGVhZGVycyksby4kdGFibGUuY2hpbGRyZW4oKS5jaGlsZHJlbigidHIiKS5hdHRyKCJyb2xlIiwicm93Iiksby4kdGJvZGllcz1hLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrby5jc3NJbmZvQmxvY2srIikiKS5hdHRyKHsiYXJpYS1saXZlIjoicG9saXRlIiwiYXJpYS1yZWxldmFudCI6ImFsbCJ9KSxvLiR0YWJsZS5jaGlsZHJlbigiY2FwdGlvbiIpLmxlbmd0aCYmKChzPW8uJHRhYmxlLmNoaWxkcmVuKCJjYXB0aW9uIilbMF0pLmlkfHwocy5pZD1vLm5hbWVzcGFjZS5zbGljZSgxKSsiY2FwdGlvbiIpLG8uJHRhYmxlLmF0dHIoImFyaWEtbGFiZWxsZWRieSIscy5pZCkpLG8ud2lkZ2V0SW5pdD17fSxvLnRleHRFeHRyYWN0aW9uPW8uJHRhYmxlLmF0dHIoImRhdGEtdGV4dC1leHRyYWN0aW9uIil8fG8udGV4dEV4dHJhY3Rpb258fCJiYXNpYyIsdC5idWlsZEhlYWRlcnMobyksdC5maXhDb2x1bW5XaWR0aChyKSx0LmFkZFdpZGdldEZyb21DbGFzcyhyKSx0LmFwcGx5V2lkZ2V0T3B0aW9ucyhyKSx0LnNldHVwUGFyc2VycyhvKSxvLnRvdGFsUm93cz0wLG8uZGVidWcmJnQudmFsaWRhdGVPcHRpb25zKG8pLG8uZGVsYXlJbml0fHx0LmJ1aWxkQ2FjaGUobyksdC5iaW5kRXZlbnRzKHIsby4kaGVhZGVycywhMCksdC5iaW5kTWV0aG9kcyhvKSxvLnN1cHBvcnRzRGF0YU9iamVjdCYmdm9pZCAwIT09YS5kYXRhKCkuc29ydGxpc3Q/by5zb3J0TGlzdD1hLmRhdGEoKS5zb3J0bGlzdDpuJiZhLm1ldGFkYXRhKCkmJmEubWV0YWRhdGEoKS5zb3J0bGlzdCYmKG8uc29ydExpc3Q9YS5tZXRhZGF0YSgpLnNvcnRsaXN0KSx0LmFwcGx5V2lkZ2V0KHIsITApLG8uc29ydExpc3QubGVuZ3RoPjA/dC5zb3J0T24obyxvLnNvcnRMaXN0LHt9LCFvLmluaXRXaWRnZXRzKToodC5zZXRIZWFkZXJzQ3NzKG8pLG8uaW5pdFdpZGdldHMmJnQuYXBwbHlXaWRnZXQociwhMSkpLG8uc2hvd1Byb2Nlc3NpbmcmJmEudW5iaW5kKCJzb3J0QmVnaW4iK28ubmFtZXNwYWNlKyIgc29ydEVuZCIrby5uYW1lc3BhY2UpLmJpbmQoInNvcnRCZWdpbiIrby5uYW1lc3BhY2UrIiBzb3J0RW5kIitvLm5hbWVzcGFjZSxmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoby50aW1lclByb2Nlc3NpbmcpLHQuaXNQcm9jZXNzaW5nKHIpLCJzb3J0QmVnaW4iPT09ZS50eXBlJiYoby50aW1lclByb2Nlc3Npbmc9c2V0VGltZW91dChmdW5jdGlvbigpe3QuaXNQcm9jZXNzaW5nKHIsITApfSw1MDApKX0pLHIuaGFzSW5pdGlhbGl6ZWQ9ITAsci5pc1Byb2Nlc3Npbmc9ITEsdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlLmxvZygiT3ZlcmFsbCBpbml0aWFsaXphdGlvbiB0aW1lOiIrdC5iZW5jaG1hcmsoZS5kYXRhKHIsInN0YXJ0b3ZlcmFsbHRpbWVyIikpKSx0LmRlYnVnKG8sImNvcmUiKSYmY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpKSxhLnRyaWdnZXJIYW5kbGVyKCJ0YWJsZXNvcnRlci1pbml0aWFsaXplZCIsciksImZ1bmN0aW9uIj09dHlwZW9mIG8uaW5pdGlhbGl6ZWQmJm8uaW5pdGlhbGl6ZWQocil9ZWxzZSB0LmRlYnVnKG8sImNvcmUiKSYmKHIuaGFzSW5pdGlhbGl6ZWQ/Y29uc29sZS53YXJuKCJTdG9wcGluZyBpbml0aWFsaXphdGlvbi4gVGFibGVzb3J0ZXIgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCIpOmNvbnNvbGUuZXJyb3IoIlN0b3BwaW5nIGluaXRpYWxpemF0aW9uISBObyB0YWJsZSwgdGhlYWQgb3IgdGJvZHkiLHIpKX0sYmluZE1ldGhvZHM6ZnVuY3Rpb24ocil7dmFyIG89ci4kdGFibGUscz1yLm5hbWVzcGFjZSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgYWRkUm93cyB1cGRhdGVDZWxsIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyBkZXN0cm95IG1vdXNldXAgbW91c2VsZWF2ZSAiLnNwbGl0KCIgIikuam9pbihzKyIgIik7by51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLmJpbmQoInNvcnRSZXNldCIrcyxmdW5jdGlvbihlLHIpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5zb3J0UmVzZXQodGhpcy5jb25maWcsZnVuY3Rpb24oZSl7ZS5pc0FwcGx5aW5nV2lkZ2V0cz9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5hcHBseVdpZGdldChlLCIiLHIpfSwxMDApOnQuYXBwbHlXaWRnZXQoZSwiIixyKX0pfSkuYmluZCgidXBkYXRlQWxsIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQWxsKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGUiK3MrIiB1cGRhdGVSb3dzIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGVIZWFkZXJzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZUhlYWRlcnModGhpcy5jb25maWcscil9KS5iaW5kKCJ1cGRhdGVDZWxsIitzLGZ1bmN0aW9uKGUscixvLHMpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC51cGRhdGVDZWxsKHRoaXMuY29uZmlnLHIsbyxzKX0pLmJpbmQoImFkZFJvd3MiK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFkZFJvd3ModGhpcy5jb25maWcscixvLHMpfSkuYmluZCgidXBkYXRlQ29tcGxldGUiK3MsZnVuY3Rpb24oKXt0aGlzLmlzVXBkYXRpbmc9ITF9KS5iaW5kKCJzb3J0b24iK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnNvcnRPbih0aGlzLmNvbmZpZyxyLG8scyl9KS5iaW5kKCJhcHBlbmRDYWNoZSIrcyxmdW5jdGlvbihyLG8scyl7ci5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGVuZENhY2hlKHRoaXMuY29uZmlnLHMpLGUuaXNGdW5jdGlvbihvKSYmbyh0aGlzKX0pLmJpbmQoInVwZGF0ZUNhY2hlIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQ2FjaGUodGhpcy5jb25maWcscixvKX0pLmJpbmQoImFwcGx5V2lkZ2V0SWQiK3MsZnVuY3Rpb24oZSxyKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuYXBwbHlXaWRnZXRJZCh0aGlzLHIpfSkuYmluZCgiYXBwbHlXaWRnZXRzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGx5V2lkZ2V0KHRoaXMsITEscil9KS5iaW5kKCJyZWZyZXNoV2lkZ2V0cyIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlZnJlc2hXaWRnZXRzKHRoaXMscixvKX0pLmJpbmQoInJlbW92ZVdpZGdldCIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlbW92ZVdpZGdldCh0aGlzLHIsbyl9KS5iaW5kKCJkZXN0cm95IitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuZGVzdHJveSh0aGlzLHIsbyl9KS5iaW5kKCJyZXNldFRvTG9hZFN0YXRlIitzLGZ1bmN0aW9uKG8pe28uc3RvcFByb3BhZ2F0aW9uKCksdC5yZW1vdmVXaWRnZXQodGhpcywhMCwhMSk7dmFyIHM9ZS5leHRlbmQoITAse30sci5vcmlnaW5hbFNldHRpbmdzKTsocj1lLmV4dGVuZCghMCx7fSx0LmRlZmF1bHRzLHMpKS5vcmlnaW5hbFNldHRpbmdzPXMsdGhpcy5oYXNJbml0aWFsaXplZD0hMSx0LnNldHVwKHRoaXMscil9KX0sYmluZEV2ZW50czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbj0ocj1lKHIpWzBdKS5jb25maWcsaT1uLm5hbWVzcGFjZSxsPW51bGw7ITAhPT1zJiYoby5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfaGVhZGVycyIpLChhPXQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpKS5sZW5ndGgmJiJUQUJMRSI9PT1hWzBdLm5vZGVOYW1lJiZhWzBdIT09ciYmZShhWzBdKS5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfdGFibGUiKSksYT0obi5wb2ludGVyRG93bisiICIrbi5wb2ludGVyVXArIiAiK24ucG9pbnRlckNsaWNrKyIgc29ydCBrZXl1cCAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikuc3BsaXQoIiAiKS5qb2luKGkrIiAiKSxvLmZpbmQobi5zZWxlY3RvclNvcnQpLmFkZChvLmZpbHRlcihuLnNlbGVjdG9yU29ydCkpLnVuYmluZChhKS5iaW5kKGEsZnVuY3Rpb24ocixvKXt2YXIgcyxhLGksZD1lKHIudGFyZ2V0KSxjPSIgIityLnR5cGUrIiAiO2lmKCEoMSE9PShyLndoaWNofHxyLmJ1dHRvbikmJiFjLm1hdGNoKCIgIituLnBvaW50ZXJDbGljaysiIHwgc29ydCB8IGtleXVwICIpfHwiIGtleXVwICI9PT1jJiZyLndoaWNoIT09dC5rZXlDb2Rlcy5lbnRlcnx8Yy5tYXRjaCgiICIrbi5wb2ludGVyQ2xpY2srIiAiKSYmdm9pZCAwIT09ci53aGljaHx8Yy5tYXRjaCgiICIrbi5wb2ludGVyVXArIiAiKSYmbCE9PXIudGFyZ2V0JiYhMCE9PW8pKXtpZihjLm1hdGNoKCIgIituLnBvaW50ZXJEb3duKyIgIikpcmV0dXJuIGw9ci50YXJnZXQsdm9pZCgiMSI9PT0oaT1kLmpxdWVyeS5zcGxpdCgiLiIpKVswXSYmaVsxXTw0JiZyLnByZXZlbnREZWZhdWx0KCkpO2lmKGw9bnVsbCxzPXQuZ2V0Q2xvc2VzdChlKHRoaXMpLCIuIit0LmNzcy5oZWFkZXIpLHQucmVnZXguZm9ybUVsZW1lbnRzLnRlc3Qoci50YXJnZXQubm9kZU5hbWUpfHxkLmhhc0NsYXNzKG4uY3NzTm9Tb3J0KXx8ZC5wYXJlbnRzKCIuIituLmNzc05vU29ydCkubGVuZ3RoPjB8fHMuaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHxkLnBhcmVudHMoImJ1dHRvbiIpLmxlbmd0aD4wKXJldHVybiFuLmNhbmNlbFNlbGVjdGlvbjtuLmRlbGF5SW5pdCYmdC5pc0VtcHR5T2JqZWN0KG4uY2FjaGUpJiZ0LmJ1aWxkQ2FjaGUobiksbi5sYXN0LmNsaWNrZWRJbmRleD1zLmF0dHIoImRhdGEtY29sdW1uIil8fHMuaW5kZXgoKSwoYT1uLiRoZWFkZXJJbmRleGVkW24ubGFzdC5jbGlja2VkSW5kZXhdWzBdKSYmIWEuc29ydERpc2FibGVkJiZ0LmluaXRTb3J0KG4sYSxyKX19KSxuLmNhbmNlbFNlbGVjdGlvbiYmby5hdHRyKCJ1bnNlbGVjdGFibGUiLCJvbiIpLmJpbmQoInNlbGVjdHN0YXJ0IiwhMSkuY3NzKHsidXNlci1zZWxlY3QiOiJub25lIixNb3pVc2VyU2VsZWN0OiJub25lIn0pfSxidWlsZEhlYWRlcnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG47Zm9yKHIuaGVhZGVyTGlzdD1bXSxyLmhlYWRlckNvbnRlbnQ9W10sci5zb3J0VmFycz1bXSx0LmRlYnVnKHIsImNvcmUiKSYmKGE9bmV3IERhdGUpLHIuY29sdW1ucz10LmNvbXB1dGVDb2x1bW5JbmRleChyLiR0YWJsZS5jaGlsZHJlbigidGhlYWQsIHRmb290IikuY2hpbGRyZW4oInRyIikpLHM9ci5jc3NJY29uPyc8aSBjbGFzcz0iJysoci5jc3NJY29uPT09dC5jc3MuaWNvbj90LmNzcy5pY29uOnIuY3NzSWNvbisiICIrdC5jc3MuaWNvbikrJyI+PC9pPic6IiIsci4kaGVhZGVycz1lKGUubWFwKHIuJHRhYmxlLmZpbmQoci5zZWxlY3RvckhlYWRlcnMpLGZ1bmN0aW9uKG8sYSl7dmFyIG4saSxsLGQsYyxnPWUobyk7aWYoIXQuZ2V0Q2xvc2VzdChnLCJ0ciIpLmhhc0NsYXNzKHIuY3NzSWdub3JlUm93KSlyZXR1cm4vKHRofHRkKS9pLnRlc3Qoby5ub2RlTmFtZSl8fChjPXQuZ2V0Q2xvc2VzdChnLCJ0aCwgdGQiKSxnLmF0dHIoImRhdGEtY29sdW1uIixjLmF0dHIoImRhdGEtY29sdW1uIikpKSxuPXQuZ2V0Q29sdW1uRGF0YShyLnRhYmxlLHIuaGVhZGVycyxhLCEwKSxyLmhlYWRlckNvbnRlbnRbYV09Zy5odG1sKCksIiI9PT1yLmhlYWRlclRlbXBsYXRlfHxnLmZpbmQoIi4iK3QuY3NzLmhlYWRlckluKS5sZW5ndGh8fChkPXIuaGVhZGVyVGVtcGxhdGUucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlQ29udGVudCxnLmh0bWwoKSkucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlSWNvbixnLmZpbmQoIi4iK3QuY3NzLmljb24pLmxlbmd0aD8iIjpzKSxyLm9uUmVuZGVyVGVtcGxhdGUmJihpPXIub25SZW5kZXJUZW1wbGF0ZS5hcHBseShnLFthLGRdKSkmJiJzdHJpbmciPT10eXBlb2YgaSYmKGQ9aSksZy5odG1sKCc8ZGl2IGNsYXNzPSInK3QuY3NzLmhlYWRlckluKyciPicrZCsiPC9kaXY+IikpLHIub25SZW5kZXJIZWFkZXImJnIub25SZW5kZXJIZWFkZXIuYXBwbHkoZyxbYSxyLHIuJHRhYmxlXSksbD1wYXJzZUludChnLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG8uY29sdW1uPWwsYz10LmdldE9yZGVyKHQuZ2V0RGF0YShnLG4sInNvcnRJbml0aWFsT3JkZXIiKXx8ci5zb3J0SW5pdGlhbE9yZGVyKSxyLnNvcnRWYXJzW2xdPXtjb3VudDotMSxvcmRlcjpjP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxsb2NrZWRPcmRlcjohMX0sdm9pZCAwIT09KGM9dC5nZXREYXRhKGcsbiwibG9ja2VkT3JkZXIiKXx8ITEpJiYhMSE9PWMmJihyLnNvcnRWYXJzW2xdLmxvY2tlZE9yZGVyPSEwLHIuc29ydFZhcnNbbF0ub3JkZXI9dC5nZXRPcmRlcihjKT9bMSwxXTpbMCwwXSksci5oZWFkZXJMaXN0W2FdPW8sZy5hZGRDbGFzcyh0LmNzcy5oZWFkZXIrIiAiK3IuY3NzSGVhZGVyKSx0LmdldENsb3Nlc3QoZywidHIiKS5hZGRDbGFzcyh0LmNzcy5oZWFkZXJSb3crIiAiK3IuY3NzSGVhZGVyUm93KS5hdHRyKCJyb2xlIiwicm93Iiksci50YWJJbmRleCYmZy5hdHRyKCJ0YWJpbmRleCIsMCksb30pKSxyLiRoZWFkZXJJbmRleGVkPVtdLG49MDtuPHIuY29sdW1ucztuKyspdC5pc0VtcHR5T2JqZWN0KHIuc29ydFZhcnNbbl0pJiYoci5zb3J0VmFyc1tuXT17fSksbz1yLiRoZWFkZXJzLmZpbHRlcignW2RhdGEtY29sdW1uPSInK24rJyJdJyksci4kaGVhZGVySW5kZXhlZFtuXT1vLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcigiOmxhc3QiKTpvLmZpbHRlcigiOmxhc3QiKTplKCk7ci4kdGFibGUuZmluZChyLnNlbGVjdG9ySGVhZGVycykuYXR0cih7c2NvcGU6ImNvbCIscm9sZToiY29sdW1uaGVhZGVyIn0pLHQudXBkYXRlSGVhZGVyKHIpLHQuZGVidWcociwiY29yZSIpJiYoY29uc29sZS5sb2coIkJ1aWx0IGhlYWRlcnM6Iit0LmJlbmNobWFyayhhKSksY29uc29sZS5sb2coci4kaGVhZGVycykpfSxhZGRJbnN0YW5jZU1ldGhvZHM6ZnVuY3Rpb24ocil7ZS5leHRlbmQodC5pbnN0YW5jZU1ldGhvZHMscil9LHNldHVwUGFyc2VyczpmdW5jdGlvbihlLHIpe3ZhciBvLHMsYSxuLGksbCxkLGMsZyxwLHUsZixoLG0sYj1lLnRhYmxlLHk9MCx3PXQuZGVidWcoZSwiY29yZSIpLHg9e307aWYoZS4kdGJvZGllcz1lLiR0YWJsZS5jaGlsZHJlbigidGJvZHk6bm90KC4iK2UuY3NzSW5mb0Jsb2NrKyIpIiksaD12b2lkIDA9PT1yP2UuJHRib2RpZXM6ciwwPT09KG09aC5sZW5ndGgpKXJldHVybiB3P2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgcGFyc2VyIGNhY2hlIik6IiI7Zm9yKHcmJihmPW5ldyBEYXRlLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiRGV0ZWN0aW5nIHBhcnNlcnMgZm9yIGVhY2ggY29sdW1uIikpLHM9e2V4dHJhY3RvcnM6W10scGFyc2VyczpbXX07eTxtOyl7aWYoKG89aFt5XS5yb3dzKS5sZW5ndGgpZm9yKGk9MCxuPWUuY29sdW1ucyxsPTA7bDxuO2wrKyl7aWYoKGQ9ZS4kaGVhZGVySW5kZXhlZFtpXSkmJmQubGVuZ3RoJiYoYz10LmdldENvbHVtbkRhdGEoYixlLmhlYWRlcnMsaSksdT10LmdldFBhcnNlckJ5SWQodC5nZXREYXRhKGQsYywiZXh0cmFjdG9yIikpLHA9dC5nZXRQYXJzZXJCeUlkKHQuZ2V0RGF0YShkLGMsInNvcnRlciIpKSxnPSJmYWxzZSI9PT10LmdldERhdGEoZCxjLCJwYXJzZXIiKSxlLmVtcHRpZXNbaV09KHQuZ2V0RGF0YShkLGMsImVtcHR5Iil8fGUuZW1wdHlUb3x8KGUuZW1wdHlUb0JvdHRvbT8iYm90dG9tIjoidG9wIikpLnRvTG93ZXJDYXNlKCksZS5zdHJpbmdzW2ldPSh0LmdldERhdGEoZCxjLCJzdHJpbmciKXx8ZS5zdHJpbmdUb3x8Im1heCIpLnRvTG93ZXJDYXNlKCksZyYmKHA9dC5nZXRQYXJzZXJCeUlkKCJuby1wYXJzZXIiKSksdXx8KHU9ITEpLHB8fChwPXQuZGV0ZWN0UGFyc2VyRm9yQ29sdW1uKGUsbywtMSxpKSksdyYmKHhbIigiK2krIikgIitkLnRleHQoKV09e3BhcnNlcjpwLmlkLGV4dHJhY3Rvcjp1P3UuaWQ6Im5vbmUiLHN0cmluZzplLnN0cmluZ3NbaV0sZW1wdHk6ZS5lbXB0aWVzW2ldfSkscy5wYXJzZXJzW2ldPXAscy5leHRyYWN0b3JzW2ldPXUsKGE9ZFswXS5jb2xTcGFuLTEpPjApKWZvcihpKz1hLG4rPWE7YSsxPjA7KXMucGFyc2Vyc1tpLWFdPXAscy5leHRyYWN0b3JzW2ktYV09dSxhLS07aSsrfXkrPXMucGFyc2Vycy5sZW5ndGg/bToxfXcmJih0LmlzRW1wdHlPYmplY3QoeCk/Y29uc29sZS53YXJuKCIgIE5vIHBhcnNlcnMgZGV0ZWN0ZWQhIik6Y29uc29sZVtjb25zb2xlLnRhYmxlPyJ0YWJsZSI6ImxvZyJdKHgpLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgZGV0ZWN0aW5nIHBhcnNlcnMiK3QuYmVuY2htYXJrKGYpKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpLGUucGFyc2Vycz1zLnBhcnNlcnMsZS5leHRyYWN0b3JzPXMuZXh0cmFjdG9yc30sYWRkUGFyc2VyOmZ1bmN0aW9uKGUpe3ZhciByLG89dC5wYXJzZXJzLmxlbmd0aCxzPSEwO2ZvcihyPTA7cjxvO3IrKyl0LnBhcnNlcnNbcl0uaWQudG9Mb3dlckNhc2UoKT09PWUuaWQudG9Mb3dlckNhc2UoKSYmKHM9ITEpO3MmJih0LnBhcnNlcnNbdC5wYXJzZXJzLmxlbmd0aF09ZSl9LGdldFBhcnNlckJ5SWQ6ZnVuY3Rpb24oZSl7aWYoImZhbHNlIj09ZSlyZXR1cm4hMTt2YXIgcixvPXQucGFyc2Vycy5sZW5ndGg7Zm9yKHI9MDtyPG87cisrKWlmKHQucGFyc2Vyc1tyXS5pZC50b0xvd2VyQ2FzZSgpPT09ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHQucGFyc2Vyc1tyXTtyZXR1cm4hMX0sZGV0ZWN0UGFyc2VyRm9yQ29sdW1uOmZ1bmN0aW9uKHIsbyxzLGEpe2Zvcih2YXIgbixpLGwsZD10LnBhcnNlcnMubGVuZ3RoLGM9ITEsZz0iIixwPXQuZGVidWcociwiY29yZSIpLHU9ITA7IiI9PT1nJiZ1OykobD1vWysrc10pJiZzPDUwP2wuY2xhc3NOYW1lLmluZGV4T2YodC5jc3NJZ25vcmVSb3cpPDAmJihjPW9bc10uY2VsbHNbYV0sZz10LmdldEVsZW1lbnRUZXh0KHIsYyxhKSxpPWUoYykscCYmY29uc29sZS5sb2coIkNoZWNraW5nIGlmIHZhbHVlIHdhcyBlbXB0eSBvbiByb3cgIitzKyIsIGNvbHVtbjogIithKyc6ICInK2crJyInKSk6dT0hMTtmb3IoOy0tZD49MDspaWYoKG49dC5wYXJzZXJzW2RdKSYmInRleHQiIT09bi5pZCYmbi5pcyYmbi5pcyhnLHIudGFibGUsYyxpKSlyZXR1cm4gbjtyZXR1cm4gdC5nZXRQYXJzZXJCeUlkKCJ0ZXh0Iil9LGdldEVsZW1lbnRUZXh0OmZ1bmN0aW9uKHIsbyxzKXtpZighbylyZXR1cm4iIjt2YXIgYSxuPXIudGV4dEV4dHJhY3Rpb258fCIiLGk9by5qcXVlcnk/bzplKG8pO3JldHVybiJzdHJpbmciPT10eXBlb2Ygbj8iYmFzaWMiPT09biYmdm9pZCAwIT09KGE9aS5hdHRyKHIudGV4dEF0dHJpYnV0ZSkpP2UudHJpbShhKTplLnRyaW0oby50ZXh0Q29udGVudHx8aS50ZXh0KCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP2UudHJpbShuKGlbMF0sci50YWJsZSxzKSk6ImZ1bmN0aW9uIj09dHlwZW9mKGE9dC5nZXRDb2x1bW5EYXRhKHIudGFibGUsbixzKSk/ZS50cmltKGEoaVswXSxyLnRhYmxlLHMpKTplLnRyaW0oaVswXS50ZXh0Q29udGVudHx8aS50ZXh0KCkpfSxnZXRQYXJzZWRUZXh0OmZ1bmN0aW9uKGUscixvLHMpe3ZvaWQgMD09PXMmJihzPXQuZ2V0RWxlbWVudFRleHQoZSxyLG8pKTt2YXIgYT0iIitzLG49ZS5wYXJzZXJzW29dLGk9ZS5leHRyYWN0b3JzW29dO3JldHVybiBuJiYoaSYmImZ1bmN0aW9uIj09dHlwZW9mIGkuZm9ybWF0JiYocz1pLmZvcm1hdChzLGUudGFibGUscixvKSksYT0ibm8tcGFyc2VyIj09PW4uaWQ/IiI6bi5mb3JtYXQoIiIrcyxlLnRhYmxlLHIsbyksZS5pZ25vcmVDYXNlJiYic3RyaW5nIj09dHlwZW9mIGEmJihhPWEudG9Mb3dlckNhc2UoKSkpLGF9LGJ1aWxkQ2FjaGU6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYyxnLHAsdSxmLGgsbSxiLHksdyx4LHYsQywkLEksRCxSLFQ9ci50YWJsZSxMPXIucGFyc2VycyxBPXQuZGVidWcociwiY29yZSIpO2lmKHIuJHRib2RpZXM9ci4kdGFibGUuY2hpbGRyZW4oInRib2R5Om5vdCguIityLmNzc0luZm9CbG9jaysiKSIpLGc9dm9pZCAwPT09cz9yLiR0Ym9kaWVzOnMsci5jYWNoZT17fSxyLnRvdGFsUm93cz0wLCFMKXJldHVybiBBP2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgY2FjaGUiKToiIjtmb3IoQSYmKG09bmV3IERhdGUpLHIuc2hvd1Byb2Nlc3NpbmcmJnQuaXNQcm9jZXNzaW5nKFQsITApLGM9MDtjPGcubGVuZ3RoO2MrKyl7Zm9yKHg9W10sYT1yLmNhY2hlW2NdPXtub3JtYWxpemVkOltdfSxiPWdbY10mJmdbY10ucm93cy5sZW5ndGh8fDAsbD0wO2w8YjsrK2wpaWYoeT17Y2hpbGQ6W10scmF3OltdfSxwPWUoZ1tjXS5yb3dzW2xdKSx1PVtdLCFwLmhhc0NsYXNzKHIuc2VsZWN0b3JSZW1vdmUuc2xpY2UoMSkpKWlmKHAuaGFzQ2xhc3Moci5jc3NDaGlsZFJvdykmJjAhPT1sKWZvcihEPWEubm9ybWFsaXplZC5sZW5ndGgtMSwodz1hLm5vcm1hbGl6ZWRbRF1bci5jb2x1bW5zXSkuJHJvdz13LiRyb3cuYWRkKHApLHAucHJldigpLmhhc0NsYXNzKHIuY3NzQ2hpbGRSb3cpfHxwLnByZXYoKS5hZGRDbGFzcyh0LmNzcy5jc3NIYXNDaGlsZCksZj1wLmNoaWxkcmVuKCJ0aCwgdGQiKSxEPXcuY2hpbGQubGVuZ3RoLHcuY2hpbGRbRF09W10sQz0wLEk9ci5jb2x1bW5zLGQ9MDtkPEk7ZCsrKShoPWZbZF0pJiYody5jaGlsZFtEXVtkXT10LmdldFBhcnNlZFRleHQocixoLGQpLCh2PWZbZF0uY29sU3Bhbi0xKT4wJiYoQys9dixJKz12KSksQysrO2Vsc2V7Zm9yKHkuJHJvdz1wLHkub3JkZXI9bCxDPTAsST1yLmNvbHVtbnMsZD0wO2Q8STsrK2Qpe2lmKChoPXBbMF0uY2VsbHNbZF0pJiZDPHIuY29sdW1ucyYmKCEoJD12b2lkIDAhPT1MW0NdKSYmQSYmY29uc29sZS53YXJuKCJObyBwYXJzZXIgZm91bmQgZm9yIHJvdzogIitsKyIsIGNvbHVtbjogIitkKyc7IGNlbGwgY29udGFpbmluZzogIicrZShoKS50ZXh0KCkrJyI7IGRvZXMgaXQgaGF2ZSBhIGhlYWRlcj8nKSxuPXQuZ2V0RWxlbWVudFRleHQocixoLEMpLHkucmF3W0NdPW4saT10LmdldFBhcnNlZFRleHQocixoLEMsbiksdVtDXT1pLCQmJiJudW1lcmljIj09PShMW0NdLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpJiYoeFtDXT1NYXRoLm1heChNYXRoLmFicyhpKXx8MCx4W0NdfHwwKSksKHY9aC5jb2xTcGFuLTEpPjApKXtmb3IoUj0wO1I8PXY7KWk9ci5kdXBsaWNhdGVTcGFufHwwPT09Uj9uOiJzdHJpbmciIT10eXBlb2Ygci50ZXh0RXh0cmFjdGlvbj90LmdldEVsZW1lbnRUZXh0KHIsaCxDK1IpfHwiIjoiIix5LnJhd1tDK1JdPWksdVtDK1JdPWksUisrO0MrPXYsSSs9dn1DKyt9dVtyLmNvbHVtbnNdPXksYS5ub3JtYWxpemVkW2Eubm9ybWFsaXplZC5sZW5ndGhdPXV9YS5jb2xNYXg9eCxyLnRvdGFsUm93cys9YS5ub3JtYWxpemVkLmxlbmd0aH1pZihyLnNob3dQcm9jZXNzaW5nJiZ0LmlzUHJvY2Vzc2luZyhUKSxBKXtmb3IoRD1NYXRoLm1pbig1LHIuY2FjaGVbMF0ubm9ybWFsaXplZC5sZW5ndGgpLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiQnVpbGRpbmcgY2FjaGUgZm9yICIrci50b3RhbFJvd3MrIiByb3dzIChzaG93aW5nICIrRCsiIHJvd3MgaW4gbG9nKSBhbmQgIityLmNvbHVtbnMrIiBjb2x1bW5zIit0LmJlbmNobWFyayhtKSksbj17fSxkPTA7ZDxyLmNvbHVtbnM7ZCsrKWZvcihDPTA7QzxEO0MrKyluWyJyb3c6ICIrQ118fChuWyJyb3c6ICIrQ109e30pLG5bInJvdzogIitDXVtyLiRoZWFkZXJJbmRleGVkW2RdLnRleHQoKV09ci5jYWNoZVswXS5ub3JtYWxpemVkW0NdW2RdO2NvbnNvbGVbY29uc29sZS50YWJsZT8idGFibGUiOiJsb2ciXShuKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9ZS5pc0Z1bmN0aW9uKG8pJiZvKFQpfSxnZXRDb2x1bW5UZXh0OmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG09ImZ1bmN0aW9uIj09dHlwZW9mIHMsYj0iYWxsIj09PW8seT17cmF3OltdLHBhcnNlZDpbXSwkY2VsbDpbXX0sdz0ocj1lKHIpWzBdKS5jb25maWc7aWYoIXQuaXNFbXB0eU9iamVjdCh3KSl7Zm9yKGM9dy4kdGJvZGllcy5sZW5ndGgsbj0wO248YztuKyspZm9yKGc9KGw9dy5jYWNoZVtuXS5ub3JtYWxpemVkKS5sZW5ndGgsaT0wO2k8ZztpKyspZD1sW2ldLGEmJiFkW3cuY29sdW1uc10uJHJvdy5pcyhhKXx8KGg9ITAsdT1iP2Quc2xpY2UoMCx3LmNvbHVtbnMpOmRbb10sZD1kW3cuY29sdW1uc10scD1iP2QucmF3OmQucmF3W29dLGY9Yj9kLiRyb3cuY2hpbGRyZW4oKTpkLiRyb3cuY2hpbGRyZW4oKS5lcShvKSxtJiYoaD1zKHt0Ym9keUluZGV4Om4scm93SW5kZXg6aSxwYXJzZWQ6dSxyYXc6cCwkcm93OmQuJHJvdywkY2VsbDpmfSkpLCExIT09aCYmKHkucGFyc2VkW3kucGFyc2VkLmxlbmd0aF09dSx5LnJhd1t5LnJhdy5sZW5ndGhdPXAseS4kY2VsbFt5LiRjZWxsLmxlbmd0aF09ZikpO3JldHVybiB5fXQuZGVidWcodywiY29yZSIpJiZjb25zb2xlLndhcm4oIk5vIGNhY2hlIGZvdW5kIC0gYWJvcnRpbmcgZ2V0Q29sdW1uVGV4dCBmdW5jdGlvbiEiKX0sc2V0SGVhZGVyc0NzczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ci5zb3J0TGlzdCxuPWEubGVuZ3RoLGk9dC5jc3Muc29ydE5vbmUrIiAiK3IuY3NzTm9uZSxsPVt0LmNzcy5zb3J0QXNjKyIgIityLmNzc0FzYyx0LmNzcy5zb3J0RGVzYysiICIrci5jc3NEZXNjXSxkPVtyLmNzc0ljb25Bc2Msci5jc3NJY29uRGVzYyxyLmNzc0ljb25Ob25lXSxjPVsiYXNjZW5kaW5nIiwiZGVzY2VuZGluZyJdLGc9ZnVuY3Rpb24oZSxyKXtlLnJlbW92ZUNsYXNzKGkpLmFkZENsYXNzKGxbcl0pLmF0dHIoImFyaWEtc29ydCIsY1tyXSkuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZFsyXSkuYWRkQ2xhc3MoZFtyXSl9LHA9ci4kdGFibGUuZmluZCgidGZvb3QgdHIiKS5jaGlsZHJlbigidGQsIHRoIikuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKSx1PXIuJGhlYWRlcnMuYWRkKGUoInRoZWFkICIrci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKS5hZGRDbGFzcyhpKS5hdHRyKCJhcmlhLXNvcnQiLCJub25lIikuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZC5qb2luKCIgIikpLmVuZCgpO2Zvcih1Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKGRbMl0pLHIuY3NzSWNvbkRpc2FibGVkJiZ1LmZpbHRlcigiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKHIuY3NzSWNvbkRpc2FibGVkKSxvPTA7bzxuO28rKylpZigyIT09YVtvXVsxXSl7aWYodT1yLiRoZWFkZXJzLmZpbHRlcihmdW5jdGlvbihlKXtmb3IodmFyIG89ITAscz1yLiRoZWFkZXJzLmVxKGUpLGE9cGFyc2VJbnQocy5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxuPWErdC5nZXRDbG9zZXN0KHMsInRoLCB0ZCIpWzBdLmNvbFNwYW47YTxuO2ErKylvPSEhbyYmKG98fHQuaXNWYWx1ZUluQXJyYXkoYSxyLnNvcnRMaXN0KT4tMSk7cmV0dXJuIG99KSwodT11Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcignW2RhdGEtY29sdW1uPSInK2Fbb11bMF0rJyJdJysoMT09PW4/IjpsYXN0IjoiIikpKS5sZW5ndGgpZm9yKHM9MDtzPHUubGVuZ3RoO3MrKyl1W3NdLnNvcnREaXNhYmxlZHx8Zyh1LmVxKHMpLGFbb11bMV0pO3AubGVuZ3RoJiZnKHAuZmlsdGVyKCdbZGF0YS1jb2x1bW49IicrYVtvXVswXSsnIl0nKSxhW29dWzFdKX1mb3Iobj1yLiRoZWFkZXJzLmxlbmd0aCxvPTA7bzxuO28rKyl0LnNldENvbHVtbkFyaWFMYWJlbChyLHIuJGhlYWRlcnMuZXEobykpfSxnZXRDbG9zZXN0OmZ1bmN0aW9uKHQscil7cmV0dXJuIGUuZm4uY2xvc2VzdD90LmNsb3Nlc3Qocik6dC5pcyhyKT90OnQucGFyZW50cyhyKS5maWx0ZXIoIjpmaXJzdCIpfSxzZXRDb2x1bW5BcmlhTGFiZWw6ZnVuY3Rpb24ocixvLHMpe2lmKG8ubGVuZ3RoKXt2YXIgYT1wYXJzZUludChvLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG49ci5zb3J0VmFyc1thXSxpPW8uaGFzQ2xhc3ModC5jc3Muc29ydEFzYyk/InNvcnRBc2MiOm8uaGFzQ2xhc3ModC5jc3Muc29ydERlc2MpPyJzb3J0RGVzYyI6InNvcnROb25lIixsPWUudHJpbShvLnRleHQoKSkrIjogIit0Lmxhbmd1YWdlW2ldO28uaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHwhMT09PXM/bCs9dC5sYW5ndWFnZS5zb3J0RGlzYWJsZWQ6KGk9KG4uY291bnQrMSklbi5vcmRlci5sZW5ndGgscz1uLm9yZGVyW2ldLGwrPXQubGFuZ3VhZ2VbMD09PXM/Im5leHRBc2MiOjE9PT1zPyJuZXh0RGVzYyI6Im5leHROb25lIl0pLG8uYXR0cigiYXJpYS1sYWJlbCIsbCl9fSx1cGRhdGVIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9ZS4kaGVhZGVycy5sZW5ndGg7Zm9yKHI9MDtyPGk7cisrKXM9ZS4kaGVhZGVycy5lcShyKSxhPXQuZ2V0Q29sdW1uRGF0YShuLGUuaGVhZGVycyxyLCEwKSxvPSJmYWxzZSI9PT10LmdldERhdGEocyxhLCJzb3J0ZXIiKXx8ImZhbHNlIj09PXQuZ2V0RGF0YShzLGEsInBhcnNlciIpLHQuc2V0Q29sdW1uU29ydChlLHMsbyl9LHNldENvbHVtblNvcnQ6ZnVuY3Rpb24oZSx0LHIpe3ZhciBvPWUudGFibGUuaWQ7dFswXS5zb3J0RGlzYWJsZWQ9cix0W3I/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgic29ydGVyLWZhbHNlIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsIiIrciksZS50YWJJbmRleCYmKHI/dC5yZW1vdmVBdHRyKCJ0YWJpbmRleCIpOnQuYXR0cigidGFiaW5kZXgiLCIwIikpLG8mJihyP3QucmVtb3ZlQXR0cigiYXJpYS1jb250cm9scyIpOnQuYXR0cigiYXJpYS1jb250cm9scyIsbykpfSx1cGRhdGVIZWFkZXJTb3J0Q291bnQ6ZnVuY3Rpb24ocixvKXt2YXIgcyxhLG4saSxsLGQsYyxnLHA9b3x8ci5zb3J0TGlzdCx1PXAubGVuZ3RoO2ZvcihyLnNvcnRMaXN0PVtdLGk9MDtpPHU7aSsrKWlmKGM9cFtpXSwocz1wYXJzZUludChjWzBdLDEwKSk8ci5jb2x1bW5zKXtzd2l0Y2goci5zb3J0VmFyc1tzXS5vcmRlcnx8KGc9dC5nZXRPcmRlcihyLnNvcnRJbml0aWFsT3JkZXIpP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxyLnNvcnRWYXJzW3NdLm9yZGVyPWcsci5zb3J0VmFyc1tzXS5jb3VudD0wKSxnPXIuc29ydFZhcnNbc10ub3JkZXIsYT0oIiIrY1sxXSkubWF0Y2goL14oMXxkfHN8b3xuKS8pLGE9YT9hWzBdOiIiKXtjYXNlIjEiOmNhc2UiZCI6YT0xO2JyZWFrO2Nhc2UicyI6YT1sfHwwO2JyZWFrO2Nhc2UibyI6YT0wPT09KGQ9Z1sobHx8MCklZy5sZW5ndGhdKT8xOjE9PT1kPzA6MjticmVhaztjYXNlIm4iOmE9Z1srK3Iuc29ydFZhcnNbc10uY291bnQlZy5sZW5ndGhdO2JyZWFrO2RlZmF1bHQ6YT0wfWw9MD09PWk/YTpsLG49W3MscGFyc2VJbnQoYSwxMCl8fDBdLHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPW4sYT1lLmluQXJyYXkoblsxXSxnKSxyLnNvcnRWYXJzW3NdLmNvdW50PWE+PTA/YTpuWzFdJWcubGVuZ3RofX0sdXBkYXRlQWxsOmZ1bmN0aW9uKGUscixvKXt2YXIgcz1lLnRhYmxlO3MuaXNVcGRhdGluZz0hMCx0LnJlZnJlc2hXaWRnZXRzKHMsITAsITApLHQuYnVpbGRIZWFkZXJzKGUpLHQuYmluZEV2ZW50cyhzLGUuJGhlYWRlcnMsITApLHQuYmluZE1ldGhvZHMoZSksdC5jb21tb25VcGRhdGUoZSxyLG8pfSx1cGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UudGFibGUuaXNVcGRhdGluZz0hMCx0LnVwZGF0ZUhlYWRlcihlKSx0LmNvbW1vblVwZGF0ZShlLHIsbyl9LHVwZGF0ZUhlYWRlcnM6ZnVuY3Rpb24oZSxyKXtlLnRhYmxlLmlzVXBkYXRpbmc9ITAsdC5idWlsZEhlYWRlcnMoZSksdC5iaW5kRXZlbnRzKGUudGFibGUsZS4kaGVhZGVycywhMCksdC5yZXNvcnRDb21wbGV0ZShlLHIpfSx1cGRhdGVDZWxsOmZ1bmN0aW9uKHIsbyxzLGEpe2lmKGUobykuY2xvc2VzdCgidHIiKS5oYXNDbGFzcyhyLmNzc0NoaWxkUm93KSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ1cGRhdGVDZWxsIiBmb3IgY2hpbGQgcm93IGNvbnRlbnQgaGFzIGJlZW4gZGlzYWJsZWQsIHVzZSAidXBkYXRlIiBpbnN0ZWFkJyk7ZWxzZXtpZih0LmlzRW1wdHlPYmplY3Qoci5jYWNoZSkpcmV0dXJuIHQudXBkYXRlSGVhZGVyKHIpLHZvaWQgdC5jb21tb25VcGRhdGUocixzLGEpO3IudGFibGUuaXNVcGRhdGluZz0hMCxyLiR0YWJsZS5maW5kKHIuc2VsZWN0b3JSZW1vdmUpLnJlbW92ZSgpO3ZhciBuLGksbCxkLGMsZyxwPXIuJHRib2RpZXMsdT1lKG8pLGY9cC5pbmRleCh0LmdldENsb3Nlc3QodSwidGJvZHkiKSksaD1yLmNhY2hlW2ZdLG09dC5nZXRDbG9zZXN0KHUsInRyIik7aWYobz11WzBdLHAubGVuZ3RoJiZmPj0wKXtpZihsPXAuZXEoZikuZmluZCgidHIiKS5ub3QoIi4iK3IuY3NzQ2hpbGRSb3cpLmluZGV4KG0pLGM9aC5ub3JtYWxpemVkW2xdLChnPW1bMF0uY2VsbHMubGVuZ3RoKSE9PXIuY29sdW1ucylmb3IoZD0wLG49ITEsaT0wO2k8ZztpKyspbnx8bVswXS5jZWxsc1tpXT09PW8/bj0hMDpkKz1tWzBdLmNlbGxzW2ldLmNvbFNwYW47ZWxzZSBkPXUuaW5kZXgoKTtuPXQuZ2V0RWxlbWVudFRleHQocixvLGQpLGNbci5jb2x1bW5zXS5yYXdbZF09bixuPXQuZ2V0UGFyc2VkVGV4dChyLG8sZCxuKSxjW2RdPW4sIm51bWVyaWMiPT09KHIucGFyc2Vyc1tkXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKGguY29sTWF4W2RdPU1hdGgubWF4KE1hdGguYWJzKG4pfHwwLGguY29sTWF4W2RdfHwwKSksITEhPT0obj0idW5kZWZpbmVkIiE9PXM/czpyLnJlc29ydCk/dC5jaGVja1Jlc29ydChyLG4sYSk6dC5yZXNvcnRDb21wbGV0ZShyLGEpfWVsc2UgdC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUuZXJyb3IoInVwZGF0ZUNlbGwgYWJvcnRlZCwgdGJvZHkgbWlzc2luZyBvciBub3Qgd2l0aGluIHRoZSBpbmRpY2F0ZWQgdGFibGUiKSxyLnRhYmxlLmlzVXBkYXRpbmc9ITF9fSxhZGRSb3dzOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG0sYix5LHc9InN0cmluZyI9PXR5cGVvZiBvJiYxPT09ci4kdGJvZGllcy5sZW5ndGgmJi88dHIvLnRlc3Qob3x8IiIpLHg9ci50YWJsZTtpZih3KW89ZShvKSxyLiR0Ym9kaWVzLmFwcGVuZChvKTtlbHNlIGlmKCEobyYmbyBpbnN0YW5jZW9mIGUmJnQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpWzBdPT09ci50YWJsZSkpcmV0dXJuIHQuZGVidWcociwiY29yZSIpJiZjb25zb2xlLmVycm9yKCJhZGRSb3dzIG1ldGhvZCByZXF1aXJlcyAoMSkgYSBqUXVlcnkgc2VsZWN0b3IgcmVmZXJlbmNlIHRvIHJvd3MgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgdGFibGUsIG9yICgyKSByb3cgSFRNTCBzdHJpbmcgdG8gYmUgYWRkZWQgdG8gYSB0YWJsZSB3aXRoIG9ubHkgb25lIHRib2R5IiksITE7aWYoeC5pc1VwZGF0aW5nPSEwLHQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSl0LnVwZGF0ZUhlYWRlcihyKSx0LmNvbW1vblVwZGF0ZShyLHMsYSk7ZWxzZXtmb3IoYz1vLmZpbHRlcigidHIiKS5hdHRyKCJyb2xlIiwicm93IikubGVuZ3RoLGw9ci4kdGJvZGllcy5pbmRleChvLnBhcmVudHMoInRib2R5IikuZmlsdGVyKCI6Zmlyc3QiKSksci5wYXJzZXJzJiZyLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhyKSxkPTA7ZDxjO2QrKyl7Zm9yKGY9MCxwPW9bZF0uY2VsbHMubGVuZ3RoLHU9ci5jYWNoZVtsXS5ub3JtYWxpemVkLmxlbmd0aCxtPVtdLGg9e2NoaWxkOltdLHJhdzpbXSwkcm93Om8uZXEoZCksb3JkZXI6dX0sZz0wO2c8cDtnKyspYj1vW2RdLmNlbGxzW2ddLG49dC5nZXRFbGVtZW50VGV4dChyLGIsZiksaC5yYXdbZl09bixpPXQuZ2V0UGFyc2VkVGV4dChyLGIsZixuKSxtW2ZdPWksIm51bWVyaWMiPT09KHIucGFyc2Vyc1tmXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKHIuY2FjaGVbbF0uY29sTWF4W2ZdPU1hdGgubWF4KE1hdGguYWJzKGkpfHwwLHIuY2FjaGVbbF0uY29sTWF4W2ZdfHwwKSksKHk9Yi5jb2xTcGFuLTEpPjAmJihmKz15KSxmKys7bVtyLmNvbHVtbnNdPWgsci5jYWNoZVtsXS5ub3JtYWxpemVkW3VdPW19dC5jaGVja1Jlc29ydChyLHMsYSl9fSx1cGRhdGVDYWNoZTpmdW5jdGlvbihlLHIsbyl7ZS5wYXJzZXJzJiZlLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhlLG8pLHQuYnVpbGRDYWNoZShlLHIsbyl9LGFwcGVuZENhY2hlOmZ1bmN0aW9uKGUscil7dmFyIG8scyxhLG4saSxsLGQsYz1lLnRhYmxlLGc9ZS4kdGJvZGllcyxwPVtdLHU9ZS5jYWNoZTtpZih0LmlzRW1wdHlPYmplY3QodSkpcmV0dXJuIGUuYXBwZW5kZXI/ZS5hcHBlbmRlcihjLHApOmMuaXNVcGRhdGluZz9lLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpOiIiO2Zvcih0LmRlYnVnKGUsImNvcmUiKSYmKGQ9bmV3IERhdGUpLGw9MDtsPGcubGVuZ3RoO2wrKylpZigoYT1nLmVxKGwpKS5sZW5ndGgpe2ZvcihuPXQucHJvY2Vzc1Rib2R5KGMsYSwhMCkscz0obz11W2xdLm5vcm1hbGl6ZWQpLmxlbmd0aCxpPTA7aTxzO2krKylwW3AubGVuZ3RoXT1vW2ldW2UuY29sdW1uc10uJHJvdyxlLmFwcGVuZGVyJiYoIWUucGFnZXJ8fGUucGFnZXIucmVtb3ZlUm93c3x8ZS5wYWdlci5hamF4KXx8bi5hcHBlbmQob1tpXVtlLmNvbHVtbnNdLiRyb3cpO3QucHJvY2Vzc1Rib2R5KGMsbiwhMSl9ZS5hcHBlbmRlciYmZS5hcHBlbmRlcihjLHApLHQuZGVidWcoZSwiY29yZSIpJiZjb25zb2xlLmxvZygiUmVidWlsdCB0YWJsZSIrdC5iZW5jaG1hcmsoZCkpLHJ8fGUuYXBwZW5kZXJ8fHQuYXBwbHlXaWRnZXQoYyksYy5pc1VwZGF0aW5nJiZlLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpfSxjb21tb25VcGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UuJHRhYmxlLmZpbmQoZS5zZWxlY3RvclJlbW92ZSkucmVtb3ZlKCksdC5zZXR1cFBhcnNlcnMoZSksdC5idWlsZENhY2hlKGUpLHQuY2hlY2tSZXNvcnQoZSxyLG8pfSxpbml0U29ydDpmdW5jdGlvbihyLG8scyl7aWYoci50YWJsZS5pc1VwZGF0aW5nKXJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0U29ydChyLG8scyl9LDUwKTt2YXIgYSxuLGksbCxkLGMsZyxwPSFzW3Iuc29ydE11bHRpU29ydEtleV0sdT1yLnRhYmxlLGY9ci4kaGVhZGVycy5sZW5ndGgsaD10LmdldENsb3Nlc3QoZShvKSwidGgsIHRkIiksbT1wYXJzZUludChoLmF0dHIoImRhdGEtY29sdW1uIiksMTApLGI9ci5zb3J0VmFyc1ttXS5vcmRlcjtpZihoPWhbMF0sci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsdSksYz0oci5zb3J0VmFyc1ttXS5jb3VudCsxKSViLmxlbmd0aCxyLnNvcnRWYXJzW21dLmNvdW50PXNbci5zb3J0UmVzZXRLZXldPzI6YyxyLnNvcnRSZXN0YXJ0KWZvcihpPTA7aTxmO2krKylnPXIuJGhlYWRlcnMuZXEoaSksbSE9PShjPXBhcnNlSW50KGcuYXR0cigiZGF0YS1jb2x1bW4iKSwxMCkpJiYocHx8Zy5oYXNDbGFzcyh0LmNzcy5zb3J0Tm9uZSkpJiYoci5zb3J0VmFyc1tjXS5jb3VudD0tMSk7aWYocCl7aWYoci5zb3J0TGlzdD1bXSxyLmxhc3Quc29ydExpc3Q9W10sbnVsbCE9PXIuc29ydEZvcmNlKWZvcihhPXIuc29ydEZvcmNlLG49MDtuPGEubGVuZ3RoO24rKylhW25dWzBdIT09bSYmKHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPWFbbl0pO2lmKChsPWJbci5zb3J0VmFyc1ttXS5jb3VudF0pPDImJihyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1bbSxsXSxoLmNvbFNwYW4+MSkpZm9yKG49MTtuPGguY29sU3BhbjtuKyspci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20rbixsXSxyLnNvcnRWYXJzW20rbl0uY291bnQ9ZS5pbkFycmF5KGwsYil9ZWxzZSBpZihyLnNvcnRMaXN0PWUuZXh0ZW5kKFtdLHIubGFzdC5zb3J0TGlzdCksdC5pc1ZhbHVlSW5BcnJheShtLHIuc29ydExpc3QpPj0wKWZvcihuPTA7bjxyLnNvcnRMaXN0Lmxlbmd0aDtuKyspKGM9ci5zb3J0TGlzdFtuXSlbMF09PT1tJiYoY1sxXT1iW3Iuc29ydFZhcnNbbV0uY291bnRdLDI9PT1jWzFdJiYoci5zb3J0TGlzdC5zcGxpY2UobiwxKSxyLnNvcnRWYXJzW21dLmNvdW50PS0xKSk7ZWxzZSBpZigobD1iW3Iuc29ydFZhcnNbbV0uY291bnRdKTwyJiYoci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20sbF0saC5jb2xTcGFuPjEpKWZvcihuPTE7bjxoLmNvbFNwYW47bisrKXIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVttK24sbF0sci5zb3J0VmFyc1ttK25dLmNvdW50PWUuaW5BcnJheShsLGIpO2lmKHIubGFzdC5zb3J0TGlzdD1lLmV4dGVuZChbXSxyLnNvcnRMaXN0KSxyLnNvcnRMaXN0Lmxlbmd0aCYmci5zb3J0QXBwZW5kJiYoYT1lLmlzQXJyYXkoci5zb3J0QXBwZW5kKT9yLnNvcnRBcHBlbmQ6ci5zb3J0QXBwZW5kW3Iuc29ydExpc3RbMF1bMF1dLCF0LmlzRW1wdHlPYmplY3QoYSkpKWZvcihuPTA7bjxhLmxlbmd0aDtuKyspaWYoYVtuXVswXSE9PW0mJnQuaXNWYWx1ZUluQXJyYXkoYVtuXVswXSxyLnNvcnRMaXN0KTwwKXtpZihsPWFbbl1bMV0sZD0oIiIrbCkubWF0Y2goL14oYXxkfHN8b3xuKS8pKXN3aXRjaChjPXIuc29ydExpc3RbMF1bMV0sZFswXSl7Y2FzZSJkIjpsPTE7YnJlYWs7Y2FzZSJzIjpsPWM7YnJlYWs7Y2FzZSJvIjpsPTA9PT1jPzE6MDticmVhaztjYXNlIm4iOmw9KGMrMSklYi5sZW5ndGg7YnJlYWs7ZGVmYXVsdDpsPTB9ci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W2Fbbl1bMF0sbF19ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRCZWdpbiIsdSksc2V0VGltZW91dChmdW5jdGlvbigpe3Quc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVmb3JlRW5kIix1KSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEVuZCIsdSl9LDEpfSxtdWx0aXNvcnQ6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9W10sbD0wLGQ9ZS50ZXh0U29ydGVyfHwiIixjPWUuc29ydExpc3QsZz1jLmxlbmd0aCxwPWUuJHRib2RpZXMubGVuZ3RoO2lmKCFlLnNlcnZlclNpZGVTb3J0aW5nJiYhdC5pc0VtcHR5T2JqZWN0KGUuY2FjaGUpKXtpZih0LmRlYnVnKGUsImNvcmUiKSYmKG89bmV3IERhdGUpLCJvYmplY3QiPT10eXBlb2YgZClmb3Iocz1lLmNvbHVtbnM7cy0tOykiZnVuY3Rpb24iPT10eXBlb2YoYT10LmdldENvbHVtbkRhdGEobixkLHMpKSYmKGlbc109YSk7Zm9yKHI9MDtyPHA7cisrKXM9ZS5jYWNoZVtyXS5jb2xNYXgsZS5jYWNoZVtyXS5ub3JtYWxpemVkLnNvcnQoZnVuY3Rpb24ocixvKXt2YXIgYSxwLHUsZixoLG0sYjtmb3IoYT0wO2E8ZzthKyspe2lmKHU9Y1thXVswXSxmPWNbYV1bMV0sbD0wPT09ZixlLnNvcnRTdGFibGUmJnJbdV09PT1vW3VdJiYxPT09ZylyZXR1cm4gcltlLmNvbHVtbnNdLm9yZGVyLW9bZS5jb2x1bW5zXS5vcmRlcjtpZihwPS9uL2kudGVzdCh0LmdldFNvcnRUeXBlKGUucGFyc2Vycyx1KSkscCYmZS5zdHJpbmdzW3VdPyhwPSJib29sZWFuIj09dHlwZW9mIHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/KGw/MTotMSkqKHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/LTE6MSk6ZS5zdHJpbmdzW3VdP3Quc3RyaW5nW2Uuc3RyaW5nc1t1XV18fDA6MCxoPWUubnVtYmVyU29ydGVyP2UubnVtYmVyU29ydGVyKHJbdV0sb1t1XSxsLHNbdV0sbik6dFsic29ydE51bWVyaWMiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSxwLHNbdV0sdSxlKSk6KG09bD9yOm8sYj1sP286cixoPSJmdW5jdGlvbiI9PXR5cGVvZiBkP2QobVt1XSxiW3VdLGwsdSxuKToiZnVuY3Rpb24iPT10eXBlb2YgaVt1XT9pW3VdKG1bdV0sYlt1XSxsLHUsbik6dFsic29ydE5hdHVyYWwiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSx1LGUpKSxoKXJldHVybiBofXJldHVybiByW2UuY29sdW1uc10ub3JkZXItb1tlLmNvbHVtbnNdLm9yZGVyfSk7dC5kZWJ1ZyhlLCJjb3JlIikmJmNvbnNvbGUubG9nKCJBcHBseWluZyBzb3J0ICIrYy50b1N0cmluZygpK3QuYmVuY2htYXJrKG8pKX19LHJlc29ydENvbXBsZXRlOmZ1bmN0aW9uKHQscil7dC50YWJsZS5pc1VwZGF0aW5nJiZ0LiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLHQudGFibGUpLGUuaXNGdW5jdGlvbihyKSYmcih0LnRhYmxlKX0sY2hlY2tSZXNvcnQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhPWUuaXNBcnJheShvKT9vOnIuc29ydExpc3Q7ITE9PT0odm9pZCAwPT09bz9yLnJlc29ydDpvKXx8ci5zZXJ2ZXJTaWRlU29ydGluZ3x8ci50YWJsZS5pc1Byb2Nlc3Npbmc/KHQucmVzb3J0Q29tcGxldGUocixzKSx0LmFwcGx5V2lkZ2V0KHIudGFibGUsITEpKTphLmxlbmd0aD90LnNvcnRPbihyLGEsZnVuY3Rpb24oKXt0LnJlc29ydENvbXBsZXRlKHIscyl9LCEwKTp0LnNvcnRSZXNldChyLGZ1bmN0aW9uKCl7dC5yZXNvcnRDb21wbGV0ZShyLHMpLHQuYXBwbHlXaWRnZXQoci50YWJsZSwhMSl9KX0sc29ydE9uOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuPXIudGFibGU7ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsbiksdC51cGRhdGVIZWFkZXJTb3J0Q291bnQocixvKSx0LnNldEhlYWRlcnNDc3Mociksci5kZWxheUluaXQmJnQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSYmdC5idWlsZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVnaW4iLG4pLHQubXVsdGlzb3J0KHIpLHQuYXBwZW5kQ2FjaGUocixhKSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEJlZm9yZUVuZCIsbiksci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRFbmQiLG4pLHQuYXBwbHlXaWRnZXQobiksZS5pc0Z1bmN0aW9uKHMpJiZzKG4pfSxzb3J0UmVzZXQ6ZnVuY3Rpb24ocixvKXtyLnNvcnRMaXN0PVtdLHQuc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpO3ZhciBzO2ZvcihzPTA7czxyLmNvbHVtbnM7cysrKXIuc29ydFZhcnNbc10uY291bnQ9LTE7ZS5pc0Z1bmN0aW9uKG8pJiZvKHIudGFibGUpfSxnZXRTb3J0VHlwZTpmdW5jdGlvbihlLHQpe3JldHVybiBlJiZlW3RdP2VbdF0udHlwZXx8IiI6IiJ9LGdldE9yZGVyOmZ1bmN0aW9uKGUpe3JldHVybi9eZC9pLnRlc3QoZSl8fDE9PT1lfSxzb3J0TmF0dXJhbDpmdW5jdGlvbihlLHIpe2lmKGU9PT1yKXJldHVybiAwO2U9ZS50b1N0cmluZygpLHI9ci50b1N0cmluZygpO3ZhciBvLHMsYSxuLGksbCxkPXQucmVnZXg7aWYoZC5oZXgudGVzdChyKSl7aWYobz1wYXJzZUludCgoZXx8IiIpLm1hdGNoKGQuaGV4KSwxNikscz1wYXJzZUludCgocnx8IiIpLm1hdGNoKGQuaGV4KSwxNiksbzxzKXJldHVybi0xO2lmKG8+cylyZXR1cm4gMX1mb3Iobz0oZXx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIikscz0ocnx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIiksbD1NYXRoLm1heChvLmxlbmd0aCxzLmxlbmd0aCksaT0wO2k8bDtpKyspe2lmKGE9aXNOYU4ob1tpXSk/b1tpXXx8MDpwYXJzZUZsb2F0KG9baV0pfHwwLG49aXNOYU4oc1tpXSk/c1tpXXx8MDpwYXJzZUZsb2F0KHNbaV0pfHwwLGlzTmFOKGEpIT09aXNOYU4obikpcmV0dXJuIGlzTmFOKGEpPzE6LTE7aWYodHlwZW9mIGEhPXR5cGVvZiBuJiYoYSs9IiIsbis9IiIpLGE8bilyZXR1cm4tMTtpZihhPm4pcmV0dXJuIDF9cmV0dXJuIDB9LHNvcnROYXR1cmFsQXNjOmZ1bmN0aW9uKGUscixvLHMpe2lmKGU9PT1yKXJldHVybiAwO3ZhciBhPXQuc3RyaW5nW3MuZW1wdGllc1tvXXx8cy5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8tMToxOi1hfHwtMToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOmF8fDE6dC5zb3J0TmF0dXJhbChlLHIpfSxzb3J0TmF0dXJhbERlc2M6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGE9dC5zdHJpbmdbcy5lbXB0aWVzW29dfHxzLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWE/ImJvb2xlYW4iPT10eXBlb2YgYT9hPy0xOjE6YXx8MToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOi1hfHwtMTp0LnNvcnROYXR1cmFsKHIsZSl9LHNvcnRUZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+dD8xOmU8dD8tMTowfSxnZXRUZXh0VmFsdWU6ZnVuY3Rpb24oZSx0LHIpe2lmKHIpe3ZhciBvLHM9ZT9lLmxlbmd0aDowLGE9cit0O2ZvcihvPTA7bzxzO28rKylhKz1lLmNoYXJDb2RlQXQobyk7cmV0dXJuIHQqYX1yZXR1cm4gMH0sc29ydE51bWVyaWNBc2M6ZnVuY3Rpb24oZSxyLG8scyxhLG4pe2lmKGU9PT1yKXJldHVybiAwO3ZhciBpPXQuc3RyaW5nW24uZW1wdGllc1thXXx8bi5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8tMToxOi1pfHwtMToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOml8fDE6KGlzTmFOKGUpJiYoZT10LmdldFRleHRWYWx1ZShlLG8scykpLGlzTmFOKHIpJiYocj10LmdldFRleHRWYWx1ZShyLG8scykpLGUtcil9LHNvcnROdW1lcmljRGVzYzpmdW5jdGlvbihlLHIsbyxzLGEsbil7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGk9dC5zdHJpbmdbbi5lbXB0aWVzW2FdfHxuLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWk/ImJvb2xlYW4iPT10eXBlb2YgaT9pPy0xOjE6aXx8MToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOi1pfHwtMTooaXNOYU4oZSkmJihlPXQuZ2V0VGV4dFZhbHVlKGUsbyxzKSksaXNOYU4ocikmJihyPXQuZ2V0VGV4dFZhbHVlKHIsbyxzKSksci1lKX0sc29ydE51bWVyaWM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS10fSxhZGRXaWRnZXQ6ZnVuY3Rpb24oZSl7ZS5pZCYmIXQuaXNFbXB0eU9iamVjdCh0LmdldFdpZGdldEJ5SWQoZS5pZCkpJiZjb25zb2xlLndhcm4oJyInK2UuaWQrJyIgd2lkZ2V0IHdhcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UhJyksdC53aWRnZXRzW3Qud2lkZ2V0cy5sZW5ndGhdPWV9LGhhc1dpZGdldDpmdW5jdGlvbih0LHIpe3JldHVybih0PWUodCkpLmxlbmd0aCYmdFswXS5jb25maWcmJnRbMF0uY29uZmlnLndpZGdldEluaXRbcl18fCExfSxnZXRXaWRnZXRCeUlkOmZ1bmN0aW9uKGUpe3ZhciByLG8scz10LndpZGdldHMubGVuZ3RoO2ZvcihyPTA7cjxzO3IrKylpZigobz10LndpZGdldHNbcl0pJiZvLmlkJiZvLmlkLnRvTG93ZXJDYXNlKCk9PT1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIG99LGFwcGx5V2lkZ2V0T3B0aW9uczpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbj1yLmNvbmZpZyxpPW4ud2lkZ2V0cy5sZW5ndGg7aWYoaSlmb3Iobz0wO288aTtvKyspKHM9dC5nZXRXaWRnZXRCeUlkKG4ud2lkZ2V0c1tvXSkpJiZzLm9wdGlvbnMmJihhPWUuZXh0ZW5kKCEwLHt9LHMub3B0aW9ucyksbi53aWRnZXRPcHRpb25zPWUuZXh0ZW5kKCEwLGEsbi53aWRnZXRPcHRpb25zKSxlLmV4dGVuZCghMCx0LmRlZmF1bHRzLndpZGdldE9wdGlvbnMscy5vcHRpb25zKSl9LGFkZFdpZGdldEZyb21DbGFzczpmdW5jdGlvbihlKXt2YXIgcixvLHM9ZS5jb25maWcsYT0iXiIrcy53aWRnZXRDbGFzcy5yZXBsYWNlKHQucmVnZXgudGVtcGxhdGVOYW1lLCIoXFxTKykrIikrIiQiLG49bmV3IFJlZ0V4cChhLCJnIiksaT0oZS5jbGFzc05hbWV8fCIiKS5zcGxpdCh0LnJlZ2V4LnNwYWNlcyk7aWYoaS5sZW5ndGgpZm9yKHI9aS5sZW5ndGgsbz0wO288cjtvKyspaVtvXS5tYXRjaChuKSYmKHMud2lkZ2V0c1tzLndpZGdldHMubGVuZ3RoXT1pW29dLnJlcGxhY2UobiwiJDEiKSl9LGFwcGx5V2lkZ2V0SWQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsPShyPWUocilbMF0pLmNvbmZpZyxkPWwud2lkZ2V0T3B0aW9ucyxjPXQuZGVidWcobCwiY29yZSIpLGc9dC5nZXRXaWRnZXRCeUlkKG8pO2cmJihpPWcuaWQsYT0hMSxlLmluQXJyYXkoaSxsLndpZGdldHMpPDAmJihsLndpZGdldHNbbC53aWRnZXRzLmxlbmd0aF09aSksYyYmKG49bmV3IERhdGUpLCFzJiZsLndpZGdldEluaXRbaV18fChsLndpZGdldEluaXRbaV09ITAsci5oYXNJbml0aWFsaXplZCYmdC5hcHBseVdpZGdldE9wdGlvbnMociksImZ1bmN0aW9uIj09dHlwZW9mIGcuaW5pdCYmKGE9ITAsYyYmY29uc29sZVtjb25zb2xlLmdyb3VwPyJncm91cCI6ImxvZyJdKCJJbml0aWFsaXppbmcgIitpKyIgd2lkZ2V0IiksZy5pbml0KHIsZyxsLGQpKSksc3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGcuZm9ybWF0fHwoYT0hMCxjJiZjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIlVwZGF0aW5nICIraSsiIHdpZGdldCIpLGcuZm9ybWF0KHIsbCxkLCExKSksYyYmYSYmKGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisocz8iaW5pdGlhbGl6aW5nICI6ImFwcGx5aW5nICIpK2krIiB3aWRnZXQiK3QuYmVuY2htYXJrKG4pKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpKX0sYXBwbHlXaWRnZXQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYz0ocj1lKHIpWzBdKS5jb25maWcsZz10LmRlYnVnKGMsImNvcmUiKSxwPVtdO2lmKCExPT09b3x8IXIuaGFzSW5pdGlhbGl6ZWR8fCFyLmlzQXBwbHlpbmdXaWRnZXRzJiYhci5pc1VwZGF0aW5nKXtpZihnJiYoZD1uZXcgRGF0ZSksdC5hZGRXaWRnZXRGcm9tQ2xhc3MociksY2xlYXJUaW1lb3V0KGMudGltZXJSZWFkeSksYy53aWRnZXRzLmxlbmd0aCl7Zm9yKHIuaXNBcHBseWluZ1dpZGdldHM9ITAsYy53aWRnZXRzPWUuZ3JlcChjLndpZGdldHMsZnVuY3Rpb24odCxyKXtyZXR1cm4gZS5pbkFycmF5KHQsYy53aWRnZXRzKT09PXJ9KSxuPShpPWMud2lkZ2V0c3x8W10pLmxlbmd0aCxhPTA7YTxuO2ErKykobD10LmdldFdpZGdldEJ5SWQoaVthXSkpJiZsLmlkPyhsLnByaW9yaXR5fHwobC5wcmlvcml0eT0xMCkscFthXT1sKTpnJiZjb25zb2xlLndhcm4oJyInK2lbYV0rJyIgd2FzIGVuYWJsZWQsIGJ1dCB0aGUgd2lkZ2V0IGNvZGUgaGFzIG5vdCBiZWVuIGxvYWRlZCEnKTtmb3IocC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucHJpb3JpdHk8dC5wcmlvcml0eT8tMTplLnByaW9yaXR5PT09dC5wcmlvcml0eT8wOjF9KSxuPXAubGVuZ3RoLGcmJmNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiU3RhcnQgIisobz8iaW5pdGlhbGl6aW5nIjoiYXBwbHlpbmciKSsiIHdpZGdldHMiKSxhPTA7YTxuO2ErKykobD1wW2FdKSYmbC5pZCYmdC5hcHBseVdpZGdldElkKHIsbC5pZCxvKTtnJiZjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9Yy50aW1lclJlYWR5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmlzQXBwbHlpbmdXaWRnZXRzPSExLGUuZGF0YShyLCJsYXN0V2lkZ2V0QXBwbGljYXRpb24iLG5ldyBEYXRlKSxjLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidGFibGVzb3J0ZXItcmVhZHkiKSxvfHwiZnVuY3Rpb24iIT10eXBlb2Ygc3x8cyhyKSxnJiYobD1jLndpZGdldHMubGVuZ3RoLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisoITA9PT1vPyJpbml0aWFsaXppbmcgIjoiYXBwbHlpbmcgIikrbCsiIHdpZGdldCIrKDEhPT1sPyJzIjoiIikrdC5iZW5jaG1hcmsoZCkpKX0sMTApfX0scmVtb3ZlV2lkZ2V0OmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbCxkPShyPWUocilbMF0pLmNvbmZpZztpZighMD09PW8pZm9yKG89W10sbD10LndpZGdldHMubGVuZ3RoLGk9MDtpPGw7aSsrKShuPXQud2lkZ2V0c1tpXSkmJm4uaWQmJihvW28ubGVuZ3RoXT1uLmlkKTtlbHNlIG89KGUuaXNBcnJheShvKT9vLmpvaW4oIiwiKTpvfHwiIikudG9Mb3dlckNhc2UoKS5zcGxpdCgvW1xzLF0rLyk7Zm9yKGw9by5sZW5ndGgsYT0wO2E8bDthKyspbj10LmdldFdpZGdldEJ5SWQob1thXSksKGk9ZS5pbkFycmF5KG9bYV0sZC53aWRnZXRzKSk+PTAmJiEwIT09cyYmZC53aWRnZXRzLnNwbGljZShpLDEpLG4mJm4ucmVtb3ZlJiYodC5kZWJ1ZyhkLCJjb3JlIikmJmNvbnNvbGUubG9nKChzPyJSZWZyZXNoaW5nIjoiUmVtb3ZpbmciKSsnICInK29bYV0rJyIgd2lkZ2V0Jyksbi5yZW1vdmUocixkLGQud2lkZ2V0T3B0aW9ucyxzKSxkLndpZGdldEluaXRbb1thXV09ITEpO2QuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJ3aWRnZXRSZW1vdmVFbmQiLHIpfSxyZWZyZXNoV2lkZ2V0czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbixpPShyPWUocilbMF0pLmNvbmZpZy53aWRnZXRzLGw9dC53aWRnZXRzLGQ9bC5sZW5ndGgsYz1bXSxnPWZ1bmN0aW9uKHQpe2UodCkudHJpZ2dlckhhbmRsZXIoInJlZnJlc2hDb21wbGV0ZSIpfTtmb3IoYT0wO2E8ZDthKyspKG49bFthXSkmJm4uaWQmJihvfHxlLmluQXJyYXkobi5pZCxpKTwwKSYmKGNbYy5sZW5ndGhdPW4uaWQpO3QucmVtb3ZlV2lkZ2V0KHIsYy5qb2luKCIsIiksITApLCEwIT09cz8odC5hcHBseVdpZGdldChyLG98fCExLGcpLG8mJnQuYXBwbHlXaWRnZXQociwhMSxnKSk6ZyhyKX0sYmVuY2htYXJrOmZ1bmN0aW9uKGUpe3JldHVybiIgKCIrKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWUuZ2V0VGltZSgpKSsiIG1zKSJ9LGxvZzpmdW5jdGlvbigpe2NvbnNvbGUubG9nKGFyZ3VtZW50cyl9LGRlYnVnOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJighMD09PWUuZGVidWd8fCJzdHJpbmciPT10eXBlb2YgZS5kZWJ1ZyYmZS5kZWJ1Zy5pbmRleE9mKHQpPi0xKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0saXNWYWx1ZUluQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgcixvPXQmJnQubGVuZ3RofHwwO2ZvcihyPTA7cjxvO3IrKylpZih0W3JdWzBdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX0sZm9ybWF0RmxvYXQ6ZnVuY3Rpb24ocixvKXtpZigic3RyaW5nIiE9dHlwZW9mIHJ8fCIiPT09cilyZXR1cm4gcjt2YXIgcztyZXR1cm4gcj0obyYmby5jb25maWc/ITEhPT1vLmNvbmZpZy51c051bWJlckZvcm1hdDp2b2lkIDA9PT1vfHxvKT9yLnJlcGxhY2UodC5yZWdleC5jb21tYSwiIik6ci5yZXBsYWNlKHQucmVnZXguZGlnaXROb25VUywiIikucmVwbGFjZSh0LnJlZ2V4LmNvbW1hLCIuIiksdC5yZWdleC5kaWdpdE5lZ2F0aXZlVGVzdC50ZXN0KHIpJiYocj1yLnJlcGxhY2UodC5yZWdleC5kaWdpdE5lZ2F0aXZlUmVwbGFjZSwiLSQxIikpLHM9cGFyc2VGbG9hdChyKSxpc05hTihzKT9lLnRyaW0ocik6c30saXNEaWdpdDpmdW5jdGlvbihlKXtyZXR1cm4gaXNOYU4oZSk/dC5yZWdleC5kaWdpdFRlc3QudGVzdChlLnRvU3RyaW5nKCkucmVwbGFjZSh0LnJlZ2V4LmRpZ2l0UmVwbGFjZSwiIikpOiIiIT09ZX0sY29tcHV0ZUNvbHVtbkluZGV4OmZ1bmN0aW9uKHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZyxwLHUsZj1vJiZvLmNvbHVtbnN8fDAsaD1bXSxtPW5ldyBBcnJheShmKTtmb3Iocz0wO3M8ci5sZW5ndGg7cysrKWZvcihkPXJbc10uY2VsbHMsYT0wO2E8ZC5sZW5ndGg7YSsrKXtmb3IoYz1zLGc9KGw9ZFthXSkucm93U3Bhbnx8MSxwPWwuY29sU3Bhbnx8MSx2b2lkIDA9PT1oW2NdJiYoaFtjXT1bXSksbj0wO248aFtjXS5sZW5ndGgrMTtuKyspaWYodm9pZCAwPT09aFtjXVtuXSl7dT1uO2JyZWFrfWZvcihmJiZsLmNlbGxJbmRleD09PXV8fChsLnNldEF0dHJpYnV0ZT9sLnNldEF0dHJpYnV0ZSgiZGF0YS1jb2x1bW4iLHUpOmUobCkuYXR0cigiZGF0YS1jb2x1bW4iLHUpKSxuPWM7bjxjK2c7bisrKWZvcih2b2lkIDA9PT1oW25dJiYoaFtuXT1bXSksbT1oW25dLGk9dTtpPHUrcDtpKyspbVtpXT0ieCJ9cmV0dXJuIHQuY2hlY2tDb2x1bW5Db3VudChyLGgsbS5sZW5ndGgpLG0ubGVuZ3RofSxjaGVja0NvbHVtbkNvdW50OmZ1bmN0aW9uKGUsdCxyKXt2YXIgbyxzLGE9ITAsbj1bXTtmb3Iobz0wO288dC5sZW5ndGg7bysrKWlmKHRbb10mJihzPXRbb10ubGVuZ3RoLHRbb10ubGVuZ3RoIT09cikpe2E9ITE7YnJlYWt9YXx8KGUuZWFjaChmdW5jdGlvbihlLHQpe3ZhciByPXQucGFyZW50RWxlbWVudC5ub2RlTmFtZTtuLmluZGV4T2Yocik8MCYmbi5wdXNoKHIpfSksY29uc29sZS5lcnJvcigiSW52YWxpZCBvciBpbmNvcnJlY3QgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlICIrbi5qb2luKCIgb3IgIikrIjsgZXhwZWN0ZWQgIityKyIsIGJ1dCBmb3VuZCAiK3MrIiBjb2x1bW5zIikpfSxmaXhDb2x1bW5XaWR0aDpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbixpLGw9KHI9ZShyKVswXSkuY29uZmlnLGQ9bC4kdGFibGUuY2hpbGRyZW4oImNvbGdyb3VwIik7aWYoZC5sZW5ndGgmJmQuaGFzQ2xhc3ModC5jc3MuY29sZ3JvdXApJiZkLnJlbW92ZSgpLGwud2lkdGhGaXhlZCYmMD09PWwuJHRhYmxlLmNoaWxkcmVuKCJjb2xncm91cCIpLmxlbmd0aCl7Zm9yKGQ9ZSgnPGNvbGdyb3VwIGNsYXNzPSInK3QuY3NzLmNvbGdyb3VwKyciPicpLG89bC4kdGFibGUud2lkdGgoKSxuPShhPWwuJHRib2RpZXMuZmluZCgidHI6Zmlyc3QiKS5jaGlsZHJlbigiOnZpc2libGUiKSkubGVuZ3RoLGk9MDtpPG47aSsrKXM9cGFyc2VJbnQoYS5lcShpKS53aWR0aCgpL28qMWUzLDEwKS8xMCsiJSIsZC5hcHBlbmQoZSgiPGNvbD4iKS5jc3MoIndpZHRoIixzKSk7bC4kdGFibGUucHJlcGVuZChkKX19LGdldERhdGE6ZnVuY3Rpb24odCxyLG8pe3ZhciBzLGEsbj0iIixpPWUodCk7cmV0dXJuIGkubGVuZ3RoPyhzPSEhZS5tZXRhZGF0YSYmaS5tZXRhZGF0YSgpLGE9IiAiKyhpLmF0dHIoImNsYXNzIil8fCIiKSx2b2lkIDAhPT1pLmRhdGEobyl8fHZvaWQgMCE9PWkuZGF0YShvLnRvTG93ZXJDYXNlKCkpP24rPWkuZGF0YShvKXx8aS5kYXRhKG8udG9Mb3dlckNhc2UoKSk6cyYmdm9pZCAwIT09c1tvXT9uKz1zW29dOnImJnZvaWQgMCE9PXJbb10/bis9cltvXToiICIhPT1hJiZhLm1hdGNoKCIgIitvKyItIikmJihuPWEubWF0Y2gobmV3IFJlZ0V4cCgiXFxzIitvKyItKFtcXHctXSspIikpWzFdfHwiIiksZS50cmltKG4pKToiIn0sZ2V0Q29sdW1uRGF0YTpmdW5jdGlvbih0LHIsbyxzLGEpe2lmKCJvYmplY3QiIT10eXBlb2Ygcnx8bnVsbD09PXIpcmV0dXJuIHI7dmFyIG4saT0odD1lKHQpWzBdKS5jb25maWcsbD1hfHxpLiRoZWFkZXJzLGQ9aS4kaGVhZGVySW5kZXhlZCYmaS4kaGVhZGVySW5kZXhlZFtvXXx8bC5maW5kKCdbZGF0YS1jb2x1bW49IicrbysnIl06bGFzdCcpO2lmKHZvaWQgMCE9PXJbb10pcmV0dXJuIHM/cltvXTpyW2wuaW5kZXgoZCldO2ZvcihuIGluIHIpaWYoInN0cmluZyI9PXR5cGVvZiBuJiZkLmZpbHRlcihuKS5hZGQoZC5maW5kKG4pKS5sZW5ndGgpcmV0dXJuIHJbbl19LGlzUHJvY2Vzc2luZzpmdW5jdGlvbihyLG8scyl7dmFyIGE9KHI9ZShyKSlbMF0uY29uZmlnLG49c3x8ci5maW5kKCIuIit0LmNzcy5oZWFkZXIpO28/KHZvaWQgMCE9PXMmJmEuc29ydExpc3QubGVuZ3RoPjAmJihuPW4uZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuc29ydERpc2FibGVkJiZ0LmlzVmFsdWVJbkFycmF5KHBhcnNlRmxvYXQoZSh0aGlzKS5hdHRyKCJkYXRhLWNvbHVtbiIpKSxhLnNvcnRMaXN0KT49MH0pKSxyLmFkZChuKS5hZGRDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpKTpyLmFkZChuKS5yZW1vdmVDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpfSxwcm9jZXNzVGJvZHk6ZnVuY3Rpb24odCxyLG8pe2lmKHQ9ZSh0KVswXSxvKXJldHVybiB0LmlzUHJvY2Vzc2luZz0hMCxyLmJlZm9yZSgnPGNvbGdyb3VwIGNsYXNzPSJ0YWJsZXNvcnRlci1zYXZlbXlwbGFjZSIvPicpLGUuZm4uZGV0YWNoP3IuZGV0YWNoKCk6ci5yZW1vdmUoKTt2YXIgcz1lKHQpLmZpbmQoImNvbGdyb3VwLnRhYmxlc29ydGVyLXNhdmVteXBsYWNlIik7ci5pbnNlcnRBZnRlcihzKSxzLnJlbW92ZSgpLHQuaXNQcm9jZXNzaW5nPSExfSxjbGVhclRhYmxlQm9keTpmdW5jdGlvbih0KXtlKHQpWzBdLmNvbmZpZy4kdGJvZGllcy5jaGlsZHJlbigpLmRldGFjaCgpfSxjaGFyYWN0ZXJFcXVpdmFsZW50czp7YToiw6HDoMOiw6PDpMSFw6UiLEE6IsOBw4DDgsODw4TEhMOFIixjOiLDp8SHxI0iLEM6IsOHxIbEjCIsZToiw6nDqMOqw6vEm8SZIixFOiLDicOIw4rDi8SaxJgiLGk6IsOtw6zEsMOuw6/EsSIsSToiw43DjMSww47DjyIsbzoiw7PDssO0w7XDtsWNIixPOiLDk8OSw5TDlcOWxYwiLHNzOiLDnyIsU1M6IuG6niIsdToiw7rDucO7w7zFryIsVToiw5rDmcObw5zFriJ9LHJlcGxhY2VBY2NlbnRzOmZ1bmN0aW9uKGUpe3ZhciByLG89IlsiLHM9dC5jaGFyYWN0ZXJFcXVpdmFsZW50cztpZighdC5jaGFyYWN0ZXJSZWdleCl7dC5jaGFyYWN0ZXJSZWdleEFycmF5PXt9O2ZvcihyIGluIHMpInN0cmluZyI9PXR5cGVvZiByJiYobys9c1tyXSx0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl09bmV3IFJlZ0V4cCgiWyIrc1tyXSsiXSIsImciKSk7dC5jaGFyYWN0ZXJSZWdleD1uZXcgUmVnRXhwKG8rIl0iKX1pZih0LmNoYXJhY3RlclJlZ2V4LnRlc3QoZSkpZm9yKHIgaW4gcykic3RyaW5nIj09dHlwZW9mIHImJihlPWUucmVwbGFjZSh0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl0scikpO3JldHVybiBlfSx2YWxpZGF0ZU9wdGlvbnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG4saT0iaGVhZGVycyBzb3J0Rm9yY2Ugc29ydExpc3Qgc29ydEFwcGVuZCB3aWRnZXRzIi5zcGxpdCgiICIpLGw9ci5vcmlnaW5hbFNldHRpbmdzO2lmKGwpe3QuZGVidWcociwiY29yZSIpJiYobj1uZXcgRGF0ZSk7Zm9yKG8gaW4gbClpZigidW5kZWZpbmVkIj09PShhPXR5cGVvZiB0LmRlZmF1bHRzW29dKSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ0YWJsZS5jb25maWcuJytvKyciIG9wdGlvbiBub3QgcmVjb2duaXplZCcpO2Vsc2UgaWYoIm9iamVjdCI9PT1hKWZvcihzIGluIGxbb10pYT10LmRlZmF1bHRzW29dJiZ0eXBlb2YgdC5kZWZhdWx0c1tvXVtzXSxlLmluQXJyYXkobyxpKTwwJiYidW5kZWZpbmVkIj09PWEmJmNvbnNvbGUud2FybignVGFibGVzb3J0ZXIgV2FybmluZyEgInRhYmxlLmNvbmZpZy4nK28rIi4iK3MrJyIgb3B0aW9uIG5vdCByZWNvZ25pemVkJyk7dC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ2YWxpZGF0ZSBvcHRpb25zIHRpbWU6Iit0LmJlbmNobWFyayhuKSl9fSxyZXN0b3JlSGVhZGVyczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ZShyKVswXS5jb25maWcsbj1hLiR0YWJsZS5maW5kKGEuc2VsZWN0b3JIZWFkZXJzKSxpPW4ubGVuZ3RoO2ZvcihvPTA7bzxpO28rKykocz1uLmVxKG8pKS5maW5kKCIuIit0LmNzcy5oZWFkZXJJbikubGVuZ3RoJiZzLmh0bWwoYS5oZWFkZXJDb250ZW50W29dKX0sZGVzdHJveTpmdW5jdGlvbihyLG8scyl7aWYoKHI9ZShyKVswXSkuaGFzSW5pdGlhbGl6ZWQpe3QucmVtb3ZlV2lkZ2V0KHIsITAsITEpO3ZhciBhLG49ZShyKSxpPXIuY29uZmlnLGw9bi5maW5kKCJ0aGVhZDpmaXJzdCIpLGQ9bC5maW5kKCJ0ci4iK3QuY3NzLmhlYWRlclJvdykucmVtb3ZlQ2xhc3ModC5jc3MuaGVhZGVyUm93KyIgIitpLmNzc0hlYWRlclJvdyksYz1uLmZpbmQoInRmb290OmZpcnN0ID4gdHIiKS5jaGlsZHJlbigidGgsIHRkIik7ITE9PT1vJiZlLmluQXJyYXkoInVpdGhlbWUiLGkud2lkZ2V0cyk+PTAmJihuLnRyaWdnZXJIYW5kbGVyKCJhcHBseVdpZGdldElkIixbInVpdGhlbWUiXSksbi50cmlnZ2VySGFuZGxlcigiYXBwbHlXaWRnZXRJZCIsWyJ6ZWJyYSJdKSksbC5maW5kKCJ0ciIpLm5vdChkKS5yZW1vdmUoKSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgdXBkYXRlQ2VsbCBhZGRSb3dzIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyByZW1vdmVXaWRnZXQgZGVzdHJveSBtb3VzZXVwIG1vdXNlbGVhdmUgIisia2V5cHJlc3Mgc29ydEJlZ2luIHNvcnRFbmQgcmVzZXRUb0xvYWRTdGF0ZSAiLnNwbGl0KCIgIikuam9pbihpLm5hbWVzcGFjZSsiICIpLG4ucmVtb3ZlRGF0YSgidGFibGVzb3J0ZXIiKS51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLGkuJGhlYWRlcnMuYWRkKGMpLnJlbW92ZUNsYXNzKFt0LmNzcy5oZWFkZXIsaS5jc3NIZWFkZXIsaS5jc3NBc2MsaS5jc3NEZXNjLHQuY3NzLnNvcnRBc2MsdC5jc3Muc29ydERlc2MsdC5jc3Muc29ydE5vbmVdLmpvaW4oIiAiKSkucmVtb3ZlQXR0cigiZGF0YS1jb2x1bW4iKS5yZW1vdmVBdHRyKCJhcmlhLWxhYmVsIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSxkLmZpbmQoaS5zZWxlY3RvclNvcnQpLnVuYmluZCgibW91c2Vkb3duIG1vdXNldXAga2V5cHJlc3MgIi5zcGxpdCgiICIpLmpvaW4oaS5uYW1lc3BhY2UrIiAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLHQucmVzdG9yZUhlYWRlcnMociksbi50b2dnbGVDbGFzcyh0LmNzcy50YWJsZSsiICIraS50YWJsZUNsYXNzKyIgdGFibGVzb3J0ZXItIitpLnRoZW1lLCExPT09byksbi5yZW1vdmVDbGFzcyhpLm5hbWVzcGFjZS5zbGljZSgxKSksci5oYXNJbml0aWFsaXplZD0hMSxkZWxldGUgci5jb25maWcuY2FjaGUsImZ1bmN0aW9uIj09dHlwZW9mIHMmJnMociksdC5kZWJ1ZyhpLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ0YWJsZXNvcnRlciBoYXMgYmVlbiByZW1vdmVkIil9fX07ZS5mbi50YWJsZXNvcnRlcj1mdW5jdGlvbihyKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxzPWUuZXh0ZW5kKCEwLHt9LHQuZGVmYXVsdHMscix0Lmluc3RhbmNlTWV0aG9kcyk7cy5vcmlnaW5hbFNldHRpbmdzPXIsIW8uaGFzSW5pdGlhbGl6ZWQmJnQuYnVpbGRUYWJsZSYmIlRBQkxFIiE9PXRoaXMubm9kZU5hbWU/dC5idWlsZFRhYmxlKG8scyk6dC5zZXR1cChvLHMpfSl9LHdpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5sb2d8fCh0LmxvZ3M9W10sY29uc29sZT17fSxjb25zb2xlLmxvZz1jb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj1jb25zb2xlLnRhYmxlPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50czphcmd1bWVudHNbMF07dC5sb2dzW3QubG9ncy5sZW5ndGhdPXtkYXRlOkRhdGUubm93KCksbG9nOmV9fSksdC5hZGRQYXJzZXIoe2lkOiJuby1wYXJzZXIiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbigpe3JldHVybiIifSx0eXBlOiJ0ZXh0In0pLHQuYWRkUGFyc2VyKHtpZDoidGV4dCIsaXM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9by5jb25maWc7cmV0dXJuIHImJihyPWUudHJpbShzLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpLHI9cy5zb3J0TG9jYWxlQ29tcGFyZT90LnJlcGxhY2VBY2NlbnRzKHIpOnIpLHJ9LHR5cGU6InRleHQifSksdC5yZWdleC5ub25kaWdpdD0vW15cdywuIFwtKCldL2csdC5hZGRQYXJzZXIoe2lkOiJkaWdpdCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXNEaWdpdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC5jdXJyZW5jeVJlcGxhY2U9L1srXC0sLiBdL2csdC5yZWdleC5jdXJyZW5jeVRlc3Q9L15cKD9cZCtbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXXxbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXVxkK1wpPyQvLHQuYWRkUGFyc2VyKHtpZDoiY3VycmVuY3kiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiBlPShlfHwiIikucmVwbGFjZSh0LnJlZ2V4LmN1cnJlbmN5UmVwbGFjZSwiIiksdC5yZWdleC5jdXJyZW5jeVRlc3QudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC51cmxQcm90b2NvbFRlc3Q9L14oaHR0cHM/fGZ0cHxmaWxlKTpcL1wvLyx0LnJlZ2V4LnVybFByb3RvY29sUmVwbGFjZT0vKGh0dHBzP3xmdHB8ZmlsZSk6XC9cLyh3d3dcLik/Lyx0LmFkZFBhcnNlcih7aWQ6InVybCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVnZXgudXJsUHJvdG9jb2xUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihyKXtyZXR1cm4gcj9lLnRyaW0oci5yZXBsYWNlKHQucmVnZXgudXJsUHJvdG9jb2xSZXBsYWNlLCIiKSk6cn0sdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhc2g9Ly0vZyx0LnJlZ2V4Lmlzb0RhdGU9L15cZHs0fVtcL1wtXVxkezEsMn1bXC9cLV1cZHsxLDJ9Lyx0LmFkZFBhcnNlcih7aWQ6Imlzb0RhdGUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4Lmlzb0RhdGUudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGFzaCwiLyIpKTplO3JldHVybiByIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUocik/ci5nZXRUaW1lKCk6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnBlcmNlbnQ9LyUvZyx0LnJlZ2V4LnBlcmNlbnRUZXN0PS8oXGRccyo/JXwlXHMqP1xkKS8sdC5hZGRQYXJzZXIoe2lkOiJwZXJjZW50IixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC5wZXJjZW50VGVzdC50ZXN0KGUpJiZlLmxlbmd0aDwxNX0sZm9ybWF0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGU/dC5mb3JtYXRGbG9hdChlLnJlcGxhY2UodC5yZWdleC5wZXJjZW50LCIiKSxyKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoiaW1hZ2UiLGlzOmZ1bmN0aW9uKGUsdCxyLG8pe3JldHVybiBvLmZpbmQoImltZyIpLmxlbmd0aD4wfSxmb3JtYXQ6ZnVuY3Rpb24odCxyLG8pe3JldHVybiBlKG8pLmZpbmQoImltZyIpLmF0dHIoci5jb25maWcuaW1nQXR0cnx8ImFsdCIpfHx0fSxwYXJzZWQ6ITAsdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhdGVSZXBsYWNlPS8oXFMpKFtBUF1NKSQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0MT0vXltBLVpdezMsMTB9XC4/XHMrXGR7MSwyfSw/XHMrKFxkezR9KShccytcZHsxLDJ9OlxkezJ9KDpcZHsyfSk/KFxzK1tBUF1NKT8pPyQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0Mj0vXlxkezEsMn1ccytbQS1aXXszLDEwfVxzK1xkezR9L2ksdC5hZGRQYXJzZXIoe2lkOiJ1c0xvbmdEYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC51c0xvbmdEYXRlVGVzdDEudGVzdChlKXx8dC5yZWdleC51c0xvbmdEYXRlVGVzdDIudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGF0ZVJlcGxhY2UsIiQxICQyIikpOmU7cmV0dXJuIHIgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShyKT9yLmdldFRpbWUoKTplfSx0eXBlOiJudW1lcmljIn0pLHQucmVnZXguc2hvcnREYXRlVGVzdD0vKF5cZHsxLDJ9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezR9KXwoXlxkezR9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezEsMn0pLyx0LnJlZ2V4LnNob3J0RGF0ZVJlcGxhY2U9L1tcLS4sXS9nLHQucmVnZXguc2hvcnREYXRlWFhZPS8oXGR7MSwyfSlbXC9cc10oXGR7MSwyfSlbXC9cc10oXGR7NH0pLyx0LnJlZ2V4LnNob3J0RGF0ZVlNRD0vKFxkezR9KVtcL1xzXShcZHsxLDJ9KVtcL1xzXShcZHsxLDJ9KS8sdC5jb252ZXJ0Rm9ybWF0PWZ1bmN0aW9uKGUscil7ZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLCJtbWRkeXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMS8kMiIpOiJkZG1teXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMi8kMSIpOiJ5eXl5bW1kZCI9PT1yJiYoZT1lLnJlcGxhY2UodC5yZWdleC5zaG9ydERhdGVZTUQsIiQxLyQyLyQzIikpO3ZhciBvPW5ldyBEYXRlKGUpO3JldHVybiBvIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUobyk/by5nZXRUaW1lKCk6IiJ9LHQuYWRkUGFyc2VyKHtpZDoic2hvcnREYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLHQucmVnZXguc2hvcnREYXRlVGVzdC50ZXN0KGUpfSxmb3JtYXQ6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZSl7dmFyIGE9ci5jb25maWcsbj1hLiRoZWFkZXJJbmRleGVkW3NdLGk9bi5sZW5ndGgmJm4uZGF0YSgiZGF0ZUZvcm1hdCIpfHx0LmdldERhdGEobix0LmdldENvbHVtbkRhdGEocixhLmhlYWRlcnMscyksImRhdGVGb3JtYXQiKXx8YS5kYXRlRm9ybWF0O3JldHVybiBuLmxlbmd0aCYmbi5kYXRhKCJkYXRlRm9ybWF0IixpKSx0LmNvbnZlcnRGb3JtYXQoZSxpKXx8ZX1yZXR1cm4gZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnRpbWVUZXN0PS9eKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSkkfF4oKD86WzAxXVxkfFsyXVswLTRdKTpbMC01XVxkKSQvaSx0LnJlZ2V4LnRpbWVNYXRjaD0vKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSl8KCg/OlswMV1cZHxbMl1bMC00XSk6WzAtNV1cZCkvaSx0LmFkZFBhcnNlcih7aWQ6InRpbWUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4LnRpbWVUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihlKXt2YXIgcixvPShlfHwiIikubWF0Y2godC5yZWdleC50aW1lTWF0Y2gpLHM9bmV3IERhdGUoZSksYT1lJiYobnVsbCE9PW8/b1swXToiMDA6MDAgQU0iKSxuPWE/bmV3IERhdGUoIjIwMDAvMDEvMDEgIithLnJlcGxhY2UodC5yZWdleC5kYXRlUmVwbGFjZSwiJDEgJDIiKSk6YTtyZXR1cm4gbiBpbnN0YW5jZW9mIERhdGUmJmlzRmluaXRlKG4pPyhyPXMgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShzKT9zLmdldFRpbWUoKTowLHI/cGFyc2VGbG9hdChuLmdldFRpbWUoKSsiLiIrcy5nZXRUaW1lKCkpOm4uZ2V0VGltZSgpKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoibWV0YWRhdGEiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHM9ci5jb25maWcsYT1zLnBhcnNlck1ldGFkYXRhTmFtZT9zLnBhcnNlck1ldGFkYXRhTmFtZToic29ydFZhbHVlIjtyZXR1cm4gZShvKS5tZXRhZGF0YSgpW2FdfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkV2lkZ2V0KHtpZDoiemVicmEiLHByaW9yaXR5OjkwLGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZz1uZXcgUmVnRXhwKHIuY3NzQ2hpbGRSb3csImkiKSxwPXIuJHRib2RpZXMuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV90YWJsZSIpLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrci5jc3NJbmZvQmxvY2srIikiKSk7Zm9yKGw9MDtsPHAubGVuZ3RoO2wrKylmb3Iobj0wLGM9KHM9cC5lcShsKS5jaGlsZHJlbigidHI6dmlzaWJsZSIpLm5vdChyLnNlbGVjdG9yUmVtb3ZlKSkubGVuZ3RoLGQ9MDtkPGM7ZCsrKWE9cy5lcShkKSxnLnRlc3QoYVswXS5jbGFzc05hbWUpfHxuKyssaT1uJTI9PTAsYS5yZW1vdmVDbGFzcyhvLnplYnJhW2k/MTowXSkuYWRkQ2xhc3Moby56ZWJyYVtpPzA6MV0pfSxyZW1vdmU6ZnVuY3Rpb24oZSxyLG8scyl7aWYoIXMpe3ZhciBhLG4saT1yLiR0Ym9kaWVzLGw9KG8uemVicmF8fFsiZXZlbiIsIm9kZCJdKS5qb2luKCIgIik7Zm9yKGE9MDthPGkubGVuZ3RoO2ErKykobj10LnByb2Nlc3NUYm9keShlLGkuZXEoYSksITApKS5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKGwpLHQucHJvY2Vzc1Rib2R5KGUsbiwhMSl9fX0pfShlKSxlLnRhYmxlc29ydGVyfSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAgICBDb3B5cmlnaHQgMjAwOC0yMDEzCiAgICAgICAgTWF0dGhpYXMgRWhtYW5uLAogICAgICAgIE1pY2hhZWwgR2VyaGFldXNlciwKICAgICAgICBDYXJzdGVuIE1pbGxlciwKICAgICAgICBCaWFuY2EgVmFsZW50aW4sCiAgICAgICAgQWxmcmVkIFdhc3Nlcm1hbm4sCiAgICAgICAgUGV0ZXIgV2lsZmFocnQKICAgIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBvciBMR1BMIFZlcnNpb24gMyBsaWNlbnNlcy4KICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLgogICAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8+LgoqLwooZnVuY3Rpb24oKXt2YXIgZSxyLG47KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG8oZSxyKXtyZXR1cm4gQy5jYWxsKGUscil9ZnVuY3Rpb24gaShlLHIpe3ZhciBuLHQsbyxpLGEsdSxjLGYscyxsLHA9ciYmci5zcGxpdCgiLyIpLGg9ay5tYXAsZD1oJiZoWyIqIl18fHt9O2lmKGUmJiIuIj09PWUuY2hhckF0KDApKWlmKHIpe2ZvcihwPXAuc2xpY2UoMCxwLmxlbmd0aC0xKSxlPXAuY29uY2F0KGUuc3BsaXQoIi8iKSksZj0wO2UubGVuZ3RoPmY7Zis9MSlpZihsPWVbZl0sIi4iPT09bCllLnNwbGljZShmLDEpLGYtPTE7ZWxzZSBpZigiLi4iPT09bCl7aWYoMT09PWYmJigiLi4iPT09ZVsyXXx8Ii4uIj09PWVbMF0pKWJyZWFrO2Y+MCYmKGUuc3BsaWNlKGYtMSwyKSxmLT0yKX1lPWUuam9pbigiLyIpfWVsc2UgMD09PWUuaW5kZXhPZigiLi8iKSYmKGU9ZS5zdWJzdHJpbmcoMikpO2lmKChwfHxkKSYmaCl7Zm9yKG49ZS5zcGxpdCgiLyIpLGY9bi5sZW5ndGg7Zj4wO2YtPTEpe2lmKHQ9bi5zbGljZSgwLGYpLmpvaW4oIi8iKSxwKWZvcihzPXAubGVuZ3RoO3M+MDtzLT0xKWlmKG89aFtwLnNsaWNlKDAscykuam9pbigiLyIpXSxvJiYobz1vW3RdKSl7aT1vLGE9ZjticmVha31pZihpKWJyZWFrOyF1JiZkJiZkW3RdJiYodT1kW3RdLGM9Zil9IWkmJnUmJihpPXUsYT1jKSxpJiYobi5zcGxpY2UoMCxhLGkpLGU9bi5qb2luKCIvIikpfXJldHVybiBlfWZ1bmN0aW9uIGEoZSxyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaC5hcHBseSh0LHYuY2FsbChhcmd1bWVudHMsMCkuY29uY2F0KFtlLHJdKSl9fWZ1bmN0aW9uIHUoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBpKHIsZSl9fWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe2JbZV09cn19ZnVuY3Rpb24gZihlKXtpZihvKG0sZSkpe3ZhciByPW1bZV07ZGVsZXRlIG1bZV0seVtlXT0hMCxwLmFwcGx5KHQscil9aWYoIW8oYixlKSYmIW8oeSxlKSl0aHJvdyBFcnJvcigiTm8gIitlKTtyZXR1cm4gYltlXX1mdW5jdGlvbiBzKGUpe3ZhciByLG49ZT9lLmluZGV4T2YoIiEiKTotMTtyZXR1cm4gbj4tMSYmKHI9ZS5zdWJzdHJpbmcoMCxuKSxlPWUuc3Vic3RyaW5nKG4rMSxlLmxlbmd0aCkpLFtyLGVdfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGsmJmsuY29uZmlnJiZrLmNvbmZpZ1tlXXx8e319fXZhciBwLGgsZCxnLGI9e30sbT17fSxrPXt9LHk9e30sQz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHY9W10uc2xpY2U7ZD1mdW5jdGlvbihlLHIpe3ZhciBuLHQ9cyhlKSxvPXRbMF07cmV0dXJuIGU9dFsxXSxvJiYobz1pKG8sciksbj1mKG8pKSxvP2U9biYmbi5ub3JtYWxpemU/bi5ub3JtYWxpemUoZSx1KHIpKTppKGUscik6KGU9aShlLHIpLHQ9cyhlKSxvPXRbMF0sZT10WzFdLG8mJihuPWYobykpKSx7ZjpvP28rIiEiK2U6ZSxuOmUscHI6byxwOm59fSxnPXtyZXF1aXJlOmZ1bmN0aW9uKGUpe3JldHVybiBhKGUpfSxleHBvcnRzOmZ1bmN0aW9uKGUpe3ZhciByPWJbZV07cmV0dXJuIHIhPT12b2lkIDA/cjpiW2VdPXt9fSxtb2R1bGU6ZnVuY3Rpb24oZSl7cmV0dXJue2lkOmUsdXJpOiIiLGV4cG9ydHM6YltlXSxjb25maWc6bChlKX19fSxwPWZ1bmN0aW9uKGUscixuLGkpe3ZhciB1LHMsbCxwLGgsayxDPVtdO2lmKGk9aXx8ZSwiZnVuY3Rpb24iPT10eXBlb2Ygbil7Zm9yKHI9IXIubGVuZ3RoJiZuLmxlbmd0aD9bInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl06cixoPTA7ci5sZW5ndGg+aDtoKz0xKWlmKHA9ZChyW2hdLGkpLHM9cC5mLCJyZXF1aXJlIj09PXMpQ1toXT1nLnJlcXVpcmUoZSk7ZWxzZSBpZigiZXhwb3J0cyI9PT1zKUNbaF09Zy5leHBvcnRzKGUpLGs9ITA7ZWxzZSBpZigibW9kdWxlIj09PXMpdT1DW2hdPWcubW9kdWxlKGUpO2Vsc2UgaWYobyhiLHMpfHxvKG0scyl8fG8oeSxzKSlDW2hdPWYocyk7ZWxzZXtpZighcC5wKXRocm93IEVycm9yKGUrIiBtaXNzaW5nICIrcyk7cC5wLmxvYWQocC5uLGEoaSwhMCksYyhzKSx7fSksQ1toXT1iW3NdfWw9bi5hcHBseShiW2VdLEMpLGUmJih1JiZ1LmV4cG9ydHMhPT10JiZ1LmV4cG9ydHMhPT1iW2VdP2JbZV09dS5leHBvcnRzOmw9PT10JiZrfHwoYltlXT1sKSl9ZWxzZSBlJiYoYltlXT1uKX0sZT1yPWg9ZnVuY3Rpb24oZSxyLG4sbyxpKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/Z1tlXT9nW2VdKHIpOmYoZChlLHIpLmYpOihlLnNwbGljZXx8KGs9ZSxyLnNwbGljZT8oZT1yLHI9bixuPW51bGwpOmU9dCkscj1yfHxmdW5jdGlvbigpe30sImZ1bmN0aW9uIj09dHlwZW9mIG4mJihuPW8sbz1pKSxvP3AodCxlLHIsbik6c2V0VGltZW91dChmdW5jdGlvbigpe3AodCxlLHIsbil9LDQpLGgpfSxoLmNvbmZpZz1mdW5jdGlvbihlKXtyZXR1cm4gaz1lLGsuZGVwcyYmaChrLmRlcHMsay5jYWxsYmFjayksaH0sbj1mdW5jdGlvbihlLHIsbil7ci5zcGxpY2V8fChuPXIscj1bXSksbyhiLGUpfHxvKG0sZSl8fChtW2VdPVtlLHIsbl0pfSxuLmFtZD17alF1ZXJ5OiEwfX0pKCksbigiLi4vbm9kZV9tb2R1bGVzL2FsbW9uZC9hbG1vbmQiLGZ1bmN0aW9uKCl7fSksbigianhnIixbXSxmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiJvYmplY3QiIT10eXBlb2YgSlhHfHxKWEcuZXh0ZW5kfHwoZT1KWEcpLGUuZXh0ZW5kPWZ1bmN0aW9uKGUscixuLHQpe3ZhciBvLGk7bj1ufHwhMSx0PXR8fCExO2ZvcihvIGluIHIpKCFufHxuJiZyLmhhc093blByb3BlcnR5KG8pKSYmKGk9dD9vLnRvTG93ZXJDYXNlKCk6byxlW2ldPXJbb10pfSxlLmV4dGVuZChlLHtib2FyZHM6e30scmVhZGVyczp7fSxlbGVtZW50czp7fSxyZWdpc3RlckVsZW1lbnQ6ZnVuY3Rpb24oZSxyKXtlPWUudG9Mb3dlckNhc2UoKSx0aGlzLmVsZW1lbnRzW2VdPXJ9LHJlZ2lzdGVyUmVhZGVyOmZ1bmN0aW9uKGUscil7dmFyIG4sdDtmb3Iobj0wO3IubGVuZ3RoPm47bisrKXQ9cltuXS50b0xvd2VyQ2FzZSgpLCJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzLnJlYWRlcnNbdF0mJih0aGlzLnJlYWRlcnNbdF09ZSl9LHNob3J0Y3V0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbcl0uYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sZ2V0UmVmOmZ1bmN0aW9uKGUscil7cmV0dXJuIGUuc2VsZWN0KHIpfSxnZXRSZWZlcmVuY2U6ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZS5zZWxlY3Qocil9LGRlYnVnSW50OmZ1bmN0aW9uKCl7dmFyIGUscjtmb3IoZT0wO2FyZ3VtZW50cy5sZW5ndGg+ZTtlKyspcj1hcmd1bWVudHNbZV0sIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZz9jb25zb2xlLmxvZyhyKToib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGVidWciKSYmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZWJ1ZyIpLmlubmVySFRNTCs9cisiPGJyLz4iKX0sZGVidWdXU1Q6ZnVuY3Rpb24oKXt2YXIgcj1FcnJvcigpO2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHImJnIuc3RhY2smJihlLmRlYnVnSW50KCJzdGFja3RyYWNlIiksZS5kZWJ1Z0ludChyLnN0YWNrLnNwbGl0KCJcbiIpLnNsaWNlKDEpLmpvaW4oIlxuIikpKX0sZGVidWdMaW5lOmZ1bmN0aW9uKCl7dmFyIHI9RXJyb3IoKTtlLmRlYnVnSW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyJiZyLnN0YWNrJiZlLmRlYnVnSW50KCJDYWxsZWQgZnJvbSIsci5zdGFjay5zcGxpdCgiXG4iKS5zbGljZSgyLDMpLmpvaW4oIlxuIikpfSxkZWJ1ZzpmdW5jdGlvbigpe2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pLGV9KSxuKCJ1dGlscy96aXAiLFsianhnIl0sZnVuY3Rpb24oZSl7dmFyIHI9WzAsMTI4LDY0LDE5MiwzMiwxNjAsOTYsMjI0LDE2LDE0NCw4MCwyMDgsNDgsMTc2LDExMiwyNDAsOCwxMzYsNzIsMjAwLDQwLDE2OCwxMDQsMjMyLDI0LDE1Miw4OCwyMTYsNTYsMTg0LDEyMCwyNDgsNCwxMzIsNjgsMTk2LDM2LDE2NCwxMDAsMjI4LDIwLDE0OCw4NCwyMTIsNTIsMTgwLDExNiwyNDQsMTIsMTQwLDc2LDIwNCw0NCwxNzIsMTA4LDIzNiwyOCwxNTYsOTIsMjIwLDYwLDE4OCwxMjQsMjUyLDIsMTMwLDY2LDE5NCwzNCwxNjIsOTgsMjI2LDE4LDE0Niw4MiwyMTAsNTAsMTc4LDExNCwyNDIsMTAsMTM4LDc0LDIwMiw0MiwxNzAsMTA2LDIzNCwyNiwxNTQsOTAsMjE4LDU4LDE4NiwxMjIsMjUwLDYsMTM0LDcwLDE5OCwzOCwxNjYsMTAyLDIzMCwyMiwxNTAsODYsMjE0LDU0LDE4MiwxMTgsMjQ2LDE0LDE0Miw3OCwyMDYsNDYsMTc0LDExMCwyMzgsMzAsMTU4LDk0LDIyMiw2MiwxOTAsMTI2LDI1NCwxLDEyOSw2NSwxOTMsMzMsMTYxLDk3LDIyNSwxNywxNDUsODEsMjA5LDQ5LDE3NywxMTMsMjQxLDksMTM3LDczLDIwMSw0MSwxNjksMTA1LDIzMywyNSwxNTMsODksMjE3LDU3LDE4NSwxMjEsMjQ5LDUsMTMzLDY5LDE5NywzNywxNjUsMTAxLDIyOSwyMSwxNDksODUsMjEzLDUzLDE4MSwxMTcsMjQ1LDEzLDE0MSw3NywyMDUsNDUsMTczLDEwOSwyMzcsMjksMTU3LDkzLDIyMSw2MSwxODksMTI1LDI1MywzLDEzMSw2NywxOTUsMzUsMTYzLDk5LDIyNywxOSwxNDcsODMsMjExLDUxLDE3OSwxMTUsMjQzLDExLDEzOSw3NSwyMDMsNDMsMTcxLDEwNywyMzUsMjcsMTU1LDkxLDIxOSw1OSwxODcsMTIzLDI1MSw3LDEzNSw3MSwxOTksMzksMTY3LDEwMywyMzEsMjMsMTUxLDg3LDIxNSw1NSwxODMsMTE5LDI0NywxNSwxNDMsNzksMjA3LDQ3LDE3NSwxMTEsMjM5LDMxLDE1OSw5NSwyMjMsNjMsMTkxLDEyNywyNTVdLG49WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsMCwwXSx0PVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsOTksOTldLG89WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3N10saT1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sYT1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sdT0yNTY7cmV0dXJuIGUuVXRpbD1lLlV0aWx8fHt9LGUuVXRpbC5VbnppcD1mdW5jdGlvbihjKXtmdW5jdGlvbiBmKCl7cmV0dXJuIFIrPTgsTz5YP2NbWCsrXTotMX1mdW5jdGlvbiBzKCl7Qj0xfWZ1bmN0aW9uIGwoKXt2YXIgZTt0cnl7cmV0dXJuIFIrKyxlPTEmQixCPj49MSwwPT09QiYmKEI9ZigpLGU9MSZCLEI9MTI4fEI+PjEpLGV9Y2F0Y2gocil7dGhyb3cgcn19ZnVuY3Rpb24gcChlKXt2YXIgbj0wLHQ9ZTt0cnl7Zm9yKDt0LS07KW49bjw8MXxsKCk7ZSYmKG49cltuXT4+OC1lKX1jYXRjaChvKXt0aHJvdyBvfXJldHVybiBufWZ1bmN0aW9uIGgoKXtKPTB9ZnVuY3Rpb24gZChlKXtqKyssR1tKKytdPWUsei5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpLDMyNzY4PT09SiYmKEo9MCl9ZnVuY3Rpb24gZygpe3RoaXMuYjA9MCx0aGlzLmIxPTAsdGhpcy5qdW1wPW51bGwsdGhpcy5qdW1wcG9zPS0xfWZ1bmN0aW9uIGIoKXtmb3IoOzspe2lmKE1bSF0+PXgpcmV0dXJuLTE7aWYoVVtNW0hdXT09PUgpcmV0dXJuIE1bSF0rKztNW0hdKyt9fWZ1bmN0aW9uIG0oKXt2YXIgZSxyPVBbRl07aWYoMTc9PT1IKXJldHVybi0xO2lmKEYrKyxIKyssZT1iKCksZT49MClyLmIwPWU7ZWxzZSBpZihyLmIwPTMyNzY4LG0oKSlyZXR1cm4tMTtpZihlPWIoKSxlPj0wKXIuYjE9ZSxyLmp1bXA9bnVsbDtlbHNlIGlmKHIuYjE9MzI3Njgsci5qdW1wPVBbRl0sci5qdW1wcG9zPUYsbSgpKXJldHVybi0xO3JldHVybiBILS0sMH1mdW5jdGlvbiBrKGUscixuKXt2YXIgdDtmb3IoUD1lLEY9MCxVPW4seD1yLHQ9MDsxNz50O3QrKylNW3RdPTA7cmV0dXJuIEg9MCxtKCk/LTE6MH1mdW5jdGlvbiB5KGUpe2Zvcih2YXIgcixuLHQsbz0wLGk9ZVtvXTs7KWlmKHQ9bCgpKXtpZighKDMyNzY4JmkuYjEpKXJldHVybiBpLmIxO2ZvcihpPWkuanVtcCxyPWUubGVuZ3RoLG49MDtyPm47bisrKWlmKGVbbl09PT1pKXtvPW47YnJlYWt9fWVsc2V7aWYoISgzMjc2OCZpLmIwKSlyZXR1cm4gaS5iMDtvKyssaT1lW29dfX1mdW5jdGlvbiBDKCl7dmFyIHUsYyxiLG0sQyx2LEEsaix3LFUseCxTLHosSSxFLEwsTztkbyBpZih1PWwoKSxiPXAoMiksMD09PWIpZm9yKHMoKSxVPWYoKSxVfD1mKCk8PDgsUz1mKCksU3w9ZigpPDw4LDY1NTM1JihVXn5TKSYmZS5kZWJ1ZygiQmxvY2tMZW4gY2hlY2tzdW0gbWlzbWF0Y2hcbiIpO1UtLTspYz1mKCksZChjKTtlbHNlIGlmKDE9PT1iKWZvcig7OylpZihDPXJbcCg3KV0+PjEsQz4yMz8oQz1DPDwxfGwoKSxDPjE5OT8oQy09MTI4LEM9Qzw8MXxsKCkpOihDLT00OCxDPjE0MyYmKEMrPTEzNikpKTpDKz0yNTYsMjU2PkMpZChDKTtlbHNle2lmKDI1Nj09PUMpYnJlYWs7Zm9yKEMtPTI1Nyx3PXAodFtDXSkrbltDXSxDPXJbcCg1KV0+PjMsaVtDXT44Pyh4PXAoOCkseHw9cChpW0NdLTgpPDw4KTp4PXAoaVtDXSkseCs9b1tDXSxDPTA7dz5DO0MrKyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgaWYoMj09PWIpe2ZvcihBPUFycmF5KDMyMCksST0yNTcrcCg1KSxFPTErcCg1KSxMPTQrcCg0KSxDPTA7MTk+QztDKyspQVtDXT0wO2ZvcihDPTA7TD5DO0MrKylBW2FbQ11dPXAoMyk7Zm9yKHc9cS5sZW5ndGgsbT0wO3c+bTttKyspcVttXT1uZXcgZztpZihrKHEsMTksQSwwKSlyZXR1cm4gaCgpLDE7Zm9yKHo9SStFLG09MCxPPS0xO3o+bTspaWYoTysrLEM9eShxKSwxNj5DKUFbbSsrXT1DO2Vsc2UgaWYoMTY9PT1DKXtpZihDPTMrcCgyKSxtK0M+eilyZXR1cm4gaCgpLDE7Zm9yKHY9bT9BW20tMV06MDtDLS07KUFbbSsrXT12fWVsc2V7aWYoQz0xNz09PUM/MytwKDMpOjExK3AoNyksbStDPnopcmV0dXJuIGgoKSwxO2Zvcig7Qy0tOylBW20rK109MH1mb3Iodz1ULmxlbmd0aCxtPTA7dz5tO20rKylUW21dPW5ldyBnO2lmKGsoVCxJLEEsMCkpcmV0dXJuIGgoKSwxO2Zvcih3PVQubGVuZ3RoLG09MDt3Pm07bSsrKXFbbV09bmV3IGc7Zm9yKGo9W10sbT1JO0EubGVuZ3RoPm07bSsrKWpbbS1JXT1BW21dO2lmKGsocSxFLGosMCkpcmV0dXJuIGgoKSwxO2Zvcig7OylpZihDPXkoVCksQz49MjU2KXtpZihDLT0yNTYsMD09PUMpYnJlYWs7Zm9yKEMtPTEsdz1wKHRbQ10pK25bQ10sQz15KHEpLGlbQ10+OD8oeD1wKDgpLHh8PXAoaVtDXS04KTw8OCk6eD1wKGlbQ10pLHgrPW9bQ107dy0tOyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgZChDKX13aGlsZSghdSk7cmV0dXJuIGgoKSxzKCksMH1mdW5jdGlvbiB2KCl7dmFyIGUscixuLHQsbyxpLGEsYyxzPVtdO3RyeXtpZih6PVtdLEw9ITEsc1swXT1mKCksc1sxXT1mKCksMTIwPT09c1swXSYmMjE4PT09c1sxXSYmKEMoKSxFW0ldPVt6LmpvaW4oIiIpLCJnZW9uZXh0Lmd4dCJdLEkrKyksMzE9PT1zWzBdJiYxMzk9PT1zWzFdJiYoUygpLEVbSV09W3ouam9pbigiIiksImZpbGUiXSxJKyspLDgwPT09c1swXSYmNzU9PT1zWzFdJiYoTD0hMCxzWzJdPWYoKSxzWzNdPWYoKSwzPT09c1syXSYmND09PXNbM10pKXtmb3Ioc1swXT1mKCksc1sxXT1mKCksQT1mKCksQXw9ZigpPDw4LGM9ZigpLGN8PWYoKTw8OCxmKCksZigpLGYoKSxmKCksYT1mKCksYXw9ZigpPDw4LGF8PWYoKTw8MTYsYXw9ZigpPDwyNCxpPWYoKSxpfD1mKCk8PDgsaXw9ZigpPDwxNixpfD1mKCk8PDI0LG89ZigpLG98PWYoKTw8OCxvfD1mKCk8PDE2LG98PWYoKTw8MjQsdD1mKCksdHw9ZigpPDw4LG49ZigpLG58PWYoKTw8OCxlPTAsTj1bXTt0LS07KXI9ZigpLCIvIj09PXJ8IjoiPT09cj9lPTA6dS0xPmUmJihOW2UrK109U3RyaW5nLmZyb21DaGFyQ29kZShyKSk7Zm9yKHd8fCh3PU4pLGU9MDtuPmU7KXI9ZigpLGUrKztqPTAsOD09PWMmJihDKCksRVtJXT1BcnJheSgyKSxFW0ldWzBdPXouam9pbigiIiksRVtJXVsxXT1OLmpvaW4oIiIpLEkrKyksUygpfX1jYXRjaChsKXt0aHJvdyBsfX12YXIgQSxqLHcsVSx4LFMsej1bXSxJPTAsRT1bXSxHPUFycmF5KDMyNzY4KSxKPTAsTD0hMSxPPWMubGVuZ3RoLFg9MCxCPTEsUj0wLFQ9QXJyYXkoMjg4KSxxPUFycmF5KDMyKSxGPTAsUD1udWxsLEg9KEFycmF5KDY0KSxBcnJheSg2NCksMCksTT1BcnJheSgxNyksTj1bXTtNWzBdPTAsUz1mdW5jdGlvbigpe3ZhciBlLHIsbix0LG8saSxhPVtdO2lmKDgmQSYmKGFbMF09ZigpLGFbMV09ZigpLGFbMl09ZigpLGFbM109ZigpLDgwPT09YVswXSYmNzU9PT1hWzFdJiY3PT09YVsyXSYmOD09PWFbM10/KGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQpOmU9YVswXXxhWzFdPDw4fGFbMl08PDE2fGFbM108PDI0LHI9ZigpLHJ8PWYoKTw8OCxyfD1mKCk8PDE2LHJ8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCksTCYmdigpLGFbMF09ZigpLDg9PT1hWzBdKXtpZihBPWYoKSxmKCksZigpLGYoKSxmKCksZigpLHQ9ZigpLDQmQSlmb3IoYVswXT1mKCksYVsyXT1mKCksSD1hWzBdKzI1NiphWzFdLG89MDtIPm87bysrKWYoKTtpZig4JkEpZm9yKG89MCxOPVtdLGk9ZigpO2k7KSgiNyI9PT1pfHwiOiI9PT1pKSYmKG89MCksdS0xPm8mJihOW28rK109aSksaT1mKCk7aWYoMTYmQSlmb3IoaT1mKCk7aTspaT1mKCk7MiZBJiYoZigpLGYoKSksQygpLGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCxMJiZ2KCl9fSxlLlV0aWwuVW56aXAucHJvdG90eXBlLnVuemlwRmlsZT1mdW5jdGlvbihlKXt2YXIgcjtmb3IodGhpcy51bnppcCgpLHI9MDtFLmxlbmd0aD5yO3IrKylpZihFW3JdWzFdPT09ZSlyZXR1cm4gRVtyXVswXTtyZXR1cm4iIn0sZS5VdGlsLlVuemlwLnByb3RvdHlwZS51bnppcD1mdW5jdGlvbigpe3JldHVybiB2KCksRX19LGUuVXRpbH0pLG4oInV0aWxzL2VuY29kaW5nIixbImp4ZyJdLGZ1bmN0aW9uKGUpe3ZhciByPTAsbj1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsOCw4LDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDEwLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDQsMywzLDExLDYsNiw2LDUsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDAsMTIsMjQsMzYsNjAsOTYsODQsMTIsMTIsMTIsNDgsNzIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMCwxMiwxMiwxMiwxMiwxMiwwLDEyLDAsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTJdO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuVVRGOD17ZW5jb2RlOmZ1bmN0aW9uKGUpe3ZhciByLG4sdD0iIixvPWUubGVuZ3RoO2lmKGU9ZS5yZXBsYWNlKC9cclxuL2csIlxuIiksImZ1bmN0aW9uIj09dHlwZW9mIHVuZXNjYXBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZW5jb2RlVVJJQ29tcG9uZW50KXJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpO2ZvcihyPTA7bz5yO3IrKyluPWUuY2hhckNvZGVBdChyKSwxMjg+bj90Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKG4pOm4+MTI3JiYyMDQ4Pm4/KHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTkyfG4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKToodCs9U3RyaW5nLmZyb21DaGFyQ29kZSgyMjR8bj4+MTIpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKTtyZXR1cm4gdH0sZGVjb2RlOmZ1bmN0aW9uKGUpe3ZhciB0LG8saSxhPTAsdT0wLGM9cixmPVtdLHM9ZS5sZW5ndGgsbD1bXTtmb3IodD0wO3M+dDt0Kyspbz1lLmNoYXJDb2RlQXQodCksaT1uW29dLHU9YyE9PXI/NjMmb3x1PDw2OjI1NT4+aSZvLGM9blsyNTYrYytpXSxjPT09ciYmKHU+NjU1MzU/Zi5wdXNoKDU1MjMyKyh1Pj4xMCksNTYzMjArKDEwMjMmdSkpOmYucHVzaCh1KSxhKyssMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxmKSksZj1bXSkpO3JldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGYpKSxsLmpvaW4oIiIpfSxhc2NpaUNoYXJDb2RlQXQ6ZnVuY3Rpb24oZSxyKXt2YXIgbj1lLmNoYXJDb2RlQXQocik7aWYobj4yNTUpc3dpdGNoKG4pe2Nhc2UgODM2NDpuPTEyODticmVhaztjYXNlIDgyMTg6bj0xMzA7YnJlYWs7Y2FzZSA0MDI6bj0xMzE7YnJlYWs7Y2FzZSA4MjIyOm49MTMyO2JyZWFrO2Nhc2UgODIzMDpuPTEzMzticmVhaztjYXNlIDgyMjQ6bj0xMzQ7YnJlYWs7Y2FzZSA4MjI1Om49MTM1O2JyZWFrO2Nhc2UgNzEwOm49MTM2O2JyZWFrO2Nhc2UgODI0MDpuPTEzNzticmVhaztjYXNlIDM1MjpuPTEzODticmVhaztjYXNlIDgyNDk6bj0xMzk7YnJlYWs7Y2FzZSAzMzg6bj0xNDA7YnJlYWs7Y2FzZSAzODE6bj0xNDI7YnJlYWs7Y2FzZSA4MjE2Om49MTQ1O2JyZWFrO2Nhc2UgODIxNzpuPTE0NjticmVhaztjYXNlIDgyMjA6bj0xNDc7YnJlYWs7Y2FzZSA4MjIxOm49MTQ4O2JyZWFrO2Nhc2UgODIyNjpuPTE0OTticmVhaztjYXNlIDgyMTE6bj0xNTA7YnJlYWs7Y2FzZSA4MjEyOm49MTUxO2JyZWFrO2Nhc2UgNzMyOm49MTUyO2JyZWFrO2Nhc2UgODQ4MjpuPTE1MzticmVhaztjYXNlIDM1MzpuPTE1NDticmVhaztjYXNlIDgyNTA6bj0xNTU7YnJlYWs7Y2FzZSAzMzk6bj0xNTY7YnJlYWs7Y2FzZSAzODI6bj0xNTg7YnJlYWs7Y2FzZSAzNzY6bj0xNTk7YnJlYWs7ZGVmYXVsdDp9cmV0dXJuIG59fSxlLlV0aWwuVVRGOH0pLG4oInV0aWxzL2Jhc2U2NCIsWyJqeGciLCJ1dGlscy9lbmNvZGluZyJdLGZ1bmN0aW9uKGUscil7ZnVuY3Rpb24gbihlLHIpe3JldHVybiAyNTUmZS5jaGFyQ29kZUF0KHIpfWZ1bmN0aW9uIHQoZSxyKXt2YXIgbj1vLmluZGV4T2YoZS5jaGFyQXQocikpO2lmKC0xPT09bil0aHJvdyBFcnJvcigiSlNYR3JhcGgvdXRpbHMvYmFzZTY0OiBDYW4ndCBkZWNvZGUgc3RyaW5nIChpbnZhbGlkIGNoYXJhY3RlcikuIik7cmV0dXJuIG59dmFyIG89IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGk9Ij0iO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuQmFzZTY0PXtlbmNvZGU6ZnVuY3Rpb24oZSl7dmFyIHQsYSx1LGMsZixzPVtdO2ZvcihmPXIuZW5jb2RlKGUpLHU9Zi5sZW5ndGgsYz11JTMsdD0wO3UtYz50O3QrPTMpYT1uKGYsdCk8PDE2fG4oZix0KzEpPDw4fG4oZix0KzIpLHMucHVzaChvLmNoYXJBdChhPj4xOCksby5jaGFyQXQoNjMmYT4+MTIpLG8uY2hhckF0KDYzJmE+PjYpLG8uY2hhckF0KDYzJmEpKTtzd2l0Y2goYyl7Y2FzZSAxOmE9bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjIpLG8uY2hhckF0KDYzJmE8PDQpLGksaSk7YnJlYWs7Y2FzZSAyOmE9bihmLHUtMik8PDh8bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjEwKSxvLmNoYXJBdCg2MyZhPj40KSxvLmNoYXJBdCg2MyZhPDwyKSxpKX1yZXR1cm4gcy5qb2luKCIiKX0sZGVjb2RlOmZ1bmN0aW9uKGUsbil7dmFyIG8sYSx1LGMsZixzLGw9W10scD1bXTtpZihvPWUucmVwbGFjZSgvW15BLVphLXowLTlcK1wvPV0vZywiIiksdT1vLmxlbmd0aCwwIT09dSU0KXRocm93IEVycm9yKCJKU1hHcmFwaC91dGlscy9iYXNlNjQ6IENhbid0IGRlY29kZSBzdHJpbmcgKGludmFsaWQgaW5wdXQgbGVuZ3RoKS4iKTtmb3Ioby5jaGFyQXQodS0xKT09PWkmJihjPTEsby5jaGFyQXQodS0yKT09PWkmJihjPTIpLHUtPTQpLGE9MDt1PmE7YSs9NClmPXQobyxhKTw8MTh8dChvLGErMSk8PDEyfHQobyxhKzIpPDw2fHQobyxhKzMpLHAucHVzaChmPj4xNiwyNTUmZj4+OCwyNTUmZiksMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxwKSkscD1bXSk7c3dpdGNoKGMpe2Nhc2UgMTpmPXQobyx1KTw8MTJ8dChvLHUrMSk8PDZ8dChvLHUrMikscC5wdXNoKGY+PjEwLDI1NSZmPj4yKTticmVhaztjYXNlIDI6Zj10KG8sYSk8PDZ8dChvLGErMSkscC5wdXNoKGY+PjQpfXJldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHApKSxzPWwuam9pbigiIiksbiYmKHM9ci5kZWNvZGUocykpLHN9LGRlY29kZUFzQXJyYXk6ZnVuY3Rpb24oZSl7dmFyIHIsbj10aGlzLmRlY29kZShlKSx0PVtdLG89bi5sZW5ndGg7Zm9yKHI9MDtvPnI7cisrKXRbcl09bi5jaGFyQ29kZUF0KHIpO3JldHVybiB0fX0sZS5VdGlsLkJhc2U2NH0pLG4oIi4uL2J1aWxkL2NvbXByZXNzb3IuZGVwcy5qcyIsWyJqeGciLCJ1dGlscy96aXAiLCJ1dGlscy9iYXNlNjQiXSxmdW5jdGlvbihlLHIsbil7cmV0dXJuIGUuZGVjb21wcmVzcz1mdW5jdGlvbihlKXtyZXR1cm4gdW5lc2NhcGUobmV3IHIuVW56aXAobi5kZWNvZGVBc0FycmF5KGUpKS51bnppcCgpWzBdWzBdKX0sZX0pLHdpbmRvdy5KWEc9cigiLi4vYnVpbGQvY29tcHJlc3Nvci5kZXBzLmpzIil9KSgpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cuZmlsZUxvYWRpbmcgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIGZpbGVMb2FkaW5nQ2FsbGJhY2tzID0ge307CiAgICB2YXIgdGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICBmdW5jdGlvbiBsb2FkS2V5d29yZHNGaWxlKGZpbGVuYW1lLCBjYWxsYmFjaykgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSA9IGNhbGxiYWNrOwogICAgICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOwogICAgICAgIC8vIHRpbWVzdGFtcCBhcyBhbiBhcmd1bWVudCB0byBwcmV2ZW50IGJyb3dzZXJzIGZyb20gY2FjaGluZyBzY3JpcHRzCiAgICAgICAgLy8gc2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg2NjYxOS9ob3ctdG8tZm9yY2UtaWUtdG8tcmVsb2FkLWphdmFzY3JpcHQKICAgICAgICBzY3JpcHQuc3JjID0gZmlsZW5hbWUrJz90aW1lPScrdGltZXN0YW1wOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHBhcmVudCkgewogICAgICAgIHZhciBjYWxsYWJsZUxpc3QgPSBbXTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxhYmxlKSB7CiAgICAgICAgICAgIGlmICghcGFyZW50LmlzQ2hpbGRyZW5Mb2FkZWQpIHsKICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdC5wdXNoKGNhbGxhYmxlKTsKICAgICAgICAgICAgICAgIGlmIChjYWxsYWJsZUxpc3QubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBsb2FkS2V5d29yZHNGaWxlKHBhcmVudC5jaGlsZEZpbGVOYW1lLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYWJsZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdFtpXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gbm90aWZ5RmlsZUxvYWRlZChmaWxlbmFtZSkgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSgpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBnZXRDYWxsYmFja0hhbmRsZXJGb3JLZXl3b3JkczogZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHMsCiAgICAgICAgbm90aWZ5OiBub3RpZnlGaWxlTG9hZGVkCiAgICB9Cn0oKSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5tb2RlbCA9IChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBTdWl0ZShkYXRhKSB7CiAgICAgICAgdmFyIHN1aXRlID0gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSk7CiAgICAgICAgc3VpdGUuc291cmNlID0gZGF0YS5zb3VyY2U7CiAgICAgICAgc3VpdGUucmVsYXRpdmVTb3VyY2UgPSBkYXRhLnJlbGF0aXZlU291cmNlOwogICAgICAgIHN1aXRlLmZ1bGxOYW1lID0gZGF0YS5wYXJlbnQgPyBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIGRhdGEubmFtZSA6IGRhdGEubmFtZTsKICAgICAgICBzdWl0ZS50eXBlID0gJ3N1aXRlJzsKICAgICAgICBzdWl0ZS50ZW1wbGF0ZSA9ICdzdWl0ZVRlbXBsYXRlJzsKICAgICAgICBzZXRTdGF0cyhzdWl0ZSwgZGF0YS5zdGF0aXN0aWNzKTsKICAgICAgICBzdWl0ZS5tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGE7CiAgICAgICAgc3VpdGUucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVUZXN0cyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdUZXN0Jyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVTdWl0ZXMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignU3VpdGUnKTsKICAgICAgICBzdWl0ZS5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJywgJ3N1aXRlJywgJ3Rlc3QnXTsKICAgICAgICBzdWl0ZS5jYWxsV2hlbkNoaWxkcmVuUmVhZHkgPSBmdW5jdGlvbiAoY2FsbGFibGUpIHsgY2FsbGFibGUoKTsgfTsKICAgICAgICBzdWl0ZS5tZXNzYWdlID0gZGF0YS5tZXNzYWdlOwogICAgICAgIHN1aXRlLmNoaWxkcmVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc3VpdGUua2V5d29yZHMoKS5jb25jYXQoc3VpdGUudGVzdHMoKSkuY29uY2F0KHN1aXRlLnN1aXRlcygpKTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLnNlYXJjaFRlc3RzID0gZnVuY3Rpb24gKHByZWRpY2F0ZSkgewogICAgICAgICAgICB2YXIgdGVzdHMgPSBbXTsKICAgICAgICAgICAgdmFyIHN1aXRlcyA9IHRoaXMuc3VpdGVzKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc3VpdGVzKQogICAgICAgICAgICAgICAgdGVzdHMgPSB0ZXN0cy5jb25jYXQoc3VpdGVzW2ldLnNlYXJjaFRlc3RzKHByZWRpY2F0ZSkpOwogICAgICAgICAgICByZXR1cm4gdGVzdHMuY29uY2F0KHV0aWwuZmlsdGVyKHRoaXMudGVzdHMoKSwgcHJlZGljYXRlKSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5zZWFyY2hUZXN0c0luU3VpdGUgPSBmdW5jdGlvbiAocGF0dGVybiwgbWF0Y2hlcikgewogICAgICAgICAgICBpZiAoIW1hdGNoZXIpCiAgICAgICAgICAgICAgICBtYXRjaGVyID0gdXRpbC5NYXRjaGVyKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzQW55KFtzdWl0ZS5mdWxsTmFtZSwgc3VpdGUubmFtZV0pKQogICAgICAgICAgICAgICAgcmV0dXJuIHN1aXRlLmFsbFRlc3RzKCk7CiAgICAgICAgICAgIHZhciB0ZXN0cyA9IFtdOwogICAgICAgICAgICB2YXIgc3VpdGVzID0gdGhpcy5zdWl0ZXMoKTsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzdWl0ZXMpCiAgICAgICAgICAgICAgICB0ZXN0cyA9IHRlc3RzLmNvbmNhdChzdWl0ZXNbaV0uc2VhcmNoVGVzdHNJblN1aXRlKHBhdHRlcm4sIG1hdGNoZXIpKTsKICAgICAgICAgICAgcmV0dXJuIHRlc3RzOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuc2VhcmNoVGVzdHNCeVRhZyA9IGZ1bmN0aW9uICh0YWcpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICBpZiAodGFnLmNvbWJpbmVkKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdC50YWdzLCB0YWcuY29tYmluZWQpOwogICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVGFnKHRlc3QudGFncywgdGFnLmxhYmVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5maW5kU3VpdGVCeU5hbWUgPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gZmluZFN1aXRlQnlOYW1lKHN1aXRlLCBuYW1lKTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLmFsbFRlc3RzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc3VpdGUuc2VhcmNoVGVzdHMoZnVuY3Rpb24gKHRlc3QpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBzdWl0ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnRhaW5zVGFnKHRlc3RUYWdzLCB0YWduYW1lKSB7CiAgICAgICAgdGVzdFRhZ3MgPSB1dGlsLm1hcCh0ZXN0VGFncywgdXRpbC5ub3JtYWxpemUpOwogICAgICAgIHJldHVybiB1dGlsLmNvbnRhaW5zKHRlc3RUYWdzLCB1dGlsLm5vcm1hbGl6ZSh0YWduYW1lKSk7CiAgICB9CiAgICBmdW5jdGlvbiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHBhdHRlcm4pIHsKICAgICAgICB2YXIgcGF0dGVybnM7CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignTk9UJykgIT0gLTEpIHsKICAgICAgICAgICAgcGF0dGVybnMgPSBwYXR0ZXJuLnNwbGl0KCdOT1QnKTsKICAgICAgICAgICAgaWYgKCF1dGlsLm5vcm1hbGl6ZShwYXR0ZXJuc1swXSkpCiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5hbGwodXRpbC5tYXAocGF0dGVybnMuc2xpY2UoMSksIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwYXR0ZXJuc1swXSkgJiYKICAgICAgICAgICAgICAgIHV0aWwuYWxsKHV0aWwubWFwKHBhdHRlcm5zLnNsaWNlKDEpLCBmdW5jdGlvbiAocCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignT1InKSAhPSAtMSkgewogICAgICAgICAgICBwYXR0ZXJucyA9IHBhdHRlcm4uc3BsaXQoJ09SJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFueSh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ0FORCcpICE9IC0xKSB7CiAgICAgICAgICAgIHBhdHRlcm5zID0gcGF0dGVybi5zcGxpdCgnQU5EJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFsbCh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1dGlsLk1hdGNoZXIocGF0dGVybikubWF0Y2hlc0FueSh0ZXN0VGFncyk7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kU3VpdGVCeU5hbWUoc3VpdGUsIG5hbWUpIHsKICAgICAgICBpZiAoc3VpdGUuZnVsbE5hbWUgPT0gbmFtZSkKICAgICAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgICAgIHZhciBzdWJTdWl0ZXMgPSBzdWl0ZS5zdWl0ZXMoKTsKICAgICAgICBmb3IgKHZhciBpIGluIHN1YlN1aXRlcykgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmaW5kU3VpdGVCeU5hbWUoc3ViU3VpdGVzW2ldLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG1hdGNoKQogICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFN0YXRzKHN1aXRlLCBzdGF0cykgewogICAgICAgIGZvciAodmFyIG5hbWUgaW4gc3RhdHMpIHsKICAgICAgICAgICAgc3VpdGVbbmFtZV0gPSBzdGF0c1tuYW1lXTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVNb2RlbE9iamVjdChkYXRhKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lLAogICAgICAgICAgICBkb2M6IGRhdGEuZG9jLAogICAgICAgICAgICBzdGF0dXM6IGRhdGEuc3RhdHVzLAogICAgICAgICAgICB0aW1lczogZGF0YS50aW1lcywKICAgICAgICAgICAgaWQ6IGRhdGEucGFyZW50ID8gZGF0YS5wYXJlbnQuaWQgKyAnLScgKyBkYXRhLmlkIDogZGF0YS5pZAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBUZXN0KGRhdGEpIHsKICAgICAgICB2YXIgdGVzdCA9IGNyZWF0ZU1vZGVsT2JqZWN0KGRhdGEpOwogICAgICAgIHRlc3QudHlwZSA9ICd0ZXN0JzsKICAgICAgICB0ZXN0LnRlbXBsYXRlID0gJ3Rlc3RUZW1wbGF0ZSc7CiAgICAgICAgdGVzdC5mdWxsTmFtZSA9IGRhdGEucGFyZW50LmZ1bGxOYW1lICsgJy4nICsgdGVzdC5uYW1lOwogICAgICAgIHRlc3QuZm9ybWF0UGFyZW50TmFtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWwuZm9ybWF0UGFyZW50TmFtZSh0ZXN0KTsgfTsKICAgICAgICB0ZXN0LnRpbWVvdXQgPSBkYXRhLnRpbWVvdXQ7CiAgICAgICAgdGVzdC5wb3B1bGF0ZUtleXdvcmRzID0gY3JlYXRlSXRlcmFibGVQb3B1bGF0b3IoJ0tleXdvcmQnKTsKICAgICAgICB0ZXN0LmNoaWxkcmVuTmFtZXMgPSBbJ2tleXdvcmQnXTsKICAgICAgICB0ZXN0LmlzQ2hpbGRyZW5Mb2FkZWQgPSBkYXRhLmlzQ2hpbGRyZW5Mb2FkZWQ7CiAgICAgICAgdGVzdC5jYWxsV2hlbkNoaWxkcmVuUmVhZHkgPSB3aW5kb3cuZmlsZUxvYWRpbmcuZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHModGVzdCk7CiAgICAgICAgdGVzdC5jaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRlc3QuaXNDaGlsZHJlbkxvYWRlZCkKICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0LmtleXdvcmRzKCk7CiAgICAgICAgfTsKICAgICAgICB0ZXN0LnRhZ3MgPSBkYXRhLnRhZ3M7CiAgICAgICAgdGVzdC5tZXNzYWdlID0gZGF0YS5tZXNzYWdlOwogICAgICAgIHRlc3QubWF0Y2hlc1RhZ1BhdHRlcm4gPSBmdW5jdGlvbiAocGF0dGVybikgewogICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3QudGFncywgcGF0dGVybik7CiAgICAgICAgfTsKICAgICAgICB0ZXN0Lm1hdGNoZXNOYW1lUGF0dGVybiA9IGZ1bmN0aW9uIChwYXR0ZXJuKSB7CiAgICAgICAgICAgIHJldHVybiB1dGlsLk1hdGNoZXIocGF0dGVybikubWF0Y2hlc0FueShbdGVzdC5uYW1lLCB0ZXN0LmZ1bGxOYW1lXSk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gdGVzdDsKICAgIH0KICAgIGZ1bmN0aW9uIEtleXdvcmQoZGF0YSkgewogICAgICAgIHZhciBrdyA9IGNyZWF0ZU1vZGVsT2JqZWN0KGRhdGEpOwogICAgICAgIGt3LmxpYm5hbWUgPSBkYXRhLmxpYm5hbWU7CiAgICAgICAga3cuZnVsbE5hbWUgPSAoa3cubGlibmFtZSA/IGt3LmxpYm5hbWUgKyAnLicgOiAnJykgKyBrdy5uYW1lOwogICAgICAgIGt3LnR5cGUgPSBkYXRhLnR5cGU7CiAgICAgICAga3cudGVtcGxhdGUgPSAna2V5d29yZFRlbXBsYXRlJzsKICAgICAgICBrdy5hcmd1bWVudHMgPSBkYXRhLmFyZ3M7CiAgICAgICAga3cuYXNzaWduID0gZGF0YS5hc3NpZ24gKyAoZGF0YS5hc3NpZ24gPyAnID0nIDogJycpOwogICAgICAgIGt3LnRhZ3MgPSBkYXRhLnRhZ3M7CiAgICAgICAga3cudGltZW91dCA9IGRhdGEudGltZW91dDsKICAgICAgICBrdy5wb3B1bGF0ZUtleXdvcmRzID0gY3JlYXRlSXRlcmFibGVQb3B1bGF0b3IoJ0tleXdvcmQnKTsKICAgICAgICBrdy5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJ107CiAgICAgICAga3cuaXNDaGlsZHJlbkxvYWRlZCA9IGRhdGEuaXNDaGlsZHJlbkxvYWRlZDsKICAgICAgICBrdy5jYWxsV2hlbkNoaWxkcmVuUmVhZHkgPSB3aW5kb3cuZmlsZUxvYWRpbmcuZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHMoa3cpOwogICAgICAgIGt3LmNoaWxkcmVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoa3cuaXNDaGlsZHJlbkxvYWRlZCkKICAgICAgICAgICAgICAgIHJldHVybiBrdy5rZXl3b3JkcygpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGt3OwogICAgfQogICAgZnVuY3Rpb24gTWVzc2FnZShsZXZlbCwgZGF0ZSwgdGV4dCwgbGluaykgewogICAgICAgIHZhciBtZXNzYWdlID0gewogICAgICAgICAgICB0eXBlOiAnbWVzc2FnZScsCiAgICAgICAgICAgIHRlbXBsYXRlOiAnbWVzc2FnZVRlbXBsYXRlJywKICAgICAgICAgICAgbGV2ZWw6IGxldmVsLAogICAgICAgICAgICB0aW1lOiB1dGlsLnRpbWVGcm9tRGF0ZShkYXRlKSwKICAgICAgICAgICAgZGF0ZTogdXRpbC5kYXRlRnJvbURhdGUoZGF0ZSksCiAgICAgICAgICAgIHRleHQ6IHRleHQsCiAgICAgICAgICAgIGxpbms6IGxpbmsKICAgICAgICB9OwogICAgICAgIG1lc3NhZ2UuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gZnVuY3Rpb24gKGNhbGxhYmxlKSB7IGNhbGxhYmxlKCk7IH07CiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICB9CiAgICBmdW5jdGlvbiBUaW1lcyh0aW1lZGF0YSkgewogICAgICAgIHZhciBzdGFydCA9IHRpbWVkYXRhWzBdOwogICAgICAgIHZhciBlbmQgPSB0aW1lZGF0YVsxXTsKICAgICAgICB2YXIgZWxhcHNlZCA9IHRpbWVkYXRhWzJdOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGVsYXBzZWRNaWxsaXM6IGVsYXBzZWQsCiAgICAgICAgICAgIGVsYXBzZWRUaW1lOiB1dGlsLmZvcm1hdEVsYXBzZWQoZWxhcHNlZCksCiAgICAgICAgICAgIHN0YXJ0VGltZTogdXRpbC5kYXRlVGltZUZyb21EYXRlKHN0YXJ0KSwKICAgICAgICAgICAgZW5kVGltZTogIHV0aWwuZGF0ZVRpbWVGcm9tRGF0ZShlbmQpCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKG5hbWUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHBvcHVsYXRvcikgewogICAgICAgICAgICBwb3B1bGF0ZUl0ZXJhYmxlKHRoaXMsIG5hbWUsIHBvcHVsYXRvcik7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvcHVsYXRlSXRlcmFibGUob2JqLCBuYW1lLCBwb3B1bGF0b3IpIHsKICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpICsgJ3MnOwogICAgICAgIG9ialtuYW1lXSA9IGNyZWF0ZUdldEFsbEZ1bmN0aW9uKHBvcHVsYXRvci5udW1iZXJPZkl0ZW1zLCBwb3B1bGF0b3IuY3JlYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVHZXRBbGxGdW5jdGlvbihudW1iZXJPZkVsZW1lbnRzLCBjcmVhdG9yKSB7CiAgICAgICAgdmFyIGNhY2hlZCA9IG51bGw7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGNhY2hlZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FjaGVkID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bWJlck9mRWxlbWVudHMoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVkLnB1c2goY3JlYXRvcihpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBTdWl0ZTogU3VpdGUsCiAgICAgICAgVGVzdDogVGVzdCwKICAgICAgICBLZXl3b3JkOiBLZXl3b3JkLAogICAgICAgIE1lc3NhZ2U6IE1lc3NhZ2UsCiAgICAgICAgVGltZXM6IFRpbWVzLAogICAgICAgIGNvbnRhaW5zVGFnOiBjb250YWluc1RhZywgIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICAgICAgY29udGFpbnNUYWdQYXR0ZXJuOiBjb250YWluc1RhZ1BhdHRlcm4gIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICB9Owp9KCkpOwp3aW5kb3cuc3RhdHMgPSAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gU3RhdGlzdGljcyh0b3RhbEVsZW1zLCB0YWdFbGVtcywgc3VpdGVFbGVtcykgewogICAgICAgIHJldHVybiB7dG90YWw6IHV0aWwubWFwKHRvdGFsRWxlbXMsIHRvdGFsU3RhdEVsZW0pLAogICAgICAgICAgICAgICAgdGFnOiAgIHV0aWwubWFwKHRhZ0VsZW1zLCB0YWdTdGF0RWxlbSksCiAgICAgICAgICAgICAgICBzdWl0ZTogdXRpbC5tYXAoc3VpdGVFbGVtcywgc3VpdGVTdGF0RWxlbSl9OwogICAgfQogICAgZnVuY3Rpb24gc3RhdEVsZW0oc3RhdCkgewogICAgICAgIHN0YXQudG90YWwgPSBzdGF0LnBhc3MgKyBzdGF0LmZhaWwgKyBzdGF0LnNraXA7CiAgICAgICAgdmFyIHBlcmNlbnRzID0gY2FsY3VsYXRlUGVyY2VudHMoc3RhdC50b3RhbCwgc3RhdC5wYXNzLCBzdGF0LmZhaWwsIHN0YXQuc2tpcCk7CiAgICAgICAgc3RhdC5wYXNzUGVyY2VudCA9IHBlcmNlbnRzWzBdOwogICAgICAgIHN0YXQuc2tpcFBlcmNlbnQgPSBwZXJjZW50c1sxXTsKICAgICAgICBzdGF0LmZhaWxQZXJjZW50ID0gcGVyY2VudHNbMl07CiAgICAgICAgdmFyIHdpZHRocyA9IGNhbGN1bGF0ZVdpZHRocyhzdGF0LnBhc3NQZXJjZW50LCBzdGF0LnNraXBQZXJjZW50LCBzdGF0LmZhaWxQZXJjZW50KTsKICAgICAgICBzdGF0LnBhc3NXaWR0aCA9IHdpZHRoc1swXTsKICAgICAgICBzdGF0LnNraXBXaWR0aCA9IHdpZHRoc1sxXTsKICAgICAgICBzdGF0LmZhaWxXaWR0aCA9IHdpZHRoc1syXTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHRvdGFsU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC50eXBlID0gJ2FsbCc7CiAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICB9CiAgICBmdW5jdGlvbiB0YWdTdGF0RWxlbShkYXRhKSB7CiAgICAgICAgdmFyIHN0YXQgPSBzdGF0RWxlbShkYXRhKTsKICAgICAgICBzdGF0LmxpbmtzID0gcGFyc2VMaW5rcyhzdGF0LmxpbmtzKTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHN1aXRlU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC5mdWxsTmFtZSA9IHN0YXQubGFiZWw7CiAgICAgICAgc3RhdC5mb3JtYXRQYXJlbnROYW1lID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdXRpbC5mb3JtYXRQYXJlbnROYW1lKHN0YXQpOyB9OwogICAgICAgIHJldHVybiBzdGF0OwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VMaW5rcyhsaW5rc0RhdGEpIHsKICAgICAgICBpZiAoIWxpbmtzRGF0YSkKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIHJldHVybiB1dGlsLm1hcChsaW5rc0RhdGEuc3BsaXQoJzo6OicpLCBmdW5jdGlvbiAobGluaykgewogICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gbGluay5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgICAgICByZXR1cm4ge3RpdGxlOiBsaW5rLnNsaWNlKDAsIGluZGV4KSwgdXJsOiBsaW5rLnNsaWNlKGluZGV4KzEpfTsKICAgICAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBjYWxjdWxhdGVQZXJjZW50cyh0b3RhbCwgcGFzc2VkLCBmYWlsZWQsIHNraXBwZWQpIHsKICAgICAgICBpZiAodG90YWwgPT0gMCkgewogICAgICAgICAgICByZXR1cm4gWzAuMCwgMC4wLCAwLjBdOwogICAgICAgIH0KICAgICAgICB2YXIgcGFzcyA9IDEwMC4wICogcGFzc2VkIC8gdG90YWw7CiAgICAgICAgdmFyIHNraXAgPSAxMDAuMCAqIHNraXBwZWQgLyB0b3RhbDsKICAgICAgICB2YXIgZmFpbCA9IDEwMC4wICogZmFpbGVkIC8gdG90YWw7CiAgICAgICAgaWYgKHBhc3MgPiAwICYmIHBhc3MgPCAwLjEpCiAgICAgICAgICAgIHBhc3MgPSAwLjEKICAgICAgICBpZiAoZmFpbCA+IDAgJiYgZmFpbCA8IDAuMSkKICAgICAgICAgICAgZmFpbCA9IDAuMQogICAgICAgIGlmIChza2lwID4gMCAmJiBza2lwIDwgMC4xKQogICAgICAgICAgICBza2lwID0gMC4xCiAgICAgICAgaWYgKHBhc3MgPiA5OS45NSAmJiBwYXNzIDwgMTAwKQogICAgICAgICAgICBwYXNzID0gOTkuOQogICAgICAgIGlmIChmYWlsID4gOTkuOTUgJiYgZmFpbCA8IDEwMCkKICAgICAgICAgICAgZmFpbCA9IDk5LjkKICAgICAgICBpZiAoc2tpcCA+IDk5Ljk1ICYmIHNraXAgPCAxMDApCiAgICAgICAgICAgIHNraXAgPSA5OS45CiAgICAgICAgcmV0dXJuIFtNYXRoLnJvdW5kKHBhc3MqMTApLzEwLCBNYXRoLnJvdW5kKHNraXAqMTApLzEwLCBNYXRoLnJvdW5kKGZhaWwqMTApLzEwXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZVdpZHRocyhudW0xLCBudW0yLCBudW0zKSB7CiAgICAgICAgaWYgKG51bTEgKyBudW0yICsgbnVtMyA9PT0gMCkKICAgICAgICAgICAgcmV0dXJuIFswLjAsIDAuMCwgMC4wXTsKICAgICAgICAvLyBNYWtlIHNtYWxsIHBlcmNlbnRhZ2VzIGJldHRlciB2aXNpYmxlCiAgICAgICAgaWYgKG51bTEgPiAwICYmIG51bTEgPCAxKQogICAgICAgICAgICBudW0xID0gMQogICAgICAgIGlmIChudW0yID4gMCAmJiBudW0yIDwgMSkKICAgICAgICAgICAgbnVtMiA9IDEKICAgICAgICBpZiAobnVtMyA+IDAgJiYgbnVtMyA8IDEpCiAgICAgICAgICAgIG51bTMgPSAxCiAgICAgICAgLy8gSGFuZGxlIHNpdHVhdGlvbiB3aGVyZSBzb21lIGFyZSByb3VuZGVkIHVwCiAgICAgICAgd2hpbGUgKG51bTEgKyBudW0yICsgbnVtMyA+IDEwMCkgewogICAgICAgICAgICBpZiAobnVtMSA+IG51bTIgJiYgbnVtMSA+IG51bTMpCiAgICAgICAgICAgICAgICBudW0xIC09IDAuMTsKICAgICAgICAgICAgZWxzZSBpZiAobnVtMiA+IG51bTEgJiYgbnVtMiA+IG51bTMpCiAgICAgICAgICAgICAgICBudW0yIC09IDAuMTsKICAgICAgICAgICAgZWxzZSBpZiAobnVtMyA+IG51bTEgJiYgbnVtMyA+IG51bTIpCiAgICAgICAgICAgICAgICBudW0zIC09IDAuMTsKICAgICAgICAgICAgZWxzZSBpZiAobnVtMSA+IG51bTMgJiYgbnVtMSA9PSBudW0yKSB7CiAgICAgICAgICAgICAgICBudW0xIC09IDAuMTsKICAgICAgICAgICAgICAgIG51bTIgLT0gMC4xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG51bTEgPiBudW0yICYmIG51bTEgPT0gbnVtMykgewogICAgICAgICAgICAgICAgbnVtMSAtPSAwLjE7CiAgICAgICAgICAgICAgICBudW0zIC09IDAuMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChudW0yID4gbnVtMSAmJiBudW0yID09IG51bTMpIHsKICAgICAgICAgICAgICAgIG51bTIgLT0gMC4xOwogICAgICAgICAgICAgICAgbnVtMyAtPSAwLjE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtNYXRoLmNlaWwobnVtMSoxMCkvMTAsIE1hdGguY2VpbChudW0yKjEwKS8xMCwgTWF0aC5jZWlsKG51bTMqMTApLzEwXTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgU3RhdGlzdGljczogU3RhdGlzdGljcwogICAgfTsKfSgpKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LnV0aWwgPSBmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBtYXAoZWxlbXMsIGZ1bmMpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIHJldFtpXSA9IGZ1bmMoZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gZmlsdGVyKGVsZW1zLCBwcmVkaWNhdGUpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZWxlbXNbaV0pKQogICAgICAgICAgICAgICAgcmV0LnB1c2goZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gYWxsKGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmICghZWxlbXNbaV0pCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gYW55KGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChlbGVtc1tpXSkKICAgICAgICAgICAgICAgIHJldHVybiBlbGVtc1tpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gY29udGFpbnMoZWxlbXMsIGUpIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgaWYgKGVsZW1zW2ldID09IGUpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gbGFzdChpdGVtcykgewogICAgICAgIHJldHVybiBpdGVtc1tpdGVtcy5sZW5ndGgtMV07CiAgICB9CiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyZsdDsvZywgJzwnKS5yZXBsYWNlKC8mZ3Q7L2csICc+JykucmVwbGFjZSgvJmFtcDsvZywgJyYnKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTsKICAgIH0KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnJykucmVwbGFjZSgvXy9nLCAnJyk7CiAgICB9CiAgICBmdW5jdGlvbiByZWdleHBFc2NhcGUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLVtcXXt9KCkrPyouLFxcXiR8I10vZywgIlxcJCYiKTsKICAgIH0KICAgIGZ1bmN0aW9uIE1hdGNoZXIocGF0dGVybikgewogICAgICAgIHBhdHRlcm4gPSByZWdleHBFc2NhcGUobm9ybWFsaXplKHBhdHRlcm4pKTsKICAgICAgICB2YXIgcmVQYXR0ZXJuID0gJ14nICsgcGF0dGVybi5yZXBsYWNlKC9cXFw/L2csICcuJykucmVwbGFjZSgvXFxcKi9nLCAnW1xcc1xcU10qJykgKyAnJCc7CiAgICAgICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAocmVQYXR0ZXJuKTsKICAgICAgICBmdW5jdGlvbiBtYXRjaGVzKHN0cmluZykgewogICAgICAgICAgICByZXR1cm4gcmVnZXhwLnRlc3Qobm9ybWFsaXplKHN0cmluZykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICBtYXRjaGVzOiBtYXRjaGVzLAogICAgICAgICAgICBtYXRjaGVzQW55OiBmdW5jdGlvbiAoc3RyaW5ncykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0cmluZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspCiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMoc3RyaW5nc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1hdFBhcmVudE5hbWUoaXRlbSkgewogICAgICAgIHZhciBwYXJlbnROYW1lID0gaXRlbS5mdWxsTmFtZS5zbGljZSgwLCBpdGVtLmZ1bGxOYW1lLmxlbmd0aCAtIGl0ZW0ubmFtZS5sZW5ndGgpOwogICAgICAgIHJldHVybiBwYXJlbnROYW1lLnJlcGxhY2UoL1wuL2csICcgLiAnKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRpbWVGcm9tRGF0ZShkYXRlKSB7CiAgICAgICAgaWYgKCFkYXRlKQogICAgICAgICAgICByZXR1cm4gJ04vQSc7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlLmdldFNlY29uZHMoKSwgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSk7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlRnJvbURhdGUoZGF0ZSkgewogICAgICAgIGlmICghZGF0ZSkKICAgICAgICAgICAgcmV0dXJuICdOL0EnOwogICAgICAgIHJldHVybiBwYWRUbyhkYXRlLmdldEZ1bGxZZWFyKCksIDQpICsKICAgICAgICAgICAgICAgcGFkVG8oZGF0ZS5nZXRNb250aCgpICsgMSwgMikgKwogICAgICAgICAgICAgICBwYWRUbyhkYXRlLmdldERhdGUoKSwgMik7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlVGltZUZyb21EYXRlKGRhdGUpIHsKICAgICAgICBpZiAoIWRhdGUpCiAgICAgICAgICAgIHJldHVybiAnTi9BJzsKICAgICAgICByZXR1cm4gZGF0ZUZyb21EYXRlKGRhdGUpICsgJyAnICsgdGltZUZyb21EYXRlKGRhdGUpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0VGltZShob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzKSB7CiAgICAgICAgcmV0dXJuIHBhZFRvKGhvdXJzLCAyKSArICc6JyArCiAgICAgICAgICAgICAgIHBhZFRvKG1pbnV0ZXMsIDIpICsgJzonICsKICAgICAgICAgICAgICAgcGFkVG8oc2Vjb25kcywgMikgKyAnLicgKwogICAgICAgICAgICAgICBwYWRUbyhtaWxsaXNlY29uZHMsIDMpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0RWxhcHNlZChlbGFwc2VkKSB7CiAgICAgICAgdmFyIG1pbGxpcyA9IGVsYXBzZWQ7CiAgICAgICAgdmFyIGhvdXJzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAoNjAgKiA2MCAqIDEwMDApKTsKICAgICAgICBtaWxsaXMgLT0gaG91cnMgKiA2MCAqIDYwICogMTAwMDsKICAgICAgICB2YXIgbWludXRlcyA9IE1hdGguZmxvb3IobWlsbGlzIC8gKDYwICogMTAwMCkpOwogICAgICAgIG1pbGxpcyAtPSBtaW51dGVzICogNjAgKiAxMDAwOwogICAgICAgIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAxMDAwKTsKICAgICAgICBtaWxsaXMgLT0gc2Vjb25kcyAqIDEwMDA7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpcyk7CiAgICB9CiAgICBmdW5jdGlvbiBwYWRUbyhudW1iZXIsIGxlbikgewogICAgICAgIHZhciBudW1TdHJpbmcgPSBudW1iZXIgKyAiIjsKICAgICAgICB3aGlsZSAobnVtU3RyaW5nLmxlbmd0aCA8IGxlbikgbnVtU3RyaW5nID0gIjAiICsgbnVtU3RyaW5nOwogICAgICAgIHJldHVybiBudW1TdHJpbmc7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lc3RhbXAobWlsbGlzKSB7CiAgICAgICAgLy8gdXNlZCBhbHNvIGJ5IHRvb2xzIHRoYXQgZG8gbm90IHNldCB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMKICAgICAgICB2YXIgYmFzZSA9IHdpbmRvdy5vdXRwdXQgPyB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMgOiAwOwogICAgICAgIHJldHVybiBuZXcgRGF0ZShiYXNlICsgbWlsbGlzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZFN0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRpbWVzdGFtcCk7CiAgICAgICAgdmFyIGR0ID0gZGF0ZVRpbWVGcm9tRGF0ZShkYXRlKS5zbGljZSgwLCAxNyk7ICAvLyBkcm9wIG1pbGxpcwogICAgICAgIHZhciBvZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICAgICAgdmFyIHNpZ24gPSBvZmZzZXQgPiAwID8gJy0nIDogJysnOwogICAgICAgIHZhciBoaCA9IE1hdGguZmxvb3IoTWF0aC5hYnMob2Zmc2V0KSAvIDYwKTsKICAgICAgICB2YXIgbW0gPSBNYXRoLmFicyhvZmZzZXQpICUgNjA7CiAgICAgICAgcmV0dXJuIGR0ICsgJyBVVEMnICsgc2lnbiArIHBhZFRvKGhoLCAyKSArICc6JyArIHBhZFRvKG1tLCAyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICBmdW5jdGlvbiB0aW1lU3RyaW5nKHRpbWUsIHNob3J0VW5pdCkgewogICAgICAgICAgICB2YXIgdW5pdCA9IHt5OiAneWVhcicsIGQ6ICdkYXknLCBoOiAnaG91cicsIG06ICdtaW51dGUnLAogICAgICAgICAgICAgICAgICAgICAgICBzOiAnc2Vjb25kJ31bc2hvcnRVbml0XTsKICAgICAgICAgICAgdmFyIGVuZCA9IHRpbWUgPT0gMSA/ICcgJyA6ICdzICc7CiAgICAgICAgICAgIHJldHVybiB0aW1lICsgJyAnICsgdW5pdCArIGVuZDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY29tcGVuc2F0ZUxlYXBZZWFycyhkYXlzLCB5ZWFycykgewogICAgICAgICAgICAvLyBOb3QgYSBwZXJmZWN0IGFsZ29yaXRobSBidXQgb3VnaHQgdG8gYmUgZW5vdWdoCiAgICAgICAgICAgIHJldHVybiBkYXlzIC0gTWF0aC5mbG9vcih5ZWFycyAvIDQpOwogICAgICAgIH0KICAgICAgICB2YXIgZ2VuZXJhdGVkID0gTWF0aC5yb3VuZCh0aW1lc3RhbXAgLyAxMDAwKTsKICAgICAgICB2YXIgY3VycmVudCA9IE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKTsKICAgICAgICB2YXIgZWxhcHNlZCA9IGN1cnJlbnQgLSBnZW5lcmF0ZWQ7CiAgICAgICAgdmFyIHByZWZpeCA9ICcnOwogICAgICAgIGlmIChlbGFwc2VkIDwgMCkgewogICAgICAgICAgICBwcmVmaXggPSAnLSAnOwogICAgICAgICAgICBlbGFwc2VkID0gTWF0aC5hYnMoZWxhcHNlZCk7CiAgICAgICAgfQogICAgICAgIHZhciBzZWNzICA9IGVsYXBzZWQgJSA2MDsKICAgICAgICB2YXIgbWlucyAgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyA2MCkgJSA2MDsKICAgICAgICB2YXIgaG91cnMgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyAoNjAqNjApKSAlIDI0OwogICAgICAgIHZhciBkYXlzICA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCkpICUgMzY1OwogICAgICAgIHZhciB5ZWFycyA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCozNjUpKTsKICAgICAgICBpZiAoeWVhcnMpIHsKICAgICAgICAgICAgZGF5cyA9IGNvbXBlbnNhdGVMZWFwWWVhcnMoZGF5cywgeWVhcnMpOwogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyh5ZWFycywgJ3knKSArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKTsKICAgICAgICB9IGVsc2UgaWYgKGRheXMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKSArIHRpbWVTdHJpbmcoaG91cnMsICdoJyk7CiAgICAgICAgfSBlbHNlIGlmIChob3VycykgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhob3VycywgJ2gnKSArIHRpbWVTdHJpbmcobWlucywgJ20nKTsKICAgICAgICB9IGVsc2UgaWYgKG1pbnMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcobWlucywgJ20nKSArIHRpbWVTdHJpbmcoc2VjcywgJ3MnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhzZWNzLCAncycpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmcocXVlcnkpIHsKICAgICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgICAgaWYgKCFxdWVyeSkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB2YXIgcGFyYW1zID0gcXVlcnkuc3BsaXQoJyYnKTsKICAgICAgICB2YXIgcGFydHM7CiAgICAgICAgZnVuY3Rpb24gZGVjb2RlKGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChpdGVtLnJlcGxhY2UoJysnLCAnICcpKTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcmFtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBwYXJ0cyA9IHBhcmFtc1tpXS5zcGxpdCgnPScpOwogICAgICAgICAgICByZXN1bHRbZGVjb2RlKHBhcnRzLnNoaWZ0KCkpXSA9IGRlY29kZShwYXJ0cy5qb2luKCc9JykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBtYXA6IG1hcCwKICAgICAgICBmaWx0ZXI6IGZpbHRlciwKICAgICAgICBhbGw6IGFsbCwKICAgICAgICBhbnk6IGFueSwKICAgICAgICBjb250YWluczogY29udGFpbnMsCiAgICAgICAgbGFzdDogbGFzdCwKICAgICAgICBlc2NhcGU6IGVzY2FwZSwKICAgICAgICB1bmVzY2FwZTogdW5lc2NhcGUsCiAgICAgICAgbm9ybWFsaXplOiBub3JtYWxpemUsCiAgICAgICAgcmVnZXhwRXNjYXBlOiByZWdleHBFc2NhcGUsCiAgICAgICAgTWF0Y2hlcjogTWF0Y2hlciwKICAgICAgICBmb3JtYXRQYXJlbnROYW1lOiBmb3JtYXRQYXJlbnROYW1lLAogICAgICAgIHRpbWVGcm9tRGF0ZTogdGltZUZyb21EYXRlLAogICAgICAgIGRhdGVGcm9tRGF0ZTogZGF0ZUZyb21EYXRlLAogICAgICAgIGRhdGVUaW1lRnJvbURhdGU6IGRhdGVUaW1lRnJvbURhdGUsCiAgICAgICAgZm9ybWF0RWxhcHNlZDogZm9ybWF0RWxhcHNlZCwKICAgICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcCwKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRTdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZFN0cmluZywKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZywKICAgICAgICBwYXJzZVF1ZXJ5U3RyaW5nOiBwYXJzZVF1ZXJ5U3RyaW5nCiAgICB9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy50ZXN0ZGF0YSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBlbGVtZW50c0J5SWQgPSB7fTsKICAgIHZhciBpZENvdW50ZXIgPSAwOwogICAgdmFyIF9zdGF0aXN0aWNzID0gbnVsbDsKICAgIHZhciBMRVZFTFMgPSBbJ1RSQUNFJywgJ0RFQlVHJywgJ0lORk8nLCAnV0FSTicsICdFUlJPUicsICdGQUlMJywgJ1NLSVAnXTsKICAgIHZhciBTVEFUVVNFUyA9IFsnRkFJTCcsICdQQVNTJywgJ1NLSVAnLCAnTk9UIFJVTiddOwogICAgdmFyIEtFWVdPUkRfVFlQRVMgPSBbJ0tFWVdPUkQnLCAnU0VUVVAnLCAnVEVBUkRPV04nLCAnRk9SJywgJ1ZBUicsICdJRicsICdFTFNFIElGJywgJ0VMU0UnXTsKICAgIHZhciBNRVNTQUdFX1RZUEUgPSA4OwogICAgZnVuY3Rpb24gYWRkRWxlbWVudChlbGVtKSB7CiAgICAgICAgaWYgKCFlbGVtLmlkKQogICAgICAgICAgICBlbGVtLmlkID0gdW5pcXVlSWQoKTsKICAgICAgICBlbGVtZW50c0J5SWRbZWxlbS5pZF0gPSBlbGVtOwogICAgICAgIHJldHVybiBlbGVtOwogICAgfQogICAgZnVuY3Rpb24gdW5pcXVlSWQoKSB7CiAgICAgICAgaWRDb3VudGVyKys7CiAgICAgICAgcmV0dXJuICdlbGVtZW50LWlkLScgKyBpZENvdW50ZXI7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lcyhzdGF0cykgewogICAgICAgIHZhciBzdGFydE1pbGxpcyA9IHN0YXRzWzFdOwogICAgICAgIHZhciBlbGFwc2VkID0gc3RhdHNbMl07CiAgICAgICAgaWYgKHN0YXJ0TWlsbGlzID09PSBudWxsKQogICAgICAgICAgICByZXR1cm4gW251bGwsIG51bGwsIGVsYXBzZWRdOwogICAgICAgIHJldHVybiBbdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMpLAogICAgICAgICAgICAgICAgdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMgKyBlbGFwc2VkKSwKICAgICAgICAgICAgICAgIGVsYXBzZWRdOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlTWVzc2FnZShlbGVtZW50LCBzdHJpbmdzKSB7CiAgICAgICAgcmV0dXJuIG1vZGVsLk1lc3NhZ2UoTEVWRUxTW2VsZW1lbnRbMl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwudGltZXN0YW1wKGVsZW1lbnRbMV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MuZ2V0KGVsZW1lbnRbM10pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MuZ2V0KGVsZW1lbnRbNF0pKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlU3RhdHVzKHN0YXRzKSB7CiAgICAgICAgcmV0dXJuIFNUQVRVU0VTW3N0YXRzWzBdXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNoaWxkQ3JlYXRvcihwYXJlbnQsIGNoaWxkVHlwZSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoZWxlbSwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQoY2hpbGRUeXBlKHBhcmVudCwgZWxlbSwgc3RyaW5ncywgaW5kZXgpKTsKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlQm9keUl0ZW0ocGFyZW50LCBlbGVtZW50LCBzdHJpbmdzLCBpbmRleCkgewogICAgICAgIGlmIChlbGVtZW50WzBdID09IE1FU1NBR0VfVFlQRSkKICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2UoZWxlbWVudCwgc3RyaW5ncyk7CiAgICAgICAgcmV0dXJuIGNyZWF0ZUtleXdvcmQocGFyZW50LCBlbGVtZW50LCBzdHJpbmdzLCBpbmRleCk7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVLZXl3b3JkKHBhcmVudCwgZWxlbWVudCwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICB2YXIga3cgPSBtb2RlbC5LZXl3b3JkKHsKICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgICAgIHR5cGU6IEtFWVdPUkRfVFlQRVNbZWxlbWVudFswXV0sCiAgICAgICAgICAgIGlkOiAnaycgKyAoaW5kZXggKyAxKSwKICAgICAgICAgICAgbmFtZTogc3RyaW5ncy5nZXQoZWxlbWVudFsxXSksCiAgICAgICAgICAgIGxpYm5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMl0pLAogICAgICAgICAgICB0aW1lb3V0OiBzdHJpbmdzLmdldChlbGVtZW50WzNdKSwKICAgICAgICAgICAgYXJnczogc3RyaW5ncy5nZXQoZWxlbWVudFs1XSksCiAgICAgICAgICAgIGFzc2lnbjogc3RyaW5ncy5nZXQoZWxlbWVudFs2XSksCiAgICAgICAgICAgIHRhZ3M6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbN10pLAogICAgICAgICAgICBkb2M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkb2MgPSBzdHJpbmdzLmdldChlbGVtZW50WzRdKTsKICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3RhdHVzOiBwYXJzZVN0YXR1cyhlbGVtZW50WzhdLCBzdHJpbmdzKSwKICAgICAgICAgICAgdGltZXM6IG1vZGVsLlRpbWVzKHRpbWVzKGVsZW1lbnRbOF0pKSwKICAgICAgICAgICAgaXNDaGlsZHJlbkxvYWRlZDogdHlwZW9mKGVsZW1lbnRbOV0pICE9PSAnbnVtYmVyJwogICAgICAgIH0pOwogICAgICAgIGxhenlQb3B1bGF0ZUtleXdvcmRzRnJvbUZpbGUoa3csIGVsZW1lbnRbOV0sIHN0cmluZ3MpOwogICAgICAgIHJldHVybiBrdzsKICAgIH0KICAgIGZ1bmN0aW9uIGxhenlQb3B1bGF0ZUtleXdvcmRzRnJvbUZpbGUocGFyZW50LCBtb2RlbE9ySW5kZXgsIHN0cmluZ3MpIHsKICAgICAgICB2YXIgbW9kZWwsIGluZGV4LCBwb3B1bGF0b3I7CiAgICAgICAgdmFyIGNyZWF0b3IgPSBjaGlsZENyZWF0b3IocGFyZW50LCBjcmVhdGVCb2R5SXRlbSk7CiAgICAgICAgaWYgKHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkKSB7CiAgICAgICAgICAgIG1vZGVsID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwb3B1bGF0b3IgPSBQb3B1bGF0b3IobW9kZWwsIHN0cmluZ3MsIGNyZWF0b3IpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluZGV4ID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwYXJlbnQuY2hpbGRGaWxlTmFtZSA9IHdpbmRvdy5zZXR0aW5nc1snc3BsaXRMb2dCYXNlJ10gKyAnLScgKyBpbmRleCArICcuanMnOwogICAgICAgICAgICBwb3B1bGF0b3IgPSBTcGxpdExvZ1BvcHVsYXRvcihpbmRleCwgY3JlYXRvcik7CiAgICAgICAgfQogICAgICAgIHBhcmVudC5wb3B1bGF0ZUtleXdvcmRzKHBvcHVsYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiB0YWdzKHRhZ2xpc3QsIHN0cmluZ3MpIHsKICAgICAgICByZXR1cm4gdXRpbC5tYXAodGFnbGlzdCwgc3RyaW5ncy5nZXQpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlVGVzdChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1cyA9IGVsZW1lbnRbNF07CiAgICAgICAgdmFyIHRlc3QgPSBtb2RlbC5UZXN0KHsKICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgICAgIGlkOiAndCcgKyAoaW5kZXggKyAxKSwKICAgICAgICAgICAgbmFtZTogc3RyaW5ncy5nZXQoZWxlbWVudFswXSksCiAgICAgICAgICAgIGRvYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGRvYyA9IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMl0pOwogICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBkb2M7IH07CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9LAogICAgICAgICAgICB0aW1lb3V0OiBzdHJpbmdzLmdldChlbGVtZW50WzFdKSwKICAgICAgICAgICAgc3RhdHVzOiBwYXJzZVN0YXR1cyhzdGF0dXMpLAogICAgICAgICAgICBtZXNzYWdlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgbXNnID0gc3RhdHVzLmxlbmd0aCA9PSA0ID8gc3RyaW5ncy5nZXQoc3RhdHVzWzNdKSA6ICcnOwogICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbXNnOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZXM6IG1vZGVsLlRpbWVzKHRpbWVzKHN0YXR1cykpLAogICAgICAgICAgICB0YWdzOiB0YWdzKGVsZW1lbnRbM10sIHN0cmluZ3MpLAogICAgICAgICAgICBpc0NoaWxkcmVuTG9hZGVkOiB0eXBlb2YoZWxlbWVudFs1XSkgIT09ICdudW1iZXInCiAgICAgICAgfSk7CiAgICAgICAgbGF6eVBvcHVsYXRlS2V5d29yZHNGcm9tRmlsZSh0ZXN0LCBlbGVtZW50WzVdLCBzdHJpbmdzKTsKICAgICAgICByZXR1cm4gdGVzdDsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN1aXRlKHBhcmVudCwgZWxlbWVudCwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICB2YXIgc3RhdHVzID0gZWxlbWVudFs1XTsKICAgICAgICB2YXIgc3VpdGUgPSBtb2RlbC5TdWl0ZSh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICBpZDogJ3MnICsgKChpbmRleCB8fCAwKSArIDEpLAogICAgICAgICAgICBuYW1lOiBzdHJpbmdzLmdldChlbGVtZW50WzBdKSwKICAgICAgICAgICAgc291cmNlOiBzdHJpbmdzLmdldChlbGVtZW50WzFdKSwKICAgICAgICAgICAgcmVsYXRpdmVTb3VyY2U6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMl0pLAogICAgICAgICAgICBkb2M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkb2MgPSBzdHJpbmdzLmdldChlbGVtZW50WzNdKTsKICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3RhdHVzOiBwYXJzZVN0YXR1cyhzdGF0dXMpLAogICAgICAgICAgICBtZXNzYWdlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgbXNnID0gc3RhdHVzLmxlbmd0aCA9PSA0ID8gc3RyaW5ncy5nZXQoc3RhdHVzWzNdKSA6ICcnOwogICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbXNnOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZXM6IG1vZGVsLlRpbWVzKHRpbWVzKHN0YXR1cykpLAogICAgICAgICAgICBzdGF0aXN0aWNzOiBzdWl0ZVN0YXRzKHV0aWwubGFzdChlbGVtZW50KSksCiAgICAgICAgICAgIG1ldGFkYXRhOiBwYXJzZU1ldGFkYXRhKGVsZW1lbnRbNF0sIHN0cmluZ3MpCiAgICAgICAgfSk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVLZXl3b3JkcyhQb3B1bGF0b3IoZWxlbWVudFs4XSwgc3RyaW5ncywgY2hpbGRDcmVhdG9yKHN1aXRlLCBjcmVhdGVLZXl3b3JkKSkpOwogICAgICAgIHN1aXRlLnBvcHVsYXRlVGVzdHMoUG9wdWxhdG9yKGVsZW1lbnRbN10sIHN0cmluZ3MsIGNoaWxkQ3JlYXRvcihzdWl0ZSwgY3JlYXRlVGVzdCkpKTsKICAgICAgICBzdWl0ZS5wb3B1bGF0ZVN1aXRlcyhQb3B1bGF0b3IoZWxlbWVudFs2XSwgc3RyaW5ncywgY2hpbGRDcmVhdG9yKHN1aXRlLCBjcmVhdGVTdWl0ZSkpKTsKICAgICAgICByZXR1cm4gc3VpdGU7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZU1ldGFkYXRhKGRhdGEsIHN0cmluZ3MpIHsKICAgICAgICB2YXIgbWV0YWRhdGEgPSBbXTsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8ZGF0YS5sZW5ndGg7IGkrPTIpIHsKICAgICAgICAgICAgbWV0YWRhdGEucHVzaChbc3RyaW5ncy5nZXQoZGF0YVtpXSksIHN0cmluZ3MuZ2V0KGRhdGFbaSsxXSldKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1ldGFkYXRhOwogICAgfQogICAgZnVuY3Rpb24gc3VpdGVTdGF0cyhzdGF0cykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRvdGFsOiBzdGF0c1swXSwKICAgICAgICAgICAgcGFzczogc3RhdHNbMV0sCiAgICAgICAgICAgIGZhaWw6IHN0YXRzWzJdLAogICAgICAgICAgICBza2lwOiBzdGF0c1szXQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBQb3B1bGF0b3IoaXRlbXMsIHN0cmluZ3MsIGNyZWF0b3IpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBudW1iZXJPZkl0ZW1zOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXMubGVuZ3RoOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjcmVhdG9yOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdG9yKGl0ZW1zW2luZGV4XSwgc3RyaW5ncywgaW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIFNwbGl0TG9nUG9wdWxhdG9yKHN0cnVjdHVyZUluZGV4LCBjcmVhdG9yKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbnVtYmVyT2ZJdGVtczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvd1sna2V5d29yZHMnK3N0cnVjdHVyZUluZGV4XS5sZW5ndGg7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNyZWF0b3I6IGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0b3Iod2luZG93WydrZXl3b3Jkcycrc3RydWN0dXJlSW5kZXhdW2luZGV4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1N0b3JlKHdpbmRvd1snc3RyaW5ncycrc3RydWN0dXJlSW5kZXhdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZSgpIHsKICAgICAgICB2YXIgZWxlbSA9IHdpbmRvdy5vdXRwdXQuc3VpdGU7CiAgICAgICAgaWYgKGVsZW1lbnRzQnlJZFtlbGVtLmlkXSkKICAgICAgICAgICAgcmV0dXJuIGVsZW07CiAgICAgICAgdmFyIHJvb3QgPSBhZGRFbGVtZW50KGNyZWF0ZVN1aXRlKG51bGwsIGVsZW0sIFN0cmluZ1N0b3JlKHdpbmRvdy5vdXRwdXQuc3RyaW5ncykpKTsKICAgICAgICB3aW5kb3cub3V0cHV0LnN1aXRlID0gcm9vdDsKICAgICAgICByZXR1cm4gcm9vdDsKICAgIH0KICAgIGZ1bmN0aW9uIGZpbmRMb2FkZWQoaWQpIHsKICAgICAgICByZXR1cm4gZWxlbWVudHNCeUlkW2lkXTsKICAgIH0KICAgIGZ1bmN0aW9uIGVuc3VyZUxvYWRlZChpZCwgY2FsbGJhY2spIHsKICAgICAgICB2YXIgaWRzID0gaWQuc3BsaXQoJy0nKTsKICAgICAgICB2YXIgcm9vdCA9IHN1aXRlKCk7CiAgICAgICAgaWRzLnNoaWZ0KCk7CiAgICAgICAgbG9hZEl0ZW1zKGlkcywgcm9vdCwgW3Jvb3QuaWRdLCBjYWxsYmFjayk7CiAgICB9CiAgICBmdW5jdGlvbiBsb2FkSXRlbXMoaWRzLCBjdXJyZW50LCByZXN1bHQsIGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKCFpZHMubGVuZ3RoKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKHJlc3VsdCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY3VycmVudC5jYWxsV2hlbkNoaWxkcmVuUmVhZHkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgaWQgPSBpZHMuc2hpZnQoKTsKICAgICAgICAgICAgdmFyIHR5cGUgPSBpZFswXTsKICAgICAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VJbnQoaWQuc3Vic3RyaW5nKDEpKSAtIDE7CiAgICAgICAgICAgIHZhciBpdGVtID0gc2VsZWN0RnJvbShjdXJyZW50LCB0eXBlLCBpbmRleCk7CiAgICAgICAgICAgIGlmIChpdGVtKQogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaXRlbS5pZCk7CiAgICAgICAgICAgIGVsc2UgICAgLy8gSW52YWxpZCBpZC4gU2hvdWxkIHRoaXMgYmUgcmVwb3J0ZWQgc29tZXdoZXJlPwogICAgICAgICAgICAgICAgaWRzID0gW107CiAgICAgICAgICAgIGxvYWRJdGVtcyhpZHMsIGl0ZW0sIHJlc3VsdCwgY2FsbGJhY2spOwogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gc2VsZWN0RnJvbShlbGVtZW50LCB0eXBlLCBpbmRleCkgewogICAgICAgIGlmICh0eXBlID09PSAnaycpIHsKICAgICAgICAgICAgdmFyIGtleXdvcmRzID0gdXRpbC5maWx0ZXIoZWxlbWVudC5rZXl3b3JkcygpLCBmdW5jdGlvbiAoa3cpIHsKICAgICAgICAgICAgICAgIHJldHVybiBrdy50eXBlICE9ICdtZXNzYWdlJzsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBrZXl3b3Jkc1tpbmRleF07CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAndCcpIHsKICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudGVzdHMoKVtpbmRleF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuc3VpdGVzKClbaW5kZXhdOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGVycm9ySXRlcmF0b3IoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQoY3JlYXRlTWVzc2FnZSh3aW5kb3cub3V0cHV0LmVycm9ycy5zaGlmdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGhhc05leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cub3V0cHV0LmVycm9ycy5sZW5ndGggPiAwOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YXRpc3RpY3MoKSB7CiAgICAgICAgaWYgKCFfc3RhdGlzdGljcykgewogICAgICAgICAgICB2YXIgc3RhdERhdGEgPSB3aW5kb3cub3V0cHV0LnN0YXRzOwogICAgICAgICAgICBfc3RhdGlzdGljcyA9IHN0YXRzLlN0YXRpc3RpY3Moc3RhdERhdGFbMF0sIHN0YXREYXRhWzFdLCBzdGF0RGF0YVsyXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfc3RhdGlzdGljczsKICAgIH0KICAgIGZ1bmN0aW9uIFN0cmluZ1N0b3JlKHN0cmluZ3MpIHsKICAgICAgICBmdW5jdGlvbiBnZXRUZXh0KGlkKSB7CiAgICAgICAgICAgIHZhciB0ZXh0ID0gc3RyaW5nc1tpZF07CiAgICAgICAgICAgIGlmICghdGV4dCkKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgaWYgKHRleHRbMF0gPT0gJyonKQogICAgICAgICAgICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDEpOwogICAgICAgICAgICB2YXIgZXh0cmFjdGVkID0gZXh0cmFjdCh0ZXh0KTsKICAgICAgICAgICAgc3RyaW5nc1tpZF0gPSAnKicgKyBleHRyYWN0ZWQ7CiAgICAgICAgICAgIHJldHVybiBleHRyYWN0ZWQ7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGV4dHJhY3QodGV4dCkgewogICAgICAgICAgICB2YXIgZGVjb2RlZCA9IEpYRy5VdGlsLkJhc2U2NC5kZWNvZGVBc0FycmF5KHRleHQpOwogICAgICAgICAgICB2YXIgZXh0cmFjdGVkID0gKG5ldyBKWEcuVXRpbC5VbnppcChkZWNvZGVkKSkudW56aXAoKVswXVswXTsKICAgICAgICAgICAgcmV0dXJuIEpYRy5VdGlsLlVURjguZGVjb2RlKGV4dHJhY3RlZCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGdldChpZCkgewogICAgICAgICAgICBpZiAoaWQgPT09IG51bGwpIHJldHVybiBudWxsOwogICAgICAgICAgICByZXR1cm4gZ2V0VGV4dChpZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7Z2V0OiBnZXR9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBzdWl0ZTogc3VpdGUsCiAgICAgICAgZXJyb3JJdGVyYXRvcjogZXJyb3JJdGVyYXRvciwKICAgICAgICBmaW5kTG9hZGVkOiBmaW5kTG9hZGVkLAogICAgICAgIGVuc3VyZUxvYWRlZDogZW5zdXJlTG9hZGVkLAogICAgICAgIHN0YXRpc3RpY3M6IHN0YXRpc3RpY3MsCiAgICAgICAgU3RyaW5nU3RvcmU6IFN0cmluZ1N0b3JlLCAgLy8gZXhwb3NlZCBmb3IgdGVzdHMKICAgICAgICBMRVZFTFM6IExFVkVMUwogICAgfTsKfSgpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpmdW5jdGlvbiByZW1vdmVKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKCkgewogICAgLy8gTm90IHVzaW5nIGpRdWVyeSBoZXJlIGZvciBtYXhpbXVtIHNwZWVkCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamF2YXNjcmlwdC1kaXNhYmxlZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Cn0KZnVuY3Rpb24gYWRkSmF2YVNjcmlwdERpc2FibGVkV2FybmluZyhlcnJvcikgewogICAgaWYgKHdpbmRvdy5jb25zb2xlKQogICAgICAgIGNvbnNvbGUuZXJyb3IoJ09wZW5pbmcgZmFpbGVkOiAnICsgZXJyb3IubmFtZSArICc6ICcgKyBlcnJvci5tZXNzYWdlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqYXZhc2NyaXB0LWRpc2FibGVkJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7Cn0KZnVuY3Rpb24gaW5pdExheW91dChzdWl0ZU5hbWUsIHR5cGUpIHsKICAgIHBhcnNlVGVtcGxhdGVzKCk7CiAgICBzZXRUaXRsZShzdWl0ZU5hbWUsIHR5cGUpOwogICAgYWRkSGVhZGVyKCk7CiAgICBhZGRSZXBvcnRPckxvZ0xpbmsodHlwZSk7Cn0KZnVuY3Rpb24gcGFyc2VUZW1wbGF0ZXMoKSB7CiAgICAkKCdzY3JpcHRbdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIl0nKS5tYXAoZnVuY3Rpb24gKGlkeCwgZWxlbSkgewogICAgICAgICQudGVtcGxhdGUoZWxlbS5pZCwgZWxlbS50ZXh0KTsKICAgIH0pOwp9CmZ1bmN0aW9uIHRlc3RPclRhc2sodGV4dCkgewogICAgcmV0dXJuIHRleHQucmVwbGFjZSgveyguKil9LywgZnVuY3Rpb24gKG1hdGNoLCBncm91cCwgb2Zmc2V0LCBzdHJpbmcpIHsKICAgICAgICBpZiAoIXdpbmRvdy5zZXR0aW5ncy5ycGEpCiAgICAgICAgICAgIHJldHVybiBncm91cDsKICAgICAgICByZXR1cm4geydURVNUJzogJ1RBU0snLCAnVGVzdCc6ICdUYXNrJywgJ3Rlc3QnOiAndGFzayd9W2dyb3VwXTsKICAgIH0pOwp9CmZ1bmN0aW9uIHNldFRpdGxlKHN1aXRlTmFtZSwgdHlwZSkgewogICAgdmFyIGdpdmVuVGl0bGUgPSB3aW5kb3cuc2V0dGluZ3MudGl0bGU7CiAgICB2YXIgdGl0bGUgPSBnaXZlblRpdGxlID8gZ2l2ZW5UaXRsZSA6IHN1aXRlTmFtZSArICIgIiArIHR5cGU7CiAgICBkb2N1bWVudC50aXRsZSA9IHV0aWwudW5lc2NhcGUodGl0bGUpOwp9CmZ1bmN0aW9uIGFkZEhlYWRlcigpIHsKICAgIHZhciBnZW5lcmF0ZWQgPSB1dGlsLnRpbWVzdGFtcCh3aW5kb3cub3V0cHV0LmdlbmVyYXRlZCk7CiAgICAkLnRtcGwoJzxoMT4ke3RpdGxlfTwvaDE+JyArCiAgICAgICAgICAgJzxkaXYgaWQ9ImdlbmVyYXRlZCI+JyArCiAgICAgICAgICAgICAnPHNwYW4+R2VuZXJhdGVkPGJyPiR7Z2VuZXJhdGVkfTwvc3Bhbj48YnI+JyArCiAgICAgICAgICAgICAnPHNwYW4gaWQ9ImdlbmVyYXRlZC1hZ28iPiR7YWdvfSBhZ288L3NwYW4+JyArCiAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICc8ZGl2IGlkPSJ0b3AtcmlnaHQtaGVhZGVyIj4nICsKICAgICAgICAgICAgICc8ZGl2IGlkPSJyZXBvcnQtb3ItbG9nLWxpbmsiPjxhIGhyZWY9IiMiPjwvYT48L2Rpdj4nICsKICAgICAgICAgICAnPC9kaXY+JywgewogICAgICAgIGdlbmVyYXRlZDogdXRpbC5jcmVhdGVHZW5lcmF0ZWRTdHJpbmcoZ2VuZXJhdGVkKSwKICAgICAgICBhZ286IHV0aWwuY3JlYXRlR2VuZXJhdGVkQWdvU3RyaW5nKGdlbmVyYXRlZCksCiAgICAgICAgdGl0bGU6IGRvY3VtZW50LnRpdGxlCiAgICB9KS5hcHBlbmRUbygkKCcjaGVhZGVyJykpOwp9CmZ1bmN0aW9uIGFkZFJlcG9ydE9yTG9nTGluayhteVR5cGUpIHsKICAgIHZhciB1cmw7CiAgICB2YXIgdGV4dDsKICAgIHZhciBjb250YWluZXIgPSAkKCcjcmVwb3J0LW9yLWxvZy1saW5rJyk7CiAgICBpZiAobXlUeXBlID09ICdSZXBvcnQnKSB7CiAgICAgICAgdXJsID0gd2luZG93LnNldHRpbmdzLmxvZ1VSTDsKICAgICAgICB0ZXh0ID0gJ0xPRyc7CiAgICB9IGVsc2UgewogICAgICAgIHVybCA9IHdpbmRvdy5zZXR0aW5ncy5yZXBvcnRVUkw7CiAgICAgICAgdGV4dCA9ICdSRVBPUlQnOwogICAgfQogICAgaWYgKHVybCkgewogICAgICAgIGNvbnRhaW5lci5maW5kKCdhJykuYXR0cignaHJlZicsIHVybCk7CiAgICAgICAgY29udGFpbmVyLmZpbmQoJ2EnKS50ZXh0KHRleHQpOwogICAgfSBlbHNlIHsKICAgICAgICBjb250YWluZXIucmVtb3ZlKCk7CiAgICB9Cn0KZnVuY3Rpb24gYWRkU3RhdGlzdGljcygpIHsKICAgIHZhciBzdGF0SGVhZGVycyA9CiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPlRvdGFsPC90aD4nICsKICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+UGFzczwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPkZhaWw8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij5Ta2lwPC90aD4nICsKICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtZWxhcHNlZCI+RWxhcHNlZDwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLWdyYXBoIj5QYXNzIC8gRmFpbCAvIFNraXA8L3RoPic7CiAgICB2YXIgc3RhdFRhYmxlID0KICAgICAgICAnPGgyPntUZXN0fSBTdGF0aXN0aWNzPC9oMj4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0idG90YWwtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlRvdGFsIFN0YXRpc3RpY3M8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPicgKwogICAgICAgICc8dGFibGUgY2xhc3M9InN0YXRpc3RpY3MiIGlkPSJ0YWctc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgVGFnPC90aD4nICsgc3RhdEhlYWRlcnMgKwogICAgICAgICc8L3RyPjwvdGhlYWQ+PC90YWJsZT4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0ic3VpdGUtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgU3VpdGU8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPic7CiAgICAkKHRlc3RPclRhc2soc3RhdFRhYmxlKSkuYXBwZW5kVG8oJyNzdGF0aXN0aWNzLWNvbnRhaW5lcicpOwogICAgdXRpbC5tYXAoWyd0b3RhbCcsICd0YWcnLCAnc3VpdGUnXSwgYWRkU3RhdFRhYmxlKTsKICAgIGFkZFRvb2x0aXBzVG9FbGFwc2VkVGltZXMoKTsKICAgIGVuYWJsZVN0YXRpc3RpY3NTb3J0ZXIoKTsKfQpmdW5jdGlvbiBhZGRUb29sdGlwc1RvRWxhcHNlZFRpbWVzKCkgewogICAgJCgnLnN0YXRzLWNvbC1lbGFwc2VkJykuYXR0cigndGl0bGUnLAogICAgICAgIHRlc3RPclRhc2soJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZXNlIHt0ZXN0fXMuICcpICsKICAgICAgICAnRXhjbHVkZXMgc3VpdGUgc2V0dXBzIGFuZCB0ZWFyZG93bnMuJyk7CiAgICAkKCcjc3VpdGUtc3RhdHMnKS5maW5kKCcuc3RhdHMtY29sLWVsYXBzZWQnKS5hdHRyKCd0aXRsZScsCiAgICAgICAgJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoaXMgc3VpdGUuJyk7Cn0KZnVuY3Rpb24gZW5hYmxlU3RhdGlzdGljc1NvcnRlcigpIHsKICAgICQudGFibGVzb3J0ZXIuYWRkUGFyc2VyKHsKICAgICAgICBpZDogJ3N0YXROYW1lJywKICAgICAgICB0eXBlOiAnbnVtZXJpYycsCiAgICAgICAgaXM6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZG8gbm90IGF1dG8tZGV0ZWN0CiAgICAgICAgfSwKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHN0cmluZywgdGFibGUsIGNlbGwsIGNlbGxJbmRleCkgewogICAgICAgICAgICAvLyBSb3dzIGhhdmUgY2xhc3MgaW4gZm9ybWF0ICdyb3ctPGluZGV4PicuCiAgICAgICAgICAgIHZhciBpbmRleCA9ICQoY2VsbCkucGFyZW50KCkuYXR0cignY2xhc3MnKS5zdWJzdHJpbmcoNCk7CiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpbmRleCk7CiAgICAgICAgfQogICAgfSk7CiAgICAkKCIuc3RhdGlzdGljcyIpLnRhYmxlc29ydGVyKHsKICAgICAgICBzb3J0SW5pdGlhbE9yZGVyOiAnZGVzYycsCiAgICAgICAgaGVhZGVyczogezA6IHtzb3J0ZXI6ICdzdGF0TmFtZScsIHNvcnRJbml0aWFsT3JkZXI6ICdhc2MnfSwKICAgICAgICAgICAgICAgICAgNjoge3NvcnRlcjogZmFsc2V9fQogICAgfSk7Cn0KZnVuY3Rpb24gYWRkU3RhdFRhYmxlKHRhYmxlTmFtZSkgewogICAgdmFyIHN0YXRzID0gd2luZG93LnRlc3RkYXRhLnN0YXRpc3RpY3MoKVt0YWJsZU5hbWVdOwogICAgaWYgKHRhYmxlTmFtZSA9PSAndGFnJyAmJiBzdGF0cy5sZW5ndGggPT0gMCkgewogICAgICAgIHJlbmRlck5vVGFnU3RhdFRhYmxlKCk7CiAgICB9IGVsc2UgewogICAgICAgIHJlbmRlclN0YXRUYWJsZSh0YWJsZU5hbWUsIHN0YXRzKTsKICAgIH0KfQpmdW5jdGlvbiByZW5kZXJOb1RhZ1N0YXRUYWJsZSgpIHsKICAgICQoJzx0Ym9keT48dHIgY2xhc3M9InJvdy0wIj4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSI+Tm8gVGFnczwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPjwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPjwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPjwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPjwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLWVsYXBzZWQiPjwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLWdyYXBoIj4nICsKICAgICAgICAgICc8ZGl2IGNsYXNzPSJlbXB0eS1ncmFwaCI+PC9kaXY+JyArCiAgICAgICAgJzwvdGQ+JyArCiAgICAgICc8L3RyPjwvdGJvZHk+JykuYXBwZW5kVG8oJyN0YWctc3RhdHMnKTsKfQpmdW5jdGlvbiByZW5kZXJTdGF0VGFibGUodGFibGVOYW1lLCBzdGF0cykgewogICAgdmFyIHRlbXBsYXRlID0gdGFibGVOYW1lICsgJ1N0YXRpc3RpY3NSb3dUZW1wbGF0ZSc7CiAgICB2YXIgdGJvZHkgPSAkKCc8dGJvZHk+PC90Ym9keT4nKTsKICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzdGF0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICQudG1wbCh0ZW1wbGF0ZSwgc3RhdHNbaV0sIHtpbmRleDogaX0pLmFwcGVuZFRvKHRib2R5KTsKICAgIH0KICAgIHRib2R5LmFwcGVuZFRvKCcjJyArIHRhYmxlTmFtZSArICctc3RhdHMnKTsKfQokLnRlbXBsYXRlKCdzdGF0Q29sdW1uc1RlbXBsYXRlJywKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij4ke3RvdGFsfTwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+JHtwYXNzfTwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+JHtmYWlsfTwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+JHtza2lwfTwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZWxhcHNlZCI+JHtlbGFwc2VkfTwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZ3JhcGgiPicgKwogICAgICAne3tpZiB0b3RhbH19JyArCiAgICAgICc8ZGl2IGNsYXNzPSJncmFwaCI+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InBhc3MtYmFyIiBzdHlsZT0id2lkdGg6ICR7cGFzc1dpZHRofSUiIHRpdGxlPSIke3Bhc3NQZXJjZW50fSUiPjwvZGl2PicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJmYWlsLWJhciIgc3R5bGU9IndpZHRoOiAke2ZhaWxXaWR0aH0lIiB0aXRsZT0iJHtmYWlsUGVyY2VudH0lIj48L2Rpdj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0ic2tpcC1iYXIiIHN0eWxlPSJ3aWR0aDogJHtza2lwV2lkdGh9JSIgdGl0bGU9IiR7c2tpcFBlcmNlbnR9JSI+PC9kaXY+JyArCiAgICAgICc8L2Rpdj4nICsKICAgICAgJ3t7ZWxzZX19JyArCiAgICAgICc8ZGl2IGNsYXNzPSJlbXB0eS1ncmFwaCI+PC9kaXY+JyArCiAgICAgICd7ey9pZn19JyArCiAgICAnPC90ZD4nCik7CiQudGVtcGxhdGUoJ3N1aXRlU3RhdHVzTWVzc2FnZVRlbXBsYXRlJywKICAgICcke3RvdGFsfSB7ez0gdGVzdE9yVGFzaygie3Rlc3R9Iil9fXt7aWYgdG90YWwgIT0gMX19c3t7L2lmfX0gdG90YWwsICcgKwogICAgJyR7cGFzc30gcGFzc2VkLCAke2ZhaWx9IGZhaWxlZCwgJHtza2lwfSBza2lwcGVkJwopOwovLyBGb3IgY29tcGxldGUgY3Jvc3MtYnJvd3NlciBleHBlcmllbmNlLi4KLy8gaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9qcy9ldmVudHNfb3JkZXIuaHRtbApmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oZXZlbnQpIHsKICAgIHZhciBldmVudCA9IGV2ZW50IHx8IHdpbmRvdy5ldmVudDsKICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7CiAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKQogICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwp9Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXQgPSB7fTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3VpdGUiXSA9IFsxLDIsMywwLFtdLFsxLDAsNTg4OV0sW10sW1s0LDAsMCxbXSxbMSwyMDMsNTM0MV0sW1swLDUsMCwwLDAsNiwwLDAsWzEsMjA0LDI2MDldLFtbMCw3LDgsMCw5LDEwLDAsMCxbMSwyMDUsMjU3OV0sW1s4LDIwNiwyLDExXSxbOCwyMDcsMiwxMl1dXSxbMCwxMyw4LDAsMTQsMTUsMCwwLFsxLDI3ODQsMjldLFtdXV1dLFswLDE2LDgsMCwxNywxOCwwLDAsWzEsMjgxNCw2NjFdLFtdXSxbMCwxOSwyMCwwLDIxLDIyLDAsMCxbMSwzNDc2LDEwMDFdLFtbOCw0NDc3LDIsMjNdXV0sWzAsMjQsMjUsMCwyNiwyNywwLDAsWzEsNDQ3OCwxMDY1XSxbWzgsNDUyMiwyLDI4XSxbOCw0NTIzLDIsMjldLFs4LDQ1MjMsMiwzMF0sWzgsNTUyOCwyLDMxXSxbOCw1NTI4LDIsMzJdXV1dXV0sW1syLDMzLDgsMCwzNCwwLDAsMCxbMSw1NTQ1LDM0NF0sW11dXSxbMSwxLDAsMF1dOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJzdHJpbmdzIl0gPSBbXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3RyaW5ncyJdID0gd2luZG93Lm91dHB1dFsic3RyaW5ncyJdLmNvbmNhdChbIioiLCIqSnVweXRlciIsIiovaG9tZS9kYXRha3VycmUvV29yay9naXRodWIvcm9ib3RzLWZyb20tanVweXRlci9yb2JvdGtlcm5lbC9leGFtcGxlcyIsIiouLi8uLi8uLi8uLi9ob21lL2RhdGFrdXJyZS9Xb3JrL2dpdGh1Yi9yb2JvdHMtZnJvbS1qdXB5dGVyL3JvYm90a2VybmVsL2V4YW1wbGVzIiwiKlNob3cgdGhlIG5ldyBSb2JvdCBGcmFtZXdvcmsgbG9nbyIsIipPcGVuIHVybCIsIio8YSBocmVmPVwiaHR0cHM6Ly90d2l0dGVyLmNvbS9yb2JvdGZyYW1ld29ya1wiPmh0dHBzOi8vdHdpdHRlci5jb20vcm9ib3RmcmFtZXdvcmtceDNjL2E+IiwiKk9wZW4gQnJvd3NlciIsIipTZWxlbml1bUxpYnJhcnkiLCIqPHA+T3BlbnMgYSBuZXcgYnJvd3NlciBpbnN0YW5jZSB0byB0aGUgb3B0aW9uYWwgPGNvZGU+dXJsXHgzYy9jb2RlPi5ceDNjL3A+IiwiKiR7dXJsfSwgYnJvd3Nlcj1oZWFkbGVzc2ZpcmVmb3gsIGFsaWFzPXNpbmdsZXRvbiIsIipPcGVuaW5nIGJyb3dzZXIgJ2hlYWRsZXNzZmlyZWZveCcgdG8gYmFzZSB1cmwgJzxhIGhyZWY9XCJodHRwczovL3R3aXR0ZXIuY29tL3JvYm90ZnJhbWV3b3JrXCI+aHR0cHM6Ly90d2l0dGVyLmNvbS9yb2JvdGZyYW1ld29ya1x4M2MvYT4nLiIsIipGaXJlZm94IGRyaXZlciBsb2cgaXMgYWx3YXlzIGZvcmNlZCB0byB0bzogL3J1bi91c2VyLzEwMDAvdG1wejU5bzVjanYvZ2Vja29kcml2ZXItMS5sb2ciLCIqU2V0IFdpbmRvdyBTaXplIiwiKjxwPlNldHMgY3VycmVudCB3aW5kb3dzIHNpemUgdG8gZ2l2ZW4gPGNvZGU+d2lkdGhceDNjL2NvZGU+IGFuZCA8Y29kZT5oZWlnaHRceDNjL2NvZGU+Llx4M2MvcD4iLCIqODAwLCA5MDAiLCIqV2FpdCBVbnRpbCBQYWdlIENvbnRhaW5zIiwiKjxwPldhaXRzIHVudGlsIDxjb2RlPnRleHRceDNjL2NvZGU+IGFwcGVhcnMgb24gdGhlIGN1cnJlbnQgcGFnZS5ceDNjL3A+IiwiKlJvYm90IEZyYW1ld29yayIsIipTbGVlcCIsIipCdWlsdEluIiwiKjxwPlBhdXNlcyB0aGUgdGVzdCBleGVjdXRlZCBmb3IgdGhlIGdpdmVuIHRpbWUuXHgzYy9wPiIsIioxcyIsIipTbGVwdCAxIHNlY29uZCIsIipDYXB0dXJlIGFuZCBjcm9wIHBhZ2Ugc2NyZWVuc2hvdCIsIipTZWxlbml1bVNjcmVlbnNob3RzIiwiKjxwPkNhcHR1cmVzIGEgcGFnZSBzY3JlZW5zaG90IHdpdGggdGhlIGdpdmVuIDxjb2RlPmZpbGVuYW1lXHgzYy9jb2RlPiBhbmQgY3JvcHMgaXQgdG8gbWF0Y2ggdGhlIGNvbWJpbmVkIGJvdW5kaW5nIGJveCBvZiB0aGUgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIDxjb2RlPmxvY2F0b3JzXHgzYy9jb2RlPi5ceDNjL3A+IiwiKnJvYm90ZnJhbWV3b3JrLnBuZywgY3NzPVtocmVmPVwiL3JvYm90ZnJhbWV3b3JrL3Bob3RvXCJdIiwiKlx4M2MvdGQ+XHgzYy90cj48dHI+PHRkIGNvbHNwYW49XCIzXCI+PGE+PGltZyBzcmM9XCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUtVQUFBQ2xDQVlBQUFBOUt6M2FBQUJOV1VsRVFWUjRuTzI5ZVpoZFZabnYvMWxyRDJlb3VTcERWZVk1aENRa0ljRWtoQkFHQVJsVUpnVVZ4SGxBKzNvYjFPN1c3dWUyZlgvYWJldEZiOSttY1dnVlFVVUdJY2dzTXpKUENTR0JKR1NlazZxa3hqUHNhYjIvUDNidHc2bEtCYTBRb0FycW0rYzg1NlRPM3Z2c3RkWjN2L05hU3dGQ2YrQ213RGJnQjJnMGhEQ01TajQ5N3p5V3pGdk0vN3Z0NXp6VnVvYThzakIyRVIxRUtHVkR0bzRvN3pGRkt2bmFXWjlteXJEUi9LL3J2OGM2MllkUkdrbjVkQlVOS0VobjZ2SHlockVNNDk4dXVwemRCM2J4Zy90L2dsWXVIeG56SWY3NWtpdVExYTFrQ3hyWHJRQVRnZzVSNlJTU0wxQzBMWXJhd2RJV0dWRW9Ba0lwWUljUnRyS2hUckVxdDU1L3ZPdmZlVFJZUzhIVkJGSGNQQ2MwWkFFRExCa3huOHMvL0NWK2V1dXZ1SGYvazRoV0dOUGRYUXFVZ0FYbzdqLzRXc0FGdCtod2lqT1ZyODI4akdWakYrR1lOQ3FUSnQrVnB5cFZTZEVVS2FxSXZYNDdqNjk1bmswdE85bXJXdmo4Qno1UC9ZaGh0R3pkUTQya2FLeXBKK3RiV0xrQVc2ZkF0c0gzd0lKSWcxRUdoV0FiZ3pLQ1lJTzJrZTVCTlRyQ3FBakxLR3dqQ0JHb0VHVmNSTEtnTENJdEJGWUFGRWxiQ3VXRm1FZ2hiaGFUc2RoZU9NRHFWMWN3OTVocE5EWFY4c3lUanpHdWJqemp4aytuM2ZYNHR3ZXU1cFVEYS9uQ3VaL2hrUmNmWS9tcU8vQzBZYS9KRWRnR1MwTVVwdEc2RXNJdXpweTBoRStlZGdIUFBQRTR2MTE5QndYSEloU1BZbGlnV2pzWUUzVDNaeitnZlIrQ0NDVG1acVBLY0VMRGJENTY5bmxjZDhmdmViSjFQY29kamhFTmtzVm9UU1FDb1VPRDFQS2xEM3lHaHVvYXZ2dUhIN0JMOW1EcGlEeEZBaFM0Q3BWeUNmMkFXbXkrZHU2bjhWMzR4WU8vcFpVdWpBaWJEdXhrOWJxTlpDdXF3RTZoVWlrQ3g2WkxLendFNHppNDRsQVpPR1E5Qjh2VDZFQmpvUWl5ME5sUTVKbTJOZno2aGVXczhqZWdMRVVvQWlrRFd1aCt6a2hoTVdKRUV3ZUNkbGJ1WDQxcnVSaEhnZEpnS2JCQUxJZ1VoQ2hDN1BnUG9ZT05UU0FCdHBYQ3JxN0dSK2dxNU1obU1oamZJK1dteWFReitGMEZKSWpZVmRoSmxWVkpPcHRodzlvTjNIalBEZHowOEUzczNMS0RkQ1lOMmliTTVSRXZoN0lDUkJraXBlT0hXUXRHR1lRSUVZSFFSaGtMQlNpSjBDcEFLWU5SRnFKc1VQRjlTcVFnRkt4SXNNV0Fob0x4OFMwRHRoRG1PckFNVkdMaGQzYnhwMGNlWnRQR3JTdytZUkhPaURTdHVvTm45cnpNcysycldkRzJsZ2VlZm9KVEY1N0dzUlBtMFdvNlNXa05SaEZGSUhhQXFBSTZsZWErVFUvdzhOT1BzV3p1U1J6WE1CODNkTEJJWVRSMFNvam9UUDlJcVlGS25jSU9UQ3cwalhDVWpPUnJwMythZSsrOGgrZWFWMk9jREYxNFpLMHNqaWhjN1ZKbFZaSDJRajZ4NEZ5bWpaekFyWCs2blZkejJ3bHRHMXNaYkExaEVLRVFsR2pTa2VKdjNuY1JSeldNNXNkMy9KUTl0S0V0Q0hTZTNZV2RiTnF3bVZSMUhSSXEvR0tFS0pmSXpWQTBFQ2tYUzlrNHhzYjJOZHBYNkZCaktZZWNGaDdhL0NJL2ZQSTZidHYyQ0hsTGNBREhDQ2xKbzR5RnJWT0kxdFJYanVUWUdRdll0WGN2bmJxQVk3blk0bUJwRjB0WmFHSnVhcTNSMnNIV0RvNU80NWdVTmFxQ21iV3ptVDcxYUxTeFFHekNBS0pBQUUyVTgvQzdpa3lkTUowUExEaUppK2FkeFdlT3Y0amhxUXBHMmxuT1dYUXFKeDJ6bUVyTG9kaVJ3M1lzckd3R1VRSXFBQ1Zvc1FCRnBBU2pCYVVFUklGUktBUEtnSVZCUzRRZ0NCYVJzZ2lWaXlnYkpTQUdWQ1JZa2NGQ0NKVVFwQlFxbThaMlhjZ1ZHR1puV0hyc1Fud2Q4ZjJIZnN5VE8xWlFPYWFSRzFmZHhmOSsrQ3JXN045RTVEamN1LzVoTnUvWXdWa0xQc0RrYkNPMkNza2dwQUFsRmtZaUFpS1ViWEgzNnZ2WnRITWJIei94WWlaVU5SRkVSZEk2aTdJZFFxMncrME5LQVR3SnNSd0hDUU5HVU0yRnM4K2kyTkxHNzFiK0RndEZaV0NvUW1HakNQRUFqMkZVTWI5NlBoK2VzcGpmM25BZEwvbHJxYUdSMW5BL0xzSndYSEw0VkVTVitCak9yRi9LZWVPVzhkL1hYODh1ZnljT0xwVW9Bb29JN2VSMjc4SGtQYlN4VUZFS3gwNWhoWG1Db28rMkRBRkNxQTJSTFFSaGhKaUl0TzNTa3ZlNDRjOFA4Q1N2a0tVZUt6SW91aGlCUXo1VVpLbkFRdU1BRTRKeGpDcU01TWtWVHpQYzFOTHBGMGxqWTJOS2ZTSEVhbDdGY29rSUM0MWlGaE00ZGZRU0dwM2hSSHM4WEZ6U2xUVm9pVUE4ak9lVHlhWlFlWSthUVBPQk9lOG5MT1lvN09taXNXRXN1bUV5S0FzSmZQek9JbUhvbzlNVldMYUxCQjVJTE4xRUtYd1VXaW1NMGpFeGxZa2xwb2xBZ1VaaGdGQXJ3QWFFU0Z0WWprSjNxM1JsRkhhZ3lGZzJnUi9oaTBmS1RTRTVEd2s5Um80ZXhaS1p4L0hvWTQvd3N6dHVZZWFJMTNodzkyTnNZdzhLRnl1dzhZbTQ2NTQ3K2NwcG4rTGlTV2Z6MDlXL0FtenlHQXFSalVVYUV4WnhDUW1KdU9maHUvakt5Wi9uaTFQUDU4Y3YvSVJ0NFg0cWNSRU1pdjdhbExaR2k2SXFnbVgxOC9qL0x2NDZMYnYyODVLM2xieFhJT1ZhK01VQ1RzYkZOVGJhOTJCL3hPbEhuVVpsN1hEdVhQa294UWFINW1JZXQxTGora1ZzMytCa1hPandNVG1QVXlZdm9TRmJ6Y09ybjZPNVR2Q3NFTmRFV1BoVWVqWnpLbWR5VE9VTTdJNDBLc3FBMGlnS0dDZkFxQnlxTGsyWXpkSVIrdmlCNFBoQ1NvUjlRUWYzN25pZXpocWZJRExZVHBGNjIrRG5peFMxeHJJcmlZekM4U3hHV3pVY05YWXFXM1p1Wjd1M0U3OGl3SklJSndxd0pNU29pRWhySWlXRVdBaXhKRlY1WWJ4cFpNbUkyZFJKTFphZlFrVWdxUlJSa0VQWkVVb0RnWTlZRGlJUmxqRWdvTFJDUkFqOUFLMHNMQ2VGT0M1R0RFUUdVUUhLTXVqSVJnVTJrUTNGdEtBa0loV0JNcG93VkZqR1lGbGd4S0F0UTJTNWVOaUF3aElMQUlYQmtnZ3RCb3dCaVVBWklnMW9oUXBCS3dza1JOTFFoY2V6QjliemlyK0xLSXBJVjZiSjJRRmRiZ2hGb1ZKY0tqM2h4RW5IRXVvQ2YxcDFQK21hV2t6R3BSQUVPTXBCMlQ2ZTZTS2xLcEVPNGNTbWVZeE5EK2Z1ZFkreXR6cFBwSVZJaGYwa3BRSnNoUlZZVEtDYUs4NjluS3pPc25MZE90Sk5EZmltaUZYTVl3anhsRkJEbGdZL3l3Y1d2cC9ONnphemF0dHJVSmtoVndYN0hROWpJckllWkxHd1BFTkZaRGoxcVBtb2xNMHRqOXhMZHNRd0FvU2NLV0tsSGRMR29OdmJtVkU5aFVXTkN4bmhONUwycTJNYnQwS0kzRHc3ZzkyOHRHOGpLOXUya2MzVTBkWFZ3WWpRNVVOakZ6Sjh4bmhlczl1NGQ4M1RiTXh2cGJZMmpkWFppV1VyUXEyeDNBekZyb2hzM3VLMFdRdXdITTN0VDk2RDAxQkJMaDBBUXNwM1NEc3VmdWdSbUFqUm9HMFhQSWQwd1dGKzB5d1dqNXREeFFGUTdaQjJxeUFRSXEwd1FRRXJiVUFFQ1gwczEwVU1VQ3lDWThmMktnYWxkY3dSQVhFY3hOSVlFeEVwZzdZVVZqNUVSeTZScTRsMGhGWWE1Zmw0S2JEcTB0aEJSTmpjVHNxcFJDS0lqQ0dxU0tNdGw4aVBDZWpZUWhRRktCUGhXQm9UU0V4Q3BjQkVpQlk4REVaOHNpa2JQeVU4WDNpTmg1cGZJaWNGSE1laUxlaUN0SU5sV2VnZ0lwdFgyRjBCeDg5ZmhHMjdQTDdpT1lLVVFxYzFRZVNqSFFpaUlnVTBybFZKZG8vSHlWT09wWGIwS0I1OCtXbDI1RnZRRFhiLzFEY0NsdGhrY1pqVmNCVGp4ay9pZjExN0ZldmFkeE90Y1hFMVpFejhUSFpTb0k0cVBqRDZKR2EwNytmWDkvK0J0V3lnblFJRmhLTHRrQTk5TWpoVVkrTVNNRmRQWk5Hc28vanRYY3U1Y2QvanBMWmt5WWhCWStOaEU1R2praHhUMHVPWmZ0NU14amZWRUt3dm9CSFF3Z0YvUDV2TVRuNzB3azk0TGR5UFlGTkxsalAxQWlyR0wwUjN0TEpoNzNQODhZbnIyQm0yRVZraGZ0UkZSSVFCTkNuQVpqUlZqSy9MMGlIdFhQL2FkVGdicW1tUlBJS05UUXBIdVlpWWJoV3VVR2dFWVJyam1WYy9FOHZYaE1XQWxPVWc0b09BVmk3YWpra25tRmdWUnhFS0lPMTJpd1pCTkNBQ2xvWFJJTVlnWVlqUm1oQ0ZpRVdsWXlNbVFnY2hTSVNrTXFpS0tnNFVkL0RjSzg4eXVYRTBNeHRIVTJ6MlNac00ybllJRkpqUVIydUxZcTRMbmJWQlI0VEdSNG1MaFkza1BCUU94dFhvQ2h1ZEVncUJqeUdpc3JLU3ZYdjNzdnpwVzluRlhrREZOaUlXb2hXQktlQUFOb3I5Vm83RjA1ZncxTVlWck15L1RKbzBQa1UwRmlHR0hLQ3ROT21veUlZOTZ6bnYxSS93NnJhTjNMdnJNUUpsOVkrVU5vcXNVVFNvRktjc1BvMlgxMjFrWmZzR1JLY1IwMG5SYUFwQWlvZ2FiR3B3V0RKL01VOCsrQ1NUUjQvaDRwUE80eWQzWDh2THJWdkloNTFFT0hpMm9pM3NZckpkeDNIdlc4U3J4VmIrdU85WlBEdExSOWhGTmVDUW9aMENFUjd0V3NnWGQzRFA2cWZ4UnRxTUQwZFNsNnJHVGlzeTJUbzJySGlBdmVGT2xnNWJ6TmpKazVoVU9aNnptaFpSbDdjSXVvcW9QUjZwMEVQb0loZUZXRmFHZ25oMG1odzJHaUdpcWFvUk1wVnMzcjZPdkFKUE9zbDNXNUFLSDBjc05EWUtpNEFRMEdSSU0ybk1HT1pNbVlxVEMxRW13dFlhSXdFUkJ0ZXVRb3pCQ0tBMEJtS0hBd0dpYmltcEVCWFRYSWhWdWFodWoxK0JVWm9Jalc4Q25LZ0E2UXEwZHBBd1Fya3V1L1kzYzkySzJ4ZzNwcEVyM3Y5NWhsVzVTTHRHV3k1V1VNQ1BRcHhzQnFkU0V6Z2VhVGQyQmduaUIweFZWaUJGQTFFSXRrVjdmajlSdmNQdWxyM2tOMi9HU3FYUXRxRTE3TVRId3RZT3RvR2l5V08wb0RXb0NCN2RzSUpaNDQ1bjlvemplT0dGVjJpbFNCNmZ4TkNKRUtLb25VamIzTjN4WjQ3SkhjdjgyVE41Wk0vVDdEYk4vZk8rSFJUVlJwaGVNWUVwVTZheC9QRjdzWFVhb1FBcVFta2hJQ1RBVUd1NW5EbHpHUTBqaG5QL3JnZHBEbll6ZW5RRGw1NzVVZXBKVTZrY3dDZlNIZ3JGMU1xeHpKb3poK3NldXBkbXBSSGI3bllmRkYza0NDMUJiTUZ6RlYzcEZOZXVYczUvUFgwOVliV0RxYmJabTI4bElDTGoyYncvdlppL09lVVNQcmZvUWlaV2oyTDVpai95eUF0UEVyaWFwYk1XOHBYalBzZG5qcm1ZRTBjdklZZ3Njc2FBY3BCTWhnaUx5dlF3c3NQcjJkNnlIMThVUlFWWURuUkxPblNFVVNFK1JVS0tHSHcwaGxxVllyaWJ3ZTd5Y1NPRHRnQUN0QTRRVlNRU0gxRWc2SmgwS2lhZkVwdkVYVUppSzRudTFnTW9VU0NDcFMyMGRvZ3NoYktBb0VBVWVRUmhEblFPcWJNbzFQdjhjZWREWFB2VTdleWhBNVVTaWwzdG1EQWdsZEpFWVNlbTF2RDB0cFU4dDJVRlh0cWp5M1NCRnBUalFEcldBbEZReEZNK2EvZHM1dFdXYlR6KzZndHMyTFNCcVZXVGNFbGpIRU9nSWp4Q2pBSTBtRFJFcm1hdHY1bXRuVHVaTVdFRzR5ckdFZ0xHZGdpVXdTZEVXU0VXQnFVa3RsWFhQazFqZlMxVHg0ekRxRUwvU0tsUTFLcGFGa3liejQ3ZHU5all0UW1SQ0FpeHhjTTJlU3dscEZTS0lJSzU4eGV6L1BFSDJVb0hEKzliemJWUExjZlBCSVIwa0NhUFF4RTc3S1RhaWpodTJsRTB0KzdnbVpZWDBXbUh3RzlGRVFCQmQ5RFhBeDNiWTRGb21xVVQzOUpreGxUaHB3TFNybzNzN2VDVWtmUDQyK011WTBIOVVSUjNGZml2MjYvamwydnU1Qm12bWZieFdYUkRtcE1YTCtIekgvd0VYN240VTF6OGdmT3ByNjRpbFZWRVhpY09RbzJid2FpSWJTMWJpWkJZdWhrRENPS0NieGw4Q1loMGlKVzIwQTdrYUtlcmVJQk1UckE2QSt6UVJrTFFrY0ZTRnVKSGFEL3NWdlF4K3l3ajNlRWJoWW9VeWloMFpLRWlqVGFDRnJBRXRBZ1dJRUZBNUJkd1Vpa2trOGFMQ2xoVkVBNkhGYzJyYWJWYkdUKzJrZjNSQWE1YmV5dTNyTDZIZ3RPSmxUVVliZEJFV0JVaFQyeDlqcXRXWGMrUFgvd056KzVkZzZxekNZSThZVnNyS2d3aDQySnNZWS9md1UzUDNNbDJmeTlOWXh0cHlGWnovcUt6bUZJeEZxMUFaWVZJZVZocFFUbmRBdDhXREVWZTN2QVV0bDFrd3BqaDVPa0VYUUFkeHNhTGlaTU9vUW1wVUE1UGJudVc3Ym10ekowMmd6cHgrNmUrTlpxVXF1VG9tWE80LytrL0l5aENDWEZURGs2eGlLT2h3M2c0T3NQN3BwMEFsVmx1WDNzL0JSVDdWU2QzdlBwblZxeDlnUTd5K0FJT1lCbERZN3FTNmRNbjh2dDc3a0VwalFuemlBbEpLWWk2QjZUVUV0SDRmcEZoVGoyelo4OWh6ZDYxdEw2NmcvY3ZYa3hGWFFVVVJ4RHUzb3ZaV3FDbW9vcFoweGF3YzIyQmUvMVZwRjZxbzdyWkk2TUVsUlgycEFwMGhpMFV2VTRnd0ZXR0ZDbnFLckpFb1U5N2RBQnRFNnVjVUNBaXZnZFRla29SYlpBQVhDd2FVclhvSWtTaGl6Z3UyZ3RqYjBWcjR1QU1pQ2kwRW5RU1U1UnV5MVM2OVlJU1VIR3NNWmJLZ0JKRWhKUlNxRERDNitna2szV3hobGRUcUZLOHVIMER2My9tRmliT21zREltZ29pZkxiSkFlN2U4QWluTjgxbDN1U0ZoTHM3Q0hXQmx0eGVibGw1Si9kN0s4a0MwNXNuczJEZVF1Z3FZa2txamwwU1lsV25lV0hqU3Y3VThSaE5ZUU1uenB4TmcxTkpwR0JzZGlRdnRyd1dCME5qdnloKzBFeE15a3JiNHBXOXo5UFN0WkRwWXlhUldmY0FoU2dDcmNBSTB1MWFCeUpZV3RNaFJWYnZlbzJGUnk5aTF2QkovU09sd21KRWRoUVZWVFc4dlBsVlFpS3ltVXFLL240aVFGbmdHZ1A0TEo2emxCVXZyaVpXNkhrQ0tiQ3pwY0JPd0xIamRGSldiQnJFNHJneEN5aWthM2k2WlJPdXlsSUkyckUwMkU2Y1ZZdDlBQXVNaGlqRUlxQXFCUTFqVXR6NS9COVl1ZkZsVnZrYk9HYkNERVlGMVJ3M2JoWlJlMENEWmJobzJka1VLdkw4NG9WcmFYdDhOOG9QeUdJd2RORkJ4RTRySW0rSFNCUUhlaXVCWWFrS29ud0JIejhtVWhMakU0TUs0c2lrYTd2NEpzTDRFVVF3ckdJTU15YlBRYUlVeWs2aGxJMVJFS1ljUkZzb1kyRnBDNlhpeEpGQ0lUb21LWkw4Um56dGJ2YkdNVWFKM1NodEJCeUxUTm9oeU9YUm9ta0o4OXo5M0NQY3RPa3VObmR0NStOdUk4UFFwQW53Ylp1dDRWNGUzL01DVXlmUFFyc0tQNnU1ZGNYOTNOLytESkxPVVBUeVBMZmpGZjc0eklNc2JwakhxRlFGZGk1RVRJQVZLRWJXTjVCMU11ek1iY05ybjRtUW9jcHVZSDUySGl2VlJ2WjUrd2dBOFJVMkxwR0N5RVNJZHRoTkYrdGJkekp6MHJGTXJwbkNtdmJYVUtJUU5FWUp2Z2lDd2plQ0pzT0xXell6YS9KY3h0VTM5VTk5VzlqTW1qS0gzWHRiMkJudUpRUjgzeU15WUZ6SWgzRjRkbkw5Qk9ycmh2SGtDMC9IVHhNK2JrTHNURVdza0MxTklEYjFkalZ6eDgvajVaMTcyVXVBVWk3WlZCMUdvQmdSWjNJQUpBMkJEVWJJb0tuU21td0Z2THA3RGEvSkZuNjY0U2ErOWRqLzVYdlAvVGNQYjF0SkIwVlFoZ29WVVJINXBIVElQbjhmNlhRZGkrZWZ6aG1MenVVQW5YUkVuUmpQUTBKRE90SlVxVFNWZGhxdldDVENFQW14ellRcVNURGJnR1ZpU1lleEFZc2dqTHBUcFZZczFaWEdPQTVCT2tOZUs3b3dSSzVERkxzVWlDZ0VJYlFnc0JXUkpVU1dpaStwQktQQnFGaHlpcWhZZ3hUeVJMNkhtNmtrMTlyQnV1MmJlSFRMc3p6ZXRZSk5laC83OHkwMFdkV01vSVpJY3V5bm5lY1ByR0hEbnRldzBoYWVxOWdhSFdBM2JZVGFJM1FpWHR6L0tsYzkrZC9jdWZGSm9nb2JuWFpRWWdoejdjeWNPcDBaWTZlem8za2JCdzdzcDMxUEI1bENKWmVkK0duT20zUW10YmhrVVZnb05CYXVwSEdNZzBTZ3NkaTRleWRocEJqUk1CWUJ0SEZBTzRqbFlKU0Q0QkRpNE9Pd2J2OTJjcmtpUjlWTTdrTlNLbENXaFlSUkhMTVNzTkFJaHBTMm1UcDZBdHUyYktFOUhuYU1PSUNEUkI1S0ZMYXFadTdrNDhnVjJ0a2F2RVlYUGg0R0ZldGVDQXkyU2hFcVE0aFE0elRST0hZOHY3dnQxMVNvREcybUN5c0NFWnN3akxDMWRHZUhZdlZta3lhRnk3anFxV0N5Yk0yMzRDbG9rV1oyK2MxczkzZXc1NGs5bk5XNGlMODU4d3M0TFhrNlZ1NWlEa2N6cDM0QkZ4ei9RUnFIRGNPMkkwWjBOckNmVHV5R0ZDdDN2Y3lqRy85TXlxMGkyMUJOcSs0a1QwQW1rMkhPN0dNNFp0WWNqajU2QnNmTW1vWGpPTURyV1oxNFNCVGpoNDlCckFZc1AwNzUyZHJDMHVCR0psYjkyenpVOWdMUnhqeldCaCtGZzFpQ0Z3YllBcTZvYmlsaGlKUWlWSUpqNkNheERWcVFNTUtZQ01mT01IN1VTT3FEV3NLVlJYd1QwdHh4Z09waEM2bG1PR0kyVTBDejZzQUdOdTdiek53Uk0ranFpc2hTU3dZSEo0akkyUjdObGtkejJNSFI3UnY1a0cyb2l3SmNPNFJNaU5KRnFpb1VXM010NUczRjhISGpzSW9PWXl0cStPRDBVM2w1MzBxZTZGaUJLQ0dRQWhZK0NpRVMwQWpOT3piZ2RIUXdxcW9CZzR0dHAwQjhNQktIdlZCRUNKWVM4bktBdGwxN1dUSnNiaCtrRk1DeUlEUjBHM0hka1RoRlJxVnBhaGpPcWxkZWltbXF2VGhjWVlCSW9iQnhkQVVqaG8xbS9jYlYrSFFoam9NSkl4Q05nNE9Fc2RHTkNHa3kxR1pIWWxlbTJORytFYU9LR0hLWUtJNGFnc1R4T0lSWVhtb01FUllPSTdLaktSYUVadW5DVTBLSUFVZlJGZVo1TVh3TmU1Zm0rSDNIczdEaEtENjErQ04wUlM1VEdxYlE1TlJpV2p6Q3RPYXlxUmVnWElOcGNMbXVhem1yWkRYTFRqbVZKUmVkVHQya0JqN3lINWN6YWZMay9paVR2cDV4bk9RL2N5dDdkdlZPRDJ1YlIzYUxqM3E1RTNteEhTMEtzUVN4RFFhTlFhT1VRb3RDMldrc1I5QUZnK3VtcUIxUmpiUGZ3aWNFSUVJVFNRV0NDN1pnYkpzTmhmMDh0MnNWSjAwNmxreW1uaWtWVTVqSUNOWUd1MkpQUDZPSnVoU2R5aWVuQTFyMzdzQ0U3VXlhTkpaSFhuNlUxUnRmd2lkZ1Y5ZCtkSFdhUGZ1YnNkYUhMSnc2aDJQR3plTEIxUzlpSzQzQkVFbDhIMkxGekdrTDl1S0dQaE5Iak1ZbGpTOFJxQWdkaGRnSW9iWXcyblNIeWd6NWpuYnM2cjZDNTRxWXlVakpydWtPWEpCMXN1UlVrWlc3Vm9JT3dRVzhBc3Exa0JDTWlhaHlNNHlhTUp3N2IzK1FrREQyeWtSQUlreTN6Vy9DQ0d5RkkxbXFHckpzYmQ1TWtUeVJEa0dDZUJTakNMb3pZSEhJd1VjcGk1UmxvWHlmbW9ZVXJmbDk1TWlockJTU1VyRmdkNFV3QjYvSU52N2o2V3Y1NS9PK3lxeFRaMkgyS2V4V0Mya1B3QXZSdm1CcndaMWFoWmxmeGNjLyt6aytOL09iT0duM29DNTVxNkJHcDdCSHAyQXg4TEZoVURUSTZoeTgxSWxhMDQ3YVVJempsRVpobE1UVlBtSW9SQVdjck1QVzRqNDI3TnlPeHNZUUVsbzJoYXpnVzNHQmhuWWpjc1dRQjFwZTVyaTlxMWg2N0FuTW5EbU5hYnNuODlLZWJkaFpKdzd5WTVQdDhIQzlQQ290ck5tM25SV3JOL0hybFgvaTVmd3VHcW5HTHhiWnZuTWJtMWR2WSs2MG8zQUVSbGVPcE1HcVkzL1VEcGFGNWJvUUdBTGpvVkpwV2dyQzVsd0xGVlhWTkpKbFQ5U0tiMGRZU25BRVFtMVFibmVLc3dEYmN5MTBWdmw5UzBycEZxMUtnWktZa0RhS3Vwb2Fxb2ZWY01BN2dHT0RheFJhSzdSQXBBUlhhNnFWUzFYS1plKytQZGlXeGdvOFhNQlZOcUdLQUluTHhaUlE2UWp6ajVwSjI3NTlHTzNoYUkwcmlzaDBTMmR0c0ZVY1hnNVVYSGpnRUpGMU5TT3FzaFM4VHBRMmFDVVF4bDZkcFJTV1ZoUUlXSEZnTFRjL2NSY3I5SXZNclozRzdLcnBXS29LZFdvOTZ2MjEySE9ySUtQUlFNM2JSc1UzUUZxakZsVEJnaW9jUmtFK3dyelFDWTkxSUU5MnhjNk83MkVwd1c2c1p1ZnVsYXpkdFlHc1cwVjcyRVlVUlVTUkladHlZaTFwTkZndW02SzkvTitYcnNkUEdlWk5tRVVZaFdDQkNoV3B5R1p4NVV6T21yaUFkQzdQNkhGTnROZmwrUDN6djJCRGZpOUtWMURqTkhEVXlDbGtVaW15dFdsc3JYRFREbGx0NDZvSTEzSVJISFRreE40NFdaUTRkT2xPV29rWW5XbWdLVjFGcDc4ZlJ4UzJCcWM3bUZFTVFSQzBiZkh5L3RjNFIzbllCeVcvRmQweE9icjF2dTR1ZkxJWWxxbW44OVZXNmtqamhSWTJFVFZVVUl3OEJFVWxXZVlVUm1Pdkt0RG8xOUpGQzVrSUJJTlBSQVNreUtBUUpJS1JRWXB4KzJwNFpkTXVocGtVb1ZGa0NBaGlzeGhGUk9JYWhLUXdhRUx5akdZRU5hMFY1UFA3U1pzMFJSTlJSNVlzTGdZUEt5N2FRcHVBSjE1K2tqVmttUCtGazNFK2ZTd3lKNFBLV04xaDZmNUJSUDd5UVg4QlN2WGpsN01XZW1rdExLMkZYSVE4M29XK3J3MVd0TksrdllXVksxOWtuN2VWU3FwUU9GVHRGMGJzVWt6TXAza1ZJZGRaSkkxRkZSRjdXcmR5ODMwMzhGQzJrblg1ZFdSSVE5NlFScGdTakdUcDhHT3BzNnB4eFdaczdTaEdoTFdrSkdLa05ISGgrTE9aTi9aWUdySnB0bXg0aVI4L2N4UGp0MHhsODc0ZFZJZENoa282aVNoRVBqWU9EaFpCc1lnR3pGNk40N2pVZWRWVWlvTkJjQW13aUVnWlRRNkxpRmdqcDFGazk2UU9VWkRSN2VBQU9OMXVqb3ZGK1RQTzRZb0ZsL1BTbW1jSmh4Zm9rZzZHTzAxMGVYbVVKZWdDVEFySE0yNzhKSjdldm9JRDdDZWIwV2hIMGVuNVpLdXE2ZXJzd3RLS3RHZ3FQSWRGMWZObzdtaGxYYlFkcXk1RlY5Z1JWMVdqVWNxZ0tZQm9qR1JRT2tYS3RaRjlIc2MwSGsyN3liTXF0eEVxSE1LaWg4cUhWTmtwdElZdWlqUk9HTVg4RHk5bXdyS1p1Rlhwd3lMUmtTRGlvZEF2Z3Bhanl4QTkxY3B6Tno3Sm1yMXJNSlltMzlYRjBkWW9GbWVtOFh6TEM3eWEzWUtYZGdtOU5GazdpdzU4TE05Z0dVTytOczBCSnk2RXFTckFxSTVLVG1rOGpvcFVKYm1PRG9KS3pjYk9uVHkzY3cyMTFTTTRmdHhDNmlNWFJTY3ZiMzJXcDdhL2hFNDNNRzdzS1BMU3dhN21GbExWdFZUVTEyUFpEcmw4SzhvV29zQmhRdTAwR3JKVmJOMitsamFyaXlnRmR1VGppT2tXTWdyUEZwUzJxR3lyWXVISUJYMUlTbDcvUTNjMk5nbjc0cVJUNU5OQ1oxSFRGbmwwaEI3dFFUc1NSTGdPcEFxZ1JtUm90VHcyZSsxRUZacWNDZkVMSG5rdkl1dlloSlloeUJkSkc4MVlkd1J0VlpyOXhZam16b2lPL2Z0dzBqb3VZZElLVVNGb0Q0eU5qalIyWkxDYndRM0FxYy9TdVdzdlhrZUJNQ3JpUlhFQmFUNE1HSFAwYU03NCtCS09YanI3c0FtVDRMQ0o4MWFpVW1PZDFzQ2kwejVJMVlQamVPVDYrMmx2THRMdUZ0aGQwVXFYVmFSUXlHT2wwdVNLSHAyT0IwNklZME1xdFBDTEh1MzVJcjdPUUZEQmh0dysybDYrbitQSEg4MmtZV01vZEhWUzFSYXlhTmd4akpneW5teW5JcE1MQ0tLQUdjTm1NR3ZzSWlSZFNWRVhLSVNkRk9zSzVEcnp2TEJ1RFh2dExweUdGQ3FsaUZxS0JGRXpsWlVwMGhHMDVqemFHZ0FKU1lVaGRxUndJazNrQ01ab1ZGREZicE9QU1FtOWlkbHRVNWIreGNJVFI3UGh3QlordGZiMzdOclFURDd5Y0UxbGJQdFJaSVJVMGpHdWl6RlRKdkdURjM5TFpJTnRpaGdKd1RoNE9rUmJOam8wT0JJd3RuSVVWNTQra3VYUDNzbUsvR3ZzajFxeDdEaGhINktJOEVINUtMR3dxQ0J0WEZKR01TYmJ3Tml4STNsNHhZTTh1dWNwQXFVcEtHSE93Z1Y4N2R2L2svZWZkY3JiUzVKM0VETlBuY1BNVStkdzF5MTM4dWRyN3NMdHRMaHY0Mk04c09jSkxEdURGN3A0U2loYVJWeWpZajlBZ1RZcEl1SzRhRFdWdUZIQUptOFJYMDVkU0VOdEkzdlh2c3pHQS9zNGMveDRyQ0NFWW9pamJWeW5IdTBNNDdrbm42ZlQ1RGhxOWxRYVZCcnBLcExKR1N4VDVQNjFEL0VhbTZnbHd4bWpUc0xxbU1kOXJ6M0lBMTNyYWJGdEFnSWNpY2dJcE1WQ0VhR1VJa01kbHk3NTFNR2tWQ3F1VHJHMGhaaW8yL2MyS05FVWd5NTg2YVRaN0dTMzM0eTRRRHFBWEk1S3JWQ21pMXpRaktTYWFJdjJVNVNReUhRUko5bmlEQWhoWEczakF0bWl6UUdybVdKbG5pMmRtd2d4bU5EdkpxVUdRaElEUTlGQmhneFpiT3B4eUZ0dGRGbXQ3SmM5ekpnM24yOS83N3VjZXNZWmJ6OHJCZ2pPdnZBY3pyN3dITFkvK1JvUGZPc0p0dTRza0kxQ1FseHloQmpqZGZzTGNVWXBqVldxTE5DcUxRN0E3WHlHdVdQbmNOYkVjVXlZT0kwOTdSN3IxMnhnNmJ6NW1HSXpRV0FqSmtQSHp2MmtVcFdNR2orZUVTTnI4RHM3YUJvK2pITWFseEc2SWUvck9vb1Z1MS9scmhVUDB1TGxHVDExS2hOeW0vSFhQazh4RUh3SnlGT2tFNHNVNENEWWdFY2VOK3RqSndIZ0JKS1FRTVdra081L0JpR1g3eUtUVWxSaHhhbWJGRUFYT0lKdklDVEVrMDRxYWxPa1VlU1VYNm9naVN3L2p1MVlRQUNSQWRFUlJaMGpWV3NSN1BaUlNoT0pJZXFlY3lJeG0xRUNoQkhHK0FRWWluZ1VYSSthY1hWODk5dlg4Smt2ZmVudEcvMEJqckhIVCtVL0hybVJjVDlZd0EvKzk3K1I3d3d3V29HanV3dGF3RVNLUWhSMTk2L0M2Q0xHT0t6ejkzSEh0bWVZUEdrbWs4ZE5nSFhydWZlWlA5R3hldy9IVHAxSzAranBoTDRtYmJsWStRNVdiMTdEMnRhUXBtSERtRkRYUkRiSzRMZTFjK0tZeGN3WmRRempuQ25rdGFhaXJvNFBudkVoWHN2djROWnQ5NkcxSXRKMlhId3NKbzZHSzBQS0dEUmVIK3BiNHRvcDA1MmJOQ2cwbWdpaHM3V1RTcFVoUXhvWEd5OE00NWltc29raW56UVZ0TFoyVVpXdUprdUs5cWhBaUlVeFVVeElpZU1BU3VMZks0Z1BvU0tsVThRaFUwMkFCK2IxQkQvZHB5RkMyRjNEMkdZaUpwNThMSi80MkRlb3JLbDZlMGQ5a09EcjMvZ0dILy80Si9qR0ZmL0FEVGZkakhpcXV6QkV4Zk40dXF2d3V0TXZRRWdlbXp0MnJxRCt1WWY1bTFNdlpkN3hpNmdkTnB5dVBYdFp2WGs5WFlXUWpKMmxzNURuMWhkdjUrN29JZHBVZ1VzV1hjUVoyUk9vYlhVWVp3OG52OTNEU1djNVk5UkpoRnF6YmV0T1VtUFRmR3pwaHpFUDVYaGk5MHIyU1k2OFFLQzZjMWpHa0NLRFZZd2xlYW5vQlNqbHpreDNpVlZNelppVSs5c09rTEl5akxRYTBXRTNuU01IL0RnOTVpTjBSU0dXbGFaVzE1QlNGbWtuSFV0ZXNYQ1VpeEs3Rkk2SmpDSGZYcVN4WVZROGYxcnNVcTFoUEljMWZyaVZBRmhFYUdZZmV5eC9mUEpPVHYvU3VVT0UvQXNZTlhvVXY3M3gxeno2Nko4NGF2b01sTEhqd1k2cjhOQUdYQUVkRWFzdVpkaG4ydm5EK3Z2NTlaK1gwNUVLbWJOd0xrdlBPb2taQzJaUk1TeURwN3BvOFhhellOazhQbjcrcC9CckZROXZlWklkM2dHOHJJdFRPd3h0VmFMQ05La3dRN1ZWdzQ3dDIvblhtMzdBM3QyNytlYkZYK0ZqODg2bVFUSlVxQXlPenVLTHdrZG9yR2lpMnFtTVNWbEN3cGJ1Y3FrNHdxaTZKYWF3UDJ3bkh4U1pQR0V5RUlJUFJJSnQyZGpLcHBNaWUrbmtRSmluYWNRSUxESHhISlRrU2hMbnNaTis4WU9JM1MxN0dEMjZFU0VpVWtIOGdKUituMjU3Tk1hM3ZuMGx6N3p3TUxQbnpYcnJSdkpkaUtVbm5zQ3JhMS9tQzUvL0ZKbzRnUkdYM2NYZmwrcE44TWpZUHMyeW5aKysvQ3N1WC80TlBuZmJsZnppc1YvVGt0K0YzWkRCbmRoSTA5SmpHVFY5SHEwYld6bmFIOFBZcm1FOGNOZUQzUHpRM2R5KzRnazJoTTJzM0xPV0ZSMGJPTkRrc1ZidDVOSFdaN2p1aVpzNUVPUTUrNHl6bU53d2lvQThVUlJpV1JZUk1MSnhKSTVqOVFvSnZlN3RsQkxtQmlGU3NhUGpTY0NXdlR0b0hOdUUzaWlraVNmeVc4ckU4NkRKc05PMHM2MTFIOU9tVHVIcFBVOFJSWEVwVmtwWkJDYkVWbGJwZDN3aXRtM2Z4bkh6NTFOUERjM1NIc3RuTGQwejdHSkNWbFJWOGRzYmIrVE1NODk4bTRieDNZbWYvT3lubkxEMEJENzV5VStXSnFaRnZLNHBSWVFvTE9DcklqazYyTkcrRTlXdWFOMnpsZW0xamF6WnY1VW5ONituSVQyT2xRZFdZWFVjNElyVFAwZDlSUU81VG5oODNRcGU2ZGpNeE93azduenVManBWeUZrVHoyT04za3diQlZaNnIvRWZkMTNQa3VsenFTSkRTaFErQmd0TkVhaXZyOFgzL1Q0a3BZYnkraGNnWGtFQ1RTakNLMnMzVWw4L2pGRk9MUlVHS2hEY01LUWdJUjZHdGpEazFTMmJtVForQ3RVcUU4dEZpYWQyV3NRcFNhYzdBbXBRTkhjMkV4VkNabzZiVVpxK1ZacFVEOHljTVlNWFgzcHBpSkJIQ0pkY2Vpa3JWcjdFbEhFVFNXR1JRbU5oZ1dnc0ozWmdJekZZV25Dc2VBeXNxbXI4bWl5cjJqWncwNTdmODl5V1A3TzBhUzUvZi9yZnNDQTluUm1aNmN3YnZZQnNxOFgwa2FPWjJGaER6dXhtVzNFRDI0czdhUWxheU9IaFcxWGN1M1VOMXp6NGU2cnNTbWJWVGFNS200eEFMUllUYTBZamZvZytPRFNzWWxKSWQ3RXA4U0k3bG81bm9yM2M4Z3BqeDQxalRQVW9YQkhHMmNNNGQ4bVp6QmcvQ1orUUFIaGwyd1lhaHpmU0lQVmtWQVVLalJFZkMwTkloSGFBV0dIVFlUckpkWFV4Y2NLNHVDSmJXZDBoQU0wRkYxN0lFeSs4d0lTSkU5KzJRWHN2WU02Y1kzaHU1WXVjZnNZSHVvdnViTURCUk1RcFB3dkNDSFFrS0NKR2paMUlsTXF5ZXN0Nmpoc3hsNjk5N0xOY2R1SjVIRnM5bGJSZmdaMnZvSE56TTZPb1o1TFRRSFYxaXFQcnhqSnp6R1E2YVdmenprMDRXQlN4NkZTSzVpRGdmU2VmeUFuekY2RUp3SGlNenpZeWFkUUVuS3lMUHRqSmtlNHFJVU5zRU1hejdYd1RFT0N6Sjl6SGExdldjOExzNDBsckcxL25tRFZ2R3RYMWFVSkNDclN6cTNNckJ6cmFtRG5qV0NJc0JDZ3FnKzlBbUJJQ3gwQUdmRUphZ3p5cnRyekNNVE9QUWlUQ1dBYlNMai80d2I5eTg4MDNrOGxrM3Y1UmV3K2d0cmFXNWZmZXlWZis3Z29DSFlBS0VCV1ZpcG90UjJGWm1qUVpKdGRPcGJVMXovQkNFMStmZlFWTHF1ZVRhalA0WFQ1T0prc1U1Y2hrTk85ZnZKaEpWY09RdlYxTXFackkxQkVUMkxsM0U1dmFOaE01RUtvOEVoWFlUd2V2UnZ0b3R2TkVCS1JRbkRiblZDYk1tTVRxNWcxOVZKNUxyL2Z1LzVqdTVUYTZKTWREVHo3R0NYT1BaNlFaVHNwaytjMHR2NkZsKzE0cWJZdU1hMUdNdWxqOXdtcE9PK2wwUkVJYXJGcXE3UlFpQ2l1dE1hS3hRa1ZhTzRRcVl0T1dMVlRwQ2o0dzVVUWFUQTAzWC9jN3Z2NzFyNzhkWS9PZXg3LzkyNy94MDZ2L2s3VFdwTEJJV3k1cDdlQUlaTEE1b2Y1WWpoMDlteVpHY1BhNEQ3Q3diZ0haOWdyU1hUWXAwbkdvenZkd0hadnFpa3FxVXpXb1ZqaG04ckdNSHo2ZW5WdTNvSFJjUDVtU2lMbU5VNWs5YWpxMzMzY0g5ejN4SUZsZHdUUjNDc2RObnM5elQ2N2cvaldQOW04NlJJVEN3K0dsbHZYc2FXN254Rm1uMHhwMnNYdFBNN3RhOWlOaGlQYUxCRkVYZjE3NUVPbjlBZWNPVzBRbXltTUZBUldoeG00M3VBV0RFd2dwbzhGRTdHcmJ3ZllIZG5MeXFHWGM4ZEJ0WEhqQmVXL1ZHQXloRDN6aFMxL205emY4SGlzQy9CRGxSN2loWW5SVXc0ZEdMV0ZSL1VUZU4zSXk3ei8yZmJoaXNISUJybTloNFJLRk5zcWtzRXdHOGRKZ2F1aklLZElWVFVUN2JQWnUza09GU1ZFUnVLU2lQSjgrNmxTK2U5em5HZHVoS1hZMkU1aUlTWFV6WUxmTjNROCt3S2JDdGtOVUNSMFNOallaTWxoY01PRVVManI3WEo1OCtrbnFha2RReklhMGRyWGoyZzRFSWJWT0JiTWFKak90cG9uYm43aVBvTEVHVDBWRWZvNVVLbzF2aEpST3h6UGcya01XVDEvTW91Ky9IM2RVOXEzcSt5SDhCV3hkdFluLy9xZWZFZVdMVkFVMnd6dGRUaHA5TEpPcXgrTjNScmh1aHFBUVlCVWpMSEZSNlRTQlVrU0J3clhTNkZBZ0RPbDBQS0xoRnR2ek8zbDJ4N04wWkFxUUZhd3VuNFVqWmpGNy9GU2VlK1VGVnJmc3BGUGc2SEV6cU12VThPcitEZXdPOXZXWGxIRlFlMlI2R0RXK3hYZlAvM3ZtWmlmdzVBc3I4U2NOcDlsMDRKb0FJbzlzMmliY2M0Q1RSeDJENDlUdzVON2RoQm1OaXRyQVV1UUNpRnhGcEQyR0Rhdm5veis0aklvUlE4SHdkeHJOVy9keTg5ZXZaMWplWmRHSTZZd3BWaUZ0SVVxNTNjNnZRWXlnN1F5aUZiNEJkQVlkYW5Sa1l5bE41RWEwdVYxc2w3MXM3TmpNYm04dkpoUEdpN3Y2Z3ZpS09tY1kxV0dhVVEwamNPc3JXYmx0TlVXZEk3Q0svVnhMQ0FFVjB1cnR4eGViYSsvL0ZiODgvM3ZzM3JDRjI3ZmNSMDRBNlNJaWgxSUZtdndzK2ZXN09QT01DN25yc2Z0cHFXZ25pSm9KQ1BHTVRhZ045YU5xdVBYeDI0Y0lPVUF3ZlB4SXp2am5jN25xbkc4elYwMUVwMU9FWFQ0Nm84SFNjZXc0cFJFZDR2cytvV2hjMTBJcEYrVVhVR2hDOGJIVHdvN2QyN2wreGUvWkhHeENWRWlnQWx3cUlNaVFzdE1jN1EzamZ5eTVoSWYzUHNHMXEzNVBTb0ZJMUU5U2FzQUJuM2lleXl2dEcvbk5VM2V3OElKVCtmbnZIcVdOdUxqV294a1hqNTBvOW5lMk1jNWV3b0psNytOSGoxNk5FSkdqZ0dCUlhadGgrVDIzTTd4cHhGdlJ2ME00VEV5ZU9ZV3YzUEJQQlArMkU3RXIwV2tYdXFmdkVSVVJJd1RpRTBpSTFqYksrRmlhN2hXRE5ZNHJXRldLYmE5dDVmbmNTK3psUUp6WnRJQUlzdFJRRVZYeWtXTlBvN1V5eng4ZnVwdVhncDN4OVRYOWMzUkt3WFVOb1JMYTZlSlhyOTNLWnZieU54ZDhDWVdQV0lLZHJjQkhrVlBDbW1nZlAzemdKeHc5ZnpxbnpUeUpBK1FJWEkydUVlNjQvM2FtVHB0NlpIdDBDRWNFUnkrYXhlUi9Ya1F4RjRDZHdnc2pBakdRVFJOYU5vR3ljZE5ac3VrTUtqSklNWWR5REpISlk2V0xiR25keEorM1BVNExyVWhhSXhWQUd0S1pOQUZGRmsrZXovUmpabkx6YTNmemJMQU9rd1pUQWFhbXY2UTAzWXVEZWZFYU40R0tlRFhheTMvZC9TdG1qaDNGcFVlZlNFWFVRcE9ueUNCWUVrdjhEWHRmNVk3YnJ1V2pKNS9Ldk1ySmpDVExuY3R2NDdnRkM5NlNEaDNDa1VGNmJnMzI1WTFRNWVBM1pXZ2ZiclBOS3RBUytxVGRhcXd3amQ5bUlIRFJWZ1dobDhldUVqcHFBcGEvZWovUEhGaUI1YnBvMndJTlZtQVRGVHhPclp2TGw1YWN5ek92UE01dG14K2tnRUs2TjBLd1BkMWZSNGY0NGtEV2dsd0F4dEZZZ2NWbG8wL2w0eDg0bDVzZXZvMEhOejBJMk95aFNBUmtsYUpXTW54cTJTZVpPbjB1bFNlUDVKeUx6ejJ5UFRpRXR3eXRmOWpCaXV0Vzh2RExUL0ZLeTZ1Y01td2VuNXgxRGxWMkRaRXY2Q2draUxxSXNoNWQxUVZ1V25VZlAxOTlJeHVpWFJSVnZKTUZFaktqYWpvZk9lWk1UcDR3aC9Wclh1YWFWVGV6S3R5RE9EWWlSVkxpRWtaZWYzZUhVQ2hjak5Ia29uaHBIeXdMdDdLU08zYyt5ZjFybnVYaU15OWdxaDZQSWFDR0xBcWJOaEcya09kblQ5L0srQ1dUaHdnNXlGQjN3UmdlVEQvQ05adC94WU9kVDdNdTJrcGJKa2ZPYjhjdkZCRFhJbCt0MkQwaTRPZHIvc2ozVi8wM3I4b3VvclJMMnFxZ1FScW9NQm5lbDU3TzU2YWZqNXRUL0hIMXZid1c3a0hTRm1KOEtrdzlLaEpPRzdXby82UVVFNit2YUl3RnFUU0VnZ0gyNGZHYjUvN0lJODg4eFpWZi9nYXphbWNoUkZncWpiRXJNSmtzRFVlTlkvRW4zLytXZE53UTNscDg0NmYvU0dhY1JZZlR6bDE3L3NROXI5Nkx6Z3B1UnRHaGN1U0cyOXoreXVOYzg5S043TGJhQ2F6WU83ZEZFWmtDQy9STUxwcDBObzEyUGVJNmRGWGI1QWdReThkU0RwNHBzS1IrUHBlZi92bitxdS9ZeTBscEY5K0UyTW9oRWcrVWhjSWlKWXJoS3MxblRyNllaWE1XOGkvLzcvdThHRzRqcDEzUzFTbFdyWHlLQ2VQSEhaRk9FcEhTZkNLZ3grZHlKSDgzeG1DTU9lajd3UWFsVlBjMktmcVEwMytUTmgvcG1aalBQdmNzQzQ4L252clFZYW1heXJmbS9BL2VOMmNKcTdkdjRaZWI3dUMybmZmU0V1d24wSGtjNGo2dm9aWVBqenVEVHl6NkNMTkh6MkIzeXg2dWZ1STZidHArTDgyMG9BVnF3elJ6MDVQNTNJYy96ZDVkKy9vYnB6UW9ESUdKNHRXRlJGRk5CUVVwNGhQZ2E1dWRwcDFmUFhJenJidGErRi8vODUvNTRRMy96Wk03Vi9EcmEzOXh4QWdKQjNkOFg0TWdJa1JSaE5ZYXk3S3dMT3VJL2Y0N2phUmRmUkh2TC9YTDRlSjl4NzJQNzMvbmYvUC92djBkcGc0Yno4ang5UlQ4ZGg3WThSQi8zSElQZVR3c05CaERIUmJIMU16bHRPUE9ZTm1ZSlZSNEtlNis5eDcrdU9NK251aDhpUzRLMUx0MXRBZk5IRHR5Q245LzRkK3dhdFZhZnZuVURZZmg2SFMzTDFOUlJUSG40WWhGUkVoRUVCZnpwdEpJTVdBc296bGo5aW1jL2I0VDhVY3B6djJYVHgyUmprblFsNlJNL2w3K25kYXhoYkppeFFyV3JsMUxvVkFnaXFJZXh3OFd1SzdMaEFrVFdMQmdBUlVWRlNVTlVFNDZFY0d5ckxkRVVpYTQ0YklmTTM5L0k1T0dqMk5IU3d0WDMzOGpMM3Q3cUJ4V1MzdnJIaWJWTkhES3pBVTBPY000ZXRKTWpLZDUrTkVuZUh6YlUreW5EYnM2UTJkbkY1NTBNbXZxMFN4OS95azg5dkp6M1BEMGJSd0ljLzBrWmZmVUdTelFvY2FJMVYyMkhHSzVRaFIyUzdCSTQ1S2xpU28rdS9BOC91bnAvenppSFpNTVJrS3FaSURLaVdqYk5uZmRkUmYvNS8vOEgxYXNXRUZiVzlzUnY0KzNHNmxVaW1uVHB2SFp6MzZXeXkrL0hNZHg4RHdQMjdZUDBoNkppai9TNUF6YlBQTC84QXk3VzVyWlI0SDlkb2puMmxBTXFjVmhkS3FXK3NCaFdFVVZmakhpdGVaZHRHdWZxQ0lBTzE1NE5zd0gxRlpWVWxGVHczKy9jRFBYcjd5RHZFQlJCZjJYbEpydUd1RGVaeVV1a3dHdzBUaFU0M0x2dzNleDhLUWxiNzRuK29BeEJxMDFVUlQxc0JkRkJOZDErZmEzdjgzM3Z2ZTkwdDl0TzdaV0J1U3FGMzhsZ2lBb2ZUN3R0Tk80L3ZyckdUbHlKTDd2bzVUcUlTV1RkcjRWN2IzNXA5ZngvU3UvVDVjeWlLdW8xQ25TUUkxbjgrRnhwM0hPeVIvZzZXZWU0M2V2M01KTzAwN28yQXhQWlRCQkcwMnFrWStmZlNrNmEzSGR2Yi9uZ1cxUDBVYVJBRTJvNHZaSmYxN2QrMlJLOTd5am50OHJCTXVTZUQ4RFJ5NzcrR1Z5SkdDTUtiMzMvbXlNa1NBSVNpL1A4MFJFNUp2Zi9LWUFvclVXMjdiRnR1MSt0WE9ndmh6SEVhMjFwRklwQVdUUm9rV3lhOWN1RVJIeFBFK2lLQ3E5ZXZkVGVWOGVDUnozdnVPNzd5c2xLVEl5bWlyNTJveVB5b09mdlZiK2VlNFhaS2JWSktPcGx3eFpjVWhMSmNpSDZ4YklEWmYrUUg3d2dXL0kwdXFqWlNRVlVvVXJHZVdLU21ZckhtN25xTDRJcVJGc1N3Q3ByUjBtTFMwdFI2d0R5bEhlMGNZWThUeFB3akFVMy9kRlJPUWIzL2hHYVFDVlVtSlpsaWlsM2hYRTFGcVgycFZPcHdXUUUwNDRRWGJ2M2wzcUM5LzNEeUpqMG0vbDcyOFdxMTllSXhWT2c3aFV5R3hydWx6OTBYK1Jtei83ZitYajQ1ZkpPSldXZW13WnBxdWxXbVZrRE1QbDhrV1h5QzMvNDZmeXYwNzhxc3hKajVmaFpLU2VqR1J4eFlxbmk4VThPcUtkbGhBVDVMLys2NW9qMG5DUmcwbFkvdmNvaWlRTVF3bkRVRVJFdnY3MXJ3c2d0bTJMVXFVblR5ekxFc3V5M25GU3ZkbFg4b0FCUFI2MEpVdVd5SjQ5ZTBUa2RZbVo5RS95T2Vtekk0bHZmZVZiY3ZreG41WDd2L1lIK2ZHeWI4dHB0VE5sQWhtcEFhbTJsS1JCNWpwVDVEOHYrcDc4L3FzL2x3OVBPMDJhckJvWlNZM1VVeVVaSExIUll0dU9LQ3NtWnY4ZG5ZVEdmWDNYdlZiTi9BWHplZjY1NS8vcXkvNGxsTnVPRU50SWlRMlpHUE9XWmZGM2YvZDMvUHUvL3p0YTY1SWpaRmxXeWRzdVArZWcyejlFblBQdFJQazlKTzNTV2hPRzRVSHRMMitQYmR1RVljaWlSWXRZdm53NUkwZU9wRmdzbHNKZ3hwaUR3bUZIeXM0TThnRlBmZTVPbGo5OEU0L3RlWlFEZEJLaXVyZEJiT0M4RTg3bHBQbExXYmRxUGJlOGVBZHIydGZqRStEaVlsQVV5T09tVXZIV3k3NzMrdVlZL2JvTHpldlBiVzkwdC9PUlJ4NWgyWW5MM21SelgwYzVXWktCQ2NNUXgzRUlnb0IwT3MzZi8vM2Y4LzN2ZngvYnRrdGhvZkp6eXczLzVCcURDVWxNTW5sQXBkdVpTU0lPU1Y4Y2YvenhMRisrbk9IRGg4ZHpxSHNGMnQrS2NOSFdQN3pNdmY5d0xhYkJZby9YenFhOU82bW9xK09rcFNjVDVnTHUrdk1kdkxCakJXMWhrVFo4bkxTTFNFakJ5eE1US1VLN1RyemZaUmdkUmtpb25KUjluSG44a3VONTR2RW5qa1JiUytoTnlxUkRqVEU0anNPVlYxN0pWVmRkVlNLa2JkdDRudGNqRnBrTWpJZ3dkdXhZNnV2clN3SG9jcEsrazU1NStRT1V0TUYxWFhLNUhCczNib3czZUVxbHVwZVJqa29TUDRvaWJOdkdzaXc4ejJQeDRzWGNjc3N0TkRVMUVRUkI2WHFKeER6U3BBVDQzY24vUk5lV05oYk1XY2owK2ZOWXQzY24xejEwQy9kdWU1RFczRDRDaW5RaEJGamQyMUFxUk9JTlQ1MTBCcEdJc09pRG9yOFpuVEowODZSN3lhUVNQNy85clcrOXllYTl3VTkyeHlJVGdqbU93ei84d3o5dzFWVlg0VGhPNmZ1RWtFbm5KK290bFVyeG4vLzVuNXh5eWlsVVZGVDBVUEVKQmdvcGpURkVVVlNLUTc3NjZxdGNlZVdWckZxMUN0dTJTNFJNK2lNTTQ1MFpMTXZpcWFlZTRxS0xMdUlQZi9nREkwYU1JQWlDa2duUVc0TWt2L2RtaVpvOWN5elpXMjBxS3pNc3YvVTJidHowSjlaMGJHSVByWGdVQUNGeVlodFB3aEJRY1YyalVZUmVNU1pxc3VnVy9UVzJkY2xEaWcxdkVBZkVCcGs5YytZUk5hSVRKQTVPNHRRazRZNHJyN3l5WlB4cnJVVnJYWElBNlBaVUU4Y2dtODNLYmJmZDlwYmMzOXVGTFZ1MnlESEhIQ05BS1NTVXRDOXg0cFJTUGNKRmlmTlRLQlJLRGs5dlorZElPRDlod1pkZm52TWQrV0RWUXBuSUNGRm9zYXkwMkc1YTR1cGJSOENXZU1XSk1nNnBQbm5XVCsrNjdDSzZtNUJ1OS90Tk45NzRwaHZYRjhwSjZYbWVHR042ZU5uSjRDU0RrcEF6SWFycnVpVkNKdkhNOG5qZVFIMGxVWVVvaWtyaHJtM2J0c244K2ZNRlhvOVpKbTN0SFcwQVpQSGl4U1ZpQmtGd2tFZWVSQzJPQkRHditxZC9sUnFxNDN0SUlXUVJIQzNnaUtKU0lQWFhjdTN3UWhPNlcwcTZJQ21RbzZkT2ZkT05PaFRLZytRaUl2LzRqLzhvZ0xpdTI0TjhpZFJJQXVaS0thbXFxcExiYjc5ZFJIcUdTdm9Ld2crVVYzSmZ2ZHVmRUdqcjFxMXk3TEhIbG9oWnJoVVNNdHEyWGZwdTZkS2xrc3ZsU2dSUENIK29VTnZoWXQrK1pzbGtxZ1U3STZTcUJUc3I2R3czR1E4T3h5VUpHTlhyODJHVE1zbnNwTHFKZWMzVlY3L3BSaDBLNVFQeTRJTVBsdFIxT1FsN1M0a2tobmZUVFRlSmlFaXhXT3doY1pQckRrUWM2b0VKdzdDVXNkcStmYnNzWExoUUFNbGtNcVgrU040VHJaRVE4NXZmL0thSVNJL0FldmtEZXFUNjR2TmYrSkxnVkhTVE1TTllHVUU3UFVpbnkxNEpqNUxQaDAzSzVNSjI5OHNDYVcxdFBTS042Z3ZsUkRycnJMTjYySkhsQWZIZU51VHk1Y3RGSkxhbnltM1I1SDJ3SUxuZk1Bd2xDSUllRW5QMjdOa2xyV0ZabHRpMlhYcEl5MjN0WWNPR3lZWU5HMG9hcDF5TmwvL0dtOFhqZi82elFMZmRhSFcvOU1IazYwVkNVZkhtMHBJc1ROcHZRcXBlRjc3Zy9QT1BTSU1PaFdRUTFxOWZMeU5Iaml5Uk11bjBjaFdlT0FHMzNIS0xpSWprOC9tU0hYbWtwY0xiaFhMN3ovZDlDWUpBOHZtOGlNVEVuRGR2WHFuZDVXblZSRm9tZHZjdmZ2RUxFWW1sWmRLbmgzSiszZ3ltVEpvVWt6RlptQmtraFJhM1JMdyswdFJKbWhFdC9ad084ZnBWWGwrUERTNzk1Q2Y3ZTVsK0lRa1FyMSsvbm4zNzlxR1VLc1hxa3F4R0VoeXZxcXJpcHB0dTRvSUxMaWdGMXBPeXJzR0twRzFhNjFJNEtKMU80L3MrNDhhTjQ3YmJibVArL1BsNG5sZks0RWhaNkNmNW5NUTZ5OE5KeWZXUEpDNjU1RkxROFRiS1Nhd3d4SFJ2NndBa0NlNVNHakFKS3Nidi9TWmwrZjV4UXJ5azNJYy8vT0UzMFlTLzhtZVZJcC9QSHpLZUp0MVY1dC81em5mNDBJYytSQkFFcFZJMTZVNURKb003MkFoYVhvS1drQk1vWlhIR2p4L1B6My8rYytycTZ2ck1WaVdrTEJhTFBXb3R5L3RDeXVLV2J4YVhYdlpKQ0JUNENxd1UybnA5SytxZVJGVGRHelQxL054L1VrcVBOeTY5OU5JMzE0Sy81aWU3T3l4NXNuc1RNd2syMTlYVjhjRVBmckNVOWVsZEJGeitHa3g0b3pZa2dmTzVjK2V5Wk1tU1BoL2EzbldWNWVkTFdjRCtTR0hTcEVrc1hud2NFRUFZWUtJZ1dXbWRubnJXOVBucVB5bDc0Wk52c2VxR2d6dXN0N1JMSkVkRlJRV1daWldrUURKQWZSVzc5aDZZdmdhOG5MejlPYlkzK2xLbGIzUzlON3ArNzdhVVAzaDFkWFhBNjhYTWI5U2ZiMlVCTU1BblAza0pyeFB2RFNBSGYzNVRwS3l0cldYQjI3aktSVjhEVWY3M2NwVlVUc3JlNzcyUFNhN1IxN25RazBDSE1nSGVhSEI3cTkrK3J0ZjdHcjEvbzYvNzZuMWNrbW8wQTJEVzVybm5ubnZZNTc0cFVwN3hObTg3MTVmRTZmMTk4dmRFaGZkRnpQSlgrV0FiWXdqRHNPUkFsWC91UzdLVm4vdVhKR1ZmNTVXZjIvdEJNOTFUZ252YmZYMmRrM3dlU05NOUdoc2JtWGlZYTlXL0tWS2Vjc283c3pGbjcwNVBqUHZ5dXNHK0NKTVFMSGxQaUplUUwvRnVrenJFOHMrSkZQWjl2eVNKb2lnaURNTy9xaFl6c1h2aGRhY3NJYnVJRUFRQlVSVGgrMzdKUXpiR1VDd1dTNzlUM3BhK3pKTkVVZzRVbS9sdytYSDRWVUp2NGtjUEY3M1ZWbDhEMU5mZkVtaXRlM2psU2ltQ0lNQjFYUUQyN2R2SGl5Kyt5Qk5QUE1HR0RSdG9iMitub3FLQ1NaTW1zV3paTXViTm0wZFRVeE5BaVNSLzdZekI4bVBMankrWGdvN2pZTnMyYlcxdEJFSEE4T0hEc1cwN1htbWlEenZ4VUZKNklKSHlGNy80UmIvUE8yeFNqaHMzamlsVHBoenU2WWVGdmh5UE56cTJMNVdZT0VYbGhHeHVidWJIUC80eE45eHdBNXMzYis3emV2Lys3Ly9POE9IRHVleXl5L2pLVjc3Q2hBa1RTcldLL1cxRGVad3drWnF1NjdKNzkyNSsvT01mODhnamp4QUVBWk1tVGVMTFgvNHlwNTU2S21FWTl0QUNmZG5VYjdYejBsKzhHYUhWN3pRaklKLzYxS2ZrN1VKU0lYUGpqVGYyeUcwbjk1Smtjc2FNR1NOYnQyNFZFZWxSL1ZLZU8wNHlJc2sxYjd2dE5oay9mbnlQYXptT1U4b1cyYmJkSTNNRVNGTlRrOXh3d3cwaTBqT24zcDlYRkVXbEFoTVJrVC84NFE4eWJkcTBnL281blU3TERUZmNVRW94OWxXNGtWem40eC8vdUFBSFRaQkxVckZYWG5sbHFXL2VxQURrU0dMR2pCbjk1dFpoMjVUTGxpMDczRlBmZGlTU0pRbWdReHg0L3NVdmZzRkZGMTNFMXExYmNSeW5aUGNGUWRERDVrenN2MlQ1bDkyN2QvT3hqMzJNcTY2NmlsUXFkVkJXcWZjcithN2NGalhHWU5zMisvYnQ0NHRmL0NJWFhIQUI2OWV2eDNHYzBoUUcxM1VwRm90Y2NjVVZIRGh3b0ZRMVBwaHc0b2tuOXZ1Y3d5Ymx6Smt6RC9mVXR4M1NTNVhidHMwZGQ5ekJsNzcwcFpLTkdRUkJpYmpsNXlRb2Q1d1NjbDk1NVpYODZsZS93cktzRW5tbDI0dFAwcUFpVXJJL0UwZkp0bTFzMitidXUrL20rT09QNTJjLysxbnArdVVQUkJBRXBZZmcrZWVmLzZzY3FvR0dvNDgrdXQvbkhEWXBaOHlZY2JpbnZ1MUl5SlZJcWgwN2R2REZMMzZ4NUsyV1o0QVNpVmllemt1K1M0NUx2SDJ0TlZkY2NRVnIxcXpwTVdHdFBFNVlUa2JmOTBtbFVyUzN0M1A1NVpkejl0bG5zM0hqeGg0T1VJSkVXaVpob2QyN2QvL0YwTk5BeFBUcDAvdDl6bUdSc3FtcGljckt5aDUvRzhpZFZYNXZsbVh4L2U5L245MjdkK082N2tGQjh1VFk4aW11Q2RHU1NXWkppTWl5TE5yYTJub3NEWk9jVTA2MFJGV24wMm51dSs4K2xpeFp3alhYWElQak9LVUNpa1BkYzBMMjQ0NDdycytnL1VESDIwYkt3L21oZHhJSk9TekxZdGV1WGZ6MnQ3L3RJZm1TWXhJeUFUMWltZkE2T2NwblB5WVR1Lzc0eHorV3BHVWkyWkw0cFZJS3gzRW9GQXBjY2NVVm5IUE9PYXhaczRaVUtsVlM2MzFCcVhoQ1d4QUVmT3hqSDJQNjlPazlaakFPRmt5WU1LSGY1eHhXQzQ4NjZxakRPZTBkUTNrODc0RUhIcUMxdGZXZ2xHVkNLSWpWL0hISEhjY2xsMXpDMHFWTEQ3cE9Rb3lFVUYxZFhUejQ0SU9sL3dkQjBFUDFybHUzanBOUFBwa2YvZWhIUU94a0pVSHl2cVJrY3E3disxeHd3UVZjYzgwMUI2VW9CeE5tejU3ZHIrT1BpS1FjNkIyVjNKOVNpa2NlZVFTZ3RISkdRdFpFQ29rSTMvM3VkM25tbVdlNC92cnJlZXl4eDdqNjZxdEx6azF5cmQ2cmJ0eHp6ejBsNGlUMW01WmwwZFhWeFNXWFhNTHp6ejlmbXJPZDJMTEpQU1gyYS9KdWpLR3hzWkdmL3ZTbjNITExMZFRVMVBUcDBROFdUSnMyclYvSEh4WXBwMDRkWEh2ZmxKTnB3NFlOd091cHlYS2IwaGpEc21YTCtOYTN2bFh5cG9NZzRQTExMK2ZESC81d3laNHNsNmpKNTUwN2QvYkliME1zOFI1NTVCRmVlT0VGWE5mRjg3elNiNWJicStYM2FJemg3TFBQNXJISEh1TUxYL2dDbnVlVmZqZkJRQmNDdmZHMmtMS3FhdkJ0V1pjTXBPLzdQZjVldnJDQlVvcjN2Ly85UFVpVkVPK0VFMDdvSVJrVEZaNjhlNTVYV2lZbHNTbEY0bXI1M29zQTlLNGFTdXpia1NOSGNzMDExM0RublhjeWRlcFVmTjh2TGJLUUVIWXdxdkJodzRiMTYvakRTak5tczROdnA5bGtNTFBaN0VHVk53bEVwSlRiaHRjZEdhVVU0OGFOSzltZTVYSEhoQ2laVEFiSGNVcFNMYm4rOE9IREQxb0N1bmVPM2hqRGFhZWR4bzkrOUNObXpweFprdEt1Ni9ZZzRsdTFNdTliamZyNituNGRmMWlTc3FLaTRuQk9lMGVSRVBHeXl5N3JVZXFsbENLVlN1SDdQclcxdFp4d3dnbWw0OHRWOGFKRmkyaHNiQ1FNd3hLeGt5QzRpSERaWlpmMWlHc203MHVXTEtHMnRyWkU4SVN3aVgxWlYxZkhEMy80USs2Nzd6NW16cHhKc1ZnRTZCSEVUeVQyWU1YYlFzckJLQ21UZ2Iza2trdjQyTWMrVmlwWk05MXJEem1PdzcvKzY3OHlaY3FVVWpnbklXMmlXcSsrK21vcUtpckk1L09sakVzUUJKeDk5dGw4NlV0ZktrbTFSRnI2dnMvRWlSUDU0UTkvaU91NnBmSzBLSXJ3UEkrVFRqcUpoeDkrbUN1dnZMTGtiYnV1MjhNRVNPNTdzSVdDeXRGZlVoNlcraDVza3JKM2FkdDExMTNIQ1NlY3dKLys5Q2NPSERqQXBFbVR1UFRTU3puMTFGTkw0Wnh5Rlo4NE4rZWZmejRqUjQ3azE3LytOV3ZXcktHMnRwYlRUeitkejN6bU02VFQ2ZEx5aElrVFpkczJVUlR4MmM5K2xzbVRKL1BiMy82V2RldldVVmRYeDJtbm5jYm5QLy81VXJ3eXlYVW42SjN5N0tzZGd3VnZDeWtIbTZRc2R6SWdscHFYWDM0NVgvN3lsOG5sY3FYc1ZHSXJKdlpjT1FHU3ZQU1NKVXRZc21RSlhWMWRwZW03U2E2N1BIaGVIdjhzRkFxY2ROSkpuSFRTU1hSMGRGQlpXVm15RDNzN00zM2RkN2twTWRnSUNkRFEwTkN2NDQ4SUtRZUw4WjNFSWhPVm5VcWxxS3lzTElWcWtrcHpPSmpJeWZkSjRVWkM1R1N1ZGVJQWxlZXNJUTRiSmFwYktVVjFkVFZSRkZFc0ZyRnRHOGVKcDUvK3BmampvUnlsZ1lqZWZCZzVjbVMvemo4c1E2WDNmalNEZ1pEd3VqclZXcE5LcFVwaEZzZHhTbDUyNGczMzlzckxLNFMwMXFWcEVVbXBHWEJRZ0IwT0RoMGx3Zk1rZHo1WUh1aitvSGQ3V2x0YiszVytQWkNmdUNPTjhuUml1WW90Lzl3WFNYcDc0bjN0amRoWHFWdjV0Uk1rWGpnY3ZFSFZ1eFYxZFhYOWF1T2JtcU16bUZCT2pQS1ZNM29Ic3N0TDEzb1RyYmRxTC9lSWU5dC95ZmU5QjZOY212WitNSVlRNHoxQnl0NERYMDZnQkwySjF0dXA2UDI1L0p6ZWYrdnJjem42T21hSW1LL2pQVUhLUTNtdHZVbFZycUlQUlpTK2lQcEc1TzFMYlIzcUdrT0k4WjRnWlgvaWU3M3R3cjYrNit1WVE1MTNLTEwxZGN3YkVieDNPOTdOZUUrUXNpOFZPZEFMSE1yejZ1ODEyL09Ja0hLZ0RteUMzZ0h3eEpFWkxKdlNKM1dmU1o3OTNZNzNqS1NFbmhQRVJJUS8vZWxQdlBMS0t3TldBZ1ZCd05LbFMxbTBhTkZCR3pxOW0vR2VJR1dDcE9LbXVibVpyMzcxcTl4eXl5M3Y5QzM5VmZqS1Y3N0NEMy80dzFJNmNpQStRRWNTN3hsU0pvUlVTdkh0YjMrYlcyNjVwVlN2V0c1YnZ0TURudHhEK1RMUlYxOTlOZlgxOWZ6THYveExqOGx1NzFZY01WMHdHRHBLYTgzYXRXdTUvdnJyU3pNRjRmVlYwQkxuNTUxNmxjK2c5SDIvUnk3OU43LzVEVzF0YlgwRzVOOXRlUGNiS04xSVlwRGJ0bTNEOTMyVVVxWHBzdVhGRisva3EveGV5ejhiWTJodGJlVzExMTRyZWVYdlpyeG5TSms0T01PSER3ZGVIK3lCTG5VU2RlNjZicWtFYkRCb3BUZUQ5NHhOQ2ZFQXo1Z3hnK09PTzQ3bm5udnVvTDNCQnhMSzcwMGtYaUZqMHFSSjd3bWJjbENTOG8xSWRDZzFtRXhUeUdReS9PQUhQK0RpaXk5bXo1NDliK2w5dmhtVXo3bzg2cWlqK0kvLytBL2dMOWRkdmhzd3FFaDVLREwrdFpJdW1UZXpiTmt5SG43NFlhNjY2aXBXckZneElMenUza2pJZCtLSkozTGxsVmZTMk5qWUkwNVpucVVxdDRuZkRSaFVwQ3pQTS9jMUFIMVYzeVNsYUVuWUoxbXUrYWlqanVKblAvdloyM3IvYndhOUEvKzlTKzdlVFJoVXBFelEydzRzWHcwdG1iVFZ1d2lqZlBDUytUZUR3ZEZKN3J2MytrWEo1OTc5MFB1WXdZaEJSY3B5TlZVdUxjdmZ5MWZWVFFMbTVlZVhuemRZY3Q5OW9Wd0RRTSsybDY4TU54Z3hxRWlab0s4aTIrVC92VlZaYjJuNWwyb2RCenA2dHlYWjhTS1p2UFp1d0tCcXhhSEltQ0NaYVZpKzBtNXZpZHBYQmZsQVIxOU9UVGtTRlorc3J2R1hndXU5KzJPZ1lWQUV6M3VUcUhlcUxWa3BkKy9ldlR6NzdMTWwyN0szUGRsWFFlNWdRRytucHZ6L3lVUzB6WnMzODlSVFR4MXkra1g1KzBEdmgwRkJ5b1JjcVZRSzZDa0pla3ZESzYrOGt1ZWVlNjdIMG52bDYxQU8xR0Q1R3lHNTUvSTh1WWlVTmhISTUvTjg5YXRmWmNlT0hTV2lsaE11c1oxN0wzb3dVTk9WZzRLVUNmRW1USmhBZlgxOXlaWktEUDFFWlNzVkwxaC83cm5uOHZUVFQ1TktwVW9xUFRsdU1OcVM1V3EyZk4xTXgzSEk1WEo4NUNNZjRlNjc3KzZ4cFVtNU01ZVFiOHlZTVNYU0hpckpNQkF3S0VpWnhCdG56SmhSMmlxbHIvVitST0oxSm5mdDJzV0ZGMTdJODg4L2ordTZwVUVZS09WcC9VWDVmU2VtUzdMTHhDYys4UW51dnZ2dVVqdVQ0M3VmVzF0Ynk0a25ubmhRZUd4QVBxZ3lDR0M2ZHdzVEVibnBwcHNFRU5kMVJXdmRZK2N4UUpSU3BSMjJHaHNiNWVtbm54YVJOOTRaTFBtTmdZVHkrekpsdTVRVmkwVVJpZHZ6d1E5K1VBREpack1IdFQxNUpidVBmZjd6bnhjUkVjL3pKSXFpMHZWNjk4TkF3S0FncGNqcnhJeWlTTDd3aFM4SUlJN2ppRktxdEYwZFVDSnE4dDdZMkNoUFBmV1VpTVRiNmZVZWpPVGFBd0dIZWxDU3Z5WDMzOW5aS2VlY2MwNnBEMnpiRnEzMVFkc0RwdE5wQVdUdTNMblMzTnpjbzkzbFcrRkZVZlJPTnZzZ0RBcFNsbmRlR0laU0xCYmx3Z3N2TEVtQ2NoTDJKU1ZHalJvbHp6enpqSWdjTENrRzhxdTh6UWtoQzRXQ25IZmVlU1ZDbGorSXlXZDRmVC9HMmJObnk3cDE2MFJFRGlKaVh3L29RTUNnSUdYeUpKZEx5MXd1SitlZmY3NEFra3FsK3BTVTVZUFQxTlJVa3BqbGd6R1FVZDV1RVpIT3prNDU4OHd6ZXhBeWVTWHRWa3FWdnBzOWU3WnMyclJKUk9LSHNmeWFBeGxLWkNCWnVIMUR5anpLeEpOTVlwR1hYWFladi92ZDcwcHI5SlN2cHBzWTg4a1NmaU5IanVTWHYvd2xTNWN1N2VIQkR4UUhxUGRRbEtjTk4yell3SGUrOHgxdXZmVldYTmN0TGZxZnRLTjh0ZDhvaWpqbW1HTzQ5ZFpibVR4NU1yN3ZsL3JuamRyNlRyYy93YUFpWmZLNTNNdjBQSTlMTDcyVTIyNjdyVlFZMjFmZXR6eFB2SERod3RMUzBRUE44eXduVEZLcXByVm16Wm8xSERodzRDQkNpcnkra3B6V21qQU1tVDE3TnN1WEwyZlNwRWtIRVRMQlFDRmduM2k3UmZQaG9MY0htdXpabmV5QjdmdStYSERCQlNVN01qSDRFNVhlbDFjNkdGKzJiWXZydXFYMkpPcmFzcXlTeXA0MWE1WnMzTGhSUktSSFB3MG05VDJvY3QvbHBXYmxxVEt0TmRkZWV5MUtLVzY1NVJZY3h6bm8yRVRxSk5OWFJlU2dpV01EQ2IwbFdiTFlhaUx4eXJNeHJ1dFNLQlE0NXBoaldMNThPUk1uVHNUenZCNUxIaWJtenFEWTl1U2RmQ0wrV3ZRT2pZaklRZDZwU0d6TWYvU2pIKzNoNENUU3BDL3ZmTEM5a3JhVWYwNjB3ZXpaczJYRGhnMmxmdWdydkRUUVFtQ0h3cUFncFVqUGppeVByUmxqSkFnQ0NZSkFvaWlTUXFGUVV1V3BWS3FrM25ySDhBYmpLNGtvMEszS1U2bVVRQnlIM0x4NXM0akVoQ3dQL2ZRTzl3eDBRb29NRWxMMmxkM295ODVNWW5tKzc4dkZGMThzRUdkK0xNc3FCWmpmYVdJZENXSnFyVXMyNU15Wk0yWDkrdlVpOHJvTjJWZW1aakJKeWtIaGZmY0Y2VlZqV0Y2QkRYRnQ1UmUvK0VWKzg1dmZBSEVJNlZBYnZnOFdKRFp4VXYyMGNPRkNicmpoQmlaT25JanYrejFXWlV2YU9pZ1h4SG9ISDRnM2hkNVpIcy96U3A1bW9yNmlLSktmL09Rbk1tUEdqSGRjd2gzSjE1Z3hZK1J2Ly9adlpmLysvU0lpSlMyUjlFT1NZQmhvbVpxL0Z1OEtTWmtFekh0UEZVaUtmOXZhMm5qc3NjZllzbVVMWFYxZGcxSjZTSGNGVkZOVEU0c1hMMmJTcEVrQXBmV0dFaVFSaFlHVUZPZ3ZCaTBwLzFyMDNpdjczWUprWGs3dkVNK2hQZzhtREZwU2xrdkVOMElTMHhzTTAybmZDT1VFUzJLemZkVk45alU1YnJBUmM5Q1NzaitRWGs3UllCdWs4aUZLN3I5Y0dnNktnSGcvTUtneU9rY0NnM0hnZXQ5elgxWGpRNlFjWkJqb3MvZitFdjZTcVRKWTIzVW92T2ZVOTJERVlMVU5EeGZ2Q1ZJT2R2dzFrdkxkUk5vaFVnNWh3R0h3UlpHSDhLN0hFQ21ITU9Bd1JNb2hERGdNa1hJSUF3NURwQnpDZ01NUUtZY3c0REJFeWlFTU9BeVJjZ2dERGtPa0hNS0F3eEFwaHpEZ01FVEtJUXc0REpGeUNBTU9RNlFjd29EREVDbUhNT0F3Uk1vaEREZ01rWElJQXc1RHBCekNnTU1RS1k4Z2hvcjRqd3lHU0hrRThXNlpJL05PWTRpVVF4aHdHQ0xsRUFZY2hrZzVoQUdISVZJT1ljQmhpSlJER0hBWUl1VVFCaHlHU0RtRUFZY2hVZzVod0dHSWxFTVljQmdpNVJBR0hJWklPWVFCaHlGU0RtSEFZWWlVUXhod0dDTGxFQVljL244NFFFaC9vcTRnYXdBQUFBQkpSVTVFcmtKZ2dnPT1cIiBzdHlsZT1cIm1heC13aWR0aDo4MDBweDtcIj5ceDNjL2E+IiwiZU5yVnpsdHV3akFRaGVHdFdMemJFL1Vpb0FJVzBNZG1BZFhFVExCTmZKdHhtc0xxUzZXcXJJSEhYMGVmZEQ0SWp6NmQxRHQrWVcvWmw2Wkd6bEdOZmlLMVErV1l4djNxdDk0QUlQbHZrSmFaWUZPdWExbVcwTG5OaTR1MUM3YjZHSTdKcDFyRFU2MjZYSnJMNmRsc05lY2h0NUV4MHBMNXJJVW1TbjZPWXBrb2ljdE5kR2UyNWhVbVA4QS9BL0dOZEVGN3hoTUo5SCtxdnl0Z2tqeXp2YTFEdm5WakxKK2h6c1FYRTJSMWVLUzNPOENEK1FHSXZaUGQiLCJlTnF0VXoxdjJ6QVEzZjBycmhraUtnZ29CZGxpZUNpQ0xGbVNvaTA2QklGQlV5ZVppa1FxNUNtV1VPaS9sL3B3STd0dXVwU0xkTWQzOTk1OThLNUJXWlBTR1h4MnJaWmJhN1NwSGR5TE4vRlZXbFhSellLbHRaYWtqQVltUlZGc2hId0o0ZWNDL0hrVEZwVE9VZEs2Vk03NU5Pdjh0VWJiWHNKT0tGcW54cTQzeHBBaks2b0trK2wyT1FTZkRJUVZ2TlB0YVFaMENvemFDazBLTzZVVHMrUDVseUhnMDJvRndUNG1tSWZzRmJxaEVKOTVDa3lNckV2VXhLVkZRWGhYWUcreFlNUUY0ZklndytqbHprcWZJWWdpa1l1R1o4WmtCWXBLT1M1Tk9maWlRbTFjTkZZUlhmTnJmalVadkZTYTV5NDRUSHVzWldPU2x2ZE4wc250VmhVSkczbG5ZcnJocnhzZEg3WDNmL2R3d2pxa2I2cEVVeFA3aVAwU3J1STRudXNHTEJ3ZTVSeUpPVGFWZlRxN09Ydm1TaHBOUW1ubjFjOHVweGs5T3F3VE05dEVZYk5qbWYyeFNMWFZzL0xSRC9jVWNBWWUyVVlrSjJ5SStZLzU3a3V5dDhLaHQzejkyRHlrUGVuaFRRam5HUzFYRUMvL0lPZ09YZDNSVnUxZkVpTmI0OStHZlBLRnNQRGZHOUJqdXBBTk9DOTYyREQzRkQ5RGRQR2JHUzZpaFlmOVVMVDFJd1doMjNjby93WEZEa1E3IiwiZU5yVmoxRnV3akFRUks5aThXOXYxRklCRmVVQS9Xd09VRGxtRTYrSjdYalhJY0RwQWFscXo5Qy9lUm85YWVZTDdaSFNvRDd0MmJhT2FhcXE1eHhWVHlPcXZWV2VzZjlZUGVrZEFCSmRRR3BtaE8xMDI4aXloTVp2MXo2V0pyaENNUndUcFZMQ1N5bDZ1bGFmMDZ2WmFjNWRyajNiaUV2bWt4WWNNZEVjeFRGaUVwK3I2TWJzekJ1TTFNR3ZCa0lWOVdUZHlRNG8wUDVZN1o4RmpKSm5kbzkyd1ByZDVUazlyenpDeFFSWkhmN1QyajNZZzdrRFZRT1RYUT09IiwiZU5xbFZFMXYyekFNdmVkWEVNVXcyN0dicEQwMjhHRURCaFFGZGhoNjJNRXdCdFdSWTYyT0ZNaHkwNkROZjU5a2ZWaDI0MlhBZFBBSDlmaElQbEg4OW9xTFZoQzZoUy9Oa1JZVlo1UzFEVHlnRi9SWWNMSVhkN093YkdraENLTVFOcmpHaFdDOFNhRGdiUDlyaC9pV1VQbUQ2dm9KRmM4UnZNMUFyaGZFZ1NUd1NjaDlMQkpnWmRtb2Q0MUxBU25RdHE0VEVHenZ2ZzlrSXlyNzExR29WV0d5cmF6RHVqT1hqRU5JcEdtMUJnS2ZhN0VHbDlTaXhuUXJLcmtSeHpZVHRVd2EwdW4zanhielkxOUdSdkpvN1hDa2hOQmdEUldrcVl6a2M2bkZzV2c1ZFVXSG1jL25FNTdjbHhaQVptRDV0U0VjUmRmNnBMcGdlSCszdWhqTE9CR3JtaU50QmVZL2xkRW5QZ0d1R3p6aCtoMkphckZEcitGZ1Y2MHVsMWdEN1FrdWpQRmN3QUZCQk5lR210Q3VxZ0hEV1lsVS9WMUxlT1hiQnBpbzMvWEhJSi83em5wUkFlYzhMWUZLSnpaQVY0QTJubzA0TFlGMDhna21CUmcwd0xoY2MzczhJUytVYUJ6Kzh5REdhZWg3MnhkeklRa04vMmNsOUxPL1crNTBWbVo4WFB1akorcUhoUTlVTWYrT2s1a2NDTjJ3ZzlmRGRnekZ2aWZNNFRiNk1KSStRTlMxUDBXNmhhU3gzV0VxbW15Vko3Q2M5eE1LNXNzUjRrWWpCbXhqekcwT0hjWm9vZ0F5MnRjanRJMGEzQTU0Tnd1eUlLczRMdE9ySldkUFRKUWM3ZkNCOGVmbHZtS0NYZVZCSGdDaUd3aHVWc0VmdlpLdzl3PT0iLCIqQ2xvc2UgQWxsIEJyb3dzZXJzIiwiKjxwPkNsb3NlcyBhbGwgb3BlbiBicm93c2VycyBhbmQgcmVzZXRzIHRoZSBicm93c2VyIGNhY2hlLlx4M2MvcD4iXSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbInN0YXRzIl0gPSBbW3siZWxhcHNlZCI6IjAwOjAwOjA1IiwiZmFpbCI6MCwibGFiZWwiOiJBbGwgVGVzdHMiLCJwYXNzIjoxLCJza2lwIjowfV0sW10sW3siZWxhcHNlZCI6IjAwOjAwOjA2IiwiZmFpbCI6MCwiaWQiOiJzMSIsImxhYmVsIjoiSnVweXRlciIsIm5hbWUiOiJKdXB5dGVyIiwicGFzcyI6MSwic2tpcCI6MH1dXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiZXJyb3JzIl0gPSBbXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiYmFzZU1pbGxpcyJdID0gMTY0NTM0OTg0MTg2MTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiZ2VuZXJhdGVkIl0gPSA1OTAxOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJleHBhbmRfa2V5d29yZHMiXSA9IG51bGw7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5zZXR0aW5ncyA9IHsiZGVmYXVsdExldmVsIjoiVFJBQ0UiLCJtaW5MZXZlbCI6IklORk8iLCJyZXBvcnRVUkwiOm51bGwsInJwYSI6ZmFsc2UsInNwbGl0TG9nQmFzZSI6ImxvZyIsInRpdGxlIjoiIn07Cjwvc2NyaXB0Pgo8dGl0bGU+PC90aXRsZT4KPC9oZWFkPgo8Ym9keT4KPGRpdiBpZD0iamF2YXNjcmlwdC1kaXNhYmxlZCI+CiAgPGgxPk9wZW5pbmcgUm9ib3QgRnJhbWV3b3JrIGxvZyBmYWlsZWQ8L2gxPgogIDx1bD4KICAgIDxsaT5WZXJpZnkgdGhhdCB5b3UgaGF2ZSA8Yj5KYXZhU2NyaXB0IGVuYWJsZWQ8L2I+IGluIHlvdXIgYnJvd3Nlci48L2xpPgogICAgPGxpPk1ha2Ugc3VyZSB5b3UgYXJlIHVzaW5nIGEgPGI+bW9kZXJuIGVub3VnaCBicm93c2VyPC9iPi4gSWYgdXNpbmcgSW50ZXJuZXQgRXhwbG9yZXIsIHZlcnNpb24gMTEgaXMgcmVxdWlyZWQuPC9saT4KICAgIDxsaT5DaGVjayBhcmUgdGhlcmUgbWVzc2FnZXMgaW4geW91ciBicm93c2VyJ3MgPGI+SmF2YVNjcmlwdCBlcnJvciBsb2c8L2I+LiBQbGVhc2UgcmVwb3J0IHRoZSBwcm9ibGVtIGlmIHlvdSBzdXNwZWN0IHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnLjwvbGk+CiAgPC91bD4KPC9kaXY+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5yZW1vdmVKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKCk7PC9zY3JpcHQ+Cgo8ZGl2IGlkPSJoZWFkZXIiPjwvZGl2Pgo8ZGl2IGlkPSJzdGF0aXN0aWNzLWNvbnRhaW5lciI+PC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgICB2YXIgdG9wc3VpdGUgPSB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgYWRkSmF2YVNjcmlwdERpc2FibGVkV2FybmluZyhlcnJvcik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW5pdExheW91dCh0b3BzdWl0ZS5uYW1lLCAnTG9nJyk7CiAgICBhZGRTdGF0aXN0aWNzKCk7CiAgICBhZGRFcnJvcnMoKTsKICAgIGFkZEV4ZWN1dGlvbkxvZyh0b3BzdWl0ZSk7CiAgICBhZGRMb2dMZXZlbFNlbGVjdG9yKHdpbmRvdy5zZXR0aW5nc1snbWluTGV2ZWwnXSwgd2luZG93LnNldHRpbmdzWydkZWZhdWx0TGV2ZWwnXSk7CiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2gpIHsKICAgICAgICBtYWtlRWxlbWVudFZpc2libGUod2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZXhwYW5kU3VpdGUodG9wc3VpdGUpOwogICAgfQogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGxvYWRBbmRFeHBhbmRFbGVtZW50SWRzKHdpbmRvdy5vdXRwdXRbJ2V4cGFuZF9rZXl3b3JkcyddKTsgfSwgMTAwKTsKfSk7CgpmdW5jdGlvbiBhZGRMb2dMZXZlbFNlbGVjdG9yKG1pbkxldmVsLCBkZWZhdWx0TGV2ZWwpIHsKICAgIHZhciBjb250cm9sbGVyID0gTG9nTGV2ZWxDb250cm9sbGVyKG1pbkxldmVsLCBkZWZhdWx0TGV2ZWwpOwogICAgaWYgKGNvbnRyb2xsZXIuc2hvd0xvZ0xldmVsU2VsZWN0b3IoKSkgewogICAgICAgIHZhciBzZWxlY3RvciA9ICQudG1wbCgnbG9nTGV2ZWxTZWxlY3RvclRlbXBsYXRlJywgY29udHJvbGxlcik7CiAgICAgICAgc2VsZWN0b3IuZmluZCgnc2VsZWN0JykudmFsKGNvbnRyb2xsZXIuZGVmYXVsdExvZ0xldmVsKCkpOwogICAgICAgIHNlbGVjdG9yLmFwcGVuZFRvKCQoJyN0b3AtcmlnaHQtaGVhZGVyJykpOwogICAgICAgICQoJyNyZXBvcnQtb3ItbG9nLWxpbmsnKS5maW5kKCdhJykuY3NzKHsnYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyc6ICcwJ30pOwogICAgICAgIHNldE1lc3NhZ2VWaXNpYmlsaXR5KGNvbnRyb2xsZXIuZGVmYXVsdExvZ0xldmVsKCkpOwogICAgfQp9CgpmdW5jdGlvbiBhZGRFcnJvcnMoKSB7CiAgICB2YXIgZXJyb3JzID0gd2luZG93LnRlc3RkYXRhLmVycm9ySXRlcmF0b3IoKTsKICAgIGlmIChlcnJvcnMuaGFzTmV4dCgpKSB7CiAgICAgICAgJC50bXBsKCdlcnJvckhlYWRlclRlbXBsYXRlJykuYXBwZW5kVG8oJCgnYm9keScpKTsKICAgICAgICBkcmF3RXJyb3JzUmVjdXJzaXZlbHkoZXJyb3JzLCAkKCcjZXJyb3JzJykpOwogICAgfQp9CgpmdW5jdGlvbiBkcmF3RXJyb3JzUmVjdXJzaXZlbHkoZXJyb3JzLCB0YXJnZXQpIHsKICAgIHZhciBlbGVtZW50cyA9IHBvcEZyb21JdGVyYXRvcihlcnJvcnMsIDEwKTsKICAgICQudG1wbCgnZXJyb3JUZW1wbGF0ZScsIGVsZW1lbnRzKS5hcHBlbmRUbyh0YXJnZXQpOwogICAgaWYgKGVycm9ycy5oYXNOZXh0KCkpCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGRyYXdFcnJvcnNSZWN1cnNpdmVseShlcnJvcnMsIHRhcmdldCk7IH0sIDApOwogICAgZWxzZSB7CiAgICAgICAgLy8gRXJyb3JzIG1heSBoYXZlIG1vdmVkIHNjcm9sbCBwb3NpdGlvbi4gUmVzZXR0aW5nIGxvY2F0aW9uIHJlLXNjcm9sbHMuCiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoKQogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh3aW5kb3cubG9jYXRpb24uaGFzaCk7CiAgICAgICAgaGlnaGxpZ2h0TGlua1RhcmdldCgpOwogICAgfQp9CgpmdW5jdGlvbiBoaWdobGlnaHRMaW5rVGFyZ2V0KCkgewogICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoKSB7CiAgICAgICAgdmFyIHRhcmdldCA9ICQod2luZG93LmxvY2F0aW9uLmhhc2gpOwogICAgICAgIGhpZ2hsaWdodCh0YXJnZXQpOwogICAgfQp9CgpmdW5jdGlvbiBoaWdobGlnaHQoZWxlbWVudCwgY29sb3IpIHsKICAgIGlmIChjb2xvciA9PT0gdW5kZWZpbmVkKQogICAgICAgIGNvbG9yID0gMjQyOwogICAgaWYgKGNvbG9yIDwgMjU1KSB7CiAgICAgICAgZWxlbWVudC5jc3MoeydiYWNrZ3JvdW5kLWNvbG9yJzogJ3JnYignK2NvbG9yKycsJytjb2xvcisnLCcrY29sb3IrJyknfSk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGhpZ2hsaWdodChlbGVtZW50LCBjb2xvcisxKTsgfSwgMzAwKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZWxlbWVudC5jc3MoeydiYWNrZ3JvdW5kLWNvbG9yJzogJyd9KTsKICAgIH0KfQoKZnVuY3Rpb24gcG9wRnJvbUl0ZXJhdG9yKGl0ZXJhdG9yLCB1cFRvKSB7CiAgICB2YXIgcmVzdWx0ID0gW107CiAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpID4gMCAmJiByZXN1bHQubGVuZ3RoIDwgdXBUbykKICAgICAgICByZXN1bHQucHVzaChpdGVyYXRvci5uZXh0KCkpOwogICAgcmV0dXJuIHJlc3VsdDsKfQoKZnVuY3Rpb24gbWFrZUVsZW1lbnRWaXNpYmxlKGlkKSB7CiAgICB3aW5kb3cudGVzdGRhdGEuZW5zdXJlTG9hZGVkKGlkLCBmdW5jdGlvbiAoaWRzKSB7CiAgICAgICAgdXRpbC5tYXAoaWRzLCBleHBhbmRFbGVtZW50V2l0aElkKTsKICAgICAgICBpZiAoaWRzLmxlbmd0aCkgewogICAgICAgICAgICBleHBhbmRGYWlsZWQod2luZG93LnRlc3RkYXRhLmZpbmRMb2FkZWQodXRpbC5sYXN0KGlkcykpKTsKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnJzsKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSBpZDsKICAgICAgICAgICAgaGlnaGxpZ2h0TGlua1RhcmdldCgpOwogICAgICAgIH0KICAgIH0pOwp9CgpmdW5jdGlvbiBhZGRFeGVjdXRpb25Mb2cobWFpbikgewogICAgJCgnYm9keScpLmFwcGVuZCgkKHRlc3RPclRhc2soJzxoMj57VGVzdH0gRXhlY3V0aW9uIExvZzwvaDI+JykpLAogICAgICAgICAgICAgICAgICAgICAkLnRtcGwoJ3N1aXRlVGVtcGxhdGUnLCBtYWluKSk7Cn0KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRvdGFsU3RhdGlzdGljc1Jvd1RlbXBsYXRlIj4KICA8dHIgY2xhc3M9InJvdy0keyRpdGVtLmluZGV4fSI+CiAgICA8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIj4KICAgICAgPGRpdiBjbGFzcz0ic3RhdC1uYW1lIj4KICAgICAgICA8c3Bhbj57e2h0bWwgbGFiZWx9fTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L3RkPgogICAge3t0bXBsKCRkYXRhKSAnc3RhdENvbHVtbnNUZW1wbGF0ZSd9fQogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0YWdTdGF0aXN0aWNzUm93VGVtcGxhdGUiPgogIDx0ciBjbGFzcz0icm93LSR7JGl0ZW0uaW5kZXh9Ij4KICAgIDx0ZCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiIHRpdGxlPSJ7e2h0bWwgZG9jfX0iPgogICAgICA8ZGl2IGNsYXNzPSJzdGF0LW5hbWUiPgogICAgICAgIDxzcGFuPnt7aHRtbCBsYWJlbH19PC9zcGFuPgogICAgICAgIHt7aWYgaW5mb319KCR7aW5mb30pe3svaWZ9fQogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0idGFnLWxpbmtzIj4KICAgICAgICB7e2VhY2ggbGlua3N9fQogICAgICAgIDxzcGFuPls8YSBocmVmPSJ7e2h0bWwgJHZhbHVlLnVybH19IiB0aXRsZT0ie3todG1sICR2YWx1ZS51cmx9fSI+e3todG1sICR2YWx1ZS50aXRsZX19PC9hPl08L3NwYW4+CiAgICAgICAge3svZWFjaH19CiAgICAgIDwvZGl2PgogICAgPC90ZD4KICAgIHt7dG1wbCgkZGF0YSkgJ3N0YXRDb2x1bW5zVGVtcGxhdGUnfX0KICA8L3RyPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ic3VpdGVTdGF0aXN0aWNzUm93VGVtcGxhdGUiPgogIDx0ciBvbmNsaWNrPSJtYWtlRWxlbWVudFZpc2libGUoJyR7aWR9JykiIGNsYXNzPSJyb3ctJHskaXRlbS5pbmRleH0iPgogICAgPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSIgdGl0bGU9Int7aHRtbCBsYWJlbH19Ij4KICAgICAgPGRpdiBjbGFzcz0ic3RhdC1uYW1lIj4KICAgICAgICA8YSBocmVmPSIjJHtpZH0iPjxzcGFuIGNsYXNzPSJwYXJlbnQtbmFtZSI+e3todG1sIGZvcm1hdFBhcmVudE5hbWV9fTwvc3Bhbj57e2h0bWwgbmFtZX19PC9hPgogICAgICA8L2Rpdj4KICAgIDwvdGQ+CiAgICB7e3RtcGwoJGRhdGEpICdzdGF0Q29sdW1uc1RlbXBsYXRlJ319CiAgPC90cj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9ImVycm9ySGVhZGVyVGVtcGxhdGUiPgogIDxoMj57ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fSBFeGVjdXRpb24gRXJyb3JzPC9oMj4KICA8dGFibGUgaWQ9ImVycm9ycyI+PC90YWJsZT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9ImVycm9yVGVtcGxhdGUiPgogIDx0ciBpZD0iJHtpZH0iIGNsYXNzPSJtZXNzYWdlLXJvdyI+CiAgICA8dGQgY2xhc3M9ImVycm9yLXRpbWUiPgogICAgICB7e2lmIGxpbmt9fQogICAgICA8YSBvbmNsaWNrPSJtYWtlRWxlbWVudFZpc2libGUoJyR7bGlua30nKSIgaHJlZj0iIyR7bGlua30iIHRpdGxlPSJMaW5rIHRvIGRldGFpbHMiPiR7ZGF0ZX0gJHt0aW1lfTwvYT4KICAgICAge3tlbHNlfX0KICAgICAgJHtkYXRlfSAke3RpbWV9CiAgICAgIHt7L2lmfX0KICAgIDwvdGQ+CiAgICA8dGQgY2xhc3M9IiR7bGV2ZWwudG9Mb3dlckNhc2UoKX0gbGV2ZWwiPjxzcGFuIGNsYXNzPSJsYWJlbCAke2xldmVsLnRvTG93ZXJDYXNlKCl9Ij4ke2xldmVsfTwvc3Bhbj48L3RkPgogICAgPHRkIGNsYXNzPSJtZXNzYWdlIj57e2h0bWwgdGV4dH19PC90ZD4KICAgIDx0ZCBjbGFzcz0ic2VsZWN0LW1lc3NhZ2UiIG9uY2xpY2s9ImphdmFzY3JpcHQ6c2VsZWN0TWVzc2FnZSgnJHtpZH0nKSIgdGl0bGU9IlNlbGVjdCBtZXNzYWdlIHRleHQiPgogICAgICA8ZGl2PjwvZGl2PgogICAgPC90ZD4KICA8L3RyPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ic3VpdGVUZW1wbGF0ZSI+CiAgPGRpdiBpZD0iJHtpZH0iIGNsYXNzPSJzdWl0ZSI+CiAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlciBjbG9zZWQiIG9uY2xpY2s9InRvZ2dsZVN1aXRlKCcke2lkfScpIj4KICAgICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXItbGVmdCIgdGl0bGU9IlNVSVRFICB7e2h0bWwgbmFtZX19ICBbJHtzdGF0dXN9XSI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImVsYXBzZWQiIHRpdGxlPSJFbGFwc2VkIHRpbWUiPiR7dGltZXMuZWxhcHNlZFRpbWV9PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJsYWJlbCAke3N0YXR1cy50b0xvd2VyQ2FzZSgpfSI+U1VJVEU8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9Im5hbWUiPnt7aHRtbCBuYW1lfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci1yaWdodCIgb25jbGljaz0ic3RvcFByb3BhZ2F0aW9uKGV2ZW50KSIgdGl0bGU9IiI+CiAgICAgICAgPGEgY2xhc3M9ImV4cGFuZCIgdGl0bGU9IkV4cGFuZCBhbGwiIGhyZWY9ImphdmFzY3JpcHQ6ZXhwYW5kQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImNvbGxhcHNlIiB0aXRsZT0iQ29sbGFwc2UgYWxsIiBocmVmPSJqYXZhc2NyaXB0OmNvbGxhcHNlQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImxpbmsiIHRpdGxlPSJMaW5rIHRvIHRoaXMgc3VpdGUiIGhyZWY9IiMke2lkfSIgb25jbGljaz0ibWFrZUVsZW1lbnRWaXNpYmxlKCcke2lkfScpIj48L2E+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci10b2dnbGUiIHRpdGxlPSJUb2dnbGUgdmlzaWJpbGl0eSI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImNoaWxkcmVuIj4KICAgICAgPHRhYmxlIGNsYXNzPSJtZXRhZGF0YSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPkZ1bGwgTmFtZTo8L3RoPgogICAgICAgICAgPHRkPnt7aHRtbCBmdWxsTmFtZX19PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7aWYgZG9jKCl9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICAgICAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sIGRvYygpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIHt7ZWFjaCBtZXRhZGF0YX19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPnt7aHRtbCAkdmFsdWVbMF19fTo8L3RoPgogICAgICAgICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCAkdmFsdWVbMV19fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9lYWNofX0KICAgICAgICB7e2lmIHNvdXJjZX19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlNvdXJjZTo8L3RoPgogICAgICAgICAge3tpZiByZWxhdGl2ZVNvdXJjZX19CiAgICAgICAgICA8dGQ+PGEgaHJlZj0iJHtyZWxhdGl2ZVNvdXJjZX0iPnt7aHRtbCBzb3VyY2V9fTwvYT48L3RkPgogICAgICAgICAge3tlbHNlfX0KICAgICAgICAgIDx0ZD57e2h0bWwgc291cmNlfX08L3RkPgogICAgICAgICAge3svaWZ9fQogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5TdGFydCAvIEVuZCAvIEVsYXBzZWQ6PC90aD4KICAgICAgICAgIDx0ZD4ke3RpbWVzLnN0YXJ0VGltZX0gLyAke3RpbWVzLmVuZFRpbWV9IC8gJHt0aW1lcy5lbGFwc2VkVGltZX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlN0YXR1czo8L3RoPgogICAgICAgICAgPHRkPnt7dG1wbCgkZGF0YSkgJ3N1aXRlU3RhdHVzTWVzc2FnZVRlbXBsYXRlJ319PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7aWYgbWVzc2FnZSgpfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+TWVzc2FnZTo8L3RoPgogICAgICAgICAgPHRkIGNsYXNzPSJtZXNzYWdlIj57e2h0bWwgbWVzc2FnZSgpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0ZXN0VGVtcGxhdGUiPgogIDxkaXYgaWQ9IiR7aWR9IiBjbGFzcz0idGVzdCI+CiAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlciBjbG9zZWQiIG9uY2xpY2s9InRvZ2dsZVRlc3QoJyR7aWR9JykiPgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci1sZWZ0IiB0aXRsZT0ie3s9IHRlc3RPclRhc2soJ3tURVNUfScpfX0gIHt7aHRtbCBuYW1lfX0gIFske3N0YXR1c31dIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZWxhcHNlZCIgdGl0bGU9IkVsYXBzZWQgdGltZSI+JHt0aW1lcy5lbGFwc2VkVGltZX08L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImxhYmVsICR7c3RhdHVzLnRvTG93ZXJDYXNlKCl9Ij57ez0gdGVzdE9yVGFzaygne1RFU1R9Jyl9fTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0ibmFtZSI+e3todG1sIG5hbWV9fTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLXJpZ2h0IiBvbmNsaWNrPSJzdG9wUHJvcGFnYXRpb24oZXZlbnQpIiB0aXRsZT0iIj4KICAgICAgICA8YSBjbGFzcz0iZXhwYW5kIiB0aXRsZT0iRXhwYW5kIGFsbCIgaHJlZj0iamF2YXNjcmlwdDpleHBhbmRBbGwoJyR7aWR9JykiPjwvYT4KICAgICAgICA8YSBjbGFzcz0iY29sbGFwc2UiIHRpdGxlPSJDb2xsYXBzZSBhbGwiIGhyZWY9ImphdmFzY3JpcHQ6Y29sbGFwc2VBbGwoJyR7aWR9JykiPjwvYT4KICAgICAgICA8YSBjbGFzcz0ibGluayIgdGl0bGU9IkxpbmsgdG8gdGhpcyB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fSIgaHJlZj0iIyR7aWR9IiBvbmNsaWNrPSJtYWtlRWxlbWVudFZpc2libGUoJyR7aWR9JykiPjwvYT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLXRvZ2dsZSIgdGl0bGU9IlRvZ2dsZSB2aXNpYmlsaXR5Ij48L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iY2hpbGRyZW4iPgogICAgICA8dGFibGUgY2xhc3M9Im1ldGFkYXRhIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+RnVsbCBOYW1lOjwvdGg+CiAgICAgICAgICA8dGQ+e3todG1sIGZ1bGxOYW1lfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3tpZiBkb2MoKX19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPkRvY3VtZW50YXRpb246PC90aD4KICAgICAgICAgIDx0ZCBjbGFzcz0iZG9jIj57e2h0bWwgZG9jKCl9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgICAge3tpZiB0YWdzLmxlbmd0aH19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlRhZ3M6PC90aD4KICAgICAgICAgIDx0ZD57e2h0bWwgdGFncy5qb2luKCcsICcpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIHt7aWYgdGltZW91dH19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlRpbWVvdXQ6PC90aD4KICAgICAgICAgIDx0ZD57e2h0bWwgdGltZW91dH19PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7L2lmfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+U3RhcnQgLyBFbmQgLyBFbGFwc2VkOjwvdGg+CiAgICAgICAgICA8dGQ+JHt0aW1lcy5zdGFydFRpbWV9IC8gJHt0aW1lcy5lbmRUaW1lfSAvICR7dGltZXMuZWxhcHNlZFRpbWV9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5TdGF0dXM6PC90aD4KICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz0ibGFiZWwgJHtzdGF0dXMudG9Mb3dlckNhc2UoKX0iPiR7c3RhdHVzfTwvc3Bhbj48L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3tpZiBtZXNzYWdlKCl9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5NZXNzYWdlOjwvdGg+CiAgICAgICAgICA8dGQgY2xhc3M9Im1lc3NhZ2UiPnt7aHRtbCBtZXNzYWdlKCl9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgIDwvdGFibGU+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9ImtleXdvcmRUZW1wbGF0ZSI+CiAgPGRpdiBpZD0iJHtpZH0iIGNsYXNzPSJrZXl3b3JkIj4KICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyIGNsb3NlZCIgb25jbGljaz0idG9nZ2xlS2V5d29yZCgnJHtpZH0nKSI+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLWxlZnQiIHRpdGxlPSIke3R5cGV9ICB7e2lmIG5hbWV9fXt7aHRtbCBmdWxsTmFtZX19ICB7ey9pZn19WyR7c3RhdHVzfV0iPgogICAgICAgIDxzcGFuIGNsYXNzPSJlbGFwc2VkIiB0aXRsZT0iRWxhcHNlZCB0aW1lIj4ke3RpbWVzLmVsYXBzZWRUaW1lfTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0ibGFiZWwga2V5d29yZCAke3N0YXR1cy50b0xvd2VyQ2FzZSgpfSI+JHt0eXBlfTwvc3Bhbj4KICAgICAgICA8c3Bhbj57e2h0bWwgYXNzaWdufX08L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9Im5hbWUiPjxzcGFuIGNsYXNzPSJwYXJlbnQtbmFtZSI+e3todG1sIGxpYm5hbWV9fXt7aWYgbGlibmFtZX19IC4ge3svaWZ9fTwvc3Bhbj57e2h0bWwgbmFtZX19PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJhcmciPnt7aHRtbCBhcmd1bWVudHN9fTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLXJpZ2h0IiBvbmNsaWNrPSJzdG9wUHJvcGFnYXRpb24oZXZlbnQpIj4KICAgICAgICA8YSBjbGFzcz0iZXhwYW5kIiB0aXRsZT0iRXhwYW5kIGFsbCIgaHJlZj0iamF2YXNjcmlwdDpleHBhbmRBbGwoJyR7aWR9JykiPjwvYT4KICAgICAgICA8YSBjbGFzcz0iY29sbGFwc2UiIHRpdGxlPSJDb2xsYXBzZSBhbGwiIGhyZWY9ImphdmFzY3JpcHQ6Y29sbGFwc2VBbGwoJyR7aWR9JykiPjwvYT4KICAgICAgICA8YSBjbGFzcz0ibGluayIgdGl0bGU9IkxpbmsgdG8gdGhpcyBrZXl3b3JkIiBocmVmPSIjJHtpZH0iIG9uY2xpY2s9Im1ha2VFbGVtZW50VmlzaWJsZSgnJHtpZH0nKSI+PC9hPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXItdG9nZ2xlIiB0aXRsZT0iVG9nZ2xlIHZpc2liaWxpdHkiPjwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJjaGlsZHJlbiI+CiAgICAgIDx0YWJsZSBjbGFzcz0ibWV0YWRhdGEga2V5d29yZC1tZXRhZGF0YSI+CiAgICAgICAge3tpZiBkb2MoKX19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPkRvY3VtZW50YXRpb246PC90aD4KICAgICAgICAgIDx0ZCBjbGFzcz0iZG9jIj57e2h0bWwgZG9jKCl9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgICAge3tpZiB0YWdzfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+VGFnczo8L3RoPgogICAgICAgICAgPHRkPnt7aHRtbCB0YWdzfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIHt7aWYgdGltZW91dH19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlRpbWVvdXQ6PC90aD4KICAgICAgICAgIDx0ZD57e2h0bWwgdGltZW91dH19PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7L2lmfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+U3RhcnQgLyBFbmQgLyBFbGFwc2VkOjwvdGg+CiAgICAgICAgICA8dGQ+JHt0aW1lcy5zdGFydFRpbWV9IC8gJHt0aW1lcy5lbmRUaW1lfSAvICR7dGltZXMuZWxhcHNlZFRpbWV9PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJtZXNzYWdlVGVtcGxhdGUiPgogIDx0YWJsZSBpZD0iJHtpZH0iIGNsYXNzPSJtZXNzYWdlcyAke2xldmVsLnRvTG93ZXJDYXNlKCl9LW1lc3NhZ2UiPgogICAgPHRyIGNsYXNzPSJtZXNzYWdlLXJvdyI+CiAgICAgIDx0ZCBjbGFzcz0idGltZSI+JHt0aW1lfTwvdGQ+CiAgICAgIDx0ZCBjbGFzcz0iJHtsZXZlbC50b0xvd2VyQ2FzZSgpfSBsZXZlbCI+PHNwYW4gY2xhc3M9ImxhYmVsICR7bGV2ZWwudG9Mb3dlckNhc2UoKX0iPiR7bGV2ZWx9PC9zcGFuPjwvdGQ+CiAgICAgIDx0ZCBjbGFzcz0ibWVzc2FnZSI+e3todG1sIHRleHR9fTwvdGQ+CiAgICAgIDx0ZCBjbGFzcz0ic2VsZWN0LW1lc3NhZ2UiIG9uY2xpY2s9ImphdmFzY3JpcHQ6c2VsZWN0TWVzc2FnZSgnJHtpZH0nKSIgdGl0bGU9IlNlbGVjdCBtZXNzYWdlIHRleHQiPgogICAgICAgIDxkaXY+PC9kaXY+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJsb2dMZXZlbFNlbGVjdG9yVGVtcGxhdGUiPgogIDxkaXYgaWQ9ImxvZy1sZXZlbC1zZWxlY3RvciI+CiAgTG9nIGxldmVsOgogICAgPHNlbGVjdCBvbmNoYW5nZT0ibG9nTGV2ZWxTZWxlY3RlZCh0aGlzLm9wdGlvbnNbc2VsZWN0ZWRJbmRleF0udmFsdWUpIj4KICAgICAgPG9wdGlvbiB2YWx1ZT0iMiI+SU5GTzwvb3B0aW9uPgogICAgICA8b3B0aW9uIHZhbHVlPSIxIj5ERUJVRzwvb3B0aW9uPgogICAgICB7e2lmIHNob3dUcmFjZSgpfX08b3B0aW9uIHZhbHVlPSIwIj5UUkFDRTwvb3B0aW9uPnt7L2lmfX0KICAgIDwvc2VsZWN0PgogIDwvZGl2Pgo8L3NjcmlwdD4KCjwvYm9keT4KPC9odG1sPgo=';w.document.open();w.document.write(window.atob(d));w.document.close();var a=w.document.createElement('a');a.appendChild(w.document.createTextNode('Download'));a.href='data:text/html;base64,' + d;a.download='log.html';a.style='position:fixed;top:0;right:0;color:white;background:black;text-decoration:none;font-weight:bold;padding:7px 14px;border-radius:0 0 0 5px;';w.document.body.append(a);})(this);\">Log</a> | <a href=\"about:\" onClick=\"javascript:(function(el){var w=window.open();var d='PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KPG1ldGEgaHR0cC1lcXVpdj0iUHJhZ21hIiBjb250ZW50PSJuby1jYWNoZSI+CjxtZXRhIGh0dHAtZXF1aXY9IkV4cGlyZXMiIGNvbnRlbnQ9Ii0xIj4KPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIj4KPG1ldGEgY29udGVudD0iUm9ib3QgRnJhbWV3b3JrIDQuMC4zIChQeXRob24gMy45LjYgb24gbGludXgpIiBuYW1lPSJHZW5lcmF0b3IiPgo8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBRUFJQUJvQkFBQUZnQUFBQ2dBQUFBUUFBQUFJQUFBQUFFQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLY0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQXFBQUFBQUFBQUFBQUFBQUFBQUFBQUxJQUFBRC9BQUFBNEFBQUFOd0FBQURjQUFBQTNBQUFBTndBQUFEY0FBQUEzQUFBQU53QUFBRGNBQUFBNEFBQUFQOEFBQUN4QUFBQUFBQUFBS1lBQUFEL0FBQUF1d0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQy9BQUFBL3dBQUFLa0FBQUQ2QUFBQXpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU44QUFBRC9BQUFBK2dBQUFNTUFBQUFBQUFBQUFnQUFBR3NBQUFCckFBQUFhd0FBQUdzQUFBQnJBQUFBYXdBQUFHc0FBQUJyQUFBQURBQUFBQUFBQUFEYUFBQUEvd0FBQVBvQUFBRERBQUFBQUFBQUFJc0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFORUFBQUFBQUFBQTJnQUFBUDhBQUFENkFBQUF3d0FBQUFBQUFBQUFBQUFBTWdBQUFESUFBQUF5QUFBQU1nQUFBRElBQUFBeUFBQUFNZ0FBQURJQUFBQUZBQUFBQUFBQUFOb0FBQUQvQUFBQStnQUFBTU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGFBQUFBL3dBQUFQb0FBQUREQUFBQUFBQUFBRHdBQUFCOEFBQUFBQUFBQUdBQUFBQmNBQUFBQUFBQUFIOEFBQUJLQUFBQUFBQUFBQUFBQUFBQUFBQUEyZ0FBQVA4QUFBRDZBQUFBd3dBQUFBQUFBQURDQUFBQS93QUFBQ2tBQUFEcUFBQUE0UUFBQUFBQUFBRDdBQUFBL3dBQUFMQUFBQUFHQUFBQUFBQUFBTm9BQUFEL0FBQUErZ0FBQU1NQUFBQUFBQUFBSXdBQUFQNEFBQUQvQUFBQS93QUFBR0FBQUFBQUFBQUFBQUFBQU1rQUFBRC9BQUFBaWdBQUFBQUFBQURhQUFBQS93QUFBUG9BQUFEREFBQUFBQUFBQUFBQUFBQUlBQUFBY0FBQUFCa0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFZ0FBQUFBQUFBQUFBQUFBMmdBQUFQOEFBQUQ3QUFBQXl3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU40QUFBRC9BQUFBcXdBQUFQOEFBQUN2QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTElBQUFEL0FBQUFzZ0FBQUFBQUFBQzVBQUFBL3dBQUFNb0FBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQUFBREFBQUFBd0FBQUFNa0FBQUQvQUFBQXZBQUFBQUFBQUFBQUFBQUFBQUFBQUt3QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBclFBQUFBQUFBQUFBd0FNQUFJQUJBQUFmK0FBQVAvd0FBRC84QUFBZ0JBQUFQL3dBQUQvOEFBQS8vQUFBSkl3QUFESEVBQUEvL0FBQVAvd0FBQi80QUFDQUFRQUF3QU1BQUE9PSI+CjxzdHlsZSBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyI+Ci8qIEdlbmVyaWMgYW5kIG1pc2Mgc3R5bGVzICovCmJvZHkgewogICAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICBjb2xvcjogYmxhY2s7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQp0YWJsZSB7CiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBmb250LXNpemU6IDFlbTsKfQp0aCwgdGQgewogICAgdmVydGljYWwtYWxpZ246IHRvcDsKfQpiciB7CiAgICBtc28tZGF0YS1wbGFjZW1lbnQ6IHNhbWUtY2VsbDsgLyogbWFpbnRhaW4gbGluZSBicmVha3MgaW4gRXhjZWwgKi8KfQpociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KYSwgYTpsaW5rLCBhOnZpc2l0ZWQgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgY29sb3I6ICMxNWM7Cn0KYSA+IGltZyB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjMTVjICFpbXBvcnRhbnQ7Cn0KYTpob3ZlciwgYTphY3RpdmUgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICBjb2xvcjogIzYxYzsKfQoucGFyZW50LW5hbWUgewogICAgZm9udC1zaXplOiAwLjdlbTsKICAgIGxldHRlci1zcGFjaW5nOiAtMC4wN2VtOwp9Ci5tZXNzYWdlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKfQovKiBIZWFkZXJzICovCiNoZWFkZXIgewogICAgd2lkdGg6IDY1ZW07CiAgICBoZWlnaHQ6IDNlbTsKICAgIG1hcmdpbjogNnB4IDA7Cn0KaDEgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBtYXJnaW46IDAgMCAwLjVlbSAwOwogICAgd2lkdGg6IDc1JTsKfQpoMiB7CiAgICBjbGVhcjogbGVmdDsKfQojZ2VuZXJhdGVkIHsKICAgIGZsb2F0OiByaWdodDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLyogRG9jdW1lbnRhdGlvbiBoZWFkZXJzICovCi5kb2MgPiBoMiB7CiAgICBmb250LXNpemU6IDEuMmVtOwp9Ci5kb2MgPiBoMyB7CiAgICBmb250LXNpemU6IDEuMWVtOwp9Ci5kb2MgPiBoNCB7CiAgICBmb250LXNpemU6IDEuMGVtOwp9Ci8qIFN0YXR1cyB0ZXh0IGNvbG9ycyAtLSAhaW1wb3J0YW50IGFsbG93cyB1c2luZyB0aGVtIGluIGxpbmtzICovCi5mYWlsIHsKICAgIGNvbG9yOiAjY2UzZTAxICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoucGFzcyB7CiAgICBjb2xvcjogIzA5OGEwOSAhaW1wb3J0YW50Owp9Ci5za2lwIHsKICAgIGNvbG9yOiAjOTI3MjAxICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoubGFiZWwgewogICAgcGFkZGluZzogMnB4IDVweDsKICAgIGZvbnQtc2l6ZTogMC43NWVtOwogICAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogYmxhY2s7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9Ci5sYWJlbC5kZWJ1ZywgLmxhYmVsLnRyYWNlLCAubGFiZWwuZXJyb3IsIC5sYWJlbC5rZXl3b3JkIHsKICAgIGxldHRlci1zcGFjaW5nOiAwOwp9Ci5sYWJlbC5wYXNzLCAubGFiZWwuZmFpbCwgLmxhYmVsLmVycm9yLCAubGFiZWwuc2tpcCwgLmxhYmVsLndhcm4gewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLmxhYmVsLnBhc3MgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzk3YmQ2MTsKICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7Cn0KLmxhYmVsLmZhaWwsIC5sYWJlbC5lcnJvciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2UzZTAxOwogICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKfQoubGFiZWwuc2tpcCwgLmxhYmVsLndhcm4gewogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZDg0ZjsKICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7Cn0KLyogVG9wIHJpZ2h0IGhlYWRlciAqLwojdG9wLXJpZ2h0LWhlYWRlciB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDA7CiAgICByaWdodDogMDsKICAgIHotaW5kZXg6IDEwMDA7CiAgICB3aWR0aDogMTJlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQojcmVwb3J0LW9yLWxvZy1saW5rIGEgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiBibGFjazsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMWVtOwogICAgcGFkZGluZzogMC4zZW0gMDsKICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKfQojcmVwb3J0LW9yLWxvZy1saW5rIGE6aG92ZXIgewogICAgY29sb3I6ICNkZGQ7Cn0KI2xvZy1sZXZlbC1zZWxlY3RvciB7CiAgICBwYWRkaW5nOiAwLjNlbSAwOwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6ICNkZGQ7Cn0KLyogU3RhdGlzdGljcyB0YWJsZSAqLwouc3RhdGlzdGljcyB7CiAgICB3aWR0aDogNjVlbTsKICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICBlbXB0eS1jZWxsczogc2hvdzsKICAgIG1hcmdpbi1ib3R0b206IDFlbTsKfQouc3RhdGlzdGljcyB0cjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiAjZjRmNGY0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci5zdGF0aXN0aWNzIHRoLCAuc3RhdGlzdGljcyB0ZCB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgcGFkZGluZzogMC4xZW0gMC4zZW07Cn0KLnN0YXRpc3RpY3MgdGggewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKICAgIHBhZGRpbmc6IDAuMmVtIDAuM2VtOwp9Ci5zdGF0aXN0aWNzIHRkIHsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KLnN0YXRzLWNvbC1zdGF0IHsKICAgIHdpZHRoOiA0LjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc3RhdHMtY29sLWVsYXBzZWQgewogICAgd2lkdGg6IDUuNWVtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5zdGF0cy1jb2wtZ3JhcGggewogICAgd2lkdGg6IDllbTsKfQp0aC5zdGF0cy1jb2wtZ3JhcGg6aG92ZXIgewogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5zdGF0LW5hbWUgewogICAgZmxvYXQ6IGxlZnQ7Cn0KLnN0YXQtbmFtZSBhLCAuc3RhdC1uYW1lIHNwYW4gewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLnRhZy1saW5rcyB7CiAgICBmb250LXNpemU6IDAuOWVtOwogICAgZmxvYXQ6IHJpZ2h0OwogICAgbWFyZ2luLXRvcDogMC4wNWVtOwp9Ci50YWctbGlua3Mgc3BhbiB7CiAgICBtYXJnaW4tbGVmdDogMC4yZW07Cn0KLyogU3RhdGlzdGljcyBncmFwaCAqLwouZ3JhcGgsIC5lbXB0eS1ncmFwaCB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgd2lkdGg6IGF1dG87CiAgICBoZWlnaHQ6IDdweDsKICAgIHBhZGRpbmc6IDA7CiAgICBiYWNrZ3JvdW5kOiAjYWFhOwp9Ci5lbXB0eS1ncmFwaCB7CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9Ci5wYXNzLWJhciwgLmZhaWwtYmFyLCAuc2tpcC1iYXIgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBoZWlnaHQ6IDEwMCU7Cn0KLmZhaWwtYmFyIHsKICAgIGJhY2tncm91bmQ6ICNjZTNlMDE7Cn0KLnBhc3MtYmFyIHsKICAgIGJhY2tncm91bmQ6ICM5N2JkNjE7Cn0KLnNraXAtYmFyIHsKICAgIGJhY2tncm91bmQ6ICNmZWQ4NGY7Cn0KLyogVGFibGVzb3J0ZXIgLSBhZGFwdGVkIGZyb20gcHJvdmlkZWQgQmx1ZSBTa2luICovCi50YWJsZXNvcnRlci1oZWFkZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBSUFBQUg5L2Z3QUFBQ0g1QkFFQUFBRUFMQUFBQUFBTEFBa0FBQUlSakFPbkJyM2NuSXIwV1VqVHJDOWU5QlFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIHJpZ2h0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci50YWJsZXNvcnRlci1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKfQoudGFibGVzb3J0ZXItaGVhZGVyQXNjIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhDd0FKQUtFQUFBQUFBSDkvZndBQUFBQUFBQ0g1QkFFQUFBSUFMQUFBQUFBTEFBa0FBQUlVbEJXbkZyM2NuSXIwV1FPeUJtdnpwMTNDcHhRQU93PT0pOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYyAhaW1wb3J0YW50Owp9Ci50YWJsZXNvcnRlci1oZWFkZXJEZXNjIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhDd0FKQUtFQUFBQUFBSDkvZndBQUFBQUFBQ0g1QkFFQUFBSUFMQUFBQUFBTEFBa0FBQUlVbEFXbkJyM2NuSXIwV1JPeURtdnpwMTNDcHhRQU93PT0pOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYyAhaW1wb3J0YW50Owp9Ci5zb3J0ZXItZmFsc2UgewogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQouc29ydGVyLWZhbHNlOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIj4KLyogR2VuZXJpYyB0YWJsZSBzdHlsZXMgKi8KdGFibGUgewogICAgbWFyZ2luOiAwIDFweDsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwp9CnRyIHsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwp9CnRoIHsKICAgIGJhY2tncm91bmQ6ICNkZGQ7CiAgICBjb2xvcjogYmxhY2s7Cn0KLyogU3VtbWFyeSBhbmQgdG90YWwvdGFnL3N1aXRlIGRldGFpbHMgKi8KLmRldGFpbHMgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1zcGFjaW5nOiAwLjJlbTsKICAgIGNsZWFyOiBib3RoOwogICAgd2lkdGg6IDY1ZW07CiAgICBtYXJnaW4tYm90dG9tOiAxZW07Cn0KLmRldGFpbHMgdGggewogICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICB3aWR0aDogMTFlbTsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9Ci5kZXRhaWxzIHRkIHsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cn0KLnNlbGVjdG9yIHRoLCAuc2VsZWN0b3IgdGQgewogICAgcGFkZGluZy10b3A6IDAuNWVtOwogICAgcGFkZGluZy1ib3R0b206IDAuNWVtOwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQouZmlyc3Qtc2VsZWN0b3IgdGgsIC5maXJzdC1zZWxlY3RvciB0ZHsKICAgIHBhZGRpbmctYm90dG9tOiAwLjJlbTsKfQoubWlkZGxlLXNlbGVjdG9yIHRoLCAubWlkZGxlLXNlbGVjdG9yIHRkIHsKICAgIHBhZGRpbmctdG9wOiAwLjJlbTsKICAgIHBhZGRpbmctYm90dG9tOiAwLjJlbTsKfQoubGFzdC1zZWxlY3RvciB0aCwgLmxhc3Qtc2VsZWN0b3IgdGR7CiAgICBwYWRkaW5nLXRvcDogMC4yZW07Cn0KI3ByaW50LXNlbGVjdG9yIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLyogU2VhcmNoICovCiNzZWFyY2gtc3VpdGUsICNzZWFyY2gtdGVzdCwgI3NlYXJjaC1pbmNsdWRlLCAjc2VhcmNoLWV4Y2x1ZGUgewogICAgd2lkdGg6IDI1ZW07Cn0KI3NlYXJjaCBhOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQojc2VhcmNoLWhlbHAgZGl2IHsKICAgIG1hcmdpbjogMC41ZW0gMC41ZW0gMC43ZW0gMDsKICAgIHBhZGRpbmc6IDAuN2VtOwogICAgYmFja2dyb3VuZDogI2VlZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KI3NlYXJjaC1oZWxwIGgzLCAjc2VhcmNoLWhlbHAgcCB7CiAgICBtYXJnaW46IDAgMCAwLjdlbSAwOwp9Ci5zZWFyY2gtaGVscC1leGFtcGxlcyB7CiAgICB0YWJsZS1sYXlvdXQ6IGF1dG87CiAgICB3aWR0aDogMTAwJTsKfQouc2VhcmNoLWhlbHAtZXhhbXBsZXMsIC5zZWFyY2gtaGVscC1leGFtcGxlcyB0ciwKLnNlYXJjaC1oZWxwLWV4YW1wbGVzIHRoLCAuc2VhcmNoLWhlbHAtZXhhbXBsZXMgdGQgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBtYXJnaW46IDA7Cn0KLnNlYXJjaC1oZWxwLWV4YW1wbGVzIHRoLCAuc2VhcmNoLWhlbHAtZXhhbXBsZXMgdGQgewogICAgcGFkZGluZzogMC4yZW0gMC43ZW0gMC4yZW0gMDsKfQouaGVscC1pdGVtIHsKICAgIHdpZHRoOiAxMCU7Cn0KLmhlbHAtZXhwbGFuYXRpb24gewogICAgd2lkdGg6IDY1JTsKfQouaGVscC1leGFtcGxlcyB7CiAgICB3aWR0aDogMjUlOwp9Ci8qIFRhYnMgLSBhZGFwdGVkIGZyb20gaHR0cDovL3d3dy5odG1sZG9nLmNvbS9hcnRpY2xlcy90YWJzICovCiNkZXRhaWwtdGFicyB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbjogMCAxZW07Cn0KLmRldGFpbC10YWIgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBiYWNrZ3JvdW5kOiAjZGRkOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDA7CiAgICBtYXJnaW46IDAgMC41ZW0gMCAwOwogICAgcGFkZGluZy10b3A6IDAuMWVtOwogICAgYm9yZGVyLXJhZGl1czogM3B4IDNweCAwIDA7Cn0KLmRldGFpbC10YWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2NjYzsKfQouZGV0YWlsLXRhYiBhIHsKICAgIGNvbG9yOiBibGFjazsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgcGFkZGluZzogMCAxZW07Cn0KLmRldGFpbC10YWItc2VsZWN0ZWQgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdG9wOiAxcHg7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQouZGV0YWlsLXRhYi1zZWxlY3RlZDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQovKiBUZXN0IGRldGFpbHMgdGFibGUgKi8KI3Rlc3QtZGV0YWlscyB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlci1zcGFjaW5nOiAxcHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9CiN0ZXN0LWRldGFpbHMgPiB0Ym9keSA+IHRyOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6ICNmNGY0ZjQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KI3Rlc3QtZGV0YWlscyB0aCwgI3Rlc3QtZGV0YWlscyB0ZCB7CiAgICBwYWRkaW5nOiAwLjJlbTsKfQouZGV0YWlscy1saW1pdGVkIHsKICAgIG1heC1oZWlnaHQ6IDIwZW07CiAgICBvdmVyZmxvdzogYXV0bzsKfQouZGV0YWlscy1jb2wtaGVhZGVyIHsKICAgIHBhZGRpbmctcmlnaHQ6IDFlbTsKfQouZGV0YWlscy1jb2wtdG9nZ2xlIHsKICAgIGZsb2F0OiBsZWZ0OwogICAgY29sb3I6ICM2YzZjNmM7IC8qIHNhbWUgYXMgaW4gc29ydCBpY29uICovCiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLmRldGFpbHMtY29sLXRvZ2dsZTpob3ZlciB7CiAgICBjb2xvcjogYmxhY2s7Cn0KLmRldGFpbHMtY29sLW5hbWUgewogICAgbWluLXdpZHRoOiAyMGVtOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLmRldGFpbHMtY29sLWRvYyB7CiAgICBtaW4td2lkdGg6IDEwZW07Cn0KLmRldGFpbHMtY29sLXRhZ3MgewogICAgbWluLXdpZHRoOiAxMGVtOwp9Ci5kZXRhaWxzLWNvbC1jcml0IHsKICAgIHdpZHRoOiAzLjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouZGV0YWlscy1jb2wtc3RhdHVzIHsKICAgIHdpZHRoOiA0LjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouZGV0YWlscy1jb2wtbXNnIHsKICAgIG1pbi13aWR0aDogMjBlbTsKfQouZGV0YWlscy1jb2wtZWxhcHNlZCB7CiAgICB3aWR0aDogN2VtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5kZXRhaWxzLWNvbC10aW1lcyB7CiAgICB3aWR0aDogMTFlbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLmhpZGRlbiAuZGV0YWlscy1jb2wtaGVhZGVyLCB0ZC5oaWRkZW4gPiBkaXYgewogICAgZGlzcGxheTogbm9uZTsKfQouaGlkZGVuIHsKICAgIHdpZHRoOiAxM3B4OwogICAgbWluLXdpZHRoOiAwOwogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKfQp0aC5oaWRkZW46aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9InByaW50IiB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHkgewogICAgYmFja2dyb3VuZDogd2hpdGUgIWltcG9ydGFudDsKICAgIHBhZGRpbmc6IDA7CiAgICBmb250LXNpemU6IDhwdDsKfQphOmxpbmssIGE6dmlzaXRlZCB7CiAgICBjb2xvcjogYmxhY2s7Cn0KI2hlYWRlciB7CiAgICB3aWR0aDogYXV0bzsKfQouZGV0YWlscywgLnN0YXRpc3RpY3MgewogICAgd2lkdGg6IDEwMCU7Cn0KI2dlbmVyYXRlZC1hZ28sICN0b3AtcmlnaHQtaGVhZGVyLCAjbm9ybWFsLXNlbGVjdG9yLCAjc2VhcmNoLWJ1dHRvbnMsCi5mb2xkaW5nLWJ1dHRvbiwgLmV4cGFuZCwgLmhpZGRlbiwgLmRldGFpbHMtY29sLXRvZ2dsZSB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5lbGVtZW50LWhlYWRlci10ZXh0LCAuY2hpbGRyZW4gewogICAgbWFyZ2luOiAwOwp9CiN0ZXN0LWRldGFpbHMgewogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwp9CiN0ZXN0LWRldGFpbHMgdGgsICN0ZXN0LWRldGFpbHMgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQouZGV0YWlscy1jb2wtaGVhZGVyIHsKICAgIHBhZGRpbmc6IDA7Cn0KI3ByaW50LXNlbGVjdG9yIHsKICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7Cn0KLnRhYmxlc29ydGVyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwogICAgYmFja2dyb3VuZDogI2RkZCAhaW1wb3J0YW50Owp9Cjwvc3R5bGU+CjxzdHlsZSBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyI+CiNqYXZhc2NyaXB0LWRpc2FibGVkIHsKICAgIHdpZHRoOiA2MDBweDsKICAgIG1hcmdpbjogMTAwcHggYXV0byAwIGF1dG87CiAgICBwYWRkaW5nOiAyMHB4OwogICAgY29sb3I6IGJsYWNrOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJhY2tncm91bmQ6ICNlZWU7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgaDEgewogICAgd2lkdGg6IDEwMCU7CiAgICBmbG9hdDogbm9uZTsKfQojamF2YXNjcmlwdC1kaXNhYmxlZCB1bCB7CiAgICBmb250LXNpemU6IDEuMmVtOwp9CiNqYXZhc2NyaXB0LWRpc2FibGVkIGxpIHsKICAgIG1hcmdpbjogMC41ZW0gMDsKfQojamF2YXNjcmlwdC1kaXNhYmxlZCBiIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgouZG9jID4gKiB7CiAgICBtYXJnaW46IDAuN2VtIDFlbSAwLjFlbSAxZW07CiAgICBwYWRkaW5nOiAwOwp9Ci5kb2MgPiBwLCAuZG9jID4gaDEsIC5kb2MgPiBoMiwgLmRvYyA+IGgzLCAuZG9jID4gaDQgewogICAgbWFyZ2luOiAwLjdlbSAwIDAuMWVtIDA7Cn0KLmRvYyA+ICo6Zmlyc3QtY2hpbGQgewogICAgbWFyZ2luLXRvcDogMC4xZW07Cn0KLmRvYyB0YWJsZSB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBmb250LXNpemU6IDAuOWVtOwp9Ci5kb2MgdGFibGUgdGgsIC5kb2MgdGFibGUgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgcGFkZGluZzogMC4xZW0gMC4zZW07CiAgICBoZWlnaHQ6IDEuMmVtOwp9Ci5kb2MgdGFibGUgdGggewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMWVtOwp9Ci5kb2MgcHJlIHsKICAgIGZvbnQtc2l6ZTogMS4xZW07CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogICAgYmFja2dyb3VuZDogI2Y0ZjRmNDsKfQouZG9jIGNvZGUgewogICAgcGFkZGluZzogMCAwLjJlbTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9Ci5kb2MgbGkgewogICAgbGlzdC1zdHlsZS1wb3NpdGlvbjogaW5zaWRlOwogICAgbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Cn0KLmRvYyBpbWcgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQouZG9jIGhyIHsKICAgIGJhY2tncm91bmQ6ICNjY2M7CiAgICBoZWlnaHQ6IDFweDsKICAgIGJvcmRlcjogMDsKfQo8L3N0eWxlPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qISBqUXVlcnkgdjMuNS4xIHwgKGMpIEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwohZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9ZS5kb2N1bWVudD90KGUsITApOmZ1bmN0aW9uKGUpe2lmKCFlLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiB0KGUpfTp0KGUpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihDLGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1bXSxyPU9iamVjdC5nZXRQcm90b3R5cGVPZixzPXQuc2xpY2UsZz10LmZsYXQ/ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZmxhdC5jYWxsKGUpfTpmdW5jdGlvbihlKXtyZXR1cm4gdC5jb25jYXQuYXBwbHkoW10sZSl9LHU9dC5wdXNoLGk9dC5pbmRleE9mLG49e30sbz1uLnRvU3RyaW5nLHY9bi5oYXNPd25Qcm9wZXJ0eSxhPXYudG9TdHJpbmcsbD1hLmNhbGwoT2JqZWN0KSx5PXt9LG09ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJiJudW1iZXIiIT10eXBlb2YgZS5ub2RlVHlwZX0seD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmZT09PWUud2luZG93fSxFPUMuZG9jdW1lbnQsYz17dHlwZTohMCxzcmM6ITAsbm9uY2U6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIGIoZSx0LG4pe3ZhciByLGksbz0obj1ufHxFKS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtpZihvLnRleHQ9ZSx0KWZvcihyIGluIGMpKGk9dFtyXXx8dC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKHIpKSYmby5zZXRBdHRyaWJ1dGUocixpKTtuLmhlYWQuYXBwZW5kQ2hpbGQobykucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKX1mdW5jdGlvbiB3KGUpe3JldHVybiBudWxsPT1lP2UrIiI6Im9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9uW28uY2FsbChlKV18fCJvYmplY3QiOnR5cGVvZiBlfXZhciBmPSIzLjUuMSIsUz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgUy5mbi5pbml0KGUsdCl9O2Z1bmN0aW9uIHAoZSl7dmFyIHQ9ISFlJiYibGVuZ3RoImluIGUmJmUubGVuZ3RoLG49dyhlKTtyZXR1cm4hbShlKSYmIXgoZSkmJigiYXJyYXkiPT09bnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmMDx0JiZ0LTEgaW4gZSl9Uy5mbj1TLnByb3RvdHlwZT17anF1ZXJ5OmYsY29uc3RydWN0b3I6UyxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHMuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3MuY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9Uy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHR9LGVhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIFMuZWFjaCh0aGlzLGUpfSxtYXA6ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMubWFwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4gbi5jYWxsKGUsdCxlKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2socy5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxldmVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMuZ3JlcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQrMSklMn0pKX0sb2RkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMuZ3JlcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQlMn0pKX0sZXE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZW5ndGgsbj0rZSsoZTwwP3Q6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKDA8PW4mJm48dD9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6dSxzb3J0OnQuc29ydCxzcGxpY2U6dC5zcGxpY2V9LFMuZXh0ZW5kPVMuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvLGE9YXJndW1lbnRzWzBdfHx7fSxzPTEsdT1hcmd1bWVudHMubGVuZ3RoLGw9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGEmJihsPWEsYT1hcmd1bWVudHNbc118fHt9LHMrKyksIm9iamVjdCI9PXR5cGVvZiBhfHxtKGEpfHwoYT17fSkscz09PXUmJihhPXRoaXMscy0tKTtzPHU7cysrKWlmKG51bGwhPShlPWFyZ3VtZW50c1tzXSkpZm9yKHQgaW4gZSlyPWVbdF0sIl9fcHJvdG9fXyIhPT10JiZhIT09ciYmKGwmJnImJihTLmlzUGxhaW5PYmplY3Qocil8fChpPUFycmF5LmlzQXJyYXkocikpKT8obj1hW3RdLG89aSYmIUFycmF5LmlzQXJyYXkobik/W106aXx8Uy5pc1BsYWluT2JqZWN0KG4pP246e30saT0hMSxhW3RdPVMuZXh0ZW5kKGwsbyxyKSk6dm9pZCAwIT09ciYmKGFbdF09cikpO3JldHVybiBhfSxTLmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisoZitNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcihlKX0sbm9vcDpmdW5jdGlvbigpe30saXNQbGFpbk9iamVjdDpmdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiEoIWV8fCJbb2JqZWN0IE9iamVjdF0iIT09by5jYWxsKGUpKSYmKCEodD1yKGUpKXx8ImZ1bmN0aW9uIj09dHlwZW9mKG49di5jYWxsKHQsImNvbnN0cnVjdG9yIikmJnQuY29uc3RydWN0b3IpJiZhLmNhbGwobik9PT1sKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBlKXJldHVybiExO3JldHVybiEwfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGUsdCxuKXtiKGUse25vbmNlOnQmJnQubm9uY2V9LG4pfSxlYWNoOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2lmKHAoZSkpe2ZvcihuPWUubGVuZ3RoO3I8bjtyKyspaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrfWVsc2UgZm9yKHIgaW4gZSlpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWs7cmV0dXJuIGV9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYocChPYmplY3QoZSkpP1MubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOnUuY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09dD8tMTppLmNhbGwodCxlLG4pfSxtZXJnZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0rdC5sZW5ndGgscj0wLGk9ZS5sZW5ndGg7cjxuO3IrKyllW2krK109dFtyXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9W10saT0wLG89ZS5sZW5ndGgsYT0hbjtpPG87aSsrKSF0KGVbaV0saSkhPT1hJiZyLnB1c2goZVtpXSk7cmV0dXJuIHJ9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPTAsYT1bXTtpZihwKGUpKWZvcihyPWUubGVuZ3RoO288cjtvKyspbnVsbCE9KGk9dChlW29dLG8sbikpJiZhLnB1c2goaSk7ZWxzZSBmb3IobyBpbiBlKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmYS5wdXNoKGkpO3JldHVybiBnKGEpfSxndWlkOjEsc3VwcG9ydDp5fSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKFMuZm5bU3ltYm9sLml0ZXJhdG9yXT10W1N5bWJvbC5pdGVyYXRvcl0pLFMuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtuWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pO3ZhciBkPWZ1bmN0aW9uKG4pe3ZhciBlLGQsYixvLGksaCxmLGcsdyx1LGwsVCxDLGEsRSx2LHMsYyx5LFM9InNpenpsZSIrMSpuZXcgRGF0ZSxwPW4uZG9jdW1lbnQsaz0wLHI9MCxtPXVlKCkseD11ZSgpLEE9dWUoKSxOPXVlKCksRD1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dCYmKGw9ITApLDB9LGo9e30uaGFzT3duUHJvcGVydHksdD1bXSxxPXQucG9wLEw9dC5wdXNoLEg9dC5wdXNoLE89dC5zbGljZSxQPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKWlmKGVbbl09PT10KXJldHVybiBuO3JldHVybi0xfSxSPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTT0iW1xceDIwXFx0XFxyXFxuXFxmXSIsST0iKD86XFxcXFtcXGRhLWZBLUZdezEsNn0iK00rIj98XFxcXFteXFxyXFxuXFxmXXxbXFx3LV18W15cMC1cXHg3Zl0pKyIsVz0iXFxbIitNKyIqKCIrSSsiKSg/OiIrTSsiKihbKl4kfCF+XT89KSIrTSsiKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwifCgiK0krIikpfCkiK00rIipcXF0iLEY9IjooIitJKyIpKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IitXKyIpKil8LiopXFwpfCkiLEI9bmV3IFJlZ0V4cChNKyIrIiwiZyIpLCQ9bmV3IFJlZ0V4cCgiXiIrTSsiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitNKyIrJCIsImciKSxfPW5ldyBSZWdFeHAoIl4iK00rIiosIitNKyIqIiksej1uZXcgUmVnRXhwKCJeIitNKyIqKFs+K35dfCIrTSsiKSIrTSsiKiIpLFU9bmV3IFJlZ0V4cChNKyJ8PiIpLFg9bmV3IFJlZ0V4cChGKSxWPW5ldyBSZWdFeHAoIl4iK0krIiQiKSxHPXtJRDpuZXcgUmVnRXhwKCJeIygiK0krIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrSSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrSSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK1cpLFBTRVVETzpuZXcgUmVnRXhwKCJeIitGKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK00rIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK00rIiooPzooWystXXwpIitNKyIqKFxcZCspfCkpIitNKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitSKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTSsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitNKyIqKCg/Oi1cXGQpP1xcZCopIitNKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxZPS9IVE1MJC9pLFE9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxKPS9eaFxkJC9pLEs9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLFo9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxlZT0vWyt+XS8sdGU9bmV3IFJlZ0V4cCgiXFxcXFtcXGRhLWZBLUZdezEsNn0iK00rIj98XFxcXChbXlxcclxcblxcZl0pIiwiZyIpLG5lPWZ1bmN0aW9uKGUsdCl7dmFyIG49IjB4IitlLnNsaWNlKDEpLTY1NTM2O3JldHVybiB0fHwobjwwP1N0cmluZy5mcm9tQ2hhckNvZGUobis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShuPj4xMHw1NTI5NiwxMDIzJm58NTYzMjApKX0scmU9LyhbXDAtXHgxZlx4N2ZdfF4tP1xkKXxeLSR8W15cMC1ceDFmXHg3Zi1cdUZGRkZcdy1dL2csaWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8iXDAiPT09ZT8iXHVmZmZkIjplLnNsaWNlKDAsLTEpKyJcXCIrZS5jaGFyQ29kZUF0KGUubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KSsiICI6IlxcIitlfSxvZT1mdW5jdGlvbigpe1QoKX0sYWU9YmUoZnVuY3Rpb24oZSl7cmV0dXJuITA9PT1lLmRpc2FibGVkJiYiZmllbGRzZXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e0guYXBwbHkodD1PLmNhbGwocC5jaGlsZE5vZGVzKSxwLmNoaWxkTm9kZXMpLHRbcC5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZSl7SD17YXBwbHk6dC5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtMLmFwcGx5KGUsTy5jYWxsKHQpKX06ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmxlbmd0aCxyPTA7d2hpbGUoZVtuKytdPXRbcisrXSk7ZS5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gc2UodCxlLG4scil7dmFyIGksbyxhLHMsdSxsLGMsZj1lJiZlLm93bmVyRG9jdW1lbnQscD1lP2Uubm9kZVR5cGU6OTtpZihuPW58fFtdLCJzdHJpbmciIT10eXBlb2YgdHx8IXR8fDEhPT1wJiY5IT09cCYmMTEhPT1wKXJldHVybiBuO2lmKCFyJiYoVChlKSxlPWV8fEMsRSkpe2lmKDExIT09cCYmKHU9Wi5leGVjKHQpKSlpZihpPXVbMV0pe2lmKDk9PT1wKXtpZighKGE9ZS5nZXRFbGVtZW50QnlJZChpKSkpcmV0dXJuIG47aWYoYS5pZD09PWkpcmV0dXJuIG4ucHVzaChhKSxufWVsc2UgaWYoZiYmKGE9Zi5nZXRFbGVtZW50QnlJZChpKSkmJnkoZSxhKSYmYS5pZD09PWkpcmV0dXJuIG4ucHVzaChhKSxufWVsc2V7aWYodVsyXSlyZXR1cm4gSC5hcHBseShuLGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCkpLG47aWYoKGk9dVszXSkmJmQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBILmFwcGx5KG4sZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGkpKSxufWlmKGQucXNhJiYhTlt0KyIgIl0mJighdnx8IXYudGVzdCh0KSkmJigxIT09cHx8Im9iamVjdCIhPT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKXtpZihjPXQsZj1lLDE9PT1wJiYoVS50ZXN0KHQpfHx6LnRlc3QodCkpKXsoZj1lZS50ZXN0KHQpJiZ5ZShlLnBhcmVudE5vZGUpfHxlKT09PWUmJmQuc2NvcGV8fCgocz1lLmdldEF0dHJpYnV0ZSgiaWQiKSk/cz1zLnJlcGxhY2UocmUsaWUpOmUuc2V0QXR0cmlidXRlKCJpZCIscz1TKSksbz0obD1oKHQpKS5sZW5ndGg7d2hpbGUoby0tKWxbb109KHM/IiMiK3M6IjpzY29wZSIpKyIgIit4ZShsW29dKTtjPWwuam9pbigiLCIpfXRyeXtyZXR1cm4gSC5hcHBseShuLGYucXVlcnlTZWxlY3RvckFsbChjKSksbn1jYXRjaChlKXtOKHQsITApfWZpbmFsbHl7cz09PVMmJmUucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGcodC5yZXBsYWNlKCQsIiQxIiksZSxuLHIpfWZ1bmN0aW9uIHVlKCl7dmFyIHI9W107cmV0dXJuIGZ1bmN0aW9uIGUodCxuKXtyZXR1cm4gci5wdXNoKHQrIiAiKT5iLmNhY2hlTGVuZ3RoJiZkZWxldGUgZVtyLnNoaWZ0KCldLGVbdCsiICJdPW59fWZ1bmN0aW9uIGxlKGUpe3JldHVybiBlW1NdPSEwLGV9ZnVuY3Rpb24gY2UoZSl7dmFyIHQ9Qy5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2goZSl7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGZlKGUsdCl7dmFyIG49ZS5zcGxpdCgifCIpLHI9bi5sZW5ndGg7d2hpbGUoci0tKWIuYXR0ckhhbmRsZVtuW3JdXT10fWZ1bmN0aW9uIHBlKGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBkZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmZS50eXBlPT09dH19ZnVuY3Rpb24gaGUobil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PXR8fCJidXR0b24iPT09dCkmJmUudHlwZT09PW59fWZ1bmN0aW9uIGdlKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iZm9ybSJpbiBlP2UucGFyZW50Tm9kZSYmITE9PT1lLmRpc2FibGVkPyJsYWJlbCJpbiBlPyJsYWJlbCJpbiBlLnBhcmVudE5vZGU/ZS5wYXJlbnROb2RlLmRpc2FibGVkPT09dDplLmRpc2FibGVkPT09dDplLmlzRGlzYWJsZWQ9PT10fHxlLmlzRGlzYWJsZWQhPT0hdCYmYWUoZSk9PT10OmUuZGlzYWJsZWQ9PT10OiJsYWJlbCJpbiBlJiZlLmRpc2FibGVkPT09dH19ZnVuY3Rpb24gdmUoYSl7cmV0dXJuIGxlKGZ1bmN0aW9uKG8pe3JldHVybiBvPStvLGxlKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1hKFtdLGUubGVuZ3RoLG8pLGk9ci5sZW5ndGg7d2hpbGUoaS0tKWVbbj1yW2ldXSYmKGVbbl09ISh0W25dPWVbbl0pKX0pfSl9ZnVuY3Rpb24geWUoZSl7cmV0dXJuIGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmZX1mb3IoZSBpbiBkPXNlLnN1cHBvcnQ9e30saT1zZS5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lLm5hbWVzcGFjZVVSSSxuPShlLm93bmVyRG9jdW1lbnR8fGUpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4hWS50ZXN0KHR8fG4mJm4ubm9kZU5hbWV8fCJIVE1MIil9LFQ9c2Uuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbixyPWU/ZS5vd25lckRvY3VtZW50fHxlOnA7cmV0dXJuIHIhPUMmJjk9PT1yLm5vZGVUeXBlJiZyLmRvY3VtZW50RWxlbWVudCYmKGE9KEM9cikuZG9jdW1lbnRFbGVtZW50LEU9IWkoQykscCE9QyYmKG49Qy5kZWZhdWx0VmlldykmJm4udG9wIT09biYmKG4uYWRkRXZlbnRMaXN0ZW5lcj9uLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsb2UsITEpOm4uYXR0YWNoRXZlbnQmJm4uYXR0YWNoRXZlbnQoIm9udW5sb2FkIixvZSkpLGQuc2NvcGU9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQoQy5jcmVhdGVFbGVtZW50KCJkaXYiKSksInVuZGVmaW5lZCIhPXR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGwmJiFlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpzY29wZSBmaWVsZHNldCBkaXYiKS5sZW5ndGh9KSxkLmF0dHJpYnV0ZXM9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xhc3NOYW1lPSJpIiwhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksZC5nZXRFbGVtZW50c0J5VGFnTmFtZT1jZShmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZChDLmNyZWF0ZUNvbW1lbnQoIiIpKSwhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1LLnRlc3QoQy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxkLmdldEJ5SWQ9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZSkuaWQ9UywhQy5nZXRFbGVtZW50c0J5TmFtZXx8IUMuZ2V0RWxlbWVudHNCeU5hbWUoUykubGVuZ3RofSksZC5nZXRCeUlkPyhiLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UodGUsbmUpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10fX0sYi5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZFKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuP1tuXTpbXX19KTooYi5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIG49ZS5yZXBsYWNlKHRlLG5lKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUmJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gdCYmdC52YWx1ZT09PW59fSxiLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJkUpe3ZhciBuLHIsaSxvPXQuZ2V0RWxlbWVudEJ5SWQoZSk7aWYobyl7aWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dO2k9dC5nZXRFbGVtZW50c0J5TmFtZShlKSxyPTA7d2hpbGUobz1pW3IrK10paWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dfXJldHVybltdfX0pLGIuZmluZC5UQUc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihlLHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50c0J5VGFnTmFtZT90LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpOmQucXNhP3QucXVlcnlTZWxlY3RvckFsbChlKTp2b2lkIDB9OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPTAsbz10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpO2lmKCIqIj09PWUpe3doaWxlKG49b1tpKytdKTE9PT1uLm5vZGVUeXBlJiZyLnB1c2gobik7cmV0dXJuIHJ9cmV0dXJuIG99LGIuZmluZC5DTEFTUz1kLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJkUpcmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKX0scz1bXSx2PVtdLChkLnFzYT1LLnRlc3QoQy5xdWVyeVNlbGVjdG9yQWxsKSkmJihjZShmdW5jdGlvbihlKXt2YXIgdDthLmFwcGVuZENoaWxkKGUpLmlubmVySFRNTD0iPGEgaWQ9JyIrUysiJz48L2E+PHNlbGVjdCBpZD0nIitTKyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGUucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnYucHVzaCgiWypeJF09IitNKyIqKD86Jyd8XCJcIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHYucHVzaCgiXFxbIitNKyIqKD86dmFsdWV8IitSKyIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrUysiLV0iKS5sZW5ndGh8fHYucHVzaCgifj0iKSwodD1DLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnNldEF0dHJpYnV0ZSgibmFtZSIsIiIpLGUuYXBwZW5kQ2hpbGQodCksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT0nJ10iKS5sZW5ndGh8fHYucHVzaCgiXFxbIitNKyIqbmFtZSIrTSsiKj0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHYucHVzaCgiOmNoZWNrZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIitTKyIrKiIpLmxlbmd0aHx8di5wdXNoKCIuIy4rWyt+XSIpLGUucXVlcnlTZWxlY3RvckFsbCgiXFxcZiIpLHYucHVzaCgiW1xcclxcblxcZl0iKX0pLGNlKGZ1bmN0aW9uKGUpe2UuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciB0PUMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGUuYXBwZW5kQ2hpbGQodCkuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGUucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnYucHVzaCgibmFtZSIrTSsiKlsqXiR8IX5dPz0iKSwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmdi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGEuYXBwZW5kQ2hpbGQoZSkuZGlzYWJsZWQ9ITAsMiE9PWUucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksZS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4Iiksdi5wdXNoKCIsLio6Iil9KSksKGQubWF0Y2hlc1NlbGVjdG9yPUsudGVzdChjPWEubWF0Y2hlc3x8YS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLm9NYXRjaGVzU2VsZWN0b3J8fGEubXNNYXRjaGVzU2VsZWN0b3IpKSYmY2UoZnVuY3Rpb24oZSl7ZC5kaXNjb25uZWN0ZWRNYXRjaD1jLmNhbGwoZSwiKiIpLGMuY2FsbChlLCJbcyE9JyddOngiKSxzLnB1c2goIiE9IixGKX0pLHY9di5sZW5ndGgmJm5ldyBSZWdFeHAodi5qb2luKCJ8IikpLHM9cy5sZW5ndGgmJm5ldyBSZWdFeHAocy5qb2luKCJ8IikpLHQ9Sy50ZXN0KGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHk9dHx8Sy50ZXN0KGEuY29udGFpbnMpP2Z1bmN0aW9uKGUsdCl7dmFyIG49OT09PWUubm9kZVR5cGU/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKGUsdCl7aWYodCl3aGlsZSh0PXQucGFyZW50Tm9kZSlpZih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sRD10P2Z1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIGw9ITAsMDt2YXIgbj0hZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gbnx8KDEmKG49KGUub3duZXJEb2N1bWVudHx8ZSk9PSh0Lm93bmVyRG9jdW1lbnR8fHQpP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk6MSl8fCFkLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PW4/ZT09Q3x8ZS5vd25lckRvY3VtZW50PT1wJiZ5KHAsZSk/LTE6dD09Q3x8dC5vd25lckRvY3VtZW50PT1wJiZ5KHAsdCk/MTp1P1AodSxlKS1QKHUsdCk6MDo0Jm4/LTE6MSl9OmZ1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIGw9ITAsMDt2YXIgbixyPTAsaT1lLnBhcmVudE5vZGUsbz10LnBhcmVudE5vZGUsYT1bZV0scz1bdF07aWYoIWl8fCFvKXJldHVybiBlPT1DPy0xOnQ9PUM/MTppPy0xOm8/MTp1P1AodSxlKS1QKHUsdCk6MDtpZihpPT09bylyZXR1cm4gcGUoZSx0KTtuPWU7d2hpbGUobj1uLnBhcmVudE5vZGUpYS51bnNoaWZ0KG4pO249dDt3aGlsZShuPW4ucGFyZW50Tm9kZSlzLnVuc2hpZnQobik7d2hpbGUoYVtyXT09PXNbcl0pcisrO3JldHVybiByP3BlKGFbcl0sc1tyXSk6YVtyXT09cD8tMTpzW3JdPT1wPzE6MH0pLEN9LHNlLm1hdGNoZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gc2UoZSxudWxsLG51bGwsdCl9LHNlLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihlLHQpe2lmKFQoZSksZC5tYXRjaGVzU2VsZWN0b3ImJkUmJiFOW3QrIiAiXSYmKCFzfHwhcy50ZXN0KHQpKSYmKCF2fHwhdi50ZXN0KHQpKSl0cnl7dmFyIG49Yy5jYWxsKGUsdCk7aWYobnx8ZC5kaXNjb25uZWN0ZWRNYXRjaHx8ZS5kb2N1bWVudCYmMTEhPT1lLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiBufWNhdGNoKGUpe04odCwhMCl9cmV0dXJuIDA8c2UodCxDLG51bGwsW2VdKS5sZW5ndGh9LHNlLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUub3duZXJEb2N1bWVudHx8ZSkhPUMmJlQoZSkseShlLHQpfSxzZS5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPUMmJlQoZSk7dmFyIG49Yi5hdHRySGFuZGxlW3QudG9Mb3dlckNhc2UoKV0scj1uJiZqLmNhbGwoYi5hdHRySGFuZGxlLHQudG9Mb3dlckNhc2UoKSk/bihlLHQsIUUpOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09cj9yOmQuYXR0cmlidXRlc3x8IUU/ZS5nZXRBdHRyaWJ1dGUodCk6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSxzZS5lc2NhcGU9ZnVuY3Rpb24oZSl7cmV0dXJuKGUrIiIpLnJlcGxhY2UocmUsaWUpfSxzZS5lcnJvcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LHNlLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXSxyPTAsaT0wO2lmKGw9IWQuZGV0ZWN0RHVwbGljYXRlcyx1PSFkLnNvcnRTdGFibGUmJmUuc2xpY2UoMCksZS5zb3J0KEQpLGwpe3doaWxlKHQ9ZVtpKytdKXQ9PT1lW2ldJiYocj1uLnB1c2goaSkpO3doaWxlKHItLSllLnNwbGljZShuW3JdLDEpfXJldHVybiB1PW51bGwsZX0sbz1zZS5nZXRUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0LG49IiIscj0wLGk9ZS5ub2RlVHlwZTtpZihpKXtpZigxPT09aXx8OT09PWl8fDExPT09aSl7aWYoInN0cmluZyI9PXR5cGVvZiBlLnRleHRDb250ZW50KXJldHVybiBlLnRleHRDb250ZW50O2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyluKz1vKGUpfWVsc2UgaWYoMz09PWl8fDQ9PT1pKXJldHVybiBlLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKHQ9ZVtyKytdKW4rPW8odCk7cmV0dXJuIG59LChiPXNlLnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmxlLG1hdGNoOkcsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZSh0ZSxuZSksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UodGUsbmUpLCJ+PSI9PT1lWzJdJiYoZVszXT0iICIrZVszXSsiICIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09ZVsxXS5zbGljZSgwLDMpPyhlWzNdfHxzZS5lcnJvcihlWzBdKSxlWzRdPSsoZVs0XT9lWzVdKyhlWzZdfHwxKToyKigiZXZlbiI9PT1lWzNdfHwib2RkIj09PWVbM10pKSxlWzVdPSsoZVs3XStlWzhdfHwib2RkIj09PWVbM10pKTplWzNdJiZzZS5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIHQsbj0hZVs2XSYmZVsyXTtyZXR1cm4gRy5DSElMRC50ZXN0KGVbMF0pP251bGw6KGVbM10/ZVsyXT1lWzRdfHxlWzVdfHwiIjpuJiZYLnRlc3QobikmJih0PWgobiwhMCkpJiYodD1uLmluZGV4T2YoIikiLG4ubGVuZ3RoLXQpLW4ubGVuZ3RoKSYmKGVbMF09ZVswXS5zbGljZSgwLHQpLGVbMl09bi5zbGljZSgwLHQpKSxlLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHRlLG5lKS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PWU/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXR9fSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgdD1tW2UrIiAiXTtyZXR1cm4gdHx8KHQ9bmV3IFJlZ0V4cCgiKF58IitNKyIpIitlKyIoIitNKyJ8JCkiKSkmJm0oZSxmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KCJzdHJpbmciPT10eXBlb2YgZS5jbGFzc05hbWUmJmUuY2xhc3NOYW1lfHwidW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24obixyLGkpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1zZS5hdHRyKGUsbik7cmV0dXJuIG51bGw9PXQ/IiE9Ij09PXI6IXJ8fCh0Kz0iIiwiPSI9PT1yP3Q9PT1pOiIhPSI9PT1yP3QhPT1pOiJePSI9PT1yP2kmJjA9PT10LmluZGV4T2YoaSk6Iio9Ij09PXI/aSYmLTE8dC5pbmRleE9mKGkpOiIkPSI9PT1yP2kmJnQuc2xpY2UoLWkubGVuZ3RoKT09PWk6In49Ij09PXI/LTE8KCIgIit0LnJlcGxhY2UoQiwiICIpKyIgIikuaW5kZXhPZihpKToifD0iPT09ciYmKHQ9PT1pfHx0LnNsaWNlKDAsaS5sZW5ndGgrMSk9PT1pKyItIikpfX0sQ0hJTEQ6ZnVuY3Rpb24oaCxlLHQsZyx2KXt2YXIgeT0ibnRoIiE9PWguc2xpY2UoMCwzKSxtPSJsYXN0IiE9PWguc2xpY2UoLTQpLHg9Im9mLXR5cGUiPT09ZTtyZXR1cm4gMT09PWcmJjA9PT12P2Z1bmN0aW9uKGUpe3JldHVybiEhZS5wYXJlbnROb2RlfTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGw9eSE9PW0/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixjPWUucGFyZW50Tm9kZSxmPXgmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxwPSFuJiYheCxkPSExO2lmKGMpe2lmKHkpe3doaWxlKGwpe2E9ZTt3aGlsZShhPWFbbF0paWYoeD9hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1mOjE9PT1hLm5vZGVUeXBlKXJldHVybiExO3U9bD0ib25seSI9PT1oJiYhdSYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZih1PVttP2MuZmlyc3RDaGlsZDpjLmxhc3RDaGlsZF0sbSYmcCl7ZD0ocz0ocj0oaT0obz0oYT1jKVtTXXx8KGFbU109e30pKVthLnVuaXF1ZUlEXXx8KG9bYS51bmlxdWVJRF09e30pKVtoXXx8W10pWzBdPT09ayYmclsxXSkmJnJbMl0sYT1zJiZjLmNoaWxkTm9kZXNbc107d2hpbGUoYT0rK3MmJmEmJmFbbF18fChkPXM9MCl8fHUucG9wKCkpaWYoMT09PWEubm9kZVR5cGUmJisrZCYmYT09PWUpe2lbaF09W2sscyxkXTticmVha319ZWxzZSBpZihwJiYoZD1zPShyPShpPShvPShhPWUpW1NdfHwoYVtTXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdfHxbXSlbMF09PT1rJiZyWzFdKSwhMT09PWQpd2hpbGUoYT0rK3MmJmEmJmFbbF18fChkPXM9MCl8fHUucG9wKCkpaWYoKHg/YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZjoxPT09YS5ub2RlVHlwZSkmJisrZCYmKHAmJigoaT0obz1hW1NdfHwoYVtTXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdPVtrLGRdKSxhPT09ZSkpYnJlYWs7cmV0dXJuKGQtPXYpPT09Z3x8ZCVnPT0wJiYwPD1kL2d9fX0sUFNFVURPOmZ1bmN0aW9uKGUsbyl7dmFyIHQsYT1iLnBzZXVkb3NbZV18fGIuc2V0RmlsdGVyc1tlLnRvTG93ZXJDYXNlKCldfHxzZS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2UpO3JldHVybiBhW1NdP2Eobyk6MTxhLmxlbmd0aD8odD1bZSxlLCIiLG9dLGIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP2xlKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1hKGUsbyksaT1yLmxlbmd0aDt3aGlsZShpLS0pZVtuPVAoZSxyW2ldKV09ISh0W25dPXJbaV0pfSk6ZnVuY3Rpb24oZSl7cmV0dXJuIGEoZSwwLHQpfSk6YX19LHBzZXVkb3M6e25vdDpsZShmdW5jdGlvbihlKXt2YXIgcj1bXSxpPVtdLHM9ZihlLnJlcGxhY2UoJCwiJDEiKSk7cmV0dXJuIHNbU10/bGUoZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz1zKGUsbnVsbCxyLFtdKSxhPWUubGVuZ3RoO3doaWxlKGEtLSkoaT1vW2FdKSYmKGVbYV09ISh0W2FdPWkpKX0pOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gclswXT1lLHMocixudWxsLG4saSksclswXT1udWxsLCFpLnBvcCgpfX0pLGhhczpsZShmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIDA8c2UodCxlKS5sZW5ndGh9fSksY29udGFpbnM6bGUoZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC5yZXBsYWNlKHRlLG5lKSxmdW5jdGlvbihlKXtyZXR1cm4tMTwoZS50ZXh0Q29udGVudHx8byhlKSkuaW5kZXhPZih0KX19KSxsYW5nOmxlKGZ1bmN0aW9uKG4pe3JldHVybiBWLnRlc3Qobnx8IiIpfHxzZS5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIituKSxuPW4ucmVwbGFjZSh0ZSxuZSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihlKXt2YXIgdDtkb3tpZih0PUU/ZS5sYW5nOmUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxlLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybih0PXQudG9Mb3dlckNhc2UoKSk9PT1ufHwwPT09dC5pbmRleE9mKG4rIi0iKX13aGlsZSgoZT1lLnBhcmVudE5vZGUpJiYxPT09ZS5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGUpe3ZhciB0PW4ubG9jYXRpb24mJm4ubG9jYXRpb24uaGFzaDtyZXR1cm4gdCYmdC5zbGljZSgxKT09PWUuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1hfSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PUMuYWN0aXZlRWxlbWVudCYmKCFDLmhhc0ZvY3VzfHxDLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmdlKCExKSxkaXNhYmxlZDpnZSghMCksY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIWIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBKLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBRLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiJidXR0b24iPT09ZS50eXBlfHwiYnV0dG9uIj09PXR9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PXQudG9Mb3dlckNhc2UoKSl9LGZpcnN0OnZlKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDp2ZShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6dmUoZnVuY3Rpb24oZSx0LG4pe3JldHVybltuPDA/bit0Om5dfSksZXZlbjp2ZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDp2ZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OnZlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDp0PG4/dDpuOzA8PS0tcjspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6dmUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47KytyPHQ7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0pLnBzZXVkb3MubnRoPWIucHNldWRvcy5lcSx7cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pYi5wc2V1ZG9zW2VdPWRlKGUpO2ZvcihlIGlue3N1Ym1pdDohMCxyZXNldDohMH0pYi5wc2V1ZG9zW2VdPWhlKGUpO2Z1bmN0aW9uIG1lKCl7fWZ1bmN0aW9uIHhlKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgscj0iIjt0PG47dCsrKXIrPWVbdF0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24gYmUocyxlLHQpe3ZhciB1PWUuZGlyLGw9ZS5uZXh0LGM9bHx8dSxmPXQmJiJwYXJlbnROb2RlIj09PWMscD1yKys7cmV0dXJuIGUuZmlyc3Q/ZnVuY3Rpb24oZSx0LG4pe3doaWxlKGU9ZVt1XSlpZigxPT09ZS5ub2RlVHlwZXx8ZilyZXR1cm4gcyhlLHQsbik7cmV0dXJuITF9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYT1bayxwXTtpZihuKXt3aGlsZShlPWVbdV0paWYoKDE9PT1lLm5vZGVUeXBlfHxmKSYmcyhlLHQsbikpcmV0dXJuITB9ZWxzZSB3aGlsZShlPWVbdV0paWYoMT09PWUubm9kZVR5cGV8fGYpaWYoaT0obz1lW1NdfHwoZVtTXT17fSkpW2UudW5pcXVlSURdfHwob1tlLnVuaXF1ZUlEXT17fSksbCYmbD09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSllPWVbdV18fGU7ZWxzZXtpZigocj1pW2NdKSYmclswXT09PWsmJnJbMV09PT1wKXJldHVybiBhWzJdPXJbMl07aWYoKGlbY109YSlbMl09cyhlLHQsbikpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHdlKGkpe3JldHVybiAxPGkubGVuZ3RoP2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1pLmxlbmd0aDt3aGlsZShyLS0paWYoIWlbcl0oZSx0LG4pKXJldHVybiExO3JldHVybiEwfTppWzBdfWZ1bmN0aW9uIFRlKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGE9W10scz0wLHU9ZS5sZW5ndGgsbD1udWxsIT10O3M8dTtzKyspKG89ZVtzXSkmJihuJiYhbihvLHIsaSl8fChhLnB1c2gobyksbCYmdC5wdXNoKHMpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gQ2UoZCxoLGcsdix5LGUpe3JldHVybiB2JiYhdltTXSYmKHY9Q2UodikpLHkmJiF5W1NdJiYoeT1DZSh5LGUpKSxsZShmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1bXSx1PVtdLGw9dC5sZW5ndGgsYz1lfHxmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKXNlKGUsdFtyXSxuKTtyZXR1cm4gbn0oaHx8IioiLG4ubm9kZVR5cGU/W25dOm4sW10pLGY9IWR8fCFlJiZoP2M6VGUoYyxzLGQsbixyKSxwPWc/eXx8KGU/ZDpsfHx2KT9bXTp0OmY7aWYoZyYmZyhmLHAsbixyKSx2KXtpPVRlKHAsdSksdihpLFtdLG4sciksbz1pLmxlbmd0aDt3aGlsZShvLS0pKGE9aVtvXSkmJihwW3Vbb11dPSEoZlt1W29dXT1hKSl9aWYoZSl7aWYoeXx8ZCl7aWYoeSl7aT1bXSxvPXAubGVuZ3RoO3doaWxlKG8tLSkoYT1wW29dKSYmaS5wdXNoKGZbb109YSk7eShudWxsLHA9W10saSxyKX1vPXAubGVuZ3RoO3doaWxlKG8tLSkoYT1wW29dKSYmLTE8KGk9eT9QKGUsYSk6c1tvXSkmJihlW2ldPSEodFtpXT1hKSl9fWVsc2UgcD1UZShwPT09dD9wLnNwbGljZShsLHAubGVuZ3RoKTpwKSx5P3kobnVsbCx0LHAscik6SC5hcHBseSh0LHApfSl9ZnVuY3Rpb24gRWUoZSl7Zm9yKHZhciBpLHQsbixyPWUubGVuZ3RoLG89Yi5yZWxhdGl2ZVtlWzBdLnR5cGVdLGE9b3x8Yi5yZWxhdGl2ZVsiICJdLHM9bz8xOjAsdT1iZShmdW5jdGlvbihlKXtyZXR1cm4gZT09PWl9LGEsITApLGw9YmUoZnVuY3Rpb24oZSl7cmV0dXJuLTE8UChpLGUpfSxhLCEwKSxjPVtmdW5jdGlvbihlLHQsbil7dmFyIHI9IW8mJihufHx0IT09dyl8fCgoaT10KS5ub2RlVHlwZT91KGUsdCxuKTpsKGUsdCxuKSk7cmV0dXJuIGk9bnVsbCxyfV07czxyO3MrKylpZih0PWIucmVsYXRpdmVbZVtzXS50eXBlXSljPVtiZSh3ZShjKSx0KV07ZWxzZXtpZigodD1iLmZpbHRlcltlW3NdLnR5cGVdLmFwcGx5KG51bGwsZVtzXS5tYXRjaGVzKSlbU10pe2ZvcihuPSsrcztuPHI7bisrKWlmKGIucmVsYXRpdmVbZVtuXS50eXBlXSlicmVhaztyZXR1cm4gQ2UoMTxzJiZ3ZShjKSwxPHMmJnhlKGUuc2xpY2UoMCxzLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09ZVtzLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoJCwiJDEiKSx0LHM8biYmRWUoZS5zbGljZShzLG4pKSxuPHImJkVlKGU9ZS5zbGljZShuKSksbjxyJiZ4ZShlKSl9Yy5wdXNoKHQpfXJldHVybiB3ZShjKX1yZXR1cm4gbWUucHJvdG90eXBlPWIuZmlsdGVycz1iLnBzZXVkb3MsYi5zZXRGaWx0ZXJzPW5ldyBtZSxoPXNlLnRva2VuaXplPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLHUsbD14W2UrIiAiXTtpZihsKXJldHVybiB0PzA6bC5zbGljZSgwKTthPWUscz1bXSx1PWIucHJlRmlsdGVyO3doaWxlKGEpe2ZvcihvIGluIG4mJiEocj1fLmV4ZWMoYSkpfHwociYmKGE9YS5zbGljZShyWzBdLmxlbmd0aCl8fGEpLHMucHVzaChpPVtdKSksbj0hMSwocj16LmV4ZWMoYSkpJiYobj1yLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6clswXS5yZXBsYWNlKCQsIiAiKX0pLGE9YS5zbGljZShuLmxlbmd0aCkpLGIuZmlsdGVyKSEocj1HW29dLmV4ZWMoYSkpfHx1W29dJiYhKHI9dVtvXShyKSl8fChuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpvLG1hdGNoZXM6cn0pLGE9YS5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P2EubGVuZ3RoOmE/c2UuZXJyb3IoZSk6eChlLHMpLnNsaWNlKDApfSxmPXNlLmNvbXBpbGU9ZnVuY3Rpb24oZSx0KXt2YXIgbix2LHksbSx4LHIsaT1bXSxvPVtdLGE9QVtlKyIgIl07aWYoIWEpe3R8fCh0PWgoZSkpLG49dC5sZW5ndGg7d2hpbGUobi0tKShhPUVlKHRbbl0pKVtTXT9pLnB1c2goYSk6by5wdXNoKGEpOyhhPUEoZSwodj1vLG09MDwoeT1pKS5sZW5ndGgseD0wPHYubGVuZ3RoLHI9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdT0wLGw9IjAiLGM9ZSYmW10sZj1bXSxwPXcsZD1lfHx4JiZiLmZpbmQuVEFHKCIqIixpKSxoPWsrPW51bGw9PXA/MTpNYXRoLnJhbmRvbSgpfHwuMSxnPWQubGVuZ3RoO2ZvcihpJiYodz10PT1DfHx0fHxpKTtsIT09ZyYmbnVsbCE9KG89ZFtsXSk7bCsrKXtpZih4JiZvKXthPTAsdHx8by5vd25lckRvY3VtZW50PT1DfHwoVChvKSxuPSFFKTt3aGlsZShzPXZbYSsrXSlpZihzKG8sdHx8QyxuKSl7ci5wdXNoKG8pO2JyZWFrfWkmJihrPWgpfW0mJigobz0hcyYmbykmJnUtLSxlJiZjLnB1c2gobykpfWlmKHUrPWwsbSYmbCE9PXUpe2E9MDt3aGlsZShzPXlbYSsrXSlzKGMsZix0LG4pO2lmKGUpe2lmKDA8dSl3aGlsZShsLS0pY1tsXXx8ZltsXXx8KGZbbF09cS5jYWxsKHIpKTtmPVRlKGYpfUguYXBwbHkocixmKSxpJiYhZSYmMDxmLmxlbmd0aCYmMTx1K3kubGVuZ3RoJiZzZS51bmlxdWVTb3J0KHIpfXJldHVybiBpJiYoaz1oLHc9cCksY30sbT9sZShyKTpyKSkpLnNlbGVjdG9yPWV9cmV0dXJuIGF9LGc9c2Uuc2VsZWN0PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD0iZnVuY3Rpb24iPT10eXBlb2YgZSYmZSxjPSFyJiZoKGU9bC5zZWxlY3Rvcnx8ZSk7aWYobj1ufHxbXSwxPT09Yy5sZW5ndGgpe2lmKDI8KG89Y1swXT1jWzBdLnNsaWNlKDApKS5sZW5ndGgmJiJJRCI9PT0oYT1vWzBdKS50eXBlJiY5PT09dC5ub2RlVHlwZSYmRSYmYi5yZWxhdGl2ZVtvWzFdLnR5cGVdKXtpZighKHQ9KGIuZmluZC5JRChhLm1hdGNoZXNbMF0ucmVwbGFjZSh0ZSxuZSksdCl8fFtdKVswXSkpcmV0dXJuIG47bCYmKHQ9dC5wYXJlbnROb2RlKSxlPWUuc2xpY2Uoby5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9aT1HLm5lZWRzQ29udGV4dC50ZXN0KGUpPzA6by5sZW5ndGg7d2hpbGUoaS0tKXtpZihhPW9baV0sYi5yZWxhdGl2ZVtzPWEudHlwZV0pYnJlYWs7aWYoKHU9Yi5maW5kW3NdKSYmKHI9dShhLm1hdGNoZXNbMF0ucmVwbGFjZSh0ZSxuZSksZWUudGVzdChvWzBdLnR5cGUpJiZ5ZSh0LnBhcmVudE5vZGUpfHx0KSkpe2lmKG8uc3BsaWNlKGksMSksIShlPXIubGVuZ3RoJiZ4ZShvKSkpcmV0dXJuIEguYXBwbHkobixyKSxuO2JyZWFrfX19cmV0dXJuKGx8fGYoZSxjKSkocix0LCFFLG4sIXR8fGVlLnRlc3QoZSkmJnllKHQucGFyZW50Tm9kZSl8fHQpLG59LGQuc29ydFN0YWJsZT1TLnNwbGl0KCIiKS5zb3J0KEQpLmpvaW4oIiIpPT09UyxkLmRldGVjdER1cGxpY2F0ZXM9ISFsLFQoKSxkLnNvcnREZXRhY2hlZD1jZShmdW5jdGlvbihlKXtyZXR1cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKEMuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSl9KSxjZShmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxmZSgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsZnVuY3Rpb24oZSx0LG4pe2lmKCFuKXJldHVybiBlLmdldEF0dHJpYnV0ZSh0LCJ0eXBlIj09PXQudG9Mb3dlckNhc2UoKT8xOjIpfSksZC5hdHRyaWJ1dGVzJiZjZShmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxpbnB1dC8+IixlLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLCIiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgidmFsdWUiKX0pfHxmZSgidmFsdWUiLGZ1bmN0aW9uKGUsdCxuKXtpZighbiYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4gZS5kZWZhdWx0VmFsdWV9KSxjZShmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KXx8ZmUoUixmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoIW4pcmV0dXJuITA9PT1lW3RdP3QudG9Mb3dlckNhc2UoKToocj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9KSxzZX0oQyk7Uy5maW5kPWQsUy5leHByPWQuc2VsZWN0b3JzLFMuZXhwclsiOiJdPVMuZXhwci5wc2V1ZG9zLFMudW5pcXVlU29ydD1TLnVuaXF1ZT1kLnVuaXF1ZVNvcnQsUy50ZXh0PWQuZ2V0VGV4dCxTLmlzWE1MRG9jPWQuaXNYTUwsUy5jb250YWlucz1kLmNvbnRhaW5zLFMuZXNjYXBlU2VsZWN0b3I9ZC5lc2NhcGU7dmFyIGg9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdLGk9dm9pZCAwIT09bjt3aGlsZSgoZT1lW3RdKSYmOSE9PWUubm9kZVR5cGUpaWYoMT09PWUubm9kZVR5cGUpe2lmKGkmJlMoZSkuaXMobikpYnJlYWs7ci5wdXNoKGUpfXJldHVybiByfSxUPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdO2U7ZT1lLm5leHRTaWJsaW5nKTE9PT1lLm5vZGVUeXBlJiZlIT09dCYmbi5wdXNoKGUpO3JldHVybiBufSxrPVMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7ZnVuY3Rpb24gQShlLHQpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10LnRvTG93ZXJDYXNlKCl9dmFyIE49L148KFthLXpdW15cL1wwPjpceDIwXHRcclxuXGZdKilbXHgyMFx0XHJcblxmXSpcLz8+KD86PFwvXDE+fCkkL2k7ZnVuY3Rpb24gRChlLG4scil7cmV0dXJuIG0obik/Uy5ncmVwKGUsZnVuY3Rpb24oZSx0KXtyZXR1cm4hIW4uY2FsbChlLHQsZSkhPT1yfSk6bi5ub2RlVHlwZT9TLmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PW4hPT1yfSk6InN0cmluZyIhPXR5cGVvZiBuP1MuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybi0xPGkuY2FsbChuLGUpIT09cn0pOlMuZmlsdGVyKG4sZSxyKX1TLmZpbHRlcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dFswXTtyZXR1cm4gbiYmKGU9Ijpub3QoIitlKyIpIiksMT09PXQubGVuZ3RoJiYxPT09ci5ub2RlVHlwZT9TLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsZSk/W3JdOltdOlMuZmluZC5tYXRjaGVzKGUsUy5ncmVwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfSkpfSxTLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihlKXt2YXIgdCxuLHI9dGhpcy5sZW5ndGgsaT10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gdGhpcy5wdXNoU3RhY2soUyhlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO3Q8cjt0KyspaWYoUy5jb250YWlucyhpW3RdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihuPXRoaXMucHVzaFN0YWNrKFtdKSx0PTA7dDxyO3QrKylTLmZpbmQoZSxpW3RdLG4pO3JldHVybiAxPHI/Uy51bmlxdWVTb3J0KG4pOm59LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRCh0aGlzLGV8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRCh0aGlzLGV8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhRCh0aGlzLCJzdHJpbmciPT10eXBlb2YgZSYmay50ZXN0KGUpP1MoZSk6ZXx8W10sITEpLmxlbmd0aH19KTt2YXIgaixxPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC87KFMuZm4uaW5pdD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaTtpZighZSlyZXR1cm4gdGhpcztpZihuPW58fGosInN0cmluZyI9PXR5cGVvZiBlKXtpZighKHI9IjwiPT09ZVswXSYmIj4iPT09ZVtlLmxlbmd0aC0xXSYmMzw9ZS5sZW5ndGg/W251bGwsZSxudWxsXTpxLmV4ZWMoZSkpfHwhclsxXSYmdClyZXR1cm4hdHx8dC5qcXVlcnk/KHR8fG4pLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3Rvcih0KS5maW5kKGUpO2lmKHJbMV0pe2lmKHQ9dCBpbnN0YW5jZW9mIFM/dFswXTp0LFMubWVyZ2UodGhpcyxTLnBhcnNlSFRNTChyWzFdLHQmJnQubm9kZVR5cGU/dC5vd25lckRvY3VtZW50fHx0OkUsITApKSxOLnRlc3QoclsxXSkmJlMuaXNQbGFpbk9iamVjdCh0KSlmb3IociBpbiB0KW0odGhpc1tyXSk/dGhpc1tyXSh0W3JdKTp0aGlzLmF0dHIocix0W3JdKTtyZXR1cm4gdGhpc31yZXR1cm4oaT1FLmdldEVsZW1lbnRCeUlkKHJbMl0pKSYmKHRoaXNbMF09aSx0aGlzLmxlbmd0aD0xKSx0aGlzfXJldHVybiBlLm5vZGVUeXBlPyh0aGlzWzBdPWUsdGhpcy5sZW5ndGg9MSx0aGlzKTptKGUpP3ZvaWQgMCE9PW4ucmVhZHk/bi5yZWFkeShlKTplKFMpOlMubWFrZUFycmF5KGUsdGhpcyl9KS5wcm90b3R5cGU9Uy5mbixqPVMoRSk7dmFyIEw9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sSD17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmdW5jdGlvbiBPKGUsdCl7d2hpbGUoKGU9ZVt0XSkmJjEhPT1lLm5vZGVUeXBlKTtyZXR1cm4gZX1TLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGUpe3ZhciB0PVMoZSx0aGlzKSxuPXQubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bjtlKyspaWYoUy5jb250YWlucyh0aGlzLHRbZV0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10aGlzLmxlbmd0aCxvPVtdLGE9InN0cmluZyIhPXR5cGVvZiBlJiZTKGUpO2lmKCFrLnRlc3QoZSkpZm9yKDtyPGk7cisrKWZvcihuPXRoaXNbcl07biYmbiE9PXQ7bj1uLnBhcmVudE5vZGUpaWYobi5ub2RlVHlwZTwxMSYmKGE/LTE8YS5pbmRleChuKToxPT09bi5ub2RlVHlwZSYmUy5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKSl7by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjaygxPG8ubGVuZ3RoP1MudW5pcXVlU29ydChvKTpvKX0saW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP2kuY2FsbChTKGUpLHRoaXNbMF0pOmkuY2FsbCh0aGlzLGUuanF1ZXJ5P2VbMF06ZSk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy51bmlxdWVTb3J0KFMubWVyZ2UodGhpcy5nZXQoKSxTKGUsdCkpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pLFMuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmMTEhPT10Lm5vZGVUeXBlP3Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihlKXtyZXR1cm4gaChlLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGgoZSwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIE8oZSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihlKXtyZXR1cm4gTyhlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihlKXtyZXR1cm4gaChlLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBoKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBoKGUsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaChlLCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbihlKXtyZXR1cm4gVCgoZS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxlKX0sY2hpbGRyZW46ZnVuY3Rpb24oZSl7cmV0dXJuIFQoZS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUuY29udGVudERvY3VtZW50JiZyKGUuY29udGVudERvY3VtZW50KT9lLmNvbnRlbnREb2N1bWVudDooQShlLCJ0ZW1wbGF0ZSIpJiYoZT1lLmNvbnRlbnR8fGUpLFMubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbihyLGkpe1MuZm5bcl09ZnVuY3Rpb24oZSx0KXt2YXIgbj1TLm1hcCh0aGlzLGksZSk7cmV0dXJuIlVudGlsIiE9PXIuc2xpY2UoLTUpJiYodD1lKSx0JiYic3RyaW5nIj09dHlwZW9mIHQmJihuPVMuZmlsdGVyKHQsbikpLDE8dGhpcy5sZW5ndGgmJihIW3JdfHxTLnVuaXF1ZVNvcnQobiksTC50ZXN0KHIpJiZuLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2sobil9fSk7dmFyIFA9L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBSKGUpe3JldHVybiBlfWZ1bmN0aW9uIE0oZSl7dGhyb3cgZX1mdW5jdGlvbiBJKGUsdCxuLHIpe3ZhciBpO3RyeXtlJiZtKGk9ZS5wcm9taXNlKT9pLmNhbGwoZSkuZG9uZSh0KS5mYWlsKG4pOmUmJm0oaT1lLnRoZW4pP2kuY2FsbChlLHQsbik6dC5hcHBseSh2b2lkIDAsW2VdLnNsaWNlKHIpKX1jYXRjaChlKXtuLmFwcGx5KHZvaWQgMCxbZV0pfX1TLkNhbGxiYWNrcz1mdW5jdGlvbihyKXt2YXIgZSxuO3I9InN0cmluZyI9PXR5cGVvZiByPyhlPXIsbj17fSxTLmVhY2goZS5tYXRjaChQKXx8W10sZnVuY3Rpb24oZSx0KXtuW3RdPSEwfSksbik6Uy5leHRlbmQoe30scik7dmFyIGksdCxvLGEscz1bXSx1PVtdLGw9LTEsYz1mdW5jdGlvbigpe2ZvcihhPWF8fHIub25jZSxvPWk9ITA7dS5sZW5ndGg7bD0tMSl7dD11LnNoaWZ0KCk7d2hpbGUoKytsPHMubGVuZ3RoKSExPT09c1tsXS5hcHBseSh0WzBdLHRbMV0pJiZyLnN0b3BPbkZhbHNlJiYobD1zLmxlbmd0aCx0PSExKX1yLm1lbW9yeXx8KHQ9ITEpLGk9ITEsYSYmKHM9dD9bXToiIil9LGY9e2FkZDpmdW5jdGlvbigpe3JldHVybiBzJiYodCYmIWkmJihsPXMubGVuZ3RoLTEsdS5wdXNoKHQpKSxmdW5jdGlvbiBuKGUpe1MuZWFjaChlLGZ1bmN0aW9uKGUsdCl7bSh0KT9yLnVuaXF1ZSYmZi5oYXModCl8fHMucHVzaCh0KTp0JiZ0Lmxlbmd0aCYmInN0cmluZyIhPT13KHQpJiZuKHQpfSl9KGFyZ3VtZW50cyksdCYmIWkmJmMoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIFMuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2YXIgbjt3aGlsZSgtMTwobj1TLmluQXJyYXkodCxzLG4pKSlzLnNwbGljZShuLDEpLG48PWwmJmwtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gZT8tMTxTLmluQXJyYXkoZSxzKTowPHMubGVuZ3RofSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBzJiYocz1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBhPXU9W10scz10PSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIXN9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gYT11PVtdLHR8fGl8fChzPXQ9IiIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhYX0sZmlyZVdpdGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXx8KHQ9W2UsKHQ9dHx8W10pLnNsaWNlP3Quc2xpY2UoKTp0XSx1LnB1c2godCksaXx8YygpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFvfX07cmV0dXJuIGZ9LFMuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihlKXt2YXIgbz1bWyJub3RpZnkiLCJwcm9ncmVzcyIsUy5DYWxsYmFja3MoIm1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJtZW1vcnkiKSwyXSxbInJlc29sdmUiLCJkb25lIixTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwwLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMSwicmVqZWN0ZWQiXV0saT0icGVuZGluZyIsYT17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gaX0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIHMuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSwiY2F0Y2giOmZ1bmN0aW9uKGUpe3JldHVybiBhLnRoZW4obnVsbCxlKX0scGlwZTpmdW5jdGlvbigpe3ZhciBpPWFyZ3VtZW50cztyZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihyKXtTLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBuPW0oaVt0WzRdXSkmJmlbdFs0XV07c1t0WzFdXShmdW5jdGlvbigpe3ZhciBlPW4mJm4uYXBwbHkodGhpcyxhcmd1bWVudHMpO2UmJm0oZS5wcm9taXNlKT9lLnByb21pc2UoKS5wcm9ncmVzcyhyLm5vdGlmeSkuZG9uZShyLnJlc29sdmUpLmZhaWwoci5yZWplY3QpOnJbdFswXSsiV2l0aCJdKHRoaXMsbj9bZV06YXJndW1lbnRzKX0pfSksaT1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKHQsbixyKXt2YXIgdT0wO2Z1bmN0aW9uIGwoaSxvLGEscyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cyxlPWZ1bmN0aW9uKCl7dmFyIGUsdDtpZighKGk8dSkpe2lmKChlPWEuYXBwbHkobixyKSk9PT1vLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTt0PWUmJigib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlKSYmZS50aGVuLG0odCk/cz90LmNhbGwoZSxsKHUsbyxSLHMpLGwodSxvLE0scykpOih1KyssdC5jYWxsKGUsbCh1LG8sUixzKSxsKHUsbyxNLHMpLGwodSxvLFIsby5ub3RpZnlXaXRoKSkpOihhIT09UiYmKG49dm9pZCAwLHI9W2VdKSwoc3x8by5yZXNvbHZlV2l0aCkobixyKSl9fSx0PXM/ZTpmdW5jdGlvbigpe3RyeXtlKCl9Y2F0Y2goZSl7Uy5EZWZlcnJlZC5leGNlcHRpb25Ib29rJiZTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soZSx0LnN0YWNrVHJhY2UpLHU8PWkrMSYmKGEhPT1NJiYobj12b2lkIDAscj1bZV0pLG8ucmVqZWN0V2l0aChuLHIpKX19O2k/dCgpOihTLkRlZmVycmVkLmdldFN0YWNrSG9vayYmKHQuc3RhY2tUcmFjZT1TLkRlZmVycmVkLmdldFN0YWNrSG9vaygpKSxDLnNldFRpbWVvdXQodCkpfX1yZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihlKXtvWzBdWzNdLmFkZChsKDAsZSxtKHIpP3I6UixlLm5vdGlmeVdpdGgpKSxvWzFdWzNdLmFkZChsKDAsZSxtKHQpP3Q6UikpLG9bMl1bM10uYWRkKGwoMCxlLG0obik/bjpNKSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWU/Uy5leHRlbmQoZSxhKTphfX0scz17fTtyZXR1cm4gUy5lYWNoKG8sZnVuY3Rpb24oZSx0KXt2YXIgbj10WzJdLHI9dFs1XTthW3RbMV1dPW4uYWRkLHImJm4uYWRkKGZ1bmN0aW9uKCl7aT1yfSxvWzMtZV1bMl0uZGlzYWJsZSxvWzMtZV1bM10uZGlzYWJsZSxvWzBdWzJdLmxvY2ssb1swXVszXS5sb2NrKSxuLmFkZCh0WzNdLmZpcmUpLHNbdFswXV09ZnVuY3Rpb24oKXtyZXR1cm4gc1t0WzBdKyJXaXRoIl0odGhpcz09PXM/dm9pZCAwOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxzW3RbMF0rIldpdGgiXT1uLmZpcmVXaXRofSksYS5wcm9taXNlKHMpLGUmJmUuY2FsbChzLHMpLHN9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCx0PW4scj1BcnJheSh0KSxpPXMuY2FsbChhcmd1bWVudHMpLG89Uy5EZWZlcnJlZCgpLGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JbdF09dGhpcyxpW3RdPTE8YXJndW1lbnRzLmxlbmd0aD9zLmNhbGwoYXJndW1lbnRzKTplLC0tbnx8by5yZXNvbHZlV2l0aChyLGkpfX07aWYobjw9MSYmKEkoZSxvLmRvbmUoYSh0KSkucmVzb2x2ZSxvLnJlamVjdCwhbiksInBlbmRpbmciPT09by5zdGF0ZSgpfHxtKGlbdF0mJmlbdF0udGhlbikpKXJldHVybiBvLnRoZW4oKTt3aGlsZSh0LS0pSShpW3RdLGEodCksby5yZWplY3QpO3JldHVybiBvLnByb21pc2UoKX19KTt2YXIgVz0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24oZSx0KXtDLmNvbnNvbGUmJkMuY29uc29sZS53YXJuJiZlJiZXLnRlc3QoZS5uYW1lKSYmQy5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIrZS5tZXNzYWdlLGUuc3RhY2ssdCl9LFMucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24oZSl7Qy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgZX0pfTt2YXIgRj1TLkRlZmVycmVkKCk7ZnVuY3Rpb24gQigpe0UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiksQy5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixCKSxTLnJlYWR5KCl9Uy5mbi5yZWFkeT1mdW5jdGlvbihlKXtyZXR1cm4gRi50aGVuKGUpWyJjYXRjaCJdKGZ1bmN0aW9uKGUpe1MucmVhZHlFeGNlcHRpb24oZSl9KSx0aGlzfSxTLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbihlKXsoITA9PT1lPy0tUy5yZWFkeVdhaXQ6Uy5pc1JlYWR5KXx8KFMuaXNSZWFkeT0hMCkhPT1lJiYwPC0tUy5yZWFkeVdhaXR8fEYucmVzb2x2ZVdpdGgoRSxbU10pfX0pLFMucmVhZHkudGhlbj1GLnRoZW4sImNvbXBsZXRlIj09PUUucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09RS5yZWFkeVN0YXRlJiYhRS5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/Qy5zZXRUaW1lb3V0KFMucmVhZHkpOihFLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIpLEMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsQikpO3ZhciAkPWZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEpe3ZhciBzPTAsdT1lLmxlbmd0aCxsPW51bGw9PW47aWYoIm9iamVjdCI9PT13KG4pKWZvcihzIGluIGk9ITAsbikkKGUsdCxzLG5bc10sITAsbyxhKTtlbHNlIGlmKHZvaWQgMCE9PXImJihpPSEwLG0ocil8fChhPSEwKSxsJiYoYT8odC5jYWxsKGUsciksdD1udWxsKToobD10LHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBsLmNhbGwoUyhlKSxuKX0pKSx0KSlmb3IoO3M8dTtzKyspdChlW3NdLG4sYT9yOnIuY2FsbChlW3NdLHMsdChlW3NdLG4pKSk7cmV0dXJuIGk/ZTpsP3QuY2FsbChlKTp1P3QoZVswXSxuKTpvfSxfPS9eLW1zLS8sej0vLShbYS16XSkvZztmdW5jdGlvbiBVKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBYKGUpe3JldHVybiBlLnJlcGxhY2UoXywibXMtIikucmVwbGFjZSh6LFUpfXZhciBWPWZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZXx8OT09PWUubm9kZVR5cGV8fCErZS5ub2RlVHlwZX07ZnVuY3Rpb24gRygpe3RoaXMuZXhwYW5kbz1TLmV4cGFuZG8rRy51aWQrK31HLnVpZD0xLEcucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHR8fCh0PXt9LFYoZSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT10Ok9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHRoaXMuZXhwYW5kbyx7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KSkpLHR9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT10aGlzLmNhY2hlKGUpO2lmKCJzdHJpbmciPT10eXBlb2YgdClpW1godCldPW47ZWxzZSBmb3IociBpbiB0KWlbWChyKV09dFtyXTtyZXR1cm4gaX0sZ2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5jYWNoZShlKTplW3RoaXMuZXhwYW5kb10mJmVbdGhpcy5leHBhbmRvXVtYKHQpXX0sYWNjZXNzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dHx8dCYmInN0cmluZyI9PXR5cGVvZiB0JiZ2b2lkIDA9PT1uP3RoaXMuZ2V0KGUsdCk6KHRoaXMuc2V0KGUsdCxuKSx2b2lkIDAhPT1uP246dCl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9ZVt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PXIpe2lmKHZvaWQgMCE9PXQpe249KHQ9QXJyYXkuaXNBcnJheSh0KT90Lm1hcChYKToodD1YKHQpKWluIHI/W3RdOnQubWF0Y2goUCl8fFtdKS5sZW5ndGg7d2hpbGUobi0tKWRlbGV0ZSByW3Rbbl1dfSh2b2lkIDA9PT10fHxTLmlzRW1wdHlPYmplY3QocikpJiYoZS5ub2RlVHlwZT9lW3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSBlW3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHZvaWQgMCE9PXQmJiFTLmlzRW1wdHlPYmplY3QodCl9fTt2YXIgWT1uZXcgRyxRPW5ldyBHLEo9L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxLPS9bQS1aXS9nO2Z1bmN0aW9uIFooZSx0LG4pe3ZhciByLGk7aWYodm9pZCAwPT09biYmMT09PWUubm9kZVR5cGUpaWYocj0iZGF0YS0iK3QucmVwbGFjZShLLCItJCYiKS50b0xvd2VyQ2FzZSgpLCJzdHJpbmciPT10eXBlb2Yobj1lLmdldEF0dHJpYnV0ZShyKSkpe3RyeXtuPSJ0cnVlIj09PShpPW4pfHwiZmFsc2UiIT09aSYmKCJudWxsIj09PWk/bnVsbDppPT09K2krIiI/K2k6Si50ZXN0KGkpP0pTT04ucGFyc2UoaSk6aSl9Y2F0Y2goZSl7fVEuc2V0KGUsdCxuKX1lbHNlIG49dm9pZCAwO3JldHVybiBufVMuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiBRLmhhc0RhdGEoZSl8fFkuaGFzRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFEuYWNjZXNzKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe1EucmVtb3ZlKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gWS5hY2Nlc3MoZSx0LG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe1kucmVtb3ZlKGUsdCl9fSksUy5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24obixlKXt2YXIgdCxyLGksbz10aGlzWzBdLGE9byYmby5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PW4pe2lmKHRoaXMubGVuZ3RoJiYoaT1RLmdldChvKSwxPT09by5ub2RlVHlwZSYmIVkuZ2V0KG8sImhhc0RhdGFBdHRycyIpKSl7dD1hLmxlbmd0aDt3aGlsZSh0LS0pYVt0XSYmMD09PShyPWFbdF0ubmFtZSkuaW5kZXhPZigiZGF0YS0iKSYmKHI9WChyLnNsaWNlKDUpKSxaKG8scixpW3JdKSk7WS5zZXQobywiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGl9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBuP3RoaXMuZWFjaChmdW5jdGlvbigpe1Euc2V0KHRoaXMsbil9KTokKHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ7aWYobyYmdm9pZCAwPT09ZSlyZXR1cm4gdm9pZCAwIT09KHQ9US5nZXQobyxuKSk/dDp2b2lkIDAhPT0odD1aKG8sbikpP3Q6dm9pZCAwO3RoaXMuZWFjaChmdW5jdGlvbigpe1Euc2V0KHRoaXMsbixlKX0pfSxudWxsLGUsMTxhcmd1bWVudHMubGVuZ3RoLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtRLnJlbW92ZSh0aGlzLGUpfSl9fSksUy5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZihlKXJldHVybiB0PSh0fHwiZngiKSsicXVldWUiLHI9WS5nZXQoZSx0KSxuJiYoIXJ8fEFycmF5LmlzQXJyYXkobik/cj1ZLmFjY2VzcyhlLHQsUy5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24oZSx0KXt0PXR8fCJmeCI7dmFyIG49Uy5xdWV1ZShlLHQpLHI9bi5sZW5ndGgsaT1uLnNoaWZ0KCksbz1TLl9xdWV1ZUhvb2tzKGUsdCk7ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKCJmeCI9PT10JiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGZ1bmN0aW9uKCl7Uy5kZXF1ZXVlKGUsdCl9LG8pKSwhciYmbyYmby5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCsicXVldWVIb29rcyI7cmV0dXJuIFkuZ2V0KGUsbil8fFkuYWNjZXNzKGUsbix7ZW1wdHk6Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7WS5yZW1vdmUoZSxbdCsicXVldWUiLG5dKX0pfSl9fSksUy5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsbil7dmFyIGU9MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihuPXQsdD0iZngiLGUtLSksYXJndW1lbnRzLmxlbmd0aDxlP1MucXVldWUodGhpc1swXSx0KTp2b2lkIDA9PT1uP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Uy5xdWV1ZSh0aGlzLHQsbik7Uy5fcXVldWVIb29rcyh0aGlzLHQpLCJmeCI9PT10JiYiaW5wcm9ncmVzcyIhPT1lWzBdJiZTLmRlcXVldWUodGhpcyx0KX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmRlcXVldWUodGhpcyxlKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnF1ZXVlKGV8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0xLGk9Uy5EZWZlcnJlZCgpLG89dGhpcyxhPXRoaXMubGVuZ3RoLHM9ZnVuY3Rpb24oKXstLXJ8fGkucmVzb2x2ZVdpdGgobyxbb10pfTsic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLGU9ZXx8ImZ4Ijt3aGlsZShhLS0pKG49WS5nZXQob1thXSxlKyJxdWV1ZUhvb2tzIikpJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKHMpKTtyZXR1cm4gcygpLGkucHJvbWlzZSh0KX19KTt2YXIgZWU9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsdGU9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK2VlKyIpKFthLXolXSopJCIsImkiKSxuZT1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLHJlPUUuZG9jdW1lbnRFbGVtZW50LGllPWZ1bmN0aW9uKGUpe3JldHVybiBTLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKX0sb2U9e2NvbXBvc2VkOiEwfTtyZS5nZXRSb290Tm9kZSYmKGllPWZ1bmN0aW9uKGUpe3JldHVybiBTLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKXx8ZS5nZXRSb290Tm9kZShvZSk9PT1lLm93bmVyRG9jdW1lbnR9KTt2YXIgYWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ibm9uZSI9PT0oZT10fHxlKS5zdHlsZS5kaXNwbGF5fHwiIj09PWUuc3R5bGUuZGlzcGxheSYmaWUoZSkmJiJub25lIj09PVMuY3NzKGUsImRpc3BsYXkiKX07ZnVuY3Rpb24gc2UoZSx0LG4scil7dmFyIGksbyxhPTIwLHM9cj9mdW5jdGlvbigpe3JldHVybiByLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiBTLmNzcyhlLHQsIiIpfSx1PXMoKSxsPW4mJm5bM118fChTLmNzc051bWJlclt0XT8iIjoicHgiKSxjPWUubm9kZVR5cGUmJihTLmNzc051bWJlclt0XXx8InB4IiE9PWwmJit1KSYmdGUuZXhlYyhTLmNzcyhlLHQpKTtpZihjJiZjWzNdIT09bCl7dS89MixsPWx8fGNbM10sYz0rdXx8MTt3aGlsZShhLS0pUy5zdHlsZShlLHQsYytsKSwoMS1vKSooMS0obz1zKCkvdXx8LjUpKTw9MCYmKGE9MCksYy89bztjKj0yLFMuc3R5bGUoZSx0LGMrbCksbj1ufHxbXX1yZXR1cm4gbiYmKGM9K2N8fCt1fHwwLGk9blsxXT9jKyhuWzFdKzEpKm5bMl06K25bMl0sciYmKHIudW5pdD1sLHIuc3RhcnQ9YyxyLmVuZD1pKSksaX12YXIgdWU9e307ZnVuY3Rpb24gbGUoZSx0KXtmb3IodmFyIG4scixpLG8sYSxzLHUsbD1bXSxjPTAsZj1lLmxlbmd0aDtjPGY7YysrKShyPWVbY10pLnN0eWxlJiYobj1yLnN0eWxlLmRpc3BsYXksdD8oIm5vbmUiPT09biYmKGxbY109WS5nZXQociwiZGlzcGxheSIpfHxudWxsLGxbY118fChyLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PXIuc3R5bGUuZGlzcGxheSYmYWUocikmJihsW2NdPSh1PWE9bz12b2lkIDAsYT0oaT1yKS5vd25lckRvY3VtZW50LHM9aS5ub2RlTmFtZSwodT11ZVtzXSl8fChvPWEuYm9keS5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQocykpLHU9Uy5jc3MobywiZGlzcGxheSIpLG8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKSwibm9uZSI9PT11JiYodT0iYmxvY2siKSx1ZVtzXT11KSkpKToibm9uZSIhPT1uJiYobFtjXT0ibm9uZSIsWS5zZXQociwiZGlzcGxheSIsbikpKTtmb3IoYz0wO2M8ZjtjKyspbnVsbCE9bFtjXSYmKGVbY10uc3R5bGUuZGlzcGxheT1sW2NdKTtyZXR1cm4gZX1TLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBsZSh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBsZSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGU/ZT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXthZSh0aGlzKT9TKHRoaXMpLnNob3coKTpTKHRoaXMpLmhpZGUoKX0pfX0pO3ZhciBjZSxmZSxwZT0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxkZT0vPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKikvaSxoZT0vXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2k7Y2U9RS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuYXBwZW5kQ2hpbGQoRS5jcmVhdGVFbGVtZW50KCJkaXYiKSksKGZlPUUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxmZS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksZmUuc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLGNlLmFwcGVuZENoaWxkKGZlKSx5LmNoZWNrQ2xvbmU9Y2UuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGNlLmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIseS5ub0Nsb25lQ2hlY2tlZD0hIWNlLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZSxjZS5pbm5lckhUTUw9IjxvcHRpb24+PC9vcHRpb24+Iix5Lm9wdGlvbj0hIWNlLmxhc3RDaGlsZDt2YXIgZ2U9e3RoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtmdW5jdGlvbiB2ZShlLHQpe3ZhciBuO3JldHVybiBuPSJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHR8fCIqIik6InVuZGVmaW5lZCIhPXR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGw/ZS5xdWVyeVNlbGVjdG9yQWxsKHR8fCIqIik6W10sdm9pZCAwPT09dHx8dCYmQShlLHQpP1MubWVyZ2UoW2VdLG4pOm59ZnVuY3Rpb24geWUoZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspWS5zZXQoZVtuXSwiZ2xvYmFsRXZhbCIsIXR8fFkuZ2V0KHRbbl0sImdsb2JhbEV2YWwiKSl9Z2UudGJvZHk9Z2UudGZvb3Q9Z2UuY29sZ3JvdXA9Z2UuY2FwdGlvbj1nZS50aGVhZCxnZS50aD1nZS50ZCx5Lm9wdGlvbnx8KGdlLm9wdGdyb3VwPWdlLm9wdGlvbj1bMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdKTt2YXIgbWU9Lzx8JiM/XHcrOy87ZnVuY3Rpb24geGUoZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLHUsbCxjLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxkPTAsaD1lLmxlbmd0aDtkPGg7ZCsrKWlmKChvPWVbZF0pfHwwPT09bylpZigib2JqZWN0Ij09PXcobykpUy5tZXJnZShwLG8ubm9kZVR5cGU/W29dOm8pO2Vsc2UgaWYobWUudGVzdChvKSl7YT1hfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KGRlLmV4ZWMobyl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1nZVtzXXx8Z2UuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXStTLmh0bWxQcmVmaWx0ZXIobykrdVsyXSxjPXVbMF07d2hpbGUoYy0tKWE9YS5sYXN0Q2hpbGQ7Uy5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtmLnRleHRDb250ZW50PSIiLGQ9MDt3aGlsZShvPXBbZCsrXSlpZihyJiYtMTxTLmluQXJyYXkobyxyKSlpJiZpLnB1c2gobyk7ZWxzZSBpZihsPWllKG8pLGE9dmUoZi5hcHBlbmRDaGlsZChvKSwic2NyaXB0IiksbCYmeWUoYSksbil7Yz0wO3doaWxlKG89YVtjKytdKWhlLnRlc3Qoby50eXBlfHwiIikmJm4ucHVzaChvKX1yZXR1cm4gZn12YXIgYmU9L15rZXkvLHdlPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxUZT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24gQ2UoKXtyZXR1cm4hMH1mdW5jdGlvbiBFZSgpe3JldHVybiExfWZ1bmN0aW9uIFNlKGUsdCl7cmV0dXJuIGU9PT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gRS5hY3RpdmVFbGVtZW50fWNhdGNoKGUpe319KCk9PSgiZm9jdXMiPT09dCl9ZnVuY3Rpb24ga2UoZSx0LG4scixpLG8pe3ZhciBhLHM7aWYoIm9iamVjdCI9PXR5cGVvZiB0KXtmb3IocyBpbiJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXZvaWQgMCksdClrZShlLHMsbixyLHRbc10sbyk7cmV0dXJuIGV9aWYobnVsbD09ciYmbnVsbD09aT8oaT1uLHI9bj12b2lkIDApOm51bGw9PWkmJigic3RyaW5nIj09dHlwZW9mIG4/KGk9cixyPXZvaWQgMCk6KGk9cixyPW4sbj12b2lkIDApKSwhMT09PWkpaT1FZTtlbHNlIGlmKCFpKXJldHVybiBlO3JldHVybiAxPT09byYmKGE9aSwoaT1mdW5jdGlvbihlKXtyZXR1cm4gUygpLm9mZihlKSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPVMuZ3VpZCsrKSksZS5lYWNoKGZ1bmN0aW9uKCl7Uy5ldmVudC5hZGQodGhpcyx0LGkscixuKX0pfWZ1bmN0aW9uIEFlKGUsaSxvKXtvPyhZLnNldChlLGksITEpLFMuZXZlbnQuYWRkKGUsaSx7bmFtZXNwYWNlOiExLGhhbmRsZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPVkuZ2V0KHRoaXMsaSk7aWYoMSZlLmlzVHJpZ2dlciYmdGhpc1tpXSl7aWYoci5sZW5ndGgpKFMuZXZlbnQuc3BlY2lhbFtpXXx8e30pLmRlbGVnYXRlVHlwZSYmZS5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKHI9cy5jYWxsKGFyZ3VtZW50cyksWS5zZXQodGhpcyxpLHIpLHQ9byh0aGlzLGkpLHRoaXNbaV0oKSxyIT09KG49WS5nZXQodGhpcyxpKSl8fHQ/WS5zZXQodGhpcyxpLCExKTpuPXt9LHIhPT1uKXJldHVybiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGUucHJldmVudERlZmF1bHQoKSxuLnZhbHVlfWVsc2Ugci5sZW5ndGgmJihZLnNldCh0aGlzLGkse3ZhbHVlOlMuZXZlbnQudHJpZ2dlcihTLmV4dGVuZChyWzBdLFMuRXZlbnQucHJvdG90eXBlKSxyLnNsaWNlKDEpLHRoaXMpfSksZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSl9fSkpOnZvaWQgMD09PVkuZ2V0KGUsaSkmJlMuZXZlbnQuYWRkKGUsaSxDZSl9Uy5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLHAsZCxoLGcsdj1ZLmdldCh0KTtpZihWKHQpKXtuLmhhbmRsZXImJihuPShvPW4pLmhhbmRsZXIsaT1vLnNlbGVjdG9yKSxpJiZTLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHJlLGkpLG4uZ3VpZHx8KG4uZ3VpZD1TLmd1aWQrKyksKHU9di5ldmVudHMpfHwodT12LmV2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpKSwoYT12LmhhbmRsZSl8fChhPXYuaGFuZGxlPWZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgUyYmUy5ldmVudC50cmlnZ2VyZWQhPT1lLnR5cGU/Uy5ldmVudC5kaXNwYXRjaC5hcHBseSh0LGFyZ3VtZW50cyk6dm9pZCAwfSksbD0oZT0oZXx8IiIpLm1hdGNoKFApfHxbIiJdKS5sZW5ndGg7d2hpbGUobC0tKWQ9Zz0ocz1UZS5leGVjKGVbbF0pfHxbXSlbMV0saD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGQmJihmPVMuZXZlbnQuc3BlY2lhbFtkXXx8e30sZD0oaT9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZCxmPVMuZXZlbnQuc3BlY2lhbFtkXXx8e30sYz1TLmV4dGVuZCh7dHlwZTpkLG9yaWdUeXBlOmcsZGF0YTpyLGhhbmRsZXI6bixndWlkOm4uZ3VpZCxzZWxlY3RvcjppLG5lZWRzQ29udGV4dDppJiZTLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoaSksbmFtZXNwYWNlOmguam9pbigiLiIpfSxvKSwocD11W2RdKXx8KChwPXVbZF09W10pLmRlbGVnYXRlQ291bnQ9MCxmLnNldHVwJiYhMSE9PWYuc2V0dXAuY2FsbCh0LHIsaCxhKXx8dC5hZGRFdmVudExpc3RlbmVyJiZ0LmFkZEV2ZW50TGlzdGVuZXIoZCxhKSksZi5hZGQmJihmLmFkZC5jYWxsKHQsYyksYy5oYW5kbGVyLmd1aWR8fChjLmhhbmRsZXIuZ3VpZD1uLmd1aWQpKSxpP3Auc3BsaWNlKHAuZGVsZWdhdGVDb3VudCsrLDAsYyk6cC5wdXNoKGMpLFMuZXZlbnQuZ2xvYmFsW2RdPSEwKX19LHJlbW92ZTpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLHAsZCxoLGcsdj1ZLmhhc0RhdGEoZSkmJlkuZ2V0KGUpO2lmKHYmJih1PXYuZXZlbnRzKSl7bD0odD0odHx8IiIpLm1hdGNoKFApfHxbIiJdKS5sZW5ndGg7d2hpbGUobC0tKWlmKGQ9Zz0ocz1UZS5leGVjKHRbbF0pfHxbXSlbMV0saD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGQpe2Y9Uy5ldmVudC5zcGVjaWFsW2RdfHx7fSxwPXVbZD0ocj9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZF18fFtdLHM9c1syXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIraC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxhPW89cC5sZW5ndGg7d2hpbGUoby0tKWM9cFtvXSwhaSYmZyE9PWMub3JpZ1R5cGV8fG4mJm4uZ3VpZCE9PWMuZ3VpZHx8cyYmIXMudGVzdChjLm5hbWVzcGFjZSl8fHImJnIhPT1jLnNlbGVjdG9yJiYoIioqIiE9PXJ8fCFjLnNlbGVjdG9yKXx8KHAuc3BsaWNlKG8sMSksYy5zZWxlY3RvciYmcC5kZWxlZ2F0ZUNvdW50LS0sZi5yZW1vdmUmJmYucmVtb3ZlLmNhbGwoZSxjKSk7YSYmIXAubGVuZ3RoJiYoZi50ZWFyZG93biYmITEhPT1mLnRlYXJkb3duLmNhbGwoZSxoLHYuaGFuZGxlKXx8Uy5yZW1vdmVFdmVudChlLGQsdi5oYW5kbGUpLGRlbGV0ZSB1W2RdKX1lbHNlIGZvcihkIGluIHUpUy5ldmVudC5yZW1vdmUoZSxkK3RbbF0sbixyLCEwKTtTLmlzRW1wdHlPYmplY3QodSkmJlkucmVtb3ZlKGUsImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYSxzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSx1PVMuZXZlbnQuZml4KGUpLGw9KFkuZ2V0KHRoaXMsImV2ZW50cyIpfHxPYmplY3QuY3JlYXRlKG51bGwpKVt1LnR5cGVdfHxbXSxjPVMuZXZlbnQuc3BlY2lhbFt1LnR5cGVdfHx7fTtmb3Ioc1swXT11LHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXNbdF09YXJndW1lbnRzW3RdO2lmKHUuZGVsZWdhdGVUYXJnZXQ9dGhpcywhYy5wcmVEaXNwYXRjaHx8ITEhPT1jLnByZURpc3BhdGNoLmNhbGwodGhpcyx1KSl7YT1TLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyx1LGwpLHQ9MDt3aGlsZSgoaT1hW3QrK10pJiYhdS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXt1LmN1cnJlbnRUYXJnZXQ9aS5lbGVtLG49MDt3aGlsZSgobz1pLmhhbmRsZXJzW24rK10pJiYhdS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKXUucm5hbWVzcGFjZSYmITEhPT1vLm5hbWVzcGFjZSYmIXUucm5hbWVzcGFjZS50ZXN0KG8ubmFtZXNwYWNlKXx8KHUuaGFuZGxlT2JqPW8sdS5kYXRhPW8uZGF0YSx2b2lkIDAhPT0ocj0oKFMuZXZlbnQuc3BlY2lhbFtvLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8by5oYW5kbGVyKS5hcHBseShpLmVsZW0scykpJiYhMT09PSh1LnJlc3VsdD1yKSYmKHUucHJldmVudERlZmF1bHQoKSx1LnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGMucG9zdERpc3BhdGNoJiZjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsdSksdS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz1bXSx1PXQuZGVsZWdhdGVDb3VudCxsPWUudGFyZ2V0O2lmKHUmJmwubm9kZVR5cGUmJiEoImNsaWNrIj09PWUudHlwZSYmMTw9ZS5idXR0b24pKWZvcig7bCE9PXRoaXM7bD1sLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWwubm9kZVR5cGUmJigiY2xpY2siIT09ZS50eXBlfHwhMCE9PWwuZGlzYWJsZWQpKXtmb3Iobz1bXSxhPXt9LG49MDtuPHU7bisrKXZvaWQgMD09PWFbaT0ocj10W25dKS5zZWxlY3RvcisiICJdJiYoYVtpXT1yLm5lZWRzQ29udGV4dD8tMTxTKGksdGhpcykuaW5kZXgobCk6Uy5maW5kKGksdGhpcyxudWxsLFtsXSkubGVuZ3RoKSxhW2ldJiZvLnB1c2gocik7by5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOm99KX1yZXR1cm4gbD10aGlzLHU8dC5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOnQuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KFMuRXZlbnQucHJvdG90eXBlLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDptKGUpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiBlKHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbdF19LHNldDpmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSl9fSl9LGZpeDpmdW5jdGlvbihlKXtyZXR1cm4gZVtTLmV4cGFuZG9dP2U6bmV3IFMuRXZlbnQoZSl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxjbGljazp7c2V0dXA6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc3x8ZTtyZXR1cm4gcGUudGVzdCh0LnR5cGUpJiZ0LmNsaWNrJiZBKHQsImlucHV0IikmJkFlKHQsImNsaWNrIixDZSksITF9LHRyaWdnZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc3x8ZTtyZXR1cm4gcGUudGVzdCh0LnR5cGUpJiZ0LmNsaWNrJiZBKHQsImlucHV0IikmJkFlKHQsImNsaWNrIiksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0O3JldHVybiBwZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJkEodCwiaW5wdXQiKSYmWS5nZXQodCwiY2xpY2siKXx8QSh0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXt2b2lkIDAhPT1lLnJlc3VsdCYmZS5vcmlnaW5hbEV2ZW50JiYoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWUucmVzdWx0KX19fX0sUy5yZW1vdmVFdmVudD1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX0sUy5FdmVudD1mdW5jdGlvbihlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFMuRXZlbnQpKXJldHVybiBuZXcgUy5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWUuZGVmYXVsdFByZXZlbnRlZCYmITE9PT1lLnJldHVyblZhbHVlP0NlOkVlLHRoaXMudGFyZ2V0PWUudGFyZ2V0JiYzPT09ZS50YXJnZXQubm9kZVR5cGU/ZS50YXJnZXQucGFyZW50Tm9kZTplLnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9ZS5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT1lLHQmJlMuZXh0ZW5kKHRoaXMsdCksdGhpcy50aW1lU3RhbXA9ZSYmZS50aW1lU3RhbXB8fERhdGUubm93KCksdGhpc1tTLmV4cGFuZG9dPSEwfSxTLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6Uy5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6RWUsaXNQcm9wYWdhdGlvblN0b3BwZWQ6RWUsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6RWUsaXNTaW11bGF0ZWQ6ITEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Q2UsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9Q2UsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUNlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSxTLmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsImNoYXIiOiEwLGNvZGU6ITAsY2hhckNvZGU6ITAsa2V5OiEwLGtleUNvZGU6ITAsYnV0dG9uOiEwLGJ1dHRvbnM6ITAsY2xpZW50WDohMCxjbGllbnRZOiEwLG9mZnNldFg6ITAsb2Zmc2V0WTohMCxwb2ludGVySWQ6ITAscG9pbnRlclR5cGU6ITAsc2NyZWVuWDohMCxzY3JlZW5ZOiEwLHRhcmdldFRvdWNoZXM6ITAsdG9FbGVtZW50OiEwLHRvdWNoZXM6ITAsd2hpY2g6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5idXR0b247cmV0dXJuIG51bGw9PWUud2hpY2gmJmJlLnRlc3QoZS50eXBlKT9udWxsIT1lLmNoYXJDb2RlP2UuY2hhckNvZGU6ZS5rZXlDb2RlOiFlLndoaWNoJiZ2b2lkIDAhPT10JiZ3ZS50ZXN0KGUudHlwZSk/MSZ0PzE6MiZ0PzM6NCZ0PzI6MDplLndoaWNofX0sUy5ldmVudC5hZGRQcm9wKSxTLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGUsdCl7Uy5ldmVudC5zcGVjaWFsW2VdPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBBZSh0aGlzLGUsU2UpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIEFlKHRoaXMsZSksITB9LGRlbGVnYXRlVHlwZTp0fX0pLFMuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oZSxpKXtTLmV2ZW50LnNwZWNpYWxbZV09e2RlbGVnYXRlVHlwZTppLGJpbmRUeXBlOmksaGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5yZWxhdGVkVGFyZ2V0LHI9ZS5oYW5kbGVPYmo7cmV0dXJuIG4mJihuPT09dGhpc3x8Uy5jb250YWlucyh0aGlzLG4pKXx8KGUudHlwZT1yLm9yaWdUeXBlLHQ9ci5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnR5cGU9aSksdH19fSksUy5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBrZSh0aGlzLGUsdCxuLHIpfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGtlKHRoaXMsZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLFMoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PXQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0fHwobj10LHQ9dm9pZCAwKSwhMT09PW4mJihuPUVlKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LnJlbW92ZSh0aGlzLGUsbix0KX0pfX0pO3ZhciBOZT0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxEZT0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxqZT0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2c7ZnVuY3Rpb24gcWUoZSx0KXtyZXR1cm4gQShlLCJ0YWJsZSIpJiZBKDExIT09dC5ub2RlVHlwZT90OnQuZmlyc3RDaGlsZCwidHIiKSYmUyhlKS5jaGlsZHJlbigidGJvZHkiKVswXXx8ZX1mdW5jdGlvbiBMZShlKXtyZXR1cm4gZS50eXBlPShudWxsIT09ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2UudHlwZSxlfWZ1bmN0aW9uIEhlKGUpe3JldHVybiJ0cnVlLyI9PT0oZS50eXBlfHwiIikuc2xpY2UoMCw1KT9lLnR5cGU9ZS50eXBlLnNsaWNlKDUpOmUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksZX1mdW5jdGlvbiBPZShlLHQpe3ZhciBuLHIsaSxvLGEscztpZigxPT09dC5ub2RlVHlwZSl7aWYoWS5oYXNEYXRhKGUpJiYocz1ZLmdldChlKS5ldmVudHMpKWZvcihpIGluIFkucmVtb3ZlKHQsImhhbmRsZSBldmVudHMiKSxzKWZvcihuPTAscj1zW2ldLmxlbmd0aDtuPHI7bisrKVMuZXZlbnQuYWRkKHQsaSxzW2ldW25dKTtRLmhhc0RhdGEoZSkmJihvPVEuYWNjZXNzKGUpLGE9Uy5leHRlbmQoe30sbyksUS5zZXQodCxhKSl9fWZ1bmN0aW9uIFBlKG4scixpLG8pe3I9ZyhyKTt2YXIgZSx0LGEscyx1LGwsYz0wLGY9bi5sZW5ndGgscD1mLTEsZD1yWzBdLGg9bShkKTtpZihofHwxPGYmJiJzdHJpbmciPT10eXBlb2YgZCYmIXkuY2hlY2tDbG9uZSYmRGUudGVzdChkKSlyZXR1cm4gbi5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PW4uZXEoZSk7aCYmKHJbMF09ZC5jYWxsKHRoaXMsZSx0Lmh0bWwoKSkpLFBlKHQscixpLG8pfSk7aWYoZiYmKHQ9KGU9eGUocixuWzBdLm93bmVyRG9jdW1lbnQsITEsbixvKSkuZmlyc3RDaGlsZCwxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aCYmKGU9dCksdHx8bykpe2ZvcihzPShhPVMubWFwKHZlKGUsInNjcmlwdCIpLExlKSkubGVuZ3RoO2M8ZjtjKyspdT1lLGMhPT1wJiYodT1TLmNsb25lKHUsITAsITApLHMmJlMubWVyZ2UoYSx2ZSh1LCJzY3JpcHQiKSkpLGkuY2FsbChuW2NdLHUsYyk7aWYocylmb3IobD1hW2EubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsUy5tYXAoYSxIZSksYz0wO2M8cztjKyspdT1hW2NdLGhlLnRlc3QodS50eXBlfHwiIikmJiFZLmFjY2Vzcyh1LCJnbG9iYWxFdmFsIikmJlMuY29udGFpbnMobCx1KSYmKHUuc3JjJiYibW9kdWxlIiE9PSh1LnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpP1MuX2V2YWxVcmwmJiF1Lm5vTW9kdWxlJiZTLl9ldmFsVXJsKHUuc3JjLHtub25jZTp1Lm5vbmNlfHx1LmdldEF0dHJpYnV0ZSgibm9uY2UiKX0sbCk6Yih1LnRleHRDb250ZW50LnJlcGxhY2UoamUsIiIpLHUsbCkpfXJldHVybiBufWZ1bmN0aW9uIFJlKGUsdCxuKXtmb3IodmFyIHIsaT10P1MuZmlsdGVyKHQsZSk6ZSxvPTA7bnVsbCE9KHI9aVtvXSk7bysrKW58fDEhPT1yLm5vZGVUeXBlfHxTLmNsZWFuRGF0YSh2ZShyKSksci5wYXJlbnROb2RlJiYobiYmaWUocikmJnllKHZlKHIsInNjcmlwdCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiBlfVMuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYz1lLmNsb25lTm9kZSghMCksZj1pZShlKTtpZighKHkubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fFMuaXNYTUxEb2MoZSkpKWZvcihhPXZlKGMpLHI9MCxpPShvPXZlKGUpKS5sZW5ndGg7cjxpO3IrKylzPW9bcl0sdT1hW3JdLHZvaWQgMCwiaW5wdXQiPT09KGw9dS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSYmcGUudGVzdChzLnR5cGUpP3UuY2hlY2tlZD1zLmNoZWNrZWQ6ImlucHV0IiE9PWwmJiJ0ZXh0YXJlYSIhPT1sfHwodS5kZWZhdWx0VmFsdWU9cy5kZWZhdWx0VmFsdWUpO2lmKHQpaWYobilmb3Iobz1vfHx2ZShlKSxhPWF8fHZlKGMpLHI9MCxpPW8ubGVuZ3RoO3I8aTtyKyspT2Uob1tyXSxhW3JdKTtlbHNlIE9lKGUsYyk7cmV0dXJuIDA8KGE9dmUoYywic2NyaXB0IikpLmxlbmd0aCYmeWUoYSwhZiYmdmUoZSwic2NyaXB0IikpLGN9LGNsZWFuRGF0YTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbixyLGk9Uy5ldmVudC5zcGVjaWFsLG89MDt2b2lkIDAhPT0obj1lW29dKTtvKyspaWYoVihuKSl7aWYodD1uW1kuZXhwYW5kb10pe2lmKHQuZXZlbnRzKWZvcihyIGluIHQuZXZlbnRzKWlbcl0/Uy5ldmVudC5yZW1vdmUobixyKTpTLnJlbW92ZUV2ZW50KG4scix0LmhhbmRsZSk7bltZLmV4cGFuZG9dPXZvaWQgMH1uW1EuZXhwYW5kb10mJihuW1EuZXhwYW5kb109dm9pZCAwKX19fSksUy5mbi5leHRlbmQoe2RldGFjaDpmdW5jdGlvbihlKXtyZXR1cm4gUmUodGhpcyxlLCEwKX0scmVtb3ZlOmZ1bmN0aW9uKGUpe3JldHVybiBSZSh0aGlzLGUpfSx0ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/Uy50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fCh0aGlzLnRleHRDb250ZW50PWUpfSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIFBlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHxxZSh0aGlzLGUpLmFwcGVuZENoaWxkKGUpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gUGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciB0PXFlKHRoaXMsZSk7dC5pbnNlcnRCZWZvcmUoZSx0LmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gUGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gUGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD0wO251bGwhPShlPXRoaXNbdF0pO3QrKykxPT09ZS5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKHZlKGUsITEpKSxlLnRleHRDb250ZW50PSIiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1udWxsIT1lJiZlLHQ9bnVsbD09dD9lOnQsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gUy5jbG9uZSh0aGlzLGUsdCl9KX0saHRtbDpmdW5jdGlvbihlKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWUmJjE9PT10Lm5vZGVUeXBlKXJldHVybiB0LmlubmVySFRNTDtpZigic3RyaW5nIj09dHlwZW9mIGUmJiFOZS50ZXN0KGUpJiYhZ2VbKGRlLmV4ZWMoZSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXtlPVMuaHRtbFByZWZpbHRlcihlKTt0cnl7Zm9yKDtuPHI7bisrKTE9PT0odD10aGlzW25dfHx7fSkubm9kZVR5cGUmJihTLmNsZWFuRGF0YSh2ZSh0LCExKSksdC5pbm5lckhUTUw9ZSk7dD0wfWNhdGNoKGUpe319dCYmdGhpcy5lbXB0eSgpLmFwcGVuZChlKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBuPVtdO3JldHVybiBQZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7Uy5pbkFycmF5KHRoaXMsbik8MCYmKFMuY2xlYW5EYXRhKHZlKHRoaXMpKSx0JiZ0LnJlcGxhY2VDaGlsZChlLHRoaXMpKX0sbil9fSksUy5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oZSxhKXtTLmZuW2VdPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPVtdLHI9UyhlKSxpPXIubGVuZ3RoLTEsbz0wO288PWk7bysrKXQ9bz09PWk/dGhpczp0aGlzLmNsb25lKCEwKSxTKHJbb10pW2FdKHQpLHUuYXBwbHkobix0LmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobil9fSk7dmFyIE1lPW5ldyBSZWdFeHAoIl4oIitlZSsiKSg/IXB4KVthLXolXSskIiwiaSIpLEllPWZ1bmN0aW9uKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gdCYmdC5vcGVuZXJ8fCh0PUMpLHQuZ2V0Q29tcHV0ZWRTdHlsZShlKX0sV2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fTtmb3IoaSBpbiB0KW9baV09ZS5zdHlsZVtpXSxlLnN0eWxlW2ldPXRbaV07Zm9yKGkgaW4gcj1uLmNhbGwoZSksdCllLnN0eWxlW2ldPW9baV07cmV0dXJuIHJ9LEZlPW5ldyBSZWdFeHAobmUuam9pbigifCIpLCJpIik7ZnVuY3Rpb24gQmUoZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5zdHlsZTtyZXR1cm4obj1ufHxJZShlKSkmJigiIiE9PShhPW4uZ2V0UHJvcGVydHlWYWx1ZSh0KXx8blt0XSl8fGllKGUpfHwoYT1TLnN0eWxlKGUsdCkpLCF5LnBpeGVsQm94U3R5bGVzKCkmJk1lLnRlc3QoYSkmJkZlLnRlc3QodCkmJihyPXMud2lkdGgsaT1zLm1pbldpZHRoLG89cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1pLHMubWF4V2lkdGg9bykpLHZvaWQgMCE9PWE/YSsiIjphfWZ1bmN0aW9uICRlKGUsdCl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCFlKCkpcmV0dXJuKHRoaXMuZ2V0PXQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX0hZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7aWYobCl7dS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIixsLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSUiLHJlLmFwcGVuZENoaWxkKHUpLmFwcGVuZENoaWxkKGwpO3ZhciBlPUMuZ2V0Q29tcHV0ZWRTdHlsZShsKTtuPSIxJSIhPT1lLnRvcCxzPTEyPT09dChlLm1hcmdpbkxlZnQpLGwuc3R5bGUucmlnaHQ9IjYwJSIsbz0zNj09PXQoZS5yaWdodCkscj0zNj09PXQoZS53aWR0aCksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGk9MTI9PT10KGwub2Zmc2V0V2lkdGgvMykscmUucmVtb3ZlQ2hpbGQodSksbD1udWxsfX1mdW5jdGlvbiB0KGUpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpfXZhciBuLHIsaSxvLGEscyx1PUUuY3JlYXRlRWxlbWVudCgiZGl2IiksbD1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuc3R5bGUmJihsLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsbC5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLHkuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1sLnN0eWxlLmJhY2tncm91bmRDbGlwLFMuZXh0ZW5kKHkse2JveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxyfSxwaXhlbEJveFN0eWxlczpmdW5jdGlvbigpe3JldHVybiBlKCksb30scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBlKCksbn0scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxzfSxzY3JvbGxib3hTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxpfSxyZWxpYWJsZVRyRGltZW5zaW9uczpmdW5jdGlvbigpe3ZhciBlLHQsbixyO3JldHVybiBudWxsPT1hJiYoZT1FLmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksdD1FLmNyZWF0ZUVsZW1lbnQoInRyIiksbj1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweCIsdC5zdHlsZS5oZWlnaHQ9IjFweCIsbi5zdHlsZS5oZWlnaHQ9IjlweCIscmUuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQodCkuYXBwZW5kQ2hpbGQobikscj1DLmdldENvbXB1dGVkU3R5bGUodCksYT0zPHBhcnNlSW50KHIuaGVpZ2h0KSxyZS5yZW1vdmVDaGlsZChlKSksYX19KSl9KCk7dmFyIF9lPVsiV2Via2l0IiwiTW96IiwibXMiXSx6ZT1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLFVlPXt9O2Z1bmN0aW9uIFhlKGUpe3ZhciB0PVMuY3NzUHJvcHNbZV18fFVlW2VdO3JldHVybiB0fHwoZSBpbiB6ZT9lOlVlW2VdPWZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLG49X2UubGVuZ3RoO3doaWxlKG4tLSlpZigoZT1fZVtuXSt0KWluIHplKXJldHVybiBlfShlKXx8ZSl9dmFyIFZlPS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxHZT0vXi0tLyxZZT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sUWU9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9O2Z1bmN0aW9uIEplKGUsdCxuKXt2YXIgcj10ZS5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTp0fWZ1bmN0aW9uIEtlKGUsdCxuLHIsaSxvKXt2YXIgYT0id2lkdGgiPT09dD8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPVMuY3NzKGUsbituZVthXSwhMCxpKSkscj8oImNvbnRlbnQiPT09biYmKHUtPVMuY3NzKGUsInBhZGRpbmciK25lW2FdLCEwLGkpKSwibWFyZ2luIiE9PW4mJih1LT1TLmNzcyhlLCJib3JkZXIiK25lW2FdKyJXaWR0aCIsITAsaSkpKToodSs9Uy5jc3MoZSwicGFkZGluZyIrbmVbYV0sITAsaSksInBhZGRpbmciIT09bj91Kz1TLmNzcyhlLCJib3JkZXIiK25lW2FdKyJXaWR0aCIsITAsaSk6cys9Uy5jc3MoZSwiYm9yZGVyIituZVthXSsiV2lkdGgiLCEwLGkpKTtyZXR1cm4hciYmMDw9byYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLW8tdS1zLS41KSl8fDApLHV9ZnVuY3Rpb24gWmUoZSx0LG4pe3ZhciByPUllKGUpLGk9KCF5LmJveFNpemluZ1JlbGlhYmxlKCl8fG4pJiYiYm9yZGVyLWJveCI9PT1TLmNzcyhlLCJib3hTaXppbmciLCExLHIpLG89aSxhPUJlKGUsdCxyKSxzPSJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2lmKE1lLnRlc3QoYSkpe2lmKCFuKXJldHVybiBhO2E9ImF1dG8ifXJldHVybigheS5ib3hTaXppbmdSZWxpYWJsZSgpJiZpfHwheS5yZWxpYWJsZVRyRGltZW5zaW9ucygpJiZBKGUsInRyIil8fCJhdXRvIj09PWF8fCFwYXJzZUZsb2F0KGEpJiYiaW5saW5lIj09PVMuY3NzKGUsImRpc3BsYXkiLCExLHIpKSYmZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmKGk9ImJvcmRlci1ib3giPT09Uy5jc3MoZSwiYm94U2l6aW5nIiwhMSxyKSwobz1zIGluIGUpJiYoYT1lW3NdKSksKGE9cGFyc2VGbG9hdChhKXx8MCkrS2UoZSx0LG58fChpPyJib3JkZXIiOiJjb250ZW50IiksbyxyLGEpKyJweCJ9ZnVuY3Rpb24gZXQoZSx0LG4scixpKXtyZXR1cm4gbmV3IGV0LnByb3RvdHlwZS5pbml0KGUsdCxuLHIsaSl9Uy5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oZSx0KXtpZih0KXt2YXIgbj1CZShlLCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1uPyIxIjpufX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGNvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxncmlkQXJlYTohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3RhcnQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBpLG8sYSxzPVgodCksdT1HZS50ZXN0KHQpLGw9ZS5zdHlsZTtpZih1fHwodD1YZShzKSksYT1TLmNzc0hvb2tzW3RdfHxTLmNzc0hvb2tzW3NdLHZvaWQgMD09PW4pcmV0dXJuIGEmJiJnZXQiaW4gYSYmdm9pZCAwIT09KGk9YS5nZXQoZSwhMSxyKSk/aTpsW3RdOyJzdHJpbmciPT09KG89dHlwZW9mIG4pJiYoaT10ZS5leGVjKG4pKSYmaVsxXSYmKG49c2UoZSx0LGkpLG89Im51bWJlciIpLG51bGwhPW4mJm49PW4mJigibnVtYmVyIiE9PW98fHV8fChuKz1pJiZpWzNdfHwoUy5jc3NOdW1iZXJbc10/IiI6InB4IikpLHkuY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT10LmluZGV4T2YoImJhY2tncm91bmQiKXx8KGxbdF09ImluaGVyaXQiKSxhJiYic2V0ImluIGEmJnZvaWQgMD09PShuPWEuc2V0KGUsbixyKSl8fCh1P2wuc2V0UHJvcGVydHkodCxuKTpsW3RdPW4pKX19LGNzczpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1YKHQpO3JldHVybiBHZS50ZXN0KHQpfHwodD1YZShzKSksKGE9Uy5jc3NIb29rc1t0XXx8Uy5jc3NIb29rc1tzXSkmJiJnZXQiaW4gYSYmKGk9YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09aSYmKGk9QmUoZSx0LHIpKSwibm9ybWFsIj09PWkmJnQgaW4gUWUmJihpPVFlW3RdKSwiIj09PW58fG4/KG89cGFyc2VGbG9hdChpKSwhMD09PW58fGlzRmluaXRlKG8pP298fDA6aSk6aX19KSxTLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGUsdSl7Uy5jc3NIb29rc1t1XT17Z2V0OmZ1bmN0aW9uKGUsdCxuKXtpZih0KXJldHVybiFWZS50ZXN0KFMuY3NzKGUsImRpc3BsYXkiKSl8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/WmUoZSx1LG4pOldlKGUsWWUsZnVuY3Rpb24oKXtyZXR1cm4gWmUoZSx1LG4pfSl9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1JZShlKSxvPSF5LnNjcm9sbGJveFNpemUoKSYmImFic29sdXRlIj09PWkucG9zaXRpb24sYT0ob3x8bikmJiJib3JkZXItYm94Ij09PVMuY3NzKGUsImJveFNpemluZyIsITEsaSkscz1uP0tlKGUsdSxuLGEsaSk6MDtyZXR1cm4gYSYmbyYmKHMtPU1hdGguY2VpbChlWyJvZmZzZXQiK3VbMF0udG9VcHBlckNhc2UoKSt1LnNsaWNlKDEpXS1wYXJzZUZsb2F0KGlbdV0pLUtlKGUsdSwiYm9yZGVyIiwhMSxpKS0uNSkpLHMmJihyPXRlLmV4ZWModCkpJiYicHgiIT09KHJbM118fCJweCIpJiYoZS5zdHlsZVt1XT10LHQ9Uy5jc3MoZSx1KSksSmUoMCx0LHMpfX19KSxTLmNzc0hvb2tzLm1hcmdpbkxlZnQ9JGUoeS5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24oZSx0KXtpZih0KXJldHVybihwYXJzZUZsb2F0KEJlKGUsIm1hcmdpbkxlZnQiKSl8fGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1XZShlLHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksUy5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oaSxvKXtTLmNzc0hvb2tzW2krb109e2V4cGFuZDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXt9LHI9InN0cmluZyI9PXR5cGVvZiBlP2Uuc3BsaXQoIiAiKTpbZV07dDw0O3QrKyluW2krbmVbdF0rb109clt0XXx8clt0LTJdfHxyWzBdO3JldHVybiBufX0sIm1hcmdpbiIhPT1pJiYoUy5jc3NIb29rc1tpK29dLnNldD1KZSl9KSxTLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXt9LGE9MDtpZihBcnJheS5pc0FycmF5KHQpKXtmb3Iocj1JZShlKSxpPXQubGVuZ3RoO2E8aTthKyspb1t0W2FdXT1TLmNzcyhlLHRbYV0sITEscik7cmV0dXJuIG99cmV0dXJuIHZvaWQgMCE9PW4/Uy5zdHlsZShlLHQsbik6Uy5jc3MoZSx0KX0sZSx0LDE8YXJndW1lbnRzLmxlbmd0aCl9fSksKChTLlR3ZWVuPWV0KS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmV0LGluaXQ6ZnVuY3Rpb24oZSx0LG4scixpLG8pe3RoaXMuZWxlbT1lLHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPWl8fFMuZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz10LHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1vfHwoUy5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPWV0LnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBlJiZlLmdldD9lLmdldCh0aGlzKTpldC5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj1ldC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPXQ9Uy5lYXNpbmdbdGhpcy5lYXNpbmddKGUsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9dD1lLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0K3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLG4mJm4uc2V0P24uc2V0KHRoaXMpOmV0LnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319KS5pbml0LnByb3RvdHlwZT1ldC5wcm90b3R5cGUsKGV0LnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gMSE9PWUuZWxlbS5ub2RlVHlwZXx8bnVsbCE9ZS5lbGVtW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtlLnByb3BdP2UuZWxlbVtlLnByb3BdOih0PVMuY3NzKGUuZWxlbSxlLnByb3AsIiIpKSYmImF1dG8iIT09dD90OjB9LHNldDpmdW5jdGlvbihlKXtTLmZ4LnN0ZXBbZS5wcm9wXT9TLmZ4LnN0ZXBbZS5wcm9wXShlKToxIT09ZS5lbGVtLm5vZGVUeXBlfHwhUy5jc3NIb29rc1tlLnByb3BdJiZudWxsPT1lLmVsZW0uc3R5bGVbWGUoZS5wcm9wKV0/ZS5lbGVtW2UucHJvcF09ZS5ub3c6Uy5zdHlsZShlLmVsZW0sZS5wcm9wLGUubm93K2UudW5pdCl9fX0pLnNjcm9sbFRvcD1ldC5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSxTLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxzd2luZzpmdW5jdGlvbihlKXtyZXR1cm4uNS1NYXRoLmNvcyhlKk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LFMuZng9ZXQucHJvdG90eXBlLmluaXQsUy5meC5zdGVwPXt9O3ZhciB0dCxudCxydCxpdCxvdD0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sYXQ9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBzdCgpe250JiYoITE9PT1FLmhpZGRlbiYmQy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/Qy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3QpOkMuc2V0VGltZW91dChzdCxTLmZ4LmludGVydmFsKSxTLmZ4LnRpY2soKSl9ZnVuY3Rpb24gdXQoKXtyZXR1cm4gQy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHQ9dm9pZCAwfSksdHQ9RGF0ZS5ub3coKX1mdW5jdGlvbiBsdChlLHQpe3ZhciBuLHI9MCxpPXtoZWlnaHQ6ZX07Zm9yKHQ9dD8xOjA7cjw0O3IrPTItdClpWyJtYXJnaW4iKyhuPW5lW3JdKV09aVsicGFkZGluZyIrbl09ZTtyZXR1cm4gdCYmKGkub3BhY2l0eT1pLndpZHRoPWUpLGl9ZnVuY3Rpb24gY3QoZSx0LG4pe2Zvcih2YXIgcixpPShmdC50d2VlbmVyc1t0XXx8W10pLmNvbmNhdChmdC50d2VlbmVyc1siKiJdKSxvPTAsYT1pLmxlbmd0aDtvPGE7bysrKWlmKHI9aVtvXS5jYWxsKG4sdCxlKSlyZXR1cm4gcn1mdW5jdGlvbiBmdChvLGUsdCl7dmFyIG4sYSxyPTAsaT1mdC5wcmVmaWx0ZXJzLmxlbmd0aCxzPVMuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKGEpcmV0dXJuITE7Zm9yKHZhciBlPXR0fHx1dCgpLHQ9TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLWUpLG49MS0odC9sLmR1cmF0aW9ufHwwKSxyPTAsaT1sLnR3ZWVucy5sZW5ndGg7cjxpO3IrKylsLnR3ZWVuc1tyXS5ydW4obik7cmV0dXJuIHMubm90aWZ5V2l0aChvLFtsLG4sdF0pLG48MSYmaT90OihpfHxzLm5vdGlmeVdpdGgobyxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKG8sW2xdKSwhMSl9LGw9cy5wcm9taXNlKHtlbGVtOm8scHJvcHM6Uy5leHRlbmQoe30sZSksb3B0czpTLmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6Uy5lYXNpbmcuX2RlZmF1bHR9LHQpLG9yaWdpbmFsUHJvcGVydGllczplLG9yaWdpbmFsT3B0aW9uczp0LHN0YXJ0VGltZTp0dHx8dXQoKSxkdXJhdGlvbjp0LmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihlLHQpe3ZhciBuPVMuVHdlZW4obyxsLm9wdHMsZSx0LGwub3B0cy5zcGVjaWFsRWFzaW5nW2VdfHxsLm9wdHMuZWFzaW5nKTtyZXR1cm4gbC50d2VlbnMucHVzaChuKSxufSxzdG9wOmZ1bmN0aW9uKGUpe3ZhciB0PTAsbj1lP2wudHdlZW5zLmxlbmd0aDowO2lmKGEpcmV0dXJuIHRoaXM7Zm9yKGE9ITA7dDxuO3QrKylsLnR3ZWVuc1t0XS5ydW4oMSk7cmV0dXJuIGU/KHMubm90aWZ5V2l0aChvLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgobyxbbCxlXSkpOnMucmVqZWN0V2l0aChvLFtsLGVdKSx0aGlzfX0pLGM9bC5wcm9wcztmb3IoIWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYTtmb3IobiBpbiBlKWlmKGk9dFtyPVgobildLG89ZVtuXSxBcnJheS5pc0FycmF5KG8pJiYoaT1vWzFdLG89ZVtuXT1vWzBdKSxuIT09ciYmKGVbcl09byxkZWxldGUgZVtuXSksKGE9Uy5jc3NIb29rc1tyXSkmJiJleHBhbmQiaW4gYSlmb3IobiBpbiBvPWEuZXhwYW5kKG8pLGRlbGV0ZSBlW3JdLG8pbiBpbiBlfHwoZVtuXT1vW25dLHRbbl09aSk7ZWxzZSB0W3JdPWl9KGMsbC5vcHRzLnNwZWNpYWxFYXNpbmcpO3I8aTtyKyspaWYobj1mdC5wcmVmaWx0ZXJzW3JdLmNhbGwobCxvLGMsbC5vcHRzKSlyZXR1cm4gbShuLnN0b3ApJiYoUy5fcXVldWVIb29rcyhsLmVsZW0sbC5vcHRzLnF1ZXVlKS5zdG9wPW4uc3RvcC5iaW5kKG4pKSxuO3JldHVybiBTLm1hcChjLGN0LGwpLG0obC5vcHRzLnN0YXJ0KSYmbC5vcHRzLnN0YXJ0LmNhbGwobyxsKSxsLnByb2dyZXNzKGwub3B0cy5wcm9ncmVzcykuZG9uZShsLm9wdHMuZG9uZSxsLm9wdHMuY29tcGxldGUpLmZhaWwobC5vcHRzLmZhaWwpLmFsd2F5cyhsLm9wdHMuYWx3YXlzKSxTLmZ4LnRpbWVyKFMuZXh0ZW5kKHUse2VsZW06byxhbmltOmwscXVldWU6bC5vcHRzLnF1ZXVlfSkpLGx9Uy5BbmltYXRpb249Uy5leHRlbmQoZnQse3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpO3JldHVybiBzZShuLmVsZW0sZSx0ZS5leGVjKHQpLG4pLG59XX0sdHdlZW5lcjpmdW5jdGlvbihlLHQpe20oZSk/KHQ9ZSxlPVsiKiJdKTplPWUubWF0Y2goUCk7Zm9yKHZhciBuLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspbj1lW3JdLGZ0LnR3ZWVuZXJzW25dPWZ0LnR3ZWVuZXJzW25dfHxbXSxmdC50d2VlbmVyc1tuXS51bnNoaWZ0KHQpfSxwcmVmaWx0ZXJzOltmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYyxmPSJ3aWR0aCJpbiB0fHwiaGVpZ2h0ImluIHQscD10aGlzLGQ9e30saD1lLnN0eWxlLGc9ZS5ub2RlVHlwZSYmYWUoZSksdj1ZLmdldChlLCJmeHNob3ciKTtmb3IociBpbiBuLnF1ZXVlfHwobnVsbD09KGE9Uy5fcXVldWVIb29rcyhlLCJmeCIpKS51bnF1ZXVlZCYmKGEudW5xdWV1ZWQ9MCxzPWEuZW1wdHkuZmlyZSxhLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXthLnVucXVldWVkfHxzKCl9KSxhLnVucXVldWVkKysscC5hbHdheXMoZnVuY3Rpb24oKXtwLmFsd2F5cyhmdW5jdGlvbigpe2EudW5xdWV1ZWQtLSxTLnF1ZXVlKGUsImZ4IikubGVuZ3RofHxhLmVtcHR5LmZpcmUoKX0pfSkpLHQpaWYoaT10W3JdLG90LnRlc3QoaSkpe2lmKGRlbGV0ZSB0W3JdLG89b3x8InRvZ2dsZSI9PT1pLGk9PT0oZz8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09aXx8IXZ8fHZvaWQgMD09PXZbcl0pY29udGludWU7Zz0hMH1kW3JdPXYmJnZbcl18fFMuc3R5bGUoZSxyKX1pZigodT0hUy5pc0VtcHR5T2JqZWN0KHQpKXx8IVMuaXNFbXB0eU9iamVjdChkKSlmb3IociBpbiBmJiYxPT09ZS5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2gub3ZlcmZsb3csaC5vdmVyZmxvd1gsaC5vdmVyZmxvd1ldLG51bGw9PShsPXYmJnYuZGlzcGxheSkmJihsPVkuZ2V0KGUsImRpc3BsYXkiKSksIm5vbmUiPT09KGM9Uy5jc3MoZSwiZGlzcGxheSIpKSYmKGw/Yz1sOihsZShbZV0sITApLGw9ZS5zdHlsZS5kaXNwbGF5fHxsLGM9Uy5jc3MoZSwiZGlzcGxheSIpLGxlKFtlXSkpKSwoImlubGluZSI9PT1jfHwiaW5saW5lLWJsb2NrIj09PWMmJm51bGwhPWwpJiYibm9uZSI9PT1TLmNzcyhlLCJmbG9hdCIpJiYodXx8KHAuZG9uZShmdW5jdGlvbigpe2guZGlzcGxheT1sfSksbnVsbD09bCYmKGM9aC5kaXNwbGF5LGw9Im5vbmUiPT09Yz8iIjpjKSksaC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKGgub3ZlcmZsb3c9ImhpZGRlbiIscC5hbHdheXMoZnVuY3Rpb24oKXtoLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0saC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxoLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITEsZCl1fHwodj8iaGlkZGVuImluIHYmJihnPXYuaGlkZGVuKTp2PVkuYWNjZXNzKGUsImZ4c2hvdyIse2Rpc3BsYXk6bH0pLG8mJih2LmhpZGRlbj0hZyksZyYmbGUoW2VdLCEwKSxwLmRvbmUoZnVuY3Rpb24oKXtmb3IociBpbiBnfHxsZShbZV0pLFkucmVtb3ZlKGUsImZ4c2hvdyIpLGQpUy5zdHlsZShlLHIsZFtyXSl9KSksdT1jdChnP3Zbcl06MCxyLHApLHIgaW4gdnx8KHZbcl09dS5zdGFydCxnJiYodS5lbmQ9dS5zdGFydCx1LnN0YXJ0PTApKX1dLHByZWZpbHRlcjpmdW5jdGlvbihlLHQpe3Q/ZnQucHJlZmlsdGVycy51bnNoaWZ0KGUpOmZ0LnByZWZpbHRlcnMucHVzaChlKX19KSxTLnNwZWVkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lJiYib2JqZWN0Ij09dHlwZW9mIGU/Uy5leHRlbmQoe30sZSk6e2NvbXBsZXRlOm58fCFuJiZ0fHxtKGUpJiZlLGR1cmF0aW9uOmUsZWFzaW5nOm4mJnR8fHQmJiFtKHQpJiZ0fTtyZXR1cm4gUy5meC5vZmY/ci5kdXJhdGlvbj0wOiJudW1iZXIiIT10eXBlb2Ygci5kdXJhdGlvbiYmKHIuZHVyYXRpb24gaW4gUy5meC5zcGVlZHM/ci5kdXJhdGlvbj1TLmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTpyLmR1cmF0aW9uPVMuZnguc3BlZWRzLl9kZWZhdWx0KSxudWxsIT1yLnF1ZXVlJiYhMCE9PXIucXVldWV8fChyLnF1ZXVlPSJmeCIpLHIub2xkPXIuY29tcGxldGUsci5jb21wbGV0ZT1mdW5jdGlvbigpe20oci5vbGQpJiZyLm9sZC5jYWxsKHRoaXMpLHIucXVldWUmJlMuZGVxdWV1ZSh0aGlzLHIucXVldWUpfSxyfSxTLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLmZpbHRlcihhZSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTp0fSxlLG4scil9LGFuaW1hdGU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9Uy5pc0VtcHR5T2JqZWN0KHQpLG89Uy5zcGVlZChlLG4sciksYT1mdW5jdGlvbigpe3ZhciBlPWZ0KHRoaXMsUy5leHRlbmQoe30sdCksbyk7KGl8fFkuZ2V0KHRoaXMsImZpbmlzaCIpKSYmZS5zdG9wKCEwKX07cmV0dXJuIGEuZmluaXNoPWEsaXx8ITE9PT1vLnF1ZXVlP3RoaXMuZWFjaChhKTp0aGlzLnF1ZXVlKG8ucXVldWUsYSl9LHN0b3A6ZnVuY3Rpb24oaSxlLG8pe3ZhciBhPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RvcDtkZWxldGUgZS5zdG9wLHQobyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgaSYmKG89ZSxlPWksaT12b2lkIDApLGUmJnRoaXMucXVldWUoaXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9ITAsdD1udWxsIT1pJiZpKyJxdWV1ZUhvb2tzIixuPVMudGltZXJzLHI9WS5nZXQodGhpcyk7aWYodClyW3RdJiZyW3RdLnN0b3AmJmEoclt0XSk7ZWxzZSBmb3IodCBpbiByKXJbdF0mJnJbdF0uc3RvcCYmYXQudGVzdCh0KSYmYShyW3RdKTtmb3IodD1uLmxlbmd0aDt0LS07KW5bdF0uZWxlbSE9PXRoaXN8fG51bGwhPWkmJm5bdF0ucXVldWUhPT1pfHwoblt0XS5hbmltLnN0b3AobyksZT0hMSxuLnNwbGljZSh0LDEpKTshZSYmb3x8Uy5kZXF1ZXVlKHRoaXMsaSl9KX0sZmluaXNoOmZ1bmN0aW9uKGEpe3JldHVybiExIT09YSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsdD1ZLmdldCh0aGlzKSxuPXRbYSsicXVldWUiXSxyPXRbYSsicXVldWVIb29rcyJdLGk9Uy50aW1lcnMsbz1uP24ubGVuZ3RoOjA7Zm9yKHQuZmluaXNoPSEwLFMucXVldWUodGhpcyxhLFtdKSxyJiZyLnN0b3AmJnIuc3RvcC5jYWxsKHRoaXMsITApLGU9aS5sZW5ndGg7ZS0tOylpW2VdLmVsZW09PT10aGlzJiZpW2VdLnF1ZXVlPT09YSYmKGlbZV0uYW5pbS5zdG9wKCEwKSxpLnNwbGljZShlLDEpKTtmb3IoZT0wO2U8bztlKyspbltlXSYmbltlXS5maW5pc2gmJm5bZV0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIHQuZmluaXNofSl9fSksUy5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHIpe3ZhciBpPVMuZm5bcl07Uy5mbltyXT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09dHlwZW9mIGU/aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGx0KHIsITApLGUsdCxuKX19KSxTLmVhY2goe3NsaWRlRG93bjpsdCgic2hvdyIpLHNsaWRlVXA6bHQoImhpZGUiKSxzbGlkZVRvZ2dsZTpsdCgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHIpe1MuZm5bZV09ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmFuaW1hdGUocixlLHQsbil9fSksUy50aW1lcnM9W10sUy5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsdD0wLG49Uy50aW1lcnM7Zm9yKHR0PURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8Uy5meC5zdG9wKCksdHQ9dm9pZCAwfSxTLmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe1MudGltZXJzLnB1c2goZSksUy5meC5zdGFydCgpfSxTLmZ4LmludGVydmFsPTEzLFMuZnguc3RhcnQ9ZnVuY3Rpb24oKXtudHx8KG50PSEwLHN0KCkpfSxTLmZ4LnN0b3A9ZnVuY3Rpb24oKXtudD1udWxsfSxTLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxTLmZuLmRlbGF5PWZ1bmN0aW9uKHIsZSl7cmV0dXJuIHI9Uy5meCYmUy5meC5zcGVlZHNbcl18fHIsZT1lfHwiZngiLHRoaXMucXVldWUoZSxmdW5jdGlvbihlLHQpe3ZhciBuPUMuc2V0VGltZW91dChlLHIpO3Quc3RvcD1mdW5jdGlvbigpe0MuY2xlYXJUaW1lb3V0KG4pfX0pfSxydD1FLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksaXQ9RS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChFLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxydC50eXBlPSJjaGVja2JveCIseS5jaGVja09uPSIiIT09cnQudmFsdWUseS5vcHRTZWxlY3RlZD1pdC5zZWxlY3RlZCwocnQ9RS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS52YWx1ZT0idCIscnQudHlwZT0icmFkaW8iLHkucmFkaW9WYWx1ZT0idCI9PT1ydC52YWx1ZTt2YXIgcHQsZHQ9Uy5leHByLmF0dHJIYW5kbGU7Uy5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJCh0aGlzLFMuYXR0cixlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5yZW1vdmVBdHRyKHRoaXMsZSl9KX19KSxTLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGUuZ2V0QXR0cmlidXRlP1MucHJvcChlLHQsbik6KDE9PT1vJiZTLmlzWE1MRG9jKGUpfHwoaT1TLmF0dHJIb29rc1t0LnRvTG93ZXJDYXNlKCldfHwoUy5leHByLm1hdGNoLmJvb2wudGVzdCh0KT9wdDp2b2lkIDApKSx2b2lkIDAhPT1uP251bGw9PT1uP3ZvaWQgUy5yZW1vdmVBdHRyKGUsdCk6aSYmInNldCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6KGUuc2V0QXR0cmlidXRlKHQsbisiIiksbik6aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjpudWxsPT0ocj1TLmZpbmQuYXR0cihlLHQpKT92b2lkIDA6cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIXkucmFkaW9WYWx1ZSYmInJhZGlvIj09PXQmJkEoZSwiaW5wdXQiKSl7dmFyIG49ZS52YWx1ZTtyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoInR5cGUiLHQpLG4mJihlLnZhbHVlPW4pLHR9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10JiZ0Lm1hdGNoKFApO2lmKGkmJjE9PT1lLm5vZGVUeXBlKXdoaWxlKG49aVtyKytdKWUucmVtb3ZlQXR0cmlidXRlKG4pfX0pLHB0PXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExPT09dD9TLnJlbW92ZUF0dHIoZSxuKTplLnNldEF0dHJpYnV0ZShuLG4pLG59fSxTLmVhY2goUy5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24oZSx0KXt2YXIgYT1kdFt0XXx8Uy5maW5kLmF0dHI7ZHRbdF09ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz10LnRvTG93ZXJDYXNlKCk7cmV0dXJuIG58fChpPWR0W29dLGR0W29dPXIscj1udWxsIT1hKGUsdCxuKT9vOm51bGwsZHRbb109aSkscn19KTt2YXIgaHQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxndD0vXig/OmF8YXJlYSkkL2k7ZnVuY3Rpb24gdnQoZSl7cmV0dXJuKGUubWF0Y2goUCl8fFtdKS5qb2luKCIgIil9ZnVuY3Rpb24geXQoZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24gbXQoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZToic3RyaW5nIj09dHlwZW9mIGUmJmUubWF0Y2goUCl8fFtdfVMuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJuICQodGhpcyxTLnByb3AsZSx0LDE8YXJndW1lbnRzLmxlbmd0aCl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW1MucHJvcEZpeFtlXXx8ZV19KX19KSxTLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4gMT09PW8mJlMuaXNYTUxEb2MoZSl8fCh0PVMucHJvcEZpeFt0XXx8dCxpPVMucHJvcEhvb2tzW3RdKSx2b2lkIDAhPT1uP2kmJiJzZXQiaW4gaSYmdm9pZCAwIT09KHI9aS5zZXQoZSxuLHQpKT9yOmVbdF09bjppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOmVbdF19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXt2YXIgdD1TLmZpbmQuYXR0cihlLCJ0YWJpbmRleCIpO3JldHVybiB0P3BhcnNlSW50KHQsMTApOmh0LnRlc3QoZS5ub2RlTmFtZSl8fGd0LnRlc3QoZS5ub2RlTmFtZSkmJmUuaHJlZj8wOi0xfX19LHByb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifX0pLHkub3B0U2VsZWN0ZWR8fChTLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfSxzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3QmJih0LnNlbGVjdGVkSW5kZXgsdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCl9fSksUy5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtTLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSksUy5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8sYSxzLHU9MDtpZihtKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS5hZGRDbGFzcyh0LmNhbGwodGhpcyxlLHl0KHRoaXMpKSl9KTtpZigoZT1tdCh0KSkubGVuZ3RoKXdoaWxlKG49dGhpc1t1KytdKWlmKGk9eXQobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK3Z0KGkpKyIgIil7YT0wO3doaWxlKG89ZVthKytdKXIuaW5kZXhPZigiICIrbysiICIpPDAmJihyKz1vKyIgIik7aSE9PShzPXZ0KHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLnJlbW92ZUNsYXNzKHQuY2FsbCh0aGlzLGUseXQodGhpcykpKX0pO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmF0dHIoImNsYXNzIiwiIik7aWYoKGU9bXQodCkpLmxlbmd0aCl3aGlsZShuPXRoaXNbdSsrXSlpZihpPXl0KG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit2dChpKSsiICIpe2E9MDt3aGlsZShvPWVbYSsrXSl3aGlsZSgtMTxyLmluZGV4T2YoIiAiK28rIiAiKSlyPXIucmVwbGFjZSgiICIrbysiICIsIiAiKTtpIT09KHM9dnQocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihpLHQpe3ZhciBvPXR5cGVvZiBpLGE9InN0cmluZyI9PT1vfHxBcnJheS5pc0FycmF5KGkpO3JldHVybiJib29sZWFuIj09dHlwZW9mIHQmJmE/dD90aGlzLmFkZENsYXNzKGkpOnRoaXMucmVtb3ZlQ2xhc3MoaSk6bShpKT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS50b2dnbGVDbGFzcyhpLmNhbGwodGhpcyxlLHl0KHRoaXMpLHQpLHQpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI7aWYoYSl7dD0wLG49Uyh0aGlzKSxyPW10KGkpO3doaWxlKGU9clt0KytdKW4uaGFzQ2xhc3MoZSk/bi5yZW1vdmVDbGFzcyhlKTpuLmFkZENsYXNzKGUpfWVsc2Ugdm9pZCAwIT09aSYmImJvb2xlYW4iIT09b3x8KChlPXl0KHRoaXMpKSYmWS5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsZSksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsZXx8ITE9PT1pPyIiOlkuZ2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpKX0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHI9MDt0PSIgIitlKyIgIjt3aGlsZShuPXRoaXNbcisrXSlpZigxPT09bi5ub2RlVHlwZSYmLTE8KCIgIit2dCh5dChuKSkrIiAiKS5pbmRleE9mKHQpKXJldHVybiEwO3JldHVybiExfX0pO3ZhciB4dD0vXHIvZztTLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKG4pe3ZhciByLGUsaSx0PXRoaXNbMF07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bShuKSx0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIHQ7MT09PXRoaXMubm9kZVR5cGUmJihudWxsPT0odD1pP24uY2FsbCh0aGlzLGUsUyh0aGlzKS52YWwoKSk6bik/dD0iIjoibnVtYmVyIj09dHlwZW9mIHQ/dCs9IiI6QXJyYXkuaXNBcnJheSh0KSYmKHQ9Uy5tYXAodCxmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjplKyIifSkpLChyPVMudmFsSG9va3NbdGhpcy50eXBlXXx8Uy52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmInNldCJpbiByJiZ2b2lkIDAhPT1yLnNldCh0aGlzLHQsInZhbHVlIil8fCh0aGlzLnZhbHVlPXQpKX0pKTp0PyhyPVMudmFsSG9va3NbdC50eXBlXXx8Uy52YWxIb29rc1t0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiByJiZ2b2lkIDAhPT0oZT1yLmdldCh0LCJ2YWx1ZSIpKT9lOiJzdHJpbmciPT10eXBlb2YoZT10LnZhbHVlKT9lLnJlcGxhY2UoeHQsIiIpOm51bGw9PWU/IiI6ZTp2b2lkIDB9fSksUy5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD1TLmZpbmQuYXR0cihlLCJ2YWx1ZSIpO3JldHVybiBudWxsIT10P3Q6dnQoUy50ZXh0KGUpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPWUub3B0aW9ucyxvPWUuc2VsZWN0ZWRJbmRleCxhPSJzZWxlY3Qtb25lIj09PWUudHlwZSxzPWE/bnVsbDpbXSx1PWE/bysxOmkubGVuZ3RoO2ZvcihyPW88MD91OmE/bzowO3I8dTtyKyspaWYoKChuPWlbcl0pLnNlbGVjdGVkfHxyPT09bykmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IUEobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD1TKG4pLnZhbCgpLGEpcmV0dXJuIHQ7cy5wdXNoKHQpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89Uy5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pKChyPWlbYV0pLnNlbGVjdGVkPS0xPFMuaW5BcnJheShTLnZhbEhvb2tzLm9wdGlvbi5nZXQociksbykpJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX19KSxTLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtTLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBlLmNoZWNrZWQ9LTE8Uy5pbkFycmF5KFMoZSkudmFsKCksdCl9fSx5LmNoZWNrT258fChTLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSkseS5mb2N1c2luPSJvbmZvY3VzaW4iaW4gQzt2YXIgYnQ9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLHd0PWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9O1MuZXh0ZW5kKFMuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsLGMsZixwPVtufHxFXSxkPXYuY2FsbChlLCJ0eXBlIik/ZS50eXBlOmUsaD12LmNhbGwoZSwibmFtZXNwYWNlIik/ZS5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihvPWY9YT1uPW58fEUsMyE9PW4ubm9kZVR5cGUmJjghPT1uLm5vZGVUeXBlJiYhYnQudGVzdChkK1MuZXZlbnQudHJpZ2dlcmVkKSYmKC0xPGQuaW5kZXhPZigiLiIpJiYoZD0oaD1kLnNwbGl0KCIuIikpLnNoaWZ0KCksaC5zb3J0KCkpLHU9ZC5pbmRleE9mKCI6Iik8MCYmIm9uIitkLChlPWVbUy5leHBhbmRvXT9lOm5ldyBTLkV2ZW50KGQsIm9iamVjdCI9PXR5cGVvZiBlJiZlKSkuaXNUcmlnZ2VyPXI/MjozLGUubmFtZXNwYWNlPWguam9pbigiLiIpLGUucm5hbWVzcGFjZT1lLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsZS5yZXN1bHQ9dm9pZCAwLGUudGFyZ2V0fHwoZS50YXJnZXQ9biksdD1udWxsPT10P1tlXTpTLm1ha2VBcnJheSh0LFtlXSksYz1TLmV2ZW50LnNwZWNpYWxbZF18fHt9LHJ8fCFjLnRyaWdnZXJ8fCExIT09Yy50cmlnZ2VyLmFwcGx5KG4sdCkpKXtpZighciYmIWMubm9CdWJibGUmJiF4KG4pKXtmb3Iocz1jLmRlbGVnYXRlVHlwZXx8ZCxidC50ZXN0KHMrZCl8fChvPW8ucGFyZW50Tm9kZSk7bztvPW8ucGFyZW50Tm9kZSlwLnB1c2gobyksYT1vO2E9PT0obi5vd25lckRvY3VtZW50fHxFKSYmcC5wdXNoKGEuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93fHxDKX1pPTA7d2hpbGUoKG89cFtpKytdKSYmIWUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlmPW8sZS50eXBlPTE8aT9zOmMuYmluZFR5cGV8fGQsKGw9KFkuZ2V0KG8sImV2ZW50cyIpfHxPYmplY3QuY3JlYXRlKG51bGwpKVtlLnR5cGVdJiZZLmdldChvLCJoYW5kbGUiKSkmJmwuYXBwbHkobyx0KSwobD11JiZvW3VdKSYmbC5hcHBseSYmVihvKSYmKGUucmVzdWx0PWwuYXBwbHkobyx0KSwhMT09PWUucmVzdWx0JiZlLnByZXZlbnREZWZhdWx0KCkpO3JldHVybiBlLnR5cGU9ZCxyfHxlLmlzRGVmYXVsdFByZXZlbnRlZCgpfHxjLl9kZWZhdWx0JiYhMSE9PWMuX2RlZmF1bHQuYXBwbHkocC5wb3AoKSx0KXx8IVYobil8fHUmJm0obltkXSkmJiF4KG4pJiYoKGE9blt1XSkmJihuW3VdPW51bGwpLFMuZXZlbnQudHJpZ2dlcmVkPWQsZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmLmFkZEV2ZW50TGlzdGVuZXIoZCx3dCksbltkXSgpLGUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmZi5yZW1vdmVFdmVudExpc3RlbmVyKGQsd3QpLFMuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxhJiYoblt1XT1hKSksZS5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9Uy5leHRlbmQobmV3IFMuRXZlbnQsbix7dHlwZTplLGlzU2ltdWxhdGVkOiEwfSk7Uy5ldmVudC50cmlnZ2VyKHIsbnVsbCx0KX19KSxTLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LnRyaWdnZXIoZSx0LHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpc1swXTtpZihuKXJldHVybiBTLmV2ZW50LnRyaWdnZXIoZSx0LG4sITApfX0pLHkuZm9jdXNpbnx8Uy5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihuLHIpe3ZhciBpPWZ1bmN0aW9uKGUpe1MuZXZlbnQuc2ltdWxhdGUocixlLnRhcmdldCxTLmV2ZW50LmZpeChlKSl9O1MuZXZlbnQuc3BlY2lhbFtyXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jdW1lbnR8fHRoaXMsdD1ZLmFjY2VzcyhlLHIpO3R8fGUuYWRkRXZlbnRMaXN0ZW5lcihuLGksITApLFkuYWNjZXNzKGUsciwodHx8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLmRvY3VtZW50fHx0aGlzLHQ9WS5hY2Nlc3MoZSxyKS0xO3Q/WS5hY2Nlc3MoZSxyLHQpOihlLnJlbW92ZUV2ZW50TGlzdGVuZXIobixpLCEwKSxZLnJlbW92ZShlLHIpKX19fSk7dmFyIFR0PUMubG9jYXRpb24sQ3Q9e2d1aWQ6RGF0ZS5ub3coKX0sRXQ9L1w/LztTLnBhcnNlWE1MPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7dHJ5e3Q9KG5ldyBDLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGUsInRleHQveG1sIil9Y2F0Y2goZSl7dD12b2lkIDB9cmV0dXJuIHQmJiF0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8Uy5lcnJvcigiSW52YWxpZCBYTUw6ICIrZSksdH07dmFyIFN0PS9cW1xdJC8sa3Q9L1xyP1xuL2csQXQ9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLE50PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBEdChuLGUscixpKXt2YXIgdDtpZihBcnJheS5pc0FycmF5KGUpKVMuZWFjaChlLGZ1bmN0aW9uKGUsdCl7cnx8U3QudGVzdChuKT9pKG4sdCk6RHQobisiWyIrKCJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9dD9lOiIiKSsiXSIsdCxyLGkpfSk7ZWxzZSBpZihyfHwib2JqZWN0IiE9PXcoZSkpaShuLGUpO2Vsc2UgZm9yKHQgaW4gZSlEdChuKyJbIit0KyJdIixlW3RdLHIsaSl9Uy5wYXJhbT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1mdW5jdGlvbihlLHQpe3ZhciBuPW0odCk/dCgpOnQ7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYobnVsbD09ZSlyZXR1cm4iIjtpZihBcnJheS5pc0FycmF5KGUpfHxlLmpxdWVyeSYmIVMuaXNQbGFpbk9iamVjdChlKSlTLmVhY2goZSxmdW5jdGlvbigpe2kodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IobiBpbiBlKUR0KG4sZVtuXSx0LGkpO3JldHVybiByLmpvaW4oIiYiKX0sUy5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBTLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9Uy5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGU/Uy5tYWtlQXJyYXkoZSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhUyh0aGlzKS5pcygiOmRpc2FibGVkIikmJk50LnRlc3QodGhpcy5ub2RlTmFtZSkmJiFBdC50ZXN0KGUpJiYodGhpcy5jaGVja2VkfHwhcGUudGVzdChlKSl9KS5tYXAoZnVuY3Rpb24oZSx0KXt2YXIgbj1TKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6QXJyYXkuaXNBcnJheShuKT9TLm1hcChuLGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2Uoa3QsIlxyXG4iKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKGt0LCJcclxuIil9fSkuZ2V0KCl9fSk7dmFyIGp0PS8lMjAvZyxxdD0vIy4qJC8sTHQ9LyhbPyZdKV89W14mXSovLEh0PS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKSQvZ20sT3Q9L14oPzpHRVR8SEVBRCkkLyxQdD0vXlwvXC8vLFJ0PXt9LE10PXt9LEl0PSIqLyIuY29uY2F0KCIqIiksV3Q9RS5jcmVhdGVFbGVtZW50KCJhIik7ZnVuY3Rpb24gRnQobyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7InN0cmluZyIhPXR5cGVvZiBlJiYodD1lLGU9IioiKTt2YXIgbixyPTAsaT1lLnRvTG93ZXJDYXNlKCkubWF0Y2goUCl8fFtdO2lmKG0odCkpd2hpbGUobj1pW3IrK10pIisiPT09blswXT8obj1uLnNsaWNlKDEpfHwiKiIsKG9bbl09b1tuXXx8W10pLnVuc2hpZnQodCkpOihvW25dPW9bbl18fFtdKS5wdXNoKHQpfX1mdW5jdGlvbiBCdCh0LGksbyxhKXt2YXIgcz17fSx1PXQ9PT1NdDtmdW5jdGlvbiBsKGUpe3ZhciByO3JldHVybiBzW2VdPSEwLFMuZWFjaCh0W2VdfHxbXSxmdW5jdGlvbihlLHQpe3ZhciBuPXQoaSxvLGEpO3JldHVybiJzdHJpbmciIT10eXBlb2Ygbnx8dXx8c1tuXT91PyEocj1uKTp2b2lkIDA6KGkuZGF0YVR5cGVzLnVuc2hpZnQobiksbChuKSwhMSl9KSxyfXJldHVybiBsKGkuZGF0YVR5cGVzWzBdKXx8IXNbIioiXSYmbCgiKiIpfWZ1bmN0aW9uICR0KGUsdCl7dmFyIG4scixpPVMuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiB0KXZvaWQgMCE9PXRbbl0mJigoaVtuXT9lOnJ8fChyPXt9KSlbbl09dFtuXSk7cmV0dXJuIHImJlMuZXh0ZW5kKCEwLGUsciksZX1XdC5ocmVmPVR0LmhyZWYsUy5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOlR0LmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOi9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLnRlc3QoVHQucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6SXQsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOlMucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0PyR0KCR0KGUsUy5hamF4U2V0dGluZ3MpLHQpOiR0KFMuYWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOkZ0KFJ0KSxhamF4VHJhbnNwb3J0OkZ0KE10KSxhamF4OmZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBlJiYodD1lLGU9dm9pZCAwKSx0PXR8fHt9O3ZhciBjLGYscCxuLGQscixoLGcsaSxvLHY9Uy5hamF4U2V0dXAoe30sdCkseT12LmNvbnRleHR8fHYsbT12LmNvbnRleHQmJih5Lm5vZGVUeXBlfHx5LmpxdWVyeSk/Uyh5KTpTLmV2ZW50LHg9Uy5EZWZlcnJlZCgpLGI9Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksdz12LnN0YXR1c0NvZGV8fHt9LGE9e30scz17fSx1PSJjYW5jZWxlZCIsVD17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGgpe2lmKCFuKXtuPXt9O3doaWxlKHQ9SHQuZXhlYyhwKSluW3RbMV0udG9Mb3dlckNhc2UoKSsiICJdPShuW3RbMV0udG9Mb3dlckNhc2UoKSsiICJdfHxbXSkuY29uY2F0KHRbMl0pfXQ9bltlLnRvTG93ZXJDYXNlKCkrIiAiXX1yZXR1cm4gbnVsbD09dD9udWxsOnQuam9pbigiLCAiKX0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGg/cDpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWgmJihlPXNbZS50b0xvd2VyQ2FzZSgpXT1zW2UudG9Mb3dlckNhc2UoKV18fGUsYVtlXT10KSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1oJiYodi5taW1lVHlwZT1lKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGUpaWYoaClULmFsd2F5cyhlW1Quc3RhdHVzXSk7ZWxzZSBmb3IodCBpbiBlKXdbdF09W3dbdF0sZVt0XV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGUpe3ZhciB0PWV8fHU7cmV0dXJuIGMmJmMuYWJvcnQodCksbCgwLHQpLHRoaXN9fTtpZih4LnByb21pc2UoVCksdi51cmw9KChlfHx2LnVybHx8VHQuaHJlZikrIiIpLnJlcGxhY2UoUHQsVHQucHJvdG9jb2wrIi8vIiksdi50eXBlPXQubWV0aG9kfHx0LnR5cGV8fHYubWV0aG9kfHx2LnR5cGUsdi5kYXRhVHlwZXM9KHYuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChQKXx8WyIiXSxudWxsPT12LmNyb3NzRG9tYWluKXtyPUUuY3JlYXRlRWxlbWVudCgiYSIpO3RyeXtyLmhyZWY9di51cmwsci5ocmVmPXIuaHJlZix2LmNyb3NzRG9tYWluPVd0LnByb3RvY29sKyIvLyIrV3QuaG9zdCE9ci5wcm90b2NvbCsiLy8iK3IuaG9zdH1jYXRjaChlKXt2LmNyb3NzRG9tYWluPSEwfX1pZih2LmRhdGEmJnYucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2Ygdi5kYXRhJiYodi5kYXRhPVMucGFyYW0odi5kYXRhLHYudHJhZGl0aW9uYWwpKSxCdChSdCx2LHQsVCksaClyZXR1cm4gVDtmb3IoaSBpbihnPVMuZXZlbnQmJnYuZ2xvYmFsKSYmMD09Uy5hY3RpdmUrKyYmUy5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSx2LnR5cGU9di50eXBlLnRvVXBwZXJDYXNlKCksdi5oYXNDb250ZW50PSFPdC50ZXN0KHYudHlwZSksZj12LnVybC5yZXBsYWNlKHF0LCIiKSx2Lmhhc0NvbnRlbnQ/di5kYXRhJiZ2LnByb2Nlc3NEYXRhJiYwPT09KHYuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmKHYuZGF0YT12LmRhdGEucmVwbGFjZShqdCwiKyIpKToobz12LnVybC5zbGljZShmLmxlbmd0aCksdi5kYXRhJiYodi5wcm9jZXNzRGF0YXx8InN0cmluZyI9PXR5cGVvZiB2LmRhdGEpJiYoZis9KEV0LnRlc3QoZik/IiYiOiI/Iikrdi5kYXRhLGRlbGV0ZSB2LmRhdGEpLCExPT09di5jYWNoZSYmKGY9Zi5yZXBsYWNlKEx0LCIkMSIpLG89KEV0LnRlc3QoZik/IiYiOiI/IikrIl89IitDdC5ndWlkKysrbyksdi51cmw9ZitvKSx2LmlmTW9kaWZpZWQmJihTLmxhc3RNb2RpZmllZFtmXSYmVC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsUy5sYXN0TW9kaWZpZWRbZl0pLFMuZXRhZ1tmXSYmVC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixTLmV0YWdbZl0pKSwodi5kYXRhJiZ2Lmhhc0NvbnRlbnQmJiExIT09di5jb250ZW50VHlwZXx8dC5jb250ZW50VHlwZSkmJlQuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIix2LmNvbnRlbnRUeXBlKSxULnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsdi5kYXRhVHlwZXNbMF0mJnYuYWNjZXB0c1t2LmRhdGFUeXBlc1swXV0/di5hY2NlcHRzW3YuZGF0YVR5cGVzWzBdXSsoIioiIT09di5kYXRhVHlwZXNbMF0/IiwgIitJdCsiOyBxPTAuMDEiOiIiKTp2LmFjY2VwdHNbIioiXSksdi5oZWFkZXJzKVQuc2V0UmVxdWVzdEhlYWRlcihpLHYuaGVhZGVyc1tpXSk7aWYodi5iZWZvcmVTZW5kJiYoITE9PT12LmJlZm9yZVNlbmQuY2FsbCh5LFQsdil8fGgpKXJldHVybiBULmFib3J0KCk7aWYodT0iYWJvcnQiLGIuYWRkKHYuY29tcGxldGUpLFQuZG9uZSh2LnN1Y2Nlc3MpLFQuZmFpbCh2LmVycm9yKSxjPUJ0KE10LHYsdCxUKSl7aWYoVC5yZWFkeVN0YXRlPTEsZyYmbS50cmlnZ2VyKCJhamF4U2VuZCIsW1Qsdl0pLGgpcmV0dXJuIFQ7di5hc3luYyYmMDx2LnRpbWVvdXQmJihkPUMuc2V0VGltZW91dChmdW5jdGlvbigpe1QuYWJvcnQoInRpbWVvdXQiKX0sdi50aW1lb3V0KSk7dHJ5e2g9ITEsYy5zZW5kKGEsbCl9Y2F0Y2goZSl7aWYoaCl0aHJvdyBlO2woLTEsZSl9fWVsc2UgbCgtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gbChlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9dDtofHwoaD0hMCxkJiZDLmNsZWFyVGltZW91dChkKSxjPXZvaWQgMCxwPXJ8fCIiLFQucmVhZHlTdGF0ZT0wPGU/NDowLGk9MjAwPD1lJiZlPDMwMHx8MzA0PT09ZSxuJiYocz1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscz1lLmNvbnRlbnRzLHU9ZS5kYXRhVHlwZXM7d2hpbGUoIioiPT09dVswXSl1LnNoaWZ0KCksdm9pZCAwPT09ciYmKHI9ZS5taW1lVHlwZXx8dC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKHIpZm9yKGkgaW4gcylpZihzW2ldJiZzW2ldLnRlc3Qocikpe3UudW5zaGlmdChpKTticmVha31pZih1WzBdaW4gbilvPXVbMF07ZWxzZXtmb3IoaSBpbiBuKXtpZighdVswXXx8ZS5jb252ZXJ0ZXJzW2krIiAiK3VbMF1dKXtvPWk7YnJlYWt9YXx8KGE9aSl9bz1vfHxhfWlmKG8pcmV0dXJuIG8hPT11WzBdJiZ1LnVuc2hpZnQobyksbltvXX0odixULG4pKSwhaSYmLTE8Uy5pbkFycmF5KCJzY3JpcHQiLHYuZGF0YVR5cGVzKSYmKHYuY29udmVydGVyc1sidGV4dCBzY3JpcHQiXT1mdW5jdGlvbigpe30pLHM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPXt9LGM9ZS5kYXRhVHlwZXMuc2xpY2UoKTtpZihjWzFdKWZvcihhIGluIGUuY29udmVydGVycylsW2EudG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW2FdO289Yy5zaGlmdCgpO3doaWxlKG8paWYoZS5yZXNwb25zZUZpZWxkc1tvXSYmKG5bZS5yZXNwb25zZUZpZWxkc1tvXV09dCksIXUmJnImJmUuZGF0YUZpbHRlciYmKHQ9ZS5kYXRhRmlsdGVyKHQsZS5kYXRhVHlwZSkpLHU9byxvPWMuc2hpZnQoKSlpZigiKiI9PT1vKW89dTtlbHNlIGlmKCIqIiE9PXUmJnUhPT1vKXtpZighKGE9bFt1KyIgIitvXXx8bFsiKiAiK29dKSlmb3IoaSBpbiBsKWlmKChzPWkuc3BsaXQoIiAiKSlbMV09PT1vJiYoYT1sW3UrIiAiK3NbMF1dfHxsWyIqICIrc1swXV0pKXshMD09PWE/YT1sW2ldOiEwIT09bFtpXSYmKG89c1swXSxjLnVuc2hpZnQoc1sxXSkpO2JyZWFrfWlmKCEwIT09YSlpZihhJiZlWyJ0aHJvd3MiXSl0PWEodCk7ZWxzZSB0cnl7dD1hKHQpfWNhdGNoKGUpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmE/ZToiTm8gY29udmVyc2lvbiBmcm9tICIrdSsiIHRvICIrb319fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTp0fX0odixzLFQsaSksaT8odi5pZk1vZGlmaWVkJiYoKHU9VC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKSYmKFMubGFzdE1vZGlmaWVkW2ZdPXUpLCh1PVQuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSkmJihTLmV0YWdbZl09dSkpLDIwND09PWV8fCJIRUFEIj09PXYudHlwZT9sPSJub2NvbnRlbnQiOjMwND09PWU/bD0ibm90bW9kaWZpZWQiOihsPXMuc3RhdGUsbz1zLmRhdGEsaT0hKGE9cy5lcnJvcikpKTooYT1sLCFlJiZsfHwobD0iZXJyb3IiLGU8MCYmKGU9MCkpKSxULnN0YXR1cz1lLFQuc3RhdHVzVGV4dD0odHx8bCkrIiIsaT94LnJlc29sdmVXaXRoKHksW28sbCxUXSk6eC5yZWplY3RXaXRoKHksW1QsbCxhXSksVC5zdGF0dXNDb2RlKHcpLHc9dm9pZCAwLGcmJm0udHJpZ2dlcihpPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW1QsdixpP286YV0pLGIuZmlyZVdpdGgoeSxbVCxsXSksZyYmKG0udHJpZ2dlcigiYWpheENvbXBsZXRlIixbVCx2XSksLS1TLmFjdGl2ZXx8Uy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIFR9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBTLmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gUy5nZXQoZSx2b2lkIDAsdCwic2NyaXB0Iil9fSksUy5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsaSl7U1tpXT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbSh0KSYmKHI9cnx8bixuPXQsdD12b2lkIDApLFMuYWpheChTLmV4dGVuZCh7dXJsOmUsdHlwZTppLGRhdGFUeXBlOnIsZGF0YTp0LHN1Y2Nlc3M6bn0sUy5pc1BsYWluT2JqZWN0KGUpJiZlKSl9fSksUy5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUuaGVhZGVycykiY29udGVudC10eXBlIj09PXQudG9Mb3dlckNhc2UoKSYmKGUuY29udGVudFR5cGU9ZS5oZWFkZXJzW3RdfHwiIil9KSxTLl9ldmFsVXJsPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gUy5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKCl7fX0sZGF0YUZpbHRlcjpmdW5jdGlvbihlKXtTLmdsb2JhbEV2YWwoZSx0LG4pfX0pfSxTLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpc1swXSYmKG0oZSkmJihlPWUuY2FsbCh0aGlzWzBdKSksdD1TKGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdEVsZW1lbnRDaGlsZCllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihuKXtyZXR1cm4gbShuKT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS53cmFwSW5uZXIobi5jYWxsKHRoaXMsZSkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Uyh0aGlzKSx0PWUuY29udGVudHMoKTt0Lmxlbmd0aD90LndyYXBBbGwobik6ZS5hcHBlbmQobil9KX0sd3JhcDpmdW5jdGlvbih0KXt2YXIgbj1tKHQpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS53cmFwQWxsKG4/dC5jYWxsKHRoaXMsZSk6dCl9KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7Uyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxTLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIVMuZXhwci5wc2V1ZG9zLnZpc2libGUoZSl9LFMuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuISEoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxTLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBDLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBfdD17MDoyMDAsMTIyMzoyMDR9LHp0PVMuYWpheFNldHRpbmdzLnhocigpO3kuY29ycz0hIXp0JiYid2l0aENyZWRlbnRpYWxzImluIHp0LHkuYWpheD16dD0hIXp0LFMuYWpheFRyYW5zcG9ydChmdW5jdGlvbihpKXt2YXIgbyxhO2lmKHkuY29yc3x8enQmJiFpLmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1pLnhocigpO2lmKHIub3BlbihpLnR5cGUsaS51cmwsaS5hc3luYyxpLnVzZXJuYW1lLGkucGFzc3dvcmQpLGkueGhyRmllbGRzKWZvcihuIGluIGkueGhyRmllbGRzKXJbbl09aS54aHJGaWVsZHNbbl07Zm9yKG4gaW4gaS5taW1lVHlwZSYmci5vdmVycmlkZU1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUoaS5taW1lVHlwZSksaS5jcm9zc0RvbWFpbnx8ZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpLGUpci5zZXRSZXF1ZXN0SGVhZGVyKG4sZVtuXSk7bz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtvJiYobz1hPXIub25sb2FkPXIub25lcnJvcj1yLm9uYWJvcnQ9ci5vbnRpbWVvdXQ9ci5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09ZT9yLmFib3J0KCk6ImVycm9yIj09PWU/Im51bWJlciIhPXR5cGVvZiByLnN0YXR1cz90KDAsImVycm9yIik6dChyLnN0YXR1cyxyLnN0YXR1c1RleHQpOnQoX3Rbci5zdGF0dXNdfHxyLnN0YXR1cyxyLnN0YXR1c1RleHQsInRleHQiIT09KHIucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIHIucmVzcG9uc2VUZXh0P3tiaW5hcnk6ci5yZXNwb25zZX06e3RleHQ6ci5yZXNwb25zZVRleHR9LHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHIub25sb2FkPW8oKSxhPXIub25lcnJvcj1yLm9udGltZW91dD1vKCJlcnJvciIpLHZvaWQgMCE9PXIub25hYm9ydD9yLm9uYWJvcnQ9YTpyLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1yLnJlYWR5U3RhdGUmJkMuc2V0VGltZW91dChmdW5jdGlvbigpe28mJmEoKX0pfSxvPW8oImFib3J0Iik7dHJ5e3Iuc2VuZChpLmhhc0NvbnRlbnQmJmkuZGF0YXx8bnVsbCl9Y2F0Y2goZSl7aWYobyl0aHJvdyBlfX0sYWJvcnQ6ZnVuY3Rpb24oKXtvJiZvKCl9fX0pLFMuYWpheFByZWZpbHRlcihmdW5jdGlvbihlKXtlLmNyb3NzRG9tYWluJiYoZS5jb250ZW50cy5zY3JpcHQ9ITEpfSksUy5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIFMuZ2xvYmFsRXZhbChlKSxlfX19KSxTLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS5jYWNoZSYmKGUuY2FjaGU9ITEpLGUuY3Jvc3NEb21haW4mJihlLnR5cGU9IkdFVCIpfSksUy5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKG4pe3ZhciByLGk7aWYobi5jcm9zc0RvbWFpbnx8bi5zY3JpcHRBdHRycylyZXR1cm57c2VuZDpmdW5jdGlvbihlLHQpe3I9UygiPHNjcmlwdD4iKS5hdHRyKG4uc2NyaXB0QXR0cnN8fHt9KS5wcm9wKHtjaGFyc2V0Om4uc2NyaXB0Q2hhcnNldCxzcmM6bi51cmx9KS5vbigibG9hZCBlcnJvciIsaT1mdW5jdGlvbihlKXtyLnJlbW92ZSgpLGk9bnVsbCxlJiZ0KCJlcnJvciI9PT1lLnR5cGU/NDA0OjIwMCxlLnR5cGUpfSksRS5oZWFkLmFwcGVuZENoaWxkKHJbMF0pfSxhYm9ydDpmdW5jdGlvbigpe2kmJmkoKX19fSk7dmFyIFV0LFh0PVtdLFZ0PS8oPSlcPyg/PSZ8JCl8XD9cPy87Uy5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPVh0LnBvcCgpfHxTLmV4cGFuZG8rIl8iK0N0Lmd1aWQrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLFMuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPSExIT09ZS5qc29ucCYmKFZ0LnRlc3QoZS51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgZS5kYXRhJiYwPT09KGUuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmVnQudGVzdChlLmRhdGEpJiYiZGF0YSIpO2lmKGF8fCJqc29ucCI9PT1lLmRhdGFUeXBlc1swXSlyZXR1cm4gcj1lLmpzb25wQ2FsbGJhY2s9bShlLmpzb25wQ2FsbGJhY2spP2UuanNvbnBDYWxsYmFjaygpOmUuanNvbnBDYWxsYmFjayxhP2VbYV09ZVthXS5yZXBsYWNlKFZ0LCIkMSIrcik6ITEhPT1lLmpzb25wJiYoZS51cmwrPShFdC50ZXN0KGUudXJsKT8iJiI6Ij8iKStlLmpzb25wKyI9IityKSxlLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gb3x8Uy5lcnJvcihyKyIgd2FzIG5vdCBjYWxsZWQiKSxvWzBdfSxlLmRhdGFUeXBlc1swXT0ianNvbiIsaT1DW3JdLENbcl09ZnVuY3Rpb24oKXtvPWFyZ3VtZW50c30sbi5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1pP1MoQykucmVtb3ZlUHJvcChyKTpDW3JdPWksZVtyXSYmKGUuanNvbnBDYWxsYmFjaz10Lmpzb25wQ2FsbGJhY2ssWHQucHVzaChyKSksbyYmbShpKSYmaShvWzBdKSxvPWk9dm9pZCAwfSksInNjcmlwdCJ9KSx5LmNyZWF0ZUhUTUxEb2N1bWVudD0oKFV0PUUuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5KS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IiwyPT09VXQuY2hpbGROb2Rlcy5sZW5ndGgpLFMucGFyc2VIVE1MPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGU/W106KCJib29sZWFuIj09dHlwZW9mIHQmJihuPXQsdD0hMSksdHx8KHkuY3JlYXRlSFRNTERvY3VtZW50Pygocj0odD1FLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikpLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSkuaHJlZj1FLmxvY2F0aW9uLmhyZWYsdC5oZWFkLmFwcGVuZENoaWxkKHIpKTp0PUUpLG89IW4mJltdLChpPU4uZXhlYyhlKSk/W3QuY3JlYXRlRWxlbWVudChpWzFdKV06KGk9eGUoW2VdLHQsbyksbyYmby5sZW5ndGgmJlMobykucmVtb3ZlKCksUy5tZXJnZShbXSxpLmNoaWxkTm9kZXMpKSk7dmFyIHIsaSxvfSxTLmZuLmxvYWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPXRoaXMscz1lLmluZGV4T2YoIiAiKTtyZXR1cm4tMTxzJiYocj12dChlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksbSh0KT8obj10LHQ9dm9pZCAwKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIiksMDxhLmxlbmd0aCYmUy5hamF4KHt1cmw6ZSx0eXBlOml8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOnR9KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLGEuaHRtbChyP1MoIjxkaXY+IikuYXBwZW5kKFMucGFyc2VIVE1MKGUpKS5maW5kKHIpOmUpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKGUsdCl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pfSksdGhpc30sUy5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIFMuZ3JlcChTLnRpbWVycyxmdW5jdGlvbihlKXtyZXR1cm4gdD09PWUuZWxlbX0pLmxlbmd0aH0sUy5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGw9Uy5jc3MoZSwicG9zaXRpb24iKSxjPVMoZSksZj17fTsic3RhdGljIj09PWwmJihlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHM9Yy5vZmZzZXQoKSxvPVMuY3NzKGUsInRvcCIpLHU9Uy5jc3MoZSwibGVmdCIpLCgiYWJzb2x1dGUiPT09bHx8ImZpeGVkIj09PWwpJiYtMTwobyt1KS5pbmRleE9mKCJhdXRvIik/KGE9KHI9Yy5wb3NpdGlvbigpKS50b3AsaT1yLmxlZnQpOihhPXBhcnNlRmxvYXQobyl8fDAsaT1wYXJzZUZsb2F0KHUpfHwwKSxtKHQpJiYodD10LmNhbGwoZSxuLFMuZXh0ZW5kKHt9LHMpKSksbnVsbCE9dC50b3AmJihmLnRvcD10LnRvcC1zLnRvcCthKSxudWxsIT10LmxlZnQmJihmLmxlZnQ9dC5sZWZ0LXMubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxmKTooIm51bWJlciI9PXR5cGVvZiBmLnRvcCYmKGYudG9wKz0icHgiKSwibnVtYmVyIj09dHlwZW9mIGYubGVmdCYmKGYubGVmdCs9InB4IiksYy5jc3MoZikpfX0sUy5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbih0KXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLHQsZSl9KTt2YXIgZSxuLHI9dGhpc1swXTtyZXR1cm4gcj9yLmdldENsaWVudFJlY3RzKCkubGVuZ3RoPyhlPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1yLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcse3RvcDplLnRvcCtuLnBhZ2VZT2Zmc2V0LGxlZnQ6ZS5sZWZ0K24ucGFnZVhPZmZzZXR9KTp7dG9wOjAsbGVmdDowfTp2b2lkIDB9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuLHI9dGhpc1swXSxpPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT1TLmNzcyhyLCJwb3NpdGlvbiIpKXQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle3Q9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCxlPXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt3aGlsZShlJiYoZT09PW4uYm9keXx8ZT09PW4uZG9jdW1lbnRFbGVtZW50KSYmInN0YXRpYyI9PT1TLmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5wYXJlbnROb2RlO2UmJmUhPT1yJiYxPT09ZS5ub2RlVHlwZSYmKChpPVMoZSkub2Zmc2V0KCkpLnRvcCs9Uy5jc3MoZSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxpLmxlZnQrPVMuY3NzKGUsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOnQudG9wLWkudG9wLVMuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LWkubGVmdC1TLmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnQ7d2hpbGUoZSYmInN0YXRpYyI9PT1TLmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGV8fHJlfSl9fSksUy5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKHQsaSl7dmFyIG89InBhZ2VZT2Zmc2V0Ij09PWk7Uy5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZih4KGUpP3I9ZTo5PT09ZS5ub2RlVHlwZSYmKHI9ZS5kZWZhdWx0Vmlldyksdm9pZCAwPT09bilyZXR1cm4gcj9yW2ldOmVbdF07cj9yLnNjcm9sbFRvKG8/ci5wYWdlWE9mZnNldDpuLG8/bjpyLnBhZ2VZT2Zmc2V0KTplW3RdPW59LHQsZSxhcmd1bWVudHMubGVuZ3RoKX19KSxTLmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSxuKXtTLmNzc0hvb2tzW25dPSRlKHkucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuIHQ9QmUoZSxuKSxNZS50ZXN0KHQpP1MoZSkucG9zaXRpb24oKVtuXSsicHgiOnR9KX0pLFMuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGEscyl7Uy5lYWNoKHtwYWRkaW5nOiJpbm5lciIrYSxjb250ZW50OnMsIiI6Im91dGVyIithfSxmdW5jdGlvbihyLG8pe1MuZm5bb109ZnVuY3Rpb24oZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoJiYocnx8ImJvb2xlYW4iIT10eXBlb2YgZSksaT1yfHwoITA9PT1lfHwhMD09PXQ/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByO3JldHVybiB4KGUpPzA9PT1vLmluZGV4T2YoIm91dGVyIik/ZVsiaW5uZXIiK2FdOmUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2FdOjk9PT1lLm5vZGVUeXBlPyhyPWUuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KGUuYm9keVsic2Nyb2xsIithXSxyWyJzY3JvbGwiK2FdLGUuYm9keVsib2Zmc2V0IithXSxyWyJvZmZzZXQiK2FdLHJbImNsaWVudCIrYV0pKTp2b2lkIDA9PT1uP1MuY3NzKGUsdCxpKTpTLnN0eWxlKGUsdCxuLGkpfSxzLG4/ZTp2b2lkIDAsbil9fSl9KSxTLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihlLHQpe1MuZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub24odCxlKX19KSxTLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIsbil9LGhvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubW91c2VlbnRlcihlKS5tb3VzZWxlYXZlKHR8fGUpfX0pLFMuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLG4pe1MuZm5bbl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMDxhcmd1bWVudHMubGVuZ3RoP3RoaXMub24obixudWxsLGUsdCk6dGhpcy50cmlnZ2VyKG4pfX0pO3ZhciBHdD0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7Uy5wcm94eT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaTtpZigic3RyaW5nIj09dHlwZW9mIHQmJihuPWVbdF0sdD1lLGU9biksbShlKSlyZXR1cm4gcj1zLmNhbGwoYXJndW1lbnRzLDIpLChpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxyLmNvbmNhdChzLmNhbGwoYXJndW1lbnRzKSkpfSkuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHxTLmd1aWQrKyxpfSxTLmhvbGRSZWFkeT1mdW5jdGlvbihlKXtlP1MucmVhZHlXYWl0Kys6Uy5yZWFkeSghMCl9LFMuaXNBcnJheT1BcnJheS5pc0FycmF5LFMucGFyc2VKU09OPUpTT04ucGFyc2UsUy5ub2RlTmFtZT1BLFMuaXNGdW5jdGlvbj1tLFMuaXNXaW5kb3c9eCxTLmNhbWVsQ2FzZT1YLFMudHlwZT13LFMubm93PURhdGUubm93LFMuaXNOdW1lcmljPWZ1bmN0aW9uKGUpe3ZhciB0PVMudHlwZShlKTtyZXR1cm4oIm51bWJlciI9PT10fHwic3RyaW5nIj09PXQpJiYhaXNOYU4oZS1wYXJzZUZsb2F0KGUpKX0sUy50cmltPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOihlKyIiKS5yZXBsYWNlKEd0LCIiKX0sImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIFN9KTt2YXIgWXQ9Qy5qUXVlcnksUXQ9Qy4kO3JldHVybiBTLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIEMuJD09PVMmJihDLiQ9UXQpLGUmJkMualF1ZXJ5PT09UyYmKEMualF1ZXJ5PVl0KSxTfSwidW5kZWZpbmVkIj09dHlwZW9mIGUmJihDLmpRdWVyeT1DLiQ9UyksU30pOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKgogKiBqUXVlcnkgVGVtcGxhdGVzIFBsdWdpbiAxLjAuMHByZQogKiBodHRwOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXRtcGwKICogUmVxdWlyZXMgalF1ZXJ5IDEuNC4yCiAqCiAqIENvcHlyaWdodCBTb2Z0d2FyZSBGcmVlZG9tIENvbnNlcnZhbmN5LCBJbmMuCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqLwooZnVuY3Rpb24oYSl7dmFyIHI9YS5mbi5kb21NYW5pcCxkPSJfdG1wbGl0ZW0iLHE9L15bXjxdKig8W1x3XFddKz4pW14+XSokfFx7XHtcISAvLGI9e30sZj17fSxlLHA9e2tleTowLGRhdGE6e319LGk9MCxjPTAsbD1bXTtmdW5jdGlvbiBnKGcsZCxoLGUpe3ZhciBjPXtkYXRhOmV8fChlPT09MHx8ZT09PWZhbHNlKT9lOmQ/ZC5kYXRhOnt9LF93cmFwOmQ/ZC5fd3JhcDpudWxsLHRtcGw6bnVsbCxwYXJlbnQ6ZHx8bnVsbCxub2RlczpbXSxjYWxsczp1LG5lc3Q6dyx3cmFwOngsaHRtbDp2LHVwZGF0ZTp0fTtnJiZhLmV4dGVuZChjLGcse25vZGVzOltdLHBhcmVudDpkfSk7aWYoaCl7Yy50bXBsPWg7Yy5fY3RudD1jLl9jdG50fHxjLnRtcGwoYSxjKTtjLmtleT0rK2k7KGwubGVuZ3RoP2Y6YilbaV09Y31yZXR1cm4gY31hLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihmLGQpe2EuZm5bZl09ZnVuY3Rpb24obil7dmFyIGc9W10saT1hKG4pLGssaCxtLGwsaj10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtlPWJ8fHt9O2lmKGomJmoubm9kZVR5cGU9PT0xMSYmai5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJmkubGVuZ3RoPT09MSl7aVtkXSh0aGlzWzBdKTtnPXRoaXN9ZWxzZXtmb3IoaD0wLG09aS5sZW5ndGg7aDxtO2grKyl7Yz1oO2s9KGg+MD90aGlzLmNsb25lKHRydWUpOnRoaXMpLmdldCgpO2EoaVtoXSlbZF0oayk7Zz1nLmNvbmNhdChrKX1jPTA7Zz10aGlzLnB1c2hTdGFjayhnLGYsaS5zZWxlY3Rvcil9bD1lO2U9bnVsbDthLnRtcGwuY29tcGxldGUobCk7cmV0dXJuIGd9fSk7YS5mbi5leHRlbmQoe3RtcGw6ZnVuY3Rpb24oZCxjLGIpe3JldHVybiBhLnRtcGwodGhpc1swXSxkLGMsYil9LHRtcGxJdGVtOmZ1bmN0aW9uKCl7cmV0dXJuIGEudG1wbEl0ZW0odGhpc1swXSl9LHRlbXBsYXRlOmZ1bmN0aW9uKGIpe3JldHVybiBhLnRlbXBsYXRlKGIsdGhpc1swXSl9LGRvbU1hbmlwOmZ1bmN0aW9uKGQsbSxrKXtpZihkWzBdJiZhLmlzQXJyYXkoZFswXSkpe3ZhciBnPWEubWFrZUFycmF5KGFyZ3VtZW50cyksaD1kWzBdLGo9aC5sZW5ndGgsaT0wLGY7d2hpbGUoaTxqJiYhKGY9YS5kYXRhKGhbaSsrXSwidG1wbEl0ZW0iKSkpO2lmKGYmJmMpZ1syXT1mdW5jdGlvbihiKXthLnRtcGwuYWZ0ZXJNYW5pcCh0aGlzLGIsayl9O3IuYXBwbHkodGhpcyxnKX1lbHNlIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpO2M9MDshZSYmYS50bXBsLmNvbXBsZXRlKGIpO3JldHVybiB0aGlzfX0pO2EuZXh0ZW5kKHt0bXBsOmZ1bmN0aW9uKGQsaCxlLGMpe3ZhciBpLGs9IWM7aWYoayl7Yz1wO2Q9YS50ZW1wbGF0ZVtkXXx8YS50ZW1wbGF0ZShudWxsLGQpO2Y9e319ZWxzZSBpZighZCl7ZD1jLnRtcGw7YltjLmtleV09YztjLm5vZGVzPVtdO2Mud3JhcHBlZCYmbihjLGMud3JhcHBlZCk7cmV0dXJuIGEoaihjLG51bGwsYy50bXBsKGEsYykpKX1pZighZClyZXR1cm5bXTtpZih0eXBlb2YgaD09PSJmdW5jdGlvbiIpaD1oLmNhbGwoY3x8e30pO2UmJmUud3JhcHBlZCYmbihlLGUud3JhcHBlZCk7aT1hLmlzQXJyYXkoaCk/YS5tYXAoaCxmdW5jdGlvbihhKXtyZXR1cm4gYT9nKGUsYyxkLGEpOm51bGx9KTpbZyhlLGMsZCxoKV07cmV0dXJuIGs/YShqKGMsbnVsbCxpKSk6aX0sdG1wbEl0ZW06ZnVuY3Rpb24oYil7dmFyIGM7aWYoYiBpbnN0YW5jZW9mIGEpYj1iWzBdO3doaWxlKGImJmIubm9kZVR5cGU9PT0xJiYhKGM9YS5kYXRhKGIsInRtcGxJdGVtIikpJiYoYj1iLnBhcmVudE5vZGUpKTtyZXR1cm4gY3x8cH0sdGVtcGxhdGU6ZnVuY3Rpb24oYyxiKXtpZihiKXtpZih0eXBlb2YgYj09PSJzdHJpbmciKWI9byhiKTtlbHNlIGlmKGIgaW5zdGFuY2VvZiBhKWI9YlswXXx8e307aWYoYi5ub2RlVHlwZSliPWEuZGF0YShiLCJ0bXBsIil8fGEuZGF0YShiLCJ0bXBsIixvKGIuaW5uZXJIVE1MKSk7cmV0dXJuIHR5cGVvZiBjPT09InN0cmluZyI/KGEudGVtcGxhdGVbY109Yik6Yn1yZXR1cm4gYz90eXBlb2YgYyE9PSJzdHJpbmciP2EudGVtcGxhdGUobnVsbCxjKTphLnRlbXBsYXRlW2NdfHxhLnRlbXBsYXRlKG51bGwscS50ZXN0KGMpP2M6YShjKSk6bnVsbH0sZW5jb2RlOmZ1bmN0aW9uKGEpe3JldHVybigiIithKS5zcGxpdCgiJiIpLmpvaW4oIiZhbXA7Iikuc3BsaXQoIjwiKS5qb2luKCImbHQ7Iikuc3BsaXQoIj4iKS5qb2luKCImZ3Q7Iikuc3BsaXQoJyInKS5qb2luKCImIzM0OyIpLnNwbGl0KCInIikuam9pbigiJiMzOTsiKX19KTthLmV4dGVuZChhLnRtcGwse3RhZzp7dG1wbDp7X2RlZmF1bHQ6eyQyOiJudWxsIn0sb3BlbjoiaWYoJG5vdG51bGxfMSl7X189X18uY29uY2F0KCRpdGVtLm5lc3QoJDEsJDIpKTt9In0sd3JhcDp7X2RlZmF1bHQ6eyQyOiJudWxsIn0sb3BlbjoiJGl0ZW0uY2FsbHMoX18sJDEsJDIpO19fPVtdOyIsY2xvc2U6ImNhbGw9JGl0ZW0uY2FsbHMoKTtfXz1jYWxsLl8uY29uY2F0KCRpdGVtLndyYXAoY2FsbCxfXykpOyJ9LGVhY2g6e19kZWZhdWx0OnskMjoiJGluZGV4LCAkdmFsdWUifSxvcGVuOiJpZigkbm90bnVsbF8xKXskLmVhY2goJDFhLGZ1bmN0aW9uKCQyKXt3aXRoKHRoaXMpeyIsY2xvc2U6In19KTt9In0sImlmIjp7b3BlbjoiaWYoKCRub3RudWxsXzEpICYmICQxYSl7IixjbG9zZToifSJ9LCJlbHNlIjp7X2RlZmF1bHQ6eyQxOiJ0cnVlIn0sb3BlbjoifWVsc2UgaWYoKCRub3RudWxsXzEpICYmICQxYSl7In0saHRtbDp7b3BlbjoiaWYoJG5vdG51bGxfMSl7X18ucHVzaCgkMWEpO30ifSwiPSI6e19kZWZhdWx0OnskMToiJGRhdGEifSxvcGVuOiJpZigkbm90bnVsbF8xKXtfXy5wdXNoKCQuZW5jb2RlKCQxYSkpO30ifSwiISI6e29wZW46IiJ9fSxjb21wbGV0ZTpmdW5jdGlvbigpe2I9e319LGFmdGVyTWFuaXA6ZnVuY3Rpb24oZixiLGQpe3ZhciBlPWIubm9kZVR5cGU9PT0xMT9hLm1ha2VBcnJheShiLmNoaWxkTm9kZXMpOmIubm9kZVR5cGU9PT0xP1tiXTpbXTtkLmNhbGwoZixiKTttKGUpO2MrK319KTtmdW5jdGlvbiBqKGUsZyxmKXt2YXIgYixjPWY/YS5tYXAoZixmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGE9PT0ic3RyaW5nIj9lLmtleT9hLnJlcGxhY2UoLyg8XHcrKSg/PVtccz5dKSg/IVtePl0qX3RtcGxpdGVtKShbXj5dKikvZywiJDEgIitkKyc9IicrZS5rZXkrJyIgJDInKTphOmooYSxlLGEuX2N0bnQpfSk6ZTtpZihnKXJldHVybiBjO2M9Yy5qb2luKCIiKTtjLnJlcGxhY2UoL15ccyooW148XHNdW148XSopPyg8W1x3XFddKz4pKFtePl0qW14+XHNdKT9ccyokLyxmdW5jdGlvbihmLGMsZSxkKXtiPWEoZSkuZ2V0KCk7bShiKTtpZihjKWI9ayhjKS5jb25jYXQoYik7aWYoZCliPWIuY29uY2F0KGsoZCkpfSk7cmV0dXJuIGI/YjprKGMpfWZ1bmN0aW9uIGsoYyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5pbm5lckhUTUw9YztyZXR1cm4gYS5tYWtlQXJyYXkoYi5jaGlsZE5vZGVzKX1mdW5jdGlvbiBvKGIpe3JldHVybiBuZXcgRnVuY3Rpb24oImpRdWVyeSIsIiRpdGVtIiwidmFyICQ9alF1ZXJ5LGNhbGwsX189W10sJGRhdGE9JGl0ZW0uZGF0YTt3aXRoKCRkYXRhKXtfXy5wdXNoKCciK2EudHJpbShiKS5yZXBsYWNlKC8oW1xcJ10pL2csIlxcJDEiKS5yZXBsYWNlKC9bXHJcdFxuXS9nLCIgIikucmVwbGFjZSgvXCRceyhbXlx9XSopXH0vZywie3s9ICQxfX0iKS5yZXBsYWNlKC9ce1x7KFwvPykoXHcrfC4pKD86XCgoKD86W15cfV18XH0oPyFcfSkpKj8pP1wpKT8oPzpccysoLio/KT8pPyhcKCgoPzpbXlx9XXxcfSg/IVx9KSkqPylcKSk/XHMqXH1cfS9nLGZ1bmN0aW9uKG0sbCxrLGcsYixjLGQpe3ZhciBqPWEudG1wbC50YWdba10saSxlLGY7aWYoIWopdGhyb3ciVW5rbm93biB0ZW1wbGF0ZSB0YWc6ICIraztpPWouX2RlZmF1bHR8fFtdO2lmKGMmJiEvXHckLy50ZXN0KGIpKXtiKz1jO2M9IiJ9aWYoYil7Yj1oKGIpO2Q9ZD8iLCIraChkKSsiKSI6Yz8iKSI6IiI7ZT1jP2IuaW5kZXhPZigiLiIpPi0xP2IraChjKToiKCIrYisiKS5jYWxsKCRpdGVtIitkOmI7Zj1jP2U6Iih0eXBlb2YoIitiKyIpPT09J2Z1bmN0aW9uJz8oIitiKyIpLmNhbGwoJGl0ZW0pOigiK2IrIikpIn1lbHNlIGY9ZT1pLiQxfHwibnVsbCI7Zz1oKGcpO3JldHVybiInKTsiK2pbbD8iY2xvc2UiOiJvcGVuIl0uc3BsaXQoIiRub3RudWxsXzEiKS5qb2luKGI/InR5cGVvZigiK2IrIikhPT0ndW5kZWZpbmVkJyAmJiAoIitiKyIpIT1udWxsIjoidHJ1ZSIpLnNwbGl0KCIkMWEiKS5qb2luKGYpLnNwbGl0KCIkMSIpLmpvaW4oZSkuc3BsaXQoIiQyIikuam9pbihnfHxpLiQyfHwiIikrIl9fLnB1c2goJyJ9KSsiJyk7fXJldHVybiBfXzsiKX1mdW5jdGlvbiBuKGMsYil7Yy5fd3JhcD1qKGMsdHJ1ZSxhLmlzQXJyYXkoYik/YjpbcS50ZXN0KGIpP2I6YShiKS5odG1sKCldKS5qb2luKCIiKX1mdW5jdGlvbiBoKGEpe3JldHVybiBhP2EucmVwbGFjZSgvXFwnL2csIiciKS5yZXBsYWNlKC9cXFxcL2csIlxcIik6bnVsbH1mdW5jdGlvbiBzKGIpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQoYi5jbG9uZU5vZGUodHJ1ZSkpO3JldHVybiBhLmlubmVySFRNTH1mdW5jdGlvbiBtKG8pe3ZhciBuPSJfIitjLGssaixsPXt9LGUscCxoO2ZvcihlPTAscD1vLmxlbmd0aDtlPHA7ZSsrKXtpZigoaz1vW2VdKS5ub2RlVHlwZSE9PTEpY29udGludWU7aj1rLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7Zm9yKGg9ai5sZW5ndGgtMTtoPj0wO2gtLSltKGpbaF0pO20oayl9ZnVuY3Rpb24gbShqKXt2YXIgcCxoPWosayxlLG07aWYobT1qLmdldEF0dHJpYnV0ZShkKSl7d2hpbGUoaC5wYXJlbnROb2RlJiYoaD1oLnBhcmVudE5vZGUpLm5vZGVUeXBlPT09MSYmIShwPWguZ2V0QXR0cmlidXRlKGQpKSk7aWYocCE9PW0pe2g9aC5wYXJlbnROb2RlP2gubm9kZVR5cGU9PT0xMT8wOmguZ2V0QXR0cmlidXRlKGQpfHwwOjA7aWYoIShlPWJbbV0pKXtlPWZbbV07ZT1nKGUsYltoXXx8ZltoXSk7ZS5rZXk9KytpO2JbaV09ZX1jJiZvKG0pfWoucmVtb3ZlQXR0cmlidXRlKGQpfWVsc2UgaWYoYyYmKGU9YS5kYXRhKGosInRtcGxJdGVtIikpKXtvKGUua2V5KTtiW2Uua2V5XT1lO2g9YS5kYXRhKGoucGFyZW50Tm9kZSwidG1wbEl0ZW0iKTtoPWg/aC5rZXk6MH1pZihlKXtrPWU7d2hpbGUoayYmay5rZXkhPWgpe2subm9kZXMucHVzaChqKTtrPWsucGFyZW50fWRlbGV0ZSBlLl9jdG50O2RlbGV0ZSBlLl93cmFwO2EuZGF0YShqLCJ0bXBsSXRlbSIsZSl9ZnVuY3Rpb24gbyhhKXthPWErbjtlPWxbYV09bFthXXx8ZyhlLGJbZS5wYXJlbnQua2V5K25dfHxlLnBhcmVudCl9fX1mdW5jdGlvbiB1KGEsZCxjLGIpe2lmKCFhKXJldHVybiBsLnBvcCgpO2wucHVzaCh7XzphLHRtcGw6ZCxpdGVtOnRoaXMsZGF0YTpjLG9wdGlvbnM6Yn0pfWZ1bmN0aW9uIHcoZCxjLGIpe3JldHVybiBhLnRtcGwoYS50ZW1wbGF0ZShkKSxjLGIsdGhpcyl9ZnVuY3Rpb24geChiLGQpe3ZhciBjPWIub3B0aW9uc3x8e307Yy53cmFwcGVkPWQ7cmV0dXJuIGEudG1wbChhLnRlbXBsYXRlKGIudG1wbCksYi5kYXRhLGMsYi5pdGVtKX1mdW5jdGlvbiB2KGQsYyl7dmFyIGI9dGhpcy5fd3JhcDtyZXR1cm4gYS5tYXAoYShhLmlzQXJyYXkoYik/Yi5qb2luKCIiKTpiKS5maWx0ZXIoZHx8IioiKSxmdW5jdGlvbihhKXtyZXR1cm4gYz9hLmlubmVyVGV4dHx8YS50ZXh0Q29udGVudDphLm91dGVySFRNTHx8cyhhKX0pfWZ1bmN0aW9uIHQoKXt2YXIgYj10aGlzLm5vZGVzO2EudG1wbChudWxsLG51bGwsbnVsbCx0aGlzKS5pbnNlcnRCZWZvcmUoYlswXSk7YShiKS5yZW1vdmUoKX19KShqUXVlcnkpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgohZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiXSxlKToib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lKHJlcXVpcmUoImpxdWVyeSIpKTplKGpRdWVyeSl9KGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7dmFyIHQ9ZS50YWJsZXNvcnRlcj17dmVyc2lvbjoiMi4zMC41IixwYXJzZXJzOltdLHdpZGdldHM6W10sZGVmYXVsdHM6e3RoZW1lOiJkZWZhdWx0Iix3aWR0aEZpeGVkOiExLHNob3dQcm9jZXNzaW5nOiExLGhlYWRlclRlbXBsYXRlOiJ7Y29udGVudH0iLG9uUmVuZGVyVGVtcGxhdGU6bnVsbCxvblJlbmRlckhlYWRlcjpudWxsLGNhbmNlbFNlbGVjdGlvbjohMCx0YWJJbmRleDohMCxkYXRlRm9ybWF0OiJtbWRkeXl5eSIsc29ydE11bHRpU29ydEtleToic2hpZnRLZXkiLHNvcnRSZXNldEtleToiY3RybEtleSIsdXNOdW1iZXJGb3JtYXQ6ITAsZGVsYXlJbml0OiExLHNlcnZlclNpZGVTb3J0aW5nOiExLHJlc29ydDohMCxoZWFkZXJzOnt9LGlnbm9yZUNhc2U6ITAsc29ydEZvcmNlOm51bGwsc29ydExpc3Q6W10sc29ydEFwcGVuZDpudWxsLHNvcnRTdGFibGU6ITEsc29ydEluaXRpYWxPcmRlcjoiYXNjIixzb3J0TG9jYWxlQ29tcGFyZTohMSxzb3J0UmVzZXQ6ITEsc29ydFJlc3RhcnQ6ITEsZW1wdHlUbzoiYm90dG9tIixzdHJpbmdUbzoibWF4IixkdXBsaWNhdGVTcGFuOiEwLHRleHRFeHRyYWN0aW9uOiJiYXNpYyIsdGV4dEF0dHJpYnV0ZToiZGF0YS10ZXh0Iix0ZXh0U29ydGVyOm51bGwsbnVtYmVyU29ydGVyOm51bGwsaW5pdFdpZGdldHM6ITAsd2lkZ2V0Q2xhc3M6IndpZGdldC17bmFtZX0iLHdpZGdldHM6W10sd2lkZ2V0T3B0aW9uczp7emVicmE6WyJldmVuIiwib2RkIl19LGluaXRpYWxpemVkOm51bGwsdGFibGVDbGFzczoiIixjc3NBc2M6IiIsY3NzRGVzYzoiIixjc3NOb25lOiIiLGNzc0hlYWRlcjoiIixjc3NIZWFkZXJSb3c6IiIsY3NzUHJvY2Vzc2luZzoiIixjc3NDaGlsZFJvdzoidGFibGVzb3J0ZXItY2hpbGRSb3ciLGNzc0luZm9CbG9jazoidGFibGVzb3J0ZXItaW5mb09ubHkiLGNzc05vU29ydDoidGFibGVzb3J0ZXItbm9Tb3J0Iixjc3NJZ25vcmVSb3c6InRhYmxlc29ydGVyLWlnbm9yZVJvdyIsY3NzSWNvbjoidGFibGVzb3J0ZXItaWNvbiIsY3NzSWNvbk5vbmU6IiIsY3NzSWNvbkFzYzoiIixjc3NJY29uRGVzYzoiIixjc3NJY29uRGlzYWJsZWQ6IiIscG9pbnRlckNsaWNrOiJjbGljayIscG9pbnRlckRvd246Im1vdXNlZG93biIscG9pbnRlclVwOiJtb3VzZXVwIixzZWxlY3RvckhlYWRlcnM6Ij4gdGhlYWQgdGgsID4gdGhlYWQgdGQiLHNlbGVjdG9yU29ydDoidGgsIHRkIixzZWxlY3RvclJlbW92ZToiLnJlbW92ZS1tZSIsZGVidWc6ITEsaGVhZGVyTGlzdDpbXSxlbXB0aWVzOnt9LHN0cmluZ3M6e30scGFyc2VyczpbXSxnbG9iYWxpemU6MCxpbWdBdHRyOjB9LGNzczp7dGFibGU6InRhYmxlc29ydGVyIixjc3NIYXNDaGlsZDoidGFibGVzb3J0ZXItaGFzQ2hpbGRSb3ciLGNoaWxkUm93OiJ0YWJsZXNvcnRlci1jaGlsZFJvdyIsY29sZ3JvdXA6InRhYmxlc29ydGVyLWNvbGdyb3VwIixoZWFkZXI6InRhYmxlc29ydGVyLWhlYWRlciIsaGVhZGVyUm93OiJ0YWJsZXNvcnRlci1oZWFkZXJSb3ciLGhlYWRlckluOiJ0YWJsZXNvcnRlci1oZWFkZXItaW5uZXIiLGljb246InRhYmxlc29ydGVyLWljb24iLHByb2Nlc3Npbmc6InRhYmxlc29ydGVyLXByb2Nlc3NpbmciLHNvcnRBc2M6InRhYmxlc29ydGVyLWhlYWRlckFzYyIsc29ydERlc2M6InRhYmxlc29ydGVyLWhlYWRlckRlc2MiLHNvcnROb25lOiJ0YWJsZXNvcnRlci1oZWFkZXJVblNvcnRlZCJ9LGxhbmd1YWdlOntzb3J0QXNjOiJBc2NlbmRpbmcgc29ydCBhcHBsaWVkLCAiLHNvcnREZXNjOiJEZXNjZW5kaW5nIHNvcnQgYXBwbGllZCwgIixzb3J0Tm9uZToiTm8gc29ydCBhcHBsaWVkLCAiLHNvcnREaXNhYmxlZDoic29ydGluZyBpcyBkaXNhYmxlZCIsbmV4dEFzYzoiYWN0aXZhdGUgdG8gYXBwbHkgYW4gYXNjZW5kaW5nIHNvcnQiLG5leHREZXNjOiJhY3RpdmF0ZSB0byBhcHBseSBhIGRlc2NlbmRpbmcgc29ydCIsbmV4dE5vbmU6ImFjdGl2YXRlIHRvIHJlbW92ZSB0aGUgc29ydCJ9LHJlZ2V4Ont0ZW1wbGF0ZUNvbnRlbnQ6L1x7Y29udGVudFx9L2csdGVtcGxhdGVJY29uOi9ce2ljb25cfS9nLHRlbXBsYXRlTmFtZTovXHtuYW1lXH0vaSxzcGFjZXM6L1xzKy9nLG5vbldvcmQ6L1xXL2csZm9ybUVsZW1lbnRzOi8oaW5wdXR8c2VsZWN0fGJ1dHRvbnx0ZXh0YXJlYSkvaSxjaHVuazovKF4oWytcLV0/KD86XGQqKSg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8pPyR8XjB4WzAtOWEtZl0rJHxcZCspL2dpLGNodW5rczovKF5cXDB8XFwwJCkvLGhleDovXjB4WzAtOWEtZl0rJC9pLGNvbW1hOi8sL2csZGlnaXROb25VUzovW1xzfFwuXS9nLGRpZ2l0TmVnYXRpdmVUZXN0Oi9eXHMqXChbLlxkXStcKS8sZGlnaXROZWdhdGl2ZVJlcGxhY2U6L15ccypcKChbLlxkXSspXCkvLGRpZ2l0VGVzdDovXltcLSsoXT9cZCtbKV0/JC8sZGlnaXRSZXBsYWNlOi9bLC4nIlxzXS9nfSxzdHJpbmc6e21heDoxLG1pbjotMSxlbXB0eW1pbjoxLGVtcHR5bWF4Oi0xLHplcm86MCxub25lOjAsIm51bGwiOjAsdG9wOiEwLGJvdHRvbTohMX0sa2V5Q29kZXM6e2VudGVyOjEzfSxkYXRlczp7fSxpbnN0YW5jZU1ldGhvZHM6e30sc2V0dXA6ZnVuY3Rpb24ocixvKXtpZihyJiZyLnRIZWFkJiYwIT09ci50Qm9kaWVzLmxlbmd0aCYmITAhPT1yLmhhc0luaXRpYWxpemVkKXt2YXIgcz0iIixhPWUociksbj1lLm1ldGFkYXRhO3IuaGFzSW5pdGlhbGl6ZWQ9ITEsci5pc1Byb2Nlc3Npbmc9ITAsci5jb25maWc9byxlLmRhdGEociwidGFibGVzb3J0ZXIiLG8pLHQuZGVidWcobywiY29yZSIpJiYoY29uc29sZVtjb25zb2xlLmdyb3VwPyJncm91cCI6ImxvZyJdKCJJbml0aWFsaXppbmcgdGFibGVzb3J0ZXIgdiIrdC52ZXJzaW9uKSxlLmRhdGEociwic3RhcnRvdmVyYWxsdGltZXIiLG5ldyBEYXRlKSksby5zdXBwb3J0c0RhdGFPYmplY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF09cGFyc2VJbnQoZVswXSwxMCksZVswXT4xfHwxPT09ZVswXSYmcGFyc2VJbnQoZVsxXSwxMCk+PTR9KGUuZm4uanF1ZXJ5LnNwbGl0KCIuIikpLG8uZW1wdHlUbz1vLmVtcHR5VG8udG9Mb3dlckNhc2UoKSxvLnN0cmluZ1RvPW8uc3RyaW5nVG8udG9Mb3dlckNhc2UoKSxvLmxhc3Q9e3NvcnRMaXN0OltdLGNsaWNrZWRJbmRleDotMX0sL3RhYmxlc29ydGVyXC0vLnRlc3QoYS5hdHRyKCJjbGFzcyIpKXx8KHM9IiIhPT1vLnRoZW1lPyIgdGFibGVzb3J0ZXItIitvLnRoZW1lOiIiKSxvLm5hbWVzcGFjZT9vLm5hbWVzcGFjZT0iLiIrby5uYW1lc3BhY2UucmVwbGFjZSh0LnJlZ2V4Lm5vbldvcmQsIiIpOm8ubmFtZXNwYWNlPSIudGFibGVzb3J0ZXIiK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpLnNsaWNlKDIpLG8udGFibGU9cixvLiR0YWJsZT1hLmFkZENsYXNzKHQuY3NzLnRhYmxlKyIgIitvLnRhYmxlQ2xhc3MrcysiICIrby5uYW1lc3BhY2Uuc2xpY2UoMSkpLmF0dHIoInJvbGUiLCJncmlkIiksby4kaGVhZGVycz1hLmZpbmQoby5zZWxlY3RvckhlYWRlcnMpLG8uJHRhYmxlLmNoaWxkcmVuKCkuY2hpbGRyZW4oInRyIikuYXR0cigicm9sZSIsInJvdyIpLG8uJHRib2RpZXM9YS5jaGlsZHJlbigidGJvZHk6bm90KC4iK28uY3NzSW5mb0Jsb2NrKyIpIikuYXR0cih7ImFyaWEtbGl2ZSI6InBvbGl0ZSIsImFyaWEtcmVsZXZhbnQiOiJhbGwifSksby4kdGFibGUuY2hpbGRyZW4oImNhcHRpb24iKS5sZW5ndGgmJigocz1vLiR0YWJsZS5jaGlsZHJlbigiY2FwdGlvbiIpWzBdKS5pZHx8KHMuaWQ9by5uYW1lc3BhY2Uuc2xpY2UoMSkrImNhcHRpb24iKSxvLiR0YWJsZS5hdHRyKCJhcmlhLWxhYmVsbGVkYnkiLHMuaWQpKSxvLndpZGdldEluaXQ9e30sby50ZXh0RXh0cmFjdGlvbj1vLiR0YWJsZS5hdHRyKCJkYXRhLXRleHQtZXh0cmFjdGlvbiIpfHxvLnRleHRFeHRyYWN0aW9ufHwiYmFzaWMiLHQuYnVpbGRIZWFkZXJzKG8pLHQuZml4Q29sdW1uV2lkdGgociksdC5hZGRXaWRnZXRGcm9tQ2xhc3MociksdC5hcHBseVdpZGdldE9wdGlvbnMociksdC5zZXR1cFBhcnNlcnMobyksby50b3RhbFJvd3M9MCxvLmRlYnVnJiZ0LnZhbGlkYXRlT3B0aW9ucyhvKSxvLmRlbGF5SW5pdHx8dC5idWlsZENhY2hlKG8pLHQuYmluZEV2ZW50cyhyLG8uJGhlYWRlcnMsITApLHQuYmluZE1ldGhvZHMobyksby5zdXBwb3J0c0RhdGFPYmplY3QmJnZvaWQgMCE9PWEuZGF0YSgpLnNvcnRsaXN0P28uc29ydExpc3Q9YS5kYXRhKCkuc29ydGxpc3Q6biYmYS5tZXRhZGF0YSgpJiZhLm1ldGFkYXRhKCkuc29ydGxpc3QmJihvLnNvcnRMaXN0PWEubWV0YWRhdGEoKS5zb3J0bGlzdCksdC5hcHBseVdpZGdldChyLCEwKSxvLnNvcnRMaXN0Lmxlbmd0aD4wP3Quc29ydE9uKG8sby5zb3J0TGlzdCx7fSwhby5pbml0V2lkZ2V0cyk6KHQuc2V0SGVhZGVyc0NzcyhvKSxvLmluaXRXaWRnZXRzJiZ0LmFwcGx5V2lkZ2V0KHIsITEpKSxvLnNob3dQcm9jZXNzaW5nJiZhLnVuYmluZCgic29ydEJlZ2luIitvLm5hbWVzcGFjZSsiIHNvcnRFbmQiK28ubmFtZXNwYWNlKS5iaW5kKCJzb3J0QmVnaW4iK28ubmFtZXNwYWNlKyIgc29ydEVuZCIrby5uYW1lc3BhY2UsZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KG8udGltZXJQcm9jZXNzaW5nKSx0LmlzUHJvY2Vzc2luZyhyKSwic29ydEJlZ2luIj09PWUudHlwZSYmKG8udGltZXJQcm9jZXNzaW5nPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmlzUHJvY2Vzc2luZyhyLCEwKX0sNTAwKSl9KSxyLmhhc0luaXRpYWxpemVkPSEwLHIuaXNQcm9jZXNzaW5nPSExLHQuZGVidWcobywiY29yZSIpJiYoY29uc29sZS5sb2coIk92ZXJhbGwgaW5pdGlhbGl6YXRpb24gdGltZToiK3QuYmVuY2htYXJrKGUuZGF0YShyLCJzdGFydG92ZXJhbGx0aW1lciIpKSksdC5kZWJ1ZyhvLCJjb3JlIikmJmNvbnNvbGUuZ3JvdXBFbmQmJmNvbnNvbGUuZ3JvdXBFbmQoKSksYS50cmlnZ2VySGFuZGxlcigidGFibGVzb3J0ZXItaW5pdGlhbGl6ZWQiLHIpLCJmdW5jdGlvbiI9PXR5cGVvZiBvLmluaXRpYWxpemVkJiZvLmluaXRpYWxpemVkKHIpfWVsc2UgdC5kZWJ1ZyhvLCJjb3JlIikmJihyLmhhc0luaXRpYWxpemVkP2NvbnNvbGUud2FybigiU3RvcHBpbmcgaW5pdGlhbGl6YXRpb24uIFRhYmxlc29ydGVyIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQiKTpjb25zb2xlLmVycm9yKCJTdG9wcGluZyBpbml0aWFsaXphdGlvbiEgTm8gdGFibGUsIHRoZWFkIG9yIHRib2R5IixyKSl9LGJpbmRNZXRob2RzOmZ1bmN0aW9uKHIpe3ZhciBvPXIuJHRhYmxlLHM9ci5uYW1lc3BhY2UsYT0ic29ydFJlc2V0IHVwZGF0ZSB1cGRhdGVSb3dzIHVwZGF0ZUFsbCB1cGRhdGVIZWFkZXJzIGFkZFJvd3MgdXBkYXRlQ2VsbCB1cGRhdGVDb21wbGV0ZSBzb3J0b24gYXBwZW5kQ2FjaGUgdXBkYXRlQ2FjaGUgYXBwbHlXaWRnZXRJZCBhcHBseVdpZGdldHMgcmVmcmVzaFdpZGdldHMgZGVzdHJveSBtb3VzZXVwIG1vdXNlbGVhdmUgIi5zcGxpdCgiICIpLmpvaW4ocysiICIpO28udW5iaW5kKGEucmVwbGFjZSh0LnJlZ2V4LnNwYWNlcywiICIpKS5iaW5kKCJzb3J0UmVzZXQiK3MsZnVuY3Rpb24oZSxyKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuc29ydFJlc2V0KHRoaXMuY29uZmlnLGZ1bmN0aW9uKGUpe2UuaXNBcHBseWluZ1dpZGdldHM/c2V0VGltZW91dChmdW5jdGlvbigpe3QuYXBwbHlXaWRnZXQoZSwiIixyKX0sMTAwKTp0LmFwcGx5V2lkZ2V0KGUsIiIscil9KX0pLmJpbmQoInVwZGF0ZUFsbCIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZUFsbCh0aGlzLmNvbmZpZyxyLG8pfSkuYmluZCgidXBkYXRlIitzKyIgdXBkYXRlUm93cyIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZSh0aGlzLmNvbmZpZyxyLG8pfSkuYmluZCgidXBkYXRlSGVhZGVycyIrcyxmdW5jdGlvbihlLHIpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC51cGRhdGVIZWFkZXJzKHRoaXMuY29uZmlnLHIpfSkuYmluZCgidXBkYXRlQ2VsbCIrcyxmdW5jdGlvbihlLHIsbyxzKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQ2VsbCh0aGlzLmNvbmZpZyxyLG8scyl9KS5iaW5kKCJhZGRSb3dzIitzLGZ1bmN0aW9uKGUscixvLHMpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5hZGRSb3dzKHRoaXMuY29uZmlnLHIsbyxzKX0pLmJpbmQoInVwZGF0ZUNvbXBsZXRlIitzLGZ1bmN0aW9uKCl7dGhpcy5pc1VwZGF0aW5nPSExfSkuYmluZCgic29ydG9uIitzLGZ1bmN0aW9uKGUscixvLHMpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5zb3J0T24odGhpcy5jb25maWcscixvLHMpfSkuYmluZCgiYXBwZW5kQ2FjaGUiK3MsZnVuY3Rpb24ocixvLHMpe3Iuc3RvcFByb3BhZ2F0aW9uKCksdC5hcHBlbmRDYWNoZSh0aGlzLmNvbmZpZyxzKSxlLmlzRnVuY3Rpb24obykmJm8odGhpcyl9KS5iaW5kKCJ1cGRhdGVDYWNoZSIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZUNhY2hlKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJhcHBseVdpZGdldElkIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGx5V2lkZ2V0SWQodGhpcyxyKX0pLmJpbmQoImFwcGx5V2lkZ2V0cyIrcyxmdW5jdGlvbihlLHIpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5hcHBseVdpZGdldCh0aGlzLCExLHIpfSkuYmluZCgicmVmcmVzaFdpZGdldHMiK3MsZnVuY3Rpb24oZSxyLG8pe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5yZWZyZXNoV2lkZ2V0cyh0aGlzLHIsbyl9KS5iaW5kKCJyZW1vdmVXaWRnZXQiK3MsZnVuY3Rpb24oZSxyLG8pe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5yZW1vdmVXaWRnZXQodGhpcyxyLG8pfSkuYmluZCgiZGVzdHJveSIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmRlc3Ryb3kodGhpcyxyLG8pfSkuYmluZCgicmVzZXRUb0xvYWRTdGF0ZSIrcyxmdW5jdGlvbihvKXtvLnN0b3BQcm9wYWdhdGlvbigpLHQucmVtb3ZlV2lkZ2V0KHRoaXMsITAsITEpO3ZhciBzPWUuZXh0ZW5kKCEwLHt9LHIub3JpZ2luYWxTZXR0aW5ncyk7KHI9ZS5leHRlbmQoITAse30sdC5kZWZhdWx0cyxzKSkub3JpZ2luYWxTZXR0aW5ncz1zLHRoaXMuaGFzSW5pdGlhbGl6ZWQ9ITEsdC5zZXR1cCh0aGlzLHIpfSl9LGJpbmRFdmVudHM6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG49KHI9ZShyKVswXSkuY29uZmlnLGk9bi5uYW1lc3BhY2UsbD1udWxsOyEwIT09cyYmKG8uYWRkQ2xhc3MoaS5zbGljZSgxKSsiX2V4dHJhX2hlYWRlcnMiKSwoYT10LmdldENsb3Nlc3QobywidGFibGUiKSkubGVuZ3RoJiYiVEFCTEUiPT09YVswXS5ub2RlTmFtZSYmYVswXSE9PXImJmUoYVswXSkuYWRkQ2xhc3MoaS5zbGljZSgxKSsiX2V4dHJhX3RhYmxlIikpLGE9KG4ucG9pbnRlckRvd24rIiAiK24ucG9pbnRlclVwKyIgIituLnBvaW50ZXJDbGljaysiIHNvcnQga2V5dXAgIikucmVwbGFjZSh0LnJlZ2V4LnNwYWNlcywiICIpLnNwbGl0KCIgIikuam9pbihpKyIgIiksby5maW5kKG4uc2VsZWN0b3JTb3J0KS5hZGQoby5maWx0ZXIobi5zZWxlY3RvclNvcnQpKS51bmJpbmQoYSkuYmluZChhLGZ1bmN0aW9uKHIsbyl7dmFyIHMsYSxpLGQ9ZShyLnRhcmdldCksYz0iICIrci50eXBlKyIgIjtpZighKDEhPT0oci53aGljaHx8ci5idXR0b24pJiYhYy5tYXRjaCgiICIrbi5wb2ludGVyQ2xpY2srIiB8IHNvcnQgfCBrZXl1cCAiKXx8IiBrZXl1cCAiPT09YyYmci53aGljaCE9PXQua2V5Q29kZXMuZW50ZXJ8fGMubWF0Y2goIiAiK24ucG9pbnRlckNsaWNrKyIgIikmJnZvaWQgMCE9PXIud2hpY2h8fGMubWF0Y2goIiAiK24ucG9pbnRlclVwKyIgIikmJmwhPT1yLnRhcmdldCYmITAhPT1vKSl7aWYoYy5tYXRjaCgiICIrbi5wb2ludGVyRG93bisiICIpKXJldHVybiBsPXIudGFyZ2V0LHZvaWQoIjEiPT09KGk9ZC5qcXVlcnkuc3BsaXQoIi4iKSlbMF0mJmlbMV08NCYmci5wcmV2ZW50RGVmYXVsdCgpKTtpZihsPW51bGwscz10LmdldENsb3Nlc3QoZSh0aGlzKSwiLiIrdC5jc3MuaGVhZGVyKSx0LnJlZ2V4LmZvcm1FbGVtZW50cy50ZXN0KHIudGFyZ2V0Lm5vZGVOYW1lKXx8ZC5oYXNDbGFzcyhuLmNzc05vU29ydCl8fGQucGFyZW50cygiLiIrbi5jc3NOb1NvcnQpLmxlbmd0aD4wfHxzLmhhc0NsYXNzKCJzb3J0ZXItZmFsc2UiKXx8ZC5wYXJlbnRzKCJidXR0b24iKS5sZW5ndGg+MClyZXR1cm4hbi5jYW5jZWxTZWxlY3Rpb247bi5kZWxheUluaXQmJnQuaXNFbXB0eU9iamVjdChuLmNhY2hlKSYmdC5idWlsZENhY2hlKG4pLG4ubGFzdC5jbGlja2VkSW5kZXg9cy5hdHRyKCJkYXRhLWNvbHVtbiIpfHxzLmluZGV4KCksKGE9bi4kaGVhZGVySW5kZXhlZFtuLmxhc3QuY2xpY2tlZEluZGV4XVswXSkmJiFhLnNvcnREaXNhYmxlZCYmdC5pbml0U29ydChuLGEscil9fSksbi5jYW5jZWxTZWxlY3Rpb24mJm8uYXR0cigidW5zZWxlY3RhYmxlIiwib24iKS5iaW5kKCJzZWxlY3RzdGFydCIsITEpLmNzcyh7InVzZXItc2VsZWN0Ijoibm9uZSIsTW96VXNlclNlbGVjdDoibm9uZSJ9KX0sYnVpbGRIZWFkZXJzOmZ1bmN0aW9uKHIpe3ZhciBvLHMsYSxuO2ZvcihyLmhlYWRlckxpc3Q9W10sci5oZWFkZXJDb250ZW50PVtdLHIuc29ydFZhcnM9W10sdC5kZWJ1ZyhyLCJjb3JlIikmJihhPW5ldyBEYXRlKSxyLmNvbHVtbnM9dC5jb21wdXRlQ29sdW1uSW5kZXgoci4kdGFibGUuY2hpbGRyZW4oInRoZWFkLCB0Zm9vdCIpLmNoaWxkcmVuKCJ0ciIpKSxzPXIuY3NzSWNvbj8nPGkgY2xhc3M9IicrKHIuY3NzSWNvbj09PXQuY3NzLmljb24/dC5jc3MuaWNvbjpyLmNzc0ljb24rIiAiK3QuY3NzLmljb24pKyciPjwvaT4nOiIiLHIuJGhlYWRlcnM9ZShlLm1hcChyLiR0YWJsZS5maW5kKHIuc2VsZWN0b3JIZWFkZXJzKSxmdW5jdGlvbihvLGEpe3ZhciBuLGksbCxkLGMsZz1lKG8pO2lmKCF0LmdldENsb3Nlc3QoZywidHIiKS5oYXNDbGFzcyhyLmNzc0lnbm9yZVJvdykpcmV0dXJuLyh0aHx0ZCkvaS50ZXN0KG8ubm9kZU5hbWUpfHwoYz10LmdldENsb3Nlc3QoZywidGgsIHRkIiksZy5hdHRyKCJkYXRhLWNvbHVtbiIsYy5hdHRyKCJkYXRhLWNvbHVtbiIpKSksbj10LmdldENvbHVtbkRhdGEoci50YWJsZSxyLmhlYWRlcnMsYSwhMCksci5oZWFkZXJDb250ZW50W2FdPWcuaHRtbCgpLCIiPT09ci5oZWFkZXJUZW1wbGF0ZXx8Zy5maW5kKCIuIit0LmNzcy5oZWFkZXJJbikubGVuZ3RofHwoZD1yLmhlYWRlclRlbXBsYXRlLnJlcGxhY2UodC5yZWdleC50ZW1wbGF0ZUNvbnRlbnQsZy5odG1sKCkpLnJlcGxhY2UodC5yZWdleC50ZW1wbGF0ZUljb24sZy5maW5kKCIuIit0LmNzcy5pY29uKS5sZW5ndGg/IiI6cyksci5vblJlbmRlclRlbXBsYXRlJiYoaT1yLm9uUmVuZGVyVGVtcGxhdGUuYXBwbHkoZyxbYSxkXSkpJiYic3RyaW5nIj09dHlwZW9mIGkmJihkPWkpLGcuaHRtbCgnPGRpdiBjbGFzcz0iJyt0LmNzcy5oZWFkZXJJbisnIj4nK2QrIjwvZGl2PiIpKSxyLm9uUmVuZGVySGVhZGVyJiZyLm9uUmVuZGVySGVhZGVyLmFwcGx5KGcsW2EscixyLiR0YWJsZV0pLGw9cGFyc2VJbnQoZy5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxvLmNvbHVtbj1sLGM9dC5nZXRPcmRlcih0LmdldERhdGEoZyxuLCJzb3J0SW5pdGlhbE9yZGVyIil8fHIuc29ydEluaXRpYWxPcmRlciksci5zb3J0VmFyc1tsXT17Y291bnQ6LTEsb3JkZXI6Yz9yLnNvcnRSZXNldD9bMSwwLDJdOlsxLDBdOnIuc29ydFJlc2V0P1swLDEsMl06WzAsMV0sbG9ja2VkT3JkZXI6ITF9LHZvaWQgMCE9PShjPXQuZ2V0RGF0YShnLG4sImxvY2tlZE9yZGVyIil8fCExKSYmITEhPT1jJiYoci5zb3J0VmFyc1tsXS5sb2NrZWRPcmRlcj0hMCxyLnNvcnRWYXJzW2xdLm9yZGVyPXQuZ2V0T3JkZXIoYyk/WzEsMV06WzAsMF0pLHIuaGVhZGVyTGlzdFthXT1vLGcuYWRkQ2xhc3ModC5jc3MuaGVhZGVyKyIgIityLmNzc0hlYWRlciksdC5nZXRDbG9zZXN0KGcsInRyIikuYWRkQ2xhc3ModC5jc3MuaGVhZGVyUm93KyIgIityLmNzc0hlYWRlclJvdykuYXR0cigicm9sZSIsInJvdyIpLHIudGFiSW5kZXgmJmcuYXR0cigidGFiaW5kZXgiLDApLG99KSksci4kaGVhZGVySW5kZXhlZD1bXSxuPTA7bjxyLmNvbHVtbnM7bisrKXQuaXNFbXB0eU9iamVjdChyLnNvcnRWYXJzW25dKSYmKHIuc29ydFZhcnNbbl09e30pLG89ci4kaGVhZGVycy5maWx0ZXIoJ1tkYXRhLWNvbHVtbj0iJytuKyciXScpLHIuJGhlYWRlckluZGV4ZWRbbl09by5sZW5ndGg/by5ub3QoIi5zb3J0ZXItZmFsc2UiKS5sZW5ndGg/by5ub3QoIi5zb3J0ZXItZmFsc2UiKS5maWx0ZXIoIjpsYXN0Iik6by5maWx0ZXIoIjpsYXN0Iik6ZSgpO3IuJHRhYmxlLmZpbmQoci5zZWxlY3RvckhlYWRlcnMpLmF0dHIoe3Njb3BlOiJjb2wiLHJvbGU6ImNvbHVtbmhlYWRlciJ9KSx0LnVwZGF0ZUhlYWRlcihyKSx0LmRlYnVnKHIsImNvcmUiKSYmKGNvbnNvbGUubG9nKCJCdWlsdCBoZWFkZXJzOiIrdC5iZW5jaG1hcmsoYSkpLGNvbnNvbGUubG9nKHIuJGhlYWRlcnMpKX0sYWRkSW5zdGFuY2VNZXRob2RzOmZ1bmN0aW9uKHIpe2UuZXh0ZW5kKHQuaW5zdGFuY2VNZXRob2RzLHIpfSxzZXR1cFBhcnNlcnM6ZnVuY3Rpb24oZSxyKXt2YXIgbyxzLGEsbixpLGwsZCxjLGcscCx1LGYsaCxtLGI9ZS50YWJsZSx5PTAsdz10LmRlYnVnKGUsImNvcmUiKSx4PXt9O2lmKGUuJHRib2RpZXM9ZS4kdGFibGUuY2hpbGRyZW4oInRib2R5Om5vdCguIitlLmNzc0luZm9CbG9jaysiKSIpLGg9dm9pZCAwPT09cj9lLiR0Ym9kaWVzOnIsMD09PShtPWgubGVuZ3RoKSlyZXR1cm4gdz9jb25zb2xlLndhcm4oIldhcm5pbmc6ICpFbXB0eSB0YWJsZSEqIE5vdCBidWlsZGluZyBhIHBhcnNlciBjYWNoZSIpOiIiO2Zvcih3JiYoZj1uZXcgRGF0ZSxjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIkRldGVjdGluZyBwYXJzZXJzIGZvciBlYWNoIGNvbHVtbiIpKSxzPXtleHRyYWN0b3JzOltdLHBhcnNlcnM6W119O3k8bTspe2lmKChvPWhbeV0ucm93cykubGVuZ3RoKWZvcihpPTAsbj1lLmNvbHVtbnMsbD0wO2w8bjtsKyspe2lmKChkPWUuJGhlYWRlckluZGV4ZWRbaV0pJiZkLmxlbmd0aCYmKGM9dC5nZXRDb2x1bW5EYXRhKGIsZS5oZWFkZXJzLGkpLHU9dC5nZXRQYXJzZXJCeUlkKHQuZ2V0RGF0YShkLGMsImV4dHJhY3RvciIpKSxwPXQuZ2V0UGFyc2VyQnlJZCh0LmdldERhdGEoZCxjLCJzb3J0ZXIiKSksZz0iZmFsc2UiPT09dC5nZXREYXRhKGQsYywicGFyc2VyIiksZS5lbXB0aWVzW2ldPSh0LmdldERhdGEoZCxjLCJlbXB0eSIpfHxlLmVtcHR5VG98fChlLmVtcHR5VG9Cb3R0b20/ImJvdHRvbSI6InRvcCIpKS50b0xvd2VyQ2FzZSgpLGUuc3RyaW5nc1tpXT0odC5nZXREYXRhKGQsYywic3RyaW5nIil8fGUuc3RyaW5nVG98fCJtYXgiKS50b0xvd2VyQ2FzZSgpLGcmJihwPXQuZ2V0UGFyc2VyQnlJZCgibm8tcGFyc2VyIikpLHV8fCh1PSExKSxwfHwocD10LmRldGVjdFBhcnNlckZvckNvbHVtbihlLG8sLTEsaSkpLHcmJih4WyIoIitpKyIpICIrZC50ZXh0KCldPXtwYXJzZXI6cC5pZCxleHRyYWN0b3I6dT91LmlkOiJub25lIixzdHJpbmc6ZS5zdHJpbmdzW2ldLGVtcHR5OmUuZW1wdGllc1tpXX0pLHMucGFyc2Vyc1tpXT1wLHMuZXh0cmFjdG9yc1tpXT11LChhPWRbMF0uY29sU3Bhbi0xKT4wKSlmb3IoaSs9YSxuKz1hO2ErMT4wOylzLnBhcnNlcnNbaS1hXT1wLHMuZXh0cmFjdG9yc1tpLWFdPXUsYS0tO2krK315Kz1zLnBhcnNlcnMubGVuZ3RoP206MX13JiYodC5pc0VtcHR5T2JqZWN0KHgpP2NvbnNvbGUud2FybigiICBObyBwYXJzZXJzIGRldGVjdGVkISIpOmNvbnNvbGVbY29uc29sZS50YWJsZT8idGFibGUiOiJsb2ciXSh4KSxjb25zb2xlLmxvZygiQ29tcGxldGVkIGRldGVjdGluZyBwYXJzZXJzIit0LmJlbmNobWFyayhmKSksY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpKSxlLnBhcnNlcnM9cy5wYXJzZXJzLGUuZXh0cmFjdG9ycz1zLmV4dHJhY3RvcnN9LGFkZFBhcnNlcjpmdW5jdGlvbihlKXt2YXIgcixvPXQucGFyc2Vycy5sZW5ndGgscz0hMDtmb3Iocj0wO3I8bztyKyspdC5wYXJzZXJzW3JdLmlkLnRvTG93ZXJDYXNlKCk9PT1lLmlkLnRvTG93ZXJDYXNlKCkmJihzPSExKTtzJiYodC5wYXJzZXJzW3QucGFyc2Vycy5sZW5ndGhdPWUpfSxnZXRQYXJzZXJCeUlkOmZ1bmN0aW9uKGUpe2lmKCJmYWxzZSI9PWUpcmV0dXJuITE7dmFyIHIsbz10LnBhcnNlcnMubGVuZ3RoO2ZvcihyPTA7cjxvO3IrKylpZih0LnBhcnNlcnNbcl0uaWQudG9Mb3dlckNhc2UoKT09PWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKXJldHVybiB0LnBhcnNlcnNbcl07cmV0dXJuITF9LGRldGVjdFBhcnNlckZvckNvbHVtbjpmdW5jdGlvbihyLG8scyxhKXtmb3IodmFyIG4saSxsLGQ9dC5wYXJzZXJzLmxlbmd0aCxjPSExLGc9IiIscD10LmRlYnVnKHIsImNvcmUiKSx1PSEwOyIiPT09ZyYmdTspKGw9b1srK3NdKSYmczw1MD9sLmNsYXNzTmFtZS5pbmRleE9mKHQuY3NzSWdub3JlUm93KTwwJiYoYz1vW3NdLmNlbGxzW2FdLGc9dC5nZXRFbGVtZW50VGV4dChyLGMsYSksaT1lKGMpLHAmJmNvbnNvbGUubG9nKCJDaGVja2luZyBpZiB2YWx1ZSB3YXMgZW1wdHkgb24gcm93ICIrcysiLCBjb2x1bW46ICIrYSsnOiAiJytnKyciJykpOnU9ITE7Zm9yKDstLWQ+PTA7KWlmKChuPXQucGFyc2Vyc1tkXSkmJiJ0ZXh0IiE9PW4uaWQmJm4uaXMmJm4uaXMoZyxyLnRhYmxlLGMsaSkpcmV0dXJuIG47cmV0dXJuIHQuZ2V0UGFyc2VyQnlJZCgidGV4dCIpfSxnZXRFbGVtZW50VGV4dDpmdW5jdGlvbihyLG8scyl7aWYoIW8pcmV0dXJuIiI7dmFyIGEsbj1yLnRleHRFeHRyYWN0aW9ufHwiIixpPW8uanF1ZXJ5P286ZShvKTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIG4/ImJhc2ljIj09PW4mJnZvaWQgMCE9PShhPWkuYXR0cihyLnRleHRBdHRyaWJ1dGUpKT9lLnRyaW0oYSk6ZS50cmltKG8udGV4dENvbnRlbnR8fGkudGV4dCgpKToiZnVuY3Rpb24iPT10eXBlb2Ygbj9lLnRyaW0obihpWzBdLHIudGFibGUscykpOiJmdW5jdGlvbiI9PXR5cGVvZihhPXQuZ2V0Q29sdW1uRGF0YShyLnRhYmxlLG4scykpP2UudHJpbShhKGlbMF0sci50YWJsZSxzKSk6ZS50cmltKGlbMF0udGV4dENvbnRlbnR8fGkudGV4dCgpKX0sZ2V0UGFyc2VkVGV4dDpmdW5jdGlvbihlLHIsbyxzKXt2b2lkIDA9PT1zJiYocz10LmdldEVsZW1lbnRUZXh0KGUscixvKSk7dmFyIGE9IiIrcyxuPWUucGFyc2Vyc1tvXSxpPWUuZXh0cmFjdG9yc1tvXTtyZXR1cm4gbiYmKGkmJiJmdW5jdGlvbiI9PXR5cGVvZiBpLmZvcm1hdCYmKHM9aS5mb3JtYXQocyxlLnRhYmxlLHIsbykpLGE9Im5vLXBhcnNlciI9PT1uLmlkPyIiOm4uZm9ybWF0KCIiK3MsZS50YWJsZSxyLG8pLGUuaWdub3JlQ2FzZSYmInN0cmluZyI9PXR5cGVvZiBhJiYoYT1hLnRvTG93ZXJDYXNlKCkpKSxhfSxidWlsZENhY2hlOmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbCxkLGMsZyxwLHUsZixoLG0sYix5LHcseCx2LEMsJCxJLEQsUixUPXIudGFibGUsTD1yLnBhcnNlcnMsQT10LmRlYnVnKHIsImNvcmUiKTtpZihyLiR0Ym9kaWVzPXIuJHRhYmxlLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrci5jc3NJbmZvQmxvY2srIikiKSxnPXZvaWQgMD09PXM/ci4kdGJvZGllczpzLHIuY2FjaGU9e30sci50b3RhbFJvd3M9MCwhTClyZXR1cm4gQT9jb25zb2xlLndhcm4oIldhcm5pbmc6ICpFbXB0eSB0YWJsZSEqIE5vdCBidWlsZGluZyBhIGNhY2hlIik6IiI7Zm9yKEEmJihtPW5ldyBEYXRlKSxyLnNob3dQcm9jZXNzaW5nJiZ0LmlzUHJvY2Vzc2luZyhULCEwKSxjPTA7YzxnLmxlbmd0aDtjKyspe2Zvcih4PVtdLGE9ci5jYWNoZVtjXT17bm9ybWFsaXplZDpbXX0sYj1nW2NdJiZnW2NdLnJvd3MubGVuZ3RofHwwLGw9MDtsPGI7KytsKWlmKHk9e2NoaWxkOltdLHJhdzpbXX0scD1lKGdbY10ucm93c1tsXSksdT1bXSwhcC5oYXNDbGFzcyhyLnNlbGVjdG9yUmVtb3ZlLnNsaWNlKDEpKSlpZihwLmhhc0NsYXNzKHIuY3NzQ2hpbGRSb3cpJiYwIT09bClmb3IoRD1hLm5vcm1hbGl6ZWQubGVuZ3RoLTEsKHc9YS5ub3JtYWxpemVkW0RdW3IuY29sdW1uc10pLiRyb3c9dy4kcm93LmFkZChwKSxwLnByZXYoKS5oYXNDbGFzcyhyLmNzc0NoaWxkUm93KXx8cC5wcmV2KCkuYWRkQ2xhc3ModC5jc3MuY3NzSGFzQ2hpbGQpLGY9cC5jaGlsZHJlbigidGgsIHRkIiksRD13LmNoaWxkLmxlbmd0aCx3LmNoaWxkW0RdPVtdLEM9MCxJPXIuY29sdW1ucyxkPTA7ZDxJO2QrKykoaD1mW2RdKSYmKHcuY2hpbGRbRF1bZF09dC5nZXRQYXJzZWRUZXh0KHIsaCxkKSwodj1mW2RdLmNvbFNwYW4tMSk+MCYmKEMrPXYsSSs9dikpLEMrKztlbHNle2Zvcih5LiRyb3c9cCx5Lm9yZGVyPWwsQz0wLEk9ci5jb2x1bW5zLGQ9MDtkPEk7KytkKXtpZigoaD1wWzBdLmNlbGxzW2RdKSYmQzxyLmNvbHVtbnMmJighKCQ9dm9pZCAwIT09TFtDXSkmJkEmJmNvbnNvbGUud2FybigiTm8gcGFyc2VyIGZvdW5kIGZvciByb3c6ICIrbCsiLCBjb2x1bW46ICIrZCsnOyBjZWxsIGNvbnRhaW5pbmc6ICInK2UoaCkudGV4dCgpKyciOyBkb2VzIGl0IGhhdmUgYSBoZWFkZXI/Jyksbj10LmdldEVsZW1lbnRUZXh0KHIsaCxDKSx5LnJhd1tDXT1uLGk9dC5nZXRQYXJzZWRUZXh0KHIsaCxDLG4pLHVbQ109aSwkJiYibnVtZXJpYyI9PT0oTFtDXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKHhbQ109TWF0aC5tYXgoTWF0aC5hYnMoaSl8fDAseFtDXXx8MCkpLCh2PWguY29sU3Bhbi0xKT4wKSl7Zm9yKFI9MDtSPD12OylpPXIuZHVwbGljYXRlU3Bhbnx8MD09PVI/bjoic3RyaW5nIiE9dHlwZW9mIHIudGV4dEV4dHJhY3Rpb24/dC5nZXRFbGVtZW50VGV4dChyLGgsQytSKXx8IiI6IiIseS5yYXdbQytSXT1pLHVbQytSXT1pLFIrKztDKz12LEkrPXZ9QysrfXVbci5jb2x1bW5zXT15LGEubm9ybWFsaXplZFthLm5vcm1hbGl6ZWQubGVuZ3RoXT11fWEuY29sTWF4PXgsci50b3RhbFJvd3MrPWEubm9ybWFsaXplZC5sZW5ndGh9aWYoci5zaG93UHJvY2Vzc2luZyYmdC5pc1Byb2Nlc3NpbmcoVCksQSl7Zm9yKEQ9TWF0aC5taW4oNSxyLmNhY2hlWzBdLm5vcm1hbGl6ZWQubGVuZ3RoKSxjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIkJ1aWxkaW5nIGNhY2hlIGZvciAiK3IudG90YWxSb3dzKyIgcm93cyAoc2hvd2luZyAiK0QrIiByb3dzIGluIGxvZykgYW5kICIrci5jb2x1bW5zKyIgY29sdW1ucyIrdC5iZW5jaG1hcmsobSkpLG49e30sZD0wO2Q8ci5jb2x1bW5zO2QrKylmb3IoQz0wO0M8RDtDKyspblsicm93OiAiK0NdfHwoblsicm93OiAiK0NdPXt9KSxuWyJyb3c6ICIrQ11bci4kaGVhZGVySW5kZXhlZFtkXS50ZXh0KCldPXIuY2FjaGVbMF0ubm9ybWFsaXplZFtDXVtkXTtjb25zb2xlW2NvbnNvbGUudGFibGU/InRhYmxlIjoibG9nIl0obiksY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpfWUuaXNGdW5jdGlvbihvKSYmbyhUKX0sZ2V0Q29sdW1uVGV4dDpmdW5jdGlvbihyLG8scyxhKXt2YXIgbixpLGwsZCxjLGcscCx1LGYsaCxtPSJmdW5jdGlvbiI9PXR5cGVvZiBzLGI9ImFsbCI9PT1vLHk9e3JhdzpbXSxwYXJzZWQ6W10sJGNlbGw6W119LHc9KHI9ZShyKVswXSkuY29uZmlnO2lmKCF0LmlzRW1wdHlPYmplY3Qodykpe2ZvcihjPXcuJHRib2RpZXMubGVuZ3RoLG49MDtuPGM7bisrKWZvcihnPShsPXcuY2FjaGVbbl0ubm9ybWFsaXplZCkubGVuZ3RoLGk9MDtpPGc7aSsrKWQ9bFtpXSxhJiYhZFt3LmNvbHVtbnNdLiRyb3cuaXMoYSl8fChoPSEwLHU9Yj9kLnNsaWNlKDAsdy5jb2x1bW5zKTpkW29dLGQ9ZFt3LmNvbHVtbnNdLHA9Yj9kLnJhdzpkLnJhd1tvXSxmPWI/ZC4kcm93LmNoaWxkcmVuKCk6ZC4kcm93LmNoaWxkcmVuKCkuZXEobyksbSYmKGg9cyh7dGJvZHlJbmRleDpuLHJvd0luZGV4OmkscGFyc2VkOnUscmF3OnAsJHJvdzpkLiRyb3csJGNlbGw6Zn0pKSwhMSE9PWgmJih5LnBhcnNlZFt5LnBhcnNlZC5sZW5ndGhdPXUseS5yYXdbeS5yYXcubGVuZ3RoXT1wLHkuJGNlbGxbeS4kY2VsbC5sZW5ndGhdPWYpKTtyZXR1cm4geX10LmRlYnVnKHcsImNvcmUiKSYmY29uc29sZS53YXJuKCJObyBjYWNoZSBmb3VuZCAtIGFib3J0aW5nIGdldENvbHVtblRleHQgZnVuY3Rpb24hIil9LHNldEhlYWRlcnNDc3M6ZnVuY3Rpb24ocil7dmFyIG8scyxhPXIuc29ydExpc3Qsbj1hLmxlbmd0aCxpPXQuY3NzLnNvcnROb25lKyIgIityLmNzc05vbmUsbD1bdC5jc3Muc29ydEFzYysiICIrci5jc3NBc2MsdC5jc3Muc29ydERlc2MrIiAiK3IuY3NzRGVzY10sZD1bci5jc3NJY29uQXNjLHIuY3NzSWNvbkRlc2Msci5jc3NJY29uTm9uZV0sYz1bImFzY2VuZGluZyIsImRlc2NlbmRpbmciXSxnPWZ1bmN0aW9uKGUscil7ZS5yZW1vdmVDbGFzcyhpKS5hZGRDbGFzcyhsW3JdKS5hdHRyKCJhcmlhLXNvcnQiLGNbcl0pLmZpbmQoIi4iK3QuY3NzLmljb24pLnJlbW92ZUNsYXNzKGRbMl0pLmFkZENsYXNzKGRbcl0pfSxwPXIuJHRhYmxlLmZpbmQoInRmb290IHRyIikuY2hpbGRyZW4oInRkLCB0aCIpLmFkZChlKHIubmFtZXNwYWNlKyJfZXh0cmFfaGVhZGVycyIpKS5yZW1vdmVDbGFzcyhsLmpvaW4oIiAiKSksdT1yLiRoZWFkZXJzLmFkZChlKCJ0aGVhZCAiK3IubmFtZXNwYWNlKyJfZXh0cmFfaGVhZGVycyIpKS5yZW1vdmVDbGFzcyhsLmpvaW4oIiAiKSkuYWRkQ2xhc3MoaSkuYXR0cigiYXJpYS1zb3J0Iiwibm9uZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLnJlbW92ZUNsYXNzKGQuam9pbigiICIpKS5lbmQoKTtmb3IodS5ub3QoIi5zb3J0ZXItZmFsc2UiKS5maW5kKCIuIit0LmNzcy5pY29uKS5hZGRDbGFzcyhkWzJdKSxyLmNzc0ljb25EaXNhYmxlZCYmdS5maWx0ZXIoIi5zb3J0ZXItZmFsc2UiKS5maW5kKCIuIit0LmNzcy5pY29uKS5hZGRDbGFzcyhyLmNzc0ljb25EaXNhYmxlZCksbz0wO288bjtvKyspaWYoMiE9PWFbb11bMV0pe2lmKHU9ci4kaGVhZGVycy5maWx0ZXIoZnVuY3Rpb24oZSl7Zm9yKHZhciBvPSEwLHM9ci4kaGVhZGVycy5lcShlKSxhPXBhcnNlSW50KHMuYXR0cigiZGF0YS1jb2x1bW4iKSwxMCksbj1hK3QuZ2V0Q2xvc2VzdChzLCJ0aCwgdGQiKVswXS5jb2xTcGFuO2E8bjthKyspbz0hIW8mJihvfHx0LmlzVmFsdWVJbkFycmF5KGEsci5zb3J0TGlzdCk+LTEpO3JldHVybiBvfSksKHU9dS5ub3QoIi5zb3J0ZXItZmFsc2UiKS5maWx0ZXIoJ1tkYXRhLWNvbHVtbj0iJythW29dWzBdKyciXScrKDE9PT1uPyI6bGFzdCI6IiIpKSkubGVuZ3RoKWZvcihzPTA7czx1Lmxlbmd0aDtzKyspdVtzXS5zb3J0RGlzYWJsZWR8fGcodS5lcShzKSxhW29dWzFdKTtwLmxlbmd0aCYmZyhwLmZpbHRlcignW2RhdGEtY29sdW1uPSInK2Fbb11bMF0rJyJdJyksYVtvXVsxXSl9Zm9yKG49ci4kaGVhZGVycy5sZW5ndGgsbz0wO288bjtvKyspdC5zZXRDb2x1bW5BcmlhTGFiZWwocixyLiRoZWFkZXJzLmVxKG8pKX0sZ2V0Q2xvc2VzdDpmdW5jdGlvbih0LHIpe3JldHVybiBlLmZuLmNsb3Nlc3Q/dC5jbG9zZXN0KHIpOnQuaXMocik/dDp0LnBhcmVudHMocikuZmlsdGVyKCI6Zmlyc3QiKX0sc2V0Q29sdW1uQXJpYUxhYmVsOmZ1bmN0aW9uKHIsbyxzKXtpZihvLmxlbmd0aCl7dmFyIGE9cGFyc2VJbnQoby5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxuPXIuc29ydFZhcnNbYV0saT1vLmhhc0NsYXNzKHQuY3NzLnNvcnRBc2MpPyJzb3J0QXNjIjpvLmhhc0NsYXNzKHQuY3NzLnNvcnREZXNjKT8ic29ydERlc2MiOiJzb3J0Tm9uZSIsbD1lLnRyaW0oby50ZXh0KCkpKyI6ICIrdC5sYW5ndWFnZVtpXTtvLmhhc0NsYXNzKCJzb3J0ZXItZmFsc2UiKXx8ITE9PT1zP2wrPXQubGFuZ3VhZ2Uuc29ydERpc2FibGVkOihpPShuLmNvdW50KzEpJW4ub3JkZXIubGVuZ3RoLHM9bi5vcmRlcltpXSxsKz10Lmxhbmd1YWdlWzA9PT1zPyJuZXh0QXNjIjoxPT09cz8ibmV4dERlc2MiOiJuZXh0Tm9uZSJdKSxvLmF0dHIoImFyaWEtbGFiZWwiLGwpfX0sdXBkYXRlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciByLG8scyxhLG49ZS50YWJsZSxpPWUuJGhlYWRlcnMubGVuZ3RoO2ZvcihyPTA7cjxpO3IrKylzPWUuJGhlYWRlcnMuZXEociksYT10LmdldENvbHVtbkRhdGEobixlLmhlYWRlcnMsciwhMCksbz0iZmFsc2UiPT09dC5nZXREYXRhKHMsYSwic29ydGVyIil8fCJmYWxzZSI9PT10LmdldERhdGEocyxhLCJwYXJzZXIiKSx0LnNldENvbHVtblNvcnQoZSxzLG8pfSxzZXRDb2x1bW5Tb3J0OmZ1bmN0aW9uKGUsdCxyKXt2YXIgbz1lLnRhYmxlLmlkO3RbMF0uc29ydERpc2FibGVkPXIsdFtyPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oInNvcnRlci1mYWxzZSIpLmF0dHIoImFyaWEtZGlzYWJsZWQiLCIiK3IpLGUudGFiSW5kZXgmJihyP3QucmVtb3ZlQXR0cigidGFiaW5kZXgiKTp0LmF0dHIoInRhYmluZGV4IiwiMCIpKSxvJiYocj90LnJlbW92ZUF0dHIoImFyaWEtY29udHJvbHMiKTp0LmF0dHIoImFyaWEtY29udHJvbHMiLG8pKX0sdXBkYXRlSGVhZGVyU29ydENvdW50OmZ1bmN0aW9uKHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZyxwPW98fHIuc29ydExpc3QsdT1wLmxlbmd0aDtmb3Ioci5zb3J0TGlzdD1bXSxpPTA7aTx1O2krKylpZihjPXBbaV0sKHM9cGFyc2VJbnQoY1swXSwxMCkpPHIuY29sdW1ucyl7c3dpdGNoKHIuc29ydFZhcnNbc10ub3JkZXJ8fChnPXQuZ2V0T3JkZXIoci5zb3J0SW5pdGlhbE9yZGVyKT9yLnNvcnRSZXNldD9bMSwwLDJdOlsxLDBdOnIuc29ydFJlc2V0P1swLDEsMl06WzAsMV0sci5zb3J0VmFyc1tzXS5vcmRlcj1nLHIuc29ydFZhcnNbc10uY291bnQ9MCksZz1yLnNvcnRWYXJzW3NdLm9yZGVyLGE9KCIiK2NbMV0pLm1hdGNoKC9eKDF8ZHxzfG98bikvKSxhPWE/YVswXToiIil7Y2FzZSIxIjpjYXNlImQiOmE9MTticmVhaztjYXNlInMiOmE9bHx8MDticmVhaztjYXNlIm8iOmE9MD09PShkPWdbKGx8fDApJWcubGVuZ3RoXSk/MToxPT09ZD8wOjI7YnJlYWs7Y2FzZSJuIjphPWdbKytyLnNvcnRWYXJzW3NdLmNvdW50JWcubGVuZ3RoXTticmVhaztkZWZhdWx0OmE9MH1sPTA9PT1pP2E6bCxuPVtzLHBhcnNlSW50KGEsMTApfHwwXSxyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1uLGE9ZS5pbkFycmF5KG5bMV0sZyksci5zb3J0VmFyc1tzXS5jb3VudD1hPj0wP2E6blsxXSVnLmxlbmd0aH19LHVwZGF0ZUFsbDpmdW5jdGlvbihlLHIsbyl7dmFyIHM9ZS50YWJsZTtzLmlzVXBkYXRpbmc9ITAsdC5yZWZyZXNoV2lkZ2V0cyhzLCEwLCEwKSx0LmJ1aWxkSGVhZGVycyhlKSx0LmJpbmRFdmVudHMocyxlLiRoZWFkZXJzLCEwKSx0LmJpbmRNZXRob2RzKGUpLHQuY29tbW9uVXBkYXRlKGUscixvKX0sdXBkYXRlOmZ1bmN0aW9uKGUscixvKXtlLnRhYmxlLmlzVXBkYXRpbmc9ITAsdC51cGRhdGVIZWFkZXIoZSksdC5jb21tb25VcGRhdGUoZSxyLG8pfSx1cGRhdGVIZWFkZXJzOmZ1bmN0aW9uKGUscil7ZS50YWJsZS5pc1VwZGF0aW5nPSEwLHQuYnVpbGRIZWFkZXJzKGUpLHQuYmluZEV2ZW50cyhlLnRhYmxlLGUuJGhlYWRlcnMsITApLHQucmVzb3J0Q29tcGxldGUoZSxyKX0sdXBkYXRlQ2VsbDpmdW5jdGlvbihyLG8scyxhKXtpZihlKG8pLmNsb3Nlc3QoInRyIikuaGFzQ2xhc3Moci5jc3NDaGlsZFJvdykpY29uc29sZS53YXJuKCdUYWJsZXNvcnRlciBXYXJuaW5nISAidXBkYXRlQ2VsbCIgZm9yIGNoaWxkIHJvdyBjb250ZW50IGhhcyBiZWVuIGRpc2FibGVkLCB1c2UgInVwZGF0ZSIgaW5zdGVhZCcpO2Vsc2V7aWYodC5pc0VtcHR5T2JqZWN0KHIuY2FjaGUpKXJldHVybiB0LnVwZGF0ZUhlYWRlcihyKSx2b2lkIHQuY29tbW9uVXBkYXRlKHIscyxhKTtyLnRhYmxlLmlzVXBkYXRpbmc9ITAsci4kdGFibGUuZmluZChyLnNlbGVjdG9yUmVtb3ZlKS5yZW1vdmUoKTt2YXIgbixpLGwsZCxjLGcscD1yLiR0Ym9kaWVzLHU9ZShvKSxmPXAuaW5kZXgodC5nZXRDbG9zZXN0KHUsInRib2R5IikpLGg9ci5jYWNoZVtmXSxtPXQuZ2V0Q2xvc2VzdCh1LCJ0ciIpO2lmKG89dVswXSxwLmxlbmd0aCYmZj49MCl7aWYobD1wLmVxKGYpLmZpbmQoInRyIikubm90KCIuIityLmNzc0NoaWxkUm93KS5pbmRleChtKSxjPWgubm9ybWFsaXplZFtsXSwoZz1tWzBdLmNlbGxzLmxlbmd0aCkhPT1yLmNvbHVtbnMpZm9yKGQ9MCxuPSExLGk9MDtpPGc7aSsrKW58fG1bMF0uY2VsbHNbaV09PT1vP249ITA6ZCs9bVswXS5jZWxsc1tpXS5jb2xTcGFuO2Vsc2UgZD11LmluZGV4KCk7bj10LmdldEVsZW1lbnRUZXh0KHIsbyxkKSxjW3IuY29sdW1uc10ucmF3W2RdPW4sbj10LmdldFBhcnNlZFRleHQocixvLGQsbiksY1tkXT1uLCJudW1lcmljIj09PShyLnBhcnNlcnNbZF0udHlwZXx8IiIpLnRvTG93ZXJDYXNlKCkmJihoLmNvbE1heFtkXT1NYXRoLm1heChNYXRoLmFicyhuKXx8MCxoLmNvbE1heFtkXXx8MCkpLCExIT09KG49InVuZGVmaW5lZCIhPT1zP3M6ci5yZXNvcnQpP3QuY2hlY2tSZXNvcnQocixuLGEpOnQucmVzb3J0Q29tcGxldGUocixhKX1lbHNlIHQuZGVidWcociwiY29yZSIpJiZjb25zb2xlLmVycm9yKCJ1cGRhdGVDZWxsIGFib3J0ZWQsIHRib2R5IG1pc3Npbmcgb3Igbm90IHdpdGhpbiB0aGUgaW5kaWNhdGVkIHRhYmxlIiksci50YWJsZS5pc1VwZGF0aW5nPSExfX0sYWRkUm93czpmdW5jdGlvbihyLG8scyxhKXt2YXIgbixpLGwsZCxjLGcscCx1LGYsaCxtLGIseSx3PSJzdHJpbmciPT10eXBlb2YgbyYmMT09PXIuJHRib2RpZXMubGVuZ3RoJiYvPHRyLy50ZXN0KG98fCIiKSx4PXIudGFibGU7aWYodylvPWUobyksci4kdGJvZGllcy5hcHBlbmQobyk7ZWxzZSBpZighKG8mJm8gaW5zdGFuY2VvZiBlJiZ0LmdldENsb3Nlc3QobywidGFibGUiKVswXT09PXIudGFibGUpKXJldHVybiB0LmRlYnVnKHIsImNvcmUiKSYmY29uc29sZS5lcnJvcigiYWRkUm93cyBtZXRob2QgcmVxdWlyZXMgKDEpIGEgalF1ZXJ5IHNlbGVjdG9yIHJlZmVyZW5jZSB0byByb3dzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIHRhYmxlLCBvciAoMikgcm93IEhUTUwgc3RyaW5nIHRvIGJlIGFkZGVkIHRvIGEgdGFibGUgd2l0aCBvbmx5IG9uZSB0Ym9keSIpLCExO2lmKHguaXNVcGRhdGluZz0hMCx0LmlzRW1wdHlPYmplY3Qoci5jYWNoZSkpdC51cGRhdGVIZWFkZXIociksdC5jb21tb25VcGRhdGUocixzLGEpO2Vsc2V7Zm9yKGM9by5maWx0ZXIoInRyIikuYXR0cigicm9sZSIsInJvdyIpLmxlbmd0aCxsPXIuJHRib2RpZXMuaW5kZXgoby5wYXJlbnRzKCJ0Ym9keSIpLmZpbHRlcigiOmZpcnN0IikpLHIucGFyc2VycyYmci5wYXJzZXJzLmxlbmd0aHx8dC5zZXR1cFBhcnNlcnMociksZD0wO2Q8YztkKyspe2ZvcihmPTAscD1vW2RdLmNlbGxzLmxlbmd0aCx1PXIuY2FjaGVbbF0ubm9ybWFsaXplZC5sZW5ndGgsbT1bXSxoPXtjaGlsZDpbXSxyYXc6W10sJHJvdzpvLmVxKGQpLG9yZGVyOnV9LGc9MDtnPHA7ZysrKWI9b1tkXS5jZWxsc1tnXSxuPXQuZ2V0RWxlbWVudFRleHQocixiLGYpLGgucmF3W2ZdPW4saT10LmdldFBhcnNlZFRleHQocixiLGYsbiksbVtmXT1pLCJudW1lcmljIj09PShyLnBhcnNlcnNbZl0udHlwZXx8IiIpLnRvTG93ZXJDYXNlKCkmJihyLmNhY2hlW2xdLmNvbE1heFtmXT1NYXRoLm1heChNYXRoLmFicyhpKXx8MCxyLmNhY2hlW2xdLmNvbE1heFtmXXx8MCkpLCh5PWIuY29sU3Bhbi0xKT4wJiYoZis9eSksZisrO21bci5jb2x1bW5zXT1oLHIuY2FjaGVbbF0ubm9ybWFsaXplZFt1XT1tfXQuY2hlY2tSZXNvcnQocixzLGEpfX0sdXBkYXRlQ2FjaGU6ZnVuY3Rpb24oZSxyLG8pe2UucGFyc2VycyYmZS5wYXJzZXJzLmxlbmd0aHx8dC5zZXR1cFBhcnNlcnMoZSxvKSx0LmJ1aWxkQ2FjaGUoZSxyLG8pfSxhcHBlbmRDYWNoZTpmdW5jdGlvbihlLHIpe3ZhciBvLHMsYSxuLGksbCxkLGM9ZS50YWJsZSxnPWUuJHRib2RpZXMscD1bXSx1PWUuY2FjaGU7aWYodC5pc0VtcHR5T2JqZWN0KHUpKXJldHVybiBlLmFwcGVuZGVyP2UuYXBwZW5kZXIoYyxwKTpjLmlzVXBkYXRpbmc/ZS4kdGFibGUudHJpZ2dlckhhbmRsZXIoInVwZGF0ZUNvbXBsZXRlIixjKToiIjtmb3IodC5kZWJ1ZyhlLCJjb3JlIikmJihkPW5ldyBEYXRlKSxsPTA7bDxnLmxlbmd0aDtsKyspaWYoKGE9Zy5lcShsKSkubGVuZ3RoKXtmb3Iobj10LnByb2Nlc3NUYm9keShjLGEsITApLHM9KG89dVtsXS5ub3JtYWxpemVkKS5sZW5ndGgsaT0wO2k8cztpKyspcFtwLmxlbmd0aF09b1tpXVtlLmNvbHVtbnNdLiRyb3csZS5hcHBlbmRlciYmKCFlLnBhZ2VyfHxlLnBhZ2VyLnJlbW92ZVJvd3N8fGUucGFnZXIuYWpheCl8fG4uYXBwZW5kKG9baV1bZS5jb2x1bW5zXS4kcm93KTt0LnByb2Nlc3NUYm9keShjLG4sITEpfWUuYXBwZW5kZXImJmUuYXBwZW5kZXIoYyxwKSx0LmRlYnVnKGUsImNvcmUiKSYmY29uc29sZS5sb2coIlJlYnVpbHQgdGFibGUiK3QuYmVuY2htYXJrKGQpKSxyfHxlLmFwcGVuZGVyfHx0LmFwcGx5V2lkZ2V0KGMpLGMuaXNVcGRhdGluZyYmZS4kdGFibGUudHJpZ2dlckhhbmRsZXIoInVwZGF0ZUNvbXBsZXRlIixjKX0sY29tbW9uVXBkYXRlOmZ1bmN0aW9uKGUscixvKXtlLiR0YWJsZS5maW5kKGUuc2VsZWN0b3JSZW1vdmUpLnJlbW92ZSgpLHQuc2V0dXBQYXJzZXJzKGUpLHQuYnVpbGRDYWNoZShlKSx0LmNoZWNrUmVzb3J0KGUscixvKX0saW5pdFNvcnQ6ZnVuY3Rpb24ocixvLHMpe2lmKHIudGFibGUuaXNVcGRhdGluZylyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe3QuaW5pdFNvcnQocixvLHMpfSw1MCk7dmFyIGEsbixpLGwsZCxjLGcscD0hc1tyLnNvcnRNdWx0aVNvcnRLZXldLHU9ci50YWJsZSxmPXIuJGhlYWRlcnMubGVuZ3RoLGg9dC5nZXRDbG9zZXN0KGUobyksInRoLCB0ZCIpLG09cGFyc2VJbnQoaC5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxiPXIuc29ydFZhcnNbbV0ub3JkZXI7aWYoaD1oWzBdLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0U3RhcnQiLHUpLGM9KHIuc29ydFZhcnNbbV0uY291bnQrMSklYi5sZW5ndGgsci5zb3J0VmFyc1ttXS5jb3VudD1zW3Iuc29ydFJlc2V0S2V5XT8yOmMsci5zb3J0UmVzdGFydClmb3IoaT0wO2k8ZjtpKyspZz1yLiRoZWFkZXJzLmVxKGkpLG0hPT0oYz1wYXJzZUludChnLmF0dHIoImRhdGEtY29sdW1uIiksMTApKSYmKHB8fGcuaGFzQ2xhc3ModC5jc3Muc29ydE5vbmUpKSYmKHIuc29ydFZhcnNbY10uY291bnQ9LTEpO2lmKHApe2lmKHIuc29ydExpc3Q9W10sci5sYXN0LnNvcnRMaXN0PVtdLG51bGwhPT1yLnNvcnRGb3JjZSlmb3IoYT1yLnNvcnRGb3JjZSxuPTA7bjxhLmxlbmd0aDtuKyspYVtuXVswXSE9PW0mJihyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1hW25dKTtpZigobD1iW3Iuc29ydFZhcnNbbV0uY291bnRdKTwyJiYoci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20sbF0saC5jb2xTcGFuPjEpKWZvcihuPTE7bjxoLmNvbFNwYW47bisrKXIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVttK24sbF0sci5zb3J0VmFyc1ttK25dLmNvdW50PWUuaW5BcnJheShsLGIpfWVsc2UgaWYoci5zb3J0TGlzdD1lLmV4dGVuZChbXSxyLmxhc3Quc29ydExpc3QpLHQuaXNWYWx1ZUluQXJyYXkobSxyLnNvcnRMaXN0KT49MClmb3Iobj0wO248ci5zb3J0TGlzdC5sZW5ndGg7bisrKShjPXIuc29ydExpc3Rbbl0pWzBdPT09bSYmKGNbMV09YltyLnNvcnRWYXJzW21dLmNvdW50XSwyPT09Y1sxXSYmKHIuc29ydExpc3Quc3BsaWNlKG4sMSksci5zb3J0VmFyc1ttXS5jb3VudD0tMSkpO2Vsc2UgaWYoKGw9YltyLnNvcnRWYXJzW21dLmNvdW50XSk8MiYmKHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVttLGxdLGguY29sU3Bhbj4xKSlmb3Iobj0xO248aC5jb2xTcGFuO24rKylyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1bbStuLGxdLHIuc29ydFZhcnNbbStuXS5jb3VudD1lLmluQXJyYXkobCxiKTtpZihyLmxhc3Quc29ydExpc3Q9ZS5leHRlbmQoW10sci5zb3J0TGlzdCksci5zb3J0TGlzdC5sZW5ndGgmJnIuc29ydEFwcGVuZCYmKGE9ZS5pc0FycmF5KHIuc29ydEFwcGVuZCk/ci5zb3J0QXBwZW5kOnIuc29ydEFwcGVuZFtyLnNvcnRMaXN0WzBdWzBdXSwhdC5pc0VtcHR5T2JqZWN0KGEpKSlmb3Iobj0wO248YS5sZW5ndGg7bisrKWlmKGFbbl1bMF0hPT1tJiZ0LmlzVmFsdWVJbkFycmF5KGFbbl1bMF0sci5zb3J0TGlzdCk8MCl7aWYobD1hW25dWzFdLGQ9KCIiK2wpLm1hdGNoKC9eKGF8ZHxzfG98bikvKSlzd2l0Y2goYz1yLnNvcnRMaXN0WzBdWzFdLGRbMF0pe2Nhc2UiZCI6bD0xO2JyZWFrO2Nhc2UicyI6bD1jO2JyZWFrO2Nhc2UibyI6bD0wPT09Yz8xOjA7YnJlYWs7Y2FzZSJuIjpsPShjKzEpJWIubGVuZ3RoO2JyZWFrO2RlZmF1bHQ6bD0wfXIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVthW25dWzBdLGxdfXIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVnaW4iLHUpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnNldEhlYWRlcnNDc3MociksdC5tdWx0aXNvcnQociksdC5hcHBlbmRDYWNoZShyKSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEJlZm9yZUVuZCIsdSksci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRFbmQiLHUpfSwxKX0sbXVsdGlzb3J0OmZ1bmN0aW9uKGUpe3ZhciByLG8scyxhLG49ZS50YWJsZSxpPVtdLGw9MCxkPWUudGV4dFNvcnRlcnx8IiIsYz1lLnNvcnRMaXN0LGc9Yy5sZW5ndGgscD1lLiR0Ym9kaWVzLmxlbmd0aDtpZighZS5zZXJ2ZXJTaWRlU29ydGluZyYmIXQuaXNFbXB0eU9iamVjdChlLmNhY2hlKSl7aWYodC5kZWJ1ZyhlLCJjb3JlIikmJihvPW5ldyBEYXRlKSwib2JqZWN0Ij09dHlwZW9mIGQpZm9yKHM9ZS5jb2x1bW5zO3MtLTspImZ1bmN0aW9uIj09dHlwZW9mKGE9dC5nZXRDb2x1bW5EYXRhKG4sZCxzKSkmJihpW3NdPWEpO2ZvcihyPTA7cjxwO3IrKylzPWUuY2FjaGVbcl0uY29sTWF4LGUuY2FjaGVbcl0ubm9ybWFsaXplZC5zb3J0KGZ1bmN0aW9uKHIsbyl7dmFyIGEscCx1LGYsaCxtLGI7Zm9yKGE9MDthPGc7YSsrKXtpZih1PWNbYV1bMF0sZj1jW2FdWzFdLGw9MD09PWYsZS5zb3J0U3RhYmxlJiZyW3VdPT09b1t1XSYmMT09PWcpcmV0dXJuIHJbZS5jb2x1bW5zXS5vcmRlci1vW2UuY29sdW1uc10ub3JkZXI7aWYocD0vbi9pLnRlc3QodC5nZXRTb3J0VHlwZShlLnBhcnNlcnMsdSkpLHAmJmUuc3RyaW5nc1t1XT8ocD0iYm9vbGVhbiI9PXR5cGVvZiB0LnN0cmluZ1tlLnN0cmluZ3NbdV1dPyhsPzE6LTEpKih0LnN0cmluZ1tlLnN0cmluZ3NbdV1dPy0xOjEpOmUuc3RyaW5nc1t1XT90LnN0cmluZ1tlLnN0cmluZ3NbdV1dfHwwOjAsaD1lLm51bWJlclNvcnRlcj9lLm51bWJlclNvcnRlcihyW3VdLG9bdV0sbCxzW3VdLG4pOnRbInNvcnROdW1lcmljIisobD8iQXNjIjoiRGVzYyIpXShyW3VdLG9bdV0scCxzW3VdLHUsZSkpOihtPWw/cjpvLGI9bD9vOnIsaD0iZnVuY3Rpb24iPT10eXBlb2YgZD9kKG1bdV0sYlt1XSxsLHUsbik6ImZ1bmN0aW9uIj09dHlwZW9mIGlbdV0/aVt1XShtW3VdLGJbdV0sbCx1LG4pOnRbInNvcnROYXR1cmFsIisobD8iQXNjIjoiRGVzYyIpXShyW3VdLG9bdV0sdSxlKSksaClyZXR1cm4gaH1yZXR1cm4gcltlLmNvbHVtbnNdLm9yZGVyLW9bZS5jb2x1bW5zXS5vcmRlcn0pO3QuZGVidWcoZSwiY29yZSIpJiZjb25zb2xlLmxvZygiQXBwbHlpbmcgc29ydCAiK2MudG9TdHJpbmcoKSt0LmJlbmNobWFyayhvKSl9fSxyZXNvcnRDb21wbGV0ZTpmdW5jdGlvbih0LHIpe3QudGFibGUuaXNVcGRhdGluZyYmdC4kdGFibGUudHJpZ2dlckhhbmRsZXIoInVwZGF0ZUNvbXBsZXRlIix0LnRhYmxlKSxlLmlzRnVuY3Rpb24ocikmJnIodC50YWJsZSl9LGNoZWNrUmVzb3J0OmZ1bmN0aW9uKHIsbyxzKXt2YXIgYT1lLmlzQXJyYXkobyk/bzpyLnNvcnRMaXN0OyExPT09KHZvaWQgMD09PW8/ci5yZXNvcnQ6byl8fHIuc2VydmVyU2lkZVNvcnRpbmd8fHIudGFibGUuaXNQcm9jZXNzaW5nPyh0LnJlc29ydENvbXBsZXRlKHIscyksdC5hcHBseVdpZGdldChyLnRhYmxlLCExKSk6YS5sZW5ndGg/dC5zb3J0T24ocixhLGZ1bmN0aW9uKCl7dC5yZXNvcnRDb21wbGV0ZShyLHMpfSwhMCk6dC5zb3J0UmVzZXQocixmdW5jdGlvbigpe3QucmVzb3J0Q29tcGxldGUocixzKSx0LmFwcGx5V2lkZ2V0KHIudGFibGUsITEpfSl9LHNvcnRPbjpmdW5jdGlvbihyLG8scyxhKXt2YXIgbj1yLnRhYmxlO3IuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0U3RhcnQiLG4pLHQudXBkYXRlSGVhZGVyU29ydENvdW50KHIsbyksdC5zZXRIZWFkZXJzQ3NzKHIpLHIuZGVsYXlJbml0JiZ0LmlzRW1wdHlPYmplY3Qoci5jYWNoZSkmJnQuYnVpbGRDYWNoZShyKSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEJlZ2luIixuKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIsYSksci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRCZWZvcmVFbmQiLG4pLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0RW5kIixuKSx0LmFwcGx5V2lkZ2V0KG4pLGUuaXNGdW5jdGlvbihzKSYmcyhuKX0sc29ydFJlc2V0OmZ1bmN0aW9uKHIsbyl7ci5zb3J0TGlzdD1bXSx0LnNldEhlYWRlcnNDc3MociksdC5tdWx0aXNvcnQociksdC5hcHBlbmRDYWNoZShyKTt2YXIgcztmb3Iocz0wO3M8ci5jb2x1bW5zO3MrKylyLnNvcnRWYXJzW3NdLmNvdW50PS0xO2UuaXNGdW5jdGlvbihvKSYmbyhyLnRhYmxlKX0sZ2V0U29ydFR5cGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmZVt0XT9lW3RdLnR5cGV8fCIiOiIifSxnZXRPcmRlcjpmdW5jdGlvbihlKXtyZXR1cm4vXmQvaS50ZXN0KGUpfHwxPT09ZX0sc29ydE5hdHVyYWw6ZnVuY3Rpb24oZSxyKXtpZihlPT09cilyZXR1cm4gMDtlPWUudG9TdHJpbmcoKSxyPXIudG9TdHJpbmcoKTt2YXIgbyxzLGEsbixpLGwsZD10LnJlZ2V4O2lmKGQuaGV4LnRlc3Qocikpe2lmKG89cGFyc2VJbnQoKGV8fCIiKS5tYXRjaChkLmhleCksMTYpLHM9cGFyc2VJbnQoKHJ8fCIiKS5tYXRjaChkLmhleCksMTYpLG88cylyZXR1cm4tMTtpZihvPnMpcmV0dXJuIDF9Zm9yKG89KGV8fCIiKS5yZXBsYWNlKGQuY2h1bmssIlxcMCQxXFwwIikucmVwbGFjZShkLmNodW5rcywiIikuc3BsaXQoIlxcMCIpLHM9KHJ8fCIiKS5yZXBsYWNlKGQuY2h1bmssIlxcMCQxXFwwIikucmVwbGFjZShkLmNodW5rcywiIikuc3BsaXQoIlxcMCIpLGw9TWF0aC5tYXgoby5sZW5ndGgscy5sZW5ndGgpLGk9MDtpPGw7aSsrKXtpZihhPWlzTmFOKG9baV0pP29baV18fDA6cGFyc2VGbG9hdChvW2ldKXx8MCxuPWlzTmFOKHNbaV0pP3NbaV18fDA6cGFyc2VGbG9hdChzW2ldKXx8MCxpc05hTihhKSE9PWlzTmFOKG4pKXJldHVybiBpc05hTihhKT8xOi0xO2lmKHR5cGVvZiBhIT10eXBlb2YgbiYmKGErPSIiLG4rPSIiKSxhPG4pcmV0dXJuLTE7aWYoYT5uKXJldHVybiAxfXJldHVybiAwfSxzb3J0TmF0dXJhbEFzYzpmdW5jdGlvbihlLHIsbyxzKXtpZihlPT09cilyZXR1cm4gMDt2YXIgYT10LnN0cmluZ1tzLmVtcHRpZXNbb118fHMuZW1wdHlUb107cmV0dXJuIiI9PT1lJiYwIT09YT8iYm9vbGVhbiI9PXR5cGVvZiBhP2E/LTE6MTotYXx8LTE6IiI9PT1yJiYwIT09YT8iYm9vbGVhbiI9PXR5cGVvZiBhP2E/MTotMTphfHwxOnQuc29ydE5hdHVyYWwoZSxyKX0sc29ydE5hdHVyYWxEZXNjOmZ1bmN0aW9uKGUscixvLHMpe2lmKGU9PT1yKXJldHVybiAwO3ZhciBhPXQuc3RyaW5nW3MuZW1wdGllc1tvXXx8cy5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8tMToxOmF8fDE6IiI9PT1yJiYwIT09YT8iYm9vbGVhbiI9PXR5cGVvZiBhP2E/MTotMTotYXx8LTE6dC5zb3J0TmF0dXJhbChyLGUpfSxzb3J0VGV4dDpmdW5jdGlvbihlLHQpe3JldHVybiBlPnQ/MTplPHQ/LTE6MH0sZ2V0VGV4dFZhbHVlOmZ1bmN0aW9uKGUsdCxyKXtpZihyKXt2YXIgbyxzPWU/ZS5sZW5ndGg6MCxhPXIrdDtmb3Iobz0wO288cztvKyspYSs9ZS5jaGFyQ29kZUF0KG8pO3JldHVybiB0KmF9cmV0dXJuIDB9LHNvcnROdW1lcmljQXNjOmZ1bmN0aW9uKGUscixvLHMsYSxuKXtpZihlPT09cilyZXR1cm4gMDt2YXIgaT10LnN0cmluZ1tuLmVtcHRpZXNbYV18fG4uZW1wdHlUb107cmV0dXJuIiI9PT1lJiYwIT09aT8iYm9vbGVhbiI9PXR5cGVvZiBpP2k/LTE6MTotaXx8LTE6IiI9PT1yJiYwIT09aT8iYm9vbGVhbiI9PXR5cGVvZiBpP2k/MTotMTppfHwxOihpc05hTihlKSYmKGU9dC5nZXRUZXh0VmFsdWUoZSxvLHMpKSxpc05hTihyKSYmKHI9dC5nZXRUZXh0VmFsdWUocixvLHMpKSxlLXIpfSxzb3J0TnVtZXJpY0Rlc2M6ZnVuY3Rpb24oZSxyLG8scyxhLG4pe2lmKGU9PT1yKXJldHVybiAwO3ZhciBpPXQuc3RyaW5nW24uZW1wdGllc1thXXx8bi5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8tMToxOml8fDE6IiI9PT1yJiYwIT09aT8iYm9vbGVhbiI9PXR5cGVvZiBpP2k/MTotMTotaXx8LTE6KGlzTmFOKGUpJiYoZT10LmdldFRleHRWYWx1ZShlLG8scykpLGlzTmFOKHIpJiYocj10LmdldFRleHRWYWx1ZShyLG8scykpLHItZSl9LHNvcnROdW1lcmljOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUtdH0sYWRkV2lkZ2V0OmZ1bmN0aW9uKGUpe2UuaWQmJiF0LmlzRW1wdHlPYmplY3QodC5nZXRXaWRnZXRCeUlkKGUuaWQpKSYmY29uc29sZS53YXJuKCciJytlLmlkKyciIHdpZGdldCB3YXMgbG9hZGVkIG1vcmUgdGhhbiBvbmNlIScpLHQud2lkZ2V0c1t0LndpZGdldHMubGVuZ3RoXT1lfSxoYXNXaWRnZXQ6ZnVuY3Rpb24odCxyKXtyZXR1cm4odD1lKHQpKS5sZW5ndGgmJnRbMF0uY29uZmlnJiZ0WzBdLmNvbmZpZy53aWRnZXRJbml0W3JdfHwhMX0sZ2V0V2lkZ2V0QnlJZDpmdW5jdGlvbihlKXt2YXIgcixvLHM9dC53aWRnZXRzLmxlbmd0aDtmb3Iocj0wO3I8cztyKyspaWYoKG89dC53aWRnZXRzW3JdKSYmby5pZCYmby5pZC50b0xvd2VyQ2FzZSgpPT09ZS50b0xvd2VyQ2FzZSgpKXJldHVybiBvfSxhcHBseVdpZGdldE9wdGlvbnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG49ci5jb25maWcsaT1uLndpZGdldHMubGVuZ3RoO2lmKGkpZm9yKG89MDtvPGk7bysrKShzPXQuZ2V0V2lkZ2V0QnlJZChuLndpZGdldHNbb10pKSYmcy5vcHRpb25zJiYoYT1lLmV4dGVuZCghMCx7fSxzLm9wdGlvbnMpLG4ud2lkZ2V0T3B0aW9ucz1lLmV4dGVuZCghMCxhLG4ud2lkZ2V0T3B0aW9ucyksZS5leHRlbmQoITAsdC5kZWZhdWx0cy53aWRnZXRPcHRpb25zLHMub3B0aW9ucykpfSxhZGRXaWRnZXRGcm9tQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzPWUuY29uZmlnLGE9Il4iK3Mud2lkZ2V0Q2xhc3MucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlTmFtZSwiKFxcUyspKyIpKyIkIixuPW5ldyBSZWdFeHAoYSwiZyIpLGk9KGUuY2xhc3NOYW1lfHwiIikuc3BsaXQodC5yZWdleC5zcGFjZXMpO2lmKGkubGVuZ3RoKWZvcihyPWkubGVuZ3RoLG89MDtvPHI7bysrKWlbb10ubWF0Y2gobikmJihzLndpZGdldHNbcy53aWRnZXRzLmxlbmd0aF09aVtvXS5yZXBsYWNlKG4sIiQxIikpfSxhcHBseVdpZGdldElkOmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbD0ocj1lKHIpWzBdKS5jb25maWcsZD1sLndpZGdldE9wdGlvbnMsYz10LmRlYnVnKGwsImNvcmUiKSxnPXQuZ2V0V2lkZ2V0QnlJZChvKTtnJiYoaT1nLmlkLGE9ITEsZS5pbkFycmF5KGksbC53aWRnZXRzKTwwJiYobC53aWRnZXRzW2wud2lkZ2V0cy5sZW5ndGhdPWkpLGMmJihuPW5ldyBEYXRlKSwhcyYmbC53aWRnZXRJbml0W2ldfHwobC53aWRnZXRJbml0W2ldPSEwLHIuaGFzSW5pdGlhbGl6ZWQmJnQuYXBwbHlXaWRnZXRPcHRpb25zKHIpLCJmdW5jdGlvbiI9PXR5cGVvZiBnLmluaXQmJihhPSEwLGMmJmNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiSW5pdGlhbGl6aW5nICIraSsiIHdpZGdldCIpLGcuaW5pdChyLGcsbCxkKSkpLHN8fCJmdW5jdGlvbiIhPXR5cGVvZiBnLmZvcm1hdHx8KGE9ITAsYyYmY29uc29sZVtjb25zb2xlLmdyb3VwPyJncm91cCI6ImxvZyJdKCJVcGRhdGluZyAiK2krIiB3aWRnZXQiKSxnLmZvcm1hdChyLGwsZCwhMSkpLGMmJmEmJihjb25zb2xlLmxvZygiQ29tcGxldGVkICIrKHM/ImluaXRpYWxpemluZyAiOiJhcHBseWluZyAiKStpKyIgd2lkZ2V0Iit0LmJlbmNobWFyayhuKSksY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpKSl9LGFwcGx5V2lkZ2V0OmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbCxkLGM9KHI9ZShyKVswXSkuY29uZmlnLGc9dC5kZWJ1ZyhjLCJjb3JlIikscD1bXTtpZighMT09PW98fCFyLmhhc0luaXRpYWxpemVkfHwhci5pc0FwcGx5aW5nV2lkZ2V0cyYmIXIuaXNVcGRhdGluZyl7aWYoZyYmKGQ9bmV3IERhdGUpLHQuYWRkV2lkZ2V0RnJvbUNsYXNzKHIpLGNsZWFyVGltZW91dChjLnRpbWVyUmVhZHkpLGMud2lkZ2V0cy5sZW5ndGgpe2ZvcihyLmlzQXBwbHlpbmdXaWRnZXRzPSEwLGMud2lkZ2V0cz1lLmdyZXAoYy53aWRnZXRzLGZ1bmN0aW9uKHQscil7cmV0dXJuIGUuaW5BcnJheSh0LGMud2lkZ2V0cyk9PT1yfSksbj0oaT1jLndpZGdldHN8fFtdKS5sZW5ndGgsYT0wO2E8bjthKyspKGw9dC5nZXRXaWRnZXRCeUlkKGlbYV0pKSYmbC5pZD8obC5wcmlvcml0eXx8KGwucHJpb3JpdHk9MTApLHBbYV09bCk6ZyYmY29uc29sZS53YXJuKCciJytpW2FdKyciIHdhcyBlbmFibGVkLCBidXQgdGhlIHdpZGdldCBjb2RlIGhhcyBub3QgYmVlbiBsb2FkZWQhJyk7Zm9yKHAuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLnByaW9yaXR5PHQucHJpb3JpdHk/LTE6ZS5wcmlvcml0eT09PXQucHJpb3JpdHk/MDoxfSksbj1wLmxlbmd0aCxnJiZjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIlN0YXJ0ICIrKG8/ImluaXRpYWxpemluZyI6ImFwcGx5aW5nIikrIiB3aWRnZXRzIiksYT0wO2E8bjthKyspKGw9cFthXSkmJmwuaWQmJnQuYXBwbHlXaWRnZXRJZChyLGwuaWQsbyk7ZyYmY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpfWMudGltZXJSZWFkeT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5pc0FwcGx5aW5nV2lkZ2V0cz0hMSxlLmRhdGEociwibGFzdFdpZGdldEFwcGxpY2F0aW9uIixuZXcgRGF0ZSksYy4kdGFibGUudHJpZ2dlckhhbmRsZXIoInRhYmxlc29ydGVyLXJlYWR5Iiksb3x8ImZ1bmN0aW9uIiE9dHlwZW9mIHN8fHMociksZyYmKGw9Yy53aWRnZXRzLmxlbmd0aCxjb25zb2xlLmxvZygiQ29tcGxldGVkICIrKCEwPT09bz8iaW5pdGlhbGl6aW5nICI6ImFwcGx5aW5nICIpK2wrIiB3aWRnZXQiKygxIT09bD8icyI6IiIpK3QuYmVuY2htYXJrKGQpKSl9LDEwKX19LHJlbW92ZVdpZGdldDpmdW5jdGlvbihyLG8scyl7dmFyIGEsbixpLGwsZD0ocj1lKHIpWzBdKS5jb25maWc7aWYoITA9PT1vKWZvcihvPVtdLGw9dC53aWRnZXRzLmxlbmd0aCxpPTA7aTxsO2krKykobj10LndpZGdldHNbaV0pJiZuLmlkJiYob1tvLmxlbmd0aF09bi5pZCk7ZWxzZSBvPShlLmlzQXJyYXkobyk/by5qb2luKCIsIik6b3x8IiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1tccyxdKy8pO2ZvcihsPW8ubGVuZ3RoLGE9MDthPGw7YSsrKW49dC5nZXRXaWRnZXRCeUlkKG9bYV0pLChpPWUuaW5BcnJheShvW2FdLGQud2lkZ2V0cykpPj0wJiYhMCE9PXMmJmQud2lkZ2V0cy5zcGxpY2UoaSwxKSxuJiZuLnJlbW92ZSYmKHQuZGVidWcoZCwiY29yZSIpJiZjb25zb2xlLmxvZygocz8iUmVmcmVzaGluZyI6IlJlbW92aW5nIikrJyAiJytvW2FdKyciIHdpZGdldCcpLG4ucmVtb3ZlKHIsZCxkLndpZGdldE9wdGlvbnMscyksZC53aWRnZXRJbml0W29bYV1dPSExKTtkLiR0YWJsZS50cmlnZ2VySGFuZGxlcigid2lkZ2V0UmVtb3ZlRW5kIixyKX0scmVmcmVzaFdpZGdldHM6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saT0ocj1lKHIpWzBdKS5jb25maWcud2lkZ2V0cyxsPXQud2lkZ2V0cyxkPWwubGVuZ3RoLGM9W10sZz1mdW5jdGlvbih0KXtlKHQpLnRyaWdnZXJIYW5kbGVyKCJyZWZyZXNoQ29tcGxldGUiKX07Zm9yKGE9MDthPGQ7YSsrKShuPWxbYV0pJiZuLmlkJiYob3x8ZS5pbkFycmF5KG4uaWQsaSk8MCkmJihjW2MubGVuZ3RoXT1uLmlkKTt0LnJlbW92ZVdpZGdldChyLGMuam9pbigiLCIpLCEwKSwhMCE9PXM/KHQuYXBwbHlXaWRnZXQocixvfHwhMSxnKSxvJiZ0LmFwcGx5V2lkZ2V0KHIsITEsZykpOmcocil9LGJlbmNobWFyazpmdW5jdGlvbihlKXtyZXR1cm4iICgiKygobmV3IERhdGUpLmdldFRpbWUoKS1lLmdldFRpbWUoKSkrIiBtcykifSxsb2c6ZnVuY3Rpb24oKXtjb25zb2xlLmxvZyhhcmd1bWVudHMpfSxkZWJ1ZzpmdW5jdGlvbihlLHQpe3JldHVybiBlJiYoITA9PT1lLmRlYnVnfHwic3RyaW5nIj09dHlwZW9mIGUuZGVidWcmJmUuZGVidWcuaW5kZXhPZih0KT4tMSl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGlzVmFsdWVJbkFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIHIsbz10JiZ0Lmxlbmd0aHx8MDtmb3Iocj0wO3I8bztyKyspaWYodFtyXVswXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9LGZvcm1hdEZsb2F0OmZ1bmN0aW9uKHIsbyl7aWYoInN0cmluZyIhPXR5cGVvZiByfHwiIj09PXIpcmV0dXJuIHI7dmFyIHM7cmV0dXJuIHI9KG8mJm8uY29uZmlnPyExIT09by5jb25maWcudXNOdW1iZXJGb3JtYXQ6dm9pZCAwPT09b3x8byk/ci5yZXBsYWNlKHQucmVnZXguY29tbWEsIiIpOnIucmVwbGFjZSh0LnJlZ2V4LmRpZ2l0Tm9uVVMsIiIpLnJlcGxhY2UodC5yZWdleC5jb21tYSwiLiIpLHQucmVnZXguZGlnaXROZWdhdGl2ZVRlc3QudGVzdChyKSYmKHI9ci5yZXBsYWNlKHQucmVnZXguZGlnaXROZWdhdGl2ZVJlcGxhY2UsIi0kMSIpKSxzPXBhcnNlRmxvYXQociksaXNOYU4ocyk/ZS50cmltKHIpOnN9LGlzRGlnaXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGlzTmFOKGUpP3QucmVnZXguZGlnaXRUZXN0LnRlc3QoZS50b1N0cmluZygpLnJlcGxhY2UodC5yZWdleC5kaWdpdFJlcGxhY2UsIiIpKToiIiE9PWV9LGNvbXB1dGVDb2x1bW5JbmRleDpmdW5jdGlvbihyLG8pe3ZhciBzLGEsbixpLGwsZCxjLGcscCx1LGY9byYmby5jb2x1bW5zfHwwLGg9W10sbT1uZXcgQXJyYXkoZik7Zm9yKHM9MDtzPHIubGVuZ3RoO3MrKylmb3IoZD1yW3NdLmNlbGxzLGE9MDthPGQubGVuZ3RoO2ErKyl7Zm9yKGM9cyxnPShsPWRbYV0pLnJvd1NwYW58fDEscD1sLmNvbFNwYW58fDEsdm9pZCAwPT09aFtjXSYmKGhbY109W10pLG49MDtuPGhbY10ubGVuZ3RoKzE7bisrKWlmKHZvaWQgMD09PWhbY11bbl0pe3U9bjticmVha31mb3IoZiYmbC5jZWxsSW5kZXg9PT11fHwobC5zZXRBdHRyaWJ1dGU/bC5zZXRBdHRyaWJ1dGUoImRhdGEtY29sdW1uIix1KTplKGwpLmF0dHIoImRhdGEtY29sdW1uIix1KSksbj1jO248YytnO24rKylmb3Iodm9pZCAwPT09aFtuXSYmKGhbbl09W10pLG09aFtuXSxpPXU7aTx1K3A7aSsrKW1baV09IngifXJldHVybiB0LmNoZWNrQ29sdW1uQ291bnQocixoLG0ubGVuZ3RoKSxtLmxlbmd0aH0sY2hlY2tDb2x1bW5Db3VudDpmdW5jdGlvbihlLHQscil7dmFyIG8scyxhPSEwLG49W107Zm9yKG89MDtvPHQubGVuZ3RoO28rKylpZih0W29dJiYocz10W29dLmxlbmd0aCx0W29dLmxlbmd0aCE9PXIpKXthPSExO2JyZWFrfWF8fChlLmVhY2goZnVuY3Rpb24oZSx0KXt2YXIgcj10LnBhcmVudEVsZW1lbnQubm9kZU5hbWU7bi5pbmRleE9mKHIpPDAmJm4ucHVzaChyKX0pLGNvbnNvbGUuZXJyb3IoIkludmFsaWQgb3IgaW5jb3JyZWN0IG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSAiK24uam9pbigiIG9yICIpKyI7IGV4cGVjdGVkICIrcisiLCBidXQgZm91bmQgIitzKyIgY29sdW1ucyIpKX0sZml4Q29sdW1uV2lkdGg6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG4saSxsPShyPWUocilbMF0pLmNvbmZpZyxkPWwuJHRhYmxlLmNoaWxkcmVuKCJjb2xncm91cCIpO2lmKGQubGVuZ3RoJiZkLmhhc0NsYXNzKHQuY3NzLmNvbGdyb3VwKSYmZC5yZW1vdmUoKSxsLndpZHRoRml4ZWQmJjA9PT1sLiR0YWJsZS5jaGlsZHJlbigiY29sZ3JvdXAiKS5sZW5ndGgpe2ZvcihkPWUoJzxjb2xncm91cCBjbGFzcz0iJyt0LmNzcy5jb2xncm91cCsnIj4nKSxvPWwuJHRhYmxlLndpZHRoKCksbj0oYT1sLiR0Ym9kaWVzLmZpbmQoInRyOmZpcnN0IikuY2hpbGRyZW4oIjp2aXNpYmxlIikpLmxlbmd0aCxpPTA7aTxuO2krKylzPXBhcnNlSW50KGEuZXEoaSkud2lkdGgoKS9vKjFlMywxMCkvMTArIiUiLGQuYXBwZW5kKGUoIjxjb2w+IikuY3NzKCJ3aWR0aCIscykpO2wuJHRhYmxlLnByZXBlbmQoZCl9fSxnZXREYXRhOmZ1bmN0aW9uKHQscixvKXt2YXIgcyxhLG49IiIsaT1lKHQpO3JldHVybiBpLmxlbmd0aD8ocz0hIWUubWV0YWRhdGEmJmkubWV0YWRhdGEoKSxhPSIgIisoaS5hdHRyKCJjbGFzcyIpfHwiIiksdm9pZCAwIT09aS5kYXRhKG8pfHx2b2lkIDAhPT1pLmRhdGEoby50b0xvd2VyQ2FzZSgpKT9uKz1pLmRhdGEobyl8fGkuZGF0YShvLnRvTG93ZXJDYXNlKCkpOnMmJnZvaWQgMCE9PXNbb10/bis9c1tvXTpyJiZ2b2lkIDAhPT1yW29dP24rPXJbb106IiAiIT09YSYmYS5tYXRjaCgiICIrbysiLSIpJiYobj1hLm1hdGNoKG5ldyBSZWdFeHAoIlxccyIrbysiLShbXFx3LV0rKSIpKVsxXXx8IiIpLGUudHJpbShuKSk6IiJ9LGdldENvbHVtbkRhdGE6ZnVuY3Rpb24odCxyLG8scyxhKXtpZigib2JqZWN0IiE9dHlwZW9mIHJ8fG51bGw9PT1yKXJldHVybiByO3ZhciBuLGk9KHQ9ZSh0KVswXSkuY29uZmlnLGw9YXx8aS4kaGVhZGVycyxkPWkuJGhlYWRlckluZGV4ZWQmJmkuJGhlYWRlckluZGV4ZWRbb118fGwuZmluZCgnW2RhdGEtY29sdW1uPSInK28rJyJdOmxhc3QnKTtpZih2b2lkIDAhPT1yW29dKXJldHVybiBzP3Jbb106cltsLmluZGV4KGQpXTtmb3IobiBpbiByKWlmKCJzdHJpbmciPT10eXBlb2YgbiYmZC5maWx0ZXIobikuYWRkKGQuZmluZChuKSkubGVuZ3RoKXJldHVybiByW25dfSxpc1Byb2Nlc3Npbmc6ZnVuY3Rpb24ocixvLHMpe3ZhciBhPShyPWUocikpWzBdLmNvbmZpZyxuPXN8fHIuZmluZCgiLiIrdC5jc3MuaGVhZGVyKTtvPyh2b2lkIDAhPT1zJiZhLnNvcnRMaXN0Lmxlbmd0aD4wJiYobj1uLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiF0aGlzLnNvcnREaXNhYmxlZCYmdC5pc1ZhbHVlSW5BcnJheShwYXJzZUZsb2F0KGUodGhpcykuYXR0cigiZGF0YS1jb2x1bW4iKSksYS5zb3J0TGlzdCk+PTB9KSksci5hZGQobikuYWRkQ2xhc3ModC5jc3MucHJvY2Vzc2luZysiICIrYS5jc3NQcm9jZXNzaW5nKSk6ci5hZGQobikucmVtb3ZlQ2xhc3ModC5jc3MucHJvY2Vzc2luZysiICIrYS5jc3NQcm9jZXNzaW5nKX0scHJvY2Vzc1Rib2R5OmZ1bmN0aW9uKHQscixvKXtpZih0PWUodClbMF0sbylyZXR1cm4gdC5pc1Byb2Nlc3Npbmc9ITAsci5iZWZvcmUoJzxjb2xncm91cCBjbGFzcz0idGFibGVzb3J0ZXItc2F2ZW15cGxhY2UiLz4nKSxlLmZuLmRldGFjaD9yLmRldGFjaCgpOnIucmVtb3ZlKCk7dmFyIHM9ZSh0KS5maW5kKCJjb2xncm91cC50YWJsZXNvcnRlci1zYXZlbXlwbGFjZSIpO3IuaW5zZXJ0QWZ0ZXIocykscy5yZW1vdmUoKSx0LmlzUHJvY2Vzc2luZz0hMX0sY2xlYXJUYWJsZUJvZHk6ZnVuY3Rpb24odCl7ZSh0KVswXS5jb25maWcuJHRib2RpZXMuY2hpbGRyZW4oKS5kZXRhY2goKX0sY2hhcmFjdGVyRXF1aXZhbGVudHM6e2E6IsOhw6DDosOjw6TEhcOlIixBOiLDgcOAw4LDg8OExITDhSIsYzoiw6fEh8SNIixDOiLDh8SGxIwiLGU6IsOpw6jDqsOrxJvEmSIsRToiw4nDiMOKw4vEmsSYIixpOiLDrcOsxLDDrsOvxLEiLEk6IsONw4zEsMOOw48iLG86IsOzw7LDtMO1w7bFjSIsTzoiw5PDksOUw5XDlsWMIixzczoiw58iLFNTOiLhup4iLHU6IsO6w7nDu8O8xa8iLFU6IsOaw5nDm8Ocxa4ifSxyZXBsYWNlQWNjZW50czpmdW5jdGlvbihlKXt2YXIgcixvPSJbIixzPXQuY2hhcmFjdGVyRXF1aXZhbGVudHM7aWYoIXQuY2hhcmFjdGVyUmVnZXgpe3QuY2hhcmFjdGVyUmVnZXhBcnJheT17fTtmb3IociBpbiBzKSJzdHJpbmciPT10eXBlb2YgciYmKG8rPXNbcl0sdC5jaGFyYWN0ZXJSZWdleEFycmF5W3JdPW5ldyBSZWdFeHAoIlsiK3Nbcl0rIl0iLCJnIikpO3QuY2hhcmFjdGVyUmVnZXg9bmV3IFJlZ0V4cChvKyJdIil9aWYodC5jaGFyYWN0ZXJSZWdleC50ZXN0KGUpKWZvcihyIGluIHMpInN0cmluZyI9PXR5cGVvZiByJiYoZT1lLnJlcGxhY2UodC5jaGFyYWN0ZXJSZWdleEFycmF5W3JdLHIpKTtyZXR1cm4gZX0sdmFsaWRhdGVPcHRpb25zOmZ1bmN0aW9uKHIpe3ZhciBvLHMsYSxuLGk9ImhlYWRlcnMgc29ydEZvcmNlIHNvcnRMaXN0IHNvcnRBcHBlbmQgd2lkZ2V0cyIuc3BsaXQoIiAiKSxsPXIub3JpZ2luYWxTZXR0aW5ncztpZihsKXt0LmRlYnVnKHIsImNvcmUiKSYmKG49bmV3IERhdGUpO2ZvcihvIGluIGwpaWYoInVuZGVmaW5lZCI9PT0oYT10eXBlb2YgdC5kZWZhdWx0c1tvXSkpY29uc29sZS53YXJuKCdUYWJsZXNvcnRlciBXYXJuaW5nISAidGFibGUuY29uZmlnLicrbysnIiBvcHRpb24gbm90IHJlY29nbml6ZWQnKTtlbHNlIGlmKCJvYmplY3QiPT09YSlmb3IocyBpbiBsW29dKWE9dC5kZWZhdWx0c1tvXSYmdHlwZW9mIHQuZGVmYXVsdHNbb11bc10sZS5pbkFycmF5KG8saSk8MCYmInVuZGVmaW5lZCI9PT1hJiZjb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ0YWJsZS5jb25maWcuJytvKyIuIitzKyciIG9wdGlvbiBub3QgcmVjb2duaXplZCcpO3QuZGVidWcociwiY29yZSIpJiZjb25zb2xlLmxvZygidmFsaWRhdGUgb3B0aW9ucyB0aW1lOiIrdC5iZW5jaG1hcmsobikpfX0scmVzdG9yZUhlYWRlcnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhPWUocilbMF0uY29uZmlnLG49YS4kdGFibGUuZmluZChhLnNlbGVjdG9ySGVhZGVycyksaT1uLmxlbmd0aDtmb3Iobz0wO288aTtvKyspKHM9bi5lcShvKSkuZmluZCgiLiIrdC5jc3MuaGVhZGVySW4pLmxlbmd0aCYmcy5odG1sKGEuaGVhZGVyQ29udGVudFtvXSl9LGRlc3Ryb3k6ZnVuY3Rpb24ocixvLHMpe2lmKChyPWUocilbMF0pLmhhc0luaXRpYWxpemVkKXt0LnJlbW92ZVdpZGdldChyLCEwLCExKTt2YXIgYSxuPWUociksaT1yLmNvbmZpZyxsPW4uZmluZCgidGhlYWQ6Zmlyc3QiKSxkPWwuZmluZCgidHIuIit0LmNzcy5oZWFkZXJSb3cpLnJlbW92ZUNsYXNzKHQuY3NzLmhlYWRlclJvdysiICIraS5jc3NIZWFkZXJSb3cpLGM9bi5maW5kKCJ0Zm9vdDpmaXJzdCA+IHRyIikuY2hpbGRyZW4oInRoLCB0ZCIpOyExPT09byYmZS5pbkFycmF5KCJ1aXRoZW1lIixpLndpZGdldHMpPj0wJiYobi50cmlnZ2VySGFuZGxlcigiYXBwbHlXaWRnZXRJZCIsWyJ1aXRoZW1lIl0pLG4udHJpZ2dlckhhbmRsZXIoImFwcGx5V2lkZ2V0SWQiLFsiemVicmEiXSkpLGwuZmluZCgidHIiKS5ub3QoZCkucmVtb3ZlKCksYT0ic29ydFJlc2V0IHVwZGF0ZSB1cGRhdGVSb3dzIHVwZGF0ZUFsbCB1cGRhdGVIZWFkZXJzIHVwZGF0ZUNlbGwgYWRkUm93cyB1cGRhdGVDb21wbGV0ZSBzb3J0b24gYXBwZW5kQ2FjaGUgdXBkYXRlQ2FjaGUgYXBwbHlXaWRnZXRJZCBhcHBseVdpZGdldHMgcmVmcmVzaFdpZGdldHMgcmVtb3ZlV2lkZ2V0IGRlc3Ryb3kgbW91c2V1cCBtb3VzZWxlYXZlICIrImtleXByZXNzIHNvcnRCZWdpbiBzb3J0RW5kIHJlc2V0VG9Mb2FkU3RhdGUgIi5zcGxpdCgiICIpLmpvaW4oaS5uYW1lc3BhY2UrIiAiKSxuLnJlbW92ZURhdGEoInRhYmxlc29ydGVyIikudW5iaW5kKGEucmVwbGFjZSh0LnJlZ2V4LnNwYWNlcywiICIpKSxpLiRoZWFkZXJzLmFkZChjKS5yZW1vdmVDbGFzcyhbdC5jc3MuaGVhZGVyLGkuY3NzSGVhZGVyLGkuY3NzQXNjLGkuY3NzRGVzYyx0LmNzcy5zb3J0QXNjLHQuY3NzLnNvcnREZXNjLHQuY3NzLnNvcnROb25lXS5qb2luKCIgIikpLnJlbW92ZUF0dHIoImRhdGEtY29sdW1uIikucmVtb3ZlQXR0cigiYXJpYS1sYWJlbCIpLmF0dHIoImFyaWEtZGlzYWJsZWQiLCJ0cnVlIiksZC5maW5kKGkuc2VsZWN0b3JTb3J0KS51bmJpbmQoIm1vdXNlZG93biBtb3VzZXVwIGtleXByZXNzICIuc3BsaXQoIiAiKS5qb2luKGkubmFtZXNwYWNlKyIgIikucmVwbGFjZSh0LnJlZ2V4LnNwYWNlcywiICIpKSx0LnJlc3RvcmVIZWFkZXJzKHIpLG4udG9nZ2xlQ2xhc3ModC5jc3MudGFibGUrIiAiK2kudGFibGVDbGFzcysiIHRhYmxlc29ydGVyLSIraS50aGVtZSwhMT09PW8pLG4ucmVtb3ZlQ2xhc3MoaS5uYW1lc3BhY2Uuc2xpY2UoMSkpLHIuaGFzSW5pdGlhbGl6ZWQ9ITEsZGVsZXRlIHIuY29uZmlnLmNhY2hlLCJmdW5jdGlvbiI9PXR5cGVvZiBzJiZzKHIpLHQuZGVidWcoaSwiY29yZSIpJiZjb25zb2xlLmxvZygidGFibGVzb3J0ZXIgaGFzIGJlZW4gcmVtb3ZlZCIpfX19O2UuZm4udGFibGVzb3J0ZXI9ZnVuY3Rpb24ocil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBvPXRoaXMscz1lLmV4dGVuZCghMCx7fSx0LmRlZmF1bHRzLHIsdC5pbnN0YW5jZU1ldGhvZHMpO3Mub3JpZ2luYWxTZXR0aW5ncz1yLCFvLmhhc0luaXRpYWxpemVkJiZ0LmJ1aWxkVGFibGUmJiJUQUJMRSIhPT10aGlzLm5vZGVOYW1lP3QuYnVpbGRUYWJsZShvLHMpOnQuc2V0dXAobyxzKX0pfSx3aW5kb3cuY29uc29sZSYmd2luZG93LmNvbnNvbGUubG9nfHwodC5sb2dzPVtdLGNvbnNvbGU9e30sY29uc29sZS5sb2c9Y29uc29sZS53YXJuPWNvbnNvbGUuZXJyb3I9Y29uc29sZS50YWJsZT1mdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHM6YXJndW1lbnRzWzBdO3QubG9nc1t0LmxvZ3MubGVuZ3RoXT17ZGF0ZTpEYXRlLm5vdygpLGxvZzplfX0pLHQuYWRkUGFyc2VyKHtpZDoibm8tcGFyc2VyIixpczpmdW5jdGlvbigpe3JldHVybiExfSxmb3JtYXQ6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sdHlwZToidGV4dCJ9KSx0LmFkZFBhcnNlcih7aWQ6InRleHQiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGZvcm1hdDpmdW5jdGlvbihyLG8pe3ZhciBzPW8uY29uZmlnO3JldHVybiByJiYocj1lLnRyaW0ocy5pZ25vcmVDYXNlP3IudG9Mb2NhbGVMb3dlckNhc2UoKTpyKSxyPXMuc29ydExvY2FsZUNvbXBhcmU/dC5yZXBsYWNlQWNjZW50cyhyKTpyKSxyfSx0eXBlOiJ0ZXh0In0pLHQucmVnZXgubm9uZGlnaXQ9L1teXHcsLiBcLSgpXS9nLHQuYWRkUGFyc2VyKHtpZDoiZGlnaXQiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LmlzRGlnaXQoZSl9LGZvcm1hdDpmdW5jdGlvbihyLG8pe3ZhciBzPXQuZm9ybWF0RmxvYXQoKHJ8fCIiKS5yZXBsYWNlKHQucmVnZXgubm9uZGlnaXQsIiIpLG8pO3JldHVybiByJiYibnVtYmVyIj09dHlwZW9mIHM/czpyP2UudHJpbShyJiZvLmNvbmZpZy5pZ25vcmVDYXNlP3IudG9Mb2NhbGVMb3dlckNhc2UoKTpyKTpyfSx0eXBlOiJudW1lcmljIn0pLHQucmVnZXguY3VycmVuY3lSZXBsYWNlPS9bK1wtLC4gXS9nLHQucmVnZXguY3VycmVuY3lUZXN0PS9eXCg/XGQrW1x1MDBhMyRcdTIwYWNcdTAwYTRcdTAwYTVcdTAwYTI/Ll18W1x1MDBhMyRcdTIwYWNcdTAwYTRcdTAwYTVcdTAwYTI/Ll1cZCtcKT8kLyx0LmFkZFBhcnNlcih7aWQ6ImN1cnJlbmN5IixpczpmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5jdXJyZW5jeVJlcGxhY2UsIiIpLHQucmVnZXguY3VycmVuY3lUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihyLG8pe3ZhciBzPXQuZm9ybWF0RmxvYXQoKHJ8fCIiKS5yZXBsYWNlKHQucmVnZXgubm9uZGlnaXQsIiIpLG8pO3JldHVybiByJiYibnVtYmVyIj09dHlwZW9mIHM/czpyP2UudHJpbShyJiZvLmNvbmZpZy5pZ25vcmVDYXNlP3IudG9Mb2NhbGVMb3dlckNhc2UoKTpyKTpyfSx0eXBlOiJudW1lcmljIn0pLHQucmVnZXgudXJsUHJvdG9jb2xUZXN0PS9eKGh0dHBzP3xmdHB8ZmlsZSk6XC9cLy8sdC5yZWdleC51cmxQcm90b2NvbFJlcGxhY2U9LyhodHRwcz98ZnRwfGZpbGUpOlwvXC8od3d3XC4pPy8sdC5hZGRQYXJzZXIoe2lkOiJ1cmwiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4LnVybFByb3RvY29sVGVzdC50ZXN0KGUpfSxmb3JtYXQ6ZnVuY3Rpb24ocil7cmV0dXJuIHI/ZS50cmltKHIucmVwbGFjZSh0LnJlZ2V4LnVybFByb3RvY29sUmVwbGFjZSwiIikpOnJ9LHR5cGU6InRleHQifSksdC5yZWdleC5kYXNoPS8tL2csdC5yZWdleC5pc29EYXRlPS9eXGR7NH1bXC9cLV1cZHsxLDJ9W1wvXC1dXGR7MSwyfS8sdC5hZGRQYXJzZXIoe2lkOiJpc29EYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC5pc29EYXRlLnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihlKXt2YXIgcj1lP25ldyBEYXRlKGUucmVwbGFjZSh0LnJlZ2V4LmRhc2gsIi8iKSk6ZTtyZXR1cm4gciBpbnN0YW5jZW9mIERhdGUmJmlzRmluaXRlKHIpP3IuZ2V0VGltZSgpOmV9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC5wZXJjZW50PS8lL2csdC5yZWdleC5wZXJjZW50VGVzdD0vKFxkXHMqPyV8JVxzKj9cZCkvLHQuYWRkUGFyc2VyKHtpZDoicGVyY2VudCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVnZXgucGVyY2VudFRlc3QudGVzdChlKSYmZS5sZW5ndGg8MTV9LGZvcm1hdDpmdW5jdGlvbihlLHIpe3JldHVybiBlP3QuZm9ybWF0RmxvYXQoZS5yZXBsYWNlKHQucmVnZXgucGVyY2VudCwiIikscik6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LmFkZFBhcnNlcih7aWQ6ImltYWdlIixpczpmdW5jdGlvbihlLHQscixvKXtyZXR1cm4gby5maW5kKCJpbWciKS5sZW5ndGg+MH0sZm9ybWF0OmZ1bmN0aW9uKHQscixvKXtyZXR1cm4gZShvKS5maW5kKCJpbWciKS5hdHRyKHIuY29uZmlnLmltZ0F0dHJ8fCJhbHQiKXx8dH0scGFyc2VkOiEwLHR5cGU6InRleHQifSksdC5yZWdleC5kYXRlUmVwbGFjZT0vKFxTKShbQVBdTSkkL2ksdC5yZWdleC51c0xvbmdEYXRlVGVzdDE9L15bQS1aXXszLDEwfVwuP1xzK1xkezEsMn0sP1xzKyhcZHs0fSkoXHMrXGR7MSwyfTpcZHsyfSg6XGR7Mn0pPyhccytbQVBdTSk/KT8kL2ksdC5yZWdleC51c0xvbmdEYXRlVGVzdDI9L15cZHsxLDJ9XHMrW0EtWl17MywxMH1ccytcZHs0fS9pLHQuYWRkUGFyc2VyKHtpZDoidXNMb25nRGF0ZSIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVnZXgudXNMb25nRGF0ZVRlc3QxLnRlc3QoZSl8fHQucmVnZXgudXNMb25nRGF0ZVRlc3QyLnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihlKXt2YXIgcj1lP25ldyBEYXRlKGUucmVwbGFjZSh0LnJlZ2V4LmRhdGVSZXBsYWNlLCIkMSAkMiIpKTplO3JldHVybiByIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUocik/ci5nZXRUaW1lKCk6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnNob3J0RGF0ZVRlc3Q9LyheXGR7MSwyfVtcL1xzXVxkezEsMn1bXC9cc11cZHs0fSl8KF5cZHs0fVtcL1xzXVxkezEsMn1bXC9cc11cZHsxLDJ9KS8sdC5yZWdleC5zaG9ydERhdGVSZXBsYWNlPS9bXC0uLF0vZyx0LnJlZ2V4LnNob3J0RGF0ZVhYWT0vKFxkezEsMn0pW1wvXHNdKFxkezEsMn0pW1wvXHNdKFxkezR9KS8sdC5yZWdleC5zaG9ydERhdGVZTUQ9LyhcZHs0fSlbXC9cc10oXGR7MSwyfSlbXC9cc10oXGR7MSwyfSkvLHQuY29udmVydEZvcm1hdD1mdW5jdGlvbihlLHIpe2U9KGV8fCIiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikucmVwbGFjZSh0LnJlZ2V4LnNob3J0RGF0ZVJlcGxhY2UsIi8iKSwibW1kZHl5eXkiPT09cj9lPWUucmVwbGFjZSh0LnJlZ2V4LnNob3J0RGF0ZVhYWSwiJDMvJDEvJDIiKToiZGRtbXl5eXkiPT09cj9lPWUucmVwbGFjZSh0LnJlZ2V4LnNob3J0RGF0ZVhYWSwiJDMvJDIvJDEiKToieXl5eW1tZGQiPT09ciYmKGU9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWU1ELCIkMS8kMi8kMyIpKTt2YXIgbz1uZXcgRGF0ZShlKTtyZXR1cm4gbyBpbnN0YW5jZW9mIERhdGUmJmlzRmluaXRlKG8pP28uZ2V0VGltZSgpOiIifSx0LmFkZFBhcnNlcih7aWQ6InNob3J0RGF0ZSIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9KGV8fCIiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikucmVwbGFjZSh0LnJlZ2V4LnNob3J0RGF0ZVJlcGxhY2UsIi8iKSx0LnJlZ2V4LnNob3J0RGF0ZVRlc3QudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUscixvLHMpe2lmKGUpe3ZhciBhPXIuY29uZmlnLG49YS4kaGVhZGVySW5kZXhlZFtzXSxpPW4ubGVuZ3RoJiZuLmRhdGEoImRhdGVGb3JtYXQiKXx8dC5nZXREYXRhKG4sdC5nZXRDb2x1bW5EYXRhKHIsYS5oZWFkZXJzLHMpLCJkYXRlRm9ybWF0Iil8fGEuZGF0ZUZvcm1hdDtyZXR1cm4gbi5sZW5ndGgmJm4uZGF0YSgiZGF0ZUZvcm1hdCIsaSksdC5jb252ZXJ0Rm9ybWF0KGUsaSl8fGV9cmV0dXJuIGV9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC50aW1lVGVzdD0vXigwP1sxLTldfDFbMC0yXSk6KFswLTVdXGQpKFxzW0FQXU0pJHxeKCg/OlswMV1cZHxbMl1bMC00XSk6WzAtNV1cZCkkL2ksdC5yZWdleC50aW1lTWF0Y2g9LygwP1sxLTldfDFbMC0yXSk6KFswLTVdXGQpKFxzW0FQXU0pfCgoPzpbMDFdXGR8WzJdWzAtNF0pOlswLTVdXGQpL2ksdC5hZGRQYXJzZXIoe2lkOiJ0aW1lIixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC50aW1lVGVzdC50ZXN0KGUpfSxmb3JtYXQ6ZnVuY3Rpb24oZSl7dmFyIHIsbz0oZXx8IiIpLm1hdGNoKHQucmVnZXgudGltZU1hdGNoKSxzPW5ldyBEYXRlKGUpLGE9ZSYmKG51bGwhPT1vP29bMF06IjAwOjAwIEFNIiksbj1hP25ldyBEYXRlKCIyMDAwLzAxLzAxICIrYS5yZXBsYWNlKHQucmVnZXguZGF0ZVJlcGxhY2UsIiQxICQyIikpOmE7cmV0dXJuIG4gaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShuKT8ocj1zIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUocyk/cy5nZXRUaW1lKCk6MCxyP3BhcnNlRmxvYXQobi5nZXRUaW1lKCkrIi4iK3MuZ2V0VGltZSgpKTpuLmdldFRpbWUoKSk6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LmFkZFBhcnNlcih7aWQ6Im1ldGFkYXRhIixpczpmdW5jdGlvbigpe3JldHVybiExfSxmb3JtYXQ6ZnVuY3Rpb24odCxyLG8pe3ZhciBzPXIuY29uZmlnLGE9cy5wYXJzZXJNZXRhZGF0YU5hbWU/cy5wYXJzZXJNZXRhZGF0YU5hbWU6InNvcnRWYWx1ZSI7cmV0dXJuIGUobykubWV0YWRhdGEoKVthXX0sdHlwZToibnVtZXJpYyJ9KSx0LmFkZFdpZGdldCh7aWQ6InplYnJhIixwcmlvcml0eTo5MCxmb3JtYXQ6ZnVuY3Rpb24odCxyLG8pe3ZhciBzLGEsbixpLGwsZCxjLGc9bmV3IFJlZ0V4cChyLmNzc0NoaWxkUm93LCJpIikscD1yLiR0Ym9kaWVzLmFkZChlKHIubmFtZXNwYWNlKyJfZXh0cmFfdGFibGUiKS5jaGlsZHJlbigidGJvZHk6bm90KC4iK3IuY3NzSW5mb0Jsb2NrKyIpIikpO2ZvcihsPTA7bDxwLmxlbmd0aDtsKyspZm9yKG49MCxjPShzPXAuZXEobCkuY2hpbGRyZW4oInRyOnZpc2libGUiKS5ub3Qoci5zZWxlY3RvclJlbW92ZSkpLmxlbmd0aCxkPTA7ZDxjO2QrKylhPXMuZXEoZCksZy50ZXN0KGFbMF0uY2xhc3NOYW1lKXx8bisrLGk9biUyPT0wLGEucmVtb3ZlQ2xhc3Moby56ZWJyYVtpPzE6MF0pLmFkZENsYXNzKG8uemVicmFbaT8wOjFdKX0scmVtb3ZlOmZ1bmN0aW9uKGUscixvLHMpe2lmKCFzKXt2YXIgYSxuLGk9ci4kdGJvZGllcyxsPShvLnplYnJhfHxbImV2ZW4iLCJvZGQiXSkuam9pbigiICIpO2ZvcihhPTA7YTxpLmxlbmd0aDthKyspKG49dC5wcm9jZXNzVGJvZHkoZSxpLmVxKGEpLCEwKSkuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcyhsKSx0LnByb2Nlc3NUYm9keShlLG4sITEpfX19KX0oZSksZS50YWJsZXNvcnRlcn0pOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKgogICAgQ29weXJpZ2h0IDIwMDgtMjAxMwogICAgICAgIE1hdHRoaWFzIEVobWFubiwKICAgICAgICBNaWNoYWVsIEdlcmhhZXVzZXIsCiAgICAgICAgQ2Fyc3RlbiBNaWxsZXIsCiAgICAgICAgQmlhbmNhIFZhbGVudGluLAogICAgICAgIEFsZnJlZCBXYXNzZXJtYW5uLAogICAgICAgIFBldGVyIFdpbGZhaHJ0CiAgICBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgb3IgTEdQTCBWZXJzaW9uIDMgbGljZW5zZXMuCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggSlNYQ29tcHJlc3Nvci4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIGFsb25nIHdpdGggSlNYQ29tcHJlc3Nvci4KICAgIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvPi4KKi8KKGZ1bmN0aW9uKCl7dmFyIGUscixuOyhmdW5jdGlvbih0KXtmdW5jdGlvbiBvKGUscil7cmV0dXJuIEMuY2FsbChlLHIpfWZ1bmN0aW9uIGkoZSxyKXt2YXIgbix0LG8saSxhLHUsYyxmLHMsbCxwPXImJnIuc3BsaXQoIi8iKSxoPWsubWFwLGQ9aCYmaFsiKiJdfHx7fTtpZihlJiYiLiI9PT1lLmNoYXJBdCgwKSlpZihyKXtmb3IocD1wLnNsaWNlKDAscC5sZW5ndGgtMSksZT1wLmNvbmNhdChlLnNwbGl0KCIvIikpLGY9MDtlLmxlbmd0aD5mO2YrPTEpaWYobD1lW2ZdLCIuIj09PWwpZS5zcGxpY2UoZiwxKSxmLT0xO2Vsc2UgaWYoIi4uIj09PWwpe2lmKDE9PT1mJiYoIi4uIj09PWVbMl18fCIuLiI9PT1lWzBdKSlicmVhaztmPjAmJihlLnNwbGljZShmLTEsMiksZi09Mil9ZT1lLmpvaW4oIi8iKX1lbHNlIDA9PT1lLmluZGV4T2YoIi4vIikmJihlPWUuc3Vic3RyaW5nKDIpKTtpZigocHx8ZCkmJmgpe2ZvcihuPWUuc3BsaXQoIi8iKSxmPW4ubGVuZ3RoO2Y+MDtmLT0xKXtpZih0PW4uc2xpY2UoMCxmKS5qb2luKCIvIikscClmb3Iocz1wLmxlbmd0aDtzPjA7cy09MSlpZihvPWhbcC5zbGljZSgwLHMpLmpvaW4oIi8iKV0sbyYmKG89b1t0XSkpe2k9byxhPWY7YnJlYWt9aWYoaSlicmVhazshdSYmZCYmZFt0XSYmKHU9ZFt0XSxjPWYpfSFpJiZ1JiYoaT11LGE9YyksaSYmKG4uc3BsaWNlKDAsYSxpKSxlPW4uam9pbigiLyIpKX1yZXR1cm4gZX1mdW5jdGlvbiBhKGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGguYXBwbHkodCx2LmNhbGwoYXJndW1lbnRzLDApLmNvbmNhdChbZSxyXSkpfX1mdW5jdGlvbiB1KGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gaShyLGUpfX1mdW5jdGlvbiBjKGUpe3JldHVybiBmdW5jdGlvbihyKXtiW2VdPXJ9fWZ1bmN0aW9uIGYoZSl7aWYobyhtLGUpKXt2YXIgcj1tW2VdO2RlbGV0ZSBtW2VdLHlbZV09ITAscC5hcHBseSh0LHIpfWlmKCFvKGIsZSkmJiFvKHksZSkpdGhyb3cgRXJyb3IoIk5vICIrZSk7cmV0dXJuIGJbZV19ZnVuY3Rpb24gcyhlKXt2YXIgcixuPWU/ZS5pbmRleE9mKCIhIik6LTE7cmV0dXJuIG4+LTEmJihyPWUuc3Vic3RyaW5nKDAsbiksZT1lLnN1YnN0cmluZyhuKzEsZS5sZW5ndGgpKSxbcixlXX1mdW5jdGlvbiBsKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBrJiZrLmNvbmZpZyYmay5jb25maWdbZV18fHt9fX12YXIgcCxoLGQsZyxiPXt9LG09e30saz17fSx5PXt9LEM9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx2PVtdLnNsaWNlO2Q9ZnVuY3Rpb24oZSxyKXt2YXIgbix0PXMoZSksbz10WzBdO3JldHVybiBlPXRbMV0sbyYmKG89aShvLHIpLG49ZihvKSksbz9lPW4mJm4ubm9ybWFsaXplP24ubm9ybWFsaXplKGUsdShyKSk6aShlLHIpOihlPWkoZSxyKSx0PXMoZSksbz10WzBdLGU9dFsxXSxvJiYobj1mKG8pKSkse2Y6bz9vKyIhIitlOmUsbjplLHByOm8scDpufX0sZz17cmVxdWlyZTpmdW5jdGlvbihlKXtyZXR1cm4gYShlKX0sZXhwb3J0czpmdW5jdGlvbihlKXt2YXIgcj1iW2VdO3JldHVybiByIT09dm9pZCAwP3I6YltlXT17fX0sbW9kdWxlOmZ1bmN0aW9uKGUpe3JldHVybntpZDplLHVyaToiIixleHBvcnRzOmJbZV0sY29uZmlnOmwoZSl9fX0scD1mdW5jdGlvbihlLHIsbixpKXt2YXIgdSxzLGwscCxoLGssQz1bXTtpZihpPWl8fGUsImZ1bmN0aW9uIj09dHlwZW9mIG4pe2ZvcihyPSFyLmxlbmd0aCYmbi5sZW5ndGg/WyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdOnIsaD0wO3IubGVuZ3RoPmg7aCs9MSlpZihwPWQocltoXSxpKSxzPXAuZiwicmVxdWlyZSI9PT1zKUNbaF09Zy5yZXF1aXJlKGUpO2Vsc2UgaWYoImV4cG9ydHMiPT09cylDW2hdPWcuZXhwb3J0cyhlKSxrPSEwO2Vsc2UgaWYoIm1vZHVsZSI9PT1zKXU9Q1toXT1nLm1vZHVsZShlKTtlbHNlIGlmKG8oYixzKXx8byhtLHMpfHxvKHkscykpQ1toXT1mKHMpO2Vsc2V7aWYoIXAucCl0aHJvdyBFcnJvcihlKyIgbWlzc2luZyAiK3MpO3AucC5sb2FkKHAubixhKGksITApLGMocykse30pLENbaF09YltzXX1sPW4uYXBwbHkoYltlXSxDKSxlJiYodSYmdS5leHBvcnRzIT09dCYmdS5leHBvcnRzIT09YltlXT9iW2VdPXUuZXhwb3J0czpsPT09dCYma3x8KGJbZV09bCkpfWVsc2UgZSYmKGJbZV09bil9LGU9cj1oPWZ1bmN0aW9uKGUscixuLG8saSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP2dbZV0/Z1tlXShyKTpmKGQoZSxyKS5mKTooZS5zcGxpY2V8fChrPWUsci5zcGxpY2U/KGU9cixyPW4sbj1udWxsKTplPXQpLHI9cnx8ZnVuY3Rpb24oKXt9LCJmdW5jdGlvbiI9PXR5cGVvZiBuJiYobj1vLG89aSksbz9wKHQsZSxyLG4pOnNldFRpbWVvdXQoZnVuY3Rpb24oKXtwKHQsZSxyLG4pfSw0KSxoKX0saC5jb25maWc9ZnVuY3Rpb24oZSl7cmV0dXJuIGs9ZSxrLmRlcHMmJmgoay5kZXBzLGsuY2FsbGJhY2spLGh9LG49ZnVuY3Rpb24oZSxyLG4pe3Iuc3BsaWNlfHwobj1yLHI9W10pLG8oYixlKXx8byhtLGUpfHwobVtlXT1bZSxyLG5dKX0sbi5hbWQ9e2pRdWVyeTohMH19KSgpLG4oIi4uL25vZGVfbW9kdWxlcy9hbG1vbmQvYWxtb25kIixmdW5jdGlvbigpe30pLG4oImp4ZyIsW10sZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4ib2JqZWN0IiE9dHlwZW9mIEpYR3x8SlhHLmV4dGVuZHx8KGU9SlhHKSxlLmV4dGVuZD1mdW5jdGlvbihlLHIsbix0KXt2YXIgbyxpO249bnx8ITEsdD10fHwhMTtmb3IobyBpbiByKSghbnx8biYmci5oYXNPd25Qcm9wZXJ0eShvKSkmJihpPXQ/by50b0xvd2VyQ2FzZSgpOm8sZVtpXT1yW29dKX0sZS5leHRlbmQoZSx7Ym9hcmRzOnt9LHJlYWRlcnM6e30sZWxlbWVudHM6e30scmVnaXN0ZXJFbGVtZW50OmZ1bmN0aW9uKGUscil7ZT1lLnRvTG93ZXJDYXNlKCksdGhpcy5lbGVtZW50c1tlXT1yfSxyZWdpc3RlclJlYWRlcjpmdW5jdGlvbihlLHIpe3ZhciBuLHQ7Zm9yKG49MDtyLmxlbmd0aD5uO24rKyl0PXJbbl0udG9Mb3dlckNhc2UoKSwiZnVuY3Rpb24iIT10eXBlb2YgdGhpcy5yZWFkZXJzW3RdJiYodGhpcy5yZWFkZXJzW3RdPWUpfSxzaG9ydGN1dDpmdW5jdGlvbihlLHIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlW3JdLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LGdldFJlZjpmdW5jdGlvbihlLHIpe3JldHVybiBlLnNlbGVjdChyKX0sZ2V0UmVmZXJlbmNlOmZ1bmN0aW9uKGUscil7cmV0dXJuIGUuc2VsZWN0KHIpfSxkZWJ1Z0ludDpmdW5jdGlvbigpe3ZhciBlLHI7Zm9yKGU9MDthcmd1bWVudHMubGVuZ3RoPmU7ZSsrKXI9YXJndW1lbnRzW2VdLCJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2c/Y29uc29sZS5sb2cocik6Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRlYnVnIikmJihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGVidWciKS5pbm5lckhUTUwrPXIrIjxici8+Iil9LGRlYnVnV1NUOmZ1bmN0aW9uKCl7dmFyIHI9RXJyb3IoKTtlLmRlYnVnSW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyJiZyLnN0YWNrJiYoZS5kZWJ1Z0ludCgic3RhY2t0cmFjZSIpLGUuZGVidWdJbnQoci5zdGFjay5zcGxpdCgiXG4iKS5zbGljZSgxKS5qb2luKCJcbiIpKSl9LGRlYnVnTGluZTpmdW5jdGlvbigpe3ZhciByPUVycm9yKCk7ZS5kZWJ1Z0ludC5hcHBseSh0aGlzLGFyZ3VtZW50cyksciYmci5zdGFjayYmZS5kZWJ1Z0ludCgiQ2FsbGVkIGZyb20iLHIuc3RhY2suc3BsaXQoIlxuIikuc2xpY2UoMiwzKS5qb2luKCJcbiIpKX0sZGVidWc6ZnVuY3Rpb24oKXtlLmRlYnVnSW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KSxlfSksbigidXRpbHMvemlwIixbImp4ZyJdLGZ1bmN0aW9uKGUpe3ZhciByPVswLDEyOCw2NCwxOTIsMzIsMTYwLDk2LDIyNCwxNiwxNDQsODAsMjA4LDQ4LDE3NiwxMTIsMjQwLDgsMTM2LDcyLDIwMCw0MCwxNjgsMTA0LDIzMiwyNCwxNTIsODgsMjE2LDU2LDE4NCwxMjAsMjQ4LDQsMTMyLDY4LDE5NiwzNiwxNjQsMTAwLDIyOCwyMCwxNDgsODQsMjEyLDUyLDE4MCwxMTYsMjQ0LDEyLDE0MCw3NiwyMDQsNDQsMTcyLDEwOCwyMzYsMjgsMTU2LDkyLDIyMCw2MCwxODgsMTI0LDI1MiwyLDEzMCw2NiwxOTQsMzQsMTYyLDk4LDIyNiwxOCwxNDYsODIsMjEwLDUwLDE3OCwxMTQsMjQyLDEwLDEzOCw3NCwyMDIsNDIsMTcwLDEwNiwyMzQsMjYsMTU0LDkwLDIxOCw1OCwxODYsMTIyLDI1MCw2LDEzNCw3MCwxOTgsMzgsMTY2LDEwMiwyMzAsMjIsMTUwLDg2LDIxNCw1NCwxODIsMTE4LDI0NiwxNCwxNDIsNzgsMjA2LDQ2LDE3NCwxMTAsMjM4LDMwLDE1OCw5NCwyMjIsNjIsMTkwLDEyNiwyNTQsMSwxMjksNjUsMTkzLDMzLDE2MSw5NywyMjUsMTcsMTQ1LDgxLDIwOSw0OSwxNzcsMTEzLDI0MSw5LDEzNyw3MywyMDEsNDEsMTY5LDEwNSwyMzMsMjUsMTUzLDg5LDIxNyw1NywxODUsMTIxLDI0OSw1LDEzMyw2OSwxOTcsMzcsMTY1LDEwMSwyMjksMjEsMTQ5LDg1LDIxMyw1MywxODEsMTE3LDI0NSwxMywxNDEsNzcsMjA1LDQ1LDE3MywxMDksMjM3LDI5LDE1Nyw5MywyMjEsNjEsMTg5LDEyNSwyNTMsMywxMzEsNjcsMTk1LDM1LDE2Myw5OSwyMjcsMTksMTQ3LDgzLDIxMSw1MSwxNzksMTE1LDI0MywxMSwxMzksNzUsMjAzLDQzLDE3MSwxMDcsMjM1LDI3LDE1NSw5MSwyMTksNTksMTg3LDEyMywyNTEsNywxMzUsNzEsMTk5LDM5LDE2NywxMDMsMjMxLDIzLDE1MSw4NywyMTUsNTUsMTgzLDExOSwyNDcsMTUsMTQzLDc5LDIwNyw0NywxNzUsMTExLDIzOSwzMSwxNTksOTUsMjIzLDYzLDE5MSwxMjcsMjU1XSxuPVszLDQsNSw2LDcsOCw5LDEwLDExLDEzLDE1LDE3LDE5LDIzLDI3LDMxLDM1LDQzLDUxLDU5LDY3LDgzLDk5LDExNSwxMzEsMTYzLDE5NSwyMjcsMjU4LDAsMF0sdD1bMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwLDk5LDk5XSxvPVsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzddLGk9WzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdLGE9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdLHU9MjU2O3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuVW56aXA9ZnVuY3Rpb24oYyl7ZnVuY3Rpb24gZigpe3JldHVybiBSKz04LE8+WD9jW1grK106LTF9ZnVuY3Rpb24gcygpe0I9MX1mdW5jdGlvbiBsKCl7dmFyIGU7dHJ5e3JldHVybiBSKyssZT0xJkIsQj4+PTEsMD09PUImJihCPWYoKSxlPTEmQixCPTEyOHxCPj4xKSxlfWNhdGNoKHIpe3Rocm93IHJ9fWZ1bmN0aW9uIHAoZSl7dmFyIG49MCx0PWU7dHJ5e2Zvcig7dC0tOyluPW48PDF8bCgpO2UmJihuPXJbbl0+PjgtZSl9Y2F0Y2gobyl7dGhyb3cgb31yZXR1cm4gbn1mdW5jdGlvbiBoKCl7Sj0wfWZ1bmN0aW9uIGQoZSl7aisrLEdbSisrXT1lLHoucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKSwzMjc2OD09PUomJihKPTApfWZ1bmN0aW9uIGcoKXt0aGlzLmIwPTAsdGhpcy5iMT0wLHRoaXMuanVtcD1udWxsLHRoaXMuanVtcHBvcz0tMX1mdW5jdGlvbiBiKCl7Zm9yKDs7KXtpZihNW0hdPj14KXJldHVybi0xO2lmKFVbTVtIXV09PT1IKXJldHVybiBNW0hdKys7TVtIXSsrfX1mdW5jdGlvbiBtKCl7dmFyIGUscj1QW0ZdO2lmKDE3PT09SClyZXR1cm4tMTtpZihGKyssSCsrLGU9YigpLGU+PTApci5iMD1lO2Vsc2UgaWYoci5iMD0zMjc2OCxtKCkpcmV0dXJuLTE7aWYoZT1iKCksZT49MClyLmIxPWUsci5qdW1wPW51bGw7ZWxzZSBpZihyLmIxPTMyNzY4LHIuanVtcD1QW0ZdLHIuanVtcHBvcz1GLG0oKSlyZXR1cm4tMTtyZXR1cm4gSC0tLDB9ZnVuY3Rpb24gayhlLHIsbil7dmFyIHQ7Zm9yKFA9ZSxGPTAsVT1uLHg9cix0PTA7MTc+dDt0KyspTVt0XT0wO3JldHVybiBIPTAsbSgpPy0xOjB9ZnVuY3Rpb24geShlKXtmb3IodmFyIHIsbix0LG89MCxpPWVbb107OylpZih0PWwoKSl7aWYoISgzMjc2OCZpLmIxKSlyZXR1cm4gaS5iMTtmb3IoaT1pLmp1bXAscj1lLmxlbmd0aCxuPTA7cj5uO24rKylpZihlW25dPT09aSl7bz1uO2JyZWFrfX1lbHNle2lmKCEoMzI3NjgmaS5iMCkpcmV0dXJuIGkuYjA7bysrLGk9ZVtvXX19ZnVuY3Rpb24gQygpe3ZhciB1LGMsYixtLEMsdixBLGosdyxVLHgsUyx6LEksRSxMLE87ZG8gaWYodT1sKCksYj1wKDIpLDA9PT1iKWZvcihzKCksVT1mKCksVXw9ZigpPDw4LFM9ZigpLFN8PWYoKTw8OCw2NTUzNSYoVV5+UykmJmUuZGVidWcoIkJsb2NrTGVuIGNoZWNrc3VtIG1pc21hdGNoXG4iKTtVLS07KWM9ZigpLGQoYyk7ZWxzZSBpZigxPT09Yilmb3IoOzspaWYoQz1yW3AoNyldPj4xLEM+MjM/KEM9Qzw8MXxsKCksQz4xOTk/KEMtPTEyOCxDPUM8PDF8bCgpKTooQy09NDgsQz4xNDMmJihDKz0xMzYpKSk6Qys9MjU2LDI1Nj5DKWQoQyk7ZWxzZXtpZigyNTY9PT1DKWJyZWFrO2ZvcihDLT0yNTcsdz1wKHRbQ10pK25bQ10sQz1yW3AoNSldPj4zLGlbQ10+OD8oeD1wKDgpLHh8PXAoaVtDXS04KTw8OCk6eD1wKGlbQ10pLHgrPW9bQ10sQz0wO3c+QztDKyspYz1HWzMyNzY3JkoteF0sZChjKX1lbHNlIGlmKDI9PT1iKXtmb3IoQT1BcnJheSgzMjApLEk9MjU3K3AoNSksRT0xK3AoNSksTD00K3AoNCksQz0wOzE5PkM7QysrKUFbQ109MDtmb3IoQz0wO0w+QztDKyspQVthW0NdXT1wKDMpO2Zvcih3PXEubGVuZ3RoLG09MDt3Pm07bSsrKXFbbV09bmV3IGc7aWYoayhxLDE5LEEsMCkpcmV0dXJuIGgoKSwxO2Zvcih6PUkrRSxtPTAsTz0tMTt6Pm07KWlmKE8rKyxDPXkocSksMTY+QylBW20rK109QztlbHNlIGlmKDE2PT09Qyl7aWYoQz0zK3AoMiksbStDPnopcmV0dXJuIGgoKSwxO2Zvcih2PW0/QVttLTFdOjA7Qy0tOylBW20rK109dn1lbHNle2lmKEM9MTc9PT1DPzMrcCgzKToxMStwKDcpLG0rQz56KXJldHVybiBoKCksMTtmb3IoO0MtLTspQVttKytdPTB9Zm9yKHc9VC5sZW5ndGgsbT0wO3c+bTttKyspVFttXT1uZXcgZztpZihrKFQsSSxBLDApKXJldHVybiBoKCksMTtmb3Iodz1ULmxlbmd0aCxtPTA7dz5tO20rKylxW21dPW5ldyBnO2ZvcihqPVtdLG09STtBLmxlbmd0aD5tO20rKylqW20tSV09QVttXTtpZihrKHEsRSxqLDApKXJldHVybiBoKCksMTtmb3IoOzspaWYoQz15KFQpLEM+PTI1Nil7aWYoQy09MjU2LDA9PT1DKWJyZWFrO2ZvcihDLT0xLHc9cCh0W0NdKStuW0NdLEM9eShxKSxpW0NdPjg/KHg9cCg4KSx4fD1wKGlbQ10tOCk8PDgpOng9cChpW0NdKSx4Kz1vW0NdO3ctLTspYz1HWzMyNzY3JkoteF0sZChjKX1lbHNlIGQoQyl9d2hpbGUoIXUpO3JldHVybiBoKCkscygpLDB9ZnVuY3Rpb24gdigpe3ZhciBlLHIsbix0LG8saSxhLGMscz1bXTt0cnl7aWYoej1bXSxMPSExLHNbMF09ZigpLHNbMV09ZigpLDEyMD09PXNbMF0mJjIxOD09PXNbMV0mJihDKCksRVtJXT1bei5qb2luKCIiKSwiZ2VvbmV4dC5neHQiXSxJKyspLDMxPT09c1swXSYmMTM5PT09c1sxXSYmKFMoKSxFW0ldPVt6LmpvaW4oIiIpLCJmaWxlIl0sSSsrKSw4MD09PXNbMF0mJjc1PT09c1sxXSYmKEw9ITAsc1syXT1mKCksc1szXT1mKCksMz09PXNbMl0mJjQ9PT1zWzNdKSl7Zm9yKHNbMF09ZigpLHNbMV09ZigpLEE9ZigpLEF8PWYoKTw8OCxjPWYoKSxjfD1mKCk8PDgsZigpLGYoKSxmKCksZigpLGE9ZigpLGF8PWYoKTw8OCxhfD1mKCk8PDE2LGF8PWYoKTw8MjQsaT1mKCksaXw9ZigpPDw4LGl8PWYoKTw8MTYsaXw9ZigpPDwyNCxvPWYoKSxvfD1mKCk8PDgsb3w9ZigpPDwxNixvfD1mKCk8PDI0LHQ9ZigpLHR8PWYoKTw8OCxuPWYoKSxufD1mKCk8PDgsZT0wLE49W107dC0tOylyPWYoKSwiLyI9PT1yfCI6Ij09PXI/ZT0wOnUtMT5lJiYoTltlKytdPVN0cmluZy5mcm9tQ2hhckNvZGUocikpO2Zvcih3fHwodz1OKSxlPTA7bj5lOylyPWYoKSxlKys7aj0wLDg9PT1jJiYoQygpLEVbSV09QXJyYXkoMiksRVtJXVswXT16LmpvaW4oIiIpLEVbSV1bMV09Ti5qb2luKCIiKSxJKyspLFMoKX19Y2F0Y2gobCl7dGhyb3cgbH19dmFyIEEsaix3LFUseCxTLHo9W10sST0wLEU9W10sRz1BcnJheSgzMjc2OCksSj0wLEw9ITEsTz1jLmxlbmd0aCxYPTAsQj0xLFI9MCxUPUFycmF5KDI4OCkscT1BcnJheSgzMiksRj0wLFA9bnVsbCxIPShBcnJheSg2NCksQXJyYXkoNjQpLDApLE09QXJyYXkoMTcpLE49W107TVswXT0wLFM9ZnVuY3Rpb24oKXt2YXIgZSxyLG4sdCxvLGksYT1bXTtpZig4JkEmJihhWzBdPWYoKSxhWzFdPWYoKSxhWzJdPWYoKSxhWzNdPWYoKSw4MD09PWFbMF0mJjc1PT09YVsxXSYmNz09PWFbMl0mJjg9PT1hWzNdPyhlPWYoKSxlfD1mKCk8PDgsZXw9ZigpPDwxNixlfD1mKCk8PDI0KTplPWFbMF18YVsxXTw8OHxhWzJdPDwxNnxhWzNdPDwyNCxyPWYoKSxyfD1mKCk8PDgscnw9ZigpPDwxNixyfD1mKCk8PDI0LG49ZigpLG58PWYoKTw8OCxufD1mKCk8PDE2LG58PWYoKTw8MjQpLEwmJnYoKSxhWzBdPWYoKSw4PT09YVswXSl7aWYoQT1mKCksZigpLGYoKSxmKCksZigpLGYoKSx0PWYoKSw0JkEpZm9yKGFbMF09ZigpLGFbMl09ZigpLEg9YVswXSsyNTYqYVsxXSxvPTA7SD5vO28rKylmKCk7aWYoOCZBKWZvcihvPTAsTj1bXSxpPWYoKTtpOykoIjciPT09aXx8IjoiPT09aSkmJihvPTApLHUtMT5vJiYoTltvKytdPWkpLGk9ZigpO2lmKDE2JkEpZm9yKGk9ZigpO2k7KWk9ZigpOzImQSYmKGYoKSxmKCkpLEMoKSxlPWYoKSxlfD1mKCk8PDgsZXw9ZigpPDwxNixlfD1mKCk8PDI0LG49ZigpLG58PWYoKTw8OCxufD1mKCk8PDE2LG58PWYoKTw8MjQsTCYmdigpfX0sZS5VdGlsLlVuemlwLnByb3RvdHlwZS51bnppcEZpbGU9ZnVuY3Rpb24oZSl7dmFyIHI7Zm9yKHRoaXMudW56aXAoKSxyPTA7RS5sZW5ndGg+cjtyKyspaWYoRVtyXVsxXT09PWUpcmV0dXJuIEVbcl1bMF07cmV0dXJuIiJ9LGUuVXRpbC5VbnppcC5wcm90b3R5cGUudW56aXA9ZnVuY3Rpb24oKXtyZXR1cm4gdigpLEV9fSxlLlV0aWx9KSxuKCJ1dGlscy9lbmNvZGluZyIsWyJqeGciXSxmdW5jdGlvbihlKXt2YXIgcj0wLG49WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDgsOCwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwxMCwzLDMsMywzLDMsMywzLDMsMywzLDMsMyw0LDMsMywxMSw2LDYsNiw1LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwwLDEyLDI0LDM2LDYwLDk2LDg0LDEyLDEyLDEyLDQ4LDcyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDAsMTIsMTIsMTIsMTIsMTIsMCwxMiwwLDEyLDEyLDEyLDI0LDEyLDEyLDEyLDEyLDEyLDI0LDEyLDI0LDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDI0LDEyLDEyLDEyLDEyLDEyLDI0LDEyLDEyLDEyLDEyLDEyLDEyLDEyLDI0LDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDM2LDEyLDM2LDEyLDEyLDEyLDM2LDEyLDEyLDEyLDEyLDEyLDM2LDEyLDM2LDEyLDEyLDEyLDM2LDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyXTtyZXR1cm4gZS5VdGlsPWUuVXRpbHx8e30sZS5VdGlsLlVURjg9e2VuY29kZTpmdW5jdGlvbihlKXt2YXIgcixuLHQ9IiIsbz1lLmxlbmd0aDtpZihlPWUucmVwbGFjZSgvXHJcbi9nLCJcbiIpLCJmdW5jdGlvbiI9PXR5cGVvZiB1bmVzY2FwZSYmImZ1bmN0aW9uIj09dHlwZW9mIGVuY29kZVVSSUNvbXBvbmVudClyZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKTtmb3Iocj0wO28+cjtyKyspbj1lLmNoYXJDb2RlQXQociksMTI4Pm4/dCs9U3RyaW5nLmZyb21DaGFyQ29kZShuKTpuPjEyNyYmMjA0OD5uPyh0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKDE5MnxuPj42KSx0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyOHw2MyZuKSk6KHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMjI0fG4+PjEyKSx0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyOHw2MyZuPj42KSx0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyOHw2MyZuKSk7cmV0dXJuIHR9LGRlY29kZTpmdW5jdGlvbihlKXt2YXIgdCxvLGksYT0wLHU9MCxjPXIsZj1bXSxzPWUubGVuZ3RoLGw9W107Zm9yKHQ9MDtzPnQ7dCsrKW89ZS5jaGFyQ29kZUF0KHQpLGk9bltvXSx1PWMhPT1yPzYzJm98dTw8NjoyNTU+PmkmbyxjPW5bMjU2K2MraV0sYz09PXImJih1PjY1NTM1P2YucHVzaCg1NTIzMisodT4+MTApLDU2MzIwKygxMDIzJnUpKTpmLnB1c2godSksYSsrLDA9PT1hJTFlNCYmKGwucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsZikpLGY9W10pKTtyZXR1cm4gbC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxmKSksbC5qb2luKCIiKX0sYXNjaWlDaGFyQ29kZUF0OmZ1bmN0aW9uKGUscil7dmFyIG49ZS5jaGFyQ29kZUF0KHIpO2lmKG4+MjU1KXN3aXRjaChuKXtjYXNlIDgzNjQ6bj0xMjg7YnJlYWs7Y2FzZSA4MjE4Om49MTMwO2JyZWFrO2Nhc2UgNDAyOm49MTMxO2JyZWFrO2Nhc2UgODIyMjpuPTEzMjticmVhaztjYXNlIDgyMzA6bj0xMzM7YnJlYWs7Y2FzZSA4MjI0Om49MTM0O2JyZWFrO2Nhc2UgODIyNTpuPTEzNTticmVhaztjYXNlIDcxMDpuPTEzNjticmVhaztjYXNlIDgyNDA6bj0xMzc7YnJlYWs7Y2FzZSAzNTI6bj0xMzg7YnJlYWs7Y2FzZSA4MjQ5Om49MTM5O2JyZWFrO2Nhc2UgMzM4Om49MTQwO2JyZWFrO2Nhc2UgMzgxOm49MTQyO2JyZWFrO2Nhc2UgODIxNjpuPTE0NTticmVhaztjYXNlIDgyMTc6bj0xNDY7YnJlYWs7Y2FzZSA4MjIwOm49MTQ3O2JyZWFrO2Nhc2UgODIyMTpuPTE0ODticmVhaztjYXNlIDgyMjY6bj0xNDk7YnJlYWs7Y2FzZSA4MjExOm49MTUwO2JyZWFrO2Nhc2UgODIxMjpuPTE1MTticmVhaztjYXNlIDczMjpuPTE1MjticmVhaztjYXNlIDg0ODI6bj0xNTM7YnJlYWs7Y2FzZSAzNTM6bj0xNTQ7YnJlYWs7Y2FzZSA4MjUwOm49MTU1O2JyZWFrO2Nhc2UgMzM5Om49MTU2O2JyZWFrO2Nhc2UgMzgyOm49MTU4O2JyZWFrO2Nhc2UgMzc2Om49MTU5O2JyZWFrO2RlZmF1bHQ6fXJldHVybiBufX0sZS5VdGlsLlVURjh9KSxuKCJ1dGlscy9iYXNlNjQiLFsianhnIiwidXRpbHMvZW5jb2RpbmciXSxmdW5jdGlvbihlLHIpe2Z1bmN0aW9uIG4oZSxyKXtyZXR1cm4gMjU1JmUuY2hhckNvZGVBdChyKX1mdW5jdGlvbiB0KGUscil7dmFyIG49by5pbmRleE9mKGUuY2hhckF0KHIpKTtpZigtMT09PW4pdGhyb3cgRXJyb3IoIkpTWEdyYXBoL3V0aWxzL2Jhc2U2NDogQ2FuJ3QgZGVjb2RlIHN0cmluZyAoaW52YWxpZCBjaGFyYWN0ZXIpLiIpO3JldHVybiBufXZhciBvPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixpPSI9IjtyZXR1cm4gZS5VdGlsPWUuVXRpbHx8e30sZS5VdGlsLkJhc2U2ND17ZW5jb2RlOmZ1bmN0aW9uKGUpe3ZhciB0LGEsdSxjLGYscz1bXTtmb3IoZj1yLmVuY29kZShlKSx1PWYubGVuZ3RoLGM9dSUzLHQ9MDt1LWM+dDt0Kz0zKWE9bihmLHQpPDwxNnxuKGYsdCsxKTw8OHxuKGYsdCsyKSxzLnB1c2goby5jaGFyQXQoYT4+MTgpLG8uY2hhckF0KDYzJmE+PjEyKSxvLmNoYXJBdCg2MyZhPj42KSxvLmNoYXJBdCg2MyZhKSk7c3dpdGNoKGMpe2Nhc2UgMTphPW4oZix1LTEpLHMucHVzaChvLmNoYXJBdChhPj4yKSxvLmNoYXJBdCg2MyZhPDw0KSxpLGkpO2JyZWFrO2Nhc2UgMjphPW4oZix1LTIpPDw4fG4oZix1LTEpLHMucHVzaChvLmNoYXJBdChhPj4xMCksby5jaGFyQXQoNjMmYT4+NCksby5jaGFyQXQoNjMmYTw8MiksaSl9cmV0dXJuIHMuam9pbigiIil9LGRlY29kZTpmdW5jdGlvbihlLG4pe3ZhciBvLGEsdSxjLGYscyxsPVtdLHA9W107aWYobz1lLnJlcGxhY2UoL1teQS1aYS16MC05XCtcLz1dL2csIiIpLHU9by5sZW5ndGgsMCE9PXUlNCl0aHJvdyBFcnJvcigiSlNYR3JhcGgvdXRpbHMvYmFzZTY0OiBDYW4ndCBkZWNvZGUgc3RyaW5nIChpbnZhbGlkIGlucHV0IGxlbmd0aCkuIik7Zm9yKG8uY2hhckF0KHUtMSk9PT1pJiYoYz0xLG8uY2hhckF0KHUtMik9PT1pJiYoYz0yKSx1LT00KSxhPTA7dT5hO2ErPTQpZj10KG8sYSk8PDE4fHQobyxhKzEpPDwxMnx0KG8sYSsyKTw8Nnx0KG8sYSszKSxwLnB1c2goZj4+MTYsMjU1JmY+PjgsMjU1JmYpLDA9PT1hJTFlNCYmKGwucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwscCkpLHA9W10pO3N3aXRjaChjKXtjYXNlIDE6Zj10KG8sdSk8PDEyfHQobyx1KzEpPDw2fHQobyx1KzIpLHAucHVzaChmPj4xMCwyNTUmZj4+Mik7YnJlYWs7Y2FzZSAyOmY9dChvLGEpPDw2fHQobyxhKzEpLHAucHVzaChmPj40KX1yZXR1cm4gbC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxwKSkscz1sLmpvaW4oIiIpLG4mJihzPXIuZGVjb2RlKHMpKSxzfSxkZWNvZGVBc0FycmF5OmZ1bmN0aW9uKGUpe3ZhciByLG49dGhpcy5kZWNvZGUoZSksdD1bXSxvPW4ubGVuZ3RoO2ZvcihyPTA7bz5yO3IrKyl0W3JdPW4uY2hhckNvZGVBdChyKTtyZXR1cm4gdH19LGUuVXRpbC5CYXNlNjR9KSxuKCIuLi9idWlsZC9jb21wcmVzc29yLmRlcHMuanMiLFsianhnIiwidXRpbHMvemlwIiwidXRpbHMvYmFzZTY0Il0sZnVuY3Rpb24oZSxyLG4pe3JldHVybiBlLmRlY29tcHJlc3M9ZnVuY3Rpb24oZSl7cmV0dXJuIHVuZXNjYXBlKG5ldyByLlVuemlwKG4uZGVjb2RlQXNBcnJheShlKSkudW56aXAoKVswXVswXSl9LGV9KSx3aW5kb3cuSlhHPXIoIi4uL2J1aWxkL2NvbXByZXNzb3IuZGVwcy5qcyIpfSkoKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LmZpbGVMb2FkaW5nID0gKGZ1bmN0aW9uICgpIHsKICAgIHZhciBmaWxlTG9hZGluZ0NhbGxiYWNrcyA9IHt9OwogICAgdmFyIHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgZnVuY3Rpb24gbG9hZEtleXdvcmRzRmlsZShmaWxlbmFtZSwgY2FsbGJhY2spIHsKICAgICAgICBmaWxlTG9hZGluZ0NhbGxiYWNrc1tmaWxlbmFtZV0gPSBjYWxsYmFjazsKICAgICAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgc2NyaXB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgICAvLyB0aW1lc3RhbXAgYXMgYW4gYXJndW1lbnQgdG8gcHJldmVudCBicm93c2VycyBmcm9tIGNhY2hpbmcgc2NyaXB0cwogICAgICAgIC8vIHNlZTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NjY2MTkvaG93LXRvLWZvcmNlLWllLXRvLXJlbG9hZC1qYXZhc2NyaXB0CiAgICAgICAgc2NyaXB0LnNyYyA9IGZpbGVuYW1lKyc/dGltZT0nK3RpbWVzdGFtcDsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHNjcmlwdCk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRDYWxsYmFja0hhbmRsZXJGb3JLZXl3b3JkcyhwYXJlbnQpIHsKICAgICAgICB2YXIgY2FsbGFibGVMaXN0ID0gW107CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYWJsZSkgewogICAgICAgICAgICBpZiAoIXBhcmVudC5pc0NoaWxkcmVuTG9hZGVkKSB7CiAgICAgICAgICAgICAgICBjYWxsYWJsZUxpc3QucHVzaChjYWxsYWJsZSk7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGFibGVMaXN0Lmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgbG9hZEtleXdvcmRzRmlsZShwYXJlbnQuY2hpbGRGaWxlTmFtZSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuaXNDaGlsZHJlbkxvYWRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGFibGVMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZUxpc3RbaV0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY2FsbGFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIG5vdGlmeUZpbGVMb2FkZWQoZmlsZW5hbWUpIHsKICAgICAgICBmaWxlTG9hZGluZ0NhbGxiYWNrc1tmaWxlbmFtZV0oKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHM6IGdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzLAogICAgICAgIG5vdGlmeTogbm90aWZ5RmlsZUxvYWRlZAogICAgfQp9KCkpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cubW9kZWwgPSAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gU3VpdGUoZGF0YSkgewogICAgICAgIHZhciBzdWl0ZSA9IGNyZWF0ZU1vZGVsT2JqZWN0KGRhdGEpOwogICAgICAgIHN1aXRlLnNvdXJjZSA9IGRhdGEuc291cmNlOwogICAgICAgIHN1aXRlLnJlbGF0aXZlU291cmNlID0gZGF0YS5yZWxhdGl2ZVNvdXJjZTsKICAgICAgICBzdWl0ZS5mdWxsTmFtZSA9IGRhdGEucGFyZW50ID8gZGF0YS5wYXJlbnQuZnVsbE5hbWUgKyAnLicgKyBkYXRhLm5hbWUgOiBkYXRhLm5hbWU7CiAgICAgICAgc3VpdGUudHlwZSA9ICdzdWl0ZSc7CiAgICAgICAgc3VpdGUudGVtcGxhdGUgPSAnc3VpdGVUZW1wbGF0ZSc7CiAgICAgICAgc2V0U3RhdHMoc3VpdGUsIGRhdGEuc3RhdGlzdGljcyk7CiAgICAgICAgc3VpdGUubWV0YWRhdGEgPSBkYXRhLm1ldGFkYXRhOwogICAgICAgIHN1aXRlLnBvcHVsYXRlS2V5d29yZHMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignS2V5d29yZCcpOwogICAgICAgIHN1aXRlLnBvcHVsYXRlVGVzdHMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignVGVzdCcpOwogICAgICAgIHN1aXRlLnBvcHVsYXRlU3VpdGVzID0gY3JlYXRlSXRlcmFibGVQb3B1bGF0b3IoJ1N1aXRlJyk7CiAgICAgICAgc3VpdGUuY2hpbGRyZW5OYW1lcyA9IFsna2V5d29yZCcsICdzdWl0ZScsICd0ZXN0J107CiAgICAgICAgc3VpdGUuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gZnVuY3Rpb24gKGNhbGxhYmxlKSB7IGNhbGxhYmxlKCk7IH07CiAgICAgICAgc3VpdGUubWVzc2FnZSA9IGRhdGEubWVzc2FnZTsKICAgICAgICBzdWl0ZS5jaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLmtleXdvcmRzKCkuY29uY2F0KHN1aXRlLnRlc3RzKCkpLmNvbmNhdChzdWl0ZS5zdWl0ZXMoKSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5zZWFyY2hUZXN0cyA9IGZ1bmN0aW9uIChwcmVkaWNhdGUpIHsKICAgICAgICAgICAgdmFyIHRlc3RzID0gW107CiAgICAgICAgICAgIHZhciBzdWl0ZXMgPSB0aGlzLnN1aXRlcygpOwogICAgICAgICAgICBmb3IgKHZhciBpIGluIHN1aXRlcykKICAgICAgICAgICAgICAgIHRlc3RzID0gdGVzdHMuY29uY2F0KHN1aXRlc1tpXS5zZWFyY2hUZXN0cyhwcmVkaWNhdGUpKTsKICAgICAgICAgICAgcmV0dXJuIHRlc3RzLmNvbmNhdCh1dGlsLmZpbHRlcih0aGlzLnRlc3RzKCksIHByZWRpY2F0ZSkpOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuc2VhcmNoVGVzdHNJblN1aXRlID0gZnVuY3Rpb24gKHBhdHRlcm4sIG1hdGNoZXIpIHsKICAgICAgICAgICAgaWYgKCFtYXRjaGVyKQogICAgICAgICAgICAgICAgbWF0Y2hlciA9IHV0aWwuTWF0Y2hlcihwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlc0FueShbc3VpdGUuZnVsbE5hbWUsIHN1aXRlLm5hbWVdKSkKICAgICAgICAgICAgICAgIHJldHVybiBzdWl0ZS5hbGxUZXN0cygpOwogICAgICAgICAgICB2YXIgdGVzdHMgPSBbXTsKICAgICAgICAgICAgdmFyIHN1aXRlcyA9IHRoaXMuc3VpdGVzKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc3VpdGVzKQogICAgICAgICAgICAgICAgdGVzdHMgPSB0ZXN0cy5jb25jYXQoc3VpdGVzW2ldLnNlYXJjaFRlc3RzSW5TdWl0ZShwYXR0ZXJuLCBtYXRjaGVyKSk7CiAgICAgICAgICAgIHJldHVybiB0ZXN0czsKICAgICAgICB9OwogICAgICAgIHN1aXRlLnNlYXJjaFRlc3RzQnlUYWcgPSBmdW5jdGlvbiAodGFnKSB7CiAgICAgICAgICAgIHJldHVybiBzdWl0ZS5zZWFyY2hUZXN0cyhmdW5jdGlvbiAodGVzdCkgewogICAgICAgICAgICAgICAgaWYgKHRhZy5jb21iaW5lZCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3QudGFncywgdGFnLmNvbWJpbmVkKTsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZyh0ZXN0LnRhZ3MsIHRhZy5sYWJlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuZmluZFN1aXRlQnlOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIGZpbmRTdWl0ZUJ5TmFtZShzdWl0ZSwgbmFtZSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5hbGxUZXN0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gc3VpdGU7CiAgICB9CiAgICBmdW5jdGlvbiBjb250YWluc1RhZyh0ZXN0VGFncywgdGFnbmFtZSkgewogICAgICAgIHRlc3RUYWdzID0gdXRpbC5tYXAodGVzdFRhZ3MsIHV0aWwubm9ybWFsaXplKTsKICAgICAgICByZXR1cm4gdXRpbC5jb250YWlucyh0ZXN0VGFncywgdXRpbC5ub3JtYWxpemUodGFnbmFtZSkpOwogICAgfQogICAgZnVuY3Rpb24gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwYXR0ZXJuKSB7CiAgICAgICAgdmFyIHBhdHRlcm5zOwogICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ05PVCcpICE9IC0xKSB7CiAgICAgICAgICAgIHBhdHRlcm5zID0gcGF0dGVybi5zcGxpdCgnTk9UJyk7CiAgICAgICAgICAgIGlmICghdXRpbC5ub3JtYWxpemUocGF0dGVybnNbMF0pKQogICAgICAgICAgICAgICAgcmV0dXJuIHV0aWwuYWxsKHV0aWwubWFwKHBhdHRlcm5zLnNsaWNlKDEpLCBmdW5jdGlvbiAocCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVGFnUGF0dGVybih0ZXN0VGFncywgcGF0dGVybnNbMF0pICYmCiAgICAgICAgICAgICAgICB1dGlsLmFsbCh1dGlsLm1hcChwYXR0ZXJucy5zbGljZSgxKSwgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWNvbnRhaW5zVGFnUGF0dGVybih0ZXN0VGFncywgcCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ09SJykgIT0gLTEpIHsKICAgICAgICAgICAgcGF0dGVybnMgPSBwYXR0ZXJuLnNwbGl0KCdPUicpOwogICAgICAgICAgICByZXR1cm4gdXRpbC5hbnkodXRpbC5tYXAocGF0dGVybnMsIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBpZiAocGF0dGVybi5pbmRleE9mKCdBTkQnKSAhPSAtMSkgewogICAgICAgICAgICBwYXR0ZXJucyA9IHBhdHRlcm4uc3BsaXQoJ0FORCcpOwogICAgICAgICAgICByZXR1cm4gdXRpbC5hbGwodXRpbC5tYXAocGF0dGVybnMsIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdXRpbC5NYXRjaGVyKHBhdHRlcm4pLm1hdGNoZXNBbnkodGVzdFRhZ3MpOwogICAgfQogICAgZnVuY3Rpb24gZmluZFN1aXRlQnlOYW1lKHN1aXRlLCBuYW1lKSB7CiAgICAgICAgaWYgKHN1aXRlLmZ1bGxOYW1lID09IG5hbWUpCiAgICAgICAgICAgIHJldHVybiBzdWl0ZTsKICAgICAgICB2YXIgc3ViU3VpdGVzID0gc3VpdGUuc3VpdGVzKCk7CiAgICAgICAgZm9yICh2YXIgaSBpbiBzdWJTdWl0ZXMpIHsKICAgICAgICAgICAgdmFyIG1hdGNoID0gZmluZFN1aXRlQnlOYW1lKHN1YlN1aXRlc1tpXSwgbmFtZSk7CiAgICAgICAgICAgIGlmIChtYXRjaCkKICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBmdW5jdGlvbiBzZXRTdGF0cyhzdWl0ZSwgc3RhdHMpIHsKICAgICAgICBmb3IgKHZhciBuYW1lIGluIHN0YXRzKSB7CiAgICAgICAgICAgIHN1aXRlW25hbWVdID0gc3RhdHNbbmFtZV07CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSwKICAgICAgICAgICAgZG9jOiBkYXRhLmRvYywKICAgICAgICAgICAgc3RhdHVzOiBkYXRhLnN0YXR1cywKICAgICAgICAgICAgdGltZXM6IGRhdGEudGltZXMsCiAgICAgICAgICAgIGlkOiBkYXRhLnBhcmVudCA/IGRhdGEucGFyZW50LmlkICsgJy0nICsgZGF0YS5pZCA6IGRhdGEuaWQKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gVGVzdChkYXRhKSB7CiAgICAgICAgdmFyIHRlc3QgPSBjcmVhdGVNb2RlbE9iamVjdChkYXRhKTsKICAgICAgICB0ZXN0LnR5cGUgPSAndGVzdCc7CiAgICAgICAgdGVzdC50ZW1wbGF0ZSA9ICd0ZXN0VGVtcGxhdGUnOwogICAgICAgIHRlc3QuZnVsbE5hbWUgPSBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIHRlc3QubmFtZTsKICAgICAgICB0ZXN0LmZvcm1hdFBhcmVudE5hbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB1dGlsLmZvcm1hdFBhcmVudE5hbWUodGVzdCk7IH07CiAgICAgICAgdGVzdC50aW1lb3V0ID0gZGF0YS50aW1lb3V0OwogICAgICAgIHRlc3QucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgdGVzdC5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJ107CiAgICAgICAgdGVzdC5pc0NoaWxkcmVuTG9hZGVkID0gZGF0YS5pc0NoaWxkcmVuTG9hZGVkOwogICAgICAgIHRlc3QuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHRlc3QpOwogICAgICAgIHRlc3QuY2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0ZXN0LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5rZXl3b3JkcygpOwogICAgICAgIH07CiAgICAgICAgdGVzdC50YWdzID0gZGF0YS50YWdzOwogICAgICAgIHRlc3QubWVzc2FnZSA9IGRhdGEubWVzc2FnZTsKICAgICAgICB0ZXN0Lm1hdGNoZXNUYWdQYXR0ZXJuID0gZnVuY3Rpb24gKHBhdHRlcm4pIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVGFnUGF0dGVybih0ZXN0LnRhZ3MsIHBhdHRlcm4pOwogICAgICAgIH07CiAgICAgICAgdGVzdC5tYXRjaGVzTmFtZVBhdHRlcm4gPSBmdW5jdGlvbiAocGF0dGVybikgewogICAgICAgICAgICByZXR1cm4gdXRpbC5NYXRjaGVyKHBhdHRlcm4pLm1hdGNoZXNBbnkoW3Rlc3QubmFtZSwgdGVzdC5mdWxsTmFtZV0pOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHRlc3Q7CiAgICB9CiAgICBmdW5jdGlvbiBLZXl3b3JkKGRhdGEpIHsKICAgICAgICB2YXIga3cgPSBjcmVhdGVNb2RlbE9iamVjdChkYXRhKTsKICAgICAgICBrdy5saWJuYW1lID0gZGF0YS5saWJuYW1lOwogICAgICAgIGt3LmZ1bGxOYW1lID0gKGt3LmxpYm5hbWUgPyBrdy5saWJuYW1lICsgJy4nIDogJycpICsga3cubmFtZTsKICAgICAgICBrdy50eXBlID0gZGF0YS50eXBlOwogICAgICAgIGt3LnRlbXBsYXRlID0gJ2tleXdvcmRUZW1wbGF0ZSc7CiAgICAgICAga3cuYXJndW1lbnRzID0gZGF0YS5hcmdzOwogICAgICAgIGt3LmFzc2lnbiA9IGRhdGEuYXNzaWduICsgKGRhdGEuYXNzaWduID8gJyA9JyA6ICcnKTsKICAgICAgICBrdy50YWdzID0gZGF0YS50YWdzOwogICAgICAgIGt3LnRpbWVvdXQgPSBkYXRhLnRpbWVvdXQ7CiAgICAgICAga3cucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAga3cuY2hpbGRyZW5OYW1lcyA9IFsna2V5d29yZCddOwogICAgICAgIGt3LmlzQ2hpbGRyZW5Mb2FkZWQgPSBkYXRhLmlzQ2hpbGRyZW5Mb2FkZWQ7CiAgICAgICAga3cuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKGt3KTsKICAgICAgICBrdy5jaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGt3LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4ga3cua2V5d29yZHMoKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBrdzsKICAgIH0KICAgIGZ1bmN0aW9uIE1lc3NhZ2UobGV2ZWwsIGRhdGUsIHRleHQsIGxpbmspIHsKICAgICAgICB2YXIgbWVzc2FnZSA9IHsKICAgICAgICAgICAgdHlwZTogJ21lc3NhZ2UnLAogICAgICAgICAgICB0ZW1wbGF0ZTogJ21lc3NhZ2VUZW1wbGF0ZScsCiAgICAgICAgICAgIGxldmVsOiBsZXZlbCwKICAgICAgICAgICAgdGltZTogdXRpbC50aW1lRnJvbURhdGUoZGF0ZSksCiAgICAgICAgICAgIGRhdGU6IHV0aWwuZGF0ZUZyb21EYXRlKGRhdGUpLAogICAgICAgICAgICB0ZXh0OiB0ZXh0LAogICAgICAgICAgICBsaW5rOiBsaW5rCiAgICAgICAgfTsKICAgICAgICBtZXNzYWdlLmNhbGxXaGVuQ2hpbGRyZW5SZWFkeSA9IGZ1bmN0aW9uIChjYWxsYWJsZSkgeyBjYWxsYWJsZSgpOyB9OwogICAgICAgIHJldHVybiBtZXNzYWdlOwogICAgfQogICAgZnVuY3Rpb24gVGltZXModGltZWRhdGEpIHsKICAgICAgICB2YXIgc3RhcnQgPSB0aW1lZGF0YVswXTsKICAgICAgICB2YXIgZW5kID0gdGltZWRhdGFbMV07CiAgICAgICAgdmFyIGVsYXBzZWQgPSB0aW1lZGF0YVsyXTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBlbGFwc2VkTWlsbGlzOiBlbGFwc2VkLAogICAgICAgICAgICBlbGFwc2VkVGltZTogdXRpbC5mb3JtYXRFbGFwc2VkKGVsYXBzZWQpLAogICAgICAgICAgICBzdGFydFRpbWU6IHV0aWwuZGF0ZVRpbWVGcm9tRGF0ZShzdGFydCksCiAgICAgICAgICAgIGVuZFRpbWU6ICB1dGlsLmRhdGVUaW1lRnJvbURhdGUoZW5kKQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcihuYW1lKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwb3B1bGF0b3IpIHsKICAgICAgICAgICAgcG9wdWxhdGVJdGVyYWJsZSh0aGlzLCBuYW1lLCBwb3B1bGF0b3IpOwogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBwb3B1bGF0ZUl0ZXJhYmxlKG9iaiwgbmFtZSwgcG9wdWxhdG9yKSB7CiAgICAgICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKSArICdzJzsKICAgICAgICBvYmpbbmFtZV0gPSBjcmVhdGVHZXRBbGxGdW5jdGlvbihwb3B1bGF0b3IubnVtYmVyT2ZJdGVtcywgcG9wdWxhdG9yLmNyZWF0b3IpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlR2V0QWxsRnVuY3Rpb24obnVtYmVyT2ZFbGVtZW50cywgY3JlYXRvcikgewogICAgICAgIHZhciBjYWNoZWQgPSBudWxsOwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmIChjYWNoZWQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGNhY2hlZCA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1iZXJPZkVsZW1lbnRzKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNhY2hlZC5wdXNoKGNyZWF0b3IoaSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjYWNoZWQ7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgU3VpdGU6IFN1aXRlLAogICAgICAgIFRlc3Q6IFRlc3QsCiAgICAgICAgS2V5d29yZDogS2V5d29yZCwKICAgICAgICBNZXNzYWdlOiBNZXNzYWdlLAogICAgICAgIFRpbWVzOiBUaW1lcywKICAgICAgICBjb250YWluc1RhZzogY29udGFpbnNUYWcsICAvLyBFeHBvc2VkIGZvciB0ZXN0cwogICAgICAgIGNvbnRhaW5zVGFnUGF0dGVybjogY29udGFpbnNUYWdQYXR0ZXJuICAvLyBFeHBvc2VkIGZvciB0ZXN0cwogICAgfTsKfSgpKTsKd2luZG93LnN0YXRzID0gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFN0YXRpc3RpY3ModG90YWxFbGVtcywgdGFnRWxlbXMsIHN1aXRlRWxlbXMpIHsKICAgICAgICByZXR1cm4ge3RvdGFsOiB1dGlsLm1hcCh0b3RhbEVsZW1zLCB0b3RhbFN0YXRFbGVtKSwKICAgICAgICAgICAgICAgIHRhZzogICB1dGlsLm1hcCh0YWdFbGVtcywgdGFnU3RhdEVsZW0pLAogICAgICAgICAgICAgICAgc3VpdGU6IHV0aWwubWFwKHN1aXRlRWxlbXMsIHN1aXRlU3RhdEVsZW0pfTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YXRFbGVtKHN0YXQpIHsKICAgICAgICBzdGF0LnRvdGFsID0gc3RhdC5wYXNzICsgc3RhdC5mYWlsICsgc3RhdC5za2lwOwogICAgICAgIHZhciBwZXJjZW50cyA9IGNhbGN1bGF0ZVBlcmNlbnRzKHN0YXQudG90YWwsIHN0YXQucGFzcywgc3RhdC5mYWlsLCBzdGF0LnNraXApOwogICAgICAgIHN0YXQucGFzc1BlcmNlbnQgPSBwZXJjZW50c1swXTsKICAgICAgICBzdGF0LnNraXBQZXJjZW50ID0gcGVyY2VudHNbMV07CiAgICAgICAgc3RhdC5mYWlsUGVyY2VudCA9IHBlcmNlbnRzWzJdOwogICAgICAgIHZhciB3aWR0aHMgPSBjYWxjdWxhdGVXaWR0aHMoc3RhdC5wYXNzUGVyY2VudCwgc3RhdC5za2lwUGVyY2VudCwgc3RhdC5mYWlsUGVyY2VudCk7CiAgICAgICAgc3RhdC5wYXNzV2lkdGggPSB3aWR0aHNbMF07CiAgICAgICAgc3RhdC5za2lwV2lkdGggPSB3aWR0aHNbMV07CiAgICAgICAgc3RhdC5mYWlsV2lkdGggPSB3aWR0aHNbMl07CiAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICB9CiAgICBmdW5jdGlvbiB0b3RhbFN0YXRFbGVtKGRhdGEpIHsKICAgICAgICB2YXIgc3RhdCA9IHN0YXRFbGVtKGRhdGEpOwogICAgICAgIHN0YXQudHlwZSA9ICdhbGwnOwogICAgICAgIHJldHVybiBzdGF0OwogICAgfQogICAgZnVuY3Rpb24gdGFnU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC5saW5rcyA9IHBhcnNlTGlua3Moc3RhdC5saW5rcyk7CiAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZVN0YXRFbGVtKGRhdGEpIHsKICAgICAgICB2YXIgc3RhdCA9IHN0YXRFbGVtKGRhdGEpOwogICAgICAgIHN0YXQuZnVsbE5hbWUgPSBzdGF0LmxhYmVsOwogICAgICAgIHN0YXQuZm9ybWF0UGFyZW50TmFtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWwuZm9ybWF0UGFyZW50TmFtZShzdGF0KTsgfTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlTGlua3MobGlua3NEYXRhKSB7CiAgICAgICAgaWYgKCFsaW5rc0RhdGEpCiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICByZXR1cm4gdXRpbC5tYXAobGlua3NEYXRhLnNwbGl0KCc6OjonKSwgZnVuY3Rpb24gKGxpbmspIHsKICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGxpbmsuaW5kZXhPZignOicpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt0aXRsZTogbGluay5zbGljZSgwLCBpbmRleCksIHVybDogbGluay5zbGljZShpbmRleCsxKX07CiAgICAgICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gY2FsY3VsYXRlUGVyY2VudHModG90YWwsIHBhc3NlZCwgZmFpbGVkLCBza2lwcGVkKSB7CiAgICAgICAgaWYgKHRvdGFsID09IDApIHsKICAgICAgICAgICAgcmV0dXJuIFswLjAsIDAuMCwgMC4wXTsKICAgICAgICB9CiAgICAgICAgdmFyIHBhc3MgPSAxMDAuMCAqIHBhc3NlZCAvIHRvdGFsOwogICAgICAgIHZhciBza2lwID0gMTAwLjAgKiBza2lwcGVkIC8gdG90YWw7CiAgICAgICAgdmFyIGZhaWwgPSAxMDAuMCAqIGZhaWxlZCAvIHRvdGFsOwogICAgICAgIGlmIChwYXNzID4gMCAmJiBwYXNzIDwgMC4xKQogICAgICAgICAgICBwYXNzID0gMC4xCiAgICAgICAgaWYgKGZhaWwgPiAwICYmIGZhaWwgPCAwLjEpCiAgICAgICAgICAgIGZhaWwgPSAwLjEKICAgICAgICBpZiAoc2tpcCA+IDAgJiYgc2tpcCA8IDAuMSkKICAgICAgICAgICAgc2tpcCA9IDAuMQogICAgICAgIGlmIChwYXNzID4gOTkuOTUgJiYgcGFzcyA8IDEwMCkKICAgICAgICAgICAgcGFzcyA9IDk5LjkKICAgICAgICBpZiAoZmFpbCA+IDk5Ljk1ICYmIGZhaWwgPCAxMDApCiAgICAgICAgICAgIGZhaWwgPSA5OS45CiAgICAgICAgaWYgKHNraXAgPiA5OS45NSAmJiBza2lwIDwgMTAwKQogICAgICAgICAgICBza2lwID0gOTkuOQogICAgICAgIHJldHVybiBbTWF0aC5yb3VuZChwYXNzKjEwKS8xMCwgTWF0aC5yb3VuZChza2lwKjEwKS8xMCwgTWF0aC5yb3VuZChmYWlsKjEwKS8xMF07CiAgICB9CiAgICBmdW5jdGlvbiBjYWxjdWxhdGVXaWR0aHMobnVtMSwgbnVtMiwgbnVtMykgewogICAgICAgIGlmIChudW0xICsgbnVtMiArIG51bTMgPT09IDApCiAgICAgICAgICAgIHJldHVybiBbMC4wLCAwLjAsIDAuMF07CiAgICAgICAgLy8gTWFrZSBzbWFsbCBwZXJjZW50YWdlcyBiZXR0ZXIgdmlzaWJsZQogICAgICAgIGlmIChudW0xID4gMCAmJiBudW0xIDwgMSkKICAgICAgICAgICAgbnVtMSA9IDEKICAgICAgICBpZiAobnVtMiA+IDAgJiYgbnVtMiA8IDEpCiAgICAgICAgICAgIG51bTIgPSAxCiAgICAgICAgaWYgKG51bTMgPiAwICYmIG51bTMgPCAxKQogICAgICAgICAgICBudW0zID0gMQogICAgICAgIC8vIEhhbmRsZSBzaXR1YXRpb24gd2hlcmUgc29tZSBhcmUgcm91bmRlZCB1cAogICAgICAgIHdoaWxlIChudW0xICsgbnVtMiArIG51bTMgPiAxMDApIHsKICAgICAgICAgICAgaWYgKG51bTEgPiBudW0yICYmIG51bTEgPiBudW0zKQogICAgICAgICAgICAgICAgbnVtMSAtPSAwLjE7CiAgICAgICAgICAgIGVsc2UgaWYgKG51bTIgPiBudW0xICYmIG51bTIgPiBudW0zKQogICAgICAgICAgICAgICAgbnVtMiAtPSAwLjE7CiAgICAgICAgICAgIGVsc2UgaWYgKG51bTMgPiBudW0xICYmIG51bTMgPiBudW0yKQogICAgICAgICAgICAgICAgbnVtMyAtPSAwLjE7CiAgICAgICAgICAgIGVsc2UgaWYgKG51bTEgPiBudW0zICYmIG51bTEgPT0gbnVtMikgewogICAgICAgICAgICAgICAgbnVtMSAtPSAwLjE7CiAgICAgICAgICAgICAgICBudW0yIC09IDAuMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChudW0xID4gbnVtMiAmJiBudW0xID09IG51bTMpIHsKICAgICAgICAgICAgICAgIG51bTEgLT0gMC4xOwogICAgICAgICAgICAgICAgbnVtMyAtPSAwLjE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobnVtMiA+IG51bTEgJiYgbnVtMiA9PSBudW0zKSB7CiAgICAgICAgICAgICAgICBudW0yIC09IDAuMTsKICAgICAgICAgICAgICAgIG51bTMgLT0gMC4xOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBbTWF0aC5jZWlsKG51bTEqMTApLzEwLCBNYXRoLmNlaWwobnVtMioxMCkvMTAsIE1hdGguY2VpbChudW0zKjEwKS8xMF07CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIFN0YXRpc3RpY3M6IFN0YXRpc3RpY3MKICAgIH07Cn0oKSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy51dGlsID0gZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gbWFwKGVsZW1zLCBmdW5jKSB7CiAgICAgICAgdmFyIHJldCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICByZXRbaV0gPSBmdW5jKGVsZW1zW2ldKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0KICAgIGZ1bmN0aW9uIGZpbHRlcihlbGVtcywgcHJlZGljYXRlKSB7CiAgICAgICAgdmFyIHJldCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBpZiAocHJlZGljYXRlKGVsZW1zW2ldKSkKICAgICAgICAgICAgICAgIHJldC5wdXNoKGVsZW1zW2ldKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0KICAgIGZ1bmN0aW9uIGFsbChlbGVtcykgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBpZiAoIWVsZW1zW2ldKQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGFueShlbGVtcykgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBpZiAoZWxlbXNbaV0pCiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbXNbaV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnRhaW5zKGVsZW1zLCBlKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChlbGVtc1tpXSA9PSBlKQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZ1bmN0aW9uIGxhc3QoaXRlbXMpIHsKICAgICAgICByZXR1cm4gaXRlbXNbaXRlbXMubGVuZ3RoLTFdOwogICAgfQogICAgZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8mbHQ7L2csICc8JykucmVwbGFjZSgvJmd0Oy9nLCAnPicpLnJlcGxhY2UoLyZhbXA7L2csICcmJyk7CiAgICB9CiAgICBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7CiAgICB9CiAgICBmdW5jdGlvbiBub3JtYWxpemUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyAvZywgJycpLnJlcGxhY2UoL18vZywgJycpOwogICAgfQogICAgZnVuY3Rpb24gcmVnZXhwRXNjYXBlKHN0cmluZykgewogICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvWy1bXF17fSgpKz8qLixcXF4kfCNdL2csICJcXCQmIik7CiAgICB9CiAgICBmdW5jdGlvbiBNYXRjaGVyKHBhdHRlcm4pIHsKICAgICAgICBwYXR0ZXJuID0gcmVnZXhwRXNjYXBlKG5vcm1hbGl6ZShwYXR0ZXJuKSk7CiAgICAgICAgdmFyIHJlUGF0dGVybiA9ICdeJyArIHBhdHRlcm4ucmVwbGFjZSgvXFxcPy9nLCAnLicpLnJlcGxhY2UoL1xcXCovZywgJ1tcXHNcXFNdKicpICsgJyQnOwogICAgICAgIHZhciByZWdleHAgPSBuZXcgUmVnRXhwKHJlUGF0dGVybik7CiAgICAgICAgZnVuY3Rpb24gbWF0Y2hlcyhzdHJpbmcpIHsKICAgICAgICAgICAgcmV0dXJuIHJlZ2V4cC50ZXN0KG5vcm1hbGl6ZShzdHJpbmcpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbWF0Y2hlczogbWF0Y2hlcywKICAgICAgICAgICAgbWF0Y2hlc0FueTogZnVuY3Rpb24gKHN0cmluZ3MpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzdHJpbmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQogICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzKHN0cmluZ3NbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBmb3JtYXRQYXJlbnROYW1lKGl0ZW0pIHsKICAgICAgICB2YXIgcGFyZW50TmFtZSA9IGl0ZW0uZnVsbE5hbWUuc2xpY2UoMCwgaXRlbS5mdWxsTmFtZS5sZW5ndGggLSBpdGVtLm5hbWUubGVuZ3RoKTsKICAgICAgICByZXR1cm4gcGFyZW50TmFtZS5yZXBsYWNlKC9cLi9nLCAnIC4gJyk7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lRnJvbURhdGUoZGF0ZSkgewogICAgICAgIGlmICghZGF0ZSkKICAgICAgICAgICAgcmV0dXJuICdOL0EnOwogICAgICAgIHJldHVybiBmb3JtYXRUaW1lKGRhdGUuZ2V0SG91cnMoKSwgZGF0ZS5nZXRNaW51dGVzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZS5nZXRTZWNvbmRzKCksIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpOwogICAgfQogICAgZnVuY3Rpb24gZGF0ZUZyb21EYXRlKGRhdGUpIHsKICAgICAgICBpZiAoIWRhdGUpCiAgICAgICAgICAgIHJldHVybiAnTi9BJzsKICAgICAgICByZXR1cm4gcGFkVG8oZGF0ZS5nZXRGdWxsWWVhcigpLCA0KSArCiAgICAgICAgICAgICAgIHBhZFRvKGRhdGUuZ2V0TW9udGgoKSArIDEsIDIpICsKICAgICAgICAgICAgICAgcGFkVG8oZGF0ZS5nZXREYXRlKCksIDIpOwogICAgfQogICAgZnVuY3Rpb24gZGF0ZVRpbWVGcm9tRGF0ZShkYXRlKSB7CiAgICAgICAgaWYgKCFkYXRlKQogICAgICAgICAgICByZXR1cm4gJ04vQSc7CiAgICAgICAgcmV0dXJuIGRhdGVGcm9tRGF0ZShkYXRlKSArICcgJyArIHRpbWVGcm9tRGF0ZShkYXRlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1hdFRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpc2Vjb25kcykgewogICAgICAgIHJldHVybiBwYWRUbyhob3VycywgMikgKyAnOicgKwogICAgICAgICAgICAgICBwYWRUbyhtaW51dGVzLCAyKSArICc6JyArCiAgICAgICAgICAgICAgIHBhZFRvKHNlY29uZHMsIDIpICsgJy4nICsKICAgICAgICAgICAgICAgcGFkVG8obWlsbGlzZWNvbmRzLCAzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1hdEVsYXBzZWQoZWxhcHNlZCkgewogICAgICAgIHZhciBtaWxsaXMgPSBlbGFwc2VkOwogICAgICAgIHZhciBob3VycyA9IE1hdGguZmxvb3IobWlsbGlzIC8gKDYwICogNjAgKiAxMDAwKSk7CiAgICAgICAgbWlsbGlzIC09IGhvdXJzICogNjAgKiA2MCAqIDEwMDA7CiAgICAgICAgdmFyIG1pbnV0ZXMgPSBNYXRoLmZsb29yKG1pbGxpcyAvICg2MCAqIDEwMDApKTsKICAgICAgICBtaWxsaXMgLT0gbWludXRlcyAqIDYwICogMTAwMDsKICAgICAgICB2YXIgc2Vjb25kcyA9IE1hdGguZmxvb3IobWlsbGlzIC8gMTAwMCk7CiAgICAgICAgbWlsbGlzIC09IHNlY29uZHMgKiAxMDAwOwogICAgICAgIHJldHVybiBmb3JtYXRUaW1lKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXMpOwogICAgfQogICAgZnVuY3Rpb24gcGFkVG8obnVtYmVyLCBsZW4pIHsKICAgICAgICB2YXIgbnVtU3RyaW5nID0gbnVtYmVyICsgIiI7CiAgICAgICAgd2hpbGUgKG51bVN0cmluZy5sZW5ndGggPCBsZW4pIG51bVN0cmluZyA9ICIwIiArIG51bVN0cmluZzsKICAgICAgICByZXR1cm4gbnVtU3RyaW5nOwogICAgfQogICAgZnVuY3Rpb24gdGltZXN0YW1wKG1pbGxpcykgewogICAgICAgIC8vIHVzZWQgYWxzbyBieSB0b29scyB0aGF0IGRvIG5vdCBzZXQgd2luZG93Lm91dHB1dC5iYXNlTWlsbGlzCiAgICAgICAgdmFyIGJhc2UgPSB3aW5kb3cub3V0cHV0ID8gd2luZG93Lm91dHB1dC5iYXNlTWlsbGlzIDogMDsKICAgICAgICByZXR1cm4gbmV3IERhdGUoYmFzZSArIG1pbGxpcyk7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVHZW5lcmF0ZWRTdHJpbmcodGltZXN0YW1wKSB7CiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh0aW1lc3RhbXApOwogICAgICAgIHZhciBkdCA9IGRhdGVUaW1lRnJvbURhdGUoZGF0ZSkuc2xpY2UoMCwgMTcpOyAgLy8gZHJvcCBtaWxsaXMKICAgICAgICB2YXIgb2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpOwogICAgICAgIHZhciBzaWduID0gb2Zmc2V0ID4gMCA/ICctJyA6ICcrJzsKICAgICAgICB2YXIgaGggPSBNYXRoLmZsb29yKE1hdGguYWJzKG9mZnNldCkgLyA2MCk7CiAgICAgICAgdmFyIG1tID0gTWF0aC5hYnMob2Zmc2V0KSAlIDYwOwogICAgICAgIHJldHVybiBkdCArICcgVVRDJyArIHNpZ24gKyBwYWRUbyhoaCwgMikgKyAnOicgKyBwYWRUbyhtbSwgMik7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmcodGltZXN0YW1wKSB7CiAgICAgICAgZnVuY3Rpb24gdGltZVN0cmluZyh0aW1lLCBzaG9ydFVuaXQpIHsKICAgICAgICAgICAgdmFyIHVuaXQgPSB7eTogJ3llYXInLCBkOiAnZGF5JywgaDogJ2hvdXInLCBtOiAnbWludXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgczogJ3NlY29uZCd9W3Nob3J0VW5pdF07CiAgICAgICAgICAgIHZhciBlbmQgPSB0aW1lID09IDEgPyAnICcgOiAncyAnOwogICAgICAgICAgICByZXR1cm4gdGltZSArICcgJyArIHVuaXQgKyBlbmQ7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNvbXBlbnNhdGVMZWFwWWVhcnMoZGF5cywgeWVhcnMpIHsKICAgICAgICAgICAgLy8gTm90IGEgcGVyZmVjdCBhbGdvcml0aG0gYnV0IG91Z2h0IHRvIGJlIGVub3VnaAogICAgICAgICAgICByZXR1cm4gZGF5cyAtIE1hdGguZmxvb3IoeWVhcnMgLyA0KTsKICAgICAgICB9CiAgICAgICAgdmFyIGdlbmVyYXRlZCA9IE1hdGgucm91bmQodGltZXN0YW1wIC8gMTAwMCk7CiAgICAgICAgdmFyIGN1cnJlbnQgPSBNYXRoLnJvdW5kKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCk7CiAgICAgICAgdmFyIGVsYXBzZWQgPSBjdXJyZW50IC0gZ2VuZXJhdGVkOwogICAgICAgIHZhciBwcmVmaXggPSAnJzsKICAgICAgICBpZiAoZWxhcHNlZCA8IDApIHsKICAgICAgICAgICAgcHJlZml4ID0gJy0gJzsKICAgICAgICAgICAgZWxhcHNlZCA9IE1hdGguYWJzKGVsYXBzZWQpOwogICAgICAgIH0KICAgICAgICB2YXIgc2VjcyAgPSBlbGFwc2VkICUgNjA7CiAgICAgICAgdmFyIG1pbnMgID0gTWF0aC5mbG9vcihlbGFwc2VkIC8gNjApICUgNjA7CiAgICAgICAgdmFyIGhvdXJzID0gTWF0aC5mbG9vcihlbGFwc2VkIC8gKDYwKjYwKSkgJSAyNDsKICAgICAgICB2YXIgZGF5cyAgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyAoNjAqNjAqMjQpKSAlIDM2NTsKICAgICAgICB2YXIgeWVhcnMgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyAoNjAqNjAqMjQqMzY1KSk7CiAgICAgICAgaWYgKHllYXJzKSB7CiAgICAgICAgICAgIGRheXMgPSBjb21wZW5zYXRlTGVhcFllYXJzKGRheXMsIHllYXJzKTsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoeWVhcnMsICd5JykgKyB0aW1lU3RyaW5nKGRheXMsICdkJyk7CiAgICAgICAgfSBlbHNlIGlmIChkYXlzKSB7CiAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyB0aW1lU3RyaW5nKGRheXMsICdkJykgKyB0aW1lU3RyaW5nKGhvdXJzLCAnaCcpOwogICAgICAgIH0gZWxzZSBpZiAoaG91cnMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoaG91cnMsICdoJykgKyB0aW1lU3RyaW5nKG1pbnMsICdtJyk7CiAgICAgICAgfSBlbHNlIGlmIChtaW5zKSB7CiAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyB0aW1lU3RyaW5nKG1pbnMsICdtJykgKyB0aW1lU3RyaW5nKHNlY3MsICdzJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoc2VjcywgJ3MnKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nKHF1ZXJ5KSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICAgIGlmICghcXVlcnkpCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgdmFyIHBhcmFtcyA9IHF1ZXJ5LnNwbGl0KCcmJyk7CiAgICAgICAgdmFyIHBhcnRzOwogICAgICAgIGZ1bmN0aW9uIGRlY29kZShpdGVtKSB7CiAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoaXRlbS5yZXBsYWNlKCcrJywgJyAnKSk7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYXJhbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgcGFydHMgPSBwYXJhbXNbaV0uc3BsaXQoJz0nKTsKICAgICAgICAgICAgcmVzdWx0W2RlY29kZShwYXJ0cy5zaGlmdCgpKV0gPSBkZWNvZGUocGFydHMuam9pbignPScpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgbWFwOiBtYXAsCiAgICAgICAgZmlsdGVyOiBmaWx0ZXIsCiAgICAgICAgYWxsOiBhbGwsCiAgICAgICAgYW55OiBhbnksCiAgICAgICAgY29udGFpbnM6IGNvbnRhaW5zLAogICAgICAgIGxhc3Q6IGxhc3QsCiAgICAgICAgZXNjYXBlOiBlc2NhcGUsCiAgICAgICAgdW5lc2NhcGU6IHVuZXNjYXBlLAogICAgICAgIG5vcm1hbGl6ZTogbm9ybWFsaXplLAogICAgICAgIHJlZ2V4cEVzY2FwZTogcmVnZXhwRXNjYXBlLAogICAgICAgIE1hdGNoZXI6IE1hdGNoZXIsCiAgICAgICAgZm9ybWF0UGFyZW50TmFtZTogZm9ybWF0UGFyZW50TmFtZSwKICAgICAgICB0aW1lRnJvbURhdGU6IHRpbWVGcm9tRGF0ZSwKICAgICAgICBkYXRlRnJvbURhdGU6IGRhdGVGcm9tRGF0ZSwKICAgICAgICBkYXRlVGltZUZyb21EYXRlOiBkYXRlVGltZUZyb21EYXRlLAogICAgICAgIGZvcm1hdEVsYXBzZWQ6IGZvcm1hdEVsYXBzZWQsCiAgICAgICAgdGltZXN0YW1wOiB0aW1lc3RhbXAsCiAgICAgICAgY3JlYXRlR2VuZXJhdGVkU3RyaW5nOiBjcmVhdGVHZW5lcmF0ZWRTdHJpbmcsCiAgICAgICAgY3JlYXRlR2VuZXJhdGVkQWdvU3RyaW5nOiBjcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmcsCiAgICAgICAgcGFyc2VRdWVyeVN0cmluZzogcGFyc2VRdWVyeVN0cmluZwogICAgfTsKfSgpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cudGVzdGRhdGEgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgZWxlbWVudHNCeUlkID0ge307CiAgICB2YXIgaWRDb3VudGVyID0gMDsKICAgIHZhciBfc3RhdGlzdGljcyA9IG51bGw7CiAgICB2YXIgTEVWRUxTID0gWydUUkFDRScsICdERUJVRycsICdJTkZPJywgJ1dBUk4nLCAnRVJST1InLCAnRkFJTCcsICdTS0lQJ107CiAgICB2YXIgU1RBVFVTRVMgPSBbJ0ZBSUwnLCAnUEFTUycsICdTS0lQJywgJ05PVCBSVU4nXTsKICAgIHZhciBLRVlXT1JEX1RZUEVTID0gWydLRVlXT1JEJywgJ1NFVFVQJywgJ1RFQVJET1dOJywgJ0ZPUicsICdWQVInLCAnSUYnLCAnRUxTRSBJRicsICdFTFNFJ107CiAgICB2YXIgTUVTU0FHRV9UWVBFID0gODsKICAgIGZ1bmN0aW9uIGFkZEVsZW1lbnQoZWxlbSkgewogICAgICAgIGlmICghZWxlbS5pZCkKICAgICAgICAgICAgZWxlbS5pZCA9IHVuaXF1ZUlkKCk7CiAgICAgICAgZWxlbWVudHNCeUlkW2VsZW0uaWRdID0gZWxlbTsKICAgICAgICByZXR1cm4gZWxlbTsKICAgIH0KICAgIGZ1bmN0aW9uIHVuaXF1ZUlkKCkgewogICAgICAgIGlkQ291bnRlcisrOwogICAgICAgIHJldHVybiAnZWxlbWVudC1pZC0nICsgaWRDb3VudGVyOwogICAgfQogICAgZnVuY3Rpb24gdGltZXMoc3RhdHMpIHsKICAgICAgICB2YXIgc3RhcnRNaWxsaXMgPSBzdGF0c1sxXTsKICAgICAgICB2YXIgZWxhcHNlZCA9IHN0YXRzWzJdOwogICAgICAgIGlmIChzdGFydE1pbGxpcyA9PT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBudWxsLCBlbGFwc2VkXTsKICAgICAgICByZXR1cm4gW3V0aWwudGltZXN0YW1wKHN0YXJ0TWlsbGlzKSwKICAgICAgICAgICAgICAgIHV0aWwudGltZXN0YW1wKHN0YXJ0TWlsbGlzICsgZWxhcHNlZCksCiAgICAgICAgICAgICAgICBlbGFwc2VkXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2UoZWxlbWVudCwgc3RyaW5ncykgewogICAgICAgIHJldHVybiBtb2RlbC5NZXNzYWdlKExFVkVMU1tlbGVtZW50WzJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnRpbWVzdGFtcChlbGVtZW50WzFdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzLmdldChlbGVtZW50WzNdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzLmdldChlbGVtZW50WzRdKSk7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZVN0YXR1cyhzdGF0cykgewogICAgICAgIHJldHVybiBTVEFUVVNFU1tzdGF0c1swXV07CiAgICB9CiAgICBmdW5jdGlvbiBjaGlsZENyZWF0b3IocGFyZW50LCBjaGlsZFR5cGUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVsZW0sIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgICAgIHJldHVybiBhZGRFbGVtZW50KGNoaWxkVHlwZShwYXJlbnQsIGVsZW0sIHN0cmluZ3MsIGluZGV4KSk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUJvZHlJdGVtKHBhcmVudCwgZWxlbWVudCwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICBpZiAoZWxlbWVudFswXSA9PSBNRVNTQUdFX1RZUEUpCiAgICAgICAgICAgIHJldHVybiBjcmVhdGVNZXNzYWdlKGVsZW1lbnQsIHN0cmluZ3MpOwogICAgICAgIHJldHVybiBjcmVhdGVLZXl3b3JkKHBhcmVudCwgZWxlbWVudCwgc3RyaW5ncywgaW5kZXgpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlS2V5d29yZChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIGt3ID0gbW9kZWwuS2V5d29yZCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICB0eXBlOiBLRVlXT1JEX1RZUEVTW2VsZW1lbnRbMF1dLAogICAgICAgICAgICBpZDogJ2snICsgKGluZGV4ICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMV0pLAogICAgICAgICAgICBsaWJuYW1lOiBzdHJpbmdzLmdldChlbGVtZW50WzJdKSwKICAgICAgICAgICAgdGltZW91dDogc3RyaW5ncy5nZXQoZWxlbWVudFszXSksCiAgICAgICAgICAgIGFyZ3M6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbNV0pLAogICAgICAgICAgICBhc3NpZ246IHN0cmluZ3MuZ2V0KGVsZW1lbnRbNl0pLAogICAgICAgICAgICB0YWdzOiBzdHJpbmdzLmdldChlbGVtZW50WzddKSwKICAgICAgICAgICAgZG9jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZG9jID0gc3RyaW5ncy5nZXQoZWxlbWVudFs0XSk7CiAgICAgICAgICAgICAgICB0aGlzLmRvYyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvYzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBkb2M7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHN0YXR1czogcGFyc2VTdGF0dXMoZWxlbWVudFs4XSwgc3RyaW5ncyksCiAgICAgICAgICAgIHRpbWVzOiBtb2RlbC5UaW1lcyh0aW1lcyhlbGVtZW50WzhdKSksCiAgICAgICAgICAgIGlzQ2hpbGRyZW5Mb2FkZWQ6IHR5cGVvZihlbGVtZW50WzldKSAhPT0gJ251bWJlcicKICAgICAgICB9KTsKICAgICAgICBsYXp5UG9wdWxhdGVLZXl3b3Jkc0Zyb21GaWxlKGt3LCBlbGVtZW50WzldLCBzdHJpbmdzKTsKICAgICAgICByZXR1cm4ga3c7CiAgICB9CiAgICBmdW5jdGlvbiBsYXp5UG9wdWxhdGVLZXl3b3Jkc0Zyb21GaWxlKHBhcmVudCwgbW9kZWxPckluZGV4LCBzdHJpbmdzKSB7CiAgICAgICAgdmFyIG1vZGVsLCBpbmRleCwgcG9wdWxhdG9yOwogICAgICAgIHZhciBjcmVhdG9yID0gY2hpbGRDcmVhdG9yKHBhcmVudCwgY3JlYXRlQm9keUl0ZW0pOwogICAgICAgIGlmIChwYXJlbnQuaXNDaGlsZHJlbkxvYWRlZCkgewogICAgICAgICAgICBtb2RlbCA9IG1vZGVsT3JJbmRleDsKICAgICAgICAgICAgcG9wdWxhdG9yID0gUG9wdWxhdG9yKG1vZGVsLCBzdHJpbmdzLCBjcmVhdG9yKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbmRleCA9IG1vZGVsT3JJbmRleDsKICAgICAgICAgICAgcGFyZW50LmNoaWxkRmlsZU5hbWUgPSB3aW5kb3cuc2V0dGluZ3NbJ3NwbGl0TG9nQmFzZSddICsgJy0nICsgaW5kZXggKyAnLmpzJzsKICAgICAgICAgICAgcG9wdWxhdG9yID0gU3BsaXRMb2dQb3B1bGF0b3IoaW5kZXgsIGNyZWF0b3IpOwogICAgICAgIH0KICAgICAgICBwYXJlbnQucG9wdWxhdGVLZXl3b3Jkcyhwb3B1bGF0b3IpOwogICAgfQogICAgZnVuY3Rpb24gdGFncyh0YWdsaXN0LCBzdHJpbmdzKSB7CiAgICAgICAgcmV0dXJuIHV0aWwubWFwKHRhZ2xpc3QsIHN0cmluZ3MuZ2V0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVRlc3QocGFyZW50LCBlbGVtZW50LCBzdHJpbmdzLCBpbmRleCkgewogICAgICAgIHZhciBzdGF0dXMgPSBlbGVtZW50WzRdOwogICAgICAgIHZhciB0ZXN0ID0gbW9kZWwuVGVzdCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICBpZDogJ3QnICsgKGluZGV4ICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMF0pLAogICAgICAgICAgICBkb2M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkb2MgPSBzdHJpbmdzLmdldChlbGVtZW50WzJdKTsKICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZW91dDogc3RyaW5ncy5nZXQoZWxlbWVudFsxXSksCiAgICAgICAgICAgIHN0YXR1czogcGFyc2VTdGF0dXMoc3RhdHVzKSwKICAgICAgICAgICAgbWVzc2FnZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIG1zZyA9IHN0YXR1cy5sZW5ndGggPT0gNCA/IHN0cmluZ3MuZ2V0KHN0YXR1c1szXSkgOiAnJzsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1zZzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRpbWVzOiBtb2RlbC5UaW1lcyh0aW1lcyhzdGF0dXMpKSwKICAgICAgICAgICAgdGFnczogdGFncyhlbGVtZW50WzNdLCBzdHJpbmdzKSwKICAgICAgICAgICAgaXNDaGlsZHJlbkxvYWRlZDogdHlwZW9mKGVsZW1lbnRbNV0pICE9PSAnbnVtYmVyJwogICAgICAgIH0pOwogICAgICAgIGxhenlQb3B1bGF0ZUtleXdvcmRzRnJvbUZpbGUodGVzdCwgZWxlbWVudFs1XSwgc3RyaW5ncyk7CiAgICAgICAgcmV0dXJuIHRlc3Q7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVTdWl0ZShwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1cyA9IGVsZW1lbnRbNV07CiAgICAgICAgdmFyIHN1aXRlID0gbW9kZWwuU3VpdGUoewogICAgICAgICAgICBwYXJlbnQ6IHBhcmVudCwKICAgICAgICAgICAgaWQ6ICdzJyArICgoaW5kZXggfHwgMCkgKyAxKSwKICAgICAgICAgICAgbmFtZTogc3RyaW5ncy5nZXQoZWxlbWVudFswXSksCiAgICAgICAgICAgIHNvdXJjZTogc3RyaW5ncy5nZXQoZWxlbWVudFsxXSksCiAgICAgICAgICAgIHJlbGF0aXZlU291cmNlOiBzdHJpbmdzLmdldChlbGVtZW50WzJdKSwKICAgICAgICAgICAgZG9jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZG9jID0gc3RyaW5ncy5nZXQoZWxlbWVudFszXSk7CiAgICAgICAgICAgICAgICB0aGlzLmRvYyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvYzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBkb2M7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHN0YXR1czogcGFyc2VTdGF0dXMoc3RhdHVzKSwKICAgICAgICAgICAgbWVzc2FnZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIG1zZyA9IHN0YXR1cy5sZW5ndGggPT0gNCA/IHN0cmluZ3MuZ2V0KHN0YXR1c1szXSkgOiAnJzsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1zZzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRpbWVzOiBtb2RlbC5UaW1lcyh0aW1lcyhzdGF0dXMpKSwKICAgICAgICAgICAgc3RhdGlzdGljczogc3VpdGVTdGF0cyh1dGlsLmxhc3QoZWxlbWVudCkpLAogICAgICAgICAgICBtZXRhZGF0YTogcGFyc2VNZXRhZGF0YShlbGVtZW50WzRdLCBzdHJpbmdzKQogICAgICAgIH0pOwogICAgICAgIHN1aXRlLnBvcHVsYXRlS2V5d29yZHMoUG9wdWxhdG9yKGVsZW1lbnRbOF0sIHN0cmluZ3MsIGNoaWxkQ3JlYXRvcihzdWl0ZSwgY3JlYXRlS2V5d29yZCkpKTsKICAgICAgICBzdWl0ZS5wb3B1bGF0ZVRlc3RzKFBvcHVsYXRvcihlbGVtZW50WzddLCBzdHJpbmdzLCBjaGlsZENyZWF0b3Ioc3VpdGUsIGNyZWF0ZVRlc3QpKSk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVTdWl0ZXMoUG9wdWxhdG9yKGVsZW1lbnRbNl0sIHN0cmluZ3MsIGNoaWxkQ3JlYXRvcihzdWl0ZSwgY3JlYXRlU3VpdGUpKSk7CiAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VNZXRhZGF0YShkYXRhLCBzdHJpbmdzKSB7CiAgICAgICAgdmFyIG1ldGFkYXRhID0gW107CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGRhdGEubGVuZ3RoOyBpKz0yKSB7CiAgICAgICAgICAgIG1ldGFkYXRhLnB1c2goW3N0cmluZ3MuZ2V0KGRhdGFbaV0pLCBzdHJpbmdzLmdldChkYXRhW2krMV0pXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtZXRhZGF0YTsKICAgIH0KICAgIGZ1bmN0aW9uIHN1aXRlU3RhdHMoc3RhdHMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b3RhbDogc3RhdHNbMF0sCiAgICAgICAgICAgIHBhc3M6IHN0YXRzWzFdLAogICAgICAgICAgICBmYWlsOiBzdGF0c1syXSwKICAgICAgICAgICAgc2tpcDogc3RhdHNbM10KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gUG9wdWxhdG9yKGl0ZW1zLCBzdHJpbmdzLCBjcmVhdG9yKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbnVtYmVyT2ZJdGVtczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY3JlYXRvcjogZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRvcihpdGVtc1tpbmRleF0sIHN0cmluZ3MsIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBTcGxpdExvZ1BvcHVsYXRvcihzdHJ1Y3R1cmVJbmRleCwgY3JlYXRvcikgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG51bWJlck9mSXRlbXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3dbJ2tleXdvcmRzJytzdHJ1Y3R1cmVJbmRleF0ubGVuZ3RoOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjcmVhdG9yOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdG9yKHdpbmRvd1sna2V5d29yZHMnK3N0cnVjdHVyZUluZGV4XVtpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3dbJ3N0cmluZ3MnK3N0cnVjdHVyZUluZGV4XSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3VpdGUoKSB7CiAgICAgICAgdmFyIGVsZW0gPSB3aW5kb3cub3V0cHV0LnN1aXRlOwogICAgICAgIGlmIChlbGVtZW50c0J5SWRbZWxlbS5pZF0pCiAgICAgICAgICAgIHJldHVybiBlbGVtOwogICAgICAgIHZhciByb290ID0gYWRkRWxlbWVudChjcmVhdGVTdWl0ZShudWxsLCBlbGVtLCBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKSk7CiAgICAgICAgd2luZG93Lm91dHB1dC5zdWl0ZSA9IHJvb3Q7CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kTG9hZGVkKGlkKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnRzQnlJZFtpZF07CiAgICB9CiAgICBmdW5jdGlvbiBlbnN1cmVMb2FkZWQoaWQsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIGlkcyA9IGlkLnNwbGl0KCctJyk7CiAgICAgICAgdmFyIHJvb3QgPSBzdWl0ZSgpOwogICAgICAgIGlkcy5zaGlmdCgpOwogICAgICAgIGxvYWRJdGVtcyhpZHMsIHJvb3QsIFtyb290LmlkXSwgY2FsbGJhY2spOwogICAgfQogICAgZnVuY3Rpb24gbG9hZEl0ZW1zKGlkcywgY3VycmVudCwgcmVzdWx0LCBjYWxsYmFjaykgewogICAgICAgIGlmICghaWRzLmxlbmd0aCkgewogICAgICAgICAgICBjYWxsYmFjayhyZXN1bHQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQuY2FsbFdoZW5DaGlsZHJlblJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGlkID0gaWRzLnNoaWZ0KCk7CiAgICAgICAgICAgIHZhciB0eXBlID0gaWRbMF07CiAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KGlkLnN1YnN0cmluZygxKSkgLSAxOwogICAgICAgICAgICB2YXIgaXRlbSA9IHNlbGVjdEZyb20oY3VycmVudCwgdHlwZSwgaW5kZXgpOwogICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0uaWQpOwogICAgICAgICAgICBlbHNlICAgIC8vIEludmFsaWQgaWQuIFNob3VsZCB0aGlzIGJlIHJlcG9ydGVkIHNvbWV3aGVyZT8KICAgICAgICAgICAgICAgIGlkcyA9IFtdOwogICAgICAgICAgICBsb2FkSXRlbXMoaWRzLCBpdGVtLCByZXN1bHQsIGNhbGxiYWNrKTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHNlbGVjdEZyb20oZWxlbWVudCwgdHlwZSwgaW5kZXgpIHsKICAgICAgICBpZiAodHlwZSA9PT0gJ2snKSB7CiAgICAgICAgICAgIHZhciBrZXl3b3JkcyA9IHV0aWwuZmlsdGVyKGVsZW1lbnQua2V5d29yZHMoKSwgZnVuY3Rpb24gKGt3KSB7CiAgICAgICAgICAgICAgICByZXR1cm4ga3cudHlwZSAhPSAnbWVzc2FnZSc7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4ga2V5d29yZHNbaW5kZXhdOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3QnKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRlc3RzKClbaW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnN1aXRlcygpW2luZGV4XTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBlcnJvckl0ZXJhdG9yKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhZGRFbGVtZW50KGNyZWF0ZU1lc3NhZ2Uod2luZG93Lm91dHB1dC5lcnJvcnMuc2hpZnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nU3RvcmUod2luZG93Lm91dHB1dC5zdHJpbmdzKSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBoYXNOZXh0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93Lm91dHB1dC5lcnJvcnMubGVuZ3RoID4gMDsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBzdGF0aXN0aWNzKCkgewogICAgICAgIGlmICghX3N0YXRpc3RpY3MpIHsKICAgICAgICAgICAgdmFyIHN0YXREYXRhID0gd2luZG93Lm91dHB1dC5zdGF0czsKICAgICAgICAgICAgX3N0YXRpc3RpY3MgPSBzdGF0cy5TdGF0aXN0aWNzKHN0YXREYXRhWzBdLCBzdGF0RGF0YVsxXSwgc3RhdERhdGFbMl0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX3N0YXRpc3RpY3M7CiAgICB9CiAgICBmdW5jdGlvbiBTdHJpbmdTdG9yZShzdHJpbmdzKSB7CiAgICAgICAgZnVuY3Rpb24gZ2V0VGV4dChpZCkgewogICAgICAgICAgICB2YXIgdGV4dCA9IHN0cmluZ3NbaWRdOwogICAgICAgICAgICBpZiAoIXRleHQpCiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIGlmICh0ZXh0WzBdID09ICcqJykKICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZygxKTsKICAgICAgICAgICAgdmFyIGV4dHJhY3RlZCA9IGV4dHJhY3QodGV4dCk7CiAgICAgICAgICAgIHN0cmluZ3NbaWRdID0gJyonICsgZXh0cmFjdGVkOwogICAgICAgICAgICByZXR1cm4gZXh0cmFjdGVkOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBleHRyYWN0KHRleHQpIHsKICAgICAgICAgICAgdmFyIGRlY29kZWQgPSBKWEcuVXRpbC5CYXNlNjQuZGVjb2RlQXNBcnJheSh0ZXh0KTsKICAgICAgICAgICAgdmFyIGV4dHJhY3RlZCA9IChuZXcgSlhHLlV0aWwuVW56aXAoZGVjb2RlZCkpLnVuemlwKClbMF1bMF07CiAgICAgICAgICAgIHJldHVybiBKWEcuVXRpbC5VVEY4LmRlY29kZShleHRyYWN0ZWQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBnZXQoaWQpIHsKICAgICAgICAgICAgaWYgKGlkID09PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgICAgICAgcmV0dXJuIGdldFRleHQoaWQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4ge2dldDogZ2V0fTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgc3VpdGU6IHN1aXRlLAogICAgICAgIGVycm9ySXRlcmF0b3I6IGVycm9ySXRlcmF0b3IsCiAgICAgICAgZmluZExvYWRlZDogZmluZExvYWRlZCwKICAgICAgICBlbnN1cmVMb2FkZWQ6IGVuc3VyZUxvYWRlZCwKICAgICAgICBzdGF0aXN0aWNzOiBzdGF0aXN0aWNzLAogICAgICAgIFN0cmluZ1N0b3JlOiBTdHJpbmdTdG9yZSwgIC8vIGV4cG9zZWQgZm9yIHRlc3RzCiAgICAgICAgTEVWRUxTOiBMRVZFTFMKICAgIH07Cn0oKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KZnVuY3Rpb24gcmVtb3ZlSmF2YVNjcmlwdERpc2FibGVkV2FybmluZygpIHsKICAgIC8vIE5vdCB1c2luZyBqUXVlcnkgaGVyZSBmb3IgbWF4aW11bSBzcGVlZAogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2phdmFzY3JpcHQtZGlzYWJsZWQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwp9CmZ1bmN0aW9uIGFkZEphdmFTY3JpcHREaXNhYmxlZFdhcm5pbmcoZXJyb3IpIHsKICAgIGlmICh3aW5kb3cuY29uc29sZSkKICAgICAgICBjb25zb2xlLmVycm9yKCdPcGVuaW5nIGZhaWxlZDogJyArIGVycm9yLm5hbWUgKyAnOiAnICsgZXJyb3IubWVzc2FnZSk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamF2YXNjcmlwdC1kaXNhYmxlZCcpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwp9CmZ1bmN0aW9uIGluaXRMYXlvdXQoc3VpdGVOYW1lLCB0eXBlKSB7CiAgICBwYXJzZVRlbXBsYXRlcygpOwogICAgc2V0VGl0bGUoc3VpdGVOYW1lLCB0eXBlKTsKICAgIGFkZEhlYWRlcigpOwogICAgYWRkUmVwb3J0T3JMb2dMaW5rKHR5cGUpOwp9CmZ1bmN0aW9uIHBhcnNlVGVtcGxhdGVzKCkgewogICAgJCgnc2NyaXB0W3R5cGU9InRleHQveC1qcXVlcnktdG1wbCJdJykubWFwKGZ1bmN0aW9uIChpZHgsIGVsZW0pIHsKICAgICAgICAkLnRlbXBsYXRlKGVsZW0uaWQsIGVsZW0udGV4dCk7CiAgICB9KTsKfQpmdW5jdGlvbiB0ZXN0T3JUYXNrKHRleHQpIHsKICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL3soLiopfS8sIGZ1bmN0aW9uIChtYXRjaCwgZ3JvdXAsIG9mZnNldCwgc3RyaW5nKSB7CiAgICAgICAgaWYgKCF3aW5kb3cuc2V0dGluZ3MucnBhKQogICAgICAgICAgICByZXR1cm4gZ3JvdXA7CiAgICAgICAgcmV0dXJuIHsnVEVTVCc6ICdUQVNLJywgJ1Rlc3QnOiAnVGFzaycsICd0ZXN0JzogJ3Rhc2snfVtncm91cF07CiAgICB9KTsKfQpmdW5jdGlvbiBzZXRUaXRsZShzdWl0ZU5hbWUsIHR5cGUpIHsKICAgIHZhciBnaXZlblRpdGxlID0gd2luZG93LnNldHRpbmdzLnRpdGxlOwogICAgdmFyIHRpdGxlID0gZ2l2ZW5UaXRsZSA/IGdpdmVuVGl0bGUgOiBzdWl0ZU5hbWUgKyAiICIgKyB0eXBlOwogICAgZG9jdW1lbnQudGl0bGUgPSB1dGlsLnVuZXNjYXBlKHRpdGxlKTsKfQpmdW5jdGlvbiBhZGRIZWFkZXIoKSB7CiAgICB2YXIgZ2VuZXJhdGVkID0gdXRpbC50aW1lc3RhbXAod2luZG93Lm91dHB1dC5nZW5lcmF0ZWQpOwogICAgJC50bXBsKCc8aDE+JHt0aXRsZX08L2gxPicgKwogICAgICAgICAgICc8ZGl2IGlkPSJnZW5lcmF0ZWQiPicgKwogICAgICAgICAgICAgJzxzcGFuPkdlbmVyYXRlZDxicj4ke2dlbmVyYXRlZH08L3NwYW4+PGJyPicgKwogICAgICAgICAgICAgJzxzcGFuIGlkPSJnZW5lcmF0ZWQtYWdvIj4ke2Fnb30gYWdvPC9zcGFuPicgKwogICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAnPGRpdiBpZD0idG9wLXJpZ2h0LWhlYWRlciI+JyArCiAgICAgICAgICAgICAnPGRpdiBpZD0icmVwb3J0LW9yLWxvZy1saW5rIj48YSBocmVmPSIjIj48L2E+PC9kaXY+JyArCiAgICAgICAgICAgJzwvZGl2PicsIHsKICAgICAgICBnZW5lcmF0ZWQ6IHV0aWwuY3JlYXRlR2VuZXJhdGVkU3RyaW5nKGdlbmVyYXRlZCksCiAgICAgICAgYWdvOiB1dGlsLmNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZyhnZW5lcmF0ZWQpLAogICAgICAgIHRpdGxlOiBkb2N1bWVudC50aXRsZQogICAgfSkuYXBwZW5kVG8oJCgnI2hlYWRlcicpKTsKfQpmdW5jdGlvbiBhZGRSZXBvcnRPckxvZ0xpbmsobXlUeXBlKSB7CiAgICB2YXIgdXJsOwogICAgdmFyIHRleHQ7CiAgICB2YXIgY29udGFpbmVyID0gJCgnI3JlcG9ydC1vci1sb2ctbGluaycpOwogICAgaWYgKG15VHlwZSA9PSAnUmVwb3J0JykgewogICAgICAgIHVybCA9IHdpbmRvdy5zZXR0aW5ncy5sb2dVUkw7CiAgICAgICAgdGV4dCA9ICdMT0cnOwogICAgfSBlbHNlIHsKICAgICAgICB1cmwgPSB3aW5kb3cuc2V0dGluZ3MucmVwb3J0VVJMOwogICAgICAgIHRleHQgPSAnUkVQT1JUJzsKICAgIH0KICAgIGlmICh1cmwpIHsKICAgICAgICBjb250YWluZXIuZmluZCgnYScpLmF0dHIoJ2hyZWYnLCB1cmwpOwogICAgICAgIGNvbnRhaW5lci5maW5kKCdhJykudGV4dCh0ZXh0KTsKICAgIH0gZWxzZSB7CiAgICAgICAgY29udGFpbmVyLnJlbW92ZSgpOwogICAgfQp9CmZ1bmN0aW9uIGFkZFN0YXRpc3RpY3MoKSB7CiAgICB2YXIgc3RhdEhlYWRlcnMgPQogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij5Ub3RhbDwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPlBhc3M8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij5GYWlsPC90aD4nICsKICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+U2tpcDwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLWVsYXBzZWQiPkVsYXBzZWQ8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+UGFzcyAvIEZhaWwgLyBTa2lwPC90aD4nOwogICAgdmFyIHN0YXRUYWJsZSA9CiAgICAgICAgJzxoMj57VGVzdH0gU3RhdGlzdGljczwvaDI+JyArCiAgICAgICAgJzx0YWJsZSBjbGFzcz0ic3RhdGlzdGljcyIgaWQ9InRvdGFsLXN0YXRzIj48dGhlYWQ+PHRyPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1uYW1lIj5Ub3RhbCBTdGF0aXN0aWNzPC90aD4nICsgc3RhdEhlYWRlcnMgKwogICAgICAgICc8L3RyPjwvdGhlYWQ+PC90YWJsZT4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0idGFnLXN0YXRzIj48dGhlYWQ+PHRyPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1uYW1lIj5TdGF0aXN0aWNzIGJ5IFRhZzwvdGg+JyArIHN0YXRIZWFkZXJzICsKICAgICAgICAnPC90cj48L3RoZWFkPjwvdGFibGU+JyArCiAgICAgICAgJzx0YWJsZSBjbGFzcz0ic3RhdGlzdGljcyIgaWQ9InN1aXRlLXN0YXRzIj48dGhlYWQ+PHRyPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1uYW1lIj5TdGF0aXN0aWNzIGJ5IFN1aXRlPC90aD4nICsgc3RhdEhlYWRlcnMgKwogICAgICAgICc8L3RyPjwvdGhlYWQ+PC90YWJsZT4nOwogICAgJCh0ZXN0T3JUYXNrKHN0YXRUYWJsZSkpLmFwcGVuZFRvKCcjc3RhdGlzdGljcy1jb250YWluZXInKTsKICAgIHV0aWwubWFwKFsndG90YWwnLCAndGFnJywgJ3N1aXRlJ10sIGFkZFN0YXRUYWJsZSk7CiAgICBhZGRUb29sdGlwc1RvRWxhcHNlZFRpbWVzKCk7CiAgICBlbmFibGVTdGF0aXN0aWNzU29ydGVyKCk7Cn0KZnVuY3Rpb24gYWRkVG9vbHRpcHNUb0VsYXBzZWRUaW1lcygpIHsKICAgICQoJy5zdGF0cy1jb2wtZWxhcHNlZCcpLmF0dHIoJ3RpdGxlJywKICAgICAgICB0ZXN0T3JUYXNrKCdUb3RhbCBleGVjdXRpb24gdGltZSBvZiB0aGVzZSB7dGVzdH1zLiAnKSArCiAgICAgICAgJ0V4Y2x1ZGVzIHN1aXRlIHNldHVwcyBhbmQgdGVhcmRvd25zLicpOwogICAgJCgnI3N1aXRlLXN0YXRzJykuZmluZCgnLnN0YXRzLWNvbC1lbGFwc2VkJykuYXR0cigndGl0bGUnLAogICAgICAgICdUb3RhbCBleGVjdXRpb24gdGltZSBvZiB0aGlzIHN1aXRlLicpOwp9CmZ1bmN0aW9uIGVuYWJsZVN0YXRpc3RpY3NTb3J0ZXIoKSB7CiAgICAkLnRhYmxlc29ydGVyLmFkZFBhcnNlcih7CiAgICAgICAgaWQ6ICdzdGF0TmFtZScsCiAgICAgICAgdHlwZTogJ251bWVyaWMnLAogICAgICAgIGlzOiBmdW5jdGlvbihzKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIGRvIG5vdCBhdXRvLWRldGVjdAogICAgICAgIH0sCiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbihzdHJpbmcsIHRhYmxlLCBjZWxsLCBjZWxsSW5kZXgpIHsKICAgICAgICAgICAgLy8gUm93cyBoYXZlIGNsYXNzIGluIGZvcm1hdCAncm93LTxpbmRleD4nLgogICAgICAgICAgICB2YXIgaW5kZXggPSAkKGNlbGwpLnBhcmVudCgpLmF0dHIoJ2NsYXNzJykuc3Vic3RyaW5nKDQpOwogICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoaW5kZXgpOwogICAgICAgIH0KICAgIH0pOwogICAgJCgiLnN0YXRpc3RpY3MiKS50YWJsZXNvcnRlcih7CiAgICAgICAgc29ydEluaXRpYWxPcmRlcjogJ2Rlc2MnLAogICAgICAgIGhlYWRlcnM6IHswOiB7c29ydGVyOiAnc3RhdE5hbWUnLCBzb3J0SW5pdGlhbE9yZGVyOiAnYXNjJ30sCiAgICAgICAgICAgICAgICAgIDY6IHtzb3J0ZXI6IGZhbHNlfX0KICAgIH0pOwp9CmZ1bmN0aW9uIGFkZFN0YXRUYWJsZSh0YWJsZU5hbWUpIHsKICAgIHZhciBzdGF0cyA9IHdpbmRvdy50ZXN0ZGF0YS5zdGF0aXN0aWNzKClbdGFibGVOYW1lXTsKICAgIGlmICh0YWJsZU5hbWUgPT0gJ3RhZycgJiYgc3RhdHMubGVuZ3RoID09IDApIHsKICAgICAgICByZW5kZXJOb1RhZ1N0YXRUYWJsZSgpOwogICAgfSBlbHNlIHsKICAgICAgICByZW5kZXJTdGF0VGFibGUodGFibGVOYW1lLCBzdGF0cyk7CiAgICB9Cn0KZnVuY3Rpb24gcmVuZGVyTm9UYWdTdGF0VGFibGUoKSB7CiAgICAkKCc8dGJvZHk+PHRyIGNsYXNzPSJyb3ctMCI+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPk5vIFRhZ3M8L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij48L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij48L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij48L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij48L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1lbGFwc2VkIj48L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+JyArCiAgICAgICAgICAnPGRpdiBjbGFzcz0iZW1wdHktZ3JhcGgiPjwvZGl2PicgKwogICAgICAgICc8L3RkPicgKwogICAgICAnPC90cj48L3Rib2R5PicpLmFwcGVuZFRvKCcjdGFnLXN0YXRzJyk7Cn0KZnVuY3Rpb24gcmVuZGVyU3RhdFRhYmxlKHRhYmxlTmFtZSwgc3RhdHMpIHsKICAgIHZhciB0ZW1wbGF0ZSA9IHRhYmxlTmFtZSArICdTdGF0aXN0aWNzUm93VGVtcGxhdGUnOwogICAgdmFyIHRib2R5ID0gJCgnPHRib2R5PjwvdGJvZHk+Jyk7CiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3RhdHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAkLnRtcGwodGVtcGxhdGUsIHN0YXRzW2ldLCB7aW5kZXg6IGl9KS5hcHBlbmRUbyh0Ym9keSk7CiAgICB9CiAgICB0Ym9keS5hcHBlbmRUbygnIycgKyB0YWJsZU5hbWUgKyAnLXN0YXRzJyk7Cn0KJC50ZW1wbGF0ZSgnc3RhdENvbHVtbnNUZW1wbGF0ZScsCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+JHt0b3RhbH08L3RkPicgKwogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPiR7cGFzc308L3RkPicgKwogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPiR7ZmFpbH08L3RkPicgKwogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPiR7c2tpcH08L3RkPicgKwogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLWVsYXBzZWQiPiR7ZWxhcHNlZH08L3RkPicgKwogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLWdyYXBoIj4nICsKICAgICAgJ3t7aWYgdG90YWx9fScgKwogICAgICAnPGRpdiBjbGFzcz0iZ3JhcGgiPicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJwYXNzLWJhciIgc3R5bGU9IndpZHRoOiAke3Bhc3NXaWR0aH0lIiB0aXRsZT0iJHtwYXNzUGVyY2VudH0lIj48L2Rpdj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0iZmFpbC1iYXIiIHN0eWxlPSJ3aWR0aDogJHtmYWlsV2lkdGh9JSIgdGl0bGU9IiR7ZmFpbFBlcmNlbnR9JSI+PC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InNraXAtYmFyIiBzdHlsZT0id2lkdGg6ICR7c2tpcFdpZHRofSUiIHRpdGxlPSIke3NraXBQZXJjZW50fSUiPjwvZGl2PicgKwogICAgICAnPC9kaXY+JyArCiAgICAgICd7e2Vsc2V9fScgKwogICAgICAnPGRpdiBjbGFzcz0iZW1wdHktZ3JhcGgiPjwvZGl2PicgKwogICAgICAne3svaWZ9fScgKwogICAgJzwvdGQ+JwopOwokLnRlbXBsYXRlKCdzdWl0ZVN0YXR1c01lc3NhZ2VUZW1wbGF0ZScsCiAgICAnJHt0b3RhbH0ge3s9IHRlc3RPclRhc2soInt0ZXN0fSIpfX17e2lmIHRvdGFsICE9IDF9fXN7ey9pZn19IHRvdGFsLCAnICsKICAgICcke3Bhc3N9IHBhc3NlZCwgJHtmYWlsfSBmYWlsZWQsICR7c2tpcH0gc2tpcHBlZCcKKTsKLy8gRm9yIGNvbXBsZXRlIGNyb3NzLWJyb3dzZXIgZXhwZXJpZW5jZS4uCi8vIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX29yZGVyLmh0bWwKZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGV2ZW50KSB7CiAgICB2YXIgZXZlbnQgPSBldmVudCB8fCB3aW5kb3cuZXZlbnQ7CiAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwogICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikKICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKfQo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpzdG9yYWdlID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHByZWZpeCA9ICdyb2JvdC1mcmFtZXdvcmstJzsKICAgIHZhciBzdG9yYWdlOwogICAgZnVuY3Rpb24gaW5pdCh1c2VyKSB7CiAgICAgICAgcHJlZml4ICs9IHVzZXIgKyAnLSc7CiAgICAgICAgc3RvcmFnZSA9IGdldFN0b3JhZ2UoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFN0b3JhZ2UoKSB7CiAgICAgICAgLy8gVXNlIGxvY2FsU3RvcmFnZSBpZiBpdCdzIGFjY2Vzc2libGUsIG5vcm1hbCBvYmplY3Qgb3RoZXJ3aXNlLgogICAgICAgIC8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExMjE0NDA0CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0ocHJlZml4LCBwcmVmaXgpOwogICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShwcmVmaXgpOwogICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlOwogICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZ2V0KG5hbWUsIGRlZmF1bHRWYWx1ZSkgewogICAgICAgIHZhciB2YWx1ZSA9IHN0b3JhZ2VbcHJlZml4ICsgbmFtZV07CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogICAgZnVuY3Rpb24gc2V0KG5hbWUsIHZhbHVlKSB7CiAgICAgICAgc3RvcmFnZVtwcmVmaXggKyBuYW1lXSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIHtpbml0OiBpbml0LCBnZXQ6IGdldCwgc2V0OiBzZXR9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXQgPSB7fTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3VpdGUiXSA9IFsxLDIsMywwLFtdLFsxLDAsNTg4OV0sW10sW1s0LDAsMCxbXSxbMSwyMDMsNTM0MV0sW11dXSxbXSxbMSwxLDAsMF1dOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJzdHJpbmdzIl0gPSBbXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3RyaW5ncyJdID0gd2luZG93Lm91dHB1dFsic3RyaW5ncyJdLmNvbmNhdChbIioiLCIqSnVweXRlciIsIiovaG9tZS9kYXRha3VycmUvV29yay9naXRodWIvcm9ib3RzLWZyb20tanVweXRlci9yb2JvdGtlcm5lbC9leGFtcGxlcyIsIiouLi8uLi8uLi8uLi9ob21lL2RhdGFrdXJyZS9Xb3JrL2dpdGh1Yi9yb2JvdHMtZnJvbS1qdXB5dGVyL3JvYm90a2VybmVsL2V4YW1wbGVzIiwiKlNob3cgdGhlIG5ldyBSb2JvdCBGcmFtZXdvcmsgbG9nbyJdKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3RhdHMiXSA9IFtbeyJlbGFwc2VkIjoiMDA6MDA6MDUiLCJmYWlsIjowLCJsYWJlbCI6IkFsbCBUZXN0cyIsInBhc3MiOjEsInNraXAiOjB9XSxbXSxbeyJlbGFwc2VkIjoiMDA6MDA6MDYiLCJmYWlsIjowLCJpZCI6InMxIiwibGFiZWwiOiJKdXB5dGVyIiwibmFtZSI6Ikp1cHl0ZXIiLCJwYXNzIjoxLCJza2lwIjowfV1dOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJiYXNlTWlsbGlzIl0gPSAxNjQ1MzQ5ODQxODYxOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJnZW5lcmF0ZWQiXSA9IDU5MDE7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbImV4cGFuZF9rZXl3b3JkcyJdID0gbnVsbDsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LnNldHRpbmdzID0geyJiYWNrZ3JvdW5kIjp7ImZhaWwiOiIjZjY2IiwicGFzcyI6IiM5ZTkiLCJza2lwIjoiI2ZlZDg0ZiJ9LCJsb2dVUkwiOm51bGwsInJwYSI6ZmFsc2UsInRpdGxlIjoiIn07Cjwvc2NyaXB0Pgo8dGl0bGU+PC90aXRsZT4KPC9oZWFkPgo8Ym9keT4KPGRpdiBpZD0iamF2YXNjcmlwdC1kaXNhYmxlZCI+CiAgPGgxPk9wZW5pbmcgUm9ib3QgRnJhbWV3b3JrIHJlcG9ydCBmYWlsZWQ8L2gxPgogIDx1bD4KICAgIDxsaT5WZXJpZnkgdGhhdCB5b3UgaGF2ZSA8Yj5KYXZhU2NyaXB0IGVuYWJsZWQ8L2I+IGluIHlvdXIgYnJvd3Nlci48L2xpPgogICAgPGxpPk1ha2Ugc3VyZSB5b3UgYXJlIHVzaW5nIGEgPGI+bW9kZXJuIGVub3VnaCBicm93c2VyPC9iPi4gSWYgdXNpbmcgSW50ZXJuZXQgRXhwbG9yZXIsIHZlcnNpb24gMTEgaXMgcmVxdWlyZWQuPC9saT4KICAgIDxsaT5DaGVjayBhcmUgdGhlcmUgbWVzc2FnZXMgaW4geW91ciBicm93c2VyJ3MgPGI+SmF2YVNjcmlwdCBlcnJvciBsb2c8L2I+LiBQbGVhc2UgcmVwb3J0IHRoZSBwcm9ibGVtIGlmIHlvdSBzdXNwZWN0IHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnLjwvbGk+CiAgPC91bD4KPC9kaXY+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5yZW1vdmVKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKCk7PC9zY3JpcHQ+Cgo8ZGl2IGlkPSJoZWFkZXIiPjwvZGl2Pgo8ZGl2IGlkPSJzdGF0aXN0aWNzLWNvbnRhaW5lciI+PC9kaXY+CjxkaXYgaWQ9InRlc3QtZGV0YWlscy1jb250YWluZXIiPjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7CiAgICB0cnkgewogICAgICAgIHZhciB0b3BzdWl0ZSA9IHdpbmRvdy50ZXN0ZGF0YS5zdWl0ZSgpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBhZGRKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKGVycm9yKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICB3aW5kb3cucHJldkxvY2F0aW9uSGFzaCA9ICcnOwogICAgc2V0QmFja2dyb3VuZCh0b3BzdWl0ZSk7CiAgICBpbml0TGF5b3V0KHRvcHN1aXRlLm5hbWUsICdSZXBvcnQnKTsKICAgIHN0b3JhZ2UuaW5pdCgncmVwb3J0Jyk7CiAgICBhZGRTdW1tYXJ5KHRvcHN1aXRlKTsKICAgIGFkZFN0YXRpc3RpY3MoKTsKICAgIGFkZERldGFpbHMoKTsKICAgIHdpbmRvdy5vbmhhc2hjaGFuZ2UgPSBzaG93RGV0YWlsc0J5SGFzaDsKfSk7CgpmdW5jdGlvbiBzZXRCYWNrZ3JvdW5kKHRvcHN1aXRlKSB7CiAgICB2YXIgY29sb3I7CiAgICBpZiAodG9wc3VpdGUuZmFpbCkKICAgICAgICBjb2xvciA9IHdpbmRvdy5zZXR0aW5ncy5iYWNrZ3JvdW5kLmZhaWw7CiAgICBlbHNlIGlmICh0b3BzdWl0ZS5wYXNzKQogICAgICAgIGNvbG9yID0gd2luZG93LnNldHRpbmdzLmJhY2tncm91bmQucGFzczsKICAgIGVsc2UKICAgICAgICBjb2xvciA9IHdpbmRvdy5zZXR0aW5ncy5iYWNrZ3JvdW5kLnNraXA7CiAgICAkKCdib2R5JykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgY29sb3IpOwp9CgpmdW5jdGlvbiBhZGRTdW1tYXJ5KHRvcHN1aXRlKSB7CiAgICB2YXIgb3B0cyA9IHtsb2dVUkw6IHdpbmRvdy5zZXR0aW5ncy5sb2dVUkx9OwogICAgJC50bXBsKCdzdW1tYXJ5VGFibGVUZW1wbGF0ZScsIHRvcHN1aXRlLCBvcHRzKS5pbnNlcnRBZnRlcigkKCcjaGVhZGVyJykpOwp9CgpmdW5jdGlvbiBhZGREZXRhaWxzKCkgewogICAgYWRkQ3VzdG9tU29ydGVyc0ZvckRldGFpbHMoKTsKICAgIGlmICh3aW5kb3cubG9jYXRpb24uaGFzaCkKICAgICAgICBzaG93RGV0YWlsc0J5SGFzaCgpOwogICAgZWxzZQogICAgICAgIHJlbmRlclNlYXJjaFNlbGVjdG9yKCk7Cn0KCmZ1bmN0aW9uIGFkZEN1c3RvbVNvcnRlcnNGb3JEZXRhaWxzKCkgewogICAgJC50YWJsZXNvcnRlci5hZGRQYXJzZXIoewogICAgICAgIGlkOiAnc3RhdHVzJywKICAgICAgICB0eXBlOiAnbnVtZXJpYycsCiAgICAgICAgaXM6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZG8gbm90IGF1dG8tZGV0ZWN0CiAgICAgICAgfSwKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHsnRkFJTCc6IC0xLCAnU0tJUCc6IDAsICdQQVNTJzogMX1bc107CiAgICAgICAgfQogICAgfSk7CiAgICAkLnRhYmxlc29ydGVyLmFkZFBhcnNlcih7CiAgICAgICAgaWQ6ICd0aW1lcycsCiAgICAgICAgdHlwZTogJ3RleHQnLAogICAgICAgIGlzOiBmdW5jdGlvbihzKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIGRvIG5vdCBhdXRvLWRldGVjdAogICAgICAgIH0sCiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbihzKSB7CiAgICAgICAgICAgIHJldHVybiBzLnN1YnN0cmluZygwLCAyMSk7ICAvLyByZXR1cm4gb25seSBzdGFydCB0aW1lCiAgICAgICAgfQogICAgfSk7Cn0KCmZ1bmN0aW9uIHNob3dEZXRhaWxzQnlIYXNoKCkgewogICAgLy8gQ2Fubm90IHVzZSB3aW5kb3cubG9jYXRpb24uaGFzaCBiZWNhdXNlIEZpcmVmb3ggaW5jb3JyZWN0bHkgZGVjb2RlcyBpdDoKICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTcwMzU1Mi9lbmNvZGluZy1vZi13aW5kb3ctbG9jYXRpb24taGFzaAogICAgdmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnIycpLnNsaWNlKDEpLmpvaW4oJyMnKTsKICAgIGlmICghaGFzaCB8fCBoYXNoID09IHdpbmRvdy5wcmV2TG9jYXRpb25IYXNoKQogICAgICAgIHJldHVybjsKICAgIHZhciBwYXJ0cyA9IGhhc2guc3BsaXQoJz8nKTsKICAgIHZhciBuYW1lID0gcGFydHMuc2hpZnQoKTsKICAgIHZhciBxdWVyeSA9IHBhcnRzLmpvaW4oJz8nKTsKICAgIGlmIChuYW1lID09ICdzZWFyY2gnKSB7CiAgICAgICAgdmFyIHBhcmFtcyA9IHV0aWwucGFyc2VRdWVyeVN0cmluZyhxdWVyeSk7CiAgICAgICAgc2VhcmNoRXhlY3V0ZWQocGFyYW1zLnN1aXRlIHx8ICcnLCBwYXJhbXMudGVzdCB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuaW5jbHVkZSB8fCAnJywgcGFyYW1zLmV4Y2x1ZGUgfHwgJycpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHF1ZXJ5ID0gZGVjb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KTsKICAgIHZhciBhY3Rpb24gPSB7J3RvdGFscyc6IHRvdGFsRGV0YWlsU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICAgICd0YWdzJzogICB0YWdEZXRhaWxTZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgJ3N1aXRlcyc6IHN1aXRlRGV0YWlsU2VsZWN0ZWR9W25hbWVdOwogICAgaWYgKGFjdGlvbikKICAgICAgICBhY3Rpb24ocXVlcnkpOwp9CgpmdW5jdGlvbiB0b3RhbERldGFpbFNlbGVjdGVkKCkgewogICAgcmVuZGVyVG90YWxTZWxlY3RvcigpOwogICAgc2Nyb2xsVG9TZWxlY3RvcigndG90YWxzJywgbmFtZSk7Cn0KCmZ1bmN0aW9uIHJlbmRlclRvdGFsU2VsZWN0b3IoKSB7CiAgICB2YXIgYXJncyA9IHtsaW5rVGFyZ2V0OiAndG90YWxzJywKICAgICAgICAgICAgICAgIHRvdGFsVGFiU3RhdHVzOiAnZGV0YWlsLXRhYi1zZWxlY3RlZCd9OwogICAgcmVuZGVyU2VsZWN0b3IoYXJncywgJ3RvdGFsRGV0YWlsc1NlbGVjdG9yVGVtcGxhdGUnKTsKICAgIHVwZGF0ZVByaW50U2VsZWN0b3IodGVzdE9yVGFzaygnQWxsIHtUZXN0fXMnKSk7CiAgICByZW5kZXJUb3RhbERldGFpbHMoKTsKfQoKZnVuY3Rpb24gcmVuZGVyVG90YWxEZXRhaWxzKCkgewogICAgdmFyIHN0YXQgPSB3aW5kb3cudGVzdGRhdGEuc3RhdGlzdGljcygpLnRvdGFsWzBdOwogICAgdmFyIHRlc3RzID0gd2luZG93LnRlc3RkYXRhLnN1aXRlKCkuYWxsVGVzdHMoKS5zb3J0KHNvcnRCeVN0YXR1cykKICAgIHN0YXQudG90YWxUaW1lID0gY2FsY3VsYXRlVG90YWxUaW1lKHRlc3RzKTsKICAgICQudG1wbCgndGFnT3JUb3RhbERldGFpbHNUZW1wbGF0ZScsIHN0YXQpLmFwcGVuZFRvKCcjZGV0YWlscy1oZWFkZXInKTsKICAgIGRyYXdUZXN0RGV0YWlsc1RhYmxlKHRlc3RzLCB0cnVlKTsKfQoKZnVuY3Rpb24gdXBkYXRlUHJpbnRTZWxlY3RvcihuYW1lLCBpbmZvKSB7CiAgICBpZiAoaW5mbykKICAgICAgICBuYW1lICs9ICcgKCcgKyBpbmZvICsgJyknOwogICAgJCgnI3ByaW50LXNlbGVjdG9yJykuaHRtbChuYW1lKTsKfQoKZnVuY3Rpb24gdGFnRGV0YWlsU2VsZWN0ZWQobmFtZSkgewogICAgcmVuZGVyVGFnU2VsZWN0b3IobmFtZSk7CiAgICBpZiAobmFtZSkgewogICAgICAgIHZhciB0YWcgPSBmaW5kVGFnKG5hbWUpOwogICAgICAgIGlmICh0YWcpIHsKICAgICAgICAgICAgcmVuZGVyVGFnRGV0YWlscyh0YWcpOwogICAgICAgICAgICB1cGRhdGVQcmludFNlbGVjdG9yKG5hbWUsIHRhZy5pbmZvKTsKICAgICAgICB9CiAgICB9CiAgICBzY3JvbGxUb1NlbGVjdG9yKCd0YWdzJywgbmFtZSk7Cn0KCmZ1bmN0aW9uIGZpbmRUYWcobmFtZSkgewogICAgdmFyIHRhZ3MgPSB3aW5kb3cudGVzdGRhdGEuc3RhdGlzdGljcygpLnRhZzsKICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0YWdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgaWYgKHRhZ3NbaV0ubGFiZWwgPT0gbmFtZSkKICAgICAgICAgICAgcmV0dXJuIHRhZ3NbaV07CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQoKZnVuY3Rpb24gcmVuZGVyVGFnU2VsZWN0b3IobmFtZSkgewogICAgdmFyIGFyZ3MgPSB7bGlua1RhcmdldDogKG5hbWUpID8gJ3RhZ3M/JytuYW1lIDogJ3RhZ3MnLAogICAgICAgICAgICAgICAgdGFnVGFiU3RhdHVzOiAnZGV0YWlsLXRhYi1zZWxlY3RlZCd9OwogICAgdmFyIHN0YXRzID0ge3RhZ3M6IHdpbmRvdy50ZXN0ZGF0YS5zdGF0aXN0aWNzKCkudGFnLCBzZWxlY3RlZDogbmFtZX07CiAgICByZW5kZXJTZWxlY3RvcihhcmdzLCAndGFnRGV0YWlsc1NlbGVjdG9yVGVtcGxhdGUnLCBzdGF0cyk7Cn0KCmZ1bmN0aW9uIHJlbmRlclRhZ0RldGFpbHModGFnKSB7CiAgICB2YXIgdGVzdHMgPSBnZXRUZXN0c0hhdmluZ1RhZyh0YWcpOwogICAgdGFnLnRvdGFsVGltZSA9IGNhbGN1bGF0ZVRvdGFsVGltZSh0ZXN0cyk7CiAgICAkLnRtcGwoJ3RhZ09yVG90YWxEZXRhaWxzVGVtcGxhdGUnLCB0YWcpLmFwcGVuZFRvKCcjZGV0YWlscy1oZWFkZXInKTsKICAgIGRyYXdUZXN0RGV0YWlsc1RhYmxlKHRlc3RzLCB0cnVlKTsKfQoKZnVuY3Rpb24gc3VpdGVEZXRhaWxTZWxlY3RlZChpZCkgewogICAgcmVuZGVyU3VpdGVTZWxlY3RvcihpZCk7CiAgICBpZiAoaWQpCiAgICAgICAgcmVuZGVyU3VpdGVEZXRhaWxzKGlkKTsKICAgIHNjcm9sbFRvU2VsZWN0b3IoJ3N1aXRlcycsIGlkKTsKfQoKZnVuY3Rpb24gcmVuZGVyU3VpdGVTZWxlY3RvcihpZCkgewogICAgdmFyIGFyZ3MgPSB7bGlua1RhcmdldDogKGlkKSA/ICdzdWl0ZXM/JytpZCA6ICdzdWl0ZXMnLAogICAgICAgICAgICAgICAgc3VpdGVUYWJTdGF0dXM6ICdkZXRhaWwtdGFiLXNlbGVjdGVkJ307CiAgICB2YXIgc3RhdHMgPSB7c3VpdGVzOiB3aW5kb3cudGVzdGRhdGEuc3RhdGlzdGljcygpLnN1aXRlLAogICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBpZH07CiAgICByZW5kZXJTZWxlY3RvcihhcmdzLCAnc3VpdGVEZXRhaWxzU2VsZWN0b3JUZW1wbGF0ZScsIHN0YXRzKTsKfQoKZnVuY3Rpb24gcmVuZGVyU3VpdGVEZXRhaWxzKGlkKSB7CiAgICB3aW5kb3cudGVzdGRhdGEuZW5zdXJlTG9hZGVkKGlkLCBmdW5jdGlvbiAoaWRzKSB7CiAgICAgICAgdmFyIHN1aXRlID0gd2luZG93LnRlc3RkYXRhLmZpbmRMb2FkZWQoaWQpOwogICAgICAgIHZhciBvcHRzID0ge2xvZ1VSTDogd2luZG93LnNldHRpbmdzLmxvZ1VSTH07CiAgICAgICAgJC50bXBsKCdzdWl0ZURldGFpbHNUZW1wbGF0ZScsIHN1aXRlLCBvcHRzKS5hcHBlbmRUbygnI2RldGFpbHMtaGVhZGVyJyk7CiAgICAgICAgZHJhd1Rlc3REZXRhaWxzVGFibGUoc3VpdGUuYWxsVGVzdHMoKSwgZmFsc2UpOwogICAgICAgIHVwZGF0ZVByaW50U2VsZWN0b3Ioc3VpdGUuZnVsbE5hbWUpOwogICAgfSk7Cn0KCmZ1bmN0aW9uIHNlYXJjaEV4ZWN1dGVkKHN1aXRlLCB0ZXN0LCBpbmNsdWRlLCBleGNsdWRlKSB7CiAgICByZW5kZXJTZWFyY2hTZWxlY3RvcihzdWl0ZSwgdGVzdCwgaW5jbHVkZSwgZXhjbHVkZSk7CiAgICBpZiAoc3VpdGUgfHwgdGVzdCB8fCBpbmNsdWRlIHx8IGV4Y2x1ZGUpIHsKICAgICAgICByZW5kZXJTZWFyY2hEZXRhaWxzKHN1aXRlLCB0ZXN0LCBpbmNsdWRlLCBleGNsdWRlKTsKICAgICAgICBzY3JvbGxUb1NlbGVjdG9yKCdzZWFyY2gnICsKICAgICAgICAgICAgICAgICAgICAgICAgICc/c3VpdGU9JyArIGVuY29kZVVSSUNvbXBvbmVudChzdWl0ZSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgJyZ0ZXN0PScgKyBlbmNvZGVVUklDb21wb25lbnQodGVzdCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgJyZpbmNsdWRlPScgKyBlbmNvZGVVUklDb21wb25lbnQoaW5jbHVkZSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgJyZleGNsdWRlPScgKyBlbmNvZGVVUklDb21wb25lbnQoZXhjbHVkZSkpOwogICAgfSBlbHNlIHsKICAgICAgICBzY3JvbGxUb1NlbGVjdG9yKCdzZWFyY2gnKTsKICAgIH0KfQoKZnVuY3Rpb24gcmVuZGVyU2VhcmNoU2VsZWN0b3Ioc3VpdGUsIHRlc3QsIGluY2x1ZGUsIGV4Y2x1ZGUpIHsKICAgIHZhciBhcmdzID0ge2xpbmtUYXJnZXQ6IChzdWl0ZSB8fCB0ZXN0IHx8IGluY2x1ZGUgfHwgZXhjbHVkZSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdzZWFyY2g/c3VpdGU9JyArIHN1aXRlICsgJyZ0ZXN0PScgKyB0ZXN0ICsgJyZpbmNsdWRlPScgKyBpbmNsdWRlICsgJyZleGNsdWRlPScgKyBleGNsdWRlKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VhcmNoJywKICAgICAgICAgICAgICAgIHNlYXJjaFRhYlN0YXR1czogJ2RldGFpbC10YWItc2VsZWN0ZWQnfTsKICAgIHZhciBzZWFyY2ggPSB7c3VpdGU6IHN1aXRlLCB0ZXN0OiB0ZXN0LCBpbmNsdWRlOiBpbmNsdWRlLCBleGNsdWRlOiBleGNsdWRlfTsKICAgIHJlbmRlclNlbGVjdG9yKGFyZ3MsICdzZWFyY2hTZWxlY3RvclRlbXBsYXRlJywgc2VhcmNoKTsKfQoKZnVuY3Rpb24gcmVuZGVyU2VhcmNoRGV0YWlscyhzdWl0ZSwgdGVzdCwgaW5jbHVkZSwgZXhjbHVkZSkgewogICAgdmFyIHRlc3RzID0gc2VhcmNoVGVzdHModXRpbC5lc2NhcGUoc3VpdGUpLCB1dGlsLmVzY2FwZSh0ZXN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuZXNjYXBlKGluY2x1ZGUpLCB1dGlsLmVzY2FwZShleGNsdWRlKSk7CiAgICB2YXIgc3RhdHMgPSBjYWxjdWxhdGVTdGF0cyh0ZXN0cyk7CiAgICBzdGF0cy50b3RhbFRpbWUgPSBjYWxjdWxhdGVUb3RhbFRpbWUodGVzdHMpOwogICAgJC50bXBsKCd0YWdPclRvdGFsRGV0YWlsc1RlbXBsYXRlJywgc3RhdHMpLmFwcGVuZFRvKCcjZGV0YWlscy1oZWFkZXInKTsKICAgIGRyYXdUZXN0RGV0YWlsc1RhYmxlKHRlc3RzLCB0cnVlKTsKfQoKZnVuY3Rpb24gc2VhcmNoVGVzdHMoc3VpdGVQYXR0ZXJuLCB0ZXN0UGF0dGVybiwgaW5jbHVkZVBhdHRlcm4sIGV4Y2x1ZGVQYXR0ZXJuKSB7CiAgICB2YXIgdGVzdHM7CiAgICBpZiAoc3VpdGVQYXR0ZXJuKQogICAgICAgIHRlc3RzID0gd2luZG93LnRlc3RkYXRhLnN1aXRlKCkuc2VhcmNoVGVzdHNJblN1aXRlKHN1aXRlUGF0dGVybik7CiAgICBlbHNlCiAgICAgICAgdGVzdHMgPSB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKS5hbGxUZXN0cygpOwogICAgcmV0dXJuIHV0aWwuZmlsdGVyKHRlc3RzLCBmdW5jdGlvbiAodGVzdCkgewogICAgICAgIGlmICh0ZXN0UGF0dGVybiAmJiAhdGVzdC5tYXRjaGVzTmFtZVBhdHRlcm4odGVzdFBhdHRlcm4pKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKGluY2x1ZGVQYXR0ZXJuICYmICF0ZXN0Lm1hdGNoZXNUYWdQYXR0ZXJuKGluY2x1ZGVQYXR0ZXJuKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiAhKGV4Y2x1ZGVQYXR0ZXJuICYmIHRlc3QubWF0Y2hlc1RhZ1BhdHRlcm4oZXhjbHVkZVBhdHRlcm4pKTsKICAgIH0pOwp9CgpmdW5jdGlvbiBzY3JvbGxUb1NlbGVjdG9yKGJhc2UsIHF1ZXJ5KSB7CiAgICAkKCcjdGVzdC1kZXRhaWxzLWNvbnRhaW5lcicpLmNzcygnbWluLWhlaWdodCcsICQod2luZG93KS5oZWlnaHQoKSk7CiAgICB2YXIgYW5jaG9yID0gcXVlcnkgPyBiYXNlICsgJz8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KSA6IGJhc2U7CiAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9ICcnOwogICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSB3aW5kb3cucHJldkxvY2F0aW9uSGFzaCA9IGFuY2hvcjsKfQoKZnVuY3Rpb24gcmVuZGVyU2VsZWN0b3IoYXJncywgdGVtcGxhdGUsIHN0YXRzKSB7CiAgICB3aW5kb3cuZWxlbWVudHNUb1JlbmRlciA9IFtdOwogICAgdmFyIGNvbnRhaW5lciA9ICQoJyN0ZXN0LWRldGFpbHMtY29udGFpbmVyJyk7CiAgICBjb250YWluZXIuZW1wdHkoKTsKICAgICQudG1wbCgnZGV0YWlsc0hlYWRlclRlbXBsYXRlJywgYXJncykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICQudG1wbCh0ZW1wbGF0ZSwgc3RhdHMpLmFwcGVuZFRvKGNvbnRhaW5lcik7Cn0KCmZ1bmN0aW9uIGRyYXdUZXN0RGV0YWlsc1RhYmxlKHRlc3RzLCBzb3J0QnlTdGF0dXMpIHsKICAgIGlmICghdGVzdHMubGVuZ3RoKQogICAgICAgIHJldHVybjsKICAgIHJlbmRlclRlc3REZXRhaWxzSGVhZGVyKCk7CiAgICB3aW5kb3cuZWxlbWVudHNUb1JlbmRlciA9IHRlc3RzOwogICAgdmFyIHRhcmdldCA9ICQoJyN0ZXN0LWRldGFpbHMnKS5maW5kKCd0Ym9keScpOwogICAgcmVuZGVyVGVzdERldGFpbHMoc29ydEJ5U3RhdHVzLCB0YXJnZXQpOwp9CgpmdW5jdGlvbiByZW5kZXJUZXN0RGV0YWlsc0hlYWRlcigpIHsKICAgIHZhciBoZWFkZXIgPSAkLnRtcGwoJ3Rlc3REZXRhaWxzVGFibGVUZW1wbGF0ZScpOwogICAgaGlkZUhpZGRlbkRldGFpbHNDb2x1bW5zKGhlYWRlcik7CiAgICBoZWFkZXIuYXBwZW5kVG8oJyN0ZXN0LWRldGFpbHMtY29udGFpbmVyJyk7Cn0KCmZ1bmN0aW9uIHNvcnRCeVN0YXR1cyh0MSwgdDIpIHsKICAgIGlmICh0MS5zdGF0dXMgPT0gdDIuc3RhdHVzKQogICAgICAgIHJldHVybiB0MS5mdWxsTmFtZSA8IHQyLmZ1bGxOYW1lID8gLTEgOiAxOwogICAgc3RhdHVzZXMgPSB7J0ZBSUwnOiAtMSwgJ1NLSVAnOiAwLCAnUEFTUyc6IDF9OwogICAgcmV0dXJuIHN0YXR1c2VzW3QxLnN0YXR1c10gPCBzdGF0dXNlc1t0Mi5zdGF0dXNdID8gLTEgOiAxOwp9CgpmdW5jdGlvbiBnZXRUZXN0c0hhdmluZ1RhZyh0YWcpIHsKICAgIHJldHVybiB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKS5zZWFyY2hUZXN0c0J5VGFnKHRhZykuc29ydChzb3J0QnlTdGF0dXMpOwp9CgpmdW5jdGlvbiBjYWxjdWxhdGVUb3RhbFRpbWUodGVzdHMpIHsKICAgIHZhciB0b3RhbCA9IDA7CiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGVzdHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspCiAgICAgICAgdG90YWwgKz0gdGVzdHNbaV0udGltZXMuZWxhcHNlZE1pbGxpczsKICAgIHJldHVybiB1dGlsLmZvcm1hdEVsYXBzZWQodG90YWwpOwp9CgpmdW5jdGlvbiBjYWxjdWxhdGVTdGF0cyh0ZXN0cykgewogICAgdmFyIHBhc3NlZCA9IHV0aWwuZmlsdGVyKHRlc3RzLCBmdW5jdGlvbiAodGVzdCkgewogICAgICAgIHJldHVybiB0ZXN0LnN0YXR1cyA9PSAnUEFTUyc7CiAgICB9KTsKICAgIHZhciBmYWlsZWQgPSB1dGlsLmZpbHRlcih0ZXN0cywgZnVuY3Rpb24gKHRlc3QpIHsKICAgICAgICByZXR1cm4gdGVzdC5zdGF0dXMgPT0gJ0ZBSUwnOwogICAgfSk7CiAgICByZXR1cm4gewogICAgICB0b3RhbDogdGVzdHMubGVuZ3RoLAogICAgICBwYXNzOiBwYXNzZWQubGVuZ3RoLAogICAgICBmYWlsOiBmYWlsZWQubGVuZ3RoLAogICAgICBza2lwOiB0ZXN0cy5sZW5ndGggLSBwYXNzZWQubGVuZ3RoIC0gZmFpbGVkLmxlbmd0aAogICAgfTsKfQoKZnVuY3Rpb24gcmVuZGVyVGVzdERldGFpbHMoc29ydEJ5U3RhdHVzLCB0YXJnZXQpIHsKICAgIGlmICghd2luZG93LmVsZW1lbnRzVG9SZW5kZXIubGVuZ3RoKQogICAgICAgIHJldHVybjsKICAgIHZhciB0ZXN0cyA9IHBvcFVwVG8od2luZG93LmVsZW1lbnRzVG9SZW5kZXIsIDUwKTsKICAgIHJlbmRlclRlc3REZXRhaWxzUm93cyh0ZXN0cywgdGFyZ2V0KTsKICAgIGlmICh3aW5kb3cuZWxlbWVudHNUb1JlbmRlci5sZW5ndGgpCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7cmVuZGVyVGVzdERldGFpbHMoc29ydEJ5U3RhdHVzLCB0YXJnZXQpO30sIDApOwogICAgZWxzZQogICAgICAgIGNvbmZpZ3VyZVRhYmxlU29ydGVyKHNvcnRCeVN0YXR1cyk7Cn0KCmZ1bmN0aW9uIHJlbmRlclRlc3REZXRhaWxzUm93cyh0ZXN0cywgdGFyZ2V0KSB7CiAgICB2YXIgcm93cyA9ICQudG1wbCgndGVzdERldGFpbHNUYWJsZVJvd1RlbXBsYXRlJywgdGVzdHMsCiAgICAgICAgICAgICAgICAgICAgICB7bG9nVVJMOiB3aW5kb3cuc2V0dGluZ3MubG9nVVJMfSk7CiAgICByb3dzLmZpbmQoJ2EnKS5jbGljayhzdG9wUHJvcGFnYXRpb24pOwogICAgaGlkZUhpZGRlbkRldGFpbHNDb2x1bW5zKHJvd3MpOwogICAgcm93cy5hcHBlbmRUbyh0YXJnZXQpOwp9CgpmdW5jdGlvbiBjb25maWd1cmVUYWJsZVNvcnRlcihzb3J0QnlTdGF0dXMpIHsKICAgIHZhciBjb25maWcgPSB7aGVhZGVyczogezM6IHtzb3J0ZXI6ICdzdGF0dXMnfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU6IHtzb3J0SW5pdGlhbE9yZGVyOiAnZGVzYyd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNjoge3NvcnRlcjogJ3RpbWVzJ319LAogICAgICAgICAgICAgICAgICBzZWxlY3RvclNvcnQ6ICcuZGV0YWlscy1jb2wtaGVhZGVyJ307CiAgICBpZiAoc29ydEJ5U3RhdHVzKQogICAgICAgIGNvbmZpZ1snc29ydExpc3QnXSA9IFtbMywgMF1dOwogICAgJCgnI3Rlc3QtZGV0YWlscycpLnRhYmxlc29ydGVyKGNvbmZpZyk7Cn0KCmZ1bmN0aW9uIHBvcFVwVG8obGlzdCwgdXBUbykgewogICAgdmFyIHJlc3VsdCA9IFtdOwogICAgd2hpbGUgKGxpc3QubGVuZ3RoID4gMCAmJiByZXN1bHQubGVuZ3RoIDwgdXBUbykKICAgICAgICByZXN1bHQucHVzaChsaXN0LnNoaWZ0KCkpOwogICAgcmV0dXJuIHJlc3VsdDsKfQoKZnVuY3Rpb24gdG9nZ2xlRGV0YWlsc0NvbHVtbihuYW1lKSB7CiAgICB2YXIgY29sdW1uID0gJCgnLmRldGFpbHMtY29sLScgKyBuYW1lKTsKICAgIGNvbHVtbi50b2dnbGVDbGFzcygnaGlkZGVuJyk7CiAgICB2YXIgaGlkZGVuID0gY29sdW1uLmhhc0NsYXNzKCdoaWRkZW4nKTsKICAgIHN0b3JhZ2Uuc2V0KG5hbWUsIGhpZGRlbiA/ICdoaWRkZW4nIDogJ3Zpc2libGUnKTsKICAgIGNvbHVtbi5maW5kKCcuZGV0YWlscy1jb2wtdG9nZ2xlJykuaHRtbChoaWRkZW4gPyAnJmhlbGxpcDsnIDogJyZ0aW1lczsnKTsKfQoKZnVuY3Rpb24gaGlkZUhpZGRlbkRldGFpbHNDb2x1bW5zKGVsZW0pIHsKICAgIHZhciBuYW1lcyA9IFsnZG9jJywgJ3RhZ3MnLCAnbXNnJywgJ2VsYXBzZWQnLCAndGltZXMnXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgbmFtZSA9IG5hbWVzW2ldOwogICAgICAgIGlmIChzdG9yYWdlLmdldChuYW1lLCAndmlzaWJsZScpID09ICdoaWRkZW4nKSB7CiAgICAgICAgICAgIHZhciBjb2x1bW4gPSBlbGVtLmZpbmQoJy5kZXRhaWxzLWNvbC0nICsgbmFtZSk7CiAgICAgICAgICAgIGNvbHVtbi5hZGRDbGFzcygnaGlkZGVuJyk7CiAgICAgICAgICAgIGNvbHVtbi5maW5kKCcuZGV0YWlscy1jb2wtdG9nZ2xlJykuaHRtbCgnJmhlbGxpcDsnKTsKICAgICAgICB9CiAgICB9Cn0KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1bW1hcnlUYWJsZVRlbXBsYXRlIj4KICA8aDI+U3VtbWFyeSBJbmZvcm1hdGlvbjwvaDI+CiAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIj4KICAgIDx0cj4KICAgICAgPHRoPlN0YXR1czo8L3RoPgogICAgICB7e2lmIGZhaWx9fQogICAgICA8dGQ+PGEgaHJlZj0iI3RvdGFscyIgb25jbGljaz0idG90YWxEZXRhaWxTZWxlY3RlZCgpIgogICAgICAgICAgICAgY2xhc3M9ImZhaWwiPiR7ZmFpbH0ge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX17e2lmIGZhaWwgIT0gMX19c3t7L2lmfX0gZmFpbGVkPC9hPjwvdGQ+CiAgICAgIHt7ZWxzZSBwYXNzICYmIHNraXB9fQogICAgICA8dGQ+PGEgaHJlZj0iI3RvdGFscyIgb25jbGljaz0idG90YWxEZXRhaWxTZWxlY3RlZCgpIgogICAgICAgICAgICAgY2xhc3M9InBhc3MiPiR7cGFzc30ge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX17e2lmIHBhc3MgIT0gMX19c3t7L2lmfX0gcGFzc2VkLAogICAgICAgICAgICAgJHtza2lwfSB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fXt7aWYgc2tpcCAhPSAxfX1ze3svaWZ9fSBza2lwcGVkPC9hPjwvdGQ+CiAgICAgIHt7ZWxzZSBwYXNzfX0KICAgICAgPHRkPjxhIGhyZWY9IiN0b3RhbHMiIG9uY2xpY2s9InRvdGFsRGV0YWlsU2VsZWN0ZWQoKSIKICAgICAgICAgICAgIGNsYXNzPSJwYXNzIj5BbGwge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX1zIHBhc3NlZDwvYT48L3RkPgogICAgICB7e2Vsc2V9fQogICAgICA8dGQ+PGEgaHJlZj0iI3RvdGFscyIgb25jbGljaz0idG90YWxEZXRhaWxTZWxlY3RlZCgpIgogICAgICAgICAgICAgY2xhc3M9InNraXAiPkFsbCB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fXMgc2tpcHBlZDwvYT48L3RkPgogICAgICB7ey9pZn19CiAgICA8L3RyPgogICAge3tpZiBkb2MoKX19CiAgICA8dHI+CiAgICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICAgIDx0ZCBjbGFzcz0iZG9jIj57e2h0bWwgZG9jKCl9fTwvdGQ+CiAgICA8L3RyPgogICAge3svaWZ9fQogICAge3tlYWNoIG1ldGFkYXRhfX0KICAgIDx0cj4KICAgICAgPHRoPnt7aHRtbCAkdmFsdWVbMF19fTo8L3RoPgogICAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sICR2YWx1ZVsxXX19PC90ZD4KICAgIDwvdHI+CiAgICB7ey9lYWNofX0KICAgIHt7aWYgdGltZXMuc3RhcnRUaW1lICE9ICdOL0EnfX0KICAgIDx0cj4KICAgICAgPHRoPlN0YXJ0IFRpbWU6PC90aD4KICAgICAgPHRkPiR7dGltZXMuc3RhcnRUaW1lfTwvdGQ+CiAgICA8L3RyPgogICAge3svaWZ9fQogICAge3tpZiB0aW1lcy5lbmRUaW1lICE9ICdOL0EnfX0KICAgIDx0cj4KICAgICAgPHRoPkVuZCBUaW1lOjwvdGg+CiAgICAgIDx0ZD4ke3RpbWVzLmVuZFRpbWV9PC90ZD4KICAgIDwvdHI+CiAgICB7ey9pZn19CiAgICA8dHI+CiAgICAgIDx0aD5FbGFwc2VkIFRpbWU6PC90aD4KICAgICAgPHRkPiR7dGltZXMuZWxhcHNlZFRpbWV9PC90ZD4KICAgIDwvdHI+CiAgICB7e2lmICRpdGVtLmxvZ1VSTH19CiAgICA8dHI+CiAgICAgIDx0aD5Mb2cgRmlsZTo8L3RoPgogICAgICA8dGQ+PGEgaHJlZj0iJHskaXRlbS5sb2dVUkx9Ij4keyRpdGVtLmxvZ1VSTH08L2E+PC90ZD4KICAgIDwvdHI+CiAgICB7ey9pZn19CiAgPC90YWJsZT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRvdGFsU3RhdGlzdGljc1Jvd1RlbXBsYXRlIj4KICA8dHIgb25jbGljaz0idG90YWxEZXRhaWxTZWxlY3RlZCgnYWxsJykiIGNsYXNzPSJyb3ctJHskaXRlbS5pbmRleH0iPgogICAgPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSI+CiAgICAgIDxkaXYgY2xhc3M9InN0YXQtbmFtZSI+CiAgICAgICAgPGEgaHJlZj0iI3RvdGFscyI+e3todG1sIGxhYmVsfX08L2E+CiAgICAgIDwvZGl2PgogICAgPC90ZD4KICAgIHt7dG1wbCgkZGF0YSkgJ3N0YXRDb2x1bW5zVGVtcGxhdGUnfX0KICA8L3RyPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idGFnU3RhdGlzdGljc1Jvd1RlbXBsYXRlIj4KICA8dHIgb25jbGljaz0idGFnRGV0YWlsU2VsZWN0ZWQoJyR7bGFiZWx9JykiIGNsYXNzPSJyb3ctJHskaXRlbS5pbmRleH0iPgogICAgPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSIgdGl0bGU9Int7aHRtbCBkb2N9fSI+CiAgICAgIDxkaXYgY2xhc3M9InN0YXQtbmFtZSI+CiAgICAgICAgPGEgaHJlZj0iI3RhZ3M/JHtsYWJlbH0iPnt7aHRtbCBsYWJlbH19PC9hPgogICAgICAgIHt7aWYgaW5mb319KCR7aW5mb30pe3svaWZ9fQogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0idGFnLWxpbmtzIj4KICAgICAgICB7e2VhY2ggbGlua3N9fQogICAgICAgIDxzcGFuPls8YSBocmVmPSJ7e2h0bWwgJHZhbHVlLnVybH19IiBvbmNsaWNrPSJzdG9wUHJvcGFnYXRpb24oZXZlbnQpIgogICAgICAgICAgICAgICAgICB0aXRsZT0ie3todG1sICR2YWx1ZS51cmx9fSI+e3todG1sICR2YWx1ZS50aXRsZX19PC9hPl08L3NwYW4+CiAgICAgICAge3svZWFjaH19CiAgICAgIDwvZGl2PgogICAgPC90ZD4KICAgIHt7dG1wbCgkZGF0YSkgJ3N0YXRDb2x1bW5zVGVtcGxhdGUnfX0KICA8L3RyPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ic3VpdGVTdGF0aXN0aWNzUm93VGVtcGxhdGUiPgogIDx0ciBvbmNsaWNrPSJzdWl0ZURldGFpbFNlbGVjdGVkKCcke2lkfScpIiBjbGFzcz0icm93LSR7JGl0ZW0uaW5kZXh9Ij4KICAgIDx0ZCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiIHRpdGxlPSJ7e2h0bWwgbGFiZWx9fSI+CiAgICAgIDxkaXYgY2xhc3M9InN0YXQtbmFtZSI+CiAgICAgICAgPGEgaHJlZj0iI3N1aXRlcz8ke2lkfSI+PHNwYW4gY2xhc3M9InBhcmVudC1uYW1lIj57e2h0bWwgZm9ybWF0UGFyZW50TmFtZX19PC9zcGFuPnt7aHRtbCBuYW1lfX08L2E+CiAgICAgIDwvZGl2PgogICAgPC90ZD4KICAgIHt7dG1wbCgkZGF0YSkgJ3N0YXRDb2x1bW5zVGVtcGxhdGUnfX0KICA8L3RyPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0iZGV0YWlsc0hlYWRlclRlbXBsYXRlIj4KICA8aDIgaWQ9IiR7bGlua1RhcmdldH0iPnt7PSB0ZXN0T3JUYXNrKCd7VGVzdH0gRGV0YWlscycpfX08L2gyPgogIDx1bCBpZD0iZGV0YWlsLXRhYnMiPgogICAgPGxpIGNsYXNzPSIke3RvdGFsVGFiU3RhdHVzfSBkZXRhaWwtdGFiIj4KICAgICAgPGEgaHJlZj0iI3RvdGFscyIgb25jbGljaz0icmVuZGVyVG90YWxTZWxlY3RvcigpIgogICAgICAgICB0aXRsZT0ie3s9IHRlc3RPclRhc2soJ1Nob3cgYWxsIHt0ZXN0c30nKX19Ij5BbGw8L2E+CiAgICA8L2xpPgogICAgPGxpIGNsYXNzPSIke3RhZ1RhYlN0YXR1c30gZGV0YWlsLXRhYiI+CiAgICAgIDxhIGhyZWY9IiN0YWdzIiBvbmNsaWNrPSJyZW5kZXJUYWdTZWxlY3RvcigpIgogICAgICAgICB0aXRsZT0ie3s9IHRlc3RPclRhc2soJ1Nob3cge3Rlc3RzfSBieSB0YWcnKX19Ij5UYWdzPC9hPgogICAgPC9saT4KICAgIDxsaSBjbGFzcz0iJHtzdWl0ZVRhYlN0YXR1c30gZGV0YWlsLXRhYiI+CiAgICAgIDxhIGhyZWY9IiNzdWl0ZXMiIG9uY2xpY2s9InJlbmRlclN1aXRlU2VsZWN0b3IoKSIKICAgICAgICAgdGl0bGU9Int7PSB0ZXN0T3JUYXNrKCdTaG93IHt0ZXN0c30gYnkgc3VpdGUnKX19Ij5TdWl0ZXM8L2E+CiAgICA8L2xpPgogICAgPGxpIGNsYXNzPSIke3NlYXJjaFRhYlN0YXR1c30gZGV0YWlsLXRhYiI+CiAgICAgIDxhIGhyZWY9IiNzZWFyY2giIG9uY2xpY2s9InJlbmRlclNlYXJjaFNlbGVjdG9yKCkiCiAgICAgICAgIHRpdGxlPSJ7ez0gdGVzdE9yVGFzaygnRnJlZSB7dGVzdH0gc2VhcmNoJyl9fSI+U2VhcmNoPC9hPgogICAgPC9saT4KICA8L3VsPgo8L3NjcmlwdD4KCjxzY3JpcHQgIHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRvdGFsRGV0YWlsc1NlbGVjdG9yVGVtcGxhdGUiPgogIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgaWQ9ImRldGFpbHMtaGVhZGVyIj4KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgIHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRhZ0RldGFpbHNTZWxlY3RvclRlbXBsYXRlIj4KICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGlkPSJkZXRhaWxzLWhlYWRlciI+CiAgICA8dHIgY2xhc3M9InNlbGVjdG9yIj4KICAgICAgPHRoPlRhZzo8L3RoPgogICAgICA8dGQgaWQ9Im5vcm1hbC1zZWxlY3RvciI+CiAgICAgICAgPHNlbGVjdCBpZD0idGFnLWRldGFpbC1zZWxlY3RvciIgdGl0bGU9IlRhZyBzZWxlY3RvciIKICAgICAgICAgICAgICAgIG9uY2hhbmdlPSJ0YWdEZXRhaWxTZWxlY3RlZCh0aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS52YWx1ZSkiPgogICAgICAgICAgPG9wdGlvbiBzZWxlY3RlZCBkaXNhYmxlZCBoaWRkZW4+LS0gU2VsZWN0IC0tPC9vcHRpb24+CiAgICAgICAgICB7e2VhY2ggdGFnc319CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIkeyR2YWx1ZS5sYWJlbH0iCiAgICAgICAgICAgICAgICAgIHt7aWYgJHZhbHVlLmxhYmVsID09IHNlbGVjdGVkfX1zZWxlY3RlZD0ic2VsZWN0ZWQie3svaWZ9fT4KICAgICAgICAgICAge3todG1sICR2YWx1ZS5sYWJlbH19IHt7aWYgJHZhbHVlLmluZm99fSgkeyR2YWx1ZS5pbmZvfSl7ey9pZn19CiAgICAgICAgICA8L29wdGlvbj4KICAgICAgICAgIHt7L2VhY2h9fQogICAgICAgIDwvc2VsZWN0PgogICAgICA8L3RkPgogICAgICA8dGQgaWQ9InByaW50LXNlbGVjdG9yIj48L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgIHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1aXRlRGV0YWlsc1NlbGVjdG9yVGVtcGxhdGUiPgogIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgaWQ9ImRldGFpbHMtaGVhZGVyIj4KICAgIDx0ciBjbGFzcz0ic2VsZWN0b3IiPgogICAgICA8dGg+U3VpdGU6PC90aD4KICAgICAgPHRkIGlkPSJub3JtYWwtc2VsZWN0b3IiPgogICAgICAgIDxzZWxlY3QgaWQ9InN1aXRlLWRldGFpbC1zZWxlY3RvciIgdGl0bGU9IlN1aXRlIHNlbGVjdG9yIgogICAgICAgICAgICAgICAgb25jaGFuZ2U9InN1aXRlRGV0YWlsU2VsZWN0ZWQodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpIj4KICAgICAgICAgIDxvcHRpb24gc2VsZWN0ZWQgZGlzYWJsZWQgaGlkZGVuPi0tIFNlbGVjdCAtLTwvb3B0aW9uPgogICAgICAgICAge3tlYWNoIHN1aXRlc319CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIkeyR2YWx1ZS5pZH0iCiAgICAgICAgICAgICAgICAgIHt7aWYgJHZhbHVlLmlkID09IHNlbGVjdGVkfX1zZWxlY3RlZD0ic2VsZWN0ZWQie3svaWZ9fT4KICAgICAgICAgICAge3todG1sICR2YWx1ZS5sYWJlbH19CiAgICAgICAgICA8L29wdGlvbj4KICAgICAgICAgIHt7L2VhY2h9fQogICAgICAgIDwvc2VsZWN0PgogICAgICA8L3RkPgogICAgICA8dGQgaWQ9InByaW50LXNlbGVjdG9yIj48L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgIHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InNlYXJjaFNlbGVjdG9yVGVtcGxhdGUiPgogIDxmb3JtIGFjdGlvbj0iamF2YXNjcmlwdDp2b2lkKDApIj4KICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgaWQ9ImRldGFpbHMtaGVhZGVyIj4KICAgICAgPHRyIGNsYXNzPSJzZWxlY3RvciBmaXJzdC1zZWxlY3RvciI+CiAgICAgICAgPHRoPjxsYWJlbCBmb3I9InNlYXJjaC1zdWl0ZSI+U3VpdGU6PC9sYWJlbD48L3RoPgogICAgICAgIDx0ZD48aW5wdXQgaWQ9InNlYXJjaC1zdWl0ZSIgdHlwZT0idGV4dCIgdmFsdWU9IiR7c3VpdGV9Ij48L3RkPgogICAgICA8L3RyPgogICAgICA8dHIgY2xhc3M9InNlbGVjdG9yIG1pZGRsZS1zZWxlY3RvciI+CiAgICAgICAgPHRoPjxsYWJlbCBmb3I9InNlYXJjaC10ZXN0Ij57ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fTo8L2xhYmVsPjwvdGg+CiAgICAgICAgPHRkPjxpbnB1dCBpZD0ic2VhcmNoLXRlc3QiIHR5cGU9InRleHQiIHZhbHVlPSIke3Rlc3R9Ij48L3RkPgogICAgICA8L3RyPgogICAgICA8dHIgY2xhc3M9InNlbGVjdG9yIG1pZGRsZS1zZWxlY3RvciI+CiAgICAgICAgPHRoPjxsYWJlbCBmb3I9InNlYXJjaC1pbmNsdWRlIj5JbmNsdWRlOjwvbGFiZWw+PC90aD4KICAgICAgICA8dGQ+PGlucHV0IGlkPSJzZWFyY2gtaW5jbHVkZSIgdHlwZT0idGV4dCIgdmFsdWU9IiR7aW5jbHVkZX0iPjwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBjbGFzcz0ic2VsZWN0b3IgbWlkZGxlLXNlbGVjdG9yIj4KICAgICAgICA8dGg+PGxhYmVsIGZvcj0ic2VhcmNoLWV4Y2x1ZGUiPkV4Y2x1ZGU6PC9sYWJlbD48L3RoPgogICAgICAgIDx0ZD48aW5wdXQgaWQ9InNlYXJjaC1leGNsdWRlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iJHtleGNsdWRlfSI+PC90ZD4KICAgICAgPC90cj4KICAgICAgPHRyIGNsYXNzPSJzZWxlY3RvciBsYXN0LXNlbGVjdG9yIiBpZD0ic2VhcmNoLWJ1dHRvbnMiPgogICAgICAgIDx0aD48L3RoPgogICAgICAgIDx0ZD4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2giCiAgICAgICAgICAgICAgICAgb25jbGljaz0ic2VhcmNoRXhlY3V0ZWQoJCgnI3NlYXJjaC1zdWl0ZScpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtdGVzdCcpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtaW5jbHVkZScpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtZXhjbHVkZScpLnZhbCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ij4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJDbGVhciIKICAgICAgICAgICAgICAgICBvbmNsaWNrPSIkKCcjc2VhcmNoLXN1aXRlJykudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjc2VhcmNoLXRlc3QnKS52YWwoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtaW5jbHVkZScpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3NlYXJjaC1leGNsdWRlJykudmFsKCcnKTsiPgogICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSIkKCcjc2VhcmNoLWhlbHAnKS50b2dnbGUoKSIKICAgICAgICAgICAgIHRpdGxlPSJUb2dnbGUgc2VhcmNoIGhlbHAuIj5IZWxwPC9hPgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBpZD0ic2VhcmNoLWhlbHAiIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KICAgICAgICA8dGg+PC90aD4KICAgICAgICA8dGQ+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8aDM+U2VhcmNoIGZpZWxkczwvaDM+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIHt7PSB0ZXN0T3JUYXNrKCd7VGVzdH0nKX19cyBjYW4gYmUgc2VhcmNoZWQgYmFzZWQgb24gc3VpdGUgYW5kCiAgICAgICAgICAgICAge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX0gbmFtZXMgYXMgd2VsbCBhcyBiYXNlZCBvbiB0YWdzLiBJZgogICAgICAgICAgICAgIG11bHRpcGxlIHNlYXJjaCBjcml0ZXJpYSBhcmUgdXNlZCwgb25seQogICAgICAgICAgICAgIHt7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19cyBtYXRjaGluZyBhbGwgb2YgdGhlbSBhcmUgaW5jbHVkZWQuCiAgICAgICAgICAgICAgU2VhcmNoIGZpZWxkcyBoYXZlIHNhbWUgc2VtYW50aWNzIGFzCiAgICAgICAgICAgICAgPGVtPiYjODIwOTsmIzgyMDk7c3VpdGU8L2VtPiwKICAgICAgICAgICAgICA8ZW0+JiM4MjA5OyYjODIwOTt7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fTwvZW0+LAogICAgICAgICAgICAgIDxlbT4mIzgyMDk7JiM4MjA5O2luY2x1ZGU8L2VtPiBhbmQKICAgICAgICAgICAgICA8ZW0+JiM4MjA5OyYjODIwOTtleGNsdWRlPC9lbT4gY29tbWFuZCBsaW5lIG9wdGlvbnMsIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8dGFibGUgY2xhc3M9InNlYXJjaC1oZWxwLWV4YW1wbGVzIj4KICAgICAgICAgICAgICA8Y29sIGNsYXNzPSJoZWxwLWl0ZW0iPgogICAgICAgICAgICAgIDxjb2wgY2xhc3M9ImhlbHAtZXhwbGFuYXRpb24iPgogICAgICAgICAgICAgIDxjb2wgY2xhc3M9ImhlbHAtZXhhbXBsZXM+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPkZpZWxkPC90aD4KICAgICAgICAgICAgICAgIDx0aD5FeHBsYW5hdGlvbjwvdGg+CiAgICAgICAgICAgICAgICA8dGg+RXhhbXBsZXM8L3RoPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPlN1aXRlPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAge3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX1zIGluIG1hdGNoaW5nIHN1aXRlcyBhcmUgaW5jbHVkZWQuCiAgICAgICAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGNhbiBtYXRjaCBlaXRoZXIgc3VpdGUncyBuYW1lIG9yIGl0cyBmdWxsIG5hbWUKICAgICAgICAgICAgICAgICAgdGhhdCBjb250YWlucyBhbHNvIHBhcmVudCBzdWl0ZSBuYW1lcy4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+TXkgU3VpdGU8YnI+Um9vdC5QYXJlbnQuU3VpKjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+e3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX08L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICBNYXRjaGluZyB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fXMgYXJlIGluY2x1ZGVkLiBUaGUKICAgICAgICAgICAgICAgICAgcGF0dGVybiBjYW4gbWF0Y2ggZWl0aGVyIHt7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19J3MgbmFtZQogICAgICAgICAgICAgICAgICBvciBpdHMgZnVsbCBuYW1lIHRoYXQgY29udGFpbnMgYWxzbyBwYXJlbnQgc3VpdGUgbmFtZXMuCiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPkV4YW1wbGUgTmFtZTxicj5Sb290LlBhKi5UPz8/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD5JbmNsdWRlPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAge3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX1zIHRoYXQgY29udGFpbiBtYXRjaGluZyB0YWdzIGFyZQogICAgICAgICAgICAgICAgICBpbmNsdWRlZC4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+c21va2U8YnI+YnVnLSo8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPkV4Y2x1ZGU8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICB7ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fXMgdGhhdCBjb250YWluIG1hdGNoaW5nIHRhZ3MgYXJlCiAgICAgICAgICAgICAgICAgIG5vdCBpbmNsdWRlZC4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+c2xvdzxicj5mZWF0dXJlLTQ/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8aDM+UGF0dGVybnM8L2gzPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBBbGwgc2VhcmNoZXMgc3VwcG9ydCA8ZW0+KjwvZW0+IGFuZCA8ZW0+PzwvZW0+IHdpbGRjYXJkcyBhbmQgYXJlCiAgICAgICAgICAgICAgY2FzZSwgc3BhY2UgYW5kIHVuZGVyc2NvcmUgaW5zZW5zaXRpdmUuIFRhZyByZWxhdGVkIHNlYXJjaGVzIGFsc28KICAgICAgICAgICAgICBzdXBwb3J0IDxlbT5BTkQ8L2VtPiwgPGVtPk9SPC9lbT4gYW5kIDxlbT5OT1Q8L2VtPiAoY2FzZS1zZW5zaXRpdmUpCiAgICAgICAgICAgICAgY29tYmluaW5nIG9wZXJhdG9ycy4gSWYgb3BlcmF0b3JzIGFyZSB1c2VkIHRvZ2V0aGVyLCB0aGVpcgogICAgICAgICAgICAgIHByZWNlZGVuY2UsIGZyb20gaGlnaGVzdCB0byBsb3dlc3QsIGlzIDxlbT5BTkQ8L2VtPiwgPGVtPk9SPC9lbT4sCiAgICAgICAgICAgICAgPGVtPk5PVDwvZW0+LiBTZWUgPGVtPlNpbXBsZSBwYXR0ZXJuczwvZW0+IGFuZAogICAgICAgICAgICAgIDxlbT5UYWcgcGF0dGVybnM8L2VtPiBzZWN0aW9ucyBpbgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9yb2JvdGZyYW1ld29yay5vcmcvcm9ib3RmcmFtZXdvcmsvI3VzZXItZ3VpZGUiPlJvYm90CiAgICAgICAgICAgICAgRnJhbWV3b3JrIFVzZXIgR3VpZGU8L2E+IGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJzZWFyY2gtaGVscC1leGFtcGxlcyI+CiAgICAgICAgICAgICAgPGNvbCBjbGFzcz0iaGVscC1pdGVtIj4KICAgICAgICAgICAgICA8Y29sIGNsYXNzPSJoZWxwLWV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICA8Y29sIGNsYXNzPSJoZWxwLWV4YW1wbGVzPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0aD5QYXR0ZXJuPC90aD4KICAgICAgICAgICAgICAgIDx0aD5FeHBsYW5hdGlvbjwvdGg+CiAgICAgICAgICAgICAgICA8dGg+RXhhbXBsZXM8L3RoPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPio8L3RkPgogICAgICAgICAgICAgICAgPHRkPk1hdGNoZXMgYW55dGhpbmcsIGV2ZW4gYW4gZW1wdHkgc3RyaW5nLjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+Zio8YnI+c3ByaW50LSo8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPj88L3RkPgogICAgICAgICAgICAgICAgPHRkPk1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIuPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5mPz88YnI+c3ByaW50LTE/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD5BTkQ8L3RkPgogICAgICAgICAgICAgICAgPHRkPk1hdGNoZXMgaWYgYWxsIHBhdHRlcm5zIG1hdGNoLjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+Zm9vIEFORCBiYXI8YnI+eCBBTkQgeSogQU5EIHo/PzwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+T1I8L3RkPgogICAgICAgICAgICAgICAgPHRkPk1hdGNoZXMgaWYgYW55IHBhdHRlcm4gbWF0Y2hlcy48L3RkPgogICAgICAgICAgICAgICAgPHRkPmZvbyBPUiBiYXI8YnI+eCBPUiB5KiBPUiB6MSBBTkQgejI8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPk5PVDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgTWF0Y2hlcyBpZiAob3B0aW9uYWwpIHBhdHRlcm4gYmVmb3JlIG1hdGNoZXMgYW5kIHBhdHRlcm4KICAgICAgICAgICAgICAgICAgICBhZnRlciBkb2VzIG5vdC4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+Zm9vIE5PVCBiYXI8YnI+KiBOT1QgaWQtKiBBTkQgc21va2U8YnI+Tk9UIGJhcjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICA8L3RhYmxlPgogIDwvZm9ybT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRhZ09yVG90YWxEZXRhaWxzVGVtcGxhdGUiPgogIDx0cj4KICAgIDx0aD5TdGF0dXM6PC90aD4KICAgIDx0ZD57e3RtcGwoJGRhdGEpICdzdWl0ZVN0YXR1c01lc3NhZ2VUZW1wbGF0ZSd9fTwvdGQ+CiAgPC90cj4KICB7e2lmIGRvY319CiAgPHRyPgogICAgPHRoPkRvY3VtZW50YXRpb246PC90aD4KICAgIDx0ZD57e2h0bWwgZG9jfX08L3RkPgogIDwvdHI+CiAge3svaWZ9fQogIHt7aWYgY29tYmluZWR9fQogIDx0cj4KICAgIDx0aD5QYXR0ZXJuOjwvdGg+CiAgICA8dGQ+e3todG1sIGNvbWJpbmVkfX08L3RkPgogIDwvdHI+CiAge3svaWZ9fQogIHt7aWYgbGlua3N9fXt7aWYgbGlua3MubGVuZ3RofX0KICA8dHI+CiAgICA8dGg+TGlua3M6PC90aD4KICAgIDx0ZD57e2VhY2ggbGlua3N9fTxhIGhyZWY9Int7aHRtbCAkdmFsdWUudXJsfX0iCiAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0ie3todG1sICR2YWx1ZS51cmx9fSI+e3todG1sICR2YWx1ZS50aXRsZX19PC9hPiAmbmJzcDsge3svZWFjaH19PC90ZD4KICA8L3RyPgogIHt7L2lmfX17ey9pZn19CiAgPHRyPgogICAgPHRoPlRvdGFsIFRpbWU6PC90aD4KICAgIDx0ZD4ke3RvdGFsVGltZX08L3RkPgogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJzdWl0ZURldGFpbHNUZW1wbGF0ZSI+CiAgPHRyPgogICAgPHRoPlN0YXR1czo8L3RoPgogICAgPHRkPnt7dG1wbCgkZGF0YSkgJ3N1aXRlU3RhdHVzTWVzc2FnZVRlbXBsYXRlJ319PC90ZD4KICA8L3RyPgogIHt7aWYgZG9jKCl9fQogIDx0cj4KICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sIGRvYygpfX08L3RkPgogIDwvdHI+CiAge3svaWZ9fQogIHt7ZWFjaCBtZXRhZGF0YX19CiAgPHRyPgogICAgPHRoPnt7aHRtbCAkdmFsdWVbMF19fTo8L3RoPgogICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCAkdmFsdWVbMV19fTwvdGQ+CiAgPC90cj4KICB7ey9lYWNofX0KICB7e2lmIG1lc3NhZ2UoKX19CiAgPHRyPgogICAgPHRoPk1lc3NhZ2U6PC90aD4KICAgIDx0ZCBjbGFzcz0ibWVzc2FnZSI+e3todG1sIG1lc3NhZ2UoKX19PC90ZD4KICA8L3RyPgogIHt7L2lmfX0KICA8dHI+CiAgICA8dGg+U3RhcnQgLyBFbmQgVGltZTo8L3RoPgogICAgPHRkPiR7dGltZXMuc3RhcnRUaW1lfSAvICR7dGltZXMuZW5kVGltZX08L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRoPkVsYXBzZWQgVGltZTo8L3RoPgogICAgPHRkPiR7dGltZXMuZWxhcHNlZFRpbWV9PC90ZD4KICA8L3RyPgogIHt7aWYgJGl0ZW0ubG9nVVJMfX0KICA8dHI+CiAgICA8dGg+TG9nIEZpbGU6PC90aD4KICAgIDx0ZD48YSBocmVmPSIkeyRpdGVtLmxvZ1VSTH0jJHtpZH0iCiAgICAgICAgICAgdGl0bGU9Int7aHRtbCBmdWxsTmFtZX19Ij4keyRpdGVtLmxvZ1VSTH0jJHtpZH08L2E+PC90ZD4KICA8L3RyPgogIHt7L2lmfX0KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRlc3REZXRhaWxzVGFibGVUZW1wbGF0ZSI+CiAgPHRhYmxlIGlkPSJ0ZXN0LWRldGFpbHMiPgogICAgPHRoZWFkPgogICAgICA8dHI+CiAgICAgICAgPHRoIGNsYXNzPSJkZXRhaWxzLWNvbC1uYW1lIiB0aXRsZT0iTmFtZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC1oZWFkZXInPk5hbWU8L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtZG9jIiB0aXRsZT0iRG9jdW1lbnRhdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC10b2dnbGUnIG9uY2xpY2s9InRvZ2dsZURldGFpbHNDb2x1bW4oJ2RvYycpIj4mdGltZXM7PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC1oZWFkZXInPkRvY3VtZW50YXRpb248L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtdGFncyIgdGl0bGU9IlRhZ3MiPgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtdG9nZ2xlJyBvbmNsaWNrPSJ0b2dnbGVEZXRhaWxzQ29sdW1uKCd0YWdzJykiPiZ0aW1lczs8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLWhlYWRlcic+VGFnczwvZGl2PgogICAgICAgIDwvdGg+CiAgICAgICAgPHRoIGNsYXNzPSJkZXRhaWxzLWNvbC1zdGF0dXMiIHRpdGxlPSJTdGF0dXMiPgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5TdGF0dXM8L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtbXNnIiB0aXRsZT0iTWVzc2FnZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC10b2dnbGUnIG9uY2xpY2s9InRvZ2dsZURldGFpbHNDb2x1bW4oJ21zZycpIj4mdGltZXM7PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC1oZWFkZXInPk1lc3NhZ2U8L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtZWxhcHNlZCIgdGl0bGU9IkVsYXBzZWQgVGltZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC10b2dnbGUnIG9uY2xpY2s9InRvZ2dsZURldGFpbHNDb2x1bW4oJ2VsYXBzZWQnKSI+JnRpbWVzOzwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5FbGFwc2VkPC9kaXY+CiAgICAgICAgPC90aD4KICAgICAgICA8dGggY2xhc3M9ImRldGFpbHMtY29sLXRpbWVzIiB0aXRsZT0iU3RhcnQgVGltZSAvIEVuZCBUaW1lIj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLXRvZ2dsZScgb25jbGljaz0idG9nZ2xlRGV0YWlsc0NvbHVtbigndGltZXMnKSI+JnRpbWVzOzwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5TdGFydCAvIEVuZDwvZGl2PgogICAgICAgIDwvdGg+CiAgICAgIDwvdHI+CiAgICA8L3RoZWFkPgogICAgPHRib2R5PjwvdGJvZHk+CiAgPC90YWJsZT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRlc3REZXRhaWxzVGFibGVSb3dUZW1wbGF0ZSI+CiAge3tpZiAkaXRlbS5sb2dVUkx9fQogIDx0ciBvbmNsaWNrPSJsb2NhdGlvbiA9ICckeyRpdGVtLmxvZ1VSTH0jJHtpZH0nIiB0aXRsZT0ie3todG1sIGZ1bGxOYW1lfX0iPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1uYW1lIj4KICAgICAgPGRpdj48YSBocmVmPSIkeyRpdGVtLmxvZ1VSTH0jJHtpZH0iPjxzcGFuIGNsYXNzPSJwYXJlbnQtbmFtZSI+e3todG1sIGZvcm1hdFBhcmVudE5hbWV9fTwvc3Bhbj57e2h0bWwgbmFtZX19PC9hPjwvZGl2PgogICAgPC90ZD4KICB7e2Vsc2V9fQogIDx0ciB0aXRsZT0ie3todG1sIGZ1bGxOYW1lfX0iPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1uYW1lIj4KICAgICAgPGRpdj48c3BhbiBjbGFzcz0icGFyZW50LW5hbWUiPnt7aHRtbCBmb3JtYXRQYXJlbnROYW1lfX08L3NwYW4+e3todG1sIG5hbWV9fTwvZGl2PgogICAgPC90ZD4KICB7ey9pZn19CiAgICA8dGQgY2xhc3M9ImRldGFpbHMtY29sLWRvYyI+PGRpdiBjbGFzcz0iZG9jIGRldGFpbHMtbGltaXRlZCI+e3todG1sIGRvYygpfX08L2Rpdj48L3RkPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC10YWdzIj48ZGl2Pnt7aHRtbCB0YWdzLmpvaW4oJywgJyl9fTwvZGl2PjwvdGQ+CiAgICA8dGQgY2xhc3M9ImRldGFpbHMtY29sLXN0YXR1cyI+PGRpdj48c3BhbiBjbGFzcz0ibGFiZWwgJHtzdGF0dXMudG9Mb3dlckNhc2UoKX0iPiR7c3RhdHVzfTwvc3Bhbj48L2Rpdj48L3RkPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1tc2ciPjxkaXYgY2xhc3M9Im1lc3NhZ2UgZGV0YWlscy1saW1pdGVkIj57e2h0bWwgbWVzc2FnZSgpfX08L2Rpdj48L3RkPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1lbGFwc2VkIj48ZGl2PiR7dGltZXMuZWxhcHNlZFRpbWV9PC9kaXY+PC90ZD4KICAgIDx0ZCBjbGFzcz0iZGV0YWlscy1jb2wtdGltZXMiPjxkaXY+JHt0aW1lcy5zdGFydFRpbWV9PGJyPiR7dGltZXMuZW5kVGltZX08L2Rpdj48L3RkPgogIDwvdHI+Cjwvc2NyaXB0PgoKPC9ib2R5Pgo8L2h0bWw+Cg==';w.document.open();w.document.write(window.atob(d));w.document.close();var a=w.document.createElement('a');a.appendChild(w.document.createTextNode('Download'));a.href='data:text/html;base64,' + d;a.download='report.html';a.style='position:fixed;top:0;right:0;color:white;background:black;text-decoration:none;font-weight:bold;padding:7px 14px;border-radius:0 0 0 5px;';w.document.body.append(a);})(this);\">Report</a></p>" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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" }, "metadata": { "image/png": { "height": 165, "width": 165 } }, "output_type": "display_data" } ], "source": [ "*** Test Cases ***\n", "\n", "Show the new Robot Framework logo\n", " Open url https://twitter.com/robotframework\n", " Wait until page contains Robot Framework\n", " Sleep 1s # wait for async image to load :-o\n", " Capture and crop page screenshot robotframework.png\n", " ... css=[href=\"/robotframework/photo\"]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "text/html": [ "<p><a href=\"about:\" onClick=\"javascript:(function(el){var w=window.open();var d='PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KPG1ldGEgaHR0cC1lcXVpdj0iUHJhZ21hIiBjb250ZW50PSJuby1jYWNoZSI+CjxtZXRhIGh0dHAtZXF1aXY9IkV4cGlyZXMiIGNvbnRlbnQ9Ii0xIj4KPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIj4KPG1ldGEgY29udGVudD0iUm9ib3QgRnJhbWV3b3JrIDQuMC4zIChQeXRob24gMy45LjYgb24gbGludXgpIiBuYW1lPSJHZW5lcmF0b3IiPgo8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBRUFJQUJvQkFBQUZnQUFBQ2dBQUFBUUFBQUFJQUFBQUFFQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLY0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQXFBQUFBQUFBQUFBQUFBQUFBQUFBQUxJQUFBRC9BQUFBNEFBQUFOd0FBQURjQUFBQTNBQUFBTndBQUFEY0FBQUEzQUFBQU53QUFBRGNBQUFBNEFBQUFQOEFBQUN4QUFBQUFBQUFBS1lBQUFEL0FBQUF1d0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQy9BQUFBL3dBQUFLa0FBQUQ2QUFBQXpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU44QUFBRC9BQUFBK2dBQUFNTUFBQUFBQUFBQUFnQUFBR3NBQUFCckFBQUFhd0FBQUdzQUFBQnJBQUFBYXdBQUFHc0FBQUJyQUFBQURBQUFBQUFBQUFEYUFBQUEvd0FBQVBvQUFBRERBQUFBQUFBQUFJc0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFORUFBQUFBQUFBQTJnQUFBUDhBQUFENkFBQUF3d0FBQUFBQUFBQUFBQUFBTWdBQUFESUFBQUF5QUFBQU1nQUFBRElBQUFBeUFBQUFNZ0FBQURJQUFBQUZBQUFBQUFBQUFOb0FBQUQvQUFBQStnQUFBTU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGFBQUFBL3dBQUFQb0FBQUREQUFBQUFBQUFBRHdBQUFCOEFBQUFBQUFBQUdBQUFBQmNBQUFBQUFBQUFIOEFBQUJLQUFBQUFBQUFBQUFBQUFBQUFBQUEyZ0FBQVA4QUFBRDZBQUFBd3dBQUFBQUFBQURDQUFBQS93QUFBQ2tBQUFEcUFBQUE0UUFBQUFBQUFBRDdBQUFBL3dBQUFMQUFBQUFHQUFBQUFBQUFBTm9BQUFEL0FBQUErZ0FBQU1NQUFBQUFBQUFBSXdBQUFQNEFBQUQvQUFBQS93QUFBR0FBQUFBQUFBQUFBQUFBQU1rQUFBRC9BQUFBaWdBQUFBQUFBQURhQUFBQS93QUFBUG9BQUFEREFBQUFBQUFBQUFBQUFBQUlBQUFBY0FBQUFCa0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFZ0FBQUFBQUFBQUFBQUFBMmdBQUFQOEFBQUQ3QUFBQXl3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU40QUFBRC9BQUFBcXdBQUFQOEFBQUN2QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTElBQUFEL0FBQUFzZ0FBQUFBQUFBQzVBQUFBL3dBQUFNb0FBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQUFBREFBQUFBd0FBQUFNa0FBQUQvQUFBQXZBQUFBQUFBQUFBQUFBQUFBQUFBQUt3QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBclFBQUFBQUFBQUFBd0FNQUFJQUJBQUFmK0FBQVAvd0FBRC84QUFBZ0JBQUFQL3dBQUQvOEFBQS8vQUFBSkl3QUFESEVBQUEvL0FBQVAvd0FBQi80QUFDQUFRQUF3QU1BQUE9PSI+CjxzdHlsZSBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyI+Ci8qIEdlbmVyaWMgYW5kIG1pc2Mgc3R5bGVzICovCmJvZHkgewogICAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICBjb2xvcjogYmxhY2s7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQp0YWJsZSB7CiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBmb250LXNpemU6IDFlbTsKfQp0aCwgdGQgewogICAgdmVydGljYWwtYWxpZ246IHRvcDsKfQpiciB7CiAgICBtc28tZGF0YS1wbGFjZW1lbnQ6IHNhbWUtY2VsbDsgLyogbWFpbnRhaW4gbGluZSBicmVha3MgaW4gRXhjZWwgKi8KfQpociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KYSwgYTpsaW5rLCBhOnZpc2l0ZWQgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgY29sb3I6ICMxNWM7Cn0KYSA+IGltZyB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjMTVjICFpbXBvcnRhbnQ7Cn0KYTpob3ZlciwgYTphY3RpdmUgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICBjb2xvcjogIzYxYzsKfQoucGFyZW50LW5hbWUgewogICAgZm9udC1zaXplOiAwLjdlbTsKICAgIGxldHRlci1zcGFjaW5nOiAtMC4wN2VtOwp9Ci5tZXNzYWdlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKfQovKiBIZWFkZXJzICovCiNoZWFkZXIgewogICAgd2lkdGg6IDY1ZW07CiAgICBoZWlnaHQ6IDNlbTsKICAgIG1hcmdpbjogNnB4IDA7Cn0KaDEgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBtYXJnaW46IDAgMCAwLjVlbSAwOwogICAgd2lkdGg6IDc1JTsKfQpoMiB7CiAgICBjbGVhcjogbGVmdDsKfQojZ2VuZXJhdGVkIHsKICAgIGZsb2F0OiByaWdodDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLyogRG9jdW1lbnRhdGlvbiBoZWFkZXJzICovCi5kb2MgPiBoMiB7CiAgICBmb250LXNpemU6IDEuMmVtOwp9Ci5kb2MgPiBoMyB7CiAgICBmb250LXNpemU6IDEuMWVtOwp9Ci5kb2MgPiBoNCB7CiAgICBmb250LXNpemU6IDEuMGVtOwp9Ci8qIFN0YXR1cyB0ZXh0IGNvbG9ycyAtLSAhaW1wb3J0YW50IGFsbG93cyB1c2luZyB0aGVtIGluIGxpbmtzICovCi5mYWlsIHsKICAgIGNvbG9yOiAjY2UzZTAxICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoucGFzcyB7CiAgICBjb2xvcjogIzA5OGEwOSAhaW1wb3J0YW50Owp9Ci5za2lwIHsKICAgIGNvbG9yOiAjOTI3MjAxICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoubGFiZWwgewogICAgcGFkZGluZzogMnB4IDVweDsKICAgIGZvbnQtc2l6ZTogMC43NWVtOwogICAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogYmxhY2s7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9Ci5sYWJlbC5kZWJ1ZywgLmxhYmVsLnRyYWNlLCAubGFiZWwuZXJyb3IsIC5sYWJlbC5rZXl3b3JkIHsKICAgIGxldHRlci1zcGFjaW5nOiAwOwp9Ci5sYWJlbC5wYXNzLCAubGFiZWwuZmFpbCwgLmxhYmVsLmVycm9yLCAubGFiZWwuc2tpcCwgLmxhYmVsLndhcm4gewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLmxhYmVsLnBhc3MgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzk3YmQ2MTsKICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7Cn0KLmxhYmVsLmZhaWwsIC5sYWJlbC5lcnJvciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2UzZTAxOwogICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKfQoubGFiZWwuc2tpcCwgLmxhYmVsLndhcm4gewogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZDg0ZjsKICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7Cn0KLyogVG9wIHJpZ2h0IGhlYWRlciAqLwojdG9wLXJpZ2h0LWhlYWRlciB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDA7CiAgICByaWdodDogMDsKICAgIHotaW5kZXg6IDEwMDA7CiAgICB3aWR0aDogMTJlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQojcmVwb3J0LW9yLWxvZy1saW5rIGEgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiBibGFjazsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMWVtOwogICAgcGFkZGluZzogMC4zZW0gMDsKICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKfQojcmVwb3J0LW9yLWxvZy1saW5rIGE6aG92ZXIgewogICAgY29sb3I6ICNkZGQ7Cn0KI2xvZy1sZXZlbC1zZWxlY3RvciB7CiAgICBwYWRkaW5nOiAwLjNlbSAwOwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6ICNkZGQ7Cn0KLyogU3RhdGlzdGljcyB0YWJsZSAqLwouc3RhdGlzdGljcyB7CiAgICB3aWR0aDogNjVlbTsKICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICBlbXB0eS1jZWxsczogc2hvdzsKICAgIG1hcmdpbi1ib3R0b206IDFlbTsKfQouc3RhdGlzdGljcyB0cjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiAjZjRmNGY0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci5zdGF0aXN0aWNzIHRoLCAuc3RhdGlzdGljcyB0ZCB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgcGFkZGluZzogMC4xZW0gMC4zZW07Cn0KLnN0YXRpc3RpY3MgdGggewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKICAgIHBhZGRpbmc6IDAuMmVtIDAuM2VtOwp9Ci5zdGF0aXN0aWNzIHRkIHsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KLnN0YXRzLWNvbC1zdGF0IHsKICAgIHdpZHRoOiA0LjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc3RhdHMtY29sLWVsYXBzZWQgewogICAgd2lkdGg6IDUuNWVtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5zdGF0cy1jb2wtZ3JhcGggewogICAgd2lkdGg6IDllbTsKfQp0aC5zdGF0cy1jb2wtZ3JhcGg6aG92ZXIgewogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5zdGF0LW5hbWUgewogICAgZmxvYXQ6IGxlZnQ7Cn0KLnN0YXQtbmFtZSBhLCAuc3RhdC1uYW1lIHNwYW4gewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLnRhZy1saW5rcyB7CiAgICBmb250LXNpemU6IDAuOWVtOwogICAgZmxvYXQ6IHJpZ2h0OwogICAgbWFyZ2luLXRvcDogMC4wNWVtOwp9Ci50YWctbGlua3Mgc3BhbiB7CiAgICBtYXJnaW4tbGVmdDogMC4yZW07Cn0KLyogU3RhdGlzdGljcyBncmFwaCAqLwouZ3JhcGgsIC5lbXB0eS1ncmFwaCB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgd2lkdGg6IGF1dG87CiAgICBoZWlnaHQ6IDdweDsKICAgIHBhZGRpbmc6IDA7CiAgICBiYWNrZ3JvdW5kOiAjYWFhOwp9Ci5lbXB0eS1ncmFwaCB7CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9Ci5wYXNzLWJhciwgLmZhaWwtYmFyLCAuc2tpcC1iYXIgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBoZWlnaHQ6IDEwMCU7Cn0KLmZhaWwtYmFyIHsKICAgIGJhY2tncm91bmQ6ICNjZTNlMDE7Cn0KLnBhc3MtYmFyIHsKICAgIGJhY2tncm91bmQ6ICM5N2JkNjE7Cn0KLnNraXAtYmFyIHsKICAgIGJhY2tncm91bmQ6ICNmZWQ4NGY7Cn0KLyogVGFibGVzb3J0ZXIgLSBhZGFwdGVkIGZyb20gcHJvdmlkZWQgQmx1ZSBTa2luICovCi50YWJsZXNvcnRlci1oZWFkZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBSUFBQUg5L2Z3QUFBQ0g1QkFFQUFBRUFMQUFBQUFBTEFBa0FBQUlSakFPbkJyM2NuSXIwV1VqVHJDOWU5QlFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIHJpZ2h0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci50YWJsZXNvcnRlci1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKfQoudGFibGVzb3J0ZXItaGVhZGVyQXNjIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhDd0FKQUtFQUFBQUFBSDkvZndBQUFBQUFBQ0g1QkFFQUFBSUFMQUFBQUFBTEFBa0FBQUlVbEJXbkZyM2NuSXIwV1FPeUJtdnpwMTNDcHhRQU93PT0pOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYyAhaW1wb3J0YW50Owp9Ci50YWJsZXNvcnRlci1oZWFkZXJEZXNjIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhDd0FKQUtFQUFBQUFBSDkvZndBQUFBQUFBQ0g1QkFFQUFBSUFMQUFBQUFBTEFBa0FBQUlVbEFXbkJyM2NuSXIwV1JPeURtdnpwMTNDcHhRQU93PT0pOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYyAhaW1wb3J0YW50Owp9Ci5zb3J0ZXItZmFsc2UgewogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQouc29ydGVyLWZhbHNlOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIj4KLyogSWNvbnMgYXJlIGZyb20gT3BlbiBJY29uaWMgPGh0dHBzOi8vdXNlaWNvbmljLmNvbS9vcGVuLz4uCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gKi8KLyogQ29udGFpbmVycyAqLwouc3VpdGUsIC50ZXN0LCAjZXJyb3JzIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBwYWRkaW5nOiAwLjNlbSAwLjJlbTsKICAgIG1hcmdpbjogMC4yZW0gMDsKfQoudGVzdCB7CiAgICBib3JkZXItc3R5bGU6IGRhc2hlZDsKfQojZXJyb3JzLCAubWVzc2FnZXMgewogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXItc3BhY2luZzogMDsKfQouY2hpbGRyZW4gewogICAgZGlzcGxheTogbm9uZTsKICAgIG1hcmdpbi1sZWZ0OiAxLjRlbTsKfQouc3VpdGUsIC50ZXN0LCAua2V5d29yZCB7CiAgICBtYXJnaW4tbGVmdDogLTAuMmVtOwp9CiNzMSwgLnN1aXRlID4gLmNoaWxkcmVuID4gLmtleXdvcmQgewogICAgbWFyZ2luLWxlZnQ6IDA7Cn0KLyogU3VpdGUsIHRlc3QgYW5kIGt3IGhlYWRlcnMgKi8KLmVsZW1lbnQtaGVhZGVyIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9Ci5lbGVtZW50LWhlYWRlcjpob3ZlciB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwogICAgYm9yZGVyLWNvbG9yOiAjY2NjOwp9Ci5lbGVtZW50LWhlYWRlci10b2dnbGUgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogM3B4OwogICAgdG9wOiA1cHg7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVlBQUFBR0NBUUFBQUJLeFNmREFBQUFBbUpMUjBRQS80ZVB6TDhBQUFBSmNFaFpjd0FBQ3hNQUFBc1RBUUNhbkJnQUFBQUhkRWxOUlFmZUNSMEpDaFNrWnoyMEFBQUFHa2xFUVZRSTEyTmdRQUtNREt6SW5QOElEaE9xTWs0RzdBQUFOUXdCRTQyN1BZVUFBQUFBU1VWT1JLNUNZSUk9KTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTRJaUJvWldsbmFIUTlJamdpSUhacFpYZENiM2c5SWpBZ01DQTRJRGdpUGdvZ0lEeHdZWFJvSUdROUlrMHdJREIyTW1nNGRpMHlhQzA0ZWlJZ2RISmhibk5tYjNKdFBTSjBjbUZ1YzJ4aGRHVW9NQ0F6S1NJZ0x6NEtQQzl6ZG1jKyksIG5vbmU7CiAgICBoZWlnaHQ6IDEwcHg7CiAgICB3aWR0aDogMTBweDsKICAgIGJhY2tncm91bmQtc2l6ZTogNnB4IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBib3JkZXItcmFkaXVzOiAycHg7Cn0KLmNsb3NlZCA+IC5lbGVtZW50LWhlYWRlci10b2dnbGUgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVlBQUFBR0NBUUFBQUJLeFNmREFBQUFBbUpMUjBRQS80ZVB6TDhBQUFBSmNFaFpjd0FBQ3hNQUFBc1RBUUNhbkJnQUFBQUhkRWxOUlFmZUNSMEpDREhkVll0eEFBQUFNMGxFUVZRSTEwM01NUXFBTUJRRndWSHlJVGFCM1ArVzFzS3pTQkMzbVc2aFJGdzBwVUI1RHZGMWJ1OUZOMFJNM1gvd0FrOThDVW52RlRha0FBQUFBRWxGVGtTdVFtQ0MpOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJNElpQm9aV2xuYUhROUlqZ2lJSFpwWlhkQ2IzZzlJakFnTUNBNElEZ2lQZ29nSUR4d1lYUm9JR1E5SWsweklEQjJNMmd0TTNZeWFETjJNMmd5ZGkwemFETjJMVEpvTFROMkxUTm9MVEo2SWlBdlBnbzhMM04yWno0PSksIG5vbmU7Cn0KLmVsZW1lbnQtaGVhZGVyOmhvdmVyID4gLmVsZW1lbnQtaGVhZGVyLXRvZ2dsZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9Ci5lbGVtZW50LWhlYWRlci1yaWdodDpob3ZlciB+IC5lbGVtZW50LWhlYWRlci10b2dnbGUgewogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KLmVsZW1lbnQtaGVhZGVyLWxlZnQgewogICAgcGFkZGluZzogM3B4IDgwcHggM3B4IDIwcHg7Cn0KLmVsZW1lbnQtaGVhZGVyLXJpZ2h0IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiAwOwogICAgcGFkZGluZzogM3B4OwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5uYW1lIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9Ci5lbGFwc2VkIHsKICAgIGZsb2F0OiByaWdodDsKICAgIGNvbG9yOiAjNjY2OwogICAgcGFkZGluZy1sZWZ0OiAxZW07Cn0KLmxpbmsgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQWdBQUFBSUNBWUFBQURFRDc2TEFBQUFCSE5DU1ZRSUNBZ0lmQWhraUFBQUFBbHdTRmx6QUFBTEV3QUFDeE1CQUpxY0dBQUFBSGxKUkVGVUdKVnR6ckVKd21BUUJ0Q242QVN1SUtUSUJoWTJnbWdoQmlKWUIxdWR3azEwQjhGSmJLTUJjUUZidGJrZkpIclZ3ZnUrNC9pZEpSNjRZOUg3RTNoaWdqNU8zUzhZNDRBcExuamhuWENOR2hWMnlOR2dnREp3aUMwMmdhdlVicERGdnNjUm80UWRYT01LREhCdWZ6M0hMWUt6Tm40QWJTa1YzZm5jR1FZQUFBQUFTVVZPUks1Q1lJST0pOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJNElpQm9aV2xuYUhROUlqZ2lJSFpwWlhkQ2IzZzlJakFnTUNBNElEZ2lQZ29nSUR4d1lYUm9JR1E5SWswMUxqZzRMakF6WXkwdU1UZ3VNREV0TGpNMkxqQXpMUzQxTXk0d09TMHVNamN1TVMwdU5UTXVNalV0TGpjMUxqUTNZUzQxTGpVZ01DQXhJREFnTGpZNUxqWTVZeTR4TVMwdU1URXVNalF0TGpFM0xqTTRMUzR5TWk0ek5TMHVNVEl1TnpndExqQTNJREV1TURZdU1qSXVNemt1TXprdU16a2dNUzR3TkNBd0lERXVORFJzTFRFdU5TQXhMalZqTFM0ME5DNDBOQzB1T0M0ME9DMHhMakEyTGpRM0xTNHlOaTB1TURFdExqUXhMUzR4TXkwdU5ERXRMakV6WVM0MUxqVWdNQ0F4SURBdExqVXVPRGh6TGpNMExqSXlMamcwTGpJMVl5NDFMakF6SURFdU1pMHVNVFlnTVM0NE1TMHVOemhzTVM0MUxURXVOV011TnpndExqYzRMamM0TFRJdU1EUWdNQzB5TGpneExTNHlPQzB1TWpndExqWXhMUzQwTlMwdU9UY3RMalV6TFM0eE9DMHVNRFF0TGpNNExTNHdOQzB1TlRZdExqQXplbTB0TWlBeUxqTXhZeTB1TlMwdU1ESXRNUzR4T1M0eE5TMHhMamM0TGpjMWJDMHhMalVnTVM0MVl5MHVOemd1TnpndExqYzRJREl1TURRZ01DQXlMamd4TGpVMkxqVTJJREV1TXpZdU56SWdNaTR3Tmk0ME55NHlOeTB1TVM0MU15MHVNalV1TnpVdExqUTNZUzQxTGpVZ01DQXhJREF0TGpZNUxTNDJPV010TGpFeExqRXhMUzR5TkM0eE55MHVNemd1TWpJdExqTTFMakV5TFM0M09DNHdOeTB4TGpBMkxTNHlNaTB1TXprdExqTTVMUzR6T1MweExqQTBJREF0TVM0ME5Hd3hMalV0TVM0MVl5NDBMUzQwTGpjMUxTNDBOU0F4TGpBekxTNDBOQzR5T0M0d01TNDBOeTR3T1M0ME55NHdPV0V1TlM0MUlEQWdNU0F3SUM0ME5DMHVPRGh6TFM0ek5DMHVNaTB1T0RRdExqSXllaUlLSUNBdlBnbzhMM04yWno0PSksIG5vbmU7Cn0KLmV4cGFuZCB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBZ0FBQUFJQ0FZQUFBREVENzZMQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUFMRXdBQUN4TUJBSnFjR0FBQUFEdEpSRUZVR0pWallDQUNLREF3TUJ5QTBsakZEakF3TVB4bllHQjRBQlZRZ0xML1ErVlFCQjZnc2VHbUlpdkNrRVJYaEZVU1dSRk9TYXdBQUVsN0UzdXYxaU1jQUFBQUFFbEZUa1N1UW1DQyk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0k0SWlCb1pXbG5hSFE5SWpnaUlIWnBaWGRDYjNnOUlqQWdNQ0E0SURnaVBnb2dJRHh3WVhSb0lHUTlJazB4TGpVZ01Hd3RNUzQxSURFdU5TQTBJRFFnTkMwMExURXVOUzB4TGpVdE1pNDFJREl1TlMweUxqVXRNaTQxZWlJZ2RISmhibk5tYjNKdFBTSjBjbUZ1YzJ4aGRHVW9NQ0F4S1NJZ0x6NEtQQzl6ZG1jKyksIG5vbmU7Cn0KLmNvbGxhcHNlIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFnQUFBQUlDQVlBQUFERUQ3NkxBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQUxFd0FBQ3hNQkFKcWNHQUFBQUM1SlJFRlVHSlZqWUNBUk5FQXhUc24vVUl5aENGa1NReEc2VGhRK0M1SXBqV2hHMXlOYjRZREZUZGpFTUFFQUNpOFErKzlZOVRBQUFBQUFTVVZPUks1Q1lJST0pOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJNElpQm9aV2xuYUhROUlqZ2lJSFpwWlhkQ2IzZzlJakFnTUNBNElEZ2lQZ29nSUR4d1lYUm9JR1E5SWswMElEQnNMVFFnTkNBeExqVWdNUzQxSURJdU5TMHlMalVnTWk0MUlESXVOU0F4TGpVdE1TNDFMVFF0TkhvaUlIUnlZVzV6Wm05eWJUMGlkSEpoYm5Oc1lYUmxLREFnTVNraUlDOCtDand2YzNablBnPT0pLCBub25lOwp9Ci5leHBhbmQsIC5jb2xsYXBzZSwgLmxpbmsgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIG1hcmdpbjogMCA0cHg7CiAgICBoZWlnaHQ6IDE0cHg7CiAgICB3aWR0aDogMTRweDsKICAgIGJhY2tncm91bmQtc2l6ZTogOHB4IDhweDsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9Ci5saW5rIHsKICAgIGJhY2tncm91bmQtc2l6ZTogMTBweCAxMHB4Owp9Ci5lbGVtZW50LWhlYWRlcjpob3ZlciBhIHsKICAgIHZpc2liaWxpdHk6IHZpc2libGU7Cn0KLmV4cGFuZDpob3ZlciwgLmNvbGxhcHNlOmhvdmVyLCAubGluazpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9Ci8qIE1lc3NhZ2VzIGFuZCBlcnJvcnMgKi8KLm1lc3NhZ2VzIC50aW1lLCAubWVzc2FnZXMgLm1lc3NhZ2UgewogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogMS4xZW07Cn0KI2Vycm9ycyAubWVzc2FnZSB7CiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgZm9udC1zaXplOiAxLjJlbTsKfQoubWVzc2FnZS1yb3cgewogICAgaGVpZ2h0OiAyMHB4Owp9Ci50aW1lIHsKICAgIHdpZHRoOiA3LjVlbTsKfQouZXJyb3ItdGltZSB7CiAgICB3aWR0aDogMTFlbTsKICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5sZXZlbCB7CiAgICB3aWR0aDogNWVtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5zZWxlY3QtbWVzc2FnZSB7CiAgICB3aWR0aDogMjRweDsKfQouc2VsZWN0LW1lc3NhZ2UgPiBkaXYgewogICAgZmxvYXQ6IHJpZ2h0OwogICAgbWFyZ2luLXJpZ2h0OiAycHg7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICB3aWR0aDogMTZweDsKICAgIGJhY2tncm91bmQtc2l6ZTogMTJweCAxMnB4OwogICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsKfQoubWVzc2FnZS1yb3c6aG92ZXIgLnNlbGVjdC1tZXNzYWdlIGRpdiB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBd0FBQUFNQ0FRQUFBRDhmSlJzQUFBQUFtSkxSMFFBLzRlUHpMOEFBQUFKY0VoWmN3QUFDeE1BQUFzVEFRQ2FuQmdBQUFBSGRFbE5SUWZlQ1IwTU96aFdLWlFPQUFBQVNVbEVRVlFZMDMyUHNSSEFJQXdEWDlCa2ljRCtXOFVNRXFlZ0FRSldLWi8rM3NMWkpoRkdRRVp6TmFJYTRpYmg2NkVuODY3Vk5hSWVvUDVXcHBOdUlHb0FsT20zZzVWQzFBZFllUXYxQlpQUlNnQUFBQUJKUlU1RXJrSmdnZz09KTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTRJaUJvWldsbmFIUTlJamdpSUhacFpYZENiM2c5SWpBZ01DQTRJRGdpUGdvZ0lEeHdZWFJvSUdROUlrMHdJREIyTVdnNGRpMHhhQzA0ZW0wd0lESjJNV2cyZGkweGFDMDJlbTB3SURKMk1XZzRkaTB4YUMwNGVtMHdJREoyTVdnMmRpMHhhQzAyZWlJZ0x6NEtQQzl6ZG1jKyksIG5vbmU7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9Ci5zZWxlY3QtbWVzc2FnZTpob3ZlciBkaXYgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQovKiBNZXNzYWdlIHRhYmxlcyAtIHRoZXNlIE1VU1QgTk9UIGJlIGNvbWJpbmVkIHRvZ2V0aGVyIGJlY2F1c2Ugb3RoZXJ3aXNlCiAgIGR5bmFtaWNhbGx5IGFsdGVyaW5nIHRoZW0gYmFzZWQgb24gdmlzaWJsZSBsb2cgbGV2ZWwgaXMgbm90IHBvc3NpYmxlLiAqLwoudHJhY2UtbWVzc2FnZSB7CiAgICBkaXNwbGF5OiB0YWJsZTsKfQouZGVidWctbWVzc2FnZSB7CiAgICBkaXNwbGF5OiB0YWJsZTsKfQovKiBNZXRhZGF0YSAqLwoubWV0YWRhdGEgewogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXItc3BhY2luZzogMC4yZW07Cn0KLm1ldGFkYXRhIHRoIHsKICAgIHdpZHRoOiAxMmVtOwogICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KLm1ldGFkYXRhIHRkIHsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cn0KLmtleXdvcmQtbWV0YWRhdGEgewogICAgZm9udC1zaXplOiAwLjllbTsKfQovKiBDdXN0b20gc3R5bGVzIGZvciBzdGF0aXN0aWNzICovCiN0b3RhbC1zdGF0cyB0cjpob3ZlciwgI3RhZy1zdGF0cyB0cjpob3ZlciB7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJwcmludCIgdHlwZT0idGV4dC9jc3MiPgpib2R5IHsKICAgIGJhY2tncm91bmQ6IHdoaXRlICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nOiAwOwogICAgZm9udC1zaXplOiA4cHQ7Cn0KYTpsaW5rLCBhOnZpc2l0ZWQgewogICAgY29sb3I6IGJsYWNrOwp9CiNoZWFkZXIgewogICAgd2lkdGg6IGF1dG87Cn0KLmRldGFpbHMsIC5zdGF0aXN0aWNzIHsKICAgIHdpZHRoOiAxMDAlOwp9CiNnZW5lcmF0ZWQtYWdvLCAjdG9wLXJpZ2h0LWhlYWRlciwgI25vcm1hbC1zZWxlY3RvciwgI3NlYXJjaC1idXR0b25zLAouZm9sZGluZy1idXR0b24sIC5leHBhbmQsIC5oaWRkZW4sIC5kZXRhaWxzLWNvbC10b2dnbGUgewogICAgZGlzcGxheTogbm9uZTsKfQouZWxlbWVudC1oZWFkZXItdGV4dCwgLmNoaWxkcmVuIHsKICAgIG1hcmdpbjogMDsKfQojdGVzdC1kZXRhaWxzIHsKICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQojdGVzdC1kZXRhaWxzIHRoLCAjdGVzdC1kZXRhaWxzIHRkIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0KLmRldGFpbHMtY29sLWhlYWRlciB7CiAgICBwYWRkaW5nOiAwOwp9CiNwcmludC1zZWxlY3RvciB7CiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOwp9Ci50YWJsZXNvcnRlci1oZWFkZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgIGJhY2tncm91bmQ6ICNkZGQgIWltcG9ydGFudDsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgojamF2YXNjcmlwdC1kaXNhYmxlZCB7CiAgICB3aWR0aDogNjAwcHg7CiAgICBtYXJnaW46IDEwMHB4IGF1dG8gMCBhdXRvOwogICAgcGFkZGluZzogMjBweDsKICAgIGNvbG9yOiBibGFjazsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9CiNqYXZhc2NyaXB0LWRpc2FibGVkIGgxIHsKICAgIHdpZHRoOiAxMDAlOwogICAgZmxvYXQ6IG5vbmU7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgdWwgewogICAgZm9udC1zaXplOiAxLjJlbTsKfQojamF2YXNjcmlwdC1kaXNhYmxlZCBsaSB7CiAgICBtYXJnaW46IDAuNWVtIDA7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgYiB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIj4KLmRvYyA+ICogewogICAgbWFyZ2luOiAwLjdlbSAxZW0gMC4xZW0gMWVtOwogICAgcGFkZGluZzogMDsKfQouZG9jID4gcCwgLmRvYyA+IGgxLCAuZG9jID4gaDIsIC5kb2MgPiBoMywgLmRvYyA+IGg0IHsKICAgIG1hcmdpbjogMC43ZW0gMCAwLjFlbSAwOwp9Ci5kb2MgPiAqOmZpcnN0LWNoaWxkIHsKICAgIG1hcmdpbi10b3A6IDAuMWVtOwp9Ci5kb2MgdGFibGUgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGVtcHR5LWNlbGxzOiBzaG93OwogICAgZm9udC1zaXplOiAwLjllbTsKfQouZG9jIHRhYmxlIHRoLCAuZG9jIHRhYmxlIHRkIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIHBhZGRpbmc6IDAuMWVtIDAuM2VtOwogICAgaGVpZ2h0OiAxLjJlbTsKfQouZG9jIHRhYmxlIHRoIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTsKfQouZG9jIHByZSB7CiAgICBmb250LXNpemU6IDEuMWVtOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgIGJhY2tncm91bmQ6ICNmNGY0ZjQ7Cn0KLmRvYyBjb2RlIHsKICAgIHBhZGRpbmc6IDAgMC4yZW07CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogICAgYmFja2dyb3VuZDogI2VlZTsKfQouZG9jIGxpIHsKICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IGluc2lkZTsKICAgIGxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOwp9Ci5kb2MgaW1nIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0KLmRvYyBociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KPC9zdHlsZT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp2YXIgTEVWRUxTID0ge1RSQUNFOiAwLCBERUJVRzogMSwgSU5GTzogMiwgV0FSTjogMywgRkFJTDogNCwgTk9ORTogNX07CmZ1bmN0aW9uIHRvZ2dsZVN1aXRlKHN1aXRlSWQpIHsKICAgIHRvZ2dsZUVsZW1lbnQoc3VpdGVJZCwgWydrZXl3b3JkJywgJ3N1aXRlJywgJ3Rlc3QnXSk7Cn0KZnVuY3Rpb24gdG9nZ2xlVGVzdCh0ZXN0SWQpIHsKICAgIHRvZ2dsZUVsZW1lbnQodGVzdElkLCBbJ2tleXdvcmQnXSk7Cn0KZnVuY3Rpb24gdG9nZ2xlS2V5d29yZChrd0lkKSB7CiAgICB0b2dnbGVFbGVtZW50KGt3SWQsIFsna2V5d29yZCddKTsKfQpmdW5jdGlvbiB0b2dnbGVFbGVtZW50KGVsZW1lbnRJZCwgY2hpbGRyZW5OYW1lcykgewogICAgdmFyIGVsZW1lbnQgPSAkKCcjJyArIGVsZW1lbnRJZCk7CiAgICB2YXIgY2hpbGRyZW4gPSBlbGVtZW50LmNoaWxkcmVuKCcuY2hpbGRyZW4nKTsKICAgIGNoaWxkcmVuLnRvZ2dsZSgxMDAsICcnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgZWxlbWVudC5jaGlsZHJlbignLmVsZW1lbnQtaGVhZGVyJykudG9nZ2xlQ2xhc3MoJ2Nsb3NlZCcpOwogICAgfSk7CiAgICBwb3B1bGF0ZUNoaWxkcmVuKGVsZW1lbnRJZCwgY2hpbGRyZW4sIGNoaWxkcmVuTmFtZXMpOwp9CmZ1bmN0aW9uIHBvcHVsYXRlQ2hpbGRyZW4oZWxlbWVudElkLCBjaGlsZEVsZW1lbnQsIGNoaWxkcmVuTmFtZXMpIHsKICAgIGlmICghY2hpbGRFbGVtZW50Lmhhc0NsYXNzKCdwb3B1bGF0ZWQnKSkgewogICAgICAgIHZhciBlbGVtZW50ID0gd2luZG93LnRlc3RkYXRhLmZpbmRMb2FkZWQoZWxlbWVudElkKTsKICAgICAgICB2YXIgY2FsbGJhY2sgPSBkcmF3Q2FsbGJhY2soZWxlbWVudCwgY2hpbGRFbGVtZW50LCBjaGlsZHJlbk5hbWVzKTsKICAgICAgICBlbGVtZW50LmNhbGxXaGVuQ2hpbGRyZW5SZWFkeShjYWxsYmFjayk7CiAgICAgICAgY2hpbGRFbGVtZW50LmFkZENsYXNzKCdwb3B1bGF0ZWQnKTsKICAgIH0KfQpmdW5jdGlvbiBkcmF3Q2FsbGJhY2soZWxlbWVudCwgY2hpbGRFbGVtZW50LCBjaGlsZHJlbk5hbWVzKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgIHV0aWwubWFwKGNoaWxkcmVuTmFtZXMsIGZ1bmN0aW9uIChjaGlsZE5hbWUpIHsKICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gZWxlbWVudFtjaGlsZE5hbWUgKyAncyddKCk7CiAgICAgICAgICAgIHV0aWwubWFwKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHsKICAgICAgICAgICAgICAgICQudG1wbChjaGlsZC50ZW1wbGF0ZSwgY2hpbGQpLmFwcGVuZFRvKGNoaWxkRWxlbWVudCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfQp9CmZ1bmN0aW9uIGV4cGFuZFN1aXRlKHN1aXRlKSB7CiAgICBpZiAoc3VpdGUuc3RhdHVzID09ICJQQVNTIikKICAgICAgICBleHBhbmRFbGVtZW50KHN1aXRlKTsKICAgIGVsc2UKICAgICAgICBleHBhbmRGYWlsZWQoc3VpdGUpOwp9CmZ1bmN0aW9uIGV4cGFuZEVsZW1lbnQoaXRlbSwgcmV0cnlDb3VudCkgewogICAgcmV0cnlDb3VudCA9IHR5cGVvZiByZXRyeUNvdW50ICE9PSAndW5kZWZpbmVkJyA/IHJldHJ5Q291bnQgOiAzOwogICAgdmFyIGVsZW1lbnQgPSAkKCcjJyArIGl0ZW0uaWQpOwogICAgdmFyIGNoaWxkcmVuID0gZWxlbWVudC5jaGlsZHJlbignLmNoaWxkcmVuJyk7CiAgICAvLyAuY3NzIGlzIGZhc3RlciB0aGFuIC5zaG93IGFuZCAuc2hvdyB3LyBjYWxsYmFjayBpcyB0ZXJyaWJseSBzbG93CiAgICBjaGlsZHJlbi5jc3MoeydkaXNwbGF5JzogJ2Jsb2NrJ30pOwogICAgLy8gaW4gcmFyZSBjYXNlcyBvbiBsYXJnZSBsb2dzIGNvbmN1cnJlbnQgZXhwYW5kaW5nIGZhaWxzID0+IHJldHJ5CiAgICBpZiAoY2hpbGRyZW4uY3NzKCdkaXNwbGF5JykgIT0gJ2Jsb2NrJyAmJiByZXRyeUNvdW50ID4gMCkgewogICAgICAgIGNvbnNvbGUuZGVidWcoJ2V4cGFuZEVsZW1lbnQgJytpdGVtLmlkKycgZmFpbGVkISBwbGFubmluZyByZXRyeS4uLicpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGV4cGFuZEVsZW1lbnQoaXRlbSwgcmV0cnlDb3VudC0xKTsgfSwgMCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcG9wdWxhdGVDaGlsZHJlbihpdGVtLmlkLCBjaGlsZHJlbiwgaXRlbS5jaGlsZHJlbk5hbWVzKTsKICAgIGVsZW1lbnQuY2hpbGRyZW4oJy5lbGVtZW50LWhlYWRlcicpLnJlbW92ZUNsYXNzKCdjbG9zZWQnKTsKfQpmdW5jdGlvbiBleHBhbmRFbGVtZW50V2l0aElkKGVsZW1lbnRpZCkgewogICAgZXhwYW5kRWxlbWVudCh3aW5kb3cudGVzdGRhdGEuZmluZExvYWRlZChlbGVtZW50aWQpKTsKfQpmdW5jdGlvbiBleHBhbmRFbGVtZW50c1dpdGhJZHMoaWRzKSB7CiAgICB1dGlsLm1hcChpZHMsIGV4cGFuZEVsZW1lbnRXaXRoSWQpOwp9CmZ1bmN0aW9uIGxvYWRBbmRFeHBhbmRFbGVtZW50SWRzKGlkcykgewogICAgZm9yICh2YXIgaSBpbiBpZHMpIHsKICAgICAgICB3aW5kb3cudGVzdGRhdGEuZW5zdXJlTG9hZGVkKGlkc1tpXSwgZXhwYW5kRWxlbWVudHNXaXRoSWRzKTsKICAgIH0KfQpmdW5jdGlvbiBleHBhbmRGYWlsZWQoZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQuc3RhdHVzID09ICJGQUlMIikgewogICAgICAgIHdpbmRvdy5lbGVtZW50c1RvRXhwYW5kID0gW2VsZW1lbnRdOwogICAgICAgIHdpbmRvdy5leHBhbmREZWNpZGVyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgcmV0dXJuIGUuc3RhdHVzID09ICJGQUlMIjsKICAgICAgICB9OwogICAgICAgIGV4cGFuZFJlY3Vyc2l2ZWx5KCk7CiAgICB9Cn0KZnVuY3Rpb24gZXhwYW5kQWxsKGVsZW1lbnRJZCkgewogICAgd2luZG93LmVsZW1lbnRzVG9FeHBhbmQgPSBbd2luZG93LnRlc3RkYXRhLmZpbmRMb2FkZWQoZWxlbWVudElkKV07CiAgICB3aW5kb3cuZXhwYW5kRGVjaWRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07CiAgICBleHBhbmRSZWN1cnNpdmVseSgpOwp9CmZ1bmN0aW9uIGV4cGFuZFJlY3Vyc2l2ZWx5KCkgewogICAgaWYgKCF3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5sZW5ndGgpCiAgICAgICAgcmV0dXJuOwogICAgdmFyIGVsZW1lbnQgPSB3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5wb3AoKTsKICAgIGlmICghZWxlbWVudCB8fCBlbGVtZW50SGlkZGVuQnlVc2VyKGVsZW1lbnQuaWQpKSB7CiAgICAgICAgd2luZG93LmVsZW1lbnRzVG9FeHBhbmQgPSBbXTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBleHBhbmRFbGVtZW50KGVsZW1lbnQpOwogICAgZWxlbWVudC5jYWxsV2hlbkNoaWxkcmVuUmVhZHkoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oKTsKICAgICAgICBmb3IgKHZhciBpID0gY2hpbGRyZW4ubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgICAgICBpZiAoY2hpbGQudHlwZSAhPSAnbWVzc2FnZScgJiYgd2luZG93LmV4cGFuZERlY2lkZXIoY2hpbGQpKQogICAgICAgICAgICAgICAgd2luZG93LmVsZW1lbnRzVG9FeHBhbmQucHVzaChjaGlsZCk7CiAgICAgICAgfQogICAgICAgIGlmICh3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5sZW5ndGgpCiAgICAgICAgICAgIHNldFRpbWVvdXQoZXhwYW5kUmVjdXJzaXZlbHksIDApOwogICAgfSk7Cn0KZnVuY3Rpb24gZWxlbWVudEhpZGRlbkJ5VXNlcihpZCkgewogICAgdmFyIGVsZW1lbnQgPSAkKCcjJyArIGlkKTsKICAgIHJldHVybiAhZWxlbWVudC5pcygiOnZpc2libGUiKTsKfQpmdW5jdGlvbiBjb2xsYXBzZUFsbChpZCkgewogICAgdmFyIGVsZW1lbnQgPSAkKCcjJyArIGlkKTsKICAgIGVsZW1lbnQuZmluZCgnLmNoaWxkcmVuJykuY3NzKHsnZGlzcGxheSc6ICdub25lJ30pOwogICAgZWxlbWVudC5maW5kKCcuZWxlbWVudC1oZWFkZXInKS5hZGRDbGFzcygnY2xvc2VkJyk7Cn0KZnVuY3Rpb24gbG9nTGV2ZWxTZWxlY3RlZChsZXZlbCkgewogICAgdmFyIGFuY2hvcnMgPSBnZXRWaWV3QW5jaG9yRWxlbWVudHMoKTsKICAgIHNldE1lc3NhZ2VWaXNpYmlsaXR5KGxldmVsKTsKICAgIHNjcm9sbFRvU2hvcnRlc3RWaXNpYmxlQW5jaG9yRWxlbWVudChhbmNob3JzKTsKfQpmdW5jdGlvbiBnZXRWaWV3QW5jaG9yRWxlbWVudHMoKSB7CiAgICB2YXIgZWxlbTEgPSAkKGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoMTAwLCAwKSk7CiAgICB2YXIgZWxlbTIgPSAkKGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoMTAwLCAyMCkpOwogICAgcmV0dXJuIFtlbGVtMSwgZWxlbTJdOwp9CmZ1bmN0aW9uIHNjcm9sbFRvU2hvcnRlc3RWaXNpYmxlQW5jaG9yRWxlbWVudChhbmNob3JzKSB7CiAgICBhbmNob3JzID0gdXRpbC5tYXAoYW5jaG9ycywgY2xvc2VzdFZpc2libGVQYXJlbnQpOwogICAgdmFyIHNob3J0ZXN0ID0gYW5jaG9yc1swXTsKICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYW5jaG9ycy5sZW5ndGg7IGkrKykKICAgICAgICBpZiAoc2hvcnRlc3QuaGVpZ2h0KCkgPiBhbmNob3JzW2ldLmhlaWdodCgpKQogICAgICAgICAgICBzaG9ydGVzdCA9IGFuY2hvcnNbaV07CiAgICBzaG9ydGVzdC5nZXQoKVswXS5zY3JvbGxJbnRvVmlldyh0cnVlKTsKfQpmdW5jdGlvbiBzZXRNZXNzYWdlVmlzaWJpbGl0eShsZXZlbCkgewogICAgbGV2ZWwgPSBwYXJzZUludChsZXZlbCk7CiAgICBjaGFuZ2VDbGFzc0Rpc3BsYXkoIi50cmFjZS1tZXNzYWdlIiwgbGV2ZWwgPD0gTEVWRUxTLlRSQUNFKTsKICAgIGNoYW5nZUNsYXNzRGlzcGxheSgiLmRlYnVnLW1lc3NhZ2UiLCBsZXZlbCA8PSBMRVZFTFMuREVCVUcpOwogICAgY2hhbmdlQ2xhc3NEaXNwbGF5KCIuaW5mby1tZXNzYWdlIiwgbGV2ZWwgPD0gTEVWRUxTLklORk8pOwp9CmZ1bmN0aW9uIGNsb3Nlc3RWaXNpYmxlUGFyZW50KGVsZW0pIHsKICAgIHdoaWxlICghZWxlbS5pcygiOnZpc2libGUiKSkKICAgICAgICBlbGVtID0gZWxlbS5wYXJlbnQoKTsKICAgIHJldHVybiBlbGVtOwp9CmZ1bmN0aW9uIGNoYW5nZUNsYXNzRGlzcGxheShjbGF6eiwgdmlzaWJsZSkgewogICAgdmFyIHN0eWxlcyA9IGRvY3VtZW50LnN0eWxlU2hlZXRzOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgcnVsZXMgPSBnZXRSdWxlcyhzdHlsZXNbaV0pOwogICAgICAgIGlmIChydWxlcyA9PT0gbnVsbCkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBydWxlcy5sZW5ndGg7IGorKykKICAgICAgICAgICAgaWYgKHJ1bGVzW2pdLnNlbGVjdG9yVGV4dCA9PT0gY2xhenopCiAgICAgICAgICAgICAgICBydWxlc1tqXS5zdHlsZS5kaXNwbGF5ID0gdmlzaWJsZSA/ICJ0YWJsZSIgOiAibm9uZSI7CiAgICB9Cn0KZnVuY3Rpb24gZ2V0UnVsZXMoc3R5bGUpIHsKICAgIC8vIFdpdGggQ2hyb21lIGV4dGVybmFsIENTUyBmaWxlcyBzZWVtIHRvIGhhdmUgb25seSBudWxsIHJvbGVzIGFuZCB3aXRoCiAgICAvLyBGaXJlZm94IGFjY2Vzc2luZyBydWxlcyBjYW4gcmVzdWx0IHRvIHNlY3VyaXR5IGVycm9yLgogICAgLy8gTmVpdGhlciBvZiB0aGVzZSBhcmUgYSBwcm9ibGVtIG9uIHdpdGggZ2VuZXJhdGVkIGxvZ3MuCiAgICB0cnkgewogICAgICAgIHJldHVybiBzdHlsZS5jc3NSdWxlcyB8fCBzdHlsZS5ydWxlczsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQpmdW5jdGlvbiBzZWxlY3RNZXNzYWdlKHBhcmVudElkKSB7CiAgICB2YXIgZWxlbWVudCA9ICQoJyMnICsgcGFyZW50SWQpLmZpbmQoJy5tZXNzYWdlJykuZ2V0KDApOwogICAgc2VsZWN0VGV4dChlbGVtZW50KTsKfQpmdW5jdGlvbiBzZWxlY3RUZXh0KGVsZW1lbnQpIHsKICAgIC8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvOTg1MjcyCiAgICB2YXIgcmFuZ2UsIHNlbGVjdGlvbjsKICAgIGlmIChkb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSkgeyAgLy8gSUUgOAogICAgICAgIHJhbmdlID0gZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsKICAgICAgICByYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChlbGVtZW50KTsKICAgICAgICByYW5nZS5zZWxlY3QoKTsKICAgIH0gZWxzZSBpZiAod2luZG93LmdldFNlbGVjdGlvbikgeyAgLy8gT3RoZXJzCiAgICAgICAgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAgIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7CiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7CiAgICB9Cn0KZnVuY3Rpb24gTG9nTGV2ZWxDb250cm9sbGVyKG1pbkxldmVsLCBkZWZhdWx0TGV2ZWwpIHsKICAgIG1pbkxldmVsID0gTEVWRUxTW21pbkxldmVsXTsKICAgIGRlZmF1bHRMZXZlbCA9IExFVkVMU1tkZWZhdWx0TGV2ZWxdOwogICAgZnVuY3Rpb24gc2hvd0xvZ0xldmVsU2VsZWN0b3IoKSB7CiAgICAgICAgcmV0dXJuIG1pbkxldmVsIDwgTEVWRUxTLklORk87CiAgICB9CiAgICBmdW5jdGlvbiBkZWZhdWx0TG9nTGV2ZWwoKSB7CiAgICAgICAgaWYgKG1pbkxldmVsID4gZGVmYXVsdExldmVsKQogICAgICAgICAgICByZXR1cm4gbWluTGV2ZWw7CiAgICAgICAgcmV0dXJuIGRlZmF1bHRMZXZlbDsKICAgIH0KICAgIGZ1bmN0aW9uIHNob3dUcmFjZSgpIHsKICAgICAgICByZXR1cm4gbWluTGV2ZWwgPT0gTEVWRUxTLlRSQUNFOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBzaG93TG9nTGV2ZWxTZWxlY3Rvcjogc2hvd0xvZ0xldmVsU2VsZWN0b3IsCiAgICAgICAgZGVmYXVsdExvZ0xldmVsOiBkZWZhdWx0TG9nTGV2ZWwsCiAgICAgICAgc2hvd1RyYWNlOiBzaG93VHJhY2UKICAgIH07Cn0KPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLyohIGpRdWVyeSB2My41LjEgfCAoYykgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lLmRvY3VtZW50P3QoZSwhMCk6ZnVuY3Rpb24oZSl7aWYoIWUuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIHQoZSl9OnQoZSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKEMsZSl7InVzZSBzdHJpY3QiO3ZhciB0PVtdLHI9T2JqZWN0LmdldFByb3RvdHlwZU9mLHM9dC5zbGljZSxnPXQuZmxhdD9mdW5jdGlvbihlKXtyZXR1cm4gdC5mbGF0LmNhbGwoZSl9OmZ1bmN0aW9uKGUpe3JldHVybiB0LmNvbmNhdC5hcHBseShbXSxlKX0sdT10LnB1c2gsaT10LmluZGV4T2Ysbj17fSxvPW4udG9TdHJpbmcsdj1uLmhhc093blByb3BlcnR5LGE9di50b1N0cmluZyxsPWEuY2FsbChPYmplY3QpLHk9e30sbT1mdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmIm51bWJlciIhPXR5cGVvZiBlLm5vZGVUeXBlfSx4PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiZlPT09ZS53aW5kb3d9LEU9Qy5kb2N1bWVudCxjPXt0eXBlOiEwLHNyYzohMCxub25jZTohMCxub01vZHVsZTohMH07ZnVuY3Rpb24gYihlLHQsbil7dmFyIHIsaSxvPShuPW58fEUpLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2lmKG8udGV4dD1lLHQpZm9yKHIgaW4gYykoaT10W3JdfHx0LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUocikpJiZvLnNldEF0dHJpYnV0ZShyLGkpO24uaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfWZ1bmN0aW9uIHcoZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP25bby5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9dmFyIGY9IjMuNS4xIixTPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBTLmZuLmluaXQoZSx0KX07ZnVuY3Rpb24gcChlKXt2YXIgdD0hIWUmJiJsZW5ndGgiaW4gZSYmZS5sZW5ndGgsbj13KGUpO3JldHVybiFtKGUpJiYheChlKSYmKCJhcnJheSI9PT1ufHwwPT09dHx8Im51bWJlciI9PXR5cGVvZiB0JiYwPHQmJnQtMSBpbiBlKX1TLmZuPVMucHJvdG90eXBlPXtqcXVlcnk6Zixjb25zdHJ1Y3RvcjpTLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gcy5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/cy5jYWxsKHRoaXMpOmU8MD90aGlzW2UrdGhpcy5sZW5ndGhdOnRoaXNbZV19LHB1c2hTdGFjazpmdW5jdGlvbihlKXt2YXIgdD1TLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxlKTtyZXR1cm4gdC5wcmV2T2JqZWN0PXRoaXMsdH0sZWFjaDpmdW5jdGlvbihlKXtyZXR1cm4gUy5lYWNoKHRoaXMsZSl9LG1hcDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy5tYXAodGhpcyxmdW5jdGlvbihlLHQpe3JldHVybiBuLmNhbGwoZSx0LGUpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGV2ZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy5ncmVwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4odCsxKSUyfSkpfSxvZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy5ncmVwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCUyfSkpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxuPStlKyhlPDA/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soMDw9biYmbjx0P1t0aGlzW25dXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDp1LHNvcnQ6dC5zb3J0LHNwbGljZTp0LnNwbGljZX0sUy5leHRlbmQ9Uy5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLG8sYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsbD0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGw9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fG0oYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW3NdKSlmb3IodCBpbiBlKXI9ZVt0XSwiX19wcm90b19fIiE9PXQmJmEhPT1yJiYobCYmciYmKFMuaXNQbGFpbk9iamVjdChyKXx8KGk9QXJyYXkuaXNBcnJheShyKSkpPyhuPWFbdF0sbz1pJiYhQXJyYXkuaXNBcnJheShuKT9bXTppfHxTLmlzUGxhaW5PYmplY3Qobik/bjp7fSxpPSExLGFbdF09Uy5leHRlbmQobCxvLHIpKTp2b2lkIDAhPT1yJiYoYVt0XT1yKSk7cmV0dXJuIGF9LFMuZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhmK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKGUpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuISghZXx8IltvYmplY3QgT2JqZWN0XSIhPT1vLmNhbGwoZSkpJiYoISh0PXIoZSkpfHwiZnVuY3Rpb24iPT10eXBlb2Yobj12LmNhbGwodCwiY29uc3RydWN0b3IiKSYmdC5jb25zdHJ1Y3RvcikmJmEuY2FsbChuKT09PWwpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oZSx0LG4pe2IoZSx7bm9uY2U6dCYmdC5ub25jZX0sbil9LGVhY2g6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTA7aWYocChlKSl7Zm9yKG49ZS5sZW5ndGg7cjxuO3IrKylpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWt9ZWxzZSBmb3IociBpbiBlKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlicmVhaztyZXR1cm4gZX0sbWFrZUFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8W107cmV0dXJuIG51bGwhPWUmJihwKE9iamVjdChlKSk/Uy5tZXJnZShuLCJzdHJpbmciPT10eXBlb2YgZT9bZV06ZSk6dS5jYWxsKG4sZSkpLG59LGluQXJyYXk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBudWxsPT10Py0xOmkuY2FsbCh0LGUsbil9LG1lcmdlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPSt0Lmxlbmd0aCxyPTAsaT1lLmxlbmd0aDtyPG47cisrKWVbaSsrXT10W3JdO3JldHVybiBlLmxlbmd0aD1pLGV9LGdyZXA6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1bXSxpPTAsbz1lLmxlbmd0aCxhPSFuO2k8bztpKyspIXQoZVtpXSxpKSE9PWEmJnIucHVzaChlW2ldKTtyZXR1cm4gcn0sbWFwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89MCxhPVtdO2lmKHAoZSkpZm9yKHI9ZS5sZW5ndGg7bzxyO28rKyludWxsIT0oaT10KGVbb10sbyxuKSkmJmEucHVzaChpKTtlbHNlIGZvcihvIGluIGUpbnVsbCE9KGk9dChlW29dLG8sbikpJiZhLnB1c2goaSk7cmV0dXJuIGcoYSl9LGd1aWQ6MSxzdXBwb3J0Onl9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoUy5mbltTeW1ib2wuaXRlcmF0b3JdPXRbU3ltYm9sLml0ZXJhdG9yXSksUy5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe25bIltvYmplY3QgIit0KyJdIl09dC50b0xvd2VyQ2FzZSgpfSk7dmFyIGQ9ZnVuY3Rpb24obil7dmFyIGUsZCxiLG8saSxoLGYsZyx3LHUsbCxULEMsYSxFLHYscyxjLHksUz0ic2l6emxlIisxKm5ldyBEYXRlLHA9bi5kb2N1bWVudCxrPTAscj0wLG09dWUoKSx4PXVlKCksQT11ZSgpLE49dWUoKSxEPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10JiYobD0hMCksMH0saj17fS5oYXNPd25Qcm9wZXJ0eSx0PVtdLHE9dC5wb3AsTD10LnB1c2gsSD10LnB1c2gsTz10LnNsaWNlLFA9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspaWYoZVtuXT09PXQpcmV0dXJuIG47cmV0dXJuLTF9LFI9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixNPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixJPSIoPzpcXFxcW1xcZGEtZkEtRl17MSw2fSIrTSsiP3xcXFxcW15cXHJcXG5cXGZdfFtcXHctXXxbXlwwLVxceDdmXSkrIixXPSJcXFsiK00rIiooIitJKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrSSsiKSl8KSIrTSsiKlxcXSIsRj0iOigiK0krIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK1crIikqKXwuKilcXCl8KSIsQj1uZXcgUmVnRXhwKE0rIisiLCJnIiksJD1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLF89bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSx6PW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksVT1uZXcgUmVnRXhwKE0rInw+IiksWD1uZXcgUmVnRXhwKEYpLFY9bmV3IFJlZ0V4cCgiXiIrSSsiJCIpLEc9e0lEOm5ldyBSZWdFeHAoIl4jKCIrSSsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitJKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitJKyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrVyksUFNFVURPOm5ldyBSZWdFeHAoIl4iK0YpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTSsiKig/OihbKy1dfCkiK00rIiooXFxkKyl8KSkiK00rIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK1IrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitNKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK00rIiooKD86LVxcZCk/XFxkKikiK00rIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFk9L0hUTUwkL2ksUT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLEo9L15oXGQkL2ksSz0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLGVlPS9bK35dLyx0ZT1uZXcgUmVnRXhwKCJcXFxcW1xcZGEtZkEtRl17MSw2fSIrTSsiP3xcXFxcKFteXFxyXFxuXFxmXSkiLCJnIiksbmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj0iMHgiK2Uuc2xpY2UoMSktNjU1MzY7cmV0dXJuIHR8fChuPDA/U3RyaW5nLmZyb21DaGFyQ29kZShuKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKG4+PjEwfDU1Mjk2LDEwMjMmbnw1NjMyMCkpfSxyZT0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxpZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PyJcMCI9PT1lPyJcdWZmZmQiOmUuc2xpY2UoMCwtMSkrIlxcIitlLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2V9LG9lPWZ1bmN0aW9uKCl7VCgpfSxhZT1iZShmdW5jdGlvbihlKXtyZXR1cm4hMD09PWUuZGlzYWJsZWQmJiJmaWVsZHNldCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7SC5hcHBseSh0PU8uY2FsbChwLmNoaWxkTm9kZXMpLHAuY2hpbGROb2RlcyksdFtwLmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlKXtIPXthcHBseTp0Lmxlbmd0aD9mdW5jdGlvbihlLHQpe0wuYXBwbHkoZSxPLmNhbGwodCkpfTpmdW5jdGlvbihlLHQpe3ZhciBuPWUubGVuZ3RoLHI9MDt3aGlsZShlW24rK109dFtyKytdKTtlLmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBzZSh0LGUsbixyKXt2YXIgaSxvLGEscyx1LGwsYyxmPWUmJmUub3duZXJEb2N1bWVudCxwPWU/ZS5ub2RlVHlwZTo5O2lmKG49bnx8W10sInN0cmluZyIhPXR5cGVvZiB0fHwhdHx8MSE9PXAmJjkhPT1wJiYxMSE9PXApcmV0dXJuIG47aWYoIXImJihUKGUpLGU9ZXx8QyxFKSl7aWYoMTEhPT1wJiYodT1aLmV4ZWModCkpKWlmKGk9dVsxXSl7aWYoOT09PXApe2lmKCEoYT1lLmdldEVsZW1lbnRCeUlkKGkpKSlyZXR1cm4gbjtpZihhLmlkPT09aSlyZXR1cm4gbi5wdXNoKGEpLG59ZWxzZSBpZihmJiYoYT1mLmdldEVsZW1lbnRCeUlkKGkpKSYmeShlLGEpJiZhLmlkPT09aSlyZXR1cm4gbi5wdXNoKGEpLG59ZWxzZXtpZih1WzJdKXJldHVybiBILmFwcGx5KG4sZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KSksbjtpZigoaT11WzNdKSYmZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkobixlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaSkpLG59aWYoZC5xc2EmJiFOW3QrIiAiXSYmKCF2fHwhdi50ZXN0KHQpKSYmKDEhPT1wfHwib2JqZWN0IiE9PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpe2lmKGM9dCxmPWUsMT09PXAmJihVLnRlc3QodCl8fHoudGVzdCh0KSkpeyhmPWVlLnRlc3QodCkmJnllKGUucGFyZW50Tm9kZSl8fGUpPT09ZSYmZC5zY29wZXx8KChzPWUuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXMucmVwbGFjZShyZSxpZSk6ZS5zZXRBdHRyaWJ1dGUoImlkIixzPVMpKSxvPShsPWgodCkpLmxlbmd0aDt3aGlsZShvLS0pbFtvXT0ocz8iIyIrczoiOnNjb3BlIikrIiAiK3hlKGxbb10pO2M9bC5qb2luKCIsIil9dHJ5e3JldHVybiBILmFwcGx5KG4sZi5xdWVyeVNlbGVjdG9yQWxsKGMpKSxufWNhdGNoKGUpe04odCwhMCl9ZmluYWxseXtzPT09UyYmZS5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gZyh0LnJlcGxhY2UoJCwiJDEiKSxlLG4scil9ZnVuY3Rpb24gdWUoKXt2YXIgcj1bXTtyZXR1cm4gZnVuY3Rpb24gZSh0LG4pe3JldHVybiByLnB1c2godCsiICIpPmIuY2FjaGVMZW5ndGgmJmRlbGV0ZSBlW3Iuc2hpZnQoKV0sZVt0KyIgIl09bn19ZnVuY3Rpb24gbGUoZSl7cmV0dXJuIGVbU109ITAsZX1mdW5jdGlvbiBjZShlKXt2YXIgdD1DLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dHJ5e3JldHVybiEhZSh0KX1jYXRjaChlKXtyZXR1cm4hMX1maW5hbGx5e3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHQ9bnVsbH19ZnVuY3Rpb24gZmUoZSx0KXt2YXIgbj1lLnNwbGl0KCJ8Iikscj1uLmxlbmd0aDt3aGlsZShyLS0pYi5hdHRySGFuZGxlW25bcl1dPXR9ZnVuY3Rpb24gcGUoZSx0KXt2YXIgbj10JiZlLHI9biYmMT09PWUubm9kZVR5cGUmJjE9PT10Lm5vZGVUeXBlJiZlLnNvdXJjZUluZGV4LXQuc291cmNlSW5kZXg7aWYocilyZXR1cm4gcjtpZihuKXdoaWxlKG49bi5uZXh0U2libGluZylpZihuPT09dClyZXR1cm4tMTtyZXR1cm4gZT8xOi0xfWZ1bmN0aW9uIGRlKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBoZShuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09dHx8ImJ1dHRvbiI9PT10KSYmZS50eXBlPT09bn19ZnVuY3Rpb24gZ2UodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJmb3JtImluIGU/ZS5wYXJlbnROb2RlJiYhMT09PWUuZGlzYWJsZWQ/ImxhYmVsImluIGU/ImxhYmVsImluIGUucGFyZW50Tm9kZT9lLnBhcmVudE5vZGUuZGlzYWJsZWQ9PT10OmUuZGlzYWJsZWQ9PT10OmUuaXNEaXNhYmxlZD09PXR8fGUuaXNEaXNhYmxlZCE9PSF0JiZhZShlKT09PXQ6ZS5kaXNhYmxlZD09PXQ6ImxhYmVsImluIGUmJmUuZGlzYWJsZWQ9PT10fX1mdW5jdGlvbiB2ZShhKXtyZXR1cm4gbGUoZnVuY3Rpb24obyl7cmV0dXJuIG89K28sbGUoZnVuY3Rpb24oZSx0KXt2YXIgbixyPWEoW10sZS5sZW5ndGgsbyksaT1yLmxlbmd0aDt3aGlsZShpLS0pZVtuPXJbaV1dJiYoZVtuXT0hKHRbbl09ZVtuXSkpfSl9KX1mdW5jdGlvbiB5ZShlKXtyZXR1cm4gZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZlfWZvcihlIGluIGQ9c2Uuc3VwcG9ydD17fSxpPXNlLmlzWE1MPWZ1bmN0aW9uKGUpe3ZhciB0PWUubmFtZXNwYWNlVVJJLG49KGUub3duZXJEb2N1bWVudHx8ZSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiFZLnRlc3QodHx8biYmbi5ub2RlTmFtZXx8IkhUTUwiKX0sVD1zZS5zZXREb2N1bWVudD1mdW5jdGlvbihlKXt2YXIgdCxuLHI9ZT9lLm93bmVyRG9jdW1lbnR8fGU6cDtyZXR1cm4gciE9QyYmOT09PXIubm9kZVR5cGUmJnIuZG9jdW1lbnRFbGVtZW50JiYoYT0oQz1yKS5kb2N1bWVudEVsZW1lbnQsRT0haShDKSxwIT1DJiYobj1DLmRlZmF1bHRWaWV3KSYmbi50b3AhPT1uJiYobi5hZGRFdmVudExpc3RlbmVyP24uYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixvZSwhMSk6bi5hdHRhY2hFdmVudCYmbi5hdHRhY2hFdmVudCgib251bmxvYWQiLG9lKSksZC5zY29wZT1jZShmdW5jdGlvbihlKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZChDLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSwidW5kZWZpbmVkIiE9dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbCYmIWUucXVlcnlTZWxlY3RvckFsbCgiOnNjb3BlIGZpZWxkc2V0IGRpdiIpLmxlbmd0aH0pLGQuYXR0cmlidXRlcz1jZShmdW5jdGlvbihlKXtyZXR1cm4gZS5jbGFzc05hbWU9ImkiLCFlLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxkLmdldEVsZW1lbnRzQnlUYWdOYW1lPWNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGVuZENoaWxkKEMuY3JlYXRlQ29tbWVudCgiIikpLCFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPUsudGVzdChDLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGQuZ2V0QnlJZD1jZShmdW5jdGlvbihlKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChlKS5pZD1TLCFDLmdldEVsZW1lbnRzQnlOYW1lfHwhQy5nZXRFbGVtZW50c0J5TmFtZShTKS5sZW5ndGh9KSxkLmdldEJ5SWQ/KGIuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSh0ZSxuZSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiaWQiKT09PXR9fSxiLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJkUpe3ZhciBuPXQuZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIG4/W25dOltdfX0pOihiLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgbj1lLnJlcGxhY2UodGUsbmUpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD0idW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiB0JiZ0LnZhbHVlPT09bn19LGIuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmRSl7dmFyIG4scixpLG89dC5nZXRFbGVtZW50QnlJZChlKTtpZihvKXtpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb107aT10LmdldEVsZW1lbnRzQnlOYW1lKGUpLHI9MDt3aGlsZShvPWlbcisrXSlpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb119cmV0dXJuW119fSksYi5maW5kLlRBRz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGUsdCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6ZC5xc2E/dC5xdWVyeVNlbGVjdG9yQWxsKGUpOnZvaWQgMH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sYi5maW5kLkNMQVNTPWQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmRSlyZXR1cm4gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpfSxzPVtdLHY9W10sKGQucXNhPUsudGVzdChDLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKGNlKGZ1bmN0aW9uKGUpe3ZhciB0O2EuYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPSI8YSBpZD0nIitTKyInPjwvYT48c2VsZWN0IGlkPSciK1MrIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmdi5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8di5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK1IrIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitTKyItXSIpLmxlbmd0aHx8di5wdXNoKCJ+PSIpLCh0PUMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJuYW1lIiwiIiksZS5hcHBlbmRDaGlsZCh0KSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPScnXSIpLmxlbmd0aHx8di5wdXNoKCJcXFsiK00rIipuYW1lIitNKyIqPSIrTSsiKig/OicnfFwiXCIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8di5wdXNoKCI6Y2hlY2tlZCIpLGUucXVlcnlTZWxlY3RvckFsbCgiYSMiK1MrIisqIikubGVuZ3RofHx2LnB1c2goIi4jLitbK35dIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJcXFxmIiksdi5wdXNoKCJbXFxyXFxuXFxmXSIpfSksY2UoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7dmFyIHQ9Qy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3Quc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksZS5hcHBlbmRDaGlsZCh0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmdi5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZD0hMCwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJnYucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSx2LnB1c2goIiwuKjoiKX0pKSwoZC5tYXRjaGVzU2VsZWN0b3I9Sy50ZXN0KGM9YS5tYXRjaGVzfHxhLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEub01hdGNoZXNTZWxlY3Rvcnx8YS5tc01hdGNoZXNTZWxlY3RvcikpJiZjZShmdW5jdGlvbihlKXtkLmRpc2Nvbm5lY3RlZE1hdGNoPWMuY2FsbChlLCIqIiksYy5jYWxsKGUsIltzIT0nJ106eCIpLHMucHVzaCgiIT0iLEYpfSksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSkscz1zLmxlbmd0aCYmbmV3IFJlZ0V4cChzLmpvaW4oInwiKSksdD1LLnRlc3QoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikseT10fHxLLnRlc3QoYS5jb250YWlucyk/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KXdoaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxEPXQ/ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gbD0hMCwwO3ZhciBuPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBufHwoMSYobj0oZS5vd25lckRvY3VtZW50fHxlKT09KHQub3duZXJEb2N1bWVudHx8dCk/ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KToxKXx8IWQuc29ydERldGFjaGVkJiZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpPT09bj9lPT1DfHxlLm93bmVyRG9jdW1lbnQ9PXAmJnkocCxlKT8tMTp0PT1DfHx0Lm93bmVyRG9jdW1lbnQ9PXAmJnkocCx0KT8xOnU/UCh1LGUpLVAodSx0KTowOjQmbj8tMToxKX06ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gbD0hMCwwO3ZhciBuLHI9MCxpPWUucGFyZW50Tm9kZSxvPXQucGFyZW50Tm9kZSxhPVtlXSxzPVt0XTtpZighaXx8IW8pcmV0dXJuIGU9PUM/LTE6dD09Qz8xOmk/LTE6bz8xOnU/UCh1LGUpLVAodSx0KTowO2lmKGk9PT1vKXJldHVybiBwZShlLHQpO249ZTt3aGlsZShuPW4ucGFyZW50Tm9kZSlhLnVuc2hpZnQobik7bj10O3doaWxlKG49bi5wYXJlbnROb2RlKXMudW5zaGlmdChuKTt3aGlsZShhW3JdPT09c1tyXSlyKys7cmV0dXJuIHI/cGUoYVtyXSxzW3JdKTphW3JdPT1wPy0xOnNbcl09PXA/MTowfSksQ30sc2UubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBzZShlLG51bGwsbnVsbCx0KX0sc2UubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7aWYoVChlKSxkLm1hdGNoZXNTZWxlY3RvciYmRSYmIU5bdCsiICJdJiYoIXN8fCFzLnRlc3QodCkpJiYoIXZ8fCF2LnRlc3QodCkpKXRyeXt2YXIgbj1jLmNhbGwoZSx0KTtpZihufHxkLmRpc2Nvbm5lY3RlZE1hdGNofHxlLmRvY3VtZW50JiYxMSE9PWUuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIG59Y2F0Y2goZSl7Tih0LCEwKX1yZXR1cm4gMDxzZSh0LEMsbnVsbCxbZV0pLmxlbmd0aH0sc2UuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZS5vd25lckRvY3VtZW50fHxlKSE9QyYmVChlKSx5KGUsdCl9LHNlLmF0dHI9ZnVuY3Rpb24oZSx0KXsoZS5vd25lckRvY3VtZW50fHxlKSE9QyYmVChlKTt2YXIgbj1iLmF0dHJIYW5kbGVbdC50b0xvd2VyQ2FzZSgpXSxyPW4mJmouY2FsbChiLmF0dHJIYW5kbGUsdC50b0xvd2VyQ2FzZSgpKT9uKGUsdCwhRSk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1yP3I6ZC5hdHRyaWJ1dGVzfHwhRT9lLmdldEF0dHJpYnV0ZSh0KToocj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9LHNlLmVzY2FwZT1mdW5jdGlvbihlKXtyZXR1cm4oZSsiIikucmVwbGFjZShyZSxpZSl9LHNlLmVycm9yPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitlKX0sc2UudW5pcXVlU29ydD1mdW5jdGlvbihlKXt2YXIgdCxuPVtdLHI9MCxpPTA7aWYobD0hZC5kZXRlY3REdXBsaWNhdGVzLHU9IWQuc29ydFN0YWJsZSYmZS5zbGljZSgwKSxlLnNvcnQoRCksbCl7d2hpbGUodD1lW2krK10pdD09PWVbaV0mJihyPW4ucHVzaChpKSk7d2hpbGUoci0tKWUuc3BsaWNlKG5bcl0sMSl9cmV0dXJuIHU9bnVsbCxlfSxvPXNlLmdldFRleHQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj0iIixyPTAsaT1lLm5vZGVUeXBlO2lmKGkpe2lmKDE9PT1pfHw5PT09aXx8MTE9PT1pKXtpZigic3RyaW5nIj09dHlwZW9mIGUudGV4dENvbnRlbnQpcmV0dXJuIGUudGV4dENvbnRlbnQ7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKW4rPW8oZSl9ZWxzZSBpZigzPT09aXx8ND09PWkpcmV0dXJuIGUubm9kZVZhbHVlfWVsc2Ugd2hpbGUodD1lW3IrK10pbis9byh0KTtyZXR1cm4gbn0sKGI9c2Uuc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86bGUsbWF0Y2g6RyxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKHRlLG5lKSxlWzNdPShlWzNdfHxlWzRdfHxlWzVdfHwiIikucmVwbGFjZSh0ZSxuZSksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fHNlLmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKCJldmVuIj09PWVbM118fCJvZGQiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fCJvZGQiPT09ZVszXSkpOmVbM10mJnNlLmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuPSFlWzZdJiZlWzJdO3JldHVybiBHLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXT9lWzJdPWVbNF18fGVbNV18fCIiOm4mJlgudGVzdChuKSYmKHQ9aChuLCEwKSkmJih0PW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtdCktbi5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1uLnNsaWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UodGUsbmUpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09ZT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dH19LENMQVNTOmZ1bmN0aW9uKGUpe3ZhciB0PW1bZSsiICJdO3JldHVybiB0fHwodD1uZXcgUmVnRXhwKCIoXnwiK00rIikiK2UrIigiK00rInwkKSIpKSYmbShlLGZ1bmN0aW9uKGUpe3JldHVybiB0LnRlc3QoInN0cmluZyI9PXR5cGVvZiBlLmNsYXNzTmFtZSYmZS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihuLHIsaSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXNlLmF0dHIoZSxuKTtyZXR1cm4gbnVsbD09dD8iIT0iPT09cjohcnx8KHQrPSIiLCI9Ij09PXI/dD09PWk6IiE9Ij09PXI/dCE9PWk6Il49Ij09PXI/aSYmMD09PXQuaW5kZXhPZihpKToiKj0iPT09cj9pJiYtMTx0LmluZGV4T2YoaSk6IiQ9Ij09PXI/aSYmdC5zbGljZSgtaS5sZW5ndGgpPT09aToifj0iPT09cj8tMTwoIiAiK3QucmVwbGFjZShCLCIgIikrIiAiKS5pbmRleE9mKGkpOiJ8PSI9PT1yJiYodD09PWl8fHQuc2xpY2UoMCxpLmxlbmd0aCsxKT09PWkrIi0iKSl9fSxDSElMRDpmdW5jdGlvbihoLGUsdCxnLHYpe3ZhciB5PSJudGgiIT09aC5zbGljZSgwLDMpLG09Imxhc3QiIT09aC5zbGljZSgtNCkseD0ib2YtdHlwZSI9PT1lO3JldHVybiAxPT09ZyYmMD09PXY/ZnVuY3Rpb24oZSl7cmV0dXJuISFlLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbD15IT09bT8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLGM9ZS5wYXJlbnROb2RlLGY9eCYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHA9IW4mJiF4LGQ9ITE7aWYoYyl7aWYoeSl7d2hpbGUobCl7YT1lO3doaWxlKGE9YVtsXSlpZih4P2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWY6MT09PWEubm9kZVR5cGUpcmV0dXJuITE7dT1sPSJvbmx5Ij09PWgmJiF1JiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKHU9W20/Yy5maXJzdENoaWxkOmMubGFzdENoaWxkXSxtJiZwKXtkPShzPShyPShpPShvPShhPWMpW1NdfHwoYVtTXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdfHxbXSlbMF09PT1rJiZyWzFdKSYmclsyXSxhPXMmJmMuY2hpbGROb2Rlc1tzXTt3aGlsZShhPSsrcyYmYSYmYVtsXXx8KGQ9cz0wKXx8dS5wb3AoKSlpZigxPT09YS5ub2RlVHlwZSYmKytkJiZhPT09ZSl7aVtoXT1bayxzLGRdO2JyZWFrfX1lbHNlIGlmKHAmJihkPXM9KHI9KGk9KG89KGE9ZSlbU118fChhW1NdPXt9KSlbYS51bmlxdWVJRF18fChvW2EudW5pcXVlSURdPXt9KSlbaF18fFtdKVswXT09PWsmJnJbMV0pLCExPT09ZCl3aGlsZShhPSsrcyYmYSYmYVtsXXx8KGQ9cz0wKXx8dS5wb3AoKSlpZigoeD9hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1mOjE9PT1hLm5vZGVUeXBlKSYmKytkJiYocCYmKChpPShvPWFbU118fChhW1NdPXt9KSlbYS51bmlxdWVJRF18fChvW2EudW5pcXVlSURdPXt9KSlbaF09W2ssZF0pLGE9PT1lKSlicmVhaztyZXR1cm4oZC09dik9PT1nfHxkJWc9PTAmJjA8PWQvZ319fSxQU0VVRE86ZnVuY3Rpb24oZSxvKXt2YXIgdCxhPWIucHNldWRvc1tlXXx8Yi5zZXRGaWx0ZXJzW2UudG9Mb3dlckNhc2UoKV18fHNlLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrZSk7cmV0dXJuIGFbU10/YShvKToxPGEubGVuZ3RoPyh0PVtlLGUsIiIsb10sYi5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/bGUoZnVuY3Rpb24oZSx0KXt2YXIgbixyPWEoZSxvKSxpPXIubGVuZ3RoO3doaWxlKGktLSllW249UChlLHJbaV0pXT0hKHRbbl09cltpXSl9KTpmdW5jdGlvbihlKXtyZXR1cm4gYShlLDAsdCl9KTphfX0scHNldWRvczp7bm90OmxlKGZ1bmN0aW9uKGUpe3ZhciByPVtdLGk9W10scz1mKGUucmVwbGFjZSgkLCIkMSIpKTtyZXR1cm4gc1tTXT9sZShmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPXMoZSxudWxsLHIsW10pLGE9ZS5sZW5ndGg7d2hpbGUoYS0tKShpPW9bYV0pJiYoZVthXT0hKHRbYV09aSkpfSk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByWzBdPWUscyhyLG51bGwsbixpKSxyWzBdPW51bGwsIWkucG9wKCl9fSksaGFzOmxlKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gMDxzZSh0LGUpLmxlbmd0aH19KSxjb250YWluczpsZShmdW5jdGlvbih0KXtyZXR1cm4gdD10LnJlcGxhY2UodGUsbmUpLGZ1bmN0aW9uKGUpe3JldHVybi0xPChlLnRleHRDb250ZW50fHxvKGUpKS5pbmRleE9mKHQpfX0pLGxhbmc6bGUoZnVuY3Rpb24obil7cmV0dXJuIFYudGVzdChufHwiIil8fHNlLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK24pLG49bi5yZXBsYWNlKHRlLG5lKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGUpe3ZhciB0O2Rve2lmKHQ9RT9lLmxhbmc6ZS5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGUuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuKHQ9dC50b0xvd2VyQ2FzZSgpKT09PW58fDA9PT10LmluZGV4T2YobisiLSIpfXdoaWxlKChlPWUucGFyZW50Tm9kZSkmJjE9PT1lLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5sb2NhdGlvbiYmbi5sb2NhdGlvbi5oYXNoO3JldHVybiB0JiZ0LnNsaWNlKDEpPT09ZS5pZH0scm9vdDpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWF9LGZvY3VzOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09Qy5hY3RpdmVFbGVtZW50JiYoIUMuaGFzRm9jdXN8fEMuaGFzRm9jdXMoKSkmJiEhKGUudHlwZXx8ZS5ocmVmfHx+ZS50YWJJbmRleCl9LGVuYWJsZWQ6Z2UoITEpLGRpc2FibGVkOmdlKCEwKSxjaGVja2VkOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmISFlLmNoZWNrZWR8fCJvcHRpb24iPT09dCYmISFlLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCwhMD09PWUuc2VsZWN0ZWR9LGVtcHR5OmZ1bmN0aW9uKGUpe2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZylpZihlLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihlKXtyZXR1cm4hYi5wc2V1ZG9zLmVtcHR5KGUpfSxoZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIEoudGVzdChlLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIFEudGVzdChlLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmImJ1dHRvbiI9PT1lLnR5cGV8fCJidXR0b24iPT09dH0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1lLnR5cGUmJihudWxsPT0odD1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09dC50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6dmUoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OnZlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuW3QtMV19KSxlcTp2ZShmdW5jdGlvbihlLHQsbil7cmV0dXJuW248MD9uK3Q6bl19KSxldmVuOnZlKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjx0O24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksb2RkOnZlKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTE7bjx0O24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksbHQ6dmUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0OnQ8bj90Om47MDw9LS1yOyllLnB1c2gocik7cmV0dXJuIGV9KSxndDp2ZShmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9uK3Q6bjsrK3I8dDspZS5wdXNoKHIpO3JldHVybiBlfSl9fSkucHNldWRvcy5udGg9Yi5wc2V1ZG9zLmVxLHtyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSliLnBzZXVkb3NbZV09ZGUoZSk7Zm9yKGUgaW57c3VibWl0OiEwLHJlc2V0OiEwfSliLnBzZXVkb3NbZV09aGUoZSk7ZnVuY3Rpb24gbWUoKXt9ZnVuY3Rpb24geGUoZSl7Zm9yKHZhciB0PTAsbj1lLmxlbmd0aCxyPSIiO3Q8bjt0Kyspcis9ZVt0XS52YWx1ZTtyZXR1cm4gcn1mdW5jdGlvbiBiZShzLGUsdCl7dmFyIHU9ZS5kaXIsbD1lLm5leHQsYz1sfHx1LGY9dCYmInBhcmVudE5vZGUiPT09YyxwPXIrKztyZXR1cm4gZS5maXJzdD9mdW5jdGlvbihlLHQsbil7d2hpbGUoZT1lW3VdKWlmKDE9PT1lLm5vZGVUeXBlfHxmKXJldHVybiBzKGUsdCxuKTtyZXR1cm4hMX06ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPVtrLHBdO2lmKG4pe3doaWxlKGU9ZVt1XSlpZigoMT09PWUubm9kZVR5cGV8fGYpJiZzKGUsdCxuKSlyZXR1cm4hMH1lbHNlIHdoaWxlKGU9ZVt1XSlpZigxPT09ZS5ub2RlVHlwZXx8ZilpZihpPShvPWVbU118fChlW1NdPXt9KSlbZS51bmlxdWVJRF18fChvW2UudW5pcXVlSURdPXt9KSxsJiZsPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKWU9ZVt1XXx8ZTtlbHNle2lmKChyPWlbY10pJiZyWzBdPT09ayYmclsxXT09PXApcmV0dXJuIGFbMl09clsyXTtpZigoaVtjXT1hKVsyXT1zKGUsdCxuKSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gd2UoaSl7cmV0dXJuIDE8aS5sZW5ndGg/ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWkubGVuZ3RoO3doaWxlKHItLSlpZighaVtyXShlLHQsbikpcmV0dXJuITE7cmV0dXJuITB9OmlbMF19ZnVuY3Rpb24gVGUoZSx0LG4scixpKXtmb3IodmFyIG8sYT1bXSxzPTAsdT1lLmxlbmd0aCxsPW51bGwhPXQ7czx1O3MrKykobz1lW3NdKSYmKG4mJiFuKG8scixpKXx8KGEucHVzaChvKSxsJiZ0LnB1c2gocykpKTtyZXR1cm4gYX1mdW5jdGlvbiBDZShkLGgsZyx2LHksZSl7cmV0dXJuIHYmJiF2W1NdJiYodj1DZSh2KSkseSYmIXlbU10mJih5PUNlKHksZSkpLGxlKGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzPVtdLHU9W10sbD10Lmxlbmd0aCxjPWV8fGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspc2UoZSx0W3JdLG4pO3JldHVybiBufShofHwiKiIsbi5ub2RlVHlwZT9bbl06bixbXSksZj0hZHx8IWUmJmg/YzpUZShjLHMsZCxuLHIpLHA9Zz95fHwoZT9kOmx8fHYpP1tdOnQ6ZjtpZihnJiZnKGYscCxuLHIpLHYpe2k9VGUocCx1KSx2KGksW10sbixyKSxvPWkubGVuZ3RoO3doaWxlKG8tLSkoYT1pW29dKSYmKHBbdVtvXV09IShmW3Vbb11dPWEpKX1pZihlKXtpZih5fHxkKXtpZih5KXtpPVtdLG89cC5sZW5ndGg7d2hpbGUoby0tKShhPXBbb10pJiZpLnB1c2goZltvXT1hKTt5KG51bGwscD1bXSxpLHIpfW89cC5sZW5ndGg7d2hpbGUoby0tKShhPXBbb10pJiYtMTwoaT15P1AoZSxhKTpzW29dKSYmKGVbaV09ISh0W2ldPWEpKX19ZWxzZSBwPVRlKHA9PT10P3Auc3BsaWNlKGwscC5sZW5ndGgpOnApLHk/eShudWxsLHQscCxyKTpILmFwcGx5KHQscCl9KX1mdW5jdGlvbiBFZShlKXtmb3IodmFyIGksdCxuLHI9ZS5sZW5ndGgsbz1iLnJlbGF0aXZlW2VbMF0udHlwZV0sYT1vfHxiLnJlbGF0aXZlWyIgIl0scz1vPzE6MCx1PWJlKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09aX0sYSwhMCksbD1iZShmdW5jdGlvbihlKXtyZXR1cm4tMTxQKGksZSl9LGEsITApLGM9W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj0hbyYmKG58fHQhPT13KXx8KChpPXQpLm5vZGVUeXBlP3UoZSx0LG4pOmwoZSx0LG4pKTtyZXR1cm4gaT1udWxsLHJ9XTtzPHI7cysrKWlmKHQ9Yi5yZWxhdGl2ZVtlW3NdLnR5cGVdKWM9W2JlKHdlKGMpLHQpXTtlbHNle2lmKCh0PWIuZmlsdGVyW2Vbc10udHlwZV0uYXBwbHkobnVsbCxlW3NdLm1hdGNoZXMpKVtTXSl7Zm9yKG49KytzO248cjtuKyspaWYoYi5yZWxhdGl2ZVtlW25dLnR5cGVdKWJyZWFrO3JldHVybiBDZSgxPHMmJndlKGMpLDE8cyYmeGUoZS5zbGljZSgwLHMtMSkuY29uY2F0KHt2YWx1ZToiICI9PT1lW3MtMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZSgkLCIkMSIpLHQsczxuJiZFZShlLnNsaWNlKHMsbikpLG48ciYmRWUoZT1lLnNsaWNlKG4pKSxuPHImJnhlKGUpKX1jLnB1c2godCl9cmV0dXJuIHdlKGMpfXJldHVybiBtZS5wcm90b3R5cGU9Yi5maWx0ZXJzPWIucHNldWRvcyxiLnNldEZpbHRlcnM9bmV3IG1lLGg9c2UudG9rZW5pemU9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHMsdSxsPXhbZSsiICJdO2lmKGwpcmV0dXJuIHQ/MDpsLnNsaWNlKDApO2E9ZSxzPVtdLHU9Yi5wcmVGaWx0ZXI7d2hpbGUoYSl7Zm9yKG8gaW4gbiYmIShyPV8uZXhlYyhhKSl8fChyJiYoYT1hLnNsaWNlKHJbMF0ubGVuZ3RoKXx8YSkscy5wdXNoKGk9W10pKSxuPSExLChyPXouZXhlYyhhKSkmJihuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpyWzBdLnJlcGxhY2UoJCwiICIpfSksYT1hLnNsaWNlKG4ubGVuZ3RoKSksYi5maWx0ZXIpIShyPUdbb10uZXhlYyhhKSl8fHVbb10mJiEocj11W29dKHIpKXx8KG49ci5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOm8sbWF0Y2hlczpyfSksYT1hLnNsaWNlKG4ubGVuZ3RoKSk7aWYoIW4pYnJlYWt9cmV0dXJuIHQ/YS5sZW5ndGg6YT9zZS5lcnJvcihlKTp4KGUscykuc2xpY2UoMCl9LGY9c2UuY29tcGlsZT1mdW5jdGlvbihlLHQpe3ZhciBuLHYseSxtLHgscixpPVtdLG89W10sYT1BW2UrIiAiXTtpZighYSl7dHx8KHQ9aChlKSksbj10Lmxlbmd0aDt3aGlsZShuLS0pKGE9RWUodFtuXSkpW1NdP2kucHVzaChhKTpvLnB1c2goYSk7KGE9QShlLCh2PW8sbT0wPCh5PWkpLmxlbmd0aCx4PTA8di5sZW5ndGgscj1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyx1PTAsbD0iMCIsYz1lJiZbXSxmPVtdLHA9dyxkPWV8fHgmJmIuZmluZC5UQUcoIioiLGkpLGg9ays9bnVsbD09cD8xOk1hdGgucmFuZG9tKCl8fC4xLGc9ZC5sZW5ndGg7Zm9yKGkmJih3PXQ9PUN8fHR8fGkpO2whPT1nJiZudWxsIT0obz1kW2xdKTtsKyspe2lmKHgmJm8pe2E9MCx0fHxvLm93bmVyRG9jdW1lbnQ9PUN8fChUKG8pLG49IUUpO3doaWxlKHM9dlthKytdKWlmKHMobyx0fHxDLG4pKXtyLnB1c2gobyk7YnJlYWt9aSYmKGs9aCl9bSYmKChvPSFzJiZvKSYmdS0tLGUmJmMucHVzaChvKSl9aWYodSs9bCxtJiZsIT09dSl7YT0wO3doaWxlKHM9eVthKytdKXMoYyxmLHQsbik7aWYoZSl7aWYoMDx1KXdoaWxlKGwtLSljW2xdfHxmW2xdfHwoZltsXT1xLmNhbGwocikpO2Y9VGUoZil9SC5hcHBseShyLGYpLGkmJiFlJiYwPGYubGVuZ3RoJiYxPHUreS5sZW5ndGgmJnNlLnVuaXF1ZVNvcnQocil9cmV0dXJuIGkmJihrPWgsdz1wKSxjfSxtP2xlKHIpOnIpKSkuc2VsZWN0b3I9ZX1yZXR1cm4gYX0sZz1zZS5zZWxlY3Q9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLGM9IXImJmgoZT1sLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1jLmxlbmd0aCl7aWYoMjwobz1jWzBdPWNbMF0uc2xpY2UoMCkpLmxlbmd0aCYmIklEIj09PShhPW9bMF0pLnR5cGUmJjk9PT10Lm5vZGVUeXBlJiZFJiZiLnJlbGF0aXZlW29bMV0udHlwZV0pe2lmKCEodD0oYi5maW5kLklEKGEubWF0Y2hlc1swXS5yZXBsYWNlKHRlLG5lKSx0KXx8W10pWzBdKSlyZXR1cm4gbjtsJiYodD10LnBhcmVudE5vZGUpLGU9ZS5zbGljZShvLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPUcubmVlZHNDb250ZXh0LnRlc3QoZSk/MDpvLmxlbmd0aDt3aGlsZShpLS0pe2lmKGE9b1tpXSxiLnJlbGF0aXZlW3M9YS50eXBlXSlicmVhaztpZigodT1iLmZpbmRbc10pJiYocj11KGEubWF0Y2hlc1swXS5yZXBsYWNlKHRlLG5lKSxlZS50ZXN0KG9bMF0udHlwZSkmJnllKHQucGFyZW50Tm9kZSl8fHQpKSl7aWYoby5zcGxpY2UoaSwxKSwhKGU9ci5sZW5ndGgmJnhlKG8pKSlyZXR1cm4gSC5hcHBseShuLHIpLG47YnJlYWt9fX1yZXR1cm4obHx8ZihlLGMpKShyLHQsIUUsbiwhdHx8ZWUudGVzdChlKSYmeWUodC5wYXJlbnROb2RlKXx8dCksbn0sZC5zb3J0U3RhYmxlPVMuc3BsaXQoIiIpLnNvcnQoRCkuam9pbigiIik9PT1TLGQuZGV0ZWN0RHVwbGljYXRlcz0hIWwsVCgpLGQuc29ydERldGFjaGVkPWNlKGZ1bmN0aW9uKGUpe3JldHVybiAxJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oQy5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKX0pLGNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGZlKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihlLHQsbil7aWYoIW4pcmV0dXJuIGUuZ2V0QXR0cmlidXRlKHQsInR5cGUiPT09dC50b0xvd2VyQ2FzZSgpPzE6Mil9KSxkLmF0dHJpYnV0ZXMmJmNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGlucHV0Lz4iLGUuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGZlKCJ2YWx1ZSIsZnVuY3Rpb24oZSx0LG4pe2lmKCFuJiYiaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiBlLmRlZmF1bHRWYWx1ZX0pLGNlKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxmZShSLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZighbilyZXR1cm4hMD09PWVbdF0/dC50b0xvd2VyQ2FzZSgpOihyPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6bnVsbH0pLHNlfShDKTtTLmZpbmQ9ZCxTLmV4cHI9ZC5zZWxlY3RvcnMsUy5leHByWyI6Il09Uy5leHByLnBzZXVkb3MsUy51bmlxdWVTb3J0PVMudW5pcXVlPWQudW5pcXVlU29ydCxTLnRleHQ9ZC5nZXRUZXh0LFMuaXNYTUxEb2M9ZC5pc1hNTCxTLmNvbnRhaW5zPWQuY29udGFpbnMsUy5lc2NhcGVTZWxlY3Rvcj1kLmVzY2FwZTt2YXIgaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9W10saT12b2lkIDAhPT1uO3doaWxlKChlPWVbdF0pJiY5IT09ZS5ub2RlVHlwZSlpZigxPT09ZS5ub2RlVHlwZSl7aWYoaSYmUyhlKS5pcyhuKSlicmVhaztyLnB1c2goZSl9cmV0dXJuIHJ9LFQ9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49W107ZTtlPWUubmV4dFNpYmxpbmcpMT09PWUubm9kZVR5cGUmJmUhPT10JiZuLnB1c2goZSk7cmV0dXJuIG59LGs9Uy5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtmdW5jdGlvbiBBKGUsdCl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX12YXIgTj0vXjwoW2Etel1bXlwvXDA+Olx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaTtmdW5jdGlvbiBEKGUsbixyKXtyZXR1cm4gbShuKT9TLmdyZXAoZSxmdW5jdGlvbihlLHQpe3JldHVybiEhbi5jYWxsKGUsdCxlKSE9PXJ9KTpuLm5vZGVUeXBlP1MuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09biE9PXJ9KToic3RyaW5nIiE9dHlwZW9mIG4/Uy5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuLTE8aS5jYWxsKG4sZSkhPT1yfSk6Uy5maWx0ZXIobixlLHIpfVMuZmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP1MuZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106Uy5maW5kLm1hdGNoZXMoZSxTLmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LFMuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxpPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayhTKGUpLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7dDxyO3QrKylpZihTLmNvbnRhaW5zKGlbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLHQ9MDt0PHI7dCsrKVMuZmluZChlLGlbdF0sbik7cmV0dXJuIDE8cj9TLnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhEKHRoaXMsZXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhEKHRoaXMsZXx8W10sITApKX0saXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFEKHRoaXMsInN0cmluZyI9PXR5cGVvZiBlJiZrLnRlc3QoZSk/UyhlKTplfHxbXSwhMSkubGVuZ3RofX0pO3ZhciBqLHE9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsoUy5mbi5pbml0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKCFlKXJldHVybiB0aGlzO2lmKG49bnx8aiwic3RyaW5nIj09dHlwZW9mIGUpe2lmKCEocj0iPCI9PT1lWzBdJiYiPiI9PT1lW2UubGVuZ3RoLTFdJiYzPD1lLmxlbmd0aD9bbnVsbCxlLG51bGxdOnEuZXhlYyhlKSl8fCFyWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoclsxXSl7aWYodD10IGluc3RhbmNlb2YgUz90WzBdOnQsUy5tZXJnZSh0aGlzLFMucGFyc2VIVE1MKHJbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6RSwhMCkpLE4udGVzdChyWzFdKSYmUy5pc1BsYWluT2JqZWN0KHQpKWZvcihyIGluIHQpbSh0aGlzW3JdKT90aGlzW3JdKHRbcl0pOnRoaXMuYXR0cihyLHRbcl0pO3JldHVybiB0aGlzfXJldHVybihpPUUuZ2V0RWxlbWVudEJ5SWQoclsyXSkpJiYodGhpc1swXT1pLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXMpOm0oZSk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KGUpOmUoUyk6Uy5tYWtlQXJyYXkoZSx0aGlzKX0pLnByb3RvdHlwZT1TLmZuLGo9UyhFKTt2YXIgTD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxIPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2Z1bmN0aW9uIE8oZSx0KXt3aGlsZSgoZT1lW3RdKSYmMSE9PWUubm9kZVR5cGUpO3JldHVybiBlfVMuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9UyhlLHRoaXMpLG49dC5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxuO2UrKylpZihTLmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT0ic3RyaW5nIiE9dHlwZW9mIGUmJlMoZSk7aWYoIWsudGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT8tMTxhLmluZGV4KG4pOjE9PT1uLm5vZGVUeXBlJiZTLmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtvLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKDE8by5sZW5ndGg/Uy51bmlxdWVTb3J0KG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/aS5jYWxsKFMoZSksdGhpc1swXSk6aS5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhTLnVuaXF1ZVNvcnQoUy5tZXJnZSh0aGlzLmdldCgpLFMoZSx0KSkpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSksUy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBoKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaChlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gTyhlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBPKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBoKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIGgoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGgoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBoKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBUKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gVChlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZS5jb250ZW50RG9jdW1lbnQmJnIoZS5jb250ZW50RG9jdW1lbnQpP2UuY29udGVudERvY3VtZW50OihBKGUsInRlbXBsYXRlIikmJihlPWUuY29udGVudHx8ZSksUy5tZXJnZShbXSxlLmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKHIsaSl7Uy5mbltyXT1mdW5jdGlvbihlLHQpe3ZhciBuPVMubWFwKHRoaXMsaSxlKTtyZXR1cm4iVW50aWwiIT09ci5zbGljZSgtNSkmJih0PWUpLHQmJiJzdHJpbmciPT10eXBlb2YgdCYmKG49Uy5maWx0ZXIodCxuKSksMTx0aGlzLmxlbmd0aCYmKEhbcl18fFMudW5pcXVlU29ydChuKSxMLnRlc3QocikmJm4ucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgUD0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIFIoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gTShlKXt0aHJvdyBlfWZ1bmN0aW9uIEkoZSx0LG4scil7dmFyIGk7dHJ5e2UmJm0oaT1lLnByb21pc2UpP2kuY2FsbChlKS5kb25lKHQpLmZhaWwobik6ZSYmbShpPWUudGhlbik/aS5jYWxsKGUsdCxuKTp0LmFwcGx5KHZvaWQgMCxbZV0uc2xpY2UocikpfWNhdGNoKGUpe24uYXBwbHkodm9pZCAwLFtlXSl9fVMuQ2FsbGJhY2tzPWZ1bmN0aW9uKHIpe3ZhciBlLG47cj0ic3RyaW5nIj09dHlwZW9mIHI/KGU9cixuPXt9LFMuZWFjaChlLm1hdGNoKFApfHxbXSxmdW5jdGlvbihlLHQpe25bdF09ITB9KSxuKTpTLmV4dGVuZCh7fSxyKTt2YXIgaSx0LG8sYSxzPVtdLHU9W10sbD0tMSxjPWZ1bmN0aW9uKCl7Zm9yKGE9YXx8ci5vbmNlLG89aT0hMDt1Lmxlbmd0aDtsPS0xKXt0PXUuc2hpZnQoKTt3aGlsZSgrK2w8cy5sZW5ndGgpITE9PT1zW2xdLmFwcGx5KHRbMF0sdFsxXSkmJnIuc3RvcE9uRmFsc2UmJihsPXMubGVuZ3RoLHQ9ITEpfXIubWVtb3J5fHwodD0hMSksaT0hMSxhJiYocz10P1tdOiIiKX0sZj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIHMmJih0JiYhaSYmKGw9cy5sZW5ndGgtMSx1LnB1c2godCkpLGZ1bmN0aW9uIG4oZSl7Uy5lYWNoKGUsZnVuY3Rpb24oZSx0KXttKHQpP3IudW5pcXVlJiZmLmhhcyh0KXx8cy5wdXNoKHQpOnQmJnQubGVuZ3RoJiYic3RyaW5nIiE9PXcodCkmJm4odCl9KX0oYXJndW1lbnRzKSx0JiYhaSYmYygpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gUy5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihlLHQpe3ZhciBuO3doaWxlKC0xPChuPVMuaW5BcnJheSh0LHMsbikpKXMuc3BsaWNlKG4sMSksbjw9bCYmbC0tfSksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiBlPy0xPFMuaW5BcnJheShlLHMpOjA8cy5sZW5ndGh9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHMmJihzPVtdKSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9dT1bXSxzPXQ9IiIsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hc30sbG9jazpmdW5jdGlvbigpe3JldHVybiBhPXU9W10sdHx8aXx8KHM9dD0iIiksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISFhfSxmaXJlV2l0aDpmdW5jdGlvbihlLHQpe3JldHVybiBhfHwodD1bZSwodD10fHxbXSkuc2xpY2U/dC5zbGljZSgpOnRdLHUucHVzaCh0KSxpfHxjKCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIW99fTtyZXR1cm4gZn0sUy5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGUpe3ZhciBvPVtbIm5vdGlmeSIsInByb2dyZXNzIixTLkNhbGxiYWNrcygibWVtb3J5IiksUy5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxpPSJwZW5kaW5nIixhPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBpfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gcy5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LCJjYXRjaCI6ZnVuY3Rpb24oZSl7cmV0dXJuIGEudGhlbihudWxsLGUpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzO3JldHVybiBTLkRlZmVycmVkKGZ1bmN0aW9uKHIpe1MuZWFjaChvLGZ1bmN0aW9uKGUsdCl7dmFyIG49bShpW3RbNF1dKSYmaVt0WzRdXTtzW3RbMV1dKGZ1bmN0aW9uKCl7dmFyIGU9biYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSYmbShlLnByb21pc2UpP2UucHJvbWlzZSgpLnByb2dyZXNzKHIubm90aWZ5KS5kb25lKHIucmVzb2x2ZSkuZmFpbChyLnJlamVjdCk6clt0WzBdKyJXaXRoIl0odGhpcyxuP1tlXTphcmd1bWVudHMpfSl9KSxpPW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24odCxuLHIpe3ZhciB1PTA7ZnVuY3Rpb24gbChpLG8sYSxzKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLHI9YXJndW1lbnRzLGU9ZnVuY3Rpb24oKXt2YXIgZSx0O2lmKCEoaTx1KSl7aWYoKGU9YS5hcHBseShuLHIpKT09PW8ucHJvbWlzZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvbiIpO3Q9ZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpJiZlLnRoZW4sbSh0KT9zP3QuY2FsbChlLGwodSxvLFIscyksbCh1LG8sTSxzKSk6KHUrKyx0LmNhbGwoZSxsKHUsbyxSLHMpLGwodSxvLE0scyksbCh1LG8sUixvLm5vdGlmeVdpdGgpKSk6KGEhPT1SJiYobj12b2lkIDAscj1bZV0pLChzfHxvLnJlc29sdmVXaXRoKShuLHIpKX19LHQ9cz9lOmZ1bmN0aW9uKCl7dHJ5e2UoKX1jYXRjaChlKXtTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJlMuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhlLHQuc3RhY2tUcmFjZSksdTw9aSsxJiYoYSE9PU0mJihuPXZvaWQgMCxyPVtlXSksby5yZWplY3RXaXRoKG4scikpfX07aT90KCk6KFMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYodC5zdGFja1RyYWNlPVMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLEMuc2V0VGltZW91dCh0KSl9fXJldHVybiBTLkRlZmVycmVkKGZ1bmN0aW9uKGUpe29bMF1bM10uYWRkKGwoMCxlLG0ocik/cjpSLGUubm90aWZ5V2l0aCkpLG9bMV1bM10uYWRkKGwoMCxlLG0odCk/dDpSKSksb1syXVszXS5hZGQobCgwLGUsbShuKT9uOk0pKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT9TLmV4dGVuZChlLGEpOmF9fSxzPXt9O3JldHVybiBTLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBuPXRbMl0scj10WzVdO2FbdFsxXV09bi5hZGQsciYmbi5hZGQoZnVuY3Rpb24oKXtpPXJ9LG9bMy1lXVsyXS5kaXNhYmxlLG9bMy1lXVszXS5kaXNhYmxlLG9bMF1bMl0ubG9jayxvWzBdWzNdLmxvY2spLG4uYWRkKHRbM10uZmlyZSksc1t0WzBdXT1mdW5jdGlvbigpe3JldHVybiBzW3RbMF0rIldpdGgiXSh0aGlzPT09cz92b2lkIDA6dGhpcyxhcmd1bWVudHMpLHRoaXN9LHNbdFswXSsiV2l0aCJdPW4uZmlyZVdpdGh9KSxhLnByb21pc2UocyksZSYmZS5jYWxsKHMscyksc30sd2hlbjpmdW5jdGlvbihlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHQ9bixyPUFycmF5KHQpLGk9cy5jYWxsKGFyZ3VtZW50cyksbz1TLkRlZmVycmVkKCksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7clt0XT10aGlzLGlbdF09MTxhcmd1bWVudHMubGVuZ3RoP3MuY2FsbChhcmd1bWVudHMpOmUsLS1ufHxvLnJlc29sdmVXaXRoKHIsaSl9fTtpZihuPD0xJiYoSShlLG8uZG9uZShhKHQpKS5yZXNvbHZlLG8ucmVqZWN0LCFuKSwicGVuZGluZyI9PT1vLnN0YXRlKCl8fG0oaVt0XSYmaVt0XS50aGVuKSkpcmV0dXJuIG8udGhlbigpO3doaWxlKHQtLSlJKGlbdF0sYSh0KSxvLnJlamVjdCk7cmV0dXJuIG8ucHJvbWlzZSgpfX0pO3ZhciBXPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1MuRGVmZXJyZWQuZXhjZXB0aW9uSG9vaz1mdW5jdGlvbihlLHQpe0MuY29uc29sZSYmQy5jb25zb2xlLndhcm4mJmUmJlcudGVzdChlLm5hbWUpJiZDLmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIitlLm1lc3NhZ2UsZS5zdGFjayx0KX0sUy5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbihlKXtDLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBlfSl9O3ZhciBGPVMuRGVmZXJyZWQoKTtmdW5jdGlvbiBCKCl7RS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCKSxDLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLEIpLFMucmVhZHkoKX1TLmZuLnJlYWR5PWZ1bmN0aW9uKGUpe3JldHVybiBGLnRoZW4oZSlbImNhdGNoIl0oZnVuY3Rpb24oZSl7Uy5yZWFkeUV4Y2VwdGlvbihlKX0pLHRoaXN9LFMuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKGUpeyghMD09PWU/LS1TLnJlYWR5V2FpdDpTLmlzUmVhZHkpfHwoUy5pc1JlYWR5PSEwKSE9PWUmJjA8LS1TLnJlYWR5V2FpdHx8Ri5yZXNvbHZlV2l0aChFLFtTXSl9fSksUy5yZWFkeS50aGVuPUYudGhlbiwiY29tcGxldGUiPT09RS5yZWFkeVN0YXRlfHwibG9hZGluZyIhPT1FLnJlYWR5U3RhdGUmJiFFLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9DLnNldFRpbWVvdXQoUy5yZWFkeSk6KEUuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiksQy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixCKSk7dmFyICQ9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSl7dmFyIHM9MCx1PWUubGVuZ3RoLGw9bnVsbD09bjtpZigib2JqZWN0Ij09PXcobikpZm9yKHMgaW4gaT0hMCxuKSQoZSx0LHMsbltzXSwhMCxvLGEpO2Vsc2UgaWYodm9pZCAwIT09ciYmKGk9ITAsbShyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbChTKGUpLG4pfSkpLHQpKWZvcig7czx1O3MrKyl0KGVbc10sbixhP3I6ci5jYWxsKGVbc10scyx0KGVbc10sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LF89L14tbXMtLyx6PS8tKFthLXpdKS9nO2Z1bmN0aW9uIFUoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIFgoZSl7cmV0dXJuIGUucmVwbGFjZShfLCJtcy0iKS5yZXBsYWNlKHosVSl9dmFyIFY9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBHKCl7dGhpcy5leHBhbmRvPVMuZXhwYW5kbytHLnVpZCsrfUcudWlkPTEsRy5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdHx8KHQ9e30sVihlKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXQ6T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdGhpcy5leHBhbmRvLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pKSksdH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPXRoaXMuY2FjaGUoZSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KWlbWCh0KV09bjtlbHNlIGZvcihyIGluIHQpaVtYKHIpXT10W3JdO3JldHVybiBpfSxnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmNhY2hlKGUpOmVbdGhpcy5leHBhbmRvXSYmZVt0aGlzLmV4cGFuZG9dW1godCldfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10fHx0JiYic3RyaW5nIj09dHlwZW9mIHQmJnZvaWQgMD09PW4/dGhpcy5nZXQoZSx0KToodGhpcy5zZXQoZSx0LG4pLHZvaWQgMCE9PW4/bjp0KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lW3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09dCl7bj0odD1BcnJheS5pc0FycmF5KHQpP3QubWFwKFgpOih0PVgodCkpaW4gcj9bdF06dC5tYXRjaChQKXx8W10pLmxlbmd0aDt3aGlsZShuLS0pZGVsZXRlIHJbdFtuXV19KHZvaWQgMD09PXR8fFMuaXNFbXB0eU9iamVjdChyKSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGVbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09dCYmIVMuaXNFbXB0eU9iamVjdCh0KX19O3ZhciBZPW5ldyBHLFE9bmV3IEcsSj0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLEs9L1tBLVpdL2c7ZnVuY3Rpb24gWihlLHQsbil7dmFyIHIsaTtpZih2b2lkIDA9PT1uJiYxPT09ZS5ub2RlVHlwZSlpZihyPSJkYXRhLSIrdC5yZXBsYWNlKEssIi0kJiIpLnRvTG93ZXJDYXNlKCksInN0cmluZyI9PXR5cGVvZihuPWUuZ2V0QXR0cmlidXRlKHIpKSl7dHJ5e249InRydWUiPT09KGk9bil8fCJmYWxzZSIhPT1pJiYoIm51bGwiPT09aT9udWxsOmk9PT0raSsiIj8raTpKLnRlc3QoaSk/SlNPTi5wYXJzZShpKTppKX1jYXRjaChlKXt9US5zZXQoZSx0LG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59Uy5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIFEuaGFzRGF0YShlKXx8WS5oYXNEYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gUS5hY2Nlc3MoZSx0LG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7US5yZW1vdmUoZSx0KX0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBZLmFjY2VzcyhlLHQsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7WS5yZW1vdmUoZSx0KX19KSxTLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihuLGUpe3ZhciB0LHIsaSxvPXRoaXNbMF0sYT1vJiZvLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09bil7aWYodGhpcy5sZW5ndGgmJihpPVEuZ2V0KG8pLDE9PT1vLm5vZGVUeXBlJiYhWS5nZXQobywiaGFzRGF0YUF0dHJzIikpKXt0PWEubGVuZ3RoO3doaWxlKHQtLSlhW3RdJiYwPT09KHI9YVt0XS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpJiYocj1YKHIuc2xpY2UoNSkpLFoobyxyLGlbcl0pKTtZLnNldChvLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gaX1yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIG4/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7US5zZXQodGhpcyxuKX0pOiQodGhpcyxmdW5jdGlvbihlKXt2YXIgdDtpZihvJiZ2b2lkIDA9PT1lKXJldHVybiB2b2lkIDAhPT0odD1RLmdldChvLG4pKT90OnZvaWQgMCE9PSh0PVoobyxuKSk/dDp2b2lkIDA7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7US5zZXQodGhpcyxuLGUpfSl9LG51bGwsZSwxPGFyZ3VtZW50cy5sZW5ndGgsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1EucmVtb3ZlKHRoaXMsZSl9KX19KSxTLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKGUpcmV0dXJuIHQ9KHR8fCJmeCIpKyJxdWV1ZSIscj1ZLmdldChlLHQpLG4mJighcnx8QXJyYXkuaXNBcnJheShuKT9yPVkuYWNjZXNzKGUsdCxTLm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXX0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ImZ4Ijt2YXIgbj1TLnF1ZXVlKGUsdCkscj1uLmxlbmd0aCxpPW4uc2hpZnQoKSxvPVMuX3F1ZXVlSG9va3MoZSx0KTsiaW5wcm9ncmVzcyI9PT1pJiYoaT1uLnNoaWZ0KCksci0tKSxpJiYoImZ4Ij09PXQmJm4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBvLnN0b3AsaS5jYWxsKGUsZnVuY3Rpb24oKXtTLmRlcXVldWUoZSx0KX0sbykpLCFyJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4gWS5nZXQoZSxuKXx8WS5hY2Nlc3MoZSxuLHtlbXB0eTpTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtZLnJlbW92ZShlLFt0KyJxdWV1ZSIsbl0pfSl9KX19KSxTLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24odCxuKXt2YXIgZT0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmKG49dCx0PSJmeCIsZS0tKSxhcmd1bWVudHMubGVuZ3RoPGU/Uy5xdWV1ZSh0aGlzWzBdLHQpOnZvaWQgMD09PW4/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1TLnF1ZXVlKHRoaXMsdCxuKTtTLl9xdWV1ZUhvb2tzKHRoaXMsdCksImZ4Ij09PXQmJiJpbnByb2dyZXNzIiE9PWVbMF0mJlMuZGVxdWV1ZSh0aGlzLHQpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZGVxdWV1ZSh0aGlzLGUpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTEsaT1TLkRlZmVycmVkKCksbz10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8aS5yZXNvbHZlV2l0aChvLFtvXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZT1lfHwiZngiO3doaWxlKGEtLSkobj1ZLmdldChvW2FdLGUrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksaS5wcm9taXNlKHQpfX0pO3ZhciBlZT0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSx0ZT1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrZWUrIikoW2EteiVdKikkIiwiaSIpLG5lPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0scmU9RS5kb2N1bWVudEVsZW1lbnQsaWU9ZnVuY3Rpb24oZSl7cmV0dXJuIFMuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfSxvZT17Y29tcG9zZWQ6ITB9O3JlLmdldFJvb3ROb2RlJiYoaWU9ZnVuY3Rpb24oZSl7cmV0dXJuIFMuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHxlLmdldFJvb3ROb2RlKG9lKT09PWUub3duZXJEb2N1bWVudH0pO3ZhciBhZT1mdW5jdGlvbihlLHQpe3JldHVybiJub25lIj09PShlPXR8fGUpLnN0eWxlLmRpc3BsYXl8fCIiPT09ZS5zdHlsZS5kaXNwbGF5JiZpZShlKSYmIm5vbmUiPT09Uy5jc3MoZSwiZGlzcGxheSIpfTtmdW5jdGlvbiBzZShlLHQsbixyKXt2YXIgaSxvLGE9MjAscz1yP2Z1bmN0aW9uKCl7cmV0dXJuIHIuY3VyKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIFMuY3NzKGUsdCwiIil9LHU9cygpLGw9biYmblszXXx8KFMuY3NzTnVtYmVyW3RdPyIiOiJweCIpLGM9ZS5ub2RlVHlwZSYmKFMuY3NzTnVtYmVyW3RdfHwicHgiIT09bCYmK3UpJiZ0ZS5leGVjKFMuY3NzKGUsdCkpO2lmKGMmJmNbM10hPT1sKXt1Lz0yLGw9bHx8Y1szXSxjPSt1fHwxO3doaWxlKGEtLSlTLnN0eWxlKGUsdCxjK2wpLCgxLW8pKigxLShvPXMoKS91fHwuNSkpPD0wJiYoYT0wKSxjLz1vO2MqPTIsUy5zdHlsZShlLHQsYytsKSxuPW58fFtdfXJldHVybiBuJiYoYz0rY3x8K3V8fDAsaT1uWzFdP2MrKG5bMV0rMSkqblsyXTorblsyXSxyJiYoci51bml0PWwsci5zdGFydD1jLHIuZW5kPWkpKSxpfXZhciB1ZT17fTtmdW5jdGlvbiBsZShlLHQpe2Zvcih2YXIgbixyLGksbyxhLHMsdSxsPVtdLGM9MCxmPWUubGVuZ3RoO2M8ZjtjKyspKHI9ZVtjXSkuc3R5bGUmJihuPXIuc3R5bGUuZGlzcGxheSx0Pygibm9uZSI9PT1uJiYobFtjXT1ZLmdldChyLCJkaXNwbGF5Iil8fG51bGwsbFtjXXx8KHIuc3R5bGUuZGlzcGxheT0iIikpLCIiPT09ci5zdHlsZS5kaXNwbGF5JiZhZShyKSYmKGxbY109KHU9YT1vPXZvaWQgMCxhPShpPXIpLm93bmVyRG9jdW1lbnQscz1pLm5vZGVOYW1lLCh1PXVlW3NdKXx8KG89YS5ib2R5LmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudChzKSksdT1TLmNzcyhvLCJkaXNwbGF5Iiksby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pLCJub25lIj09PXUmJih1PSJibG9jayIpLHVlW3NdPXUpKSkpOiJub25lIiE9PW4mJihsW2NdPSJub25lIixZLnNldChyLCJkaXNwbGF5IixuKSkpO2ZvcihjPTA7YzxmO2MrKyludWxsIT1sW2NdJiYoZVtjXS5zdHlsZS5kaXNwbGF5PWxbY10pO3JldHVybiBlfVMuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIGxlKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIGxlKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZT9lP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2FlKHRoaXMpP1ModGhpcykuc2hvdygpOlModGhpcykuaGlkZSgpfSl9fSk7dmFyIGNlLGZlLHBlPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLGRlPS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKS9pLGhlPS9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaTtjZT1FLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChFLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSwoZmU9RS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGZlLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxmZS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksY2UuYXBwZW5kQ2hpbGQoZmUpLHkuY2hlY2tDbG9uZT1jZS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsY2UuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+Iix5Lm5vQ2xvbmVDaGVja2VkPSEhY2UuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlLGNlLmlubmVySFRNTD0iPG9wdGlvbj48L29wdGlvbj4iLHkub3B0aW9uPSEhY2UubGFzdENoaWxkO3ZhciBnZT17dGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2Z1bmN0aW9uIHZlKGUsdCl7dmFyIG47cmV0dXJuIG49InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHx8IioiKToidW5kZWZpbmVkIiE9dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbD9lLnF1ZXJ5U2VsZWN0b3JBbGwodHx8IioiKTpbXSx2b2lkIDA9PT10fHx0JiZBKGUsdCk/Uy5tZXJnZShbZV0sbik6bn1mdW5jdGlvbiB5ZShlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylZLnNldChlW25dLCJnbG9iYWxFdmFsIiwhdHx8WS5nZXQodFtuXSwiZ2xvYmFsRXZhbCIpKX1nZS50Ym9keT1nZS50Zm9vdD1nZS5jb2xncm91cD1nZS5jYXB0aW9uPWdlLnRoZWFkLGdlLnRoPWdlLnRkLHkub3B0aW9ufHwoZ2Uub3B0Z3JvdXA9Z2Uub3B0aW9uPVsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0pO3ZhciBtZT0vPHwmIz9cdys7LztmdW5jdGlvbiB4ZShlLHQsbixyLGkpe2Zvcih2YXIgbyxhLHMsdSxsLGMsZj10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxwPVtdLGQ9MCxoPWUubGVuZ3RoO2Q8aDtkKyspaWYoKG89ZVtkXSl8fDA9PT1vKWlmKCJvYmplY3QiPT09dyhvKSlTLm1lcmdlKHAsby5ub2RlVHlwZT9bb106byk7ZWxzZSBpZihtZS50ZXN0KG8pKXthPWF8fGYuYXBwZW5kQ2hpbGQodC5jcmVhdGVFbGVtZW50KCJkaXYiKSkscz0oZGUuZXhlYyhvKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSx1PWdlW3NdfHxnZS5fZGVmYXVsdCxhLmlubmVySFRNTD11WzFdK1MuaHRtbFByZWZpbHRlcihvKSt1WzJdLGM9dVswXTt3aGlsZShjLS0pYT1hLmxhc3RDaGlsZDtTLm1lcmdlKHAsYS5jaGlsZE5vZGVzKSwoYT1mLmZpcnN0Q2hpbGQpLnRleHRDb250ZW50PSIifWVsc2UgcC5wdXNoKHQuY3JlYXRlVGV4dE5vZGUobykpO2YudGV4dENvbnRlbnQ9IiIsZD0wO3doaWxlKG89cFtkKytdKWlmKHImJi0xPFMuaW5BcnJheShvLHIpKWkmJmkucHVzaChvKTtlbHNlIGlmKGw9aWUobyksYT12ZShmLmFwcGVuZENoaWxkKG8pLCJzY3JpcHQiKSxsJiZ5ZShhKSxuKXtjPTA7d2hpbGUobz1hW2MrK10paGUudGVzdChvLnR5cGV8fCIiKSYmbi5wdXNoKG8pfXJldHVybiBmfXZhciBiZT0vXmtleS8sd2U9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLFRlPS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiBDZSgpe3JldHVybiEwfWZ1bmN0aW9uIEVlKCl7cmV0dXJuITF9ZnVuY3Rpb24gU2UoZSx0KXtyZXR1cm4gZT09PWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBFLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX0oKT09KCJmb2N1cyI9PT10KX1mdW5jdGlvbiBrZShlLHQsbixyLGksbyl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIHQpe2ZvcihzIGluInN0cmluZyIhPXR5cGVvZiBuJiYocj1yfHxuLG49dm9pZCAwKSx0KWtlKGUscyxuLHIsdFtzXSxvKTtyZXR1cm4gZX1pZihudWxsPT1yJiZudWxsPT1pPyhpPW4scj1uPXZvaWQgMCk6bnVsbD09aSYmKCJzdHJpbmciPT10eXBlb2Ygbj8oaT1yLHI9dm9pZCAwKTooaT1yLHI9bixuPXZvaWQgMCkpLCExPT09aSlpPUVlO2Vsc2UgaWYoIWkpcmV0dXJuIGU7cmV0dXJuIDE9PT1vJiYoYT1pLChpPWZ1bmN0aW9uKGUpe3JldHVybiBTKCkub2ZmKGUpLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSkuZ3VpZD1hLmd1aWR8fChhLmd1aWQ9Uy5ndWlkKyspKSxlLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LmFkZCh0aGlzLHQsaSxyLG4pfSl9ZnVuY3Rpb24gQWUoZSxpLG8pe28/KFkuc2V0KGUsaSwhMSksUy5ldmVudC5hZGQoZSxpLHtuYW1lc3BhY2U6ITEsaGFuZGxlcjpmdW5jdGlvbihlKXt2YXIgdCxuLHI9WS5nZXQodGhpcyxpKTtpZigxJmUuaXNUcmlnZ2VyJiZ0aGlzW2ldKXtpZihyLmxlbmd0aCkoUy5ldmVudC5zcGVjaWFsW2ldfHx7fSkuZGVsZWdhdGVUeXBlJiZlLnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYocj1zLmNhbGwoYXJndW1lbnRzKSxZLnNldCh0aGlzLGksciksdD1vKHRoaXMsaSksdGhpc1tpXSgpLHIhPT0obj1ZLmdldCh0aGlzLGkpKXx8dD9ZLnNldCh0aGlzLGksITEpOm49e30sciE9PW4pcmV0dXJuIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksZS5wcmV2ZW50RGVmYXVsdCgpLG4udmFsdWV9ZWxzZSByLmxlbmd0aCYmKFkuc2V0KHRoaXMsaSx7dmFsdWU6Uy5ldmVudC50cmlnZ2VyKFMuZXh0ZW5kKHJbMF0sUy5FdmVudC5wcm90b3R5cGUpLHIuc2xpY2UoMSksdGhpcyl9KSxlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpKX19KSk6dm9pZCAwPT09WS5nZXQoZSxpKSYmUy5ldmVudC5hZGQoZSxpLENlKX1TLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx2PVkuZ2V0KHQpO2lmKFYodCkpe24uaGFuZGxlciYmKG49KG89bikuaGFuZGxlcixpPW8uc2VsZWN0b3IpLGkmJlMuZmluZC5tYXRjaGVzU2VsZWN0b3IocmUsaSksbi5ndWlkfHwobi5ndWlkPVMuZ3VpZCsrKSwodT12LmV2ZW50cyl8fCh1PXYuZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCkpLChhPXYuaGFuZGxlKXx8KGE9di5oYW5kbGU9ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBTJiZTLmV2ZW50LnRyaWdnZXJlZCE9PWUudHlwZT9TLmV2ZW50LmRpc3BhdGNoLmFwcGx5KHQsYXJndW1lbnRzKTp2b2lkIDB9KSxsPShlPShlfHwiIikubWF0Y2goUCl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0pZD1nPShzPVRlLmV4ZWMoZVtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCYmKGY9Uy5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShpP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkLGY9Uy5ldmVudC5zcGVjaWFsW2RdfHx7fSxjPVMuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOmksbmVlZHNDb250ZXh0OmkmJlMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChpKSxuYW1lc3BhY2U6aC5qb2luKCIuIil9LG8pLChwPXVbZF0pfHwoKHA9dVtkXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKHQscixoLGEpfHx0LmFkZEV2ZW50TGlzdGVuZXImJnQuYWRkRXZlbnRMaXN0ZW5lcihkLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwodCxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLGk/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpwLnB1c2goYyksUy5ldmVudC5nbG9iYWxbZF09ITApfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx2PVkuaGFzRGF0YShlKSYmWS5nZXQoZSk7aWYodiYmKHU9di5ldmVudHMpKXtsPSh0PSh0fHwiIikubWF0Y2goUCl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0paWYoZD1nPShzPVRlLmV4ZWModFtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCl7Zj1TLmV2ZW50LnNwZWNpYWxbZF18fHt9LHA9dVtkPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9bz1wLmxlbmd0aDt3aGlsZShvLS0pYz1wW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxzJiYhcy50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJigiKioiIT09cnx8IWMuc2VsZWN0b3IpfHwocC5zcGxpY2UobywxKSxjLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbChlLGMpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbChlLGgsdi5oYW5kbGUpfHxTLnJlbW92ZUV2ZW50KGUsZCx2LmhhbmRsZSksZGVsZXRlIHVbZF0pfWVsc2UgZm9yKGQgaW4gdSlTLmV2ZW50LnJlbW92ZShlLGQrdFtsXSxuLHIsITApO1MuaXNFbXB0eU9iamVjdCh1KSYmWS5yZW1vdmUoZSwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHM9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLHU9Uy5ldmVudC5maXgoZSksbD0oWS5nZXQodGhpcywiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW3UudHlwZV18fFtdLGM9Uy5ldmVudC5zcGVjaWFsW3UudHlwZV18fHt9O2ZvcihzWzBdPXUsdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspc1t0XT1hcmd1bWVudHNbdF07aWYodS5kZWxlZ2F0ZVRhcmdldD10aGlzLCFjLnByZURpc3BhdGNofHwhMSE9PWMucHJlRGlzcGF0Y2guY2FsbCh0aGlzLHUpKXthPVMuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLHUsbCksdD0wO3doaWxlKChpPWFbdCsrXSkmJiF1LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe3UuY3VycmVudFRhcmdldD1pLmVsZW0sbj0wO3doaWxlKChvPWkuaGFuZGxlcnNbbisrXSkmJiF1LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpdS5ybmFtZXNwYWNlJiYhMSE9PW8ubmFtZXNwYWNlJiYhdS5ybmFtZXNwYWNlLnRlc3Qoby5uYW1lc3BhY2UpfHwodS5oYW5kbGVPYmo9byx1LmRhdGE9by5kYXRhLHZvaWQgMCE9PShyPSgoUy5ldmVudC5zcGVjaWFsW28ub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxvLmhhbmRsZXIpLmFwcGx5KGkuZWxlbSxzKSkmJiExPT09KHUucmVzdWx0PXIpJiYodS5wcmV2ZW50RGVmYXVsdCgpLHUuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gYy5wb3N0RGlzcGF0Y2gmJmMucG9zdERpc3BhdGNoLmNhbGwodGhpcyx1KSx1LnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzPVtdLHU9dC5kZWxlZ2F0ZUNvdW50LGw9ZS50YXJnZXQ7aWYodSYmbC5ub2RlVHlwZSYmISgiY2xpY2siPT09ZS50eXBlJiYxPD1lLmJ1dHRvbikpZm9yKDtsIT09dGhpcztsPWwucGFyZW50Tm9kZXx8dGhpcylpZigxPT09bC5ub2RlVHlwZSYmKCJjbGljayIhPT1lLnR5cGV8fCEwIT09bC5kaXNhYmxlZCkpe2ZvcihvPVtdLGE9e30sbj0wO248dTtuKyspdm9pZCAwPT09YVtpPShyPXRbbl0pLnNlbGVjdG9yKyIgIl0mJihhW2ldPXIubmVlZHNDb250ZXh0Py0xPFMoaSx0aGlzKS5pbmRleChsKTpTLmZpbmQoaSx0aGlzLG51bGwsW2xdKS5sZW5ndGgpLGFbaV0mJm8ucHVzaChyKTtvLmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6b30pfXJldHVybiBsPXRoaXMsdTx0Lmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6dC5zbGljZSh1KX0pLHN9LGFkZFByb3A6ZnVuY3Rpb24odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoUy5FdmVudC5wcm90b3R5cGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0Om0oZSk/ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIGUodGhpcy5vcmlnaW5hbEV2ZW50KX06ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFt0XX0sc2V0OmZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KX19KX0sZml4OmZ1bmN0aW9uKGUpe3JldHVybiBlW1MuZXhwYW5kb10/ZTpuZXcgUy5FdmVudChlKX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGNsaWNrOntzZXR1cDpmdW5jdGlvbihlKXt2YXIgdD10aGlzfHxlO3JldHVybiBwZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJkEodCwiaW5wdXQiKSYmQWUodCwiY2xpY2siLENlKSwhMX0sdHJpZ2dlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzfHxlO3JldHVybiBwZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJkEodCwiaW5wdXQiKSYmQWUodCwiY2xpY2siKSwhMH0sX2RlZmF1bHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQ7cmV0dXJuIHBlLnRlc3QodC50eXBlKSYmdC5jbGljayYmQSh0LCJpbnB1dCIpJiZZLmdldCh0LCJjbGljayIpfHxBKHQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUucmVzdWx0JiZlLm9yaWdpbmFsRXZlbnQmJihlLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZS5yZXN1bHQpfX19fSxTLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUsdCxuKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXImJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4pfSxTLkV2ZW50PWZ1bmN0aW9uKGUsdCl7aWYoISh0aGlzIGluc3RhbmNlb2YgUy5FdmVudCkpcmV0dXJuIG5ldyBTLkV2ZW50KGUsdCk7ZSYmZS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9ZSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWUuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09ZS5kZWZhdWx0UHJldmVudGVkJiYhMT09PWUucmV0dXJuVmFsdWU/Q2U6RWUsdGhpcy50YXJnZXQ9ZS50YXJnZXQmJjM9PT1lLnRhcmdldC5ub2RlVHlwZT9lLnRhcmdldC5wYXJlbnROb2RlOmUudGFyZ2V0LHRoaXMuY3VycmVudFRhcmdldD1lLmN1cnJlbnRUYXJnZXQsdGhpcy5yZWxhdGVkVGFyZ2V0PWUucmVsYXRlZFRhcmdldCk6dGhpcy50eXBlPWUsdCYmUy5leHRlbmQodGhpcyx0KSx0aGlzLnRpbWVTdGFtcD1lJiZlLnRpbWVTdGFtcHx8RGF0ZS5ub3coKSx0aGlzW1MuZXhwYW5kb109ITB9LFMuRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpTLkV2ZW50LGlzRGVmYXVsdFByZXZlbnRlZDpFZSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpFZSxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpFZSxpc1NpbXVsYXRlZDohMSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1DZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1DZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9Q2UsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LFMuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCwiY2hhciI6ITAsY29kZTohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbihlKXt2YXIgdD1lLmJ1dHRvbjtyZXR1cm4gbnVsbD09ZS53aGljaCYmYmUudGVzdChlLnR5cGUpP251bGwhPWUuY2hhckNvZGU/ZS5jaGFyQ29kZTplLmtleUNvZGU6IWUud2hpY2gmJnZvaWQgMCE9PXQmJndlLnRlc3QoZS50eXBlKT8xJnQ/MToyJnQ/Mzo0JnQ/MjowOmUud2hpY2h9fSxTLmV2ZW50LmFkZFByb3ApLFMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXtTLmV2ZW50LnNwZWNpYWxbZV09e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIEFlKHRoaXMsZSxTZSksITF9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gQWUodGhpcyxlKSwhMH0sZGVsZWdhdGVUeXBlOnR9fSksUy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLGkpe1MuZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOmksYmluZFR5cGU6aSxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLnJlbGF0ZWRUYXJnZXQscj1lLmhhbmRsZU9iajtyZXR1cm4gbiYmKG49PT10aGlzfHxTLmNvbnRhaW5zKHRoaXMsbikpfHwoZS50eXBlPXIub3JpZ1R5cGUsdD1yLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT1pKSx0fX19KSxTLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGtlKHRoaXMsZSx0LG4scil9LG9uZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4ga2UodGhpcyxlLHQsbixyLDEpfSxvZmY6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7aWYoZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5oYW5kbGVPYmopcmV0dXJuIHI9ZS5oYW5kbGVPYmosUyhlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2U/ci5vcmlnVHlwZSsiLiIrci5uYW1lc3BhY2U6ci5vcmlnVHlwZSxyLnNlbGVjdG9yLHIuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIGUpe2ZvcihpIGluIGUpdGhpcy5vZmYoaSx0LGVbaV0pO3JldHVybiB0aGlzfXJldHVybiExIT09dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHR8fChuPXQsdD12b2lkIDApLCExPT09biYmKG49RWUpLHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQucmVtb3ZlKHRoaXMsZSxuLHQpfSl9fSk7dmFyIE5lPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLERlPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGplPS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZztmdW5jdGlvbiBxZShlLHQpe3JldHVybiBBKGUsInRhYmxlIikmJkEoMTEhPT10Lm5vZGVUeXBlP3Q6dC5maXJzdENoaWxkLCJ0ciIpJiZTKGUpLmNoaWxkcmVuKCJ0Ym9keSIpWzBdfHxlfWZ1bmN0aW9uIExlKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gSGUoZSl7cmV0dXJuInRydWUvIj09PShlLnR5cGV8fCIiKS5zbGljZSgwLDUpP2UudHlwZT1lLnR5cGUuc2xpY2UoNSk6ZS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxlfWZ1bmN0aW9uIE9lKGUsdCl7dmFyIG4scixpLG8sYSxzO2lmKDE9PT10Lm5vZGVUeXBlKXtpZihZLmhhc0RhdGEoZSkmJihzPVkuZ2V0KGUpLmV2ZW50cykpZm9yKGkgaW4gWS5yZW1vdmUodCwiaGFuZGxlIGV2ZW50cyIpLHMpZm9yKG49MCxyPXNbaV0ubGVuZ3RoO248cjtuKyspUy5ldmVudC5hZGQodCxpLHNbaV1bbl0pO1EuaGFzRGF0YShlKSYmKG89US5hY2Nlc3MoZSksYT1TLmV4dGVuZCh7fSxvKSxRLnNldCh0LGEpKX19ZnVuY3Rpb24gUGUobixyLGksbyl7cj1nKHIpO3ZhciBlLHQsYSxzLHUsbCxjPTAsZj1uLmxlbmd0aCxwPWYtMSxkPXJbMF0saD1tKGQpO2lmKGh8fDE8ZiYmInN0cmluZyI9PXR5cGVvZiBkJiYheS5jaGVja0Nsb25lJiZEZS50ZXN0KGQpKXJldHVybiBuLmVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bi5lcShlKTtoJiYoclswXT1kLmNhbGwodGhpcyxlLHQuaHRtbCgpKSksUGUodCxyLGksbyl9KTtpZihmJiYodD0oZT14ZShyLG5bMF0ub3duZXJEb2N1bWVudCwhMSxuLG8pKS5maXJzdENoaWxkLDE9PT1lLmNoaWxkTm9kZXMubGVuZ3RoJiYoZT10KSx0fHxvKSl7Zm9yKHM9KGE9Uy5tYXAodmUoZSwic2NyaXB0IiksTGUpKS5sZW5ndGg7YzxmO2MrKyl1PWUsYyE9PXAmJih1PVMuY2xvbmUodSwhMCwhMCkscyYmUy5tZXJnZShhLHZlKHUsInNjcmlwdCIpKSksaS5jYWxsKG5bY10sdSxjKTtpZihzKWZvcihsPWFbYS5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxTLm1hcChhLEhlKSxjPTA7YzxzO2MrKyl1PWFbY10saGUudGVzdCh1LnR5cGV8fCIiKSYmIVkuYWNjZXNzKHUsImdsb2JhbEV2YWwiKSYmUy5jb250YWlucyhsLHUpJiYodS5zcmMmJiJtb2R1bGUiIT09KHUudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/Uy5fZXZhbFVybCYmIXUubm9Nb2R1bGUmJlMuX2V2YWxVcmwodS5zcmMse25vbmNlOnUubm9uY2V8fHUuZ2V0QXR0cmlidXRlKCJub25jZSIpfSxsKTpiKHUudGV4dENvbnRlbnQucmVwbGFjZShqZSwiIiksdSxsKSl9cmV0dXJuIG59ZnVuY3Rpb24gUmUoZSx0LG4pe2Zvcih2YXIgcixpPXQ/Uy5maWx0ZXIodCxlKTplLG89MDtudWxsIT0ocj1pW29dKTtvKyspbnx8MSE9PXIubm9kZVR5cGV8fFMuY2xlYW5EYXRhKHZlKHIpKSxyLnBhcmVudE5vZGUmJihuJiZpZShyKSYmeWUodmUociwic2NyaXB0IikpLHIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKSk7cmV0dXJuIGV9Uy5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LGNsb25lOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjPWUuY2xvbmVOb2RlKCEwKSxmPWllKGUpO2lmKCEoeS5ub0Nsb25lQ2hlY2tlZHx8MSE9PWUubm9kZVR5cGUmJjExIT09ZS5ub2RlVHlwZXx8Uy5pc1hNTERvYyhlKSkpZm9yKGE9dmUoYykscj0wLGk9KG89dmUoZSkpLmxlbmd0aDtyPGk7cisrKXM9b1tyXSx1PWFbcl0sdm9pZCAwLCJpbnB1dCI9PT0obD11Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpJiZwZS50ZXN0KHMudHlwZSk/dS5jaGVja2VkPXMuY2hlY2tlZDoiaW5wdXQiIT09bCYmInRleHRhcmVhIiE9PWx8fCh1LmRlZmF1bHRWYWx1ZT1zLmRlZmF1bHRWYWx1ZSk7aWYodClpZihuKWZvcihvPW98fHZlKGUpLGE9YXx8dmUoYykscj0wLGk9by5sZW5ndGg7cjxpO3IrKylPZShvW3JdLGFbcl0pO2Vsc2UgT2UoZSxjKTtyZXR1cm4gMDwoYT12ZShjLCJzY3JpcHQiKSkubGVuZ3RoJiZ5ZShhLCFmJiZ2ZShlLCJzY3JpcHQiKSksY30sY2xlYW5EYXRhOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHIsaT1TLmV2ZW50LnNwZWNpYWwsbz0wO3ZvaWQgMCE9PShuPWVbb10pO28rKylpZihWKG4pKXtpZih0PW5bWS5leHBhbmRvXSl7aWYodC5ldmVudHMpZm9yKHIgaW4gdC5ldmVudHMpaVtyXT9TLmV2ZW50LnJlbW92ZShuLHIpOlMucmVtb3ZlRXZlbnQobixyLHQuaGFuZGxlKTtuW1kuZXhwYW5kb109dm9pZCAwfW5bUS5leHBhbmRvXSYmKG5bUS5leHBhbmRvXT12b2lkIDApfX19KSxTLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiBSZSh0aGlzLGUsITApfSxyZW1vdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIFJlKHRoaXMsZSl9LHRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT9TLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gUGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fHFlKHRoaXMsZSkuYXBwZW5kQ2hpbGQoZSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBQZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9cWUodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBQZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBQZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PTA7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYoUy5jbGVhbkRhdGEodmUoZSwhMSkpLGUudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWUmJmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBTLmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09ZSYmMT09PXQubm9kZVR5cGUpcmV0dXJuIHQuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmIU5lLnRlc3QoZSkmJiFnZVsoZGUuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9Uy5odG1sUHJlZmlsdGVyKGUpO3RyeXtmb3IoO248cjtuKyspMT09PSh0PXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKHZlKHQsITEpKSx0LmlubmVySFRNTD1lKTt0PTB9Y2F0Y2goZSl7fX10JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIG49W107cmV0dXJuIFBlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTtTLmluQXJyYXkodGhpcyxuKTwwJiYoUy5jbGVhbkRhdGEodmUodGhpcykpLHQmJnQucmVwbGFjZUNoaWxkKGUsdGhpcykpfSxuKX19KSxTLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLGEpe1MuZm5bZV09ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49W10scj1TKGUpLGk9ci5sZW5ndGgtMSxvPTA7bzw9aTtvKyspdD1vPT09aT90aGlzOnRoaXMuY2xvbmUoITApLFMocltvXSlbYV0odCksdS5hcHBseShuLHQuZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgTWU9bmV3IFJlZ0V4cCgiXigiK2VlKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksSWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiB0JiZ0Lm9wZW5lcnx8KHQ9QyksdC5nZXRDb21wdXRlZFN0eWxlKGUpfSxXZT1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXt9O2ZvcihpIGluIHQpb1tpXT1lLnN0eWxlW2ldLGUuc3R5bGVbaV09dFtpXTtmb3IoaSBpbiByPW4uY2FsbChlKSx0KWUuc3R5bGVbaV09b1tpXTtyZXR1cm4gcn0sRmU9bmV3IFJlZ0V4cChuZS5qb2luKCJ8IiksImkiKTtmdW5jdGlvbiBCZShlLHQsbil7dmFyIHIsaSxvLGEscz1lLnN0eWxlO3JldHVybihuPW58fEllKGUpKSYmKCIiIT09KGE9bi5nZXRQcm9wZXJ0eVZhbHVlKHQpfHxuW3RdKXx8aWUoZSl8fChhPVMuc3R5bGUoZSx0KSksIXkucGl4ZWxCb3hTdHlsZXMoKSYmTWUudGVzdChhKSYmRmUudGVzdCh0KSYmKHI9cy53aWR0aCxpPXMubWluV2lkdGgsbz1zLm1heFdpZHRoLHMubWluV2lkdGg9cy5tYXhXaWR0aD1zLndpZHRoPWEsYT1uLndpZHRoLHMud2lkdGg9cixzLm1pbldpZHRoPWkscy5tYXhXaWR0aD1vKSksdm9pZCAwIT09YT9hKyIiOmF9ZnVuY3Rpb24gJGUoZSx0KXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7aWYoIWUoKSlyZXR1cm4odGhpcy5nZXQ9dCkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2RlbGV0ZSB0aGlzLmdldH19fSFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtpZihsKXt1LnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGwuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIscmUuYXBwZW5kQ2hpbGQodSkuYXBwZW5kQ2hpbGQobCk7dmFyIGU9Qy5nZXRDb21wdXRlZFN0eWxlKGwpO249IjElIiE9PWUudG9wLHM9MTI9PT10KGUubWFyZ2luTGVmdCksbC5zdHlsZS5yaWdodD0iNjAlIixvPTM2PT09dChlLnJpZ2h0KSxyPTM2PT09dChlLndpZHRoKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaT0xMj09PXQobC5vZmZzZXRXaWR0aC8zKSxyZS5yZW1vdmVDaGlsZCh1KSxsPW51bGx9fWZ1bmN0aW9uIHQoZSl7cmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdChlKSl9dmFyIG4scixpLG8sYSxzLHU9RS5jcmVhdGVFbGVtZW50KCJkaXYiKSxsPUUuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5zdHlsZSYmKGwuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixsLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIseS5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWwuc3R5bGUuYmFja2dyb3VuZENsaXAsUy5leHRlbmQoeSx7Ym94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLHJ9LHBpeGVsQm94U3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxvfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxufSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLHN9LHNjcm9sbGJveFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLGl9LHJlbGlhYmxlVHJEaW1lbnNpb25zOmZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI7cmV0dXJuIG51bGw9PWEmJihlPUUuY3JlYXRlRWxlbWVudCgidGFibGUiKSx0PUUuY3JlYXRlRWxlbWVudCgidHIiKSxuPUUuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4Iix0LnN0eWxlLmhlaWdodD0iMXB4IixuLnN0eWxlLmhlaWdodD0iOXB4IixyZS5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZCh0KS5hcHBlbmRDaGlsZChuKSxyPUMuZ2V0Q29tcHV0ZWRTdHlsZSh0KSxhPTM8cGFyc2VJbnQoci5oZWlnaHQpLHJlLnJlbW92ZUNoaWxkKGUpKSxhfX0pKX0oKTt2YXIgX2U9WyJXZWJraXQiLCJNb3oiLCJtcyJdLHplPUUuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsVWU9e307ZnVuY3Rpb24gWGUoZSl7dmFyIHQ9Uy5jc3NQcm9wc1tlXXx8VWVbZV07cmV0dXJuIHR8fChlIGluIHplP2U6VWVbZV09ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksbj1fZS5sZW5ndGg7d2hpbGUobi0tKWlmKChlPV9lW25dK3QpaW4gemUpcmV0dXJuIGV9KGUpfHxlKX12YXIgVmU9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLEdlPS9eLS0vLFllPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxRZT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn07ZnVuY3Rpb24gSmUoZSx0LG4pe3ZhciByPXRlLmV4ZWModCk7cmV0dXJuIHI/TWF0aC5tYXgoMCxyWzJdLShufHwwKSkrKHJbM118fCJweCIpOnR9ZnVuY3Rpb24gS2UoZSx0LG4scixpLG8pe3ZhciBhPSJ3aWR0aCI9PT10PzE6MCxzPTAsdT0wO2lmKG49PT0ocj8iYm9yZGVyIjoiY29udGVudCIpKXJldHVybiAwO2Zvcig7YTw0O2ErPTIpIm1hcmdpbiI9PT1uJiYodSs9Uy5jc3MoZSxuK25lW2FdLCEwLGkpKSxyPygiY29udGVudCI9PT1uJiYodS09Uy5jc3MoZSwicGFkZGluZyIrbmVbYV0sITAsaSkpLCJtYXJnaW4iIT09biYmKHUtPVMuY3NzKGUsImJvcmRlciIrbmVbYV0rIldpZHRoIiwhMCxpKSkpOih1Kz1TLmNzcyhlLCJwYWRkaW5nIituZVthXSwhMCxpKSwicGFkZGluZyIhPT1uP3UrPVMuY3NzKGUsImJvcmRlciIrbmVbYV0rIldpZHRoIiwhMCxpKTpzKz1TLmNzcyhlLCJib3JkZXIiK25lW2FdKyJXaWR0aCIsITAsaSkpO3JldHVybiFyJiYwPD1vJiYodSs9TWF0aC5tYXgoMCxNYXRoLmNlaWwoZVsib2Zmc2V0Iit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0tby11LXMtLjUpKXx8MCksdX1mdW5jdGlvbiBaZShlLHQsbil7dmFyIHI9SWUoZSksaT0oIXkuYm94U2l6aW5nUmVsaWFibGUoKXx8bikmJiJib3JkZXItYm94Ij09PVMuY3NzKGUsImJveFNpemluZyIsITEsciksbz1pLGE9QmUoZSx0LHIpLHM9Im9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSk7aWYoTWUudGVzdChhKSl7aWYoIW4pcmV0dXJuIGE7YT0iYXV0byJ9cmV0dXJuKCF5LmJveFNpemluZ1JlbGlhYmxlKCkmJml8fCF5LnJlbGlhYmxlVHJEaW1lbnNpb25zKCkmJkEoZSwidHIiKXx8ImF1dG8iPT09YXx8IXBhcnNlRmxvYXQoYSkmJiJpbmxpbmUiPT09Uy5jc3MoZSwiZGlzcGxheSIsITEscikpJiZlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiYoaT0iYm9yZGVyLWJveCI9PT1TLmNzcyhlLCJib3hTaXppbmciLCExLHIpLChvPXMgaW4gZSkmJihhPWVbc10pKSwoYT1wYXJzZUZsb2F0KGEpfHwwKStLZShlLHQsbnx8KGk/ImJvcmRlciI6ImNvbnRlbnQiKSxvLHIsYSkrInB4In1mdW5jdGlvbiBldChlLHQsbixyLGkpe3JldHVybiBuZXcgZXQucHJvdG90eXBlLmluaXQoZSx0LG4scixpKX1TLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPUJlKGUsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGdyaWRBcmVhOiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTdGFydDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUmJjMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmZS5zdHlsZSl7dmFyIGksbyxhLHM9WCh0KSx1PUdlLnRlc3QodCksbD1lLnN0eWxlO2lmKHV8fCh0PVhlKHMpKSxhPVMuY3NzSG9va3NbdF18fFMuY3NzSG9va3Nbc10sdm9pZCAwPT09bilyZXR1cm4gYSYmImdldCJpbiBhJiZ2b2lkIDAhPT0oaT1hLmdldChlLCExLHIpKT9pOmxbdF07InN0cmluZyI9PT0obz10eXBlb2YgbikmJihpPXRlLmV4ZWMobikpJiZpWzFdJiYobj1zZShlLHQsaSksbz0ibnVtYmVyIiksbnVsbCE9biYmbj09biYmKCJudW1iZXIiIT09b3x8dXx8KG4rPWkmJmlbM118fChTLmNzc051bWJlcltzXT8iIjoicHgiKSkseS5jbGVhckNsb25lU3R5bGV8fCIiIT09bnx8MCE9PXQuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwobFt0XT0iaW5oZXJpdCIpLGEmJiJzZXQiaW4gYSYmdm9pZCAwPT09KG49YS5zZXQoZSxuLHIpKXx8KHU/bC5zZXRQcm9wZXJ0eSh0LG4pOmxbdF09bikpfX0sY3NzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzPVgodCk7cmV0dXJuIEdlLnRlc3QodCl8fCh0PVhlKHMpKSwoYT1TLmNzc0hvb2tzW3RdfHxTLmNzc0hvb2tzW3NdKSYmImdldCJpbiBhJiYoaT1hLmdldChlLCEwLG4pKSx2b2lkIDA9PT1pJiYoaT1CZShlLHQscikpLCJub3JtYWwiPT09aSYmdCBpbiBRZSYmKGk9UWVbdF0pLCIiPT09bnx8bj8obz1wYXJzZUZsb2F0KGkpLCEwPT09bnx8aXNGaW5pdGUobyk/b3x8MDppKTppfX0pLFMuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oZSx1KXtTLmNzc0hvb2tzW3VdPXtnZXQ6ZnVuY3Rpb24oZSx0LG4pe2lmKHQpcmV0dXJuIVZlLnRlc3QoUy5jc3MoZSwiZGlzcGxheSIpKXx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aD9aZShlLHUsbik6V2UoZSxZZSxmdW5jdGlvbigpe3JldHVybiBaZShlLHUsbil9KX0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPUllKGUpLG89IXkuc2Nyb2xsYm94U2l6ZSgpJiYiYWJzb2x1dGUiPT09aS5wb3NpdGlvbixhPShvfHxuKSYmImJvcmRlci1ib3giPT09Uy5jc3MoZSwiYm94U2l6aW5nIiwhMSxpKSxzPW4/S2UoZSx1LG4sYSxpKTowO3JldHVybiBhJiZvJiYocy09TWF0aC5jZWlsKGVbIm9mZnNldCIrdVswXS50b1VwcGVyQ2FzZSgpK3Uuc2xpY2UoMSldLXBhcnNlRmxvYXQoaVt1XSktS2UoZSx1LCJib3JkZXIiLCExLGkpLS41KSkscyYmKHI9dGUuZXhlYyh0KSkmJiJweCIhPT0oclszXXx8InB4IikmJihlLnN0eWxlW3VdPXQsdD1TLmNzcyhlLHUpKSxKZSgwLHQscyl9fX0pLFMuY3NzSG9va3MubWFyZ2luTGVmdD0kZSh5LnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuKHBhcnNlRmxvYXQoQmUoZSwibWFyZ2luTGVmdCIpKXx8ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LVdlKGUse21hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSkpKyJweCJ9KSxTLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihpLG8pe1MuY3NzSG9va3NbaStvXT17ZXhwYW5kOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49e30scj0ic3RyaW5nIj09dHlwZW9mIGU/ZS5zcGxpdCgiICIpOltlXTt0PDQ7dCsrKW5baStuZVt0XStvXT1yW3RdfHxyW3QtMl18fHJbMF07cmV0dXJuIG59fSwibWFyZ2luIiE9PWkmJihTLmNzc0hvb2tzW2krb10uc2V0PUplKX0pLFMuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89e30sYT0wO2lmKEFycmF5LmlzQXJyYXkodCkpe2ZvcihyPUllKGUpLGk9dC5sZW5ndGg7YTxpO2ErKylvW3RbYV1dPVMuY3NzKGUsdFthXSwhMSxyKTtyZXR1cm4gb31yZXR1cm4gdm9pZCAwIT09bj9TLnN0eWxlKGUsdCxuKTpTLmNzcyhlLHQpfSxlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX19KSwoKFMuVHdlZW49ZXQpLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZXQsaW5pdDpmdW5jdGlvbihlLHQsbixyLGksbyl7dGhpcy5lbGVtPWUsdGhpcy5wcm9wPW4sdGhpcy5lYXNpbmc9aXx8Uy5lYXNpbmcuX2RlZmF1bHQsdGhpcy5vcHRpb25zPXQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PW98fChTLmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGU9ZXQucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGUmJmUuZ2V0P2UuZ2V0KHRoaXMpOmV0LnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihlKXt2YXIgdCxuPWV0LnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9dD1TLmVhc2luZ1t0aGlzLmVhc2luZ10oZSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qZSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz10PWUsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKnQrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksbiYmbi5zZXQ/bi5zZXQodGhpcyk6ZXQucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0pLmluaXQucHJvdG90eXBlPWV0LnByb3RvdHlwZSwoZXQucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiAxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsIT1lLmVsZW1bZS5wcm9wXSYmbnVsbD09ZS5lbGVtLnN0eWxlW2UucHJvcF0/ZS5lbGVtW2UucHJvcF06KHQ9Uy5jc3MoZS5lbGVtLGUucHJvcCwiIikpJiYiYXV0byIhPT10P3Q6MH0sc2V0OmZ1bmN0aW9uKGUpe1MuZnguc3RlcFtlLnByb3BdP1MuZnguc3RlcFtlLnByb3BdKGUpOjEhPT1lLmVsZW0ubm9kZVR5cGV8fCFTLmNzc0hvb2tzW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtYZShlLnByb3ApXT9lLmVsZW1bZS5wcm9wXT1lLm5vdzpTLnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KX19fSkuc2Nyb2xsVG9wPWV0LnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LFMuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sUy5meD1ldC5wcm90b3R5cGUuaW5pdCxTLmZ4LnN0ZXA9e307dmFyIHR0LG50LHJ0LGl0LG90PS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxhdD0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIHN0KCl7bnQmJighMT09PUUuaGlkZGVuJiZDLnJlcXVlc3RBbmltYXRpb25GcmFtZT9DLnJlcXVlc3RBbmltYXRpb25GcmFtZShzdCk6Qy5zZXRUaW1lb3V0KHN0LFMuZnguaW50ZXJ2YWwpLFMuZngudGljaygpKX1mdW5jdGlvbiB1dCgpe3JldHVybiBDLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0dD12b2lkIDB9KSx0dD1EYXRlLm5vdygpfWZ1bmN0aW9uIGx0KGUsdCl7dmFyIG4scj0wLGk9e2hlaWdodDplfTtmb3IodD10PzE6MDtyPDQ7cis9Mi10KWlbIm1hcmdpbiIrKG49bmVbcl0pXT1pWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoaS5vcGFjaXR5PWkud2lkdGg9ZSksaX1mdW5jdGlvbiBjdChlLHQsbil7Zm9yKHZhciByLGk9KGZ0LnR3ZWVuZXJzW3RdfHxbXSkuY29uY2F0KGZ0LnR3ZWVuZXJzWyIqIl0pLG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIGZ0KG8sZSx0KXt2YXIgbixhLHI9MCxpPWZ0LnByZWZpbHRlcnMubGVuZ3RoLHM9Uy5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSB1LmVsZW19KSx1PWZ1bmN0aW9uKCl7aWYoYSlyZXR1cm4hMTtmb3IodmFyIGU9dHR8fHV0KCksdD1NYXRoLm1heCgwLGwuc3RhcnRUaW1lK2wuZHVyYXRpb24tZSksbj0xLSh0L2wuZHVyYXRpb258fDApLHI9MCxpPWwudHdlZW5zLmxlbmd0aDtyPGk7cisrKWwudHdlZW5zW3JdLnJ1bihuKTtyZXR1cm4gcy5ub3RpZnlXaXRoKG8sW2wsbix0XSksbjwxJiZpP3Q6KGl8fHMubm90aWZ5V2l0aChvLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgobyxbbF0pLCExKX0sbD1zLnByb21pc2Uoe2VsZW06byxwcm9wczpTLmV4dGVuZCh7fSxlKSxvcHRzOlMuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpTLmVhc2luZy5fZGVmYXVsdH0sdCksb3JpZ2luYWxQcm9wZXJ0aWVzOmUsb3JpZ2luYWxPcHRpb25zOnQsc3RhcnRUaW1lOnR0fHx1dCgpLGR1cmF0aW9uOnQuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49Uy5Ud2VlbihvLGwub3B0cyxlLHQsbC5vcHRzLnNwZWNpYWxFYXNpbmdbZV18fGwub3B0cy5lYXNpbmcpO3JldHVybiBsLnR3ZWVucy5wdXNoKG4pLG59LHN0b3A6ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPWU/bC50d2VlbnMubGVuZ3RoOjA7aWYoYSlyZXR1cm4gdGhpcztmb3IoYT0hMDt0PG47dCsrKWwudHdlZW5zW3RdLnJ1bigxKTtyZXR1cm4gZT8ocy5ub3RpZnlXaXRoKG8sW2wsMSwwXSkscy5yZXNvbHZlV2l0aChvLFtsLGVdKSk6cy5yZWplY3RXaXRoKG8sW2wsZV0pLHRoaXN9fSksYz1sLnByb3BzO2ZvcighZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhO2ZvcihuIGluIGUpaWYoaT10W3I9WChuKV0sbz1lW25dLEFycmF5LmlzQXJyYXkobykmJihpPW9bMV0sbz1lW25dPW9bMF0pLG4hPT1yJiYoZVtyXT1vLGRlbGV0ZSBlW25dKSwoYT1TLmNzc0hvb2tzW3JdKSYmImV4cGFuZCJpbiBhKWZvcihuIGluIG89YS5leHBhbmQobyksZGVsZXRlIGVbcl0sbyluIGluIGV8fChlW25dPW9bbl0sdFtuXT1pKTtlbHNlIHRbcl09aX0oYyxsLm9wdHMuc3BlY2lhbEVhc2luZyk7cjxpO3IrKylpZihuPWZ0LnByZWZpbHRlcnNbcl0uY2FsbChsLG8sYyxsLm9wdHMpKXJldHVybiBtKG4uc3RvcCkmJihTLl9xdWV1ZUhvb2tzKGwuZWxlbSxsLm9wdHMucXVldWUpLnN0b3A9bi5zdG9wLmJpbmQobikpLG47cmV0dXJuIFMubWFwKGMsY3QsbCksbShsLm9wdHMuc3RhcnQpJiZsLm9wdHMuc3RhcnQuY2FsbChvLGwpLGwucHJvZ3Jlc3MobC5vcHRzLnByb2dyZXNzKS5kb25lKGwub3B0cy5kb25lLGwub3B0cy5jb21wbGV0ZSkuZmFpbChsLm9wdHMuZmFpbCkuYWx3YXlzKGwub3B0cy5hbHdheXMpLFMuZngudGltZXIoUy5leHRlbmQodSx7ZWxlbTpvLGFuaW06bCxxdWV1ZTpsLm9wdHMucXVldWV9KSksbH1TLkFuaW1hdGlvbj1TLmV4dGVuZChmdCx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWF0ZVR3ZWVuKGUsdCk7cmV0dXJuIHNlKG4uZWxlbSxlLHRlLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7bShlKT8odD1lLGU9WyIqIl0pOmU9ZS5tYXRjaChQKTtmb3IodmFyIG4scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluPWVbcl0sZnQudHdlZW5lcnNbbl09ZnQudHdlZW5lcnNbbl18fFtdLGZ0LnR3ZWVuZXJzW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcnM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjLGY9IndpZHRoImluIHR8fCJoZWlnaHQiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsZz1lLm5vZGVUeXBlJiZhZShlKSx2PVkuZ2V0KGUsImZ4c2hvdyIpO2ZvcihyIGluIG4ucXVldWV8fChudWxsPT0oYT1TLl9xdWV1ZUhvb2tzKGUsImZ4IikpLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHM9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHMoKX0pLGEudW5xdWV1ZWQrKyxwLmFsd2F5cyhmdW5jdGlvbigpe3AuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLFMucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSksdClpZihpPXRbcl0sb3QudGVzdChpKSl7aWYoZGVsZXRlIHRbcl0sbz1vfHwidG9nZ2xlIj09PWksaT09PShnPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1pfHwhdnx8dm9pZCAwPT09dltyXSljb250aW51ZTtnPSEwfWRbcl09diYmdltyXXx8Uy5zdHlsZShlLHIpfWlmKCh1PSFTLmlzRW1wdHlPYmplY3QodCkpfHwhUy5pc0VtcHR5T2JqZWN0KGQpKWZvcihyIGluIGYmJjE9PT1lLm5vZGVUeXBlJiYobi5vdmVyZmxvdz1baC5vdmVyZmxvdyxoLm92ZXJmbG93WCxoLm92ZXJmbG93WV0sbnVsbD09KGw9diYmdi5kaXNwbGF5KSYmKGw9WS5nZXQoZSwiZGlzcGxheSIpKSwibm9uZSI9PT0oYz1TLmNzcyhlLCJkaXNwbGF5IikpJiYobD9jPWw6KGxlKFtlXSwhMCksbD1lLnN0eWxlLmRpc3BsYXl8fGwsYz1TLmNzcyhlLCJkaXNwbGF5IiksbGUoW2VdKSkpLCgiaW5saW5lIj09PWN8fCJpbmxpbmUtYmxvY2siPT09YyYmbnVsbCE9bCkmJiJub25lIj09PVMuY3NzKGUsImZsb2F0IikmJih1fHwocC5kb25lKGZ1bmN0aW9uKCl7aC5kaXNwbGF5PWx9KSxudWxsPT1sJiYoYz1oLmRpc3BsYXksbD0ibm9uZSI9PT1jPyIiOmMpKSxoLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxuLm92ZXJmbG93JiYoaC5vdmVyZmxvdz0iaGlkZGVuIixwLmFsd2F5cyhmdW5jdGlvbigpe2gub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxoLm92ZXJmbG93WD1uLm92ZXJmbG93WzFdLGgub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSksdT0hMSxkKXV8fCh2PyJoaWRkZW4iaW4gdiYmKGc9di5oaWRkZW4pOnY9WS5hY2Nlc3MoZSwiZnhzaG93Iix7ZGlzcGxheTpsfSksbyYmKHYuaGlkZGVuPSFnKSxnJiZsZShbZV0sITApLHAuZG9uZShmdW5jdGlvbigpe2ZvcihyIGluIGd8fGxlKFtlXSksWS5yZW1vdmUoZSwiZnhzaG93IiksZClTLnN0eWxlKGUscixkW3JdKX0pKSx1PWN0KGc/dltyXTowLHIscCksciBpbiB2fHwodltyXT11LnN0YXJ0LGcmJih1LmVuZD11LnN0YXJ0LHUuc3RhcnQ9MCkpfV0scHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD9mdC5wcmVmaWx0ZXJzLnVuc2hpZnQoZSk6ZnQucHJlZmlsdGVycy5wdXNoKGUpfX0pLFMuc3BlZWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUmJiJvYmplY3QiPT10eXBlb2YgZT9TLmV4dGVuZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fG0oZSkmJmUsZHVyYXRpb246ZSxlYXNpbmc6biYmdHx8dCYmIW0odCkmJnR9O3JldHVybiBTLmZ4Lm9mZj9yLmR1cmF0aW9uPTA6Im51bWJlciIhPXR5cGVvZiByLmR1cmF0aW9uJiYoci5kdXJhdGlvbiBpbiBTLmZ4LnNwZWVkcz9yLmR1cmF0aW9uPVMuZnguc3BlZWRzW3IuZHVyYXRpb25dOnIuZHVyYXRpb249Uy5meC5zcGVlZHMuX2RlZmF1bHQpLG51bGwhPXIucXVldWUmJiEwIT09ci5xdWV1ZXx8KHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bShyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmUy5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LFMuZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKGFlKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1TLmlzRW1wdHlPYmplY3QodCksbz1TLnNwZWVkKGUsbixyKSxhPWZ1bmN0aW9uKCl7dmFyIGU9ZnQodGhpcyxTLmV4dGVuZCh7fSx0KSxvKTsoaXx8WS5nZXQodGhpcywiZmluaXNoIikpJiZlLnN0b3AoITApfTtyZXR1cm4gYS5maW5pc2g9YSxpfHwhMT09PW8ucXVldWU/dGhpcy5lYWNoKGEpOnRoaXMucXVldWUoby5xdWV1ZSxhKX0sc3RvcDpmdW5jdGlvbihpLGUsbyl7dmFyIGE9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChvKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBpJiYobz1lLGU9aSxpPXZvaWQgMCksZSYmdGhpcy5xdWV1ZShpfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT0hMCx0PW51bGwhPWkmJmkrInF1ZXVlSG9va3MiLG49Uy50aW1lcnMscj1ZLmdldCh0aGlzKTtpZih0KXJbdF0mJnJbdF0uc3RvcCYmYShyW3RdKTtlbHNlIGZvcih0IGluIHIpclt0XSYmclt0XS5zdG9wJiZhdC50ZXN0KHQpJiZhKHJbdF0pO2Zvcih0PW4ubGVuZ3RoO3QtLTspblt0XS5lbGVtIT09dGhpc3x8bnVsbCE9aSYmblt0XS5xdWV1ZSE9PWl8fChuW3RdLmFuaW0uc3RvcChvKSxlPSExLG4uc3BsaWNlKHQsMSkpOyFlJiZvfHxTLmRlcXVldWUodGhpcyxpKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuITEhPT1hJiYoYT1hfHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSx0PVkuZ2V0KHRoaXMpLG49dFthKyJxdWV1ZSJdLHI9dFthKyJxdWV1ZUhvb2tzIl0saT1TLnRpbWVycyxvPW4/bi5sZW5ndGg6MDtmb3IodC5maW5pc2g9ITAsUy5xdWV1ZSh0aGlzLGEsW10pLHImJnIuc3RvcCYmci5zdG9wLmNhbGwodGhpcywhMCksZT1pLmxlbmd0aDtlLS07KWlbZV0uZWxlbT09PXRoaXMmJmlbZV0ucXVldWU9PT1hJiYoaVtlXS5hbmltLnN0b3AoITApLGkuc3BsaWNlKGUsMSkpO2ZvcihlPTA7ZTxvO2UrKyluW2VdJiZuW2VdLmZpbmlzaCYmbltlXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgdC5maW5pc2h9KX19KSxTLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGUscil7dmFyIGk9Uy5mbltyXTtTLmZuW3JdPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZT9pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUobHQociwhMCksZSx0LG4pfX0pLFMuZWFjaCh7c2xpZGVEb3duOmx0KCJzaG93Iiksc2xpZGVVcDpsdCgiaGlkZSIpLHNsaWRlVG9nZ2xlOmx0KCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGUscil7Uy5mbltlXT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuYW5pbWF0ZShyLGUsdCxuKX19KSxTLnRpbWVycz1bXSxTLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSx0PTAsbj1TLnRpbWVycztmb3IodHQ9RGF0ZS5ub3coKTt0PG4ubGVuZ3RoO3QrKykoZT1uW3RdKSgpfHxuW3RdIT09ZXx8bi5zcGxpY2UodC0tLDEpO24ubGVuZ3RofHxTLmZ4LnN0b3AoKSx0dD12b2lkIDB9LFMuZngudGltZXI9ZnVuY3Rpb24oZSl7Uy50aW1lcnMucHVzaChlKSxTLmZ4LnN0YXJ0KCl9LFMuZnguaW50ZXJ2YWw9MTMsUy5meC5zdGFydD1mdW5jdGlvbigpe250fHwobnQ9ITAsc3QoKSl9LFMuZnguc3RvcD1mdW5jdGlvbigpe250PW51bGx9LFMuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LFMuZm4uZGVsYXk9ZnVuY3Rpb24ocixlKXtyZXR1cm4gcj1TLmZ4JiZTLmZ4LnNwZWVkc1tyXXx8cixlPWV8fCJmeCIsdGhpcy5xdWV1ZShlLGZ1bmN0aW9uKGUsdCl7dmFyIG49Qy5zZXRUaW1lb3V0KGUscik7dC5zdG9wPWZ1bmN0aW9uKCl7Qy5jbGVhclRpbWVvdXQobil9fSl9LHJ0PUUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxpdD1FLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKEUuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLHJ0LnR5cGU9ImNoZWNrYm94Iix5LmNoZWNrT249IiIhPT1ydC52YWx1ZSx5Lm9wdFNlbGVjdGVkPWl0LnNlbGVjdGVkLChydD1FLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnZhbHVlPSJ0IixydC50eXBlPSJyYWRpbyIseS5yYWRpb1ZhbHVlPSJ0Ij09PXJ0LnZhbHVlO3ZhciBwdCxkdD1TLmV4cHIuYXR0ckhhbmRsZTtTLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiAkKHRoaXMsUy5hdHRyLGUsdCwxPGFyZ3VtZW50cy5sZW5ndGgpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLnJlbW92ZUF0dHIodGhpcyxlKX0pfX0pLFMuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgZS5nZXRBdHRyaWJ1dGU/Uy5wcm9wKGUsdCxuKTooMT09PW8mJlMuaXNYTUxEb2MoZSl8fChpPVMuYXR0ckhvb2tzW3QudG9Mb3dlckNhc2UoKV18fChTLmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP3B0OnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCBTLnJlbW92ZUF0dHIoZSx0KTppJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjooZS5zZXRBdHRyaWJ1dGUodCxuKyIiKSxuKTppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOm51bGw9PShyPVMuZmluZC5hdHRyKGUsdCkpP3ZvaWQgMDpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZigheS5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmQShlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXQmJnQubWF0Y2goUCk7aWYoaSYmMT09PWUubm9kZVR5cGUpd2hpbGUobj1pW3IrK10pZS5yZW1vdmVBdHRyaWJ1dGUobil9fSkscHQ9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuITE9PT10P1MucmVtb3ZlQXR0cihlLG4pOmUuc2V0QXR0cmlidXRlKG4sbiksbn19LFMuZWFjaChTLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihlLHQpe3ZhciBhPWR0W3RdfHxTLmZpbmQuYXR0cjtkdFt0XT1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gbnx8KGk9ZHRbb10sZHRbb109cixyPW51bGwhPWEoZSx0LG4pP286bnVsbCxkdFtvXT1pKSxyfX0pO3ZhciBodD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLGd0PS9eKD86YXxhcmVhKSQvaTtmdW5jdGlvbiB2dChlKXtyZXR1cm4oZS5tYXRjaChQKXx8W10pLmpvaW4oIiAiKX1mdW5jdGlvbiB5dChlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn1mdW5jdGlvbiBtdChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lOiJzdHJpbmciPT10eXBlb2YgZSYmZS5tYXRjaChQKXx8W119Uy5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJCh0aGlzLFMucHJvcCxlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbUy5wcm9wRml4W2VdfHxlXX0pfX0pLFMuZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiAxPT09byYmUy5pc1hNTERvYyhlKXx8KHQ9Uy5wcm9wRml4W3RdfHx0LGk9Uy5wcm9wSG9va3NbdF0pLHZvaWQgMCE9PW4/aSYmInNldCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6ZVt0XT1uOmkmJiJnZXQiaW4gaSYmbnVsbCE9PShyPWkuZ2V0KGUsdCkpP3I6ZVt0XX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PVMuZmluZC5hdHRyKGUsInRhYmluZGV4Iik7cmV0dXJuIHQ/cGFyc2VJbnQodCwxMCk6aHQudGVzdChlLm5vZGVOYW1lKXx8Z3QudGVzdChlLm5vZGVOYW1lKSYmZS5ocmVmPzA6LTF9fX0scHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9fSkseS5vcHRTZWxlY3RlZHx8KFMucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7dCYmKHQuc2VsZWN0ZWRJbmRleCx0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxTLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe1MucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxTLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLmFkZENsYXNzKHQuY2FsbCh0aGlzLGUseXQodGhpcykpKX0pO2lmKChlPW10KHQpKS5sZW5ndGgpd2hpbGUobj10aGlzW3UrK10paWYoaT15dChuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIrdnQoaSkrIiAiKXthPTA7d2hpbGUobz1lW2ErK10pci5pbmRleE9mKCIgIitvKyIgIik8MCYmKHIrPW8rIiAiKTtpIT09KHM9dnQocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLGEscyx1PTA7aWYobSh0KSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykucmVtb3ZlQ2xhc3ModC5jYWxsKHRoaXMsZSx5dCh0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCIiKTtpZigoZT1tdCh0KSkubGVuZ3RoKXdoaWxlKG49dGhpc1t1KytdKWlmKGk9eXQobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK3Z0KGkpKyIgIil7YT0wO3doaWxlKG89ZVthKytdKXdoaWxlKC0xPHIuaW5kZXhPZigiICIrbysiICIpKXI9ci5yZXBsYWNlKCIgIitvKyIgIiwiICIpO2khPT0ocz12dChyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGksdCl7dmFyIG89dHlwZW9mIGksYT0ic3RyaW5nIj09PW98fEFycmF5LmlzQXJyYXkoaSk7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdCYmYT90P3RoaXMuYWRkQ2xhc3MoaSk6dGhpcy5yZW1vdmVDbGFzcyhpKTptKGkpP3RoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLnRvZ2dsZUNsYXNzKGkuY2FsbCh0aGlzLGUseXQodGhpcyksdCksdCl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSx0LG4scjtpZihhKXt0PTAsbj1TKHRoaXMpLHI9bXQoaSk7d2hpbGUoZT1yW3QrK10pbi5oYXNDbGFzcyhlKT9uLnJlbW92ZUNsYXNzKGUpOm4uYWRkQ2xhc3MoZSl9ZWxzZSB2b2lkIDAhPT1pJiYiYm9vbGVhbiIhPT1vfHwoKGU9eXQodGhpcykpJiZZLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIixlKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixlfHwhMT09PWk/IiI6WS5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj0wO3Q9IiAiK2UrIiAiO3doaWxlKG49dGhpc1tyKytdKWlmKDE9PT1uLm5vZGVUeXBlJiYtMTwoIiAiK3Z0KHl0KG4pKSsiICIpLmluZGV4T2YodCkpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIHh0PS9cci9nO1MuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24obil7dmFyIHIsZSxpLHQ9dGhpc1swXTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1tKG4pLHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgdDsxPT09dGhpcy5ub2RlVHlwZSYmKG51bGw9PSh0PWk/bi5jYWxsKHRoaXMsZSxTKHRoaXMpLnZhbCgpKTpuKT90PSIiOiJudW1iZXIiPT10eXBlb2YgdD90Kz0iIjpBcnJheS5pc0FycmF5KHQpJiYodD1TLm1hcCh0LGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOmUrIiJ9KSksKHI9Uy52YWxIb29rc1t0aGlzLnR5cGVdfHxTLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYic2V0ImluIHImJnZvaWQgMCE9PXIuc2V0KHRoaXMsdCwidmFsdWUiKXx8KHRoaXMudmFsdWU9dCkpfSkpOnQ/KHI9Uy52YWxIb29rc1t0LnR5cGVdfHxTLnZhbEhvb2tzW3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYiZ2V0ImluIHImJnZvaWQgMCE9PShlPXIuZ2V0KHQsInZhbHVlIikpP2U6InN0cmluZyI9PXR5cGVvZihlPXQudmFsdWUpP2UucmVwbGFjZSh4dCwiIik6bnVsbD09ZT8iIjplOnZvaWQgMH19KSxTLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PVMuZmluZC5hdHRyKGUsInZhbHVlIik7cmV0dXJuIG51bGwhPXQ/dDp2dChTLnRleHQoZSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk9ZS5vcHRpb25zLG89ZS5zZWxlY3RlZEluZGV4LGE9InNlbGVjdC1vbmUiPT09ZS50eXBlLHM9YT9udWxsOltdLHU9YT9vKzE6aS5sZW5ndGg7Zm9yKHI9bzwwP3U6YT9vOjA7cjx1O3IrKylpZigoKG49aVtyXSkuc2VsZWN0ZWR8fHI9PT1vKSYmIW4uZGlzYWJsZWQmJighbi5wYXJlbnROb2RlLmRpc2FibGVkfHwhQShuLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZih0PVMobikudmFsKCksYSlyZXR1cm4gdDtzLnB1c2godCl9cmV0dXJuIHN9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1lLm9wdGlvbnMsbz1TLm1ha2VBcnJheSh0KSxhPWkubGVuZ3RoO3doaWxlKGEtLSkoKHI9aVthXSkuc2VsZWN0ZWQ9LTE8Uy5pbkFycmF5KFMudmFsSG9va3Mub3B0aW9uLmdldChyKSxvKSkmJihuPSEwKTtyZXR1cm4gbnx8KGUuc2VsZWN0ZWRJbmRleD0tMSksb319fX0pLFMuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe1MudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIGUuY2hlY2tlZD0tMTxTLmluQXJyYXkoUyhlKS52YWwoKSx0KX19LHkuY2hlY2tPbnx8KFMudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjplLnZhbHVlfSl9KSx5LmZvY3VzaW49Im9uZm9jdXNpbiJpbiBDO3ZhciBidD0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sd3Q9ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKX07Uy5leHRlbmQoUy5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1LGwsYyxmLHA9W258fEVdLGQ9di5jYWxsKGUsInR5cGUiKT9lLnR5cGU6ZSxoPXYuY2FsbChlLCJuYW1lc3BhY2UiKT9lLm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKG89Zj1hPW49bnx8RSwzIT09bi5ub2RlVHlwZSYmOCE9PW4ubm9kZVR5cGUmJiFidC50ZXN0KGQrUy5ldmVudC50cmlnZ2VyZWQpJiYoLTE8ZC5pbmRleE9mKCIuIikmJihkPShoPWQuc3BsaXQoIi4iKSkuc2hpZnQoKSxoLnNvcnQoKSksdT1kLmluZGV4T2YoIjoiKTwwJiYib24iK2QsKGU9ZVtTLmV4cGFuZG9dP2U6bmV3IFMuRXZlbnQoZCwib2JqZWN0Ij09dHlwZW9mIGUmJmUpKS5pc1RyaWdnZXI9cj8yOjMsZS5uYW1lc3BhY2U9aC5qb2luKCIuIiksZS5ybmFtZXNwYWNlPWUubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK2guam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxlLnJlc3VsdD12b2lkIDAsZS50YXJnZXR8fChlLnRhcmdldD1uKSx0PW51bGw9PXQ/W2VdOlMubWFrZUFycmF5KHQsW2VdKSxjPVMuZXZlbnQuc3BlY2lhbFtkXXx8e30scnx8IWMudHJpZ2dlcnx8ITEhPT1jLnRyaWdnZXIuYXBwbHkobix0KSkpe2lmKCFyJiYhYy5ub0J1YmJsZSYmIXgobikpe2ZvcihzPWMuZGVsZWdhdGVUeXBlfHxkLGJ0LnRlc3QocytkKXx8KG89by5wYXJlbnROb2RlKTtvO289by5wYXJlbnROb2RlKXAucHVzaChvKSxhPW87YT09PShuLm93bmVyRG9jdW1lbnR8fEUpJiZwLnB1c2goYS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3d8fEMpfWk9MDt3aGlsZSgobz1wW2krK10pJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWY9byxlLnR5cGU9MTxpP3M6Yy5iaW5kVHlwZXx8ZCwobD0oWS5nZXQobywiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW2UudHlwZV0mJlkuZ2V0KG8sImhhbmRsZSIpKSYmbC5hcHBseShvLHQpLChsPXUmJm9bdV0pJiZsLmFwcGx5JiZWKG8pJiYoZS5yZXN1bHQ9bC5hcHBseShvLHQpLCExPT09ZS5yZXN1bHQmJmUucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGUudHlwZT1kLHJ8fGUuaXNEZWZhdWx0UHJldmVudGVkKCl8fGMuX2RlZmF1bHQmJiExIT09Yy5fZGVmYXVsdC5hcHBseShwLnBvcCgpLHQpfHwhVihuKXx8dSYmbShuW2RdKSYmIXgobikmJigoYT1uW3VdKSYmKG5bdV09bnVsbCksUy5ldmVudC50cmlnZ2VyZWQ9ZCxlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmYuYWRkRXZlbnRMaXN0ZW5lcihkLHd0KSxuW2RdKCksZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCx3dCksUy5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLGEmJihuW3VdPWEpKSxlLnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1TLmV4dGVuZChuZXcgUy5FdmVudCxuLHt0eXBlOmUsaXNTaW11bGF0ZWQ6ITB9KTtTLmV2ZW50LnRyaWdnZXIocixudWxsLHQpfX0pLFMuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQudHJpZ2dlcihlLHQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzWzBdO2lmKG4pcmV0dXJuIFMuZXZlbnQudHJpZ2dlcihlLHQsbiwhMCl9fSkseS5mb2N1c2lufHxTLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKG4scil7dmFyIGk9ZnVuY3Rpb24oZSl7Uy5ldmVudC5zaW11bGF0ZShyLGUudGFyZ2V0LFMuZXZlbnQuZml4KGUpKX07Uy5ldmVudC5zcGVjaWFsW3JdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcyx0PVkuYWNjZXNzKGUscik7dHx8ZS5hZGRFdmVudExpc3RlbmVyKG4saSwhMCksWS5hY2Nlc3MoZSxyLCh0fHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jdW1lbnR8fHRoaXMsdD1ZLmFjY2VzcyhlLHIpLTE7dD9ZLmFjY2VzcyhlLHIsdCk6KGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLGksITApLFkucmVtb3ZlKGUscikpfX19KTt2YXIgVHQ9Qy5sb2NhdGlvbixDdD17Z3VpZDpEYXRlLm5vdygpfSxFdD0vXD8vO1MucGFyc2VYTUw9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoIWV8fCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gbnVsbDt0cnl7dD0obmV3IEMuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoZSwidGV4dC94bWwiKX1jYXRjaChlKXt0PXZvaWQgMH1yZXR1cm4gdCYmIXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHxTLmVycm9yKCJJbnZhbGlkIFhNTDogIitlKSx0fTt2YXIgU3Q9L1xbXF0kLyxrdD0vXHI/XG4vZyxBdD0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksTnQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIER0KG4sZSxyLGkpe3ZhciB0O2lmKEFycmF5LmlzQXJyYXkoZSkpUy5lYWNoKGUsZnVuY3Rpb24oZSx0KXtyfHxTdC50ZXN0KG4pP2kobix0KTpEdChuKyJbIisoIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT10P2U6IiIpKyJdIix0LHIsaSl9KTtlbHNlIGlmKHJ8fCJvYmplY3QiIT09dyhlKSlpKG4sZSk7ZWxzZSBmb3IodCBpbiBlKUR0KG4rIlsiK3QrIl0iLGVbdF0scixpKX1TLnBhcmFtPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPWZ1bmN0aW9uKGUsdCl7dmFyIG49bSh0KT90KCk6dDtyW3IubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoZSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChudWxsPT1uPyIiOm4pfTtpZihudWxsPT1lKXJldHVybiIiO2lmKEFycmF5LmlzQXJyYXkoZSl8fGUuanF1ZXJ5JiYhUy5pc1BsYWluT2JqZWN0KGUpKVMuZWFjaChlLGZ1bmN0aW9uKCl7aSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihuIGluIGUpRHQobixlW25dLHQsaSk7cmV0dXJuIHIuam9pbigiJiIpfSxTLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIFMucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT1TLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gZT9TLm1ha2VBcnJheShlKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFTKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmTnQudGVzdCh0aGlzLm5vZGVOYW1lKSYmIUF0LnRlc3QoZSkmJih0aGlzLmNoZWNrZWR8fCFwZS50ZXN0KGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPVModGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4/bnVsbDpBcnJheS5pc0FycmF5KG4pP1MubWFwKG4sZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6dC5uYW1lLHZhbHVlOmUucmVwbGFjZShrdCwiXHJcbiIpfX0pOntuYW1lOnQubmFtZSx2YWx1ZTpuLnJlcGxhY2Uoa3QsIlxyXG4iKX19KS5nZXQoKX19KTt2YXIganQ9LyUyMC9nLHF0PS8jLiokLyxMdD0vKFs/Jl0pXz1bXiZdKi8sSHQ9L14oLio/KTpbIFx0XSooW15cclxuXSopJC9nbSxPdD0vXig/OkdFVHxIRUFEKSQvLFB0PS9eXC9cLy8sUnQ9e30sTXQ9e30sSXQ9IiovIi5jb25jYXQoIioiKSxXdD1FLmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiBGdChvKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXsic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT0iKiIpO3ZhciBuLHI9MCxpPWUudG9Mb3dlckNhc2UoKS5tYXRjaChQKXx8W107aWYobSh0KSl3aGlsZShuPWlbcisrXSkiKyI9PT1uWzBdPyhuPW4uc2xpY2UoMSl8fCIqIiwob1tuXT1vW25dfHxbXSkudW5zaGlmdCh0KSk6KG9bbl09b1tuXXx8W10pLnB1c2godCl9fWZ1bmN0aW9uIEJ0KHQsaSxvLGEpe3ZhciBzPXt9LHU9dD09PU10O2Z1bmN0aW9uIGwoZSl7dmFyIHI7cmV0dXJuIHNbZV09ITAsUy5lYWNoKHRbZV18fFtdLGZ1bmN0aW9uKGUsdCl7dmFyIG49dChpLG8sYSk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBufHx1fHxzW25dP3U/IShyPW4pOnZvaWQgMDooaS5kYXRhVHlwZXMudW5zaGlmdChuKSxsKG4pLCExKX0pLHJ9cmV0dXJuIGwoaS5kYXRhVHlwZXNbMF0pfHwhc1siKiJdJiZsKCIqIil9ZnVuY3Rpb24gJHQoZSx0KXt2YXIgbixyLGk9Uy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIHQpdm9pZCAwIT09dFtuXSYmKChpW25dP2U6cnx8KHI9e30pKVtuXT10W25dKTtyZXR1cm4gciYmUy5leHRlbmQoITAsZSxyKSxlfVd0LmhyZWY9VHQuaHJlZixTLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6VHQuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8udGVzdChUdC5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpJdCx0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpKU09OLnBhcnNlLCJ0ZXh0IHhtbCI6Uy5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/JHQoJHQoZSxTLmFqYXhTZXR0aW5ncyksdCk6JHQoUy5hamF4U2V0dGluZ3MsZSl9LGFqYXhQcmVmaWx0ZXI6RnQoUnQpLGFqYXhUcmFuc3BvcnQ6RnQoTXQpLGFqYXg6ZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLHQ9dHx8e307dmFyIGMsZixwLG4sZCxyLGgsZyxpLG8sdj1TLmFqYXhTZXR1cCh7fSx0KSx5PXYuY29udGV4dHx8dixtPXYuY29udGV4dCYmKHkubm9kZVR5cGV8fHkuanF1ZXJ5KT9TKHkpOlMuZXZlbnQseD1TLkRlZmVycmVkKCksYj1TLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx3PXYuc3RhdHVzQ29kZXx8e30sYT17fSxzPXt9LHU9ImNhbmNlbGVkIixUPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoaCl7aWYoIW4pe249e307d2hpbGUodD1IdC5leGVjKHApKW5bdFsxXS50b0xvd2VyQ2FzZSgpKyIgIl09KG5bdFsxXS50b0xvd2VyQ2FzZSgpKyIgIl18fFtdKS5jb25jYXQodFsyXSl9dD1uW2UudG9Mb3dlckNhc2UoKSsiICJdfXJldHVybiBudWxsPT10P251bGw6dC5qb2luKCIsICIpfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gaD9wOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09aCYmKGU9c1tlLnRvTG93ZXJDYXNlKCldPXNbZS50b0xvd2VyQ2FzZSgpXXx8ZSxhW2VdPXQpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWgmJih2Lm1pbWVUeXBlPWUpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZSlpZihoKVQuYWx3YXlzKGVbVC5zdGF0dXNdKTtlbHNlIGZvcih0IGluIGUpd1t0XT1bd1t0XSxlW3RdXTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8dTtyZXR1cm4gYyYmYy5hYm9ydCh0KSxsKDAsdCksdGhpc319O2lmKHgucHJvbWlzZShUKSx2LnVybD0oKGV8fHYudXJsfHxUdC5ocmVmKSsiIikucmVwbGFjZShQdCxUdC5wcm90b2NvbCsiLy8iKSx2LnR5cGU9dC5tZXRob2R8fHQudHlwZXx8di5tZXRob2R8fHYudHlwZSx2LmRhdGFUeXBlcz0odi5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKFApfHxbIiJdLG51bGw9PXYuY3Jvc3NEb21haW4pe3I9RS5jcmVhdGVFbGVtZW50KCJhIik7dHJ5e3IuaHJlZj12LnVybCxyLmhyZWY9ci5ocmVmLHYuY3Jvc3NEb21haW49V3QucHJvdG9jb2wrIi8vIitXdC5ob3N0IT1yLnByb3RvY29sKyIvLyIrci5ob3N0fWNhdGNoKGUpe3YuY3Jvc3NEb21haW49ITB9fWlmKHYuZGF0YSYmdi5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiB2LmRhdGEmJih2LmRhdGE9Uy5wYXJhbSh2LmRhdGEsdi50cmFkaXRpb25hbCkpLEJ0KFJ0LHYsdCxUKSxoKXJldHVybiBUO2ZvcihpIGluKGc9Uy5ldmVudCYmdi5nbG9iYWwpJiYwPT1TLmFjdGl2ZSsrJiZTLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLHYudHlwZT12LnR5cGUudG9VcHBlckNhc2UoKSx2Lmhhc0NvbnRlbnQ9IU90LnRlc3Qodi50eXBlKSxmPXYudXJsLnJlcGxhY2UocXQsIiIpLHYuaGFzQ29udGVudD92LmRhdGEmJnYucHJvY2Vzc0RhdGEmJjA9PT0odi5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYodi5kYXRhPXYuZGF0YS5yZXBsYWNlKGp0LCIrIikpOihvPXYudXJsLnNsaWNlKGYubGVuZ3RoKSx2LmRhdGEmJih2LnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIHYuZGF0YSkmJihmKz0oRXQudGVzdChmKT8iJiI6Ij8iKSt2LmRhdGEsZGVsZXRlIHYuZGF0YSksITE9PT12LmNhY2hlJiYoZj1mLnJlcGxhY2UoTHQsIiQxIiksbz0oRXQudGVzdChmKT8iJiI6Ij8iKSsiXz0iK0N0Lmd1aWQrKytvKSx2LnVybD1mK28pLHYuaWZNb2RpZmllZCYmKFMubGFzdE1vZGlmaWVkW2ZdJiZULnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixTLmxhc3RNb2RpZmllZFtmXSksUy5ldGFnW2ZdJiZULnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLFMuZXRhZ1tmXSkpLCh2LmRhdGEmJnYuaGFzQ29udGVudCYmITEhPT12LmNvbnRlbnRUeXBlfHx0LmNvbnRlbnRUeXBlKSYmVC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLHYuY29udGVudFR5cGUpLFQuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0Iix2LmRhdGFUeXBlc1swXSYmdi5hY2NlcHRzW3YuZGF0YVR5cGVzWzBdXT92LmFjY2VwdHNbdi5kYXRhVHlwZXNbMF1dKygiKiIhPT12LmRhdGFUeXBlc1swXT8iLCAiK0l0KyI7IHE9MC4wMSI6IiIpOnYuYWNjZXB0c1siKiJdKSx2LmhlYWRlcnMpVC5zZXRSZXF1ZXN0SGVhZGVyKGksdi5oZWFkZXJzW2ldKTtpZih2LmJlZm9yZVNlbmQmJighMT09PXYuYmVmb3JlU2VuZC5jYWxsKHksVCx2KXx8aCkpcmV0dXJuIFQuYWJvcnQoKTtpZih1PSJhYm9ydCIsYi5hZGQodi5jb21wbGV0ZSksVC5kb25lKHYuc3VjY2VzcyksVC5mYWlsKHYuZXJyb3IpLGM9QnQoTXQsdix0LFQpKXtpZihULnJlYWR5U3RhdGU9MSxnJiZtLnRyaWdnZXIoImFqYXhTZW5kIixbVCx2XSksaClyZXR1cm4gVDt2LmFzeW5jJiYwPHYudGltZW91dCYmKGQ9Qy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VC5hYm9ydCgidGltZW91dCIpfSx2LnRpbWVvdXQpKTt0cnl7aD0hMSxjLnNlbmQoYSxsKX1jYXRjaChlKXtpZihoKXRocm93IGU7bCgtMSxlKX19ZWxzZSBsKC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiBsKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD10O2h8fChoPSEwLGQmJkMuY2xlYXJUaW1lb3V0KGQpLGM9dm9pZCAwLHA9cnx8IiIsVC5yZWFkeVN0YXRlPTA8ZT80OjAsaT0yMDA8PWUmJmU8MzAwfHwzMDQ9PT1lLG4mJihzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczt3aGlsZSgiKiI9PT11WzBdKXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj1lLm1pbWVUeXBlfHx0LmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IoaSBpbiBzKWlmKHNbaV0mJnNbaV0udGVzdChyKSl7dS51bnNoaWZ0KGkpO2JyZWFrfWlmKHVbMF1pbiBuKW89dVswXTtlbHNle2ZvcihpIGluIG4pe2lmKCF1WzBdfHxlLmNvbnZlcnRlcnNbaSsiICIrdVswXV0pe289aTticmVha31hfHwoYT1pKX1vPW98fGF9aWYobylyZXR1cm4gbyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dfSh2LFQsbikpLCFpJiYtMTxTLmluQXJyYXkoInNjcmlwdCIsdi5kYXRhVHlwZXMpJiYodi5jb252ZXJ0ZXJzWyJ0ZXh0IHNjcmlwdCJdPWZ1bmN0aW9uKCl7fSkscz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9e30sYz1lLmRhdGFUeXBlcy5zbGljZSgpO2lmKGNbMV0pZm9yKGEgaW4gZS5jb252ZXJ0ZXJzKWxbYS50b0xvd2VyQ2FzZSgpXT1lLmNvbnZlcnRlcnNbYV07bz1jLnNoaWZ0KCk7d2hpbGUobylpZihlLnJlc3BvbnNlRmllbGRzW29dJiYobltlLnJlc3BvbnNlRmllbGRzW29dXT10KSwhdSYmciYmZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSksdT1vLG89Yy5zaGlmdCgpKWlmKCIqIj09PW8pbz11O2Vsc2UgaWYoIioiIT09dSYmdSE9PW8pe2lmKCEoYT1sW3UrIiAiK29dfHxsWyIqICIrb10pKWZvcihpIGluIGwpaWYoKHM9aS5zcGxpdCgiICIpKVsxXT09PW8mJihhPWxbdSsiICIrc1swXV18fGxbIiogIitzWzBdXSkpeyEwPT09YT9hPWxbaV06ITAhPT1sW2ldJiYobz1zWzBdLGMudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoITAhPT1hKWlmKGEmJmVbInRocm93cyJdKXQ9YSh0KTtlbHNlIHRyeXt0PWEodCl9Y2F0Y2goZSl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6YT9lOiJObyBjb252ZXJzaW9uIGZyb20gIit1KyIgdG8gIitvfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOnR9fSh2LHMsVCxpKSxpPyh2LmlmTW9kaWZpZWQmJigodT1ULmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpJiYoUy5sYXN0TW9kaWZpZWRbZl09dSksKHU9VC5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpKSYmKFMuZXRhZ1tmXT11KSksMjA0PT09ZXx8IkhFQUQiPT09di50eXBlP2w9Im5vY29udGVudCI6MzA0PT09ZT9sPSJub3Rtb2RpZmllZCI6KGw9cy5zdGF0ZSxvPXMuZGF0YSxpPSEoYT1zLmVycm9yKSkpOihhPWwsIWUmJmx8fChsPSJlcnJvciIsZTwwJiYoZT0wKSkpLFQuc3RhdHVzPWUsVC5zdGF0dXNUZXh0PSh0fHxsKSsiIixpP3gucmVzb2x2ZVdpdGgoeSxbbyxsLFRdKTp4LnJlamVjdFdpdGgoeSxbVCxsLGFdKSxULnN0YXR1c0NvZGUodyksdz12b2lkIDAsZyYmbS50cmlnZ2VyKGk/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbVCx2LGk/bzphXSksYi5maXJlV2l0aCh5LFtULGxdKSxnJiYobS50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtULHZdKSwtLVMuYWN0aXZlfHxTLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gVH0sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFMuZ2V0KGUsdCxuLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbihlLHQpe3JldHVybiBTLmdldChlLHZvaWQgMCx0LCJzY3JpcHQiKX19KSxTLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSxpKXtTW2ldPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBtKHQpJiYocj1yfHxuLG49dCx0PXZvaWQgMCksUy5hamF4KFMuZXh0ZW5kKHt1cmw6ZSx0eXBlOmksZGF0YVR5cGU6cixkYXRhOnQsc3VjY2VzczpufSxTLmlzUGxhaW5PYmplY3QoZSkmJmUpKX19KSxTLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZS5oZWFkZXJzKSJjb250ZW50LXR5cGUiPT09dC50b0xvd2VyQ2FzZSgpJiYoZS5jb250ZW50VHlwZT1lLmhlYWRlcnNbdF18fCIiKX0pLFMuX2V2YWxVcmw9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBTLmFqYXgoe3VybDplLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsY2FjaGU6ITAsYXN5bmM6ITEsZ2xvYmFsOiExLGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oKXt9fSxkYXRhRmlsdGVyOmZ1bmN0aW9uKGUpe1MuZ2xvYmFsRXZhbChlLHQsbil9fSl9LFMuZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0aGlzWzBdJiYobShlKSYmKGU9ZS5jYWxsKHRoaXNbMF0pKSx0PVMoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJnQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLHQubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpczt3aGlsZShlLmZpcnN0RWxlbWVudENoaWxkKWU9ZS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gZX0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKG4pe3JldHVybiBtKG4pP3RoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLndyYXBJbm5lcihuLmNhbGwodGhpcyxlKSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1TKHRoaXMpLHQ9ZS5jb250ZW50cygpO3QubGVuZ3RoP3Qud3JhcEFsbChuKTplLmFwcGVuZChuKX0pfSx3cmFwOmZ1bmN0aW9uKHQpe3ZhciBuPW0odCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLndyYXBBbGwobj90LmNhbGwodGhpcyxlKTp0KX0pfSx1bndyYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucGFyZW50KGUpLm5vdCgiYm9keSIpLmVhY2goZnVuY3Rpb24oKXtTKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KSx0aGlzfX0pLFMuZXhwci5wc2V1ZG9zLmhpZGRlbj1mdW5jdGlvbihlKXtyZXR1cm4hUy5leHByLnBzZXVkb3MudmlzaWJsZShlKX0sUy5leHByLnBzZXVkb3MudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4hIShlLm9mZnNldFdpZHRofHxlLm9mZnNldEhlaWdodHx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCl9LFMuYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IEMuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goZSl7fX07dmFyIF90PXswOjIwMCwxMjIzOjIwNH0senQ9Uy5hamF4U2V0dGluZ3MueGhyKCk7eS5jb3JzPSEhenQmJiJ3aXRoQ3JlZGVudGlhbHMiaW4genQseS5hamF4PXp0PSEhenQsUy5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGkpe3ZhciBvLGE7aWYoeS5jb3JzfHx6dCYmIWkuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkueGhyKCk7aWYoci5vcGVuKGkudHlwZSxpLnVybCxpLmFzeW5jLGkudXNlcm5hbWUsaS5wYXNzd29yZCksaS54aHJGaWVsZHMpZm9yKG4gaW4gaS54aHJGaWVsZHMpcltuXT1pLnhockZpZWxkc1tuXTtmb3IobiBpbiBpLm1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUmJnIub3ZlcnJpZGVNaW1lVHlwZShpLm1pbWVUeXBlKSxpLmNyb3NzRG9tYWlufHxlWyJYLVJlcXVlc3RlZC1XaXRoIl18fChlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0IiksZSlyLnNldFJlcXVlc3RIZWFkZXIobixlW25dKTtvPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe28mJihvPWE9ci5vbmxvYWQ9ci5vbmVycm9yPXIub25hYm9ydD1yLm9udGltZW91dD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLCJhYm9ydCI9PT1lP3IuYWJvcnQoKToiZXJyb3IiPT09ZT8ibnVtYmVyIiE9dHlwZW9mIHIuc3RhdHVzP3QoMCwiZXJyb3IiKTp0KHIuc3RhdHVzLHIuc3RhdHVzVGV4dCk6dChfdFtyLnN0YXR1c118fHIuc3RhdHVzLHIuc3RhdHVzVGV4dCwidGV4dCIhPT0oci5yZXNwb25zZVR5cGV8fCJ0ZXh0Iil8fCJzdHJpbmciIT10eXBlb2Ygci5yZXNwb25zZVRleHQ/e2JpbmFyeTpyLnJlc3BvbnNlfTp7dGV4dDpyLnJlc3BvbnNlVGV4dH0sci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0sci5vbmxvYWQ9bygpLGE9ci5vbmVycm9yPXIub250aW1lb3V0PW8oImVycm9yIiksdm9pZCAwIT09ci5vbmFib3J0P3Iub25hYm9ydD1hOnIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09PXIucmVhZHlTdGF0ZSYmQy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7byYmYSgpfSl9LG89bygiYWJvcnQiKTt0cnl7ci5zZW5kKGkuaGFzQ29udGVudCYmaS5kYXRhfHxudWxsKX1jYXRjaChlKXtpZihvKXRocm93IGV9fSxhYm9ydDpmdW5jdGlvbigpe28mJm8oKX19fSksUy5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGUpe2UuY3Jvc3NEb21haW4mJihlLmNvbnRlbnRzLnNjcmlwdD0hMSl9KSxTLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L1xiKD86amF2YXxlY21hKXNjcmlwdFxiL30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihlKXtyZXR1cm4gUy5nbG9iYWxFdmFsKGUpLGV9fX0pLFMuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihlKXt2b2lkIDA9PT1lLmNhY2hlJiYoZS5jYWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIil9KSxTLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24obil7dmFyIHIsaTtpZihuLmNyb3NzRG9tYWlufHxuLnNjcmlwdEF0dHJzKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsdCl7cj1TKCI8c2NyaXB0PiIpLmF0dHIobi5zY3JpcHRBdHRyc3x8e30pLnByb3Aoe2NoYXJzZXQ6bi5zY3JpcHRDaGFyc2V0LHNyYzpuLnVybH0pLm9uKCJsb2FkIGVycm9yIixpPWZ1bmN0aW9uKGUpe3IucmVtb3ZlKCksaT1udWxsLGUmJnQoImVycm9yIj09PWUudHlwZT80MDQ6MjAwLGUudHlwZSl9KSxFLmhlYWQuYXBwZW5kQ2hpbGQoclswXSl9LGFib3J0OmZ1bmN0aW9uKCl7aSYmaSgpfX19KTt2YXIgVXQsWHQ9W10sVnQ9Lyg9KVw/KD89JnwkKXxcP1w/LztTLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9WHQucG9wKCl8fFMuZXhwYW5kbysiXyIrQ3QuZ3VpZCsrO3JldHVybiB0aGlzW2VdPSEwLGV9fSksUy5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9ITEhPT1lLmpzb25wJiYoVnQudGVzdChlLnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiBlLmRhdGEmJjA9PT0oZS5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZWdC50ZXN0KGUuZGF0YSkmJiJkYXRhIik7aWYoYXx8Impzb25wIj09PWUuZGF0YVR5cGVzWzBdKXJldHVybiByPWUuanNvbnBDYWxsYmFjaz1tKGUuanNvbnBDYWxsYmFjayk/ZS5qc29ucENhbGxiYWNrKCk6ZS5qc29ucENhbGxiYWNrLGE/ZVthXT1lW2FdLnJlcGxhY2UoVnQsIiQxIityKTohMSE9PWUuanNvbnAmJihlLnVybCs9KEV0LnRlc3QoZS51cmwpPyImIjoiPyIpK2UuanNvbnArIj0iK3IpLGUuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBvfHxTLmVycm9yKHIrIiB3YXMgbm90IGNhbGxlZCIpLG9bMF19LGUuZGF0YVR5cGVzWzBdPSJqc29uIixpPUNbcl0sQ1tyXT1mdW5jdGlvbigpe289YXJndW1lbnRzfSxuLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PWk/UyhDKS5yZW1vdmVQcm9wKHIpOkNbcl09aSxlW3JdJiYoZS5qc29ucENhbGxiYWNrPXQuanNvbnBDYWxsYmFjayxYdC5wdXNoKHIpKSxvJiZtKGkpJiZpKG9bMF0pLG89aT12b2lkIDB9KSwic2NyaXB0In0pLHkuY3JlYXRlSFRNTERvY3VtZW50PSgoVXQ9RS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLmJvZHkpLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1VdC5jaGlsZE5vZGVzLmxlbmd0aCksUy5wYXJzZUhUTUw9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiJzdHJpbmciIT10eXBlb2YgZT9bXTooImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKSx0fHwoeS5jcmVhdGVIVE1MRG9jdW1lbnQ/KChyPSh0PUUuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKSkuY3JlYXRlRWxlbWVudCgiYmFzZSIpKS5ocmVmPUUubG9jYXRpb24uaHJlZix0LmhlYWQuYXBwZW5kQ2hpbGQocikpOnQ9RSksbz0hbiYmW10sKGk9Ti5leGVjKGUpKT9bdC5jcmVhdGVFbGVtZW50KGlbMV0pXTooaT14ZShbZV0sdCxvKSxvJiZvLmxlbmd0aCYmUyhvKS5yZW1vdmUoKSxTLm1lcmdlKFtdLGkuY2hpbGROb2RlcykpKTt2YXIgcixpLG99LFMuZm4ubG9hZD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9dGhpcyxzPWUuaW5kZXhPZigiICIpO3JldHVybi0xPHMmJihyPXZ0KGUuc2xpY2UocykpLGU9ZS5zbGljZSgwLHMpKSxtKHQpPyhuPXQsdD12b2lkIDApOnQmJiJvYmplY3QiPT10eXBlb2YgdCYmKGk9IlBPU1QiKSwwPGEubGVuZ3RoJiZTLmFqYXgoe3VybDplLHR5cGU6aXx8IkdFVCIsZGF0YVR5cGU6Imh0bWwiLGRhdGE6dH0pLmRvbmUoZnVuY3Rpb24oZSl7bz1hcmd1bWVudHMsYS5odG1sKHI/UygiPGRpdj4iKS5hcHBlbmQoUy5wYXJzZUhUTUwoZSkpLmZpbmQocik6ZSl9KS5hbHdheXMobiYmZnVuY3Rpb24oZSx0KXthLmVhY2goZnVuY3Rpb24oKXtuLmFwcGx5KHRoaXMsb3x8W2UucmVzcG9uc2VUZXh0LHQsZV0pfSl9KSx0aGlzfSxTLmV4cHIucHNldWRvcy5hbmltYXRlZD1mdW5jdGlvbih0KXtyZXR1cm4gUy5ncmVwKFMudGltZXJzLGZ1bmN0aW9uKGUpe3JldHVybiB0PT09ZS5lbGVtfSkubGVuZ3RofSxTLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbD1TLmNzcyhlLCJwb3NpdGlvbiIpLGM9UyhlKSxmPXt9OyJzdGF0aWMiPT09bCYmKGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1jLm9mZnNldCgpLG89Uy5jc3MoZSwidG9wIiksdT1TLmNzcyhlLCJsZWZ0IiksKCJhYnNvbHV0ZSI9PT1sfHwiZml4ZWQiPT09bCkmJi0xPChvK3UpLmluZGV4T2YoImF1dG8iKT8oYT0ocj1jLnBvc2l0aW9uKCkpLnRvcCxpPXIubGVmdCk6KGE9cGFyc2VGbG9hdChvKXx8MCxpPXBhcnNlRmxvYXQodSl8fDApLG0odCkmJih0PXQuY2FsbChlLG4sUy5leHRlbmQoe30scykpKSxudWxsIT10LnRvcCYmKGYudG9wPXQudG9wLXMudG9wK2EpLG51bGwhPXQubGVmdCYmKGYubGVmdD10LmxlZnQtcy5sZWZ0K2kpLCJ1c2luZyJpbiB0P3QudXNpbmcuY2FsbChlLGYpOigibnVtYmVyIj09dHlwZW9mIGYudG9wJiYoZi50b3ArPSJweCIpLCJudW1iZXIiPT10eXBlb2YgZi5sZWZ0JiYoZi5sZWZ0Kz0icHgiKSxjLmNzcyhmKSl9fSxTLmZuLmV4dGVuZCh7b2Zmc2V0OmZ1bmN0aW9uKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMD09PXQ/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uy5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsdCxlKX0pO3ZhciBlLG4scj10aGlzWzBdO3JldHVybiByP3IuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGg/KGU9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldyx7dG9wOmUudG9wK24ucGFnZVlPZmZzZXQsbGVmdDplLmxlZnQrbi5wYWdlWE9mZnNldH0pOnt0b3A6MCxsZWZ0OjB9OnZvaWQgMH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgZSx0LG4scj10aGlzWzBdLGk9e3RvcDowLGxlZnQ6MH07aWYoImZpeGVkIj09PVMuY3NzKHIsInBvc2l0aW9uIikpdD1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Vsc2V7dD10aGlzLm9mZnNldCgpLG49ci5vd25lckRvY3VtZW50LGU9ci5vZmZzZXRQYXJlbnR8fG4uZG9jdW1lbnRFbGVtZW50O3doaWxlKGUmJihlPT09bi5ib2R5fHxlPT09bi5kb2N1bWVudEVsZW1lbnQpJiYic3RhdGljIj09PVMuY3NzKGUsInBvc2l0aW9uIikpZT1lLnBhcmVudE5vZGU7ZSYmZSE9PXImJjE9PT1lLm5vZGVUeXBlJiYoKGk9UyhlKS5vZmZzZXQoKSkudG9wKz1TLmNzcyhlLCJib3JkZXJUb3BXaWR0aCIsITApLGkubGVmdCs9Uy5jc3MoZSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpfXJldHVybnt0b3A6dC50b3AtaS50b3AtUy5jc3MociwibWFyZ2luVG9wIiwhMCksbGVmdDp0LmxlZnQtaS5sZWZ0LVMuY3NzKHIsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9mZnNldFBhcmVudDt3aGlsZShlJiYic3RhdGljIj09PVMuY3NzKGUsInBvc2l0aW9uIikpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8cmV9KX19KSxTLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24odCxpKXt2YXIgbz0icGFnZVlPZmZzZXQiPT09aTtTLmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKHgoZSk/cj1lOjk9PT1lLm5vZGVUeXBlJiYocj1lLmRlZmF1bHRWaWV3KSx2b2lkIDA9PT1uKXJldHVybiByP3JbaV06ZVt0XTtyP3Iuc2Nyb2xsVG8obz9yLnBhZ2VYT2Zmc2V0Om4sbz9uOnIucGFnZVlPZmZzZXQpOmVbdF09bn0sdCxlLGFyZ3VtZW50cy5sZW5ndGgpfX0pLFMuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihlLG4pe1MuY3NzSG9va3Nbbl09JGUoeS5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gdD1CZShlLG4pLE1lLnRlc3QodCk/UyhlKS5wb3NpdGlvbigpW25dKyJweCI6dH0pfSksUy5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxzKXtTLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6cywiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKHIsbyl7Uy5mbltvXT1mdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGgmJihyfHwiYm9vbGVhbiIhPXR5cGVvZiBlKSxpPXJ8fCghMD09PWV8fCEwPT09dD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIHgoZSk/MD09PW8uaW5kZXhPZigib3V0ZXIiKT9lWyJpbm5lciIrYV06ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWUubm9kZVR5cGU/KHI9ZS5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoZS5ib2R5WyJzY3JvbGwiK2FdLHJbInNjcm9sbCIrYV0sZS5ib2R5WyJvZmZzZXQiK2FdLHJbIm9mZnNldCIrYV0sclsiY2xpZW50IithXSkpOnZvaWQgMD09PW4/Uy5jc3MoZSx0LGkpOlMuc3R5bGUoZSx0LG4saSl9LHMsbj9lOnZvaWQgMCxuKX19KX0pLFMuZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGUsdCl7Uy5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vbih0LGUpfX0pLFMuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vbihlLG51bGwsdCxuKX0sdW5iaW5kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub2ZmKGUsbnVsbCx0KX0sZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24odCxlLG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihlLCIqKiIpOnRoaXMub2ZmKHQsZXx8IioqIixuKX0saG92ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodHx8ZSl9fSksUy5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsbil7Uy5mbltuXT1mdW5jdGlvbihlLHQpe3JldHVybiAwPGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vbihuLG51bGwsZSx0KTp0aGlzLnRyaWdnZXIobil9fSk7dmFyIEd0PS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZztTLnByb3h5PWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKG49ZVt0XSx0PWUsZT1uKSxtKGUpKXJldHVybiByPXMuY2FsbChhcmd1bWVudHMsMiksKGk9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0fHx0aGlzLHIuY29uY2F0KHMuY2FsbChhcmd1bWVudHMpKSl9KS5ndWlkPWUuZ3VpZD1lLmd1aWR8fFMuZ3VpZCsrLGl9LFMuaG9sZFJlYWR5PWZ1bmN0aW9uKGUpe2U/Uy5yZWFkeVdhaXQrKzpTLnJlYWR5KCEwKX0sUy5pc0FycmF5PUFycmF5LmlzQXJyYXksUy5wYXJzZUpTT049SlNPTi5wYXJzZSxTLm5vZGVOYW1lPUEsUy5pc0Z1bmN0aW9uPW0sUy5pc1dpbmRvdz14LFMuY2FtZWxDYXNlPVgsUy50eXBlPXcsUy5ub3c9RGF0ZS5ub3csUy5pc051bWVyaWM9ZnVuY3Rpb24oZSl7dmFyIHQ9Uy50eXBlKGUpO3JldHVybigibnVtYmVyIj09PXR8fCJzdHJpbmciPT09dCkmJiFpc05hTihlLXBhcnNlRmxvYXQoZSkpfSxTLnRyaW09ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6KGUrIiIpLnJlcGxhY2UoR3QsIiIpfSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gU30pO3ZhciBZdD1DLmpRdWVyeSxRdD1DLiQ7cmV0dXJuIFMubm9Db25mbGljdD1mdW5jdGlvbihlKXtyZXR1cm4gQy4kPT09UyYmKEMuJD1RdCksZSYmQy5qUXVlcnk9PT1TJiYoQy5qUXVlcnk9WXQpLFN9LCJ1bmRlZmluZWQiPT10eXBlb2YgZSYmKEMualF1ZXJ5PUMuJD1TKSxTfSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAqIGpRdWVyeSBUZW1wbGF0ZXMgUGx1Z2luIDEuMC4wcHJlCiAqIGh0dHA6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdG1wbAogKiBSZXF1aXJlcyBqUXVlcnkgMS40LjIKICoKICogQ29weXJpZ2h0IFNvZnR3YXJlIEZyZWVkb20gQ29uc2VydmFuY3ksIEluYy4KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICovCihmdW5jdGlvbihhKXt2YXIgcj1hLmZuLmRvbU1hbmlwLGQ9Il90bXBsaXRlbSIscT0vXltePF0qKDxbXHdcV10rPilbXj5dKiR8XHtce1whIC8sYj17fSxmPXt9LGUscD17a2V5OjAsZGF0YTp7fX0saT0wLGM9MCxsPVtdO2Z1bmN0aW9uIGcoZyxkLGgsZSl7dmFyIGM9e2RhdGE6ZXx8KGU9PT0wfHxlPT09ZmFsc2UpP2U6ZD9kLmRhdGE6e30sX3dyYXA6ZD9kLl93cmFwOm51bGwsdG1wbDpudWxsLHBhcmVudDpkfHxudWxsLG5vZGVzOltdLGNhbGxzOnUsbmVzdDp3LHdyYXA6eCxodG1sOnYsdXBkYXRlOnR9O2cmJmEuZXh0ZW5kKGMsZyx7bm9kZXM6W10scGFyZW50OmR9KTtpZihoKXtjLnRtcGw9aDtjLl9jdG50PWMuX2N0bnR8fGMudG1wbChhLGMpO2Mua2V5PSsraTsobC5sZW5ndGg/ZjpiKVtpXT1jfXJldHVybiBjfWEuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGYsZCl7YS5mbltmXT1mdW5jdGlvbihuKXt2YXIgZz1bXSxpPWEobiksayxoLG0sbCxqPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2U9Ynx8e307aWYoaiYmai5ub2RlVHlwZT09PTExJiZqLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmaS5sZW5ndGg9PT0xKXtpW2RdKHRoaXNbMF0pO2c9dGhpc31lbHNle2ZvcihoPTAsbT1pLmxlbmd0aDtoPG07aCsrKXtjPWg7az0oaD4wP3RoaXMuY2xvbmUodHJ1ZSk6dGhpcykuZ2V0KCk7YShpW2hdKVtkXShrKTtnPWcuY29uY2F0KGspfWM9MDtnPXRoaXMucHVzaFN0YWNrKGcsZixpLnNlbGVjdG9yKX1sPWU7ZT1udWxsO2EudG1wbC5jb21wbGV0ZShsKTtyZXR1cm4gZ319KTthLmZuLmV4dGVuZCh7dG1wbDpmdW5jdGlvbihkLGMsYil7cmV0dXJuIGEudG1wbCh0aGlzWzBdLGQsYyxiKX0sdG1wbEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gYS50bXBsSXRlbSh0aGlzWzBdKX0sdGVtcGxhdGU6ZnVuY3Rpb24oYil7cmV0dXJuIGEudGVtcGxhdGUoYix0aGlzWzBdKX0sZG9tTWFuaXA6ZnVuY3Rpb24oZCxtLGspe2lmKGRbMF0mJmEuaXNBcnJheShkWzBdKSl7dmFyIGc9YS5tYWtlQXJyYXkoYXJndW1lbnRzKSxoPWRbMF0saj1oLmxlbmd0aCxpPTAsZjt3aGlsZShpPGomJiEoZj1hLmRhdGEoaFtpKytdLCJ0bXBsSXRlbSIpKSk7aWYoZiYmYylnWzJdPWZ1bmN0aW9uKGIpe2EudG1wbC5hZnRlck1hbmlwKHRoaXMsYixrKX07ci5hcHBseSh0aGlzLGcpfWVsc2Ugci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Yz0wOyFlJiZhLnRtcGwuY29tcGxldGUoYik7cmV0dXJuIHRoaXN9fSk7YS5leHRlbmQoe3RtcGw6ZnVuY3Rpb24oZCxoLGUsYyl7dmFyIGksaz0hYztpZihrKXtjPXA7ZD1hLnRlbXBsYXRlW2RdfHxhLnRlbXBsYXRlKG51bGwsZCk7Zj17fX1lbHNlIGlmKCFkKXtkPWMudG1wbDtiW2Mua2V5XT1jO2Mubm9kZXM9W107Yy53cmFwcGVkJiZuKGMsYy53cmFwcGVkKTtyZXR1cm4gYShqKGMsbnVsbCxjLnRtcGwoYSxjKSkpfWlmKCFkKXJldHVybltdO2lmKHR5cGVvZiBoPT09ImZ1bmN0aW9uIiloPWguY2FsbChjfHx7fSk7ZSYmZS53cmFwcGVkJiZuKGUsZS53cmFwcGVkKTtpPWEuaXNBcnJheShoKT9hLm1hcChoLGZ1bmN0aW9uKGEpe3JldHVybiBhP2coZSxjLGQsYSk6bnVsbH0pOltnKGUsYyxkLGgpXTtyZXR1cm4gaz9hKGooYyxudWxsLGkpKTppfSx0bXBsSXRlbTpmdW5jdGlvbihiKXt2YXIgYztpZihiIGluc3RhbmNlb2YgYSliPWJbMF07d2hpbGUoYiYmYi5ub2RlVHlwZT09PTEmJiEoYz1hLmRhdGEoYiwidG1wbEl0ZW0iKSkmJihiPWIucGFyZW50Tm9kZSkpO3JldHVybiBjfHxwfSx0ZW1wbGF0ZTpmdW5jdGlvbihjLGIpe2lmKGIpe2lmKHR5cGVvZiBiPT09InN0cmluZyIpYj1vKGIpO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIGEpYj1iWzBdfHx7fTtpZihiLm5vZGVUeXBlKWI9YS5kYXRhKGIsInRtcGwiKXx8YS5kYXRhKGIsInRtcGwiLG8oYi5pbm5lckhUTUwpKTtyZXR1cm4gdHlwZW9mIGM9PT0ic3RyaW5nIj8oYS50ZW1wbGF0ZVtjXT1iKTpifXJldHVybiBjP3R5cGVvZiBjIT09InN0cmluZyI/YS50ZW1wbGF0ZShudWxsLGMpOmEudGVtcGxhdGVbY118fGEudGVtcGxhdGUobnVsbCxxLnRlc3QoYyk/YzphKGMpKTpudWxsfSxlbmNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuKCIiK2EpLnNwbGl0KCImIikuam9pbigiJmFtcDsiKS5zcGxpdCgiPCIpLmpvaW4oIiZsdDsiKS5zcGxpdCgiPiIpLmpvaW4oIiZndDsiKS5zcGxpdCgnIicpLmpvaW4oIiYjMzQ7Iikuc3BsaXQoIiciKS5qb2luKCImIzM5OyIpfX0pO2EuZXh0ZW5kKGEudG1wbCx7dGFnOnt0bXBsOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiJpZigkbm90bnVsbF8xKXtfXz1fXy5jb25jYXQoJGl0ZW0ubmVzdCgkMSwkMikpO30ifSx3cmFwOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiIkaXRlbS5jYWxscyhfXywkMSwkMik7X189W107IixjbG9zZToiY2FsbD0kaXRlbS5jYWxscygpO19fPWNhbGwuXy5jb25jYXQoJGl0ZW0ud3JhcChjYWxsLF9fKSk7In0sZWFjaDp7X2RlZmF1bHQ6eyQyOiIkaW5kZXgsICR2YWx1ZSJ9LG9wZW46ImlmKCRub3RudWxsXzEpeyQuZWFjaCgkMWEsZnVuY3Rpb24oJDIpe3dpdGgodGhpcyl7IixjbG9zZToifX0pO30ifSwiaWYiOntvcGVuOiJpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsiLGNsb3NlOiJ9In0sImVsc2UiOntfZGVmYXVsdDp7JDE6InRydWUifSxvcGVuOiJ9ZWxzZSBpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsifSxodG1sOntvcGVuOiJpZigkbm90bnVsbF8xKXtfXy5wdXNoKCQxYSk7fSJ9LCI9Ijp7X2RlZmF1bHQ6eyQxOiIkZGF0YSJ9LG9wZW46ImlmKCRub3RudWxsXzEpe19fLnB1c2goJC5lbmNvZGUoJDFhKSk7fSJ9LCIhIjp7b3BlbjoiIn19LGNvbXBsZXRlOmZ1bmN0aW9uKCl7Yj17fX0sYWZ0ZXJNYW5pcDpmdW5jdGlvbihmLGIsZCl7dmFyIGU9Yi5ub2RlVHlwZT09PTExP2EubWFrZUFycmF5KGIuY2hpbGROb2Rlcyk6Yi5ub2RlVHlwZT09PTE/W2JdOltdO2QuY2FsbChmLGIpO20oZSk7YysrfX0pO2Z1bmN0aW9uIGooZSxnLGYpe3ZhciBiLGM9Zj9hLm1hcChmLGZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2Uua2V5P2EucmVwbGFjZSgvKDxcdyspKD89W1xzPl0pKD8hW14+XSpfdG1wbGl0ZW0pKFtePl0qKS9nLCIkMSAiK2QrJz0iJytlLmtleSsnIiAkMicpOmE6aihhLGUsYS5fY3RudCl9KTplO2lmKGcpcmV0dXJuIGM7Yz1jLmpvaW4oIiIpO2MucmVwbGFjZSgvXlxzKihbXjxcc11bXjxdKik/KDxbXHdcV10rPikoW14+XSpbXj5cc10pP1xzKiQvLGZ1bmN0aW9uKGYsYyxlLGQpe2I9YShlKS5nZXQoKTttKGIpO2lmKGMpYj1rKGMpLmNvbmNhdChiKTtpZihkKWI9Yi5jb25jYXQoayhkKSl9KTtyZXR1cm4gYj9iOmsoYyl9ZnVuY3Rpb24gayhjKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlubmVySFRNTD1jO3JldHVybiBhLm1ha2VBcnJheShiLmNoaWxkTm9kZXMpfWZ1bmN0aW9uIG8oYil7cmV0dXJuIG5ldyBGdW5jdGlvbigialF1ZXJ5IiwiJGl0ZW0iLCJ2YXIgJD1qUXVlcnksY2FsbCxfXz1bXSwkZGF0YT0kaXRlbS5kYXRhO3dpdGgoJGRhdGEpe19fLnB1c2goJyIrYS50cmltKGIpLnJlcGxhY2UoLyhbXFwnXSkvZywiXFwkMSIpLnJlcGxhY2UoL1tcclx0XG5dL2csIiAiKS5yZXBsYWNlKC9cJFx7KFteXH1dKilcfS9nLCJ7ez0gJDF9fSIpLnJlcGxhY2UoL1x7XHsoXC8/KShcdyt8LikoPzpcKCgoPzpbXlx9XXxcfSg/IVx9KSkqPyk/XCkpPyg/OlxzKyguKj8pPyk/KFwoKCg/OlteXH1dfFx9KD8hXH0pKSo/KVwpKT9ccypcfVx9L2csZnVuY3Rpb24obSxsLGssZyxiLGMsZCl7dmFyIGo9YS50bXBsLnRhZ1trXSxpLGUsZjtpZighail0aHJvdyJVbmtub3duIHRlbXBsYXRlIHRhZzogIitrO2k9ai5fZGVmYXVsdHx8W107aWYoYyYmIS9cdyQvLnRlc3QoYikpe2IrPWM7Yz0iIn1pZihiKXtiPWgoYik7ZD1kPyIsIitoKGQpKyIpIjpjPyIpIjoiIjtlPWM/Yi5pbmRleE9mKCIuIik+LTE/YitoKGMpOiIoIitiKyIpLmNhbGwoJGl0ZW0iK2Q6YjtmPWM/ZToiKHR5cGVvZigiK2IrIik9PT0nZnVuY3Rpb24nPygiK2IrIikuY2FsbCgkaXRlbSk6KCIrYisiKSkifWVsc2UgZj1lPWkuJDF8fCJudWxsIjtnPWgoZyk7cmV0dXJuIicpOyIraltsPyJjbG9zZSI6Im9wZW4iXS5zcGxpdCgiJG5vdG51bGxfMSIpLmpvaW4oYj8idHlwZW9mKCIrYisiKSE9PSd1bmRlZmluZWQnICYmICgiK2IrIikhPW51bGwiOiJ0cnVlIikuc3BsaXQoIiQxYSIpLmpvaW4oZikuc3BsaXQoIiQxIikuam9pbihlKS5zcGxpdCgiJDIiKS5qb2luKGd8fGkuJDJ8fCIiKSsiX18ucHVzaCgnIn0pKyInKTt9cmV0dXJuIF9fOyIpfWZ1bmN0aW9uIG4oYyxiKXtjLl93cmFwPWooYyx0cnVlLGEuaXNBcnJheShiKT9iOltxLnRlc3QoYik/YjphKGIpLmh0bWwoKV0pLmpvaW4oIiIpfWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGE/YS5yZXBsYWNlKC9cXCcvZywiJyIpLnJlcGxhY2UoL1xcXFwvZywiXFwiKTpudWxsfWZ1bmN0aW9uIHMoYil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5hcHBlbmRDaGlsZChiLmNsb25lTm9kZSh0cnVlKSk7cmV0dXJuIGEuaW5uZXJIVE1MfWZ1bmN0aW9uIG0obyl7dmFyIG49Il8iK2MsayxqLGw9e30sZSxwLGg7Zm9yKGU9MCxwPW8ubGVuZ3RoO2U8cDtlKyspe2lmKChrPW9bZV0pLm5vZGVUeXBlIT09MSljb250aW51ZTtqPWsuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTtmb3IoaD1qLmxlbmd0aC0xO2g+PTA7aC0tKW0oaltoXSk7bShrKX1mdW5jdGlvbiBtKGope3ZhciBwLGg9aixrLGUsbTtpZihtPWouZ2V0QXR0cmlidXRlKGQpKXt3aGlsZShoLnBhcmVudE5vZGUmJihoPWgucGFyZW50Tm9kZSkubm9kZVR5cGU9PT0xJiYhKHA9aC5nZXRBdHRyaWJ1dGUoZCkpKTtpZihwIT09bSl7aD1oLnBhcmVudE5vZGU/aC5ub2RlVHlwZT09PTExPzA6aC5nZXRBdHRyaWJ1dGUoZCl8fDA6MDtpZighKGU9YlttXSkpe2U9ZlttXTtlPWcoZSxiW2hdfHxmW2hdKTtlLmtleT0rK2k7YltpXT1lfWMmJm8obSl9ai5yZW1vdmVBdHRyaWJ1dGUoZCl9ZWxzZSBpZihjJiYoZT1hLmRhdGEoaiwidG1wbEl0ZW0iKSkpe28oZS5rZXkpO2JbZS5rZXldPWU7aD1hLmRhdGEoai5wYXJlbnROb2RlLCJ0bXBsSXRlbSIpO2g9aD9oLmtleTowfWlmKGUpe2s9ZTt3aGlsZShrJiZrLmtleSE9aCl7ay5ub2Rlcy5wdXNoKGopO2s9ay5wYXJlbnR9ZGVsZXRlIGUuX2N0bnQ7ZGVsZXRlIGUuX3dyYXA7YS5kYXRhKGosInRtcGxJdGVtIixlKX1mdW5jdGlvbiBvKGEpe2E9YStuO2U9bFthXT1sW2FdfHxnKGUsYltlLnBhcmVudC5rZXkrbl18fGUucGFyZW50KX19fWZ1bmN0aW9uIHUoYSxkLGMsYil7aWYoIWEpcmV0dXJuIGwucG9wKCk7bC5wdXNoKHtfOmEsdG1wbDpkLGl0ZW06dGhpcyxkYXRhOmMsb3B0aW9uczpifSl9ZnVuY3Rpb24gdyhkLGMsYil7cmV0dXJuIGEudG1wbChhLnRlbXBsYXRlKGQpLGMsYix0aGlzKX1mdW5jdGlvbiB4KGIsZCl7dmFyIGM9Yi5vcHRpb25zfHx7fTtjLndyYXBwZWQ9ZDtyZXR1cm4gYS50bXBsKGEudGVtcGxhdGUoYi50bXBsKSxiLmRhdGEsYyxiLml0ZW0pfWZ1bmN0aW9uIHYoZCxjKXt2YXIgYj10aGlzLl93cmFwO3JldHVybiBhLm1hcChhKGEuaXNBcnJheShiKT9iLmpvaW4oIiIpOmIpLmZpbHRlcihkfHwiKiIpLGZ1bmN0aW9uKGEpe3JldHVybiBjP2EuaW5uZXJUZXh0fHxhLnRleHRDb250ZW50OmEub3V0ZXJIVE1MfHxzKGEpfSl9ZnVuY3Rpb24gdCgpe3ZhciBiPXRoaXMubm9kZXM7YS50bXBsKG51bGwsbnVsbCxudWxsLHRoaXMpLmluc2VydEJlZm9yZShiWzBdKTthKGIpLnJlbW92ZSgpfX0pKGpRdWVyeSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiFmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImpxdWVyeSJdLGUpOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUocmVxdWlyZSgianF1ZXJ5IikpOmUoalF1ZXJ5KX0oZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1lLnRhYmxlc29ydGVyPXt2ZXJzaW9uOiIyLjMwLjUiLHBhcnNlcnM6W10sd2lkZ2V0czpbXSxkZWZhdWx0czp7dGhlbWU6ImRlZmF1bHQiLHdpZHRoRml4ZWQ6ITEsc2hvd1Byb2Nlc3Npbmc6ITEsaGVhZGVyVGVtcGxhdGU6Intjb250ZW50fSIsb25SZW5kZXJUZW1wbGF0ZTpudWxsLG9uUmVuZGVySGVhZGVyOm51bGwsY2FuY2VsU2VsZWN0aW9uOiEwLHRhYkluZGV4OiEwLGRhdGVGb3JtYXQ6Im1tZGR5eXl5Iixzb3J0TXVsdGlTb3J0S2V5OiJzaGlmdEtleSIsc29ydFJlc2V0S2V5OiJjdHJsS2V5Iix1c051bWJlckZvcm1hdDohMCxkZWxheUluaXQ6ITEsc2VydmVyU2lkZVNvcnRpbmc6ITEscmVzb3J0OiEwLGhlYWRlcnM6e30saWdub3JlQ2FzZTohMCxzb3J0Rm9yY2U6bnVsbCxzb3J0TGlzdDpbXSxzb3J0QXBwZW5kOm51bGwsc29ydFN0YWJsZTohMSxzb3J0SW5pdGlhbE9yZGVyOiJhc2MiLHNvcnRMb2NhbGVDb21wYXJlOiExLHNvcnRSZXNldDohMSxzb3J0UmVzdGFydDohMSxlbXB0eVRvOiJib3R0b20iLHN0cmluZ1RvOiJtYXgiLGR1cGxpY2F0ZVNwYW46ITAsdGV4dEV4dHJhY3Rpb246ImJhc2ljIix0ZXh0QXR0cmlidXRlOiJkYXRhLXRleHQiLHRleHRTb3J0ZXI6bnVsbCxudW1iZXJTb3J0ZXI6bnVsbCxpbml0V2lkZ2V0czohMCx3aWRnZXRDbGFzczoid2lkZ2V0LXtuYW1lfSIsd2lkZ2V0czpbXSx3aWRnZXRPcHRpb25zOnt6ZWJyYTpbImV2ZW4iLCJvZGQiXX0saW5pdGlhbGl6ZWQ6bnVsbCx0YWJsZUNsYXNzOiIiLGNzc0FzYzoiIixjc3NEZXNjOiIiLGNzc05vbmU6IiIsY3NzSGVhZGVyOiIiLGNzc0hlYWRlclJvdzoiIixjc3NQcm9jZXNzaW5nOiIiLGNzc0NoaWxkUm93OiJ0YWJsZXNvcnRlci1jaGlsZFJvdyIsY3NzSW5mb0Jsb2NrOiJ0YWJsZXNvcnRlci1pbmZvT25seSIsY3NzTm9Tb3J0OiJ0YWJsZXNvcnRlci1ub1NvcnQiLGNzc0lnbm9yZVJvdzoidGFibGVzb3J0ZXItaWdub3JlUm93Iixjc3NJY29uOiJ0YWJsZXNvcnRlci1pY29uIixjc3NJY29uTm9uZToiIixjc3NJY29uQXNjOiIiLGNzc0ljb25EZXNjOiIiLGNzc0ljb25EaXNhYmxlZDoiIixwb2ludGVyQ2xpY2s6ImNsaWNrIixwb2ludGVyRG93bjoibW91c2Vkb3duIixwb2ludGVyVXA6Im1vdXNldXAiLHNlbGVjdG9ySGVhZGVyczoiPiB0aGVhZCB0aCwgPiB0aGVhZCB0ZCIsc2VsZWN0b3JTb3J0OiJ0aCwgdGQiLHNlbGVjdG9yUmVtb3ZlOiIucmVtb3ZlLW1lIixkZWJ1ZzohMSxoZWFkZXJMaXN0OltdLGVtcHRpZXM6e30sc3RyaW5nczp7fSxwYXJzZXJzOltdLGdsb2JhbGl6ZTowLGltZ0F0dHI6MH0sY3NzOnt0YWJsZToidGFibGVzb3J0ZXIiLGNzc0hhc0NoaWxkOiJ0YWJsZXNvcnRlci1oYXNDaGlsZFJvdyIsY2hpbGRSb3c6InRhYmxlc29ydGVyLWNoaWxkUm93Iixjb2xncm91cDoidGFibGVzb3J0ZXItY29sZ3JvdXAiLGhlYWRlcjoidGFibGVzb3J0ZXItaGVhZGVyIixoZWFkZXJSb3c6InRhYmxlc29ydGVyLWhlYWRlclJvdyIsaGVhZGVySW46InRhYmxlc29ydGVyLWhlYWRlci1pbm5lciIsaWNvbjoidGFibGVzb3J0ZXItaWNvbiIscHJvY2Vzc2luZzoidGFibGVzb3J0ZXItcHJvY2Vzc2luZyIsc29ydEFzYzoidGFibGVzb3J0ZXItaGVhZGVyQXNjIixzb3J0RGVzYzoidGFibGVzb3J0ZXItaGVhZGVyRGVzYyIsc29ydE5vbmU6InRhYmxlc29ydGVyLWhlYWRlclVuU29ydGVkIn0sbGFuZ3VhZ2U6e3NvcnRBc2M6IkFzY2VuZGluZyBzb3J0IGFwcGxpZWQsICIsc29ydERlc2M6IkRlc2NlbmRpbmcgc29ydCBhcHBsaWVkLCAiLHNvcnROb25lOiJObyBzb3J0IGFwcGxpZWQsICIsc29ydERpc2FibGVkOiJzb3J0aW5nIGlzIGRpc2FibGVkIixuZXh0QXNjOiJhY3RpdmF0ZSB0byBhcHBseSBhbiBhc2NlbmRpbmcgc29ydCIsbmV4dERlc2M6ImFjdGl2YXRlIHRvIGFwcGx5IGEgZGVzY2VuZGluZyBzb3J0IixuZXh0Tm9uZToiYWN0aXZhdGUgdG8gcmVtb3ZlIHRoZSBzb3J0In0scmVnZXg6e3RlbXBsYXRlQ29udGVudDovXHtjb250ZW50XH0vZyx0ZW1wbGF0ZUljb246L1x7aWNvblx9L2csdGVtcGxhdGVOYW1lOi9ce25hbWVcfS9pLHNwYWNlczovXHMrL2csbm9uV29yZDovXFcvZyxmb3JtRWxlbWVudHM6LyhpbnB1dHxzZWxlY3R8YnV0dG9ufHRleHRhcmVhKS9pLGNodW5rOi8oXihbK1wtXT8oPzpcZCopKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPyk/JHxeMHhbMC05YS1mXSskfFxkKykvZ2ksY2h1bmtzOi8oXlxcMHxcXDAkKS8saGV4Oi9eMHhbMC05YS1mXSskL2ksY29tbWE6LywvZyxkaWdpdE5vblVTOi9bXHN8XC5dL2csZGlnaXROZWdhdGl2ZVRlc3Q6L15ccypcKFsuXGRdK1wpLyxkaWdpdE5lZ2F0aXZlUmVwbGFjZTovXlxzKlwoKFsuXGRdKylcKS8sZGlnaXRUZXN0Oi9eW1wtKyhdP1xkK1spXT8kLyxkaWdpdFJlcGxhY2U6L1ssLiciXHNdL2d9LHN0cmluZzp7bWF4OjEsbWluOi0xLGVtcHR5bWluOjEsZW1wdHltYXg6LTEsemVybzowLG5vbmU6MCwibnVsbCI6MCx0b3A6ITAsYm90dG9tOiExfSxrZXlDb2Rlczp7ZW50ZXI6MTN9LGRhdGVzOnt9LGluc3RhbmNlTWV0aG9kczp7fSxzZXR1cDpmdW5jdGlvbihyLG8pe2lmKHImJnIudEhlYWQmJjAhPT1yLnRCb2RpZXMubGVuZ3RoJiYhMCE9PXIuaGFzSW5pdGlhbGl6ZWQpe3ZhciBzPSIiLGE9ZShyKSxuPWUubWV0YWRhdGE7ci5oYXNJbml0aWFsaXplZD0hMSxyLmlzUHJvY2Vzc2luZz0hMCxyLmNvbmZpZz1vLGUuZGF0YShyLCJ0YWJsZXNvcnRlciIsbyksdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIkluaXRpYWxpemluZyB0YWJsZXNvcnRlciB2Iit0LnZlcnNpb24pLGUuZGF0YShyLCJzdGFydG92ZXJhbGx0aW1lciIsbmV3IERhdGUpKSxvLnN1cHBvcnRzRGF0YU9iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZVswXT1wYXJzZUludChlWzBdLDEwKSxlWzBdPjF8fDE9PT1lWzBdJiZwYXJzZUludChlWzFdLDEwKT49NH0oZS5mbi5qcXVlcnkuc3BsaXQoIi4iKSksby5lbXB0eVRvPW8uZW1wdHlUby50b0xvd2VyQ2FzZSgpLG8uc3RyaW5nVG89by5zdHJpbmdUby50b0xvd2VyQ2FzZSgpLG8ubGFzdD17c29ydExpc3Q6W10sY2xpY2tlZEluZGV4Oi0xfSwvdGFibGVzb3J0ZXJcLS8udGVzdChhLmF0dHIoImNsYXNzIikpfHwocz0iIiE9PW8udGhlbWU/IiB0YWJsZXNvcnRlci0iK28udGhlbWU6IiIpLG8ubmFtZXNwYWNlP28ubmFtZXNwYWNlPSIuIitvLm5hbWVzcGFjZS5yZXBsYWNlKHQucmVnZXgubm9uV29yZCwiIik6by5uYW1lc3BhY2U9Ii50YWJsZXNvcnRlciIrTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMiksby50YWJsZT1yLG8uJHRhYmxlPWEuYWRkQ2xhc3ModC5jc3MudGFibGUrIiAiK28udGFibGVDbGFzcytzKyIgIitvLm5hbWVzcGFjZS5zbGljZSgxKSkuYXR0cigicm9sZSIsImdyaWQiKSxvLiRoZWFkZXJzPWEuZmluZChvLnNlbGVjdG9ySGVhZGVycyksby4kdGFibGUuY2hpbGRyZW4oKS5jaGlsZHJlbigidHIiKS5hdHRyKCJyb2xlIiwicm93Iiksby4kdGJvZGllcz1hLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrby5jc3NJbmZvQmxvY2srIikiKS5hdHRyKHsiYXJpYS1saXZlIjoicG9saXRlIiwiYXJpYS1yZWxldmFudCI6ImFsbCJ9KSxvLiR0YWJsZS5jaGlsZHJlbigiY2FwdGlvbiIpLmxlbmd0aCYmKChzPW8uJHRhYmxlLmNoaWxkcmVuKCJjYXB0aW9uIilbMF0pLmlkfHwocy5pZD1vLm5hbWVzcGFjZS5zbGljZSgxKSsiY2FwdGlvbiIpLG8uJHRhYmxlLmF0dHIoImFyaWEtbGFiZWxsZWRieSIscy5pZCkpLG8ud2lkZ2V0SW5pdD17fSxvLnRleHRFeHRyYWN0aW9uPW8uJHRhYmxlLmF0dHIoImRhdGEtdGV4dC1leHRyYWN0aW9uIil8fG8udGV4dEV4dHJhY3Rpb258fCJiYXNpYyIsdC5idWlsZEhlYWRlcnMobyksdC5maXhDb2x1bW5XaWR0aChyKSx0LmFkZFdpZGdldEZyb21DbGFzcyhyKSx0LmFwcGx5V2lkZ2V0T3B0aW9ucyhyKSx0LnNldHVwUGFyc2VycyhvKSxvLnRvdGFsUm93cz0wLG8uZGVidWcmJnQudmFsaWRhdGVPcHRpb25zKG8pLG8uZGVsYXlJbml0fHx0LmJ1aWxkQ2FjaGUobyksdC5iaW5kRXZlbnRzKHIsby4kaGVhZGVycywhMCksdC5iaW5kTWV0aG9kcyhvKSxvLnN1cHBvcnRzRGF0YU9iamVjdCYmdm9pZCAwIT09YS5kYXRhKCkuc29ydGxpc3Q/by5zb3J0TGlzdD1hLmRhdGEoKS5zb3J0bGlzdDpuJiZhLm1ldGFkYXRhKCkmJmEubWV0YWRhdGEoKS5zb3J0bGlzdCYmKG8uc29ydExpc3Q9YS5tZXRhZGF0YSgpLnNvcnRsaXN0KSx0LmFwcGx5V2lkZ2V0KHIsITApLG8uc29ydExpc3QubGVuZ3RoPjA/dC5zb3J0T24obyxvLnNvcnRMaXN0LHt9LCFvLmluaXRXaWRnZXRzKToodC5zZXRIZWFkZXJzQ3NzKG8pLG8uaW5pdFdpZGdldHMmJnQuYXBwbHlXaWRnZXQociwhMSkpLG8uc2hvd1Byb2Nlc3NpbmcmJmEudW5iaW5kKCJzb3J0QmVnaW4iK28ubmFtZXNwYWNlKyIgc29ydEVuZCIrby5uYW1lc3BhY2UpLmJpbmQoInNvcnRCZWdpbiIrby5uYW1lc3BhY2UrIiBzb3J0RW5kIitvLm5hbWVzcGFjZSxmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoby50aW1lclByb2Nlc3NpbmcpLHQuaXNQcm9jZXNzaW5nKHIpLCJzb3J0QmVnaW4iPT09ZS50eXBlJiYoby50aW1lclByb2Nlc3Npbmc9c2V0VGltZW91dChmdW5jdGlvbigpe3QuaXNQcm9jZXNzaW5nKHIsITApfSw1MDApKX0pLHIuaGFzSW5pdGlhbGl6ZWQ9ITAsci5pc1Byb2Nlc3Npbmc9ITEsdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlLmxvZygiT3ZlcmFsbCBpbml0aWFsaXphdGlvbiB0aW1lOiIrdC5iZW5jaG1hcmsoZS5kYXRhKHIsInN0YXJ0b3ZlcmFsbHRpbWVyIikpKSx0LmRlYnVnKG8sImNvcmUiKSYmY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpKSxhLnRyaWdnZXJIYW5kbGVyKCJ0YWJsZXNvcnRlci1pbml0aWFsaXplZCIsciksImZ1bmN0aW9uIj09dHlwZW9mIG8uaW5pdGlhbGl6ZWQmJm8uaW5pdGlhbGl6ZWQocil9ZWxzZSB0LmRlYnVnKG8sImNvcmUiKSYmKHIuaGFzSW5pdGlhbGl6ZWQ/Y29uc29sZS53YXJuKCJTdG9wcGluZyBpbml0aWFsaXphdGlvbi4gVGFibGVzb3J0ZXIgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCIpOmNvbnNvbGUuZXJyb3IoIlN0b3BwaW5nIGluaXRpYWxpemF0aW9uISBObyB0YWJsZSwgdGhlYWQgb3IgdGJvZHkiLHIpKX0sYmluZE1ldGhvZHM6ZnVuY3Rpb24ocil7dmFyIG89ci4kdGFibGUscz1yLm5hbWVzcGFjZSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgYWRkUm93cyB1cGRhdGVDZWxsIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyBkZXN0cm95IG1vdXNldXAgbW91c2VsZWF2ZSAiLnNwbGl0KCIgIikuam9pbihzKyIgIik7by51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLmJpbmQoInNvcnRSZXNldCIrcyxmdW5jdGlvbihlLHIpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5zb3J0UmVzZXQodGhpcy5jb25maWcsZnVuY3Rpb24oZSl7ZS5pc0FwcGx5aW5nV2lkZ2V0cz9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5hcHBseVdpZGdldChlLCIiLHIpfSwxMDApOnQuYXBwbHlXaWRnZXQoZSwiIixyKX0pfSkuYmluZCgidXBkYXRlQWxsIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQWxsKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGUiK3MrIiB1cGRhdGVSb3dzIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGVIZWFkZXJzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZUhlYWRlcnModGhpcy5jb25maWcscil9KS5iaW5kKCJ1cGRhdGVDZWxsIitzLGZ1bmN0aW9uKGUscixvLHMpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC51cGRhdGVDZWxsKHRoaXMuY29uZmlnLHIsbyxzKX0pLmJpbmQoImFkZFJvd3MiK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFkZFJvd3ModGhpcy5jb25maWcscixvLHMpfSkuYmluZCgidXBkYXRlQ29tcGxldGUiK3MsZnVuY3Rpb24oKXt0aGlzLmlzVXBkYXRpbmc9ITF9KS5iaW5kKCJzb3J0b24iK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnNvcnRPbih0aGlzLmNvbmZpZyxyLG8scyl9KS5iaW5kKCJhcHBlbmRDYWNoZSIrcyxmdW5jdGlvbihyLG8scyl7ci5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGVuZENhY2hlKHRoaXMuY29uZmlnLHMpLGUuaXNGdW5jdGlvbihvKSYmbyh0aGlzKX0pLmJpbmQoInVwZGF0ZUNhY2hlIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQ2FjaGUodGhpcy5jb25maWcscixvKX0pLmJpbmQoImFwcGx5V2lkZ2V0SWQiK3MsZnVuY3Rpb24oZSxyKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuYXBwbHlXaWRnZXRJZCh0aGlzLHIpfSkuYmluZCgiYXBwbHlXaWRnZXRzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGx5V2lkZ2V0KHRoaXMsITEscil9KS5iaW5kKCJyZWZyZXNoV2lkZ2V0cyIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlZnJlc2hXaWRnZXRzKHRoaXMscixvKX0pLmJpbmQoInJlbW92ZVdpZGdldCIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlbW92ZVdpZGdldCh0aGlzLHIsbyl9KS5iaW5kKCJkZXN0cm95IitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuZGVzdHJveSh0aGlzLHIsbyl9KS5iaW5kKCJyZXNldFRvTG9hZFN0YXRlIitzLGZ1bmN0aW9uKG8pe28uc3RvcFByb3BhZ2F0aW9uKCksdC5yZW1vdmVXaWRnZXQodGhpcywhMCwhMSk7dmFyIHM9ZS5leHRlbmQoITAse30sci5vcmlnaW5hbFNldHRpbmdzKTsocj1lLmV4dGVuZCghMCx7fSx0LmRlZmF1bHRzLHMpKS5vcmlnaW5hbFNldHRpbmdzPXMsdGhpcy5oYXNJbml0aWFsaXplZD0hMSx0LnNldHVwKHRoaXMscil9KX0sYmluZEV2ZW50czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbj0ocj1lKHIpWzBdKS5jb25maWcsaT1uLm5hbWVzcGFjZSxsPW51bGw7ITAhPT1zJiYoby5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfaGVhZGVycyIpLChhPXQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpKS5sZW5ndGgmJiJUQUJMRSI9PT1hWzBdLm5vZGVOYW1lJiZhWzBdIT09ciYmZShhWzBdKS5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfdGFibGUiKSksYT0obi5wb2ludGVyRG93bisiICIrbi5wb2ludGVyVXArIiAiK24ucG9pbnRlckNsaWNrKyIgc29ydCBrZXl1cCAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikuc3BsaXQoIiAiKS5qb2luKGkrIiAiKSxvLmZpbmQobi5zZWxlY3RvclNvcnQpLmFkZChvLmZpbHRlcihuLnNlbGVjdG9yU29ydCkpLnVuYmluZChhKS5iaW5kKGEsZnVuY3Rpb24ocixvKXt2YXIgcyxhLGksZD1lKHIudGFyZ2V0KSxjPSIgIityLnR5cGUrIiAiO2lmKCEoMSE9PShyLndoaWNofHxyLmJ1dHRvbikmJiFjLm1hdGNoKCIgIituLnBvaW50ZXJDbGljaysiIHwgc29ydCB8IGtleXVwICIpfHwiIGtleXVwICI9PT1jJiZyLndoaWNoIT09dC5rZXlDb2Rlcy5lbnRlcnx8Yy5tYXRjaCgiICIrbi5wb2ludGVyQ2xpY2srIiAiKSYmdm9pZCAwIT09ci53aGljaHx8Yy5tYXRjaCgiICIrbi5wb2ludGVyVXArIiAiKSYmbCE9PXIudGFyZ2V0JiYhMCE9PW8pKXtpZihjLm1hdGNoKCIgIituLnBvaW50ZXJEb3duKyIgIikpcmV0dXJuIGw9ci50YXJnZXQsdm9pZCgiMSI9PT0oaT1kLmpxdWVyeS5zcGxpdCgiLiIpKVswXSYmaVsxXTw0JiZyLnByZXZlbnREZWZhdWx0KCkpO2lmKGw9bnVsbCxzPXQuZ2V0Q2xvc2VzdChlKHRoaXMpLCIuIit0LmNzcy5oZWFkZXIpLHQucmVnZXguZm9ybUVsZW1lbnRzLnRlc3Qoci50YXJnZXQubm9kZU5hbWUpfHxkLmhhc0NsYXNzKG4uY3NzTm9Tb3J0KXx8ZC5wYXJlbnRzKCIuIituLmNzc05vU29ydCkubGVuZ3RoPjB8fHMuaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHxkLnBhcmVudHMoImJ1dHRvbiIpLmxlbmd0aD4wKXJldHVybiFuLmNhbmNlbFNlbGVjdGlvbjtuLmRlbGF5SW5pdCYmdC5pc0VtcHR5T2JqZWN0KG4uY2FjaGUpJiZ0LmJ1aWxkQ2FjaGUobiksbi5sYXN0LmNsaWNrZWRJbmRleD1zLmF0dHIoImRhdGEtY29sdW1uIil8fHMuaW5kZXgoKSwoYT1uLiRoZWFkZXJJbmRleGVkW24ubGFzdC5jbGlja2VkSW5kZXhdWzBdKSYmIWEuc29ydERpc2FibGVkJiZ0LmluaXRTb3J0KG4sYSxyKX19KSxuLmNhbmNlbFNlbGVjdGlvbiYmby5hdHRyKCJ1bnNlbGVjdGFibGUiLCJvbiIpLmJpbmQoInNlbGVjdHN0YXJ0IiwhMSkuY3NzKHsidXNlci1zZWxlY3QiOiJub25lIixNb3pVc2VyU2VsZWN0OiJub25lIn0pfSxidWlsZEhlYWRlcnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG47Zm9yKHIuaGVhZGVyTGlzdD1bXSxyLmhlYWRlckNvbnRlbnQ9W10sci5zb3J0VmFycz1bXSx0LmRlYnVnKHIsImNvcmUiKSYmKGE9bmV3IERhdGUpLHIuY29sdW1ucz10LmNvbXB1dGVDb2x1bW5JbmRleChyLiR0YWJsZS5jaGlsZHJlbigidGhlYWQsIHRmb290IikuY2hpbGRyZW4oInRyIikpLHM9ci5jc3NJY29uPyc8aSBjbGFzcz0iJysoci5jc3NJY29uPT09dC5jc3MuaWNvbj90LmNzcy5pY29uOnIuY3NzSWNvbisiICIrdC5jc3MuaWNvbikrJyI+PC9pPic6IiIsci4kaGVhZGVycz1lKGUubWFwKHIuJHRhYmxlLmZpbmQoci5zZWxlY3RvckhlYWRlcnMpLGZ1bmN0aW9uKG8sYSl7dmFyIG4saSxsLGQsYyxnPWUobyk7aWYoIXQuZ2V0Q2xvc2VzdChnLCJ0ciIpLmhhc0NsYXNzKHIuY3NzSWdub3JlUm93KSlyZXR1cm4vKHRofHRkKS9pLnRlc3Qoby5ub2RlTmFtZSl8fChjPXQuZ2V0Q2xvc2VzdChnLCJ0aCwgdGQiKSxnLmF0dHIoImRhdGEtY29sdW1uIixjLmF0dHIoImRhdGEtY29sdW1uIikpKSxuPXQuZ2V0Q29sdW1uRGF0YShyLnRhYmxlLHIuaGVhZGVycyxhLCEwKSxyLmhlYWRlckNvbnRlbnRbYV09Zy5odG1sKCksIiI9PT1yLmhlYWRlclRlbXBsYXRlfHxnLmZpbmQoIi4iK3QuY3NzLmhlYWRlckluKS5sZW5ndGh8fChkPXIuaGVhZGVyVGVtcGxhdGUucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlQ29udGVudCxnLmh0bWwoKSkucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlSWNvbixnLmZpbmQoIi4iK3QuY3NzLmljb24pLmxlbmd0aD8iIjpzKSxyLm9uUmVuZGVyVGVtcGxhdGUmJihpPXIub25SZW5kZXJUZW1wbGF0ZS5hcHBseShnLFthLGRdKSkmJiJzdHJpbmciPT10eXBlb2YgaSYmKGQ9aSksZy5odG1sKCc8ZGl2IGNsYXNzPSInK3QuY3NzLmhlYWRlckluKyciPicrZCsiPC9kaXY+IikpLHIub25SZW5kZXJIZWFkZXImJnIub25SZW5kZXJIZWFkZXIuYXBwbHkoZyxbYSxyLHIuJHRhYmxlXSksbD1wYXJzZUludChnLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG8uY29sdW1uPWwsYz10LmdldE9yZGVyKHQuZ2V0RGF0YShnLG4sInNvcnRJbml0aWFsT3JkZXIiKXx8ci5zb3J0SW5pdGlhbE9yZGVyKSxyLnNvcnRWYXJzW2xdPXtjb3VudDotMSxvcmRlcjpjP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxsb2NrZWRPcmRlcjohMX0sdm9pZCAwIT09KGM9dC5nZXREYXRhKGcsbiwibG9ja2VkT3JkZXIiKXx8ITEpJiYhMSE9PWMmJihyLnNvcnRWYXJzW2xdLmxvY2tlZE9yZGVyPSEwLHIuc29ydFZhcnNbbF0ub3JkZXI9dC5nZXRPcmRlcihjKT9bMSwxXTpbMCwwXSksci5oZWFkZXJMaXN0W2FdPW8sZy5hZGRDbGFzcyh0LmNzcy5oZWFkZXIrIiAiK3IuY3NzSGVhZGVyKSx0LmdldENsb3Nlc3QoZywidHIiKS5hZGRDbGFzcyh0LmNzcy5oZWFkZXJSb3crIiAiK3IuY3NzSGVhZGVyUm93KS5hdHRyKCJyb2xlIiwicm93Iiksci50YWJJbmRleCYmZy5hdHRyKCJ0YWJpbmRleCIsMCksb30pKSxyLiRoZWFkZXJJbmRleGVkPVtdLG49MDtuPHIuY29sdW1ucztuKyspdC5pc0VtcHR5T2JqZWN0KHIuc29ydFZhcnNbbl0pJiYoci5zb3J0VmFyc1tuXT17fSksbz1yLiRoZWFkZXJzLmZpbHRlcignW2RhdGEtY29sdW1uPSInK24rJyJdJyksci4kaGVhZGVySW5kZXhlZFtuXT1vLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcigiOmxhc3QiKTpvLmZpbHRlcigiOmxhc3QiKTplKCk7ci4kdGFibGUuZmluZChyLnNlbGVjdG9ySGVhZGVycykuYXR0cih7c2NvcGU6ImNvbCIscm9sZToiY29sdW1uaGVhZGVyIn0pLHQudXBkYXRlSGVhZGVyKHIpLHQuZGVidWcociwiY29yZSIpJiYoY29uc29sZS5sb2coIkJ1aWx0IGhlYWRlcnM6Iit0LmJlbmNobWFyayhhKSksY29uc29sZS5sb2coci4kaGVhZGVycykpfSxhZGRJbnN0YW5jZU1ldGhvZHM6ZnVuY3Rpb24ocil7ZS5leHRlbmQodC5pbnN0YW5jZU1ldGhvZHMscil9LHNldHVwUGFyc2VyczpmdW5jdGlvbihlLHIpe3ZhciBvLHMsYSxuLGksbCxkLGMsZyxwLHUsZixoLG0sYj1lLnRhYmxlLHk9MCx3PXQuZGVidWcoZSwiY29yZSIpLHg9e307aWYoZS4kdGJvZGllcz1lLiR0YWJsZS5jaGlsZHJlbigidGJvZHk6bm90KC4iK2UuY3NzSW5mb0Jsb2NrKyIpIiksaD12b2lkIDA9PT1yP2UuJHRib2RpZXM6ciwwPT09KG09aC5sZW5ndGgpKXJldHVybiB3P2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgcGFyc2VyIGNhY2hlIik6IiI7Zm9yKHcmJihmPW5ldyBEYXRlLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiRGV0ZWN0aW5nIHBhcnNlcnMgZm9yIGVhY2ggY29sdW1uIikpLHM9e2V4dHJhY3RvcnM6W10scGFyc2VyczpbXX07eTxtOyl7aWYoKG89aFt5XS5yb3dzKS5sZW5ndGgpZm9yKGk9MCxuPWUuY29sdW1ucyxsPTA7bDxuO2wrKyl7aWYoKGQ9ZS4kaGVhZGVySW5kZXhlZFtpXSkmJmQubGVuZ3RoJiYoYz10LmdldENvbHVtbkRhdGEoYixlLmhlYWRlcnMsaSksdT10LmdldFBhcnNlckJ5SWQodC5nZXREYXRhKGQsYywiZXh0cmFjdG9yIikpLHA9dC5nZXRQYXJzZXJCeUlkKHQuZ2V0RGF0YShkLGMsInNvcnRlciIpKSxnPSJmYWxzZSI9PT10LmdldERhdGEoZCxjLCJwYXJzZXIiKSxlLmVtcHRpZXNbaV09KHQuZ2V0RGF0YShkLGMsImVtcHR5Iil8fGUuZW1wdHlUb3x8KGUuZW1wdHlUb0JvdHRvbT8iYm90dG9tIjoidG9wIikpLnRvTG93ZXJDYXNlKCksZS5zdHJpbmdzW2ldPSh0LmdldERhdGEoZCxjLCJzdHJpbmciKXx8ZS5zdHJpbmdUb3x8Im1heCIpLnRvTG93ZXJDYXNlKCksZyYmKHA9dC5nZXRQYXJzZXJCeUlkKCJuby1wYXJzZXIiKSksdXx8KHU9ITEpLHB8fChwPXQuZGV0ZWN0UGFyc2VyRm9yQ29sdW1uKGUsbywtMSxpKSksdyYmKHhbIigiK2krIikgIitkLnRleHQoKV09e3BhcnNlcjpwLmlkLGV4dHJhY3Rvcjp1P3UuaWQ6Im5vbmUiLHN0cmluZzplLnN0cmluZ3NbaV0sZW1wdHk6ZS5lbXB0aWVzW2ldfSkscy5wYXJzZXJzW2ldPXAscy5leHRyYWN0b3JzW2ldPXUsKGE9ZFswXS5jb2xTcGFuLTEpPjApKWZvcihpKz1hLG4rPWE7YSsxPjA7KXMucGFyc2Vyc1tpLWFdPXAscy5leHRyYWN0b3JzW2ktYV09dSxhLS07aSsrfXkrPXMucGFyc2Vycy5sZW5ndGg/bToxfXcmJih0LmlzRW1wdHlPYmplY3QoeCk/Y29uc29sZS53YXJuKCIgIE5vIHBhcnNlcnMgZGV0ZWN0ZWQhIik6Y29uc29sZVtjb25zb2xlLnRhYmxlPyJ0YWJsZSI6ImxvZyJdKHgpLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgZGV0ZWN0aW5nIHBhcnNlcnMiK3QuYmVuY2htYXJrKGYpKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpLGUucGFyc2Vycz1zLnBhcnNlcnMsZS5leHRyYWN0b3JzPXMuZXh0cmFjdG9yc30sYWRkUGFyc2VyOmZ1bmN0aW9uKGUpe3ZhciByLG89dC5wYXJzZXJzLmxlbmd0aCxzPSEwO2ZvcihyPTA7cjxvO3IrKyl0LnBhcnNlcnNbcl0uaWQudG9Mb3dlckNhc2UoKT09PWUuaWQudG9Mb3dlckNhc2UoKSYmKHM9ITEpO3MmJih0LnBhcnNlcnNbdC5wYXJzZXJzLmxlbmd0aF09ZSl9LGdldFBhcnNlckJ5SWQ6ZnVuY3Rpb24oZSl7aWYoImZhbHNlIj09ZSlyZXR1cm4hMTt2YXIgcixvPXQucGFyc2Vycy5sZW5ndGg7Zm9yKHI9MDtyPG87cisrKWlmKHQucGFyc2Vyc1tyXS5pZC50b0xvd2VyQ2FzZSgpPT09ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHQucGFyc2Vyc1tyXTtyZXR1cm4hMX0sZGV0ZWN0UGFyc2VyRm9yQ29sdW1uOmZ1bmN0aW9uKHIsbyxzLGEpe2Zvcih2YXIgbixpLGwsZD10LnBhcnNlcnMubGVuZ3RoLGM9ITEsZz0iIixwPXQuZGVidWcociwiY29yZSIpLHU9ITA7IiI9PT1nJiZ1OykobD1vWysrc10pJiZzPDUwP2wuY2xhc3NOYW1lLmluZGV4T2YodC5jc3NJZ25vcmVSb3cpPDAmJihjPW9bc10uY2VsbHNbYV0sZz10LmdldEVsZW1lbnRUZXh0KHIsYyxhKSxpPWUoYykscCYmY29uc29sZS5sb2coIkNoZWNraW5nIGlmIHZhbHVlIHdhcyBlbXB0eSBvbiByb3cgIitzKyIsIGNvbHVtbjogIithKyc6ICInK2crJyInKSk6dT0hMTtmb3IoOy0tZD49MDspaWYoKG49dC5wYXJzZXJzW2RdKSYmInRleHQiIT09bi5pZCYmbi5pcyYmbi5pcyhnLHIudGFibGUsYyxpKSlyZXR1cm4gbjtyZXR1cm4gdC5nZXRQYXJzZXJCeUlkKCJ0ZXh0Iil9LGdldEVsZW1lbnRUZXh0OmZ1bmN0aW9uKHIsbyxzKXtpZighbylyZXR1cm4iIjt2YXIgYSxuPXIudGV4dEV4dHJhY3Rpb258fCIiLGk9by5qcXVlcnk/bzplKG8pO3JldHVybiJzdHJpbmciPT10eXBlb2Ygbj8iYmFzaWMiPT09biYmdm9pZCAwIT09KGE9aS5hdHRyKHIudGV4dEF0dHJpYnV0ZSkpP2UudHJpbShhKTplLnRyaW0oby50ZXh0Q29udGVudHx8aS50ZXh0KCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP2UudHJpbShuKGlbMF0sci50YWJsZSxzKSk6ImZ1bmN0aW9uIj09dHlwZW9mKGE9dC5nZXRDb2x1bW5EYXRhKHIudGFibGUsbixzKSk/ZS50cmltKGEoaVswXSxyLnRhYmxlLHMpKTplLnRyaW0oaVswXS50ZXh0Q29udGVudHx8aS50ZXh0KCkpfSxnZXRQYXJzZWRUZXh0OmZ1bmN0aW9uKGUscixvLHMpe3ZvaWQgMD09PXMmJihzPXQuZ2V0RWxlbWVudFRleHQoZSxyLG8pKTt2YXIgYT0iIitzLG49ZS5wYXJzZXJzW29dLGk9ZS5leHRyYWN0b3JzW29dO3JldHVybiBuJiYoaSYmImZ1bmN0aW9uIj09dHlwZW9mIGkuZm9ybWF0JiYocz1pLmZvcm1hdChzLGUudGFibGUscixvKSksYT0ibm8tcGFyc2VyIj09PW4uaWQ/IiI6bi5mb3JtYXQoIiIrcyxlLnRhYmxlLHIsbyksZS5pZ25vcmVDYXNlJiYic3RyaW5nIj09dHlwZW9mIGEmJihhPWEudG9Mb3dlckNhc2UoKSkpLGF9LGJ1aWxkQ2FjaGU6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYyxnLHAsdSxmLGgsbSxiLHksdyx4LHYsQywkLEksRCxSLFQ9ci50YWJsZSxMPXIucGFyc2VycyxBPXQuZGVidWcociwiY29yZSIpO2lmKHIuJHRib2RpZXM9ci4kdGFibGUuY2hpbGRyZW4oInRib2R5Om5vdCguIityLmNzc0luZm9CbG9jaysiKSIpLGc9dm9pZCAwPT09cz9yLiR0Ym9kaWVzOnMsci5jYWNoZT17fSxyLnRvdGFsUm93cz0wLCFMKXJldHVybiBBP2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgY2FjaGUiKToiIjtmb3IoQSYmKG09bmV3IERhdGUpLHIuc2hvd1Byb2Nlc3NpbmcmJnQuaXNQcm9jZXNzaW5nKFQsITApLGM9MDtjPGcubGVuZ3RoO2MrKyl7Zm9yKHg9W10sYT1yLmNhY2hlW2NdPXtub3JtYWxpemVkOltdfSxiPWdbY10mJmdbY10ucm93cy5sZW5ndGh8fDAsbD0wO2w8YjsrK2wpaWYoeT17Y2hpbGQ6W10scmF3OltdfSxwPWUoZ1tjXS5yb3dzW2xdKSx1PVtdLCFwLmhhc0NsYXNzKHIuc2VsZWN0b3JSZW1vdmUuc2xpY2UoMSkpKWlmKHAuaGFzQ2xhc3Moci5jc3NDaGlsZFJvdykmJjAhPT1sKWZvcihEPWEubm9ybWFsaXplZC5sZW5ndGgtMSwodz1hLm5vcm1hbGl6ZWRbRF1bci5jb2x1bW5zXSkuJHJvdz13LiRyb3cuYWRkKHApLHAucHJldigpLmhhc0NsYXNzKHIuY3NzQ2hpbGRSb3cpfHxwLnByZXYoKS5hZGRDbGFzcyh0LmNzcy5jc3NIYXNDaGlsZCksZj1wLmNoaWxkcmVuKCJ0aCwgdGQiKSxEPXcuY2hpbGQubGVuZ3RoLHcuY2hpbGRbRF09W10sQz0wLEk9ci5jb2x1bW5zLGQ9MDtkPEk7ZCsrKShoPWZbZF0pJiYody5jaGlsZFtEXVtkXT10LmdldFBhcnNlZFRleHQocixoLGQpLCh2PWZbZF0uY29sU3Bhbi0xKT4wJiYoQys9dixJKz12KSksQysrO2Vsc2V7Zm9yKHkuJHJvdz1wLHkub3JkZXI9bCxDPTAsST1yLmNvbHVtbnMsZD0wO2Q8STsrK2Qpe2lmKChoPXBbMF0uY2VsbHNbZF0pJiZDPHIuY29sdW1ucyYmKCEoJD12b2lkIDAhPT1MW0NdKSYmQSYmY29uc29sZS53YXJuKCJObyBwYXJzZXIgZm91bmQgZm9yIHJvdzogIitsKyIsIGNvbHVtbjogIitkKyc7IGNlbGwgY29udGFpbmluZzogIicrZShoKS50ZXh0KCkrJyI7IGRvZXMgaXQgaGF2ZSBhIGhlYWRlcj8nKSxuPXQuZ2V0RWxlbWVudFRleHQocixoLEMpLHkucmF3W0NdPW4saT10LmdldFBhcnNlZFRleHQocixoLEMsbiksdVtDXT1pLCQmJiJudW1lcmljIj09PShMW0NdLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpJiYoeFtDXT1NYXRoLm1heChNYXRoLmFicyhpKXx8MCx4W0NdfHwwKSksKHY9aC5jb2xTcGFuLTEpPjApKXtmb3IoUj0wO1I8PXY7KWk9ci5kdXBsaWNhdGVTcGFufHwwPT09Uj9uOiJzdHJpbmciIT10eXBlb2Ygci50ZXh0RXh0cmFjdGlvbj90LmdldEVsZW1lbnRUZXh0KHIsaCxDK1IpfHwiIjoiIix5LnJhd1tDK1JdPWksdVtDK1JdPWksUisrO0MrPXYsSSs9dn1DKyt9dVtyLmNvbHVtbnNdPXksYS5ub3JtYWxpemVkW2Eubm9ybWFsaXplZC5sZW5ndGhdPXV9YS5jb2xNYXg9eCxyLnRvdGFsUm93cys9YS5ub3JtYWxpemVkLmxlbmd0aH1pZihyLnNob3dQcm9jZXNzaW5nJiZ0LmlzUHJvY2Vzc2luZyhUKSxBKXtmb3IoRD1NYXRoLm1pbig1LHIuY2FjaGVbMF0ubm9ybWFsaXplZC5sZW5ndGgpLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiQnVpbGRpbmcgY2FjaGUgZm9yICIrci50b3RhbFJvd3MrIiByb3dzIChzaG93aW5nICIrRCsiIHJvd3MgaW4gbG9nKSBhbmQgIityLmNvbHVtbnMrIiBjb2x1bW5zIit0LmJlbmNobWFyayhtKSksbj17fSxkPTA7ZDxyLmNvbHVtbnM7ZCsrKWZvcihDPTA7QzxEO0MrKyluWyJyb3c6ICIrQ118fChuWyJyb3c6ICIrQ109e30pLG5bInJvdzogIitDXVtyLiRoZWFkZXJJbmRleGVkW2RdLnRleHQoKV09ci5jYWNoZVswXS5ub3JtYWxpemVkW0NdW2RdO2NvbnNvbGVbY29uc29sZS50YWJsZT8idGFibGUiOiJsb2ciXShuKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9ZS5pc0Z1bmN0aW9uKG8pJiZvKFQpfSxnZXRDb2x1bW5UZXh0OmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG09ImZ1bmN0aW9uIj09dHlwZW9mIHMsYj0iYWxsIj09PW8seT17cmF3OltdLHBhcnNlZDpbXSwkY2VsbDpbXX0sdz0ocj1lKHIpWzBdKS5jb25maWc7aWYoIXQuaXNFbXB0eU9iamVjdCh3KSl7Zm9yKGM9dy4kdGJvZGllcy5sZW5ndGgsbj0wO248YztuKyspZm9yKGc9KGw9dy5jYWNoZVtuXS5ub3JtYWxpemVkKS5sZW5ndGgsaT0wO2k8ZztpKyspZD1sW2ldLGEmJiFkW3cuY29sdW1uc10uJHJvdy5pcyhhKXx8KGg9ITAsdT1iP2Quc2xpY2UoMCx3LmNvbHVtbnMpOmRbb10sZD1kW3cuY29sdW1uc10scD1iP2QucmF3OmQucmF3W29dLGY9Yj9kLiRyb3cuY2hpbGRyZW4oKTpkLiRyb3cuY2hpbGRyZW4oKS5lcShvKSxtJiYoaD1zKHt0Ym9keUluZGV4Om4scm93SW5kZXg6aSxwYXJzZWQ6dSxyYXc6cCwkcm93OmQuJHJvdywkY2VsbDpmfSkpLCExIT09aCYmKHkucGFyc2VkW3kucGFyc2VkLmxlbmd0aF09dSx5LnJhd1t5LnJhdy5sZW5ndGhdPXAseS4kY2VsbFt5LiRjZWxsLmxlbmd0aF09ZikpO3JldHVybiB5fXQuZGVidWcodywiY29yZSIpJiZjb25zb2xlLndhcm4oIk5vIGNhY2hlIGZvdW5kIC0gYWJvcnRpbmcgZ2V0Q29sdW1uVGV4dCBmdW5jdGlvbiEiKX0sc2V0SGVhZGVyc0NzczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ci5zb3J0TGlzdCxuPWEubGVuZ3RoLGk9dC5jc3Muc29ydE5vbmUrIiAiK3IuY3NzTm9uZSxsPVt0LmNzcy5zb3J0QXNjKyIgIityLmNzc0FzYyx0LmNzcy5zb3J0RGVzYysiICIrci5jc3NEZXNjXSxkPVtyLmNzc0ljb25Bc2Msci5jc3NJY29uRGVzYyxyLmNzc0ljb25Ob25lXSxjPVsiYXNjZW5kaW5nIiwiZGVzY2VuZGluZyJdLGc9ZnVuY3Rpb24oZSxyKXtlLnJlbW92ZUNsYXNzKGkpLmFkZENsYXNzKGxbcl0pLmF0dHIoImFyaWEtc29ydCIsY1tyXSkuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZFsyXSkuYWRkQ2xhc3MoZFtyXSl9LHA9ci4kdGFibGUuZmluZCgidGZvb3QgdHIiKS5jaGlsZHJlbigidGQsIHRoIikuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKSx1PXIuJGhlYWRlcnMuYWRkKGUoInRoZWFkICIrci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKS5hZGRDbGFzcyhpKS5hdHRyKCJhcmlhLXNvcnQiLCJub25lIikuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZC5qb2luKCIgIikpLmVuZCgpO2Zvcih1Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKGRbMl0pLHIuY3NzSWNvbkRpc2FibGVkJiZ1LmZpbHRlcigiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKHIuY3NzSWNvbkRpc2FibGVkKSxvPTA7bzxuO28rKylpZigyIT09YVtvXVsxXSl7aWYodT1yLiRoZWFkZXJzLmZpbHRlcihmdW5jdGlvbihlKXtmb3IodmFyIG89ITAscz1yLiRoZWFkZXJzLmVxKGUpLGE9cGFyc2VJbnQocy5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxuPWErdC5nZXRDbG9zZXN0KHMsInRoLCB0ZCIpWzBdLmNvbFNwYW47YTxuO2ErKylvPSEhbyYmKG98fHQuaXNWYWx1ZUluQXJyYXkoYSxyLnNvcnRMaXN0KT4tMSk7cmV0dXJuIG99KSwodT11Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcignW2RhdGEtY29sdW1uPSInK2Fbb11bMF0rJyJdJysoMT09PW4/IjpsYXN0IjoiIikpKS5sZW5ndGgpZm9yKHM9MDtzPHUubGVuZ3RoO3MrKyl1W3NdLnNvcnREaXNhYmxlZHx8Zyh1LmVxKHMpLGFbb11bMV0pO3AubGVuZ3RoJiZnKHAuZmlsdGVyKCdbZGF0YS1jb2x1bW49IicrYVtvXVswXSsnIl0nKSxhW29dWzFdKX1mb3Iobj1yLiRoZWFkZXJzLmxlbmd0aCxvPTA7bzxuO28rKyl0LnNldENvbHVtbkFyaWFMYWJlbChyLHIuJGhlYWRlcnMuZXEobykpfSxnZXRDbG9zZXN0OmZ1bmN0aW9uKHQscil7cmV0dXJuIGUuZm4uY2xvc2VzdD90LmNsb3Nlc3Qocik6dC5pcyhyKT90OnQucGFyZW50cyhyKS5maWx0ZXIoIjpmaXJzdCIpfSxzZXRDb2x1bW5BcmlhTGFiZWw6ZnVuY3Rpb24ocixvLHMpe2lmKG8ubGVuZ3RoKXt2YXIgYT1wYXJzZUludChvLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG49ci5zb3J0VmFyc1thXSxpPW8uaGFzQ2xhc3ModC5jc3Muc29ydEFzYyk/InNvcnRBc2MiOm8uaGFzQ2xhc3ModC5jc3Muc29ydERlc2MpPyJzb3J0RGVzYyI6InNvcnROb25lIixsPWUudHJpbShvLnRleHQoKSkrIjogIit0Lmxhbmd1YWdlW2ldO28uaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHwhMT09PXM/bCs9dC5sYW5ndWFnZS5zb3J0RGlzYWJsZWQ6KGk9KG4uY291bnQrMSklbi5vcmRlci5sZW5ndGgscz1uLm9yZGVyW2ldLGwrPXQubGFuZ3VhZ2VbMD09PXM/Im5leHRBc2MiOjE9PT1zPyJuZXh0RGVzYyI6Im5leHROb25lIl0pLG8uYXR0cigiYXJpYS1sYWJlbCIsbCl9fSx1cGRhdGVIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9ZS4kaGVhZGVycy5sZW5ndGg7Zm9yKHI9MDtyPGk7cisrKXM9ZS4kaGVhZGVycy5lcShyKSxhPXQuZ2V0Q29sdW1uRGF0YShuLGUuaGVhZGVycyxyLCEwKSxvPSJmYWxzZSI9PT10LmdldERhdGEocyxhLCJzb3J0ZXIiKXx8ImZhbHNlIj09PXQuZ2V0RGF0YShzLGEsInBhcnNlciIpLHQuc2V0Q29sdW1uU29ydChlLHMsbyl9LHNldENvbHVtblNvcnQ6ZnVuY3Rpb24oZSx0LHIpe3ZhciBvPWUudGFibGUuaWQ7dFswXS5zb3J0RGlzYWJsZWQ9cix0W3I/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgic29ydGVyLWZhbHNlIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsIiIrciksZS50YWJJbmRleCYmKHI/dC5yZW1vdmVBdHRyKCJ0YWJpbmRleCIpOnQuYXR0cigidGFiaW5kZXgiLCIwIikpLG8mJihyP3QucmVtb3ZlQXR0cigiYXJpYS1jb250cm9scyIpOnQuYXR0cigiYXJpYS1jb250cm9scyIsbykpfSx1cGRhdGVIZWFkZXJTb3J0Q291bnQ6ZnVuY3Rpb24ocixvKXt2YXIgcyxhLG4saSxsLGQsYyxnLHA9b3x8ci5zb3J0TGlzdCx1PXAubGVuZ3RoO2ZvcihyLnNvcnRMaXN0PVtdLGk9MDtpPHU7aSsrKWlmKGM9cFtpXSwocz1wYXJzZUludChjWzBdLDEwKSk8ci5jb2x1bW5zKXtzd2l0Y2goci5zb3J0VmFyc1tzXS5vcmRlcnx8KGc9dC5nZXRPcmRlcihyLnNvcnRJbml0aWFsT3JkZXIpP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxyLnNvcnRWYXJzW3NdLm9yZGVyPWcsci5zb3J0VmFyc1tzXS5jb3VudD0wKSxnPXIuc29ydFZhcnNbc10ub3JkZXIsYT0oIiIrY1sxXSkubWF0Y2goL14oMXxkfHN8b3xuKS8pLGE9YT9hWzBdOiIiKXtjYXNlIjEiOmNhc2UiZCI6YT0xO2JyZWFrO2Nhc2UicyI6YT1sfHwwO2JyZWFrO2Nhc2UibyI6YT0wPT09KGQ9Z1sobHx8MCklZy5sZW5ndGhdKT8xOjE9PT1kPzA6MjticmVhaztjYXNlIm4iOmE9Z1srK3Iuc29ydFZhcnNbc10uY291bnQlZy5sZW5ndGhdO2JyZWFrO2RlZmF1bHQ6YT0wfWw9MD09PWk/YTpsLG49W3MscGFyc2VJbnQoYSwxMCl8fDBdLHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPW4sYT1lLmluQXJyYXkoblsxXSxnKSxyLnNvcnRWYXJzW3NdLmNvdW50PWE+PTA/YTpuWzFdJWcubGVuZ3RofX0sdXBkYXRlQWxsOmZ1bmN0aW9uKGUscixvKXt2YXIgcz1lLnRhYmxlO3MuaXNVcGRhdGluZz0hMCx0LnJlZnJlc2hXaWRnZXRzKHMsITAsITApLHQuYnVpbGRIZWFkZXJzKGUpLHQuYmluZEV2ZW50cyhzLGUuJGhlYWRlcnMsITApLHQuYmluZE1ldGhvZHMoZSksdC5jb21tb25VcGRhdGUoZSxyLG8pfSx1cGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UudGFibGUuaXNVcGRhdGluZz0hMCx0LnVwZGF0ZUhlYWRlcihlKSx0LmNvbW1vblVwZGF0ZShlLHIsbyl9LHVwZGF0ZUhlYWRlcnM6ZnVuY3Rpb24oZSxyKXtlLnRhYmxlLmlzVXBkYXRpbmc9ITAsdC5idWlsZEhlYWRlcnMoZSksdC5iaW5kRXZlbnRzKGUudGFibGUsZS4kaGVhZGVycywhMCksdC5yZXNvcnRDb21wbGV0ZShlLHIpfSx1cGRhdGVDZWxsOmZ1bmN0aW9uKHIsbyxzLGEpe2lmKGUobykuY2xvc2VzdCgidHIiKS5oYXNDbGFzcyhyLmNzc0NoaWxkUm93KSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ1cGRhdGVDZWxsIiBmb3IgY2hpbGQgcm93IGNvbnRlbnQgaGFzIGJlZW4gZGlzYWJsZWQsIHVzZSAidXBkYXRlIiBpbnN0ZWFkJyk7ZWxzZXtpZih0LmlzRW1wdHlPYmplY3Qoci5jYWNoZSkpcmV0dXJuIHQudXBkYXRlSGVhZGVyKHIpLHZvaWQgdC5jb21tb25VcGRhdGUocixzLGEpO3IudGFibGUuaXNVcGRhdGluZz0hMCxyLiR0YWJsZS5maW5kKHIuc2VsZWN0b3JSZW1vdmUpLnJlbW92ZSgpO3ZhciBuLGksbCxkLGMsZyxwPXIuJHRib2RpZXMsdT1lKG8pLGY9cC5pbmRleCh0LmdldENsb3Nlc3QodSwidGJvZHkiKSksaD1yLmNhY2hlW2ZdLG09dC5nZXRDbG9zZXN0KHUsInRyIik7aWYobz11WzBdLHAubGVuZ3RoJiZmPj0wKXtpZihsPXAuZXEoZikuZmluZCgidHIiKS5ub3QoIi4iK3IuY3NzQ2hpbGRSb3cpLmluZGV4KG0pLGM9aC5ub3JtYWxpemVkW2xdLChnPW1bMF0uY2VsbHMubGVuZ3RoKSE9PXIuY29sdW1ucylmb3IoZD0wLG49ITEsaT0wO2k8ZztpKyspbnx8bVswXS5jZWxsc1tpXT09PW8/bj0hMDpkKz1tWzBdLmNlbGxzW2ldLmNvbFNwYW47ZWxzZSBkPXUuaW5kZXgoKTtuPXQuZ2V0RWxlbWVudFRleHQocixvLGQpLGNbci5jb2x1bW5zXS5yYXdbZF09bixuPXQuZ2V0UGFyc2VkVGV4dChyLG8sZCxuKSxjW2RdPW4sIm51bWVyaWMiPT09KHIucGFyc2Vyc1tkXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKGguY29sTWF4W2RdPU1hdGgubWF4KE1hdGguYWJzKG4pfHwwLGguY29sTWF4W2RdfHwwKSksITEhPT0obj0idW5kZWZpbmVkIiE9PXM/czpyLnJlc29ydCk/dC5jaGVja1Jlc29ydChyLG4sYSk6dC5yZXNvcnRDb21wbGV0ZShyLGEpfWVsc2UgdC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUuZXJyb3IoInVwZGF0ZUNlbGwgYWJvcnRlZCwgdGJvZHkgbWlzc2luZyBvciBub3Qgd2l0aGluIHRoZSBpbmRpY2F0ZWQgdGFibGUiKSxyLnRhYmxlLmlzVXBkYXRpbmc9ITF9fSxhZGRSb3dzOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG0sYix5LHc9InN0cmluZyI9PXR5cGVvZiBvJiYxPT09ci4kdGJvZGllcy5sZW5ndGgmJi88dHIvLnRlc3Qob3x8IiIpLHg9ci50YWJsZTtpZih3KW89ZShvKSxyLiR0Ym9kaWVzLmFwcGVuZChvKTtlbHNlIGlmKCEobyYmbyBpbnN0YW5jZW9mIGUmJnQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpWzBdPT09ci50YWJsZSkpcmV0dXJuIHQuZGVidWcociwiY29yZSIpJiZjb25zb2xlLmVycm9yKCJhZGRSb3dzIG1ldGhvZCByZXF1aXJlcyAoMSkgYSBqUXVlcnkgc2VsZWN0b3IgcmVmZXJlbmNlIHRvIHJvd3MgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgdGFibGUsIG9yICgyKSByb3cgSFRNTCBzdHJpbmcgdG8gYmUgYWRkZWQgdG8gYSB0YWJsZSB3aXRoIG9ubHkgb25lIHRib2R5IiksITE7aWYoeC5pc1VwZGF0aW5nPSEwLHQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSl0LnVwZGF0ZUhlYWRlcihyKSx0LmNvbW1vblVwZGF0ZShyLHMsYSk7ZWxzZXtmb3IoYz1vLmZpbHRlcigidHIiKS5hdHRyKCJyb2xlIiwicm93IikubGVuZ3RoLGw9ci4kdGJvZGllcy5pbmRleChvLnBhcmVudHMoInRib2R5IikuZmlsdGVyKCI6Zmlyc3QiKSksci5wYXJzZXJzJiZyLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhyKSxkPTA7ZDxjO2QrKyl7Zm9yKGY9MCxwPW9bZF0uY2VsbHMubGVuZ3RoLHU9ci5jYWNoZVtsXS5ub3JtYWxpemVkLmxlbmd0aCxtPVtdLGg9e2NoaWxkOltdLHJhdzpbXSwkcm93Om8uZXEoZCksb3JkZXI6dX0sZz0wO2c8cDtnKyspYj1vW2RdLmNlbGxzW2ddLG49dC5nZXRFbGVtZW50VGV4dChyLGIsZiksaC5yYXdbZl09bixpPXQuZ2V0UGFyc2VkVGV4dChyLGIsZixuKSxtW2ZdPWksIm51bWVyaWMiPT09KHIucGFyc2Vyc1tmXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKHIuY2FjaGVbbF0uY29sTWF4W2ZdPU1hdGgubWF4KE1hdGguYWJzKGkpfHwwLHIuY2FjaGVbbF0uY29sTWF4W2ZdfHwwKSksKHk9Yi5jb2xTcGFuLTEpPjAmJihmKz15KSxmKys7bVtyLmNvbHVtbnNdPWgsci5jYWNoZVtsXS5ub3JtYWxpemVkW3VdPW19dC5jaGVja1Jlc29ydChyLHMsYSl9fSx1cGRhdGVDYWNoZTpmdW5jdGlvbihlLHIsbyl7ZS5wYXJzZXJzJiZlLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhlLG8pLHQuYnVpbGRDYWNoZShlLHIsbyl9LGFwcGVuZENhY2hlOmZ1bmN0aW9uKGUscil7dmFyIG8scyxhLG4saSxsLGQsYz1lLnRhYmxlLGc9ZS4kdGJvZGllcyxwPVtdLHU9ZS5jYWNoZTtpZih0LmlzRW1wdHlPYmplY3QodSkpcmV0dXJuIGUuYXBwZW5kZXI/ZS5hcHBlbmRlcihjLHApOmMuaXNVcGRhdGluZz9lLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpOiIiO2Zvcih0LmRlYnVnKGUsImNvcmUiKSYmKGQ9bmV3IERhdGUpLGw9MDtsPGcubGVuZ3RoO2wrKylpZigoYT1nLmVxKGwpKS5sZW5ndGgpe2ZvcihuPXQucHJvY2Vzc1Rib2R5KGMsYSwhMCkscz0obz11W2xdLm5vcm1hbGl6ZWQpLmxlbmd0aCxpPTA7aTxzO2krKylwW3AubGVuZ3RoXT1vW2ldW2UuY29sdW1uc10uJHJvdyxlLmFwcGVuZGVyJiYoIWUucGFnZXJ8fGUucGFnZXIucmVtb3ZlUm93c3x8ZS5wYWdlci5hamF4KXx8bi5hcHBlbmQob1tpXVtlLmNvbHVtbnNdLiRyb3cpO3QucHJvY2Vzc1Rib2R5KGMsbiwhMSl9ZS5hcHBlbmRlciYmZS5hcHBlbmRlcihjLHApLHQuZGVidWcoZSwiY29yZSIpJiZjb25zb2xlLmxvZygiUmVidWlsdCB0YWJsZSIrdC5iZW5jaG1hcmsoZCkpLHJ8fGUuYXBwZW5kZXJ8fHQuYXBwbHlXaWRnZXQoYyksYy5pc1VwZGF0aW5nJiZlLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpfSxjb21tb25VcGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UuJHRhYmxlLmZpbmQoZS5zZWxlY3RvclJlbW92ZSkucmVtb3ZlKCksdC5zZXR1cFBhcnNlcnMoZSksdC5idWlsZENhY2hlKGUpLHQuY2hlY2tSZXNvcnQoZSxyLG8pfSxpbml0U29ydDpmdW5jdGlvbihyLG8scyl7aWYoci50YWJsZS5pc1VwZGF0aW5nKXJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0U29ydChyLG8scyl9LDUwKTt2YXIgYSxuLGksbCxkLGMsZyxwPSFzW3Iuc29ydE11bHRpU29ydEtleV0sdT1yLnRhYmxlLGY9ci4kaGVhZGVycy5sZW5ndGgsaD10LmdldENsb3Nlc3QoZShvKSwidGgsIHRkIiksbT1wYXJzZUludChoLmF0dHIoImRhdGEtY29sdW1uIiksMTApLGI9ci5zb3J0VmFyc1ttXS5vcmRlcjtpZihoPWhbMF0sci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsdSksYz0oci5zb3J0VmFyc1ttXS5jb3VudCsxKSViLmxlbmd0aCxyLnNvcnRWYXJzW21dLmNvdW50PXNbci5zb3J0UmVzZXRLZXldPzI6YyxyLnNvcnRSZXN0YXJ0KWZvcihpPTA7aTxmO2krKylnPXIuJGhlYWRlcnMuZXEoaSksbSE9PShjPXBhcnNlSW50KGcuYXR0cigiZGF0YS1jb2x1bW4iKSwxMCkpJiYocHx8Zy5oYXNDbGFzcyh0LmNzcy5zb3J0Tm9uZSkpJiYoci5zb3J0VmFyc1tjXS5jb3VudD0tMSk7aWYocCl7aWYoci5zb3J0TGlzdD1bXSxyLmxhc3Quc29ydExpc3Q9W10sbnVsbCE9PXIuc29ydEZvcmNlKWZvcihhPXIuc29ydEZvcmNlLG49MDtuPGEubGVuZ3RoO24rKylhW25dWzBdIT09bSYmKHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPWFbbl0pO2lmKChsPWJbci5zb3J0VmFyc1ttXS5jb3VudF0pPDImJihyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1bbSxsXSxoLmNvbFNwYW4+MSkpZm9yKG49MTtuPGguY29sU3BhbjtuKyspci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20rbixsXSxyLnNvcnRWYXJzW20rbl0uY291bnQ9ZS5pbkFycmF5KGwsYil9ZWxzZSBpZihyLnNvcnRMaXN0PWUuZXh0ZW5kKFtdLHIubGFzdC5zb3J0TGlzdCksdC5pc1ZhbHVlSW5BcnJheShtLHIuc29ydExpc3QpPj0wKWZvcihuPTA7bjxyLnNvcnRMaXN0Lmxlbmd0aDtuKyspKGM9ci5zb3J0TGlzdFtuXSlbMF09PT1tJiYoY1sxXT1iW3Iuc29ydFZhcnNbbV0uY291bnRdLDI9PT1jWzFdJiYoci5zb3J0TGlzdC5zcGxpY2UobiwxKSxyLnNvcnRWYXJzW21dLmNvdW50PS0xKSk7ZWxzZSBpZigobD1iW3Iuc29ydFZhcnNbbV0uY291bnRdKTwyJiYoci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20sbF0saC5jb2xTcGFuPjEpKWZvcihuPTE7bjxoLmNvbFNwYW47bisrKXIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVttK24sbF0sci5zb3J0VmFyc1ttK25dLmNvdW50PWUuaW5BcnJheShsLGIpO2lmKHIubGFzdC5zb3J0TGlzdD1lLmV4dGVuZChbXSxyLnNvcnRMaXN0KSxyLnNvcnRMaXN0Lmxlbmd0aCYmci5zb3J0QXBwZW5kJiYoYT1lLmlzQXJyYXkoci5zb3J0QXBwZW5kKT9yLnNvcnRBcHBlbmQ6ci5zb3J0QXBwZW5kW3Iuc29ydExpc3RbMF1bMF1dLCF0LmlzRW1wdHlPYmplY3QoYSkpKWZvcihuPTA7bjxhLmxlbmd0aDtuKyspaWYoYVtuXVswXSE9PW0mJnQuaXNWYWx1ZUluQXJyYXkoYVtuXVswXSxyLnNvcnRMaXN0KTwwKXtpZihsPWFbbl1bMV0sZD0oIiIrbCkubWF0Y2goL14oYXxkfHN8b3xuKS8pKXN3aXRjaChjPXIuc29ydExpc3RbMF1bMV0sZFswXSl7Y2FzZSJkIjpsPTE7YnJlYWs7Y2FzZSJzIjpsPWM7YnJlYWs7Y2FzZSJvIjpsPTA9PT1jPzE6MDticmVhaztjYXNlIm4iOmw9KGMrMSklYi5sZW5ndGg7YnJlYWs7ZGVmYXVsdDpsPTB9ci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W2Fbbl1bMF0sbF19ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRCZWdpbiIsdSksc2V0VGltZW91dChmdW5jdGlvbigpe3Quc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVmb3JlRW5kIix1KSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEVuZCIsdSl9LDEpfSxtdWx0aXNvcnQ6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9W10sbD0wLGQ9ZS50ZXh0U29ydGVyfHwiIixjPWUuc29ydExpc3QsZz1jLmxlbmd0aCxwPWUuJHRib2RpZXMubGVuZ3RoO2lmKCFlLnNlcnZlclNpZGVTb3J0aW5nJiYhdC5pc0VtcHR5T2JqZWN0KGUuY2FjaGUpKXtpZih0LmRlYnVnKGUsImNvcmUiKSYmKG89bmV3IERhdGUpLCJvYmplY3QiPT10eXBlb2YgZClmb3Iocz1lLmNvbHVtbnM7cy0tOykiZnVuY3Rpb24iPT10eXBlb2YoYT10LmdldENvbHVtbkRhdGEobixkLHMpKSYmKGlbc109YSk7Zm9yKHI9MDtyPHA7cisrKXM9ZS5jYWNoZVtyXS5jb2xNYXgsZS5jYWNoZVtyXS5ub3JtYWxpemVkLnNvcnQoZnVuY3Rpb24ocixvKXt2YXIgYSxwLHUsZixoLG0sYjtmb3IoYT0wO2E8ZzthKyspe2lmKHU9Y1thXVswXSxmPWNbYV1bMV0sbD0wPT09ZixlLnNvcnRTdGFibGUmJnJbdV09PT1vW3VdJiYxPT09ZylyZXR1cm4gcltlLmNvbHVtbnNdLm9yZGVyLW9bZS5jb2x1bW5zXS5vcmRlcjtpZihwPS9uL2kudGVzdCh0LmdldFNvcnRUeXBlKGUucGFyc2Vycyx1KSkscCYmZS5zdHJpbmdzW3VdPyhwPSJib29sZWFuIj09dHlwZW9mIHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/KGw/MTotMSkqKHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/LTE6MSk6ZS5zdHJpbmdzW3VdP3Quc3RyaW5nW2Uuc3RyaW5nc1t1XV18fDA6MCxoPWUubnVtYmVyU29ydGVyP2UubnVtYmVyU29ydGVyKHJbdV0sb1t1XSxsLHNbdV0sbik6dFsic29ydE51bWVyaWMiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSxwLHNbdV0sdSxlKSk6KG09bD9yOm8sYj1sP286cixoPSJmdW5jdGlvbiI9PXR5cGVvZiBkP2QobVt1XSxiW3VdLGwsdSxuKToiZnVuY3Rpb24iPT10eXBlb2YgaVt1XT9pW3VdKG1bdV0sYlt1XSxsLHUsbik6dFsic29ydE5hdHVyYWwiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSx1LGUpKSxoKXJldHVybiBofXJldHVybiByW2UuY29sdW1uc10ub3JkZXItb1tlLmNvbHVtbnNdLm9yZGVyfSk7dC5kZWJ1ZyhlLCJjb3JlIikmJmNvbnNvbGUubG9nKCJBcHBseWluZyBzb3J0ICIrYy50b1N0cmluZygpK3QuYmVuY2htYXJrKG8pKX19LHJlc29ydENvbXBsZXRlOmZ1bmN0aW9uKHQscil7dC50YWJsZS5pc1VwZGF0aW5nJiZ0LiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLHQudGFibGUpLGUuaXNGdW5jdGlvbihyKSYmcih0LnRhYmxlKX0sY2hlY2tSZXNvcnQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhPWUuaXNBcnJheShvKT9vOnIuc29ydExpc3Q7ITE9PT0odm9pZCAwPT09bz9yLnJlc29ydDpvKXx8ci5zZXJ2ZXJTaWRlU29ydGluZ3x8ci50YWJsZS5pc1Byb2Nlc3Npbmc/KHQucmVzb3J0Q29tcGxldGUocixzKSx0LmFwcGx5V2lkZ2V0KHIudGFibGUsITEpKTphLmxlbmd0aD90LnNvcnRPbihyLGEsZnVuY3Rpb24oKXt0LnJlc29ydENvbXBsZXRlKHIscyl9LCEwKTp0LnNvcnRSZXNldChyLGZ1bmN0aW9uKCl7dC5yZXNvcnRDb21wbGV0ZShyLHMpLHQuYXBwbHlXaWRnZXQoci50YWJsZSwhMSl9KX0sc29ydE9uOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuPXIudGFibGU7ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsbiksdC51cGRhdGVIZWFkZXJTb3J0Q291bnQocixvKSx0LnNldEhlYWRlcnNDc3Mociksci5kZWxheUluaXQmJnQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSYmdC5idWlsZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVnaW4iLG4pLHQubXVsdGlzb3J0KHIpLHQuYXBwZW5kQ2FjaGUocixhKSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEJlZm9yZUVuZCIsbiksci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRFbmQiLG4pLHQuYXBwbHlXaWRnZXQobiksZS5pc0Z1bmN0aW9uKHMpJiZzKG4pfSxzb3J0UmVzZXQ6ZnVuY3Rpb24ocixvKXtyLnNvcnRMaXN0PVtdLHQuc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpO3ZhciBzO2ZvcihzPTA7czxyLmNvbHVtbnM7cysrKXIuc29ydFZhcnNbc10uY291bnQ9LTE7ZS5pc0Z1bmN0aW9uKG8pJiZvKHIudGFibGUpfSxnZXRTb3J0VHlwZTpmdW5jdGlvbihlLHQpe3JldHVybiBlJiZlW3RdP2VbdF0udHlwZXx8IiI6IiJ9LGdldE9yZGVyOmZ1bmN0aW9uKGUpe3JldHVybi9eZC9pLnRlc3QoZSl8fDE9PT1lfSxzb3J0TmF0dXJhbDpmdW5jdGlvbihlLHIpe2lmKGU9PT1yKXJldHVybiAwO2U9ZS50b1N0cmluZygpLHI9ci50b1N0cmluZygpO3ZhciBvLHMsYSxuLGksbCxkPXQucmVnZXg7aWYoZC5oZXgudGVzdChyKSl7aWYobz1wYXJzZUludCgoZXx8IiIpLm1hdGNoKGQuaGV4KSwxNikscz1wYXJzZUludCgocnx8IiIpLm1hdGNoKGQuaGV4KSwxNiksbzxzKXJldHVybi0xO2lmKG8+cylyZXR1cm4gMX1mb3Iobz0oZXx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIikscz0ocnx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIiksbD1NYXRoLm1heChvLmxlbmd0aCxzLmxlbmd0aCksaT0wO2k8bDtpKyspe2lmKGE9aXNOYU4ob1tpXSk/b1tpXXx8MDpwYXJzZUZsb2F0KG9baV0pfHwwLG49aXNOYU4oc1tpXSk/c1tpXXx8MDpwYXJzZUZsb2F0KHNbaV0pfHwwLGlzTmFOKGEpIT09aXNOYU4obikpcmV0dXJuIGlzTmFOKGEpPzE6LTE7aWYodHlwZW9mIGEhPXR5cGVvZiBuJiYoYSs9IiIsbis9IiIpLGE8bilyZXR1cm4tMTtpZihhPm4pcmV0dXJuIDF9cmV0dXJuIDB9LHNvcnROYXR1cmFsQXNjOmZ1bmN0aW9uKGUscixvLHMpe2lmKGU9PT1yKXJldHVybiAwO3ZhciBhPXQuc3RyaW5nW3MuZW1wdGllc1tvXXx8cy5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8tMToxOi1hfHwtMToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOmF8fDE6dC5zb3J0TmF0dXJhbChlLHIpfSxzb3J0TmF0dXJhbERlc2M6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGE9dC5zdHJpbmdbcy5lbXB0aWVzW29dfHxzLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWE/ImJvb2xlYW4iPT10eXBlb2YgYT9hPy0xOjE6YXx8MToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOi1hfHwtMTp0LnNvcnROYXR1cmFsKHIsZSl9LHNvcnRUZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+dD8xOmU8dD8tMTowfSxnZXRUZXh0VmFsdWU6ZnVuY3Rpb24oZSx0LHIpe2lmKHIpe3ZhciBvLHM9ZT9lLmxlbmd0aDowLGE9cit0O2ZvcihvPTA7bzxzO28rKylhKz1lLmNoYXJDb2RlQXQobyk7cmV0dXJuIHQqYX1yZXR1cm4gMH0sc29ydE51bWVyaWNBc2M6ZnVuY3Rpb24oZSxyLG8scyxhLG4pe2lmKGU9PT1yKXJldHVybiAwO3ZhciBpPXQuc3RyaW5nW24uZW1wdGllc1thXXx8bi5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8tMToxOi1pfHwtMToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOml8fDE6KGlzTmFOKGUpJiYoZT10LmdldFRleHRWYWx1ZShlLG8scykpLGlzTmFOKHIpJiYocj10LmdldFRleHRWYWx1ZShyLG8scykpLGUtcil9LHNvcnROdW1lcmljRGVzYzpmdW5jdGlvbihlLHIsbyxzLGEsbil7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGk9dC5zdHJpbmdbbi5lbXB0aWVzW2FdfHxuLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWk/ImJvb2xlYW4iPT10eXBlb2YgaT9pPy0xOjE6aXx8MToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOi1pfHwtMTooaXNOYU4oZSkmJihlPXQuZ2V0VGV4dFZhbHVlKGUsbyxzKSksaXNOYU4ocikmJihyPXQuZ2V0VGV4dFZhbHVlKHIsbyxzKSksci1lKX0sc29ydE51bWVyaWM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS10fSxhZGRXaWRnZXQ6ZnVuY3Rpb24oZSl7ZS5pZCYmIXQuaXNFbXB0eU9iamVjdCh0LmdldFdpZGdldEJ5SWQoZS5pZCkpJiZjb25zb2xlLndhcm4oJyInK2UuaWQrJyIgd2lkZ2V0IHdhcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UhJyksdC53aWRnZXRzW3Qud2lkZ2V0cy5sZW5ndGhdPWV9LGhhc1dpZGdldDpmdW5jdGlvbih0LHIpe3JldHVybih0PWUodCkpLmxlbmd0aCYmdFswXS5jb25maWcmJnRbMF0uY29uZmlnLndpZGdldEluaXRbcl18fCExfSxnZXRXaWRnZXRCeUlkOmZ1bmN0aW9uKGUpe3ZhciByLG8scz10LndpZGdldHMubGVuZ3RoO2ZvcihyPTA7cjxzO3IrKylpZigobz10LndpZGdldHNbcl0pJiZvLmlkJiZvLmlkLnRvTG93ZXJDYXNlKCk9PT1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIG99LGFwcGx5V2lkZ2V0T3B0aW9uczpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbj1yLmNvbmZpZyxpPW4ud2lkZ2V0cy5sZW5ndGg7aWYoaSlmb3Iobz0wO288aTtvKyspKHM9dC5nZXRXaWRnZXRCeUlkKG4ud2lkZ2V0c1tvXSkpJiZzLm9wdGlvbnMmJihhPWUuZXh0ZW5kKCEwLHt9LHMub3B0aW9ucyksbi53aWRnZXRPcHRpb25zPWUuZXh0ZW5kKCEwLGEsbi53aWRnZXRPcHRpb25zKSxlLmV4dGVuZCghMCx0LmRlZmF1bHRzLndpZGdldE9wdGlvbnMscy5vcHRpb25zKSl9LGFkZFdpZGdldEZyb21DbGFzczpmdW5jdGlvbihlKXt2YXIgcixvLHM9ZS5jb25maWcsYT0iXiIrcy53aWRnZXRDbGFzcy5yZXBsYWNlKHQucmVnZXgudGVtcGxhdGVOYW1lLCIoXFxTKykrIikrIiQiLG49bmV3IFJlZ0V4cChhLCJnIiksaT0oZS5jbGFzc05hbWV8fCIiKS5zcGxpdCh0LnJlZ2V4LnNwYWNlcyk7aWYoaS5sZW5ndGgpZm9yKHI9aS5sZW5ndGgsbz0wO288cjtvKyspaVtvXS5tYXRjaChuKSYmKHMud2lkZ2V0c1tzLndpZGdldHMubGVuZ3RoXT1pW29dLnJlcGxhY2UobiwiJDEiKSl9LGFwcGx5V2lkZ2V0SWQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsPShyPWUocilbMF0pLmNvbmZpZyxkPWwud2lkZ2V0T3B0aW9ucyxjPXQuZGVidWcobCwiY29yZSIpLGc9dC5nZXRXaWRnZXRCeUlkKG8pO2cmJihpPWcuaWQsYT0hMSxlLmluQXJyYXkoaSxsLndpZGdldHMpPDAmJihsLndpZGdldHNbbC53aWRnZXRzLmxlbmd0aF09aSksYyYmKG49bmV3IERhdGUpLCFzJiZsLndpZGdldEluaXRbaV18fChsLndpZGdldEluaXRbaV09ITAsci5oYXNJbml0aWFsaXplZCYmdC5hcHBseVdpZGdldE9wdGlvbnMociksImZ1bmN0aW9uIj09dHlwZW9mIGcuaW5pdCYmKGE9ITAsYyYmY29uc29sZVtjb25zb2xlLmdyb3VwPyJncm91cCI6ImxvZyJdKCJJbml0aWFsaXppbmcgIitpKyIgd2lkZ2V0IiksZy5pbml0KHIsZyxsLGQpKSksc3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGcuZm9ybWF0fHwoYT0hMCxjJiZjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIlVwZGF0aW5nICIraSsiIHdpZGdldCIpLGcuZm9ybWF0KHIsbCxkLCExKSksYyYmYSYmKGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisocz8iaW5pdGlhbGl6aW5nICI6ImFwcGx5aW5nICIpK2krIiB3aWRnZXQiK3QuYmVuY2htYXJrKG4pKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpKX0sYXBwbHlXaWRnZXQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYz0ocj1lKHIpWzBdKS5jb25maWcsZz10LmRlYnVnKGMsImNvcmUiKSxwPVtdO2lmKCExPT09b3x8IXIuaGFzSW5pdGlhbGl6ZWR8fCFyLmlzQXBwbHlpbmdXaWRnZXRzJiYhci5pc1VwZGF0aW5nKXtpZihnJiYoZD1uZXcgRGF0ZSksdC5hZGRXaWRnZXRGcm9tQ2xhc3MociksY2xlYXJUaW1lb3V0KGMudGltZXJSZWFkeSksYy53aWRnZXRzLmxlbmd0aCl7Zm9yKHIuaXNBcHBseWluZ1dpZGdldHM9ITAsYy53aWRnZXRzPWUuZ3JlcChjLndpZGdldHMsZnVuY3Rpb24odCxyKXtyZXR1cm4gZS5pbkFycmF5KHQsYy53aWRnZXRzKT09PXJ9KSxuPShpPWMud2lkZ2V0c3x8W10pLmxlbmd0aCxhPTA7YTxuO2ErKykobD10LmdldFdpZGdldEJ5SWQoaVthXSkpJiZsLmlkPyhsLnByaW9yaXR5fHwobC5wcmlvcml0eT0xMCkscFthXT1sKTpnJiZjb25zb2xlLndhcm4oJyInK2lbYV0rJyIgd2FzIGVuYWJsZWQsIGJ1dCB0aGUgd2lkZ2V0IGNvZGUgaGFzIG5vdCBiZWVuIGxvYWRlZCEnKTtmb3IocC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucHJpb3JpdHk8dC5wcmlvcml0eT8tMTplLnByaW9yaXR5PT09dC5wcmlvcml0eT8wOjF9KSxuPXAubGVuZ3RoLGcmJmNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiU3RhcnQgIisobz8iaW5pdGlhbGl6aW5nIjoiYXBwbHlpbmciKSsiIHdpZGdldHMiKSxhPTA7YTxuO2ErKykobD1wW2FdKSYmbC5pZCYmdC5hcHBseVdpZGdldElkKHIsbC5pZCxvKTtnJiZjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9Yy50aW1lclJlYWR5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmlzQXBwbHlpbmdXaWRnZXRzPSExLGUuZGF0YShyLCJsYXN0V2lkZ2V0QXBwbGljYXRpb24iLG5ldyBEYXRlKSxjLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidGFibGVzb3J0ZXItcmVhZHkiKSxvfHwiZnVuY3Rpb24iIT10eXBlb2Ygc3x8cyhyKSxnJiYobD1jLndpZGdldHMubGVuZ3RoLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisoITA9PT1vPyJpbml0aWFsaXppbmcgIjoiYXBwbHlpbmcgIikrbCsiIHdpZGdldCIrKDEhPT1sPyJzIjoiIikrdC5iZW5jaG1hcmsoZCkpKX0sMTApfX0scmVtb3ZlV2lkZ2V0OmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbCxkPShyPWUocilbMF0pLmNvbmZpZztpZighMD09PW8pZm9yKG89W10sbD10LndpZGdldHMubGVuZ3RoLGk9MDtpPGw7aSsrKShuPXQud2lkZ2V0c1tpXSkmJm4uaWQmJihvW28ubGVuZ3RoXT1uLmlkKTtlbHNlIG89KGUuaXNBcnJheShvKT9vLmpvaW4oIiwiKTpvfHwiIikudG9Mb3dlckNhc2UoKS5zcGxpdCgvW1xzLF0rLyk7Zm9yKGw9by5sZW5ndGgsYT0wO2E8bDthKyspbj10LmdldFdpZGdldEJ5SWQob1thXSksKGk9ZS5pbkFycmF5KG9bYV0sZC53aWRnZXRzKSk+PTAmJiEwIT09cyYmZC53aWRnZXRzLnNwbGljZShpLDEpLG4mJm4ucmVtb3ZlJiYodC5kZWJ1ZyhkLCJjb3JlIikmJmNvbnNvbGUubG9nKChzPyJSZWZyZXNoaW5nIjoiUmVtb3ZpbmciKSsnICInK29bYV0rJyIgd2lkZ2V0Jyksbi5yZW1vdmUocixkLGQud2lkZ2V0T3B0aW9ucyxzKSxkLndpZGdldEluaXRbb1thXV09ITEpO2QuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJ3aWRnZXRSZW1vdmVFbmQiLHIpfSxyZWZyZXNoV2lkZ2V0czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbixpPShyPWUocilbMF0pLmNvbmZpZy53aWRnZXRzLGw9dC53aWRnZXRzLGQ9bC5sZW5ndGgsYz1bXSxnPWZ1bmN0aW9uKHQpe2UodCkudHJpZ2dlckhhbmRsZXIoInJlZnJlc2hDb21wbGV0ZSIpfTtmb3IoYT0wO2E8ZDthKyspKG49bFthXSkmJm4uaWQmJihvfHxlLmluQXJyYXkobi5pZCxpKTwwKSYmKGNbYy5sZW5ndGhdPW4uaWQpO3QucmVtb3ZlV2lkZ2V0KHIsYy5qb2luKCIsIiksITApLCEwIT09cz8odC5hcHBseVdpZGdldChyLG98fCExLGcpLG8mJnQuYXBwbHlXaWRnZXQociwhMSxnKSk6ZyhyKX0sYmVuY2htYXJrOmZ1bmN0aW9uKGUpe3JldHVybiIgKCIrKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWUuZ2V0VGltZSgpKSsiIG1zKSJ9LGxvZzpmdW5jdGlvbigpe2NvbnNvbGUubG9nKGFyZ3VtZW50cyl9LGRlYnVnOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJighMD09PWUuZGVidWd8fCJzdHJpbmciPT10eXBlb2YgZS5kZWJ1ZyYmZS5kZWJ1Zy5pbmRleE9mKHQpPi0xKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0saXNWYWx1ZUluQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgcixvPXQmJnQubGVuZ3RofHwwO2ZvcihyPTA7cjxvO3IrKylpZih0W3JdWzBdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX0sZm9ybWF0RmxvYXQ6ZnVuY3Rpb24ocixvKXtpZigic3RyaW5nIiE9dHlwZW9mIHJ8fCIiPT09cilyZXR1cm4gcjt2YXIgcztyZXR1cm4gcj0obyYmby5jb25maWc/ITEhPT1vLmNvbmZpZy51c051bWJlckZvcm1hdDp2b2lkIDA9PT1vfHxvKT9yLnJlcGxhY2UodC5yZWdleC5jb21tYSwiIik6ci5yZXBsYWNlKHQucmVnZXguZGlnaXROb25VUywiIikucmVwbGFjZSh0LnJlZ2V4LmNvbW1hLCIuIiksdC5yZWdleC5kaWdpdE5lZ2F0aXZlVGVzdC50ZXN0KHIpJiYocj1yLnJlcGxhY2UodC5yZWdleC5kaWdpdE5lZ2F0aXZlUmVwbGFjZSwiLSQxIikpLHM9cGFyc2VGbG9hdChyKSxpc05hTihzKT9lLnRyaW0ocik6c30saXNEaWdpdDpmdW5jdGlvbihlKXtyZXR1cm4gaXNOYU4oZSk/dC5yZWdleC5kaWdpdFRlc3QudGVzdChlLnRvU3RyaW5nKCkucmVwbGFjZSh0LnJlZ2V4LmRpZ2l0UmVwbGFjZSwiIikpOiIiIT09ZX0sY29tcHV0ZUNvbHVtbkluZGV4OmZ1bmN0aW9uKHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZyxwLHUsZj1vJiZvLmNvbHVtbnN8fDAsaD1bXSxtPW5ldyBBcnJheShmKTtmb3Iocz0wO3M8ci5sZW5ndGg7cysrKWZvcihkPXJbc10uY2VsbHMsYT0wO2E8ZC5sZW5ndGg7YSsrKXtmb3IoYz1zLGc9KGw9ZFthXSkucm93U3Bhbnx8MSxwPWwuY29sU3Bhbnx8MSx2b2lkIDA9PT1oW2NdJiYoaFtjXT1bXSksbj0wO248aFtjXS5sZW5ndGgrMTtuKyspaWYodm9pZCAwPT09aFtjXVtuXSl7dT1uO2JyZWFrfWZvcihmJiZsLmNlbGxJbmRleD09PXV8fChsLnNldEF0dHJpYnV0ZT9sLnNldEF0dHJpYnV0ZSgiZGF0YS1jb2x1bW4iLHUpOmUobCkuYXR0cigiZGF0YS1jb2x1bW4iLHUpKSxuPWM7bjxjK2c7bisrKWZvcih2b2lkIDA9PT1oW25dJiYoaFtuXT1bXSksbT1oW25dLGk9dTtpPHUrcDtpKyspbVtpXT0ieCJ9cmV0dXJuIHQuY2hlY2tDb2x1bW5Db3VudChyLGgsbS5sZW5ndGgpLG0ubGVuZ3RofSxjaGVja0NvbHVtbkNvdW50OmZ1bmN0aW9uKGUsdCxyKXt2YXIgbyxzLGE9ITAsbj1bXTtmb3Iobz0wO288dC5sZW5ndGg7bysrKWlmKHRbb10mJihzPXRbb10ubGVuZ3RoLHRbb10ubGVuZ3RoIT09cikpe2E9ITE7YnJlYWt9YXx8KGUuZWFjaChmdW5jdGlvbihlLHQpe3ZhciByPXQucGFyZW50RWxlbWVudC5ub2RlTmFtZTtuLmluZGV4T2Yocik8MCYmbi5wdXNoKHIpfSksY29uc29sZS5lcnJvcigiSW52YWxpZCBvciBpbmNvcnJlY3QgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlICIrbi5qb2luKCIgb3IgIikrIjsgZXhwZWN0ZWQgIityKyIsIGJ1dCBmb3VuZCAiK3MrIiBjb2x1bW5zIikpfSxmaXhDb2x1bW5XaWR0aDpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbixpLGw9KHI9ZShyKVswXSkuY29uZmlnLGQ9bC4kdGFibGUuY2hpbGRyZW4oImNvbGdyb3VwIik7aWYoZC5sZW5ndGgmJmQuaGFzQ2xhc3ModC5jc3MuY29sZ3JvdXApJiZkLnJlbW92ZSgpLGwud2lkdGhGaXhlZCYmMD09PWwuJHRhYmxlLmNoaWxkcmVuKCJjb2xncm91cCIpLmxlbmd0aCl7Zm9yKGQ9ZSgnPGNvbGdyb3VwIGNsYXNzPSInK3QuY3NzLmNvbGdyb3VwKyciPicpLG89bC4kdGFibGUud2lkdGgoKSxuPShhPWwuJHRib2RpZXMuZmluZCgidHI6Zmlyc3QiKS5jaGlsZHJlbigiOnZpc2libGUiKSkubGVuZ3RoLGk9MDtpPG47aSsrKXM9cGFyc2VJbnQoYS5lcShpKS53aWR0aCgpL28qMWUzLDEwKS8xMCsiJSIsZC5hcHBlbmQoZSgiPGNvbD4iKS5jc3MoIndpZHRoIixzKSk7bC4kdGFibGUucHJlcGVuZChkKX19LGdldERhdGE6ZnVuY3Rpb24odCxyLG8pe3ZhciBzLGEsbj0iIixpPWUodCk7cmV0dXJuIGkubGVuZ3RoPyhzPSEhZS5tZXRhZGF0YSYmaS5tZXRhZGF0YSgpLGE9IiAiKyhpLmF0dHIoImNsYXNzIil8fCIiKSx2b2lkIDAhPT1pLmRhdGEobyl8fHZvaWQgMCE9PWkuZGF0YShvLnRvTG93ZXJDYXNlKCkpP24rPWkuZGF0YShvKXx8aS5kYXRhKG8udG9Mb3dlckNhc2UoKSk6cyYmdm9pZCAwIT09c1tvXT9uKz1zW29dOnImJnZvaWQgMCE9PXJbb10/bis9cltvXToiICIhPT1hJiZhLm1hdGNoKCIgIitvKyItIikmJihuPWEubWF0Y2gobmV3IFJlZ0V4cCgiXFxzIitvKyItKFtcXHctXSspIikpWzFdfHwiIiksZS50cmltKG4pKToiIn0sZ2V0Q29sdW1uRGF0YTpmdW5jdGlvbih0LHIsbyxzLGEpe2lmKCJvYmplY3QiIT10eXBlb2Ygcnx8bnVsbD09PXIpcmV0dXJuIHI7dmFyIG4saT0odD1lKHQpWzBdKS5jb25maWcsbD1hfHxpLiRoZWFkZXJzLGQ9aS4kaGVhZGVySW5kZXhlZCYmaS4kaGVhZGVySW5kZXhlZFtvXXx8bC5maW5kKCdbZGF0YS1jb2x1bW49IicrbysnIl06bGFzdCcpO2lmKHZvaWQgMCE9PXJbb10pcmV0dXJuIHM/cltvXTpyW2wuaW5kZXgoZCldO2ZvcihuIGluIHIpaWYoInN0cmluZyI9PXR5cGVvZiBuJiZkLmZpbHRlcihuKS5hZGQoZC5maW5kKG4pKS5sZW5ndGgpcmV0dXJuIHJbbl19LGlzUHJvY2Vzc2luZzpmdW5jdGlvbihyLG8scyl7dmFyIGE9KHI9ZShyKSlbMF0uY29uZmlnLG49c3x8ci5maW5kKCIuIit0LmNzcy5oZWFkZXIpO28/KHZvaWQgMCE9PXMmJmEuc29ydExpc3QubGVuZ3RoPjAmJihuPW4uZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuc29ydERpc2FibGVkJiZ0LmlzVmFsdWVJbkFycmF5KHBhcnNlRmxvYXQoZSh0aGlzKS5hdHRyKCJkYXRhLWNvbHVtbiIpKSxhLnNvcnRMaXN0KT49MH0pKSxyLmFkZChuKS5hZGRDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpKTpyLmFkZChuKS5yZW1vdmVDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpfSxwcm9jZXNzVGJvZHk6ZnVuY3Rpb24odCxyLG8pe2lmKHQ9ZSh0KVswXSxvKXJldHVybiB0LmlzUHJvY2Vzc2luZz0hMCxyLmJlZm9yZSgnPGNvbGdyb3VwIGNsYXNzPSJ0YWJsZXNvcnRlci1zYXZlbXlwbGFjZSIvPicpLGUuZm4uZGV0YWNoP3IuZGV0YWNoKCk6ci5yZW1vdmUoKTt2YXIgcz1lKHQpLmZpbmQoImNvbGdyb3VwLnRhYmxlc29ydGVyLXNhdmVteXBsYWNlIik7ci5pbnNlcnRBZnRlcihzKSxzLnJlbW92ZSgpLHQuaXNQcm9jZXNzaW5nPSExfSxjbGVhclRhYmxlQm9keTpmdW5jdGlvbih0KXtlKHQpWzBdLmNvbmZpZy4kdGJvZGllcy5jaGlsZHJlbigpLmRldGFjaCgpfSxjaGFyYWN0ZXJFcXVpdmFsZW50czp7YToiw6HDoMOiw6PDpMSFw6UiLEE6IsOBw4DDgsODw4TEhMOFIixjOiLDp8SHxI0iLEM6IsOHxIbEjCIsZToiw6nDqMOqw6vEm8SZIixFOiLDicOIw4rDi8SaxJgiLGk6IsOtw6zEsMOuw6/EsSIsSToiw43DjMSww47DjyIsbzoiw7PDssO0w7XDtsWNIixPOiLDk8OSw5TDlcOWxYwiLHNzOiLDnyIsU1M6IuG6niIsdToiw7rDucO7w7zFryIsVToiw5rDmcObw5zFriJ9LHJlcGxhY2VBY2NlbnRzOmZ1bmN0aW9uKGUpe3ZhciByLG89IlsiLHM9dC5jaGFyYWN0ZXJFcXVpdmFsZW50cztpZighdC5jaGFyYWN0ZXJSZWdleCl7dC5jaGFyYWN0ZXJSZWdleEFycmF5PXt9O2ZvcihyIGluIHMpInN0cmluZyI9PXR5cGVvZiByJiYobys9c1tyXSx0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl09bmV3IFJlZ0V4cCgiWyIrc1tyXSsiXSIsImciKSk7dC5jaGFyYWN0ZXJSZWdleD1uZXcgUmVnRXhwKG8rIl0iKX1pZih0LmNoYXJhY3RlclJlZ2V4LnRlc3QoZSkpZm9yKHIgaW4gcykic3RyaW5nIj09dHlwZW9mIHImJihlPWUucmVwbGFjZSh0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl0scikpO3JldHVybiBlfSx2YWxpZGF0ZU9wdGlvbnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG4saT0iaGVhZGVycyBzb3J0Rm9yY2Ugc29ydExpc3Qgc29ydEFwcGVuZCB3aWRnZXRzIi5zcGxpdCgiICIpLGw9ci5vcmlnaW5hbFNldHRpbmdzO2lmKGwpe3QuZGVidWcociwiY29yZSIpJiYobj1uZXcgRGF0ZSk7Zm9yKG8gaW4gbClpZigidW5kZWZpbmVkIj09PShhPXR5cGVvZiB0LmRlZmF1bHRzW29dKSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ0YWJsZS5jb25maWcuJytvKyciIG9wdGlvbiBub3QgcmVjb2duaXplZCcpO2Vsc2UgaWYoIm9iamVjdCI9PT1hKWZvcihzIGluIGxbb10pYT10LmRlZmF1bHRzW29dJiZ0eXBlb2YgdC5kZWZhdWx0c1tvXVtzXSxlLmluQXJyYXkobyxpKTwwJiYidW5kZWZpbmVkIj09PWEmJmNvbnNvbGUud2FybignVGFibGVzb3J0ZXIgV2FybmluZyEgInRhYmxlLmNvbmZpZy4nK28rIi4iK3MrJyIgb3B0aW9uIG5vdCByZWNvZ25pemVkJyk7dC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ2YWxpZGF0ZSBvcHRpb25zIHRpbWU6Iit0LmJlbmNobWFyayhuKSl9fSxyZXN0b3JlSGVhZGVyczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ZShyKVswXS5jb25maWcsbj1hLiR0YWJsZS5maW5kKGEuc2VsZWN0b3JIZWFkZXJzKSxpPW4ubGVuZ3RoO2ZvcihvPTA7bzxpO28rKykocz1uLmVxKG8pKS5maW5kKCIuIit0LmNzcy5oZWFkZXJJbikubGVuZ3RoJiZzLmh0bWwoYS5oZWFkZXJDb250ZW50W29dKX0sZGVzdHJveTpmdW5jdGlvbihyLG8scyl7aWYoKHI9ZShyKVswXSkuaGFzSW5pdGlhbGl6ZWQpe3QucmVtb3ZlV2lkZ2V0KHIsITAsITEpO3ZhciBhLG49ZShyKSxpPXIuY29uZmlnLGw9bi5maW5kKCJ0aGVhZDpmaXJzdCIpLGQ9bC5maW5kKCJ0ci4iK3QuY3NzLmhlYWRlclJvdykucmVtb3ZlQ2xhc3ModC5jc3MuaGVhZGVyUm93KyIgIitpLmNzc0hlYWRlclJvdyksYz1uLmZpbmQoInRmb290OmZpcnN0ID4gdHIiKS5jaGlsZHJlbigidGgsIHRkIik7ITE9PT1vJiZlLmluQXJyYXkoInVpdGhlbWUiLGkud2lkZ2V0cyk+PTAmJihuLnRyaWdnZXJIYW5kbGVyKCJhcHBseVdpZGdldElkIixbInVpdGhlbWUiXSksbi50cmlnZ2VySGFuZGxlcigiYXBwbHlXaWRnZXRJZCIsWyJ6ZWJyYSJdKSksbC5maW5kKCJ0ciIpLm5vdChkKS5yZW1vdmUoKSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgdXBkYXRlQ2VsbCBhZGRSb3dzIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyByZW1vdmVXaWRnZXQgZGVzdHJveSBtb3VzZXVwIG1vdXNlbGVhdmUgIisia2V5cHJlc3Mgc29ydEJlZ2luIHNvcnRFbmQgcmVzZXRUb0xvYWRTdGF0ZSAiLnNwbGl0KCIgIikuam9pbihpLm5hbWVzcGFjZSsiICIpLG4ucmVtb3ZlRGF0YSgidGFibGVzb3J0ZXIiKS51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLGkuJGhlYWRlcnMuYWRkKGMpLnJlbW92ZUNsYXNzKFt0LmNzcy5oZWFkZXIsaS5jc3NIZWFkZXIsaS5jc3NBc2MsaS5jc3NEZXNjLHQuY3NzLnNvcnRBc2MsdC5jc3Muc29ydERlc2MsdC5jc3Muc29ydE5vbmVdLmpvaW4oIiAiKSkucmVtb3ZlQXR0cigiZGF0YS1jb2x1bW4iKS5yZW1vdmVBdHRyKCJhcmlhLWxhYmVsIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSxkLmZpbmQoaS5zZWxlY3RvclNvcnQpLnVuYmluZCgibW91c2Vkb3duIG1vdXNldXAga2V5cHJlc3MgIi5zcGxpdCgiICIpLmpvaW4oaS5uYW1lc3BhY2UrIiAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLHQucmVzdG9yZUhlYWRlcnMociksbi50b2dnbGVDbGFzcyh0LmNzcy50YWJsZSsiICIraS50YWJsZUNsYXNzKyIgdGFibGVzb3J0ZXItIitpLnRoZW1lLCExPT09byksbi5yZW1vdmVDbGFzcyhpLm5hbWVzcGFjZS5zbGljZSgxKSksci5oYXNJbml0aWFsaXplZD0hMSxkZWxldGUgci5jb25maWcuY2FjaGUsImZ1bmN0aW9uIj09dHlwZW9mIHMmJnMociksdC5kZWJ1ZyhpLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ0YWJsZXNvcnRlciBoYXMgYmVlbiByZW1vdmVkIil9fX07ZS5mbi50YWJsZXNvcnRlcj1mdW5jdGlvbihyKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxzPWUuZXh0ZW5kKCEwLHt9LHQuZGVmYXVsdHMscix0Lmluc3RhbmNlTWV0aG9kcyk7cy5vcmlnaW5hbFNldHRpbmdzPXIsIW8uaGFzSW5pdGlhbGl6ZWQmJnQuYnVpbGRUYWJsZSYmIlRBQkxFIiE9PXRoaXMubm9kZU5hbWU/dC5idWlsZFRhYmxlKG8scyk6dC5zZXR1cChvLHMpfSl9LHdpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5sb2d8fCh0LmxvZ3M9W10sY29uc29sZT17fSxjb25zb2xlLmxvZz1jb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj1jb25zb2xlLnRhYmxlPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50czphcmd1bWVudHNbMF07dC5sb2dzW3QubG9ncy5sZW5ndGhdPXtkYXRlOkRhdGUubm93KCksbG9nOmV9fSksdC5hZGRQYXJzZXIoe2lkOiJuby1wYXJzZXIiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbigpe3JldHVybiIifSx0eXBlOiJ0ZXh0In0pLHQuYWRkUGFyc2VyKHtpZDoidGV4dCIsaXM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9by5jb25maWc7cmV0dXJuIHImJihyPWUudHJpbShzLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpLHI9cy5zb3J0TG9jYWxlQ29tcGFyZT90LnJlcGxhY2VBY2NlbnRzKHIpOnIpLHJ9LHR5cGU6InRleHQifSksdC5yZWdleC5ub25kaWdpdD0vW15cdywuIFwtKCldL2csdC5hZGRQYXJzZXIoe2lkOiJkaWdpdCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXNEaWdpdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC5jdXJyZW5jeVJlcGxhY2U9L1srXC0sLiBdL2csdC5yZWdleC5jdXJyZW5jeVRlc3Q9L15cKD9cZCtbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXXxbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXVxkK1wpPyQvLHQuYWRkUGFyc2VyKHtpZDoiY3VycmVuY3kiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiBlPShlfHwiIikucmVwbGFjZSh0LnJlZ2V4LmN1cnJlbmN5UmVwbGFjZSwiIiksdC5yZWdleC5jdXJyZW5jeVRlc3QudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC51cmxQcm90b2NvbFRlc3Q9L14oaHR0cHM/fGZ0cHxmaWxlKTpcL1wvLyx0LnJlZ2V4LnVybFByb3RvY29sUmVwbGFjZT0vKGh0dHBzP3xmdHB8ZmlsZSk6XC9cLyh3d3dcLik/Lyx0LmFkZFBhcnNlcih7aWQ6InVybCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVnZXgudXJsUHJvdG9jb2xUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihyKXtyZXR1cm4gcj9lLnRyaW0oci5yZXBsYWNlKHQucmVnZXgudXJsUHJvdG9jb2xSZXBsYWNlLCIiKSk6cn0sdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhc2g9Ly0vZyx0LnJlZ2V4Lmlzb0RhdGU9L15cZHs0fVtcL1wtXVxkezEsMn1bXC9cLV1cZHsxLDJ9Lyx0LmFkZFBhcnNlcih7aWQ6Imlzb0RhdGUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4Lmlzb0RhdGUudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGFzaCwiLyIpKTplO3JldHVybiByIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUocik/ci5nZXRUaW1lKCk6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnBlcmNlbnQ9LyUvZyx0LnJlZ2V4LnBlcmNlbnRUZXN0PS8oXGRccyo/JXwlXHMqP1xkKS8sdC5hZGRQYXJzZXIoe2lkOiJwZXJjZW50IixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC5wZXJjZW50VGVzdC50ZXN0KGUpJiZlLmxlbmd0aDwxNX0sZm9ybWF0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGU/dC5mb3JtYXRGbG9hdChlLnJlcGxhY2UodC5yZWdleC5wZXJjZW50LCIiKSxyKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoiaW1hZ2UiLGlzOmZ1bmN0aW9uKGUsdCxyLG8pe3JldHVybiBvLmZpbmQoImltZyIpLmxlbmd0aD4wfSxmb3JtYXQ6ZnVuY3Rpb24odCxyLG8pe3JldHVybiBlKG8pLmZpbmQoImltZyIpLmF0dHIoci5jb25maWcuaW1nQXR0cnx8ImFsdCIpfHx0fSxwYXJzZWQ6ITAsdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhdGVSZXBsYWNlPS8oXFMpKFtBUF1NKSQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0MT0vXltBLVpdezMsMTB9XC4/XHMrXGR7MSwyfSw/XHMrKFxkezR9KShccytcZHsxLDJ9OlxkezJ9KDpcZHsyfSk/KFxzK1tBUF1NKT8pPyQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0Mj0vXlxkezEsMn1ccytbQS1aXXszLDEwfVxzK1xkezR9L2ksdC5hZGRQYXJzZXIoe2lkOiJ1c0xvbmdEYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC51c0xvbmdEYXRlVGVzdDEudGVzdChlKXx8dC5yZWdleC51c0xvbmdEYXRlVGVzdDIudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGF0ZVJlcGxhY2UsIiQxICQyIikpOmU7cmV0dXJuIHIgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShyKT9yLmdldFRpbWUoKTplfSx0eXBlOiJudW1lcmljIn0pLHQucmVnZXguc2hvcnREYXRlVGVzdD0vKF5cZHsxLDJ9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezR9KXwoXlxkezR9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezEsMn0pLyx0LnJlZ2V4LnNob3J0RGF0ZVJlcGxhY2U9L1tcLS4sXS9nLHQucmVnZXguc2hvcnREYXRlWFhZPS8oXGR7MSwyfSlbXC9cc10oXGR7MSwyfSlbXC9cc10oXGR7NH0pLyx0LnJlZ2V4LnNob3J0RGF0ZVlNRD0vKFxkezR9KVtcL1xzXShcZHsxLDJ9KVtcL1xzXShcZHsxLDJ9KS8sdC5jb252ZXJ0Rm9ybWF0PWZ1bmN0aW9uKGUscil7ZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLCJtbWRkeXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMS8kMiIpOiJkZG1teXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMi8kMSIpOiJ5eXl5bW1kZCI9PT1yJiYoZT1lLnJlcGxhY2UodC5yZWdleC5zaG9ydERhdGVZTUQsIiQxLyQyLyQzIikpO3ZhciBvPW5ldyBEYXRlKGUpO3JldHVybiBvIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUobyk/by5nZXRUaW1lKCk6IiJ9LHQuYWRkUGFyc2VyKHtpZDoic2hvcnREYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLHQucmVnZXguc2hvcnREYXRlVGVzdC50ZXN0KGUpfSxmb3JtYXQ6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZSl7dmFyIGE9ci5jb25maWcsbj1hLiRoZWFkZXJJbmRleGVkW3NdLGk9bi5sZW5ndGgmJm4uZGF0YSgiZGF0ZUZvcm1hdCIpfHx0LmdldERhdGEobix0LmdldENvbHVtbkRhdGEocixhLmhlYWRlcnMscyksImRhdGVGb3JtYXQiKXx8YS5kYXRlRm9ybWF0O3JldHVybiBuLmxlbmd0aCYmbi5kYXRhKCJkYXRlRm9ybWF0IixpKSx0LmNvbnZlcnRGb3JtYXQoZSxpKXx8ZX1yZXR1cm4gZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnRpbWVUZXN0PS9eKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSkkfF4oKD86WzAxXVxkfFsyXVswLTRdKTpbMC01XVxkKSQvaSx0LnJlZ2V4LnRpbWVNYXRjaD0vKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSl8KCg/OlswMV1cZHxbMl1bMC00XSk6WzAtNV1cZCkvaSx0LmFkZFBhcnNlcih7aWQ6InRpbWUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4LnRpbWVUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihlKXt2YXIgcixvPShlfHwiIikubWF0Y2godC5yZWdleC50aW1lTWF0Y2gpLHM9bmV3IERhdGUoZSksYT1lJiYobnVsbCE9PW8/b1swXToiMDA6MDAgQU0iKSxuPWE/bmV3IERhdGUoIjIwMDAvMDEvMDEgIithLnJlcGxhY2UodC5yZWdleC5kYXRlUmVwbGFjZSwiJDEgJDIiKSk6YTtyZXR1cm4gbiBpbnN0YW5jZW9mIERhdGUmJmlzRmluaXRlKG4pPyhyPXMgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShzKT9zLmdldFRpbWUoKTowLHI/cGFyc2VGbG9hdChuLmdldFRpbWUoKSsiLiIrcy5nZXRUaW1lKCkpOm4uZ2V0VGltZSgpKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoibWV0YWRhdGEiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHM9ci5jb25maWcsYT1zLnBhcnNlck1ldGFkYXRhTmFtZT9zLnBhcnNlck1ldGFkYXRhTmFtZToic29ydFZhbHVlIjtyZXR1cm4gZShvKS5tZXRhZGF0YSgpW2FdfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkV2lkZ2V0KHtpZDoiemVicmEiLHByaW9yaXR5OjkwLGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZz1uZXcgUmVnRXhwKHIuY3NzQ2hpbGRSb3csImkiKSxwPXIuJHRib2RpZXMuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV90YWJsZSIpLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrci5jc3NJbmZvQmxvY2srIikiKSk7Zm9yKGw9MDtsPHAubGVuZ3RoO2wrKylmb3Iobj0wLGM9KHM9cC5lcShsKS5jaGlsZHJlbigidHI6dmlzaWJsZSIpLm5vdChyLnNlbGVjdG9yUmVtb3ZlKSkubGVuZ3RoLGQ9MDtkPGM7ZCsrKWE9cy5lcShkKSxnLnRlc3QoYVswXS5jbGFzc05hbWUpfHxuKyssaT1uJTI9PTAsYS5yZW1vdmVDbGFzcyhvLnplYnJhW2k/MTowXSkuYWRkQ2xhc3Moby56ZWJyYVtpPzA6MV0pfSxyZW1vdmU6ZnVuY3Rpb24oZSxyLG8scyl7aWYoIXMpe3ZhciBhLG4saT1yLiR0Ym9kaWVzLGw9KG8uemVicmF8fFsiZXZlbiIsIm9kZCJdKS5qb2luKCIgIik7Zm9yKGE9MDthPGkubGVuZ3RoO2ErKykobj10LnByb2Nlc3NUYm9keShlLGkuZXEoYSksITApKS5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKGwpLHQucHJvY2Vzc1Rib2R5KGUsbiwhMSl9fX0pfShlKSxlLnRhYmxlc29ydGVyfSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAgICBDb3B5cmlnaHQgMjAwOC0yMDEzCiAgICAgICAgTWF0dGhpYXMgRWhtYW5uLAogICAgICAgIE1pY2hhZWwgR2VyaGFldXNlciwKICAgICAgICBDYXJzdGVuIE1pbGxlciwKICAgICAgICBCaWFuY2EgVmFsZW50aW4sCiAgICAgICAgQWxmcmVkIFdhc3Nlcm1hbm4sCiAgICAgICAgUGV0ZXIgV2lsZmFocnQKICAgIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBvciBMR1BMIFZlcnNpb24gMyBsaWNlbnNlcy4KICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLgogICAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8+LgoqLwooZnVuY3Rpb24oKXt2YXIgZSxyLG47KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG8oZSxyKXtyZXR1cm4gQy5jYWxsKGUscil9ZnVuY3Rpb24gaShlLHIpe3ZhciBuLHQsbyxpLGEsdSxjLGYscyxsLHA9ciYmci5zcGxpdCgiLyIpLGg9ay5tYXAsZD1oJiZoWyIqIl18fHt9O2lmKGUmJiIuIj09PWUuY2hhckF0KDApKWlmKHIpe2ZvcihwPXAuc2xpY2UoMCxwLmxlbmd0aC0xKSxlPXAuY29uY2F0KGUuc3BsaXQoIi8iKSksZj0wO2UubGVuZ3RoPmY7Zis9MSlpZihsPWVbZl0sIi4iPT09bCllLnNwbGljZShmLDEpLGYtPTE7ZWxzZSBpZigiLi4iPT09bCl7aWYoMT09PWYmJigiLi4iPT09ZVsyXXx8Ii4uIj09PWVbMF0pKWJyZWFrO2Y+MCYmKGUuc3BsaWNlKGYtMSwyKSxmLT0yKX1lPWUuam9pbigiLyIpfWVsc2UgMD09PWUuaW5kZXhPZigiLi8iKSYmKGU9ZS5zdWJzdHJpbmcoMikpO2lmKChwfHxkKSYmaCl7Zm9yKG49ZS5zcGxpdCgiLyIpLGY9bi5sZW5ndGg7Zj4wO2YtPTEpe2lmKHQ9bi5zbGljZSgwLGYpLmpvaW4oIi8iKSxwKWZvcihzPXAubGVuZ3RoO3M+MDtzLT0xKWlmKG89aFtwLnNsaWNlKDAscykuam9pbigiLyIpXSxvJiYobz1vW3RdKSl7aT1vLGE9ZjticmVha31pZihpKWJyZWFrOyF1JiZkJiZkW3RdJiYodT1kW3RdLGM9Zil9IWkmJnUmJihpPXUsYT1jKSxpJiYobi5zcGxpY2UoMCxhLGkpLGU9bi5qb2luKCIvIikpfXJldHVybiBlfWZ1bmN0aW9uIGEoZSxyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaC5hcHBseSh0LHYuY2FsbChhcmd1bWVudHMsMCkuY29uY2F0KFtlLHJdKSl9fWZ1bmN0aW9uIHUoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBpKHIsZSl9fWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe2JbZV09cn19ZnVuY3Rpb24gZihlKXtpZihvKG0sZSkpe3ZhciByPW1bZV07ZGVsZXRlIG1bZV0seVtlXT0hMCxwLmFwcGx5KHQscil9aWYoIW8oYixlKSYmIW8oeSxlKSl0aHJvdyBFcnJvcigiTm8gIitlKTtyZXR1cm4gYltlXX1mdW5jdGlvbiBzKGUpe3ZhciByLG49ZT9lLmluZGV4T2YoIiEiKTotMTtyZXR1cm4gbj4tMSYmKHI9ZS5zdWJzdHJpbmcoMCxuKSxlPWUuc3Vic3RyaW5nKG4rMSxlLmxlbmd0aCkpLFtyLGVdfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGsmJmsuY29uZmlnJiZrLmNvbmZpZ1tlXXx8e319fXZhciBwLGgsZCxnLGI9e30sbT17fSxrPXt9LHk9e30sQz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHY9W10uc2xpY2U7ZD1mdW5jdGlvbihlLHIpe3ZhciBuLHQ9cyhlKSxvPXRbMF07cmV0dXJuIGU9dFsxXSxvJiYobz1pKG8sciksbj1mKG8pKSxvP2U9biYmbi5ub3JtYWxpemU/bi5ub3JtYWxpemUoZSx1KHIpKTppKGUscik6KGU9aShlLHIpLHQ9cyhlKSxvPXRbMF0sZT10WzFdLG8mJihuPWYobykpKSx7ZjpvP28rIiEiK2U6ZSxuOmUscHI6byxwOm59fSxnPXtyZXF1aXJlOmZ1bmN0aW9uKGUpe3JldHVybiBhKGUpfSxleHBvcnRzOmZ1bmN0aW9uKGUpe3ZhciByPWJbZV07cmV0dXJuIHIhPT12b2lkIDA/cjpiW2VdPXt9fSxtb2R1bGU6ZnVuY3Rpb24oZSl7cmV0dXJue2lkOmUsdXJpOiIiLGV4cG9ydHM6YltlXSxjb25maWc6bChlKX19fSxwPWZ1bmN0aW9uKGUscixuLGkpe3ZhciB1LHMsbCxwLGgsayxDPVtdO2lmKGk9aXx8ZSwiZnVuY3Rpb24iPT10eXBlb2Ygbil7Zm9yKHI9IXIubGVuZ3RoJiZuLmxlbmd0aD9bInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl06cixoPTA7ci5sZW5ndGg+aDtoKz0xKWlmKHA9ZChyW2hdLGkpLHM9cC5mLCJyZXF1aXJlIj09PXMpQ1toXT1nLnJlcXVpcmUoZSk7ZWxzZSBpZigiZXhwb3J0cyI9PT1zKUNbaF09Zy5leHBvcnRzKGUpLGs9ITA7ZWxzZSBpZigibW9kdWxlIj09PXMpdT1DW2hdPWcubW9kdWxlKGUpO2Vsc2UgaWYobyhiLHMpfHxvKG0scyl8fG8oeSxzKSlDW2hdPWYocyk7ZWxzZXtpZighcC5wKXRocm93IEVycm9yKGUrIiBtaXNzaW5nICIrcyk7cC5wLmxvYWQocC5uLGEoaSwhMCksYyhzKSx7fSksQ1toXT1iW3NdfWw9bi5hcHBseShiW2VdLEMpLGUmJih1JiZ1LmV4cG9ydHMhPT10JiZ1LmV4cG9ydHMhPT1iW2VdP2JbZV09dS5leHBvcnRzOmw9PT10JiZrfHwoYltlXT1sKSl9ZWxzZSBlJiYoYltlXT1uKX0sZT1yPWg9ZnVuY3Rpb24oZSxyLG4sbyxpKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/Z1tlXT9nW2VdKHIpOmYoZChlLHIpLmYpOihlLnNwbGljZXx8KGs9ZSxyLnNwbGljZT8oZT1yLHI9bixuPW51bGwpOmU9dCkscj1yfHxmdW5jdGlvbigpe30sImZ1bmN0aW9uIj09dHlwZW9mIG4mJihuPW8sbz1pKSxvP3AodCxlLHIsbik6c2V0VGltZW91dChmdW5jdGlvbigpe3AodCxlLHIsbil9LDQpLGgpfSxoLmNvbmZpZz1mdW5jdGlvbihlKXtyZXR1cm4gaz1lLGsuZGVwcyYmaChrLmRlcHMsay5jYWxsYmFjayksaH0sbj1mdW5jdGlvbihlLHIsbil7ci5zcGxpY2V8fChuPXIscj1bXSksbyhiLGUpfHxvKG0sZSl8fChtW2VdPVtlLHIsbl0pfSxuLmFtZD17alF1ZXJ5OiEwfX0pKCksbigiLi4vbm9kZV9tb2R1bGVzL2FsbW9uZC9hbG1vbmQiLGZ1bmN0aW9uKCl7fSksbigianhnIixbXSxmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiJvYmplY3QiIT10eXBlb2YgSlhHfHxKWEcuZXh0ZW5kfHwoZT1KWEcpLGUuZXh0ZW5kPWZ1bmN0aW9uKGUscixuLHQpe3ZhciBvLGk7bj1ufHwhMSx0PXR8fCExO2ZvcihvIGluIHIpKCFufHxuJiZyLmhhc093blByb3BlcnR5KG8pKSYmKGk9dD9vLnRvTG93ZXJDYXNlKCk6byxlW2ldPXJbb10pfSxlLmV4dGVuZChlLHtib2FyZHM6e30scmVhZGVyczp7fSxlbGVtZW50czp7fSxyZWdpc3RlckVsZW1lbnQ6ZnVuY3Rpb24oZSxyKXtlPWUudG9Mb3dlckNhc2UoKSx0aGlzLmVsZW1lbnRzW2VdPXJ9LHJlZ2lzdGVyUmVhZGVyOmZ1bmN0aW9uKGUscil7dmFyIG4sdDtmb3Iobj0wO3IubGVuZ3RoPm47bisrKXQ9cltuXS50b0xvd2VyQ2FzZSgpLCJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzLnJlYWRlcnNbdF0mJih0aGlzLnJlYWRlcnNbdF09ZSl9LHNob3J0Y3V0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbcl0uYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sZ2V0UmVmOmZ1bmN0aW9uKGUscil7cmV0dXJuIGUuc2VsZWN0KHIpfSxnZXRSZWZlcmVuY2U6ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZS5zZWxlY3Qocil9LGRlYnVnSW50OmZ1bmN0aW9uKCl7dmFyIGUscjtmb3IoZT0wO2FyZ3VtZW50cy5sZW5ndGg+ZTtlKyspcj1hcmd1bWVudHNbZV0sIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZz9jb25zb2xlLmxvZyhyKToib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGVidWciKSYmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZWJ1ZyIpLmlubmVySFRNTCs9cisiPGJyLz4iKX0sZGVidWdXU1Q6ZnVuY3Rpb24oKXt2YXIgcj1FcnJvcigpO2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHImJnIuc3RhY2smJihlLmRlYnVnSW50KCJzdGFja3RyYWNlIiksZS5kZWJ1Z0ludChyLnN0YWNrLnNwbGl0KCJcbiIpLnNsaWNlKDEpLmpvaW4oIlxuIikpKX0sZGVidWdMaW5lOmZ1bmN0aW9uKCl7dmFyIHI9RXJyb3IoKTtlLmRlYnVnSW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyJiZyLnN0YWNrJiZlLmRlYnVnSW50KCJDYWxsZWQgZnJvbSIsci5zdGFjay5zcGxpdCgiXG4iKS5zbGljZSgyLDMpLmpvaW4oIlxuIikpfSxkZWJ1ZzpmdW5jdGlvbigpe2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pLGV9KSxuKCJ1dGlscy96aXAiLFsianhnIl0sZnVuY3Rpb24oZSl7dmFyIHI9WzAsMTI4LDY0LDE5MiwzMiwxNjAsOTYsMjI0LDE2LDE0NCw4MCwyMDgsNDgsMTc2LDExMiwyNDAsOCwxMzYsNzIsMjAwLDQwLDE2OCwxMDQsMjMyLDI0LDE1Miw4OCwyMTYsNTYsMTg0LDEyMCwyNDgsNCwxMzIsNjgsMTk2LDM2LDE2NCwxMDAsMjI4LDIwLDE0OCw4NCwyMTIsNTIsMTgwLDExNiwyNDQsMTIsMTQwLDc2LDIwNCw0NCwxNzIsMTA4LDIzNiwyOCwxNTYsOTIsMjIwLDYwLDE4OCwxMjQsMjUyLDIsMTMwLDY2LDE5NCwzNCwxNjIsOTgsMjI2LDE4LDE0Niw4MiwyMTAsNTAsMTc4LDExNCwyNDIsMTAsMTM4LDc0LDIwMiw0MiwxNzAsMTA2LDIzNCwyNiwxNTQsOTAsMjE4LDU4LDE4NiwxMjIsMjUwLDYsMTM0LDcwLDE5OCwzOCwxNjYsMTAyLDIzMCwyMiwxNTAsODYsMjE0LDU0LDE4MiwxMTgsMjQ2LDE0LDE0Miw3OCwyMDYsNDYsMTc0LDExMCwyMzgsMzAsMTU4LDk0LDIyMiw2MiwxOTAsMTI2LDI1NCwxLDEyOSw2NSwxOTMsMzMsMTYxLDk3LDIyNSwxNywxNDUsODEsMjA5LDQ5LDE3NywxMTMsMjQxLDksMTM3LDczLDIwMSw0MSwxNjksMTA1LDIzMywyNSwxNTMsODksMjE3LDU3LDE4NSwxMjEsMjQ5LDUsMTMzLDY5LDE5NywzNywxNjUsMTAxLDIyOSwyMSwxNDksODUsMjEzLDUzLDE4MSwxMTcsMjQ1LDEzLDE0MSw3NywyMDUsNDUsMTczLDEwOSwyMzcsMjksMTU3LDkzLDIyMSw2MSwxODksMTI1LDI1MywzLDEzMSw2NywxOTUsMzUsMTYzLDk5LDIyNywxOSwxNDcsODMsMjExLDUxLDE3OSwxMTUsMjQzLDExLDEzOSw3NSwyMDMsNDMsMTcxLDEwNywyMzUsMjcsMTU1LDkxLDIxOSw1OSwxODcsMTIzLDI1MSw3LDEzNSw3MSwxOTksMzksMTY3LDEwMywyMzEsMjMsMTUxLDg3LDIxNSw1NSwxODMsMTE5LDI0NywxNSwxNDMsNzksMjA3LDQ3LDE3NSwxMTEsMjM5LDMxLDE1OSw5NSwyMjMsNjMsMTkxLDEyNywyNTVdLG49WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsMCwwXSx0PVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsOTksOTldLG89WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3N10saT1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sYT1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sdT0yNTY7cmV0dXJuIGUuVXRpbD1lLlV0aWx8fHt9LGUuVXRpbC5VbnppcD1mdW5jdGlvbihjKXtmdW5jdGlvbiBmKCl7cmV0dXJuIFIrPTgsTz5YP2NbWCsrXTotMX1mdW5jdGlvbiBzKCl7Qj0xfWZ1bmN0aW9uIGwoKXt2YXIgZTt0cnl7cmV0dXJuIFIrKyxlPTEmQixCPj49MSwwPT09QiYmKEI9ZigpLGU9MSZCLEI9MTI4fEI+PjEpLGV9Y2F0Y2gocil7dGhyb3cgcn19ZnVuY3Rpb24gcChlKXt2YXIgbj0wLHQ9ZTt0cnl7Zm9yKDt0LS07KW49bjw8MXxsKCk7ZSYmKG49cltuXT4+OC1lKX1jYXRjaChvKXt0aHJvdyBvfXJldHVybiBufWZ1bmN0aW9uIGgoKXtKPTB9ZnVuY3Rpb24gZChlKXtqKyssR1tKKytdPWUsei5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpLDMyNzY4PT09SiYmKEo9MCl9ZnVuY3Rpb24gZygpe3RoaXMuYjA9MCx0aGlzLmIxPTAsdGhpcy5qdW1wPW51bGwsdGhpcy5qdW1wcG9zPS0xfWZ1bmN0aW9uIGIoKXtmb3IoOzspe2lmKE1bSF0+PXgpcmV0dXJuLTE7aWYoVVtNW0hdXT09PUgpcmV0dXJuIE1bSF0rKztNW0hdKyt9fWZ1bmN0aW9uIG0oKXt2YXIgZSxyPVBbRl07aWYoMTc9PT1IKXJldHVybi0xO2lmKEYrKyxIKyssZT1iKCksZT49MClyLmIwPWU7ZWxzZSBpZihyLmIwPTMyNzY4LG0oKSlyZXR1cm4tMTtpZihlPWIoKSxlPj0wKXIuYjE9ZSxyLmp1bXA9bnVsbDtlbHNlIGlmKHIuYjE9MzI3Njgsci5qdW1wPVBbRl0sci5qdW1wcG9zPUYsbSgpKXJldHVybi0xO3JldHVybiBILS0sMH1mdW5jdGlvbiBrKGUscixuKXt2YXIgdDtmb3IoUD1lLEY9MCxVPW4seD1yLHQ9MDsxNz50O3QrKylNW3RdPTA7cmV0dXJuIEg9MCxtKCk/LTE6MH1mdW5jdGlvbiB5KGUpe2Zvcih2YXIgcixuLHQsbz0wLGk9ZVtvXTs7KWlmKHQ9bCgpKXtpZighKDMyNzY4JmkuYjEpKXJldHVybiBpLmIxO2ZvcihpPWkuanVtcCxyPWUubGVuZ3RoLG49MDtyPm47bisrKWlmKGVbbl09PT1pKXtvPW47YnJlYWt9fWVsc2V7aWYoISgzMjc2OCZpLmIwKSlyZXR1cm4gaS5iMDtvKyssaT1lW29dfX1mdW5jdGlvbiBDKCl7dmFyIHUsYyxiLG0sQyx2LEEsaix3LFUseCxTLHosSSxFLEwsTztkbyBpZih1PWwoKSxiPXAoMiksMD09PWIpZm9yKHMoKSxVPWYoKSxVfD1mKCk8PDgsUz1mKCksU3w9ZigpPDw4LDY1NTM1JihVXn5TKSYmZS5kZWJ1ZygiQmxvY2tMZW4gY2hlY2tzdW0gbWlzbWF0Y2hcbiIpO1UtLTspYz1mKCksZChjKTtlbHNlIGlmKDE9PT1iKWZvcig7OylpZihDPXJbcCg3KV0+PjEsQz4yMz8oQz1DPDwxfGwoKSxDPjE5OT8oQy09MTI4LEM9Qzw8MXxsKCkpOihDLT00OCxDPjE0MyYmKEMrPTEzNikpKTpDKz0yNTYsMjU2PkMpZChDKTtlbHNle2lmKDI1Nj09PUMpYnJlYWs7Zm9yKEMtPTI1Nyx3PXAodFtDXSkrbltDXSxDPXJbcCg1KV0+PjMsaVtDXT44Pyh4PXAoOCkseHw9cChpW0NdLTgpPDw4KTp4PXAoaVtDXSkseCs9b1tDXSxDPTA7dz5DO0MrKyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgaWYoMj09PWIpe2ZvcihBPUFycmF5KDMyMCksST0yNTcrcCg1KSxFPTErcCg1KSxMPTQrcCg0KSxDPTA7MTk+QztDKyspQVtDXT0wO2ZvcihDPTA7TD5DO0MrKylBW2FbQ11dPXAoMyk7Zm9yKHc9cS5sZW5ndGgsbT0wO3c+bTttKyspcVttXT1uZXcgZztpZihrKHEsMTksQSwwKSlyZXR1cm4gaCgpLDE7Zm9yKHo9SStFLG09MCxPPS0xO3o+bTspaWYoTysrLEM9eShxKSwxNj5DKUFbbSsrXT1DO2Vsc2UgaWYoMTY9PT1DKXtpZihDPTMrcCgyKSxtK0M+eilyZXR1cm4gaCgpLDE7Zm9yKHY9bT9BW20tMV06MDtDLS07KUFbbSsrXT12fWVsc2V7aWYoQz0xNz09PUM/MytwKDMpOjExK3AoNyksbStDPnopcmV0dXJuIGgoKSwxO2Zvcig7Qy0tOylBW20rK109MH1mb3Iodz1ULmxlbmd0aCxtPTA7dz5tO20rKylUW21dPW5ldyBnO2lmKGsoVCxJLEEsMCkpcmV0dXJuIGgoKSwxO2Zvcih3PVQubGVuZ3RoLG09MDt3Pm07bSsrKXFbbV09bmV3IGc7Zm9yKGo9W10sbT1JO0EubGVuZ3RoPm07bSsrKWpbbS1JXT1BW21dO2lmKGsocSxFLGosMCkpcmV0dXJuIGgoKSwxO2Zvcig7OylpZihDPXkoVCksQz49MjU2KXtpZihDLT0yNTYsMD09PUMpYnJlYWs7Zm9yKEMtPTEsdz1wKHRbQ10pK25bQ10sQz15KHEpLGlbQ10+OD8oeD1wKDgpLHh8PXAoaVtDXS04KTw8OCk6eD1wKGlbQ10pLHgrPW9bQ107dy0tOyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgZChDKX13aGlsZSghdSk7cmV0dXJuIGgoKSxzKCksMH1mdW5jdGlvbiB2KCl7dmFyIGUscixuLHQsbyxpLGEsYyxzPVtdO3RyeXtpZih6PVtdLEw9ITEsc1swXT1mKCksc1sxXT1mKCksMTIwPT09c1swXSYmMjE4PT09c1sxXSYmKEMoKSxFW0ldPVt6LmpvaW4oIiIpLCJnZW9uZXh0Lmd4dCJdLEkrKyksMzE9PT1zWzBdJiYxMzk9PT1zWzFdJiYoUygpLEVbSV09W3ouam9pbigiIiksImZpbGUiXSxJKyspLDgwPT09c1swXSYmNzU9PT1zWzFdJiYoTD0hMCxzWzJdPWYoKSxzWzNdPWYoKSwzPT09c1syXSYmND09PXNbM10pKXtmb3Ioc1swXT1mKCksc1sxXT1mKCksQT1mKCksQXw9ZigpPDw4LGM9ZigpLGN8PWYoKTw8OCxmKCksZigpLGYoKSxmKCksYT1mKCksYXw9ZigpPDw4LGF8PWYoKTw8MTYsYXw9ZigpPDwyNCxpPWYoKSxpfD1mKCk8PDgsaXw9ZigpPDwxNixpfD1mKCk8PDI0LG89ZigpLG98PWYoKTw8OCxvfD1mKCk8PDE2LG98PWYoKTw8MjQsdD1mKCksdHw9ZigpPDw4LG49ZigpLG58PWYoKTw8OCxlPTAsTj1bXTt0LS07KXI9ZigpLCIvIj09PXJ8IjoiPT09cj9lPTA6dS0xPmUmJihOW2UrK109U3RyaW5nLmZyb21DaGFyQ29kZShyKSk7Zm9yKHd8fCh3PU4pLGU9MDtuPmU7KXI9ZigpLGUrKztqPTAsOD09PWMmJihDKCksRVtJXT1BcnJheSgyKSxFW0ldWzBdPXouam9pbigiIiksRVtJXVsxXT1OLmpvaW4oIiIpLEkrKyksUygpfX1jYXRjaChsKXt0aHJvdyBsfX12YXIgQSxqLHcsVSx4LFMsej1bXSxJPTAsRT1bXSxHPUFycmF5KDMyNzY4KSxKPTAsTD0hMSxPPWMubGVuZ3RoLFg9MCxCPTEsUj0wLFQ9QXJyYXkoMjg4KSxxPUFycmF5KDMyKSxGPTAsUD1udWxsLEg9KEFycmF5KDY0KSxBcnJheSg2NCksMCksTT1BcnJheSgxNyksTj1bXTtNWzBdPTAsUz1mdW5jdGlvbigpe3ZhciBlLHIsbix0LG8saSxhPVtdO2lmKDgmQSYmKGFbMF09ZigpLGFbMV09ZigpLGFbMl09ZigpLGFbM109ZigpLDgwPT09YVswXSYmNzU9PT1hWzFdJiY3PT09YVsyXSYmOD09PWFbM10/KGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQpOmU9YVswXXxhWzFdPDw4fGFbMl08PDE2fGFbM108PDI0LHI9ZigpLHJ8PWYoKTw8OCxyfD1mKCk8PDE2LHJ8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCksTCYmdigpLGFbMF09ZigpLDg9PT1hWzBdKXtpZihBPWYoKSxmKCksZigpLGYoKSxmKCksZigpLHQ9ZigpLDQmQSlmb3IoYVswXT1mKCksYVsyXT1mKCksSD1hWzBdKzI1NiphWzFdLG89MDtIPm87bysrKWYoKTtpZig4JkEpZm9yKG89MCxOPVtdLGk9ZigpO2k7KSgiNyI9PT1pfHwiOiI9PT1pKSYmKG89MCksdS0xPm8mJihOW28rK109aSksaT1mKCk7aWYoMTYmQSlmb3IoaT1mKCk7aTspaT1mKCk7MiZBJiYoZigpLGYoKSksQygpLGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCxMJiZ2KCl9fSxlLlV0aWwuVW56aXAucHJvdG90eXBlLnVuemlwRmlsZT1mdW5jdGlvbihlKXt2YXIgcjtmb3IodGhpcy51bnppcCgpLHI9MDtFLmxlbmd0aD5yO3IrKylpZihFW3JdWzFdPT09ZSlyZXR1cm4gRVtyXVswXTtyZXR1cm4iIn0sZS5VdGlsLlVuemlwLnByb3RvdHlwZS51bnppcD1mdW5jdGlvbigpe3JldHVybiB2KCksRX19LGUuVXRpbH0pLG4oInV0aWxzL2VuY29kaW5nIixbImp4ZyJdLGZ1bmN0aW9uKGUpe3ZhciByPTAsbj1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsOCw4LDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDEwLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDQsMywzLDExLDYsNiw2LDUsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDAsMTIsMjQsMzYsNjAsOTYsODQsMTIsMTIsMTIsNDgsNzIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMCwxMiwxMiwxMiwxMiwxMiwwLDEyLDAsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTJdO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuVVRGOD17ZW5jb2RlOmZ1bmN0aW9uKGUpe3ZhciByLG4sdD0iIixvPWUubGVuZ3RoO2lmKGU9ZS5yZXBsYWNlKC9cclxuL2csIlxuIiksImZ1bmN0aW9uIj09dHlwZW9mIHVuZXNjYXBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZW5jb2RlVVJJQ29tcG9uZW50KXJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpO2ZvcihyPTA7bz5yO3IrKyluPWUuY2hhckNvZGVBdChyKSwxMjg+bj90Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKG4pOm4+MTI3JiYyMDQ4Pm4/KHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTkyfG4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKToodCs9U3RyaW5nLmZyb21DaGFyQ29kZSgyMjR8bj4+MTIpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKTtyZXR1cm4gdH0sZGVjb2RlOmZ1bmN0aW9uKGUpe3ZhciB0LG8saSxhPTAsdT0wLGM9cixmPVtdLHM9ZS5sZW5ndGgsbD1bXTtmb3IodD0wO3M+dDt0Kyspbz1lLmNoYXJDb2RlQXQodCksaT1uW29dLHU9YyE9PXI/NjMmb3x1PDw2OjI1NT4+aSZvLGM9blsyNTYrYytpXSxjPT09ciYmKHU+NjU1MzU/Zi5wdXNoKDU1MjMyKyh1Pj4xMCksNTYzMjArKDEwMjMmdSkpOmYucHVzaCh1KSxhKyssMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxmKSksZj1bXSkpO3JldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGYpKSxsLmpvaW4oIiIpfSxhc2NpaUNoYXJDb2RlQXQ6ZnVuY3Rpb24oZSxyKXt2YXIgbj1lLmNoYXJDb2RlQXQocik7aWYobj4yNTUpc3dpdGNoKG4pe2Nhc2UgODM2NDpuPTEyODticmVhaztjYXNlIDgyMTg6bj0xMzA7YnJlYWs7Y2FzZSA0MDI6bj0xMzE7YnJlYWs7Y2FzZSA4MjIyOm49MTMyO2JyZWFrO2Nhc2UgODIzMDpuPTEzMzticmVhaztjYXNlIDgyMjQ6bj0xMzQ7YnJlYWs7Y2FzZSA4MjI1Om49MTM1O2JyZWFrO2Nhc2UgNzEwOm49MTM2O2JyZWFrO2Nhc2UgODI0MDpuPTEzNzticmVhaztjYXNlIDM1MjpuPTEzODticmVhaztjYXNlIDgyNDk6bj0xMzk7YnJlYWs7Y2FzZSAzMzg6bj0xNDA7YnJlYWs7Y2FzZSAzODE6bj0xNDI7YnJlYWs7Y2FzZSA4MjE2Om49MTQ1O2JyZWFrO2Nhc2UgODIxNzpuPTE0NjticmVhaztjYXNlIDgyMjA6bj0xNDc7YnJlYWs7Y2FzZSA4MjIxOm49MTQ4O2JyZWFrO2Nhc2UgODIyNjpuPTE0OTticmVhaztjYXNlIDgyMTE6bj0xNTA7YnJlYWs7Y2FzZSA4MjEyOm49MTUxO2JyZWFrO2Nhc2UgNzMyOm49MTUyO2JyZWFrO2Nhc2UgODQ4MjpuPTE1MzticmVhaztjYXNlIDM1MzpuPTE1NDticmVhaztjYXNlIDgyNTA6bj0xNTU7YnJlYWs7Y2FzZSAzMzk6bj0xNTY7YnJlYWs7Y2FzZSAzODI6bj0xNTg7YnJlYWs7Y2FzZSAzNzY6bj0xNTk7YnJlYWs7ZGVmYXVsdDp9cmV0dXJuIG59fSxlLlV0aWwuVVRGOH0pLG4oInV0aWxzL2Jhc2U2NCIsWyJqeGciLCJ1dGlscy9lbmNvZGluZyJdLGZ1bmN0aW9uKGUscil7ZnVuY3Rpb24gbihlLHIpe3JldHVybiAyNTUmZS5jaGFyQ29kZUF0KHIpfWZ1bmN0aW9uIHQoZSxyKXt2YXIgbj1vLmluZGV4T2YoZS5jaGFyQXQocikpO2lmKC0xPT09bil0aHJvdyBFcnJvcigiSlNYR3JhcGgvdXRpbHMvYmFzZTY0OiBDYW4ndCBkZWNvZGUgc3RyaW5nIChpbnZhbGlkIGNoYXJhY3RlcikuIik7cmV0dXJuIG59dmFyIG89IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGk9Ij0iO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuQmFzZTY0PXtlbmNvZGU6ZnVuY3Rpb24oZSl7dmFyIHQsYSx1LGMsZixzPVtdO2ZvcihmPXIuZW5jb2RlKGUpLHU9Zi5sZW5ndGgsYz11JTMsdD0wO3UtYz50O3QrPTMpYT1uKGYsdCk8PDE2fG4oZix0KzEpPDw4fG4oZix0KzIpLHMucHVzaChvLmNoYXJBdChhPj4xOCksby5jaGFyQXQoNjMmYT4+MTIpLG8uY2hhckF0KDYzJmE+PjYpLG8uY2hhckF0KDYzJmEpKTtzd2l0Y2goYyl7Y2FzZSAxOmE9bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjIpLG8uY2hhckF0KDYzJmE8PDQpLGksaSk7YnJlYWs7Y2FzZSAyOmE9bihmLHUtMik8PDh8bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjEwKSxvLmNoYXJBdCg2MyZhPj40KSxvLmNoYXJBdCg2MyZhPDwyKSxpKX1yZXR1cm4gcy5qb2luKCIiKX0sZGVjb2RlOmZ1bmN0aW9uKGUsbil7dmFyIG8sYSx1LGMsZixzLGw9W10scD1bXTtpZihvPWUucmVwbGFjZSgvW15BLVphLXowLTlcK1wvPV0vZywiIiksdT1vLmxlbmd0aCwwIT09dSU0KXRocm93IEVycm9yKCJKU1hHcmFwaC91dGlscy9iYXNlNjQ6IENhbid0IGRlY29kZSBzdHJpbmcgKGludmFsaWQgaW5wdXQgbGVuZ3RoKS4iKTtmb3Ioby5jaGFyQXQodS0xKT09PWkmJihjPTEsby5jaGFyQXQodS0yKT09PWkmJihjPTIpLHUtPTQpLGE9MDt1PmE7YSs9NClmPXQobyxhKTw8MTh8dChvLGErMSk8PDEyfHQobyxhKzIpPDw2fHQobyxhKzMpLHAucHVzaChmPj4xNiwyNTUmZj4+OCwyNTUmZiksMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxwKSkscD1bXSk7c3dpdGNoKGMpe2Nhc2UgMTpmPXQobyx1KTw8MTJ8dChvLHUrMSk8PDZ8dChvLHUrMikscC5wdXNoKGY+PjEwLDI1NSZmPj4yKTticmVhaztjYXNlIDI6Zj10KG8sYSk8PDZ8dChvLGErMSkscC5wdXNoKGY+PjQpfXJldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHApKSxzPWwuam9pbigiIiksbiYmKHM9ci5kZWNvZGUocykpLHN9LGRlY29kZUFzQXJyYXk6ZnVuY3Rpb24oZSl7dmFyIHIsbj10aGlzLmRlY29kZShlKSx0PVtdLG89bi5sZW5ndGg7Zm9yKHI9MDtvPnI7cisrKXRbcl09bi5jaGFyQ29kZUF0KHIpO3JldHVybiB0fX0sZS5VdGlsLkJhc2U2NH0pLG4oIi4uL2J1aWxkL2NvbXByZXNzb3IuZGVwcy5qcyIsWyJqeGciLCJ1dGlscy96aXAiLCJ1dGlscy9iYXNlNjQiXSxmdW5jdGlvbihlLHIsbil7cmV0dXJuIGUuZGVjb21wcmVzcz1mdW5jdGlvbihlKXtyZXR1cm4gdW5lc2NhcGUobmV3IHIuVW56aXAobi5kZWNvZGVBc0FycmF5KGUpKS51bnppcCgpWzBdWzBdKX0sZX0pLHdpbmRvdy5KWEc9cigiLi4vYnVpbGQvY29tcHJlc3Nvci5kZXBzLmpzIil9KSgpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cuZmlsZUxvYWRpbmcgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIGZpbGVMb2FkaW5nQ2FsbGJhY2tzID0ge307CiAgICB2YXIgdGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICBmdW5jdGlvbiBsb2FkS2V5d29yZHNGaWxlKGZpbGVuYW1lLCBjYWxsYmFjaykgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSA9IGNhbGxiYWNrOwogICAgICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOwogICAgICAgIC8vIHRpbWVzdGFtcCBhcyBhbiBhcmd1bWVudCB0byBwcmV2ZW50IGJyb3dzZXJzIGZyb20gY2FjaGluZyBzY3JpcHRzCiAgICAgICAgLy8gc2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg2NjYxOS9ob3ctdG8tZm9yY2UtaWUtdG8tcmVsb2FkLWphdmFzY3JpcHQKICAgICAgICBzY3JpcHQuc3JjID0gZmlsZW5hbWUrJz90aW1lPScrdGltZXN0YW1wOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHBhcmVudCkgewogICAgICAgIHZhciBjYWxsYWJsZUxpc3QgPSBbXTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxhYmxlKSB7CiAgICAgICAgICAgIGlmICghcGFyZW50LmlzQ2hpbGRyZW5Mb2FkZWQpIHsKICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdC5wdXNoKGNhbGxhYmxlKTsKICAgICAgICAgICAgICAgIGlmIChjYWxsYWJsZUxpc3QubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBsb2FkS2V5d29yZHNGaWxlKHBhcmVudC5jaGlsZEZpbGVOYW1lLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYWJsZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdFtpXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gbm90aWZ5RmlsZUxvYWRlZChmaWxlbmFtZSkgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSgpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBnZXRDYWxsYmFja0hhbmRsZXJGb3JLZXl3b3JkczogZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHMsCiAgICAgICAgbm90aWZ5OiBub3RpZnlGaWxlTG9hZGVkCiAgICB9Cn0oKSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5tb2RlbCA9IChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBTdWl0ZShkYXRhKSB7CiAgICAgICAgdmFyIHN1aXRlID0gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSk7CiAgICAgICAgc3VpdGUuc291cmNlID0gZGF0YS5zb3VyY2U7CiAgICAgICAgc3VpdGUucmVsYXRpdmVTb3VyY2UgPSBkYXRhLnJlbGF0aXZlU291cmNlOwogICAgICAgIHN1aXRlLmZ1bGxOYW1lID0gZGF0YS5wYXJlbnQgPyBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIGRhdGEubmFtZSA6IGRhdGEubmFtZTsKICAgICAgICBzdWl0ZS50eXBlID0gJ3N1aXRlJzsKICAgICAgICBzdWl0ZS50ZW1wbGF0ZSA9ICdzdWl0ZVRlbXBsYXRlJzsKICAgICAgICBzZXRTdGF0cyhzdWl0ZSwgZGF0YS5zdGF0aXN0aWNzKTsKICAgICAgICBzdWl0ZS5tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGE7CiAgICAgICAgc3VpdGUucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVUZXN0cyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdUZXN0Jyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVTdWl0ZXMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignU3VpdGUnKTsKICAgICAgICBzdWl0ZS5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJywgJ3N1aXRlJywgJ3Rlc3QnXTsKICAgICAgICBzdWl0ZS5jYWxsV2hlbkNoaWxkcmVuUmVhZHkgPSBmdW5jdGlvbiAoY2FsbGFibGUpIHsgY2FsbGFibGUoKTsgfTsKICAgICAgICBzdWl0ZS5tZXNzYWdlID0gZGF0YS5tZXNzYWdlOwogICAgICAgIHN1aXRlLmNoaWxkcmVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc3VpdGUua2V5d29yZHMoKS5jb25jYXQoc3VpdGUudGVzdHMoKSkuY29uY2F0KHN1aXRlLnN1aXRlcygpKTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLnNlYXJjaFRlc3RzID0gZnVuY3Rpb24gKHByZWRpY2F0ZSkgewogICAgICAgICAgICB2YXIgdGVzdHMgPSBbXTsKICAgICAgICAgICAgdmFyIHN1aXRlcyA9IHRoaXMuc3VpdGVzKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc3VpdGVzKQogICAgICAgICAgICAgICAgdGVzdHMgPSB0ZXN0cy5jb25jYXQoc3VpdGVzW2ldLnNlYXJjaFRlc3RzKHByZWRpY2F0ZSkpOwogICAgICAgICAgICByZXR1cm4gdGVzdHMuY29uY2F0KHV0aWwuZmlsdGVyKHRoaXMudGVzdHMoKSwgcHJlZGljYXRlKSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5zZWFyY2hUZXN0c0luU3VpdGUgPSBmdW5jdGlvbiAocGF0dGVybiwgbWF0Y2hlcikgewogICAgICAgICAgICBpZiAoIW1hdGNoZXIpCiAgICAgICAgICAgICAgICBtYXRjaGVyID0gdXRpbC5NYXRjaGVyKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzQW55KFtzdWl0ZS5mdWxsTmFtZSwgc3VpdGUubmFtZV0pKQogICAgICAgICAgICAgICAgcmV0dXJuIHN1aXRlLmFsbFRlc3RzKCk7CiAgICAgICAgICAgIHZhciB0ZXN0cyA9IFtdOwogICAgICAgICAgICB2YXIgc3VpdGVzID0gdGhpcy5zdWl0ZXMoKTsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzdWl0ZXMpCiAgICAgICAgICAgICAgICB0ZXN0cyA9IHRlc3RzLmNvbmNhdChzdWl0ZXNbaV0uc2VhcmNoVGVzdHNJblN1aXRlKHBhdHRlcm4sIG1hdGNoZXIpKTsKICAgICAgICAgICAgcmV0dXJuIHRlc3RzOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuc2VhcmNoVGVzdHNCeVRhZyA9IGZ1bmN0aW9uICh0YWcpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICBpZiAodGFnLmNvbWJpbmVkKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdC50YWdzLCB0YWcuY29tYmluZWQpOwogICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVGFnKHRlc3QudGFncywgdGFnLmxhYmVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5maW5kU3VpdGVCeU5hbWUgPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gZmluZFN1aXRlQnlOYW1lKHN1aXRlLCBuYW1lKTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLmFsbFRlc3RzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc3VpdGUuc2VhcmNoVGVzdHMoZnVuY3Rpb24gKHRlc3QpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBzdWl0ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnRhaW5zVGFnKHRlc3RUYWdzLCB0YWduYW1lKSB7CiAgICAgICAgdGVzdFRhZ3MgPSB1dGlsLm1hcCh0ZXN0VGFncywgdXRpbC5ub3JtYWxpemUpOwogICAgICAgIHJldHVybiB1dGlsLmNvbnRhaW5zKHRlc3RUYWdzLCB1dGlsLm5vcm1hbGl6ZSh0YWduYW1lKSk7CiAgICB9CiAgICBmdW5jdGlvbiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHBhdHRlcm4pIHsKICAgICAgICB2YXIgcGF0dGVybnM7CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignTk9UJykgIT0gLTEpIHsKICAgICAgICAgICAgcGF0dGVybnMgPSBwYXR0ZXJuLnNwbGl0KCdOT1QnKTsKICAgICAgICAgICAgaWYgKCF1dGlsLm5vcm1hbGl6ZShwYXR0ZXJuc1swXSkpCiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5hbGwodXRpbC5tYXAocGF0dGVybnMuc2xpY2UoMSksIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwYXR0ZXJuc1swXSkgJiYKICAgICAgICAgICAgICAgIHV0aWwuYWxsKHV0aWwubWFwKHBhdHRlcm5zLnNsaWNlKDEpLCBmdW5jdGlvbiAocCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignT1InKSAhPSAtMSkgewogICAgICAgICAgICBwYXR0ZXJucyA9IHBhdHRlcm4uc3BsaXQoJ09SJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFueSh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ0FORCcpICE9IC0xKSB7CiAgICAgICAgICAgIHBhdHRlcm5zID0gcGF0dGVybi5zcGxpdCgnQU5EJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFsbCh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1dGlsLk1hdGNoZXIocGF0dGVybikubWF0Y2hlc0FueSh0ZXN0VGFncyk7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kU3VpdGVCeU5hbWUoc3VpdGUsIG5hbWUpIHsKICAgICAgICBpZiAoc3VpdGUuZnVsbE5hbWUgPT0gbmFtZSkKICAgICAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgICAgIHZhciBzdWJTdWl0ZXMgPSBzdWl0ZS5zdWl0ZXMoKTsKICAgICAgICBmb3IgKHZhciBpIGluIHN1YlN1aXRlcykgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmaW5kU3VpdGVCeU5hbWUoc3ViU3VpdGVzW2ldLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG1hdGNoKQogICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFN0YXRzKHN1aXRlLCBzdGF0cykgewogICAgICAgIGZvciAodmFyIG5hbWUgaW4gc3RhdHMpIHsKICAgICAgICAgICAgc3VpdGVbbmFtZV0gPSBzdGF0c1tuYW1lXTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVNb2RlbE9iamVjdChkYXRhKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lLAogICAgICAgICAgICBkb2M6IGRhdGEuZG9jLAogICAgICAgICAgICBzdGF0dXM6IGRhdGEuc3RhdHVzLAogICAgICAgICAgICB0aW1lczogZGF0YS50aW1lcywKICAgICAgICAgICAgaWQ6IGRhdGEucGFyZW50ID8gZGF0YS5wYXJlbnQuaWQgKyAnLScgKyBkYXRhLmlkIDogZGF0YS5pZAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBUZXN0KGRhdGEpIHsKICAgICAgICB2YXIgdGVzdCA9IGNyZWF0ZU1vZGVsT2JqZWN0KGRhdGEpOwogICAgICAgIHRlc3QudHlwZSA9ICd0ZXN0JzsKICAgICAgICB0ZXN0LnRlbXBsYXRlID0gJ3Rlc3RUZW1wbGF0ZSc7CiAgICAgICAgdGVzdC5mdWxsTmFtZSA9IGRhdGEucGFyZW50LmZ1bGxOYW1lICsgJy4nICsgdGVzdC5uYW1lOwogICAgICAgIHRlc3QuZm9ybWF0UGFyZW50TmFtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWwuZm9ybWF0UGFyZW50TmFtZSh0ZXN0KTsgfTsKICAgICAgICB0ZXN0LnRpbWVvdXQgPSBkYXRhLnRpbWVvdXQ7CiAgICAgICAgdGVzdC5wb3B1bGF0ZUtleXdvcmRzID0gY3JlYXRlSXRlcmFibGVQb3B1bGF0b3IoJ0tleXdvcmQnKTsKICAgICAgICB0ZXN0LmNoaWxkcmVuTmFtZXMgPSBbJ2tleXdvcmQnXTsKICAgICAgICB0ZXN0LmlzQ2hpbGRyZW5Mb2FkZWQgPSBkYXRhLmlzQ2hpbGRyZW5Mb2FkZWQ7CiAgICAgICAgdGVzdC5jYWxsV2hlbkNoaWxkcmVuUmVhZHkgPSB3aW5kb3cuZmlsZUxvYWRpbmcuZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHModGVzdCk7CiAgICAgICAgdGVzdC5jaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRlc3QuaXNDaGlsZHJlbkxvYWRlZCkKICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0LmtleXdvcmRzKCk7CiAgICAgICAgfTsKICAgICAgICB0ZXN0LnRhZ3MgPSBkYXRhLnRhZ3M7CiAgICAgICAgdGVzdC5tZXNzYWdlID0gZGF0YS5tZXNzYWdlOwogICAgICAgIHRlc3QubWF0Y2hlc1RhZ1BhdHRlcm4gPSBmdW5jdGlvbiAocGF0dGVybikgewogICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3QudGFncywgcGF0dGVybik7CiAgICAgICAgfTsKICAgICAgICB0ZXN0Lm1hdGNoZXNOYW1lUGF0dGVybiA9IGZ1bmN0aW9uIChwYXR0ZXJuKSB7CiAgICAgICAgICAgIHJldHVybiB1dGlsLk1hdGNoZXIocGF0dGVybikubWF0Y2hlc0FueShbdGVzdC5uYW1lLCB0ZXN0LmZ1bGxOYW1lXSk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gdGVzdDsKICAgIH0KICAgIGZ1bmN0aW9uIEtleXdvcmQoZGF0YSkgewogICAgICAgIHZhciBrdyA9IGNyZWF0ZU1vZGVsT2JqZWN0KGRhdGEpOwogICAgICAgIGt3LmxpYm5hbWUgPSBkYXRhLmxpYm5hbWU7CiAgICAgICAga3cuZnVsbE5hbWUgPSAoa3cubGlibmFtZSA/IGt3LmxpYm5hbWUgKyAnLicgOiAnJykgKyBrdy5uYW1lOwogICAgICAgIGt3LnR5cGUgPSBkYXRhLnR5cGU7CiAgICAgICAga3cudGVtcGxhdGUgPSAna2V5d29yZFRlbXBsYXRlJzsKICAgICAgICBrdy5hcmd1bWVudHMgPSBkYXRhLmFyZ3M7CiAgICAgICAga3cuYXNzaWduID0gZGF0YS5hc3NpZ24gKyAoZGF0YS5hc3NpZ24gPyAnID0nIDogJycpOwogICAgICAgIGt3LnRhZ3MgPSBkYXRhLnRhZ3M7CiAgICAgICAga3cudGltZW91dCA9IGRhdGEudGltZW91dDsKICAgICAgICBrdy5wb3B1bGF0ZUtleXdvcmRzID0gY3JlYXRlSXRlcmFibGVQb3B1bGF0b3IoJ0tleXdvcmQnKTsKICAgICAgICBrdy5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJ107CiAgICAgICAga3cuaXNDaGlsZHJlbkxvYWRlZCA9IGRhdGEuaXNDaGlsZHJlbkxvYWRlZDsKICAgICAgICBrdy5jYWxsV2hlbkNoaWxkcmVuUmVhZHkgPSB3aW5kb3cuZmlsZUxvYWRpbmcuZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHMoa3cpOwogICAgICAgIGt3LmNoaWxkcmVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoa3cuaXNDaGlsZHJlbkxvYWRlZCkKICAgICAgICAgICAgICAgIHJldHVybiBrdy5rZXl3b3JkcygpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGt3OwogICAgfQogICAgZnVuY3Rpb24gTWVzc2FnZShsZXZlbCwgZGF0ZSwgdGV4dCwgbGluaykgewogICAgICAgIHZhciBtZXNzYWdlID0gewogICAgICAgICAgICB0eXBlOiAnbWVzc2FnZScsCiAgICAgICAgICAgIHRlbXBsYXRlOiAnbWVzc2FnZVRlbXBsYXRlJywKICAgICAgICAgICAgbGV2ZWw6IGxldmVsLAogICAgICAgICAgICB0aW1lOiB1dGlsLnRpbWVGcm9tRGF0ZShkYXRlKSwKICAgICAgICAgICAgZGF0ZTogdXRpbC5kYXRlRnJvbURhdGUoZGF0ZSksCiAgICAgICAgICAgIHRleHQ6IHRleHQsCiAgICAgICAgICAgIGxpbms6IGxpbmsKICAgICAgICB9OwogICAgICAgIG1lc3NhZ2UuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gZnVuY3Rpb24gKGNhbGxhYmxlKSB7IGNhbGxhYmxlKCk7IH07CiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICB9CiAgICBmdW5jdGlvbiBUaW1lcyh0aW1lZGF0YSkgewogICAgICAgIHZhciBzdGFydCA9IHRpbWVkYXRhWzBdOwogICAgICAgIHZhciBlbmQgPSB0aW1lZGF0YVsxXTsKICAgICAgICB2YXIgZWxhcHNlZCA9IHRpbWVkYXRhWzJdOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGVsYXBzZWRNaWxsaXM6IGVsYXBzZWQsCiAgICAgICAgICAgIGVsYXBzZWRUaW1lOiB1dGlsLmZvcm1hdEVsYXBzZWQoZWxhcHNlZCksCiAgICAgICAgICAgIHN0YXJ0VGltZTogdXRpbC5kYXRlVGltZUZyb21EYXRlKHN0YXJ0KSwKICAgICAgICAgICAgZW5kVGltZTogIHV0aWwuZGF0ZVRpbWVGcm9tRGF0ZShlbmQpCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKG5hbWUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHBvcHVsYXRvcikgewogICAgICAgICAgICBwb3B1bGF0ZUl0ZXJhYmxlKHRoaXMsIG5hbWUsIHBvcHVsYXRvcik7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvcHVsYXRlSXRlcmFibGUob2JqLCBuYW1lLCBwb3B1bGF0b3IpIHsKICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpICsgJ3MnOwogICAgICAgIG9ialtuYW1lXSA9IGNyZWF0ZUdldEFsbEZ1bmN0aW9uKHBvcHVsYXRvci5udW1iZXJPZkl0ZW1zLCBwb3B1bGF0b3IuY3JlYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVHZXRBbGxGdW5jdGlvbihudW1iZXJPZkVsZW1lbnRzLCBjcmVhdG9yKSB7CiAgICAgICAgdmFyIGNhY2hlZCA9IG51bGw7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGNhY2hlZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FjaGVkID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bWJlck9mRWxlbWVudHMoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVkLnB1c2goY3JlYXRvcihpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBTdWl0ZTogU3VpdGUsCiAgICAgICAgVGVzdDogVGVzdCwKICAgICAgICBLZXl3b3JkOiBLZXl3b3JkLAogICAgICAgIE1lc3NhZ2U6IE1lc3NhZ2UsCiAgICAgICAgVGltZXM6IFRpbWVzLAogICAgICAgIGNvbnRhaW5zVGFnOiBjb250YWluc1RhZywgIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICAgICAgY29udGFpbnNUYWdQYXR0ZXJuOiBjb250YWluc1RhZ1BhdHRlcm4gIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICB9Owp9KCkpOwp3aW5kb3cuc3RhdHMgPSAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gU3RhdGlzdGljcyh0b3RhbEVsZW1zLCB0YWdFbGVtcywgc3VpdGVFbGVtcykgewogICAgICAgIHJldHVybiB7dG90YWw6IHV0aWwubWFwKHRvdGFsRWxlbXMsIHRvdGFsU3RhdEVsZW0pLAogICAgICAgICAgICAgICAgdGFnOiAgIHV0aWwubWFwKHRhZ0VsZW1zLCB0YWdTdGF0RWxlbSksCiAgICAgICAgICAgICAgICBzdWl0ZTogdXRpbC5tYXAoc3VpdGVFbGVtcywgc3VpdGVTdGF0RWxlbSl9OwogICAgfQogICAgZnVuY3Rpb24gc3RhdEVsZW0oc3RhdCkgewogICAgICAgIHN0YXQudG90YWwgPSBzdGF0LnBhc3MgKyBzdGF0LmZhaWwgKyBzdGF0LnNraXA7CiAgICAgICAgdmFyIHBlcmNlbnRzID0gY2FsY3VsYXRlUGVyY2VudHMoc3RhdC50b3RhbCwgc3RhdC5wYXNzLCBzdGF0LmZhaWwsIHN0YXQuc2tpcCk7CiAgICAgICAgc3RhdC5wYXNzUGVyY2VudCA9IHBlcmNlbnRzWzBdOwogICAgICAgIHN0YXQuc2tpcFBlcmNlbnQgPSBwZXJjZW50c1sxXTsKICAgICAgICBzdGF0LmZhaWxQZXJjZW50ID0gcGVyY2VudHNbMl07CiAgICAgICAgdmFyIHdpZHRocyA9IGNhbGN1bGF0ZVdpZHRocyhzdGF0LnBhc3NQZXJjZW50LCBzdGF0LnNraXBQZXJjZW50LCBzdGF0LmZhaWxQZXJjZW50KTsKICAgICAgICBzdGF0LnBhc3NXaWR0aCA9IHdpZHRoc1swXTsKICAgICAgICBzdGF0LnNraXBXaWR0aCA9IHdpZHRoc1sxXTsKICAgICAgICBzdGF0LmZhaWxXaWR0aCA9IHdpZHRoc1syXTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHRvdGFsU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC50eXBlID0gJ2FsbCc7CiAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICB9CiAgICBmdW5jdGlvbiB0YWdTdGF0RWxlbShkYXRhKSB7CiAgICAgICAgdmFyIHN0YXQgPSBzdGF0RWxlbShkYXRhKTsKICAgICAgICBzdGF0LmxpbmtzID0gcGFyc2VMaW5rcyhzdGF0LmxpbmtzKTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHN1aXRlU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC5mdWxsTmFtZSA9IHN0YXQubGFiZWw7CiAgICAgICAgc3RhdC5mb3JtYXRQYXJlbnROYW1lID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdXRpbC5mb3JtYXRQYXJlbnROYW1lKHN0YXQpOyB9OwogICAgICAgIHJldHVybiBzdGF0OwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VMaW5rcyhsaW5rc0RhdGEpIHsKICAgICAgICBpZiAoIWxpbmtzRGF0YSkKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIHJldHVybiB1dGlsLm1hcChsaW5rc0RhdGEuc3BsaXQoJzo6OicpLCBmdW5jdGlvbiAobGluaykgewogICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gbGluay5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgICAgICByZXR1cm4ge3RpdGxlOiBsaW5rLnNsaWNlKDAsIGluZGV4KSwgdXJsOiBsaW5rLnNsaWNlKGluZGV4KzEpfTsKICAgICAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBjYWxjdWxhdGVQZXJjZW50cyh0b3RhbCwgcGFzc2VkLCBmYWlsZWQsIHNraXBwZWQpIHsKICAgICAgICBpZiAodG90YWwgPT0gMCkgewogICAgICAgICAgICByZXR1cm4gWzAuMCwgMC4wLCAwLjBdOwogICAgICAgIH0KICAgICAgICB2YXIgcGFzcyA9IDEwMC4wICogcGFzc2VkIC8gdG90YWw7CiAgICAgICAgdmFyIHNraXAgPSAxMDAuMCAqIHNraXBwZWQgLyB0b3RhbDsKICAgICAgICB2YXIgZmFpbCA9IDEwMC4wICogZmFpbGVkIC8gdG90YWw7CiAgICAgICAgaWYgKHBhc3MgPiAwICYmIHBhc3MgPCAwLjEpCiAgICAgICAgICAgIHBhc3MgPSAwLjEKICAgICAgICBpZiAoZmFpbCA+IDAgJiYgZmFpbCA8IDAuMSkKICAgICAgICAgICAgZmFpbCA9IDAuMQogICAgICAgIGlmIChza2lwID4gMCAmJiBza2lwIDwgMC4xKQogICAgICAgICAgICBza2lwID0gMC4xCiAgICAgICAgaWYgKHBhc3MgPiA5OS45NSAmJiBwYXNzIDwgMTAwKQogICAgICAgICAgICBwYXNzID0gOTkuOQogICAgICAgIGlmIChmYWlsID4gOTkuOTUgJiYgZmFpbCA8IDEwMCkKICAgICAgICAgICAgZmFpbCA9IDk5LjkKICAgICAgICBpZiAoc2tpcCA+IDk5Ljk1ICYmIHNraXAgPCAxMDApCiAgICAgICAgICAgIHNraXAgPSA5OS45CiAgICAgICAgcmV0dXJuIFtNYXRoLnJvdW5kKHBhc3MqMTApLzEwLCBNYXRoLnJvdW5kKHNraXAqMTApLzEwLCBNYXRoLnJvdW5kKGZhaWwqMTApLzEwXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZVdpZHRocyhudW0xLCBudW0yLCBudW0zKSB7CiAgICAgICAgaWYgKG51bTEgKyBudW0yICsgbnVtMyA9PT0gMCkKICAgICAgICAgICAgcmV0dXJuIFswLjAsIDAuMCwgMC4wXTsKICAgICAgICAvLyBNYWtlIHNtYWxsIHBlcmNlbnRhZ2VzIGJldHRlciB2aXNpYmxlCiAgICAgICAgaWYgKG51bTEgPiAwICYmIG51bTEgPCAxKQogICAgICAgICAgICBudW0xID0gMQogICAgICAgIGlmIChudW0yID4gMCAmJiBudW0yIDwgMSkKICAgICAgICAgICAgbnVtMiA9IDEKICAgICAgICBpZiAobnVtMyA+IDAgJiYgbnVtMyA8IDEpCiAgICAgICAgICAgIG51bTMgPSAxCiAgICAgICAgLy8gSGFuZGxlIHNpdHVhdGlvbiB3aGVyZSBzb21lIGFyZSByb3VuZGVkIHVwCiAgICAgICAgd2hpbGUgKG51bTEgKyBudW0yICsgbnVtMyA+IDEwMCkgewogICAgICAgICAgICBpZiAobnVtMSA+IG51bTIgJiYgbnVtMSA+IG51bTMpCiAgICAgICAgICAgICAgICBudW0xIC09IDAuMTsKICAgICAgICAgICAgZWxzZSBpZiAobnVtMiA+IG51bTEgJiYgbnVtMiA+IG51bTMpCiAgICAgICAgICAgICAgICBudW0yIC09IDAuMTsKICAgICAgICAgICAgZWxzZSBpZiAobnVtMyA+IG51bTEgJiYgbnVtMyA+IG51bTIpCiAgICAgICAgICAgICAgICBudW0zIC09IDAuMTsKICAgICAgICAgICAgZWxzZSBpZiAobnVtMSA+IG51bTMgJiYgbnVtMSA9PSBudW0yKSB7CiAgICAgICAgICAgICAgICBudW0xIC09IDAuMTsKICAgICAgICAgICAgICAgIG51bTIgLT0gMC4xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG51bTEgPiBudW0yICYmIG51bTEgPT0gbnVtMykgewogICAgICAgICAgICAgICAgbnVtMSAtPSAwLjE7CiAgICAgICAgICAgICAgICBudW0zIC09IDAuMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChudW0yID4gbnVtMSAmJiBudW0yID09IG51bTMpIHsKICAgICAgICAgICAgICAgIG51bTIgLT0gMC4xOwogICAgICAgICAgICAgICAgbnVtMyAtPSAwLjE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtNYXRoLmNlaWwobnVtMSoxMCkvMTAsIE1hdGguY2VpbChudW0yKjEwKS8xMCwgTWF0aC5jZWlsKG51bTMqMTApLzEwXTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgU3RhdGlzdGljczogU3RhdGlzdGljcwogICAgfTsKfSgpKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LnV0aWwgPSBmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBtYXAoZWxlbXMsIGZ1bmMpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIHJldFtpXSA9IGZ1bmMoZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gZmlsdGVyKGVsZW1zLCBwcmVkaWNhdGUpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZWxlbXNbaV0pKQogICAgICAgICAgICAgICAgcmV0LnB1c2goZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gYWxsKGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmICghZWxlbXNbaV0pCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gYW55KGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChlbGVtc1tpXSkKICAgICAgICAgICAgICAgIHJldHVybiBlbGVtc1tpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gY29udGFpbnMoZWxlbXMsIGUpIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgaWYgKGVsZW1zW2ldID09IGUpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gbGFzdChpdGVtcykgewogICAgICAgIHJldHVybiBpdGVtc1tpdGVtcy5sZW5ndGgtMV07CiAgICB9CiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyZsdDsvZywgJzwnKS5yZXBsYWNlKC8mZ3Q7L2csICc+JykucmVwbGFjZSgvJmFtcDsvZywgJyYnKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTsKICAgIH0KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnJykucmVwbGFjZSgvXy9nLCAnJyk7CiAgICB9CiAgICBmdW5jdGlvbiByZWdleHBFc2NhcGUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLVtcXXt9KCkrPyouLFxcXiR8I10vZywgIlxcJCYiKTsKICAgIH0KICAgIGZ1bmN0aW9uIE1hdGNoZXIocGF0dGVybikgewogICAgICAgIHBhdHRlcm4gPSByZWdleHBFc2NhcGUobm9ybWFsaXplKHBhdHRlcm4pKTsKICAgICAgICB2YXIgcmVQYXR0ZXJuID0gJ14nICsgcGF0dGVybi5yZXBsYWNlKC9cXFw/L2csICcuJykucmVwbGFjZSgvXFxcKi9nLCAnW1xcc1xcU10qJykgKyAnJCc7CiAgICAgICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAocmVQYXR0ZXJuKTsKICAgICAgICBmdW5jdGlvbiBtYXRjaGVzKHN0cmluZykgewogICAgICAgICAgICByZXR1cm4gcmVnZXhwLnRlc3Qobm9ybWFsaXplKHN0cmluZykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICBtYXRjaGVzOiBtYXRjaGVzLAogICAgICAgICAgICBtYXRjaGVzQW55OiBmdW5jdGlvbiAoc3RyaW5ncykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0cmluZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspCiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMoc3RyaW5nc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1hdFBhcmVudE5hbWUoaXRlbSkgewogICAgICAgIHZhciBwYXJlbnROYW1lID0gaXRlbS5mdWxsTmFtZS5zbGljZSgwLCBpdGVtLmZ1bGxOYW1lLmxlbmd0aCAtIGl0ZW0ubmFtZS5sZW5ndGgpOwogICAgICAgIHJldHVybiBwYXJlbnROYW1lLnJlcGxhY2UoL1wuL2csICcgLiAnKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRpbWVGcm9tRGF0ZShkYXRlKSB7CiAgICAgICAgaWYgKCFkYXRlKQogICAgICAgICAgICByZXR1cm4gJ04vQSc7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlLmdldFNlY29uZHMoKSwgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSk7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlRnJvbURhdGUoZGF0ZSkgewogICAgICAgIGlmICghZGF0ZSkKICAgICAgICAgICAgcmV0dXJuICdOL0EnOwogICAgICAgIHJldHVybiBwYWRUbyhkYXRlLmdldEZ1bGxZZWFyKCksIDQpICsKICAgICAgICAgICAgICAgcGFkVG8oZGF0ZS5nZXRNb250aCgpICsgMSwgMikgKwogICAgICAgICAgICAgICBwYWRUbyhkYXRlLmdldERhdGUoKSwgMik7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlVGltZUZyb21EYXRlKGRhdGUpIHsKICAgICAgICBpZiAoIWRhdGUpCiAgICAgICAgICAgIHJldHVybiAnTi9BJzsKICAgICAgICByZXR1cm4gZGF0ZUZyb21EYXRlKGRhdGUpICsgJyAnICsgdGltZUZyb21EYXRlKGRhdGUpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0VGltZShob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzKSB7CiAgICAgICAgcmV0dXJuIHBhZFRvKGhvdXJzLCAyKSArICc6JyArCiAgICAgICAgICAgICAgIHBhZFRvKG1pbnV0ZXMsIDIpICsgJzonICsKICAgICAgICAgICAgICAgcGFkVG8oc2Vjb25kcywgMikgKyAnLicgKwogICAgICAgICAgICAgICBwYWRUbyhtaWxsaXNlY29uZHMsIDMpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0RWxhcHNlZChlbGFwc2VkKSB7CiAgICAgICAgdmFyIG1pbGxpcyA9IGVsYXBzZWQ7CiAgICAgICAgdmFyIGhvdXJzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAoNjAgKiA2MCAqIDEwMDApKTsKICAgICAgICBtaWxsaXMgLT0gaG91cnMgKiA2MCAqIDYwICogMTAwMDsKICAgICAgICB2YXIgbWludXRlcyA9IE1hdGguZmxvb3IobWlsbGlzIC8gKDYwICogMTAwMCkpOwogICAgICAgIG1pbGxpcyAtPSBtaW51dGVzICogNjAgKiAxMDAwOwogICAgICAgIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAxMDAwKTsKICAgICAgICBtaWxsaXMgLT0gc2Vjb25kcyAqIDEwMDA7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpcyk7CiAgICB9CiAgICBmdW5jdGlvbiBwYWRUbyhudW1iZXIsIGxlbikgewogICAgICAgIHZhciBudW1TdHJpbmcgPSBudW1iZXIgKyAiIjsKICAgICAgICB3aGlsZSAobnVtU3RyaW5nLmxlbmd0aCA8IGxlbikgbnVtU3RyaW5nID0gIjAiICsgbnVtU3RyaW5nOwogICAgICAgIHJldHVybiBudW1TdHJpbmc7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lc3RhbXAobWlsbGlzKSB7CiAgICAgICAgLy8gdXNlZCBhbHNvIGJ5IHRvb2xzIHRoYXQgZG8gbm90IHNldCB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMKICAgICAgICB2YXIgYmFzZSA9IHdpbmRvdy5vdXRwdXQgPyB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMgOiAwOwogICAgICAgIHJldHVybiBuZXcgRGF0ZShiYXNlICsgbWlsbGlzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZFN0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRpbWVzdGFtcCk7CiAgICAgICAgdmFyIGR0ID0gZGF0ZVRpbWVGcm9tRGF0ZShkYXRlKS5zbGljZSgwLCAxNyk7ICAvLyBkcm9wIG1pbGxpcwogICAgICAgIHZhciBvZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICAgICAgdmFyIHNpZ24gPSBvZmZzZXQgPiAwID8gJy0nIDogJysnOwogICAgICAgIHZhciBoaCA9IE1hdGguZmxvb3IoTWF0aC5hYnMob2Zmc2V0KSAvIDYwKTsKICAgICAgICB2YXIgbW0gPSBNYXRoLmFicyhvZmZzZXQpICUgNjA7CiAgICAgICAgcmV0dXJuIGR0ICsgJyBVVEMnICsgc2lnbiArIHBhZFRvKGhoLCAyKSArICc6JyArIHBhZFRvKG1tLCAyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICBmdW5jdGlvbiB0aW1lU3RyaW5nKHRpbWUsIHNob3J0VW5pdCkgewogICAgICAgICAgICB2YXIgdW5pdCA9IHt5OiAneWVhcicsIGQ6ICdkYXknLCBoOiAnaG91cicsIG06ICdtaW51dGUnLAogICAgICAgICAgICAgICAgICAgICAgICBzOiAnc2Vjb25kJ31bc2hvcnRVbml0XTsKICAgICAgICAgICAgdmFyIGVuZCA9IHRpbWUgPT0gMSA/ICcgJyA6ICdzICc7CiAgICAgICAgICAgIHJldHVybiB0aW1lICsgJyAnICsgdW5pdCArIGVuZDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY29tcGVuc2F0ZUxlYXBZZWFycyhkYXlzLCB5ZWFycykgewogICAgICAgICAgICAvLyBOb3QgYSBwZXJmZWN0IGFsZ29yaXRobSBidXQgb3VnaHQgdG8gYmUgZW5vdWdoCiAgICAgICAgICAgIHJldHVybiBkYXlzIC0gTWF0aC5mbG9vcih5ZWFycyAvIDQpOwogICAgICAgIH0KICAgICAgICB2YXIgZ2VuZXJhdGVkID0gTWF0aC5yb3VuZCh0aW1lc3RhbXAgLyAxMDAwKTsKICAgICAgICB2YXIgY3VycmVudCA9IE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKTsKICAgICAgICB2YXIgZWxhcHNlZCA9IGN1cnJlbnQgLSBnZW5lcmF0ZWQ7CiAgICAgICAgdmFyIHByZWZpeCA9ICcnOwogICAgICAgIGlmIChlbGFwc2VkIDwgMCkgewogICAgICAgICAgICBwcmVmaXggPSAnLSAnOwogICAgICAgICAgICBlbGFwc2VkID0gTWF0aC5hYnMoZWxhcHNlZCk7CiAgICAgICAgfQogICAgICAgIHZhciBzZWNzICA9IGVsYXBzZWQgJSA2MDsKICAgICAgICB2YXIgbWlucyAgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyA2MCkgJSA2MDsKICAgICAgICB2YXIgaG91cnMgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyAoNjAqNjApKSAlIDI0OwogICAgICAgIHZhciBkYXlzICA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCkpICUgMzY1OwogICAgICAgIHZhciB5ZWFycyA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCozNjUpKTsKICAgICAgICBpZiAoeWVhcnMpIHsKICAgICAgICAgICAgZGF5cyA9IGNvbXBlbnNhdGVMZWFwWWVhcnMoZGF5cywgeWVhcnMpOwogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyh5ZWFycywgJ3knKSArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKTsKICAgICAgICB9IGVsc2UgaWYgKGRheXMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKSArIHRpbWVTdHJpbmcoaG91cnMsICdoJyk7CiAgICAgICAgfSBlbHNlIGlmIChob3VycykgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhob3VycywgJ2gnKSArIHRpbWVTdHJpbmcobWlucywgJ20nKTsKICAgICAgICB9IGVsc2UgaWYgKG1pbnMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcobWlucywgJ20nKSArIHRpbWVTdHJpbmcoc2VjcywgJ3MnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhzZWNzLCAncycpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmcocXVlcnkpIHsKICAgICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgICAgaWYgKCFxdWVyeSkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB2YXIgcGFyYW1zID0gcXVlcnkuc3BsaXQoJyYnKTsKICAgICAgICB2YXIgcGFydHM7CiAgICAgICAgZnVuY3Rpb24gZGVjb2RlKGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChpdGVtLnJlcGxhY2UoJysnLCAnICcpKTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcmFtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBwYXJ0cyA9IHBhcmFtc1tpXS5zcGxpdCgnPScpOwogICAgICAgICAgICByZXN1bHRbZGVjb2RlKHBhcnRzLnNoaWZ0KCkpXSA9IGRlY29kZShwYXJ0cy5qb2luKCc9JykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBtYXA6IG1hcCwKICAgICAgICBmaWx0ZXI6IGZpbHRlciwKICAgICAgICBhbGw6IGFsbCwKICAgICAgICBhbnk6IGFueSwKICAgICAgICBjb250YWluczogY29udGFpbnMsCiAgICAgICAgbGFzdDogbGFzdCwKICAgICAgICBlc2NhcGU6IGVzY2FwZSwKICAgICAgICB1bmVzY2FwZTogdW5lc2NhcGUsCiAgICAgICAgbm9ybWFsaXplOiBub3JtYWxpemUsCiAgICAgICAgcmVnZXhwRXNjYXBlOiByZWdleHBFc2NhcGUsCiAgICAgICAgTWF0Y2hlcjogTWF0Y2hlciwKICAgICAgICBmb3JtYXRQYXJlbnROYW1lOiBmb3JtYXRQYXJlbnROYW1lLAogICAgICAgIHRpbWVGcm9tRGF0ZTogdGltZUZyb21EYXRlLAogICAgICAgIGRhdGVGcm9tRGF0ZTogZGF0ZUZyb21EYXRlLAogICAgICAgIGRhdGVUaW1lRnJvbURhdGU6IGRhdGVUaW1lRnJvbURhdGUsCiAgICAgICAgZm9ybWF0RWxhcHNlZDogZm9ybWF0RWxhcHNlZCwKICAgICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcCwKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRTdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZFN0cmluZywKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZywKICAgICAgICBwYXJzZVF1ZXJ5U3RyaW5nOiBwYXJzZVF1ZXJ5U3RyaW5nCiAgICB9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy50ZXN0ZGF0YSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBlbGVtZW50c0J5SWQgPSB7fTsKICAgIHZhciBpZENvdW50ZXIgPSAwOwogICAgdmFyIF9zdGF0aXN0aWNzID0gbnVsbDsKICAgIHZhciBMRVZFTFMgPSBbJ1RSQUNFJywgJ0RFQlVHJywgJ0lORk8nLCAnV0FSTicsICdFUlJPUicsICdGQUlMJywgJ1NLSVAnXTsKICAgIHZhciBTVEFUVVNFUyA9IFsnRkFJTCcsICdQQVNTJywgJ1NLSVAnLCAnTk9UIFJVTiddOwogICAgdmFyIEtFWVdPUkRfVFlQRVMgPSBbJ0tFWVdPUkQnLCAnU0VUVVAnLCAnVEVBUkRPV04nLCAnRk9SJywgJ1ZBUicsICdJRicsICdFTFNFIElGJywgJ0VMU0UnXTsKICAgIHZhciBNRVNTQUdFX1RZUEUgPSA4OwogICAgZnVuY3Rpb24gYWRkRWxlbWVudChlbGVtKSB7CiAgICAgICAgaWYgKCFlbGVtLmlkKQogICAgICAgICAgICBlbGVtLmlkID0gdW5pcXVlSWQoKTsKICAgICAgICBlbGVtZW50c0J5SWRbZWxlbS5pZF0gPSBlbGVtOwogICAgICAgIHJldHVybiBlbGVtOwogICAgfQogICAgZnVuY3Rpb24gdW5pcXVlSWQoKSB7CiAgICAgICAgaWRDb3VudGVyKys7CiAgICAgICAgcmV0dXJuICdlbGVtZW50LWlkLScgKyBpZENvdW50ZXI7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lcyhzdGF0cykgewogICAgICAgIHZhciBzdGFydE1pbGxpcyA9IHN0YXRzWzFdOwogICAgICAgIHZhciBlbGFwc2VkID0gc3RhdHNbMl07CiAgICAgICAgaWYgKHN0YXJ0TWlsbGlzID09PSBudWxsKQogICAgICAgICAgICByZXR1cm4gW251bGwsIG51bGwsIGVsYXBzZWRdOwogICAgICAgIHJldHVybiBbdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMpLAogICAgICAgICAgICAgICAgdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMgKyBlbGFwc2VkKSwKICAgICAgICAgICAgICAgIGVsYXBzZWRdOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlTWVzc2FnZShlbGVtZW50LCBzdHJpbmdzKSB7CiAgICAgICAgcmV0dXJuIG1vZGVsLk1lc3NhZ2UoTEVWRUxTW2VsZW1lbnRbMl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwudGltZXN0YW1wKGVsZW1lbnRbMV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MuZ2V0KGVsZW1lbnRbM10pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MuZ2V0KGVsZW1lbnRbNF0pKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlU3RhdHVzKHN0YXRzKSB7CiAgICAgICAgcmV0dXJuIFNUQVRVU0VTW3N0YXRzWzBdXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNoaWxkQ3JlYXRvcihwYXJlbnQsIGNoaWxkVHlwZSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoZWxlbSwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQoY2hpbGRUeXBlKHBhcmVudCwgZWxlbSwgc3RyaW5ncywgaW5kZXgpKTsKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlQm9keUl0ZW0ocGFyZW50LCBlbGVtZW50LCBzdHJpbmdzLCBpbmRleCkgewogICAgICAgIGlmIChlbGVtZW50WzBdID09IE1FU1NBR0VfVFlQRSkKICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2UoZWxlbWVudCwgc3RyaW5ncyk7CiAgICAgICAgcmV0dXJuIGNyZWF0ZUtleXdvcmQocGFyZW50LCBlbGVtZW50LCBzdHJpbmdzLCBpbmRleCk7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVLZXl3b3JkKHBhcmVudCwgZWxlbWVudCwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICB2YXIga3cgPSBtb2RlbC5LZXl3b3JkKHsKICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgICAgIHR5cGU6IEtFWVdPUkRfVFlQRVNbZWxlbWVudFswXV0sCiAgICAgICAgICAgIGlkOiAnaycgKyAoaW5kZXggKyAxKSwKICAgICAgICAgICAgbmFtZTogc3RyaW5ncy5nZXQoZWxlbWVudFsxXSksCiAgICAgICAgICAgIGxpYm5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMl0pLAogICAgICAgICAgICB0aW1lb3V0OiBzdHJpbmdzLmdldChlbGVtZW50WzNdKSwKICAgICAgICAgICAgYXJnczogc3RyaW5ncy5nZXQoZWxlbWVudFs1XSksCiAgICAgICAgICAgIGFzc2lnbjogc3RyaW5ncy5nZXQoZWxlbWVudFs2XSksCiAgICAgICAgICAgIHRhZ3M6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbN10pLAogICAgICAgICAgICBkb2M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkb2MgPSBzdHJpbmdzLmdldChlbGVtZW50WzRdKTsKICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3RhdHVzOiBwYXJzZVN0YXR1cyhlbGVtZW50WzhdLCBzdHJpbmdzKSwKICAgICAgICAgICAgdGltZXM6IG1vZGVsLlRpbWVzKHRpbWVzKGVsZW1lbnRbOF0pKSwKICAgICAgICAgICAgaXNDaGlsZHJlbkxvYWRlZDogdHlwZW9mKGVsZW1lbnRbOV0pICE9PSAnbnVtYmVyJwogICAgICAgIH0pOwogICAgICAgIGxhenlQb3B1bGF0ZUtleXdvcmRzRnJvbUZpbGUoa3csIGVsZW1lbnRbOV0sIHN0cmluZ3MpOwogICAgICAgIHJldHVybiBrdzsKICAgIH0KICAgIGZ1bmN0aW9uIGxhenlQb3B1bGF0ZUtleXdvcmRzRnJvbUZpbGUocGFyZW50LCBtb2RlbE9ySW5kZXgsIHN0cmluZ3MpIHsKICAgICAgICB2YXIgbW9kZWwsIGluZGV4LCBwb3B1bGF0b3I7CiAgICAgICAgdmFyIGNyZWF0b3IgPSBjaGlsZENyZWF0b3IocGFyZW50LCBjcmVhdGVCb2R5SXRlbSk7CiAgICAgICAgaWYgKHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkKSB7CiAgICAgICAgICAgIG1vZGVsID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwb3B1bGF0b3IgPSBQb3B1bGF0b3IobW9kZWwsIHN0cmluZ3MsIGNyZWF0b3IpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluZGV4ID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwYXJlbnQuY2hpbGRGaWxlTmFtZSA9IHdpbmRvdy5zZXR0aW5nc1snc3BsaXRMb2dCYXNlJ10gKyAnLScgKyBpbmRleCArICcuanMnOwogICAgICAgICAgICBwb3B1bGF0b3IgPSBTcGxpdExvZ1BvcHVsYXRvcihpbmRleCwgY3JlYXRvcik7CiAgICAgICAgfQogICAgICAgIHBhcmVudC5wb3B1bGF0ZUtleXdvcmRzKHBvcHVsYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiB0YWdzKHRhZ2xpc3QsIHN0cmluZ3MpIHsKICAgICAgICByZXR1cm4gdXRpbC5tYXAodGFnbGlzdCwgc3RyaW5ncy5nZXQpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlVGVzdChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1cyA9IGVsZW1lbnRbNF07CiAgICAgICAgdmFyIHRlc3QgPSBtb2RlbC5UZXN0KHsKICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgICAgIGlkOiAndCcgKyAoaW5kZXggKyAxKSwKICAgICAgICAgICAgbmFtZTogc3RyaW5ncy5nZXQoZWxlbWVudFswXSksCiAgICAgICAgICAgIGRvYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGRvYyA9IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMl0pOwogICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBkb2M7IH07CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9LAogICAgICAgICAgICB0aW1lb3V0OiBzdHJpbmdzLmdldChlbGVtZW50WzFdKSwKICAgICAgICAgICAgc3RhdHVzOiBwYXJzZVN0YXR1cyhzdGF0dXMpLAogICAgICAgICAgICBtZXNzYWdlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgbXNnID0gc3RhdHVzLmxlbmd0aCA9PSA0ID8gc3RyaW5ncy5nZXQoc3RhdHVzWzNdKSA6ICcnOwogICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbXNnOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZXM6IG1vZGVsLlRpbWVzKHRpbWVzKHN0YXR1cykpLAogICAgICAgICAgICB0YWdzOiB0YWdzKGVsZW1lbnRbM10sIHN0cmluZ3MpLAogICAgICAgICAgICBpc0NoaWxkcmVuTG9hZGVkOiB0eXBlb2YoZWxlbWVudFs1XSkgIT09ICdudW1iZXInCiAgICAgICAgfSk7CiAgICAgICAgbGF6eVBvcHVsYXRlS2V5d29yZHNGcm9tRmlsZSh0ZXN0LCBlbGVtZW50WzVdLCBzdHJpbmdzKTsKICAgICAgICByZXR1cm4gdGVzdDsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN1aXRlKHBhcmVudCwgZWxlbWVudCwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICB2YXIgc3RhdHVzID0gZWxlbWVudFs1XTsKICAgICAgICB2YXIgc3VpdGUgPSBtb2RlbC5TdWl0ZSh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICBpZDogJ3MnICsgKChpbmRleCB8fCAwKSArIDEpLAogICAgICAgICAgICBuYW1lOiBzdHJpbmdzLmdldChlbGVtZW50WzBdKSwKICAgICAgICAgICAgc291cmNlOiBzdHJpbmdzLmdldChlbGVtZW50WzFdKSwKICAgICAgICAgICAgcmVsYXRpdmVTb3VyY2U6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMl0pLAogICAgICAgICAgICBkb2M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkb2MgPSBzdHJpbmdzLmdldChlbGVtZW50WzNdKTsKICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3RhdHVzOiBwYXJzZVN0YXR1cyhzdGF0dXMpLAogICAgICAgICAgICBtZXNzYWdlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgbXNnID0gc3RhdHVzLmxlbmd0aCA9PSA0ID8gc3RyaW5ncy5nZXQoc3RhdHVzWzNdKSA6ICcnOwogICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbXNnOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZXM6IG1vZGVsLlRpbWVzKHRpbWVzKHN0YXR1cykpLAogICAgICAgICAgICBzdGF0aXN0aWNzOiBzdWl0ZVN0YXRzKHV0aWwubGFzdChlbGVtZW50KSksCiAgICAgICAgICAgIG1ldGFkYXRhOiBwYXJzZU1ldGFkYXRhKGVsZW1lbnRbNF0sIHN0cmluZ3MpCiAgICAgICAgfSk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVLZXl3b3JkcyhQb3B1bGF0b3IoZWxlbWVudFs4XSwgc3RyaW5ncywgY2hpbGRDcmVhdG9yKHN1aXRlLCBjcmVhdGVLZXl3b3JkKSkpOwogICAgICAgIHN1aXRlLnBvcHVsYXRlVGVzdHMoUG9wdWxhdG9yKGVsZW1lbnRbN10sIHN0cmluZ3MsIGNoaWxkQ3JlYXRvcihzdWl0ZSwgY3JlYXRlVGVzdCkpKTsKICAgICAgICBzdWl0ZS5wb3B1bGF0ZVN1aXRlcyhQb3B1bGF0b3IoZWxlbWVudFs2XSwgc3RyaW5ncywgY2hpbGRDcmVhdG9yKHN1aXRlLCBjcmVhdGVTdWl0ZSkpKTsKICAgICAgICByZXR1cm4gc3VpdGU7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZU1ldGFkYXRhKGRhdGEsIHN0cmluZ3MpIHsKICAgICAgICB2YXIgbWV0YWRhdGEgPSBbXTsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8ZGF0YS5sZW5ndGg7IGkrPTIpIHsKICAgICAgICAgICAgbWV0YWRhdGEucHVzaChbc3RyaW5ncy5nZXQoZGF0YVtpXSksIHN0cmluZ3MuZ2V0KGRhdGFbaSsxXSldKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1ldGFkYXRhOwogICAgfQogICAgZnVuY3Rpb24gc3VpdGVTdGF0cyhzdGF0cykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRvdGFsOiBzdGF0c1swXSwKICAgICAgICAgICAgcGFzczogc3RhdHNbMV0sCiAgICAgICAgICAgIGZhaWw6IHN0YXRzWzJdLAogICAgICAgICAgICBza2lwOiBzdGF0c1szXQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBQb3B1bGF0b3IoaXRlbXMsIHN0cmluZ3MsIGNyZWF0b3IpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBudW1iZXJPZkl0ZW1zOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXMubGVuZ3RoOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjcmVhdG9yOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdG9yKGl0ZW1zW2luZGV4XSwgc3RyaW5ncywgaW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIFNwbGl0TG9nUG9wdWxhdG9yKHN0cnVjdHVyZUluZGV4LCBjcmVhdG9yKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbnVtYmVyT2ZJdGVtczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvd1sna2V5d29yZHMnK3N0cnVjdHVyZUluZGV4XS5sZW5ndGg7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNyZWF0b3I6IGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0b3Iod2luZG93WydrZXl3b3Jkcycrc3RydWN0dXJlSW5kZXhdW2luZGV4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1N0b3JlKHdpbmRvd1snc3RyaW5ncycrc3RydWN0dXJlSW5kZXhdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZSgpIHsKICAgICAgICB2YXIgZWxlbSA9IHdpbmRvdy5vdXRwdXQuc3VpdGU7CiAgICAgICAgaWYgKGVsZW1lbnRzQnlJZFtlbGVtLmlkXSkKICAgICAgICAgICAgcmV0dXJuIGVsZW07CiAgICAgICAgdmFyIHJvb3QgPSBhZGRFbGVtZW50KGNyZWF0ZVN1aXRlKG51bGwsIGVsZW0sIFN0cmluZ1N0b3JlKHdpbmRvdy5vdXRwdXQuc3RyaW5ncykpKTsKICAgICAgICB3aW5kb3cub3V0cHV0LnN1aXRlID0gcm9vdDsKICAgICAgICByZXR1cm4gcm9vdDsKICAgIH0KICAgIGZ1bmN0aW9uIGZpbmRMb2FkZWQoaWQpIHsKICAgICAgICByZXR1cm4gZWxlbWVudHNCeUlkW2lkXTsKICAgIH0KICAgIGZ1bmN0aW9uIGVuc3VyZUxvYWRlZChpZCwgY2FsbGJhY2spIHsKICAgICAgICB2YXIgaWRzID0gaWQuc3BsaXQoJy0nKTsKICAgICAgICB2YXIgcm9vdCA9IHN1aXRlKCk7CiAgICAgICAgaWRzLnNoaWZ0KCk7CiAgICAgICAgbG9hZEl0ZW1zKGlkcywgcm9vdCwgW3Jvb3QuaWRdLCBjYWxsYmFjayk7CiAgICB9CiAgICBmdW5jdGlvbiBsb2FkSXRlbXMoaWRzLCBjdXJyZW50LCByZXN1bHQsIGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKCFpZHMubGVuZ3RoKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKHJlc3VsdCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY3VycmVudC5jYWxsV2hlbkNoaWxkcmVuUmVhZHkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgaWQgPSBpZHMuc2hpZnQoKTsKICAgICAgICAgICAgdmFyIHR5cGUgPSBpZFswXTsKICAgICAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VJbnQoaWQuc3Vic3RyaW5nKDEpKSAtIDE7CiAgICAgICAgICAgIHZhciBpdGVtID0gc2VsZWN0RnJvbShjdXJyZW50LCB0eXBlLCBpbmRleCk7CiAgICAgICAgICAgIGlmIChpdGVtKQogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaXRlbS5pZCk7CiAgICAgICAgICAgIGVsc2UgICAgLy8gSW52YWxpZCBpZC4gU2hvdWxkIHRoaXMgYmUgcmVwb3J0ZWQgc29tZXdoZXJlPwogICAgICAgICAgICAgICAgaWRzID0gW107CiAgICAgICAgICAgIGxvYWRJdGVtcyhpZHMsIGl0ZW0sIHJlc3VsdCwgY2FsbGJhY2spOwogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gc2VsZWN0RnJvbShlbGVtZW50LCB0eXBlLCBpbmRleCkgewogICAgICAgIGlmICh0eXBlID09PSAnaycpIHsKICAgICAgICAgICAgdmFyIGtleXdvcmRzID0gdXRpbC5maWx0ZXIoZWxlbWVudC5rZXl3b3JkcygpLCBmdW5jdGlvbiAoa3cpIHsKICAgICAgICAgICAgICAgIHJldHVybiBrdy50eXBlICE9ICdtZXNzYWdlJzsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBrZXl3b3Jkc1tpbmRleF07CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAndCcpIHsKICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudGVzdHMoKVtpbmRleF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuc3VpdGVzKClbaW5kZXhdOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGVycm9ySXRlcmF0b3IoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQoY3JlYXRlTWVzc2FnZSh3aW5kb3cub3V0cHV0LmVycm9ycy5zaGlmdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGhhc05leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cub3V0cHV0LmVycm9ycy5sZW5ndGggPiAwOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YXRpc3RpY3MoKSB7CiAgICAgICAgaWYgKCFfc3RhdGlzdGljcykgewogICAgICAgICAgICB2YXIgc3RhdERhdGEgPSB3aW5kb3cub3V0cHV0LnN0YXRzOwogICAgICAgICAgICBfc3RhdGlzdGljcyA9IHN0YXRzLlN0YXRpc3RpY3Moc3RhdERhdGFbMF0sIHN0YXREYXRhWzFdLCBzdGF0RGF0YVsyXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfc3RhdGlzdGljczsKICAgIH0KICAgIGZ1bmN0aW9uIFN0cmluZ1N0b3JlKHN0cmluZ3MpIHsKICAgICAgICBmdW5jdGlvbiBnZXRUZXh0KGlkKSB7CiAgICAgICAgICAgIHZhciB0ZXh0ID0gc3RyaW5nc1tpZF07CiAgICAgICAgICAgIGlmICghdGV4dCkKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgaWYgKHRleHRbMF0gPT0gJyonKQogICAgICAgICAgICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDEpOwogICAgICAgICAgICB2YXIgZXh0cmFjdGVkID0gZXh0cmFjdCh0ZXh0KTsKICAgICAgICAgICAgc3RyaW5nc1tpZF0gPSAnKicgKyBleHRyYWN0ZWQ7CiAgICAgICAgICAgIHJldHVybiBleHRyYWN0ZWQ7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGV4dHJhY3QodGV4dCkgewogICAgICAgICAgICB2YXIgZGVjb2RlZCA9IEpYRy5VdGlsLkJhc2U2NC5kZWNvZGVBc0FycmF5KHRleHQpOwogICAgICAgICAgICB2YXIgZXh0cmFjdGVkID0gKG5ldyBKWEcuVXRpbC5VbnppcChkZWNvZGVkKSkudW56aXAoKVswXVswXTsKICAgICAgICAgICAgcmV0dXJuIEpYRy5VdGlsLlVURjguZGVjb2RlKGV4dHJhY3RlZCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGdldChpZCkgewogICAgICAgICAgICBpZiAoaWQgPT09IG51bGwpIHJldHVybiBudWxsOwogICAgICAgICAgICByZXR1cm4gZ2V0VGV4dChpZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7Z2V0OiBnZXR9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBzdWl0ZTogc3VpdGUsCiAgICAgICAgZXJyb3JJdGVyYXRvcjogZXJyb3JJdGVyYXRvciwKICAgICAgICBmaW5kTG9hZGVkOiBmaW5kTG9hZGVkLAogICAgICAgIGVuc3VyZUxvYWRlZDogZW5zdXJlTG9hZGVkLAogICAgICAgIHN0YXRpc3RpY3M6IHN0YXRpc3RpY3MsCiAgICAgICAgU3RyaW5nU3RvcmU6IFN0cmluZ1N0b3JlLCAgLy8gZXhwb3NlZCBmb3IgdGVzdHMKICAgICAgICBMRVZFTFM6IExFVkVMUwogICAgfTsKfSgpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpmdW5jdGlvbiByZW1vdmVKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKCkgewogICAgLy8gTm90IHVzaW5nIGpRdWVyeSBoZXJlIGZvciBtYXhpbXVtIHNwZWVkCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamF2YXNjcmlwdC1kaXNhYmxlZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Cn0KZnVuY3Rpb24gYWRkSmF2YVNjcmlwdERpc2FibGVkV2FybmluZyhlcnJvcikgewogICAgaWYgKHdpbmRvdy5jb25zb2xlKQogICAgICAgIGNvbnNvbGUuZXJyb3IoJ09wZW5pbmcgZmFpbGVkOiAnICsgZXJyb3IubmFtZSArICc6ICcgKyBlcnJvci5tZXNzYWdlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqYXZhc2NyaXB0LWRpc2FibGVkJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7Cn0KZnVuY3Rpb24gaW5pdExheW91dChzdWl0ZU5hbWUsIHR5cGUpIHsKICAgIHBhcnNlVGVtcGxhdGVzKCk7CiAgICBzZXRUaXRsZShzdWl0ZU5hbWUsIHR5cGUpOwogICAgYWRkSGVhZGVyKCk7CiAgICBhZGRSZXBvcnRPckxvZ0xpbmsodHlwZSk7Cn0KZnVuY3Rpb24gcGFyc2VUZW1wbGF0ZXMoKSB7CiAgICAkKCdzY3JpcHRbdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIl0nKS5tYXAoZnVuY3Rpb24gKGlkeCwgZWxlbSkgewogICAgICAgICQudGVtcGxhdGUoZWxlbS5pZCwgZWxlbS50ZXh0KTsKICAgIH0pOwp9CmZ1bmN0aW9uIHRlc3RPclRhc2sodGV4dCkgewogICAgcmV0dXJuIHRleHQucmVwbGFjZSgveyguKil9LywgZnVuY3Rpb24gKG1hdGNoLCBncm91cCwgb2Zmc2V0LCBzdHJpbmcpIHsKICAgICAgICBpZiAoIXdpbmRvdy5zZXR0aW5ncy5ycGEpCiAgICAgICAgICAgIHJldHVybiBncm91cDsKICAgICAgICByZXR1cm4geydURVNUJzogJ1RBU0snLCAnVGVzdCc6ICdUYXNrJywgJ3Rlc3QnOiAndGFzayd9W2dyb3VwXTsKICAgIH0pOwp9CmZ1bmN0aW9uIHNldFRpdGxlKHN1aXRlTmFtZSwgdHlwZSkgewogICAgdmFyIGdpdmVuVGl0bGUgPSB3aW5kb3cuc2V0dGluZ3MudGl0bGU7CiAgICB2YXIgdGl0bGUgPSBnaXZlblRpdGxlID8gZ2l2ZW5UaXRsZSA6IHN1aXRlTmFtZSArICIgIiArIHR5cGU7CiAgICBkb2N1bWVudC50aXRsZSA9IHV0aWwudW5lc2NhcGUodGl0bGUpOwp9CmZ1bmN0aW9uIGFkZEhlYWRlcigpIHsKICAgIHZhciBnZW5lcmF0ZWQgPSB1dGlsLnRpbWVzdGFtcCh3aW5kb3cub3V0cHV0LmdlbmVyYXRlZCk7CiAgICAkLnRtcGwoJzxoMT4ke3RpdGxlfTwvaDE+JyArCiAgICAgICAgICAgJzxkaXYgaWQ9ImdlbmVyYXRlZCI+JyArCiAgICAgICAgICAgICAnPHNwYW4+R2VuZXJhdGVkPGJyPiR7Z2VuZXJhdGVkfTwvc3Bhbj48YnI+JyArCiAgICAgICAgICAgICAnPHNwYW4gaWQ9ImdlbmVyYXRlZC1hZ28iPiR7YWdvfSBhZ288L3NwYW4+JyArCiAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICc8ZGl2IGlkPSJ0b3AtcmlnaHQtaGVhZGVyIj4nICsKICAgICAgICAgICAgICc8ZGl2IGlkPSJyZXBvcnQtb3ItbG9nLWxpbmsiPjxhIGhyZWY9IiMiPjwvYT48L2Rpdj4nICsKICAgICAgICAgICAnPC9kaXY+JywgewogICAgICAgIGdlbmVyYXRlZDogdXRpbC5jcmVhdGVHZW5lcmF0ZWRTdHJpbmcoZ2VuZXJhdGVkKSwKICAgICAgICBhZ286IHV0aWwuY3JlYXRlR2VuZXJhdGVkQWdvU3RyaW5nKGdlbmVyYXRlZCksCiAgICAgICAgdGl0bGU6IGRvY3VtZW50LnRpdGxlCiAgICB9KS5hcHBlbmRUbygkKCcjaGVhZGVyJykpOwp9CmZ1bmN0aW9uIGFkZFJlcG9ydE9yTG9nTGluayhteVR5cGUpIHsKICAgIHZhciB1cmw7CiAgICB2YXIgdGV4dDsKICAgIHZhciBjb250YWluZXIgPSAkKCcjcmVwb3J0LW9yLWxvZy1saW5rJyk7CiAgICBpZiAobXlUeXBlID09ICdSZXBvcnQnKSB7CiAgICAgICAgdXJsID0gd2luZG93LnNldHRpbmdzLmxvZ1VSTDsKICAgICAgICB0ZXh0ID0gJ0xPRyc7CiAgICB9IGVsc2UgewogICAgICAgIHVybCA9IHdpbmRvdy5zZXR0aW5ncy5yZXBvcnRVUkw7CiAgICAgICAgdGV4dCA9ICdSRVBPUlQnOwogICAgfQogICAgaWYgKHVybCkgewogICAgICAgIGNvbnRhaW5lci5maW5kKCdhJykuYXR0cignaHJlZicsIHVybCk7CiAgICAgICAgY29udGFpbmVyLmZpbmQoJ2EnKS50ZXh0KHRleHQpOwogICAgfSBlbHNlIHsKICAgICAgICBjb250YWluZXIucmVtb3ZlKCk7CiAgICB9Cn0KZnVuY3Rpb24gYWRkU3RhdGlzdGljcygpIHsKICAgIHZhciBzdGF0SGVhZGVycyA9CiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPlRvdGFsPC90aD4nICsKICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+UGFzczwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPkZhaWw8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij5Ta2lwPC90aD4nICsKICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtZWxhcHNlZCI+RWxhcHNlZDwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLWdyYXBoIj5QYXNzIC8gRmFpbCAvIFNraXA8L3RoPic7CiAgICB2YXIgc3RhdFRhYmxlID0KICAgICAgICAnPGgyPntUZXN0fSBTdGF0aXN0aWNzPC9oMj4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0idG90YWwtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlRvdGFsIFN0YXRpc3RpY3M8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPicgKwogICAgICAgICc8dGFibGUgY2xhc3M9InN0YXRpc3RpY3MiIGlkPSJ0YWctc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgVGFnPC90aD4nICsgc3RhdEhlYWRlcnMgKwogICAgICAgICc8L3RyPjwvdGhlYWQ+PC90YWJsZT4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0ic3VpdGUtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgU3VpdGU8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPic7CiAgICAkKHRlc3RPclRhc2soc3RhdFRhYmxlKSkuYXBwZW5kVG8oJyNzdGF0aXN0aWNzLWNvbnRhaW5lcicpOwogICAgdXRpbC5tYXAoWyd0b3RhbCcsICd0YWcnLCAnc3VpdGUnXSwgYWRkU3RhdFRhYmxlKTsKICAgIGFkZFRvb2x0aXBzVG9FbGFwc2VkVGltZXMoKTsKICAgIGVuYWJsZVN0YXRpc3RpY3NTb3J0ZXIoKTsKfQpmdW5jdGlvbiBhZGRUb29sdGlwc1RvRWxhcHNlZFRpbWVzKCkgewogICAgJCgnLnN0YXRzLWNvbC1lbGFwc2VkJykuYXR0cigndGl0bGUnLAogICAgICAgIHRlc3RPclRhc2soJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZXNlIHt0ZXN0fXMuICcpICsKICAgICAgICAnRXhjbHVkZXMgc3VpdGUgc2V0dXBzIGFuZCB0ZWFyZG93bnMuJyk7CiAgICAkKCcjc3VpdGUtc3RhdHMnKS5maW5kKCcuc3RhdHMtY29sLWVsYXBzZWQnKS5hdHRyKCd0aXRsZScsCiAgICAgICAgJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoaXMgc3VpdGUuJyk7Cn0KZnVuY3Rpb24gZW5hYmxlU3RhdGlzdGljc1NvcnRlcigpIHsKICAgICQudGFibGVzb3J0ZXIuYWRkUGFyc2VyKHsKICAgICAgICBpZDogJ3N0YXROYW1lJywKICAgICAgICB0eXBlOiAnbnVtZXJpYycsCiAgICAgICAgaXM6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZG8gbm90IGF1dG8tZGV0ZWN0CiAgICAgICAgfSwKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHN0cmluZywgdGFibGUsIGNlbGwsIGNlbGxJbmRleCkgewogICAgICAgICAgICAvLyBSb3dzIGhhdmUgY2xhc3MgaW4gZm9ybWF0ICdyb3ctPGluZGV4PicuCiAgICAgICAgICAgIHZhciBpbmRleCA9ICQoY2VsbCkucGFyZW50KCkuYXR0cignY2xhc3MnKS5zdWJzdHJpbmcoNCk7CiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpbmRleCk7CiAgICAgICAgfQogICAgfSk7CiAgICAkKCIuc3RhdGlzdGljcyIpLnRhYmxlc29ydGVyKHsKICAgICAgICBzb3J0SW5pdGlhbE9yZGVyOiAnZGVzYycsCiAgICAgICAgaGVhZGVyczogezA6IHtzb3J0ZXI6ICdzdGF0TmFtZScsIHNvcnRJbml0aWFsT3JkZXI6ICdhc2MnfSwKICAgICAgICAgICAgICAgICAgNjoge3NvcnRlcjogZmFsc2V9fQogICAgfSk7Cn0KZnVuY3Rpb24gYWRkU3RhdFRhYmxlKHRhYmxlTmFtZSkgewogICAgdmFyIHN0YXRzID0gd2luZG93LnRlc3RkYXRhLnN0YXRpc3RpY3MoKVt0YWJsZU5hbWVdOwogICAgaWYgKHRhYmxlTmFtZSA9PSAndGFnJyAmJiBzdGF0cy5sZW5ndGggPT0gMCkgewogICAgICAgIHJlbmRlck5vVGFnU3RhdFRhYmxlKCk7CiAgICB9IGVsc2UgewogICAgICAgIHJlbmRlclN0YXRUYWJsZSh0YWJsZU5hbWUsIHN0YXRzKTsKICAgIH0KfQpmdW5jdGlvbiByZW5kZXJOb1RhZ1N0YXRUYWJsZSgpIHsKICAgICQoJzx0Ym9keT48dHIgY2xhc3M9InJvdy0wIj4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSI+Tm8gVGFnczwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPjwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPjwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPjwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPjwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLWVsYXBzZWQiPjwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLWdyYXBoIj4nICsKICAgICAgICAgICc8ZGl2IGNsYXNzPSJlbXB0eS1ncmFwaCI+PC9kaXY+JyArCiAgICAgICAgJzwvdGQ+JyArCiAgICAgICc8L3RyPjwvdGJvZHk+JykuYXBwZW5kVG8oJyN0YWctc3RhdHMnKTsKfQpmdW5jdGlvbiByZW5kZXJTdGF0VGFibGUodGFibGVOYW1lLCBzdGF0cykgewogICAgdmFyIHRlbXBsYXRlID0gdGFibGVOYW1lICsgJ1N0YXRpc3RpY3NSb3dUZW1wbGF0ZSc7CiAgICB2YXIgdGJvZHkgPSAkKCc8dGJvZHk+PC90Ym9keT4nKTsKICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzdGF0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICQudG1wbCh0ZW1wbGF0ZSwgc3RhdHNbaV0sIHtpbmRleDogaX0pLmFwcGVuZFRvKHRib2R5KTsKICAgIH0KICAgIHRib2R5LmFwcGVuZFRvKCcjJyArIHRhYmxlTmFtZSArICctc3RhdHMnKTsKfQokLnRlbXBsYXRlKCdzdGF0Q29sdW1uc1RlbXBsYXRlJywKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij4ke3RvdGFsfTwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+JHtwYXNzfTwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+JHtmYWlsfTwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+JHtza2lwfTwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZWxhcHNlZCI+JHtlbGFwc2VkfTwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZ3JhcGgiPicgKwogICAgICAne3tpZiB0b3RhbH19JyArCiAgICAgICc8ZGl2IGNsYXNzPSJncmFwaCI+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InBhc3MtYmFyIiBzdHlsZT0id2lkdGg6ICR7cGFzc1dpZHRofSUiIHRpdGxlPSIke3Bhc3NQZXJjZW50fSUiPjwvZGl2PicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJmYWlsLWJhciIgc3R5bGU9IndpZHRoOiAke2ZhaWxXaWR0aH0lIiB0aXRsZT0iJHtmYWlsUGVyY2VudH0lIj48L2Rpdj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0ic2tpcC1iYXIiIHN0eWxlPSJ3aWR0aDogJHtza2lwV2lkdGh9JSIgdGl0bGU9IiR7c2tpcFBlcmNlbnR9JSI+PC9kaXY+JyArCiAgICAgICc8L2Rpdj4nICsKICAgICAgJ3t7ZWxzZX19JyArCiAgICAgICc8ZGl2IGNsYXNzPSJlbXB0eS1ncmFwaCI+PC9kaXY+JyArCiAgICAgICd7ey9pZn19JyArCiAgICAnPC90ZD4nCik7CiQudGVtcGxhdGUoJ3N1aXRlU3RhdHVzTWVzc2FnZVRlbXBsYXRlJywKICAgICcke3RvdGFsfSB7ez0gdGVzdE9yVGFzaygie3Rlc3R9Iil9fXt7aWYgdG90YWwgIT0gMX19c3t7L2lmfX0gdG90YWwsICcgKwogICAgJyR7cGFzc30gcGFzc2VkLCAke2ZhaWx9IGZhaWxlZCwgJHtza2lwfSBza2lwcGVkJwopOwovLyBGb3IgY29tcGxldGUgY3Jvc3MtYnJvd3NlciBleHBlcmllbmNlLi4KLy8gaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9qcy9ldmVudHNfb3JkZXIuaHRtbApmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oZXZlbnQpIHsKICAgIHZhciBldmVudCA9IGV2ZW50IHx8IHdpbmRvdy5ldmVudDsKICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7CiAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKQogICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwp9Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXQgPSB7fTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3VpdGUiXSA9IFsxLDIsMywwLFtdLFsxLDAsMjk3Ml0sW10sW1s0LDAsMCxbXSxbMSwzMTgsMjMwOF0sW1swLDUsMCwwLDAsNiwwLDAsWzEsMzIxLDIyMjddLFtbMCw3LDgsMCw5LDEwLDAsMCxbMSwzMjIsMjIwM10sW1s4LDMyNCwyLDExXSxbOCwzMjQsMiwxMl1dXSxbMCwxMyw4LDAsMTQsMTUsMCwwLFsxLDI1MjcsMjBdLFtdXV1dLFswLDE2LDgsMCwxNywxOCwwLDAsWzEsMjU0OSwxNl0sW1s4LDI1NjQsMiwxOV1dXSxbMCwyMCwyMSwwLDIyLDIzLDAsMCxbMSwyNTY2LDU5XSxbWzgsMjYwMiwyLDI0XSxbOCwyNjAyLDIsMjVdLFs4LDI2MDMsMiwyNl0sWzgsMjYwOSwyLDI3XSxbOCwyNjEwLDIsMjhdXV1dXV0sW1syLDI5LDgsMCwzMCwwLDAsMCxbMSwyNjI4LDM0M10sW11dXSxbMSwxLDAsMF1dOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJzdHJpbmdzIl0gPSBbXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3RyaW5ncyJdID0gd2luZG93Lm91dHB1dFsic3RyaW5ncyJdLmNvbmNhdChbIioiLCIqSnVweXRlciIsIiovaG9tZS9kYXRha3VycmUvV29yay9naXRodWIvcm9ib3RzLWZyb20tanVweXRlci9yb2JvdGtlcm5lbC9leGFtcGxlcyIsIiouLi8uLi8uLi8uLi9ob21lL2RhdGFrdXJyZS9Xb3JrL2dpdGh1Yi9yb2JvdHMtZnJvbS1qdXB5dGVyL3JvYm90a2VybmVsL2V4YW1wbGVzIiwiKlNob3cgUGxvbmUgbG9nbyIsIipPcGVuIHVybCIsIio8YSBocmVmPVwiaHR0cHM6Ly9wbG9uZS5vcmdcIj5odHRwczovL3Bsb25lLm9yZ1x4M2MvYT4iLCIqT3BlbiBCcm93c2VyIiwiKlNlbGVuaXVtTGlicmFyeSIsIio8cD5PcGVucyBhIG5ldyBicm93c2VyIGluc3RhbmNlIHRvIHRoZSBvcHRpb25hbCA8Y29kZT51cmxceDNjL2NvZGU+Llx4M2MvcD4iLCIqJHt1cmx9LCBicm93c2VyPWhlYWRsZXNzZmlyZWZveCwgYWxpYXM9c2luZ2xldG9uIiwiKk9wZW5pbmcgYnJvd3NlciAnaGVhZGxlc3NmaXJlZm94JyB0byBiYXNlIHVybCAnPGEgaHJlZj1cImh0dHBzOi8vcGxvbmUub3JnXCI+aHR0cHM6Ly9wbG9uZS5vcmdceDNjL2E+Jy4iLCIqRmlyZWZveCBkcml2ZXIgbG9nIGlzIGFsd2F5cyBmb3JjZWQgdG8gdG86IC9ydW4vdXNlci8xMDAwL3RtcHB5YWs0YTlpL2dlY2tvZHJpdmVyLTEubG9nIiwiKlNldCBXaW5kb3cgU2l6ZSIsIio8cD5TZXRzIGN1cnJlbnQgd2luZG93cyBzaXplIHRvIGdpdmVuIDxjb2RlPndpZHRoXHgzYy9jb2RlPiBhbmQgPGNvZGU+aGVpZ2h0XHgzYy9jb2RlPi5ceDNjL3A+IiwiKjgwMCwgOTAwIiwiKlBhZ2UgU2hvdWxkIENvbnRhaW4gRWxlbWVudCIsIio8cD5WZXJpZmllcyB0aGF0IGVsZW1lbnQgPGNvZGU+bG9jYXRvclx4M2MvY29kZT4gaXMgZm91bmQgb24gdGhlIGN1cnJlbnQgcGFnZS5ceDNjL3A+IiwiKmNzcz0ubmF2YmFyLWJyYW5kIiwiKkN1cnJlbnQgcGFnZSBjb250YWlucyBlbGVtZW50ICdjc3M9Lm5hdmJhci1icmFuZCcuIiwiKkNhcHR1cmUgYW5kIGNyb3AgcGFnZSBzY3JlZW5zaG90IiwiKlNlbGVuaXVtU2NyZWVuc2hvdHMiLCIqPHA+Q2FwdHVyZXMgYSBwYWdlIHNjcmVlbnNob3Qgd2l0aCB0aGUgZ2l2ZW4gPGNvZGU+ZmlsZW5hbWVceDNjL2NvZGU+IGFuZCBjcm9wcyBpdCB0byBtYXRjaCB0aGUgY29tYmluZWQgYm91bmRpbmcgYm94IG9mIHRoZSBlbGVtZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4gPGNvZGU+bG9jYXRvcnNceDNjL2NvZGU+Llx4M2MvcD4iLCIqcGxvbmUucG5nLCBjc3M9Lm5hdmJhci1icmFuZCIsIipceDNjL3RkPlx4M2MvdHI+PHRyPjx0ZCBjb2xzcGFuPVwiM1wiPjxhPjxpbWcgc3JjPVwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNc0FBQUJvQ0FZQUFBQmZjd1J6QUFBTW8wbEVRVlI0bk8yZHowOGJaeHJIdjFtWlhidGQzSW5SeGxPQmxMRVVKTHZhMEhFaUZaQWlaYmlGVThhWFZYUENISE9xK1FjSytRdHdUem5hbk9nTjUxSnlzeU50QmFuVU1DUlNzSlJJSGlSUVRhdVlnZXpHbHZDcWUzRHNNRC85R285blNIZytFaEwyakYrL0hzLzNmWjlmNyt0TFZ5TlRmNElnaUs3OHhlOE9FTVRIQW9tRklCZ2hzUkFFSXlRV2dtQ0V4RUlRakpCWUNJSVJFZ3RCTUhJSkFPVlpDSUtCQUw3L3llOCtFTVJIQVpsaEJNRUlpWVVnR0NHeEVBUWpKQmFDWUlURVFoQ01rRmdJZ2hFU0MwRXdRbUloQ0VaSUxBVEJDSW1GSUJnaHNSQUVJeVFXZ21DRXhFSVFqSkJZQ0lJUkVndEJNRUppSVFoR1NDd0V3UWlKaFNBWUliRVFCQ01rRm9KZ2hNUkNFSXdFL082QUV3SVh3dDE0RkFJWGd2aGxHQ0kvREM0NDFEbXVhbldvV2gybFNnMWE0d1FyeWo2MHhvbVBQU1krWlM3aCs1L08xYjVoWEhBSWQrTlhJTWVqa0JQUm5sOWYyRGxBWHRuSG8vTEJBSHBIWEdUT2xWam14RkZrWnhPNjJlT3NxRm9kODRVWEtGWGV1TkF6Z2pnblloSDVNSlpuRTVDRWlPdHRGM1lPc1BCNEI2cFdkNzF0NG1MaHUxalN5VEVzMzRuYnppWkhqU1lLNVFNbzFXTW8xYmNBQVBYd0hZVExud0VBSk9FeVJENE1TUmpCRjBGckYweHJuR0FtOXd1VTZ2RmdQZ1J4SWZCVkxPbmtHSEx5ZGN0alQ5UWFzcHNxQ2p2c3ZvZWNpQ0l6SmVDMnhReWxOVTZ3OExpTS9OYmVtZnRyUk9TSDhjWGZlak1aZDQvcXpMT2NzZjFlWGt1NGoyOWl5VXdMV0w2VE1EMi9YVDFHNW5HNUwxOGpuUnpEa25RTlY3bVE2ZGg4NFlWcmdpbk5UMW9Lc3h1cVZrZCthdzgvYktyUUdrM205aCtVWG1PcCtPcE1mU1g2eDVjOGl4UWJzUlRLaXJJUDhlSFBPcUdJL0RCeThuVVUwNU1vcGlmeDNaUUF6c2JjYXBQZjJvUDQ4R2ZMaU5qeW5UaEVQdHovaCtnRGdRdGhhV1ljbFlVWnlQSGVJMzZFUDNndUZvRUxZZTNicE9uNStjSUxwTmVlNjU2VDQxRnMzYitGZEhJTVVpd0NLUlpCZGphQnJmdTN1Z3BHYTV4QVhuMkdIelpWM2ZOY2NBaHI5MjY0RW5IckZ5NFl3TnE5RzBpTG8zNTNoV0RBODZSa0xqVmh1bEVYSHUrWVRDT0JDeUdYbXJCc1ErQkN5TWtUU1AzNHJPdjdaZFozd0FXSE1IZnFoaFM0RUxLekNaTTQrMlZYcXlPdjdGc2U0NElCaUh6WTBtekxwU1owQVF6aWZPS3BXS1RZaUNrOHZLTHNJN3VobXM4VklvNnpSeThKeS9UYWN3aGNTSGVqem9tanlHNm9ya2JJVkszZTFhZmdnZ0ZrWjcvU2lSY0FsdTk4aFpuOFU5ZjZjcEdRNDFIODg4cmZVVG1zNDc4bi8wTmhRQWxwVDgydzVUdHgzZU5kclc0N3VyZER3MDcwa3BlUlY1L2h5T0JNTDgrYS9hWkJveldhU0s4OU4vbFRVaXdDd1NJZ1FUalRIbEN2alh5T2YzeisxNEcrbDJkaVNTZkhUSTcxVXVtMTdmbnE0YnV1YlpiVUd2UDdhNDBUWkRjcnV1Y2tJZUticzU5WjN6RTlONGlrN0tjT0Z4enExQU55b2RiLzNmelpzK0taV09UNEZkM2pKMnJOTVlSYlVtdW1tZUEwWjZuOVdpcSt4cTRoVDVGTyt1TmNxMXJkMUJlVzJmU3NTRUlFdDYrMi9nYlZicjgzS1JjTWROcGk3YWVxMVNIeVlUeCs5UWZLZi93SEFoZHlETWYzZzJjK2k5R3h0WE9FMjZoYUhabjFsNVpPdnBQNTFvM3NwcW9MVzkrTlJ5MUhlUzlRdGJwbExzZ3Q1SGdVYytLb3BYK25WSStSM1ZDeDB1VjcrUFBCck83eFRPNHBWSzJPUmVrYTVBUnZFa2lwVXNPRDBxdWVadjIwT0lydnBnWExXYjZ3YzRBVlpkL1JEOGx1cWhENVlRQVlhSkRFRTdISWlhZ3BBc2FTbWM4cisxQ3F4MWlhR1lmSWgxdmwrR29OMlkzS21VZVBVa1gvSlFwY0NBSVg4aVV6UGlnVGtBc0dzUGJ0VFVneCs5Rlo1TVBJcHlhUW1SYVFXbjNHL1BubFJCUno0cGp0TE5JSzhVOGl1NkZpNGJIeklNUUZBeWpPVHpwZUJ6blJxajR2VldwSS9maXI3ZmZ1UlNUUkU3RzBWZC9taVZwalhuZWlWTjlDWG5VT0VXZW1CTXdsUnlIeVlXaU5Ka3FWTjdiRmswcjFHTHVHRVYxT1JDMGpjb05FRWlLbVdqWVdQNDJGMHZ3VXZqWmNjenRFUG95dCs3Y1FXeTR5RFVEZlRRbE03V2FtQmV4cWRXUU5lYTQyTEVJNWpSU0xvRGcvaWVURG41bk9Id1NlaUVYZzlMWjRTWFd2YkQ0N205QjlnVnd3QURrUmhSUWJRZkxodjIwRmMxb3NnM0lJN2VDQ0FjdEluQnNoeit4c3dpU1VkakdxcXRWYjF5Y2VOWDMrdFc5djloUzYzdFhxS0pRUG9EV2FsbTBDd09MTU9QTEtucVVJODZrSmsxQldsUDJPSDhzRmg1Q1oxdGY1aVh3WVN6UGp2cFg4ZUNTV3dkamxJajlzTzlLMThoa0p5MWxKcVI3ajdxa3lFeSt6K1pJUXdmSnN3dkpHNmRjeDVZSUIwL1Y0b3RZZ3Irck5sNlhpS3l6TmpPdk9sV0lSU0VLRXlkZFlVZmFSV1g5cGF0T1lQK0tDQWFURk1kUHNJdkxEdXV0LzFHaEN5bTJhVEtsQytRQnBjVlRudHk1SzE1RGYydlBGYlBabFdYRkpQWFNsSFRuQk94Ni95MWgzNVpidjhEVWZSakU5YWY4K1g0WXRaN0dqUnRPVjBUSXRqdWtlNzJwMWsxQ0FWcTRuczc1anFpaElKOGU2aW1XNyt0WXl1TkpxOHlYa2VGUm5Yb3BmbXE5dFpqcW1lNXpkVkcxOWpyeXlqM1J5VE5kUE9SNjFOZThHaVVjK2kzK0ZpMWJPKzZCQ2kxd3c0T2hVVzNIVWFFSmUvZFdWa2RMNDNtMHp5WTc4MXA3dUptVHhjNXhNUmEzUlJGN1owODFZVmxhRk1aK1UzYWlZenRFZlYvVmlTZmdqRmsveUxNYVNFcmZNc200TzhWR2phWGtUZXUyajJMR3IxU0hsTm5zS3N6cGg5QTI3UlJ5Tjc4c3lxSFZiT3RGdElCSzRrTTYzMmE2Kzdmb2FvMERQc2l6Q0RYeTVhd1F1NkVvN2hmSUJzbzJtN1FwSiswaU0za2Z4ZWtlWVIrV0R6c1lhYnNJYUFXdGpONUQwTS9PV0ttK3dLRjJ6UFc0Y0tMOElCaHpQUDA5NEloWlZxK1AycWNkdU9kVGFleE9tY08rbVNUQ1B5Z2UyZm9CeEJIV3JtSEs3K2hhWjlaZTJ4NVhxOGNCTVFMY1ErYkJyTXgwTDdiVTl2U0x5dzU1WGFYc2lGcVY2akRsOGlKS2NKV3N1Q1pIT1BtR25LYWsxQ010RlpLWmpFUG5oemo1aVRyYTFjUVIyNjZKcmpSTlBiN1NMakIvcmtUd1JpMVhXWE9URFRDUDYwc3k0YnBwV3RUcm0xNTdyYmtxdGgyaVNWVFdCc1g4WEdhOU5VcWMxUUU1OHNxRmpwWHFNSTROdmtVNk9JclB1TEpiQ3ZSdW04Sy9BaFZDY244Uk03dW1aUm5Iak10N3Q2dkVuczR1bDhScWZCYTlObThQR3lVZXpyNEJuVmNkNVJWOWhQQ2VPT2s2bHhzU1ZFYnRWbEU0SVhNaTA2TXB0Sjl0UGVvMDYrckVrNEN3UnVQT0NaMkl4MWw2MXlobXUycDdmTGVFb2NLR2VROEJHUi9LbzBVUis2OU1WUzdmVnBNYmpUenp5dDdZTnM5ZkhzZ2VCWjJKUnRicXBISHhSR3U5clpPbkZ5Wk5pSXhhenl0NjVOc0dNZmVzMk9CanpLbmZqVWR2Wm96WEw2alArdmV6UjFnL0c0TXZ5N0ZkZFAxdGFIUFZkVko0dUs3YXlUZTEyV2xGK2MvWm43QktPVm9oODJMU2pUS3ZFeEg2bDVubkE2RC9NaVdPbUN1N1RsTlNhYVVIWjJyMmJwa0VpTFk1YTdwQmpOSlVIUlhham9sdll4d1VEMkxwL3kxTFlyYzFKcmlPWG1rQXVOZUdyWUR4TlNxcGFIUTlLcjdBb2ZUQ0hXZzc3TjVqSi9hSWJTUXZsQTJ4WDM5b20ybGlkUWk0NGhGenF1a21RUzZWWDUzcFdBVnJsS0tjamdlMmJxbzNWcG52cHRlY296ay9xWHBOUFRTQ2ZtdWhVQ0Z1eHNMN2pXUTZvSGIwOFhYbmREdHhvaldabm9CUXVoMHgrVjl0WDljUFg5SHpmc0tYaWEyd2JiR3VSRDZNNC80M3BocFpYZjdXMG94K1VYalBWQnJYYk5acDZqOG9IbnE5Zk9RdXFWamZ0ZTlhTmtsckR2TTBxVWp1aHJDajdudGRhWlRldFYybTI2K3ZzTnZCWVVmWjlDOHI0VXU0aXJ6NkRjditXdmpxVkQ2T3ljQnVwSDdjNjlVZXFWb2VVZXdwSmlFQ0tqVUE5ZkllU1dtTXl2K1JFRkRuWlBLTnNWNCtSWG52aDdnY2FJTzNrTGV1aUs2QTE2bXFOSnJLekNjZGx5KzFxWnorS0VvSFdMRmlxdk1IU3pIalg1ZFc3NzdlWjhqTjY2ZHRleHlJZlJtbCswakl2ME0vUFJFaXhFU3hLMXl6dDMrM3FNU1NEdWRjUGFYRlV0OG1FZXZodVlGK213SVVneDZQZ1FoL0VYNnE4NlpwcmF2OG8xT2xSdWxYbDhLWnJWVEpnamlCMlcwc2ljQ0dra3g4Q0I2elhSSTVISWNYTXUrMm9XaDJGbllPQjdRWFdDNzd1b3U4a0dBQ2RpL1NvL0x2akRkN2VRTS9wMThMY0ZncHg4ZkQ5OTFtNDRCQUs5MjUwTGJ0dWo2REtiNjFpUklFTFFyajhXV2RiVkNkYUsvdDJTQ2hFWC9ndWxqYVphUUZMMG5qZjVScW5PV28wa1M0ODl5eC9RSHphbkJ1eEFCK3krcG1wV0YraU9XbzBrZDJzSUx1eFM3TUo0UnJuU2l4dHVPQlFhNytvK0JYbWRmVEErMFZWNWQ5ZC9YVXZnbWh6THNWaVJJcU5RT1NITzNrQ2dmc01xdFphVXF4cWpVNTBoeUFHeVVjaEZvSTREL2p5TTNrRThURkNZaUVJUmtnc0JNRUlpWVVnR0NHeEVBUWpKQmFDWUlURVFoQ01rRmdJZ2hFU0MwRXdRbUloQ0VaSUxBVEJDSW1GSUJnaHNSQUVJeVFXZ21DRXhFSVFqSkJZQ0lJUkVndEJNRUppSVFoR1NDd0V3UWlKaFNBWUliRVFCQ01rRm9KZzVOTGw1TDlvS3lTQ1lJQm1Gb0pnaE1SQ0VJeVFXQWlDRVJJTFFUQkNZaUVJUmtnc0JNRUlpWVVnR0NHeEVBUWovd2RMaDB6a1hjb3Z6Z0FBQUFCSlJVNUVya0pnZ2c9PVwiIHN0eWxlPVwibWF4LXdpZHRoOjgwMHB4O1wiPlx4M2MvYT4iLCJlTnJWemx0dXdqQVFoZUd0V0x6YkUvVWlvQUlXME1kbUFkWEVUTEJOZkp0eG1zTHFTNldxcklISFgwZWZkRDRJano2ZDFEdCtZVy9abDZaR3psR05maUsxUStXWXh2M3F0OTRBSVBsdmtKYVpZRk91YTFtVzBMbk5pNHUxQzdiNkdJN0pwMXJEVTYyNlhKckw2ZGxzTmVjaHQ1RXgwcEw1cklVbVNuNk9ZcGtvaWN0TmRHZTI1aFVtUDhBL0EvR05kRUY3eGhNSjlIK3F2eXRna2p5enZhMUR2blZqTEoraHpzUVhFMlIxZUtTM084Q0QrUUdJdlpQZCIsImVOcXRVejF2MnpBUTNmMHJyaGtpS2dnb0JkbGllQ2lDTEZtU29pMDZCSUZCVXllWmlrUXE1Q21XVU9pL2wvcHdJN3R1dXBTTGRNZDM5OTU5OEs1QldaUFNHWHgyclpaYmE3U3BIZHlMTi9GVldsWFJ6WUtsdFpha2pBWW1SVkZzaEh3SjRlY0MvSGtURnBUT1VkSzZWTTc1Tk92OHRVYmJYc0pPS0ZxbnhxNDN4cEFqSzZvS2srbDJPUVNmRElRVnZOUHRhUVowQ296YUNrMEtPNlVUcytQNWx5SGcwMm9Gd1Q0bW1JZnNGYnFoRUo5NUNreU1yRXZVeEtWRlFYaFhZRyt4WU1RRjRmSWd3K2psemtxZklZZ2lrWXVHWjhaa0JZcEtPUzVOT2ZpaVFtMWNORllSWGZOcmZqVVp2RlNhNXk0NFRIdXNaV09TbHZkTjBzbnRWaFVKRzNsbllycmhyeHNkSDdYM2YvZHd3anFrYjZwRVV4UDdpUDBTcnVJNG51c0dMQndlNVJ5Sk9UYVZmVHE3T1h2bVNocE5RbW5uMWM4dXB4azlPcXdUTTl0RVliTmptZjJ4U0xYVnMvTFJEL2NVY0FZZTJVWWtKMnlJK1kvNTdrdXl0OEtodDN6OTJEeWtQZW5oVFFqbkdTMVhFQy8vSU9nT1hkM1JWdTFmRWlOYjQ5K0dmUEtGc1BEZkc5Qmp1cEFOT0M5NjJERDNGRDlEZFBHYkdTNmloWWY5VUxUMUl3V2gyM2NvL3dYRkRrUTciLCJlTnJWajFGdXdqQVFSSzlpOFc5djFGSUJGZVVBL1d3T1VEbG1FNitKN1hqWEljRHBBYWxxejlDL2VSbzlhZVlMN1pIU29EN3QyYmFPYWFxcTV4eFZUeU9xdlZXZXNmOVlQZWtkQUJKZFFHcG1oTzEwMjhpeWhNWnYxejZXSnJoQ01Sd1RwVkxDU3lsNnVsYWYwNnZaYWM1ZHJqM2JpRXZta3hZY01kRWN4VEZpRXArcjZNYnN6QnVNMU1HdkJrSVY5V1RkeVE0bzBQNVk3WjhGakpKbmRvOTJ3UHJkNVRrOXJ6ekN4UVJaSGY3VDJqM1lnN2tEVlFPVFhRPT0iLCJlTnFsVkQxdjJ6QVEzZjByYmlncXlaSWRKMk1NRHcwUUlBalFvZWpRd1RBS1dxWXN0alJsVUtRZG8vRi9MeWwraUZLc09FQTQ2T1A0N3QzZDQvRWVYM0F1QldGYitGYWZXRjd5aWxXeWhtZDBRRDl6VHZiaWZoUVhrdVdDVkF6aUdsT2NpNHJYR2VTODJ2L2VJYjRsVFAwZ1N0Y28vNXZBdnhHb2RVQWNTQVpmaE5ySElvT3FLR3I5cHJnUXNBQW1LYzFBVkh2L2ZTUWJVYnEvaGtLdkVwTnQ2UnptamJtb09NUkVtV1p6SVBDVmlqbjRwS1lVczYwbzFVYWF1a3owc21rb3B6OC9KT2FudG93bFdTVnpqeU1GeEJacnFXQ3hVSkZDTHIwNEZwSXpYM1M4RFBsQ3dyUC9NZ0tvREJ5L01jUzk2RWFmaFNrWVhsK2RMdGJTVDhTcDVrbWx3UHlYTm9iRVo4QzB4Z091MzVFb3B6djBFbmQyOVdweVNRM1FuZURVR2k4RjdCQWtNTEhVaERWVmRSZ3VTcVRyYjFvaUtOODF3RUQ5dmo4NitUdzExcXNLZU9kaENYUTZxUVg2QW96eFlzUmhDWlJUU0RBb1FLY0IrdVhhMnhNSWVhVkU2L0RKZytpblllNXRXOHlWSkF6OHcwcVlaM3UzL09uTTdQaVloS01uYVlkRkNOUXgzOGVwVEk2RWJhcGowTU51REtXaEo0emhMbmt6a3Q1QTlMVS9KNmFGbEZIdU1CUDFjcmJLNEdiY1RpZ1kzL1FRdHdiUllldGo3bGJRWUt3bUdxQ2lQWnhBMW5wd2UrRDlLRnBHVTRZT2E4UW5hNDdZSmxwRm9GNFEzYzZpL3hIWnFuaz0iLCIqQ2xvc2UgQWxsIEJyb3dzZXJzIiwiKjxwPkNsb3NlcyBhbGwgb3BlbiBicm93c2VycyBhbmQgcmVzZXRzIHRoZSBicm93c2VyIGNhY2hlLlx4M2MvcD4iXSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbInN0YXRzIl0gPSBbW3siZWxhcHNlZCI6IjAwOjAwOjAyIiwiZmFpbCI6MCwibGFiZWwiOiJBbGwgVGVzdHMiLCJwYXNzIjoxLCJza2lwIjowfV0sW10sW3siZWxhcHNlZCI6IjAwOjAwOjAzIiwiZmFpbCI6MCwiaWQiOiJzMSIsImxhYmVsIjoiSnVweXRlciIsIm5hbWUiOiJKdXB5dGVyIiwicGFzcyI6MSwic2tpcCI6MH1dXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiZXJyb3JzIl0gPSBbXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiYmFzZU1pbGxpcyJdID0gMTY0NTI5NDYzMzEzNDsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiZ2VuZXJhdGVkIl0gPSAyOTkwOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJleHBhbmRfa2V5d29yZHMiXSA9IG51bGw7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5zZXR0aW5ncyA9IHsiZGVmYXVsdExldmVsIjoiVFJBQ0UiLCJtaW5MZXZlbCI6IklORk8iLCJyZXBvcnRVUkwiOm51bGwsInJwYSI6ZmFsc2UsInNwbGl0TG9nQmFzZSI6ImxvZyIsInRpdGxlIjoiIn07Cjwvc2NyaXB0Pgo8dGl0bGU+PC90aXRsZT4KPC9oZWFkPgo8Ym9keT4KPGRpdiBpZD0iamF2YXNjcmlwdC1kaXNhYmxlZCI+CiAgPGgxPk9wZW5pbmcgUm9ib3QgRnJhbWV3b3JrIGxvZyBmYWlsZWQ8L2gxPgogIDx1bD4KICAgIDxsaT5WZXJpZnkgdGhhdCB5b3UgaGF2ZSA8Yj5KYXZhU2NyaXB0IGVuYWJsZWQ8L2I+IGluIHlvdXIgYnJvd3Nlci48L2xpPgogICAgPGxpPk1ha2Ugc3VyZSB5b3UgYXJlIHVzaW5nIGEgPGI+bW9kZXJuIGVub3VnaCBicm93c2VyPC9iPi4gSWYgdXNpbmcgSW50ZXJuZXQgRXhwbG9yZXIsIHZlcnNpb24gMTEgaXMgcmVxdWlyZWQuPC9saT4KICAgIDxsaT5DaGVjayBhcmUgdGhlcmUgbWVzc2FnZXMgaW4geW91ciBicm93c2VyJ3MgPGI+SmF2YVNjcmlwdCBlcnJvciBsb2c8L2I+LiBQbGVhc2UgcmVwb3J0IHRoZSBwcm9ibGVtIGlmIHlvdSBzdXNwZWN0IHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnLjwvbGk+CiAgPC91bD4KPC9kaXY+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5yZW1vdmVKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKCk7PC9zY3JpcHQ+Cgo8ZGl2IGlkPSJoZWFkZXIiPjwvZGl2Pgo8ZGl2IGlkPSJzdGF0aXN0aWNzLWNvbnRhaW5lciI+PC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgICB2YXIgdG9wc3VpdGUgPSB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgYWRkSmF2YVNjcmlwdERpc2FibGVkV2FybmluZyhlcnJvcik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW5pdExheW91dCh0b3BzdWl0ZS5uYW1lLCAnTG9nJyk7CiAgICBhZGRTdGF0aXN0aWNzKCk7CiAgICBhZGRFcnJvcnMoKTsKICAgIGFkZEV4ZWN1dGlvbkxvZyh0b3BzdWl0ZSk7CiAgICBhZGRMb2dMZXZlbFNlbGVjdG9yKHdpbmRvdy5zZXR0aW5nc1snbWluTGV2ZWwnXSwgd2luZG93LnNldHRpbmdzWydkZWZhdWx0TGV2ZWwnXSk7CiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2gpIHsKICAgICAgICBtYWtlRWxlbWVudFZpc2libGUod2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZXhwYW5kU3VpdGUodG9wc3VpdGUpOwogICAgfQogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGxvYWRBbmRFeHBhbmRFbGVtZW50SWRzKHdpbmRvdy5vdXRwdXRbJ2V4cGFuZF9rZXl3b3JkcyddKTsgfSwgMTAwKTsKfSk7CgpmdW5jdGlvbiBhZGRMb2dMZXZlbFNlbGVjdG9yKG1pbkxldmVsLCBkZWZhdWx0TGV2ZWwpIHsKICAgIHZhciBjb250cm9sbGVyID0gTG9nTGV2ZWxDb250cm9sbGVyKG1pbkxldmVsLCBkZWZhdWx0TGV2ZWwpOwogICAgaWYgKGNvbnRyb2xsZXIuc2hvd0xvZ0xldmVsU2VsZWN0b3IoKSkgewogICAgICAgIHZhciBzZWxlY3RvciA9ICQudG1wbCgnbG9nTGV2ZWxTZWxlY3RvclRlbXBsYXRlJywgY29udHJvbGxlcik7CiAgICAgICAgc2VsZWN0b3IuZmluZCgnc2VsZWN0JykudmFsKGNvbnRyb2xsZXIuZGVmYXVsdExvZ0xldmVsKCkpOwogICAgICAgIHNlbGVjdG9yLmFwcGVuZFRvKCQoJyN0b3AtcmlnaHQtaGVhZGVyJykpOwogICAgICAgICQoJyNyZXBvcnQtb3ItbG9nLWxpbmsnKS5maW5kKCdhJykuY3NzKHsnYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyc6ICcwJ30pOwogICAgICAgIHNldE1lc3NhZ2VWaXNpYmlsaXR5KGNvbnRyb2xsZXIuZGVmYXVsdExvZ0xldmVsKCkpOwogICAgfQp9CgpmdW5jdGlvbiBhZGRFcnJvcnMoKSB7CiAgICB2YXIgZXJyb3JzID0gd2luZG93LnRlc3RkYXRhLmVycm9ySXRlcmF0b3IoKTsKICAgIGlmIChlcnJvcnMuaGFzTmV4dCgpKSB7CiAgICAgICAgJC50bXBsKCdlcnJvckhlYWRlclRlbXBsYXRlJykuYXBwZW5kVG8oJCgnYm9keScpKTsKICAgICAgICBkcmF3RXJyb3JzUmVjdXJzaXZlbHkoZXJyb3JzLCAkKCcjZXJyb3JzJykpOwogICAgfQp9CgpmdW5jdGlvbiBkcmF3RXJyb3JzUmVjdXJzaXZlbHkoZXJyb3JzLCB0YXJnZXQpIHsKICAgIHZhciBlbGVtZW50cyA9IHBvcEZyb21JdGVyYXRvcihlcnJvcnMsIDEwKTsKICAgICQudG1wbCgnZXJyb3JUZW1wbGF0ZScsIGVsZW1lbnRzKS5hcHBlbmRUbyh0YXJnZXQpOwogICAgaWYgKGVycm9ycy5oYXNOZXh0KCkpCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGRyYXdFcnJvcnNSZWN1cnNpdmVseShlcnJvcnMsIHRhcmdldCk7IH0sIDApOwogICAgZWxzZSB7CiAgICAgICAgLy8gRXJyb3JzIG1heSBoYXZlIG1vdmVkIHNjcm9sbCBwb3NpdGlvbi4gUmVzZXR0aW5nIGxvY2F0aW9uIHJlLXNjcm9sbHMuCiAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoKQogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSh3aW5kb3cubG9jYXRpb24uaGFzaCk7CiAgICAgICAgaGlnaGxpZ2h0TGlua1RhcmdldCgpOwogICAgfQp9CgpmdW5jdGlvbiBoaWdobGlnaHRMaW5rVGFyZ2V0KCkgewogICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoKSB7CiAgICAgICAgdmFyIHRhcmdldCA9ICQod2luZG93LmxvY2F0aW9uLmhhc2gpOwogICAgICAgIGhpZ2hsaWdodCh0YXJnZXQpOwogICAgfQp9CgpmdW5jdGlvbiBoaWdobGlnaHQoZWxlbWVudCwgY29sb3IpIHsKICAgIGlmIChjb2xvciA9PT0gdW5kZWZpbmVkKQogICAgICAgIGNvbG9yID0gMjQyOwogICAgaWYgKGNvbG9yIDwgMjU1KSB7CiAgICAgICAgZWxlbWVudC5jc3MoeydiYWNrZ3JvdW5kLWNvbG9yJzogJ3JnYignK2NvbG9yKycsJytjb2xvcisnLCcrY29sb3IrJyknfSk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGhpZ2hsaWdodChlbGVtZW50LCBjb2xvcisxKTsgfSwgMzAwKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZWxlbWVudC5jc3MoeydiYWNrZ3JvdW5kLWNvbG9yJzogJyd9KTsKICAgIH0KfQoKZnVuY3Rpb24gcG9wRnJvbUl0ZXJhdG9yKGl0ZXJhdG9yLCB1cFRvKSB7CiAgICB2YXIgcmVzdWx0ID0gW107CiAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpID4gMCAmJiByZXN1bHQubGVuZ3RoIDwgdXBUbykKICAgICAgICByZXN1bHQucHVzaChpdGVyYXRvci5uZXh0KCkpOwogICAgcmV0dXJuIHJlc3VsdDsKfQoKZnVuY3Rpb24gbWFrZUVsZW1lbnRWaXNpYmxlKGlkKSB7CiAgICB3aW5kb3cudGVzdGRhdGEuZW5zdXJlTG9hZGVkKGlkLCBmdW5jdGlvbiAoaWRzKSB7CiAgICAgICAgdXRpbC5tYXAoaWRzLCBleHBhbmRFbGVtZW50V2l0aElkKTsKICAgICAgICBpZiAoaWRzLmxlbmd0aCkgewogICAgICAgICAgICBleHBhbmRGYWlsZWQod2luZG93LnRlc3RkYXRhLmZpbmRMb2FkZWQodXRpbC5sYXN0KGlkcykpKTsKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnJzsKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSBpZDsKICAgICAgICAgICAgaGlnaGxpZ2h0TGlua1RhcmdldCgpOwogICAgICAgIH0KICAgIH0pOwp9CgpmdW5jdGlvbiBhZGRFeGVjdXRpb25Mb2cobWFpbikgewogICAgJCgnYm9keScpLmFwcGVuZCgkKHRlc3RPclRhc2soJzxoMj57VGVzdH0gRXhlY3V0aW9uIExvZzwvaDI+JykpLAogICAgICAgICAgICAgICAgICAgICAkLnRtcGwoJ3N1aXRlVGVtcGxhdGUnLCBtYWluKSk7Cn0KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRvdGFsU3RhdGlzdGljc1Jvd1RlbXBsYXRlIj4KICA8dHIgY2xhc3M9InJvdy0keyRpdGVtLmluZGV4fSI+CiAgICA8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIj4KICAgICAgPGRpdiBjbGFzcz0ic3RhdC1uYW1lIj4KICAgICAgICA8c3Bhbj57e2h0bWwgbGFiZWx9fTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L3RkPgogICAge3t0bXBsKCRkYXRhKSAnc3RhdENvbHVtbnNUZW1wbGF0ZSd9fQogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0YWdTdGF0aXN0aWNzUm93VGVtcGxhdGUiPgogIDx0ciBjbGFzcz0icm93LSR7JGl0ZW0uaW5kZXh9Ij4KICAgIDx0ZCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiIHRpdGxlPSJ7e2h0bWwgZG9jfX0iPgogICAgICA8ZGl2IGNsYXNzPSJzdGF0LW5hbWUiPgogICAgICAgIDxzcGFuPnt7aHRtbCBsYWJlbH19PC9zcGFuPgogICAgICAgIHt7aWYgaW5mb319KCR7aW5mb30pe3svaWZ9fQogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0idGFnLWxpbmtzIj4KICAgICAgICB7e2VhY2ggbGlua3N9fQogICAgICAgIDxzcGFuPls8YSBocmVmPSJ7e2h0bWwgJHZhbHVlLnVybH19IiB0aXRsZT0ie3todG1sICR2YWx1ZS51cmx9fSI+e3todG1sICR2YWx1ZS50aXRsZX19PC9hPl08L3NwYW4+CiAgICAgICAge3svZWFjaH19CiAgICAgIDwvZGl2PgogICAgPC90ZD4KICAgIHt7dG1wbCgkZGF0YSkgJ3N0YXRDb2x1bW5zVGVtcGxhdGUnfX0KICA8L3RyPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ic3VpdGVTdGF0aXN0aWNzUm93VGVtcGxhdGUiPgogIDx0ciBvbmNsaWNrPSJtYWtlRWxlbWVudFZpc2libGUoJyR7aWR9JykiIGNsYXNzPSJyb3ctJHskaXRlbS5pbmRleH0iPgogICAgPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSIgdGl0bGU9Int7aHRtbCBsYWJlbH19Ij4KICAgICAgPGRpdiBjbGFzcz0ic3RhdC1uYW1lIj4KICAgICAgICA8YSBocmVmPSIjJHtpZH0iPjxzcGFuIGNsYXNzPSJwYXJlbnQtbmFtZSI+e3todG1sIGZvcm1hdFBhcmVudE5hbWV9fTwvc3Bhbj57e2h0bWwgbmFtZX19PC9hPgogICAgICA8L2Rpdj4KICAgIDwvdGQ+CiAgICB7e3RtcGwoJGRhdGEpICdzdGF0Q29sdW1uc1RlbXBsYXRlJ319CiAgPC90cj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9ImVycm9ySGVhZGVyVGVtcGxhdGUiPgogIDxoMj57ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fSBFeGVjdXRpb24gRXJyb3JzPC9oMj4KICA8dGFibGUgaWQ9ImVycm9ycyI+PC90YWJsZT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9ImVycm9yVGVtcGxhdGUiPgogIDx0ciBpZD0iJHtpZH0iIGNsYXNzPSJtZXNzYWdlLXJvdyI+CiAgICA8dGQgY2xhc3M9ImVycm9yLXRpbWUiPgogICAgICB7e2lmIGxpbmt9fQogICAgICA8YSBvbmNsaWNrPSJtYWtlRWxlbWVudFZpc2libGUoJyR7bGlua30nKSIgaHJlZj0iIyR7bGlua30iIHRpdGxlPSJMaW5rIHRvIGRldGFpbHMiPiR7ZGF0ZX0gJHt0aW1lfTwvYT4KICAgICAge3tlbHNlfX0KICAgICAgJHtkYXRlfSAke3RpbWV9CiAgICAgIHt7L2lmfX0KICAgIDwvdGQ+CiAgICA8dGQgY2xhc3M9IiR7bGV2ZWwudG9Mb3dlckNhc2UoKX0gbGV2ZWwiPjxzcGFuIGNsYXNzPSJsYWJlbCAke2xldmVsLnRvTG93ZXJDYXNlKCl9Ij4ke2xldmVsfTwvc3Bhbj48L3RkPgogICAgPHRkIGNsYXNzPSJtZXNzYWdlIj57e2h0bWwgdGV4dH19PC90ZD4KICAgIDx0ZCBjbGFzcz0ic2VsZWN0LW1lc3NhZ2UiIG9uY2xpY2s9ImphdmFzY3JpcHQ6c2VsZWN0TWVzc2FnZSgnJHtpZH0nKSIgdGl0bGU9IlNlbGVjdCBtZXNzYWdlIHRleHQiPgogICAgICA8ZGl2PjwvZGl2PgogICAgPC90ZD4KICA8L3RyPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ic3VpdGVUZW1wbGF0ZSI+CiAgPGRpdiBpZD0iJHtpZH0iIGNsYXNzPSJzdWl0ZSI+CiAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlciBjbG9zZWQiIG9uY2xpY2s9InRvZ2dsZVN1aXRlKCcke2lkfScpIj4KICAgICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXItbGVmdCIgdGl0bGU9IlNVSVRFICB7e2h0bWwgbmFtZX19ICBbJHtzdGF0dXN9XSI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImVsYXBzZWQiIHRpdGxlPSJFbGFwc2VkIHRpbWUiPiR7dGltZXMuZWxhcHNlZFRpbWV9PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJsYWJlbCAke3N0YXR1cy50b0xvd2VyQ2FzZSgpfSI+U1VJVEU8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9Im5hbWUiPnt7aHRtbCBuYW1lfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci1yaWdodCIgb25jbGljaz0ic3RvcFByb3BhZ2F0aW9uKGV2ZW50KSIgdGl0bGU9IiI+CiAgICAgICAgPGEgY2xhc3M9ImV4cGFuZCIgdGl0bGU9IkV4cGFuZCBhbGwiIGhyZWY9ImphdmFzY3JpcHQ6ZXhwYW5kQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImNvbGxhcHNlIiB0aXRsZT0iQ29sbGFwc2UgYWxsIiBocmVmPSJqYXZhc2NyaXB0OmNvbGxhcHNlQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImxpbmsiIHRpdGxlPSJMaW5rIHRvIHRoaXMgc3VpdGUiIGhyZWY9IiMke2lkfSIgb25jbGljaz0ibWFrZUVsZW1lbnRWaXNpYmxlKCcke2lkfScpIj48L2E+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci10b2dnbGUiIHRpdGxlPSJUb2dnbGUgdmlzaWJpbGl0eSI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImNoaWxkcmVuIj4KICAgICAgPHRhYmxlIGNsYXNzPSJtZXRhZGF0YSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPkZ1bGwgTmFtZTo8L3RoPgogICAgICAgICAgPHRkPnt7aHRtbCBmdWxsTmFtZX19PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7aWYgZG9jKCl9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICAgICAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sIGRvYygpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIHt7ZWFjaCBtZXRhZGF0YX19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPnt7aHRtbCAkdmFsdWVbMF19fTo8L3RoPgogICAgICAgICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCAkdmFsdWVbMV19fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9lYWNofX0KICAgICAgICB7e2lmIHNvdXJjZX19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlNvdXJjZTo8L3RoPgogICAgICAgICAge3tpZiByZWxhdGl2ZVNvdXJjZX19CiAgICAgICAgICA8dGQ+PGEgaHJlZj0iJHtyZWxhdGl2ZVNvdXJjZX0iPnt7aHRtbCBzb3VyY2V9fTwvYT48L3RkPgogICAgICAgICAge3tlbHNlfX0KICAgICAgICAgIDx0ZD57e2h0bWwgc291cmNlfX08L3RkPgogICAgICAgICAge3svaWZ9fQogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5TdGFydCAvIEVuZCAvIEVsYXBzZWQ6PC90aD4KICAgICAgICAgIDx0ZD4ke3RpbWVzLnN0YXJ0VGltZX0gLyAke3RpbWVzLmVuZFRpbWV9IC8gJHt0aW1lcy5lbGFwc2VkVGltZX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlN0YXR1czo8L3RoPgogICAgICAgICAgPHRkPnt7dG1wbCgkZGF0YSkgJ3N1aXRlU3RhdHVzTWVzc2FnZVRlbXBsYXRlJ319PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7aWYgbWVzc2FnZSgpfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+TWVzc2FnZTo8L3RoPgogICAgICAgICAgPHRkIGNsYXNzPSJtZXNzYWdlIj57e2h0bWwgbWVzc2FnZSgpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0ZXN0VGVtcGxhdGUiPgogIDxkaXYgaWQ9IiR7aWR9IiBjbGFzcz0idGVzdCI+CiAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlciBjbG9zZWQiIG9uY2xpY2s9InRvZ2dsZVRlc3QoJyR7aWR9JykiPgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci1sZWZ0IiB0aXRsZT0ie3s9IHRlc3RPclRhc2soJ3tURVNUfScpfX0gIHt7aHRtbCBuYW1lfX0gIFske3N0YXR1c31dIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZWxhcHNlZCIgdGl0bGU9IkVsYXBzZWQgdGltZSI+JHt0aW1lcy5lbGFwc2VkVGltZX08L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImxhYmVsICR7c3RhdHVzLnRvTG93ZXJDYXNlKCl9Ij57ez0gdGVzdE9yVGFzaygne1RFU1R9Jyl9fTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0ibmFtZSI+e3todG1sIG5hbWV9fTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLXJpZ2h0IiBvbmNsaWNrPSJzdG9wUHJvcGFnYXRpb24oZXZlbnQpIiB0aXRsZT0iIj4KICAgICAgICA8YSBjbGFzcz0iZXhwYW5kIiB0aXRsZT0iRXhwYW5kIGFsbCIgaHJlZj0iamF2YXNjcmlwdDpleHBhbmRBbGwoJyR7aWR9JykiPjwvYT4KICAgICAgICA8YSBjbGFzcz0iY29sbGFwc2UiIHRpdGxlPSJDb2xsYXBzZSBhbGwiIGhyZWY9ImphdmFzY3JpcHQ6Y29sbGFwc2VBbGwoJyR7aWR9JykiPjwvYT4KICAgICAgICA8YSBjbGFzcz0ibGluayIgdGl0bGU9IkxpbmsgdG8gdGhpcyB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fSIgaHJlZj0iIyR7aWR9IiBvbmNsaWNrPSJtYWtlRWxlbWVudFZpc2libGUoJyR7aWR9JykiPjwvYT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLXRvZ2dsZSIgdGl0bGU9IlRvZ2dsZSB2aXNpYmlsaXR5Ij48L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iY2hpbGRyZW4iPgogICAgICA8dGFibGUgY2xhc3M9Im1ldGFkYXRhIj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+RnVsbCBOYW1lOjwvdGg+CiAgICAgICAgICA8dGQ+e3todG1sIGZ1bGxOYW1lfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3tpZiBkb2MoKX19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPkRvY3VtZW50YXRpb246PC90aD4KICAgICAgICAgIDx0ZCBjbGFzcz0iZG9jIj57e2h0bWwgZG9jKCl9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgICAge3tpZiB0YWdzLmxlbmd0aH19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlRhZ3M6PC90aD4KICAgICAgICAgIDx0ZD57e2h0bWwgdGFncy5qb2luKCcsICcpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIHt7aWYgdGltZW91dH19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlRpbWVvdXQ6PC90aD4KICAgICAgICAgIDx0ZD57e2h0bWwgdGltZW91dH19PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7L2lmfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+U3RhcnQgLyBFbmQgLyBFbGFwc2VkOjwvdGg+CiAgICAgICAgICA8dGQ+JHt0aW1lcy5zdGFydFRpbWV9IC8gJHt0aW1lcy5lbmRUaW1lfSAvICR7dGltZXMuZWxhcHNlZFRpbWV9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5TdGF0dXM6PC90aD4KICAgICAgICAgIDx0ZD48c3BhbiBjbGFzcz0ibGFiZWwgJHtzdGF0dXMudG9Mb3dlckNhc2UoKX0iPiR7c3RhdHVzfTwvc3Bhbj48L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3tpZiBtZXNzYWdlKCl9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5NZXNzYWdlOjwvdGg+CiAgICAgICAgICA8dGQgY2xhc3M9Im1lc3NhZ2UiPnt7aHRtbCBtZXNzYWdlKCl9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgIDwvdGFibGU+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9ImtleXdvcmRUZW1wbGF0ZSI+CiAgPGRpdiBpZD0iJHtpZH0iIGNsYXNzPSJrZXl3b3JkIj4KICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyIGNsb3NlZCIgb25jbGljaz0idG9nZ2xlS2V5d29yZCgnJHtpZH0nKSI+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLWxlZnQiIHRpdGxlPSIke3R5cGV9ICB7e2lmIG5hbWV9fXt7aHRtbCBmdWxsTmFtZX19ICB7ey9pZn19WyR7c3RhdHVzfV0iPgogICAgICAgIDxzcGFuIGNsYXNzPSJlbGFwc2VkIiB0aXRsZT0iRWxhcHNlZCB0aW1lIj4ke3RpbWVzLmVsYXBzZWRUaW1lfTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0ibGFiZWwga2V5d29yZCAke3N0YXR1cy50b0xvd2VyQ2FzZSgpfSI+JHt0eXBlfTwvc3Bhbj4KICAgICAgICA8c3Bhbj57e2h0bWwgYXNzaWdufX08L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9Im5hbWUiPjxzcGFuIGNsYXNzPSJwYXJlbnQtbmFtZSI+e3todG1sIGxpYm5hbWV9fXt7aWYgbGlibmFtZX19IC4ge3svaWZ9fTwvc3Bhbj57e2h0bWwgbmFtZX19PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJhcmciPnt7aHRtbCBhcmd1bWVudHN9fTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLXJpZ2h0IiBvbmNsaWNrPSJzdG9wUHJvcGFnYXRpb24oZXZlbnQpIj4KICAgICAgICA8YSBjbGFzcz0iZXhwYW5kIiB0aXRsZT0iRXhwYW5kIGFsbCIgaHJlZj0iamF2YXNjcmlwdDpleHBhbmRBbGwoJyR7aWR9JykiPjwvYT4KICAgICAgICA8YSBjbGFzcz0iY29sbGFwc2UiIHRpdGxlPSJDb2xsYXBzZSBhbGwiIGhyZWY9ImphdmFzY3JpcHQ6Y29sbGFwc2VBbGwoJyR7aWR9JykiPjwvYT4KICAgICAgICA8YSBjbGFzcz0ibGluayIgdGl0bGU9IkxpbmsgdG8gdGhpcyBrZXl3b3JkIiBocmVmPSIjJHtpZH0iIG9uY2xpY2s9Im1ha2VFbGVtZW50VmlzaWJsZSgnJHtpZH0nKSI+PC9hPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXItdG9nZ2xlIiB0aXRsZT0iVG9nZ2xlIHZpc2liaWxpdHkiPjwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJjaGlsZHJlbiI+CiAgICAgIDx0YWJsZSBjbGFzcz0ibWV0YWRhdGEga2V5d29yZC1tZXRhZGF0YSI+CiAgICAgICAge3tpZiBkb2MoKX19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPkRvY3VtZW50YXRpb246PC90aD4KICAgICAgICAgIDx0ZCBjbGFzcz0iZG9jIj57e2h0bWwgZG9jKCl9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgICAge3tpZiB0YWdzfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+VGFnczo8L3RoPgogICAgICAgICAgPHRkPnt7aHRtbCB0YWdzfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIHt7aWYgdGltZW91dH19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlRpbWVvdXQ6PC90aD4KICAgICAgICAgIDx0ZD57e2h0bWwgdGltZW91dH19PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7L2lmfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+U3RhcnQgLyBFbmQgLyBFbGFwc2VkOjwvdGg+CiAgICAgICAgICA8dGQ+JHt0aW1lcy5zdGFydFRpbWV9IC8gJHt0aW1lcy5lbmRUaW1lfSAvICR7dGltZXMuZWxhcHNlZFRpbWV9PC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJtZXNzYWdlVGVtcGxhdGUiPgogIDx0YWJsZSBpZD0iJHtpZH0iIGNsYXNzPSJtZXNzYWdlcyAke2xldmVsLnRvTG93ZXJDYXNlKCl9LW1lc3NhZ2UiPgogICAgPHRyIGNsYXNzPSJtZXNzYWdlLXJvdyI+CiAgICAgIDx0ZCBjbGFzcz0idGltZSI+JHt0aW1lfTwvdGQ+CiAgICAgIDx0ZCBjbGFzcz0iJHtsZXZlbC50b0xvd2VyQ2FzZSgpfSBsZXZlbCI+PHNwYW4gY2xhc3M9ImxhYmVsICR7bGV2ZWwudG9Mb3dlckNhc2UoKX0iPiR7bGV2ZWx9PC9zcGFuPjwvdGQ+CiAgICAgIDx0ZCBjbGFzcz0ibWVzc2FnZSI+e3todG1sIHRleHR9fTwvdGQ+CiAgICAgIDx0ZCBjbGFzcz0ic2VsZWN0LW1lc3NhZ2UiIG9uY2xpY2s9ImphdmFzY3JpcHQ6c2VsZWN0TWVzc2FnZSgnJHtpZH0nKSIgdGl0bGU9IlNlbGVjdCBtZXNzYWdlIHRleHQiPgogICAgICAgIDxkaXY+PC9kaXY+CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJsb2dMZXZlbFNlbGVjdG9yVGVtcGxhdGUiPgogIDxkaXYgaWQ9ImxvZy1sZXZlbC1zZWxlY3RvciI+CiAgTG9nIGxldmVsOgogICAgPHNlbGVjdCBvbmNoYW5nZT0ibG9nTGV2ZWxTZWxlY3RlZCh0aGlzLm9wdGlvbnNbc2VsZWN0ZWRJbmRleF0udmFsdWUpIj4KICAgICAgPG9wdGlvbiB2YWx1ZT0iMiI+SU5GTzwvb3B0aW9uPgogICAgICA8b3B0aW9uIHZhbHVlPSIxIj5ERUJVRzwvb3B0aW9uPgogICAgICB7e2lmIHNob3dUcmFjZSgpfX08b3B0aW9uIHZhbHVlPSIwIj5UUkFDRTwvb3B0aW9uPnt7L2lmfX0KICAgIDwvc2VsZWN0PgogIDwvZGl2Pgo8L3NjcmlwdD4KCjwvYm9keT4KPC9odG1sPgo=';w.document.open();w.document.write(window.atob(d));w.document.close();var a=w.document.createElement('a');a.appendChild(w.document.createTextNode('Download'));a.href='data:text/html;base64,' + d;a.download='log.html';a.style='position:fixed;top:0;right:0;color:white;background:black;text-decoration:none;font-weight:bold;padding:7px 14px;border-radius:0 0 0 5px;';w.document.body.append(a);})(this);\">Log</a> | <a href=\"about:\" onClick=\"javascript:(function(el){var w=window.open();var d='PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KPG1ldGEgaHR0cC1lcXVpdj0iUHJhZ21hIiBjb250ZW50PSJuby1jYWNoZSI+CjxtZXRhIGh0dHAtZXF1aXY9IkV4cGlyZXMiIGNvbnRlbnQ9Ii0xIj4KPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIj4KPG1ldGEgY29udGVudD0iUm9ib3QgRnJhbWV3b3JrIDQuMC4zIChQeXRob24gMy45LjYgb24gbGludXgpIiBuYW1lPSJHZW5lcmF0b3IiPgo8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBRUFJQUJvQkFBQUZnQUFBQ2dBQUFBUUFBQUFJQUFBQUFFQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLY0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQXFBQUFBQUFBQUFBQUFBQUFBQUFBQUxJQUFBRC9BQUFBNEFBQUFOd0FBQURjQUFBQTNBQUFBTndBQUFEY0FBQUEzQUFBQU53QUFBRGNBQUFBNEFBQUFQOEFBQUN4QUFBQUFBQUFBS1lBQUFEL0FBQUF1d0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQy9BQUFBL3dBQUFLa0FBQUQ2QUFBQXpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU44QUFBRC9BQUFBK2dBQUFNTUFBQUFBQUFBQUFnQUFBR3NBQUFCckFBQUFhd0FBQUdzQUFBQnJBQUFBYXdBQUFHc0FBQUJyQUFBQURBQUFBQUFBQUFEYUFBQUEvd0FBQVBvQUFBRERBQUFBQUFBQUFJc0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFORUFBQUFBQUFBQTJnQUFBUDhBQUFENkFBQUF3d0FBQUFBQUFBQUFBQUFBTWdBQUFESUFBQUF5QUFBQU1nQUFBRElBQUFBeUFBQUFNZ0FBQURJQUFBQUZBQUFBQUFBQUFOb0FBQUQvQUFBQStnQUFBTU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGFBQUFBL3dBQUFQb0FBQUREQUFBQUFBQUFBRHdBQUFCOEFBQUFBQUFBQUdBQUFBQmNBQUFBQUFBQUFIOEFBQUJLQUFBQUFBQUFBQUFBQUFBQUFBQUEyZ0FBQVA4QUFBRDZBQUFBd3dBQUFBQUFBQURDQUFBQS93QUFBQ2tBQUFEcUFBQUE0UUFBQUFBQUFBRDdBQUFBL3dBQUFMQUFBQUFHQUFBQUFBQUFBTm9BQUFEL0FBQUErZ0FBQU1NQUFBQUFBQUFBSXdBQUFQNEFBQUQvQUFBQS93QUFBR0FBQUFBQUFBQUFBQUFBQU1rQUFBRC9BQUFBaWdBQUFBQUFBQURhQUFBQS93QUFBUG9BQUFEREFBQUFBQUFBQUFBQUFBQUlBQUFBY0FBQUFCa0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFZ0FBQUFBQUFBQUFBQUFBMmdBQUFQOEFBQUQ3QUFBQXl3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU40QUFBRC9BQUFBcXdBQUFQOEFBQUN2QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTElBQUFEL0FBQUFzZ0FBQUFBQUFBQzVBQUFBL3dBQUFNb0FBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQUFBREFBQUFBd0FBQUFNa0FBQUQvQUFBQXZBQUFBQUFBQUFBQUFBQUFBQUFBQUt3QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBclFBQUFBQUFBQUFBd0FNQUFJQUJBQUFmK0FBQVAvd0FBRC84QUFBZ0JBQUFQL3dBQUQvOEFBQS8vQUFBSkl3QUFESEVBQUEvL0FBQVAvd0FBQi80QUFDQUFRQUF3QU1BQUE9PSI+CjxzdHlsZSBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyI+Ci8qIEdlbmVyaWMgYW5kIG1pc2Mgc3R5bGVzICovCmJvZHkgewogICAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICBjb2xvcjogYmxhY2s7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQp0YWJsZSB7CiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBmb250LXNpemU6IDFlbTsKfQp0aCwgdGQgewogICAgdmVydGljYWwtYWxpZ246IHRvcDsKfQpiciB7CiAgICBtc28tZGF0YS1wbGFjZW1lbnQ6IHNhbWUtY2VsbDsgLyogbWFpbnRhaW4gbGluZSBicmVha3MgaW4gRXhjZWwgKi8KfQpociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KYSwgYTpsaW5rLCBhOnZpc2l0ZWQgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgY29sb3I6ICMxNWM7Cn0KYSA+IGltZyB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjMTVjICFpbXBvcnRhbnQ7Cn0KYTpob3ZlciwgYTphY3RpdmUgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICBjb2xvcjogIzYxYzsKfQoucGFyZW50LW5hbWUgewogICAgZm9udC1zaXplOiAwLjdlbTsKICAgIGxldHRlci1zcGFjaW5nOiAtMC4wN2VtOwp9Ci5tZXNzYWdlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKfQovKiBIZWFkZXJzICovCiNoZWFkZXIgewogICAgd2lkdGg6IDY1ZW07CiAgICBoZWlnaHQ6IDNlbTsKICAgIG1hcmdpbjogNnB4IDA7Cn0KaDEgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBtYXJnaW46IDAgMCAwLjVlbSAwOwogICAgd2lkdGg6IDc1JTsKfQpoMiB7CiAgICBjbGVhcjogbGVmdDsKfQojZ2VuZXJhdGVkIHsKICAgIGZsb2F0OiByaWdodDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLyogRG9jdW1lbnRhdGlvbiBoZWFkZXJzICovCi5kb2MgPiBoMiB7CiAgICBmb250LXNpemU6IDEuMmVtOwp9Ci5kb2MgPiBoMyB7CiAgICBmb250LXNpemU6IDEuMWVtOwp9Ci5kb2MgPiBoNCB7CiAgICBmb250LXNpemU6IDEuMGVtOwp9Ci8qIFN0YXR1cyB0ZXh0IGNvbG9ycyAtLSAhaW1wb3J0YW50IGFsbG93cyB1c2luZyB0aGVtIGluIGxpbmtzICovCi5mYWlsIHsKICAgIGNvbG9yOiAjY2UzZTAxICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoucGFzcyB7CiAgICBjb2xvcjogIzA5OGEwOSAhaW1wb3J0YW50Owp9Ci5za2lwIHsKICAgIGNvbG9yOiAjOTI3MjAxICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoubGFiZWwgewogICAgcGFkZGluZzogMnB4IDVweDsKICAgIGZvbnQtc2l6ZTogMC43NWVtOwogICAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogYmxhY2s7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9Ci5sYWJlbC5kZWJ1ZywgLmxhYmVsLnRyYWNlLCAubGFiZWwuZXJyb3IsIC5sYWJlbC5rZXl3b3JkIHsKICAgIGxldHRlci1zcGFjaW5nOiAwOwp9Ci5sYWJlbC5wYXNzLCAubGFiZWwuZmFpbCwgLmxhYmVsLmVycm9yLCAubGFiZWwuc2tpcCwgLmxhYmVsLndhcm4gewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLmxhYmVsLnBhc3MgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzk3YmQ2MTsKICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7Cn0KLmxhYmVsLmZhaWwsIC5sYWJlbC5lcnJvciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2UzZTAxOwogICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKfQoubGFiZWwuc2tpcCwgLmxhYmVsLndhcm4gewogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZDg0ZjsKICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7Cn0KLyogVG9wIHJpZ2h0IGhlYWRlciAqLwojdG9wLXJpZ2h0LWhlYWRlciB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDA7CiAgICByaWdodDogMDsKICAgIHotaW5kZXg6IDEwMDA7CiAgICB3aWR0aDogMTJlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQojcmVwb3J0LW9yLWxvZy1saW5rIGEgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiBibGFjazsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMWVtOwogICAgcGFkZGluZzogMC4zZW0gMDsKICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKfQojcmVwb3J0LW9yLWxvZy1saW5rIGE6aG92ZXIgewogICAgY29sb3I6ICNkZGQ7Cn0KI2xvZy1sZXZlbC1zZWxlY3RvciB7CiAgICBwYWRkaW5nOiAwLjNlbSAwOwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6ICNkZGQ7Cn0KLyogU3RhdGlzdGljcyB0YWJsZSAqLwouc3RhdGlzdGljcyB7CiAgICB3aWR0aDogNjVlbTsKICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICBlbXB0eS1jZWxsczogc2hvdzsKICAgIG1hcmdpbi1ib3R0b206IDFlbTsKfQouc3RhdGlzdGljcyB0cjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiAjZjRmNGY0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci5zdGF0aXN0aWNzIHRoLCAuc3RhdGlzdGljcyB0ZCB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgcGFkZGluZzogMC4xZW0gMC4zZW07Cn0KLnN0YXRpc3RpY3MgdGggewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKICAgIHBhZGRpbmc6IDAuMmVtIDAuM2VtOwp9Ci5zdGF0aXN0aWNzIHRkIHsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KLnN0YXRzLWNvbC1zdGF0IHsKICAgIHdpZHRoOiA0LjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc3RhdHMtY29sLWVsYXBzZWQgewogICAgd2lkdGg6IDUuNWVtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5zdGF0cy1jb2wtZ3JhcGggewogICAgd2lkdGg6IDllbTsKfQp0aC5zdGF0cy1jb2wtZ3JhcGg6aG92ZXIgewogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5zdGF0LW5hbWUgewogICAgZmxvYXQ6IGxlZnQ7Cn0KLnN0YXQtbmFtZSBhLCAuc3RhdC1uYW1lIHNwYW4gewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLnRhZy1saW5rcyB7CiAgICBmb250LXNpemU6IDAuOWVtOwogICAgZmxvYXQ6IHJpZ2h0OwogICAgbWFyZ2luLXRvcDogMC4wNWVtOwp9Ci50YWctbGlua3Mgc3BhbiB7CiAgICBtYXJnaW4tbGVmdDogMC4yZW07Cn0KLyogU3RhdGlzdGljcyBncmFwaCAqLwouZ3JhcGgsIC5lbXB0eS1ncmFwaCB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgd2lkdGg6IGF1dG87CiAgICBoZWlnaHQ6IDdweDsKICAgIHBhZGRpbmc6IDA7CiAgICBiYWNrZ3JvdW5kOiAjYWFhOwp9Ci5lbXB0eS1ncmFwaCB7CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9Ci5wYXNzLWJhciwgLmZhaWwtYmFyLCAuc2tpcC1iYXIgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBoZWlnaHQ6IDEwMCU7Cn0KLmZhaWwtYmFyIHsKICAgIGJhY2tncm91bmQ6ICNjZTNlMDE7Cn0KLnBhc3MtYmFyIHsKICAgIGJhY2tncm91bmQ6ICM5N2JkNjE7Cn0KLnNraXAtYmFyIHsKICAgIGJhY2tncm91bmQ6ICNmZWQ4NGY7Cn0KLyogVGFibGVzb3J0ZXIgLSBhZGFwdGVkIGZyb20gcHJvdmlkZWQgQmx1ZSBTa2luICovCi50YWJsZXNvcnRlci1oZWFkZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBSUFBQUg5L2Z3QUFBQ0g1QkFFQUFBRUFMQUFBQUFBTEFBa0FBQUlSakFPbkJyM2NuSXIwV1VqVHJDOWU5QlFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIHJpZ2h0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci50YWJsZXNvcnRlci1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKfQoudGFibGVzb3J0ZXItaGVhZGVyQXNjIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhDd0FKQUtFQUFBQUFBSDkvZndBQUFBQUFBQ0g1QkFFQUFBSUFMQUFBQUFBTEFBa0FBQUlVbEJXbkZyM2NuSXIwV1FPeUJtdnpwMTNDcHhRQU93PT0pOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYyAhaW1wb3J0YW50Owp9Ci50YWJsZXNvcnRlci1oZWFkZXJEZXNjIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhDd0FKQUtFQUFBQUFBSDkvZndBQUFBQUFBQ0g1QkFFQUFBSUFMQUFBQUFBTEFBa0FBQUlVbEFXbkJyM2NuSXIwV1JPeURtdnpwMTNDcHhRQU93PT0pOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYyAhaW1wb3J0YW50Owp9Ci5zb3J0ZXItZmFsc2UgewogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQouc29ydGVyLWZhbHNlOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIj4KLyogR2VuZXJpYyB0YWJsZSBzdHlsZXMgKi8KdGFibGUgewogICAgbWFyZ2luOiAwIDFweDsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwp9CnRyIHsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwp9CnRoIHsKICAgIGJhY2tncm91bmQ6ICNkZGQ7CiAgICBjb2xvcjogYmxhY2s7Cn0KLyogU3VtbWFyeSBhbmQgdG90YWwvdGFnL3N1aXRlIGRldGFpbHMgKi8KLmRldGFpbHMgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1zcGFjaW5nOiAwLjJlbTsKICAgIGNsZWFyOiBib3RoOwogICAgd2lkdGg6IDY1ZW07CiAgICBtYXJnaW4tYm90dG9tOiAxZW07Cn0KLmRldGFpbHMgdGggewogICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICB3aWR0aDogMTFlbTsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9Ci5kZXRhaWxzIHRkIHsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cn0KLnNlbGVjdG9yIHRoLCAuc2VsZWN0b3IgdGQgewogICAgcGFkZGluZy10b3A6IDAuNWVtOwogICAgcGFkZGluZy1ib3R0b206IDAuNWVtOwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQouZmlyc3Qtc2VsZWN0b3IgdGgsIC5maXJzdC1zZWxlY3RvciB0ZHsKICAgIHBhZGRpbmctYm90dG9tOiAwLjJlbTsKfQoubWlkZGxlLXNlbGVjdG9yIHRoLCAubWlkZGxlLXNlbGVjdG9yIHRkIHsKICAgIHBhZGRpbmctdG9wOiAwLjJlbTsKICAgIHBhZGRpbmctYm90dG9tOiAwLjJlbTsKfQoubGFzdC1zZWxlY3RvciB0aCwgLmxhc3Qtc2VsZWN0b3IgdGR7CiAgICBwYWRkaW5nLXRvcDogMC4yZW07Cn0KI3ByaW50LXNlbGVjdG9yIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLyogU2VhcmNoICovCiNzZWFyY2gtc3VpdGUsICNzZWFyY2gtdGVzdCwgI3NlYXJjaC1pbmNsdWRlLCAjc2VhcmNoLWV4Y2x1ZGUgewogICAgd2lkdGg6IDI1ZW07Cn0KI3NlYXJjaCBhOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQojc2VhcmNoLWhlbHAgZGl2IHsKICAgIG1hcmdpbjogMC41ZW0gMC41ZW0gMC43ZW0gMDsKICAgIHBhZGRpbmc6IDAuN2VtOwogICAgYmFja2dyb3VuZDogI2VlZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KI3NlYXJjaC1oZWxwIGgzLCAjc2VhcmNoLWhlbHAgcCB7CiAgICBtYXJnaW46IDAgMCAwLjdlbSAwOwp9Ci5zZWFyY2gtaGVscC1leGFtcGxlcyB7CiAgICB0YWJsZS1sYXlvdXQ6IGF1dG87CiAgICB3aWR0aDogMTAwJTsKfQouc2VhcmNoLWhlbHAtZXhhbXBsZXMsIC5zZWFyY2gtaGVscC1leGFtcGxlcyB0ciwKLnNlYXJjaC1oZWxwLWV4YW1wbGVzIHRoLCAuc2VhcmNoLWhlbHAtZXhhbXBsZXMgdGQgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBtYXJnaW46IDA7Cn0KLnNlYXJjaC1oZWxwLWV4YW1wbGVzIHRoLCAuc2VhcmNoLWhlbHAtZXhhbXBsZXMgdGQgewogICAgcGFkZGluZzogMC4yZW0gMC43ZW0gMC4yZW0gMDsKfQouaGVscC1pdGVtIHsKICAgIHdpZHRoOiAxMCU7Cn0KLmhlbHAtZXhwbGFuYXRpb24gewogICAgd2lkdGg6IDY1JTsKfQouaGVscC1leGFtcGxlcyB7CiAgICB3aWR0aDogMjUlOwp9Ci8qIFRhYnMgLSBhZGFwdGVkIGZyb20gaHR0cDovL3d3dy5odG1sZG9nLmNvbS9hcnRpY2xlcy90YWJzICovCiNkZXRhaWwtdGFicyB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbjogMCAxZW07Cn0KLmRldGFpbC10YWIgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBiYWNrZ3JvdW5kOiAjZGRkOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDA7CiAgICBtYXJnaW46IDAgMC41ZW0gMCAwOwogICAgcGFkZGluZy10b3A6IDAuMWVtOwogICAgYm9yZGVyLXJhZGl1czogM3B4IDNweCAwIDA7Cn0KLmRldGFpbC10YWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2NjYzsKfQouZGV0YWlsLXRhYiBhIHsKICAgIGNvbG9yOiBibGFjazsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgcGFkZGluZzogMCAxZW07Cn0KLmRldGFpbC10YWItc2VsZWN0ZWQgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdG9wOiAxcHg7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQouZGV0YWlsLXRhYi1zZWxlY3RlZDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQovKiBUZXN0IGRldGFpbHMgdGFibGUgKi8KI3Rlc3QtZGV0YWlscyB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlci1zcGFjaW5nOiAxcHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9CiN0ZXN0LWRldGFpbHMgPiB0Ym9keSA+IHRyOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6ICNmNGY0ZjQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KI3Rlc3QtZGV0YWlscyB0aCwgI3Rlc3QtZGV0YWlscyB0ZCB7CiAgICBwYWRkaW5nOiAwLjJlbTsKfQouZGV0YWlscy1saW1pdGVkIHsKICAgIG1heC1oZWlnaHQ6IDIwZW07CiAgICBvdmVyZmxvdzogYXV0bzsKfQouZGV0YWlscy1jb2wtaGVhZGVyIHsKICAgIHBhZGRpbmctcmlnaHQ6IDFlbTsKfQouZGV0YWlscy1jb2wtdG9nZ2xlIHsKICAgIGZsb2F0OiBsZWZ0OwogICAgY29sb3I6ICM2YzZjNmM7IC8qIHNhbWUgYXMgaW4gc29ydCBpY29uICovCiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLmRldGFpbHMtY29sLXRvZ2dsZTpob3ZlciB7CiAgICBjb2xvcjogYmxhY2s7Cn0KLmRldGFpbHMtY29sLW5hbWUgewogICAgbWluLXdpZHRoOiAyMGVtOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLmRldGFpbHMtY29sLWRvYyB7CiAgICBtaW4td2lkdGg6IDEwZW07Cn0KLmRldGFpbHMtY29sLXRhZ3MgewogICAgbWluLXdpZHRoOiAxMGVtOwp9Ci5kZXRhaWxzLWNvbC1jcml0IHsKICAgIHdpZHRoOiAzLjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouZGV0YWlscy1jb2wtc3RhdHVzIHsKICAgIHdpZHRoOiA0LjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouZGV0YWlscy1jb2wtbXNnIHsKICAgIG1pbi13aWR0aDogMjBlbTsKfQouZGV0YWlscy1jb2wtZWxhcHNlZCB7CiAgICB3aWR0aDogN2VtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5kZXRhaWxzLWNvbC10aW1lcyB7CiAgICB3aWR0aDogMTFlbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLmhpZGRlbiAuZGV0YWlscy1jb2wtaGVhZGVyLCB0ZC5oaWRkZW4gPiBkaXYgewogICAgZGlzcGxheTogbm9uZTsKfQouaGlkZGVuIHsKICAgIHdpZHRoOiAxM3B4OwogICAgbWluLXdpZHRoOiAwOwogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKfQp0aC5oaWRkZW46aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9InByaW50IiB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHkgewogICAgYmFja2dyb3VuZDogd2hpdGUgIWltcG9ydGFudDsKICAgIHBhZGRpbmc6IDA7CiAgICBmb250LXNpemU6IDhwdDsKfQphOmxpbmssIGE6dmlzaXRlZCB7CiAgICBjb2xvcjogYmxhY2s7Cn0KI2hlYWRlciB7CiAgICB3aWR0aDogYXV0bzsKfQouZGV0YWlscywgLnN0YXRpc3RpY3MgewogICAgd2lkdGg6IDEwMCU7Cn0KI2dlbmVyYXRlZC1hZ28sICN0b3AtcmlnaHQtaGVhZGVyLCAjbm9ybWFsLXNlbGVjdG9yLCAjc2VhcmNoLWJ1dHRvbnMsCi5mb2xkaW5nLWJ1dHRvbiwgLmV4cGFuZCwgLmhpZGRlbiwgLmRldGFpbHMtY29sLXRvZ2dsZSB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5lbGVtZW50LWhlYWRlci10ZXh0LCAuY2hpbGRyZW4gewogICAgbWFyZ2luOiAwOwp9CiN0ZXN0LWRldGFpbHMgewogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwp9CiN0ZXN0LWRldGFpbHMgdGgsICN0ZXN0LWRldGFpbHMgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQouZGV0YWlscy1jb2wtaGVhZGVyIHsKICAgIHBhZGRpbmc6IDA7Cn0KI3ByaW50LXNlbGVjdG9yIHsKICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7Cn0KLnRhYmxlc29ydGVyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwogICAgYmFja2dyb3VuZDogI2RkZCAhaW1wb3J0YW50Owp9Cjwvc3R5bGU+CjxzdHlsZSBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyI+CiNqYXZhc2NyaXB0LWRpc2FibGVkIHsKICAgIHdpZHRoOiA2MDBweDsKICAgIG1hcmdpbjogMTAwcHggYXV0byAwIGF1dG87CiAgICBwYWRkaW5nOiAyMHB4OwogICAgY29sb3I6IGJsYWNrOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJhY2tncm91bmQ6ICNlZWU7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgaDEgewogICAgd2lkdGg6IDEwMCU7CiAgICBmbG9hdDogbm9uZTsKfQojamF2YXNjcmlwdC1kaXNhYmxlZCB1bCB7CiAgICBmb250LXNpemU6IDEuMmVtOwp9CiNqYXZhc2NyaXB0LWRpc2FibGVkIGxpIHsKICAgIG1hcmdpbjogMC41ZW0gMDsKfQojamF2YXNjcmlwdC1kaXNhYmxlZCBiIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgouZG9jID4gKiB7CiAgICBtYXJnaW46IDAuN2VtIDFlbSAwLjFlbSAxZW07CiAgICBwYWRkaW5nOiAwOwp9Ci5kb2MgPiBwLCAuZG9jID4gaDEsIC5kb2MgPiBoMiwgLmRvYyA+IGgzLCAuZG9jID4gaDQgewogICAgbWFyZ2luOiAwLjdlbSAwIDAuMWVtIDA7Cn0KLmRvYyA+ICo6Zmlyc3QtY2hpbGQgewogICAgbWFyZ2luLXRvcDogMC4xZW07Cn0KLmRvYyB0YWJsZSB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBmb250LXNpemU6IDAuOWVtOwp9Ci5kb2MgdGFibGUgdGgsIC5kb2MgdGFibGUgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgcGFkZGluZzogMC4xZW0gMC4zZW07CiAgICBoZWlnaHQ6IDEuMmVtOwp9Ci5kb2MgdGFibGUgdGggewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMWVtOwp9Ci5kb2MgcHJlIHsKICAgIGZvbnQtc2l6ZTogMS4xZW07CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogICAgYmFja2dyb3VuZDogI2Y0ZjRmNDsKfQouZG9jIGNvZGUgewogICAgcGFkZGluZzogMCAwLjJlbTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9Ci5kb2MgbGkgewogICAgbGlzdC1zdHlsZS1wb3NpdGlvbjogaW5zaWRlOwogICAgbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Cn0KLmRvYyBpbWcgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQouZG9jIGhyIHsKICAgIGJhY2tncm91bmQ6ICNjY2M7CiAgICBoZWlnaHQ6IDFweDsKICAgIGJvcmRlcjogMDsKfQo8L3N0eWxlPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qISBqUXVlcnkgdjMuNS4xIHwgKGMpIEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwohZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9ZS5kb2N1bWVudD90KGUsITApOmZ1bmN0aW9uKGUpe2lmKCFlLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiB0KGUpfTp0KGUpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihDLGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1bXSxyPU9iamVjdC5nZXRQcm90b3R5cGVPZixzPXQuc2xpY2UsZz10LmZsYXQ/ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZmxhdC5jYWxsKGUpfTpmdW5jdGlvbihlKXtyZXR1cm4gdC5jb25jYXQuYXBwbHkoW10sZSl9LHU9dC5wdXNoLGk9dC5pbmRleE9mLG49e30sbz1uLnRvU3RyaW5nLHY9bi5oYXNPd25Qcm9wZXJ0eSxhPXYudG9TdHJpbmcsbD1hLmNhbGwoT2JqZWN0KSx5PXt9LG09ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJiJudW1iZXIiIT10eXBlb2YgZS5ub2RlVHlwZX0seD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmZT09PWUud2luZG93fSxFPUMuZG9jdW1lbnQsYz17dHlwZTohMCxzcmM6ITAsbm9uY2U6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIGIoZSx0LG4pe3ZhciByLGksbz0obj1ufHxFKS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtpZihvLnRleHQ9ZSx0KWZvcihyIGluIGMpKGk9dFtyXXx8dC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKHIpKSYmby5zZXRBdHRyaWJ1dGUocixpKTtuLmhlYWQuYXBwZW5kQ2hpbGQobykucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKX1mdW5jdGlvbiB3KGUpe3JldHVybiBudWxsPT1lP2UrIiI6Im9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9uW28uY2FsbChlKV18fCJvYmplY3QiOnR5cGVvZiBlfXZhciBmPSIzLjUuMSIsUz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgUy5mbi5pbml0KGUsdCl9O2Z1bmN0aW9uIHAoZSl7dmFyIHQ9ISFlJiYibGVuZ3RoImluIGUmJmUubGVuZ3RoLG49dyhlKTtyZXR1cm4hbShlKSYmIXgoZSkmJigiYXJyYXkiPT09bnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmMDx0JiZ0LTEgaW4gZSl9Uy5mbj1TLnByb3RvdHlwZT17anF1ZXJ5OmYsY29uc3RydWN0b3I6UyxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHMuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3MuY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9Uy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHR9LGVhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIFMuZWFjaCh0aGlzLGUpfSxtYXA6ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMubWFwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4gbi5jYWxsKGUsdCxlKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2socy5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxldmVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMuZ3JlcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQrMSklMn0pKX0sb2RkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMuZ3JlcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQlMn0pKX0sZXE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZW5ndGgsbj0rZSsoZTwwP3Q6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKDA8PW4mJm48dD9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6dSxzb3J0OnQuc29ydCxzcGxpY2U6dC5zcGxpY2V9LFMuZXh0ZW5kPVMuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvLGE9YXJndW1lbnRzWzBdfHx7fSxzPTEsdT1hcmd1bWVudHMubGVuZ3RoLGw9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGEmJihsPWEsYT1hcmd1bWVudHNbc118fHt9LHMrKyksIm9iamVjdCI9PXR5cGVvZiBhfHxtKGEpfHwoYT17fSkscz09PXUmJihhPXRoaXMscy0tKTtzPHU7cysrKWlmKG51bGwhPShlPWFyZ3VtZW50c1tzXSkpZm9yKHQgaW4gZSlyPWVbdF0sIl9fcHJvdG9fXyIhPT10JiZhIT09ciYmKGwmJnImJihTLmlzUGxhaW5PYmplY3Qocil8fChpPUFycmF5LmlzQXJyYXkocikpKT8obj1hW3RdLG89aSYmIUFycmF5LmlzQXJyYXkobik/W106aXx8Uy5pc1BsYWluT2JqZWN0KG4pP246e30saT0hMSxhW3RdPVMuZXh0ZW5kKGwsbyxyKSk6dm9pZCAwIT09ciYmKGFbdF09cikpO3JldHVybiBhfSxTLmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisoZitNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcihlKX0sbm9vcDpmdW5jdGlvbigpe30saXNQbGFpbk9iamVjdDpmdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiEoIWV8fCJbb2JqZWN0IE9iamVjdF0iIT09by5jYWxsKGUpKSYmKCEodD1yKGUpKXx8ImZ1bmN0aW9uIj09dHlwZW9mKG49di5jYWxsKHQsImNvbnN0cnVjdG9yIikmJnQuY29uc3RydWN0b3IpJiZhLmNhbGwobik9PT1sKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBlKXJldHVybiExO3JldHVybiEwfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGUsdCxuKXtiKGUse25vbmNlOnQmJnQubm9uY2V9LG4pfSxlYWNoOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2lmKHAoZSkpe2ZvcihuPWUubGVuZ3RoO3I8bjtyKyspaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrfWVsc2UgZm9yKHIgaW4gZSlpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWs7cmV0dXJuIGV9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYocChPYmplY3QoZSkpP1MubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOnUuY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09dD8tMTppLmNhbGwodCxlLG4pfSxtZXJnZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0rdC5sZW5ndGgscj0wLGk9ZS5sZW5ndGg7cjxuO3IrKyllW2krK109dFtyXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9W10saT0wLG89ZS5sZW5ndGgsYT0hbjtpPG87aSsrKSF0KGVbaV0saSkhPT1hJiZyLnB1c2goZVtpXSk7cmV0dXJuIHJ9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPTAsYT1bXTtpZihwKGUpKWZvcihyPWUubGVuZ3RoO288cjtvKyspbnVsbCE9KGk9dChlW29dLG8sbikpJiZhLnB1c2goaSk7ZWxzZSBmb3IobyBpbiBlKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmYS5wdXNoKGkpO3JldHVybiBnKGEpfSxndWlkOjEsc3VwcG9ydDp5fSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKFMuZm5bU3ltYm9sLml0ZXJhdG9yXT10W1N5bWJvbC5pdGVyYXRvcl0pLFMuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtuWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pO3ZhciBkPWZ1bmN0aW9uKG4pe3ZhciBlLGQsYixvLGksaCxmLGcsdyx1LGwsVCxDLGEsRSx2LHMsYyx5LFM9InNpenpsZSIrMSpuZXcgRGF0ZSxwPW4uZG9jdW1lbnQsaz0wLHI9MCxtPXVlKCkseD11ZSgpLEE9dWUoKSxOPXVlKCksRD1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dCYmKGw9ITApLDB9LGo9e30uaGFzT3duUHJvcGVydHksdD1bXSxxPXQucG9wLEw9dC5wdXNoLEg9dC5wdXNoLE89dC5zbGljZSxQPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKWlmKGVbbl09PT10KXJldHVybiBuO3JldHVybi0xfSxSPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTT0iW1xceDIwXFx0XFxyXFxuXFxmXSIsST0iKD86XFxcXFtcXGRhLWZBLUZdezEsNn0iK00rIj98XFxcXFteXFxyXFxuXFxmXXxbXFx3LV18W15cMC1cXHg3Zl0pKyIsVz0iXFxbIitNKyIqKCIrSSsiKSg/OiIrTSsiKihbKl4kfCF+XT89KSIrTSsiKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwifCgiK0krIikpfCkiK00rIipcXF0iLEY9IjooIitJKyIpKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IitXKyIpKil8LiopXFwpfCkiLEI9bmV3IFJlZ0V4cChNKyIrIiwiZyIpLCQ9bmV3IFJlZ0V4cCgiXiIrTSsiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitNKyIrJCIsImciKSxfPW5ldyBSZWdFeHAoIl4iK00rIiosIitNKyIqIiksej1uZXcgUmVnRXhwKCJeIitNKyIqKFs+K35dfCIrTSsiKSIrTSsiKiIpLFU9bmV3IFJlZ0V4cChNKyJ8PiIpLFg9bmV3IFJlZ0V4cChGKSxWPW5ldyBSZWdFeHAoIl4iK0krIiQiKSxHPXtJRDpuZXcgUmVnRXhwKCJeIygiK0krIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrSSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrSSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK1cpLFBTRVVETzpuZXcgUmVnRXhwKCJeIitGKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK00rIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK00rIiooPzooWystXXwpIitNKyIqKFxcZCspfCkpIitNKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitSKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTSsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitNKyIqKCg/Oi1cXGQpP1xcZCopIitNKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxZPS9IVE1MJC9pLFE9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxKPS9eaFxkJC9pLEs9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLFo9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxlZT0vWyt+XS8sdGU9bmV3IFJlZ0V4cCgiXFxcXFtcXGRhLWZBLUZdezEsNn0iK00rIj98XFxcXChbXlxcclxcblxcZl0pIiwiZyIpLG5lPWZ1bmN0aW9uKGUsdCl7dmFyIG49IjB4IitlLnNsaWNlKDEpLTY1NTM2O3JldHVybiB0fHwobjwwP1N0cmluZy5mcm9tQ2hhckNvZGUobis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShuPj4xMHw1NTI5NiwxMDIzJm58NTYzMjApKX0scmU9LyhbXDAtXHgxZlx4N2ZdfF4tP1xkKXxeLSR8W15cMC1ceDFmXHg3Zi1cdUZGRkZcdy1dL2csaWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8iXDAiPT09ZT8iXHVmZmZkIjplLnNsaWNlKDAsLTEpKyJcXCIrZS5jaGFyQ29kZUF0KGUubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KSsiICI6IlxcIitlfSxvZT1mdW5jdGlvbigpe1QoKX0sYWU9YmUoZnVuY3Rpb24oZSl7cmV0dXJuITA9PT1lLmRpc2FibGVkJiYiZmllbGRzZXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e0guYXBwbHkodD1PLmNhbGwocC5jaGlsZE5vZGVzKSxwLmNoaWxkTm9kZXMpLHRbcC5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZSl7SD17YXBwbHk6dC5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtMLmFwcGx5KGUsTy5jYWxsKHQpKX06ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmxlbmd0aCxyPTA7d2hpbGUoZVtuKytdPXRbcisrXSk7ZS5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gc2UodCxlLG4scil7dmFyIGksbyxhLHMsdSxsLGMsZj1lJiZlLm93bmVyRG9jdW1lbnQscD1lP2Uubm9kZVR5cGU6OTtpZihuPW58fFtdLCJzdHJpbmciIT10eXBlb2YgdHx8IXR8fDEhPT1wJiY5IT09cCYmMTEhPT1wKXJldHVybiBuO2lmKCFyJiYoVChlKSxlPWV8fEMsRSkpe2lmKDExIT09cCYmKHU9Wi5leGVjKHQpKSlpZihpPXVbMV0pe2lmKDk9PT1wKXtpZighKGE9ZS5nZXRFbGVtZW50QnlJZChpKSkpcmV0dXJuIG47aWYoYS5pZD09PWkpcmV0dXJuIG4ucHVzaChhKSxufWVsc2UgaWYoZiYmKGE9Zi5nZXRFbGVtZW50QnlJZChpKSkmJnkoZSxhKSYmYS5pZD09PWkpcmV0dXJuIG4ucHVzaChhKSxufWVsc2V7aWYodVsyXSlyZXR1cm4gSC5hcHBseShuLGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCkpLG47aWYoKGk9dVszXSkmJmQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBILmFwcGx5KG4sZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGkpKSxufWlmKGQucXNhJiYhTlt0KyIgIl0mJighdnx8IXYudGVzdCh0KSkmJigxIT09cHx8Im9iamVjdCIhPT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKXtpZihjPXQsZj1lLDE9PT1wJiYoVS50ZXN0KHQpfHx6LnRlc3QodCkpKXsoZj1lZS50ZXN0KHQpJiZ5ZShlLnBhcmVudE5vZGUpfHxlKT09PWUmJmQuc2NvcGV8fCgocz1lLmdldEF0dHJpYnV0ZSgiaWQiKSk/cz1zLnJlcGxhY2UocmUsaWUpOmUuc2V0QXR0cmlidXRlKCJpZCIscz1TKSksbz0obD1oKHQpKS5sZW5ndGg7d2hpbGUoby0tKWxbb109KHM/IiMiK3M6IjpzY29wZSIpKyIgIit4ZShsW29dKTtjPWwuam9pbigiLCIpfXRyeXtyZXR1cm4gSC5hcHBseShuLGYucXVlcnlTZWxlY3RvckFsbChjKSksbn1jYXRjaChlKXtOKHQsITApfWZpbmFsbHl7cz09PVMmJmUucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGcodC5yZXBsYWNlKCQsIiQxIiksZSxuLHIpfWZ1bmN0aW9uIHVlKCl7dmFyIHI9W107cmV0dXJuIGZ1bmN0aW9uIGUodCxuKXtyZXR1cm4gci5wdXNoKHQrIiAiKT5iLmNhY2hlTGVuZ3RoJiZkZWxldGUgZVtyLnNoaWZ0KCldLGVbdCsiICJdPW59fWZ1bmN0aW9uIGxlKGUpe3JldHVybiBlW1NdPSEwLGV9ZnVuY3Rpb24gY2UoZSl7dmFyIHQ9Qy5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2goZSl7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGZlKGUsdCl7dmFyIG49ZS5zcGxpdCgifCIpLHI9bi5sZW5ndGg7d2hpbGUoci0tKWIuYXR0ckhhbmRsZVtuW3JdXT10fWZ1bmN0aW9uIHBlKGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBkZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmZS50eXBlPT09dH19ZnVuY3Rpb24gaGUobil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PXR8fCJidXR0b24iPT09dCkmJmUudHlwZT09PW59fWZ1bmN0aW9uIGdlKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iZm9ybSJpbiBlP2UucGFyZW50Tm9kZSYmITE9PT1lLmRpc2FibGVkPyJsYWJlbCJpbiBlPyJsYWJlbCJpbiBlLnBhcmVudE5vZGU/ZS5wYXJlbnROb2RlLmRpc2FibGVkPT09dDplLmRpc2FibGVkPT09dDplLmlzRGlzYWJsZWQ9PT10fHxlLmlzRGlzYWJsZWQhPT0hdCYmYWUoZSk9PT10OmUuZGlzYWJsZWQ9PT10OiJsYWJlbCJpbiBlJiZlLmRpc2FibGVkPT09dH19ZnVuY3Rpb24gdmUoYSl7cmV0dXJuIGxlKGZ1bmN0aW9uKG8pe3JldHVybiBvPStvLGxlKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1hKFtdLGUubGVuZ3RoLG8pLGk9ci5sZW5ndGg7d2hpbGUoaS0tKWVbbj1yW2ldXSYmKGVbbl09ISh0W25dPWVbbl0pKX0pfSl9ZnVuY3Rpb24geWUoZSl7cmV0dXJuIGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmZX1mb3IoZSBpbiBkPXNlLnN1cHBvcnQ9e30saT1zZS5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lLm5hbWVzcGFjZVVSSSxuPShlLm93bmVyRG9jdW1lbnR8fGUpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4hWS50ZXN0KHR8fG4mJm4ubm9kZU5hbWV8fCJIVE1MIil9LFQ9c2Uuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbixyPWU/ZS5vd25lckRvY3VtZW50fHxlOnA7cmV0dXJuIHIhPUMmJjk9PT1yLm5vZGVUeXBlJiZyLmRvY3VtZW50RWxlbWVudCYmKGE9KEM9cikuZG9jdW1lbnRFbGVtZW50LEU9IWkoQykscCE9QyYmKG49Qy5kZWZhdWx0VmlldykmJm4udG9wIT09biYmKG4uYWRkRXZlbnRMaXN0ZW5lcj9uLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsb2UsITEpOm4uYXR0YWNoRXZlbnQmJm4uYXR0YWNoRXZlbnQoIm9udW5sb2FkIixvZSkpLGQuc2NvcGU9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQoQy5jcmVhdGVFbGVtZW50KCJkaXYiKSksInVuZGVmaW5lZCIhPXR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGwmJiFlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpzY29wZSBmaWVsZHNldCBkaXYiKS5sZW5ndGh9KSxkLmF0dHJpYnV0ZXM9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xhc3NOYW1lPSJpIiwhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksZC5nZXRFbGVtZW50c0J5VGFnTmFtZT1jZShmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZChDLmNyZWF0ZUNvbW1lbnQoIiIpKSwhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1LLnRlc3QoQy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxkLmdldEJ5SWQ9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZSkuaWQ9UywhQy5nZXRFbGVtZW50c0J5TmFtZXx8IUMuZ2V0RWxlbWVudHNCeU5hbWUoUykubGVuZ3RofSksZC5nZXRCeUlkPyhiLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UodGUsbmUpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10fX0sYi5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZFKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuP1tuXTpbXX19KTooYi5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIG49ZS5yZXBsYWNlKHRlLG5lKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUmJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gdCYmdC52YWx1ZT09PW59fSxiLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJkUpe3ZhciBuLHIsaSxvPXQuZ2V0RWxlbWVudEJ5SWQoZSk7aWYobyl7aWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dO2k9dC5nZXRFbGVtZW50c0J5TmFtZShlKSxyPTA7d2hpbGUobz1pW3IrK10paWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dfXJldHVybltdfX0pLGIuZmluZC5UQUc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihlLHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50c0J5VGFnTmFtZT90LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpOmQucXNhP3QucXVlcnlTZWxlY3RvckFsbChlKTp2b2lkIDB9OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPTAsbz10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpO2lmKCIqIj09PWUpe3doaWxlKG49b1tpKytdKTE9PT1uLm5vZGVUeXBlJiZyLnB1c2gobik7cmV0dXJuIHJ9cmV0dXJuIG99LGIuZmluZC5DTEFTUz1kLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJkUpcmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKX0scz1bXSx2PVtdLChkLnFzYT1LLnRlc3QoQy5xdWVyeVNlbGVjdG9yQWxsKSkmJihjZShmdW5jdGlvbihlKXt2YXIgdDthLmFwcGVuZENoaWxkKGUpLmlubmVySFRNTD0iPGEgaWQ9JyIrUysiJz48L2E+PHNlbGVjdCBpZD0nIitTKyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGUucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnYucHVzaCgiWypeJF09IitNKyIqKD86Jyd8XCJcIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHYucHVzaCgiXFxbIitNKyIqKD86dmFsdWV8IitSKyIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrUysiLV0iKS5sZW5ndGh8fHYucHVzaCgifj0iKSwodD1DLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnNldEF0dHJpYnV0ZSgibmFtZSIsIiIpLGUuYXBwZW5kQ2hpbGQodCksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT0nJ10iKS5sZW5ndGh8fHYucHVzaCgiXFxbIitNKyIqbmFtZSIrTSsiKj0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHYucHVzaCgiOmNoZWNrZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIitTKyIrKiIpLmxlbmd0aHx8di5wdXNoKCIuIy4rWyt+XSIpLGUucXVlcnlTZWxlY3RvckFsbCgiXFxcZiIpLHYucHVzaCgiW1xcclxcblxcZl0iKX0pLGNlKGZ1bmN0aW9uKGUpe2UuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciB0PUMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGUuYXBwZW5kQ2hpbGQodCkuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGUucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnYucHVzaCgibmFtZSIrTSsiKlsqXiR8IX5dPz0iKSwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmdi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGEuYXBwZW5kQ2hpbGQoZSkuZGlzYWJsZWQ9ITAsMiE9PWUucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksZS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4Iiksdi5wdXNoKCIsLio6Iil9KSksKGQubWF0Y2hlc1NlbGVjdG9yPUsudGVzdChjPWEubWF0Y2hlc3x8YS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLm9NYXRjaGVzU2VsZWN0b3J8fGEubXNNYXRjaGVzU2VsZWN0b3IpKSYmY2UoZnVuY3Rpb24oZSl7ZC5kaXNjb25uZWN0ZWRNYXRjaD1jLmNhbGwoZSwiKiIpLGMuY2FsbChlLCJbcyE9JyddOngiKSxzLnB1c2goIiE9IixGKX0pLHY9di5sZW5ndGgmJm5ldyBSZWdFeHAodi5qb2luKCJ8IikpLHM9cy5sZW5ndGgmJm5ldyBSZWdFeHAocy5qb2luKCJ8IikpLHQ9Sy50ZXN0KGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHk9dHx8Sy50ZXN0KGEuY29udGFpbnMpP2Z1bmN0aW9uKGUsdCl7dmFyIG49OT09PWUubm9kZVR5cGU/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKGUsdCl7aWYodCl3aGlsZSh0PXQucGFyZW50Tm9kZSlpZih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sRD10P2Z1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIGw9ITAsMDt2YXIgbj0hZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gbnx8KDEmKG49KGUub3duZXJEb2N1bWVudHx8ZSk9PSh0Lm93bmVyRG9jdW1lbnR8fHQpP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk6MSl8fCFkLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PW4/ZT09Q3x8ZS5vd25lckRvY3VtZW50PT1wJiZ5KHAsZSk/LTE6dD09Q3x8dC5vd25lckRvY3VtZW50PT1wJiZ5KHAsdCk/MTp1P1AodSxlKS1QKHUsdCk6MDo0Jm4/LTE6MSl9OmZ1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIGw9ITAsMDt2YXIgbixyPTAsaT1lLnBhcmVudE5vZGUsbz10LnBhcmVudE5vZGUsYT1bZV0scz1bdF07aWYoIWl8fCFvKXJldHVybiBlPT1DPy0xOnQ9PUM/MTppPy0xOm8/MTp1P1AodSxlKS1QKHUsdCk6MDtpZihpPT09bylyZXR1cm4gcGUoZSx0KTtuPWU7d2hpbGUobj1uLnBhcmVudE5vZGUpYS51bnNoaWZ0KG4pO249dDt3aGlsZShuPW4ucGFyZW50Tm9kZSlzLnVuc2hpZnQobik7d2hpbGUoYVtyXT09PXNbcl0pcisrO3JldHVybiByP3BlKGFbcl0sc1tyXSk6YVtyXT09cD8tMTpzW3JdPT1wPzE6MH0pLEN9LHNlLm1hdGNoZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gc2UoZSxudWxsLG51bGwsdCl9LHNlLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihlLHQpe2lmKFQoZSksZC5tYXRjaGVzU2VsZWN0b3ImJkUmJiFOW3QrIiAiXSYmKCFzfHwhcy50ZXN0KHQpKSYmKCF2fHwhdi50ZXN0KHQpKSl0cnl7dmFyIG49Yy5jYWxsKGUsdCk7aWYobnx8ZC5kaXNjb25uZWN0ZWRNYXRjaHx8ZS5kb2N1bWVudCYmMTEhPT1lLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiBufWNhdGNoKGUpe04odCwhMCl9cmV0dXJuIDA8c2UodCxDLG51bGwsW2VdKS5sZW5ndGh9LHNlLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUub3duZXJEb2N1bWVudHx8ZSkhPUMmJlQoZSkseShlLHQpfSxzZS5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPUMmJlQoZSk7dmFyIG49Yi5hdHRySGFuZGxlW3QudG9Mb3dlckNhc2UoKV0scj1uJiZqLmNhbGwoYi5hdHRySGFuZGxlLHQudG9Mb3dlckNhc2UoKSk/bihlLHQsIUUpOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09cj9yOmQuYXR0cmlidXRlc3x8IUU/ZS5nZXRBdHRyaWJ1dGUodCk6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSxzZS5lc2NhcGU9ZnVuY3Rpb24oZSl7cmV0dXJuKGUrIiIpLnJlcGxhY2UocmUsaWUpfSxzZS5lcnJvcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LHNlLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXSxyPTAsaT0wO2lmKGw9IWQuZGV0ZWN0RHVwbGljYXRlcyx1PSFkLnNvcnRTdGFibGUmJmUuc2xpY2UoMCksZS5zb3J0KEQpLGwpe3doaWxlKHQ9ZVtpKytdKXQ9PT1lW2ldJiYocj1uLnB1c2goaSkpO3doaWxlKHItLSllLnNwbGljZShuW3JdLDEpfXJldHVybiB1PW51bGwsZX0sbz1zZS5nZXRUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0LG49IiIscj0wLGk9ZS5ub2RlVHlwZTtpZihpKXtpZigxPT09aXx8OT09PWl8fDExPT09aSl7aWYoInN0cmluZyI9PXR5cGVvZiBlLnRleHRDb250ZW50KXJldHVybiBlLnRleHRDb250ZW50O2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyluKz1vKGUpfWVsc2UgaWYoMz09PWl8fDQ9PT1pKXJldHVybiBlLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKHQ9ZVtyKytdKW4rPW8odCk7cmV0dXJuIG59LChiPXNlLnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmxlLG1hdGNoOkcsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZSh0ZSxuZSksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UodGUsbmUpLCJ+PSI9PT1lWzJdJiYoZVszXT0iICIrZVszXSsiICIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09ZVsxXS5zbGljZSgwLDMpPyhlWzNdfHxzZS5lcnJvcihlWzBdKSxlWzRdPSsoZVs0XT9lWzVdKyhlWzZdfHwxKToyKigiZXZlbiI9PT1lWzNdfHwib2RkIj09PWVbM10pKSxlWzVdPSsoZVs3XStlWzhdfHwib2RkIj09PWVbM10pKTplWzNdJiZzZS5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIHQsbj0hZVs2XSYmZVsyXTtyZXR1cm4gRy5DSElMRC50ZXN0KGVbMF0pP251bGw6KGVbM10/ZVsyXT1lWzRdfHxlWzVdfHwiIjpuJiZYLnRlc3QobikmJih0PWgobiwhMCkpJiYodD1uLmluZGV4T2YoIikiLG4ubGVuZ3RoLXQpLW4ubGVuZ3RoKSYmKGVbMF09ZVswXS5zbGljZSgwLHQpLGVbMl09bi5zbGljZSgwLHQpKSxlLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHRlLG5lKS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PWU/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXR9fSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgdD1tW2UrIiAiXTtyZXR1cm4gdHx8KHQ9bmV3IFJlZ0V4cCgiKF58IitNKyIpIitlKyIoIitNKyJ8JCkiKSkmJm0oZSxmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KCJzdHJpbmciPT10eXBlb2YgZS5jbGFzc05hbWUmJmUuY2xhc3NOYW1lfHwidW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24obixyLGkpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1zZS5hdHRyKGUsbik7cmV0dXJuIG51bGw9PXQ/IiE9Ij09PXI6IXJ8fCh0Kz0iIiwiPSI9PT1yP3Q9PT1pOiIhPSI9PT1yP3QhPT1pOiJePSI9PT1yP2kmJjA9PT10LmluZGV4T2YoaSk6Iio9Ij09PXI/aSYmLTE8dC5pbmRleE9mKGkpOiIkPSI9PT1yP2kmJnQuc2xpY2UoLWkubGVuZ3RoKT09PWk6In49Ij09PXI/LTE8KCIgIit0LnJlcGxhY2UoQiwiICIpKyIgIikuaW5kZXhPZihpKToifD0iPT09ciYmKHQ9PT1pfHx0LnNsaWNlKDAsaS5sZW5ndGgrMSk9PT1pKyItIikpfX0sQ0hJTEQ6ZnVuY3Rpb24oaCxlLHQsZyx2KXt2YXIgeT0ibnRoIiE9PWguc2xpY2UoMCwzKSxtPSJsYXN0IiE9PWguc2xpY2UoLTQpLHg9Im9mLXR5cGUiPT09ZTtyZXR1cm4gMT09PWcmJjA9PT12P2Z1bmN0aW9uKGUpe3JldHVybiEhZS5wYXJlbnROb2RlfTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGw9eSE9PW0/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixjPWUucGFyZW50Tm9kZSxmPXgmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxwPSFuJiYheCxkPSExO2lmKGMpe2lmKHkpe3doaWxlKGwpe2E9ZTt3aGlsZShhPWFbbF0paWYoeD9hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1mOjE9PT1hLm5vZGVUeXBlKXJldHVybiExO3U9bD0ib25seSI9PT1oJiYhdSYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZih1PVttP2MuZmlyc3RDaGlsZDpjLmxhc3RDaGlsZF0sbSYmcCl7ZD0ocz0ocj0oaT0obz0oYT1jKVtTXXx8KGFbU109e30pKVthLnVuaXF1ZUlEXXx8KG9bYS51bmlxdWVJRF09e30pKVtoXXx8W10pWzBdPT09ayYmclsxXSkmJnJbMl0sYT1zJiZjLmNoaWxkTm9kZXNbc107d2hpbGUoYT0rK3MmJmEmJmFbbF18fChkPXM9MCl8fHUucG9wKCkpaWYoMT09PWEubm9kZVR5cGUmJisrZCYmYT09PWUpe2lbaF09W2sscyxkXTticmVha319ZWxzZSBpZihwJiYoZD1zPShyPShpPShvPShhPWUpW1NdfHwoYVtTXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdfHxbXSlbMF09PT1rJiZyWzFdKSwhMT09PWQpd2hpbGUoYT0rK3MmJmEmJmFbbF18fChkPXM9MCl8fHUucG9wKCkpaWYoKHg/YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZjoxPT09YS5ub2RlVHlwZSkmJisrZCYmKHAmJigoaT0obz1hW1NdfHwoYVtTXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdPVtrLGRdKSxhPT09ZSkpYnJlYWs7cmV0dXJuKGQtPXYpPT09Z3x8ZCVnPT0wJiYwPD1kL2d9fX0sUFNFVURPOmZ1bmN0aW9uKGUsbyl7dmFyIHQsYT1iLnBzZXVkb3NbZV18fGIuc2V0RmlsdGVyc1tlLnRvTG93ZXJDYXNlKCldfHxzZS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2UpO3JldHVybiBhW1NdP2Eobyk6MTxhLmxlbmd0aD8odD1bZSxlLCIiLG9dLGIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP2xlKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1hKGUsbyksaT1yLmxlbmd0aDt3aGlsZShpLS0pZVtuPVAoZSxyW2ldKV09ISh0W25dPXJbaV0pfSk6ZnVuY3Rpb24oZSl7cmV0dXJuIGEoZSwwLHQpfSk6YX19LHBzZXVkb3M6e25vdDpsZShmdW5jdGlvbihlKXt2YXIgcj1bXSxpPVtdLHM9ZihlLnJlcGxhY2UoJCwiJDEiKSk7cmV0dXJuIHNbU10/bGUoZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz1zKGUsbnVsbCxyLFtdKSxhPWUubGVuZ3RoO3doaWxlKGEtLSkoaT1vW2FdKSYmKGVbYV09ISh0W2FdPWkpKX0pOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gclswXT1lLHMocixudWxsLG4saSksclswXT1udWxsLCFpLnBvcCgpfX0pLGhhczpsZShmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIDA8c2UodCxlKS5sZW5ndGh9fSksY29udGFpbnM6bGUoZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC5yZXBsYWNlKHRlLG5lKSxmdW5jdGlvbihlKXtyZXR1cm4tMTwoZS50ZXh0Q29udGVudHx8byhlKSkuaW5kZXhPZih0KX19KSxsYW5nOmxlKGZ1bmN0aW9uKG4pe3JldHVybiBWLnRlc3Qobnx8IiIpfHxzZS5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIituKSxuPW4ucmVwbGFjZSh0ZSxuZSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihlKXt2YXIgdDtkb3tpZih0PUU/ZS5sYW5nOmUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxlLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybih0PXQudG9Mb3dlckNhc2UoKSk9PT1ufHwwPT09dC5pbmRleE9mKG4rIi0iKX13aGlsZSgoZT1lLnBhcmVudE5vZGUpJiYxPT09ZS5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGUpe3ZhciB0PW4ubG9jYXRpb24mJm4ubG9jYXRpb24uaGFzaDtyZXR1cm4gdCYmdC5zbGljZSgxKT09PWUuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1hfSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PUMuYWN0aXZlRWxlbWVudCYmKCFDLmhhc0ZvY3VzfHxDLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmdlKCExKSxkaXNhYmxlZDpnZSghMCksY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIWIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBKLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBRLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiJidXR0b24iPT09ZS50eXBlfHwiYnV0dG9uIj09PXR9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PXQudG9Mb3dlckNhc2UoKSl9LGZpcnN0OnZlKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDp2ZShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6dmUoZnVuY3Rpb24oZSx0LG4pe3JldHVybltuPDA/bit0Om5dfSksZXZlbjp2ZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDp2ZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OnZlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDp0PG4/dDpuOzA8PS0tcjspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6dmUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47KytyPHQ7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0pLnBzZXVkb3MubnRoPWIucHNldWRvcy5lcSx7cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pYi5wc2V1ZG9zW2VdPWRlKGUpO2ZvcihlIGlue3N1Ym1pdDohMCxyZXNldDohMH0pYi5wc2V1ZG9zW2VdPWhlKGUpO2Z1bmN0aW9uIG1lKCl7fWZ1bmN0aW9uIHhlKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgscj0iIjt0PG47dCsrKXIrPWVbdF0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24gYmUocyxlLHQpe3ZhciB1PWUuZGlyLGw9ZS5uZXh0LGM9bHx8dSxmPXQmJiJwYXJlbnROb2RlIj09PWMscD1yKys7cmV0dXJuIGUuZmlyc3Q/ZnVuY3Rpb24oZSx0LG4pe3doaWxlKGU9ZVt1XSlpZigxPT09ZS5ub2RlVHlwZXx8ZilyZXR1cm4gcyhlLHQsbik7cmV0dXJuITF9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYT1bayxwXTtpZihuKXt3aGlsZShlPWVbdV0paWYoKDE9PT1lLm5vZGVUeXBlfHxmKSYmcyhlLHQsbikpcmV0dXJuITB9ZWxzZSB3aGlsZShlPWVbdV0paWYoMT09PWUubm9kZVR5cGV8fGYpaWYoaT0obz1lW1NdfHwoZVtTXT17fSkpW2UudW5pcXVlSURdfHwob1tlLnVuaXF1ZUlEXT17fSksbCYmbD09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSllPWVbdV18fGU7ZWxzZXtpZigocj1pW2NdKSYmclswXT09PWsmJnJbMV09PT1wKXJldHVybiBhWzJdPXJbMl07aWYoKGlbY109YSlbMl09cyhlLHQsbikpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHdlKGkpe3JldHVybiAxPGkubGVuZ3RoP2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1pLmxlbmd0aDt3aGlsZShyLS0paWYoIWlbcl0oZSx0LG4pKXJldHVybiExO3JldHVybiEwfTppWzBdfWZ1bmN0aW9uIFRlKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGE9W10scz0wLHU9ZS5sZW5ndGgsbD1udWxsIT10O3M8dTtzKyspKG89ZVtzXSkmJihuJiYhbihvLHIsaSl8fChhLnB1c2gobyksbCYmdC5wdXNoKHMpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gQ2UoZCxoLGcsdix5LGUpe3JldHVybiB2JiYhdltTXSYmKHY9Q2UodikpLHkmJiF5W1NdJiYoeT1DZSh5LGUpKSxsZShmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1bXSx1PVtdLGw9dC5sZW5ndGgsYz1lfHxmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKXNlKGUsdFtyXSxuKTtyZXR1cm4gbn0oaHx8IioiLG4ubm9kZVR5cGU/W25dOm4sW10pLGY9IWR8fCFlJiZoP2M6VGUoYyxzLGQsbixyKSxwPWc/eXx8KGU/ZDpsfHx2KT9bXTp0OmY7aWYoZyYmZyhmLHAsbixyKSx2KXtpPVRlKHAsdSksdihpLFtdLG4sciksbz1pLmxlbmd0aDt3aGlsZShvLS0pKGE9aVtvXSkmJihwW3Vbb11dPSEoZlt1W29dXT1hKSl9aWYoZSl7aWYoeXx8ZCl7aWYoeSl7aT1bXSxvPXAubGVuZ3RoO3doaWxlKG8tLSkoYT1wW29dKSYmaS5wdXNoKGZbb109YSk7eShudWxsLHA9W10saSxyKX1vPXAubGVuZ3RoO3doaWxlKG8tLSkoYT1wW29dKSYmLTE8KGk9eT9QKGUsYSk6c1tvXSkmJihlW2ldPSEodFtpXT1hKSl9fWVsc2UgcD1UZShwPT09dD9wLnNwbGljZShsLHAubGVuZ3RoKTpwKSx5P3kobnVsbCx0LHAscik6SC5hcHBseSh0LHApfSl9ZnVuY3Rpb24gRWUoZSl7Zm9yKHZhciBpLHQsbixyPWUubGVuZ3RoLG89Yi5yZWxhdGl2ZVtlWzBdLnR5cGVdLGE9b3x8Yi5yZWxhdGl2ZVsiICJdLHM9bz8xOjAsdT1iZShmdW5jdGlvbihlKXtyZXR1cm4gZT09PWl9LGEsITApLGw9YmUoZnVuY3Rpb24oZSl7cmV0dXJuLTE8UChpLGUpfSxhLCEwKSxjPVtmdW5jdGlvbihlLHQsbil7dmFyIHI9IW8mJihufHx0IT09dyl8fCgoaT10KS5ub2RlVHlwZT91KGUsdCxuKTpsKGUsdCxuKSk7cmV0dXJuIGk9bnVsbCxyfV07czxyO3MrKylpZih0PWIucmVsYXRpdmVbZVtzXS50eXBlXSljPVtiZSh3ZShjKSx0KV07ZWxzZXtpZigodD1iLmZpbHRlcltlW3NdLnR5cGVdLmFwcGx5KG51bGwsZVtzXS5tYXRjaGVzKSlbU10pe2ZvcihuPSsrcztuPHI7bisrKWlmKGIucmVsYXRpdmVbZVtuXS50eXBlXSlicmVhaztyZXR1cm4gQ2UoMTxzJiZ3ZShjKSwxPHMmJnhlKGUuc2xpY2UoMCxzLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09ZVtzLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoJCwiJDEiKSx0LHM8biYmRWUoZS5zbGljZShzLG4pKSxuPHImJkVlKGU9ZS5zbGljZShuKSksbjxyJiZ4ZShlKSl9Yy5wdXNoKHQpfXJldHVybiB3ZShjKX1yZXR1cm4gbWUucHJvdG90eXBlPWIuZmlsdGVycz1iLnBzZXVkb3MsYi5zZXRGaWx0ZXJzPW5ldyBtZSxoPXNlLnRva2VuaXplPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLHUsbD14W2UrIiAiXTtpZihsKXJldHVybiB0PzA6bC5zbGljZSgwKTthPWUscz1bXSx1PWIucHJlRmlsdGVyO3doaWxlKGEpe2ZvcihvIGluIG4mJiEocj1fLmV4ZWMoYSkpfHwociYmKGE9YS5zbGljZShyWzBdLmxlbmd0aCl8fGEpLHMucHVzaChpPVtdKSksbj0hMSwocj16LmV4ZWMoYSkpJiYobj1yLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6clswXS5yZXBsYWNlKCQsIiAiKX0pLGE9YS5zbGljZShuLmxlbmd0aCkpLGIuZmlsdGVyKSEocj1HW29dLmV4ZWMoYSkpfHx1W29dJiYhKHI9dVtvXShyKSl8fChuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpvLG1hdGNoZXM6cn0pLGE9YS5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P2EubGVuZ3RoOmE/c2UuZXJyb3IoZSk6eChlLHMpLnNsaWNlKDApfSxmPXNlLmNvbXBpbGU9ZnVuY3Rpb24oZSx0KXt2YXIgbix2LHksbSx4LHIsaT1bXSxvPVtdLGE9QVtlKyIgIl07aWYoIWEpe3R8fCh0PWgoZSkpLG49dC5sZW5ndGg7d2hpbGUobi0tKShhPUVlKHRbbl0pKVtTXT9pLnB1c2goYSk6by5wdXNoKGEpOyhhPUEoZSwodj1vLG09MDwoeT1pKS5sZW5ndGgseD0wPHYubGVuZ3RoLHI9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdT0wLGw9IjAiLGM9ZSYmW10sZj1bXSxwPXcsZD1lfHx4JiZiLmZpbmQuVEFHKCIqIixpKSxoPWsrPW51bGw9PXA/MTpNYXRoLnJhbmRvbSgpfHwuMSxnPWQubGVuZ3RoO2ZvcihpJiYodz10PT1DfHx0fHxpKTtsIT09ZyYmbnVsbCE9KG89ZFtsXSk7bCsrKXtpZih4JiZvKXthPTAsdHx8by5vd25lckRvY3VtZW50PT1DfHwoVChvKSxuPSFFKTt3aGlsZShzPXZbYSsrXSlpZihzKG8sdHx8QyxuKSl7ci5wdXNoKG8pO2JyZWFrfWkmJihrPWgpfW0mJigobz0hcyYmbykmJnUtLSxlJiZjLnB1c2gobykpfWlmKHUrPWwsbSYmbCE9PXUpe2E9MDt3aGlsZShzPXlbYSsrXSlzKGMsZix0LG4pO2lmKGUpe2lmKDA8dSl3aGlsZShsLS0pY1tsXXx8ZltsXXx8KGZbbF09cS5jYWxsKHIpKTtmPVRlKGYpfUguYXBwbHkocixmKSxpJiYhZSYmMDxmLmxlbmd0aCYmMTx1K3kubGVuZ3RoJiZzZS51bmlxdWVTb3J0KHIpfXJldHVybiBpJiYoaz1oLHc9cCksY30sbT9sZShyKTpyKSkpLnNlbGVjdG9yPWV9cmV0dXJuIGF9LGc9c2Uuc2VsZWN0PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD0iZnVuY3Rpb24iPT10eXBlb2YgZSYmZSxjPSFyJiZoKGU9bC5zZWxlY3Rvcnx8ZSk7aWYobj1ufHxbXSwxPT09Yy5sZW5ndGgpe2lmKDI8KG89Y1swXT1jWzBdLnNsaWNlKDApKS5sZW5ndGgmJiJJRCI9PT0oYT1vWzBdKS50eXBlJiY5PT09dC5ub2RlVHlwZSYmRSYmYi5yZWxhdGl2ZVtvWzFdLnR5cGVdKXtpZighKHQ9KGIuZmluZC5JRChhLm1hdGNoZXNbMF0ucmVwbGFjZSh0ZSxuZSksdCl8fFtdKVswXSkpcmV0dXJuIG47bCYmKHQ9dC5wYXJlbnROb2RlKSxlPWUuc2xpY2Uoby5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9aT1HLm5lZWRzQ29udGV4dC50ZXN0KGUpPzA6by5sZW5ndGg7d2hpbGUoaS0tKXtpZihhPW9baV0sYi5yZWxhdGl2ZVtzPWEudHlwZV0pYnJlYWs7aWYoKHU9Yi5maW5kW3NdKSYmKHI9dShhLm1hdGNoZXNbMF0ucmVwbGFjZSh0ZSxuZSksZWUudGVzdChvWzBdLnR5cGUpJiZ5ZSh0LnBhcmVudE5vZGUpfHx0KSkpe2lmKG8uc3BsaWNlKGksMSksIShlPXIubGVuZ3RoJiZ4ZShvKSkpcmV0dXJuIEguYXBwbHkobixyKSxuO2JyZWFrfX19cmV0dXJuKGx8fGYoZSxjKSkocix0LCFFLG4sIXR8fGVlLnRlc3QoZSkmJnllKHQucGFyZW50Tm9kZSl8fHQpLG59LGQuc29ydFN0YWJsZT1TLnNwbGl0KCIiKS5zb3J0KEQpLmpvaW4oIiIpPT09UyxkLmRldGVjdER1cGxpY2F0ZXM9ISFsLFQoKSxkLnNvcnREZXRhY2hlZD1jZShmdW5jdGlvbihlKXtyZXR1cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKEMuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSl9KSxjZShmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxmZSgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsZnVuY3Rpb24oZSx0LG4pe2lmKCFuKXJldHVybiBlLmdldEF0dHJpYnV0ZSh0LCJ0eXBlIj09PXQudG9Mb3dlckNhc2UoKT8xOjIpfSksZC5hdHRyaWJ1dGVzJiZjZShmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxpbnB1dC8+IixlLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLCIiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgidmFsdWUiKX0pfHxmZSgidmFsdWUiLGZ1bmN0aW9uKGUsdCxuKXtpZighbiYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4gZS5kZWZhdWx0VmFsdWV9KSxjZShmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KXx8ZmUoUixmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoIW4pcmV0dXJuITA9PT1lW3RdP3QudG9Mb3dlckNhc2UoKToocj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9KSxzZX0oQyk7Uy5maW5kPWQsUy5leHByPWQuc2VsZWN0b3JzLFMuZXhwclsiOiJdPVMuZXhwci5wc2V1ZG9zLFMudW5pcXVlU29ydD1TLnVuaXF1ZT1kLnVuaXF1ZVNvcnQsUy50ZXh0PWQuZ2V0VGV4dCxTLmlzWE1MRG9jPWQuaXNYTUwsUy5jb250YWlucz1kLmNvbnRhaW5zLFMuZXNjYXBlU2VsZWN0b3I9ZC5lc2NhcGU7dmFyIGg9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdLGk9dm9pZCAwIT09bjt3aGlsZSgoZT1lW3RdKSYmOSE9PWUubm9kZVR5cGUpaWYoMT09PWUubm9kZVR5cGUpe2lmKGkmJlMoZSkuaXMobikpYnJlYWs7ci5wdXNoKGUpfXJldHVybiByfSxUPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdO2U7ZT1lLm5leHRTaWJsaW5nKTE9PT1lLm5vZGVUeXBlJiZlIT09dCYmbi5wdXNoKGUpO3JldHVybiBufSxrPVMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7ZnVuY3Rpb24gQShlLHQpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10LnRvTG93ZXJDYXNlKCl9dmFyIE49L148KFthLXpdW15cL1wwPjpceDIwXHRcclxuXGZdKilbXHgyMFx0XHJcblxmXSpcLz8+KD86PFwvXDE+fCkkL2k7ZnVuY3Rpb24gRChlLG4scil7cmV0dXJuIG0obik/Uy5ncmVwKGUsZnVuY3Rpb24oZSx0KXtyZXR1cm4hIW4uY2FsbChlLHQsZSkhPT1yfSk6bi5ub2RlVHlwZT9TLmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PW4hPT1yfSk6InN0cmluZyIhPXR5cGVvZiBuP1MuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybi0xPGkuY2FsbChuLGUpIT09cn0pOlMuZmlsdGVyKG4sZSxyKX1TLmZpbHRlcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dFswXTtyZXR1cm4gbiYmKGU9Ijpub3QoIitlKyIpIiksMT09PXQubGVuZ3RoJiYxPT09ci5ub2RlVHlwZT9TLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsZSk/W3JdOltdOlMuZmluZC5tYXRjaGVzKGUsUy5ncmVwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfSkpfSxTLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihlKXt2YXIgdCxuLHI9dGhpcy5sZW5ndGgsaT10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gdGhpcy5wdXNoU3RhY2soUyhlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO3Q8cjt0KyspaWYoUy5jb250YWlucyhpW3RdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihuPXRoaXMucHVzaFN0YWNrKFtdKSx0PTA7dDxyO3QrKylTLmZpbmQoZSxpW3RdLG4pO3JldHVybiAxPHI/Uy51bmlxdWVTb3J0KG4pOm59LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRCh0aGlzLGV8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRCh0aGlzLGV8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhRCh0aGlzLCJzdHJpbmciPT10eXBlb2YgZSYmay50ZXN0KGUpP1MoZSk6ZXx8W10sITEpLmxlbmd0aH19KTt2YXIgaixxPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC87KFMuZm4uaW5pdD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaTtpZighZSlyZXR1cm4gdGhpcztpZihuPW58fGosInN0cmluZyI9PXR5cGVvZiBlKXtpZighKHI9IjwiPT09ZVswXSYmIj4iPT09ZVtlLmxlbmd0aC0xXSYmMzw9ZS5sZW5ndGg/W251bGwsZSxudWxsXTpxLmV4ZWMoZSkpfHwhclsxXSYmdClyZXR1cm4hdHx8dC5qcXVlcnk/KHR8fG4pLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3Rvcih0KS5maW5kKGUpO2lmKHJbMV0pe2lmKHQ9dCBpbnN0YW5jZW9mIFM/dFswXTp0LFMubWVyZ2UodGhpcyxTLnBhcnNlSFRNTChyWzFdLHQmJnQubm9kZVR5cGU/dC5vd25lckRvY3VtZW50fHx0OkUsITApKSxOLnRlc3QoclsxXSkmJlMuaXNQbGFpbk9iamVjdCh0KSlmb3IociBpbiB0KW0odGhpc1tyXSk/dGhpc1tyXSh0W3JdKTp0aGlzLmF0dHIocix0W3JdKTtyZXR1cm4gdGhpc31yZXR1cm4oaT1FLmdldEVsZW1lbnRCeUlkKHJbMl0pKSYmKHRoaXNbMF09aSx0aGlzLmxlbmd0aD0xKSx0aGlzfXJldHVybiBlLm5vZGVUeXBlPyh0aGlzWzBdPWUsdGhpcy5sZW5ndGg9MSx0aGlzKTptKGUpP3ZvaWQgMCE9PW4ucmVhZHk/bi5yZWFkeShlKTplKFMpOlMubWFrZUFycmF5KGUsdGhpcyl9KS5wcm90b3R5cGU9Uy5mbixqPVMoRSk7dmFyIEw9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sSD17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmdW5jdGlvbiBPKGUsdCl7d2hpbGUoKGU9ZVt0XSkmJjEhPT1lLm5vZGVUeXBlKTtyZXR1cm4gZX1TLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGUpe3ZhciB0PVMoZSx0aGlzKSxuPXQubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bjtlKyspaWYoUy5jb250YWlucyh0aGlzLHRbZV0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10aGlzLmxlbmd0aCxvPVtdLGE9InN0cmluZyIhPXR5cGVvZiBlJiZTKGUpO2lmKCFrLnRlc3QoZSkpZm9yKDtyPGk7cisrKWZvcihuPXRoaXNbcl07biYmbiE9PXQ7bj1uLnBhcmVudE5vZGUpaWYobi5ub2RlVHlwZTwxMSYmKGE/LTE8YS5pbmRleChuKToxPT09bi5ub2RlVHlwZSYmUy5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKSl7by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjaygxPG8ubGVuZ3RoP1MudW5pcXVlU29ydChvKTpvKX0saW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP2kuY2FsbChTKGUpLHRoaXNbMF0pOmkuY2FsbCh0aGlzLGUuanF1ZXJ5P2VbMF06ZSk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy51bmlxdWVTb3J0KFMubWVyZ2UodGhpcy5nZXQoKSxTKGUsdCkpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pLFMuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmMTEhPT10Lm5vZGVUeXBlP3Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihlKXtyZXR1cm4gaChlLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGgoZSwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIE8oZSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihlKXtyZXR1cm4gTyhlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihlKXtyZXR1cm4gaChlLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBoKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBoKGUsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaChlLCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbihlKXtyZXR1cm4gVCgoZS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxlKX0sY2hpbGRyZW46ZnVuY3Rpb24oZSl7cmV0dXJuIFQoZS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUuY29udGVudERvY3VtZW50JiZyKGUuY29udGVudERvY3VtZW50KT9lLmNvbnRlbnREb2N1bWVudDooQShlLCJ0ZW1wbGF0ZSIpJiYoZT1lLmNvbnRlbnR8fGUpLFMubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbihyLGkpe1MuZm5bcl09ZnVuY3Rpb24oZSx0KXt2YXIgbj1TLm1hcCh0aGlzLGksZSk7cmV0dXJuIlVudGlsIiE9PXIuc2xpY2UoLTUpJiYodD1lKSx0JiYic3RyaW5nIj09dHlwZW9mIHQmJihuPVMuZmlsdGVyKHQsbikpLDE8dGhpcy5sZW5ndGgmJihIW3JdfHxTLnVuaXF1ZVNvcnQobiksTC50ZXN0KHIpJiZuLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2sobil9fSk7dmFyIFA9L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBSKGUpe3JldHVybiBlfWZ1bmN0aW9uIE0oZSl7dGhyb3cgZX1mdW5jdGlvbiBJKGUsdCxuLHIpe3ZhciBpO3RyeXtlJiZtKGk9ZS5wcm9taXNlKT9pLmNhbGwoZSkuZG9uZSh0KS5mYWlsKG4pOmUmJm0oaT1lLnRoZW4pP2kuY2FsbChlLHQsbik6dC5hcHBseSh2b2lkIDAsW2VdLnNsaWNlKHIpKX1jYXRjaChlKXtuLmFwcGx5KHZvaWQgMCxbZV0pfX1TLkNhbGxiYWNrcz1mdW5jdGlvbihyKXt2YXIgZSxuO3I9InN0cmluZyI9PXR5cGVvZiByPyhlPXIsbj17fSxTLmVhY2goZS5tYXRjaChQKXx8W10sZnVuY3Rpb24oZSx0KXtuW3RdPSEwfSksbik6Uy5leHRlbmQoe30scik7dmFyIGksdCxvLGEscz1bXSx1PVtdLGw9LTEsYz1mdW5jdGlvbigpe2ZvcihhPWF8fHIub25jZSxvPWk9ITA7dS5sZW5ndGg7bD0tMSl7dD11LnNoaWZ0KCk7d2hpbGUoKytsPHMubGVuZ3RoKSExPT09c1tsXS5hcHBseSh0WzBdLHRbMV0pJiZyLnN0b3BPbkZhbHNlJiYobD1zLmxlbmd0aCx0PSExKX1yLm1lbW9yeXx8KHQ9ITEpLGk9ITEsYSYmKHM9dD9bXToiIil9LGY9e2FkZDpmdW5jdGlvbigpe3JldHVybiBzJiYodCYmIWkmJihsPXMubGVuZ3RoLTEsdS5wdXNoKHQpKSxmdW5jdGlvbiBuKGUpe1MuZWFjaChlLGZ1bmN0aW9uKGUsdCl7bSh0KT9yLnVuaXF1ZSYmZi5oYXModCl8fHMucHVzaCh0KTp0JiZ0Lmxlbmd0aCYmInN0cmluZyIhPT13KHQpJiZuKHQpfSl9KGFyZ3VtZW50cyksdCYmIWkmJmMoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIFMuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2YXIgbjt3aGlsZSgtMTwobj1TLmluQXJyYXkodCxzLG4pKSlzLnNwbGljZShuLDEpLG48PWwmJmwtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gZT8tMTxTLmluQXJyYXkoZSxzKTowPHMubGVuZ3RofSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBzJiYocz1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBhPXU9W10scz10PSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIXN9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gYT11PVtdLHR8fGl8fChzPXQ9IiIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhYX0sZmlyZVdpdGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXx8KHQ9W2UsKHQ9dHx8W10pLnNsaWNlP3Quc2xpY2UoKTp0XSx1LnB1c2godCksaXx8YygpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFvfX07cmV0dXJuIGZ9LFMuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihlKXt2YXIgbz1bWyJub3RpZnkiLCJwcm9ncmVzcyIsUy5DYWxsYmFja3MoIm1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJtZW1vcnkiKSwyXSxbInJlc29sdmUiLCJkb25lIixTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwwLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMSwicmVqZWN0ZWQiXV0saT0icGVuZGluZyIsYT17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gaX0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIHMuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSwiY2F0Y2giOmZ1bmN0aW9uKGUpe3JldHVybiBhLnRoZW4obnVsbCxlKX0scGlwZTpmdW5jdGlvbigpe3ZhciBpPWFyZ3VtZW50cztyZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihyKXtTLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBuPW0oaVt0WzRdXSkmJmlbdFs0XV07c1t0WzFdXShmdW5jdGlvbigpe3ZhciBlPW4mJm4uYXBwbHkodGhpcyxhcmd1bWVudHMpO2UmJm0oZS5wcm9taXNlKT9lLnByb21pc2UoKS5wcm9ncmVzcyhyLm5vdGlmeSkuZG9uZShyLnJlc29sdmUpLmZhaWwoci5yZWplY3QpOnJbdFswXSsiV2l0aCJdKHRoaXMsbj9bZV06YXJndW1lbnRzKX0pfSksaT1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKHQsbixyKXt2YXIgdT0wO2Z1bmN0aW9uIGwoaSxvLGEscyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cyxlPWZ1bmN0aW9uKCl7dmFyIGUsdDtpZighKGk8dSkpe2lmKChlPWEuYXBwbHkobixyKSk9PT1vLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTt0PWUmJigib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlKSYmZS50aGVuLG0odCk/cz90LmNhbGwoZSxsKHUsbyxSLHMpLGwodSxvLE0scykpOih1KyssdC5jYWxsKGUsbCh1LG8sUixzKSxsKHUsbyxNLHMpLGwodSxvLFIsby5ub3RpZnlXaXRoKSkpOihhIT09UiYmKG49dm9pZCAwLHI9W2VdKSwoc3x8by5yZXNvbHZlV2l0aCkobixyKSl9fSx0PXM/ZTpmdW5jdGlvbigpe3RyeXtlKCl9Y2F0Y2goZSl7Uy5EZWZlcnJlZC5leGNlcHRpb25Ib29rJiZTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soZSx0LnN0YWNrVHJhY2UpLHU8PWkrMSYmKGEhPT1NJiYobj12b2lkIDAscj1bZV0pLG8ucmVqZWN0V2l0aChuLHIpKX19O2k/dCgpOihTLkRlZmVycmVkLmdldFN0YWNrSG9vayYmKHQuc3RhY2tUcmFjZT1TLkRlZmVycmVkLmdldFN0YWNrSG9vaygpKSxDLnNldFRpbWVvdXQodCkpfX1yZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihlKXtvWzBdWzNdLmFkZChsKDAsZSxtKHIpP3I6UixlLm5vdGlmeVdpdGgpKSxvWzFdWzNdLmFkZChsKDAsZSxtKHQpP3Q6UikpLG9bMl1bM10uYWRkKGwoMCxlLG0obik/bjpNKSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWU/Uy5leHRlbmQoZSxhKTphfX0scz17fTtyZXR1cm4gUy5lYWNoKG8sZnVuY3Rpb24oZSx0KXt2YXIgbj10WzJdLHI9dFs1XTthW3RbMV1dPW4uYWRkLHImJm4uYWRkKGZ1bmN0aW9uKCl7aT1yfSxvWzMtZV1bMl0uZGlzYWJsZSxvWzMtZV1bM10uZGlzYWJsZSxvWzBdWzJdLmxvY2ssb1swXVszXS5sb2NrKSxuLmFkZCh0WzNdLmZpcmUpLHNbdFswXV09ZnVuY3Rpb24oKXtyZXR1cm4gc1t0WzBdKyJXaXRoIl0odGhpcz09PXM/dm9pZCAwOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxzW3RbMF0rIldpdGgiXT1uLmZpcmVXaXRofSksYS5wcm9taXNlKHMpLGUmJmUuY2FsbChzLHMpLHN9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCx0PW4scj1BcnJheSh0KSxpPXMuY2FsbChhcmd1bWVudHMpLG89Uy5EZWZlcnJlZCgpLGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JbdF09dGhpcyxpW3RdPTE8YXJndW1lbnRzLmxlbmd0aD9zLmNhbGwoYXJndW1lbnRzKTplLC0tbnx8by5yZXNvbHZlV2l0aChyLGkpfX07aWYobjw9MSYmKEkoZSxvLmRvbmUoYSh0KSkucmVzb2x2ZSxvLnJlamVjdCwhbiksInBlbmRpbmciPT09by5zdGF0ZSgpfHxtKGlbdF0mJmlbdF0udGhlbikpKXJldHVybiBvLnRoZW4oKTt3aGlsZSh0LS0pSShpW3RdLGEodCksby5yZWplY3QpO3JldHVybiBvLnByb21pc2UoKX19KTt2YXIgVz0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24oZSx0KXtDLmNvbnNvbGUmJkMuY29uc29sZS53YXJuJiZlJiZXLnRlc3QoZS5uYW1lKSYmQy5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIrZS5tZXNzYWdlLGUuc3RhY2ssdCl9LFMucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24oZSl7Qy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgZX0pfTt2YXIgRj1TLkRlZmVycmVkKCk7ZnVuY3Rpb24gQigpe0UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiksQy5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixCKSxTLnJlYWR5KCl9Uy5mbi5yZWFkeT1mdW5jdGlvbihlKXtyZXR1cm4gRi50aGVuKGUpWyJjYXRjaCJdKGZ1bmN0aW9uKGUpe1MucmVhZHlFeGNlcHRpb24oZSl9KSx0aGlzfSxTLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbihlKXsoITA9PT1lPy0tUy5yZWFkeVdhaXQ6Uy5pc1JlYWR5KXx8KFMuaXNSZWFkeT0hMCkhPT1lJiYwPC0tUy5yZWFkeVdhaXR8fEYucmVzb2x2ZVdpdGgoRSxbU10pfX0pLFMucmVhZHkudGhlbj1GLnRoZW4sImNvbXBsZXRlIj09PUUucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09RS5yZWFkeVN0YXRlJiYhRS5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/Qy5zZXRUaW1lb3V0KFMucmVhZHkpOihFLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIpLEMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsQikpO3ZhciAkPWZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEpe3ZhciBzPTAsdT1lLmxlbmd0aCxsPW51bGw9PW47aWYoIm9iamVjdCI9PT13KG4pKWZvcihzIGluIGk9ITAsbikkKGUsdCxzLG5bc10sITAsbyxhKTtlbHNlIGlmKHZvaWQgMCE9PXImJihpPSEwLG0ocil8fChhPSEwKSxsJiYoYT8odC5jYWxsKGUsciksdD1udWxsKToobD10LHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBsLmNhbGwoUyhlKSxuKX0pKSx0KSlmb3IoO3M8dTtzKyspdChlW3NdLG4sYT9yOnIuY2FsbChlW3NdLHMsdChlW3NdLG4pKSk7cmV0dXJuIGk/ZTpsP3QuY2FsbChlKTp1P3QoZVswXSxuKTpvfSxfPS9eLW1zLS8sej0vLShbYS16XSkvZztmdW5jdGlvbiBVKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBYKGUpe3JldHVybiBlLnJlcGxhY2UoXywibXMtIikucmVwbGFjZSh6LFUpfXZhciBWPWZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZXx8OT09PWUubm9kZVR5cGV8fCErZS5ub2RlVHlwZX07ZnVuY3Rpb24gRygpe3RoaXMuZXhwYW5kbz1TLmV4cGFuZG8rRy51aWQrK31HLnVpZD0xLEcucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHR8fCh0PXt9LFYoZSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT10Ok9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHRoaXMuZXhwYW5kbyx7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KSkpLHR9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT10aGlzLmNhY2hlKGUpO2lmKCJzdHJpbmciPT10eXBlb2YgdClpW1godCldPW47ZWxzZSBmb3IociBpbiB0KWlbWChyKV09dFtyXTtyZXR1cm4gaX0sZ2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5jYWNoZShlKTplW3RoaXMuZXhwYW5kb10mJmVbdGhpcy5leHBhbmRvXVtYKHQpXX0sYWNjZXNzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dHx8dCYmInN0cmluZyI9PXR5cGVvZiB0JiZ2b2lkIDA9PT1uP3RoaXMuZ2V0KGUsdCk6KHRoaXMuc2V0KGUsdCxuKSx2b2lkIDAhPT1uP246dCl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9ZVt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PXIpe2lmKHZvaWQgMCE9PXQpe249KHQ9QXJyYXkuaXNBcnJheSh0KT90Lm1hcChYKToodD1YKHQpKWluIHI/W3RdOnQubWF0Y2goUCl8fFtdKS5sZW5ndGg7d2hpbGUobi0tKWRlbGV0ZSByW3Rbbl1dfSh2b2lkIDA9PT10fHxTLmlzRW1wdHlPYmplY3QocikpJiYoZS5ub2RlVHlwZT9lW3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSBlW3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHZvaWQgMCE9PXQmJiFTLmlzRW1wdHlPYmplY3QodCl9fTt2YXIgWT1uZXcgRyxRPW5ldyBHLEo9L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxLPS9bQS1aXS9nO2Z1bmN0aW9uIFooZSx0LG4pe3ZhciByLGk7aWYodm9pZCAwPT09biYmMT09PWUubm9kZVR5cGUpaWYocj0iZGF0YS0iK3QucmVwbGFjZShLLCItJCYiKS50b0xvd2VyQ2FzZSgpLCJzdHJpbmciPT10eXBlb2Yobj1lLmdldEF0dHJpYnV0ZShyKSkpe3RyeXtuPSJ0cnVlIj09PShpPW4pfHwiZmFsc2UiIT09aSYmKCJudWxsIj09PWk/bnVsbDppPT09K2krIiI/K2k6Si50ZXN0KGkpP0pTT04ucGFyc2UoaSk6aSl9Y2F0Y2goZSl7fVEuc2V0KGUsdCxuKX1lbHNlIG49dm9pZCAwO3JldHVybiBufVMuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiBRLmhhc0RhdGEoZSl8fFkuaGFzRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFEuYWNjZXNzKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe1EucmVtb3ZlKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gWS5hY2Nlc3MoZSx0LG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe1kucmVtb3ZlKGUsdCl9fSksUy5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24obixlKXt2YXIgdCxyLGksbz10aGlzWzBdLGE9byYmby5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PW4pe2lmKHRoaXMubGVuZ3RoJiYoaT1RLmdldChvKSwxPT09by5ub2RlVHlwZSYmIVkuZ2V0KG8sImhhc0RhdGFBdHRycyIpKSl7dD1hLmxlbmd0aDt3aGlsZSh0LS0pYVt0XSYmMD09PShyPWFbdF0ubmFtZSkuaW5kZXhPZigiZGF0YS0iKSYmKHI9WChyLnNsaWNlKDUpKSxaKG8scixpW3JdKSk7WS5zZXQobywiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGl9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBuP3RoaXMuZWFjaChmdW5jdGlvbigpe1Euc2V0KHRoaXMsbil9KTokKHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ7aWYobyYmdm9pZCAwPT09ZSlyZXR1cm4gdm9pZCAwIT09KHQ9US5nZXQobyxuKSk/dDp2b2lkIDAhPT0odD1aKG8sbikpP3Q6dm9pZCAwO3RoaXMuZWFjaChmdW5jdGlvbigpe1Euc2V0KHRoaXMsbixlKX0pfSxudWxsLGUsMTxhcmd1bWVudHMubGVuZ3RoLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtRLnJlbW92ZSh0aGlzLGUpfSl9fSksUy5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZihlKXJldHVybiB0PSh0fHwiZngiKSsicXVldWUiLHI9WS5nZXQoZSx0KSxuJiYoIXJ8fEFycmF5LmlzQXJyYXkobik/cj1ZLmFjY2VzcyhlLHQsUy5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24oZSx0KXt0PXR8fCJmeCI7dmFyIG49Uy5xdWV1ZShlLHQpLHI9bi5sZW5ndGgsaT1uLnNoaWZ0KCksbz1TLl9xdWV1ZUhvb2tzKGUsdCk7ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKCJmeCI9PT10JiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGZ1bmN0aW9uKCl7Uy5kZXF1ZXVlKGUsdCl9LG8pKSwhciYmbyYmby5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCsicXVldWVIb29rcyI7cmV0dXJuIFkuZ2V0KGUsbil8fFkuYWNjZXNzKGUsbix7ZW1wdHk6Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7WS5yZW1vdmUoZSxbdCsicXVldWUiLG5dKX0pfSl9fSksUy5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsbil7dmFyIGU9MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihuPXQsdD0iZngiLGUtLSksYXJndW1lbnRzLmxlbmd0aDxlP1MucXVldWUodGhpc1swXSx0KTp2b2lkIDA9PT1uP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Uy5xdWV1ZSh0aGlzLHQsbik7Uy5fcXVldWVIb29rcyh0aGlzLHQpLCJmeCI9PT10JiYiaW5wcm9ncmVzcyIhPT1lWzBdJiZTLmRlcXVldWUodGhpcyx0KX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmRlcXVldWUodGhpcyxlKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnF1ZXVlKGV8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0xLGk9Uy5EZWZlcnJlZCgpLG89dGhpcyxhPXRoaXMubGVuZ3RoLHM9ZnVuY3Rpb24oKXstLXJ8fGkucmVzb2x2ZVdpdGgobyxbb10pfTsic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLGU9ZXx8ImZ4Ijt3aGlsZShhLS0pKG49WS5nZXQob1thXSxlKyJxdWV1ZUhvb2tzIikpJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKHMpKTtyZXR1cm4gcygpLGkucHJvbWlzZSh0KX19KTt2YXIgZWU9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsdGU9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK2VlKyIpKFthLXolXSopJCIsImkiKSxuZT1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLHJlPUUuZG9jdW1lbnRFbGVtZW50LGllPWZ1bmN0aW9uKGUpe3JldHVybiBTLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKX0sb2U9e2NvbXBvc2VkOiEwfTtyZS5nZXRSb290Tm9kZSYmKGllPWZ1bmN0aW9uKGUpe3JldHVybiBTLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKXx8ZS5nZXRSb290Tm9kZShvZSk9PT1lLm93bmVyRG9jdW1lbnR9KTt2YXIgYWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ibm9uZSI9PT0oZT10fHxlKS5zdHlsZS5kaXNwbGF5fHwiIj09PWUuc3R5bGUuZGlzcGxheSYmaWUoZSkmJiJub25lIj09PVMuY3NzKGUsImRpc3BsYXkiKX07ZnVuY3Rpb24gc2UoZSx0LG4scil7dmFyIGksbyxhPTIwLHM9cj9mdW5jdGlvbigpe3JldHVybiByLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiBTLmNzcyhlLHQsIiIpfSx1PXMoKSxsPW4mJm5bM118fChTLmNzc051bWJlclt0XT8iIjoicHgiKSxjPWUubm9kZVR5cGUmJihTLmNzc051bWJlclt0XXx8InB4IiE9PWwmJit1KSYmdGUuZXhlYyhTLmNzcyhlLHQpKTtpZihjJiZjWzNdIT09bCl7dS89MixsPWx8fGNbM10sYz0rdXx8MTt3aGlsZShhLS0pUy5zdHlsZShlLHQsYytsKSwoMS1vKSooMS0obz1zKCkvdXx8LjUpKTw9MCYmKGE9MCksYy89bztjKj0yLFMuc3R5bGUoZSx0LGMrbCksbj1ufHxbXX1yZXR1cm4gbiYmKGM9K2N8fCt1fHwwLGk9blsxXT9jKyhuWzFdKzEpKm5bMl06K25bMl0sciYmKHIudW5pdD1sLHIuc3RhcnQ9YyxyLmVuZD1pKSksaX12YXIgdWU9e307ZnVuY3Rpb24gbGUoZSx0KXtmb3IodmFyIG4scixpLG8sYSxzLHUsbD1bXSxjPTAsZj1lLmxlbmd0aDtjPGY7YysrKShyPWVbY10pLnN0eWxlJiYobj1yLnN0eWxlLmRpc3BsYXksdD8oIm5vbmUiPT09biYmKGxbY109WS5nZXQociwiZGlzcGxheSIpfHxudWxsLGxbY118fChyLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PXIuc3R5bGUuZGlzcGxheSYmYWUocikmJihsW2NdPSh1PWE9bz12b2lkIDAsYT0oaT1yKS5vd25lckRvY3VtZW50LHM9aS5ub2RlTmFtZSwodT11ZVtzXSl8fChvPWEuYm9keS5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQocykpLHU9Uy5jc3MobywiZGlzcGxheSIpLG8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKSwibm9uZSI9PT11JiYodT0iYmxvY2siKSx1ZVtzXT11KSkpKToibm9uZSIhPT1uJiYobFtjXT0ibm9uZSIsWS5zZXQociwiZGlzcGxheSIsbikpKTtmb3IoYz0wO2M8ZjtjKyspbnVsbCE9bFtjXSYmKGVbY10uc3R5bGUuZGlzcGxheT1sW2NdKTtyZXR1cm4gZX1TLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBsZSh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBsZSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGU/ZT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXthZSh0aGlzKT9TKHRoaXMpLnNob3coKTpTKHRoaXMpLmhpZGUoKX0pfX0pO3ZhciBjZSxmZSxwZT0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxkZT0vPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKikvaSxoZT0vXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2k7Y2U9RS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuYXBwZW5kQ2hpbGQoRS5jcmVhdGVFbGVtZW50KCJkaXYiKSksKGZlPUUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxmZS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksZmUuc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLGNlLmFwcGVuZENoaWxkKGZlKSx5LmNoZWNrQ2xvbmU9Y2UuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGNlLmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIseS5ub0Nsb25lQ2hlY2tlZD0hIWNlLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZSxjZS5pbm5lckhUTUw9IjxvcHRpb24+PC9vcHRpb24+Iix5Lm9wdGlvbj0hIWNlLmxhc3RDaGlsZDt2YXIgZ2U9e3RoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtmdW5jdGlvbiB2ZShlLHQpe3ZhciBuO3JldHVybiBuPSJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHR8fCIqIik6InVuZGVmaW5lZCIhPXR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGw/ZS5xdWVyeVNlbGVjdG9yQWxsKHR8fCIqIik6W10sdm9pZCAwPT09dHx8dCYmQShlLHQpP1MubWVyZ2UoW2VdLG4pOm59ZnVuY3Rpb24geWUoZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspWS5zZXQoZVtuXSwiZ2xvYmFsRXZhbCIsIXR8fFkuZ2V0KHRbbl0sImdsb2JhbEV2YWwiKSl9Z2UudGJvZHk9Z2UudGZvb3Q9Z2UuY29sZ3JvdXA9Z2UuY2FwdGlvbj1nZS50aGVhZCxnZS50aD1nZS50ZCx5Lm9wdGlvbnx8KGdlLm9wdGdyb3VwPWdlLm9wdGlvbj1bMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdKTt2YXIgbWU9Lzx8JiM/XHcrOy87ZnVuY3Rpb24geGUoZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLHUsbCxjLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxkPTAsaD1lLmxlbmd0aDtkPGg7ZCsrKWlmKChvPWVbZF0pfHwwPT09bylpZigib2JqZWN0Ij09PXcobykpUy5tZXJnZShwLG8ubm9kZVR5cGU/W29dOm8pO2Vsc2UgaWYobWUudGVzdChvKSl7YT1hfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KGRlLmV4ZWMobyl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1nZVtzXXx8Z2UuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXStTLmh0bWxQcmVmaWx0ZXIobykrdVsyXSxjPXVbMF07d2hpbGUoYy0tKWE9YS5sYXN0Q2hpbGQ7Uy5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtmLnRleHRDb250ZW50PSIiLGQ9MDt3aGlsZShvPXBbZCsrXSlpZihyJiYtMTxTLmluQXJyYXkobyxyKSlpJiZpLnB1c2gobyk7ZWxzZSBpZihsPWllKG8pLGE9dmUoZi5hcHBlbmRDaGlsZChvKSwic2NyaXB0IiksbCYmeWUoYSksbil7Yz0wO3doaWxlKG89YVtjKytdKWhlLnRlc3Qoby50eXBlfHwiIikmJm4ucHVzaChvKX1yZXR1cm4gZn12YXIgYmU9L15rZXkvLHdlPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxUZT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24gQ2UoKXtyZXR1cm4hMH1mdW5jdGlvbiBFZSgpe3JldHVybiExfWZ1bmN0aW9uIFNlKGUsdCl7cmV0dXJuIGU9PT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gRS5hY3RpdmVFbGVtZW50fWNhdGNoKGUpe319KCk9PSgiZm9jdXMiPT09dCl9ZnVuY3Rpb24ga2UoZSx0LG4scixpLG8pe3ZhciBhLHM7aWYoIm9iamVjdCI9PXR5cGVvZiB0KXtmb3IocyBpbiJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXZvaWQgMCksdClrZShlLHMsbixyLHRbc10sbyk7cmV0dXJuIGV9aWYobnVsbD09ciYmbnVsbD09aT8oaT1uLHI9bj12b2lkIDApOm51bGw9PWkmJigic3RyaW5nIj09dHlwZW9mIG4/KGk9cixyPXZvaWQgMCk6KGk9cixyPW4sbj12b2lkIDApKSwhMT09PWkpaT1FZTtlbHNlIGlmKCFpKXJldHVybiBlO3JldHVybiAxPT09byYmKGE9aSwoaT1mdW5jdGlvbihlKXtyZXR1cm4gUygpLm9mZihlKSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPVMuZ3VpZCsrKSksZS5lYWNoKGZ1bmN0aW9uKCl7Uy5ldmVudC5hZGQodGhpcyx0LGkscixuKX0pfWZ1bmN0aW9uIEFlKGUsaSxvKXtvPyhZLnNldChlLGksITEpLFMuZXZlbnQuYWRkKGUsaSx7bmFtZXNwYWNlOiExLGhhbmRsZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPVkuZ2V0KHRoaXMsaSk7aWYoMSZlLmlzVHJpZ2dlciYmdGhpc1tpXSl7aWYoci5sZW5ndGgpKFMuZXZlbnQuc3BlY2lhbFtpXXx8e30pLmRlbGVnYXRlVHlwZSYmZS5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKHI9cy5jYWxsKGFyZ3VtZW50cyksWS5zZXQodGhpcyxpLHIpLHQ9byh0aGlzLGkpLHRoaXNbaV0oKSxyIT09KG49WS5nZXQodGhpcyxpKSl8fHQ/WS5zZXQodGhpcyxpLCExKTpuPXt9LHIhPT1uKXJldHVybiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGUucHJldmVudERlZmF1bHQoKSxuLnZhbHVlfWVsc2Ugci5sZW5ndGgmJihZLnNldCh0aGlzLGkse3ZhbHVlOlMuZXZlbnQudHJpZ2dlcihTLmV4dGVuZChyWzBdLFMuRXZlbnQucHJvdG90eXBlKSxyLnNsaWNlKDEpLHRoaXMpfSksZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSl9fSkpOnZvaWQgMD09PVkuZ2V0KGUsaSkmJlMuZXZlbnQuYWRkKGUsaSxDZSl9Uy5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLHAsZCxoLGcsdj1ZLmdldCh0KTtpZihWKHQpKXtuLmhhbmRsZXImJihuPShvPW4pLmhhbmRsZXIsaT1vLnNlbGVjdG9yKSxpJiZTLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHJlLGkpLG4uZ3VpZHx8KG4uZ3VpZD1TLmd1aWQrKyksKHU9di5ldmVudHMpfHwodT12LmV2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpKSwoYT12LmhhbmRsZSl8fChhPXYuaGFuZGxlPWZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgUyYmUy5ldmVudC50cmlnZ2VyZWQhPT1lLnR5cGU/Uy5ldmVudC5kaXNwYXRjaC5hcHBseSh0LGFyZ3VtZW50cyk6dm9pZCAwfSksbD0oZT0oZXx8IiIpLm1hdGNoKFApfHxbIiJdKS5sZW5ndGg7d2hpbGUobC0tKWQ9Zz0ocz1UZS5leGVjKGVbbF0pfHxbXSlbMV0saD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGQmJihmPVMuZXZlbnQuc3BlY2lhbFtkXXx8e30sZD0oaT9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZCxmPVMuZXZlbnQuc3BlY2lhbFtkXXx8e30sYz1TLmV4dGVuZCh7dHlwZTpkLG9yaWdUeXBlOmcsZGF0YTpyLGhhbmRsZXI6bixndWlkOm4uZ3VpZCxzZWxlY3RvcjppLG5lZWRzQ29udGV4dDppJiZTLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoaSksbmFtZXNwYWNlOmguam9pbigiLiIpfSxvKSwocD11W2RdKXx8KChwPXVbZF09W10pLmRlbGVnYXRlQ291bnQ9MCxmLnNldHVwJiYhMSE9PWYuc2V0dXAuY2FsbCh0LHIsaCxhKXx8dC5hZGRFdmVudExpc3RlbmVyJiZ0LmFkZEV2ZW50TGlzdGVuZXIoZCxhKSksZi5hZGQmJihmLmFkZC5jYWxsKHQsYyksYy5oYW5kbGVyLmd1aWR8fChjLmhhbmRsZXIuZ3VpZD1uLmd1aWQpKSxpP3Auc3BsaWNlKHAuZGVsZWdhdGVDb3VudCsrLDAsYyk6cC5wdXNoKGMpLFMuZXZlbnQuZ2xvYmFsW2RdPSEwKX19LHJlbW92ZTpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLHAsZCxoLGcsdj1ZLmhhc0RhdGEoZSkmJlkuZ2V0KGUpO2lmKHYmJih1PXYuZXZlbnRzKSl7bD0odD0odHx8IiIpLm1hdGNoKFApfHxbIiJdKS5sZW5ndGg7d2hpbGUobC0tKWlmKGQ9Zz0ocz1UZS5leGVjKHRbbF0pfHxbXSlbMV0saD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGQpe2Y9Uy5ldmVudC5zcGVjaWFsW2RdfHx7fSxwPXVbZD0ocj9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZF18fFtdLHM9c1syXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIraC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxhPW89cC5sZW5ndGg7d2hpbGUoby0tKWM9cFtvXSwhaSYmZyE9PWMub3JpZ1R5cGV8fG4mJm4uZ3VpZCE9PWMuZ3VpZHx8cyYmIXMudGVzdChjLm5hbWVzcGFjZSl8fHImJnIhPT1jLnNlbGVjdG9yJiYoIioqIiE9PXJ8fCFjLnNlbGVjdG9yKXx8KHAuc3BsaWNlKG8sMSksYy5zZWxlY3RvciYmcC5kZWxlZ2F0ZUNvdW50LS0sZi5yZW1vdmUmJmYucmVtb3ZlLmNhbGwoZSxjKSk7YSYmIXAubGVuZ3RoJiYoZi50ZWFyZG93biYmITEhPT1mLnRlYXJkb3duLmNhbGwoZSxoLHYuaGFuZGxlKXx8Uy5yZW1vdmVFdmVudChlLGQsdi5oYW5kbGUpLGRlbGV0ZSB1W2RdKX1lbHNlIGZvcihkIGluIHUpUy5ldmVudC5yZW1vdmUoZSxkK3RbbF0sbixyLCEwKTtTLmlzRW1wdHlPYmplY3QodSkmJlkucmVtb3ZlKGUsImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYSxzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSx1PVMuZXZlbnQuZml4KGUpLGw9KFkuZ2V0KHRoaXMsImV2ZW50cyIpfHxPYmplY3QuY3JlYXRlKG51bGwpKVt1LnR5cGVdfHxbXSxjPVMuZXZlbnQuc3BlY2lhbFt1LnR5cGVdfHx7fTtmb3Ioc1swXT11LHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXNbdF09YXJndW1lbnRzW3RdO2lmKHUuZGVsZWdhdGVUYXJnZXQ9dGhpcywhYy5wcmVEaXNwYXRjaHx8ITEhPT1jLnByZURpc3BhdGNoLmNhbGwodGhpcyx1KSl7YT1TLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyx1LGwpLHQ9MDt3aGlsZSgoaT1hW3QrK10pJiYhdS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXt1LmN1cnJlbnRUYXJnZXQ9aS5lbGVtLG49MDt3aGlsZSgobz1pLmhhbmRsZXJzW24rK10pJiYhdS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKXUucm5hbWVzcGFjZSYmITEhPT1vLm5hbWVzcGFjZSYmIXUucm5hbWVzcGFjZS50ZXN0KG8ubmFtZXNwYWNlKXx8KHUuaGFuZGxlT2JqPW8sdS5kYXRhPW8uZGF0YSx2b2lkIDAhPT0ocj0oKFMuZXZlbnQuc3BlY2lhbFtvLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8by5oYW5kbGVyKS5hcHBseShpLmVsZW0scykpJiYhMT09PSh1LnJlc3VsdD1yKSYmKHUucHJldmVudERlZmF1bHQoKSx1LnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGMucG9zdERpc3BhdGNoJiZjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsdSksdS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz1bXSx1PXQuZGVsZWdhdGVDb3VudCxsPWUudGFyZ2V0O2lmKHUmJmwubm9kZVR5cGUmJiEoImNsaWNrIj09PWUudHlwZSYmMTw9ZS5idXR0b24pKWZvcig7bCE9PXRoaXM7bD1sLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWwubm9kZVR5cGUmJigiY2xpY2siIT09ZS50eXBlfHwhMCE9PWwuZGlzYWJsZWQpKXtmb3Iobz1bXSxhPXt9LG49MDtuPHU7bisrKXZvaWQgMD09PWFbaT0ocj10W25dKS5zZWxlY3RvcisiICJdJiYoYVtpXT1yLm5lZWRzQ29udGV4dD8tMTxTKGksdGhpcykuaW5kZXgobCk6Uy5maW5kKGksdGhpcyxudWxsLFtsXSkubGVuZ3RoKSxhW2ldJiZvLnB1c2gocik7by5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOm99KX1yZXR1cm4gbD10aGlzLHU8dC5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOnQuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KFMuRXZlbnQucHJvdG90eXBlLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDptKGUpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiBlKHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbdF19LHNldDpmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSl9fSl9LGZpeDpmdW5jdGlvbihlKXtyZXR1cm4gZVtTLmV4cGFuZG9dP2U6bmV3IFMuRXZlbnQoZSl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxjbGljazp7c2V0dXA6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc3x8ZTtyZXR1cm4gcGUudGVzdCh0LnR5cGUpJiZ0LmNsaWNrJiZBKHQsImlucHV0IikmJkFlKHQsImNsaWNrIixDZSksITF9LHRyaWdnZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc3x8ZTtyZXR1cm4gcGUudGVzdCh0LnR5cGUpJiZ0LmNsaWNrJiZBKHQsImlucHV0IikmJkFlKHQsImNsaWNrIiksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0O3JldHVybiBwZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJkEodCwiaW5wdXQiKSYmWS5nZXQodCwiY2xpY2siKXx8QSh0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXt2b2lkIDAhPT1lLnJlc3VsdCYmZS5vcmlnaW5hbEV2ZW50JiYoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWUucmVzdWx0KX19fX0sUy5yZW1vdmVFdmVudD1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX0sUy5FdmVudD1mdW5jdGlvbihlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFMuRXZlbnQpKXJldHVybiBuZXcgUy5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWUuZGVmYXVsdFByZXZlbnRlZCYmITE9PT1lLnJldHVyblZhbHVlP0NlOkVlLHRoaXMudGFyZ2V0PWUudGFyZ2V0JiYzPT09ZS50YXJnZXQubm9kZVR5cGU/ZS50YXJnZXQucGFyZW50Tm9kZTplLnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9ZS5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT1lLHQmJlMuZXh0ZW5kKHRoaXMsdCksdGhpcy50aW1lU3RhbXA9ZSYmZS50aW1lU3RhbXB8fERhdGUubm93KCksdGhpc1tTLmV4cGFuZG9dPSEwfSxTLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6Uy5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6RWUsaXNQcm9wYWdhdGlvblN0b3BwZWQ6RWUsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6RWUsaXNTaW11bGF0ZWQ6ITEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Q2UsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9Q2UsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUNlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSxTLmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsImNoYXIiOiEwLGNvZGU6ITAsY2hhckNvZGU6ITAsa2V5OiEwLGtleUNvZGU6ITAsYnV0dG9uOiEwLGJ1dHRvbnM6ITAsY2xpZW50WDohMCxjbGllbnRZOiEwLG9mZnNldFg6ITAsb2Zmc2V0WTohMCxwb2ludGVySWQ6ITAscG9pbnRlclR5cGU6ITAsc2NyZWVuWDohMCxzY3JlZW5ZOiEwLHRhcmdldFRvdWNoZXM6ITAsdG9FbGVtZW50OiEwLHRvdWNoZXM6ITAsd2hpY2g6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5idXR0b247cmV0dXJuIG51bGw9PWUud2hpY2gmJmJlLnRlc3QoZS50eXBlKT9udWxsIT1lLmNoYXJDb2RlP2UuY2hhckNvZGU6ZS5rZXlDb2RlOiFlLndoaWNoJiZ2b2lkIDAhPT10JiZ3ZS50ZXN0KGUudHlwZSk/MSZ0PzE6MiZ0PzM6NCZ0PzI6MDplLndoaWNofX0sUy5ldmVudC5hZGRQcm9wKSxTLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGUsdCl7Uy5ldmVudC5zcGVjaWFsW2VdPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBBZSh0aGlzLGUsU2UpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIEFlKHRoaXMsZSksITB9LGRlbGVnYXRlVHlwZTp0fX0pLFMuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oZSxpKXtTLmV2ZW50LnNwZWNpYWxbZV09e2RlbGVnYXRlVHlwZTppLGJpbmRUeXBlOmksaGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5yZWxhdGVkVGFyZ2V0LHI9ZS5oYW5kbGVPYmo7cmV0dXJuIG4mJihuPT09dGhpc3x8Uy5jb250YWlucyh0aGlzLG4pKXx8KGUudHlwZT1yLm9yaWdUeXBlLHQ9ci5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnR5cGU9aSksdH19fSksUy5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBrZSh0aGlzLGUsdCxuLHIpfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGtlKHRoaXMsZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLFMoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PXQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0fHwobj10LHQ9dm9pZCAwKSwhMT09PW4mJihuPUVlKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LnJlbW92ZSh0aGlzLGUsbix0KX0pfX0pO3ZhciBOZT0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxEZT0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxqZT0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2c7ZnVuY3Rpb24gcWUoZSx0KXtyZXR1cm4gQShlLCJ0YWJsZSIpJiZBKDExIT09dC5ub2RlVHlwZT90OnQuZmlyc3RDaGlsZCwidHIiKSYmUyhlKS5jaGlsZHJlbigidGJvZHkiKVswXXx8ZX1mdW5jdGlvbiBMZShlKXtyZXR1cm4gZS50eXBlPShudWxsIT09ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2UudHlwZSxlfWZ1bmN0aW9uIEhlKGUpe3JldHVybiJ0cnVlLyI9PT0oZS50eXBlfHwiIikuc2xpY2UoMCw1KT9lLnR5cGU9ZS50eXBlLnNsaWNlKDUpOmUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksZX1mdW5jdGlvbiBPZShlLHQpe3ZhciBuLHIsaSxvLGEscztpZigxPT09dC5ub2RlVHlwZSl7aWYoWS5oYXNEYXRhKGUpJiYocz1ZLmdldChlKS5ldmVudHMpKWZvcihpIGluIFkucmVtb3ZlKHQsImhhbmRsZSBldmVudHMiKSxzKWZvcihuPTAscj1zW2ldLmxlbmd0aDtuPHI7bisrKVMuZXZlbnQuYWRkKHQsaSxzW2ldW25dKTtRLmhhc0RhdGEoZSkmJihvPVEuYWNjZXNzKGUpLGE9Uy5leHRlbmQoe30sbyksUS5zZXQodCxhKSl9fWZ1bmN0aW9uIFBlKG4scixpLG8pe3I9ZyhyKTt2YXIgZSx0LGEscyx1LGwsYz0wLGY9bi5sZW5ndGgscD1mLTEsZD1yWzBdLGg9bShkKTtpZihofHwxPGYmJiJzdHJpbmciPT10eXBlb2YgZCYmIXkuY2hlY2tDbG9uZSYmRGUudGVzdChkKSlyZXR1cm4gbi5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PW4uZXEoZSk7aCYmKHJbMF09ZC5jYWxsKHRoaXMsZSx0Lmh0bWwoKSkpLFBlKHQscixpLG8pfSk7aWYoZiYmKHQ9KGU9eGUocixuWzBdLm93bmVyRG9jdW1lbnQsITEsbixvKSkuZmlyc3RDaGlsZCwxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aCYmKGU9dCksdHx8bykpe2ZvcihzPShhPVMubWFwKHZlKGUsInNjcmlwdCIpLExlKSkubGVuZ3RoO2M8ZjtjKyspdT1lLGMhPT1wJiYodT1TLmNsb25lKHUsITAsITApLHMmJlMubWVyZ2UoYSx2ZSh1LCJzY3JpcHQiKSkpLGkuY2FsbChuW2NdLHUsYyk7aWYocylmb3IobD1hW2EubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsUy5tYXAoYSxIZSksYz0wO2M8cztjKyspdT1hW2NdLGhlLnRlc3QodS50eXBlfHwiIikmJiFZLmFjY2Vzcyh1LCJnbG9iYWxFdmFsIikmJlMuY29udGFpbnMobCx1KSYmKHUuc3JjJiYibW9kdWxlIiE9PSh1LnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpP1MuX2V2YWxVcmwmJiF1Lm5vTW9kdWxlJiZTLl9ldmFsVXJsKHUuc3JjLHtub25jZTp1Lm5vbmNlfHx1LmdldEF0dHJpYnV0ZSgibm9uY2UiKX0sbCk6Yih1LnRleHRDb250ZW50LnJlcGxhY2UoamUsIiIpLHUsbCkpfXJldHVybiBufWZ1bmN0aW9uIFJlKGUsdCxuKXtmb3IodmFyIHIsaT10P1MuZmlsdGVyKHQsZSk6ZSxvPTA7bnVsbCE9KHI9aVtvXSk7bysrKW58fDEhPT1yLm5vZGVUeXBlfHxTLmNsZWFuRGF0YSh2ZShyKSksci5wYXJlbnROb2RlJiYobiYmaWUocikmJnllKHZlKHIsInNjcmlwdCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiBlfVMuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYz1lLmNsb25lTm9kZSghMCksZj1pZShlKTtpZighKHkubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fFMuaXNYTUxEb2MoZSkpKWZvcihhPXZlKGMpLHI9MCxpPShvPXZlKGUpKS5sZW5ndGg7cjxpO3IrKylzPW9bcl0sdT1hW3JdLHZvaWQgMCwiaW5wdXQiPT09KGw9dS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSYmcGUudGVzdChzLnR5cGUpP3UuY2hlY2tlZD1zLmNoZWNrZWQ6ImlucHV0IiE9PWwmJiJ0ZXh0YXJlYSIhPT1sfHwodS5kZWZhdWx0VmFsdWU9cy5kZWZhdWx0VmFsdWUpO2lmKHQpaWYobilmb3Iobz1vfHx2ZShlKSxhPWF8fHZlKGMpLHI9MCxpPW8ubGVuZ3RoO3I8aTtyKyspT2Uob1tyXSxhW3JdKTtlbHNlIE9lKGUsYyk7cmV0dXJuIDA8KGE9dmUoYywic2NyaXB0IikpLmxlbmd0aCYmeWUoYSwhZiYmdmUoZSwic2NyaXB0IikpLGN9LGNsZWFuRGF0YTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbixyLGk9Uy5ldmVudC5zcGVjaWFsLG89MDt2b2lkIDAhPT0obj1lW29dKTtvKyspaWYoVihuKSl7aWYodD1uW1kuZXhwYW5kb10pe2lmKHQuZXZlbnRzKWZvcihyIGluIHQuZXZlbnRzKWlbcl0/Uy5ldmVudC5yZW1vdmUobixyKTpTLnJlbW92ZUV2ZW50KG4scix0LmhhbmRsZSk7bltZLmV4cGFuZG9dPXZvaWQgMH1uW1EuZXhwYW5kb10mJihuW1EuZXhwYW5kb109dm9pZCAwKX19fSksUy5mbi5leHRlbmQoe2RldGFjaDpmdW5jdGlvbihlKXtyZXR1cm4gUmUodGhpcyxlLCEwKX0scmVtb3ZlOmZ1bmN0aW9uKGUpe3JldHVybiBSZSh0aGlzLGUpfSx0ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/Uy50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fCh0aGlzLnRleHRDb250ZW50PWUpfSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIFBlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHxxZSh0aGlzLGUpLmFwcGVuZENoaWxkKGUpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gUGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciB0PXFlKHRoaXMsZSk7dC5pbnNlcnRCZWZvcmUoZSx0LmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gUGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gUGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD0wO251bGwhPShlPXRoaXNbdF0pO3QrKykxPT09ZS5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKHZlKGUsITEpKSxlLnRleHRDb250ZW50PSIiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1udWxsIT1lJiZlLHQ9bnVsbD09dD9lOnQsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gUy5jbG9uZSh0aGlzLGUsdCl9KX0saHRtbDpmdW5jdGlvbihlKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWUmJjE9PT10Lm5vZGVUeXBlKXJldHVybiB0LmlubmVySFRNTDtpZigic3RyaW5nIj09dHlwZW9mIGUmJiFOZS50ZXN0KGUpJiYhZ2VbKGRlLmV4ZWMoZSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXtlPVMuaHRtbFByZWZpbHRlcihlKTt0cnl7Zm9yKDtuPHI7bisrKTE9PT0odD10aGlzW25dfHx7fSkubm9kZVR5cGUmJihTLmNsZWFuRGF0YSh2ZSh0LCExKSksdC5pbm5lckhUTUw9ZSk7dD0wfWNhdGNoKGUpe319dCYmdGhpcy5lbXB0eSgpLmFwcGVuZChlKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBuPVtdO3JldHVybiBQZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7Uy5pbkFycmF5KHRoaXMsbik8MCYmKFMuY2xlYW5EYXRhKHZlKHRoaXMpKSx0JiZ0LnJlcGxhY2VDaGlsZChlLHRoaXMpKX0sbil9fSksUy5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oZSxhKXtTLmZuW2VdPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPVtdLHI9UyhlKSxpPXIubGVuZ3RoLTEsbz0wO288PWk7bysrKXQ9bz09PWk/dGhpczp0aGlzLmNsb25lKCEwKSxTKHJbb10pW2FdKHQpLHUuYXBwbHkobix0LmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobil9fSk7dmFyIE1lPW5ldyBSZWdFeHAoIl4oIitlZSsiKSg/IXB4KVthLXolXSskIiwiaSIpLEllPWZ1bmN0aW9uKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gdCYmdC5vcGVuZXJ8fCh0PUMpLHQuZ2V0Q29tcHV0ZWRTdHlsZShlKX0sV2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fTtmb3IoaSBpbiB0KW9baV09ZS5zdHlsZVtpXSxlLnN0eWxlW2ldPXRbaV07Zm9yKGkgaW4gcj1uLmNhbGwoZSksdCllLnN0eWxlW2ldPW9baV07cmV0dXJuIHJ9LEZlPW5ldyBSZWdFeHAobmUuam9pbigifCIpLCJpIik7ZnVuY3Rpb24gQmUoZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5zdHlsZTtyZXR1cm4obj1ufHxJZShlKSkmJigiIiE9PShhPW4uZ2V0UHJvcGVydHlWYWx1ZSh0KXx8blt0XSl8fGllKGUpfHwoYT1TLnN0eWxlKGUsdCkpLCF5LnBpeGVsQm94U3R5bGVzKCkmJk1lLnRlc3QoYSkmJkZlLnRlc3QodCkmJihyPXMud2lkdGgsaT1zLm1pbldpZHRoLG89cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1pLHMubWF4V2lkdGg9bykpLHZvaWQgMCE9PWE/YSsiIjphfWZ1bmN0aW9uICRlKGUsdCl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCFlKCkpcmV0dXJuKHRoaXMuZ2V0PXQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX0hZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7aWYobCl7dS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIixsLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSUiLHJlLmFwcGVuZENoaWxkKHUpLmFwcGVuZENoaWxkKGwpO3ZhciBlPUMuZ2V0Q29tcHV0ZWRTdHlsZShsKTtuPSIxJSIhPT1lLnRvcCxzPTEyPT09dChlLm1hcmdpbkxlZnQpLGwuc3R5bGUucmlnaHQ9IjYwJSIsbz0zNj09PXQoZS5yaWdodCkscj0zNj09PXQoZS53aWR0aCksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGk9MTI9PT10KGwub2Zmc2V0V2lkdGgvMykscmUucmVtb3ZlQ2hpbGQodSksbD1udWxsfX1mdW5jdGlvbiB0KGUpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpfXZhciBuLHIsaSxvLGEscyx1PUUuY3JlYXRlRWxlbWVudCgiZGl2IiksbD1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuc3R5bGUmJihsLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsbC5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLHkuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1sLnN0eWxlLmJhY2tncm91bmRDbGlwLFMuZXh0ZW5kKHkse2JveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxyfSxwaXhlbEJveFN0eWxlczpmdW5jdGlvbigpe3JldHVybiBlKCksb30scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBlKCksbn0scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxzfSxzY3JvbGxib3hTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxpfSxyZWxpYWJsZVRyRGltZW5zaW9uczpmdW5jdGlvbigpe3ZhciBlLHQsbixyO3JldHVybiBudWxsPT1hJiYoZT1FLmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksdD1FLmNyZWF0ZUVsZW1lbnQoInRyIiksbj1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweCIsdC5zdHlsZS5oZWlnaHQ9IjFweCIsbi5zdHlsZS5oZWlnaHQ9IjlweCIscmUuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQodCkuYXBwZW5kQ2hpbGQobikscj1DLmdldENvbXB1dGVkU3R5bGUodCksYT0zPHBhcnNlSW50KHIuaGVpZ2h0KSxyZS5yZW1vdmVDaGlsZChlKSksYX19KSl9KCk7dmFyIF9lPVsiV2Via2l0IiwiTW96IiwibXMiXSx6ZT1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLFVlPXt9O2Z1bmN0aW9uIFhlKGUpe3ZhciB0PVMuY3NzUHJvcHNbZV18fFVlW2VdO3JldHVybiB0fHwoZSBpbiB6ZT9lOlVlW2VdPWZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLG49X2UubGVuZ3RoO3doaWxlKG4tLSlpZigoZT1fZVtuXSt0KWluIHplKXJldHVybiBlfShlKXx8ZSl9dmFyIFZlPS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxHZT0vXi0tLyxZZT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sUWU9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9O2Z1bmN0aW9uIEplKGUsdCxuKXt2YXIgcj10ZS5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTp0fWZ1bmN0aW9uIEtlKGUsdCxuLHIsaSxvKXt2YXIgYT0id2lkdGgiPT09dD8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPVMuY3NzKGUsbituZVthXSwhMCxpKSkscj8oImNvbnRlbnQiPT09biYmKHUtPVMuY3NzKGUsInBhZGRpbmciK25lW2FdLCEwLGkpKSwibWFyZ2luIiE9PW4mJih1LT1TLmNzcyhlLCJib3JkZXIiK25lW2FdKyJXaWR0aCIsITAsaSkpKToodSs9Uy5jc3MoZSwicGFkZGluZyIrbmVbYV0sITAsaSksInBhZGRpbmciIT09bj91Kz1TLmNzcyhlLCJib3JkZXIiK25lW2FdKyJXaWR0aCIsITAsaSk6cys9Uy5jc3MoZSwiYm9yZGVyIituZVthXSsiV2lkdGgiLCEwLGkpKTtyZXR1cm4hciYmMDw9byYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLW8tdS1zLS41KSl8fDApLHV9ZnVuY3Rpb24gWmUoZSx0LG4pe3ZhciByPUllKGUpLGk9KCF5LmJveFNpemluZ1JlbGlhYmxlKCl8fG4pJiYiYm9yZGVyLWJveCI9PT1TLmNzcyhlLCJib3hTaXppbmciLCExLHIpLG89aSxhPUJlKGUsdCxyKSxzPSJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2lmKE1lLnRlc3QoYSkpe2lmKCFuKXJldHVybiBhO2E9ImF1dG8ifXJldHVybigheS5ib3hTaXppbmdSZWxpYWJsZSgpJiZpfHwheS5yZWxpYWJsZVRyRGltZW5zaW9ucygpJiZBKGUsInRyIil8fCJhdXRvIj09PWF8fCFwYXJzZUZsb2F0KGEpJiYiaW5saW5lIj09PVMuY3NzKGUsImRpc3BsYXkiLCExLHIpKSYmZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmKGk9ImJvcmRlci1ib3giPT09Uy5jc3MoZSwiYm94U2l6aW5nIiwhMSxyKSwobz1zIGluIGUpJiYoYT1lW3NdKSksKGE9cGFyc2VGbG9hdChhKXx8MCkrS2UoZSx0LG58fChpPyJib3JkZXIiOiJjb250ZW50IiksbyxyLGEpKyJweCJ9ZnVuY3Rpb24gZXQoZSx0LG4scixpKXtyZXR1cm4gbmV3IGV0LnByb3RvdHlwZS5pbml0KGUsdCxuLHIsaSl9Uy5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oZSx0KXtpZih0KXt2YXIgbj1CZShlLCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1uPyIxIjpufX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGNvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxncmlkQXJlYTohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3RhcnQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBpLG8sYSxzPVgodCksdT1HZS50ZXN0KHQpLGw9ZS5zdHlsZTtpZih1fHwodD1YZShzKSksYT1TLmNzc0hvb2tzW3RdfHxTLmNzc0hvb2tzW3NdLHZvaWQgMD09PW4pcmV0dXJuIGEmJiJnZXQiaW4gYSYmdm9pZCAwIT09KGk9YS5nZXQoZSwhMSxyKSk/aTpsW3RdOyJzdHJpbmciPT09KG89dHlwZW9mIG4pJiYoaT10ZS5leGVjKG4pKSYmaVsxXSYmKG49c2UoZSx0LGkpLG89Im51bWJlciIpLG51bGwhPW4mJm49PW4mJigibnVtYmVyIiE9PW98fHV8fChuKz1pJiZpWzNdfHwoUy5jc3NOdW1iZXJbc10/IiI6InB4IikpLHkuY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT10LmluZGV4T2YoImJhY2tncm91bmQiKXx8KGxbdF09ImluaGVyaXQiKSxhJiYic2V0ImluIGEmJnZvaWQgMD09PShuPWEuc2V0KGUsbixyKSl8fCh1P2wuc2V0UHJvcGVydHkodCxuKTpsW3RdPW4pKX19LGNzczpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1YKHQpO3JldHVybiBHZS50ZXN0KHQpfHwodD1YZShzKSksKGE9Uy5jc3NIb29rc1t0XXx8Uy5jc3NIb29rc1tzXSkmJiJnZXQiaW4gYSYmKGk9YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09aSYmKGk9QmUoZSx0LHIpKSwibm9ybWFsIj09PWkmJnQgaW4gUWUmJihpPVFlW3RdKSwiIj09PW58fG4/KG89cGFyc2VGbG9hdChpKSwhMD09PW58fGlzRmluaXRlKG8pP298fDA6aSk6aX19KSxTLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGUsdSl7Uy5jc3NIb29rc1t1XT17Z2V0OmZ1bmN0aW9uKGUsdCxuKXtpZih0KXJldHVybiFWZS50ZXN0KFMuY3NzKGUsImRpc3BsYXkiKSl8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/WmUoZSx1LG4pOldlKGUsWWUsZnVuY3Rpb24oKXtyZXR1cm4gWmUoZSx1LG4pfSl9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1JZShlKSxvPSF5LnNjcm9sbGJveFNpemUoKSYmImFic29sdXRlIj09PWkucG9zaXRpb24sYT0ob3x8bikmJiJib3JkZXItYm94Ij09PVMuY3NzKGUsImJveFNpemluZyIsITEsaSkscz1uP0tlKGUsdSxuLGEsaSk6MDtyZXR1cm4gYSYmbyYmKHMtPU1hdGguY2VpbChlWyJvZmZzZXQiK3VbMF0udG9VcHBlckNhc2UoKSt1LnNsaWNlKDEpXS1wYXJzZUZsb2F0KGlbdV0pLUtlKGUsdSwiYm9yZGVyIiwhMSxpKS0uNSkpLHMmJihyPXRlLmV4ZWModCkpJiYicHgiIT09KHJbM118fCJweCIpJiYoZS5zdHlsZVt1XT10LHQ9Uy5jc3MoZSx1KSksSmUoMCx0LHMpfX19KSxTLmNzc0hvb2tzLm1hcmdpbkxlZnQ9JGUoeS5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24oZSx0KXtpZih0KXJldHVybihwYXJzZUZsb2F0KEJlKGUsIm1hcmdpbkxlZnQiKSl8fGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1XZShlLHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksUy5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oaSxvKXtTLmNzc0hvb2tzW2krb109e2V4cGFuZDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXt9LHI9InN0cmluZyI9PXR5cGVvZiBlP2Uuc3BsaXQoIiAiKTpbZV07dDw0O3QrKyluW2krbmVbdF0rb109clt0XXx8clt0LTJdfHxyWzBdO3JldHVybiBufX0sIm1hcmdpbiIhPT1pJiYoUy5jc3NIb29rc1tpK29dLnNldD1KZSl9KSxTLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXt9LGE9MDtpZihBcnJheS5pc0FycmF5KHQpKXtmb3Iocj1JZShlKSxpPXQubGVuZ3RoO2E8aTthKyspb1t0W2FdXT1TLmNzcyhlLHRbYV0sITEscik7cmV0dXJuIG99cmV0dXJuIHZvaWQgMCE9PW4/Uy5zdHlsZShlLHQsbik6Uy5jc3MoZSx0KX0sZSx0LDE8YXJndW1lbnRzLmxlbmd0aCl9fSksKChTLlR3ZWVuPWV0KS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmV0LGluaXQ6ZnVuY3Rpb24oZSx0LG4scixpLG8pe3RoaXMuZWxlbT1lLHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPWl8fFMuZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz10LHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1vfHwoUy5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPWV0LnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBlJiZlLmdldD9lLmdldCh0aGlzKTpldC5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj1ldC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPXQ9Uy5lYXNpbmdbdGhpcy5lYXNpbmddKGUsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9dD1lLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0K3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLG4mJm4uc2V0P24uc2V0KHRoaXMpOmV0LnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319KS5pbml0LnByb3RvdHlwZT1ldC5wcm90b3R5cGUsKGV0LnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gMSE9PWUuZWxlbS5ub2RlVHlwZXx8bnVsbCE9ZS5lbGVtW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtlLnByb3BdP2UuZWxlbVtlLnByb3BdOih0PVMuY3NzKGUuZWxlbSxlLnByb3AsIiIpKSYmImF1dG8iIT09dD90OjB9LHNldDpmdW5jdGlvbihlKXtTLmZ4LnN0ZXBbZS5wcm9wXT9TLmZ4LnN0ZXBbZS5wcm9wXShlKToxIT09ZS5lbGVtLm5vZGVUeXBlfHwhUy5jc3NIb29rc1tlLnByb3BdJiZudWxsPT1lLmVsZW0uc3R5bGVbWGUoZS5wcm9wKV0/ZS5lbGVtW2UucHJvcF09ZS5ub3c6Uy5zdHlsZShlLmVsZW0sZS5wcm9wLGUubm93K2UudW5pdCl9fX0pLnNjcm9sbFRvcD1ldC5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSxTLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxzd2luZzpmdW5jdGlvbihlKXtyZXR1cm4uNS1NYXRoLmNvcyhlKk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LFMuZng9ZXQucHJvdG90eXBlLmluaXQsUy5meC5zdGVwPXt9O3ZhciB0dCxudCxydCxpdCxvdD0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sYXQ9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBzdCgpe250JiYoITE9PT1FLmhpZGRlbiYmQy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/Qy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3QpOkMuc2V0VGltZW91dChzdCxTLmZ4LmludGVydmFsKSxTLmZ4LnRpY2soKSl9ZnVuY3Rpb24gdXQoKXtyZXR1cm4gQy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHQ9dm9pZCAwfSksdHQ9RGF0ZS5ub3coKX1mdW5jdGlvbiBsdChlLHQpe3ZhciBuLHI9MCxpPXtoZWlnaHQ6ZX07Zm9yKHQ9dD8xOjA7cjw0O3IrPTItdClpWyJtYXJnaW4iKyhuPW5lW3JdKV09aVsicGFkZGluZyIrbl09ZTtyZXR1cm4gdCYmKGkub3BhY2l0eT1pLndpZHRoPWUpLGl9ZnVuY3Rpb24gY3QoZSx0LG4pe2Zvcih2YXIgcixpPShmdC50d2VlbmVyc1t0XXx8W10pLmNvbmNhdChmdC50d2VlbmVyc1siKiJdKSxvPTAsYT1pLmxlbmd0aDtvPGE7bysrKWlmKHI9aVtvXS5jYWxsKG4sdCxlKSlyZXR1cm4gcn1mdW5jdGlvbiBmdChvLGUsdCl7dmFyIG4sYSxyPTAsaT1mdC5wcmVmaWx0ZXJzLmxlbmd0aCxzPVMuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKGEpcmV0dXJuITE7Zm9yKHZhciBlPXR0fHx1dCgpLHQ9TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLWUpLG49MS0odC9sLmR1cmF0aW9ufHwwKSxyPTAsaT1sLnR3ZWVucy5sZW5ndGg7cjxpO3IrKylsLnR3ZWVuc1tyXS5ydW4obik7cmV0dXJuIHMubm90aWZ5V2l0aChvLFtsLG4sdF0pLG48MSYmaT90OihpfHxzLm5vdGlmeVdpdGgobyxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKG8sW2xdKSwhMSl9LGw9cy5wcm9taXNlKHtlbGVtOm8scHJvcHM6Uy5leHRlbmQoe30sZSksb3B0czpTLmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6Uy5lYXNpbmcuX2RlZmF1bHR9LHQpLG9yaWdpbmFsUHJvcGVydGllczplLG9yaWdpbmFsT3B0aW9uczp0LHN0YXJ0VGltZTp0dHx8dXQoKSxkdXJhdGlvbjp0LmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihlLHQpe3ZhciBuPVMuVHdlZW4obyxsLm9wdHMsZSx0LGwub3B0cy5zcGVjaWFsRWFzaW5nW2VdfHxsLm9wdHMuZWFzaW5nKTtyZXR1cm4gbC50d2VlbnMucHVzaChuKSxufSxzdG9wOmZ1bmN0aW9uKGUpe3ZhciB0PTAsbj1lP2wudHdlZW5zLmxlbmd0aDowO2lmKGEpcmV0dXJuIHRoaXM7Zm9yKGE9ITA7dDxuO3QrKylsLnR3ZWVuc1t0XS5ydW4oMSk7cmV0dXJuIGU/KHMubm90aWZ5V2l0aChvLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgobyxbbCxlXSkpOnMucmVqZWN0V2l0aChvLFtsLGVdKSx0aGlzfX0pLGM9bC5wcm9wcztmb3IoIWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYTtmb3IobiBpbiBlKWlmKGk9dFtyPVgobildLG89ZVtuXSxBcnJheS5pc0FycmF5KG8pJiYoaT1vWzFdLG89ZVtuXT1vWzBdKSxuIT09ciYmKGVbcl09byxkZWxldGUgZVtuXSksKGE9Uy5jc3NIb29rc1tyXSkmJiJleHBhbmQiaW4gYSlmb3IobiBpbiBvPWEuZXhwYW5kKG8pLGRlbGV0ZSBlW3JdLG8pbiBpbiBlfHwoZVtuXT1vW25dLHRbbl09aSk7ZWxzZSB0W3JdPWl9KGMsbC5vcHRzLnNwZWNpYWxFYXNpbmcpO3I8aTtyKyspaWYobj1mdC5wcmVmaWx0ZXJzW3JdLmNhbGwobCxvLGMsbC5vcHRzKSlyZXR1cm4gbShuLnN0b3ApJiYoUy5fcXVldWVIb29rcyhsLmVsZW0sbC5vcHRzLnF1ZXVlKS5zdG9wPW4uc3RvcC5iaW5kKG4pKSxuO3JldHVybiBTLm1hcChjLGN0LGwpLG0obC5vcHRzLnN0YXJ0KSYmbC5vcHRzLnN0YXJ0LmNhbGwobyxsKSxsLnByb2dyZXNzKGwub3B0cy5wcm9ncmVzcykuZG9uZShsLm9wdHMuZG9uZSxsLm9wdHMuY29tcGxldGUpLmZhaWwobC5vcHRzLmZhaWwpLmFsd2F5cyhsLm9wdHMuYWx3YXlzKSxTLmZ4LnRpbWVyKFMuZXh0ZW5kKHUse2VsZW06byxhbmltOmwscXVldWU6bC5vcHRzLnF1ZXVlfSkpLGx9Uy5BbmltYXRpb249Uy5leHRlbmQoZnQse3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpO3JldHVybiBzZShuLmVsZW0sZSx0ZS5leGVjKHQpLG4pLG59XX0sdHdlZW5lcjpmdW5jdGlvbihlLHQpe20oZSk/KHQ9ZSxlPVsiKiJdKTplPWUubWF0Y2goUCk7Zm9yKHZhciBuLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspbj1lW3JdLGZ0LnR3ZWVuZXJzW25dPWZ0LnR3ZWVuZXJzW25dfHxbXSxmdC50d2VlbmVyc1tuXS51bnNoaWZ0KHQpfSxwcmVmaWx0ZXJzOltmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYyxmPSJ3aWR0aCJpbiB0fHwiaGVpZ2h0ImluIHQscD10aGlzLGQ9e30saD1lLnN0eWxlLGc9ZS5ub2RlVHlwZSYmYWUoZSksdj1ZLmdldChlLCJmeHNob3ciKTtmb3IociBpbiBuLnF1ZXVlfHwobnVsbD09KGE9Uy5fcXVldWVIb29rcyhlLCJmeCIpKS51bnF1ZXVlZCYmKGEudW5xdWV1ZWQ9MCxzPWEuZW1wdHkuZmlyZSxhLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXthLnVucXVldWVkfHxzKCl9KSxhLnVucXVldWVkKysscC5hbHdheXMoZnVuY3Rpb24oKXtwLmFsd2F5cyhmdW5jdGlvbigpe2EudW5xdWV1ZWQtLSxTLnF1ZXVlKGUsImZ4IikubGVuZ3RofHxhLmVtcHR5LmZpcmUoKX0pfSkpLHQpaWYoaT10W3JdLG90LnRlc3QoaSkpe2lmKGRlbGV0ZSB0W3JdLG89b3x8InRvZ2dsZSI9PT1pLGk9PT0oZz8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09aXx8IXZ8fHZvaWQgMD09PXZbcl0pY29udGludWU7Zz0hMH1kW3JdPXYmJnZbcl18fFMuc3R5bGUoZSxyKX1pZigodT0hUy5pc0VtcHR5T2JqZWN0KHQpKXx8IVMuaXNFbXB0eU9iamVjdChkKSlmb3IociBpbiBmJiYxPT09ZS5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2gub3ZlcmZsb3csaC5vdmVyZmxvd1gsaC5vdmVyZmxvd1ldLG51bGw9PShsPXYmJnYuZGlzcGxheSkmJihsPVkuZ2V0KGUsImRpc3BsYXkiKSksIm5vbmUiPT09KGM9Uy5jc3MoZSwiZGlzcGxheSIpKSYmKGw/Yz1sOihsZShbZV0sITApLGw9ZS5zdHlsZS5kaXNwbGF5fHxsLGM9Uy5jc3MoZSwiZGlzcGxheSIpLGxlKFtlXSkpKSwoImlubGluZSI9PT1jfHwiaW5saW5lLWJsb2NrIj09PWMmJm51bGwhPWwpJiYibm9uZSI9PT1TLmNzcyhlLCJmbG9hdCIpJiYodXx8KHAuZG9uZShmdW5jdGlvbigpe2guZGlzcGxheT1sfSksbnVsbD09bCYmKGM9aC5kaXNwbGF5LGw9Im5vbmUiPT09Yz8iIjpjKSksaC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKGgub3ZlcmZsb3c9ImhpZGRlbiIscC5hbHdheXMoZnVuY3Rpb24oKXtoLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0saC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxoLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITEsZCl1fHwodj8iaGlkZGVuImluIHYmJihnPXYuaGlkZGVuKTp2PVkuYWNjZXNzKGUsImZ4c2hvdyIse2Rpc3BsYXk6bH0pLG8mJih2LmhpZGRlbj0hZyksZyYmbGUoW2VdLCEwKSxwLmRvbmUoZnVuY3Rpb24oKXtmb3IociBpbiBnfHxsZShbZV0pLFkucmVtb3ZlKGUsImZ4c2hvdyIpLGQpUy5zdHlsZShlLHIsZFtyXSl9KSksdT1jdChnP3Zbcl06MCxyLHApLHIgaW4gdnx8KHZbcl09dS5zdGFydCxnJiYodS5lbmQ9dS5zdGFydCx1LnN0YXJ0PTApKX1dLHByZWZpbHRlcjpmdW5jdGlvbihlLHQpe3Q/ZnQucHJlZmlsdGVycy51bnNoaWZ0KGUpOmZ0LnByZWZpbHRlcnMucHVzaChlKX19KSxTLnNwZWVkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lJiYib2JqZWN0Ij09dHlwZW9mIGU/Uy5leHRlbmQoe30sZSk6e2NvbXBsZXRlOm58fCFuJiZ0fHxtKGUpJiZlLGR1cmF0aW9uOmUsZWFzaW5nOm4mJnR8fHQmJiFtKHQpJiZ0fTtyZXR1cm4gUy5meC5vZmY/ci5kdXJhdGlvbj0wOiJudW1iZXIiIT10eXBlb2Ygci5kdXJhdGlvbiYmKHIuZHVyYXRpb24gaW4gUy5meC5zcGVlZHM/ci5kdXJhdGlvbj1TLmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTpyLmR1cmF0aW9uPVMuZnguc3BlZWRzLl9kZWZhdWx0KSxudWxsIT1yLnF1ZXVlJiYhMCE9PXIucXVldWV8fChyLnF1ZXVlPSJmeCIpLHIub2xkPXIuY29tcGxldGUsci5jb21wbGV0ZT1mdW5jdGlvbigpe20oci5vbGQpJiZyLm9sZC5jYWxsKHRoaXMpLHIucXVldWUmJlMuZGVxdWV1ZSh0aGlzLHIucXVldWUpfSxyfSxTLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLmZpbHRlcihhZSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTp0fSxlLG4scil9LGFuaW1hdGU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9Uy5pc0VtcHR5T2JqZWN0KHQpLG89Uy5zcGVlZChlLG4sciksYT1mdW5jdGlvbigpe3ZhciBlPWZ0KHRoaXMsUy5leHRlbmQoe30sdCksbyk7KGl8fFkuZ2V0KHRoaXMsImZpbmlzaCIpKSYmZS5zdG9wKCEwKX07cmV0dXJuIGEuZmluaXNoPWEsaXx8ITE9PT1vLnF1ZXVlP3RoaXMuZWFjaChhKTp0aGlzLnF1ZXVlKG8ucXVldWUsYSl9LHN0b3A6ZnVuY3Rpb24oaSxlLG8pe3ZhciBhPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RvcDtkZWxldGUgZS5zdG9wLHQobyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgaSYmKG89ZSxlPWksaT12b2lkIDApLGUmJnRoaXMucXVldWUoaXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9ITAsdD1udWxsIT1pJiZpKyJxdWV1ZUhvb2tzIixuPVMudGltZXJzLHI9WS5nZXQodGhpcyk7aWYodClyW3RdJiZyW3RdLnN0b3AmJmEoclt0XSk7ZWxzZSBmb3IodCBpbiByKXJbdF0mJnJbdF0uc3RvcCYmYXQudGVzdCh0KSYmYShyW3RdKTtmb3IodD1uLmxlbmd0aDt0LS07KW5bdF0uZWxlbSE9PXRoaXN8fG51bGwhPWkmJm5bdF0ucXVldWUhPT1pfHwoblt0XS5hbmltLnN0b3AobyksZT0hMSxuLnNwbGljZSh0LDEpKTshZSYmb3x8Uy5kZXF1ZXVlKHRoaXMsaSl9KX0sZmluaXNoOmZ1bmN0aW9uKGEpe3JldHVybiExIT09YSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsdD1ZLmdldCh0aGlzKSxuPXRbYSsicXVldWUiXSxyPXRbYSsicXVldWVIb29rcyJdLGk9Uy50aW1lcnMsbz1uP24ubGVuZ3RoOjA7Zm9yKHQuZmluaXNoPSEwLFMucXVldWUodGhpcyxhLFtdKSxyJiZyLnN0b3AmJnIuc3RvcC5jYWxsKHRoaXMsITApLGU9aS5sZW5ndGg7ZS0tOylpW2VdLmVsZW09PT10aGlzJiZpW2VdLnF1ZXVlPT09YSYmKGlbZV0uYW5pbS5zdG9wKCEwKSxpLnNwbGljZShlLDEpKTtmb3IoZT0wO2U8bztlKyspbltlXSYmbltlXS5maW5pc2gmJm5bZV0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIHQuZmluaXNofSl9fSksUy5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHIpe3ZhciBpPVMuZm5bcl07Uy5mbltyXT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09dHlwZW9mIGU/aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGx0KHIsITApLGUsdCxuKX19KSxTLmVhY2goe3NsaWRlRG93bjpsdCgic2hvdyIpLHNsaWRlVXA6bHQoImhpZGUiKSxzbGlkZVRvZ2dsZTpsdCgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHIpe1MuZm5bZV09ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmFuaW1hdGUocixlLHQsbil9fSksUy50aW1lcnM9W10sUy5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsdD0wLG49Uy50aW1lcnM7Zm9yKHR0PURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8Uy5meC5zdG9wKCksdHQ9dm9pZCAwfSxTLmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe1MudGltZXJzLnB1c2goZSksUy5meC5zdGFydCgpfSxTLmZ4LmludGVydmFsPTEzLFMuZnguc3RhcnQ9ZnVuY3Rpb24oKXtudHx8KG50PSEwLHN0KCkpfSxTLmZ4LnN0b3A9ZnVuY3Rpb24oKXtudD1udWxsfSxTLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxTLmZuLmRlbGF5PWZ1bmN0aW9uKHIsZSl7cmV0dXJuIHI9Uy5meCYmUy5meC5zcGVlZHNbcl18fHIsZT1lfHwiZngiLHRoaXMucXVldWUoZSxmdW5jdGlvbihlLHQpe3ZhciBuPUMuc2V0VGltZW91dChlLHIpO3Quc3RvcD1mdW5jdGlvbigpe0MuY2xlYXJUaW1lb3V0KG4pfX0pfSxydD1FLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksaXQ9RS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChFLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxydC50eXBlPSJjaGVja2JveCIseS5jaGVja09uPSIiIT09cnQudmFsdWUseS5vcHRTZWxlY3RlZD1pdC5zZWxlY3RlZCwocnQ9RS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS52YWx1ZT0idCIscnQudHlwZT0icmFkaW8iLHkucmFkaW9WYWx1ZT0idCI9PT1ydC52YWx1ZTt2YXIgcHQsZHQ9Uy5leHByLmF0dHJIYW5kbGU7Uy5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJCh0aGlzLFMuYXR0cixlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5yZW1vdmVBdHRyKHRoaXMsZSl9KX19KSxTLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGUuZ2V0QXR0cmlidXRlP1MucHJvcChlLHQsbik6KDE9PT1vJiZTLmlzWE1MRG9jKGUpfHwoaT1TLmF0dHJIb29rc1t0LnRvTG93ZXJDYXNlKCldfHwoUy5leHByLm1hdGNoLmJvb2wudGVzdCh0KT9wdDp2b2lkIDApKSx2b2lkIDAhPT1uP251bGw9PT1uP3ZvaWQgUy5yZW1vdmVBdHRyKGUsdCk6aSYmInNldCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6KGUuc2V0QXR0cmlidXRlKHQsbisiIiksbik6aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjpudWxsPT0ocj1TLmZpbmQuYXR0cihlLHQpKT92b2lkIDA6cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIXkucmFkaW9WYWx1ZSYmInJhZGlvIj09PXQmJkEoZSwiaW5wdXQiKSl7dmFyIG49ZS52YWx1ZTtyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoInR5cGUiLHQpLG4mJihlLnZhbHVlPW4pLHR9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10JiZ0Lm1hdGNoKFApO2lmKGkmJjE9PT1lLm5vZGVUeXBlKXdoaWxlKG49aVtyKytdKWUucmVtb3ZlQXR0cmlidXRlKG4pfX0pLHB0PXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExPT09dD9TLnJlbW92ZUF0dHIoZSxuKTplLnNldEF0dHJpYnV0ZShuLG4pLG59fSxTLmVhY2goUy5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24oZSx0KXt2YXIgYT1kdFt0XXx8Uy5maW5kLmF0dHI7ZHRbdF09ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz10LnRvTG93ZXJDYXNlKCk7cmV0dXJuIG58fChpPWR0W29dLGR0W29dPXIscj1udWxsIT1hKGUsdCxuKT9vOm51bGwsZHRbb109aSkscn19KTt2YXIgaHQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxndD0vXig/OmF8YXJlYSkkL2k7ZnVuY3Rpb24gdnQoZSl7cmV0dXJuKGUubWF0Y2goUCl8fFtdKS5qb2luKCIgIil9ZnVuY3Rpb24geXQoZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24gbXQoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZToic3RyaW5nIj09dHlwZW9mIGUmJmUubWF0Y2goUCl8fFtdfVMuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJuICQodGhpcyxTLnByb3AsZSx0LDE8YXJndW1lbnRzLmxlbmd0aCl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW1MucHJvcEZpeFtlXXx8ZV19KX19KSxTLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4gMT09PW8mJlMuaXNYTUxEb2MoZSl8fCh0PVMucHJvcEZpeFt0XXx8dCxpPVMucHJvcEhvb2tzW3RdKSx2b2lkIDAhPT1uP2kmJiJzZXQiaW4gaSYmdm9pZCAwIT09KHI9aS5zZXQoZSxuLHQpKT9yOmVbdF09bjppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOmVbdF19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXt2YXIgdD1TLmZpbmQuYXR0cihlLCJ0YWJpbmRleCIpO3JldHVybiB0P3BhcnNlSW50KHQsMTApOmh0LnRlc3QoZS5ub2RlTmFtZSl8fGd0LnRlc3QoZS5ub2RlTmFtZSkmJmUuaHJlZj8wOi0xfX19LHByb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifX0pLHkub3B0U2VsZWN0ZWR8fChTLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfSxzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3QmJih0LnNlbGVjdGVkSW5kZXgsdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCl9fSksUy5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtTLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSksUy5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8sYSxzLHU9MDtpZihtKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS5hZGRDbGFzcyh0LmNhbGwodGhpcyxlLHl0KHRoaXMpKSl9KTtpZigoZT1tdCh0KSkubGVuZ3RoKXdoaWxlKG49dGhpc1t1KytdKWlmKGk9eXQobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK3Z0KGkpKyIgIil7YT0wO3doaWxlKG89ZVthKytdKXIuaW5kZXhPZigiICIrbysiICIpPDAmJihyKz1vKyIgIik7aSE9PShzPXZ0KHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLnJlbW92ZUNsYXNzKHQuY2FsbCh0aGlzLGUseXQodGhpcykpKX0pO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmF0dHIoImNsYXNzIiwiIik7aWYoKGU9bXQodCkpLmxlbmd0aCl3aGlsZShuPXRoaXNbdSsrXSlpZihpPXl0KG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit2dChpKSsiICIpe2E9MDt3aGlsZShvPWVbYSsrXSl3aGlsZSgtMTxyLmluZGV4T2YoIiAiK28rIiAiKSlyPXIucmVwbGFjZSgiICIrbysiICIsIiAiKTtpIT09KHM9dnQocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihpLHQpe3ZhciBvPXR5cGVvZiBpLGE9InN0cmluZyI9PT1vfHxBcnJheS5pc0FycmF5KGkpO3JldHVybiJib29sZWFuIj09dHlwZW9mIHQmJmE/dD90aGlzLmFkZENsYXNzKGkpOnRoaXMucmVtb3ZlQ2xhc3MoaSk6bShpKT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS50b2dnbGVDbGFzcyhpLmNhbGwodGhpcyxlLHl0KHRoaXMpLHQpLHQpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI7aWYoYSl7dD0wLG49Uyh0aGlzKSxyPW10KGkpO3doaWxlKGU9clt0KytdKW4uaGFzQ2xhc3MoZSk/bi5yZW1vdmVDbGFzcyhlKTpuLmFkZENsYXNzKGUpfWVsc2Ugdm9pZCAwIT09aSYmImJvb2xlYW4iIT09b3x8KChlPXl0KHRoaXMpKSYmWS5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsZSksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsZXx8ITE9PT1pPyIiOlkuZ2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpKX0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHI9MDt0PSIgIitlKyIgIjt3aGlsZShuPXRoaXNbcisrXSlpZigxPT09bi5ub2RlVHlwZSYmLTE8KCIgIit2dCh5dChuKSkrIiAiKS5pbmRleE9mKHQpKXJldHVybiEwO3JldHVybiExfX0pO3ZhciB4dD0vXHIvZztTLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKG4pe3ZhciByLGUsaSx0PXRoaXNbMF07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bShuKSx0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIHQ7MT09PXRoaXMubm9kZVR5cGUmJihudWxsPT0odD1pP24uY2FsbCh0aGlzLGUsUyh0aGlzKS52YWwoKSk6bik/dD0iIjoibnVtYmVyIj09dHlwZW9mIHQ/dCs9IiI6QXJyYXkuaXNBcnJheSh0KSYmKHQ9Uy5tYXAodCxmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjplKyIifSkpLChyPVMudmFsSG9va3NbdGhpcy50eXBlXXx8Uy52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmInNldCJpbiByJiZ2b2lkIDAhPT1yLnNldCh0aGlzLHQsInZhbHVlIil8fCh0aGlzLnZhbHVlPXQpKX0pKTp0PyhyPVMudmFsSG9va3NbdC50eXBlXXx8Uy52YWxIb29rc1t0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiByJiZ2b2lkIDAhPT0oZT1yLmdldCh0LCJ2YWx1ZSIpKT9lOiJzdHJpbmciPT10eXBlb2YoZT10LnZhbHVlKT9lLnJlcGxhY2UoeHQsIiIpOm51bGw9PWU/IiI6ZTp2b2lkIDB9fSksUy5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD1TLmZpbmQuYXR0cihlLCJ2YWx1ZSIpO3JldHVybiBudWxsIT10P3Q6dnQoUy50ZXh0KGUpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPWUub3B0aW9ucyxvPWUuc2VsZWN0ZWRJbmRleCxhPSJzZWxlY3Qtb25lIj09PWUudHlwZSxzPWE/bnVsbDpbXSx1PWE/bysxOmkubGVuZ3RoO2ZvcihyPW88MD91OmE/bzowO3I8dTtyKyspaWYoKChuPWlbcl0pLnNlbGVjdGVkfHxyPT09bykmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IUEobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD1TKG4pLnZhbCgpLGEpcmV0dXJuIHQ7cy5wdXNoKHQpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89Uy5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pKChyPWlbYV0pLnNlbGVjdGVkPS0xPFMuaW5BcnJheShTLnZhbEhvb2tzLm9wdGlvbi5nZXQociksbykpJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX19KSxTLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtTLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBlLmNoZWNrZWQ9LTE8Uy5pbkFycmF5KFMoZSkudmFsKCksdCl9fSx5LmNoZWNrT258fChTLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSkseS5mb2N1c2luPSJvbmZvY3VzaW4iaW4gQzt2YXIgYnQ9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLHd0PWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9O1MuZXh0ZW5kKFMuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsLGMsZixwPVtufHxFXSxkPXYuY2FsbChlLCJ0eXBlIik/ZS50eXBlOmUsaD12LmNhbGwoZSwibmFtZXNwYWNlIik/ZS5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihvPWY9YT1uPW58fEUsMyE9PW4ubm9kZVR5cGUmJjghPT1uLm5vZGVUeXBlJiYhYnQudGVzdChkK1MuZXZlbnQudHJpZ2dlcmVkKSYmKC0xPGQuaW5kZXhPZigiLiIpJiYoZD0oaD1kLnNwbGl0KCIuIikpLnNoaWZ0KCksaC5zb3J0KCkpLHU9ZC5pbmRleE9mKCI6Iik8MCYmIm9uIitkLChlPWVbUy5leHBhbmRvXT9lOm5ldyBTLkV2ZW50KGQsIm9iamVjdCI9PXR5cGVvZiBlJiZlKSkuaXNUcmlnZ2VyPXI/MjozLGUubmFtZXNwYWNlPWguam9pbigiLiIpLGUucm5hbWVzcGFjZT1lLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsZS5yZXN1bHQ9dm9pZCAwLGUudGFyZ2V0fHwoZS50YXJnZXQ9biksdD1udWxsPT10P1tlXTpTLm1ha2VBcnJheSh0LFtlXSksYz1TLmV2ZW50LnNwZWNpYWxbZF18fHt9LHJ8fCFjLnRyaWdnZXJ8fCExIT09Yy50cmlnZ2VyLmFwcGx5KG4sdCkpKXtpZighciYmIWMubm9CdWJibGUmJiF4KG4pKXtmb3Iocz1jLmRlbGVnYXRlVHlwZXx8ZCxidC50ZXN0KHMrZCl8fChvPW8ucGFyZW50Tm9kZSk7bztvPW8ucGFyZW50Tm9kZSlwLnB1c2gobyksYT1vO2E9PT0obi5vd25lckRvY3VtZW50fHxFKSYmcC5wdXNoKGEuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93fHxDKX1pPTA7d2hpbGUoKG89cFtpKytdKSYmIWUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlmPW8sZS50eXBlPTE8aT9zOmMuYmluZFR5cGV8fGQsKGw9KFkuZ2V0KG8sImV2ZW50cyIpfHxPYmplY3QuY3JlYXRlKG51bGwpKVtlLnR5cGVdJiZZLmdldChvLCJoYW5kbGUiKSkmJmwuYXBwbHkobyx0KSwobD11JiZvW3VdKSYmbC5hcHBseSYmVihvKSYmKGUucmVzdWx0PWwuYXBwbHkobyx0KSwhMT09PWUucmVzdWx0JiZlLnByZXZlbnREZWZhdWx0KCkpO3JldHVybiBlLnR5cGU9ZCxyfHxlLmlzRGVmYXVsdFByZXZlbnRlZCgpfHxjLl9kZWZhdWx0JiYhMSE9PWMuX2RlZmF1bHQuYXBwbHkocC5wb3AoKSx0KXx8IVYobil8fHUmJm0obltkXSkmJiF4KG4pJiYoKGE9blt1XSkmJihuW3VdPW51bGwpLFMuZXZlbnQudHJpZ2dlcmVkPWQsZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmLmFkZEV2ZW50TGlzdGVuZXIoZCx3dCksbltkXSgpLGUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmZi5yZW1vdmVFdmVudExpc3RlbmVyKGQsd3QpLFMuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxhJiYoblt1XT1hKSksZS5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9Uy5leHRlbmQobmV3IFMuRXZlbnQsbix7dHlwZTplLGlzU2ltdWxhdGVkOiEwfSk7Uy5ldmVudC50cmlnZ2VyKHIsbnVsbCx0KX19KSxTLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LnRyaWdnZXIoZSx0LHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpc1swXTtpZihuKXJldHVybiBTLmV2ZW50LnRyaWdnZXIoZSx0LG4sITApfX0pLHkuZm9jdXNpbnx8Uy5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihuLHIpe3ZhciBpPWZ1bmN0aW9uKGUpe1MuZXZlbnQuc2ltdWxhdGUocixlLnRhcmdldCxTLmV2ZW50LmZpeChlKSl9O1MuZXZlbnQuc3BlY2lhbFtyXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jdW1lbnR8fHRoaXMsdD1ZLmFjY2VzcyhlLHIpO3R8fGUuYWRkRXZlbnRMaXN0ZW5lcihuLGksITApLFkuYWNjZXNzKGUsciwodHx8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLmRvY3VtZW50fHx0aGlzLHQ9WS5hY2Nlc3MoZSxyKS0xO3Q/WS5hY2Nlc3MoZSxyLHQpOihlLnJlbW92ZUV2ZW50TGlzdGVuZXIobixpLCEwKSxZLnJlbW92ZShlLHIpKX19fSk7dmFyIFR0PUMubG9jYXRpb24sQ3Q9e2d1aWQ6RGF0ZS5ub3coKX0sRXQ9L1w/LztTLnBhcnNlWE1MPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7dHJ5e3Q9KG5ldyBDLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGUsInRleHQveG1sIil9Y2F0Y2goZSl7dD12b2lkIDB9cmV0dXJuIHQmJiF0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8Uy5lcnJvcigiSW52YWxpZCBYTUw6ICIrZSksdH07dmFyIFN0PS9cW1xdJC8sa3Q9L1xyP1xuL2csQXQ9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLE50PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBEdChuLGUscixpKXt2YXIgdDtpZihBcnJheS5pc0FycmF5KGUpKVMuZWFjaChlLGZ1bmN0aW9uKGUsdCl7cnx8U3QudGVzdChuKT9pKG4sdCk6RHQobisiWyIrKCJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9dD9lOiIiKSsiXSIsdCxyLGkpfSk7ZWxzZSBpZihyfHwib2JqZWN0IiE9PXcoZSkpaShuLGUpO2Vsc2UgZm9yKHQgaW4gZSlEdChuKyJbIit0KyJdIixlW3RdLHIsaSl9Uy5wYXJhbT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1mdW5jdGlvbihlLHQpe3ZhciBuPW0odCk/dCgpOnQ7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYobnVsbD09ZSlyZXR1cm4iIjtpZihBcnJheS5pc0FycmF5KGUpfHxlLmpxdWVyeSYmIVMuaXNQbGFpbk9iamVjdChlKSlTLmVhY2goZSxmdW5jdGlvbigpe2kodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IobiBpbiBlKUR0KG4sZVtuXSx0LGkpO3JldHVybiByLmpvaW4oIiYiKX0sUy5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBTLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9Uy5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGU/Uy5tYWtlQXJyYXkoZSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhUyh0aGlzKS5pcygiOmRpc2FibGVkIikmJk50LnRlc3QodGhpcy5ub2RlTmFtZSkmJiFBdC50ZXN0KGUpJiYodGhpcy5jaGVja2VkfHwhcGUudGVzdChlKSl9KS5tYXAoZnVuY3Rpb24oZSx0KXt2YXIgbj1TKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6QXJyYXkuaXNBcnJheShuKT9TLm1hcChuLGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2Uoa3QsIlxyXG4iKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKGt0LCJcclxuIil9fSkuZ2V0KCl9fSk7dmFyIGp0PS8lMjAvZyxxdD0vIy4qJC8sTHQ9LyhbPyZdKV89W14mXSovLEh0PS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKSQvZ20sT3Q9L14oPzpHRVR8SEVBRCkkLyxQdD0vXlwvXC8vLFJ0PXt9LE10PXt9LEl0PSIqLyIuY29uY2F0KCIqIiksV3Q9RS5jcmVhdGVFbGVtZW50KCJhIik7ZnVuY3Rpb24gRnQobyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7InN0cmluZyIhPXR5cGVvZiBlJiYodD1lLGU9IioiKTt2YXIgbixyPTAsaT1lLnRvTG93ZXJDYXNlKCkubWF0Y2goUCl8fFtdO2lmKG0odCkpd2hpbGUobj1pW3IrK10pIisiPT09blswXT8obj1uLnNsaWNlKDEpfHwiKiIsKG9bbl09b1tuXXx8W10pLnVuc2hpZnQodCkpOihvW25dPW9bbl18fFtdKS5wdXNoKHQpfX1mdW5jdGlvbiBCdCh0LGksbyxhKXt2YXIgcz17fSx1PXQ9PT1NdDtmdW5jdGlvbiBsKGUpe3ZhciByO3JldHVybiBzW2VdPSEwLFMuZWFjaCh0W2VdfHxbXSxmdW5jdGlvbihlLHQpe3ZhciBuPXQoaSxvLGEpO3JldHVybiJzdHJpbmciIT10eXBlb2Ygbnx8dXx8c1tuXT91PyEocj1uKTp2b2lkIDA6KGkuZGF0YVR5cGVzLnVuc2hpZnQobiksbChuKSwhMSl9KSxyfXJldHVybiBsKGkuZGF0YVR5cGVzWzBdKXx8IXNbIioiXSYmbCgiKiIpfWZ1bmN0aW9uICR0KGUsdCl7dmFyIG4scixpPVMuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiB0KXZvaWQgMCE9PXRbbl0mJigoaVtuXT9lOnJ8fChyPXt9KSlbbl09dFtuXSk7cmV0dXJuIHImJlMuZXh0ZW5kKCEwLGUsciksZX1XdC5ocmVmPVR0LmhyZWYsUy5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOlR0LmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOi9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLnRlc3QoVHQucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6SXQsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOlMucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0PyR0KCR0KGUsUy5hamF4U2V0dGluZ3MpLHQpOiR0KFMuYWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOkZ0KFJ0KSxhamF4VHJhbnNwb3J0OkZ0KE10KSxhamF4OmZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBlJiYodD1lLGU9dm9pZCAwKSx0PXR8fHt9O3ZhciBjLGYscCxuLGQscixoLGcsaSxvLHY9Uy5hamF4U2V0dXAoe30sdCkseT12LmNvbnRleHR8fHYsbT12LmNvbnRleHQmJih5Lm5vZGVUeXBlfHx5LmpxdWVyeSk/Uyh5KTpTLmV2ZW50LHg9Uy5EZWZlcnJlZCgpLGI9Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksdz12LnN0YXR1c0NvZGV8fHt9LGE9e30scz17fSx1PSJjYW5jZWxlZCIsVD17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGgpe2lmKCFuKXtuPXt9O3doaWxlKHQ9SHQuZXhlYyhwKSluW3RbMV0udG9Mb3dlckNhc2UoKSsiICJdPShuW3RbMV0udG9Mb3dlckNhc2UoKSsiICJdfHxbXSkuY29uY2F0KHRbMl0pfXQ9bltlLnRvTG93ZXJDYXNlKCkrIiAiXX1yZXR1cm4gbnVsbD09dD9udWxsOnQuam9pbigiLCAiKX0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGg/cDpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWgmJihlPXNbZS50b0xvd2VyQ2FzZSgpXT1zW2UudG9Mb3dlckNhc2UoKV18fGUsYVtlXT10KSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1oJiYodi5taW1lVHlwZT1lKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGUpaWYoaClULmFsd2F5cyhlW1Quc3RhdHVzXSk7ZWxzZSBmb3IodCBpbiBlKXdbdF09W3dbdF0sZVt0XV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGUpe3ZhciB0PWV8fHU7cmV0dXJuIGMmJmMuYWJvcnQodCksbCgwLHQpLHRoaXN9fTtpZih4LnByb21pc2UoVCksdi51cmw9KChlfHx2LnVybHx8VHQuaHJlZikrIiIpLnJlcGxhY2UoUHQsVHQucHJvdG9jb2wrIi8vIiksdi50eXBlPXQubWV0aG9kfHx0LnR5cGV8fHYubWV0aG9kfHx2LnR5cGUsdi5kYXRhVHlwZXM9KHYuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChQKXx8WyIiXSxudWxsPT12LmNyb3NzRG9tYWluKXtyPUUuY3JlYXRlRWxlbWVudCgiYSIpO3RyeXtyLmhyZWY9di51cmwsci5ocmVmPXIuaHJlZix2LmNyb3NzRG9tYWluPVd0LnByb3RvY29sKyIvLyIrV3QuaG9zdCE9ci5wcm90b2NvbCsiLy8iK3IuaG9zdH1jYXRjaChlKXt2LmNyb3NzRG9tYWluPSEwfX1pZih2LmRhdGEmJnYucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2Ygdi5kYXRhJiYodi5kYXRhPVMucGFyYW0odi5kYXRhLHYudHJhZGl0aW9uYWwpKSxCdChSdCx2LHQsVCksaClyZXR1cm4gVDtmb3IoaSBpbihnPVMuZXZlbnQmJnYuZ2xvYmFsKSYmMD09Uy5hY3RpdmUrKyYmUy5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSx2LnR5cGU9di50eXBlLnRvVXBwZXJDYXNlKCksdi5oYXNDb250ZW50PSFPdC50ZXN0KHYudHlwZSksZj12LnVybC5yZXBsYWNlKHF0LCIiKSx2Lmhhc0NvbnRlbnQ/di5kYXRhJiZ2LnByb2Nlc3NEYXRhJiYwPT09KHYuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmKHYuZGF0YT12LmRhdGEucmVwbGFjZShqdCwiKyIpKToobz12LnVybC5zbGljZShmLmxlbmd0aCksdi5kYXRhJiYodi5wcm9jZXNzRGF0YXx8InN0cmluZyI9PXR5cGVvZiB2LmRhdGEpJiYoZis9KEV0LnRlc3QoZik/IiYiOiI/Iikrdi5kYXRhLGRlbGV0ZSB2LmRhdGEpLCExPT09di5jYWNoZSYmKGY9Zi5yZXBsYWNlKEx0LCIkMSIpLG89KEV0LnRlc3QoZik/IiYiOiI/IikrIl89IitDdC5ndWlkKysrbyksdi51cmw9ZitvKSx2LmlmTW9kaWZpZWQmJihTLmxhc3RNb2RpZmllZFtmXSYmVC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsUy5sYXN0TW9kaWZpZWRbZl0pLFMuZXRhZ1tmXSYmVC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixTLmV0YWdbZl0pKSwodi5kYXRhJiZ2Lmhhc0NvbnRlbnQmJiExIT09di5jb250ZW50VHlwZXx8dC5jb250ZW50VHlwZSkmJlQuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIix2LmNvbnRlbnRUeXBlKSxULnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsdi5kYXRhVHlwZXNbMF0mJnYuYWNjZXB0c1t2LmRhdGFUeXBlc1swXV0/di5hY2NlcHRzW3YuZGF0YVR5cGVzWzBdXSsoIioiIT09di5kYXRhVHlwZXNbMF0/IiwgIitJdCsiOyBxPTAuMDEiOiIiKTp2LmFjY2VwdHNbIioiXSksdi5oZWFkZXJzKVQuc2V0UmVxdWVzdEhlYWRlcihpLHYuaGVhZGVyc1tpXSk7aWYodi5iZWZvcmVTZW5kJiYoITE9PT12LmJlZm9yZVNlbmQuY2FsbCh5LFQsdil8fGgpKXJldHVybiBULmFib3J0KCk7aWYodT0iYWJvcnQiLGIuYWRkKHYuY29tcGxldGUpLFQuZG9uZSh2LnN1Y2Nlc3MpLFQuZmFpbCh2LmVycm9yKSxjPUJ0KE10LHYsdCxUKSl7aWYoVC5yZWFkeVN0YXRlPTEsZyYmbS50cmlnZ2VyKCJhamF4U2VuZCIsW1Qsdl0pLGgpcmV0dXJuIFQ7di5hc3luYyYmMDx2LnRpbWVvdXQmJihkPUMuc2V0VGltZW91dChmdW5jdGlvbigpe1QuYWJvcnQoInRpbWVvdXQiKX0sdi50aW1lb3V0KSk7dHJ5e2g9ITEsYy5zZW5kKGEsbCl9Y2F0Y2goZSl7aWYoaCl0aHJvdyBlO2woLTEsZSl9fWVsc2UgbCgtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gbChlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9dDtofHwoaD0hMCxkJiZDLmNsZWFyVGltZW91dChkKSxjPXZvaWQgMCxwPXJ8fCIiLFQucmVhZHlTdGF0ZT0wPGU/NDowLGk9MjAwPD1lJiZlPDMwMHx8MzA0PT09ZSxuJiYocz1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscz1lLmNvbnRlbnRzLHU9ZS5kYXRhVHlwZXM7d2hpbGUoIioiPT09dVswXSl1LnNoaWZ0KCksdm9pZCAwPT09ciYmKHI9ZS5taW1lVHlwZXx8dC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKHIpZm9yKGkgaW4gcylpZihzW2ldJiZzW2ldLnRlc3Qocikpe3UudW5zaGlmdChpKTticmVha31pZih1WzBdaW4gbilvPXVbMF07ZWxzZXtmb3IoaSBpbiBuKXtpZighdVswXXx8ZS5jb252ZXJ0ZXJzW2krIiAiK3VbMF1dKXtvPWk7YnJlYWt9YXx8KGE9aSl9bz1vfHxhfWlmKG8pcmV0dXJuIG8hPT11WzBdJiZ1LnVuc2hpZnQobyksbltvXX0odixULG4pKSwhaSYmLTE8Uy5pbkFycmF5KCJzY3JpcHQiLHYuZGF0YVR5cGVzKSYmKHYuY29udmVydGVyc1sidGV4dCBzY3JpcHQiXT1mdW5jdGlvbigpe30pLHM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPXt9LGM9ZS5kYXRhVHlwZXMuc2xpY2UoKTtpZihjWzFdKWZvcihhIGluIGUuY29udmVydGVycylsW2EudG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW2FdO289Yy5zaGlmdCgpO3doaWxlKG8paWYoZS5yZXNwb25zZUZpZWxkc1tvXSYmKG5bZS5yZXNwb25zZUZpZWxkc1tvXV09dCksIXUmJnImJmUuZGF0YUZpbHRlciYmKHQ9ZS5kYXRhRmlsdGVyKHQsZS5kYXRhVHlwZSkpLHU9byxvPWMuc2hpZnQoKSlpZigiKiI9PT1vKW89dTtlbHNlIGlmKCIqIiE9PXUmJnUhPT1vKXtpZighKGE9bFt1KyIgIitvXXx8bFsiKiAiK29dKSlmb3IoaSBpbiBsKWlmKChzPWkuc3BsaXQoIiAiKSlbMV09PT1vJiYoYT1sW3UrIiAiK3NbMF1dfHxsWyIqICIrc1swXV0pKXshMD09PWE/YT1sW2ldOiEwIT09bFtpXSYmKG89c1swXSxjLnVuc2hpZnQoc1sxXSkpO2JyZWFrfWlmKCEwIT09YSlpZihhJiZlWyJ0aHJvd3MiXSl0PWEodCk7ZWxzZSB0cnl7dD1hKHQpfWNhdGNoKGUpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmE/ZToiTm8gY29udmVyc2lvbiBmcm9tICIrdSsiIHRvICIrb319fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTp0fX0odixzLFQsaSksaT8odi5pZk1vZGlmaWVkJiYoKHU9VC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKSYmKFMubGFzdE1vZGlmaWVkW2ZdPXUpLCh1PVQuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSkmJihTLmV0YWdbZl09dSkpLDIwND09PWV8fCJIRUFEIj09PXYudHlwZT9sPSJub2NvbnRlbnQiOjMwND09PWU/bD0ibm90bW9kaWZpZWQiOihsPXMuc3RhdGUsbz1zLmRhdGEsaT0hKGE9cy5lcnJvcikpKTooYT1sLCFlJiZsfHwobD0iZXJyb3IiLGU8MCYmKGU9MCkpKSxULnN0YXR1cz1lLFQuc3RhdHVzVGV4dD0odHx8bCkrIiIsaT94LnJlc29sdmVXaXRoKHksW28sbCxUXSk6eC5yZWplY3RXaXRoKHksW1QsbCxhXSksVC5zdGF0dXNDb2RlKHcpLHc9dm9pZCAwLGcmJm0udHJpZ2dlcihpPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW1QsdixpP286YV0pLGIuZmlyZVdpdGgoeSxbVCxsXSksZyYmKG0udHJpZ2dlcigiYWpheENvbXBsZXRlIixbVCx2XSksLS1TLmFjdGl2ZXx8Uy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIFR9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBTLmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gUy5nZXQoZSx2b2lkIDAsdCwic2NyaXB0Iil9fSksUy5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsaSl7U1tpXT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbSh0KSYmKHI9cnx8bixuPXQsdD12b2lkIDApLFMuYWpheChTLmV4dGVuZCh7dXJsOmUsdHlwZTppLGRhdGFUeXBlOnIsZGF0YTp0LHN1Y2Nlc3M6bn0sUy5pc1BsYWluT2JqZWN0KGUpJiZlKSl9fSksUy5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUuaGVhZGVycykiY29udGVudC10eXBlIj09PXQudG9Mb3dlckNhc2UoKSYmKGUuY29udGVudFR5cGU9ZS5oZWFkZXJzW3RdfHwiIil9KSxTLl9ldmFsVXJsPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gUy5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKCl7fX0sZGF0YUZpbHRlcjpmdW5jdGlvbihlKXtTLmdsb2JhbEV2YWwoZSx0LG4pfX0pfSxTLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpc1swXSYmKG0oZSkmJihlPWUuY2FsbCh0aGlzWzBdKSksdD1TKGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdEVsZW1lbnRDaGlsZCllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihuKXtyZXR1cm4gbShuKT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS53cmFwSW5uZXIobi5jYWxsKHRoaXMsZSkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Uyh0aGlzKSx0PWUuY29udGVudHMoKTt0Lmxlbmd0aD90LndyYXBBbGwobik6ZS5hcHBlbmQobil9KX0sd3JhcDpmdW5jdGlvbih0KXt2YXIgbj1tKHQpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS53cmFwQWxsKG4/dC5jYWxsKHRoaXMsZSk6dCl9KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7Uyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxTLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIVMuZXhwci5wc2V1ZG9zLnZpc2libGUoZSl9LFMuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuISEoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxTLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBDLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBfdD17MDoyMDAsMTIyMzoyMDR9LHp0PVMuYWpheFNldHRpbmdzLnhocigpO3kuY29ycz0hIXp0JiYid2l0aENyZWRlbnRpYWxzImluIHp0LHkuYWpheD16dD0hIXp0LFMuYWpheFRyYW5zcG9ydChmdW5jdGlvbihpKXt2YXIgbyxhO2lmKHkuY29yc3x8enQmJiFpLmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1pLnhocigpO2lmKHIub3BlbihpLnR5cGUsaS51cmwsaS5hc3luYyxpLnVzZXJuYW1lLGkucGFzc3dvcmQpLGkueGhyRmllbGRzKWZvcihuIGluIGkueGhyRmllbGRzKXJbbl09aS54aHJGaWVsZHNbbl07Zm9yKG4gaW4gaS5taW1lVHlwZSYmci5vdmVycmlkZU1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUoaS5taW1lVHlwZSksaS5jcm9zc0RvbWFpbnx8ZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpLGUpci5zZXRSZXF1ZXN0SGVhZGVyKG4sZVtuXSk7bz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtvJiYobz1hPXIub25sb2FkPXIub25lcnJvcj1yLm9uYWJvcnQ9ci5vbnRpbWVvdXQ9ci5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09ZT9yLmFib3J0KCk6ImVycm9yIj09PWU/Im51bWJlciIhPXR5cGVvZiByLnN0YXR1cz90KDAsImVycm9yIik6dChyLnN0YXR1cyxyLnN0YXR1c1RleHQpOnQoX3Rbci5zdGF0dXNdfHxyLnN0YXR1cyxyLnN0YXR1c1RleHQsInRleHQiIT09KHIucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIHIucmVzcG9uc2VUZXh0P3tiaW5hcnk6ci5yZXNwb25zZX06e3RleHQ6ci5yZXNwb25zZVRleHR9LHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHIub25sb2FkPW8oKSxhPXIub25lcnJvcj1yLm9udGltZW91dD1vKCJlcnJvciIpLHZvaWQgMCE9PXIub25hYm9ydD9yLm9uYWJvcnQ9YTpyLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1yLnJlYWR5U3RhdGUmJkMuc2V0VGltZW91dChmdW5jdGlvbigpe28mJmEoKX0pfSxvPW8oImFib3J0Iik7dHJ5e3Iuc2VuZChpLmhhc0NvbnRlbnQmJmkuZGF0YXx8bnVsbCl9Y2F0Y2goZSl7aWYobyl0aHJvdyBlfX0sYWJvcnQ6ZnVuY3Rpb24oKXtvJiZvKCl9fX0pLFMuYWpheFByZWZpbHRlcihmdW5jdGlvbihlKXtlLmNyb3NzRG9tYWluJiYoZS5jb250ZW50cy5zY3JpcHQ9ITEpfSksUy5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIFMuZ2xvYmFsRXZhbChlKSxlfX19KSxTLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS5jYWNoZSYmKGUuY2FjaGU9ITEpLGUuY3Jvc3NEb21haW4mJihlLnR5cGU9IkdFVCIpfSksUy5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKG4pe3ZhciByLGk7aWYobi5jcm9zc0RvbWFpbnx8bi5zY3JpcHRBdHRycylyZXR1cm57c2VuZDpmdW5jdGlvbihlLHQpe3I9UygiPHNjcmlwdD4iKS5hdHRyKG4uc2NyaXB0QXR0cnN8fHt9KS5wcm9wKHtjaGFyc2V0Om4uc2NyaXB0Q2hhcnNldCxzcmM6bi51cmx9KS5vbigibG9hZCBlcnJvciIsaT1mdW5jdGlvbihlKXtyLnJlbW92ZSgpLGk9bnVsbCxlJiZ0KCJlcnJvciI9PT1lLnR5cGU/NDA0OjIwMCxlLnR5cGUpfSksRS5oZWFkLmFwcGVuZENoaWxkKHJbMF0pfSxhYm9ydDpmdW5jdGlvbigpe2kmJmkoKX19fSk7dmFyIFV0LFh0PVtdLFZ0PS8oPSlcPyg/PSZ8JCl8XD9cPy87Uy5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPVh0LnBvcCgpfHxTLmV4cGFuZG8rIl8iK0N0Lmd1aWQrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLFMuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPSExIT09ZS5qc29ucCYmKFZ0LnRlc3QoZS51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgZS5kYXRhJiYwPT09KGUuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmVnQudGVzdChlLmRhdGEpJiYiZGF0YSIpO2lmKGF8fCJqc29ucCI9PT1lLmRhdGFUeXBlc1swXSlyZXR1cm4gcj1lLmpzb25wQ2FsbGJhY2s9bShlLmpzb25wQ2FsbGJhY2spP2UuanNvbnBDYWxsYmFjaygpOmUuanNvbnBDYWxsYmFjayxhP2VbYV09ZVthXS5yZXBsYWNlKFZ0LCIkMSIrcik6ITEhPT1lLmpzb25wJiYoZS51cmwrPShFdC50ZXN0KGUudXJsKT8iJiI6Ij8iKStlLmpzb25wKyI9IityKSxlLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gb3x8Uy5lcnJvcihyKyIgd2FzIG5vdCBjYWxsZWQiKSxvWzBdfSxlLmRhdGFUeXBlc1swXT0ianNvbiIsaT1DW3JdLENbcl09ZnVuY3Rpb24oKXtvPWFyZ3VtZW50c30sbi5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1pP1MoQykucmVtb3ZlUHJvcChyKTpDW3JdPWksZVtyXSYmKGUuanNvbnBDYWxsYmFjaz10Lmpzb25wQ2FsbGJhY2ssWHQucHVzaChyKSksbyYmbShpKSYmaShvWzBdKSxvPWk9dm9pZCAwfSksInNjcmlwdCJ9KSx5LmNyZWF0ZUhUTUxEb2N1bWVudD0oKFV0PUUuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5KS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IiwyPT09VXQuY2hpbGROb2Rlcy5sZW5ndGgpLFMucGFyc2VIVE1MPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGU/W106KCJib29sZWFuIj09dHlwZW9mIHQmJihuPXQsdD0hMSksdHx8KHkuY3JlYXRlSFRNTERvY3VtZW50Pygocj0odD1FLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikpLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSkuaHJlZj1FLmxvY2F0aW9uLmhyZWYsdC5oZWFkLmFwcGVuZENoaWxkKHIpKTp0PUUpLG89IW4mJltdLChpPU4uZXhlYyhlKSk/W3QuY3JlYXRlRWxlbWVudChpWzFdKV06KGk9eGUoW2VdLHQsbyksbyYmby5sZW5ndGgmJlMobykucmVtb3ZlKCksUy5tZXJnZShbXSxpLmNoaWxkTm9kZXMpKSk7dmFyIHIsaSxvfSxTLmZuLmxvYWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPXRoaXMscz1lLmluZGV4T2YoIiAiKTtyZXR1cm4tMTxzJiYocj12dChlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksbSh0KT8obj10LHQ9dm9pZCAwKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIiksMDxhLmxlbmd0aCYmUy5hamF4KHt1cmw6ZSx0eXBlOml8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOnR9KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLGEuaHRtbChyP1MoIjxkaXY+IikuYXBwZW5kKFMucGFyc2VIVE1MKGUpKS5maW5kKHIpOmUpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKGUsdCl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pfSksdGhpc30sUy5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIFMuZ3JlcChTLnRpbWVycyxmdW5jdGlvbihlKXtyZXR1cm4gdD09PWUuZWxlbX0pLmxlbmd0aH0sUy5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGw9Uy5jc3MoZSwicG9zaXRpb24iKSxjPVMoZSksZj17fTsic3RhdGljIj09PWwmJihlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHM9Yy5vZmZzZXQoKSxvPVMuY3NzKGUsInRvcCIpLHU9Uy5jc3MoZSwibGVmdCIpLCgiYWJzb2x1dGUiPT09bHx8ImZpeGVkIj09PWwpJiYtMTwobyt1KS5pbmRleE9mKCJhdXRvIik/KGE9KHI9Yy5wb3NpdGlvbigpKS50b3AsaT1yLmxlZnQpOihhPXBhcnNlRmxvYXQobyl8fDAsaT1wYXJzZUZsb2F0KHUpfHwwKSxtKHQpJiYodD10LmNhbGwoZSxuLFMuZXh0ZW5kKHt9LHMpKSksbnVsbCE9dC50b3AmJihmLnRvcD10LnRvcC1zLnRvcCthKSxudWxsIT10LmxlZnQmJihmLmxlZnQ9dC5sZWZ0LXMubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxmKTooIm51bWJlciI9PXR5cGVvZiBmLnRvcCYmKGYudG9wKz0icHgiKSwibnVtYmVyIj09dHlwZW9mIGYubGVmdCYmKGYubGVmdCs9InB4IiksYy5jc3MoZikpfX0sUy5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbih0KXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLHQsZSl9KTt2YXIgZSxuLHI9dGhpc1swXTtyZXR1cm4gcj9yLmdldENsaWVudFJlY3RzKCkubGVuZ3RoPyhlPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1yLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcse3RvcDplLnRvcCtuLnBhZ2VZT2Zmc2V0LGxlZnQ6ZS5sZWZ0K24ucGFnZVhPZmZzZXR9KTp7dG9wOjAsbGVmdDowfTp2b2lkIDB9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuLHI9dGhpc1swXSxpPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT1TLmNzcyhyLCJwb3NpdGlvbiIpKXQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle3Q9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCxlPXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt3aGlsZShlJiYoZT09PW4uYm9keXx8ZT09PW4uZG9jdW1lbnRFbGVtZW50KSYmInN0YXRpYyI9PT1TLmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5wYXJlbnROb2RlO2UmJmUhPT1yJiYxPT09ZS5ub2RlVHlwZSYmKChpPVMoZSkub2Zmc2V0KCkpLnRvcCs9Uy5jc3MoZSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxpLmxlZnQrPVMuY3NzKGUsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOnQudG9wLWkudG9wLVMuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LWkubGVmdC1TLmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnQ7d2hpbGUoZSYmInN0YXRpYyI9PT1TLmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGV8fHJlfSl9fSksUy5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKHQsaSl7dmFyIG89InBhZ2VZT2Zmc2V0Ij09PWk7Uy5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZih4KGUpP3I9ZTo5PT09ZS5ub2RlVHlwZSYmKHI9ZS5kZWZhdWx0Vmlldyksdm9pZCAwPT09bilyZXR1cm4gcj9yW2ldOmVbdF07cj9yLnNjcm9sbFRvKG8/ci5wYWdlWE9mZnNldDpuLG8/bjpyLnBhZ2VZT2Zmc2V0KTplW3RdPW59LHQsZSxhcmd1bWVudHMubGVuZ3RoKX19KSxTLmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSxuKXtTLmNzc0hvb2tzW25dPSRlKHkucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuIHQ9QmUoZSxuKSxNZS50ZXN0KHQpP1MoZSkucG9zaXRpb24oKVtuXSsicHgiOnR9KX0pLFMuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGEscyl7Uy5lYWNoKHtwYWRkaW5nOiJpbm5lciIrYSxjb250ZW50OnMsIiI6Im91dGVyIithfSxmdW5jdGlvbihyLG8pe1MuZm5bb109ZnVuY3Rpb24oZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoJiYocnx8ImJvb2xlYW4iIT10eXBlb2YgZSksaT1yfHwoITA9PT1lfHwhMD09PXQ/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByO3JldHVybiB4KGUpPzA9PT1vLmluZGV4T2YoIm91dGVyIik/ZVsiaW5uZXIiK2FdOmUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2FdOjk9PT1lLm5vZGVUeXBlPyhyPWUuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KGUuYm9keVsic2Nyb2xsIithXSxyWyJzY3JvbGwiK2FdLGUuYm9keVsib2Zmc2V0IithXSxyWyJvZmZzZXQiK2FdLHJbImNsaWVudCIrYV0pKTp2b2lkIDA9PT1uP1MuY3NzKGUsdCxpKTpTLnN0eWxlKGUsdCxuLGkpfSxzLG4/ZTp2b2lkIDAsbil9fSl9KSxTLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihlLHQpe1MuZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub24odCxlKX19KSxTLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIsbil9LGhvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubW91c2VlbnRlcihlKS5tb3VzZWxlYXZlKHR8fGUpfX0pLFMuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLG4pe1MuZm5bbl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMDxhcmd1bWVudHMubGVuZ3RoP3RoaXMub24obixudWxsLGUsdCk6dGhpcy50cmlnZ2VyKG4pfX0pO3ZhciBHdD0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7Uy5wcm94eT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaTtpZigic3RyaW5nIj09dHlwZW9mIHQmJihuPWVbdF0sdD1lLGU9biksbShlKSlyZXR1cm4gcj1zLmNhbGwoYXJndW1lbnRzLDIpLChpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxyLmNvbmNhdChzLmNhbGwoYXJndW1lbnRzKSkpfSkuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHxTLmd1aWQrKyxpfSxTLmhvbGRSZWFkeT1mdW5jdGlvbihlKXtlP1MucmVhZHlXYWl0Kys6Uy5yZWFkeSghMCl9LFMuaXNBcnJheT1BcnJheS5pc0FycmF5LFMucGFyc2VKU09OPUpTT04ucGFyc2UsUy5ub2RlTmFtZT1BLFMuaXNGdW5jdGlvbj1tLFMuaXNXaW5kb3c9eCxTLmNhbWVsQ2FzZT1YLFMudHlwZT13LFMubm93PURhdGUubm93LFMuaXNOdW1lcmljPWZ1bmN0aW9uKGUpe3ZhciB0PVMudHlwZShlKTtyZXR1cm4oIm51bWJlciI9PT10fHwic3RyaW5nIj09PXQpJiYhaXNOYU4oZS1wYXJzZUZsb2F0KGUpKX0sUy50cmltPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOihlKyIiKS5yZXBsYWNlKEd0LCIiKX0sImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIFN9KTt2YXIgWXQ9Qy5qUXVlcnksUXQ9Qy4kO3JldHVybiBTLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIEMuJD09PVMmJihDLiQ9UXQpLGUmJkMualF1ZXJ5PT09UyYmKEMualF1ZXJ5PVl0KSxTfSwidW5kZWZpbmVkIj09dHlwZW9mIGUmJihDLmpRdWVyeT1DLiQ9UyksU30pOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKgogKiBqUXVlcnkgVGVtcGxhdGVzIFBsdWdpbiAxLjAuMHByZQogKiBodHRwOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXRtcGwKICogUmVxdWlyZXMgalF1ZXJ5IDEuNC4yCiAqCiAqIENvcHlyaWdodCBTb2Z0d2FyZSBGcmVlZG9tIENvbnNlcnZhbmN5LCBJbmMuCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqLwooZnVuY3Rpb24oYSl7dmFyIHI9YS5mbi5kb21NYW5pcCxkPSJfdG1wbGl0ZW0iLHE9L15bXjxdKig8W1x3XFddKz4pW14+XSokfFx7XHtcISAvLGI9e30sZj17fSxlLHA9e2tleTowLGRhdGE6e319LGk9MCxjPTAsbD1bXTtmdW5jdGlvbiBnKGcsZCxoLGUpe3ZhciBjPXtkYXRhOmV8fChlPT09MHx8ZT09PWZhbHNlKT9lOmQ/ZC5kYXRhOnt9LF93cmFwOmQ/ZC5fd3JhcDpudWxsLHRtcGw6bnVsbCxwYXJlbnQ6ZHx8bnVsbCxub2RlczpbXSxjYWxsczp1LG5lc3Q6dyx3cmFwOngsaHRtbDp2LHVwZGF0ZTp0fTtnJiZhLmV4dGVuZChjLGcse25vZGVzOltdLHBhcmVudDpkfSk7aWYoaCl7Yy50bXBsPWg7Yy5fY3RudD1jLl9jdG50fHxjLnRtcGwoYSxjKTtjLmtleT0rK2k7KGwubGVuZ3RoP2Y6YilbaV09Y31yZXR1cm4gY31hLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihmLGQpe2EuZm5bZl09ZnVuY3Rpb24obil7dmFyIGc9W10saT1hKG4pLGssaCxtLGwsaj10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtlPWJ8fHt9O2lmKGomJmoubm9kZVR5cGU9PT0xMSYmai5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJmkubGVuZ3RoPT09MSl7aVtkXSh0aGlzWzBdKTtnPXRoaXN9ZWxzZXtmb3IoaD0wLG09aS5sZW5ndGg7aDxtO2grKyl7Yz1oO2s9KGg+MD90aGlzLmNsb25lKHRydWUpOnRoaXMpLmdldCgpO2EoaVtoXSlbZF0oayk7Zz1nLmNvbmNhdChrKX1jPTA7Zz10aGlzLnB1c2hTdGFjayhnLGYsaS5zZWxlY3Rvcil9bD1lO2U9bnVsbDthLnRtcGwuY29tcGxldGUobCk7cmV0dXJuIGd9fSk7YS5mbi5leHRlbmQoe3RtcGw6ZnVuY3Rpb24oZCxjLGIpe3JldHVybiBhLnRtcGwodGhpc1swXSxkLGMsYil9LHRtcGxJdGVtOmZ1bmN0aW9uKCl7cmV0dXJuIGEudG1wbEl0ZW0odGhpc1swXSl9LHRlbXBsYXRlOmZ1bmN0aW9uKGIpe3JldHVybiBhLnRlbXBsYXRlKGIsdGhpc1swXSl9LGRvbU1hbmlwOmZ1bmN0aW9uKGQsbSxrKXtpZihkWzBdJiZhLmlzQXJyYXkoZFswXSkpe3ZhciBnPWEubWFrZUFycmF5KGFyZ3VtZW50cyksaD1kWzBdLGo9aC5sZW5ndGgsaT0wLGY7d2hpbGUoaTxqJiYhKGY9YS5kYXRhKGhbaSsrXSwidG1wbEl0ZW0iKSkpO2lmKGYmJmMpZ1syXT1mdW5jdGlvbihiKXthLnRtcGwuYWZ0ZXJNYW5pcCh0aGlzLGIsayl9O3IuYXBwbHkodGhpcyxnKX1lbHNlIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpO2M9MDshZSYmYS50bXBsLmNvbXBsZXRlKGIpO3JldHVybiB0aGlzfX0pO2EuZXh0ZW5kKHt0bXBsOmZ1bmN0aW9uKGQsaCxlLGMpe3ZhciBpLGs9IWM7aWYoayl7Yz1wO2Q9YS50ZW1wbGF0ZVtkXXx8YS50ZW1wbGF0ZShudWxsLGQpO2Y9e319ZWxzZSBpZighZCl7ZD1jLnRtcGw7YltjLmtleV09YztjLm5vZGVzPVtdO2Mud3JhcHBlZCYmbihjLGMud3JhcHBlZCk7cmV0dXJuIGEoaihjLG51bGwsYy50bXBsKGEsYykpKX1pZighZClyZXR1cm5bXTtpZih0eXBlb2YgaD09PSJmdW5jdGlvbiIpaD1oLmNhbGwoY3x8e30pO2UmJmUud3JhcHBlZCYmbihlLGUud3JhcHBlZCk7aT1hLmlzQXJyYXkoaCk/YS5tYXAoaCxmdW5jdGlvbihhKXtyZXR1cm4gYT9nKGUsYyxkLGEpOm51bGx9KTpbZyhlLGMsZCxoKV07cmV0dXJuIGs/YShqKGMsbnVsbCxpKSk6aX0sdG1wbEl0ZW06ZnVuY3Rpb24oYil7dmFyIGM7aWYoYiBpbnN0YW5jZW9mIGEpYj1iWzBdO3doaWxlKGImJmIubm9kZVR5cGU9PT0xJiYhKGM9YS5kYXRhKGIsInRtcGxJdGVtIikpJiYoYj1iLnBhcmVudE5vZGUpKTtyZXR1cm4gY3x8cH0sdGVtcGxhdGU6ZnVuY3Rpb24oYyxiKXtpZihiKXtpZih0eXBlb2YgYj09PSJzdHJpbmciKWI9byhiKTtlbHNlIGlmKGIgaW5zdGFuY2VvZiBhKWI9YlswXXx8e307aWYoYi5ub2RlVHlwZSliPWEuZGF0YShiLCJ0bXBsIil8fGEuZGF0YShiLCJ0bXBsIixvKGIuaW5uZXJIVE1MKSk7cmV0dXJuIHR5cGVvZiBjPT09InN0cmluZyI/KGEudGVtcGxhdGVbY109Yik6Yn1yZXR1cm4gYz90eXBlb2YgYyE9PSJzdHJpbmciP2EudGVtcGxhdGUobnVsbCxjKTphLnRlbXBsYXRlW2NdfHxhLnRlbXBsYXRlKG51bGwscS50ZXN0KGMpP2M6YShjKSk6bnVsbH0sZW5jb2RlOmZ1bmN0aW9uKGEpe3JldHVybigiIithKS5zcGxpdCgiJiIpLmpvaW4oIiZhbXA7Iikuc3BsaXQoIjwiKS5qb2luKCImbHQ7Iikuc3BsaXQoIj4iKS5qb2luKCImZ3Q7Iikuc3BsaXQoJyInKS5qb2luKCImIzM0OyIpLnNwbGl0KCInIikuam9pbigiJiMzOTsiKX19KTthLmV4dGVuZChhLnRtcGwse3RhZzp7dG1wbDp7X2RlZmF1bHQ6eyQyOiJudWxsIn0sb3BlbjoiaWYoJG5vdG51bGxfMSl7X189X18uY29uY2F0KCRpdGVtLm5lc3QoJDEsJDIpKTt9In0sd3JhcDp7X2RlZmF1bHQ6eyQyOiJudWxsIn0sb3BlbjoiJGl0ZW0uY2FsbHMoX18sJDEsJDIpO19fPVtdOyIsY2xvc2U6ImNhbGw9JGl0ZW0uY2FsbHMoKTtfXz1jYWxsLl8uY29uY2F0KCRpdGVtLndyYXAoY2FsbCxfXykpOyJ9LGVhY2g6e19kZWZhdWx0OnskMjoiJGluZGV4LCAkdmFsdWUifSxvcGVuOiJpZigkbm90bnVsbF8xKXskLmVhY2goJDFhLGZ1bmN0aW9uKCQyKXt3aXRoKHRoaXMpeyIsY2xvc2U6In19KTt9In0sImlmIjp7b3BlbjoiaWYoKCRub3RudWxsXzEpICYmICQxYSl7IixjbG9zZToifSJ9LCJlbHNlIjp7X2RlZmF1bHQ6eyQxOiJ0cnVlIn0sb3BlbjoifWVsc2UgaWYoKCRub3RudWxsXzEpICYmICQxYSl7In0saHRtbDp7b3BlbjoiaWYoJG5vdG51bGxfMSl7X18ucHVzaCgkMWEpO30ifSwiPSI6e19kZWZhdWx0OnskMToiJGRhdGEifSxvcGVuOiJpZigkbm90bnVsbF8xKXtfXy5wdXNoKCQuZW5jb2RlKCQxYSkpO30ifSwiISI6e29wZW46IiJ9fSxjb21wbGV0ZTpmdW5jdGlvbigpe2I9e319LGFmdGVyTWFuaXA6ZnVuY3Rpb24oZixiLGQpe3ZhciBlPWIubm9kZVR5cGU9PT0xMT9hLm1ha2VBcnJheShiLmNoaWxkTm9kZXMpOmIubm9kZVR5cGU9PT0xP1tiXTpbXTtkLmNhbGwoZixiKTttKGUpO2MrK319KTtmdW5jdGlvbiBqKGUsZyxmKXt2YXIgYixjPWY/YS5tYXAoZixmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGE9PT0ic3RyaW5nIj9lLmtleT9hLnJlcGxhY2UoLyg8XHcrKSg/PVtccz5dKSg/IVtePl0qX3RtcGxpdGVtKShbXj5dKikvZywiJDEgIitkKyc9IicrZS5rZXkrJyIgJDInKTphOmooYSxlLGEuX2N0bnQpfSk6ZTtpZihnKXJldHVybiBjO2M9Yy5qb2luKCIiKTtjLnJlcGxhY2UoL15ccyooW148XHNdW148XSopPyg8W1x3XFddKz4pKFtePl0qW14+XHNdKT9ccyokLyxmdW5jdGlvbihmLGMsZSxkKXtiPWEoZSkuZ2V0KCk7bShiKTtpZihjKWI9ayhjKS5jb25jYXQoYik7aWYoZCliPWIuY29uY2F0KGsoZCkpfSk7cmV0dXJuIGI/YjprKGMpfWZ1bmN0aW9uIGsoYyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5pbm5lckhUTUw9YztyZXR1cm4gYS5tYWtlQXJyYXkoYi5jaGlsZE5vZGVzKX1mdW5jdGlvbiBvKGIpe3JldHVybiBuZXcgRnVuY3Rpb24oImpRdWVyeSIsIiRpdGVtIiwidmFyICQ9alF1ZXJ5LGNhbGwsX189W10sJGRhdGE9JGl0ZW0uZGF0YTt3aXRoKCRkYXRhKXtfXy5wdXNoKCciK2EudHJpbShiKS5yZXBsYWNlKC8oW1xcJ10pL2csIlxcJDEiKS5yZXBsYWNlKC9bXHJcdFxuXS9nLCIgIikucmVwbGFjZSgvXCRceyhbXlx9XSopXH0vZywie3s9ICQxfX0iKS5yZXBsYWNlKC9ce1x7KFwvPykoXHcrfC4pKD86XCgoKD86W15cfV18XH0oPyFcfSkpKj8pP1wpKT8oPzpccysoLio/KT8pPyhcKCgoPzpbXlx9XXxcfSg/IVx9KSkqPylcKSk/XHMqXH1cfS9nLGZ1bmN0aW9uKG0sbCxrLGcsYixjLGQpe3ZhciBqPWEudG1wbC50YWdba10saSxlLGY7aWYoIWopdGhyb3ciVW5rbm93biB0ZW1wbGF0ZSB0YWc6ICIraztpPWouX2RlZmF1bHR8fFtdO2lmKGMmJiEvXHckLy50ZXN0KGIpKXtiKz1jO2M9IiJ9aWYoYil7Yj1oKGIpO2Q9ZD8iLCIraChkKSsiKSI6Yz8iKSI6IiI7ZT1jP2IuaW5kZXhPZigiLiIpPi0xP2IraChjKToiKCIrYisiKS5jYWxsKCRpdGVtIitkOmI7Zj1jP2U6Iih0eXBlb2YoIitiKyIpPT09J2Z1bmN0aW9uJz8oIitiKyIpLmNhbGwoJGl0ZW0pOigiK2IrIikpIn1lbHNlIGY9ZT1pLiQxfHwibnVsbCI7Zz1oKGcpO3JldHVybiInKTsiK2pbbD8iY2xvc2UiOiJvcGVuIl0uc3BsaXQoIiRub3RudWxsXzEiKS5qb2luKGI/InR5cGVvZigiK2IrIikhPT0ndW5kZWZpbmVkJyAmJiAoIitiKyIpIT1udWxsIjoidHJ1ZSIpLnNwbGl0KCIkMWEiKS5qb2luKGYpLnNwbGl0KCIkMSIpLmpvaW4oZSkuc3BsaXQoIiQyIikuam9pbihnfHxpLiQyfHwiIikrIl9fLnB1c2goJyJ9KSsiJyk7fXJldHVybiBfXzsiKX1mdW5jdGlvbiBuKGMsYil7Yy5fd3JhcD1qKGMsdHJ1ZSxhLmlzQXJyYXkoYik/YjpbcS50ZXN0KGIpP2I6YShiKS5odG1sKCldKS5qb2luKCIiKX1mdW5jdGlvbiBoKGEpe3JldHVybiBhP2EucmVwbGFjZSgvXFwnL2csIiciKS5yZXBsYWNlKC9cXFxcL2csIlxcIik6bnVsbH1mdW5jdGlvbiBzKGIpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQoYi5jbG9uZU5vZGUodHJ1ZSkpO3JldHVybiBhLmlubmVySFRNTH1mdW5jdGlvbiBtKG8pe3ZhciBuPSJfIitjLGssaixsPXt9LGUscCxoO2ZvcihlPTAscD1vLmxlbmd0aDtlPHA7ZSsrKXtpZigoaz1vW2VdKS5ub2RlVHlwZSE9PTEpY29udGludWU7aj1rLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7Zm9yKGg9ai5sZW5ndGgtMTtoPj0wO2gtLSltKGpbaF0pO20oayl9ZnVuY3Rpb24gbShqKXt2YXIgcCxoPWosayxlLG07aWYobT1qLmdldEF0dHJpYnV0ZShkKSl7d2hpbGUoaC5wYXJlbnROb2RlJiYoaD1oLnBhcmVudE5vZGUpLm5vZGVUeXBlPT09MSYmIShwPWguZ2V0QXR0cmlidXRlKGQpKSk7aWYocCE9PW0pe2g9aC5wYXJlbnROb2RlP2gubm9kZVR5cGU9PT0xMT8wOmguZ2V0QXR0cmlidXRlKGQpfHwwOjA7aWYoIShlPWJbbV0pKXtlPWZbbV07ZT1nKGUsYltoXXx8ZltoXSk7ZS5rZXk9KytpO2JbaV09ZX1jJiZvKG0pfWoucmVtb3ZlQXR0cmlidXRlKGQpfWVsc2UgaWYoYyYmKGU9YS5kYXRhKGosInRtcGxJdGVtIikpKXtvKGUua2V5KTtiW2Uua2V5XT1lO2g9YS5kYXRhKGoucGFyZW50Tm9kZSwidG1wbEl0ZW0iKTtoPWg/aC5rZXk6MH1pZihlKXtrPWU7d2hpbGUoayYmay5rZXkhPWgpe2subm9kZXMucHVzaChqKTtrPWsucGFyZW50fWRlbGV0ZSBlLl9jdG50O2RlbGV0ZSBlLl93cmFwO2EuZGF0YShqLCJ0bXBsSXRlbSIsZSl9ZnVuY3Rpb24gbyhhKXthPWErbjtlPWxbYV09bFthXXx8ZyhlLGJbZS5wYXJlbnQua2V5K25dfHxlLnBhcmVudCl9fX1mdW5jdGlvbiB1KGEsZCxjLGIpe2lmKCFhKXJldHVybiBsLnBvcCgpO2wucHVzaCh7XzphLHRtcGw6ZCxpdGVtOnRoaXMsZGF0YTpjLG9wdGlvbnM6Yn0pfWZ1bmN0aW9uIHcoZCxjLGIpe3JldHVybiBhLnRtcGwoYS50ZW1wbGF0ZShkKSxjLGIsdGhpcyl9ZnVuY3Rpb24geChiLGQpe3ZhciBjPWIub3B0aW9uc3x8e307Yy53cmFwcGVkPWQ7cmV0dXJuIGEudG1wbChhLnRlbXBsYXRlKGIudG1wbCksYi5kYXRhLGMsYi5pdGVtKX1mdW5jdGlvbiB2KGQsYyl7dmFyIGI9dGhpcy5fd3JhcDtyZXR1cm4gYS5tYXAoYShhLmlzQXJyYXkoYik/Yi5qb2luKCIiKTpiKS5maWx0ZXIoZHx8IioiKSxmdW5jdGlvbihhKXtyZXR1cm4gYz9hLmlubmVyVGV4dHx8YS50ZXh0Q29udGVudDphLm91dGVySFRNTHx8cyhhKX0pfWZ1bmN0aW9uIHQoKXt2YXIgYj10aGlzLm5vZGVzO2EudG1wbChudWxsLG51bGwsbnVsbCx0aGlzKS5pbnNlcnRCZWZvcmUoYlswXSk7YShiKS5yZW1vdmUoKX19KShqUXVlcnkpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgohZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiXSxlKToib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lKHJlcXVpcmUoImpxdWVyeSIpKTplKGpRdWVyeSl9KGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7dmFyIHQ9ZS50YWJsZXNvcnRlcj17dmVyc2lvbjoiMi4zMC41IixwYXJzZXJzOltdLHdpZGdldHM6W10sZGVmYXVsdHM6e3RoZW1lOiJkZWZhdWx0Iix3aWR0aEZpeGVkOiExLHNob3dQcm9jZXNzaW5nOiExLGhlYWRlclRlbXBsYXRlOiJ7Y29udGVudH0iLG9uUmVuZGVyVGVtcGxhdGU6bnVsbCxvblJlbmRlckhlYWRlcjpudWxsLGNhbmNlbFNlbGVjdGlvbjohMCx0YWJJbmRleDohMCxkYXRlRm9ybWF0OiJtbWRkeXl5eSIsc29ydE11bHRpU29ydEtleToic2hpZnRLZXkiLHNvcnRSZXNldEtleToiY3RybEtleSIsdXNOdW1iZXJGb3JtYXQ6ITAsZGVsYXlJbml0OiExLHNlcnZlclNpZGVTb3J0aW5nOiExLHJlc29ydDohMCxoZWFkZXJzOnt9LGlnbm9yZUNhc2U6ITAsc29ydEZvcmNlOm51bGwsc29ydExpc3Q6W10sc29ydEFwcGVuZDpudWxsLHNvcnRTdGFibGU6ITEsc29ydEluaXRpYWxPcmRlcjoiYXNjIixzb3J0TG9jYWxlQ29tcGFyZTohMSxzb3J0UmVzZXQ6ITEsc29ydFJlc3RhcnQ6ITEsZW1wdHlUbzoiYm90dG9tIixzdHJpbmdUbzoibWF4IixkdXBsaWNhdGVTcGFuOiEwLHRleHRFeHRyYWN0aW9uOiJiYXNpYyIsdGV4dEF0dHJpYnV0ZToiZGF0YS10ZXh0Iix0ZXh0U29ydGVyOm51bGwsbnVtYmVyU29ydGVyOm51bGwsaW5pdFdpZGdldHM6ITAsd2lkZ2V0Q2xhc3M6IndpZGdldC17bmFtZX0iLHdpZGdldHM6W10sd2lkZ2V0T3B0aW9uczp7emVicmE6WyJldmVuIiwib2RkIl19LGluaXRpYWxpemVkOm51bGwsdGFibGVDbGFzczoiIixjc3NBc2M6IiIsY3NzRGVzYzoiIixjc3NOb25lOiIiLGNzc0hlYWRlcjoiIixjc3NIZWFkZXJSb3c6IiIsY3NzUHJvY2Vzc2luZzoiIixjc3NDaGlsZFJvdzoidGFibGVzb3J0ZXItY2hpbGRSb3ciLGNzc0luZm9CbG9jazoidGFibGVzb3J0ZXItaW5mb09ubHkiLGNzc05vU29ydDoidGFibGVzb3J0ZXItbm9Tb3J0Iixjc3NJZ25vcmVSb3c6InRhYmxlc29ydGVyLWlnbm9yZVJvdyIsY3NzSWNvbjoidGFibGVzb3J0ZXItaWNvbiIsY3NzSWNvbk5vbmU6IiIsY3NzSWNvbkFzYzoiIixjc3NJY29uRGVzYzoiIixjc3NJY29uRGlzYWJsZWQ6IiIscG9pbnRlckNsaWNrOiJjbGljayIscG9pbnRlckRvd246Im1vdXNlZG93biIscG9pbnRlclVwOiJtb3VzZXVwIixzZWxlY3RvckhlYWRlcnM6Ij4gdGhlYWQgdGgsID4gdGhlYWQgdGQiLHNlbGVjdG9yU29ydDoidGgsIHRkIixzZWxlY3RvclJlbW92ZToiLnJlbW92ZS1tZSIsZGVidWc6ITEsaGVhZGVyTGlzdDpbXSxlbXB0aWVzOnt9LHN0cmluZ3M6e30scGFyc2VyczpbXSxnbG9iYWxpemU6MCxpbWdBdHRyOjB9LGNzczp7dGFibGU6InRhYmxlc29ydGVyIixjc3NIYXNDaGlsZDoidGFibGVzb3J0ZXItaGFzQ2hpbGRSb3ciLGNoaWxkUm93OiJ0YWJsZXNvcnRlci1jaGlsZFJvdyIsY29sZ3JvdXA6InRhYmxlc29ydGVyLWNvbGdyb3VwIixoZWFkZXI6InRhYmxlc29ydGVyLWhlYWRlciIsaGVhZGVyUm93OiJ0YWJsZXNvcnRlci1oZWFkZXJSb3ciLGhlYWRlckluOiJ0YWJsZXNvcnRlci1oZWFkZXItaW5uZXIiLGljb246InRhYmxlc29ydGVyLWljb24iLHByb2Nlc3Npbmc6InRhYmxlc29ydGVyLXByb2Nlc3NpbmciLHNvcnRBc2M6InRhYmxlc29ydGVyLWhlYWRlckFzYyIsc29ydERlc2M6InRhYmxlc29ydGVyLWhlYWRlckRlc2MiLHNvcnROb25lOiJ0YWJsZXNvcnRlci1oZWFkZXJVblNvcnRlZCJ9LGxhbmd1YWdlOntzb3J0QXNjOiJBc2NlbmRpbmcgc29ydCBhcHBsaWVkLCAiLHNvcnREZXNjOiJEZXNjZW5kaW5nIHNvcnQgYXBwbGllZCwgIixzb3J0Tm9uZToiTm8gc29ydCBhcHBsaWVkLCAiLHNvcnREaXNhYmxlZDoic29ydGluZyBpcyBkaXNhYmxlZCIsbmV4dEFzYzoiYWN0aXZhdGUgdG8gYXBwbHkgYW4gYXNjZW5kaW5nIHNvcnQiLG5leHREZXNjOiJhY3RpdmF0ZSB0byBhcHBseSBhIGRlc2NlbmRpbmcgc29ydCIsbmV4dE5vbmU6ImFjdGl2YXRlIHRvIHJlbW92ZSB0aGUgc29ydCJ9LHJlZ2V4Ont0ZW1wbGF0ZUNvbnRlbnQ6L1x7Y29udGVudFx9L2csdGVtcGxhdGVJY29uOi9ce2ljb25cfS9nLHRlbXBsYXRlTmFtZTovXHtuYW1lXH0vaSxzcGFjZXM6L1xzKy9nLG5vbldvcmQ6L1xXL2csZm9ybUVsZW1lbnRzOi8oaW5wdXR8c2VsZWN0fGJ1dHRvbnx0ZXh0YXJlYSkvaSxjaHVuazovKF4oWytcLV0/KD86XGQqKSg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8pPyR8XjB4WzAtOWEtZl0rJHxcZCspL2dpLGNodW5rczovKF5cXDB8XFwwJCkvLGhleDovXjB4WzAtOWEtZl0rJC9pLGNvbW1hOi8sL2csZGlnaXROb25VUzovW1xzfFwuXS9nLGRpZ2l0TmVnYXRpdmVUZXN0Oi9eXHMqXChbLlxkXStcKS8sZGlnaXROZWdhdGl2ZVJlcGxhY2U6L15ccypcKChbLlxkXSspXCkvLGRpZ2l0VGVzdDovXltcLSsoXT9cZCtbKV0/JC8sZGlnaXRSZXBsYWNlOi9bLC4nIlxzXS9nfSxzdHJpbmc6e21heDoxLG1pbjotMSxlbXB0eW1pbjoxLGVtcHR5bWF4Oi0xLHplcm86MCxub25lOjAsIm51bGwiOjAsdG9wOiEwLGJvdHRvbTohMX0sa2V5Q29kZXM6e2VudGVyOjEzfSxkYXRlczp7fSxpbnN0YW5jZU1ldGhvZHM6e30sc2V0dXA6ZnVuY3Rpb24ocixvKXtpZihyJiZyLnRIZWFkJiYwIT09ci50Qm9kaWVzLmxlbmd0aCYmITAhPT1yLmhhc0luaXRpYWxpemVkKXt2YXIgcz0iIixhPWUociksbj1lLm1ldGFkYXRhO3IuaGFzSW5pdGlhbGl6ZWQ9ITEsci5pc1Byb2Nlc3Npbmc9ITAsci5jb25maWc9byxlLmRhdGEociwidGFibGVzb3J0ZXIiLG8pLHQuZGVidWcobywiY29yZSIpJiYoY29uc29sZVtjb25zb2xlLmdyb3VwPyJncm91cCI6ImxvZyJdKCJJbml0aWFsaXppbmcgdGFibGVzb3J0ZXIgdiIrdC52ZXJzaW9uKSxlLmRhdGEociwic3RhcnRvdmVyYWxsdGltZXIiLG5ldyBEYXRlKSksby5zdXBwb3J0c0RhdGFPYmplY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF09cGFyc2VJbnQoZVswXSwxMCksZVswXT4xfHwxPT09ZVswXSYmcGFyc2VJbnQoZVsxXSwxMCk+PTR9KGUuZm4uanF1ZXJ5LnNwbGl0KCIuIikpLG8uZW1wdHlUbz1vLmVtcHR5VG8udG9Mb3dlckNhc2UoKSxvLnN0cmluZ1RvPW8uc3RyaW5nVG8udG9Mb3dlckNhc2UoKSxvLmxhc3Q9e3NvcnRMaXN0OltdLGNsaWNrZWRJbmRleDotMX0sL3RhYmxlc29ydGVyXC0vLnRlc3QoYS5hdHRyKCJjbGFzcyIpKXx8KHM9IiIhPT1vLnRoZW1lPyIgdGFibGVzb3J0ZXItIitvLnRoZW1lOiIiKSxvLm5hbWVzcGFjZT9vLm5hbWVzcGFjZT0iLiIrby5uYW1lc3BhY2UucmVwbGFjZSh0LnJlZ2V4Lm5vbldvcmQsIiIpOm8ubmFtZXNwYWNlPSIudGFibGVzb3J0ZXIiK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpLnNsaWNlKDIpLG8udGFibGU9cixvLiR0YWJsZT1hLmFkZENsYXNzKHQuY3NzLnRhYmxlKyIgIitvLnRhYmxlQ2xhc3MrcysiICIrby5uYW1lc3BhY2Uuc2xpY2UoMSkpLmF0dHIoInJvbGUiLCJncmlkIiksby4kaGVhZGVycz1hLmZpbmQoby5zZWxlY3RvckhlYWRlcnMpLG8uJHRhYmxlLmNoaWxkcmVuKCkuY2hpbGRyZW4oInRyIikuYXR0cigicm9sZSIsInJvdyIpLG8uJHRib2RpZXM9YS5jaGlsZHJlbigidGJvZHk6bm90KC4iK28uY3NzSW5mb0Jsb2NrKyIpIikuYXR0cih7ImFyaWEtbGl2ZSI6InBvbGl0ZSIsImFyaWEtcmVsZXZhbnQiOiJhbGwifSksby4kdGFibGUuY2hpbGRyZW4oImNhcHRpb24iKS5sZW5ndGgmJigocz1vLiR0YWJsZS5jaGlsZHJlbigiY2FwdGlvbiIpWzBdKS5pZHx8KHMuaWQ9by5uYW1lc3BhY2Uuc2xpY2UoMSkrImNhcHRpb24iKSxvLiR0YWJsZS5hdHRyKCJhcmlhLWxhYmVsbGVkYnkiLHMuaWQpKSxvLndpZGdldEluaXQ9e30sby50ZXh0RXh0cmFjdGlvbj1vLiR0YWJsZS5hdHRyKCJkYXRhLXRleHQtZXh0cmFjdGlvbiIpfHxvLnRleHRFeHRyYWN0aW9ufHwiYmFzaWMiLHQuYnVpbGRIZWFkZXJzKG8pLHQuZml4Q29sdW1uV2lkdGgociksdC5hZGRXaWRnZXRGcm9tQ2xhc3MociksdC5hcHBseVdpZGdldE9wdGlvbnMociksdC5zZXR1cFBhcnNlcnMobyksby50b3RhbFJvd3M9MCxvLmRlYnVnJiZ0LnZhbGlkYXRlT3B0aW9ucyhvKSxvLmRlbGF5SW5pdHx8dC5idWlsZENhY2hlKG8pLHQuYmluZEV2ZW50cyhyLG8uJGhlYWRlcnMsITApLHQuYmluZE1ldGhvZHMobyksby5zdXBwb3J0c0RhdGFPYmplY3QmJnZvaWQgMCE9PWEuZGF0YSgpLnNvcnRsaXN0P28uc29ydExpc3Q9YS5kYXRhKCkuc29ydGxpc3Q6biYmYS5tZXRhZGF0YSgpJiZhLm1ldGFkYXRhKCkuc29ydGxpc3QmJihvLnNvcnRMaXN0PWEubWV0YWRhdGEoKS5zb3J0bGlzdCksdC5hcHBseVdpZGdldChyLCEwKSxvLnNvcnRMaXN0Lmxlbmd0aD4wP3Quc29ydE9uKG8sby5zb3J0TGlzdCx7fSwhby5pbml0V2lkZ2V0cyk6KHQuc2V0SGVhZGVyc0NzcyhvKSxvLmluaXRXaWRnZXRzJiZ0LmFwcGx5V2lkZ2V0KHIsITEpKSxvLnNob3dQcm9jZXNzaW5nJiZhLnVuYmluZCgic29ydEJlZ2luIitvLm5hbWVzcGFjZSsiIHNvcnRFbmQiK28ubmFtZXNwYWNlKS5iaW5kKCJzb3J0QmVnaW4iK28ubmFtZXNwYWNlKyIgc29ydEVuZCIrby5uYW1lc3BhY2UsZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KG8udGltZXJQcm9jZXNzaW5nKSx0LmlzUHJvY2Vzc2luZyhyKSwic29ydEJlZ2luIj09PWUudHlwZSYmKG8udGltZXJQcm9jZXNzaW5nPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmlzUHJvY2Vzc2luZyhyLCEwKX0sNTAwKSl9KSxyLmhhc0luaXRpYWxpemVkPSEwLHIuaXNQcm9jZXNzaW5nPSExLHQuZGVidWcobywiY29yZSIpJiYoY29uc29sZS5sb2coIk92ZXJhbGwgaW5pdGlhbGl6YXRpb24gdGltZToiK3QuYmVuY2htYXJrKGUuZGF0YShyLCJzdGFydG92ZXJhbGx0aW1lciIpKSksdC5kZWJ1ZyhvLCJjb3JlIikmJmNvbnNvbGUuZ3JvdXBFbmQmJmNvbnNvbGUuZ3JvdXBFbmQoKSksYS50cmlnZ2VySGFuZGxlcigidGFibGVzb3J0ZXItaW5pdGlhbGl6ZWQiLHIpLCJmdW5jdGlvbiI9PXR5cGVvZiBvLmluaXRpYWxpemVkJiZvLmluaXRpYWxpemVkKHIpfWVsc2UgdC5kZWJ1ZyhvLCJjb3JlIikmJihyLmhhc0luaXRpYWxpemVkP2NvbnNvbGUud2FybigiU3RvcHBpbmcgaW5pdGlhbGl6YXRpb24uIFRhYmxlc29ydGVyIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQiKTpjb25zb2xlLmVycm9yKCJTdG9wcGluZyBpbml0aWFsaXphdGlvbiEgTm8gdGFibGUsIHRoZWFkIG9yIHRib2R5IixyKSl9LGJpbmRNZXRob2RzOmZ1bmN0aW9uKHIpe3ZhciBvPXIuJHRhYmxlLHM9ci5uYW1lc3BhY2UsYT0ic29ydFJlc2V0IHVwZGF0ZSB1cGRhdGVSb3dzIHVwZGF0ZUFsbCB1cGRhdGVIZWFkZXJzIGFkZFJvd3MgdXBkYXRlQ2VsbCB1cGRhdGVDb21wbGV0ZSBzb3J0b24gYXBwZW5kQ2FjaGUgdXBkYXRlQ2FjaGUgYXBwbHlXaWRnZXRJZCBhcHBseVdpZGdldHMgcmVmcmVzaFdpZGdldHMgZGVzdHJveSBtb3VzZXVwIG1vdXNlbGVhdmUgIi5zcGxpdCgiICIpLmpvaW4ocysiICIpO28udW5iaW5kKGEucmVwbGFjZSh0LnJlZ2V4LnNwYWNlcywiICIpKS5iaW5kKCJzb3J0UmVzZXQiK3MsZnVuY3Rpb24oZSxyKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuc29ydFJlc2V0KHRoaXMuY29uZmlnLGZ1bmN0aW9uKGUpe2UuaXNBcHBseWluZ1dpZGdldHM/c2V0VGltZW91dChmdW5jdGlvbigpe3QuYXBwbHlXaWRnZXQoZSwiIixyKX0sMTAwKTp0LmFwcGx5V2lkZ2V0KGUsIiIscil9KX0pLmJpbmQoInVwZGF0ZUFsbCIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZUFsbCh0aGlzLmNvbmZpZyxyLG8pfSkuYmluZCgidXBkYXRlIitzKyIgdXBkYXRlUm93cyIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZSh0aGlzLmNvbmZpZyxyLG8pfSkuYmluZCgidXBkYXRlSGVhZGVycyIrcyxmdW5jdGlvbihlLHIpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC51cGRhdGVIZWFkZXJzKHRoaXMuY29uZmlnLHIpfSkuYmluZCgidXBkYXRlQ2VsbCIrcyxmdW5jdGlvbihlLHIsbyxzKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQ2VsbCh0aGlzLmNvbmZpZyxyLG8scyl9KS5iaW5kKCJhZGRSb3dzIitzLGZ1bmN0aW9uKGUscixvLHMpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5hZGRSb3dzKHRoaXMuY29uZmlnLHIsbyxzKX0pLmJpbmQoInVwZGF0ZUNvbXBsZXRlIitzLGZ1bmN0aW9uKCl7dGhpcy5pc1VwZGF0aW5nPSExfSkuYmluZCgic29ydG9uIitzLGZ1bmN0aW9uKGUscixvLHMpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5zb3J0T24odGhpcy5jb25maWcscixvLHMpfSkuYmluZCgiYXBwZW5kQ2FjaGUiK3MsZnVuY3Rpb24ocixvLHMpe3Iuc3RvcFByb3BhZ2F0aW9uKCksdC5hcHBlbmRDYWNoZSh0aGlzLmNvbmZpZyxzKSxlLmlzRnVuY3Rpb24obykmJm8odGhpcyl9KS5iaW5kKCJ1cGRhdGVDYWNoZSIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZUNhY2hlKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJhcHBseVdpZGdldElkIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGx5V2lkZ2V0SWQodGhpcyxyKX0pLmJpbmQoImFwcGx5V2lkZ2V0cyIrcyxmdW5jdGlvbihlLHIpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5hcHBseVdpZGdldCh0aGlzLCExLHIpfSkuYmluZCgicmVmcmVzaFdpZGdldHMiK3MsZnVuY3Rpb24oZSxyLG8pe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5yZWZyZXNoV2lkZ2V0cyh0aGlzLHIsbyl9KS5iaW5kKCJyZW1vdmVXaWRnZXQiK3MsZnVuY3Rpb24oZSxyLG8pe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5yZW1vdmVXaWRnZXQodGhpcyxyLG8pfSkuYmluZCgiZGVzdHJveSIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmRlc3Ryb3kodGhpcyxyLG8pfSkuYmluZCgicmVzZXRUb0xvYWRTdGF0ZSIrcyxmdW5jdGlvbihvKXtvLnN0b3BQcm9wYWdhdGlvbigpLHQucmVtb3ZlV2lkZ2V0KHRoaXMsITAsITEpO3ZhciBzPWUuZXh0ZW5kKCEwLHt9LHIub3JpZ2luYWxTZXR0aW5ncyk7KHI9ZS5leHRlbmQoITAse30sdC5kZWZhdWx0cyxzKSkub3JpZ2luYWxTZXR0aW5ncz1zLHRoaXMuaGFzSW5pdGlhbGl6ZWQ9ITEsdC5zZXR1cCh0aGlzLHIpfSl9LGJpbmRFdmVudHM6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG49KHI9ZShyKVswXSkuY29uZmlnLGk9bi5uYW1lc3BhY2UsbD1udWxsOyEwIT09cyYmKG8uYWRkQ2xhc3MoaS5zbGljZSgxKSsiX2V4dHJhX2hlYWRlcnMiKSwoYT10LmdldENsb3Nlc3QobywidGFibGUiKSkubGVuZ3RoJiYiVEFCTEUiPT09YVswXS5ub2RlTmFtZSYmYVswXSE9PXImJmUoYVswXSkuYWRkQ2xhc3MoaS5zbGljZSgxKSsiX2V4dHJhX3RhYmxlIikpLGE9KG4ucG9pbnRlckRvd24rIiAiK24ucG9pbnRlclVwKyIgIituLnBvaW50ZXJDbGljaysiIHNvcnQga2V5dXAgIikucmVwbGFjZSh0LnJlZ2V4LnNwYWNlcywiICIpLnNwbGl0KCIgIikuam9pbihpKyIgIiksby5maW5kKG4uc2VsZWN0b3JTb3J0KS5hZGQoby5maWx0ZXIobi5zZWxlY3RvclNvcnQpKS51bmJpbmQoYSkuYmluZChhLGZ1bmN0aW9uKHIsbyl7dmFyIHMsYSxpLGQ9ZShyLnRhcmdldCksYz0iICIrci50eXBlKyIgIjtpZighKDEhPT0oci53aGljaHx8ci5idXR0b24pJiYhYy5tYXRjaCgiICIrbi5wb2ludGVyQ2xpY2srIiB8IHNvcnQgfCBrZXl1cCAiKXx8IiBrZXl1cCAiPT09YyYmci53aGljaCE9PXQua2V5Q29kZXMuZW50ZXJ8fGMubWF0Y2goIiAiK24ucG9pbnRlckNsaWNrKyIgIikmJnZvaWQgMCE9PXIud2hpY2h8fGMubWF0Y2goIiAiK24ucG9pbnRlclVwKyIgIikmJmwhPT1yLnRhcmdldCYmITAhPT1vKSl7aWYoYy5tYXRjaCgiICIrbi5wb2ludGVyRG93bisiICIpKXJldHVybiBsPXIudGFyZ2V0LHZvaWQoIjEiPT09KGk9ZC5qcXVlcnkuc3BsaXQoIi4iKSlbMF0mJmlbMV08NCYmci5wcmV2ZW50RGVmYXVsdCgpKTtpZihsPW51bGwscz10LmdldENsb3Nlc3QoZSh0aGlzKSwiLiIrdC5jc3MuaGVhZGVyKSx0LnJlZ2V4LmZvcm1FbGVtZW50cy50ZXN0KHIudGFyZ2V0Lm5vZGVOYW1lKXx8ZC5oYXNDbGFzcyhuLmNzc05vU29ydCl8fGQucGFyZW50cygiLiIrbi5jc3NOb1NvcnQpLmxlbmd0aD4wfHxzLmhhc0NsYXNzKCJzb3J0ZXItZmFsc2UiKXx8ZC5wYXJlbnRzKCJidXR0b24iKS5sZW5ndGg+MClyZXR1cm4hbi5jYW5jZWxTZWxlY3Rpb247bi5kZWxheUluaXQmJnQuaXNFbXB0eU9iamVjdChuLmNhY2hlKSYmdC5idWlsZENhY2hlKG4pLG4ubGFzdC5jbGlja2VkSW5kZXg9cy5hdHRyKCJkYXRhLWNvbHVtbiIpfHxzLmluZGV4KCksKGE9bi4kaGVhZGVySW5kZXhlZFtuLmxhc3QuY2xpY2tlZEluZGV4XVswXSkmJiFhLnNvcnREaXNhYmxlZCYmdC5pbml0U29ydChuLGEscil9fSksbi5jYW5jZWxTZWxlY3Rpb24mJm8uYXR0cigidW5zZWxlY3RhYmxlIiwib24iKS5iaW5kKCJzZWxlY3RzdGFydCIsITEpLmNzcyh7InVzZXItc2VsZWN0Ijoibm9uZSIsTW96VXNlclNlbGVjdDoibm9uZSJ9KX0sYnVpbGRIZWFkZXJzOmZ1bmN0aW9uKHIpe3ZhciBvLHMsYSxuO2ZvcihyLmhlYWRlckxpc3Q9W10sci5oZWFkZXJDb250ZW50PVtdLHIuc29ydFZhcnM9W10sdC5kZWJ1ZyhyLCJjb3JlIikmJihhPW5ldyBEYXRlKSxyLmNvbHVtbnM9dC5jb21wdXRlQ29sdW1uSW5kZXgoci4kdGFibGUuY2hpbGRyZW4oInRoZWFkLCB0Zm9vdCIpLmNoaWxkcmVuKCJ0ciIpKSxzPXIuY3NzSWNvbj8nPGkgY2xhc3M9IicrKHIuY3NzSWNvbj09PXQuY3NzLmljb24/dC5jc3MuaWNvbjpyLmNzc0ljb24rIiAiK3QuY3NzLmljb24pKyciPjwvaT4nOiIiLHIuJGhlYWRlcnM9ZShlLm1hcChyLiR0YWJsZS5maW5kKHIuc2VsZWN0b3JIZWFkZXJzKSxmdW5jdGlvbihvLGEpe3ZhciBuLGksbCxkLGMsZz1lKG8pO2lmKCF0LmdldENsb3Nlc3QoZywidHIiKS5oYXNDbGFzcyhyLmNzc0lnbm9yZVJvdykpcmV0dXJuLyh0aHx0ZCkvaS50ZXN0KG8ubm9kZU5hbWUpfHwoYz10LmdldENsb3Nlc3QoZywidGgsIHRkIiksZy5hdHRyKCJkYXRhLWNvbHVtbiIsYy5hdHRyKCJkYXRhLWNvbHVtbiIpKSksbj10LmdldENvbHVtbkRhdGEoci50YWJsZSxyLmhlYWRlcnMsYSwhMCksci5oZWFkZXJDb250ZW50W2FdPWcuaHRtbCgpLCIiPT09ci5oZWFkZXJUZW1wbGF0ZXx8Zy5maW5kKCIuIit0LmNzcy5oZWFkZXJJbikubGVuZ3RofHwoZD1yLmhlYWRlclRlbXBsYXRlLnJlcGxhY2UodC5yZWdleC50ZW1wbGF0ZUNvbnRlbnQsZy5odG1sKCkpLnJlcGxhY2UodC5yZWdleC50ZW1wbGF0ZUljb24sZy5maW5kKCIuIit0LmNzcy5pY29uKS5sZW5ndGg/IiI6cyksci5vblJlbmRlclRlbXBsYXRlJiYoaT1yLm9uUmVuZGVyVGVtcGxhdGUuYXBwbHkoZyxbYSxkXSkpJiYic3RyaW5nIj09dHlwZW9mIGkmJihkPWkpLGcuaHRtbCgnPGRpdiBjbGFzcz0iJyt0LmNzcy5oZWFkZXJJbisnIj4nK2QrIjwvZGl2PiIpKSxyLm9uUmVuZGVySGVhZGVyJiZyLm9uUmVuZGVySGVhZGVyLmFwcGx5KGcsW2EscixyLiR0YWJsZV0pLGw9cGFyc2VJbnQoZy5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxvLmNvbHVtbj1sLGM9dC5nZXRPcmRlcih0LmdldERhdGEoZyxuLCJzb3J0SW5pdGlhbE9yZGVyIil8fHIuc29ydEluaXRpYWxPcmRlciksci5zb3J0VmFyc1tsXT17Y291bnQ6LTEsb3JkZXI6Yz9yLnNvcnRSZXNldD9bMSwwLDJdOlsxLDBdOnIuc29ydFJlc2V0P1swLDEsMl06WzAsMV0sbG9ja2VkT3JkZXI6ITF9LHZvaWQgMCE9PShjPXQuZ2V0RGF0YShnLG4sImxvY2tlZE9yZGVyIil8fCExKSYmITEhPT1jJiYoci5zb3J0VmFyc1tsXS5sb2NrZWRPcmRlcj0hMCxyLnNvcnRWYXJzW2xdLm9yZGVyPXQuZ2V0T3JkZXIoYyk/WzEsMV06WzAsMF0pLHIuaGVhZGVyTGlzdFthXT1vLGcuYWRkQ2xhc3ModC5jc3MuaGVhZGVyKyIgIityLmNzc0hlYWRlciksdC5nZXRDbG9zZXN0KGcsInRyIikuYWRkQ2xhc3ModC5jc3MuaGVhZGVyUm93KyIgIityLmNzc0hlYWRlclJvdykuYXR0cigicm9sZSIsInJvdyIpLHIudGFiSW5kZXgmJmcuYXR0cigidGFiaW5kZXgiLDApLG99KSksci4kaGVhZGVySW5kZXhlZD1bXSxuPTA7bjxyLmNvbHVtbnM7bisrKXQuaXNFbXB0eU9iamVjdChyLnNvcnRWYXJzW25dKSYmKHIuc29ydFZhcnNbbl09e30pLG89ci4kaGVhZGVycy5maWx0ZXIoJ1tkYXRhLWNvbHVtbj0iJytuKyciXScpLHIuJGhlYWRlckluZGV4ZWRbbl09by5sZW5ndGg/by5ub3QoIi5zb3J0ZXItZmFsc2UiKS5sZW5ndGg/by5ub3QoIi5zb3J0ZXItZmFsc2UiKS5maWx0ZXIoIjpsYXN0Iik6by5maWx0ZXIoIjpsYXN0Iik6ZSgpO3IuJHRhYmxlLmZpbmQoci5zZWxlY3RvckhlYWRlcnMpLmF0dHIoe3Njb3BlOiJjb2wiLHJvbGU6ImNvbHVtbmhlYWRlciJ9KSx0LnVwZGF0ZUhlYWRlcihyKSx0LmRlYnVnKHIsImNvcmUiKSYmKGNvbnNvbGUubG9nKCJCdWlsdCBoZWFkZXJzOiIrdC5iZW5jaG1hcmsoYSkpLGNvbnNvbGUubG9nKHIuJGhlYWRlcnMpKX0sYWRkSW5zdGFuY2VNZXRob2RzOmZ1bmN0aW9uKHIpe2UuZXh0ZW5kKHQuaW5zdGFuY2VNZXRob2RzLHIpfSxzZXR1cFBhcnNlcnM6ZnVuY3Rpb24oZSxyKXt2YXIgbyxzLGEsbixpLGwsZCxjLGcscCx1LGYsaCxtLGI9ZS50YWJsZSx5PTAsdz10LmRlYnVnKGUsImNvcmUiKSx4PXt9O2lmKGUuJHRib2RpZXM9ZS4kdGFibGUuY2hpbGRyZW4oInRib2R5Om5vdCguIitlLmNzc0luZm9CbG9jaysiKSIpLGg9dm9pZCAwPT09cj9lLiR0Ym9kaWVzOnIsMD09PShtPWgubGVuZ3RoKSlyZXR1cm4gdz9jb25zb2xlLndhcm4oIldhcm5pbmc6ICpFbXB0eSB0YWJsZSEqIE5vdCBidWlsZGluZyBhIHBhcnNlciBjYWNoZSIpOiIiO2Zvcih3JiYoZj1uZXcgRGF0ZSxjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIkRldGVjdGluZyBwYXJzZXJzIGZvciBlYWNoIGNvbHVtbiIpKSxzPXtleHRyYWN0b3JzOltdLHBhcnNlcnM6W119O3k8bTspe2lmKChvPWhbeV0ucm93cykubGVuZ3RoKWZvcihpPTAsbj1lLmNvbHVtbnMsbD0wO2w8bjtsKyspe2lmKChkPWUuJGhlYWRlckluZGV4ZWRbaV0pJiZkLmxlbmd0aCYmKGM9dC5nZXRDb2x1bW5EYXRhKGIsZS5oZWFkZXJzLGkpLHU9dC5nZXRQYXJzZXJCeUlkKHQuZ2V0RGF0YShkLGMsImV4dHJhY3RvciIpKSxwPXQuZ2V0UGFyc2VyQnlJZCh0LmdldERhdGEoZCxjLCJzb3J0ZXIiKSksZz0iZmFsc2UiPT09dC5nZXREYXRhKGQsYywicGFyc2VyIiksZS5lbXB0aWVzW2ldPSh0LmdldERhdGEoZCxjLCJlbXB0eSIpfHxlLmVtcHR5VG98fChlLmVtcHR5VG9Cb3R0b20/ImJvdHRvbSI6InRvcCIpKS50b0xvd2VyQ2FzZSgpLGUuc3RyaW5nc1tpXT0odC5nZXREYXRhKGQsYywic3RyaW5nIil8fGUuc3RyaW5nVG98fCJtYXgiKS50b0xvd2VyQ2FzZSgpLGcmJihwPXQuZ2V0UGFyc2VyQnlJZCgibm8tcGFyc2VyIikpLHV8fCh1PSExKSxwfHwocD10LmRldGVjdFBhcnNlckZvckNvbHVtbihlLG8sLTEsaSkpLHcmJih4WyIoIitpKyIpICIrZC50ZXh0KCldPXtwYXJzZXI6cC5pZCxleHRyYWN0b3I6dT91LmlkOiJub25lIixzdHJpbmc6ZS5zdHJpbmdzW2ldLGVtcHR5OmUuZW1wdGllc1tpXX0pLHMucGFyc2Vyc1tpXT1wLHMuZXh0cmFjdG9yc1tpXT11LChhPWRbMF0uY29sU3Bhbi0xKT4wKSlmb3IoaSs9YSxuKz1hO2ErMT4wOylzLnBhcnNlcnNbaS1hXT1wLHMuZXh0cmFjdG9yc1tpLWFdPXUsYS0tO2krK315Kz1zLnBhcnNlcnMubGVuZ3RoP206MX13JiYodC5pc0VtcHR5T2JqZWN0KHgpP2NvbnNvbGUud2FybigiICBObyBwYXJzZXJzIGRldGVjdGVkISIpOmNvbnNvbGVbY29uc29sZS50YWJsZT8idGFibGUiOiJsb2ciXSh4KSxjb25zb2xlLmxvZygiQ29tcGxldGVkIGRldGVjdGluZyBwYXJzZXJzIit0LmJlbmNobWFyayhmKSksY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpKSxlLnBhcnNlcnM9cy5wYXJzZXJzLGUuZXh0cmFjdG9ycz1zLmV4dHJhY3RvcnN9LGFkZFBhcnNlcjpmdW5jdGlvbihlKXt2YXIgcixvPXQucGFyc2Vycy5sZW5ndGgscz0hMDtmb3Iocj0wO3I8bztyKyspdC5wYXJzZXJzW3JdLmlkLnRvTG93ZXJDYXNlKCk9PT1lLmlkLnRvTG93ZXJDYXNlKCkmJihzPSExKTtzJiYodC5wYXJzZXJzW3QucGFyc2Vycy5sZW5ndGhdPWUpfSxnZXRQYXJzZXJCeUlkOmZ1bmN0aW9uKGUpe2lmKCJmYWxzZSI9PWUpcmV0dXJuITE7dmFyIHIsbz10LnBhcnNlcnMubGVuZ3RoO2ZvcihyPTA7cjxvO3IrKylpZih0LnBhcnNlcnNbcl0uaWQudG9Mb3dlckNhc2UoKT09PWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKXJldHVybiB0LnBhcnNlcnNbcl07cmV0dXJuITF9LGRldGVjdFBhcnNlckZvckNvbHVtbjpmdW5jdGlvbihyLG8scyxhKXtmb3IodmFyIG4saSxsLGQ9dC5wYXJzZXJzLmxlbmd0aCxjPSExLGc9IiIscD10LmRlYnVnKHIsImNvcmUiKSx1PSEwOyIiPT09ZyYmdTspKGw9b1srK3NdKSYmczw1MD9sLmNsYXNzTmFtZS5pbmRleE9mKHQuY3NzSWdub3JlUm93KTwwJiYoYz1vW3NdLmNlbGxzW2FdLGc9dC5nZXRFbGVtZW50VGV4dChyLGMsYSksaT1lKGMpLHAmJmNvbnNvbGUubG9nKCJDaGVja2luZyBpZiB2YWx1ZSB3YXMgZW1wdHkgb24gcm93ICIrcysiLCBjb2x1bW46ICIrYSsnOiAiJytnKyciJykpOnU9ITE7Zm9yKDstLWQ+PTA7KWlmKChuPXQucGFyc2Vyc1tkXSkmJiJ0ZXh0IiE9PW4uaWQmJm4uaXMmJm4uaXMoZyxyLnRhYmxlLGMsaSkpcmV0dXJuIG47cmV0dXJuIHQuZ2V0UGFyc2VyQnlJZCgidGV4dCIpfSxnZXRFbGVtZW50VGV4dDpmdW5jdGlvbihyLG8scyl7aWYoIW8pcmV0dXJuIiI7dmFyIGEsbj1yLnRleHRFeHRyYWN0aW9ufHwiIixpPW8uanF1ZXJ5P286ZShvKTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIG4/ImJhc2ljIj09PW4mJnZvaWQgMCE9PShhPWkuYXR0cihyLnRleHRBdHRyaWJ1dGUpKT9lLnRyaW0oYSk6ZS50cmltKG8udGV4dENvbnRlbnR8fGkudGV4dCgpKToiZnVuY3Rpb24iPT10eXBlb2Ygbj9lLnRyaW0obihpWzBdLHIudGFibGUscykpOiJmdW5jdGlvbiI9PXR5cGVvZihhPXQuZ2V0Q29sdW1uRGF0YShyLnRhYmxlLG4scykpP2UudHJpbShhKGlbMF0sci50YWJsZSxzKSk6ZS50cmltKGlbMF0udGV4dENvbnRlbnR8fGkudGV4dCgpKX0sZ2V0UGFyc2VkVGV4dDpmdW5jdGlvbihlLHIsbyxzKXt2b2lkIDA9PT1zJiYocz10LmdldEVsZW1lbnRUZXh0KGUscixvKSk7dmFyIGE9IiIrcyxuPWUucGFyc2Vyc1tvXSxpPWUuZXh0cmFjdG9yc1tvXTtyZXR1cm4gbiYmKGkmJiJmdW5jdGlvbiI9PXR5cGVvZiBpLmZvcm1hdCYmKHM9aS5mb3JtYXQocyxlLnRhYmxlLHIsbykpLGE9Im5vLXBhcnNlciI9PT1uLmlkPyIiOm4uZm9ybWF0KCIiK3MsZS50YWJsZSxyLG8pLGUuaWdub3JlQ2FzZSYmInN0cmluZyI9PXR5cGVvZiBhJiYoYT1hLnRvTG93ZXJDYXNlKCkpKSxhfSxidWlsZENhY2hlOmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbCxkLGMsZyxwLHUsZixoLG0sYix5LHcseCx2LEMsJCxJLEQsUixUPXIudGFibGUsTD1yLnBhcnNlcnMsQT10LmRlYnVnKHIsImNvcmUiKTtpZihyLiR0Ym9kaWVzPXIuJHRhYmxlLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrci5jc3NJbmZvQmxvY2srIikiKSxnPXZvaWQgMD09PXM/ci4kdGJvZGllczpzLHIuY2FjaGU9e30sci50b3RhbFJvd3M9MCwhTClyZXR1cm4gQT9jb25zb2xlLndhcm4oIldhcm5pbmc6ICpFbXB0eSB0YWJsZSEqIE5vdCBidWlsZGluZyBhIGNhY2hlIik6IiI7Zm9yKEEmJihtPW5ldyBEYXRlKSxyLnNob3dQcm9jZXNzaW5nJiZ0LmlzUHJvY2Vzc2luZyhULCEwKSxjPTA7YzxnLmxlbmd0aDtjKyspe2Zvcih4PVtdLGE9ci5jYWNoZVtjXT17bm9ybWFsaXplZDpbXX0sYj1nW2NdJiZnW2NdLnJvd3MubGVuZ3RofHwwLGw9MDtsPGI7KytsKWlmKHk9e2NoaWxkOltdLHJhdzpbXX0scD1lKGdbY10ucm93c1tsXSksdT1bXSwhcC5oYXNDbGFzcyhyLnNlbGVjdG9yUmVtb3ZlLnNsaWNlKDEpKSlpZihwLmhhc0NsYXNzKHIuY3NzQ2hpbGRSb3cpJiYwIT09bClmb3IoRD1hLm5vcm1hbGl6ZWQubGVuZ3RoLTEsKHc9YS5ub3JtYWxpemVkW0RdW3IuY29sdW1uc10pLiRyb3c9dy4kcm93LmFkZChwKSxwLnByZXYoKS5oYXNDbGFzcyhyLmNzc0NoaWxkUm93KXx8cC5wcmV2KCkuYWRkQ2xhc3ModC5jc3MuY3NzSGFzQ2hpbGQpLGY9cC5jaGlsZHJlbigidGgsIHRkIiksRD13LmNoaWxkLmxlbmd0aCx3LmNoaWxkW0RdPVtdLEM9MCxJPXIuY29sdW1ucyxkPTA7ZDxJO2QrKykoaD1mW2RdKSYmKHcuY2hpbGRbRF1bZF09dC5nZXRQYXJzZWRUZXh0KHIsaCxkKSwodj1mW2RdLmNvbFNwYW4tMSk+MCYmKEMrPXYsSSs9dikpLEMrKztlbHNle2Zvcih5LiRyb3c9cCx5Lm9yZGVyPWwsQz0wLEk9ci5jb2x1bW5zLGQ9MDtkPEk7KytkKXtpZigoaD1wWzBdLmNlbGxzW2RdKSYmQzxyLmNvbHVtbnMmJighKCQ9dm9pZCAwIT09TFtDXSkmJkEmJmNvbnNvbGUud2FybigiTm8gcGFyc2VyIGZvdW5kIGZvciByb3c6ICIrbCsiLCBjb2x1bW46ICIrZCsnOyBjZWxsIGNvbnRhaW5pbmc6ICInK2UoaCkudGV4dCgpKyciOyBkb2VzIGl0IGhhdmUgYSBoZWFkZXI/Jyksbj10LmdldEVsZW1lbnRUZXh0KHIsaCxDKSx5LnJhd1tDXT1uLGk9dC5nZXRQYXJzZWRUZXh0KHIsaCxDLG4pLHVbQ109aSwkJiYibnVtZXJpYyI9PT0oTFtDXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKHhbQ109TWF0aC5tYXgoTWF0aC5hYnMoaSl8fDAseFtDXXx8MCkpLCh2PWguY29sU3Bhbi0xKT4wKSl7Zm9yKFI9MDtSPD12OylpPXIuZHVwbGljYXRlU3Bhbnx8MD09PVI/bjoic3RyaW5nIiE9dHlwZW9mIHIudGV4dEV4dHJhY3Rpb24/dC5nZXRFbGVtZW50VGV4dChyLGgsQytSKXx8IiI6IiIseS5yYXdbQytSXT1pLHVbQytSXT1pLFIrKztDKz12LEkrPXZ9QysrfXVbci5jb2x1bW5zXT15LGEubm9ybWFsaXplZFthLm5vcm1hbGl6ZWQubGVuZ3RoXT11fWEuY29sTWF4PXgsci50b3RhbFJvd3MrPWEubm9ybWFsaXplZC5sZW5ndGh9aWYoci5zaG93UHJvY2Vzc2luZyYmdC5pc1Byb2Nlc3NpbmcoVCksQSl7Zm9yKEQ9TWF0aC5taW4oNSxyLmNhY2hlWzBdLm5vcm1hbGl6ZWQubGVuZ3RoKSxjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIkJ1aWxkaW5nIGNhY2hlIGZvciAiK3IudG90YWxSb3dzKyIgcm93cyAoc2hvd2luZyAiK0QrIiByb3dzIGluIGxvZykgYW5kICIrci5jb2x1bW5zKyIgY29sdW1ucyIrdC5iZW5jaG1hcmsobSkpLG49e30sZD0wO2Q8ci5jb2x1bW5zO2QrKylmb3IoQz0wO0M8RDtDKyspblsicm93OiAiK0NdfHwoblsicm93OiAiK0NdPXt9KSxuWyJyb3c6ICIrQ11bci4kaGVhZGVySW5kZXhlZFtkXS50ZXh0KCldPXIuY2FjaGVbMF0ubm9ybWFsaXplZFtDXVtkXTtjb25zb2xlW2NvbnNvbGUudGFibGU/InRhYmxlIjoibG9nIl0obiksY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpfWUuaXNGdW5jdGlvbihvKSYmbyhUKX0sZ2V0Q29sdW1uVGV4dDpmdW5jdGlvbihyLG8scyxhKXt2YXIgbixpLGwsZCxjLGcscCx1LGYsaCxtPSJmdW5jdGlvbiI9PXR5cGVvZiBzLGI9ImFsbCI9PT1vLHk9e3JhdzpbXSxwYXJzZWQ6W10sJGNlbGw6W119LHc9KHI9ZShyKVswXSkuY29uZmlnO2lmKCF0LmlzRW1wdHlPYmplY3Qodykpe2ZvcihjPXcuJHRib2RpZXMubGVuZ3RoLG49MDtuPGM7bisrKWZvcihnPShsPXcuY2FjaGVbbl0ubm9ybWFsaXplZCkubGVuZ3RoLGk9MDtpPGc7aSsrKWQ9bFtpXSxhJiYhZFt3LmNvbHVtbnNdLiRyb3cuaXMoYSl8fChoPSEwLHU9Yj9kLnNsaWNlKDAsdy5jb2x1bW5zKTpkW29dLGQ9ZFt3LmNvbHVtbnNdLHA9Yj9kLnJhdzpkLnJhd1tvXSxmPWI/ZC4kcm93LmNoaWxkcmVuKCk6ZC4kcm93LmNoaWxkcmVuKCkuZXEobyksbSYmKGg9cyh7dGJvZHlJbmRleDpuLHJvd0luZGV4OmkscGFyc2VkOnUscmF3OnAsJHJvdzpkLiRyb3csJGNlbGw6Zn0pKSwhMSE9PWgmJih5LnBhcnNlZFt5LnBhcnNlZC5sZW5ndGhdPXUseS5yYXdbeS5yYXcubGVuZ3RoXT1wLHkuJGNlbGxbeS4kY2VsbC5sZW5ndGhdPWYpKTtyZXR1cm4geX10LmRlYnVnKHcsImNvcmUiKSYmY29uc29sZS53YXJuKCJObyBjYWNoZSBmb3VuZCAtIGFib3J0aW5nIGdldENvbHVtblRleHQgZnVuY3Rpb24hIil9LHNldEhlYWRlcnNDc3M6ZnVuY3Rpb24ocil7dmFyIG8scyxhPXIuc29ydExpc3Qsbj1hLmxlbmd0aCxpPXQuY3NzLnNvcnROb25lKyIgIityLmNzc05vbmUsbD1bdC5jc3Muc29ydEFzYysiICIrci5jc3NBc2MsdC5jc3Muc29ydERlc2MrIiAiK3IuY3NzRGVzY10sZD1bci5jc3NJY29uQXNjLHIuY3NzSWNvbkRlc2Msci5jc3NJY29uTm9uZV0sYz1bImFzY2VuZGluZyIsImRlc2NlbmRpbmciXSxnPWZ1bmN0aW9uKGUscil7ZS5yZW1vdmVDbGFzcyhpKS5hZGRDbGFzcyhsW3JdKS5hdHRyKCJhcmlhLXNvcnQiLGNbcl0pLmZpbmQoIi4iK3QuY3NzLmljb24pLnJlbW92ZUNsYXNzKGRbMl0pLmFkZENsYXNzKGRbcl0pfSxwPXIuJHRhYmxlLmZpbmQoInRmb290IHRyIikuY2hpbGRyZW4oInRkLCB0aCIpLmFkZChlKHIubmFtZXNwYWNlKyJfZXh0cmFfaGVhZGVycyIpKS5yZW1vdmVDbGFzcyhsLmpvaW4oIiAiKSksdT1yLiRoZWFkZXJzLmFkZChlKCJ0aGVhZCAiK3IubmFtZXNwYWNlKyJfZXh0cmFfaGVhZGVycyIpKS5yZW1vdmVDbGFzcyhsLmpvaW4oIiAiKSkuYWRkQ2xhc3MoaSkuYXR0cigiYXJpYS1zb3J0Iiwibm9uZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLnJlbW92ZUNsYXNzKGQuam9pbigiICIpKS5lbmQoKTtmb3IodS5ub3QoIi5zb3J0ZXItZmFsc2UiKS5maW5kKCIuIit0LmNzcy5pY29uKS5hZGRDbGFzcyhkWzJdKSxyLmNzc0ljb25EaXNhYmxlZCYmdS5maWx0ZXIoIi5zb3J0ZXItZmFsc2UiKS5maW5kKCIuIit0LmNzcy5pY29uKS5hZGRDbGFzcyhyLmNzc0ljb25EaXNhYmxlZCksbz0wO288bjtvKyspaWYoMiE9PWFbb11bMV0pe2lmKHU9ci4kaGVhZGVycy5maWx0ZXIoZnVuY3Rpb24oZSl7Zm9yKHZhciBvPSEwLHM9ci4kaGVhZGVycy5lcShlKSxhPXBhcnNlSW50KHMuYXR0cigiZGF0YS1jb2x1bW4iKSwxMCksbj1hK3QuZ2V0Q2xvc2VzdChzLCJ0aCwgdGQiKVswXS5jb2xTcGFuO2E8bjthKyspbz0hIW8mJihvfHx0LmlzVmFsdWVJbkFycmF5KGEsci5zb3J0TGlzdCk+LTEpO3JldHVybiBvfSksKHU9dS5ub3QoIi5zb3J0ZXItZmFsc2UiKS5maWx0ZXIoJ1tkYXRhLWNvbHVtbj0iJythW29dWzBdKyciXScrKDE9PT1uPyI6bGFzdCI6IiIpKSkubGVuZ3RoKWZvcihzPTA7czx1Lmxlbmd0aDtzKyspdVtzXS5zb3J0RGlzYWJsZWR8fGcodS5lcShzKSxhW29dWzFdKTtwLmxlbmd0aCYmZyhwLmZpbHRlcignW2RhdGEtY29sdW1uPSInK2Fbb11bMF0rJyJdJyksYVtvXVsxXSl9Zm9yKG49ci4kaGVhZGVycy5sZW5ndGgsbz0wO288bjtvKyspdC5zZXRDb2x1bW5BcmlhTGFiZWwocixyLiRoZWFkZXJzLmVxKG8pKX0sZ2V0Q2xvc2VzdDpmdW5jdGlvbih0LHIpe3JldHVybiBlLmZuLmNsb3Nlc3Q/dC5jbG9zZXN0KHIpOnQuaXMocik/dDp0LnBhcmVudHMocikuZmlsdGVyKCI6Zmlyc3QiKX0sc2V0Q29sdW1uQXJpYUxhYmVsOmZ1bmN0aW9uKHIsbyxzKXtpZihvLmxlbmd0aCl7dmFyIGE9cGFyc2VJbnQoby5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxuPXIuc29ydFZhcnNbYV0saT1vLmhhc0NsYXNzKHQuY3NzLnNvcnRBc2MpPyJzb3J0QXNjIjpvLmhhc0NsYXNzKHQuY3NzLnNvcnREZXNjKT8ic29ydERlc2MiOiJzb3J0Tm9uZSIsbD1lLnRyaW0oby50ZXh0KCkpKyI6ICIrdC5sYW5ndWFnZVtpXTtvLmhhc0NsYXNzKCJzb3J0ZXItZmFsc2UiKXx8ITE9PT1zP2wrPXQubGFuZ3VhZ2Uuc29ydERpc2FibGVkOihpPShuLmNvdW50KzEpJW4ub3JkZXIubGVuZ3RoLHM9bi5vcmRlcltpXSxsKz10Lmxhbmd1YWdlWzA9PT1zPyJuZXh0QXNjIjoxPT09cz8ibmV4dERlc2MiOiJuZXh0Tm9uZSJdKSxvLmF0dHIoImFyaWEtbGFiZWwiLGwpfX0sdXBkYXRlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciByLG8scyxhLG49ZS50YWJsZSxpPWUuJGhlYWRlcnMubGVuZ3RoO2ZvcihyPTA7cjxpO3IrKylzPWUuJGhlYWRlcnMuZXEociksYT10LmdldENvbHVtbkRhdGEobixlLmhlYWRlcnMsciwhMCksbz0iZmFsc2UiPT09dC5nZXREYXRhKHMsYSwic29ydGVyIil8fCJmYWxzZSI9PT10LmdldERhdGEocyxhLCJwYXJzZXIiKSx0LnNldENvbHVtblNvcnQoZSxzLG8pfSxzZXRDb2x1bW5Tb3J0OmZ1bmN0aW9uKGUsdCxyKXt2YXIgbz1lLnRhYmxlLmlkO3RbMF0uc29ydERpc2FibGVkPXIsdFtyPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oInNvcnRlci1mYWxzZSIpLmF0dHIoImFyaWEtZGlzYWJsZWQiLCIiK3IpLGUudGFiSW5kZXgmJihyP3QucmVtb3ZlQXR0cigidGFiaW5kZXgiKTp0LmF0dHIoInRhYmluZGV4IiwiMCIpKSxvJiYocj90LnJlbW92ZUF0dHIoImFyaWEtY29udHJvbHMiKTp0LmF0dHIoImFyaWEtY29udHJvbHMiLG8pKX0sdXBkYXRlSGVhZGVyU29ydENvdW50OmZ1bmN0aW9uKHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZyxwPW98fHIuc29ydExpc3QsdT1wLmxlbmd0aDtmb3Ioci5zb3J0TGlzdD1bXSxpPTA7aTx1O2krKylpZihjPXBbaV0sKHM9cGFyc2VJbnQoY1swXSwxMCkpPHIuY29sdW1ucyl7c3dpdGNoKHIuc29ydFZhcnNbc10ub3JkZXJ8fChnPXQuZ2V0T3JkZXIoci5zb3J0SW5pdGlhbE9yZGVyKT9yLnNvcnRSZXNldD9bMSwwLDJdOlsxLDBdOnIuc29ydFJlc2V0P1swLDEsMl06WzAsMV0sci5zb3J0VmFyc1tzXS5vcmRlcj1nLHIuc29ydFZhcnNbc10uY291bnQ9MCksZz1yLnNvcnRWYXJzW3NdLm9yZGVyLGE9KCIiK2NbMV0pLm1hdGNoKC9eKDF8ZHxzfG98bikvKSxhPWE/YVswXToiIil7Y2FzZSIxIjpjYXNlImQiOmE9MTticmVhaztjYXNlInMiOmE9bHx8MDticmVhaztjYXNlIm8iOmE9MD09PShkPWdbKGx8fDApJWcubGVuZ3RoXSk/MToxPT09ZD8wOjI7YnJlYWs7Y2FzZSJuIjphPWdbKytyLnNvcnRWYXJzW3NdLmNvdW50JWcubGVuZ3RoXTticmVhaztkZWZhdWx0OmE9MH1sPTA9PT1pP2E6bCxuPVtzLHBhcnNlSW50KGEsMTApfHwwXSxyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1uLGE9ZS5pbkFycmF5KG5bMV0sZyksci5zb3J0VmFyc1tzXS5jb3VudD1hPj0wP2E6blsxXSVnLmxlbmd0aH19LHVwZGF0ZUFsbDpmdW5jdGlvbihlLHIsbyl7dmFyIHM9ZS50YWJsZTtzLmlzVXBkYXRpbmc9ITAsdC5yZWZyZXNoV2lkZ2V0cyhzLCEwLCEwKSx0LmJ1aWxkSGVhZGVycyhlKSx0LmJpbmRFdmVudHMocyxlLiRoZWFkZXJzLCEwKSx0LmJpbmRNZXRob2RzKGUpLHQuY29tbW9uVXBkYXRlKGUscixvKX0sdXBkYXRlOmZ1bmN0aW9uKGUscixvKXtlLnRhYmxlLmlzVXBkYXRpbmc9ITAsdC51cGRhdGVIZWFkZXIoZSksdC5jb21tb25VcGRhdGUoZSxyLG8pfSx1cGRhdGVIZWFkZXJzOmZ1bmN0aW9uKGUscil7ZS50YWJsZS5pc1VwZGF0aW5nPSEwLHQuYnVpbGRIZWFkZXJzKGUpLHQuYmluZEV2ZW50cyhlLnRhYmxlLGUuJGhlYWRlcnMsITApLHQucmVzb3J0Q29tcGxldGUoZSxyKX0sdXBkYXRlQ2VsbDpmdW5jdGlvbihyLG8scyxhKXtpZihlKG8pLmNsb3Nlc3QoInRyIikuaGFzQ2xhc3Moci5jc3NDaGlsZFJvdykpY29uc29sZS53YXJuKCdUYWJsZXNvcnRlciBXYXJuaW5nISAidXBkYXRlQ2VsbCIgZm9yIGNoaWxkIHJvdyBjb250ZW50IGhhcyBiZWVuIGRpc2FibGVkLCB1c2UgInVwZGF0ZSIgaW5zdGVhZCcpO2Vsc2V7aWYodC5pc0VtcHR5T2JqZWN0KHIuY2FjaGUpKXJldHVybiB0LnVwZGF0ZUhlYWRlcihyKSx2b2lkIHQuY29tbW9uVXBkYXRlKHIscyxhKTtyLnRhYmxlLmlzVXBkYXRpbmc9ITAsci4kdGFibGUuZmluZChyLnNlbGVjdG9yUmVtb3ZlKS5yZW1vdmUoKTt2YXIgbixpLGwsZCxjLGcscD1yLiR0Ym9kaWVzLHU9ZShvKSxmPXAuaW5kZXgodC5nZXRDbG9zZXN0KHUsInRib2R5IikpLGg9ci5jYWNoZVtmXSxtPXQuZ2V0Q2xvc2VzdCh1LCJ0ciIpO2lmKG89dVswXSxwLmxlbmd0aCYmZj49MCl7aWYobD1wLmVxKGYpLmZpbmQoInRyIikubm90KCIuIityLmNzc0NoaWxkUm93KS5pbmRleChtKSxjPWgubm9ybWFsaXplZFtsXSwoZz1tWzBdLmNlbGxzLmxlbmd0aCkhPT1yLmNvbHVtbnMpZm9yKGQ9MCxuPSExLGk9MDtpPGc7aSsrKW58fG1bMF0uY2VsbHNbaV09PT1vP249ITA6ZCs9bVswXS5jZWxsc1tpXS5jb2xTcGFuO2Vsc2UgZD11LmluZGV4KCk7bj10LmdldEVsZW1lbnRUZXh0KHIsbyxkKSxjW3IuY29sdW1uc10ucmF3W2RdPW4sbj10LmdldFBhcnNlZFRleHQocixvLGQsbiksY1tkXT1uLCJudW1lcmljIj09PShyLnBhcnNlcnNbZF0udHlwZXx8IiIpLnRvTG93ZXJDYXNlKCkmJihoLmNvbE1heFtkXT1NYXRoLm1heChNYXRoLmFicyhuKXx8MCxoLmNvbE1heFtkXXx8MCkpLCExIT09KG49InVuZGVmaW5lZCIhPT1zP3M6ci5yZXNvcnQpP3QuY2hlY2tSZXNvcnQocixuLGEpOnQucmVzb3J0Q29tcGxldGUocixhKX1lbHNlIHQuZGVidWcociwiY29yZSIpJiZjb25zb2xlLmVycm9yKCJ1cGRhdGVDZWxsIGFib3J0ZWQsIHRib2R5IG1pc3Npbmcgb3Igbm90IHdpdGhpbiB0aGUgaW5kaWNhdGVkIHRhYmxlIiksci50YWJsZS5pc1VwZGF0aW5nPSExfX0sYWRkUm93czpmdW5jdGlvbihyLG8scyxhKXt2YXIgbixpLGwsZCxjLGcscCx1LGYsaCxtLGIseSx3PSJzdHJpbmciPT10eXBlb2YgbyYmMT09PXIuJHRib2RpZXMubGVuZ3RoJiYvPHRyLy50ZXN0KG98fCIiKSx4PXIudGFibGU7aWYodylvPWUobyksci4kdGJvZGllcy5hcHBlbmQobyk7ZWxzZSBpZighKG8mJm8gaW5zdGFuY2VvZiBlJiZ0LmdldENsb3Nlc3QobywidGFibGUiKVswXT09PXIudGFibGUpKXJldHVybiB0LmRlYnVnKHIsImNvcmUiKSYmY29uc29sZS5lcnJvcigiYWRkUm93cyBtZXRob2QgcmVxdWlyZXMgKDEpIGEgalF1ZXJ5IHNlbGVjdG9yIHJlZmVyZW5jZSB0byByb3dzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIHRhYmxlLCBvciAoMikgcm93IEhUTUwgc3RyaW5nIHRvIGJlIGFkZGVkIHRvIGEgdGFibGUgd2l0aCBvbmx5IG9uZSB0Ym9keSIpLCExO2lmKHguaXNVcGRhdGluZz0hMCx0LmlzRW1wdHlPYmplY3Qoci5jYWNoZSkpdC51cGRhdGVIZWFkZXIociksdC5jb21tb25VcGRhdGUocixzLGEpO2Vsc2V7Zm9yKGM9by5maWx0ZXIoInRyIikuYXR0cigicm9sZSIsInJvdyIpLmxlbmd0aCxsPXIuJHRib2RpZXMuaW5kZXgoby5wYXJlbnRzKCJ0Ym9keSIpLmZpbHRlcigiOmZpcnN0IikpLHIucGFyc2VycyYmci5wYXJzZXJzLmxlbmd0aHx8dC5zZXR1cFBhcnNlcnMociksZD0wO2Q8YztkKyspe2ZvcihmPTAscD1vW2RdLmNlbGxzLmxlbmd0aCx1PXIuY2FjaGVbbF0ubm9ybWFsaXplZC5sZW5ndGgsbT1bXSxoPXtjaGlsZDpbXSxyYXc6W10sJHJvdzpvLmVxKGQpLG9yZGVyOnV9LGc9MDtnPHA7ZysrKWI9b1tkXS5jZWxsc1tnXSxuPXQuZ2V0RWxlbWVudFRleHQocixiLGYpLGgucmF3W2ZdPW4saT10LmdldFBhcnNlZFRleHQocixiLGYsbiksbVtmXT1pLCJudW1lcmljIj09PShyLnBhcnNlcnNbZl0udHlwZXx8IiIpLnRvTG93ZXJDYXNlKCkmJihyLmNhY2hlW2xdLmNvbE1heFtmXT1NYXRoLm1heChNYXRoLmFicyhpKXx8MCxyLmNhY2hlW2xdLmNvbE1heFtmXXx8MCkpLCh5PWIuY29sU3Bhbi0xKT4wJiYoZis9eSksZisrO21bci5jb2x1bW5zXT1oLHIuY2FjaGVbbF0ubm9ybWFsaXplZFt1XT1tfXQuY2hlY2tSZXNvcnQocixzLGEpfX0sdXBkYXRlQ2FjaGU6ZnVuY3Rpb24oZSxyLG8pe2UucGFyc2VycyYmZS5wYXJzZXJzLmxlbmd0aHx8dC5zZXR1cFBhcnNlcnMoZSxvKSx0LmJ1aWxkQ2FjaGUoZSxyLG8pfSxhcHBlbmRDYWNoZTpmdW5jdGlvbihlLHIpe3ZhciBvLHMsYSxuLGksbCxkLGM9ZS50YWJsZSxnPWUuJHRib2RpZXMscD1bXSx1PWUuY2FjaGU7aWYodC5pc0VtcHR5T2JqZWN0KHUpKXJldHVybiBlLmFwcGVuZGVyP2UuYXBwZW5kZXIoYyxwKTpjLmlzVXBkYXRpbmc/ZS4kdGFibGUudHJpZ2dlckhhbmRsZXIoInVwZGF0ZUNvbXBsZXRlIixjKToiIjtmb3IodC5kZWJ1ZyhlLCJjb3JlIikmJihkPW5ldyBEYXRlKSxsPTA7bDxnLmxlbmd0aDtsKyspaWYoKGE9Zy5lcShsKSkubGVuZ3RoKXtmb3Iobj10LnByb2Nlc3NUYm9keShjLGEsITApLHM9KG89dVtsXS5ub3JtYWxpemVkKS5sZW5ndGgsaT0wO2k8cztpKyspcFtwLmxlbmd0aF09b1tpXVtlLmNvbHVtbnNdLiRyb3csZS5hcHBlbmRlciYmKCFlLnBhZ2VyfHxlLnBhZ2VyLnJlbW92ZVJvd3N8fGUucGFnZXIuYWpheCl8fG4uYXBwZW5kKG9baV1bZS5jb2x1bW5zXS4kcm93KTt0LnByb2Nlc3NUYm9keShjLG4sITEpfWUuYXBwZW5kZXImJmUuYXBwZW5kZXIoYyxwKSx0LmRlYnVnKGUsImNvcmUiKSYmY29uc29sZS5sb2coIlJlYnVpbHQgdGFibGUiK3QuYmVuY2htYXJrKGQpKSxyfHxlLmFwcGVuZGVyfHx0LmFwcGx5V2lkZ2V0KGMpLGMuaXNVcGRhdGluZyYmZS4kdGFibGUudHJpZ2dlckhhbmRsZXIoInVwZGF0ZUNvbXBsZXRlIixjKX0sY29tbW9uVXBkYXRlOmZ1bmN0aW9uKGUscixvKXtlLiR0YWJsZS5maW5kKGUuc2VsZWN0b3JSZW1vdmUpLnJlbW92ZSgpLHQuc2V0dXBQYXJzZXJzKGUpLHQuYnVpbGRDYWNoZShlKSx0LmNoZWNrUmVzb3J0KGUscixvKX0saW5pdFNvcnQ6ZnVuY3Rpb24ocixvLHMpe2lmKHIudGFibGUuaXNVcGRhdGluZylyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe3QuaW5pdFNvcnQocixvLHMpfSw1MCk7dmFyIGEsbixpLGwsZCxjLGcscD0hc1tyLnNvcnRNdWx0aVNvcnRLZXldLHU9ci50YWJsZSxmPXIuJGhlYWRlcnMubGVuZ3RoLGg9dC5nZXRDbG9zZXN0KGUobyksInRoLCB0ZCIpLG09cGFyc2VJbnQoaC5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxiPXIuc29ydFZhcnNbbV0ub3JkZXI7aWYoaD1oWzBdLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0U3RhcnQiLHUpLGM9KHIuc29ydFZhcnNbbV0uY291bnQrMSklYi5sZW5ndGgsci5zb3J0VmFyc1ttXS5jb3VudD1zW3Iuc29ydFJlc2V0S2V5XT8yOmMsci5zb3J0UmVzdGFydClmb3IoaT0wO2k8ZjtpKyspZz1yLiRoZWFkZXJzLmVxKGkpLG0hPT0oYz1wYXJzZUludChnLmF0dHIoImRhdGEtY29sdW1uIiksMTApKSYmKHB8fGcuaGFzQ2xhc3ModC5jc3Muc29ydE5vbmUpKSYmKHIuc29ydFZhcnNbY10uY291bnQ9LTEpO2lmKHApe2lmKHIuc29ydExpc3Q9W10sci5sYXN0LnNvcnRMaXN0PVtdLG51bGwhPT1yLnNvcnRGb3JjZSlmb3IoYT1yLnNvcnRGb3JjZSxuPTA7bjxhLmxlbmd0aDtuKyspYVtuXVswXSE9PW0mJihyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1hW25dKTtpZigobD1iW3Iuc29ydFZhcnNbbV0uY291bnRdKTwyJiYoci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20sbF0saC5jb2xTcGFuPjEpKWZvcihuPTE7bjxoLmNvbFNwYW47bisrKXIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVttK24sbF0sci5zb3J0VmFyc1ttK25dLmNvdW50PWUuaW5BcnJheShsLGIpfWVsc2UgaWYoci5zb3J0TGlzdD1lLmV4dGVuZChbXSxyLmxhc3Quc29ydExpc3QpLHQuaXNWYWx1ZUluQXJyYXkobSxyLnNvcnRMaXN0KT49MClmb3Iobj0wO248ci5zb3J0TGlzdC5sZW5ndGg7bisrKShjPXIuc29ydExpc3Rbbl0pWzBdPT09bSYmKGNbMV09YltyLnNvcnRWYXJzW21dLmNvdW50XSwyPT09Y1sxXSYmKHIuc29ydExpc3Quc3BsaWNlKG4sMSksci5zb3J0VmFyc1ttXS5jb3VudD0tMSkpO2Vsc2UgaWYoKGw9YltyLnNvcnRWYXJzW21dLmNvdW50XSk8MiYmKHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVttLGxdLGguY29sU3Bhbj4xKSlmb3Iobj0xO248aC5jb2xTcGFuO24rKylyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1bbStuLGxdLHIuc29ydFZhcnNbbStuXS5jb3VudD1lLmluQXJyYXkobCxiKTtpZihyLmxhc3Quc29ydExpc3Q9ZS5leHRlbmQoW10sci5zb3J0TGlzdCksci5zb3J0TGlzdC5sZW5ndGgmJnIuc29ydEFwcGVuZCYmKGE9ZS5pc0FycmF5KHIuc29ydEFwcGVuZCk/ci5zb3J0QXBwZW5kOnIuc29ydEFwcGVuZFtyLnNvcnRMaXN0WzBdWzBdXSwhdC5pc0VtcHR5T2JqZWN0KGEpKSlmb3Iobj0wO248YS5sZW5ndGg7bisrKWlmKGFbbl1bMF0hPT1tJiZ0LmlzVmFsdWVJbkFycmF5KGFbbl1bMF0sci5zb3J0TGlzdCk8MCl7aWYobD1hW25dWzFdLGQ9KCIiK2wpLm1hdGNoKC9eKGF8ZHxzfG98bikvKSlzd2l0Y2goYz1yLnNvcnRMaXN0WzBdWzFdLGRbMF0pe2Nhc2UiZCI6bD0xO2JyZWFrO2Nhc2UicyI6bD1jO2JyZWFrO2Nhc2UibyI6bD0wPT09Yz8xOjA7YnJlYWs7Y2FzZSJuIjpsPShjKzEpJWIubGVuZ3RoO2JyZWFrO2RlZmF1bHQ6bD0wfXIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVthW25dWzBdLGxdfXIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVnaW4iLHUpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnNldEhlYWRlcnNDc3MociksdC5tdWx0aXNvcnQociksdC5hcHBlbmRDYWNoZShyKSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEJlZm9yZUVuZCIsdSksci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRFbmQiLHUpfSwxKX0sbXVsdGlzb3J0OmZ1bmN0aW9uKGUpe3ZhciByLG8scyxhLG49ZS50YWJsZSxpPVtdLGw9MCxkPWUudGV4dFNvcnRlcnx8IiIsYz1lLnNvcnRMaXN0LGc9Yy5sZW5ndGgscD1lLiR0Ym9kaWVzLmxlbmd0aDtpZighZS5zZXJ2ZXJTaWRlU29ydGluZyYmIXQuaXNFbXB0eU9iamVjdChlLmNhY2hlKSl7aWYodC5kZWJ1ZyhlLCJjb3JlIikmJihvPW5ldyBEYXRlKSwib2JqZWN0Ij09dHlwZW9mIGQpZm9yKHM9ZS5jb2x1bW5zO3MtLTspImZ1bmN0aW9uIj09dHlwZW9mKGE9dC5nZXRDb2x1bW5EYXRhKG4sZCxzKSkmJihpW3NdPWEpO2ZvcihyPTA7cjxwO3IrKylzPWUuY2FjaGVbcl0uY29sTWF4LGUuY2FjaGVbcl0ubm9ybWFsaXplZC5zb3J0KGZ1bmN0aW9uKHIsbyl7dmFyIGEscCx1LGYsaCxtLGI7Zm9yKGE9MDthPGc7YSsrKXtpZih1PWNbYV1bMF0sZj1jW2FdWzFdLGw9MD09PWYsZS5zb3J0U3RhYmxlJiZyW3VdPT09b1t1XSYmMT09PWcpcmV0dXJuIHJbZS5jb2x1bW5zXS5vcmRlci1vW2UuY29sdW1uc10ub3JkZXI7aWYocD0vbi9pLnRlc3QodC5nZXRTb3J0VHlwZShlLnBhcnNlcnMsdSkpLHAmJmUuc3RyaW5nc1t1XT8ocD0iYm9vbGVhbiI9PXR5cGVvZiB0LnN0cmluZ1tlLnN0cmluZ3NbdV1dPyhsPzE6LTEpKih0LnN0cmluZ1tlLnN0cmluZ3NbdV1dPy0xOjEpOmUuc3RyaW5nc1t1XT90LnN0cmluZ1tlLnN0cmluZ3NbdV1dfHwwOjAsaD1lLm51bWJlclNvcnRlcj9lLm51bWJlclNvcnRlcihyW3VdLG9bdV0sbCxzW3VdLG4pOnRbInNvcnROdW1lcmljIisobD8iQXNjIjoiRGVzYyIpXShyW3VdLG9bdV0scCxzW3VdLHUsZSkpOihtPWw/cjpvLGI9bD9vOnIsaD0iZnVuY3Rpb24iPT10eXBlb2YgZD9kKG1bdV0sYlt1XSxsLHUsbik6ImZ1bmN0aW9uIj09dHlwZW9mIGlbdV0/aVt1XShtW3VdLGJbdV0sbCx1LG4pOnRbInNvcnROYXR1cmFsIisobD8iQXNjIjoiRGVzYyIpXShyW3VdLG9bdV0sdSxlKSksaClyZXR1cm4gaH1yZXR1cm4gcltlLmNvbHVtbnNdLm9yZGVyLW9bZS5jb2x1bW5zXS5vcmRlcn0pO3QuZGVidWcoZSwiY29yZSIpJiZjb25zb2xlLmxvZygiQXBwbHlpbmcgc29ydCAiK2MudG9TdHJpbmcoKSt0LmJlbmNobWFyayhvKSl9fSxyZXNvcnRDb21wbGV0ZTpmdW5jdGlvbih0LHIpe3QudGFibGUuaXNVcGRhdGluZyYmdC4kdGFibGUudHJpZ2dlckhhbmRsZXIoInVwZGF0ZUNvbXBsZXRlIix0LnRhYmxlKSxlLmlzRnVuY3Rpb24ocikmJnIodC50YWJsZSl9LGNoZWNrUmVzb3J0OmZ1bmN0aW9uKHIsbyxzKXt2YXIgYT1lLmlzQXJyYXkobyk/bzpyLnNvcnRMaXN0OyExPT09KHZvaWQgMD09PW8/ci5yZXNvcnQ6byl8fHIuc2VydmVyU2lkZVNvcnRpbmd8fHIudGFibGUuaXNQcm9jZXNzaW5nPyh0LnJlc29ydENvbXBsZXRlKHIscyksdC5hcHBseVdpZGdldChyLnRhYmxlLCExKSk6YS5sZW5ndGg/dC5zb3J0T24ocixhLGZ1bmN0aW9uKCl7dC5yZXNvcnRDb21wbGV0ZShyLHMpfSwhMCk6dC5zb3J0UmVzZXQocixmdW5jdGlvbigpe3QucmVzb3J0Q29tcGxldGUocixzKSx0LmFwcGx5V2lkZ2V0KHIudGFibGUsITEpfSl9LHNvcnRPbjpmdW5jdGlvbihyLG8scyxhKXt2YXIgbj1yLnRhYmxlO3IuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0U3RhcnQiLG4pLHQudXBkYXRlSGVhZGVyU29ydENvdW50KHIsbyksdC5zZXRIZWFkZXJzQ3NzKHIpLHIuZGVsYXlJbml0JiZ0LmlzRW1wdHlPYmplY3Qoci5jYWNoZSkmJnQuYnVpbGRDYWNoZShyKSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEJlZ2luIixuKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIsYSksci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRCZWZvcmVFbmQiLG4pLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0RW5kIixuKSx0LmFwcGx5V2lkZ2V0KG4pLGUuaXNGdW5jdGlvbihzKSYmcyhuKX0sc29ydFJlc2V0OmZ1bmN0aW9uKHIsbyl7ci5zb3J0TGlzdD1bXSx0LnNldEhlYWRlcnNDc3MociksdC5tdWx0aXNvcnQociksdC5hcHBlbmRDYWNoZShyKTt2YXIgcztmb3Iocz0wO3M8ci5jb2x1bW5zO3MrKylyLnNvcnRWYXJzW3NdLmNvdW50PS0xO2UuaXNGdW5jdGlvbihvKSYmbyhyLnRhYmxlKX0sZ2V0U29ydFR5cGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmZVt0XT9lW3RdLnR5cGV8fCIiOiIifSxnZXRPcmRlcjpmdW5jdGlvbihlKXtyZXR1cm4vXmQvaS50ZXN0KGUpfHwxPT09ZX0sc29ydE5hdHVyYWw6ZnVuY3Rpb24oZSxyKXtpZihlPT09cilyZXR1cm4gMDtlPWUudG9TdHJpbmcoKSxyPXIudG9TdHJpbmcoKTt2YXIgbyxzLGEsbixpLGwsZD10LnJlZ2V4O2lmKGQuaGV4LnRlc3Qocikpe2lmKG89cGFyc2VJbnQoKGV8fCIiKS5tYXRjaChkLmhleCksMTYpLHM9cGFyc2VJbnQoKHJ8fCIiKS5tYXRjaChkLmhleCksMTYpLG88cylyZXR1cm4tMTtpZihvPnMpcmV0dXJuIDF9Zm9yKG89KGV8fCIiKS5yZXBsYWNlKGQuY2h1bmssIlxcMCQxXFwwIikucmVwbGFjZShkLmNodW5rcywiIikuc3BsaXQoIlxcMCIpLHM9KHJ8fCIiKS5yZXBsYWNlKGQuY2h1bmssIlxcMCQxXFwwIikucmVwbGFjZShkLmNodW5rcywiIikuc3BsaXQoIlxcMCIpLGw9TWF0aC5tYXgoby5sZW5ndGgscy5sZW5ndGgpLGk9MDtpPGw7aSsrKXtpZihhPWlzTmFOKG9baV0pP29baV18fDA6cGFyc2VGbG9hdChvW2ldKXx8MCxuPWlzTmFOKHNbaV0pP3NbaV18fDA6cGFyc2VGbG9hdChzW2ldKXx8MCxpc05hTihhKSE9PWlzTmFOKG4pKXJldHVybiBpc05hTihhKT8xOi0xO2lmKHR5cGVvZiBhIT10eXBlb2YgbiYmKGErPSIiLG4rPSIiKSxhPG4pcmV0dXJuLTE7aWYoYT5uKXJldHVybiAxfXJldHVybiAwfSxzb3J0TmF0dXJhbEFzYzpmdW5jdGlvbihlLHIsbyxzKXtpZihlPT09cilyZXR1cm4gMDt2YXIgYT10LnN0cmluZ1tzLmVtcHRpZXNbb118fHMuZW1wdHlUb107cmV0dXJuIiI9PT1lJiYwIT09YT8iYm9vbGVhbiI9PXR5cGVvZiBhP2E/LTE6MTotYXx8LTE6IiI9PT1yJiYwIT09YT8iYm9vbGVhbiI9PXR5cGVvZiBhP2E/MTotMTphfHwxOnQuc29ydE5hdHVyYWwoZSxyKX0sc29ydE5hdHVyYWxEZXNjOmZ1bmN0aW9uKGUscixvLHMpe2lmKGU9PT1yKXJldHVybiAwO3ZhciBhPXQuc3RyaW5nW3MuZW1wdGllc1tvXXx8cy5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8tMToxOmF8fDE6IiI9PT1yJiYwIT09YT8iYm9vbGVhbiI9PXR5cGVvZiBhP2E/MTotMTotYXx8LTE6dC5zb3J0TmF0dXJhbChyLGUpfSxzb3J0VGV4dDpmdW5jdGlvbihlLHQpe3JldHVybiBlPnQ/MTplPHQ/LTE6MH0sZ2V0VGV4dFZhbHVlOmZ1bmN0aW9uKGUsdCxyKXtpZihyKXt2YXIgbyxzPWU/ZS5sZW5ndGg6MCxhPXIrdDtmb3Iobz0wO288cztvKyspYSs9ZS5jaGFyQ29kZUF0KG8pO3JldHVybiB0KmF9cmV0dXJuIDB9LHNvcnROdW1lcmljQXNjOmZ1bmN0aW9uKGUscixvLHMsYSxuKXtpZihlPT09cilyZXR1cm4gMDt2YXIgaT10LnN0cmluZ1tuLmVtcHRpZXNbYV18fG4uZW1wdHlUb107cmV0dXJuIiI9PT1lJiYwIT09aT8iYm9vbGVhbiI9PXR5cGVvZiBpP2k/LTE6MTotaXx8LTE6IiI9PT1yJiYwIT09aT8iYm9vbGVhbiI9PXR5cGVvZiBpP2k/MTotMTppfHwxOihpc05hTihlKSYmKGU9dC5nZXRUZXh0VmFsdWUoZSxvLHMpKSxpc05hTihyKSYmKHI9dC5nZXRUZXh0VmFsdWUocixvLHMpKSxlLXIpfSxzb3J0TnVtZXJpY0Rlc2M6ZnVuY3Rpb24oZSxyLG8scyxhLG4pe2lmKGU9PT1yKXJldHVybiAwO3ZhciBpPXQuc3RyaW5nW24uZW1wdGllc1thXXx8bi5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8tMToxOml8fDE6IiI9PT1yJiYwIT09aT8iYm9vbGVhbiI9PXR5cGVvZiBpP2k/MTotMTotaXx8LTE6KGlzTmFOKGUpJiYoZT10LmdldFRleHRWYWx1ZShlLG8scykpLGlzTmFOKHIpJiYocj10LmdldFRleHRWYWx1ZShyLG8scykpLHItZSl9LHNvcnROdW1lcmljOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUtdH0sYWRkV2lkZ2V0OmZ1bmN0aW9uKGUpe2UuaWQmJiF0LmlzRW1wdHlPYmplY3QodC5nZXRXaWRnZXRCeUlkKGUuaWQpKSYmY29uc29sZS53YXJuKCciJytlLmlkKyciIHdpZGdldCB3YXMgbG9hZGVkIG1vcmUgdGhhbiBvbmNlIScpLHQud2lkZ2V0c1t0LndpZGdldHMubGVuZ3RoXT1lfSxoYXNXaWRnZXQ6ZnVuY3Rpb24odCxyKXtyZXR1cm4odD1lKHQpKS5sZW5ndGgmJnRbMF0uY29uZmlnJiZ0WzBdLmNvbmZpZy53aWRnZXRJbml0W3JdfHwhMX0sZ2V0V2lkZ2V0QnlJZDpmdW5jdGlvbihlKXt2YXIgcixvLHM9dC53aWRnZXRzLmxlbmd0aDtmb3Iocj0wO3I8cztyKyspaWYoKG89dC53aWRnZXRzW3JdKSYmby5pZCYmby5pZC50b0xvd2VyQ2FzZSgpPT09ZS50b0xvd2VyQ2FzZSgpKXJldHVybiBvfSxhcHBseVdpZGdldE9wdGlvbnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG49ci5jb25maWcsaT1uLndpZGdldHMubGVuZ3RoO2lmKGkpZm9yKG89MDtvPGk7bysrKShzPXQuZ2V0V2lkZ2V0QnlJZChuLndpZGdldHNbb10pKSYmcy5vcHRpb25zJiYoYT1lLmV4dGVuZCghMCx7fSxzLm9wdGlvbnMpLG4ud2lkZ2V0T3B0aW9ucz1lLmV4dGVuZCghMCxhLG4ud2lkZ2V0T3B0aW9ucyksZS5leHRlbmQoITAsdC5kZWZhdWx0cy53aWRnZXRPcHRpb25zLHMub3B0aW9ucykpfSxhZGRXaWRnZXRGcm9tQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzPWUuY29uZmlnLGE9Il4iK3Mud2lkZ2V0Q2xhc3MucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlTmFtZSwiKFxcUyspKyIpKyIkIixuPW5ldyBSZWdFeHAoYSwiZyIpLGk9KGUuY2xhc3NOYW1lfHwiIikuc3BsaXQodC5yZWdleC5zcGFjZXMpO2lmKGkubGVuZ3RoKWZvcihyPWkubGVuZ3RoLG89MDtvPHI7bysrKWlbb10ubWF0Y2gobikmJihzLndpZGdldHNbcy53aWRnZXRzLmxlbmd0aF09aVtvXS5yZXBsYWNlKG4sIiQxIikpfSxhcHBseVdpZGdldElkOmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbD0ocj1lKHIpWzBdKS5jb25maWcsZD1sLndpZGdldE9wdGlvbnMsYz10LmRlYnVnKGwsImNvcmUiKSxnPXQuZ2V0V2lkZ2V0QnlJZChvKTtnJiYoaT1nLmlkLGE9ITEsZS5pbkFycmF5KGksbC53aWRnZXRzKTwwJiYobC53aWRnZXRzW2wud2lkZ2V0cy5sZW5ndGhdPWkpLGMmJihuPW5ldyBEYXRlKSwhcyYmbC53aWRnZXRJbml0W2ldfHwobC53aWRnZXRJbml0W2ldPSEwLHIuaGFzSW5pdGlhbGl6ZWQmJnQuYXBwbHlXaWRnZXRPcHRpb25zKHIpLCJmdW5jdGlvbiI9PXR5cGVvZiBnLmluaXQmJihhPSEwLGMmJmNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiSW5pdGlhbGl6aW5nICIraSsiIHdpZGdldCIpLGcuaW5pdChyLGcsbCxkKSkpLHN8fCJmdW5jdGlvbiIhPXR5cGVvZiBnLmZvcm1hdHx8KGE9ITAsYyYmY29uc29sZVtjb25zb2xlLmdyb3VwPyJncm91cCI6ImxvZyJdKCJVcGRhdGluZyAiK2krIiB3aWRnZXQiKSxnLmZvcm1hdChyLGwsZCwhMSkpLGMmJmEmJihjb25zb2xlLmxvZygiQ29tcGxldGVkICIrKHM/ImluaXRpYWxpemluZyAiOiJhcHBseWluZyAiKStpKyIgd2lkZ2V0Iit0LmJlbmNobWFyayhuKSksY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpKSl9LGFwcGx5V2lkZ2V0OmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbCxkLGM9KHI9ZShyKVswXSkuY29uZmlnLGc9dC5kZWJ1ZyhjLCJjb3JlIikscD1bXTtpZighMT09PW98fCFyLmhhc0luaXRpYWxpemVkfHwhci5pc0FwcGx5aW5nV2lkZ2V0cyYmIXIuaXNVcGRhdGluZyl7aWYoZyYmKGQ9bmV3IERhdGUpLHQuYWRkV2lkZ2V0RnJvbUNsYXNzKHIpLGNsZWFyVGltZW91dChjLnRpbWVyUmVhZHkpLGMud2lkZ2V0cy5sZW5ndGgpe2ZvcihyLmlzQXBwbHlpbmdXaWRnZXRzPSEwLGMud2lkZ2V0cz1lLmdyZXAoYy53aWRnZXRzLGZ1bmN0aW9uKHQscil7cmV0dXJuIGUuaW5BcnJheSh0LGMud2lkZ2V0cyk9PT1yfSksbj0oaT1jLndpZGdldHN8fFtdKS5sZW5ndGgsYT0wO2E8bjthKyspKGw9dC5nZXRXaWRnZXRCeUlkKGlbYV0pKSYmbC5pZD8obC5wcmlvcml0eXx8KGwucHJpb3JpdHk9MTApLHBbYV09bCk6ZyYmY29uc29sZS53YXJuKCciJytpW2FdKyciIHdhcyBlbmFibGVkLCBidXQgdGhlIHdpZGdldCBjb2RlIGhhcyBub3QgYmVlbiBsb2FkZWQhJyk7Zm9yKHAuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLnByaW9yaXR5PHQucHJpb3JpdHk/LTE6ZS5wcmlvcml0eT09PXQucHJpb3JpdHk/MDoxfSksbj1wLmxlbmd0aCxnJiZjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIlN0YXJ0ICIrKG8/ImluaXRpYWxpemluZyI6ImFwcGx5aW5nIikrIiB3aWRnZXRzIiksYT0wO2E8bjthKyspKGw9cFthXSkmJmwuaWQmJnQuYXBwbHlXaWRnZXRJZChyLGwuaWQsbyk7ZyYmY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpfWMudGltZXJSZWFkeT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5pc0FwcGx5aW5nV2lkZ2V0cz0hMSxlLmRhdGEociwibGFzdFdpZGdldEFwcGxpY2F0aW9uIixuZXcgRGF0ZSksYy4kdGFibGUudHJpZ2dlckhhbmRsZXIoInRhYmxlc29ydGVyLXJlYWR5Iiksb3x8ImZ1bmN0aW9uIiE9dHlwZW9mIHN8fHMociksZyYmKGw9Yy53aWRnZXRzLmxlbmd0aCxjb25zb2xlLmxvZygiQ29tcGxldGVkICIrKCEwPT09bz8iaW5pdGlhbGl6aW5nICI6ImFwcGx5aW5nICIpK2wrIiB3aWRnZXQiKygxIT09bD8icyI6IiIpK3QuYmVuY2htYXJrKGQpKSl9LDEwKX19LHJlbW92ZVdpZGdldDpmdW5jdGlvbihyLG8scyl7dmFyIGEsbixpLGwsZD0ocj1lKHIpWzBdKS5jb25maWc7aWYoITA9PT1vKWZvcihvPVtdLGw9dC53aWRnZXRzLmxlbmd0aCxpPTA7aTxsO2krKykobj10LndpZGdldHNbaV0pJiZuLmlkJiYob1tvLmxlbmd0aF09bi5pZCk7ZWxzZSBvPShlLmlzQXJyYXkobyk/by5qb2luKCIsIik6b3x8IiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1tccyxdKy8pO2ZvcihsPW8ubGVuZ3RoLGE9MDthPGw7YSsrKW49dC5nZXRXaWRnZXRCeUlkKG9bYV0pLChpPWUuaW5BcnJheShvW2FdLGQud2lkZ2V0cykpPj0wJiYhMCE9PXMmJmQud2lkZ2V0cy5zcGxpY2UoaSwxKSxuJiZuLnJlbW92ZSYmKHQuZGVidWcoZCwiY29yZSIpJiZjb25zb2xlLmxvZygocz8iUmVmcmVzaGluZyI6IlJlbW92aW5nIikrJyAiJytvW2FdKyciIHdpZGdldCcpLG4ucmVtb3ZlKHIsZCxkLndpZGdldE9wdGlvbnMscyksZC53aWRnZXRJbml0W29bYV1dPSExKTtkLiR0YWJsZS50cmlnZ2VySGFuZGxlcigid2lkZ2V0UmVtb3ZlRW5kIixyKX0scmVmcmVzaFdpZGdldHM6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saT0ocj1lKHIpWzBdKS5jb25maWcud2lkZ2V0cyxsPXQud2lkZ2V0cyxkPWwubGVuZ3RoLGM9W10sZz1mdW5jdGlvbih0KXtlKHQpLnRyaWdnZXJIYW5kbGVyKCJyZWZyZXNoQ29tcGxldGUiKX07Zm9yKGE9MDthPGQ7YSsrKShuPWxbYV0pJiZuLmlkJiYob3x8ZS5pbkFycmF5KG4uaWQsaSk8MCkmJihjW2MubGVuZ3RoXT1uLmlkKTt0LnJlbW92ZVdpZGdldChyLGMuam9pbigiLCIpLCEwKSwhMCE9PXM/KHQuYXBwbHlXaWRnZXQocixvfHwhMSxnKSxvJiZ0LmFwcGx5V2lkZ2V0KHIsITEsZykpOmcocil9LGJlbmNobWFyazpmdW5jdGlvbihlKXtyZXR1cm4iICgiKygobmV3IERhdGUpLmdldFRpbWUoKS1lLmdldFRpbWUoKSkrIiBtcykifSxsb2c6ZnVuY3Rpb24oKXtjb25zb2xlLmxvZyhhcmd1bWVudHMpfSxkZWJ1ZzpmdW5jdGlvbihlLHQpe3JldHVybiBlJiYoITA9PT1lLmRlYnVnfHwic3RyaW5nIj09dHlwZW9mIGUuZGVidWcmJmUuZGVidWcuaW5kZXhPZih0KT4tMSl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGlzVmFsdWVJbkFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIHIsbz10JiZ0Lmxlbmd0aHx8MDtmb3Iocj0wO3I8bztyKyspaWYodFtyXVswXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9LGZvcm1hdEZsb2F0OmZ1bmN0aW9uKHIsbyl7aWYoInN0cmluZyIhPXR5cGVvZiByfHwiIj09PXIpcmV0dXJuIHI7dmFyIHM7cmV0dXJuIHI9KG8mJm8uY29uZmlnPyExIT09by5jb25maWcudXNOdW1iZXJGb3JtYXQ6dm9pZCAwPT09b3x8byk/ci5yZXBsYWNlKHQucmVnZXguY29tbWEsIiIpOnIucmVwbGFjZSh0LnJlZ2V4LmRpZ2l0Tm9uVVMsIiIpLnJlcGxhY2UodC5yZWdleC5jb21tYSwiLiIpLHQucmVnZXguZGlnaXROZWdhdGl2ZVRlc3QudGVzdChyKSYmKHI9ci5yZXBsYWNlKHQucmVnZXguZGlnaXROZWdhdGl2ZVJlcGxhY2UsIi0kMSIpKSxzPXBhcnNlRmxvYXQociksaXNOYU4ocyk/ZS50cmltKHIpOnN9LGlzRGlnaXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGlzTmFOKGUpP3QucmVnZXguZGlnaXRUZXN0LnRlc3QoZS50b1N0cmluZygpLnJlcGxhY2UodC5yZWdleC5kaWdpdFJlcGxhY2UsIiIpKToiIiE9PWV9LGNvbXB1dGVDb2x1bW5JbmRleDpmdW5jdGlvbihyLG8pe3ZhciBzLGEsbixpLGwsZCxjLGcscCx1LGY9byYmby5jb2x1bW5zfHwwLGg9W10sbT1uZXcgQXJyYXkoZik7Zm9yKHM9MDtzPHIubGVuZ3RoO3MrKylmb3IoZD1yW3NdLmNlbGxzLGE9MDthPGQubGVuZ3RoO2ErKyl7Zm9yKGM9cyxnPShsPWRbYV0pLnJvd1NwYW58fDEscD1sLmNvbFNwYW58fDEsdm9pZCAwPT09aFtjXSYmKGhbY109W10pLG49MDtuPGhbY10ubGVuZ3RoKzE7bisrKWlmKHZvaWQgMD09PWhbY11bbl0pe3U9bjticmVha31mb3IoZiYmbC5jZWxsSW5kZXg9PT11fHwobC5zZXRBdHRyaWJ1dGU/bC5zZXRBdHRyaWJ1dGUoImRhdGEtY29sdW1uIix1KTplKGwpLmF0dHIoImRhdGEtY29sdW1uIix1KSksbj1jO248YytnO24rKylmb3Iodm9pZCAwPT09aFtuXSYmKGhbbl09W10pLG09aFtuXSxpPXU7aTx1K3A7aSsrKW1baV09IngifXJldHVybiB0LmNoZWNrQ29sdW1uQ291bnQocixoLG0ubGVuZ3RoKSxtLmxlbmd0aH0sY2hlY2tDb2x1bW5Db3VudDpmdW5jdGlvbihlLHQscil7dmFyIG8scyxhPSEwLG49W107Zm9yKG89MDtvPHQubGVuZ3RoO28rKylpZih0W29dJiYocz10W29dLmxlbmd0aCx0W29dLmxlbmd0aCE9PXIpKXthPSExO2JyZWFrfWF8fChlLmVhY2goZnVuY3Rpb24oZSx0KXt2YXIgcj10LnBhcmVudEVsZW1lbnQubm9kZU5hbWU7bi5pbmRleE9mKHIpPDAmJm4ucHVzaChyKX0pLGNvbnNvbGUuZXJyb3IoIkludmFsaWQgb3IgaW5jb3JyZWN0IG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSAiK24uam9pbigiIG9yICIpKyI7IGV4cGVjdGVkICIrcisiLCBidXQgZm91bmQgIitzKyIgY29sdW1ucyIpKX0sZml4Q29sdW1uV2lkdGg6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG4saSxsPShyPWUocilbMF0pLmNvbmZpZyxkPWwuJHRhYmxlLmNoaWxkcmVuKCJjb2xncm91cCIpO2lmKGQubGVuZ3RoJiZkLmhhc0NsYXNzKHQuY3NzLmNvbGdyb3VwKSYmZC5yZW1vdmUoKSxsLndpZHRoRml4ZWQmJjA9PT1sLiR0YWJsZS5jaGlsZHJlbigiY29sZ3JvdXAiKS5sZW5ndGgpe2ZvcihkPWUoJzxjb2xncm91cCBjbGFzcz0iJyt0LmNzcy5jb2xncm91cCsnIj4nKSxvPWwuJHRhYmxlLndpZHRoKCksbj0oYT1sLiR0Ym9kaWVzLmZpbmQoInRyOmZpcnN0IikuY2hpbGRyZW4oIjp2aXNpYmxlIikpLmxlbmd0aCxpPTA7aTxuO2krKylzPXBhcnNlSW50KGEuZXEoaSkud2lkdGgoKS9vKjFlMywxMCkvMTArIiUiLGQuYXBwZW5kKGUoIjxjb2w+IikuY3NzKCJ3aWR0aCIscykpO2wuJHRhYmxlLnByZXBlbmQoZCl9fSxnZXREYXRhOmZ1bmN0aW9uKHQscixvKXt2YXIgcyxhLG49IiIsaT1lKHQpO3JldHVybiBpLmxlbmd0aD8ocz0hIWUubWV0YWRhdGEmJmkubWV0YWRhdGEoKSxhPSIgIisoaS5hdHRyKCJjbGFzcyIpfHwiIiksdm9pZCAwIT09aS5kYXRhKG8pfHx2b2lkIDAhPT1pLmRhdGEoby50b0xvd2VyQ2FzZSgpKT9uKz1pLmRhdGEobyl8fGkuZGF0YShvLnRvTG93ZXJDYXNlKCkpOnMmJnZvaWQgMCE9PXNbb10/bis9c1tvXTpyJiZ2b2lkIDAhPT1yW29dP24rPXJbb106IiAiIT09YSYmYS5tYXRjaCgiICIrbysiLSIpJiYobj1hLm1hdGNoKG5ldyBSZWdFeHAoIlxccyIrbysiLShbXFx3LV0rKSIpKVsxXXx8IiIpLGUudHJpbShuKSk6IiJ9LGdldENvbHVtbkRhdGE6ZnVuY3Rpb24odCxyLG8scyxhKXtpZigib2JqZWN0IiE9dHlwZW9mIHJ8fG51bGw9PT1yKXJldHVybiByO3ZhciBuLGk9KHQ9ZSh0KVswXSkuY29uZmlnLGw9YXx8aS4kaGVhZGVycyxkPWkuJGhlYWRlckluZGV4ZWQmJmkuJGhlYWRlckluZGV4ZWRbb118fGwuZmluZCgnW2RhdGEtY29sdW1uPSInK28rJyJdOmxhc3QnKTtpZih2b2lkIDAhPT1yW29dKXJldHVybiBzP3Jbb106cltsLmluZGV4KGQpXTtmb3IobiBpbiByKWlmKCJzdHJpbmciPT10eXBlb2YgbiYmZC5maWx0ZXIobikuYWRkKGQuZmluZChuKSkubGVuZ3RoKXJldHVybiByW25dfSxpc1Byb2Nlc3Npbmc6ZnVuY3Rpb24ocixvLHMpe3ZhciBhPShyPWUocikpWzBdLmNvbmZpZyxuPXN8fHIuZmluZCgiLiIrdC5jc3MuaGVhZGVyKTtvPyh2b2lkIDAhPT1zJiZhLnNvcnRMaXN0Lmxlbmd0aD4wJiYobj1uLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiF0aGlzLnNvcnREaXNhYmxlZCYmdC5pc1ZhbHVlSW5BcnJheShwYXJzZUZsb2F0KGUodGhpcykuYXR0cigiZGF0YS1jb2x1bW4iKSksYS5zb3J0TGlzdCk+PTB9KSksci5hZGQobikuYWRkQ2xhc3ModC5jc3MucHJvY2Vzc2luZysiICIrYS5jc3NQcm9jZXNzaW5nKSk6ci5hZGQobikucmVtb3ZlQ2xhc3ModC5jc3MucHJvY2Vzc2luZysiICIrYS5jc3NQcm9jZXNzaW5nKX0scHJvY2Vzc1Rib2R5OmZ1bmN0aW9uKHQscixvKXtpZih0PWUodClbMF0sbylyZXR1cm4gdC5pc1Byb2Nlc3Npbmc9ITAsci5iZWZvcmUoJzxjb2xncm91cCBjbGFzcz0idGFibGVzb3J0ZXItc2F2ZW15cGxhY2UiLz4nKSxlLmZuLmRldGFjaD9yLmRldGFjaCgpOnIucmVtb3ZlKCk7dmFyIHM9ZSh0KS5maW5kKCJjb2xncm91cC50YWJsZXNvcnRlci1zYXZlbXlwbGFjZSIpO3IuaW5zZXJ0QWZ0ZXIocykscy5yZW1vdmUoKSx0LmlzUHJvY2Vzc2luZz0hMX0sY2xlYXJUYWJsZUJvZHk6ZnVuY3Rpb24odCl7ZSh0KVswXS5jb25maWcuJHRib2RpZXMuY2hpbGRyZW4oKS5kZXRhY2goKX0sY2hhcmFjdGVyRXF1aXZhbGVudHM6e2E6IsOhw6DDosOjw6TEhcOlIixBOiLDgcOAw4LDg8OExITDhSIsYzoiw6fEh8SNIixDOiLDh8SGxIwiLGU6IsOpw6jDqsOrxJvEmSIsRToiw4nDiMOKw4vEmsSYIixpOiLDrcOsxLDDrsOvxLEiLEk6IsONw4zEsMOOw48iLG86IsOzw7LDtMO1w7bFjSIsTzoiw5PDksOUw5XDlsWMIixzczoiw58iLFNTOiLhup4iLHU6IsO6w7nDu8O8xa8iLFU6IsOaw5nDm8Ocxa4ifSxyZXBsYWNlQWNjZW50czpmdW5jdGlvbihlKXt2YXIgcixvPSJbIixzPXQuY2hhcmFjdGVyRXF1aXZhbGVudHM7aWYoIXQuY2hhcmFjdGVyUmVnZXgpe3QuY2hhcmFjdGVyUmVnZXhBcnJheT17fTtmb3IociBpbiBzKSJzdHJpbmciPT10eXBlb2YgciYmKG8rPXNbcl0sdC5jaGFyYWN0ZXJSZWdleEFycmF5W3JdPW5ldyBSZWdFeHAoIlsiK3Nbcl0rIl0iLCJnIikpO3QuY2hhcmFjdGVyUmVnZXg9bmV3IFJlZ0V4cChvKyJdIil9aWYodC5jaGFyYWN0ZXJSZWdleC50ZXN0KGUpKWZvcihyIGluIHMpInN0cmluZyI9PXR5cGVvZiByJiYoZT1lLnJlcGxhY2UodC5jaGFyYWN0ZXJSZWdleEFycmF5W3JdLHIpKTtyZXR1cm4gZX0sdmFsaWRhdGVPcHRpb25zOmZ1bmN0aW9uKHIpe3ZhciBvLHMsYSxuLGk9ImhlYWRlcnMgc29ydEZvcmNlIHNvcnRMaXN0IHNvcnRBcHBlbmQgd2lkZ2V0cyIuc3BsaXQoIiAiKSxsPXIub3JpZ2luYWxTZXR0aW5ncztpZihsKXt0LmRlYnVnKHIsImNvcmUiKSYmKG49bmV3IERhdGUpO2ZvcihvIGluIGwpaWYoInVuZGVmaW5lZCI9PT0oYT10eXBlb2YgdC5kZWZhdWx0c1tvXSkpY29uc29sZS53YXJuKCdUYWJsZXNvcnRlciBXYXJuaW5nISAidGFibGUuY29uZmlnLicrbysnIiBvcHRpb24gbm90IHJlY29nbml6ZWQnKTtlbHNlIGlmKCJvYmplY3QiPT09YSlmb3IocyBpbiBsW29dKWE9dC5kZWZhdWx0c1tvXSYmdHlwZW9mIHQuZGVmYXVsdHNbb11bc10sZS5pbkFycmF5KG8saSk8MCYmInVuZGVmaW5lZCI9PT1hJiZjb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ0YWJsZS5jb25maWcuJytvKyIuIitzKyciIG9wdGlvbiBub3QgcmVjb2duaXplZCcpO3QuZGVidWcociwiY29yZSIpJiZjb25zb2xlLmxvZygidmFsaWRhdGUgb3B0aW9ucyB0aW1lOiIrdC5iZW5jaG1hcmsobikpfX0scmVzdG9yZUhlYWRlcnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhPWUocilbMF0uY29uZmlnLG49YS4kdGFibGUuZmluZChhLnNlbGVjdG9ySGVhZGVycyksaT1uLmxlbmd0aDtmb3Iobz0wO288aTtvKyspKHM9bi5lcShvKSkuZmluZCgiLiIrdC5jc3MuaGVhZGVySW4pLmxlbmd0aCYmcy5odG1sKGEuaGVhZGVyQ29udGVudFtvXSl9LGRlc3Ryb3k6ZnVuY3Rpb24ocixvLHMpe2lmKChyPWUocilbMF0pLmhhc0luaXRpYWxpemVkKXt0LnJlbW92ZVdpZGdldChyLCEwLCExKTt2YXIgYSxuPWUociksaT1yLmNvbmZpZyxsPW4uZmluZCgidGhlYWQ6Zmlyc3QiKSxkPWwuZmluZCgidHIuIit0LmNzcy5oZWFkZXJSb3cpLnJlbW92ZUNsYXNzKHQuY3NzLmhlYWRlclJvdysiICIraS5jc3NIZWFkZXJSb3cpLGM9bi5maW5kKCJ0Zm9vdDpmaXJzdCA+IHRyIikuY2hpbGRyZW4oInRoLCB0ZCIpOyExPT09byYmZS5pbkFycmF5KCJ1aXRoZW1lIixpLndpZGdldHMpPj0wJiYobi50cmlnZ2VySGFuZGxlcigiYXBwbHlXaWRnZXRJZCIsWyJ1aXRoZW1lIl0pLG4udHJpZ2dlckhhbmRsZXIoImFwcGx5V2lkZ2V0SWQiLFsiemVicmEiXSkpLGwuZmluZCgidHIiKS5ub3QoZCkucmVtb3ZlKCksYT0ic29ydFJlc2V0IHVwZGF0ZSB1cGRhdGVSb3dzIHVwZGF0ZUFsbCB1cGRhdGVIZWFkZXJzIHVwZGF0ZUNlbGwgYWRkUm93cyB1cGRhdGVDb21wbGV0ZSBzb3J0b24gYXBwZW5kQ2FjaGUgdXBkYXRlQ2FjaGUgYXBwbHlXaWRnZXRJZCBhcHBseVdpZGdldHMgcmVmcmVzaFdpZGdldHMgcmVtb3ZlV2lkZ2V0IGRlc3Ryb3kgbW91c2V1cCBtb3VzZWxlYXZlICIrImtleXByZXNzIHNvcnRCZWdpbiBzb3J0RW5kIHJlc2V0VG9Mb2FkU3RhdGUgIi5zcGxpdCgiICIpLmpvaW4oaS5uYW1lc3BhY2UrIiAiKSxuLnJlbW92ZURhdGEoInRhYmxlc29ydGVyIikudW5iaW5kKGEucmVwbGFjZSh0LnJlZ2V4LnNwYWNlcywiICIpKSxpLiRoZWFkZXJzLmFkZChjKS5yZW1vdmVDbGFzcyhbdC5jc3MuaGVhZGVyLGkuY3NzSGVhZGVyLGkuY3NzQXNjLGkuY3NzRGVzYyx0LmNzcy5zb3J0QXNjLHQuY3NzLnNvcnREZXNjLHQuY3NzLnNvcnROb25lXS5qb2luKCIgIikpLnJlbW92ZUF0dHIoImRhdGEtY29sdW1uIikucmVtb3ZlQXR0cigiYXJpYS1sYWJlbCIpLmF0dHIoImFyaWEtZGlzYWJsZWQiLCJ0cnVlIiksZC5maW5kKGkuc2VsZWN0b3JTb3J0KS51bmJpbmQoIm1vdXNlZG93biBtb3VzZXVwIGtleXByZXNzICIuc3BsaXQoIiAiKS5qb2luKGkubmFtZXNwYWNlKyIgIikucmVwbGFjZSh0LnJlZ2V4LnNwYWNlcywiICIpKSx0LnJlc3RvcmVIZWFkZXJzKHIpLG4udG9nZ2xlQ2xhc3ModC5jc3MudGFibGUrIiAiK2kudGFibGVDbGFzcysiIHRhYmxlc29ydGVyLSIraS50aGVtZSwhMT09PW8pLG4ucmVtb3ZlQ2xhc3MoaS5uYW1lc3BhY2Uuc2xpY2UoMSkpLHIuaGFzSW5pdGlhbGl6ZWQ9ITEsZGVsZXRlIHIuY29uZmlnLmNhY2hlLCJmdW5jdGlvbiI9PXR5cGVvZiBzJiZzKHIpLHQuZGVidWcoaSwiY29yZSIpJiZjb25zb2xlLmxvZygidGFibGVzb3J0ZXIgaGFzIGJlZW4gcmVtb3ZlZCIpfX19O2UuZm4udGFibGVzb3J0ZXI9ZnVuY3Rpb24ocil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBvPXRoaXMscz1lLmV4dGVuZCghMCx7fSx0LmRlZmF1bHRzLHIsdC5pbnN0YW5jZU1ldGhvZHMpO3Mub3JpZ2luYWxTZXR0aW5ncz1yLCFvLmhhc0luaXRpYWxpemVkJiZ0LmJ1aWxkVGFibGUmJiJUQUJMRSIhPT10aGlzLm5vZGVOYW1lP3QuYnVpbGRUYWJsZShvLHMpOnQuc2V0dXAobyxzKX0pfSx3aW5kb3cuY29uc29sZSYmd2luZG93LmNvbnNvbGUubG9nfHwodC5sb2dzPVtdLGNvbnNvbGU9e30sY29uc29sZS5sb2c9Y29uc29sZS53YXJuPWNvbnNvbGUuZXJyb3I9Y29uc29sZS50YWJsZT1mdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHM6YXJndW1lbnRzWzBdO3QubG9nc1t0LmxvZ3MubGVuZ3RoXT17ZGF0ZTpEYXRlLm5vdygpLGxvZzplfX0pLHQuYWRkUGFyc2VyKHtpZDoibm8tcGFyc2VyIixpczpmdW5jdGlvbigpe3JldHVybiExfSxmb3JtYXQ6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sdHlwZToidGV4dCJ9KSx0LmFkZFBhcnNlcih7aWQ6InRleHQiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGZvcm1hdDpmdW5jdGlvbihyLG8pe3ZhciBzPW8uY29uZmlnO3JldHVybiByJiYocj1lLnRyaW0ocy5pZ25vcmVDYXNlP3IudG9Mb2NhbGVMb3dlckNhc2UoKTpyKSxyPXMuc29ydExvY2FsZUNvbXBhcmU/dC5yZXBsYWNlQWNjZW50cyhyKTpyKSxyfSx0eXBlOiJ0ZXh0In0pLHQucmVnZXgubm9uZGlnaXQ9L1teXHcsLiBcLSgpXS9nLHQuYWRkUGFyc2VyKHtpZDoiZGlnaXQiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LmlzRGlnaXQoZSl9LGZvcm1hdDpmdW5jdGlvbihyLG8pe3ZhciBzPXQuZm9ybWF0RmxvYXQoKHJ8fCIiKS5yZXBsYWNlKHQucmVnZXgubm9uZGlnaXQsIiIpLG8pO3JldHVybiByJiYibnVtYmVyIj09dHlwZW9mIHM/czpyP2UudHJpbShyJiZvLmNvbmZpZy5pZ25vcmVDYXNlP3IudG9Mb2NhbGVMb3dlckNhc2UoKTpyKTpyfSx0eXBlOiJudW1lcmljIn0pLHQucmVnZXguY3VycmVuY3lSZXBsYWNlPS9bK1wtLC4gXS9nLHQucmVnZXguY3VycmVuY3lUZXN0PS9eXCg/XGQrW1x1MDBhMyRcdTIwYWNcdTAwYTRcdTAwYTVcdTAwYTI/Ll18W1x1MDBhMyRcdTIwYWNcdTAwYTRcdTAwYTVcdTAwYTI/Ll1cZCtcKT8kLyx0LmFkZFBhcnNlcih7aWQ6ImN1cnJlbmN5IixpczpmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5jdXJyZW5jeVJlcGxhY2UsIiIpLHQucmVnZXguY3VycmVuY3lUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihyLG8pe3ZhciBzPXQuZm9ybWF0RmxvYXQoKHJ8fCIiKS5yZXBsYWNlKHQucmVnZXgubm9uZGlnaXQsIiIpLG8pO3JldHVybiByJiYibnVtYmVyIj09dHlwZW9mIHM/czpyP2UudHJpbShyJiZvLmNvbmZpZy5pZ25vcmVDYXNlP3IudG9Mb2NhbGVMb3dlckNhc2UoKTpyKTpyfSx0eXBlOiJudW1lcmljIn0pLHQucmVnZXgudXJsUHJvdG9jb2xUZXN0PS9eKGh0dHBzP3xmdHB8ZmlsZSk6XC9cLy8sdC5yZWdleC51cmxQcm90b2NvbFJlcGxhY2U9LyhodHRwcz98ZnRwfGZpbGUpOlwvXC8od3d3XC4pPy8sdC5hZGRQYXJzZXIoe2lkOiJ1cmwiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4LnVybFByb3RvY29sVGVzdC50ZXN0KGUpfSxmb3JtYXQ6ZnVuY3Rpb24ocil7cmV0dXJuIHI/ZS50cmltKHIucmVwbGFjZSh0LnJlZ2V4LnVybFByb3RvY29sUmVwbGFjZSwiIikpOnJ9LHR5cGU6InRleHQifSksdC5yZWdleC5kYXNoPS8tL2csdC5yZWdleC5pc29EYXRlPS9eXGR7NH1bXC9cLV1cZHsxLDJ9W1wvXC1dXGR7MSwyfS8sdC5hZGRQYXJzZXIoe2lkOiJpc29EYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC5pc29EYXRlLnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihlKXt2YXIgcj1lP25ldyBEYXRlKGUucmVwbGFjZSh0LnJlZ2V4LmRhc2gsIi8iKSk6ZTtyZXR1cm4gciBpbnN0YW5jZW9mIERhdGUmJmlzRmluaXRlKHIpP3IuZ2V0VGltZSgpOmV9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC5wZXJjZW50PS8lL2csdC5yZWdleC5wZXJjZW50VGVzdD0vKFxkXHMqPyV8JVxzKj9cZCkvLHQuYWRkUGFyc2VyKHtpZDoicGVyY2VudCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVnZXgucGVyY2VudFRlc3QudGVzdChlKSYmZS5sZW5ndGg8MTV9LGZvcm1hdDpmdW5jdGlvbihlLHIpe3JldHVybiBlP3QuZm9ybWF0RmxvYXQoZS5yZXBsYWNlKHQucmVnZXgucGVyY2VudCwiIikscik6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LmFkZFBhcnNlcih7aWQ6ImltYWdlIixpczpmdW5jdGlvbihlLHQscixvKXtyZXR1cm4gby5maW5kKCJpbWciKS5sZW5ndGg+MH0sZm9ybWF0OmZ1bmN0aW9uKHQscixvKXtyZXR1cm4gZShvKS5maW5kKCJpbWciKS5hdHRyKHIuY29uZmlnLmltZ0F0dHJ8fCJhbHQiKXx8dH0scGFyc2VkOiEwLHR5cGU6InRleHQifSksdC5yZWdleC5kYXRlUmVwbGFjZT0vKFxTKShbQVBdTSkkL2ksdC5yZWdleC51c0xvbmdEYXRlVGVzdDE9L15bQS1aXXszLDEwfVwuP1xzK1xkezEsMn0sP1xzKyhcZHs0fSkoXHMrXGR7MSwyfTpcZHsyfSg6XGR7Mn0pPyhccytbQVBdTSk/KT8kL2ksdC5yZWdleC51c0xvbmdEYXRlVGVzdDI9L15cZHsxLDJ9XHMrW0EtWl17MywxMH1ccytcZHs0fS9pLHQuYWRkUGFyc2VyKHtpZDoidXNMb25nRGF0ZSIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVnZXgudXNMb25nRGF0ZVRlc3QxLnRlc3QoZSl8fHQucmVnZXgudXNMb25nRGF0ZVRlc3QyLnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihlKXt2YXIgcj1lP25ldyBEYXRlKGUucmVwbGFjZSh0LnJlZ2V4LmRhdGVSZXBsYWNlLCIkMSAkMiIpKTplO3JldHVybiByIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUocik/ci5nZXRUaW1lKCk6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnNob3J0RGF0ZVRlc3Q9LyheXGR7MSwyfVtcL1xzXVxkezEsMn1bXC9cc11cZHs0fSl8KF5cZHs0fVtcL1xzXVxkezEsMn1bXC9cc11cZHsxLDJ9KS8sdC5yZWdleC5zaG9ydERhdGVSZXBsYWNlPS9bXC0uLF0vZyx0LnJlZ2V4LnNob3J0RGF0ZVhYWT0vKFxkezEsMn0pW1wvXHNdKFxkezEsMn0pW1wvXHNdKFxkezR9KS8sdC5yZWdleC5zaG9ydERhdGVZTUQ9LyhcZHs0fSlbXC9cc10oXGR7MSwyfSlbXC9cc10oXGR7MSwyfSkvLHQuY29udmVydEZvcm1hdD1mdW5jdGlvbihlLHIpe2U9KGV8fCIiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikucmVwbGFjZSh0LnJlZ2V4LnNob3J0RGF0ZVJlcGxhY2UsIi8iKSwibW1kZHl5eXkiPT09cj9lPWUucmVwbGFjZSh0LnJlZ2V4LnNob3J0RGF0ZVhYWSwiJDMvJDEvJDIiKToiZGRtbXl5eXkiPT09cj9lPWUucmVwbGFjZSh0LnJlZ2V4LnNob3J0RGF0ZVhYWSwiJDMvJDIvJDEiKToieXl5eW1tZGQiPT09ciYmKGU9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWU1ELCIkMS8kMi8kMyIpKTt2YXIgbz1uZXcgRGF0ZShlKTtyZXR1cm4gbyBpbnN0YW5jZW9mIERhdGUmJmlzRmluaXRlKG8pP28uZ2V0VGltZSgpOiIifSx0LmFkZFBhcnNlcih7aWQ6InNob3J0RGF0ZSIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9KGV8fCIiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikucmVwbGFjZSh0LnJlZ2V4LnNob3J0RGF0ZVJlcGxhY2UsIi8iKSx0LnJlZ2V4LnNob3J0RGF0ZVRlc3QudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUscixvLHMpe2lmKGUpe3ZhciBhPXIuY29uZmlnLG49YS4kaGVhZGVySW5kZXhlZFtzXSxpPW4ubGVuZ3RoJiZuLmRhdGEoImRhdGVGb3JtYXQiKXx8dC5nZXREYXRhKG4sdC5nZXRDb2x1bW5EYXRhKHIsYS5oZWFkZXJzLHMpLCJkYXRlRm9ybWF0Iil8fGEuZGF0ZUZvcm1hdDtyZXR1cm4gbi5sZW5ndGgmJm4uZGF0YSgiZGF0ZUZvcm1hdCIsaSksdC5jb252ZXJ0Rm9ybWF0KGUsaSl8fGV9cmV0dXJuIGV9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC50aW1lVGVzdD0vXigwP1sxLTldfDFbMC0yXSk6KFswLTVdXGQpKFxzW0FQXU0pJHxeKCg/OlswMV1cZHxbMl1bMC00XSk6WzAtNV1cZCkkL2ksdC5yZWdleC50aW1lTWF0Y2g9LygwP1sxLTldfDFbMC0yXSk6KFswLTVdXGQpKFxzW0FQXU0pfCgoPzpbMDFdXGR8WzJdWzAtNF0pOlswLTVdXGQpL2ksdC5hZGRQYXJzZXIoe2lkOiJ0aW1lIixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC50aW1lVGVzdC50ZXN0KGUpfSxmb3JtYXQ6ZnVuY3Rpb24oZSl7dmFyIHIsbz0oZXx8IiIpLm1hdGNoKHQucmVnZXgudGltZU1hdGNoKSxzPW5ldyBEYXRlKGUpLGE9ZSYmKG51bGwhPT1vP29bMF06IjAwOjAwIEFNIiksbj1hP25ldyBEYXRlKCIyMDAwLzAxLzAxICIrYS5yZXBsYWNlKHQucmVnZXguZGF0ZVJlcGxhY2UsIiQxICQyIikpOmE7cmV0dXJuIG4gaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShuKT8ocj1zIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUocyk/cy5nZXRUaW1lKCk6MCxyP3BhcnNlRmxvYXQobi5nZXRUaW1lKCkrIi4iK3MuZ2V0VGltZSgpKTpuLmdldFRpbWUoKSk6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LmFkZFBhcnNlcih7aWQ6Im1ldGFkYXRhIixpczpmdW5jdGlvbigpe3JldHVybiExfSxmb3JtYXQ6ZnVuY3Rpb24odCxyLG8pe3ZhciBzPXIuY29uZmlnLGE9cy5wYXJzZXJNZXRhZGF0YU5hbWU/cy5wYXJzZXJNZXRhZGF0YU5hbWU6InNvcnRWYWx1ZSI7cmV0dXJuIGUobykubWV0YWRhdGEoKVthXX0sdHlwZToibnVtZXJpYyJ9KSx0LmFkZFdpZGdldCh7aWQ6InplYnJhIixwcmlvcml0eTo5MCxmb3JtYXQ6ZnVuY3Rpb24odCxyLG8pe3ZhciBzLGEsbixpLGwsZCxjLGc9bmV3IFJlZ0V4cChyLmNzc0NoaWxkUm93LCJpIikscD1yLiR0Ym9kaWVzLmFkZChlKHIubmFtZXNwYWNlKyJfZXh0cmFfdGFibGUiKS5jaGlsZHJlbigidGJvZHk6bm90KC4iK3IuY3NzSW5mb0Jsb2NrKyIpIikpO2ZvcihsPTA7bDxwLmxlbmd0aDtsKyspZm9yKG49MCxjPShzPXAuZXEobCkuY2hpbGRyZW4oInRyOnZpc2libGUiKS5ub3Qoci5zZWxlY3RvclJlbW92ZSkpLmxlbmd0aCxkPTA7ZDxjO2QrKylhPXMuZXEoZCksZy50ZXN0KGFbMF0uY2xhc3NOYW1lKXx8bisrLGk9biUyPT0wLGEucmVtb3ZlQ2xhc3Moby56ZWJyYVtpPzE6MF0pLmFkZENsYXNzKG8uemVicmFbaT8wOjFdKX0scmVtb3ZlOmZ1bmN0aW9uKGUscixvLHMpe2lmKCFzKXt2YXIgYSxuLGk9ci4kdGJvZGllcyxsPShvLnplYnJhfHxbImV2ZW4iLCJvZGQiXSkuam9pbigiICIpO2ZvcihhPTA7YTxpLmxlbmd0aDthKyspKG49dC5wcm9jZXNzVGJvZHkoZSxpLmVxKGEpLCEwKSkuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcyhsKSx0LnByb2Nlc3NUYm9keShlLG4sITEpfX19KX0oZSksZS50YWJsZXNvcnRlcn0pOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKgogICAgQ29weXJpZ2h0IDIwMDgtMjAxMwogICAgICAgIE1hdHRoaWFzIEVobWFubiwKICAgICAgICBNaWNoYWVsIEdlcmhhZXVzZXIsCiAgICAgICAgQ2Fyc3RlbiBNaWxsZXIsCiAgICAgICAgQmlhbmNhIFZhbGVudGluLAogICAgICAgIEFsZnJlZCBXYXNzZXJtYW5uLAogICAgICAgIFBldGVyIFdpbGZhaHJ0CiAgICBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgb3IgTEdQTCBWZXJzaW9uIDMgbGljZW5zZXMuCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggSlNYQ29tcHJlc3Nvci4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIGFsb25nIHdpdGggSlNYQ29tcHJlc3Nvci4KICAgIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvPi4KKi8KKGZ1bmN0aW9uKCl7dmFyIGUscixuOyhmdW5jdGlvbih0KXtmdW5jdGlvbiBvKGUscil7cmV0dXJuIEMuY2FsbChlLHIpfWZ1bmN0aW9uIGkoZSxyKXt2YXIgbix0LG8saSxhLHUsYyxmLHMsbCxwPXImJnIuc3BsaXQoIi8iKSxoPWsubWFwLGQ9aCYmaFsiKiJdfHx7fTtpZihlJiYiLiI9PT1lLmNoYXJBdCgwKSlpZihyKXtmb3IocD1wLnNsaWNlKDAscC5sZW5ndGgtMSksZT1wLmNvbmNhdChlLnNwbGl0KCIvIikpLGY9MDtlLmxlbmd0aD5mO2YrPTEpaWYobD1lW2ZdLCIuIj09PWwpZS5zcGxpY2UoZiwxKSxmLT0xO2Vsc2UgaWYoIi4uIj09PWwpe2lmKDE9PT1mJiYoIi4uIj09PWVbMl18fCIuLiI9PT1lWzBdKSlicmVhaztmPjAmJihlLnNwbGljZShmLTEsMiksZi09Mil9ZT1lLmpvaW4oIi8iKX1lbHNlIDA9PT1lLmluZGV4T2YoIi4vIikmJihlPWUuc3Vic3RyaW5nKDIpKTtpZigocHx8ZCkmJmgpe2ZvcihuPWUuc3BsaXQoIi8iKSxmPW4ubGVuZ3RoO2Y+MDtmLT0xKXtpZih0PW4uc2xpY2UoMCxmKS5qb2luKCIvIikscClmb3Iocz1wLmxlbmd0aDtzPjA7cy09MSlpZihvPWhbcC5zbGljZSgwLHMpLmpvaW4oIi8iKV0sbyYmKG89b1t0XSkpe2k9byxhPWY7YnJlYWt9aWYoaSlicmVhazshdSYmZCYmZFt0XSYmKHU9ZFt0XSxjPWYpfSFpJiZ1JiYoaT11LGE9YyksaSYmKG4uc3BsaWNlKDAsYSxpKSxlPW4uam9pbigiLyIpKX1yZXR1cm4gZX1mdW5jdGlvbiBhKGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGguYXBwbHkodCx2LmNhbGwoYXJndW1lbnRzLDApLmNvbmNhdChbZSxyXSkpfX1mdW5jdGlvbiB1KGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gaShyLGUpfX1mdW5jdGlvbiBjKGUpe3JldHVybiBmdW5jdGlvbihyKXtiW2VdPXJ9fWZ1bmN0aW9uIGYoZSl7aWYobyhtLGUpKXt2YXIgcj1tW2VdO2RlbGV0ZSBtW2VdLHlbZV09ITAscC5hcHBseSh0LHIpfWlmKCFvKGIsZSkmJiFvKHksZSkpdGhyb3cgRXJyb3IoIk5vICIrZSk7cmV0dXJuIGJbZV19ZnVuY3Rpb24gcyhlKXt2YXIgcixuPWU/ZS5pbmRleE9mKCIhIik6LTE7cmV0dXJuIG4+LTEmJihyPWUuc3Vic3RyaW5nKDAsbiksZT1lLnN1YnN0cmluZyhuKzEsZS5sZW5ndGgpKSxbcixlXX1mdW5jdGlvbiBsKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBrJiZrLmNvbmZpZyYmay5jb25maWdbZV18fHt9fX12YXIgcCxoLGQsZyxiPXt9LG09e30saz17fSx5PXt9LEM9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx2PVtdLnNsaWNlO2Q9ZnVuY3Rpb24oZSxyKXt2YXIgbix0PXMoZSksbz10WzBdO3JldHVybiBlPXRbMV0sbyYmKG89aShvLHIpLG49ZihvKSksbz9lPW4mJm4ubm9ybWFsaXplP24ubm9ybWFsaXplKGUsdShyKSk6aShlLHIpOihlPWkoZSxyKSx0PXMoZSksbz10WzBdLGU9dFsxXSxvJiYobj1mKG8pKSkse2Y6bz9vKyIhIitlOmUsbjplLHByOm8scDpufX0sZz17cmVxdWlyZTpmdW5jdGlvbihlKXtyZXR1cm4gYShlKX0sZXhwb3J0czpmdW5jdGlvbihlKXt2YXIgcj1iW2VdO3JldHVybiByIT09dm9pZCAwP3I6YltlXT17fX0sbW9kdWxlOmZ1bmN0aW9uKGUpe3JldHVybntpZDplLHVyaToiIixleHBvcnRzOmJbZV0sY29uZmlnOmwoZSl9fX0scD1mdW5jdGlvbihlLHIsbixpKXt2YXIgdSxzLGwscCxoLGssQz1bXTtpZihpPWl8fGUsImZ1bmN0aW9uIj09dHlwZW9mIG4pe2ZvcihyPSFyLmxlbmd0aCYmbi5sZW5ndGg/WyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdOnIsaD0wO3IubGVuZ3RoPmg7aCs9MSlpZihwPWQocltoXSxpKSxzPXAuZiwicmVxdWlyZSI9PT1zKUNbaF09Zy5yZXF1aXJlKGUpO2Vsc2UgaWYoImV4cG9ydHMiPT09cylDW2hdPWcuZXhwb3J0cyhlKSxrPSEwO2Vsc2UgaWYoIm1vZHVsZSI9PT1zKXU9Q1toXT1nLm1vZHVsZShlKTtlbHNlIGlmKG8oYixzKXx8byhtLHMpfHxvKHkscykpQ1toXT1mKHMpO2Vsc2V7aWYoIXAucCl0aHJvdyBFcnJvcihlKyIgbWlzc2luZyAiK3MpO3AucC5sb2FkKHAubixhKGksITApLGMocykse30pLENbaF09YltzXX1sPW4uYXBwbHkoYltlXSxDKSxlJiYodSYmdS5leHBvcnRzIT09dCYmdS5leHBvcnRzIT09YltlXT9iW2VdPXUuZXhwb3J0czpsPT09dCYma3x8KGJbZV09bCkpfWVsc2UgZSYmKGJbZV09bil9LGU9cj1oPWZ1bmN0aW9uKGUscixuLG8saSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP2dbZV0/Z1tlXShyKTpmKGQoZSxyKS5mKTooZS5zcGxpY2V8fChrPWUsci5zcGxpY2U/KGU9cixyPW4sbj1udWxsKTplPXQpLHI9cnx8ZnVuY3Rpb24oKXt9LCJmdW5jdGlvbiI9PXR5cGVvZiBuJiYobj1vLG89aSksbz9wKHQsZSxyLG4pOnNldFRpbWVvdXQoZnVuY3Rpb24oKXtwKHQsZSxyLG4pfSw0KSxoKX0saC5jb25maWc9ZnVuY3Rpb24oZSl7cmV0dXJuIGs9ZSxrLmRlcHMmJmgoay5kZXBzLGsuY2FsbGJhY2spLGh9LG49ZnVuY3Rpb24oZSxyLG4pe3Iuc3BsaWNlfHwobj1yLHI9W10pLG8oYixlKXx8byhtLGUpfHwobVtlXT1bZSxyLG5dKX0sbi5hbWQ9e2pRdWVyeTohMH19KSgpLG4oIi4uL25vZGVfbW9kdWxlcy9hbG1vbmQvYWxtb25kIixmdW5jdGlvbigpe30pLG4oImp4ZyIsW10sZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4ib2JqZWN0IiE9dHlwZW9mIEpYR3x8SlhHLmV4dGVuZHx8KGU9SlhHKSxlLmV4dGVuZD1mdW5jdGlvbihlLHIsbix0KXt2YXIgbyxpO249bnx8ITEsdD10fHwhMTtmb3IobyBpbiByKSghbnx8biYmci5oYXNPd25Qcm9wZXJ0eShvKSkmJihpPXQ/by50b0xvd2VyQ2FzZSgpOm8sZVtpXT1yW29dKX0sZS5leHRlbmQoZSx7Ym9hcmRzOnt9LHJlYWRlcnM6e30sZWxlbWVudHM6e30scmVnaXN0ZXJFbGVtZW50OmZ1bmN0aW9uKGUscil7ZT1lLnRvTG93ZXJDYXNlKCksdGhpcy5lbGVtZW50c1tlXT1yfSxyZWdpc3RlclJlYWRlcjpmdW5jdGlvbihlLHIpe3ZhciBuLHQ7Zm9yKG49MDtyLmxlbmd0aD5uO24rKyl0PXJbbl0udG9Mb3dlckNhc2UoKSwiZnVuY3Rpb24iIT10eXBlb2YgdGhpcy5yZWFkZXJzW3RdJiYodGhpcy5yZWFkZXJzW3RdPWUpfSxzaG9ydGN1dDpmdW5jdGlvbihlLHIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlW3JdLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LGdldFJlZjpmdW5jdGlvbihlLHIpe3JldHVybiBlLnNlbGVjdChyKX0sZ2V0UmVmZXJlbmNlOmZ1bmN0aW9uKGUscil7cmV0dXJuIGUuc2VsZWN0KHIpfSxkZWJ1Z0ludDpmdW5jdGlvbigpe3ZhciBlLHI7Zm9yKGU9MDthcmd1bWVudHMubGVuZ3RoPmU7ZSsrKXI9YXJndW1lbnRzW2VdLCJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2c/Y29uc29sZS5sb2cocik6Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRlYnVnIikmJihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGVidWciKS5pbm5lckhUTUwrPXIrIjxici8+Iil9LGRlYnVnV1NUOmZ1bmN0aW9uKCl7dmFyIHI9RXJyb3IoKTtlLmRlYnVnSW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyJiZyLnN0YWNrJiYoZS5kZWJ1Z0ludCgic3RhY2t0cmFjZSIpLGUuZGVidWdJbnQoci5zdGFjay5zcGxpdCgiXG4iKS5zbGljZSgxKS5qb2luKCJcbiIpKSl9LGRlYnVnTGluZTpmdW5jdGlvbigpe3ZhciByPUVycm9yKCk7ZS5kZWJ1Z0ludC5hcHBseSh0aGlzLGFyZ3VtZW50cyksciYmci5zdGFjayYmZS5kZWJ1Z0ludCgiQ2FsbGVkIGZyb20iLHIuc3RhY2suc3BsaXQoIlxuIikuc2xpY2UoMiwzKS5qb2luKCJcbiIpKX0sZGVidWc6ZnVuY3Rpb24oKXtlLmRlYnVnSW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KSxlfSksbigidXRpbHMvemlwIixbImp4ZyJdLGZ1bmN0aW9uKGUpe3ZhciByPVswLDEyOCw2NCwxOTIsMzIsMTYwLDk2LDIyNCwxNiwxNDQsODAsMjA4LDQ4LDE3NiwxMTIsMjQwLDgsMTM2LDcyLDIwMCw0MCwxNjgsMTA0LDIzMiwyNCwxNTIsODgsMjE2LDU2LDE4NCwxMjAsMjQ4LDQsMTMyLDY4LDE5NiwzNiwxNjQsMTAwLDIyOCwyMCwxNDgsODQsMjEyLDUyLDE4MCwxMTYsMjQ0LDEyLDE0MCw3NiwyMDQsNDQsMTcyLDEwOCwyMzYsMjgsMTU2LDkyLDIyMCw2MCwxODgsMTI0LDI1MiwyLDEzMCw2NiwxOTQsMzQsMTYyLDk4LDIyNiwxOCwxNDYsODIsMjEwLDUwLDE3OCwxMTQsMjQyLDEwLDEzOCw3NCwyMDIsNDIsMTcwLDEwNiwyMzQsMjYsMTU0LDkwLDIxOCw1OCwxODYsMTIyLDI1MCw2LDEzNCw3MCwxOTgsMzgsMTY2LDEwMiwyMzAsMjIsMTUwLDg2LDIxNCw1NCwxODIsMTE4LDI0NiwxNCwxNDIsNzgsMjA2LDQ2LDE3NCwxMTAsMjM4LDMwLDE1OCw5NCwyMjIsNjIsMTkwLDEyNiwyNTQsMSwxMjksNjUsMTkzLDMzLDE2MSw5NywyMjUsMTcsMTQ1LDgxLDIwOSw0OSwxNzcsMTEzLDI0MSw5LDEzNyw3MywyMDEsNDEsMTY5LDEwNSwyMzMsMjUsMTUzLDg5LDIxNyw1NywxODUsMTIxLDI0OSw1LDEzMyw2OSwxOTcsMzcsMTY1LDEwMSwyMjksMjEsMTQ5LDg1LDIxMyw1MywxODEsMTE3LDI0NSwxMywxNDEsNzcsMjA1LDQ1LDE3MywxMDksMjM3LDI5LDE1Nyw5MywyMjEsNjEsMTg5LDEyNSwyNTMsMywxMzEsNjcsMTk1LDM1LDE2Myw5OSwyMjcsMTksMTQ3LDgzLDIxMSw1MSwxNzksMTE1LDI0MywxMSwxMzksNzUsMjAzLDQzLDE3MSwxMDcsMjM1LDI3LDE1NSw5MSwyMTksNTksMTg3LDEyMywyNTEsNywxMzUsNzEsMTk5LDM5LDE2NywxMDMsMjMxLDIzLDE1MSw4NywyMTUsNTUsMTgzLDExOSwyNDcsMTUsMTQzLDc5LDIwNyw0NywxNzUsMTExLDIzOSwzMSwxNTksOTUsMjIzLDYzLDE5MSwxMjcsMjU1XSxuPVszLDQsNSw2LDcsOCw5LDEwLDExLDEzLDE1LDE3LDE5LDIzLDI3LDMxLDM1LDQzLDUxLDU5LDY3LDgzLDk5LDExNSwxMzEsMTYzLDE5NSwyMjcsMjU4LDAsMF0sdD1bMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwLDk5LDk5XSxvPVsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzddLGk9WzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdLGE9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdLHU9MjU2O3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuVW56aXA9ZnVuY3Rpb24oYyl7ZnVuY3Rpb24gZigpe3JldHVybiBSKz04LE8+WD9jW1grK106LTF9ZnVuY3Rpb24gcygpe0I9MX1mdW5jdGlvbiBsKCl7dmFyIGU7dHJ5e3JldHVybiBSKyssZT0xJkIsQj4+PTEsMD09PUImJihCPWYoKSxlPTEmQixCPTEyOHxCPj4xKSxlfWNhdGNoKHIpe3Rocm93IHJ9fWZ1bmN0aW9uIHAoZSl7dmFyIG49MCx0PWU7dHJ5e2Zvcig7dC0tOyluPW48PDF8bCgpO2UmJihuPXJbbl0+PjgtZSl9Y2F0Y2gobyl7dGhyb3cgb31yZXR1cm4gbn1mdW5jdGlvbiBoKCl7Sj0wfWZ1bmN0aW9uIGQoZSl7aisrLEdbSisrXT1lLHoucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKSwzMjc2OD09PUomJihKPTApfWZ1bmN0aW9uIGcoKXt0aGlzLmIwPTAsdGhpcy5iMT0wLHRoaXMuanVtcD1udWxsLHRoaXMuanVtcHBvcz0tMX1mdW5jdGlvbiBiKCl7Zm9yKDs7KXtpZihNW0hdPj14KXJldHVybi0xO2lmKFVbTVtIXV09PT1IKXJldHVybiBNW0hdKys7TVtIXSsrfX1mdW5jdGlvbiBtKCl7dmFyIGUscj1QW0ZdO2lmKDE3PT09SClyZXR1cm4tMTtpZihGKyssSCsrLGU9YigpLGU+PTApci5iMD1lO2Vsc2UgaWYoci5iMD0zMjc2OCxtKCkpcmV0dXJuLTE7aWYoZT1iKCksZT49MClyLmIxPWUsci5qdW1wPW51bGw7ZWxzZSBpZihyLmIxPTMyNzY4LHIuanVtcD1QW0ZdLHIuanVtcHBvcz1GLG0oKSlyZXR1cm4tMTtyZXR1cm4gSC0tLDB9ZnVuY3Rpb24gayhlLHIsbil7dmFyIHQ7Zm9yKFA9ZSxGPTAsVT1uLHg9cix0PTA7MTc+dDt0KyspTVt0XT0wO3JldHVybiBIPTAsbSgpPy0xOjB9ZnVuY3Rpb24geShlKXtmb3IodmFyIHIsbix0LG89MCxpPWVbb107OylpZih0PWwoKSl7aWYoISgzMjc2OCZpLmIxKSlyZXR1cm4gaS5iMTtmb3IoaT1pLmp1bXAscj1lLmxlbmd0aCxuPTA7cj5uO24rKylpZihlW25dPT09aSl7bz1uO2JyZWFrfX1lbHNle2lmKCEoMzI3NjgmaS5iMCkpcmV0dXJuIGkuYjA7bysrLGk9ZVtvXX19ZnVuY3Rpb24gQygpe3ZhciB1LGMsYixtLEMsdixBLGosdyxVLHgsUyx6LEksRSxMLE87ZG8gaWYodT1sKCksYj1wKDIpLDA9PT1iKWZvcihzKCksVT1mKCksVXw9ZigpPDw4LFM9ZigpLFN8PWYoKTw8OCw2NTUzNSYoVV5+UykmJmUuZGVidWcoIkJsb2NrTGVuIGNoZWNrc3VtIG1pc21hdGNoXG4iKTtVLS07KWM9ZigpLGQoYyk7ZWxzZSBpZigxPT09Yilmb3IoOzspaWYoQz1yW3AoNyldPj4xLEM+MjM/KEM9Qzw8MXxsKCksQz4xOTk/KEMtPTEyOCxDPUM8PDF8bCgpKTooQy09NDgsQz4xNDMmJihDKz0xMzYpKSk6Qys9MjU2LDI1Nj5DKWQoQyk7ZWxzZXtpZigyNTY9PT1DKWJyZWFrO2ZvcihDLT0yNTcsdz1wKHRbQ10pK25bQ10sQz1yW3AoNSldPj4zLGlbQ10+OD8oeD1wKDgpLHh8PXAoaVtDXS04KTw8OCk6eD1wKGlbQ10pLHgrPW9bQ10sQz0wO3c+QztDKyspYz1HWzMyNzY3JkoteF0sZChjKX1lbHNlIGlmKDI9PT1iKXtmb3IoQT1BcnJheSgzMjApLEk9MjU3K3AoNSksRT0xK3AoNSksTD00K3AoNCksQz0wOzE5PkM7QysrKUFbQ109MDtmb3IoQz0wO0w+QztDKyspQVthW0NdXT1wKDMpO2Zvcih3PXEubGVuZ3RoLG09MDt3Pm07bSsrKXFbbV09bmV3IGc7aWYoayhxLDE5LEEsMCkpcmV0dXJuIGgoKSwxO2Zvcih6PUkrRSxtPTAsTz0tMTt6Pm07KWlmKE8rKyxDPXkocSksMTY+QylBW20rK109QztlbHNlIGlmKDE2PT09Qyl7aWYoQz0zK3AoMiksbStDPnopcmV0dXJuIGgoKSwxO2Zvcih2PW0/QVttLTFdOjA7Qy0tOylBW20rK109dn1lbHNle2lmKEM9MTc9PT1DPzMrcCgzKToxMStwKDcpLG0rQz56KXJldHVybiBoKCksMTtmb3IoO0MtLTspQVttKytdPTB9Zm9yKHc9VC5sZW5ndGgsbT0wO3c+bTttKyspVFttXT1uZXcgZztpZihrKFQsSSxBLDApKXJldHVybiBoKCksMTtmb3Iodz1ULmxlbmd0aCxtPTA7dz5tO20rKylxW21dPW5ldyBnO2ZvcihqPVtdLG09STtBLmxlbmd0aD5tO20rKylqW20tSV09QVttXTtpZihrKHEsRSxqLDApKXJldHVybiBoKCksMTtmb3IoOzspaWYoQz15KFQpLEM+PTI1Nil7aWYoQy09MjU2LDA9PT1DKWJyZWFrO2ZvcihDLT0xLHc9cCh0W0NdKStuW0NdLEM9eShxKSxpW0NdPjg/KHg9cCg4KSx4fD1wKGlbQ10tOCk8PDgpOng9cChpW0NdKSx4Kz1vW0NdO3ctLTspYz1HWzMyNzY3JkoteF0sZChjKX1lbHNlIGQoQyl9d2hpbGUoIXUpO3JldHVybiBoKCkscygpLDB9ZnVuY3Rpb24gdigpe3ZhciBlLHIsbix0LG8saSxhLGMscz1bXTt0cnl7aWYoej1bXSxMPSExLHNbMF09ZigpLHNbMV09ZigpLDEyMD09PXNbMF0mJjIxOD09PXNbMV0mJihDKCksRVtJXT1bei5qb2luKCIiKSwiZ2VvbmV4dC5neHQiXSxJKyspLDMxPT09c1swXSYmMTM5PT09c1sxXSYmKFMoKSxFW0ldPVt6LmpvaW4oIiIpLCJmaWxlIl0sSSsrKSw4MD09PXNbMF0mJjc1PT09c1sxXSYmKEw9ITAsc1syXT1mKCksc1szXT1mKCksMz09PXNbMl0mJjQ9PT1zWzNdKSl7Zm9yKHNbMF09ZigpLHNbMV09ZigpLEE9ZigpLEF8PWYoKTw8OCxjPWYoKSxjfD1mKCk8PDgsZigpLGYoKSxmKCksZigpLGE9ZigpLGF8PWYoKTw8OCxhfD1mKCk8PDE2LGF8PWYoKTw8MjQsaT1mKCksaXw9ZigpPDw4LGl8PWYoKTw8MTYsaXw9ZigpPDwyNCxvPWYoKSxvfD1mKCk8PDgsb3w9ZigpPDwxNixvfD1mKCk8PDI0LHQ9ZigpLHR8PWYoKTw8OCxuPWYoKSxufD1mKCk8PDgsZT0wLE49W107dC0tOylyPWYoKSwiLyI9PT1yfCI6Ij09PXI/ZT0wOnUtMT5lJiYoTltlKytdPVN0cmluZy5mcm9tQ2hhckNvZGUocikpO2Zvcih3fHwodz1OKSxlPTA7bj5lOylyPWYoKSxlKys7aj0wLDg9PT1jJiYoQygpLEVbSV09QXJyYXkoMiksRVtJXVswXT16LmpvaW4oIiIpLEVbSV1bMV09Ti5qb2luKCIiKSxJKyspLFMoKX19Y2F0Y2gobCl7dGhyb3cgbH19dmFyIEEsaix3LFUseCxTLHo9W10sST0wLEU9W10sRz1BcnJheSgzMjc2OCksSj0wLEw9ITEsTz1jLmxlbmd0aCxYPTAsQj0xLFI9MCxUPUFycmF5KDI4OCkscT1BcnJheSgzMiksRj0wLFA9bnVsbCxIPShBcnJheSg2NCksQXJyYXkoNjQpLDApLE09QXJyYXkoMTcpLE49W107TVswXT0wLFM9ZnVuY3Rpb24oKXt2YXIgZSxyLG4sdCxvLGksYT1bXTtpZig4JkEmJihhWzBdPWYoKSxhWzFdPWYoKSxhWzJdPWYoKSxhWzNdPWYoKSw4MD09PWFbMF0mJjc1PT09YVsxXSYmNz09PWFbMl0mJjg9PT1hWzNdPyhlPWYoKSxlfD1mKCk8PDgsZXw9ZigpPDwxNixlfD1mKCk8PDI0KTplPWFbMF18YVsxXTw8OHxhWzJdPDwxNnxhWzNdPDwyNCxyPWYoKSxyfD1mKCk8PDgscnw9ZigpPDwxNixyfD1mKCk8PDI0LG49ZigpLG58PWYoKTw8OCxufD1mKCk8PDE2LG58PWYoKTw8MjQpLEwmJnYoKSxhWzBdPWYoKSw4PT09YVswXSl7aWYoQT1mKCksZigpLGYoKSxmKCksZigpLGYoKSx0PWYoKSw0JkEpZm9yKGFbMF09ZigpLGFbMl09ZigpLEg9YVswXSsyNTYqYVsxXSxvPTA7SD5vO28rKylmKCk7aWYoOCZBKWZvcihvPTAsTj1bXSxpPWYoKTtpOykoIjciPT09aXx8IjoiPT09aSkmJihvPTApLHUtMT5vJiYoTltvKytdPWkpLGk9ZigpO2lmKDE2JkEpZm9yKGk9ZigpO2k7KWk9ZigpOzImQSYmKGYoKSxmKCkpLEMoKSxlPWYoKSxlfD1mKCk8PDgsZXw9ZigpPDwxNixlfD1mKCk8PDI0LG49ZigpLG58PWYoKTw8OCxufD1mKCk8PDE2LG58PWYoKTw8MjQsTCYmdigpfX0sZS5VdGlsLlVuemlwLnByb3RvdHlwZS51bnppcEZpbGU9ZnVuY3Rpb24oZSl7dmFyIHI7Zm9yKHRoaXMudW56aXAoKSxyPTA7RS5sZW5ndGg+cjtyKyspaWYoRVtyXVsxXT09PWUpcmV0dXJuIEVbcl1bMF07cmV0dXJuIiJ9LGUuVXRpbC5VbnppcC5wcm90b3R5cGUudW56aXA9ZnVuY3Rpb24oKXtyZXR1cm4gdigpLEV9fSxlLlV0aWx9KSxuKCJ1dGlscy9lbmNvZGluZyIsWyJqeGciXSxmdW5jdGlvbihlKXt2YXIgcj0wLG49WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDgsOCwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwxMCwzLDMsMywzLDMsMywzLDMsMywzLDMsMyw0LDMsMywxMSw2LDYsNiw1LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwwLDEyLDI0LDM2LDYwLDk2LDg0LDEyLDEyLDEyLDQ4LDcyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDAsMTIsMTIsMTIsMTIsMTIsMCwxMiwwLDEyLDEyLDEyLDI0LDEyLDEyLDEyLDEyLDEyLDI0LDEyLDI0LDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDI0LDEyLDEyLDEyLDEyLDEyLDI0LDEyLDEyLDEyLDEyLDEyLDEyLDEyLDI0LDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDM2LDEyLDM2LDEyLDEyLDEyLDM2LDEyLDEyLDEyLDEyLDEyLDM2LDEyLDM2LDEyLDEyLDEyLDM2LDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyXTtyZXR1cm4gZS5VdGlsPWUuVXRpbHx8e30sZS5VdGlsLlVURjg9e2VuY29kZTpmdW5jdGlvbihlKXt2YXIgcixuLHQ9IiIsbz1lLmxlbmd0aDtpZihlPWUucmVwbGFjZSgvXHJcbi9nLCJcbiIpLCJmdW5jdGlvbiI9PXR5cGVvZiB1bmVzY2FwZSYmImZ1bmN0aW9uIj09dHlwZW9mIGVuY29kZVVSSUNvbXBvbmVudClyZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKTtmb3Iocj0wO28+cjtyKyspbj1lLmNoYXJDb2RlQXQociksMTI4Pm4/dCs9U3RyaW5nLmZyb21DaGFyQ29kZShuKTpuPjEyNyYmMjA0OD5uPyh0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKDE5MnxuPj42KSx0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyOHw2MyZuKSk6KHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMjI0fG4+PjEyKSx0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyOHw2MyZuPj42KSx0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyOHw2MyZuKSk7cmV0dXJuIHR9LGRlY29kZTpmdW5jdGlvbihlKXt2YXIgdCxvLGksYT0wLHU9MCxjPXIsZj1bXSxzPWUubGVuZ3RoLGw9W107Zm9yKHQ9MDtzPnQ7dCsrKW89ZS5jaGFyQ29kZUF0KHQpLGk9bltvXSx1PWMhPT1yPzYzJm98dTw8NjoyNTU+PmkmbyxjPW5bMjU2K2MraV0sYz09PXImJih1PjY1NTM1P2YucHVzaCg1NTIzMisodT4+MTApLDU2MzIwKygxMDIzJnUpKTpmLnB1c2godSksYSsrLDA9PT1hJTFlNCYmKGwucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsZikpLGY9W10pKTtyZXR1cm4gbC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxmKSksbC5qb2luKCIiKX0sYXNjaWlDaGFyQ29kZUF0OmZ1bmN0aW9uKGUscil7dmFyIG49ZS5jaGFyQ29kZUF0KHIpO2lmKG4+MjU1KXN3aXRjaChuKXtjYXNlIDgzNjQ6bj0xMjg7YnJlYWs7Y2FzZSA4MjE4Om49MTMwO2JyZWFrO2Nhc2UgNDAyOm49MTMxO2JyZWFrO2Nhc2UgODIyMjpuPTEzMjticmVhaztjYXNlIDgyMzA6bj0xMzM7YnJlYWs7Y2FzZSA4MjI0Om49MTM0O2JyZWFrO2Nhc2UgODIyNTpuPTEzNTticmVhaztjYXNlIDcxMDpuPTEzNjticmVhaztjYXNlIDgyNDA6bj0xMzc7YnJlYWs7Y2FzZSAzNTI6bj0xMzg7YnJlYWs7Y2FzZSA4MjQ5Om49MTM5O2JyZWFrO2Nhc2UgMzM4Om49MTQwO2JyZWFrO2Nhc2UgMzgxOm49MTQyO2JyZWFrO2Nhc2UgODIxNjpuPTE0NTticmVhaztjYXNlIDgyMTc6bj0xNDY7YnJlYWs7Y2FzZSA4MjIwOm49MTQ3O2JyZWFrO2Nhc2UgODIyMTpuPTE0ODticmVhaztjYXNlIDgyMjY6bj0xNDk7YnJlYWs7Y2FzZSA4MjExOm49MTUwO2JyZWFrO2Nhc2UgODIxMjpuPTE1MTticmVhaztjYXNlIDczMjpuPTE1MjticmVhaztjYXNlIDg0ODI6bj0xNTM7YnJlYWs7Y2FzZSAzNTM6bj0xNTQ7YnJlYWs7Y2FzZSA4MjUwOm49MTU1O2JyZWFrO2Nhc2UgMzM5Om49MTU2O2JyZWFrO2Nhc2UgMzgyOm49MTU4O2JyZWFrO2Nhc2UgMzc2Om49MTU5O2JyZWFrO2RlZmF1bHQ6fXJldHVybiBufX0sZS5VdGlsLlVURjh9KSxuKCJ1dGlscy9iYXNlNjQiLFsianhnIiwidXRpbHMvZW5jb2RpbmciXSxmdW5jdGlvbihlLHIpe2Z1bmN0aW9uIG4oZSxyKXtyZXR1cm4gMjU1JmUuY2hhckNvZGVBdChyKX1mdW5jdGlvbiB0KGUscil7dmFyIG49by5pbmRleE9mKGUuY2hhckF0KHIpKTtpZigtMT09PW4pdGhyb3cgRXJyb3IoIkpTWEdyYXBoL3V0aWxzL2Jhc2U2NDogQ2FuJ3QgZGVjb2RlIHN0cmluZyAoaW52YWxpZCBjaGFyYWN0ZXIpLiIpO3JldHVybiBufXZhciBvPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixpPSI9IjtyZXR1cm4gZS5VdGlsPWUuVXRpbHx8e30sZS5VdGlsLkJhc2U2ND17ZW5jb2RlOmZ1bmN0aW9uKGUpe3ZhciB0LGEsdSxjLGYscz1bXTtmb3IoZj1yLmVuY29kZShlKSx1PWYubGVuZ3RoLGM9dSUzLHQ9MDt1LWM+dDt0Kz0zKWE9bihmLHQpPDwxNnxuKGYsdCsxKTw8OHxuKGYsdCsyKSxzLnB1c2goby5jaGFyQXQoYT4+MTgpLG8uY2hhckF0KDYzJmE+PjEyKSxvLmNoYXJBdCg2MyZhPj42KSxvLmNoYXJBdCg2MyZhKSk7c3dpdGNoKGMpe2Nhc2UgMTphPW4oZix1LTEpLHMucHVzaChvLmNoYXJBdChhPj4yKSxvLmNoYXJBdCg2MyZhPDw0KSxpLGkpO2JyZWFrO2Nhc2UgMjphPW4oZix1LTIpPDw4fG4oZix1LTEpLHMucHVzaChvLmNoYXJBdChhPj4xMCksby5jaGFyQXQoNjMmYT4+NCksby5jaGFyQXQoNjMmYTw8MiksaSl9cmV0dXJuIHMuam9pbigiIil9LGRlY29kZTpmdW5jdGlvbihlLG4pe3ZhciBvLGEsdSxjLGYscyxsPVtdLHA9W107aWYobz1lLnJlcGxhY2UoL1teQS1aYS16MC05XCtcLz1dL2csIiIpLHU9by5sZW5ndGgsMCE9PXUlNCl0aHJvdyBFcnJvcigiSlNYR3JhcGgvdXRpbHMvYmFzZTY0OiBDYW4ndCBkZWNvZGUgc3RyaW5nIChpbnZhbGlkIGlucHV0IGxlbmd0aCkuIik7Zm9yKG8uY2hhckF0KHUtMSk9PT1pJiYoYz0xLG8uY2hhckF0KHUtMik9PT1pJiYoYz0yKSx1LT00KSxhPTA7dT5hO2ErPTQpZj10KG8sYSk8PDE4fHQobyxhKzEpPDwxMnx0KG8sYSsyKTw8Nnx0KG8sYSszKSxwLnB1c2goZj4+MTYsMjU1JmY+PjgsMjU1JmYpLDA9PT1hJTFlNCYmKGwucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwscCkpLHA9W10pO3N3aXRjaChjKXtjYXNlIDE6Zj10KG8sdSk8PDEyfHQobyx1KzEpPDw2fHQobyx1KzIpLHAucHVzaChmPj4xMCwyNTUmZj4+Mik7YnJlYWs7Y2FzZSAyOmY9dChvLGEpPDw2fHQobyxhKzEpLHAucHVzaChmPj40KX1yZXR1cm4gbC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxwKSkscz1sLmpvaW4oIiIpLG4mJihzPXIuZGVjb2RlKHMpKSxzfSxkZWNvZGVBc0FycmF5OmZ1bmN0aW9uKGUpe3ZhciByLG49dGhpcy5kZWNvZGUoZSksdD1bXSxvPW4ubGVuZ3RoO2ZvcihyPTA7bz5yO3IrKyl0W3JdPW4uY2hhckNvZGVBdChyKTtyZXR1cm4gdH19LGUuVXRpbC5CYXNlNjR9KSxuKCIuLi9idWlsZC9jb21wcmVzc29yLmRlcHMuanMiLFsianhnIiwidXRpbHMvemlwIiwidXRpbHMvYmFzZTY0Il0sZnVuY3Rpb24oZSxyLG4pe3JldHVybiBlLmRlY29tcHJlc3M9ZnVuY3Rpb24oZSl7cmV0dXJuIHVuZXNjYXBlKG5ldyByLlVuemlwKG4uZGVjb2RlQXNBcnJheShlKSkudW56aXAoKVswXVswXSl9LGV9KSx3aW5kb3cuSlhHPXIoIi4uL2J1aWxkL2NvbXByZXNzb3IuZGVwcy5qcyIpfSkoKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LmZpbGVMb2FkaW5nID0gKGZ1bmN0aW9uICgpIHsKICAgIHZhciBmaWxlTG9hZGluZ0NhbGxiYWNrcyA9IHt9OwogICAgdmFyIHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgZnVuY3Rpb24gbG9hZEtleXdvcmRzRmlsZShmaWxlbmFtZSwgY2FsbGJhY2spIHsKICAgICAgICBmaWxlTG9hZGluZ0NhbGxiYWNrc1tmaWxlbmFtZV0gPSBjYWxsYmFjazsKICAgICAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgc2NyaXB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgICAvLyB0aW1lc3RhbXAgYXMgYW4gYXJndW1lbnQgdG8gcHJldmVudCBicm93c2VycyBmcm9tIGNhY2hpbmcgc2NyaXB0cwogICAgICAgIC8vIHNlZTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NjY2MTkvaG93LXRvLWZvcmNlLWllLXRvLXJlbG9hZC1qYXZhc2NyaXB0CiAgICAgICAgc2NyaXB0LnNyYyA9IGZpbGVuYW1lKyc/dGltZT0nK3RpbWVzdGFtcDsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHNjcmlwdCk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRDYWxsYmFja0hhbmRsZXJGb3JLZXl3b3JkcyhwYXJlbnQpIHsKICAgICAgICB2YXIgY2FsbGFibGVMaXN0ID0gW107CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYWJsZSkgewogICAgICAgICAgICBpZiAoIXBhcmVudC5pc0NoaWxkcmVuTG9hZGVkKSB7CiAgICAgICAgICAgICAgICBjYWxsYWJsZUxpc3QucHVzaChjYWxsYWJsZSk7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGFibGVMaXN0Lmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgbG9hZEtleXdvcmRzRmlsZShwYXJlbnQuY2hpbGRGaWxlTmFtZSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuaXNDaGlsZHJlbkxvYWRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGFibGVMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZUxpc3RbaV0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY2FsbGFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIG5vdGlmeUZpbGVMb2FkZWQoZmlsZW5hbWUpIHsKICAgICAgICBmaWxlTG9hZGluZ0NhbGxiYWNrc1tmaWxlbmFtZV0oKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHM6IGdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzLAogICAgICAgIG5vdGlmeTogbm90aWZ5RmlsZUxvYWRlZAogICAgfQp9KCkpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cubW9kZWwgPSAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gU3VpdGUoZGF0YSkgewogICAgICAgIHZhciBzdWl0ZSA9IGNyZWF0ZU1vZGVsT2JqZWN0KGRhdGEpOwogICAgICAgIHN1aXRlLnNvdXJjZSA9IGRhdGEuc291cmNlOwogICAgICAgIHN1aXRlLnJlbGF0aXZlU291cmNlID0gZGF0YS5yZWxhdGl2ZVNvdXJjZTsKICAgICAgICBzdWl0ZS5mdWxsTmFtZSA9IGRhdGEucGFyZW50ID8gZGF0YS5wYXJlbnQuZnVsbE5hbWUgKyAnLicgKyBkYXRhLm5hbWUgOiBkYXRhLm5hbWU7CiAgICAgICAgc3VpdGUudHlwZSA9ICdzdWl0ZSc7CiAgICAgICAgc3VpdGUudGVtcGxhdGUgPSAnc3VpdGVUZW1wbGF0ZSc7CiAgICAgICAgc2V0U3RhdHMoc3VpdGUsIGRhdGEuc3RhdGlzdGljcyk7CiAgICAgICAgc3VpdGUubWV0YWRhdGEgPSBkYXRhLm1ldGFkYXRhOwogICAgICAgIHN1aXRlLnBvcHVsYXRlS2V5d29yZHMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignS2V5d29yZCcpOwogICAgICAgIHN1aXRlLnBvcHVsYXRlVGVzdHMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignVGVzdCcpOwogICAgICAgIHN1aXRlLnBvcHVsYXRlU3VpdGVzID0gY3JlYXRlSXRlcmFibGVQb3B1bGF0b3IoJ1N1aXRlJyk7CiAgICAgICAgc3VpdGUuY2hpbGRyZW5OYW1lcyA9IFsna2V5d29yZCcsICdzdWl0ZScsICd0ZXN0J107CiAgICAgICAgc3VpdGUuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gZnVuY3Rpb24gKGNhbGxhYmxlKSB7IGNhbGxhYmxlKCk7IH07CiAgICAgICAgc3VpdGUubWVzc2FnZSA9IGRhdGEubWVzc2FnZTsKICAgICAgICBzdWl0ZS5jaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLmtleXdvcmRzKCkuY29uY2F0KHN1aXRlLnRlc3RzKCkpLmNvbmNhdChzdWl0ZS5zdWl0ZXMoKSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5zZWFyY2hUZXN0cyA9IGZ1bmN0aW9uIChwcmVkaWNhdGUpIHsKICAgICAgICAgICAgdmFyIHRlc3RzID0gW107CiAgICAgICAgICAgIHZhciBzdWl0ZXMgPSB0aGlzLnN1aXRlcygpOwogICAgICAgICAgICBmb3IgKHZhciBpIGluIHN1aXRlcykKICAgICAgICAgICAgICAgIHRlc3RzID0gdGVzdHMuY29uY2F0KHN1aXRlc1tpXS5zZWFyY2hUZXN0cyhwcmVkaWNhdGUpKTsKICAgICAgICAgICAgcmV0dXJuIHRlc3RzLmNvbmNhdCh1dGlsLmZpbHRlcih0aGlzLnRlc3RzKCksIHByZWRpY2F0ZSkpOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuc2VhcmNoVGVzdHNJblN1aXRlID0gZnVuY3Rpb24gKHBhdHRlcm4sIG1hdGNoZXIpIHsKICAgICAgICAgICAgaWYgKCFtYXRjaGVyKQogICAgICAgICAgICAgICAgbWF0Y2hlciA9IHV0aWwuTWF0Y2hlcihwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlc0FueShbc3VpdGUuZnVsbE5hbWUsIHN1aXRlLm5hbWVdKSkKICAgICAgICAgICAgICAgIHJldHVybiBzdWl0ZS5hbGxUZXN0cygpOwogICAgICAgICAgICB2YXIgdGVzdHMgPSBbXTsKICAgICAgICAgICAgdmFyIHN1aXRlcyA9IHRoaXMuc3VpdGVzKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc3VpdGVzKQogICAgICAgICAgICAgICAgdGVzdHMgPSB0ZXN0cy5jb25jYXQoc3VpdGVzW2ldLnNlYXJjaFRlc3RzSW5TdWl0ZShwYXR0ZXJuLCBtYXRjaGVyKSk7CiAgICAgICAgICAgIHJldHVybiB0ZXN0czsKICAgICAgICB9OwogICAgICAgIHN1aXRlLnNlYXJjaFRlc3RzQnlUYWcgPSBmdW5jdGlvbiAodGFnKSB7CiAgICAgICAgICAgIHJldHVybiBzdWl0ZS5zZWFyY2hUZXN0cyhmdW5jdGlvbiAodGVzdCkgewogICAgICAgICAgICAgICAgaWYgKHRhZy5jb21iaW5lZCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3QudGFncywgdGFnLmNvbWJpbmVkKTsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZyh0ZXN0LnRhZ3MsIHRhZy5sYWJlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuZmluZFN1aXRlQnlOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIGZpbmRTdWl0ZUJ5TmFtZShzdWl0ZSwgbmFtZSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5hbGxUZXN0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gc3VpdGU7CiAgICB9CiAgICBmdW5jdGlvbiBjb250YWluc1RhZyh0ZXN0VGFncywgdGFnbmFtZSkgewogICAgICAgIHRlc3RUYWdzID0gdXRpbC5tYXAodGVzdFRhZ3MsIHV0aWwubm9ybWFsaXplKTsKICAgICAgICByZXR1cm4gdXRpbC5jb250YWlucyh0ZXN0VGFncywgdXRpbC5ub3JtYWxpemUodGFnbmFtZSkpOwogICAgfQogICAgZnVuY3Rpb24gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwYXR0ZXJuKSB7CiAgICAgICAgdmFyIHBhdHRlcm5zOwogICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ05PVCcpICE9IC0xKSB7CiAgICAgICAgICAgIHBhdHRlcm5zID0gcGF0dGVybi5zcGxpdCgnTk9UJyk7CiAgICAgICAgICAgIGlmICghdXRpbC5ub3JtYWxpemUocGF0dGVybnNbMF0pKQogICAgICAgICAgICAgICAgcmV0dXJuIHV0aWwuYWxsKHV0aWwubWFwKHBhdHRlcm5zLnNsaWNlKDEpLCBmdW5jdGlvbiAocCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVGFnUGF0dGVybih0ZXN0VGFncywgcGF0dGVybnNbMF0pICYmCiAgICAgICAgICAgICAgICB1dGlsLmFsbCh1dGlsLm1hcChwYXR0ZXJucy5zbGljZSgxKSwgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWNvbnRhaW5zVGFnUGF0dGVybih0ZXN0VGFncywgcCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ09SJykgIT0gLTEpIHsKICAgICAgICAgICAgcGF0dGVybnMgPSBwYXR0ZXJuLnNwbGl0KCdPUicpOwogICAgICAgICAgICByZXR1cm4gdXRpbC5hbnkodXRpbC5tYXAocGF0dGVybnMsIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBpZiAocGF0dGVybi5pbmRleE9mKCdBTkQnKSAhPSAtMSkgewogICAgICAgICAgICBwYXR0ZXJucyA9IHBhdHRlcm4uc3BsaXQoJ0FORCcpOwogICAgICAgICAgICByZXR1cm4gdXRpbC5hbGwodXRpbC5tYXAocGF0dGVybnMsIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdXRpbC5NYXRjaGVyKHBhdHRlcm4pLm1hdGNoZXNBbnkodGVzdFRhZ3MpOwogICAgfQogICAgZnVuY3Rpb24gZmluZFN1aXRlQnlOYW1lKHN1aXRlLCBuYW1lKSB7CiAgICAgICAgaWYgKHN1aXRlLmZ1bGxOYW1lID09IG5hbWUpCiAgICAgICAgICAgIHJldHVybiBzdWl0ZTsKICAgICAgICB2YXIgc3ViU3VpdGVzID0gc3VpdGUuc3VpdGVzKCk7CiAgICAgICAgZm9yICh2YXIgaSBpbiBzdWJTdWl0ZXMpIHsKICAgICAgICAgICAgdmFyIG1hdGNoID0gZmluZFN1aXRlQnlOYW1lKHN1YlN1aXRlc1tpXSwgbmFtZSk7CiAgICAgICAgICAgIGlmIChtYXRjaCkKICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBmdW5jdGlvbiBzZXRTdGF0cyhzdWl0ZSwgc3RhdHMpIHsKICAgICAgICBmb3IgKHZhciBuYW1lIGluIHN0YXRzKSB7CiAgICAgICAgICAgIHN1aXRlW25hbWVdID0gc3RhdHNbbmFtZV07CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSwKICAgICAgICAgICAgZG9jOiBkYXRhLmRvYywKICAgICAgICAgICAgc3RhdHVzOiBkYXRhLnN0YXR1cywKICAgICAgICAgICAgdGltZXM6IGRhdGEudGltZXMsCiAgICAgICAgICAgIGlkOiBkYXRhLnBhcmVudCA/IGRhdGEucGFyZW50LmlkICsgJy0nICsgZGF0YS5pZCA6IGRhdGEuaWQKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gVGVzdChkYXRhKSB7CiAgICAgICAgdmFyIHRlc3QgPSBjcmVhdGVNb2RlbE9iamVjdChkYXRhKTsKICAgICAgICB0ZXN0LnR5cGUgPSAndGVzdCc7CiAgICAgICAgdGVzdC50ZW1wbGF0ZSA9ICd0ZXN0VGVtcGxhdGUnOwogICAgICAgIHRlc3QuZnVsbE5hbWUgPSBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIHRlc3QubmFtZTsKICAgICAgICB0ZXN0LmZvcm1hdFBhcmVudE5hbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB1dGlsLmZvcm1hdFBhcmVudE5hbWUodGVzdCk7IH07CiAgICAgICAgdGVzdC50aW1lb3V0ID0gZGF0YS50aW1lb3V0OwogICAgICAgIHRlc3QucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgdGVzdC5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJ107CiAgICAgICAgdGVzdC5pc0NoaWxkcmVuTG9hZGVkID0gZGF0YS5pc0NoaWxkcmVuTG9hZGVkOwogICAgICAgIHRlc3QuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHRlc3QpOwogICAgICAgIHRlc3QuY2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0ZXN0LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5rZXl3b3JkcygpOwogICAgICAgIH07CiAgICAgICAgdGVzdC50YWdzID0gZGF0YS50YWdzOwogICAgICAgIHRlc3QubWVzc2FnZSA9IGRhdGEubWVzc2FnZTsKICAgICAgICB0ZXN0Lm1hdGNoZXNUYWdQYXR0ZXJuID0gZnVuY3Rpb24gKHBhdHRlcm4pIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVGFnUGF0dGVybih0ZXN0LnRhZ3MsIHBhdHRlcm4pOwogICAgICAgIH07CiAgICAgICAgdGVzdC5tYXRjaGVzTmFtZVBhdHRlcm4gPSBmdW5jdGlvbiAocGF0dGVybikgewogICAgICAgICAgICByZXR1cm4gdXRpbC5NYXRjaGVyKHBhdHRlcm4pLm1hdGNoZXNBbnkoW3Rlc3QubmFtZSwgdGVzdC5mdWxsTmFtZV0pOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHRlc3Q7CiAgICB9CiAgICBmdW5jdGlvbiBLZXl3b3JkKGRhdGEpIHsKICAgICAgICB2YXIga3cgPSBjcmVhdGVNb2RlbE9iamVjdChkYXRhKTsKICAgICAgICBrdy5saWJuYW1lID0gZGF0YS5saWJuYW1lOwogICAgICAgIGt3LmZ1bGxOYW1lID0gKGt3LmxpYm5hbWUgPyBrdy5saWJuYW1lICsgJy4nIDogJycpICsga3cubmFtZTsKICAgICAgICBrdy50eXBlID0gZGF0YS50eXBlOwogICAgICAgIGt3LnRlbXBsYXRlID0gJ2tleXdvcmRUZW1wbGF0ZSc7CiAgICAgICAga3cuYXJndW1lbnRzID0gZGF0YS5hcmdzOwogICAgICAgIGt3LmFzc2lnbiA9IGRhdGEuYXNzaWduICsgKGRhdGEuYXNzaWduID8gJyA9JyA6ICcnKTsKICAgICAgICBrdy50YWdzID0gZGF0YS50YWdzOwogICAgICAgIGt3LnRpbWVvdXQgPSBkYXRhLnRpbWVvdXQ7CiAgICAgICAga3cucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAga3cuY2hpbGRyZW5OYW1lcyA9IFsna2V5d29yZCddOwogICAgICAgIGt3LmlzQ2hpbGRyZW5Mb2FkZWQgPSBkYXRhLmlzQ2hpbGRyZW5Mb2FkZWQ7CiAgICAgICAga3cuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKGt3KTsKICAgICAgICBrdy5jaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGt3LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4ga3cua2V5d29yZHMoKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBrdzsKICAgIH0KICAgIGZ1bmN0aW9uIE1lc3NhZ2UobGV2ZWwsIGRhdGUsIHRleHQsIGxpbmspIHsKICAgICAgICB2YXIgbWVzc2FnZSA9IHsKICAgICAgICAgICAgdHlwZTogJ21lc3NhZ2UnLAogICAgICAgICAgICB0ZW1wbGF0ZTogJ21lc3NhZ2VUZW1wbGF0ZScsCiAgICAgICAgICAgIGxldmVsOiBsZXZlbCwKICAgICAgICAgICAgdGltZTogdXRpbC50aW1lRnJvbURhdGUoZGF0ZSksCiAgICAgICAgICAgIGRhdGU6IHV0aWwuZGF0ZUZyb21EYXRlKGRhdGUpLAogICAgICAgICAgICB0ZXh0OiB0ZXh0LAogICAgICAgICAgICBsaW5rOiBsaW5rCiAgICAgICAgfTsKICAgICAgICBtZXNzYWdlLmNhbGxXaGVuQ2hpbGRyZW5SZWFkeSA9IGZ1bmN0aW9uIChjYWxsYWJsZSkgeyBjYWxsYWJsZSgpOyB9OwogICAgICAgIHJldHVybiBtZXNzYWdlOwogICAgfQogICAgZnVuY3Rpb24gVGltZXModGltZWRhdGEpIHsKICAgICAgICB2YXIgc3RhcnQgPSB0aW1lZGF0YVswXTsKICAgICAgICB2YXIgZW5kID0gdGltZWRhdGFbMV07CiAgICAgICAgdmFyIGVsYXBzZWQgPSB0aW1lZGF0YVsyXTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBlbGFwc2VkTWlsbGlzOiBlbGFwc2VkLAogICAgICAgICAgICBlbGFwc2VkVGltZTogdXRpbC5mb3JtYXRFbGFwc2VkKGVsYXBzZWQpLAogICAgICAgICAgICBzdGFydFRpbWU6IHV0aWwuZGF0ZVRpbWVGcm9tRGF0ZShzdGFydCksCiAgICAgICAgICAgIGVuZFRpbWU6ICB1dGlsLmRhdGVUaW1lRnJvbURhdGUoZW5kKQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcihuYW1lKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwb3B1bGF0b3IpIHsKICAgICAgICAgICAgcG9wdWxhdGVJdGVyYWJsZSh0aGlzLCBuYW1lLCBwb3B1bGF0b3IpOwogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBwb3B1bGF0ZUl0ZXJhYmxlKG9iaiwgbmFtZSwgcG9wdWxhdG9yKSB7CiAgICAgICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKSArICdzJzsKICAgICAgICBvYmpbbmFtZV0gPSBjcmVhdGVHZXRBbGxGdW5jdGlvbihwb3B1bGF0b3IubnVtYmVyT2ZJdGVtcywgcG9wdWxhdG9yLmNyZWF0b3IpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlR2V0QWxsRnVuY3Rpb24obnVtYmVyT2ZFbGVtZW50cywgY3JlYXRvcikgewogICAgICAgIHZhciBjYWNoZWQgPSBudWxsOwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmIChjYWNoZWQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGNhY2hlZCA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1iZXJPZkVsZW1lbnRzKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNhY2hlZC5wdXNoKGNyZWF0b3IoaSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjYWNoZWQ7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgU3VpdGU6IFN1aXRlLAogICAgICAgIFRlc3Q6IFRlc3QsCiAgICAgICAgS2V5d29yZDogS2V5d29yZCwKICAgICAgICBNZXNzYWdlOiBNZXNzYWdlLAogICAgICAgIFRpbWVzOiBUaW1lcywKICAgICAgICBjb250YWluc1RhZzogY29udGFpbnNUYWcsICAvLyBFeHBvc2VkIGZvciB0ZXN0cwogICAgICAgIGNvbnRhaW5zVGFnUGF0dGVybjogY29udGFpbnNUYWdQYXR0ZXJuICAvLyBFeHBvc2VkIGZvciB0ZXN0cwogICAgfTsKfSgpKTsKd2luZG93LnN0YXRzID0gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFN0YXRpc3RpY3ModG90YWxFbGVtcywgdGFnRWxlbXMsIHN1aXRlRWxlbXMpIHsKICAgICAgICByZXR1cm4ge3RvdGFsOiB1dGlsLm1hcCh0b3RhbEVsZW1zLCB0b3RhbFN0YXRFbGVtKSwKICAgICAgICAgICAgICAgIHRhZzogICB1dGlsLm1hcCh0YWdFbGVtcywgdGFnU3RhdEVsZW0pLAogICAgICAgICAgICAgICAgc3VpdGU6IHV0aWwubWFwKHN1aXRlRWxlbXMsIHN1aXRlU3RhdEVsZW0pfTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YXRFbGVtKHN0YXQpIHsKICAgICAgICBzdGF0LnRvdGFsID0gc3RhdC5wYXNzICsgc3RhdC5mYWlsICsgc3RhdC5za2lwOwogICAgICAgIHZhciBwZXJjZW50cyA9IGNhbGN1bGF0ZVBlcmNlbnRzKHN0YXQudG90YWwsIHN0YXQucGFzcywgc3RhdC5mYWlsLCBzdGF0LnNraXApOwogICAgICAgIHN0YXQucGFzc1BlcmNlbnQgPSBwZXJjZW50c1swXTsKICAgICAgICBzdGF0LnNraXBQZXJjZW50ID0gcGVyY2VudHNbMV07CiAgICAgICAgc3RhdC5mYWlsUGVyY2VudCA9IHBlcmNlbnRzWzJdOwogICAgICAgIHZhciB3aWR0aHMgPSBjYWxjdWxhdGVXaWR0aHMoc3RhdC5wYXNzUGVyY2VudCwgc3RhdC5za2lwUGVyY2VudCwgc3RhdC5mYWlsUGVyY2VudCk7CiAgICAgICAgc3RhdC5wYXNzV2lkdGggPSB3aWR0aHNbMF07CiAgICAgICAgc3RhdC5za2lwV2lkdGggPSB3aWR0aHNbMV07CiAgICAgICAgc3RhdC5mYWlsV2lkdGggPSB3aWR0aHNbMl07CiAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICB9CiAgICBmdW5jdGlvbiB0b3RhbFN0YXRFbGVtKGRhdGEpIHsKICAgICAgICB2YXIgc3RhdCA9IHN0YXRFbGVtKGRhdGEpOwogICAgICAgIHN0YXQudHlwZSA9ICdhbGwnOwogICAgICAgIHJldHVybiBzdGF0OwogICAgfQogICAgZnVuY3Rpb24gdGFnU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC5saW5rcyA9IHBhcnNlTGlua3Moc3RhdC5saW5rcyk7CiAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZVN0YXRFbGVtKGRhdGEpIHsKICAgICAgICB2YXIgc3RhdCA9IHN0YXRFbGVtKGRhdGEpOwogICAgICAgIHN0YXQuZnVsbE5hbWUgPSBzdGF0LmxhYmVsOwogICAgICAgIHN0YXQuZm9ybWF0UGFyZW50TmFtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWwuZm9ybWF0UGFyZW50TmFtZShzdGF0KTsgfTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlTGlua3MobGlua3NEYXRhKSB7CiAgICAgICAgaWYgKCFsaW5rc0RhdGEpCiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICByZXR1cm4gdXRpbC5tYXAobGlua3NEYXRhLnNwbGl0KCc6OjonKSwgZnVuY3Rpb24gKGxpbmspIHsKICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGxpbmsuaW5kZXhPZignOicpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt0aXRsZTogbGluay5zbGljZSgwLCBpbmRleCksIHVybDogbGluay5zbGljZShpbmRleCsxKX07CiAgICAgICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gY2FsY3VsYXRlUGVyY2VudHModG90YWwsIHBhc3NlZCwgZmFpbGVkLCBza2lwcGVkKSB7CiAgICAgICAgaWYgKHRvdGFsID09IDApIHsKICAgICAgICAgICAgcmV0dXJuIFswLjAsIDAuMCwgMC4wXTsKICAgICAgICB9CiAgICAgICAgdmFyIHBhc3MgPSAxMDAuMCAqIHBhc3NlZCAvIHRvdGFsOwogICAgICAgIHZhciBza2lwID0gMTAwLjAgKiBza2lwcGVkIC8gdG90YWw7CiAgICAgICAgdmFyIGZhaWwgPSAxMDAuMCAqIGZhaWxlZCAvIHRvdGFsOwogICAgICAgIGlmIChwYXNzID4gMCAmJiBwYXNzIDwgMC4xKQogICAgICAgICAgICBwYXNzID0gMC4xCiAgICAgICAgaWYgKGZhaWwgPiAwICYmIGZhaWwgPCAwLjEpCiAgICAgICAgICAgIGZhaWwgPSAwLjEKICAgICAgICBpZiAoc2tpcCA+IDAgJiYgc2tpcCA8IDAuMSkKICAgICAgICAgICAgc2tpcCA9IDAuMQogICAgICAgIGlmIChwYXNzID4gOTkuOTUgJiYgcGFzcyA8IDEwMCkKICAgICAgICAgICAgcGFzcyA9IDk5LjkKICAgICAgICBpZiAoZmFpbCA+IDk5Ljk1ICYmIGZhaWwgPCAxMDApCiAgICAgICAgICAgIGZhaWwgPSA5OS45CiAgICAgICAgaWYgKHNraXAgPiA5OS45NSAmJiBza2lwIDwgMTAwKQogICAgICAgICAgICBza2lwID0gOTkuOQogICAgICAgIHJldHVybiBbTWF0aC5yb3VuZChwYXNzKjEwKS8xMCwgTWF0aC5yb3VuZChza2lwKjEwKS8xMCwgTWF0aC5yb3VuZChmYWlsKjEwKS8xMF07CiAgICB9CiAgICBmdW5jdGlvbiBjYWxjdWxhdGVXaWR0aHMobnVtMSwgbnVtMiwgbnVtMykgewogICAgICAgIGlmIChudW0xICsgbnVtMiArIG51bTMgPT09IDApCiAgICAgICAgICAgIHJldHVybiBbMC4wLCAwLjAsIDAuMF07CiAgICAgICAgLy8gTWFrZSBzbWFsbCBwZXJjZW50YWdlcyBiZXR0ZXIgdmlzaWJsZQogICAgICAgIGlmIChudW0xID4gMCAmJiBudW0xIDwgMSkKICAgICAgICAgICAgbnVtMSA9IDEKICAgICAgICBpZiAobnVtMiA+IDAgJiYgbnVtMiA8IDEpCiAgICAgICAgICAgIG51bTIgPSAxCiAgICAgICAgaWYgKG51bTMgPiAwICYmIG51bTMgPCAxKQogICAgICAgICAgICBudW0zID0gMQogICAgICAgIC8vIEhhbmRsZSBzaXR1YXRpb24gd2hlcmUgc29tZSBhcmUgcm91bmRlZCB1cAogICAgICAgIHdoaWxlIChudW0xICsgbnVtMiArIG51bTMgPiAxMDApIHsKICAgICAgICAgICAgaWYgKG51bTEgPiBudW0yICYmIG51bTEgPiBudW0zKQogICAgICAgICAgICAgICAgbnVtMSAtPSAwLjE7CiAgICAgICAgICAgIGVsc2UgaWYgKG51bTIgPiBudW0xICYmIG51bTIgPiBudW0zKQogICAgICAgICAgICAgICAgbnVtMiAtPSAwLjE7CiAgICAgICAgICAgIGVsc2UgaWYgKG51bTMgPiBudW0xICYmIG51bTMgPiBudW0yKQogICAgICAgICAgICAgICAgbnVtMyAtPSAwLjE7CiAgICAgICAgICAgIGVsc2UgaWYgKG51bTEgPiBudW0zICYmIG51bTEgPT0gbnVtMikgewogICAgICAgICAgICAgICAgbnVtMSAtPSAwLjE7CiAgICAgICAgICAgICAgICBudW0yIC09IDAuMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChudW0xID4gbnVtMiAmJiBudW0xID09IG51bTMpIHsKICAgICAgICAgICAgICAgIG51bTEgLT0gMC4xOwogICAgICAgICAgICAgICAgbnVtMyAtPSAwLjE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobnVtMiA+IG51bTEgJiYgbnVtMiA9PSBudW0zKSB7CiAgICAgICAgICAgICAgICBudW0yIC09IDAuMTsKICAgICAgICAgICAgICAgIG51bTMgLT0gMC4xOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBbTWF0aC5jZWlsKG51bTEqMTApLzEwLCBNYXRoLmNlaWwobnVtMioxMCkvMTAsIE1hdGguY2VpbChudW0zKjEwKS8xMF07CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIFN0YXRpc3RpY3M6IFN0YXRpc3RpY3MKICAgIH07Cn0oKSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy51dGlsID0gZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gbWFwKGVsZW1zLCBmdW5jKSB7CiAgICAgICAgdmFyIHJldCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICByZXRbaV0gPSBmdW5jKGVsZW1zW2ldKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0KICAgIGZ1bmN0aW9uIGZpbHRlcihlbGVtcywgcHJlZGljYXRlKSB7CiAgICAgICAgdmFyIHJldCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBpZiAocHJlZGljYXRlKGVsZW1zW2ldKSkKICAgICAgICAgICAgICAgIHJldC5wdXNoKGVsZW1zW2ldKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0KICAgIGZ1bmN0aW9uIGFsbChlbGVtcykgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBpZiAoIWVsZW1zW2ldKQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGFueShlbGVtcykgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBpZiAoZWxlbXNbaV0pCiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbXNbaV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnRhaW5zKGVsZW1zLCBlKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChlbGVtc1tpXSA9PSBlKQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZ1bmN0aW9uIGxhc3QoaXRlbXMpIHsKICAgICAgICByZXR1cm4gaXRlbXNbaXRlbXMubGVuZ3RoLTFdOwogICAgfQogICAgZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8mbHQ7L2csICc8JykucmVwbGFjZSgvJmd0Oy9nLCAnPicpLnJlcGxhY2UoLyZhbXA7L2csICcmJyk7CiAgICB9CiAgICBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7CiAgICB9CiAgICBmdW5jdGlvbiBub3JtYWxpemUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyAvZywgJycpLnJlcGxhY2UoL18vZywgJycpOwogICAgfQogICAgZnVuY3Rpb24gcmVnZXhwRXNjYXBlKHN0cmluZykgewogICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvWy1bXF17fSgpKz8qLixcXF4kfCNdL2csICJcXCQmIik7CiAgICB9CiAgICBmdW5jdGlvbiBNYXRjaGVyKHBhdHRlcm4pIHsKICAgICAgICBwYXR0ZXJuID0gcmVnZXhwRXNjYXBlKG5vcm1hbGl6ZShwYXR0ZXJuKSk7CiAgICAgICAgdmFyIHJlUGF0dGVybiA9ICdeJyArIHBhdHRlcm4ucmVwbGFjZSgvXFxcPy9nLCAnLicpLnJlcGxhY2UoL1xcXCovZywgJ1tcXHNcXFNdKicpICsgJyQnOwogICAgICAgIHZhciByZWdleHAgPSBuZXcgUmVnRXhwKHJlUGF0dGVybik7CiAgICAgICAgZnVuY3Rpb24gbWF0Y2hlcyhzdHJpbmcpIHsKICAgICAgICAgICAgcmV0dXJuIHJlZ2V4cC50ZXN0KG5vcm1hbGl6ZShzdHJpbmcpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbWF0Y2hlczogbWF0Y2hlcywKICAgICAgICAgICAgbWF0Y2hlc0FueTogZnVuY3Rpb24gKHN0cmluZ3MpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzdHJpbmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQogICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzKHN0cmluZ3NbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBmb3JtYXRQYXJlbnROYW1lKGl0ZW0pIHsKICAgICAgICB2YXIgcGFyZW50TmFtZSA9IGl0ZW0uZnVsbE5hbWUuc2xpY2UoMCwgaXRlbS5mdWxsTmFtZS5sZW5ndGggLSBpdGVtLm5hbWUubGVuZ3RoKTsKICAgICAgICByZXR1cm4gcGFyZW50TmFtZS5yZXBsYWNlKC9cLi9nLCAnIC4gJyk7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lRnJvbURhdGUoZGF0ZSkgewogICAgICAgIGlmICghZGF0ZSkKICAgICAgICAgICAgcmV0dXJuICdOL0EnOwogICAgICAgIHJldHVybiBmb3JtYXRUaW1lKGRhdGUuZ2V0SG91cnMoKSwgZGF0ZS5nZXRNaW51dGVzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZS5nZXRTZWNvbmRzKCksIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpOwogICAgfQogICAgZnVuY3Rpb24gZGF0ZUZyb21EYXRlKGRhdGUpIHsKICAgICAgICBpZiAoIWRhdGUpCiAgICAgICAgICAgIHJldHVybiAnTi9BJzsKICAgICAgICByZXR1cm4gcGFkVG8oZGF0ZS5nZXRGdWxsWWVhcigpLCA0KSArCiAgICAgICAgICAgICAgIHBhZFRvKGRhdGUuZ2V0TW9udGgoKSArIDEsIDIpICsKICAgICAgICAgICAgICAgcGFkVG8oZGF0ZS5nZXREYXRlKCksIDIpOwogICAgfQogICAgZnVuY3Rpb24gZGF0ZVRpbWVGcm9tRGF0ZShkYXRlKSB7CiAgICAgICAgaWYgKCFkYXRlKQogICAgICAgICAgICByZXR1cm4gJ04vQSc7CiAgICAgICAgcmV0dXJuIGRhdGVGcm9tRGF0ZShkYXRlKSArICcgJyArIHRpbWVGcm9tRGF0ZShkYXRlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1hdFRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpc2Vjb25kcykgewogICAgICAgIHJldHVybiBwYWRUbyhob3VycywgMikgKyAnOicgKwogICAgICAgICAgICAgICBwYWRUbyhtaW51dGVzLCAyKSArICc6JyArCiAgICAgICAgICAgICAgIHBhZFRvKHNlY29uZHMsIDIpICsgJy4nICsKICAgICAgICAgICAgICAgcGFkVG8obWlsbGlzZWNvbmRzLCAzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1hdEVsYXBzZWQoZWxhcHNlZCkgewogICAgICAgIHZhciBtaWxsaXMgPSBlbGFwc2VkOwogICAgICAgIHZhciBob3VycyA9IE1hdGguZmxvb3IobWlsbGlzIC8gKDYwICogNjAgKiAxMDAwKSk7CiAgICAgICAgbWlsbGlzIC09IGhvdXJzICogNjAgKiA2MCAqIDEwMDA7CiAgICAgICAgdmFyIG1pbnV0ZXMgPSBNYXRoLmZsb29yKG1pbGxpcyAvICg2MCAqIDEwMDApKTsKICAgICAgICBtaWxsaXMgLT0gbWludXRlcyAqIDYwICogMTAwMDsKICAgICAgICB2YXIgc2Vjb25kcyA9IE1hdGguZmxvb3IobWlsbGlzIC8gMTAwMCk7CiAgICAgICAgbWlsbGlzIC09IHNlY29uZHMgKiAxMDAwOwogICAgICAgIHJldHVybiBmb3JtYXRUaW1lKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXMpOwogICAgfQogICAgZnVuY3Rpb24gcGFkVG8obnVtYmVyLCBsZW4pIHsKICAgICAgICB2YXIgbnVtU3RyaW5nID0gbnVtYmVyICsgIiI7CiAgICAgICAgd2hpbGUgKG51bVN0cmluZy5sZW5ndGggPCBsZW4pIG51bVN0cmluZyA9ICIwIiArIG51bVN0cmluZzsKICAgICAgICByZXR1cm4gbnVtU3RyaW5nOwogICAgfQogICAgZnVuY3Rpb24gdGltZXN0YW1wKG1pbGxpcykgewogICAgICAgIC8vIHVzZWQgYWxzbyBieSB0b29scyB0aGF0IGRvIG5vdCBzZXQgd2luZG93Lm91dHB1dC5iYXNlTWlsbGlzCiAgICAgICAgdmFyIGJhc2UgPSB3aW5kb3cub3V0cHV0ID8gd2luZG93Lm91dHB1dC5iYXNlTWlsbGlzIDogMDsKICAgICAgICByZXR1cm4gbmV3IERhdGUoYmFzZSArIG1pbGxpcyk7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVHZW5lcmF0ZWRTdHJpbmcodGltZXN0YW1wKSB7CiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh0aW1lc3RhbXApOwogICAgICAgIHZhciBkdCA9IGRhdGVUaW1lRnJvbURhdGUoZGF0ZSkuc2xpY2UoMCwgMTcpOyAgLy8gZHJvcCBtaWxsaXMKICAgICAgICB2YXIgb2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpOwogICAgICAgIHZhciBzaWduID0gb2Zmc2V0ID4gMCA/ICctJyA6ICcrJzsKICAgICAgICB2YXIgaGggPSBNYXRoLmZsb29yKE1hdGguYWJzKG9mZnNldCkgLyA2MCk7CiAgICAgICAgdmFyIG1tID0gTWF0aC5hYnMob2Zmc2V0KSAlIDYwOwogICAgICAgIHJldHVybiBkdCArICcgVVRDJyArIHNpZ24gKyBwYWRUbyhoaCwgMikgKyAnOicgKyBwYWRUbyhtbSwgMik7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmcodGltZXN0YW1wKSB7CiAgICAgICAgZnVuY3Rpb24gdGltZVN0cmluZyh0aW1lLCBzaG9ydFVuaXQpIHsKICAgICAgICAgICAgdmFyIHVuaXQgPSB7eTogJ3llYXInLCBkOiAnZGF5JywgaDogJ2hvdXInLCBtOiAnbWludXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgczogJ3NlY29uZCd9W3Nob3J0VW5pdF07CiAgICAgICAgICAgIHZhciBlbmQgPSB0aW1lID09IDEgPyAnICcgOiAncyAnOwogICAgICAgICAgICByZXR1cm4gdGltZSArICcgJyArIHVuaXQgKyBlbmQ7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNvbXBlbnNhdGVMZWFwWWVhcnMoZGF5cywgeWVhcnMpIHsKICAgICAgICAgICAgLy8gTm90IGEgcGVyZmVjdCBhbGdvcml0aG0gYnV0IG91Z2h0IHRvIGJlIGVub3VnaAogICAgICAgICAgICByZXR1cm4gZGF5cyAtIE1hdGguZmxvb3IoeWVhcnMgLyA0KTsKICAgICAgICB9CiAgICAgICAgdmFyIGdlbmVyYXRlZCA9IE1hdGgucm91bmQodGltZXN0YW1wIC8gMTAwMCk7CiAgICAgICAgdmFyIGN1cnJlbnQgPSBNYXRoLnJvdW5kKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCk7CiAgICAgICAgdmFyIGVsYXBzZWQgPSBjdXJyZW50IC0gZ2VuZXJhdGVkOwogICAgICAgIHZhciBwcmVmaXggPSAnJzsKICAgICAgICBpZiAoZWxhcHNlZCA8IDApIHsKICAgICAgICAgICAgcHJlZml4ID0gJy0gJzsKICAgICAgICAgICAgZWxhcHNlZCA9IE1hdGguYWJzKGVsYXBzZWQpOwogICAgICAgIH0KICAgICAgICB2YXIgc2VjcyAgPSBlbGFwc2VkICUgNjA7CiAgICAgICAgdmFyIG1pbnMgID0gTWF0aC5mbG9vcihlbGFwc2VkIC8gNjApICUgNjA7CiAgICAgICAgdmFyIGhvdXJzID0gTWF0aC5mbG9vcihlbGFwc2VkIC8gKDYwKjYwKSkgJSAyNDsKICAgICAgICB2YXIgZGF5cyAgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyAoNjAqNjAqMjQpKSAlIDM2NTsKICAgICAgICB2YXIgeWVhcnMgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyAoNjAqNjAqMjQqMzY1KSk7CiAgICAgICAgaWYgKHllYXJzKSB7CiAgICAgICAgICAgIGRheXMgPSBjb21wZW5zYXRlTGVhcFllYXJzKGRheXMsIHllYXJzKTsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoeWVhcnMsICd5JykgKyB0aW1lU3RyaW5nKGRheXMsICdkJyk7CiAgICAgICAgfSBlbHNlIGlmIChkYXlzKSB7CiAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyB0aW1lU3RyaW5nKGRheXMsICdkJykgKyB0aW1lU3RyaW5nKGhvdXJzLCAnaCcpOwogICAgICAgIH0gZWxzZSBpZiAoaG91cnMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoaG91cnMsICdoJykgKyB0aW1lU3RyaW5nKG1pbnMsICdtJyk7CiAgICAgICAgfSBlbHNlIGlmIChtaW5zKSB7CiAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyB0aW1lU3RyaW5nKG1pbnMsICdtJykgKyB0aW1lU3RyaW5nKHNlY3MsICdzJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoc2VjcywgJ3MnKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nKHF1ZXJ5KSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICAgIGlmICghcXVlcnkpCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgdmFyIHBhcmFtcyA9IHF1ZXJ5LnNwbGl0KCcmJyk7CiAgICAgICAgdmFyIHBhcnRzOwogICAgICAgIGZ1bmN0aW9uIGRlY29kZShpdGVtKSB7CiAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoaXRlbS5yZXBsYWNlKCcrJywgJyAnKSk7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYXJhbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgcGFydHMgPSBwYXJhbXNbaV0uc3BsaXQoJz0nKTsKICAgICAgICAgICAgcmVzdWx0W2RlY29kZShwYXJ0cy5zaGlmdCgpKV0gPSBkZWNvZGUocGFydHMuam9pbignPScpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgbWFwOiBtYXAsCiAgICAgICAgZmlsdGVyOiBmaWx0ZXIsCiAgICAgICAgYWxsOiBhbGwsCiAgICAgICAgYW55OiBhbnksCiAgICAgICAgY29udGFpbnM6IGNvbnRhaW5zLAogICAgICAgIGxhc3Q6IGxhc3QsCiAgICAgICAgZXNjYXBlOiBlc2NhcGUsCiAgICAgICAgdW5lc2NhcGU6IHVuZXNjYXBlLAogICAgICAgIG5vcm1hbGl6ZTogbm9ybWFsaXplLAogICAgICAgIHJlZ2V4cEVzY2FwZTogcmVnZXhwRXNjYXBlLAogICAgICAgIE1hdGNoZXI6IE1hdGNoZXIsCiAgICAgICAgZm9ybWF0UGFyZW50TmFtZTogZm9ybWF0UGFyZW50TmFtZSwKICAgICAgICB0aW1lRnJvbURhdGU6IHRpbWVGcm9tRGF0ZSwKICAgICAgICBkYXRlRnJvbURhdGU6IGRhdGVGcm9tRGF0ZSwKICAgICAgICBkYXRlVGltZUZyb21EYXRlOiBkYXRlVGltZUZyb21EYXRlLAogICAgICAgIGZvcm1hdEVsYXBzZWQ6IGZvcm1hdEVsYXBzZWQsCiAgICAgICAgdGltZXN0YW1wOiB0aW1lc3RhbXAsCiAgICAgICAgY3JlYXRlR2VuZXJhdGVkU3RyaW5nOiBjcmVhdGVHZW5lcmF0ZWRTdHJpbmcsCiAgICAgICAgY3JlYXRlR2VuZXJhdGVkQWdvU3RyaW5nOiBjcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmcsCiAgICAgICAgcGFyc2VRdWVyeVN0cmluZzogcGFyc2VRdWVyeVN0cmluZwogICAgfTsKfSgpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cudGVzdGRhdGEgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgZWxlbWVudHNCeUlkID0ge307CiAgICB2YXIgaWRDb3VudGVyID0gMDsKICAgIHZhciBfc3RhdGlzdGljcyA9IG51bGw7CiAgICB2YXIgTEVWRUxTID0gWydUUkFDRScsICdERUJVRycsICdJTkZPJywgJ1dBUk4nLCAnRVJST1InLCAnRkFJTCcsICdTS0lQJ107CiAgICB2YXIgU1RBVFVTRVMgPSBbJ0ZBSUwnLCAnUEFTUycsICdTS0lQJywgJ05PVCBSVU4nXTsKICAgIHZhciBLRVlXT1JEX1RZUEVTID0gWydLRVlXT1JEJywgJ1NFVFVQJywgJ1RFQVJET1dOJywgJ0ZPUicsICdWQVInLCAnSUYnLCAnRUxTRSBJRicsICdFTFNFJ107CiAgICB2YXIgTUVTU0FHRV9UWVBFID0gODsKICAgIGZ1bmN0aW9uIGFkZEVsZW1lbnQoZWxlbSkgewogICAgICAgIGlmICghZWxlbS5pZCkKICAgICAgICAgICAgZWxlbS5pZCA9IHVuaXF1ZUlkKCk7CiAgICAgICAgZWxlbWVudHNCeUlkW2VsZW0uaWRdID0gZWxlbTsKICAgICAgICByZXR1cm4gZWxlbTsKICAgIH0KICAgIGZ1bmN0aW9uIHVuaXF1ZUlkKCkgewogICAgICAgIGlkQ291bnRlcisrOwogICAgICAgIHJldHVybiAnZWxlbWVudC1pZC0nICsgaWRDb3VudGVyOwogICAgfQogICAgZnVuY3Rpb24gdGltZXMoc3RhdHMpIHsKICAgICAgICB2YXIgc3RhcnRNaWxsaXMgPSBzdGF0c1sxXTsKICAgICAgICB2YXIgZWxhcHNlZCA9IHN0YXRzWzJdOwogICAgICAgIGlmIChzdGFydE1pbGxpcyA9PT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBudWxsLCBlbGFwc2VkXTsKICAgICAgICByZXR1cm4gW3V0aWwudGltZXN0YW1wKHN0YXJ0TWlsbGlzKSwKICAgICAgICAgICAgICAgIHV0aWwudGltZXN0YW1wKHN0YXJ0TWlsbGlzICsgZWxhcHNlZCksCiAgICAgICAgICAgICAgICBlbGFwc2VkXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2UoZWxlbWVudCwgc3RyaW5ncykgewogICAgICAgIHJldHVybiBtb2RlbC5NZXNzYWdlKExFVkVMU1tlbGVtZW50WzJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnRpbWVzdGFtcChlbGVtZW50WzFdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzLmdldChlbGVtZW50WzNdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzLmdldChlbGVtZW50WzRdKSk7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZVN0YXR1cyhzdGF0cykgewogICAgICAgIHJldHVybiBTVEFUVVNFU1tzdGF0c1swXV07CiAgICB9CiAgICBmdW5jdGlvbiBjaGlsZENyZWF0b3IocGFyZW50LCBjaGlsZFR5cGUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVsZW0sIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgICAgIHJldHVybiBhZGRFbGVtZW50KGNoaWxkVHlwZShwYXJlbnQsIGVsZW0sIHN0cmluZ3MsIGluZGV4KSk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUJvZHlJdGVtKHBhcmVudCwgZWxlbWVudCwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICBpZiAoZWxlbWVudFswXSA9PSBNRVNTQUdFX1RZUEUpCiAgICAgICAgICAgIHJldHVybiBjcmVhdGVNZXNzYWdlKGVsZW1lbnQsIHN0cmluZ3MpOwogICAgICAgIHJldHVybiBjcmVhdGVLZXl3b3JkKHBhcmVudCwgZWxlbWVudCwgc3RyaW5ncywgaW5kZXgpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlS2V5d29yZChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIGt3ID0gbW9kZWwuS2V5d29yZCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICB0eXBlOiBLRVlXT1JEX1RZUEVTW2VsZW1lbnRbMF1dLAogICAgICAgICAgICBpZDogJ2snICsgKGluZGV4ICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMV0pLAogICAgICAgICAgICBsaWJuYW1lOiBzdHJpbmdzLmdldChlbGVtZW50WzJdKSwKICAgICAgICAgICAgdGltZW91dDogc3RyaW5ncy5nZXQoZWxlbWVudFszXSksCiAgICAgICAgICAgIGFyZ3M6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbNV0pLAogICAgICAgICAgICBhc3NpZ246IHN0cmluZ3MuZ2V0KGVsZW1lbnRbNl0pLAogICAgICAgICAgICB0YWdzOiBzdHJpbmdzLmdldChlbGVtZW50WzddKSwKICAgICAgICAgICAgZG9jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZG9jID0gc3RyaW5ncy5nZXQoZWxlbWVudFs0XSk7CiAgICAgICAgICAgICAgICB0aGlzLmRvYyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvYzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBkb2M7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHN0YXR1czogcGFyc2VTdGF0dXMoZWxlbWVudFs4XSwgc3RyaW5ncyksCiAgICAgICAgICAgIHRpbWVzOiBtb2RlbC5UaW1lcyh0aW1lcyhlbGVtZW50WzhdKSksCiAgICAgICAgICAgIGlzQ2hpbGRyZW5Mb2FkZWQ6IHR5cGVvZihlbGVtZW50WzldKSAhPT0gJ251bWJlcicKICAgICAgICB9KTsKICAgICAgICBsYXp5UG9wdWxhdGVLZXl3b3Jkc0Zyb21GaWxlKGt3LCBlbGVtZW50WzldLCBzdHJpbmdzKTsKICAgICAgICByZXR1cm4ga3c7CiAgICB9CiAgICBmdW5jdGlvbiBsYXp5UG9wdWxhdGVLZXl3b3Jkc0Zyb21GaWxlKHBhcmVudCwgbW9kZWxPckluZGV4LCBzdHJpbmdzKSB7CiAgICAgICAgdmFyIG1vZGVsLCBpbmRleCwgcG9wdWxhdG9yOwogICAgICAgIHZhciBjcmVhdG9yID0gY2hpbGRDcmVhdG9yKHBhcmVudCwgY3JlYXRlQm9keUl0ZW0pOwogICAgICAgIGlmIChwYXJlbnQuaXNDaGlsZHJlbkxvYWRlZCkgewogICAgICAgICAgICBtb2RlbCA9IG1vZGVsT3JJbmRleDsKICAgICAgICAgICAgcG9wdWxhdG9yID0gUG9wdWxhdG9yKG1vZGVsLCBzdHJpbmdzLCBjcmVhdG9yKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbmRleCA9IG1vZGVsT3JJbmRleDsKICAgICAgICAgICAgcGFyZW50LmNoaWxkRmlsZU5hbWUgPSB3aW5kb3cuc2V0dGluZ3NbJ3NwbGl0TG9nQmFzZSddICsgJy0nICsgaW5kZXggKyAnLmpzJzsKICAgICAgICAgICAgcG9wdWxhdG9yID0gU3BsaXRMb2dQb3B1bGF0b3IoaW5kZXgsIGNyZWF0b3IpOwogICAgICAgIH0KICAgICAgICBwYXJlbnQucG9wdWxhdGVLZXl3b3Jkcyhwb3B1bGF0b3IpOwogICAgfQogICAgZnVuY3Rpb24gdGFncyh0YWdsaXN0LCBzdHJpbmdzKSB7CiAgICAgICAgcmV0dXJuIHV0aWwubWFwKHRhZ2xpc3QsIHN0cmluZ3MuZ2V0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVRlc3QocGFyZW50LCBlbGVtZW50LCBzdHJpbmdzLCBpbmRleCkgewogICAgICAgIHZhciBzdGF0dXMgPSBlbGVtZW50WzRdOwogICAgICAgIHZhciB0ZXN0ID0gbW9kZWwuVGVzdCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICBpZDogJ3QnICsgKGluZGV4ICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMF0pLAogICAgICAgICAgICBkb2M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkb2MgPSBzdHJpbmdzLmdldChlbGVtZW50WzJdKTsKICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZW91dDogc3RyaW5ncy5nZXQoZWxlbWVudFsxXSksCiAgICAgICAgICAgIHN0YXR1czogcGFyc2VTdGF0dXMoc3RhdHVzKSwKICAgICAgICAgICAgbWVzc2FnZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIG1zZyA9IHN0YXR1cy5sZW5ndGggPT0gNCA/IHN0cmluZ3MuZ2V0KHN0YXR1c1szXSkgOiAnJzsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1zZzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRpbWVzOiBtb2RlbC5UaW1lcyh0aW1lcyhzdGF0dXMpKSwKICAgICAgICAgICAgdGFnczogdGFncyhlbGVtZW50WzNdLCBzdHJpbmdzKSwKICAgICAgICAgICAgaXNDaGlsZHJlbkxvYWRlZDogdHlwZW9mKGVsZW1lbnRbNV0pICE9PSAnbnVtYmVyJwogICAgICAgIH0pOwogICAgICAgIGxhenlQb3B1bGF0ZUtleXdvcmRzRnJvbUZpbGUodGVzdCwgZWxlbWVudFs1XSwgc3RyaW5ncyk7CiAgICAgICAgcmV0dXJuIHRlc3Q7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVTdWl0ZShwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1cyA9IGVsZW1lbnRbNV07CiAgICAgICAgdmFyIHN1aXRlID0gbW9kZWwuU3VpdGUoewogICAgICAgICAgICBwYXJlbnQ6IHBhcmVudCwKICAgICAgICAgICAgaWQ6ICdzJyArICgoaW5kZXggfHwgMCkgKyAxKSwKICAgICAgICAgICAgbmFtZTogc3RyaW5ncy5nZXQoZWxlbWVudFswXSksCiAgICAgICAgICAgIHNvdXJjZTogc3RyaW5ncy5nZXQoZWxlbWVudFsxXSksCiAgICAgICAgICAgIHJlbGF0aXZlU291cmNlOiBzdHJpbmdzLmdldChlbGVtZW50WzJdKSwKICAgICAgICAgICAgZG9jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZG9jID0gc3RyaW5ncy5nZXQoZWxlbWVudFszXSk7CiAgICAgICAgICAgICAgICB0aGlzLmRvYyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvYzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBkb2M7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHN0YXR1czogcGFyc2VTdGF0dXMoc3RhdHVzKSwKICAgICAgICAgICAgbWVzc2FnZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIG1zZyA9IHN0YXR1cy5sZW5ndGggPT0gNCA/IHN0cmluZ3MuZ2V0KHN0YXR1c1szXSkgOiAnJzsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1zZzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRpbWVzOiBtb2RlbC5UaW1lcyh0aW1lcyhzdGF0dXMpKSwKICAgICAgICAgICAgc3RhdGlzdGljczogc3VpdGVTdGF0cyh1dGlsLmxhc3QoZWxlbWVudCkpLAogICAgICAgICAgICBtZXRhZGF0YTogcGFyc2VNZXRhZGF0YShlbGVtZW50WzRdLCBzdHJpbmdzKQogICAgICAgIH0pOwogICAgICAgIHN1aXRlLnBvcHVsYXRlS2V5d29yZHMoUG9wdWxhdG9yKGVsZW1lbnRbOF0sIHN0cmluZ3MsIGNoaWxkQ3JlYXRvcihzdWl0ZSwgY3JlYXRlS2V5d29yZCkpKTsKICAgICAgICBzdWl0ZS5wb3B1bGF0ZVRlc3RzKFBvcHVsYXRvcihlbGVtZW50WzddLCBzdHJpbmdzLCBjaGlsZENyZWF0b3Ioc3VpdGUsIGNyZWF0ZVRlc3QpKSk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVTdWl0ZXMoUG9wdWxhdG9yKGVsZW1lbnRbNl0sIHN0cmluZ3MsIGNoaWxkQ3JlYXRvcihzdWl0ZSwgY3JlYXRlU3VpdGUpKSk7CiAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VNZXRhZGF0YShkYXRhLCBzdHJpbmdzKSB7CiAgICAgICAgdmFyIG1ldGFkYXRhID0gW107CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGRhdGEubGVuZ3RoOyBpKz0yKSB7CiAgICAgICAgICAgIG1ldGFkYXRhLnB1c2goW3N0cmluZ3MuZ2V0KGRhdGFbaV0pLCBzdHJpbmdzLmdldChkYXRhW2krMV0pXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtZXRhZGF0YTsKICAgIH0KICAgIGZ1bmN0aW9uIHN1aXRlU3RhdHMoc3RhdHMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b3RhbDogc3RhdHNbMF0sCiAgICAgICAgICAgIHBhc3M6IHN0YXRzWzFdLAogICAgICAgICAgICBmYWlsOiBzdGF0c1syXSwKICAgICAgICAgICAgc2tpcDogc3RhdHNbM10KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gUG9wdWxhdG9yKGl0ZW1zLCBzdHJpbmdzLCBjcmVhdG9yKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbnVtYmVyT2ZJdGVtczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY3JlYXRvcjogZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRvcihpdGVtc1tpbmRleF0sIHN0cmluZ3MsIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBTcGxpdExvZ1BvcHVsYXRvcihzdHJ1Y3R1cmVJbmRleCwgY3JlYXRvcikgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG51bWJlck9mSXRlbXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3dbJ2tleXdvcmRzJytzdHJ1Y3R1cmVJbmRleF0ubGVuZ3RoOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjcmVhdG9yOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdG9yKHdpbmRvd1sna2V5d29yZHMnK3N0cnVjdHVyZUluZGV4XVtpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3dbJ3N0cmluZ3MnK3N0cnVjdHVyZUluZGV4XSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3VpdGUoKSB7CiAgICAgICAgdmFyIGVsZW0gPSB3aW5kb3cub3V0cHV0LnN1aXRlOwogICAgICAgIGlmIChlbGVtZW50c0J5SWRbZWxlbS5pZF0pCiAgICAgICAgICAgIHJldHVybiBlbGVtOwogICAgICAgIHZhciByb290ID0gYWRkRWxlbWVudChjcmVhdGVTdWl0ZShudWxsLCBlbGVtLCBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKSk7CiAgICAgICAgd2luZG93Lm91dHB1dC5zdWl0ZSA9IHJvb3Q7CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kTG9hZGVkKGlkKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnRzQnlJZFtpZF07CiAgICB9CiAgICBmdW5jdGlvbiBlbnN1cmVMb2FkZWQoaWQsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIGlkcyA9IGlkLnNwbGl0KCctJyk7CiAgICAgICAgdmFyIHJvb3QgPSBzdWl0ZSgpOwogICAgICAgIGlkcy5zaGlmdCgpOwogICAgICAgIGxvYWRJdGVtcyhpZHMsIHJvb3QsIFtyb290LmlkXSwgY2FsbGJhY2spOwogICAgfQogICAgZnVuY3Rpb24gbG9hZEl0ZW1zKGlkcywgY3VycmVudCwgcmVzdWx0LCBjYWxsYmFjaykgewogICAgICAgIGlmICghaWRzLmxlbmd0aCkgewogICAgICAgICAgICBjYWxsYmFjayhyZXN1bHQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQuY2FsbFdoZW5DaGlsZHJlblJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGlkID0gaWRzLnNoaWZ0KCk7CiAgICAgICAgICAgIHZhciB0eXBlID0gaWRbMF07CiAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KGlkLnN1YnN0cmluZygxKSkgLSAxOwogICAgICAgICAgICB2YXIgaXRlbSA9IHNlbGVjdEZyb20oY3VycmVudCwgdHlwZSwgaW5kZXgpOwogICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0uaWQpOwogICAgICAgICAgICBlbHNlICAgIC8vIEludmFsaWQgaWQuIFNob3VsZCB0aGlzIGJlIHJlcG9ydGVkIHNvbWV3aGVyZT8KICAgICAgICAgICAgICAgIGlkcyA9IFtdOwogICAgICAgICAgICBsb2FkSXRlbXMoaWRzLCBpdGVtLCByZXN1bHQsIGNhbGxiYWNrKTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHNlbGVjdEZyb20oZWxlbWVudCwgdHlwZSwgaW5kZXgpIHsKICAgICAgICBpZiAodHlwZSA9PT0gJ2snKSB7CiAgICAgICAgICAgIHZhciBrZXl3b3JkcyA9IHV0aWwuZmlsdGVyKGVsZW1lbnQua2V5d29yZHMoKSwgZnVuY3Rpb24gKGt3KSB7CiAgICAgICAgICAgICAgICByZXR1cm4ga3cudHlwZSAhPSAnbWVzc2FnZSc7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4ga2V5d29yZHNbaW5kZXhdOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3QnKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRlc3RzKClbaW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnN1aXRlcygpW2luZGV4XTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBlcnJvckl0ZXJhdG9yKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhZGRFbGVtZW50KGNyZWF0ZU1lc3NhZ2Uod2luZG93Lm91dHB1dC5lcnJvcnMuc2hpZnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nU3RvcmUod2luZG93Lm91dHB1dC5zdHJpbmdzKSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBoYXNOZXh0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93Lm91dHB1dC5lcnJvcnMubGVuZ3RoID4gMDsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBzdGF0aXN0aWNzKCkgewogICAgICAgIGlmICghX3N0YXRpc3RpY3MpIHsKICAgICAgICAgICAgdmFyIHN0YXREYXRhID0gd2luZG93Lm91dHB1dC5zdGF0czsKICAgICAgICAgICAgX3N0YXRpc3RpY3MgPSBzdGF0cy5TdGF0aXN0aWNzKHN0YXREYXRhWzBdLCBzdGF0RGF0YVsxXSwgc3RhdERhdGFbMl0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX3N0YXRpc3RpY3M7CiAgICB9CiAgICBmdW5jdGlvbiBTdHJpbmdTdG9yZShzdHJpbmdzKSB7CiAgICAgICAgZnVuY3Rpb24gZ2V0VGV4dChpZCkgewogICAgICAgICAgICB2YXIgdGV4dCA9IHN0cmluZ3NbaWRdOwogICAgICAgICAgICBpZiAoIXRleHQpCiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIGlmICh0ZXh0WzBdID09ICcqJykKICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZygxKTsKICAgICAgICAgICAgdmFyIGV4dHJhY3RlZCA9IGV4dHJhY3QodGV4dCk7CiAgICAgICAgICAgIHN0cmluZ3NbaWRdID0gJyonICsgZXh0cmFjdGVkOwogICAgICAgICAgICByZXR1cm4gZXh0cmFjdGVkOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBleHRyYWN0KHRleHQpIHsKICAgICAgICAgICAgdmFyIGRlY29kZWQgPSBKWEcuVXRpbC5CYXNlNjQuZGVjb2RlQXNBcnJheSh0ZXh0KTsKICAgICAgICAgICAgdmFyIGV4dHJhY3RlZCA9IChuZXcgSlhHLlV0aWwuVW56aXAoZGVjb2RlZCkpLnVuemlwKClbMF1bMF07CiAgICAgICAgICAgIHJldHVybiBKWEcuVXRpbC5VVEY4LmRlY29kZShleHRyYWN0ZWQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBnZXQoaWQpIHsKICAgICAgICAgICAgaWYgKGlkID09PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgICAgICAgcmV0dXJuIGdldFRleHQoaWQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4ge2dldDogZ2V0fTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgc3VpdGU6IHN1aXRlLAogICAgICAgIGVycm9ySXRlcmF0b3I6IGVycm9ySXRlcmF0b3IsCiAgICAgICAgZmluZExvYWRlZDogZmluZExvYWRlZCwKICAgICAgICBlbnN1cmVMb2FkZWQ6IGVuc3VyZUxvYWRlZCwKICAgICAgICBzdGF0aXN0aWNzOiBzdGF0aXN0aWNzLAogICAgICAgIFN0cmluZ1N0b3JlOiBTdHJpbmdTdG9yZSwgIC8vIGV4cG9zZWQgZm9yIHRlc3RzCiAgICAgICAgTEVWRUxTOiBMRVZFTFMKICAgIH07Cn0oKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KZnVuY3Rpb24gcmVtb3ZlSmF2YVNjcmlwdERpc2FibGVkV2FybmluZygpIHsKICAgIC8vIE5vdCB1c2luZyBqUXVlcnkgaGVyZSBmb3IgbWF4aW11bSBzcGVlZAogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2phdmFzY3JpcHQtZGlzYWJsZWQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwp9CmZ1bmN0aW9uIGFkZEphdmFTY3JpcHREaXNhYmxlZFdhcm5pbmcoZXJyb3IpIHsKICAgIGlmICh3aW5kb3cuY29uc29sZSkKICAgICAgICBjb25zb2xlLmVycm9yKCdPcGVuaW5nIGZhaWxlZDogJyArIGVycm9yLm5hbWUgKyAnOiAnICsgZXJyb3IubWVzc2FnZSk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamF2YXNjcmlwdC1kaXNhYmxlZCcpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwp9CmZ1bmN0aW9uIGluaXRMYXlvdXQoc3VpdGVOYW1lLCB0eXBlKSB7CiAgICBwYXJzZVRlbXBsYXRlcygpOwogICAgc2V0VGl0bGUoc3VpdGVOYW1lLCB0eXBlKTsKICAgIGFkZEhlYWRlcigpOwogICAgYWRkUmVwb3J0T3JMb2dMaW5rKHR5cGUpOwp9CmZ1bmN0aW9uIHBhcnNlVGVtcGxhdGVzKCkgewogICAgJCgnc2NyaXB0W3R5cGU9InRleHQveC1qcXVlcnktdG1wbCJdJykubWFwKGZ1bmN0aW9uIChpZHgsIGVsZW0pIHsKICAgICAgICAkLnRlbXBsYXRlKGVsZW0uaWQsIGVsZW0udGV4dCk7CiAgICB9KTsKfQpmdW5jdGlvbiB0ZXN0T3JUYXNrKHRleHQpIHsKICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL3soLiopfS8sIGZ1bmN0aW9uIChtYXRjaCwgZ3JvdXAsIG9mZnNldCwgc3RyaW5nKSB7CiAgICAgICAgaWYgKCF3aW5kb3cuc2V0dGluZ3MucnBhKQogICAgICAgICAgICByZXR1cm4gZ3JvdXA7CiAgICAgICAgcmV0dXJuIHsnVEVTVCc6ICdUQVNLJywgJ1Rlc3QnOiAnVGFzaycsICd0ZXN0JzogJ3Rhc2snfVtncm91cF07CiAgICB9KTsKfQpmdW5jdGlvbiBzZXRUaXRsZShzdWl0ZU5hbWUsIHR5cGUpIHsKICAgIHZhciBnaXZlblRpdGxlID0gd2luZG93LnNldHRpbmdzLnRpdGxlOwogICAgdmFyIHRpdGxlID0gZ2l2ZW5UaXRsZSA/IGdpdmVuVGl0bGUgOiBzdWl0ZU5hbWUgKyAiICIgKyB0eXBlOwogICAgZG9jdW1lbnQudGl0bGUgPSB1dGlsLnVuZXNjYXBlKHRpdGxlKTsKfQpmdW5jdGlvbiBhZGRIZWFkZXIoKSB7CiAgICB2YXIgZ2VuZXJhdGVkID0gdXRpbC50aW1lc3RhbXAod2luZG93Lm91dHB1dC5nZW5lcmF0ZWQpOwogICAgJC50bXBsKCc8aDE+JHt0aXRsZX08L2gxPicgKwogICAgICAgICAgICc8ZGl2IGlkPSJnZW5lcmF0ZWQiPicgKwogICAgICAgICAgICAgJzxzcGFuPkdlbmVyYXRlZDxicj4ke2dlbmVyYXRlZH08L3NwYW4+PGJyPicgKwogICAgICAgICAgICAgJzxzcGFuIGlkPSJnZW5lcmF0ZWQtYWdvIj4ke2Fnb30gYWdvPC9zcGFuPicgKwogICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAnPGRpdiBpZD0idG9wLXJpZ2h0LWhlYWRlciI+JyArCiAgICAgICAgICAgICAnPGRpdiBpZD0icmVwb3J0LW9yLWxvZy1saW5rIj48YSBocmVmPSIjIj48L2E+PC9kaXY+JyArCiAgICAgICAgICAgJzwvZGl2PicsIHsKICAgICAgICBnZW5lcmF0ZWQ6IHV0aWwuY3JlYXRlR2VuZXJhdGVkU3RyaW5nKGdlbmVyYXRlZCksCiAgICAgICAgYWdvOiB1dGlsLmNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZyhnZW5lcmF0ZWQpLAogICAgICAgIHRpdGxlOiBkb2N1bWVudC50aXRsZQogICAgfSkuYXBwZW5kVG8oJCgnI2hlYWRlcicpKTsKfQpmdW5jdGlvbiBhZGRSZXBvcnRPckxvZ0xpbmsobXlUeXBlKSB7CiAgICB2YXIgdXJsOwogICAgdmFyIHRleHQ7CiAgICB2YXIgY29udGFpbmVyID0gJCgnI3JlcG9ydC1vci1sb2ctbGluaycpOwogICAgaWYgKG15VHlwZSA9PSAnUmVwb3J0JykgewogICAgICAgIHVybCA9IHdpbmRvdy5zZXR0aW5ncy5sb2dVUkw7CiAgICAgICAgdGV4dCA9ICdMT0cnOwogICAgfSBlbHNlIHsKICAgICAgICB1cmwgPSB3aW5kb3cuc2V0dGluZ3MucmVwb3J0VVJMOwogICAgICAgIHRleHQgPSAnUkVQT1JUJzsKICAgIH0KICAgIGlmICh1cmwpIHsKICAgICAgICBjb250YWluZXIuZmluZCgnYScpLmF0dHIoJ2hyZWYnLCB1cmwpOwogICAgICAgIGNvbnRhaW5lci5maW5kKCdhJykudGV4dCh0ZXh0KTsKICAgIH0gZWxzZSB7CiAgICAgICAgY29udGFpbmVyLnJlbW92ZSgpOwogICAgfQp9CmZ1bmN0aW9uIGFkZFN0YXRpc3RpY3MoKSB7CiAgICB2YXIgc3RhdEhlYWRlcnMgPQogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij5Ub3RhbDwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPlBhc3M8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij5GYWlsPC90aD4nICsKICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+U2tpcDwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLWVsYXBzZWQiPkVsYXBzZWQ8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+UGFzcyAvIEZhaWwgLyBTa2lwPC90aD4nOwogICAgdmFyIHN0YXRUYWJsZSA9CiAgICAgICAgJzxoMj57VGVzdH0gU3RhdGlzdGljczwvaDI+JyArCiAgICAgICAgJzx0YWJsZSBjbGFzcz0ic3RhdGlzdGljcyIgaWQ9InRvdGFsLXN0YXRzIj48dGhlYWQ+PHRyPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1uYW1lIj5Ub3RhbCBTdGF0aXN0aWNzPC90aD4nICsgc3RhdEhlYWRlcnMgKwogICAgICAgICc8L3RyPjwvdGhlYWQ+PC90YWJsZT4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0idGFnLXN0YXRzIj48dGhlYWQ+PHRyPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1uYW1lIj5TdGF0aXN0aWNzIGJ5IFRhZzwvdGg+JyArIHN0YXRIZWFkZXJzICsKICAgICAgICAnPC90cj48L3RoZWFkPjwvdGFibGU+JyArCiAgICAgICAgJzx0YWJsZSBjbGFzcz0ic3RhdGlzdGljcyIgaWQ9InN1aXRlLXN0YXRzIj48dGhlYWQ+PHRyPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1uYW1lIj5TdGF0aXN0aWNzIGJ5IFN1aXRlPC90aD4nICsgc3RhdEhlYWRlcnMgKwogICAgICAgICc8L3RyPjwvdGhlYWQ+PC90YWJsZT4nOwogICAgJCh0ZXN0T3JUYXNrKHN0YXRUYWJsZSkpLmFwcGVuZFRvKCcjc3RhdGlzdGljcy1jb250YWluZXInKTsKICAgIHV0aWwubWFwKFsndG90YWwnLCAndGFnJywgJ3N1aXRlJ10sIGFkZFN0YXRUYWJsZSk7CiAgICBhZGRUb29sdGlwc1RvRWxhcHNlZFRpbWVzKCk7CiAgICBlbmFibGVTdGF0aXN0aWNzU29ydGVyKCk7Cn0KZnVuY3Rpb24gYWRkVG9vbHRpcHNUb0VsYXBzZWRUaW1lcygpIHsKICAgICQoJy5zdGF0cy1jb2wtZWxhcHNlZCcpLmF0dHIoJ3RpdGxlJywKICAgICAgICB0ZXN0T3JUYXNrKCdUb3RhbCBleGVjdXRpb24gdGltZSBvZiB0aGVzZSB7dGVzdH1zLiAnKSArCiAgICAgICAgJ0V4Y2x1ZGVzIHN1aXRlIHNldHVwcyBhbmQgdGVhcmRvd25zLicpOwogICAgJCgnI3N1aXRlLXN0YXRzJykuZmluZCgnLnN0YXRzLWNvbC1lbGFwc2VkJykuYXR0cigndGl0bGUnLAogICAgICAgICdUb3RhbCBleGVjdXRpb24gdGltZSBvZiB0aGlzIHN1aXRlLicpOwp9CmZ1bmN0aW9uIGVuYWJsZVN0YXRpc3RpY3NTb3J0ZXIoKSB7CiAgICAkLnRhYmxlc29ydGVyLmFkZFBhcnNlcih7CiAgICAgICAgaWQ6ICdzdGF0TmFtZScsCiAgICAgICAgdHlwZTogJ251bWVyaWMnLAogICAgICAgIGlzOiBmdW5jdGlvbihzKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIGRvIG5vdCBhdXRvLWRldGVjdAogICAgICAgIH0sCiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbihzdHJpbmcsIHRhYmxlLCBjZWxsLCBjZWxsSW5kZXgpIHsKICAgICAgICAgICAgLy8gUm93cyBoYXZlIGNsYXNzIGluIGZvcm1hdCAncm93LTxpbmRleD4nLgogICAgICAgICAgICB2YXIgaW5kZXggPSAkKGNlbGwpLnBhcmVudCgpLmF0dHIoJ2NsYXNzJykuc3Vic3RyaW5nKDQpOwogICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoaW5kZXgpOwogICAgICAgIH0KICAgIH0pOwogICAgJCgiLnN0YXRpc3RpY3MiKS50YWJsZXNvcnRlcih7CiAgICAgICAgc29ydEluaXRpYWxPcmRlcjogJ2Rlc2MnLAogICAgICAgIGhlYWRlcnM6IHswOiB7c29ydGVyOiAnc3RhdE5hbWUnLCBzb3J0SW5pdGlhbE9yZGVyOiAnYXNjJ30sCiAgICAgICAgICAgICAgICAgIDY6IHtzb3J0ZXI6IGZhbHNlfX0KICAgIH0pOwp9CmZ1bmN0aW9uIGFkZFN0YXRUYWJsZSh0YWJsZU5hbWUpIHsKICAgIHZhciBzdGF0cyA9IHdpbmRvdy50ZXN0ZGF0YS5zdGF0aXN0aWNzKClbdGFibGVOYW1lXTsKICAgIGlmICh0YWJsZU5hbWUgPT0gJ3RhZycgJiYgc3RhdHMubGVuZ3RoID09IDApIHsKICAgICAgICByZW5kZXJOb1RhZ1N0YXRUYWJsZSgpOwogICAgfSBlbHNlIHsKICAgICAgICByZW5kZXJTdGF0VGFibGUodGFibGVOYW1lLCBzdGF0cyk7CiAgICB9Cn0KZnVuY3Rpb24gcmVuZGVyTm9UYWdTdGF0VGFibGUoKSB7CiAgICAkKCc8dGJvZHk+PHRyIGNsYXNzPSJyb3ctMCI+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPk5vIFRhZ3M8L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij48L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij48L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij48L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij48L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1lbGFwc2VkIj48L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+JyArCiAgICAgICAgICAnPGRpdiBjbGFzcz0iZW1wdHktZ3JhcGgiPjwvZGl2PicgKwogICAgICAgICc8L3RkPicgKwogICAgICAnPC90cj48L3Rib2R5PicpLmFwcGVuZFRvKCcjdGFnLXN0YXRzJyk7Cn0KZnVuY3Rpb24gcmVuZGVyU3RhdFRhYmxlKHRhYmxlTmFtZSwgc3RhdHMpIHsKICAgIHZhciB0ZW1wbGF0ZSA9IHRhYmxlTmFtZSArICdTdGF0aXN0aWNzUm93VGVtcGxhdGUnOwogICAgdmFyIHRib2R5ID0gJCgnPHRib2R5PjwvdGJvZHk+Jyk7CiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3RhdHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAkLnRtcGwodGVtcGxhdGUsIHN0YXRzW2ldLCB7aW5kZXg6IGl9KS5hcHBlbmRUbyh0Ym9keSk7CiAgICB9CiAgICB0Ym9keS5hcHBlbmRUbygnIycgKyB0YWJsZU5hbWUgKyAnLXN0YXRzJyk7Cn0KJC50ZW1wbGF0ZSgnc3RhdENvbHVtbnNUZW1wbGF0ZScsCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+JHt0b3RhbH08L3RkPicgKwogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPiR7cGFzc308L3RkPicgKwogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPiR7ZmFpbH08L3RkPicgKwogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPiR7c2tpcH08L3RkPicgKwogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLWVsYXBzZWQiPiR7ZWxhcHNlZH08L3RkPicgKwogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLWdyYXBoIj4nICsKICAgICAgJ3t7aWYgdG90YWx9fScgKwogICAgICAnPGRpdiBjbGFzcz0iZ3JhcGgiPicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJwYXNzLWJhciIgc3R5bGU9IndpZHRoOiAke3Bhc3NXaWR0aH0lIiB0aXRsZT0iJHtwYXNzUGVyY2VudH0lIj48L2Rpdj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0iZmFpbC1iYXIiIHN0eWxlPSJ3aWR0aDogJHtmYWlsV2lkdGh9JSIgdGl0bGU9IiR7ZmFpbFBlcmNlbnR9JSI+PC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InNraXAtYmFyIiBzdHlsZT0id2lkdGg6ICR7c2tpcFdpZHRofSUiIHRpdGxlPSIke3NraXBQZXJjZW50fSUiPjwvZGl2PicgKwogICAgICAnPC9kaXY+JyArCiAgICAgICd7e2Vsc2V9fScgKwogICAgICAnPGRpdiBjbGFzcz0iZW1wdHktZ3JhcGgiPjwvZGl2PicgKwogICAgICAne3svaWZ9fScgKwogICAgJzwvdGQ+JwopOwokLnRlbXBsYXRlKCdzdWl0ZVN0YXR1c01lc3NhZ2VUZW1wbGF0ZScsCiAgICAnJHt0b3RhbH0ge3s9IHRlc3RPclRhc2soInt0ZXN0fSIpfX17e2lmIHRvdGFsICE9IDF9fXN7ey9pZn19IHRvdGFsLCAnICsKICAgICcke3Bhc3N9IHBhc3NlZCwgJHtmYWlsfSBmYWlsZWQsICR7c2tpcH0gc2tpcHBlZCcKKTsKLy8gRm9yIGNvbXBsZXRlIGNyb3NzLWJyb3dzZXIgZXhwZXJpZW5jZS4uCi8vIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX29yZGVyLmh0bWwKZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGV2ZW50KSB7CiAgICB2YXIgZXZlbnQgPSBldmVudCB8fCB3aW5kb3cuZXZlbnQ7CiAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwogICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikKICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKfQo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpzdG9yYWdlID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHByZWZpeCA9ICdyb2JvdC1mcmFtZXdvcmstJzsKICAgIHZhciBzdG9yYWdlOwogICAgZnVuY3Rpb24gaW5pdCh1c2VyKSB7CiAgICAgICAgcHJlZml4ICs9IHVzZXIgKyAnLSc7CiAgICAgICAgc3RvcmFnZSA9IGdldFN0b3JhZ2UoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFN0b3JhZ2UoKSB7CiAgICAgICAgLy8gVXNlIGxvY2FsU3RvcmFnZSBpZiBpdCdzIGFjY2Vzc2libGUsIG5vcm1hbCBvYmplY3Qgb3RoZXJ3aXNlLgogICAgICAgIC8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExMjE0NDA0CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0ocHJlZml4LCBwcmVmaXgpOwogICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShwcmVmaXgpOwogICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlOwogICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZ2V0KG5hbWUsIGRlZmF1bHRWYWx1ZSkgewogICAgICAgIHZhciB2YWx1ZSA9IHN0b3JhZ2VbcHJlZml4ICsgbmFtZV07CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogICAgZnVuY3Rpb24gc2V0KG5hbWUsIHZhbHVlKSB7CiAgICAgICAgc3RvcmFnZVtwcmVmaXggKyBuYW1lXSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIHtpbml0OiBpbml0LCBnZXQ6IGdldCwgc2V0OiBzZXR9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXQgPSB7fTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3VpdGUiXSA9IFsxLDIsMywwLFtdLFsxLDAsMjk3Ml0sW10sW1s0LDAsMCxbXSxbMSwzMTgsMjMwOF0sW11dXSxbXSxbMSwxLDAsMF1dOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJzdHJpbmdzIl0gPSBbXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3RyaW5ncyJdID0gd2luZG93Lm91dHB1dFsic3RyaW5ncyJdLmNvbmNhdChbIioiLCIqSnVweXRlciIsIiovaG9tZS9kYXRha3VycmUvV29yay9naXRodWIvcm9ib3RzLWZyb20tanVweXRlci9yb2JvdGtlcm5lbC9leGFtcGxlcyIsIiouLi8uLi8uLi8uLi9ob21lL2RhdGFrdXJyZS9Xb3JrL2dpdGh1Yi9yb2JvdHMtZnJvbS1qdXB5dGVyL3JvYm90a2VybmVsL2V4YW1wbGVzIiwiKlNob3cgUGxvbmUgbG9nbyJdKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3RhdHMiXSA9IFtbeyJlbGFwc2VkIjoiMDA6MDA6MDIiLCJmYWlsIjowLCJsYWJlbCI6IkFsbCBUZXN0cyIsInBhc3MiOjEsInNraXAiOjB9XSxbXSxbeyJlbGFwc2VkIjoiMDA6MDA6MDMiLCJmYWlsIjowLCJpZCI6InMxIiwibGFiZWwiOiJKdXB5dGVyIiwibmFtZSI6Ikp1cHl0ZXIiLCJwYXNzIjoxLCJza2lwIjowfV1dOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJiYXNlTWlsbGlzIl0gPSAxNjQ1Mjk0NjMzMTM0Owo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJnZW5lcmF0ZWQiXSA9IDI5OTA7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbImV4cGFuZF9rZXl3b3JkcyJdID0gbnVsbDsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LnNldHRpbmdzID0geyJiYWNrZ3JvdW5kIjp7ImZhaWwiOiIjZjY2IiwicGFzcyI6IiM5ZTkiLCJza2lwIjoiI2ZlZDg0ZiJ9LCJsb2dVUkwiOm51bGwsInJwYSI6ZmFsc2UsInRpdGxlIjoiIn07Cjwvc2NyaXB0Pgo8dGl0bGU+PC90aXRsZT4KPC9oZWFkPgo8Ym9keT4KPGRpdiBpZD0iamF2YXNjcmlwdC1kaXNhYmxlZCI+CiAgPGgxPk9wZW5pbmcgUm9ib3QgRnJhbWV3b3JrIHJlcG9ydCBmYWlsZWQ8L2gxPgogIDx1bD4KICAgIDxsaT5WZXJpZnkgdGhhdCB5b3UgaGF2ZSA8Yj5KYXZhU2NyaXB0IGVuYWJsZWQ8L2I+IGluIHlvdXIgYnJvd3Nlci48L2xpPgogICAgPGxpPk1ha2Ugc3VyZSB5b3UgYXJlIHVzaW5nIGEgPGI+bW9kZXJuIGVub3VnaCBicm93c2VyPC9iPi4gSWYgdXNpbmcgSW50ZXJuZXQgRXhwbG9yZXIsIHZlcnNpb24gMTEgaXMgcmVxdWlyZWQuPC9saT4KICAgIDxsaT5DaGVjayBhcmUgdGhlcmUgbWVzc2FnZXMgaW4geW91ciBicm93c2VyJ3MgPGI+SmF2YVNjcmlwdCBlcnJvciBsb2c8L2I+LiBQbGVhc2UgcmVwb3J0IHRoZSBwcm9ibGVtIGlmIHlvdSBzdXNwZWN0IHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnLjwvbGk+CiAgPC91bD4KPC9kaXY+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5yZW1vdmVKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKCk7PC9zY3JpcHQ+Cgo8ZGl2IGlkPSJoZWFkZXIiPjwvZGl2Pgo8ZGl2IGlkPSJzdGF0aXN0aWNzLWNvbnRhaW5lciI+PC9kaXY+CjxkaXYgaWQ9InRlc3QtZGV0YWlscy1jb250YWluZXIiPjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7CiAgICB0cnkgewogICAgICAgIHZhciB0b3BzdWl0ZSA9IHdpbmRvdy50ZXN0ZGF0YS5zdWl0ZSgpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBhZGRKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKGVycm9yKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICB3aW5kb3cucHJldkxvY2F0aW9uSGFzaCA9ICcnOwogICAgc2V0QmFja2dyb3VuZCh0b3BzdWl0ZSk7CiAgICBpbml0TGF5b3V0KHRvcHN1aXRlLm5hbWUsICdSZXBvcnQnKTsKICAgIHN0b3JhZ2UuaW5pdCgncmVwb3J0Jyk7CiAgICBhZGRTdW1tYXJ5KHRvcHN1aXRlKTsKICAgIGFkZFN0YXRpc3RpY3MoKTsKICAgIGFkZERldGFpbHMoKTsKICAgIHdpbmRvdy5vbmhhc2hjaGFuZ2UgPSBzaG93RGV0YWlsc0J5SGFzaDsKfSk7CgpmdW5jdGlvbiBzZXRCYWNrZ3JvdW5kKHRvcHN1aXRlKSB7CiAgICB2YXIgY29sb3I7CiAgICBpZiAodG9wc3VpdGUuZmFpbCkKICAgICAgICBjb2xvciA9IHdpbmRvdy5zZXR0aW5ncy5iYWNrZ3JvdW5kLmZhaWw7CiAgICBlbHNlIGlmICh0b3BzdWl0ZS5wYXNzKQogICAgICAgIGNvbG9yID0gd2luZG93LnNldHRpbmdzLmJhY2tncm91bmQucGFzczsKICAgIGVsc2UKICAgICAgICBjb2xvciA9IHdpbmRvdy5zZXR0aW5ncy5iYWNrZ3JvdW5kLnNraXA7CiAgICAkKCdib2R5JykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgY29sb3IpOwp9CgpmdW5jdGlvbiBhZGRTdW1tYXJ5KHRvcHN1aXRlKSB7CiAgICB2YXIgb3B0cyA9IHtsb2dVUkw6IHdpbmRvdy5zZXR0aW5ncy5sb2dVUkx9OwogICAgJC50bXBsKCdzdW1tYXJ5VGFibGVUZW1wbGF0ZScsIHRvcHN1aXRlLCBvcHRzKS5pbnNlcnRBZnRlcigkKCcjaGVhZGVyJykpOwp9CgpmdW5jdGlvbiBhZGREZXRhaWxzKCkgewogICAgYWRkQ3VzdG9tU29ydGVyc0ZvckRldGFpbHMoKTsKICAgIGlmICh3aW5kb3cubG9jYXRpb24uaGFzaCkKICAgICAgICBzaG93RGV0YWlsc0J5SGFzaCgpOwogICAgZWxzZQogICAgICAgIHJlbmRlclNlYXJjaFNlbGVjdG9yKCk7Cn0KCmZ1bmN0aW9uIGFkZEN1c3RvbVNvcnRlcnNGb3JEZXRhaWxzKCkgewogICAgJC50YWJsZXNvcnRlci5hZGRQYXJzZXIoewogICAgICAgIGlkOiAnc3RhdHVzJywKICAgICAgICB0eXBlOiAnbnVtZXJpYycsCiAgICAgICAgaXM6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZG8gbm90IGF1dG8tZGV0ZWN0CiAgICAgICAgfSwKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHsnRkFJTCc6IC0xLCAnU0tJUCc6IDAsICdQQVNTJzogMX1bc107CiAgICAgICAgfQogICAgfSk7CiAgICAkLnRhYmxlc29ydGVyLmFkZFBhcnNlcih7CiAgICAgICAgaWQ6ICd0aW1lcycsCiAgICAgICAgdHlwZTogJ3RleHQnLAogICAgICAgIGlzOiBmdW5jdGlvbihzKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIGRvIG5vdCBhdXRvLWRldGVjdAogICAgICAgIH0sCiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbihzKSB7CiAgICAgICAgICAgIHJldHVybiBzLnN1YnN0cmluZygwLCAyMSk7ICAvLyByZXR1cm4gb25seSBzdGFydCB0aW1lCiAgICAgICAgfQogICAgfSk7Cn0KCmZ1bmN0aW9uIHNob3dEZXRhaWxzQnlIYXNoKCkgewogICAgLy8gQ2Fubm90IHVzZSB3aW5kb3cubG9jYXRpb24uaGFzaCBiZWNhdXNlIEZpcmVmb3ggaW5jb3JyZWN0bHkgZGVjb2RlcyBpdDoKICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTcwMzU1Mi9lbmNvZGluZy1vZi13aW5kb3ctbG9jYXRpb24taGFzaAogICAgdmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnIycpLnNsaWNlKDEpLmpvaW4oJyMnKTsKICAgIGlmICghaGFzaCB8fCBoYXNoID09IHdpbmRvdy5wcmV2TG9jYXRpb25IYXNoKQogICAgICAgIHJldHVybjsKICAgIHZhciBwYXJ0cyA9IGhhc2guc3BsaXQoJz8nKTsKICAgIHZhciBuYW1lID0gcGFydHMuc2hpZnQoKTsKICAgIHZhciBxdWVyeSA9IHBhcnRzLmpvaW4oJz8nKTsKICAgIGlmIChuYW1lID09ICdzZWFyY2gnKSB7CiAgICAgICAgdmFyIHBhcmFtcyA9IHV0aWwucGFyc2VRdWVyeVN0cmluZyhxdWVyeSk7CiAgICAgICAgc2VhcmNoRXhlY3V0ZWQocGFyYW1zLnN1aXRlIHx8ICcnLCBwYXJhbXMudGVzdCB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuaW5jbHVkZSB8fCAnJywgcGFyYW1zLmV4Y2x1ZGUgfHwgJycpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHF1ZXJ5ID0gZGVjb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KTsKICAgIHZhciBhY3Rpb24gPSB7J3RvdGFscyc6IHRvdGFsRGV0YWlsU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICAgICd0YWdzJzogICB0YWdEZXRhaWxTZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgJ3N1aXRlcyc6IHN1aXRlRGV0YWlsU2VsZWN0ZWR9W25hbWVdOwogICAgaWYgKGFjdGlvbikKICAgICAgICBhY3Rpb24ocXVlcnkpOwp9CgpmdW5jdGlvbiB0b3RhbERldGFpbFNlbGVjdGVkKCkgewogICAgcmVuZGVyVG90YWxTZWxlY3RvcigpOwogICAgc2Nyb2xsVG9TZWxlY3RvcigndG90YWxzJywgbmFtZSk7Cn0KCmZ1bmN0aW9uIHJlbmRlclRvdGFsU2VsZWN0b3IoKSB7CiAgICB2YXIgYXJncyA9IHtsaW5rVGFyZ2V0OiAndG90YWxzJywKICAgICAgICAgICAgICAgIHRvdGFsVGFiU3RhdHVzOiAnZGV0YWlsLXRhYi1zZWxlY3RlZCd9OwogICAgcmVuZGVyU2VsZWN0b3IoYXJncywgJ3RvdGFsRGV0YWlsc1NlbGVjdG9yVGVtcGxhdGUnKTsKICAgIHVwZGF0ZVByaW50U2VsZWN0b3IodGVzdE9yVGFzaygnQWxsIHtUZXN0fXMnKSk7CiAgICByZW5kZXJUb3RhbERldGFpbHMoKTsKfQoKZnVuY3Rpb24gcmVuZGVyVG90YWxEZXRhaWxzKCkgewogICAgdmFyIHN0YXQgPSB3aW5kb3cudGVzdGRhdGEuc3RhdGlzdGljcygpLnRvdGFsWzBdOwogICAgdmFyIHRlc3RzID0gd2luZG93LnRlc3RkYXRhLnN1aXRlKCkuYWxsVGVzdHMoKS5zb3J0KHNvcnRCeVN0YXR1cykKICAgIHN0YXQudG90YWxUaW1lID0gY2FsY3VsYXRlVG90YWxUaW1lKHRlc3RzKTsKICAgICQudG1wbCgndGFnT3JUb3RhbERldGFpbHNUZW1wbGF0ZScsIHN0YXQpLmFwcGVuZFRvKCcjZGV0YWlscy1oZWFkZXInKTsKICAgIGRyYXdUZXN0RGV0YWlsc1RhYmxlKHRlc3RzLCB0cnVlKTsKfQoKZnVuY3Rpb24gdXBkYXRlUHJpbnRTZWxlY3RvcihuYW1lLCBpbmZvKSB7CiAgICBpZiAoaW5mbykKICAgICAgICBuYW1lICs9ICcgKCcgKyBpbmZvICsgJyknOwogICAgJCgnI3ByaW50LXNlbGVjdG9yJykuaHRtbChuYW1lKTsKfQoKZnVuY3Rpb24gdGFnRGV0YWlsU2VsZWN0ZWQobmFtZSkgewogICAgcmVuZGVyVGFnU2VsZWN0b3IobmFtZSk7CiAgICBpZiAobmFtZSkgewogICAgICAgIHZhciB0YWcgPSBmaW5kVGFnKG5hbWUpOwogICAgICAgIGlmICh0YWcpIHsKICAgICAgICAgICAgcmVuZGVyVGFnRGV0YWlscyh0YWcpOwogICAgICAgICAgICB1cGRhdGVQcmludFNlbGVjdG9yKG5hbWUsIHRhZy5pbmZvKTsKICAgICAgICB9CiAgICB9CiAgICBzY3JvbGxUb1NlbGVjdG9yKCd0YWdzJywgbmFtZSk7Cn0KCmZ1bmN0aW9uIGZpbmRUYWcobmFtZSkgewogICAgdmFyIHRhZ3MgPSB3aW5kb3cudGVzdGRhdGEuc3RhdGlzdGljcygpLnRhZzsKICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0YWdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgaWYgKHRhZ3NbaV0ubGFiZWwgPT0gbmFtZSkKICAgICAgICAgICAgcmV0dXJuIHRhZ3NbaV07CiAgICB9CiAgICByZXR1cm4gbnVsbDsKfQoKZnVuY3Rpb24gcmVuZGVyVGFnU2VsZWN0b3IobmFtZSkgewogICAgdmFyIGFyZ3MgPSB7bGlua1RhcmdldDogKG5hbWUpID8gJ3RhZ3M/JytuYW1lIDogJ3RhZ3MnLAogICAgICAgICAgICAgICAgdGFnVGFiU3RhdHVzOiAnZGV0YWlsLXRhYi1zZWxlY3RlZCd9OwogICAgdmFyIHN0YXRzID0ge3RhZ3M6IHdpbmRvdy50ZXN0ZGF0YS5zdGF0aXN0aWNzKCkudGFnLCBzZWxlY3RlZDogbmFtZX07CiAgICByZW5kZXJTZWxlY3RvcihhcmdzLCAndGFnRGV0YWlsc1NlbGVjdG9yVGVtcGxhdGUnLCBzdGF0cyk7Cn0KCmZ1bmN0aW9uIHJlbmRlclRhZ0RldGFpbHModGFnKSB7CiAgICB2YXIgdGVzdHMgPSBnZXRUZXN0c0hhdmluZ1RhZyh0YWcpOwogICAgdGFnLnRvdGFsVGltZSA9IGNhbGN1bGF0ZVRvdGFsVGltZSh0ZXN0cyk7CiAgICAkLnRtcGwoJ3RhZ09yVG90YWxEZXRhaWxzVGVtcGxhdGUnLCB0YWcpLmFwcGVuZFRvKCcjZGV0YWlscy1oZWFkZXInKTsKICAgIGRyYXdUZXN0RGV0YWlsc1RhYmxlKHRlc3RzLCB0cnVlKTsKfQoKZnVuY3Rpb24gc3VpdGVEZXRhaWxTZWxlY3RlZChpZCkgewogICAgcmVuZGVyU3VpdGVTZWxlY3RvcihpZCk7CiAgICBpZiAoaWQpCiAgICAgICAgcmVuZGVyU3VpdGVEZXRhaWxzKGlkKTsKICAgIHNjcm9sbFRvU2VsZWN0b3IoJ3N1aXRlcycsIGlkKTsKfQoKZnVuY3Rpb24gcmVuZGVyU3VpdGVTZWxlY3RvcihpZCkgewogICAgdmFyIGFyZ3MgPSB7bGlua1RhcmdldDogKGlkKSA/ICdzdWl0ZXM/JytpZCA6ICdzdWl0ZXMnLAogICAgICAgICAgICAgICAgc3VpdGVUYWJTdGF0dXM6ICdkZXRhaWwtdGFiLXNlbGVjdGVkJ307CiAgICB2YXIgc3RhdHMgPSB7c3VpdGVzOiB3aW5kb3cudGVzdGRhdGEuc3RhdGlzdGljcygpLnN1aXRlLAogICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBpZH07CiAgICByZW5kZXJTZWxlY3RvcihhcmdzLCAnc3VpdGVEZXRhaWxzU2VsZWN0b3JUZW1wbGF0ZScsIHN0YXRzKTsKfQoKZnVuY3Rpb24gcmVuZGVyU3VpdGVEZXRhaWxzKGlkKSB7CiAgICB3aW5kb3cudGVzdGRhdGEuZW5zdXJlTG9hZGVkKGlkLCBmdW5jdGlvbiAoaWRzKSB7CiAgICAgICAgdmFyIHN1aXRlID0gd2luZG93LnRlc3RkYXRhLmZpbmRMb2FkZWQoaWQpOwogICAgICAgIHZhciBvcHRzID0ge2xvZ1VSTDogd2luZG93LnNldHRpbmdzLmxvZ1VSTH07CiAgICAgICAgJC50bXBsKCdzdWl0ZURldGFpbHNUZW1wbGF0ZScsIHN1aXRlLCBvcHRzKS5hcHBlbmRUbygnI2RldGFpbHMtaGVhZGVyJyk7CiAgICAgICAgZHJhd1Rlc3REZXRhaWxzVGFibGUoc3VpdGUuYWxsVGVzdHMoKSwgZmFsc2UpOwogICAgICAgIHVwZGF0ZVByaW50U2VsZWN0b3Ioc3VpdGUuZnVsbE5hbWUpOwogICAgfSk7Cn0KCmZ1bmN0aW9uIHNlYXJjaEV4ZWN1dGVkKHN1aXRlLCB0ZXN0LCBpbmNsdWRlLCBleGNsdWRlKSB7CiAgICByZW5kZXJTZWFyY2hTZWxlY3RvcihzdWl0ZSwgdGVzdCwgaW5jbHVkZSwgZXhjbHVkZSk7CiAgICBpZiAoc3VpdGUgfHwgdGVzdCB8fCBpbmNsdWRlIHx8IGV4Y2x1ZGUpIHsKICAgICAgICByZW5kZXJTZWFyY2hEZXRhaWxzKHN1aXRlLCB0ZXN0LCBpbmNsdWRlLCBleGNsdWRlKTsKICAgICAgICBzY3JvbGxUb1NlbGVjdG9yKCdzZWFyY2gnICsKICAgICAgICAgICAgICAgICAgICAgICAgICc/c3VpdGU9JyArIGVuY29kZVVSSUNvbXBvbmVudChzdWl0ZSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgJyZ0ZXN0PScgKyBlbmNvZGVVUklDb21wb25lbnQodGVzdCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgJyZpbmNsdWRlPScgKyBlbmNvZGVVUklDb21wb25lbnQoaW5jbHVkZSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgJyZleGNsdWRlPScgKyBlbmNvZGVVUklDb21wb25lbnQoZXhjbHVkZSkpOwogICAgfSBlbHNlIHsKICAgICAgICBzY3JvbGxUb1NlbGVjdG9yKCdzZWFyY2gnKTsKICAgIH0KfQoKZnVuY3Rpb24gcmVuZGVyU2VhcmNoU2VsZWN0b3Ioc3VpdGUsIHRlc3QsIGluY2x1ZGUsIGV4Y2x1ZGUpIHsKICAgIHZhciBhcmdzID0ge2xpbmtUYXJnZXQ6IChzdWl0ZSB8fCB0ZXN0IHx8IGluY2x1ZGUgfHwgZXhjbHVkZSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdzZWFyY2g/c3VpdGU9JyArIHN1aXRlICsgJyZ0ZXN0PScgKyB0ZXN0ICsgJyZpbmNsdWRlPScgKyBpbmNsdWRlICsgJyZleGNsdWRlPScgKyBleGNsdWRlKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VhcmNoJywKICAgICAgICAgICAgICAgIHNlYXJjaFRhYlN0YXR1czogJ2RldGFpbC10YWItc2VsZWN0ZWQnfTsKICAgIHZhciBzZWFyY2ggPSB7c3VpdGU6IHN1aXRlLCB0ZXN0OiB0ZXN0LCBpbmNsdWRlOiBpbmNsdWRlLCBleGNsdWRlOiBleGNsdWRlfTsKICAgIHJlbmRlclNlbGVjdG9yKGFyZ3MsICdzZWFyY2hTZWxlY3RvclRlbXBsYXRlJywgc2VhcmNoKTsKfQoKZnVuY3Rpb24gcmVuZGVyU2VhcmNoRGV0YWlscyhzdWl0ZSwgdGVzdCwgaW5jbHVkZSwgZXhjbHVkZSkgewogICAgdmFyIHRlc3RzID0gc2VhcmNoVGVzdHModXRpbC5lc2NhcGUoc3VpdGUpLCB1dGlsLmVzY2FwZSh0ZXN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuZXNjYXBlKGluY2x1ZGUpLCB1dGlsLmVzY2FwZShleGNsdWRlKSk7CiAgICB2YXIgc3RhdHMgPSBjYWxjdWxhdGVTdGF0cyh0ZXN0cyk7CiAgICBzdGF0cy50b3RhbFRpbWUgPSBjYWxjdWxhdGVUb3RhbFRpbWUodGVzdHMpOwogICAgJC50bXBsKCd0YWdPclRvdGFsRGV0YWlsc1RlbXBsYXRlJywgc3RhdHMpLmFwcGVuZFRvKCcjZGV0YWlscy1oZWFkZXInKTsKICAgIGRyYXdUZXN0RGV0YWlsc1RhYmxlKHRlc3RzLCB0cnVlKTsKfQoKZnVuY3Rpb24gc2VhcmNoVGVzdHMoc3VpdGVQYXR0ZXJuLCB0ZXN0UGF0dGVybiwgaW5jbHVkZVBhdHRlcm4sIGV4Y2x1ZGVQYXR0ZXJuKSB7CiAgICB2YXIgdGVzdHM7CiAgICBpZiAoc3VpdGVQYXR0ZXJuKQogICAgICAgIHRlc3RzID0gd2luZG93LnRlc3RkYXRhLnN1aXRlKCkuc2VhcmNoVGVzdHNJblN1aXRlKHN1aXRlUGF0dGVybik7CiAgICBlbHNlCiAgICAgICAgdGVzdHMgPSB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKS5hbGxUZXN0cygpOwogICAgcmV0dXJuIHV0aWwuZmlsdGVyKHRlc3RzLCBmdW5jdGlvbiAodGVzdCkgewogICAgICAgIGlmICh0ZXN0UGF0dGVybiAmJiAhdGVzdC5tYXRjaGVzTmFtZVBhdHRlcm4odGVzdFBhdHRlcm4pKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKGluY2x1ZGVQYXR0ZXJuICYmICF0ZXN0Lm1hdGNoZXNUYWdQYXR0ZXJuKGluY2x1ZGVQYXR0ZXJuKSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiAhKGV4Y2x1ZGVQYXR0ZXJuICYmIHRlc3QubWF0Y2hlc1RhZ1BhdHRlcm4oZXhjbHVkZVBhdHRlcm4pKTsKICAgIH0pOwp9CgpmdW5jdGlvbiBzY3JvbGxUb1NlbGVjdG9yKGJhc2UsIHF1ZXJ5KSB7CiAgICAkKCcjdGVzdC1kZXRhaWxzLWNvbnRhaW5lcicpLmNzcygnbWluLWhlaWdodCcsICQod2luZG93KS5oZWlnaHQoKSk7CiAgICB2YXIgYW5jaG9yID0gcXVlcnkgPyBiYXNlICsgJz8nICsgZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KSA6IGJhc2U7CiAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9ICcnOwogICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSB3aW5kb3cucHJldkxvY2F0aW9uSGFzaCA9IGFuY2hvcjsKfQoKZnVuY3Rpb24gcmVuZGVyU2VsZWN0b3IoYXJncywgdGVtcGxhdGUsIHN0YXRzKSB7CiAgICB3aW5kb3cuZWxlbWVudHNUb1JlbmRlciA9IFtdOwogICAgdmFyIGNvbnRhaW5lciA9ICQoJyN0ZXN0LWRldGFpbHMtY29udGFpbmVyJyk7CiAgICBjb250YWluZXIuZW1wdHkoKTsKICAgICQudG1wbCgnZGV0YWlsc0hlYWRlclRlbXBsYXRlJywgYXJncykuYXBwZW5kVG8oY29udGFpbmVyKTsKICAgICQudG1wbCh0ZW1wbGF0ZSwgc3RhdHMpLmFwcGVuZFRvKGNvbnRhaW5lcik7Cn0KCmZ1bmN0aW9uIGRyYXdUZXN0RGV0YWlsc1RhYmxlKHRlc3RzLCBzb3J0QnlTdGF0dXMpIHsKICAgIGlmICghdGVzdHMubGVuZ3RoKQogICAgICAgIHJldHVybjsKICAgIHJlbmRlclRlc3REZXRhaWxzSGVhZGVyKCk7CiAgICB3aW5kb3cuZWxlbWVudHNUb1JlbmRlciA9IHRlc3RzOwogICAgdmFyIHRhcmdldCA9ICQoJyN0ZXN0LWRldGFpbHMnKS5maW5kKCd0Ym9keScpOwogICAgcmVuZGVyVGVzdERldGFpbHMoc29ydEJ5U3RhdHVzLCB0YXJnZXQpOwp9CgpmdW5jdGlvbiByZW5kZXJUZXN0RGV0YWlsc0hlYWRlcigpIHsKICAgIHZhciBoZWFkZXIgPSAkLnRtcGwoJ3Rlc3REZXRhaWxzVGFibGVUZW1wbGF0ZScpOwogICAgaGlkZUhpZGRlbkRldGFpbHNDb2x1bW5zKGhlYWRlcik7CiAgICBoZWFkZXIuYXBwZW5kVG8oJyN0ZXN0LWRldGFpbHMtY29udGFpbmVyJyk7Cn0KCmZ1bmN0aW9uIHNvcnRCeVN0YXR1cyh0MSwgdDIpIHsKICAgIGlmICh0MS5zdGF0dXMgPT0gdDIuc3RhdHVzKQogICAgICAgIHJldHVybiB0MS5mdWxsTmFtZSA8IHQyLmZ1bGxOYW1lID8gLTEgOiAxOwogICAgc3RhdHVzZXMgPSB7J0ZBSUwnOiAtMSwgJ1NLSVAnOiAwLCAnUEFTUyc6IDF9OwogICAgcmV0dXJuIHN0YXR1c2VzW3QxLnN0YXR1c10gPCBzdGF0dXNlc1t0Mi5zdGF0dXNdID8gLTEgOiAxOwp9CgpmdW5jdGlvbiBnZXRUZXN0c0hhdmluZ1RhZyh0YWcpIHsKICAgIHJldHVybiB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKS5zZWFyY2hUZXN0c0J5VGFnKHRhZykuc29ydChzb3J0QnlTdGF0dXMpOwp9CgpmdW5jdGlvbiBjYWxjdWxhdGVUb3RhbFRpbWUodGVzdHMpIHsKICAgIHZhciB0b3RhbCA9IDA7CiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGVzdHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspCiAgICAgICAgdG90YWwgKz0gdGVzdHNbaV0udGltZXMuZWxhcHNlZE1pbGxpczsKICAgIHJldHVybiB1dGlsLmZvcm1hdEVsYXBzZWQodG90YWwpOwp9CgpmdW5jdGlvbiBjYWxjdWxhdGVTdGF0cyh0ZXN0cykgewogICAgdmFyIHBhc3NlZCA9IHV0aWwuZmlsdGVyKHRlc3RzLCBmdW5jdGlvbiAodGVzdCkgewogICAgICAgIHJldHVybiB0ZXN0LnN0YXR1cyA9PSAnUEFTUyc7CiAgICB9KTsKICAgIHZhciBmYWlsZWQgPSB1dGlsLmZpbHRlcih0ZXN0cywgZnVuY3Rpb24gKHRlc3QpIHsKICAgICAgICByZXR1cm4gdGVzdC5zdGF0dXMgPT0gJ0ZBSUwnOwogICAgfSk7CiAgICByZXR1cm4gewogICAgICB0b3RhbDogdGVzdHMubGVuZ3RoLAogICAgICBwYXNzOiBwYXNzZWQubGVuZ3RoLAogICAgICBmYWlsOiBmYWlsZWQubGVuZ3RoLAogICAgICBza2lwOiB0ZXN0cy5sZW5ndGggLSBwYXNzZWQubGVuZ3RoIC0gZmFpbGVkLmxlbmd0aAogICAgfTsKfQoKZnVuY3Rpb24gcmVuZGVyVGVzdERldGFpbHMoc29ydEJ5U3RhdHVzLCB0YXJnZXQpIHsKICAgIGlmICghd2luZG93LmVsZW1lbnRzVG9SZW5kZXIubGVuZ3RoKQogICAgICAgIHJldHVybjsKICAgIHZhciB0ZXN0cyA9IHBvcFVwVG8od2luZG93LmVsZW1lbnRzVG9SZW5kZXIsIDUwKTsKICAgIHJlbmRlclRlc3REZXRhaWxzUm93cyh0ZXN0cywgdGFyZ2V0KTsKICAgIGlmICh3aW5kb3cuZWxlbWVudHNUb1JlbmRlci5sZW5ndGgpCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7cmVuZGVyVGVzdERldGFpbHMoc29ydEJ5U3RhdHVzLCB0YXJnZXQpO30sIDApOwogICAgZWxzZQogICAgICAgIGNvbmZpZ3VyZVRhYmxlU29ydGVyKHNvcnRCeVN0YXR1cyk7Cn0KCmZ1bmN0aW9uIHJlbmRlclRlc3REZXRhaWxzUm93cyh0ZXN0cywgdGFyZ2V0KSB7CiAgICB2YXIgcm93cyA9ICQudG1wbCgndGVzdERldGFpbHNUYWJsZVJvd1RlbXBsYXRlJywgdGVzdHMsCiAgICAgICAgICAgICAgICAgICAgICB7bG9nVVJMOiB3aW5kb3cuc2V0dGluZ3MubG9nVVJMfSk7CiAgICByb3dzLmZpbmQoJ2EnKS5jbGljayhzdG9wUHJvcGFnYXRpb24pOwogICAgaGlkZUhpZGRlbkRldGFpbHNDb2x1bW5zKHJvd3MpOwogICAgcm93cy5hcHBlbmRUbyh0YXJnZXQpOwp9CgpmdW5jdGlvbiBjb25maWd1cmVUYWJsZVNvcnRlcihzb3J0QnlTdGF0dXMpIHsKICAgIHZhciBjb25maWcgPSB7aGVhZGVyczogezM6IHtzb3J0ZXI6ICdzdGF0dXMnfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU6IHtzb3J0SW5pdGlhbE9yZGVyOiAnZGVzYyd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNjoge3NvcnRlcjogJ3RpbWVzJ319LAogICAgICAgICAgICAgICAgICBzZWxlY3RvclNvcnQ6ICcuZGV0YWlscy1jb2wtaGVhZGVyJ307CiAgICBpZiAoc29ydEJ5U3RhdHVzKQogICAgICAgIGNvbmZpZ1snc29ydExpc3QnXSA9IFtbMywgMF1dOwogICAgJCgnI3Rlc3QtZGV0YWlscycpLnRhYmxlc29ydGVyKGNvbmZpZyk7Cn0KCmZ1bmN0aW9uIHBvcFVwVG8obGlzdCwgdXBUbykgewogICAgdmFyIHJlc3VsdCA9IFtdOwogICAgd2hpbGUgKGxpc3QubGVuZ3RoID4gMCAmJiByZXN1bHQubGVuZ3RoIDwgdXBUbykKICAgICAgICByZXN1bHQucHVzaChsaXN0LnNoaWZ0KCkpOwogICAgcmV0dXJuIHJlc3VsdDsKfQoKZnVuY3Rpb24gdG9nZ2xlRGV0YWlsc0NvbHVtbihuYW1lKSB7CiAgICB2YXIgY29sdW1uID0gJCgnLmRldGFpbHMtY29sLScgKyBuYW1lKTsKICAgIGNvbHVtbi50b2dnbGVDbGFzcygnaGlkZGVuJyk7CiAgICB2YXIgaGlkZGVuID0gY29sdW1uLmhhc0NsYXNzKCdoaWRkZW4nKTsKICAgIHN0b3JhZ2Uuc2V0KG5hbWUsIGhpZGRlbiA/ICdoaWRkZW4nIDogJ3Zpc2libGUnKTsKICAgIGNvbHVtbi5maW5kKCcuZGV0YWlscy1jb2wtdG9nZ2xlJykuaHRtbChoaWRkZW4gPyAnJmhlbGxpcDsnIDogJyZ0aW1lczsnKTsKfQoKZnVuY3Rpb24gaGlkZUhpZGRlbkRldGFpbHNDb2x1bW5zKGVsZW0pIHsKICAgIHZhciBuYW1lcyA9IFsnZG9jJywgJ3RhZ3MnLCAnbXNnJywgJ2VsYXBzZWQnLCAndGltZXMnXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgbmFtZSA9IG5hbWVzW2ldOwogICAgICAgIGlmIChzdG9yYWdlLmdldChuYW1lLCAndmlzaWJsZScpID09ICdoaWRkZW4nKSB7CiAgICAgICAgICAgIHZhciBjb2x1bW4gPSBlbGVtLmZpbmQoJy5kZXRhaWxzLWNvbC0nICsgbmFtZSk7CiAgICAgICAgICAgIGNvbHVtbi5hZGRDbGFzcygnaGlkZGVuJyk7CiAgICAgICAgICAgIGNvbHVtbi5maW5kKCcuZGV0YWlscy1jb2wtdG9nZ2xlJykuaHRtbCgnJmhlbGxpcDsnKTsKICAgICAgICB9CiAgICB9Cn0KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1bW1hcnlUYWJsZVRlbXBsYXRlIj4KICA8aDI+U3VtbWFyeSBJbmZvcm1hdGlvbjwvaDI+CiAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIj4KICAgIDx0cj4KICAgICAgPHRoPlN0YXR1czo8L3RoPgogICAgICB7e2lmIGZhaWx9fQogICAgICA8dGQ+PGEgaHJlZj0iI3RvdGFscyIgb25jbGljaz0idG90YWxEZXRhaWxTZWxlY3RlZCgpIgogICAgICAgICAgICAgY2xhc3M9ImZhaWwiPiR7ZmFpbH0ge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX17e2lmIGZhaWwgIT0gMX19c3t7L2lmfX0gZmFpbGVkPC9hPjwvdGQ+CiAgICAgIHt7ZWxzZSBwYXNzICYmIHNraXB9fQogICAgICA8dGQ+PGEgaHJlZj0iI3RvdGFscyIgb25jbGljaz0idG90YWxEZXRhaWxTZWxlY3RlZCgpIgogICAgICAgICAgICAgY2xhc3M9InBhc3MiPiR7cGFzc30ge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX17e2lmIHBhc3MgIT0gMX19c3t7L2lmfX0gcGFzc2VkLAogICAgICAgICAgICAgJHtza2lwfSB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fXt7aWYgc2tpcCAhPSAxfX1ze3svaWZ9fSBza2lwcGVkPC9hPjwvdGQ+CiAgICAgIHt7ZWxzZSBwYXNzfX0KICAgICAgPHRkPjxhIGhyZWY9IiN0b3RhbHMiIG9uY2xpY2s9InRvdGFsRGV0YWlsU2VsZWN0ZWQoKSIKICAgICAgICAgICAgIGNsYXNzPSJwYXNzIj5BbGwge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX1zIHBhc3NlZDwvYT48L3RkPgogICAgICB7e2Vsc2V9fQogICAgICA8dGQ+PGEgaHJlZj0iI3RvdGFscyIgb25jbGljaz0idG90YWxEZXRhaWxTZWxlY3RlZCgpIgogICAgICAgICAgICAgY2xhc3M9InNraXAiPkFsbCB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fXMgc2tpcHBlZDwvYT48L3RkPgogICAgICB7ey9pZn19CiAgICA8L3RyPgogICAge3tpZiBkb2MoKX19CiAgICA8dHI+CiAgICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICAgIDx0ZCBjbGFzcz0iZG9jIj57e2h0bWwgZG9jKCl9fTwvdGQ+CiAgICA8L3RyPgogICAge3svaWZ9fQogICAge3tlYWNoIG1ldGFkYXRhfX0KICAgIDx0cj4KICAgICAgPHRoPnt7aHRtbCAkdmFsdWVbMF19fTo8L3RoPgogICAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sICR2YWx1ZVsxXX19PC90ZD4KICAgIDwvdHI+CiAgICB7ey9lYWNofX0KICAgIHt7aWYgdGltZXMuc3RhcnRUaW1lICE9ICdOL0EnfX0KICAgIDx0cj4KICAgICAgPHRoPlN0YXJ0IFRpbWU6PC90aD4KICAgICAgPHRkPiR7dGltZXMuc3RhcnRUaW1lfTwvdGQ+CiAgICA8L3RyPgogICAge3svaWZ9fQogICAge3tpZiB0aW1lcy5lbmRUaW1lICE9ICdOL0EnfX0KICAgIDx0cj4KICAgICAgPHRoPkVuZCBUaW1lOjwvdGg+CiAgICAgIDx0ZD4ke3RpbWVzLmVuZFRpbWV9PC90ZD4KICAgIDwvdHI+CiAgICB7ey9pZn19CiAgICA8dHI+CiAgICAgIDx0aD5FbGFwc2VkIFRpbWU6PC90aD4KICAgICAgPHRkPiR7dGltZXMuZWxhcHNlZFRpbWV9PC90ZD4KICAgIDwvdHI+CiAgICB7e2lmICRpdGVtLmxvZ1VSTH19CiAgICA8dHI+CiAgICAgIDx0aD5Mb2cgRmlsZTo8L3RoPgogICAgICA8dGQ+PGEgaHJlZj0iJHskaXRlbS5sb2dVUkx9Ij4keyRpdGVtLmxvZ1VSTH08L2E+PC90ZD4KICAgIDwvdHI+CiAgICB7ey9pZn19CiAgPC90YWJsZT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRvdGFsU3RhdGlzdGljc1Jvd1RlbXBsYXRlIj4KICA8dHIgb25jbGljaz0idG90YWxEZXRhaWxTZWxlY3RlZCgnYWxsJykiIGNsYXNzPSJyb3ctJHskaXRlbS5pbmRleH0iPgogICAgPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSI+CiAgICAgIDxkaXYgY2xhc3M9InN0YXQtbmFtZSI+CiAgICAgICAgPGEgaHJlZj0iI3RvdGFscyI+e3todG1sIGxhYmVsfX08L2E+CiAgICAgIDwvZGl2PgogICAgPC90ZD4KICAgIHt7dG1wbCgkZGF0YSkgJ3N0YXRDb2x1bW5zVGVtcGxhdGUnfX0KICA8L3RyPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idGFnU3RhdGlzdGljc1Jvd1RlbXBsYXRlIj4KICA8dHIgb25jbGljaz0idGFnRGV0YWlsU2VsZWN0ZWQoJyR7bGFiZWx9JykiIGNsYXNzPSJyb3ctJHskaXRlbS5pbmRleH0iPgogICAgPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSIgdGl0bGU9Int7aHRtbCBkb2N9fSI+CiAgICAgIDxkaXYgY2xhc3M9InN0YXQtbmFtZSI+CiAgICAgICAgPGEgaHJlZj0iI3RhZ3M/JHtsYWJlbH0iPnt7aHRtbCBsYWJlbH19PC9hPgogICAgICAgIHt7aWYgaW5mb319KCR7aW5mb30pe3svaWZ9fQogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0idGFnLWxpbmtzIj4KICAgICAgICB7e2VhY2ggbGlua3N9fQogICAgICAgIDxzcGFuPls8YSBocmVmPSJ7e2h0bWwgJHZhbHVlLnVybH19IiBvbmNsaWNrPSJzdG9wUHJvcGFnYXRpb24oZXZlbnQpIgogICAgICAgICAgICAgICAgICB0aXRsZT0ie3todG1sICR2YWx1ZS51cmx9fSI+e3todG1sICR2YWx1ZS50aXRsZX19PC9hPl08L3NwYW4+CiAgICAgICAge3svZWFjaH19CiAgICAgIDwvZGl2PgogICAgPC90ZD4KICAgIHt7dG1wbCgkZGF0YSkgJ3N0YXRDb2x1bW5zVGVtcGxhdGUnfX0KICA8L3RyPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ic3VpdGVTdGF0aXN0aWNzUm93VGVtcGxhdGUiPgogIDx0ciBvbmNsaWNrPSJzdWl0ZURldGFpbFNlbGVjdGVkKCcke2lkfScpIiBjbGFzcz0icm93LSR7JGl0ZW0uaW5kZXh9Ij4KICAgIDx0ZCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiIHRpdGxlPSJ7e2h0bWwgbGFiZWx9fSI+CiAgICAgIDxkaXYgY2xhc3M9InN0YXQtbmFtZSI+CiAgICAgICAgPGEgaHJlZj0iI3N1aXRlcz8ke2lkfSI+PHNwYW4gY2xhc3M9InBhcmVudC1uYW1lIj57e2h0bWwgZm9ybWF0UGFyZW50TmFtZX19PC9zcGFuPnt7aHRtbCBuYW1lfX08L2E+CiAgICAgIDwvZGl2PgogICAgPC90ZD4KICAgIHt7dG1wbCgkZGF0YSkgJ3N0YXRDb2x1bW5zVGVtcGxhdGUnfX0KICA8L3RyPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0iZGV0YWlsc0hlYWRlclRlbXBsYXRlIj4KICA8aDIgaWQ9IiR7bGlua1RhcmdldH0iPnt7PSB0ZXN0T3JUYXNrKCd7VGVzdH0gRGV0YWlscycpfX08L2gyPgogIDx1bCBpZD0iZGV0YWlsLXRhYnMiPgogICAgPGxpIGNsYXNzPSIke3RvdGFsVGFiU3RhdHVzfSBkZXRhaWwtdGFiIj4KICAgICAgPGEgaHJlZj0iI3RvdGFscyIgb25jbGljaz0icmVuZGVyVG90YWxTZWxlY3RvcigpIgogICAgICAgICB0aXRsZT0ie3s9IHRlc3RPclRhc2soJ1Nob3cgYWxsIHt0ZXN0c30nKX19Ij5BbGw8L2E+CiAgICA8L2xpPgogICAgPGxpIGNsYXNzPSIke3RhZ1RhYlN0YXR1c30gZGV0YWlsLXRhYiI+CiAgICAgIDxhIGhyZWY9IiN0YWdzIiBvbmNsaWNrPSJyZW5kZXJUYWdTZWxlY3RvcigpIgogICAgICAgICB0aXRsZT0ie3s9IHRlc3RPclRhc2soJ1Nob3cge3Rlc3RzfSBieSB0YWcnKX19Ij5UYWdzPC9hPgogICAgPC9saT4KICAgIDxsaSBjbGFzcz0iJHtzdWl0ZVRhYlN0YXR1c30gZGV0YWlsLXRhYiI+CiAgICAgIDxhIGhyZWY9IiNzdWl0ZXMiIG9uY2xpY2s9InJlbmRlclN1aXRlU2VsZWN0b3IoKSIKICAgICAgICAgdGl0bGU9Int7PSB0ZXN0T3JUYXNrKCdTaG93IHt0ZXN0c30gYnkgc3VpdGUnKX19Ij5TdWl0ZXM8L2E+CiAgICA8L2xpPgogICAgPGxpIGNsYXNzPSIke3NlYXJjaFRhYlN0YXR1c30gZGV0YWlsLXRhYiI+CiAgICAgIDxhIGhyZWY9IiNzZWFyY2giIG9uY2xpY2s9InJlbmRlclNlYXJjaFNlbGVjdG9yKCkiCiAgICAgICAgIHRpdGxlPSJ7ez0gdGVzdE9yVGFzaygnRnJlZSB7dGVzdH0gc2VhcmNoJyl9fSI+U2VhcmNoPC9hPgogICAgPC9saT4KICA8L3VsPgo8L3NjcmlwdD4KCjxzY3JpcHQgIHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRvdGFsRGV0YWlsc1NlbGVjdG9yVGVtcGxhdGUiPgogIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgaWQ9ImRldGFpbHMtaGVhZGVyIj4KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgIHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRhZ0RldGFpbHNTZWxlY3RvclRlbXBsYXRlIj4KICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGlkPSJkZXRhaWxzLWhlYWRlciI+CiAgICA8dHIgY2xhc3M9InNlbGVjdG9yIj4KICAgICAgPHRoPlRhZzo8L3RoPgogICAgICA8dGQgaWQ9Im5vcm1hbC1zZWxlY3RvciI+CiAgICAgICAgPHNlbGVjdCBpZD0idGFnLWRldGFpbC1zZWxlY3RvciIgdGl0bGU9IlRhZyBzZWxlY3RvciIKICAgICAgICAgICAgICAgIG9uY2hhbmdlPSJ0YWdEZXRhaWxTZWxlY3RlZCh0aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS52YWx1ZSkiPgogICAgICAgICAgPG9wdGlvbiBzZWxlY3RlZCBkaXNhYmxlZCBoaWRkZW4+LS0gU2VsZWN0IC0tPC9vcHRpb24+CiAgICAgICAgICB7e2VhY2ggdGFnc319CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIkeyR2YWx1ZS5sYWJlbH0iCiAgICAgICAgICAgICAgICAgIHt7aWYgJHZhbHVlLmxhYmVsID09IHNlbGVjdGVkfX1zZWxlY3RlZD0ic2VsZWN0ZWQie3svaWZ9fT4KICAgICAgICAgICAge3todG1sICR2YWx1ZS5sYWJlbH19IHt7aWYgJHZhbHVlLmluZm99fSgkeyR2YWx1ZS5pbmZvfSl7ey9pZn19CiAgICAgICAgICA8L29wdGlvbj4KICAgICAgICAgIHt7L2VhY2h9fQogICAgICAgIDwvc2VsZWN0PgogICAgICA8L3RkPgogICAgICA8dGQgaWQ9InByaW50LXNlbGVjdG9yIj48L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgIHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1aXRlRGV0YWlsc1NlbGVjdG9yVGVtcGxhdGUiPgogIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgaWQ9ImRldGFpbHMtaGVhZGVyIj4KICAgIDx0ciBjbGFzcz0ic2VsZWN0b3IiPgogICAgICA8dGg+U3VpdGU6PC90aD4KICAgICAgPHRkIGlkPSJub3JtYWwtc2VsZWN0b3IiPgogICAgICAgIDxzZWxlY3QgaWQ9InN1aXRlLWRldGFpbC1zZWxlY3RvciIgdGl0bGU9IlN1aXRlIHNlbGVjdG9yIgogICAgICAgICAgICAgICAgb25jaGFuZ2U9InN1aXRlRGV0YWlsU2VsZWN0ZWQodGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWUpIj4KICAgICAgICAgIDxvcHRpb24gc2VsZWN0ZWQgZGlzYWJsZWQgaGlkZGVuPi0tIFNlbGVjdCAtLTwvb3B0aW9uPgogICAgICAgICAge3tlYWNoIHN1aXRlc319CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIkeyR2YWx1ZS5pZH0iCiAgICAgICAgICAgICAgICAgIHt7aWYgJHZhbHVlLmlkID09IHNlbGVjdGVkfX1zZWxlY3RlZD0ic2VsZWN0ZWQie3svaWZ9fT4KICAgICAgICAgICAge3todG1sICR2YWx1ZS5sYWJlbH19CiAgICAgICAgICA8L29wdGlvbj4KICAgICAgICAgIHt7L2VhY2h9fQogICAgICAgIDwvc2VsZWN0PgogICAgICA8L3RkPgogICAgICA8dGQgaWQ9InByaW50LXNlbGVjdG9yIj48L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgIHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InNlYXJjaFNlbGVjdG9yVGVtcGxhdGUiPgogIDxmb3JtIGFjdGlvbj0iamF2YXNjcmlwdDp2b2lkKDApIj4KICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgaWQ9ImRldGFpbHMtaGVhZGVyIj4KICAgICAgPHRyIGNsYXNzPSJzZWxlY3RvciBmaXJzdC1zZWxlY3RvciI+CiAgICAgICAgPHRoPjxsYWJlbCBmb3I9InNlYXJjaC1zdWl0ZSI+U3VpdGU6PC9sYWJlbD48L3RoPgogICAgICAgIDx0ZD48aW5wdXQgaWQ9InNlYXJjaC1zdWl0ZSIgdHlwZT0idGV4dCIgdmFsdWU9IiR7c3VpdGV9Ij48L3RkPgogICAgICA8L3RyPgogICAgICA8dHIgY2xhc3M9InNlbGVjdG9yIG1pZGRsZS1zZWxlY3RvciI+CiAgICAgICAgPHRoPjxsYWJlbCBmb3I9InNlYXJjaC10ZXN0Ij57ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fTo8L2xhYmVsPjwvdGg+CiAgICAgICAgPHRkPjxpbnB1dCBpZD0ic2VhcmNoLXRlc3QiIHR5cGU9InRleHQiIHZhbHVlPSIke3Rlc3R9Ij48L3RkPgogICAgICA8L3RyPgogICAgICA8dHIgY2xhc3M9InNlbGVjdG9yIG1pZGRsZS1zZWxlY3RvciI+CiAgICAgICAgPHRoPjxsYWJlbCBmb3I9InNlYXJjaC1pbmNsdWRlIj5JbmNsdWRlOjwvbGFiZWw+PC90aD4KICAgICAgICA8dGQ+PGlucHV0IGlkPSJzZWFyY2gtaW5jbHVkZSIgdHlwZT0idGV4dCIgdmFsdWU9IiR7aW5jbHVkZX0iPjwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBjbGFzcz0ic2VsZWN0b3IgbWlkZGxlLXNlbGVjdG9yIj4KICAgICAgICA8dGg+PGxhYmVsIGZvcj0ic2VhcmNoLWV4Y2x1ZGUiPkV4Y2x1ZGU6PC9sYWJlbD48L3RoPgogICAgICAgIDx0ZD48aW5wdXQgaWQ9InNlYXJjaC1leGNsdWRlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iJHtleGNsdWRlfSI+PC90ZD4KICAgICAgPC90cj4KICAgICAgPHRyIGNsYXNzPSJzZWxlY3RvciBsYXN0LXNlbGVjdG9yIiBpZD0ic2VhcmNoLWJ1dHRvbnMiPgogICAgICAgIDx0aD48L3RoPgogICAgICAgIDx0ZD4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2giCiAgICAgICAgICAgICAgICAgb25jbGljaz0ic2VhcmNoRXhlY3V0ZWQoJCgnI3NlYXJjaC1zdWl0ZScpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtdGVzdCcpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtaW5jbHVkZScpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtZXhjbHVkZScpLnZhbCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ij4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJDbGVhciIKICAgICAgICAgICAgICAgICBvbmNsaWNrPSIkKCcjc2VhcmNoLXN1aXRlJykudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjc2VhcmNoLXRlc3QnKS52YWwoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtaW5jbHVkZScpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3NlYXJjaC1leGNsdWRlJykudmFsKCcnKTsiPgogICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiBvbmNsaWNrPSIkKCcjc2VhcmNoLWhlbHAnKS50b2dnbGUoKSIKICAgICAgICAgICAgIHRpdGxlPSJUb2dnbGUgc2VhcmNoIGhlbHAuIj5IZWxwPC9hPgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBpZD0ic2VhcmNoLWhlbHAiIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KICAgICAgICA8dGg+PC90aD4KICAgICAgICA8dGQ+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8aDM+U2VhcmNoIGZpZWxkczwvaDM+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIHt7PSB0ZXN0T3JUYXNrKCd7VGVzdH0nKX19cyBjYW4gYmUgc2VhcmNoZWQgYmFzZWQgb24gc3VpdGUgYW5kCiAgICAgICAgICAgICAge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX0gbmFtZXMgYXMgd2VsbCBhcyBiYXNlZCBvbiB0YWdzLiBJZgogICAgICAgICAgICAgIG11bHRpcGxlIHNlYXJjaCBjcml0ZXJpYSBhcmUgdXNlZCwgb25seQogICAgICAgICAgICAgIHt7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19cyBtYXRjaGluZyBhbGwgb2YgdGhlbSBhcmUgaW5jbHVkZWQuCiAgICAgICAgICAgICAgU2VhcmNoIGZpZWxkcyBoYXZlIHNhbWUgc2VtYW50aWNzIGFzCiAgICAgICAgICAgICAgPGVtPiYjODIwOTsmIzgyMDk7c3VpdGU8L2VtPiwKICAgICAgICAgICAgICA8ZW0+JiM4MjA5OyYjODIwOTt7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fTwvZW0+LAogICAgICAgICAgICAgIDxlbT4mIzgyMDk7JiM4MjA5O2luY2x1ZGU8L2VtPiBhbmQKICAgICAgICAgICAgICA8ZW0+JiM4MjA5OyYjODIwOTtleGNsdWRlPC9lbT4gY29tbWFuZCBsaW5lIG9wdGlvbnMsIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8dGFibGUgY2xhc3M9InNlYXJjaC1oZWxwLWV4YW1wbGVzIj4KICAgICAgICAgICAgICA8Y29sIGNsYXNzPSJoZWxwLWl0ZW0iPgogICAgICAgICAgICAgIDxjb2wgY2xhc3M9ImhlbHAtZXhwbGFuYXRpb24iPgogICAgICAgICAgICAgIDxjb2wgY2xhc3M9ImhlbHAtZXhhbXBsZXM+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPkZpZWxkPC90aD4KICAgICAgICAgICAgICAgIDx0aD5FeHBsYW5hdGlvbjwvdGg+CiAgICAgICAgICAgICAgICA8dGg+RXhhbXBsZXM8L3RoPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPlN1aXRlPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAge3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX1zIGluIG1hdGNoaW5nIHN1aXRlcyBhcmUgaW5jbHVkZWQuCiAgICAgICAgICAgICAgICAgIFRoZSBwYXR0ZXJuIGNhbiBtYXRjaCBlaXRoZXIgc3VpdGUncyBuYW1lIG9yIGl0cyBmdWxsIG5hbWUKICAgICAgICAgICAgICAgICAgdGhhdCBjb250YWlucyBhbHNvIHBhcmVudCBzdWl0ZSBuYW1lcy4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+TXkgU3VpdGU8YnI+Um9vdC5QYXJlbnQuU3VpKjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+e3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX08L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICBNYXRjaGluZyB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fXMgYXJlIGluY2x1ZGVkLiBUaGUKICAgICAgICAgICAgICAgICAgcGF0dGVybiBjYW4gbWF0Y2ggZWl0aGVyIHt7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19J3MgbmFtZQogICAgICAgICAgICAgICAgICBvciBpdHMgZnVsbCBuYW1lIHRoYXQgY29udGFpbnMgYWxzbyBwYXJlbnQgc3VpdGUgbmFtZXMuCiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPkV4YW1wbGUgTmFtZTxicj5Sb290LlBhKi5UPz8/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD5JbmNsdWRlPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAge3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX1zIHRoYXQgY29udGFpbiBtYXRjaGluZyB0YWdzIGFyZQogICAgICAgICAgICAgICAgICBpbmNsdWRlZC4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+c21va2U8YnI+YnVnLSo8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPkV4Y2x1ZGU8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICB7ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fXMgdGhhdCBjb250YWluIG1hdGNoaW5nIHRhZ3MgYXJlCiAgICAgICAgICAgICAgICAgIG5vdCBpbmNsdWRlZC4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+c2xvdzxicj5mZWF0dXJlLTQ/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8aDM+UGF0dGVybnM8L2gzPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBBbGwgc2VhcmNoZXMgc3VwcG9ydCA8ZW0+KjwvZW0+IGFuZCA8ZW0+PzwvZW0+IHdpbGRjYXJkcyBhbmQgYXJlCiAgICAgICAgICAgICAgY2FzZSwgc3BhY2UgYW5kIHVuZGVyc2NvcmUgaW5zZW5zaXRpdmUuIFRhZyByZWxhdGVkIHNlYXJjaGVzIGFsc28KICAgICAgICAgICAgICBzdXBwb3J0IDxlbT5BTkQ8L2VtPiwgPGVtPk9SPC9lbT4gYW5kIDxlbT5OT1Q8L2VtPiAoY2FzZS1zZW5zaXRpdmUpCiAgICAgICAgICAgICAgY29tYmluaW5nIG9wZXJhdG9ycy4gSWYgb3BlcmF0b3JzIGFyZSB1c2VkIHRvZ2V0aGVyLCB0aGVpcgogICAgICAgICAgICAgIHByZWNlZGVuY2UsIGZyb20gaGlnaGVzdCB0byBsb3dlc3QsIGlzIDxlbT5BTkQ8L2VtPiwgPGVtPk9SPC9lbT4sCiAgICAgICAgICAgICAgPGVtPk5PVDwvZW0+LiBTZWUgPGVtPlNpbXBsZSBwYXR0ZXJuczwvZW0+IGFuZAogICAgICAgICAgICAgIDxlbT5UYWcgcGF0dGVybnM8L2VtPiBzZWN0aW9ucyBpbgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9yb2JvdGZyYW1ld29yay5vcmcvcm9ib3RmcmFtZXdvcmsvI3VzZXItZ3VpZGUiPlJvYm90CiAgICAgICAgICAgICAgRnJhbWV3b3JrIFVzZXIgR3VpZGU8L2E+IGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJzZWFyY2gtaGVscC1leGFtcGxlcyI+CiAgICAgICAgICAgICAgPGNvbCBjbGFzcz0iaGVscC1pdGVtIj4KICAgICAgICAgICAgICA8Y29sIGNsYXNzPSJoZWxwLWV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICA8Y29sIGNsYXNzPSJoZWxwLWV4YW1wbGVzPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0aD5QYXR0ZXJuPC90aD4KICAgICAgICAgICAgICAgIDx0aD5FeHBsYW5hdGlvbjwvdGg+CiAgICAgICAgICAgICAgICA8dGg+RXhhbXBsZXM8L3RoPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPio8L3RkPgogICAgICAgICAgICAgICAgPHRkPk1hdGNoZXMgYW55dGhpbmcsIGV2ZW4gYW4gZW1wdHkgc3RyaW5nLjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+Zio8YnI+c3ByaW50LSo8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPj88L3RkPgogICAgICAgICAgICAgICAgPHRkPk1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIuPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5mPz88YnI+c3ByaW50LTE/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD5BTkQ8L3RkPgogICAgICAgICAgICAgICAgPHRkPk1hdGNoZXMgaWYgYWxsIHBhdHRlcm5zIG1hdGNoLjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+Zm9vIEFORCBiYXI8YnI+eCBBTkQgeSogQU5EIHo/PzwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+T1I8L3RkPgogICAgICAgICAgICAgICAgPHRkPk1hdGNoZXMgaWYgYW55IHBhdHRlcm4gbWF0Y2hlcy48L3RkPgogICAgICAgICAgICAgICAgPHRkPmZvbyBPUiBiYXI8YnI+eCBPUiB5KiBPUiB6MSBBTkQgejI8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPk5PVDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgTWF0Y2hlcyBpZiAob3B0aW9uYWwpIHBhdHRlcm4gYmVmb3JlIG1hdGNoZXMgYW5kIHBhdHRlcm4KICAgICAgICAgICAgICAgICAgICBhZnRlciBkb2VzIG5vdC4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+Zm9vIE5PVCBiYXI8YnI+KiBOT1QgaWQtKiBBTkQgc21va2U8YnI+Tk9UIGJhcjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICA8L3RhYmxlPgogIDwvZm9ybT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRhZ09yVG90YWxEZXRhaWxzVGVtcGxhdGUiPgogIDx0cj4KICAgIDx0aD5TdGF0dXM6PC90aD4KICAgIDx0ZD57e3RtcGwoJGRhdGEpICdzdWl0ZVN0YXR1c01lc3NhZ2VUZW1wbGF0ZSd9fTwvdGQ+CiAgPC90cj4KICB7e2lmIGRvY319CiAgPHRyPgogICAgPHRoPkRvY3VtZW50YXRpb246PC90aD4KICAgIDx0ZD57e2h0bWwgZG9jfX08L3RkPgogIDwvdHI+CiAge3svaWZ9fQogIHt7aWYgY29tYmluZWR9fQogIDx0cj4KICAgIDx0aD5QYXR0ZXJuOjwvdGg+CiAgICA8dGQ+e3todG1sIGNvbWJpbmVkfX08L3RkPgogIDwvdHI+CiAge3svaWZ9fQogIHt7aWYgbGlua3N9fXt7aWYgbGlua3MubGVuZ3RofX0KICA8dHI+CiAgICA8dGg+TGlua3M6PC90aD4KICAgIDx0ZD57e2VhY2ggbGlua3N9fTxhIGhyZWY9Int7aHRtbCAkdmFsdWUudXJsfX0iCiAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0ie3todG1sICR2YWx1ZS51cmx9fSI+e3todG1sICR2YWx1ZS50aXRsZX19PC9hPiAmbmJzcDsge3svZWFjaH19PC90ZD4KICA8L3RyPgogIHt7L2lmfX17ey9pZn19CiAgPHRyPgogICAgPHRoPlRvdGFsIFRpbWU6PC90aD4KICAgIDx0ZD4ke3RvdGFsVGltZX08L3RkPgogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJzdWl0ZURldGFpbHNUZW1wbGF0ZSI+CiAgPHRyPgogICAgPHRoPlN0YXR1czo8L3RoPgogICAgPHRkPnt7dG1wbCgkZGF0YSkgJ3N1aXRlU3RhdHVzTWVzc2FnZVRlbXBsYXRlJ319PC90ZD4KICA8L3RyPgogIHt7aWYgZG9jKCl9fQogIDx0cj4KICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sIGRvYygpfX08L3RkPgogIDwvdHI+CiAge3svaWZ9fQogIHt7ZWFjaCBtZXRhZGF0YX19CiAgPHRyPgogICAgPHRoPnt7aHRtbCAkdmFsdWVbMF19fTo8L3RoPgogICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCAkdmFsdWVbMV19fTwvdGQ+CiAgPC90cj4KICB7ey9lYWNofX0KICB7e2lmIG1lc3NhZ2UoKX19CiAgPHRyPgogICAgPHRoPk1lc3NhZ2U6PC90aD4KICAgIDx0ZCBjbGFzcz0ibWVzc2FnZSI+e3todG1sIG1lc3NhZ2UoKX19PC90ZD4KICA8L3RyPgogIHt7L2lmfX0KICA8dHI+CiAgICA8dGg+U3RhcnQgLyBFbmQgVGltZTo8L3RoPgogICAgPHRkPiR7dGltZXMuc3RhcnRUaW1lfSAvICR7dGltZXMuZW5kVGltZX08L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRoPkVsYXBzZWQgVGltZTo8L3RoPgogICAgPHRkPiR7dGltZXMuZWxhcHNlZFRpbWV9PC90ZD4KICA8L3RyPgogIHt7aWYgJGl0ZW0ubG9nVVJMfX0KICA8dHI+CiAgICA8dGg+TG9nIEZpbGU6PC90aD4KICAgIDx0ZD48YSBocmVmPSIkeyRpdGVtLmxvZ1VSTH0jJHtpZH0iCiAgICAgICAgICAgdGl0bGU9Int7aHRtbCBmdWxsTmFtZX19Ij4keyRpdGVtLmxvZ1VSTH0jJHtpZH08L2E+PC90ZD4KICA8L3RyPgogIHt7L2lmfX0KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRlc3REZXRhaWxzVGFibGVUZW1wbGF0ZSI+CiAgPHRhYmxlIGlkPSJ0ZXN0LWRldGFpbHMiPgogICAgPHRoZWFkPgogICAgICA8dHI+CiAgICAgICAgPHRoIGNsYXNzPSJkZXRhaWxzLWNvbC1uYW1lIiB0aXRsZT0iTmFtZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC1oZWFkZXInPk5hbWU8L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtZG9jIiB0aXRsZT0iRG9jdW1lbnRhdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC10b2dnbGUnIG9uY2xpY2s9InRvZ2dsZURldGFpbHNDb2x1bW4oJ2RvYycpIj4mdGltZXM7PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC1oZWFkZXInPkRvY3VtZW50YXRpb248L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtdGFncyIgdGl0bGU9IlRhZ3MiPgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtdG9nZ2xlJyBvbmNsaWNrPSJ0b2dnbGVEZXRhaWxzQ29sdW1uKCd0YWdzJykiPiZ0aW1lczs8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLWhlYWRlcic+VGFnczwvZGl2PgogICAgICAgIDwvdGg+CiAgICAgICAgPHRoIGNsYXNzPSJkZXRhaWxzLWNvbC1zdGF0dXMiIHRpdGxlPSJTdGF0dXMiPgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5TdGF0dXM8L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtbXNnIiB0aXRsZT0iTWVzc2FnZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC10b2dnbGUnIG9uY2xpY2s9InRvZ2dsZURldGFpbHNDb2x1bW4oJ21zZycpIj4mdGltZXM7PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC1oZWFkZXInPk1lc3NhZ2U8L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtZWxhcHNlZCIgdGl0bGU9IkVsYXBzZWQgVGltZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC10b2dnbGUnIG9uY2xpY2s9InRvZ2dsZURldGFpbHNDb2x1bW4oJ2VsYXBzZWQnKSI+JnRpbWVzOzwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5FbGFwc2VkPC9kaXY+CiAgICAgICAgPC90aD4KICAgICAgICA8dGggY2xhc3M9ImRldGFpbHMtY29sLXRpbWVzIiB0aXRsZT0iU3RhcnQgVGltZSAvIEVuZCBUaW1lIj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLXRvZ2dsZScgb25jbGljaz0idG9nZ2xlRGV0YWlsc0NvbHVtbigndGltZXMnKSI+JnRpbWVzOzwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5TdGFydCAvIEVuZDwvZGl2PgogICAgICAgIDwvdGg+CiAgICAgIDwvdHI+CiAgICA8L3RoZWFkPgogICAgPHRib2R5PjwvdGJvZHk+CiAgPC90YWJsZT4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InRlc3REZXRhaWxzVGFibGVSb3dUZW1wbGF0ZSI+CiAge3tpZiAkaXRlbS5sb2dVUkx9fQogIDx0ciBvbmNsaWNrPSJsb2NhdGlvbiA9ICckeyRpdGVtLmxvZ1VSTH0jJHtpZH0nIiB0aXRsZT0ie3todG1sIGZ1bGxOYW1lfX0iPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1uYW1lIj4KICAgICAgPGRpdj48YSBocmVmPSIkeyRpdGVtLmxvZ1VSTH0jJHtpZH0iPjxzcGFuIGNsYXNzPSJwYXJlbnQtbmFtZSI+e3todG1sIGZvcm1hdFBhcmVudE5hbWV9fTwvc3Bhbj57e2h0bWwgbmFtZX19PC9hPjwvZGl2PgogICAgPC90ZD4KICB7e2Vsc2V9fQogIDx0ciB0aXRsZT0ie3todG1sIGZ1bGxOYW1lfX0iPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1uYW1lIj4KICAgICAgPGRpdj48c3BhbiBjbGFzcz0icGFyZW50LW5hbWUiPnt7aHRtbCBmb3JtYXRQYXJlbnROYW1lfX08L3NwYW4+e3todG1sIG5hbWV9fTwvZGl2PgogICAgPC90ZD4KICB7ey9pZn19CiAgICA8dGQgY2xhc3M9ImRldGFpbHMtY29sLWRvYyI+PGRpdiBjbGFzcz0iZG9jIGRldGFpbHMtbGltaXRlZCI+e3todG1sIGRvYygpfX08L2Rpdj48L3RkPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC10YWdzIj48ZGl2Pnt7aHRtbCB0YWdzLmpvaW4oJywgJyl9fTwvZGl2PjwvdGQ+CiAgICA8dGQgY2xhc3M9ImRldGFpbHMtY29sLXN0YXR1cyI+PGRpdj48c3BhbiBjbGFzcz0ibGFiZWwgJHtzdGF0dXMudG9Mb3dlckNhc2UoKX0iPiR7c3RhdHVzfTwvc3Bhbj48L2Rpdj48L3RkPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1tc2ciPjxkaXYgY2xhc3M9Im1lc3NhZ2UgZGV0YWlscy1saW1pdGVkIj57e2h0bWwgbWVzc2FnZSgpfX08L2Rpdj48L3RkPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC1lbGFwc2VkIj48ZGl2PiR7dGltZXMuZWxhcHNlZFRpbWV9PC9kaXY+PC90ZD4KICAgIDx0ZCBjbGFzcz0iZGV0YWlscy1jb2wtdGltZXMiPjxkaXY+JHt0aW1lcy5zdGFydFRpbWV9PGJyPiR7dGltZXMuZW5kVGltZX08L2Rpdj48L3RkPgogIDwvdHI+Cjwvc2NyaXB0PgoKPC9ib2R5Pgo8L2h0bWw+Cg==';w.document.open();w.document.write(window.atob(d));w.document.close();var a=w.document.createElement('a');a.appendChild(w.document.createTextNode('Download'));a.href='data:text/html;base64,' + d;a.download='report.html';a.style='position:fixed;top:0;right:0;color:white;background:black;text-decoration:none;font-weight:bold;padding:7px 14px;border-radius:0 0 0 5px;';w.document.body.append(a);})(this);\">Report</a></p>" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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" }, "metadata": { "image/png": { "height": 104, "width": 203 } }, "output_type": "display_data" } ], "source": [ "*** Test Cases ***\n", "\n", "Show Plone logo\n", " Open url https://plone.org\n", " Page should contain element css=.navbar-brand\n", " Capture and crop page screenshot plone.png\n", " ... css=.navbar-brand" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "slide" }, "tags": [ "raises-exception" ] }, "outputs": [ { "data": { "text/html": [ "<p><a href=\"about:\" onClick=\"javascript:(function(el){var w=window.open();var d='PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KPG1ldGEgaHR0cC1lcXVpdj0iUHJhZ21hIiBjb250ZW50PSJuby1jYWNoZSI+CjxtZXRhIGh0dHAtZXF1aXY9IkV4cGlyZXMiIGNvbnRlbnQ9Ii0xIj4KPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIj4KPG1ldGEgY29udGVudD0iUm9ib3QgRnJhbWV3b3JrIDQuMC4zIChQeXRob24gMy45LjYgb24gbGludXgpIiBuYW1lPSJHZW5lcmF0b3IiPgo8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBRUFJQUJvQkFBQUZnQUFBQ2dBQUFBUUFBQUFJQUFBQUFFQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLY0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQXFBQUFBQUFBQUFBQUFBQUFBQUFBQUxJQUFBRC9BQUFBNEFBQUFOd0FBQURjQUFBQTNBQUFBTndBQUFEY0FBQUEzQUFBQU53QUFBRGNBQUFBNEFBQUFQOEFBQUN4QUFBQUFBQUFBS1lBQUFEL0FBQUF1d0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQy9BQUFBL3dBQUFLa0FBQUQ2QUFBQXpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU44QUFBRC9BQUFBK2dBQUFNTUFBQUFBQUFBQUFnQUFBR3NBQUFCckFBQUFhd0FBQUdzQUFBQnJBQUFBYXdBQUFHc0FBQUJyQUFBQURBQUFBQUFBQUFEYUFBQUEvd0FBQVBvQUFBRERBQUFBQUFBQUFJc0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFORUFBQUFBQUFBQTJnQUFBUDhBQUFENkFBQUF3d0FBQUFBQUFBQUFBQUFBTWdBQUFESUFBQUF5QUFBQU1nQUFBRElBQUFBeUFBQUFNZ0FBQURJQUFBQUZBQUFBQUFBQUFOb0FBQUQvQUFBQStnQUFBTU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGFBQUFBL3dBQUFQb0FBQUREQUFBQUFBQUFBRHdBQUFCOEFBQUFBQUFBQUdBQUFBQmNBQUFBQUFBQUFIOEFBQUJLQUFBQUFBQUFBQUFBQUFBQUFBQUEyZ0FBQVA4QUFBRDZBQUFBd3dBQUFBQUFBQURDQUFBQS93QUFBQ2tBQUFEcUFBQUE0UUFBQUFBQUFBRDdBQUFBL3dBQUFMQUFBQUFHQUFBQUFBQUFBTm9BQUFEL0FBQUErZ0FBQU1NQUFBQUFBQUFBSXdBQUFQNEFBQUQvQUFBQS93QUFBR0FBQUFBQUFBQUFBQUFBQU1rQUFBRC9BQUFBaWdBQUFBQUFBQURhQUFBQS93QUFBUG9BQUFEREFBQUFBQUFBQUFBQUFBQUlBQUFBY0FBQUFCa0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFZ0FBQUFBQUFBQUFBQUFBMmdBQUFQOEFBQUQ3QUFBQXl3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU40QUFBRC9BQUFBcXdBQUFQOEFBQUN2QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTElBQUFEL0FBQUFzZ0FBQUFBQUFBQzVBQUFBL3dBQUFNb0FBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQUFBREFBQUFBd0FBQUFNa0FBQUQvQUFBQXZBQUFBQUFBQUFBQUFBQUFBQUFBQUt3QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBclFBQUFBQUFBQUFBd0FNQUFJQUJBQUFmK0FBQVAvd0FBRC84QUFBZ0JBQUFQL3dBQUQvOEFBQS8vQUFBSkl3QUFESEVBQUEvL0FBQVAvd0FBQi80QUFDQUFRQUF3QU1BQUE9PSI+CjxzdHlsZSBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyI+Ci8qIEdlbmVyaWMgYW5kIG1pc2Mgc3R5bGVzICovCmJvZHkgewogICAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICBjb2xvcjogYmxhY2s7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQp0YWJsZSB7CiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBmb250LXNpemU6IDFlbTsKfQp0aCwgdGQgewogICAgdmVydGljYWwtYWxpZ246IHRvcDsKfQpiciB7CiAgICBtc28tZGF0YS1wbGFjZW1lbnQ6IHNhbWUtY2VsbDsgLyogbWFpbnRhaW4gbGluZSBicmVha3MgaW4gRXhjZWwgKi8KfQpociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KYSwgYTpsaW5rLCBhOnZpc2l0ZWQgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgY29sb3I6ICMxNWM7Cn0KYSA+IGltZyB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjMTVjICFpbXBvcnRhbnQ7Cn0KYTpob3ZlciwgYTphY3RpdmUgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICBjb2xvcjogIzYxYzsKfQoucGFyZW50LW5hbWUgewogICAgZm9udC1zaXplOiAwLjdlbTsKICAgIGxldHRlci1zcGFjaW5nOiAtMC4wN2VtOwp9Ci5tZXNzYWdlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKfQovKiBIZWFkZXJzICovCiNoZWFkZXIgewogICAgd2lkdGg6IDY1ZW07CiAgICBoZWlnaHQ6IDNlbTsKICAgIG1hcmdpbjogNnB4IDA7Cn0KaDEgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBtYXJnaW46IDAgMCAwLjVlbSAwOwogICAgd2lkdGg6IDc1JTsKfQpoMiB7CiAgICBjbGVhcjogbGVmdDsKfQojZ2VuZXJhdGVkIHsKICAgIGZsb2F0OiByaWdodDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLyogRG9jdW1lbnRhdGlvbiBoZWFkZXJzICovCi5kb2MgPiBoMiB7CiAgICBmb250LXNpemU6IDEuMmVtOwp9Ci5kb2MgPiBoMyB7CiAgICBmb250LXNpemU6IDEuMWVtOwp9Ci5kb2MgPiBoNCB7CiAgICBmb250LXNpemU6IDEuMGVtOwp9Ci8qIFN0YXR1cyB0ZXh0IGNvbG9ycyAtLSAhaW1wb3J0YW50IGFsbG93cyB1c2luZyB0aGVtIGluIGxpbmtzICovCi5mYWlsIHsKICAgIGNvbG9yOiAjY2UzZTAxICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoucGFzcyB7CiAgICBjb2xvcjogIzA5OGEwOSAhaW1wb3J0YW50Owp9Ci5za2lwIHsKICAgIGNvbG9yOiAjOTI3MjAxICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoubGFiZWwgewogICAgcGFkZGluZzogMnB4IDVweDsKICAgIGZvbnQtc2l6ZTogMC43NWVtOwogICAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogYmxhY2s7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9Ci5sYWJlbC5kZWJ1ZywgLmxhYmVsLnRyYWNlLCAubGFiZWwuZXJyb3IsIC5sYWJlbC5rZXl3b3JkIHsKICAgIGxldHRlci1zcGFjaW5nOiAwOwp9Ci5sYWJlbC5wYXNzLCAubGFiZWwuZmFpbCwgLmxhYmVsLmVycm9yLCAubGFiZWwuc2tpcCwgLmxhYmVsLndhcm4gewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLmxhYmVsLnBhc3MgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzk3YmQ2MTsKICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7Cn0KLmxhYmVsLmZhaWwsIC5sYWJlbC5lcnJvciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2UzZTAxOwogICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKfQoubGFiZWwuc2tpcCwgLmxhYmVsLndhcm4gewogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZDg0ZjsKICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7Cn0KLyogVG9wIHJpZ2h0IGhlYWRlciAqLwojdG9wLXJpZ2h0LWhlYWRlciB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDA7CiAgICByaWdodDogMDsKICAgIHotaW5kZXg6IDEwMDA7CiAgICB3aWR0aDogMTJlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQojcmVwb3J0LW9yLWxvZy1saW5rIGEgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiBibGFjazsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMWVtOwogICAgcGFkZGluZzogMC4zZW0gMDsKICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKfQojcmVwb3J0LW9yLWxvZy1saW5rIGE6aG92ZXIgewogICAgY29sb3I6ICNkZGQ7Cn0KI2xvZy1sZXZlbC1zZWxlY3RvciB7CiAgICBwYWRkaW5nOiAwLjNlbSAwOwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6ICNkZGQ7Cn0KLyogU3RhdGlzdGljcyB0YWJsZSAqLwouc3RhdGlzdGljcyB7CiAgICB3aWR0aDogNjVlbTsKICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICBlbXB0eS1jZWxsczogc2hvdzsKICAgIG1hcmdpbi1ib3R0b206IDFlbTsKfQouc3RhdGlzdGljcyB0cjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiAjZjRmNGY0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci5zdGF0aXN0aWNzIHRoLCAuc3RhdGlzdGljcyB0ZCB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgcGFkZGluZzogMC4xZW0gMC4zZW07Cn0KLnN0YXRpc3RpY3MgdGggewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKICAgIHBhZGRpbmc6IDAuMmVtIDAuM2VtOwp9Ci5zdGF0aXN0aWNzIHRkIHsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KLnN0YXRzLWNvbC1zdGF0IHsKICAgIHdpZHRoOiA0LjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc3RhdHMtY29sLWVsYXBzZWQgewogICAgd2lkdGg6IDUuNWVtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5zdGF0cy1jb2wtZ3JhcGggewogICAgd2lkdGg6IDllbTsKfQp0aC5zdGF0cy1jb2wtZ3JhcGg6aG92ZXIgewogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5zdGF0LW5hbWUgewogICAgZmxvYXQ6IGxlZnQ7Cn0KLnN0YXQtbmFtZSBhLCAuc3RhdC1uYW1lIHNwYW4gewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLnRhZy1saW5rcyB7CiAgICBmb250LXNpemU6IDAuOWVtOwogICAgZmxvYXQ6IHJpZ2h0OwogICAgbWFyZ2luLXRvcDogMC4wNWVtOwp9Ci50YWctbGlua3Mgc3BhbiB7CiAgICBtYXJnaW4tbGVmdDogMC4yZW07Cn0KLyogU3RhdGlzdGljcyBncmFwaCAqLwouZ3JhcGgsIC5lbXB0eS1ncmFwaCB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgd2lkdGg6IGF1dG87CiAgICBoZWlnaHQ6IDdweDsKICAgIHBhZGRpbmc6IDA7CiAgICBiYWNrZ3JvdW5kOiAjYWFhOwp9Ci5lbXB0eS1ncmFwaCB7CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9Ci5wYXNzLWJhciwgLmZhaWwtYmFyLCAuc2tpcC1iYXIgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBoZWlnaHQ6IDEwMCU7Cn0KLmZhaWwtYmFyIHsKICAgIGJhY2tncm91bmQ6ICNjZTNlMDE7Cn0KLnBhc3MtYmFyIHsKICAgIGJhY2tncm91bmQ6ICM5N2JkNjE7Cn0KLnNraXAtYmFyIHsKICAgIGJhY2tncm91bmQ6ICNmZWQ4NGY7Cn0KLyogVGFibGVzb3J0ZXIgLSBhZGFwdGVkIGZyb20gcHJvdmlkZWQgQmx1ZSBTa2luICovCi50YWJsZXNvcnRlci1oZWFkZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBSUFBQUg5L2Z3QUFBQ0g1QkFFQUFBRUFMQUFBQUFBTEFBa0FBQUlSakFPbkJyM2NuSXIwV1VqVHJDOWU5QlFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIHJpZ2h0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci50YWJsZXNvcnRlci1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKfQoudGFibGVzb3J0ZXItaGVhZGVyQXNjIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhDd0FKQUtFQUFBQUFBSDkvZndBQUFBQUFBQ0g1QkFFQUFBSUFMQUFBQUFBTEFBa0FBQUlVbEJXbkZyM2NuSXIwV1FPeUJtdnpwMTNDcHhRQU93PT0pOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYyAhaW1wb3J0YW50Owp9Ci50YWJsZXNvcnRlci1oZWFkZXJEZXNjIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhDd0FKQUtFQUFBQUFBSDkvZndBQUFBQUFBQ0g1QkFFQUFBSUFMQUFBQUFBTEFBa0FBQUlVbEFXbkJyM2NuSXIwV1JPeURtdnpwMTNDcHhRQU93PT0pOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYyAhaW1wb3J0YW50Owp9Ci5zb3J0ZXItZmFsc2UgewogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQouc29ydGVyLWZhbHNlOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIj4KLyogSWNvbnMgYXJlIGZyb20gT3BlbiBJY29uaWMgPGh0dHBzOi8vdXNlaWNvbmljLmNvbS9vcGVuLz4uCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gKi8KLyogQ29udGFpbmVycyAqLwouc3VpdGUsIC50ZXN0LCAjZXJyb3JzIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBwYWRkaW5nOiAwLjNlbSAwLjJlbTsKICAgIG1hcmdpbjogMC4yZW0gMDsKfQoudGVzdCB7CiAgICBib3JkZXItc3R5bGU6IGRhc2hlZDsKfQojZXJyb3JzLCAubWVzc2FnZXMgewogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXItc3BhY2luZzogMDsKfQouY2hpbGRyZW4gewogICAgZGlzcGxheTogbm9uZTsKICAgIG1hcmdpbi1sZWZ0OiAxLjRlbTsKfQouc3VpdGUsIC50ZXN0LCAua2V5d29yZCB7CiAgICBtYXJnaW4tbGVmdDogLTAuMmVtOwp9CiNzMSwgLnN1aXRlID4gLmNoaWxkcmVuID4gLmtleXdvcmQgewogICAgbWFyZ2luLWxlZnQ6IDA7Cn0KLyogU3VpdGUsIHRlc3QgYW5kIGt3IGhlYWRlcnMgKi8KLmVsZW1lbnQtaGVhZGVyIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9Ci5lbGVtZW50LWhlYWRlcjpob3ZlciB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwogICAgYm9yZGVyLWNvbG9yOiAjY2NjOwp9Ci5lbGVtZW50LWhlYWRlci10b2dnbGUgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgbGVmdDogM3B4OwogICAgdG9wOiA1cHg7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVlBQUFBR0NBUUFBQUJLeFNmREFBQUFBbUpMUjBRQS80ZVB6TDhBQUFBSmNFaFpjd0FBQ3hNQUFBc1RBUUNhbkJnQUFBQUhkRWxOUlFmZUNSMEpDaFNrWnoyMEFBQUFHa2xFUVZRSTEyTmdRQUtNREt6SW5QOElEaE9xTWs0RzdBQUFOUXdCRTQyN1BZVUFBQUFBU1VWT1JLNUNZSUk9KTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTRJaUJvWldsbmFIUTlJamdpSUhacFpYZENiM2c5SWpBZ01DQTRJRGdpUGdvZ0lEeHdZWFJvSUdROUlrMHdJREIyTW1nNGRpMHlhQzA0ZWlJZ2RISmhibk5tYjNKdFBTSjBjbUZ1YzJ4aGRHVW9NQ0F6S1NJZ0x6NEtQQzl6ZG1jKyksIG5vbmU7CiAgICBoZWlnaHQ6IDEwcHg7CiAgICB3aWR0aDogMTBweDsKICAgIGJhY2tncm91bmQtc2l6ZTogNnB4IDZweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBib3JkZXItcmFkaXVzOiAycHg7Cn0KLmNsb3NlZCA+IC5lbGVtZW50LWhlYWRlci10b2dnbGUgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVlBQUFBR0NBUUFBQUJLeFNmREFBQUFBbUpMUjBRQS80ZVB6TDhBQUFBSmNFaFpjd0FBQ3hNQUFBc1RBUUNhbkJnQUFBQUhkRWxOUlFmZUNSMEpDREhkVll0eEFBQUFNMGxFUVZRSTEwM01NUXFBTUJRRndWSHlJVGFCM1ArVzFzS3pTQkMzbVc2aFJGdzBwVUI1RHZGMWJ1OUZOMFJNM1gvd0FrOThDVW52RlRha0FBQUFBRWxGVGtTdVFtQ0MpOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJNElpQm9aV2xuYUhROUlqZ2lJSFpwWlhkQ2IzZzlJakFnTUNBNElEZ2lQZ29nSUR4d1lYUm9JR1E5SWsweklEQjJNMmd0TTNZeWFETjJNMmd5ZGkwemFETjJMVEpvTFROMkxUTm9MVEo2SWlBdlBnbzhMM04yWno0PSksIG5vbmU7Cn0KLmVsZW1lbnQtaGVhZGVyOmhvdmVyID4gLmVsZW1lbnQtaGVhZGVyLXRvZ2dsZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9Ci5lbGVtZW50LWhlYWRlci1yaWdodDpob3ZlciB+IC5lbGVtZW50LWhlYWRlci10b2dnbGUgewogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KLmVsZW1lbnQtaGVhZGVyLWxlZnQgewogICAgcGFkZGluZzogM3B4IDgwcHggM3B4IDIwcHg7Cn0KLmVsZW1lbnQtaGVhZGVyLXJpZ2h0IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHJpZ2h0OiAwOwogICAgdG9wOiAwOwogICAgcGFkZGluZzogM3B4OwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5uYW1lIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9Ci5lbGFwc2VkIHsKICAgIGZsb2F0OiByaWdodDsKICAgIGNvbG9yOiAjNjY2OwogICAgcGFkZGluZy1sZWZ0OiAxZW07Cn0KLmxpbmsgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQWdBQUFBSUNBWUFBQURFRDc2TEFBQUFCSE5DU1ZRSUNBZ0lmQWhraUFBQUFBbHdTRmx6QUFBTEV3QUFDeE1CQUpxY0dBQUFBSGxKUkVGVUdKVnR6ckVKd21BUUJ0Q242QVN1SUtUSUJoWTJnbWdoQmlKWUIxdWR3azEwQjhGSmJLTUJjUUZidGJrZkpIclZ3ZnUrNC9pZEpSNjRZOUg3RTNoaWdqNU8zUzhZNDRBcExuamhuWENOR2hWMnlOR2dnREp3aUMwMmdhdlVicERGdnNjUm80UWRYT01LREhCdWZ6M0hMWUt6Tm40QWJTa1YzZm5jR1FZQUFBQUFTVVZPUks1Q1lJST0pOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJNElpQm9aV2xuYUhROUlqZ2lJSFpwWlhkQ2IzZzlJakFnTUNBNElEZ2lQZ29nSUR4d1lYUm9JR1E5SWswMUxqZzRMakF6WXkwdU1UZ3VNREV0TGpNMkxqQXpMUzQxTXk0d09TMHVNamN1TVMwdU5UTXVNalV0TGpjMUxqUTNZUzQxTGpVZ01DQXhJREFnTGpZNUxqWTVZeTR4TVMwdU1URXVNalF0TGpFM0xqTTRMUzR5TWk0ek5TMHVNVEl1TnpndExqQTNJREV1TURZdU1qSXVNemt1TXprdU16a2dNUzR3TkNBd0lERXVORFJzTFRFdU5TQXhMalZqTFM0ME5DNDBOQzB1T0M0ME9DMHhMakEyTGpRM0xTNHlOaTB1TURFdExqUXhMUzR4TXkwdU5ERXRMakV6WVM0MUxqVWdNQ0F4SURBdExqVXVPRGh6TGpNMExqSXlMamcwTGpJMVl5NDFMakF6SURFdU1pMHVNVFlnTVM0NE1TMHVOemhzTVM0MUxURXVOV011TnpndExqYzRMamM0TFRJdU1EUWdNQzB5TGpneExTNHlPQzB1TWpndExqWXhMUzQwTlMwdU9UY3RMalV6TFM0eE9DMHVNRFF0TGpNNExTNHdOQzB1TlRZdExqQXplbTB0TWlBeUxqTXhZeTB1TlMwdU1ESXRNUzR4T1M0eE5TMHhMamM0TGpjMWJDMHhMalVnTVM0MVl5MHVOemd1TnpndExqYzRJREl1TURRZ01DQXlMamd4TGpVMkxqVTJJREV1TXpZdU56SWdNaTR3Tmk0ME55NHlOeTB1TVM0MU15MHVNalV1TnpVdExqUTNZUzQxTGpVZ01DQXhJREF0TGpZNUxTNDJPV010TGpFeExqRXhMUzR5TkM0eE55MHVNemd1TWpJdExqTTFMakV5TFM0M09DNHdOeTB4TGpBMkxTNHlNaTB1TXprdExqTTVMUzR6T1MweExqQTBJREF0TVM0ME5Hd3hMalV0TVM0MVl5NDBMUzQwTGpjMUxTNDBOU0F4TGpBekxTNDBOQzR5T0M0d01TNDBOeTR3T1M0ME55NHdPV0V1TlM0MUlEQWdNU0F3SUM0ME5DMHVPRGh6TFM0ek5DMHVNaTB1T0RRdExqSXllaUlLSUNBdlBnbzhMM04yWno0PSksIG5vbmU7Cn0KLmV4cGFuZCB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBZ0FBQUFJQ0FZQUFBREVENzZMQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUFMRXdBQUN4TUJBSnFjR0FBQUFEdEpSRUZVR0pWallDQUNLREF3TUJ5QTBsakZEakF3TVB4bllHQjRBQlZRZ0xML1ErVlFCQjZnc2VHbUlpdkNrRVJYaEZVU1dSRk9TYXdBQUVsN0UzdXYxaU1jQUFBQUFFbEZUa1N1UW1DQyk7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhkcFpIUm9QU0k0SWlCb1pXbG5hSFE5SWpnaUlIWnBaWGRDYjNnOUlqQWdNQ0E0SURnaVBnb2dJRHh3WVhSb0lHUTlJazB4TGpVZ01Hd3RNUzQxSURFdU5TQTBJRFFnTkMwMExURXVOUzB4TGpVdE1pNDFJREl1TlMweUxqVXRNaTQxZWlJZ2RISmhibk5tYjNKdFBTSjBjbUZ1YzJ4aGRHVW9NQ0F4S1NJZ0x6NEtQQzl6ZG1jKyksIG5vbmU7Cn0KLmNvbGxhcHNlIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFnQUFBQUlDQVlBQUFERUQ3NkxBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQUxFd0FBQ3hNQkFKcWNHQUFBQUM1SlJFRlVHSlZqWUNBUk5FQXhUc24vVUl5aENGa1NReEc2VGhRK0M1SXBqV2hHMXlOYjRZREZUZGpFTUFFQUNpOFErKzlZOVRBQUFBQUFTVVZPUks1Q1lJST0pOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIZHBaSFJvUFNJNElpQm9aV2xuYUhROUlqZ2lJSFpwWlhkQ2IzZzlJakFnTUNBNElEZ2lQZ29nSUR4d1lYUm9JR1E5SWswMElEQnNMVFFnTkNBeExqVWdNUzQxSURJdU5TMHlMalVnTWk0MUlESXVOU0F4TGpVdE1TNDFMVFF0TkhvaUlIUnlZVzV6Wm05eWJUMGlkSEpoYm5Oc1lYUmxLREFnTVNraUlDOCtDand2YzNablBnPT0pLCBub25lOwp9Ci5leHBhbmQsIC5jb2xsYXBzZSwgLmxpbmsgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIG1hcmdpbjogMCA0cHg7CiAgICBoZWlnaHQ6IDE0cHg7CiAgICB3aWR0aDogMTRweDsKICAgIGJhY2tncm91bmQtc2l6ZTogOHB4IDhweDsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9Ci5saW5rIHsKICAgIGJhY2tncm91bmQtc2l6ZTogMTBweCAxMHB4Owp9Ci5lbGVtZW50LWhlYWRlcjpob3ZlciBhIHsKICAgIHZpc2liaWxpdHk6IHZpc2libGU7Cn0KLmV4cGFuZDpob3ZlciwgLmNvbGxhcHNlOmhvdmVyLCAubGluazpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9Ci8qIE1lc3NhZ2VzIGFuZCBlcnJvcnMgKi8KLm1lc3NhZ2VzIC50aW1lLCAubWVzc2FnZXMgLm1lc3NhZ2UgewogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogMS4xZW07Cn0KI2Vycm9ycyAubWVzc2FnZSB7CiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgZm9udC1zaXplOiAxLjJlbTsKfQoubWVzc2FnZS1yb3cgewogICAgaGVpZ2h0OiAyMHB4Owp9Ci50aW1lIHsKICAgIHdpZHRoOiA3LjVlbTsKfQouZXJyb3ItdGltZSB7CiAgICB3aWR0aDogMTFlbTsKICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5sZXZlbCB7CiAgICB3aWR0aDogNWVtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5zZWxlY3QtbWVzc2FnZSB7CiAgICB3aWR0aDogMjRweDsKfQouc2VsZWN0LW1lc3NhZ2UgPiBkaXYgewogICAgZmxvYXQ6IHJpZ2h0OwogICAgbWFyZ2luLXJpZ2h0OiAycHg7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICB3aWR0aDogMTZweDsKICAgIGJhY2tncm91bmQtc2l6ZTogMTJweCAxMnB4OwogICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsKfQoubWVzc2FnZS1yb3c6aG92ZXIgLnNlbGVjdC1tZXNzYWdlIGRpdiB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBd0FBQUFNQ0FRQUFBRDhmSlJzQUFBQUFtSkxSMFFBLzRlUHpMOEFBQUFKY0VoWmN3QUFDeE1BQUFzVEFRQ2FuQmdBQUFBSGRFbE5SUWZlQ1IwTU96aFdLWlFPQUFBQVNVbEVRVlFZMDMyUHNSSEFJQXdEWDlCa2ljRCtXOFVNRXFlZ0FRSldLWi8rM3NMWkpoRkdRRVp6TmFJYTRpYmg2NkVuODY3Vk5hSWVvUDVXcHBOdUlHb0FsT20zZzVWQzFBZFllUXYxQlpQUlNnQUFBQUJKUlU1RXJrSmdnZz09KTsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTRJaUJvWldsbmFIUTlJamdpSUhacFpYZENiM2c5SWpBZ01DQTRJRGdpUGdvZ0lEeHdZWFJvSUdROUlrMHdJREIyTVdnNGRpMHhhQzA0ZW0wd0lESjJNV2cyZGkweGFDMDJlbTB3SURKMk1XZzRkaTB4YUMwNGVtMHdJREoyTVdnMmRpMHhhQzAyZWlJZ0x6NEtQQzl6ZG1jKyksIG5vbmU7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLXJhZGl1czogMnB4Owp9Ci5zZWxlY3QtbWVzc2FnZTpob3ZlciBkaXYgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQovKiBNZXNzYWdlIHRhYmxlcyAtIHRoZXNlIE1VU1QgTk9UIGJlIGNvbWJpbmVkIHRvZ2V0aGVyIGJlY2F1c2Ugb3RoZXJ3aXNlCiAgIGR5bmFtaWNhbGx5IGFsdGVyaW5nIHRoZW0gYmFzZWQgb24gdmlzaWJsZSBsb2cgbGV2ZWwgaXMgbm90IHBvc3NpYmxlLiAqLwoudHJhY2UtbWVzc2FnZSB7CiAgICBkaXNwbGF5OiB0YWJsZTsKfQouZGVidWctbWVzc2FnZSB7CiAgICBkaXNwbGF5OiB0YWJsZTsKfQovKiBNZXRhZGF0YSAqLwoubWV0YWRhdGEgewogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXItc3BhY2luZzogMC4yZW07Cn0KLm1ldGFkYXRhIHRoIHsKICAgIHdpZHRoOiAxMmVtOwogICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KLm1ldGFkYXRhIHRkIHsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cn0KLmtleXdvcmQtbWV0YWRhdGEgewogICAgZm9udC1zaXplOiAwLjllbTsKfQovKiBDdXN0b20gc3R5bGVzIGZvciBzdGF0aXN0aWNzICovCiN0b3RhbC1zdGF0cyB0cjpob3ZlciwgI3RhZy1zdGF0cyB0cjpob3ZlciB7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJwcmludCIgdHlwZT0idGV4dC9jc3MiPgpib2R5IHsKICAgIGJhY2tncm91bmQ6IHdoaXRlICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nOiAwOwogICAgZm9udC1zaXplOiA4cHQ7Cn0KYTpsaW5rLCBhOnZpc2l0ZWQgewogICAgY29sb3I6IGJsYWNrOwp9CiNoZWFkZXIgewogICAgd2lkdGg6IGF1dG87Cn0KLmRldGFpbHMsIC5zdGF0aXN0aWNzIHsKICAgIHdpZHRoOiAxMDAlOwp9CiNnZW5lcmF0ZWQtYWdvLCAjdG9wLXJpZ2h0LWhlYWRlciwgI25vcm1hbC1zZWxlY3RvciwgI3NlYXJjaC1idXR0b25zLAouZm9sZGluZy1idXR0b24sIC5leHBhbmQsIC5oaWRkZW4sIC5kZXRhaWxzLWNvbC10b2dnbGUgewogICAgZGlzcGxheTogbm9uZTsKfQouZWxlbWVudC1oZWFkZXItdGV4dCwgLmNoaWxkcmVuIHsKICAgIG1hcmdpbjogMDsKfQojdGVzdC1kZXRhaWxzIHsKICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQojdGVzdC1kZXRhaWxzIHRoLCAjdGVzdC1kZXRhaWxzIHRkIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0KLmRldGFpbHMtY29sLWhlYWRlciB7CiAgICBwYWRkaW5nOiAwOwp9CiNwcmludC1zZWxlY3RvciB7CiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOwp9Ci50YWJsZXNvcnRlci1oZWFkZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgIGJhY2tncm91bmQ6ICNkZGQgIWltcG9ydGFudDsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgojamF2YXNjcmlwdC1kaXNhYmxlZCB7CiAgICB3aWR0aDogNjAwcHg7CiAgICBtYXJnaW46IDEwMHB4IGF1dG8gMCBhdXRvOwogICAgcGFkZGluZzogMjBweDsKICAgIGNvbG9yOiBibGFjazsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9CiNqYXZhc2NyaXB0LWRpc2FibGVkIGgxIHsKICAgIHdpZHRoOiAxMDAlOwogICAgZmxvYXQ6IG5vbmU7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgdWwgewogICAgZm9udC1zaXplOiAxLjJlbTsKfQojamF2YXNjcmlwdC1kaXNhYmxlZCBsaSB7CiAgICBtYXJnaW46IDAuNWVtIDA7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgYiB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIj4KLmRvYyA+ICogewogICAgbWFyZ2luOiAwLjdlbSAxZW0gMC4xZW0gMWVtOwogICAgcGFkZGluZzogMDsKfQouZG9jID4gcCwgLmRvYyA+IGgxLCAuZG9jID4gaDIsIC5kb2MgPiBoMywgLmRvYyA+IGg0IHsKICAgIG1hcmdpbjogMC43ZW0gMCAwLjFlbSAwOwp9Ci5kb2MgPiAqOmZpcnN0LWNoaWxkIHsKICAgIG1hcmdpbi10b3A6IDAuMWVtOwp9Ci5kb2MgdGFibGUgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGVtcHR5LWNlbGxzOiBzaG93OwogICAgZm9udC1zaXplOiAwLjllbTsKfQouZG9jIHRhYmxlIHRoLCAuZG9jIHRhYmxlIHRkIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIHBhZGRpbmc6IDAuMWVtIDAuM2VtOwogICAgaGVpZ2h0OiAxLjJlbTsKfQouZG9jIHRhYmxlIHRoIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGxldHRlci1zcGFjaW5nOiAwLjFlbTsKfQouZG9jIHByZSB7CiAgICBmb250LXNpemU6IDEuMWVtOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgIGJhY2tncm91bmQ6ICNmNGY0ZjQ7Cn0KLmRvYyBjb2RlIHsKICAgIHBhZGRpbmc6IDAgMC4yZW07CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogICAgYmFja2dyb3VuZDogI2VlZTsKfQouZG9jIGxpIHsKICAgIGxpc3Qtc3R5bGUtcG9zaXRpb246IGluc2lkZTsKICAgIGxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOwp9Ci5kb2MgaW1nIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0KLmRvYyBociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KPC9zdHlsZT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp2YXIgTEVWRUxTID0ge1RSQUNFOiAwLCBERUJVRzogMSwgSU5GTzogMiwgV0FSTjogMywgRkFJTDogNCwgTk9ORTogNX07CmZ1bmN0aW9uIHRvZ2dsZVN1aXRlKHN1aXRlSWQpIHsKICAgIHRvZ2dsZUVsZW1lbnQoc3VpdGVJZCwgWydrZXl3b3JkJywgJ3N1aXRlJywgJ3Rlc3QnXSk7Cn0KZnVuY3Rpb24gdG9nZ2xlVGVzdCh0ZXN0SWQpIHsKICAgIHRvZ2dsZUVsZW1lbnQodGVzdElkLCBbJ2tleXdvcmQnXSk7Cn0KZnVuY3Rpb24gdG9nZ2xlS2V5d29yZChrd0lkKSB7CiAgICB0b2dnbGVFbGVtZW50KGt3SWQsIFsna2V5d29yZCddKTsKfQpmdW5jdGlvbiB0b2dnbGVFbGVtZW50KGVsZW1lbnRJZCwgY2hpbGRyZW5OYW1lcykgewogICAgdmFyIGVsZW1lbnQgPSAkKCcjJyArIGVsZW1lbnRJZCk7CiAgICB2YXIgY2hpbGRyZW4gPSBlbGVtZW50LmNoaWxkcmVuKCcuY2hpbGRyZW4nKTsKICAgIGNoaWxkcmVuLnRvZ2dsZSgxMDAsICcnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgZWxlbWVudC5jaGlsZHJlbignLmVsZW1lbnQtaGVhZGVyJykudG9nZ2xlQ2xhc3MoJ2Nsb3NlZCcpOwogICAgfSk7CiAgICBwb3B1bGF0ZUNoaWxkcmVuKGVsZW1lbnRJZCwgY2hpbGRyZW4sIGNoaWxkcmVuTmFtZXMpOwp9CmZ1bmN0aW9uIHBvcHVsYXRlQ2hpbGRyZW4oZWxlbWVudElkLCBjaGlsZEVsZW1lbnQsIGNoaWxkcmVuTmFtZXMpIHsKICAgIGlmICghY2hpbGRFbGVtZW50Lmhhc0NsYXNzKCdwb3B1bGF0ZWQnKSkgewogICAgICAgIHZhciBlbGVtZW50ID0gd2luZG93LnRlc3RkYXRhLmZpbmRMb2FkZWQoZWxlbWVudElkKTsKICAgICAgICB2YXIgY2FsbGJhY2sgPSBkcmF3Q2FsbGJhY2soZWxlbWVudCwgY2hpbGRFbGVtZW50LCBjaGlsZHJlbk5hbWVzKTsKICAgICAgICBlbGVtZW50LmNhbGxXaGVuQ2hpbGRyZW5SZWFkeShjYWxsYmFjayk7CiAgICAgICAgY2hpbGRFbGVtZW50LmFkZENsYXNzKCdwb3B1bGF0ZWQnKTsKICAgIH0KfQpmdW5jdGlvbiBkcmF3Q2FsbGJhY2soZWxlbWVudCwgY2hpbGRFbGVtZW50LCBjaGlsZHJlbk5hbWVzKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgIHV0aWwubWFwKGNoaWxkcmVuTmFtZXMsIGZ1bmN0aW9uIChjaGlsZE5hbWUpIHsKICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gZWxlbWVudFtjaGlsZE5hbWUgKyAncyddKCk7CiAgICAgICAgICAgIHV0aWwubWFwKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHsKICAgICAgICAgICAgICAgICQudG1wbChjaGlsZC50ZW1wbGF0ZSwgY2hpbGQpLmFwcGVuZFRvKGNoaWxkRWxlbWVudCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfQp9CmZ1bmN0aW9uIGV4cGFuZFN1aXRlKHN1aXRlKSB7CiAgICBpZiAoc3VpdGUuc3RhdHVzID09ICJQQVNTIikKICAgICAgICBleHBhbmRFbGVtZW50KHN1aXRlKTsKICAgIGVsc2UKICAgICAgICBleHBhbmRGYWlsZWQoc3VpdGUpOwp9CmZ1bmN0aW9uIGV4cGFuZEVsZW1lbnQoaXRlbSwgcmV0cnlDb3VudCkgewogICAgcmV0cnlDb3VudCA9IHR5cGVvZiByZXRyeUNvdW50ICE9PSAndW5kZWZpbmVkJyA/IHJldHJ5Q291bnQgOiAzOwogICAgdmFyIGVsZW1lbnQgPSAkKCcjJyArIGl0ZW0uaWQpOwogICAgdmFyIGNoaWxkcmVuID0gZWxlbWVudC5jaGlsZHJlbignLmNoaWxkcmVuJyk7CiAgICAvLyAuY3NzIGlzIGZhc3RlciB0aGFuIC5zaG93IGFuZCAuc2hvdyB3LyBjYWxsYmFjayBpcyB0ZXJyaWJseSBzbG93CiAgICBjaGlsZHJlbi5jc3MoeydkaXNwbGF5JzogJ2Jsb2NrJ30pOwogICAgLy8gaW4gcmFyZSBjYXNlcyBvbiBsYXJnZSBsb2dzIGNvbmN1cnJlbnQgZXhwYW5kaW5nIGZhaWxzID0+IHJldHJ5CiAgICBpZiAoY2hpbGRyZW4uY3NzKCdkaXNwbGF5JykgIT0gJ2Jsb2NrJyAmJiByZXRyeUNvdW50ID4gMCkgewogICAgICAgIGNvbnNvbGUuZGVidWcoJ2V4cGFuZEVsZW1lbnQgJytpdGVtLmlkKycgZmFpbGVkISBwbGFubmluZyByZXRyeS4uLicpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGV4cGFuZEVsZW1lbnQoaXRlbSwgcmV0cnlDb3VudC0xKTsgfSwgMCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcG9wdWxhdGVDaGlsZHJlbihpdGVtLmlkLCBjaGlsZHJlbiwgaXRlbS5jaGlsZHJlbk5hbWVzKTsKICAgIGVsZW1lbnQuY2hpbGRyZW4oJy5lbGVtZW50LWhlYWRlcicpLnJlbW92ZUNsYXNzKCdjbG9zZWQnKTsKfQpmdW5jdGlvbiBleHBhbmRFbGVtZW50V2l0aElkKGVsZW1lbnRpZCkgewogICAgZXhwYW5kRWxlbWVudCh3aW5kb3cudGVzdGRhdGEuZmluZExvYWRlZChlbGVtZW50aWQpKTsKfQpmdW5jdGlvbiBleHBhbmRFbGVtZW50c1dpdGhJZHMoaWRzKSB7CiAgICB1dGlsLm1hcChpZHMsIGV4cGFuZEVsZW1lbnRXaXRoSWQpOwp9CmZ1bmN0aW9uIGxvYWRBbmRFeHBhbmRFbGVtZW50SWRzKGlkcykgewogICAgZm9yICh2YXIgaSBpbiBpZHMpIHsKICAgICAgICB3aW5kb3cudGVzdGRhdGEuZW5zdXJlTG9hZGVkKGlkc1tpXSwgZXhwYW5kRWxlbWVudHNXaXRoSWRzKTsKICAgIH0KfQpmdW5jdGlvbiBleHBhbmRGYWlsZWQoZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQuc3RhdHVzID09ICJGQUlMIikgewogICAgICAgIHdpbmRvdy5lbGVtZW50c1RvRXhwYW5kID0gW2VsZW1lbnRdOwogICAgICAgIHdpbmRvdy5leHBhbmREZWNpZGVyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgcmV0dXJuIGUuc3RhdHVzID09ICJGQUlMIjsKICAgICAgICB9OwogICAgICAgIGV4cGFuZFJlY3Vyc2l2ZWx5KCk7CiAgICB9Cn0KZnVuY3Rpb24gZXhwYW5kQWxsKGVsZW1lbnRJZCkgewogICAgd2luZG93LmVsZW1lbnRzVG9FeHBhbmQgPSBbd2luZG93LnRlc3RkYXRhLmZpbmRMb2FkZWQoZWxlbWVudElkKV07CiAgICB3aW5kb3cuZXhwYW5kRGVjaWRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07CiAgICBleHBhbmRSZWN1cnNpdmVseSgpOwp9CmZ1bmN0aW9uIGV4cGFuZFJlY3Vyc2l2ZWx5KCkgewogICAgaWYgKCF3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5sZW5ndGgpCiAgICAgICAgcmV0dXJuOwogICAgdmFyIGVsZW1lbnQgPSB3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5wb3AoKTsKICAgIGlmICghZWxlbWVudCB8fCBlbGVtZW50SGlkZGVuQnlVc2VyKGVsZW1lbnQuaWQpKSB7CiAgICAgICAgd2luZG93LmVsZW1lbnRzVG9FeHBhbmQgPSBbXTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBleHBhbmRFbGVtZW50KGVsZW1lbnQpOwogICAgZWxlbWVudC5jYWxsV2hlbkNoaWxkcmVuUmVhZHkoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGRyZW4oKTsKICAgICAgICBmb3IgKHZhciBpID0gY2hpbGRyZW4ubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgICAgICBpZiAoY2hpbGQudHlwZSAhPSAnbWVzc2FnZScgJiYgd2luZG93LmV4cGFuZERlY2lkZXIoY2hpbGQpKQogICAgICAgICAgICAgICAgd2luZG93LmVsZW1lbnRzVG9FeHBhbmQucHVzaChjaGlsZCk7CiAgICAgICAgfQogICAgICAgIGlmICh3aW5kb3cuZWxlbWVudHNUb0V4cGFuZC5sZW5ndGgpCiAgICAgICAgICAgIHNldFRpbWVvdXQoZXhwYW5kUmVjdXJzaXZlbHksIDApOwogICAgfSk7Cn0KZnVuY3Rpb24gZWxlbWVudEhpZGRlbkJ5VXNlcihpZCkgewogICAgdmFyIGVsZW1lbnQgPSAkKCcjJyArIGlkKTsKICAgIHJldHVybiAhZWxlbWVudC5pcygiOnZpc2libGUiKTsKfQpmdW5jdGlvbiBjb2xsYXBzZUFsbChpZCkgewogICAgdmFyIGVsZW1lbnQgPSAkKCcjJyArIGlkKTsKICAgIGVsZW1lbnQuZmluZCgnLmNoaWxkcmVuJykuY3NzKHsnZGlzcGxheSc6ICdub25lJ30pOwogICAgZWxlbWVudC5maW5kKCcuZWxlbWVudC1oZWFkZXInKS5hZGRDbGFzcygnY2xvc2VkJyk7Cn0KZnVuY3Rpb24gbG9nTGV2ZWxTZWxlY3RlZChsZXZlbCkgewogICAgdmFyIGFuY2hvcnMgPSBnZXRWaWV3QW5jaG9yRWxlbWVudHMoKTsKICAgIHNldE1lc3NhZ2VWaXNpYmlsaXR5KGxldmVsKTsKICAgIHNjcm9sbFRvU2hvcnRlc3RWaXNpYmxlQW5jaG9yRWxlbWVudChhbmNob3JzKTsKfQpmdW5jdGlvbiBnZXRWaWV3QW5jaG9yRWxlbWVudHMoKSB7CiAgICB2YXIgZWxlbTEgPSAkKGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoMTAwLCAwKSk7CiAgICB2YXIgZWxlbTIgPSAkKGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoMTAwLCAyMCkpOwogICAgcmV0dXJuIFtlbGVtMSwgZWxlbTJdOwp9CmZ1bmN0aW9uIHNjcm9sbFRvU2hvcnRlc3RWaXNpYmxlQW5jaG9yRWxlbWVudChhbmNob3JzKSB7CiAgICBhbmNob3JzID0gdXRpbC5tYXAoYW5jaG9ycywgY2xvc2VzdFZpc2libGVQYXJlbnQpOwogICAgdmFyIHNob3J0ZXN0ID0gYW5jaG9yc1swXTsKICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYW5jaG9ycy5sZW5ndGg7IGkrKykKICAgICAgICBpZiAoc2hvcnRlc3QuaGVpZ2h0KCkgPiBhbmNob3JzW2ldLmhlaWdodCgpKQogICAgICAgICAgICBzaG9ydGVzdCA9IGFuY2hvcnNbaV07CiAgICBzaG9ydGVzdC5nZXQoKVswXS5zY3JvbGxJbnRvVmlldyh0cnVlKTsKfQpmdW5jdGlvbiBzZXRNZXNzYWdlVmlzaWJpbGl0eShsZXZlbCkgewogICAgbGV2ZWwgPSBwYXJzZUludChsZXZlbCk7CiAgICBjaGFuZ2VDbGFzc0Rpc3BsYXkoIi50cmFjZS1tZXNzYWdlIiwgbGV2ZWwgPD0gTEVWRUxTLlRSQUNFKTsKICAgIGNoYW5nZUNsYXNzRGlzcGxheSgiLmRlYnVnLW1lc3NhZ2UiLCBsZXZlbCA8PSBMRVZFTFMuREVCVUcpOwogICAgY2hhbmdlQ2xhc3NEaXNwbGF5KCIuaW5mby1tZXNzYWdlIiwgbGV2ZWwgPD0gTEVWRUxTLklORk8pOwp9CmZ1bmN0aW9uIGNsb3Nlc3RWaXNpYmxlUGFyZW50KGVsZW0pIHsKICAgIHdoaWxlICghZWxlbS5pcygiOnZpc2libGUiKSkKICAgICAgICBlbGVtID0gZWxlbS5wYXJlbnQoKTsKICAgIHJldHVybiBlbGVtOwp9CmZ1bmN0aW9uIGNoYW5nZUNsYXNzRGlzcGxheShjbGF6eiwgdmlzaWJsZSkgewogICAgdmFyIHN0eWxlcyA9IGRvY3VtZW50LnN0eWxlU2hlZXRzOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgcnVsZXMgPSBnZXRSdWxlcyhzdHlsZXNbaV0pOwogICAgICAgIGlmIChydWxlcyA9PT0gbnVsbCkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBydWxlcy5sZW5ndGg7IGorKykKICAgICAgICAgICAgaWYgKHJ1bGVzW2pdLnNlbGVjdG9yVGV4dCA9PT0gY2xhenopCiAgICAgICAgICAgICAgICBydWxlc1tqXS5zdHlsZS5kaXNwbGF5ID0gdmlzaWJsZSA/ICJ0YWJsZSIgOiAibm9uZSI7CiAgICB9Cn0KZnVuY3Rpb24gZ2V0UnVsZXMoc3R5bGUpIHsKICAgIC8vIFdpdGggQ2hyb21lIGV4dGVybmFsIENTUyBmaWxlcyBzZWVtIHRvIGhhdmUgb25seSBudWxsIHJvbGVzIGFuZCB3aXRoCiAgICAvLyBGaXJlZm94IGFjY2Vzc2luZyBydWxlcyBjYW4gcmVzdWx0IHRvIHNlY3VyaXR5IGVycm9yLgogICAgLy8gTmVpdGhlciBvZiB0aGVzZSBhcmUgYSBwcm9ibGVtIG9uIHdpdGggZ2VuZXJhdGVkIGxvZ3MuCiAgICB0cnkgewogICAgICAgIHJldHVybiBzdHlsZS5jc3NSdWxlcyB8fCBzdHlsZS5ydWxlczsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQpmdW5jdGlvbiBzZWxlY3RNZXNzYWdlKHBhcmVudElkKSB7CiAgICB2YXIgZWxlbWVudCA9ICQoJyMnICsgcGFyZW50SWQpLmZpbmQoJy5tZXNzYWdlJykuZ2V0KDApOwogICAgc2VsZWN0VGV4dChlbGVtZW50KTsKfQpmdW5jdGlvbiBzZWxlY3RUZXh0KGVsZW1lbnQpIHsKICAgIC8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvOTg1MjcyCiAgICB2YXIgcmFuZ2UsIHNlbGVjdGlvbjsKICAgIGlmIChkb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSkgeyAgLy8gSUUgOAogICAgICAgIHJhbmdlID0gZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsKICAgICAgICByYW5nZS5tb3ZlVG9FbGVtZW50VGV4dChlbGVtZW50KTsKICAgICAgICByYW5nZS5zZWxlY3QoKTsKICAgIH0gZWxzZSBpZiAod2luZG93LmdldFNlbGVjdGlvbikgeyAgLy8gT3RoZXJzCiAgICAgICAgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwogICAgICAgIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7CiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpOwogICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7CiAgICB9Cn0KZnVuY3Rpb24gTG9nTGV2ZWxDb250cm9sbGVyKG1pbkxldmVsLCBkZWZhdWx0TGV2ZWwpIHsKICAgIG1pbkxldmVsID0gTEVWRUxTW21pbkxldmVsXTsKICAgIGRlZmF1bHRMZXZlbCA9IExFVkVMU1tkZWZhdWx0TGV2ZWxdOwogICAgZnVuY3Rpb24gc2hvd0xvZ0xldmVsU2VsZWN0b3IoKSB7CiAgICAgICAgcmV0dXJuIG1pbkxldmVsIDwgTEVWRUxTLklORk87CiAgICB9CiAgICBmdW5jdGlvbiBkZWZhdWx0TG9nTGV2ZWwoKSB7CiAgICAgICAgaWYgKG1pbkxldmVsID4gZGVmYXVsdExldmVsKQogICAgICAgICAgICByZXR1cm4gbWluTGV2ZWw7CiAgICAgICAgcmV0dXJuIGRlZmF1bHRMZXZlbDsKICAgIH0KICAgIGZ1bmN0aW9uIHNob3dUcmFjZSgpIHsKICAgICAgICByZXR1cm4gbWluTGV2ZWwgPT0gTEVWRUxTLlRSQUNFOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBzaG93TG9nTGV2ZWxTZWxlY3Rvcjogc2hvd0xvZ0xldmVsU2VsZWN0b3IsCiAgICAgICAgZGVmYXVsdExvZ0xldmVsOiBkZWZhdWx0TG9nTGV2ZWwsCiAgICAgICAgc2hvd1RyYWNlOiBzaG93VHJhY2UKICAgIH07Cn0KPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLyohIGpRdWVyeSB2My41LjEgfCAoYykgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovCiFmdW5jdGlvbihlLHQpeyJ1c2Ugc3RyaWN0Ijsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lLmRvY3VtZW50P3QoZSwhMCk6ZnVuY3Rpb24oZSl7aWYoIWUuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIHQoZSl9OnQoZSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKEMsZSl7InVzZSBzdHJpY3QiO3ZhciB0PVtdLHI9T2JqZWN0LmdldFByb3RvdHlwZU9mLHM9dC5zbGljZSxnPXQuZmxhdD9mdW5jdGlvbihlKXtyZXR1cm4gdC5mbGF0LmNhbGwoZSl9OmZ1bmN0aW9uKGUpe3JldHVybiB0LmNvbmNhdC5hcHBseShbXSxlKX0sdT10LnB1c2gsaT10LmluZGV4T2Ysbj17fSxvPW4udG9TdHJpbmcsdj1uLmhhc093blByb3BlcnR5LGE9di50b1N0cmluZyxsPWEuY2FsbChPYmplY3QpLHk9e30sbT1mdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmIm51bWJlciIhPXR5cGVvZiBlLm5vZGVUeXBlfSx4PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiZlPT09ZS53aW5kb3d9LEU9Qy5kb2N1bWVudCxjPXt0eXBlOiEwLHNyYzohMCxub25jZTohMCxub01vZHVsZTohMH07ZnVuY3Rpb24gYihlLHQsbil7dmFyIHIsaSxvPShuPW58fEUpLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2lmKG8udGV4dD1lLHQpZm9yKHIgaW4gYykoaT10W3JdfHx0LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUocikpJiZvLnNldEF0dHJpYnV0ZShyLGkpO24uaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfWZ1bmN0aW9uIHcoZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP25bby5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9dmFyIGY9IjMuNS4xIixTPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBTLmZuLmluaXQoZSx0KX07ZnVuY3Rpb24gcChlKXt2YXIgdD0hIWUmJiJsZW5ndGgiaW4gZSYmZS5sZW5ndGgsbj13KGUpO3JldHVybiFtKGUpJiYheChlKSYmKCJhcnJheSI9PT1ufHwwPT09dHx8Im51bWJlciI9PXR5cGVvZiB0JiYwPHQmJnQtMSBpbiBlKX1TLmZuPVMucHJvdG90eXBlPXtqcXVlcnk6Zixjb25zdHJ1Y3RvcjpTLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gcy5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/cy5jYWxsKHRoaXMpOmU8MD90aGlzW2UrdGhpcy5sZW5ndGhdOnRoaXNbZV19LHB1c2hTdGFjazpmdW5jdGlvbihlKXt2YXIgdD1TLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxlKTtyZXR1cm4gdC5wcmV2T2JqZWN0PXRoaXMsdH0sZWFjaDpmdW5jdGlvbihlKXtyZXR1cm4gUy5lYWNoKHRoaXMsZSl9LG1hcDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy5tYXAodGhpcyxmdW5jdGlvbihlLHQpe3JldHVybiBuLmNhbGwoZSx0LGUpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGV2ZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy5ncmVwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4odCsxKSUyfSkpfSxvZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy5ncmVwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCUyfSkpfSxlcTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxlbmd0aCxuPStlKyhlPDA/dDowKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soMDw9biYmbjx0P1t0aGlzW25dXTpbXSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IoKX0scHVzaDp1LHNvcnQ6dC5zb3J0LHNwbGljZTp0LnNwbGljZX0sUy5leHRlbmQ9Uy5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixpLG8sYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsbD0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGw9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fG0oYSl8fChhPXt9KSxzPT09dSYmKGE9dGhpcyxzLS0pO3M8dTtzKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW3NdKSlmb3IodCBpbiBlKXI9ZVt0XSwiX19wcm90b19fIiE9PXQmJmEhPT1yJiYobCYmciYmKFMuaXNQbGFpbk9iamVjdChyKXx8KGk9QXJyYXkuaXNBcnJheShyKSkpPyhuPWFbdF0sbz1pJiYhQXJyYXkuaXNBcnJheShuKT9bXTppfHxTLmlzUGxhaW5PYmplY3Qobik/bjp7fSxpPSExLGFbdF09Uy5leHRlbmQobCxvLHIpKTp2b2lkIDAhPT1yJiYoYVt0XT1yKSk7cmV0dXJuIGF9LFMuZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhmK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKGUpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuISghZXx8IltvYmplY3QgT2JqZWN0XSIhPT1vLmNhbGwoZSkpJiYoISh0PXIoZSkpfHwiZnVuY3Rpb24iPT10eXBlb2Yobj12LmNhbGwodCwiY29uc3RydWN0b3IiKSYmdC5jb25zdHJ1Y3RvcikmJmEuY2FsbChuKT09PWwpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oZSx0LG4pe2IoZSx7bm9uY2U6dCYmdC5ub25jZX0sbil9LGVhY2g6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTA7aWYocChlKSl7Zm9yKG49ZS5sZW5ndGg7cjxuO3IrKylpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWt9ZWxzZSBmb3IociBpbiBlKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlicmVhaztyZXR1cm4gZX0sbWFrZUFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8W107cmV0dXJuIG51bGwhPWUmJihwKE9iamVjdChlKSk/Uy5tZXJnZShuLCJzdHJpbmciPT10eXBlb2YgZT9bZV06ZSk6dS5jYWxsKG4sZSkpLG59LGluQXJyYXk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBudWxsPT10Py0xOmkuY2FsbCh0LGUsbil9LG1lcmdlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPSt0Lmxlbmd0aCxyPTAsaT1lLmxlbmd0aDtyPG47cisrKWVbaSsrXT10W3JdO3JldHVybiBlLmxlbmd0aD1pLGV9LGdyZXA6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1bXSxpPTAsbz1lLmxlbmd0aCxhPSFuO2k8bztpKyspIXQoZVtpXSxpKSE9PWEmJnIucHVzaChlW2ldKTtyZXR1cm4gcn0sbWFwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89MCxhPVtdO2lmKHAoZSkpZm9yKHI9ZS5sZW5ndGg7bzxyO28rKyludWxsIT0oaT10KGVbb10sbyxuKSkmJmEucHVzaChpKTtlbHNlIGZvcihvIGluIGUpbnVsbCE9KGk9dChlW29dLG8sbikpJiZhLnB1c2goaSk7cmV0dXJuIGcoYSl9LGd1aWQ6MSxzdXBwb3J0Onl9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoUy5mbltTeW1ib2wuaXRlcmF0b3JdPXRbU3ltYm9sLml0ZXJhdG9yXSksUy5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe25bIltvYmplY3QgIit0KyJdIl09dC50b0xvd2VyQ2FzZSgpfSk7dmFyIGQ9ZnVuY3Rpb24obil7dmFyIGUsZCxiLG8saSxoLGYsZyx3LHUsbCxULEMsYSxFLHYscyxjLHksUz0ic2l6emxlIisxKm5ldyBEYXRlLHA9bi5kb2N1bWVudCxrPTAscj0wLG09dWUoKSx4PXVlKCksQT11ZSgpLE49dWUoKSxEPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10JiYobD0hMCksMH0saj17fS5oYXNPd25Qcm9wZXJ0eSx0PVtdLHE9dC5wb3AsTD10LnB1c2gsSD10LnB1c2gsTz10LnNsaWNlLFA9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspaWYoZVtuXT09PXQpcmV0dXJuIG47cmV0dXJuLTF9LFI9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixNPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixJPSIoPzpcXFxcW1xcZGEtZkEtRl17MSw2fSIrTSsiP3xcXFxcW15cXHJcXG5cXGZdfFtcXHctXXxbXlwwLVxceDdmXSkrIixXPSJcXFsiK00rIiooIitJKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrSSsiKSl8KSIrTSsiKlxcXSIsRj0iOigiK0krIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK1crIikqKXwuKilcXCl8KSIsQj1uZXcgUmVnRXhwKE0rIisiLCJnIiksJD1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLF89bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSx6PW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksVT1uZXcgUmVnRXhwKE0rInw+IiksWD1uZXcgUmVnRXhwKEYpLFY9bmV3IFJlZ0V4cCgiXiIrSSsiJCIpLEc9e0lEOm5ldyBSZWdFeHAoIl4jKCIrSSsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitJKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitJKyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrVyksUFNFVURPOm5ldyBSZWdFeHAoIl4iK0YpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTSsiKig/OihbKy1dfCkiK00rIiooXFxkKyl8KSkiK00rIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK1IrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitNKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK00rIiooKD86LVxcZCk/XFxkKikiK00rIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFk9L0hUTUwkL2ksUT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLEo9L15oXGQkL2ksSz0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLGVlPS9bK35dLyx0ZT1uZXcgUmVnRXhwKCJcXFxcW1xcZGEtZkEtRl17MSw2fSIrTSsiP3xcXFxcKFteXFxyXFxuXFxmXSkiLCJnIiksbmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj0iMHgiK2Uuc2xpY2UoMSktNjU1MzY7cmV0dXJuIHR8fChuPDA/U3RyaW5nLmZyb21DaGFyQ29kZShuKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKG4+PjEwfDU1Mjk2LDEwMjMmbnw1NjMyMCkpfSxyZT0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxpZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PyJcMCI9PT1lPyJcdWZmZmQiOmUuc2xpY2UoMCwtMSkrIlxcIitlLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2V9LG9lPWZ1bmN0aW9uKCl7VCgpfSxhZT1iZShmdW5jdGlvbihlKXtyZXR1cm4hMD09PWUuZGlzYWJsZWQmJiJmaWVsZHNldCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7SC5hcHBseSh0PU8uY2FsbChwLmNoaWxkTm9kZXMpLHAuY2hpbGROb2RlcyksdFtwLmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlKXtIPXthcHBseTp0Lmxlbmd0aD9mdW5jdGlvbihlLHQpe0wuYXBwbHkoZSxPLmNhbGwodCkpfTpmdW5jdGlvbihlLHQpe3ZhciBuPWUubGVuZ3RoLHI9MDt3aGlsZShlW24rK109dFtyKytdKTtlLmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBzZSh0LGUsbixyKXt2YXIgaSxvLGEscyx1LGwsYyxmPWUmJmUub3duZXJEb2N1bWVudCxwPWU/ZS5ub2RlVHlwZTo5O2lmKG49bnx8W10sInN0cmluZyIhPXR5cGVvZiB0fHwhdHx8MSE9PXAmJjkhPT1wJiYxMSE9PXApcmV0dXJuIG47aWYoIXImJihUKGUpLGU9ZXx8QyxFKSl7aWYoMTEhPT1wJiYodT1aLmV4ZWModCkpKWlmKGk9dVsxXSl7aWYoOT09PXApe2lmKCEoYT1lLmdldEVsZW1lbnRCeUlkKGkpKSlyZXR1cm4gbjtpZihhLmlkPT09aSlyZXR1cm4gbi5wdXNoKGEpLG59ZWxzZSBpZihmJiYoYT1mLmdldEVsZW1lbnRCeUlkKGkpKSYmeShlLGEpJiZhLmlkPT09aSlyZXR1cm4gbi5wdXNoKGEpLG59ZWxzZXtpZih1WzJdKXJldHVybiBILmFwcGx5KG4sZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KSksbjtpZigoaT11WzNdKSYmZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkobixlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaSkpLG59aWYoZC5xc2EmJiFOW3QrIiAiXSYmKCF2fHwhdi50ZXN0KHQpKSYmKDEhPT1wfHwib2JqZWN0IiE9PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpe2lmKGM9dCxmPWUsMT09PXAmJihVLnRlc3QodCl8fHoudGVzdCh0KSkpeyhmPWVlLnRlc3QodCkmJnllKGUucGFyZW50Tm9kZSl8fGUpPT09ZSYmZC5zY29wZXx8KChzPWUuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXMucmVwbGFjZShyZSxpZSk6ZS5zZXRBdHRyaWJ1dGUoImlkIixzPVMpKSxvPShsPWgodCkpLmxlbmd0aDt3aGlsZShvLS0pbFtvXT0ocz8iIyIrczoiOnNjb3BlIikrIiAiK3hlKGxbb10pO2M9bC5qb2luKCIsIil9dHJ5e3JldHVybiBILmFwcGx5KG4sZi5xdWVyeVNlbGVjdG9yQWxsKGMpKSxufWNhdGNoKGUpe04odCwhMCl9ZmluYWxseXtzPT09UyYmZS5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gZyh0LnJlcGxhY2UoJCwiJDEiKSxlLG4scil9ZnVuY3Rpb24gdWUoKXt2YXIgcj1bXTtyZXR1cm4gZnVuY3Rpb24gZSh0LG4pe3JldHVybiByLnB1c2godCsiICIpPmIuY2FjaGVMZW5ndGgmJmRlbGV0ZSBlW3Iuc2hpZnQoKV0sZVt0KyIgIl09bn19ZnVuY3Rpb24gbGUoZSl7cmV0dXJuIGVbU109ITAsZX1mdW5jdGlvbiBjZShlKXt2YXIgdD1DLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dHJ5e3JldHVybiEhZSh0KX1jYXRjaChlKXtyZXR1cm4hMX1maW5hbGx5e3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHQ9bnVsbH19ZnVuY3Rpb24gZmUoZSx0KXt2YXIgbj1lLnNwbGl0KCJ8Iikscj1uLmxlbmd0aDt3aGlsZShyLS0pYi5hdHRySGFuZGxlW25bcl1dPXR9ZnVuY3Rpb24gcGUoZSx0KXt2YXIgbj10JiZlLHI9biYmMT09PWUubm9kZVR5cGUmJjE9PT10Lm5vZGVUeXBlJiZlLnNvdXJjZUluZGV4LXQuc291cmNlSW5kZXg7aWYocilyZXR1cm4gcjtpZihuKXdoaWxlKG49bi5uZXh0U2libGluZylpZihuPT09dClyZXR1cm4tMTtyZXR1cm4gZT8xOi0xfWZ1bmN0aW9uIGRlKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBoZShuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09dHx8ImJ1dHRvbiI9PT10KSYmZS50eXBlPT09bn19ZnVuY3Rpb24gZ2UodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJmb3JtImluIGU/ZS5wYXJlbnROb2RlJiYhMT09PWUuZGlzYWJsZWQ/ImxhYmVsImluIGU/ImxhYmVsImluIGUucGFyZW50Tm9kZT9lLnBhcmVudE5vZGUuZGlzYWJsZWQ9PT10OmUuZGlzYWJsZWQ9PT10OmUuaXNEaXNhYmxlZD09PXR8fGUuaXNEaXNhYmxlZCE9PSF0JiZhZShlKT09PXQ6ZS5kaXNhYmxlZD09PXQ6ImxhYmVsImluIGUmJmUuZGlzYWJsZWQ9PT10fX1mdW5jdGlvbiB2ZShhKXtyZXR1cm4gbGUoZnVuY3Rpb24obyl7cmV0dXJuIG89K28sbGUoZnVuY3Rpb24oZSx0KXt2YXIgbixyPWEoW10sZS5sZW5ndGgsbyksaT1yLmxlbmd0aDt3aGlsZShpLS0pZVtuPXJbaV1dJiYoZVtuXT0hKHRbbl09ZVtuXSkpfSl9KX1mdW5jdGlvbiB5ZShlKXtyZXR1cm4gZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZlfWZvcihlIGluIGQ9c2Uuc3VwcG9ydD17fSxpPXNlLmlzWE1MPWZ1bmN0aW9uKGUpe3ZhciB0PWUubmFtZXNwYWNlVVJJLG49KGUub3duZXJEb2N1bWVudHx8ZSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiFZLnRlc3QodHx8biYmbi5ub2RlTmFtZXx8IkhUTUwiKX0sVD1zZS5zZXREb2N1bWVudD1mdW5jdGlvbihlKXt2YXIgdCxuLHI9ZT9lLm93bmVyRG9jdW1lbnR8fGU6cDtyZXR1cm4gciE9QyYmOT09PXIubm9kZVR5cGUmJnIuZG9jdW1lbnRFbGVtZW50JiYoYT0oQz1yKS5kb2N1bWVudEVsZW1lbnQsRT0haShDKSxwIT1DJiYobj1DLmRlZmF1bHRWaWV3KSYmbi50b3AhPT1uJiYobi5hZGRFdmVudExpc3RlbmVyP24uYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixvZSwhMSk6bi5hdHRhY2hFdmVudCYmbi5hdHRhY2hFdmVudCgib251bmxvYWQiLG9lKSksZC5zY29wZT1jZShmdW5jdGlvbihlKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZChDLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSwidW5kZWZpbmVkIiE9dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbCYmIWUucXVlcnlTZWxlY3RvckFsbCgiOnNjb3BlIGZpZWxkc2V0IGRpdiIpLmxlbmd0aH0pLGQuYXR0cmlidXRlcz1jZShmdW5jdGlvbihlKXtyZXR1cm4gZS5jbGFzc05hbWU9ImkiLCFlLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSxkLmdldEVsZW1lbnRzQnlUYWdOYW1lPWNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGVuZENoaWxkKEMuY3JlYXRlQ29tbWVudCgiIikpLCFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksZC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPUsudGVzdChDLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLGQuZ2V0QnlJZD1jZShmdW5jdGlvbihlKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChlKS5pZD1TLCFDLmdldEVsZW1lbnRzQnlOYW1lfHwhQy5nZXRFbGVtZW50c0J5TmFtZShTKS5sZW5ndGh9KSxkLmdldEJ5SWQ/KGIuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSh0ZSxuZSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiaWQiKT09PXR9fSxiLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJkUpe3ZhciBuPXQuZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIG4/W25dOltdfX0pOihiLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgbj1lLnJlcGxhY2UodGUsbmUpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD0idW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiB0JiZ0LnZhbHVlPT09bn19LGIuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmRSl7dmFyIG4scixpLG89dC5nZXRFbGVtZW50QnlJZChlKTtpZihvKXtpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb107aT10LmdldEVsZW1lbnRzQnlOYW1lKGUpLHI9MDt3aGlsZShvPWlbcisrXSlpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb119cmV0dXJuW119fSksYi5maW5kLlRBRz1kLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGUsdCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6ZC5xc2E/dC5xdWVyeVNlbGVjdG9yQWxsKGUpOnZvaWQgMH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sYi5maW5kLkNMQVNTPWQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmRSlyZXR1cm4gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpfSxzPVtdLHY9W10sKGQucXNhPUsudGVzdChDLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKGNlKGZ1bmN0aW9uKGUpe3ZhciB0O2EuYXBwZW5kQ2hpbGQoZSkuaW5uZXJIVE1MPSI8YSBpZD0nIitTKyInPjwvYT48c2VsZWN0IGlkPSciK1MrIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmdi5wdXNoKCJbKl4kXT0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8di5wdXNoKCJcXFsiK00rIiooPzp2YWx1ZXwiK1IrIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitTKyItXSIpLmxlbmd0aHx8di5wdXNoKCJ+PSIpLCh0PUMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJuYW1lIiwiIiksZS5hcHBlbmRDaGlsZCh0KSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPScnXSIpLmxlbmd0aHx8di5wdXNoKCJcXFsiK00rIipuYW1lIitNKyIqPSIrTSsiKig/OicnfFwiXCIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8di5wdXNoKCI6Y2hlY2tlZCIpLGUucXVlcnlTZWxlY3RvckFsbCgiYSMiK1MrIisqIikubGVuZ3RofHx2LnB1c2goIi4jLitbK35dIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJcXFxmIiksdi5wdXNoKCJbXFxyXFxuXFxmXSIpfSksY2UoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PiI7dmFyIHQ9Qy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3Quc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksZS5hcHBlbmRDaGlsZCh0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmdi5wdXNoKCJuYW1lIitNKyIqWypeJHwhfl0/PSIpLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZD0hMCwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJnYucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSx2LnB1c2goIiwuKjoiKX0pKSwoZC5tYXRjaGVzU2VsZWN0b3I9Sy50ZXN0KGM9YS5tYXRjaGVzfHxhLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEub01hdGNoZXNTZWxlY3Rvcnx8YS5tc01hdGNoZXNTZWxlY3RvcikpJiZjZShmdW5jdGlvbihlKXtkLmRpc2Nvbm5lY3RlZE1hdGNoPWMuY2FsbChlLCIqIiksYy5jYWxsKGUsIltzIT0nJ106eCIpLHMucHVzaCgiIT0iLEYpfSksdj12Lmxlbmd0aCYmbmV3IFJlZ0V4cCh2LmpvaW4oInwiKSkscz1zLmxlbmd0aCYmbmV3IFJlZ0V4cChzLmpvaW4oInwiKSksdD1LLnRlc3QoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikseT10fHxLLnRlc3QoYS5jb250YWlucyk/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KXdoaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxEPXQ/ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gbD0hMCwwO3ZhciBuPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBufHwoMSYobj0oZS5vd25lckRvY3VtZW50fHxlKT09KHQub3duZXJEb2N1bWVudHx8dCk/ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KToxKXx8IWQuc29ydERldGFjaGVkJiZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpPT09bj9lPT1DfHxlLm93bmVyRG9jdW1lbnQ9PXAmJnkocCxlKT8tMTp0PT1DfHx0Lm93bmVyRG9jdW1lbnQ9PXAmJnkocCx0KT8xOnU/UCh1LGUpLVAodSx0KTowOjQmbj8tMToxKX06ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gbD0hMCwwO3ZhciBuLHI9MCxpPWUucGFyZW50Tm9kZSxvPXQucGFyZW50Tm9kZSxhPVtlXSxzPVt0XTtpZighaXx8IW8pcmV0dXJuIGU9PUM/LTE6dD09Qz8xOmk/LTE6bz8xOnU/UCh1LGUpLVAodSx0KTowO2lmKGk9PT1vKXJldHVybiBwZShlLHQpO249ZTt3aGlsZShuPW4ucGFyZW50Tm9kZSlhLnVuc2hpZnQobik7bj10O3doaWxlKG49bi5wYXJlbnROb2RlKXMudW5zaGlmdChuKTt3aGlsZShhW3JdPT09c1tyXSlyKys7cmV0dXJuIHI/cGUoYVtyXSxzW3JdKTphW3JdPT1wPy0xOnNbcl09PXA/MTowfSksQ30sc2UubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBzZShlLG51bGwsbnVsbCx0KX0sc2UubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7aWYoVChlKSxkLm1hdGNoZXNTZWxlY3RvciYmRSYmIU5bdCsiICJdJiYoIXN8fCFzLnRlc3QodCkpJiYoIXZ8fCF2LnRlc3QodCkpKXRyeXt2YXIgbj1jLmNhbGwoZSx0KTtpZihufHxkLmRpc2Nvbm5lY3RlZE1hdGNofHxlLmRvY3VtZW50JiYxMSE9PWUuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIG59Y2F0Y2goZSl7Tih0LCEwKX1yZXR1cm4gMDxzZSh0LEMsbnVsbCxbZV0pLmxlbmd0aH0sc2UuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZS5vd25lckRvY3VtZW50fHxlKSE9QyYmVChlKSx5KGUsdCl9LHNlLmF0dHI9ZnVuY3Rpb24oZSx0KXsoZS5vd25lckRvY3VtZW50fHxlKSE9QyYmVChlKTt2YXIgbj1iLmF0dHJIYW5kbGVbdC50b0xvd2VyQ2FzZSgpXSxyPW4mJmouY2FsbChiLmF0dHJIYW5kbGUsdC50b0xvd2VyQ2FzZSgpKT9uKGUsdCwhRSk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1yP3I6ZC5hdHRyaWJ1dGVzfHwhRT9lLmdldEF0dHJpYnV0ZSh0KToocj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9LHNlLmVzY2FwZT1mdW5jdGlvbihlKXtyZXR1cm4oZSsiIikucmVwbGFjZShyZSxpZSl9LHNlLmVycm9yPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitlKX0sc2UudW5pcXVlU29ydD1mdW5jdGlvbihlKXt2YXIgdCxuPVtdLHI9MCxpPTA7aWYobD0hZC5kZXRlY3REdXBsaWNhdGVzLHU9IWQuc29ydFN0YWJsZSYmZS5zbGljZSgwKSxlLnNvcnQoRCksbCl7d2hpbGUodD1lW2krK10pdD09PWVbaV0mJihyPW4ucHVzaChpKSk7d2hpbGUoci0tKWUuc3BsaWNlKG5bcl0sMSl9cmV0dXJuIHU9bnVsbCxlfSxvPXNlLmdldFRleHQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj0iIixyPTAsaT1lLm5vZGVUeXBlO2lmKGkpe2lmKDE9PT1pfHw5PT09aXx8MTE9PT1pKXtpZigic3RyaW5nIj09dHlwZW9mIGUudGV4dENvbnRlbnQpcmV0dXJuIGUudGV4dENvbnRlbnQ7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKW4rPW8oZSl9ZWxzZSBpZigzPT09aXx8ND09PWkpcmV0dXJuIGUubm9kZVZhbHVlfWVsc2Ugd2hpbGUodD1lW3IrK10pbis9byh0KTtyZXR1cm4gbn0sKGI9c2Uuc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86bGUsbWF0Y2g6RyxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKHRlLG5lKSxlWzNdPShlWzNdfHxlWzRdfHxlWzVdfHwiIikucmVwbGFjZSh0ZSxuZSksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fHNlLmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKCJldmVuIj09PWVbM118fCJvZGQiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fCJvZGQiPT09ZVszXSkpOmVbM10mJnNlLmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuPSFlWzZdJiZlWzJdO3JldHVybiBHLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXT9lWzJdPWVbNF18fGVbNV18fCIiOm4mJlgudGVzdChuKSYmKHQ9aChuLCEwKSkmJih0PW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtdCktbi5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1uLnNsaWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UodGUsbmUpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09ZT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dH19LENMQVNTOmZ1bmN0aW9uKGUpe3ZhciB0PW1bZSsiICJdO3JldHVybiB0fHwodD1uZXcgUmVnRXhwKCIoXnwiK00rIikiK2UrIigiK00rInwkKSIpKSYmbShlLGZ1bmN0aW9uKGUpe3JldHVybiB0LnRlc3QoInN0cmluZyI9PXR5cGVvZiBlLmNsYXNzTmFtZSYmZS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihuLHIsaSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXNlLmF0dHIoZSxuKTtyZXR1cm4gbnVsbD09dD8iIT0iPT09cjohcnx8KHQrPSIiLCI9Ij09PXI/dD09PWk6IiE9Ij09PXI/dCE9PWk6Il49Ij09PXI/aSYmMD09PXQuaW5kZXhPZihpKToiKj0iPT09cj9pJiYtMTx0LmluZGV4T2YoaSk6IiQ9Ij09PXI/aSYmdC5zbGljZSgtaS5sZW5ndGgpPT09aToifj0iPT09cj8tMTwoIiAiK3QucmVwbGFjZShCLCIgIikrIiAiKS5pbmRleE9mKGkpOiJ8PSI9PT1yJiYodD09PWl8fHQuc2xpY2UoMCxpLmxlbmd0aCsxKT09PWkrIi0iKSl9fSxDSElMRDpmdW5jdGlvbihoLGUsdCxnLHYpe3ZhciB5PSJudGgiIT09aC5zbGljZSgwLDMpLG09Imxhc3QiIT09aC5zbGljZSgtNCkseD0ib2YtdHlwZSI9PT1lO3JldHVybiAxPT09ZyYmMD09PXY/ZnVuY3Rpb24oZSl7cmV0dXJuISFlLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbD15IT09bT8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLGM9ZS5wYXJlbnROb2RlLGY9eCYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHA9IW4mJiF4LGQ9ITE7aWYoYyl7aWYoeSl7d2hpbGUobCl7YT1lO3doaWxlKGE9YVtsXSlpZih4P2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWY6MT09PWEubm9kZVR5cGUpcmV0dXJuITE7dT1sPSJvbmx5Ij09PWgmJiF1JiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKHU9W20/Yy5maXJzdENoaWxkOmMubGFzdENoaWxkXSxtJiZwKXtkPShzPShyPShpPShvPShhPWMpW1NdfHwoYVtTXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdfHxbXSlbMF09PT1rJiZyWzFdKSYmclsyXSxhPXMmJmMuY2hpbGROb2Rlc1tzXTt3aGlsZShhPSsrcyYmYSYmYVtsXXx8KGQ9cz0wKXx8dS5wb3AoKSlpZigxPT09YS5ub2RlVHlwZSYmKytkJiZhPT09ZSl7aVtoXT1bayxzLGRdO2JyZWFrfX1lbHNlIGlmKHAmJihkPXM9KHI9KGk9KG89KGE9ZSlbU118fChhW1NdPXt9KSlbYS51bmlxdWVJRF18fChvW2EudW5pcXVlSURdPXt9KSlbaF18fFtdKVswXT09PWsmJnJbMV0pLCExPT09ZCl3aGlsZShhPSsrcyYmYSYmYVtsXXx8KGQ9cz0wKXx8dS5wb3AoKSlpZigoeD9hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1mOjE9PT1hLm5vZGVUeXBlKSYmKytkJiYocCYmKChpPShvPWFbU118fChhW1NdPXt9KSlbYS51bmlxdWVJRF18fChvW2EudW5pcXVlSURdPXt9KSlbaF09W2ssZF0pLGE9PT1lKSlicmVhaztyZXR1cm4oZC09dik9PT1nfHxkJWc9PTAmJjA8PWQvZ319fSxQU0VVRE86ZnVuY3Rpb24oZSxvKXt2YXIgdCxhPWIucHNldWRvc1tlXXx8Yi5zZXRGaWx0ZXJzW2UudG9Mb3dlckNhc2UoKV18fHNlLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrZSk7cmV0dXJuIGFbU10/YShvKToxPGEubGVuZ3RoPyh0PVtlLGUsIiIsb10sYi5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/bGUoZnVuY3Rpb24oZSx0KXt2YXIgbixyPWEoZSxvKSxpPXIubGVuZ3RoO3doaWxlKGktLSllW249UChlLHJbaV0pXT0hKHRbbl09cltpXSl9KTpmdW5jdGlvbihlKXtyZXR1cm4gYShlLDAsdCl9KTphfX0scHNldWRvczp7bm90OmxlKGZ1bmN0aW9uKGUpe3ZhciByPVtdLGk9W10scz1mKGUucmVwbGFjZSgkLCIkMSIpKTtyZXR1cm4gc1tTXT9sZShmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPXMoZSxudWxsLHIsW10pLGE9ZS5sZW5ndGg7d2hpbGUoYS0tKShpPW9bYV0pJiYoZVthXT0hKHRbYV09aSkpfSk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByWzBdPWUscyhyLG51bGwsbixpKSxyWzBdPW51bGwsIWkucG9wKCl9fSksaGFzOmxlKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gMDxzZSh0LGUpLmxlbmd0aH19KSxjb250YWluczpsZShmdW5jdGlvbih0KXtyZXR1cm4gdD10LnJlcGxhY2UodGUsbmUpLGZ1bmN0aW9uKGUpe3JldHVybi0xPChlLnRleHRDb250ZW50fHxvKGUpKS5pbmRleE9mKHQpfX0pLGxhbmc6bGUoZnVuY3Rpb24obil7cmV0dXJuIFYudGVzdChufHwiIil8fHNlLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK24pLG49bi5yZXBsYWNlKHRlLG5lKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGUpe3ZhciB0O2Rve2lmKHQ9RT9lLmxhbmc6ZS5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGUuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuKHQ9dC50b0xvd2VyQ2FzZSgpKT09PW58fDA9PT10LmluZGV4T2YobisiLSIpfXdoaWxlKChlPWUucGFyZW50Tm9kZSkmJjE9PT1lLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9bi5sb2NhdGlvbiYmbi5sb2NhdGlvbi5oYXNoO3JldHVybiB0JiZ0LnNsaWNlKDEpPT09ZS5pZH0scm9vdDpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWF9LGZvY3VzOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09Qy5hY3RpdmVFbGVtZW50JiYoIUMuaGFzRm9jdXN8fEMuaGFzRm9jdXMoKSkmJiEhKGUudHlwZXx8ZS5ocmVmfHx+ZS50YWJJbmRleCl9LGVuYWJsZWQ6Z2UoITEpLGRpc2FibGVkOmdlKCEwKSxjaGVja2VkOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmISFlLmNoZWNrZWR8fCJvcHRpb24iPT09dCYmISFlLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCwhMD09PWUuc2VsZWN0ZWR9LGVtcHR5OmZ1bmN0aW9uKGUpe2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZylpZihlLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihlKXtyZXR1cm4hYi5wc2V1ZG9zLmVtcHR5KGUpfSxoZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIEoudGVzdChlLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIFEudGVzdChlLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmImJ1dHRvbiI9PT1lLnR5cGV8fCJidXR0b24iPT09dH0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1lLnR5cGUmJihudWxsPT0odD1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09dC50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6dmUoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OnZlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuW3QtMV19KSxlcTp2ZShmdW5jdGlvbihlLHQsbil7cmV0dXJuW248MD9uK3Q6bl19KSxldmVuOnZlKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjx0O24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksb2RkOnZlKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTE7bjx0O24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksbHQ6dmUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0OnQ8bj90Om47MDw9LS1yOyllLnB1c2gocik7cmV0dXJuIGV9KSxndDp2ZShmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9uK3Q6bjsrK3I8dDspZS5wdXNoKHIpO3JldHVybiBlfSl9fSkucHNldWRvcy5udGg9Yi5wc2V1ZG9zLmVxLHtyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSliLnBzZXVkb3NbZV09ZGUoZSk7Zm9yKGUgaW57c3VibWl0OiEwLHJlc2V0OiEwfSliLnBzZXVkb3NbZV09aGUoZSk7ZnVuY3Rpb24gbWUoKXt9ZnVuY3Rpb24geGUoZSl7Zm9yKHZhciB0PTAsbj1lLmxlbmd0aCxyPSIiO3Q8bjt0Kyspcis9ZVt0XS52YWx1ZTtyZXR1cm4gcn1mdW5jdGlvbiBiZShzLGUsdCl7dmFyIHU9ZS5kaXIsbD1lLm5leHQsYz1sfHx1LGY9dCYmInBhcmVudE5vZGUiPT09YyxwPXIrKztyZXR1cm4gZS5maXJzdD9mdW5jdGlvbihlLHQsbil7d2hpbGUoZT1lW3VdKWlmKDE9PT1lLm5vZGVUeXBlfHxmKXJldHVybiBzKGUsdCxuKTtyZXR1cm4hMX06ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPVtrLHBdO2lmKG4pe3doaWxlKGU9ZVt1XSlpZigoMT09PWUubm9kZVR5cGV8fGYpJiZzKGUsdCxuKSlyZXR1cm4hMH1lbHNlIHdoaWxlKGU9ZVt1XSlpZigxPT09ZS5ub2RlVHlwZXx8ZilpZihpPShvPWVbU118fChlW1NdPXt9KSlbZS51bmlxdWVJRF18fChvW2UudW5pcXVlSURdPXt9KSxsJiZsPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKWU9ZVt1XXx8ZTtlbHNle2lmKChyPWlbY10pJiZyWzBdPT09ayYmclsxXT09PXApcmV0dXJuIGFbMl09clsyXTtpZigoaVtjXT1hKVsyXT1zKGUsdCxuKSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gd2UoaSl7cmV0dXJuIDE8aS5sZW5ndGg/ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWkubGVuZ3RoO3doaWxlKHItLSlpZighaVtyXShlLHQsbikpcmV0dXJuITE7cmV0dXJuITB9OmlbMF19ZnVuY3Rpb24gVGUoZSx0LG4scixpKXtmb3IodmFyIG8sYT1bXSxzPTAsdT1lLmxlbmd0aCxsPW51bGwhPXQ7czx1O3MrKykobz1lW3NdKSYmKG4mJiFuKG8scixpKXx8KGEucHVzaChvKSxsJiZ0LnB1c2gocykpKTtyZXR1cm4gYX1mdW5jdGlvbiBDZShkLGgsZyx2LHksZSl7cmV0dXJuIHYmJiF2W1NdJiYodj1DZSh2KSkseSYmIXlbU10mJih5PUNlKHksZSkpLGxlKGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzPVtdLHU9W10sbD10Lmxlbmd0aCxjPWV8fGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspc2UoZSx0W3JdLG4pO3JldHVybiBufShofHwiKiIsbi5ub2RlVHlwZT9bbl06bixbXSksZj0hZHx8IWUmJmg/YzpUZShjLHMsZCxuLHIpLHA9Zz95fHwoZT9kOmx8fHYpP1tdOnQ6ZjtpZihnJiZnKGYscCxuLHIpLHYpe2k9VGUocCx1KSx2KGksW10sbixyKSxvPWkubGVuZ3RoO3doaWxlKG8tLSkoYT1pW29dKSYmKHBbdVtvXV09IShmW3Vbb11dPWEpKX1pZihlKXtpZih5fHxkKXtpZih5KXtpPVtdLG89cC5sZW5ndGg7d2hpbGUoby0tKShhPXBbb10pJiZpLnB1c2goZltvXT1hKTt5KG51bGwscD1bXSxpLHIpfW89cC5sZW5ndGg7d2hpbGUoby0tKShhPXBbb10pJiYtMTwoaT15P1AoZSxhKTpzW29dKSYmKGVbaV09ISh0W2ldPWEpKX19ZWxzZSBwPVRlKHA9PT10P3Auc3BsaWNlKGwscC5sZW5ndGgpOnApLHk/eShudWxsLHQscCxyKTpILmFwcGx5KHQscCl9KX1mdW5jdGlvbiBFZShlKXtmb3IodmFyIGksdCxuLHI9ZS5sZW5ndGgsbz1iLnJlbGF0aXZlW2VbMF0udHlwZV0sYT1vfHxiLnJlbGF0aXZlWyIgIl0scz1vPzE6MCx1PWJlKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09aX0sYSwhMCksbD1iZShmdW5jdGlvbihlKXtyZXR1cm4tMTxQKGksZSl9LGEsITApLGM9W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj0hbyYmKG58fHQhPT13KXx8KChpPXQpLm5vZGVUeXBlP3UoZSx0LG4pOmwoZSx0LG4pKTtyZXR1cm4gaT1udWxsLHJ9XTtzPHI7cysrKWlmKHQ9Yi5yZWxhdGl2ZVtlW3NdLnR5cGVdKWM9W2JlKHdlKGMpLHQpXTtlbHNle2lmKCh0PWIuZmlsdGVyW2Vbc10udHlwZV0uYXBwbHkobnVsbCxlW3NdLm1hdGNoZXMpKVtTXSl7Zm9yKG49KytzO248cjtuKyspaWYoYi5yZWxhdGl2ZVtlW25dLnR5cGVdKWJyZWFrO3JldHVybiBDZSgxPHMmJndlKGMpLDE8cyYmeGUoZS5zbGljZSgwLHMtMSkuY29uY2F0KHt2YWx1ZToiICI9PT1lW3MtMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZSgkLCIkMSIpLHQsczxuJiZFZShlLnNsaWNlKHMsbikpLG48ciYmRWUoZT1lLnNsaWNlKG4pKSxuPHImJnhlKGUpKX1jLnB1c2godCl9cmV0dXJuIHdlKGMpfXJldHVybiBtZS5wcm90b3R5cGU9Yi5maWx0ZXJzPWIucHNldWRvcyxiLnNldEZpbHRlcnM9bmV3IG1lLGg9c2UudG9rZW5pemU9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHMsdSxsPXhbZSsiICJdO2lmKGwpcmV0dXJuIHQ/MDpsLnNsaWNlKDApO2E9ZSxzPVtdLHU9Yi5wcmVGaWx0ZXI7d2hpbGUoYSl7Zm9yKG8gaW4gbiYmIShyPV8uZXhlYyhhKSl8fChyJiYoYT1hLnNsaWNlKHJbMF0ubGVuZ3RoKXx8YSkscy5wdXNoKGk9W10pKSxuPSExLChyPXouZXhlYyhhKSkmJihuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpyWzBdLnJlcGxhY2UoJCwiICIpfSksYT1hLnNsaWNlKG4ubGVuZ3RoKSksYi5maWx0ZXIpIShyPUdbb10uZXhlYyhhKSl8fHVbb10mJiEocj11W29dKHIpKXx8KG49ci5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOm8sbWF0Y2hlczpyfSksYT1hLnNsaWNlKG4ubGVuZ3RoKSk7aWYoIW4pYnJlYWt9cmV0dXJuIHQ/YS5sZW5ndGg6YT9zZS5lcnJvcihlKTp4KGUscykuc2xpY2UoMCl9LGY9c2UuY29tcGlsZT1mdW5jdGlvbihlLHQpe3ZhciBuLHYseSxtLHgscixpPVtdLG89W10sYT1BW2UrIiAiXTtpZighYSl7dHx8KHQ9aChlKSksbj10Lmxlbmd0aDt3aGlsZShuLS0pKGE9RWUodFtuXSkpW1NdP2kucHVzaChhKTpvLnB1c2goYSk7KGE9QShlLCh2PW8sbT0wPCh5PWkpLmxlbmd0aCx4PTA8di5sZW5ndGgscj1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyx1PTAsbD0iMCIsYz1lJiZbXSxmPVtdLHA9dyxkPWV8fHgmJmIuZmluZC5UQUcoIioiLGkpLGg9ays9bnVsbD09cD8xOk1hdGgucmFuZG9tKCl8fC4xLGc9ZC5sZW5ndGg7Zm9yKGkmJih3PXQ9PUN8fHR8fGkpO2whPT1nJiZudWxsIT0obz1kW2xdKTtsKyspe2lmKHgmJm8pe2E9MCx0fHxvLm93bmVyRG9jdW1lbnQ9PUN8fChUKG8pLG49IUUpO3doaWxlKHM9dlthKytdKWlmKHMobyx0fHxDLG4pKXtyLnB1c2gobyk7YnJlYWt9aSYmKGs9aCl9bSYmKChvPSFzJiZvKSYmdS0tLGUmJmMucHVzaChvKSl9aWYodSs9bCxtJiZsIT09dSl7YT0wO3doaWxlKHM9eVthKytdKXMoYyxmLHQsbik7aWYoZSl7aWYoMDx1KXdoaWxlKGwtLSljW2xdfHxmW2xdfHwoZltsXT1xLmNhbGwocikpO2Y9VGUoZil9SC5hcHBseShyLGYpLGkmJiFlJiYwPGYubGVuZ3RoJiYxPHUreS5sZW5ndGgmJnNlLnVuaXF1ZVNvcnQocil9cmV0dXJuIGkmJihrPWgsdz1wKSxjfSxtP2xlKHIpOnIpKSkuc2VsZWN0b3I9ZX1yZXR1cm4gYX0sZz1zZS5zZWxlY3Q9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLGM9IXImJmgoZT1sLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1jLmxlbmd0aCl7aWYoMjwobz1jWzBdPWNbMF0uc2xpY2UoMCkpLmxlbmd0aCYmIklEIj09PShhPW9bMF0pLnR5cGUmJjk9PT10Lm5vZGVUeXBlJiZFJiZiLnJlbGF0aXZlW29bMV0udHlwZV0pe2lmKCEodD0oYi5maW5kLklEKGEubWF0Y2hlc1swXS5yZXBsYWNlKHRlLG5lKSx0KXx8W10pWzBdKSlyZXR1cm4gbjtsJiYodD10LnBhcmVudE5vZGUpLGU9ZS5zbGljZShvLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPUcubmVlZHNDb250ZXh0LnRlc3QoZSk/MDpvLmxlbmd0aDt3aGlsZShpLS0pe2lmKGE9b1tpXSxiLnJlbGF0aXZlW3M9YS50eXBlXSlicmVhaztpZigodT1iLmZpbmRbc10pJiYocj11KGEubWF0Y2hlc1swXS5yZXBsYWNlKHRlLG5lKSxlZS50ZXN0KG9bMF0udHlwZSkmJnllKHQucGFyZW50Tm9kZSl8fHQpKSl7aWYoby5zcGxpY2UoaSwxKSwhKGU9ci5sZW5ndGgmJnhlKG8pKSlyZXR1cm4gSC5hcHBseShuLHIpLG47YnJlYWt9fX1yZXR1cm4obHx8ZihlLGMpKShyLHQsIUUsbiwhdHx8ZWUudGVzdChlKSYmeWUodC5wYXJlbnROb2RlKXx8dCksbn0sZC5zb3J0U3RhYmxlPVMuc3BsaXQoIiIpLnNvcnQoRCkuam9pbigiIik9PT1TLGQuZGV0ZWN0RHVwbGljYXRlcz0hIWwsVCgpLGQuc29ydERldGFjaGVkPWNlKGZ1bmN0aW9uKGUpe3JldHVybiAxJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oQy5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKX0pLGNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGZlKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihlLHQsbil7aWYoIW4pcmV0dXJuIGUuZ2V0QXR0cmlidXRlKHQsInR5cGUiPT09dC50b0xvd2VyQ2FzZSgpPzE6Mil9KSxkLmF0dHJpYnV0ZXMmJmNlKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGlucHV0Lz4iLGUuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGZlKCJ2YWx1ZSIsZnVuY3Rpb24oZSx0LG4pe2lmKCFuJiYiaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiBlLmRlZmF1bHRWYWx1ZX0pLGNlKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxmZShSLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZighbilyZXR1cm4hMD09PWVbdF0/dC50b0xvd2VyQ2FzZSgpOihyPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6bnVsbH0pLHNlfShDKTtTLmZpbmQ9ZCxTLmV4cHI9ZC5zZWxlY3RvcnMsUy5leHByWyI6Il09Uy5leHByLnBzZXVkb3MsUy51bmlxdWVTb3J0PVMudW5pcXVlPWQudW5pcXVlU29ydCxTLnRleHQ9ZC5nZXRUZXh0LFMuaXNYTUxEb2M9ZC5pc1hNTCxTLmNvbnRhaW5zPWQuY29udGFpbnMsUy5lc2NhcGVTZWxlY3Rvcj1kLmVzY2FwZTt2YXIgaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9W10saT12b2lkIDAhPT1uO3doaWxlKChlPWVbdF0pJiY5IT09ZS5ub2RlVHlwZSlpZigxPT09ZS5ub2RlVHlwZSl7aWYoaSYmUyhlKS5pcyhuKSlicmVhaztyLnB1c2goZSl9cmV0dXJuIHJ9LFQ9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49W107ZTtlPWUubmV4dFNpYmxpbmcpMT09PWUubm9kZVR5cGUmJmUhPT10JiZuLnB1c2goZSk7cmV0dXJuIG59LGs9Uy5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtmdW5jdGlvbiBBKGUsdCl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX12YXIgTj0vXjwoW2Etel1bXlwvXDA+Olx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaTtmdW5jdGlvbiBEKGUsbixyKXtyZXR1cm4gbShuKT9TLmdyZXAoZSxmdW5jdGlvbihlLHQpe3JldHVybiEhbi5jYWxsKGUsdCxlKSE9PXJ9KTpuLm5vZGVUeXBlP1MuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09biE9PXJ9KToic3RyaW5nIiE9dHlwZW9mIG4/Uy5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuLTE8aS5jYWxsKG4sZSkhPT1yfSk6Uy5maWx0ZXIobixlLHIpfVMuZmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP1MuZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106Uy5maW5kLm1hdGNoZXMoZSxTLmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LFMuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxpPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayhTKGUpLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7dDxyO3QrKylpZihTLmNvbnRhaW5zKGlbdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLHQ9MDt0PHI7dCsrKVMuZmluZChlLGlbdF0sbik7cmV0dXJuIDE8cj9TLnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhEKHRoaXMsZXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhEKHRoaXMsZXx8W10sITApKX0saXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFEKHRoaXMsInN0cmluZyI9PXR5cGVvZiBlJiZrLnRlc3QoZSk/UyhlKTplfHxbXSwhMSkubGVuZ3RofX0pO3ZhciBqLHE9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsoUy5mbi5pbml0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKCFlKXJldHVybiB0aGlzO2lmKG49bnx8aiwic3RyaW5nIj09dHlwZW9mIGUpe2lmKCEocj0iPCI9PT1lWzBdJiYiPiI9PT1lW2UubGVuZ3RoLTFdJiYzPD1lLmxlbmd0aD9bbnVsbCxlLG51bGxdOnEuZXhlYyhlKSl8fCFyWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoclsxXSl7aWYodD10IGluc3RhbmNlb2YgUz90WzBdOnQsUy5tZXJnZSh0aGlzLFMucGFyc2VIVE1MKHJbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6RSwhMCkpLE4udGVzdChyWzFdKSYmUy5pc1BsYWluT2JqZWN0KHQpKWZvcihyIGluIHQpbSh0aGlzW3JdKT90aGlzW3JdKHRbcl0pOnRoaXMuYXR0cihyLHRbcl0pO3JldHVybiB0aGlzfXJldHVybihpPUUuZ2V0RWxlbWVudEJ5SWQoclsyXSkpJiYodGhpc1swXT1pLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXMpOm0oZSk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KGUpOmUoUyk6Uy5tYWtlQXJyYXkoZSx0aGlzKX0pLnByb3RvdHlwZT1TLmZuLGo9UyhFKTt2YXIgTD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxIPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2Z1bmN0aW9uIE8oZSx0KXt3aGlsZSgoZT1lW3RdKSYmMSE9PWUubm9kZVR5cGUpO3JldHVybiBlfVMuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9UyhlLHRoaXMpLG49dC5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTxuO2UrKylpZihTLmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT0ic3RyaW5nIiE9dHlwZW9mIGUmJlMoZSk7aWYoIWsudGVzdChlKSlmb3IoO3I8aTtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT8tMTxhLmluZGV4KG4pOjE9PT1uLm5vZGVUeXBlJiZTLmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtvLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKDE8by5sZW5ndGg/Uy51bmlxdWVTb3J0KG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/aS5jYWxsKFMoZSksdGhpc1swXSk6aS5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhTLnVuaXF1ZVNvcnQoUy5tZXJnZSh0aGlzLmdldCgpLFMoZSx0KSkpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSksUy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBoKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaChlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gTyhlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBPKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBoKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIGgoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGgoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBoKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiBUKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gVChlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZS5jb250ZW50RG9jdW1lbnQmJnIoZS5jb250ZW50RG9jdW1lbnQpP2UuY29udGVudERvY3VtZW50OihBKGUsInRlbXBsYXRlIikmJihlPWUuY29udGVudHx8ZSksUy5tZXJnZShbXSxlLmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKHIsaSl7Uy5mbltyXT1mdW5jdGlvbihlLHQpe3ZhciBuPVMubWFwKHRoaXMsaSxlKTtyZXR1cm4iVW50aWwiIT09ci5zbGljZSgtNSkmJih0PWUpLHQmJiJzdHJpbmciPT10eXBlb2YgdCYmKG49Uy5maWx0ZXIodCxuKSksMTx0aGlzLmxlbmd0aCYmKEhbcl18fFMudW5pcXVlU29ydChuKSxMLnRlc3QocikmJm4ucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgUD0vW15ceDIwXHRcclxuXGZdKy9nO2Z1bmN0aW9uIFIoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gTShlKXt0aHJvdyBlfWZ1bmN0aW9uIEkoZSx0LG4scil7dmFyIGk7dHJ5e2UmJm0oaT1lLnByb21pc2UpP2kuY2FsbChlKS5kb25lKHQpLmZhaWwobik6ZSYmbShpPWUudGhlbik/aS5jYWxsKGUsdCxuKTp0LmFwcGx5KHZvaWQgMCxbZV0uc2xpY2UocikpfWNhdGNoKGUpe24uYXBwbHkodm9pZCAwLFtlXSl9fVMuQ2FsbGJhY2tzPWZ1bmN0aW9uKHIpe3ZhciBlLG47cj0ic3RyaW5nIj09dHlwZW9mIHI/KGU9cixuPXt9LFMuZWFjaChlLm1hdGNoKFApfHxbXSxmdW5jdGlvbihlLHQpe25bdF09ITB9KSxuKTpTLmV4dGVuZCh7fSxyKTt2YXIgaSx0LG8sYSxzPVtdLHU9W10sbD0tMSxjPWZ1bmN0aW9uKCl7Zm9yKGE9YXx8ci5vbmNlLG89aT0hMDt1Lmxlbmd0aDtsPS0xKXt0PXUuc2hpZnQoKTt3aGlsZSgrK2w8cy5sZW5ndGgpITE9PT1zW2xdLmFwcGx5KHRbMF0sdFsxXSkmJnIuc3RvcE9uRmFsc2UmJihsPXMubGVuZ3RoLHQ9ITEpfXIubWVtb3J5fHwodD0hMSksaT0hMSxhJiYocz10P1tdOiIiKX0sZj17YWRkOmZ1bmN0aW9uKCl7cmV0dXJuIHMmJih0JiYhaSYmKGw9cy5sZW5ndGgtMSx1LnB1c2godCkpLGZ1bmN0aW9uIG4oZSl7Uy5lYWNoKGUsZnVuY3Rpb24oZSx0KXttKHQpP3IudW5pcXVlJiZmLmhhcyh0KXx8cy5wdXNoKHQpOnQmJnQubGVuZ3RoJiYic3RyaW5nIiE9PXcodCkmJm4odCl9KX0oYXJndW1lbnRzKSx0JiYhaSYmYygpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gUy5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihlLHQpe3ZhciBuO3doaWxlKC0xPChuPVMuaW5BcnJheSh0LHMsbikpKXMuc3BsaWNlKG4sMSksbjw9bCYmbC0tfSksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiBlPy0xPFMuaW5BcnJheShlLHMpOjA8cy5sZW5ndGh9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHMmJihzPVtdKSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9dT1bXSxzPXQ9IiIsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hc30sbG9jazpmdW5jdGlvbigpe3JldHVybiBhPXU9W10sdHx8aXx8KHM9dD0iIiksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISFhfSxmaXJlV2l0aDpmdW5jdGlvbihlLHQpe3JldHVybiBhfHwodD1bZSwodD10fHxbXSkuc2xpY2U/dC5zbGljZSgpOnRdLHUucHVzaCh0KSxpfHxjKCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIW99fTtyZXR1cm4gZn0sUy5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGUpe3ZhciBvPVtbIm5vdGlmeSIsInByb2dyZXNzIixTLkNhbGxiYWNrcygibWVtb3J5IiksUy5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxpPSJwZW5kaW5nIixhPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBpfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gcy5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LCJjYXRjaCI6ZnVuY3Rpb24oZSl7cmV0dXJuIGEudGhlbihudWxsLGUpfSxwaXBlOmZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzO3JldHVybiBTLkRlZmVycmVkKGZ1bmN0aW9uKHIpe1MuZWFjaChvLGZ1bmN0aW9uKGUsdCl7dmFyIG49bShpW3RbNF1dKSYmaVt0WzRdXTtzW3RbMV1dKGZ1bmN0aW9uKCl7dmFyIGU9biYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZSYmbShlLnByb21pc2UpP2UucHJvbWlzZSgpLnByb2dyZXNzKHIubm90aWZ5KS5kb25lKHIucmVzb2x2ZSkuZmFpbChyLnJlamVjdCk6clt0WzBdKyJXaXRoIl0odGhpcyxuP1tlXTphcmd1bWVudHMpfSl9KSxpPW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24odCxuLHIpe3ZhciB1PTA7ZnVuY3Rpb24gbChpLG8sYSxzKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLHI9YXJndW1lbnRzLGU9ZnVuY3Rpb24oKXt2YXIgZSx0O2lmKCEoaTx1KSl7aWYoKGU9YS5hcHBseShuLHIpKT09PW8ucHJvbWlzZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvbiIpO3Q9ZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpJiZlLnRoZW4sbSh0KT9zP3QuY2FsbChlLGwodSxvLFIscyksbCh1LG8sTSxzKSk6KHUrKyx0LmNhbGwoZSxsKHUsbyxSLHMpLGwodSxvLE0scyksbCh1LG8sUixvLm5vdGlmeVdpdGgpKSk6KGEhPT1SJiYobj12b2lkIDAscj1bZV0pLChzfHxvLnJlc29sdmVXaXRoKShuLHIpKX19LHQ9cz9lOmZ1bmN0aW9uKCl7dHJ5e2UoKX1jYXRjaChlKXtTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJlMuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhlLHQuc3RhY2tUcmFjZSksdTw9aSsxJiYoYSE9PU0mJihuPXZvaWQgMCxyPVtlXSksby5yZWplY3RXaXRoKG4scikpfX07aT90KCk6KFMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYodC5zdGFja1RyYWNlPVMuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLEMuc2V0VGltZW91dCh0KSl9fXJldHVybiBTLkRlZmVycmVkKGZ1bmN0aW9uKGUpe29bMF1bM10uYWRkKGwoMCxlLG0ocik/cjpSLGUubm90aWZ5V2l0aCkpLG9bMV1bM10uYWRkKGwoMCxlLG0odCk/dDpSKSksb1syXVszXS5hZGQobCgwLGUsbShuKT9uOk0pKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT9TLmV4dGVuZChlLGEpOmF9fSxzPXt9O3JldHVybiBTLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBuPXRbMl0scj10WzVdO2FbdFsxXV09bi5hZGQsciYmbi5hZGQoZnVuY3Rpb24oKXtpPXJ9LG9bMy1lXVsyXS5kaXNhYmxlLG9bMy1lXVszXS5kaXNhYmxlLG9bMF1bMl0ubG9jayxvWzBdWzNdLmxvY2spLG4uYWRkKHRbM10uZmlyZSksc1t0WzBdXT1mdW5jdGlvbigpe3JldHVybiBzW3RbMF0rIldpdGgiXSh0aGlzPT09cz92b2lkIDA6dGhpcyxhcmd1bWVudHMpLHRoaXN9LHNbdFswXSsiV2l0aCJdPW4uZmlyZVdpdGh9KSxhLnByb21pc2UocyksZSYmZS5jYWxsKHMscyksc30sd2hlbjpmdW5jdGlvbihlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHQ9bixyPUFycmF5KHQpLGk9cy5jYWxsKGFyZ3VtZW50cyksbz1TLkRlZmVycmVkKCksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7clt0XT10aGlzLGlbdF09MTxhcmd1bWVudHMubGVuZ3RoP3MuY2FsbChhcmd1bWVudHMpOmUsLS1ufHxvLnJlc29sdmVXaXRoKHIsaSl9fTtpZihuPD0xJiYoSShlLG8uZG9uZShhKHQpKS5yZXNvbHZlLG8ucmVqZWN0LCFuKSwicGVuZGluZyI9PT1vLnN0YXRlKCl8fG0oaVt0XSYmaVt0XS50aGVuKSkpcmV0dXJuIG8udGhlbigpO3doaWxlKHQtLSlJKGlbdF0sYSh0KSxvLnJlamVjdCk7cmV0dXJuIG8ucHJvbWlzZSgpfX0pO3ZhciBXPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1MuRGVmZXJyZWQuZXhjZXB0aW9uSG9vaz1mdW5jdGlvbihlLHQpe0MuY29uc29sZSYmQy5jb25zb2xlLndhcm4mJmUmJlcudGVzdChlLm5hbWUpJiZDLmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIitlLm1lc3NhZ2UsZS5zdGFjayx0KX0sUy5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbihlKXtDLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBlfSl9O3ZhciBGPVMuRGVmZXJyZWQoKTtmdW5jdGlvbiBCKCl7RS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCKSxDLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLEIpLFMucmVhZHkoKX1TLmZuLnJlYWR5PWZ1bmN0aW9uKGUpe3JldHVybiBGLnRoZW4oZSlbImNhdGNoIl0oZnVuY3Rpb24oZSl7Uy5yZWFkeUV4Y2VwdGlvbihlKX0pLHRoaXN9LFMuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKGUpeyghMD09PWU/LS1TLnJlYWR5V2FpdDpTLmlzUmVhZHkpfHwoUy5pc1JlYWR5PSEwKSE9PWUmJjA8LS1TLnJlYWR5V2FpdHx8Ri5yZXNvbHZlV2l0aChFLFtTXSl9fSksUy5yZWFkeS50aGVuPUYudGhlbiwiY29tcGxldGUiPT09RS5yZWFkeVN0YXRlfHwibG9hZGluZyIhPT1FLnJlYWR5U3RhdGUmJiFFLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9DLnNldFRpbWVvdXQoUy5yZWFkeSk6KEUuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiksQy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixCKSk7dmFyICQ9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSl7dmFyIHM9MCx1PWUubGVuZ3RoLGw9bnVsbD09bjtpZigib2JqZWN0Ij09PXcobikpZm9yKHMgaW4gaT0hMCxuKSQoZSx0LHMsbltzXSwhMCxvLGEpO2Vsc2UgaWYodm9pZCAwIT09ciYmKGk9ITAsbShyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbChTKGUpLG4pfSkpLHQpKWZvcig7czx1O3MrKyl0KGVbc10sbixhP3I6ci5jYWxsKGVbc10scyx0KGVbc10sbikpKTtyZXR1cm4gaT9lOmw/dC5jYWxsKGUpOnU/dChlWzBdLG4pOm99LF89L14tbXMtLyx6PS8tKFthLXpdKS9nO2Z1bmN0aW9uIFUoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIFgoZSl7cmV0dXJuIGUucmVwbGFjZShfLCJtcy0iKS5yZXBsYWNlKHosVSl9dmFyIFY9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBHKCl7dGhpcy5leHBhbmRvPVMuZXhwYW5kbytHLnVpZCsrfUcudWlkPTEsRy5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdHx8KHQ9e30sVihlKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXQ6T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdGhpcy5leHBhbmRvLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pKSksdH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPXRoaXMuY2FjaGUoZSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KWlbWCh0KV09bjtlbHNlIGZvcihyIGluIHQpaVtYKHIpXT10W3JdO3JldHVybiBpfSxnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmNhY2hlKGUpOmVbdGhpcy5leHBhbmRvXSYmZVt0aGlzLmV4cGFuZG9dW1godCldfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10fHx0JiYic3RyaW5nIj09dHlwZW9mIHQmJnZvaWQgMD09PW4/dGhpcy5nZXQoZSx0KToodGhpcy5zZXQoZSx0LG4pLHZvaWQgMCE9PW4/bjp0KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lW3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09dCl7bj0odD1BcnJheS5pc0FycmF5KHQpP3QubWFwKFgpOih0PVgodCkpaW4gcj9bdF06dC5tYXRjaChQKXx8W10pLmxlbmd0aDt3aGlsZShuLS0pZGVsZXRlIHJbdFtuXV19KHZvaWQgMD09PXR8fFMuaXNFbXB0eU9iamVjdChyKSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT12b2lkIDA6ZGVsZXRlIGVbdGhpcy5leHBhbmRvXSl9fSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdm9pZCAwIT09dCYmIVMuaXNFbXB0eU9iamVjdCh0KX19O3ZhciBZPW5ldyBHLFE9bmV3IEcsSj0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLEs9L1tBLVpdL2c7ZnVuY3Rpb24gWihlLHQsbil7dmFyIHIsaTtpZih2b2lkIDA9PT1uJiYxPT09ZS5ub2RlVHlwZSlpZihyPSJkYXRhLSIrdC5yZXBsYWNlKEssIi0kJiIpLnRvTG93ZXJDYXNlKCksInN0cmluZyI9PXR5cGVvZihuPWUuZ2V0QXR0cmlidXRlKHIpKSl7dHJ5e249InRydWUiPT09KGk9bil8fCJmYWxzZSIhPT1pJiYoIm51bGwiPT09aT9udWxsOmk9PT0raSsiIj8raTpKLnRlc3QoaSk/SlNPTi5wYXJzZShpKTppKX1jYXRjaChlKXt9US5zZXQoZSx0LG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59Uy5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIFEuaGFzRGF0YShlKXx8WS5oYXNEYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gUS5hY2Nlc3MoZSx0LG4pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7US5yZW1vdmUoZSx0KX0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBZLmFjY2VzcyhlLHQsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7WS5yZW1vdmUoZSx0KX19KSxTLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihuLGUpe3ZhciB0LHIsaSxvPXRoaXNbMF0sYT1vJiZvLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09bil7aWYodGhpcy5sZW5ndGgmJihpPVEuZ2V0KG8pLDE9PT1vLm5vZGVUeXBlJiYhWS5nZXQobywiaGFzRGF0YUF0dHJzIikpKXt0PWEubGVuZ3RoO3doaWxlKHQtLSlhW3RdJiYwPT09KHI9YVt0XS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpJiYocj1YKHIuc2xpY2UoNSkpLFoobyxyLGlbcl0pKTtZLnNldChvLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gaX1yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIG4/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7US5zZXQodGhpcyxuKX0pOiQodGhpcyxmdW5jdGlvbihlKXt2YXIgdDtpZihvJiZ2b2lkIDA9PT1lKXJldHVybiB2b2lkIDAhPT0odD1RLmdldChvLG4pKT90OnZvaWQgMCE9PSh0PVoobyxuKSk/dDp2b2lkIDA7dGhpcy5lYWNoKGZ1bmN0aW9uKCl7US5zZXQodGhpcyxuLGUpfSl9LG51bGwsZSwxPGFyZ3VtZW50cy5sZW5ndGgsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1EucmVtb3ZlKHRoaXMsZSl9KX19KSxTLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKGUpcmV0dXJuIHQ9KHR8fCJmeCIpKyJxdWV1ZSIscj1ZLmdldChlLHQpLG4mJighcnx8QXJyYXkuaXNBcnJheShuKT9yPVkuYWNjZXNzKGUsdCxTLm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXX0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ImZ4Ijt2YXIgbj1TLnF1ZXVlKGUsdCkscj1uLmxlbmd0aCxpPW4uc2hpZnQoKSxvPVMuX3F1ZXVlSG9va3MoZSx0KTsiaW5wcm9ncmVzcyI9PT1pJiYoaT1uLnNoaWZ0KCksci0tKSxpJiYoImZ4Ij09PXQmJm4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBvLnN0b3AsaS5jYWxsKGUsZnVuY3Rpb24oKXtTLmRlcXVldWUoZSx0KX0sbykpLCFyJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4gWS5nZXQoZSxuKXx8WS5hY2Nlc3MoZSxuLHtlbXB0eTpTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtZLnJlbW92ZShlLFt0KyJxdWV1ZSIsbl0pfSl9KX19KSxTLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24odCxuKXt2YXIgZT0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmKG49dCx0PSJmeCIsZS0tKSxhcmd1bWVudHMubGVuZ3RoPGU/Uy5xdWV1ZSh0aGlzWzBdLHQpOnZvaWQgMD09PW4/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1TLnF1ZXVlKHRoaXMsdCxuKTtTLl9xdWV1ZUhvb2tzKHRoaXMsdCksImZ4Ij09PXQmJiJpbnByb2dyZXNzIiE9PWVbMF0mJlMuZGVxdWV1ZSh0aGlzLHQpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZGVxdWV1ZSh0aGlzLGUpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTEsaT1TLkRlZmVycmVkKCksbz10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8aS5yZXNvbHZlV2l0aChvLFtvXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksZT1lfHwiZngiO3doaWxlKGEtLSkobj1ZLmdldChvW2FdLGUrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksaS5wcm9taXNlKHQpfX0pO3ZhciBlZT0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSx0ZT1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrZWUrIikoW2EteiVdKikkIiwiaSIpLG5lPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0scmU9RS5kb2N1bWVudEVsZW1lbnQsaWU9ZnVuY3Rpb24oZSl7cmV0dXJuIFMuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfSxvZT17Y29tcG9zZWQ6ITB9O3JlLmdldFJvb3ROb2RlJiYoaWU9ZnVuY3Rpb24oZSl7cmV0dXJuIFMuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHxlLmdldFJvb3ROb2RlKG9lKT09PWUub3duZXJEb2N1bWVudH0pO3ZhciBhZT1mdW5jdGlvbihlLHQpe3JldHVybiJub25lIj09PShlPXR8fGUpLnN0eWxlLmRpc3BsYXl8fCIiPT09ZS5zdHlsZS5kaXNwbGF5JiZpZShlKSYmIm5vbmUiPT09Uy5jc3MoZSwiZGlzcGxheSIpfTtmdW5jdGlvbiBzZShlLHQsbixyKXt2YXIgaSxvLGE9MjAscz1yP2Z1bmN0aW9uKCl7cmV0dXJuIHIuY3VyKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIFMuY3NzKGUsdCwiIil9LHU9cygpLGw9biYmblszXXx8KFMuY3NzTnVtYmVyW3RdPyIiOiJweCIpLGM9ZS5ub2RlVHlwZSYmKFMuY3NzTnVtYmVyW3RdfHwicHgiIT09bCYmK3UpJiZ0ZS5leGVjKFMuY3NzKGUsdCkpO2lmKGMmJmNbM10hPT1sKXt1Lz0yLGw9bHx8Y1szXSxjPSt1fHwxO3doaWxlKGEtLSlTLnN0eWxlKGUsdCxjK2wpLCgxLW8pKigxLShvPXMoKS91fHwuNSkpPD0wJiYoYT0wKSxjLz1vO2MqPTIsUy5zdHlsZShlLHQsYytsKSxuPW58fFtdfXJldHVybiBuJiYoYz0rY3x8K3V8fDAsaT1uWzFdP2MrKG5bMV0rMSkqblsyXTorblsyXSxyJiYoci51bml0PWwsci5zdGFydD1jLHIuZW5kPWkpKSxpfXZhciB1ZT17fTtmdW5jdGlvbiBsZShlLHQpe2Zvcih2YXIgbixyLGksbyxhLHMsdSxsPVtdLGM9MCxmPWUubGVuZ3RoO2M8ZjtjKyspKHI9ZVtjXSkuc3R5bGUmJihuPXIuc3R5bGUuZGlzcGxheSx0Pygibm9uZSI9PT1uJiYobFtjXT1ZLmdldChyLCJkaXNwbGF5Iil8fG51bGwsbFtjXXx8KHIuc3R5bGUuZGlzcGxheT0iIikpLCIiPT09ci5zdHlsZS5kaXNwbGF5JiZhZShyKSYmKGxbY109KHU9YT1vPXZvaWQgMCxhPShpPXIpLm93bmVyRG9jdW1lbnQscz1pLm5vZGVOYW1lLCh1PXVlW3NdKXx8KG89YS5ib2R5LmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudChzKSksdT1TLmNzcyhvLCJkaXNwbGF5Iiksby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pLCJub25lIj09PXUmJih1PSJibG9jayIpLHVlW3NdPXUpKSkpOiJub25lIiE9PW4mJihsW2NdPSJub25lIixZLnNldChyLCJkaXNwbGF5IixuKSkpO2ZvcihjPTA7YzxmO2MrKyludWxsIT1sW2NdJiYoZVtjXS5zdHlsZS5kaXNwbGF5PWxbY10pO3JldHVybiBlfVMuZm4uZXh0ZW5kKHtzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIGxlKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIGxlKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZT9lP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2FlKHRoaXMpP1ModGhpcykuc2hvdygpOlModGhpcykuaGlkZSgpfSl9fSk7dmFyIGNlLGZlLHBlPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLGRlPS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKS9pLGhlPS9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaTtjZT1FLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChFLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSwoZmU9RS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGZlLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxmZS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksY2UuYXBwZW5kQ2hpbGQoZmUpLHkuY2hlY2tDbG9uZT1jZS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsY2UuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+Iix5Lm5vQ2xvbmVDaGVja2VkPSEhY2UuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlLGNlLmlubmVySFRNTD0iPG9wdGlvbj48L29wdGlvbj4iLHkub3B0aW9uPSEhY2UubGFzdENoaWxkO3ZhciBnZT17dGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDpbMCwiIiwiIl19O2Z1bmN0aW9uIHZlKGUsdCl7dmFyIG47cmV0dXJuIG49InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHx8IioiKToidW5kZWZpbmVkIiE9dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbD9lLnF1ZXJ5U2VsZWN0b3JBbGwodHx8IioiKTpbXSx2b2lkIDA9PT10fHx0JiZBKGUsdCk/Uy5tZXJnZShbZV0sbik6bn1mdW5jdGlvbiB5ZShlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylZLnNldChlW25dLCJnbG9iYWxFdmFsIiwhdHx8WS5nZXQodFtuXSwiZ2xvYmFsRXZhbCIpKX1nZS50Ym9keT1nZS50Zm9vdD1nZS5jb2xncm91cD1nZS5jYXB0aW9uPWdlLnRoZWFkLGdlLnRoPWdlLnRkLHkub3B0aW9ufHwoZ2Uub3B0Z3JvdXA9Z2Uub3B0aW9uPVsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0pO3ZhciBtZT0vPHwmIz9cdys7LztmdW5jdGlvbiB4ZShlLHQsbixyLGkpe2Zvcih2YXIgbyxhLHMsdSxsLGMsZj10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxwPVtdLGQ9MCxoPWUubGVuZ3RoO2Q8aDtkKyspaWYoKG89ZVtkXSl8fDA9PT1vKWlmKCJvYmplY3QiPT09dyhvKSlTLm1lcmdlKHAsby5ub2RlVHlwZT9bb106byk7ZWxzZSBpZihtZS50ZXN0KG8pKXthPWF8fGYuYXBwZW5kQ2hpbGQodC5jcmVhdGVFbGVtZW50KCJkaXYiKSkscz0oZGUuZXhlYyhvKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSx1PWdlW3NdfHxnZS5fZGVmYXVsdCxhLmlubmVySFRNTD11WzFdK1MuaHRtbFByZWZpbHRlcihvKSt1WzJdLGM9dVswXTt3aGlsZShjLS0pYT1hLmxhc3RDaGlsZDtTLm1lcmdlKHAsYS5jaGlsZE5vZGVzKSwoYT1mLmZpcnN0Q2hpbGQpLnRleHRDb250ZW50PSIifWVsc2UgcC5wdXNoKHQuY3JlYXRlVGV4dE5vZGUobykpO2YudGV4dENvbnRlbnQ9IiIsZD0wO3doaWxlKG89cFtkKytdKWlmKHImJi0xPFMuaW5BcnJheShvLHIpKWkmJmkucHVzaChvKTtlbHNlIGlmKGw9aWUobyksYT12ZShmLmFwcGVuZENoaWxkKG8pLCJzY3JpcHQiKSxsJiZ5ZShhKSxuKXtjPTA7d2hpbGUobz1hW2MrK10paGUudGVzdChvLnR5cGV8fCIiKSYmbi5wdXNoKG8pfXJldHVybiBmfXZhciBiZT0vXmtleS8sd2U9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLFRlPS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiBDZSgpe3JldHVybiEwfWZ1bmN0aW9uIEVlKCl7cmV0dXJuITF9ZnVuY3Rpb24gU2UoZSx0KXtyZXR1cm4gZT09PWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBFLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX0oKT09KCJmb2N1cyI9PT10KX1mdW5jdGlvbiBrZShlLHQsbixyLGksbyl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIHQpe2ZvcihzIGluInN0cmluZyIhPXR5cGVvZiBuJiYocj1yfHxuLG49dm9pZCAwKSx0KWtlKGUscyxuLHIsdFtzXSxvKTtyZXR1cm4gZX1pZihudWxsPT1yJiZudWxsPT1pPyhpPW4scj1uPXZvaWQgMCk6bnVsbD09aSYmKCJzdHJpbmciPT10eXBlb2Ygbj8oaT1yLHI9dm9pZCAwKTooaT1yLHI9bixuPXZvaWQgMCkpLCExPT09aSlpPUVlO2Vsc2UgaWYoIWkpcmV0dXJuIGU7cmV0dXJuIDE9PT1vJiYoYT1pLChpPWZ1bmN0aW9uKGUpe3JldHVybiBTKCkub2ZmKGUpLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSkuZ3VpZD1hLmd1aWR8fChhLmd1aWQ9Uy5ndWlkKyspKSxlLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LmFkZCh0aGlzLHQsaSxyLG4pfSl9ZnVuY3Rpb24gQWUoZSxpLG8pe28/KFkuc2V0KGUsaSwhMSksUy5ldmVudC5hZGQoZSxpLHtuYW1lc3BhY2U6ITEsaGFuZGxlcjpmdW5jdGlvbihlKXt2YXIgdCxuLHI9WS5nZXQodGhpcyxpKTtpZigxJmUuaXNUcmlnZ2VyJiZ0aGlzW2ldKXtpZihyLmxlbmd0aCkoUy5ldmVudC5zcGVjaWFsW2ldfHx7fSkuZGVsZWdhdGVUeXBlJiZlLnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYocj1zLmNhbGwoYXJndW1lbnRzKSxZLnNldCh0aGlzLGksciksdD1vKHRoaXMsaSksdGhpc1tpXSgpLHIhPT0obj1ZLmdldCh0aGlzLGkpKXx8dD9ZLnNldCh0aGlzLGksITEpOm49e30sciE9PW4pcmV0dXJuIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksZS5wcmV2ZW50RGVmYXVsdCgpLG4udmFsdWV9ZWxzZSByLmxlbmd0aCYmKFkuc2V0KHRoaXMsaSx7dmFsdWU6Uy5ldmVudC50cmlnZ2VyKFMuZXh0ZW5kKHJbMF0sUy5FdmVudC5wcm90b3R5cGUpLHIuc2xpY2UoMSksdGhpcyl9KSxlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpKX19KSk6dm9pZCAwPT09WS5nZXQoZSxpKSYmUy5ldmVudC5hZGQoZSxpLENlKX1TLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx2PVkuZ2V0KHQpO2lmKFYodCkpe24uaGFuZGxlciYmKG49KG89bikuaGFuZGxlcixpPW8uc2VsZWN0b3IpLGkmJlMuZmluZC5tYXRjaGVzU2VsZWN0b3IocmUsaSksbi5ndWlkfHwobi5ndWlkPVMuZ3VpZCsrKSwodT12LmV2ZW50cyl8fCh1PXYuZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCkpLChhPXYuaGFuZGxlKXx8KGE9di5oYW5kbGU9ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBTJiZTLmV2ZW50LnRyaWdnZXJlZCE9PWUudHlwZT9TLmV2ZW50LmRpc3BhdGNoLmFwcGx5KHQsYXJndW1lbnRzKTp2b2lkIDB9KSxsPShlPShlfHwiIikubWF0Y2goUCl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0pZD1nPShzPVRlLmV4ZWMoZVtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCYmKGY9Uy5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShpP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkLGY9Uy5ldmVudC5zcGVjaWFsW2RdfHx7fSxjPVMuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6ZyxkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOmksbmVlZHNDb250ZXh0OmkmJlMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChpKSxuYW1lc3BhY2U6aC5qb2luKCIuIil9LG8pLChwPXVbZF0pfHwoKHA9dVtkXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKHQscixoLGEpfHx0LmFkZEV2ZW50TGlzdGVuZXImJnQuYWRkRXZlbnRMaXN0ZW5lcihkLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwodCxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLGk/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpwLnB1c2goYyksUy5ldmVudC5nbG9iYWxbZF09ITApfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx2PVkuaGFzRGF0YShlKSYmWS5nZXQoZSk7aWYodiYmKHU9di5ldmVudHMpKXtsPSh0PSh0fHwiIikubWF0Y2goUCl8fFsiIl0pLmxlbmd0aDt3aGlsZShsLS0paWYoZD1nPShzPVRlLmV4ZWModFtsXSl8fFtdKVsxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCl7Zj1TLmV2ZW50LnNwZWNpYWxbZF18fHt9LHA9dVtkPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxkXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9bz1wLmxlbmd0aDt3aGlsZShvLS0pYz1wW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxzJiYhcy50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJigiKioiIT09cnx8IWMuc2VsZWN0b3IpfHwocC5zcGxpY2UobywxKSxjLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbChlLGMpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbChlLGgsdi5oYW5kbGUpfHxTLnJlbW92ZUV2ZW50KGUsZCx2LmhhbmRsZSksZGVsZXRlIHVbZF0pfWVsc2UgZm9yKGQgaW4gdSlTLmV2ZW50LnJlbW92ZShlLGQrdFtsXSxuLHIsITApO1MuaXNFbXB0eU9iamVjdCh1KSYmWS5yZW1vdmUoZSwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHM9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLHU9Uy5ldmVudC5maXgoZSksbD0oWS5nZXQodGhpcywiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW3UudHlwZV18fFtdLGM9Uy5ldmVudC5zcGVjaWFsW3UudHlwZV18fHt9O2ZvcihzWzBdPXUsdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspc1t0XT1hcmd1bWVudHNbdF07aWYodS5kZWxlZ2F0ZVRhcmdldD10aGlzLCFjLnByZURpc3BhdGNofHwhMSE9PWMucHJlRGlzcGF0Y2guY2FsbCh0aGlzLHUpKXthPVMuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLHUsbCksdD0wO3doaWxlKChpPWFbdCsrXSkmJiF1LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpe3UuY3VycmVudFRhcmdldD1pLmVsZW0sbj0wO3doaWxlKChvPWkuaGFuZGxlcnNbbisrXSkmJiF1LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpdS5ybmFtZXNwYWNlJiYhMSE9PW8ubmFtZXNwYWNlJiYhdS5ybmFtZXNwYWNlLnRlc3Qoby5uYW1lc3BhY2UpfHwodS5oYW5kbGVPYmo9byx1LmRhdGE9by5kYXRhLHZvaWQgMCE9PShyPSgoUy5ldmVudC5zcGVjaWFsW28ub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxvLmhhbmRsZXIpLmFwcGx5KGkuZWxlbSxzKSkmJiExPT09KHUucmVzdWx0PXIpJiYodS5wcmV2ZW50RGVmYXVsdCgpLHUuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gYy5wb3N0RGlzcGF0Y2gmJmMucG9zdERpc3BhdGNoLmNhbGwodGhpcyx1KSx1LnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzPVtdLHU9dC5kZWxlZ2F0ZUNvdW50LGw9ZS50YXJnZXQ7aWYodSYmbC5ub2RlVHlwZSYmISgiY2xpY2siPT09ZS50eXBlJiYxPD1lLmJ1dHRvbikpZm9yKDtsIT09dGhpcztsPWwucGFyZW50Tm9kZXx8dGhpcylpZigxPT09bC5ub2RlVHlwZSYmKCJjbGljayIhPT1lLnR5cGV8fCEwIT09bC5kaXNhYmxlZCkpe2ZvcihvPVtdLGE9e30sbj0wO248dTtuKyspdm9pZCAwPT09YVtpPShyPXRbbl0pLnNlbGVjdG9yKyIgIl0mJihhW2ldPXIubmVlZHNDb250ZXh0Py0xPFMoaSx0aGlzKS5pbmRleChsKTpTLmZpbmQoaSx0aGlzLG51bGwsW2xdKS5sZW5ndGgpLGFbaV0mJm8ucHVzaChyKTtvLmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6b30pfXJldHVybiBsPXRoaXMsdTx0Lmxlbmd0aCYmcy5wdXNoKHtlbGVtOmwsaGFuZGxlcnM6dC5zbGljZSh1KX0pLHN9LGFkZFByb3A6ZnVuY3Rpb24odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoUy5FdmVudC5wcm90b3R5cGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0Om0oZSk/ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIGUodGhpcy5vcmlnaW5hbEV2ZW50KX06ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFt0XX0sc2V0OmZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KX19KX0sZml4OmZ1bmN0aW9uKGUpe3JldHVybiBlW1MuZXhwYW5kb10/ZTpuZXcgUy5FdmVudChlKX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGNsaWNrOntzZXR1cDpmdW5jdGlvbihlKXt2YXIgdD10aGlzfHxlO3JldHVybiBwZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJkEodCwiaW5wdXQiKSYmQWUodCwiY2xpY2siLENlKSwhMX0sdHJpZ2dlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzfHxlO3JldHVybiBwZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJkEodCwiaW5wdXQiKSYmQWUodCwiY2xpY2siKSwhMH0sX2RlZmF1bHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQ7cmV0dXJuIHBlLnRlc3QodC50eXBlKSYmdC5jbGljayYmQSh0LCJpbnB1dCIpJiZZLmdldCh0LCJjbGljayIpfHxBKHQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUucmVzdWx0JiZlLm9yaWdpbmFsRXZlbnQmJihlLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZS5yZXN1bHQpfX19fSxTLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUsdCxuKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXImJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4pfSxTLkV2ZW50PWZ1bmN0aW9uKGUsdCl7aWYoISh0aGlzIGluc3RhbmNlb2YgUy5FdmVudCkpcmV0dXJuIG5ldyBTLkV2ZW50KGUsdCk7ZSYmZS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9ZSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWUuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09ZS5kZWZhdWx0UHJldmVudGVkJiYhMT09PWUucmV0dXJuVmFsdWU/Q2U6RWUsdGhpcy50YXJnZXQ9ZS50YXJnZXQmJjM9PT1lLnRhcmdldC5ub2RlVHlwZT9lLnRhcmdldC5wYXJlbnROb2RlOmUudGFyZ2V0LHRoaXMuY3VycmVudFRhcmdldD1lLmN1cnJlbnRUYXJnZXQsdGhpcy5yZWxhdGVkVGFyZ2V0PWUucmVsYXRlZFRhcmdldCk6dGhpcy50eXBlPWUsdCYmUy5leHRlbmQodGhpcyx0KSx0aGlzLnRpbWVTdGFtcD1lJiZlLnRpbWVTdGFtcHx8RGF0ZS5ub3coKSx0aGlzW1MuZXhwYW5kb109ITB9LFMuRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpTLkV2ZW50LGlzRGVmYXVsdFByZXZlbnRlZDpFZSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpFZSxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpFZSxpc1NpbXVsYXRlZDohMSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1DZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1DZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9Q2UsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LFMuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCwiY2hhciI6ITAsY29kZTohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbihlKXt2YXIgdD1lLmJ1dHRvbjtyZXR1cm4gbnVsbD09ZS53aGljaCYmYmUudGVzdChlLnR5cGUpP251bGwhPWUuY2hhckNvZGU/ZS5jaGFyQ29kZTplLmtleUNvZGU6IWUud2hpY2gmJnZvaWQgMCE9PXQmJndlLnRlc3QoZS50eXBlKT8xJnQ/MToyJnQ/Mzo0JnQ/MjowOmUud2hpY2h9fSxTLmV2ZW50LmFkZFByb3ApLFMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXtTLmV2ZW50LnNwZWNpYWxbZV09e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIEFlKHRoaXMsZSxTZSksITF9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gQWUodGhpcyxlKSwhMH0sZGVsZWdhdGVUeXBlOnR9fSksUy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLGkpe1MuZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOmksYmluZFR5cGU6aSxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLnJlbGF0ZWRUYXJnZXQscj1lLmhhbmRsZU9iajtyZXR1cm4gbiYmKG49PT10aGlzfHxTLmNvbnRhaW5zKHRoaXMsbikpfHwoZS50eXBlPXIub3JpZ1R5cGUsdD1yLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT1pKSx0fX19KSxTLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGtlKHRoaXMsZSx0LG4scil9LG9uZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4ga2UodGhpcyxlLHQsbixyLDEpfSxvZmY6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7aWYoZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5oYW5kbGVPYmopcmV0dXJuIHI9ZS5oYW5kbGVPYmosUyhlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2U/ci5vcmlnVHlwZSsiLiIrci5uYW1lc3BhY2U6ci5vcmlnVHlwZSxyLnNlbGVjdG9yLHIuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIGUpe2ZvcihpIGluIGUpdGhpcy5vZmYoaSx0LGVbaV0pO3JldHVybiB0aGlzfXJldHVybiExIT09dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHR8fChuPXQsdD12b2lkIDApLCExPT09biYmKG49RWUpLHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQucmVtb3ZlKHRoaXMsZSxuLHQpfSl9fSk7dmFyIE5lPS88c2NyaXB0fDxzdHlsZXw8bGluay9pLERlPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGplPS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZztmdW5jdGlvbiBxZShlLHQpe3JldHVybiBBKGUsInRhYmxlIikmJkEoMTEhPT10Lm5vZGVUeXBlP3Q6dC5maXJzdENoaWxkLCJ0ciIpJiZTKGUpLmNoaWxkcmVuKCJ0Ym9keSIpWzBdfHxlfWZ1bmN0aW9uIExlKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gSGUoZSl7cmV0dXJuInRydWUvIj09PShlLnR5cGV8fCIiKS5zbGljZSgwLDUpP2UudHlwZT1lLnR5cGUuc2xpY2UoNSk6ZS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxlfWZ1bmN0aW9uIE9lKGUsdCl7dmFyIG4scixpLG8sYSxzO2lmKDE9PT10Lm5vZGVUeXBlKXtpZihZLmhhc0RhdGEoZSkmJihzPVkuZ2V0KGUpLmV2ZW50cykpZm9yKGkgaW4gWS5yZW1vdmUodCwiaGFuZGxlIGV2ZW50cyIpLHMpZm9yKG49MCxyPXNbaV0ubGVuZ3RoO248cjtuKyspUy5ldmVudC5hZGQodCxpLHNbaV1bbl0pO1EuaGFzRGF0YShlKSYmKG89US5hY2Nlc3MoZSksYT1TLmV4dGVuZCh7fSxvKSxRLnNldCh0LGEpKX19ZnVuY3Rpb24gUGUobixyLGksbyl7cj1nKHIpO3ZhciBlLHQsYSxzLHUsbCxjPTAsZj1uLmxlbmd0aCxwPWYtMSxkPXJbMF0saD1tKGQpO2lmKGh8fDE8ZiYmInN0cmluZyI9PXR5cGVvZiBkJiYheS5jaGVja0Nsb25lJiZEZS50ZXN0KGQpKXJldHVybiBuLmVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bi5lcShlKTtoJiYoclswXT1kLmNhbGwodGhpcyxlLHQuaHRtbCgpKSksUGUodCxyLGksbyl9KTtpZihmJiYodD0oZT14ZShyLG5bMF0ub3duZXJEb2N1bWVudCwhMSxuLG8pKS5maXJzdENoaWxkLDE9PT1lLmNoaWxkTm9kZXMubGVuZ3RoJiYoZT10KSx0fHxvKSl7Zm9yKHM9KGE9Uy5tYXAodmUoZSwic2NyaXB0IiksTGUpKS5sZW5ndGg7YzxmO2MrKyl1PWUsYyE9PXAmJih1PVMuY2xvbmUodSwhMCwhMCkscyYmUy5tZXJnZShhLHZlKHUsInNjcmlwdCIpKSksaS5jYWxsKG5bY10sdSxjKTtpZihzKWZvcihsPWFbYS5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxTLm1hcChhLEhlKSxjPTA7YzxzO2MrKyl1PWFbY10saGUudGVzdCh1LnR5cGV8fCIiKSYmIVkuYWNjZXNzKHUsImdsb2JhbEV2YWwiKSYmUy5jb250YWlucyhsLHUpJiYodS5zcmMmJiJtb2R1bGUiIT09KHUudHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk/Uy5fZXZhbFVybCYmIXUubm9Nb2R1bGUmJlMuX2V2YWxVcmwodS5zcmMse25vbmNlOnUubm9uY2V8fHUuZ2V0QXR0cmlidXRlKCJub25jZSIpfSxsKTpiKHUudGV4dENvbnRlbnQucmVwbGFjZShqZSwiIiksdSxsKSl9cmV0dXJuIG59ZnVuY3Rpb24gUmUoZSx0LG4pe2Zvcih2YXIgcixpPXQ/Uy5maWx0ZXIodCxlKTplLG89MDtudWxsIT0ocj1pW29dKTtvKyspbnx8MSE9PXIubm9kZVR5cGV8fFMuY2xlYW5EYXRhKHZlKHIpKSxyLnBhcmVudE5vZGUmJihuJiZpZShyKSYmeWUodmUociwic2NyaXB0IikpLHIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKSk7cmV0dXJuIGV9Uy5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LGNsb25lOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjPWUuY2xvbmVOb2RlKCEwKSxmPWllKGUpO2lmKCEoeS5ub0Nsb25lQ2hlY2tlZHx8MSE9PWUubm9kZVR5cGUmJjExIT09ZS5ub2RlVHlwZXx8Uy5pc1hNTERvYyhlKSkpZm9yKGE9dmUoYykscj0wLGk9KG89dmUoZSkpLmxlbmd0aDtyPGk7cisrKXM9b1tyXSx1PWFbcl0sdm9pZCAwLCJpbnB1dCI9PT0obD11Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpJiZwZS50ZXN0KHMudHlwZSk/dS5jaGVja2VkPXMuY2hlY2tlZDoiaW5wdXQiIT09bCYmInRleHRhcmVhIiE9PWx8fCh1LmRlZmF1bHRWYWx1ZT1zLmRlZmF1bHRWYWx1ZSk7aWYodClpZihuKWZvcihvPW98fHZlKGUpLGE9YXx8dmUoYykscj0wLGk9by5sZW5ndGg7cjxpO3IrKylPZShvW3JdLGFbcl0pO2Vsc2UgT2UoZSxjKTtyZXR1cm4gMDwoYT12ZShjLCJzY3JpcHQiKSkubGVuZ3RoJiZ5ZShhLCFmJiZ2ZShlLCJzY3JpcHQiKSksY30sY2xlYW5EYXRhOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHIsaT1TLmV2ZW50LnNwZWNpYWwsbz0wO3ZvaWQgMCE9PShuPWVbb10pO28rKylpZihWKG4pKXtpZih0PW5bWS5leHBhbmRvXSl7aWYodC5ldmVudHMpZm9yKHIgaW4gdC5ldmVudHMpaVtyXT9TLmV2ZW50LnJlbW92ZShuLHIpOlMucmVtb3ZlRXZlbnQobixyLHQuaGFuZGxlKTtuW1kuZXhwYW5kb109dm9pZCAwfW5bUS5leHBhbmRvXSYmKG5bUS5leHBhbmRvXT12b2lkIDApfX19KSxTLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiBSZSh0aGlzLGUsITApfSxyZW1vdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIFJlKHRoaXMsZSl9LHRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT9TLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gUGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fHFlKHRoaXMsZSkuYXBwZW5kQ2hpbGQoZSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBQZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9cWUodGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBQZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBQZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PTA7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKTE9PT1lLm5vZGVUeXBlJiYoUy5jbGVhbkRhdGEodmUoZSwhMSkpLGUudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWUmJmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBTLmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09ZSYmMT09PXQubm9kZVR5cGUpcmV0dXJuIHQuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmIU5lLnRlc3QoZSkmJiFnZVsoZGUuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9Uy5odG1sUHJlZmlsdGVyKGUpO3RyeXtmb3IoO248cjtuKyspMT09PSh0PXRoaXNbbl18fHt9KS5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKHZlKHQsITEpKSx0LmlubmVySFRNTD1lKTt0PTB9Y2F0Y2goZSl7fX10JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGUpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIG49W107cmV0dXJuIFBlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTtTLmluQXJyYXkodGhpcyxuKTwwJiYoUy5jbGVhbkRhdGEodmUodGhpcykpLHQmJnQucmVwbGFjZUNoaWxkKGUsdGhpcykpfSxuKX19KSxTLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLGEpe1MuZm5bZV09ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49W10scj1TKGUpLGk9ci5sZW5ndGgtMSxvPTA7bzw9aTtvKyspdD1vPT09aT90aGlzOnRoaXMuY2xvbmUoITApLFMocltvXSlbYV0odCksdS5hcHBseShuLHQuZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhuKX19KTt2YXIgTWU9bmV3IFJlZ0V4cCgiXigiK2VlKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksSWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiB0JiZ0Lm9wZW5lcnx8KHQ9QyksdC5nZXRDb21wdXRlZFN0eWxlKGUpfSxXZT1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXt9O2ZvcihpIGluIHQpb1tpXT1lLnN0eWxlW2ldLGUuc3R5bGVbaV09dFtpXTtmb3IoaSBpbiByPW4uY2FsbChlKSx0KWUuc3R5bGVbaV09b1tpXTtyZXR1cm4gcn0sRmU9bmV3IFJlZ0V4cChuZS5qb2luKCJ8IiksImkiKTtmdW5jdGlvbiBCZShlLHQsbil7dmFyIHIsaSxvLGEscz1lLnN0eWxlO3JldHVybihuPW58fEllKGUpKSYmKCIiIT09KGE9bi5nZXRQcm9wZXJ0eVZhbHVlKHQpfHxuW3RdKXx8aWUoZSl8fChhPVMuc3R5bGUoZSx0KSksIXkucGl4ZWxCb3hTdHlsZXMoKSYmTWUudGVzdChhKSYmRmUudGVzdCh0KSYmKHI9cy53aWR0aCxpPXMubWluV2lkdGgsbz1zLm1heFdpZHRoLHMubWluV2lkdGg9cy5tYXhXaWR0aD1zLndpZHRoPWEsYT1uLndpZHRoLHMud2lkdGg9cixzLm1pbldpZHRoPWkscy5tYXhXaWR0aD1vKSksdm9pZCAwIT09YT9hKyIiOmF9ZnVuY3Rpb24gJGUoZSx0KXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7aWYoIWUoKSlyZXR1cm4odGhpcy5nZXQ9dCkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2RlbGV0ZSB0aGlzLmdldH19fSFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtpZihsKXt1LnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGwuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIscmUuYXBwZW5kQ2hpbGQodSkuYXBwZW5kQ2hpbGQobCk7dmFyIGU9Qy5nZXRDb21wdXRlZFN0eWxlKGwpO249IjElIiE9PWUudG9wLHM9MTI9PT10KGUubWFyZ2luTGVmdCksbC5zdHlsZS5yaWdodD0iNjAlIixvPTM2PT09dChlLnJpZ2h0KSxyPTM2PT09dChlLndpZHRoKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaT0xMj09PXQobC5vZmZzZXRXaWR0aC8zKSxyZS5yZW1vdmVDaGlsZCh1KSxsPW51bGx9fWZ1bmN0aW9uIHQoZSl7cmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdChlKSl9dmFyIG4scixpLG8sYSxzLHU9RS5jcmVhdGVFbGVtZW50KCJkaXYiKSxsPUUuY3JlYXRlRWxlbWVudCgiZGl2Iik7bC5zdHlsZSYmKGwuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixsLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIseS5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWwuc3R5bGUuYmFja2dyb3VuZENsaXAsUy5leHRlbmQoeSx7Ym94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLHJ9LHBpeGVsQm94U3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxvfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxufSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLHN9LHNjcm9sbGJveFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLGl9LHJlbGlhYmxlVHJEaW1lbnNpb25zOmZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI7cmV0dXJuIG51bGw9PWEmJihlPUUuY3JlYXRlRWxlbWVudCgidGFibGUiKSx0PUUuY3JlYXRlRWxlbWVudCgidHIiKSxuPUUuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4Iix0LnN0eWxlLmhlaWdodD0iMXB4IixuLnN0eWxlLmhlaWdodD0iOXB4IixyZS5hcHBlbmRDaGlsZChlKS5hcHBlbmRDaGlsZCh0KS5hcHBlbmRDaGlsZChuKSxyPUMuZ2V0Q29tcHV0ZWRTdHlsZSh0KSxhPTM8cGFyc2VJbnQoci5oZWlnaHQpLHJlLnJlbW92ZUNoaWxkKGUpKSxhfX0pKX0oKTt2YXIgX2U9WyJXZWJraXQiLCJNb3oiLCJtcyJdLHplPUUuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsVWU9e307ZnVuY3Rpb24gWGUoZSl7dmFyIHQ9Uy5jc3NQcm9wc1tlXXx8VWVbZV07cmV0dXJuIHR8fChlIGluIHplP2U6VWVbZV09ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksbj1fZS5sZW5ndGg7d2hpbGUobi0tKWlmKChlPV9lW25dK3QpaW4gemUpcmV0dXJuIGV9KGUpfHxlKX12YXIgVmU9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLEdlPS9eLS0vLFllPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxRZT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn07ZnVuY3Rpb24gSmUoZSx0LG4pe3ZhciByPXRlLmV4ZWModCk7cmV0dXJuIHI/TWF0aC5tYXgoMCxyWzJdLShufHwwKSkrKHJbM118fCJweCIpOnR9ZnVuY3Rpb24gS2UoZSx0LG4scixpLG8pe3ZhciBhPSJ3aWR0aCI9PT10PzE6MCxzPTAsdT0wO2lmKG49PT0ocj8iYm9yZGVyIjoiY29udGVudCIpKXJldHVybiAwO2Zvcig7YTw0O2ErPTIpIm1hcmdpbiI9PT1uJiYodSs9Uy5jc3MoZSxuK25lW2FdLCEwLGkpKSxyPygiY29udGVudCI9PT1uJiYodS09Uy5jc3MoZSwicGFkZGluZyIrbmVbYV0sITAsaSkpLCJtYXJnaW4iIT09biYmKHUtPVMuY3NzKGUsImJvcmRlciIrbmVbYV0rIldpZHRoIiwhMCxpKSkpOih1Kz1TLmNzcyhlLCJwYWRkaW5nIituZVthXSwhMCxpKSwicGFkZGluZyIhPT1uP3UrPVMuY3NzKGUsImJvcmRlciIrbmVbYV0rIldpZHRoIiwhMCxpKTpzKz1TLmNzcyhlLCJib3JkZXIiK25lW2FdKyJXaWR0aCIsITAsaSkpO3JldHVybiFyJiYwPD1vJiYodSs9TWF0aC5tYXgoMCxNYXRoLmNlaWwoZVsib2Zmc2V0Iit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0tby11LXMtLjUpKXx8MCksdX1mdW5jdGlvbiBaZShlLHQsbil7dmFyIHI9SWUoZSksaT0oIXkuYm94U2l6aW5nUmVsaWFibGUoKXx8bikmJiJib3JkZXItYm94Ij09PVMuY3NzKGUsImJveFNpemluZyIsITEsciksbz1pLGE9QmUoZSx0LHIpLHM9Im9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSk7aWYoTWUudGVzdChhKSl7aWYoIW4pcmV0dXJuIGE7YT0iYXV0byJ9cmV0dXJuKCF5LmJveFNpemluZ1JlbGlhYmxlKCkmJml8fCF5LnJlbGlhYmxlVHJEaW1lbnNpb25zKCkmJkEoZSwidHIiKXx8ImF1dG8iPT09YXx8IXBhcnNlRmxvYXQoYSkmJiJpbmxpbmUiPT09Uy5jc3MoZSwiZGlzcGxheSIsITEscikpJiZlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiYoaT0iYm9yZGVyLWJveCI9PT1TLmNzcyhlLCJib3hTaXppbmciLCExLHIpLChvPXMgaW4gZSkmJihhPWVbc10pKSwoYT1wYXJzZUZsb2F0KGEpfHwwKStLZShlLHQsbnx8KGk/ImJvcmRlciI6ImNvbnRlbnQiKSxvLHIsYSkrInB4In1mdW5jdGlvbiBldChlLHQsbixyLGkpe3JldHVybiBuZXcgZXQucHJvdG90eXBlLmluaXQoZSx0LG4scixpKX1TLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPUJlKGUsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGdyaWRBcmVhOiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTdGFydDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUmJjMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmZS5zdHlsZSl7dmFyIGksbyxhLHM9WCh0KSx1PUdlLnRlc3QodCksbD1lLnN0eWxlO2lmKHV8fCh0PVhlKHMpKSxhPVMuY3NzSG9va3NbdF18fFMuY3NzSG9va3Nbc10sdm9pZCAwPT09bilyZXR1cm4gYSYmImdldCJpbiBhJiZ2b2lkIDAhPT0oaT1hLmdldChlLCExLHIpKT9pOmxbdF07InN0cmluZyI9PT0obz10eXBlb2YgbikmJihpPXRlLmV4ZWMobikpJiZpWzFdJiYobj1zZShlLHQsaSksbz0ibnVtYmVyIiksbnVsbCE9biYmbj09biYmKCJudW1iZXIiIT09b3x8dXx8KG4rPWkmJmlbM118fChTLmNzc051bWJlcltzXT8iIjoicHgiKSkseS5jbGVhckNsb25lU3R5bGV8fCIiIT09bnx8MCE9PXQuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwobFt0XT0iaW5oZXJpdCIpLGEmJiJzZXQiaW4gYSYmdm9pZCAwPT09KG49YS5zZXQoZSxuLHIpKXx8KHU/bC5zZXRQcm9wZXJ0eSh0LG4pOmxbdF09bikpfX0sY3NzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzPVgodCk7cmV0dXJuIEdlLnRlc3QodCl8fCh0PVhlKHMpKSwoYT1TLmNzc0hvb2tzW3RdfHxTLmNzc0hvb2tzW3NdKSYmImdldCJpbiBhJiYoaT1hLmdldChlLCEwLG4pKSx2b2lkIDA9PT1pJiYoaT1CZShlLHQscikpLCJub3JtYWwiPT09aSYmdCBpbiBRZSYmKGk9UWVbdF0pLCIiPT09bnx8bj8obz1wYXJzZUZsb2F0KGkpLCEwPT09bnx8aXNGaW5pdGUobyk/b3x8MDppKTppfX0pLFMuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oZSx1KXtTLmNzc0hvb2tzW3VdPXtnZXQ6ZnVuY3Rpb24oZSx0LG4pe2lmKHQpcmV0dXJuIVZlLnRlc3QoUy5jc3MoZSwiZGlzcGxheSIpKXx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aD9aZShlLHUsbik6V2UoZSxZZSxmdW5jdGlvbigpe3JldHVybiBaZShlLHUsbil9KX0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPUllKGUpLG89IXkuc2Nyb2xsYm94U2l6ZSgpJiYiYWJzb2x1dGUiPT09aS5wb3NpdGlvbixhPShvfHxuKSYmImJvcmRlci1ib3giPT09Uy5jc3MoZSwiYm94U2l6aW5nIiwhMSxpKSxzPW4/S2UoZSx1LG4sYSxpKTowO3JldHVybiBhJiZvJiYocy09TWF0aC5jZWlsKGVbIm9mZnNldCIrdVswXS50b1VwcGVyQ2FzZSgpK3Uuc2xpY2UoMSldLXBhcnNlRmxvYXQoaVt1XSktS2UoZSx1LCJib3JkZXIiLCExLGkpLS41KSkscyYmKHI9dGUuZXhlYyh0KSkmJiJweCIhPT0oclszXXx8InB4IikmJihlLnN0eWxlW3VdPXQsdD1TLmNzcyhlLHUpKSxKZSgwLHQscyl9fX0pLFMuY3NzSG9va3MubWFyZ2luTGVmdD0kZSh5LnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuKHBhcnNlRmxvYXQoQmUoZSwibWFyZ2luTGVmdCIpKXx8ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LVdlKGUse21hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSkpKyJweCJ9KSxTLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihpLG8pe1MuY3NzSG9va3NbaStvXT17ZXhwYW5kOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49e30scj0ic3RyaW5nIj09dHlwZW9mIGU/ZS5zcGxpdCgiICIpOltlXTt0PDQ7dCsrKW5baStuZVt0XStvXT1yW3RdfHxyW3QtMl18fHJbMF07cmV0dXJuIG59fSwibWFyZ2luIiE9PWkmJihTLmNzc0hvb2tzW2krb10uc2V0PUplKX0pLFMuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89e30sYT0wO2lmKEFycmF5LmlzQXJyYXkodCkpe2ZvcihyPUllKGUpLGk9dC5sZW5ndGg7YTxpO2ErKylvW3RbYV1dPVMuY3NzKGUsdFthXSwhMSxyKTtyZXR1cm4gb31yZXR1cm4gdm9pZCAwIT09bj9TLnN0eWxlKGUsdCxuKTpTLmNzcyhlLHQpfSxlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX19KSwoKFMuVHdlZW49ZXQpLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZXQsaW5pdDpmdW5jdGlvbihlLHQsbixyLGksbyl7dGhpcy5lbGVtPWUsdGhpcy5wcm9wPW4sdGhpcy5lYXNpbmc9aXx8Uy5lYXNpbmcuX2RlZmF1bHQsdGhpcy5vcHRpb25zPXQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PW98fChTLmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGU9ZXQucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGUmJmUuZ2V0P2UuZ2V0KHRoaXMpOmV0LnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihlKXt2YXIgdCxuPWV0LnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9dD1TLmVhc2luZ1t0aGlzLmVhc2luZ10oZSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qZSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz10PWUsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKnQrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksbiYmbi5zZXQ/bi5zZXQodGhpcyk6ZXQucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0pLmluaXQucHJvdG90eXBlPWV0LnByb3RvdHlwZSwoZXQucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiAxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsIT1lLmVsZW1bZS5wcm9wXSYmbnVsbD09ZS5lbGVtLnN0eWxlW2UucHJvcF0/ZS5lbGVtW2UucHJvcF06KHQ9Uy5jc3MoZS5lbGVtLGUucHJvcCwiIikpJiYiYXV0byIhPT10P3Q6MH0sc2V0OmZ1bmN0aW9uKGUpe1MuZnguc3RlcFtlLnByb3BdP1MuZnguc3RlcFtlLnByb3BdKGUpOjEhPT1lLmVsZW0ubm9kZVR5cGV8fCFTLmNzc0hvb2tzW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtYZShlLnByb3ApXT9lLmVsZW1bZS5wcm9wXT1lLm5vdzpTLnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KX19fSkuc2Nyb2xsVG9wPWV0LnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oZSl7ZS5lbGVtLm5vZGVUeXBlJiZlLmVsZW0ucGFyZW50Tm9kZSYmKGUuZWxlbVtlLnByb3BdPWUubm93KX19LFMuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sUy5meD1ldC5wcm90b3R5cGUuaW5pdCxTLmZ4LnN0ZXA9e307dmFyIHR0LG50LHJ0LGl0LG90PS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxhdD0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIHN0KCl7bnQmJighMT09PUUuaGlkZGVuJiZDLnJlcXVlc3RBbmltYXRpb25GcmFtZT9DLnJlcXVlc3RBbmltYXRpb25GcmFtZShzdCk6Qy5zZXRUaW1lb3V0KHN0LFMuZnguaW50ZXJ2YWwpLFMuZngudGljaygpKX1mdW5jdGlvbiB1dCgpe3JldHVybiBDLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0dD12b2lkIDB9KSx0dD1EYXRlLm5vdygpfWZ1bmN0aW9uIGx0KGUsdCl7dmFyIG4scj0wLGk9e2hlaWdodDplfTtmb3IodD10PzE6MDtyPDQ7cis9Mi10KWlbIm1hcmdpbiIrKG49bmVbcl0pXT1pWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoaS5vcGFjaXR5PWkud2lkdGg9ZSksaX1mdW5jdGlvbiBjdChlLHQsbil7Zm9yKHZhciByLGk9KGZ0LnR3ZWVuZXJzW3RdfHxbXSkuY29uY2F0KGZ0LnR3ZWVuZXJzWyIqIl0pLG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIGZ0KG8sZSx0KXt2YXIgbixhLHI9MCxpPWZ0LnByZWZpbHRlcnMubGVuZ3RoLHM9Uy5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSB1LmVsZW19KSx1PWZ1bmN0aW9uKCl7aWYoYSlyZXR1cm4hMTtmb3IodmFyIGU9dHR8fHV0KCksdD1NYXRoLm1heCgwLGwuc3RhcnRUaW1lK2wuZHVyYXRpb24tZSksbj0xLSh0L2wuZHVyYXRpb258fDApLHI9MCxpPWwudHdlZW5zLmxlbmd0aDtyPGk7cisrKWwudHdlZW5zW3JdLnJ1bihuKTtyZXR1cm4gcy5ub3RpZnlXaXRoKG8sW2wsbix0XSksbjwxJiZpP3Q6KGl8fHMubm90aWZ5V2l0aChvLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgobyxbbF0pLCExKX0sbD1zLnByb21pc2Uoe2VsZW06byxwcm9wczpTLmV4dGVuZCh7fSxlKSxvcHRzOlMuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpTLmVhc2luZy5fZGVmYXVsdH0sdCksb3JpZ2luYWxQcm9wZXJ0aWVzOmUsb3JpZ2luYWxPcHRpb25zOnQsc3RhcnRUaW1lOnR0fHx1dCgpLGR1cmF0aW9uOnQuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49Uy5Ud2VlbihvLGwub3B0cyxlLHQsbC5vcHRzLnNwZWNpYWxFYXNpbmdbZV18fGwub3B0cy5lYXNpbmcpO3JldHVybiBsLnR3ZWVucy5wdXNoKG4pLG59LHN0b3A6ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPWU/bC50d2VlbnMubGVuZ3RoOjA7aWYoYSlyZXR1cm4gdGhpcztmb3IoYT0hMDt0PG47dCsrKWwudHdlZW5zW3RdLnJ1bigxKTtyZXR1cm4gZT8ocy5ub3RpZnlXaXRoKG8sW2wsMSwwXSkscy5yZXNvbHZlV2l0aChvLFtsLGVdKSk6cy5yZWplY3RXaXRoKG8sW2wsZV0pLHRoaXN9fSksYz1sLnByb3BzO2ZvcighZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhO2ZvcihuIGluIGUpaWYoaT10W3I9WChuKV0sbz1lW25dLEFycmF5LmlzQXJyYXkobykmJihpPW9bMV0sbz1lW25dPW9bMF0pLG4hPT1yJiYoZVtyXT1vLGRlbGV0ZSBlW25dKSwoYT1TLmNzc0hvb2tzW3JdKSYmImV4cGFuZCJpbiBhKWZvcihuIGluIG89YS5leHBhbmQobyksZGVsZXRlIGVbcl0sbyluIGluIGV8fChlW25dPW9bbl0sdFtuXT1pKTtlbHNlIHRbcl09aX0oYyxsLm9wdHMuc3BlY2lhbEVhc2luZyk7cjxpO3IrKylpZihuPWZ0LnByZWZpbHRlcnNbcl0uY2FsbChsLG8sYyxsLm9wdHMpKXJldHVybiBtKG4uc3RvcCkmJihTLl9xdWV1ZUhvb2tzKGwuZWxlbSxsLm9wdHMucXVldWUpLnN0b3A9bi5zdG9wLmJpbmQobikpLG47cmV0dXJuIFMubWFwKGMsY3QsbCksbShsLm9wdHMuc3RhcnQpJiZsLm9wdHMuc3RhcnQuY2FsbChvLGwpLGwucHJvZ3Jlc3MobC5vcHRzLnByb2dyZXNzKS5kb25lKGwub3B0cy5kb25lLGwub3B0cy5jb21wbGV0ZSkuZmFpbChsLm9wdHMuZmFpbCkuYWx3YXlzKGwub3B0cy5hbHdheXMpLFMuZngudGltZXIoUy5leHRlbmQodSx7ZWxlbTpvLGFuaW06bCxxdWV1ZTpsLm9wdHMucXVldWV9KSksbH1TLkFuaW1hdGlvbj1TLmV4dGVuZChmdCx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWF0ZVR3ZWVuKGUsdCk7cmV0dXJuIHNlKG4uZWxlbSxlLHRlLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7bShlKT8odD1lLGU9WyIqIl0pOmU9ZS5tYXRjaChQKTtmb3IodmFyIG4scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluPWVbcl0sZnQudHdlZW5lcnNbbl09ZnQudHdlZW5lcnNbbl18fFtdLGZ0LnR3ZWVuZXJzW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcnM6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjLGY9IndpZHRoImluIHR8fCJoZWlnaHQiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsZz1lLm5vZGVUeXBlJiZhZShlKSx2PVkuZ2V0KGUsImZ4c2hvdyIpO2ZvcihyIGluIG4ucXVldWV8fChudWxsPT0oYT1TLl9xdWV1ZUhvb2tzKGUsImZ4IikpLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHM9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHMoKX0pLGEudW5xdWV1ZWQrKyxwLmFsd2F5cyhmdW5jdGlvbigpe3AuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLFMucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSksdClpZihpPXRbcl0sb3QudGVzdChpKSl7aWYoZGVsZXRlIHRbcl0sbz1vfHwidG9nZ2xlIj09PWksaT09PShnPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1pfHwhdnx8dm9pZCAwPT09dltyXSljb250aW51ZTtnPSEwfWRbcl09diYmdltyXXx8Uy5zdHlsZShlLHIpfWlmKCh1PSFTLmlzRW1wdHlPYmplY3QodCkpfHwhUy5pc0VtcHR5T2JqZWN0KGQpKWZvcihyIGluIGYmJjE9PT1lLm5vZGVUeXBlJiYobi5vdmVyZmxvdz1baC5vdmVyZmxvdyxoLm92ZXJmbG93WCxoLm92ZXJmbG93WV0sbnVsbD09KGw9diYmdi5kaXNwbGF5KSYmKGw9WS5nZXQoZSwiZGlzcGxheSIpKSwibm9uZSI9PT0oYz1TLmNzcyhlLCJkaXNwbGF5IikpJiYobD9jPWw6KGxlKFtlXSwhMCksbD1lLnN0eWxlLmRpc3BsYXl8fGwsYz1TLmNzcyhlLCJkaXNwbGF5IiksbGUoW2VdKSkpLCgiaW5saW5lIj09PWN8fCJpbmxpbmUtYmxvY2siPT09YyYmbnVsbCE9bCkmJiJub25lIj09PVMuY3NzKGUsImZsb2F0IikmJih1fHwocC5kb25lKGZ1bmN0aW9uKCl7aC5kaXNwbGF5PWx9KSxudWxsPT1sJiYoYz1oLmRpc3BsYXksbD0ibm9uZSI9PT1jPyIiOmMpKSxoLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxuLm92ZXJmbG93JiYoaC5vdmVyZmxvdz0iaGlkZGVuIixwLmFsd2F5cyhmdW5jdGlvbigpe2gub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxoLm92ZXJmbG93WD1uLm92ZXJmbG93WzFdLGgub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSksdT0hMSxkKXV8fCh2PyJoaWRkZW4iaW4gdiYmKGc9di5oaWRkZW4pOnY9WS5hY2Nlc3MoZSwiZnhzaG93Iix7ZGlzcGxheTpsfSksbyYmKHYuaGlkZGVuPSFnKSxnJiZsZShbZV0sITApLHAuZG9uZShmdW5jdGlvbigpe2ZvcihyIGluIGd8fGxlKFtlXSksWS5yZW1vdmUoZSwiZnhzaG93IiksZClTLnN0eWxlKGUscixkW3JdKX0pKSx1PWN0KGc/dltyXTowLHIscCksciBpbiB2fHwodltyXT11LnN0YXJ0LGcmJih1LmVuZD11LnN0YXJ0LHUuc3RhcnQ9MCkpfV0scHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD9mdC5wcmVmaWx0ZXJzLnVuc2hpZnQoZSk6ZnQucHJlZmlsdGVycy5wdXNoKGUpfX0pLFMuc3BlZWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUmJiJvYmplY3QiPT10eXBlb2YgZT9TLmV4dGVuZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fG0oZSkmJmUsZHVyYXRpb246ZSxlYXNpbmc6biYmdHx8dCYmIW0odCkmJnR9O3JldHVybiBTLmZ4Lm9mZj9yLmR1cmF0aW9uPTA6Im51bWJlciIhPXR5cGVvZiByLmR1cmF0aW9uJiYoci5kdXJhdGlvbiBpbiBTLmZ4LnNwZWVkcz9yLmR1cmF0aW9uPVMuZnguc3BlZWRzW3IuZHVyYXRpb25dOnIuZHVyYXRpb249Uy5meC5zcGVlZHMuX2RlZmF1bHQpLG51bGwhPXIucXVldWUmJiEwIT09ci5xdWV1ZXx8KHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bShyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmUy5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LFMuZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKGFlKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbih0LGUsbixyKXt2YXIgaT1TLmlzRW1wdHlPYmplY3QodCksbz1TLnNwZWVkKGUsbixyKSxhPWZ1bmN0aW9uKCl7dmFyIGU9ZnQodGhpcyxTLmV4dGVuZCh7fSx0KSxvKTsoaXx8WS5nZXQodGhpcywiZmluaXNoIikpJiZlLnN0b3AoITApfTtyZXR1cm4gYS5maW5pc2g9YSxpfHwhMT09PW8ucXVldWU/dGhpcy5lYWNoKGEpOnRoaXMucXVldWUoby5xdWV1ZSxhKX0sc3RvcDpmdW5jdGlvbihpLGUsbyl7dmFyIGE9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChvKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBpJiYobz1lLGU9aSxpPXZvaWQgMCksZSYmdGhpcy5xdWV1ZShpfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT0hMCx0PW51bGwhPWkmJmkrInF1ZXVlSG9va3MiLG49Uy50aW1lcnMscj1ZLmdldCh0aGlzKTtpZih0KXJbdF0mJnJbdF0uc3RvcCYmYShyW3RdKTtlbHNlIGZvcih0IGluIHIpclt0XSYmclt0XS5zdG9wJiZhdC50ZXN0KHQpJiZhKHJbdF0pO2Zvcih0PW4ubGVuZ3RoO3QtLTspblt0XS5lbGVtIT09dGhpc3x8bnVsbCE9aSYmblt0XS5xdWV1ZSE9PWl8fChuW3RdLmFuaW0uc3RvcChvKSxlPSExLG4uc3BsaWNlKHQsMSkpOyFlJiZvfHxTLmRlcXVldWUodGhpcyxpKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuITEhPT1hJiYoYT1hfHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSx0PVkuZ2V0KHRoaXMpLG49dFthKyJxdWV1ZSJdLHI9dFthKyJxdWV1ZUhvb2tzIl0saT1TLnRpbWVycyxvPW4/bi5sZW5ndGg6MDtmb3IodC5maW5pc2g9ITAsUy5xdWV1ZSh0aGlzLGEsW10pLHImJnIuc3RvcCYmci5zdG9wLmNhbGwodGhpcywhMCksZT1pLmxlbmd0aDtlLS07KWlbZV0uZWxlbT09PXRoaXMmJmlbZV0ucXVldWU9PT1hJiYoaVtlXS5hbmltLnN0b3AoITApLGkuc3BsaWNlKGUsMSkpO2ZvcihlPTA7ZTxvO2UrKyluW2VdJiZuW2VdLmZpbmlzaCYmbltlXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgdC5maW5pc2h9KX19KSxTLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGUscil7dmFyIGk9Uy5mbltyXTtTLmZuW3JdPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZT9pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUobHQociwhMCksZSx0LG4pfX0pLFMuZWFjaCh7c2xpZGVEb3duOmx0KCJzaG93Iiksc2xpZGVVcDpsdCgiaGlkZSIpLHNsaWRlVG9nZ2xlOmx0KCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGUscil7Uy5mbltlXT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuYW5pbWF0ZShyLGUsdCxuKX19KSxTLnRpbWVycz1bXSxTLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSx0PTAsbj1TLnRpbWVycztmb3IodHQ9RGF0ZS5ub3coKTt0PG4ubGVuZ3RoO3QrKykoZT1uW3RdKSgpfHxuW3RdIT09ZXx8bi5zcGxpY2UodC0tLDEpO24ubGVuZ3RofHxTLmZ4LnN0b3AoKSx0dD12b2lkIDB9LFMuZngudGltZXI9ZnVuY3Rpb24oZSl7Uy50aW1lcnMucHVzaChlKSxTLmZ4LnN0YXJ0KCl9LFMuZnguaW50ZXJ2YWw9MTMsUy5meC5zdGFydD1mdW5jdGlvbigpe250fHwobnQ9ITAsc3QoKSl9LFMuZnguc3RvcD1mdW5jdGlvbigpe250PW51bGx9LFMuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LFMuZm4uZGVsYXk9ZnVuY3Rpb24ocixlKXtyZXR1cm4gcj1TLmZ4JiZTLmZ4LnNwZWVkc1tyXXx8cixlPWV8fCJmeCIsdGhpcy5xdWV1ZShlLGZ1bmN0aW9uKGUsdCl7dmFyIG49Qy5zZXRUaW1lb3V0KGUscik7dC5zdG9wPWZ1bmN0aW9uKCl7Qy5jbGVhclRpbWVvdXQobil9fSl9LHJ0PUUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxpdD1FLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKEUuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLHJ0LnR5cGU9ImNoZWNrYm94Iix5LmNoZWNrT249IiIhPT1ydC52YWx1ZSx5Lm9wdFNlbGVjdGVkPWl0LnNlbGVjdGVkLChydD1FLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnZhbHVlPSJ0IixydC50eXBlPSJyYWRpbyIseS5yYWRpb1ZhbHVlPSJ0Ij09PXJ0LnZhbHVlO3ZhciBwdCxkdD1TLmV4cHIuYXR0ckhhbmRsZTtTLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiAkKHRoaXMsUy5hdHRyLGUsdCwxPGFyZ3VtZW50cy5sZW5ndGgpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLnJlbW92ZUF0dHIodGhpcyxlKX0pfX0pLFMuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgZS5nZXRBdHRyaWJ1dGU/Uy5wcm9wKGUsdCxuKTooMT09PW8mJlMuaXNYTUxEb2MoZSl8fChpPVMuYXR0ckhvb2tzW3QudG9Mb3dlckNhc2UoKV18fChTLmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP3B0OnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCBTLnJlbW92ZUF0dHIoZSx0KTppJiYic2V0ImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjooZS5zZXRBdHRyaWJ1dGUodCxuKyIiKSxuKTppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOm51bGw9PShyPVMuZmluZC5hdHRyKGUsdCkpP3ZvaWQgMDpyKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZigheS5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmQShlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXQmJnQubWF0Y2goUCk7aWYoaSYmMT09PWUubm9kZVR5cGUpd2hpbGUobj1pW3IrK10pZS5yZW1vdmVBdHRyaWJ1dGUobil9fSkscHQ9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuITE9PT10P1MucmVtb3ZlQXR0cihlLG4pOmUuc2V0QXR0cmlidXRlKG4sbiksbn19LFMuZWFjaChTLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihlLHQpe3ZhciBhPWR0W3RdfHxTLmZpbmQuYXR0cjtkdFt0XT1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gbnx8KGk9ZHRbb10sZHRbb109cixyPW51bGwhPWEoZSx0LG4pP286bnVsbCxkdFtvXT1pKSxyfX0pO3ZhciBodD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLGd0PS9eKD86YXxhcmVhKSQvaTtmdW5jdGlvbiB2dChlKXtyZXR1cm4oZS5tYXRjaChQKXx8W10pLmpvaW4oIiAiKX1mdW5jdGlvbiB5dChlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn1mdW5jdGlvbiBtdChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lOiJzdHJpbmciPT10eXBlb2YgZSYmZS5tYXRjaChQKXx8W119Uy5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJCh0aGlzLFMucHJvcCxlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbUy5wcm9wRml4W2VdfHxlXX0pfX0pLFMuZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89ZS5ub2RlVHlwZTtpZigzIT09byYmOCE9PW8mJjIhPT1vKXJldHVybiAxPT09byYmUy5pc1hNTERvYyhlKXx8KHQ9Uy5wcm9wRml4W3RdfHx0LGk9Uy5wcm9wSG9va3NbdF0pLHZvaWQgMCE9PW4/aSYmInNldCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6ZVt0XT1uOmkmJiJnZXQiaW4gaSYmbnVsbCE9PShyPWkuZ2V0KGUsdCkpP3I6ZVt0XX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PVMuZmluZC5hdHRyKGUsInRhYmluZGV4Iik7cmV0dXJuIHQ/cGFyc2VJbnQodCwxMCk6aHQudGVzdChlLm5vZGVOYW1lKXx8Z3QudGVzdChlLm5vZGVOYW1lKSYmZS5ocmVmPzA6LTF9fX0scHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9fSkseS5vcHRTZWxlY3RlZHx8KFMucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7dCYmKHQuc2VsZWN0ZWRJbmRleCx0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxTLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe1MucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxTLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLmFkZENsYXNzKHQuY2FsbCh0aGlzLGUseXQodGhpcykpKX0pO2lmKChlPW10KHQpKS5sZW5ndGgpd2hpbGUobj10aGlzW3UrK10paWYoaT15dChuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIrdnQoaSkrIiAiKXthPTA7d2hpbGUobz1lW2ErK10pci5pbmRleE9mKCIgIitvKyIgIik8MCYmKHIrPW8rIiAiKTtpIT09KHM9dnQocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLGEscyx1PTA7aWYobSh0KSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykucmVtb3ZlQ2xhc3ModC5jYWxsKHRoaXMsZSx5dCh0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCIiKTtpZigoZT1tdCh0KSkubGVuZ3RoKXdoaWxlKG49dGhpc1t1KytdKWlmKGk9eXQobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK3Z0KGkpKyIgIil7YT0wO3doaWxlKG89ZVthKytdKXdoaWxlKC0xPHIuaW5kZXhPZigiICIrbysiICIpKXI9ci5yZXBsYWNlKCIgIitvKyIgIiwiICIpO2khPT0ocz12dChyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGksdCl7dmFyIG89dHlwZW9mIGksYT0ic3RyaW5nIj09PW98fEFycmF5LmlzQXJyYXkoaSk7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdCYmYT90P3RoaXMuYWRkQ2xhc3MoaSk6dGhpcy5yZW1vdmVDbGFzcyhpKTptKGkpP3RoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLnRvZ2dsZUNsYXNzKGkuY2FsbCh0aGlzLGUseXQodGhpcyksdCksdCl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZSx0LG4scjtpZihhKXt0PTAsbj1TKHRoaXMpLHI9bXQoaSk7d2hpbGUoZT1yW3QrK10pbi5oYXNDbGFzcyhlKT9uLnJlbW92ZUNsYXNzKGUpOm4uYWRkQ2xhc3MoZSl9ZWxzZSB2b2lkIDAhPT1pJiYiYm9vbGVhbiIhPT1vfHwoKGU9eXQodGhpcykpJiZZLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIixlKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixlfHwhMT09PWk/IiI6WS5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj0wO3Q9IiAiK2UrIiAiO3doaWxlKG49dGhpc1tyKytdKWlmKDE9PT1uLm5vZGVUeXBlJiYtMTwoIiAiK3Z0KHl0KG4pKSsiICIpLmluZGV4T2YodCkpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIHh0PS9cci9nO1MuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24obil7dmFyIHIsZSxpLHQ9dGhpc1swXTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1tKG4pLHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgdDsxPT09dGhpcy5ub2RlVHlwZSYmKG51bGw9PSh0PWk/bi5jYWxsKHRoaXMsZSxTKHRoaXMpLnZhbCgpKTpuKT90PSIiOiJudW1iZXIiPT10eXBlb2YgdD90Kz0iIjpBcnJheS5pc0FycmF5KHQpJiYodD1TLm1hcCh0LGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOmUrIiJ9KSksKHI9Uy52YWxIb29rc1t0aGlzLnR5cGVdfHxTLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYic2V0ImluIHImJnZvaWQgMCE9PXIuc2V0KHRoaXMsdCwidmFsdWUiKXx8KHRoaXMudmFsdWU9dCkpfSkpOnQ/KHI9Uy52YWxIb29rc1t0LnR5cGVdfHxTLnZhbEhvb2tzW3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYiZ2V0ImluIHImJnZvaWQgMCE9PShlPXIuZ2V0KHQsInZhbHVlIikpP2U6InN0cmluZyI9PXR5cGVvZihlPXQudmFsdWUpP2UucmVwbGFjZSh4dCwiIik6bnVsbD09ZT8iIjplOnZvaWQgMH19KSxTLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PVMuZmluZC5hdHRyKGUsInZhbHVlIik7cmV0dXJuIG51bGwhPXQ/dDp2dChTLnRleHQoZSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGk9ZS5vcHRpb25zLG89ZS5zZWxlY3RlZEluZGV4LGE9InNlbGVjdC1vbmUiPT09ZS50eXBlLHM9YT9udWxsOltdLHU9YT9vKzE6aS5sZW5ndGg7Zm9yKHI9bzwwP3U6YT9vOjA7cjx1O3IrKylpZigoKG49aVtyXSkuc2VsZWN0ZWR8fHI9PT1vKSYmIW4uZGlzYWJsZWQmJighbi5wYXJlbnROb2RlLmRpc2FibGVkfHwhQShuLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZih0PVMobikudmFsKCksYSlyZXR1cm4gdDtzLnB1c2godCl9cmV0dXJuIHN9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1lLm9wdGlvbnMsbz1TLm1ha2VBcnJheSh0KSxhPWkubGVuZ3RoO3doaWxlKGEtLSkoKHI9aVthXSkuc2VsZWN0ZWQ9LTE8Uy5pbkFycmF5KFMudmFsSG9va3Mub3B0aW9uLmdldChyKSxvKSkmJihuPSEwKTtyZXR1cm4gbnx8KGUuc2VsZWN0ZWRJbmRleD0tMSksb319fX0pLFMuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe1MudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIGUuY2hlY2tlZD0tMTxTLmluQXJyYXkoUyhlKS52YWwoKSx0KX19LHkuY2hlY2tPbnx8KFMudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjplLnZhbHVlfSl9KSx5LmZvY3VzaW49Im9uZm9jdXNpbiJpbiBDO3ZhciBidD0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sd3Q9ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKX07Uy5leHRlbmQoUy5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1LGwsYyxmLHA9W258fEVdLGQ9di5jYWxsKGUsInR5cGUiKT9lLnR5cGU6ZSxoPXYuY2FsbChlLCJuYW1lc3BhY2UiKT9lLm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKG89Zj1hPW49bnx8RSwzIT09bi5ub2RlVHlwZSYmOCE9PW4ubm9kZVR5cGUmJiFidC50ZXN0KGQrUy5ldmVudC50cmlnZ2VyZWQpJiYoLTE8ZC5pbmRleE9mKCIuIikmJihkPShoPWQuc3BsaXQoIi4iKSkuc2hpZnQoKSxoLnNvcnQoKSksdT1kLmluZGV4T2YoIjoiKTwwJiYib24iK2QsKGU9ZVtTLmV4cGFuZG9dP2U6bmV3IFMuRXZlbnQoZCwib2JqZWN0Ij09dHlwZW9mIGUmJmUpKS5pc1RyaWdnZXI9cj8yOjMsZS5uYW1lc3BhY2U9aC5qb2luKCIuIiksZS5ybmFtZXNwYWNlPWUubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK2guam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxlLnJlc3VsdD12b2lkIDAsZS50YXJnZXR8fChlLnRhcmdldD1uKSx0PW51bGw9PXQ/W2VdOlMubWFrZUFycmF5KHQsW2VdKSxjPVMuZXZlbnQuc3BlY2lhbFtkXXx8e30scnx8IWMudHJpZ2dlcnx8ITEhPT1jLnRyaWdnZXIuYXBwbHkobix0KSkpe2lmKCFyJiYhYy5ub0J1YmJsZSYmIXgobikpe2ZvcihzPWMuZGVsZWdhdGVUeXBlfHxkLGJ0LnRlc3QocytkKXx8KG89by5wYXJlbnROb2RlKTtvO289by5wYXJlbnROb2RlKXAucHVzaChvKSxhPW87YT09PShuLm93bmVyRG9jdW1lbnR8fEUpJiZwLnB1c2goYS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3d8fEMpfWk9MDt3aGlsZSgobz1wW2krK10pJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWY9byxlLnR5cGU9MTxpP3M6Yy5iaW5kVHlwZXx8ZCwobD0oWS5nZXQobywiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW2UudHlwZV0mJlkuZ2V0KG8sImhhbmRsZSIpKSYmbC5hcHBseShvLHQpLChsPXUmJm9bdV0pJiZsLmFwcGx5JiZWKG8pJiYoZS5yZXN1bHQ9bC5hcHBseShvLHQpLCExPT09ZS5yZXN1bHQmJmUucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGUudHlwZT1kLHJ8fGUuaXNEZWZhdWx0UHJldmVudGVkKCl8fGMuX2RlZmF1bHQmJiExIT09Yy5fZGVmYXVsdC5hcHBseShwLnBvcCgpLHQpfHwhVihuKXx8dSYmbShuW2RdKSYmIXgobikmJigoYT1uW3VdKSYmKG5bdV09bnVsbCksUy5ldmVudC50cmlnZ2VyZWQ9ZCxlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmYuYWRkRXZlbnRMaXN0ZW5lcihkLHd0KSxuW2RdKCksZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCx3dCksUy5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLGEmJihuW3VdPWEpKSxlLnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1TLmV4dGVuZChuZXcgUy5FdmVudCxuLHt0eXBlOmUsaXNTaW11bGF0ZWQ6ITB9KTtTLmV2ZW50LnRyaWdnZXIocixudWxsLHQpfX0pLFMuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQudHJpZ2dlcihlLHQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzWzBdO2lmKG4pcmV0dXJuIFMuZXZlbnQudHJpZ2dlcihlLHQsbiwhMCl9fSkseS5mb2N1c2lufHxTLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKG4scil7dmFyIGk9ZnVuY3Rpb24oZSl7Uy5ldmVudC5zaW11bGF0ZShyLGUudGFyZ2V0LFMuZXZlbnQuZml4KGUpKX07Uy5ldmVudC5zcGVjaWFsW3JdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcyx0PVkuYWNjZXNzKGUscik7dHx8ZS5hZGRFdmVudExpc3RlbmVyKG4saSwhMCksWS5hY2Nlc3MoZSxyLCh0fHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jdW1lbnR8fHRoaXMsdD1ZLmFjY2VzcyhlLHIpLTE7dD9ZLmFjY2VzcyhlLHIsdCk6KGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLGksITApLFkucmVtb3ZlKGUscikpfX19KTt2YXIgVHQ9Qy5sb2NhdGlvbixDdD17Z3VpZDpEYXRlLm5vdygpfSxFdD0vXD8vO1MucGFyc2VYTUw9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoIWV8fCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gbnVsbDt0cnl7dD0obmV3IEMuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoZSwidGV4dC94bWwiKX1jYXRjaChlKXt0PXZvaWQgMH1yZXR1cm4gdCYmIXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHxTLmVycm9yKCJJbnZhbGlkIFhNTDogIitlKSx0fTt2YXIgU3Q9L1xbXF0kLyxrdD0vXHI/XG4vZyxBdD0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksTnQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIER0KG4sZSxyLGkpe3ZhciB0O2lmKEFycmF5LmlzQXJyYXkoZSkpUy5lYWNoKGUsZnVuY3Rpb24oZSx0KXtyfHxTdC50ZXN0KG4pP2kobix0KTpEdChuKyJbIisoIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT10P2U6IiIpKyJdIix0LHIsaSl9KTtlbHNlIGlmKHJ8fCJvYmplY3QiIT09dyhlKSlpKG4sZSk7ZWxzZSBmb3IodCBpbiBlKUR0KG4rIlsiK3QrIl0iLGVbdF0scixpKX1TLnBhcmFtPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPWZ1bmN0aW9uKGUsdCl7dmFyIG49bSh0KT90KCk6dDtyW3IubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoZSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChudWxsPT1uPyIiOm4pfTtpZihudWxsPT1lKXJldHVybiIiO2lmKEFycmF5LmlzQXJyYXkoZSl8fGUuanF1ZXJ5JiYhUy5pc1BsYWluT2JqZWN0KGUpKVMuZWFjaChlLGZ1bmN0aW9uKCl7aSh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihuIGluIGUpRHQobixlW25dLHQsaSk7cmV0dXJuIHIuam9pbigiJiIpfSxTLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIFMucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT1TLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gZT9TLm1ha2VBcnJheShlKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFTKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmTnQudGVzdCh0aGlzLm5vZGVOYW1lKSYmIUF0LnRlc3QoZSkmJih0aGlzLmNoZWNrZWR8fCFwZS50ZXN0KGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPVModGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4/bnVsbDpBcnJheS5pc0FycmF5KG4pP1MubWFwKG4sZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6dC5uYW1lLHZhbHVlOmUucmVwbGFjZShrdCwiXHJcbiIpfX0pOntuYW1lOnQubmFtZSx2YWx1ZTpuLnJlcGxhY2Uoa3QsIlxyXG4iKX19KS5nZXQoKX19KTt2YXIganQ9LyUyMC9nLHF0PS8jLiokLyxMdD0vKFs/Jl0pXz1bXiZdKi8sSHQ9L14oLio/KTpbIFx0XSooW15cclxuXSopJC9nbSxPdD0vXig/OkdFVHxIRUFEKSQvLFB0PS9eXC9cLy8sUnQ9e30sTXQ9e30sSXQ9IiovIi5jb25jYXQoIioiKSxXdD1FLmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiBGdChvKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXsic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT0iKiIpO3ZhciBuLHI9MCxpPWUudG9Mb3dlckNhc2UoKS5tYXRjaChQKXx8W107aWYobSh0KSl3aGlsZShuPWlbcisrXSkiKyI9PT1uWzBdPyhuPW4uc2xpY2UoMSl8fCIqIiwob1tuXT1vW25dfHxbXSkudW5zaGlmdCh0KSk6KG9bbl09b1tuXXx8W10pLnB1c2godCl9fWZ1bmN0aW9uIEJ0KHQsaSxvLGEpe3ZhciBzPXt9LHU9dD09PU10O2Z1bmN0aW9uIGwoZSl7dmFyIHI7cmV0dXJuIHNbZV09ITAsUy5lYWNoKHRbZV18fFtdLGZ1bmN0aW9uKGUsdCl7dmFyIG49dChpLG8sYSk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBufHx1fHxzW25dP3U/IShyPW4pOnZvaWQgMDooaS5kYXRhVHlwZXMudW5zaGlmdChuKSxsKG4pLCExKX0pLHJ9cmV0dXJuIGwoaS5kYXRhVHlwZXNbMF0pfHwhc1siKiJdJiZsKCIqIil9ZnVuY3Rpb24gJHQoZSx0KXt2YXIgbixyLGk9Uy5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihuIGluIHQpdm9pZCAwIT09dFtuXSYmKChpW25dP2U6cnx8KHI9e30pKVtuXT10W25dKTtyZXR1cm4gciYmUy5leHRlbmQoITAsZSxyKSxlfVd0LmhyZWY9VHQuaHJlZixTLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6VHQuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8udGVzdChUdC5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpJdCx0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpKU09OLnBhcnNlLCJ0ZXh0IHhtbCI6Uy5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/JHQoJHQoZSxTLmFqYXhTZXR0aW5ncyksdCk6JHQoUy5hamF4U2V0dGluZ3MsZSl9LGFqYXhQcmVmaWx0ZXI6RnQoUnQpLGFqYXhUcmFuc3BvcnQ6RnQoTXQpLGFqYXg6ZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLHQ9dHx8e307dmFyIGMsZixwLG4sZCxyLGgsZyxpLG8sdj1TLmFqYXhTZXR1cCh7fSx0KSx5PXYuY29udGV4dHx8dixtPXYuY29udGV4dCYmKHkubm9kZVR5cGV8fHkuanF1ZXJ5KT9TKHkpOlMuZXZlbnQseD1TLkRlZmVycmVkKCksYj1TLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx3PXYuc3RhdHVzQ29kZXx8e30sYT17fSxzPXt9LHU9ImNhbmNlbGVkIixUPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoaCl7aWYoIW4pe249e307d2hpbGUodD1IdC5leGVjKHApKW5bdFsxXS50b0xvd2VyQ2FzZSgpKyIgIl09KG5bdFsxXS50b0xvd2VyQ2FzZSgpKyIgIl18fFtdKS5jb25jYXQodFsyXSl9dD1uW2UudG9Mb3dlckNhc2UoKSsiICJdfXJldHVybiBudWxsPT10P251bGw6dC5qb2luKCIsICIpfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gaD9wOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09aCYmKGU9c1tlLnRvTG93ZXJDYXNlKCldPXNbZS50b0xvd2VyQ2FzZSgpXXx8ZSxhW2VdPXQpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWgmJih2Lm1pbWVUeXBlPWUpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZSlpZihoKVQuYWx3YXlzKGVbVC5zdGF0dXNdKTtlbHNlIGZvcih0IGluIGUpd1t0XT1bd1t0XSxlW3RdXTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8dTtyZXR1cm4gYyYmYy5hYm9ydCh0KSxsKDAsdCksdGhpc319O2lmKHgucHJvbWlzZShUKSx2LnVybD0oKGV8fHYudXJsfHxUdC5ocmVmKSsiIikucmVwbGFjZShQdCxUdC5wcm90b2NvbCsiLy8iKSx2LnR5cGU9dC5tZXRob2R8fHQudHlwZXx8di5tZXRob2R8fHYudHlwZSx2LmRhdGFUeXBlcz0odi5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKFApfHxbIiJdLG51bGw9PXYuY3Jvc3NEb21haW4pe3I9RS5jcmVhdGVFbGVtZW50KCJhIik7dHJ5e3IuaHJlZj12LnVybCxyLmhyZWY9ci5ocmVmLHYuY3Jvc3NEb21haW49V3QucHJvdG9jb2wrIi8vIitXdC5ob3N0IT1yLnByb3RvY29sKyIvLyIrci5ob3N0fWNhdGNoKGUpe3YuY3Jvc3NEb21haW49ITB9fWlmKHYuZGF0YSYmdi5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiB2LmRhdGEmJih2LmRhdGE9Uy5wYXJhbSh2LmRhdGEsdi50cmFkaXRpb25hbCkpLEJ0KFJ0LHYsdCxUKSxoKXJldHVybiBUO2ZvcihpIGluKGc9Uy5ldmVudCYmdi5nbG9iYWwpJiYwPT1TLmFjdGl2ZSsrJiZTLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLHYudHlwZT12LnR5cGUudG9VcHBlckNhc2UoKSx2Lmhhc0NvbnRlbnQ9IU90LnRlc3Qodi50eXBlKSxmPXYudXJsLnJlcGxhY2UocXQsIiIpLHYuaGFzQ29udGVudD92LmRhdGEmJnYucHJvY2Vzc0RhdGEmJjA9PT0odi5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYodi5kYXRhPXYuZGF0YS5yZXBsYWNlKGp0LCIrIikpOihvPXYudXJsLnNsaWNlKGYubGVuZ3RoKSx2LmRhdGEmJih2LnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIHYuZGF0YSkmJihmKz0oRXQudGVzdChmKT8iJiI6Ij8iKSt2LmRhdGEsZGVsZXRlIHYuZGF0YSksITE9PT12LmNhY2hlJiYoZj1mLnJlcGxhY2UoTHQsIiQxIiksbz0oRXQudGVzdChmKT8iJiI6Ij8iKSsiXz0iK0N0Lmd1aWQrKytvKSx2LnVybD1mK28pLHYuaWZNb2RpZmllZCYmKFMubGFzdE1vZGlmaWVkW2ZdJiZULnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixTLmxhc3RNb2RpZmllZFtmXSksUy5ldGFnW2ZdJiZULnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLFMuZXRhZ1tmXSkpLCh2LmRhdGEmJnYuaGFzQ29udGVudCYmITEhPT12LmNvbnRlbnRUeXBlfHx0LmNvbnRlbnRUeXBlKSYmVC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLHYuY29udGVudFR5cGUpLFQuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0Iix2LmRhdGFUeXBlc1swXSYmdi5hY2NlcHRzW3YuZGF0YVR5cGVzWzBdXT92LmFjY2VwdHNbdi5kYXRhVHlwZXNbMF1dKygiKiIhPT12LmRhdGFUeXBlc1swXT8iLCAiK0l0KyI7IHE9MC4wMSI6IiIpOnYuYWNjZXB0c1siKiJdKSx2LmhlYWRlcnMpVC5zZXRSZXF1ZXN0SGVhZGVyKGksdi5oZWFkZXJzW2ldKTtpZih2LmJlZm9yZVNlbmQmJighMT09PXYuYmVmb3JlU2VuZC5jYWxsKHksVCx2KXx8aCkpcmV0dXJuIFQuYWJvcnQoKTtpZih1PSJhYm9ydCIsYi5hZGQodi5jb21wbGV0ZSksVC5kb25lKHYuc3VjY2VzcyksVC5mYWlsKHYuZXJyb3IpLGM9QnQoTXQsdix0LFQpKXtpZihULnJlYWR5U3RhdGU9MSxnJiZtLnRyaWdnZXIoImFqYXhTZW5kIixbVCx2XSksaClyZXR1cm4gVDt2LmFzeW5jJiYwPHYudGltZW91dCYmKGQ9Qy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VC5hYm9ydCgidGltZW91dCIpfSx2LnRpbWVvdXQpKTt0cnl7aD0hMSxjLnNlbmQoYSxsKX1jYXRjaChlKXtpZihoKXRocm93IGU7bCgtMSxlKX19ZWxzZSBsKC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiBsKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD10O2h8fChoPSEwLGQmJkMuY2xlYXJUaW1lb3V0KGQpLGM9dm9pZCAwLHA9cnx8IiIsVC5yZWFkeVN0YXRlPTA8ZT80OjAsaT0yMDA8PWUmJmU8MzAwfHwzMDQ9PT1lLG4mJihzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczt3aGlsZSgiKiI9PT11WzBdKXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj1lLm1pbWVUeXBlfHx0LmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IoaSBpbiBzKWlmKHNbaV0mJnNbaV0udGVzdChyKSl7dS51bnNoaWZ0KGkpO2JyZWFrfWlmKHVbMF1pbiBuKW89dVswXTtlbHNle2ZvcihpIGluIG4pe2lmKCF1WzBdfHxlLmNvbnZlcnRlcnNbaSsiICIrdVswXV0pe289aTticmVha31hfHwoYT1pKX1vPW98fGF9aWYobylyZXR1cm4gbyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dfSh2LFQsbikpLCFpJiYtMTxTLmluQXJyYXkoInNjcmlwdCIsdi5kYXRhVHlwZXMpJiYodi5jb252ZXJ0ZXJzWyJ0ZXh0IHNjcmlwdCJdPWZ1bmN0aW9uKCl7fSkscz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9e30sYz1lLmRhdGFUeXBlcy5zbGljZSgpO2lmKGNbMV0pZm9yKGEgaW4gZS5jb252ZXJ0ZXJzKWxbYS50b0xvd2VyQ2FzZSgpXT1lLmNvbnZlcnRlcnNbYV07bz1jLnNoaWZ0KCk7d2hpbGUobylpZihlLnJlc3BvbnNlRmllbGRzW29dJiYobltlLnJlc3BvbnNlRmllbGRzW29dXT10KSwhdSYmciYmZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSksdT1vLG89Yy5zaGlmdCgpKWlmKCIqIj09PW8pbz11O2Vsc2UgaWYoIioiIT09dSYmdSE9PW8pe2lmKCEoYT1sW3UrIiAiK29dfHxsWyIqICIrb10pKWZvcihpIGluIGwpaWYoKHM9aS5zcGxpdCgiICIpKVsxXT09PW8mJihhPWxbdSsiICIrc1swXV18fGxbIiogIitzWzBdXSkpeyEwPT09YT9hPWxbaV06ITAhPT1sW2ldJiYobz1zWzBdLGMudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoITAhPT1hKWlmKGEmJmVbInRocm93cyJdKXQ9YSh0KTtlbHNlIHRyeXt0PWEodCl9Y2F0Y2goZSl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6YT9lOiJObyBjb252ZXJzaW9uIGZyb20gIit1KyIgdG8gIitvfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOnR9fSh2LHMsVCxpKSxpPyh2LmlmTW9kaWZpZWQmJigodT1ULmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpJiYoUy5sYXN0TW9kaWZpZWRbZl09dSksKHU9VC5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpKSYmKFMuZXRhZ1tmXT11KSksMjA0PT09ZXx8IkhFQUQiPT09di50eXBlP2w9Im5vY29udGVudCI6MzA0PT09ZT9sPSJub3Rtb2RpZmllZCI6KGw9cy5zdGF0ZSxvPXMuZGF0YSxpPSEoYT1zLmVycm9yKSkpOihhPWwsIWUmJmx8fChsPSJlcnJvciIsZTwwJiYoZT0wKSkpLFQuc3RhdHVzPWUsVC5zdGF0dXNUZXh0PSh0fHxsKSsiIixpP3gucmVzb2x2ZVdpdGgoeSxbbyxsLFRdKTp4LnJlamVjdFdpdGgoeSxbVCxsLGFdKSxULnN0YXR1c0NvZGUodyksdz12b2lkIDAsZyYmbS50cmlnZ2VyKGk/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbVCx2LGk/bzphXSksYi5maXJlV2l0aCh5LFtULGxdKSxnJiYobS50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtULHZdKSwtLVMuYWN0aXZlfHxTLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gVH0sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFMuZ2V0KGUsdCxuLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbihlLHQpe3JldHVybiBTLmdldChlLHZvaWQgMCx0LCJzY3JpcHQiKX19KSxTLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSxpKXtTW2ldPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBtKHQpJiYocj1yfHxuLG49dCx0PXZvaWQgMCksUy5hamF4KFMuZXh0ZW5kKHt1cmw6ZSx0eXBlOmksZGF0YVR5cGU6cixkYXRhOnQsc3VjY2VzczpufSxTLmlzUGxhaW5PYmplY3QoZSkmJmUpKX19KSxTLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZS5oZWFkZXJzKSJjb250ZW50LXR5cGUiPT09dC50b0xvd2VyQ2FzZSgpJiYoZS5jb250ZW50VHlwZT1lLmhlYWRlcnNbdF18fCIiKX0pLFMuX2V2YWxVcmw9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBTLmFqYXgoe3VybDplLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsY2FjaGU6ITAsYXN5bmM6ITEsZ2xvYmFsOiExLGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oKXt9fSxkYXRhRmlsdGVyOmZ1bmN0aW9uKGUpe1MuZ2xvYmFsRXZhbChlLHQsbil9fSl9LFMuZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0aGlzWzBdJiYobShlKSYmKGU9ZS5jYWxsKHRoaXNbMF0pKSx0PVMoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJnQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLHQubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpczt3aGlsZShlLmZpcnN0RWxlbWVudENoaWxkKWU9ZS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gZX0pLmFwcGVuZCh0aGlzKSksdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKG4pe3JldHVybiBtKG4pP3RoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLndyYXBJbm5lcihuLmNhbGwodGhpcyxlKSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1TKHRoaXMpLHQ9ZS5jb250ZW50cygpO3QubGVuZ3RoP3Qud3JhcEFsbChuKTplLmFwcGVuZChuKX0pfSx3cmFwOmZ1bmN0aW9uKHQpe3ZhciBuPW0odCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLndyYXBBbGwobj90LmNhbGwodGhpcyxlKTp0KX0pfSx1bndyYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucGFyZW50KGUpLm5vdCgiYm9keSIpLmVhY2goZnVuY3Rpb24oKXtTKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KSx0aGlzfX0pLFMuZXhwci5wc2V1ZG9zLmhpZGRlbj1mdW5jdGlvbihlKXtyZXR1cm4hUy5leHByLnBzZXVkb3MudmlzaWJsZShlKX0sUy5leHByLnBzZXVkb3MudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4hIShlLm9mZnNldFdpZHRofHxlLm9mZnNldEhlaWdodHx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCl9LFMuYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IEMuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goZSl7fX07dmFyIF90PXswOjIwMCwxMjIzOjIwNH0senQ9Uy5hamF4U2V0dGluZ3MueGhyKCk7eS5jb3JzPSEhenQmJiJ3aXRoQ3JlZGVudGlhbHMiaW4genQseS5hamF4PXp0PSEhenQsUy5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGkpe3ZhciBvLGE7aWYoeS5jb3JzfHx6dCYmIWkuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkueGhyKCk7aWYoci5vcGVuKGkudHlwZSxpLnVybCxpLmFzeW5jLGkudXNlcm5hbWUsaS5wYXNzd29yZCksaS54aHJGaWVsZHMpZm9yKG4gaW4gaS54aHJGaWVsZHMpcltuXT1pLnhockZpZWxkc1tuXTtmb3IobiBpbiBpLm1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUmJnIub3ZlcnJpZGVNaW1lVHlwZShpLm1pbWVUeXBlKSxpLmNyb3NzRG9tYWlufHxlWyJYLVJlcXVlc3RlZC1XaXRoIl18fChlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0IiksZSlyLnNldFJlcXVlc3RIZWFkZXIobixlW25dKTtvPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe28mJihvPWE9ci5vbmxvYWQ9ci5vbmVycm9yPXIub25hYm9ydD1yLm9udGltZW91dD1yLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLCJhYm9ydCI9PT1lP3IuYWJvcnQoKToiZXJyb3IiPT09ZT8ibnVtYmVyIiE9dHlwZW9mIHIuc3RhdHVzP3QoMCwiZXJyb3IiKTp0KHIuc3RhdHVzLHIuc3RhdHVzVGV4dCk6dChfdFtyLnN0YXR1c118fHIuc3RhdHVzLHIuc3RhdHVzVGV4dCwidGV4dCIhPT0oci5yZXNwb25zZVR5cGV8fCJ0ZXh0Iil8fCJzdHJpbmciIT10eXBlb2Ygci5yZXNwb25zZVRleHQ/e2JpbmFyeTpyLnJlc3BvbnNlfTp7dGV4dDpyLnJlc3BvbnNlVGV4dH0sci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0sci5vbmxvYWQ9bygpLGE9ci5vbmVycm9yPXIub250aW1lb3V0PW8oImVycm9yIiksdm9pZCAwIT09ci5vbmFib3J0P3Iub25hYm9ydD1hOnIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09PXIucmVhZHlTdGF0ZSYmQy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7byYmYSgpfSl9LG89bygiYWJvcnQiKTt0cnl7ci5zZW5kKGkuaGFzQ29udGVudCYmaS5kYXRhfHxudWxsKX1jYXRjaChlKXtpZihvKXRocm93IGV9fSxhYm9ydDpmdW5jdGlvbigpe28mJm8oKX19fSksUy5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGUpe2UuY3Jvc3NEb21haW4mJihlLmNvbnRlbnRzLnNjcmlwdD0hMSl9KSxTLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L1xiKD86amF2YXxlY21hKXNjcmlwdFxiL30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihlKXtyZXR1cm4gUy5nbG9iYWxFdmFsKGUpLGV9fX0pLFMuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihlKXt2b2lkIDA9PT1lLmNhY2hlJiYoZS5jYWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIil9KSxTLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24obil7dmFyIHIsaTtpZihuLmNyb3NzRG9tYWlufHxuLnNjcmlwdEF0dHJzKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsdCl7cj1TKCI8c2NyaXB0PiIpLmF0dHIobi5zY3JpcHRBdHRyc3x8e30pLnByb3Aoe2NoYXJzZXQ6bi5zY3JpcHRDaGFyc2V0LHNyYzpuLnVybH0pLm9uKCJsb2FkIGVycm9yIixpPWZ1bmN0aW9uKGUpe3IucmVtb3ZlKCksaT1udWxsLGUmJnQoImVycm9yIj09PWUudHlwZT80MDQ6MjAwLGUudHlwZSl9KSxFLmhlYWQuYXBwZW5kQ2hpbGQoclswXSl9LGFib3J0OmZ1bmN0aW9uKCl7aSYmaSgpfX19KTt2YXIgVXQsWHQ9W10sVnQ9Lyg9KVw/KD89JnwkKXxcP1w/LztTLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9WHQucG9wKCl8fFMuZXhwYW5kbysiXyIrQ3QuZ3VpZCsrO3JldHVybiB0aGlzW2VdPSEwLGV9fSksUy5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9ITEhPT1lLmpzb25wJiYoVnQudGVzdChlLnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiBlLmRhdGEmJjA9PT0oZS5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZWdC50ZXN0KGUuZGF0YSkmJiJkYXRhIik7aWYoYXx8Impzb25wIj09PWUuZGF0YVR5cGVzWzBdKXJldHVybiByPWUuanNvbnBDYWxsYmFjaz1tKGUuanNvbnBDYWxsYmFjayk/ZS5qc29ucENhbGxiYWNrKCk6ZS5qc29ucENhbGxiYWNrLGE/ZVthXT1lW2FdLnJlcGxhY2UoVnQsIiQxIityKTohMSE9PWUuanNvbnAmJihlLnVybCs9KEV0LnRlc3QoZS51cmwpPyImIjoiPyIpK2UuanNvbnArIj0iK3IpLGUuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBvfHxTLmVycm9yKHIrIiB3YXMgbm90IGNhbGxlZCIpLG9bMF19LGUuZGF0YVR5cGVzWzBdPSJqc29uIixpPUNbcl0sQ1tyXT1mdW5jdGlvbigpe289YXJndW1lbnRzfSxuLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PWk/UyhDKS5yZW1vdmVQcm9wKHIpOkNbcl09aSxlW3JdJiYoZS5qc29ucENhbGxiYWNrPXQuanNvbnBDYWxsYmFjayxYdC5wdXNoKHIpKSxvJiZtKGkpJiZpKG9bMF0pLG89aT12b2lkIDB9KSwic2NyaXB0In0pLHkuY3JlYXRlSFRNTERvY3VtZW50PSgoVXQ9RS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLmJvZHkpLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1VdC5jaGlsZE5vZGVzLmxlbmd0aCksUy5wYXJzZUhUTUw9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiJzdHJpbmciIT10eXBlb2YgZT9bXTooImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKSx0fHwoeS5jcmVhdGVIVE1MRG9jdW1lbnQ/KChyPSh0PUUuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKSkuY3JlYXRlRWxlbWVudCgiYmFzZSIpKS5ocmVmPUUubG9jYXRpb24uaHJlZix0LmhlYWQuYXBwZW5kQ2hpbGQocikpOnQ9RSksbz0hbiYmW10sKGk9Ti5leGVjKGUpKT9bdC5jcmVhdGVFbGVtZW50KGlbMV0pXTooaT14ZShbZV0sdCxvKSxvJiZvLmxlbmd0aCYmUyhvKS5yZW1vdmUoKSxTLm1lcmdlKFtdLGkuY2hpbGROb2RlcykpKTt2YXIgcixpLG99LFMuZm4ubG9hZD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9dGhpcyxzPWUuaW5kZXhPZigiICIpO3JldHVybi0xPHMmJihyPXZ0KGUuc2xpY2UocykpLGU9ZS5zbGljZSgwLHMpKSxtKHQpPyhuPXQsdD12b2lkIDApOnQmJiJvYmplY3QiPT10eXBlb2YgdCYmKGk9IlBPU1QiKSwwPGEubGVuZ3RoJiZTLmFqYXgoe3VybDplLHR5cGU6aXx8IkdFVCIsZGF0YVR5cGU6Imh0bWwiLGRhdGE6dH0pLmRvbmUoZnVuY3Rpb24oZSl7bz1hcmd1bWVudHMsYS5odG1sKHI/UygiPGRpdj4iKS5hcHBlbmQoUy5wYXJzZUhUTUwoZSkpLmZpbmQocik6ZSl9KS5hbHdheXMobiYmZnVuY3Rpb24oZSx0KXthLmVhY2goZnVuY3Rpb24oKXtuLmFwcGx5KHRoaXMsb3x8W2UucmVzcG9uc2VUZXh0LHQsZV0pfSl9KSx0aGlzfSxTLmV4cHIucHNldWRvcy5hbmltYXRlZD1mdW5jdGlvbih0KXtyZXR1cm4gUy5ncmVwKFMudGltZXJzLGZ1bmN0aW9uKGUpe3JldHVybiB0PT09ZS5lbGVtfSkubGVuZ3RofSxTLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbD1TLmNzcyhlLCJwb3NpdGlvbiIpLGM9UyhlKSxmPXt9OyJzdGF0aWMiPT09bCYmKGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1jLm9mZnNldCgpLG89Uy5jc3MoZSwidG9wIiksdT1TLmNzcyhlLCJsZWZ0IiksKCJhYnNvbHV0ZSI9PT1sfHwiZml4ZWQiPT09bCkmJi0xPChvK3UpLmluZGV4T2YoImF1dG8iKT8oYT0ocj1jLnBvc2l0aW9uKCkpLnRvcCxpPXIubGVmdCk6KGE9cGFyc2VGbG9hdChvKXx8MCxpPXBhcnNlRmxvYXQodSl8fDApLG0odCkmJih0PXQuY2FsbChlLG4sUy5leHRlbmQoe30scykpKSxudWxsIT10LnRvcCYmKGYudG9wPXQudG9wLXMudG9wK2EpLG51bGwhPXQubGVmdCYmKGYubGVmdD10LmxlZnQtcy5sZWZ0K2kpLCJ1c2luZyJpbiB0P3QudXNpbmcuY2FsbChlLGYpOigibnVtYmVyIj09dHlwZW9mIGYudG9wJiYoZi50b3ArPSJweCIpLCJudW1iZXIiPT10eXBlb2YgZi5sZWZ0JiYoZi5sZWZ0Kz0icHgiKSxjLmNzcyhmKSl9fSxTLmZuLmV4dGVuZCh7b2Zmc2V0OmZ1bmN0aW9uKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMD09PXQ/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uy5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsdCxlKX0pO3ZhciBlLG4scj10aGlzWzBdO3JldHVybiByP3IuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGg/KGU9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldyx7dG9wOmUudG9wK24ucGFnZVlPZmZzZXQsbGVmdDplLmxlZnQrbi5wYWdlWE9mZnNldH0pOnt0b3A6MCxsZWZ0OjB9OnZvaWQgMH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgZSx0LG4scj10aGlzWzBdLGk9e3RvcDowLGxlZnQ6MH07aWYoImZpeGVkIj09PVMuY3NzKHIsInBvc2l0aW9uIikpdD1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Vsc2V7dD10aGlzLm9mZnNldCgpLG49ci5vd25lckRvY3VtZW50LGU9ci5vZmZzZXRQYXJlbnR8fG4uZG9jdW1lbnRFbGVtZW50O3doaWxlKGUmJihlPT09bi5ib2R5fHxlPT09bi5kb2N1bWVudEVsZW1lbnQpJiYic3RhdGljIj09PVMuY3NzKGUsInBvc2l0aW9uIikpZT1lLnBhcmVudE5vZGU7ZSYmZSE9PXImJjE9PT1lLm5vZGVUeXBlJiYoKGk9UyhlKS5vZmZzZXQoKSkudG9wKz1TLmNzcyhlLCJib3JkZXJUb3BXaWR0aCIsITApLGkubGVmdCs9Uy5jc3MoZSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpfXJldHVybnt0b3A6dC50b3AtaS50b3AtUy5jc3MociwibWFyZ2luVG9wIiwhMCksbGVmdDp0LmxlZnQtaS5sZWZ0LVMuY3NzKHIsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9mZnNldFBhcmVudDt3aGlsZShlJiYic3RhdGljIj09PVMuY3NzKGUsInBvc2l0aW9uIikpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8cmV9KX19KSxTLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24odCxpKXt2YXIgbz0icGFnZVlPZmZzZXQiPT09aTtTLmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKHgoZSk/cj1lOjk9PT1lLm5vZGVUeXBlJiYocj1lLmRlZmF1bHRWaWV3KSx2b2lkIDA9PT1uKXJldHVybiByP3JbaV06ZVt0XTtyP3Iuc2Nyb2xsVG8obz9yLnBhZ2VYT2Zmc2V0Om4sbz9uOnIucGFnZVlPZmZzZXQpOmVbdF09bn0sdCxlLGFyZ3VtZW50cy5sZW5ndGgpfX0pLFMuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihlLG4pe1MuY3NzSG9va3Nbbl09JGUoeS5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gdD1CZShlLG4pLE1lLnRlc3QodCk/UyhlKS5wb3NpdGlvbigpW25dKyJweCI6dH0pfSksUy5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxzKXtTLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6cywiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKHIsbyl7Uy5mbltvXT1mdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGgmJihyfHwiYm9vbGVhbiIhPXR5cGVvZiBlKSxpPXJ8fCghMD09PWV8fCEwPT09dD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIHgoZSk/MD09PW8uaW5kZXhPZigib3V0ZXIiKT9lWyJpbm5lciIrYV06ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWUubm9kZVR5cGU/KHI9ZS5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoZS5ib2R5WyJzY3JvbGwiK2FdLHJbInNjcm9sbCIrYV0sZS5ib2R5WyJvZmZzZXQiK2FdLHJbIm9mZnNldCIrYV0sclsiY2xpZW50IithXSkpOnZvaWQgMD09PW4/Uy5jc3MoZSx0LGkpOlMuc3R5bGUoZSx0LG4saSl9LHMsbj9lOnZvaWQgMCxuKX19KX0pLFMuZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGUsdCl7Uy5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vbih0LGUpfX0pLFMuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vbihlLG51bGwsdCxuKX0sdW5iaW5kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub2ZmKGUsbnVsbCx0KX0sZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24odCxlLG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihlLCIqKiIpOnRoaXMub2ZmKHQsZXx8IioqIixuKX0saG92ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodHx8ZSl9fSksUy5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsbil7Uy5mbltuXT1mdW5jdGlvbihlLHQpe3JldHVybiAwPGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vbihuLG51bGwsZSx0KTp0aGlzLnRyaWdnZXIobil9fSk7dmFyIEd0PS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZztTLnByb3h5PWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKG49ZVt0XSx0PWUsZT1uKSxtKGUpKXJldHVybiByPXMuY2FsbChhcmd1bWVudHMsMiksKGk9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0fHx0aGlzLHIuY29uY2F0KHMuY2FsbChhcmd1bWVudHMpKSl9KS5ndWlkPWUuZ3VpZD1lLmd1aWR8fFMuZ3VpZCsrLGl9LFMuaG9sZFJlYWR5PWZ1bmN0aW9uKGUpe2U/Uy5yZWFkeVdhaXQrKzpTLnJlYWR5KCEwKX0sUy5pc0FycmF5PUFycmF5LmlzQXJyYXksUy5wYXJzZUpTT049SlNPTi5wYXJzZSxTLm5vZGVOYW1lPUEsUy5pc0Z1bmN0aW9uPW0sUy5pc1dpbmRvdz14LFMuY2FtZWxDYXNlPVgsUy50eXBlPXcsUy5ub3c9RGF0ZS5ub3csUy5pc051bWVyaWM9ZnVuY3Rpb24oZSl7dmFyIHQ9Uy50eXBlKGUpO3JldHVybigibnVtYmVyIj09PXR8fCJzdHJpbmciPT09dCkmJiFpc05hTihlLXBhcnNlRmxvYXQoZSkpfSxTLnRyaW09ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6KGUrIiIpLnJlcGxhY2UoR3QsIiIpfSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gU30pO3ZhciBZdD1DLmpRdWVyeSxRdD1DLiQ7cmV0dXJuIFMubm9Db25mbGljdD1mdW5jdGlvbihlKXtyZXR1cm4gQy4kPT09UyYmKEMuJD1RdCksZSYmQy5qUXVlcnk9PT1TJiYoQy5qUXVlcnk9WXQpLFN9LCJ1bmRlZmluZWQiPT10eXBlb2YgZSYmKEMualF1ZXJ5PUMuJD1TKSxTfSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAqIGpRdWVyeSBUZW1wbGF0ZXMgUGx1Z2luIDEuMC4wcHJlCiAqIGh0dHA6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdG1wbAogKiBSZXF1aXJlcyBqUXVlcnkgMS40LjIKICoKICogQ29weXJpZ2h0IFNvZnR3YXJlIEZyZWVkb20gQ29uc2VydmFuY3ksIEluYy4KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICovCihmdW5jdGlvbihhKXt2YXIgcj1hLmZuLmRvbU1hbmlwLGQ9Il90bXBsaXRlbSIscT0vXltePF0qKDxbXHdcV10rPilbXj5dKiR8XHtce1whIC8sYj17fSxmPXt9LGUscD17a2V5OjAsZGF0YTp7fX0saT0wLGM9MCxsPVtdO2Z1bmN0aW9uIGcoZyxkLGgsZSl7dmFyIGM9e2RhdGE6ZXx8KGU9PT0wfHxlPT09ZmFsc2UpP2U6ZD9kLmRhdGE6e30sX3dyYXA6ZD9kLl93cmFwOm51bGwsdG1wbDpudWxsLHBhcmVudDpkfHxudWxsLG5vZGVzOltdLGNhbGxzOnUsbmVzdDp3LHdyYXA6eCxodG1sOnYsdXBkYXRlOnR9O2cmJmEuZXh0ZW5kKGMsZyx7bm9kZXM6W10scGFyZW50OmR9KTtpZihoKXtjLnRtcGw9aDtjLl9jdG50PWMuX2N0bnR8fGMudG1wbChhLGMpO2Mua2V5PSsraTsobC5sZW5ndGg/ZjpiKVtpXT1jfXJldHVybiBjfWEuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGYsZCl7YS5mbltmXT1mdW5jdGlvbihuKXt2YXIgZz1bXSxpPWEobiksayxoLG0sbCxqPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2U9Ynx8e307aWYoaiYmai5ub2RlVHlwZT09PTExJiZqLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmaS5sZW5ndGg9PT0xKXtpW2RdKHRoaXNbMF0pO2c9dGhpc31lbHNle2ZvcihoPTAsbT1pLmxlbmd0aDtoPG07aCsrKXtjPWg7az0oaD4wP3RoaXMuY2xvbmUodHJ1ZSk6dGhpcykuZ2V0KCk7YShpW2hdKVtkXShrKTtnPWcuY29uY2F0KGspfWM9MDtnPXRoaXMucHVzaFN0YWNrKGcsZixpLnNlbGVjdG9yKX1sPWU7ZT1udWxsO2EudG1wbC5jb21wbGV0ZShsKTtyZXR1cm4gZ319KTthLmZuLmV4dGVuZCh7dG1wbDpmdW5jdGlvbihkLGMsYil7cmV0dXJuIGEudG1wbCh0aGlzWzBdLGQsYyxiKX0sdG1wbEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gYS50bXBsSXRlbSh0aGlzWzBdKX0sdGVtcGxhdGU6ZnVuY3Rpb24oYil7cmV0dXJuIGEudGVtcGxhdGUoYix0aGlzWzBdKX0sZG9tTWFuaXA6ZnVuY3Rpb24oZCxtLGspe2lmKGRbMF0mJmEuaXNBcnJheShkWzBdKSl7dmFyIGc9YS5tYWtlQXJyYXkoYXJndW1lbnRzKSxoPWRbMF0saj1oLmxlbmd0aCxpPTAsZjt3aGlsZShpPGomJiEoZj1hLmRhdGEoaFtpKytdLCJ0bXBsSXRlbSIpKSk7aWYoZiYmYylnWzJdPWZ1bmN0aW9uKGIpe2EudG1wbC5hZnRlck1hbmlwKHRoaXMsYixrKX07ci5hcHBseSh0aGlzLGcpfWVsc2Ugci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Yz0wOyFlJiZhLnRtcGwuY29tcGxldGUoYik7cmV0dXJuIHRoaXN9fSk7YS5leHRlbmQoe3RtcGw6ZnVuY3Rpb24oZCxoLGUsYyl7dmFyIGksaz0hYztpZihrKXtjPXA7ZD1hLnRlbXBsYXRlW2RdfHxhLnRlbXBsYXRlKG51bGwsZCk7Zj17fX1lbHNlIGlmKCFkKXtkPWMudG1wbDtiW2Mua2V5XT1jO2Mubm9kZXM9W107Yy53cmFwcGVkJiZuKGMsYy53cmFwcGVkKTtyZXR1cm4gYShqKGMsbnVsbCxjLnRtcGwoYSxjKSkpfWlmKCFkKXJldHVybltdO2lmKHR5cGVvZiBoPT09ImZ1bmN0aW9uIiloPWguY2FsbChjfHx7fSk7ZSYmZS53cmFwcGVkJiZuKGUsZS53cmFwcGVkKTtpPWEuaXNBcnJheShoKT9hLm1hcChoLGZ1bmN0aW9uKGEpe3JldHVybiBhP2coZSxjLGQsYSk6bnVsbH0pOltnKGUsYyxkLGgpXTtyZXR1cm4gaz9hKGooYyxudWxsLGkpKTppfSx0bXBsSXRlbTpmdW5jdGlvbihiKXt2YXIgYztpZihiIGluc3RhbmNlb2YgYSliPWJbMF07d2hpbGUoYiYmYi5ub2RlVHlwZT09PTEmJiEoYz1hLmRhdGEoYiwidG1wbEl0ZW0iKSkmJihiPWIucGFyZW50Tm9kZSkpO3JldHVybiBjfHxwfSx0ZW1wbGF0ZTpmdW5jdGlvbihjLGIpe2lmKGIpe2lmKHR5cGVvZiBiPT09InN0cmluZyIpYj1vKGIpO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIGEpYj1iWzBdfHx7fTtpZihiLm5vZGVUeXBlKWI9YS5kYXRhKGIsInRtcGwiKXx8YS5kYXRhKGIsInRtcGwiLG8oYi5pbm5lckhUTUwpKTtyZXR1cm4gdHlwZW9mIGM9PT0ic3RyaW5nIj8oYS50ZW1wbGF0ZVtjXT1iKTpifXJldHVybiBjP3R5cGVvZiBjIT09InN0cmluZyI/YS50ZW1wbGF0ZShudWxsLGMpOmEudGVtcGxhdGVbY118fGEudGVtcGxhdGUobnVsbCxxLnRlc3QoYyk/YzphKGMpKTpudWxsfSxlbmNvZGU6ZnVuY3Rpb24oYSl7cmV0dXJuKCIiK2EpLnNwbGl0KCImIikuam9pbigiJmFtcDsiKS5zcGxpdCgiPCIpLmpvaW4oIiZsdDsiKS5zcGxpdCgiPiIpLmpvaW4oIiZndDsiKS5zcGxpdCgnIicpLmpvaW4oIiYjMzQ7Iikuc3BsaXQoIiciKS5qb2luKCImIzM5OyIpfX0pO2EuZXh0ZW5kKGEudG1wbCx7dGFnOnt0bXBsOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiJpZigkbm90bnVsbF8xKXtfXz1fXy5jb25jYXQoJGl0ZW0ubmVzdCgkMSwkMikpO30ifSx3cmFwOntfZGVmYXVsdDp7JDI6Im51bGwifSxvcGVuOiIkaXRlbS5jYWxscyhfXywkMSwkMik7X189W107IixjbG9zZToiY2FsbD0kaXRlbS5jYWxscygpO19fPWNhbGwuXy5jb25jYXQoJGl0ZW0ud3JhcChjYWxsLF9fKSk7In0sZWFjaDp7X2RlZmF1bHQ6eyQyOiIkaW5kZXgsICR2YWx1ZSJ9LG9wZW46ImlmKCRub3RudWxsXzEpeyQuZWFjaCgkMWEsZnVuY3Rpb24oJDIpe3dpdGgodGhpcyl7IixjbG9zZToifX0pO30ifSwiaWYiOntvcGVuOiJpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsiLGNsb3NlOiJ9In0sImVsc2UiOntfZGVmYXVsdDp7JDE6InRydWUifSxvcGVuOiJ9ZWxzZSBpZigoJG5vdG51bGxfMSkgJiYgJDFhKXsifSxodG1sOntvcGVuOiJpZigkbm90bnVsbF8xKXtfXy5wdXNoKCQxYSk7fSJ9LCI9Ijp7X2RlZmF1bHQ6eyQxOiIkZGF0YSJ9LG9wZW46ImlmKCRub3RudWxsXzEpe19fLnB1c2goJC5lbmNvZGUoJDFhKSk7fSJ9LCIhIjp7b3BlbjoiIn19LGNvbXBsZXRlOmZ1bmN0aW9uKCl7Yj17fX0sYWZ0ZXJNYW5pcDpmdW5jdGlvbihmLGIsZCl7dmFyIGU9Yi5ub2RlVHlwZT09PTExP2EubWFrZUFycmF5KGIuY2hpbGROb2Rlcyk6Yi5ub2RlVHlwZT09PTE/W2JdOltdO2QuY2FsbChmLGIpO20oZSk7YysrfX0pO2Z1bmN0aW9uIGooZSxnLGYpe3ZhciBiLGM9Zj9hLm1hcChmLGZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgYT09PSJzdHJpbmciP2Uua2V5P2EucmVwbGFjZSgvKDxcdyspKD89W1xzPl0pKD8hW14+XSpfdG1wbGl0ZW0pKFtePl0qKS9nLCIkMSAiK2QrJz0iJytlLmtleSsnIiAkMicpOmE6aihhLGUsYS5fY3RudCl9KTplO2lmKGcpcmV0dXJuIGM7Yz1jLmpvaW4oIiIpO2MucmVwbGFjZSgvXlxzKihbXjxcc11bXjxdKik/KDxbXHdcV10rPikoW14+XSpbXj5cc10pP1xzKiQvLGZ1bmN0aW9uKGYsYyxlLGQpe2I9YShlKS5nZXQoKTttKGIpO2lmKGMpYj1rKGMpLmNvbmNhdChiKTtpZihkKWI9Yi5jb25jYXQoayhkKSl9KTtyZXR1cm4gYj9iOmsoYyl9ZnVuY3Rpb24gayhjKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlubmVySFRNTD1jO3JldHVybiBhLm1ha2VBcnJheShiLmNoaWxkTm9kZXMpfWZ1bmN0aW9uIG8oYil7cmV0dXJuIG5ldyBGdW5jdGlvbigialF1ZXJ5IiwiJGl0ZW0iLCJ2YXIgJD1qUXVlcnksY2FsbCxfXz1bXSwkZGF0YT0kaXRlbS5kYXRhO3dpdGgoJGRhdGEpe19fLnB1c2goJyIrYS50cmltKGIpLnJlcGxhY2UoLyhbXFwnXSkvZywiXFwkMSIpLnJlcGxhY2UoL1tcclx0XG5dL2csIiAiKS5yZXBsYWNlKC9cJFx7KFteXH1dKilcfS9nLCJ7ez0gJDF9fSIpLnJlcGxhY2UoL1x7XHsoXC8/KShcdyt8LikoPzpcKCgoPzpbXlx9XXxcfSg/IVx9KSkqPyk/XCkpPyg/OlxzKyguKj8pPyk/KFwoKCg/OlteXH1dfFx9KD8hXH0pKSo/KVwpKT9ccypcfVx9L2csZnVuY3Rpb24obSxsLGssZyxiLGMsZCl7dmFyIGo9YS50bXBsLnRhZ1trXSxpLGUsZjtpZighail0aHJvdyJVbmtub3duIHRlbXBsYXRlIHRhZzogIitrO2k9ai5fZGVmYXVsdHx8W107aWYoYyYmIS9cdyQvLnRlc3QoYikpe2IrPWM7Yz0iIn1pZihiKXtiPWgoYik7ZD1kPyIsIitoKGQpKyIpIjpjPyIpIjoiIjtlPWM/Yi5pbmRleE9mKCIuIik+LTE/YitoKGMpOiIoIitiKyIpLmNhbGwoJGl0ZW0iK2Q6YjtmPWM/ZToiKHR5cGVvZigiK2IrIik9PT0nZnVuY3Rpb24nPygiK2IrIikuY2FsbCgkaXRlbSk6KCIrYisiKSkifWVsc2UgZj1lPWkuJDF8fCJudWxsIjtnPWgoZyk7cmV0dXJuIicpOyIraltsPyJjbG9zZSI6Im9wZW4iXS5zcGxpdCgiJG5vdG51bGxfMSIpLmpvaW4oYj8idHlwZW9mKCIrYisiKSE9PSd1bmRlZmluZWQnICYmICgiK2IrIikhPW51bGwiOiJ0cnVlIikuc3BsaXQoIiQxYSIpLmpvaW4oZikuc3BsaXQoIiQxIikuam9pbihlKS5zcGxpdCgiJDIiKS5qb2luKGd8fGkuJDJ8fCIiKSsiX18ucHVzaCgnIn0pKyInKTt9cmV0dXJuIF9fOyIpfWZ1bmN0aW9uIG4oYyxiKXtjLl93cmFwPWooYyx0cnVlLGEuaXNBcnJheShiKT9iOltxLnRlc3QoYik/YjphKGIpLmh0bWwoKV0pLmpvaW4oIiIpfWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGE/YS5yZXBsYWNlKC9cXCcvZywiJyIpLnJlcGxhY2UoL1xcXFwvZywiXFwiKTpudWxsfWZ1bmN0aW9uIHMoYil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5hcHBlbmRDaGlsZChiLmNsb25lTm9kZSh0cnVlKSk7cmV0dXJuIGEuaW5uZXJIVE1MfWZ1bmN0aW9uIG0obyl7dmFyIG49Il8iK2MsayxqLGw9e30sZSxwLGg7Zm9yKGU9MCxwPW8ubGVuZ3RoO2U8cDtlKyspe2lmKChrPW9bZV0pLm5vZGVUeXBlIT09MSljb250aW51ZTtqPWsuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTtmb3IoaD1qLmxlbmd0aC0xO2g+PTA7aC0tKW0oaltoXSk7bShrKX1mdW5jdGlvbiBtKGope3ZhciBwLGg9aixrLGUsbTtpZihtPWouZ2V0QXR0cmlidXRlKGQpKXt3aGlsZShoLnBhcmVudE5vZGUmJihoPWgucGFyZW50Tm9kZSkubm9kZVR5cGU9PT0xJiYhKHA9aC5nZXRBdHRyaWJ1dGUoZCkpKTtpZihwIT09bSl7aD1oLnBhcmVudE5vZGU/aC5ub2RlVHlwZT09PTExPzA6aC5nZXRBdHRyaWJ1dGUoZCl8fDA6MDtpZighKGU9YlttXSkpe2U9ZlttXTtlPWcoZSxiW2hdfHxmW2hdKTtlLmtleT0rK2k7YltpXT1lfWMmJm8obSl9ai5yZW1vdmVBdHRyaWJ1dGUoZCl9ZWxzZSBpZihjJiYoZT1hLmRhdGEoaiwidG1wbEl0ZW0iKSkpe28oZS5rZXkpO2JbZS5rZXldPWU7aD1hLmRhdGEoai5wYXJlbnROb2RlLCJ0bXBsSXRlbSIpO2g9aD9oLmtleTowfWlmKGUpe2s9ZTt3aGlsZShrJiZrLmtleSE9aCl7ay5ub2Rlcy5wdXNoKGopO2s9ay5wYXJlbnR9ZGVsZXRlIGUuX2N0bnQ7ZGVsZXRlIGUuX3dyYXA7YS5kYXRhKGosInRtcGxJdGVtIixlKX1mdW5jdGlvbiBvKGEpe2E9YStuO2U9bFthXT1sW2FdfHxnKGUsYltlLnBhcmVudC5rZXkrbl18fGUucGFyZW50KX19fWZ1bmN0aW9uIHUoYSxkLGMsYil7aWYoIWEpcmV0dXJuIGwucG9wKCk7bC5wdXNoKHtfOmEsdG1wbDpkLGl0ZW06dGhpcyxkYXRhOmMsb3B0aW9uczpifSl9ZnVuY3Rpb24gdyhkLGMsYil7cmV0dXJuIGEudG1wbChhLnRlbXBsYXRlKGQpLGMsYix0aGlzKX1mdW5jdGlvbiB4KGIsZCl7dmFyIGM9Yi5vcHRpb25zfHx7fTtjLndyYXBwZWQ9ZDtyZXR1cm4gYS50bXBsKGEudGVtcGxhdGUoYi50bXBsKSxiLmRhdGEsYyxiLml0ZW0pfWZ1bmN0aW9uIHYoZCxjKXt2YXIgYj10aGlzLl93cmFwO3JldHVybiBhLm1hcChhKGEuaXNBcnJheShiKT9iLmpvaW4oIiIpOmIpLmZpbHRlcihkfHwiKiIpLGZ1bmN0aW9uKGEpe3JldHVybiBjP2EuaW5uZXJUZXh0fHxhLnRleHRDb250ZW50OmEub3V0ZXJIVE1MfHxzKGEpfSl9ZnVuY3Rpb24gdCgpe3ZhciBiPXRoaXMubm9kZXM7YS50bXBsKG51bGwsbnVsbCxudWxsLHRoaXMpLmluc2VydEJlZm9yZShiWzBdKTthKGIpLnJlbW92ZSgpfX0pKGpRdWVyeSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiFmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImpxdWVyeSJdLGUpOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWUocmVxdWlyZSgianF1ZXJ5IikpOmUoalF1ZXJ5KX0oZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1lLnRhYmxlc29ydGVyPXt2ZXJzaW9uOiIyLjMwLjUiLHBhcnNlcnM6W10sd2lkZ2V0czpbXSxkZWZhdWx0czp7dGhlbWU6ImRlZmF1bHQiLHdpZHRoRml4ZWQ6ITEsc2hvd1Byb2Nlc3Npbmc6ITEsaGVhZGVyVGVtcGxhdGU6Intjb250ZW50fSIsb25SZW5kZXJUZW1wbGF0ZTpudWxsLG9uUmVuZGVySGVhZGVyOm51bGwsY2FuY2VsU2VsZWN0aW9uOiEwLHRhYkluZGV4OiEwLGRhdGVGb3JtYXQ6Im1tZGR5eXl5Iixzb3J0TXVsdGlTb3J0S2V5OiJzaGlmdEtleSIsc29ydFJlc2V0S2V5OiJjdHJsS2V5Iix1c051bWJlckZvcm1hdDohMCxkZWxheUluaXQ6ITEsc2VydmVyU2lkZVNvcnRpbmc6ITEscmVzb3J0OiEwLGhlYWRlcnM6e30saWdub3JlQ2FzZTohMCxzb3J0Rm9yY2U6bnVsbCxzb3J0TGlzdDpbXSxzb3J0QXBwZW5kOm51bGwsc29ydFN0YWJsZTohMSxzb3J0SW5pdGlhbE9yZGVyOiJhc2MiLHNvcnRMb2NhbGVDb21wYXJlOiExLHNvcnRSZXNldDohMSxzb3J0UmVzdGFydDohMSxlbXB0eVRvOiJib3R0b20iLHN0cmluZ1RvOiJtYXgiLGR1cGxpY2F0ZVNwYW46ITAsdGV4dEV4dHJhY3Rpb246ImJhc2ljIix0ZXh0QXR0cmlidXRlOiJkYXRhLXRleHQiLHRleHRTb3J0ZXI6bnVsbCxudW1iZXJTb3J0ZXI6bnVsbCxpbml0V2lkZ2V0czohMCx3aWRnZXRDbGFzczoid2lkZ2V0LXtuYW1lfSIsd2lkZ2V0czpbXSx3aWRnZXRPcHRpb25zOnt6ZWJyYTpbImV2ZW4iLCJvZGQiXX0saW5pdGlhbGl6ZWQ6bnVsbCx0YWJsZUNsYXNzOiIiLGNzc0FzYzoiIixjc3NEZXNjOiIiLGNzc05vbmU6IiIsY3NzSGVhZGVyOiIiLGNzc0hlYWRlclJvdzoiIixjc3NQcm9jZXNzaW5nOiIiLGNzc0NoaWxkUm93OiJ0YWJsZXNvcnRlci1jaGlsZFJvdyIsY3NzSW5mb0Jsb2NrOiJ0YWJsZXNvcnRlci1pbmZvT25seSIsY3NzTm9Tb3J0OiJ0YWJsZXNvcnRlci1ub1NvcnQiLGNzc0lnbm9yZVJvdzoidGFibGVzb3J0ZXItaWdub3JlUm93Iixjc3NJY29uOiJ0YWJsZXNvcnRlci1pY29uIixjc3NJY29uTm9uZToiIixjc3NJY29uQXNjOiIiLGNzc0ljb25EZXNjOiIiLGNzc0ljb25EaXNhYmxlZDoiIixwb2ludGVyQ2xpY2s6ImNsaWNrIixwb2ludGVyRG93bjoibW91c2Vkb3duIixwb2ludGVyVXA6Im1vdXNldXAiLHNlbGVjdG9ySGVhZGVyczoiPiB0aGVhZCB0aCwgPiB0aGVhZCB0ZCIsc2VsZWN0b3JTb3J0OiJ0aCwgdGQiLHNlbGVjdG9yUmVtb3ZlOiIucmVtb3ZlLW1lIixkZWJ1ZzohMSxoZWFkZXJMaXN0OltdLGVtcHRpZXM6e30sc3RyaW5nczp7fSxwYXJzZXJzOltdLGdsb2JhbGl6ZTowLGltZ0F0dHI6MH0sY3NzOnt0YWJsZToidGFibGVzb3J0ZXIiLGNzc0hhc0NoaWxkOiJ0YWJsZXNvcnRlci1oYXNDaGlsZFJvdyIsY2hpbGRSb3c6InRhYmxlc29ydGVyLWNoaWxkUm93Iixjb2xncm91cDoidGFibGVzb3J0ZXItY29sZ3JvdXAiLGhlYWRlcjoidGFibGVzb3J0ZXItaGVhZGVyIixoZWFkZXJSb3c6InRhYmxlc29ydGVyLWhlYWRlclJvdyIsaGVhZGVySW46InRhYmxlc29ydGVyLWhlYWRlci1pbm5lciIsaWNvbjoidGFibGVzb3J0ZXItaWNvbiIscHJvY2Vzc2luZzoidGFibGVzb3J0ZXItcHJvY2Vzc2luZyIsc29ydEFzYzoidGFibGVzb3J0ZXItaGVhZGVyQXNjIixzb3J0RGVzYzoidGFibGVzb3J0ZXItaGVhZGVyRGVzYyIsc29ydE5vbmU6InRhYmxlc29ydGVyLWhlYWRlclVuU29ydGVkIn0sbGFuZ3VhZ2U6e3NvcnRBc2M6IkFzY2VuZGluZyBzb3J0IGFwcGxpZWQsICIsc29ydERlc2M6IkRlc2NlbmRpbmcgc29ydCBhcHBsaWVkLCAiLHNvcnROb25lOiJObyBzb3J0IGFwcGxpZWQsICIsc29ydERpc2FibGVkOiJzb3J0aW5nIGlzIGRpc2FibGVkIixuZXh0QXNjOiJhY3RpdmF0ZSB0byBhcHBseSBhbiBhc2NlbmRpbmcgc29ydCIsbmV4dERlc2M6ImFjdGl2YXRlIHRvIGFwcGx5IGEgZGVzY2VuZGluZyBzb3J0IixuZXh0Tm9uZToiYWN0aXZhdGUgdG8gcmVtb3ZlIHRoZSBzb3J0In0scmVnZXg6e3RlbXBsYXRlQ29udGVudDovXHtjb250ZW50XH0vZyx0ZW1wbGF0ZUljb246L1x7aWNvblx9L2csdGVtcGxhdGVOYW1lOi9ce25hbWVcfS9pLHNwYWNlczovXHMrL2csbm9uV29yZDovXFcvZyxmb3JtRWxlbWVudHM6LyhpbnB1dHxzZWxlY3R8YnV0dG9ufHRleHRhcmVhKS9pLGNodW5rOi8oXihbK1wtXT8oPzpcZCopKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPyk/JHxeMHhbMC05YS1mXSskfFxkKykvZ2ksY2h1bmtzOi8oXlxcMHxcXDAkKS8saGV4Oi9eMHhbMC05YS1mXSskL2ksY29tbWE6LywvZyxkaWdpdE5vblVTOi9bXHN8XC5dL2csZGlnaXROZWdhdGl2ZVRlc3Q6L15ccypcKFsuXGRdK1wpLyxkaWdpdE5lZ2F0aXZlUmVwbGFjZTovXlxzKlwoKFsuXGRdKylcKS8sZGlnaXRUZXN0Oi9eW1wtKyhdP1xkK1spXT8kLyxkaWdpdFJlcGxhY2U6L1ssLiciXHNdL2d9LHN0cmluZzp7bWF4OjEsbWluOi0xLGVtcHR5bWluOjEsZW1wdHltYXg6LTEsemVybzowLG5vbmU6MCwibnVsbCI6MCx0b3A6ITAsYm90dG9tOiExfSxrZXlDb2Rlczp7ZW50ZXI6MTN9LGRhdGVzOnt9LGluc3RhbmNlTWV0aG9kczp7fSxzZXR1cDpmdW5jdGlvbihyLG8pe2lmKHImJnIudEhlYWQmJjAhPT1yLnRCb2RpZXMubGVuZ3RoJiYhMCE9PXIuaGFzSW5pdGlhbGl6ZWQpe3ZhciBzPSIiLGE9ZShyKSxuPWUubWV0YWRhdGE7ci5oYXNJbml0aWFsaXplZD0hMSxyLmlzUHJvY2Vzc2luZz0hMCxyLmNvbmZpZz1vLGUuZGF0YShyLCJ0YWJsZXNvcnRlciIsbyksdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIkluaXRpYWxpemluZyB0YWJsZXNvcnRlciB2Iit0LnZlcnNpb24pLGUuZGF0YShyLCJzdGFydG92ZXJhbGx0aW1lciIsbmV3IERhdGUpKSxvLnN1cHBvcnRzRGF0YU9iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4gZVswXT1wYXJzZUludChlWzBdLDEwKSxlWzBdPjF8fDE9PT1lWzBdJiZwYXJzZUludChlWzFdLDEwKT49NH0oZS5mbi5qcXVlcnkuc3BsaXQoIi4iKSksby5lbXB0eVRvPW8uZW1wdHlUby50b0xvd2VyQ2FzZSgpLG8uc3RyaW5nVG89by5zdHJpbmdUby50b0xvd2VyQ2FzZSgpLG8ubGFzdD17c29ydExpc3Q6W10sY2xpY2tlZEluZGV4Oi0xfSwvdGFibGVzb3J0ZXJcLS8udGVzdChhLmF0dHIoImNsYXNzIikpfHwocz0iIiE9PW8udGhlbWU/IiB0YWJsZXNvcnRlci0iK28udGhlbWU6IiIpLG8ubmFtZXNwYWNlP28ubmFtZXNwYWNlPSIuIitvLm5hbWVzcGFjZS5yZXBsYWNlKHQucmVnZXgubm9uV29yZCwiIik6by5uYW1lc3BhY2U9Ii50YWJsZXNvcnRlciIrTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc2xpY2UoMiksby50YWJsZT1yLG8uJHRhYmxlPWEuYWRkQ2xhc3ModC5jc3MudGFibGUrIiAiK28udGFibGVDbGFzcytzKyIgIitvLm5hbWVzcGFjZS5zbGljZSgxKSkuYXR0cigicm9sZSIsImdyaWQiKSxvLiRoZWFkZXJzPWEuZmluZChvLnNlbGVjdG9ySGVhZGVycyksby4kdGFibGUuY2hpbGRyZW4oKS5jaGlsZHJlbigidHIiKS5hdHRyKCJyb2xlIiwicm93Iiksby4kdGJvZGllcz1hLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrby5jc3NJbmZvQmxvY2srIikiKS5hdHRyKHsiYXJpYS1saXZlIjoicG9saXRlIiwiYXJpYS1yZWxldmFudCI6ImFsbCJ9KSxvLiR0YWJsZS5jaGlsZHJlbigiY2FwdGlvbiIpLmxlbmd0aCYmKChzPW8uJHRhYmxlLmNoaWxkcmVuKCJjYXB0aW9uIilbMF0pLmlkfHwocy5pZD1vLm5hbWVzcGFjZS5zbGljZSgxKSsiY2FwdGlvbiIpLG8uJHRhYmxlLmF0dHIoImFyaWEtbGFiZWxsZWRieSIscy5pZCkpLG8ud2lkZ2V0SW5pdD17fSxvLnRleHRFeHRyYWN0aW9uPW8uJHRhYmxlLmF0dHIoImRhdGEtdGV4dC1leHRyYWN0aW9uIil8fG8udGV4dEV4dHJhY3Rpb258fCJiYXNpYyIsdC5idWlsZEhlYWRlcnMobyksdC5maXhDb2x1bW5XaWR0aChyKSx0LmFkZFdpZGdldEZyb21DbGFzcyhyKSx0LmFwcGx5V2lkZ2V0T3B0aW9ucyhyKSx0LnNldHVwUGFyc2VycyhvKSxvLnRvdGFsUm93cz0wLG8uZGVidWcmJnQudmFsaWRhdGVPcHRpb25zKG8pLG8uZGVsYXlJbml0fHx0LmJ1aWxkQ2FjaGUobyksdC5iaW5kRXZlbnRzKHIsby4kaGVhZGVycywhMCksdC5iaW5kTWV0aG9kcyhvKSxvLnN1cHBvcnRzRGF0YU9iamVjdCYmdm9pZCAwIT09YS5kYXRhKCkuc29ydGxpc3Q/by5zb3J0TGlzdD1hLmRhdGEoKS5zb3J0bGlzdDpuJiZhLm1ldGFkYXRhKCkmJmEubWV0YWRhdGEoKS5zb3J0bGlzdCYmKG8uc29ydExpc3Q9YS5tZXRhZGF0YSgpLnNvcnRsaXN0KSx0LmFwcGx5V2lkZ2V0KHIsITApLG8uc29ydExpc3QubGVuZ3RoPjA/dC5zb3J0T24obyxvLnNvcnRMaXN0LHt9LCFvLmluaXRXaWRnZXRzKToodC5zZXRIZWFkZXJzQ3NzKG8pLG8uaW5pdFdpZGdldHMmJnQuYXBwbHlXaWRnZXQociwhMSkpLG8uc2hvd1Byb2Nlc3NpbmcmJmEudW5iaW5kKCJzb3J0QmVnaW4iK28ubmFtZXNwYWNlKyIgc29ydEVuZCIrby5uYW1lc3BhY2UpLmJpbmQoInNvcnRCZWdpbiIrby5uYW1lc3BhY2UrIiBzb3J0RW5kIitvLm5hbWVzcGFjZSxmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoby50aW1lclByb2Nlc3NpbmcpLHQuaXNQcm9jZXNzaW5nKHIpLCJzb3J0QmVnaW4iPT09ZS50eXBlJiYoby50aW1lclByb2Nlc3Npbmc9c2V0VGltZW91dChmdW5jdGlvbigpe3QuaXNQcm9jZXNzaW5nKHIsITApfSw1MDApKX0pLHIuaGFzSW5pdGlhbGl6ZWQ9ITAsci5pc1Byb2Nlc3Npbmc9ITEsdC5kZWJ1ZyhvLCJjb3JlIikmJihjb25zb2xlLmxvZygiT3ZlcmFsbCBpbml0aWFsaXphdGlvbiB0aW1lOiIrdC5iZW5jaG1hcmsoZS5kYXRhKHIsInN0YXJ0b3ZlcmFsbHRpbWVyIikpKSx0LmRlYnVnKG8sImNvcmUiKSYmY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpKSxhLnRyaWdnZXJIYW5kbGVyKCJ0YWJsZXNvcnRlci1pbml0aWFsaXplZCIsciksImZ1bmN0aW9uIj09dHlwZW9mIG8uaW5pdGlhbGl6ZWQmJm8uaW5pdGlhbGl6ZWQocil9ZWxzZSB0LmRlYnVnKG8sImNvcmUiKSYmKHIuaGFzSW5pdGlhbGl6ZWQ/Y29uc29sZS53YXJuKCJTdG9wcGluZyBpbml0aWFsaXphdGlvbi4gVGFibGVzb3J0ZXIgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCIpOmNvbnNvbGUuZXJyb3IoIlN0b3BwaW5nIGluaXRpYWxpemF0aW9uISBObyB0YWJsZSwgdGhlYWQgb3IgdGJvZHkiLHIpKX0sYmluZE1ldGhvZHM6ZnVuY3Rpb24ocil7dmFyIG89ci4kdGFibGUscz1yLm5hbWVzcGFjZSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgYWRkUm93cyB1cGRhdGVDZWxsIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyBkZXN0cm95IG1vdXNldXAgbW91c2VsZWF2ZSAiLnNwbGl0KCIgIikuam9pbihzKyIgIik7by51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLmJpbmQoInNvcnRSZXNldCIrcyxmdW5jdGlvbihlLHIpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5zb3J0UmVzZXQodGhpcy5jb25maWcsZnVuY3Rpb24oZSl7ZS5pc0FwcGx5aW5nV2lkZ2V0cz9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5hcHBseVdpZGdldChlLCIiLHIpfSwxMDApOnQuYXBwbHlXaWRnZXQoZSwiIixyKX0pfSkuYmluZCgidXBkYXRlQWxsIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQWxsKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGUiK3MrIiB1cGRhdGVSb3dzIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJ1cGRhdGVIZWFkZXJzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZUhlYWRlcnModGhpcy5jb25maWcscil9KS5iaW5kKCJ1cGRhdGVDZWxsIitzLGZ1bmN0aW9uKGUscixvLHMpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC51cGRhdGVDZWxsKHRoaXMuY29uZmlnLHIsbyxzKX0pLmJpbmQoImFkZFJvd3MiK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFkZFJvd3ModGhpcy5jb25maWcscixvLHMpfSkuYmluZCgidXBkYXRlQ29tcGxldGUiK3MsZnVuY3Rpb24oKXt0aGlzLmlzVXBkYXRpbmc9ITF9KS5iaW5kKCJzb3J0b24iK3MsZnVuY3Rpb24oZSxyLG8scyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnNvcnRPbih0aGlzLmNvbmZpZyxyLG8scyl9KS5iaW5kKCJhcHBlbmRDYWNoZSIrcyxmdW5jdGlvbihyLG8scyl7ci5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGVuZENhY2hlKHRoaXMuY29uZmlnLHMpLGUuaXNGdW5jdGlvbihvKSYmbyh0aGlzKX0pLmJpbmQoInVwZGF0ZUNhY2hlIitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQ2FjaGUodGhpcy5jb25maWcscixvKX0pLmJpbmQoImFwcGx5V2lkZ2V0SWQiK3MsZnVuY3Rpb24oZSxyKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuYXBwbHlXaWRnZXRJZCh0aGlzLHIpfSkuYmluZCgiYXBwbHlXaWRnZXRzIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGx5V2lkZ2V0KHRoaXMsITEscil9KS5iaW5kKCJyZWZyZXNoV2lkZ2V0cyIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlZnJlc2hXaWRnZXRzKHRoaXMscixvKX0pLmJpbmQoInJlbW92ZVdpZGdldCIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnJlbW92ZVdpZGdldCh0aGlzLHIsbyl9KS5iaW5kKCJkZXN0cm95IitzLGZ1bmN0aW9uKGUscixvKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuZGVzdHJveSh0aGlzLHIsbyl9KS5iaW5kKCJyZXNldFRvTG9hZFN0YXRlIitzLGZ1bmN0aW9uKG8pe28uc3RvcFByb3BhZ2F0aW9uKCksdC5yZW1vdmVXaWRnZXQodGhpcywhMCwhMSk7dmFyIHM9ZS5leHRlbmQoITAse30sci5vcmlnaW5hbFNldHRpbmdzKTsocj1lLmV4dGVuZCghMCx7fSx0LmRlZmF1bHRzLHMpKS5vcmlnaW5hbFNldHRpbmdzPXMsdGhpcy5oYXNJbml0aWFsaXplZD0hMSx0LnNldHVwKHRoaXMscil9KX0sYmluZEV2ZW50czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbj0ocj1lKHIpWzBdKS5jb25maWcsaT1uLm5hbWVzcGFjZSxsPW51bGw7ITAhPT1zJiYoby5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfaGVhZGVycyIpLChhPXQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpKS5sZW5ndGgmJiJUQUJMRSI9PT1hWzBdLm5vZGVOYW1lJiZhWzBdIT09ciYmZShhWzBdKS5hZGRDbGFzcyhpLnNsaWNlKDEpKyJfZXh0cmFfdGFibGUiKSksYT0obi5wb2ludGVyRG93bisiICIrbi5wb2ludGVyVXArIiAiK24ucG9pbnRlckNsaWNrKyIgc29ydCBrZXl1cCAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikuc3BsaXQoIiAiKS5qb2luKGkrIiAiKSxvLmZpbmQobi5zZWxlY3RvclNvcnQpLmFkZChvLmZpbHRlcihuLnNlbGVjdG9yU29ydCkpLnVuYmluZChhKS5iaW5kKGEsZnVuY3Rpb24ocixvKXt2YXIgcyxhLGksZD1lKHIudGFyZ2V0KSxjPSIgIityLnR5cGUrIiAiO2lmKCEoMSE9PShyLndoaWNofHxyLmJ1dHRvbikmJiFjLm1hdGNoKCIgIituLnBvaW50ZXJDbGljaysiIHwgc29ydCB8IGtleXVwICIpfHwiIGtleXVwICI9PT1jJiZyLndoaWNoIT09dC5rZXlDb2Rlcy5lbnRlcnx8Yy5tYXRjaCgiICIrbi5wb2ludGVyQ2xpY2srIiAiKSYmdm9pZCAwIT09ci53aGljaHx8Yy5tYXRjaCgiICIrbi5wb2ludGVyVXArIiAiKSYmbCE9PXIudGFyZ2V0JiYhMCE9PW8pKXtpZihjLm1hdGNoKCIgIituLnBvaW50ZXJEb3duKyIgIikpcmV0dXJuIGw9ci50YXJnZXQsdm9pZCgiMSI9PT0oaT1kLmpxdWVyeS5zcGxpdCgiLiIpKVswXSYmaVsxXTw0JiZyLnByZXZlbnREZWZhdWx0KCkpO2lmKGw9bnVsbCxzPXQuZ2V0Q2xvc2VzdChlKHRoaXMpLCIuIit0LmNzcy5oZWFkZXIpLHQucmVnZXguZm9ybUVsZW1lbnRzLnRlc3Qoci50YXJnZXQubm9kZU5hbWUpfHxkLmhhc0NsYXNzKG4uY3NzTm9Tb3J0KXx8ZC5wYXJlbnRzKCIuIituLmNzc05vU29ydCkubGVuZ3RoPjB8fHMuaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHxkLnBhcmVudHMoImJ1dHRvbiIpLmxlbmd0aD4wKXJldHVybiFuLmNhbmNlbFNlbGVjdGlvbjtuLmRlbGF5SW5pdCYmdC5pc0VtcHR5T2JqZWN0KG4uY2FjaGUpJiZ0LmJ1aWxkQ2FjaGUobiksbi5sYXN0LmNsaWNrZWRJbmRleD1zLmF0dHIoImRhdGEtY29sdW1uIil8fHMuaW5kZXgoKSwoYT1uLiRoZWFkZXJJbmRleGVkW24ubGFzdC5jbGlja2VkSW5kZXhdWzBdKSYmIWEuc29ydERpc2FibGVkJiZ0LmluaXRTb3J0KG4sYSxyKX19KSxuLmNhbmNlbFNlbGVjdGlvbiYmby5hdHRyKCJ1bnNlbGVjdGFibGUiLCJvbiIpLmJpbmQoInNlbGVjdHN0YXJ0IiwhMSkuY3NzKHsidXNlci1zZWxlY3QiOiJub25lIixNb3pVc2VyU2VsZWN0OiJub25lIn0pfSxidWlsZEhlYWRlcnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG47Zm9yKHIuaGVhZGVyTGlzdD1bXSxyLmhlYWRlckNvbnRlbnQ9W10sci5zb3J0VmFycz1bXSx0LmRlYnVnKHIsImNvcmUiKSYmKGE9bmV3IERhdGUpLHIuY29sdW1ucz10LmNvbXB1dGVDb2x1bW5JbmRleChyLiR0YWJsZS5jaGlsZHJlbigidGhlYWQsIHRmb290IikuY2hpbGRyZW4oInRyIikpLHM9ci5jc3NJY29uPyc8aSBjbGFzcz0iJysoci5jc3NJY29uPT09dC5jc3MuaWNvbj90LmNzcy5pY29uOnIuY3NzSWNvbisiICIrdC5jc3MuaWNvbikrJyI+PC9pPic6IiIsci4kaGVhZGVycz1lKGUubWFwKHIuJHRhYmxlLmZpbmQoci5zZWxlY3RvckhlYWRlcnMpLGZ1bmN0aW9uKG8sYSl7dmFyIG4saSxsLGQsYyxnPWUobyk7aWYoIXQuZ2V0Q2xvc2VzdChnLCJ0ciIpLmhhc0NsYXNzKHIuY3NzSWdub3JlUm93KSlyZXR1cm4vKHRofHRkKS9pLnRlc3Qoby5ub2RlTmFtZSl8fChjPXQuZ2V0Q2xvc2VzdChnLCJ0aCwgdGQiKSxnLmF0dHIoImRhdGEtY29sdW1uIixjLmF0dHIoImRhdGEtY29sdW1uIikpKSxuPXQuZ2V0Q29sdW1uRGF0YShyLnRhYmxlLHIuaGVhZGVycyxhLCEwKSxyLmhlYWRlckNvbnRlbnRbYV09Zy5odG1sKCksIiI9PT1yLmhlYWRlclRlbXBsYXRlfHxnLmZpbmQoIi4iK3QuY3NzLmhlYWRlckluKS5sZW5ndGh8fChkPXIuaGVhZGVyVGVtcGxhdGUucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlQ29udGVudCxnLmh0bWwoKSkucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlSWNvbixnLmZpbmQoIi4iK3QuY3NzLmljb24pLmxlbmd0aD8iIjpzKSxyLm9uUmVuZGVyVGVtcGxhdGUmJihpPXIub25SZW5kZXJUZW1wbGF0ZS5hcHBseShnLFthLGRdKSkmJiJzdHJpbmciPT10eXBlb2YgaSYmKGQ9aSksZy5odG1sKCc8ZGl2IGNsYXNzPSInK3QuY3NzLmhlYWRlckluKyciPicrZCsiPC9kaXY+IikpLHIub25SZW5kZXJIZWFkZXImJnIub25SZW5kZXJIZWFkZXIuYXBwbHkoZyxbYSxyLHIuJHRhYmxlXSksbD1wYXJzZUludChnLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG8uY29sdW1uPWwsYz10LmdldE9yZGVyKHQuZ2V0RGF0YShnLG4sInNvcnRJbml0aWFsT3JkZXIiKXx8ci5zb3J0SW5pdGlhbE9yZGVyKSxyLnNvcnRWYXJzW2xdPXtjb3VudDotMSxvcmRlcjpjP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxsb2NrZWRPcmRlcjohMX0sdm9pZCAwIT09KGM9dC5nZXREYXRhKGcsbiwibG9ja2VkT3JkZXIiKXx8ITEpJiYhMSE9PWMmJihyLnNvcnRWYXJzW2xdLmxvY2tlZE9yZGVyPSEwLHIuc29ydFZhcnNbbF0ub3JkZXI9dC5nZXRPcmRlcihjKT9bMSwxXTpbMCwwXSksci5oZWFkZXJMaXN0W2FdPW8sZy5hZGRDbGFzcyh0LmNzcy5oZWFkZXIrIiAiK3IuY3NzSGVhZGVyKSx0LmdldENsb3Nlc3QoZywidHIiKS5hZGRDbGFzcyh0LmNzcy5oZWFkZXJSb3crIiAiK3IuY3NzSGVhZGVyUm93KS5hdHRyKCJyb2xlIiwicm93Iiksci50YWJJbmRleCYmZy5hdHRyKCJ0YWJpbmRleCIsMCksb30pKSxyLiRoZWFkZXJJbmRleGVkPVtdLG49MDtuPHIuY29sdW1ucztuKyspdC5pc0VtcHR5T2JqZWN0KHIuc29ydFZhcnNbbl0pJiYoci5zb3J0VmFyc1tuXT17fSksbz1yLiRoZWFkZXJzLmZpbHRlcignW2RhdGEtY29sdW1uPSInK24rJyJdJyksci4kaGVhZGVySW5kZXhlZFtuXT1vLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmxlbmd0aD9vLm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcigiOmxhc3QiKTpvLmZpbHRlcigiOmxhc3QiKTplKCk7ci4kdGFibGUuZmluZChyLnNlbGVjdG9ySGVhZGVycykuYXR0cih7c2NvcGU6ImNvbCIscm9sZToiY29sdW1uaGVhZGVyIn0pLHQudXBkYXRlSGVhZGVyKHIpLHQuZGVidWcociwiY29yZSIpJiYoY29uc29sZS5sb2coIkJ1aWx0IGhlYWRlcnM6Iit0LmJlbmNobWFyayhhKSksY29uc29sZS5sb2coci4kaGVhZGVycykpfSxhZGRJbnN0YW5jZU1ldGhvZHM6ZnVuY3Rpb24ocil7ZS5leHRlbmQodC5pbnN0YW5jZU1ldGhvZHMscil9LHNldHVwUGFyc2VyczpmdW5jdGlvbihlLHIpe3ZhciBvLHMsYSxuLGksbCxkLGMsZyxwLHUsZixoLG0sYj1lLnRhYmxlLHk9MCx3PXQuZGVidWcoZSwiY29yZSIpLHg9e307aWYoZS4kdGJvZGllcz1lLiR0YWJsZS5jaGlsZHJlbigidGJvZHk6bm90KC4iK2UuY3NzSW5mb0Jsb2NrKyIpIiksaD12b2lkIDA9PT1yP2UuJHRib2RpZXM6ciwwPT09KG09aC5sZW5ndGgpKXJldHVybiB3P2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgcGFyc2VyIGNhY2hlIik6IiI7Zm9yKHcmJihmPW5ldyBEYXRlLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiRGV0ZWN0aW5nIHBhcnNlcnMgZm9yIGVhY2ggY29sdW1uIikpLHM9e2V4dHJhY3RvcnM6W10scGFyc2VyczpbXX07eTxtOyl7aWYoKG89aFt5XS5yb3dzKS5sZW5ndGgpZm9yKGk9MCxuPWUuY29sdW1ucyxsPTA7bDxuO2wrKyl7aWYoKGQ9ZS4kaGVhZGVySW5kZXhlZFtpXSkmJmQubGVuZ3RoJiYoYz10LmdldENvbHVtbkRhdGEoYixlLmhlYWRlcnMsaSksdT10LmdldFBhcnNlckJ5SWQodC5nZXREYXRhKGQsYywiZXh0cmFjdG9yIikpLHA9dC5nZXRQYXJzZXJCeUlkKHQuZ2V0RGF0YShkLGMsInNvcnRlciIpKSxnPSJmYWxzZSI9PT10LmdldERhdGEoZCxjLCJwYXJzZXIiKSxlLmVtcHRpZXNbaV09KHQuZ2V0RGF0YShkLGMsImVtcHR5Iil8fGUuZW1wdHlUb3x8KGUuZW1wdHlUb0JvdHRvbT8iYm90dG9tIjoidG9wIikpLnRvTG93ZXJDYXNlKCksZS5zdHJpbmdzW2ldPSh0LmdldERhdGEoZCxjLCJzdHJpbmciKXx8ZS5zdHJpbmdUb3x8Im1heCIpLnRvTG93ZXJDYXNlKCksZyYmKHA9dC5nZXRQYXJzZXJCeUlkKCJuby1wYXJzZXIiKSksdXx8KHU9ITEpLHB8fChwPXQuZGV0ZWN0UGFyc2VyRm9yQ29sdW1uKGUsbywtMSxpKSksdyYmKHhbIigiK2krIikgIitkLnRleHQoKV09e3BhcnNlcjpwLmlkLGV4dHJhY3Rvcjp1P3UuaWQ6Im5vbmUiLHN0cmluZzplLnN0cmluZ3NbaV0sZW1wdHk6ZS5lbXB0aWVzW2ldfSkscy5wYXJzZXJzW2ldPXAscy5leHRyYWN0b3JzW2ldPXUsKGE9ZFswXS5jb2xTcGFuLTEpPjApKWZvcihpKz1hLG4rPWE7YSsxPjA7KXMucGFyc2Vyc1tpLWFdPXAscy5leHRyYWN0b3JzW2ktYV09dSxhLS07aSsrfXkrPXMucGFyc2Vycy5sZW5ndGg/bToxfXcmJih0LmlzRW1wdHlPYmplY3QoeCk/Y29uc29sZS53YXJuKCIgIE5vIHBhcnNlcnMgZGV0ZWN0ZWQhIik6Y29uc29sZVtjb25zb2xlLnRhYmxlPyJ0YWJsZSI6ImxvZyJdKHgpLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgZGV0ZWN0aW5nIHBhcnNlcnMiK3QuYmVuY2htYXJrKGYpKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpLGUucGFyc2Vycz1zLnBhcnNlcnMsZS5leHRyYWN0b3JzPXMuZXh0cmFjdG9yc30sYWRkUGFyc2VyOmZ1bmN0aW9uKGUpe3ZhciByLG89dC5wYXJzZXJzLmxlbmd0aCxzPSEwO2ZvcihyPTA7cjxvO3IrKyl0LnBhcnNlcnNbcl0uaWQudG9Mb3dlckNhc2UoKT09PWUuaWQudG9Mb3dlckNhc2UoKSYmKHM9ITEpO3MmJih0LnBhcnNlcnNbdC5wYXJzZXJzLmxlbmd0aF09ZSl9LGdldFBhcnNlckJ5SWQ6ZnVuY3Rpb24oZSl7aWYoImZhbHNlIj09ZSlyZXR1cm4hMTt2YXIgcixvPXQucGFyc2Vycy5sZW5ndGg7Zm9yKHI9MDtyPG87cisrKWlmKHQucGFyc2Vyc1tyXS5pZC50b0xvd2VyQ2FzZSgpPT09ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHQucGFyc2Vyc1tyXTtyZXR1cm4hMX0sZGV0ZWN0UGFyc2VyRm9yQ29sdW1uOmZ1bmN0aW9uKHIsbyxzLGEpe2Zvcih2YXIgbixpLGwsZD10LnBhcnNlcnMubGVuZ3RoLGM9ITEsZz0iIixwPXQuZGVidWcociwiY29yZSIpLHU9ITA7IiI9PT1nJiZ1OykobD1vWysrc10pJiZzPDUwP2wuY2xhc3NOYW1lLmluZGV4T2YodC5jc3NJZ25vcmVSb3cpPDAmJihjPW9bc10uY2VsbHNbYV0sZz10LmdldEVsZW1lbnRUZXh0KHIsYyxhKSxpPWUoYykscCYmY29uc29sZS5sb2coIkNoZWNraW5nIGlmIHZhbHVlIHdhcyBlbXB0eSBvbiByb3cgIitzKyIsIGNvbHVtbjogIithKyc6ICInK2crJyInKSk6dT0hMTtmb3IoOy0tZD49MDspaWYoKG49dC5wYXJzZXJzW2RdKSYmInRleHQiIT09bi5pZCYmbi5pcyYmbi5pcyhnLHIudGFibGUsYyxpKSlyZXR1cm4gbjtyZXR1cm4gdC5nZXRQYXJzZXJCeUlkKCJ0ZXh0Iil9LGdldEVsZW1lbnRUZXh0OmZ1bmN0aW9uKHIsbyxzKXtpZighbylyZXR1cm4iIjt2YXIgYSxuPXIudGV4dEV4dHJhY3Rpb258fCIiLGk9by5qcXVlcnk/bzplKG8pO3JldHVybiJzdHJpbmciPT10eXBlb2Ygbj8iYmFzaWMiPT09biYmdm9pZCAwIT09KGE9aS5hdHRyKHIudGV4dEF0dHJpYnV0ZSkpP2UudHJpbShhKTplLnRyaW0oby50ZXh0Q29udGVudHx8aS50ZXh0KCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP2UudHJpbShuKGlbMF0sci50YWJsZSxzKSk6ImZ1bmN0aW9uIj09dHlwZW9mKGE9dC5nZXRDb2x1bW5EYXRhKHIudGFibGUsbixzKSk/ZS50cmltKGEoaVswXSxyLnRhYmxlLHMpKTplLnRyaW0oaVswXS50ZXh0Q29udGVudHx8aS50ZXh0KCkpfSxnZXRQYXJzZWRUZXh0OmZ1bmN0aW9uKGUscixvLHMpe3ZvaWQgMD09PXMmJihzPXQuZ2V0RWxlbWVudFRleHQoZSxyLG8pKTt2YXIgYT0iIitzLG49ZS5wYXJzZXJzW29dLGk9ZS5leHRyYWN0b3JzW29dO3JldHVybiBuJiYoaSYmImZ1bmN0aW9uIj09dHlwZW9mIGkuZm9ybWF0JiYocz1pLmZvcm1hdChzLGUudGFibGUscixvKSksYT0ibm8tcGFyc2VyIj09PW4uaWQ/IiI6bi5mb3JtYXQoIiIrcyxlLnRhYmxlLHIsbyksZS5pZ25vcmVDYXNlJiYic3RyaW5nIj09dHlwZW9mIGEmJihhPWEudG9Mb3dlckNhc2UoKSkpLGF9LGJ1aWxkQ2FjaGU6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYyxnLHAsdSxmLGgsbSxiLHksdyx4LHYsQywkLEksRCxSLFQ9ci50YWJsZSxMPXIucGFyc2VycyxBPXQuZGVidWcociwiY29yZSIpO2lmKHIuJHRib2RpZXM9ci4kdGFibGUuY2hpbGRyZW4oInRib2R5Om5vdCguIityLmNzc0luZm9CbG9jaysiKSIpLGc9dm9pZCAwPT09cz9yLiR0Ym9kaWVzOnMsci5jYWNoZT17fSxyLnRvdGFsUm93cz0wLCFMKXJldHVybiBBP2NvbnNvbGUud2FybigiV2FybmluZzogKkVtcHR5IHRhYmxlISogTm90IGJ1aWxkaW5nIGEgY2FjaGUiKToiIjtmb3IoQSYmKG09bmV3IERhdGUpLHIuc2hvd1Byb2Nlc3NpbmcmJnQuaXNQcm9jZXNzaW5nKFQsITApLGM9MDtjPGcubGVuZ3RoO2MrKyl7Zm9yKHg9W10sYT1yLmNhY2hlW2NdPXtub3JtYWxpemVkOltdfSxiPWdbY10mJmdbY10ucm93cy5sZW5ndGh8fDAsbD0wO2w8YjsrK2wpaWYoeT17Y2hpbGQ6W10scmF3OltdfSxwPWUoZ1tjXS5yb3dzW2xdKSx1PVtdLCFwLmhhc0NsYXNzKHIuc2VsZWN0b3JSZW1vdmUuc2xpY2UoMSkpKWlmKHAuaGFzQ2xhc3Moci5jc3NDaGlsZFJvdykmJjAhPT1sKWZvcihEPWEubm9ybWFsaXplZC5sZW5ndGgtMSwodz1hLm5vcm1hbGl6ZWRbRF1bci5jb2x1bW5zXSkuJHJvdz13LiRyb3cuYWRkKHApLHAucHJldigpLmhhc0NsYXNzKHIuY3NzQ2hpbGRSb3cpfHxwLnByZXYoKS5hZGRDbGFzcyh0LmNzcy5jc3NIYXNDaGlsZCksZj1wLmNoaWxkcmVuKCJ0aCwgdGQiKSxEPXcuY2hpbGQubGVuZ3RoLHcuY2hpbGRbRF09W10sQz0wLEk9ci5jb2x1bW5zLGQ9MDtkPEk7ZCsrKShoPWZbZF0pJiYody5jaGlsZFtEXVtkXT10LmdldFBhcnNlZFRleHQocixoLGQpLCh2PWZbZF0uY29sU3Bhbi0xKT4wJiYoQys9dixJKz12KSksQysrO2Vsc2V7Zm9yKHkuJHJvdz1wLHkub3JkZXI9bCxDPTAsST1yLmNvbHVtbnMsZD0wO2Q8STsrK2Qpe2lmKChoPXBbMF0uY2VsbHNbZF0pJiZDPHIuY29sdW1ucyYmKCEoJD12b2lkIDAhPT1MW0NdKSYmQSYmY29uc29sZS53YXJuKCJObyBwYXJzZXIgZm91bmQgZm9yIHJvdzogIitsKyIsIGNvbHVtbjogIitkKyc7IGNlbGwgY29udGFpbmluZzogIicrZShoKS50ZXh0KCkrJyI7IGRvZXMgaXQgaGF2ZSBhIGhlYWRlcj8nKSxuPXQuZ2V0RWxlbWVudFRleHQocixoLEMpLHkucmF3W0NdPW4saT10LmdldFBhcnNlZFRleHQocixoLEMsbiksdVtDXT1pLCQmJiJudW1lcmljIj09PShMW0NdLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpJiYoeFtDXT1NYXRoLm1heChNYXRoLmFicyhpKXx8MCx4W0NdfHwwKSksKHY9aC5jb2xTcGFuLTEpPjApKXtmb3IoUj0wO1I8PXY7KWk9ci5kdXBsaWNhdGVTcGFufHwwPT09Uj9uOiJzdHJpbmciIT10eXBlb2Ygci50ZXh0RXh0cmFjdGlvbj90LmdldEVsZW1lbnRUZXh0KHIsaCxDK1IpfHwiIjoiIix5LnJhd1tDK1JdPWksdVtDK1JdPWksUisrO0MrPXYsSSs9dn1DKyt9dVtyLmNvbHVtbnNdPXksYS5ub3JtYWxpemVkW2Eubm9ybWFsaXplZC5sZW5ndGhdPXV9YS5jb2xNYXg9eCxyLnRvdGFsUm93cys9YS5ub3JtYWxpemVkLmxlbmd0aH1pZihyLnNob3dQcm9jZXNzaW5nJiZ0LmlzUHJvY2Vzc2luZyhUKSxBKXtmb3IoRD1NYXRoLm1pbig1LHIuY2FjaGVbMF0ubm9ybWFsaXplZC5sZW5ndGgpLGNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiQnVpbGRpbmcgY2FjaGUgZm9yICIrci50b3RhbFJvd3MrIiByb3dzIChzaG93aW5nICIrRCsiIHJvd3MgaW4gbG9nKSBhbmQgIityLmNvbHVtbnMrIiBjb2x1bW5zIit0LmJlbmNobWFyayhtKSksbj17fSxkPTA7ZDxyLmNvbHVtbnM7ZCsrKWZvcihDPTA7QzxEO0MrKyluWyJyb3c6ICIrQ118fChuWyJyb3c6ICIrQ109e30pLG5bInJvdzogIitDXVtyLiRoZWFkZXJJbmRleGVkW2RdLnRleHQoKV09ci5jYWNoZVswXS5ub3JtYWxpemVkW0NdW2RdO2NvbnNvbGVbY29uc29sZS50YWJsZT8idGFibGUiOiJsb2ciXShuKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9ZS5pc0Z1bmN0aW9uKG8pJiZvKFQpfSxnZXRDb2x1bW5UZXh0OmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG09ImZ1bmN0aW9uIj09dHlwZW9mIHMsYj0iYWxsIj09PW8seT17cmF3OltdLHBhcnNlZDpbXSwkY2VsbDpbXX0sdz0ocj1lKHIpWzBdKS5jb25maWc7aWYoIXQuaXNFbXB0eU9iamVjdCh3KSl7Zm9yKGM9dy4kdGJvZGllcy5sZW5ndGgsbj0wO248YztuKyspZm9yKGc9KGw9dy5jYWNoZVtuXS5ub3JtYWxpemVkKS5sZW5ndGgsaT0wO2k8ZztpKyspZD1sW2ldLGEmJiFkW3cuY29sdW1uc10uJHJvdy5pcyhhKXx8KGg9ITAsdT1iP2Quc2xpY2UoMCx3LmNvbHVtbnMpOmRbb10sZD1kW3cuY29sdW1uc10scD1iP2QucmF3OmQucmF3W29dLGY9Yj9kLiRyb3cuY2hpbGRyZW4oKTpkLiRyb3cuY2hpbGRyZW4oKS5lcShvKSxtJiYoaD1zKHt0Ym9keUluZGV4Om4scm93SW5kZXg6aSxwYXJzZWQ6dSxyYXc6cCwkcm93OmQuJHJvdywkY2VsbDpmfSkpLCExIT09aCYmKHkucGFyc2VkW3kucGFyc2VkLmxlbmd0aF09dSx5LnJhd1t5LnJhdy5sZW5ndGhdPXAseS4kY2VsbFt5LiRjZWxsLmxlbmd0aF09ZikpO3JldHVybiB5fXQuZGVidWcodywiY29yZSIpJiZjb25zb2xlLndhcm4oIk5vIGNhY2hlIGZvdW5kIC0gYWJvcnRpbmcgZ2V0Q29sdW1uVGV4dCBmdW5jdGlvbiEiKX0sc2V0SGVhZGVyc0NzczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ci5zb3J0TGlzdCxuPWEubGVuZ3RoLGk9dC5jc3Muc29ydE5vbmUrIiAiK3IuY3NzTm9uZSxsPVt0LmNzcy5zb3J0QXNjKyIgIityLmNzc0FzYyx0LmNzcy5zb3J0RGVzYysiICIrci5jc3NEZXNjXSxkPVtyLmNzc0ljb25Bc2Msci5jc3NJY29uRGVzYyxyLmNzc0ljb25Ob25lXSxjPVsiYXNjZW5kaW5nIiwiZGVzY2VuZGluZyJdLGc9ZnVuY3Rpb24oZSxyKXtlLnJlbW92ZUNsYXNzKGkpLmFkZENsYXNzKGxbcl0pLmF0dHIoImFyaWEtc29ydCIsY1tyXSkuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZFsyXSkuYWRkQ2xhc3MoZFtyXSl9LHA9ci4kdGFibGUuZmluZCgidGZvb3QgdHIiKS5jaGlsZHJlbigidGQsIHRoIikuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKSx1PXIuJGhlYWRlcnMuYWRkKGUoInRoZWFkICIrci5uYW1lc3BhY2UrIl9leHRyYV9oZWFkZXJzIikpLnJlbW92ZUNsYXNzKGwuam9pbigiICIpKS5hZGRDbGFzcyhpKS5hdHRyKCJhcmlhLXNvcnQiLCJub25lIikuZmluZCgiLiIrdC5jc3MuaWNvbikucmVtb3ZlQ2xhc3MoZC5qb2luKCIgIikpLmVuZCgpO2Zvcih1Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKGRbMl0pLHIuY3NzSWNvbkRpc2FibGVkJiZ1LmZpbHRlcigiLnNvcnRlci1mYWxzZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLmFkZENsYXNzKHIuY3NzSWNvbkRpc2FibGVkKSxvPTA7bzxuO28rKylpZigyIT09YVtvXVsxXSl7aWYodT1yLiRoZWFkZXJzLmZpbHRlcihmdW5jdGlvbihlKXtmb3IodmFyIG89ITAscz1yLiRoZWFkZXJzLmVxKGUpLGE9cGFyc2VJbnQocy5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxuPWErdC5nZXRDbG9zZXN0KHMsInRoLCB0ZCIpWzBdLmNvbFNwYW47YTxuO2ErKylvPSEhbyYmKG98fHQuaXNWYWx1ZUluQXJyYXkoYSxyLnNvcnRMaXN0KT4tMSk7cmV0dXJuIG99KSwodT11Lm5vdCgiLnNvcnRlci1mYWxzZSIpLmZpbHRlcignW2RhdGEtY29sdW1uPSInK2Fbb11bMF0rJyJdJysoMT09PW4/IjpsYXN0IjoiIikpKS5sZW5ndGgpZm9yKHM9MDtzPHUubGVuZ3RoO3MrKyl1W3NdLnNvcnREaXNhYmxlZHx8Zyh1LmVxKHMpLGFbb11bMV0pO3AubGVuZ3RoJiZnKHAuZmlsdGVyKCdbZGF0YS1jb2x1bW49IicrYVtvXVswXSsnIl0nKSxhW29dWzFdKX1mb3Iobj1yLiRoZWFkZXJzLmxlbmd0aCxvPTA7bzxuO28rKyl0LnNldENvbHVtbkFyaWFMYWJlbChyLHIuJGhlYWRlcnMuZXEobykpfSxnZXRDbG9zZXN0OmZ1bmN0aW9uKHQscil7cmV0dXJuIGUuZm4uY2xvc2VzdD90LmNsb3Nlc3Qocik6dC5pcyhyKT90OnQucGFyZW50cyhyKS5maWx0ZXIoIjpmaXJzdCIpfSxzZXRDb2x1bW5BcmlhTGFiZWw6ZnVuY3Rpb24ocixvLHMpe2lmKG8ubGVuZ3RoKXt2YXIgYT1wYXJzZUludChvLmF0dHIoImRhdGEtY29sdW1uIiksMTApLG49ci5zb3J0VmFyc1thXSxpPW8uaGFzQ2xhc3ModC5jc3Muc29ydEFzYyk/InNvcnRBc2MiOm8uaGFzQ2xhc3ModC5jc3Muc29ydERlc2MpPyJzb3J0RGVzYyI6InNvcnROb25lIixsPWUudHJpbShvLnRleHQoKSkrIjogIit0Lmxhbmd1YWdlW2ldO28uaGFzQ2xhc3MoInNvcnRlci1mYWxzZSIpfHwhMT09PXM/bCs9dC5sYW5ndWFnZS5zb3J0RGlzYWJsZWQ6KGk9KG4uY291bnQrMSklbi5vcmRlci5sZW5ndGgscz1uLm9yZGVyW2ldLGwrPXQubGFuZ3VhZ2VbMD09PXM/Im5leHRBc2MiOjE9PT1zPyJuZXh0RGVzYyI6Im5leHROb25lIl0pLG8uYXR0cigiYXJpYS1sYWJlbCIsbCl9fSx1cGRhdGVIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9ZS4kaGVhZGVycy5sZW5ndGg7Zm9yKHI9MDtyPGk7cisrKXM9ZS4kaGVhZGVycy5lcShyKSxhPXQuZ2V0Q29sdW1uRGF0YShuLGUuaGVhZGVycyxyLCEwKSxvPSJmYWxzZSI9PT10LmdldERhdGEocyxhLCJzb3J0ZXIiKXx8ImZhbHNlIj09PXQuZ2V0RGF0YShzLGEsInBhcnNlciIpLHQuc2V0Q29sdW1uU29ydChlLHMsbyl9LHNldENvbHVtblNvcnQ6ZnVuY3Rpb24oZSx0LHIpe3ZhciBvPWUudGFibGUuaWQ7dFswXS5zb3J0RGlzYWJsZWQ9cix0W3I/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXSgic29ydGVyLWZhbHNlIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsIiIrciksZS50YWJJbmRleCYmKHI/dC5yZW1vdmVBdHRyKCJ0YWJpbmRleCIpOnQuYXR0cigidGFiaW5kZXgiLCIwIikpLG8mJihyP3QucmVtb3ZlQXR0cigiYXJpYS1jb250cm9scyIpOnQuYXR0cigiYXJpYS1jb250cm9scyIsbykpfSx1cGRhdGVIZWFkZXJTb3J0Q291bnQ6ZnVuY3Rpb24ocixvKXt2YXIgcyxhLG4saSxsLGQsYyxnLHA9b3x8ci5zb3J0TGlzdCx1PXAubGVuZ3RoO2ZvcihyLnNvcnRMaXN0PVtdLGk9MDtpPHU7aSsrKWlmKGM9cFtpXSwocz1wYXJzZUludChjWzBdLDEwKSk8ci5jb2x1bW5zKXtzd2l0Y2goci5zb3J0VmFyc1tzXS5vcmRlcnx8KGc9dC5nZXRPcmRlcihyLnNvcnRJbml0aWFsT3JkZXIpP3Iuc29ydFJlc2V0P1sxLDAsMl06WzEsMF06ci5zb3J0UmVzZXQ/WzAsMSwyXTpbMCwxXSxyLnNvcnRWYXJzW3NdLm9yZGVyPWcsci5zb3J0VmFyc1tzXS5jb3VudD0wKSxnPXIuc29ydFZhcnNbc10ub3JkZXIsYT0oIiIrY1sxXSkubWF0Y2goL14oMXxkfHN8b3xuKS8pLGE9YT9hWzBdOiIiKXtjYXNlIjEiOmNhc2UiZCI6YT0xO2JyZWFrO2Nhc2UicyI6YT1sfHwwO2JyZWFrO2Nhc2UibyI6YT0wPT09KGQ9Z1sobHx8MCklZy5sZW5ndGhdKT8xOjE9PT1kPzA6MjticmVhaztjYXNlIm4iOmE9Z1srK3Iuc29ydFZhcnNbc10uY291bnQlZy5sZW5ndGhdO2JyZWFrO2RlZmF1bHQ6YT0wfWw9MD09PWk/YTpsLG49W3MscGFyc2VJbnQoYSwxMCl8fDBdLHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPW4sYT1lLmluQXJyYXkoblsxXSxnKSxyLnNvcnRWYXJzW3NdLmNvdW50PWE+PTA/YTpuWzFdJWcubGVuZ3RofX0sdXBkYXRlQWxsOmZ1bmN0aW9uKGUscixvKXt2YXIgcz1lLnRhYmxlO3MuaXNVcGRhdGluZz0hMCx0LnJlZnJlc2hXaWRnZXRzKHMsITAsITApLHQuYnVpbGRIZWFkZXJzKGUpLHQuYmluZEV2ZW50cyhzLGUuJGhlYWRlcnMsITApLHQuYmluZE1ldGhvZHMoZSksdC5jb21tb25VcGRhdGUoZSxyLG8pfSx1cGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UudGFibGUuaXNVcGRhdGluZz0hMCx0LnVwZGF0ZUhlYWRlcihlKSx0LmNvbW1vblVwZGF0ZShlLHIsbyl9LHVwZGF0ZUhlYWRlcnM6ZnVuY3Rpb24oZSxyKXtlLnRhYmxlLmlzVXBkYXRpbmc9ITAsdC5idWlsZEhlYWRlcnMoZSksdC5iaW5kRXZlbnRzKGUudGFibGUsZS4kaGVhZGVycywhMCksdC5yZXNvcnRDb21wbGV0ZShlLHIpfSx1cGRhdGVDZWxsOmZ1bmN0aW9uKHIsbyxzLGEpe2lmKGUobykuY2xvc2VzdCgidHIiKS5oYXNDbGFzcyhyLmNzc0NoaWxkUm93KSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ1cGRhdGVDZWxsIiBmb3IgY2hpbGQgcm93IGNvbnRlbnQgaGFzIGJlZW4gZGlzYWJsZWQsIHVzZSAidXBkYXRlIiBpbnN0ZWFkJyk7ZWxzZXtpZih0LmlzRW1wdHlPYmplY3Qoci5jYWNoZSkpcmV0dXJuIHQudXBkYXRlSGVhZGVyKHIpLHZvaWQgdC5jb21tb25VcGRhdGUocixzLGEpO3IudGFibGUuaXNVcGRhdGluZz0hMCxyLiR0YWJsZS5maW5kKHIuc2VsZWN0b3JSZW1vdmUpLnJlbW92ZSgpO3ZhciBuLGksbCxkLGMsZyxwPXIuJHRib2RpZXMsdT1lKG8pLGY9cC5pbmRleCh0LmdldENsb3Nlc3QodSwidGJvZHkiKSksaD1yLmNhY2hlW2ZdLG09dC5nZXRDbG9zZXN0KHUsInRyIik7aWYobz11WzBdLHAubGVuZ3RoJiZmPj0wKXtpZihsPXAuZXEoZikuZmluZCgidHIiKS5ub3QoIi4iK3IuY3NzQ2hpbGRSb3cpLmluZGV4KG0pLGM9aC5ub3JtYWxpemVkW2xdLChnPW1bMF0uY2VsbHMubGVuZ3RoKSE9PXIuY29sdW1ucylmb3IoZD0wLG49ITEsaT0wO2k8ZztpKyspbnx8bVswXS5jZWxsc1tpXT09PW8/bj0hMDpkKz1tWzBdLmNlbGxzW2ldLmNvbFNwYW47ZWxzZSBkPXUuaW5kZXgoKTtuPXQuZ2V0RWxlbWVudFRleHQocixvLGQpLGNbci5jb2x1bW5zXS5yYXdbZF09bixuPXQuZ2V0UGFyc2VkVGV4dChyLG8sZCxuKSxjW2RdPW4sIm51bWVyaWMiPT09KHIucGFyc2Vyc1tkXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKGguY29sTWF4W2RdPU1hdGgubWF4KE1hdGguYWJzKG4pfHwwLGguY29sTWF4W2RdfHwwKSksITEhPT0obj0idW5kZWZpbmVkIiE9PXM/czpyLnJlc29ydCk/dC5jaGVja1Jlc29ydChyLG4sYSk6dC5yZXNvcnRDb21wbGV0ZShyLGEpfWVsc2UgdC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUuZXJyb3IoInVwZGF0ZUNlbGwgYWJvcnRlZCwgdGJvZHkgbWlzc2luZyBvciBub3Qgd2l0aGluIHRoZSBpbmRpY2F0ZWQgdGFibGUiKSxyLnRhYmxlLmlzVXBkYXRpbmc9ITF9fSxhZGRSb3dzOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuLGksbCxkLGMsZyxwLHUsZixoLG0sYix5LHc9InN0cmluZyI9PXR5cGVvZiBvJiYxPT09ci4kdGJvZGllcy5sZW5ndGgmJi88dHIvLnRlc3Qob3x8IiIpLHg9ci50YWJsZTtpZih3KW89ZShvKSxyLiR0Ym9kaWVzLmFwcGVuZChvKTtlbHNlIGlmKCEobyYmbyBpbnN0YW5jZW9mIGUmJnQuZ2V0Q2xvc2VzdChvLCJ0YWJsZSIpWzBdPT09ci50YWJsZSkpcmV0dXJuIHQuZGVidWcociwiY29yZSIpJiZjb25zb2xlLmVycm9yKCJhZGRSb3dzIG1ldGhvZCByZXF1aXJlcyAoMSkgYSBqUXVlcnkgc2VsZWN0b3IgcmVmZXJlbmNlIHRvIHJvd3MgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgdGFibGUsIG9yICgyKSByb3cgSFRNTCBzdHJpbmcgdG8gYmUgYWRkZWQgdG8gYSB0YWJsZSB3aXRoIG9ubHkgb25lIHRib2R5IiksITE7aWYoeC5pc1VwZGF0aW5nPSEwLHQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSl0LnVwZGF0ZUhlYWRlcihyKSx0LmNvbW1vblVwZGF0ZShyLHMsYSk7ZWxzZXtmb3IoYz1vLmZpbHRlcigidHIiKS5hdHRyKCJyb2xlIiwicm93IikubGVuZ3RoLGw9ci4kdGJvZGllcy5pbmRleChvLnBhcmVudHMoInRib2R5IikuZmlsdGVyKCI6Zmlyc3QiKSksci5wYXJzZXJzJiZyLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhyKSxkPTA7ZDxjO2QrKyl7Zm9yKGY9MCxwPW9bZF0uY2VsbHMubGVuZ3RoLHU9ci5jYWNoZVtsXS5ub3JtYWxpemVkLmxlbmd0aCxtPVtdLGg9e2NoaWxkOltdLHJhdzpbXSwkcm93Om8uZXEoZCksb3JkZXI6dX0sZz0wO2c8cDtnKyspYj1vW2RdLmNlbGxzW2ddLG49dC5nZXRFbGVtZW50VGV4dChyLGIsZiksaC5yYXdbZl09bixpPXQuZ2V0UGFyc2VkVGV4dChyLGIsZixuKSxtW2ZdPWksIm51bWVyaWMiPT09KHIucGFyc2Vyc1tmXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKHIuY2FjaGVbbF0uY29sTWF4W2ZdPU1hdGgubWF4KE1hdGguYWJzKGkpfHwwLHIuY2FjaGVbbF0uY29sTWF4W2ZdfHwwKSksKHk9Yi5jb2xTcGFuLTEpPjAmJihmKz15KSxmKys7bVtyLmNvbHVtbnNdPWgsci5jYWNoZVtsXS5ub3JtYWxpemVkW3VdPW19dC5jaGVja1Jlc29ydChyLHMsYSl9fSx1cGRhdGVDYWNoZTpmdW5jdGlvbihlLHIsbyl7ZS5wYXJzZXJzJiZlLnBhcnNlcnMubGVuZ3RofHx0LnNldHVwUGFyc2VycyhlLG8pLHQuYnVpbGRDYWNoZShlLHIsbyl9LGFwcGVuZENhY2hlOmZ1bmN0aW9uKGUscil7dmFyIG8scyxhLG4saSxsLGQsYz1lLnRhYmxlLGc9ZS4kdGJvZGllcyxwPVtdLHU9ZS5jYWNoZTtpZih0LmlzRW1wdHlPYmplY3QodSkpcmV0dXJuIGUuYXBwZW5kZXI/ZS5hcHBlbmRlcihjLHApOmMuaXNVcGRhdGluZz9lLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpOiIiO2Zvcih0LmRlYnVnKGUsImNvcmUiKSYmKGQ9bmV3IERhdGUpLGw9MDtsPGcubGVuZ3RoO2wrKylpZigoYT1nLmVxKGwpKS5sZW5ndGgpe2ZvcihuPXQucHJvY2Vzc1Rib2R5KGMsYSwhMCkscz0obz11W2xdLm5vcm1hbGl6ZWQpLmxlbmd0aCxpPTA7aTxzO2krKylwW3AubGVuZ3RoXT1vW2ldW2UuY29sdW1uc10uJHJvdyxlLmFwcGVuZGVyJiYoIWUucGFnZXJ8fGUucGFnZXIucmVtb3ZlUm93c3x8ZS5wYWdlci5hamF4KXx8bi5hcHBlbmQob1tpXVtlLmNvbHVtbnNdLiRyb3cpO3QucHJvY2Vzc1Rib2R5KGMsbiwhMSl9ZS5hcHBlbmRlciYmZS5hcHBlbmRlcihjLHApLHQuZGVidWcoZSwiY29yZSIpJiZjb25zb2xlLmxvZygiUmVidWlsdCB0YWJsZSIrdC5iZW5jaG1hcmsoZCkpLHJ8fGUuYXBwZW5kZXJ8fHQuYXBwbHlXaWRnZXQoYyksYy5pc1VwZGF0aW5nJiZlLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLGMpfSxjb21tb25VcGRhdGU6ZnVuY3Rpb24oZSxyLG8pe2UuJHRhYmxlLmZpbmQoZS5zZWxlY3RvclJlbW92ZSkucmVtb3ZlKCksdC5zZXR1cFBhcnNlcnMoZSksdC5idWlsZENhY2hlKGUpLHQuY2hlY2tSZXNvcnQoZSxyLG8pfSxpbml0U29ydDpmdW5jdGlvbihyLG8scyl7aWYoci50YWJsZS5pc1VwZGF0aW5nKXJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0U29ydChyLG8scyl9LDUwKTt2YXIgYSxuLGksbCxkLGMsZyxwPSFzW3Iuc29ydE11bHRpU29ydEtleV0sdT1yLnRhYmxlLGY9ci4kaGVhZGVycy5sZW5ndGgsaD10LmdldENsb3Nlc3QoZShvKSwidGgsIHRkIiksbT1wYXJzZUludChoLmF0dHIoImRhdGEtY29sdW1uIiksMTApLGI9ci5zb3J0VmFyc1ttXS5vcmRlcjtpZihoPWhbMF0sci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsdSksYz0oci5zb3J0VmFyc1ttXS5jb3VudCsxKSViLmxlbmd0aCxyLnNvcnRWYXJzW21dLmNvdW50PXNbci5zb3J0UmVzZXRLZXldPzI6YyxyLnNvcnRSZXN0YXJ0KWZvcihpPTA7aTxmO2krKylnPXIuJGhlYWRlcnMuZXEoaSksbSE9PShjPXBhcnNlSW50KGcuYXR0cigiZGF0YS1jb2x1bW4iKSwxMCkpJiYocHx8Zy5oYXNDbGFzcyh0LmNzcy5zb3J0Tm9uZSkpJiYoci5zb3J0VmFyc1tjXS5jb3VudD0tMSk7aWYocCl7aWYoci5zb3J0TGlzdD1bXSxyLmxhc3Quc29ydExpc3Q9W10sbnVsbCE9PXIuc29ydEZvcmNlKWZvcihhPXIuc29ydEZvcmNlLG49MDtuPGEubGVuZ3RoO24rKylhW25dWzBdIT09bSYmKHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPWFbbl0pO2lmKChsPWJbci5zb3J0VmFyc1ttXS5jb3VudF0pPDImJihyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1bbSxsXSxoLmNvbFNwYW4+MSkpZm9yKG49MTtuPGguY29sU3BhbjtuKyspci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20rbixsXSxyLnNvcnRWYXJzW20rbl0uY291bnQ9ZS5pbkFycmF5KGwsYil9ZWxzZSBpZihyLnNvcnRMaXN0PWUuZXh0ZW5kKFtdLHIubGFzdC5zb3J0TGlzdCksdC5pc1ZhbHVlSW5BcnJheShtLHIuc29ydExpc3QpPj0wKWZvcihuPTA7bjxyLnNvcnRMaXN0Lmxlbmd0aDtuKyspKGM9ci5zb3J0TGlzdFtuXSlbMF09PT1tJiYoY1sxXT1iW3Iuc29ydFZhcnNbbV0uY291bnRdLDI9PT1jWzFdJiYoci5zb3J0TGlzdC5zcGxpY2UobiwxKSxyLnNvcnRWYXJzW21dLmNvdW50PS0xKSk7ZWxzZSBpZigobD1iW3Iuc29ydFZhcnNbbV0uY291bnRdKTwyJiYoci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20sbF0saC5jb2xTcGFuPjEpKWZvcihuPTE7bjxoLmNvbFNwYW47bisrKXIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVttK24sbF0sci5zb3J0VmFyc1ttK25dLmNvdW50PWUuaW5BcnJheShsLGIpO2lmKHIubGFzdC5zb3J0TGlzdD1lLmV4dGVuZChbXSxyLnNvcnRMaXN0KSxyLnNvcnRMaXN0Lmxlbmd0aCYmci5zb3J0QXBwZW5kJiYoYT1lLmlzQXJyYXkoci5zb3J0QXBwZW5kKT9yLnNvcnRBcHBlbmQ6ci5zb3J0QXBwZW5kW3Iuc29ydExpc3RbMF1bMF1dLCF0LmlzRW1wdHlPYmplY3QoYSkpKWZvcihuPTA7bjxhLmxlbmd0aDtuKyspaWYoYVtuXVswXSE9PW0mJnQuaXNWYWx1ZUluQXJyYXkoYVtuXVswXSxyLnNvcnRMaXN0KTwwKXtpZihsPWFbbl1bMV0sZD0oIiIrbCkubWF0Y2goL14oYXxkfHN8b3xuKS8pKXN3aXRjaChjPXIuc29ydExpc3RbMF1bMV0sZFswXSl7Y2FzZSJkIjpsPTE7YnJlYWs7Y2FzZSJzIjpsPWM7YnJlYWs7Y2FzZSJvIjpsPTA9PT1jPzE6MDticmVhaztjYXNlIm4iOmw9KGMrMSklYi5sZW5ndGg7YnJlYWs7ZGVmYXVsdDpsPTB9ci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W2Fbbl1bMF0sbF19ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRCZWdpbiIsdSksc2V0VGltZW91dChmdW5jdGlvbigpe3Quc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVmb3JlRW5kIix1KSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEVuZCIsdSl9LDEpfSxtdWx0aXNvcnQ6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzLGEsbj1lLnRhYmxlLGk9W10sbD0wLGQ9ZS50ZXh0U29ydGVyfHwiIixjPWUuc29ydExpc3QsZz1jLmxlbmd0aCxwPWUuJHRib2RpZXMubGVuZ3RoO2lmKCFlLnNlcnZlclNpZGVTb3J0aW5nJiYhdC5pc0VtcHR5T2JqZWN0KGUuY2FjaGUpKXtpZih0LmRlYnVnKGUsImNvcmUiKSYmKG89bmV3IERhdGUpLCJvYmplY3QiPT10eXBlb2YgZClmb3Iocz1lLmNvbHVtbnM7cy0tOykiZnVuY3Rpb24iPT10eXBlb2YoYT10LmdldENvbHVtbkRhdGEobixkLHMpKSYmKGlbc109YSk7Zm9yKHI9MDtyPHA7cisrKXM9ZS5jYWNoZVtyXS5jb2xNYXgsZS5jYWNoZVtyXS5ub3JtYWxpemVkLnNvcnQoZnVuY3Rpb24ocixvKXt2YXIgYSxwLHUsZixoLG0sYjtmb3IoYT0wO2E8ZzthKyspe2lmKHU9Y1thXVswXSxmPWNbYV1bMV0sbD0wPT09ZixlLnNvcnRTdGFibGUmJnJbdV09PT1vW3VdJiYxPT09ZylyZXR1cm4gcltlLmNvbHVtbnNdLm9yZGVyLW9bZS5jb2x1bW5zXS5vcmRlcjtpZihwPS9uL2kudGVzdCh0LmdldFNvcnRUeXBlKGUucGFyc2Vycyx1KSkscCYmZS5zdHJpbmdzW3VdPyhwPSJib29sZWFuIj09dHlwZW9mIHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/KGw/MTotMSkqKHQuc3RyaW5nW2Uuc3RyaW5nc1t1XV0/LTE6MSk6ZS5zdHJpbmdzW3VdP3Quc3RyaW5nW2Uuc3RyaW5nc1t1XV18fDA6MCxoPWUubnVtYmVyU29ydGVyP2UubnVtYmVyU29ydGVyKHJbdV0sb1t1XSxsLHNbdV0sbik6dFsic29ydE51bWVyaWMiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSxwLHNbdV0sdSxlKSk6KG09bD9yOm8sYj1sP286cixoPSJmdW5jdGlvbiI9PXR5cGVvZiBkP2QobVt1XSxiW3VdLGwsdSxuKToiZnVuY3Rpb24iPT10eXBlb2YgaVt1XT9pW3VdKG1bdV0sYlt1XSxsLHUsbik6dFsic29ydE5hdHVyYWwiKyhsPyJBc2MiOiJEZXNjIildKHJbdV0sb1t1XSx1LGUpKSxoKXJldHVybiBofXJldHVybiByW2UuY29sdW1uc10ub3JkZXItb1tlLmNvbHVtbnNdLm9yZGVyfSk7dC5kZWJ1ZyhlLCJjb3JlIikmJmNvbnNvbGUubG9nKCJBcHBseWluZyBzb3J0ICIrYy50b1N0cmluZygpK3QuYmVuY2htYXJrKG8pKX19LHJlc29ydENvbXBsZXRlOmZ1bmN0aW9uKHQscil7dC50YWJsZS5pc1VwZGF0aW5nJiZ0LiR0YWJsZS50cmlnZ2VySGFuZGxlcigidXBkYXRlQ29tcGxldGUiLHQudGFibGUpLGUuaXNGdW5jdGlvbihyKSYmcih0LnRhYmxlKX0sY2hlY2tSZXNvcnQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhPWUuaXNBcnJheShvKT9vOnIuc29ydExpc3Q7ITE9PT0odm9pZCAwPT09bz9yLnJlc29ydDpvKXx8ci5zZXJ2ZXJTaWRlU29ydGluZ3x8ci50YWJsZS5pc1Byb2Nlc3Npbmc/KHQucmVzb3J0Q29tcGxldGUocixzKSx0LmFwcGx5V2lkZ2V0KHIudGFibGUsITEpKTphLmxlbmd0aD90LnNvcnRPbihyLGEsZnVuY3Rpb24oKXt0LnJlc29ydENvbXBsZXRlKHIscyl9LCEwKTp0LnNvcnRSZXNldChyLGZ1bmN0aW9uKCl7dC5yZXNvcnRDb21wbGV0ZShyLHMpLHQuYXBwbHlXaWRnZXQoci50YWJsZSwhMSl9KX0sc29ydE9uOmZ1bmN0aW9uKHIsbyxzLGEpe3ZhciBuPXIudGFibGU7ci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRTdGFydCIsbiksdC51cGRhdGVIZWFkZXJTb3J0Q291bnQocixvKSx0LnNldEhlYWRlcnNDc3Mociksci5kZWxheUluaXQmJnQuaXNFbXB0eU9iamVjdChyLmNhY2hlKSYmdC5idWlsZENhY2hlKHIpLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVnaW4iLG4pLHQubXVsdGlzb3J0KHIpLHQuYXBwZW5kQ2FjaGUocixhKSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEJlZm9yZUVuZCIsbiksci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRFbmQiLG4pLHQuYXBwbHlXaWRnZXQobiksZS5pc0Z1bmN0aW9uKHMpJiZzKG4pfSxzb3J0UmVzZXQ6ZnVuY3Rpb24ocixvKXtyLnNvcnRMaXN0PVtdLHQuc2V0SGVhZGVyc0NzcyhyKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIpO3ZhciBzO2ZvcihzPTA7czxyLmNvbHVtbnM7cysrKXIuc29ydFZhcnNbc10uY291bnQ9LTE7ZS5pc0Z1bmN0aW9uKG8pJiZvKHIudGFibGUpfSxnZXRTb3J0VHlwZTpmdW5jdGlvbihlLHQpe3JldHVybiBlJiZlW3RdP2VbdF0udHlwZXx8IiI6IiJ9LGdldE9yZGVyOmZ1bmN0aW9uKGUpe3JldHVybi9eZC9pLnRlc3QoZSl8fDE9PT1lfSxzb3J0TmF0dXJhbDpmdW5jdGlvbihlLHIpe2lmKGU9PT1yKXJldHVybiAwO2U9ZS50b1N0cmluZygpLHI9ci50b1N0cmluZygpO3ZhciBvLHMsYSxuLGksbCxkPXQucmVnZXg7aWYoZC5oZXgudGVzdChyKSl7aWYobz1wYXJzZUludCgoZXx8IiIpLm1hdGNoKGQuaGV4KSwxNikscz1wYXJzZUludCgocnx8IiIpLm1hdGNoKGQuaGV4KSwxNiksbzxzKXJldHVybi0xO2lmKG8+cylyZXR1cm4gMX1mb3Iobz0oZXx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIikscz0ocnx8IiIpLnJlcGxhY2UoZC5jaHVuaywiXFwwJDFcXDAiKS5yZXBsYWNlKGQuY2h1bmtzLCIiKS5zcGxpdCgiXFwwIiksbD1NYXRoLm1heChvLmxlbmd0aCxzLmxlbmd0aCksaT0wO2k8bDtpKyspe2lmKGE9aXNOYU4ob1tpXSk/b1tpXXx8MDpwYXJzZUZsb2F0KG9baV0pfHwwLG49aXNOYU4oc1tpXSk/c1tpXXx8MDpwYXJzZUZsb2F0KHNbaV0pfHwwLGlzTmFOKGEpIT09aXNOYU4obikpcmV0dXJuIGlzTmFOKGEpPzE6LTE7aWYodHlwZW9mIGEhPXR5cGVvZiBuJiYoYSs9IiIsbis9IiIpLGE8bilyZXR1cm4tMTtpZihhPm4pcmV0dXJuIDF9cmV0dXJuIDB9LHNvcnROYXR1cmFsQXNjOmZ1bmN0aW9uKGUscixvLHMpe2lmKGU9PT1yKXJldHVybiAwO3ZhciBhPXQuc3RyaW5nW3MuZW1wdGllc1tvXXx8cy5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8tMToxOi1hfHwtMToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOmF8fDE6dC5zb3J0TmF0dXJhbChlLHIpfSxzb3J0TmF0dXJhbERlc2M6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGE9dC5zdHJpbmdbcy5lbXB0aWVzW29dfHxzLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWE/ImJvb2xlYW4iPT10eXBlb2YgYT9hPy0xOjE6YXx8MToiIj09PXImJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8xOi0xOi1hfHwtMTp0LnNvcnROYXR1cmFsKHIsZSl9LHNvcnRUZXh0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU+dD8xOmU8dD8tMTowfSxnZXRUZXh0VmFsdWU6ZnVuY3Rpb24oZSx0LHIpe2lmKHIpe3ZhciBvLHM9ZT9lLmxlbmd0aDowLGE9cit0O2ZvcihvPTA7bzxzO28rKylhKz1lLmNoYXJDb2RlQXQobyk7cmV0dXJuIHQqYX1yZXR1cm4gMH0sc29ydE51bWVyaWNBc2M6ZnVuY3Rpb24oZSxyLG8scyxhLG4pe2lmKGU9PT1yKXJldHVybiAwO3ZhciBpPXQuc3RyaW5nW24uZW1wdGllc1thXXx8bi5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8tMToxOi1pfHwtMToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOml8fDE6KGlzTmFOKGUpJiYoZT10LmdldFRleHRWYWx1ZShlLG8scykpLGlzTmFOKHIpJiYocj10LmdldFRleHRWYWx1ZShyLG8scykpLGUtcil9LHNvcnROdW1lcmljRGVzYzpmdW5jdGlvbihlLHIsbyxzLGEsbil7aWYoZT09PXIpcmV0dXJuIDA7dmFyIGk9dC5zdHJpbmdbbi5lbXB0aWVzW2FdfHxuLmVtcHR5VG9dO3JldHVybiIiPT09ZSYmMCE9PWk/ImJvb2xlYW4iPT10eXBlb2YgaT9pPy0xOjE6aXx8MToiIj09PXImJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8xOi0xOi1pfHwtMTooaXNOYU4oZSkmJihlPXQuZ2V0VGV4dFZhbHVlKGUsbyxzKSksaXNOYU4ocikmJihyPXQuZ2V0VGV4dFZhbHVlKHIsbyxzKSksci1lKX0sc29ydE51bWVyaWM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS10fSxhZGRXaWRnZXQ6ZnVuY3Rpb24oZSl7ZS5pZCYmIXQuaXNFbXB0eU9iamVjdCh0LmdldFdpZGdldEJ5SWQoZS5pZCkpJiZjb25zb2xlLndhcm4oJyInK2UuaWQrJyIgd2lkZ2V0IHdhcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UhJyksdC53aWRnZXRzW3Qud2lkZ2V0cy5sZW5ndGhdPWV9LGhhc1dpZGdldDpmdW5jdGlvbih0LHIpe3JldHVybih0PWUodCkpLmxlbmd0aCYmdFswXS5jb25maWcmJnRbMF0uY29uZmlnLndpZGdldEluaXRbcl18fCExfSxnZXRXaWRnZXRCeUlkOmZ1bmN0aW9uKGUpe3ZhciByLG8scz10LndpZGdldHMubGVuZ3RoO2ZvcihyPTA7cjxzO3IrKylpZigobz10LndpZGdldHNbcl0pJiZvLmlkJiZvLmlkLnRvTG93ZXJDYXNlKCk9PT1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIG99LGFwcGx5V2lkZ2V0T3B0aW9uczpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbj1yLmNvbmZpZyxpPW4ud2lkZ2V0cy5sZW5ndGg7aWYoaSlmb3Iobz0wO288aTtvKyspKHM9dC5nZXRXaWRnZXRCeUlkKG4ud2lkZ2V0c1tvXSkpJiZzLm9wdGlvbnMmJihhPWUuZXh0ZW5kKCEwLHt9LHMub3B0aW9ucyksbi53aWRnZXRPcHRpb25zPWUuZXh0ZW5kKCEwLGEsbi53aWRnZXRPcHRpb25zKSxlLmV4dGVuZCghMCx0LmRlZmF1bHRzLndpZGdldE9wdGlvbnMscy5vcHRpb25zKSl9LGFkZFdpZGdldEZyb21DbGFzczpmdW5jdGlvbihlKXt2YXIgcixvLHM9ZS5jb25maWcsYT0iXiIrcy53aWRnZXRDbGFzcy5yZXBsYWNlKHQucmVnZXgudGVtcGxhdGVOYW1lLCIoXFxTKykrIikrIiQiLG49bmV3IFJlZ0V4cChhLCJnIiksaT0oZS5jbGFzc05hbWV8fCIiKS5zcGxpdCh0LnJlZ2V4LnNwYWNlcyk7aWYoaS5sZW5ndGgpZm9yKHI9aS5sZW5ndGgsbz0wO288cjtvKyspaVtvXS5tYXRjaChuKSYmKHMud2lkZ2V0c1tzLndpZGdldHMubGVuZ3RoXT1pW29dLnJlcGxhY2UobiwiJDEiKSl9LGFwcGx5V2lkZ2V0SWQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsPShyPWUocilbMF0pLmNvbmZpZyxkPWwud2lkZ2V0T3B0aW9ucyxjPXQuZGVidWcobCwiY29yZSIpLGc9dC5nZXRXaWRnZXRCeUlkKG8pO2cmJihpPWcuaWQsYT0hMSxlLmluQXJyYXkoaSxsLndpZGdldHMpPDAmJihsLndpZGdldHNbbC53aWRnZXRzLmxlbmd0aF09aSksYyYmKG49bmV3IERhdGUpLCFzJiZsLndpZGdldEluaXRbaV18fChsLndpZGdldEluaXRbaV09ITAsci5oYXNJbml0aWFsaXplZCYmdC5hcHBseVdpZGdldE9wdGlvbnMociksImZ1bmN0aW9uIj09dHlwZW9mIGcuaW5pdCYmKGE9ITAsYyYmY29uc29sZVtjb25zb2xlLmdyb3VwPyJncm91cCI6ImxvZyJdKCJJbml0aWFsaXppbmcgIitpKyIgd2lkZ2V0IiksZy5pbml0KHIsZyxsLGQpKSksc3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGcuZm9ybWF0fHwoYT0hMCxjJiZjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIlVwZGF0aW5nICIraSsiIHdpZGdldCIpLGcuZm9ybWF0KHIsbCxkLCExKSksYyYmYSYmKGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisocz8iaW5pdGlhbGl6aW5nICI6ImFwcGx5aW5nICIpK2krIiB3aWRnZXQiK3QuYmVuY2htYXJrKG4pKSxjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCkpKX0sYXBwbHlXaWRnZXQ6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saSxsLGQsYz0ocj1lKHIpWzBdKS5jb25maWcsZz10LmRlYnVnKGMsImNvcmUiKSxwPVtdO2lmKCExPT09b3x8IXIuaGFzSW5pdGlhbGl6ZWR8fCFyLmlzQXBwbHlpbmdXaWRnZXRzJiYhci5pc1VwZGF0aW5nKXtpZihnJiYoZD1uZXcgRGF0ZSksdC5hZGRXaWRnZXRGcm9tQ2xhc3MociksY2xlYXJUaW1lb3V0KGMudGltZXJSZWFkeSksYy53aWRnZXRzLmxlbmd0aCl7Zm9yKHIuaXNBcHBseWluZ1dpZGdldHM9ITAsYy53aWRnZXRzPWUuZ3JlcChjLndpZGdldHMsZnVuY3Rpb24odCxyKXtyZXR1cm4gZS5pbkFycmF5KHQsYy53aWRnZXRzKT09PXJ9KSxuPShpPWMud2lkZ2V0c3x8W10pLmxlbmd0aCxhPTA7YTxuO2ErKykobD10LmdldFdpZGdldEJ5SWQoaVthXSkpJiZsLmlkPyhsLnByaW9yaXR5fHwobC5wcmlvcml0eT0xMCkscFthXT1sKTpnJiZjb25zb2xlLndhcm4oJyInK2lbYV0rJyIgd2FzIGVuYWJsZWQsIGJ1dCB0aGUgd2lkZ2V0IGNvZGUgaGFzIG5vdCBiZWVuIGxvYWRlZCEnKTtmb3IocC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucHJpb3JpdHk8dC5wcmlvcml0eT8tMTplLnByaW9yaXR5PT09dC5wcmlvcml0eT8wOjF9KSxuPXAubGVuZ3RoLGcmJmNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiU3RhcnQgIisobz8iaW5pdGlhbGl6aW5nIjoiYXBwbHlpbmciKSsiIHdpZGdldHMiKSxhPTA7YTxuO2ErKykobD1wW2FdKSYmbC5pZCYmdC5hcHBseVdpZGdldElkKHIsbC5pZCxvKTtnJiZjb25zb2xlLmdyb3VwRW5kJiZjb25zb2xlLmdyb3VwRW5kKCl9Yy50aW1lclJlYWR5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmlzQXBwbHlpbmdXaWRnZXRzPSExLGUuZGF0YShyLCJsYXN0V2lkZ2V0QXBwbGljYXRpb24iLG5ldyBEYXRlKSxjLiR0YWJsZS50cmlnZ2VySGFuZGxlcigidGFibGVzb3J0ZXItcmVhZHkiKSxvfHwiZnVuY3Rpb24iIT10eXBlb2Ygc3x8cyhyKSxnJiYobD1jLndpZGdldHMubGVuZ3RoLGNvbnNvbGUubG9nKCJDb21wbGV0ZWQgIisoITA9PT1vPyJpbml0aWFsaXppbmcgIjoiYXBwbHlpbmcgIikrbCsiIHdpZGdldCIrKDEhPT1sPyJzIjoiIikrdC5iZW5jaG1hcmsoZCkpKX0sMTApfX0scmVtb3ZlV2lkZ2V0OmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbCxkPShyPWUocilbMF0pLmNvbmZpZztpZighMD09PW8pZm9yKG89W10sbD10LndpZGdldHMubGVuZ3RoLGk9MDtpPGw7aSsrKShuPXQud2lkZ2V0c1tpXSkmJm4uaWQmJihvW28ubGVuZ3RoXT1uLmlkKTtlbHNlIG89KGUuaXNBcnJheShvKT9vLmpvaW4oIiwiKTpvfHwiIikudG9Mb3dlckNhc2UoKS5zcGxpdCgvW1xzLF0rLyk7Zm9yKGw9by5sZW5ndGgsYT0wO2E8bDthKyspbj10LmdldFdpZGdldEJ5SWQob1thXSksKGk9ZS5pbkFycmF5KG9bYV0sZC53aWRnZXRzKSk+PTAmJiEwIT09cyYmZC53aWRnZXRzLnNwbGljZShpLDEpLG4mJm4ucmVtb3ZlJiYodC5kZWJ1ZyhkLCJjb3JlIikmJmNvbnNvbGUubG9nKChzPyJSZWZyZXNoaW5nIjoiUmVtb3ZpbmciKSsnICInK29bYV0rJyIgd2lkZ2V0Jyksbi5yZW1vdmUocixkLGQud2lkZ2V0T3B0aW9ucyxzKSxkLndpZGdldEluaXRbb1thXV09ITEpO2QuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJ3aWRnZXRSZW1vdmVFbmQiLHIpfSxyZWZyZXNoV2lkZ2V0czpmdW5jdGlvbihyLG8scyl7dmFyIGEsbixpPShyPWUocilbMF0pLmNvbmZpZy53aWRnZXRzLGw9dC53aWRnZXRzLGQ9bC5sZW5ndGgsYz1bXSxnPWZ1bmN0aW9uKHQpe2UodCkudHJpZ2dlckhhbmRsZXIoInJlZnJlc2hDb21wbGV0ZSIpfTtmb3IoYT0wO2E8ZDthKyspKG49bFthXSkmJm4uaWQmJihvfHxlLmluQXJyYXkobi5pZCxpKTwwKSYmKGNbYy5sZW5ndGhdPW4uaWQpO3QucmVtb3ZlV2lkZ2V0KHIsYy5qb2luKCIsIiksITApLCEwIT09cz8odC5hcHBseVdpZGdldChyLG98fCExLGcpLG8mJnQuYXBwbHlXaWRnZXQociwhMSxnKSk6ZyhyKX0sYmVuY2htYXJrOmZ1bmN0aW9uKGUpe3JldHVybiIgKCIrKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWUuZ2V0VGltZSgpKSsiIG1zKSJ9LGxvZzpmdW5jdGlvbigpe2NvbnNvbGUubG9nKGFyZ3VtZW50cyl9LGRlYnVnOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJighMD09PWUuZGVidWd8fCJzdHJpbmciPT10eXBlb2YgZS5kZWJ1ZyYmZS5kZWJ1Zy5pbmRleE9mKHQpPi0xKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0saXNWYWx1ZUluQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgcixvPXQmJnQubGVuZ3RofHwwO2ZvcihyPTA7cjxvO3IrKylpZih0W3JdWzBdPT09ZSlyZXR1cm4gcjtyZXR1cm4tMX0sZm9ybWF0RmxvYXQ6ZnVuY3Rpb24ocixvKXtpZigic3RyaW5nIiE9dHlwZW9mIHJ8fCIiPT09cilyZXR1cm4gcjt2YXIgcztyZXR1cm4gcj0obyYmby5jb25maWc/ITEhPT1vLmNvbmZpZy51c051bWJlckZvcm1hdDp2b2lkIDA9PT1vfHxvKT9yLnJlcGxhY2UodC5yZWdleC5jb21tYSwiIik6ci5yZXBsYWNlKHQucmVnZXguZGlnaXROb25VUywiIikucmVwbGFjZSh0LnJlZ2V4LmNvbW1hLCIuIiksdC5yZWdleC5kaWdpdE5lZ2F0aXZlVGVzdC50ZXN0KHIpJiYocj1yLnJlcGxhY2UodC5yZWdleC5kaWdpdE5lZ2F0aXZlUmVwbGFjZSwiLSQxIikpLHM9cGFyc2VGbG9hdChyKSxpc05hTihzKT9lLnRyaW0ocik6c30saXNEaWdpdDpmdW5jdGlvbihlKXtyZXR1cm4gaXNOYU4oZSk/dC5yZWdleC5kaWdpdFRlc3QudGVzdChlLnRvU3RyaW5nKCkucmVwbGFjZSh0LnJlZ2V4LmRpZ2l0UmVwbGFjZSwiIikpOiIiIT09ZX0sY29tcHV0ZUNvbHVtbkluZGV4OmZ1bmN0aW9uKHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZyxwLHUsZj1vJiZvLmNvbHVtbnN8fDAsaD1bXSxtPW5ldyBBcnJheShmKTtmb3Iocz0wO3M8ci5sZW5ndGg7cysrKWZvcihkPXJbc10uY2VsbHMsYT0wO2E8ZC5sZW5ndGg7YSsrKXtmb3IoYz1zLGc9KGw9ZFthXSkucm93U3Bhbnx8MSxwPWwuY29sU3Bhbnx8MSx2b2lkIDA9PT1oW2NdJiYoaFtjXT1bXSksbj0wO248aFtjXS5sZW5ndGgrMTtuKyspaWYodm9pZCAwPT09aFtjXVtuXSl7dT1uO2JyZWFrfWZvcihmJiZsLmNlbGxJbmRleD09PXV8fChsLnNldEF0dHJpYnV0ZT9sLnNldEF0dHJpYnV0ZSgiZGF0YS1jb2x1bW4iLHUpOmUobCkuYXR0cigiZGF0YS1jb2x1bW4iLHUpKSxuPWM7bjxjK2c7bisrKWZvcih2b2lkIDA9PT1oW25dJiYoaFtuXT1bXSksbT1oW25dLGk9dTtpPHUrcDtpKyspbVtpXT0ieCJ9cmV0dXJuIHQuY2hlY2tDb2x1bW5Db3VudChyLGgsbS5sZW5ndGgpLG0ubGVuZ3RofSxjaGVja0NvbHVtbkNvdW50OmZ1bmN0aW9uKGUsdCxyKXt2YXIgbyxzLGE9ITAsbj1bXTtmb3Iobz0wO288dC5sZW5ndGg7bysrKWlmKHRbb10mJihzPXRbb10ubGVuZ3RoLHRbb10ubGVuZ3RoIT09cikpe2E9ITE7YnJlYWt9YXx8KGUuZWFjaChmdW5jdGlvbihlLHQpe3ZhciByPXQucGFyZW50RWxlbWVudC5ub2RlTmFtZTtuLmluZGV4T2Yocik8MCYmbi5wdXNoKHIpfSksY29uc29sZS5lcnJvcigiSW52YWxpZCBvciBpbmNvcnJlY3QgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlICIrbi5qb2luKCIgb3IgIikrIjsgZXhwZWN0ZWQgIityKyIsIGJ1dCBmb3VuZCAiK3MrIiBjb2x1bW5zIikpfSxmaXhDb2x1bW5XaWR0aDpmdW5jdGlvbihyKXt2YXIgbyxzLGEsbixpLGw9KHI9ZShyKVswXSkuY29uZmlnLGQ9bC4kdGFibGUuY2hpbGRyZW4oImNvbGdyb3VwIik7aWYoZC5sZW5ndGgmJmQuaGFzQ2xhc3ModC5jc3MuY29sZ3JvdXApJiZkLnJlbW92ZSgpLGwud2lkdGhGaXhlZCYmMD09PWwuJHRhYmxlLmNoaWxkcmVuKCJjb2xncm91cCIpLmxlbmd0aCl7Zm9yKGQ9ZSgnPGNvbGdyb3VwIGNsYXNzPSInK3QuY3NzLmNvbGdyb3VwKyciPicpLG89bC4kdGFibGUud2lkdGgoKSxuPShhPWwuJHRib2RpZXMuZmluZCgidHI6Zmlyc3QiKS5jaGlsZHJlbigiOnZpc2libGUiKSkubGVuZ3RoLGk9MDtpPG47aSsrKXM9cGFyc2VJbnQoYS5lcShpKS53aWR0aCgpL28qMWUzLDEwKS8xMCsiJSIsZC5hcHBlbmQoZSgiPGNvbD4iKS5jc3MoIndpZHRoIixzKSk7bC4kdGFibGUucHJlcGVuZChkKX19LGdldERhdGE6ZnVuY3Rpb24odCxyLG8pe3ZhciBzLGEsbj0iIixpPWUodCk7cmV0dXJuIGkubGVuZ3RoPyhzPSEhZS5tZXRhZGF0YSYmaS5tZXRhZGF0YSgpLGE9IiAiKyhpLmF0dHIoImNsYXNzIil8fCIiKSx2b2lkIDAhPT1pLmRhdGEobyl8fHZvaWQgMCE9PWkuZGF0YShvLnRvTG93ZXJDYXNlKCkpP24rPWkuZGF0YShvKXx8aS5kYXRhKG8udG9Mb3dlckNhc2UoKSk6cyYmdm9pZCAwIT09c1tvXT9uKz1zW29dOnImJnZvaWQgMCE9PXJbb10/bis9cltvXToiICIhPT1hJiZhLm1hdGNoKCIgIitvKyItIikmJihuPWEubWF0Y2gobmV3IFJlZ0V4cCgiXFxzIitvKyItKFtcXHctXSspIikpWzFdfHwiIiksZS50cmltKG4pKToiIn0sZ2V0Q29sdW1uRGF0YTpmdW5jdGlvbih0LHIsbyxzLGEpe2lmKCJvYmplY3QiIT10eXBlb2Ygcnx8bnVsbD09PXIpcmV0dXJuIHI7dmFyIG4saT0odD1lKHQpWzBdKS5jb25maWcsbD1hfHxpLiRoZWFkZXJzLGQ9aS4kaGVhZGVySW5kZXhlZCYmaS4kaGVhZGVySW5kZXhlZFtvXXx8bC5maW5kKCdbZGF0YS1jb2x1bW49IicrbysnIl06bGFzdCcpO2lmKHZvaWQgMCE9PXJbb10pcmV0dXJuIHM/cltvXTpyW2wuaW5kZXgoZCldO2ZvcihuIGluIHIpaWYoInN0cmluZyI9PXR5cGVvZiBuJiZkLmZpbHRlcihuKS5hZGQoZC5maW5kKG4pKS5sZW5ndGgpcmV0dXJuIHJbbl19LGlzUHJvY2Vzc2luZzpmdW5jdGlvbihyLG8scyl7dmFyIGE9KHI9ZShyKSlbMF0uY29uZmlnLG49c3x8ci5maW5kKCIuIit0LmNzcy5oZWFkZXIpO28/KHZvaWQgMCE9PXMmJmEuc29ydExpc3QubGVuZ3RoPjAmJihuPW4uZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuc29ydERpc2FibGVkJiZ0LmlzVmFsdWVJbkFycmF5KHBhcnNlRmxvYXQoZSh0aGlzKS5hdHRyKCJkYXRhLWNvbHVtbiIpKSxhLnNvcnRMaXN0KT49MH0pKSxyLmFkZChuKS5hZGRDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpKTpyLmFkZChuKS5yZW1vdmVDbGFzcyh0LmNzcy5wcm9jZXNzaW5nKyIgIithLmNzc1Byb2Nlc3NpbmcpfSxwcm9jZXNzVGJvZHk6ZnVuY3Rpb24odCxyLG8pe2lmKHQ9ZSh0KVswXSxvKXJldHVybiB0LmlzUHJvY2Vzc2luZz0hMCxyLmJlZm9yZSgnPGNvbGdyb3VwIGNsYXNzPSJ0YWJsZXNvcnRlci1zYXZlbXlwbGFjZSIvPicpLGUuZm4uZGV0YWNoP3IuZGV0YWNoKCk6ci5yZW1vdmUoKTt2YXIgcz1lKHQpLmZpbmQoImNvbGdyb3VwLnRhYmxlc29ydGVyLXNhdmVteXBsYWNlIik7ci5pbnNlcnRBZnRlcihzKSxzLnJlbW92ZSgpLHQuaXNQcm9jZXNzaW5nPSExfSxjbGVhclRhYmxlQm9keTpmdW5jdGlvbih0KXtlKHQpWzBdLmNvbmZpZy4kdGJvZGllcy5jaGlsZHJlbigpLmRldGFjaCgpfSxjaGFyYWN0ZXJFcXVpdmFsZW50czp7YToiw6HDoMOiw6PDpMSFw6UiLEE6IsOBw4DDgsODw4TEhMOFIixjOiLDp8SHxI0iLEM6IsOHxIbEjCIsZToiw6nDqMOqw6vEm8SZIixFOiLDicOIw4rDi8SaxJgiLGk6IsOtw6zEsMOuw6/EsSIsSToiw43DjMSww47DjyIsbzoiw7PDssO0w7XDtsWNIixPOiLDk8OSw5TDlcOWxYwiLHNzOiLDnyIsU1M6IuG6niIsdToiw7rDucO7w7zFryIsVToiw5rDmcObw5zFriJ9LHJlcGxhY2VBY2NlbnRzOmZ1bmN0aW9uKGUpe3ZhciByLG89IlsiLHM9dC5jaGFyYWN0ZXJFcXVpdmFsZW50cztpZighdC5jaGFyYWN0ZXJSZWdleCl7dC5jaGFyYWN0ZXJSZWdleEFycmF5PXt9O2ZvcihyIGluIHMpInN0cmluZyI9PXR5cGVvZiByJiYobys9c1tyXSx0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl09bmV3IFJlZ0V4cCgiWyIrc1tyXSsiXSIsImciKSk7dC5jaGFyYWN0ZXJSZWdleD1uZXcgUmVnRXhwKG8rIl0iKX1pZih0LmNoYXJhY3RlclJlZ2V4LnRlc3QoZSkpZm9yKHIgaW4gcykic3RyaW5nIj09dHlwZW9mIHImJihlPWUucmVwbGFjZSh0LmNoYXJhY3RlclJlZ2V4QXJyYXlbcl0scikpO3JldHVybiBlfSx2YWxpZGF0ZU9wdGlvbnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG4saT0iaGVhZGVycyBzb3J0Rm9yY2Ugc29ydExpc3Qgc29ydEFwcGVuZCB3aWRnZXRzIi5zcGxpdCgiICIpLGw9ci5vcmlnaW5hbFNldHRpbmdzO2lmKGwpe3QuZGVidWcociwiY29yZSIpJiYobj1uZXcgRGF0ZSk7Zm9yKG8gaW4gbClpZigidW5kZWZpbmVkIj09PShhPXR5cGVvZiB0LmRlZmF1bHRzW29dKSljb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ0YWJsZS5jb25maWcuJytvKyciIG9wdGlvbiBub3QgcmVjb2duaXplZCcpO2Vsc2UgaWYoIm9iamVjdCI9PT1hKWZvcihzIGluIGxbb10pYT10LmRlZmF1bHRzW29dJiZ0eXBlb2YgdC5kZWZhdWx0c1tvXVtzXSxlLmluQXJyYXkobyxpKTwwJiYidW5kZWZpbmVkIj09PWEmJmNvbnNvbGUud2FybignVGFibGVzb3J0ZXIgV2FybmluZyEgInRhYmxlLmNvbmZpZy4nK28rIi4iK3MrJyIgb3B0aW9uIG5vdCByZWNvZ25pemVkJyk7dC5kZWJ1ZyhyLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ2YWxpZGF0ZSBvcHRpb25zIHRpbWU6Iit0LmJlbmNobWFyayhuKSl9fSxyZXN0b3JlSGVhZGVyczpmdW5jdGlvbihyKXt2YXIgbyxzLGE9ZShyKVswXS5jb25maWcsbj1hLiR0YWJsZS5maW5kKGEuc2VsZWN0b3JIZWFkZXJzKSxpPW4ubGVuZ3RoO2ZvcihvPTA7bzxpO28rKykocz1uLmVxKG8pKS5maW5kKCIuIit0LmNzcy5oZWFkZXJJbikubGVuZ3RoJiZzLmh0bWwoYS5oZWFkZXJDb250ZW50W29dKX0sZGVzdHJveTpmdW5jdGlvbihyLG8scyl7aWYoKHI9ZShyKVswXSkuaGFzSW5pdGlhbGl6ZWQpe3QucmVtb3ZlV2lkZ2V0KHIsITAsITEpO3ZhciBhLG49ZShyKSxpPXIuY29uZmlnLGw9bi5maW5kKCJ0aGVhZDpmaXJzdCIpLGQ9bC5maW5kKCJ0ci4iK3QuY3NzLmhlYWRlclJvdykucmVtb3ZlQ2xhc3ModC5jc3MuaGVhZGVyUm93KyIgIitpLmNzc0hlYWRlclJvdyksYz1uLmZpbmQoInRmb290OmZpcnN0ID4gdHIiKS5jaGlsZHJlbigidGgsIHRkIik7ITE9PT1vJiZlLmluQXJyYXkoInVpdGhlbWUiLGkud2lkZ2V0cyk+PTAmJihuLnRyaWdnZXJIYW5kbGVyKCJhcHBseVdpZGdldElkIixbInVpdGhlbWUiXSksbi50cmlnZ2VySGFuZGxlcigiYXBwbHlXaWRnZXRJZCIsWyJ6ZWJyYSJdKSksbC5maW5kKCJ0ciIpLm5vdChkKS5yZW1vdmUoKSxhPSJzb3J0UmVzZXQgdXBkYXRlIHVwZGF0ZVJvd3MgdXBkYXRlQWxsIHVwZGF0ZUhlYWRlcnMgdXBkYXRlQ2VsbCBhZGRSb3dzIHVwZGF0ZUNvbXBsZXRlIHNvcnRvbiBhcHBlbmRDYWNoZSB1cGRhdGVDYWNoZSBhcHBseVdpZGdldElkIGFwcGx5V2lkZ2V0cyByZWZyZXNoV2lkZ2V0cyByZW1vdmVXaWRnZXQgZGVzdHJveSBtb3VzZXVwIG1vdXNlbGVhdmUgIisia2V5cHJlc3Mgc29ydEJlZ2luIHNvcnRFbmQgcmVzZXRUb0xvYWRTdGF0ZSAiLnNwbGl0KCIgIikuam9pbihpLm5hbWVzcGFjZSsiICIpLG4ucmVtb3ZlRGF0YSgidGFibGVzb3J0ZXIiKS51bmJpbmQoYS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLGkuJGhlYWRlcnMuYWRkKGMpLnJlbW92ZUNsYXNzKFt0LmNzcy5oZWFkZXIsaS5jc3NIZWFkZXIsaS5jc3NBc2MsaS5jc3NEZXNjLHQuY3NzLnNvcnRBc2MsdC5jc3Muc29ydERlc2MsdC5jc3Muc29ydE5vbmVdLmpvaW4oIiAiKSkucmVtb3ZlQXR0cigiZGF0YS1jb2x1bW4iKS5yZW1vdmVBdHRyKCJhcmlhLWxhYmVsIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSxkLmZpbmQoaS5zZWxlY3RvclNvcnQpLnVuYmluZCgibW91c2Vkb3duIG1vdXNldXAga2V5cHJlc3MgIi5zcGxpdCgiICIpLmpvaW4oaS5uYW1lc3BhY2UrIiAiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikpLHQucmVzdG9yZUhlYWRlcnMociksbi50b2dnbGVDbGFzcyh0LmNzcy50YWJsZSsiICIraS50YWJsZUNsYXNzKyIgdGFibGVzb3J0ZXItIitpLnRoZW1lLCExPT09byksbi5yZW1vdmVDbGFzcyhpLm5hbWVzcGFjZS5zbGljZSgxKSksci5oYXNJbml0aWFsaXplZD0hMSxkZWxldGUgci5jb25maWcuY2FjaGUsImZ1bmN0aW9uIj09dHlwZW9mIHMmJnMociksdC5kZWJ1ZyhpLCJjb3JlIikmJmNvbnNvbGUubG9nKCJ0YWJsZXNvcnRlciBoYXMgYmVlbiByZW1vdmVkIil9fX07ZS5mbi50YWJsZXNvcnRlcj1mdW5jdGlvbihyKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxzPWUuZXh0ZW5kKCEwLHt9LHQuZGVmYXVsdHMscix0Lmluc3RhbmNlTWV0aG9kcyk7cy5vcmlnaW5hbFNldHRpbmdzPXIsIW8uaGFzSW5pdGlhbGl6ZWQmJnQuYnVpbGRUYWJsZSYmIlRBQkxFIiE9PXRoaXMubm9kZU5hbWU/dC5idWlsZFRhYmxlKG8scyk6dC5zZXR1cChvLHMpfSl9LHdpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5sb2d8fCh0LmxvZ3M9W10sY29uc29sZT17fSxjb25zb2xlLmxvZz1jb25zb2xlLndhcm49Y29uc29sZS5lcnJvcj1jb25zb2xlLnRhYmxlPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50czphcmd1bWVudHNbMF07dC5sb2dzW3QubG9ncy5sZW5ndGhdPXtkYXRlOkRhdGUubm93KCksbG9nOmV9fSksdC5hZGRQYXJzZXIoe2lkOiJuby1wYXJzZXIiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbigpe3JldHVybiIifSx0eXBlOiJ0ZXh0In0pLHQuYWRkUGFyc2VyKHtpZDoidGV4dCIsaXM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9by5jb25maWc7cmV0dXJuIHImJihyPWUudHJpbShzLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpLHI9cy5zb3J0TG9jYWxlQ29tcGFyZT90LnJlcGxhY2VBY2NlbnRzKHIpOnIpLHJ9LHR5cGU6InRleHQifSksdC5yZWdleC5ub25kaWdpdD0vW15cdywuIFwtKCldL2csdC5hZGRQYXJzZXIoe2lkOiJkaWdpdCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaXNEaWdpdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC5jdXJyZW5jeVJlcGxhY2U9L1srXC0sLiBdL2csdC5yZWdleC5jdXJyZW5jeVRlc3Q9L15cKD9cZCtbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXXxbXHUwMGEzJFx1MjBhY1x1MDBhNFx1MDBhNVx1MDBhMj8uXVxkK1wpPyQvLHQuYWRkUGFyc2VyKHtpZDoiY3VycmVuY3kiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiBlPShlfHwiIikucmVwbGFjZSh0LnJlZ2V4LmN1cnJlbmN5UmVwbGFjZSwiIiksdC5yZWdleC5jdXJyZW5jeVRlc3QudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKHIsbyl7dmFyIHM9dC5mb3JtYXRGbG9hdCgocnx8IiIpLnJlcGxhY2UodC5yZWdleC5ub25kaWdpdCwiIiksbyk7cmV0dXJuIHImJiJudW1iZXIiPT10eXBlb2Ygcz9zOnI/ZS50cmltKHImJm8uY29uZmlnLmlnbm9yZUNhc2U/ci50b0xvY2FsZUxvd2VyQ2FzZSgpOnIpOnJ9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC51cmxQcm90b2NvbFRlc3Q9L14oaHR0cHM/fGZ0cHxmaWxlKTpcL1wvLyx0LnJlZ2V4LnVybFByb3RvY29sUmVwbGFjZT0vKGh0dHBzP3xmdHB8ZmlsZSk6XC9cLyh3d3dcLik/Lyx0LmFkZFBhcnNlcih7aWQ6InVybCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVnZXgudXJsUHJvdG9jb2xUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihyKXtyZXR1cm4gcj9lLnRyaW0oci5yZXBsYWNlKHQucmVnZXgudXJsUHJvdG9jb2xSZXBsYWNlLCIiKSk6cn0sdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhc2g9Ly0vZyx0LnJlZ2V4Lmlzb0RhdGU9L15cZHs0fVtcL1wtXVxkezEsMn1bXC9cLV1cZHsxLDJ9Lyx0LmFkZFBhcnNlcih7aWQ6Imlzb0RhdGUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4Lmlzb0RhdGUudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGFzaCwiLyIpKTplO3JldHVybiByIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUocik/ci5nZXRUaW1lKCk6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnBlcmNlbnQ9LyUvZyx0LnJlZ2V4LnBlcmNlbnRUZXN0PS8oXGRccyo/JXwlXHMqP1xkKS8sdC5hZGRQYXJzZXIoe2lkOiJwZXJjZW50IixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC5wZXJjZW50VGVzdC50ZXN0KGUpJiZlLmxlbmd0aDwxNX0sZm9ybWF0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGU/dC5mb3JtYXRGbG9hdChlLnJlcGxhY2UodC5yZWdleC5wZXJjZW50LCIiKSxyKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoiaW1hZ2UiLGlzOmZ1bmN0aW9uKGUsdCxyLG8pe3JldHVybiBvLmZpbmQoImltZyIpLmxlbmd0aD4wfSxmb3JtYXQ6ZnVuY3Rpb24odCxyLG8pe3JldHVybiBlKG8pLmZpbmQoImltZyIpLmF0dHIoci5jb25maWcuaW1nQXR0cnx8ImFsdCIpfHx0fSxwYXJzZWQ6ITAsdHlwZToidGV4dCJ9KSx0LnJlZ2V4LmRhdGVSZXBsYWNlPS8oXFMpKFtBUF1NKSQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0MT0vXltBLVpdezMsMTB9XC4/XHMrXGR7MSwyfSw/XHMrKFxkezR9KShccytcZHsxLDJ9OlxkezJ9KDpcZHsyfSk/KFxzK1tBUF1NKT8pPyQvaSx0LnJlZ2V4LnVzTG9uZ0RhdGVUZXN0Mj0vXlxkezEsMn1ccytbQS1aXXszLDEwfVxzK1xkezR9L2ksdC5hZGRQYXJzZXIoe2lkOiJ1c0xvbmdEYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC51c0xvbmdEYXRlVGVzdDEudGVzdChlKXx8dC5yZWdleC51c0xvbmdEYXRlVGVzdDIudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3ZhciByPWU/bmV3IERhdGUoZS5yZXBsYWNlKHQucmVnZXguZGF0ZVJlcGxhY2UsIiQxICQyIikpOmU7cmV0dXJuIHIgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShyKT9yLmdldFRpbWUoKTplfSx0eXBlOiJudW1lcmljIn0pLHQucmVnZXguc2hvcnREYXRlVGVzdD0vKF5cZHsxLDJ9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezR9KXwoXlxkezR9W1wvXHNdXGR7MSwyfVtcL1xzXVxkezEsMn0pLyx0LnJlZ2V4LnNob3J0RGF0ZVJlcGxhY2U9L1tcLS4sXS9nLHQucmVnZXguc2hvcnREYXRlWFhZPS8oXGR7MSwyfSlbXC9cc10oXGR7MSwyfSlbXC9cc10oXGR7NH0pLyx0LnJlZ2V4LnNob3J0RGF0ZVlNRD0vKFxkezR9KVtcL1xzXShcZHsxLDJ9KVtcL1xzXShcZHsxLDJ9KS8sdC5jb252ZXJ0Rm9ybWF0PWZ1bmN0aW9uKGUscil7ZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLCJtbWRkeXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMS8kMiIpOiJkZG1teXl5eSI9PT1yP2U9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWFhZLCIkMy8kMi8kMSIpOiJ5eXl5bW1kZCI9PT1yJiYoZT1lLnJlcGxhY2UodC5yZWdleC5zaG9ydERhdGVZTUQsIiQxLyQyLyQzIikpO3ZhciBvPW5ldyBEYXRlKGUpO3JldHVybiBvIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUobyk/by5nZXRUaW1lKCk6IiJ9LHQuYWRkUGFyc2VyKHtpZDoic2hvcnREYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5zcGFjZXMsIiAiKS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlUmVwbGFjZSwiLyIpLHQucmVnZXguc2hvcnREYXRlVGVzdC50ZXN0KGUpfSxmb3JtYXQ6ZnVuY3Rpb24oZSxyLG8scyl7aWYoZSl7dmFyIGE9ci5jb25maWcsbj1hLiRoZWFkZXJJbmRleGVkW3NdLGk9bi5sZW5ndGgmJm4uZGF0YSgiZGF0ZUZvcm1hdCIpfHx0LmdldERhdGEobix0LmdldENvbHVtbkRhdGEocixhLmhlYWRlcnMscyksImRhdGVGb3JtYXQiKXx8YS5kYXRlRm9ybWF0O3JldHVybiBuLmxlbmd0aCYmbi5kYXRhKCJkYXRlRm9ybWF0IixpKSx0LmNvbnZlcnRGb3JtYXQoZSxpKXx8ZX1yZXR1cm4gZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnRpbWVUZXN0PS9eKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSkkfF4oKD86WzAxXVxkfFsyXVswLTRdKTpbMC01XVxkKSQvaSx0LnJlZ2V4LnRpbWVNYXRjaD0vKDA/WzEtOV18MVswLTJdKTooWzAtNV1cZCkoXHNbQVBdTSl8KCg/OlswMV1cZHxbMl1bMC00XSk6WzAtNV1cZCkvaSx0LmFkZFBhcnNlcih7aWQ6InRpbWUiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4LnRpbWVUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihlKXt2YXIgcixvPShlfHwiIikubWF0Y2godC5yZWdleC50aW1lTWF0Y2gpLHM9bmV3IERhdGUoZSksYT1lJiYobnVsbCE9PW8/b1swXToiMDA6MDAgQU0iKSxuPWE/bmV3IERhdGUoIjIwMDAvMDEvMDEgIithLnJlcGxhY2UodC5yZWdleC5kYXRlUmVwbGFjZSwiJDEgJDIiKSk6YTtyZXR1cm4gbiBpbnN0YW5jZW9mIERhdGUmJmlzRmluaXRlKG4pPyhyPXMgaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShzKT9zLmdldFRpbWUoKTowLHI/cGFyc2VGbG9hdChuLmdldFRpbWUoKSsiLiIrcy5nZXRUaW1lKCkpOm4uZ2V0VGltZSgpKTplfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkUGFyc2VyKHtpZDoibWV0YWRhdGEiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHM9ci5jb25maWcsYT1zLnBhcnNlck1ldGFkYXRhTmFtZT9zLnBhcnNlck1ldGFkYXRhTmFtZToic29ydFZhbHVlIjtyZXR1cm4gZShvKS5tZXRhZGF0YSgpW2FdfSx0eXBlOiJudW1lcmljIn0pLHQuYWRkV2lkZ2V0KHtpZDoiemVicmEiLHByaW9yaXR5OjkwLGZvcm1hdDpmdW5jdGlvbih0LHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZz1uZXcgUmVnRXhwKHIuY3NzQ2hpbGRSb3csImkiKSxwPXIuJHRib2RpZXMuYWRkKGUoci5uYW1lc3BhY2UrIl9leHRyYV90YWJsZSIpLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrci5jc3NJbmZvQmxvY2srIikiKSk7Zm9yKGw9MDtsPHAubGVuZ3RoO2wrKylmb3Iobj0wLGM9KHM9cC5lcShsKS5jaGlsZHJlbigidHI6dmlzaWJsZSIpLm5vdChyLnNlbGVjdG9yUmVtb3ZlKSkubGVuZ3RoLGQ9MDtkPGM7ZCsrKWE9cy5lcShkKSxnLnRlc3QoYVswXS5jbGFzc05hbWUpfHxuKyssaT1uJTI9PTAsYS5yZW1vdmVDbGFzcyhvLnplYnJhW2k/MTowXSkuYWRkQ2xhc3Moby56ZWJyYVtpPzA6MV0pfSxyZW1vdmU6ZnVuY3Rpb24oZSxyLG8scyl7aWYoIXMpe3ZhciBhLG4saT1yLiR0Ym9kaWVzLGw9KG8uemVicmF8fFsiZXZlbiIsIm9kZCJdKS5qb2luKCIgIik7Zm9yKGE9MDthPGkubGVuZ3RoO2ErKykobj10LnByb2Nlc3NUYm9keShlLGkuZXEoYSksITApKS5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKGwpLHQucHJvY2Vzc1Rib2R5KGUsbiwhMSl9fX0pfShlKSxlLnRhYmxlc29ydGVyfSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qCiAgICBDb3B5cmlnaHQgMjAwOC0yMDEzCiAgICAgICAgTWF0dGhpYXMgRWhtYW5uLAogICAgICAgIE1pY2hhZWwgR2VyaGFldXNlciwKICAgICAgICBDYXJzdGVuIE1pbGxlciwKICAgICAgICBCaWFuY2EgVmFsZW50aW4sCiAgICAgICAgQWxmcmVkIFdhc3Nlcm1hbm4sCiAgICAgICAgUGV0ZXIgV2lsZmFocnQKICAgIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBvciBMR1BMIFZlcnNpb24gMyBsaWNlbnNlcy4KICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UgYWxvbmcgd2l0aCBKU1hDb21wcmVzc29yLgogICAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8+LgoqLwooZnVuY3Rpb24oKXt2YXIgZSxyLG47KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG8oZSxyKXtyZXR1cm4gQy5jYWxsKGUscil9ZnVuY3Rpb24gaShlLHIpe3ZhciBuLHQsbyxpLGEsdSxjLGYscyxsLHA9ciYmci5zcGxpdCgiLyIpLGg9ay5tYXAsZD1oJiZoWyIqIl18fHt9O2lmKGUmJiIuIj09PWUuY2hhckF0KDApKWlmKHIpe2ZvcihwPXAuc2xpY2UoMCxwLmxlbmd0aC0xKSxlPXAuY29uY2F0KGUuc3BsaXQoIi8iKSksZj0wO2UubGVuZ3RoPmY7Zis9MSlpZihsPWVbZl0sIi4iPT09bCllLnNwbGljZShmLDEpLGYtPTE7ZWxzZSBpZigiLi4iPT09bCl7aWYoMT09PWYmJigiLi4iPT09ZVsyXXx8Ii4uIj09PWVbMF0pKWJyZWFrO2Y+MCYmKGUuc3BsaWNlKGYtMSwyKSxmLT0yKX1lPWUuam9pbigiLyIpfWVsc2UgMD09PWUuaW5kZXhPZigiLi8iKSYmKGU9ZS5zdWJzdHJpbmcoMikpO2lmKChwfHxkKSYmaCl7Zm9yKG49ZS5zcGxpdCgiLyIpLGY9bi5sZW5ndGg7Zj4wO2YtPTEpe2lmKHQ9bi5zbGljZSgwLGYpLmpvaW4oIi8iKSxwKWZvcihzPXAubGVuZ3RoO3M+MDtzLT0xKWlmKG89aFtwLnNsaWNlKDAscykuam9pbigiLyIpXSxvJiYobz1vW3RdKSl7aT1vLGE9ZjticmVha31pZihpKWJyZWFrOyF1JiZkJiZkW3RdJiYodT1kW3RdLGM9Zil9IWkmJnUmJihpPXUsYT1jKSxpJiYobi5zcGxpY2UoMCxhLGkpLGU9bi5qb2luKCIvIikpfXJldHVybiBlfWZ1bmN0aW9uIGEoZSxyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaC5hcHBseSh0LHYuY2FsbChhcmd1bWVudHMsMCkuY29uY2F0KFtlLHJdKSl9fWZ1bmN0aW9uIHUoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBpKHIsZSl9fWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe2JbZV09cn19ZnVuY3Rpb24gZihlKXtpZihvKG0sZSkpe3ZhciByPW1bZV07ZGVsZXRlIG1bZV0seVtlXT0hMCxwLmFwcGx5KHQscil9aWYoIW8oYixlKSYmIW8oeSxlKSl0aHJvdyBFcnJvcigiTm8gIitlKTtyZXR1cm4gYltlXX1mdW5jdGlvbiBzKGUpe3ZhciByLG49ZT9lLmluZGV4T2YoIiEiKTotMTtyZXR1cm4gbj4tMSYmKHI9ZS5zdWJzdHJpbmcoMCxuKSxlPWUuc3Vic3RyaW5nKG4rMSxlLmxlbmd0aCkpLFtyLGVdfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGsmJmsuY29uZmlnJiZrLmNvbmZpZ1tlXXx8e319fXZhciBwLGgsZCxnLGI9e30sbT17fSxrPXt9LHk9e30sQz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHY9W10uc2xpY2U7ZD1mdW5jdGlvbihlLHIpe3ZhciBuLHQ9cyhlKSxvPXRbMF07cmV0dXJuIGU9dFsxXSxvJiYobz1pKG8sciksbj1mKG8pKSxvP2U9biYmbi5ub3JtYWxpemU/bi5ub3JtYWxpemUoZSx1KHIpKTppKGUscik6KGU9aShlLHIpLHQ9cyhlKSxvPXRbMF0sZT10WzFdLG8mJihuPWYobykpKSx7ZjpvP28rIiEiK2U6ZSxuOmUscHI6byxwOm59fSxnPXtyZXF1aXJlOmZ1bmN0aW9uKGUpe3JldHVybiBhKGUpfSxleHBvcnRzOmZ1bmN0aW9uKGUpe3ZhciByPWJbZV07cmV0dXJuIHIhPT12b2lkIDA/cjpiW2VdPXt9fSxtb2R1bGU6ZnVuY3Rpb24oZSl7cmV0dXJue2lkOmUsdXJpOiIiLGV4cG9ydHM6YltlXSxjb25maWc6bChlKX19fSxwPWZ1bmN0aW9uKGUscixuLGkpe3ZhciB1LHMsbCxwLGgsayxDPVtdO2lmKGk9aXx8ZSwiZnVuY3Rpb24iPT10eXBlb2Ygbil7Zm9yKHI9IXIubGVuZ3RoJiZuLmxlbmd0aD9bInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl06cixoPTA7ci5sZW5ndGg+aDtoKz0xKWlmKHA9ZChyW2hdLGkpLHM9cC5mLCJyZXF1aXJlIj09PXMpQ1toXT1nLnJlcXVpcmUoZSk7ZWxzZSBpZigiZXhwb3J0cyI9PT1zKUNbaF09Zy5leHBvcnRzKGUpLGs9ITA7ZWxzZSBpZigibW9kdWxlIj09PXMpdT1DW2hdPWcubW9kdWxlKGUpO2Vsc2UgaWYobyhiLHMpfHxvKG0scyl8fG8oeSxzKSlDW2hdPWYocyk7ZWxzZXtpZighcC5wKXRocm93IEVycm9yKGUrIiBtaXNzaW5nICIrcyk7cC5wLmxvYWQocC5uLGEoaSwhMCksYyhzKSx7fSksQ1toXT1iW3NdfWw9bi5hcHBseShiW2VdLEMpLGUmJih1JiZ1LmV4cG9ydHMhPT10JiZ1LmV4cG9ydHMhPT1iW2VdP2JbZV09dS5leHBvcnRzOmw9PT10JiZrfHwoYltlXT1sKSl9ZWxzZSBlJiYoYltlXT1uKX0sZT1yPWg9ZnVuY3Rpb24oZSxyLG4sbyxpKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/Z1tlXT9nW2VdKHIpOmYoZChlLHIpLmYpOihlLnNwbGljZXx8KGs9ZSxyLnNwbGljZT8oZT1yLHI9bixuPW51bGwpOmU9dCkscj1yfHxmdW5jdGlvbigpe30sImZ1bmN0aW9uIj09dHlwZW9mIG4mJihuPW8sbz1pKSxvP3AodCxlLHIsbik6c2V0VGltZW91dChmdW5jdGlvbigpe3AodCxlLHIsbil9LDQpLGgpfSxoLmNvbmZpZz1mdW5jdGlvbihlKXtyZXR1cm4gaz1lLGsuZGVwcyYmaChrLmRlcHMsay5jYWxsYmFjayksaH0sbj1mdW5jdGlvbihlLHIsbil7ci5zcGxpY2V8fChuPXIscj1bXSksbyhiLGUpfHxvKG0sZSl8fChtW2VdPVtlLHIsbl0pfSxuLmFtZD17alF1ZXJ5OiEwfX0pKCksbigiLi4vbm9kZV9tb2R1bGVzL2FsbW9uZC9hbG1vbmQiLGZ1bmN0aW9uKCl7fSksbigianhnIixbXSxmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiJvYmplY3QiIT10eXBlb2YgSlhHfHxKWEcuZXh0ZW5kfHwoZT1KWEcpLGUuZXh0ZW5kPWZ1bmN0aW9uKGUscixuLHQpe3ZhciBvLGk7bj1ufHwhMSx0PXR8fCExO2ZvcihvIGluIHIpKCFufHxuJiZyLmhhc093blByb3BlcnR5KG8pKSYmKGk9dD9vLnRvTG93ZXJDYXNlKCk6byxlW2ldPXJbb10pfSxlLmV4dGVuZChlLHtib2FyZHM6e30scmVhZGVyczp7fSxlbGVtZW50czp7fSxyZWdpc3RlckVsZW1lbnQ6ZnVuY3Rpb24oZSxyKXtlPWUudG9Mb3dlckNhc2UoKSx0aGlzLmVsZW1lbnRzW2VdPXJ9LHJlZ2lzdGVyUmVhZGVyOmZ1bmN0aW9uKGUscil7dmFyIG4sdDtmb3Iobj0wO3IubGVuZ3RoPm47bisrKXQ9cltuXS50b0xvd2VyQ2FzZSgpLCJmdW5jdGlvbiIhPXR5cGVvZiB0aGlzLnJlYWRlcnNbdF0mJih0aGlzLnJlYWRlcnNbdF09ZSl9LHNob3J0Y3V0OmZ1bmN0aW9uKGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbcl0uYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sZ2V0UmVmOmZ1bmN0aW9uKGUscil7cmV0dXJuIGUuc2VsZWN0KHIpfSxnZXRSZWZlcmVuY2U6ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZS5zZWxlY3Qocil9LGRlYnVnSW50OmZ1bmN0aW9uKCl7dmFyIGUscjtmb3IoZT0wO2FyZ3VtZW50cy5sZW5ndGg+ZTtlKyspcj1hcmd1bWVudHNbZV0sIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZz9jb25zb2xlLmxvZyhyKToib2JqZWN0Ij09dHlwZW9mIGRvY3VtZW50JiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGVidWciKSYmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZWJ1ZyIpLmlubmVySFRNTCs9cisiPGJyLz4iKX0sZGVidWdXU1Q6ZnVuY3Rpb24oKXt2YXIgcj1FcnJvcigpO2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHImJnIuc3RhY2smJihlLmRlYnVnSW50KCJzdGFja3RyYWNlIiksZS5kZWJ1Z0ludChyLnN0YWNrLnNwbGl0KCJcbiIpLnNsaWNlKDEpLmpvaW4oIlxuIikpKX0sZGVidWdMaW5lOmZ1bmN0aW9uKCl7dmFyIHI9RXJyb3IoKTtlLmRlYnVnSW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyJiZyLnN0YWNrJiZlLmRlYnVnSW50KCJDYWxsZWQgZnJvbSIsci5zdGFjay5zcGxpdCgiXG4iKS5zbGljZSgyLDMpLmpvaW4oIlxuIikpfSxkZWJ1ZzpmdW5jdGlvbigpe2UuZGVidWdJbnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pLGV9KSxuKCJ1dGlscy96aXAiLFsianhnIl0sZnVuY3Rpb24oZSl7dmFyIHI9WzAsMTI4LDY0LDE5MiwzMiwxNjAsOTYsMjI0LDE2LDE0NCw4MCwyMDgsNDgsMTc2LDExMiwyNDAsOCwxMzYsNzIsMjAwLDQwLDE2OCwxMDQsMjMyLDI0LDE1Miw4OCwyMTYsNTYsMTg0LDEyMCwyNDgsNCwxMzIsNjgsMTk2LDM2LDE2NCwxMDAsMjI4LDIwLDE0OCw4NCwyMTIsNTIsMTgwLDExNiwyNDQsMTIsMTQwLDc2LDIwNCw0NCwxNzIsMTA4LDIzNiwyOCwxNTYsOTIsMjIwLDYwLDE4OCwxMjQsMjUyLDIsMTMwLDY2LDE5NCwzNCwxNjIsOTgsMjI2LDE4LDE0Niw4MiwyMTAsNTAsMTc4LDExNCwyNDIsMTAsMTM4LDc0LDIwMiw0MiwxNzAsMTA2LDIzNCwyNiwxNTQsOTAsMjE4LDU4LDE4NiwxMjIsMjUwLDYsMTM0LDcwLDE5OCwzOCwxNjYsMTAyLDIzMCwyMiwxNTAsODYsMjE0LDU0LDE4MiwxMTgsMjQ2LDE0LDE0Miw3OCwyMDYsNDYsMTc0LDExMCwyMzgsMzAsMTU4LDk0LDIyMiw2MiwxOTAsMTI2LDI1NCwxLDEyOSw2NSwxOTMsMzMsMTYxLDk3LDIyNSwxNywxNDUsODEsMjA5LDQ5LDE3NywxMTMsMjQxLDksMTM3LDczLDIwMSw0MSwxNjksMTA1LDIzMywyNSwxNTMsODksMjE3LDU3LDE4NSwxMjEsMjQ5LDUsMTMzLDY5LDE5NywzNywxNjUsMTAxLDIyOSwyMSwxNDksODUsMjEzLDUzLDE4MSwxMTcsMjQ1LDEzLDE0MSw3NywyMDUsNDUsMTczLDEwOSwyMzcsMjksMTU3LDkzLDIyMSw2MSwxODksMTI1LDI1MywzLDEzMSw2NywxOTUsMzUsMTYzLDk5LDIyNywxOSwxNDcsODMsMjExLDUxLDE3OSwxMTUsMjQzLDExLDEzOSw3NSwyMDMsNDMsMTcxLDEwNywyMzUsMjcsMTU1LDkxLDIxOSw1OSwxODcsMTIzLDI1MSw3LDEzNSw3MSwxOTksMzksMTY3LDEwMywyMzEsMjMsMTUxLDg3LDIxNSw1NSwxODMsMTE5LDI0NywxNSwxNDMsNzksMjA3LDQ3LDE3NSwxMTEsMjM5LDMxLDE1OSw5NSwyMjMsNjMsMTkxLDEyNywyNTVdLG49WzMsNCw1LDYsNyw4LDksMTAsMTEsMTMsMTUsMTcsMTksMjMsMjcsMzEsMzUsNDMsNTEsNTksNjcsODMsOTksMTE1LDEzMSwxNjMsMTk1LDIyNywyNTgsMCwwXSx0PVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDAsOTksOTldLG89WzEsMiwzLDQsNSw3LDksMTMsMTcsMjUsMzMsNDksNjUsOTcsMTI5LDE5MywyNTcsMzg1LDUxMyw3NjksMTAyNSwxNTM3LDIwNDksMzA3Myw0MDk3LDYxNDUsODE5MywxMjI4OSwxNjM4NSwyNDU3N10saT1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sYT1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sdT0yNTY7cmV0dXJuIGUuVXRpbD1lLlV0aWx8fHt9LGUuVXRpbC5VbnppcD1mdW5jdGlvbihjKXtmdW5jdGlvbiBmKCl7cmV0dXJuIFIrPTgsTz5YP2NbWCsrXTotMX1mdW5jdGlvbiBzKCl7Qj0xfWZ1bmN0aW9uIGwoKXt2YXIgZTt0cnl7cmV0dXJuIFIrKyxlPTEmQixCPj49MSwwPT09QiYmKEI9ZigpLGU9MSZCLEI9MTI4fEI+PjEpLGV9Y2F0Y2gocil7dGhyb3cgcn19ZnVuY3Rpb24gcChlKXt2YXIgbj0wLHQ9ZTt0cnl7Zm9yKDt0LS07KW49bjw8MXxsKCk7ZSYmKG49cltuXT4+OC1lKX1jYXRjaChvKXt0aHJvdyBvfXJldHVybiBufWZ1bmN0aW9uIGgoKXtKPTB9ZnVuY3Rpb24gZChlKXtqKyssR1tKKytdPWUsei5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpLDMyNzY4PT09SiYmKEo9MCl9ZnVuY3Rpb24gZygpe3RoaXMuYjA9MCx0aGlzLmIxPTAsdGhpcy5qdW1wPW51bGwsdGhpcy5qdW1wcG9zPS0xfWZ1bmN0aW9uIGIoKXtmb3IoOzspe2lmKE1bSF0+PXgpcmV0dXJuLTE7aWYoVVtNW0hdXT09PUgpcmV0dXJuIE1bSF0rKztNW0hdKyt9fWZ1bmN0aW9uIG0oKXt2YXIgZSxyPVBbRl07aWYoMTc9PT1IKXJldHVybi0xO2lmKEYrKyxIKyssZT1iKCksZT49MClyLmIwPWU7ZWxzZSBpZihyLmIwPTMyNzY4LG0oKSlyZXR1cm4tMTtpZihlPWIoKSxlPj0wKXIuYjE9ZSxyLmp1bXA9bnVsbDtlbHNlIGlmKHIuYjE9MzI3Njgsci5qdW1wPVBbRl0sci5qdW1wcG9zPUYsbSgpKXJldHVybi0xO3JldHVybiBILS0sMH1mdW5jdGlvbiBrKGUscixuKXt2YXIgdDtmb3IoUD1lLEY9MCxVPW4seD1yLHQ9MDsxNz50O3QrKylNW3RdPTA7cmV0dXJuIEg9MCxtKCk/LTE6MH1mdW5jdGlvbiB5KGUpe2Zvcih2YXIgcixuLHQsbz0wLGk9ZVtvXTs7KWlmKHQ9bCgpKXtpZighKDMyNzY4JmkuYjEpKXJldHVybiBpLmIxO2ZvcihpPWkuanVtcCxyPWUubGVuZ3RoLG49MDtyPm47bisrKWlmKGVbbl09PT1pKXtvPW47YnJlYWt9fWVsc2V7aWYoISgzMjc2OCZpLmIwKSlyZXR1cm4gaS5iMDtvKyssaT1lW29dfX1mdW5jdGlvbiBDKCl7dmFyIHUsYyxiLG0sQyx2LEEsaix3LFUseCxTLHosSSxFLEwsTztkbyBpZih1PWwoKSxiPXAoMiksMD09PWIpZm9yKHMoKSxVPWYoKSxVfD1mKCk8PDgsUz1mKCksU3w9ZigpPDw4LDY1NTM1JihVXn5TKSYmZS5kZWJ1ZygiQmxvY2tMZW4gY2hlY2tzdW0gbWlzbWF0Y2hcbiIpO1UtLTspYz1mKCksZChjKTtlbHNlIGlmKDE9PT1iKWZvcig7OylpZihDPXJbcCg3KV0+PjEsQz4yMz8oQz1DPDwxfGwoKSxDPjE5OT8oQy09MTI4LEM9Qzw8MXxsKCkpOihDLT00OCxDPjE0MyYmKEMrPTEzNikpKTpDKz0yNTYsMjU2PkMpZChDKTtlbHNle2lmKDI1Nj09PUMpYnJlYWs7Zm9yKEMtPTI1Nyx3PXAodFtDXSkrbltDXSxDPXJbcCg1KV0+PjMsaVtDXT44Pyh4PXAoOCkseHw9cChpW0NdLTgpPDw4KTp4PXAoaVtDXSkseCs9b1tDXSxDPTA7dz5DO0MrKyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgaWYoMj09PWIpe2ZvcihBPUFycmF5KDMyMCksST0yNTcrcCg1KSxFPTErcCg1KSxMPTQrcCg0KSxDPTA7MTk+QztDKyspQVtDXT0wO2ZvcihDPTA7TD5DO0MrKylBW2FbQ11dPXAoMyk7Zm9yKHc9cS5sZW5ndGgsbT0wO3c+bTttKyspcVttXT1uZXcgZztpZihrKHEsMTksQSwwKSlyZXR1cm4gaCgpLDE7Zm9yKHo9SStFLG09MCxPPS0xO3o+bTspaWYoTysrLEM9eShxKSwxNj5DKUFbbSsrXT1DO2Vsc2UgaWYoMTY9PT1DKXtpZihDPTMrcCgyKSxtK0M+eilyZXR1cm4gaCgpLDE7Zm9yKHY9bT9BW20tMV06MDtDLS07KUFbbSsrXT12fWVsc2V7aWYoQz0xNz09PUM/MytwKDMpOjExK3AoNyksbStDPnopcmV0dXJuIGgoKSwxO2Zvcig7Qy0tOylBW20rK109MH1mb3Iodz1ULmxlbmd0aCxtPTA7dz5tO20rKylUW21dPW5ldyBnO2lmKGsoVCxJLEEsMCkpcmV0dXJuIGgoKSwxO2Zvcih3PVQubGVuZ3RoLG09MDt3Pm07bSsrKXFbbV09bmV3IGc7Zm9yKGo9W10sbT1JO0EubGVuZ3RoPm07bSsrKWpbbS1JXT1BW21dO2lmKGsocSxFLGosMCkpcmV0dXJuIGgoKSwxO2Zvcig7OylpZihDPXkoVCksQz49MjU2KXtpZihDLT0yNTYsMD09PUMpYnJlYWs7Zm9yKEMtPTEsdz1wKHRbQ10pK25bQ10sQz15KHEpLGlbQ10+OD8oeD1wKDgpLHh8PXAoaVtDXS04KTw8OCk6eD1wKGlbQ10pLHgrPW9bQ107dy0tOyljPUdbMzI3NjcmSi14XSxkKGMpfWVsc2UgZChDKX13aGlsZSghdSk7cmV0dXJuIGgoKSxzKCksMH1mdW5jdGlvbiB2KCl7dmFyIGUscixuLHQsbyxpLGEsYyxzPVtdO3RyeXtpZih6PVtdLEw9ITEsc1swXT1mKCksc1sxXT1mKCksMTIwPT09c1swXSYmMjE4PT09c1sxXSYmKEMoKSxFW0ldPVt6LmpvaW4oIiIpLCJnZW9uZXh0Lmd4dCJdLEkrKyksMzE9PT1zWzBdJiYxMzk9PT1zWzFdJiYoUygpLEVbSV09W3ouam9pbigiIiksImZpbGUiXSxJKyspLDgwPT09c1swXSYmNzU9PT1zWzFdJiYoTD0hMCxzWzJdPWYoKSxzWzNdPWYoKSwzPT09c1syXSYmND09PXNbM10pKXtmb3Ioc1swXT1mKCksc1sxXT1mKCksQT1mKCksQXw9ZigpPDw4LGM9ZigpLGN8PWYoKTw8OCxmKCksZigpLGYoKSxmKCksYT1mKCksYXw9ZigpPDw4LGF8PWYoKTw8MTYsYXw9ZigpPDwyNCxpPWYoKSxpfD1mKCk8PDgsaXw9ZigpPDwxNixpfD1mKCk8PDI0LG89ZigpLG98PWYoKTw8OCxvfD1mKCk8PDE2LG98PWYoKTw8MjQsdD1mKCksdHw9ZigpPDw4LG49ZigpLG58PWYoKTw8OCxlPTAsTj1bXTt0LS07KXI9ZigpLCIvIj09PXJ8IjoiPT09cj9lPTA6dS0xPmUmJihOW2UrK109U3RyaW5nLmZyb21DaGFyQ29kZShyKSk7Zm9yKHd8fCh3PU4pLGU9MDtuPmU7KXI9ZigpLGUrKztqPTAsOD09PWMmJihDKCksRVtJXT1BcnJheSgyKSxFW0ldWzBdPXouam9pbigiIiksRVtJXVsxXT1OLmpvaW4oIiIpLEkrKyksUygpfX1jYXRjaChsKXt0aHJvdyBsfX12YXIgQSxqLHcsVSx4LFMsej1bXSxJPTAsRT1bXSxHPUFycmF5KDMyNzY4KSxKPTAsTD0hMSxPPWMubGVuZ3RoLFg9MCxCPTEsUj0wLFQ9QXJyYXkoMjg4KSxxPUFycmF5KDMyKSxGPTAsUD1udWxsLEg9KEFycmF5KDY0KSxBcnJheSg2NCksMCksTT1BcnJheSgxNyksTj1bXTtNWzBdPTAsUz1mdW5jdGlvbigpe3ZhciBlLHIsbix0LG8saSxhPVtdO2lmKDgmQSYmKGFbMF09ZigpLGFbMV09ZigpLGFbMl09ZigpLGFbM109ZigpLDgwPT09YVswXSYmNzU9PT1hWzFdJiY3PT09YVsyXSYmOD09PWFbM10/KGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQpOmU9YVswXXxhWzFdPDw4fGFbMl08PDE2fGFbM108PDI0LHI9ZigpLHJ8PWYoKTw8OCxyfD1mKCk8PDE2LHJ8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCksTCYmdigpLGFbMF09ZigpLDg9PT1hWzBdKXtpZihBPWYoKSxmKCksZigpLGYoKSxmKCksZigpLHQ9ZigpLDQmQSlmb3IoYVswXT1mKCksYVsyXT1mKCksSD1hWzBdKzI1NiphWzFdLG89MDtIPm87bysrKWYoKTtpZig4JkEpZm9yKG89MCxOPVtdLGk9ZigpO2k7KSgiNyI9PT1pfHwiOiI9PT1pKSYmKG89MCksdS0xPm8mJihOW28rK109aSksaT1mKCk7aWYoMTYmQSlmb3IoaT1mKCk7aTspaT1mKCk7MiZBJiYoZigpLGYoKSksQygpLGU9ZigpLGV8PWYoKTw8OCxlfD1mKCk8PDE2LGV8PWYoKTw8MjQsbj1mKCksbnw9ZigpPDw4LG58PWYoKTw8MTYsbnw9ZigpPDwyNCxMJiZ2KCl9fSxlLlV0aWwuVW56aXAucHJvdG90eXBlLnVuemlwRmlsZT1mdW5jdGlvbihlKXt2YXIgcjtmb3IodGhpcy51bnppcCgpLHI9MDtFLmxlbmd0aD5yO3IrKylpZihFW3JdWzFdPT09ZSlyZXR1cm4gRVtyXVswXTtyZXR1cm4iIn0sZS5VdGlsLlVuemlwLnByb3RvdHlwZS51bnppcD1mdW5jdGlvbigpe3JldHVybiB2KCksRX19LGUuVXRpbH0pLG4oInV0aWxzL2VuY29kaW5nIixbImp4ZyJdLGZ1bmN0aW9uKGUpe3ZhciByPTAsbj1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsOCw4LDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDEwLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDQsMywzLDExLDYsNiw2LDUsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDAsMTIsMjQsMzYsNjAsOTYsODQsMTIsMTIsMTIsNDgsNzIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMCwxMiwxMiwxMiwxMiwxMiwwLDEyLDAsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMjQsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMzYsMTIsMzYsMTIsMTIsMTIsMzYsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTIsMTJdO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuVVRGOD17ZW5jb2RlOmZ1bmN0aW9uKGUpe3ZhciByLG4sdD0iIixvPWUubGVuZ3RoO2lmKGU9ZS5yZXBsYWNlKC9cclxuL2csIlxuIiksImZ1bmN0aW9uIj09dHlwZW9mIHVuZXNjYXBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZW5jb2RlVVJJQ29tcG9uZW50KXJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpO2ZvcihyPTA7bz5yO3IrKyluPWUuY2hhckNvZGVBdChyKSwxMjg+bj90Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKG4pOm4+MTI3JiYyMDQ4Pm4/KHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTkyfG4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKToodCs9U3RyaW5nLmZyb21DaGFyQ29kZSgyMjR8bj4+MTIpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4+PjYpLHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI4fDYzJm4pKTtyZXR1cm4gdH0sZGVjb2RlOmZ1bmN0aW9uKGUpe3ZhciB0LG8saSxhPTAsdT0wLGM9cixmPVtdLHM9ZS5sZW5ndGgsbD1bXTtmb3IodD0wO3M+dDt0Kyspbz1lLmNoYXJDb2RlQXQodCksaT1uW29dLHU9YyE9PXI/NjMmb3x1PDw2OjI1NT4+aSZvLGM9blsyNTYrYytpXSxjPT09ciYmKHU+NjU1MzU/Zi5wdXNoKDU1MjMyKyh1Pj4xMCksNTYzMjArKDEwMjMmdSkpOmYucHVzaCh1KSxhKyssMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxmKSksZj1bXSkpO3JldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGYpKSxsLmpvaW4oIiIpfSxhc2NpaUNoYXJDb2RlQXQ6ZnVuY3Rpb24oZSxyKXt2YXIgbj1lLmNoYXJDb2RlQXQocik7aWYobj4yNTUpc3dpdGNoKG4pe2Nhc2UgODM2NDpuPTEyODticmVhaztjYXNlIDgyMTg6bj0xMzA7YnJlYWs7Y2FzZSA0MDI6bj0xMzE7YnJlYWs7Y2FzZSA4MjIyOm49MTMyO2JyZWFrO2Nhc2UgODIzMDpuPTEzMzticmVhaztjYXNlIDgyMjQ6bj0xMzQ7YnJlYWs7Y2FzZSA4MjI1Om49MTM1O2JyZWFrO2Nhc2UgNzEwOm49MTM2O2JyZWFrO2Nhc2UgODI0MDpuPTEzNzticmVhaztjYXNlIDM1MjpuPTEzODticmVhaztjYXNlIDgyNDk6bj0xMzk7YnJlYWs7Y2FzZSAzMzg6bj0xNDA7YnJlYWs7Y2FzZSAzODE6bj0xNDI7YnJlYWs7Y2FzZSA4MjE2Om49MTQ1O2JyZWFrO2Nhc2UgODIxNzpuPTE0NjticmVhaztjYXNlIDgyMjA6bj0xNDc7YnJlYWs7Y2FzZSA4MjIxOm49MTQ4O2JyZWFrO2Nhc2UgODIyNjpuPTE0OTticmVhaztjYXNlIDgyMTE6bj0xNTA7YnJlYWs7Y2FzZSA4MjEyOm49MTUxO2JyZWFrO2Nhc2UgNzMyOm49MTUyO2JyZWFrO2Nhc2UgODQ4MjpuPTE1MzticmVhaztjYXNlIDM1MzpuPTE1NDticmVhaztjYXNlIDgyNTA6bj0xNTU7YnJlYWs7Y2FzZSAzMzk6bj0xNTY7YnJlYWs7Y2FzZSAzODI6bj0xNTg7YnJlYWs7Y2FzZSAzNzY6bj0xNTk7YnJlYWs7ZGVmYXVsdDp9cmV0dXJuIG59fSxlLlV0aWwuVVRGOH0pLG4oInV0aWxzL2Jhc2U2NCIsWyJqeGciLCJ1dGlscy9lbmNvZGluZyJdLGZ1bmN0aW9uKGUscil7ZnVuY3Rpb24gbihlLHIpe3JldHVybiAyNTUmZS5jaGFyQ29kZUF0KHIpfWZ1bmN0aW9uIHQoZSxyKXt2YXIgbj1vLmluZGV4T2YoZS5jaGFyQXQocikpO2lmKC0xPT09bil0aHJvdyBFcnJvcigiSlNYR3JhcGgvdXRpbHMvYmFzZTY0OiBDYW4ndCBkZWNvZGUgc3RyaW5nIChpbnZhbGlkIGNoYXJhY3RlcikuIik7cmV0dXJuIG59dmFyIG89IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGk9Ij0iO3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuQmFzZTY0PXtlbmNvZGU6ZnVuY3Rpb24oZSl7dmFyIHQsYSx1LGMsZixzPVtdO2ZvcihmPXIuZW5jb2RlKGUpLHU9Zi5sZW5ndGgsYz11JTMsdD0wO3UtYz50O3QrPTMpYT1uKGYsdCk8PDE2fG4oZix0KzEpPDw4fG4oZix0KzIpLHMucHVzaChvLmNoYXJBdChhPj4xOCksby5jaGFyQXQoNjMmYT4+MTIpLG8uY2hhckF0KDYzJmE+PjYpLG8uY2hhckF0KDYzJmEpKTtzd2l0Y2goYyl7Y2FzZSAxOmE9bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjIpLG8uY2hhckF0KDYzJmE8PDQpLGksaSk7YnJlYWs7Y2FzZSAyOmE9bihmLHUtMik8PDh8bihmLHUtMSkscy5wdXNoKG8uY2hhckF0KGE+PjEwKSxvLmNoYXJBdCg2MyZhPj40KSxvLmNoYXJBdCg2MyZhPDwyKSxpKX1yZXR1cm4gcy5qb2luKCIiKX0sZGVjb2RlOmZ1bmN0aW9uKGUsbil7dmFyIG8sYSx1LGMsZixzLGw9W10scD1bXTtpZihvPWUucmVwbGFjZSgvW15BLVphLXowLTlcK1wvPV0vZywiIiksdT1vLmxlbmd0aCwwIT09dSU0KXRocm93IEVycm9yKCJKU1hHcmFwaC91dGlscy9iYXNlNjQ6IENhbid0IGRlY29kZSBzdHJpbmcgKGludmFsaWQgaW5wdXQgbGVuZ3RoKS4iKTtmb3Ioby5jaGFyQXQodS0xKT09PWkmJihjPTEsby5jaGFyQXQodS0yKT09PWkmJihjPTIpLHUtPTQpLGE9MDt1PmE7YSs9NClmPXQobyxhKTw8MTh8dChvLGErMSk8PDEyfHQobyxhKzIpPDw2fHQobyxhKzMpLHAucHVzaChmPj4xNiwyNTUmZj4+OCwyNTUmZiksMD09PWElMWU0JiYobC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxwKSkscD1bXSk7c3dpdGNoKGMpe2Nhc2UgMTpmPXQobyx1KTw8MTJ8dChvLHUrMSk8PDZ8dChvLHUrMikscC5wdXNoKGY+PjEwLDI1NSZmPj4yKTticmVhaztjYXNlIDI6Zj10KG8sYSk8PDZ8dChvLGErMSkscC5wdXNoKGY+PjQpfXJldHVybiBsLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHApKSxzPWwuam9pbigiIiksbiYmKHM9ci5kZWNvZGUocykpLHN9LGRlY29kZUFzQXJyYXk6ZnVuY3Rpb24oZSl7dmFyIHIsbj10aGlzLmRlY29kZShlKSx0PVtdLG89bi5sZW5ndGg7Zm9yKHI9MDtvPnI7cisrKXRbcl09bi5jaGFyQ29kZUF0KHIpO3JldHVybiB0fX0sZS5VdGlsLkJhc2U2NH0pLG4oIi4uL2J1aWxkL2NvbXByZXNzb3IuZGVwcy5qcyIsWyJqeGciLCJ1dGlscy96aXAiLCJ1dGlscy9iYXNlNjQiXSxmdW5jdGlvbihlLHIsbil7cmV0dXJuIGUuZGVjb21wcmVzcz1mdW5jdGlvbihlKXtyZXR1cm4gdW5lc2NhcGUobmV3IHIuVW56aXAobi5kZWNvZGVBc0FycmF5KGUpKS51bnppcCgpWzBdWzBdKX0sZX0pLHdpbmRvdy5KWEc9cigiLi4vYnVpbGQvY29tcHJlc3Nvci5kZXBzLmpzIil9KSgpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cuZmlsZUxvYWRpbmcgPSAoZnVuY3Rpb24gKCkgewogICAgdmFyIGZpbGVMb2FkaW5nQ2FsbGJhY2tzID0ge307CiAgICB2YXIgdGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICBmdW5jdGlvbiBsb2FkS2V5d29yZHNGaWxlKGZpbGVuYW1lLCBjYWxsYmFjaykgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSA9IGNhbGxiYWNrOwogICAgICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOwogICAgICAgIC8vIHRpbWVzdGFtcCBhcyBhbiBhcmd1bWVudCB0byBwcmV2ZW50IGJyb3dzZXJzIGZyb20gY2FjaGluZyBzY3JpcHRzCiAgICAgICAgLy8gc2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg2NjYxOS9ob3ctdG8tZm9yY2UtaWUtdG8tcmVsb2FkLWphdmFzY3JpcHQKICAgICAgICBzY3JpcHQuc3JjID0gZmlsZW5hbWUrJz90aW1lPScrdGltZXN0YW1wOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHBhcmVudCkgewogICAgICAgIHZhciBjYWxsYWJsZUxpc3QgPSBbXTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNhbGxhYmxlKSB7CiAgICAgICAgICAgIGlmICghcGFyZW50LmlzQ2hpbGRyZW5Mb2FkZWQpIHsKICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdC5wdXNoKGNhbGxhYmxlKTsKICAgICAgICAgICAgICAgIGlmIChjYWxsYWJsZUxpc3QubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgICAgICBsb2FkS2V5d29yZHNGaWxlKHBhcmVudC5jaGlsZEZpbGVOYW1lLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYWJsZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlTGlzdFtpXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjYWxsYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gbm90aWZ5RmlsZUxvYWRlZChmaWxlbmFtZSkgewogICAgICAgIGZpbGVMb2FkaW5nQ2FsbGJhY2tzW2ZpbGVuYW1lXSgpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBnZXRDYWxsYmFja0hhbmRsZXJGb3JLZXl3b3JkczogZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHMsCiAgICAgICAgbm90aWZ5OiBub3RpZnlGaWxlTG9hZGVkCiAgICB9Cn0oKSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5tb2RlbCA9IChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBTdWl0ZShkYXRhKSB7CiAgICAgICAgdmFyIHN1aXRlID0gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSk7CiAgICAgICAgc3VpdGUuc291cmNlID0gZGF0YS5zb3VyY2U7CiAgICAgICAgc3VpdGUucmVsYXRpdmVTb3VyY2UgPSBkYXRhLnJlbGF0aXZlU291cmNlOwogICAgICAgIHN1aXRlLmZ1bGxOYW1lID0gZGF0YS5wYXJlbnQgPyBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIGRhdGEubmFtZSA6IGRhdGEubmFtZTsKICAgICAgICBzdWl0ZS50eXBlID0gJ3N1aXRlJzsKICAgICAgICBzdWl0ZS50ZW1wbGF0ZSA9ICdzdWl0ZVRlbXBsYXRlJzsKICAgICAgICBzZXRTdGF0cyhzdWl0ZSwgZGF0YS5zdGF0aXN0aWNzKTsKICAgICAgICBzdWl0ZS5tZXRhZGF0YSA9IGRhdGEubWV0YWRhdGE7CiAgICAgICAgc3VpdGUucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVUZXN0cyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdUZXN0Jyk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVTdWl0ZXMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignU3VpdGUnKTsKICAgICAgICBzdWl0ZS5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJywgJ3N1aXRlJywgJ3Rlc3QnXTsKICAgICAgICBzdWl0ZS5jYWxsV2hlbkNoaWxkcmVuUmVhZHkgPSBmdW5jdGlvbiAoY2FsbGFibGUpIHsgY2FsbGFibGUoKTsgfTsKICAgICAgICBzdWl0ZS5tZXNzYWdlID0gZGF0YS5tZXNzYWdlOwogICAgICAgIHN1aXRlLmNoaWxkcmVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc3VpdGUua2V5d29yZHMoKS5jb25jYXQoc3VpdGUudGVzdHMoKSkuY29uY2F0KHN1aXRlLnN1aXRlcygpKTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLnNlYXJjaFRlc3RzID0gZnVuY3Rpb24gKHByZWRpY2F0ZSkgewogICAgICAgICAgICB2YXIgdGVzdHMgPSBbXTsKICAgICAgICAgICAgdmFyIHN1aXRlcyA9IHRoaXMuc3VpdGVzKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc3VpdGVzKQogICAgICAgICAgICAgICAgdGVzdHMgPSB0ZXN0cy5jb25jYXQoc3VpdGVzW2ldLnNlYXJjaFRlc3RzKHByZWRpY2F0ZSkpOwogICAgICAgICAgICByZXR1cm4gdGVzdHMuY29uY2F0KHV0aWwuZmlsdGVyKHRoaXMudGVzdHMoKSwgcHJlZGljYXRlKSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5zZWFyY2hUZXN0c0luU3VpdGUgPSBmdW5jdGlvbiAocGF0dGVybiwgbWF0Y2hlcikgewogICAgICAgICAgICBpZiAoIW1hdGNoZXIpCiAgICAgICAgICAgICAgICBtYXRjaGVyID0gdXRpbC5NYXRjaGVyKHBhdHRlcm4pOwogICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzQW55KFtzdWl0ZS5mdWxsTmFtZSwgc3VpdGUubmFtZV0pKQogICAgICAgICAgICAgICAgcmV0dXJuIHN1aXRlLmFsbFRlc3RzKCk7CiAgICAgICAgICAgIHZhciB0ZXN0cyA9IFtdOwogICAgICAgICAgICB2YXIgc3VpdGVzID0gdGhpcy5zdWl0ZXMoKTsKICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzdWl0ZXMpCiAgICAgICAgICAgICAgICB0ZXN0cyA9IHRlc3RzLmNvbmNhdChzdWl0ZXNbaV0uc2VhcmNoVGVzdHNJblN1aXRlKHBhdHRlcm4sIG1hdGNoZXIpKTsKICAgICAgICAgICAgcmV0dXJuIHRlc3RzOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuc2VhcmNoVGVzdHNCeVRhZyA9IGZ1bmN0aW9uICh0YWcpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICBpZiAodGFnLmNvbWJpbmVkKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdC50YWdzLCB0YWcuY29tYmluZWQpOwogICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVGFnKHRlc3QudGFncywgdGFnLmxhYmVsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5maW5kU3VpdGVCeU5hbWUgPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICByZXR1cm4gZmluZFN1aXRlQnlOYW1lKHN1aXRlLCBuYW1lKTsKICAgICAgICB9OwogICAgICAgIHN1aXRlLmFsbFRlc3RzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc3VpdGUuc2VhcmNoVGVzdHMoZnVuY3Rpb24gKHRlc3QpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBzdWl0ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnRhaW5zVGFnKHRlc3RUYWdzLCB0YWduYW1lKSB7CiAgICAgICAgdGVzdFRhZ3MgPSB1dGlsLm1hcCh0ZXN0VGFncywgdXRpbC5ub3JtYWxpemUpOwogICAgICAgIHJldHVybiB1dGlsLmNvbnRhaW5zKHRlc3RUYWdzLCB1dGlsLm5vcm1hbGl6ZSh0YWduYW1lKSk7CiAgICB9CiAgICBmdW5jdGlvbiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHBhdHRlcm4pIHsKICAgICAgICB2YXIgcGF0dGVybnM7CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignTk9UJykgIT0gLTEpIHsKICAgICAgICAgICAgcGF0dGVybnMgPSBwYXR0ZXJuLnNwbGl0KCdOT1QnKTsKICAgICAgICAgICAgaWYgKCF1dGlsLm5vcm1hbGl6ZShwYXR0ZXJuc1swXSkpCiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5hbGwodXRpbC5tYXAocGF0dGVybnMuc2xpY2UoMSksIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwYXR0ZXJuc1swXSkgJiYKICAgICAgICAgICAgICAgIHV0aWwuYWxsKHV0aWwubWFwKHBhdHRlcm5zLnNsaWNlKDEpLCBmdW5jdGlvbiAocCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZignT1InKSAhPSAtMSkgewogICAgICAgICAgICBwYXR0ZXJucyA9IHBhdHRlcm4uc3BsaXQoJ09SJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFueSh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ0FORCcpICE9IC0xKSB7CiAgICAgICAgICAgIHBhdHRlcm5zID0gcGF0dGVybi5zcGxpdCgnQU5EJyk7CiAgICAgICAgICAgIHJldHVybiB1dGlsLmFsbCh1dGlsLm1hcChwYXR0ZXJucywgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZ1BhdHRlcm4odGVzdFRhZ3MsIHApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1dGlsLk1hdGNoZXIocGF0dGVybikubWF0Y2hlc0FueSh0ZXN0VGFncyk7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kU3VpdGVCeU5hbWUoc3VpdGUsIG5hbWUpIHsKICAgICAgICBpZiAoc3VpdGUuZnVsbE5hbWUgPT0gbmFtZSkKICAgICAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgICAgIHZhciBzdWJTdWl0ZXMgPSBzdWl0ZS5zdWl0ZXMoKTsKICAgICAgICBmb3IgKHZhciBpIGluIHN1YlN1aXRlcykgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBmaW5kU3VpdGVCeU5hbWUoc3ViU3VpdGVzW2ldLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG1hdGNoKQogICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHNldFN0YXRzKHN1aXRlLCBzdGF0cykgewogICAgICAgIGZvciAodmFyIG5hbWUgaW4gc3RhdHMpIHsKICAgICAgICAgICAgc3VpdGVbbmFtZV0gPSBzdGF0c1tuYW1lXTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVNb2RlbE9iamVjdChkYXRhKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lLAogICAgICAgICAgICBkb2M6IGRhdGEuZG9jLAogICAgICAgICAgICBzdGF0dXM6IGRhdGEuc3RhdHVzLAogICAgICAgICAgICB0aW1lczogZGF0YS50aW1lcywKICAgICAgICAgICAgaWQ6IGRhdGEucGFyZW50ID8gZGF0YS5wYXJlbnQuaWQgKyAnLScgKyBkYXRhLmlkIDogZGF0YS5pZAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBUZXN0KGRhdGEpIHsKICAgICAgICB2YXIgdGVzdCA9IGNyZWF0ZU1vZGVsT2JqZWN0KGRhdGEpOwogICAgICAgIHRlc3QudHlwZSA9ICd0ZXN0JzsKICAgICAgICB0ZXN0LnRlbXBsYXRlID0gJ3Rlc3RUZW1wbGF0ZSc7CiAgICAgICAgdGVzdC5mdWxsTmFtZSA9IGRhdGEucGFyZW50LmZ1bGxOYW1lICsgJy4nICsgdGVzdC5uYW1lOwogICAgICAgIHRlc3QuZm9ybWF0UGFyZW50TmFtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWwuZm9ybWF0UGFyZW50TmFtZSh0ZXN0KTsgfTsKICAgICAgICB0ZXN0LnRpbWVvdXQgPSBkYXRhLnRpbWVvdXQ7CiAgICAgICAgdGVzdC5wb3B1bGF0ZUtleXdvcmRzID0gY3JlYXRlSXRlcmFibGVQb3B1bGF0b3IoJ0tleXdvcmQnKTsKICAgICAgICB0ZXN0LmNoaWxkcmVuTmFtZXMgPSBbJ2tleXdvcmQnXTsKICAgICAgICB0ZXN0LmlzQ2hpbGRyZW5Mb2FkZWQgPSBkYXRhLmlzQ2hpbGRyZW5Mb2FkZWQ7CiAgICAgICAgdGVzdC5jYWxsV2hlbkNoaWxkcmVuUmVhZHkgPSB3aW5kb3cuZmlsZUxvYWRpbmcuZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHModGVzdCk7CiAgICAgICAgdGVzdC5jaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRlc3QuaXNDaGlsZHJlbkxvYWRlZCkKICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0LmtleXdvcmRzKCk7CiAgICAgICAgfTsKICAgICAgICB0ZXN0LnRhZ3MgPSBkYXRhLnRhZ3M7CiAgICAgICAgdGVzdC5tZXNzYWdlID0gZGF0YS5tZXNzYWdlOwogICAgICAgIHRlc3QubWF0Y2hlc1RhZ1BhdHRlcm4gPSBmdW5jdGlvbiAocGF0dGVybikgewogICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3QudGFncywgcGF0dGVybik7CiAgICAgICAgfTsKICAgICAgICB0ZXN0Lm1hdGNoZXNOYW1lUGF0dGVybiA9IGZ1bmN0aW9uIChwYXR0ZXJuKSB7CiAgICAgICAgICAgIHJldHVybiB1dGlsLk1hdGNoZXIocGF0dGVybikubWF0Y2hlc0FueShbdGVzdC5uYW1lLCB0ZXN0LmZ1bGxOYW1lXSk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gdGVzdDsKICAgIH0KICAgIGZ1bmN0aW9uIEtleXdvcmQoZGF0YSkgewogICAgICAgIHZhciBrdyA9IGNyZWF0ZU1vZGVsT2JqZWN0KGRhdGEpOwogICAgICAgIGt3LmxpYm5hbWUgPSBkYXRhLmxpYm5hbWU7CiAgICAgICAga3cuZnVsbE5hbWUgPSAoa3cubGlibmFtZSA/IGt3LmxpYm5hbWUgKyAnLicgOiAnJykgKyBrdy5uYW1lOwogICAgICAgIGt3LnR5cGUgPSBkYXRhLnR5cGU7CiAgICAgICAga3cudGVtcGxhdGUgPSAna2V5d29yZFRlbXBsYXRlJzsKICAgICAgICBrdy5hcmd1bWVudHMgPSBkYXRhLmFyZ3M7CiAgICAgICAga3cuYXNzaWduID0gZGF0YS5hc3NpZ24gKyAoZGF0YS5hc3NpZ24gPyAnID0nIDogJycpOwogICAgICAgIGt3LnRhZ3MgPSBkYXRhLnRhZ3M7CiAgICAgICAga3cudGltZW91dCA9IGRhdGEudGltZW91dDsKICAgICAgICBrdy5wb3B1bGF0ZUtleXdvcmRzID0gY3JlYXRlSXRlcmFibGVQb3B1bGF0b3IoJ0tleXdvcmQnKTsKICAgICAgICBrdy5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJ107CiAgICAgICAga3cuaXNDaGlsZHJlbkxvYWRlZCA9IGRhdGEuaXNDaGlsZHJlbkxvYWRlZDsKICAgICAgICBrdy5jYWxsV2hlbkNoaWxkcmVuUmVhZHkgPSB3aW5kb3cuZmlsZUxvYWRpbmcuZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHMoa3cpOwogICAgICAgIGt3LmNoaWxkcmVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoa3cuaXNDaGlsZHJlbkxvYWRlZCkKICAgICAgICAgICAgICAgIHJldHVybiBrdy5rZXl3b3JkcygpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGt3OwogICAgfQogICAgZnVuY3Rpb24gTWVzc2FnZShsZXZlbCwgZGF0ZSwgdGV4dCwgbGluaykgewogICAgICAgIHZhciBtZXNzYWdlID0gewogICAgICAgICAgICB0eXBlOiAnbWVzc2FnZScsCiAgICAgICAgICAgIHRlbXBsYXRlOiAnbWVzc2FnZVRlbXBsYXRlJywKICAgICAgICAgICAgbGV2ZWw6IGxldmVsLAogICAgICAgICAgICB0aW1lOiB1dGlsLnRpbWVGcm9tRGF0ZShkYXRlKSwKICAgICAgICAgICAgZGF0ZTogdXRpbC5kYXRlRnJvbURhdGUoZGF0ZSksCiAgICAgICAgICAgIHRleHQ6IHRleHQsCiAgICAgICAgICAgIGxpbms6IGxpbmsKICAgICAgICB9OwogICAgICAgIG1lc3NhZ2UuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gZnVuY3Rpb24gKGNhbGxhYmxlKSB7IGNhbGxhYmxlKCk7IH07CiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgICB9CiAgICBmdW5jdGlvbiBUaW1lcyh0aW1lZGF0YSkgewogICAgICAgIHZhciBzdGFydCA9IHRpbWVkYXRhWzBdOwogICAgICAgIHZhciBlbmQgPSB0aW1lZGF0YVsxXTsKICAgICAgICB2YXIgZWxhcHNlZCA9IHRpbWVkYXRhWzJdOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGVsYXBzZWRNaWxsaXM6IGVsYXBzZWQsCiAgICAgICAgICAgIGVsYXBzZWRUaW1lOiB1dGlsLmZvcm1hdEVsYXBzZWQoZWxhcHNlZCksCiAgICAgICAgICAgIHN0YXJ0VGltZTogdXRpbC5kYXRlVGltZUZyb21EYXRlKHN0YXJ0KSwKICAgICAgICAgICAgZW5kVGltZTogIHV0aWwuZGF0ZVRpbWVGcm9tRGF0ZShlbmQpCiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKG5hbWUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHBvcHVsYXRvcikgewogICAgICAgICAgICBwb3B1bGF0ZUl0ZXJhYmxlKHRoaXMsIG5hbWUsIHBvcHVsYXRvcik7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvcHVsYXRlSXRlcmFibGUob2JqLCBuYW1lLCBwb3B1bGF0b3IpIHsKICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpICsgJ3MnOwogICAgICAgIG9ialtuYW1lXSA9IGNyZWF0ZUdldEFsbEZ1bmN0aW9uKHBvcHVsYXRvci5udW1iZXJPZkl0ZW1zLCBwb3B1bGF0b3IuY3JlYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVHZXRBbGxGdW5jdGlvbihudW1iZXJPZkVsZW1lbnRzLCBjcmVhdG9yKSB7CiAgICAgICAgdmFyIGNhY2hlZCA9IG51bGw7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGNhY2hlZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FjaGVkID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bWJlck9mRWxlbWVudHMoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGVkLnB1c2goY3JlYXRvcihpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDsKICAgICAgICB9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBTdWl0ZTogU3VpdGUsCiAgICAgICAgVGVzdDogVGVzdCwKICAgICAgICBLZXl3b3JkOiBLZXl3b3JkLAogICAgICAgIE1lc3NhZ2U6IE1lc3NhZ2UsCiAgICAgICAgVGltZXM6IFRpbWVzLAogICAgICAgIGNvbnRhaW5zVGFnOiBjb250YWluc1RhZywgIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICAgICAgY29udGFpbnNUYWdQYXR0ZXJuOiBjb250YWluc1RhZ1BhdHRlcm4gIC8vIEV4cG9zZWQgZm9yIHRlc3RzCiAgICB9Owp9KCkpOwp3aW5kb3cuc3RhdHMgPSAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gU3RhdGlzdGljcyh0b3RhbEVsZW1zLCB0YWdFbGVtcywgc3VpdGVFbGVtcykgewogICAgICAgIHJldHVybiB7dG90YWw6IHV0aWwubWFwKHRvdGFsRWxlbXMsIHRvdGFsU3RhdEVsZW0pLAogICAgICAgICAgICAgICAgdGFnOiAgIHV0aWwubWFwKHRhZ0VsZW1zLCB0YWdTdGF0RWxlbSksCiAgICAgICAgICAgICAgICBzdWl0ZTogdXRpbC5tYXAoc3VpdGVFbGVtcywgc3VpdGVTdGF0RWxlbSl9OwogICAgfQogICAgZnVuY3Rpb24gc3RhdEVsZW0oc3RhdCkgewogICAgICAgIHN0YXQudG90YWwgPSBzdGF0LnBhc3MgKyBzdGF0LmZhaWwgKyBzdGF0LnNraXA7CiAgICAgICAgdmFyIHBlcmNlbnRzID0gY2FsY3VsYXRlUGVyY2VudHMoc3RhdC50b3RhbCwgc3RhdC5wYXNzLCBzdGF0LmZhaWwsIHN0YXQuc2tpcCk7CiAgICAgICAgc3RhdC5wYXNzUGVyY2VudCA9IHBlcmNlbnRzWzBdOwogICAgICAgIHN0YXQuc2tpcFBlcmNlbnQgPSBwZXJjZW50c1sxXTsKICAgICAgICBzdGF0LmZhaWxQZXJjZW50ID0gcGVyY2VudHNbMl07CiAgICAgICAgdmFyIHdpZHRocyA9IGNhbGN1bGF0ZVdpZHRocyhzdGF0LnBhc3NQZXJjZW50LCBzdGF0LnNraXBQZXJjZW50LCBzdGF0LmZhaWxQZXJjZW50KTsKICAgICAgICBzdGF0LnBhc3NXaWR0aCA9IHdpZHRoc1swXTsKICAgICAgICBzdGF0LnNraXBXaWR0aCA9IHdpZHRoc1sxXTsKICAgICAgICBzdGF0LmZhaWxXaWR0aCA9IHdpZHRoc1syXTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHRvdGFsU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC50eXBlID0gJ2FsbCc7CiAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICB9CiAgICBmdW5jdGlvbiB0YWdTdGF0RWxlbShkYXRhKSB7CiAgICAgICAgdmFyIHN0YXQgPSBzdGF0RWxlbShkYXRhKTsKICAgICAgICBzdGF0LmxpbmtzID0gcGFyc2VMaW5rcyhzdGF0LmxpbmtzKTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHN1aXRlU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC5mdWxsTmFtZSA9IHN0YXQubGFiZWw7CiAgICAgICAgc3RhdC5mb3JtYXRQYXJlbnROYW1lID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdXRpbC5mb3JtYXRQYXJlbnROYW1lKHN0YXQpOyB9OwogICAgICAgIHJldHVybiBzdGF0OwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VMaW5rcyhsaW5rc0RhdGEpIHsKICAgICAgICBpZiAoIWxpbmtzRGF0YSkKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIHJldHVybiB1dGlsLm1hcChsaW5rc0RhdGEuc3BsaXQoJzo6OicpLCBmdW5jdGlvbiAobGluaykgewogICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gbGluay5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgICAgICByZXR1cm4ge3RpdGxlOiBsaW5rLnNsaWNlKDAsIGluZGV4KSwgdXJsOiBsaW5rLnNsaWNlKGluZGV4KzEpfTsKICAgICAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBjYWxjdWxhdGVQZXJjZW50cyh0b3RhbCwgcGFzc2VkLCBmYWlsZWQsIHNraXBwZWQpIHsKICAgICAgICBpZiAodG90YWwgPT0gMCkgewogICAgICAgICAgICByZXR1cm4gWzAuMCwgMC4wLCAwLjBdOwogICAgICAgIH0KICAgICAgICB2YXIgcGFzcyA9IDEwMC4wICogcGFzc2VkIC8gdG90YWw7CiAgICAgICAgdmFyIHNraXAgPSAxMDAuMCAqIHNraXBwZWQgLyB0b3RhbDsKICAgICAgICB2YXIgZmFpbCA9IDEwMC4wICogZmFpbGVkIC8gdG90YWw7CiAgICAgICAgaWYgKHBhc3MgPiAwICYmIHBhc3MgPCAwLjEpCiAgICAgICAgICAgIHBhc3MgPSAwLjEKICAgICAgICBpZiAoZmFpbCA+IDAgJiYgZmFpbCA8IDAuMSkKICAgICAgICAgICAgZmFpbCA9IDAuMQogICAgICAgIGlmIChza2lwID4gMCAmJiBza2lwIDwgMC4xKQogICAgICAgICAgICBza2lwID0gMC4xCiAgICAgICAgaWYgKHBhc3MgPiA5OS45NSAmJiBwYXNzIDwgMTAwKQogICAgICAgICAgICBwYXNzID0gOTkuOQogICAgICAgIGlmIChmYWlsID4gOTkuOTUgJiYgZmFpbCA8IDEwMCkKICAgICAgICAgICAgZmFpbCA9IDk5LjkKICAgICAgICBpZiAoc2tpcCA+IDk5Ljk1ICYmIHNraXAgPCAxMDApCiAgICAgICAgICAgIHNraXAgPSA5OS45CiAgICAgICAgcmV0dXJuIFtNYXRoLnJvdW5kKHBhc3MqMTApLzEwLCBNYXRoLnJvdW5kKHNraXAqMTApLzEwLCBNYXRoLnJvdW5kKGZhaWwqMTApLzEwXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZVdpZHRocyhudW0xLCBudW0yLCBudW0zKSB7CiAgICAgICAgaWYgKG51bTEgKyBudW0yICsgbnVtMyA9PT0gMCkKICAgICAgICAgICAgcmV0dXJuIFswLjAsIDAuMCwgMC4wXTsKICAgICAgICAvLyBNYWtlIHNtYWxsIHBlcmNlbnRhZ2VzIGJldHRlciB2aXNpYmxlCiAgICAgICAgaWYgKG51bTEgPiAwICYmIG51bTEgPCAxKQogICAgICAgICAgICBudW0xID0gMQogICAgICAgIGlmIChudW0yID4gMCAmJiBudW0yIDwgMSkKICAgICAgICAgICAgbnVtMiA9IDEKICAgICAgICBpZiAobnVtMyA+IDAgJiYgbnVtMyA8IDEpCiAgICAgICAgICAgIG51bTMgPSAxCiAgICAgICAgLy8gSGFuZGxlIHNpdHVhdGlvbiB3aGVyZSBzb21lIGFyZSByb3VuZGVkIHVwCiAgICAgICAgd2hpbGUgKG51bTEgKyBudW0yICsgbnVtMyA+IDEwMCkgewogICAgICAgICAgICBpZiAobnVtMSA+IG51bTIgJiYgbnVtMSA+IG51bTMpCiAgICAgICAgICAgICAgICBudW0xIC09IDAuMTsKICAgICAgICAgICAgZWxzZSBpZiAobnVtMiA+IG51bTEgJiYgbnVtMiA+IG51bTMpCiAgICAgICAgICAgICAgICBudW0yIC09IDAuMTsKICAgICAgICAgICAgZWxzZSBpZiAobnVtMyA+IG51bTEgJiYgbnVtMyA+IG51bTIpCiAgICAgICAgICAgICAgICBudW0zIC09IDAuMTsKICAgICAgICAgICAgZWxzZSBpZiAobnVtMSA+IG51bTMgJiYgbnVtMSA9PSBudW0yKSB7CiAgICAgICAgICAgICAgICBudW0xIC09IDAuMTsKICAgICAgICAgICAgICAgIG51bTIgLT0gMC4xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG51bTEgPiBudW0yICYmIG51bTEgPT0gbnVtMykgewogICAgICAgICAgICAgICAgbnVtMSAtPSAwLjE7CiAgICAgICAgICAgICAgICBudW0zIC09IDAuMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChudW0yID4gbnVtMSAmJiBudW0yID09IG51bTMpIHsKICAgICAgICAgICAgICAgIG51bTIgLT0gMC4xOwogICAgICAgICAgICAgICAgbnVtMyAtPSAwLjE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtNYXRoLmNlaWwobnVtMSoxMCkvMTAsIE1hdGguY2VpbChudW0yKjEwKS8xMCwgTWF0aC5jZWlsKG51bTMqMTApLzEwXTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgU3RhdGlzdGljczogU3RhdGlzdGljcwogICAgfTsKfSgpKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LnV0aWwgPSBmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBtYXAoZWxlbXMsIGZ1bmMpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIHJldFtpXSA9IGZ1bmMoZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gZmlsdGVyKGVsZW1zLCBwcmVkaWNhdGUpIHsKICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZWxlbXNbaV0pKQogICAgICAgICAgICAgICAgcmV0LnB1c2goZWxlbXNbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgZnVuY3Rpb24gYWxsKGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmICghZWxlbXNbaV0pCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gYW55KGVsZW1zKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChlbGVtc1tpXSkKICAgICAgICAgICAgICAgIHJldHVybiBlbGVtc1tpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gY29udGFpbnMoZWxlbXMsIGUpIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgaWYgKGVsZW1zW2ldID09IGUpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZnVuY3Rpb24gbGFzdChpdGVtcykgewogICAgICAgIHJldHVybiBpdGVtc1tpdGVtcy5sZW5ndGgtMV07CiAgICB9CiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyZsdDsvZywgJzwnKS5yZXBsYWNlKC8mZ3Q7L2csICc+JykucmVwbGFjZSgvJmFtcDsvZywgJyYnKTsKICAgIH0KICAgIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTsKICAgIH0KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvIC9nLCAnJykucmVwbGFjZSgvXy9nLCAnJyk7CiAgICB9CiAgICBmdW5jdGlvbiByZWdleHBFc2NhcGUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLVtcXXt9KCkrPyouLFxcXiR8I10vZywgIlxcJCYiKTsKICAgIH0KICAgIGZ1bmN0aW9uIE1hdGNoZXIocGF0dGVybikgewogICAgICAgIHBhdHRlcm4gPSByZWdleHBFc2NhcGUobm9ybWFsaXplKHBhdHRlcm4pKTsKICAgICAgICB2YXIgcmVQYXR0ZXJuID0gJ14nICsgcGF0dGVybi5yZXBsYWNlKC9cXFw/L2csICcuJykucmVwbGFjZSgvXFxcKi9nLCAnW1xcc1xcU10qJykgKyAnJCc7CiAgICAgICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAocmVQYXR0ZXJuKTsKICAgICAgICBmdW5jdGlvbiBtYXRjaGVzKHN0cmluZykgewogICAgICAgICAgICByZXR1cm4gcmVnZXhwLnRlc3Qobm9ybWFsaXplKHN0cmluZykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICBtYXRjaGVzOiBtYXRjaGVzLAogICAgICAgICAgICBtYXRjaGVzQW55OiBmdW5jdGlvbiAoc3RyaW5ncykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0cmluZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspCiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMoc3RyaW5nc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1hdFBhcmVudE5hbWUoaXRlbSkgewogICAgICAgIHZhciBwYXJlbnROYW1lID0gaXRlbS5mdWxsTmFtZS5zbGljZSgwLCBpdGVtLmZ1bGxOYW1lLmxlbmd0aCAtIGl0ZW0ubmFtZS5sZW5ndGgpOwogICAgICAgIHJldHVybiBwYXJlbnROYW1lLnJlcGxhY2UoL1wuL2csICcgLiAnKTsKICAgIH0KICAgIGZ1bmN0aW9uIHRpbWVGcm9tRGF0ZShkYXRlKSB7CiAgICAgICAgaWYgKCFkYXRlKQogICAgICAgICAgICByZXR1cm4gJ04vQSc7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlLmdldFNlY29uZHMoKSwgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSk7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlRnJvbURhdGUoZGF0ZSkgewogICAgICAgIGlmICghZGF0ZSkKICAgICAgICAgICAgcmV0dXJuICdOL0EnOwogICAgICAgIHJldHVybiBwYWRUbyhkYXRlLmdldEZ1bGxZZWFyKCksIDQpICsKICAgICAgICAgICAgICAgcGFkVG8oZGF0ZS5nZXRNb250aCgpICsgMSwgMikgKwogICAgICAgICAgICAgICBwYWRUbyhkYXRlLmdldERhdGUoKSwgMik7CiAgICB9CiAgICBmdW5jdGlvbiBkYXRlVGltZUZyb21EYXRlKGRhdGUpIHsKICAgICAgICBpZiAoIWRhdGUpCiAgICAgICAgICAgIHJldHVybiAnTi9BJzsKICAgICAgICByZXR1cm4gZGF0ZUZyb21EYXRlKGRhdGUpICsgJyAnICsgdGltZUZyb21EYXRlKGRhdGUpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0VGltZShob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzKSB7CiAgICAgICAgcmV0dXJuIHBhZFRvKGhvdXJzLCAyKSArICc6JyArCiAgICAgICAgICAgICAgIHBhZFRvKG1pbnV0ZXMsIDIpICsgJzonICsKICAgICAgICAgICAgICAgcGFkVG8oc2Vjb25kcywgMikgKyAnLicgKwogICAgICAgICAgICAgICBwYWRUbyhtaWxsaXNlY29uZHMsIDMpOwogICAgfQogICAgZnVuY3Rpb24gZm9ybWF0RWxhcHNlZChlbGFwc2VkKSB7CiAgICAgICAgdmFyIG1pbGxpcyA9IGVsYXBzZWQ7CiAgICAgICAgdmFyIGhvdXJzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAoNjAgKiA2MCAqIDEwMDApKTsKICAgICAgICBtaWxsaXMgLT0gaG91cnMgKiA2MCAqIDYwICogMTAwMDsKICAgICAgICB2YXIgbWludXRlcyA9IE1hdGguZmxvb3IobWlsbGlzIC8gKDYwICogMTAwMCkpOwogICAgICAgIG1pbGxpcyAtPSBtaW51dGVzICogNjAgKiAxMDAwOwogICAgICAgIHZhciBzZWNvbmRzID0gTWF0aC5mbG9vcihtaWxsaXMgLyAxMDAwKTsKICAgICAgICBtaWxsaXMgLT0gc2Vjb25kcyAqIDEwMDA7CiAgICAgICAgcmV0dXJuIGZvcm1hdFRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpcyk7CiAgICB9CiAgICBmdW5jdGlvbiBwYWRUbyhudW1iZXIsIGxlbikgewogICAgICAgIHZhciBudW1TdHJpbmcgPSBudW1iZXIgKyAiIjsKICAgICAgICB3aGlsZSAobnVtU3RyaW5nLmxlbmd0aCA8IGxlbikgbnVtU3RyaW5nID0gIjAiICsgbnVtU3RyaW5nOwogICAgICAgIHJldHVybiBudW1TdHJpbmc7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lc3RhbXAobWlsbGlzKSB7CiAgICAgICAgLy8gdXNlZCBhbHNvIGJ5IHRvb2xzIHRoYXQgZG8gbm90IHNldCB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMKICAgICAgICB2YXIgYmFzZSA9IHdpbmRvdy5vdXRwdXQgPyB3aW5kb3cub3V0cHV0LmJhc2VNaWxsaXMgOiAwOwogICAgICAgIHJldHVybiBuZXcgRGF0ZShiYXNlICsgbWlsbGlzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZFN0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRpbWVzdGFtcCk7CiAgICAgICAgdmFyIGR0ID0gZGF0ZVRpbWVGcm9tRGF0ZShkYXRlKS5zbGljZSgwLCAxNyk7ICAvLyBkcm9wIG1pbGxpcwogICAgICAgIHZhciBvZmZzZXQgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICAgICAgdmFyIHNpZ24gPSBvZmZzZXQgPiAwID8gJy0nIDogJysnOwogICAgICAgIHZhciBoaCA9IE1hdGguZmxvb3IoTWF0aC5hYnMob2Zmc2V0KSAvIDYwKTsKICAgICAgICB2YXIgbW0gPSBNYXRoLmFicyhvZmZzZXQpICUgNjA7CiAgICAgICAgcmV0dXJuIGR0ICsgJyBVVEMnICsgc2lnbiArIHBhZFRvKGhoLCAyKSArICc6JyArIHBhZFRvKG1tLCAyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZyh0aW1lc3RhbXApIHsKICAgICAgICBmdW5jdGlvbiB0aW1lU3RyaW5nKHRpbWUsIHNob3J0VW5pdCkgewogICAgICAgICAgICB2YXIgdW5pdCA9IHt5OiAneWVhcicsIGQ6ICdkYXknLCBoOiAnaG91cicsIG06ICdtaW51dGUnLAogICAgICAgICAgICAgICAgICAgICAgICBzOiAnc2Vjb25kJ31bc2hvcnRVbml0XTsKICAgICAgICAgICAgdmFyIGVuZCA9IHRpbWUgPT0gMSA/ICcgJyA6ICdzICc7CiAgICAgICAgICAgIHJldHVybiB0aW1lICsgJyAnICsgdW5pdCArIGVuZDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY29tcGVuc2F0ZUxlYXBZZWFycyhkYXlzLCB5ZWFycykgewogICAgICAgICAgICAvLyBOb3QgYSBwZXJmZWN0IGFsZ29yaXRobSBidXQgb3VnaHQgdG8gYmUgZW5vdWdoCiAgICAgICAgICAgIHJldHVybiBkYXlzIC0gTWF0aC5mbG9vcih5ZWFycyAvIDQpOwogICAgICAgIH0KICAgICAgICB2YXIgZ2VuZXJhdGVkID0gTWF0aC5yb3VuZCh0aW1lc3RhbXAgLyAxMDAwKTsKICAgICAgICB2YXIgY3VycmVudCA9IE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKTsKICAgICAgICB2YXIgZWxhcHNlZCA9IGN1cnJlbnQgLSBnZW5lcmF0ZWQ7CiAgICAgICAgdmFyIHByZWZpeCA9ICcnOwogICAgICAgIGlmIChlbGFwc2VkIDwgMCkgewogICAgICAgICAgICBwcmVmaXggPSAnLSAnOwogICAgICAgICAgICBlbGFwc2VkID0gTWF0aC5hYnMoZWxhcHNlZCk7CiAgICAgICAgfQogICAgICAgIHZhciBzZWNzICA9IGVsYXBzZWQgJSA2MDsKICAgICAgICB2YXIgbWlucyAgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyA2MCkgJSA2MDsKICAgICAgICB2YXIgaG91cnMgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyAoNjAqNjApKSAlIDI0OwogICAgICAgIHZhciBkYXlzICA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCkpICUgMzY1OwogICAgICAgIHZhciB5ZWFycyA9IE1hdGguZmxvb3IoZWxhcHNlZCAvICg2MCo2MCoyNCozNjUpKTsKICAgICAgICBpZiAoeWVhcnMpIHsKICAgICAgICAgICAgZGF5cyA9IGNvbXBlbnNhdGVMZWFwWWVhcnMoZGF5cywgeWVhcnMpOwogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyh5ZWFycywgJ3knKSArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKTsKICAgICAgICB9IGVsc2UgaWYgKGRheXMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoZGF5cywgJ2QnKSArIHRpbWVTdHJpbmcoaG91cnMsICdoJyk7CiAgICAgICAgfSBlbHNlIGlmIChob3VycykgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhob3VycywgJ2gnKSArIHRpbWVTdHJpbmcobWlucywgJ20nKTsKICAgICAgICB9IGVsc2UgaWYgKG1pbnMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcobWlucywgJ20nKSArIHRpbWVTdHJpbmcoc2VjcywgJ3MnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgdGltZVN0cmluZyhzZWNzLCAncycpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmcocXVlcnkpIHsKICAgICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgICAgaWYgKCFxdWVyeSkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB2YXIgcGFyYW1zID0gcXVlcnkuc3BsaXQoJyYnKTsKICAgICAgICB2YXIgcGFydHM7CiAgICAgICAgZnVuY3Rpb24gZGVjb2RlKGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChpdGVtLnJlcGxhY2UoJysnLCAnICcpKTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHBhcmFtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBwYXJ0cyA9IHBhcmFtc1tpXS5zcGxpdCgnPScpOwogICAgICAgICAgICByZXN1bHRbZGVjb2RlKHBhcnRzLnNoaWZ0KCkpXSA9IGRlY29kZShwYXJ0cy5qb2luKCc9JykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBtYXA6IG1hcCwKICAgICAgICBmaWx0ZXI6IGZpbHRlciwKICAgICAgICBhbGw6IGFsbCwKICAgICAgICBhbnk6IGFueSwKICAgICAgICBjb250YWluczogY29udGFpbnMsCiAgICAgICAgbGFzdDogbGFzdCwKICAgICAgICBlc2NhcGU6IGVzY2FwZSwKICAgICAgICB1bmVzY2FwZTogdW5lc2NhcGUsCiAgICAgICAgbm9ybWFsaXplOiBub3JtYWxpemUsCiAgICAgICAgcmVnZXhwRXNjYXBlOiByZWdleHBFc2NhcGUsCiAgICAgICAgTWF0Y2hlcjogTWF0Y2hlciwKICAgICAgICBmb3JtYXRQYXJlbnROYW1lOiBmb3JtYXRQYXJlbnROYW1lLAogICAgICAgIHRpbWVGcm9tRGF0ZTogdGltZUZyb21EYXRlLAogICAgICAgIGRhdGVGcm9tRGF0ZTogZGF0ZUZyb21EYXRlLAogICAgICAgIGRhdGVUaW1lRnJvbURhdGU6IGRhdGVUaW1lRnJvbURhdGUsCiAgICAgICAgZm9ybWF0RWxhcHNlZDogZm9ybWF0RWxhcHNlZCwKICAgICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcCwKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRTdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZFN0cmluZywKICAgICAgICBjcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmc6IGNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZywKICAgICAgICBwYXJzZVF1ZXJ5U3RyaW5nOiBwYXJzZVF1ZXJ5U3RyaW5nCiAgICB9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy50ZXN0ZGF0YSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBlbGVtZW50c0J5SWQgPSB7fTsKICAgIHZhciBpZENvdW50ZXIgPSAwOwogICAgdmFyIF9zdGF0aXN0aWNzID0gbnVsbDsKICAgIHZhciBMRVZFTFMgPSBbJ1RSQUNFJywgJ0RFQlVHJywgJ0lORk8nLCAnV0FSTicsICdFUlJPUicsICdGQUlMJywgJ1NLSVAnXTsKICAgIHZhciBTVEFUVVNFUyA9IFsnRkFJTCcsICdQQVNTJywgJ1NLSVAnLCAnTk9UIFJVTiddOwogICAgdmFyIEtFWVdPUkRfVFlQRVMgPSBbJ0tFWVdPUkQnLCAnU0VUVVAnLCAnVEVBUkRPV04nLCAnRk9SJywgJ1ZBUicsICdJRicsICdFTFNFIElGJywgJ0VMU0UnXTsKICAgIHZhciBNRVNTQUdFX1RZUEUgPSA4OwogICAgZnVuY3Rpb24gYWRkRWxlbWVudChlbGVtKSB7CiAgICAgICAgaWYgKCFlbGVtLmlkKQogICAgICAgICAgICBlbGVtLmlkID0gdW5pcXVlSWQoKTsKICAgICAgICBlbGVtZW50c0J5SWRbZWxlbS5pZF0gPSBlbGVtOwogICAgICAgIHJldHVybiBlbGVtOwogICAgfQogICAgZnVuY3Rpb24gdW5pcXVlSWQoKSB7CiAgICAgICAgaWRDb3VudGVyKys7CiAgICAgICAgcmV0dXJuICdlbGVtZW50LWlkLScgKyBpZENvdW50ZXI7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lcyhzdGF0cykgewogICAgICAgIHZhciBzdGFydE1pbGxpcyA9IHN0YXRzWzFdOwogICAgICAgIHZhciBlbGFwc2VkID0gc3RhdHNbMl07CiAgICAgICAgaWYgKHN0YXJ0TWlsbGlzID09PSBudWxsKQogICAgICAgICAgICByZXR1cm4gW251bGwsIG51bGwsIGVsYXBzZWRdOwogICAgICAgIHJldHVybiBbdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMpLAogICAgICAgICAgICAgICAgdXRpbC50aW1lc3RhbXAoc3RhcnRNaWxsaXMgKyBlbGFwc2VkKSwKICAgICAgICAgICAgICAgIGVsYXBzZWRdOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlTWVzc2FnZShlbGVtZW50LCBzdHJpbmdzKSB7CiAgICAgICAgcmV0dXJuIG1vZGVsLk1lc3NhZ2UoTEVWRUxTW2VsZW1lbnRbMl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwudGltZXN0YW1wKGVsZW1lbnRbMV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MuZ2V0KGVsZW1lbnRbM10pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3MuZ2V0KGVsZW1lbnRbNF0pKTsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlU3RhdHVzKHN0YXRzKSB7CiAgICAgICAgcmV0dXJuIFNUQVRVU0VTW3N0YXRzWzBdXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNoaWxkQ3JlYXRvcihwYXJlbnQsIGNoaWxkVHlwZSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoZWxlbSwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQoY2hpbGRUeXBlKHBhcmVudCwgZWxlbSwgc3RyaW5ncywgaW5kZXgpKTsKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlQm9keUl0ZW0ocGFyZW50LCBlbGVtZW50LCBzdHJpbmdzLCBpbmRleCkgewogICAgICAgIGlmIChlbGVtZW50WzBdID09IE1FU1NBR0VfVFlQRSkKICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2UoZWxlbWVudCwgc3RyaW5ncyk7CiAgICAgICAgcmV0dXJuIGNyZWF0ZUtleXdvcmQocGFyZW50LCBlbGVtZW50LCBzdHJpbmdzLCBpbmRleCk7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVLZXl3b3JkKHBhcmVudCwgZWxlbWVudCwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICB2YXIga3cgPSBtb2RlbC5LZXl3b3JkKHsKICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgICAgIHR5cGU6IEtFWVdPUkRfVFlQRVNbZWxlbWVudFswXV0sCiAgICAgICAgICAgIGlkOiAnaycgKyAoaW5kZXggKyAxKSwKICAgICAgICAgICAgbmFtZTogc3RyaW5ncy5nZXQoZWxlbWVudFsxXSksCiAgICAgICAgICAgIGxpYm5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMl0pLAogICAgICAgICAgICB0aW1lb3V0OiBzdHJpbmdzLmdldChlbGVtZW50WzNdKSwKICAgICAgICAgICAgYXJnczogc3RyaW5ncy5nZXQoZWxlbWVudFs1XSksCiAgICAgICAgICAgIGFzc2lnbjogc3RyaW5ncy5nZXQoZWxlbWVudFs2XSksCiAgICAgICAgICAgIHRhZ3M6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbN10pLAogICAgICAgICAgICBkb2M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkb2MgPSBzdHJpbmdzLmdldChlbGVtZW50WzRdKTsKICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3RhdHVzOiBwYXJzZVN0YXR1cyhlbGVtZW50WzhdLCBzdHJpbmdzKSwKICAgICAgICAgICAgdGltZXM6IG1vZGVsLlRpbWVzKHRpbWVzKGVsZW1lbnRbOF0pKSwKICAgICAgICAgICAgaXNDaGlsZHJlbkxvYWRlZDogdHlwZW9mKGVsZW1lbnRbOV0pICE9PSAnbnVtYmVyJwogICAgICAgIH0pOwogICAgICAgIGxhenlQb3B1bGF0ZUtleXdvcmRzRnJvbUZpbGUoa3csIGVsZW1lbnRbOV0sIHN0cmluZ3MpOwogICAgICAgIHJldHVybiBrdzsKICAgIH0KICAgIGZ1bmN0aW9uIGxhenlQb3B1bGF0ZUtleXdvcmRzRnJvbUZpbGUocGFyZW50LCBtb2RlbE9ySW5kZXgsIHN0cmluZ3MpIHsKICAgICAgICB2YXIgbW9kZWwsIGluZGV4LCBwb3B1bGF0b3I7CiAgICAgICAgdmFyIGNyZWF0b3IgPSBjaGlsZENyZWF0b3IocGFyZW50LCBjcmVhdGVCb2R5SXRlbSk7CiAgICAgICAgaWYgKHBhcmVudC5pc0NoaWxkcmVuTG9hZGVkKSB7CiAgICAgICAgICAgIG1vZGVsID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwb3B1bGF0b3IgPSBQb3B1bGF0b3IobW9kZWwsIHN0cmluZ3MsIGNyZWF0b3IpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluZGV4ID0gbW9kZWxPckluZGV4OwogICAgICAgICAgICBwYXJlbnQuY2hpbGRGaWxlTmFtZSA9IHdpbmRvdy5zZXR0aW5nc1snc3BsaXRMb2dCYXNlJ10gKyAnLScgKyBpbmRleCArICcuanMnOwogICAgICAgICAgICBwb3B1bGF0b3IgPSBTcGxpdExvZ1BvcHVsYXRvcihpbmRleCwgY3JlYXRvcik7CiAgICAgICAgfQogICAgICAgIHBhcmVudC5wb3B1bGF0ZUtleXdvcmRzKHBvcHVsYXRvcik7CiAgICB9CiAgICBmdW5jdGlvbiB0YWdzKHRhZ2xpc3QsIHN0cmluZ3MpIHsKICAgICAgICByZXR1cm4gdXRpbC5tYXAodGFnbGlzdCwgc3RyaW5ncy5nZXQpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlVGVzdChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1cyA9IGVsZW1lbnRbNF07CiAgICAgICAgdmFyIHRlc3QgPSBtb2RlbC5UZXN0KHsKICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsCiAgICAgICAgICAgIGlkOiAndCcgKyAoaW5kZXggKyAxKSwKICAgICAgICAgICAgbmFtZTogc3RyaW5ncy5nZXQoZWxlbWVudFswXSksCiAgICAgICAgICAgIGRvYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGRvYyA9IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMl0pOwogICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBkb2M7IH07CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9LAogICAgICAgICAgICB0aW1lb3V0OiBzdHJpbmdzLmdldChlbGVtZW50WzFdKSwKICAgICAgICAgICAgc3RhdHVzOiBwYXJzZVN0YXR1cyhzdGF0dXMpLAogICAgICAgICAgICBtZXNzYWdlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgbXNnID0gc3RhdHVzLmxlbmd0aCA9PSA0ID8gc3RyaW5ncy5nZXQoc3RhdHVzWzNdKSA6ICcnOwogICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbXNnOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZXM6IG1vZGVsLlRpbWVzKHRpbWVzKHN0YXR1cykpLAogICAgICAgICAgICB0YWdzOiB0YWdzKGVsZW1lbnRbM10sIHN0cmluZ3MpLAogICAgICAgICAgICBpc0NoaWxkcmVuTG9hZGVkOiB0eXBlb2YoZWxlbWVudFs1XSkgIT09ICdudW1iZXInCiAgICAgICAgfSk7CiAgICAgICAgbGF6eVBvcHVsYXRlS2V5d29yZHNGcm9tRmlsZSh0ZXN0LCBlbGVtZW50WzVdLCBzdHJpbmdzKTsKICAgICAgICByZXR1cm4gdGVzdDsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVN1aXRlKHBhcmVudCwgZWxlbWVudCwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICB2YXIgc3RhdHVzID0gZWxlbWVudFs1XTsKICAgICAgICB2YXIgc3VpdGUgPSBtb2RlbC5TdWl0ZSh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICBpZDogJ3MnICsgKChpbmRleCB8fCAwKSArIDEpLAogICAgICAgICAgICBuYW1lOiBzdHJpbmdzLmdldChlbGVtZW50WzBdKSwKICAgICAgICAgICAgc291cmNlOiBzdHJpbmdzLmdldChlbGVtZW50WzFdKSwKICAgICAgICAgICAgcmVsYXRpdmVTb3VyY2U6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMl0pLAogICAgICAgICAgICBkb2M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkb2MgPSBzdHJpbmdzLmdldChlbGVtZW50WzNdKTsKICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3RhdHVzOiBwYXJzZVN0YXR1cyhzdGF0dXMpLAogICAgICAgICAgICBtZXNzYWdlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgbXNnID0gc3RhdHVzLmxlbmd0aCA9PSA0ID8gc3RyaW5ncy5nZXQoc3RhdHVzWzNdKSA6ICcnOwogICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbXNnOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZXM6IG1vZGVsLlRpbWVzKHRpbWVzKHN0YXR1cykpLAogICAgICAgICAgICBzdGF0aXN0aWNzOiBzdWl0ZVN0YXRzKHV0aWwubGFzdChlbGVtZW50KSksCiAgICAgICAgICAgIG1ldGFkYXRhOiBwYXJzZU1ldGFkYXRhKGVsZW1lbnRbNF0sIHN0cmluZ3MpCiAgICAgICAgfSk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVLZXl3b3JkcyhQb3B1bGF0b3IoZWxlbWVudFs4XSwgc3RyaW5ncywgY2hpbGRDcmVhdG9yKHN1aXRlLCBjcmVhdGVLZXl3b3JkKSkpOwogICAgICAgIHN1aXRlLnBvcHVsYXRlVGVzdHMoUG9wdWxhdG9yKGVsZW1lbnRbN10sIHN0cmluZ3MsIGNoaWxkQ3JlYXRvcihzdWl0ZSwgY3JlYXRlVGVzdCkpKTsKICAgICAgICBzdWl0ZS5wb3B1bGF0ZVN1aXRlcyhQb3B1bGF0b3IoZWxlbWVudFs2XSwgc3RyaW5ncywgY2hpbGRDcmVhdG9yKHN1aXRlLCBjcmVhdGVTdWl0ZSkpKTsKICAgICAgICByZXR1cm4gc3VpdGU7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZU1ldGFkYXRhKGRhdGEsIHN0cmluZ3MpIHsKICAgICAgICB2YXIgbWV0YWRhdGEgPSBbXTsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8ZGF0YS5sZW5ndGg7IGkrPTIpIHsKICAgICAgICAgICAgbWV0YWRhdGEucHVzaChbc3RyaW5ncy5nZXQoZGF0YVtpXSksIHN0cmluZ3MuZ2V0KGRhdGFbaSsxXSldKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1ldGFkYXRhOwogICAgfQogICAgZnVuY3Rpb24gc3VpdGVTdGF0cyhzdGF0cykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRvdGFsOiBzdGF0c1swXSwKICAgICAgICAgICAgcGFzczogc3RhdHNbMV0sCiAgICAgICAgICAgIGZhaWw6IHN0YXRzWzJdLAogICAgICAgICAgICBza2lwOiBzdGF0c1szXQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBQb3B1bGF0b3IoaXRlbXMsIHN0cmluZ3MsIGNyZWF0b3IpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBudW1iZXJPZkl0ZW1zOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXMubGVuZ3RoOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjcmVhdG9yOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdG9yKGl0ZW1zW2luZGV4XSwgc3RyaW5ncywgaW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIFNwbGl0TG9nUG9wdWxhdG9yKHN0cnVjdHVyZUluZGV4LCBjcmVhdG9yKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbnVtYmVyT2ZJdGVtczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvd1sna2V5d29yZHMnK3N0cnVjdHVyZUluZGV4XS5sZW5ndGg7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNyZWF0b3I6IGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0b3Iod2luZG93WydrZXl3b3Jkcycrc3RydWN0dXJlSW5kZXhdW2luZGV4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1N0b3JlKHdpbmRvd1snc3RyaW5ncycrc3RydWN0dXJlSW5kZXhdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZSgpIHsKICAgICAgICB2YXIgZWxlbSA9IHdpbmRvdy5vdXRwdXQuc3VpdGU7CiAgICAgICAgaWYgKGVsZW1lbnRzQnlJZFtlbGVtLmlkXSkKICAgICAgICAgICAgcmV0dXJuIGVsZW07CiAgICAgICAgdmFyIHJvb3QgPSBhZGRFbGVtZW50KGNyZWF0ZVN1aXRlKG51bGwsIGVsZW0sIFN0cmluZ1N0b3JlKHdpbmRvdy5vdXRwdXQuc3RyaW5ncykpKTsKICAgICAgICB3aW5kb3cub3V0cHV0LnN1aXRlID0gcm9vdDsKICAgICAgICByZXR1cm4gcm9vdDsKICAgIH0KICAgIGZ1bmN0aW9uIGZpbmRMb2FkZWQoaWQpIHsKICAgICAgICByZXR1cm4gZWxlbWVudHNCeUlkW2lkXTsKICAgIH0KICAgIGZ1bmN0aW9uIGVuc3VyZUxvYWRlZChpZCwgY2FsbGJhY2spIHsKICAgICAgICB2YXIgaWRzID0gaWQuc3BsaXQoJy0nKTsKICAgICAgICB2YXIgcm9vdCA9IHN1aXRlKCk7CiAgICAgICAgaWRzLnNoaWZ0KCk7CiAgICAgICAgbG9hZEl0ZW1zKGlkcywgcm9vdCwgW3Jvb3QuaWRdLCBjYWxsYmFjayk7CiAgICB9CiAgICBmdW5jdGlvbiBsb2FkSXRlbXMoaWRzLCBjdXJyZW50LCByZXN1bHQsIGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKCFpZHMubGVuZ3RoKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKHJlc3VsdCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY3VycmVudC5jYWxsV2hlbkNoaWxkcmVuUmVhZHkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgaWQgPSBpZHMuc2hpZnQoKTsKICAgICAgICAgICAgdmFyIHR5cGUgPSBpZFswXTsKICAgICAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VJbnQoaWQuc3Vic3RyaW5nKDEpKSAtIDE7CiAgICAgICAgICAgIHZhciBpdGVtID0gc2VsZWN0RnJvbShjdXJyZW50LCB0eXBlLCBpbmRleCk7CiAgICAgICAgICAgIGlmIChpdGVtKQogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaXRlbS5pZCk7CiAgICAgICAgICAgIGVsc2UgICAgLy8gSW52YWxpZCBpZC4gU2hvdWxkIHRoaXMgYmUgcmVwb3J0ZWQgc29tZXdoZXJlPwogICAgICAgICAgICAgICAgaWRzID0gW107CiAgICAgICAgICAgIGxvYWRJdGVtcyhpZHMsIGl0ZW0sIHJlc3VsdCwgY2FsbGJhY2spOwogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gc2VsZWN0RnJvbShlbGVtZW50LCB0eXBlLCBpbmRleCkgewogICAgICAgIGlmICh0eXBlID09PSAnaycpIHsKICAgICAgICAgICAgdmFyIGtleXdvcmRzID0gdXRpbC5maWx0ZXIoZWxlbWVudC5rZXl3b3JkcygpLCBmdW5jdGlvbiAoa3cpIHsKICAgICAgICAgICAgICAgIHJldHVybiBrdy50eXBlICE9ICdtZXNzYWdlJzsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBrZXl3b3Jkc1tpbmRleF07CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAndCcpIHsKICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudGVzdHMoKVtpbmRleF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuc3VpdGVzKClbaW5kZXhdOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGVycm9ySXRlcmF0b3IoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFkZEVsZW1lbnQoY3JlYXRlTWVzc2FnZSh3aW5kb3cub3V0cHV0LmVycm9ycy5zaGlmdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGhhc05leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cub3V0cHV0LmVycm9ycy5sZW5ndGggPiAwOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YXRpc3RpY3MoKSB7CiAgICAgICAgaWYgKCFfc3RhdGlzdGljcykgewogICAgICAgICAgICB2YXIgc3RhdERhdGEgPSB3aW5kb3cub3V0cHV0LnN0YXRzOwogICAgICAgICAgICBfc3RhdGlzdGljcyA9IHN0YXRzLlN0YXRpc3RpY3Moc3RhdERhdGFbMF0sIHN0YXREYXRhWzFdLCBzdGF0RGF0YVsyXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfc3RhdGlzdGljczsKICAgIH0KICAgIGZ1bmN0aW9uIFN0cmluZ1N0b3JlKHN0cmluZ3MpIHsKICAgICAgICBmdW5jdGlvbiBnZXRUZXh0KGlkKSB7CiAgICAgICAgICAgIHZhciB0ZXh0ID0gc3RyaW5nc1tpZF07CiAgICAgICAgICAgIGlmICghdGV4dCkKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgaWYgKHRleHRbMF0gPT0gJyonKQogICAgICAgICAgICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDEpOwogICAgICAgICAgICB2YXIgZXh0cmFjdGVkID0gZXh0cmFjdCh0ZXh0KTsKICAgICAgICAgICAgc3RyaW5nc1tpZF0gPSAnKicgKyBleHRyYWN0ZWQ7CiAgICAgICAgICAgIHJldHVybiBleHRyYWN0ZWQ7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGV4dHJhY3QodGV4dCkgewogICAgICAgICAgICB2YXIgZGVjb2RlZCA9IEpYRy5VdGlsLkJhc2U2NC5kZWNvZGVBc0FycmF5KHRleHQpOwogICAgICAgICAgICB2YXIgZXh0cmFjdGVkID0gKG5ldyBKWEcuVXRpbC5VbnppcChkZWNvZGVkKSkudW56aXAoKVswXVswXTsKICAgICAgICAgICAgcmV0dXJuIEpYRy5VdGlsLlVURjguZGVjb2RlKGV4dHJhY3RlZCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGdldChpZCkgewogICAgICAgICAgICBpZiAoaWQgPT09IG51bGwpIHJldHVybiBudWxsOwogICAgICAgICAgICByZXR1cm4gZ2V0VGV4dChpZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7Z2V0OiBnZXR9OwogICAgfQogICAgcmV0dXJuIHsKICAgICAgICBzdWl0ZTogc3VpdGUsCiAgICAgICAgZXJyb3JJdGVyYXRvcjogZXJyb3JJdGVyYXRvciwKICAgICAgICBmaW5kTG9hZGVkOiBmaW5kTG9hZGVkLAogICAgICAgIGVuc3VyZUxvYWRlZDogZW5zdXJlTG9hZGVkLAogICAgICAgIHN0YXRpc3RpY3M6IHN0YXRpc3RpY3MsCiAgICAgICAgU3RyaW5nU3RvcmU6IFN0cmluZ1N0b3JlLCAgLy8gZXhwb3NlZCBmb3IgdGVzdHMKICAgICAgICBMRVZFTFM6IExFVkVMUwogICAgfTsKfSgpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpmdW5jdGlvbiByZW1vdmVKYXZhU2NyaXB0RGlzYWJsZWRXYXJuaW5nKCkgewogICAgLy8gTm90IHVzaW5nIGpRdWVyeSBoZXJlIGZvciBtYXhpbXVtIHNwZWVkCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamF2YXNjcmlwdC1kaXNhYmxlZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Cn0KZnVuY3Rpb24gYWRkSmF2YVNjcmlwdERpc2FibGVkV2FybmluZyhlcnJvcikgewogICAgaWYgKHdpbmRvdy5jb25zb2xlKQogICAgICAgIGNvbnNvbGUuZXJyb3IoJ09wZW5pbmcgZmFpbGVkOiAnICsgZXJyb3IubmFtZSArICc6ICcgKyBlcnJvci5tZXNzYWdlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqYXZhc2NyaXB0LWRpc2FibGVkJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7Cn0KZnVuY3Rpb24gaW5pdExheW91dChzdWl0ZU5hbWUsIHR5cGUpIHsKICAgIHBhcnNlVGVtcGxhdGVzKCk7CiAgICBzZXRUaXRsZShzdWl0ZU5hbWUsIHR5cGUpOwogICAgYWRkSGVhZGVyKCk7CiAgICBhZGRSZXBvcnRPckxvZ0xpbmsodHlwZSk7Cn0KZnVuY3Rpb24gcGFyc2VUZW1wbGF0ZXMoKSB7CiAgICAkKCdzY3JpcHRbdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIl0nKS5tYXAoZnVuY3Rpb24gKGlkeCwgZWxlbSkgewogICAgICAgICQudGVtcGxhdGUoZWxlbS5pZCwgZWxlbS50ZXh0KTsKICAgIH0pOwp9CmZ1bmN0aW9uIHRlc3RPclRhc2sodGV4dCkgewogICAgcmV0dXJuIHRleHQucmVwbGFjZSgveyguKil9LywgZnVuY3Rpb24gKG1hdGNoLCBncm91cCwgb2Zmc2V0LCBzdHJpbmcpIHsKICAgICAgICBpZiAoIXdpbmRvdy5zZXR0aW5ncy5ycGEpCiAgICAgICAgICAgIHJldHVybiBncm91cDsKICAgICAgICByZXR1cm4geydURVNUJzogJ1RBU0snLCAnVGVzdCc6ICdUYXNrJywgJ3Rlc3QnOiAndGFzayd9W2dyb3VwXTsKICAgIH0pOwp9CmZ1bmN0aW9uIHNldFRpdGxlKHN1aXRlTmFtZSwgdHlwZSkgewogICAgdmFyIGdpdmVuVGl0bGUgPSB3aW5kb3cuc2V0dGluZ3MudGl0bGU7CiAgICB2YXIgdGl0bGUgPSBnaXZlblRpdGxlID8gZ2l2ZW5UaXRsZSA6IHN1aXRlTmFtZSArICIgIiArIHR5cGU7CiAgICBkb2N1bWVudC50aXRsZSA9IHV0aWwudW5lc2NhcGUodGl0bGUpOwp9CmZ1bmN0aW9uIGFkZEhlYWRlcigpIHsKICAgIHZhciBnZW5lcmF0ZWQgPSB1dGlsLnRpbWVzdGFtcCh3aW5kb3cub3V0cHV0LmdlbmVyYXRlZCk7CiAgICAkLnRtcGwoJzxoMT4ke3RpdGxlfTwvaDE+JyArCiAgICAgICAgICAgJzxkaXYgaWQ9ImdlbmVyYXRlZCI+JyArCiAgICAgICAgICAgICAnPHNwYW4+R2VuZXJhdGVkPGJyPiR7Z2VuZXJhdGVkfTwvc3Bhbj48YnI+JyArCiAgICAgICAgICAgICAnPHNwYW4gaWQ9ImdlbmVyYXRlZC1hZ28iPiR7YWdvfSBhZ288L3NwYW4+JyArCiAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICc8ZGl2IGlkPSJ0b3AtcmlnaHQtaGVhZGVyIj4nICsKICAgICAgICAgICAgICc8ZGl2IGlkPSJyZXBvcnQtb3ItbG9nLWxpbmsiPjxhIGhyZWY9IiMiPjwvYT48L2Rpdj4nICsKICAgICAgICAgICAnPC9kaXY+JywgewogICAgICAgIGdlbmVyYXRlZDogdXRpbC5jcmVhdGVHZW5lcmF0ZWRTdHJpbmcoZ2VuZXJhdGVkKSwKICAgICAgICBhZ286IHV0aWwuY3JlYXRlR2VuZXJhdGVkQWdvU3RyaW5nKGdlbmVyYXRlZCksCiAgICAgICAgdGl0bGU6IGRvY3VtZW50LnRpdGxlCiAgICB9KS5hcHBlbmRUbygkKCcjaGVhZGVyJykpOwp9CmZ1bmN0aW9uIGFkZFJlcG9ydE9yTG9nTGluayhteVR5cGUpIHsKICAgIHZhciB1cmw7CiAgICB2YXIgdGV4dDsKICAgIHZhciBjb250YWluZXIgPSAkKCcjcmVwb3J0LW9yLWxvZy1saW5rJyk7CiAgICBpZiAobXlUeXBlID09ICdSZXBvcnQnKSB7CiAgICAgICAgdXJsID0gd2luZG93LnNldHRpbmdzLmxvZ1VSTDsKICAgICAgICB0ZXh0ID0gJ0xPRyc7CiAgICB9IGVsc2UgewogICAgICAgIHVybCA9IHdpbmRvdy5zZXR0aW5ncy5yZXBvcnRVUkw7CiAgICAgICAgdGV4dCA9ICdSRVBPUlQnOwogICAgfQogICAgaWYgKHVybCkgewogICAgICAgIGNvbnRhaW5lci5maW5kKCdhJykuYXR0cignaHJlZicsIHVybCk7CiAgICAgICAgY29udGFpbmVyLmZpbmQoJ2EnKS50ZXh0KHRleHQpOwogICAgfSBlbHNlIHsKICAgICAgICBjb250YWluZXIucmVtb3ZlKCk7CiAgICB9Cn0KZnVuY3Rpb24gYWRkU3RhdGlzdGljcygpIHsKICAgIHZhciBzdGF0SGVhZGVycyA9CiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPlRvdGFsPC90aD4nICsKICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+UGFzczwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPkZhaWw8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij5Ta2lwPC90aD4nICsKICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtZWxhcHNlZCI+RWxhcHNlZDwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLWdyYXBoIj5QYXNzIC8gRmFpbCAvIFNraXA8L3RoPic7CiAgICB2YXIgc3RhdFRhYmxlID0KICAgICAgICAnPGgyPntUZXN0fSBTdGF0aXN0aWNzPC9oMj4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0idG90YWwtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlRvdGFsIFN0YXRpc3RpY3M8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPicgKwogICAgICAgICc8dGFibGUgY2xhc3M9InN0YXRpc3RpY3MiIGlkPSJ0YWctc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgVGFnPC90aD4nICsgc3RhdEhlYWRlcnMgKwogICAgICAgICc8L3RyPjwvdGhlYWQ+PC90YWJsZT4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0ic3VpdGUtc3RhdHMiPjx0aGVhZD48dHI+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPlN0YXRpc3RpY3MgYnkgU3VpdGU8L3RoPicgKyBzdGF0SGVhZGVycyArCiAgICAgICAgJzwvdHI+PC90aGVhZD48L3RhYmxlPic7CiAgICAkKHRlc3RPclRhc2soc3RhdFRhYmxlKSkuYXBwZW5kVG8oJyNzdGF0aXN0aWNzLWNvbnRhaW5lcicpOwogICAgdXRpbC5tYXAoWyd0b3RhbCcsICd0YWcnLCAnc3VpdGUnXSwgYWRkU3RhdFRhYmxlKTsKICAgIGFkZFRvb2x0aXBzVG9FbGFwc2VkVGltZXMoKTsKICAgIGVuYWJsZVN0YXRpc3RpY3NTb3J0ZXIoKTsKfQpmdW5jdGlvbiBhZGRUb29sdGlwc1RvRWxhcHNlZFRpbWVzKCkgewogICAgJCgnLnN0YXRzLWNvbC1lbGFwc2VkJykuYXR0cigndGl0bGUnLAogICAgICAgIHRlc3RPclRhc2soJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZXNlIHt0ZXN0fXMuICcpICsKICAgICAgICAnRXhjbHVkZXMgc3VpdGUgc2V0dXBzIGFuZCB0ZWFyZG93bnMuJyk7CiAgICAkKCcjc3VpdGUtc3RhdHMnKS5maW5kKCcuc3RhdHMtY29sLWVsYXBzZWQnKS5hdHRyKCd0aXRsZScsCiAgICAgICAgJ1RvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIHRoaXMgc3VpdGUuJyk7Cn0KZnVuY3Rpb24gZW5hYmxlU3RhdGlzdGljc1NvcnRlcigpIHsKICAgICQudGFibGVzb3J0ZXIuYWRkUGFyc2VyKHsKICAgICAgICBpZDogJ3N0YXROYW1lJywKICAgICAgICB0eXBlOiAnbnVtZXJpYycsCiAgICAgICAgaXM6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZG8gbm90IGF1dG8tZGV0ZWN0CiAgICAgICAgfSwKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHN0cmluZywgdGFibGUsIGNlbGwsIGNlbGxJbmRleCkgewogICAgICAgICAgICAvLyBSb3dzIGhhdmUgY2xhc3MgaW4gZm9ybWF0ICdyb3ctPGluZGV4PicuCiAgICAgICAgICAgIHZhciBpbmRleCA9ICQoY2VsbCkucGFyZW50KCkuYXR0cignY2xhc3MnKS5zdWJzdHJpbmcoNCk7CiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpbmRleCk7CiAgICAgICAgfQogICAgfSk7CiAgICAkKCIuc3RhdGlzdGljcyIpLnRhYmxlc29ydGVyKHsKICAgICAgICBzb3J0SW5pdGlhbE9yZGVyOiAnZGVzYycsCiAgICAgICAgaGVhZGVyczogezA6IHtzb3J0ZXI6ICdzdGF0TmFtZScsIHNvcnRJbml0aWFsT3JkZXI6ICdhc2MnfSwKICAgICAgICAgICAgICAgICAgNjoge3NvcnRlcjogZmFsc2V9fQogICAgfSk7Cn0KZnVuY3Rpb24gYWRkU3RhdFRhYmxlKHRhYmxlTmFtZSkgewogICAgdmFyIHN0YXRzID0gd2luZG93LnRlc3RkYXRhLnN0YXRpc3RpY3MoKVt0YWJsZU5hbWVdOwogICAgaWYgKHRhYmxlTmFtZSA9PSAndGFnJyAmJiBzdGF0cy5sZW5ndGggPT0gMCkgewogICAgICAgIHJlbmRlck5vVGFnU3RhdFRhYmxlKCk7CiAgICB9IGVsc2UgewogICAgICAgIHJlbmRlclN0YXRUYWJsZSh0YWJsZU5hbWUsIHN0YXRzKTsKICAgIH0KfQpmdW5jdGlvbiByZW5kZXJOb1RhZ1N0YXRUYWJsZSgpIHsKICAgICQoJzx0Ym9keT48dHIgY2xhc3M9InJvdy0wIj4nICsKICAgICAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSI+Tm8gVGFnczwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPjwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPjwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPjwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPjwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLWVsYXBzZWQiPjwvdGQ+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLWdyYXBoIj4nICsKICAgICAgICAgICc8ZGl2IGNsYXNzPSJlbXB0eS1ncmFwaCI+PC9kaXY+JyArCiAgICAgICAgJzwvdGQ+JyArCiAgICAgICc8L3RyPjwvdGJvZHk+JykuYXBwZW5kVG8oJyN0YWctc3RhdHMnKTsKfQpmdW5jdGlvbiByZW5kZXJTdGF0VGFibGUodGFibGVOYW1lLCBzdGF0cykgewogICAgdmFyIHRlbXBsYXRlID0gdGFibGVOYW1lICsgJ1N0YXRpc3RpY3NSb3dUZW1wbGF0ZSc7CiAgICB2YXIgdGJvZHkgPSAkKCc8dGJvZHk+PC90Ym9keT4nKTsKICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzdGF0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICQudG1wbCh0ZW1wbGF0ZSwgc3RhdHNbaV0sIHtpbmRleDogaX0pLmFwcGVuZFRvKHRib2R5KTsKICAgIH0KICAgIHRib2R5LmFwcGVuZFRvKCcjJyArIHRhYmxlTmFtZSArICctc3RhdHMnKTsKfQokLnRlbXBsYXRlKCdzdGF0Q29sdW1uc1RlbXBsYXRlJywKICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij4ke3RvdGFsfTwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+JHtwYXNzfTwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+JHtmYWlsfTwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+JHtza2lwfTwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZWxhcHNlZCI+JHtlbGFwc2VkfTwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtZ3JhcGgiPicgKwogICAgICAne3tpZiB0b3RhbH19JyArCiAgICAgICc8ZGl2IGNsYXNzPSJncmFwaCI+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InBhc3MtYmFyIiBzdHlsZT0id2lkdGg6ICR7cGFzc1dpZHRofSUiIHRpdGxlPSIke3Bhc3NQZXJjZW50fSUiPjwvZGl2PicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJmYWlsLWJhciIgc3R5bGU9IndpZHRoOiAke2ZhaWxXaWR0aH0lIiB0aXRsZT0iJHtmYWlsUGVyY2VudH0lIj48L2Rpdj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0ic2tpcC1iYXIiIHN0eWxlPSJ3aWR0aDogJHtza2lwV2lkdGh9JSIgdGl0bGU9IiR7c2tpcFBlcmNlbnR9JSI+PC9kaXY+JyArCiAgICAgICc8L2Rpdj4nICsKICAgICAgJ3t7ZWxzZX19JyArCiAgICAgICc8ZGl2IGNsYXNzPSJlbXB0eS1ncmFwaCI+PC9kaXY+JyArCiAgICAgICd7ey9pZn19JyArCiAgICAnPC90ZD4nCik7CiQudGVtcGxhdGUoJ3N1aXRlU3RhdHVzTWVzc2FnZVRlbXBsYXRlJywKICAgICcke3RvdGFsfSB7ez0gdGVzdE9yVGFzaygie3Rlc3R9Iil9fXt7aWYgdG90YWwgIT0gMX19c3t7L2lmfX0gdG90YWwsICcgKwogICAgJyR7cGFzc30gcGFzc2VkLCAke2ZhaWx9IGZhaWxlZCwgJHtza2lwfSBza2lwcGVkJwopOwovLyBGb3IgY29tcGxldGUgY3Jvc3MtYnJvd3NlciBleHBlcmllbmNlLi4KLy8gaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9qcy9ldmVudHNfb3JkZXIuaHRtbApmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oZXZlbnQpIHsKICAgIHZhciBldmVudCA9IGV2ZW50IHx8IHdpbmRvdy5ldmVudDsKICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7CiAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKQogICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwp9Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXQgPSB7fTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3VpdGUiXSA9IFsxLDIsMywwLFtdLFswLDAsMzA5OV0sW10sW1s0LDAsMCxbXSxbMCwzNDIsMjMxMCw1XSxbWzAsNiwwLDAsMCw3LDAsMCxbMSwzNDQsMjI0NF0sW1swLDgsOSwwLDEwLDExLDAsMCxbMSwzNDYsMjIwOV0sW1s4LDM0NywyLDEyXSxbOCwzNDgsMiwxM11dXSxbMCwxNCw5LDAsMTUsMTYsMCwwLFsxLDI1NTYsMzFdLFtdXV1dLFswLDE3LDksMCwxOCwxOSwwLDAsWzAsMjU4OSw2MV0sW1s4LDI2NDksMiwyMF0sWzgsMjY1MCw1LDVdXV1dXV0sW1syLDIxLDksMCwyMiwwLDAsMCxbMSwyNjU0LDQ0NV0sW11dXSxbMSwwLDEsMF1dOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJzdHJpbmdzIl0gPSBbXTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3RyaW5ncyJdID0gd2luZG93Lm91dHB1dFsic3RyaW5ncyJdLmNvbmNhdChbIioiLCIqSnVweXRlciIsIiovaG9tZS9kYXRha3VycmUvV29yay9naXRodWIvcm9ib3RzLWZyb20tanVweXRlci9yb2JvdGtlcm5lbC9leGFtcGxlcyIsIiouLi8uLi8uLi8uLi9ob21lL2RhdGFrdXJyZS9Xb3JrL2dpdGh1Yi9yb2JvdHMtZnJvbS1qdXB5dGVyL3JvYm90a2VybmVsL2V4YW1wbGVzIiwiKkRlbW9uc3RyYXRlIGZhaWxpbmcgdGVzdCIsIipQYWdlIHNob3VsZCBoYXZlIGNvbnRhaW5lZCB0ZXh0ICdIZWxsbyBXb3JsZCEnIGJ1dCBkaWQgbm90LiIsIipPcGVuIHVybCIsIio8YSBocmVmPVwiaHR0cHM6Ly9wbG9uZS5vcmdcIj5odHRwczovL3Bsb25lLm9yZ1x4M2MvYT4iLCIqT3BlbiBCcm93c2VyIiwiKlNlbGVuaXVtTGlicmFyeSIsIio8cD5PcGVucyBhIG5ldyBicm93c2VyIGluc3RhbmNlIHRvIHRoZSBvcHRpb25hbCA8Y29kZT51cmxceDNjL2NvZGU+Llx4M2MvcD4iLCIqJHt1cmx9LCBicm93c2VyPWhlYWRsZXNzZmlyZWZveCwgYWxpYXM9c2luZ2xldG9uIiwiKk9wZW5pbmcgYnJvd3NlciAnaGVhZGxlc3NmaXJlZm94JyB0byBiYXNlIHVybCAnPGEgaHJlZj1cImh0dHBzOi8vcGxvbmUub3JnXCI+aHR0cHM6Ly9wbG9uZS5vcmdceDNjL2E+Jy4iLCIqRmlyZWZveCBkcml2ZXIgbG9nIGlzIGFsd2F5cyBmb3JjZWQgdG8gdG86IC9ydW4vdXNlci8xMDAwL3RtcHJ0MzUwbTNwL2dlY2tvZHJpdmVyLTEubG9nIiwiKlNldCBXaW5kb3cgU2l6ZSIsIio8cD5TZXRzIGN1cnJlbnQgd2luZG93cyBzaXplIHRvIGdpdmVuIDxjb2RlPndpZHRoXHgzYy9jb2RlPiBhbmQgPGNvZGU+aGVpZ2h0XHgzYy9jb2RlPi5ceDNjL3A+IiwiKjgwMCwgOTAwIiwiKlBhZ2UgU2hvdWxkIENvbnRhaW4iLCIqPHA+VmVyaWZpZXMgdGhhdCBjdXJyZW50IHBhZ2UgY29udGFpbnMgPGNvZGU+dGV4dFx4M2MvY29kZT4uXHgzYy9wPiIsIipIZWxsbyBXb3JsZCEiLCIqXHgzYy90ZD5ceDNjL3RyPjx0cj48dGQgY29sc3Bhbj1cIjNcIj48YT48aW1nIHNyYz1cImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBeUFBQUFNdkNBWUFBQUFxSnJTOUFBQWdBRWxFUVZSNFh1eWRCN3pONVIvSHZ5MFpFUXBSTmlVanBFVElTR1JHUldSa2xSSFpzK3lNYkpFa000b2lJN0szekpLUjdMSkpkb3EyLy9mejNINzMvN3ZubnZFNzU1NzdjOGZuKzNyMXF1NzVqZWYzZnA3ek84L24rWTdubHF4cGk5MFFHZ21RQUFtUUFBbVFBQW1RQUFtUUFBbUVRT0RvaGMxQm5YVUxCVWhRdkhnd0NaQUFDWkFBQ1pBQUNaQUFDWkNBalFBRkNJY0RDWkFBQ1pBQUNaQUFDWkFBQ1pDQWF3UW9RRnhEelJ1UkFBbVFBQW1RQUFtUUFBbVFBQWxRZ0hBTWtBQUprQUFKa0FBSmtBQUprQUFKdUVhQUFzUTExTHdSQ1pBQUNaQUFDWkFBQ1pBQUNaQUFCUWpIQUFtUUFBbVFBQW1RQUFtUUFBbVFnR3NFS0VCY1E4MGJrUUFKa0FBSmtBQUprQUFKa0FBSlVJQndESkFBQ1pBQUNaQUFDWkFBQ1pBQUNiaEdnQUxFTmRTOEVRbVFBQW5FSHdKbEt4U1hWMXZWa2ZzeXBaTlRKMytTU2U5L0ptdFhiREVQOEVDV2pOS3hSek1wK09qRGN2V1hYMlhCNXl0bHl2alpjdVBHRFprOGE0aGt6NVZaNnRkc0w2ZE8vQ1RKa2llVlZWcy9saytuTDVJSlkyZWEvL2EwcW1XYXlxSzFrNkw5L1pVWE8wcjN2cTBrVDc2YzVyUGZmcjB1MyszYUw4TUhURFRYeHIyc3o2eVRSdytaSXVrejNDTjFYNmt1ZmJxTmx1VmZyamNmNGRoYmI3dFZHdFhxSkxmY2NvczBhVmxibm51aHZDUlBrVXoyN2prczcrcDVodzhla3phZFhqSG4ybTM5Nm0zU3JlMDdNZW84KzNVdlhid2lxNWR2bG5FanA4djFhNzhIWk9xdnZXKzkzVVlxVmkwbHBRclZOdGQ1OVBIOE1uWnlYM243cmJGeStkSXZNdXk5SG5MMTZtOVNUUm4vK2VkZjVwaG5xNVdXWGdQZmtDdVhyMHFsVW8xOFBqTVkrK0k0ZnRUSE1tTDhXMTZaNEpxNDl1Z0p2ZVd4WWdYa2hZb3Q1YWN6NTZSbHUvclNvR25OYU9mOGVQaTRHUzhZR3h2WGI1ZGVuVWRJMG1SM3lodWRHMG5aWjRxYmZ0dTQ5aHNaT1hpeUdXOVBQbFhFUE5jWE91NEc5M25mWE0vaVcvSEpodVo1UTdVNzcwd2lhNzZaNmZYME56c09rd1pOYXZvY2o1RmowT081OFhlTVU0ekJJZjAra0dVNkp2R3NSMzg0S1ExZjdDQi8vLzFQNUROaG5QMTg5a0xrc2ZqdlFNOWFzc3hqOGxxYmx5VnpsdnZrN0U4WDVPTXBDMlRoM0pXaElvZzh6L3J1ZWw3bzZTZnFtWEZicDBFMXFWVy9pcVJKazhwOGgwWU5ubVMrUTFiLzRMeC8vLzFYKy82OHpQNzRTL01PcVB4Y1dYbnI3ZGJTb3VHYnNudkhmblBwVGQ5OUxvc1hySlhoQXorTWZEKzhXcStiZkwvN2tQa2MzK2Q1S3o0dzMxdU1FNHlYbUZxdUI3TksrKzVONWVGOHVlVEtsYXRtTE9FZFpyVWQvWUR2dmEreFZhQlFIdmxnK2dCWk5HKzFET3oxbmdRYU4ydjArMDZMU29BQ2hDT0NCRWlBQkVnZ0NvRjhqK1NXQ1RNR3llYXZkcWpvMkN5bG4zNUNpcFVzTE0xZTdpWkhmendwSDg4ZkxiZmZkcHRNbnpSWHN1VjRRRjZvVzBrbWp2dFVKcXRJc1VUQnhuWGZTT2ZXZzd3S0VIeTIrSXUxa2ZmY3RtbVhyTmc4WFR6Ly9yWCsvZDJKZlNSVjZwVHkzb2lQSkczYXU4MGs5dENCbzlMeWxiZk12YXpQcklzZDJuOVVhdGF1WUNiTzUzKytLSFdxdnlIWGZyc2VSWURVYjFKRFdyVnZJSi9OK0ZKK09IUmNqNjBteVpNbms1ZXF0WmJYV3RjMTUvYnI4YTc4OGNlZjVyTG5kRkszWi9mQkdJMFNhNExjLzgweGtpNTlXbW5ZN0hrendXcjdXbCs1TTJrU3Ywejl0YmZ6VzgwRENoQTB2SHU3SWJKdTFWYnpESmpRWXFMbEtVQThueGtpMUJmSERpMzZTOEVpZWMzMWV2UjlYWTRkMFhFeGRZSDUvNi9XZkMycHRhL21MUjh2dDk1NnEzd3c1aE9aTnVGenlaRXJpMlROY2IrWlVMYnQwbGkrbkw5R05tM1lMcitxWVBoNjgrNG9BcVQvc0E1U3NzempPc2JteVIrLy95bE5XdFF5azl3MlRYdEhUaEloZUYrdDExMzJmbmNvYkFJRWs5d3l6eFF6ejFHbllUWEovV0EyNmYvV0dQUC9lM1lkbEhkR2QvVTVIbkZNT2t5V1BaNGJmL2NtUVBEM01jT215Y3hwWHdRVUlMNmVOZVA5NldYU3JIZmt1NTBIWk1HY0ZZYloweFdmTkp5MmI5c1RvekZyQ1JEUDcrVzZsVnVsUnExbnBOTmJyNWsrL0Y2L0d4Z25LVk9sa0RyVjJraitnZytaTVRaajhudzVzUGNISForbHRWMlBTWnRtZlNURGZmYzZFaUQ0Ym81Nlo3SnAvOHVObnBQV0hSdWEvdzZIQUVseFZ6S1p0WENzTG1oY00reXpaTThrZFJ0V04vYzdlZnduMC9aQUFxUkxyK2JLb0lKWkZLbFNwb244cGVMZTM3ZzVwMEtTRnBVQUJRaEhCQW1RQUFtUVFCUUMzZnUyTkpPR3lrODFOcFAzVkhmZkpRTkhkdEhKeG1yNVV5ZmwvWWQxalBJRERaR0FGY1VxcFp2SXBKbnZTRTc5N3p2dXVGMDZ2VDVRZG56emZUUVBDRlpDNGFtd3pKcm9mRDVycWZFS3dQN1JWV0dzMk5zOUYvZzdKcVlsbm5wTXloVjkyWHgydTk2bmVZTWU1aHlzdG1LeWFrMzIvL3JyYjVuenlXSXp5Yk5mNTdNdkk3d0RyOVdQT0svSUV3V2tjZk5hWmdXM1V2VXlaakwxWFBuWHpNUVlabmtwWWpKTVBGZm9jUS84clVtZExuTC9BeG44TXYxMDBSaWY3YTJqRTZkQUhwQ1R4OC9JZ1gwL1NzOU9JM1NTZUpmeE5wMDU5YlBjcmNMTzdnSHhmT1pBSEMwZVN6Wk1sVjNmN292aUphclh1SVkwZS8wbDJhSWlObnZPekdaaWFobUV5SXg1STgwWXdGaXd6UEtBak5hSjRCZXJKeHFCYUkyVHhpcEFYbjI5ampSNHZvTmt5SGl2bVNTaWZ3L3RQMktFY2JnOElQWStIakM4a3p4Vy9CR0JWOFV5ZitNUngvaDZibThDQk8zLzg0Ky9WQ1Mza1ljZXpoRTU4ZlhtQWZIMXJLKzFxV3NXQUtvLy9hb1IzRmlKN3oyNHJYeWxIcVBGQzliRVpNaEdXVHl3ZjE5eDBVOFdqRGJmVDNnVVlZVlVqSTZiMmw5R0RKb2twMCtlalRLSno1YnpBZmxFRnkzZUd6RmQ0UDBMNUFIQmVFMldMS2w1SmdpdktaOE9OVzNKa2kxVFdBUkl4YXBQU2U5QmJhVmQ4MzZDeFE4WVBJSjRKM3l6OVR2VGRuaFBONnMzRHZacTZ6cnk0c3VWelRpQWR5MUpranQwZkg0bzIxUTBsMysyaFBUcE9rcVdMOTRReWRyYnVJbFJSeVRRa3lsQUVtakg4ckZJZ0FSSUlGUUM3MDNwWjFZcVg2elVLdG9sRUxyVXJOVkxKcXptek9tZnplZHRORlNtcnE0V1Y5V1Z3R0h2dldsQ1pxNWN1aW9aNzA5bkpvZEx2NW9XSlFScjdxZEw1WVBSbjVoei8venJMN05LN2htYXRYTHBSaE9LZ3duZkhVbHVsMWF2OUpRMDk5eXRZVDg5alREQXhNY3pCT3ZDK2N0U3JXelR5TW5vSjdvaVg2dGVGVUVvRnlZWWFGZVRsN3JJaHAyZm1aVmJoRTU0bXJjUXJMcnFSVGwyNUZTb09DTVkvUmZhWlUxaXJBa2IycEJlV2Z0aVdyMWNNMW13NmtPZjdYVVNnalh6bzRWU1UxZHJzVkw3VEtXU3hvdUU4SktueWhYMUdZS0ZaNjZ1SVdvUVN0NDRXaE5QUEpzM0FUSjk3Z2dWT2VmTXF2elFzZDNWVS9IL2tKcEFBbVRlcDhzRVl4QmhaTllrdWtUcHg4eDFlbllhTHRldi8yRW1pVmk5UnZzRzlYNWZQWEgzbS8rT2FRaVd2Wk45Q1JCZjR4SG4rbnB1YndJRVlVZkZTeFUyaytBVlM3N3lLMEI4UFd1L29SM2tvYnc1ekdKQnVNMWFHUEQ4dmtJMHJkL3hxU3hidEVIN0tNSTdoRkRHbFZ0bUNJN2R0UDdiLzAvaU4zd3J6OWVwS00wMVJLenJHNE9OQUE0a1FHYnBlSzFWcjdJS2hQNXlWa1AzUHZ2eVBRMHJtMi9FWFRnOElQaXU0VDFXODVubUdySjJQZ28yZS9pWUowOXJiTUV6aUxIUnFIWm42ZDZucFZ5NmRFVTZ0SGc3OG5BS0VHY2prUUxFR1NjZVJRSWtRQUtKaHNDN0gvWlc4WkJlYWxWK1Bkb3pOOVVmNzZiNjR4MUZnUHczdWJZTGtONWRSc3BIbjQ4UVRDWVE5KzhyQndSQ1kxRHZjVWFBckZxMlVXUEZGNXQ3WWpYeStOSFQwVVFHSmd4ZE5MUUxZVmdRSUNudVNpNERlbzQxNXlDVzNoNk9nL2E4UDIyQW1jVGNsVEtGRVNDTmRkS3dkdnNzV2Jwd25ibXZwMWxDQVJPS2E5ZXVtNC8zNy8zUmVINWlZcDRDQlBrejcwOTcyNGlnREJuVCtXUUtRVFYzK1FjKzIrdEVnSFJxTlVENkR1a2d3d1pNa0NvMXlzbUpZNmNsYWRJN1RkaVAzUVBpK2N6TmRYVWRrM3B2SFAwSmtBZnpaSmVwczRmSjBQNFROT3hyaTh4ZVBFNldLTzloYjA4d0NBTUprUG1mTFkvTVk3RUVpRFV4dEFzUWhNbVVLVi9NaEFkdTBMQ3ZhczgvN1lvQXNlY2QyY2VqditmMkprRHduVUErQS9LY0VLNkVVRHRmT1NDK25oVUNCTmRHUDc3VW9Lb0piWU10VzdSZStuWWZIWk1oRytrQnNWOEUzMWVzK0VPQUxGMjRQbEtBMk1XS0pVRHM1OEVUQ2UrSWt4d1FoSEkrVWppUFdlQkEva2lGeXFXTUFPblI3L1d3Q0pCR3pWODBvWlkxMU1zSmI1UGRySEdHc01IdmRod3dIOVY4cWFJSmE3TUV5RHZ2ZHBQY2ViTEpLeTkwTk4rUEJzMXFTZzBWTXhmT1hUTEhVNEE0RzNZVUlNNDQ4U2dTSUFFU1NEUUVFTjljU1JPVksrbXE2dSs2Mm94UUhZUjFZRkx6dDRhTklBU3JSL3Voc25abFJGSTZCRXR1blhSaUZSWWhXRmF5OStzZEdoZ1BCRUlXN0FJRUNaa0l0NEpkdkhoWkJjTDV5REF0ejFBUGlJeTdVaWJYWk9QeDByenR5NUlwa3dxaktxK2Jkbm1HdzFnZFpKL3NGeWlrOGVqajNqVGhJc2hmd2NSNTFzSXhjdkhDWlduVnFLYzVwVWpSL0ZKUEozL2pORVRFQ3NFSzUwbzY3dUVwUUt5NGRuc0lsaSttTTc5NDEyZDc0YVZBQ0U2NXgxODJPU3ZGU3owcXcvVjVrZk9Cc0IxNENoQUtod2xVMXV6M204bnE2NDE3U1czdGwwZjF1ZTBDeFBPWkEzRzBlSHQ2UUpBOGp2d0p1eUhmQk40Y3RDbVFBTUVZK0VLOVBuTStXYUtKNXhIRkNheEpZOE1YT2hpUGtSV25qL3lEbWRxZkdHUDRKNXo5NXNzRDRtczgrbnR1aENWNkpxRmJvWWpJdDNydzRleW0vZjRFaUxkbnRjS0RNSm5HR0VkKzBZZWZEQlo4eDhJbFFEeS9yMGllUndnV0JELzZBMllKYW5zZUJTYng4SVRpZmZMdWtLa3lhL3BDa3ljeGNFUm5hYTg1UkZzMzdqVEZCbFp2KzhTRTIrRjRMRVRBMjNQa2h4UG1PM1B4d2hXVHRILzFsOTlNNFl0d2VFRGdCZXc3cEgyVVBCbUlteXVYZjlHUTBiMStjMER3YmtONElFSk03V2JsOGxDQU9QK1pwQUJ4em9wSGtnQUprRUNpSVBDZ3hxTlArWFNJQ2ROQjRqSW1yNWpZSXRmaTBJRmpHczg5U202Ly9YYVRoSjRsMi8wbVhHTHFCM05NbFN1N0tNQ3E2TXdGNytxRThaNG9Bc1JYRGdpU1hSZk9YUlhKK0Z0Tm9rVitpU1ZvckVtT2xkUnNKYUdqZ3BWbFNDcC9YbGNzN2VFNFdMRXNWZlp4T2FqNUFoQWdXQ25HWkJIVmdwQThqZENPbE9vaHFWMjF0UW1Gc2lvLy9YNDlva0xWaGZPWElpdnloRG9Bck1rOFlzdlRaMGdyalY1N01USUpQWW5HN2Z0ajZxKzlxSHFGMENSNENoREtVMXVyRW1YTi9vRG1YTFRXMEp5Y2taTXBoTTJnYWhXcVVUMWZvWVVNMW1ScThMUUxFTFROL3N6bEtqenBsNk0zQVlKd09vU01RZXlocWhBTUlVSjRma3RnQlJJZ0NMM0RCQkhGRHo2YU9OZUlUU1NobzhJU3FpZDVWaXF5ci95N0lVQzhqY2ZwRStmNWZXNXc5eVZBd01jSWQyWG5UNERnKytqNXJNaUhtYVFpL2VDK0l5cnFsNWg4TFl4dExCYWc0RUZNekY3QnpuTmhBQW5ZRUJZSUk5dXo2NEFSbktuVHBKUzYxZHZLdy9selJabkVXd3NVdFRTazgwNFZISjh0R211S1A4QXJBdThWcXJMQlM3ZGorOTdJaFloSld0UmlvZVlxSWFjRm5sZ2tzY083RXc0QmdxSVBzeldzQzlXdjRLSEZlTVIzZnN6UXFYSk12YTcra3RBcmFQNEloQkRZWXVFRTFxRkhVODAvdXhFcHh1Z0JjVGJxS0VDY2NlSlJKRUFDSkpDb0NDQS9vSmttL1Q2UStUNVRobmV5VGlhdFVwS1pOR202NDV2TnBIQ1JmQ1lmQTZJQlpYcVJCTzdwbFVDU0pzSkU3QjRRWHdMRUU3QlZodGVhOE9GelRMWlJmUW1UbVpHYUQrS3ZESzgxR2MyazRXUWZxMmpDNU1JcXcvdktheTlveUU1NXVWc25iS2l1aE1rSHdycHVWaGxlZjB4Um1jbFhlOEVFQWhBZWpYdnVUV01tL3FnWWhncEk5b2s2a3BLeGNndWhna1IvYndMRXpoK1RYYXNNcnkrTzNnUkk4WkxxZ1huL1RYbW43M2lUL3dIRGhHL0orcW1hdEx2TFRMQ2RDQkNjZzc1NHVtSUp1ZTMyMnpTdllMdU1HRGhSZnJueS96SzhWcVdpMjdRaTI3UTV3OHgxM1JRZzl2R0k1KzJ2NDl6WGMwK2RNTWVuQU1GMU92ZDhUYXUzVlF3b1FMdzk2eE1sQ2ttTE4rcVo4dGNvR2dITzc0K2NFUzIvSWRnWG1EOEJnbXRCRE5XdVg5V1U0ZDJ2MWE1R2FabGtpSHhQZ1FoQkFvRTE3Y1BQNVlOM1A5SFN6SS9JNjFxRkRoNDVpSHVJQUhoRVBlOEhUd21xaWlGL3lCSmU0UkFnYURzUzR6djJlRlhMOE9hVVg3UzA4MkxOQ2NNN0RBc3QvZ1FJY3RDd2dJQ0NEWlpaWWFsNFgrRWRRZ0hpYktSUmdEamp4S05JZ0FSSWdBUklnQVJJZ0FSSWdBVENRSUFDSkF3UWVRa1NJQUVTSUFFU0lBRVNJQUVTSUFGbkJDaEFuSEhpVVNSQUFpUkFBaVJBQWlSQUFpUkFBbUVnUUFFU0JvaThCQW1RQUFtUUFBbVFBQW1RQUFtUWdETUNGQ0RPT1BFb0VpQUJFaUFCRWlBQkVpQUJFaUNCTUJDZ0FBa0RSRjZDQkVpQUJFaUFCRWlBQkVpQUJFakFHWUdnQlloZTlvYXpTL01vRWlBQkVpQUJFaUFCRWlBQkVpQUJFb2hLNE1hTjRPVEVMZEpyY1hCbmtEZ0prQUFKa0FBSmtBQUprQUFKa0FBSi9FZmdSdDlLUWJHZ0FBa0tGdzhtQVJJZ0FSSWdBUklnQVJJZ0FSS3dFNkFBNFhnZ0FSSWdBUklnQVJJZ0FSSWdBUkp3alFBRmlHdW9lU01TSUFFU0lBRVNJQUVTSUFFU0lBRUtFSTRCRWlBQkVpQUJFaUFCRWlBQkVpQUIxd2hRZ0xpR21qY2lBUklnQVJJZ0FSSWdBUklnQVJLZ0FPRVlJQUVTSUFFU0lBRVNJQUVTSUFFU2NJMEFCWWhycUhrakVpQUJFaUFCRWlBQkVpQUJFaUFCQ2hDT0FSSWdBUklnQVJJZ0FSSWdBUklnQWRjSVVJQzRocG8zSWdFU0lBRVNJQUVTSUFFU0lBRVNvQURoR0NBQkVpQUJFaUFCRWlBQkVpQUJFbkNOQUFXSWE2aDVJeElnQVJJZ0FSSWdBUklnQVJJZ0FRb1FqZ0VTSUFFU0lBRVNJQUVTSUFFU0lBSFhDRkNBdUlhYU55SUJFaUFCRWlBQkVpQUJFaUFCRXFBQTRSZ2dBUklnQVJJZ0FSSWdBUklnQVJKd2pRQUZpR3VvZVNNU0lBRVNJQUVTSUFFU0lBRVNJQUVLRUk0QkVpQUJFaUFCRWlBQkVpQUJFaUFCMXdoUWdMaUdtamNpQVJJZ0FSSWdBUklnQVJJZ0FSS2dBT0VZSUFFU0lBRVNJQUVTSUFFU0lBRVNjSTBBQllocnFIa2pFaUFCRWlBQkVpQUJFaUFCRWlBQkNoQ09BUklnQVJJZ0FSSWdBUklnQVJJZ0FkY0lVSUM0aHBvM0lnRVNJQUVTSUFFU0lBRVNJQUVTU0hRQ0pGdnFaUEpjbmd5Q2Z4ZkttRW9LM1pkU1VpZTlJM0lrSEwxOFhmRFAyaU1YNWZMdmY4bTBuYWZNdjJra1FBSWtRQUlrUUFJa1FBSWtRQUl4SjVBb0JBZ0V4bk41MGtzTkZSNDFIczRRTkxYNSs4N0tWQlVpQy9hZkRmcGNua0FDSkVBQ0pFQUNKRUFDSkVBQ0pQQi9BZ2xlZ0x4UzZINFpWZW5oS0Y2T1VBY0FQQ09ONTMrbjNwRUxvVjZDNTVFQUNaQUFDWkFBQ1pBQUNaQkFvaWFRWUFWSW9mdFN5VWdWSG1XeXBRMTdCOE1qMG43cFBoT3FSU01CRWlBQkVpQUJFaUFCRWlBQkVuQk9JRUVLa0VhRkg1Q1J6K2J4NmZXNDh2dmZNbC9EcVhiKzlJditjOVhRT25ycG1tUkxrOXo4ZDVsc2FUUTNKSlgrK3g2NU8rbnRYbWtpTDZUc2xHM21HalFTSUFFU0lBRVNJQUVTSUFFU0lBRm5CQktjQUlING1GS2pnTmVuWDNmMG9vemFjbFRnd1hCcXlCbHBWeXlibFBiaVNZRUlhYjkwdjB6ZGNkTHA1UUllaDZUNHUrLzhmMUo4d0JQMGdHTlhJaExublpqbjlZTTUxOG4xZVF3SmtBQUprQUFKa0FBSmtBQUorQ09Rb0FSSXUrTFoxUFB4Y0xUbjNhVmVpbllxRkdLU3V3RmgwNmRNTHNtcTFiTThEWGtoNFJJaGF4cy80VlhzQkJyR0VDQm93MmdWV0pmVncrUExQSy9mZCsxaDZiUG1VS0RMODNNU0lBRVNJQUVTSUFFU0lBRVNDQXVCQkNOQXltUy9SOVkwS2hvTkNzcm9OcHEzTzhyZjRRVm9xMTZOYktralFxNFFqalZ0NTBtL0UzY2NoMnBhVTJzV01HVjg3UmJPY0t4UUJZalZIb2lQeHZxOGVDWnZSZ0VTbHU4TkwwSUNKRUFDSkVBQ0pFQUNKQkFpZ1FRaFFMQ254NDZXSmFMbGZIanpUS0FVNzd5NmowYkRCUTlDNGZlL0NpaENjQ0txYWtIQTJDM2kvSTB4M2pNa3BnTEVhaE5FQ0VvSGV4b0ZTSWpmRko1R0FpUkFBaVJBQWlSQUFpUVFGZ0lKUW9DczBiQWx6MnBYcUZJMWF2UFJLSkFpaEVwSkZTcmVFOHVSRzFKejFyZU93RTZ0K1lpZ3hLL2R2SGxiSEYzTWRwQ25RRGlHMENvdlFnS240RG1RTE84dFB3V2ZRMUJaU2ZiV0xTaEFndTBSSGs4Q0pFQUNKRUFDSkVBQ0pCQk9BdkZlZ0hnTHZmSWxCQnFwWUppaXdzR2YzZEo3aVdPKzNyd1Y4SUxFcERLVzV6V1JPRjlteWxhL2JZSVFHVlVwYnpSQmhOM2N5MDZOZWk0RmlMUHVoYWNzZi9xNzVNaWw2L0xiWC8vNERHbHpkalVlUlFJa1FBSWtRQUlrUUFJa1lCR0k5d0lFb1Zmd0FsZ0dqMEcya1d1OTluQ2Zzcm1sdHlhUys3T3lPdGxmcTVOK0o0YWNrS1B0eTBRcDFZdHpjWTFRTFJRQll0MXJ2b2FXZWVhblpGY1c5Z3BaRkNDQmV3YUNEaVdZVVFGdDU1bGZERDlmT1RXQnI4WWpTSUFFU0lBRVNJQUVTSUFFN0FUaXRRRHhWbkxYWDBXcWNIdEFBTEpQMlZ3cWFuSkhHVlV4OFlMRVJJQWd4T3lJQ2lLN2VlYUNVSUFFZmdHQUkvN0IrSUw0UVBVMGVMWDhWUmNMZkZVZVFRSWtRQUlrUUFJa1FBSWtBQUx4V29CNHJ2Z0hDbGZDcEhLbjVvRDQybHh3Z1ZhT3FqSFRXUTZJZmZqQUMySXZ6NHRTdU8yVzdBdHBoTVZFZ09DR25tM3hMTE1iVGdHQ3ZKc2JOeUllYzkweFoxNGpKMURzMTkxMU5tWVRmM2d6Q21iNHY0Zk1hVHV4OTh0UHYvNWhtcHYwOWx0OTV1RTRlUjRlUXdJa1FBSWtRQUlrUUFJazhIOEM4VnFBWE9wZVBrcmxLeWY3Y2ZqeWdpQjBxNURES2xpZUE4aHoveEdzbWlQMEtSU0xxUUFKSkRBQ2ZSNm96Y2lOUVBJOXdwTThEVjRDSlA0akI4ZWZlUTQ2aEt5QkdjTGphang4WDdRaUFjaGw2YnYya09QUU9Od2IvZHhXOTRXeGgrZFpiVUt4QWJReFVGZ1Z5alhEUEJQNUF6SGk1eVJBQWlSQUFpUkFBaVJBQXI0SnhGc0JnZ253dkRwUnkrbW1HYlRTVVJsY1RDeVJENExKcVFteHdRN3BtNCtFSEdLRDZ5QVh4VzZldVJkT0IyRk1CY2psN3M5RThmQ0V5d01DVDhLOE9rV2tUUGEwQVI4RlFxU21lcEo4N2M3dU9lamdNWHFsMEFNK3E1TlpONFM0UVhVemY0WjJvaXFhTitIaGVSNkVUYzFaMjBQdTk0QWdlQUFKa0FBSmtBQUprQUFKa0VBMEF2RldnSGptWGdRS3Z3cTI3eEdDODByaCs4MUVGckgveUFQQTVOZlhwTm96OU1sYkdXQW5iWWlKQUVIb0VpYmZkZ3RYRGdoQzF3cis1eEZ3OGh4Z2xuM2tHcStUKzJBSG5mMSs3VFcwYlpRS0ZtOFdqUGl3em9kWVFzNE9qUVJJZ0FSSWdBUklnQVJJd0IwQ3djNEZiNUZlaS8rTCtuZW5nYjd1NHJrUEIwSjArcXc1SEpaR2VkdG9FQmZHcEJwN2EzZ1RJWjc1S0tHMkoxUUI0bXZ5bldiUWlpZ2lJSlFRTEc4OHJpZ0xoRENCQmU2TjBDeDdIZ3g0ZVNzRGpMLzdHblFJZzhNMXdkblhOZjBKRzI5VndCQnFOWFhIU1RNdVVMVU00WEtlKzZaNGVvbkNNb2g0RVJJZ0FSSWdBUklnQVJJZ0FhOEU0cTBBaVQ2UkRvOEFRWGdXTml2MFpiNFMxVDA5TXFFbW9vY2lRT0Q1R0ttN3MzdUdIWG5iRHlWWUFRSWhjRW5EdXV3R2IxT05tVkZEbDNBY3d0bzhkNGozVnRiWTI2QkRXOXN0MlJ0RkxQbmEzOFNiRjhTejN5Q1F5a3paNGpWL3cxc2VVS2doYzN5dmhFN2dGajBWZ3JEbDQxa2x5OTFKNWRpVjYvS1Jqb01oWC8wb2YvMGJzYzZ4OHBXaThuU09lNkxkWk5uaDg3TDAwRGt6N24xWjUyWDdaZGltSTlFK2J2RllGbW45UkZiSmtTYTUvUHpiSHlZZmFNRDZ3L0xuUHpmRU00VFJmdkp2Zi80amR3MVlIdm1uTGE4V2w2TDNwNVlzSTliSXlWOStqL3g3eVN4cFpFUFRZcEgvZjAzM2tkbDM3bGNadVA0SG1hdjVSL0N1Qm1yM2xwT1hvMXpEM283aUgyNlc4c3FrLzlNUG1qLy9wZTMrOGRJMW1mVHRDUm1oejZ2LzY3cVZ6cHJXdE9mUmpLbmt3dlcvVE45MFgzbEFMdXAvVzFiMC9ydGxZUG1INUlrSFVzdXZmK29DaHJMQU1WWjFPVHUzL0dNM3lQZkt6RzRXdHovKy9sZVM5bDltUHZxNzk3TnkyNjIzU09zdnY1ZjN0aDJQY3J6OW5RQm1ZSHF5WTFsenYvenZiWWc4MWpwdXVMTHJwR1BHR25QUFROc21LMys4RUhtY3RSRHo4Smoxc3YvOGJ6TGpoWUpTNzVGTWtuSG9LaGxmTFgrMEV1ajJ4alNhdDF1d2FMYnd3TTlTL1pQdGtSODlraUdsN0dwVlVwYnJlSzQ0L1d0WCtzM3pPM1g5cjM5bDg0bEwwbm41ZnZsV3k0NWIzenY4cnR6ZWQ2blhOdDJoekh0cXpsN0RndmRMdWhSSjVQdWZmNVYrdWdpNDZPQzV5T1BSTjFmMU81Tjc5Rm81ZiszLzR3RGU5UHZ1dWxQdVUyNzJQdlM4VWZjVkIyU3d2Z3ZzOXRaVE9TUEh2ZjN2dUwvVnA0SEdXYk5ISDVBUG55c2d0VDdkSVhQMi9oUjVHV3NCSzZWK3gzL1ZkanRwdjMzTW9pREw2YXUveTRMOVAwdnZOUWVqUExOMWs4SFBQQ1JkUythUStwL3ZrbzkzbnpaL2R2SSt3TUxjb2JhbDVZTnZqa3VMaGQ5SHRobmpyNHRlTDNmYUZISks3LzNCMThjRjQ5aDZCVmk4QnVpNzU2MVZCeVBQdzRMaFBDM2IzMUt2TlY2dm1aZ05mZGpoeWV4U0ttc2F1U3ZKN2ZMRHhXc3k2N3ZUZ2prY3h1L05OSXpsMFpYejZwNWtLV1hQejFlbDNlSzlzdlhVbFp2WnBMRGVPOEVJa0xKVHQ1a3dxWmlhazcxQ3ZHMVdHSzZRTUUrQmdCOUw3RVhoeXdycEQ3NjNuZDB4QVVkU3ZhZTNKbGdCNHZseURKU3M3M2w5YnlMSWM5RHQrdW1xYWFzM3c3TWRiVjgyU2w2THQydEc5NGdkVm8vWUlaL2NQTnZwTDdRcnBtT0s1M3NuOExaT1dOL1VDY1gyMDFkaytRL25qWUN1bER1ZGpObDZUTjdRRnkwTWs2V3kyZStSM3F2Ly8rT0p2LytnRTI3OFVGVEllYTg1cnFDZSsySysrK1N6UFdma3U3TlhJODdWeVNNbW5YYnJvSUpuK0xNUHkzcXQyZ1lQWFdIOS9sUjdLTDFNVVM5WmsvbmZTU2Y5SVVMVk0xaDcvZTkvZFZZeGV2TlI4LzhRS0VNMlJreUk3Q1d2TVduRmo3NWwxcVJramI2UDFoKzdKQ251dUUxcTU4OW9SRmFGajdZSnZwdUIybjI3VHZBZ1lsYitjRUhXSFkzNlhrTmJHMnVKYUV6NFA5eCtRczVxdGJiaW1kTVlvVFpQSi9YUHp3cStrbDlNeGlqRXh3cnRKMVNOdzRRdWJiSTd6TVFjL1ZwaTRtWWppQjdQZExlc2ExSk1ydi85ajA3UXprcTY1RW1rcW5MZm9lKzJZaDl1TW16dGs3bis2dzVMcjlWUnY3K2JtaFhYNTB3dDNnVElCdVg4MU9RdFVSNWpZUGtIcFh1cG5PWnZvUWdRakNONHZDMUI1MCtBbEZJR0Q5MlR3dHdMK1lsRjlIbmYwY256cjMvOGJmNDI2ZHVUOHRIekJVMGY1UnU3WHZhcGdJRk4xNy9WTDVoSlNtdmJNVmJjTUh5bnl1bDNxcDh5aHQyYi9BNHpuc0ExajRxcm4zLzcwM3p2L0FtUTJiVUxtKy9iVjhjdnlWNmQvRCtyMzl2TXFaSktuZGs3NUxQdkl5YjFsamg4WHlmRnJSYjlmOUxzVFlEZ2Q4cnlWRnNNVnV2M1o5T0pxTjlmYTBLTmNYOWN6N0VNYlo2Z2YzTXl6b0lSSUJDMy90cHZqVmw4VHpmb095VlB1aFR5WXQ2TWNsd1hVNHBPMkJSRmdLT3RQN1lySTluVEpKTkZLa1NyL1NkRU1ja005RDQ0ZiszUGFBS2tkZEdzTXFaS1hqbDA0WnFzK3ZHOFBLYlhlVXpIM1h2Ympxa2dqM2gvV3J4KzE3NTk2TjExMnE2SWhWUFdvSVlBQUNBQVNVUkJWQkszQlVqZEFobk5XSWMxbUxzcmN1ejcrditaMzUxeDQ2dGdmbi93TytUTndCWHZhMTloOTdIZHdFd3A3NVM5clorS012ZkJmQkR2ajlOWEl5cDB4bmVMdHdMRWM2WFNUUUhpYmJYY3N4SldxRGtwM25aWEQzYVFZWUlERDRXM0RSV0RGU0NlWVUyQlBEdWUzZ1Z2T1JhZWd5NVFDSlJuQ0pnM3RwNDVPSjZoWjU0TXJSZXc5ZmRRK3l2WXZ1SHhFUVF5NktycHlVN2xaSmZtNER5cGsxUk1RR0VMWHk0aVZSNU1iMVpIblV5RUxKNzFkY0k3WFZlazY4N2VLYk5VaFBpeXZhMUxTYW83YnplYmxmNzluNWRsV1lQSHBid0ttZlR2ckRTcjk1WWQxaFZISElOSm1hZGhGWE9RcnViRDg0QlZma3cyTExNbUpUMTF4ZkZ0WFhtRTVWUnZDMVl3TWZtdWFSTUl2dHJ0N1JyMk5sZ1RpMUtUdHBoSklHeG9oVHpTcVVSMmVlbXovMDhDM1JodjIxdVUwQlhZNURyQldTOW4vaXRkM2FWRURubW53a09tR0FWV2I5ZXIrTUJFQ3dzTjhCN0FlcWc0R0tBaXdmSmVXTStNeVJJbWNMaWVaUkJ2V0lqQVp6b25qT0lCZ2Jmc3p0dHVsY3pEVitzcThQOS9tTkYvbVZJbWxXUjMzQnFTQU1HOVd5emNvNnZPSjB3ei9BbVFuMzc5TTdLdEUzVjF2YW11c3NNell2KzdsYU1ITWRKc3dYZnlnRTdZTVNIZGV1cXlvQi9kTW0vaW9oYkV1NG9LTE5yZ2ZleFBnRUM4ckdwVTFIZ3JYMUhQRGd5Q0VvVllNR0hQUEh5TitkNVlBdVFmL2UrQzQ3Nks5R2g1RXlENHJTcXZIcWRBNW0zYzI4OXhNczZDRlNEKzJ1L3RlMXJsd1hTeXFONWowWVRMRXpyK3Q3ejJwQnpXaFJPTTV3eERWa1hMa2ZUMVBzaWwzeSs3QitSdWZZZmgvWWtGUVFoNGVHeHUwKy9GUXIzdnM3blNHZDdmNllxNTNXTTBTeWYxZGVmc05MamNGaUQyaFYyTUw1aTFLYlMzLy9lM2VCaG9qRGo5L0lXOEdXVE9TNDhLK2hmdjZRbnFDYnFnbmpvc2NsZ1JKVmdjTFRMKy80c1FUcThkanVQZ3FYKy9XcjVvbDdLL2s4SnhuNXQ1alhnclFEd24wazVLOERvQkhXaXpRa3p1VTJ0ZWhhZkZsZ2ZFU1p2dHgrQ0ZCUEhocTNSc3NBTEVNL2s4MEU3eDNqWkQ5UFFZZVN2RDYyLzNlVSt2bEtkWThMeW5QNCtLblpWbk83eDV0b0xseitPZEVXaWdxNzVZRWNiS0tGWVlMYXVZNjE1cDgwUTJFODZ4VFYzTmdWWmlyZk9jQ3BBZjJwV1dOSm9MbEd2MHVzalZTVXlla2IrMFdWZGJmOU53S2N2OENSQk10ckJpREVHQnNLS2NvOWFxR0lsWWtmVWxIczUyZWRwNEt4N1J5VUdnZG9jaVFOS290L0RucnVWbGlZWS8yY044blBWSWFFZGgxZnU0aGpWNWVpWHhuY1NFZlk2dWhzTzc5VlBucDJYMjkyZmtKUldJbHQyVjVEWTVwKzNkb3R6TFR0MGF5UTJydy9DT3dQdGd2Y2ZnbVVMNENrTHY0RVd3aDJBdDFiOVYxaFg0RGxva3hDcFFnWlhncjVzL2FVS2U0T0VLMWdNQ3NYRGd3bTltWW8yeDhvdDZNbUlxUVBEY0c1c1ZreUlaNzFZQnZFYkZZZzdwcU05VlNVT3Y4QXh1bWJmdkZMeFdGN3FWMTlDVGlFbXF2Ky9kZTFYeVNhdWlXU1N2Q25QTGs0TzI5eStYVzk0cW5VdktUTjVxOW9XQ0FJR25NdXZkeWRTTGR6RXl4Q3kyQkVoNlhkUndNczZDRVNDQjJ1L3JlL3FOamoyRWVLWlhrV0V0ZEl4VXp5dTRQYWVlanlXNjZORlVQYTZULzh0UERQUSs4QlFnbG1EMGZIL2l1NEcrczRTa0pVQjJxemNQNFg3d1NNS3I1TFlBaVlzZWtIMXRucEk4OTZhSTlodUV2c0FpRlJaV3dMMk92ck0rOWJPb0ZWdmZXd3FRNkdUalRCSjZiT1dBZUF2NXNXUHd0VnJ2dVVvZjZxYUdvWHBBY0QvRVZFOE5zQWRIc0FJa1dMRUFWcDduZUhvamdyMm1aM1V2VHdIaStiazNkNzYzbHdTRWpkMG9RR0xyVlJyOXVyMTBvdEpYSnl4d2NhL1E4QVZmWmsyRU1BbTBHMWJJLzNOZ21EODdGU0R0TlFScmhFNEV6dWhLK1ppdFI4MHFybjNWM0g0UFh3TGt3WHVTeTRFM1NrczNqVkhIOXc0L1pHK3VQQ2dETjBSNE83eE5TaENHZFZIM0xVSklXR21kb0FXYWNGalhRR2pYV0ExSnN3d1RZWGhjZkswRUgrdFFWaWM4LzZvZ2lzb3J0bm9XNFZkcm16eGh3cVVRTnVYTnJHZnByY2RZWVQvV2NRZVZZM0wxVUR5Z3ErYldjUWkvZzloQUtCNFl3eUFtTGwvL1c4NWQrME9lMTcyQzdBSUVzZlRaTkt3RlhwQmltdXNCZ3plbytXT1pwYWZlRSsvbVVBUklsWSsva2FVNlVSeTI4WWpKandpSEFJRlErckwrWXpKTzgxVVFlb1hWOENMajNhM0M1MDFjUEt3VHNiMDZqakhXMmloL2Z3SUVuNkdReDUzOWxrYjVEcjVjSUpOOC9HSkJlVlc5T3hQVnl3TUJnb1dscjNVaG9WdXBIRkpWZVg2cE9TTGVCQWkrRjhpTHNPelBmLzcxR21aaWpYdE1DaEhpWjlrcHpjRkMyQnZDRmdPTnMyQUVTS0QyK3hJZzB6VGZwNkh1UlpWRngvVUpiUnZ5M1U2b1VFZFlYK1VaMzhncDlWNGdwci9DUjFIemZweDZRQ3dPbnFGN0NOdkJ0ZkdkQUUvcnVCZlU2enBGMndUdll6SDExajZYeUhOQWN1ajc0Z2YxUGlKc05OUFExWkU1TS9iM1Y4dkhzOGk0cXZtaWVQcGk2ejNxN2JvTXdZcE9KYzRJRU0rWS8wQ2hRY0VNSEV4bzU5Y3RFbTNIZEgraUlseUN5UE02V00xSGNyWXZRNGlUbGNUcDVCbHZoZ0R4OUpyRXRnQnh3c0hiTWZZVjExQ3Z3Zk9jRVVENEVpWWwxc1F3bWVaZDNLMHIrSmJCMDNoZFBReStrdERUYWJpVVBiSFZxUURCOVY4dGt0bkUvV0xGRkNKbXhxNVRadEtGeWIzZGZBa1FTendocHZxZ3hnbERnR0RDaExBSG1EVXBHYm41cUU0MGoybGk0MjM2ckRubEpjMEQ4Vnl4REJTQzVVblRpdS8ySlVDd2FwZGR2UTlwQjY5MDFoRXhQTW9LTi9HWFEyVWQwMGJqMHNjcUQ3dHQxWkFVVEg1VERWd1J5ZTExOVlvOXBlOWdKUGpuVU04U251Zkg5bVZNMkZKVkRjOURucEJkZ0NDeGY3WG0reUJjd1FxUFJVZ204a0srMFVscXFBSUVDZGlMVlN4Z1ZUbnZtQTNTcGxoV1UyVERXeEs2a3hBczY3bS8xVDVDN2hFTUUwTzAzMDJ6eElVVlduaVBlai9neFN1bnovbXNlbVBnWmZJblFDQUdzNmRPTHZmcWQ5QnU2QmZ3NnFpZXFCRTY5aTBCVWxNOThvZmFscEZMdi84bEJUVDUvNXZtSlFJbW9kdVR5dTMzOEpXRWp0K1lGUG85UStoVG9IRVdyQUR4MTM1ZkFtUjR4VHdtc1JudkJIZ2ZudElFWitSQU5mOWlqOGxWZVY4bnRuZ1BaZFRKN3puTjc3RE1xUUN4d2kzQmM0L200RmlHOStpMW5oVWppeDNZM3hOUGFwNFl3aUlicURCQnlGWmlUa0ovVXNPc05tcE8yU1l0dmxCaW92ZndSK1RsTEd2NHVQays0SHZocGlHZkRORUFXRXp0cm5rcUJmNUxRaCtraTF6d0tLSk44TkRHZDR1M0lWamgySDBjUWdNZDdDM0pDSjZRZHNXemEySnN5b2pOQ2pWaDFkL08yWjY3c2lQT0d4NkpZQzJVS2xqQjNJTUN4RGV0UU9GbHdYRG1zZjRKV01sL1dBMUV5SkJuNktPMWltb2xvV09pWnJmRmgzNk96QnZCMzRNUklEZytpUVpNSXpUbmRVM2tSSkw3S3AzQWVzYWcreElnMzJzZVNYTDFhS0JLRWd6NUlNMTBNbUdGcEhoV3diTGFqZFZsck83YmkxUUZFaUNmNkVybTdQK1NlbkVkNUp4Z1F1UFBBNEtZWmt6YzNiQ3l1akhwNmtiK1BTQ2x0TXJNZWo4cjA4alJRTjZBeFExSi9TZ3dnQW5TRTdwYWk1d0RlTXZ1MDNDV21iVUttK1JvdXdEQitHazhmN2VjMFRBdmVLSlFZR0N6Vmlpcm9tTUxZU2VEMUpzU2lnY0VBZ1FoR3QrOVhzcE02T0IxQzRjQWVUSHZmVEw3cGNLbU1sbytyZmJsZHRFeWI2SWVsZFRnd2JLOFdQNEV5Q3IxZ0VBZyt2S0FRQ2dpejhVU0lQaGVXWlArdGpyK216eWFPWm9BUWNVemVDNHN3MklBa3RBOXpScjN5Syt5Y29sd0RMemk2Q3NuNHl4WUFlS3YvWUU4SUZtMVFoNFN2N0dTamhYMWtqclpQYXVWOXpDR1VZbkw2WUtFWndoV1QvVWc5OVB2aEM4UHlJeGRwMDJ5dC8wOXNVMXpqYkJZa2tROWhWMlhIekRlcXNSYUJjdnVBYmwvMk9vb25qeHJ6TFhTL25wUCt3MEZEMTVUNGVpV0ZkUjNGbktGVUF6bHFuNFBrSkIvK09KdkdnNldRaERLbGxMRHcxQzVydWlFalZIRXAxdnRDK2Q5NHEwQThiYjdPRGFVZzBjZ2tIbm1GRUJnWU1NK2Yza0kvcTRaazEzWlBhK2JFQVdJcDJjaHRqMGd5SU1KRklybXJUOVJoZVZtVmJ3SU5HWVQydWRXRExOVlFlcCtEUjBvb0MvZWtoclNBM0ZpRnlEK3F2RllYSndJRUZUN1FZSW13aUIyL1ZjcEMrY3YwVlZiVThWSEo4SDJjcnJlQkloVk50VmJmL1RUNU1yZW1zUnJUVW9RVC8rNVZvVXFuL01lRFFmS0l2WG03SkpQdEx5ajNRSUpFSHNpdS8wOGJ3SUVLOW5JTTBFK0FjSmQzRERMTzJGVkViUHVpUVJydkdlWHFGRGNkUHl5bk81Y3pzUlJJM1RHTW9SZW5lLzZqSWFsWFpKeVdzWFE0b1p5b1FoN3dyT2d0REJXNW85Zi9sMmUwNVgwTlNwMmtDUnFGeUJyZEhIb0dRM2xReittMS9LdTYzVXkya0RMd3lJSnZJZU9KYlRERWlEN2RRS0dDbVAya0w3aVdoWjRrd29XckM3MlVBSGpPZmwrVjh0Z3R0R3l6YWpZQmM5RlREMGdZSU53SEcvVi9Oem9NMHZVbzFnQkRDRjlDQWRDMFFmTC9BbVE4ZXBwd25pMk9Gam45RlhPdmJRMHJ6VXB0Z3NRRkE3NHRrVkp5YXpKMTVoVUpiMzl0aWhsZU1PUmhKNVIrOTdKT0t1am5zaVp0UW9aVDhDTS8wcmg0aGxRaktLQ3JqcERXS0VvaHBQMit4SWd5Qkd6dkVRM3RKTGVhUlhIOExoNkdzU3lrNUJNVHdGaVBZT25nTEFXQkt3d05NLzN4UE5hb2Uzek9vK2Fjc3NvbVoxWUJRajZ3Y29CZ2NkMW5DMFBFWjhoQndTZXlweWFBK0sybDlJcTd4M29YV0NKekVESHhlWFA0NjBBQVZUUFNsaE93ckM4YlZabmRWQ29LK0NlNFdDbzdGTW94TjIxNDVvQWlWWnRURjNkZ1lSYW9PVHUyQllnM04wOExyOXlJdHFHS2k2SVZVYlZwTWMwQnY3S2YrRlAxdXB3YkFnUVRQeU9hNDdFc3NQbnBKS3VqbHRteFd0akpjeGUzdENiQUJtZ29WdVkxT0pIeXo1aFEybmY2NXJBanJBV3owa0pKdHFITlFUbER3M1RRdGlXVmZFTDl3K25BQm1qRTJYc2IvS3lKaEc3VmNZU3p3Q1BFS3BOUGFoNU9sWTRDWkxHaDJvWWlyWFhncFY4L2NpNERTWnNEV2FWUkxaQ1pqeTVUYTVSUUdwcXZnZTgwZFl6NGYxWVRBV0RYWUJZazFmc1NUSHQrVWRNU0NyS01UZlhDbGJXWXBNbFFPYnA1QXNKN2dqVnNzUm1aNjBjTmtSelJsNlp1MXMrMG5BOHo4azNFclF4RnRMb3YyRUpRWUFFRXZYK0JNZ3pLcWlYTnl3YVdib2FUTkJIdTFxVk1wNUZleFVzdTdDdzUrcWQxYXBoOW4xQXdpRkEwQTRuNHd3cnpEdDE3NVh4T3VscytWOTVZSHhIVVdVTm9VbVc5OUF1UUhCdGIrMzNKa0NzNmtvVHRIb2F4cURGQzNrL0tNMXRXUk90bEZaUkYwUlF2YzE2N3pnTndVTEJpUk1keThtUnk5YzBwMk96S1o2QlBCTjREYXMvbENGYUZTeDd0VHo3SENNeEN4QjdGU3g0L3RCZkVPTjR2NkFLRmhZYjhQL3d2RnI3VXJueHkrcFowZFBYUGJIUWltcU84ZG5pdFFEeFRQeStyREdtMlVldTB4K2cvNWZTdEhkT29FMEdzZnFOSDZaZ3pGdlZwL2FveHJMNWFEQ1hpVHcycmdtUWFOWEdzS0dXbjBSM3o0UndQRmhNcTJBRlNrTEhQUUtKbnBBNmd5ZkZLZ0hMeFkxNjYvUDIvV1JXcGwvTWw5SHNKNERrZE96allhM1d2cWtiMXRrTmlaM1dSbDc0dXhNUENJNmJwR0VQK09GSERPMVh1dnFZWFN2Vk5OSTlFRFpxS1Z2UGZTUzhDUkQ4RGUzMGZQR1AxaCtzTnpRL0FONCtiR2FGWkZpNzl3THgzaE9xNTQrTWo3ZWVKWkFBd1FaMTlra0x6cHVwWGhTczhHTWZFRXlpSUlTd2lSWkN5YjdRVGREZ0tYRFRudFZWWThUZUk5UUVIaDlzVElkUUFlU3ZvZW9PZnJ4UmduU3R4c0JqOWR2YUs2U1c5alZXM2gvL1lHT1VmVUFzYnRiRURSczVwbjlubFpsaytSTWdLVFVIQUZYQUVMcGdMU1o1Q2hCNE94RDdqWGY5ckQybmRRK01KQnIrOTRBSnIwSTh2WlYzNURsQlIrZ1ZmbTlnaVVXQVlEeDVmdS93UGRtZy84eFZJVmRUVjlNUnVvZytySnc3dmFrWVZPL3ovNHRmendrODJFRUFJbUxBVTRBYzBmNllwS0V1ZHJQdVpmOWJvREs4VHNZWnJnZHZHU2IvOE1vaHZBV2lGRkVWVm80R2puSFNma3VBNEhzS2IwYSs5SGRKYlIzWCtDNWdYS09zdC9YTzhTemZEMzdnYU0rZmNpcEEwRDVyVE83VjhEWGNIMG40ZUEvWU55djB4cXV3UHVjM3Vyb1ByMVJpRmlCZ0NHOTcvM0lQeWkxUWJ6NE1udXo2T3E3ZDJ1RDF6MTdQeWgyb3FSekFFRGFaUkwxMThkbml0UUR4TnZudnErVTcrNnp4WG8zRnlTYURnZmFQOE94c1QrOEhrbWN4T2ZFbGdnSU5scmdtUUlLdDd1Vmt6NDV3ZTBEQTFMTmNNRUxxUWduREN0US8vRHk4Qkdyci9nUFl5VGVmSnRsaGo0ZHZ0R0xPVU4zc0Q2VmJZYjZTMERFNUtXbmJPOEdwQUlGNHdPYWFFQ0VvazRrVis4VmFtUWRoUC9aa1VOemJVNEJZcFYzdEd5VmFOS3p5bDloOERtVmtQUVVJZmsrUVM1QkJ3MFJRc3RjcUhCRklnSGlqamR3VHJOSlpPNkVqQVI0bGdLZG8zUDJJelVjaXkzNkd0NmY4WHcwaXBLLytrQ05aTW9McHo0YXBmVjhWVFA2Ui9GOVUvdzFSZ2J5S3JscGR5anJHY3pVWnpCQzZBZ0ZtaFc3NUV5Qm80UnpOcmNDbWpGaFZSb0VCVHdHQ1k5QlhpSi9IN3NJUVJCQzZYYlFkbGtmTDIrby94czBlN2IrSE5NOGdzUWdRY1BJMGEwZHRlRHA2bDhtdGxieDBKM1FWY2Z2Ty95b0RkQlhabmxEdmJRS1AvWEQydGlrbGw3U2lXYUNkMEQxMzcwWmJBZ2tRSEJOb25PRVlpRlY4ZitBdFFHZ1VFbnFINkhmWFhtN1ZTZnZ0K1Y0WWI5Z0pIWXNBS0lPTDd3RjJqRWNvSWJ4dDl2TGJhQU1xNDUzWDBzZUltTENxdHdValFIQU5lUDJ3OTA5dVRWckd2U2R0UDZtN3gvOFFtZFBnaTVjbGloSzdBQUhERXZxK0FFTnNKb3JGQzFTbVErN2Q5ak5YakVCRU9KYWJJdVNNaHF2ZXA3OFRnUXhlTTNqdDQ3UEZhd0VDOEo0Q0FIL3psUXZpUklCNDIyVFFWd2VYMFJXaU5ib2hrOTJjaElINUd6Q3hMVUNDM1ZqUW0wZkRWNmdhQk9HT2xpV2o3TXp1clRwT2JBZ1F6NzdGQkMrNzF0cjNWeUVNaWM5bURBVW9YUnlmditCc093bVFBQW1RQUFtUVFQQUU0RkZicmtVWElFSkdhRW4wamxvZ0k3WU5vV0h2VnM2bllhMitSUWpLVG1PM2UzK0ZrV0s3bmVHNGZyd1hJTjY4SUhDdlE0UjRlaUU4ZDcvMkJPaHJrMEZ2b09HdVhkTzRxRTYySStLQ1lUSDFmdUFhc1MxQXZFM1V5MDdaNG5QalFyVEpNeVlSazNxVUJrWVNwV1dZekkrc2xEZUsrTUJuM2p4S3NTRkF2TzNmNHF1NEFNWU1kbUZGNkEyTTNwSnd2RXA0RFJJZ0FSSWdBUkpJV0FRZ1F1YS9YTVJVZG9OWGx4WStBdkZlZ0FDRjV5N2srQnNTa2N0TzJSWk5oSGlHNnRoUitxdGxiejhPb2dQaUF5SWt5dmt4eVAyd3JoUGJBc1NiWUxNL2c3ZU5GcjE1UWF4eklFWXcrZmRtdm5qR2hnREIvUkZhZytReFQwTWJkMnJWRHhnMkxBTURUNk1JQ2Q5TGhWY2lBUklnQVJJZ0FSSWdBWDhFRW9RQU1ZSkR5OTRWOUJBRTNrUUlKcDhJMjhKT3JvRW0zdDdBUVhSTXFWa2dtdmdJZGVkenozdkV0Z0RCL1R6ek5KeHc4TnluSWREWHlsK0p5ZGdTSUdpVHQ1QzhtTFExMExuOG5BUklnQVJJZ0FSSWdBUklJRGdDQ1VhQVFGakF1MkhmVFJrb0VJWlZjOVlPM1VndzZxWkdXTlZIRHNkUjNkZ0xKUUNkN1ArQTZoMVR0RFNrUGV3SzkwQVNXUmt2M3BiZ3VpTGlhRGNFaUQ4UjRzMERZajBIUXRnZ1hySjY4U0JZeHlBTURRbDRvN1ljOWZuNHNTbEFjRk9JSllTYStXc25qa01aTzdTVk9TQ2hqRlNlUXdJa1FBSWtRQUlrUUFLaEVVZ3dBZ1NQRCs4RUp2Q2VJZ1NmWVZkeWxNZDFJalE4VVVLb0lHY0Fvc1hUd2lrK3JNbHpOcTBVWWhrRVVteE5rQ0hhSUNwUy8xZmYzZ2dnRldxQjl2bkFPUkJqOWxDbWlOM2lMNWlrS0grSjM3Z0h4SUhkQW0wQWlQdFkrUm80enlrVHRMT003dFRzR1NxSHRtSTh4UGNFcnRDKzhqeUxCRWlBQkVpQUJFaUFCRzR1Z1FRbFFBS0pFRXVJWU9LNVFFdmwrU3VWaTBrdndyU3N5YmEzYmdxMytMaTVRNEYzSndFU0lBRVNJQUVTSUFFU0lJSFlKNURnQkFpUUlVUUs1V1k5OHp3OGNWb3IvVWhReHFwOXR0UkpOVWs1dVVtcTlsdzE5endYT1E3dGx1d0xlYitQMk85YTNvRUVTSUFFU0lBRVNJQUVTSUFFNGg2QkJDbEFMTXp0aW1lVFBycFprcmVRckZDN0Fqa09qZWJ2TmlFOE5CSWdBUklnQVJJZ0FSSWdBUklnZ2VBSUpHZ0JZbmxEMmhYUHFpVmFzOGRJaUVCNGpOcHlSRVp0UGthdlIzQmpqRWVUQUFtUUFBbVFBQW1RQUFtUVFDU0JCQzlBckNkRldCWVNwMnZrU1MvUGFYS3lVME41M2ZtYUw0SkVhUm9Ka0FBSmtBQUprQUFKa0FBSmtFRE1DQ1FhQWVLSkNaV3RDdDJYTW5JVHZXeXBrMnVGckd2bXNLT1hmemZWc2p4TDk4WU1OYzhtQVJJZ0FSSWdBUklnQVJJZ0FSSkl0QUtFWFU4Q0pFQUNKRUFDSkVBQ0pFQUNKT0ErQVFvUTk1bnpqaVJBQWlSQUFpUkFBaVJBQWlTUWFBbFFnQ1RhcnVlRGt3QUprQUFKa0FBSmtBQUprSUQ3QkNoQTNHZk9PNUlBQ1pBQUNaQUFDWkFBQ1pCQW9pVkFBWkpvdTU0UFRnSWtRQUlrUUFJa1FBSWtRQUx1RTZBQWNaODU3MGdDSkVBQ0pFQUNKRUFDSkVBQ2laWUFCVWlpN1hvK09BbVFBQW1RQUFtUUFBbVFBQW00VDRBQ3hIM212Q01Ka0FBSmtBQUprQUFKa0FBSkpGb0NGQ0NKdHV2NTRDUkFBaVJBQWlSQUFpUkFBaVRnUGdFS0VQZVo4NDRrUUFJa1FBSWtRQUlrUUFJa2tHZ0pVSUFrMnE3bmc1TUFDWkFBQ1pBQUNaQUFDWkNBK3dRb1FOeG56anVTQUFtUUFBbVFBQW1RQUFtUVFLSWxRQUdTYUx1ZUQwNENKRUFDSkVBQ0pFQUNKRUFDN2hPZ0FIR2ZPZTlJQWlSQUFpUkFBaVJBQWlSQUFvbVdBQVZJb3UxNlBqZ0prQUFKa0FBSmtBQUprQUFKdUUrQUFzUjk1cndqQ1pBQUNaQUFDWkFBQ1pBQUNTUmFBaFFnaWJicitlQWtRQUlrUUFJa1FBSWtRQUlrNEQ0QkNoRDNtZk9PSkVBQ0pFQUNKRUFDSkVBQ0pKQm9DVkNBSk5xdTU0T1RBQW1RQUFtUUFBbVFBQW1RZ1BzRUtFRGNaODQ3a2dBSmtBQUprQUFKa0FBSmtFQ2lKVUFCa21pN25nOU9BaVJBQWlSQUFpUkFBaVJBQXU0VG9BQnhuem52U0FJa1FBSWtRQUlrUUFJa1FBS0psZ0FGU0tMdGVqNDRDWkFBQ1pBQUNaQUFDWkFBQ2JoUElHZ0JrcVp3N1J2dU41TjNKQUVTSUFFU0lBRVNJQUVTSUFFU1NBZ0VMbjc3YVZDUGNRc0ZTRkM4ZURBSmtBQUprQUFKa0FBSmtBQUprSUNOQUFVSWh3TUprQUFKa0FBSmtBQUprQUFKa0lCckJDaEFYRVBORzVFQUNaQUFDWkFBQ1pBQUNaQUFDVkNBY0F5UUFBbVFBQW1RQUFtUUFBbVFBQW00Um9BQ3hEWFV2QkVKa0FBSmtBQUprQUFKa0FBSmtBQUZDTWNBQ1pBQUNaQUFDWkFBQ1pBQUNaQ0Fhd1FvUUZ4RHpSdVJBQW1RQUFtUUFBbVFBQW1RQUFsUWdIQU1rQUFKa0FBSmtBQUprQUFKa0FBSnVFYUFBc1ExMUx3UkNaQUFDWkFBQ1pBQUNaQUFDWkFBQlFqSEFBbVFBQW1RQUFtUUFBbVFBQW1RZ0dzRUtFQmNRODBia1FBSmtBQUprQUFKa0FBSmtBQUpVSUJ3REpBQUNaQUFDWkFBQ1pBQUNaQUFDYmhHZ0FMRU5kUzhFUW1RQUFtUUFBbVFBQW1RQUFtUUFBVUl4d0FKa0FBSmtBQUprQUFKa0FBSmtJQnJCQ2hBWEVQTkc1RUFDWkFBQ1pBQUNaQUFDWkFBQ1ZDQWNBeVFBQW1RQUFtUUFBbVFBQW1RQUFtNFJvQUN4RFhVdkJFSmtBQUprQUFKa0FBSmtBQUprQUFGQ01jQUNaQUFDWkFBQ1pBQUNaQUFDWkNBYXdRb1FGeER6UnVSQUFtUUFBbVFBQW1RQUFtUUFBbFFnSEFNa0FBSmtBQUprQUFKa0FBSmtBQUp1RWFBQXNRMTFMd1JDWkFBQ1pBQUNaQUFDWkFBQ1pBQUJRakhBQW1RQUFtUUFBbVFBQW1RQUFtUWdHc0VLRUJjUTgwYmtRQUprQUFKa0FBSmtBQUprQUFKVUlCd0RKQUFDWkFBQ1pBQUNaQUFDWkFBQ2JoR2dBTEVOZFM4RVFtUUFBbVFBQW1RQUFtUUFBbVFBQVVJeHdBSmtBQUprQUFKa0FBSmtBQUprSUJyQkNoQVhFUE5HNUVBQ1pBQUNaQUFDWkFBQ1pBQUNWQ0FjQXlRQUFtUUFBbVFBQW1RQUFtUUFBbTRSb0FDeERYVXZCRUprQUFKa0FBSmtBQUprQUFKa0FBRkNNY0FDWkFBQ1pBQUNaQUFDWkFBQ1pDQWF3UW9RRnhEelJ1UkFBbVFBQW1RQUFtUUFBbVFBQWxRZ0hBTWtBQUprQUFKa0FBSmtBQUprQUFKdUVhQUFzUTExTHdSQ1pBQUNaQUFDWkFBQ1pBQUNaQUFCUWpIQUFtUUFBbVFBQW1RQUFtUUFBbVFnR3NFS0VCY1E4MGJrUUFKa0FBSmtBQUprQUFKa0FBSlVJQndESkFBQ1pBQUNaQUFDWkFBQ1pBQUNiaEdnQUxFTmRTOEVRbVFBQW1RQUFtUUFBbVFBQW1RQUFVSXh3QUprQUFKa0FBSmtBQUprQUFKa0lCckJDaEFYRVBORzVFQUNaQUFDWkFBQ1pBQUNaQUFDVkNBY0F5UUFBbVFBQW1RQUFtUUFBbVFBQW00Um9BQ3hEWFV2QkVKa0FBSmtBQUprQUFKa0FBSmtBQUZDTWNBQ1pBQUNaQUFDWkFBQ1pBQUNaQ0Fhd1FvUUZ4RHpSdVJBQW1RQUFtUUFBbVFBQW1RQUFsUWdIQU1rQUFKa0FBSmtBQUprQUFKa0FBSnVFYUFBc1ExMUx3UkNaQUFDWkFBQ1pBQUNaQUFDWkFBQlFqSEFBbVFBQW1RQUFtUUFBbVFBQW1RZ0dzRUtFQmNRODBia1FBSmtBQUprQUFKa0FBSmtBQUpVSUJ3REpBQUNaQUFDWkFBQ1pBQUNaQUFDYmhHZ0FMRU5kUzhFUW1RQUFtUUFBbVFBQW1RQUFtUUFBVUl4d0FKa0FBSmtBQUprQUFKa0FBSmtJQnJCQ2hBWEVQTkc1RUFDWkFBQ1pBQUNaQUFDWkFBQ1ZDQWNBeVFBQW1RQUFtUUFBbVFBQW1RQUFtNFJvQUN4RFhVdkJFSmtBQUprQUFKa0FBSmtBQUprQUFGQ01jQUNaQUFDWkFBQ1pBQUNaQUFDWkNBYXdRb1FGeER6UnVSQUFtUUFBbVFBQW1RQUFtUUFBbFFnSEFNa0FBSmtBQUprQUFKa0FBSmtBQUp1RWFBQXNRMTFMd1JDWkFBQ1pBQUNaQUFDWkFBQ1pBQUJRakhBQW1RQUFtUUFBbVFBQW1RQUFtUWdHc0VLRUJjUTgwYmtRQUprQUFKa0FBSmtBQUprQUFKVUlCd0RKQUFDWkFBQ1pBQUNaQUFDWkFBQ2JoR2dBTEVOZFM4RVFtUUFBbVFBQW1RQUFtUUFBbVFBQVVJeHdBSmtBQUprQUFKa0FBSmtBQUprSUJyQkNoQVhFUE5HNUVBQ1pBQUNaQUFDWkFBQ1pBQUNWQ0FjQXlRQUFtUUFBbVFBQW1RQUFtUUFBbTRSb0FDeERYVXZCRUprQUFKa0FBSmtBQUprQUFKa0FBRkNNY0FDWkFBQ1pBQUNaQUFDWkFBQ1pDQWF3UW9RRnhEelJ1UkFBbVFBQW1RQUFtUUFBbVFBQWxRZ0hBTWtBQUprQUFKa0FBSmtBQUprQUFKdUVhQUFzUTExTHdSQ1pBQUNaQUFDWkFBQ1pBQUNaQUFCUWpIQUFtUUFBbVFBQW1RQUFtUUFBbVFnR3NFS0VCY1E4MGJrUUFKa0FBSmtBQUprQUFKa0FBSlVJQndESkFBQ1pBQUNaQUFDWkFBQ1pBQUNiaEdnQUxFTmRTOEVRbVFBQW1RQUFtUUFBbVFBQW1RQUFVSXh3QUprQUFKa0FBSmtBQUprQUFKa0lCckJDaEFYRVBORzVHQWZ3S2xpeGFRZWVQZk1nZU5uYjVRZW8yY1FXUWtFSFlDNmUrNVcvYXZtR0N1dTN6RHQxS243VHRodndjdjZKM0FtNjFla283Tm5qY2ZnanY0MDBpQUJFZ2dNUktnQUVtTXZjNW5qcE1FS0VEaVpMY2t1RVpSZ055OExxVUF1WG5zZVdjU0lJRzRSWUFDSkc3MUIxc1RSd2pNR05GSktwZDUzSEZycnYzK2gxeis1VGM1ZCtHS2JQLytzR3pkZVVDK1hMMU44SGVuUmdIaWxGVDhQKzdwSnd2SzdMRTlZdjFCL3Zqekw4bFlySDZVK3lSbUFWSW9idzVaUFdPUTRURjMyU1pwMW4xMGpQc2diZXFVY25qMVJIT2RmVCtjSWxIRHNnQUFJQUJKUkVGVWtCSzFPdm04cGxzQ0pHL3VMRExsbmZhQ3ZoNzQvbWZ5NGF5bE1YNU9Yb0FFU0lBRXdrbUFBaVNjTkhtdEJFTWdXQUhpN2NHdlhQMU5wc3haSVVNLy9GeXUvLzVuUURZVUlBRVJKWmdES0VCdVRsZkdOd0ZTdHRnalVyVGdRd2JXckVYcjVOaXBueDJCbXpLa3ZUeFh2cGc1OXUrLy81R3NUelZ5OUE1eWRQRkVjTkFkdDk4bUhacEdoTXFkL09tOGZMeGdUU0o0YWo0aUNiaExnQUxFWGQ2OFd6d2hZQmNnTSthdmtiUG5ML2x0ZVpJa2QwanFWQ2trWjVhTVVqaHZUa21XTkVuazhZZU9ucGJHWFVmSzNrUEgvVjZEQWlTZURJNHdORFByL2VubHhVb2xIVitwaW5yak1IbTJKcUkvSFAvSjBibi8vUE9QakpxeUlNcXg5SURFSHc5SXYvYjFwWFdEYXFiL2FyWjRXOVp0Kzg1UnY0L3QwMUplcmw3R0hQdnJ0ZDhsWjVrbThwY0tFWm96QWltUzNTa25ObjVrRHQ2aTN1ektUWG81TzVGSGtRQUpPQ1pBQWVJWUZROU1UQVRzQXFSYy9lNnljKytQamgvL1RoVWp0U3VYa3M2dnZpQVBaTHpYbkhmaDhsV3AxTGluSEQ1Mnh1ZDFLRUFjSTA1MEI0N3UxVndhMUNobm5ydFc2NEd5YXRPdWtCbFFnQ1I4QVhKZnVqVFNyMzBEU1pjMmxidzNmWkdzM0xnejVQR1NHRStrQUVtTXZjNW5kcHNBQllqYnhIbS9lRUVnSmdMRWVzQzdVNmFRcVVQYkM0UUZESjZRRXJVN21aQUliMFlCRWkrR3hrMXBKQVZJZUxESHR4Q3NVRDBnNGFHVmVLOUNBWko0KzU1UDdoNEJDaEQzV1BOTzhZaEFPQVFJSHZldTVFbGwyYlMzNWVHY21jM1RkeHN5VlNiTVdrSUJFby9HUWx4b0tnVkllSHFCQWlROEhCUDZWU2hBRW5vUDgvbmlBZ0VLa0xqUUMyeERuQ01RTGdHQ0I3TjdOdnhWeWFFSEpNNE5nempUSUFxUThIUUZCVWg0T0NiMHExQ0FKUFFlNXZQRkJRSVVJSEdoRjlpR09FY2duQUlFRC9mdEYrOUt0Z2N5bU9kOHBISXJyYXh5SWRvelU0REV1V0VRWnhwRUFSS2VycUFBQ1EvSGhINFZDcENFM3NOOHZyaEFnQUlrTHZRQzJ4RG5DSVJiZ0RpWlFNWlVnRmlWbFVvK2xsZnk1TWdzYWU2K1MzNy80eTg1ZC9HeW9HclNpcTkyeU9JMTIrVE1PZjhWdmV5ZFlVOVludlRaTXVrOGVITGt4N2ZkZHF0VWYvb0plZTZaNGxyNUs0ZnVPWkJhL3ZuM1g3bDQ2YXJzMm4vRTdQS00wcUV4cWI2RFBSYVEwRisrUkNISmx6dXJlYWJmdEtyUHp4ZXZ5TGQ3RHN1eTlkdmx5N1ZmeXovLy9Cdm54bEE0RytSay9EaTluNzhrZEt0UHEyc0oxMGZ6NVl5VlBzMlZOYVBVclZaYVNqNldYL0RmZDZWSUpoZTFTTU5QT2k2LzJ2NjkyVDhIbFlkaXcrS3lBTEczemVtekQ1ODRWd2FNK3pSR2l4bm52cDRwNlBjMVczYkxDNjBHUkY0THBXaHJWSGhTcXBhTnFNQ1dMbTFxdWZYV1cweGY3VDE4WEwvZk8yVG13clZ5OWJmclBwdUxjdFBQbFM4dWp6MlNXeDY0NzE1QmdZNUxWMzZWbzZmT3lzWnZ2cGVQNXExMlhGclk4eWEzM0hLTDRQclBsbjVNSGkrUVd6S21UeXZJdTBQSjg4dS8vQ3A3RGg2VmpkdjNtWGNRN3VuUFpvM3VLaFZLUGVvVXV6a3UzZU4xSGIxM2t0eHh1MVF0VjlUODgyaStYTXJ4YnZPZXhKNVJCNCtjbE9YNlhwNjNmSlBaUjRwR0FvbUpBQVZJWXVwdFBxdGpBdUVXSU4xYjFqWlZzV0F0ZTcwbm55NWFINk5KZy8xay9LRDFhMWRmYXVsRUhSTUVmL2JuWDMvTEJ6T1h5RERkbThUZnhNRzZobjJ5T20zdUttbi85Z1R6VWFuSDg4bW90NXBMOXN3UlhoMWZkdnowT1htbDgzRFp0ZStJWS9ZNEVCT2lkbzFybUgrd0d1blBEaDQ1SmQySFRqVVRxSVJxYmdnUUNPQVJiNzRhYTMxNmo0ckovaDBheUV0Vm5oSk1IdjBacW54MWZXZXkvSGpDV2JsaHAvMU9BUktkbENWQXZsSkJVUDIxZnVhQWlrOFZrV0hkbThyOUdlN3hpeFppcEZYdmNXYXh3VzVGOHVlU2tXKzlKdmtmek9yM2ZCVGtHS3RWdXZxUG5TazNidHh3Mm8xR0xBenUzQ2pTcSt6dlJDekNqSjY2UUlaTi9OeW5ZSWd0QVlJRm1yYzdOSXlzaHVpcm5SQWZnOGZQOXBrZjZCZ01EeVNCZUVTQUFpUWVkUmFiNmg2QmNBdVFUaW8rZXFnSWdiWHBPOTdyeGxhaGVFQ0tGWHBJcGczcmFGYlZMTU5rSHl2SlozNithUDZVT1dNNkZRejVKVyt1aUVSNEdDWjJ6N2Q4V3lBUS9KbGRnSHp5eFZwcDNlZDlhVnE3b3J6VHBiRVJPOWhqWUwzdVRiRHY4QW41N2ZvZmNrK2FsR1lmbEdLRjhrU0tJUnhUb2VHYnN2L0hrNDQ2RUY2UGowZDJsaWYrMjRBTjNvMnR1dzdJbGgzNzFadHpSVkpvWW4vdXJKbWtmTW5DZ2trdDdOOS9iMGluUVJObDZ1Y3JIZDBqdmgwVTJ3S2t4Y3VWWlVESGhrWVl4RWFmWXVJL1kwUm55YVNyMUREY1k2MEt4ajBIajVtVlgzaTI0RVY3U2tWUTBqdnZNTWRnMWZxbE53YkxOOThkQ2x0M3hXVUJrdXF1NU9vVnloZmxXVit1WGxvcTZ4NHdzRUc2by9uM0huc0pIVDUyV2xmUlQwWGpFOHk3eEJJZzFuNFg3Um8vSjczYXZHeXVpYjZCTU1INzRvOC8vekxmdDBMNi9VWmZXU0lTMzgrWDJ3MlJGUnQzbUhQcTF5Z3JJM3E4S3JlckJ3WGZ5NTM3ZmpUZXlvdFhya3B5WFV6SWRuOEdLVkVrcitsenk2YlBYeTF0KzMzZ3FKOEhkMmtrcjlXcEZIbnNxYk1YWk4zVzd3d0hMS3FrU0paVXNtUktKeVYxa1NSUGpnY2lqMXU5ZVpmVWJmdU9WNC9zWStwQmdRZlhNb3pCaVlQYW12ODlvTmZ0UDJabXRMWXRWcytyTHdPYm9kMmFTSk5hRlNJUDJhdnZ5SFZiZDh2cHN4Zk51eEVlb1hMcXdjSGVVWmJOWExoTzN1ZzMzcEZueFJFc0hrUUNjWmdBQlVnYzdodzI3ZVlSQ0xjQXdZVDkxVHJQbWdlcXF6L1dDQjN5dEdBbURUaTM2Q01QeXVmdnZ4WHBJZGo4N1Q3cE9IQ2l6NGwrc2NKNWpIQW84RkEyYyt1ejV5OUw1YWE5NU1pSnN6NUIyd1hJN01VYmRKS3hVeVlNYUdOK0lOK2R0a0JYRnIrUVgzNjlGdTM4M05reXlZY0QzNUJIOG1RM24zMzcvUTlTdmtHUGdCMmE2cTVrOHVYRXZwTHZ2NVZUckt4Mkh6YlZheHNSMnZDNmJ0TFd2VVV0TTltQk5lbzhRcjVZdFRYZ2ZlTGJBYkVwUU1BTEc5ZkZWcDlpRlh6UnhENkNDVFpXdWJIaVBWeFhvMy81Tlhyb0RzWmJmOTIvQXQ0OEdDYVVwVjdxSEZBb08rM1B1Q3hBdkQxRHFHVjRnM21YV0FKa3U0b0VDUGd4dlZ2SXRkLy9rSUVhMmpWNTluSVR4dWxwcU9vM1JzY013dlJnUDJzNDBlTTEycHBRU1V6Y01RSEh1T3I3N3NkZXY3c0l4V3BWdjZxODJlcWx5SVdLZXUySHlwSjEzL2p0U2t6cXNRQmkzZlBOWWROazNvcE5SdWg0czNMRkN3cStPNVlueHpPTTFOZk5ZcG9EOGw3ZlZpYk1FQVlCMDJYd0pObnc5ZmRlYndjdnlaQnVUVlVBUlN3aVRmeDBtWFJSN3grTkJCSTZBUXFRaE43RGZMNlFDSVJiZ0t5ZU1TaHlKK3NuWCt6b1ZTUUVNMm00TjAwcVdUOXJpR0RETWRqa09TdWtrNHFQUUlaSisvdjlXMHZOQ3NYTm9UdjIvaUFWRy9YMHVUZUpYWURnMkFlelA2Q1RDNUVHSFlZRkRIbkNoSFB6NXlNazQzOXRyTnkwdC9GaStMTnBRenRJTmYxQmhvMzVhS0gwSGpVajBDUEpNeVVLRzQ4SlJBaFd6WitzMWRHSXE0UmtzU1ZBNEpYQ2FqRXNOdm9VZ25MZHpDR0MvQ1RrQWpYcE9sSytYT043NWRqcXM1NnQ2MGo3SmpYTi8yN2JmVkNlMVRFYURxTUFpVTdSRWlENHppQWY1MC8xZE5SVTcraHV6ZVB5WjhtU0pwRlYrbDZ6dkF6dnpWZ2tEV3MrTFNuMUduMUdmNndMRkY4RTdMSlc5YXVZRUNYWTE3c1A2YnZvTFovblFFek1lUzlpRWVQWXFaK2wycXQ5dkJiejhMd0FQTUNyWmd3VXZETWhzdkYrd0o1TS9pd21BZ1RlR1hocFlCQWQ5VHNNRFJqdWlnSWxDei9zSFNtVVlyclphRUR3UElBRTRnQUJDcEE0MEFsc1F0d2pFRTRCOG1EMisyWHpuT0ZtVlJBSjRQa3F0dkQ2d01FSWtIZDd0VENoRHJBRks3ZEk0eTRqSFVORWZzWDg4VDFOR0FRTW9SMUROU2ZFbTlrRmlQVjV3MDdEWlpFbUNqc3hoQ0FnbGh6MjRheWwwblhJRkorbklkUUUzRU41Smt4V01XbUZPUlV1VHRvZlY0NkpMUUVTMjMwNnNOTXJndkF1R0ZaMXNicnIxR2FQN1dHU2pHRjFOQlFMeWJveE5RcVE2QVF0QVlKUDRLR3ExWHFRSUZ6SmljSGo4ZG1ZN2xFT0hmL0pZdW1obmdrbmhuZmlqb1ZqSWtXd3J3cUJ1QmJ1Zy92QnFqYnJJNXZVNCt2VTREV0I5d1QyemdkejlKL1pmazhOVllCZ3NlWHJCYU1sZWRJN1RkaGF1WHJkdlhxSXZkMGM0YlNMMVB1TDhDeW5IbU9uejgvalNDQXVFcUFBaVl1OXdqYmRkQUxoRWlENGdjVVBweldSd2lwaHp4SFR2VDZmVXdHQzFlVHRDOTQxUDFUbkwvMGl4VjdvWUNyVEJHTVBaTHhYdnA0M0tySXFUZjVLTFUzMUdFL3pGQ0FJdzJyKzFsakh0MExNK0tIVkVaNlpRQ3VjRzJjUE14czJJdXltU1BVM3pMTTVOVlRzMmJGb3JNa3h1SEwxTjNtNFFuT3ZvU05PcnhmWGpvdE5BUkpiZlFydjNLNHYzeFAwRGZJNEtyemllM1hiRzIva0xHMzRkS2dSN2toS3g2cHdUSTBDSkRwQnV3Q1p2Mkt6ZXFsR0JZWDV4N1dUSlhXcUZPWWNWRElyOHR3Ylh0OGx2aTdhVnd0b3RHbFl6WHpjclB0b21idHNrOWREajIyWWFyd3JKOCtjbDBlcXZCNVVHKzN2b1hXYXMxYXp4ZHQrenc5VmdOaER4R3EzR1NRck5XUTFHSnVxSG1DRVpNSHdmUWxuL2xNdzdlQ3hKT0FHQVFvUU55anpIdkdPUURnRUNFS0NoblJ0SW8xZUtHK2VIN2tTaGF1MThWa1MwcWtBUVlJb0VrVmhLTUdKVXB5aG1QM0hFdFd0VU9YSzArd0NCSEhXajFadkUzUTgvbmRMeHBuUUFvaWtYT1dhZVcwcXZERUlRWUNObmI1UWVvME1ISHJsZVNGNzJFNndLNlNoOEhQem5OZ1NJTEhacDEyYjE1S3V6VjgwbU9wbzhxOW5wU1FuL0paTzdXOXluWkFBbmFYa0t6RXE2WXo3VVlCRXAyNFhJR1hyZFF1NlloMjhxVThWelc4dVBHcktmT25uSldIYlgxKy9VTEdFZkRqb0RYTkkvN0d6Wk9Ua2VkRU9od2l0cG1Wc1lSYzF6QktKOGNIYTBmVlRUQjRTa3RXeGFPUFBRaEVnT0dmZmlnbHlseGJKMkxuM1J5bFhQNnBueUVsN3l4WjdSRDRmOTZZNUZGV3hoa3lZNCtRMEhrTUM4WklBQlVpODdEWTJPcllKeEVTQTRNZnlHUTBWNk5haWRtVGVCMktQNjNjYzVqWDUzSG9XcHdKazY5eVJnaVJ2VEI3elZteHVFa0JETVNTSXIvMWtzRGwxb1NhTXZxSUozSjVtRnlBSWVjREVQbGl6OGw5UWNqTjkwWWpxT3A0MlNFdHFOcThiVWRrbWxFa1F6clB6d3lRSWs2R0VZckVsUUdLelR6ZG9qaEtLQ2FDUzBvUGxYL1daWitTdmo1Q2szTEhaOCtZUTVBZkFpeFlUb3dDSlRzOFNJS2lJVjZocTY2RHhJdW44K1lwUG12TmVhak00c2hxVzB3dEJ2RURFd01iTitGTGVHdkdSMDFPRE9tN1AwdmVOaC9TMFZnZk0vMnhMditlR0lrQ3E2SDRwMDRkSGhKREN5dzF2ZDdDRzZsdkhOMHd6K1d3SWczdng5Wmg3L1lKdEE0OG5BYmNJVUlDNFJacjNpVmNFN0FJRU1jMG9uZWpQN3RRZmpydFRKcGRjV1RLWlRiZVE4R2daUW9yYTlmOUFONXZhN1BjYVRnU0lQWlJncjVia0xLa1ZnbUppKzVaL0lCbnVUVzNLMno1VS9yVm9sL0szYVozVCs4S3pZZVdiM1BkRVBjRmVKSjZHaEhwVVMwSjUxcXlsR2dXMUo0QjFMWVNtSVo0Y05tUCtHbFBPTWhURFJBSXJwVTVzeTg3OWZxdUlPYm1HazJOaVM0REFLd0h2UkxBV3FFK3hJZHlSZFJHVmZKQzdnUnlPVUt6ZWMyVk5WU1pZaTU1ajViTXZONFJ5bWNoektFQ2k0N01FeUw0ZlRraUpXaEVUNkdETVh2SHBxVHBkVEdubFlBd2xjSmRQaXdpSm1xTEZORkRKTHpZc3RnV0lQZC9wNmZvOVRJR1BVR3ozNG5GYW92Y2VPWHJ5ckhxY0l6eEROQkpJaUFRb1FCSmlyL0taWWt6QUxrQkN2UmhXL0JkcldVbXNocDA0NDMrL0RkekRpUUFwL3VqRFdxYTJqMmxTTUxYemZUMkRQYkVUNFZHZXVTVGhGaUFaaTlVMzRUUjJnOGZvOU9icEpoL2w1RThYdklaZ09Pa0RuSTlKQUF4SjhraVdEOFVzRDVPVGMxL1hUZGhRdXorMkxTNExFRzk5aWoxY2xreUoyTlFPTWZkZnJBeXROSEsrM0ZraTkxTG9ObVJxakRkcW93Q0pQbElUaWdCQnhiVlVLbnhUSms4bVNaTGNIbTJ6eTAvZjdXYjJTNG90RDhoY0xZbGU1b2tDQmpDUzhEM2ZjMDdmRVNpb0FRRUN6MkdPTWhHSjh6UVNTSWdFS0VBU1lxL3ltV0pNSUZnQmdscjVTSDYrb0hrT2V3NGNsVy8ySERLVFlDUmxPalVuQXFUR004Vmw4anZ0ekNWUnVRb1ZyR0ppdzNvMGt5WXZQbU11VWJSbU96bDg3RXlVeTdraFFPeGVuWmc4aS8zYzlkdjJTSTBXL1VPNkhBVklZR3gyRDRnM0FmSmMrV0l5WlVqN3dCY0s0b2lCT3RhSCthalc1dlF5RkNEUlNjVlhBWUpDR2pYS0Y1ZXl4Ui9SVFZhekdFK3VFNHN0QWJKSkt4M2FOejUwMGhaL3h5REU5dDdISWlyNzBVZ2dJUktnQUVtSXZjcG5pakdCbU9TQWhIcHpKd0xrNWVwbHpLWnhNTVJLSTJZNkp0YW5iVDE1NDVYcTVoTGVZdXpkRUNEWWgyS25WckFLcDIzY3ZsZjNDZWdiemt2ZTFHdkZOdytJZlp5R0M1eVQ4cW1CN2tVQkV2OEZDTHdES01UeHdyTWxvbms1QXZVL1BvOHRBYkpiSzc1QkZJWFQwajc2VWpndngydVJRSndpUUFFU3A3cURqWWtyQk9LcUFIbXA2bFB5ZnIrSUVwVGRoMDZWRDJZdWlSRXliQUtHemNCZzNqWUtkRU9BWUJPdWI3OTQxN1FCZVRKTnV3VlhCalJHQU9MSnlmRk5nR0NQR3V4VkE4TUdtZGdvTXk0WUJVajhGaUJJV1A5b1dNZklIQzFVRmx5ODltdE4yTjR0QjNSVHpaTS9uWmRyMS8vd0d2NFUyemtnVnJVL1gvbDBjV0g4c3cwa0VKY0lVSURFcGQ1Z1crSU1nYmdxUUNvK1ZVUm1qdXBpT1BuYlFOQXBTSGhUc0ZvTksxMjNxM3luNFdOMmMwT0FZTCtJdmNzaUVzWlorY1Y3ejhVM0FmS2lyazVQR0JpUlFCdVhLcExaQlVpNHhHNlV3aENIVDBqSjJyNFR1ZTFWdlp5VUp1N1h2cjYwYmhDeFJ3YjJya0EralJOejRrMjFyaE5mUXJEUWQ4dW12bTMybFVGNEVuWmFIelZsbnBZM3YrNEVpY1MyQVBsNi9pakptU1dqS2JLQlloczBFaUFCL3dRb1FEaENTTUFMZ2JncVFMQW5BdlpHZ0dGWGFld3VIUlA3ZEV3M0xSbGMyRndDTzdSanAzYTNCUWlTeDVHRWptUjBDQ0FJSVZwVUF2Rk5nSlFyWGxEbXZOZkRQTVQ3SDM4cGJ3NlBuZEtxd1k2VEI3UGZMMXMranlnM0hhN05EWE5rdmsrKzBkMnZZZHYzSEpabkdrYnM0K0ROS0VDaVUzRmFCUXY5aHY2RHZkcjlYZmw4MmNhZ3VqKzJCUWpFMGVOYUFSR1c3YWxHam9WUlVBL0JnMGtnQVJHZ0FFbEFuY2xIQ1IrQnVDcEFVTjcweDdXVHpHUTkwR1RIQ1Ezc1VvNFZYSlFLUnZsYlQzUERBNEo3SWdjRXVTQi9hZVd3N0U4MWxtdS8vK0drK1lubW1QZ21RQkFMajVoNDJOWmRCNlJTNDE1eG9xOVFLZW5vK3FtbUxidjNINUV5TDNlTGNidnNGYjhDbFJ5bUFBbE5nSlI2UEo4cytDQmlERUY0UUlBRWE3RXRRT3plNU9kYnZpMXJ0enJ6VmdYN0hEeWVCQklLQVFxUWhOS1RmSTZ3RW9pckFnUVArZFZudzdUcVMyWXpXYyt0cFhNUkJ4MktQWnd6czJ5Y1BjeWN1bUxqRHJPSm1LZTVKVUFtREdnakwxWXFhVzZQUFNNd2thUDluMEI4RXlCb3VUWGhpK2s0RGZjNCtISHRaRW1kS29YNS91UW8zVmgrMDV5Qm1GaWJodFdrYjd2NjVoS2pweTZRdnU5KzR2TnlGQ0RSMFRqeGdQUm9XVnM2dmZwQ3hQdEI5NjNCL2pYQldtd0xrSVkxbjVaUlBTUDJVaHJ6MFVMcFBXcEdzRTNrOFNTUXFBaFFnQ1NxN3ViRE9pVVFsd1VJSmp1WTlNQVEyb0lRbDFCc2NKZEc4bHFkaU4zSGZTVUt1eVZBYWxZb0xwTUdSNVFYWHJseHA5UnVNeWlVUjBxdzU4UkhBV0l2OFl4Sk9TYm5jY0hzTzNjMzdqSlNGcXpjRXFObUxaN1VWNG9Wem1PdVVhdjFRQlBhNWNzb1FLS1RjU0pBc0JrbE5xV0VsZExORHI4UGNyTkQ3Q3grY09XSFJuakdWaFVzNUxKOXA1c0kzbmJiclhMcHlxK1N2MUpMdWY3N256RWFXenlaQkJJeUFRcVFoTnk3ZkxhUUNjUmxBWkk1WXpwVE5Rby9kS2ZPWHBBblgreG9RcWlDc2ZzejNDT29XNTh5UlRLekFweXZZbk92TWN0dUNSQWtsbUlIWUt1V2Y5Vm1mV1RUdC91Q2VhUUVmV3g4RkNCNWRSUEJyejRkYXZvRmxZRXdUckZQenMwMisxNDZNYzA1S2xFa3IyQlBGTmpaODVlbFFPVldnZzFJd3lWQWVyL3hzclJ0OUp5NTNBdXRCc2lhTGJzZDRVdG9TZWpEZGIraXh2L3RWNFQ5ZmJEUFR6RFd2RzRsR2RTNWtUbkZpUUJKZWlmeTBpSThHTnQySDVSbkcvVjBkRHRVNktwYXJxZzVOaHhGUWh6ZGxBZVJRRHdsUUFFU1R6dU96WTVkQW5GWmdPREpQM2k3dGRTcVhNcEErT1NMdGRLNnovdU9nU0IvWlBiWTdvSkVZZGp3aVhObHdMaFB2Wjd2bGdEQnpadldyaWhEdTBYcy9Idnl6SGtwL1hKWHM1TG8xQkRmMzdkZEF4bnl3ZXhveWZST3J4RlhqNHVQQWdRc3NSa2hOaVdFTFYyM1hlcDFHQ28zYnR4d2pCa2lwcDVXYVlNSEJkV0Z3bUczM25xTHJKODExSVF4d29aTW1DT0R4ODhPK3RKcE5YZHExZlNCa3ZYKzlPWmM3SDQ5L3BQRmZxOFRyQWVrWTdQbkJlZkFna204VG1nQ3BHVzlLaktnWTBQRFljS3NKZEp0eUZUSC9mVm92cHl5YUdKZmdhaUEvWHpoaXVSNUppSlV5cC85dk8wVGdlY0VtN05pazFZbmh2RzY3cE4zek9JUWhHaVZacjNsNjkySG5Kd2FlUXoyT0ZtMmZydkpuYUtSUUVJbVFBR1NrSHVYenhZeWdiZ3VRQkJLc0VGWGwrSEpnSTJhc2tETG5mcU9QYmRBUUh5TTY5dEtzSjhJN01jVFAwbHBEV253RlFmdnBnREJ4QkFUaFdLRkhqSnRRNWhGVFUzbVBIL3BsNEQ5aU9UOFdlOTJGU1FFbzVMWFk4KzlrYURDSCtLckFNbW9ZU25yZFp5aTBBSHNzeTgzU0t2ZTc1a3lxb0VNQW1IZStKNlNMdTNkWnErSCtoMGk4cFhDWVVocW5qdnVMVE5SaEVHQVE0ZzdOU1RaVHgvV1NRbytuTjJjOHUzM1A1aU5QUC81NTErL2x3aFdnTmpMR1VQY1FPUTRzWVFtUUNEeXRpOTRWL0NPZ0JDdDByUzNLY0lSeUNxVUxLemxvTnZxdmlISklnOUYyVjVVcVFwa1ZsbGQ5T21ENVY5MXZCalNxMDFkYWRlNGhybjhsYXUvYVZqZUlQbm11OEFpQk04MnFGTWplYlhPczBhOFZORHh0SFB2ajRHYXljOUpJTjRTb0FDSnQxM0hoc2NtZ2JndVFQRHNtR3pQR2ZlbXBFaDJwMEdCUlBLdTcweVJveWZQZWtXVDc4R3NnbEFHbFBLRklYa2Rtdy91UFhUY0owbzNCUWdhZ2ZzdG5kSmZzRGtoN0NjVkU5anhmZTZ5VFY3YmlCL3Q2azhYTStFVlZ2aFc1OEdUWmRKbnkySnplTGgrN2ZncVFBRHF5VWNmVm85YkQwbVdOSW5oaHNsNjUwR1RaTWZlSDd4eXhIaHVvU3ZlblhUMUh5V2FJWTZyNjY3MnZvNFB0VFBzU2NPNHhtWU4rUnY2NGVkK3F4ZGhJdHVrVmtWNTQ1WHFKcDhBZHZ6ME9hM3kxZE9SMXkxWUFRS2hzMHNyeEdIaEFCUG5NdW9WOVBYOXRuTklhQUlFenpiaXpWZWwwUXZsSTk5ZEtFRStlL0ZYWGoxcUVLL3RtdFFVQ0RqWWpQbHI1QWxkMk1pZExaUDUvMHpGNjh2dmYvemxkK2pZODA3d1BzRjd4WW5oblRSamVHZDV0blFSY3pqdU0ycktmTjIzWklIUGV4Yk9tMU9HOVdncStEY3NYSHZVT0drdmp5R0JtMFdBQXVSbWtlZDk0elNCK0NCQUFCRGhCWitPNlI2NXdvendscTA3RDVqOENYZ0M4R09ZTVYxYUtmTkVBY0ZHWHBZaERycGUreUd5YTk4UnYvM2d0Z0JCWTVETU9YTlUxOGpWWmZ3TjdWMnFZUW5IVkZ4Qk9OMnJxK0xaZEZVVUd6UGVteWFWZVFhc1ZFS3N4SFIzK0xnNE1PT3pBQUZQSkdsUEc5ckJlRE1zZzRkcnRlWTBuUHJwZ3Z6OXp6OUdRS0l5MjlOUEZvb1VLeGMxWjZSQnArRkdITVNHWVlJNnJNZXJVVmJJa2EreWVjZCtPWGJxWjdQcURSRUVEMDZCUE5uMCs1YkxiSVJuR2NKa2tNZ09vZXpFZ2hVZ3VLWjlyeDdrZXMxYnZrbE9hSWhpaW1SSkpja2R0NXN4NzJrSlVZQkF3TUlqWmkyZzRKbFA2dGo1NnBzOWNrYmZEN2ZlZXF0NTF6MmFQNWZreXBveEVzbEg4MVpKKzdjL2xQbDZManhmTUNlSjdFWDBPc3VudlczRUh3eWhWT3QxSTBoNFlETG9PK3J6cFJ0OWprdUVibzNwMVNMUzA0enowWGNydExyZjNzUEg1WUo2ZGVHMXpaUWhyWlF0VmpCU0dPRzRPWHJkVnIzZTg1dEw1R1NzOFJnU2lPc0VLRURpZWcreGZUZUZRSHdSSUlDRGlWdlAxbldsVHRYU1JuRDRNN2oyWnk1YUozMUdmK3dvcE9CbUNCQzBIei9nQ0dQQUx0RDI4QWxmejRaazRpNjZRcGxRNDZianV3QkJ2MEVvb29KYmJjMWRza0tmL0kzVlJhdTNTZmVoVTAyaGhkZzA3RC9UbytWTFVyUGlrMUhFaGI5N0lrZHB4T1I1TW0zdXFxQnlXa0lSSUdqZjRzbjlKRlA2dE5HYTVDdWZJU0VLRUR4ODhxUjN5dUF1amJVaVZwbElZZUNybjM0NGZzWjRoRmR2anFoS05xeDdVL1ZlVlREL0RlOEpObklOWkQxYjE1SDI2a254WmgwSFRwUXBjMWI0dlFRS0hpQWt5L0xvK2pzWWZkbC83RXo1ZU1HYVFNM2k1eVNRSUFoUWdDU0lidVJEaEp0QWZCSWcxck5qUjJaVVlNRUtNaVl0NlRTYzZUWmRGVVRsb2YwL25KQU5YMyt2cTNaZm1WVkRwM2F6QklqVlBvaVA2cHJFak4zYUN6eVVUZEtyMkxyempqdmsxMnZYTlJUbFo0MnRQaWhmck5wcW5pMGhXMElRSUZiL29JcmJDK3A1d0dwMEh2VjRwTDM3THJONmZmbVhYK1h3MGRQeTFmYTlablg1NEpGVHJuWXBQRytWU3o4bXhUUmtMTCtHSzhMcmtUclZYWnF2OHEvRzhsOHorVkk3Tld3TVphTFhidDN0S0kvRjh3RkNFU0M0Qmp4SHFJWlZvZFNqSnU4TEN3M3d6cUJDVTZQT0VUdTcyeTJoQ2hEckdmUGtlRURxMXlnbnFFS0dkMTJxdTVMTDlULytOT0Z3Mi9jYzBweWhiOVRiOEcyVVBvSkhvMHJaaUFwVmV3NGU5Um5XNmNteVN0bkhUUVd1UWcvbk1QZkJKcWtuOUQ0UUMwNzJLNExZTHEvdnJ5cGxIamNlNndkMC9DUE1FTzA5cmVJYUcySmlYeE84eDhKVmFNSFZMdzV2UmdJaEVxQUFDUkVjVHlNQkVpQUJFaUFCRWlBQkVpQUJFZ2llQUFWSThNeDRCZ21RQUFtUUFBbVFBQW1RQUFtUVFJZ0VLRUJDQk1mVFNJQUVTSUFFU0lBRVNJQUVTSUFFZ2lkQUFSSThNNTVCQWlSQUFpUkFBaVJBQWlSQUFpUVFJZ0VLa0JEQjhUUVNJQUVTSUFFU0lBRVNJQUVTSUlIZ0NWQ0FCTStNWjVBQUNaQUFDWkFBQ1pBQUNaQUFDWVJJZ0FJa1JIQThqUVJJZ0FSSWdBUklnQVJJZ0FSSUlIZ0NGQ0RCTStNWkpFQUNKRUFDSkVBQ0pFQUNKRUFDSVJLZ0FBa1JIRThqQVJJZ0FSSWdBUklnQVJJZ0FSSUluZ0FGU1BETWVBWUprQUFKa0FBSmtBQUprQUFKa0VDSUJDaEFRZ1RIMDBpQUJFaUFCRWlBQkVpQUJFaUFCSUluUUFFU1BET2VRUUlrUUFJa1FBSWtRQUlrUUFJa0VDSUJDcEFRd2ZFMEVpQUJFaUFCRWlBQkVpQUJFaUNCNEFsUWdBVFBqR2VRQUFtUUFBbVFBQW1RQUFtUUFBbUVTSUFDSkVSd1BJMEVTSUFFU0lBRVNJQUVTSUFFU0NCNEFoUWd3VFBqR1NSQUFpUkFBaVJBQWlSQUFpUkFBaUVTb0FBSkVSeFBJd0VTSUFFU0lBRVNJQUVTSUFFU0NKNEFCVWp3ekhnR0NaQUFDWkFBQ1pBQUNaQUFDWkJBaUFRb1FFSUV4OU5JZ0FSSWdBUklnQVJJZ0FSSWdBU0NKMEFCRWp3em5rRUM4WUpBaTVjcnk4Qk9yNFMxcll2WGZpMzFPd3dMNnpWNXNmaEo0SzdrU1dYNmlFNVNKSDl1V2J6bWEyblo2ejI1Y2VORy9Id1lsMXVkTWtVeXFWSzJxSlI1b29BVXlKTk5NcVpMSytCNTdmYy81TktWWCtYRW1YT3lkZWNCV2YvMUh0bnc5ZmNodGU3bytpbVM2cTdrNXR4Ly92bFhDbFZ0TGFmT1hnanBXazVPdWovRFBiSmN4ZjMwQUFBZ0FFbEVRVlJ6MFZpNTdiWmJ6ZUcvWGY5RE1wZG82T1RVS01mZ090V2Vma0tLRk1nbCtSL01KdmVrVG1tZTQ5OS9iOGlWcTcvSmtSTS95WTY5UDhqS2pUdGw3ZGJ2T09hQ0pzd1RTQ0J1RUtBQWlSdjl3RmFRUU5nSkpHUUI4c3J6VDh0OU9tbUREWmt3aDVPUXNJK2V3QmRzV3J1aURPM1dKUExBRjFvTmtEVmJkZ2MrTVJFZmdZbDB1OFkxNUxXNnowcnlwSGM2SW5IZ3lDa1pPWG1lZlBibEJrZkhXd2ZaQlFqK05uemlYQmt3N3RPZ3JoSE13VDFiMTVIMlRXcEduaEtzQU1tYks3UDBibHRQbmk1ZVNHNjk5UlpIdHo1NTVyeU1VRFlmelZ0bEJBcU5CRWdnL2hDZ0FJay9mY1dXa2tCUUJPd0NCS3VGVzNjZENPcDhid2NmUG5wYUZxemNFdVByeFBRQ3EyY01ra0o1YzVqTHBIdThybG5ocGJsTG9FN1Ywakt1WDZ2SW0xWnM5Slo4dmZ1UXU0MklSM2NyVmppUGZEandEY0VLdjJXWXBHL2N2bGRPL1hSZXpsLzZSWkxlbWNTcytCZk1rMTBlenBVbHlrUjg0YXF0MHFidmVQbmwxMnVPbnRwVGdKeTdlRVh5UDl0Uy92cjdIMGZuQjNOUWtqdHVsejFMMzVkNzA2UUtTWUIwYlY1TE9qYXRLYmZmZmx2aytTZC91aUM3OXYxb3ZFRjRadHdqZGFxN0pGL3VyRkx3NGV6bS95M2J0dnVnTk8wNktsWTlQTUh3NExFa1FBS0JDVkNBQkdiRUkwZ2dYaEt3QzVCZUkyZkkyT2tMNCtWemVHczBCY2pONzBxRTJ2Uis0MlY1TkY4dVdicHVlNElhWCtHbVc2bjBZekpsU1B2SVNmUFJrMmVsMzVpWnNtVGROL0xIbjM5NXZWMzZlKzZXSnJVcXlPc05xa21LWkJIZWt1MTdEc3R6ci9Vem9WcUJ6Rk9BNFBqWDNod2pjNVo4RmVqVW9EOS9xZXBUOG42LzE2T2M1OVFETXFybmE5S3c1dE9SNTM2K2JLT01tLzZsQ2JQeVpRaGhxMXV0akhSc1ZsUFNwYjNiSEFadlNKVm1mWXhnb1pFQUNjUjlBaFFnY2IrUDJFSVNDSWtBQlVoSTJIZ1NDWVNWUUpIOHVlVExTWDBqeGNmVXoxZEs5NkZUZlFvUHo1dm55SHlmekJqWldmTGtlTUI4NURRUHl4SWdQMnJPUkxiN014aHZDandGenpicUdkYm53OFZXVGgrb1FqU24vSzNlbFFNL25wUjhEMloxbEFOU3YwWlplYmRYQzlNZUNKYW0zVWJKOGczZk9tNGZ2RVVUQjdlVjBrVUxtSE4yN1RzaUZWNTVNMWE4UEk0YnhRTkpnQVFjRWFBQWNZU0pCNUZBL0NOQUFSTC8rb3d0VGxnRWtPZXgrZlBoa2psak92TmdFMll0a1c1RHBnYjlrSm5TcDVYbEh3MFEvQnVHUWhBUUl2N01FaURydCsyUjM5WExVcUZrWVhONDZicGQ1YnNEUjROdWc2OFRDdWZOS2F0bUREUWZ6MSt4V2U1T21VTEtGbnNrb0FDNVE4T3Q5aTMvUU5LcWlJRFZhei9VZUlTQ3RXUkprOGdYRTNwck1ZUmM1dFNFNXUwTmxnZVBKNEg0UW9BQ0pMNzBGTnRKQWtFU29BQUpFaGdQSjRFd0Urajg2Z3ZTdldWdGMxWGt4enpidUdmSUJSTlFHV3JhMEE3bVdvZVBuWkdpTmR2NWJhMGxRRFo5dTg4a3NjOGUyOE1jUDJQK0dubWozL2l3UFNsQ3J4Q0NCVU1JVkRmTjV5ajFlTDZBQXFSeW1jZGxobFpSZzYzYjlwM1ViUEYyeUcxQ0F2dTZtVU5NQmE2ejV5OUwva290bVJjV01rMmVTQUx1RUtBQWNZY3o3MElDcmhPZ0FIRWRPVzlJQXBFRXNES1BGWDVVdmtLUmhCSzFPOGxCcldnVkUxcy9hNGlXcHMxcUx2Rk13emROVG9ndnN3UUlpazlVYXR4THZwNC9TbkpteVNqWGYvOVQ4ajNiUWk3LzhsdE1tbUxPaGZmaWUwMCt2elBKSGZMOXdXTlNxazRYK1hKaUh5bis2TU1CQlVpWDExNlViaTFxbWV0MEhUSkZQcHkxTkVidG1UKytwenhWTkwrNVJyVlgrNXJrZmhvSmtFRGNKVUFCRW5mN2hpMGpnUmdSY0ZPQWJKMDdVbkpueXlUN05mNzd5UmM3Um1rM3F2KzhWT1VwZWFMUVF5WVVCYUVYRnk5ZmxSK09uekZsVzZkcFRQd0YvWDlmMWxxVGNQdTFyeDhVQzZ5bVlsWFZpVDJwazZWYWxVdEowWUlQeWdQMzNXdGk5YzlkL0VWT25QNVpWbTdhSlFzMHJBUng5RTRNaWNQN1Ywd3doODVkdGttYWRSOGRlVnJWY2tXbHR0Nm5zTWJLcDc4bnRlSGdHYytQRUJ0VUU0SU5Iai9ibEJpMkREa0FMMVlxYVNaWkdmVTRKTjlpRW5sYTkzWllzMldYZkw1MG8rdzlmTUpKTTgweHoxZDhVaVlPYW12K3UrUEFpVEpsemdyejM1ZzQxNjlSVHFycVBoVjVjMmVSTkZwNUNQa0RQWVpOay9HZkxJNjhQbGFiejMwOTAvei96cjAvU3JuNjNSM2ZHemtDdGZSWmlqN3lvT1RRU1hIcVZDbms3My8rTWMrRFNtdGZhNjdDYkUyV2pzbUVIZjBJNXZnSGlmTGc5YysvLzhxNUMxZjB1aWRsK1ZjN1pON3lUV0daaUh0NzhMclZTc3Q3ZlNPcWhDRzBDQ0ZHTVRYN2R3RkZKUkJ1NU1zc0FRS1JBckhTdkc0bEdkUzVrVG04NTRqcDh0Nk1SVEZ0amlrcDNLdE5YWE9kZHYwbm1ISzRTNmYyTi8wYUtBbDlTTmNtMHV5bGl1YmNocDJHeTZMVjIyTFVIcFFBUmlsZ0dNT3dZb1NTSjVPQUt3UW9RRnpCekp1UWdQc0Vib1lBZ2FoNHZFWkVhRWlXVE9sa2RLL21rUW1pdmdqOGV1MTM2ZnJPWkptNWNKM1hRMkpMZ0dBbGVXajNwdkpFd1lmOGRnNFNhNUU0M0gvc1RMbjYyM1cveDlvRkNNb1ZOKzR5VWplWlN5T1QzbWt2eFZTQWVkcTg1WnRONHExbGRnRXlhc29DclpUMGlZbXBSenRmZkxhRTMzdGpFMENJaUQ2alB4WXdEV1IyQWRKNThHU1o5Tmt5MDhhSmc5dEY1aHJZcjlGSlJjcmsvMFFLL2g2S0FIa2c0NzB5ckh1enlIeUVRRzNFeEwzem9FbHkrdWVMZ1E2TjhubDFEVmQ2dTBORHdmMzhHUVFQaEI1eU04SnRIMnZpT0twZndlcTBmU2VvNUdwZmJTbndVRFlOTlhySGZJd05DcDlyM3M5bnN5MEJnc1Rzc3ZXNkNTcEhmYjlzdk5udzhNaUpzL0pZamJZaGg0UGhwaENsT3hlT05ZekJFVjRWZUZlc2hQUkFBZ1NsZDdzMmY5RzB2LzNiRTJUYTNGVXg2b0lYS3BhUTRXODJNOWY0WU9ZU0dmVCtaekc2SGs4bUFSS0lYUUlVSUxITGwxY25nWnRHNEdZSWtPT256NWtkbHpHcG56bTZxMW5aUnZqSmxwMzc1ZHZ2ZnpDN1BLZE1rVlFlenBsRlNtcWNPQ1pEbHJYcU5VNW1MWW91UXJKbnptQ090MXYvOWcwRWY0ZGg5ZFJ6RTdLdGVqOS9YcFdYcTVlUjRUMmFtZEFSMkpsemwyU1Y3cFVDVDhmdmYveHBQQlFsaXVTVngzUTM1bHR1aWRnVWJmZitJMUtyOVNEMWpsengyYWQyQVlJVlhVeXNsazhiRU5sV3NEaDQ5SlNjVnc5TENuMzJUZC91amJLS2JSY2dtRVNObS9HbExKN2NOM0x2Q0REYy90MGhPWHZoc2lUVnRzT2pWRjZUaTFFTnlES3NlTmRzMFQrZ0NMRUxFQ1JHWTgrRnVlKy9aVHdnTUV3bVVkRUllekFnMUdiRXBIa215ZGl5WUFVSTltMlpvM2tJVnRJeHlzK3UwNTJzd2ZYOHBhdkdJNVFwUTFvcFh2amh5RDFlY0MrTW1ScjZQRTRTcDlGWDJCd1I1V3N0ZzFkbzNkYmQ2aW02YUNiTjhIS1ZlN0tnQ1VleURPSVhlUkhoMms4RzdUaXlibkprK0ZXV1VxOFluakUxN0pPeDhiTmhjdnR0dDVsOVE3RDNpaSt6QklnVkdvWGpocW1RdGRpODFHYXdyTmk0SStRbVZTbjd1RXdmSHBIRFlmZkdyUDFrc0R5aSs1Z0VFaUFRaVZQL3kybHhXdGtyNU1ieVJCSWdnVGhIZ0FMa2YreWRDYnhWVXh2RzMyWmxxb3daTTBaa0twVktTRlFxRVpvMHowcWtRa2hwVHBwSUNtblFKSVJtcFlFb1NZcVE2Uk15VldhSzVyNzFyTnM2ZDkvZE9lZWVkYzY1ZDUzaFdULzkxTDE3NzdYMy8xMW5uL1dzZDFnSlp4TGVFQW5FaDRBTEFZS1Y2bHZ1R0NDTEpnL1FrNi81eTkrWGgwZE9FZXg3NEcvRmpqNUNocWlRRUlRL29mMjkvVCtwVUwrclRpTE5yc1d5RDhqdDlWRDZzNE1XRnBoY0kxeGo2dXhsUVhkU3hvb3o5aWxBcFIrMDdNcDhlZ1VJSmxYNTh1YVZHbFhMeWwvLzdGRGhWTE5rMnV6bFlUZVM4d29RZUZET08rdFVLWFhHeWJKb3hRZWFJNUtQL1ExQ29JWGFSNkd2RW1WbXZ3aUV0bUZuOG5ETkswQ3dXdHppbHVyYTg0R3dwMEZxeCt3Rnl2c0E3MCtvWmlOQUlEcFd2VFJjQ2J1TVBSc3c0ZSt0bmllVVNJUllnVUEwM0hGY3hmcjNoQldWdUM1Q25oRDZoSVlkeE84YjhwejJGQVJybUFBUDdka21jRS9qWnk2Uys1UW5MaDd0OUpPUGwvVnpSK3RMZVFWQVBLNGQ2VFdNQVBHR1JXSXN2VHRyaEw0RVF0QWEzVFVrMHNzZGNwekp1WUQ0TDF2dkx2bnV4MjM2bUhkbVBxWkQ5N0lUSUFpUlE0NE0zZ1B3M3QybzlqZGgza2JVNXVDSkpKQjBCQ2hBa3M1a3ZHRVNpSXlBQ3dHQ1VBenM2b3dZL3dGalh0Q3I1dG0xRjVTbjVQb3JMOU9IRFZJVDRXSFB6c3J1RklsV2dHQmkrL3JFL2pyUDQwZVZPNEZKZW5aNUJ2QUlUQjkxWHlDVWJOVEUxL1FtY3NHYVY0QmcwZ3pQQk1MUzRKSEF6czdaTmE4QU1jYytwbmhFRWs2Q2ZSaG1xM0trUm9SMGZQaEplWEgrMnlHNzlBb1FjNjhRak1oYkNiVTVudmRpTmdLa2I5ZW0wcVY1WFgxNnBCTjllS2ZBSFNWZDBSQUcxMjNnc3lHZnAzMmpXakxrdnBiNjl4QWRUYnM5bG0zSVhNbFRUcEM1ei9ZSmVKaHV1M09RTEZWNVA3RzJhbGRjTEMrUHlhZzZoWTMvc0FGZ2JqY2pRUHdWczR4d3dLUy9iTDI3Z3k0T1pIZXY1eW9ocy9xZ2tJRTRidHgxYU9BVUNCd0luZXdFQ0U2QU53WmVHVFFzQmpUclBpeWtZTXp1bnZoN0VpQ0I1Q0pBQVpKYzl1TGRra0RFQkZ3SUVITnpDQi9DWm11Uk5PK3FMTUpscXFocVFkbTFhQVFJUEI3THB3M1c0U0dZWUtNa0tqd2FrVFNzNEdObDkwU1Z6NEZRbWpJM2ROS0o5UDdtRlNENEhYSkdzTzlDTUE5UXNINzlBdVJsbFZqZS9zRW5JcmxGZlF5OFNVOFB1RlAvSFdGbFpWUTVVbjk0bXJtWVY0RGdad2lGUXJMeW5qQmVEKytOMkFpUWRYT2VFRXoyd2U2ODY5cG5Ld3hNUDBnYy8zRGVrem9zREJQVWM2cTFEWHAveUxONWYvYmpnbjAzRUVaWDdmWUh3bnFhdk0rQnZKZDU0L3ZxOEN5RXVGVnZsaUVjWW1sZU8wUXF1R0xwTDlpNVJvQmc3RjEyNDEyQlEwS0ZUdG4wanpDM05nMHlFc2h2N1R4SWxyMmJLZHBNdGExSUJBak9IOWYvVG1sUU84TUxDbEUwNWJWbE1tejhLM3BuY3pZU0lJSFVKVUFCa3JxMjVaT2xPUUZYQWdRVG5vcTNkSlBkZS9aR2JJRlZMdy9YT3owakJqK1NlUGxvQkVpOTZoVmw0dEI3OUQwOVBtbTI5SDFpZXNUM2h3TlJzUWVWZTlDUUhJNGtjWC96Q3hCNFN1QXhpYlI1QlFnbWNCZlg3aHhVNklTNzNxSkpBK1R5aTg3Umh6VG9NbGlXcU55V1lNMHZRSkJQZ0wwcUltMlJDaEFJdjIxcnB1dWs5VTlVcWRhcXFsU3JUVU9lQVNiTmFCaFh3VHhXM2dseHVHY08xUzl5RVJDU2hYWjlpMTZ5VnVYWnhOSmFxbkMyRVErMTA1Y1lyaWJUQTFWSVcyNDNJMEF3a2I5SWpTUFRJTFFRSG9iOElYZ3NTOWZvb1BLZTlrUjhlOGpiUWpJN2t0cUQ3VWVDYXlNRUxWSUJnbzU3ZFc0azk3UytLWkJ2aGRBL2hBQk9uL09tTEZmaUpsSlJIUEZEOEVBU0lBSG5CQ2hBbkp1QU4wQUNPVVBBSzBCaTdjRmJwalhZdFV3Wlh2d3VWREo1dUh2d3JvSld2cTJIZlBaMStIS3kwUWdRaE5vZ3NSekNDS3Z3dHZzZ0lMUnAwMXNUZGJMME8ycy8xVEhyL3VZVklQQ3lsS3JlVHVlMlJOcThBZ1RoVUFoSnNXM1lGQTZidzZFaHFSLzJDTmE4QWdUQ0kxeENjN0R6SXhVZ09QZmJGWk5VVGxCaDdRbnlyc1pIOG13SXo3dThUSWFnbXF6S3ZQcFh4bUdYejFUcFkweU1iY3NCbS80UjVqWHJxWWYwUC8zbGp5TzVSLzh4WHJFSzhRRVJrdHZOQ0JCNHdpNm8wVEZMOTExYjFWUGxjNXZvbnlINUhwc1RSdHE4ejRiaUJmNEtZaHNXUEtVUy9ZK3hFaURvdTV5eWNmOXV6UTZwU2djdjRwc3Fwd2tKOHlnVWdlZGhJd0VTU0g0Q0ZDREpiME0rQVFrRUplQkNnR0J5Zi9xVkxTUEtJZkRlTlBiNVFMbGR0QnRhOTFaVnM3NElhMVZiQVlKRTE2K1dqdGRoTnY2WWRadmhzMkJDUDEycTl0K2R1L1J6K3FzbWVRWElpaldmNk9wTk5zMHJRT1lzZlU5YTNwdVJNR3pUTUJIZjlPWUVRY1VrZUF2Z05Rald2QUlrMHR3YjczVnNCTWdiencrVXNoZWVyVSsvdWtsUEhlNFZyK1lOS1lwMmY0dkRDaFdRelc5UDFzd1FUb1N3b2xoYUlna1FWRzByVmIxOWxzZkI1K0hUMThjSm5odTJnRTBpYlNiSEE2V2VJV3o4cGFrM0t1OElRaFZ0UENEZXZ2SDVhblhyZFZKYjdkK0NrRHAvUTlna0NqUmczNXZ2Zi80bDB0dm1jU1JBQWdsR2dBSWt3UXpDMnlHQmVCSHdDaEJNdWxkKzhGblVsMTZ1eXBpaW1rK29aandnMFU0NnZIc0MrR1BLZy9WcEswQnV1UHB5bVRvaUk3ZWt6NmlwTXZyNXVWR3hnR2NCSGdhME1yVTY2VVIyYi9NS2tNVnZyOVA3UDlpMGVBZ1E5TGZ5cFdHcWRQR3BPdi9qdENvdHRHRHlONjhBaVdiak5oc0Jnc3Bqby90a3JNSWpLUjhsWUNQZDNERTdmb042dEJDTWRiUnJtejRvNnpkK25kMHBRWDl2VnU2ajhkTDRMNWhJQWdSbGpNKzZKaVBSMjl1ZWZPUU9RVGxxdEVqRDc2NHFYMFplSFpkUitoZjd4bUQvR0gvN2N1bXpjbXl4bzZJV0lPWjY4R3loZ2x4TjllZmFTcGZvYWxuZWhyRzk5TjBQNVhFVkNybHFYZlR2dHFnR0MwOGlBUktJbVFBRlNNd0llUUVTU0V3Q0xuSkE0aUZBSXFsRVpDdEF1clc1V2NlWm8wMTRhYkY4K3RYbXFJeDJZL1VLZ1dwWVZScmVLeHQ5MTBrVUFZSWR6aUV3MENxbzhyVmZxZDNGL1MwM0JRZzhUNU1mNng3STVVQjQyZ3Z6VnFqUW4yV0NmVXRpYWRpNzVPb0taZlFsc0Z0N0pCVzhndldIbmJRUk9vVFF2RE92enNqMWliWWxrZ0JCQ0dESnFpMFBlUlFVWThDZUhXaVJWdXFDaUllWVJ3dVZqd1B2Ry9iL2lmWmRFSXc1eGsrRlM4NlRHaW9jRDdrNktHamdiVmhnUVppbzdZYVYwZHFYNTVFQUNjUk9nQUlrZG9hOEFna2tKQUVLa0V5emVKT1U0MldzRzlyMGtkWHJQODl5dVVRUklONE41MURaS3Rna1B6Y0ZDQ0FoZDZiM1hVMmtZK01iZEVLNmFaZzBybGp6c2ZyenFienp3YWZXMVk5TUFZTjQyUlVyNjhlV3l4Q3IwVGFFRUdFZkU3Ukl5eWhIMjFlbzgwd09DRUtsNEFVTDFsNmYxRi9LWDNTdXpvdTZzT1lkZW5QRFVBM2liTDNhK1J5MmUwdlo2K2FPQTRJZWF2cU5wd0R4ZDNURlplZExXMVdGQzRVbElFN1FVRXE2c2ZJNHhscEFJTjUyNFBWSWdBU0NFNkFBNGNnZ2dSUWxRQUdTYWRpbituV1NSblV5TnFpTFY2dmJydThoRzZjbGlnQkJnakVTamRHdzF3azJKdlMzM0JZZ3BuK0VoblZxV2x0dVZKTkhWRkx5TitTdExIaHpyZHJEWklWZ0U3M3Myb2I1WStTVUVzZG1kNWpWNzR0ZjF0RHFlUC9CM2pLOE5pV3BZK3JVZDNJa1F1Q1dHcFhsMmNFWkpYcXoyN2ZITzZadXYrY3hXYWlxVkFWcmtmUWJyK2M4cCtSSk1xcFhlNEVnUVlPMzU3cm1Ed2IxK01XclQxNkhCRWdnUGdRb1FPTERrVmNoZ1lRalFBR1NhUkp2bGExUW9TUHhNR0NpQ0pBQjNacnJTVDVhcUp3YVZ3TEVjTVpHZzFYS2xaYXFLcStnZ2tvOHZ1VDhNL1VHa2Q2R1RRRjdEcDJvODBaQ3RZOFhQcVUzRWd5V2JCMFBtMFp6amVxVkw1RVhSeitnVDUycFFzM3U2RDBtbXN2RWRFNGtRZ0JKOXgrcnFsVW5IRnRVNXpPaDdIT3dmV05nRjVUZXhjYWFTUHkrdEc2WGtQdkxSTkp2VEEvbU94bGxuc2YwdlNPd3dBQnZIN3grYkNSQUFvbE5nQUlrc2UzRHV5T0JxQWxRZ0dTaUc2bFdTVnZVdjFiL0lOS0UyMmpBSjRvQThUNXZxSDB0WEFzUVAxOVVaS3FvNHZ6cnFoai9XMnRWQ1hoSHNIbGhqOEhqWmNiY3Q0S2F4R3g4aHpDaUV5dmNIbzNaNG43T0dhZWVJQi9NenRoQUVrbnhTSTdQN1JhcEVQQVdnR2plWTdqTVc3Ym1rRnVGOXhCZVJEVHNuNE45ZEVLMVNQdU5KdzlkR3Z2RllRS1BDQnFxejZFS0hSc0prRURpRXFBQVNWemI4TTVJSUNZQ0ZDQ1orSHAzYWF4Q2ttN1NQd2dYUGhJVGNIVnlvZ2lRU0RidlN6UUI0bVdQUFVONnRMdEZPamV0b3plbnc2cDhrM3VHQ2lxTCtadDM0MFVrVzl2c3V4S3J2VU9kajd5RWI5U2VNUWd4Z3pCQ0RvYk54cHlocm92OGk4V1RCNmg4bXZ3cTUrSHZrSGtZT0Q5U0lRRHZCeXFBWVJJZnFuVDBraW1ENUxJTHp0SWJGbDVRczZPZ3NsWWlDUkRjUzd0R05lWFIrMXJwMnhvN2JiNDhOUHo1bkRJdnIwc0NKQkFIQWhRZ2NZRElTNUJBSWhLZ0FNbTBpbmNGZDhSenIrcDQ5NXhvaVNKQTFzNStYTTQ4OVVROWNULzl5aGE2SXBHL0piSUFNZmZhN0tacThuanZEdnFmd1hiZHhzKzk1V1RyM3pGQTNuenY0NXd3cmZVMVo0eTZUNWVSUlF1VmgyTjcwZExubkNidnpIeE1ueFl1RVJ5L2oxU0E0RmprZ1NBZkJPMEt0Vy9NRnlvUHh6VHMzNEo5WE5DbXpWNHVYZnFPQzN2YmtmUTdwbThublFPRWhxcDMvbUlPdGx4dy9LV2x6NUtsVXpQMmIwSG9IcTdMUmdJa2tMZ0VLRUFTMXphOE14S0lpUUFGU0NZK1RNWXhLVWZMeVpDWVJCQWc4QjVzZW5PaXJnNFU2VWFFT2IwUFNDd0RlZDc0UjZUU3dTVGphazBmMEx1ZGUxdnptNitWVVE5bmJMU0gvVjJ3ejBzaXRLWTNYU05QOU03WSsrVFZ4ZTlLbTU2allyNnQ5bzFxeVpEN1d1cnJJQXdLNFZDaFdpUkN3SnhiNGVKU3NuQmlQLzNQOFRNWHlYMlBadTd2NGMyZnVxcngvZkx4RjkrR2ZZNUkraDE4YjB2cDBMaVd2azZIWGsvS1N3dmVqcGtOd3Erd0h4RWE5Z1dwMC9hUm1LL0pDNUFBQ2VRY0FRcVFuR1BMSzVPQVV3SVVJRm54cjU0MVFzNDk0MlQ5dzFDbGFXTTFXQ0lJRUd5VWlBMFQwYWJQZVZQdWZHUnMwTWZLTFE4SUpwclltRzd2dnYzeTZOTXZXU1BHL2h3UDM1bFJGcmYxL2FQa3RUZmV6WElON0xxTlJHcUVKeUUwNk1KYWR3anlSbHczYktTM2NmSFRnVEFzN01meTNZL2JZcm90aEYrVkszT092a1oybXk1R0lnUzhONE05UWJBM0NIWTJ4dzduS04rTHBQTlBYaDhyS0JqdzNrZGZTSzFXdmJPOS8wajY5VllKZTFudGFONyt3WXg4bVZnYTlvTEJuakJvcnl4YUpXMGZ5Rmh3WUNNQkVraE1BaFFnaVdrWDNoVUp4RXdnbFFVSVFrSVFHb0oyUXZrbXNtZnZ2bXg1ZVZlUFE4VzZaM3VSYkE2SXB3RDU3T3Z2cFVxRGUrWEFnUU5XdCtYMUdJUUxTY290QWJKZ1FqK1ZYRjVLUDhORk4zU1NIN1prM1QwK3U0ZERIa2ovYnMzMFllMGZHcTAzemZPMzU0ZDFsenJWeXVzZkR4NzdvdDU3SXhIYWczYzAwTGtzYUFnTmd6MmliZGRVdkVobVBaVlIzUWtoVWdpVkN0Y2lFUUxlODcyNzFXT0hjK3gwN3QzQUV4TjZUT3l6YTVIMGU5UVJSZVF6SmM0S0gxWlFpOFVxRFh2SU45OXZ6ZTdTWVg4L1RPMjcwbHJ0djRMV2IvUU1HVFh4dFppdXg1TkpnQVJ5bGdBRlNNN3k1ZFZKd0JtQlZCWWdyNDdyRmRpUi9QenJPOGpXWC8vTWxqT3FMSzE1WlZSZ3o0aG93bzRhMUw1U0RpOThtRXg4K1kyZy9jVlRnS0FEN093OWJ2cUNiSi9OSEZEcnFuSXliZVM5K3ArYmY4b29seHBLd09TV0FIbms3dHZscmhZMzZuc2FwTVRCTUV0eGdPZkJjNkdGcXVpRjNJaTNwaitxdlNCN2xSaXQzYmFQdkwvaHE0aTU0VURzYzRFZHRiSFNINjkyUkpIRDVGM2xlVU9aWUxRaDQxNlNvYys4YkgzNW80ODhYSlpNR1Nobm5WWkNuNHVFL05mZitpRHNkU0lSQXQ0THdNdnhxZkoyRkZkZUR3aWNLZzE2NkkwSHNRSGhsbC8ra0l0VWlWNnd6YTVGMnErM1ZQU2FEVi9LTFVxY0JjdFZ5cTQvL1A3aTg4OVF5ZmtEZFNJOXh2c2xkYnJvY3NGc0pFQUNpVXVBQWlSeGJjTTdJNEdZQ0tTeUFQR1dtVzNhYlpqYXVPNzlpRmhoZjRhWlQvVFVsWlV3VWJsMzhITXlJWVNZOEYvdzFwcVZaV3ovTy9Va041UXdpTGNBZ1dlbjlmMGpaZjd5N0o4UE1mQ3ZUK3d2eFk0K1F0OTZpM3RIeU55bDc0WGtrbHNDNU96VFM4aktsNGJyeVNGV3UrdTJlMFRXZmZwMVJQYXFmYzNsQXU4RzdJVWQwOHZVNmhSU1VIa3JuZjMxenc2VmhEdzRvbDJ4a1NzenVFZExYVVVKRSt6clcvWTZKTThrb3BzTmNSQzhQM09lNlNQWWN3TU5BdVRScDErTzJMT0ZNVFZaTVVDZUJocks1S0pjYm5ZdFVpSGd2VTRmdFZQOTNTMHpOckJFTGtqYmhqWDAzMjJFVTZUOW9rTFkwcW1EQmVNRERmdDN3TXRpRzZaMitVWG5LTkY5bnc3elE0Tmd4K2VUalFSSUlMRUpVSUFrdG4xNGR5UVFOWUZVRmlEZVBBY2tsZGR1MDBlWENJMmtZVFVlcS9LbUlRYTk5OGdwZXBVM1dEdnArT0w2ZU94TmdZWnFUTWdod1NUWDMrSXBRTDc2OWljNVdhMCtIMWF3b0R3OVk0RU1HLzlLeVBLbm1LaERsSmxKR0lRSEJFaTRsbHNDQlBmZ3plUEFLdmVBSjJkb0wxS28wclR3Vm5WdVZsZnViMzlyWU9LZVhRZ1FoTVRVNGZkS3phc3lLazloUENBTTU0bkpzME9PRFZST0d2WmdHMTFCQ1MxZXllSis3cWd3Tlc1QWhuaEZ3NWp0TTJxYXJQeGdZMGdoZ2pDbHhuV3ZrdTV0Nndmc3V2ckRMMVJGclFFUjViaEVLZ1M4OTRvZDVkZlBHUjI0VC93T0lyaU15cXZaOXR0ZmtYeThyS3B2WWIrVTE4WTlMS2VXT0M1Z3MyZG52aTVUWGwycVAyZmgydmxublNydFZYNVIwM3JYQk83M1haVjhma3ZuZ1JHL0N5SjZJQjVFQWlTUUl3UW9RSElFS3k5S0F1NEplQVVJUWt0V2Z2Qlp6RGUxOWJjL2cxYXNRZlVack1CamNubHE1ZWJXL1hnM1EwUDVUSlRSRE5lUTRMdHU3bWc1cnZqUitqQ0VHMkZsK0krL3QwdHg1UUhBNUNWVW1CU094Mm8zUWtDd0tvKzJUeVZJdjczMlV4VzI4NlZzVlVLa2dOcjVHY25OV0hYR0x0MVlnVWY3NU12dnBFR1h3U0hGU2p3RnlCd2xJaWE4dEZoZWVMeW5ZRUtPQ2ZWYjcyM1Ezb050eWc0RlZjak1LU2NlS3pWVnFWZXpBUnZ1OFIzMUhGajkzN1U3dkNETFRRR0MrK3JWdVpIT0tUQU5BbTdadXh2azA2KytrOS8vL0VkUHhJc2RmYVJjZU83cFVyM3lwWUpxWHFZTmZHcW1ERmNDTExzR0w4Tm9WWGtLQXRVMEpGVy84YzU2MmZpL3pmTGJIMzhMd3BsT09xRzRYRlB4NGl6Y0lFUTdxUjNMSXdrenl1NCtndjBlM2pkNDBKRFliUnBFTCt3Rjc4NmZhdXdpdkE4aFVHVktsZFFKNGQ2ZDRXY3RXaW5kQmp5cms4UWphZEVJRUZ4MzZvZ2Vjc1BWbHdlNnNFMFN0KzBYbjVrbit0d2gxMWU1Tk10aklTZmtvODgzcVZDcVg3WFlSeW9VdkNhbm5YU2NEcmt5NFdqbUpOeG5GMVZ3SWJ0eEh3azdIa01DSkpEekJDaEFjcDR4ZXlBQkp3UzhBaVJlTjRBU3FDaUY2bSs1TFVEUVB5WXNVMGJjR3hBUjNudUtwQW9PSm5pRGVyUUlsSGdOeHdpVEdvUjJvSXBUT0U5THZBVklTK1hGZ0xnWThWQTdxVnkyZEZnellzOFAzT09BTVRNaVdnSE9iUUdDbTBlbG9pRnFzemhUalN5N2NibnAreTN5d05CSjhzYks5ZGtkbXVYM04xMTNoY3JwYUN3bFR6a2gyL093c3Q5ZmVXU3d4MFZPTjR3UGlHM3NiMkpDc3JMcjg2UFB2cEhoejcwU2RJZnljT2ZhQ2dGenJhcmxMOVJlQ2ROcXRueFlrS01SYVl1MjMrdVU2T3phcXA1Y2NiRGtjcVQ5UVpBUFZQdjZMRis5SWRKVGVCd0prRUFDRUtBQVNRQWo4QlpJSUNjSXBMb0FBYk1MMUdyNTNTcWtxcEthbk1NYmdwQ2VYNVIzWU1wcnkyWGtoRmNqd29vZG5tKzYvZ3JsN1RoUHJhcWVxRmJlaStpU3NiLzgvcWQ4OXIvdjljUUdsWmQrVTZ2MDJiV2NFQ0NtVCtRUzFLbFdRUXVtRTVSM0JpdnBmMi8vVjM1VVZhV1d2ZnVoekp6L3R0NzNJOUxtUW9DWWU2dFM3Z0sxeWw1T0xsT1Z6RTQvNlhqdGxVQUlGWjRIeWNQcmxkQmRxUEo2d0I3Q0twcUdjQ2Q0VW1xcjFYelkrQlFWNWdQUDJYKzdkc3RQVzMrVERaOS9vM2RXaDZjcEhydVUyOXdqUXVYcUtaRjA1ZVVYU0pselM4cXh4WStTSW9jVjB0NE5lRUxnd1laZjZMZ0FBQ0FBU1VSQlZJTTNidG03SCtuY2lHaGF0RUlBZmExNmViaWNkK1lwbXRIVlRYcGFkUjlMditnSUhvN3JyN3hNZXg1TG5YR0tUdUEvUW5rKzRDRURINVJhaGpjTGl5SEkvYklaODFZUHdvTkpnQVJ5bEFBRlNJN2k1Y1ZKZ0FSSUlISUN5RGZCdmd0b21CakRBOEpHQWlSQUFpUkFBcWxHZ0FJazFTeks1eUVCRWtoYUFoUWdTV3M2M2pnSmtBQUprSUFGQVFvUUMxZzhsQVJJZ0FSeWtnQUZTRTdTNWJWSmdBUklnQVFTaFFBRlNLSllndmRCQWlTUTlnUW9RTkorQ0JBQUNaQUFDYVFGQVFxUXREQXpINUlFU0NBWkNGQ0FKSU9WZUk4a1FBSWtRQUt4RXFBQWlaVWd6eWNCRWlDQk9CR2dBSWtUU0Y2R0JFaUFCRWdnb1FsUWdDUzBlWGh6SkVBQzZVU0FBaVNkck0xbkpRRVNJSUgwSlVBQmtyNjI1NU9UQUFra0dBRUtrQVF6Q0crSEJFaUFCRWdnUndoUWdPUUlWbDZVQkVpQUJPd0pVSURZTStNWkpFQUNKRUFDeVVlQUFpVDViTVk3SmdFU1NGRUNGQ0FwYWxnK0ZnbVFBQW1RUUJZQ0ZDQWNFQ1JBQWlSQUFpUkFBaVJBQWlSQUFybEdnQUlrMTFDekl4SWdBUklnQVJJZ0FSSWdBUklnQVFvUWpnRVNJQUVTSUFFU0lBRVNJQUVTSUlGY0kwQUJrbXVvMlJFSmtBQUprQUFKa0FBSmtBQUprQUFGQ01jQUNaQUFDWkFBQ1pBQUNaQUFDWkJBcmhHZ0FNazExT3lJQkVpQUJFaUFCRWlBQkVpQUJFaUFBb1JqZ0FSSWdBUklnQVJJZ0FSSWdBUklJTmNJVUlEa0dtcDJSQUlrUUFJa1FBSWtRQUlrUUFJa1FBSENNVUFDSkVBQ0pFQUNKRUFDSkVBQ0pKQnJCQ2hBY2cwMU95SUJFaUFCRWlBQkVpQUJFaUFCRXFBQTRSZ2dBUklnQVJJZ0FSSWdBUklnQVJMSU5RSVVJTG1HbWgyUkFBbVFBQW1RQUFtUUFBbVFBQWxRZ0hBTWtBQUprQUFKa0FBSmtBQUprQUFKNUJvQkNwQmNRODJPU0lBRVNJQUVTSUFFU0lBRVNJQUVLRUE0QmtpQUJFaUFCRWlBQkVpQUJFaUFCSEtOQUFWSXJxRm1SeVJBQWlSQUFpUkFBaVJBQWlSQUFoUWdIQU1rUUFJa1FBSWtRQUlrUUFJa1FBSzVSb0FDSk5kUXN5TVNJQUVTSUFFU0lBRVNJQUVTSUFFS0VJNEJFaUFCRWlBQkVpQUJFaUFCRWlDQlhDTkFBWkpycU5rUkNaQUFDWkFBQ1pBQUNaQUFDWkFBQlFqSEFBbVFBQW1RQUFtUUFBbVFBQW1RUUs0Um9BREpOZFRzaUFSSWdBUklnQVJJZ0FSSWdBUklnQUtFWTRBRVNJQUVTSUFFU0lBRVNJQUVTQ0RYQ0ZDQTVCcHFka1FDSkVBQ0pFQUNKRUFDSkVBQ0pFQUJ3akZBQWlSQUFpUkFBaVJBQWlSQUFpU1Fhd1FvUUhJTk5Uc2lBUklnQVJJZ0FSSWdBUklnQVJLZ0FPRVlJQUVTSUFFU0lBRVNJQUVTSUFFU3lEVUNGQ0M1aHBvZGtRQUprQUFKa0FBSmtFQmlFQ2hZSUwvY1h1OGF1ZUhxeStYTVUwK1UvUG56eW85YmZwTm0zWWZKYjMvK2t4ZzN5YnRJV1FJVUlBbG0ydTlYUGkrSEZ5Nms3MnJLYTh2azduNVBKOWdkOG5iOEJDNHBmYVlzbXpvNDhPTU92WjZVbHhhOFRWQVdCSzRxWDBaZUhkY3JjRWFqdXgrVnhXK3ZzN2hDWWgzNnd1UDN5L1ZYWHFadjZwdnZ0MHJaZW5jbDFnMG13ZDMwdTZlcDNObXNycjdUQ3ZYdmthKysvU2tKN2pweGJqSFZQbE9KUXpZMTdxUjQwU1BsMWJHOXBFeXBrb2M4MFBuWGQ1Q3R2LzZaR2crYXhFK3hZRUkvcVhoSktmMEVIMjdjSk5XYVBwREVUM1BvcmFldEFLbDVWVm1aUHZLK0FKRzMxbndzTjNjY0VKRngzNXcrUkM0Njc0ekFzVGUwN2kyclAvd2lvbk96T3lpWkJVaWVQSG1rNnVVWFNvUGFWMHF0cThySm1WZTN6dTV4US80ZTF4algvODdBN3pHaHg4UStFUnNGU094V1NZVEowc3FYaHNuNVo1MGE4bUgyN3QwbmYyMy9Welp0M2lJclA5aW9GZ2lXYW5FUnJGR0FCTWRZNUxCQ2NzTTFsMHUxS3k2U2k4OC9VNDR0ZHBRY09DQnkzblh0RHpuQkswREszOXhWL3ZmZHo3RVB0RFM2UWlKOHB0SUlkOUk5NnBUaFBhUzIraXdHYXlXcnRwSy8xYnVPelMwQkNwQ3MvUE1VdTdTQitycEkvcFkvZno3NWJQSFRjb3hhQlVEYnQyKy9uRnU5bmZ6eDEvYXdEM2Y2eWNmTCtybWpBOGQ4OStNMnViUnVsN2dCeVU2QTlPN1NSTHEycWhmb3IwVEZwckpyOTU2NDlSL05oVXFmYzVvMHJGMVZicTFWUlVvY1Z5ekE4N2pMRzBkek9UbittS05sOWF5UlV2U293d1BuVTRCRWhUSnBUa3FFeVZKMkFzUVBjLy8rQS9MRTVEa3k4S2tYOVB2RDJ5aEFEaDE2clcrN1h1NXJmNnYrZkh2Yjd5clU0K3hxYlE4NXdTdEFMcWpSVVg3KzVZK2tHYytKY0tPSjhKbEtCQTZwZEErRkNoYVFuMWRQRFR6U3FJbXpwZC9vNmRhUGVNcUp4OGlHQlU4Rnp0djgweS9TdWM5VDhzRW5YMG1oZ2dYbHIzOTJXRjh6RVU2NHR0TEY4dEtURHdadTViWTdCOG5TVlI4bHdxMUZkUThVSUZteHBZd0F3V005ZWw4cmFkZW9adUFKdS9RZEo5Tm1Mdzg3VU81cWNhTThjdmZ0Z1dPR1B2T3lEQm4zVWxTREs5aEp5U0pBVGpxK3VCWWNEVzY0VWlCQS9BMFRzbWdGeU5RUlBYUk1xcmRSZ01SdGlDWGtoUkpoc3VRWElINWhueTl2WGhVam5lOFFmaS9PZjFzNlBwelZPMGNCa29rSnpKN3NjNGYyakFaclAyNzlUY3JVNmhSV2dKeGNxWm44dDNOM1FvN2RSTDJwUlBoTUpTcWJaTDJ2ZUFtUWV0VXJ5c1NoOXdRd3RPazVTbDVkL0c2eVlnbmNOd1ZJY3Brd2JVT3dZS2JMTGpoTGxrd1pGTERZNG5mV1M2Tzdob1MxSUk3SGVhYVZxM2UzYlBwK1M5eXNuaXdDWlBIa0FWS3V6RGtobnp0YUFRSlI4OHpBUXoxS0ZDQnhHMklKZWFGRW1DeDVCY2ozUC84aUY5Zk9EQUVFTklRWW5scmlXTG41K2tyU3ZXMTlPYUxJWVNHL3dDbEFNb2ZaNDcwN1NMT2JxZ1YrOE5PMjMrWFpGMTZYTjFhdWx5Ky8rVkVRMmhhc0dRL0lIdlg3RThvM1NjaHhtOGczbFFpZnFVVG1rNHozRmk4QjB2clc2MlRZZzVsZXh5dHU2U1pmcU05aXNqY0trT1N5WUZvTEVKanF2VmRHeWprbFQ5SlcyNzFucjV4N2JWc1YrL2hmVUN2NjNaWnJObndwTlZzK0hGZUxKNk1BK1hyenp6TDdqZFZTNnN4VEFqR2wwUWlRNDRvajlHcUVGRHY2Q0QwcDJhK0N3MUdsQTQwQ0pLN0RMT0V1bGdpVHBld0VpQmZhRlplZEwvT2U3YU5GQ1JweXdKQUxaaG9GU0FZSjVJSk5HM2x2Z011Q045K1hPeDRlSS8vc0NQNk85VEkyQXVTWDMvK1NVdFVQelJGSnVFR2NZRGVVQ0orcEJFT1M5TGNUTHdIU3RtRU5HWHAvWm80bWltU0V5bWRMSm1nVUlNbGtMWkcwRnlCWXlYeW9VOE9BMWRvL05GcGVYdmhPVUN0MmFscGJCblJySHZoZGowSGpaY0xMYnh4eWJBRVZjZ0FYWjZPNlYybHhjOEt4eFhSQzEyZi8rMTdtTDM5Zm5uOTFpZXpjRlR4dkk1Z0FPYlhFY2ZMUi9QQUoySjk5L2IxVXZxM0hJZmRTdVd4cGFYRkxkYmxZSmMyZmN1S3hTbVR0RWVTdExIdjNJM2w2eHNLb0sxMDhQZUJPK1dITHIvS2FFaDRmZi9HdDduZFFqeGJTc2NrTit1L1JDSkRuaDNXWE90WEs2L05IVG5oVld0U3ZMcWpVZ1JhTkFQR0djcUhJUUxOdXcrU0JPeHJJamNvMkpZNHJycTk1Uis4eFdaZ2RmZVRoZ3Bkem5Xdkt5OW5LZGdpNytlWDNQMlgxK3M5bDRxd2wrdi8rWnBPRWZ0WnBKUlNqV25KMXhZc08ybU92SUFUbHpkVWJaTnowQllKWTNGQU5YejVOYnJ4YVQrb3VPUGQwbmIrRWNiUkpDVUNzSm1OVitkYy8vZzU1ZnVIRENrcnptNitWdXRkVzBNbldSeDVlV0xiL3UxTysvUFpIWFhGcWtubyt4T09IYTFYTFh5Z3QxWGlxY01sNWNweEtJTVpFRXNuQkM5OWFLK05udnE2dkY2cGhITit0OHBlcVY3cEVmU2FLNm1QZi8raExHVDFscmhUTW45OTVGU3diQVlKbjlNYm5JaC9raEFwTkFya2drUXFRYU44VnFJeUMvazI3L0thdWl1ZC9naERSNnBVdjFXTnI3NzU5OHNXbUgyVHFhOHZWTzJkcFdMdEdNKzdEWHZEZ0w5OStZYWdlcTJnZmZQSS9MZExnMFlpa0dRR0M2bGVvZ3VWdEdNT042bFNWUzBxZnBSUFpFUzRIcjlYYjczOGlFMTU2UTN0V2JOcUY2aDVYcUhzMTdacmJlOG9PTlQ0N3F5cGNLS3hSUW9XYzd0eTFXejVYUENlL3NrUm16bHVoRDhWbnFrUGpHL1Q3L2d4VnhoUUxKbmd2dnI1aXJTQStQOXpuS1ZyYmU1OHJIcCtwZlBueTZoeSsyMjZvSWhlVk9rT09VTzhGNUVKKzlQa21tZlg2U3ZXZWZFY1ZDamcwOWZQYkZSUGxxQ09LNk5zWitOUk1lV1hSU2tHT0luaGhFY21FTkh1L1k3ZW9QSjdTS3A4SDc4eE90OWNXQ0hrc1BHMVg3NUcxYW53OCtmeGNlV2Z0cHphbTA5ODUrTzVCTTk4N2VJY2o1d2p2VzFSenV1aUdRMFA4WW5tWElZK3A1UzNYeWJYcVhYYkdxU2RJVWZXOWdlLzRUNy9hckw0VDMxV2Z1V1haam5QMGY3dDZuMWU4VkwxTGl4ZlZuOWZONnJ0NXlhb1A5YnNjM3d1bWplbmJTUnFyK1VTNDF2TGVFVEpuNlh0aGovRXV1SVk2MEZ2Rk1WSWJlNjhWN1p6amwvZG5DTVlpMmowRG5wRVgxR2VzWGNPYWN0UDFWOGpacDUra1AxdmYvYlJONXFsbmZIelM3Q3pmTlpnZjRiTVFyaUhQelA5NWpHYnN4L3ZkMjZqT1ZkTDBwbXVrOU5tbnlXR0ZDc3EzUDI3VkM3cGoxUGZpaXlxZmhWV3dNcTJhVWprZ2VDd00yZy9ualE2c1pNNWJ0a2FhOXhnZWRCeS9QcW0vbEwvb1hQMDdlRXRRdWVYUHY3TW1hNkdXOWhTVnd4Q3VtczRQUC84cVRWV2Q3UTJmZjNOSVAvRVNJQ2psKzFTL3pucXlHYW9ocHZxZWdjOElZdGpqMFdJUklMZlVxQ3pQRHM0b1ZZckpROVZHOThuR1JlUGlKa0ErL2ZJNzlZTGZyeXJ2WkZZdmUySGVXOUtwZDJZaTN1VVhuU05UaHQ5N1NKS3NsdzIrR0hvK05pbkxGM0trQWdRVDkwZlZxaE1tSHNFYXh0UmQvY1lGdGNlbGFxSTErYkZ1Y29vS0FRclY4SEp0cHNidXUrcytPK1FRak1mcG8rNFRGRkVJMVZEM0hiSEFLOVo4Y3NnaHVPZkhIbWlqQlV5b2hpUmhoREFhUWVvOTdob2x1SjVYVlZkTWlXbi9OVjUvNndOQlpUclRYSlRodFJVZ1QvWHJwQ2JCbVpPQ2M5UVhuS21kSDRrQWllVmQ0ZjhTZk9UeGFkS3RUWDAxSVN3YzFEemhTbnBITys2emUyZGdZclhndWI2QncycTA3Q1h2Yi9ncXU5TUN2OGNFN1hMMXZzV2sxZVRtNGZrbVBkWmRycTVRSnVSMUlIRDZqNTRoVDZvdjhFaWJYNENBRjJ3YjZyTTZkdHA4R2FzV0RHYVA2NjBub01FYUZoT3VhLzZRV3NENDY1QmZ4Mko3YzdGNGZLYXdFSUJxU09IQ2FiSG8wdVNlb1lkODEza25wMWhZcTFLdXRFREltbmJuSTJObCtwdzNkYmlpV2VUYjhkOHVHZmJzTENWVUdnZStjNzF3SU9RN1AvSlVRT0JGWWordkFNSHg2Qk1MTmFiaCsvYWkycDBELzQ3MVhZWjlNNGFvL05GUTd6SjBoTytiVzFVQ2RMQlN0cGhJUDZrRXhhMDFLNGQ4UEN6T2RGSDhaaTlaclk5SkJBRVN6c2E0eDFqbkhGNEJnc1ZSak85enp6ZzVLS05QRkY5RW4veTdjNWYrZlRRQ0pOcXhINjkzTDhZQkZsMU51WGIvZzJJZWxGY3RnSjU5ZWduOUs1YmhWV0hRcVZJRnkydnMrZU1mMFNzeGFKaVVZeUpoQnJZNUR0V2RQbmw5YkZpaGdzVHN0MmMrcGxkL1RNTUxkOHN2djJzdmlEZG1IQ3ZIMTZzdkozL2NaVEFCQWk5QS8zdWE2VXVpZEdYcHN6TkxoVUk4N051L1gzNVNxeVZZaFVMTG16ZVB6RmRmL0JVdXpxZ2ZqWWFRcHUvVmkvaW9JNHNFS24rWjN5R0JOaDRpSkZvQmdoVk1oRjdoT2ZFRlZLdjF3M3FpOHI5bDQrTW1RSUs5eFdiTWZVdFgva0FyZStIWk1rK05BM2daVE1PS0ZyNElZRmR2ZS9UcGwrWFJwek1MRDBRaVFQeGZrcmdlSmxib3p6dGVzTko0VThmK2FpVTNjeFVRb2dHcnMvQlltSWFWV0d3WWhad0U3MHNhOTR5OEpLOG5CS3VVN3lxK3BrSVpyb0dYMldhMVlveUpFQ1pmcG1IOFg5bncza1B5bXZ5RkFXQ25IN2YrcWxhZmo5YXJ3S1poc2dWUG5MZC9UTkRlbVRrc3kzRTQvNCsvdCt1VlE3UHE1V1djREFMazVURVBxbkt5RndkdSs4UUt0K3VGQ2JUc0JFaXM3d3IvbDZDNUNYRDlVM0hGbURMaFllWjNON2J2ZDhqcWNpempQdGhueXZ1emgrOXNKUGUwdmxuL0NHR2ExWnM5SlBBaTExWUZKa3FxTVlGN2hmZHU5cEwzbFBkdmZrUko1ak5IOTVUcmxJZkh0RzkvMkNxWWpPQjVLeXF2bkhjc2hmTm0rKy9kTDBETTcvSGV4R2ZLZUdLOTUwRndtODhVM3VlWVVIamZIempXKzQ0eDU4WnFlMXduSHA4cHZCZmVuamsweThveFBFbVlOT01ldlFVWDhENnExeUhUNDRaNzhBcVFZR01CNzFZOHZ6L0t3QndMb1Fndms3ZmFJWDRIbGhmV3ZDT2lNRDBjSCt6ZDZyMGZmejVYTE8reW02NjdRaVk4MmpWd2VYaGMxbS84V245UG5LZENrRTg4V0FVU0I3ejMwUmRTcTFWbVdLWTVDUXRKM29WQlhBUDNXTHpvVVZrV0VERDI2cW52QWl3b0lZY0tnaDRlZVc4eGg0MHFxdUtqenpicFN6K3JQTkI0cjRkckVINllpeUF5d3lzNjV5cXZndkZlVDVyMVJtQ2hJRklieDJQTzRSVWczbWZBSXUvaEt0L092eGpnTFFBRWIra3hpaDg4bGQ3RmlUZmYrMWgrVmpsbmFQY05lVTR3SDBPTFplekg2OTA3NnVIMmh5em80ZjR3SG9JdEpGR0FwS2dBd1ljYmlaS21CWE5sdG05VVM2MTZ0QXdjMDFTRjh5Q2UyZHRtUGZXUVZ1MW9tRWoyZjNLR2pKMjJRSWNINE1QVFZya1RJU1R3WVVXREIrVHFKajJ6WENNZU9TRDQwc2VYdjJtb2JvRVBuMW1kclY3NUVyM0hodmxTaGRncWUrTmRVWWRqbVg2aUZTQ1QxQXY1eG9PZUdxd3NQalQ4ZVgzSm5CQWdTMVorcUNkaCtLRGpwWS9RbzhNS0ZWQVQvTWNDS3cyWVBIZFNvVms0RmcxZU1vU2M0UXNBRFY4TVdGR0RnRURMVG9DVVVxczRiODU0TkRBNXdZdWtRNi9SZ1kzVklINmZIWFJYUU9oQVhGUzZ0WHZBZmsvMDdxaGR0R2o0MG03VzdURkJ3UVRUc05yMzVDTjNCUDZOcW14NE9adm1IN3ZZNVJhcldhWmhwUmVyK2FaTlZHR0YzVlY0b1dsWThSdmRwMlBnM3hDcjl6MDZRVS9NTU1uRjUyZVk4bzZZQ2N0ekx5NlNlNGRNQ0J5UEhBQ0VqWm1HRmNyZW82WnFkempZTjFOZUZYd3VUTDRQamt0MEFRTGh0dXJsNFlGNzl0c3NPd0VTNjdzaTJKY2dRbjRRbW9BU21oQ0ZEM1ZxcENmOHBpRU1xMnYvWndML2puWGNCeTRVNGk5elZZNE13akhROEs0N1ZvWGErTVc4T1JWaFZqZXJ5UllTMUVNMVZOdDdSeTN3bVBiVTFQbnk4TWdwQVc4a1FyMndtR1RDZ29LRmJvVzZ0bCtBUUVqMkd2RzhUSGwxbVg1LzQxMkptUG42TlNwbHVRUUtrSFJRWWJzSUwwUEQ1QWZWaFl3bkFDR1NwMTNaSWt1aWZheTJSei94K0V5TlZSN3loaXFNRFEyVEhualJ4czFZb1ArTy9WcjZkV3NtU0ZZMnJkVjlJd01yOHZpWmYzS0taMzExOGFxQVovOXQ5WjdkcUVLUy9BSUVFOTM3MVB2aDVkZmYwVndnNHNhcTd5TjR2RXl6RVkvQkJBajZSVGlTWGdoUjM4VW1WRHJXZDltNk9VOUl5Vk15UEY3d3JOVHIyQytRTzRIMzMzQ1YyTzB0dUZDbjdTT3l5dU9SOW5yNmNRMTgvOERydmUyM0RDOFpRdmxHcTNlNVdhejB6eEZ5T3dja1VodkhZODdoRnlCZ2cyZ0RMREpnem5UemRaVmtuUG9lTm9zTStPeGhzYzNiSXMwQmlXWHN4K1BkaTMza2xrOGJIRmdrd3NJZEJMdVpjMERNanVqVlBoQitoV2VrQUVsUkFRSzErZmtieitySkVOb3NGY3ZhN29FbnNneHNyNWNFOGJFSXYvTEdNdnUvd0VhcldOWSthcExsYnowNzNxWnI0WnZXc01zUUhiOXZXcXdDQkI5TzdHOENyd0xhMm8rL2tocktWZW1QNGIzeThndGs5dE9acXpQWXp3QmZRTEcwYUFUSXpTcSs4N2toR1N0S2VORlVidEFqc0JJYWJ3RVNLbWZIWDNrTFlVVGVDVDd1RFN0YmEyYy9ycitZMFZCN0hSTSt0T3dFaUhlbEE1UDJpcXJpaUJFdmhyYy9XZmY2RnIyMDdkQzZOSzhiV0tXRWFNTFk4amQ0a0l3bnhMK3BKcjRVV3gyY1NHQjFFN3ZjK2h2eUNZeG43YVBQdnNteTJ2bithNk4wTEhXNDhUU3dlM081UThWMG8yR0NnVTBvTWJrQXQwOFdqZzJJYm16Z1Y3ZGRabGlPdVkvT1RldElmelhoTVMxUkJRanlibW9xTWZXZ3lodnplcFI2ajV5YUplUW5uQUNKeDd2Qy95V0lrSVVIMUplMXQrRkwrOE41WTFRK3lESDZ4MWlwdmJacFpvMzhXTWY5SVlQSTk0TlBWUWlsbDVINU5WWTBkL3kzVTA0K0llTytURnYzNmRmcVhkWHJrRDFWek84eCtSOC9PSFBDRVd4elF1UWd0TDR0WTlLTWR4N3lEU0lwMyt1M3lXTXFUR2p3MkJlejNCOUUzV2VMbndtc1R1TDY4UFpCZkhvYjN1OTR6NXVHWTVDamh4WVAyOGZqTXdVaCtQSENwd0lUb0dEZlYxaGNXS3FxUHVMOWhvYjlGTEN2Z21uZXlTa1kxMUw1UGNIQ2l2MEN4TDhBZ3V0QjBPUDlhbHFvNzg5Z1k4NHZRSkREQ2E4K1BHeitGc3U3REl1SXlBRTFua1dzcnZzWElmRzkrK1hTWndQZElpcGgrUGhYQXY5ZVBtMUlJQXdZSVhySWJmS1grMGJ1Q2haMFRQTW1pTHNVSUtGc0hLODVoMWVBNER1b2V2TUhEM2tYb0VJbTNsdW1uVnE1ZWNDcmdaOUZJa0JpSGZ2eGVQZWlBcGxYM01PNzZJMTZ3TE5BaEw3MzZxakFPNVFDSkVVRkNJd050eXJjcTJod0FTTU15NFJUSU9GczQ2S25BNU1vL3dvdnp2RnVFSWdYWCtrYUhRS3JHdDZYb0YvcytGZWJZeFVnL2c5ZzYvdEg2YVM0WUczUnBBRXF4anFqbEs3TmFtSFFpNmtmMmdvUVRPWldxeXBrK0QrK3pCRWlnZ21xYWZFVUlGaFpoVnMvV0p1aGNpTnFWTTNJUHdpMnFtTE9tZk5NYnhYbmZJSCtKMVpuTUVsR0N5ZEE4SEwrYXVuNFFKaUJmeFhhWEJ1clo5Ky9Nem5nSmZGUGFFTXhOejkvZFZ3dlFkVWJOS3orVlZGaFZLYmQyKzRXblh5UEJzNjMzVGxZRnlHSXBDRm5CbCthcG9WYW1heUVxbEJxOWRtMGFrMGYwQ3MyL2trajhxdVFaK1Z2MFZic3dVclJaQlZIRzZvaHNSK2ZzVWlhTndjRW5QeVZtZ3FvUkhsdnVKbTVKb1JpN1RaOXNpeEloQk1nOFhoWCtMOEVReVdndmpqNkFaV1Vmb20rVlV4NExxbVRXVm80MW5HZkhkTWZWMDNKd2d2anN0dkFad1hWQTlFZ2VNZXJ4UWZZMExSdzRhRHdGR0loeUxRUno3MHFBOGE4a04xdFJQUjd2ekF3NFVQK2t4ZE83QmNJYlVYNFN4VzFZT0p2S0tTQjJHN1R2S3ZnOGJCOVBENVRmc0dQZDJNdzc1TlhUS0U2NUJsWHRRb3NabmtGQ0NiOWVEY0VhMzRCRWl3WkdPZDV4d3U4cE1naGlhVDVCVWlvMHZpeHZzc2l1UmNjNDUxSVAvUENRdWs1ZEpJK0ZkOXpYNm13WXRQOG9iem01NWh2ekgwMmM1eDNWUW5aSnEvUHBRQUpaZU40elRtODNNYlBYS1M5N1A1MmQ4dDYwdWV1ekpMY2lFU0FKOHEwU0FSSXJHTS9IdTllYnpFQS8vZTE5NW01RVdIV0VaQ1NPU0I0UkV4QThZVnNXdU91UTJYUmlnLzBQLzByRXQ3VmFYTzg5OHNjOGM2b1NoT3FlU2YrL2pqUldBV0kvOE9GRlVEL2FydTVMOFNEZG0xMWsvNG5KbHpZVmQySXJraGZ0dDdqYkFVSVFoWGdja2J6Q3pIOExKNENKTmkrRHViZU44eFhxOFFIazd2aGhWbXVLbElGYXhBZnBtU3p0K3BZT0FGeTJra29jcEJad1F3Sm5XWTExTjhIVm5aTW5rZXdGekR1c2JFS2w0TDM2cHlTSitzd0QrTzE4MTdMWHhFTks4MFFldDZrU1V3QzMxQmhYQWdQV0t2K0hxb3lrVCs4QytGOHlESHdONnpXM0tZMnBUVE5USWo5SGo5NFg0SWxaa1lyUVB6cy9mZmxYNEVNTjY1dGQwTEh0WkFrZXJjS29mQ1g3ZzRuUU9MeHJvajBTOUFiM3VnWDRiR08rM0FzSWFpM3JjbmNvUmtWZlNyZjF2MFFUZ2hQWFBuUzhNRGlEajU3dDNRYUdQVFNXSGwrUzRVeWVuT1dVRHAwd1Z2djY0V0xWZXBQcUJMcTJiM1BJaFVnWHFHUDNCTVV5L0EzL3lUbzVvNERCRjVKdEhqWVBoNmZLVzhCQllST3paajdabEJFcUQ2RTk0MXBYdkhnRlNEQmNsM01PWkVLa0dqZjkzNEJndjE3OEw3M3QxamZaZDdySVhjS20vQ1dVd3Q0SlU4K1FiKzNnMjFTNm4yUDQvc0RpMWltZWVjWTJZMVA4M3VYQWlTVWplTTE1NGhFZ0dSWFBqZ1NBUkxyMkkvMTNRdlBOSjdWZU5KUWZSSUxNOEVhQlVoV0tpa3JRUER5UU9nU1ZpbjBGNFVuUVJtaFN1WWxIRXBjdkRsOWlDQ3VEdzA1QmxqTkQ5Vzg1V2I5cTVLeENoQzRpRTNjTjBURk1XVXpjMEg4OStQUERmQ3ZKa1Q2VWpUSDJRZ1E1SHhnY29UMmcwcW1yblJydDBOS3VFYjdoV1R1eDV0c0dFNkFiRlVUcFZEVmJrSXg4RTdtd2drUUZBTEFxcWx0ODVjZHhrdStsOHJyOFNlNUJydHVzSkxNOEZBZzFBMlZQL3dOT1VCTFZiN0xlSlc3NFhjRGQydHpzL1RxSEhvTWhYcXV1L3M5TGFna05QamVscXBNYVMxOVdManhtQXdDQkxIeENLRkRHZXYzbFdpYk9YK0ZJR3dvV0FzblFPTHhyb2oxU3hEM0hPdTREemVta2MrejViM01rRTdrcHZSOUlsT1FlTTk5NFltZWNuMlZqTVJ5OEMxWnRWWElTeU9rYTZyS0tVSlZPSCtEZmQ1WDNxZ3BLdGNGdGdrV2doUHF3cmtsUU9KaCszaDhwbDRaMnl0c0piRlFuTHpoUU1rbVFHSjlsNEVKeGpYeTRieUxMZUUrQjE0QmdzUnpKS0NiaGdSMUxFRGF0RVFVSVBHYWMrU1dBSWwxN01mNjdzWEM0VGR2WlhwM1FubkNNQzRvUUxKK09sSldnT0F4SDFXbDlkbzFxcW1mR0hISzUxWnZKMGVyU2lHZnYvRk1JUEZwa0lvTFJobEJmOFBLWEpsU0pmV1BVY1lVbFl4Q05lL0UyQzlvWWhVZzNsajg3UGJpOEs4Y2hmT1dSUEtTakZTQW9PckpHaFhiYVBKVWtJeTg5YmMvRCtuaVhMWEtieExPTURFeGRkRjdESDR1YUtsWi93VWlFU0M0UGw1OHRnMUpnOGdEUWdzblFQd1Q2MGo3ZVdYUkttbjdRRVpNdEQ5eEVsNGFoSEloOXZ3M2xXU0pFdjBvQzNuWkJSbVRzbEI3d3NCTGdkcjFxUGVQQ1plL1NoTE9SZWdEa2lMTjVBM2xNN0dDYWR1UXhBNnZWcVRqTVZvQlludGY0WTYzTGNNYjdscmhCRWc4M2hXeGZnbkdZOXhueDk0cmNMeWhLUDd6K25adHF2T2NUUE5XRXd2V0I4WnRmYlViZlpONlYrc2tkMi94QW5NOHd2OGFkQmtjZGw4Yzc3V2pFU0FvdFhxbHBRY2tIcmFQeDJmS083SEp6bzdlM3lObkFlRzZhTWttUUdKOWwrR1p2Y25MK0RjMklIMVJpVjBzY1AzMXo3K2F5MEtWVDJlK3Q3d0NwUFkxbCt1U3g2YWxpZ0NKZER6aXVjUE5PWEpMZ01RNjltTjk5eUlNLzlzVmt3TGpJSnlYbmdJazY5c3BwUVVJSm5CTFZOS2RhUWdGUUFqTlNGV05BQTBydUpmVTZSTFV2ZXRWMWFFbWdPYTY2TU5NRnYzZWtsZ0ZpSCtWSjFTOExlN2xrYnR2MXh1WG9VR3NZQ00xbTFWRC94ZFhwQUlFcTVkTHAyWnl0dmtDeExHUkppaEhJa0J3dmUvZW5oUUlmVUk1d2hacVF5ZWJGazZBd0N1R1ZVL1Q3aDg2VVc4eVpkTzhOYzRSZDE1VEplcjZOL3p6aG9aa04vN1FONnI2b0d3cHF2YmNvdXJSZTBzQjkxTjdLSXlhK0pxK1JmL21tNGg1eHoxRTJucW8vSk1IRCthZjRKd3pybXF0cXpUNVd6b0prSGk4SzJMOUVvekh1TTl1REtCc3VhbDZoV1JkVkE0TTFyeDVFZmo5OGVXYlpLa2FGYTRmaENDV0szT3VGaUszMXFvY0tKYUFjNURuZEd2bnlONHp1U1ZBNG1IN2VIeW1wbys4TDdEdkRoYUE4RDFoMjVKTmdNVDZMa001OVBWek0vTmNRdVdwaEpwSSsvUGtJdjBlODlvbEVUMGc4WnB6NUpZQWlYWHN4K1BkaS9CVUU3SVhySUNJc1RrRlNOYTNVa29MRUR5cU56a0lzWGw0NlpqU3VrZ0VxOTMya1d5L1JGSDk1endWNng1c0YxekVpcUpLaGdtbDhTZTB4eXBBL0RHUXdjb0Ztd2Z3YnF6b0x5TnErMldFNHlNVklJajd4cjRVMGJaSVg5eVJDaEJ2VGc3SzRjRVRCRUVXYVFzblFKQjNzZW10aVlFUUwxdUJnL3dOVktzeERaWEtVTEhNMzBJSkVJU1dsZklrK1NMa0Q5NGtiNE1ZV2ZMOHdFQjVTZXhOYzRXcTFJV0dkYWFlandBQUlBQkpSRUZVZlM2dzM0VnB0Z0xLditxSEtqcW9wdU52NlNSQXZCUHVhTjhWOGZnU2pIWGNaL2Y1OE81M2dKREZpMVhDYUxEUGxmZHo2dlVzK3ErUDkwWUJGUUtEaG5lclAya2FzZFdUaG5ZVEpJR2JkdTYxN1NMeWd1U1dBSW1IN2VQeG1mTG0vNEdWN2NJQ3prazJBUkxydXd6N2I2Qjh2V25WbXowWU5BUXoxRVFhaXp3SUt6YWU1MURSRlBEb05hK2Z1ZUhyb2hYckFvdWVpU2hBNGpYbnlDMEJFdXZZajhlNzkyMjFyeGZLaHFPaGlBbnlpb00xQ3BDc1ZGSmVnSGpWUE1ydGVwUExURng3c0lIaWovVkg2VDJ6TWFEM2VDUjk0d05nR2dTTmQrZnE3QVNJZDNNdlhPTzBLaTJ5cklhalRPekd4ZU1DdGZCRGlTYnM2QTRCWWhwS1RxTDBaQ3d0VWdFU2FSKzVsUVBpcjJFZXppV0tWVFRzMm8xcVdhWmxWNGJYWC9lL2ppcERHMnkzY255NW9HSVZxdnVZalRDUjlBNVJITTVPR0tOSTVEWGxWcjBlRUlSZGJWYlZ0VXhEMVNCYzM5KzhwWUt4WHd5cXdLRmhoUmtoaUdadkJVd1FLNmxrNG1EaUd2dWxvRUlQNHYxTmc3aEJicFhKc1VGNVk1UTU5amQvZFpOSVJXYWtZeW1TNDNJckJDc2U3NHA0ZkFuR091NnpZNHFkbnA5Uis5dVlGcXl5RlBaVVdLUEd0MWtOZlBuMWxkTCt3YXdsME0zNTNoS21LSUZhLzQ0Qmg5eUN2N1F3OXRQeGw4a05kdC9SQ0pCUTFXdkNKYUhIdy9ieCtFejUzLytoZUlJVnFxaWhBdHpDdDlabVFaZHNBaVRXZHhsS21hT2t1V24rNzI3ODNMKy9nNytZeUxLcGd3TmxqZkVkZ29VZWZ3RVFmMEVjN3hqR2V4U2hqYWFObVRwUEhoNHhKYnVQNGlHL3p5NloyNXdRaVkzak5lZUlod0RCWWpHK2IwMExsdWdmNjlpUHg3dlhuemR6bmRxVTJwOVBpTzljZlBlYnZFMlc0VTNoTXJ4bXdLTFMwRWVxYXBFL1BoNlZRczY3cmwzWUtpdmV2VUlReXRSNzFCUWRib01YREw1Z202b04zYkNabGZteXhlWlZHSGplbHAwQVFhdzBZcVpONjlEclNVSENNbUpPemVvaVNxNWlJbXNhTm81N1lOZ2tnYUJDUXpVTzFOTTJ1N2FHMnB2QzlxMldyQUlFSDNSVXFqSTc4b0lqVnFlZVZpVmNqUkJBbmZxZWlpc21WWmlFMSs4MFFKZTdSY3RPZ0NBOEJKdXltWVlKUHFwZXpGKytKaER5aGhLakExVUJBVndMRmFvYXFGSzVzQXUrTkw5ZVBpRlF6aFRud290Z2RyeEZOWlpoRDdRTjFKWkhIMzV2bG5jVkJlRlBDRXN4RzZmaGVJejUxeWYyRDRUTElLNzVCbFhUM3pUL3ZnYW8wWDdQd0djQzk0QVZ1eHRWTlROc0pvaVhwZCtyaCtSMzdQZGlHajRUQTU5NlFYK1c4SHd0NmxlWGZ1cGNieUdBVkJZZzRCRHJ1eUllWDRLeGp2dnMzZzk0ejcwM2E2VGV0UnNOWlkyeHdhZlpCQk1lRFFnVWt6dUhZN0FQeVBzYk12YS84VGR2REQvQ1lmRVptdnpLMHNCaEtKR01HSHV6T3ozZTJlZFVhNU5sbjRCUTk1eGJBaVFldHNjMTR2R1o4cFlWeHpVaC9oNVJlMWNaenhLRVRodTFKd1Z5d1BLcXZKdE9hcU0wbEdJMUxaTEpLWTVObENwWXVKZFkzbVgrRUNva2tLUGFINnI2d2Z0MjQ3VVZaV2pQMW9IY1JtMG4zNmFzU0Y3SHByYW1vU1E1eHJIZU1GRTFGTHQ1WnVCZGdVbG5zTTJLZjFqMWZHQS9LdndlWlo0Umt1dWRBNFFhNStibjhSUWd1R1k4NWh6eEVDRCs4RzVFc1hnMzFUWDdvY1V5OXVQeDdrWHA4WGRlSEJhby9vZjhWbXhvYWphdFBQK3NVMlhVd3gwQzJ5U0FNUVZJR2dnUUdCcjdHZUJsNDIwb1A5cW01Nml3bjJ1RWF5SGUzK3lDaTRPeDQvYVdYMzZYNDQ4cEdzZ3p3TS94d3FoMmUwLzUzM2MvWjdsbWRnTEVYd3ZmOVBHZnFtU0VjQU0wVE9RV3FnbWx5VFBCenhEcXNWa2x5bUcxL0RpMUk3RzMyZXc2R3c1QXNnb1FQQk9xOEV3ZmRYL2doWUNmb1NReGtndVBLRkk0Uy9Vby9Cd0pyaWcyZ0phZEFNRXgvamgzL0F3VDhHMHErZjY0NGtkbEdUT29Dblo5aTRjQzVaTzl4UkVNZjVSV1JqaUtxZHJtdFF0K2h6QXkwOHFWT1VlVmYreVRwV1F2dnJpK1YvWFRFUlp3dWZLR2VTZi8vckE5VENSbmozdFlNUGE4RFVKcys3Ly9xWTJTaW1mWjd3RWhWbzN1SGhJUXhCQTRLOVhMMXBRWU51TVJYN3JIcUkyN2dsVWdTM1VCRXV1N0loNWZnckdPKzNEdkF2TTdDR1M4VDczVjIxRGdZK2V1M1lFRkVITXNoQ2xDL0VJMXZGZnhmZ1U3MDFDUTRRdFZqQUdmaGNzdU9EdXdpSURmWXcrWUI0ZGxldi9DM1c5dUNwQlliWS9uaU1kbkNoN1RwV3BGM3Z0OWdBa2EzZ3RLYjZnRmlXTUN5ZFRvMCs4WlRrWUJFc3U3TEZnWmFDeFcvYXpDQzR1cTk2alp2ZHc3em9KNTlMeWxtSEVzcm9IUVdDeUFlWFB4SUtEcmRlaDdpQ0QzVnVVMDUrTTdxYy9qVXdVZWwwaGF2QVZJUE9ZYzhSQWdXTkQ2YXRseldVck9ZNlBIdkhuenl0V043dytVd0k5bDdNZnIzZXV0Wm1kc2huY2pQb1BlY1dCK1J3R1NKZ0trMlUzVjVQSGVXWGVMam5SQ0JPVTZYZTBuNHYyUzlMOFE4S1hadFB1d3dBcTY5L2ZaQ1JBY0cwd2crUk1Kc2JxSmZUWk0va3F3bHhKVzk3dW96WjRncnVMUmtsbUE0UGtST3ZIMGdDNDZRVHRVdytTK1M5K3hXZklZSWhFZ3VCN0M3NUNRSGF4ZXZPa1BuZ21zaEhoRHZQQlNuZkg0L1lHTkJ2MzNocFhscjVXUU5Uc1d3K04yU3FWbVdWejdXQlYrcWw5bkpZU3ppay92dGZBbGhnMFFVYkhJMzVETDhrU2ZPN0o0TW9JeGdyZXQrNkJuRDFsMWhxREhNM2hGaVBkOFZQVnFmbk5tM0hPa243ZDRqRnR6amR3S3dUTDl4Zkt1aU5lWFlDempQbEwyVmN0ZktCTWZ2U2ZvbDZxNUJzVEhnOE1uWjV0N2hhSWdreC9ybnNYakYrdytaczVib2F1NWhkcmZ4bjlPVkFJa3hFYUU0VUt3NG1GN2M0MTRmS2JnblhwZThUVHg2TUZZWWdLSEVGMS83bGt5Q2hBOFh5enZNdkNhUGE1M1lOOG9QeTlVdFN5c3dxQk44UVhzVDFOWGhkeDZHOTduWTFVdWlka0RLeGh6TE83QVd4aHN3MWpreXlITUNGNFhiOFBHZmE0RUNPNGoxamxIUEFRSTdzUHZqVEdNS3QvV0k4c2VYTkdPL1hpOWV6RVBlRzd3M1lMeXpNRWF2Q0tmZi8yRG5wZWdVWUNraVFEeDcxYU9sVnBzb0JacFlqSkNVcG9xRVlPOUxrcWZjNXBlM2NaSzk2Yk5XK1NsaFcvTExPWHEvbS9uN3FDRExoSUJna25jUTUwYlN1MXJ5c3NKeXJNQ2J3ckNkb0xGMWlPZXRGR2RxcXBTekRsNnBRdVQxYzAvYlZQeHZCL29ldm5CTm9XTGRHTGhQeTdaQlFpZUIyeGIzbEpkYjB5SjVHMjhWQ0h1TnFrdmxqbXFRaFkyN1BKdmRoYXBBTUgxTVlGcTA2Q0dyajRGa1lxVllZeU5qNy80Vm84TGJHd1hyQkladm13d1FXK29iRm42N05QMGVUOHFUOG1TbGV0bDlKUzUybVBuVFpCRWZEeml1cjBONDdyWlRkZEtyYXZMNldwQjhKNzhwMWFpSVlpeFVScks1bUpqdDNBTkwxK1VCWVkzQkNGOEtBR01GY0JWNnpiS0MycnZISVJ2aFdwSXFPL2FxcDVjVitVeWZlNTJOUmJYS3NIMXpJeUYrb3YyNTlWVEF5dmw2U0JBd0NuYWQwVzh2Z1NOcmFJWjl6YnZDYXp1b2dSbnJhdks2V0lIZUc2OGV6QnVKcnowaGs3RWpMVGhzMUMvUm1VOWdidjQvRE8xQnhHZm1aKzIvU1pyUHZwU3BzMWVIZ2hsaVBTYXVTMUFZckc5OTVuaThablNQRlZaNDV0VW1PUWxxa0loeXFQL3F6ejM4UDVpczlLcGlpZmVFZjZXckFMRVBFZTA3eko4bjkvWnJJN1VWc1VPc0FuaC9nUDc1WCtxTlBGcmI2eFdJZGNMMWQ1SHJkVDMvelc2RzRpM3M2OEpIZ2FJNzRBbTZsMWFVZTBWZGF6NmJ0NjFlN2RlZUVLaEVvUU9ZVFU4Vk1Pa3RIdmJXMVRPU1VuSnAxYjNmOXI2dXhid1p2UGs3TVo5dkQwZzN2NmluWFBFUzREZ1h2Q3VhYUcreDg5UTd4b3NyR0g4TnVuNnFONXp6TnVpR2Z2eGZ2Y2liNjJGS2pxQVVOU0NCUXJvK1JuQ3M1K1lQRmVRZDJSeWhpbEEwa1NBWlBmaDVlOUpnQVJJZ0FSSWdBUklnQVJJZ0FTaUkvRDd1cGxXSjZaOEZTd3JHanlZQkVpQUJFaUFCRWlBQkVpQUJFakFpZ0FGaUJVdUhrd0NKRUFDSkVBQ0pFQUNKRUFDSkJBTEFRcVFXT2p4WEJJZ0FSSWdBUklnQVJJZ0FSSWdBU3NDRkNCV3VIZ3dDWkFBQ1pBQUNaQUFDWkFBQ1pCQUxBUW9RR0toeDNOSmdBUklnQVJJZ0FSSWdBUklnQVNzQ0ZDQVdPSGl3U1JBQWlSQUFpUkFBaVJBQWlSQUFyRVFvQUNKaFI3UEpRRVNJQUVTSUFFU0lBRVNJQUVTc0NKQUFXS0Zpd2VUQUFtUUFBbVFBQW1RQUFtUUFBbkVRb0FDSkJaNlBKY0VTSUFFU0lBRVNJQUVTSUFFU01DS0FBV0lGUzRlVEFJa1FBSWtRQUlrUUFJa1FBSWtFQXNCQ3BCWTZQRmNFaUFCRWlBQkVpQUJFaUFCRWlBQkt3SVVJRmE0ZURBSmtBQUprQUFKa0FBSmtBQUprRUFzQkNoQVlxSEhjMG1BQkVpQUJFaUFCRWlBQkVpQUJLd0lVSUJZNGVMQkpFQUNKRUFDSkVBQ0pFQUNKRUFDc1JDZ0FJbUZIczhsQVJJZ0FSSWdBUklnQVJJZ0FSS3dJa0FCWW9XTEI1TUFDWkFBQ1pBQUNaQUFDWkFBQ2NSQ2dBSWtGbnE1ZUs2dG9YTHgxdGdWQ1pCQUFoQTRjT0NBWlA0UnlaTkhKRy9ldk9yLzZpOWgycTdkdTJYSGpuL2x0OS8vbEMzYmZsSC8vME4rL1UzOStmMTMrZjJQUDJXNyt0M3ZmL3dsLzJ6Zkx0dTM3NUIvLzl1cC92eW4vK3o0OXovWnUzZXY3dmZ2ZjdhSDdPV29JNC9Rdnp2c3NFSnlXS0ZDVXJCQVFUbnF5TU9sU09IQ2NxVDYzZEZISFNWSEhGNUVqaWxlVklvVlBWci9PYlo0TVRtbVdGRTUvdmhqcGNRSngwdWhRZ1dsVU1HQ1laOEY5N0Z2M3o1MVRCNzkvSGgyOHljQlRNUmJJQUVTU0VBQ3hTOXJtSUIzbGZxM1pEdXZ6VlBzMGdZSFVoOUw0ajJocmFFUzd3bDRSeVJBQXZFaVlJVEcvdjM3OVNYejVjc1hVbWpzMmJOWC92enJiL24reDU5bDh3OC82di8vOE5NVzllZG4yZnJMci9ydkVCMjdkdTJXWGJ0M0tVR1JNWUhYTS9nc3pmUHFEL3cxbXErRGc5Zk5jdmtnZlNreGtUOS9QaVU2Q2tuaHdvV2tlTEZpY3VMeHg4bXBKNWVRazA0OFFZbVNqTCtmZHNySmNzYnBweXBCYzRRVUtKQS9LR0t2TU1tYmw2SWtYdU9RMXlHQlZDQkFBZUxHaXJieldnb1FOM1lTVzBNNXVrMTJTd0lrRUdjQ2ZzOEdKdVhCMnU3ZGUrU25MZHZraTYrK2x2OTk4NTE4dGVsYitWcjlIMy8vNmVjdDJuT3hYMDNxQStKQy94MU4vVi8vTlZOTXdHdVE0VDFSUHozNFk5eUhhYUgrbnQyamU3MHh3ZjV1K29Pdzh2YVJjYys0dWhFdjVzWU9TRjUxMHVGRkNzdnh4eDBycGM0K1U4NDVxNlNjVmZKME9mdk0wK1c4Yzg2U0VpY2Vyend1QlE2NXRReFJzcCtla3V5TXh0K1RRSW9Ub0FCeFkyRGJlUzBGaUJzN1VZQTQ0czV1U1NDM0NXUjZOOVRrV3EzV1F3ajQyMzg3ZDhyR0w3NlN6Ny9jSkI5di9GeUxqUTgvL2t5MktZOEdoRVpXN3dVRVJvWjR3S1EvWDc2TTYzbUZSYlNDSXFmWkJCY3BHZUZWYUJBUWdYdlhQL1I0VXRRREZpbDhtSng0NG5GUyt0eHo1TUx6ejVWenp6cERMcnJ3UERubnpETjB5SmUvSVh3TFhPZ2x5V25MOHZva2tEZ0VLRURjMklJQ3hBMTM2MTV0RFdYZEFVOGdBUkp3UmdBci92djNIOUFUYTRSVGVSdCt0L21IbjJYdGh4dGt3NmVmeTVwMUg4bkd6NzlTNFZPL3lONTkzaENvVEtHUlB6OUNrWkFUQXFHUmtSdVNJVHFpQ1pseWhpV2lqbzFJeWN6M3lCQlhHYmtnYUNhY0RPTGtnQlRJbjFmbGxoU1RTeSs2UU1wZmRyR2NYK3BzS1hmSlJYTDZxU2NkSXZhOGdpU1lFSXpvQm5rUUNaQkFRaE9nQUhGakh0dDVMVDBnYnV4RUQ0Z2o3dXlXQkhLQ0FJU0FOMy9ETHpnKy8ycVRGaHByUHZoUVZxNzVRTDc1OW52Wm9aSysxZHE4bmtSbnVDL2dJY21yVit2VFFXalkyaUc4TURrb1NyUW1PU0NIcTJUNE0wcWVLbFVxWEM2WFhYeUJYSEg1WlNwODY4eERCQWtTN2pQRDA4SW45OXZlTDQ4bkFSSndRNEFDeEExM0NoQTMzSzE3dFRXVWRRYzhnUVJJSUVjSm1KeURZR0ZWMzI3K1VWYTh1MGJlVzd0ZTNscjFuaFljTzFWT1IwYkxFQnhlc1dIRVN5cDZOSExVQ09yaVJwaVlIQmQ0bmpSUFR3alhZUVVMS0VGeW1seGR1WUpVS0hlcEVpYmxWS0w3S1ZsdUxjTnJ0VDlzQVlDY2ZoWmVud1JJSUhZQ0ZDQ3hNNHptQ3JielducEFvcUVjaDNOc0RSV0hMbmtKRWlDQkdBa1kwWUc4QzI4K3d6K3FuTzFxSlRiZVdmMit2TDUwaGNybCtGcTJxNUsyWHNHUlVkbEtkR2lXTjR3cXhsdmk2VUVJbVBBdDQwM1M0VnNlUVhLRVNuSXZjMEVwcVg1VlpibTZ5aFZTb2V6RlV2aXd3d0pYQ21WbndpWUJFa2g4QWhRZ2JteGtPNitsQUhGako0WmdPZUxPYmtuQWxrQ295U2oyMkZqeTFrcFpzV3FOTEh4anVhcFk5Y3ZCU1c2R2g0T0N3NVowemgwZlZwQWMySzlLLzU2a2hVak5hNnRLbFlybDVPUVNKMUtNNUp3NWVHVVN5RkVDRkNBNWlqZmt4U2xBM0hDMzd0WFdVTllkOEFRU0lJR29DWmljRHYvR2Y5aHpZOW1LVmZMYWdqZmtiUlZpOWNkZi94eDBjbVRrY0tDa0xqMGNVV1BQdFJPOWdzUy9UMHJSbzQ3UVlxVE85ZGRJOWF1cjZMMUpURFA3ajRUYnB5WFhIb0lka1FBSkJDVkFBZUptWU5qT2Era0JjV01uZWtBY2NXZTNKQkNPQUVKMVRGS3lPUTU3Y1N4ZXRrSm16VjBrcTlhc2xULy9QcmhEdVBaeVpJUmltUXBOek9GSXZ2SGxyN1lGQVducUFoYzk2a2k1OG9yTDVhWWJycFBycTFWVkd5WWVIM2hBczdlSnY4cFo4aEhnSFpOQWFoR2dBSEZqVHdvUU45eXRlN1UxbEhVSFBJRUVTQ0FpQWliNU9LUFViVWI3KzUvdE1uL3hjbm54dGZrK1QwZEdrakxhb1p2clJkUWREMHB3QWw0Qm1wRTdrckhQU3JHamoxU2VrWXB5YTcxYVVyUGFWVkwwNktNQ1Q0TGovTjZ5Qkg5TTNoNEpwQ3dCQ2hBM3ByV2QxOUlENHNaTzlJQTQ0czV1U2NBUUNPYnRlR3ZsR3BuKzhteFpnSnlPclNxbkErMmdwNE9pSS8zR1RsWXhZaXByaVp5c1BDRTNxQkN0UnZYclNsWGxJVEY3aXRBcmtuNWpoRStjZUFRb1FOelloQUxFRFhmclhtME5aZDBCVHlBQkVqaUVnTW50OEliTmZQUGQ5L0x5N0lYYTI3RnV3NmNaNFRlNlRDNTI2TTVEVHdmSGtTWVFYSXdja0VzdlBGK2FOYXd2OWV2V3pKSXZRcThJQnc0SnVDRkFBZUtHdSsyOGxoNFFOM2FpQjhRUmQzYWJuZ1NDclV3anIyUHl6RmZsOVNWdkhzenJNTldyOGdZU3lkT1RGcDg2T3dJWllnUzVQNW43alJRdmVwVFVyVmxkbWpXNFNhNVMrNDBZcjBnd1QxdDIxK2Z2U1lBRW9pZEFBUkk5dTFqT3BBQ0poVjR1bm10cnFGeThOWFpGQWlsRHdELzUrKzMzUDJYbUszTmwyc3V2cVgwN1Bqcm83ZGpQNmxVcFkvSGNmWkNzMWJTTUdEa2dsNVVwTFcyYk5aYjZOOWFRNDQ0cHJtK0s0Vm01YXh2MmxyNEVLRURjMk41Mlhrc1BpQnM3MFFQaWlEdTdUUThDL3ZDWGp6ZCtJWk5uek5MNUhWdC8vVjFCT0NBcTBFcXZVak9aUEQzR1JFNC9wUW5SMHVOSmQ1WkhUanJoT0dsODY0M1NYSVZvWFhqK3VmcW53Y0lBYy9yZWVIMFNTQ2NDRkNCdXJFMEI0b2E3ZGErMmhyTHVnQ2VRUUJvU2dQRHc1bmVzWHZ1aFBQSE1KSm43K2hMNTk3OWRnWVJ5TXdsTVEwUjg1Qndta0ZuV056TkU2L0FpaDZsU3ZqV2s5ZTIzNmtwYXBqRlBKSWVOd2N1bkpRRUtFRGRtdDUzWDBnUGl4azcwZ0RqaXptNVRrNEJmZUx3MmY1R01uVGhObHIrOVd2WmhYd2UxMnpYSzdKcVN1NmxKZ1UrVmFBUWdSckJYak43c1VKZnpQU0EzVkw5YXVuWnNKZFdxVnRLSjdXZ1VJb2xtT2Q1UE1oT2dBSEZqUFFvUU45eXRlN1UxbEhVSFBJRUUwb0NBWDNqTVZqdVVqM2hxdkx6ejNnZnE2VkhOS21QZkRvWlpwY0ZnU09CSHpCcWVsVkZsclVyRnNpcFBwS0UwdkxtdUZDeFlnRUlrZ2UzSFcwc3VBaFFnYnV4bE82K2xCOFNObmVnQmNjU2QzYVlHZ2VEQzQ3bUR3a1BsZHFnNUhrdm9wb2F0VStrcERoRWk2dUV1TGwxS3V0N1JXaHJkb29SSWdVd2h3aDNXVThueWZKYmNKRUFCa3B1ME0vdWlBSEhEM2JwWFcwTlpkOEFUU0NBRkNSd2FhclZZUm80MXdrT1ZSczJJYU5FZUR6WVNTR1FDWnVmMGZYcXM1cEdMU3ArclFyTmFTK05iYnRRZUVWYk5TbVRyOGQ0U21RQUZpQnZyMk01cjZRRnhZeWQ2UUJ4eFo3ZkpTY0EvR1h0dFBvVkhjbHFTZCswbjRCY2lWU3FVbFI1M3R0VjdpbmpGdE5sWGhBUkpnQVRDRTZBQWNUTkNLRURjY0xmdTFkWlExaDN3QkJKSUFRSis0YkZTNVhiMGYrd0plZU90VmZycDZQRklBU1B6RVRMR3Npb0pqUkF0WFRSQko2dGZKZDA2dFpWcnJyeEMvNTZKNmh3b0pCQVpBUXFReURqRit5amJlUzA5SVBHMlFJVFhzelZVaEpmbFlTU1FNZ1JRS3RkVUNmcmtzeTlsOEtpeDh0SnI4L1VFamNJalpjek1CL0VSZ0JEQjJNL1lxVWJrOXR2cVNjKzdPMHJwVW1kVGlIQzBrRUFFQkNoQUlvQ1VBNGZZem1zcFFITEFDSkZjMHRaUWtWeVR4NUJBcWhBdzR1UG5yZHRrMUxpSk1uYkNWTm54Nzg1QVZTdXNCck9SUUNvVENGUnZVMExrOENLRnBVM1RCbkwvM1Iza3hPT1BDd2dSSnFxbjhnamdzMFZMZ0FJa1duS3huV2M3cjZVQWlZMTMxR2ZiR2lycWpuZ2lDU1FaQVlSZHdmT3hhTmtLYWRDcXMrell1VnZ5cUhLNmVaWGJZNy95ZmtDY3NKRkF1aERBUGlMNzlxbEVkYldQU0luamo1V2VYVHRLdSthTnBWQ2hnb0ZpQzh3UFNaZlJ3T2VNaEFBRlNDU1U0bitNN2J5V0FpVCtOb2pvaXJhR2l1aWlQSWdFVW9DQUVSZy9iZGtxazJmTWtuRVRwOHVQVzdZeDdDb0ZiTXRIaUk1QXhvYUcrUTV1YUpoSEtseDJrZlI5b0t0Y2QvV1ZBVytJeVNHSnJnZWVSUUtwUTRBQ3hJMHRiZWUxRkNCdTdNUXFXSTY0czl2a0kvRHQ1aCtrMTZEaE1tUFdYSFh6ZVNTL1hoSGVSMDlJOHBtU2R4d2pBWCtpZXV2YmI1T0hlM1NSMDA0NVNWOFoza042UTJLRXpOT1RuZ0FGaUJzVFVvQzQ0VzdkcTYyaHJEdmdDU1NRNUFUZ0NZSFF5SjgvdjM2U09hOHZrUWY3UHlhZmZibEo1NEpnb3NYOVBwTGN5THo5cUFoNEU5V1BMVjVVaTVCMnpSdXFzS3hDeWt1eVYzdExUQUdIcURyZ1NTU1F4QVFvUU53WXozWmVTdytJR3p2UkErS0lPN3ROUGdKR1pHRFN0ZVBmZjJYd3lMRXlmTXg0MmIxbkw3MGh5V2RPM25FY0NVQm9aT1NINUpHcks1ZVh4L285S0pkZGRBRzlJWEZrekVzbEh3RUtFRGMyb3dCeHc5MjZWMXREV1hmQUUwZ2d4UWg0ZDBGLzkvMTE4dUNBWWJKaTFmdXNqSlZpZHViajJCRUk1SWNvSVhMRTRZWGw3ZzZ0NU40dTdlWElJdzZuTjhRT0pZOU9FUUlVSUc0TWFUdXZwUWZFalozb0FYSEVuZDBtTndHRVpjRWprckh5dTA5R2pwMGdBNFk5S2YvcytKZmVrT1EyTGU4K1JnS0JrRVJWTGV2Qzg4NldVWU42WjluRWtDVjdZd1RNMDVPR0FBV0lHMU5SZ0xqaGJ0MnJyYUdzTytBSkpKRENCRXlwWHF6K1lwUENleDdzTDh0V3JrWVdMbk5EVXRqdWZMVHdCREs5SWZza1g5NTgwcTF6RytuVi9VN2xHU2xDYndnSFQ5b1FvQUJ4WTJyYmVTMDlJRzdzUkErSUkrN3NOblVJZUpQVUlVaUdqM2xXK2c0ZExmL3QzS1c5SVVqR1pTT0JkQ1RnVFZLSE4rVEp4L3JKbFJVdjF5aFlLU3NkUjBSNlBUTUZpQnQ3VTRDNDRXN2RxNjJockR2Z0NTU1FKZ1M4M3BDVjc2MlZyc29ic203RFJ1NGJraWIyNTJNR0orRDFoaFFxV0VCWHl1cHhaenNwVUtDQURsOWtTQlpIVHFvU29BQnhZMW5iZVMwOUlHN3NSQStJSSs3c05qVUplTDBoMjNmc2tONkRSc3JqejB6U0Q1dFBWYy9DaEl1TkJOS1JRQ0EzUkgwT3JxbGNVWjVTM3BCenp6NURlMElnVWxpdU54MUhSV28vTXdXSUcvdFNnTGpoYnQycnJhR3NPK0FKSkpDR0JMd3J1M01XTHBITzkvYVduN2Ird2dUMU5Cd0xmT1JNQXQ1S1djY1dMeWFESCs0aHJaczIwQWZRRzhLUmttb0VLRURjV05SMlhrc1BpQnM3MFFQaWlEdTdUWDBDWG0vSTVoOStrazVLaEN4YzhwYmFRLzJBWHUzbDVvV3BQd2I0aE1FSmVQY042ZGlxaVR6YTUvNUFncnJaOEpQc1NDRFpDVkNBdUxFZ0JZZ2I3dGE5MmhyS3VnT2VRQUpwVHNDczdFSndEQnorcEVwUWYwSkpFSVprcGZtd1NQdkhod2hIV05hKy9RZmswakxueTlNakIwblppeTlrU0ZiYWo0elVBVUFCNHNhV3R2TmFla0RjMklrZUVFZmMyVzE2RWZER3VTOTQ0MDNwY00rRGdaQXNWc2xLcjdIQXA4MUtBQjZQdldyendxSkhIU25EK2o4Z3JacmNwZzlnbFN5T2xHUW5RQUhpeG9JVUlHNjRXL2RxYXlqckRuZ0NDWkNBSnVBUHlXclYrVjU1YzlVYUhaSmxmazlVSkpDT0JESVMxTlhuUUhsRnVyUnJMb05VYmtpUndvV1pGNUtPZ3lHRm5wa0N4STB4YmVlMTlJQzRzUk05SUk2NHM5djBKV0JDc3ZidTNTZmRIeDRnVDQ2Zm90U0pxSEFVNW9Xazc2amdrM3REc3FwVUxDc1RSZytWczBxZVJoSENvWkcwQkNoQTNKaU9Bc1FOZCt0ZWJRMWwzUUZQSUFFU09JU0FON3hrL0pRWDlKNGgyTGlRcFhvNVdOS2RnQW5KT2s1VnlacjI3Q2k1dG1vbDVvV2srNkJJMHVlbkFIRmpPTnQ1TFQwZ2J1eEVENGdqN3V5V0JMd2hXZStzWGl1dDdyeFhObjMzQTNkUDU5Qklld0s2U3BZcTJwQmYvWDk0LzRma1RoV1doYzhML2lCY2k0MEVrb0VBQllnYksxR0F1T0Z1M2F1dG9hdzc0QWtrUUFKaENTQUpIYXUrVzdiOUlnMWFkWmFWYTlaenZ4Q09tYlFuRU5pNE1FOWV1VU9WNmgwMTZHSDlPZUYrSVdrL05KSUdBQVdJRzFQWnptdnBBWEZqSjNwQUhIRm50eVRnSldBbVZUdisvVmU2M1ArSVRIN2hWVkVwSVlGVlg5SWlnWFFrNE0wTHFYNVZKWm4yOUVnNTlwamlZa1I3T2pMaE15Y1BBUW9RTjdhaUFISEQzYnBYVzBOWmQ4QVRTSUFFSWlMZ3pRdnArK2pqMG0vWWFDYW5SMFNPQjZVNkFaTVhjdkVGcFdUU21HRnkwUVhuVVlTa3V0RlQ0UGtvUU53WTBYWmVTdytJR3p2UkErS0lPN3NsZ1dBRXZISHVUMCthcnJ3aGZWVXMvRDdsRFdHRkxJNlk5Q1lRU0U0L3BxaThNbm1jVktwUWxpSWt2WWRFd2o4OUJZZ2JFMUdBdU9GdTNhdXRvYXc3NEFra1FBSldCTHpKNlF1WHZDbk5PL1dRMy8vNFMxWEl5cVBqMzlsSUlGMEptT1QwdzRzVWtiSEQrc250dDkya1B4UElGMEc0RmhzSkpCSUJDaEEzMXJDZDE5SUQ0c1pPOUlBNDRzNXVTU0E3QWliT2ZmWGE5ZEt3elYzeXcwOWJXQ0VyTzJqOGZjb1RDR3hhcUo1MDlLTjlwRk9iWml6VG0vSldUODRIcEFCeFl6Y0tFRGZjclh1MU5aUjFCenlCQkVnZ2FnSkdoR3o2ZHJNMGFOTkYxbS9ZU0JFU05VMmVtQ29FSUVKMHVLTGtrZTZkMnNqUXZqMHBRbExGdUNuMEhCUWdib3hwTzYrbEI4U05uZWdCY2NTZDNaSkFwQVJNaGF4ZmZ2MWQ2alpwSysrdi8xZ0s1TThuZS9ic2lmUVNQSTRFVW81QVpvVXNrZmJORzhyWTRmMjVWMGpLV1RtNUg0Z0N4STM5S0VEY2NMZnUxZFpRMWgzd0JCSWdnWmdKR0JIeTYrOS9xTDFDN3BTM1ZxMmhKeVJtcXJ4QUtoREl5QXM1SUMwYjE1Zm5ubmhVUDVLM29sd3FQQ09mSVRrSlVJQzRzWnZ0dkpZZUVEZDJvZ2ZFRVhkMlN3SzJCTXlrNnU5L3RrdWJMdmZMSy9NWFU0VFlRdVR4S1VuQWlKQjZ0YXJMNUtjZWt5T1BPSUlpSkNVdG5Wd1BSUUhpeGw0VUlHNjRXL2RxYXlqckRuZ0NDWkJBM0FnWUVZTC90KzV5bjB4NWNUWkZTTnpvOGtMSlRDQ2pUTzhCcVZhbHZMenczR2c1cG5neGlwQmtObWdLM0RzRmlCc2oyczVyNlFGeFl5ZDZRQnh4Wjdja0VDMEJpQS9FditOUGgyNFB5ZmdwTDFLRVJBdVQ1NlVVQWJOWFNNV3lGOHZzYWMrcVhkT0w2VEs5OEpDd2tVQnVFNkFBeVczaUdmMVJnTGpoYnQycnJhR3NPK0FKSkVCaVRIaDdBQUFnQUVsRVFWUUNjU2ZnM2JDUUlpVHVlSG5CSkNaQUVaTEV4a3V4VzZjQWNXTlEyM2t0UFNCdTdHU3RGQjNkSnJzbEFSTHdFYUFJNFpBZ2dlQUV2Q0xrdGFsUHkzSEhIc053TEE2V1hDZEFBWkxyeU9rQmNZTTh1bDV0bFdKMHZmQXNFaUNCbkNCQUVaSVRWSG5OVkNBUXpCUEM2bGlwWU5ua2VRWUtFRGUyc3AzWDBnUGl4azcwZ0RqaXptNUpJRjRFdkNLa1djZHVNbjNXWE9hRXhBc3VyNVBVQkl3SXFYcEZPWmt6ZmJ3Y2NYZ1J2VmNJTmpKa0k0R2NKa0FCa3RPRWcxK2ZBc1FOZCt0ZWJRMWwzUUZQSUFFU3lIRUNSb1NvdVpVMGF0dEZYcG1IRXIxNVpPL2VmVG5lTnpzZ2dVUW1ZRVJJOWFwWHlOd1hubE9iZU9hbkNFbGtnNlhRdlZHQXVER203YnlXSGhBM2RxSUh4QkYzZGtzQzhTWmdxbU50My9HdjNLaDJURi94N2xwNlF1SU5tZGRMU2dKYWhLanFjVTNxMTVIbng0N1FBc1JVa2t2S0IrSk5Kd1VCQ2hBM1pxSUFjY1BkdWxkYlExbDN3Qk5JZ0FSeWpZQ0pjY2VPNlhVYXRaSDMxMzhzK2ZMbTBhVkkyVWdnblFrWVQwajc1ZzFsN1BBQitqT0JVQ3dJRVRZU3lBa0NGQ0E1UVRYN2E5ck9hK2tCeVo1cGpoeGhhNmdjdVFsZWxBUklJRzRFakFqWjl1dHZjdTFOdDh2R0w3Nm1DSWtiWFY0b21Ra1lFZEtsWFRNWk5hZzNSVWd5R3pNSjdwMEN4STJSYk9lMUZDQnU3TVFRTEVmYzJTMEo1Q1FCcy9uYTE5OXNscXAxR3NxV2JiOUlYclhTQzNIQ1JnTHBUTUNJa0NHOWU4aTlYVHFvUEttOWdwK3hrVUM4Q1ZDQXhKdG9aTmVqQUltTWsvT2piQTNsL0laNUF5UkFBaEVSTUNKa3picVBwRzdqdHZMYkgzOEtnazBvUWlMQ3g0TlNsQUJDcmhCNnRVK0o4V2RHREpRMnpScFNoS1NvclYwL0ZnV0lHd3ZZem12cEFYRmpKM3BBSEhGbnR5U1FHd1RNNnU2Q045NlVlcmUzMTEwZU9MQmZKK0d5a1VDNkVnZ2tvQ3N4TW0vR3MxS2oybFVVSWVrNkdITHd1U2xBY2hCdW1FdFRnTGpoYnQycnJhR3NPK0FKSkVBQ1Rna1lFZkxjbEpuUy9wNkhKRisrdk5vTFFoSGkxQ3pzM0RFQmVFRWd3NHNYUFZybXFmSzg1Uys3V09lRTVNdVh6L0dkc2Z0VUlVQUI0c2FTdHZOYWVrRGMySWtlRUVmYzJTMEo1Q1lCSTBJZWVYU1U5QjgyaHVWNWN4TSsrMHBZQWhBaCs1VTM4SlFTSjhxN2kyZkpTU2Vlb01VNU55cE1XSk1sMVkxUmdMZ3hGd1dJRys3V3Zkb2F5cm9EbmtBQ0pPQ2NBTHdkbUZoaGRiZTUyaTE5R25kTGQyNFQza0JpRU1Cbll0LytBMUt4M0NXeTZPWEpjbmlSd3ZyR1dKNDNNZXlUekhkQkFlTEdlcmJ6V25wQTNOaUpIaEJIM05rdENlUTJBZTlHaFRWdWFTN3ZyZHZBOHJ5NWJRVDJsNUFFVEdXc1pnMXVra2xqSHRQNUlCQW1GQ0VKYWE2a3VTa0tFRGVtb2dCeHc5MjZWMXREV1hmQUUwaUFCQktHZ0FrditmN0huNlZTamZyeTAxYVc1MDBZNC9CR25CSXdJcVRQL1hkSjd4NWRtSlR1MUJxcDBUa0ZpQnM3MnM1cjZRRnhZeWQ2UUJ4eFo3Y2s0SXFBU2JSZHRlWUR1ZjZXRnJKcjEyNVd4bkpsRFBhYk1BUzg1WG1uUGoxQ0d0ZS9VWW1RZldxUEVDYWxKNHlSa3V4R0tFRGNHSXdDeEExMzYxNXREV1hkQVU4Z0FSSklPQUltS1gzODh6T2xRL2RlT2hTTGxiRVN6a3k4b1Z3bW9DdGpxZEpZUng5OXBDeDVaYXBjZWxGcEpxWG5zZzFTcVRzS0VEZld0SjNYMGdQaXhrNzBnRGppem01SndEVUJJMEx1NnZtSWpIbHVHaXRqdVRZSSswOElBaVlwL2J5eno1QzNGN3dveFZTWlhqVG1neVNFZVpMcUppaEEzSmlMQXNRTmQrdGViUTFsM1FGUElBRVNTRWdDcGpMV3ZuMzdwY2F0eldYRnUydVpsSjZRbHVKTjVUWUJJMEp1cm4yZHZEaGhqQTVSaEhlRUlpUzNMWkhjL1ZHQXVMR2Y3YnlXSGhBM2RxSUh4QkYzZGtzQ2lVREFtNVJlOGJxYlpjc3Z2MHBldFRzMGZzNUdBdWxNd0NTbDkrM1pWWHAxNzh4TkN0TjVNRVQ1N0JRZ1VZS0w4VFFLa0JnQjV0YnB0b2JLcmZ0aVB5UkFBcmxEd0NTbEwxNjJRdW8wYnFjNnpkZ3poRHVsNXc1LzlwS1lCQUpKNmNwRHVPREZDVktqV2xXS2tNUTBWY0xlRlFXSUc5UFl6bXZwQVhGakozcEFISEZudHlTUVNBUk1Qa2kvb1k5TDM4ZWVaQ2hXSWhtSDkrS01nTmtwL1dTMVEvcTdpMStSazB0d3AzUm54a2pDamlsQTNCaU5Bc1FOZCt0ZWJRMWwzUUZQSUFFU1NBb0NacVBDMmcxYnk2TGw3MUNFSklYVmVKTTVUY0RrZzlTb1ZrWG16WGhPZXdlNVNXRk9VMCtONjFPQXVMR2o3YnlXSGhBM2RxSUh4QkYzZGtzQ2lVYkE1SU5zL3VFbnVlTDYrc3dIU1RRRDhYNmNFVEQ1SVAwZXVFY2U2dGFKbXhRNnMwUnlkVXdCNHNaZUZDQnV1RnYzYW1zbzZ3NTRBZ21RUU5JUU1Qa2dyODFmTExlMXVsTlYvUkhtZ3lTTjlYaWpPVVVBK1NENEF5R3krSlhuNWNxS2wzTi9rSnlDblVMWHBRQnhZMHpiZVMwOUlHN3NSQStJSSs3c2xnUVNsWURKQituNlFEOFpQWDRLUTdFUzFWQzhyMXdsWVBKQnpqejlWUGxnK1Z3NThvakRkYUVHL0p5TkJJSVJvQUJ4TXk0b1FOeHd0KzdWMWxEV0hmQUVFaUNCcENLQVNSWCs3UGozUDZsV3I3R3MyL0NaS3MyYjRRbGhJNEYwSm1EeVFWbzB1bGttakI3S3FsanBQQmdpZUhZS2tBZ2c1Y0FodHZOYWVrQnl3QWlSWE5MV1VKRmNrOGVRQUFra053RVRpclgrNDQxU3BkWnRzbnYzYmkxS1dKbzN1ZTNLdTQrZGdNa0htVEoybURTNXRSNUZTT3hJVS9ZS0ZDQnVUR3M3cjZVQWNXTW5obUE1NHM1dVNTRFJDUmdSTW5ERWs5Sjc4T01NeFVwMGcvSCtjb1dBRHJsUytTREhIMXRjMWl5WkxTZWRlRHhEc1hLRmZQSjFRZ0hpeG1ZVUlHNjRXL2RxYXlqckRuZ0NDWkJBVWhLQXR3TmhWM3YzN1pOcjZqYVM5OVp0NEM3cFNXbEozblM4Q1poUXJOdnExWklYeGo5QkwwaThBYWZJOVNoQTNCalNkbDVMRDRnYk85RUQ0b2c3dXlXQlpDQmd2Q0RyUHZwRXJxemRRUGJzMmN1cVdNbGdPTjVqamhNd0ltVHF1QkhTK0phNkZDRTVUano1T3FBQWNXTXpDaEEzM0sxN3RUV1VkUWM4Z1FSSUlLa0pCRUt4aHF0UXJDRU14VXBxWS9MbTQwWUFvVmdIMU5WT09PNFlobUxGaldwcVhZZ0N4STA5YmVlMTlJQzRzUk05SUk2NHMxc1NTQllDSnZrYzVYbXIxbWtrNzY5bktGYXkySTczbWJNRUFxRllOOWFVRjU0YlRTOUl6dUpPdXF0VGdMZ3hHUVdJRys3V3Zkb2F5cm9EbmtBQ0pKRDBCTEtHWWpWa1ZheWt0eWdmSUY0RU1rVElmc2tJeGJxUklpUmVZRlBnT2hRZ2JveG9PNitsQjhTTm5lZ0JjY1NkM1pKQXNoRXdJcVRQNEpFeVlNUlRySXFWYkFiay9lWUlBUk9LaFdwWWE1Zk9rV09QS2FiNzRRYUZPWUk3cVM1S0FlTEdYQlFnYnJoYjkycHJLT3NPZUFJSmtFQktFRENoV050My9Dc1ZyNnN2WDN5OWlWV3hVc0t5ZkloWUNaaFFySTR0Rzh1WXgvclJDeElyMEJRNW53TEVqU0Z0NTdYMGdMaXhFejBnanJpeld4SklSZ0xHQzdKbzJRcXAwN2l0cUEzUzlXU0xqUVRTblFCRXlINVZ1bnJwcTFQbHFzb1ZLRUxTZlVDbzU2Y0FjVE1JS0VEY2NMZnUxZFpRMWgzd0JCSWdnWlFpWUVSSXM0NzN5UFJaOHhpS2xWTFc1Y05FUzhEa2dseHk0Zm15YXRFc0taQS92OXF2TUkvK3c1YWVCQ2hBM05qZGRsNUxENGdiTzlFRDRvZzd1eVdCWkNXQXpRa3hxZHI4NDA5Uzl1cTY4dGZmLytpZG9QR0hqUVRTbVlBSnhScld0NmZjMDZrTnZTRHBQQmpvQVhGbWZRb1FaK2p0T3JZMWxOM1ZlVFFKa0VBcUVqQmVrQkZqeHN1OWp6eEtMMGdxR3BuUFpFMGd3K09SVjRvZWZhU3NYVFpIVGp2bEpDM01tWkJ1alRJbFRxQUh4STBaYmVlMTlJQzRzUk05SUk2NHMxc1NTR1lDeHVPeGEvZHVxVkQ5WnZuMGk2K1lrSjdNQnVXOXg0MkE4WUkwYTFCUEpvMFpSaTlJM01nbTM0VW9RTnpZakFMRURYZnJYbTBOWmQwQlR5QUJFa2hKQXNZTE1tL1JNcm01ZVVjbXBLZWtsZmxRdGdTOGVSL0w1ODZRS2hYS1VZVFlRa3lSNHlsQTNCalNkbDVMRDRnYk85RUQ0b2c3dXlXQlZDQmdSTWlOVGRySi9EZmVaQ2hXS2hpVnp4QXpBZU1GcVhUNXBiSmkva3lHWWNWTU5Ea3ZRQUhpeG00VUlHNjRXL2RxYXlqckRuZ0NDWkJBeWhKQVFqcmkyOWR2K0ZTcTNIQ2IyaUY5RHhQU1U5YmFmREFiQWthRVRCMDdYQnJmeWgzU2JkaWx5ckVVSUc0c2FUdXZwUWZFalozb0FYSEVuZDJTUUtvUU1GNlF1eC9vSzArT24wb3ZTS29ZbHM4UkV3RUljK3dMVWxJbG9uLzB6a0lwVXJnd3kvTEdSRFQ1VHFZQWNXTXpDaEEzM0sxN3RUV1VkUWM4Z1FSSUlLVUp3QXVDdHZtSG4rU3lxK3ZJUDl0MzBBdVMwaGJudzBWS3dIaEJodmQ3UUxyZTBacTVJSkdDUzVIaktFRGNHTkoyWGtzUGlCczcwUVBpaUR1N0pZRlVJbUM4SUlOR2pKR0hCNCtpRnlTVmpNdG5pWnBBUnZuZFBISnM4V0t5ZHZrY0tYSENjZnBhTE1zYk5kS2tPcEVDeEkyNUtFRGNjTGZ1MWRaUTFoM3dCQklnZ1pRbllNcnkvdjNQZHJtMGFtMzUvdWN0dWlxVzhZNmtQQUErSUFtRUlHQzhJUGQwYkNuRCtqOUVMMGdhalJRS0VEZkd0cDNYMGdQaXhrNzBnRGppem01SklOVUlaRzVPK0p6YW5IQUl2U0NwWm1BK1QxUUVVSllYcmVqUlI4bjZ0K2JMS1NlZHlLcFlVWkZNdnBNb1FOellqQUxFRFhmclhtME5aZDBCVHlBQkVrZ0xBdkNDb01FTFVxN2FqZkxONWgvb0JVa0x5L01oc3lOZ3ZDQ2QyelNWSjRiMDBaNUJobUZsUnkzNWYwOEI0c2FHdHZOYWVrRGMySWtlRUVmYzJTMEpwQ0lCNHdXWk1PMGxhZGYxUWJVN09zT3dVdEhPZkNZN0FzWUxjdGhoaGVTRDVYUGwzTFBPb0JmRURtRlNIazBCNHNac0ZDQnV1RnYzYW1zbzZ3NTRBZ21RUU5vUU1GNlFuYnQyNllwWVgyMzZqbDZRdExFK0h6UWNBZU1GYWQza1ZubjI4Y0gwZ3FUQmNLRUFjV05rMjNrdFBTQnU3RVFQaUNQdTdKWUVVcFdBOFlJOE4vVkZhWC9QUS9TQ3BLcWgrVnhXQkxKNlFlWXBMMGhKZWtHc0NDYmZ3UlFnYm14R0FlS0d1M1d2dG9heTdvQW5rQUFKcEJXQmdCZGs1eTRwVzYydWZQbjF0L1NDcE5VSTRNT0dJa0F2U0hxTkRRb1FOL2EybmRmU0ErTEdUdlNBT09MT2Jra2dsUWtZTDhpNGlkT2s4MzJQMEF1U3lzYm1zMFZNd0hoQmloUXBMQit1V0NCbm5IWUt2U0FSMDB1K0F5bEEzTmlNQXNRTmQrdGViUTFsM1FGUElBRVNTRHNDeGd2eTUxOS95NlZYMVpZZmZ0NUtMMGphalFJK2NEQUNnWDFCN2xEN2d2UjdpTGtnS1R4TUtFRGNHTmQyWGtzUGlCczcwUVBpaUR1N0pZRlVKMkM4SUNQSFBpYzllbk5ma0ZTM041OHZNZ0xHQzNMMFVVZnFmVUZPUGJrRXZTQ1JvVXU2b3loQTNKaU1Bc1FOZCt0ZWJRMWwzUUZQSUFFU1NFc0N4Z3Z5MTkvL3lNVlgxcElmdDJ5akZ5UXRSd0lmMmsvQWVFRzZkMm90US9zK3dOM1JVM1NJVUlDNE1henR2SlllRURkMm9nZkVFWGQyU3dMcFFHRHYzcjJTUDM5K2VhRGZVQms2K2xudWpwNE9SdWN6WmtzZ3d3dVNSMHFjY0p4OHZQSjFnVGNFelhoSHNyMEFEMGdLQWhRZ2JzeEVBZUtHdTNXdnRvYXk3b0Fua0FBSnBDMEI3UGlNU2RXMzMvOGdaYSt1cTNaSjM2RllITkFoSjJ3a2tNNEU4dVhMSy92Mml6dytxSmZjMmE0RnZTQXBPQmdvUU53WTFYWmVTdytJR3p2UkErS0lPN3NsZ1hRaFlISkIydDdkVXlaT255WDUxY1FMbmhFMkVraG5BaGxoV1B2bDNETkx5a2R2TDVTQ0JRdG9ZVTR2U09xTUNnb1FON2FrQUhIRDNicFhXME5aZDhBVFNJQUUwcHFBRVNCcjFuMGtWOTdRUUsvMDBnT1Mxa09DRDMrUVFONjhlV1cvRWgwdlR4d2pOOWVwUVM5SWlvME1DaEEzQnJXZDE5SUQ0c1pPOUlBNDRzNXVTU0NkQ094VHNTWUlPYW5Wb0tVc1hyNVM1WUtJbW15cCtCTTJFa2hqQWlZWi9jb0taZVhOZVMvUUE1SmlZNEVDeEkxQktVRGNjTGZ1MWRaUTFoM3dCQklnZ2JRbllKTFJYNXE5UUJxMXZac2JFNmI5aUNBQUVERGhWZ1VLRkpDMzU3OG9aUys1a0NWNVUyaG9VSUM0TWFidHZKWWVFRGQyb2dmRUVYZDJTd0xwUk1DRVhPM2F2VnN1clZwYnZ0ejByUkloZWZRbWJHd2trTTRFakJla1hmTUdNbTc0UUc1TW1FS0RnUUxFalRFcFFOeHd0KzdWMWxEV0hmQUVFaUFCRWxBRWpCZGs0UEF4MG52SUtKYms1YWdnZ1lOZUVBajBZNG9Wa3cwckY4cUp4eDlIRVpJaUk0TUN4STBoYmVlMTlJQzRzUk05SUk2NHMxc1NTRGNDOEhZZzZmYnJiNzZUc3RmY0tQOXMzNjVEVUppUW5tNGpnYy9ySjJCSzhqNHhwTGQwYnRPTXllZ3BNa1FvUU53WWtnTEVEWGZyWG0wTlpkMEJUeUFCRWlDQmd3U01DR25Rc3JQTW1yK1lKWGs1TWtoQUVUQWxlY3RmV2tiZVdmaXlGdXBvTE1tYjNNT0RBc1NOL1d6bnRmU0F1TEVUUFNDT3VMTmJFa2hIQXFZazc3eEZ5NlRlN2UzVkJFdHRTOGhOQ2ROeEtQQ1pmUVFnTnZMa3lTdkxaaytUSzYrNG5GNlFGQmdoRkNCdWpFZ0I0b2E3ZGErMmhyTHVnQ2VRQUFtUXdFRUNacU8xLy83YktlV3IxNU9OWDM3TlpIU09EaElJZUVFT1NKdmJiNU5uUmcxaUhrZ0tqQW9LRURkR3RKM1gwZ1BpeGs3MGdEaml6bTVKSUYwSjdOMjdUL0xuenlkOWhveVVBY09mWWhoV3VnNEVQbmNXQWhuNVVDSW5ISGVNZkx4eWtSeFR2Q2hGU0pLUEVRb1FOd2FrQUhIRDNicFhXME5aZDhBVFNJQUVTTUJEd09TQmZLYThIeWpKdTJmdkh2SWhBUkx3ZUVFbWpuNVVtamVxSDZnY1J6akpTWUFDeEkzZGJPZTE5SUM0c1JNOUlJNjRzMXNTU0djQ0p1L2oycHR1bHhYdnZxL0RzSkFmd2tZQzZVekE3QWxTczlxVk1uL21CSHBBa253d1VJQzRNU0FGaUJ2dTFyM2FHc3E2QTU1QUFpUkFBajRDWmsrUThjKy9JQjI2UDh5ZDBUbENTRUFSTUdXcGl4UXBMR3VYelpGU1o1OUpFWkxFSTRNQ3hJM3hiT2UxOUlDNHNSTTlJSTY0czFzU1NHY0NKZ3pyNTYzYjVMenkxOHIySGYreElsWTZEd2crZTRBQThxUDI3anNnanoxeXYzVHIzSmJWc0pKNGJGQ0F1REVlQllnYjd0YTkyaHJLdWdPZVFBSWtRQUpCQ096ZmYwRHRkNUJIYm0xeGg3eTJjS25lR1IyZUVUWVNTR2NDSmd6cmluS1h5SXI1TTdWWGhQdUJKT2VJb0FCeFl6ZmJlUzA5SUc3c1JBK0lJKzdzbGdUU25ZQ3BoalZsNWl2UzhzNzdHWWFWN2dPQ3o2OEptRENzQWdYeXkvdEw1MGlaMHFVWWhwV2tZNE1DeEkzaEtFRGNjTGZ1MWRaUTFoM3dCQklnQVJJSVFzRHNDZkxMcjcvTGhaV3VsMTkvLzVOaFdCd3BKS0FJbURDc3Z2ZmZKYjE2ZEdFMXJDUWRGUlFnYmd4bk82K2xCOFNObmVnQmNjU2QzWklBQ1lpS2I5OHYrZkxsbFdZZHU4bjBXWE81SndnSEJRa29BaVlNNjlJeTU4dWFKYTh4REN0SlJ3VUZpQnZEVVlDNDRXN2RxNjJockR2Z0NTUkFBaVFRZ29BSnc1bzg0MlZwZmRjRERNUGlTQ0VCUmNDRVlSVXNXRkRlZStOVnVlaUM4eGlHbFlRamd3TEVqZEZzNTdYMGdMaXhFejBnanJpeld4SWdBUWxNcXJiOThwdWNYN0c2L1BuWDM0SEpGL21RUURvVE1HRllnM3AxbC92djdzZ3dyQ1FjREJRZ2JveEdBZUtHdTNXdnRvYXk3b0Fua0FBSmtFQVlBcVlhMXMxTk84aWNSY3QwTlN4dVNzZ2hrKzRFVEJoVzVRcVh5WXA1TThYa1RLVTdsMlI2ZmdvUU45YXluZGZTQStMR1R2U0FPT0xPYmttQUJESUltRENzQ1ZOZmxIYjNQTVF3TEE0TUVsQUVNc0t3UkFvV3pDL3IzcHduNTU5N05zT3drbXhrVUlDNE1SZ0ZpQnZ1MXIzYUdzcTZBNTVBQWlSQUFtRTlJUHZWZmlCNTVkdk5QMGpwSzY2VFhidDJreGNKa0lBaVlMd2dvNGYwbGp0YU45VkZHeENheFpZY0JDaEEzTmpKZGw1TEQ0Z2JPOUVENG9nN3V5VUJFc2drZ1BBUy9LbFdyNG04dmZvRGhtRnhjSkNBUjREVXJWRk5YcHY2Tk1Pd2tteFVVSUM0TVJnRmlCdnUxcjNhR3NxNkE1NUFBaVJBQXRrUTJMTm5qeFFvVUVBR2pSZ2pEdzhlUlFIQ0VVTUNpb0FKd3lwNjFKSHkyWm9sY3Z5eHgxQ0VKTkhJb0FCeFl5emJlUzA5SUc3c1JBK0lJKzdzbGdSSUlKTUFrczRSYnZMK3VvK2s0dlczcUYrbzRIYzJFa2h6QWhBZzZqK1YreUh5NHNRbjVaYTZOWFdCQm54VzJCS2ZBQVdJR3h0UmdMamhidDJycmFHc08rQUpKRUFDSkpBTkFWUGg1Ny8vZGtxWktqWGxtKzkrNEs3b0hEVWtvQWlZY3J4M3RXOHVJd2MrVEFHU1JLT0NBc1NOc1d6bnRmU0F1TEVUUFNDT3VMTmJFaUNCckFUTXltNkxUdDFsNmt0enVDczZCd2dKS0FJbzBMQmY1VWVWS1YxSzFpMmZxLy9ObGh3RUtFRGMySWtDeEExMzYxNXREV1hkQVU4Z2dTUWlnSlY0TlBQL1lMZWVFUmFoNGlMWTRrckFsT01kLy93TDBxSDd3eXpIRzFlNnNWOHN1M0VmeVdjbjlydEl2eXVZWGRFTHFWM1IxeTZmSTZWTG5jTnl2RWt5RENoQTNCaktkbDVMRDRnYk85RUQ0b2c3dTNWTEFKT2wvU3F3R25vRFdzS3NLdG9JQzFPNXlmd2YxK0RxWlBSMmhUM0E3MytidnBNTEtsMnZkMzVteTMwQ1poejd4N2UrazNEQ1cydjNBd0Z4anV2Z2NIekdNajVyek91SjFwcW1ITy9ZNGYya2ZmUEdnYjF6b3IwZXo4c2RBaFFndWNQWjN3c0ZpQnZ1MXIzYUdzcTZBNTVBQWdsQXdBZ08zRXJHeENpNEIyUFg3dDN5eDU5L3lkLy9iQmZrSTVqamNENG1BVWNlY2JnY3JTclNGRDM2cUpCUFpTWmJPSmVDSkhMam16d1E3SFZRb1hvOVdmL0paOG9Ma2tkUFh0bHlqb0Q1UEFRK0kvcXpZVDRmU2pRY0ZCWVk4eGo3UnhRcGNrZ1M5TTVkdS9SbkJwK2RYYnYzSER6ZDh4azdzRjkvbHN6bmdZTEV6cDc1OCtlWHZlcHpjZnV0ZGVYNXNTUG9BYkhENSt4b0NoQTM2RzNudGZTQXVMRVRQU0NPdUxQYjNDR0F2SUpnUWdBVHBVOCsrMUp2ZnZmeHhzL2x5NisvbGMwLy9pUi8vUEduRmg2WVVPM1prM1VGSHRjNTdMQkNjbGloUW5MRTRVV2t4SWtueUJtbm55SVhubGRLempyemRCVWFjYmFjYzJiSkxBOW1KblVVSTVIWkcxNFBUTFk2Mzl0YnhrMmFvZkpBOHVqVlhyYjRFakNpUXdzQmZXbUlCWWlOQTNMZU9XZkt1V2VmSldlZGNacVVPYitVbkZIeVZDbHh3dkY2ekdQc0Z5cFU4QkJoamMvS3pwMjc1TCtkTytYWDMzK1hIMy9lS3A5LytiVjgvdFhYOHVYL3ZwRlBQLzlTL2xJQ0pTQnNsQ0F4OTREUEtGdDRBaVlQNU16VFQ1V043eTdXSmF1TllDZTd4Q1ZBQWVMR05oUWdicmhiOTJwcktPc09lQUlKNURJQnM3cnFMVldKeWRIcUR6NlVWZTk5SU12ZVhxVW5Sejl2M2FibVE5NkV6b01oSWdkWGZJUGZ0cHFvWlhHZW1OWGkvWEtVOG82Y1hPSkVxVlMrckZ4N1ZTV3BXTzVTT2YzVWt3T1hDWFpmdVl3bTRic3pBbVRhaTdPbGVlZnU5SURFMldMNFRHaFJyTU9oTWtUSG1hZWRJcFVxbEpPcktwV1hLOHBmSnFlZVhFS0pqY1BqMWpQNisybkxWaTN5Rnk5YklhdldyTlBsbG5jWmdhL0VDTzZMWHBIUXlFMGVDQ3Bpclg3alZibTB6QVgwZ3NSdGhPYmNoU2hBY281dHVDdmJ6bXZwQVhGakozcEFISEZudC9FbjRKL2dZK0t6ZE1VcW1UWG5kVm0yWXFYODc1dk5tVEhzZWdKMlFKZTR4RVRNeEx2anJyS0xWVGRoV1puL3o0aHoxeXU1bnZDVjRrV1BrZ3ZWQ25LRG0yNlFHNjY3Sm9zWStUOTcxd0ZlUmRGRmIwZ0NLRjJhZ0FqNmk0clNleEdRWHFYM2p2UXEwcXZTa2Q1N3I5Sjc3NzMzSm9paU5FVkZPcUdFOHMvZGx3bVBHSkpNOHQ2YnQ3dG52dy9CNU8zZW5YTm05OTB6dHd4L05xeFVNTmVqWTQ0cnlqcVFTNzlmb2M5eUZ6V2lVTkw1TXNjSXZPOHVaZlROTVQ4ZGdqdjFlOG1wak5oZHUzeVpZb1l6R3pLbGtEOHI2NlA0OHlIbi9KdEc2VnlJN3ZpM1Q5QXo5dm9adjEyK1N1dTM3S0NscXpmUXJuMkhoQ0F5SGp6eFREalVQZEx1L291d3JBTVpQNlEzTmExZkUzVWczdmVvL2VlT0lFRDBrQVFCb2dkM1phdXFSQ2tid0FsQXdNMElTR2RGNXBmekhoTEwxMjZrV1Q4dUVXbFdGNE5FZ1NpT0ZmZmg2eHZOY0t5Y0MyeGRkWHV5UzVCMDFyaVdRUmJ0Smt3UWo3NzhJcGZoT0JUT255ZllKSVRJNitqTHRKTEFaNEdVdlZBNU9pM1M1RkFIRXZrWmFqaXRVbmlJU0VQUmd2bW9YdldLVkx4UWZub25RZnpYNXFFVUd1RjF1MUs5bTllTDJSMzdXamdmbkFxNWNQbHFtcjFnT1YwVHFWdThNTUNjUTRpOGpyVGNENlIrallvMGJmUWdSRUJVSjZLR3owT0FhQUJkbUZUMWF4RUIwY09UTWxHYWJoTm1nY0IvRUpEMUZUTFZpaDJaeWJOK3BCK1hycUpiZCs2THo0dkNWL0ZmRmlidUVCemhVU0pYbnZsdm80NGhxQ1ZRdGt6cHFWWGp1bFN0UWhtS0h0M2Z1QXgyTjM2RnBzU2llZnNlTkhuMklsRUhRcWdEQ1creWhmaDljRXFUZUFLaSsvdUp1VmFhR3RldFRubEZxcFU4ZUU3S0RuQXEzZDhVYnlYVTU5YTVjNXkwL2MvTlc3UmkzU1lhTTNrV25iM3dpeUZFZkhrUERIVFFNakNVZFNBZmlYcXpNM3Myb0E0a3FoUFJBK2REZ0hnQTVGQk1RSURvd1YzWnFpcFJ5Z1p3QWhCd0F3TE9EanVuY3d3YU5aSG1DK0h4TU9DeDhGdGVHS3VzTDBSZWgzTnFsUnR1SThLWGxHTEVVZlRyV04zTktEWVdhOXY4YTZwUjZTdkRtVUEweEFHbjNBOWs0dlI1MUxKekwrR0UramhXOFhHRWkwQnd1cFVqcDBtay81V21MbTJiVWNiUDB4cm5TbWZlVzlMLzVQUEp6NnFNakR3TUNLRDVTMWE5RWlKR0I3cG90cDhEenZ1Qm5OeTludEw4THpXaUlPRStFWG8vQUFHaUIzOVZ2eFlSRUQwOElRS2lDWGVZalJ3Q3psRVA3bVExWXNJMG1pQWMxVnQzN2huQ2d4MFZLVHdpWjhHOVp6bW5hVDAzMnN2NlVJRzhPYWgzbDdhVUwxZDJ3N2pkb3lHeUR1VFl5VE9VdlhBNTl4SmlvYXM3MHEwY2FYLzVjbWVqWHAyL29TL3o1Z3FlVTk3ZWlTMWtSRFBnMFNNYU9uWUtqWjQwazI3ZnZXOElVYnRIUTJRVVpONmtrVlM5WWhuYnZ5dTgvZkdGQU5IREVBU0lIdHlWcmFvU3BXd0FKd0FCRnlIZzdKaXYzYnlkdXZRYVJPZCt2dVFrUE15MTJWbHdHMUt4K3V2ajg1SWExYTVPZmJ1M284UUozN0YxTkVUV2dUd01lRVJwY3hZV0xWMy9Ec3BldzBaMm9UMUtMQ3hZZlBBK0VZa1RKcUFlN1Z0U3kwWjFqY0x4a1BWUkxub1UzWHFaa0VMa3dzVkwxTFh2WUZxNWZvdlJLZGpPMFJCSEhRaFIreFpmMCtEZVhWQ0k3dGFaR1BXTFE0QkVIY1BJWEVIVnIwVUVKRElvdStBY1ZhSmNZQktYQUFMS0NFanhjZWZ1UGVyU2V4Qk5tYlBRdUlaZlVKRnRlSjJybEExNjhBUmpWWk9qSWFKRDBVZGk3NFhCdmJ0U3VaSkZqRHVRMFFBUDNvNTJVNUpMZHFETDFHZ291aVh0UWhyV0cxaHhuanVsaWhhZzBRTy9GM3ZUcExURTNPRjV3TTg5N3d2RHg5VFpDNFFRR1dKRU8vMUVwSk5iTnR2dGtKMndDdVhMUlp1WHpiSGI4RTAzWGdnUVBaU3ArclVRSUhwNFFncVdKdHhoTm1JSU9CZXI3ajV3bUZwMitNNG9VQldOYzE5YjRZM1kxYnozVTY5V3NjWHlwbGpsN2RDcUVYMHZVbWplZnVzdFc2Wlp5RHFRRHQ4TkVHbDJNMUdJSHNyVWRUaWpMNHpOQWZ0MWEwZmZOR3RnRkNxelk4Ni84MlJodVR1ZkxCYmhNblh4N1BtTDFMeEREOXA3OExqb2xPVTlOVjd1SEwvenRSMTFJRVRKMzAxQ1B4L1pSbS9GaklrTkNUMEZmaVRzUUlCRUFqUVhuQUlCNGdJUVBYRUpWYUk4Y1Urd0FRUVlBZWVkZnNkUG0wUHRldzZncDJKZkNGNzlkT3hUWUwyVW5PQ09YU0lhVWtpMDdaMHljZ0NsRmh2RnlRMzY3REl6Wk1ScjNxSVZZa1BDRG1qRkc0SjRqZ3B3eWxXcTk1TFJ0REdEcWFDWUs4NWkzV3J6eERrYXdzOUMyMjU5YWNLTWVZWllkOWVreWE4QUFDQUFTVVJCVkRTWHM5NjdJRFFPWDIxSTZFZjdOeTZsTEJuVDJUSkthcGI1RFFHaWh5bFZ2eFlSRUQwOElRS2lDWGVZRFJzQm1YckVHOUYxNmpXUVJrK2VIVlRyRWJTdmdZVUJaQ2VESGN4QWtleWRTbXdZTjJ2OFVGRlVuTjFXa1JESi81bnpQMVBtL0tVTkp3c2JFam9tdlJRZmVjU3U1YlBGM09DVXE4REFRT1BuVm9sNnZPbnhkbzZHakprOGs3cjBHVUtQSHo4eE5qQzB5K2FGc2hCOTV0akJWS2RhUmRzdFRwanAxUThCb29jdENCQTl1Q3RiVlNWSzJRQk9BQUtLQ0Vqbms3dmdWRy9ZaHRadTJVbStZcFhUYmgxd1pJcE5kTkdpZDk2a0VWVHhxeEsyY1RaazlPdkJ3d0Q2TkVkaCt2T3ZmMnkxMHYybVIwYUtqNHBpQi9NNUU0WlR6Smd4YkNWTVpXU1Uzd1g4Zkt6ZnZJT3FObXhGQVk4ZTJ5WktKZ3ZSTzdWdVJBTy82MlNiZDRMaTE0aFhmQndDUkE4TnFuNHRJaUI2ZUVJRVJCUHVNQnM2QWxKODNMdi9nQ3JYYjBGYmQrMjNiY0VwSStRb01uNHA5Z254bytsakJsSE55dVZzNDNESXRKcVNWUnZRNWgxN2JWK0lMc1ZIcmNwZmlaMndCeHR6d281TkN1U2JnNk0rdkgvTzVoMTdxR3FEVm5UdndRTmJpQkJaaUY2OFVENWF0M0E2dmtxOEdBRUlFRDNrUUlEb3dWM1pxaXBSeWdad0FoQ0lJQUxTbWJwNzd6NlZyZFdZOWh3NGFtdnhJV0dUcVVjK1FveE1IejJJNmxhM1I5cUZySHRwMDZVM2paczJWOHlGb0IzbEl6aWZyUFF4S1Q3cVZhOGd4TWVnNEFZTUxGRHRmTWc1c252L1lTcFhxd254dThQcTZWaHlVU0pWeXVSMC90QldzZE85UHdyUnZmUWhnQURSUTR5cVg0c0lpQjZlRUFIUmhEdk12bzZBRkIrUEhqODJIQW03Uno1Q3pvOVh1ZjArdEhEYWFLcFV0cVRsVTI5a0o2eXhVMmJUTjZMbzJLNDdvc3NWNzBwZkZSZmNqd21lR2xhdjk0am9PMUtLa0swNzkxSzUyazNvMFNOcjE0VElCUW51Zm5abTMwYWpCc2pPa2JDSXpoTWRuNE1BMFlFNktmdTFFQ0I2ZUZJbVN0TnR3cXlGRVpDcE50ejVpQjJJRFZ0M0kvSVJDdCtPRGxsY2hPeEx5MlpOb0ZMRkNscGFoTWhPV0p1Mzc2WVNWZXBiK0FsNDg5Q2srQ2dqdUY0eWM3ekJQVDh2ZG85OGhFUk1pcEMxbTdhSjFNMldScHFpN0FwbXhZbmpFSjgrdEc3UmRDcFdNSitsM3dObTVnOENSQTk3aUlEb3dWM1pxaXBSeWdad0FoQUlBd0huOXByZmRPMU5ZNmZPdzU0UFllQWwweS9peFkxRE8xYi9TQmsrLzlTeXE1OXlWZmZ5MWV0aVIvUWk5T1RwVTF0MXdwTGRqajc3SkEzdFdyT1FFc1NQYTFtdVhmR1NsQ0prNHN4NTFMSmpMMHUzNjVZcGVhTUhmaWQydmErREhkRmRNWUhjY0EwSUVEZUFHb0ZMcXZxMWlJQkVBRlIzZkVTVktIZmNBNjVwWHdSa21zMm9pVE9vbmRqbnc2NDdIS3ZNQUNsQzBueVlpdlp0V2tZSjRzVTFUcmRhU283c2hQWDR5Uk5LbDZjNC9YYjVtdVh6KytVOGtDdmNMRHIyYlZoS2FmNlhHdUlqQWcrSkZDSHR1dmVqVVpObldiWnV5TkVKNnlXMWFsU2JSZzM4SGhHUUNNd05IUitCQU5HQk9sS3c5S0FlQ2FzUUlKRUFEYWU0QkFHWllyTkhGSkFXclZUWDhta1RMZ0V0NkNJeU5hZGN5Y0swYlBaRXd3RmhZV0lsRVNJRkNQOWRUTXlQYmJzUDJLSU9oRGxrTHArTGpRYVh6aDVQNVVzVmc0TVp3WWRIcGwzeHdrYlJpblZvejhHamxwd3o4dmt2VmFRQXJmNXhLb3JRSXpnL1BQMHhDQkJQSSs2d3ArclhJZ0tpaHlkbG9qVGRKc3hhREFGWjkzSDd6bDNLWHJnYy9YN2x1bTFXdDExRnBVekRHTmFuSzdWdC9yWGhzUHFLWGVLdGRFaVIydmliTGpSOS9sTExybWc3YzhZY1BuL2hRKzJhTjZBaGdsc1pKYlFTcis0Y2kwemQrL1gzeTVTN1dDVzZkZnV1TVBmU1VydWx5L1M4VHo3NmtFN3RYbS9VQnVId1BnUWdRUFJ3QWdHaUIzZGxxNnBFS1J2QUNVQWdGQVNrWTFtM2VYdWF0MlNWSlZjcDNVMDhyNVRMWGRQM3JGOU1XVE9tczF5YWpuUytCNDRZVHowR2pMQjhpcDUwTERPbi81ejJyRjlrdEZpVlBMdDdQbG5wK2pJVmE3NTR0OVJwM2s2OFh6aWk5Tnd5UTVTZHNPTEVqazBYajI2anhBa1RXbVpzVmhvSUJJZ2VObFg5V2tSQTlQQ0VDSWdtM08xc1ZvcVA1V3MyVXVVR0xTM25ISGlTVyttd1pzK1VubmFLUW1YZW5NNUtEcXVjSy9NV3JhUzZMZHRiZXFNNW1YckY4MmZ2aGlXVVBYTUd5d2xLVHo0YmN1NVUrN28xTFZtOVFjd2RNdkMwd2lFRkNLZGlIZHF5Z2pLbC84d0t3N0xjR0NCQTlGQUtBYUlIZDJXcnFrUXBHOEFKUU1BSkFabWpmZnV1U0wwcVZJNnVYUHRUT016V2NReDBrQzN6d1lmMDZrenRXamF5VkNxV1RLZlpmK2dZNVN0ZE5UalhYYWJ3NmNEYlhUWWRxVmNVbEhyVkRhbFhVUVNhNXc0NzZsZXYvMGxaQzM1RmQrN2VGL1BuaFdWU3NSd2loR2pwTEZFblZMcFlGTkhDNmU1QUFBTEVIYWlHZjAxVnZ4WVJrUEF4ZGNzblZJbHl5MDNnb3JaQlFLNUtkdnArSUEwYlB4MnBWeTVnM3JFbmhBL0ZqUk9MVHUzWlFNbmZUV0tadlNKa0lmcTFQMjdReDlrS1dyWVZyN0hIaTJEeC9SVEo2TWkyVlJRL3FMTVo5dnVJMmdNaTY2S0dqSjVNWGZvT0VlOGJNZ1M2RlE1WkF6WnFRRTlxMWJpdUZZWmt1VEZBZ09paFZOV3ZoUURSd3hOU3NEVGhia2V6Y2pYNzRxWGZLV08ra2hRWWFPM053anpKc1l5QzFLdGVnYWFQR1d5WnJrbFNnRHdNQ0tBMFdRdlNYLy84YTBUTXJCWUJrZnhOR3Q2Zkd0V3BhcWtvbGllZmc1QzJaTVQxeVpPbmxMTm9CVHA3NGFKbDB2aU1WcnhDUzNWcDA0VDY5K2lnRTJiWWZnTUNFQ0I2cGdZRWlCN2NsYTJxRXFWc0FDY0FnU0FFWlBTalRyTjJOSC9wYWt2bFpIc0R5YktHNE1EbTVaUWx3K2VXcUIrUUFvVG5UdTdpbGVqb3lUT1djU0RsbkpGMVBKblNwVFZxUDJKRWoyNzh5a290bFhVK0gvSzlzM2psT3FyZXFJMWxhczZrYUsxWjZTdWFNM0c0VG9oaEd3TEVxK2FBcWwrTENJZ20rbFNKMG5TYk1HdHlCR1QwNDhpSjA1UzNSQld4d3V1SWZ1QndIUUxTSWFsU3JnUXRtRHJHRWdLRTBaRWlwR0xkWnJSeS9WYkxwZTA1ZUh0QkM2ZU5vY3BsUzFvbWV1VzZtUjMxSy9FYzRzNVlMR0tQbno1bkNSRXJoZXVYZVhQUjFoVnpvdzRTcnVCeUJCQUJjVG1rRWJxZ3FsOExBUkloV0YzL0lWV2lYSDhIdUtJZEVKQ3JrQTFhZGFUWkMxZllZajhISGJ6S3RyeTcxeTJpYktJekZqdGVacThqa0hPblNkdHVORzNlWWt2TkhlbEVwa3Y3TVIzWnVsTHM1K0RvWW9iRHRRaklPYlJveFZxcTJhU3RxSmd5ZitNTE9YYysvelFOSGQyMjJ1aUFoOE83RUlBQTBjT0hxbDhMQWFLSEo5U0FhTUxkVG1abDlPUDh4VitOemxlUEhqODJobzhJaU90bmdaRVgvdndsTmFwZGhTYU5HR0NKV2dLdUZXTG5xdWVBWVRSZ3hDVHk5L014Nm9lc2NMeXEvZWduYWorcUlmcmhSbEpsRk9TelhFWHAwcFZycG8rQ3lDNVlTUksvUXhjT2JSTk5LR0s3RVQxY09qSUlRSUJFQnJXb253TUJFblVNUFhJRlZhSThjbE13WWlrRTVPcGoxejZEYWZDWUtaWkxvZkVtc3VUcWVmeDRjZWo0em5XVVVuUlZrZ0xRbSs1VDVWN2tab1RqcHM2bU5sMzdXbWIrR0N2WUwxNVNzcVNKNmV6K1RSUXZicHpnZERNVmZQRFppQ0VnMzBOVzZZZ2w5d0tKSGV0dE9yWmpMZjN2Zy9jakJnUSs1VEVFSUVBOEJ2VnJobFQ5V2tSQTlQQ0VDSWdtM08xaTlsVVhvMGVVSVc4Sit2M3FkWkVTNUdPWkRjRzhrVWU1cWo2NFZ5ZHEzN0t4a2Z2T3FUMW1QWUxUWjVhdm9ScU4yMXBtL3Nob1ZSdlJRbldFYUtVcXgybFducno5dnFVUTUzMUJNbnhSZ3U3ZGYyQ2t1NWsxRWl2dlBYcDBmOXEyWWo3bHpwSEYyeW13M2YxQmdPaWhIQUpFRCs3S1ZsV0pVamFBRTJ5TmdIU3Fsb2dPTk5WRUI1cG80Z3ZmS3JzUmV5dXhMRUJlaU5xUGJCblQwWjcxUzRnM3VPUERyTFVGY2c1dDI3V1BpbGFzRXp3V3N6cU96bHl3TU9SNkhkNzFIQUxFL1UrVUZDSFZHN1dteFNzM1dDYWF0bnpPSkNwYnNvajdBWVFGSlFRZ1FKVGdjdG1IVmYxYVJFQmNCcjNhaFZTSlVyczZQbTEzQk9SdXhGVy9ia1hMMTI0MnZ2QjVSUjZIZXhHUXE2UGNrdGZzenExMEdrK0k3a1U1aXBRejZsck12SExOek12T1Y4ek5QdEY2bDhkalZvSG8zcG5zMnF2enU0ZXhYN1ptSTFWdDBGcEUwOHhkakc0OEJ3S2lxU01IVW9OYVZWd0xGcTRXWlFRZ1FLSU1ZYVF1b09yWFFvQkVDdWFvbjZSS1ZOUXQ0Z3AyUVVBNmpuL2YvSmMreTFtVWJ0KzlhM3JIMFN6Y3lUU3N6bUtUc2dFOU81bzZEVXVtOFYyNTlnZWx6Vm1FSGo5NVl2cDVKTk92K25kdlIxM2FOa2YwdzBNUGxweEx0Ky9jbzNSNWl0R05mMjZhT2lyN0t0MnlzMGkzYk9RaEZHRW1vZ2hBZ0VRVUtkZCtUdFd2aFFCeExmNFJ2cG9xVVJHK01ENW9ld1JrU3NucTlWdW92TmpEQWVsWG5wc1NqaGFkUkRsRUs5N2Q2MFhyV3RFZFN6cGZucnNMMTFpUzkzM243ajM2SUZNK1MrVHVNeks4ZXIxdDVYektsenU3NlJzRnVJWnB6MXhGTG94VWE5aUtscXphYU9vMExFN2hleVlpZ3QyK2JVNTl1N1h6RElDd0VtRUVJRUFpREpWTFA2anExMEtBdUJUK2lGOU1sYWlJWHhtZnREc0NzbnRSaXc0OWFkS3NCV0wvaG1oSXYvTHdwSWdaSXdhZDNydUJQa3o5dm1tZFhDbEF1SDB6UjBDdVhyOGhuSGZ6dG5HVyt6ZjhMMVZLT3JWbkE4V01HY1BEczhMZTVtUWExdVJaUDFLTGp0K2JlbDhaR1FGcFZyOEdqUnZTeDk3RWV1SG9JVUQwa0tMcTEwS0E2T0VKWGJBMDRXNTFzOUpwZlBMMEtlVXBYcEZPbkRtUENJaUhTWmRSa0psakIxR2RhaFZObStZajV4THYvWkcxVUZrNmUvNW5VODhsNlRUV3FWcU9abzRiYWxwaDZPSHA3REp6cjJxS2ZxTGN4U3JRMDhCQTA2YjB5YmxVdlVKcG1qZDVwTXN3d29WY2d3QUVpR3R3VkwwS0JJZ3FZcG8rcjBxVXB0dUVXWk1oSUwva2YvMzlpcEZyL2ZScG9NbEdZUDdibGVrWmpXcFhGWnNTOWhmUnArZEdLcGJaRGlsQStPKzhKU3JUd1dNblRTMUFaUDNIcE9GOXhlYUQxVTFkbjJPMnVlUjh2L3hPU3ArM09QMGkzbEZtVFErVjBiUXlSUXZTeXZsVHpFeUhKZThkQWtRUHJhcCtMU0lnZW5oQ0JFUVQ3bFkzSytzL0ZxOVlSOVViby8ydURyNmxjNUluVzJiYXNXYWgwWTdYckhVZ0VqOXV3N3R0OXdIVDV1M0w3bDMrZnY2MGMrMEN5cGsxRXlJZ0doNE91VUJTcVY1eldyRnVpMm5uazN6R3Y4eVRrN2F1bktjQlNaZ01Dd0VJRUQzekF3SkVEKzdLVmxXSlVqYUFFMnlKZ0Z4dDc5Ri9HQTBjT2RHMFgvQm1Kazg2dS9IanhUVjIybjQzU1dMVE9ydFNPRm5DWVJUZEFaSW1Ua2huOW0yaWR4TEVNNzBvTk9NeklqZm5IRFJxSW5Yck44eTBkU0N5RFcvbWRKL1JrZTJyekVpRnBlOFpBa1FQdmFwK0xTSWdlbmhDQkVRVDdsWTNLMWNZSzRydVZ5dlhiMFVCdWliQ0hTS0VhUCttcFpRalMwYlRDeEN6YnlBbmMvWnpaTWxBK3pjdTFUUXJZRllLa0JWck4xR2wraTNFQWtrMG8wYktiSWNVSU9rK1NVTW45NnczMisxYi9uNGhRUFJRREFHaUIzZGxxNnBFS1J2QUNiWkR3TGxvK0l1U2xlbkl5VE9temJFMk8za3lSV1BPaEdGVXN6SnY0dmZjMklqTmJJZTg3NjliZDZKWkM1YWJkc1ZhQ3BBYUZjdlEzRWtqVENzSXpUWi9RdDZ2WENBNWZPd1U1U3RkaGJqQmdSazN0NVFMREIra2VvOStPYnJEN0xSWTd2NGhRUFJRcXVyWElnS2loeWRFUURUaGJtV3pVb0RjL1BjMlpjeFhrbTc4ZmRQVWJWUE56SlYwZUh0MWFrTTlPN1kyYlNHNlhMRnUxZWw3bWpEalJ5RkF5QmlMMlE1WmdQNWRoMWIwZmVkdlRDc0l6WVo3eVB1Vjc2Z2JmLzFqdktOdTNyb2pka1gzTVFTaG1RNHBtcEltU1VSL25EdG9wbHUzeGIxQ2dPaWhHUUpFRCs3S1ZsV0pVamFBRTJ5SGdGeGR2SFQ1S3FYTlVWaHNsR1UrUjlFcXBNbE9XQTFyVjZiSkl3YWFYb0IwNkRtQVJreWNhWElCUWpScG1PaUFWYmNhT21CcGZ0QTRzc1o3eS93cTNsVm03SVFsQlVpOHVISG8xcVVUbXRHRStaQUlRSURvbVJPcWZpMGlJSHA0UWdSRUUrNVdOaXNGeUlFako0eTJxV2JlTk03c1BFa0JVcUYwVVZveWM3eHBWOXhsQktSOWovNDBjdElzMHdvUUdaRmFQbWNDbFMxUnhMUjhtUDI1NFB1WFVaQWNoY3ZSMFZOblRTMUF1TkhFdjc4ZXR3SXRsaG9EQklnZU9pRkE5T0N1YkZXVktHVURPTUYyQ01oOC9ZMWJkMUdwNmwrVDJMVGErTExINFhrRXBNTmJNRzhPMnJKaVhqQVB2SEpxcG9OejlQMzkvYWpuZ09FMFFIUlY4L2YxTWZMMnpYUTQxeGhzV2phYkN1ZlBDd0dpa1VDNVVGS21la05hTDk1VnZpSUZ5NHlGNkF3aHAvWTl1Zkd6UmpSaE9qUUVJRUQwekF0VnZ4WVJFRDA4SVFLaUNYY3JtNVVDWk9tcTlWUzFZV3RUcml4YWhSOHBRSEpselVDNzF5MFdlZTdtM0F0RUNwQStRMFpUN3lGalRTMUFtSU5kYXhkUjd1eVpJVUEwUG1oU2dGUnQwSXFXcnRsb2FnSENNRDYvK2F0R05HRWFBc1I3NWdBRWlQZHdFZWFkcUJKbGttSGhOalVpSUFYSWpIbUxxVkhicmhBZ0dybVFYYkF5ZnZZcDdST3RlR1BHaUdIS2ZTZWtBT2s5ZUJUMUdUck8xQUtFT2Rnbld2Qm1USmNXWGJBMFBodFNnRFJzM1psbUxsZ0dBYUtSQzZ1YVJnUkVEN09xZmkwaUlIcDRRZ1JFRSs1V05pc0Z5UFM1aTZqeHQ5MGdRRFNTTFFWSWhyU2YwUDdOeXlCQU5ISWhVN0JZZ096ZnRJd3lmUDRwQkloR1BxUUFhZFNtQzgzNGNTa0VpRVl1ckdvYUFrUVBzeEFnZW5CWHRxcEtsTElCbkdBN0JLUUFtVFpuSVRWcDF4MENST01Na0FJay9hY2ZHd0xrclpneEVRSFJ4SWV6QURtd2VUbWwvK3dUQ0JCTlhMQlpLVUFhZjlPVnBzOWZBZ0dpa1F1cm1vWUEwY09zcWwrTENJZ2VuaEFCMFlTN2xjMUtBVEoveVVxcTA3dzlCSWhHc3FVQXlacmhjOW9yMG43OC9md2dRRFR4SVFVSUY5UHZXYmVFc21WT0R3R2lpUXRuQVZLbmFUdWF2MncxQkloR0xxeHFHZ0pFRDdNUUlIcHdWN2FxU3BTeUFaeGdPd1NrQUZteGRoTlZxdDhDQWtUakRKQkY2UGx6WmFYdHF4Y1lkeUxiajJxOExXWFRWaXBDWnlHeWM4MUN5cHN6SzRyUWxXZUM2MDZRRVpCeXRaclFtazNiSVVCY0J5MnVGSVFBQklpZXFhRHExeUlDb29jblJFQTA0VzVsczFLQWJOdTluNHBXcklNMnZCckpsZ0trZU1FdmFOMmlHYVp2dzl1dDd4QWFOR2FLYVl2UUhRS1FCQmZUcVhpaC9CQWdHcDhOS2NRTGxhdEpPL2NkTnJVQWlSa3pCajI4ZGs0am1qQWRHZ0lRSUhybUJRU0lIdHlWcmFvU3BXd0FKOWdPQWJteWVPYW5ueWxqdnBKaUkwSWY3QU9pYVJidy9nRFBucitrcXVWTDBvOVRScHQyNTIyNUVXRzc3djFvMU9UWnB0MklVRzRNT1gveUNLcFdvWXhwK2RBMG5WMXFWZ3FRVFBsTDBXbnhyakx6VHVnSjRzZWptNzhjY3lrK3VGalVFWUFBaVRxR2tibUNxbCtMQ0Voa1VIYkJPYXBFdWNBa0xtRnhCS1FBdWY3blgvUlpyaUwwNEdFQVJJZ216cVVBYWR1MFBnM3IxMTA0dk0rTlRjdk1kbGhsSjNUSng5QStYZWpiNWcwaFFEUlB4SWNCQVpRMloxRzZmdU12VXdzUTdJU3VlU0s5d1R3RWlCNWVWUDFhQ0JBOVBDRUZTeFB1VmpZclZ4YnYzWDlBMlFwK1JiOWV2bXJLTDNjcmNDUlRzSWIwN2t6dFdqUVNLVDh2eU5jM211bUdKdFA2bW9pMnp0UG1MaFlSRUI5RFRKbnRrQkdRYjVyV28rSDllaUFGU3hPQjhoMTE2ZklWOFk0cVMzZnZQUkNMSkk3NktETWRqdWd5VWNvVTc5THZKL2VZNmRadGNhOFFJSHBvaGdEUmc3dXlWVldpbEEzZ0JOc2g0UHdsWHJSQ0hkcSs5NkNwODZ2TlRLRGhvSWdCTEpzMWdjcVZLbXBhaDFjS2tQb3RPOUNjUlN0TkswQWNYY21JU2hiT1Qyc1dURE5sUXdBelB3L3kzdVY4MnIzL01IRU5DRWR0elpncUtnWEkvejVJU1Q4ZjNtNEZhaXcxQmdnUVBYU3ErcldJZ09qaENSRVFUYmhiM2F4TTlYbTFZaDNOU0RmQm9RZUJjd2MyMHljZmZXamF0cTl5eGJycTF5MXA2ZXBOcGhXMHNpMXltZzlTMFpsOUcwVTZuSitlQ1dGenEvTDlOR2ZoY3FyZnFwTnBCYTFjWU9DTlJvL3ZXbXR6VnIxditCQWdlamlCQU5HRHU3SlZWYUtVRGVBRVd5SWd2K0NIaloxQ25Yb1BOcTNEYUdieTVPcm8reW1TR2M0SjU0bWJzUVV2Y3lEdnUyek54clIyOHc3VHppZkpTYnk0c2VuNHpyV1VLbVVLMDNKaTVtZERSa0E2OS82QmhvNmRabG9CSWdWdGpzd1phUCttWldhbXhKTDNEZ0dpaDFaVnZ4WVJFRDA4SVFLaUNYZXJtNVZmOEx2MkhxS0M1V3VpRmE4R3dtWDlSK21pWDlLcStWT0MwMHpZQ1RiandTS2tjUGxhcG02Wnl0ZzdhZzE4YVBXQ3FTSVZxNEJwMCtMTU9JZmtQVXRCbTc5ME5kcDc2SmhwQmEwVUlJWHo1YVpOeSthWW1SSkwzanNFaUI1YUlVRDA0SzVzVlpVb1pRTTR3WllJeUU1WU4yL2Rwayt6RjZMYmQrK1pNc2Zhek9SSkFkS3pmVXZxMWFXdGFUdGdTV2VSVS9oeUZhdEl4MCtmTTNWVEE5a0pxMSszYjZucnR5M1FDY3ZERDVtY1QzL2Z2RW5wY2hlbmYyL2ZwV2pSZkF5QmJyWkRDcEJLWllyVG9obmp6SGI3bHI5ZkNCQTlGS3Y2dFlpQTZPRUpFUkJOdUZ2ZExIL0p5eS82VWxVYTBLYWRlMDI3eW1oV3JtUisrSHF4QVdHeGd2bE11OUl1NTlHVEowOHBVNEhTOVBPdnY1bGFnRWhoV0Vpc1dtOWVOaHNwV0I1K3dHUjBkc3V1dlZTaVVuMWgzZEg1eW13ZHNQaWU1VnlxVTdVOHpSdzN4TU5Jd2x4NENFQ0FoSWVRZTM0UEFlSWVYRjErVlZXaVhINER1S0JsRVpCMUlQMkdqcVh2QjQyQ0FQRWcwN0tqVDVKRUNlbnMvazMwVG9MNHBpOUE1ejBiUHNyeUpmMTk4NVlwVzZaSytvMVZhOUVLSzRHb3lXRnVraVpKQkJIaXdXZERDcEJlZzBaUzM2SGpURnYvNFN4QTJqU3BTeVA2OS9RZ2lqQVZFUVFnUUNLQ2t1cy9vK3JYSWdMaWVnNGlkRVZWb2lKMFVYd0lDQWdFNUJmOW9XTW5LYmRJblRGam0wdXpFaWxYUml0L1ZZSVdUaDlqV3ZFaFY2WjU3dHo4OXpaOWtDa2ZCVHg2WlBxNXhDS0U2MEFXenh4TDVVVjdaRTcvWWM1d3VCOEJHWjNsZEw2ako4K0loWkZveHJ2S2pJZE01K3ZWdVEzMTdORGFqRU93OUQxRGdPaWhWOVd2aFFEUnd4TlNzRFRoYmdlek1uWG1hV0FnNVNwYW5rNmV2V0RxMUJremNTYjNtNWcxYmpEVnJsckIxSFVHc3A3bzUxOStvNHo1U2hMUEo3T0xXU2tRYTFjcFM3UEdEek8xUURUVGN5SG4wc2t6UDRsM1VnWFR6eVZaQXpKNjRQZlVzbEVkTTFGaGkzdUZBTkZETXdTSUh0eVZyYW9TcFd3QUo5Z2FBUzRjNXIwT3V2Y2JTaitNbWlSV0d6a3lZcjVpVHpPUktKM3pCUEhqRWUvL3dXbFkwdkV5MHpqa3ZjcDdQM1QwSk9VcFVTazRYY21NT2Z0eVROSnhUQ3E0WVk3TTNDTFpUSE5LUm1VSGpoaFBQUWFNRk9sWFpEUm5NT3NoMnpyUG5qQ1VhbFVwYjlaaFdQYStJVUQwVUt2cTF5SUNvb2NuUkVBMDRXNFhzOUo1UEhicWpGaHhyR2c0d21aMkhNM0FHNit1ODI3YkZVc1hDMDYvTW5ONmozUWExMnpZU3VWcU56VjEvWWZ6L0pHMUlQT25qcVJxNWN1WXRrbUFHWjRKZVkvODd1RjNVSjRTbGVuSWlkT21UcitTQ3czOGJIT2ppY0lGOHBxSkNsdmNLd1NJSHBvaFFQVGdybXhWbFNobEF6akI5Z2dZWC9yaVQxR3hoOE91QTBlTU5DeXo1bHliZ1V6Wi9Xck5qOU9vWkJIejd6TWhvMml6Rnl5akJxMDdXU2FOVDZaaGxSSWNyZjV4S2dyUjNmeHc4VHVIUmQrZWcwZm95ekkxRENITGgxa1hSS1FBZVN0bVROcTlmaEZsVHYrNW14SEU1VlVSZ0FCUlJjdzFuMWYxYXhFQmNRM3V5bGRSSlVyWkFFNndQUUp5Qlh2ZTRoVlV0MFZINFVDU0tYdnVtNEZJUi9UakpXVkkrd250M2JpRVlzYUlZZHkyV1RjZjVIdVgzZFNHakpsTVhmb01FV2t6MFl5YUZyTWZraE4vZjM4NnRHVUZwVXY3c2VFTXM1T013L1VJeUdoczNlYnRhTjZTMWFidnlpZlRyK0xHaVNYUytMWlFzcVNKWFE4YXJoZ2xCQ0JBb2dSZnBFOVc5V3NoUUNJTmRkUk9WQ1VxYXRad3RoMFJrQ3VNOSs0L29Hd0Z2Nkxmcmx3M1ZoL051UEdYdC9NblY5Vkg5dTlCclp2VU0zWHh1Y1JhQ3BBT1BRZlFpSWt6eWQvUGh3SUR6UzlBZUh5K1FreHhTVlRMaHJWcDlBL2ZtN3BXeDV1ZkRYN1hzTU4rNWRvZmxDNVBjVXQwVXBNQ0pHV0tkK244b2EzQml3M2V6SVBkN2cwQ1JBL2pxbjR0QklnZW5sQURvZ2wzdTVtVlVaRHgwK1pRNnk1OUVBVnh3d1J3dEhZbFNwbzRJWjNjczU0U3ZaUEFFbWs5Y3VXNmZzc09OR2ZSU3N0RVFGNUZwbndvZHF5MzZkak8xZlRCK3lrUkJYSERzeUhmUHowSERLY0JJeVpZb2htR2JHU1FKY1BuZEdEVGNrUE00dkF1QkNCQTlQQUJBYUlIZDJXcnFrUXBHOEFKUUVBZ0lLTWdEeDRHVU5Zdnk5Q2x5OWNRQlhIeHpKRFJqNzVkMjFLM2RpMHRVZFFzV3prelZFVXExS2J0ZXc2YVBuVW1KTzJ2b2lDMVJCU2tGNklnTG40dVpQVGo3NXYvR3RHUDIzZnU4UnZKdExVZkVoNzV2SmN0VVppV3o1bm9ZdFJ3T1ZjZ0FBSGlDaFRWcjZIcTF5SUNvbzZ4Uzg1UUpjb2xSbkVSV3lMQTdYZloyVUlVeFBYMHkraEg4bmNUMC9HZDZ5aEIvTGhHeW9tWmF6OFlwZUM5Wko0R1VxWUNwZW5DTDVjc1U0UXVaNEdESXhFRmlmMDJIZCt4bGxLL253SlJFQmMrSWpMNjBiblhEelIwM0RSTFJEOFlIcmtKWWRONjFXbjgwTDR1UkF5WGNoVUNFQ0N1UWxMdE9xcCtMUVNJR3I0dSs3UXFVUzR6akF2WkRnRzVBL0hEZ0VlVW8zQTUrdm5YMzBYQnJROXFRVnd3RTBKdVBDaWRMaGRjV3VzbHBBQzVjL2NlZlpnNVA5MjlkOS8wbXhDR0JxaU1nalN1VTVVbUR1OXZpZWlWMW9rVFpGeW03NTArZDU1eUY2OU1UNTQ4TWNTZFdUdGZPV1BxNys5SGdjOWVVcDh1YmFoNysxYmVBRGZ1SVFRQ0VDQjZwb1NxWHdzQm9vY24xSUJvd3QydVpxVmp2SHJERmlwZnA1bXArL0I3QzRjeUZ6eDN0a3kwWS9VQ280dVNGYUlmaks5MElNOWQrSVV5aXdnSWQ3OHkreTdvb2MwYnlaZVBUelRCNFkrVUowY1dwR0s1NEFHVDg2ZDg3U2EwZXVOMlM2WHZ5VVdIYWFNR1V2MmFsVjJBRmk3aGFnUWdRRnlOYU1TdUJ3RVNNWnkwZjBxVktPMDNqQnN3UFFKU2hGVDl1aFV0WGIzUlVrNkJwOGxoeDVVZEVjNEgzN0o4THVYTm1kVlNxK2R5cnF6ZnZJUEsxR2hrbVUwSVE1c25Va2hteTVTTzlxNWZha1FIclNJa1BmMWNzRDA1ZDVhdjNVaVY2N1UwOExSSzlNTlpoUE56WHpCZmJoMFF3Mlk0Q0VDQTZKa2lxbjR0SWlCNmVFSUVSQlB1ZGpZclZ5VXYvWDZGc29xMnZQY2ZCS0FnUFpJVFFoYWlkbTdUaEFiMDdHZ3A4Y0dReUJhOGsyYk9weFlkdjdlOFdKVjhqdWpYbmRvMHJXK0pOc3FSbk5wUk9rMFdudC84OXpibEtGS09ybDYvWWFsM2pCUWcwY1VlTXFmMmJxQTBINmFPRWw0NDJUMElRSUM0Qjlmd3Jnb0JFaDVDWHZKN1ZhSzg1TFp4R3laSFFLNU96cGkzbUJxMTdXYXAxcXFlb2thdW1HZjZQQzN0V3JlUWVFZGtxNjJZU3dIU3ZkOVErbUhVWkV2dEFSTGFQSkg4eFk0VmkzYXMrWkV5Q202bFlQZlV2TEtDSGZsK2thMmJmVVgwZzM5bWxVUHVBWklvWVFLNmRId254WHI3YmFzTXpWTGpnQURSUTZlcVg0c0lpQjZlRUFIUmhEdk12a3FSa0RzVFcyV0hhMDl3S3gzVjZOSDlhZGZhUlpRMVl6cExPcXJTK2E0bTB2V1dpSFE5Tzh3UlJ4VGtCV1ZLbDViMmJWaEtYR3hzTldIcHptZUU2NFQ4L1B4bzd1SVZWSzlGQjB2V21jbkZoeHhaTW9vNXNzVDAzZTdjT1I5MFhoc0NSQS82RUNCNmNGZTJxa3FVc2dHY3BWN2lOUUFBSUFCSlJFRlVBQVRlZ0lETXg3Ny80Q0hsSzFXRnpvcENZMTlSejJDbGxVcDNrYzhPMWpQUjFuakNrRDdVcEg0Tnk2VmVNVzZ5QXhiUGg5ekZLOUhSazJjczE0TDNUZk5EZHNXU0xWYWxVKzJ1K1dTVjY4cklCM2U5eWwrNnVranZmTWd6eVJKZHI1dzVrcWw2TlNxV29ibVRSbGh5OGNFS2N4SUNSQStMcW40dElpQjZlRUlFUkJQdU1PdEFRSzV3bi9ucGduQVlxb2sycXcvUW1qZWN5U0hGUit0R2RXamt3TytNT2dGMlNNeSs1MGZJWVVzQndrN2tSMW0rcEp1M2JsdTZDRDNrK0NYUDQ0YjBwbWIxYTZJZUpKem5RcjVMYnQyK1F3WEtWS056RjM2MTdMdkVhTUg3L0NWMWE5dVUrblpySDF3cmhlOFY3MElBQWtRUEh4QWdlbkJYdHFwS2xMSUJuQUFFd2tGQXJscXVXcitacWpSb1pZZ1NxM1NyY1RYNWN1V3paT0Y4dEdMdVpFTjQ4R0UxOGVFc1RrK0oxZXlzWDM1bHpBc3J0dUI5MHh5UmFWY3NSRmJPbTB6RkN1YXpaS1RMRmMrSWZGODhFOUd5eXZWYTBGclJOYzFxZFIvT09Na1d2RFBIRHFJNjFTcENnTGhpRXJuaEdoQWdiZ0ExQXBkVTlXc1JBWWtBcU83NGlDcFI3cmdIWEJNSVNCRXllOEZTYXRDNnM1R0tKWVVJMEhFZ0lGZkVjMlRKSUZydXpqRUtUNjFjb0N6bnhKS1Y2Nmhhd3phMmluN0lPVzg0bWk5ZVVwdzRzV2pqa2xtVU0yc21SRUpDdkJCWWZQQnp3R0tjYXo3bUxsNXBhZkVoUlRqUGpkMmkvaXRYOXN3UXBsNzZKUUVCb29jWVZiOFdBa1FQVDBqQjBvUTd6UDRYQVpublBtalVST3JXYjVqaFJFQ0VPSENTa1k5UDAzeElHeGJQcEpRcGtsbGFmUENZQXdPZkdRWFkvWWVObys5K0dDVUswQjF0ZWUxMkdQVWdJdDNtL2ZlUzA3cEYweW50eHg5QmhBUk5BbWZ4MGEzdkVCbzBlckxsR3hYSURsaHhoU2o5NWVnT1N2aE9ndUI2S2JzOUc5NCtYZ2dRUFF4QmdPakJYZG1xS2xIS0JuQUNFRkJBUUlxUUgwWk9vTzc5aDVQWU9zdzRteDBOdXg0eThzSGlZOTNDNlpRcVpRcGJySGpLNkU3OWxoMXB6cUlWbG5jc3c1cmZzdXRSYXNIOW1vWFRLRzBhaUJDWmRzWFlTUEZoNWJTcjE2Smk0bjJZN3RPUDZmak9OY1pHcExKZXlxN3ZTRzhkTndTSUhtWlUvVnBFUVBUd2hBaUlKdHhoOXMwSXlOU2JzVk5tVWJ1ZS9lbjVzeGVXTFNZTmJ4NzRpNDNHQXNXcWY2NXNtV2pCMUZFaThwSGNGdUpET2xRc1NITVdyVUFuenZ4a213NVliNW9Uc2oxdnl1VEphTDZZQzNteVo3RnRKRVNLVTU0bmJidjFvYkZUNTFvNjdjcDVUc2dGaVRwVnk5UE1jVU1zSHdrTjd4M3B6YitIQU5IRERnU0lIdHlWcmFvU3BXd0FKd0FCUlFTYzB5bzQvNzlPOC9iME5ERFFWaTE2T2MyQ1Z6WkZwMTBxV1NRZnpaczBrdUxGaldNYlowTUtrSC8rdldWMHdIcnc4S0d0Q3REZjlNaklTRWhzVWYrellOcG9NVGUrTkFRcC85eUtqUWhDdzBFdVVEeDU4cFRxdCtwSWkxYXNGKzhHUjBjOU8wUksvVVF1NGpOUkZ6U3dSd2ZxMUtZcEN0QVZ2MTg4K1hFSUVFK2kvY3FXcWwrTENJZ2VuaEFCMFlRN3pJYVBnSFEwZHU4L1RQVmFkcURMVi84dzBuRDQ1MVoyTkl5VmJsWWVRb1R3UGhERCsvZWdtREZpMkVaODhNeVEzRy9mdlorS1ZLZ2pmbUxmRkx5UVQ0b1VJVHduZnZpdUk3VnVVdC80aUpVYkV2RDQrSm5uZWNFUmdLdlgveVJPemR1eDk2Q3RVdk9jdThDdG5qK1ZTaFVyYUl1SWFQamZGdDc1Q1FnUVBieEFnT2pCWGRtcUtsSEtCbkFDRUlnQ0F0SVJaWWVqeWJmZGFOUDJ2YUl1eE5HT2xSMHVLeDA4SmhZZnZNRmd6QmorTktKL1QycFNyNFl4Ukx2bGVIT3hPYS8wVHB3eGoxcDI2bVdiOUpxSXptZFppTXdpdFhHZHFzWitNQ3hJckxvbmpHekJ6T1BldkgwM05XN2JsYTcrOFpldHhBZlBEU2xBWWtTUFRxZjJiS0NQUGt4bGVlRVowV2ZDR3o4SEFhS0hGVlcvRmhFUVBUd2hBcUlKZDVpTk9BTE9LUmQ5Qm8rbW9lT21HRTY2bGFJaGpxaUg2UEFrVW1teVpraEhZd2Yzb2h4Wk1nYnZmV0dYOUJvNUt5VG5YN2Z1UkxNV0xMZWRveG1ScDBQdUUvTGlwUS9sekpLZXhnL3RSNW5TcHpWT2xmaEY1RHJlL0JubnFBZVBhZUNJOFRSZ3hBUjY4dlNwclZJeUpVY3krdlhaSngvUnFkM3Jnd1dKM2Q0UDNqeG5uZThOQWtRUFV4QWdlbkJYdHFwS2xMSUJuQUFFWElDQWMzckozb05IcVUyWDNuVGk3SG1SZC9MY2lCcVlOZjliNXU0L0Z6bmQwVVhMMlpZTmExUHZydDhhZTN6SWptQXVnTTlVbDVEUkhrNUR5MTI4SWgwOWVjYjJCZWhoRVNpTGttTzkvUmIxN05DS3ZtMyt0WkdteEE2N3JDVXkxUVFJaXZqSnZUMzQzaytLSmdTZGUvMUFtM2Z1RitGQVI4MkwxU0tnRWVGSXR1T3VXZWtybWpOeHVPMGlveEhCeUpzK0F3R2lodzFWdnhZUkVEMDhJUUtpQ1hlWVZVZkFlVFgwWVVBQURSczdsWWFPblVJUEh6MDIydlZLcDhRTTlTR3ZoQWVua2ZsUS9qelphV0RQanFMYlZXWURHS3ZuODRmRnZoUWdOLzcraHo3T1ZwQWVCanhDQVhvNGowdXdRKzRUalhLTGptbjllN1NuQW5sekdXZXhrT1hmOHg5dlA1d2JVUEM5M24vd2tJYVBtMHJEeGs4ejVvR1ZvcDZSNGNJb1FCZDd3Z3o2dmhOMWFOVVlCZWlSQWRHRDUwQ0FlQkJzSjFNUUlIcHdWN2FxU3BTeUFad0FCRnlNZ0xOemZ1N0NSUm8wYWhMTkZmdEVPTGJLZHV5STdLMFJrWkRDNDZQVTc5TzNMUnVLUFA1cWpzMEdiZGJSS0xTcElkT0gxbS9aUVdXcU43TGxEdWlSZVdSZWRVNTdTZjdDVWExWG94SjFGbDJTUGhSempBOXZqb2lFRkI2OENTVjN3T3M3ZEF4ZCtQVjM0N20yYTlSRHpnWG5OS3ROeStaUW9YeTVMWk5xRjVuNWJvWnpJRUQwc0tUcTF5SUNvb2NuUkVBMDRRNnpVVU1ncE1PeVk4OEJzVW82bFRadTNTVmExNHFPU2FKampwOGZwMm04Tk5JVWRFWkZwR05vM0xPeG9hSVAvUzkxU3FON1ViM3FGU2x1bk5nR0dIYU9lampQQnJrRGV1OUJvNmpQMEhHMjNRRTlzazlJY0QyUmlJWWtTZlNPMGNpZ1dZT2FsQ3hwRXVPUzh0blIzYnBYUHBmOGpQTEtQaCtHOEZpMWprYUlpTWZSVTJlTm4va0dwVnZwZklZank0VXJ6NU9OQjk1SkVJOStQcnlORXNTUGh4UXNWd0xzaG10QmdMZ0IxQWhjRWdJa0FpQjV3MGRVaWZLR2U4WTlBQUdKZ013RGwra2wrdzRkcFJuekZ0UHl0WnZvOXQzNzdHNEZpUkdPaW5oR2pNamlZTGxpS1Z2cXNpaEs5OW5IMUtoTzlkZUVoMVVLaGwwMUsyVUtWc1U2VFdubGhtM29nQlVKWUlPaklVSHRuSk1rZkljcWZsV2N2cTVkbGJKbVRCZDhSYVB4Z1RoQ3p0bEltSXpRS2FHSkRqN3gxdTI3dEdIckRobzFjUVlkRVRVL2ZFVGppS1k0N0ZqckVScVlzdjdqaTF4WmFlZnFCUkhDR3gvU2l3QUVpQjc4VmYxYVJFRDA4SVFJaUNiY1lkYTFDSVJNWGZydDhsVmFzVzRUelYreWlvNkxsZFNYSXVvZ3hRaC9rVHUzOFkxS2hFU0tqRmNPSEtlNmlBM1JIRzZkOFY5ZWhTNWVLRC9WcWxLT2luNzV4V3ZPbis1VmFOZXlFUFdyU2ZIQnVmK2Y1U3BDZjl6NEJ5bFlVWUExcEJEaFdxbkNCZkpTelVwbHFWVFJncFJZekUxNU9HcXN1TVgxSzBGaXpPSWdJYUI2Rzg3UGxXeWp5OCtlODNGTWlBMStSbGVzMjB5L1hibG1QS01RSHFFajdXZzI4Skk2dG1wSVAzemYyZURLbDNkZ3hPRzFDRUNBNktFR0FrUVA3c3BXVllsU05vQVRnSUFIRVFnWkVXSFQzRFZyeTg0OVlvVjFKNTMvK1ZlNjl5REE2WTRjRVJKSGthNURNQmhaVW1FY0RvZk04U0hlcjhJUUdzYXAvQit1UTNsT3FkOS9qL0xreUdvSWo4SUY4Z1Nudi9DblVPZnhabkJsR3RxaG95ZU5EbGc0WElQQUt5RWk1cXRJemVJanhidEpSUE9ESEZTMlJCSEtsVDB6dmY5ZThsQ05PZWE0OFdTRUswYmtzOFBQVW1oRjczZnUzcU56RjM0eFVpVzM3ZDVISExGMDNBK0VSM2hNeXhhOEM2ZU5vY3BsUzZMK0l6ekF2T0QzRUNCNlNGRDFheEVCMGNNVElpQ2FjSWRaOXlJZ2k5QkRycmhldlBRN0hUbHhtbzRlUHkzK1BrVy9YYjVHTi8rOVJZL0Z2Z0lpNmNOd2hKUU9VUndiTDI0Y1NpYWN1WFJwUDZFODJiTlFSckVYUTY2c21TbG16QmpCbDNyVC9Talpzc0dIWmV2aEVST21VWWZ2ZmtENmxSczQ1MmZDVVFjaTVucFFkQ1AyMnpFcGE2WU1sRjNzSjVJbGZUcktsT0V6U3B3d0lYRzlRV1NQcDA4RDZlYXQyM1RwOXl0MDZPZ0prVnAxbWc0ZlBVV1hSSFJTMnBWTkkyUmRTbVJ0V2YwOFdmOFJPOVpiZEdiZlJrcVpJam5xUDB4QU9nU0lIcElnUVBUZ3JteFZsU2hsQXpnQkNHaEdRT2E1aDVidXhLaytseTVmb2N0WHJ0T052LzZtUC8vNlIvejVtKzdldTA4UEhnYlE0eWRQakx2M0Yra1B2RGRIbk5peERLY3NhZUpFOUo1d0FsSWtTMnI4K2Q4SHFmNHpTaWs2a0dZVjhRa2dJeURWRzdhbXhhczJRSUJFSERybFQ3N1dIT0dGYUFjZEZCbVJxWW9wVXlTakQxSzlUOG1GdUU0dTVuaHlVY1NlU05TU3hCYlBRT3hZYndmWGpjam41SllRRzdmdjNCTTdsUDlKMTY3L0taNm5mNHhuNnc3WFlnV25jVG1TSVdWMFJENmJ5amR2c3hOazlJTTNKOTIvY2FuTlJtL2U0VUtBNk9GTzFhOUZCRVFQVDRpQWFNSWRadlVnd0E2dXpFZDN0VEJ3YnYzcjZtdnJRY3V6Vmwrci84Z3Q2ai8rUlAySHB4aHczckR3VlRUQ0tBWUpjUXRCRVVMblFHSHdSMEw1cklpMHlHdkx1aXNVbGF1eml2b1BkY3k4NFF3SUVEMHNRSURvd1YzWnFpcFJ5Z1p3QWhEd1lnUmtvYXpqYjRlLzVWeFk3bnpyc2czb3E3OWZmZDRNbTd4NU1RM0dyY2x1WUZ3WGtLOVVWVysvWGN2Zm54VFJ4dlk2VW5jRS9jTzVKYTV6a2JxakdZUGo4ODdQbHVYQmN1TUFaWU1MVHBsYk5tY2lsU3RaeE5oY2trVUpEdTlHQUFKRUR6K3FmaTBpSUhwNFFnUkVFKzR3Q3dTQXdPc0lTS2VxejVEUjFIdndHS1JmWVlJQUFZRkE4UDRmOGVQU2ViSC9SOElFOFZIL1laS1pBUUdpaHlnSUVEMjRLMXRWSlVyWkFFNEFBa0FBQ0lTRGdGeFJaMmVyWkpYNnRHbkhYckVCWVRSanBSY0hFTEF6QW5ML2p5S2ltOTdHSmJNZ1BrdzBHU0JBOUpDbDZ0Y2lBcUtISjBSQU5PRU9zMEFBQ0x4Q1FOWi8zUGo3SDBxYnN3amR1LzhnYU9WWHNTc1pRQVVDRmtPQWQ0bm4vVDhHOXV4QW5kbzBSZnFWaWZpRkFORkRGZ1NJSHR5VnJhb1NwV3dBSndBQklBQUV3a0ZBMW44c1dibU9xalZxNDlnMk1yd05XWUFxRUxBSkFsenZzV3Z0UXNxWk5aUFJSQU0xWitZZ0hnSkVEMCtxZmkwaUlIcDRRZ1JFRSs0d0N3U0F3Q3NFcEFCcDBhRW5UWjY5MEtqL1FQb1Zab2pkRVpEdGR6OU1sWkxPN3R0RTBhUDcyeDBTVTQwZkFrUVBYUkFnZW5CWHRxcEtsTElCbkFBRWdBQVFDQU1CbVg3RmU2NWsvYklNbmIvNG03RXJQZHExWXRyWUhRRkgrOTBYMUtSdU5ab3dyQitpSHlhYkVCQWdlZ2hUOVdzUkFkSERFeUlnbW5DSFdTQUFCQndJeU9qSGZ0Ris5NHRTMVlMYXVLTDJBL01EQ0JnUkVLUDk3Z1RSZnJjbzZqOU1OaVVnUVBRUUJnR2lCM2RscTZwRUtSdkFDVUFBQ0FDQk1CQ1E3WGQ3OUI5S0EwZE9GdDJ2a0g2RkNRTUVIT2xYTHloSndvVDAwOEV0RkQ5ZVhIVEFNdG0wZ0FEUlE1aXFYNHNJaUI2ZUVBSFJoRHZNQWdFZzRFQkE3cnlkdDBSbE9ueml0S2ovaUdaRVJYQUFBVHNqSU5PdnFwUXRTUXVtalliNE1PRmtnQURSUXhvRWlCN2NsYTJxRXFWc0FDY0FBU0FBQk42QWdPem9jL2I4UmNvaTZqOVFlSTZwQWdRY0NNajlQMmFNSFV4MXFwWTNSRGwyUHpmWDdJQUEwY09YcWwrTENJZ2VuaEFCMFlRN3pBSUJJRURCT2UyRFIwK2tybjJIWWZkelRBb2dJQkJ3N0g3K2t1TEdpVTFuOTIrbTVPOG1RUVRFaERNREFrUVBhUkFnZW5CWHRxcEtsTElCbkFBRWdBQVFlQU1DTXYycVlOa2F0UGZRY1FnUXpCUWc0QlQ5S0ZleU1DMmJQUkhpdzZTekFnSkVEM0dxZmkwaUlIcDRRZ1JFRSs0d0N3VHNqb0JNdnpwLzhSSmx5bCtTQWdPZjJSMFNqQjhJR0FqNCtvbzZxQmRFVTBjTnBBWTFLNlA3bFVubkJRU0lIdUlnUVBUZ3JteFZsU2hsQXpnQkNBQUJJQkFLQXJMNzFZRGg0Nm5ud0JFaStzRXRlWVhYaFFNSTJCZ0JSL29WVVlMNGNVWDYxU1pLbWpnUklpQW1uUThRSUhxSVUvVnJFUUhSd3hNaUlKcHdoMWtnWUdjRU9QV0tEeTZzL2FKa0ZYUy9zdk5rd05oZlF5Qms5eXNaS1FSTTVrTUFBa1FQWnhBZ2VuQlh0cXBLbExJQm5BQUVnQUFRQ0lHQTNIencwTEdUbEx0WUpmRmJiRHlJU1FJRUdBSEgvaDh2YWNuTThWUytWRkZqOTNQdWlJWERmQWhBZ09qaFROV3ZSUVJFRDArSWdHakNIV2FCZ0owUmtBS2tRODhCTkdMaURMSDVZRFMwNExYemhNRFlEUVRrenVmdkpVOUtwL2R1TkxwZ2NiU1EwN0p3bUE4QkNCQTluRUdBNk1GZDJhb3FVY29HY0FJUUFBSkF3QWtCNlZBOURBaWd6UGxMMDYrWHIxSTA0V0R4U2k4T0lHQm5CR1Q2VmN1R3RXbjBEOThiendTTEVoem1SQUFDUkE5dnFuNHRJaUI2ZUVJRVJCUHVNQXNFN0lxQWpINnNYTCtaS3RadEljUUhRWHpZZFRKZzNLOGh3SkVPL3JOcjNTTEtsVFVUMHE5TVBqOGdRUFFRQ0FHaUIzZGxxNnBFS1J2QUNVQUFDQUFCSndUa3FtN2RadC9TL0dWcmpiMC9zQU02cG9qZEVUQjJQaGRkNERKKy9pa2QyTHljb2tmM3R6c2twaDgvQklnZUNsWDlXa1JBOVBDRUNJZ20zR0VXQ05nUkFTaytybHo3Z3pKOFVZTHVQd2dRSzc2aUJEMm9LNVlkTWNHWWdRQWpJUGYrR042dk8zM1R0TDdSSVE3RjUrYWVHeEFnZXZpREFOR0R1N0pWVmFLVURlQUVJQUFFZ0VBUUFuTHZqOEdqSjFMWHZzT3c4emxtQmhBUUNEajIvbmhKOGVQRkZjWG5HeWo1dTBsUi8yR0JtUUVCb29kRVZiOFdFUkE5UENFQ29nbDNtQVVDZGtOQUZwL3pqdWM1Q3BlalV6LzlqUG9QdTAwQ2pEZFVCR1R4ZVoycTVXam11S0VRSHhhWkp4QWdlb2lFQU5HRHU3SlZWYUtVRGVBRUlBQUVnSUJBUUthVWJOeTJpMHBWL1JxcFY1Z1ZRQ0FJQWU1MDVlTVRqVFl2bjBNRjh1UkErcFZGWmdZRWlCNGlWZjFhUkVEMDhJUUlpQ2JjWVJZSTJBMEJXZjlScHlrWG42L0IzaDkybXdBWWI2Z0lHTVhub3QxdUpsRjhmbkRyQ3BHVzZJdDlQeXd5VnlCQTlCQUpBYUlIZDJXcnFrUXBHOEFKUUFBSTJCNEJLVDZ1L1hHRDB1Y3RRZmZ1UDBBRXhQYXpBZ0F3QW41K3Z2VHMrVXNhM3JjYmZkT3NnZEVSamxPeWNKZ2ZBUWdRUFJ5cStyV0lnT2poQ1JFUVRiakRMQkN3RXdJeS9hclhvSkhVZCtnNEZKL2JpWHlNOVkwSXlCM09reVpPUk1kM3JhWEVDZDh4UG91ZHo2MHhhU0JBOVBBSUFhSUhkMldycWtRcEc4QUpRQUFJMkJvQjJXTDM4Wk1ubENsZktXUG5jOUY1RjVzUDJucFdZUENNZ0NQOTZpVTFxMStEeGczcGc5b1BpMDBMQ0JBOWhLcjZ0WWlBNk9FSkVSQk51TU1zRUxBTEFqTDZNV2ZoY3FyZnFoTTZYOW1GZUl3elRBUmtsSU0zSER5MFpTVjkvbWthN0h4dXNUa0RBYUtIVUFnUVBiZ3JXMVVsU3RrQVRnQUNRTUMyQ01qb0IvK2RyM1ExT25qMHBDRkFXSlRnQUFKMlJrQzIzaTFib2pBdG56TVJyWGN0T0JrZ1FQU1FxdXJYSWdLaWh5ZEVRRFRoRHJOQXdBNElPTGZlTFYydG9WRjR6Z1hwT0lDQTNSSGcxcnZSUkFyV2hzVXpxZUFYdVpCK1pjRUpBUUdpaDFRSUVEMjRLMXRWSlVyWkFFNEFBa0RBdGdqSTdsZkZLOWVsTFR2M28vamN0ak1CQTNkR1FMYmU1VDAvdHEyY2IreUNqc0p6NjgwUkNCQTluS3I2dFlpQTZPRUpFUkJOdU1Nc0VMQTZBakw2Y2ZyY0JjcFJwQnp4RHVoOHlMUXNxNDhmNHdNQ2IwTEExemVhS0Q0bm1qTmhLTldzWEE2dGR5MDZWU0JBOUJBTEFhSUhkMldycWtRcEc4QUpRQUFJMkJJQktVRHF0V2hQY3hldndzYUR0cHdGR0hSSUJHVDA0L05QUHFMRFcxY1JGNkh6Z1FpSTllWUtCSWdlVGxYOVdrUkE5UENFQ0lnbTNHRVdDRmdaQVNrK3psNzRtYklYS2tkUG53WWkrbUZsd2pHMkNDTWdveCt6eHcraFdsWEtvL1lqd3NpWjc0TVFJSG80Z3dEUmc3dXlWVldpbEEzZ0JDQUFCR3lIUU1qb2g2OW9mWVhPVjdhYkJoaHdDQVM0OFB5bCtGbTZUOUxRd1MwckVQMncrQXlCQU5GRHNLcGZpd2lJSHA0UUFkR0VPOHdDQWFzaXdJWG5uRTd5MjVWcmxEbC9hWG9ZRUlEb2gxWEp4cmlVRUpEUmowbkQrbEdqdXRVUS9WQkN6M3dmaGdEUnd4a0VpQjdjbGEycUVxVnNBQ2NBQVNCZ0t3U2VpK3BhZHJTKzZkcUh4azZkZzg1WHRtSWZnMzBUQWpMNmtmcTk1SFIweHhxS0d5ZTI4VkhVZmxoM3prQ0E2T0ZXMWE5RkJFUVBUNGlBYU1JZFpvR0FGUkdRMFkrTGwzNm5uRVVxMFAwSER4RDlzQ0xSR0pNeUFqTDZNWGw0UDJwWUI5RVBaUUJOZUFJRWlCN1NJRUQwNEs1c1ZaVW9aUU00QVFnQUFkc2dJS01mc3ZNVmFqOXNRejBHR2dZQ0hQMTRJZmI2U1BkcEdqcXliVFg1K2ZraSttR0RHUU1Cb29ka1ZiOFdFUkE5UENFQ29nbDNtQVVDVmtOQVJqL09ucjlJMlF1WHhiNGZWaU1ZNDRrMEF1aDhGV25vVEgwaUJJZ2UraUJBOU9DdWJGV1ZLR1VET0FFSUFBRmJJSURvaHkxb3hpQVZFWkRSRDk3MzQ4aTJWZVR2ajMwL0ZDRTA3Y2NoUVBSUXArclhJZ0tpaHlkRVFEVGhEck5Bd0VvSWNQU0RIYTJUWjMraTNNVXFZdDhQSzVHTHNVUUpBUm45bURkeE9GV3Y5QlU2WDBVSlRYT2REQUdpaHk4SUVEMjRLMXRWSlVyWkFFNEFBa0RBOGdpd0FPR2pmSjJtdEhiVERuUytzanpqR0dCRUVKRFJqd0o1Y3RMbVpiTU5rYzRIT2w5RkJEM3pmd1lDUkErSHFuNHRJaUI2ZUVJRVJCUHVNQXNFcklLQTNIUnd5ODY5Vkx4eVBTRStvbUhUUWF1UWkzRkVDUUVwUUxhdG5FY3NRdVN6RXFXTDRtVFRJQUFCb29jcUNCQTl1Q3RiVlNWSzJRQk9BQUpBd05JSWNQVGoyYlBubEw5TU5UcDgvRFNKVGM5SlJrUXNQWEFNRGdpRWdZQ3ZyeTg5Zi9HU0twWXBSb3VtajZXWG9ndVdqSUFBT0hzZ0FBR2loMmRWdnhZUkVEMDhJUUtpQ1hlWUJRSldRRUN1NkU2ZnU0Z2FmOXNkcVZkV0lCVmppRElDbkdMRmY2Skg5NmNUdTlaUm1nOVRHNkljQWlUSzBKcnFBaEFnZXVpQ0FOR0R1N0pWVmFLVURlQUVJQUFFTElrQXIranluOXQzN2xMT29oWG84dFUveERoZkl2cGhTYll4S0JVRVpQU2pmWXVHTkxoM0Y2UmVxWUJub2M5Q2dPZ2hVOVd2UlFSRUQwK0lnR2pDSFdhQmdOa1JrTkdQbmdPRzBZQVJFeEg5TUR1aHVIK1hJTUJSRHFITEtWblNSSFJpOTNwS0VDK3VFUTFCNGJsTDREWFZSU0JBOU5BRkFhSUhkMldycWtRcEc4QUpRQUFJV0E0Qm1VNXkvdUt2bFBYTHIraHBZS0FSRGVFL09JQ0FuUkh3OC9Palo4OWYwTlNSQTZoQnJTcUlmdGg0TWtDQTZDRmYxYTlGQkVRUFQ0aUFhTUlkWm9HQW1SR1EwWStLZFp2Unl2VmJFZjB3TTVtNGQ1Y2g0RWk5ZWtGNWMyUWw3bnpGMFJCRVAxd0dyK2t1QkFHaWh6SUlFRDI0SzF0VkpVclpBRTRBQWtEQVVnaEk4YkZxd3hhcVVLYzV4SWVsMk1WZ0lvc0FDdzJINEloR08xYi9TTG16WjBiaGVXVEJ0TWg1RUNCNmlGVDFheEVCMGNNVElpQ2FjSWRaSUdCR0JHU2ExY09BQU1wZXFCeGQvTzJ5YUx2cmc4SnpNNUtKZTNZcEFyTHd2R205NmpSK2FGK2tYcmtVWFhOZURBSkVEMjhRSUhwd1Y3YXFTcFN5QVp3QUJJQ0FaUkNRMFk4ZS9ZZlN3SkdUc09lSFpaakZRS0tDZ0ZGNExpNlE2cjNrdEhmOUVrcVNPS0Z4T2JUZGpRcXE1ajhYQWtRUGg2cCtMU0lnZW5oQ0JFUVQ3akFMQk15R2dCUWZwODZlTjlydVBudjJESVhuWmlNUjkrc1dCR1QwWS82a0VWU3RZaGxFUDl5Q3N2a3VDZ0dpaHpNSUVEMjRLMXRWSlVyWkFFNEFBa0RBOUFodzZwWGMzYnh3K1ZxMCs4QlIxSDZZbmxVTXdCVUlTUEZScWtnQldqRjNzcmlrWThkenROMTFCYnJtdmdZRWlCNytWUDFhUkVEMDhJUUlpQ2JjWVJZSW1Ba0JHZjBZUG40YWRmeitCNGdQTTVHSGUzVWJBbzRVS3g5S0VEOHVIZDY2a2xLbFRJSENjN2VoYmI0TFE0RG80UXdDUkEvdXlsWlZpVkkyZ0JPQUFCQXdOUUp5ejQ5ZlJNRjV0b0psNldIQUkyT1ZWMFpFVEQwNDNEd1FpQUlDTXZveGV1QjMxTEpSSGFSZVJRRkxLNTRLQWFLSFZWVy9GaEVRUFR3aEFxSUpkNWdGQW1aQlFFWS9TbFd0VHh1MzcwWDB3eXpFNFQ3ZGlvQVVINFh6NTZiMWkyWVl0cEI2NVZiSVRYZHhDQkE5bEVHQTZNRmQyYW9xVWNvR2NBSVFBQUttUlVDS2p3blQ1MUtyenIwaFBrekxKRzdjbFFnNE5oZU1SbkZpeDZMOW01YlNKeDk5aU5RclZ3SnNrV3RCZ09naFV0V3ZSUVJFRDArSWdHakNIV2FCZ0xjaklGT3ZMbDc2blhJV3FVRDNIendVdDR6VUsyL25EZmZuZmdUOC9Qem8yZk1YTkhKQUQycmR1QjVTcjl3UHVTa3RRSURvb1EwQ1JBL3V5bFpWaVZJMmdCT0FBQkF3SFFMYzlZcWpINXhTVXJoY1RkcUZybGVtNHhBMzdCNEVuTHRlclpvL0pUanlnYTVYN3NIYnpGZUZBTkhEbnFwZml3aUlIcDRRQWRHRU84d0NBVzlHSUxqcjFiaXAxTEhYSUtSZWVUTlp1RGVQSVlDdVZ4NkQyaEtHSUVEMDBBZ0JvZ2QzWmF1cVJDa2J3QWxBQUFpWUNnR1plblhpOUZuS1g2WTZQWHIwR0JzT21vcEIzS3k3RUpEUmo5a1RobEt0eXVXUWV1VXVvQzF5WFFnUVBVU3ErcldJZ09qaENSRVFUYmpETEJEd1JnUTQ5WXIvUEhyOG1MNG9XWVZPbmZ1Wm92a1FXdTU2STFtNEo0OGlJTVZIL1JvVmFkcm9RUkFmSGtYZm5NWWdRUFR3QmdHaUIzZGxxNnBFS1J2QUNVQUFDSmdHZ1dmUG5oRVgyTFpvMzRNbXpWNkkxQ3ZUTUljYmRTY0NuSHIxNGlWUjJvLy9SN3ZYTHFSNGNlTVlPNTJqN3NPZHFKdi8yaEFnZWpoVTlXc1JBZEhERXlJZ21uQ0hXU0RnYlFqSXVvK2xxOVpUMVlhdHljL1hsMWlRNEFBQ2RrWkFDZzEvZjMvYXNtSXU1Y21lQmRFUE8wOEloYkZEZ0NpQTVjS1BRb0M0RUV4M1hrcVZLSGZlQzY0TkJJQ0FIZ1NjZHp2UFZiUUMzYmw3WDZ6dUl2VktEeHV3NmswSXlKYTd3L3QxbzIrYU5qQkVPZjhNQnhBSUR3RUlrUEFRY3MvdlZmMWFSRURjdzBPNFYxVWxLdHdMNGdOQUFBaVlDZ0d1K1dBQjhreTAzUzFTdmpidE8zd2NxVmVtWWhBMzZ5NEVaTjFIcFRMRmFkR01zUkFmN2dMYW90ZUZBTkZEcktwZkN3R2loeWVrWUduQ0hXYUJnTGNnSUZkMDIvWG9SNk1telJLcFY5R1FldVV0NU9BK3RDSGdFQjh2NkgrcDM2Y0RtNVpSZ3ZqeGpBWU5qbGE4T0lCQStBaEFnSVNQa1RzK0FRSGlEbFRkY0UxVm90eHdDN2drRUFBQ21oQ1FkUjhMbDYraG1rM2FHblVmL0ROMnRIQUFBYnNpd0hVZjBhTDVrcisvSDIxZE1ZOXlaY3VFdWcrN1RvWW9qQnNDSkFyZ1JlRlVWYjhXRVpBb2dCMlZVMVdKaW9vdG5Bc0VnSUQzSUNERng2bXo1Nmx3K1ZwRzNjZkxseThnUHJ5SEl0eUpKZ1JrNnRYRVlYMnBjZDNxU0wzU3hJUFp6VUtBNkdGUTFhK0ZBTkhERTFLd05PRU9zMEJBSndKYzg4R3J2RGYvdlUzRkt0VVIrMzFjRVB0OStHQy9ENTJrd0xaWElDREZSNHV2YTlHWVFiMk15QWVuWGFIbHJsZlFZNnFiZ0FEUlF4Y0VpQjdjbGEycUVxVnNBQ2NBQVNEZ1ZRaklvbk4ydEtwOTNZcVdyTjRvVXE5OHhDcnZjNis2VDl3TUVQQTBBbEo4NU11VmpUWXRuUzI2WGZsaXZ3OVBrMkFoZXhBZ2VzaFU5V3NSQWRIREV5SWdtbkNIV1NDZ0N3RlpkTjV6d0RBYU1HSWlpczUxRVFHN1hvV0FZN1BCbC9SK2ltU2k2SHc1SlUyU3lJZ0lvdWpjcTJneTFjMUFnT2loQ3dKRUQrN0tWbFdKVWphQUU0QUFFUENSYXpWRUFBQWdBRWxFUVZRYUJLVDRtTE53R2RWdjFRbEY1MTdEREc1RUp3SXNNcmp2UXF4WWJ4bVJqNXhaTTBGODZDVEVJclloUVBRUXFlclhJZ0tpaHlkRVFEVGhEck5Bd05NSXlLTHpBNGVQVVltcURlakJ3d0JpcndzZHJ6ek5CT3g1RXdLT2psZlJSSzNIQzVveGRqRFZyVjRSSGErOGlTQVQzd3NFaUI3eUlFRDA0SzVzVlpVb1pRTTRBUWdBQWUwSXlGU1NhMy9jb095Rnk5TGZOMitoNkZ3N0s3Z0JiMEJBN25UZXQydGI2dGF1SlRwZWVRTXBGcmtIQ0JBOVJLcjZ0WWlBNk9FSkVSQk51TU1zRVBBVUFyTGoxZTA3ZDZta2lId2NPWEZhN0hUT0s3NG9PdmNVQjdEam5RaEk4ZEd3ZG1XYVBHSWdPbDU1SjAybXZTc0lFRDNVUVlEb3dWM1pxaXBSeWdad0FoQUFBdG9RNFBRcXVYdHp1VnFOYWMybUhlaDRwWTBOR1BZbUJHVEhxeUlGOHREYUJkTkZHcFlQT2w1NUUwRVd1QmNJRUQwa3F2cTFpSURvNFFrUkVFMjR3eXdRY0RjQ3p1MTJtN1hyVGxQbUxFTEhLM2VEanV1YkFnRXBQckprK0p6V0w1cEJDZCtKSHl6VVRURUEzS1FwRUlBQTBVTVRCSWdlM0pXdHFoS2xiQUFuQUFFZ29BVUJXWFRlZDhobzZqVmtEUG1KdEN2dWdvVURDTmdaQVNrKzNrdVdsUFp0WEVvcHhOOW90MnZuR2VHK3NVT0F1QS9ic0s2czZ0Y2lBcUtISjBSQU5PRU9zMERBblFqSWRyc1RaOHlsbHAxNkdUVWY3R1NoNDVVN1VjZTF2UjBCdWRkSDBzUUphYzJQMHloTHhuVG9lT1h0cEpuNC9pQkE5SkFIQWFJSGQyV3Jxa1FwRzhBSlFBQUllQlFCS1Q1bS9iaVV2bTdUMmVoMkpXdEJQSG9qTUFZRXZBZ0JZNjhQY1Q5eFlzV2lEWXRuVU01c21TRSt2SWdmSzk0S0JJZ2VWbFg5V2tSQTlQQ0VDSWdtM0dFV0NMZ0RBU2srTm0vZlRXVnJOUkVwVjgrRitFRGt3eDFZNDVybVFZRDMrdkR4aVdZVW1pK2VNWTdLbGl4Q2dZSFB5Ti9menp5RHdKMmFEZ0VJRUQyVVFZRG93VjNacWlwUnlnWndBaEFBQWg1QlFJcVAvV0tqd2RMVkc5TGRlL2V4MTRkSGtJY1JiMGJBSVQ1OFJBcmlTNW8rWmhEVnExRUplMzE0TTJFV3VqY0lFRDFrcXZxMWlJRG80UWtSRUUyNHd5d1FjQ1VDenVLamZPMm1kUFBXYllnUFZ3S01hNWtTQVdmeE1XbDRmMnBVdHhyRWh5bVpOT2ROUTREbzRRMENSQS91eWxaVmlWSTJnQk9BQUJCd0t3SlNmQnc0Y3B6S2liUXJpQSszd28yTG13U0IxOFZIUHlFK3FrTjhtSVE3cTl3bUJJZ2VKbFg5V2tSQTlQQ0VDSWdtM0dFV0NMZ0NnZERFQjNZNWR3V3l1SWFaRVFnV0gySWp6a25ESUQ3TXpLV1o3eDBDUkE5N0VDQjZjRmUycWtxVXNnR2NBQVNBZ0ZzUWtPTGoyS2t6VktycTEvVFB2N2VNZHJ1OC93Y09JR0JYQkNBKzdNcTg5NDBiQWtRUEo2cCtMU0lnZW5oQ0JFUVQ3akFMQktLQ2dIUE5SNFU2emVpZm0wSjgrRUo4UkFWVG5HdCtCRkR6WVg0T3JUUUNDQkE5YkVLQTZNRmQyYW9xVWNvR2NBSVFBQUl1UmVBL0JlZi8zb2I0Y0NuQ3VKZ1pFWkN0ZG5uRHpVbkRrWFpsUmc2dGRzOFFJSG9ZVmZWckVRSFJ3eE1pSUpwd2gxa2dFQmtFSUQ0aWd4ck9zVG9DeGlhRFlwZEIzbkFUNHNQcWJKdG5mQkFnZXJpQ0FOR0R1N0pWVmFLVURlQUVJQUFFWElLQUZCODc5aHlnYWcxYjAwMFIrZUNOMVhqRkZ3Y1FzQ3NDTEQ1ZUNPSGhHODJYcG96c0wvYjVxSXh1VjNhZERGNDJiZ2dRUFlTbytyV0lnT2poQ1JFUVRiakRMQkJRUVlBTHkzMTlmV25GdWsxVXIwVUhldkFnQU9KREJVQjgxcElJU1BFUkwyNGNtalp5SUZYNHFnVEVoeVdaTnVlZ0lFRDA4QVlCb2dkM1phdXFSQ2tid0FsQUFBaEVHZ0ZPS1dIeDRlZm5SOVBtTEtRbTMzWTNyb1hJUjZRaHhZa1dRWUFGK1hPeHUzbmloQWxvMmF3SmxDZG5Wb2dQaTNCcmxXRkFnT2hoVXRXdlJRUkVEMCtJZ0dqQ0hXYUJRSGdJc1BqZ1A3ektPMmJ5VEdyYnZSLzVpSk80MkJacFYrR2hoOTliR1FFcFB0NUxscFNXemhwUDJUSm5nUGl3TXVFbUhSc0VpQjdpSUVEMDRLNXNWWlVvWlFNNEFRZ0FBV1VFV0dDdzhPQ2pTKy9CTkdUc0ZCTGxIb1lnNFQ4NGdJQmRFZUJvNExQbkx5aHorczlvNGZReDlML1U3ME44MkhVeWVQbTRJVUQwRUtUcTF5SUNvb2NuUkVBMDRRNnpRT0JOQ01oNmo4ZVBuMUNMamoxcDFvTGxvc0RXRWZXQStNQzhzU3NDSFBuanlBZUxqOEw1YzlQOHlhTW9rVWkva3MrTFhYSEJ1TDBYQVFnUVBkeEFnT2pCWGRtcUtsSEtCbkFDRUFBQ0VVWkFPbE84cTNuTnh0L1F0dDBIaGZnZ2lJOElJNGdQV2hFQkZoOTh2QlJKaVBWclZCU3RkdnNiZFZIT2tVSXJqaHRqTWpjQ0VDQjYrRlAxYXhFQjBjTVRJaUNhY0lkWklCQVNBZGxtOSt6NW42bFcwMi9wOUxtZnlVK29ELzQ1RGlCZ1Z3U01UbGVpMkp3TG9IcDJhRVc5T3JjMW9JRDRzT3VNTU0rNElVRDBjQVVCb2dkM1phdXFSQ2tid0FsQUFBaUVpUUNuVmJFenhla2xXM2J1TlNJZi85NitDL0dCZVdON0JCekY1aS9vclpneGFkeVEzbFN2ZWlYaldYSHNldTZJaXVBQUF0NktBQVNJSG1aVS9WcEVRUFR3aEFpSUp0eGhGZ2lFWE1VZE4zVTJ0Zjl1QUFVK2ZTYkVTRFFqdHgwSEVMQXJBckxZUE1XN1NXaitsRkgwUmE1c1JqU1FSUW5FaDExbmhibkdEUUdpaHk4SUVEMjRLMXRWSlVyWkFFNEFBa0FnVkFSa3ZVZGdZQ0I5MjcwdlRaZ3hIMjEyTVZkc2owQndzYm1JZEh5Ukl5dk5uakNNVXFWTWdXSnoyODhNOHdFQUFhS0hNMVcvRmhFUVBUd2hBcUlKZDVpMU53S3kzdVBHMy85UW5hYnRhTnVlQTJpemErOHBnZEVMQkJ6MUhpOUV2VWMwYWxxL0JnM3IwNDNlZWlzbXhBZG1oeWtSZ0FEUlF4c0VpQjdjbGEycUVxVnNBQ2NBQVNBUWpJRHo1b0k3OWg2Z1JtMjYwRzlYcmh0dGRwRnloWWxpWndSa3ZVZk1HREZvY084dTFMSmhIUU1PRkp2YmVWYVllK3dRSUhyNFUvVnJFUUhSd3hNaUlKcHdoMW43SWVEc1NJMmNPSjI2OXh0R2o1ODhFZUlEOVI3Mm13MFlzVVRBZVgrUGp6NThuNmFPK29IeTVjcU9Zbk5NRWRNakFBR2loMElJRUQyNEsxdFZKVXJaQUU0QUFrQWdlS2ZtVzdmdjBMYzkrdExjUmF0NFczT1JjdUxZWUJBSEVMQWpBczRwVnhWS0Y2VUpRL3RSNGtUdllHZHpPMDRHQzQ0WkFrUVBxYXArTFNJZ2VuaENCRVFUN2pCckR3U2NXNFllUEhxQ21yVHRSbWZPWDhUTzV2YWdINk1NQXdHWmN1VXZOaFRzM2VWYjZ2eE5VK1BUMk5rYzA4WXFDRUNBNkdFU0FrUVA3c3BXVllsU05vQVRnSUJORVhCMnBFWlBta25kK3crbGdFZFBzTCtIVGVjRGh1MUFRTzdod1hzTGNzb1ZSejBLNWNzdEFvSXZqVDhjRmNFQkJLeUFBQVNJSGhaVi9WcEVRUFR3aEFpSUp0eGgxcm9Jc0JQRjRvUDNNZmp6cjcvcG02NTlhT25xalVpNXNpN2xHRmtFRVRDaUhzKzV5eFZScmNybGFQUVAzMVA4ZUhHeHYwY0U4Y1BIeklVQUJJZ2V2aUJBOU9DdWJGV1ZLR1VET0FFSTJBZ0I1NmpIcXZXYnFWV243K242algrUWNtV2pPWUNoL2hjQmpucHdaT081Q0h2RWp4dUhodlhyUnZWclZEWStpSlFyekJpcklnQUJvb2RaVmI4V0VSQTlQQ0VDb2dsM21MVVdBczVSanp0MzcxSHZ3YU5wN0pUWjlPTGxDM1M1c2hiVkdJMGlBbzZveDNOamI0L2loZkxSOEg3ZDZkTTAvME9YSzBVYzhYSHpJUUFCb29jekNCQTl1Q3RiVlNWSzJRQk9BQUlXUjhCNUJYZW4yTnVqWmNmdjZhZUxsMFRLMVl0WEc2dFpIQU1NRHdpRVJNQzV2VzZzdDJOU3I4NXRxVzJ6Qm81SWlCQWtMRXh3QUFFckl3QUJvb2RkVmI4V0VSQTlQQ0VDb2dsM21EVS9BaHoxNEM1WDdFZzlEQWlnQWNQSDA3QnhVeW53MlROUmFPNVk5ZVhQNEFBQ2RrTWdPT29oeEVaK3NhZkh5QUU5S1dPNnRDZzB0OXRFc1BsNElVRDBUQUFJRUQyNEsxdFZKVXJaQUU0QUFoWkV3SGtGZDhQV25kU2w5MkE2L2RQUGlIcFlrR3NNS2VJSWNIU0RJeCtPV28vWTFMTkRhMnJacUE3NSsvdWowRHppTU9LVEZrRUFBa1FQa2FwK0xTSWdlbmhDQkVRVDdqQnJUZ1RrcG9Ic2FQR21nbjJIamcydTlVRFV3NXljNHE1ZGc4Q3JEbGMrVkxKSUFScmFwNnRSNjhFSFB6ZG9yK3NhbkhFVjh5QUFBYUtIS3dnUVBiZ3JXMVVsU3RrQVRnQUNGa0RBdWNpY2g3TmcyUnJxS2ZiMXVIVGx1dWdvK3RKWTljV081aFlnR2tOUVJvQ0ZoYkdIaDNnUzNrMmMwTmhVc0ZIZGFzWjFub2wwUkJZbS9IemdBQUoyUXdBQ1JBL2pxbjR0SWlCNmVFSUVSQlB1TUdzZUJOaTVrZzdVeFV1L1U3ZStRMmpaR3JHdmh6ZzQ2c0ZPRmc0Z1lEY0VuRnZyc3I1b1dyOEdkZnUyQmFWSTlpNXFQZXcyR1REZVVCR0FBTkV6TVNCQTlPQ3ViRldWS0dVRE9BRUltQmdCS1Q2ZVBIbEtveWJOb0NGanB0Q3RPM2NwV3RDQ0xxSWVKaVlYdHg0cEJJSzdXejNqMXJvK2xDTkxCdXJYdlQwVnpwL0h1QjQ2WEVVS1ZweGtRUVFnUVBTUXF1clhJZ0tpaHlkRVFEVGhEclBlandDTEMzYTI5aHc0UXZWYmRLRGZyLzFoRkpuNytuSWJVYkdiTXc0Z1lETUVndWUrMk5NalNhSUUxTFZ0QzJwU3J3YkZqQm5ERUI0eUttSXpXREJjSUlBSWlCZk5BUWdRTHlJanJGdFJKY29rdzhKdEFvRW9JeUNqSDc5Y3VrejloNCtsbGV1MjBOMzdEMUR6RVdWa2NRR3pJU0FMeUVWeks0b1pJem8xRmpVZUhWbzFvZmVTdjR1b2g5bkl4UDE2REFGRVFEd0c5V3VHVlAxYVJFRDA4SVFJaUNiY1lkWjhDSnorNlFMMTZEZU0xbXpjWnFTZStJbzhMTGtYaVBsR2d6c0dBdUVqNEN3OFJQaVBxbFVvUXgxYk5hYk1HVDRQRmg2eTlXNzRWOE1uZ0lDOUVJQUEwY00zQklnZTNKV3RxaEtsYkFBbkFBR1RJK0M4NFNBUFpkUDIzU0lpTWs2a1poMDFSZ1loWW5LQ2Nmdi9RWUJGQmY5NUp0S3FoTzZnTDNKbm80NnRtMUtaWWdXRGhRZlNyVEJ4Z0VEWUNFQ0E2SmtocW40dElpQjZlRUlFUkJQdU1HcytCSnozQUFrTWZFWS9MbDFKSXlmTW9KUG5Mb2pCdkJSQ3hOR09GSVhwNXVNV2QreEE0TlZHZ2x6ajVFTnAwM3hJUGNSbWd0VXJsakYrNy93TUFETWdBQVFnUUx4eERrQ0FlQ01yb2R5VEtsRW1HUlp1RXdpNERRSG5MajlQbndiUzNFWExhZENvaWZUTDcxY2hSTnlHT2k3c1RnUkNDby8vcFhxUFdqV3VTL1ZxVktaNGNlTUVDMnZlMHdNSEVBQUNFVU1BRVpDSTRlVHFUNm42dFlpQXVKcUJDRjVQbGFnSVhoWWZBd0tXUmlCa1d0YmRlL2RwMW85TGFkeTAyZlRMYnhBaWxpYmZRb01MS1R3KytpQWx0V3pJd3FPU0lUejRRRnRkQ3hHT29YZ1VBUWdRajhJZGJFelZyNFVBMGNNVFVyQTA0UTZ6MWtBZ2RDR3loTVpQbTBzWGY3dHNERkttWmhtN1JZcy9PSUNBYmdSZUZaZnpmUFNoajFLbk5DSWVkYXUvTGp4UVlLNmJLZGczTXdJUUlIcllnd0RSZzd1eVZWV2lsQTNnQkNCZ0F3UkNDcEVIRHgvU3N0VWJuR3BFMk0xN2FlVFljeDQ5aElnTkpvV1hEVkVXalJ0emxYV0grUHV6VHo0eTl2R29XNzNpYXhFUENBOHZJdyszWTBvRUlFRDAwS2JxMXlJQ29vY25SRUEwNFE2ejFrUWdwQkRoR3BFRnkxYlQxRGtMYWU5QjBUVkx0TytWbXhtK0VGNGdoSWcxNTRFM2pjcXhjN25vYUdYc1hCN051TFV2Y21hbGI1bzFvSytLRnlaL2Z6L2paNXhxQmVIaFRjemhYc3lPQUFTSUhnWWhRUFRncm14VmxTaGxBemdCQ05nUWdaQkNoQ0hZdm1jL2paNDBTN1R4M1VXUG53UWFLOURzR01yVUxJZ1JHMDRVTncyWlJZZjg4L3k1NkdnbC90L2Z6NWZLbHk1RzlVVmhlWW5DK1lNdFEzaTRpUVJjMXZZSVFJRG9tUUtxZmkwaUlIcDRRZ1JFRSs0d2F3OEVRaE1pSjg2Y282bXpGOUx5TlJ2cHhqLy9DaUJlaXZRc1J3dFVwR2ZaWTE2NGE1UXl6Y3FZUjhhc0lrcVVJQjdWRlVYbFZjcVZvaHhaTWtKNHVBdDhYQmNJaEVBQUFrVFBsSUFBMFlPN3NsVlZvcFFONEFRZ0FBUU1CSGlsMlhuenRyOXYva3NMbDYyaDJRdVcwckhUNThRbk9EM3JKZm1KbFdvcFJCQVZ3ZVFKRHdFWjZUQTJEalRTckJ6ektIdVdERlMzV2dVUjlTaE95ZDlOWWx4R3ppdTAwdzBQVmZ3ZUNFUWRBUWlRcUdNWW1TdW8rcldJZ0VRR1pSZWNvMHFVQzB6aUVrREExZ2lFM015TlJRYW5aODFidkpKV3JkOUN0KzdjRS9pSUt1RmdNWUxORFcwOVlkNHdlTWR1NVQ2dlJJY1FzUEhqeHFheUpZdFM3YXJscVhEK1BNRm5oaFMvd0JNSUFBSDNJd0FCNG42TVE3T2c2dGRDZ09qaENTbFltbkNIV1NBUVduclcxZXQvMHJJMUc0ekM5U1BIVHp1NkZYSDNyS0NjZnV5MGJ1OTU0NGlnaVg1cVlsNjhNRm82aS84WEFZK2MyVEpSdFFwbHFHeUpJcFFxWllyWGhBY0t5KzA5WnpCNmZRaEFnT2pCSGdKRUQrN0tWbFdKVWphQUU0QUFFQWdYZ2RCV3FMbHIxc3AxbTJuSjZ2VjArZXAxdzlsa3o1TWRVSFpFVVM4U0xxeVcrTUJyb29NVkthZFlDVkg2b2RpdHZPSlhKUTNSa1ZkMHRaSUgwcXdzUVRzR1lRRUVJRUQwa0tqcTF5SUNvb2NuUkVBMDRRNnpRQ0EwQkVLTGlnUThla1JiZHU2bDFSdTIwcVp0dStqYW4zLzlSNHlnazVaMTV0T3JtZzRXbVp4KzkwcDBKRSthaEVvWEwwUWxpM3hKUlFya29WaHZ2NDFvaDNXb3gwZ3NoZ0FFaUI1Q0lVRDA0SzVzVlpVb1pRTTRBUWdBZ1VnaHdGRVJQcHdMaHUvY3ZVZGJkKzJqTlJ1MzBlYnR1K25Qdi84SkZpTzhLdTRvWUhmc0w0SUM5a2pCcnVVa1o5RmhGSkp6dENzbzBwRXNTV0lxTHRybWxpNVdpQXJseTAzeDQ4VjlUWFNFbkNOYUJnQ2pRQUFJL0FjQkNCQTlrMExWcjBVRVJBOVBpSUJvd2gxbWdVQkVFWkJSRWVjT1duenU3VHQzYWNmZWc3Uit5dzdhc21PUEkwM0wyR2pPVWNBdWhRdWlJeEZGMm5PZll5NzU0UG9NUGd5eGFmek1zVkZsNnZmZm8ySUY4MU9KSWdXb1FKNGNyNGtPbVdLRjJnN1A4UVZMUUNBeUNFQ0FSQWExcUo4REFSSjFERDF5QlZXaVBISlRNQUlFZ0VDb0NMeEpqRHg2L0pnT0hqa2hOam5jVFp1RkdQbnB3aS8wNk1uVG9HdTg2cWhsRkMrTFBTTDRRSVRFYzVQTVdYQ3d6Z2h1bHh1MFY4ZmJNV1BRNTJrL3B1S0Y4bEgrUERrcGQvYk05UFpiYndYZklFU0g1N2lDSlNEZ0tnUWdRRnlGcE5wMVZQMWFSRURVOEhYWnAxV0pjcGxoWEFnSUFJRW9JZkFtTWNJWC9lbm5YMmpudmtPMFovOWgybmY0R0YwUjBSRzVNWjNSUWlrb1hZdi9pUWhKbEdnSTlXVG5uY2lEQlVkd1doWEhPVjVTaW1UdkNyR1Jnd29YeUdzVWthZjVNUFZyMTRMb2NEMHZ1Q0lROENRQ0VDQ2VSUHVWTFZXL0ZnSkVEMDlJd2RLRU84d0NBVmNpNE55ZU4rUW1jeHdkT1hyaURCMDZmcEoyQzFGeTZOZ3Ara3ZVamdRTGtxQ1VMYm12QktJa2FzeUVqRzQ0Q3NkRmxFbW1WSW5MY2F2Y2QwVUJlYzZzR1NsM2ppeVVLMnRteXBveEhjVVVrUS9uUTliOUlMMUtqUU44R2doNEl3SVFJSHBZZ1FEUmc3dXlWVldpbEEzZ0JDQUFCRHlPQUR2QTdBaHp5MTVaWnlCdjRtRkFBQjAvZFk2T25oU2k1T2dKT25MaU5GMy80NFpJMlhyQ3JyTDQ0NGlRT0ZyK09qYTdjNDZVOEhYc21MNGxoY2FyNkFiWGJyeHdZQkVzTnJpTzR3VzlIVE1tdlpjaUdlVVF1NUZueVpoZS9KMlJNbnorcWVoYTlTcXRpbkVNaXllUFR4b1lCQUpBd0tVSVFJQzRGTTRJWDB6VnIwVUVKTUxRdXZhRHFrUzUxanF1QmdTQWdMc1JrTkVSOXBOOWZhTVplNGc0SDgrZVBhUGZybHdUb3VRc25UcDczdmo3cFBqNzFxM2I5Q1F3VUh4VWZwNUZpU0UvZ29XSlE0eThTdU15dXpnSlRXVHd6MWhvT0dwbnVEc1ZqektvUzVYNFdZem8vcFFvMFR1VVR0UndaRXIzR1dWSWw1YXlaVXBQcWNXR2dINStmcTloelZ6d3RaZ0NSRG5jUGZOeGZTQ2dGd0VJRUQzNHEvcTFQdjV4a3hsZmJUZzhpMEN4ZkZrOGF4RFdnQUFRMEk2QWpHQ0VGQ1B5eHRqWkRuajBtTzQvZUVBUEhnVFFnNENINHQ4UDZiSDQyVFBSc2Nrb0l3bmpDS0Z4Z2o4WjNubWVBRWI1M2h6Ny9obWlnUVVGRjRmSGp2VzJzUWRIbkRpeHhMOWppWi9GL0Ura1NZNkZzWDRUenA0WUwyd0FBU0NnQjRGTnU0L3BNV3h6cTAvdi9xR0VBQVNJRWx5dSt6QUVpT3V3eEpXQWdKa1JDRStVOE84NVdzTENKQ0Rna2ZqN0VUMFVmM09OeWFQSFQraUpTT0hpR29iSWlvei9Db01neno5Y1VQLzd1Y2pmZzQ4UkpZb2VQYm9oS3Q0U3FWU2NOdldXK0RjTGpyZkZ2LzFEUkRXY2J5ODhETU1kQ2o0QUJJQ0FaUkNBQU5GREpRU0lIdHlWclVLQUtFT0dFNENBYlJDSXFFTXR4Y2xqSVVRZVAzMHF4QWovRWY4V2Y1NCtEYVFuNG1lQmdjL29hZURUb0hRbTNpalJVVDhSV2JFUUVSSlkxRGhxTmh5MUxJYTQ4STlPL3Y3K0ZETkdkUEZ2ZjRyQmZ3dkJFVE5HRE9QZkxEcTRrSjgvSDlZUlVXd2ljcC80REJBQUF0WkRBQUpFRDZjUUlIcHdWN1lLQWFJTUdVNEFBclpId0xrSVBhTHBSVVl0U2xBVWhjVUlwM0k5RXpVbWpyK2YwWE9SOXNVUkZGbHZ3V2xnL0xNM3BVd3hDVVpkaTFFbzcvakRBb1AvOXZmM0V6LzNKVit4TXp4SExQai8vZjM4amYrUFpnaVNzTVdGSkRneTQ3VDk1QUFBUUFBSUdBaEFnT2laQ0JBZ2VuQ0hWU0FBQklBQUVBQUNRQUFJQUFFZ1lFc0VJRUJzU1RzR0RRU0FBQkFBQWtBQUNBQUJJQUFFOUNBQUFhSUhkMWdGQWtBQUNBQUJJQUFFZ0FBUUFBSzJSQUFDeEphMFk5QkFBQWdBQVNBQUJJQUFFQUFDUUVBUEFoQWdlbkNIVlNBQUJJQUFFQUFDUUFBSUFBRWdZRXNFSUVCc1NUc0dEUVNBQUJBQUFrQUFDQUFCSUFBRTlDQUFBYUlIZDFnRkFrQUFDQUFCSUFBRWdBQVFBQUsyUkFBQ3hKYTBZOUJBQUFnQUFTQUFCSUFBRUFBQ1FFQVBBaEFnZW5DSFZTQUFCSUFBRUFBQ1FBQUlBQUVnWUVzRUlFQnNTVHNHRFFTQUFCQUFBa0FBQ0FBQklBQUU5Q0FBQWFJSGQxZ0ZBa0FBQ0FBQklBQUVnQUFRQUFLMlJBQUN4SmEwWTlCQUFBZ0FBU0FBQklBQUVBQUNRRUFQQWxvRXlNcVZLeWxhdEdqR2lKODlmMDUvLy9VWGJkbTZsWll1V1VJdlhyendHQkpkdTNXaitQSGlVZWZPbmQxdXMzU1pNdFNzYVZQRDFybHo1LzVqcjJ6WnNsU3RlblZxM3J3NTNidDcxKzMzRTlKQXlaSWxxVVdMRnRTalowODZlZUtFa3YwMGFkSlEvd0VENkljZmZxQmpSNDhxbllzUHF5UFFwV3RYeXAwckY1VXJWMDc5Wkl1Y01YUG1UUHJyNzcrcGM2ZE9GaGtSaG1GV0JJb1ZLMGF0VzdjTzlkM3BIejA2VFo0OG1iYUs3N2U1YythNGRJZ0pFeWFrMW0zYTBHZWZmVWFIRGgyaW9VT0d1UFQ2dUZqVUVjQzdXZzFERlY5QzViTnFkNEZQaDRWQSsvYnQ2Y3N2djZSeTVjdlRDK0cvUitYUUprRFllZGk2WlF2NSt2bFJwa3laS08ybm54STdGVXVYTG8zS2VKVE9iZGFzR2NXT0U4Y3RMKzUrL2ZyUlI4SXhyMTZ0bW5GUDRRbVFnZ1VMR2c1bHQrN2RLZURoUTZWeHVPTERVUkVnNzcvL1BuVVNqdUM0OGVQcEp5R3UrQXR4MEtCQk5HWHFWRm9seENhT3FDRVFjaTVGOVV1TkZ3QU9IVDVNL2NVY05ldGhOUUVTa21PejhxTHJ2cXVKOTJ6dDJyV3B6VGZmMEcrWExubjBOc0lTSVB6OU5uRGdRTnF6ZXpldFdyWEtwZmYxYmJ0MlZFaDhiNnhkdTVaT25qcEYrL2Z0YytuMWNiR29JeERWZDNYVTc4QzFWM0QzY3hiU2x3anI3bFUrNjFvVW9uWTFWL3RIcnI1ZWVLT3poQUE1ZmZvMDllalJ3eGdycnhMTm16dVhMbCsrVEIwN2RneHYvS2I0dmFvQTBUMm9xQWlRa1BmdTZRZENOM2F2MmZmeElSL3hnNWN2WDdyc3RpQkEvZ3VscHdRSVIycmRHWldWMTNlbkFISDNHRncyMGFOd0lYYzdSbUhkV2xnQ0pBcERDdmZVa1NOSDB0dXhZbEdUeG8zRC9XeG9IM0QzdkhEMzlTTTFhQStmQkFIaVljQk5ZTTdWL3BHcnJ4Y2VoSllUSUR6Z1diTm4wNzE3OTZoMXExWkdLcy9ISDM5TU5XdldwTWVQSHhPSDJvWVBIMDRyVnF5Z2FkT212WWJQZ29VTDZjTDU4L1Q5OTk4YlA2OWN1VExWcTFjdmVDWHNzODgvcDRaZmYwMnBVcVdpMjdkdjAwcXhDclZtOVdyanN5TkdqS0M0SWdXTGZ5OGpGRk9tVEtGU3BVc1RoN2RQSEQ5dTJIMzA2Skh4K1J3NWMxTGpSbzBvVHR5NGRQRGdRVXFTT0RIRkZmOXUyYkxsZis0cDF0dHZCLytNMDY0KytQQkRJd1ZyMXF4WlZLQkFBVXFhTkNrZE8zYU1Sb2d2a1NkaWpGK0xlNmhRb1FJMUZOZm5sTFN3N3R2WjJHeUIyOFZmZnFHK2Zmb1lQeDQzYmh6ZEVPY0gvNytJU2p5NGY5K1JaaWFjNHlvQ245SmlmREZqeHFTeklsb3hjY0lFK3VlZmYwZ0tFTVluZTdac3h2ajM3OTlQWThhTW9hZFBuNUtmV01uamU4eVhMNThoR0RtTmJOS2tTZlRYalJ1VVBYdDIrdTY3NzJqa3FGRVVTM3doTWtieU9IbnlwQ0UwM3hKNE5HblNoSExuem0yTWQ1OVlyWnN4WTRaeDdUY2Q0YzJERHo3NGdCcUxMOTlQUHZtRTdvc3hybHUvbmhZdFdzVGVQNVVWMFNTK2p3NGRPdENGQ3hjTUU4dVdMYU9qQXZQUVZ2NDVXc1h6NEdOeExjWnJzNGpPelJXaW1LOFZIdmNjL2NtZUl3ZHQzclNKaWhRdGFtQnhYc3pKTjJITjE0c29IankvUTg0bEhodW5ZRTBTcVIyVksxV2lHREZpR0t1ZzgrZlBOKzQxWHZ6NHh0aXpDUjc1NEhrMlFmQ2NTTXpYMFlJamViQmpIVEtOaThlU05WdFdFYm1yYm9nb2poSnl1TFZtclZwR3VMV1pTQkVzTGxKTzJPRmo3dmlacUZ1bkRpVjk5MTI2ZXVVS1RacytuYzZlT2ZNZlN0a1pxU1ZXcUFzWEtrU3hZOGVtWDhVcTljU0pFNDNWNnZmRnN6bHU3RmhhdG53NWZTeDRZQTZ1aU1XSTRlTDU1R3Z5OFlXWWQxODNhRUJ2dmZVVzdSS3J5WG55NUtFLy92Z2oxQlFzSHpIUHE0dDB4dUxGaXh2UDZrOC8vV1RNVmI0V1A0ZU1BVCtIUzBUS0p4KzllL2VtVDBRRWxxT1Y3NzMzbm9IVmpoMDc2SDhmZlVRM3hiUEJmRG9mYzBRcXpmWHIxNDMzd3VmcDB0RWQ4VjZaS0s0djB3L2ZoRC9QVWZtY3JSYnZJSDZXVm9tL0t3a08zL1MrQ085OUZCcjJieG9ENDFGSlBQL3ZKRWhBVjY1ZXBWa2k0c3pQWjhpRDUwQ1dyRmxwa1poN1pVVHFhS3pZc1dqdG1yWEdQR291MGpTVEprbGl6TzloNHQxNCs5WXQ0M1IrcDFVVitDVVQ4NENqMi9QbnphUGRncWRhWXQ0d0Z6MEZodncramVicmE4elRHMy8rU1czYnRuM05kRmp2R1A1Z1NoRnBiU3JlSVo4S3J2Nzk5MTlhSVNKNTY5ZXRvKzdpL1pKTHpFTjU4SE83VU54N3lJT3g1L0VuRU0vSHBkOStvNm5pWFMvZkRXRzlTL2c2WWYwK3BBQmhqRW9KVytQRlBOcStiUnN0WHJ5WXRvcS9SNHI1ekVkWXoweEUzL3NoM3d1RFJmclY3bDI3d3J6UDBPYmVZbjVmT2gxaHplM3ducDNRcnMvdlVrN3Q1ZS91UEhuelVqenhQTzRUM3l0amc3NVgySFRlTDc2Z21qVnFVTEpreWVoUDhYM0MzMmtIRHh3dzdpcXljNExQVFpRb0VUVVY3NjhNR2RMVDB5ZFBhYS80enBrdS9JZlF2blBDd2owOEg0UHRjT3AweG93WjZXRkFnUEh1bUNQRzhPelpNNUlDNUUzdjZwQno5RTNQa2VwNHdycW44TWJ6Sml6ZTlKeUY5V3pJT2NFTFJwemx3UnlmRUNuZS9OM1AzTER6ZkVOd3puN0dlZkdlZHZZbE9FTW1vbjRIZjNhZWVLL3dOZTZKT2ZlRm1GUDNoVC9KV1JneU1zanZ4VzlFaEpUdjl4ZmhNL0U3c0dTSkVzWTdpbjFQVjcwdnd2SWxpNHJ2enREOG83QjhzMGhkTDhSZ3dwcFg0ZUdXS25WcWFpdHdTNWt5cGVIMzhUczhZNFlNNWs3QllxZmdCNUdtNHk4Y1d3YUhSY05zOGNYT0wwUUplUC8rL2VtQWVCRnhiVVJ0TVVrNmlpOUdubURPUjFnUDAxL0NFWjh4WXpwZHYzYWRPTzJFbmQrODRxaUhicEFBQUNBQVNVUkJWQ1hZVDF5WFgzQ2hDWkE3ZCs3UVJ1RklmaUJBenlHY1NuNVEySEZsaDV5ZGdRY1BIdENHalJzTlJ5bXIrSksrSXB5YWtBSWttM0RJNjlXdGF6eHNRNGNPcFRObnp4cGpaQUhDSW1qVDVzM0IxMmVIYllWd3ZKd0ZDTnNJNjc2ZHg4OFJJMDVoNDRlSTc1RWY5TWRQbmxBTjhVTDM5L2VuQlFzV0dJN0VQT0VRU0J6WEMwZWRSUWZuOFAwam5BVU81Zk9EeUY4VWQwVDlDVHZTUE5seUNTZDNrZmp5NUpjcE82RHNTUENYT3ovWXpCY0xIWjZZemkrTnMyS3MrY1REWDFlTWY3TVlKNCtWT2VNVlhoYVZ5OFZZMllsa3g1ZWRyMm5pQmZHbUk2eDV3QTRNTzRwUHhGalorV2FSeXZ6S3RDOFZBY0tyaVB6RmRGZU1uVk1BMmNFcEtvUUV2eFEzQ1N6QzQ1NGROblltLzdsNWs0NExKNHRGRUR2dFBHZER3NXBGVFVUeENHMHV0UklpUGE5d3dILzk5VmZhTCtZeHYyeFRDeWUrN2JmZjBxL2l4Y3IxT0l3MVJ4VjVEckRqejg3SkJPSHdaMGlmbnJqMjZaZUxGMm1odU05RFFrZzdIeVhFUE9ENTNGTFlZQkhBam52eTVNbURhNWQ0MVpVWEJicDA2VUxwaFBQTnR0aUpaZWY3Uy9FRmt5SkZDa05vU3NkVVhydTZtSSsxeElJQ3A2RmNGUzkrbmtzc2dCbzJiR2c0bGl4QW5vdi9aNGVTZi82VnFJazZldVNJSVE2U0NMSE9lZlQ4N1BDY1NpL3NzdTF6WWw2RlZnUENjNjlLbFNxMFU0eVpuODl5NGxwUEF3T3B1ZmpDU3liR0VoRUJ3dmQ5V05obnAxc3VXTWl4c0pNV1h6aXhQRmV1WHJ0bVBIdXh4UnhxSUFUUzQ5aCtOR0NJWXdGbDN0eDVRZmpYTXB6eFlVT0hPUVJJeXhiMCtORmpZeEZqMi9adG9oN08xL0crU0I3MHZqaHpscjRVNzR1bXpab0tjWFBIbUlPcCtYMlVNK2g5dEhRWnBVdWZqZ2IwSDBBbmdyRG5ML2ZrS1pJYjJNZDZPNWJnZW9KeHU0ZEZxaDJQNGZMbEt6UmdRSC9hdm4yNzRPcVlJWHJZSGd2NDI3ZHV2ellIalBtY1A1OTRicy9URVlGQndVSU9YbGxBclYrMzNuZ2VDaGNwTEo2N2RjWUNCdDhMcHhrZEZkZmxWQ04rZGo3NTlCTnExYklWK1lvdnE3SGp4aHE4VDVrOGhUNFhDMEkvRFBwQk9KbU9kNzN6NFhqSFZBdDZ4OXczM2pIOERtZW5JVTdjT0RSaC9BVGg0RDJrRFJzMkdNOG9pOUIrZmZ2UmJmSE9MdnZWVjFUZ3l3STBWYnhQRGg4K1FuOElnZWg4Wk0vaFdDUmg1NGVmMFJMRlM0ajAyOWhDWURlbmFFS3dNbDdHdTBRSXJUUWZCNzFMcGpoU1NKbnJzSDVmckxpakJxUm5qNTdHTzUvNVhTZXdHVDl5TlBuZkQzeE5nSVQxekxEOWlMNzMrYjNBaXdOK0FsOFc4aGZGOC94Y0xCQ0U5VTZVenVBajhmenljNy9ObUF1djEreUZOYmY1T1F6cjJRbnQraXhXK1h2bGQvRXU0WGQvMnJScEJmYkZqZThsL2s3S25DVUw5UkhQK0hteFNNVGY5ZndlWlFleG5maE80bmRaV044N2NVVDZOSXM4VGxubTcyUmpUb2p2Z0w3aXU0YkhOMUFzWlBMM0dDODI4SDN3b2dtTDFwRGZPZnorRHd2M01CMTJJV1I1a1pLZFcvNGVqeS9FUFgrWHNnRG03MG9XSUdHOXE1M25LTThONHprU3ordXI1K2hUOFJ5MXBHdmlQUlBSOGJBekc5WTlSZFpuNHZldjhaeUpkOVBVYVk3bmpMR1B5SnhqZjRQcmZKbWp6TUpmQ1JUdll4WnEvT3lXRjc0QSt4SXR4VHdKS1VBaTZuZElBUkpYekltRGh3Nkt1Zk9yOFIzQzJRaDF4QUlaMXhyejl6blBoelZyMWxCMDhiMVlYUERFejM1b0FrVGVCNzlmandzKytIdVIwL1g1bVRQZUYySDRIdEp2Q2MyWFpQRWRtbjhVbG0vR0M4YnNPNnBjVDJWZXNRQjVFMjdHTzBXOFgvajVZWDh0bmxpdzUwVkVQa3hkQXlLTDBDVlF2Q0xLemdTL2hQa2g1cGZHRnVGczhLVGgxUjBHb0Y3OStzRXIwdks4c0I0bS9neS9NT1dLR0w5b2VHV0tWKy9PaUZYYTBBU0lmSGxGRjZ2OFM0U0R3UytDd1lNSEd5OHZ6akdXSzNuOGtFOFJUaEd2cG9RVUlHejNUU2xZdlVXazRvaHdDbmpWZXJGWWdXWEhjSWdZbjdNQTRTaENXUGZ0UExuNEllSVhGRHNlL09YZVNLeDg4emg3aW1KeVhnbm1TRWgzVVZmQ0lvZ2RVbGF3YkkrUFl1S0xnTlY0Sy9IbCtabjRZdUF2Q2hhRmUvZnNNWDdQMlBPRVk0ZU9Wei9TQytlVm5RS09ZUEFYSUVlVmxndHh4a0pNUmtENFJSQXlKTWpSaFJIaUpjMWlicDF3TVBsZzBjUFg0NVd2TngxaHpRTjJNSG4xdDZ0NHdUT1hmQXdiTnN4WWlXZkhYMFdBTU41OEwreXM4cW82ejAxZWpmOS9lK2NCWmxWMXZmMDF3TXd3TkF1aUNDaElOU0RHMkVCQUZMREZ4SVQ0Vnl5QWdyRW0zeCt3UkVVTnRpOWdSQ014MkRVYUcxRVROU2I1eEVaVVZDUWdhRlJVbW1BVUZBR2xsNW1CNy8zdG1UTmVEL2VldVJjR1pKaTFmWHdlNEo2eXozdjIyWHU5YTYxM2JkNE4xNnpzM1VjRTVDd1oweEE2UEFSSldFTUtjc0VqYlFxV0ZscU0rRFh5dU9HdHZ2YWFhMEwwQytPTXlSTmprWEZPR3ltU0FJa1l4UGVqbHFRQmFTWkQ4eTVOT0x4N2lBVUczUW9SWXQ0YlJCWkNpdUdJOFRCQ1VVZUlIOTYvRWkwb3piVUk0K1hGMnhjMzJvbFNNWllReTlJZ3lFUTRHYmRFMUNBZ3FjYkJhQkgzcGpKNFdEeFloRTdUczE0aDRrVHFKbDR4SXFZc3luRUNVa2ZZNG1HSFlIRThqVWdRRVZJTU5VaExOZ1NFeGZMM0lsdnBHa1lhQythdkZGMmpRWHk1MTIyUGFjNTZlWUtpWWNKL2VRcitvOHJ4UDNOUUJRRVpjOHVZSUV5T1d2d2RFM21BZ0dCZ1ExUUtDalVmYWI1NGJlSnJZVDRhY2ZVSU9VSGFoNGhVU1VteHRXamVRdEZVWVMvQytQYjB0NFBCL05LTEx4bUVrUmEraDNQT0ZsNWxSVEJhdG1vWnhzbkVWeWNHSXorMVJRU2szOG45UXBTbjYyRmR3eHp5K0dPUEc4OU91LytCKzIzSjRpVWh3Z2lSWVM1NDc5MzNnb01tSWlTQndELzNmTkNHNFdqaVhRODhZNkQxNjljdkxPUTRobEpiMGh6ejA3NC9EWE1rOXlOVnQxWmVyZkNzTXo2WVlhTkdqaXI3UmdkS0F6SWt2UVlFWnhiUFBFanZBTTgwY3hSekIzM0V3M2VHK2hYbUVqMEQ3ZWJmYVM3UitCdlFmNENkclA0bS9SNFJrSEhqL2h5STc0d1o3MnYrSFJFaWhvVzE2dGlmYjd1dklnS1M5TTNndk1sMjNxZVB0OTRxZ3FOdkIySk5DLzFNbUJNamdrRFVmVUxLMkV0OUI1bkc5cTNDQ2E5eE5nUWs5ZnJSUFhsdUREa2FtR1BNRGRaOGROMzExOXUrbWh0WVZ4aHJaQlN3VGtDY2lZQW5qNG0rSVNvYWpZazh6ZHQzaHpIeGdjYkVTTU0yZ0ppeEZ1TDArZUh4eDR2NHJ3a2tQTFZGa1oxTWRrS1NqWUV6N2JmcVo2cmVrVDRUNVIwdUowMklnQ1RNMWFuOWdMeUc3MGpyV2ZpT3lnbEo1QWpMOW5tSVlDVDFhVXRzcG5pcVk3Wmo3bnE5WitaKzFscklaNnJ6NktKeVVUUFJmS0pJcWJaRUxuWUhoalRyTDQ0NDN2Y1pHbE5rSWJBK01hN1FwVVlPVlhBZnFnanNVWDM2cENVZ09LbHgrZ3pTTmRMT0Z3bmZXVVJBTXRtU2NmdW9NbnVCY1FBQnlmWjYzeHJjK2t0bDR5b0p0MTEyM1ZXT3J0L1l1SEhqS2pJc3NJRVAxZHBSclFrSUhoRklCbTJ2dlZxRWhXR3lCdWdOOGdEUThBUmdOR0hjWSt4Z0FMSGd4RnZTeHpSLzNyemdvZDFQSCtSSE0yY0didytHQlNsT3RIUUVKTFZLRlpFUEdEQWVtZ3MxcUh1TCtmM3N4Qk9Ec1VYRDRLUGxRa0F5WFQrVmdKRDJrZFR2VkF6QUNGeEloMkJRRkd0eDNVdUdJSk1ZNGVCVHRDaGhxT0sxeEl1Y3JqRTU4SHU4Q2haZVBkSUxTR3ZEUU1jSVdhMEovQzNoU0FTSkZDMjgxWEd2UmZ3RGkxSVUwdDBiWXlSS2NVdjNlNlp4Y0tsU3l2RDg5MDJweElDQmpXY1hUelRoL2x4U3NKaTB3WW9Gb0w0V2o3b2lpRy9LOENOZHE3SjNIeEdRNklQa2cwL0NHbzhxMkdhTFIyVWFFSXg3SW0xLzFNSU5JV3dpc2c0SjR6MlFEbFFvSXdXdloxUVFvVElST2xFMHZIQVk4U3d3RUxIOUZYSmxrV1ZobzFEQ3V4SzljaHpqSnQ3U3BVcEM2UEh5RUZYakhQb0VrVUEwakpjRkFwS2FPa1BrZzNmQ0FuS0pvbnc5ZS9iODFydk9wQUZwSVEvWEhUSjRJdzhyZmVQZVJDdUludnhkM3E5c0NBalJvVXhWaXpEU0ZpZ0NGNUdmSmtwdCs2TWltVTlPZWpGNDluR1c0RlhyMkttanF1enRITzRmNFI5RlFQQ1c0NDJQV2lZQ0VoRUdqbnZ5S2MxSE91ZTZhNit6Qi82VUFmdW5ucmJuNUEyR2dLUVNCdnA0azhoMFEzbjlJWlpUNWIzRUVGdXRPU0xlSWdMUzk2ZDl3N3ZoMng4cEVuWDdiYmVIaUY2NnVZK29COCtHMFU1Nko0VHBudklJQWtUenROTlBzL1BPTzk4dTFidXNrMThuUkVmaURhTElITU44TVBXdHFacGpKbGZNTVJkZlVsWjVKZDd3ZEpMS1ZSa0JDWVJWa1RldUgyL015ZDE3ZExlZjlmMVplRjdhb01IZnpDVS9QK3ZuaWI4ZktDOCszL09HMGcxeVB0UUtrUkRlRThtYlJjSmkzQzEzVlJDUXBHOEd3enZiZVo4K3hnbElaWE1pODNSbGxRNHpqVzBNdDlma21NcUdnS1JXVWt5bkxTU2kxZWVvbyt4RXJhVTg4MmR5SkJCUmpScE9Id3hHb25QUm1FaTM3a1M1Nkp1TUNVV0dHUk1EWkNReXA1UFdoZE9QMU0xNEJnWG40bkJLd2ozSnhpRFNpUVB3TXZWL2hnaGt2TVUxSVBHNU9uNDhLYnc0U1N1K0k4MGRFYm5KOW5raXAyU21QbTJKelJRbklKc3o1a2cvSlNLTUk0V0dNd0l2UDNNbStLUVNrS1QzSDdjN01LUko2WTIweFZFNlBzNU9NZ1FZZDF5YkNHajh2dkVVTE9ZTEl2VlhwWmt2S252bUxscmo0aFZQVTIzSnVIMVVtYjNBZXA3TDlUWVpoUHFIcEhHVmhGdWJObTNDK0FiVEtGMTNoOVNBa0JaQytEUXlTRVBZU1FPVC9GbThTcEgzTXc1dVpmbU1zRXRDOWVRSTQ3WEgrNHhIaE1raUZ3SUNXKzRqdG94T28xUkdmcnBGT0xWdjJZalFVd2RsWEFPUzFPODRCdmZMRUp3aThrWXVMUjRnMGlYNE0wU3JyancwZUdLYXlpZ21ZdlA2NjY5dlVvMkZEdzFqUHI0NGtlcEQzdmhKd3Arb0I5ZWc2Z29mZmx2bHg1T2VnYUZZR1FFaDczR0lGbWhTN09MNkFFTHZTYVhjTW8wREpoWFNWSGdma1VoNHNEeWtKNWJyYURCMHN5VWdHR2VFVlBHV01mRXNVMWo0ZGhteFUwVzBJQ0NWdmZzNEFha002NjRhNTduZ2tTc0JHU3RqSGcvY1dCRmtJanJjcTVYU0dySWxJRXd3clRYeGtNWkNXdG9ycjd3U0ZtaFNLRTZRWng0aVVheklIK09PVUhxVTJ4Nk55eVhTQmFBTlNtM255WU9EQjVLVUhhSnhHS3k4cTJ3SUNCNnlpSUJFbXB4TUJJUUlHTG45cVI0Ym9vMUVEOGpEaDN4Vk5RR0pGcENuSnIwVTh0ZEpPUXI0ankzSGY0andiMVdHZjFVUkVDSVF4Y1VsbTJDL1ZOaEQ3T0lFaEhlQmxxUFhrYjNDUEhqQUFkKzNwVXVXYW13UERkR2ExSmFKZ0pBQ0ZVVXdVNTB2M2JwM0M5RUQwcGNnUHpoRkxoOStlUVVCMld2dnZjTDM5SmNuL2lJTnh2L1lueFVwaVBSSzhibXM2WjVOTmNmMERsR2tpam5tbW12dG9vc3ZDam5rMXlqU3QyWjFtU2FQdG5iZFdwczdaMjZsQkFUQ1JzUWxIUUVoM1llMGtrM21raE9seVZOVWt5aEkwdStrd0VKQWxpOWJIc2pWb2kvd3dnN1RPbEdxK1ZjRTVIZmZFSkRLdnBsYzV2MDRBYWxzVGp4SVJDbFhBaEtOYmRiaGlWVkVRSmhmamhDWnhGa1U2UWdaUDFGRCswVzBGRTBlTGRPNnc3elFTOWNKWTZKY3A1azZKdmd6eGg1cFhlaHUwR3hHS2RYeGNaZUVlNUtOMFU3cklPKytLZ2dJZGtyNGpwUlNYUEVkYWUxT2phNWs4enlSdzI5ekNBZ0dmQklXY1FLeU9XTXVFQkNOcFJzVmthQWxFWkNrOTU4TEFhRmkxb1d5NFZJTjZkVDd4Z2tJNjh1bld2L1NFWkRLbnBsKzVVSVlLck1YZXBhbjcyZHlYbGNtUXE5c1hDVVJFTkloc1I5U3g5SU9TVURJYnlRL2xEQWNJUys4eEJpREdQdDQ4c21SVGxlTmhnbDlzWEx2bzNTSUtQOGJ3d1lqZ1B4TFVwMlc2QmlFV1V4QS8xUTBCVU1vRndJU2hSb2pJa1I2RTVvUVVzYlNSVUFJbDNXUWR3UkNSVXRYaGpjVEFjSDdrZFR2K09USlJOeEYrZUYxNnhiWlFLV0pOWlVSaGhjSkxRZ2VjUlo3dkR4NGRSY3BSQW1qRFZXYTlBd3M4bmk2STA4VlhnbThFN1RVRkN5TWU0elo1NVRpUXh1aSt2TVlrZWdMZU01VXI4WDNOT2t6dVZBd0FHOTQ1UFY1VnVmZVhoNDFJZ1RQKzBITGtkUXlqUVBFcElSSFV6OE0wblphaUh3RnNiUElJaDlPRlBySEt6dE9vVjlJVTF5RWpzQVpielloZndoYS9OakszbjJjZ0ZTR2RhNTR4TWRTa2xkdGdveHNQUGNzWXFRYzBjQ0YzTmVJZ0pEcWhMNkN5RmU2Qm1Ga1VVWHJRYW9Za1VuR0VQbjhqSlhJV0lCOEVoa2h0WVljWHhvcFdSQzVlQ05YZTZPaVpkRzNFb1hIc3lFZ2tYNkVjMG1UWTl3R1QyMGFFVHJZWXpETVZNUXpXanlpUEhQMFZ1U1pROFNaRXg0c2o4Q1Nrb2dPSlZXRVhsa0VaS255b1lmcUc2QmhHR1BFM3Y3VXd5SE5nRWdPeG5pRVA5RXBJak5KQk9UNi8zdTl2cU1PRmZORmxJS1ZLUUp5N1hYQ3ZuTU1lMmtYWnMyY1ZTYWtqMFZBOElwQ0RPNFhCcUhQMG5YUTV4dHUrQ2JsTW5wbnVSS1FDMzV4Z1IwdmN0bi85REl4SnhFQitoZEZRTGd1YVZoN2lsemdBQ0w2UVJwVnZHMHl4d3d0bjJORUFJNDU1dWlRcGpQNnh0SDJxaUp5TktLVkN6OWZHQVRHL1U3cEY5TDFoZzBkRnJSUjhRYUpKNlhpekVGbkJtS0FRVUtVNDZrblZmaEFYdGRCK3ZmTEw3dmNTSU9pOGM2YXQyZ2V5RWRmRWVXazM5SEQ4TDJBSmJuVWFFQ0kya08wNGdRazZadnByRzhwbDNrL1RrQXFteE1wSHBFTkFVazN0a25CSXYweDZkdEpGKzJJL2kzU1hmTHRFaDFtSEpDQ2RZM21FSFFCek9YTU42d0paRWFRZVVENmNOSzZjNHpXSDhaRUpNRG52VkhRZ2pXRjRoTkVUeEdlRTYzRnFJWUVFK0ZDYTVEYUtzTTl5Y1lnd2tWcUQ4K0VZVTBiS0ZzRnNUMk9vRndpSUZIeGdraVRFTTFiRUJEV3BXeWZKekpJTS9WcFMyd21DazFnWXhCaDRqdmJuREdYQ3dISnhlNUlNcVJ4eW95V2JaUHFtQ0pWQ3oxRE9nMEk4d1dwbVdSVllJT1d6UmVEZ3owVjVvc0UyNE14bjBSQTR2WlJaZlpDWmJaai9Icnh1UzlwWEtGeFM4SU41eDFaU2F4bDJCUTBvcFZvcWF0MUNoWjV4NGdyeWR2RUNDYjZFYVc4UkFDU3UwNzRINEVaS1JycEdoNHRRbDRJd0VoMXdHTWZwWFpvcnBNQmRVdnd1T0pSd0Z0QnlnNFRBMy9QaFlEc3FseTRrQSt2M0hyT1pSRGlVVW9uUXFlZlVZMTJkQ1RQNjNqeTlKTUdaV29FcElFOGxVbjlqdU5BZUExamlEU3pTMFJHSWdPTlRSWlRJMGVSMENta1lNZ0FwVThkT3JRWHVUc3pHRkVzVHN0a1FOQmZqQmh5VnlORGpBZ1YxYkV3cmhDamNTM1NsUGdvK2ZkVUFoSjVvY2taWnRDK0tGMElIL1QreXU4a0RZYVFPMFl1bFd3d0V0bE1DMkVhR0tScjZjWUJDOVhkSW9EcnkwWG9lT3g3NktPSUpwZ29yNWRxTjFUYzZpSVBHTzgvUHNhNEg4ZitYbHFodWZMKy9FdWk0Q09PT0RJY2l3aVo5THZLM24yY2dIRE5KS3haYUpQd2lHTVFIMHRvb1ZJM0lrd042LzlOaEMvazZXdndQNm14UnlVblJHK1FVUll3R3FsYVRDeE1QaGppOFFoVTlQNFE3cEUrZzg0a0VsT21UdUJVZ0dKeWdnandMZVBKd2ZzR1FZbW5JMFRmS2FsUUNBTXg2bXJyMitmWjBGRWxwV0RoT0dBUm5xZDNTWlUydmp2U2NUS0owQ045Q1NKMERGMmlOdXpIUUM3d0tva21NWEJ3SUNDTWJxTjN6empIeVpFTEFZRVlZd2pQRnlGaVRxbXQxSnR6Zm4xeEVKZURQOWZuV1puYmVod3UvUFhPVHo3cDVJd1JFTWdBcElCSURWZ2VkT0JCUVFPU2lZQjAyazlpYmhIbWdMMTBGa1FPamozbTJJQTlVYXM0QWZueENkS1VLQXFGaUJ4RHNuZWYzbmJnRHc0MG9weEVRRk5iUmdJaUVvbTRtcFlhQVdFVDFYUE9QY2ZlZVAwTlZlU2JaZng5RituNFNFdkR3S2VSZ3NWWW9uclkrVXJGU3RlR1h6RThSRk1yNWhnWk96Z0RCZzBhSEF6VE8wV3FDdklMd252YnFQOU9PT0VuWWQ0bjNRNW55QkFSRnRLRXhqODdmcFBxWGtSOXJwWnVadnEwNlNFRmd6bHp0OTBhcTZyV2VjSGhkZmM5WlhvK2lHUHJOcTFEUkhqY28yVjV6MlZ6VGViZlUwWG9HTTZramFKcklPVmowWmVMdmhVQlNmcG0xcTVkazlPOEh5Y2dsYzJKMlpSYWowVG84YkU5ZVBCWndkbVc5TzBrRVpERm11dkhLMzBQZ1grWFE3dFV6Tk1odlUvclBIbzFuQU5FN3ZsbVdCZitJK0tRdE82VWpZazdnNkE0akFrNTFSQWVFNm5GdVVja2xKUmt4Z2Z6SFlTSGUwQXVVeHZ2TzJtOVRiSXhQa2FFTG1jZlpQVnBwVDlDZkhBZU1QZmlSYytGZ0lUdlNHbG5rQ1ljUFJYZmtlWnJoTlBaUGs4UW9TZjBhVXRzcHNqV2VFMkVpUGNKQ1VsYWg5T05DUWdJNTVQT1MwdUtnT1JpZHlRWjB0Z2lPRlJ4VUlKbG9lWVZoT1dzUmVrSVNKZ3Z5dE8xcG1tK1lINzU5bnlSMmZhb2pEQ2tzNCtTN0FYU0ZaTnN4M1RYU3gzZlNlTUtRbFVaYmhCM0NEWFJmVFFocks4SThhczFBWWxFNkJzMGFaQTJnT2lNQjZSc1g5UitySW9MbEYxTXpkdUxMMXlFaUZtOFNUR1pKODBISHk0VFFMUWhGYWs0ZU1RWmVGRVZIVHpocEhMa1FrQzRMMkZjYXE1VGtlVk41U2NqK3NZNFM1ZlBUK2dLWXdCREJTOFBmOCtXZ0pBNmxkVHZPQVpFVENCSHFjWWh1Z1ZDejFHNkRPZUFPU0ZVU0JvaGJvd25GaFRFZ2RGRVFWU0hWSmttTXZwU3l5VWlIanRiejA0cUc4WWNIbVltUkRDUGgwS2pTWVVQNXo5NHN1UnBwMklKNTNkUlpURUlJaG9Wd3U4TDVhMGlwTWVpZzRHWXJtVWFCNGpibWJDcFNJYlJCVkY5VE84MjJvTURidzBmSHdZMjFiandBSkx5bGE0TUw4OFBOb2c2SVV3UVlpb25SZDZ5cEhlZmpvQWtZYzB6SnVFUnh5QStsbmltVEFTRUNRWHRCRmd5TGlDYlJCNHdzdmtPbGdzbnlPWTUrcTZJS0VZaXUvZzlpUll3RHFOb3gxRjZseGhVOFZSSVBDRVlsb2pYSVpTSXo0bDZ4VnRqalNjaVVuaHJJS0FZd2FTOFVQUUFBemlKZ0hBdDdrTTZEQVVXU0Rkc0xlS3dVbVFpWFJVc3ZKMFVqRGhhZmE2bjhzK1VXa1VZanlhTVJsN3h1VExHeVRQSEdFVklpaGMyRndKQ3RUaEU4SkFocXBNUTRYbnZ5ekt2UHZNQzRuQkU5QmlrR3plVzR5OXZPaDV1UE9SeERVanFPOFpMenQrVENFaUVTWVQ5VW1IUHdnNzI2U0lnR0NYa3c3UG83clR6VG9HNFlGeERHdUl0RXdHNTg0NXZ2R0NwQktSMm5kckJrQ2RORG9KSG1oYlJoYWhLRnRkSEFJN2o1NG5IbndqemZMcEdpdGc1WjJ1TzZOcEYxWjNLNXBoNzd0VWM4M0haZXdNVGltenNxMGc1S2FHUWpUK3F5aUdrajNmSU9vR0JDM0ZJdDZFdDN6aDU0VGdVNXN5ZEV5TFlIMzFZVnFLN2JidTJtdHZQRFJHOFpjczFseWhhU3lXampSdkt5bkFuL2Y0dEFpTHRCOThDeHM2OGVSK0g5L3pJelNvSWtGS0dOK21ieVdYZWp4T1FzbjVtbmhPekpTRHB4allsbEN2N2RwSUlDRmtIUk1Zb0FZM3h5VmlJdEpRNEV6QnFkbGV1T3dRMWpNdnlUUldUMXAxb1RGQzZudXdKU0Q0RlZDQysvQm12TmRIWjhKdklFOXBGb2dLcE5rWTBEcE53cjh6R2lFcmVrb3JIZmRHWk1zYnhuT2RDUUZoWHNYZjRqcGpicUFpSUJ6N0syTWpsZVpMNlZObnpKR0ZSOFoxcG5HRnZCQ2RMam1PT2VZcUlEZzRVV2hJQnljWHVTRFNrWlJlR01yeUszTFRXUEVLVW5qSEIvTTNZUS9RZmIxSFo3c1podnBnYm9uOVIyZTZrWjY2TWdFVFBuR29mSmRrTG0zTzkxR2VwYkZ4VmhodFJSZExYR0gvZ1JwUWJlNkxhRXBDMHEwK2FmeVIwMUZOR05JYlRsbTc1bnUwOWs0NExkY3JMVTRaZzBIaUxNUENxODQ3U1ZZSExsbDZEOUl5Wk1oS0pRcVJyMjhNNDhIZS9wVzk1eHprL0x0U05ucXhPaTExM25JZXM0aWNoQ2tRT2M2WVVxU3ErM1haMXVaSlB5L1pLcVE0dDA5amUzTDVuUTNvMjk5cCtuaU9RQ3dLSXVYR1NSYllra1RjeUo2TFU1Rnl1NWNkV0RRTHJseTNJNlVKNStZMzJyTG90bmpQY0dxYUsrQmhQUEd3NWFhK0luSHEvQlFkVEVwWitVUGxwcGxnZ0huSThuZEZlSlZ0dzZScDlLZ0p3VWhZb3R4Y1hMbTh2NDhEZmZZMGVvcHM4dkJPUTdNY0QxYkNJTEpMQ2dPZzl2dmxnOWxlcXZrYzZBZm1GcFZiR3FyNXYwbnRlblJFZ1lraXhBdmJPUWcrRy9vT1VYakk1dkgwM0NHeVhCSVQ4dTh2bExYdEhPYUFJaHdocmJnOE4zUUpwSTZTMklIVDdxOUpkTXRWVDN4NzZXMjM2Z0ZpbmZNZngxRDV2VCtQQTMzMjFHVTFidmFOT1FMS0htRHg5S25aOXZ2QnppWVZ2MUc3MDM5YWJaSCtsNm51a0V4QW5JTlYzOU80NFBTZjlsMkpHN1ZRMGg3UlpxanVTUmtaRlIyL2ZEUUxiSlFINWJxRHd1em9Dam9BanNQa0liS3NVck1OYjdtMmZLZy8zWSsyU1hsTmFENVh5WFNCOTROeHErTXpWaVlEVWxQSGt6K2tJT0FMZlBRSk9RTDc3ZCtBOWNBUWNnUjBBZ1d3SkNCV3lEcGRCdlZnRkxHWjh1YmppeWZlUUNMdVRVaEtuS1Zyd2RVTFVONVdBTkpFb3YwNnRQRnU0WWxNUlpSS2t0WFhPSHZVYldETnRURGg3NlZkcDc5ZXU4YTYybDRUNlV5UllYNkZTdDk5bDJ4NElTS0hFOXQxVlR2bDlsWnorWXVXcXJPRndBcEkxVkg2Z0krQUkxQ0FFbklEVW9KZnRqK29JT0FKYkQ0RnNDUWc5Nk5oa04ydXNDbDBUNTJ0ZmsvTFdhZmNtdHJPS1c3eGVTWnBTS2dIaG5McXFHUFZXSmZ2cHBENTFRK2t5RGxKQkRTb1ExbEZsdkduYU5QSnJWWkpLYmZWVTJyU0xTb3RTcG5LTENBZ1hxQUxWNERZaklBbjlMVkIxTmZyeG5naklJaWNnVys5RDhpczdBbzVBalVEQUNVaU5lTTMra0k2QUk3QzFFY2lGZ0RTdVYyVGZsNWJzclFVTGJabktRU0tET2x4bERoZXFIT1FzaWJYcnFpVG45MFJTZHRMK0JXdFV6bk8yL20xSitXN1BFUUZwVkZBb0VsTVVIbXVkU2sxRFhIWlZPVm9pRjV5L1hOZjlhUEVTVzYxeTBxbU4zeUFZNjNYT29jMmJwU1VnQnpUZHcycm4xYktkNmhibVRFQWdOK3pUZ2NHK1dMdVd6OUcrUWUzVnB6MFVyU2xSNldmU3FENHZMM3ZacEg0OWE2Y3lsL2s2OWlzOUh4RWhqcW1qZlZXSUJ2SDhTMFdPZHRXTzRxU2RwYVpnZ1ZrdmlVay9VMnJXTGlKdWhYcXVlY3J0cnEwZldpaHl3M1UrMEFhMFgrbDg2dGEzYjl4WWZhaG5KU0plWEd2KzE4c0NMTm4yRjdMV1UrbHY3Mm96MXk5WHJjNTZPSGtFSkd1by9FQkh3QkdvUVFnNEFhbEJMOXNmMVJGd0JMWWVBcmtRRUl6bkhpSWNuNVViMWJ2SXdQNUIwNllWaE9RUUVZTTgvVGZucTZXMnV3eDNqUGZKMmlOaFRYR0pSUVRrcytVcjdIdmFYNlZBcVVIdmZyRW9HUDJIcVlJZ3FWMFFtWDIwQnhGR00rZWxxZkZnOVFzVTVkQ2VGZkVJeUc0eTBybnUrNHUrTkloSXVnZ0lCbjNVaUtTa05neDZvaXp6Wk9BdkZhbUFaTFRRUGtBZnFnUm1mUkdmVnVyWEpPMmhRaXBhVjkzL1k1R0daVW81MjA5bE1oY29sV3kyOW9YYVYvZmZYZWZORlBHaW55MjFieEhrSWgwQldTRVJLYjgxbGVDOWlhSktFRFd3YWIzTHppSDRNdVd6QllHVTdhbmZQMUlmQ2tWMjJvcjBSS2xVMmZZWHduYUVhdUsvby8xeGxvaFlaZHVjZ0dTTGxCL25DRGdDTlFrQkp5QTE2VzM3c3pvQ2pzQldReUFYQWtJbk1MSWJ5VkQvZDdtQmpQSDh4bjgvdFhveXVESE1JME0zMG96TTErYUhlTzB6cFdBMTF3YXBlUGxKNjhMNzMwalJnNE9iN1dsVEZXVWhHaEp2NlFoSUlBVkt2ZUkrSzJYWWMzNmNnT1FyT2tHMEptb1R5amNLalA2T1FVOUU1ajFGQ21qZGxiWkV4R0Ntakg4YS9ZY3dRSklnSlBRTkRrTkVDRjd6OXVkZmhHTVdLcktCUG9XV0xnVXJpb0JBS2lBY0VZa0RUL29PMGRsN3AwYjJxdkNJWHc5aVJlTmUyZmIzVTkyamx6WlU1QnlJVmJiTkNVaTJTUGx4am9BalVKTVFjQUpTazk2MlA2c2o0QWhzTlFSeUpTQ2tGUjJnSFZ2eFpRQUFFbFpKUkVGVXFNZnIyZ21lNkFlUkN3enV5SkIrVTVHTDFldkwwcWNnQlY4cFNrQktWU1lDc284OC9xUWVSYnFTU0xPUVNUU2Rqb0MwMGk3cHUwdWNQbVhCWjRIQVlKekhDUXlHZjBPbGYwVXRUbTQ0WjIxcFNZaWcwSHJ2MHlwRUlqYVdSMHFJbm53aU1zV3owbWNpRS9TVmYrY1pwMHVFenprUnNjaVdnT3dzUEE4VWprUjhWZ20zbG5vV1NNZ3I4K1p2Y3IwT3V6VU9hVnR2ZnZwWmVNWnMrMHUvcGtzelExcFh0czBKU0xaSStYR09nQ05Ra3hCd0FsS1QzclkvcXlQZ0NHdzFCSElsSUNpOGlTU2doNkRhVk9TNUw4cXZFMUtwM3BHbm5YU2lTQi95aWRLMTVray9rWW1BVU5HcWc2SXFyODZmYjZVYk5sWkVRREpWMVVwSFFJZzBRQWJpTFJlak8yN1FFd0ZaSW5MMXliTGxGWmN0Vm9SbVorbExPaXZ0Q2dIOXNyWHJyUE1ldTRlVU1RZ0kvVURiRVpVYXppWUNra1JBNkFNNHp5bVBxQkFCSWRyRHZiTHRiN0dpT3FSMWtTYTJWcnFjYkpzVGtHeVI4dU1jQVVlZ0ppSGdCS1FtdlcxL1ZrZkFFZGhxQ09STVFOUVRQUEhOcEk5WUk2RTQzdmlvSGFUVUo4VFVDTGhKemRwVHgwelc3d2pLVXdrSTUvUDdoNHFNSUdidnBrakpZcEVXakcyOC8rZ2QwRnRrcXdGcFVGQVFDQStOUDZNRm1hR3FUMStLUUVCcXNtbHhnNzdOcnJ0WWMvVi9sclFkcElZUnBVSG5FVjJmdnFOZlFZeU9uZ05Td0hNMUxxcW5LTW9pYVVBS2xLN1dPS01HSklxVVJBVGszNHFBckl4RlFLSStjQ3dFQ3czSVJ4S29ReWF5N1M5OWE3dkxMb0VZb2NYSnRqa0J5UllwUDg0UmNBUnFFZ0pPUUdyUzIvWm5kUVFjZ2EyR3dPWVFrTWhvamd1czJYTUNqUWhsZWRlWGxOcHNpZEdqeWt1cEJJUTBxZjBWT1lBY1FEUjIwdkZVbkVKYmdjSDhvWXhzMHBIU3RVd2k5T2pZU0VPU2F4bmV1RUZQcEtHdFNBaENldEtzdmxpMUtvakxhWjNLeXhHdlVsOGhKMVRvZ29nUkNZbktFck1uQ3M4RHFVb25RdCtVZ0pScFFGSlRzTGd2cElPOVZtaXBHemxtMjErdVFTcmNoNnJVRlZVa3kyWXdPUUhKQmlVL3hoRndCR29hQWs1QWF0b2I5K2QxQkJ5QktrWGdnUWNlc0Mva3FiL3kxaHVxOUxycExwWXZnZnJkZDk5dEUxNmFZQTg5OUZEaS9kcTFiMmNqZnpQU1J0MHd5cWE5Tlcycjl5M1REUnFjSlZ5SzE5bktoNjdlNUpDaVk4K3kvQTZIMnZKN0xqRmI4ODFtaWczUHU4VTJmTDNJVmowMkt1ZCs1M2ZxWVVWOUJ0aXFwMzl2cFo5OGtQUDVWWDFDcmdTazZCaGhzcTh3R2Z0THN3MmxWZDBkdjU0ajRBZzRBdHNGQWs1QXRvdlg0SjF3QkJ5QjZvckExaVFncDV4eWlnMFlPTUNHREJscUg4K2RhN1VWR1JrMWFwUzlOdkUxZSthWlp4SWgyMXY2a2tzdnU5UnV1KzAyKzJER2QyZUk3MmdFcE43UGhsbnQzVnZhaXJzdXpHcklPZ0hKQ2lZL3lCRndCR29ZQWs1QWF0Z0w5OGQxQkJ5QnFrVmdheENRV2twQjJxQ1VwRGdCcWRxZWI1dXJWU3NDSXR3RmZDSXdUa0MyemJqeHV6Z0Nqc0NPallBVGtCMzcvZnJUT1FLT1FJNEk3Q1R4OWpsbm4yMEhIM3h3T0hQYXRHbDJ4eDEzMkFxSmoyazlEai9jemhvODJJcTA2L2lyRXlkYXQyN2RiTUdDQmZicnNUZUd0S2hQcGNXNDdMTEx3ckZIOXVwbEYxOThrWTBjT2NvbXZmR0dkZW5TeFFhZU1kRDIwSjRYLzlYTzVmZjk4VDU3LzczM3JZV3FYdDF4NXgzMjhzc3ZXNXMyYld5eGRBYnJwR1BvMnJWTFJlOGZmdWhoKzlzemY3TW5ubmpDWG5ycEpSdHp5eGlySTgzRVdXZWRaWWVyVC9rU2E4K1k4YjdkZmRmZDlybEt4UjV5NkNFMllzUUlHek5takwzMDRrdjI2S09QMmdjZmZCQ2VvM3VQN3JaQysxcmNjKys5b1Y4MCtqQjA2RkRicC9VK05udjI3TkMvNDM1NG5QVS92Yjh0VndXdXpXMWJTa0RxSFgrdTFXN1cxdFpOZThFS0R6emFUQ1JoL2JzVGJkMmt2NVYxcWJDZTFUdHFvTlZwMlVscFcxOWE2YUw1bHQreDJ6Y3BXTkp1RkI1MHJPWHZmNlRsNVJkWTZZTFp0dWJsUDl2R0ZVc3R2M05QSytwMXVxMTdlNElWdER2WTFyOHp3ZFpOSFcvNSsvWFF2WTYxV3ZVYldlblN6MjN0RzA5WjZYOC9ORkxEOGdyTGRwK25yZnJMVFZiNitWd3I3SEtDNVgvdk1LdWwzMG9YZjJwcmRmM1NMLzlydFJvM3M3cEgvSi9RZDZJbWRacnVZNlZMRnRpYUZ4NndEVXNYaG12VTJxMjVVc2JPc05xNzdta2xDMmViNWRXMk9udDE4QlNzelIxd2ZwNGo0QWhVQ3dTY2dGU0wxK1NkZEFRY2dXMkZ3RzlHanJUMjdkdmJJdzgvYlBrU1AvY2ZNTUFtdnZxcTNYenp6YmE3aUFNYWpLOVVuZXFGRjE2d3p2dnRaL3ZwL3hreTdOR0FEQms2eEhyMzdtMm5uMzY2cmRibWV4ZGZjckYxTzZ4YitIdWt5WGo3blhla3lYakxlb21jTk5PTzUrZWVlNjdWcjFjL0VCRGFsQ2xUQXVtWk9YT1cvZVNFRSt5SUk0K3dlMFVVcGt5WmFrdVhMdmtXQVRtOWYzODc5ZFJUN0dIMUZVSng1cGxuMmhmYXFSc2lrWTZBTk5SbWhaTW5UN1k1YytiWUNibzJBdkdCQXdaYWlVck0vdUVQZjdDOTltcGgvL2pIUDZ4QWh2cHh4eDFuZWJYeXRnc0NVcWZ0Z2JaQkJuM3huT21XMy9hZ1lMU2pEeW45WXI3VjdUUFFDanAxdCtLWlUyeURTRVZoNXlQTUN1cFdFSkRDUTQrM3dxNC9FV2w1TlpDT2doLzBzUTNMbDlxcXgyOFEwVGc4RUJCYnY5YUtQLzZQcmY5d3NwbjJNS2wvNG9WV3JEK1hmUEsraU1neFZtdW5KcmJpd1JFaUVYdGIzY04rR3Y2Kyt2bjdyZVN6V1ZZb1lsUFk5WVJBWWpaOHRkQUtEL21STmowcHRaVVBYR1cxUkNvZ0lHZzV3djFWanF6dys3MnNlTjc3dHVidlkwVTI4cXpCZ0d1c1ZxUEd0dTZkZjFtdG9nYUJ5TkJjQTdLdHZuaS9qeVBnQ0h3WENEZ0IrUzVROTNzNkFvN0Fkb3ZBSVljY0VxSUVIMzc0WWVqalNCR1NaczJhMmFCQmd3eUQvN1JUVDdVcnJyakMzbjMzM1JDQitOT0RENGFvQndTRXFNblYxMXdkZEJwdnZERkp4T0FoUlNWbUJESDRpS3RIV1B0MjdlMzhDeTZ3a3BKaWE5RzhoZDB5NWhhNzY2Njc3TzNwYndjQ1FxU0NpRVhVNGlsWWRiWFpYbW9FNU1xcnJyTE9uVHNINHJGTzFhSU9WdDlidG14cFR6MzVwQjEwOEVHYlJFQVdTU3cvN0VKcEYyUUljODVKSjU5a0Y1eC9nVFZTYWR6ZjN2aGJlL3p4eCsyaEI4dkU3Y09HRGJNK1IvWFpQZ2hJbXdOcytkMFNxcTliYmJYMzdtajErdzZ4TmY5NjFJby9tR1NORkpVb1VSUmk5VjkvRi9wZDhJT2pyTzdoSjVVUmtFOW5Xc096YjdUU2hYTnM5Zmo3eW42WFNMMXV6NU50NWFQWFcrMDkyd1FDc3VhRlA0VnJoZDhQNkJOK0Q5RU5SVXNnTzNWYWRSYkJtV29ibHkrMmVBcFc3YWF0TFUvRW9VUUVobGJZNWNmaC81VWlMQkx0bEVWQXByOW82eWIrSmZ4ZS8rUkxSVGgyc3hYM1hXcTFXM1FJWkdmZDVIK0UvMmxGSi96Qzh2Zlozd25JZGp0RGVNY2NBVWVnS2hCd0FsSVZLUG8xSEFGSFlJZEJvSWsyeHhzZ290R3hZMGNqSGF0UXFVMXJaTnlmS2tINEpiLzZsZlhzMmRQNjl1MHJwM1paaGFKVURRaUU1SkZISHdraThXZkhQMnUzM0hLTElpZS9zNWYvOVM5NzRFOFBXT1BHalRmQjZlbW5ucmJubm5zdUVKREhIeE1CU0tsdVZSa0JnZkJjZWVXVnRrWjdmMHg5YTZwTmZuT3lUWm8wS2VoSDBrVkE1a3JJZnBWSUN3M3lBUW01VUlTa1ZjdFdOblRZVUJ2eDZ4RTJmZnIwOFB2NTU1OXZQL3J4ajdZZkF2S0hYNFIrWWZEWDczZXByWDN0cjFZeTl4MXJjTVoxdG03Sy8xTktWcGtvUDdVSzFzYmxTOEx2NmRycXY5OXVlUTEyRGdRa3RXSldYa09WTWRiMWF4V0tWSHo2UVloV0ZILzBwc2hQMmU3bm0yaEE2dVFyNm5HODViZjV2dVhWMzhYeTlIZUl4NnB4djdHTmlud0VBcUsrMGNkdy9rK0hXSjFtYld6NUhVUExJakM5Kzl1cXA4YUVGQythVjhIYVlhWVNmeEJId0JGSVFNQUppQThQUjhBUmNBUlNFQmc3ZHF3MWFOREF4cXA2Rk5xT0lmLzd2OVpxbjMwQ0Fibm80b3NyQ0VpMHUxOWNoSDdKSlpkWXAwNmRiUHo0OFhicWFhZlpnQUV5TUZldXN2c2Z1TitLdFlIZEdKR1MxTFpVbS9KQlhEYUhnSENkcG5zMnRkNjllZ2ZDMGJadFc1czZkYXBkZTgyMU9SR1FsbnUzVkdSa21GMTE1VlgyamxMRWFOdUNnTlNWOFYwZ0kzekZINGZieHBWZmxjR2l0S1JHRi94QkdvcjV0dXFKMFlZR3BBNFJrRFFFcEhqTzI5Ynd6T3R0M1pzeThQOWRadUNuRXBBTnl4YUgzMHRtVFZPSzA0UnY0VjZxZENuU3VlSUVKQndrWFFtbGNQTVYrYWl6MTc2MllkWFh0dkxQSTFVcWVOVW1CS1R1a2Fmb0dYcmFtbGVrKzFCS1ZuN0g3a0dyc2xJRWhOU3JSQUtpWTR1a1gxbjFsNXNWYlpubEJNUm5Ja2ZBRWFneENEZ0JxVEd2MmgvVUVYQUVLa09BaU1mRGlrRDg4NS8vdER2dnZETWNQdnFtbTZTTjJDc1FFQWhGZitrNWZ2bkxYOW9ubjN3U2pHVWlGaENWNGFPdmw5YzgzN3AxNzJiRGh3KzNKZHAxZS83OCtYYjFpTEw5TDY2OTdscmJ2L1ArUWZQeHBYWVhwNkVMbVNXdFJ5UkNqMGRBK3AzU3p3WU9IR2pEaGc0THVvMTRDdFpnQ2RDNTkzTWlPelEwS0VjZmZiVDE3ei9BT25Sb3Ywa0tWcVlJU0IxNTdVZVB2dEhHUFRvdWlOVnBFSkkrZmJadUNsYkJBYjJWN3RUUDFveS9ONlE0MFdydjBkTHFuekxjaW1lOFlXdGVmRENSZ0NBYWIzVGVHS1Uvdld1cm43MDduSS9Zdk9qSVU4dFRzRDRLS1ZvYlZpeXhsWTljSDFMUGVHZG9PZENQUkNMMDFBZ0lBdlJhTys5aDZ4UmhDZGZidDR1aUVvTnRqYTVmTENKVHIrOVFSV0gyc1JWM0RndS9OeGlnOTZ2cnJueWtMTkpTMksydkZSNThYSWlBbEs1WmEvV09VWXBWaGdoSTdlYnRyUDcvWEJ4RThjWC9lVG1jWC9URGN5Mi8zWUdlZ2hYUThPWUlPQUk3S2dKT1FIYlVOK3ZQNVFnNEFqa2pRUG5ia0FJbEkvWEp2LzdWMmlpaWNIaVBIcloyM1RvNythU1RiRGZ0VGs3bHFIa2ZmNnlLVk0vWVFRY2VhRWNlZVdRUW9WOTJxZEoybWpTMG9rWU5RaHBXb1hZcEh6djJ0Z3B5MEdtL1RuYkREVGNFd3ZEOGM4K0h5TVd4eHh3YnlNcXlaY3ZTUmtBZ0U1Q0sxMTU3emNZL085NCttdm5SdHpRZ3c2OFlibWhXRUtFampDZGxxNjUyUXg4MGFMRCsvZUNzQ2NqczJYT0NDTDFGOCtaQmhNNDFqajN1MkNCU0QxV3dwSW01YWZUb1VCMHJJbWJaZ3B0VUJZdElRME1aOEhuNWhiWmVHb3lOSmV1dFFDTHN2SUo2dHZMeFViWmg4V2ZKQkVUVnBlb3FoYXBBcElFSXlJYlZ5Nnp1b1JMWHEzcFZSQ29pRVhxSlVweEs1cjJuYWxrZHl3akVmWmVYa1l0WUNsYUJST0oxanpnbGlNWkxQNXNaanFIQ0ZnUmpneXBpRlIwelNQL1cxZGE5OVp3VnYvKzYxZTErb3RWcC9YMVZ1bnEraklCSWd5TDF2cTE0NkhwcFQ1WmFnLzRqTWhLUUlFTFg3M2xGRFcydHFuclZxdGZJQ2cvOXNVcGo1VGtCeVhhQStYR09nQ05RTFJGd0FsSXRYNXQzMmhGd0JMWVdBaDJWUG5XQmhPS1V5aVVkYWFQMEZJY2RkbGlvaHJWY1JLRjc5KzcyODUvLzNPclZyMjlUL3YxdmE5MjZ0YTFjdFNvUWtLZ05sMGk5YTlldWR1WVpaOWpYWDM5ZDhlK2NTMFdzWmpMMGlaRDg0KzkvdDZlZmZyb3NBcUpTdjQ5SkJFNEVKbXFVK3FXVWJydDI3V3pjdUhFaE1oTkU2Qk1taEZTdSt1ckQyZWVjWTExVjNyZTIwcmhtenB4cDk5NXpqODJiTnk4UWsxQ0c5L2UvbDdqOVJaR2lSOE5taGhVYUVCR3FvQUc1NkNLYlBhc3NDak5Vd3ZQV1NqZWJwYjlEdWlCWXB5bnFzM3IxYXJ0ZC9adWw2MU1OTEplV1NFQjBvVHhWbEtyYlEwWjgwellLZjlRT1pYVFh2djYwcWw0cHdxUldwQlNzL05aS3dScGJwZ0dwSlExSWczSU55SG9SRUNzb3NxS2p6N0Q4bHZ1RktsZ2xuOHd3U0VSRlZFTmtBQkpDYWhaVnBrcVhMZ2pYTDlWeCtVcWRLdXI5YlEwSXBLRHc0QitHVXJ5MWloclpobVZmMkZvSnhFdG1sMmxqYXUzV0lwQ2lQSkdGMWMvY3BvcGFpMVZHVjJXQTkyeHRwVjk5b2NwWU0wTUsxdXBuN3dtbGRoTUpDTmRUcWQ2aW84NjAybzFWaGxkUm1ZMXJWMHBQOGdNbklMa01Nai9XRVhBRXFoMENUa0NxM1N2ekRqc0Nqb0FqVVBVSUlMNkhGRVhpZXFwL3RkYWVKS1NlZVhNRUhBRkh3QkZ3QktvU0FTY2dWWW1tWDhzUmNBUWNnV3FLd0syMzNocXFhVTE2ODAxcjFhcVY5ZEYrSnFTWkVWSHg1Z2c0QW82QUkrQUlWQ1VDVGtDcUVrMi9saVBnQ0RnQzFSU0I3Nm5zTUNsajdiUUpJMmxqcjd6eVNrajdLdGFPN040Y0FVZkFFWEFFSElHcVJNQUpTRldpNmRkeUJCd0JSOEFSY0FRY0FVZkFFWEFFSElGRUJKeUErQUJ4QkJ3QlI4QVJjQVFjQVVmQUVYQUVISUZ0aG9BVGtHMEd0ZC9JRVhBRUhBRkh3QkZ3QkJ3QlI4QVJjQVNjZ1BnWWNBUWNBVWZBRVhBRUhBRkh3QkZ3QkJ5QmJZYUFFNUJ0QnJYZnlCRndCQndCUjhBUmNBUWNBVWZBRVhBRW5JRDRHSEFFSEFGSHdCRndCQndCUjhBUmNBUWNnVzJHZ0JPUWJRYTEzOGdSY0FRY0FVZkFFWEFFSEFGSHdCRndCSnlBK0Jod0JCd0JSOEFSY0FRY0FVZkFFWEFFSElGdGhvQVRrRzBHdGQvSUVYQUVIQUZId0JGd0JCd0JSOEFSY0FTY2dQZ1ljQVFjQVVmQUVYQUVIQUZId0JGd0JCeUJiWWFBRTVCdEJyWGZ5QkZ3QkJ3QlI4QVJjQVFjQVVmQUVYQUVuSUQ0R0hBRUhBRkh3QkZ3QkJ3QlI4QVJjQVFjZ1cyR2dCT1FiUWExMzhnUmNBUWNBVWZBRVhBRUhBRkh3QkZ3Qkp5QStCaHdCQndCUjhBUmNBUWNBVWZBRVhBRUhJRnRoa0N1Qk9UL0F3ZWZ1dUNWQUR2VUFBQUFBRWxGVGtTdVFtQ0NcIiBzdHlsZT1cIm1heC13aWR0aDo4MDBweDtcIj5ceDNjL2E+IiwiKkNsb3NlIEFsbCBCcm93c2VycyIsIio8cD5DbG9zZXMgYWxsIG9wZW4gYnJvd3NlcnMgYW5kIHJlc2V0cyB0aGUgYnJvd3NlciBjYWNoZS5ceDNjL3A+Il0pOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJzdGF0cyJdID0gW1t7ImVsYXBzZWQiOiIwMDowMDowMiIsImZhaWwiOjEsImxhYmVsIjoiQWxsIFRlc3RzIiwicGFzcyI6MCwic2tpcCI6MH1dLFtdLFt7ImVsYXBzZWQiOiIwMDowMDowMyIsImZhaWwiOjEsImlkIjoiczEiLCJsYWJlbCI6Ikp1cHl0ZXIiLCJuYW1lIjoiSnVweXRlciIsInBhc3MiOjAsInNraXAiOjB9XV07Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbImVycm9ycyJdID0gW107Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbImJhc2VNaWxsaXMiXSA9IDE2NDUyOTQ2MzYzMDA7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbImdlbmVyYXRlZCJdID0gMzEyMzsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiZXhwYW5kX2tleXdvcmRzIl0gPSBudWxsOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cuc2V0dGluZ3MgPSB7ImRlZmF1bHRMZXZlbCI6IlRSQUNFIiwibWluTGV2ZWwiOiJJTkZPIiwicmVwb3J0VVJMIjpudWxsLCJycGEiOmZhbHNlLCJzcGxpdExvZ0Jhc2UiOiJsb2ciLCJ0aXRsZSI6IiJ9Owo8L3NjcmlwdD4KPHRpdGxlPjwvdGl0bGU+CjwvaGVhZD4KPGJvZHk+CjxkaXYgaWQ9ImphdmFzY3JpcHQtZGlzYWJsZWQiPgogIDxoMT5PcGVuaW5nIFJvYm90IEZyYW1ld29yayBsb2cgZmFpbGVkPC9oMT4KICA8dWw+CiAgICA8bGk+VmVyaWZ5IHRoYXQgeW91IGhhdmUgPGI+SmF2YVNjcmlwdCBlbmFibGVkPC9iPiBpbiB5b3VyIGJyb3dzZXIuPC9saT4KICAgIDxsaT5NYWtlIHN1cmUgeW91IGFyZSB1c2luZyBhIDxiPm1vZGVybiBlbm91Z2ggYnJvd3NlcjwvYj4uIElmIHVzaW5nIEludGVybmV0IEV4cGxvcmVyLCB2ZXJzaW9uIDExIGlzIHJlcXVpcmVkLjwvbGk+CiAgICA8bGk+Q2hlY2sgYXJlIHRoZXJlIG1lc3NhZ2VzIGluIHlvdXIgYnJvd3NlcidzIDxiPkphdmFTY3JpcHQgZXJyb3IgbG9nPC9iPi4gUGxlYXNlIHJlcG9ydCB0aGUgcHJvYmxlbSBpZiB5b3Ugc3VzcGVjdCB5b3UgaGF2ZSBlbmNvdW50ZXJlZCBhIGJ1Zy48L2xpPgogIDwvdWw+CjwvZGl2Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+cmVtb3ZlSmF2YVNjcmlwdERpc2FibGVkV2FybmluZygpOzwvc2NyaXB0PgoKPGRpdiBpZD0iaGVhZGVyIj48L2Rpdj4KPGRpdiBpZD0ic3RhdGlzdGljcy1jb250YWluZXIiPjwvZGl2PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKICAgIHRyeSB7CiAgICAgICAgdmFyIHRvcHN1aXRlID0gd2luZG93LnRlc3RkYXRhLnN1aXRlKCk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGFkZEphdmFTY3JpcHREaXNhYmxlZFdhcm5pbmcoZXJyb3IpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGluaXRMYXlvdXQodG9wc3VpdGUubmFtZSwgJ0xvZycpOwogICAgYWRkU3RhdGlzdGljcygpOwogICAgYWRkRXJyb3JzKCk7CiAgICBhZGRFeGVjdXRpb25Mb2codG9wc3VpdGUpOwogICAgYWRkTG9nTGV2ZWxTZWxlY3Rvcih3aW5kb3cuc2V0dGluZ3NbJ21pbkxldmVsJ10sIHdpbmRvdy5zZXR0aW5nc1snZGVmYXVsdExldmVsJ10pOwogICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoKSB7CiAgICAgICAgbWFrZUVsZW1lbnRWaXNpYmxlKHdpbmRvdy5sb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKSk7CiAgICB9IGVsc2UgewogICAgICAgIGV4cGFuZFN1aXRlKHRvcHN1aXRlKTsKICAgIH0KICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBsb2FkQW5kRXhwYW5kRWxlbWVudElkcyh3aW5kb3cub3V0cHV0WydleHBhbmRfa2V5d29yZHMnXSk7IH0sIDEwMCk7Cn0pOwoKZnVuY3Rpb24gYWRkTG9nTGV2ZWxTZWxlY3RvcihtaW5MZXZlbCwgZGVmYXVsdExldmVsKSB7CiAgICB2YXIgY29udHJvbGxlciA9IExvZ0xldmVsQ29udHJvbGxlcihtaW5MZXZlbCwgZGVmYXVsdExldmVsKTsKICAgIGlmIChjb250cm9sbGVyLnNob3dMb2dMZXZlbFNlbGVjdG9yKCkpIHsKICAgICAgICB2YXIgc2VsZWN0b3IgPSAkLnRtcGwoJ2xvZ0xldmVsU2VsZWN0b3JUZW1wbGF0ZScsIGNvbnRyb2xsZXIpOwogICAgICAgIHNlbGVjdG9yLmZpbmQoJ3NlbGVjdCcpLnZhbChjb250cm9sbGVyLmRlZmF1bHRMb2dMZXZlbCgpKTsKICAgICAgICBzZWxlY3Rvci5hcHBlbmRUbygkKCcjdG9wLXJpZ2h0LWhlYWRlcicpKTsKICAgICAgICAkKCcjcmVwb3J0LW9yLWxvZy1saW5rJykuZmluZCgnYScpLmNzcyh7J2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMnOiAnMCd9KTsKICAgICAgICBzZXRNZXNzYWdlVmlzaWJpbGl0eShjb250cm9sbGVyLmRlZmF1bHRMb2dMZXZlbCgpKTsKICAgIH0KfQoKZnVuY3Rpb24gYWRkRXJyb3JzKCkgewogICAgdmFyIGVycm9ycyA9IHdpbmRvdy50ZXN0ZGF0YS5lcnJvckl0ZXJhdG9yKCk7CiAgICBpZiAoZXJyb3JzLmhhc05leHQoKSkgewogICAgICAgICQudG1wbCgnZXJyb3JIZWFkZXJUZW1wbGF0ZScpLmFwcGVuZFRvKCQoJ2JvZHknKSk7CiAgICAgICAgZHJhd0Vycm9yc1JlY3Vyc2l2ZWx5KGVycm9ycywgJCgnI2Vycm9ycycpKTsKICAgIH0KfQoKZnVuY3Rpb24gZHJhd0Vycm9yc1JlY3Vyc2l2ZWx5KGVycm9ycywgdGFyZ2V0KSB7CiAgICB2YXIgZWxlbWVudHMgPSBwb3BGcm9tSXRlcmF0b3IoZXJyb3JzLCAxMCk7CiAgICAkLnRtcGwoJ2Vycm9yVGVtcGxhdGUnLCBlbGVtZW50cykuYXBwZW5kVG8odGFyZ2V0KTsKICAgIGlmIChlcnJvcnMuaGFzTmV4dCgpKQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBkcmF3RXJyb3JzUmVjdXJzaXZlbHkoZXJyb3JzLCB0YXJnZXQpOyB9LCAwKTsKICAgIGVsc2UgewogICAgICAgIC8vIEVycm9ycyBtYXkgaGF2ZSBtb3ZlZCBzY3JvbGwgcG9zaXRpb24uIFJlc2V0dGluZyBsb2NhdGlvbiByZS1zY3JvbGxzLgogICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24uaGFzaCkKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2Uod2luZG93LmxvY2F0aW9uLmhhc2gpOwogICAgICAgIGhpZ2hsaWdodExpbmtUYXJnZXQoKTsKICAgIH0KfQoKZnVuY3Rpb24gaGlnaGxpZ2h0TGlua1RhcmdldCgpIHsKICAgIGlmICh3aW5kb3cubG9jYXRpb24uaGFzaCkgewogICAgICAgIHZhciB0YXJnZXQgPSAkKHdpbmRvdy5sb2NhdGlvbi5oYXNoKTsKICAgICAgICBoaWdobGlnaHQodGFyZ2V0KTsKICAgIH0KfQoKZnVuY3Rpb24gaGlnaGxpZ2h0KGVsZW1lbnQsIGNvbG9yKSB7CiAgICBpZiAoY29sb3IgPT09IHVuZGVmaW5lZCkKICAgICAgICBjb2xvciA9IDI0MjsKICAgIGlmIChjb2xvciA8IDI1NSkgewogICAgICAgIGVsZW1lbnQuY3NzKHsnYmFja2dyb3VuZC1jb2xvcic6ICdyZ2IoJytjb2xvcisnLCcrY29sb3IrJywnK2NvbG9yKycpJ30pOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBoaWdobGlnaHQoZWxlbWVudCwgY29sb3IrMSk7IH0sIDMwMCk7CiAgICB9IGVsc2UgewogICAgICAgIGVsZW1lbnQuY3NzKHsnYmFja2dyb3VuZC1jb2xvcic6ICcnfSk7CiAgICB9Cn0KCmZ1bmN0aW9uIHBvcEZyb21JdGVyYXRvcihpdGVyYXRvciwgdXBUbykgewogICAgdmFyIHJlc3VsdCA9IFtdOwogICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSA+IDAgJiYgcmVzdWx0Lmxlbmd0aCA8IHVwVG8pCiAgICAgICAgcmVzdWx0LnB1c2goaXRlcmF0b3IubmV4dCgpKTsKICAgIHJldHVybiByZXN1bHQ7Cn0KCmZ1bmN0aW9uIG1ha2VFbGVtZW50VmlzaWJsZShpZCkgewogICAgd2luZG93LnRlc3RkYXRhLmVuc3VyZUxvYWRlZChpZCwgZnVuY3Rpb24gKGlkcykgewogICAgICAgIHV0aWwubWFwKGlkcywgZXhwYW5kRWxlbWVudFdpdGhJZCk7CiAgICAgICAgaWYgKGlkcy5sZW5ndGgpIHsKICAgICAgICAgICAgZXhwYW5kRmFpbGVkKHdpbmRvdy50ZXN0ZGF0YS5maW5kTG9hZGVkKHV0aWwubGFzdChpZHMpKSk7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gJyc7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gaWQ7CiAgICAgICAgICAgIGhpZ2hsaWdodExpbmtUYXJnZXQoKTsKICAgICAgICB9CiAgICB9KTsKfQoKZnVuY3Rpb24gYWRkRXhlY3V0aW9uTG9nKG1haW4pIHsKICAgICQoJ2JvZHknKS5hcHBlbmQoJCh0ZXN0T3JUYXNrKCc8aDI+e1Rlc3R9IEV4ZWN1dGlvbiBMb2c8L2gyPicpKSwKICAgICAgICAgICAgICAgICAgICAgJC50bXBsKCdzdWl0ZVRlbXBsYXRlJywgbWFpbikpOwp9Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0b3RhbFN0YXRpc3RpY3NSb3dUZW1wbGF0ZSI+CiAgPHRyIGNsYXNzPSJyb3ctJHskaXRlbS5pbmRleH0iPgogICAgPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSI+CiAgICAgIDxkaXYgY2xhc3M9InN0YXQtbmFtZSI+CiAgICAgICAgPHNwYW4+e3todG1sIGxhYmVsfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC90ZD4KICAgIHt7dG1wbCgkZGF0YSkgJ3N0YXRDb2x1bW5zVGVtcGxhdGUnfX0KICA8L3RyPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idGFnU3RhdGlzdGljc1Jvd1RlbXBsYXRlIj4KICA8dHIgY2xhc3M9InJvdy0keyRpdGVtLmluZGV4fSI+CiAgICA8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIiB0aXRsZT0ie3todG1sIGRvY319Ij4KICAgICAgPGRpdiBjbGFzcz0ic3RhdC1uYW1lIj4KICAgICAgICA8c3Bhbj57e2h0bWwgbGFiZWx9fTwvc3Bhbj4KICAgICAgICB7e2lmIGluZm99fSgke2luZm99KXt7L2lmfX0KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InRhZy1saW5rcyI+CiAgICAgICAge3tlYWNoIGxpbmtzfX0KICAgICAgICA8c3Bhbj5bPGEgaHJlZj0ie3todG1sICR2YWx1ZS51cmx9fSIgdGl0bGU9Int7aHRtbCAkdmFsdWUudXJsfX0iPnt7aHRtbCAkdmFsdWUudGl0bGV9fTwvYT5dPC9zcGFuPgogICAgICAgIHt7L2VhY2h9fQogICAgICA8L2Rpdj4KICAgIDwvdGQ+CiAgICB7e3RtcGwoJGRhdGEpICdzdGF0Q29sdW1uc1RlbXBsYXRlJ319CiAgPC90cj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1aXRlU3RhdGlzdGljc1Jvd1RlbXBsYXRlIj4KICA8dHIgb25jbGljaz0ibWFrZUVsZW1lbnRWaXNpYmxlKCcke2lkfScpIiBjbGFzcz0icm93LSR7JGl0ZW0uaW5kZXh9Ij4KICAgIDx0ZCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiIHRpdGxlPSJ7e2h0bWwgbGFiZWx9fSI+CiAgICAgIDxkaXYgY2xhc3M9InN0YXQtbmFtZSI+CiAgICAgICAgPGEgaHJlZj0iIyR7aWR9Ij48c3BhbiBjbGFzcz0icGFyZW50LW5hbWUiPnt7aHRtbCBmb3JtYXRQYXJlbnROYW1lfX08L3NwYW4+e3todG1sIG5hbWV9fTwvYT4KICAgICAgPC9kaXY+CiAgICA8L3RkPgogICAge3t0bXBsKCRkYXRhKSAnc3RhdENvbHVtbnNUZW1wbGF0ZSd9fQogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJlcnJvckhlYWRlclRlbXBsYXRlIj4KICA8aDI+e3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX0gRXhlY3V0aW9uIEVycm9yczwvaDI+CiAgPHRhYmxlIGlkPSJlcnJvcnMiPjwvdGFibGU+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJlcnJvclRlbXBsYXRlIj4KICA8dHIgaWQ9IiR7aWR9IiBjbGFzcz0ibWVzc2FnZS1yb3ciPgogICAgPHRkIGNsYXNzPSJlcnJvci10aW1lIj4KICAgICAge3tpZiBsaW5rfX0KICAgICAgPGEgb25jbGljaz0ibWFrZUVsZW1lbnRWaXNpYmxlKCcke2xpbmt9JykiIGhyZWY9IiMke2xpbmt9IiB0aXRsZT0iTGluayB0byBkZXRhaWxzIj4ke2RhdGV9ICR7dGltZX08L2E+CiAgICAgIHt7ZWxzZX19CiAgICAgICR7ZGF0ZX0gJHt0aW1lfQogICAgICB7ey9pZn19CiAgICA8L3RkPgogICAgPHRkIGNsYXNzPSIke2xldmVsLnRvTG93ZXJDYXNlKCl9IGxldmVsIj48c3BhbiBjbGFzcz0ibGFiZWwgJHtsZXZlbC50b0xvd2VyQ2FzZSgpfSI+JHtsZXZlbH08L3NwYW4+PC90ZD4KICAgIDx0ZCBjbGFzcz0ibWVzc2FnZSI+e3todG1sIHRleHR9fTwvdGQ+CiAgICA8dGQgY2xhc3M9InNlbGVjdC1tZXNzYWdlIiBvbmNsaWNrPSJqYXZhc2NyaXB0OnNlbGVjdE1lc3NhZ2UoJyR7aWR9JykiIHRpdGxlPSJTZWxlY3QgbWVzc2FnZSB0ZXh0Ij4KICAgICAgPGRpdj48L2Rpdj4KICAgIDwvdGQ+CiAgPC90cj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1aXRlVGVtcGxhdGUiPgogIDxkaXYgaWQ9IiR7aWR9IiBjbGFzcz0ic3VpdGUiPgogICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXIgY2xvc2VkIiBvbmNsaWNrPSJ0b2dnbGVTdWl0ZSgnJHtpZH0nKSI+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLWxlZnQiIHRpdGxlPSJTVUlURSAge3todG1sIG5hbWV9fSAgWyR7c3RhdHVzfV0iPgogICAgICAgIDxzcGFuIGNsYXNzPSJlbGFwc2VkIiB0aXRsZT0iRWxhcHNlZCB0aW1lIj4ke3RpbWVzLmVsYXBzZWRUaW1lfTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0ibGFiZWwgJHtzdGF0dXMudG9Mb3dlckNhc2UoKX0iPlNVSVRFPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJuYW1lIj57e2h0bWwgbmFtZX19PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXItcmlnaHQiIG9uY2xpY2s9InN0b3BQcm9wYWdhdGlvbihldmVudCkiIHRpdGxlPSIiPgogICAgICAgIDxhIGNsYXNzPSJleHBhbmQiIHRpdGxlPSJFeHBhbmQgYWxsIiBocmVmPSJqYXZhc2NyaXB0OmV4cGFuZEFsbCgnJHtpZH0nKSI+PC9hPgogICAgICAgIDxhIGNsYXNzPSJjb2xsYXBzZSIgdGl0bGU9IkNvbGxhcHNlIGFsbCIgaHJlZj0iamF2YXNjcmlwdDpjb2xsYXBzZUFsbCgnJHtpZH0nKSI+PC9hPgogICAgICAgIDxhIGNsYXNzPSJsaW5rIiB0aXRsZT0iTGluayB0byB0aGlzIHN1aXRlIiBocmVmPSIjJHtpZH0iIG9uY2xpY2s9Im1ha2VFbGVtZW50VmlzaWJsZSgnJHtpZH0nKSI+PC9hPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXItdG9nZ2xlIiB0aXRsZT0iVG9nZ2xlIHZpc2liaWxpdHkiPjwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJjaGlsZHJlbiI+CiAgICAgIDx0YWJsZSBjbGFzcz0ibWV0YWRhdGEiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5GdWxsIE5hbWU6PC90aD4KICAgICAgICAgIDx0ZD57e2h0bWwgZnVsbE5hbWV9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7e2lmIGRvYygpfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+RG9jdW1lbnRhdGlvbjo8L3RoPgogICAgICAgICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCBkb2MoKX19PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7L2lmfX0KICAgICAgICB7e2VhY2ggbWV0YWRhdGF9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD57e2h0bWwgJHZhbHVlWzBdfX06PC90aD4KICAgICAgICAgIDx0ZCBjbGFzcz0iZG9jIj57e2h0bWwgJHZhbHVlWzFdfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svZWFjaH19CiAgICAgICAge3tpZiBzb3VyY2V9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5Tb3VyY2U6PC90aD4KICAgICAgICAgIHt7aWYgcmVsYXRpdmVTb3VyY2V9fQogICAgICAgICAgPHRkPjxhIGhyZWY9IiR7cmVsYXRpdmVTb3VyY2V9Ij57e2h0bWwgc291cmNlfX08L2E+PC90ZD4KICAgICAgICAgIHt7ZWxzZX19CiAgICAgICAgICA8dGQ+e3todG1sIHNvdXJjZX19PC90ZD4KICAgICAgICAgIHt7L2lmfX0KICAgICAgICA8L3RyPgogICAgICAgIHt7L2lmfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+U3RhcnQgLyBFbmQgLyBFbGFwc2VkOjwvdGg+CiAgICAgICAgICA8dGQ+JHt0aW1lcy5zdGFydFRpbWV9IC8gJHt0aW1lcy5lbmRUaW1lfSAvICR7dGltZXMuZWxhcHNlZFRpbWV9PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5TdGF0dXM6PC90aD4KICAgICAgICAgIDx0ZD57e3RtcGwoJGRhdGEpICdzdWl0ZVN0YXR1c01lc3NhZ2VUZW1wbGF0ZSd9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7e2lmIG1lc3NhZ2UoKX19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPk1lc3NhZ2U6PC90aD4KICAgICAgICAgIDx0ZCBjbGFzcz0ibWVzc2FnZSI+e3todG1sIG1lc3NhZ2UoKX19PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7L2lmfX0KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idGVzdFRlbXBsYXRlIj4KICA8ZGl2IGlkPSIke2lkfSIgY2xhc3M9InRlc3QiPgogICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXIgY2xvc2VkIiBvbmNsaWNrPSJ0b2dnbGVUZXN0KCcke2lkfScpIj4KICAgICAgPGRpdiBjbGFzcz0iZWxlbWVudC1oZWFkZXItbGVmdCIgdGl0bGU9Int7PSB0ZXN0T3JUYXNrKCd7VEVTVH0nKX19ICB7e2h0bWwgbmFtZX19ICBbJHtzdGF0dXN9XSI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImVsYXBzZWQiIHRpdGxlPSJFbGFwc2VkIHRpbWUiPiR7dGltZXMuZWxhcHNlZFRpbWV9PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJsYWJlbCAke3N0YXR1cy50b0xvd2VyQ2FzZSgpfSI+e3s9IHRlc3RPclRhc2soJ3tURVNUfScpfX08L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9Im5hbWUiPnt7aHRtbCBuYW1lfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci1yaWdodCIgb25jbGljaz0ic3RvcFByb3BhZ2F0aW9uKGV2ZW50KSIgdGl0bGU9IiI+CiAgICAgICAgPGEgY2xhc3M9ImV4cGFuZCIgdGl0bGU9IkV4cGFuZCBhbGwiIGhyZWY9ImphdmFzY3JpcHQ6ZXhwYW5kQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImNvbGxhcHNlIiB0aXRsZT0iQ29sbGFwc2UgYWxsIiBocmVmPSJqYXZhc2NyaXB0OmNvbGxhcHNlQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImxpbmsiIHRpdGxlPSJMaW5rIHRvIHRoaXMge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX0iIGhyZWY9IiMke2lkfSIgb25jbGljaz0ibWFrZUVsZW1lbnRWaXNpYmxlKCcke2lkfScpIj48L2E+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci10b2dnbGUiIHRpdGxlPSJUb2dnbGUgdmlzaWJpbGl0eSI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImNoaWxkcmVuIj4KICAgICAgPHRhYmxlIGNsYXNzPSJtZXRhZGF0YSI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPkZ1bGwgTmFtZTo8L3RoPgogICAgICAgICAgPHRkPnt7aHRtbCBmdWxsTmFtZX19PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7aWYgZG9jKCl9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICAgICAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sIGRvYygpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIHt7aWYgdGFncy5sZW5ndGh9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5UYWdzOjwvdGg+CiAgICAgICAgICA8dGQ+e3todG1sIHRhZ3Muam9pbignLCAnKX19PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7L2lmfX0KICAgICAgICB7e2lmIHRpbWVvdXR9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5UaW1lb3V0OjwvdGg+CiAgICAgICAgICA8dGQ+e3todG1sIHRpbWVvdXR9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlN0YXJ0IC8gRW5kIC8gRWxhcHNlZDo8L3RoPgogICAgICAgICAgPHRkPiR7dGltZXMuc3RhcnRUaW1lfSAvICR7dGltZXMuZW5kVGltZX0gLyAke3RpbWVzLmVsYXBzZWRUaW1lfTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+U3RhdHVzOjwvdGg+CiAgICAgICAgICA8dGQ+PHNwYW4gY2xhc3M9ImxhYmVsICR7c3RhdHVzLnRvTG93ZXJDYXNlKCl9Ij4ke3N0YXR1c308L3NwYW4+PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7aWYgbWVzc2FnZSgpfX0KICAgICAgICA8dHI+CiAgICAgICAgICA8dGg+TWVzc2FnZTo8L3RoPgogICAgICAgICAgPHRkIGNsYXNzPSJtZXNzYWdlIj57e2h0bWwgbWVzc2FnZSgpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgPC9kaXY+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJrZXl3b3JkVGVtcGxhdGUiPgogIDxkaXYgaWQ9IiR7aWR9IiBjbGFzcz0ia2V5d29yZCI+CiAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlciBjbG9zZWQiIG9uY2xpY2s9InRvZ2dsZUtleXdvcmQoJyR7aWR9JykiPgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci1sZWZ0IiB0aXRsZT0iJHt0eXBlfSAge3tpZiBuYW1lfX17e2h0bWwgZnVsbE5hbWV9fSAge3svaWZ9fVske3N0YXR1c31dIj4KICAgICAgICA8c3BhbiBjbGFzcz0iZWxhcHNlZCIgdGl0bGU9IkVsYXBzZWQgdGltZSI+JHt0aW1lcy5lbGFwc2VkVGltZX08L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImxhYmVsIGtleXdvcmQgJHtzdGF0dXMudG9Mb3dlckNhc2UoKX0iPiR7dHlwZX08L3NwYW4+CiAgICAgICAgPHNwYW4+e3todG1sIGFzc2lnbn19PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJuYW1lIj48c3BhbiBjbGFzcz0icGFyZW50LW5hbWUiPnt7aHRtbCBsaWJuYW1lfX17e2lmIGxpYm5hbWV9fSAuIHt7L2lmfX08L3NwYW4+e3todG1sIG5hbWV9fTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iYXJnIj57e2h0bWwgYXJndW1lbnRzfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJlbGVtZW50LWhlYWRlci1yaWdodCIgb25jbGljaz0ic3RvcFByb3BhZ2F0aW9uKGV2ZW50KSI+CiAgICAgICAgPGEgY2xhc3M9ImV4cGFuZCIgdGl0bGU9IkV4cGFuZCBhbGwiIGhyZWY9ImphdmFzY3JpcHQ6ZXhwYW5kQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImNvbGxhcHNlIiB0aXRsZT0iQ29sbGFwc2UgYWxsIiBocmVmPSJqYXZhc2NyaXB0OmNvbGxhcHNlQWxsKCcke2lkfScpIj48L2E+CiAgICAgICAgPGEgY2xhc3M9ImxpbmsiIHRpdGxlPSJMaW5rIHRvIHRoaXMga2V5d29yZCIgaHJlZj0iIyR7aWR9IiBvbmNsaWNrPSJtYWtlRWxlbWVudFZpc2libGUoJyR7aWR9JykiPjwvYT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImVsZW1lbnQtaGVhZGVyLXRvZ2dsZSIgdGl0bGU9IlRvZ2dsZSB2aXNpYmlsaXR5Ij48L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iY2hpbGRyZW4iPgogICAgICA8dGFibGUgY2xhc3M9Im1ldGFkYXRhIGtleXdvcmQtbWV0YWRhdGEiPgogICAgICAgIHt7aWYgZG9jKCl9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5Eb2N1bWVudGF0aW9uOjwvdGg+CiAgICAgICAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sIGRvYygpfX08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAge3svaWZ9fQogICAgICAgIHt7aWYgdGFnc319CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlRhZ3M6PC90aD4KICAgICAgICAgIDx0ZD57e2h0bWwgdGFnc319PC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIHt7L2lmfX0KICAgICAgICB7e2lmIHRpbWVvdXR9fQogICAgICAgIDx0cj4KICAgICAgICAgIDx0aD5UaW1lb3V0OjwvdGg+CiAgICAgICAgICA8dGQ+e3todG1sIHRpbWVvdXR9fTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgICB7ey9pZn19CiAgICAgICAgPHRyPgogICAgICAgICAgPHRoPlN0YXJ0IC8gRW5kIC8gRWxhcHNlZDo8L3RoPgogICAgICAgICAgPHRkPiR7dGltZXMuc3RhcnRUaW1lfSAvICR7dGltZXMuZW5kVGltZX0gLyAke3RpbWVzLmVsYXBzZWRUaW1lfTwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ibWVzc2FnZVRlbXBsYXRlIj4KICA8dGFibGUgaWQ9IiR7aWR9IiBjbGFzcz0ibWVzc2FnZXMgJHtsZXZlbC50b0xvd2VyQ2FzZSgpfS1tZXNzYWdlIj4KICAgIDx0ciBjbGFzcz0ibWVzc2FnZS1yb3ciPgogICAgICA8dGQgY2xhc3M9InRpbWUiPiR7dGltZX08L3RkPgogICAgICA8dGQgY2xhc3M9IiR7bGV2ZWwudG9Mb3dlckNhc2UoKX0gbGV2ZWwiPjxzcGFuIGNsYXNzPSJsYWJlbCAke2xldmVsLnRvTG93ZXJDYXNlKCl9Ij4ke2xldmVsfTwvc3Bhbj48L3RkPgogICAgICA8dGQgY2xhc3M9Im1lc3NhZ2UiPnt7aHRtbCB0ZXh0fX08L3RkPgogICAgICA8dGQgY2xhc3M9InNlbGVjdC1tZXNzYWdlIiBvbmNsaWNrPSJqYXZhc2NyaXB0OnNlbGVjdE1lc3NhZ2UoJyR7aWR9JykiIHRpdGxlPSJTZWxlY3QgbWVzc2FnZSB0ZXh0Ij4KICAgICAgICA8ZGl2PjwvZGl2PgogICAgICA8L3RkPgogICAgPC90cj4KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ibG9nTGV2ZWxTZWxlY3RvclRlbXBsYXRlIj4KICA8ZGl2IGlkPSJsb2ctbGV2ZWwtc2VsZWN0b3IiPgogIExvZyBsZXZlbDoKICAgIDxzZWxlY3Qgb25jaGFuZ2U9ImxvZ0xldmVsU2VsZWN0ZWQodGhpcy5vcHRpb25zW3NlbGVjdGVkSW5kZXhdLnZhbHVlKSI+CiAgICAgIDxvcHRpb24gdmFsdWU9IjIiPklORk88L29wdGlvbj4KICAgICAgPG9wdGlvbiB2YWx1ZT0iMSI+REVCVUc8L29wdGlvbj4KICAgICAge3tpZiBzaG93VHJhY2UoKX19PG9wdGlvbiB2YWx1ZT0iMCI+VFJBQ0U8L29wdGlvbj57ey9pZn19CiAgICA8L3NlbGVjdD4KICA8L2Rpdj4KPC9zY3JpcHQ+Cgo8L2JvZHk+CjwvaHRtbD4K';w.document.open();w.document.write(window.atob(d));w.document.close();var a=w.document.createElement('a');a.appendChild(w.document.createTextNode('Download'));a.href='data:text/html;base64,' + d;a.download='log.html';a.style='position:fixed;top:0;right:0;color:white;background:black;text-decoration:none;font-weight:bold;padding:7px 14px;border-radius:0 0 0 5px;';w.document.body.append(a);})(this);\">Log</a> | <a href=\"about:\" onClick=\"javascript:(function(el){var w=window.open();var d='PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KPG1ldGEgaHR0cC1lcXVpdj0iUHJhZ21hIiBjb250ZW50PSJuby1jYWNoZSI+CjxtZXRhIGh0dHAtZXF1aXY9IkV4cGlyZXMiIGNvbnRlbnQ9Ii0xIj4KPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIj4KPG1ldGEgY29udGVudD0iUm9ib3QgRnJhbWV3b3JrIDQuMC4zIChQeXRob24gMy45LjYgb24gbGludXgpIiBuYW1lPSJHZW5lcmF0b3IiPgo8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBRUFJQUJvQkFBQUZnQUFBQ2dBQUFBUUFBQUFJQUFBQUFFQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFLY0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQXFBQUFBQUFBQUFBQUFBQUFBQUFBQUxJQUFBRC9BQUFBNEFBQUFOd0FBQURjQUFBQTNBQUFBTndBQUFEY0FBQUEzQUFBQU53QUFBRGNBQUFBNEFBQUFQOEFBQUN4QUFBQUFBQUFBS1lBQUFEL0FBQUF1d0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQy9BQUFBL3dBQUFLa0FBQUQ2QUFBQXpBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU44QUFBRC9BQUFBK2dBQUFNTUFBQUFBQUFBQUFnQUFBR3NBQUFCckFBQUFhd0FBQUdzQUFBQnJBQUFBYXdBQUFHc0FBQUJyQUFBQURBQUFBQUFBQUFEYUFBQUEvd0FBQVBvQUFBRERBQUFBQUFBQUFJc0FBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBL3dBQUFORUFBQUFBQUFBQTJnQUFBUDhBQUFENkFBQUF3d0FBQUFBQUFBQUFBQUFBTWdBQUFESUFBQUF5QUFBQU1nQUFBRElBQUFBeUFBQUFNZ0FBQURJQUFBQUZBQUFBQUFBQUFOb0FBQUQvQUFBQStnQUFBTU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGFBQUFBL3dBQUFQb0FBQUREQUFBQUFBQUFBRHdBQUFCOEFBQUFBQUFBQUdBQUFBQmNBQUFBQUFBQUFIOEFBQUJLQUFBQUFBQUFBQUFBQUFBQUFBQUEyZ0FBQVA4QUFBRDZBQUFBd3dBQUFBQUFBQURDQUFBQS93QUFBQ2tBQUFEcUFBQUE0UUFBQUFBQUFBRDdBQUFBL3dBQUFMQUFBQUFHQUFBQUFBQUFBTm9BQUFEL0FBQUErZ0FBQU1NQUFBQUFBQUFBSXdBQUFQNEFBQUQvQUFBQS93QUFBR0FBQUFBQUFBQUFBQUFBQU1rQUFBRC9BQUFBaWdBQUFBQUFBQURhQUFBQS93QUFBUG9BQUFEREFBQUFBQUFBQUFBQUFBQUlBQUFBY0FBQUFCa0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFZ0FBQUFBQUFBQUFBQUFBMmdBQUFQOEFBQUQ3QUFBQXl3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU40QUFBRC9BQUFBcXdBQUFQOEFBQUN2QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTElBQUFEL0FBQUFzZ0FBQUFBQUFBQzVBQUFBL3dBQUFNb0FBQURBQUFBQXdBQUFBTUFBQUFEQUFBQUF3QUFBQU1BQUFBREFBQUFBd0FBQUFNa0FBQUQvQUFBQXZBQUFBQUFBQUFBQUFBQUFBQUFBQUt3QUFBRC9BQUFBL3dBQUFQOEFBQUQvQUFBQS93QUFBUDhBQUFEL0FBQUEvd0FBQVA4QUFBRC9BQUFBclFBQUFBQUFBQUFBd0FNQUFJQUJBQUFmK0FBQVAvd0FBRC84QUFBZ0JBQUFQL3dBQUQvOEFBQS8vQUFBSkl3QUFESEVBQUEvL0FBQVAvd0FBQi80QUFDQUFRQUF3QU1BQUE9PSI+CjxzdHlsZSBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyI+Ci8qIEdlbmVyaWMgYW5kIG1pc2Mgc3R5bGVzICovCmJvZHkgewogICAgZm9udC1mYW1pbHk6IEhlbHZldGljYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICBjb2xvcjogYmxhY2s7CiAgICBwYWRkaW5nOiA2cHg7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQp0YWJsZSB7CiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBmb250LXNpemU6IDFlbTsKfQp0aCwgdGQgewogICAgdmVydGljYWwtYWxpZ246IHRvcDsKfQpiciB7CiAgICBtc28tZGF0YS1wbGFjZW1lbnQ6IHNhbWUtY2VsbDsgLyogbWFpbnRhaW4gbGluZSBicmVha3MgaW4gRXhjZWwgKi8KfQpociB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgaGVpZ2h0OiAxcHg7CiAgICBib3JkZXI6IDA7Cn0KYSwgYTpsaW5rLCBhOnZpc2l0ZWQgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgY29sb3I6ICMxNWM7Cn0KYSA+IGltZyB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjMTVjICFpbXBvcnRhbnQ7Cn0KYTpob3ZlciwgYTphY3RpdmUgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICBjb2xvcjogIzYxYzsKfQoucGFyZW50LW5hbWUgewogICAgZm9udC1zaXplOiAwLjdlbTsKICAgIGxldHRlci1zcGFjaW5nOiAtMC4wN2VtOwp9Ci5tZXNzYWdlIHsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKfQovKiBIZWFkZXJzICovCiNoZWFkZXIgewogICAgd2lkdGg6IDY1ZW07CiAgICBoZWlnaHQ6IDNlbTsKICAgIG1hcmdpbjogNnB4IDA7Cn0KaDEgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBtYXJnaW46IDAgMCAwLjVlbSAwOwogICAgd2lkdGg6IDc1JTsKfQpoMiB7CiAgICBjbGVhcjogbGVmdDsKfQojZ2VuZXJhdGVkIHsKICAgIGZsb2F0OiByaWdodDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLyogRG9jdW1lbnRhdGlvbiBoZWFkZXJzICovCi5kb2MgPiBoMiB7CiAgICBmb250LXNpemU6IDEuMmVtOwp9Ci5kb2MgPiBoMyB7CiAgICBmb250LXNpemU6IDEuMWVtOwp9Ci5kb2MgPiBoNCB7CiAgICBmb250LXNpemU6IDEuMGVtOwp9Ci8qIFN0YXR1cyB0ZXh0IGNvbG9ycyAtLSAhaW1wb3J0YW50IGFsbG93cyB1c2luZyB0aGVtIGluIGxpbmtzICovCi5mYWlsIHsKICAgIGNvbG9yOiAjY2UzZTAxICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoucGFzcyB7CiAgICBjb2xvcjogIzA5OGEwOSAhaW1wb3J0YW50Owp9Ci5za2lwIHsKICAgIGNvbG9yOiAjOTI3MjAxICFpbXBvcnRhbnQ7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoubGFiZWwgewogICAgcGFkZGluZzogMnB4IDVweDsKICAgIGZvbnQtc2l6ZTogMC43NWVtOwogICAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjb2xvcjogYmxhY2s7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9Ci5sYWJlbC5kZWJ1ZywgLmxhYmVsLnRyYWNlLCAubGFiZWwuZXJyb3IsIC5sYWJlbC5rZXl3b3JkIHsKICAgIGxldHRlci1zcGFjaW5nOiAwOwp9Ci5sYWJlbC5wYXNzLCAubGFiZWwuZmFpbCwgLmxhYmVsLmVycm9yLCAubGFiZWwuc2tpcCwgLmxhYmVsLndhcm4gewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLmxhYmVsLnBhc3MgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzk3YmQ2MTsKICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7Cn0KLmxhYmVsLmZhaWwsIC5sYWJlbC5lcnJvciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2UzZTAxOwogICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsKfQoubGFiZWwuc2tpcCwgLmxhYmVsLndhcm4gewogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZDg0ZjsKICAgIGNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7Cn0KLyogVG9wIHJpZ2h0IGhlYWRlciAqLwojdG9wLXJpZ2h0LWhlYWRlciB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDA7CiAgICByaWdodDogMDsKICAgIHotaW5kZXg6IDEwMDA7CiAgICB3aWR0aDogMTJlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQojcmVwb3J0LW9yLWxvZy1saW5rIGEgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiBibGFjazsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMWVtOwogICAgcGFkZGluZzogMC4zZW0gMDsKICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKfQojcmVwb3J0LW9yLWxvZy1saW5rIGE6aG92ZXIgewogICAgY29sb3I6ICNkZGQ7Cn0KI2xvZy1sZXZlbC1zZWxlY3RvciB7CiAgICBwYWRkaW5nOiAwLjNlbSAwOwogICAgZm9udC1zaXplOiAwLjllbTsKICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6ICNkZGQ7Cn0KLyogU3RhdGlzdGljcyB0YWJsZSAqLwouc3RhdGlzdGljcyB7CiAgICB3aWR0aDogNjVlbTsKICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICBlbXB0eS1jZWxsczogc2hvdzsKICAgIG1hcmdpbi1ib3R0b206IDFlbTsKfQouc3RhdGlzdGljcyB0cjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiAjZjRmNGY0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci5zdGF0aXN0aWNzIHRoLCAuc3RhdGlzdGljcyB0ZCB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgcGFkZGluZzogMC4xZW0gMC4zZW07Cn0KLnN0YXRpc3RpY3MgdGggewogICAgYmFja2dyb3VuZC1jb2xvcjogI2RkZDsKICAgIHBhZGRpbmc6IDAuMmVtIDAuM2VtOwp9Ci5zdGF0aXN0aWNzIHRkIHsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KLnN0YXRzLWNvbC1zdGF0IHsKICAgIHdpZHRoOiA0LjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouc3RhdHMtY29sLWVsYXBzZWQgewogICAgd2lkdGg6IDUuNWVtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5zdGF0cy1jb2wtZ3JhcGggewogICAgd2lkdGg6IDllbTsKfQp0aC5zdGF0cy1jb2wtZ3JhcGg6aG92ZXIgewogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci5zdGF0LW5hbWUgewogICAgZmxvYXQ6IGxlZnQ7Cn0KLnN0YXQtbmFtZSBhLCAuc3RhdC1uYW1lIHNwYW4gewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLnRhZy1saW5rcyB7CiAgICBmb250LXNpemU6IDAuOWVtOwogICAgZmxvYXQ6IHJpZ2h0OwogICAgbWFyZ2luLXRvcDogMC4wNWVtOwp9Ci50YWctbGlua3Mgc3BhbiB7CiAgICBtYXJnaW4tbGVmdDogMC4yZW07Cn0KLyogU3RhdGlzdGljcyBncmFwaCAqLwouZ3JhcGgsIC5lbXB0eS1ncmFwaCB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgd2lkdGg6IGF1dG87CiAgICBoZWlnaHQ6IDdweDsKICAgIHBhZGRpbmc6IDA7CiAgICBiYWNrZ3JvdW5kOiAjYWFhOwp9Ci5lbXB0eS1ncmFwaCB7CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9Ci5wYXNzLWJhciwgLmZhaWwtYmFyLCAuc2tpcC1iYXIgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBoZWlnaHQ6IDEwMCU7Cn0KLmZhaWwtYmFyIHsKICAgIGJhY2tncm91bmQ6ICNjZTNlMDE7Cn0KLnBhc3MtYmFyIHsKICAgIGJhY2tncm91bmQ6ICM5N2JkNjE7Cn0KLnNraXAtYmFyIHsKICAgIGJhY2tncm91bmQ6ICNmZWQ4NGY7Cn0KLyogVGFibGVzb3J0ZXIgLSBhZGFwdGVkIGZyb20gcHJvdmlkZWQgQmx1ZSBTa2luICovCi50YWJsZXNvcnRlci1oZWFkZXIgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEN3QUpBSUFBQUg5L2Z3QUFBQ0g1QkFFQUFBRUFMQUFBQUFBTEFBa0FBQUlSakFPbkJyM2NuSXIwV1VqVHJDOWU5QlFBT3c9PSk7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIHJpZ2h0OwogICAgY3Vyc29yOiBwb2ludGVyOwp9Ci50YWJsZXNvcnRlci1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKfQoudGFibGVzb3J0ZXItaGVhZGVyQXNjIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhDd0FKQUtFQUFBQUFBSDkvZndBQUFBQUFBQ0g1QkFFQUFBSUFMQUFBQUFBTEFBa0FBQUlVbEJXbkZyM2NuSXIwV1FPeUJtdnpwMTNDcHhRQU93PT0pOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYyAhaW1wb3J0YW50Owp9Ci50YWJsZXNvcnRlci1oZWFkZXJEZXNjIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhDd0FKQUtFQUFBQUFBSDkvZndBQUFBQUFBQ0g1QkFFQUFBSUFMQUFBQUFBTEFBa0FBQUlVbEFXbkJyM2NuSXIwV1JPeURtdnpwMTNDcHhRQU93PT0pOwogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYyAhaW1wb3J0YW50Owp9Ci5zb3J0ZXItZmFsc2UgewogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQouc29ydGVyLWZhbHNlOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGQ7Cn0KPC9zdHlsZT4KPHN0eWxlIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIj4KLyogR2VuZXJpYyB0YWJsZSBzdHlsZXMgKi8KdGFibGUgewogICAgbWFyZ2luOiAwIDFweDsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwp9CnRyIHsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwp9CnRoIHsKICAgIGJhY2tncm91bmQ6ICNkZGQ7CiAgICBjb2xvcjogYmxhY2s7Cn0KLyogU3VtbWFyeSBhbmQgdG90YWwvdGFnL3N1aXRlIGRldGFpbHMgKi8KLmRldGFpbHMgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1zcGFjaW5nOiAwLjJlbTsKICAgIGNsZWFyOiBib3RoOwogICAgd2lkdGg6IDY1ZW07CiAgICBtYXJnaW4tYm90dG9tOiAxZW07Cn0KLmRldGFpbHMgdGggewogICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICB3aWR0aDogMTFlbTsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9Ci5kZXRhaWxzIHRkIHsKICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cn0KLnNlbGVjdG9yIHRoLCAuc2VsZWN0b3IgdGQgewogICAgcGFkZGluZy10b3A6IDAuNWVtOwogICAgcGFkZGluZy1ib3R0b206IDAuNWVtOwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQouZmlyc3Qtc2VsZWN0b3IgdGgsIC5maXJzdC1zZWxlY3RvciB0ZHsKICAgIHBhZGRpbmctYm90dG9tOiAwLjJlbTsKfQoubWlkZGxlLXNlbGVjdG9yIHRoLCAubWlkZGxlLXNlbGVjdG9yIHRkIHsKICAgIHBhZGRpbmctdG9wOiAwLjJlbTsKICAgIHBhZGRpbmctYm90dG9tOiAwLjJlbTsKfQoubGFzdC1zZWxlY3RvciB0aCwgLmxhc3Qtc2VsZWN0b3IgdGR7CiAgICBwYWRkaW5nLXRvcDogMC4yZW07Cn0KI3ByaW50LXNlbGVjdG9yIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KLyogU2VhcmNoICovCiNzZWFyY2gtc3VpdGUsICNzZWFyY2gtdGVzdCwgI3NlYXJjaC1pbmNsdWRlLCAjc2VhcmNoLWV4Y2x1ZGUgewogICAgd2lkdGg6IDI1ZW07Cn0KI3NlYXJjaCBhOmhvdmVyIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQojc2VhcmNoLWhlbHAgZGl2IHsKICAgIG1hcmdpbjogMC41ZW0gMC41ZW0gMC43ZW0gMDsKICAgIHBhZGRpbmc6IDAuN2VtOwogICAgYmFja2dyb3VuZDogI2VlZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KI3NlYXJjaC1oZWxwIGgzLCAjc2VhcmNoLWhlbHAgcCB7CiAgICBtYXJnaW46IDAgMCAwLjdlbSAwOwp9Ci5zZWFyY2gtaGVscC1leGFtcGxlcyB7CiAgICB0YWJsZS1sYXlvdXQ6IGF1dG87CiAgICB3aWR0aDogMTAwJTsKfQouc2VhcmNoLWhlbHAtZXhhbXBsZXMsIC5zZWFyY2gtaGVscC1leGFtcGxlcyB0ciwKLnNlYXJjaC1oZWxwLWV4YW1wbGVzIHRoLCAuc2VhcmNoLWhlbHAtZXhhbXBsZXMgdGQgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBtYXJnaW46IDA7Cn0KLnNlYXJjaC1oZWxwLWV4YW1wbGVzIHRoLCAuc2VhcmNoLWhlbHAtZXhhbXBsZXMgdGQgewogICAgcGFkZGluZzogMC4yZW0gMC43ZW0gMC4yZW0gMDsKfQouaGVscC1pdGVtIHsKICAgIHdpZHRoOiAxMCU7Cn0KLmhlbHAtZXhwbGFuYXRpb24gewogICAgd2lkdGg6IDY1JTsKfQouaGVscC1leGFtcGxlcyB7CiAgICB3aWR0aDogMjUlOwp9Ci8qIFRhYnMgLSBhZGFwdGVkIGZyb20gaHR0cDovL3d3dy5odG1sZG9nLmNvbS9hcnRpY2xlcy90YWJzICovCiNkZXRhaWwtdGFicyB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbjogMCAxZW07Cn0KLmRldGFpbC10YWIgewogICAgZmxvYXQ6IGxlZnQ7CiAgICBiYWNrZ3JvdW5kOiAjZGRkOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDA7CiAgICBtYXJnaW46IDAgMC41ZW0gMCAwOwogICAgcGFkZGluZy10b3A6IDAuMWVtOwogICAgYm9yZGVyLXJhZGl1czogM3B4IDNweCAwIDA7Cn0KLmRldGFpbC10YWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2NjYzsKfQouZGV0YWlsLXRhYiBhIHsKICAgIGNvbG9yOiBibGFjazsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgcGFkZGluZzogMCAxZW07Cn0KLmRldGFpbC10YWItc2VsZWN0ZWQgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgdG9wOiAxcHg7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQouZGV0YWlsLXRhYi1zZWxlY3RlZDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQovKiBUZXN0IGRldGFpbHMgdGFibGUgKi8KI3Rlc3QtZGV0YWlscyB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlci1zcGFjaW5nOiAxcHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjOwp9CiN0ZXN0LWRldGFpbHMgPiB0Ym9keSA+IHRyOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6ICNmNGY0ZjQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KI3Rlc3QtZGV0YWlscyB0aCwgI3Rlc3QtZGV0YWlscyB0ZCB7CiAgICBwYWRkaW5nOiAwLjJlbTsKfQouZGV0YWlscy1saW1pdGVkIHsKICAgIG1heC1oZWlnaHQ6IDIwZW07CiAgICBvdmVyZmxvdzogYXV0bzsKfQouZGV0YWlscy1jb2wtaGVhZGVyIHsKICAgIHBhZGRpbmctcmlnaHQ6IDFlbTsKfQouZGV0YWlscy1jb2wtdG9nZ2xlIHsKICAgIGZsb2F0OiBsZWZ0OwogICAgY29sb3I6ICM2YzZjNmM7IC8qIHNhbWUgYXMgaW4gc29ydCBpY29uICovCiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KLmRldGFpbHMtY29sLXRvZ2dsZTpob3ZlciB7CiAgICBjb2xvcjogYmxhY2s7Cn0KLmRldGFpbHMtY29sLW5hbWUgewogICAgbWluLXdpZHRoOiAyMGVtOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KLmRldGFpbHMtY29sLWRvYyB7CiAgICBtaW4td2lkdGg6IDEwZW07Cn0KLmRldGFpbHMtY29sLXRhZ3MgewogICAgbWluLXdpZHRoOiAxMGVtOwp9Ci5kZXRhaWxzLWNvbC1jcml0IHsKICAgIHdpZHRoOiAzLjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouZGV0YWlscy1jb2wtc3RhdHVzIHsKICAgIHdpZHRoOiA0LjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQouZGV0YWlscy1jb2wtbXNnIHsKICAgIG1pbi13aWR0aDogMjBlbTsKfQouZGV0YWlscy1jb2wtZWxhcHNlZCB7CiAgICB3aWR0aDogN2VtOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Ci5kZXRhaWxzLWNvbC10aW1lcyB7CiAgICB3aWR0aDogMTFlbTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLmhpZGRlbiAuZGV0YWlscy1jb2wtaGVhZGVyLCB0ZC5oaWRkZW4gPiBkaXYgewogICAgZGlzcGxheTogbm9uZTsKfQouaGlkZGVuIHsKICAgIHdpZHRoOiAxM3B4OwogICAgbWluLXdpZHRoOiAwOwogICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKfQp0aC5oaWRkZW46aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9InByaW50IiB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHkgewogICAgYmFja2dyb3VuZDogd2hpdGUgIWltcG9ydGFudDsKICAgIHBhZGRpbmc6IDA7CiAgICBmb250LXNpemU6IDhwdDsKfQphOmxpbmssIGE6dmlzaXRlZCB7CiAgICBjb2xvcjogYmxhY2s7Cn0KI2hlYWRlciB7CiAgICB3aWR0aDogYXV0bzsKfQouZGV0YWlscywgLnN0YXRpc3RpY3MgewogICAgd2lkdGg6IDEwMCU7Cn0KI2dlbmVyYXRlZC1hZ28sICN0b3AtcmlnaHQtaGVhZGVyLCAjbm9ybWFsLXNlbGVjdG9yLCAjc2VhcmNoLWJ1dHRvbnMsCi5mb2xkaW5nLWJ1dHRvbiwgLmV4cGFuZCwgLmhpZGRlbiwgLmRldGFpbHMtY29sLXRvZ2dsZSB7CiAgICBkaXNwbGF5OiBub25lOwp9Ci5lbGVtZW50LWhlYWRlci10ZXh0LCAuY2hpbGRyZW4gewogICAgbWFyZ2luOiAwOwp9CiN0ZXN0LWRldGFpbHMgewogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwp9CiN0ZXN0LWRldGFpbHMgdGgsICN0ZXN0LWRldGFpbHMgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQouZGV0YWlscy1jb2wtaGVhZGVyIHsKICAgIHBhZGRpbmc6IDA7Cn0KI3ByaW50LXNlbGVjdG9yIHsKICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7Cn0KLnRhYmxlc29ydGVyLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOwogICAgYmFja2dyb3VuZDogI2RkZCAhaW1wb3J0YW50Owp9Cjwvc3R5bGU+CjxzdHlsZSBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyI+CiNqYXZhc2NyaXB0LWRpc2FibGVkIHsKICAgIHdpZHRoOiA2MDBweDsKICAgIG1hcmdpbjogMTAwcHggYXV0byAwIGF1dG87CiAgICBwYWRkaW5nOiAyMHB4OwogICAgY29sb3I6IGJsYWNrOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJhY2tncm91bmQ6ICNlZWU7Cn0KI2phdmFzY3JpcHQtZGlzYWJsZWQgaDEgewogICAgd2lkdGg6IDEwMCU7CiAgICBmbG9hdDogbm9uZTsKfQojamF2YXNjcmlwdC1kaXNhYmxlZCB1bCB7CiAgICBmb250LXNpemU6IDEuMmVtOwp9CiNqYXZhc2NyaXB0LWRpc2FibGVkIGxpIHsKICAgIG1hcmdpbjogMC41ZW0gMDsKfQojamF2YXNjcmlwdC1kaXNhYmxlZCBiIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQo8L3N0eWxlPgo8c3R5bGUgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiPgouZG9jID4gKiB7CiAgICBtYXJnaW46IDAuN2VtIDFlbSAwLjFlbSAxZW07CiAgICBwYWRkaW5nOiAwOwp9Ci5kb2MgPiBwLCAuZG9jID4gaDEsIC5kb2MgPiBoMiwgLmRvYyA+IGgzLCAuZG9jID4gaDQgewogICAgbWFyZ2luOiAwLjdlbSAwIDAuMWVtIDA7Cn0KLmRvYyA+ICo6Zmlyc3QtY2hpbGQgewogICAgbWFyZ2luLXRvcDogMC4xZW07Cn0KLmRvYyB0YWJsZSB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgZW1wdHktY2VsbHM6IHNob3c7CiAgICBmb250LXNpemU6IDAuOWVtOwp9Ci5kb2MgdGFibGUgdGgsIC5kb2MgdGFibGUgdGQgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgcGFkZGluZzogMC4xZW0gMC4zZW07CiAgICBoZWlnaHQ6IDEuMmVtOwp9Ci5kb2MgdGFibGUgdGggewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMWVtOwp9Ci5kb2MgcHJlIHsKICAgIGZvbnQtc2l6ZTogMS4xZW07CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwogICAgYmFja2dyb3VuZDogI2Y0ZjRmNDsKfQouZG9jIGNvZGUgewogICAgcGFkZGluZzogMCAwLjJlbTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07CiAgICBiYWNrZ3JvdW5kOiAjZWVlOwp9Ci5kb2MgbGkgewogICAgbGlzdC1zdHlsZS1wb3NpdGlvbjogaW5zaWRlOwogICAgbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Cn0KLmRvYyBpbWcgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQouZG9jIGhyIHsKICAgIGJhY2tncm91bmQ6ICNjY2M7CiAgICBoZWlnaHQ6IDFweDsKICAgIGJvcmRlcjogMDsKfQo8L3N0eWxlPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci8qISBqUXVlcnkgdjMuNS4xIHwgKGMpIEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwohZnVuY3Rpb24oZSx0KXsidXNlIHN0cmljdCI7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9ZS5kb2N1bWVudD90KGUsITApOmZ1bmN0aW9uKGUpe2lmKCFlLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiB0KGUpfTp0KGUpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihDLGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgdD1bXSxyPU9iamVjdC5nZXRQcm90b3R5cGVPZixzPXQuc2xpY2UsZz10LmZsYXQ/ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZmxhdC5jYWxsKGUpfTpmdW5jdGlvbihlKXtyZXR1cm4gdC5jb25jYXQuYXBwbHkoW10sZSl9LHU9dC5wdXNoLGk9dC5pbmRleE9mLG49e30sbz1uLnRvU3RyaW5nLHY9bi5oYXNPd25Qcm9wZXJ0eSxhPXYudG9TdHJpbmcsbD1hLmNhbGwoT2JqZWN0KSx5PXt9LG09ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJiJudW1iZXIiIT10eXBlb2YgZS5ub2RlVHlwZX0seD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmZT09PWUud2luZG93fSxFPUMuZG9jdW1lbnQsYz17dHlwZTohMCxzcmM6ITAsbm9uY2U6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIGIoZSx0LG4pe3ZhciByLGksbz0obj1ufHxFKS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtpZihvLnRleHQ9ZSx0KWZvcihyIGluIGMpKGk9dFtyXXx8dC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKHIpKSYmby5zZXRBdHRyaWJ1dGUocixpKTtuLmhlYWQuYXBwZW5kQ2hpbGQobykucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKX1mdW5jdGlvbiB3KGUpe3JldHVybiBudWxsPT1lP2UrIiI6Im9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9uW28uY2FsbChlKV18fCJvYmplY3QiOnR5cGVvZiBlfXZhciBmPSIzLjUuMSIsUz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgUy5mbi5pbml0KGUsdCl9O2Z1bmN0aW9uIHAoZSl7dmFyIHQ9ISFlJiYibGVuZ3RoImluIGUmJmUubGVuZ3RoLG49dyhlKTtyZXR1cm4hbShlKSYmIXgoZSkmJigiYXJyYXkiPT09bnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmMDx0JiZ0LTEgaW4gZSl9Uy5mbj1TLnByb3RvdHlwZT17anF1ZXJ5OmYsY29uc3RydWN0b3I6UyxsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHMuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3MuY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9Uy5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHR9LGVhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIFMuZWFjaCh0aGlzLGUpfSxtYXA6ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMubWFwKHRoaXMsZnVuY3Rpb24oZSx0KXtyZXR1cm4gbi5jYWxsKGUsdCxlKX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2socy5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxldmVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMuZ3JlcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQrMSklMn0pKX0sb2RkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFMuZ3JlcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQlMn0pKX0sZXE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZW5ndGgsbj0rZSsoZTwwP3Q6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKDA8PW4mJm48dD9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6dSxzb3J0OnQuc29ydCxzcGxpY2U6dC5zcGxpY2V9LFMuZXh0ZW5kPVMuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvLGE9YXJndW1lbnRzWzBdfHx7fSxzPTEsdT1hcmd1bWVudHMubGVuZ3RoLGw9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGEmJihsPWEsYT1hcmd1bWVudHNbc118fHt9LHMrKyksIm9iamVjdCI9PXR5cGVvZiBhfHxtKGEpfHwoYT17fSkscz09PXUmJihhPXRoaXMscy0tKTtzPHU7cysrKWlmKG51bGwhPShlPWFyZ3VtZW50c1tzXSkpZm9yKHQgaW4gZSlyPWVbdF0sIl9fcHJvdG9fXyIhPT10JiZhIT09ciYmKGwmJnImJihTLmlzUGxhaW5PYmplY3Qocil8fChpPUFycmF5LmlzQXJyYXkocikpKT8obj1hW3RdLG89aSYmIUFycmF5LmlzQXJyYXkobik/W106aXx8Uy5pc1BsYWluT2JqZWN0KG4pP246e30saT0hMSxhW3RdPVMuZXh0ZW5kKGwsbyxyKSk6dm9pZCAwIT09ciYmKGFbdF09cikpO3JldHVybiBhfSxTLmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisoZitNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcihlKX0sbm9vcDpmdW5jdGlvbigpe30saXNQbGFpbk9iamVjdDpmdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiEoIWV8fCJbb2JqZWN0IE9iamVjdF0iIT09by5jYWxsKGUpKSYmKCEodD1yKGUpKXx8ImZ1bmN0aW9uIj09dHlwZW9mKG49di5jYWxsKHQsImNvbnN0cnVjdG9yIikmJnQuY29uc3RydWN0b3IpJiZhLmNhbGwobik9PT1sKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBlKXJldHVybiExO3JldHVybiEwfSxnbG9iYWxFdmFsOmZ1bmN0aW9uKGUsdCxuKXtiKGUse25vbmNlOnQmJnQubm9uY2V9LG4pfSxlYWNoOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2lmKHAoZSkpe2ZvcihuPWUubGVuZ3RoO3I8bjtyKyspaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrfWVsc2UgZm9yKHIgaW4gZSlpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWs7cmV0dXJuIGV9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYocChPYmplY3QoZSkpP1MubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOnUuY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09dD8tMTppLmNhbGwodCxlLG4pfSxtZXJnZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0rdC5sZW5ndGgscj0wLGk9ZS5sZW5ndGg7cjxuO3IrKyllW2krK109dFtyXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9W10saT0wLG89ZS5sZW5ndGgsYT0hbjtpPG87aSsrKSF0KGVbaV0saSkhPT1hJiZyLnB1c2goZVtpXSk7cmV0dXJuIHJ9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPTAsYT1bXTtpZihwKGUpKWZvcihyPWUubGVuZ3RoO288cjtvKyspbnVsbCE9KGk9dChlW29dLG8sbikpJiZhLnB1c2goaSk7ZWxzZSBmb3IobyBpbiBlKW51bGwhPShpPXQoZVtvXSxvLG4pKSYmYS5wdXNoKGkpO3JldHVybiBnKGEpfSxndWlkOjEsc3VwcG9ydDp5fSksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKFMuZm5bU3ltYm9sLml0ZXJhdG9yXT10W1N5bWJvbC5pdGVyYXRvcl0pLFMuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtuWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pO3ZhciBkPWZ1bmN0aW9uKG4pe3ZhciBlLGQsYixvLGksaCxmLGcsdyx1LGwsVCxDLGEsRSx2LHMsYyx5LFM9InNpenpsZSIrMSpuZXcgRGF0ZSxwPW4uZG9jdW1lbnQsaz0wLHI9MCxtPXVlKCkseD11ZSgpLEE9dWUoKSxOPXVlKCksRD1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dCYmKGw9ITApLDB9LGo9e30uaGFzT3duUHJvcGVydHksdD1bXSxxPXQucG9wLEw9dC5wdXNoLEg9dC5wdXNoLE89dC5zbGljZSxQPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKWlmKGVbbl09PT10KXJldHVybiBuO3JldHVybi0xfSxSPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTT0iW1xceDIwXFx0XFxyXFxuXFxmXSIsST0iKD86XFxcXFtcXGRhLWZBLUZdezEsNn0iK00rIj98XFxcXFteXFxyXFxuXFxmXXxbXFx3LV18W15cMC1cXHg3Zl0pKyIsVz0iXFxbIitNKyIqKCIrSSsiKSg/OiIrTSsiKihbKl4kfCF+XT89KSIrTSsiKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwifCgiK0krIikpfCkiK00rIipcXF0iLEY9IjooIitJKyIpKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IitXKyIpKil8LiopXFwpfCkiLEI9bmV3IFJlZ0V4cChNKyIrIiwiZyIpLCQ9bmV3IFJlZ0V4cCgiXiIrTSsiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitNKyIrJCIsImciKSxfPW5ldyBSZWdFeHAoIl4iK00rIiosIitNKyIqIiksej1uZXcgUmVnRXhwKCJeIitNKyIqKFs+K35dfCIrTSsiKSIrTSsiKiIpLFU9bmV3IFJlZ0V4cChNKyJ8PiIpLFg9bmV3IFJlZ0V4cChGKSxWPW5ldyBSZWdFeHAoIl4iK0krIiQiKSxHPXtJRDpuZXcgUmVnRXhwKCJeIygiK0krIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrSSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrSSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK1cpLFBTRVVETzpuZXcgUmVnRXhwKCJeIitGKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK00rIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK00rIiooPzooWystXXwpIitNKyIqKFxcZCspfCkpIitNKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitSKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTSsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitNKyIqKCg/Oi1cXGQpP1xcZCopIitNKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxZPS9IVE1MJC9pLFE9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxKPS9eaFxkJC9pLEs9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLFo9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxlZT0vWyt+XS8sdGU9bmV3IFJlZ0V4cCgiXFxcXFtcXGRhLWZBLUZdezEsNn0iK00rIj98XFxcXChbXlxcclxcblxcZl0pIiwiZyIpLG5lPWZ1bmN0aW9uKGUsdCl7dmFyIG49IjB4IitlLnNsaWNlKDEpLTY1NTM2O3JldHVybiB0fHwobjwwP1N0cmluZy5mcm9tQ2hhckNvZGUobis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShuPj4xMHw1NTI5NiwxMDIzJm58NTYzMjApKX0scmU9LyhbXDAtXHgxZlx4N2ZdfF4tP1xkKXxeLSR8W15cMC1ceDFmXHg3Zi1cdUZGRkZcdy1dL2csaWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8iXDAiPT09ZT8iXHVmZmZkIjplLnNsaWNlKDAsLTEpKyJcXCIrZS5jaGFyQ29kZUF0KGUubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KSsiICI6IlxcIitlfSxvZT1mdW5jdGlvbigpe1QoKX0sYWU9YmUoZnVuY3Rpb24oZSl7cmV0dXJuITA9PT1lLmRpc2FibGVkJiYiZmllbGRzZXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e0guYXBwbHkodD1PLmNhbGwocC5jaGlsZE5vZGVzKSxwLmNoaWxkTm9kZXMpLHRbcC5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZSl7SD17YXBwbHk6dC5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtMLmFwcGx5KGUsTy5jYWxsKHQpKX06ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmxlbmd0aCxyPTA7d2hpbGUoZVtuKytdPXRbcisrXSk7ZS5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gc2UodCxlLG4scil7dmFyIGksbyxhLHMsdSxsLGMsZj1lJiZlLm93bmVyRG9jdW1lbnQscD1lP2Uubm9kZVR5cGU6OTtpZihuPW58fFtdLCJzdHJpbmciIT10eXBlb2YgdHx8IXR8fDEhPT1wJiY5IT09cCYmMTEhPT1wKXJldHVybiBuO2lmKCFyJiYoVChlKSxlPWV8fEMsRSkpe2lmKDExIT09cCYmKHU9Wi5leGVjKHQpKSlpZihpPXVbMV0pe2lmKDk9PT1wKXtpZighKGE9ZS5nZXRFbGVtZW50QnlJZChpKSkpcmV0dXJuIG47aWYoYS5pZD09PWkpcmV0dXJuIG4ucHVzaChhKSxufWVsc2UgaWYoZiYmKGE9Zi5nZXRFbGVtZW50QnlJZChpKSkmJnkoZSxhKSYmYS5pZD09PWkpcmV0dXJuIG4ucHVzaChhKSxufWVsc2V7aWYodVsyXSlyZXR1cm4gSC5hcHBseShuLGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCkpLG47aWYoKGk9dVszXSkmJmQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBILmFwcGx5KG4sZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGkpKSxufWlmKGQucXNhJiYhTlt0KyIgIl0mJighdnx8IXYudGVzdCh0KSkmJigxIT09cHx8Im9iamVjdCIhPT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKXtpZihjPXQsZj1lLDE9PT1wJiYoVS50ZXN0KHQpfHx6LnRlc3QodCkpKXsoZj1lZS50ZXN0KHQpJiZ5ZShlLnBhcmVudE5vZGUpfHxlKT09PWUmJmQuc2NvcGV8fCgocz1lLmdldEF0dHJpYnV0ZSgiaWQiKSk/cz1zLnJlcGxhY2UocmUsaWUpOmUuc2V0QXR0cmlidXRlKCJpZCIscz1TKSksbz0obD1oKHQpKS5sZW5ndGg7d2hpbGUoby0tKWxbb109KHM/IiMiK3M6IjpzY29wZSIpKyIgIit4ZShsW29dKTtjPWwuam9pbigiLCIpfXRyeXtyZXR1cm4gSC5hcHBseShuLGYucXVlcnlTZWxlY3RvckFsbChjKSksbn1jYXRjaChlKXtOKHQsITApfWZpbmFsbHl7cz09PVMmJmUucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGcodC5yZXBsYWNlKCQsIiQxIiksZSxuLHIpfWZ1bmN0aW9uIHVlKCl7dmFyIHI9W107cmV0dXJuIGZ1bmN0aW9uIGUodCxuKXtyZXR1cm4gci5wdXNoKHQrIiAiKT5iLmNhY2hlTGVuZ3RoJiZkZWxldGUgZVtyLnNoaWZ0KCldLGVbdCsiICJdPW59fWZ1bmN0aW9uIGxlKGUpe3JldHVybiBlW1NdPSEwLGV9ZnVuY3Rpb24gY2UoZSl7dmFyIHQ9Qy5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2goZSl7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGZlKGUsdCl7dmFyIG49ZS5zcGxpdCgifCIpLHI9bi5sZW5ndGg7d2hpbGUoci0tKWIuYXR0ckhhbmRsZVtuW3JdXT10fWZ1bmN0aW9uIHBlKGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBkZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmZS50eXBlPT09dH19ZnVuY3Rpb24gaGUobil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oImlucHV0Ij09PXR8fCJidXR0b24iPT09dCkmJmUudHlwZT09PW59fWZ1bmN0aW9uIGdlKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4iZm9ybSJpbiBlP2UucGFyZW50Tm9kZSYmITE9PT1lLmRpc2FibGVkPyJsYWJlbCJpbiBlPyJsYWJlbCJpbiBlLnBhcmVudE5vZGU/ZS5wYXJlbnROb2RlLmRpc2FibGVkPT09dDplLmRpc2FibGVkPT09dDplLmlzRGlzYWJsZWQ9PT10fHxlLmlzRGlzYWJsZWQhPT0hdCYmYWUoZSk9PT10OmUuZGlzYWJsZWQ9PT10OiJsYWJlbCJpbiBlJiZlLmRpc2FibGVkPT09dH19ZnVuY3Rpb24gdmUoYSl7cmV0dXJuIGxlKGZ1bmN0aW9uKG8pe3JldHVybiBvPStvLGxlKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1hKFtdLGUubGVuZ3RoLG8pLGk9ci5sZW5ndGg7d2hpbGUoaS0tKWVbbj1yW2ldXSYmKGVbbl09ISh0W25dPWVbbl0pKX0pfSl9ZnVuY3Rpb24geWUoZSl7cmV0dXJuIGUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmZX1mb3IoZSBpbiBkPXNlLnN1cHBvcnQ9e30saT1zZS5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lLm5hbWVzcGFjZVVSSSxuPShlLm93bmVyRG9jdW1lbnR8fGUpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4hWS50ZXN0KHR8fG4mJm4ubm9kZU5hbWV8fCJIVE1MIil9LFQ9c2Uuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbixyPWU/ZS5vd25lckRvY3VtZW50fHxlOnA7cmV0dXJuIHIhPUMmJjk9PT1yLm5vZGVUeXBlJiZyLmRvY3VtZW50RWxlbWVudCYmKGE9KEM9cikuZG9jdW1lbnRFbGVtZW50LEU9IWkoQykscCE9QyYmKG49Qy5kZWZhdWx0VmlldykmJm4udG9wIT09biYmKG4uYWRkRXZlbnRMaXN0ZW5lcj9uLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsb2UsITEpOm4uYXR0YWNoRXZlbnQmJm4uYXR0YWNoRXZlbnQoIm9udW5sb2FkIixvZSkpLGQuc2NvcGU9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQoQy5jcmVhdGVFbGVtZW50KCJkaXYiKSksInVuZGVmaW5lZCIhPXR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGwmJiFlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpzY29wZSBmaWVsZHNldCBkaXYiKS5sZW5ndGh9KSxkLmF0dHJpYnV0ZXM9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xhc3NOYW1lPSJpIiwhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksZC5nZXRFbGVtZW50c0J5VGFnTmFtZT1jZShmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZChDLmNyZWF0ZUNvbW1lbnQoIiIpKSwhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT1LLnRlc3QoQy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxkLmdldEJ5SWQ9Y2UoZnVuY3Rpb24oZSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZSkuaWQ9UywhQy5nZXRFbGVtZW50c0J5TmFtZXx8IUMuZ2V0RWxlbWVudHNCeU5hbWUoUykubGVuZ3RofSksZC5nZXRCeUlkPyhiLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UodGUsbmUpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoImlkIik9PT10fX0sYi5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRCeUlkJiZFKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuP1tuXTpbXX19KTooYi5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIG49ZS5yZXBsYWNlKHRlLG5lKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUmJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gdCYmdC52YWx1ZT09PW59fSxiLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJkUpe3ZhciBuLHIsaSxvPXQuZ2V0RWxlbWVudEJ5SWQoZSk7aWYobyl7aWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dO2k9dC5nZXRFbGVtZW50c0J5TmFtZShlKSxyPTA7d2hpbGUobz1pW3IrK10paWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW29dfXJldHVybltdfX0pLGIuZmluZC5UQUc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihlLHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgdC5nZXRFbGVtZW50c0J5VGFnTmFtZT90LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpOmQucXNhP3QucXVlcnlTZWxlY3RvckFsbChlKTp2b2lkIDB9OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPTAsbz10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpO2lmKCIqIj09PWUpe3doaWxlKG49b1tpKytdKTE9PT1uLm5vZGVUeXBlJiZyLnB1c2gobik7cmV0dXJuIHJ9cmV0dXJuIG99LGIuZmluZC5DTEFTUz1kLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGUsdCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJkUpcmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKX0scz1bXSx2PVtdLChkLnFzYT1LLnRlc3QoQy5xdWVyeVNlbGVjdG9yQWxsKSkmJihjZShmdW5jdGlvbihlKXt2YXIgdDthLmFwcGVuZENoaWxkKGUpLmlubmVySFRNTD0iPGEgaWQ9JyIrUysiJz48L2E+PHNlbGVjdCBpZD0nIitTKyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGUucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnYucHVzaCgiWypeJF09IitNKyIqKD86Jyd8XCJcIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHYucHVzaCgiXFxbIitNKyIqKD86dmFsdWV8IitSKyIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrUysiLV0iKS5sZW5ndGh8fHYucHVzaCgifj0iKSwodD1DLmNyZWF0ZUVsZW1lbnQoImlucHV0IikpLnNldEF0dHJpYnV0ZSgibmFtZSIsIiIpLGUuYXBwZW5kQ2hpbGQodCksZS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT0nJ10iKS5sZW5ndGh8fHYucHVzaCgiXFxbIitNKyIqbmFtZSIrTSsiKj0iK00rIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHYucHVzaCgiOmNoZWNrZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIitTKyIrKiIpLmxlbmd0aHx8di5wdXNoKCIuIy4rWyt+XSIpLGUucXVlcnlTZWxlY3RvckFsbCgiXFxcZiIpLHYucHVzaCgiW1xcclxcblxcZl0iKX0pLGNlKGZ1bmN0aW9uKGUpe2UuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciB0PUMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGUuYXBwZW5kQ2hpbGQodCkuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGUucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnYucHVzaCgibmFtZSIrTSsiKlsqXiR8IX5dPz0iKSwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmdi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGEuYXBwZW5kQ2hpbGQoZSkuZGlzYWJsZWQ9ITAsMiE9PWUucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksZS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4Iiksdi5wdXNoKCIsLio6Iil9KSksKGQubWF0Y2hlc1NlbGVjdG9yPUsudGVzdChjPWEubWF0Y2hlc3x8YS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLm9NYXRjaGVzU2VsZWN0b3J8fGEubXNNYXRjaGVzU2VsZWN0b3IpKSYmY2UoZnVuY3Rpb24oZSl7ZC5kaXNjb25uZWN0ZWRNYXRjaD1jLmNhbGwoZSwiKiIpLGMuY2FsbChlLCJbcyE9JyddOngiKSxzLnB1c2goIiE9IixGKX0pLHY9di5sZW5ndGgmJm5ldyBSZWdFeHAodi5qb2luKCJ8IikpLHM9cy5sZW5ndGgmJm5ldyBSZWdFeHAocy5qb2luKCJ8IikpLHQ9Sy50ZXN0KGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHk9dHx8Sy50ZXN0KGEuY29udGFpbnMpP2Z1bmN0aW9uKGUsdCl7dmFyIG49OT09PWUubm9kZVR5cGU/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKGUsdCl7aWYodCl3aGlsZSh0PXQucGFyZW50Tm9kZSlpZih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sRD10P2Z1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIGw9ITAsMDt2YXIgbj0hZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gbnx8KDEmKG49KGUub3duZXJEb2N1bWVudHx8ZSk9PSh0Lm93bmVyRG9jdW1lbnR8fHQpP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk6MSl8fCFkLnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PW4/ZT09Q3x8ZS5vd25lckRvY3VtZW50PT1wJiZ5KHAsZSk/LTE6dD09Q3x8dC5vd25lckRvY3VtZW50PT1wJiZ5KHAsdCk/MTp1P1AodSxlKS1QKHUsdCk6MDo0Jm4/LTE6MSl9OmZ1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIGw9ITAsMDt2YXIgbixyPTAsaT1lLnBhcmVudE5vZGUsbz10LnBhcmVudE5vZGUsYT1bZV0scz1bdF07aWYoIWl8fCFvKXJldHVybiBlPT1DPy0xOnQ9PUM/MTppPy0xOm8/MTp1P1AodSxlKS1QKHUsdCk6MDtpZihpPT09bylyZXR1cm4gcGUoZSx0KTtuPWU7d2hpbGUobj1uLnBhcmVudE5vZGUpYS51bnNoaWZ0KG4pO249dDt3aGlsZShuPW4ucGFyZW50Tm9kZSlzLnVuc2hpZnQobik7d2hpbGUoYVtyXT09PXNbcl0pcisrO3JldHVybiByP3BlKGFbcl0sc1tyXSk6YVtyXT09cD8tMTpzW3JdPT1wPzE6MH0pLEN9LHNlLm1hdGNoZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gc2UoZSxudWxsLG51bGwsdCl9LHNlLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihlLHQpe2lmKFQoZSksZC5tYXRjaGVzU2VsZWN0b3ImJkUmJiFOW3QrIiAiXSYmKCFzfHwhcy50ZXN0KHQpKSYmKCF2fHwhdi50ZXN0KHQpKSl0cnl7dmFyIG49Yy5jYWxsKGUsdCk7aWYobnx8ZC5kaXNjb25uZWN0ZWRNYXRjaHx8ZS5kb2N1bWVudCYmMTEhPT1lLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiBufWNhdGNoKGUpe04odCwhMCl9cmV0dXJuIDA8c2UodCxDLG51bGwsW2VdKS5sZW5ndGh9LHNlLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUub3duZXJEb2N1bWVudHx8ZSkhPUMmJlQoZSkseShlLHQpfSxzZS5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPUMmJlQoZSk7dmFyIG49Yi5hdHRySGFuZGxlW3QudG9Mb3dlckNhc2UoKV0scj1uJiZqLmNhbGwoYi5hdHRySGFuZGxlLHQudG9Mb3dlckNhc2UoKSk/bihlLHQsIUUpOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09cj9yOmQuYXR0cmlidXRlc3x8IUU/ZS5nZXRBdHRyaWJ1dGUodCk6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSxzZS5lc2NhcGU9ZnVuY3Rpb24oZSl7cmV0dXJuKGUrIiIpLnJlcGxhY2UocmUsaWUpfSxzZS5lcnJvcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LHNlLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXSxyPTAsaT0wO2lmKGw9IWQuZGV0ZWN0RHVwbGljYXRlcyx1PSFkLnNvcnRTdGFibGUmJmUuc2xpY2UoMCksZS5zb3J0KEQpLGwpe3doaWxlKHQ9ZVtpKytdKXQ9PT1lW2ldJiYocj1uLnB1c2goaSkpO3doaWxlKHItLSllLnNwbGljZShuW3JdLDEpfXJldHVybiB1PW51bGwsZX0sbz1zZS5nZXRUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0LG49IiIscj0wLGk9ZS5ub2RlVHlwZTtpZihpKXtpZigxPT09aXx8OT09PWl8fDExPT09aSl7aWYoInN0cmluZyI9PXR5cGVvZiBlLnRleHRDb250ZW50KXJldHVybiBlLnRleHRDb250ZW50O2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyluKz1vKGUpfWVsc2UgaWYoMz09PWl8fDQ9PT1pKXJldHVybiBlLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKHQ9ZVtyKytdKW4rPW8odCk7cmV0dXJuIG59LChiPXNlLnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmxlLG1hdGNoOkcsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZSh0ZSxuZSksZVszXT0oZVszXXx8ZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UodGUsbmUpLCJ+PSI9PT1lWzJdJiYoZVszXT0iICIrZVszXSsiICIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09ZVsxXS5zbGljZSgwLDMpPyhlWzNdfHxzZS5lcnJvcihlWzBdKSxlWzRdPSsoZVs0XT9lWzVdKyhlWzZdfHwxKToyKigiZXZlbiI9PT1lWzNdfHwib2RkIj09PWVbM10pKSxlWzVdPSsoZVs3XStlWzhdfHwib2RkIj09PWVbM10pKTplWzNdJiZzZS5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIHQsbj0hZVs2XSYmZVsyXTtyZXR1cm4gRy5DSElMRC50ZXN0KGVbMF0pP251bGw6KGVbM10/ZVsyXT1lWzRdfHxlWzVdfHwiIjpuJiZYLnRlc3QobikmJih0PWgobiwhMCkpJiYodD1uLmluZGV4T2YoIikiLG4ubGVuZ3RoLXQpLW4ubGVuZ3RoKSYmKGVbMF09ZVswXS5zbGljZSgwLHQpLGVbMl09bi5zbGljZSgwLHQpKSxlLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHRlLG5lKS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PWU/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXR9fSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgdD1tW2UrIiAiXTtyZXR1cm4gdHx8KHQ9bmV3IFJlZ0V4cCgiKF58IitNKyIpIitlKyIoIitNKyJ8JCkiKSkmJm0oZSxmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KCJzdHJpbmciPT10eXBlb2YgZS5jbGFzc05hbWUmJmUuY2xhc3NOYW1lfHwidW5kZWZpbmVkIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24obixyLGkpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1zZS5hdHRyKGUsbik7cmV0dXJuIG51bGw9PXQ/IiE9Ij09PXI6IXJ8fCh0Kz0iIiwiPSI9PT1yP3Q9PT1pOiIhPSI9PT1yP3QhPT1pOiJePSI9PT1yP2kmJjA9PT10LmluZGV4T2YoaSk6Iio9Ij09PXI/aSYmLTE8dC5pbmRleE9mKGkpOiIkPSI9PT1yP2kmJnQuc2xpY2UoLWkubGVuZ3RoKT09PWk6In49Ij09PXI/LTE8KCIgIit0LnJlcGxhY2UoQiwiICIpKyIgIikuaW5kZXhPZihpKToifD0iPT09ciYmKHQ9PT1pfHx0LnNsaWNlKDAsaS5sZW5ndGgrMSk9PT1pKyItIikpfX0sQ0hJTEQ6ZnVuY3Rpb24oaCxlLHQsZyx2KXt2YXIgeT0ibnRoIiE9PWguc2xpY2UoMCwzKSxtPSJsYXN0IiE9PWguc2xpY2UoLTQpLHg9Im9mLXR5cGUiPT09ZTtyZXR1cm4gMT09PWcmJjA9PT12P2Z1bmN0aW9uKGUpe3JldHVybiEhZS5wYXJlbnROb2RlfTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGw9eSE9PW0/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixjPWUucGFyZW50Tm9kZSxmPXgmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxwPSFuJiYheCxkPSExO2lmKGMpe2lmKHkpe3doaWxlKGwpe2E9ZTt3aGlsZShhPWFbbF0paWYoeD9hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1mOjE9PT1hLm5vZGVUeXBlKXJldHVybiExO3U9bD0ib25seSI9PT1oJiYhdSYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZih1PVttP2MuZmlyc3RDaGlsZDpjLmxhc3RDaGlsZF0sbSYmcCl7ZD0ocz0ocj0oaT0obz0oYT1jKVtTXXx8KGFbU109e30pKVthLnVuaXF1ZUlEXXx8KG9bYS51bmlxdWVJRF09e30pKVtoXXx8W10pWzBdPT09ayYmclsxXSkmJnJbMl0sYT1zJiZjLmNoaWxkTm9kZXNbc107d2hpbGUoYT0rK3MmJmEmJmFbbF18fChkPXM9MCl8fHUucG9wKCkpaWYoMT09PWEubm9kZVR5cGUmJisrZCYmYT09PWUpe2lbaF09W2sscyxkXTticmVha319ZWxzZSBpZihwJiYoZD1zPShyPShpPShvPShhPWUpW1NdfHwoYVtTXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdfHxbXSlbMF09PT1rJiZyWzFdKSwhMT09PWQpd2hpbGUoYT0rK3MmJmEmJmFbbF18fChkPXM9MCl8fHUucG9wKCkpaWYoKHg/YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZjoxPT09YS5ub2RlVHlwZSkmJisrZCYmKHAmJigoaT0obz1hW1NdfHwoYVtTXT17fSkpW2EudW5pcXVlSURdfHwob1thLnVuaXF1ZUlEXT17fSkpW2hdPVtrLGRdKSxhPT09ZSkpYnJlYWs7cmV0dXJuKGQtPXYpPT09Z3x8ZCVnPT0wJiYwPD1kL2d9fX0sUFNFVURPOmZ1bmN0aW9uKGUsbyl7dmFyIHQsYT1iLnBzZXVkb3NbZV18fGIuc2V0RmlsdGVyc1tlLnRvTG93ZXJDYXNlKCldfHxzZS5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2UpO3JldHVybiBhW1NdP2Eobyk6MTxhLmxlbmd0aD8odD1bZSxlLCIiLG9dLGIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP2xlKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1hKGUsbyksaT1yLmxlbmd0aDt3aGlsZShpLS0pZVtuPVAoZSxyW2ldKV09ISh0W25dPXJbaV0pfSk6ZnVuY3Rpb24oZSl7cmV0dXJuIGEoZSwwLHQpfSk6YX19LHBzZXVkb3M6e25vdDpsZShmdW5jdGlvbihlKXt2YXIgcj1bXSxpPVtdLHM9ZihlLnJlcGxhY2UoJCwiJDEiKSk7cmV0dXJuIHNbU10/bGUoZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbz1zKGUsbnVsbCxyLFtdKSxhPWUubGVuZ3RoO3doaWxlKGEtLSkoaT1vW2FdKSYmKGVbYV09ISh0W2FdPWkpKX0pOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gclswXT1lLHMocixudWxsLG4saSksclswXT1udWxsLCFpLnBvcCgpfX0pLGhhczpsZShmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIDA8c2UodCxlKS5sZW5ndGh9fSksY29udGFpbnM6bGUoZnVuY3Rpb24odCl7cmV0dXJuIHQ9dC5yZXBsYWNlKHRlLG5lKSxmdW5jdGlvbihlKXtyZXR1cm4tMTwoZS50ZXh0Q29udGVudHx8byhlKSkuaW5kZXhPZih0KX19KSxsYW5nOmxlKGZ1bmN0aW9uKG4pe3JldHVybiBWLnRlc3Qobnx8IiIpfHxzZS5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIituKSxuPW4ucmVwbGFjZSh0ZSxuZSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihlKXt2YXIgdDtkb3tpZih0PUU/ZS5sYW5nOmUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxlLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybih0PXQudG9Mb3dlckNhc2UoKSk9PT1ufHwwPT09dC5pbmRleE9mKG4rIi0iKX13aGlsZSgoZT1lLnBhcmVudE5vZGUpJiYxPT09ZS5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGUpe3ZhciB0PW4ubG9jYXRpb24mJm4ubG9jYXRpb24uaGFzaDtyZXR1cm4gdCYmdC5zbGljZSgxKT09PWUuaWR9LHJvb3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1hfSxmb2N1czpmdW5jdGlvbihlKXtyZXR1cm4gZT09PUMuYWN0aXZlRWxlbWVudCYmKCFDLmhhc0ZvY3VzfHxDLmhhc0ZvY3VzKCkpJiYhIShlLnR5cGV8fGUuaHJlZnx8fmUudGFiSW5kZXgpfSxlbmFibGVkOmdlKCExKSxkaXNhYmxlZDpnZSghMCksY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIWIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBKLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBRLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiJidXR0b24iPT09ZS50eXBlfHwiYnV0dG9uIj09PXR9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09ZS50eXBlJiYobnVsbD09KHQ9ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PXQudG9Mb3dlckNhc2UoKSl9LGZpcnN0OnZlKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDp2ZShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6dmUoZnVuY3Rpb24oZSx0LG4pe3JldHVybltuPDA/bit0Om5dfSksZXZlbjp2ZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDp2ZShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OnZlKGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDp0PG4/dDpuOzA8PS0tcjspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6dmUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47KytyPHQ7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0pLnBzZXVkb3MubnRoPWIucHNldWRvcy5lcSx7cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pYi5wc2V1ZG9zW2VdPWRlKGUpO2ZvcihlIGlue3N1Ym1pdDohMCxyZXNldDohMH0pYi5wc2V1ZG9zW2VdPWhlKGUpO2Z1bmN0aW9uIG1lKCl7fWZ1bmN0aW9uIHhlKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgscj0iIjt0PG47dCsrKXIrPWVbdF0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24gYmUocyxlLHQpe3ZhciB1PWUuZGlyLGw9ZS5uZXh0LGM9bHx8dSxmPXQmJiJwYXJlbnROb2RlIj09PWMscD1yKys7cmV0dXJuIGUuZmlyc3Q/ZnVuY3Rpb24oZSx0LG4pe3doaWxlKGU9ZVt1XSlpZigxPT09ZS5ub2RlVHlwZXx8ZilyZXR1cm4gcyhlLHQsbik7cmV0dXJuITF9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYT1bayxwXTtpZihuKXt3aGlsZShlPWVbdV0paWYoKDE9PT1lLm5vZGVUeXBlfHxmKSYmcyhlLHQsbikpcmV0dXJuITB9ZWxzZSB3aGlsZShlPWVbdV0paWYoMT09PWUubm9kZVR5cGV8fGYpaWYoaT0obz1lW1NdfHwoZVtTXT17fSkpW2UudW5pcXVlSURdfHwob1tlLnVuaXF1ZUlEXT17fSksbCYmbD09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSllPWVbdV18fGU7ZWxzZXtpZigocj1pW2NdKSYmclswXT09PWsmJnJbMV09PT1wKXJldHVybiBhWzJdPXJbMl07aWYoKGlbY109YSlbMl09cyhlLHQsbikpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHdlKGkpe3JldHVybiAxPGkubGVuZ3RoP2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1pLmxlbmd0aDt3aGlsZShyLS0paWYoIWlbcl0oZSx0LG4pKXJldHVybiExO3JldHVybiEwfTppWzBdfWZ1bmN0aW9uIFRlKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGE9W10scz0wLHU9ZS5sZW5ndGgsbD1udWxsIT10O3M8dTtzKyspKG89ZVtzXSkmJihuJiYhbihvLHIsaSl8fChhLnB1c2gobyksbCYmdC5wdXNoKHMpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gQ2UoZCxoLGcsdix5LGUpe3JldHVybiB2JiYhdltTXSYmKHY9Q2UodikpLHkmJiF5W1NdJiYoeT1DZSh5LGUpKSxsZShmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1bXSx1PVtdLGw9dC5sZW5ndGgsYz1lfHxmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7cisrKXNlKGUsdFtyXSxuKTtyZXR1cm4gbn0oaHx8IioiLG4ubm9kZVR5cGU/W25dOm4sW10pLGY9IWR8fCFlJiZoP2M6VGUoYyxzLGQsbixyKSxwPWc/eXx8KGU/ZDpsfHx2KT9bXTp0OmY7aWYoZyYmZyhmLHAsbixyKSx2KXtpPVRlKHAsdSksdihpLFtdLG4sciksbz1pLmxlbmd0aDt3aGlsZShvLS0pKGE9aVtvXSkmJihwW3Vbb11dPSEoZlt1W29dXT1hKSl9aWYoZSl7aWYoeXx8ZCl7aWYoeSl7aT1bXSxvPXAubGVuZ3RoO3doaWxlKG8tLSkoYT1wW29dKSYmaS5wdXNoKGZbb109YSk7eShudWxsLHA9W10saSxyKX1vPXAubGVuZ3RoO3doaWxlKG8tLSkoYT1wW29dKSYmLTE8KGk9eT9QKGUsYSk6c1tvXSkmJihlW2ldPSEodFtpXT1hKSl9fWVsc2UgcD1UZShwPT09dD9wLnNwbGljZShsLHAubGVuZ3RoKTpwKSx5P3kobnVsbCx0LHAscik6SC5hcHBseSh0LHApfSl9ZnVuY3Rpb24gRWUoZSl7Zm9yKHZhciBpLHQsbixyPWUubGVuZ3RoLG89Yi5yZWxhdGl2ZVtlWzBdLnR5cGVdLGE9b3x8Yi5yZWxhdGl2ZVsiICJdLHM9bz8xOjAsdT1iZShmdW5jdGlvbihlKXtyZXR1cm4gZT09PWl9LGEsITApLGw9YmUoZnVuY3Rpb24oZSl7cmV0dXJuLTE8UChpLGUpfSxhLCEwKSxjPVtmdW5jdGlvbihlLHQsbil7dmFyIHI9IW8mJihufHx0IT09dyl8fCgoaT10KS5ub2RlVHlwZT91KGUsdCxuKTpsKGUsdCxuKSk7cmV0dXJuIGk9bnVsbCxyfV07czxyO3MrKylpZih0PWIucmVsYXRpdmVbZVtzXS50eXBlXSljPVtiZSh3ZShjKSx0KV07ZWxzZXtpZigodD1iLmZpbHRlcltlW3NdLnR5cGVdLmFwcGx5KG51bGwsZVtzXS5tYXRjaGVzKSlbU10pe2ZvcihuPSsrcztuPHI7bisrKWlmKGIucmVsYXRpdmVbZVtuXS50eXBlXSlicmVhaztyZXR1cm4gQ2UoMTxzJiZ3ZShjKSwxPHMmJnhlKGUuc2xpY2UoMCxzLTEpLmNvbmNhdCh7dmFsdWU6IiAiPT09ZVtzLTJdLnR5cGU/IioiOiIifSkpLnJlcGxhY2UoJCwiJDEiKSx0LHM8biYmRWUoZS5zbGljZShzLG4pKSxuPHImJkVlKGU9ZS5zbGljZShuKSksbjxyJiZ4ZShlKSl9Yy5wdXNoKHQpfXJldHVybiB3ZShjKX1yZXR1cm4gbWUucHJvdG90eXBlPWIuZmlsdGVycz1iLnBzZXVkb3MsYi5zZXRGaWx0ZXJzPW5ldyBtZSxoPXNlLnRva2VuaXplPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYSxzLHUsbD14W2UrIiAiXTtpZihsKXJldHVybiB0PzA6bC5zbGljZSgwKTthPWUscz1bXSx1PWIucHJlRmlsdGVyO3doaWxlKGEpe2ZvcihvIGluIG4mJiEocj1fLmV4ZWMoYSkpfHwociYmKGE9YS5zbGljZShyWzBdLmxlbmd0aCl8fGEpLHMucHVzaChpPVtdKSksbj0hMSwocj16LmV4ZWMoYSkpJiYobj1yLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6clswXS5yZXBsYWNlKCQsIiAiKX0pLGE9YS5zbGljZShuLmxlbmd0aCkpLGIuZmlsdGVyKSEocj1HW29dLmV4ZWMoYSkpfHx1W29dJiYhKHI9dVtvXShyKSl8fChuPXIuc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTpvLG1hdGNoZXM6cn0pLGE9YS5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P2EubGVuZ3RoOmE/c2UuZXJyb3IoZSk6eChlLHMpLnNsaWNlKDApfSxmPXNlLmNvbXBpbGU9ZnVuY3Rpb24oZSx0KXt2YXIgbix2LHksbSx4LHIsaT1bXSxvPVtdLGE9QVtlKyIgIl07aWYoIWEpe3R8fCh0PWgoZSkpLG49dC5sZW5ndGg7d2hpbGUobi0tKShhPUVlKHRbbl0pKVtTXT9pLnB1c2goYSk6by5wdXNoKGEpOyhhPUEoZSwodj1vLG09MDwoeT1pKS5sZW5ndGgseD0wPHYubGVuZ3RoLHI9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdT0wLGw9IjAiLGM9ZSYmW10sZj1bXSxwPXcsZD1lfHx4JiZiLmZpbmQuVEFHKCIqIixpKSxoPWsrPW51bGw9PXA/MTpNYXRoLnJhbmRvbSgpfHwuMSxnPWQubGVuZ3RoO2ZvcihpJiYodz10PT1DfHx0fHxpKTtsIT09ZyYmbnVsbCE9KG89ZFtsXSk7bCsrKXtpZih4JiZvKXthPTAsdHx8by5vd25lckRvY3VtZW50PT1DfHwoVChvKSxuPSFFKTt3aGlsZShzPXZbYSsrXSlpZihzKG8sdHx8QyxuKSl7ci5wdXNoKG8pO2JyZWFrfWkmJihrPWgpfW0mJigobz0hcyYmbykmJnUtLSxlJiZjLnB1c2gobykpfWlmKHUrPWwsbSYmbCE9PXUpe2E9MDt3aGlsZShzPXlbYSsrXSlzKGMsZix0LG4pO2lmKGUpe2lmKDA8dSl3aGlsZShsLS0pY1tsXXx8ZltsXXx8KGZbbF09cS5jYWxsKHIpKTtmPVRlKGYpfUguYXBwbHkocixmKSxpJiYhZSYmMDxmLmxlbmd0aCYmMTx1K3kubGVuZ3RoJiZzZS51bmlxdWVTb3J0KHIpfXJldHVybiBpJiYoaz1oLHc9cCksY30sbT9sZShyKTpyKSkpLnNlbGVjdG9yPWV9cmV0dXJuIGF9LGc9c2Uuc2VsZWN0PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYSxzLHUsbD0iZnVuY3Rpb24iPT10eXBlb2YgZSYmZSxjPSFyJiZoKGU9bC5zZWxlY3Rvcnx8ZSk7aWYobj1ufHxbXSwxPT09Yy5sZW5ndGgpe2lmKDI8KG89Y1swXT1jWzBdLnNsaWNlKDApKS5sZW5ndGgmJiJJRCI9PT0oYT1vWzBdKS50eXBlJiY5PT09dC5ub2RlVHlwZSYmRSYmYi5yZWxhdGl2ZVtvWzFdLnR5cGVdKXtpZighKHQ9KGIuZmluZC5JRChhLm1hdGNoZXNbMF0ucmVwbGFjZSh0ZSxuZSksdCl8fFtdKVswXSkpcmV0dXJuIG47bCYmKHQ9dC5wYXJlbnROb2RlKSxlPWUuc2xpY2Uoby5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9aT1HLm5lZWRzQ29udGV4dC50ZXN0KGUpPzA6by5sZW5ndGg7d2hpbGUoaS0tKXtpZihhPW9baV0sYi5yZWxhdGl2ZVtzPWEudHlwZV0pYnJlYWs7aWYoKHU9Yi5maW5kW3NdKSYmKHI9dShhLm1hdGNoZXNbMF0ucmVwbGFjZSh0ZSxuZSksZWUudGVzdChvWzBdLnR5cGUpJiZ5ZSh0LnBhcmVudE5vZGUpfHx0KSkpe2lmKG8uc3BsaWNlKGksMSksIShlPXIubGVuZ3RoJiZ4ZShvKSkpcmV0dXJuIEguYXBwbHkobixyKSxuO2JyZWFrfX19cmV0dXJuKGx8fGYoZSxjKSkocix0LCFFLG4sIXR8fGVlLnRlc3QoZSkmJnllKHQucGFyZW50Tm9kZSl8fHQpLG59LGQuc29ydFN0YWJsZT1TLnNwbGl0KCIiKS5zb3J0KEQpLmpvaW4oIiIpPT09UyxkLmRldGVjdER1cGxpY2F0ZXM9ISFsLFQoKSxkLnNvcnREZXRhY2hlZD1jZShmdW5jdGlvbihlKXtyZXR1cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKEMuY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSl9KSxjZShmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLCIjIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKX0pfHxmZSgidHlwZXxocmVmfGhlaWdodHx3aWR0aCIsZnVuY3Rpb24oZSx0LG4pe2lmKCFuKXJldHVybiBlLmdldEF0dHJpYnV0ZSh0LCJ0eXBlIj09PXQudG9Mb3dlckNhc2UoKT8xOjIpfSksZC5hdHRyaWJ1dGVzJiZjZShmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxpbnB1dC8+IixlLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLCIiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgidmFsdWUiKX0pfHxmZSgidmFsdWUiLGZ1bmN0aW9uKGUsdCxuKXtpZighbiYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4gZS5kZWZhdWx0VmFsdWV9KSxjZShmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KXx8ZmUoUixmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoIW4pcmV0dXJuITA9PT1lW3RdP3QudG9Mb3dlckNhc2UoKToocj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9KSxzZX0oQyk7Uy5maW5kPWQsUy5leHByPWQuc2VsZWN0b3JzLFMuZXhwclsiOiJdPVMuZXhwci5wc2V1ZG9zLFMudW5pcXVlU29ydD1TLnVuaXF1ZT1kLnVuaXF1ZVNvcnQsUy50ZXh0PWQuZ2V0VGV4dCxTLmlzWE1MRG9jPWQuaXNYTUwsUy5jb250YWlucz1kLmNvbnRhaW5zLFMuZXNjYXBlU2VsZWN0b3I9ZC5lc2NhcGU7dmFyIGg9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdLGk9dm9pZCAwIT09bjt3aGlsZSgoZT1lW3RdKSYmOSE9PWUubm9kZVR5cGUpaWYoMT09PWUubm9kZVR5cGUpe2lmKGkmJlMoZSkuaXMobikpYnJlYWs7ci5wdXNoKGUpfXJldHVybiByfSxUPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdO2U7ZT1lLm5leHRTaWJsaW5nKTE9PT1lLm5vZGVUeXBlJiZlIT09dCYmbi5wdXNoKGUpO3JldHVybiBufSxrPVMuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQ7ZnVuY3Rpb24gQShlLHQpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10LnRvTG93ZXJDYXNlKCl9dmFyIE49L148KFthLXpdW15cL1wwPjpceDIwXHRcclxuXGZdKilbXHgyMFx0XHJcblxmXSpcLz8+KD86PFwvXDE+fCkkL2k7ZnVuY3Rpb24gRChlLG4scil7cmV0dXJuIG0obik/Uy5ncmVwKGUsZnVuY3Rpb24oZSx0KXtyZXR1cm4hIW4uY2FsbChlLHQsZSkhPT1yfSk6bi5ub2RlVHlwZT9TLmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PW4hPT1yfSk6InN0cmluZyIhPXR5cGVvZiBuP1MuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybi0xPGkuY2FsbChuLGUpIT09cn0pOlMuZmlsdGVyKG4sZSxyKX1TLmZpbHRlcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dFswXTtyZXR1cm4gbiYmKGU9Ijpub3QoIitlKyIpIiksMT09PXQubGVuZ3RoJiYxPT09ci5ub2RlVHlwZT9TLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsZSk/W3JdOltdOlMuZmluZC5tYXRjaGVzKGUsUy5ncmVwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfSkpfSxTLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihlKXt2YXIgdCxuLHI9dGhpcy5sZW5ndGgsaT10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gdGhpcy5wdXNoU3RhY2soUyhlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO3Q8cjt0KyspaWYoUy5jb250YWlucyhpW3RdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihuPXRoaXMucHVzaFN0YWNrKFtdKSx0PTA7dDxyO3QrKylTLmZpbmQoZSxpW3RdLG4pO3JldHVybiAxPHI/Uy51bmlxdWVTb3J0KG4pOm59LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRCh0aGlzLGV8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soRCh0aGlzLGV8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhRCh0aGlzLCJzdHJpbmciPT10eXBlb2YgZSYmay50ZXN0KGUpP1MoZSk6ZXx8W10sITEpLmxlbmd0aH19KTt2YXIgaixxPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKykpJC87KFMuZm4uaW5pdD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaTtpZighZSlyZXR1cm4gdGhpcztpZihuPW58fGosInN0cmluZyI9PXR5cGVvZiBlKXtpZighKHI9IjwiPT09ZVswXSYmIj4iPT09ZVtlLmxlbmd0aC0xXSYmMzw9ZS5sZW5ndGg/W251bGwsZSxudWxsXTpxLmV4ZWMoZSkpfHwhclsxXSYmdClyZXR1cm4hdHx8dC5qcXVlcnk/KHR8fG4pLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3Rvcih0KS5maW5kKGUpO2lmKHJbMV0pe2lmKHQ9dCBpbnN0YW5jZW9mIFM/dFswXTp0LFMubWVyZ2UodGhpcyxTLnBhcnNlSFRNTChyWzFdLHQmJnQubm9kZVR5cGU/dC5vd25lckRvY3VtZW50fHx0OkUsITApKSxOLnRlc3QoclsxXSkmJlMuaXNQbGFpbk9iamVjdCh0KSlmb3IociBpbiB0KW0odGhpc1tyXSk/dGhpc1tyXSh0W3JdKTp0aGlzLmF0dHIocix0W3JdKTtyZXR1cm4gdGhpc31yZXR1cm4oaT1FLmdldEVsZW1lbnRCeUlkKHJbMl0pKSYmKHRoaXNbMF09aSx0aGlzLmxlbmd0aD0xKSx0aGlzfXJldHVybiBlLm5vZGVUeXBlPyh0aGlzWzBdPWUsdGhpcy5sZW5ndGg9MSx0aGlzKTptKGUpP3ZvaWQgMCE9PW4ucmVhZHk/bi5yZWFkeShlKTplKFMpOlMubWFrZUFycmF5KGUsdGhpcyl9KS5wcm90b3R5cGU9Uy5mbixqPVMoRSk7dmFyIEw9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sSD17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmdW5jdGlvbiBPKGUsdCl7d2hpbGUoKGU9ZVt0XSkmJjEhPT1lLm5vZGVUeXBlKTtyZXR1cm4gZX1TLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGUpe3ZhciB0PVMoZSx0aGlzKSxuPXQubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bjtlKyspaWYoUy5jb250YWlucyh0aGlzLHRbZV0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10aGlzLmxlbmd0aCxvPVtdLGE9InN0cmluZyIhPXR5cGVvZiBlJiZTKGUpO2lmKCFrLnRlc3QoZSkpZm9yKDtyPGk7cisrKWZvcihuPXRoaXNbcl07biYmbiE9PXQ7bj1uLnBhcmVudE5vZGUpaWYobi5ub2RlVHlwZTwxMSYmKGE/LTE8YS5pbmRleChuKToxPT09bi5ub2RlVHlwZSYmUy5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKSl7by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjaygxPG8ubGVuZ3RoP1MudW5pcXVlU29ydChvKTpvKX0saW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP2kuY2FsbChTKGUpLHRoaXNbMF0pOmkuY2FsbCh0aGlzLGUuanF1ZXJ5P2VbMF06ZSk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy51bmlxdWVTb3J0KFMubWVyZ2UodGhpcy5nZXQoKSxTKGUsdCkpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pLFMuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmMTEhPT10Lm5vZGVUeXBlP3Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihlKXtyZXR1cm4gaChlLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGgoZSwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIE8oZSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihlKXtyZXR1cm4gTyhlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihlKXtyZXR1cm4gaChlLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBoKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBoKGUsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gaChlLCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbihlKXtyZXR1cm4gVCgoZS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxlKX0sY2hpbGRyZW46ZnVuY3Rpb24oZSl7cmV0dXJuIFQoZS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUuY29udGVudERvY3VtZW50JiZyKGUuY29udGVudERvY3VtZW50KT9lLmNvbnRlbnREb2N1bWVudDooQShlLCJ0ZW1wbGF0ZSIpJiYoZT1lLmNvbnRlbnR8fGUpLFMubWVyZ2UoW10sZS5jaGlsZE5vZGVzKSl9fSxmdW5jdGlvbihyLGkpe1MuZm5bcl09ZnVuY3Rpb24oZSx0KXt2YXIgbj1TLm1hcCh0aGlzLGksZSk7cmV0dXJuIlVudGlsIiE9PXIuc2xpY2UoLTUpJiYodD1lKSx0JiYic3RyaW5nIj09dHlwZW9mIHQmJihuPVMuZmlsdGVyKHQsbikpLDE8dGhpcy5sZW5ndGgmJihIW3JdfHxTLnVuaXF1ZVNvcnQobiksTC50ZXN0KHIpJiZuLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2sobil9fSk7dmFyIFA9L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiBSKGUpe3JldHVybiBlfWZ1bmN0aW9uIE0oZSl7dGhyb3cgZX1mdW5jdGlvbiBJKGUsdCxuLHIpe3ZhciBpO3RyeXtlJiZtKGk9ZS5wcm9taXNlKT9pLmNhbGwoZSkuZG9uZSh0KS5mYWlsKG4pOmUmJm0oaT1lLnRoZW4pP2kuY2FsbChlLHQsbik6dC5hcHBseSh2b2lkIDAsW2VdLnNsaWNlKHIpKX1jYXRjaChlKXtuLmFwcGx5KHZvaWQgMCxbZV0pfX1TLkNhbGxiYWNrcz1mdW5jdGlvbihyKXt2YXIgZSxuO3I9InN0cmluZyI9PXR5cGVvZiByPyhlPXIsbj17fSxTLmVhY2goZS5tYXRjaChQKXx8W10sZnVuY3Rpb24oZSx0KXtuW3RdPSEwfSksbik6Uy5leHRlbmQoe30scik7dmFyIGksdCxvLGEscz1bXSx1PVtdLGw9LTEsYz1mdW5jdGlvbigpe2ZvcihhPWF8fHIub25jZSxvPWk9ITA7dS5sZW5ndGg7bD0tMSl7dD11LnNoaWZ0KCk7d2hpbGUoKytsPHMubGVuZ3RoKSExPT09c1tsXS5hcHBseSh0WzBdLHRbMV0pJiZyLnN0b3BPbkZhbHNlJiYobD1zLmxlbmd0aCx0PSExKX1yLm1lbW9yeXx8KHQ9ITEpLGk9ITEsYSYmKHM9dD9bXToiIil9LGY9e2FkZDpmdW5jdGlvbigpe3JldHVybiBzJiYodCYmIWkmJihsPXMubGVuZ3RoLTEsdS5wdXNoKHQpKSxmdW5jdGlvbiBuKGUpe1MuZWFjaChlLGZ1bmN0aW9uKGUsdCl7bSh0KT9yLnVuaXF1ZSYmZi5oYXModCl8fHMucHVzaCh0KTp0JiZ0Lmxlbmd0aCYmInN0cmluZyIhPT13KHQpJiZuKHQpfSl9KGFyZ3VtZW50cyksdCYmIWkmJmMoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIFMuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2YXIgbjt3aGlsZSgtMTwobj1TLmluQXJyYXkodCxzLG4pKSlzLnNwbGljZShuLDEpLG48PWwmJmwtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gZT8tMTxTLmluQXJyYXkoZSxzKTowPHMubGVuZ3RofSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBzJiYocz1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBhPXU9W10scz10PSIiLHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIXN9LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gYT11PVtdLHR8fGl8fChzPXQ9IiIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhYX0sZmlyZVdpdGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXx8KHQ9W2UsKHQ9dHx8W10pLnNsaWNlP3Quc2xpY2UoKTp0XSx1LnB1c2godCksaXx8YygpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFvfX07cmV0dXJuIGZ9LFMuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihlKXt2YXIgbz1bWyJub3RpZnkiLCJwcm9ncmVzcyIsUy5DYWxsYmFja3MoIm1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJtZW1vcnkiKSwyXSxbInJlc29sdmUiLCJkb25lIixTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwwLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksUy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMSwicmVqZWN0ZWQiXV0saT0icGVuZGluZyIsYT17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gaX0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIHMuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSwiY2F0Y2giOmZ1bmN0aW9uKGUpe3JldHVybiBhLnRoZW4obnVsbCxlKX0scGlwZTpmdW5jdGlvbigpe3ZhciBpPWFyZ3VtZW50cztyZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihyKXtTLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBuPW0oaVt0WzRdXSkmJmlbdFs0XV07c1t0WzFdXShmdW5jdGlvbigpe3ZhciBlPW4mJm4uYXBwbHkodGhpcyxhcmd1bWVudHMpO2UmJm0oZS5wcm9taXNlKT9lLnByb21pc2UoKS5wcm9ncmVzcyhyLm5vdGlmeSkuZG9uZShyLnJlc29sdmUpLmZhaWwoci5yZWplY3QpOnJbdFswXSsiV2l0aCJdKHRoaXMsbj9bZV06YXJndW1lbnRzKX0pfSksaT1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKHQsbixyKXt2YXIgdT0wO2Z1bmN0aW9uIGwoaSxvLGEscyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cyxlPWZ1bmN0aW9uKCl7dmFyIGUsdDtpZighKGk8dSkpe2lmKChlPWEuYXBwbHkobixyKSk9PT1vLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTt0PWUmJigib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlKSYmZS50aGVuLG0odCk/cz90LmNhbGwoZSxsKHUsbyxSLHMpLGwodSxvLE0scykpOih1KyssdC5jYWxsKGUsbCh1LG8sUixzKSxsKHUsbyxNLHMpLGwodSxvLFIsby5ub3RpZnlXaXRoKSkpOihhIT09UiYmKG49dm9pZCAwLHI9W2VdKSwoc3x8by5yZXNvbHZlV2l0aCkobixyKSl9fSx0PXM/ZTpmdW5jdGlvbigpe3RyeXtlKCl9Y2F0Y2goZSl7Uy5EZWZlcnJlZC5leGNlcHRpb25Ib29rJiZTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soZSx0LnN0YWNrVHJhY2UpLHU8PWkrMSYmKGEhPT1NJiYobj12b2lkIDAscj1bZV0pLG8ucmVqZWN0V2l0aChuLHIpKX19O2k/dCgpOihTLkRlZmVycmVkLmdldFN0YWNrSG9vayYmKHQuc3RhY2tUcmFjZT1TLkRlZmVycmVkLmdldFN0YWNrSG9vaygpKSxDLnNldFRpbWVvdXQodCkpfX1yZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihlKXtvWzBdWzNdLmFkZChsKDAsZSxtKHIpP3I6UixlLm5vdGlmeVdpdGgpKSxvWzFdWzNdLmFkZChsKDAsZSxtKHQpP3Q6UikpLG9bMl1bM10uYWRkKGwoMCxlLG0obik/bjpNKSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWU/Uy5leHRlbmQoZSxhKTphfX0scz17fTtyZXR1cm4gUy5lYWNoKG8sZnVuY3Rpb24oZSx0KXt2YXIgbj10WzJdLHI9dFs1XTthW3RbMV1dPW4uYWRkLHImJm4uYWRkKGZ1bmN0aW9uKCl7aT1yfSxvWzMtZV1bMl0uZGlzYWJsZSxvWzMtZV1bM10uZGlzYWJsZSxvWzBdWzJdLmxvY2ssb1swXVszXS5sb2NrKSxuLmFkZCh0WzNdLmZpcmUpLHNbdFswXV09ZnVuY3Rpb24oKXtyZXR1cm4gc1t0WzBdKyJXaXRoIl0odGhpcz09PXM/dm9pZCAwOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxzW3RbMF0rIldpdGgiXT1uLmZpcmVXaXRofSksYS5wcm9taXNlKHMpLGUmJmUuY2FsbChzLHMpLHN9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCx0PW4scj1BcnJheSh0KSxpPXMuY2FsbChhcmd1bWVudHMpLG89Uy5EZWZlcnJlZCgpLGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JbdF09dGhpcyxpW3RdPTE8YXJndW1lbnRzLmxlbmd0aD9zLmNhbGwoYXJndW1lbnRzKTplLC0tbnx8by5yZXNvbHZlV2l0aChyLGkpfX07aWYobjw9MSYmKEkoZSxvLmRvbmUoYSh0KSkucmVzb2x2ZSxvLnJlamVjdCwhbiksInBlbmRpbmciPT09by5zdGF0ZSgpfHxtKGlbdF0mJmlbdF0udGhlbikpKXJldHVybiBvLnRoZW4oKTt3aGlsZSh0LS0pSShpW3RdLGEodCksby5yZWplY3QpO3JldHVybiBvLnByb21pc2UoKX19KTt2YXIgVz0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24oZSx0KXtDLmNvbnNvbGUmJkMuY29uc29sZS53YXJuJiZlJiZXLnRlc3QoZS5uYW1lKSYmQy5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIrZS5tZXNzYWdlLGUuc3RhY2ssdCl9LFMucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24oZSl7Qy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgZX0pfTt2YXIgRj1TLkRlZmVycmVkKCk7ZnVuY3Rpb24gQigpe0UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiksQy5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixCKSxTLnJlYWR5KCl9Uy5mbi5yZWFkeT1mdW5jdGlvbihlKXtyZXR1cm4gRi50aGVuKGUpWyJjYXRjaCJdKGZ1bmN0aW9uKGUpe1MucmVhZHlFeGNlcHRpb24oZSl9KSx0aGlzfSxTLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbihlKXsoITA9PT1lPy0tUy5yZWFkeVdhaXQ6Uy5pc1JlYWR5KXx8KFMuaXNSZWFkeT0hMCkhPT1lJiYwPC0tUy5yZWFkeVdhaXR8fEYucmVzb2x2ZVdpdGgoRSxbU10pfX0pLFMucmVhZHkudGhlbj1GLnRoZW4sImNvbXBsZXRlIj09PUUucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09RS5yZWFkeVN0YXRlJiYhRS5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/Qy5zZXRUaW1lb3V0KFMucmVhZHkpOihFLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIpLEMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsQikpO3ZhciAkPWZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEpe3ZhciBzPTAsdT1lLmxlbmd0aCxsPW51bGw9PW47aWYoIm9iamVjdCI9PT13KG4pKWZvcihzIGluIGk9ITAsbikkKGUsdCxzLG5bc10sITAsbyxhKTtlbHNlIGlmKHZvaWQgMCE9PXImJihpPSEwLG0ocil8fChhPSEwKSxsJiYoYT8odC5jYWxsKGUsciksdD1udWxsKToobD10LHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBsLmNhbGwoUyhlKSxuKX0pKSx0KSlmb3IoO3M8dTtzKyspdChlW3NdLG4sYT9yOnIuY2FsbChlW3NdLHMsdChlW3NdLG4pKSk7cmV0dXJuIGk/ZTpsP3QuY2FsbChlKTp1P3QoZVswXSxuKTpvfSxfPS9eLW1zLS8sej0vLShbYS16XSkvZztmdW5jdGlvbiBVKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBYKGUpe3JldHVybiBlLnJlcGxhY2UoXywibXMtIikucmVwbGFjZSh6LFUpfXZhciBWPWZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZXx8OT09PWUubm9kZVR5cGV8fCErZS5ub2RlVHlwZX07ZnVuY3Rpb24gRygpe3RoaXMuZXhwYW5kbz1TLmV4cGFuZG8rRy51aWQrK31HLnVpZD0xLEcucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHR8fCh0PXt9LFYoZSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT10Ok9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHRoaXMuZXhwYW5kbyx7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KSkpLHR9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT10aGlzLmNhY2hlKGUpO2lmKCJzdHJpbmciPT10eXBlb2YgdClpW1godCldPW47ZWxzZSBmb3IociBpbiB0KWlbWChyKV09dFtyXTtyZXR1cm4gaX0sZ2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5jYWNoZShlKTplW3RoaXMuZXhwYW5kb10mJmVbdGhpcy5leHBhbmRvXVtYKHQpXX0sYWNjZXNzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dHx8dCYmInN0cmluZyI9PXR5cGVvZiB0JiZ2b2lkIDA9PT1uP3RoaXMuZ2V0KGUsdCk6KHRoaXMuc2V0KGUsdCxuKSx2b2lkIDAhPT1uP246dCl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9ZVt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PXIpe2lmKHZvaWQgMCE9PXQpe249KHQ9QXJyYXkuaXNBcnJheSh0KT90Lm1hcChYKToodD1YKHQpKWluIHI/W3RdOnQubWF0Y2goUCl8fFtdKS5sZW5ndGg7d2hpbGUobi0tKWRlbGV0ZSByW3Rbbl1dfSh2b2lkIDA9PT10fHxTLmlzRW1wdHlPYmplY3QocikpJiYoZS5ub2RlVHlwZT9lW3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSBlW3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHZvaWQgMCE9PXQmJiFTLmlzRW1wdHlPYmplY3QodCl9fTt2YXIgWT1uZXcgRyxRPW5ldyBHLEo9L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxLPS9bQS1aXS9nO2Z1bmN0aW9uIFooZSx0LG4pe3ZhciByLGk7aWYodm9pZCAwPT09biYmMT09PWUubm9kZVR5cGUpaWYocj0iZGF0YS0iK3QucmVwbGFjZShLLCItJCYiKS50b0xvd2VyQ2FzZSgpLCJzdHJpbmciPT10eXBlb2Yobj1lLmdldEF0dHJpYnV0ZShyKSkpe3RyeXtuPSJ0cnVlIj09PShpPW4pfHwiZmFsc2UiIT09aSYmKCJudWxsIj09PWk/bnVsbDppPT09K2krIiI/K2k6Si50ZXN0KGkpP0pTT04ucGFyc2UoaSk6aSl9Y2F0Y2goZSl7fVEuc2V0KGUsdCxuKX1lbHNlIG49dm9pZCAwO3JldHVybiBufVMuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiBRLmhhc0RhdGEoZSl8fFkuaGFzRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFEuYWNjZXNzKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe1EucmVtb3ZlKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gWS5hY2Nlc3MoZSx0LG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe1kucmVtb3ZlKGUsdCl9fSksUy5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24obixlKXt2YXIgdCxyLGksbz10aGlzWzBdLGE9byYmby5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PW4pe2lmKHRoaXMubGVuZ3RoJiYoaT1RLmdldChvKSwxPT09by5ub2RlVHlwZSYmIVkuZ2V0KG8sImhhc0RhdGFBdHRycyIpKSl7dD1hLmxlbmd0aDt3aGlsZSh0LS0pYVt0XSYmMD09PShyPWFbdF0ubmFtZSkuaW5kZXhPZigiZGF0YS0iKSYmKHI9WChyLnNsaWNlKDUpKSxaKG8scixpW3JdKSk7WS5zZXQobywiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGl9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBuP3RoaXMuZWFjaChmdW5jdGlvbigpe1Euc2V0KHRoaXMsbil9KTokKHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ7aWYobyYmdm9pZCAwPT09ZSlyZXR1cm4gdm9pZCAwIT09KHQ9US5nZXQobyxuKSk/dDp2b2lkIDAhPT0odD1aKG8sbikpP3Q6dm9pZCAwO3RoaXMuZWFjaChmdW5jdGlvbigpe1Euc2V0KHRoaXMsbixlKX0pfSxudWxsLGUsMTxhcmd1bWVudHMubGVuZ3RoLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtRLnJlbW92ZSh0aGlzLGUpfSl9fSksUy5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZihlKXJldHVybiB0PSh0fHwiZngiKSsicXVldWUiLHI9WS5nZXQoZSx0KSxuJiYoIXJ8fEFycmF5LmlzQXJyYXkobik/cj1ZLmFjY2VzcyhlLHQsUy5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24oZSx0KXt0PXR8fCJmeCI7dmFyIG49Uy5xdWV1ZShlLHQpLHI9bi5sZW5ndGgsaT1uLnNoaWZ0KCksbz1TLl9xdWV1ZUhvb2tzKGUsdCk7ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKCJmeCI9PT10JiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLGZ1bmN0aW9uKCl7Uy5kZXF1ZXVlKGUsdCl9LG8pKSwhciYmbyYmby5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCsicXVldWVIb29rcyI7cmV0dXJuIFkuZ2V0KGUsbil8fFkuYWNjZXNzKGUsbix7ZW1wdHk6Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7WS5yZW1vdmUoZSxbdCsicXVldWUiLG5dKX0pfSl9fSksUy5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKHQsbil7dmFyIGU9MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihuPXQsdD0iZngiLGUtLSksYXJndW1lbnRzLmxlbmd0aDxlP1MucXVldWUodGhpc1swXSx0KTp2b2lkIDA9PT1uP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Uy5xdWV1ZSh0aGlzLHQsbik7Uy5fcXVldWVIb29rcyh0aGlzLHQpLCJmeCI9PT10JiYiaW5wcm9ncmVzcyIhPT1lWzBdJiZTLmRlcXVldWUodGhpcyx0KX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmRlcXVldWUodGhpcyxlKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnF1ZXVlKGV8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0xLGk9Uy5EZWZlcnJlZCgpLG89dGhpcyxhPXRoaXMubGVuZ3RoLHM9ZnVuY3Rpb24oKXstLXJ8fGkucmVzb2x2ZVdpdGgobyxbb10pfTsic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLGU9ZXx8ImZ4Ijt3aGlsZShhLS0pKG49WS5nZXQob1thXSxlKyJxdWV1ZUhvb2tzIikpJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKHMpKTtyZXR1cm4gcygpLGkucHJvbWlzZSh0KX19KTt2YXIgZWU9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsdGU9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK2VlKyIpKFthLXolXSopJCIsImkiKSxuZT1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLHJlPUUuZG9jdW1lbnRFbGVtZW50LGllPWZ1bmN0aW9uKGUpe3JldHVybiBTLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKX0sb2U9e2NvbXBvc2VkOiEwfTtyZS5nZXRSb290Tm9kZSYmKGllPWZ1bmN0aW9uKGUpe3JldHVybiBTLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKXx8ZS5nZXRSb290Tm9kZShvZSk9PT1lLm93bmVyRG9jdW1lbnR9KTt2YXIgYWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ibm9uZSI9PT0oZT10fHxlKS5zdHlsZS5kaXNwbGF5fHwiIj09PWUuc3R5bGUuZGlzcGxheSYmaWUoZSkmJiJub25lIj09PVMuY3NzKGUsImRpc3BsYXkiKX07ZnVuY3Rpb24gc2UoZSx0LG4scil7dmFyIGksbyxhPTIwLHM9cj9mdW5jdGlvbigpe3JldHVybiByLmN1cigpfTpmdW5jdGlvbigpe3JldHVybiBTLmNzcyhlLHQsIiIpfSx1PXMoKSxsPW4mJm5bM118fChTLmNzc051bWJlclt0XT8iIjoicHgiKSxjPWUubm9kZVR5cGUmJihTLmNzc051bWJlclt0XXx8InB4IiE9PWwmJit1KSYmdGUuZXhlYyhTLmNzcyhlLHQpKTtpZihjJiZjWzNdIT09bCl7dS89MixsPWx8fGNbM10sYz0rdXx8MTt3aGlsZShhLS0pUy5zdHlsZShlLHQsYytsKSwoMS1vKSooMS0obz1zKCkvdXx8LjUpKTw9MCYmKGE9MCksYy89bztjKj0yLFMuc3R5bGUoZSx0LGMrbCksbj1ufHxbXX1yZXR1cm4gbiYmKGM9K2N8fCt1fHwwLGk9blsxXT9jKyhuWzFdKzEpKm5bMl06K25bMl0sciYmKHIudW5pdD1sLHIuc3RhcnQ9YyxyLmVuZD1pKSksaX12YXIgdWU9e307ZnVuY3Rpb24gbGUoZSx0KXtmb3IodmFyIG4scixpLG8sYSxzLHUsbD1bXSxjPTAsZj1lLmxlbmd0aDtjPGY7YysrKShyPWVbY10pLnN0eWxlJiYobj1yLnN0eWxlLmRpc3BsYXksdD8oIm5vbmUiPT09biYmKGxbY109WS5nZXQociwiZGlzcGxheSIpfHxudWxsLGxbY118fChyLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PXIuc3R5bGUuZGlzcGxheSYmYWUocikmJihsW2NdPSh1PWE9bz12b2lkIDAsYT0oaT1yKS5vd25lckRvY3VtZW50LHM9aS5ub2RlTmFtZSwodT11ZVtzXSl8fChvPWEuYm9keS5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQocykpLHU9Uy5jc3MobywiZGlzcGxheSIpLG8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKSwibm9uZSI9PT11JiYodT0iYmxvY2siKSx1ZVtzXT11KSkpKToibm9uZSIhPT1uJiYobFtjXT0ibm9uZSIsWS5zZXQociwiZGlzcGxheSIsbikpKTtmb3IoYz0wO2M8ZjtjKyspbnVsbCE9bFtjXSYmKGVbY10uc3R5bGUuZGlzcGxheT1sW2NdKTtyZXR1cm4gZX1TLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBsZSh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBsZSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGU/ZT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXthZSh0aGlzKT9TKHRoaXMpLnNob3coKTpTKHRoaXMpLmhpZGUoKX0pfX0pO3ZhciBjZSxmZSxwZT0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxkZT0vPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKikvaSxoZT0vXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2k7Y2U9RS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkuYXBwZW5kQ2hpbGQoRS5jcmVhdGVFbGVtZW50KCJkaXYiKSksKGZlPUUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxmZS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksZmUuc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLGNlLmFwcGVuZENoaWxkKGZlKSx5LmNoZWNrQ2xvbmU9Y2UuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGNlLmlubmVySFRNTD0iPHRleHRhcmVhPng8L3RleHRhcmVhPiIseS5ub0Nsb25lQ2hlY2tlZD0hIWNlLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZSxjZS5pbm5lckhUTUw9IjxvcHRpb24+PC9vcHRpb24+Iix5Lm9wdGlvbj0hIWNlLmxhc3RDaGlsZDt2YXIgZ2U9e3RoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtmdW5jdGlvbiB2ZShlLHQpe3ZhciBuO3JldHVybiBuPSJ1bmRlZmluZWQiIT10eXBlb2YgZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHR8fCIqIik6InVuZGVmaW5lZCIhPXR5cGVvZiBlLnF1ZXJ5U2VsZWN0b3JBbGw/ZS5xdWVyeVNlbGVjdG9yQWxsKHR8fCIqIik6W10sdm9pZCAwPT09dHx8dCYmQShlLHQpP1MubWVyZ2UoW2VdLG4pOm59ZnVuY3Rpb24geWUoZSx0KXtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspWS5zZXQoZVtuXSwiZ2xvYmFsRXZhbCIsIXR8fFkuZ2V0KHRbbl0sImdsb2JhbEV2YWwiKSl9Z2UudGJvZHk9Z2UudGZvb3Q9Z2UuY29sZ3JvdXA9Z2UuY2FwdGlvbj1nZS50aGVhZCxnZS50aD1nZS50ZCx5Lm9wdGlvbnx8KGdlLm9wdGdyb3VwPWdlLm9wdGlvbj1bMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdKTt2YXIgbWU9Lzx8JiM/XHcrOy87ZnVuY3Rpb24geGUoZSx0LG4scixpKXtmb3IodmFyIG8sYSxzLHUsbCxjLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkscD1bXSxkPTAsaD1lLmxlbmd0aDtkPGg7ZCsrKWlmKChvPWVbZF0pfHwwPT09bylpZigib2JqZWN0Ij09PXcobykpUy5tZXJnZShwLG8ubm9kZVR5cGU/W29dOm8pO2Vsc2UgaWYobWUudGVzdChvKSl7YT1hfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudCgiZGl2IikpLHM9KGRlLmV4ZWMobyl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1nZVtzXXx8Z2UuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXStTLmh0bWxQcmVmaWx0ZXIobykrdVsyXSxjPXVbMF07d2hpbGUoYy0tKWE9YS5sYXN0Q2hpbGQ7Uy5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaCh0LmNyZWF0ZVRleHROb2RlKG8pKTtmLnRleHRDb250ZW50PSIiLGQ9MDt3aGlsZShvPXBbZCsrXSlpZihyJiYtMTxTLmluQXJyYXkobyxyKSlpJiZpLnB1c2gobyk7ZWxzZSBpZihsPWllKG8pLGE9dmUoZi5hcHBlbmRDaGlsZChvKSwic2NyaXB0IiksbCYmeWUoYSksbil7Yz0wO3doaWxlKG89YVtjKytdKWhlLnRlc3Qoby50eXBlfHwiIikmJm4ucHVzaChvKX1yZXR1cm4gZn12YXIgYmU9L15rZXkvLHdlPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxUZT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24gQ2UoKXtyZXR1cm4hMH1mdW5jdGlvbiBFZSgpe3JldHVybiExfWZ1bmN0aW9uIFNlKGUsdCl7cmV0dXJuIGU9PT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gRS5hY3RpdmVFbGVtZW50fWNhdGNoKGUpe319KCk9PSgiZm9jdXMiPT09dCl9ZnVuY3Rpb24ga2UoZSx0LG4scixpLG8pe3ZhciBhLHM7aWYoIm9iamVjdCI9PXR5cGVvZiB0KXtmb3IocyBpbiJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXZvaWQgMCksdClrZShlLHMsbixyLHRbc10sbyk7cmV0dXJuIGV9aWYobnVsbD09ciYmbnVsbD09aT8oaT1uLHI9bj12b2lkIDApOm51bGw9PWkmJigic3RyaW5nIj09dHlwZW9mIG4/KGk9cixyPXZvaWQgMCk6KGk9cixyPW4sbj12b2lkIDApKSwhMT09PWkpaT1FZTtlbHNlIGlmKCFpKXJldHVybiBlO3JldHVybiAxPT09byYmKGE9aSwoaT1mdW5jdGlvbihlKXtyZXR1cm4gUygpLm9mZihlKSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPVMuZ3VpZCsrKSksZS5lYWNoKGZ1bmN0aW9uKCl7Uy5ldmVudC5hZGQodGhpcyx0LGkscixuKX0pfWZ1bmN0aW9uIEFlKGUsaSxvKXtvPyhZLnNldChlLGksITEpLFMuZXZlbnQuYWRkKGUsaSx7bmFtZXNwYWNlOiExLGhhbmRsZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPVkuZ2V0KHRoaXMsaSk7aWYoMSZlLmlzVHJpZ2dlciYmdGhpc1tpXSl7aWYoci5sZW5ndGgpKFMuZXZlbnQuc3BlY2lhbFtpXXx8e30pLmRlbGVnYXRlVHlwZSYmZS5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKHI9cy5jYWxsKGFyZ3VtZW50cyksWS5zZXQodGhpcyxpLHIpLHQ9byh0aGlzLGkpLHRoaXNbaV0oKSxyIT09KG49WS5nZXQodGhpcyxpKSl8fHQ/WS5zZXQodGhpcyxpLCExKTpuPXt9LHIhPT1uKXJldHVybiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGUucHJldmVudERlZmF1bHQoKSxuLnZhbHVlfWVsc2Ugci5sZW5ndGgmJihZLnNldCh0aGlzLGkse3ZhbHVlOlMuZXZlbnQudHJpZ2dlcihTLmV4dGVuZChyWzBdLFMuRXZlbnQucHJvdG90eXBlKSxyLnNsaWNlKDEpLHRoaXMpfSksZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSl9fSkpOnZvaWQgMD09PVkuZ2V0KGUsaSkmJlMuZXZlbnQuYWRkKGUsaSxDZSl9Uy5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbih0LGUsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLHAsZCxoLGcsdj1ZLmdldCh0KTtpZihWKHQpKXtuLmhhbmRsZXImJihuPShvPW4pLmhhbmRsZXIsaT1vLnNlbGVjdG9yKSxpJiZTLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHJlLGkpLG4uZ3VpZHx8KG4uZ3VpZD1TLmd1aWQrKyksKHU9di5ldmVudHMpfHwodT12LmV2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpKSwoYT12LmhhbmRsZSl8fChhPXYuaGFuZGxlPWZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgUyYmUy5ldmVudC50cmlnZ2VyZWQhPT1lLnR5cGU/Uy5ldmVudC5kaXNwYXRjaC5hcHBseSh0LGFyZ3VtZW50cyk6dm9pZCAwfSksbD0oZT0oZXx8IiIpLm1hdGNoKFApfHxbIiJdKS5sZW5ndGg7d2hpbGUobC0tKWQ9Zz0ocz1UZS5leGVjKGVbbF0pfHxbXSlbMV0saD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGQmJihmPVMuZXZlbnQuc3BlY2lhbFtkXXx8e30sZD0oaT9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZCxmPVMuZXZlbnQuc3BlY2lhbFtkXXx8e30sYz1TLmV4dGVuZCh7dHlwZTpkLG9yaWdUeXBlOmcsZGF0YTpyLGhhbmRsZXI6bixndWlkOm4uZ3VpZCxzZWxlY3RvcjppLG5lZWRzQ29udGV4dDppJiZTLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoaSksbmFtZXNwYWNlOmguam9pbigiLiIpfSxvKSwocD11W2RdKXx8KChwPXVbZF09W10pLmRlbGVnYXRlQ291bnQ9MCxmLnNldHVwJiYhMSE9PWYuc2V0dXAuY2FsbCh0LHIsaCxhKXx8dC5hZGRFdmVudExpc3RlbmVyJiZ0LmFkZEV2ZW50TGlzdGVuZXIoZCxhKSksZi5hZGQmJihmLmFkZC5jYWxsKHQsYyksYy5oYW5kbGVyLmd1aWR8fChjLmhhbmRsZXIuZ3VpZD1uLmd1aWQpKSxpP3Auc3BsaWNlKHAuZGVsZWdhdGVDb3VudCsrLDAsYyk6cC5wdXNoKGMpLFMuZXZlbnQuZ2xvYmFsW2RdPSEwKX19LHJlbW92ZTpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLGEscyx1LGwsYyxmLHAsZCxoLGcsdj1ZLmhhc0RhdGEoZSkmJlkuZ2V0KGUpO2lmKHYmJih1PXYuZXZlbnRzKSl7bD0odD0odHx8IiIpLm1hdGNoKFApfHxbIiJdKS5sZW5ndGg7d2hpbGUobC0tKWlmKGQ9Zz0ocz1UZS5leGVjKHRbbF0pfHxbXSlbMV0saD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGQpe2Y9Uy5ldmVudC5zcGVjaWFsW2RdfHx7fSxwPXVbZD0ocj9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZF18fFtdLHM9c1syXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIraC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxhPW89cC5sZW5ndGg7d2hpbGUoby0tKWM9cFtvXSwhaSYmZyE9PWMub3JpZ1R5cGV8fG4mJm4uZ3VpZCE9PWMuZ3VpZHx8cyYmIXMudGVzdChjLm5hbWVzcGFjZSl8fHImJnIhPT1jLnNlbGVjdG9yJiYoIioqIiE9PXJ8fCFjLnNlbGVjdG9yKXx8KHAuc3BsaWNlKG8sMSksYy5zZWxlY3RvciYmcC5kZWxlZ2F0ZUNvdW50LS0sZi5yZW1vdmUmJmYucmVtb3ZlLmNhbGwoZSxjKSk7YSYmIXAubGVuZ3RoJiYoZi50ZWFyZG93biYmITEhPT1mLnRlYXJkb3duLmNhbGwoZSxoLHYuaGFuZGxlKXx8Uy5yZW1vdmVFdmVudChlLGQsdi5oYW5kbGUpLGRlbGV0ZSB1W2RdKX1lbHNlIGZvcihkIGluIHUpUy5ldmVudC5yZW1vdmUoZSxkK3RbbF0sbixyLCEwKTtTLmlzRW1wdHlPYmplY3QodSkmJlkucmVtb3ZlKGUsImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYSxzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSx1PVMuZXZlbnQuZml4KGUpLGw9KFkuZ2V0KHRoaXMsImV2ZW50cyIpfHxPYmplY3QuY3JlYXRlKG51bGwpKVt1LnR5cGVdfHxbXSxjPVMuZXZlbnQuc3BlY2lhbFt1LnR5cGVdfHx7fTtmb3Ioc1swXT11LHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXNbdF09YXJndW1lbnRzW3RdO2lmKHUuZGVsZWdhdGVUYXJnZXQ9dGhpcywhYy5wcmVEaXNwYXRjaHx8ITEhPT1jLnByZURpc3BhdGNoLmNhbGwodGhpcyx1KSl7YT1TLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyx1LGwpLHQ9MDt3aGlsZSgoaT1hW3QrK10pJiYhdS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXt1LmN1cnJlbnRUYXJnZXQ9aS5lbGVtLG49MDt3aGlsZSgobz1pLmhhbmRsZXJzW24rK10pJiYhdS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKXUucm5hbWVzcGFjZSYmITEhPT1vLm5hbWVzcGFjZSYmIXUucm5hbWVzcGFjZS50ZXN0KG8ubmFtZXNwYWNlKXx8KHUuaGFuZGxlT2JqPW8sdS5kYXRhPW8uZGF0YSx2b2lkIDAhPT0ocj0oKFMuZXZlbnQuc3BlY2lhbFtvLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8by5oYW5kbGVyKS5hcHBseShpLmVsZW0scykpJiYhMT09PSh1LnJlc3VsdD1yKSYmKHUucHJldmVudERlZmF1bHQoKSx1LnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGMucG9zdERpc3BhdGNoJiZjLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsdSksdS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLGEscz1bXSx1PXQuZGVsZWdhdGVDb3VudCxsPWUudGFyZ2V0O2lmKHUmJmwubm9kZVR5cGUmJiEoImNsaWNrIj09PWUudHlwZSYmMTw9ZS5idXR0b24pKWZvcig7bCE9PXRoaXM7bD1sLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWwubm9kZVR5cGUmJigiY2xpY2siIT09ZS50eXBlfHwhMCE9PWwuZGlzYWJsZWQpKXtmb3Iobz1bXSxhPXt9LG49MDtuPHU7bisrKXZvaWQgMD09PWFbaT0ocj10W25dKS5zZWxlY3RvcisiICJdJiYoYVtpXT1yLm5lZWRzQ29udGV4dD8tMTxTKGksdGhpcykuaW5kZXgobCk6Uy5maW5kKGksdGhpcyxudWxsLFtsXSkubGVuZ3RoKSxhW2ldJiZvLnB1c2gocik7by5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOm99KX1yZXR1cm4gbD10aGlzLHU8dC5sZW5ndGgmJnMucHVzaCh7ZWxlbTpsLGhhbmRsZXJzOnQuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KFMuRXZlbnQucHJvdG90eXBlLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDptKGUpP2Z1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiBlKHRoaXMub3JpZ2luYWxFdmVudCl9OmZ1bmN0aW9uKCl7aWYodGhpcy5vcmlnaW5hbEV2ZW50KXJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbdF19LHNldDpmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTplfSl9fSl9LGZpeDpmdW5jdGlvbihlKXtyZXR1cm4gZVtTLmV4cGFuZG9dP2U6bmV3IFMuRXZlbnQoZSl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxjbGljazp7c2V0dXA6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc3x8ZTtyZXR1cm4gcGUudGVzdCh0LnR5cGUpJiZ0LmNsaWNrJiZBKHQsImlucHV0IikmJkFlKHQsImNsaWNrIixDZSksITF9LHRyaWdnZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc3x8ZTtyZXR1cm4gcGUudGVzdCh0LnR5cGUpJiZ0LmNsaWNrJiZBKHQsImlucHV0IikmJkFlKHQsImNsaWNrIiksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0O3JldHVybiBwZS50ZXN0KHQudHlwZSkmJnQuY2xpY2smJkEodCwiaW5wdXQiKSYmWS5nZXQodCwiY2xpY2siKXx8QSh0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXt2b2lkIDAhPT1lLnJlc3VsdCYmZS5vcmlnaW5hbEV2ZW50JiYoZS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWUucmVzdWx0KX19fX0sUy5yZW1vdmVFdmVudD1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX0sUy5FdmVudD1mdW5jdGlvbihlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFMuRXZlbnQpKXJldHVybiBuZXcgUy5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWUuZGVmYXVsdFByZXZlbnRlZCYmITE9PT1lLnJldHVyblZhbHVlP0NlOkVlLHRoaXMudGFyZ2V0PWUudGFyZ2V0JiYzPT09ZS50YXJnZXQubm9kZVR5cGU/ZS50YXJnZXQucGFyZW50Tm9kZTplLnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9ZS5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT1lLHQmJlMuZXh0ZW5kKHRoaXMsdCksdGhpcy50aW1lU3RhbXA9ZSYmZS50aW1lU3RhbXB8fERhdGUubm93KCksdGhpc1tTLmV4cGFuZG9dPSEwfSxTLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6Uy5FdmVudCxpc0RlZmF1bHRQcmV2ZW50ZWQ6RWUsaXNQcm9wYWdhdGlvblN0b3BwZWQ6RWUsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6RWUsaXNTaW11bGF0ZWQ6ITEscHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9Q2UsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9Q2UsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUNlLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSxTLmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsImNoYXIiOiEwLGNvZGU6ITAsY2hhckNvZGU6ITAsa2V5OiEwLGtleUNvZGU6ITAsYnV0dG9uOiEwLGJ1dHRvbnM6ITAsY2xpZW50WDohMCxjbGllbnRZOiEwLG9mZnNldFg6ITAsb2Zmc2V0WTohMCxwb2ludGVySWQ6ITAscG9pbnRlclR5cGU6ITAsc2NyZWVuWDohMCxzY3JlZW5ZOiEwLHRhcmdldFRvdWNoZXM6ITAsdG9FbGVtZW50OiEwLHRvdWNoZXM6ITAsd2hpY2g6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5idXR0b247cmV0dXJuIG51bGw9PWUud2hpY2gmJmJlLnRlc3QoZS50eXBlKT9udWxsIT1lLmNoYXJDb2RlP2UuY2hhckNvZGU6ZS5rZXlDb2RlOiFlLndoaWNoJiZ2b2lkIDAhPT10JiZ3ZS50ZXN0KGUudHlwZSk/MSZ0PzE6MiZ0PzM6NCZ0PzI6MDplLndoaWNofX0sUy5ldmVudC5hZGRQcm9wKSxTLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGUsdCl7Uy5ldmVudC5zcGVjaWFsW2VdPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBBZSh0aGlzLGUsU2UpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIEFlKHRoaXMsZSksITB9LGRlbGVnYXRlVHlwZTp0fX0pLFMuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oZSxpKXtTLmV2ZW50LnNwZWNpYWxbZV09e2RlbGVnYXRlVHlwZTppLGJpbmRUeXBlOmksaGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5yZWxhdGVkVGFyZ2V0LHI9ZS5oYW5kbGVPYmo7cmV0dXJuIG4mJihuPT09dGhpc3x8Uy5jb250YWlucyh0aGlzLG4pKXx8KGUudHlwZT1yLm9yaWdUeXBlLHQ9ci5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnR5cGU9aSksdH19fSksUy5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBrZSh0aGlzLGUsdCxuLHIpfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGtlKHRoaXMsZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLFMoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PXQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0fHwobj10LHQ9dm9pZCAwKSwhMT09PW4mJihuPUVlKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LnJlbW92ZSh0aGlzLGUsbix0KX0pfX0pO3ZhciBOZT0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxEZT0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxqZT0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2c7ZnVuY3Rpb24gcWUoZSx0KXtyZXR1cm4gQShlLCJ0YWJsZSIpJiZBKDExIT09dC5ub2RlVHlwZT90OnQuZmlyc3RDaGlsZCwidHIiKSYmUyhlKS5jaGlsZHJlbigidGJvZHkiKVswXXx8ZX1mdW5jdGlvbiBMZShlKXtyZXR1cm4gZS50eXBlPShudWxsIT09ZS5nZXRBdHRyaWJ1dGUoInR5cGUiKSkrIi8iK2UudHlwZSxlfWZ1bmN0aW9uIEhlKGUpe3JldHVybiJ0cnVlLyI9PT0oZS50eXBlfHwiIikuc2xpY2UoMCw1KT9lLnR5cGU9ZS50eXBlLnNsaWNlKDUpOmUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksZX1mdW5jdGlvbiBPZShlLHQpe3ZhciBuLHIsaSxvLGEscztpZigxPT09dC5ub2RlVHlwZSl7aWYoWS5oYXNEYXRhKGUpJiYocz1ZLmdldChlKS5ldmVudHMpKWZvcihpIGluIFkucmVtb3ZlKHQsImhhbmRsZSBldmVudHMiKSxzKWZvcihuPTAscj1zW2ldLmxlbmd0aDtuPHI7bisrKVMuZXZlbnQuYWRkKHQsaSxzW2ldW25dKTtRLmhhc0RhdGEoZSkmJihvPVEuYWNjZXNzKGUpLGE9Uy5leHRlbmQoe30sbyksUS5zZXQodCxhKSl9fWZ1bmN0aW9uIFBlKG4scixpLG8pe3I9ZyhyKTt2YXIgZSx0LGEscyx1LGwsYz0wLGY9bi5sZW5ndGgscD1mLTEsZD1yWzBdLGg9bShkKTtpZihofHwxPGYmJiJzdHJpbmciPT10eXBlb2YgZCYmIXkuY2hlY2tDbG9uZSYmRGUudGVzdChkKSlyZXR1cm4gbi5lYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PW4uZXEoZSk7aCYmKHJbMF09ZC5jYWxsKHRoaXMsZSx0Lmh0bWwoKSkpLFBlKHQscixpLG8pfSk7aWYoZiYmKHQ9KGU9eGUocixuWzBdLm93bmVyRG9jdW1lbnQsITEsbixvKSkuZmlyc3RDaGlsZCwxPT09ZS5jaGlsZE5vZGVzLmxlbmd0aCYmKGU9dCksdHx8bykpe2ZvcihzPShhPVMubWFwKHZlKGUsInNjcmlwdCIpLExlKSkubGVuZ3RoO2M8ZjtjKyspdT1lLGMhPT1wJiYodT1TLmNsb25lKHUsITAsITApLHMmJlMubWVyZ2UoYSx2ZSh1LCJzY3JpcHQiKSkpLGkuY2FsbChuW2NdLHUsYyk7aWYocylmb3IobD1hW2EubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsUy5tYXAoYSxIZSksYz0wO2M8cztjKyspdT1hW2NdLGhlLnRlc3QodS50eXBlfHwiIikmJiFZLmFjY2Vzcyh1LCJnbG9iYWxFdmFsIikmJlMuY29udGFpbnMobCx1KSYmKHUuc3JjJiYibW9kdWxlIiE9PSh1LnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpP1MuX2V2YWxVcmwmJiF1Lm5vTW9kdWxlJiZTLl9ldmFsVXJsKHUuc3JjLHtub25jZTp1Lm5vbmNlfHx1LmdldEF0dHJpYnV0ZSgibm9uY2UiKX0sbCk6Yih1LnRleHRDb250ZW50LnJlcGxhY2UoamUsIiIpLHUsbCkpfXJldHVybiBufWZ1bmN0aW9uIFJlKGUsdCxuKXtmb3IodmFyIHIsaT10P1MuZmlsdGVyKHQsZSk6ZSxvPTA7bnVsbCE9KHI9aVtvXSk7bysrKW58fDEhPT1yLm5vZGVUeXBlfHxTLmNsZWFuRGF0YSh2ZShyKSksci5wYXJlbnROb2RlJiYobiYmaWUocikmJnllKHZlKHIsInNjcmlwdCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiBlfVMuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYz1lLmNsb25lTm9kZSghMCksZj1pZShlKTtpZighKHkubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fFMuaXNYTUxEb2MoZSkpKWZvcihhPXZlKGMpLHI9MCxpPShvPXZlKGUpKS5sZW5ndGg7cjxpO3IrKylzPW9bcl0sdT1hW3JdLHZvaWQgMCwiaW5wdXQiPT09KGw9dS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSYmcGUudGVzdChzLnR5cGUpP3UuY2hlY2tlZD1zLmNoZWNrZWQ6ImlucHV0IiE9PWwmJiJ0ZXh0YXJlYSIhPT1sfHwodS5kZWZhdWx0VmFsdWU9cy5kZWZhdWx0VmFsdWUpO2lmKHQpaWYobilmb3Iobz1vfHx2ZShlKSxhPWF8fHZlKGMpLHI9MCxpPW8ubGVuZ3RoO3I8aTtyKyspT2Uob1tyXSxhW3JdKTtlbHNlIE9lKGUsYyk7cmV0dXJuIDA8KGE9dmUoYywic2NyaXB0IikpLmxlbmd0aCYmeWUoYSwhZiYmdmUoZSwic2NyaXB0IikpLGN9LGNsZWFuRGF0YTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbixyLGk9Uy5ldmVudC5zcGVjaWFsLG89MDt2b2lkIDAhPT0obj1lW29dKTtvKyspaWYoVihuKSl7aWYodD1uW1kuZXhwYW5kb10pe2lmKHQuZXZlbnRzKWZvcihyIGluIHQuZXZlbnRzKWlbcl0/Uy5ldmVudC5yZW1vdmUobixyKTpTLnJlbW92ZUV2ZW50KG4scix0LmhhbmRsZSk7bltZLmV4cGFuZG9dPXZvaWQgMH1uW1EuZXhwYW5kb10mJihuW1EuZXhwYW5kb109dm9pZCAwKX19fSksUy5mbi5leHRlbmQoe2RldGFjaDpmdW5jdGlvbihlKXtyZXR1cm4gUmUodGhpcyxlLCEwKX0scmVtb3ZlOmZ1bmN0aW9uKGUpe3JldHVybiBSZSh0aGlzLGUpfSx0ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/Uy50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fCh0aGlzLnRleHRDb250ZW50PWUpfSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIFBlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHxxZSh0aGlzLGUpLmFwcGVuZENoaWxkKGUpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gUGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciB0PXFlKHRoaXMsZSk7dC5pbnNlcnRCZWZvcmUoZSx0LmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gUGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gUGUodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD0wO251bGwhPShlPXRoaXNbdF0pO3QrKykxPT09ZS5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKHZlKGUsITEpKSxlLnRleHRDb250ZW50PSIiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1udWxsIT1lJiZlLHQ9bnVsbD09dD9lOnQsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gUy5jbG9uZSh0aGlzLGUsdCl9KX0saHRtbDpmdW5jdGlvbihlKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWUmJjE9PT10Lm5vZGVUeXBlKXJldHVybiB0LmlubmVySFRNTDtpZigic3RyaW5nIj09dHlwZW9mIGUmJiFOZS50ZXN0KGUpJiYhZ2VbKGRlLmV4ZWMoZSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXtlPVMuaHRtbFByZWZpbHRlcihlKTt0cnl7Zm9yKDtuPHI7bisrKTE9PT0odD10aGlzW25dfHx7fSkubm9kZVR5cGUmJihTLmNsZWFuRGF0YSh2ZSh0LCExKSksdC5pbm5lckhUTUw9ZSk7dD0wfWNhdGNoKGUpe319dCYmdGhpcy5lbXB0eSgpLmFwcGVuZChlKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBuPVtdO3JldHVybiBQZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7Uy5pbkFycmF5KHRoaXMsbik8MCYmKFMuY2xlYW5EYXRhKHZlKHRoaXMpKSx0JiZ0LnJlcGxhY2VDaGlsZChlLHRoaXMpKX0sbil9fSksUy5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oZSxhKXtTLmZuW2VdPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPVtdLHI9UyhlKSxpPXIubGVuZ3RoLTEsbz0wO288PWk7bysrKXQ9bz09PWk/dGhpczp0aGlzLmNsb25lKCEwKSxTKHJbb10pW2FdKHQpLHUuYXBwbHkobix0LmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobil9fSk7dmFyIE1lPW5ldyBSZWdFeHAoIl4oIitlZSsiKSg/IXB4KVthLXolXSskIiwiaSIpLEllPWZ1bmN0aW9uKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gdCYmdC5vcGVuZXJ8fCh0PUMpLHQuZ2V0Q29tcHV0ZWRTdHlsZShlKX0sV2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz17fTtmb3IoaSBpbiB0KW9baV09ZS5zdHlsZVtpXSxlLnN0eWxlW2ldPXRbaV07Zm9yKGkgaW4gcj1uLmNhbGwoZSksdCllLnN0eWxlW2ldPW9baV07cmV0dXJuIHJ9LEZlPW5ldyBSZWdFeHAobmUuam9pbigifCIpLCJpIik7ZnVuY3Rpb24gQmUoZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5zdHlsZTtyZXR1cm4obj1ufHxJZShlKSkmJigiIiE9PShhPW4uZ2V0UHJvcGVydHlWYWx1ZSh0KXx8blt0XSl8fGllKGUpfHwoYT1TLnN0eWxlKGUsdCkpLCF5LnBpeGVsQm94U3R5bGVzKCkmJk1lLnRlc3QoYSkmJkZlLnRlc3QodCkmJihyPXMud2lkdGgsaT1zLm1pbldpZHRoLG89cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1pLHMubWF4V2lkdGg9bykpLHZvaWQgMCE9PWE/YSsiIjphfWZ1bmN0aW9uICRlKGUsdCl7cmV0dXJue2dldDpmdW5jdGlvbigpe2lmKCFlKCkpcmV0dXJuKHRoaXMuZ2V0PXQpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtkZWxldGUgdGhpcy5nZXR9fX0hZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7aWYobCl7dS5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIixsLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSUiLHJlLmFwcGVuZENoaWxkKHUpLmFwcGVuZENoaWxkKGwpO3ZhciBlPUMuZ2V0Q29tcHV0ZWRTdHlsZShsKTtuPSIxJSIhPT1lLnRvcCxzPTEyPT09dChlLm1hcmdpbkxlZnQpLGwuc3R5bGUucmlnaHQ9IjYwJSIsbz0zNj09PXQoZS5yaWdodCkscj0zNj09PXQoZS53aWR0aCksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGk9MTI9PT10KGwub2Zmc2V0V2lkdGgvMykscmUucmVtb3ZlQ2hpbGQodSksbD1udWxsfX1mdW5jdGlvbiB0KGUpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpfXZhciBuLHIsaSxvLGEscyx1PUUuY3JlYXRlRWxlbWVudCgiZGl2IiksbD1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuc3R5bGUmJihsLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsbC5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLHkuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1sLnN0eWxlLmJhY2tncm91bmRDbGlwLFMuZXh0ZW5kKHkse2JveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxyfSxwaXhlbEJveFN0eWxlczpmdW5jdGlvbigpe3JldHVybiBlKCksb30scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBlKCksbn0scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxzfSxzY3JvbGxib3hTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxpfSxyZWxpYWJsZVRyRGltZW5zaW9uczpmdW5jdGlvbigpe3ZhciBlLHQsbixyO3JldHVybiBudWxsPT1hJiYoZT1FLmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksdD1FLmNyZWF0ZUVsZW1lbnQoInRyIiksbj1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweCIsdC5zdHlsZS5oZWlnaHQ9IjFweCIsbi5zdHlsZS5oZWlnaHQ9IjlweCIscmUuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQodCkuYXBwZW5kQ2hpbGQobikscj1DLmdldENvbXB1dGVkU3R5bGUodCksYT0zPHBhcnNlSW50KHIuaGVpZ2h0KSxyZS5yZW1vdmVDaGlsZChlKSksYX19KSl9KCk7dmFyIF9lPVsiV2Via2l0IiwiTW96IiwibXMiXSx6ZT1FLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLFVlPXt9O2Z1bmN0aW9uIFhlKGUpe3ZhciB0PVMuY3NzUHJvcHNbZV18fFVlW2VdO3JldHVybiB0fHwoZSBpbiB6ZT9lOlVlW2VdPWZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLG49X2UubGVuZ3RoO3doaWxlKG4tLSlpZigoZT1fZVtuXSt0KWluIHplKXJldHVybiBlfShlKXx8ZSl9dmFyIFZlPS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxHZT0vXi0tLyxZZT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sUWU9e2xldHRlclNwYWNpbmc6IjAiLGZvbnRXZWlnaHQ6IjQwMCJ9O2Z1bmN0aW9uIEplKGUsdCxuKXt2YXIgcj10ZS5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTp0fWZ1bmN0aW9uIEtlKGUsdCxuLHIsaSxvKXt2YXIgYT0id2lkdGgiPT09dD8xOjAscz0wLHU9MDtpZihuPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKSlyZXR1cm4gMDtmb3IoO2E8NDthKz0yKSJtYXJnaW4iPT09biYmKHUrPVMuY3NzKGUsbituZVthXSwhMCxpKSkscj8oImNvbnRlbnQiPT09biYmKHUtPVMuY3NzKGUsInBhZGRpbmciK25lW2FdLCEwLGkpKSwibWFyZ2luIiE9PW4mJih1LT1TLmNzcyhlLCJib3JkZXIiK25lW2FdKyJXaWR0aCIsITAsaSkpKToodSs9Uy5jc3MoZSwicGFkZGluZyIrbmVbYV0sITAsaSksInBhZGRpbmciIT09bj91Kz1TLmNzcyhlLCJib3JkZXIiK25lW2FdKyJXaWR0aCIsITAsaSk6cys9Uy5jc3MoZSwiYm9yZGVyIituZVthXSsiV2lkdGgiLCEwLGkpKTtyZXR1cm4hciYmMDw9byYmKHUrPU1hdGgubWF4KDAsTWF0aC5jZWlsKGVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLW8tdS1zLS41KSl8fDApLHV9ZnVuY3Rpb24gWmUoZSx0LG4pe3ZhciByPUllKGUpLGk9KCF5LmJveFNpemluZ1JlbGlhYmxlKCl8fG4pJiYiYm9yZGVyLWJveCI9PT1TLmNzcyhlLCJib3hTaXppbmciLCExLHIpLG89aSxhPUJlKGUsdCxyKSxzPSJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2lmKE1lLnRlc3QoYSkpe2lmKCFuKXJldHVybiBhO2E9ImF1dG8ifXJldHVybigheS5ib3hTaXppbmdSZWxpYWJsZSgpJiZpfHwheS5yZWxpYWJsZVRyRGltZW5zaW9ucygpJiZBKGUsInRyIil8fCJhdXRvIj09PWF8fCFwYXJzZUZsb2F0KGEpJiYiaW5saW5lIj09PVMuY3NzKGUsImRpc3BsYXkiLCExLHIpKSYmZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmKGk9ImJvcmRlci1ib3giPT09Uy5jc3MoZSwiYm94U2l6aW5nIiwhMSxyKSwobz1zIGluIGUpJiYoYT1lW3NdKSksKGE9cGFyc2VGbG9hdChhKXx8MCkrS2UoZSx0LG58fChpPyJib3JkZXIiOiJjb250ZW50IiksbyxyLGEpKyJweCJ9ZnVuY3Rpb24gZXQoZSx0LG4scixpKXtyZXR1cm4gbmV3IGV0LnByb3RvdHlwZS5pbml0KGUsdCxuLHIsaSl9Uy5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oZSx0KXtpZih0KXt2YXIgbj1CZShlLCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1uPyIxIjpufX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGNvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxncmlkQXJlYTohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3RhcnQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBpLG8sYSxzPVgodCksdT1HZS50ZXN0KHQpLGw9ZS5zdHlsZTtpZih1fHwodD1YZShzKSksYT1TLmNzc0hvb2tzW3RdfHxTLmNzc0hvb2tzW3NdLHZvaWQgMD09PW4pcmV0dXJuIGEmJiJnZXQiaW4gYSYmdm9pZCAwIT09KGk9YS5nZXQoZSwhMSxyKSk/aTpsW3RdOyJzdHJpbmciPT09KG89dHlwZW9mIG4pJiYoaT10ZS5leGVjKG4pKSYmaVsxXSYmKG49c2UoZSx0LGkpLG89Im51bWJlciIpLG51bGwhPW4mJm49PW4mJigibnVtYmVyIiE9PW98fHV8fChuKz1pJiZpWzNdfHwoUy5jc3NOdW1iZXJbc10/IiI6InB4IikpLHkuY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT10LmluZGV4T2YoImJhY2tncm91bmQiKXx8KGxbdF09ImluaGVyaXQiKSxhJiYic2V0ImluIGEmJnZvaWQgMD09PShuPWEuc2V0KGUsbixyKSl8fCh1P2wuc2V0UHJvcGVydHkodCxuKTpsW3RdPW4pKX19LGNzczpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscz1YKHQpO3JldHVybiBHZS50ZXN0KHQpfHwodD1YZShzKSksKGE9Uy5jc3NIb29rc1t0XXx8Uy5jc3NIb29rc1tzXSkmJiJnZXQiaW4gYSYmKGk9YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09aSYmKGk9QmUoZSx0LHIpKSwibm9ybWFsIj09PWkmJnQgaW4gUWUmJihpPVFlW3RdKSwiIj09PW58fG4/KG89cGFyc2VGbG9hdChpKSwhMD09PW58fGlzRmluaXRlKG8pP298fDA6aSk6aX19KSxTLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGUsdSl7Uy5jc3NIb29rc1t1XT17Z2V0OmZ1bmN0aW9uKGUsdCxuKXtpZih0KXJldHVybiFWZS50ZXN0KFMuY3NzKGUsImRpc3BsYXkiKSl8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/WmUoZSx1LG4pOldlKGUsWWUsZnVuY3Rpb24oKXtyZXR1cm4gWmUoZSx1LG4pfSl9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1JZShlKSxvPSF5LnNjcm9sbGJveFNpemUoKSYmImFic29sdXRlIj09PWkucG9zaXRpb24sYT0ob3x8bikmJiJib3JkZXItYm94Ij09PVMuY3NzKGUsImJveFNpemluZyIsITEsaSkscz1uP0tlKGUsdSxuLGEsaSk6MDtyZXR1cm4gYSYmbyYmKHMtPU1hdGguY2VpbChlWyJvZmZzZXQiK3VbMF0udG9VcHBlckNhc2UoKSt1LnNsaWNlKDEpXS1wYXJzZUZsb2F0KGlbdV0pLUtlKGUsdSwiYm9yZGVyIiwhMSxpKS0uNSkpLHMmJihyPXRlLmV4ZWModCkpJiYicHgiIT09KHJbM118fCJweCIpJiYoZS5zdHlsZVt1XT10LHQ9Uy5jc3MoZSx1KSksSmUoMCx0LHMpfX19KSxTLmNzc0hvb2tzLm1hcmdpbkxlZnQ9JGUoeS5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24oZSx0KXtpZih0KXJldHVybihwYXJzZUZsb2F0KEJlKGUsIm1hcmdpbkxlZnQiKSl8fGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1XZShlLHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksUy5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oaSxvKXtTLmNzc0hvb2tzW2krb109e2V4cGFuZDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXt9LHI9InN0cmluZyI9PXR5cGVvZiBlP2Uuc3BsaXQoIiAiKTpbZV07dDw0O3QrKyluW2krbmVbdF0rb109clt0XXx8clt0LTJdfHxyWzBdO3JldHVybiBufX0sIm1hcmdpbiIhPT1pJiYoUy5jc3NIb29rc1tpK29dLnNldD1KZSl9KSxTLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXt9LGE9MDtpZihBcnJheS5pc0FycmF5KHQpKXtmb3Iocj1JZShlKSxpPXQubGVuZ3RoO2E8aTthKyspb1t0W2FdXT1TLmNzcyhlLHRbYV0sITEscik7cmV0dXJuIG99cmV0dXJuIHZvaWQgMCE9PW4/Uy5zdHlsZShlLHQsbik6Uy5jc3MoZSx0KX0sZSx0LDE8YXJndW1lbnRzLmxlbmd0aCl9fSksKChTLlR3ZWVuPWV0KS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmV0LGluaXQ6ZnVuY3Rpb24oZSx0LG4scixpLG8pe3RoaXMuZWxlbT1lLHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPWl8fFMuZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz10LHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1vfHwoUy5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPWV0LnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBlJiZlLmdldD9lLmdldCh0aGlzKTpldC5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj1ldC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPXQ9Uy5lYXNpbmdbdGhpcy5lYXNpbmddKGUsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9dD1lLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0K3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLG4mJm4uc2V0P24uc2V0KHRoaXMpOmV0LnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319KS5pbml0LnByb3RvdHlwZT1ldC5wcm90b3R5cGUsKGV0LnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gMSE9PWUuZWxlbS5ub2RlVHlwZXx8bnVsbCE9ZS5lbGVtW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtlLnByb3BdP2UuZWxlbVtlLnByb3BdOih0PVMuY3NzKGUuZWxlbSxlLnByb3AsIiIpKSYmImF1dG8iIT09dD90OjB9LHNldDpmdW5jdGlvbihlKXtTLmZ4LnN0ZXBbZS5wcm9wXT9TLmZ4LnN0ZXBbZS5wcm9wXShlKToxIT09ZS5lbGVtLm5vZGVUeXBlfHwhUy5jc3NIb29rc1tlLnByb3BdJiZudWxsPT1lLmVsZW0uc3R5bGVbWGUoZS5wcm9wKV0/ZS5lbGVtW2UucHJvcF09ZS5ub3c6Uy5zdHlsZShlLmVsZW0sZS5wcm9wLGUubm93K2UudW5pdCl9fX0pLnNjcm9sbFRvcD1ldC5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSxTLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxzd2luZzpmdW5jdGlvbihlKXtyZXR1cm4uNS1NYXRoLmNvcyhlKk1hdGguUEkpLzJ9LF9kZWZhdWx0OiJzd2luZyJ9LFMuZng9ZXQucHJvdG90eXBlLmluaXQsUy5meC5zdGVwPXt9O3ZhciB0dCxudCxydCxpdCxvdD0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sYXQ9L3F1ZXVlSG9va3MkLztmdW5jdGlvbiBzdCgpe250JiYoITE9PT1FLmhpZGRlbiYmQy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/Qy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3QpOkMuc2V0VGltZW91dChzdCxTLmZ4LmludGVydmFsKSxTLmZ4LnRpY2soKSl9ZnVuY3Rpb24gdXQoKXtyZXR1cm4gQy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHQ9dm9pZCAwfSksdHQ9RGF0ZS5ub3coKX1mdW5jdGlvbiBsdChlLHQpe3ZhciBuLHI9MCxpPXtoZWlnaHQ6ZX07Zm9yKHQ9dD8xOjA7cjw0O3IrPTItdClpWyJtYXJnaW4iKyhuPW5lW3JdKV09aVsicGFkZGluZyIrbl09ZTtyZXR1cm4gdCYmKGkub3BhY2l0eT1pLndpZHRoPWUpLGl9ZnVuY3Rpb24gY3QoZSx0LG4pe2Zvcih2YXIgcixpPShmdC50d2VlbmVyc1t0XXx8W10pLmNvbmNhdChmdC50d2VlbmVyc1siKiJdKSxvPTAsYT1pLmxlbmd0aDtvPGE7bysrKWlmKHI9aVtvXS5jYWxsKG4sdCxlKSlyZXR1cm4gcn1mdW5jdGlvbiBmdChvLGUsdCl7dmFyIG4sYSxyPTAsaT1mdC5wcmVmaWx0ZXJzLmxlbmd0aCxzPVMuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKGEpcmV0dXJuITE7Zm9yKHZhciBlPXR0fHx1dCgpLHQ9TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLWUpLG49MS0odC9sLmR1cmF0aW9ufHwwKSxyPTAsaT1sLnR3ZWVucy5sZW5ndGg7cjxpO3IrKylsLnR3ZWVuc1tyXS5ydW4obik7cmV0dXJuIHMubm90aWZ5V2l0aChvLFtsLG4sdF0pLG48MSYmaT90OihpfHxzLm5vdGlmeVdpdGgobyxbbCwxLDBdKSxzLnJlc29sdmVXaXRoKG8sW2xdKSwhMSl9LGw9cy5wcm9taXNlKHtlbGVtOm8scHJvcHM6Uy5leHRlbmQoe30sZSksb3B0czpTLmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6Uy5lYXNpbmcuX2RlZmF1bHR9LHQpLG9yaWdpbmFsUHJvcGVydGllczplLG9yaWdpbmFsT3B0aW9uczp0LHN0YXJ0VGltZTp0dHx8dXQoKSxkdXJhdGlvbjp0LmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihlLHQpe3ZhciBuPVMuVHdlZW4obyxsLm9wdHMsZSx0LGwub3B0cy5zcGVjaWFsRWFzaW5nW2VdfHxsLm9wdHMuZWFzaW5nKTtyZXR1cm4gbC50d2VlbnMucHVzaChuKSxufSxzdG9wOmZ1bmN0aW9uKGUpe3ZhciB0PTAsbj1lP2wudHdlZW5zLmxlbmd0aDowO2lmKGEpcmV0dXJuIHRoaXM7Zm9yKGE9ITA7dDxuO3QrKylsLnR3ZWVuc1t0XS5ydW4oMSk7cmV0dXJuIGU/KHMubm90aWZ5V2l0aChvLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgobyxbbCxlXSkpOnMucmVqZWN0V2l0aChvLFtsLGVdKSx0aGlzfX0pLGM9bC5wcm9wcztmb3IoIWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG8sYTtmb3IobiBpbiBlKWlmKGk9dFtyPVgobildLG89ZVtuXSxBcnJheS5pc0FycmF5KG8pJiYoaT1vWzFdLG89ZVtuXT1vWzBdKSxuIT09ciYmKGVbcl09byxkZWxldGUgZVtuXSksKGE9Uy5jc3NIb29rc1tyXSkmJiJleHBhbmQiaW4gYSlmb3IobiBpbiBvPWEuZXhwYW5kKG8pLGRlbGV0ZSBlW3JdLG8pbiBpbiBlfHwoZVtuXT1vW25dLHRbbl09aSk7ZWxzZSB0W3JdPWl9KGMsbC5vcHRzLnNwZWNpYWxFYXNpbmcpO3I8aTtyKyspaWYobj1mdC5wcmVmaWx0ZXJzW3JdLmNhbGwobCxvLGMsbC5vcHRzKSlyZXR1cm4gbShuLnN0b3ApJiYoUy5fcXVldWVIb29rcyhsLmVsZW0sbC5vcHRzLnF1ZXVlKS5zdG9wPW4uc3RvcC5iaW5kKG4pKSxuO3JldHVybiBTLm1hcChjLGN0LGwpLG0obC5vcHRzLnN0YXJ0KSYmbC5vcHRzLnN0YXJ0LmNhbGwobyxsKSxsLnByb2dyZXNzKGwub3B0cy5wcm9ncmVzcykuZG9uZShsLm9wdHMuZG9uZSxsLm9wdHMuY29tcGxldGUpLmZhaWwobC5vcHRzLmZhaWwpLmFsd2F5cyhsLm9wdHMuYWx3YXlzKSxTLmZ4LnRpbWVyKFMuZXh0ZW5kKHUse2VsZW06byxhbmltOmwscXVldWU6bC5vcHRzLnF1ZXVlfSkpLGx9Uy5BbmltYXRpb249Uy5leHRlbmQoZnQse3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpO3JldHVybiBzZShuLmVsZW0sZSx0ZS5leGVjKHQpLG4pLG59XX0sdHdlZW5lcjpmdW5jdGlvbihlLHQpe20oZSk/KHQ9ZSxlPVsiKiJdKTplPWUubWF0Y2goUCk7Zm9yKHZhciBuLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspbj1lW3JdLGZ0LnR3ZWVuZXJzW25dPWZ0LnR3ZWVuZXJzW25dfHxbXSxmdC50d2VlbmVyc1tuXS51bnNoaWZ0KHQpfSxwcmVmaWx0ZXJzOltmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYyxmPSJ3aWR0aCJpbiB0fHwiaGVpZ2h0ImluIHQscD10aGlzLGQ9e30saD1lLnN0eWxlLGc9ZS5ub2RlVHlwZSYmYWUoZSksdj1ZLmdldChlLCJmeHNob3ciKTtmb3IociBpbiBuLnF1ZXVlfHwobnVsbD09KGE9Uy5fcXVldWVIb29rcyhlLCJmeCIpKS51bnF1ZXVlZCYmKGEudW5xdWV1ZWQ9MCxzPWEuZW1wdHkuZmlyZSxhLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXthLnVucXVldWVkfHxzKCl9KSxhLnVucXVldWVkKysscC5hbHdheXMoZnVuY3Rpb24oKXtwLmFsd2F5cyhmdW5jdGlvbigpe2EudW5xdWV1ZWQtLSxTLnF1ZXVlKGUsImZ4IikubGVuZ3RofHxhLmVtcHR5LmZpcmUoKX0pfSkpLHQpaWYoaT10W3JdLG90LnRlc3QoaSkpe2lmKGRlbGV0ZSB0W3JdLG89b3x8InRvZ2dsZSI9PT1pLGk9PT0oZz8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09aXx8IXZ8fHZvaWQgMD09PXZbcl0pY29udGludWU7Zz0hMH1kW3JdPXYmJnZbcl18fFMuc3R5bGUoZSxyKX1pZigodT0hUy5pc0VtcHR5T2JqZWN0KHQpKXx8IVMuaXNFbXB0eU9iamVjdChkKSlmb3IociBpbiBmJiYxPT09ZS5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2gub3ZlcmZsb3csaC5vdmVyZmxvd1gsaC5vdmVyZmxvd1ldLG51bGw9PShsPXYmJnYuZGlzcGxheSkmJihsPVkuZ2V0KGUsImRpc3BsYXkiKSksIm5vbmUiPT09KGM9Uy5jc3MoZSwiZGlzcGxheSIpKSYmKGw/Yz1sOihsZShbZV0sITApLGw9ZS5zdHlsZS5kaXNwbGF5fHxsLGM9Uy5jc3MoZSwiZGlzcGxheSIpLGxlKFtlXSkpKSwoImlubGluZSI9PT1jfHwiaW5saW5lLWJsb2NrIj09PWMmJm51bGwhPWwpJiYibm9uZSI9PT1TLmNzcyhlLCJmbG9hdCIpJiYodXx8KHAuZG9uZShmdW5jdGlvbigpe2guZGlzcGxheT1sfSksbnVsbD09bCYmKGM9aC5kaXNwbGF5LGw9Im5vbmUiPT09Yz8iIjpjKSksaC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKGgub3ZlcmZsb3c9ImhpZGRlbiIscC5hbHdheXMoZnVuY3Rpb24oKXtoLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0saC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxoLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITEsZCl1fHwodj8iaGlkZGVuImluIHYmJihnPXYuaGlkZGVuKTp2PVkuYWNjZXNzKGUsImZ4c2hvdyIse2Rpc3BsYXk6bH0pLG8mJih2LmhpZGRlbj0hZyksZyYmbGUoW2VdLCEwKSxwLmRvbmUoZnVuY3Rpb24oKXtmb3IociBpbiBnfHxsZShbZV0pLFkucmVtb3ZlKGUsImZ4c2hvdyIpLGQpUy5zdHlsZShlLHIsZFtyXSl9KSksdT1jdChnP3Zbcl06MCxyLHApLHIgaW4gdnx8KHZbcl09dS5zdGFydCxnJiYodS5lbmQ9dS5zdGFydCx1LnN0YXJ0PTApKX1dLHByZWZpbHRlcjpmdW5jdGlvbihlLHQpe3Q/ZnQucHJlZmlsdGVycy51bnNoaWZ0KGUpOmZ0LnByZWZpbHRlcnMucHVzaChlKX19KSxTLnNwZWVkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lJiYib2JqZWN0Ij09dHlwZW9mIGU/Uy5leHRlbmQoe30sZSk6e2NvbXBsZXRlOm58fCFuJiZ0fHxtKGUpJiZlLGR1cmF0aW9uOmUsZWFzaW5nOm4mJnR8fHQmJiFtKHQpJiZ0fTtyZXR1cm4gUy5meC5vZmY/ci5kdXJhdGlvbj0wOiJudW1iZXIiIT10eXBlb2Ygci5kdXJhdGlvbiYmKHIuZHVyYXRpb24gaW4gUy5meC5zcGVlZHM/ci5kdXJhdGlvbj1TLmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTpyLmR1cmF0aW9uPVMuZnguc3BlZWRzLl9kZWZhdWx0KSxudWxsIT1yLnF1ZXVlJiYhMCE9PXIucXVldWV8fChyLnF1ZXVlPSJmeCIpLHIub2xkPXIuY29tcGxldGUsci5jb21wbGV0ZT1mdW5jdGlvbigpe20oci5vbGQpJiZyLm9sZC5jYWxsKHRoaXMpLHIucXVldWUmJlMuZGVxdWV1ZSh0aGlzLHIucXVldWUpfSxyfSxTLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLmZpbHRlcihhZSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTp0fSxlLG4scil9LGFuaW1hdGU6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9Uy5pc0VtcHR5T2JqZWN0KHQpLG89Uy5zcGVlZChlLG4sciksYT1mdW5jdGlvbigpe3ZhciBlPWZ0KHRoaXMsUy5leHRlbmQoe30sdCksbyk7KGl8fFkuZ2V0KHRoaXMsImZpbmlzaCIpKSYmZS5zdG9wKCEwKX07cmV0dXJuIGEuZmluaXNoPWEsaXx8ITE9PT1vLnF1ZXVlP3RoaXMuZWFjaChhKTp0aGlzLnF1ZXVlKG8ucXVldWUsYSl9LHN0b3A6ZnVuY3Rpb24oaSxlLG8pe3ZhciBhPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RvcDtkZWxldGUgZS5zdG9wLHQobyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgaSYmKG89ZSxlPWksaT12b2lkIDApLGUmJnRoaXMucXVldWUoaXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9ITAsdD1udWxsIT1pJiZpKyJxdWV1ZUhvb2tzIixuPVMudGltZXJzLHI9WS5nZXQodGhpcyk7aWYodClyW3RdJiZyW3RdLnN0b3AmJmEoclt0XSk7ZWxzZSBmb3IodCBpbiByKXJbdF0mJnJbdF0uc3RvcCYmYXQudGVzdCh0KSYmYShyW3RdKTtmb3IodD1uLmxlbmd0aDt0LS07KW5bdF0uZWxlbSE9PXRoaXN8fG51bGwhPWkmJm5bdF0ucXVldWUhPT1pfHwoblt0XS5hbmltLnN0b3AobyksZT0hMSxuLnNwbGljZSh0LDEpKTshZSYmb3x8Uy5kZXF1ZXVlKHRoaXMsaSl9KX0sZmluaXNoOmZ1bmN0aW9uKGEpe3JldHVybiExIT09YSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsdD1ZLmdldCh0aGlzKSxuPXRbYSsicXVldWUiXSxyPXRbYSsicXVldWVIb29rcyJdLGk9Uy50aW1lcnMsbz1uP24ubGVuZ3RoOjA7Zm9yKHQuZmluaXNoPSEwLFMucXVldWUodGhpcyxhLFtdKSxyJiZyLnN0b3AmJnIuc3RvcC5jYWxsKHRoaXMsITApLGU9aS5sZW5ndGg7ZS0tOylpW2VdLmVsZW09PT10aGlzJiZpW2VdLnF1ZXVlPT09YSYmKGlbZV0uYW5pbS5zdG9wKCEwKSxpLnNwbGljZShlLDEpKTtmb3IoZT0wO2U8bztlKyspbltlXSYmbltlXS5maW5pc2gmJm5bZV0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIHQuZmluaXNofSl9fSksUy5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHIpe3ZhciBpPVMuZm5bcl07Uy5mbltyXT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09dHlwZW9mIGU/aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGx0KHIsITApLGUsdCxuKX19KSxTLmVhY2goe3NsaWRlRG93bjpsdCgic2hvdyIpLHNsaWRlVXA6bHQoImhpZGUiKSxzbGlkZVRvZ2dsZTpsdCgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHIpe1MuZm5bZV09ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmFuaW1hdGUocixlLHQsbil9fSksUy50aW1lcnM9W10sUy5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsdD0wLG49Uy50aW1lcnM7Zm9yKHR0PURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8Uy5meC5zdG9wKCksdHQ9dm9pZCAwfSxTLmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe1MudGltZXJzLnB1c2goZSksUy5meC5zdGFydCgpfSxTLmZ4LmludGVydmFsPTEzLFMuZnguc3RhcnQ9ZnVuY3Rpb24oKXtudHx8KG50PSEwLHN0KCkpfSxTLmZ4LnN0b3A9ZnVuY3Rpb24oKXtudD1udWxsfSxTLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxTLmZuLmRlbGF5PWZ1bmN0aW9uKHIsZSl7cmV0dXJuIHI9Uy5meCYmUy5meC5zcGVlZHNbcl18fHIsZT1lfHwiZngiLHRoaXMucXVldWUoZSxmdW5jdGlvbihlLHQpe3ZhciBuPUMuc2V0VGltZW91dChlLHIpO3Quc3RvcD1mdW5jdGlvbigpe0MuY2xlYXJUaW1lb3V0KG4pfX0pfSxydD1FLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksaXQ9RS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKS5hcHBlbmRDaGlsZChFLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxydC50eXBlPSJjaGVja2JveCIseS5jaGVja09uPSIiIT09cnQudmFsdWUseS5vcHRTZWxlY3RlZD1pdC5zZWxlY3RlZCwocnQ9RS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS52YWx1ZT0idCIscnQudHlwZT0icmFkaW8iLHkucmFkaW9WYWx1ZT0idCI9PT1ydC52YWx1ZTt2YXIgcHQsZHQ9Uy5leHByLmF0dHJIYW5kbGU7Uy5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJCh0aGlzLFMuYXR0cixlLHQsMTxhcmd1bWVudHMubGVuZ3RoKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5yZW1vdmVBdHRyKHRoaXMsZSl9KX19KSxTLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIGUuZ2V0QXR0cmlidXRlP1MucHJvcChlLHQsbik6KDE9PT1vJiZTLmlzWE1MRG9jKGUpfHwoaT1TLmF0dHJIb29rc1t0LnRvTG93ZXJDYXNlKCldfHwoUy5leHByLm1hdGNoLmJvb2wudGVzdCh0KT9wdDp2b2lkIDApKSx2b2lkIDAhPT1uP251bGw9PT1uP3ZvaWQgUy5yZW1vdmVBdHRyKGUsdCk6aSYmInNldCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6KGUuc2V0QXR0cmlidXRlKHQsbisiIiksbik6aSYmImdldCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjpudWxsPT0ocj1TLmZpbmQuYXR0cihlLHQpKT92b2lkIDA6cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIXkucmFkaW9WYWx1ZSYmInJhZGlvIj09PXQmJkEoZSwiaW5wdXQiKSl7dmFyIG49ZS52YWx1ZTtyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoInR5cGUiLHQpLG4mJihlLnZhbHVlPW4pLHR9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10JiZ0Lm1hdGNoKFApO2lmKGkmJjE9PT1lLm5vZGVUeXBlKXdoaWxlKG49aVtyKytdKWUucmVtb3ZlQXR0cmlidXRlKG4pfX0pLHB0PXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExPT09dD9TLnJlbW92ZUF0dHIoZSxuKTplLnNldEF0dHJpYnV0ZShuLG4pLG59fSxTLmVhY2goUy5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24oZSx0KXt2YXIgYT1kdFt0XXx8Uy5maW5kLmF0dHI7ZHRbdF09ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz10LnRvTG93ZXJDYXNlKCk7cmV0dXJuIG58fChpPWR0W29dLGR0W29dPXIscj1udWxsIT1hKGUsdCxuKT9vOm51bGwsZHRbb109aSkscn19KTt2YXIgaHQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxndD0vXig/OmF8YXJlYSkkL2k7ZnVuY3Rpb24gdnQoZSl7cmV0dXJuKGUubWF0Y2goUCl8fFtdKS5qb2luKCIgIil9ZnVuY3Rpb24geXQoZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24gbXQoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZToic3RyaW5nIj09dHlwZW9mIGUmJmUubWF0Y2goUCl8fFtdfVMuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJuICQodGhpcyxTLnByb3AsZSx0LDE8YXJndW1lbnRzLmxlbmd0aCl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW1MucHJvcEZpeFtlXXx8ZV19KX19KSxTLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4gMT09PW8mJlMuaXNYTUxEb2MoZSl8fCh0PVMucHJvcEZpeFt0XXx8dCxpPVMucHJvcEhvb2tzW3RdKSx2b2lkIDAhPT1uP2kmJiJzZXQiaW4gaSYmdm9pZCAwIT09KHI9aS5zZXQoZSxuLHQpKT9yOmVbdF09bjppJiYiZ2V0ImluIGkmJm51bGwhPT0ocj1pLmdldChlLHQpKT9yOmVbdF19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXt2YXIgdD1TLmZpbmQuYXR0cihlLCJ0YWJpbmRleCIpO3JldHVybiB0P3BhcnNlSW50KHQsMTApOmh0LnRlc3QoZS5ub2RlTmFtZSl8fGd0LnRlc3QoZS5ub2RlTmFtZSkmJmUuaHJlZj8wOi0xfX19LHByb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifX0pLHkub3B0U2VsZWN0ZWR8fChTLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfSxzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3QmJih0LnNlbGVjdGVkSW5kZXgsdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCl9fSksUy5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtTLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSksUy5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixpLG8sYSxzLHU9MDtpZihtKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS5hZGRDbGFzcyh0LmNhbGwodGhpcyxlLHl0KHRoaXMpKSl9KTtpZigoZT1tdCh0KSkubGVuZ3RoKXdoaWxlKG49dGhpc1t1KytdKWlmKGk9eXQobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK3Z0KGkpKyIgIil7YT0wO3doaWxlKG89ZVthKytdKXIuaW5kZXhPZigiICIrbysiICIpPDAmJihyKz1vKyIgIik7aSE9PShzPXZ0KHIpKSYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLnJlbW92ZUNsYXNzKHQuY2FsbCh0aGlzLGUseXQodGhpcykpKX0pO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmF0dHIoImNsYXNzIiwiIik7aWYoKGU9bXQodCkpLmxlbmd0aCl3aGlsZShuPXRoaXNbdSsrXSlpZihpPXl0KG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIit2dChpKSsiICIpe2E9MDt3aGlsZShvPWVbYSsrXSl3aGlsZSgtMTxyLmluZGV4T2YoIiAiK28rIiAiKSlyPXIucmVwbGFjZSgiICIrbysiICIsIiAiKTtpIT09KHM9dnQocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihpLHQpe3ZhciBvPXR5cGVvZiBpLGE9InN0cmluZyI9PT1vfHxBcnJheS5pc0FycmF5KGkpO3JldHVybiJib29sZWFuIj09dHlwZW9mIHQmJmE/dD90aGlzLmFkZENsYXNzKGkpOnRoaXMucmVtb3ZlQ2xhc3MoaSk6bShpKT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS50b2dnbGVDbGFzcyhpLmNhbGwodGhpcyxlLHl0KHRoaXMpLHQpLHQpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI7aWYoYSl7dD0wLG49Uyh0aGlzKSxyPW10KGkpO3doaWxlKGU9clt0KytdKW4uaGFzQ2xhc3MoZSk/bi5yZW1vdmVDbGFzcyhlKTpuLmFkZENsYXNzKGUpfWVsc2Ugdm9pZCAwIT09aSYmImJvb2xlYW4iIT09b3x8KChlPXl0KHRoaXMpKSYmWS5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsZSksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsZXx8ITE9PT1pPyIiOlkuZ2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpKX0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHI9MDt0PSIgIitlKyIgIjt3aGlsZShuPXRoaXNbcisrXSlpZigxPT09bi5ub2RlVHlwZSYmLTE8KCIgIit2dCh5dChuKSkrIiAiKS5pbmRleE9mKHQpKXJldHVybiEwO3JldHVybiExfX0pO3ZhciB4dD0vXHIvZztTLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKG4pe3ZhciByLGUsaSx0PXRoaXNbMF07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bShuKSx0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIHQ7MT09PXRoaXMubm9kZVR5cGUmJihudWxsPT0odD1pP24uY2FsbCh0aGlzLGUsUyh0aGlzKS52YWwoKSk6bik/dD0iIjoibnVtYmVyIj09dHlwZW9mIHQ/dCs9IiI6QXJyYXkuaXNBcnJheSh0KSYmKHQ9Uy5tYXAodCxmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjplKyIifSkpLChyPVMudmFsSG9va3NbdGhpcy50eXBlXXx8Uy52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmInNldCJpbiByJiZ2b2lkIDAhPT1yLnNldCh0aGlzLHQsInZhbHVlIil8fCh0aGlzLnZhbHVlPXQpKX0pKTp0PyhyPVMudmFsSG9va3NbdC50eXBlXXx8Uy52YWxIb29rc1t0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiByJiZ2b2lkIDAhPT0oZT1yLmdldCh0LCJ2YWx1ZSIpKT9lOiJzdHJpbmciPT10eXBlb2YoZT10LnZhbHVlKT9lLnJlcGxhY2UoeHQsIiIpOm51bGw9PWU/IiI6ZTp2b2lkIDB9fSksUy5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD1TLmZpbmQuYXR0cihlLCJ2YWx1ZSIpO3JldHVybiBudWxsIT10P3Q6dnQoUy50ZXh0KGUpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPWUub3B0aW9ucyxvPWUuc2VsZWN0ZWRJbmRleCxhPSJzZWxlY3Qtb25lIj09PWUudHlwZSxzPWE/bnVsbDpbXSx1PWE/bysxOmkubGVuZ3RoO2ZvcihyPW88MD91OmE/bzowO3I8dTtyKyspaWYoKChuPWlbcl0pLnNlbGVjdGVkfHxyPT09bykmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IUEobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD1TKG4pLnZhbCgpLGEpcmV0dXJuIHQ7cy5wdXNoKHQpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89Uy5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pKChyPWlbYV0pLnNlbGVjdGVkPS0xPFMuaW5BcnJheShTLnZhbEhvb2tzLm9wdGlvbi5nZXQociksbykpJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX19KSxTLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtTLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBlLmNoZWNrZWQ9LTE8Uy5pbkFycmF5KFMoZSkudmFsKCksdCl9fSx5LmNoZWNrT258fChTLnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPyJvbiI6ZS52YWx1ZX0pfSkseS5mb2N1c2luPSJvbmZvY3VzaW4iaW4gQzt2YXIgYnQ9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLHd0PWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9O1MuZXh0ZW5kKFMuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsLGMsZixwPVtufHxFXSxkPXYuY2FsbChlLCJ0eXBlIik/ZS50eXBlOmUsaD12LmNhbGwoZSwibmFtZXNwYWNlIik/ZS5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihvPWY9YT1uPW58fEUsMyE9PW4ubm9kZVR5cGUmJjghPT1uLm5vZGVUeXBlJiYhYnQudGVzdChkK1MuZXZlbnQudHJpZ2dlcmVkKSYmKC0xPGQuaW5kZXhPZigiLiIpJiYoZD0oaD1kLnNwbGl0KCIuIikpLnNoaWZ0KCksaC5zb3J0KCkpLHU9ZC5pbmRleE9mKCI6Iik8MCYmIm9uIitkLChlPWVbUy5leHBhbmRvXT9lOm5ldyBTLkV2ZW50KGQsIm9iamVjdCI9PXR5cGVvZiBlJiZlKSkuaXNUcmlnZ2VyPXI/MjozLGUubmFtZXNwYWNlPWguam9pbigiLiIpLGUucm5hbWVzcGFjZT1lLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitoLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsZS5yZXN1bHQ9dm9pZCAwLGUudGFyZ2V0fHwoZS50YXJnZXQ9biksdD1udWxsPT10P1tlXTpTLm1ha2VBcnJheSh0LFtlXSksYz1TLmV2ZW50LnNwZWNpYWxbZF18fHt9LHJ8fCFjLnRyaWdnZXJ8fCExIT09Yy50cmlnZ2VyLmFwcGx5KG4sdCkpKXtpZighciYmIWMubm9CdWJibGUmJiF4KG4pKXtmb3Iocz1jLmRlbGVnYXRlVHlwZXx8ZCxidC50ZXN0KHMrZCl8fChvPW8ucGFyZW50Tm9kZSk7bztvPW8ucGFyZW50Tm9kZSlwLnB1c2gobyksYT1vO2E9PT0obi5vd25lckRvY3VtZW50fHxFKSYmcC5wdXNoKGEuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93fHxDKX1pPTA7d2hpbGUoKG89cFtpKytdKSYmIWUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlmPW8sZS50eXBlPTE8aT9zOmMuYmluZFR5cGV8fGQsKGw9KFkuZ2V0KG8sImV2ZW50cyIpfHxPYmplY3QuY3JlYXRlKG51bGwpKVtlLnR5cGVdJiZZLmdldChvLCJoYW5kbGUiKSkmJmwuYXBwbHkobyx0KSwobD11JiZvW3VdKSYmbC5hcHBseSYmVihvKSYmKGUucmVzdWx0PWwuYXBwbHkobyx0KSwhMT09PWUucmVzdWx0JiZlLnByZXZlbnREZWZhdWx0KCkpO3JldHVybiBlLnR5cGU9ZCxyfHxlLmlzRGVmYXVsdFByZXZlbnRlZCgpfHxjLl9kZWZhdWx0JiYhMSE9PWMuX2RlZmF1bHQuYXBwbHkocC5wb3AoKSx0KXx8IVYobil8fHUmJm0obltkXSkmJiF4KG4pJiYoKGE9blt1XSkmJihuW3VdPW51bGwpLFMuZXZlbnQudHJpZ2dlcmVkPWQsZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZmLmFkZEV2ZW50TGlzdGVuZXIoZCx3dCksbltkXSgpLGUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmZi5yZW1vdmVFdmVudExpc3RlbmVyKGQsd3QpLFMuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxhJiYoblt1XT1hKSksZS5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9Uy5leHRlbmQobmV3IFMuRXZlbnQsbix7dHlwZTplLGlzU2ltdWxhdGVkOiEwfSk7Uy5ldmVudC50cmlnZ2VyKHIsbnVsbCx0KX19KSxTLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LnRyaWdnZXIoZSx0LHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpc1swXTtpZihuKXJldHVybiBTLmV2ZW50LnRyaWdnZXIoZSx0LG4sITApfX0pLHkuZm9jdXNpbnx8Uy5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihuLHIpe3ZhciBpPWZ1bmN0aW9uKGUpe1MuZXZlbnQuc2ltdWxhdGUocixlLnRhcmdldCxTLmV2ZW50LmZpeChlKSl9O1MuZXZlbnQuc3BlY2lhbFtyXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jdW1lbnR8fHRoaXMsdD1ZLmFjY2VzcyhlLHIpO3R8fGUuYWRkRXZlbnRMaXN0ZW5lcihuLGksITApLFkuYWNjZXNzKGUsciwodHx8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLmRvY3VtZW50fHx0aGlzLHQ9WS5hY2Nlc3MoZSxyKS0xO3Q/WS5hY2Nlc3MoZSxyLHQpOihlLnJlbW92ZUV2ZW50TGlzdGVuZXIobixpLCEwKSxZLnJlbW92ZShlLHIpKX19fSk7dmFyIFR0PUMubG9jYXRpb24sQ3Q9e2d1aWQ6RGF0ZS5ub3coKX0sRXQ9L1w/LztTLnBhcnNlWE1MPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7dHJ5e3Q9KG5ldyBDLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGUsInRleHQveG1sIil9Y2F0Y2goZSl7dD12b2lkIDB9cmV0dXJuIHQmJiF0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8Uy5lcnJvcigiSW52YWxpZCBYTUw6ICIrZSksdH07dmFyIFN0PS9cW1xdJC8sa3Q9L1xyP1xuL2csQXQ9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLE50PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBEdChuLGUscixpKXt2YXIgdDtpZihBcnJheS5pc0FycmF5KGUpKVMuZWFjaChlLGZ1bmN0aW9uKGUsdCl7cnx8U3QudGVzdChuKT9pKG4sdCk6RHQobisiWyIrKCJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9dD9lOiIiKSsiXSIsdCxyLGkpfSk7ZWxzZSBpZihyfHwib2JqZWN0IiE9PXcoZSkpaShuLGUpO2Vsc2UgZm9yKHQgaW4gZSlEdChuKyJbIit0KyJdIixlW3RdLHIsaSl9Uy5wYXJhbT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1mdW5jdGlvbihlLHQpe3ZhciBuPW0odCk/dCgpOnQ7cltyLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj8iIjpuKX07aWYobnVsbD09ZSlyZXR1cm4iIjtpZihBcnJheS5pc0FycmF5KGUpfHxlLmpxdWVyeSYmIVMuaXNQbGFpbk9iamVjdChlKSlTLmVhY2goZSxmdW5jdGlvbigpe2kodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IobiBpbiBlKUR0KG4sZVtuXSx0LGkpO3JldHVybiByLmpvaW4oIiYiKX0sUy5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBTLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9Uy5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGU/Uy5tYWtlQXJyYXkoZSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYhUyh0aGlzKS5pcygiOmRpc2FibGVkIikmJk50LnRlc3QodGhpcy5ub2RlTmFtZSkmJiFBdC50ZXN0KGUpJiYodGhpcy5jaGVja2VkfHwhcGUudGVzdChlKSl9KS5tYXAoZnVuY3Rpb24oZSx0KXt2YXIgbj1TKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6QXJyYXkuaXNBcnJheShuKT9TLm1hcChuLGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2Uoa3QsIlxyXG4iKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKGt0LCJcclxuIil9fSkuZ2V0KCl9fSk7dmFyIGp0PS8lMjAvZyxxdD0vIy4qJC8sTHQ9LyhbPyZdKV89W14mXSovLEh0PS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKSQvZ20sT3Q9L14oPzpHRVR8SEVBRCkkLyxQdD0vXlwvXC8vLFJ0PXt9LE10PXt9LEl0PSIqLyIuY29uY2F0KCIqIiksV3Q9RS5jcmVhdGVFbGVtZW50KCJhIik7ZnVuY3Rpb24gRnQobyl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7InN0cmluZyIhPXR5cGVvZiBlJiYodD1lLGU9IioiKTt2YXIgbixyPTAsaT1lLnRvTG93ZXJDYXNlKCkubWF0Y2goUCl8fFtdO2lmKG0odCkpd2hpbGUobj1pW3IrK10pIisiPT09blswXT8obj1uLnNsaWNlKDEpfHwiKiIsKG9bbl09b1tuXXx8W10pLnVuc2hpZnQodCkpOihvW25dPW9bbl18fFtdKS5wdXNoKHQpfX1mdW5jdGlvbiBCdCh0LGksbyxhKXt2YXIgcz17fSx1PXQ9PT1NdDtmdW5jdGlvbiBsKGUpe3ZhciByO3JldHVybiBzW2VdPSEwLFMuZWFjaCh0W2VdfHxbXSxmdW5jdGlvbihlLHQpe3ZhciBuPXQoaSxvLGEpO3JldHVybiJzdHJpbmciIT10eXBlb2Ygbnx8dXx8c1tuXT91PyEocj1uKTp2b2lkIDA6KGkuZGF0YVR5cGVzLnVuc2hpZnQobiksbChuKSwhMSl9KSxyfXJldHVybiBsKGkuZGF0YVR5cGVzWzBdKXx8IXNbIioiXSYmbCgiKiIpfWZ1bmN0aW9uICR0KGUsdCl7dmFyIG4scixpPVMuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiB0KXZvaWQgMCE9PXRbbl0mJigoaVtuXT9lOnJ8fChyPXt9KSlbbl09dFtuXSk7cmV0dXJuIHImJlMuZXh0ZW5kKCEwLGUsciksZX1XdC5ocmVmPVR0LmhyZWYsUy5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOlR0LmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOi9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLnRlc3QoVHQucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6SXQsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOlMucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0PyR0KCR0KGUsUy5hamF4U2V0dGluZ3MpLHQpOiR0KFMuYWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOkZ0KFJ0KSxhamF4VHJhbnNwb3J0OkZ0KE10KSxhamF4OmZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBlJiYodD1lLGU9dm9pZCAwKSx0PXR8fHt9O3ZhciBjLGYscCxuLGQscixoLGcsaSxvLHY9Uy5hamF4U2V0dXAoe30sdCkseT12LmNvbnRleHR8fHYsbT12LmNvbnRleHQmJih5Lm5vZGVUeXBlfHx5LmpxdWVyeSk/Uyh5KTpTLmV2ZW50LHg9Uy5EZWZlcnJlZCgpLGI9Uy5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksdz12LnN0YXR1c0NvZGV8fHt9LGE9e30scz17fSx1PSJjYW5jZWxlZCIsVD17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGgpe2lmKCFuKXtuPXt9O3doaWxlKHQ9SHQuZXhlYyhwKSluW3RbMV0udG9Mb3dlckNhc2UoKSsiICJdPShuW3RbMV0udG9Mb3dlckNhc2UoKSsiICJdfHxbXSkuY29uY2F0KHRbMl0pfXQ9bltlLnRvTG93ZXJDYXNlKCkrIiAiXX1yZXR1cm4gbnVsbD09dD9udWxsOnQuam9pbigiLCAiKX0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGg/cDpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWgmJihlPXNbZS50b0xvd2VyQ2FzZSgpXT1zW2UudG9Mb3dlckNhc2UoKV18fGUsYVtlXT10KSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1oJiYodi5taW1lVHlwZT1lKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGUpaWYoaClULmFsd2F5cyhlW1Quc3RhdHVzXSk7ZWxzZSBmb3IodCBpbiBlKXdbdF09W3dbdF0sZVt0XV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGUpe3ZhciB0PWV8fHU7cmV0dXJuIGMmJmMuYWJvcnQodCksbCgwLHQpLHRoaXN9fTtpZih4LnByb21pc2UoVCksdi51cmw9KChlfHx2LnVybHx8VHQuaHJlZikrIiIpLnJlcGxhY2UoUHQsVHQucHJvdG9jb2wrIi8vIiksdi50eXBlPXQubWV0aG9kfHx0LnR5cGV8fHYubWV0aG9kfHx2LnR5cGUsdi5kYXRhVHlwZXM9KHYuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChQKXx8WyIiXSxudWxsPT12LmNyb3NzRG9tYWluKXtyPUUuY3JlYXRlRWxlbWVudCgiYSIpO3RyeXtyLmhyZWY9di51cmwsci5ocmVmPXIuaHJlZix2LmNyb3NzRG9tYWluPVd0LnByb3RvY29sKyIvLyIrV3QuaG9zdCE9ci5wcm90b2NvbCsiLy8iK3IuaG9zdH1jYXRjaChlKXt2LmNyb3NzRG9tYWluPSEwfX1pZih2LmRhdGEmJnYucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2Ygdi5kYXRhJiYodi5kYXRhPVMucGFyYW0odi5kYXRhLHYudHJhZGl0aW9uYWwpKSxCdChSdCx2LHQsVCksaClyZXR1cm4gVDtmb3IoaSBpbihnPVMuZXZlbnQmJnYuZ2xvYmFsKSYmMD09Uy5hY3RpdmUrKyYmUy5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSx2LnR5cGU9di50eXBlLnRvVXBwZXJDYXNlKCksdi5oYXNDb250ZW50PSFPdC50ZXN0KHYudHlwZSksZj12LnVybC5yZXBsYWNlKHF0LCIiKSx2Lmhhc0NvbnRlbnQ/di5kYXRhJiZ2LnByb2Nlc3NEYXRhJiYwPT09KHYuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmKHYuZGF0YT12LmRhdGEucmVwbGFjZShqdCwiKyIpKToobz12LnVybC5zbGljZShmLmxlbmd0aCksdi5kYXRhJiYodi5wcm9jZXNzRGF0YXx8InN0cmluZyI9PXR5cGVvZiB2LmRhdGEpJiYoZis9KEV0LnRlc3QoZik/IiYiOiI/Iikrdi5kYXRhLGRlbGV0ZSB2LmRhdGEpLCExPT09di5jYWNoZSYmKGY9Zi5yZXBsYWNlKEx0LCIkMSIpLG89KEV0LnRlc3QoZik/IiYiOiI/IikrIl89IitDdC5ndWlkKysrbyksdi51cmw9ZitvKSx2LmlmTW9kaWZpZWQmJihTLmxhc3RNb2RpZmllZFtmXSYmVC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsUy5sYXN0TW9kaWZpZWRbZl0pLFMuZXRhZ1tmXSYmVC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixTLmV0YWdbZl0pKSwodi5kYXRhJiZ2Lmhhc0NvbnRlbnQmJiExIT09di5jb250ZW50VHlwZXx8dC5jb250ZW50VHlwZSkmJlQuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIix2LmNvbnRlbnRUeXBlKSxULnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsdi5kYXRhVHlwZXNbMF0mJnYuYWNjZXB0c1t2LmRhdGFUeXBlc1swXV0/di5hY2NlcHRzW3YuZGF0YVR5cGVzWzBdXSsoIioiIT09di5kYXRhVHlwZXNbMF0/IiwgIitJdCsiOyBxPTAuMDEiOiIiKTp2LmFjY2VwdHNbIioiXSksdi5oZWFkZXJzKVQuc2V0UmVxdWVzdEhlYWRlcihpLHYuaGVhZGVyc1tpXSk7aWYodi5iZWZvcmVTZW5kJiYoITE9PT12LmJlZm9yZVNlbmQuY2FsbCh5LFQsdil8fGgpKXJldHVybiBULmFib3J0KCk7aWYodT0iYWJvcnQiLGIuYWRkKHYuY29tcGxldGUpLFQuZG9uZSh2LnN1Y2Nlc3MpLFQuZmFpbCh2LmVycm9yKSxjPUJ0KE10LHYsdCxUKSl7aWYoVC5yZWFkeVN0YXRlPTEsZyYmbS50cmlnZ2VyKCJhamF4U2VuZCIsW1Qsdl0pLGgpcmV0dXJuIFQ7di5hc3luYyYmMDx2LnRpbWVvdXQmJihkPUMuc2V0VGltZW91dChmdW5jdGlvbigpe1QuYWJvcnQoInRpbWVvdXQiKX0sdi50aW1lb3V0KSk7dHJ5e2g9ITEsYy5zZW5kKGEsbCl9Y2F0Y2goZSl7aWYoaCl0aHJvdyBlO2woLTEsZSl9fWVsc2UgbCgtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gbChlLHQsbixyKXt2YXIgaSxvLGEscyx1LGw9dDtofHwoaD0hMCxkJiZDLmNsZWFyVGltZW91dChkKSxjPXZvaWQgMCxwPXJ8fCIiLFQucmVhZHlTdGF0ZT0wPGU/NDowLGk9MjAwPD1lJiZlPDMwMHx8MzA0PT09ZSxuJiYocz1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscz1lLmNvbnRlbnRzLHU9ZS5kYXRhVHlwZXM7d2hpbGUoIioiPT09dVswXSl1LnNoaWZ0KCksdm9pZCAwPT09ciYmKHI9ZS5taW1lVHlwZXx8dC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKHIpZm9yKGkgaW4gcylpZihzW2ldJiZzW2ldLnRlc3Qocikpe3UudW5zaGlmdChpKTticmVha31pZih1WzBdaW4gbilvPXVbMF07ZWxzZXtmb3IoaSBpbiBuKXtpZighdVswXXx8ZS5jb252ZXJ0ZXJzW2krIiAiK3VbMF1dKXtvPWk7YnJlYWt9YXx8KGE9aSl9bz1vfHxhfWlmKG8pcmV0dXJuIG8hPT11WzBdJiZ1LnVuc2hpZnQobyksbltvXX0odixULG4pKSwhaSYmLTE8Uy5pbkFycmF5KCJzY3JpcHQiLHYuZGF0YVR5cGVzKSYmKHYuY29udmVydGVyc1sidGV4dCBzY3JpcHQiXT1mdW5jdGlvbigpe30pLHM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPXt9LGM9ZS5kYXRhVHlwZXMuc2xpY2UoKTtpZihjWzFdKWZvcihhIGluIGUuY29udmVydGVycylsW2EudG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW2FdO289Yy5zaGlmdCgpO3doaWxlKG8paWYoZS5yZXNwb25zZUZpZWxkc1tvXSYmKG5bZS5yZXNwb25zZUZpZWxkc1tvXV09dCksIXUmJnImJmUuZGF0YUZpbHRlciYmKHQ9ZS5kYXRhRmlsdGVyKHQsZS5kYXRhVHlwZSkpLHU9byxvPWMuc2hpZnQoKSlpZigiKiI9PT1vKW89dTtlbHNlIGlmKCIqIiE9PXUmJnUhPT1vKXtpZighKGE9bFt1KyIgIitvXXx8bFsiKiAiK29dKSlmb3IoaSBpbiBsKWlmKChzPWkuc3BsaXQoIiAiKSlbMV09PT1vJiYoYT1sW3UrIiAiK3NbMF1dfHxsWyIqICIrc1swXV0pKXshMD09PWE/YT1sW2ldOiEwIT09bFtpXSYmKG89c1swXSxjLnVuc2hpZnQoc1sxXSkpO2JyZWFrfWlmKCEwIT09YSlpZihhJiZlWyJ0aHJvd3MiXSl0PWEodCk7ZWxzZSB0cnl7dD1hKHQpfWNhdGNoKGUpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmE/ZToiTm8gY29udmVyc2lvbiBmcm9tICIrdSsiIHRvICIrb319fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTp0fX0odixzLFQsaSksaT8odi5pZk1vZGlmaWVkJiYoKHU9VC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKSYmKFMubGFzdE1vZGlmaWVkW2ZdPXUpLCh1PVQuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSkmJihTLmV0YWdbZl09dSkpLDIwND09PWV8fCJIRUFEIj09PXYudHlwZT9sPSJub2NvbnRlbnQiOjMwND09PWU/bD0ibm90bW9kaWZpZWQiOihsPXMuc3RhdGUsbz1zLmRhdGEsaT0hKGE9cy5lcnJvcikpKTooYT1sLCFlJiZsfHwobD0iZXJyb3IiLGU8MCYmKGU9MCkpKSxULnN0YXR1cz1lLFQuc3RhdHVzVGV4dD0odHx8bCkrIiIsaT94LnJlc29sdmVXaXRoKHksW28sbCxUXSk6eC5yZWplY3RXaXRoKHksW1QsbCxhXSksVC5zdGF0dXNDb2RlKHcpLHc9dm9pZCAwLGcmJm0udHJpZ2dlcihpPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW1QsdixpP286YV0pLGIuZmlyZVdpdGgoeSxbVCxsXSksZyYmKG0udHJpZ2dlcigiYWpheENvbXBsZXRlIixbVCx2XSksLS1TLmFjdGl2ZXx8Uy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIFR9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBTLmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gUy5nZXQoZSx2b2lkIDAsdCwic2NyaXB0Iil9fSksUy5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsaSl7U1tpXT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbSh0KSYmKHI9cnx8bixuPXQsdD12b2lkIDApLFMuYWpheChTLmV4dGVuZCh7dXJsOmUsdHlwZTppLGRhdGFUeXBlOnIsZGF0YTp0LHN1Y2Nlc3M6bn0sUy5pc1BsYWluT2JqZWN0KGUpJiZlKSl9fSksUy5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUuaGVhZGVycykiY29udGVudC10eXBlIj09PXQudG9Mb3dlckNhc2UoKSYmKGUuY29udGVudFR5cGU9ZS5oZWFkZXJzW3RdfHwiIil9KSxTLl9ldmFsVXJsPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gUy5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKCl7fX0sZGF0YUZpbHRlcjpmdW5jdGlvbihlKXtTLmdsb2JhbEV2YWwoZSx0LG4pfX0pfSxTLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpc1swXSYmKG0oZSkmJihlPWUuY2FsbCh0aGlzWzBdKSksdD1TKGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCksdGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdEVsZW1lbnRDaGlsZCllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihuKXtyZXR1cm4gbShuKT90aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS53cmFwSW5uZXIobi5jYWxsKHRoaXMsZSkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9Uyh0aGlzKSx0PWUuY29udGVudHMoKTt0Lmxlbmd0aD90LndyYXBBbGwobik6ZS5hcHBlbmQobil9KX0sd3JhcDpmdW5jdGlvbih0KXt2YXIgbj1tKHQpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS53cmFwQWxsKG4/dC5jYWxsKHRoaXMsZSk6dCl9KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7Uyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxTLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIVMuZXhwci5wc2V1ZG9zLnZpc2libGUoZSl9LFMuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuISEoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxTLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBDLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBfdD17MDoyMDAsMTIyMzoyMDR9LHp0PVMuYWpheFNldHRpbmdzLnhocigpO3kuY29ycz0hIXp0JiYid2l0aENyZWRlbnRpYWxzImluIHp0LHkuYWpheD16dD0hIXp0LFMuYWpheFRyYW5zcG9ydChmdW5jdGlvbihpKXt2YXIgbyxhO2lmKHkuY29yc3x8enQmJiFpLmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1pLnhocigpO2lmKHIub3BlbihpLnR5cGUsaS51cmwsaS5hc3luYyxpLnVzZXJuYW1lLGkucGFzc3dvcmQpLGkueGhyRmllbGRzKWZvcihuIGluIGkueGhyRmllbGRzKXJbbl09aS54aHJGaWVsZHNbbl07Zm9yKG4gaW4gaS5taW1lVHlwZSYmci5vdmVycmlkZU1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUoaS5taW1lVHlwZSksaS5jcm9zc0RvbWFpbnx8ZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoZVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpLGUpci5zZXRSZXF1ZXN0SGVhZGVyKG4sZVtuXSk7bz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtvJiYobz1hPXIub25sb2FkPXIub25lcnJvcj1yLm9uYWJvcnQ9ci5vbnRpbWVvdXQ9ci5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09ZT9yLmFib3J0KCk6ImVycm9yIj09PWU/Im51bWJlciIhPXR5cGVvZiByLnN0YXR1cz90KDAsImVycm9yIik6dChyLnN0YXR1cyxyLnN0YXR1c1RleHQpOnQoX3Rbci5zdGF0dXNdfHxyLnN0YXR1cyxyLnN0YXR1c1RleHQsInRleHQiIT09KHIucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIHIucmVzcG9uc2VUZXh0P3tiaW5hcnk6ci5yZXNwb25zZX06e3RleHQ6ci5yZXNwb25zZVRleHR9LHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHIub25sb2FkPW8oKSxhPXIub25lcnJvcj1yLm9udGltZW91dD1vKCJlcnJvciIpLHZvaWQgMCE9PXIub25hYm9ydD9yLm9uYWJvcnQ9YTpyLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1yLnJlYWR5U3RhdGUmJkMuc2V0VGltZW91dChmdW5jdGlvbigpe28mJmEoKX0pfSxvPW8oImFib3J0Iik7dHJ5e3Iuc2VuZChpLmhhc0NvbnRlbnQmJmkuZGF0YXx8bnVsbCl9Y2F0Y2goZSl7aWYobyl0aHJvdyBlfX0sYWJvcnQ6ZnVuY3Rpb24oKXtvJiZvKCl9fX0pLFMuYWpheFByZWZpbHRlcihmdW5jdGlvbihlKXtlLmNyb3NzRG9tYWluJiYoZS5jb250ZW50cy5zY3JpcHQ9ITEpfSksUy5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIFMuZ2xvYmFsRXZhbChlKSxlfX19KSxTLmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS5jYWNoZSYmKGUuY2FjaGU9ITEpLGUuY3Jvc3NEb21haW4mJihlLnR5cGU9IkdFVCIpfSksUy5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKG4pe3ZhciByLGk7aWYobi5jcm9zc0RvbWFpbnx8bi5zY3JpcHRBdHRycylyZXR1cm57c2VuZDpmdW5jdGlvbihlLHQpe3I9UygiPHNjcmlwdD4iKS5hdHRyKG4uc2NyaXB0QXR0cnN8fHt9KS5wcm9wKHtjaGFyc2V0Om4uc2NyaXB0Q2hhcnNldCxzcmM6bi51cmx9KS5vbigibG9hZCBlcnJvciIsaT1mdW5jdGlvbihlKXtyLnJlbW92ZSgpLGk9bnVsbCxlJiZ0KCJlcnJvciI9PT1lLnR5cGU/NDA0OjIwMCxlLnR5cGUpfSksRS5oZWFkLmFwcGVuZENoaWxkKHJbMF0pfSxhYm9ydDpmdW5jdGlvbigpe2kmJmkoKX19fSk7dmFyIFV0LFh0PVtdLFZ0PS8oPSlcPyg/PSZ8JCl8XD9cPy87Uy5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPVh0LnBvcCgpfHxTLmV4cGFuZG8rIl8iK0N0Lmd1aWQrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLFMuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPSExIT09ZS5qc29ucCYmKFZ0LnRlc3QoZS51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgZS5kYXRhJiYwPT09KGUuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmVnQudGVzdChlLmRhdGEpJiYiZGF0YSIpO2lmKGF8fCJqc29ucCI9PT1lLmRhdGFUeXBlc1swXSlyZXR1cm4gcj1lLmpzb25wQ2FsbGJhY2s9bShlLmpzb25wQ2FsbGJhY2spP2UuanNvbnBDYWxsYmFjaygpOmUuanNvbnBDYWxsYmFjayxhP2VbYV09ZVthXS5yZXBsYWNlKFZ0LCIkMSIrcik6ITEhPT1lLmpzb25wJiYoZS51cmwrPShFdC50ZXN0KGUudXJsKT8iJiI6Ij8iKStlLmpzb25wKyI9IityKSxlLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gb3x8Uy5lcnJvcihyKyIgd2FzIG5vdCBjYWxsZWQiKSxvWzBdfSxlLmRhdGFUeXBlc1swXT0ianNvbiIsaT1DW3JdLENbcl09ZnVuY3Rpb24oKXtvPWFyZ3VtZW50c30sbi5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1pP1MoQykucmVtb3ZlUHJvcChyKTpDW3JdPWksZVtyXSYmKGUuanNvbnBDYWxsYmFjaz10Lmpzb25wQ2FsbGJhY2ssWHQucHVzaChyKSksbyYmbShpKSYmaShvWzBdKSxvPWk9dm9pZCAwfSksInNjcmlwdCJ9KSx5LmNyZWF0ZUhUTUxEb2N1bWVudD0oKFV0PUUuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKS5ib2R5KS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IiwyPT09VXQuY2hpbGROb2Rlcy5sZW5ndGgpLFMucGFyc2VIVE1MPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGU/W106KCJib29sZWFuIj09dHlwZW9mIHQmJihuPXQsdD0hMSksdHx8KHkuY3JlYXRlSFRNTERvY3VtZW50Pygocj0odD1FLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikpLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSkuaHJlZj1FLmxvY2F0aW9uLmhyZWYsdC5oZWFkLmFwcGVuZENoaWxkKHIpKTp0PUUpLG89IW4mJltdLChpPU4uZXhlYyhlKSk/W3QuY3JlYXRlRWxlbWVudChpWzFdKV06KGk9eGUoW2VdLHQsbyksbyYmby5sZW5ndGgmJlMobykucmVtb3ZlKCksUy5tZXJnZShbXSxpLmNoaWxkTm9kZXMpKSk7dmFyIHIsaSxvfSxTLmZuLmxvYWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhPXRoaXMscz1lLmluZGV4T2YoIiAiKTtyZXR1cm4tMTxzJiYocj12dChlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksbSh0KT8obj10LHQ9dm9pZCAwKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIiksMDxhLmxlbmd0aCYmUy5hamF4KHt1cmw6ZSx0eXBlOml8fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOnR9KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLGEuaHRtbChyP1MoIjxkaXY+IikuYXBwZW5kKFMucGFyc2VIVE1MKGUpKS5maW5kKHIpOmUpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKGUsdCl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pfSksdGhpc30sUy5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIFMuZ3JlcChTLnRpbWVycyxmdW5jdGlvbihlKXtyZXR1cm4gdD09PWUuZWxlbX0pLmxlbmd0aH0sUy5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGw9Uy5jc3MoZSwicG9zaXRpb24iKSxjPVMoZSksZj17fTsic3RhdGljIj09PWwmJihlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHM9Yy5vZmZzZXQoKSxvPVMuY3NzKGUsInRvcCIpLHU9Uy5jc3MoZSwibGVmdCIpLCgiYWJzb2x1dGUiPT09bHx8ImZpeGVkIj09PWwpJiYtMTwobyt1KS5pbmRleE9mKCJhdXRvIik/KGE9KHI9Yy5wb3NpdGlvbigpKS50b3AsaT1yLmxlZnQpOihhPXBhcnNlRmxvYXQobyl8fDAsaT1wYXJzZUZsb2F0KHUpfHwwKSxtKHQpJiYodD10LmNhbGwoZSxuLFMuZXh0ZW5kKHt9LHMpKSksbnVsbCE9dC50b3AmJihmLnRvcD10LnRvcC1zLnRvcCthKSxudWxsIT10LmxlZnQmJihmLmxlZnQ9dC5sZWZ0LXMubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxmKTooIm51bWJlciI9PXR5cGVvZiBmLnRvcCYmKGYudG9wKz0icHgiKSwibnVtYmVyIj09dHlwZW9mIGYubGVmdCYmKGYubGVmdCs9InB4IiksYy5jc3MoZikpfX0sUy5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbih0KXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLHQsZSl9KTt2YXIgZSxuLHI9dGhpc1swXTtyZXR1cm4gcj9yLmdldENsaWVudFJlY3RzKCkubGVuZ3RoPyhlPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1yLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcse3RvcDplLnRvcCtuLnBhZ2VZT2Zmc2V0LGxlZnQ6ZS5sZWZ0K24ucGFnZVhPZmZzZXR9KTp7dG9wOjAsbGVmdDowfTp2b2lkIDB9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuLHI9dGhpc1swXSxpPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT1TLmNzcyhyLCJwb3NpdGlvbiIpKXQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle3Q9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCxlPXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDt3aGlsZShlJiYoZT09PW4uYm9keXx8ZT09PW4uZG9jdW1lbnRFbGVtZW50KSYmInN0YXRpYyI9PT1TLmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5wYXJlbnROb2RlO2UmJmUhPT1yJiYxPT09ZS5ub2RlVHlwZSYmKChpPVMoZSkub2Zmc2V0KCkpLnRvcCs9Uy5jc3MoZSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxpLmxlZnQrPVMuY3NzKGUsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOnQudG9wLWkudG9wLVMuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LWkubGVmdC1TLmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnQ7d2hpbGUoZSYmInN0YXRpYyI9PT1TLmNzcyhlLCJwb3NpdGlvbiIpKWU9ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGV8fHJlfSl9fSksUy5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKHQsaSl7dmFyIG89InBhZ2VZT2Zmc2V0Ij09PWk7Uy5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZih4KGUpP3I9ZTo5PT09ZS5ub2RlVHlwZSYmKHI9ZS5kZWZhdWx0Vmlldyksdm9pZCAwPT09bilyZXR1cm4gcj9yW2ldOmVbdF07cj9yLnNjcm9sbFRvKG8/ci5wYWdlWE9mZnNldDpuLG8/bjpyLnBhZ2VZT2Zmc2V0KTplW3RdPW59LHQsZSxhcmd1bWVudHMubGVuZ3RoKX19KSxTLmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSxuKXtTLmNzc0hvb2tzW25dPSRlKHkucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuIHQ9QmUoZSxuKSxNZS50ZXN0KHQpP1MoZSkucG9zaXRpb24oKVtuXSsicHgiOnR9KX0pLFMuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGEscyl7Uy5lYWNoKHtwYWRkaW5nOiJpbm5lciIrYSxjb250ZW50OnMsIiI6Im91dGVyIithfSxmdW5jdGlvbihyLG8pe1MuZm5bb109ZnVuY3Rpb24oZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoJiYocnx8ImJvb2xlYW4iIT10eXBlb2YgZSksaT1yfHwoITA9PT1lfHwhMD09PXQ/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiAkKHRoaXMsZnVuY3Rpb24oZSx0LG4pe3ZhciByO3JldHVybiB4KGUpPzA9PT1vLmluZGV4T2YoIm91dGVyIik/ZVsiaW5uZXIiK2FdOmUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2FdOjk9PT1lLm5vZGVUeXBlPyhyPWUuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KGUuYm9keVsic2Nyb2xsIithXSxyWyJzY3JvbGwiK2FdLGUuYm9keVsib2Zmc2V0IithXSxyWyJvZmZzZXQiK2FdLHJbImNsaWVudCIrYV0pKTp2b2lkIDA9PT1uP1MuY3NzKGUsdCxpKTpTLnN0eWxlKGUsdCxuLGkpfSxzLG4/ZTp2b2lkIDAsbil9fSl9KSxTLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihlLHQpe1MuZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub24odCxlKX19KSxTLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIsbil9LGhvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubW91c2VlbnRlcihlKS5tb3VzZWxlYXZlKHR8fGUpfX0pLFMuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLG4pe1MuZm5bbl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMDxhcmd1bWVudHMubGVuZ3RoP3RoaXMub24obixudWxsLGUsdCk6dGhpcy50cmlnZ2VyKG4pfX0pO3ZhciBHdD0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7Uy5wcm94eT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaTtpZigic3RyaW5nIj09dHlwZW9mIHQmJihuPWVbdF0sdD1lLGU9biksbShlKSlyZXR1cm4gcj1zLmNhbGwoYXJndW1lbnRzLDIpLChpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxyLmNvbmNhdChzLmNhbGwoYXJndW1lbnRzKSkpfSkuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHxTLmd1aWQrKyxpfSxTLmhvbGRSZWFkeT1mdW5jdGlvbihlKXtlP1MucmVhZHlXYWl0Kys6Uy5yZWFkeSghMCl9LFMuaXNBcnJheT1BcnJheS5pc0FycmF5LFMucGFyc2VKU09OPUpTT04ucGFyc2UsUy5ub2RlTmFtZT1BLFMuaXNGdW5jdGlvbj1tLFMuaXNXaW5kb3c9eCxTLmNhbWVsQ2FzZT1YLFMudHlwZT13LFMubm93PURhdGUubm93LFMuaXNOdW1lcmljPWZ1bmN0aW9uKGUpe3ZhciB0PVMudHlwZShlKTtyZXR1cm4oIm51bWJlciI9PT10fHwic3RyaW5nIj09PXQpJiYhaXNOYU4oZS1wYXJzZUZsb2F0KGUpKX0sUy50cmltPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOihlKyIiKS5yZXBsYWNlKEd0LCIiKX0sImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIFN9KTt2YXIgWXQ9Qy5qUXVlcnksUXQ9Qy4kO3JldHVybiBTLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIEMuJD09PVMmJihDLiQ9UXQpLGUmJkMualF1ZXJ5PT09UyYmKEMualF1ZXJ5PVl0KSxTfSwidW5kZWZpbmVkIj09dHlwZW9mIGUmJihDLmpRdWVyeT1DLiQ9UyksU30pOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKgogKiBqUXVlcnkgVGVtcGxhdGVzIFBsdWdpbiAxLjAuMHByZQogKiBodHRwOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5LXRtcGwKICogUmVxdWlyZXMgalF1ZXJ5IDEuNC4yCiAqCiAqIENvcHlyaWdodCBTb2Z0d2FyZSBGcmVlZG9tIENvbnNlcnZhbmN5LCBJbmMuCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBvciBHUEwgVmVyc2lvbiAyIGxpY2Vuc2VzLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqLwooZnVuY3Rpb24oYSl7dmFyIHI9YS5mbi5kb21NYW5pcCxkPSJfdG1wbGl0ZW0iLHE9L15bXjxdKig8W1x3XFddKz4pW14+XSokfFx7XHtcISAvLGI9e30sZj17fSxlLHA9e2tleTowLGRhdGE6e319LGk9MCxjPTAsbD1bXTtmdW5jdGlvbiBnKGcsZCxoLGUpe3ZhciBjPXtkYXRhOmV8fChlPT09MHx8ZT09PWZhbHNlKT9lOmQ/ZC5kYXRhOnt9LF93cmFwOmQ/ZC5fd3JhcDpudWxsLHRtcGw6bnVsbCxwYXJlbnQ6ZHx8bnVsbCxub2RlczpbXSxjYWxsczp1LG5lc3Q6dyx3cmFwOngsaHRtbDp2LHVwZGF0ZTp0fTtnJiZhLmV4dGVuZChjLGcse25vZGVzOltdLHBhcmVudDpkfSk7aWYoaCl7Yy50bXBsPWg7Yy5fY3RudD1jLl9jdG50fHxjLnRtcGwoYSxjKTtjLmtleT0rK2k7KGwubGVuZ3RoP2Y6YilbaV09Y31yZXR1cm4gY31hLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihmLGQpe2EuZm5bZl09ZnVuY3Rpb24obil7dmFyIGc9W10saT1hKG4pLGssaCxtLGwsaj10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtlPWJ8fHt9O2lmKGomJmoubm9kZVR5cGU9PT0xMSYmai5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJmkubGVuZ3RoPT09MSl7aVtkXSh0aGlzWzBdKTtnPXRoaXN9ZWxzZXtmb3IoaD0wLG09aS5sZW5ndGg7aDxtO2grKyl7Yz1oO2s9KGg+MD90aGlzLmNsb25lKHRydWUpOnRoaXMpLmdldCgpO2EoaVtoXSlbZF0oayk7Zz1nLmNvbmNhdChrKX1jPTA7Zz10aGlzLnB1c2hTdGFjayhnLGYsaS5zZWxlY3Rvcil9bD1lO2U9bnVsbDthLnRtcGwuY29tcGxldGUobCk7cmV0dXJuIGd9fSk7YS5mbi5leHRlbmQoe3RtcGw6ZnVuY3Rpb24oZCxjLGIpe3JldHVybiBhLnRtcGwodGhpc1swXSxkLGMsYil9LHRtcGxJdGVtOmZ1bmN0aW9uKCl7cmV0dXJuIGEudG1wbEl0ZW0odGhpc1swXSl9LHRlbXBsYXRlOmZ1bmN0aW9uKGIpe3JldHVybiBhLnRlbXBsYXRlKGIsdGhpc1swXSl9LGRvbU1hbmlwOmZ1bmN0aW9uKGQsbSxrKXtpZihkWzBdJiZhLmlzQXJyYXkoZFswXSkpe3ZhciBnPWEubWFrZUFycmF5KGFyZ3VtZW50cyksaD1kWzBdLGo9aC5sZW5ndGgsaT0wLGY7d2hpbGUoaTxqJiYhKGY9YS5kYXRhKGhbaSsrXSwidG1wbEl0ZW0iKSkpO2lmKGYmJmMpZ1syXT1mdW5jdGlvbihiKXthLnRtcGwuYWZ0ZXJNYW5pcCh0aGlzLGIsayl9O3IuYXBwbHkodGhpcyxnKX1lbHNlIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpO2M9MDshZSYmYS50bXBsLmNvbXBsZXRlKGIpO3JldHVybiB0aGlzfX0pO2EuZXh0ZW5kKHt0bXBsOmZ1bmN0aW9uKGQsaCxlLGMpe3ZhciBpLGs9IWM7aWYoayl7Yz1wO2Q9YS50ZW1wbGF0ZVtkXXx8YS50ZW1wbGF0ZShudWxsLGQpO2Y9e319ZWxzZSBpZighZCl7ZD1jLnRtcGw7YltjLmtleV09YztjLm5vZGVzPVtdO2Mud3JhcHBlZCYmbihjLGMud3JhcHBlZCk7cmV0dXJuIGEoaihjLG51bGwsYy50bXBsKGEsYykpKX1pZighZClyZXR1cm5bXTtpZih0eXBlb2YgaD09PSJmdW5jdGlvbiIpaD1oLmNhbGwoY3x8e30pO2UmJmUud3JhcHBlZCYmbihlLGUud3JhcHBlZCk7aT1hLmlzQXJyYXkoaCk/YS5tYXAoaCxmdW5jdGlvbihhKXtyZXR1cm4gYT9nKGUsYyxkLGEpOm51bGx9KTpbZyhlLGMsZCxoKV07cmV0dXJuIGs/YShqKGMsbnVsbCxpKSk6aX0sdG1wbEl0ZW06ZnVuY3Rpb24oYil7dmFyIGM7aWYoYiBpbnN0YW5jZW9mIGEpYj1iWzBdO3doaWxlKGImJmIubm9kZVR5cGU9PT0xJiYhKGM9YS5kYXRhKGIsInRtcGxJdGVtIikpJiYoYj1iLnBhcmVudE5vZGUpKTtyZXR1cm4gY3x8cH0sdGVtcGxhdGU6ZnVuY3Rpb24oYyxiKXtpZihiKXtpZih0eXBlb2YgYj09PSJzdHJpbmciKWI9byhiKTtlbHNlIGlmKGIgaW5zdGFuY2VvZiBhKWI9YlswXXx8e307aWYoYi5ub2RlVHlwZSliPWEuZGF0YShiLCJ0bXBsIil8fGEuZGF0YShiLCJ0bXBsIixvKGIuaW5uZXJIVE1MKSk7cmV0dXJuIHR5cGVvZiBjPT09InN0cmluZyI/KGEudGVtcGxhdGVbY109Yik6Yn1yZXR1cm4gYz90eXBlb2YgYyE9PSJzdHJpbmciP2EudGVtcGxhdGUobnVsbCxjKTphLnRlbXBsYXRlW2NdfHxhLnRlbXBsYXRlKG51bGwscS50ZXN0KGMpP2M6YShjKSk6bnVsbH0sZW5jb2RlOmZ1bmN0aW9uKGEpe3JldHVybigiIithKS5zcGxpdCgiJiIpLmpvaW4oIiZhbXA7Iikuc3BsaXQoIjwiKS5qb2luKCImbHQ7Iikuc3BsaXQoIj4iKS5qb2luKCImZ3Q7Iikuc3BsaXQoJyInKS5qb2luKCImIzM0OyIpLnNwbGl0KCInIikuam9pbigiJiMzOTsiKX19KTthLmV4dGVuZChhLnRtcGwse3RhZzp7dG1wbDp7X2RlZmF1bHQ6eyQyOiJudWxsIn0sb3BlbjoiaWYoJG5vdG51bGxfMSl7X189X18uY29uY2F0KCRpdGVtLm5lc3QoJDEsJDIpKTt9In0sd3JhcDp7X2RlZmF1bHQ6eyQyOiJudWxsIn0sb3BlbjoiJGl0ZW0uY2FsbHMoX18sJDEsJDIpO19fPVtdOyIsY2xvc2U6ImNhbGw9JGl0ZW0uY2FsbHMoKTtfXz1jYWxsLl8uY29uY2F0KCRpdGVtLndyYXAoY2FsbCxfXykpOyJ9LGVhY2g6e19kZWZhdWx0OnskMjoiJGluZGV4LCAkdmFsdWUifSxvcGVuOiJpZigkbm90bnVsbF8xKXskLmVhY2goJDFhLGZ1bmN0aW9uKCQyKXt3aXRoKHRoaXMpeyIsY2xvc2U6In19KTt9In0sImlmIjp7b3BlbjoiaWYoKCRub3RudWxsXzEpICYmICQxYSl7IixjbG9zZToifSJ9LCJlbHNlIjp7X2RlZmF1bHQ6eyQxOiJ0cnVlIn0sb3BlbjoifWVsc2UgaWYoKCRub3RudWxsXzEpICYmICQxYSl7In0saHRtbDp7b3BlbjoiaWYoJG5vdG51bGxfMSl7X18ucHVzaCgkMWEpO30ifSwiPSI6e19kZWZhdWx0OnskMToiJGRhdGEifSxvcGVuOiJpZigkbm90bnVsbF8xKXtfXy5wdXNoKCQuZW5jb2RlKCQxYSkpO30ifSwiISI6e29wZW46IiJ9fSxjb21wbGV0ZTpmdW5jdGlvbigpe2I9e319LGFmdGVyTWFuaXA6ZnVuY3Rpb24oZixiLGQpe3ZhciBlPWIubm9kZVR5cGU9PT0xMT9hLm1ha2VBcnJheShiLmNoaWxkTm9kZXMpOmIubm9kZVR5cGU9PT0xP1tiXTpbXTtkLmNhbGwoZixiKTttKGUpO2MrK319KTtmdW5jdGlvbiBqKGUsZyxmKXt2YXIgYixjPWY/YS5tYXAoZixmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGE9PT0ic3RyaW5nIj9lLmtleT9hLnJlcGxhY2UoLyg8XHcrKSg/PVtccz5dKSg/IVtePl0qX3RtcGxpdGVtKShbXj5dKikvZywiJDEgIitkKyc9IicrZS5rZXkrJyIgJDInKTphOmooYSxlLGEuX2N0bnQpfSk6ZTtpZihnKXJldHVybiBjO2M9Yy5qb2luKCIiKTtjLnJlcGxhY2UoL15ccyooW148XHNdW148XSopPyg8W1x3XFddKz4pKFtePl0qW14+XHNdKT9ccyokLyxmdW5jdGlvbihmLGMsZSxkKXtiPWEoZSkuZ2V0KCk7bShiKTtpZihjKWI9ayhjKS5jb25jYXQoYik7aWYoZCliPWIuY29uY2F0KGsoZCkpfSk7cmV0dXJuIGI/YjprKGMpfWZ1bmN0aW9uIGsoYyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5pbm5lckhUTUw9YztyZXR1cm4gYS5tYWtlQXJyYXkoYi5jaGlsZE5vZGVzKX1mdW5jdGlvbiBvKGIpe3JldHVybiBuZXcgRnVuY3Rpb24oImpRdWVyeSIsIiRpdGVtIiwidmFyICQ9alF1ZXJ5LGNhbGwsX189W10sJGRhdGE9JGl0ZW0uZGF0YTt3aXRoKCRkYXRhKXtfXy5wdXNoKCciK2EudHJpbShiKS5yZXBsYWNlKC8oW1xcJ10pL2csIlxcJDEiKS5yZXBsYWNlKC9bXHJcdFxuXS9nLCIgIikucmVwbGFjZSgvXCRceyhbXlx9XSopXH0vZywie3s9ICQxfX0iKS5yZXBsYWNlKC9ce1x7KFwvPykoXHcrfC4pKD86XCgoKD86W15cfV18XH0oPyFcfSkpKj8pP1wpKT8oPzpccysoLio/KT8pPyhcKCgoPzpbXlx9XXxcfSg/IVx9KSkqPylcKSk/XHMqXH1cfS9nLGZ1bmN0aW9uKG0sbCxrLGcsYixjLGQpe3ZhciBqPWEudG1wbC50YWdba10saSxlLGY7aWYoIWopdGhyb3ciVW5rbm93biB0ZW1wbGF0ZSB0YWc6ICIraztpPWouX2RlZmF1bHR8fFtdO2lmKGMmJiEvXHckLy50ZXN0KGIpKXtiKz1jO2M9IiJ9aWYoYil7Yj1oKGIpO2Q9ZD8iLCIraChkKSsiKSI6Yz8iKSI6IiI7ZT1jP2IuaW5kZXhPZigiLiIpPi0xP2IraChjKToiKCIrYisiKS5jYWxsKCRpdGVtIitkOmI7Zj1jP2U6Iih0eXBlb2YoIitiKyIpPT09J2Z1bmN0aW9uJz8oIitiKyIpLmNhbGwoJGl0ZW0pOigiK2IrIikpIn1lbHNlIGY9ZT1pLiQxfHwibnVsbCI7Zz1oKGcpO3JldHVybiInKTsiK2pbbD8iY2xvc2UiOiJvcGVuIl0uc3BsaXQoIiRub3RudWxsXzEiKS5qb2luKGI/InR5cGVvZigiK2IrIikhPT0ndW5kZWZpbmVkJyAmJiAoIitiKyIpIT1udWxsIjoidHJ1ZSIpLnNwbGl0KCIkMWEiKS5qb2luKGYpLnNwbGl0KCIkMSIpLmpvaW4oZSkuc3BsaXQoIiQyIikuam9pbihnfHxpLiQyfHwiIikrIl9fLnB1c2goJyJ9KSsiJyk7fXJldHVybiBfXzsiKX1mdW5jdGlvbiBuKGMsYil7Yy5fd3JhcD1qKGMsdHJ1ZSxhLmlzQXJyYXkoYik/YjpbcS50ZXN0KGIpP2I6YShiKS5odG1sKCldKS5qb2luKCIiKX1mdW5jdGlvbiBoKGEpe3JldHVybiBhP2EucmVwbGFjZSgvXFwnL2csIiciKS5yZXBsYWNlKC9cXFxcL2csIlxcIik6bnVsbH1mdW5jdGlvbiBzKGIpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQoYi5jbG9uZU5vZGUodHJ1ZSkpO3JldHVybiBhLmlubmVySFRNTH1mdW5jdGlvbiBtKG8pe3ZhciBuPSJfIitjLGssaixsPXt9LGUscCxoO2ZvcihlPTAscD1vLmxlbmd0aDtlPHA7ZSsrKXtpZigoaz1vW2VdKS5ub2RlVHlwZSE9PTEpY29udGludWU7aj1rLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7Zm9yKGg9ai5sZW5ndGgtMTtoPj0wO2gtLSltKGpbaF0pO20oayl9ZnVuY3Rpb24gbShqKXt2YXIgcCxoPWosayxlLG07aWYobT1qLmdldEF0dHJpYnV0ZShkKSl7d2hpbGUoaC5wYXJlbnROb2RlJiYoaD1oLnBhcmVudE5vZGUpLm5vZGVUeXBlPT09MSYmIShwPWguZ2V0QXR0cmlidXRlKGQpKSk7aWYocCE9PW0pe2g9aC5wYXJlbnROb2RlP2gubm9kZVR5cGU9PT0xMT8wOmguZ2V0QXR0cmlidXRlKGQpfHwwOjA7aWYoIShlPWJbbV0pKXtlPWZbbV07ZT1nKGUsYltoXXx8ZltoXSk7ZS5rZXk9KytpO2JbaV09ZX1jJiZvKG0pfWoucmVtb3ZlQXR0cmlidXRlKGQpfWVsc2UgaWYoYyYmKGU9YS5kYXRhKGosInRtcGxJdGVtIikpKXtvKGUua2V5KTtiW2Uua2V5XT1lO2g9YS5kYXRhKGoucGFyZW50Tm9kZSwidG1wbEl0ZW0iKTtoPWg/aC5rZXk6MH1pZihlKXtrPWU7d2hpbGUoayYmay5rZXkhPWgpe2subm9kZXMucHVzaChqKTtrPWsucGFyZW50fWRlbGV0ZSBlLl9jdG50O2RlbGV0ZSBlLl93cmFwO2EuZGF0YShqLCJ0bXBsSXRlbSIsZSl9ZnVuY3Rpb24gbyhhKXthPWErbjtlPWxbYV09bFthXXx8ZyhlLGJbZS5wYXJlbnQua2V5K25dfHxlLnBhcmVudCl9fX1mdW5jdGlvbiB1KGEsZCxjLGIpe2lmKCFhKXJldHVybiBsLnBvcCgpO2wucHVzaCh7XzphLHRtcGw6ZCxpdGVtOnRoaXMsZGF0YTpjLG9wdGlvbnM6Yn0pfWZ1bmN0aW9uIHcoZCxjLGIpe3JldHVybiBhLnRtcGwoYS50ZW1wbGF0ZShkKSxjLGIsdGhpcyl9ZnVuY3Rpb24geChiLGQpe3ZhciBjPWIub3B0aW9uc3x8e307Yy53cmFwcGVkPWQ7cmV0dXJuIGEudG1wbChhLnRlbXBsYXRlKGIudG1wbCksYi5kYXRhLGMsYi5pdGVtKX1mdW5jdGlvbiB2KGQsYyl7dmFyIGI9dGhpcy5fd3JhcDtyZXR1cm4gYS5tYXAoYShhLmlzQXJyYXkoYik/Yi5qb2luKCIiKTpiKS5maWx0ZXIoZHx8IioiKSxmdW5jdGlvbihhKXtyZXR1cm4gYz9hLmlubmVyVGV4dHx8YS50ZXh0Q29udGVudDphLm91dGVySFRNTHx8cyhhKX0pfWZ1bmN0aW9uIHQoKXt2YXIgYj10aGlzLm5vZGVzO2EudG1wbChudWxsLG51bGwsbnVsbCx0aGlzKS5pbnNlcnRCZWZvcmUoYlswXSk7YShiKS5yZW1vdmUoKX19KShqUXVlcnkpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgohZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiXSxlKToib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lKHJlcXVpcmUoImpxdWVyeSIpKTplKGpRdWVyeSl9KGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlKXsidXNlIHN0cmljdCI7dmFyIHQ9ZS50YWJsZXNvcnRlcj17dmVyc2lvbjoiMi4zMC41IixwYXJzZXJzOltdLHdpZGdldHM6W10sZGVmYXVsdHM6e3RoZW1lOiJkZWZhdWx0Iix3aWR0aEZpeGVkOiExLHNob3dQcm9jZXNzaW5nOiExLGhlYWRlclRlbXBsYXRlOiJ7Y29udGVudH0iLG9uUmVuZGVyVGVtcGxhdGU6bnVsbCxvblJlbmRlckhlYWRlcjpudWxsLGNhbmNlbFNlbGVjdGlvbjohMCx0YWJJbmRleDohMCxkYXRlRm9ybWF0OiJtbWRkeXl5eSIsc29ydE11bHRpU29ydEtleToic2hpZnRLZXkiLHNvcnRSZXNldEtleToiY3RybEtleSIsdXNOdW1iZXJGb3JtYXQ6ITAsZGVsYXlJbml0OiExLHNlcnZlclNpZGVTb3J0aW5nOiExLHJlc29ydDohMCxoZWFkZXJzOnt9LGlnbm9yZUNhc2U6ITAsc29ydEZvcmNlOm51bGwsc29ydExpc3Q6W10sc29ydEFwcGVuZDpudWxsLHNvcnRTdGFibGU6ITEsc29ydEluaXRpYWxPcmRlcjoiYXNjIixzb3J0TG9jYWxlQ29tcGFyZTohMSxzb3J0UmVzZXQ6ITEsc29ydFJlc3RhcnQ6ITEsZW1wdHlUbzoiYm90dG9tIixzdHJpbmdUbzoibWF4IixkdXBsaWNhdGVTcGFuOiEwLHRleHRFeHRyYWN0aW9uOiJiYXNpYyIsdGV4dEF0dHJpYnV0ZToiZGF0YS10ZXh0Iix0ZXh0U29ydGVyOm51bGwsbnVtYmVyU29ydGVyOm51bGwsaW5pdFdpZGdldHM6ITAsd2lkZ2V0Q2xhc3M6IndpZGdldC17bmFtZX0iLHdpZGdldHM6W10sd2lkZ2V0T3B0aW9uczp7emVicmE6WyJldmVuIiwib2RkIl19LGluaXRpYWxpemVkOm51bGwsdGFibGVDbGFzczoiIixjc3NBc2M6IiIsY3NzRGVzYzoiIixjc3NOb25lOiIiLGNzc0hlYWRlcjoiIixjc3NIZWFkZXJSb3c6IiIsY3NzUHJvY2Vzc2luZzoiIixjc3NDaGlsZFJvdzoidGFibGVzb3J0ZXItY2hpbGRSb3ciLGNzc0luZm9CbG9jazoidGFibGVzb3J0ZXItaW5mb09ubHkiLGNzc05vU29ydDoidGFibGVzb3J0ZXItbm9Tb3J0Iixjc3NJZ25vcmVSb3c6InRhYmxlc29ydGVyLWlnbm9yZVJvdyIsY3NzSWNvbjoidGFibGVzb3J0ZXItaWNvbiIsY3NzSWNvbk5vbmU6IiIsY3NzSWNvbkFzYzoiIixjc3NJY29uRGVzYzoiIixjc3NJY29uRGlzYWJsZWQ6IiIscG9pbnRlckNsaWNrOiJjbGljayIscG9pbnRlckRvd246Im1vdXNlZG93biIscG9pbnRlclVwOiJtb3VzZXVwIixzZWxlY3RvckhlYWRlcnM6Ij4gdGhlYWQgdGgsID4gdGhlYWQgdGQiLHNlbGVjdG9yU29ydDoidGgsIHRkIixzZWxlY3RvclJlbW92ZToiLnJlbW92ZS1tZSIsZGVidWc6ITEsaGVhZGVyTGlzdDpbXSxlbXB0aWVzOnt9LHN0cmluZ3M6e30scGFyc2VyczpbXSxnbG9iYWxpemU6MCxpbWdBdHRyOjB9LGNzczp7dGFibGU6InRhYmxlc29ydGVyIixjc3NIYXNDaGlsZDoidGFibGVzb3J0ZXItaGFzQ2hpbGRSb3ciLGNoaWxkUm93OiJ0YWJsZXNvcnRlci1jaGlsZFJvdyIsY29sZ3JvdXA6InRhYmxlc29ydGVyLWNvbGdyb3VwIixoZWFkZXI6InRhYmxlc29ydGVyLWhlYWRlciIsaGVhZGVyUm93OiJ0YWJsZXNvcnRlci1oZWFkZXJSb3ciLGhlYWRlckluOiJ0YWJsZXNvcnRlci1oZWFkZXItaW5uZXIiLGljb246InRhYmxlc29ydGVyLWljb24iLHByb2Nlc3Npbmc6InRhYmxlc29ydGVyLXByb2Nlc3NpbmciLHNvcnRBc2M6InRhYmxlc29ydGVyLWhlYWRlckFzYyIsc29ydERlc2M6InRhYmxlc29ydGVyLWhlYWRlckRlc2MiLHNvcnROb25lOiJ0YWJsZXNvcnRlci1oZWFkZXJVblNvcnRlZCJ9LGxhbmd1YWdlOntzb3J0QXNjOiJBc2NlbmRpbmcgc29ydCBhcHBsaWVkLCAiLHNvcnREZXNjOiJEZXNjZW5kaW5nIHNvcnQgYXBwbGllZCwgIixzb3J0Tm9uZToiTm8gc29ydCBhcHBsaWVkLCAiLHNvcnREaXNhYmxlZDoic29ydGluZyBpcyBkaXNhYmxlZCIsbmV4dEFzYzoiYWN0aXZhdGUgdG8gYXBwbHkgYW4gYXNjZW5kaW5nIHNvcnQiLG5leHREZXNjOiJhY3RpdmF0ZSB0byBhcHBseSBhIGRlc2NlbmRpbmcgc29ydCIsbmV4dE5vbmU6ImFjdGl2YXRlIHRvIHJlbW92ZSB0aGUgc29ydCJ9LHJlZ2V4Ont0ZW1wbGF0ZUNvbnRlbnQ6L1x7Y29udGVudFx9L2csdGVtcGxhdGVJY29uOi9ce2ljb25cfS9nLHRlbXBsYXRlTmFtZTovXHtuYW1lXH0vaSxzcGFjZXM6L1xzKy9nLG5vbldvcmQ6L1xXL2csZm9ybUVsZW1lbnRzOi8oaW5wdXR8c2VsZWN0fGJ1dHRvbnx0ZXh0YXJlYSkvaSxjaHVuazovKF4oWytcLV0/KD86XGQqKSg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8pPyR8XjB4WzAtOWEtZl0rJHxcZCspL2dpLGNodW5rczovKF5cXDB8XFwwJCkvLGhleDovXjB4WzAtOWEtZl0rJC9pLGNvbW1hOi8sL2csZGlnaXROb25VUzovW1xzfFwuXS9nLGRpZ2l0TmVnYXRpdmVUZXN0Oi9eXHMqXChbLlxkXStcKS8sZGlnaXROZWdhdGl2ZVJlcGxhY2U6L15ccypcKChbLlxkXSspXCkvLGRpZ2l0VGVzdDovXltcLSsoXT9cZCtbKV0/JC8sZGlnaXRSZXBsYWNlOi9bLC4nIlxzXS9nfSxzdHJpbmc6e21heDoxLG1pbjotMSxlbXB0eW1pbjoxLGVtcHR5bWF4Oi0xLHplcm86MCxub25lOjAsIm51bGwiOjAsdG9wOiEwLGJvdHRvbTohMX0sa2V5Q29kZXM6e2VudGVyOjEzfSxkYXRlczp7fSxpbnN0YW5jZU1ldGhvZHM6e30sc2V0dXA6ZnVuY3Rpb24ocixvKXtpZihyJiZyLnRIZWFkJiYwIT09ci50Qm9kaWVzLmxlbmd0aCYmITAhPT1yLmhhc0luaXRpYWxpemVkKXt2YXIgcz0iIixhPWUociksbj1lLm1ldGFkYXRhO3IuaGFzSW5pdGlhbGl6ZWQ9ITEsci5pc1Byb2Nlc3Npbmc9ITAsci5jb25maWc9byxlLmRhdGEociwidGFibGVzb3J0ZXIiLG8pLHQuZGVidWcobywiY29yZSIpJiYoY29uc29sZVtjb25zb2xlLmdyb3VwPyJncm91cCI6ImxvZyJdKCJJbml0aWFsaXppbmcgdGFibGVzb3J0ZXIgdiIrdC52ZXJzaW9uKSxlLmRhdGEociwic3RhcnRvdmVyYWxsdGltZXIiLG5ldyBEYXRlKSksby5zdXBwb3J0c0RhdGFPYmplY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF09cGFyc2VJbnQoZVswXSwxMCksZVswXT4xfHwxPT09ZVswXSYmcGFyc2VJbnQoZVsxXSwxMCk+PTR9KGUuZm4uanF1ZXJ5LnNwbGl0KCIuIikpLG8uZW1wdHlUbz1vLmVtcHR5VG8udG9Mb3dlckNhc2UoKSxvLnN0cmluZ1RvPW8uc3RyaW5nVG8udG9Mb3dlckNhc2UoKSxvLmxhc3Q9e3NvcnRMaXN0OltdLGNsaWNrZWRJbmRleDotMX0sL3RhYmxlc29ydGVyXC0vLnRlc3QoYS5hdHRyKCJjbGFzcyIpKXx8KHM9IiIhPT1vLnRoZW1lPyIgdGFibGVzb3J0ZXItIitvLnRoZW1lOiIiKSxvLm5hbWVzcGFjZT9vLm5hbWVzcGFjZT0iLiIrby5uYW1lc3BhY2UucmVwbGFjZSh0LnJlZ2V4Lm5vbldvcmQsIiIpOm8ubmFtZXNwYWNlPSIudGFibGVzb3J0ZXIiK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMTYpLnNsaWNlKDIpLG8udGFibGU9cixvLiR0YWJsZT1hLmFkZENsYXNzKHQuY3NzLnRhYmxlKyIgIitvLnRhYmxlQ2xhc3MrcysiICIrby5uYW1lc3BhY2Uuc2xpY2UoMSkpLmF0dHIoInJvbGUiLCJncmlkIiksby4kaGVhZGVycz1hLmZpbmQoby5zZWxlY3RvckhlYWRlcnMpLG8uJHRhYmxlLmNoaWxkcmVuKCkuY2hpbGRyZW4oInRyIikuYXR0cigicm9sZSIsInJvdyIpLG8uJHRib2RpZXM9YS5jaGlsZHJlbigidGJvZHk6bm90KC4iK28uY3NzSW5mb0Jsb2NrKyIpIikuYXR0cih7ImFyaWEtbGl2ZSI6InBvbGl0ZSIsImFyaWEtcmVsZXZhbnQiOiJhbGwifSksby4kdGFibGUuY2hpbGRyZW4oImNhcHRpb24iKS5sZW5ndGgmJigocz1vLiR0YWJsZS5jaGlsZHJlbigiY2FwdGlvbiIpWzBdKS5pZHx8KHMuaWQ9by5uYW1lc3BhY2Uuc2xpY2UoMSkrImNhcHRpb24iKSxvLiR0YWJsZS5hdHRyKCJhcmlhLWxhYmVsbGVkYnkiLHMuaWQpKSxvLndpZGdldEluaXQ9e30sby50ZXh0RXh0cmFjdGlvbj1vLiR0YWJsZS5hdHRyKCJkYXRhLXRleHQtZXh0cmFjdGlvbiIpfHxvLnRleHRFeHRyYWN0aW9ufHwiYmFzaWMiLHQuYnVpbGRIZWFkZXJzKG8pLHQuZml4Q29sdW1uV2lkdGgociksdC5hZGRXaWRnZXRGcm9tQ2xhc3MociksdC5hcHBseVdpZGdldE9wdGlvbnMociksdC5zZXR1cFBhcnNlcnMobyksby50b3RhbFJvd3M9MCxvLmRlYnVnJiZ0LnZhbGlkYXRlT3B0aW9ucyhvKSxvLmRlbGF5SW5pdHx8dC5idWlsZENhY2hlKG8pLHQuYmluZEV2ZW50cyhyLG8uJGhlYWRlcnMsITApLHQuYmluZE1ldGhvZHMobyksby5zdXBwb3J0c0RhdGFPYmplY3QmJnZvaWQgMCE9PWEuZGF0YSgpLnNvcnRsaXN0P28uc29ydExpc3Q9YS5kYXRhKCkuc29ydGxpc3Q6biYmYS5tZXRhZGF0YSgpJiZhLm1ldGFkYXRhKCkuc29ydGxpc3QmJihvLnNvcnRMaXN0PWEubWV0YWRhdGEoKS5zb3J0bGlzdCksdC5hcHBseVdpZGdldChyLCEwKSxvLnNvcnRMaXN0Lmxlbmd0aD4wP3Quc29ydE9uKG8sby5zb3J0TGlzdCx7fSwhby5pbml0V2lkZ2V0cyk6KHQuc2V0SGVhZGVyc0NzcyhvKSxvLmluaXRXaWRnZXRzJiZ0LmFwcGx5V2lkZ2V0KHIsITEpKSxvLnNob3dQcm9jZXNzaW5nJiZhLnVuYmluZCgic29ydEJlZ2luIitvLm5hbWVzcGFjZSsiIHNvcnRFbmQiK28ubmFtZXNwYWNlKS5iaW5kKCJzb3J0QmVnaW4iK28ubmFtZXNwYWNlKyIgc29ydEVuZCIrby5uYW1lc3BhY2UsZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KG8udGltZXJQcm9jZXNzaW5nKSx0LmlzUHJvY2Vzc2luZyhyKSwic29ydEJlZ2luIj09PWUudHlwZSYmKG8udGltZXJQcm9jZXNzaW5nPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmlzUHJvY2Vzc2luZyhyLCEwKX0sNTAwKSl9KSxyLmhhc0luaXRpYWxpemVkPSEwLHIuaXNQcm9jZXNzaW5nPSExLHQuZGVidWcobywiY29yZSIpJiYoY29uc29sZS5sb2coIk92ZXJhbGwgaW5pdGlhbGl6YXRpb24gdGltZToiK3QuYmVuY2htYXJrKGUuZGF0YShyLCJzdGFydG92ZXJhbGx0aW1lciIpKSksdC5kZWJ1ZyhvLCJjb3JlIikmJmNvbnNvbGUuZ3JvdXBFbmQmJmNvbnNvbGUuZ3JvdXBFbmQoKSksYS50cmlnZ2VySGFuZGxlcigidGFibGVzb3J0ZXItaW5pdGlhbGl6ZWQiLHIpLCJmdW5jdGlvbiI9PXR5cGVvZiBvLmluaXRpYWxpemVkJiZvLmluaXRpYWxpemVkKHIpfWVsc2UgdC5kZWJ1ZyhvLCJjb3JlIikmJihyLmhhc0luaXRpYWxpemVkP2NvbnNvbGUud2FybigiU3RvcHBpbmcgaW5pdGlhbGl6YXRpb24uIFRhYmxlc29ydGVyIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQiKTpjb25zb2xlLmVycm9yKCJTdG9wcGluZyBpbml0aWFsaXphdGlvbiEgTm8gdGFibGUsIHRoZWFkIG9yIHRib2R5IixyKSl9LGJpbmRNZXRob2RzOmZ1bmN0aW9uKHIpe3ZhciBvPXIuJHRhYmxlLHM9ci5uYW1lc3BhY2UsYT0ic29ydFJlc2V0IHVwZGF0ZSB1cGRhdGVSb3dzIHVwZGF0ZUFsbCB1cGRhdGVIZWFkZXJzIGFkZFJvd3MgdXBkYXRlQ2VsbCB1cGRhdGVDb21wbGV0ZSBzb3J0b24gYXBwZW5kQ2FjaGUgdXBkYXRlQ2FjaGUgYXBwbHlXaWRnZXRJZCBhcHBseVdpZGdldHMgcmVmcmVzaFdpZGdldHMgZGVzdHJveSBtb3VzZXVwIG1vdXNlbGVhdmUgIi5zcGxpdCgiICIpLmpvaW4ocysiICIpO28udW5iaW5kKGEucmVwbGFjZSh0LnJlZ2V4LnNwYWNlcywiICIpKS5iaW5kKCJzb3J0UmVzZXQiK3MsZnVuY3Rpb24oZSxyKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQuc29ydFJlc2V0KHRoaXMuY29uZmlnLGZ1bmN0aW9uKGUpe2UuaXNBcHBseWluZ1dpZGdldHM/c2V0VGltZW91dChmdW5jdGlvbigpe3QuYXBwbHlXaWRnZXQoZSwiIixyKX0sMTAwKTp0LmFwcGx5V2lkZ2V0KGUsIiIscil9KX0pLmJpbmQoInVwZGF0ZUFsbCIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZUFsbCh0aGlzLmNvbmZpZyxyLG8pfSkuYmluZCgidXBkYXRlIitzKyIgdXBkYXRlUm93cyIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZSh0aGlzLmNvbmZpZyxyLG8pfSkuYmluZCgidXBkYXRlSGVhZGVycyIrcyxmdW5jdGlvbihlLHIpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC51cGRhdGVIZWFkZXJzKHRoaXMuY29uZmlnLHIpfSkuYmluZCgidXBkYXRlQ2VsbCIrcyxmdW5jdGlvbihlLHIsbyxzKXtlLnN0b3BQcm9wYWdhdGlvbigpLHQudXBkYXRlQ2VsbCh0aGlzLmNvbmZpZyxyLG8scyl9KS5iaW5kKCJhZGRSb3dzIitzLGZ1bmN0aW9uKGUscixvLHMpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5hZGRSb3dzKHRoaXMuY29uZmlnLHIsbyxzKX0pLmJpbmQoInVwZGF0ZUNvbXBsZXRlIitzLGZ1bmN0aW9uKCl7dGhpcy5pc1VwZGF0aW5nPSExfSkuYmluZCgic29ydG9uIitzLGZ1bmN0aW9uKGUscixvLHMpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5zb3J0T24odGhpcy5jb25maWcscixvLHMpfSkuYmluZCgiYXBwZW5kQ2FjaGUiK3MsZnVuY3Rpb24ocixvLHMpe3Iuc3RvcFByb3BhZ2F0aW9uKCksdC5hcHBlbmRDYWNoZSh0aGlzLmNvbmZpZyxzKSxlLmlzRnVuY3Rpb24obykmJm8odGhpcyl9KS5iaW5kKCJ1cGRhdGVDYWNoZSIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LnVwZGF0ZUNhY2hlKHRoaXMuY29uZmlnLHIsbyl9KS5iaW5kKCJhcHBseVdpZGdldElkIitzLGZ1bmN0aW9uKGUscil7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmFwcGx5V2lkZ2V0SWQodGhpcyxyKX0pLmJpbmQoImFwcGx5V2lkZ2V0cyIrcyxmdW5jdGlvbihlLHIpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5hcHBseVdpZGdldCh0aGlzLCExLHIpfSkuYmluZCgicmVmcmVzaFdpZGdldHMiK3MsZnVuY3Rpb24oZSxyLG8pe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5yZWZyZXNoV2lkZ2V0cyh0aGlzLHIsbyl9KS5iaW5kKCJyZW1vdmVXaWRnZXQiK3MsZnVuY3Rpb24oZSxyLG8pe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5yZW1vdmVXaWRnZXQodGhpcyxyLG8pfSkuYmluZCgiZGVzdHJveSIrcyxmdW5jdGlvbihlLHIsbyl7ZS5zdG9wUHJvcGFnYXRpb24oKSx0LmRlc3Ryb3kodGhpcyxyLG8pfSkuYmluZCgicmVzZXRUb0xvYWRTdGF0ZSIrcyxmdW5jdGlvbihvKXtvLnN0b3BQcm9wYWdhdGlvbigpLHQucmVtb3ZlV2lkZ2V0KHRoaXMsITAsITEpO3ZhciBzPWUuZXh0ZW5kKCEwLHt9LHIub3JpZ2luYWxTZXR0aW5ncyk7KHI9ZS5leHRlbmQoITAse30sdC5kZWZhdWx0cyxzKSkub3JpZ2luYWxTZXR0aW5ncz1zLHRoaXMuaGFzSW5pdGlhbGl6ZWQ9ITEsdC5zZXR1cCh0aGlzLHIpfSl9LGJpbmRFdmVudHM6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG49KHI9ZShyKVswXSkuY29uZmlnLGk9bi5uYW1lc3BhY2UsbD1udWxsOyEwIT09cyYmKG8uYWRkQ2xhc3MoaS5zbGljZSgxKSsiX2V4dHJhX2hlYWRlcnMiKSwoYT10LmdldENsb3Nlc3QobywidGFibGUiKSkubGVuZ3RoJiYiVEFCTEUiPT09YVswXS5ub2RlTmFtZSYmYVswXSE9PXImJmUoYVswXSkuYWRkQ2xhc3MoaS5zbGljZSgxKSsiX2V4dHJhX3RhYmxlIikpLGE9KG4ucG9pbnRlckRvd24rIiAiK24ucG9pbnRlclVwKyIgIituLnBvaW50ZXJDbGljaysiIHNvcnQga2V5dXAgIikucmVwbGFjZSh0LnJlZ2V4LnNwYWNlcywiICIpLnNwbGl0KCIgIikuam9pbihpKyIgIiksby5maW5kKG4uc2VsZWN0b3JTb3J0KS5hZGQoby5maWx0ZXIobi5zZWxlY3RvclNvcnQpKS51bmJpbmQoYSkuYmluZChhLGZ1bmN0aW9uKHIsbyl7dmFyIHMsYSxpLGQ9ZShyLnRhcmdldCksYz0iICIrci50eXBlKyIgIjtpZighKDEhPT0oci53aGljaHx8ci5idXR0b24pJiYhYy5tYXRjaCgiICIrbi5wb2ludGVyQ2xpY2srIiB8IHNvcnQgfCBrZXl1cCAiKXx8IiBrZXl1cCAiPT09YyYmci53aGljaCE9PXQua2V5Q29kZXMuZW50ZXJ8fGMubWF0Y2goIiAiK24ucG9pbnRlckNsaWNrKyIgIikmJnZvaWQgMCE9PXIud2hpY2h8fGMubWF0Y2goIiAiK24ucG9pbnRlclVwKyIgIikmJmwhPT1yLnRhcmdldCYmITAhPT1vKSl7aWYoYy5tYXRjaCgiICIrbi5wb2ludGVyRG93bisiICIpKXJldHVybiBsPXIudGFyZ2V0LHZvaWQoIjEiPT09KGk9ZC5qcXVlcnkuc3BsaXQoIi4iKSlbMF0mJmlbMV08NCYmci5wcmV2ZW50RGVmYXVsdCgpKTtpZihsPW51bGwscz10LmdldENsb3Nlc3QoZSh0aGlzKSwiLiIrdC5jc3MuaGVhZGVyKSx0LnJlZ2V4LmZvcm1FbGVtZW50cy50ZXN0KHIudGFyZ2V0Lm5vZGVOYW1lKXx8ZC5oYXNDbGFzcyhuLmNzc05vU29ydCl8fGQucGFyZW50cygiLiIrbi5jc3NOb1NvcnQpLmxlbmd0aD4wfHxzLmhhc0NsYXNzKCJzb3J0ZXItZmFsc2UiKXx8ZC5wYXJlbnRzKCJidXR0b24iKS5sZW5ndGg+MClyZXR1cm4hbi5jYW5jZWxTZWxlY3Rpb247bi5kZWxheUluaXQmJnQuaXNFbXB0eU9iamVjdChuLmNhY2hlKSYmdC5idWlsZENhY2hlKG4pLG4ubGFzdC5jbGlja2VkSW5kZXg9cy5hdHRyKCJkYXRhLWNvbHVtbiIpfHxzLmluZGV4KCksKGE9bi4kaGVhZGVySW5kZXhlZFtuLmxhc3QuY2xpY2tlZEluZGV4XVswXSkmJiFhLnNvcnREaXNhYmxlZCYmdC5pbml0U29ydChuLGEscil9fSksbi5jYW5jZWxTZWxlY3Rpb24mJm8uYXR0cigidW5zZWxlY3RhYmxlIiwib24iKS5iaW5kKCJzZWxlY3RzdGFydCIsITEpLmNzcyh7InVzZXItc2VsZWN0Ijoibm9uZSIsTW96VXNlclNlbGVjdDoibm9uZSJ9KX0sYnVpbGRIZWFkZXJzOmZ1bmN0aW9uKHIpe3ZhciBvLHMsYSxuO2ZvcihyLmhlYWRlckxpc3Q9W10sci5oZWFkZXJDb250ZW50PVtdLHIuc29ydFZhcnM9W10sdC5kZWJ1ZyhyLCJjb3JlIikmJihhPW5ldyBEYXRlKSxyLmNvbHVtbnM9dC5jb21wdXRlQ29sdW1uSW5kZXgoci4kdGFibGUuY2hpbGRyZW4oInRoZWFkLCB0Zm9vdCIpLmNoaWxkcmVuKCJ0ciIpKSxzPXIuY3NzSWNvbj8nPGkgY2xhc3M9IicrKHIuY3NzSWNvbj09PXQuY3NzLmljb24/dC5jc3MuaWNvbjpyLmNzc0ljb24rIiAiK3QuY3NzLmljb24pKyciPjwvaT4nOiIiLHIuJGhlYWRlcnM9ZShlLm1hcChyLiR0YWJsZS5maW5kKHIuc2VsZWN0b3JIZWFkZXJzKSxmdW5jdGlvbihvLGEpe3ZhciBuLGksbCxkLGMsZz1lKG8pO2lmKCF0LmdldENsb3Nlc3QoZywidHIiKS5oYXNDbGFzcyhyLmNzc0lnbm9yZVJvdykpcmV0dXJuLyh0aHx0ZCkvaS50ZXN0KG8ubm9kZU5hbWUpfHwoYz10LmdldENsb3Nlc3QoZywidGgsIHRkIiksZy5hdHRyKCJkYXRhLWNvbHVtbiIsYy5hdHRyKCJkYXRhLWNvbHVtbiIpKSksbj10LmdldENvbHVtbkRhdGEoci50YWJsZSxyLmhlYWRlcnMsYSwhMCksci5oZWFkZXJDb250ZW50W2FdPWcuaHRtbCgpLCIiPT09ci5oZWFkZXJUZW1wbGF0ZXx8Zy5maW5kKCIuIit0LmNzcy5oZWFkZXJJbikubGVuZ3RofHwoZD1yLmhlYWRlclRlbXBsYXRlLnJlcGxhY2UodC5yZWdleC50ZW1wbGF0ZUNvbnRlbnQsZy5odG1sKCkpLnJlcGxhY2UodC5yZWdleC50ZW1wbGF0ZUljb24sZy5maW5kKCIuIit0LmNzcy5pY29uKS5sZW5ndGg/IiI6cyksci5vblJlbmRlclRlbXBsYXRlJiYoaT1yLm9uUmVuZGVyVGVtcGxhdGUuYXBwbHkoZyxbYSxkXSkpJiYic3RyaW5nIj09dHlwZW9mIGkmJihkPWkpLGcuaHRtbCgnPGRpdiBjbGFzcz0iJyt0LmNzcy5oZWFkZXJJbisnIj4nK2QrIjwvZGl2PiIpKSxyLm9uUmVuZGVySGVhZGVyJiZyLm9uUmVuZGVySGVhZGVyLmFwcGx5KGcsW2EscixyLiR0YWJsZV0pLGw9cGFyc2VJbnQoZy5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxvLmNvbHVtbj1sLGM9dC5nZXRPcmRlcih0LmdldERhdGEoZyxuLCJzb3J0SW5pdGlhbE9yZGVyIil8fHIuc29ydEluaXRpYWxPcmRlciksci5zb3J0VmFyc1tsXT17Y291bnQ6LTEsb3JkZXI6Yz9yLnNvcnRSZXNldD9bMSwwLDJdOlsxLDBdOnIuc29ydFJlc2V0P1swLDEsMl06WzAsMV0sbG9ja2VkT3JkZXI6ITF9LHZvaWQgMCE9PShjPXQuZ2V0RGF0YShnLG4sImxvY2tlZE9yZGVyIil8fCExKSYmITEhPT1jJiYoci5zb3J0VmFyc1tsXS5sb2NrZWRPcmRlcj0hMCxyLnNvcnRWYXJzW2xdLm9yZGVyPXQuZ2V0T3JkZXIoYyk/WzEsMV06WzAsMF0pLHIuaGVhZGVyTGlzdFthXT1vLGcuYWRkQ2xhc3ModC5jc3MuaGVhZGVyKyIgIityLmNzc0hlYWRlciksdC5nZXRDbG9zZXN0KGcsInRyIikuYWRkQ2xhc3ModC5jc3MuaGVhZGVyUm93KyIgIityLmNzc0hlYWRlclJvdykuYXR0cigicm9sZSIsInJvdyIpLHIudGFiSW5kZXgmJmcuYXR0cigidGFiaW5kZXgiLDApLG99KSksci4kaGVhZGVySW5kZXhlZD1bXSxuPTA7bjxyLmNvbHVtbnM7bisrKXQuaXNFbXB0eU9iamVjdChyLnNvcnRWYXJzW25dKSYmKHIuc29ydFZhcnNbbl09e30pLG89ci4kaGVhZGVycy5maWx0ZXIoJ1tkYXRhLWNvbHVtbj0iJytuKyciXScpLHIuJGhlYWRlckluZGV4ZWRbbl09by5sZW5ndGg/by5ub3QoIi5zb3J0ZXItZmFsc2UiKS5sZW5ndGg/by5ub3QoIi5zb3J0ZXItZmFsc2UiKS5maWx0ZXIoIjpsYXN0Iik6by5maWx0ZXIoIjpsYXN0Iik6ZSgpO3IuJHRhYmxlLmZpbmQoci5zZWxlY3RvckhlYWRlcnMpLmF0dHIoe3Njb3BlOiJjb2wiLHJvbGU6ImNvbHVtbmhlYWRlciJ9KSx0LnVwZGF0ZUhlYWRlcihyKSx0LmRlYnVnKHIsImNvcmUiKSYmKGNvbnNvbGUubG9nKCJCdWlsdCBoZWFkZXJzOiIrdC5iZW5jaG1hcmsoYSkpLGNvbnNvbGUubG9nKHIuJGhlYWRlcnMpKX0sYWRkSW5zdGFuY2VNZXRob2RzOmZ1bmN0aW9uKHIpe2UuZXh0ZW5kKHQuaW5zdGFuY2VNZXRob2RzLHIpfSxzZXR1cFBhcnNlcnM6ZnVuY3Rpb24oZSxyKXt2YXIgbyxzLGEsbixpLGwsZCxjLGcscCx1LGYsaCxtLGI9ZS50YWJsZSx5PTAsdz10LmRlYnVnKGUsImNvcmUiKSx4PXt9O2lmKGUuJHRib2RpZXM9ZS4kdGFibGUuY2hpbGRyZW4oInRib2R5Om5vdCguIitlLmNzc0luZm9CbG9jaysiKSIpLGg9dm9pZCAwPT09cj9lLiR0Ym9kaWVzOnIsMD09PShtPWgubGVuZ3RoKSlyZXR1cm4gdz9jb25zb2xlLndhcm4oIldhcm5pbmc6ICpFbXB0eSB0YWJsZSEqIE5vdCBidWlsZGluZyBhIHBhcnNlciBjYWNoZSIpOiIiO2Zvcih3JiYoZj1uZXcgRGF0ZSxjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIkRldGVjdGluZyBwYXJzZXJzIGZvciBlYWNoIGNvbHVtbiIpKSxzPXtleHRyYWN0b3JzOltdLHBhcnNlcnM6W119O3k8bTspe2lmKChvPWhbeV0ucm93cykubGVuZ3RoKWZvcihpPTAsbj1lLmNvbHVtbnMsbD0wO2w8bjtsKyspe2lmKChkPWUuJGhlYWRlckluZGV4ZWRbaV0pJiZkLmxlbmd0aCYmKGM9dC5nZXRDb2x1bW5EYXRhKGIsZS5oZWFkZXJzLGkpLHU9dC5nZXRQYXJzZXJCeUlkKHQuZ2V0RGF0YShkLGMsImV4dHJhY3RvciIpKSxwPXQuZ2V0UGFyc2VyQnlJZCh0LmdldERhdGEoZCxjLCJzb3J0ZXIiKSksZz0iZmFsc2UiPT09dC5nZXREYXRhKGQsYywicGFyc2VyIiksZS5lbXB0aWVzW2ldPSh0LmdldERhdGEoZCxjLCJlbXB0eSIpfHxlLmVtcHR5VG98fChlLmVtcHR5VG9Cb3R0b20/ImJvdHRvbSI6InRvcCIpKS50b0xvd2VyQ2FzZSgpLGUuc3RyaW5nc1tpXT0odC5nZXREYXRhKGQsYywic3RyaW5nIil8fGUuc3RyaW5nVG98fCJtYXgiKS50b0xvd2VyQ2FzZSgpLGcmJihwPXQuZ2V0UGFyc2VyQnlJZCgibm8tcGFyc2VyIikpLHV8fCh1PSExKSxwfHwocD10LmRldGVjdFBhcnNlckZvckNvbHVtbihlLG8sLTEsaSkpLHcmJih4WyIoIitpKyIpICIrZC50ZXh0KCldPXtwYXJzZXI6cC5pZCxleHRyYWN0b3I6dT91LmlkOiJub25lIixzdHJpbmc6ZS5zdHJpbmdzW2ldLGVtcHR5OmUuZW1wdGllc1tpXX0pLHMucGFyc2Vyc1tpXT1wLHMuZXh0cmFjdG9yc1tpXT11LChhPWRbMF0uY29sU3Bhbi0xKT4wKSlmb3IoaSs9YSxuKz1hO2ErMT4wOylzLnBhcnNlcnNbaS1hXT1wLHMuZXh0cmFjdG9yc1tpLWFdPXUsYS0tO2krK315Kz1zLnBhcnNlcnMubGVuZ3RoP206MX13JiYodC5pc0VtcHR5T2JqZWN0KHgpP2NvbnNvbGUud2FybigiICBObyBwYXJzZXJzIGRldGVjdGVkISIpOmNvbnNvbGVbY29uc29sZS50YWJsZT8idGFibGUiOiJsb2ciXSh4KSxjb25zb2xlLmxvZygiQ29tcGxldGVkIGRldGVjdGluZyBwYXJzZXJzIit0LmJlbmNobWFyayhmKSksY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpKSxlLnBhcnNlcnM9cy5wYXJzZXJzLGUuZXh0cmFjdG9ycz1zLmV4dHJhY3RvcnN9LGFkZFBhcnNlcjpmdW5jdGlvbihlKXt2YXIgcixvPXQucGFyc2Vycy5sZW5ndGgscz0hMDtmb3Iocj0wO3I8bztyKyspdC5wYXJzZXJzW3JdLmlkLnRvTG93ZXJDYXNlKCk9PT1lLmlkLnRvTG93ZXJDYXNlKCkmJihzPSExKTtzJiYodC5wYXJzZXJzW3QucGFyc2Vycy5sZW5ndGhdPWUpfSxnZXRQYXJzZXJCeUlkOmZ1bmN0aW9uKGUpe2lmKCJmYWxzZSI9PWUpcmV0dXJuITE7dmFyIHIsbz10LnBhcnNlcnMubGVuZ3RoO2ZvcihyPTA7cjxvO3IrKylpZih0LnBhcnNlcnNbcl0uaWQudG9Mb3dlckNhc2UoKT09PWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKXJldHVybiB0LnBhcnNlcnNbcl07cmV0dXJuITF9LGRldGVjdFBhcnNlckZvckNvbHVtbjpmdW5jdGlvbihyLG8scyxhKXtmb3IodmFyIG4saSxsLGQ9dC5wYXJzZXJzLmxlbmd0aCxjPSExLGc9IiIscD10LmRlYnVnKHIsImNvcmUiKSx1PSEwOyIiPT09ZyYmdTspKGw9b1srK3NdKSYmczw1MD9sLmNsYXNzTmFtZS5pbmRleE9mKHQuY3NzSWdub3JlUm93KTwwJiYoYz1vW3NdLmNlbGxzW2FdLGc9dC5nZXRFbGVtZW50VGV4dChyLGMsYSksaT1lKGMpLHAmJmNvbnNvbGUubG9nKCJDaGVja2luZyBpZiB2YWx1ZSB3YXMgZW1wdHkgb24gcm93ICIrcysiLCBjb2x1bW46ICIrYSsnOiAiJytnKyciJykpOnU9ITE7Zm9yKDstLWQ+PTA7KWlmKChuPXQucGFyc2Vyc1tkXSkmJiJ0ZXh0IiE9PW4uaWQmJm4uaXMmJm4uaXMoZyxyLnRhYmxlLGMsaSkpcmV0dXJuIG47cmV0dXJuIHQuZ2V0UGFyc2VyQnlJZCgidGV4dCIpfSxnZXRFbGVtZW50VGV4dDpmdW5jdGlvbihyLG8scyl7aWYoIW8pcmV0dXJuIiI7dmFyIGEsbj1yLnRleHRFeHRyYWN0aW9ufHwiIixpPW8uanF1ZXJ5P286ZShvKTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIG4/ImJhc2ljIj09PW4mJnZvaWQgMCE9PShhPWkuYXR0cihyLnRleHRBdHRyaWJ1dGUpKT9lLnRyaW0oYSk6ZS50cmltKG8udGV4dENvbnRlbnR8fGkudGV4dCgpKToiZnVuY3Rpb24iPT10eXBlb2Ygbj9lLnRyaW0obihpWzBdLHIudGFibGUscykpOiJmdW5jdGlvbiI9PXR5cGVvZihhPXQuZ2V0Q29sdW1uRGF0YShyLnRhYmxlLG4scykpP2UudHJpbShhKGlbMF0sci50YWJsZSxzKSk6ZS50cmltKGlbMF0udGV4dENvbnRlbnR8fGkudGV4dCgpKX0sZ2V0UGFyc2VkVGV4dDpmdW5jdGlvbihlLHIsbyxzKXt2b2lkIDA9PT1zJiYocz10LmdldEVsZW1lbnRUZXh0KGUscixvKSk7dmFyIGE9IiIrcyxuPWUucGFyc2Vyc1tvXSxpPWUuZXh0cmFjdG9yc1tvXTtyZXR1cm4gbiYmKGkmJiJmdW5jdGlvbiI9PXR5cGVvZiBpLmZvcm1hdCYmKHM9aS5mb3JtYXQocyxlLnRhYmxlLHIsbykpLGE9Im5vLXBhcnNlciI9PT1uLmlkPyIiOm4uZm9ybWF0KCIiK3MsZS50YWJsZSxyLG8pLGUuaWdub3JlQ2FzZSYmInN0cmluZyI9PXR5cGVvZiBhJiYoYT1hLnRvTG93ZXJDYXNlKCkpKSxhfSxidWlsZENhY2hlOmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbCxkLGMsZyxwLHUsZixoLG0sYix5LHcseCx2LEMsJCxJLEQsUixUPXIudGFibGUsTD1yLnBhcnNlcnMsQT10LmRlYnVnKHIsImNvcmUiKTtpZihyLiR0Ym9kaWVzPXIuJHRhYmxlLmNoaWxkcmVuKCJ0Ym9keTpub3QoLiIrci5jc3NJbmZvQmxvY2srIikiKSxnPXZvaWQgMD09PXM/ci4kdGJvZGllczpzLHIuY2FjaGU9e30sci50b3RhbFJvd3M9MCwhTClyZXR1cm4gQT9jb25zb2xlLndhcm4oIldhcm5pbmc6ICpFbXB0eSB0YWJsZSEqIE5vdCBidWlsZGluZyBhIGNhY2hlIik6IiI7Zm9yKEEmJihtPW5ldyBEYXRlKSxyLnNob3dQcm9jZXNzaW5nJiZ0LmlzUHJvY2Vzc2luZyhULCEwKSxjPTA7YzxnLmxlbmd0aDtjKyspe2Zvcih4PVtdLGE9ci5jYWNoZVtjXT17bm9ybWFsaXplZDpbXX0sYj1nW2NdJiZnW2NdLnJvd3MubGVuZ3RofHwwLGw9MDtsPGI7KytsKWlmKHk9e2NoaWxkOltdLHJhdzpbXX0scD1lKGdbY10ucm93c1tsXSksdT1bXSwhcC5oYXNDbGFzcyhyLnNlbGVjdG9yUmVtb3ZlLnNsaWNlKDEpKSlpZihwLmhhc0NsYXNzKHIuY3NzQ2hpbGRSb3cpJiYwIT09bClmb3IoRD1hLm5vcm1hbGl6ZWQubGVuZ3RoLTEsKHc9YS5ub3JtYWxpemVkW0RdW3IuY29sdW1uc10pLiRyb3c9dy4kcm93LmFkZChwKSxwLnByZXYoKS5oYXNDbGFzcyhyLmNzc0NoaWxkUm93KXx8cC5wcmV2KCkuYWRkQ2xhc3ModC5jc3MuY3NzSGFzQ2hpbGQpLGY9cC5jaGlsZHJlbigidGgsIHRkIiksRD13LmNoaWxkLmxlbmd0aCx3LmNoaWxkW0RdPVtdLEM9MCxJPXIuY29sdW1ucyxkPTA7ZDxJO2QrKykoaD1mW2RdKSYmKHcuY2hpbGRbRF1bZF09dC5nZXRQYXJzZWRUZXh0KHIsaCxkKSwodj1mW2RdLmNvbFNwYW4tMSk+MCYmKEMrPXYsSSs9dikpLEMrKztlbHNle2Zvcih5LiRyb3c9cCx5Lm9yZGVyPWwsQz0wLEk9ci5jb2x1bW5zLGQ9MDtkPEk7KytkKXtpZigoaD1wWzBdLmNlbGxzW2RdKSYmQzxyLmNvbHVtbnMmJighKCQ9dm9pZCAwIT09TFtDXSkmJkEmJmNvbnNvbGUud2FybigiTm8gcGFyc2VyIGZvdW5kIGZvciByb3c6ICIrbCsiLCBjb2x1bW46ICIrZCsnOyBjZWxsIGNvbnRhaW5pbmc6ICInK2UoaCkudGV4dCgpKyciOyBkb2VzIGl0IGhhdmUgYSBoZWFkZXI/Jyksbj10LmdldEVsZW1lbnRUZXh0KHIsaCxDKSx5LnJhd1tDXT1uLGk9dC5nZXRQYXJzZWRUZXh0KHIsaCxDLG4pLHVbQ109aSwkJiYibnVtZXJpYyI9PT0oTFtDXS50eXBlfHwiIikudG9Mb3dlckNhc2UoKSYmKHhbQ109TWF0aC5tYXgoTWF0aC5hYnMoaSl8fDAseFtDXXx8MCkpLCh2PWguY29sU3Bhbi0xKT4wKSl7Zm9yKFI9MDtSPD12OylpPXIuZHVwbGljYXRlU3Bhbnx8MD09PVI/bjoic3RyaW5nIiE9dHlwZW9mIHIudGV4dEV4dHJhY3Rpb24/dC5nZXRFbGVtZW50VGV4dChyLGgsQytSKXx8IiI6IiIseS5yYXdbQytSXT1pLHVbQytSXT1pLFIrKztDKz12LEkrPXZ9QysrfXVbci5jb2x1bW5zXT15LGEubm9ybWFsaXplZFthLm5vcm1hbGl6ZWQubGVuZ3RoXT11fWEuY29sTWF4PXgsci50b3RhbFJvd3MrPWEubm9ybWFsaXplZC5sZW5ndGh9aWYoci5zaG93UHJvY2Vzc2luZyYmdC5pc1Byb2Nlc3NpbmcoVCksQSl7Zm9yKEQ9TWF0aC5taW4oNSxyLmNhY2hlWzBdLm5vcm1hbGl6ZWQubGVuZ3RoKSxjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIkJ1aWxkaW5nIGNhY2hlIGZvciAiK3IudG90YWxSb3dzKyIgcm93cyAoc2hvd2luZyAiK0QrIiByb3dzIGluIGxvZykgYW5kICIrci5jb2x1bW5zKyIgY29sdW1ucyIrdC5iZW5jaG1hcmsobSkpLG49e30sZD0wO2Q8ci5jb2x1bW5zO2QrKylmb3IoQz0wO0M8RDtDKyspblsicm93OiAiK0NdfHwoblsicm93OiAiK0NdPXt9KSxuWyJyb3c6ICIrQ11bci4kaGVhZGVySW5kZXhlZFtkXS50ZXh0KCldPXIuY2FjaGVbMF0ubm9ybWFsaXplZFtDXVtkXTtjb25zb2xlW2NvbnNvbGUudGFibGU/InRhYmxlIjoibG9nIl0obiksY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpfWUuaXNGdW5jdGlvbihvKSYmbyhUKX0sZ2V0Q29sdW1uVGV4dDpmdW5jdGlvbihyLG8scyxhKXt2YXIgbixpLGwsZCxjLGcscCx1LGYsaCxtPSJmdW5jdGlvbiI9PXR5cGVvZiBzLGI9ImFsbCI9PT1vLHk9e3JhdzpbXSxwYXJzZWQ6W10sJGNlbGw6W119LHc9KHI9ZShyKVswXSkuY29uZmlnO2lmKCF0LmlzRW1wdHlPYmplY3Qodykpe2ZvcihjPXcuJHRib2RpZXMubGVuZ3RoLG49MDtuPGM7bisrKWZvcihnPShsPXcuY2FjaGVbbl0ubm9ybWFsaXplZCkubGVuZ3RoLGk9MDtpPGc7aSsrKWQ9bFtpXSxhJiYhZFt3LmNvbHVtbnNdLiRyb3cuaXMoYSl8fChoPSEwLHU9Yj9kLnNsaWNlKDAsdy5jb2x1bW5zKTpkW29dLGQ9ZFt3LmNvbHVtbnNdLHA9Yj9kLnJhdzpkLnJhd1tvXSxmPWI/ZC4kcm93LmNoaWxkcmVuKCk6ZC4kcm93LmNoaWxkcmVuKCkuZXEobyksbSYmKGg9cyh7dGJvZHlJbmRleDpuLHJvd0luZGV4OmkscGFyc2VkOnUscmF3OnAsJHJvdzpkLiRyb3csJGNlbGw6Zn0pKSwhMSE9PWgmJih5LnBhcnNlZFt5LnBhcnNlZC5sZW5ndGhdPXUseS5yYXdbeS5yYXcubGVuZ3RoXT1wLHkuJGNlbGxbeS4kY2VsbC5sZW5ndGhdPWYpKTtyZXR1cm4geX10LmRlYnVnKHcsImNvcmUiKSYmY29uc29sZS53YXJuKCJObyBjYWNoZSBmb3VuZCAtIGFib3J0aW5nIGdldENvbHVtblRleHQgZnVuY3Rpb24hIil9LHNldEhlYWRlcnNDc3M6ZnVuY3Rpb24ocil7dmFyIG8scyxhPXIuc29ydExpc3Qsbj1hLmxlbmd0aCxpPXQuY3NzLnNvcnROb25lKyIgIityLmNzc05vbmUsbD1bdC5jc3Muc29ydEFzYysiICIrci5jc3NBc2MsdC5jc3Muc29ydERlc2MrIiAiK3IuY3NzRGVzY10sZD1bci5jc3NJY29uQXNjLHIuY3NzSWNvbkRlc2Msci5jc3NJY29uTm9uZV0sYz1bImFzY2VuZGluZyIsImRlc2NlbmRpbmciXSxnPWZ1bmN0aW9uKGUscil7ZS5yZW1vdmVDbGFzcyhpKS5hZGRDbGFzcyhsW3JdKS5hdHRyKCJhcmlhLXNvcnQiLGNbcl0pLmZpbmQoIi4iK3QuY3NzLmljb24pLnJlbW92ZUNsYXNzKGRbMl0pLmFkZENsYXNzKGRbcl0pfSxwPXIuJHRhYmxlLmZpbmQoInRmb290IHRyIikuY2hpbGRyZW4oInRkLCB0aCIpLmFkZChlKHIubmFtZXNwYWNlKyJfZXh0cmFfaGVhZGVycyIpKS5yZW1vdmVDbGFzcyhsLmpvaW4oIiAiKSksdT1yLiRoZWFkZXJzLmFkZChlKCJ0aGVhZCAiK3IubmFtZXNwYWNlKyJfZXh0cmFfaGVhZGVycyIpKS5yZW1vdmVDbGFzcyhsLmpvaW4oIiAiKSkuYWRkQ2xhc3MoaSkuYXR0cigiYXJpYS1zb3J0Iiwibm9uZSIpLmZpbmQoIi4iK3QuY3NzLmljb24pLnJlbW92ZUNsYXNzKGQuam9pbigiICIpKS5lbmQoKTtmb3IodS5ub3QoIi5zb3J0ZXItZmFsc2UiKS5maW5kKCIuIit0LmNzcy5pY29uKS5hZGRDbGFzcyhkWzJdKSxyLmNzc0ljb25EaXNhYmxlZCYmdS5maWx0ZXIoIi5zb3J0ZXItZmFsc2UiKS5maW5kKCIuIit0LmNzcy5pY29uKS5hZGRDbGFzcyhyLmNzc0ljb25EaXNhYmxlZCksbz0wO288bjtvKyspaWYoMiE9PWFbb11bMV0pe2lmKHU9ci4kaGVhZGVycy5maWx0ZXIoZnVuY3Rpb24oZSl7Zm9yKHZhciBvPSEwLHM9ci4kaGVhZGVycy5lcShlKSxhPXBhcnNlSW50KHMuYXR0cigiZGF0YS1jb2x1bW4iKSwxMCksbj1hK3QuZ2V0Q2xvc2VzdChzLCJ0aCwgdGQiKVswXS5jb2xTcGFuO2E8bjthKyspbz0hIW8mJihvfHx0LmlzVmFsdWVJbkFycmF5KGEsci5zb3J0TGlzdCk+LTEpO3JldHVybiBvfSksKHU9dS5ub3QoIi5zb3J0ZXItZmFsc2UiKS5maWx0ZXIoJ1tkYXRhLWNvbHVtbj0iJythW29dWzBdKyciXScrKDE9PT1uPyI6bGFzdCI6IiIpKSkubGVuZ3RoKWZvcihzPTA7czx1Lmxlbmd0aDtzKyspdVtzXS5zb3J0RGlzYWJsZWR8fGcodS5lcShzKSxhW29dWzFdKTtwLmxlbmd0aCYmZyhwLmZpbHRlcignW2RhdGEtY29sdW1uPSInK2Fbb11bMF0rJyJdJyksYVtvXVsxXSl9Zm9yKG49ci4kaGVhZGVycy5sZW5ndGgsbz0wO288bjtvKyspdC5zZXRDb2x1bW5BcmlhTGFiZWwocixyLiRoZWFkZXJzLmVxKG8pKX0sZ2V0Q2xvc2VzdDpmdW5jdGlvbih0LHIpe3JldHVybiBlLmZuLmNsb3Nlc3Q/dC5jbG9zZXN0KHIpOnQuaXMocik/dDp0LnBhcmVudHMocikuZmlsdGVyKCI6Zmlyc3QiKX0sc2V0Q29sdW1uQXJpYUxhYmVsOmZ1bmN0aW9uKHIsbyxzKXtpZihvLmxlbmd0aCl7dmFyIGE9cGFyc2VJbnQoby5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxuPXIuc29ydFZhcnNbYV0saT1vLmhhc0NsYXNzKHQuY3NzLnNvcnRBc2MpPyJzb3J0QXNjIjpvLmhhc0NsYXNzKHQuY3NzLnNvcnREZXNjKT8ic29ydERlc2MiOiJzb3J0Tm9uZSIsbD1lLnRyaW0oby50ZXh0KCkpKyI6ICIrdC5sYW5ndWFnZVtpXTtvLmhhc0NsYXNzKCJzb3J0ZXItZmFsc2UiKXx8ITE9PT1zP2wrPXQubGFuZ3VhZ2Uuc29ydERpc2FibGVkOihpPShuLmNvdW50KzEpJW4ub3JkZXIubGVuZ3RoLHM9bi5vcmRlcltpXSxsKz10Lmxhbmd1YWdlWzA9PT1zPyJuZXh0QXNjIjoxPT09cz8ibmV4dERlc2MiOiJuZXh0Tm9uZSJdKSxvLmF0dHIoImFyaWEtbGFiZWwiLGwpfX0sdXBkYXRlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciByLG8scyxhLG49ZS50YWJsZSxpPWUuJGhlYWRlcnMubGVuZ3RoO2ZvcihyPTA7cjxpO3IrKylzPWUuJGhlYWRlcnMuZXEociksYT10LmdldENvbHVtbkRhdGEobixlLmhlYWRlcnMsciwhMCksbz0iZmFsc2UiPT09dC5nZXREYXRhKHMsYSwic29ydGVyIil8fCJmYWxzZSI9PT10LmdldERhdGEocyxhLCJwYXJzZXIiKSx0LnNldENvbHVtblNvcnQoZSxzLG8pfSxzZXRDb2x1bW5Tb3J0OmZ1bmN0aW9uKGUsdCxyKXt2YXIgbz1lLnRhYmxlLmlkO3RbMF0uc29ydERpc2FibGVkPXIsdFtyPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oInNvcnRlci1mYWxzZSIpLmF0dHIoImFyaWEtZGlzYWJsZWQiLCIiK3IpLGUudGFiSW5kZXgmJihyP3QucmVtb3ZlQXR0cigidGFiaW5kZXgiKTp0LmF0dHIoInRhYmluZGV4IiwiMCIpKSxvJiYocj90LnJlbW92ZUF0dHIoImFyaWEtY29udHJvbHMiKTp0LmF0dHIoImFyaWEtY29udHJvbHMiLG8pKX0sdXBkYXRlSGVhZGVyU29ydENvdW50OmZ1bmN0aW9uKHIsbyl7dmFyIHMsYSxuLGksbCxkLGMsZyxwPW98fHIuc29ydExpc3QsdT1wLmxlbmd0aDtmb3Ioci5zb3J0TGlzdD1bXSxpPTA7aTx1O2krKylpZihjPXBbaV0sKHM9cGFyc2VJbnQoY1swXSwxMCkpPHIuY29sdW1ucyl7c3dpdGNoKHIuc29ydFZhcnNbc10ub3JkZXJ8fChnPXQuZ2V0T3JkZXIoci5zb3J0SW5pdGlhbE9yZGVyKT9yLnNvcnRSZXNldD9bMSwwLDJdOlsxLDBdOnIuc29ydFJlc2V0P1swLDEsMl06WzAsMV0sci5zb3J0VmFyc1tzXS5vcmRlcj1nLHIuc29ydFZhcnNbc10uY291bnQ9MCksZz1yLnNvcnRWYXJzW3NdLm9yZGVyLGE9KCIiK2NbMV0pLm1hdGNoKC9eKDF8ZHxzfG98bikvKSxhPWE/YVswXToiIil7Y2FzZSIxIjpjYXNlImQiOmE9MTticmVhaztjYXNlInMiOmE9bHx8MDticmVhaztjYXNlIm8iOmE9MD09PShkPWdbKGx8fDApJWcubGVuZ3RoXSk/MToxPT09ZD8wOjI7YnJlYWs7Y2FzZSJuIjphPWdbKytyLnNvcnRWYXJzW3NdLmNvdW50JWcubGVuZ3RoXTticmVhaztkZWZhdWx0OmE9MH1sPTA9PT1pP2E6bCxuPVtzLHBhcnNlSW50KGEsMTApfHwwXSxyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1uLGE9ZS5pbkFycmF5KG5bMV0sZyksci5zb3J0VmFyc1tzXS5jb3VudD1hPj0wP2E6blsxXSVnLmxlbmd0aH19LHVwZGF0ZUFsbDpmdW5jdGlvbihlLHIsbyl7dmFyIHM9ZS50YWJsZTtzLmlzVXBkYXRpbmc9ITAsdC5yZWZyZXNoV2lkZ2V0cyhzLCEwLCEwKSx0LmJ1aWxkSGVhZGVycyhlKSx0LmJpbmRFdmVudHMocyxlLiRoZWFkZXJzLCEwKSx0LmJpbmRNZXRob2RzKGUpLHQuY29tbW9uVXBkYXRlKGUscixvKX0sdXBkYXRlOmZ1bmN0aW9uKGUscixvKXtlLnRhYmxlLmlzVXBkYXRpbmc9ITAsdC51cGRhdGVIZWFkZXIoZSksdC5jb21tb25VcGRhdGUoZSxyLG8pfSx1cGRhdGVIZWFkZXJzOmZ1bmN0aW9uKGUscil7ZS50YWJsZS5pc1VwZGF0aW5nPSEwLHQuYnVpbGRIZWFkZXJzKGUpLHQuYmluZEV2ZW50cyhlLnRhYmxlLGUuJGhlYWRlcnMsITApLHQucmVzb3J0Q29tcGxldGUoZSxyKX0sdXBkYXRlQ2VsbDpmdW5jdGlvbihyLG8scyxhKXtpZihlKG8pLmNsb3Nlc3QoInRyIikuaGFzQ2xhc3Moci5jc3NDaGlsZFJvdykpY29uc29sZS53YXJuKCdUYWJsZXNvcnRlciBXYXJuaW5nISAidXBkYXRlQ2VsbCIgZm9yIGNoaWxkIHJvdyBjb250ZW50IGhhcyBiZWVuIGRpc2FibGVkLCB1c2UgInVwZGF0ZSIgaW5zdGVhZCcpO2Vsc2V7aWYodC5pc0VtcHR5T2JqZWN0KHIuY2FjaGUpKXJldHVybiB0LnVwZGF0ZUhlYWRlcihyKSx2b2lkIHQuY29tbW9uVXBkYXRlKHIscyxhKTtyLnRhYmxlLmlzVXBkYXRpbmc9ITAsci4kdGFibGUuZmluZChyLnNlbGVjdG9yUmVtb3ZlKS5yZW1vdmUoKTt2YXIgbixpLGwsZCxjLGcscD1yLiR0Ym9kaWVzLHU9ZShvKSxmPXAuaW5kZXgodC5nZXRDbG9zZXN0KHUsInRib2R5IikpLGg9ci5jYWNoZVtmXSxtPXQuZ2V0Q2xvc2VzdCh1LCJ0ciIpO2lmKG89dVswXSxwLmxlbmd0aCYmZj49MCl7aWYobD1wLmVxKGYpLmZpbmQoInRyIikubm90KCIuIityLmNzc0NoaWxkUm93KS5pbmRleChtKSxjPWgubm9ybWFsaXplZFtsXSwoZz1tWzBdLmNlbGxzLmxlbmd0aCkhPT1yLmNvbHVtbnMpZm9yKGQ9MCxuPSExLGk9MDtpPGc7aSsrKW58fG1bMF0uY2VsbHNbaV09PT1vP249ITA6ZCs9bVswXS5jZWxsc1tpXS5jb2xTcGFuO2Vsc2UgZD11LmluZGV4KCk7bj10LmdldEVsZW1lbnRUZXh0KHIsbyxkKSxjW3IuY29sdW1uc10ucmF3W2RdPW4sbj10LmdldFBhcnNlZFRleHQocixvLGQsbiksY1tkXT1uLCJudW1lcmljIj09PShyLnBhcnNlcnNbZF0udHlwZXx8IiIpLnRvTG93ZXJDYXNlKCkmJihoLmNvbE1heFtkXT1NYXRoLm1heChNYXRoLmFicyhuKXx8MCxoLmNvbE1heFtkXXx8MCkpLCExIT09KG49InVuZGVmaW5lZCIhPT1zP3M6ci5yZXNvcnQpP3QuY2hlY2tSZXNvcnQocixuLGEpOnQucmVzb3J0Q29tcGxldGUocixhKX1lbHNlIHQuZGVidWcociwiY29yZSIpJiZjb25zb2xlLmVycm9yKCJ1cGRhdGVDZWxsIGFib3J0ZWQsIHRib2R5IG1pc3Npbmcgb3Igbm90IHdpdGhpbiB0aGUgaW5kaWNhdGVkIHRhYmxlIiksci50YWJsZS5pc1VwZGF0aW5nPSExfX0sYWRkUm93czpmdW5jdGlvbihyLG8scyxhKXt2YXIgbixpLGwsZCxjLGcscCx1LGYsaCxtLGIseSx3PSJzdHJpbmciPT10eXBlb2YgbyYmMT09PXIuJHRib2RpZXMubGVuZ3RoJiYvPHRyLy50ZXN0KG98fCIiKSx4PXIudGFibGU7aWYodylvPWUobyksci4kdGJvZGllcy5hcHBlbmQobyk7ZWxzZSBpZighKG8mJm8gaW5zdGFuY2VvZiBlJiZ0LmdldENsb3Nlc3QobywidGFibGUiKVswXT09PXIudGFibGUpKXJldHVybiB0LmRlYnVnKHIsImNvcmUiKSYmY29uc29sZS5lcnJvcigiYWRkUm93cyBtZXRob2QgcmVxdWlyZXMgKDEpIGEgalF1ZXJ5IHNlbGVjdG9yIHJlZmVyZW5jZSB0byByb3dzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gdGhlIHRhYmxlLCBvciAoMikgcm93IEhUTUwgc3RyaW5nIHRvIGJlIGFkZGVkIHRvIGEgdGFibGUgd2l0aCBvbmx5IG9uZSB0Ym9keSIpLCExO2lmKHguaXNVcGRhdGluZz0hMCx0LmlzRW1wdHlPYmplY3Qoci5jYWNoZSkpdC51cGRhdGVIZWFkZXIociksdC5jb21tb25VcGRhdGUocixzLGEpO2Vsc2V7Zm9yKGM9by5maWx0ZXIoInRyIikuYXR0cigicm9sZSIsInJvdyIpLmxlbmd0aCxsPXIuJHRib2RpZXMuaW5kZXgoby5wYXJlbnRzKCJ0Ym9keSIpLmZpbHRlcigiOmZpcnN0IikpLHIucGFyc2VycyYmci5wYXJzZXJzLmxlbmd0aHx8dC5zZXR1cFBhcnNlcnMociksZD0wO2Q8YztkKyspe2ZvcihmPTAscD1vW2RdLmNlbGxzLmxlbmd0aCx1PXIuY2FjaGVbbF0ubm9ybWFsaXplZC5sZW5ndGgsbT1bXSxoPXtjaGlsZDpbXSxyYXc6W10sJHJvdzpvLmVxKGQpLG9yZGVyOnV9LGc9MDtnPHA7ZysrKWI9b1tkXS5jZWxsc1tnXSxuPXQuZ2V0RWxlbWVudFRleHQocixiLGYpLGgucmF3W2ZdPW4saT10LmdldFBhcnNlZFRleHQocixiLGYsbiksbVtmXT1pLCJudW1lcmljIj09PShyLnBhcnNlcnNbZl0udHlwZXx8IiIpLnRvTG93ZXJDYXNlKCkmJihyLmNhY2hlW2xdLmNvbE1heFtmXT1NYXRoLm1heChNYXRoLmFicyhpKXx8MCxyLmNhY2hlW2xdLmNvbE1heFtmXXx8MCkpLCh5PWIuY29sU3Bhbi0xKT4wJiYoZis9eSksZisrO21bci5jb2x1bW5zXT1oLHIuY2FjaGVbbF0ubm9ybWFsaXplZFt1XT1tfXQuY2hlY2tSZXNvcnQocixzLGEpfX0sdXBkYXRlQ2FjaGU6ZnVuY3Rpb24oZSxyLG8pe2UucGFyc2VycyYmZS5wYXJzZXJzLmxlbmd0aHx8dC5zZXR1cFBhcnNlcnMoZSxvKSx0LmJ1aWxkQ2FjaGUoZSxyLG8pfSxhcHBlbmRDYWNoZTpmdW5jdGlvbihlLHIpe3ZhciBvLHMsYSxuLGksbCxkLGM9ZS50YWJsZSxnPWUuJHRib2RpZXMscD1bXSx1PWUuY2FjaGU7aWYodC5pc0VtcHR5T2JqZWN0KHUpKXJldHVybiBlLmFwcGVuZGVyP2UuYXBwZW5kZXIoYyxwKTpjLmlzVXBkYXRpbmc/ZS4kdGFibGUudHJpZ2dlckhhbmRsZXIoInVwZGF0ZUNvbXBsZXRlIixjKToiIjtmb3IodC5kZWJ1ZyhlLCJjb3JlIikmJihkPW5ldyBEYXRlKSxsPTA7bDxnLmxlbmd0aDtsKyspaWYoKGE9Zy5lcShsKSkubGVuZ3RoKXtmb3Iobj10LnByb2Nlc3NUYm9keShjLGEsITApLHM9KG89dVtsXS5ub3JtYWxpemVkKS5sZW5ndGgsaT0wO2k8cztpKyspcFtwLmxlbmd0aF09b1tpXVtlLmNvbHVtbnNdLiRyb3csZS5hcHBlbmRlciYmKCFlLnBhZ2VyfHxlLnBhZ2VyLnJlbW92ZVJvd3N8fGUucGFnZXIuYWpheCl8fG4uYXBwZW5kKG9baV1bZS5jb2x1bW5zXS4kcm93KTt0LnByb2Nlc3NUYm9keShjLG4sITEpfWUuYXBwZW5kZXImJmUuYXBwZW5kZXIoYyxwKSx0LmRlYnVnKGUsImNvcmUiKSYmY29uc29sZS5sb2coIlJlYnVpbHQgdGFibGUiK3QuYmVuY2htYXJrKGQpKSxyfHxlLmFwcGVuZGVyfHx0LmFwcGx5V2lkZ2V0KGMpLGMuaXNVcGRhdGluZyYmZS4kdGFibGUudHJpZ2dlckhhbmRsZXIoInVwZGF0ZUNvbXBsZXRlIixjKX0sY29tbW9uVXBkYXRlOmZ1bmN0aW9uKGUscixvKXtlLiR0YWJsZS5maW5kKGUuc2VsZWN0b3JSZW1vdmUpLnJlbW92ZSgpLHQuc2V0dXBQYXJzZXJzKGUpLHQuYnVpbGRDYWNoZShlKSx0LmNoZWNrUmVzb3J0KGUscixvKX0saW5pdFNvcnQ6ZnVuY3Rpb24ocixvLHMpe2lmKHIudGFibGUuaXNVcGRhdGluZylyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe3QuaW5pdFNvcnQocixvLHMpfSw1MCk7dmFyIGEsbixpLGwsZCxjLGcscD0hc1tyLnNvcnRNdWx0aVNvcnRLZXldLHU9ci50YWJsZSxmPXIuJGhlYWRlcnMubGVuZ3RoLGg9dC5nZXRDbG9zZXN0KGUobyksInRoLCB0ZCIpLG09cGFyc2VJbnQoaC5hdHRyKCJkYXRhLWNvbHVtbiIpLDEwKSxiPXIuc29ydFZhcnNbbV0ub3JkZXI7aWYoaD1oWzBdLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0U3RhcnQiLHUpLGM9KHIuc29ydFZhcnNbbV0uY291bnQrMSklYi5sZW5ndGgsci5zb3J0VmFyc1ttXS5jb3VudD1zW3Iuc29ydFJlc2V0S2V5XT8yOmMsci5zb3J0UmVzdGFydClmb3IoaT0wO2k8ZjtpKyspZz1yLiRoZWFkZXJzLmVxKGkpLG0hPT0oYz1wYXJzZUludChnLmF0dHIoImRhdGEtY29sdW1uIiksMTApKSYmKHB8fGcuaGFzQ2xhc3ModC5jc3Muc29ydE5vbmUpKSYmKHIuc29ydFZhcnNbY10uY291bnQ9LTEpO2lmKHApe2lmKHIuc29ydExpc3Q9W10sci5sYXN0LnNvcnRMaXN0PVtdLG51bGwhPT1yLnNvcnRGb3JjZSlmb3IoYT1yLnNvcnRGb3JjZSxuPTA7bjxhLmxlbmd0aDtuKyspYVtuXVswXSE9PW0mJihyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1hW25dKTtpZigobD1iW3Iuc29ydFZhcnNbbV0uY291bnRdKTwyJiYoci5zb3J0TGlzdFtyLnNvcnRMaXN0Lmxlbmd0aF09W20sbF0saC5jb2xTcGFuPjEpKWZvcihuPTE7bjxoLmNvbFNwYW47bisrKXIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVttK24sbF0sci5zb3J0VmFyc1ttK25dLmNvdW50PWUuaW5BcnJheShsLGIpfWVsc2UgaWYoci5zb3J0TGlzdD1lLmV4dGVuZChbXSxyLmxhc3Quc29ydExpc3QpLHQuaXNWYWx1ZUluQXJyYXkobSxyLnNvcnRMaXN0KT49MClmb3Iobj0wO248ci5zb3J0TGlzdC5sZW5ndGg7bisrKShjPXIuc29ydExpc3Rbbl0pWzBdPT09bSYmKGNbMV09YltyLnNvcnRWYXJzW21dLmNvdW50XSwyPT09Y1sxXSYmKHIuc29ydExpc3Quc3BsaWNlKG4sMSksci5zb3J0VmFyc1ttXS5jb3VudD0tMSkpO2Vsc2UgaWYoKGw9YltyLnNvcnRWYXJzW21dLmNvdW50XSk8MiYmKHIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVttLGxdLGguY29sU3Bhbj4xKSlmb3Iobj0xO248aC5jb2xTcGFuO24rKylyLnNvcnRMaXN0W3Iuc29ydExpc3QubGVuZ3RoXT1bbStuLGxdLHIuc29ydFZhcnNbbStuXS5jb3VudD1lLmluQXJyYXkobCxiKTtpZihyLmxhc3Quc29ydExpc3Q9ZS5leHRlbmQoW10sci5zb3J0TGlzdCksci5zb3J0TGlzdC5sZW5ndGgmJnIuc29ydEFwcGVuZCYmKGE9ZS5pc0FycmF5KHIuc29ydEFwcGVuZCk/ci5zb3J0QXBwZW5kOnIuc29ydEFwcGVuZFtyLnNvcnRMaXN0WzBdWzBdXSwhdC5pc0VtcHR5T2JqZWN0KGEpKSlmb3Iobj0wO248YS5sZW5ndGg7bisrKWlmKGFbbl1bMF0hPT1tJiZ0LmlzVmFsdWVJbkFycmF5KGFbbl1bMF0sci5zb3J0TGlzdCk8MCl7aWYobD1hW25dWzFdLGQ9KCIiK2wpLm1hdGNoKC9eKGF8ZHxzfG98bikvKSlzd2l0Y2goYz1yLnNvcnRMaXN0WzBdWzFdLGRbMF0pe2Nhc2UiZCI6bD0xO2JyZWFrO2Nhc2UicyI6bD1jO2JyZWFrO2Nhc2UibyI6bD0wPT09Yz8xOjA7YnJlYWs7Y2FzZSJuIjpsPShjKzEpJWIubGVuZ3RoO2JyZWFrO2RlZmF1bHQ6bD0wfXIuc29ydExpc3Rbci5zb3J0TGlzdC5sZW5ndGhdPVthW25dWzBdLGxdfXIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0QmVnaW4iLHUpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnNldEhlYWRlcnNDc3MociksdC5tdWx0aXNvcnQociksdC5hcHBlbmRDYWNoZShyKSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEJlZm9yZUVuZCIsdSksci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRFbmQiLHUpfSwxKX0sbXVsdGlzb3J0OmZ1bmN0aW9uKGUpe3ZhciByLG8scyxhLG49ZS50YWJsZSxpPVtdLGw9MCxkPWUudGV4dFNvcnRlcnx8IiIsYz1lLnNvcnRMaXN0LGc9Yy5sZW5ndGgscD1lLiR0Ym9kaWVzLmxlbmd0aDtpZighZS5zZXJ2ZXJTaWRlU29ydGluZyYmIXQuaXNFbXB0eU9iamVjdChlLmNhY2hlKSl7aWYodC5kZWJ1ZyhlLCJjb3JlIikmJihvPW5ldyBEYXRlKSwib2JqZWN0Ij09dHlwZW9mIGQpZm9yKHM9ZS5jb2x1bW5zO3MtLTspImZ1bmN0aW9uIj09dHlwZW9mKGE9dC5nZXRDb2x1bW5EYXRhKG4sZCxzKSkmJihpW3NdPWEpO2ZvcihyPTA7cjxwO3IrKylzPWUuY2FjaGVbcl0uY29sTWF4LGUuY2FjaGVbcl0ubm9ybWFsaXplZC5zb3J0KGZ1bmN0aW9uKHIsbyl7dmFyIGEscCx1LGYsaCxtLGI7Zm9yKGE9MDthPGc7YSsrKXtpZih1PWNbYV1bMF0sZj1jW2FdWzFdLGw9MD09PWYsZS5zb3J0U3RhYmxlJiZyW3VdPT09b1t1XSYmMT09PWcpcmV0dXJuIHJbZS5jb2x1bW5zXS5vcmRlci1vW2UuY29sdW1uc10ub3JkZXI7aWYocD0vbi9pLnRlc3QodC5nZXRTb3J0VHlwZShlLnBhcnNlcnMsdSkpLHAmJmUuc3RyaW5nc1t1XT8ocD0iYm9vbGVhbiI9PXR5cGVvZiB0LnN0cmluZ1tlLnN0cmluZ3NbdV1dPyhsPzE6LTEpKih0LnN0cmluZ1tlLnN0cmluZ3NbdV1dPy0xOjEpOmUuc3RyaW5nc1t1XT90LnN0cmluZ1tlLnN0cmluZ3NbdV1dfHwwOjAsaD1lLm51bWJlclNvcnRlcj9lLm51bWJlclNvcnRlcihyW3VdLG9bdV0sbCxzW3VdLG4pOnRbInNvcnROdW1lcmljIisobD8iQXNjIjoiRGVzYyIpXShyW3VdLG9bdV0scCxzW3VdLHUsZSkpOihtPWw/cjpvLGI9bD9vOnIsaD0iZnVuY3Rpb24iPT10eXBlb2YgZD9kKG1bdV0sYlt1XSxsLHUsbik6ImZ1bmN0aW9uIj09dHlwZW9mIGlbdV0/aVt1XShtW3VdLGJbdV0sbCx1LG4pOnRbInNvcnROYXR1cmFsIisobD8iQXNjIjoiRGVzYyIpXShyW3VdLG9bdV0sdSxlKSksaClyZXR1cm4gaH1yZXR1cm4gcltlLmNvbHVtbnNdLm9yZGVyLW9bZS5jb2x1bW5zXS5vcmRlcn0pO3QuZGVidWcoZSwiY29yZSIpJiZjb25zb2xlLmxvZygiQXBwbHlpbmcgc29ydCAiK2MudG9TdHJpbmcoKSt0LmJlbmNobWFyayhvKSl9fSxyZXNvcnRDb21wbGV0ZTpmdW5jdGlvbih0LHIpe3QudGFibGUuaXNVcGRhdGluZyYmdC4kdGFibGUudHJpZ2dlckhhbmRsZXIoInVwZGF0ZUNvbXBsZXRlIix0LnRhYmxlKSxlLmlzRnVuY3Rpb24ocikmJnIodC50YWJsZSl9LGNoZWNrUmVzb3J0OmZ1bmN0aW9uKHIsbyxzKXt2YXIgYT1lLmlzQXJyYXkobyk/bzpyLnNvcnRMaXN0OyExPT09KHZvaWQgMD09PW8/ci5yZXNvcnQ6byl8fHIuc2VydmVyU2lkZVNvcnRpbmd8fHIudGFibGUuaXNQcm9jZXNzaW5nPyh0LnJlc29ydENvbXBsZXRlKHIscyksdC5hcHBseVdpZGdldChyLnRhYmxlLCExKSk6YS5sZW5ndGg/dC5zb3J0T24ocixhLGZ1bmN0aW9uKCl7dC5yZXNvcnRDb21wbGV0ZShyLHMpfSwhMCk6dC5zb3J0UmVzZXQocixmdW5jdGlvbigpe3QucmVzb3J0Q29tcGxldGUocixzKSx0LmFwcGx5V2lkZ2V0KHIudGFibGUsITEpfSl9LHNvcnRPbjpmdW5jdGlvbihyLG8scyxhKXt2YXIgbj1yLnRhYmxlO3IuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0U3RhcnQiLG4pLHQudXBkYXRlSGVhZGVyU29ydENvdW50KHIsbyksdC5zZXRIZWFkZXJzQ3NzKHIpLHIuZGVsYXlJbml0JiZ0LmlzRW1wdHlPYmplY3Qoci5jYWNoZSkmJnQuYnVpbGRDYWNoZShyKSxyLiR0YWJsZS50cmlnZ2VySGFuZGxlcigic29ydEJlZ2luIixuKSx0Lm11bHRpc29ydChyKSx0LmFwcGVuZENhY2hlKHIsYSksci4kdGFibGUudHJpZ2dlckhhbmRsZXIoInNvcnRCZWZvcmVFbmQiLG4pLHIuJHRhYmxlLnRyaWdnZXJIYW5kbGVyKCJzb3J0RW5kIixuKSx0LmFwcGx5V2lkZ2V0KG4pLGUuaXNGdW5jdGlvbihzKSYmcyhuKX0sc29ydFJlc2V0OmZ1bmN0aW9uKHIsbyl7ci5zb3J0TGlzdD1bXSx0LnNldEhlYWRlcnNDc3MociksdC5tdWx0aXNvcnQociksdC5hcHBlbmRDYWNoZShyKTt2YXIgcztmb3Iocz0wO3M8ci5jb2x1bW5zO3MrKylyLnNvcnRWYXJzW3NdLmNvdW50PS0xO2UuaXNGdW5jdGlvbihvKSYmbyhyLnRhYmxlKX0sZ2V0U29ydFR5cGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmZVt0XT9lW3RdLnR5cGV8fCIiOiIifSxnZXRPcmRlcjpmdW5jdGlvbihlKXtyZXR1cm4vXmQvaS50ZXN0KGUpfHwxPT09ZX0sc29ydE5hdHVyYWw6ZnVuY3Rpb24oZSxyKXtpZihlPT09cilyZXR1cm4gMDtlPWUudG9TdHJpbmcoKSxyPXIudG9TdHJpbmcoKTt2YXIgbyxzLGEsbixpLGwsZD10LnJlZ2V4O2lmKGQuaGV4LnRlc3Qocikpe2lmKG89cGFyc2VJbnQoKGV8fCIiKS5tYXRjaChkLmhleCksMTYpLHM9cGFyc2VJbnQoKHJ8fCIiKS5tYXRjaChkLmhleCksMTYpLG88cylyZXR1cm4tMTtpZihvPnMpcmV0dXJuIDF9Zm9yKG89KGV8fCIiKS5yZXBsYWNlKGQuY2h1bmssIlxcMCQxXFwwIikucmVwbGFjZShkLmNodW5rcywiIikuc3BsaXQoIlxcMCIpLHM9KHJ8fCIiKS5yZXBsYWNlKGQuY2h1bmssIlxcMCQxXFwwIikucmVwbGFjZShkLmNodW5rcywiIikuc3BsaXQoIlxcMCIpLGw9TWF0aC5tYXgoby5sZW5ndGgscy5sZW5ndGgpLGk9MDtpPGw7aSsrKXtpZihhPWlzTmFOKG9baV0pP29baV18fDA6cGFyc2VGbG9hdChvW2ldKXx8MCxuPWlzTmFOKHNbaV0pP3NbaV18fDA6cGFyc2VGbG9hdChzW2ldKXx8MCxpc05hTihhKSE9PWlzTmFOKG4pKXJldHVybiBpc05hTihhKT8xOi0xO2lmKHR5cGVvZiBhIT10eXBlb2YgbiYmKGErPSIiLG4rPSIiKSxhPG4pcmV0dXJuLTE7aWYoYT5uKXJldHVybiAxfXJldHVybiAwfSxzb3J0TmF0dXJhbEFzYzpmdW5jdGlvbihlLHIsbyxzKXtpZihlPT09cilyZXR1cm4gMDt2YXIgYT10LnN0cmluZ1tzLmVtcHRpZXNbb118fHMuZW1wdHlUb107cmV0dXJuIiI9PT1lJiYwIT09YT8iYm9vbGVhbiI9PXR5cGVvZiBhP2E/LTE6MTotYXx8LTE6IiI9PT1yJiYwIT09YT8iYm9vbGVhbiI9PXR5cGVvZiBhP2E/MTotMTphfHwxOnQuc29ydE5hdHVyYWwoZSxyKX0sc29ydE5hdHVyYWxEZXNjOmZ1bmN0aW9uKGUscixvLHMpe2lmKGU9PT1yKXJldHVybiAwO3ZhciBhPXQuc3RyaW5nW3MuZW1wdGllc1tvXXx8cy5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1hPyJib29sZWFuIj09dHlwZW9mIGE/YT8tMToxOmF8fDE6IiI9PT1yJiYwIT09YT8iYm9vbGVhbiI9PXR5cGVvZiBhP2E/MTotMTotYXx8LTE6dC5zb3J0TmF0dXJhbChyLGUpfSxzb3J0VGV4dDpmdW5jdGlvbihlLHQpe3JldHVybiBlPnQ/MTplPHQ/LTE6MH0sZ2V0VGV4dFZhbHVlOmZ1bmN0aW9uKGUsdCxyKXtpZihyKXt2YXIgbyxzPWU/ZS5sZW5ndGg6MCxhPXIrdDtmb3Iobz0wO288cztvKyspYSs9ZS5jaGFyQ29kZUF0KG8pO3JldHVybiB0KmF9cmV0dXJuIDB9LHNvcnROdW1lcmljQXNjOmZ1bmN0aW9uKGUscixvLHMsYSxuKXtpZihlPT09cilyZXR1cm4gMDt2YXIgaT10LnN0cmluZ1tuLmVtcHRpZXNbYV18fG4uZW1wdHlUb107cmV0dXJuIiI9PT1lJiYwIT09aT8iYm9vbGVhbiI9PXR5cGVvZiBpP2k/LTE6MTotaXx8LTE6IiI9PT1yJiYwIT09aT8iYm9vbGVhbiI9PXR5cGVvZiBpP2k/MTotMTppfHwxOihpc05hTihlKSYmKGU9dC5nZXRUZXh0VmFsdWUoZSxvLHMpKSxpc05hTihyKSYmKHI9dC5nZXRUZXh0VmFsdWUocixvLHMpKSxlLXIpfSxzb3J0TnVtZXJpY0Rlc2M6ZnVuY3Rpb24oZSxyLG8scyxhLG4pe2lmKGU9PT1yKXJldHVybiAwO3ZhciBpPXQuc3RyaW5nW24uZW1wdGllc1thXXx8bi5lbXB0eVRvXTtyZXR1cm4iIj09PWUmJjAhPT1pPyJib29sZWFuIj09dHlwZW9mIGk/aT8tMToxOml8fDE6IiI9PT1yJiYwIT09aT8iYm9vbGVhbiI9PXR5cGVvZiBpP2k/MTotMTotaXx8LTE6KGlzTmFOKGUpJiYoZT10LmdldFRleHRWYWx1ZShlLG8scykpLGlzTmFOKHIpJiYocj10LmdldFRleHRWYWx1ZShyLG8scykpLHItZSl9LHNvcnROdW1lcmljOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUtdH0sYWRkV2lkZ2V0OmZ1bmN0aW9uKGUpe2UuaWQmJiF0LmlzRW1wdHlPYmplY3QodC5nZXRXaWRnZXRCeUlkKGUuaWQpKSYmY29uc29sZS53YXJuKCciJytlLmlkKyciIHdpZGdldCB3YXMgbG9hZGVkIG1vcmUgdGhhbiBvbmNlIScpLHQud2lkZ2V0c1t0LndpZGdldHMubGVuZ3RoXT1lfSxoYXNXaWRnZXQ6ZnVuY3Rpb24odCxyKXtyZXR1cm4odD1lKHQpKS5sZW5ndGgmJnRbMF0uY29uZmlnJiZ0WzBdLmNvbmZpZy53aWRnZXRJbml0W3JdfHwhMX0sZ2V0V2lkZ2V0QnlJZDpmdW5jdGlvbihlKXt2YXIgcixvLHM9dC53aWRnZXRzLmxlbmd0aDtmb3Iocj0wO3I8cztyKyspaWYoKG89dC53aWRnZXRzW3JdKSYmby5pZCYmby5pZC50b0xvd2VyQ2FzZSgpPT09ZS50b0xvd2VyQ2FzZSgpKXJldHVybiBvfSxhcHBseVdpZGdldE9wdGlvbnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG49ci5jb25maWcsaT1uLndpZGdldHMubGVuZ3RoO2lmKGkpZm9yKG89MDtvPGk7bysrKShzPXQuZ2V0V2lkZ2V0QnlJZChuLndpZGdldHNbb10pKSYmcy5vcHRpb25zJiYoYT1lLmV4dGVuZCghMCx7fSxzLm9wdGlvbnMpLG4ud2lkZ2V0T3B0aW9ucz1lLmV4dGVuZCghMCxhLG4ud2lkZ2V0T3B0aW9ucyksZS5leHRlbmQoITAsdC5kZWZhdWx0cy53aWRnZXRPcHRpb25zLHMub3B0aW9ucykpfSxhZGRXaWRnZXRGcm9tQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHIsbyxzPWUuY29uZmlnLGE9Il4iK3Mud2lkZ2V0Q2xhc3MucmVwbGFjZSh0LnJlZ2V4LnRlbXBsYXRlTmFtZSwiKFxcUyspKyIpKyIkIixuPW5ldyBSZWdFeHAoYSwiZyIpLGk9KGUuY2xhc3NOYW1lfHwiIikuc3BsaXQodC5yZWdleC5zcGFjZXMpO2lmKGkubGVuZ3RoKWZvcihyPWkubGVuZ3RoLG89MDtvPHI7bysrKWlbb10ubWF0Y2gobikmJihzLndpZGdldHNbcy53aWRnZXRzLmxlbmd0aF09aVtvXS5yZXBsYWNlKG4sIiQxIikpfSxhcHBseVdpZGdldElkOmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbD0ocj1lKHIpWzBdKS5jb25maWcsZD1sLndpZGdldE9wdGlvbnMsYz10LmRlYnVnKGwsImNvcmUiKSxnPXQuZ2V0V2lkZ2V0QnlJZChvKTtnJiYoaT1nLmlkLGE9ITEsZS5pbkFycmF5KGksbC53aWRnZXRzKTwwJiYobC53aWRnZXRzW2wud2lkZ2V0cy5sZW5ndGhdPWkpLGMmJihuPW5ldyBEYXRlKSwhcyYmbC53aWRnZXRJbml0W2ldfHwobC53aWRnZXRJbml0W2ldPSEwLHIuaGFzSW5pdGlhbGl6ZWQmJnQuYXBwbHlXaWRnZXRPcHRpb25zKHIpLCJmdW5jdGlvbiI9PXR5cGVvZiBnLmluaXQmJihhPSEwLGMmJmNvbnNvbGVbY29uc29sZS5ncm91cD8iZ3JvdXAiOiJsb2ciXSgiSW5pdGlhbGl6aW5nICIraSsiIHdpZGdldCIpLGcuaW5pdChyLGcsbCxkKSkpLHN8fCJmdW5jdGlvbiIhPXR5cGVvZiBnLmZvcm1hdHx8KGE9ITAsYyYmY29uc29sZVtjb25zb2xlLmdyb3VwPyJncm91cCI6ImxvZyJdKCJVcGRhdGluZyAiK2krIiB3aWRnZXQiKSxnLmZvcm1hdChyLGwsZCwhMSkpLGMmJmEmJihjb25zb2xlLmxvZygiQ29tcGxldGVkICIrKHM/ImluaXRpYWxpemluZyAiOiJhcHBseWluZyAiKStpKyIgd2lkZ2V0Iit0LmJlbmNobWFyayhuKSksY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpKSl9LGFwcGx5V2lkZ2V0OmZ1bmN0aW9uKHIsbyxzKXt2YXIgYSxuLGksbCxkLGM9KHI9ZShyKVswXSkuY29uZmlnLGc9dC5kZWJ1ZyhjLCJjb3JlIikscD1bXTtpZighMT09PW98fCFyLmhhc0luaXRpYWxpemVkfHwhci5pc0FwcGx5aW5nV2lkZ2V0cyYmIXIuaXNVcGRhdGluZyl7aWYoZyYmKGQ9bmV3IERhdGUpLHQuYWRkV2lkZ2V0RnJvbUNsYXNzKHIpLGNsZWFyVGltZW91dChjLnRpbWVyUmVhZHkpLGMud2lkZ2V0cy5sZW5ndGgpe2ZvcihyLmlzQXBwbHlpbmdXaWRnZXRzPSEwLGMud2lkZ2V0cz1lLmdyZXAoYy53aWRnZXRzLGZ1bmN0aW9uKHQscil7cmV0dXJuIGUuaW5BcnJheSh0LGMud2lkZ2V0cyk9PT1yfSksbj0oaT1jLndpZGdldHN8fFtdKS5sZW5ndGgsYT0wO2E8bjthKyspKGw9dC5nZXRXaWRnZXRCeUlkKGlbYV0pKSYmbC5pZD8obC5wcmlvcml0eXx8KGwucHJpb3JpdHk9MTApLHBbYV09bCk6ZyYmY29uc29sZS53YXJuKCciJytpW2FdKyciIHdhcyBlbmFibGVkLCBidXQgdGhlIHdpZGdldCBjb2RlIGhhcyBub3QgYmVlbiBsb2FkZWQhJyk7Zm9yKHAuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLnByaW9yaXR5PHQucHJpb3JpdHk/LTE6ZS5wcmlvcml0eT09PXQucHJpb3JpdHk/MDoxfSksbj1wLmxlbmd0aCxnJiZjb25zb2xlW2NvbnNvbGUuZ3JvdXA/Imdyb3VwIjoibG9nIl0oIlN0YXJ0ICIrKG8/ImluaXRpYWxpemluZyI6ImFwcGx5aW5nIikrIiB3aWRnZXRzIiksYT0wO2E8bjthKyspKGw9cFthXSkmJmwuaWQmJnQuYXBwbHlXaWRnZXRJZChyLGwuaWQsbyk7ZyYmY29uc29sZS5ncm91cEVuZCYmY29uc29sZS5ncm91cEVuZCgpfWMudGltZXJSZWFkeT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5pc0FwcGx5aW5nV2lkZ2V0cz0hMSxlLmRhdGEociwibGFzdFdpZGdldEFwcGxpY2F0aW9uIixuZXcgRGF0ZSksYy4kdGFibGUudHJpZ2dlckhhbmRsZXIoInRhYmxlc29ydGVyLXJlYWR5Iiksb3x8ImZ1bmN0aW9uIiE9dHlwZW9mIHN8fHMociksZyYmKGw9Yy53aWRnZXRzLmxlbmd0aCxjb25zb2xlLmxvZygiQ29tcGxldGVkICIrKCEwPT09bz8iaW5pdGlhbGl6aW5nICI6ImFwcGx5aW5nICIpK2wrIiB3aWRnZXQiKygxIT09bD8icyI6IiIpK3QuYmVuY2htYXJrKGQpKSl9LDEwKX19LHJlbW92ZVdpZGdldDpmdW5jdGlvbihyLG8scyl7dmFyIGEsbixpLGwsZD0ocj1lKHIpWzBdKS5jb25maWc7aWYoITA9PT1vKWZvcihvPVtdLGw9dC53aWRnZXRzLmxlbmd0aCxpPTA7aTxsO2krKykobj10LndpZGdldHNbaV0pJiZuLmlkJiYob1tvLmxlbmd0aF09bi5pZCk7ZWxzZSBvPShlLmlzQXJyYXkobyk/by5qb2luKCIsIik6b3x8IiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1tccyxdKy8pO2ZvcihsPW8ubGVuZ3RoLGE9MDthPGw7YSsrKW49dC5nZXRXaWRnZXRCeUlkKG9bYV0pLChpPWUuaW5BcnJheShvW2FdLGQud2lkZ2V0cykpPj0wJiYhMCE9PXMmJmQud2lkZ2V0cy5zcGxpY2UoaSwxKSxuJiZuLnJlbW92ZSYmKHQuZGVidWcoZCwiY29yZSIpJiZjb25zb2xlLmxvZygocz8iUmVmcmVzaGluZyI6IlJlbW92aW5nIikrJyAiJytvW2FdKyciIHdpZGdldCcpLG4ucmVtb3ZlKHIsZCxkLndpZGdldE9wdGlvbnMscyksZC53aWRnZXRJbml0W29bYV1dPSExKTtkLiR0YWJsZS50cmlnZ2VySGFuZGxlcigid2lkZ2V0UmVtb3ZlRW5kIixyKX0scmVmcmVzaFdpZGdldHM6ZnVuY3Rpb24ocixvLHMpe3ZhciBhLG4saT0ocj1lKHIpWzBdKS5jb25maWcud2lkZ2V0cyxsPXQud2lkZ2V0cyxkPWwubGVuZ3RoLGM9W10sZz1mdW5jdGlvbih0KXtlKHQpLnRyaWdnZXJIYW5kbGVyKCJyZWZyZXNoQ29tcGxldGUiKX07Zm9yKGE9MDthPGQ7YSsrKShuPWxbYV0pJiZuLmlkJiYob3x8ZS5pbkFycmF5KG4uaWQsaSk8MCkmJihjW2MubGVuZ3RoXT1uLmlkKTt0LnJlbW92ZVdpZGdldChyLGMuam9pbigiLCIpLCEwKSwhMCE9PXM/KHQuYXBwbHlXaWRnZXQocixvfHwhMSxnKSxvJiZ0LmFwcGx5V2lkZ2V0KHIsITEsZykpOmcocil9LGJlbmNobWFyazpmdW5jdGlvbihlKXtyZXR1cm4iICgiKygobmV3IERhdGUpLmdldFRpbWUoKS1lLmdldFRpbWUoKSkrIiBtcykifSxsb2c6ZnVuY3Rpb24oKXtjb25zb2xlLmxvZyhhcmd1bWVudHMpfSxkZWJ1ZzpmdW5jdGlvbihlLHQpe3JldHVybiBlJiYoITA9PT1lLmRlYnVnfHwic3RyaW5nIj09dHlwZW9mIGUuZGVidWcmJmUuZGVidWcuaW5kZXhPZih0KT4tMSl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGlzVmFsdWVJbkFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIHIsbz10JiZ0Lmxlbmd0aHx8MDtmb3Iocj0wO3I8bztyKyspaWYodFtyXVswXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9LGZvcm1hdEZsb2F0OmZ1bmN0aW9uKHIsbyl7aWYoInN0cmluZyIhPXR5cGVvZiByfHwiIj09PXIpcmV0dXJuIHI7dmFyIHM7cmV0dXJuIHI9KG8mJm8uY29uZmlnPyExIT09by5jb25maWcudXNOdW1iZXJGb3JtYXQ6dm9pZCAwPT09b3x8byk/ci5yZXBsYWNlKHQucmVnZXguY29tbWEsIiIpOnIucmVwbGFjZSh0LnJlZ2V4LmRpZ2l0Tm9uVVMsIiIpLnJlcGxhY2UodC5yZWdleC5jb21tYSwiLiIpLHQucmVnZXguZGlnaXROZWdhdGl2ZVRlc3QudGVzdChyKSYmKHI9ci5yZXBsYWNlKHQucmVnZXguZGlnaXROZWdhdGl2ZVJlcGxhY2UsIi0kMSIpKSxzPXBhcnNlRmxvYXQociksaXNOYU4ocyk/ZS50cmltKHIpOnN9LGlzRGlnaXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGlzTmFOKGUpP3QucmVnZXguZGlnaXRUZXN0LnRlc3QoZS50b1N0cmluZygpLnJlcGxhY2UodC5yZWdleC5kaWdpdFJlcGxhY2UsIiIpKToiIiE9PWV9LGNvbXB1dGVDb2x1bW5JbmRleDpmdW5jdGlvbihyLG8pe3ZhciBzLGEsbixpLGwsZCxjLGcscCx1LGY9byYmby5jb2x1bW5zfHwwLGg9W10sbT1uZXcgQXJyYXkoZik7Zm9yKHM9MDtzPHIubGVuZ3RoO3MrKylmb3IoZD1yW3NdLmNlbGxzLGE9MDthPGQubGVuZ3RoO2ErKyl7Zm9yKGM9cyxnPShsPWRbYV0pLnJvd1NwYW58fDEscD1sLmNvbFNwYW58fDEsdm9pZCAwPT09aFtjXSYmKGhbY109W10pLG49MDtuPGhbY10ubGVuZ3RoKzE7bisrKWlmKHZvaWQgMD09PWhbY11bbl0pe3U9bjticmVha31mb3IoZiYmbC5jZWxsSW5kZXg9PT11fHwobC5zZXRBdHRyaWJ1dGU/bC5zZXRBdHRyaWJ1dGUoImRhdGEtY29sdW1uIix1KTplKGwpLmF0dHIoImRhdGEtY29sdW1uIix1KSksbj1jO248YytnO24rKylmb3Iodm9pZCAwPT09aFtuXSYmKGhbbl09W10pLG09aFtuXSxpPXU7aTx1K3A7aSsrKW1baV09IngifXJldHVybiB0LmNoZWNrQ29sdW1uQ291bnQocixoLG0ubGVuZ3RoKSxtLmxlbmd0aH0sY2hlY2tDb2x1bW5Db3VudDpmdW5jdGlvbihlLHQscil7dmFyIG8scyxhPSEwLG49W107Zm9yKG89MDtvPHQubGVuZ3RoO28rKylpZih0W29dJiYocz10W29dLmxlbmd0aCx0W29dLmxlbmd0aCE9PXIpKXthPSExO2JyZWFrfWF8fChlLmVhY2goZnVuY3Rpb24oZSx0KXt2YXIgcj10LnBhcmVudEVsZW1lbnQubm9kZU5hbWU7bi5pbmRleE9mKHIpPDAmJm4ucHVzaChyKX0pLGNvbnNvbGUuZXJyb3IoIkludmFsaWQgb3IgaW5jb3JyZWN0IG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSAiK24uam9pbigiIG9yICIpKyI7IGV4cGVjdGVkICIrcisiLCBidXQgZm91bmQgIitzKyIgY29sdW1ucyIpKX0sZml4Q29sdW1uV2lkdGg6ZnVuY3Rpb24ocil7dmFyIG8scyxhLG4saSxsPShyPWUocilbMF0pLmNvbmZpZyxkPWwuJHRhYmxlLmNoaWxkcmVuKCJjb2xncm91cCIpO2lmKGQubGVuZ3RoJiZkLmhhc0NsYXNzKHQuY3NzLmNvbGdyb3VwKSYmZC5yZW1vdmUoKSxsLndpZHRoRml4ZWQmJjA9PT1sLiR0YWJsZS5jaGlsZHJlbigiY29sZ3JvdXAiKS5sZW5ndGgpe2ZvcihkPWUoJzxjb2xncm91cCBjbGFzcz0iJyt0LmNzcy5jb2xncm91cCsnIj4nKSxvPWwuJHRhYmxlLndpZHRoKCksbj0oYT1sLiR0Ym9kaWVzLmZpbmQoInRyOmZpcnN0IikuY2hpbGRyZW4oIjp2aXNpYmxlIikpLmxlbmd0aCxpPTA7aTxuO2krKylzPXBhcnNlSW50KGEuZXEoaSkud2lkdGgoKS9vKjFlMywxMCkvMTArIiUiLGQuYXBwZW5kKGUoIjxjb2w+IikuY3NzKCJ3aWR0aCIscykpO2wuJHRhYmxlLnByZXBlbmQoZCl9fSxnZXREYXRhOmZ1bmN0aW9uKHQscixvKXt2YXIgcyxhLG49IiIsaT1lKHQpO3JldHVybiBpLmxlbmd0aD8ocz0hIWUubWV0YWRhdGEmJmkubWV0YWRhdGEoKSxhPSIgIisoaS5hdHRyKCJjbGFzcyIpfHwiIiksdm9pZCAwIT09aS5kYXRhKG8pfHx2b2lkIDAhPT1pLmRhdGEoby50b0xvd2VyQ2FzZSgpKT9uKz1pLmRhdGEobyl8fGkuZGF0YShvLnRvTG93ZXJDYXNlKCkpOnMmJnZvaWQgMCE9PXNbb10/bis9c1tvXTpyJiZ2b2lkIDAhPT1yW29dP24rPXJbb106IiAiIT09YSYmYS5tYXRjaCgiICIrbysiLSIpJiYobj1hLm1hdGNoKG5ldyBSZWdFeHAoIlxccyIrbysiLShbXFx3LV0rKSIpKVsxXXx8IiIpLGUudHJpbShuKSk6IiJ9LGdldENvbHVtbkRhdGE6ZnVuY3Rpb24odCxyLG8scyxhKXtpZigib2JqZWN0IiE9dHlwZW9mIHJ8fG51bGw9PT1yKXJldHVybiByO3ZhciBuLGk9KHQ9ZSh0KVswXSkuY29uZmlnLGw9YXx8aS4kaGVhZGVycyxkPWkuJGhlYWRlckluZGV4ZWQmJmkuJGhlYWRlckluZGV4ZWRbb118fGwuZmluZCgnW2RhdGEtY29sdW1uPSInK28rJyJdOmxhc3QnKTtpZih2b2lkIDAhPT1yW29dKXJldHVybiBzP3Jbb106cltsLmluZGV4KGQpXTtmb3IobiBpbiByKWlmKCJzdHJpbmciPT10eXBlb2YgbiYmZC5maWx0ZXIobikuYWRkKGQuZmluZChuKSkubGVuZ3RoKXJldHVybiByW25dfSxpc1Byb2Nlc3Npbmc6ZnVuY3Rpb24ocixvLHMpe3ZhciBhPShyPWUocikpWzBdLmNvbmZpZyxuPXN8fHIuZmluZCgiLiIrdC5jc3MuaGVhZGVyKTtvPyh2b2lkIDAhPT1zJiZhLnNvcnRMaXN0Lmxlbmd0aD4wJiYobj1uLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiF0aGlzLnNvcnREaXNhYmxlZCYmdC5pc1ZhbHVlSW5BcnJheShwYXJzZUZsb2F0KGUodGhpcykuYXR0cigiZGF0YS1jb2x1bW4iKSksYS5zb3J0TGlzdCk+PTB9KSksci5hZGQobikuYWRkQ2xhc3ModC5jc3MucHJvY2Vzc2luZysiICIrYS5jc3NQcm9jZXNzaW5nKSk6ci5hZGQobikucmVtb3ZlQ2xhc3ModC5jc3MucHJvY2Vzc2luZysiICIrYS5jc3NQcm9jZXNzaW5nKX0scHJvY2Vzc1Rib2R5OmZ1bmN0aW9uKHQscixvKXtpZih0PWUodClbMF0sbylyZXR1cm4gdC5pc1Byb2Nlc3Npbmc9ITAsci5iZWZvcmUoJzxjb2xncm91cCBjbGFzcz0idGFibGVzb3J0ZXItc2F2ZW15cGxhY2UiLz4nKSxlLmZuLmRldGFjaD9yLmRldGFjaCgpOnIucmVtb3ZlKCk7dmFyIHM9ZSh0KS5maW5kKCJjb2xncm91cC50YWJsZXNvcnRlci1zYXZlbXlwbGFjZSIpO3IuaW5zZXJ0QWZ0ZXIocykscy5yZW1vdmUoKSx0LmlzUHJvY2Vzc2luZz0hMX0sY2xlYXJUYWJsZUJvZHk6ZnVuY3Rpb24odCl7ZSh0KVswXS5jb25maWcuJHRib2RpZXMuY2hpbGRyZW4oKS5kZXRhY2goKX0sY2hhcmFjdGVyRXF1aXZhbGVudHM6e2E6IsOhw6DDosOjw6TEhcOlIixBOiLDgcOAw4LDg8OExITDhSIsYzoiw6fEh8SNIixDOiLDh8SGxIwiLGU6IsOpw6jDqsOrxJvEmSIsRToiw4nDiMOKw4vEmsSYIixpOiLDrcOsxLDDrsOvxLEiLEk6IsONw4zEsMOOw48iLG86IsOzw7LDtMO1w7bFjSIsTzoiw5PDksOUw5XDlsWMIixzczoiw58iLFNTOiLhup4iLHU6IsO6w7nDu8O8xa8iLFU6IsOaw5nDm8Ocxa4ifSxyZXBsYWNlQWNjZW50czpmdW5jdGlvbihlKXt2YXIgcixvPSJbIixzPXQuY2hhcmFjdGVyRXF1aXZhbGVudHM7aWYoIXQuY2hhcmFjdGVyUmVnZXgpe3QuY2hhcmFjdGVyUmVnZXhBcnJheT17fTtmb3IociBpbiBzKSJzdHJpbmciPT10eXBlb2YgciYmKG8rPXNbcl0sdC5jaGFyYWN0ZXJSZWdleEFycmF5W3JdPW5ldyBSZWdFeHAoIlsiK3Nbcl0rIl0iLCJnIikpO3QuY2hhcmFjdGVyUmVnZXg9bmV3IFJlZ0V4cChvKyJdIil9aWYodC5jaGFyYWN0ZXJSZWdleC50ZXN0KGUpKWZvcihyIGluIHMpInN0cmluZyI9PXR5cGVvZiByJiYoZT1lLnJlcGxhY2UodC5jaGFyYWN0ZXJSZWdleEFycmF5W3JdLHIpKTtyZXR1cm4gZX0sdmFsaWRhdGVPcHRpb25zOmZ1bmN0aW9uKHIpe3ZhciBvLHMsYSxuLGk9ImhlYWRlcnMgc29ydEZvcmNlIHNvcnRMaXN0IHNvcnRBcHBlbmQgd2lkZ2V0cyIuc3BsaXQoIiAiKSxsPXIub3JpZ2luYWxTZXR0aW5ncztpZihsKXt0LmRlYnVnKHIsImNvcmUiKSYmKG49bmV3IERhdGUpO2ZvcihvIGluIGwpaWYoInVuZGVmaW5lZCI9PT0oYT10eXBlb2YgdC5kZWZhdWx0c1tvXSkpY29uc29sZS53YXJuKCdUYWJsZXNvcnRlciBXYXJuaW5nISAidGFibGUuY29uZmlnLicrbysnIiBvcHRpb24gbm90IHJlY29nbml6ZWQnKTtlbHNlIGlmKCJvYmplY3QiPT09YSlmb3IocyBpbiBsW29dKWE9dC5kZWZhdWx0c1tvXSYmdHlwZW9mIHQuZGVmYXVsdHNbb11bc10sZS5pbkFycmF5KG8saSk8MCYmInVuZGVmaW5lZCI9PT1hJiZjb25zb2xlLndhcm4oJ1RhYmxlc29ydGVyIFdhcm5pbmchICJ0YWJsZS5jb25maWcuJytvKyIuIitzKyciIG9wdGlvbiBub3QgcmVjb2duaXplZCcpO3QuZGVidWcociwiY29yZSIpJiZjb25zb2xlLmxvZygidmFsaWRhdGUgb3B0aW9ucyB0aW1lOiIrdC5iZW5jaG1hcmsobikpfX0scmVzdG9yZUhlYWRlcnM6ZnVuY3Rpb24ocil7dmFyIG8scyxhPWUocilbMF0uY29uZmlnLG49YS4kdGFibGUuZmluZChhLnNlbGVjdG9ySGVhZGVycyksaT1uLmxlbmd0aDtmb3Iobz0wO288aTtvKyspKHM9bi5lcShvKSkuZmluZCgiLiIrdC5jc3MuaGVhZGVySW4pLmxlbmd0aCYmcy5odG1sKGEuaGVhZGVyQ29udGVudFtvXSl9LGRlc3Ryb3k6ZnVuY3Rpb24ocixvLHMpe2lmKChyPWUocilbMF0pLmhhc0luaXRpYWxpemVkKXt0LnJlbW92ZVdpZGdldChyLCEwLCExKTt2YXIgYSxuPWUociksaT1yLmNvbmZpZyxsPW4uZmluZCgidGhlYWQ6Zmlyc3QiKSxkPWwuZmluZCgidHIuIit0LmNzcy5oZWFkZXJSb3cpLnJlbW92ZUNsYXNzKHQuY3NzLmhlYWRlclJvdysiICIraS5jc3NIZWFkZXJSb3cpLGM9bi5maW5kKCJ0Zm9vdDpmaXJzdCA+IHRyIikuY2hpbGRyZW4oInRoLCB0ZCIpOyExPT09byYmZS5pbkFycmF5KCJ1aXRoZW1lIixpLndpZGdldHMpPj0wJiYobi50cmlnZ2VySGFuZGxlcigiYXBwbHlXaWRnZXRJZCIsWyJ1aXRoZW1lIl0pLG4udHJpZ2dlckhhbmRsZXIoImFwcGx5V2lkZ2V0SWQiLFsiemVicmEiXSkpLGwuZmluZCgidHIiKS5ub3QoZCkucmVtb3ZlKCksYT0ic29ydFJlc2V0IHVwZGF0ZSB1cGRhdGVSb3dzIHVwZGF0ZUFsbCB1cGRhdGVIZWFkZXJzIHVwZGF0ZUNlbGwgYWRkUm93cyB1cGRhdGVDb21wbGV0ZSBzb3J0b24gYXBwZW5kQ2FjaGUgdXBkYXRlQ2FjaGUgYXBwbHlXaWRnZXRJZCBhcHBseVdpZGdldHMgcmVmcmVzaFdpZGdldHMgcmVtb3ZlV2lkZ2V0IGRlc3Ryb3kgbW91c2V1cCBtb3VzZWxlYXZlICIrImtleXByZXNzIHNvcnRCZWdpbiBzb3J0RW5kIHJlc2V0VG9Mb2FkU3RhdGUgIi5zcGxpdCgiICIpLmpvaW4oaS5uYW1lc3BhY2UrIiAiKSxuLnJlbW92ZURhdGEoInRhYmxlc29ydGVyIikudW5iaW5kKGEucmVwbGFjZSh0LnJlZ2V4LnNwYWNlcywiICIpKSxpLiRoZWFkZXJzLmFkZChjKS5yZW1vdmVDbGFzcyhbdC5jc3MuaGVhZGVyLGkuY3NzSGVhZGVyLGkuY3NzQXNjLGkuY3NzRGVzYyx0LmNzcy5zb3J0QXNjLHQuY3NzLnNvcnREZXNjLHQuY3NzLnNvcnROb25lXS5qb2luKCIgIikpLnJlbW92ZUF0dHIoImRhdGEtY29sdW1uIikucmVtb3ZlQXR0cigiYXJpYS1sYWJlbCIpLmF0dHIoImFyaWEtZGlzYWJsZWQiLCJ0cnVlIiksZC5maW5kKGkuc2VsZWN0b3JTb3J0KS51bmJpbmQoIm1vdXNlZG93biBtb3VzZXVwIGtleXByZXNzICIuc3BsaXQoIiAiKS5qb2luKGkubmFtZXNwYWNlKyIgIikucmVwbGFjZSh0LnJlZ2V4LnNwYWNlcywiICIpKSx0LnJlc3RvcmVIZWFkZXJzKHIpLG4udG9nZ2xlQ2xhc3ModC5jc3MudGFibGUrIiAiK2kudGFibGVDbGFzcysiIHRhYmxlc29ydGVyLSIraS50aGVtZSwhMT09PW8pLG4ucmVtb3ZlQ2xhc3MoaS5uYW1lc3BhY2Uuc2xpY2UoMSkpLHIuaGFzSW5pdGlhbGl6ZWQ9ITEsZGVsZXRlIHIuY29uZmlnLmNhY2hlLCJmdW5jdGlvbiI9PXR5cGVvZiBzJiZzKHIpLHQuZGVidWcoaSwiY29yZSIpJiZjb25zb2xlLmxvZygidGFibGVzb3J0ZXIgaGFzIGJlZW4gcmVtb3ZlZCIpfX19O2UuZm4udGFibGVzb3J0ZXI9ZnVuY3Rpb24ocil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBvPXRoaXMscz1lLmV4dGVuZCghMCx7fSx0LmRlZmF1bHRzLHIsdC5pbnN0YW5jZU1ldGhvZHMpO3Mub3JpZ2luYWxTZXR0aW5ncz1yLCFvLmhhc0luaXRpYWxpemVkJiZ0LmJ1aWxkVGFibGUmJiJUQUJMRSIhPT10aGlzLm5vZGVOYW1lP3QuYnVpbGRUYWJsZShvLHMpOnQuc2V0dXAobyxzKX0pfSx3aW5kb3cuY29uc29sZSYmd2luZG93LmNvbnNvbGUubG9nfHwodC5sb2dzPVtdLGNvbnNvbGU9e30sY29uc29sZS5sb2c9Y29uc29sZS53YXJuPWNvbnNvbGUuZXJyb3I9Y29uc29sZS50YWJsZT1mdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHM6YXJndW1lbnRzWzBdO3QubG9nc1t0LmxvZ3MubGVuZ3RoXT17ZGF0ZTpEYXRlLm5vdygpLGxvZzplfX0pLHQuYWRkUGFyc2VyKHtpZDoibm8tcGFyc2VyIixpczpmdW5jdGlvbigpe3JldHVybiExfSxmb3JtYXQ6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sdHlwZToidGV4dCJ9KSx0LmFkZFBhcnNlcih7aWQ6InRleHQiLGlzOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGZvcm1hdDpmdW5jdGlvbihyLG8pe3ZhciBzPW8uY29uZmlnO3JldHVybiByJiYocj1lLnRyaW0ocy5pZ25vcmVDYXNlP3IudG9Mb2NhbGVMb3dlckNhc2UoKTpyKSxyPXMuc29ydExvY2FsZUNvbXBhcmU/dC5yZXBsYWNlQWNjZW50cyhyKTpyKSxyfSx0eXBlOiJ0ZXh0In0pLHQucmVnZXgubm9uZGlnaXQ9L1teXHcsLiBcLSgpXS9nLHQuYWRkUGFyc2VyKHtpZDoiZGlnaXQiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LmlzRGlnaXQoZSl9LGZvcm1hdDpmdW5jdGlvbihyLG8pe3ZhciBzPXQuZm9ybWF0RmxvYXQoKHJ8fCIiKS5yZXBsYWNlKHQucmVnZXgubm9uZGlnaXQsIiIpLG8pO3JldHVybiByJiYibnVtYmVyIj09dHlwZW9mIHM/czpyP2UudHJpbShyJiZvLmNvbmZpZy5pZ25vcmVDYXNlP3IudG9Mb2NhbGVMb3dlckNhc2UoKTpyKTpyfSx0eXBlOiJudW1lcmljIn0pLHQucmVnZXguY3VycmVuY3lSZXBsYWNlPS9bK1wtLC4gXS9nLHQucmVnZXguY3VycmVuY3lUZXN0PS9eXCg/XGQrW1x1MDBhMyRcdTIwYWNcdTAwYTRcdTAwYTVcdTAwYTI/Ll18W1x1MDBhMyRcdTIwYWNcdTAwYTRcdTAwYTVcdTAwYTI/Ll1cZCtcKT8kLyx0LmFkZFBhcnNlcih7aWQ6ImN1cnJlbmN5IixpczpmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8IiIpLnJlcGxhY2UodC5yZWdleC5jdXJyZW5jeVJlcGxhY2UsIiIpLHQucmVnZXguY3VycmVuY3lUZXN0LnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihyLG8pe3ZhciBzPXQuZm9ybWF0RmxvYXQoKHJ8fCIiKS5yZXBsYWNlKHQucmVnZXgubm9uZGlnaXQsIiIpLG8pO3JldHVybiByJiYibnVtYmVyIj09dHlwZW9mIHM/czpyP2UudHJpbShyJiZvLmNvbmZpZy5pZ25vcmVDYXNlP3IudG9Mb2NhbGVMb3dlckNhc2UoKTpyKTpyfSx0eXBlOiJudW1lcmljIn0pLHQucmVnZXgudXJsUHJvdG9jb2xUZXN0PS9eKGh0dHBzP3xmdHB8ZmlsZSk6XC9cLy8sdC5yZWdleC51cmxQcm90b2NvbFJlcGxhY2U9LyhodHRwcz98ZnRwfGZpbGUpOlwvXC8od3d3XC4pPy8sdC5hZGRQYXJzZXIoe2lkOiJ1cmwiLGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0LnJlZ2V4LnVybFByb3RvY29sVGVzdC50ZXN0KGUpfSxmb3JtYXQ6ZnVuY3Rpb24ocil7cmV0dXJuIHI/ZS50cmltKHIucmVwbGFjZSh0LnJlZ2V4LnVybFByb3RvY29sUmVwbGFjZSwiIikpOnJ9LHR5cGU6InRleHQifSksdC5yZWdleC5kYXNoPS8tL2csdC5yZWdleC5pc29EYXRlPS9eXGR7NH1bXC9cLV1cZHsxLDJ9W1wvXC1dXGR7MSwyfS8sdC5hZGRQYXJzZXIoe2lkOiJpc29EYXRlIixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC5pc29EYXRlLnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihlKXt2YXIgcj1lP25ldyBEYXRlKGUucmVwbGFjZSh0LnJlZ2V4LmRhc2gsIi8iKSk6ZTtyZXR1cm4gciBpbnN0YW5jZW9mIERhdGUmJmlzRmluaXRlKHIpP3IuZ2V0VGltZSgpOmV9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC5wZXJjZW50PS8lL2csdC5yZWdleC5wZXJjZW50VGVzdD0vKFxkXHMqPyV8JVxzKj9cZCkvLHQuYWRkUGFyc2VyKHtpZDoicGVyY2VudCIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVnZXgucGVyY2VudFRlc3QudGVzdChlKSYmZS5sZW5ndGg8MTV9LGZvcm1hdDpmdW5jdGlvbihlLHIpe3JldHVybiBlP3QuZm9ybWF0RmxvYXQoZS5yZXBsYWNlKHQucmVnZXgucGVyY2VudCwiIikscik6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LmFkZFBhcnNlcih7aWQ6ImltYWdlIixpczpmdW5jdGlvbihlLHQscixvKXtyZXR1cm4gby5maW5kKCJpbWciKS5sZW5ndGg+MH0sZm9ybWF0OmZ1bmN0aW9uKHQscixvKXtyZXR1cm4gZShvKS5maW5kKCJpbWciKS5hdHRyKHIuY29uZmlnLmltZ0F0dHJ8fCJhbHQiKXx8dH0scGFyc2VkOiEwLHR5cGU6InRleHQifSksdC5yZWdleC5kYXRlUmVwbGFjZT0vKFxTKShbQVBdTSkkL2ksdC5yZWdleC51c0xvbmdEYXRlVGVzdDE9L15bQS1aXXszLDEwfVwuP1xzK1xkezEsMn0sP1xzKyhcZHs0fSkoXHMrXGR7MSwyfTpcZHsyfSg6XGR7Mn0pPyhccytbQVBdTSk/KT8kL2ksdC5yZWdleC51c0xvbmdEYXRlVGVzdDI9L15cZHsxLDJ9XHMrW0EtWl17MywxMH1ccytcZHs0fS9pLHQuYWRkUGFyc2VyKHtpZDoidXNMb25nRGF0ZSIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucmVnZXgudXNMb25nRGF0ZVRlc3QxLnRlc3QoZSl8fHQucmVnZXgudXNMb25nRGF0ZVRlc3QyLnRlc3QoZSl9LGZvcm1hdDpmdW5jdGlvbihlKXt2YXIgcj1lP25ldyBEYXRlKGUucmVwbGFjZSh0LnJlZ2V4LmRhdGVSZXBsYWNlLCIkMSAkMiIpKTplO3JldHVybiByIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUocik/ci5nZXRUaW1lKCk6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LnJlZ2V4LnNob3J0RGF0ZVRlc3Q9LyheXGR7MSwyfVtcL1xzXVxkezEsMn1bXC9cc11cZHs0fSl8KF5cZHs0fVtcL1xzXVxkezEsMn1bXC9cc11cZHsxLDJ9KS8sdC5yZWdleC5zaG9ydERhdGVSZXBsYWNlPS9bXC0uLF0vZyx0LnJlZ2V4LnNob3J0RGF0ZVhYWT0vKFxkezEsMn0pW1wvXHNdKFxkezEsMn0pW1wvXHNdKFxkezR9KS8sdC5yZWdleC5zaG9ydERhdGVZTUQ9LyhcZHs0fSlbXC9cc10oXGR7MSwyfSlbXC9cc10oXGR7MSwyfSkvLHQuY29udmVydEZvcm1hdD1mdW5jdGlvbihlLHIpe2U9KGV8fCIiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikucmVwbGFjZSh0LnJlZ2V4LnNob3J0RGF0ZVJlcGxhY2UsIi8iKSwibW1kZHl5eXkiPT09cj9lPWUucmVwbGFjZSh0LnJlZ2V4LnNob3J0RGF0ZVhYWSwiJDMvJDEvJDIiKToiZGRtbXl5eXkiPT09cj9lPWUucmVwbGFjZSh0LnJlZ2V4LnNob3J0RGF0ZVhYWSwiJDMvJDIvJDEiKToieXl5eW1tZGQiPT09ciYmKGU9ZS5yZXBsYWNlKHQucmVnZXguc2hvcnREYXRlWU1ELCIkMS8kMi8kMyIpKTt2YXIgbz1uZXcgRGF0ZShlKTtyZXR1cm4gbyBpbnN0YW5jZW9mIERhdGUmJmlzRmluaXRlKG8pP28uZ2V0VGltZSgpOiIifSx0LmFkZFBhcnNlcih7aWQ6InNob3J0RGF0ZSIsaXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9KGV8fCIiKS5yZXBsYWNlKHQucmVnZXguc3BhY2VzLCIgIikucmVwbGFjZSh0LnJlZ2V4LnNob3J0RGF0ZVJlcGxhY2UsIi8iKSx0LnJlZ2V4LnNob3J0RGF0ZVRlc3QudGVzdChlKX0sZm9ybWF0OmZ1bmN0aW9uKGUscixvLHMpe2lmKGUpe3ZhciBhPXIuY29uZmlnLG49YS4kaGVhZGVySW5kZXhlZFtzXSxpPW4ubGVuZ3RoJiZuLmRhdGEoImRhdGVGb3JtYXQiKXx8dC5nZXREYXRhKG4sdC5nZXRDb2x1bW5EYXRhKHIsYS5oZWFkZXJzLHMpLCJkYXRlRm9ybWF0Iil8fGEuZGF0ZUZvcm1hdDtyZXR1cm4gbi5sZW5ndGgmJm4uZGF0YSgiZGF0ZUZvcm1hdCIsaSksdC5jb252ZXJ0Rm9ybWF0KGUsaSl8fGV9cmV0dXJuIGV9LHR5cGU6Im51bWVyaWMifSksdC5yZWdleC50aW1lVGVzdD0vXigwP1sxLTldfDFbMC0yXSk6KFswLTVdXGQpKFxzW0FQXU0pJHxeKCg/OlswMV1cZHxbMl1bMC00XSk6WzAtNV1cZCkkL2ksdC5yZWdleC50aW1lTWF0Y2g9LygwP1sxLTldfDFbMC0yXSk6KFswLTVdXGQpKFxzW0FQXU0pfCgoPzpbMDFdXGR8WzJdWzAtNF0pOlswLTVdXGQpL2ksdC5hZGRQYXJzZXIoe2lkOiJ0aW1lIixpczpmdW5jdGlvbihlKXtyZXR1cm4gdC5yZWdleC50aW1lVGVzdC50ZXN0KGUpfSxmb3JtYXQ6ZnVuY3Rpb24oZSl7dmFyIHIsbz0oZXx8IiIpLm1hdGNoKHQucmVnZXgudGltZU1hdGNoKSxzPW5ldyBEYXRlKGUpLGE9ZSYmKG51bGwhPT1vP29bMF06IjAwOjAwIEFNIiksbj1hP25ldyBEYXRlKCIyMDAwLzAxLzAxICIrYS5yZXBsYWNlKHQucmVnZXguZGF0ZVJlcGxhY2UsIiQxICQyIikpOmE7cmV0dXJuIG4gaW5zdGFuY2VvZiBEYXRlJiZpc0Zpbml0ZShuKT8ocj1zIGluc3RhbmNlb2YgRGF0ZSYmaXNGaW5pdGUocyk/cy5nZXRUaW1lKCk6MCxyP3BhcnNlRmxvYXQobi5nZXRUaW1lKCkrIi4iK3MuZ2V0VGltZSgpKTpuLmdldFRpbWUoKSk6ZX0sdHlwZToibnVtZXJpYyJ9KSx0LmFkZFBhcnNlcih7aWQ6Im1ldGFkYXRhIixpczpmdW5jdGlvbigpe3JldHVybiExfSxmb3JtYXQ6ZnVuY3Rpb24odCxyLG8pe3ZhciBzPXIuY29uZmlnLGE9cy5wYXJzZXJNZXRhZGF0YU5hbWU/cy5wYXJzZXJNZXRhZGF0YU5hbWU6InNvcnRWYWx1ZSI7cmV0dXJuIGUobykubWV0YWRhdGEoKVthXX0sdHlwZToibnVtZXJpYyJ9KSx0LmFkZFdpZGdldCh7aWQ6InplYnJhIixwcmlvcml0eTo5MCxmb3JtYXQ6ZnVuY3Rpb24odCxyLG8pe3ZhciBzLGEsbixpLGwsZCxjLGc9bmV3IFJlZ0V4cChyLmNzc0NoaWxkUm93LCJpIikscD1yLiR0Ym9kaWVzLmFkZChlKHIubmFtZXNwYWNlKyJfZXh0cmFfdGFibGUiKS5jaGlsZHJlbigidGJvZHk6bm90KC4iK3IuY3NzSW5mb0Jsb2NrKyIpIikpO2ZvcihsPTA7bDxwLmxlbmd0aDtsKyspZm9yKG49MCxjPShzPXAuZXEobCkuY2hpbGRyZW4oInRyOnZpc2libGUiKS5ub3Qoci5zZWxlY3RvclJlbW92ZSkpLmxlbmd0aCxkPTA7ZDxjO2QrKylhPXMuZXEoZCksZy50ZXN0KGFbMF0uY2xhc3NOYW1lKXx8bisrLGk9biUyPT0wLGEucmVtb3ZlQ2xhc3Moby56ZWJyYVtpPzE6MF0pLmFkZENsYXNzKG8uemVicmFbaT8wOjFdKX0scmVtb3ZlOmZ1bmN0aW9uKGUscixvLHMpe2lmKCFzKXt2YXIgYSxuLGk9ci4kdGJvZGllcyxsPShvLnplYnJhfHxbImV2ZW4iLCJvZGQiXSkuam9pbigiICIpO2ZvcihhPTA7YTxpLmxlbmd0aDthKyspKG49dC5wcm9jZXNzVGJvZHkoZSxpLmVxKGEpLCEwKSkuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcyhsKSx0LnByb2Nlc3NUYm9keShlLG4sITEpfX19KX0oZSksZS50YWJsZXNvcnRlcn0pOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKgogICAgQ29weXJpZ2h0IDIwMDgtMjAxMwogICAgICAgIE1hdHRoaWFzIEVobWFubiwKICAgICAgICBNaWNoYWVsIEdlcmhhZXVzZXIsCiAgICAgICAgQ2Fyc3RlbiBNaWxsZXIsCiAgICAgICAgQmlhbmNhIFZhbGVudGluLAogICAgICAgIEFsZnJlZCBXYXNzZXJtYW5uLAogICAgICAgIFBldGVyIFdpbGZhaHJ0CiAgICBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgb3IgTEdQTCBWZXJzaW9uIDMgbGljZW5zZXMuCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggSlNYQ29tcHJlc3Nvci4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlIGFsb25nIHdpdGggSlNYQ29tcHJlc3Nvci4KICAgIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvPi4KKi8KKGZ1bmN0aW9uKCl7dmFyIGUscixuOyhmdW5jdGlvbih0KXtmdW5jdGlvbiBvKGUscil7cmV0dXJuIEMuY2FsbChlLHIpfWZ1bmN0aW9uIGkoZSxyKXt2YXIgbix0LG8saSxhLHUsYyxmLHMsbCxwPXImJnIuc3BsaXQoIi8iKSxoPWsubWFwLGQ9aCYmaFsiKiJdfHx7fTtpZihlJiYiLiI9PT1lLmNoYXJBdCgwKSlpZihyKXtmb3IocD1wLnNsaWNlKDAscC5sZW5ndGgtMSksZT1wLmNvbmNhdChlLnNwbGl0KCIvIikpLGY9MDtlLmxlbmd0aD5mO2YrPTEpaWYobD1lW2ZdLCIuIj09PWwpZS5zcGxpY2UoZiwxKSxmLT0xO2Vsc2UgaWYoIi4uIj09PWwpe2lmKDE9PT1mJiYoIi4uIj09PWVbMl18fCIuLiI9PT1lWzBdKSlicmVhaztmPjAmJihlLnNwbGljZShmLTEsMiksZi09Mil9ZT1lLmpvaW4oIi8iKX1lbHNlIDA9PT1lLmluZGV4T2YoIi4vIikmJihlPWUuc3Vic3RyaW5nKDIpKTtpZigocHx8ZCkmJmgpe2ZvcihuPWUuc3BsaXQoIi8iKSxmPW4ubGVuZ3RoO2Y+MDtmLT0xKXtpZih0PW4uc2xpY2UoMCxmKS5qb2luKCIvIikscClmb3Iocz1wLmxlbmd0aDtzPjA7cy09MSlpZihvPWhbcC5zbGljZSgwLHMpLmpvaW4oIi8iKV0sbyYmKG89b1t0XSkpe2k9byxhPWY7YnJlYWt9aWYoaSlicmVhazshdSYmZCYmZFt0XSYmKHU9ZFt0XSxjPWYpfSFpJiZ1JiYoaT11LGE9YyksaSYmKG4uc3BsaWNlKDAsYSxpKSxlPW4uam9pbigiLyIpKX1yZXR1cm4gZX1mdW5jdGlvbiBhKGUscil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGguYXBwbHkodCx2LmNhbGwoYXJndW1lbnRzLDApLmNvbmNhdChbZSxyXSkpfX1mdW5jdGlvbiB1KGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gaShyLGUpfX1mdW5jdGlvbiBjKGUpe3JldHVybiBmdW5jdGlvbihyKXtiW2VdPXJ9fWZ1bmN0aW9uIGYoZSl7aWYobyhtLGUpKXt2YXIgcj1tW2VdO2RlbGV0ZSBtW2VdLHlbZV09ITAscC5hcHBseSh0LHIpfWlmKCFvKGIsZSkmJiFvKHksZSkpdGhyb3cgRXJyb3IoIk5vICIrZSk7cmV0dXJuIGJbZV19ZnVuY3Rpb24gcyhlKXt2YXIgcixuPWU/ZS5pbmRleE9mKCIhIik6LTE7cmV0dXJuIG4+LTEmJihyPWUuc3Vic3RyaW5nKDAsbiksZT1lLnN1YnN0cmluZyhuKzEsZS5sZW5ndGgpKSxbcixlXX1mdW5jdGlvbiBsKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBrJiZrLmNvbmZpZyYmay5jb25maWdbZV18fHt9fX12YXIgcCxoLGQsZyxiPXt9LG09e30saz17fSx5PXt9LEM9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx2PVtdLnNsaWNlO2Q9ZnVuY3Rpb24oZSxyKXt2YXIgbix0PXMoZSksbz10WzBdO3JldHVybiBlPXRbMV0sbyYmKG89aShvLHIpLG49ZihvKSksbz9lPW4mJm4ubm9ybWFsaXplP24ubm9ybWFsaXplKGUsdShyKSk6aShlLHIpOihlPWkoZSxyKSx0PXMoZSksbz10WzBdLGU9dFsxXSxvJiYobj1mKG8pKSkse2Y6bz9vKyIhIitlOmUsbjplLHByOm8scDpufX0sZz17cmVxdWlyZTpmdW5jdGlvbihlKXtyZXR1cm4gYShlKX0sZXhwb3J0czpmdW5jdGlvbihlKXt2YXIgcj1iW2VdO3JldHVybiByIT09dm9pZCAwP3I6YltlXT17fX0sbW9kdWxlOmZ1bmN0aW9uKGUpe3JldHVybntpZDplLHVyaToiIixleHBvcnRzOmJbZV0sY29uZmlnOmwoZSl9fX0scD1mdW5jdGlvbihlLHIsbixpKXt2YXIgdSxzLGwscCxoLGssQz1bXTtpZihpPWl8fGUsImZ1bmN0aW9uIj09dHlwZW9mIG4pe2ZvcihyPSFyLmxlbmd0aCYmbi5sZW5ndGg/WyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdOnIsaD0wO3IubGVuZ3RoPmg7aCs9MSlpZihwPWQocltoXSxpKSxzPXAuZiwicmVxdWlyZSI9PT1zKUNbaF09Zy5yZXF1aXJlKGUpO2Vsc2UgaWYoImV4cG9ydHMiPT09cylDW2hdPWcuZXhwb3J0cyhlKSxrPSEwO2Vsc2UgaWYoIm1vZHVsZSI9PT1zKXU9Q1toXT1nLm1vZHVsZShlKTtlbHNlIGlmKG8oYixzKXx8byhtLHMpfHxvKHkscykpQ1toXT1mKHMpO2Vsc2V7aWYoIXAucCl0aHJvdyBFcnJvcihlKyIgbWlzc2luZyAiK3MpO3AucC5sb2FkKHAubixhKGksITApLGMocykse30pLENbaF09YltzXX1sPW4uYXBwbHkoYltlXSxDKSxlJiYodSYmdS5leHBvcnRzIT09dCYmdS5leHBvcnRzIT09YltlXT9iW2VdPXUuZXhwb3J0czpsPT09dCYma3x8KGJbZV09bCkpfWVsc2UgZSYmKGJbZV09bil9LGU9cj1oPWZ1bmN0aW9uKGUscixuLG8saSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP2dbZV0/Z1tlXShyKTpmKGQoZSxyKS5mKTooZS5zcGxpY2V8fChrPWUsci5zcGxpY2U/KGU9cixyPW4sbj1udWxsKTplPXQpLHI9cnx8ZnVuY3Rpb24oKXt9LCJmdW5jdGlvbiI9PXR5cGVvZiBuJiYobj1vLG89aSksbz9wKHQsZSxyLG4pOnNldFRpbWVvdXQoZnVuY3Rpb24oKXtwKHQsZSxyLG4pfSw0KSxoKX0saC5jb25maWc9ZnVuY3Rpb24oZSl7cmV0dXJuIGs9ZSxrLmRlcHMmJmgoay5kZXBzLGsuY2FsbGJhY2spLGh9LG49ZnVuY3Rpb24oZSxyLG4pe3Iuc3BsaWNlfHwobj1yLHI9W10pLG8oYixlKXx8byhtLGUpfHwobVtlXT1bZSxyLG5dKX0sbi5hbWQ9e2pRdWVyeTohMH19KSgpLG4oIi4uL25vZGVfbW9kdWxlcy9hbG1vbmQvYWxtb25kIixmdW5jdGlvbigpe30pLG4oImp4ZyIsW10sZnVuY3Rpb24oKXt2YXIgZT17fTtyZXR1cm4ib2JqZWN0IiE9dHlwZW9mIEpYR3x8SlhHLmV4dGVuZHx8KGU9SlhHKSxlLmV4dGVuZD1mdW5jdGlvbihlLHIsbix0KXt2YXIgbyxpO249bnx8ITEsdD10fHwhMTtmb3IobyBpbiByKSghbnx8biYmci5oYXNPd25Qcm9wZXJ0eShvKSkmJihpPXQ/by50b0xvd2VyQ2FzZSgpOm8sZVtpXT1yW29dKX0sZS5leHRlbmQoZSx7Ym9hcmRzOnt9LHJlYWRlcnM6e30sZWxlbWVudHM6e30scmVnaXN0ZXJFbGVtZW50OmZ1bmN0aW9uKGUscil7ZT1lLnRvTG93ZXJDYXNlKCksdGhpcy5lbGVtZW50c1tlXT1yfSxyZWdpc3RlclJlYWRlcjpmdW5jdGlvbihlLHIpe3ZhciBuLHQ7Zm9yKG49MDtyLmxlbmd0aD5uO24rKyl0PXJbbl0udG9Mb3dlckNhc2UoKSwiZnVuY3Rpb24iIT10eXBlb2YgdGhpcy5yZWFkZXJzW3RdJiYodGhpcy5yZWFkZXJzW3RdPWUpfSxzaG9ydGN1dDpmdW5jdGlvbihlLHIpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlW3JdLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LGdldFJlZjpmdW5jdGlvbihlLHIpe3JldHVybiBlLnNlbGVjdChyKX0sZ2V0UmVmZXJlbmNlOmZ1bmN0aW9uKGUscil7cmV0dXJuIGUuc2VsZWN0KHIpfSxkZWJ1Z0ludDpmdW5jdGlvbigpe3ZhciBlLHI7Zm9yKGU9MDthcmd1bWVudHMubGVuZ3RoPmU7ZSsrKXI9YXJndW1lbnRzW2VdLCJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2c/Y29uc29sZS5sb2cocik6Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRlYnVnIikmJihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGVidWciKS5pbm5lckhUTUwrPXIrIjxici8+Iil9LGRlYnVnV1NUOmZ1bmN0aW9uKCl7dmFyIHI9RXJyb3IoKTtlLmRlYnVnSW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyJiZyLnN0YWNrJiYoZS5kZWJ1Z0ludCgic3RhY2t0cmFjZSIpLGUuZGVidWdJbnQoci5zdGFjay5zcGxpdCgiXG4iKS5zbGljZSgxKS5qb2luKCJcbiIpKSl9LGRlYnVnTGluZTpmdW5jdGlvbigpe3ZhciByPUVycm9yKCk7ZS5kZWJ1Z0ludC5hcHBseSh0aGlzLGFyZ3VtZW50cyksciYmci5zdGFjayYmZS5kZWJ1Z0ludCgiQ2FsbGVkIGZyb20iLHIuc3RhY2suc3BsaXQoIlxuIikuc2xpY2UoMiwzKS5qb2luKCJcbiIpKX0sZGVidWc6ZnVuY3Rpb24oKXtlLmRlYnVnSW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KSxlfSksbigidXRpbHMvemlwIixbImp4ZyJdLGZ1bmN0aW9uKGUpe3ZhciByPVswLDEyOCw2NCwxOTIsMzIsMTYwLDk2LDIyNCwxNiwxNDQsODAsMjA4LDQ4LDE3NiwxMTIsMjQwLDgsMTM2LDcyLDIwMCw0MCwxNjgsMTA0LDIzMiwyNCwxNTIsODgsMjE2LDU2LDE4NCwxMjAsMjQ4LDQsMTMyLDY4LDE5NiwzNiwxNjQsMTAwLDIyOCwyMCwxNDgsODQsMjEyLDUyLDE4MCwxMTYsMjQ0LDEyLDE0MCw3NiwyMDQsNDQsMTcyLDEwOCwyMzYsMjgsMTU2LDkyLDIyMCw2MCwxODgsMTI0LDI1MiwyLDEzMCw2NiwxOTQsMzQsMTYyLDk4LDIyNiwxOCwxNDYsODIsMjEwLDUwLDE3OCwxMTQsMjQyLDEwLDEzOCw3NCwyMDIsNDIsMTcwLDEwNiwyMzQsMjYsMTU0LDkwLDIxOCw1OCwxODYsMTIyLDI1MCw2LDEzNCw3MCwxOTgsMzgsMTY2LDEwMiwyMzAsMjIsMTUwLDg2LDIxNCw1NCwxODIsMTE4LDI0NiwxNCwxNDIsNzgsMjA2LDQ2LDE3NCwxMTAsMjM4LDMwLDE1OCw5NCwyMjIsNjIsMTkwLDEyNiwyNTQsMSwxMjksNjUsMTkzLDMzLDE2MSw5NywyMjUsMTcsMTQ1LDgxLDIwOSw0OSwxNzcsMTEzLDI0MSw5LDEzNyw3MywyMDEsNDEsMTY5LDEwNSwyMzMsMjUsMTUzLDg5LDIxNyw1NywxODUsMTIxLDI0OSw1LDEzMyw2OSwxOTcsMzcsMTY1LDEwMSwyMjksMjEsMTQ5LDg1LDIxMyw1MywxODEsMTE3LDI0NSwxMywxNDEsNzcsMjA1LDQ1LDE3MywxMDksMjM3LDI5LDE1Nyw5MywyMjEsNjEsMTg5LDEyNSwyNTMsMywxMzEsNjcsMTk1LDM1LDE2Myw5OSwyMjcsMTksMTQ3LDgzLDIxMSw1MSwxNzksMTE1LDI0MywxMSwxMzksNzUsMjAzLDQzLDE3MSwxMDcsMjM1LDI3LDE1NSw5MSwyMTksNTksMTg3LDEyMywyNTEsNywxMzUsNzEsMTk5LDM5LDE2NywxMDMsMjMxLDIzLDE1MSw4NywyMTUsNTUsMTgzLDExOSwyNDcsMTUsMTQzLDc5LDIwNyw0NywxNzUsMTExLDIzOSwzMSwxNTksOTUsMjIzLDYzLDE5MSwxMjcsMjU1XSxuPVszLDQsNSw2LDcsOCw5LDEwLDExLDEzLDE1LDE3LDE5LDIzLDI3LDMxLDM1LDQzLDUxLDU5LDY3LDgzLDk5LDExNSwxMzEsMTYzLDE5NSwyMjcsMjU4LDAsMF0sdD1bMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwLDk5LDk5XSxvPVsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzddLGk9WzAsMCwwLDAsMSwxLDIsMiwzLDMsNCw0LDUsNSw2LDYsNyw3LDgsOCw5LDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTNdLGE9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdLHU9MjU2O3JldHVybiBlLlV0aWw9ZS5VdGlsfHx7fSxlLlV0aWwuVW56aXA9ZnVuY3Rpb24oYyl7ZnVuY3Rpb24gZigpe3JldHVybiBSKz04LE8+WD9jW1grK106LTF9ZnVuY3Rpb24gcygpe0I9MX1mdW5jdGlvbiBsKCl7dmFyIGU7dHJ5e3JldHVybiBSKyssZT0xJkIsQj4+PTEsMD09PUImJihCPWYoKSxlPTEmQixCPTEyOHxCPj4xKSxlfWNhdGNoKHIpe3Rocm93IHJ9fWZ1bmN0aW9uIHAoZSl7dmFyIG49MCx0PWU7dHJ5e2Zvcig7dC0tOyluPW48PDF8bCgpO2UmJihuPXJbbl0+PjgtZSl9Y2F0Y2gobyl7dGhyb3cgb31yZXR1cm4gbn1mdW5jdGlvbiBoKCl7Sj0wfWZ1bmN0aW9uIGQoZSl7aisrLEdbSisrXT1lLHoucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKSwzMjc2OD09PUomJihKPTApfWZ1bmN0aW9uIGcoKXt0aGlzLmIwPTAsdGhpcy5iMT0wLHRoaXMuanVtcD1udWxsLHRoaXMuanVtcHBvcz0tMX1mdW5jdGlvbiBiKCl7Zm9yKDs7KXtpZihNW0hdPj14KXJldHVybi0xO2lmKFVbTVtIXV09PT1IKXJldHVybiBNW0hdKys7TVtIXSsrfX1mdW5jdGlvbiBtKCl7dmFyIGUscj1QW0ZdO2lmKDE3PT09SClyZXR1cm4tMTtpZihGKyssSCsrLGU9YigpLGU+PTApci5iMD1lO2Vsc2UgaWYoci5iMD0zMjc2OCxtKCkpcmV0dXJuLTE7aWYoZT1iKCksZT49MClyLmIxPWUsci5qdW1wPW51bGw7ZWxzZSBpZihyLmIxPTMyNzY4LHIuanVtcD1QW0ZdLHIuanVtcHBvcz1GLG0oKSlyZXR1cm4tMTtyZXR1cm4gSC0tLDB9ZnVuY3Rpb24gayhlLHIsbil7dmFyIHQ7Zm9yKFA9ZSxGPTAsVT1uLHg9cix0PTA7MTc+dDt0KyspTVt0XT0wO3JldHVybiBIPTAsbSgpPy0xOjB9ZnVuY3Rpb24geShlKXtmb3IodmFyIHIsbix0LG89MCxpPWVbb107OylpZih0PWwoKSl7aWYoISgzMjc2OCZpLmIxKSlyZXR1cm4gaS5iMTtmb3IoaT1pLmp1bXAscj1lLmxlbmd0aCxuPTA7cj5uO24rKylpZihlW25dPT09aSl7bz1uO2JyZWFrfX1lbHNle2lmKCEoMzI3NjgmaS5iMCkpcmV0dXJuIGkuYjA7bysrLGk9ZVtvXX19ZnVuY3Rpb24gQygpe3ZhciB1LGMsYixtLEMsdixBLGosdyxVLHgsUyx6LEksRSxMLE87ZG8gaWYodT1sKCksYj1wKDIpLDA9PT1iKWZvcihzKCksVT1mKCksVXw9ZigpPDw4LFM9ZigpLFN8PWYoKTw8OCw2NTUzNSYoVV5+UykmJmUuZGVidWcoIkJsb2NrTGVuIGNoZWNrc3VtIG1pc21hdGNoXG4iKTtVLS07KWM9ZigpLGQoYyk7ZWxzZSBpZigxPT09Yilmb3IoOzspaWYoQz1yW3AoNyldPj4xLEM+MjM/KEM9Qzw8MXxsKCksQz4xOTk/KEMtPTEyOCxDPUM8PDF8bCgpKTooQy09NDgsQz4xNDMmJihDKz0xMzYpKSk6Qys9MjU2LDI1Nj5DKWQoQyk7ZWxzZXtpZigyNTY9PT1DKWJyZWFrO2ZvcihDLT0yNTcsdz1wKHRbQ10pK25bQ10sQz1yW3AoNSldPj4zLGlbQ10+OD8oeD1wKDgpLHh8PXAoaVtDXS04KTw8OCk6eD1wKGlbQ10pLHgrPW9bQ10sQz0wO3c+QztDKyspYz1HWzMyNzY3JkoteF0sZChjKX1lbHNlIGlmKDI9PT1iKXtmb3IoQT1BcnJheSgzMjApLEk9MjU3K3AoNSksRT0xK3AoNSksTD00K3AoNCksQz0wOzE5PkM7QysrKUFbQ109MDtmb3IoQz0wO0w+QztDKyspQVthW0NdXT1wKDMpO2Zvcih3PXEubGVuZ3RoLG09MDt3Pm07bSsrKXFbbV09bmV3IGc7aWYoayhxLDE5LEEsMCkpcmV0dXJuIGgoKSwxO2Zvcih6PUkrRSxtPTAsTz0tMTt6Pm07KWlmKE8rKyxDPXkocSksMTY+QylBW20rK109QztlbHNlIGlmKDE2PT09Qyl7aWYoQz0zK3AoMiksbStDPnopcmV0dXJuIGgoKSwxO2Zvcih2PW0/QVttLTFdOjA7Qy0tOylBW20rK109dn1lbHNle2lmKEM9MTc9PT1DPzMrcCgzKToxMStwKDcpLG0rQz56KXJldHVybiBoKCksMTtmb3IoO0MtLTspQVttKytdPTB9Zm9yKHc9VC5sZW5ndGgsbT0wO3c+bTttKyspVFttXT1uZXcgZztpZihrKFQsSSxBLDApKXJldHVybiBoKCksMTtmb3Iodz1ULmxlbmd0aCxtPTA7dz5tO20rKylxW21dPW5ldyBnO2ZvcihqPVtdLG09STtBLmxlbmd0aD5tO20rKylqW20tSV09QVttXTtpZihrKHEsRSxqLDApKXJldHVybiBoKCksMTtmb3IoOzspaWYoQz15KFQpLEM+PTI1Nil7aWYoQy09MjU2LDA9PT1DKWJyZWFrO2ZvcihDLT0xLHc9cCh0W0NdKStuW0NdLEM9eShxKSxpW0NdPjg/KHg9cCg4KSx4fD1wKGlbQ10tOCk8PDgpOng9cChpW0NdKSx4Kz1vW0NdO3ctLTspYz1HWzMyNzY3JkoteF0sZChjKX1lbHNlIGQoQyl9d2hpbGUoIXUpO3JldHVybiBoKCkscygpLDB9ZnVuY3Rpb24gdigpe3ZhciBlLHIsbix0LG8saSxhLGMscz1bXTt0cnl7aWYoej1bXSxMPSExLHNbMF09ZigpLHNbMV09ZigpLDEyMD09PXNbMF0mJjIxOD09PXNbMV0mJihDKCksRVtJXT1bei5qb2luKCIiKSwiZ2VvbmV4dC5neHQiXSxJKyspLDMxPT09c1swXSYmMTM5PT09c1sxXSYmKFMoKSxFW0ldPVt6LmpvaW4oIiIpLCJmaWxlIl0sSSsrKSw4MD09PXNbMF0mJjc1PT09c1sxXSYmKEw9ITAsc1syXT1mKCksc1szXT1mKCksMz09PXNbMl0mJjQ9PT1zWzNdKSl7Zm9yKHNbMF09ZigpLHNbMV09ZigpLEE9ZigpLEF8PWYoKTw8OCxjPWYoKSxjfD1mKCk8PDgsZigpLGYoKSxmKCksZigpLGE9ZigpLGF8PWYoKTw8OCxhfD1mKCk8PDE2LGF8PWYoKTw8MjQsaT1mKCksaXw9ZigpPDw4LGl8PWYoKTw8MTYsaXw9ZigpPDwyNCxvPWYoKSxvfD1mKCk8PDgsb3w9ZigpPDwxNixvfD1mKCk8PDI0LHQ9ZigpLHR8PWYoKTw8OCxuPWYoKSxufD1mKCk8PDgsZT0wLE49W107dC0tOylyPWYoKSwiLyI9PT1yfCI6Ij09PXI/ZT0wOnUtMT5lJiYoTltlKytdPVN0cmluZy5mcm9tQ2hhckNvZGUocikpO2Zvcih3fHwodz1OKSxlPTA7bj5lOylyPWYoKSxlKys7aj0wLDg9PT1jJiYoQygpLEVbSV09QXJyYXkoMiksRVtJXVswXT16LmpvaW4oIiIpLEVbSV1bMV09Ti5qb2luKCIiKSxJKyspLFMoKX19Y2F0Y2gobCl7dGhyb3cgbH19dmFyIEEsaix3LFUseCxTLHo9W10sST0wLEU9W10sRz1BcnJheSgzMjc2OCksSj0wLEw9ITEsTz1jLmxlbmd0aCxYPTAsQj0xLFI9MCxUPUFycmF5KDI4OCkscT1BcnJheSgzMiksRj0wLFA9bnVsbCxIPShBcnJheSg2NCksQXJyYXkoNjQpLDApLE09QXJyYXkoMTcpLE49W107TVswXT0wLFM9ZnVuY3Rpb24oKXt2YXIgZSxyLG4sdCxvLGksYT1bXTtpZig4JkEmJihhWzBdPWYoKSxhWzFdPWYoKSxhWzJdPWYoKSxhWzNdPWYoKSw4MD09PWFbMF0mJjc1PT09YVsxXSYmNz09PWFbMl0mJjg9PT1hWzNdPyhlPWYoKSxlfD1mKCk8PDgsZXw9ZigpPDwxNixlfD1mKCk8PDI0KTplPWFbMF18YVsxXTw8OHxhWzJdPDwxNnxhWzNdPDwyNCxyPWYoKSxyfD1mKCk8PDgscnw9ZigpPDwxNixyfD1mKCk8PDI0LG49ZigpLG58PWYoKTw8OCxufD1mKCk8PDE2LG58PWYoKTw8MjQpLEwmJnYoKSxhWzBdPWYoKSw4PT09YVswXSl7aWYoQT1mKCksZigpLGYoKSxmKCksZigpLGYoKSx0PWYoKSw0JkEpZm9yKGFbMF09ZigpLGFbMl09ZigpLEg9YVswXSsyNTYqYVsxXSxvPTA7SD5vO28rKylmKCk7aWYoOCZBKWZvcihvPTAsTj1bXSxpPWYoKTtpOykoIjciPT09aXx8IjoiPT09aSkmJihvPTApLHUtMT5vJiYoTltvKytdPWkpLGk9ZigpO2lmKDE2JkEpZm9yKGk9ZigpO2k7KWk9ZigpOzImQSYmKGYoKSxmKCkpLEMoKSxlPWYoKSxlfD1mKCk8PDgsZXw9ZigpPDwxNixlfD1mKCk8PDI0LG49ZigpLG58PWYoKTw8OCxufD1mKCk8PDE2LG58PWYoKTw8MjQsTCYmdigpfX0sZS5VdGlsLlVuemlwLnByb3RvdHlwZS51bnppcEZpbGU9ZnVuY3Rpb24oZSl7dmFyIHI7Zm9yKHRoaXMudW56aXAoKSxyPTA7RS5sZW5ndGg+cjtyKyspaWYoRVtyXVsxXT09PWUpcmV0dXJuIEVbcl1bMF07cmV0dXJuIiJ9LGUuVXRpbC5VbnppcC5wcm90b3R5cGUudW56aXA9ZnVuY3Rpb24oKXtyZXR1cm4gdigpLEV9fSxlLlV0aWx9KSxuKCJ1dGlscy9lbmNvZGluZyIsWyJqeGciXSxmdW5jdGlvbihlKXt2YXIgcj0wLG49WzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDgsOCwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwxMCwzLDMsMywzLDMsMywzLDMsMywzLDMsMyw0LDMsMywxMSw2LDYsNiw1LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwwLDEyLDI0LDM2LDYwLDk2LDg0LDEyLDEyLDEyLDQ4LDcyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDAsMTIsMTIsMTIsMTIsMTIsMCwxMiwwLDEyLDEyLDEyLDI0LDEyLDEyLDEyLDEyLDEyLDI0LDEyLDI0LDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDI0LDEyLDEyLDEyLDEyLDEyLDI0LDEyLDEyLDEyLDEyLDEyLDEyLDEyLDI0LDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDM2LDEyLDM2LDEyLDEyLDEyLDM2LDEyLDEyLDEyLDEyLDEyLDM2LDEyLDM2LDEyLDEyLDEyLDM2LDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyLDEyXTtyZXR1cm4gZS5VdGlsPWUuVXRpbHx8e30sZS5VdGlsLlVURjg9e2VuY29kZTpmdW5jdGlvbihlKXt2YXIgcixuLHQ9IiIsbz1lLmxlbmd0aDtpZihlPWUucmVwbGFjZSgvXHJcbi9nLCJcbiIpLCJmdW5jdGlvbiI9PXR5cGVvZiB1bmVzY2FwZSYmImZ1bmN0aW9uIj09dHlwZW9mIGVuY29kZVVSSUNvbXBvbmVudClyZXR1cm4gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKTtmb3Iocj0wO28+cjtyKyspbj1lLmNoYXJDb2RlQXQociksMTI4Pm4/dCs9U3RyaW5nLmZyb21DaGFyQ29kZShuKTpuPjEyNyYmMjA0OD5uPyh0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKDE5MnxuPj42KSx0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyOHw2MyZuKSk6KHQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMjI0fG4+PjEyKSx0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyOHw2MyZuPj42KSx0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyOHw2MyZuKSk7cmV0dXJuIHR9LGRlY29kZTpmdW5jdGlvbihlKXt2YXIgdCxvLGksYT0wLHU9MCxjPXIsZj1bXSxzPWUubGVuZ3RoLGw9W107Zm9yKHQ9MDtzPnQ7dCsrKW89ZS5jaGFyQ29kZUF0KHQpLGk9bltvXSx1PWMhPT1yPzYzJm98dTw8NjoyNTU+PmkmbyxjPW5bMjU2K2MraV0sYz09PXImJih1PjY1NTM1P2YucHVzaCg1NTIzMisodT4+MTApLDU2MzIwKygxMDIzJnUpKTpmLnB1c2godSksYSsrLDA9PT1hJTFlNCYmKGwucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsZikpLGY9W10pKTtyZXR1cm4gbC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxmKSksbC5qb2luKCIiKX0sYXNjaWlDaGFyQ29kZUF0OmZ1bmN0aW9uKGUscil7dmFyIG49ZS5jaGFyQ29kZUF0KHIpO2lmKG4+MjU1KXN3aXRjaChuKXtjYXNlIDgzNjQ6bj0xMjg7YnJlYWs7Y2FzZSA4MjE4Om49MTMwO2JyZWFrO2Nhc2UgNDAyOm49MTMxO2JyZWFrO2Nhc2UgODIyMjpuPTEzMjticmVhaztjYXNlIDgyMzA6bj0xMzM7YnJlYWs7Y2FzZSA4MjI0Om49MTM0O2JyZWFrO2Nhc2UgODIyNTpuPTEzNTticmVhaztjYXNlIDcxMDpuPTEzNjticmVhaztjYXNlIDgyNDA6bj0xMzc7YnJlYWs7Y2FzZSAzNTI6bj0xMzg7YnJlYWs7Y2FzZSA4MjQ5Om49MTM5O2JyZWFrO2Nhc2UgMzM4Om49MTQwO2JyZWFrO2Nhc2UgMzgxOm49MTQyO2JyZWFrO2Nhc2UgODIxNjpuPTE0NTticmVhaztjYXNlIDgyMTc6bj0xNDY7YnJlYWs7Y2FzZSA4MjIwOm49MTQ3O2JyZWFrO2Nhc2UgODIyMTpuPTE0ODticmVhaztjYXNlIDgyMjY6bj0xNDk7YnJlYWs7Y2FzZSA4MjExOm49MTUwO2JyZWFrO2Nhc2UgODIxMjpuPTE1MTticmVhaztjYXNlIDczMjpuPTE1MjticmVhaztjYXNlIDg0ODI6bj0xNTM7YnJlYWs7Y2FzZSAzNTM6bj0xNTQ7YnJlYWs7Y2FzZSA4MjUwOm49MTU1O2JyZWFrO2Nhc2UgMzM5Om49MTU2O2JyZWFrO2Nhc2UgMzgyOm49MTU4O2JyZWFrO2Nhc2UgMzc2Om49MTU5O2JyZWFrO2RlZmF1bHQ6fXJldHVybiBufX0sZS5VdGlsLlVURjh9KSxuKCJ1dGlscy9iYXNlNjQiLFsianhnIiwidXRpbHMvZW5jb2RpbmciXSxmdW5jdGlvbihlLHIpe2Z1bmN0aW9uIG4oZSxyKXtyZXR1cm4gMjU1JmUuY2hhckNvZGVBdChyKX1mdW5jdGlvbiB0KGUscil7dmFyIG49by5pbmRleE9mKGUuY2hhckF0KHIpKTtpZigtMT09PW4pdGhyb3cgRXJyb3IoIkpTWEdyYXBoL3V0aWxzL2Jhc2U2NDogQ2FuJ3QgZGVjb2RlIHN0cmluZyAoaW52YWxpZCBjaGFyYWN0ZXIpLiIpO3JldHVybiBufXZhciBvPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixpPSI9IjtyZXR1cm4gZS5VdGlsPWUuVXRpbHx8e30sZS5VdGlsLkJhc2U2ND17ZW5jb2RlOmZ1bmN0aW9uKGUpe3ZhciB0LGEsdSxjLGYscz1bXTtmb3IoZj1yLmVuY29kZShlKSx1PWYubGVuZ3RoLGM9dSUzLHQ9MDt1LWM+dDt0Kz0zKWE9bihmLHQpPDwxNnxuKGYsdCsxKTw8OHxuKGYsdCsyKSxzLnB1c2goby5jaGFyQXQoYT4+MTgpLG8uY2hhckF0KDYzJmE+PjEyKSxvLmNoYXJBdCg2MyZhPj42KSxvLmNoYXJBdCg2MyZhKSk7c3dpdGNoKGMpe2Nhc2UgMTphPW4oZix1LTEpLHMucHVzaChvLmNoYXJBdChhPj4yKSxvLmNoYXJBdCg2MyZhPDw0KSxpLGkpO2JyZWFrO2Nhc2UgMjphPW4oZix1LTIpPDw4fG4oZix1LTEpLHMucHVzaChvLmNoYXJBdChhPj4xMCksby5jaGFyQXQoNjMmYT4+NCksby5jaGFyQXQoNjMmYTw8MiksaSl9cmV0dXJuIHMuam9pbigiIil9LGRlY29kZTpmdW5jdGlvbihlLG4pe3ZhciBvLGEsdSxjLGYscyxsPVtdLHA9W107aWYobz1lLnJlcGxhY2UoL1teQS1aYS16MC05XCtcLz1dL2csIiIpLHU9by5sZW5ndGgsMCE9PXUlNCl0aHJvdyBFcnJvcigiSlNYR3JhcGgvdXRpbHMvYmFzZTY0OiBDYW4ndCBkZWNvZGUgc3RyaW5nIChpbnZhbGlkIGlucHV0IGxlbmd0aCkuIik7Zm9yKG8uY2hhckF0KHUtMSk9PT1pJiYoYz0xLG8uY2hhckF0KHUtMik9PT1pJiYoYz0yKSx1LT00KSxhPTA7dT5hO2ErPTQpZj10KG8sYSk8PDE4fHQobyxhKzEpPDwxMnx0KG8sYSsyKTw8Nnx0KG8sYSszKSxwLnB1c2goZj4+MTYsMjU1JmY+PjgsMjU1JmYpLDA9PT1hJTFlNCYmKGwucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwscCkpLHA9W10pO3N3aXRjaChjKXtjYXNlIDE6Zj10KG8sdSk8PDEyfHQobyx1KzEpPDw2fHQobyx1KzIpLHAucHVzaChmPj4xMCwyNTUmZj4+Mik7YnJlYWs7Y2FzZSAyOmY9dChvLGEpPDw2fHQobyxhKzEpLHAucHVzaChmPj40KX1yZXR1cm4gbC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxwKSkscz1sLmpvaW4oIiIpLG4mJihzPXIuZGVjb2RlKHMpKSxzfSxkZWNvZGVBc0FycmF5OmZ1bmN0aW9uKGUpe3ZhciByLG49dGhpcy5kZWNvZGUoZSksdD1bXSxvPW4ubGVuZ3RoO2ZvcihyPTA7bz5yO3IrKyl0W3JdPW4uY2hhckNvZGVBdChyKTtyZXR1cm4gdH19LGUuVXRpbC5CYXNlNjR9KSxuKCIuLi9idWlsZC9jb21wcmVzc29yLmRlcHMuanMiLFsianhnIiwidXRpbHMvemlwIiwidXRpbHMvYmFzZTY0Il0sZnVuY3Rpb24oZSxyLG4pe3JldHVybiBlLmRlY29tcHJlc3M9ZnVuY3Rpb24oZSl7cmV0dXJuIHVuZXNjYXBlKG5ldyByLlVuemlwKG4uZGVjb2RlQXNBcnJheShlKSkudW56aXAoKVswXVswXSl9LGV9KSx3aW5kb3cuSlhHPXIoIi4uL2J1aWxkL2NvbXByZXNzb3IuZGVwcy5qcyIpfSkoKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93LmZpbGVMb2FkaW5nID0gKGZ1bmN0aW9uICgpIHsKICAgIHZhciBmaWxlTG9hZGluZ0NhbGxiYWNrcyA9IHt9OwogICAgdmFyIHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgZnVuY3Rpb24gbG9hZEtleXdvcmRzRmlsZShmaWxlbmFtZSwgY2FsbGJhY2spIHsKICAgICAgICBmaWxlTG9hZGluZ0NhbGxiYWNrc1tmaWxlbmFtZV0gPSBjYWxsYmFjazsKICAgICAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgc2NyaXB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgICAvLyB0aW1lc3RhbXAgYXMgYW4gYXJndW1lbnQgdG8gcHJldmVudCBicm93c2VycyBmcm9tIGNhY2hpbmcgc2NyaXB0cwogICAgICAgIC8vIHNlZTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NjY2MTkvaG93LXRvLWZvcmNlLWllLXRvLXJlbG9hZC1qYXZhc2NyaXB0CiAgICAgICAgc2NyaXB0LnNyYyA9IGZpbGVuYW1lKyc/dGltZT0nK3RpbWVzdGFtcDsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHNjcmlwdCk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRDYWxsYmFja0hhbmRsZXJGb3JLZXl3b3JkcyhwYXJlbnQpIHsKICAgICAgICB2YXIgY2FsbGFibGVMaXN0ID0gW107CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjYWxsYWJsZSkgewogICAgICAgICAgICBpZiAoIXBhcmVudC5pc0NoaWxkcmVuTG9hZGVkKSB7CiAgICAgICAgICAgICAgICBjYWxsYWJsZUxpc3QucHVzaChjYWxsYWJsZSk7CiAgICAgICAgICAgICAgICBpZiAoY2FsbGFibGVMaXN0Lmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgbG9hZEtleXdvcmRzRmlsZShwYXJlbnQuY2hpbGRGaWxlTmFtZSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuaXNDaGlsZHJlbkxvYWRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGFibGVMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZUxpc3RbaV0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY2FsbGFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIG5vdGlmeUZpbGVMb2FkZWQoZmlsZW5hbWUpIHsKICAgICAgICBmaWxlTG9hZGluZ0NhbGxiYWNrc1tmaWxlbmFtZV0oKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgZ2V0Q2FsbGJhY2tIYW5kbGVyRm9yS2V5d29yZHM6IGdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzLAogICAgICAgIG5vdGlmeTogbm90aWZ5RmlsZUxvYWRlZAogICAgfQp9KCkpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cubW9kZWwgPSAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gU3VpdGUoZGF0YSkgewogICAgICAgIHZhciBzdWl0ZSA9IGNyZWF0ZU1vZGVsT2JqZWN0KGRhdGEpOwogICAgICAgIHN1aXRlLnNvdXJjZSA9IGRhdGEuc291cmNlOwogICAgICAgIHN1aXRlLnJlbGF0aXZlU291cmNlID0gZGF0YS5yZWxhdGl2ZVNvdXJjZTsKICAgICAgICBzdWl0ZS5mdWxsTmFtZSA9IGRhdGEucGFyZW50ID8gZGF0YS5wYXJlbnQuZnVsbE5hbWUgKyAnLicgKyBkYXRhLm5hbWUgOiBkYXRhLm5hbWU7CiAgICAgICAgc3VpdGUudHlwZSA9ICdzdWl0ZSc7CiAgICAgICAgc3VpdGUudGVtcGxhdGUgPSAnc3VpdGVUZW1wbGF0ZSc7CiAgICAgICAgc2V0U3RhdHMoc3VpdGUsIGRhdGEuc3RhdGlzdGljcyk7CiAgICAgICAgc3VpdGUubWV0YWRhdGEgPSBkYXRhLm1ldGFkYXRhOwogICAgICAgIHN1aXRlLnBvcHVsYXRlS2V5d29yZHMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignS2V5d29yZCcpOwogICAgICAgIHN1aXRlLnBvcHVsYXRlVGVzdHMgPSBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcignVGVzdCcpOwogICAgICAgIHN1aXRlLnBvcHVsYXRlU3VpdGVzID0gY3JlYXRlSXRlcmFibGVQb3B1bGF0b3IoJ1N1aXRlJyk7CiAgICAgICAgc3VpdGUuY2hpbGRyZW5OYW1lcyA9IFsna2V5d29yZCcsICdzdWl0ZScsICd0ZXN0J107CiAgICAgICAgc3VpdGUuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gZnVuY3Rpb24gKGNhbGxhYmxlKSB7IGNhbGxhYmxlKCk7IH07CiAgICAgICAgc3VpdGUubWVzc2FnZSA9IGRhdGEubWVzc2FnZTsKICAgICAgICBzdWl0ZS5jaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLmtleXdvcmRzKCkuY29uY2F0KHN1aXRlLnRlc3RzKCkpLmNvbmNhdChzdWl0ZS5zdWl0ZXMoKSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5zZWFyY2hUZXN0cyA9IGZ1bmN0aW9uIChwcmVkaWNhdGUpIHsKICAgICAgICAgICAgdmFyIHRlc3RzID0gW107CiAgICAgICAgICAgIHZhciBzdWl0ZXMgPSB0aGlzLnN1aXRlcygpOwogICAgICAgICAgICBmb3IgKHZhciBpIGluIHN1aXRlcykKICAgICAgICAgICAgICAgIHRlc3RzID0gdGVzdHMuY29uY2F0KHN1aXRlc1tpXS5zZWFyY2hUZXN0cyhwcmVkaWNhdGUpKTsKICAgICAgICAgICAgcmV0dXJuIHRlc3RzLmNvbmNhdCh1dGlsLmZpbHRlcih0aGlzLnRlc3RzKCksIHByZWRpY2F0ZSkpOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuc2VhcmNoVGVzdHNJblN1aXRlID0gZnVuY3Rpb24gKHBhdHRlcm4sIG1hdGNoZXIpIHsKICAgICAgICAgICAgaWYgKCFtYXRjaGVyKQogICAgICAgICAgICAgICAgbWF0Y2hlciA9IHV0aWwuTWF0Y2hlcihwYXR0ZXJuKTsKICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2hlc0FueShbc3VpdGUuZnVsbE5hbWUsIHN1aXRlLm5hbWVdKSkKICAgICAgICAgICAgICAgIHJldHVybiBzdWl0ZS5hbGxUZXN0cygpOwogICAgICAgICAgICB2YXIgdGVzdHMgPSBbXTsKICAgICAgICAgICAgdmFyIHN1aXRlcyA9IHRoaXMuc3VpdGVzKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gc3VpdGVzKQogICAgICAgICAgICAgICAgdGVzdHMgPSB0ZXN0cy5jb25jYXQoc3VpdGVzW2ldLnNlYXJjaFRlc3RzSW5TdWl0ZShwYXR0ZXJuLCBtYXRjaGVyKSk7CiAgICAgICAgICAgIHJldHVybiB0ZXN0czsKICAgICAgICB9OwogICAgICAgIHN1aXRlLnNlYXJjaFRlc3RzQnlUYWcgPSBmdW5jdGlvbiAodGFnKSB7CiAgICAgICAgICAgIHJldHVybiBzdWl0ZS5zZWFyY2hUZXN0cyhmdW5jdGlvbiAodGVzdCkgewogICAgICAgICAgICAgICAgaWYgKHRhZy5jb21iaW5lZCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3QudGFncywgdGFnLmNvbWJpbmVkKTsKICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc1RhZyh0ZXN0LnRhZ3MsIHRhZy5sYWJlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgc3VpdGUuZmluZFN1aXRlQnlOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIGZpbmRTdWl0ZUJ5TmFtZShzdWl0ZSwgbmFtZSk7CiAgICAgICAgfTsKICAgICAgICBzdWl0ZS5hbGxUZXN0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHN1aXRlLnNlYXJjaFRlc3RzKGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gc3VpdGU7CiAgICB9CiAgICBmdW5jdGlvbiBjb250YWluc1RhZyh0ZXN0VGFncywgdGFnbmFtZSkgewogICAgICAgIHRlc3RUYWdzID0gdXRpbC5tYXAodGVzdFRhZ3MsIHV0aWwubm9ybWFsaXplKTsKICAgICAgICByZXR1cm4gdXRpbC5jb250YWlucyh0ZXN0VGFncywgdXRpbC5ub3JtYWxpemUodGFnbmFtZSkpOwogICAgfQogICAgZnVuY3Rpb24gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwYXR0ZXJuKSB7CiAgICAgICAgdmFyIHBhdHRlcm5zOwogICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ05PVCcpICE9IC0xKSB7CiAgICAgICAgICAgIHBhdHRlcm5zID0gcGF0dGVybi5zcGxpdCgnTk9UJyk7CiAgICAgICAgICAgIGlmICghdXRpbC5ub3JtYWxpemUocGF0dGVybnNbMF0pKQogICAgICAgICAgICAgICAgcmV0dXJuIHV0aWwuYWxsKHV0aWwubWFwKHBhdHRlcm5zLnNsaWNlKDEpLCBmdW5jdGlvbiAocCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVGFnUGF0dGVybih0ZXN0VGFncywgcGF0dGVybnNbMF0pICYmCiAgICAgICAgICAgICAgICB1dGlsLmFsbCh1dGlsLm1hcChwYXR0ZXJucy5zbGljZSgxKSwgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWNvbnRhaW5zVGFnUGF0dGVybih0ZXN0VGFncywgcCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoJ09SJykgIT0gLTEpIHsKICAgICAgICAgICAgcGF0dGVybnMgPSBwYXR0ZXJuLnNwbGl0KCdPUicpOwogICAgICAgICAgICByZXR1cm4gdXRpbC5hbnkodXRpbC5tYXAocGF0dGVybnMsIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBpZiAocGF0dGVybi5pbmRleE9mKCdBTkQnKSAhPSAtMSkgewogICAgICAgICAgICBwYXR0ZXJucyA9IHBhdHRlcm4uc3BsaXQoJ0FORCcpOwogICAgICAgICAgICByZXR1cm4gdXRpbC5hbGwodXRpbC5tYXAocGF0dGVybnMsIGZ1bmN0aW9uIChwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNUYWdQYXR0ZXJuKHRlc3RUYWdzLCBwKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdXRpbC5NYXRjaGVyKHBhdHRlcm4pLm1hdGNoZXNBbnkodGVzdFRhZ3MpOwogICAgfQogICAgZnVuY3Rpb24gZmluZFN1aXRlQnlOYW1lKHN1aXRlLCBuYW1lKSB7CiAgICAgICAgaWYgKHN1aXRlLmZ1bGxOYW1lID09IG5hbWUpCiAgICAgICAgICAgIHJldHVybiBzdWl0ZTsKICAgICAgICB2YXIgc3ViU3VpdGVzID0gc3VpdGUuc3VpdGVzKCk7CiAgICAgICAgZm9yICh2YXIgaSBpbiBzdWJTdWl0ZXMpIHsKICAgICAgICAgICAgdmFyIG1hdGNoID0gZmluZFN1aXRlQnlOYW1lKHN1YlN1aXRlc1tpXSwgbmFtZSk7CiAgICAgICAgICAgIGlmIChtYXRjaCkKICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBmdW5jdGlvbiBzZXRTdGF0cyhzdWl0ZSwgc3RhdHMpIHsKICAgICAgICBmb3IgKHZhciBuYW1lIGluIHN0YXRzKSB7CiAgICAgICAgICAgIHN1aXRlW25hbWVdID0gc3RhdHNbbmFtZV07CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlTW9kZWxPYmplY3QoZGF0YSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSwKICAgICAgICAgICAgZG9jOiBkYXRhLmRvYywKICAgICAgICAgICAgc3RhdHVzOiBkYXRhLnN0YXR1cywKICAgICAgICAgICAgdGltZXM6IGRhdGEudGltZXMsCiAgICAgICAgICAgIGlkOiBkYXRhLnBhcmVudCA/IGRhdGEucGFyZW50LmlkICsgJy0nICsgZGF0YS5pZCA6IGRhdGEuaWQKICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gVGVzdChkYXRhKSB7CiAgICAgICAgdmFyIHRlc3QgPSBjcmVhdGVNb2RlbE9iamVjdChkYXRhKTsKICAgICAgICB0ZXN0LnR5cGUgPSAndGVzdCc7CiAgICAgICAgdGVzdC50ZW1wbGF0ZSA9ICd0ZXN0VGVtcGxhdGUnOwogICAgICAgIHRlc3QuZnVsbE5hbWUgPSBkYXRhLnBhcmVudC5mdWxsTmFtZSArICcuJyArIHRlc3QubmFtZTsKICAgICAgICB0ZXN0LmZvcm1hdFBhcmVudE5hbWUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB1dGlsLmZvcm1hdFBhcmVudE5hbWUodGVzdCk7IH07CiAgICAgICAgdGVzdC50aW1lb3V0ID0gZGF0YS50aW1lb3V0OwogICAgICAgIHRlc3QucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAgdGVzdC5jaGlsZHJlbk5hbWVzID0gWydrZXl3b3JkJ107CiAgICAgICAgdGVzdC5pc0NoaWxkcmVuTG9hZGVkID0gZGF0YS5pc0NoaWxkcmVuTG9hZGVkOwogICAgICAgIHRlc3QuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKHRlc3QpOwogICAgICAgIHRlc3QuY2hpbGRyZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0ZXN0LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdC5rZXl3b3JkcygpOwogICAgICAgIH07CiAgICAgICAgdGVzdC50YWdzID0gZGF0YS50YWdzOwogICAgICAgIHRlc3QubWVzc2FnZSA9IGRhdGEubWVzc2FnZTsKICAgICAgICB0ZXN0Lm1hdGNoZXNUYWdQYXR0ZXJuID0gZnVuY3Rpb24gKHBhdHRlcm4pIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zVGFnUGF0dGVybih0ZXN0LnRhZ3MsIHBhdHRlcm4pOwogICAgICAgIH07CiAgICAgICAgdGVzdC5tYXRjaGVzTmFtZVBhdHRlcm4gPSBmdW5jdGlvbiAocGF0dGVybikgewogICAgICAgICAgICByZXR1cm4gdXRpbC5NYXRjaGVyKHBhdHRlcm4pLm1hdGNoZXNBbnkoW3Rlc3QubmFtZSwgdGVzdC5mdWxsTmFtZV0pOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHRlc3Q7CiAgICB9CiAgICBmdW5jdGlvbiBLZXl3b3JkKGRhdGEpIHsKICAgICAgICB2YXIga3cgPSBjcmVhdGVNb2RlbE9iamVjdChkYXRhKTsKICAgICAgICBrdy5saWJuYW1lID0gZGF0YS5saWJuYW1lOwogICAgICAgIGt3LmZ1bGxOYW1lID0gKGt3LmxpYm5hbWUgPyBrdy5saWJuYW1lICsgJy4nIDogJycpICsga3cubmFtZTsKICAgICAgICBrdy50eXBlID0gZGF0YS50eXBlOwogICAgICAgIGt3LnRlbXBsYXRlID0gJ2tleXdvcmRUZW1wbGF0ZSc7CiAgICAgICAga3cuYXJndW1lbnRzID0gZGF0YS5hcmdzOwogICAgICAgIGt3LmFzc2lnbiA9IGRhdGEuYXNzaWduICsgKGRhdGEuYXNzaWduID8gJyA9JyA6ICcnKTsKICAgICAgICBrdy50YWdzID0gZGF0YS50YWdzOwogICAgICAgIGt3LnRpbWVvdXQgPSBkYXRhLnRpbWVvdXQ7CiAgICAgICAga3cucG9wdWxhdGVLZXl3b3JkcyA9IGNyZWF0ZUl0ZXJhYmxlUG9wdWxhdG9yKCdLZXl3b3JkJyk7CiAgICAgICAga3cuY2hpbGRyZW5OYW1lcyA9IFsna2V5d29yZCddOwogICAgICAgIGt3LmlzQ2hpbGRyZW5Mb2FkZWQgPSBkYXRhLmlzQ2hpbGRyZW5Mb2FkZWQ7CiAgICAgICAga3cuY2FsbFdoZW5DaGlsZHJlblJlYWR5ID0gd2luZG93LmZpbGVMb2FkaW5nLmdldENhbGxiYWNrSGFuZGxlckZvcktleXdvcmRzKGt3KTsKICAgICAgICBrdy5jaGlsZHJlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGt3LmlzQ2hpbGRyZW5Mb2FkZWQpCiAgICAgICAgICAgICAgICByZXR1cm4ga3cua2V5d29yZHMoKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBrdzsKICAgIH0KICAgIGZ1bmN0aW9uIE1lc3NhZ2UobGV2ZWwsIGRhdGUsIHRleHQsIGxpbmspIHsKICAgICAgICB2YXIgbWVzc2FnZSA9IHsKICAgICAgICAgICAgdHlwZTogJ21lc3NhZ2UnLAogICAgICAgICAgICB0ZW1wbGF0ZTogJ21lc3NhZ2VUZW1wbGF0ZScsCiAgICAgICAgICAgIGxldmVsOiBsZXZlbCwKICAgICAgICAgICAgdGltZTogdXRpbC50aW1lRnJvbURhdGUoZGF0ZSksCiAgICAgICAgICAgIGRhdGU6IHV0aWwuZGF0ZUZyb21EYXRlKGRhdGUpLAogICAgICAgICAgICB0ZXh0OiB0ZXh0LAogICAgICAgICAgICBsaW5rOiBsaW5rCiAgICAgICAgfTsKICAgICAgICBtZXNzYWdlLmNhbGxXaGVuQ2hpbGRyZW5SZWFkeSA9IGZ1bmN0aW9uIChjYWxsYWJsZSkgeyBjYWxsYWJsZSgpOyB9OwogICAgICAgIHJldHVybiBtZXNzYWdlOwogICAgfQogICAgZnVuY3Rpb24gVGltZXModGltZWRhdGEpIHsKICAgICAgICB2YXIgc3RhcnQgPSB0aW1lZGF0YVswXTsKICAgICAgICB2YXIgZW5kID0gdGltZWRhdGFbMV07CiAgICAgICAgdmFyIGVsYXBzZWQgPSB0aW1lZGF0YVsyXTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBlbGFwc2VkTWlsbGlzOiBlbGFwc2VkLAogICAgICAgICAgICBlbGFwc2VkVGltZTogdXRpbC5mb3JtYXRFbGFwc2VkKGVsYXBzZWQpLAogICAgICAgICAgICBzdGFydFRpbWU6IHV0aWwuZGF0ZVRpbWVGcm9tRGF0ZShzdGFydCksCiAgICAgICAgICAgIGVuZFRpbWU6ICB1dGlsLmRhdGVUaW1lRnJvbURhdGUoZW5kKQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVJdGVyYWJsZVBvcHVsYXRvcihuYW1lKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwb3B1bGF0b3IpIHsKICAgICAgICAgICAgcG9wdWxhdGVJdGVyYWJsZSh0aGlzLCBuYW1lLCBwb3B1bGF0b3IpOwogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBwb3B1bGF0ZUl0ZXJhYmxlKG9iaiwgbmFtZSwgcG9wdWxhdG9yKSB7CiAgICAgICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKSArICdzJzsKICAgICAgICBvYmpbbmFtZV0gPSBjcmVhdGVHZXRBbGxGdW5jdGlvbihwb3B1bGF0b3IubnVtYmVyT2ZJdGVtcywgcG9wdWxhdG9yLmNyZWF0b3IpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlR2V0QWxsRnVuY3Rpb24obnVtYmVyT2ZFbGVtZW50cywgY3JlYXRvcikgewogICAgICAgIHZhciBjYWNoZWQgPSBudWxsOwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmIChjYWNoZWQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGNhY2hlZCA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1iZXJPZkVsZW1lbnRzKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNhY2hlZC5wdXNoKGNyZWF0b3IoaSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjYWNoZWQ7CiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgU3VpdGU6IFN1aXRlLAogICAgICAgIFRlc3Q6IFRlc3QsCiAgICAgICAgS2V5d29yZDogS2V5d29yZCwKICAgICAgICBNZXNzYWdlOiBNZXNzYWdlLAogICAgICAgIFRpbWVzOiBUaW1lcywKICAgICAgICBjb250YWluc1RhZzogY29udGFpbnNUYWcsICAvLyBFeHBvc2VkIGZvciB0ZXN0cwogICAgICAgIGNvbnRhaW5zVGFnUGF0dGVybjogY29udGFpbnNUYWdQYXR0ZXJuICAvLyBFeHBvc2VkIGZvciB0ZXN0cwogICAgfTsKfSgpKTsKd2luZG93LnN0YXRzID0gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFN0YXRpc3RpY3ModG90YWxFbGVtcywgdGFnRWxlbXMsIHN1aXRlRWxlbXMpIHsKICAgICAgICByZXR1cm4ge3RvdGFsOiB1dGlsLm1hcCh0b3RhbEVsZW1zLCB0b3RhbFN0YXRFbGVtKSwKICAgICAgICAgICAgICAgIHRhZzogICB1dGlsLm1hcCh0YWdFbGVtcywgdGFnU3RhdEVsZW0pLAogICAgICAgICAgICAgICAgc3VpdGU6IHV0aWwubWFwKHN1aXRlRWxlbXMsIHN1aXRlU3RhdEVsZW0pfTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YXRFbGVtKHN0YXQpIHsKICAgICAgICBzdGF0LnRvdGFsID0gc3RhdC5wYXNzICsgc3RhdC5mYWlsICsgc3RhdC5za2lwOwogICAgICAgIHZhciBwZXJjZW50cyA9IGNhbGN1bGF0ZVBlcmNlbnRzKHN0YXQudG90YWwsIHN0YXQucGFzcywgc3RhdC5mYWlsLCBzdGF0LnNraXApOwogICAgICAgIHN0YXQucGFzc1BlcmNlbnQgPSBwZXJjZW50c1swXTsKICAgICAgICBzdGF0LnNraXBQZXJjZW50ID0gcGVyY2VudHNbMV07CiAgICAgICAgc3RhdC5mYWlsUGVyY2VudCA9IHBlcmNlbnRzWzJdOwogICAgICAgIHZhciB3aWR0aHMgPSBjYWxjdWxhdGVXaWR0aHMoc3RhdC5wYXNzUGVyY2VudCwgc3RhdC5za2lwUGVyY2VudCwgc3RhdC5mYWlsUGVyY2VudCk7CiAgICAgICAgc3RhdC5wYXNzV2lkdGggPSB3aWR0aHNbMF07CiAgICAgICAgc3RhdC5za2lwV2lkdGggPSB3aWR0aHNbMV07CiAgICAgICAgc3RhdC5mYWlsV2lkdGggPSB3aWR0aHNbMl07CiAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICB9CiAgICBmdW5jdGlvbiB0b3RhbFN0YXRFbGVtKGRhdGEpIHsKICAgICAgICB2YXIgc3RhdCA9IHN0YXRFbGVtKGRhdGEpOwogICAgICAgIHN0YXQudHlwZSA9ICdhbGwnOwogICAgICAgIHJldHVybiBzdGF0OwogICAgfQogICAgZnVuY3Rpb24gdGFnU3RhdEVsZW0oZGF0YSkgewogICAgICAgIHZhciBzdGF0ID0gc3RhdEVsZW0oZGF0YSk7CiAgICAgICAgc3RhdC5saW5rcyA9IHBhcnNlTGlua3Moc3RhdC5saW5rcyk7CiAgICAgICAgcmV0dXJuIHN0YXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzdWl0ZVN0YXRFbGVtKGRhdGEpIHsKICAgICAgICB2YXIgc3RhdCA9IHN0YXRFbGVtKGRhdGEpOwogICAgICAgIHN0YXQuZnVsbE5hbWUgPSBzdGF0LmxhYmVsOwogICAgICAgIHN0YXQuZm9ybWF0UGFyZW50TmFtZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV0aWwuZm9ybWF0UGFyZW50TmFtZShzdGF0KTsgfTsKICAgICAgICByZXR1cm4gc3RhdDsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlTGlua3MobGlua3NEYXRhKSB7CiAgICAgICAgaWYgKCFsaW5rc0RhdGEpCiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICByZXR1cm4gdXRpbC5tYXAobGlua3NEYXRhLnNwbGl0KCc6OjonKSwgZnVuY3Rpb24gKGxpbmspIHsKICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGxpbmsuaW5kZXhPZignOicpOwogICAgICAgICAgICAgICAgcmV0dXJuIHt0aXRsZTogbGluay5zbGljZSgwLCBpbmRleCksIHVybDogbGluay5zbGljZShpbmRleCsxKX07CiAgICAgICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gY2FsY3VsYXRlUGVyY2VudHModG90YWwsIHBhc3NlZCwgZmFpbGVkLCBza2lwcGVkKSB7CiAgICAgICAgaWYgKHRvdGFsID09IDApIHsKICAgICAgICAgICAgcmV0dXJuIFswLjAsIDAuMCwgMC4wXTsKICAgICAgICB9CiAgICAgICAgdmFyIHBhc3MgPSAxMDAuMCAqIHBhc3NlZCAvIHRvdGFsOwogICAgICAgIHZhciBza2lwID0gMTAwLjAgKiBza2lwcGVkIC8gdG90YWw7CiAgICAgICAgdmFyIGZhaWwgPSAxMDAuMCAqIGZhaWxlZCAvIHRvdGFsOwogICAgICAgIGlmIChwYXNzID4gMCAmJiBwYXNzIDwgMC4xKQogICAgICAgICAgICBwYXNzID0gMC4xCiAgICAgICAgaWYgKGZhaWwgPiAwICYmIGZhaWwgPCAwLjEpCiAgICAgICAgICAgIGZhaWwgPSAwLjEKICAgICAgICBpZiAoc2tpcCA+IDAgJiYgc2tpcCA8IDAuMSkKICAgICAgICAgICAgc2tpcCA9IDAuMQogICAgICAgIGlmIChwYXNzID4gOTkuOTUgJiYgcGFzcyA8IDEwMCkKICAgICAgICAgICAgcGFzcyA9IDk5LjkKICAgICAgICBpZiAoZmFpbCA+IDk5Ljk1ICYmIGZhaWwgPCAxMDApCiAgICAgICAgICAgIGZhaWwgPSA5OS45CiAgICAgICAgaWYgKHNraXAgPiA5OS45NSAmJiBza2lwIDwgMTAwKQogICAgICAgICAgICBza2lwID0gOTkuOQogICAgICAgIHJldHVybiBbTWF0aC5yb3VuZChwYXNzKjEwKS8xMCwgTWF0aC5yb3VuZChza2lwKjEwKS8xMCwgTWF0aC5yb3VuZChmYWlsKjEwKS8xMF07CiAgICB9CiAgICBmdW5jdGlvbiBjYWxjdWxhdGVXaWR0aHMobnVtMSwgbnVtMiwgbnVtMykgewogICAgICAgIGlmIChudW0xICsgbnVtMiArIG51bTMgPT09IDApCiAgICAgICAgICAgIHJldHVybiBbMC4wLCAwLjAsIDAuMF07CiAgICAgICAgLy8gTWFrZSBzbWFsbCBwZXJjZW50YWdlcyBiZXR0ZXIgdmlzaWJsZQogICAgICAgIGlmIChudW0xID4gMCAmJiBudW0xIDwgMSkKICAgICAgICAgICAgbnVtMSA9IDEKICAgICAgICBpZiAobnVtMiA+IDAgJiYgbnVtMiA8IDEpCiAgICAgICAgICAgIG51bTIgPSAxCiAgICAgICAgaWYgKG51bTMgPiAwICYmIG51bTMgPCAxKQogICAgICAgICAgICBudW0zID0gMQogICAgICAgIC8vIEhhbmRsZSBzaXR1YXRpb24gd2hlcmUgc29tZSBhcmUgcm91bmRlZCB1cAogICAgICAgIHdoaWxlIChudW0xICsgbnVtMiArIG51bTMgPiAxMDApIHsKICAgICAgICAgICAgaWYgKG51bTEgPiBudW0yICYmIG51bTEgPiBudW0zKQogICAgICAgICAgICAgICAgbnVtMSAtPSAwLjE7CiAgICAgICAgICAgIGVsc2UgaWYgKG51bTIgPiBudW0xICYmIG51bTIgPiBudW0zKQogICAgICAgICAgICAgICAgbnVtMiAtPSAwLjE7CiAgICAgICAgICAgIGVsc2UgaWYgKG51bTMgPiBudW0xICYmIG51bTMgPiBudW0yKQogICAgICAgICAgICAgICAgbnVtMyAtPSAwLjE7CiAgICAgICAgICAgIGVsc2UgaWYgKG51bTEgPiBudW0zICYmIG51bTEgPT0gbnVtMikgewogICAgICAgICAgICAgICAgbnVtMSAtPSAwLjE7CiAgICAgICAgICAgICAgICBudW0yIC09IDAuMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChudW0xID4gbnVtMiAmJiBudW0xID09IG51bTMpIHsKICAgICAgICAgICAgICAgIG51bTEgLT0gMC4xOwogICAgICAgICAgICAgICAgbnVtMyAtPSAwLjE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobnVtMiA+IG51bTEgJiYgbnVtMiA9PSBudW0zKSB7CiAgICAgICAgICAgICAgICBudW0yIC09IDAuMTsKICAgICAgICAgICAgICAgIG51bTMgLT0gMC4xOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBbTWF0aC5jZWlsKG51bTEqMTApLzEwLCBNYXRoLmNlaWwobnVtMioxMCkvMTAsIE1hdGguY2VpbChudW0zKjEwKS8xMF07CiAgICB9CiAgICByZXR1cm4gewogICAgICAgIFN0YXRpc3RpY3M6IFN0YXRpc3RpY3MKICAgIH07Cn0oKSk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy51dGlsID0gZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gbWFwKGVsZW1zLCBmdW5jKSB7CiAgICAgICAgdmFyIHJldCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICByZXRbaV0gPSBmdW5jKGVsZW1zW2ldKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0KICAgIGZ1bmN0aW9uIGZpbHRlcihlbGVtcywgcHJlZGljYXRlKSB7CiAgICAgICAgdmFyIHJldCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBpZiAocHJlZGljYXRlKGVsZW1zW2ldKSkKICAgICAgICAgICAgICAgIHJldC5wdXNoKGVsZW1zW2ldKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0KICAgIGZ1bmN0aW9uIGFsbChlbGVtcykgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBpZiAoIWVsZW1zW2ldKQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIGFueShlbGVtcykgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBpZiAoZWxlbXNbaV0pCiAgICAgICAgICAgICAgICByZXR1cm4gZWxlbXNbaV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbnRhaW5zKGVsZW1zLCBlKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGlmIChlbGVtc1tpXSA9PSBlKQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZ1bmN0aW9uIGxhc3QoaXRlbXMpIHsKICAgICAgICByZXR1cm4gaXRlbXNbaXRlbXMubGVuZ3RoLTFdOwogICAgfQogICAgZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8mbHQ7L2csICc8JykucmVwbGFjZSgvJmd0Oy9nLCAnPicpLnJlcGxhY2UoLyZhbXA7L2csICcmJyk7CiAgICB9CiAgICBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7CiAgICB9CiAgICBmdW5jdGlvbiBub3JtYWxpemUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyAvZywgJycpLnJlcGxhY2UoL18vZywgJycpOwogICAgfQogICAgZnVuY3Rpb24gcmVnZXhwRXNjYXBlKHN0cmluZykgewogICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvWy1bXF17fSgpKz8qLixcXF4kfCNdL2csICJcXCQmIik7CiAgICB9CiAgICBmdW5jdGlvbiBNYXRjaGVyKHBhdHRlcm4pIHsKICAgICAgICBwYXR0ZXJuID0gcmVnZXhwRXNjYXBlKG5vcm1hbGl6ZShwYXR0ZXJuKSk7CiAgICAgICAgdmFyIHJlUGF0dGVybiA9ICdeJyArIHBhdHRlcm4ucmVwbGFjZSgvXFxcPy9nLCAnLicpLnJlcGxhY2UoL1xcXCovZywgJ1tcXHNcXFNdKicpICsgJyQnOwogICAgICAgIHZhciByZWdleHAgPSBuZXcgUmVnRXhwKHJlUGF0dGVybik7CiAgICAgICAgZnVuY3Rpb24gbWF0Y2hlcyhzdHJpbmcpIHsKICAgICAgICAgICAgcmV0dXJuIHJlZ2V4cC50ZXN0KG5vcm1hbGl6ZShzdHJpbmcpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbWF0Y2hlczogbWF0Y2hlcywKICAgICAgICAgICAgbWF0Y2hlc0FueTogZnVuY3Rpb24gKHN0cmluZ3MpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzdHJpbmdzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKQogICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzKHN0cmluZ3NbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBmb3JtYXRQYXJlbnROYW1lKGl0ZW0pIHsKICAgICAgICB2YXIgcGFyZW50TmFtZSA9IGl0ZW0uZnVsbE5hbWUuc2xpY2UoMCwgaXRlbS5mdWxsTmFtZS5sZW5ndGggLSBpdGVtLm5hbWUubGVuZ3RoKTsKICAgICAgICByZXR1cm4gcGFyZW50TmFtZS5yZXBsYWNlKC9cLi9nLCAnIC4gJyk7CiAgICB9CiAgICBmdW5jdGlvbiB0aW1lRnJvbURhdGUoZGF0ZSkgewogICAgICAgIGlmICghZGF0ZSkKICAgICAgICAgICAgcmV0dXJuICdOL0EnOwogICAgICAgIHJldHVybiBmb3JtYXRUaW1lKGRhdGUuZ2V0SG91cnMoKSwgZGF0ZS5nZXRNaW51dGVzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZS5nZXRTZWNvbmRzKCksIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpOwogICAgfQogICAgZnVuY3Rpb24gZGF0ZUZyb21EYXRlKGRhdGUpIHsKICAgICAgICBpZiAoIWRhdGUpCiAgICAgICAgICAgIHJldHVybiAnTi9BJzsKICAgICAgICByZXR1cm4gcGFkVG8oZGF0ZS5nZXRGdWxsWWVhcigpLCA0KSArCiAgICAgICAgICAgICAgIHBhZFRvKGRhdGUuZ2V0TW9udGgoKSArIDEsIDIpICsKICAgICAgICAgICAgICAgcGFkVG8oZGF0ZS5nZXREYXRlKCksIDIpOwogICAgfQogICAgZnVuY3Rpb24gZGF0ZVRpbWVGcm9tRGF0ZShkYXRlKSB7CiAgICAgICAgaWYgKCFkYXRlKQogICAgICAgICAgICByZXR1cm4gJ04vQSc7CiAgICAgICAgcmV0dXJuIGRhdGVGcm9tRGF0ZShkYXRlKSArICcgJyArIHRpbWVGcm9tRGF0ZShkYXRlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1hdFRpbWUoaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpc2Vjb25kcykgewogICAgICAgIHJldHVybiBwYWRUbyhob3VycywgMikgKyAnOicgKwogICAgICAgICAgICAgICBwYWRUbyhtaW51dGVzLCAyKSArICc6JyArCiAgICAgICAgICAgICAgIHBhZFRvKHNlY29uZHMsIDIpICsgJy4nICsKICAgICAgICAgICAgICAgcGFkVG8obWlsbGlzZWNvbmRzLCAzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1hdEVsYXBzZWQoZWxhcHNlZCkgewogICAgICAgIHZhciBtaWxsaXMgPSBlbGFwc2VkOwogICAgICAgIHZhciBob3VycyA9IE1hdGguZmxvb3IobWlsbGlzIC8gKDYwICogNjAgKiAxMDAwKSk7CiAgICAgICAgbWlsbGlzIC09IGhvdXJzICogNjAgKiA2MCAqIDEwMDA7CiAgICAgICAgdmFyIG1pbnV0ZXMgPSBNYXRoLmZsb29yKG1pbGxpcyAvICg2MCAqIDEwMDApKTsKICAgICAgICBtaWxsaXMgLT0gbWludXRlcyAqIDYwICogMTAwMDsKICAgICAgICB2YXIgc2Vjb25kcyA9IE1hdGguZmxvb3IobWlsbGlzIC8gMTAwMCk7CiAgICAgICAgbWlsbGlzIC09IHNlY29uZHMgKiAxMDAwOwogICAgICAgIHJldHVybiBmb3JtYXRUaW1lKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXMpOwogICAgfQogICAgZnVuY3Rpb24gcGFkVG8obnVtYmVyLCBsZW4pIHsKICAgICAgICB2YXIgbnVtU3RyaW5nID0gbnVtYmVyICsgIiI7CiAgICAgICAgd2hpbGUgKG51bVN0cmluZy5sZW5ndGggPCBsZW4pIG51bVN0cmluZyA9ICIwIiArIG51bVN0cmluZzsKICAgICAgICByZXR1cm4gbnVtU3RyaW5nOwogICAgfQogICAgZnVuY3Rpb24gdGltZXN0YW1wKG1pbGxpcykgewogICAgICAgIC8vIHVzZWQgYWxzbyBieSB0b29scyB0aGF0IGRvIG5vdCBzZXQgd2luZG93Lm91dHB1dC5iYXNlTWlsbGlzCiAgICAgICAgdmFyIGJhc2UgPSB3aW5kb3cub3V0cHV0ID8gd2luZG93Lm91dHB1dC5iYXNlTWlsbGlzIDogMDsKICAgICAgICByZXR1cm4gbmV3IERhdGUoYmFzZSArIG1pbGxpcyk7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVHZW5lcmF0ZWRTdHJpbmcodGltZXN0YW1wKSB7CiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh0aW1lc3RhbXApOwogICAgICAgIHZhciBkdCA9IGRhdGVUaW1lRnJvbURhdGUoZGF0ZSkuc2xpY2UoMCwgMTcpOyAgLy8gZHJvcCBtaWxsaXMKICAgICAgICB2YXIgb2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpOwogICAgICAgIHZhciBzaWduID0gb2Zmc2V0ID4gMCA/ICctJyA6ICcrJzsKICAgICAgICB2YXIgaGggPSBNYXRoLmZsb29yKE1hdGguYWJzKG9mZnNldCkgLyA2MCk7CiAgICAgICAgdmFyIG1tID0gTWF0aC5hYnMob2Zmc2V0KSAlIDYwOwogICAgICAgIHJldHVybiBkdCArICcgVVRDJyArIHNpZ24gKyBwYWRUbyhoaCwgMikgKyAnOicgKyBwYWRUbyhtbSwgMik7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmcodGltZXN0YW1wKSB7CiAgICAgICAgZnVuY3Rpb24gdGltZVN0cmluZyh0aW1lLCBzaG9ydFVuaXQpIHsKICAgICAgICAgICAgdmFyIHVuaXQgPSB7eTogJ3llYXInLCBkOiAnZGF5JywgaDogJ2hvdXInLCBtOiAnbWludXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgczogJ3NlY29uZCd9W3Nob3J0VW5pdF07CiAgICAgICAgICAgIHZhciBlbmQgPSB0aW1lID09IDEgPyAnICcgOiAncyAnOwogICAgICAgICAgICByZXR1cm4gdGltZSArICcgJyArIHVuaXQgKyBlbmQ7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNvbXBlbnNhdGVMZWFwWWVhcnMoZGF5cywgeWVhcnMpIHsKICAgICAgICAgICAgLy8gTm90IGEgcGVyZmVjdCBhbGdvcml0aG0gYnV0IG91Z2h0IHRvIGJlIGVub3VnaAogICAgICAgICAgICByZXR1cm4gZGF5cyAtIE1hdGguZmxvb3IoeWVhcnMgLyA0KTsKICAgICAgICB9CiAgICAgICAgdmFyIGdlbmVyYXRlZCA9IE1hdGgucm91bmQodGltZXN0YW1wIC8gMTAwMCk7CiAgICAgICAgdmFyIGN1cnJlbnQgPSBNYXRoLnJvdW5kKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCk7CiAgICAgICAgdmFyIGVsYXBzZWQgPSBjdXJyZW50IC0gZ2VuZXJhdGVkOwogICAgICAgIHZhciBwcmVmaXggPSAnJzsKICAgICAgICBpZiAoZWxhcHNlZCA8IDApIHsKICAgICAgICAgICAgcHJlZml4ID0gJy0gJzsKICAgICAgICAgICAgZWxhcHNlZCA9IE1hdGguYWJzKGVsYXBzZWQpOwogICAgICAgIH0KICAgICAgICB2YXIgc2VjcyAgPSBlbGFwc2VkICUgNjA7CiAgICAgICAgdmFyIG1pbnMgID0gTWF0aC5mbG9vcihlbGFwc2VkIC8gNjApICUgNjA7CiAgICAgICAgdmFyIGhvdXJzID0gTWF0aC5mbG9vcihlbGFwc2VkIC8gKDYwKjYwKSkgJSAyNDsKICAgICAgICB2YXIgZGF5cyAgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyAoNjAqNjAqMjQpKSAlIDM2NTsKICAgICAgICB2YXIgeWVhcnMgPSBNYXRoLmZsb29yKGVsYXBzZWQgLyAoNjAqNjAqMjQqMzY1KSk7CiAgICAgICAgaWYgKHllYXJzKSB7CiAgICAgICAgICAgIGRheXMgPSBjb21wZW5zYXRlTGVhcFllYXJzKGRheXMsIHllYXJzKTsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoeWVhcnMsICd5JykgKyB0aW1lU3RyaW5nKGRheXMsICdkJyk7CiAgICAgICAgfSBlbHNlIGlmIChkYXlzKSB7CiAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyB0aW1lU3RyaW5nKGRheXMsICdkJykgKyB0aW1lU3RyaW5nKGhvdXJzLCAnaCcpOwogICAgICAgIH0gZWxzZSBpZiAoaG91cnMpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoaG91cnMsICdoJykgKyB0aW1lU3RyaW5nKG1pbnMsICdtJyk7CiAgICAgICAgfSBlbHNlIGlmIChtaW5zKSB7CiAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyB0aW1lU3RyaW5nKG1pbnMsICdtJykgKyB0aW1lU3RyaW5nKHNlY3MsICdzJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIHRpbWVTdHJpbmcoc2VjcywgJ3MnKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nKHF1ZXJ5KSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICAgIGlmICghcXVlcnkpCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgdmFyIHBhcmFtcyA9IHF1ZXJ5LnNwbGl0KCcmJyk7CiAgICAgICAgdmFyIHBhcnRzOwogICAgICAgIGZ1bmN0aW9uIGRlY29kZShpdGVtKSB7CiAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoaXRlbS5yZXBsYWNlKCcrJywgJyAnKSk7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYXJhbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgcGFydHMgPSBwYXJhbXNbaV0uc3BsaXQoJz0nKTsKICAgICAgICAgICAgcmVzdWx0W2RlY29kZShwYXJ0cy5zaGlmdCgpKV0gPSBkZWNvZGUocGFydHMuam9pbignPScpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgbWFwOiBtYXAsCiAgICAgICAgZmlsdGVyOiBmaWx0ZXIsCiAgICAgICAgYWxsOiBhbGwsCiAgICAgICAgYW55OiBhbnksCiAgICAgICAgY29udGFpbnM6IGNvbnRhaW5zLAogICAgICAgIGxhc3Q6IGxhc3QsCiAgICAgICAgZXNjYXBlOiBlc2NhcGUsCiAgICAgICAgdW5lc2NhcGU6IHVuZXNjYXBlLAogICAgICAgIG5vcm1hbGl6ZTogbm9ybWFsaXplLAogICAgICAgIHJlZ2V4cEVzY2FwZTogcmVnZXhwRXNjYXBlLAogICAgICAgIE1hdGNoZXI6IE1hdGNoZXIsCiAgICAgICAgZm9ybWF0UGFyZW50TmFtZTogZm9ybWF0UGFyZW50TmFtZSwKICAgICAgICB0aW1lRnJvbURhdGU6IHRpbWVGcm9tRGF0ZSwKICAgICAgICBkYXRlRnJvbURhdGU6IGRhdGVGcm9tRGF0ZSwKICAgICAgICBkYXRlVGltZUZyb21EYXRlOiBkYXRlVGltZUZyb21EYXRlLAogICAgICAgIGZvcm1hdEVsYXBzZWQ6IGZvcm1hdEVsYXBzZWQsCiAgICAgICAgdGltZXN0YW1wOiB0aW1lc3RhbXAsCiAgICAgICAgY3JlYXRlR2VuZXJhdGVkU3RyaW5nOiBjcmVhdGVHZW5lcmF0ZWRTdHJpbmcsCiAgICAgICAgY3JlYXRlR2VuZXJhdGVkQWdvU3RyaW5nOiBjcmVhdGVHZW5lcmF0ZWRBZ29TdHJpbmcsCiAgICAgICAgcGFyc2VRdWVyeVN0cmluZzogcGFyc2VRdWVyeVN0cmluZwogICAgfTsKfSgpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cudGVzdGRhdGEgPSBmdW5jdGlvbiAoKSB7CiAgICB2YXIgZWxlbWVudHNCeUlkID0ge307CiAgICB2YXIgaWRDb3VudGVyID0gMDsKICAgIHZhciBfc3RhdGlzdGljcyA9IG51bGw7CiAgICB2YXIgTEVWRUxTID0gWydUUkFDRScsICdERUJVRycsICdJTkZPJywgJ1dBUk4nLCAnRVJST1InLCAnRkFJTCcsICdTS0lQJ107CiAgICB2YXIgU1RBVFVTRVMgPSBbJ0ZBSUwnLCAnUEFTUycsICdTS0lQJywgJ05PVCBSVU4nXTsKICAgIHZhciBLRVlXT1JEX1RZUEVTID0gWydLRVlXT1JEJywgJ1NFVFVQJywgJ1RFQVJET1dOJywgJ0ZPUicsICdWQVInLCAnSUYnLCAnRUxTRSBJRicsICdFTFNFJ107CiAgICB2YXIgTUVTU0FHRV9UWVBFID0gODsKICAgIGZ1bmN0aW9uIGFkZEVsZW1lbnQoZWxlbSkgewogICAgICAgIGlmICghZWxlbS5pZCkKICAgICAgICAgICAgZWxlbS5pZCA9IHVuaXF1ZUlkKCk7CiAgICAgICAgZWxlbWVudHNCeUlkW2VsZW0uaWRdID0gZWxlbTsKICAgICAgICByZXR1cm4gZWxlbTsKICAgIH0KICAgIGZ1bmN0aW9uIHVuaXF1ZUlkKCkgewogICAgICAgIGlkQ291bnRlcisrOwogICAgICAgIHJldHVybiAnZWxlbWVudC1pZC0nICsgaWRDb3VudGVyOwogICAgfQogICAgZnVuY3Rpb24gdGltZXMoc3RhdHMpIHsKICAgICAgICB2YXIgc3RhcnRNaWxsaXMgPSBzdGF0c1sxXTsKICAgICAgICB2YXIgZWxhcHNlZCA9IHN0YXRzWzJdOwogICAgICAgIGlmIChzdGFydE1pbGxpcyA9PT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBudWxsLCBlbGFwc2VkXTsKICAgICAgICByZXR1cm4gW3V0aWwudGltZXN0YW1wKHN0YXJ0TWlsbGlzKSwKICAgICAgICAgICAgICAgIHV0aWwudGltZXN0YW1wKHN0YXJ0TWlsbGlzICsgZWxhcHNlZCksCiAgICAgICAgICAgICAgICBlbGFwc2VkXTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2UoZWxlbWVudCwgc3RyaW5ncykgewogICAgICAgIHJldHVybiBtb2RlbC5NZXNzYWdlKExFVkVMU1tlbGVtZW50WzJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnRpbWVzdGFtcChlbGVtZW50WzFdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzLmdldChlbGVtZW50WzNdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzLmdldChlbGVtZW50WzRdKSk7CiAgICB9CiAgICBmdW5jdGlvbiBwYXJzZVN0YXR1cyhzdGF0cykgewogICAgICAgIHJldHVybiBTVEFUVVNFU1tzdGF0c1swXV07CiAgICB9CiAgICBmdW5jdGlvbiBjaGlsZENyZWF0b3IocGFyZW50LCBjaGlsZFR5cGUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGVsZW0sIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgICAgIHJldHVybiBhZGRFbGVtZW50KGNoaWxkVHlwZShwYXJlbnQsIGVsZW0sIHN0cmluZ3MsIGluZGV4KSk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZUJvZHlJdGVtKHBhcmVudCwgZWxlbWVudCwgc3RyaW5ncywgaW5kZXgpIHsKICAgICAgICBpZiAoZWxlbWVudFswXSA9PSBNRVNTQUdFX1RZUEUpCiAgICAgICAgICAgIHJldHVybiBjcmVhdGVNZXNzYWdlKGVsZW1lbnQsIHN0cmluZ3MpOwogICAgICAgIHJldHVybiBjcmVhdGVLZXl3b3JkKHBhcmVudCwgZWxlbWVudCwgc3RyaW5ncywgaW5kZXgpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlS2V5d29yZChwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIGt3ID0gbW9kZWwuS2V5d29yZCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICB0eXBlOiBLRVlXT1JEX1RZUEVTW2VsZW1lbnRbMF1dLAogICAgICAgICAgICBpZDogJ2snICsgKGluZGV4ICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMV0pLAogICAgICAgICAgICBsaWJuYW1lOiBzdHJpbmdzLmdldChlbGVtZW50WzJdKSwKICAgICAgICAgICAgdGltZW91dDogc3RyaW5ncy5nZXQoZWxlbWVudFszXSksCiAgICAgICAgICAgIGFyZ3M6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbNV0pLAogICAgICAgICAgICBhc3NpZ246IHN0cmluZ3MuZ2V0KGVsZW1lbnRbNl0pLAogICAgICAgICAgICB0YWdzOiBzdHJpbmdzLmdldChlbGVtZW50WzddKSwKICAgICAgICAgICAgZG9jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZG9jID0gc3RyaW5ncy5nZXQoZWxlbWVudFs0XSk7CiAgICAgICAgICAgICAgICB0aGlzLmRvYyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvYzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBkb2M7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHN0YXR1czogcGFyc2VTdGF0dXMoZWxlbWVudFs4XSwgc3RyaW5ncyksCiAgICAgICAgICAgIHRpbWVzOiBtb2RlbC5UaW1lcyh0aW1lcyhlbGVtZW50WzhdKSksCiAgICAgICAgICAgIGlzQ2hpbGRyZW5Mb2FkZWQ6IHR5cGVvZihlbGVtZW50WzldKSAhPT0gJ251bWJlcicKICAgICAgICB9KTsKICAgICAgICBsYXp5UG9wdWxhdGVLZXl3b3Jkc0Zyb21GaWxlKGt3LCBlbGVtZW50WzldLCBzdHJpbmdzKTsKICAgICAgICByZXR1cm4ga3c7CiAgICB9CiAgICBmdW5jdGlvbiBsYXp5UG9wdWxhdGVLZXl3b3Jkc0Zyb21GaWxlKHBhcmVudCwgbW9kZWxPckluZGV4LCBzdHJpbmdzKSB7CiAgICAgICAgdmFyIG1vZGVsLCBpbmRleCwgcG9wdWxhdG9yOwogICAgICAgIHZhciBjcmVhdG9yID0gY2hpbGRDcmVhdG9yKHBhcmVudCwgY3JlYXRlQm9keUl0ZW0pOwogICAgICAgIGlmIChwYXJlbnQuaXNDaGlsZHJlbkxvYWRlZCkgewogICAgICAgICAgICBtb2RlbCA9IG1vZGVsT3JJbmRleDsKICAgICAgICAgICAgcG9wdWxhdG9yID0gUG9wdWxhdG9yKG1vZGVsLCBzdHJpbmdzLCBjcmVhdG9yKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbmRleCA9IG1vZGVsT3JJbmRleDsKICAgICAgICAgICAgcGFyZW50LmNoaWxkRmlsZU5hbWUgPSB3aW5kb3cuc2V0dGluZ3NbJ3NwbGl0TG9nQmFzZSddICsgJy0nICsgaW5kZXggKyAnLmpzJzsKICAgICAgICAgICAgcG9wdWxhdG9yID0gU3BsaXRMb2dQb3B1bGF0b3IoaW5kZXgsIGNyZWF0b3IpOwogICAgICAgIH0KICAgICAgICBwYXJlbnQucG9wdWxhdGVLZXl3b3Jkcyhwb3B1bGF0b3IpOwogICAgfQogICAgZnVuY3Rpb24gdGFncyh0YWdsaXN0LCBzdHJpbmdzKSB7CiAgICAgICAgcmV0dXJuIHV0aWwubWFwKHRhZ2xpc3QsIHN0cmluZ3MuZ2V0KTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVRlc3QocGFyZW50LCBlbGVtZW50LCBzdHJpbmdzLCBpbmRleCkgewogICAgICAgIHZhciBzdGF0dXMgPSBlbGVtZW50WzRdOwogICAgICAgIHZhciB0ZXN0ID0gbW9kZWwuVGVzdCh7CiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LAogICAgICAgICAgICBpZDogJ3QnICsgKGluZGV4ICsgMSksCiAgICAgICAgICAgIG5hbWU6IHN0cmluZ3MuZ2V0KGVsZW1lbnRbMF0pLAogICAgICAgICAgICBkb2M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkb2MgPSBzdHJpbmdzLmdldChlbGVtZW50WzJdKTsKICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZG9jOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGltZW91dDogc3RyaW5ncy5nZXQoZWxlbWVudFsxXSksCiAgICAgICAgICAgIHN0YXR1czogcGFyc2VTdGF0dXMoc3RhdHVzKSwKICAgICAgICAgICAgbWVzc2FnZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIG1zZyA9IHN0YXR1cy5sZW5ndGggPT0gNCA/IHN0cmluZ3MuZ2V0KHN0YXR1c1szXSkgOiAnJzsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1zZzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRpbWVzOiBtb2RlbC5UaW1lcyh0aW1lcyhzdGF0dXMpKSwKICAgICAgICAgICAgdGFnczogdGFncyhlbGVtZW50WzNdLCBzdHJpbmdzKSwKICAgICAgICAgICAgaXNDaGlsZHJlbkxvYWRlZDogdHlwZW9mKGVsZW1lbnRbNV0pICE9PSAnbnVtYmVyJwogICAgICAgIH0pOwogICAgICAgIGxhenlQb3B1bGF0ZUtleXdvcmRzRnJvbUZpbGUodGVzdCwgZWxlbWVudFs1XSwgc3RyaW5ncyk7CiAgICAgICAgcmV0dXJuIHRlc3Q7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVTdWl0ZShwYXJlbnQsIGVsZW1lbnQsIHN0cmluZ3MsIGluZGV4KSB7CiAgICAgICAgdmFyIHN0YXR1cyA9IGVsZW1lbnRbNV07CiAgICAgICAgdmFyIHN1aXRlID0gbW9kZWwuU3VpdGUoewogICAgICAgICAgICBwYXJlbnQ6IHBhcmVudCwKICAgICAgICAgICAgaWQ6ICdzJyArICgoaW5kZXggfHwgMCkgKyAxKSwKICAgICAgICAgICAgbmFtZTogc3RyaW5ncy5nZXQoZWxlbWVudFswXSksCiAgICAgICAgICAgIHNvdXJjZTogc3RyaW5ncy5nZXQoZWxlbWVudFsxXSksCiAgICAgICAgICAgIHJlbGF0aXZlU291cmNlOiBzdHJpbmdzLmdldChlbGVtZW50WzJdKSwKICAgICAgICAgICAgZG9jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZG9jID0gc3RyaW5ncy5nZXQoZWxlbWVudFszXSk7CiAgICAgICAgICAgICAgICB0aGlzLmRvYyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvYzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBkb2M7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHN0YXR1czogcGFyc2VTdGF0dXMoc3RhdHVzKSwKICAgICAgICAgICAgbWVzc2FnZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIG1zZyA9IHN0YXR1cy5sZW5ndGggPT0gNCA/IHN0cmluZ3MuZ2V0KHN0YXR1c1szXSkgOiAnJzsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1zZzsgfTsKICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRpbWVzOiBtb2RlbC5UaW1lcyh0aW1lcyhzdGF0dXMpKSwKICAgICAgICAgICAgc3RhdGlzdGljczogc3VpdGVTdGF0cyh1dGlsLmxhc3QoZWxlbWVudCkpLAogICAgICAgICAgICBtZXRhZGF0YTogcGFyc2VNZXRhZGF0YShlbGVtZW50WzRdLCBzdHJpbmdzKQogICAgICAgIH0pOwogICAgICAgIHN1aXRlLnBvcHVsYXRlS2V5d29yZHMoUG9wdWxhdG9yKGVsZW1lbnRbOF0sIHN0cmluZ3MsIGNoaWxkQ3JlYXRvcihzdWl0ZSwgY3JlYXRlS2V5d29yZCkpKTsKICAgICAgICBzdWl0ZS5wb3B1bGF0ZVRlc3RzKFBvcHVsYXRvcihlbGVtZW50WzddLCBzdHJpbmdzLCBjaGlsZENyZWF0b3Ioc3VpdGUsIGNyZWF0ZVRlc3QpKSk7CiAgICAgICAgc3VpdGUucG9wdWxhdGVTdWl0ZXMoUG9wdWxhdG9yKGVsZW1lbnRbNl0sIHN0cmluZ3MsIGNoaWxkQ3JlYXRvcihzdWl0ZSwgY3JlYXRlU3VpdGUpKSk7CiAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgfQogICAgZnVuY3Rpb24gcGFyc2VNZXRhZGF0YShkYXRhLCBzdHJpbmdzKSB7CiAgICAgICAgdmFyIG1ldGFkYXRhID0gW107CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGRhdGEubGVuZ3RoOyBpKz0yKSB7CiAgICAgICAgICAgIG1ldGFkYXRhLnB1c2goW3N0cmluZ3MuZ2V0KGRhdGFbaV0pLCBzdHJpbmdzLmdldChkYXRhW2krMV0pXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtZXRhZGF0YTsKICAgIH0KICAgIGZ1bmN0aW9uIHN1aXRlU3RhdHMoc3RhdHMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b3RhbDogc3RhdHNbMF0sCiAgICAgICAgICAgIHBhc3M6IHN0YXRzWzFdLAogICAgICAgICAgICBmYWlsOiBzdGF0c1syXSwKICAgICAgICAgICAgc2tpcDogc3RhdHNbM10KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gUG9wdWxhdG9yKGl0ZW1zLCBzdHJpbmdzLCBjcmVhdG9yKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbnVtYmVyT2ZJdGVtczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY3JlYXRvcjogZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRvcihpdGVtc1tpbmRleF0sIHN0cmluZ3MsIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBTcGxpdExvZ1BvcHVsYXRvcihzdHJ1Y3R1cmVJbmRleCwgY3JlYXRvcikgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG51bWJlck9mSXRlbXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3dbJ2tleXdvcmRzJytzdHJ1Y3R1cmVJbmRleF0ubGVuZ3RoOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjcmVhdG9yOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdG9yKHdpbmRvd1sna2V5d29yZHMnK3N0cnVjdHVyZUluZGV4XVtpbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTdG9yZSh3aW5kb3dbJ3N0cmluZ3MnK3N0cnVjdHVyZUluZGV4XSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gc3VpdGUoKSB7CiAgICAgICAgdmFyIGVsZW0gPSB3aW5kb3cub3V0cHV0LnN1aXRlOwogICAgICAgIGlmIChlbGVtZW50c0J5SWRbZWxlbS5pZF0pCiAgICAgICAgICAgIHJldHVybiBlbGVtOwogICAgICAgIHZhciByb290ID0gYWRkRWxlbWVudChjcmVhdGVTdWl0ZShudWxsLCBlbGVtLCBTdHJpbmdTdG9yZSh3aW5kb3cub3V0cHV0LnN0cmluZ3MpKSk7CiAgICAgICAgd2luZG93Lm91dHB1dC5zdWl0ZSA9IHJvb3Q7CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kTG9hZGVkKGlkKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnRzQnlJZFtpZF07CiAgICB9CiAgICBmdW5jdGlvbiBlbnN1cmVMb2FkZWQoaWQsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIGlkcyA9IGlkLnNwbGl0KCctJyk7CiAgICAgICAgdmFyIHJvb3QgPSBzdWl0ZSgpOwogICAgICAgIGlkcy5zaGlmdCgpOwogICAgICAgIGxvYWRJdGVtcyhpZHMsIHJvb3QsIFtyb290LmlkXSwgY2FsbGJhY2spOwogICAgfQogICAgZnVuY3Rpb24gbG9hZEl0ZW1zKGlkcywgY3VycmVudCwgcmVzdWx0LCBjYWxsYmFjaykgewogICAgICAgIGlmICghaWRzLmxlbmd0aCkgewogICAgICAgICAgICBjYWxsYmFjayhyZXN1bHQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGN1cnJlbnQuY2FsbFdoZW5DaGlsZHJlblJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGlkID0gaWRzLnNoaWZ0KCk7CiAgICAgICAgICAgIHZhciB0eXBlID0gaWRbMF07CiAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KGlkLnN1YnN0cmluZygxKSkgLSAxOwogICAgICAgICAgICB2YXIgaXRlbSA9IHNlbGVjdEZyb20oY3VycmVudCwgdHlwZSwgaW5kZXgpOwogICAgICAgICAgICBpZiAoaXRlbSkKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0uaWQpOwogICAgICAgICAgICBlbHNlICAgIC8vIEludmFsaWQgaWQuIFNob3VsZCB0aGlzIGJlIHJlcG9ydGVkIHNvbWV3aGVyZT8KICAgICAgICAgICAgICAgIGlkcyA9IFtdOwogICAgICAgICAgICBsb2FkSXRlbXMoaWRzLCBpdGVtLCByZXN1bHQsIGNhbGxiYWNrKTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHNlbGVjdEZyb20oZWxlbWVudCwgdHlwZSwgaW5kZXgpIHsKICAgICAgICBpZiAodHlwZSA9PT0gJ2snKSB7CiAgICAgICAgICAgIHZhciBrZXl3b3JkcyA9IHV0aWwuZmlsdGVyKGVsZW1lbnQua2V5d29yZHMoKSwgZnVuY3Rpb24gKGt3KSB7CiAgICAgICAgICAgICAgICByZXR1cm4ga3cudHlwZSAhPSAnbWVzc2FnZSc7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4ga2V5d29yZHNbaW5kZXhdOwogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3QnKSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRlc3RzKClbaW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnN1aXRlcygpW2luZGV4XTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBlcnJvckl0ZXJhdG9yKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhZGRFbGVtZW50KGNyZWF0ZU1lc3NhZ2Uod2luZG93Lm91dHB1dC5lcnJvcnMuc2hpZnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nU3RvcmUod2luZG93Lm91dHB1dC5zdHJpbmdzKSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBoYXNOZXh0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93Lm91dHB1dC5lcnJvcnMubGVuZ3RoID4gMDsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBzdGF0aXN0aWNzKCkgewogICAgICAgIGlmICghX3N0YXRpc3RpY3MpIHsKICAgICAgICAgICAgdmFyIHN0YXREYXRhID0gd2luZG93Lm91dHB1dC5zdGF0czsKICAgICAgICAgICAgX3N0YXRpc3RpY3MgPSBzdGF0cy5TdGF0aXN0aWNzKHN0YXREYXRhWzBdLCBzdGF0RGF0YVsxXSwgc3RhdERhdGFbMl0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX3N0YXRpc3RpY3M7CiAgICB9CiAgICBmdW5jdGlvbiBTdHJpbmdTdG9yZShzdHJpbmdzKSB7CiAgICAgICAgZnVuY3Rpb24gZ2V0VGV4dChpZCkgewogICAgICAgICAgICB2YXIgdGV4dCA9IHN0cmluZ3NbaWRdOwogICAgICAgICAgICBpZiAoIXRleHQpCiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIGlmICh0ZXh0WzBdID09ICcqJykKICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZygxKTsKICAgICAgICAgICAgdmFyIGV4dHJhY3RlZCA9IGV4dHJhY3QodGV4dCk7CiAgICAgICAgICAgIHN0cmluZ3NbaWRdID0gJyonICsgZXh0cmFjdGVkOwogICAgICAgICAgICByZXR1cm4gZXh0cmFjdGVkOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBleHRyYWN0KHRleHQpIHsKICAgICAgICAgICAgdmFyIGRlY29kZWQgPSBKWEcuVXRpbC5CYXNlNjQuZGVjb2RlQXNBcnJheSh0ZXh0KTsKICAgICAgICAgICAgdmFyIGV4dHJhY3RlZCA9IChuZXcgSlhHLlV0aWwuVW56aXAoZGVjb2RlZCkpLnVuemlwKClbMF1bMF07CiAgICAgICAgICAgIHJldHVybiBKWEcuVXRpbC5VVEY4LmRlY29kZShleHRyYWN0ZWQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBnZXQoaWQpIHsKICAgICAgICAgICAgaWYgKGlkID09PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgICAgICAgcmV0dXJuIGdldFRleHQoaWQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4ge2dldDogZ2V0fTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgc3VpdGU6IHN1aXRlLAogICAgICAgIGVycm9ySXRlcmF0b3I6IGVycm9ySXRlcmF0b3IsCiAgICAgICAgZmluZExvYWRlZDogZmluZExvYWRlZCwKICAgICAgICBlbnN1cmVMb2FkZWQ6IGVuc3VyZUxvYWRlZCwKICAgICAgICBzdGF0aXN0aWNzOiBzdGF0aXN0aWNzLAogICAgICAgIFN0cmluZ1N0b3JlOiBTdHJpbmdTdG9yZSwgIC8vIGV4cG9zZWQgZm9yIHRlc3RzCiAgICAgICAgTEVWRUxTOiBMRVZFTFMKICAgIH07Cn0oKTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KZnVuY3Rpb24gcmVtb3ZlSmF2YVNjcmlwdERpc2FibGVkV2FybmluZygpIHsKICAgIC8vIE5vdCB1c2luZyBqUXVlcnkgaGVyZSBmb3IgbWF4aW11bSBzcGVlZAogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2phdmFzY3JpcHQtZGlzYWJsZWQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwp9CmZ1bmN0aW9uIGFkZEphdmFTY3JpcHREaXNhYmxlZFdhcm5pbmcoZXJyb3IpIHsKICAgIGlmICh3aW5kb3cuY29uc29sZSkKICAgICAgICBjb25zb2xlLmVycm9yKCdPcGVuaW5nIGZhaWxlZDogJyArIGVycm9yLm5hbWUgKyAnOiAnICsgZXJyb3IubWVzc2FnZSk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamF2YXNjcmlwdC1kaXNhYmxlZCcpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwp9CmZ1bmN0aW9uIGluaXRMYXlvdXQoc3VpdGVOYW1lLCB0eXBlKSB7CiAgICBwYXJzZVRlbXBsYXRlcygpOwogICAgc2V0VGl0bGUoc3VpdGVOYW1lLCB0eXBlKTsKICAgIGFkZEhlYWRlcigpOwogICAgYWRkUmVwb3J0T3JMb2dMaW5rKHR5cGUpOwp9CmZ1bmN0aW9uIHBhcnNlVGVtcGxhdGVzKCkgewogICAgJCgnc2NyaXB0W3R5cGU9InRleHQveC1qcXVlcnktdG1wbCJdJykubWFwKGZ1bmN0aW9uIChpZHgsIGVsZW0pIHsKICAgICAgICAkLnRlbXBsYXRlKGVsZW0uaWQsIGVsZW0udGV4dCk7CiAgICB9KTsKfQpmdW5jdGlvbiB0ZXN0T3JUYXNrKHRleHQpIHsKICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL3soLiopfS8sIGZ1bmN0aW9uIChtYXRjaCwgZ3JvdXAsIG9mZnNldCwgc3RyaW5nKSB7CiAgICAgICAgaWYgKCF3aW5kb3cuc2V0dGluZ3MucnBhKQogICAgICAgICAgICByZXR1cm4gZ3JvdXA7CiAgICAgICAgcmV0dXJuIHsnVEVTVCc6ICdUQVNLJywgJ1Rlc3QnOiAnVGFzaycsICd0ZXN0JzogJ3Rhc2snfVtncm91cF07CiAgICB9KTsKfQpmdW5jdGlvbiBzZXRUaXRsZShzdWl0ZU5hbWUsIHR5cGUpIHsKICAgIHZhciBnaXZlblRpdGxlID0gd2luZG93LnNldHRpbmdzLnRpdGxlOwogICAgdmFyIHRpdGxlID0gZ2l2ZW5UaXRsZSA/IGdpdmVuVGl0bGUgOiBzdWl0ZU5hbWUgKyAiICIgKyB0eXBlOwogICAgZG9jdW1lbnQudGl0bGUgPSB1dGlsLnVuZXNjYXBlKHRpdGxlKTsKfQpmdW5jdGlvbiBhZGRIZWFkZXIoKSB7CiAgICB2YXIgZ2VuZXJhdGVkID0gdXRpbC50aW1lc3RhbXAod2luZG93Lm91dHB1dC5nZW5lcmF0ZWQpOwogICAgJC50bXBsKCc8aDE+JHt0aXRsZX08L2gxPicgKwogICAgICAgICAgICc8ZGl2IGlkPSJnZW5lcmF0ZWQiPicgKwogICAgICAgICAgICAgJzxzcGFuPkdlbmVyYXRlZDxicj4ke2dlbmVyYXRlZH08L3NwYW4+PGJyPicgKwogICAgICAgICAgICAgJzxzcGFuIGlkPSJnZW5lcmF0ZWQtYWdvIj4ke2Fnb30gYWdvPC9zcGFuPicgKwogICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAnPGRpdiBpZD0idG9wLXJpZ2h0LWhlYWRlciI+JyArCiAgICAgICAgICAgICAnPGRpdiBpZD0icmVwb3J0LW9yLWxvZy1saW5rIj48YSBocmVmPSIjIj48L2E+PC9kaXY+JyArCiAgICAgICAgICAgJzwvZGl2PicsIHsKICAgICAgICBnZW5lcmF0ZWQ6IHV0aWwuY3JlYXRlR2VuZXJhdGVkU3RyaW5nKGdlbmVyYXRlZCksCiAgICAgICAgYWdvOiB1dGlsLmNyZWF0ZUdlbmVyYXRlZEFnb1N0cmluZyhnZW5lcmF0ZWQpLAogICAgICAgIHRpdGxlOiBkb2N1bWVudC50aXRsZQogICAgfSkuYXBwZW5kVG8oJCgnI2hlYWRlcicpKTsKfQpmdW5jdGlvbiBhZGRSZXBvcnRPckxvZ0xpbmsobXlUeXBlKSB7CiAgICB2YXIgdXJsOwogICAgdmFyIHRleHQ7CiAgICB2YXIgY29udGFpbmVyID0gJCgnI3JlcG9ydC1vci1sb2ctbGluaycpOwogICAgaWYgKG15VHlwZSA9PSAnUmVwb3J0JykgewogICAgICAgIHVybCA9IHdpbmRvdy5zZXR0aW5ncy5sb2dVUkw7CiAgICAgICAgdGV4dCA9ICdMT0cnOwogICAgfSBlbHNlIHsKICAgICAgICB1cmwgPSB3aW5kb3cuc2V0dGluZ3MucmVwb3J0VVJMOwogICAgICAgIHRleHQgPSAnUkVQT1JUJzsKICAgIH0KICAgIGlmICh1cmwpIHsKICAgICAgICBjb250YWluZXIuZmluZCgnYScpLmF0dHIoJ2hyZWYnLCB1cmwpOwogICAgICAgIGNvbnRhaW5lci5maW5kKCdhJykudGV4dCh0ZXh0KTsKICAgIH0gZWxzZSB7CiAgICAgICAgY29udGFpbmVyLnJlbW92ZSgpOwogICAgfQp9CmZ1bmN0aW9uIGFkZFN0YXRpc3RpY3MoKSB7CiAgICB2YXIgc3RhdEhlYWRlcnMgPQogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij5Ub3RhbDwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPlBhc3M8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij5GYWlsPC90aD4nICsKICAgICAgICAnPHRoIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+U2tpcDwvdGg+JyArCiAgICAgICAgJzx0aCBjbGFzcz0ic3RhdHMtY29sLWVsYXBzZWQiPkVsYXBzZWQ8L3RoPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+UGFzcyAvIEZhaWwgLyBTa2lwPC90aD4nOwogICAgdmFyIHN0YXRUYWJsZSA9CiAgICAgICAgJzxoMj57VGVzdH0gU3RhdGlzdGljczwvaDI+JyArCiAgICAgICAgJzx0YWJsZSBjbGFzcz0ic3RhdGlzdGljcyIgaWQ9InRvdGFsLXN0YXRzIj48dGhlYWQ+PHRyPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1uYW1lIj5Ub3RhbCBTdGF0aXN0aWNzPC90aD4nICsgc3RhdEhlYWRlcnMgKwogICAgICAgICc8L3RyPjwvdGhlYWQ+PC90YWJsZT4nICsKICAgICAgICAnPHRhYmxlIGNsYXNzPSJzdGF0aXN0aWNzIiBpZD0idGFnLXN0YXRzIj48dGhlYWQ+PHRyPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1uYW1lIj5TdGF0aXN0aWNzIGJ5IFRhZzwvdGg+JyArIHN0YXRIZWFkZXJzICsKICAgICAgICAnPC90cj48L3RoZWFkPjwvdGFibGU+JyArCiAgICAgICAgJzx0YWJsZSBjbGFzcz0ic3RhdGlzdGljcyIgaWQ9InN1aXRlLXN0YXRzIj48dGhlYWQ+PHRyPicgKwogICAgICAgICc8dGggY2xhc3M9InN0YXRzLWNvbC1uYW1lIj5TdGF0aXN0aWNzIGJ5IFN1aXRlPC90aD4nICsgc3RhdEhlYWRlcnMgKwogICAgICAgICc8L3RyPjwvdGhlYWQ+PC90YWJsZT4nOwogICAgJCh0ZXN0T3JUYXNrKHN0YXRUYWJsZSkpLmFwcGVuZFRvKCcjc3RhdGlzdGljcy1jb250YWluZXInKTsKICAgIHV0aWwubWFwKFsndG90YWwnLCAndGFnJywgJ3N1aXRlJ10sIGFkZFN0YXRUYWJsZSk7CiAgICBhZGRUb29sdGlwc1RvRWxhcHNlZFRpbWVzKCk7CiAgICBlbmFibGVTdGF0aXN0aWNzU29ydGVyKCk7Cn0KZnVuY3Rpb24gYWRkVG9vbHRpcHNUb0VsYXBzZWRUaW1lcygpIHsKICAgICQoJy5zdGF0cy1jb2wtZWxhcHNlZCcpLmF0dHIoJ3RpdGxlJywKICAgICAgICB0ZXN0T3JUYXNrKCdUb3RhbCBleGVjdXRpb24gdGltZSBvZiB0aGVzZSB7dGVzdH1zLiAnKSArCiAgICAgICAgJ0V4Y2x1ZGVzIHN1aXRlIHNldHVwcyBhbmQgdGVhcmRvd25zLicpOwogICAgJCgnI3N1aXRlLXN0YXRzJykuZmluZCgnLnN0YXRzLWNvbC1lbGFwc2VkJykuYXR0cigndGl0bGUnLAogICAgICAgICdUb3RhbCBleGVjdXRpb24gdGltZSBvZiB0aGlzIHN1aXRlLicpOwp9CmZ1bmN0aW9uIGVuYWJsZVN0YXRpc3RpY3NTb3J0ZXIoKSB7CiAgICAkLnRhYmxlc29ydGVyLmFkZFBhcnNlcih7CiAgICAgICAgaWQ6ICdzdGF0TmFtZScsCiAgICAgICAgdHlwZTogJ251bWVyaWMnLAogICAgICAgIGlzOiBmdW5jdGlvbihzKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIGRvIG5vdCBhdXRvLWRldGVjdAogICAgICAgIH0sCiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbihzdHJpbmcsIHRhYmxlLCBjZWxsLCBjZWxsSW5kZXgpIHsKICAgICAgICAgICAgLy8gUm93cyBoYXZlIGNsYXNzIGluIGZvcm1hdCAncm93LTxpbmRleD4nLgogICAgICAgICAgICB2YXIgaW5kZXggPSAkKGNlbGwpLnBhcmVudCgpLmF0dHIoJ2NsYXNzJykuc3Vic3RyaW5nKDQpOwogICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoaW5kZXgpOwogICAgICAgIH0KICAgIH0pOwogICAgJCgiLnN0YXRpc3RpY3MiKS50YWJsZXNvcnRlcih7CiAgICAgICAgc29ydEluaXRpYWxPcmRlcjogJ2Rlc2MnLAogICAgICAgIGhlYWRlcnM6IHswOiB7c29ydGVyOiAnc3RhdE5hbWUnLCBzb3J0SW5pdGlhbE9yZGVyOiAnYXNjJ30sCiAgICAgICAgICAgICAgICAgIDY6IHtzb3J0ZXI6IGZhbHNlfX0KICAgIH0pOwp9CmZ1bmN0aW9uIGFkZFN0YXRUYWJsZSh0YWJsZU5hbWUpIHsKICAgIHZhciBzdGF0cyA9IHdpbmRvdy50ZXN0ZGF0YS5zdGF0aXN0aWNzKClbdGFibGVOYW1lXTsKICAgIGlmICh0YWJsZU5hbWUgPT0gJ3RhZycgJiYgc3RhdHMubGVuZ3RoID09IDApIHsKICAgICAgICByZW5kZXJOb1RhZ1N0YXRUYWJsZSgpOwogICAgfSBlbHNlIHsKICAgICAgICByZW5kZXJTdGF0VGFibGUodGFibGVOYW1lLCBzdGF0cyk7CiAgICB9Cn0KZnVuY3Rpb24gcmVuZGVyTm9UYWdTdGF0VGFibGUoKSB7CiAgICAkKCc8dGJvZHk+PHRyIGNsYXNzPSJyb3ctMCI+JyArCiAgICAgICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLW5hbWUiPk5vIFRhZ3M8L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij48L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij48L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij48L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1zdGF0Ij48L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1lbGFwc2VkIj48L3RkPicgKwogICAgICAgICc8dGQgY2xhc3M9InN0YXRzLWNvbC1ncmFwaCI+JyArCiAgICAgICAgICAnPGRpdiBjbGFzcz0iZW1wdHktZ3JhcGgiPjwvZGl2PicgKwogICAgICAgICc8L3RkPicgKwogICAgICAnPC90cj48L3Rib2R5PicpLmFwcGVuZFRvKCcjdGFnLXN0YXRzJyk7Cn0KZnVuY3Rpb24gcmVuZGVyU3RhdFRhYmxlKHRhYmxlTmFtZSwgc3RhdHMpIHsKICAgIHZhciB0ZW1wbGF0ZSA9IHRhYmxlTmFtZSArICdTdGF0aXN0aWNzUm93VGVtcGxhdGUnOwogICAgdmFyIHRib2R5ID0gJCgnPHRib2R5PjwvdGJvZHk+Jyk7CiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3RhdHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAkLnRtcGwodGVtcGxhdGUsIHN0YXRzW2ldLCB7aW5kZXg6IGl9KS5hcHBlbmRUbyh0Ym9keSk7CiAgICB9CiAgICB0Ym9keS5hcHBlbmRUbygnIycgKyB0YWJsZU5hbWUgKyAnLXN0YXRzJyk7Cn0KJC50ZW1wbGF0ZSgnc3RhdENvbHVtbnNUZW1wbGF0ZScsCiAgICAnPHRkIGNsYXNzPSJzdGF0cy1jb2wtc3RhdCI+JHt0b3RhbH08L3RkPicgKwogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPiR7cGFzc308L3RkPicgKwogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPiR7ZmFpbH08L3RkPicgKwogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLXN0YXQiPiR7c2tpcH08L3RkPicgKwogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLWVsYXBzZWQiPiR7ZWxhcHNlZH08L3RkPicgKwogICAgJzx0ZCBjbGFzcz0ic3RhdHMtY29sLWdyYXBoIj4nICsKICAgICAgJ3t7aWYgdG90YWx9fScgKwogICAgICAnPGRpdiBjbGFzcz0iZ3JhcGgiPicgKwogICAgICAgICc8ZGl2IGNsYXNzPSJwYXNzLWJhciIgc3R5bGU9IndpZHRoOiAke3Bhc3NXaWR0aH0lIiB0aXRsZT0iJHtwYXNzUGVyY2VudH0lIj48L2Rpdj4nICsKICAgICAgICAnPGRpdiBjbGFzcz0iZmFpbC1iYXIiIHN0eWxlPSJ3aWR0aDogJHtmYWlsV2lkdGh9JSIgdGl0bGU9IiR7ZmFpbFBlcmNlbnR9JSI+PC9kaXY+JyArCiAgICAgICAgJzxkaXYgY2xhc3M9InNraXAtYmFyIiBzdHlsZT0id2lkdGg6ICR7c2tpcFdpZHRofSUiIHRpdGxlPSIke3NraXBQZXJjZW50fSUiPjwvZGl2PicgKwogICAgICAnPC9kaXY+JyArCiAgICAgICd7e2Vsc2V9fScgKwogICAgICAnPGRpdiBjbGFzcz0iZW1wdHktZ3JhcGgiPjwvZGl2PicgKwogICAgICAne3svaWZ9fScgKwogICAgJzwvdGQ+JwopOwokLnRlbXBsYXRlKCdzdWl0ZVN0YXR1c01lc3NhZ2VUZW1wbGF0ZScsCiAgICAnJHt0b3RhbH0ge3s9IHRlc3RPclRhc2soInt0ZXN0fSIpfX17e2lmIHRvdGFsICE9IDF9fXN7ey9pZn19IHRvdGFsLCAnICsKICAgICcke3Bhc3N9IHBhc3NlZCwgJHtmYWlsfSBmYWlsZWQsICR7c2tpcH0gc2tpcHBlZCcKKTsKLy8gRm9yIGNvbXBsZXRlIGNyb3NzLWJyb3dzZXIgZXhwZXJpZW5jZS4uCi8vIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX29yZGVyLmh0bWwKZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKGV2ZW50KSB7CiAgICB2YXIgZXZlbnQgPSBldmVudCB8fCB3aW5kb3cuZXZlbnQ7CiAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwogICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikKICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKfQo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgpzdG9yYWdlID0gZnVuY3Rpb24gKCkgewogICAgdmFyIHByZWZpeCA9ICdyb2JvdC1mcmFtZXdvcmstJzsKICAgIHZhciBzdG9yYWdlOwogICAgZnVuY3Rpb24gaW5pdCh1c2VyKSB7CiAgICAgICAgcHJlZml4ICs9IHVzZXIgKyAnLSc7CiAgICAgICAgc3RvcmFnZSA9IGdldFN0b3JhZ2UoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFN0b3JhZ2UoKSB7CiAgICAgICAgLy8gVXNlIGxvY2FsU3RvcmFnZSBpZiBpdCdzIGFjY2Vzc2libGUsIG5vcm1hbCBvYmplY3Qgb3RoZXJ3aXNlLgogICAgICAgIC8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzExMjE0NDA0CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0ocHJlZml4LCBwcmVmaXgpOwogICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShwcmVmaXgpOwogICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlOwogICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZ2V0KG5hbWUsIGRlZmF1bHRWYWx1ZSkgewogICAgICAgIHZhciB2YWx1ZSA9IHN0b3JhZ2VbcHJlZml4ICsgbmFtZV07CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogICAgZnVuY3Rpb24gc2V0KG5hbWUsIHZhbHVlKSB7CiAgICAgICAgc3RvcmFnZVtwcmVmaXggKyBuYW1lXSA9IHZhbHVlOwogICAgfQogICAgcmV0dXJuIHtpbml0OiBpbml0LCBnZXQ6IGdldCwgc2V0OiBzZXR9Owp9KCk7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXQgPSB7fTsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsic3VpdGUiXSA9IFsxLDIsMywwLFtdLFswLDAsMzA5OV0sW10sW1s0LDAsMCxbXSxbMCwzNDIsMjMxMCw1XSxbXV1dLFtdLFsxLDAsMSwwXV07Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbInN0cmluZ3MiXSA9IFtdOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJzdHJpbmdzIl0gPSB3aW5kb3cub3V0cHV0WyJzdHJpbmdzIl0uY29uY2F0KFsiKiIsIipKdXB5dGVyIiwiKi9ob21lL2RhdGFrdXJyZS9Xb3JrL2dpdGh1Yi9yb2JvdHMtZnJvbS1qdXB5dGVyL3JvYm90a2VybmVsL2V4YW1wbGVzIiwiKi4uLy4uLy4uLy4uL2hvbWUvZGF0YWt1cnJlL1dvcmsvZ2l0aHViL3JvYm90cy1mcm9tLWp1cHl0ZXIvcm9ib3RrZXJuZWwvZXhhbXBsZXMiLCIqRGVtb25zdHJhdGUgZmFpbGluZyB0ZXN0IiwiKlBhZ2Ugc2hvdWxkIGhhdmUgY29udGFpbmVkIHRleHQgJ0hlbGxvIFdvcmxkIScgYnV0IGRpZCBub3QuIl0pOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cub3V0cHV0WyJzdGF0cyJdID0gW1t7ImVsYXBzZWQiOiIwMDowMDowMiIsImZhaWwiOjEsImxhYmVsIjoiQWxsIFRlc3RzIiwicGFzcyI6MCwic2tpcCI6MH1dLFtdLFt7ImVsYXBzZWQiOiIwMDowMDowMyIsImZhaWwiOjEsImlkIjoiczEiLCJsYWJlbCI6Ikp1cHl0ZXIiLCJuYW1lIjoiSnVweXRlciIsInBhc3MiOjAsInNraXAiOjB9XV07Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbImJhc2VNaWxsaXMiXSA9IDE2NDUyOTQ2MzYzMDA7Cjwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CndpbmRvdy5vdXRwdXRbImdlbmVyYXRlZCJdID0gMzEyMzsKPC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4Kd2luZG93Lm91dHB1dFsiZXhwYW5kX2tleXdvcmRzIl0gPSBudWxsOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp3aW5kb3cuc2V0dGluZ3MgPSB7ImJhY2tncm91bmQiOnsiZmFpbCI6IiNmNjYiLCJwYXNzIjoiIzllOSIsInNraXAiOiIjZmVkODRmIn0sImxvZ1VSTCI6bnVsbCwicnBhIjpmYWxzZSwidGl0bGUiOiIifTsKPC9zY3JpcHQ+Cjx0aXRsZT48L3RpdGxlPgo8L2hlYWQ+Cjxib2R5Pgo8ZGl2IGlkPSJqYXZhc2NyaXB0LWRpc2FibGVkIj4KICA8aDE+T3BlbmluZyBSb2JvdCBGcmFtZXdvcmsgcmVwb3J0IGZhaWxlZDwvaDE+CiAgPHVsPgogICAgPGxpPlZlcmlmeSB0aGF0IHlvdSBoYXZlIDxiPkphdmFTY3JpcHQgZW5hYmxlZDwvYj4gaW4geW91ciBicm93c2VyLjwvbGk+CiAgICA8bGk+TWFrZSBzdXJlIHlvdSBhcmUgdXNpbmcgYSA8Yj5tb2Rlcm4gZW5vdWdoIGJyb3dzZXI8L2I+LiBJZiB1c2luZyBJbnRlcm5ldCBFeHBsb3JlciwgdmVyc2lvbiAxMSBpcyByZXF1aXJlZC48L2xpPgogICAgPGxpPkNoZWNrIGFyZSB0aGVyZSBtZXNzYWdlcyBpbiB5b3VyIGJyb3dzZXIncyA8Yj5KYXZhU2NyaXB0IGVycm9yIGxvZzwvYj4uIFBsZWFzZSByZXBvcnQgdGhlIHByb2JsZW0gaWYgeW91IHN1c3BlY3QgeW91IGhhdmUgZW5jb3VudGVyZWQgYSBidWcuPC9saT4KICA8L3VsPgo8L2Rpdj4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPnJlbW92ZUphdmFTY3JpcHREaXNhYmxlZFdhcm5pbmcoKTs8L3NjcmlwdD4KCjxkaXYgaWQ9ImhlYWRlciI+PC9kaXY+CjxkaXYgaWQ9InN0YXRpc3RpY3MtY29udGFpbmVyIj48L2Rpdj4KPGRpdiBpZD0idGVzdC1kZXRhaWxzLWNvbnRhaW5lciI+PC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgIHRyeSB7CiAgICAgICAgdmFyIHRvcHN1aXRlID0gd2luZG93LnRlc3RkYXRhLnN1aXRlKCk7CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGFkZEphdmFTY3JpcHREaXNhYmxlZFdhcm5pbmcoZXJyb3IpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHdpbmRvdy5wcmV2TG9jYXRpb25IYXNoID0gJyc7CiAgICBzZXRCYWNrZ3JvdW5kKHRvcHN1aXRlKTsKICAgIGluaXRMYXlvdXQodG9wc3VpdGUubmFtZSwgJ1JlcG9ydCcpOwogICAgc3RvcmFnZS5pbml0KCdyZXBvcnQnKTsKICAgIGFkZFN1bW1hcnkodG9wc3VpdGUpOwogICAgYWRkU3RhdGlzdGljcygpOwogICAgYWRkRGV0YWlscygpOwogICAgd2luZG93Lm9uaGFzaGNoYW5nZSA9IHNob3dEZXRhaWxzQnlIYXNoOwp9KTsKCmZ1bmN0aW9uIHNldEJhY2tncm91bmQodG9wc3VpdGUpIHsKICAgIHZhciBjb2xvcjsKICAgIGlmICh0b3BzdWl0ZS5mYWlsKQogICAgICAgIGNvbG9yID0gd2luZG93LnNldHRpbmdzLmJhY2tncm91bmQuZmFpbDsKICAgIGVsc2UgaWYgKHRvcHN1aXRlLnBhc3MpCiAgICAgICAgY29sb3IgPSB3aW5kb3cuc2V0dGluZ3MuYmFja2dyb3VuZC5wYXNzOwogICAgZWxzZQogICAgICAgIGNvbG9yID0gd2luZG93LnNldHRpbmdzLmJhY2tncm91bmQuc2tpcDsKICAgICQoJ2JvZHknKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCBjb2xvcik7Cn0KCmZ1bmN0aW9uIGFkZFN1bW1hcnkodG9wc3VpdGUpIHsKICAgIHZhciBvcHRzID0ge2xvZ1VSTDogd2luZG93LnNldHRpbmdzLmxvZ1VSTH07CiAgICAkLnRtcGwoJ3N1bW1hcnlUYWJsZVRlbXBsYXRlJywgdG9wc3VpdGUsIG9wdHMpLmluc2VydEFmdGVyKCQoJyNoZWFkZXInKSk7Cn0KCmZ1bmN0aW9uIGFkZERldGFpbHMoKSB7CiAgICBhZGRDdXN0b21Tb3J0ZXJzRm9yRGV0YWlscygpOwogICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoKQogICAgICAgIHNob3dEZXRhaWxzQnlIYXNoKCk7CiAgICBlbHNlCiAgICAgICAgcmVuZGVyU2VhcmNoU2VsZWN0b3IoKTsKfQoKZnVuY3Rpb24gYWRkQ3VzdG9tU29ydGVyc0ZvckRldGFpbHMoKSB7CiAgICAkLnRhYmxlc29ydGVyLmFkZFBhcnNlcih7CiAgICAgICAgaWQ6ICdzdGF0dXMnLAogICAgICAgIHR5cGU6ICdudW1lcmljJywKICAgICAgICBpczogZnVuY3Rpb24ocykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBkbyBub3QgYXV0by1kZXRlY3QKICAgICAgICB9LAogICAgICAgIGZvcm1hdDogZnVuY3Rpb24ocykgewogICAgICAgICAgICByZXR1cm4geydGQUlMJzogLTEsICdTS0lQJzogMCwgJ1BBU1MnOiAxfVtzXTsKICAgICAgICB9CiAgICB9KTsKICAgICQudGFibGVzb3J0ZXIuYWRkUGFyc2VyKHsKICAgICAgICBpZDogJ3RpbWVzJywKICAgICAgICB0eXBlOiAndGV4dCcsCiAgICAgICAgaXM6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gZG8gbm90IGF1dG8tZGV0ZWN0CiAgICAgICAgfSwKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgcmV0dXJuIHMuc3Vic3RyaW5nKDAsIDIxKTsgIC8vIHJldHVybiBvbmx5IHN0YXJ0IHRpbWUKICAgICAgICB9CiAgICB9KTsKfQoKZnVuY3Rpb24gc2hvd0RldGFpbHNCeUhhc2goKSB7CiAgICAvLyBDYW5ub3QgdXNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoIGJlY2F1c2UgRmlyZWZveCBpbmNvcnJlY3RseSBkZWNvZGVzIGl0OgogICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNzAzNTUyL2VuY29kaW5nLW9mLXdpbmRvdy1sb2NhdGlvbi1oYXNoCiAgICB2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCcjJykuc2xpY2UoMSkuam9pbignIycpOwogICAgaWYgKCFoYXNoIHx8IGhhc2ggPT0gd2luZG93LnByZXZMb2NhdGlvbkhhc2gpCiAgICAgICAgcmV0dXJuOwogICAgdmFyIHBhcnRzID0gaGFzaC5zcGxpdCgnPycpOwogICAgdmFyIG5hbWUgPSBwYXJ0cy5zaGlmdCgpOwogICAgdmFyIHF1ZXJ5ID0gcGFydHMuam9pbignPycpOwogICAgaWYgKG5hbWUgPT0gJ3NlYXJjaCcpIHsKICAgICAgICB2YXIgcGFyYW1zID0gdXRpbC5wYXJzZVF1ZXJ5U3RyaW5nKHF1ZXJ5KTsKICAgICAgICBzZWFyY2hFeGVjdXRlZChwYXJhbXMuc3VpdGUgfHwgJycsIHBhcmFtcy50ZXN0IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5pbmNsdWRlIHx8ICcnLCBwYXJhbXMuZXhjbHVkZSB8fCAnJyk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcXVlcnkgPSBkZWNvZGVVUklDb21wb25lbnQocXVlcnkpOwogICAgdmFyIGFjdGlvbiA9IHsndG90YWxzJzogdG90YWxEZXRhaWxTZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgJ3RhZ3MnOiAgIHRhZ0RldGFpbFNlbGVjdGVkLAogICAgICAgICAgICAgICAgICAnc3VpdGVzJzogc3VpdGVEZXRhaWxTZWxlY3RlZH1bbmFtZV07CiAgICBpZiAoYWN0aW9uKQogICAgICAgIGFjdGlvbihxdWVyeSk7Cn0KCmZ1bmN0aW9uIHRvdGFsRGV0YWlsU2VsZWN0ZWQoKSB7CiAgICByZW5kZXJUb3RhbFNlbGVjdG9yKCk7CiAgICBzY3JvbGxUb1NlbGVjdG9yKCd0b3RhbHMnLCBuYW1lKTsKfQoKZnVuY3Rpb24gcmVuZGVyVG90YWxTZWxlY3RvcigpIHsKICAgIHZhciBhcmdzID0ge2xpbmtUYXJnZXQ6ICd0b3RhbHMnLAogICAgICAgICAgICAgICAgdG90YWxUYWJTdGF0dXM6ICdkZXRhaWwtdGFiLXNlbGVjdGVkJ307CiAgICByZW5kZXJTZWxlY3RvcihhcmdzLCAndG90YWxEZXRhaWxzU2VsZWN0b3JUZW1wbGF0ZScpOwogICAgdXBkYXRlUHJpbnRTZWxlY3Rvcih0ZXN0T3JUYXNrKCdBbGwge1Rlc3R9cycpKTsKICAgIHJlbmRlclRvdGFsRGV0YWlscygpOwp9CgpmdW5jdGlvbiByZW5kZXJUb3RhbERldGFpbHMoKSB7CiAgICB2YXIgc3RhdCA9IHdpbmRvdy50ZXN0ZGF0YS5zdGF0aXN0aWNzKCkudG90YWxbMF07CiAgICB2YXIgdGVzdHMgPSB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKS5hbGxUZXN0cygpLnNvcnQoc29ydEJ5U3RhdHVzKQogICAgc3RhdC50b3RhbFRpbWUgPSBjYWxjdWxhdGVUb3RhbFRpbWUodGVzdHMpOwogICAgJC50bXBsKCd0YWdPclRvdGFsRGV0YWlsc1RlbXBsYXRlJywgc3RhdCkuYXBwZW5kVG8oJyNkZXRhaWxzLWhlYWRlcicpOwogICAgZHJhd1Rlc3REZXRhaWxzVGFibGUodGVzdHMsIHRydWUpOwp9CgpmdW5jdGlvbiB1cGRhdGVQcmludFNlbGVjdG9yKG5hbWUsIGluZm8pIHsKICAgIGlmIChpbmZvKQogICAgICAgIG5hbWUgKz0gJyAoJyArIGluZm8gKyAnKSc7CiAgICAkKCcjcHJpbnQtc2VsZWN0b3InKS5odG1sKG5hbWUpOwp9CgpmdW5jdGlvbiB0YWdEZXRhaWxTZWxlY3RlZChuYW1lKSB7CiAgICByZW5kZXJUYWdTZWxlY3RvcihuYW1lKTsKICAgIGlmIChuYW1lKSB7CiAgICAgICAgdmFyIHRhZyA9IGZpbmRUYWcobmFtZSk7CiAgICAgICAgaWYgKHRhZykgewogICAgICAgICAgICByZW5kZXJUYWdEZXRhaWxzKHRhZyk7CiAgICAgICAgICAgIHVwZGF0ZVByaW50U2VsZWN0b3IobmFtZSwgdGFnLmluZm8pOwogICAgICAgIH0KICAgIH0KICAgIHNjcm9sbFRvU2VsZWN0b3IoJ3RhZ3MnLCBuYW1lKTsKfQoKZnVuY3Rpb24gZmluZFRhZyhuYW1lKSB7CiAgICB2YXIgdGFncyA9IHdpbmRvdy50ZXN0ZGF0YS5zdGF0aXN0aWNzKCkudGFnOwogICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRhZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICBpZiAodGFnc1tpXS5sYWJlbCA9PSBuYW1lKQogICAgICAgICAgICByZXR1cm4gdGFnc1tpXTsKICAgIH0KICAgIHJldHVybiBudWxsOwp9CgpmdW5jdGlvbiByZW5kZXJUYWdTZWxlY3RvcihuYW1lKSB7CiAgICB2YXIgYXJncyA9IHtsaW5rVGFyZ2V0OiAobmFtZSkgPyAndGFncz8nK25hbWUgOiAndGFncycsCiAgICAgICAgICAgICAgICB0YWdUYWJTdGF0dXM6ICdkZXRhaWwtdGFiLXNlbGVjdGVkJ307CiAgICB2YXIgc3RhdHMgPSB7dGFnczogd2luZG93LnRlc3RkYXRhLnN0YXRpc3RpY3MoKS50YWcsIHNlbGVjdGVkOiBuYW1lfTsKICAgIHJlbmRlclNlbGVjdG9yKGFyZ3MsICd0YWdEZXRhaWxzU2VsZWN0b3JUZW1wbGF0ZScsIHN0YXRzKTsKfQoKZnVuY3Rpb24gcmVuZGVyVGFnRGV0YWlscyh0YWcpIHsKICAgIHZhciB0ZXN0cyA9IGdldFRlc3RzSGF2aW5nVGFnKHRhZyk7CiAgICB0YWcudG90YWxUaW1lID0gY2FsY3VsYXRlVG90YWxUaW1lKHRlc3RzKTsKICAgICQudG1wbCgndGFnT3JUb3RhbERldGFpbHNUZW1wbGF0ZScsIHRhZykuYXBwZW5kVG8oJyNkZXRhaWxzLWhlYWRlcicpOwogICAgZHJhd1Rlc3REZXRhaWxzVGFibGUodGVzdHMsIHRydWUpOwp9CgpmdW5jdGlvbiBzdWl0ZURldGFpbFNlbGVjdGVkKGlkKSB7CiAgICByZW5kZXJTdWl0ZVNlbGVjdG9yKGlkKTsKICAgIGlmIChpZCkKICAgICAgICByZW5kZXJTdWl0ZURldGFpbHMoaWQpOwogICAgc2Nyb2xsVG9TZWxlY3Rvcignc3VpdGVzJywgaWQpOwp9CgpmdW5jdGlvbiByZW5kZXJTdWl0ZVNlbGVjdG9yKGlkKSB7CiAgICB2YXIgYXJncyA9IHtsaW5rVGFyZ2V0OiAoaWQpID8gJ3N1aXRlcz8nK2lkIDogJ3N1aXRlcycsCiAgICAgICAgICAgICAgICBzdWl0ZVRhYlN0YXR1czogJ2RldGFpbC10YWItc2VsZWN0ZWQnfTsKICAgIHZhciBzdGF0cyA9IHtzdWl0ZXM6IHdpbmRvdy50ZXN0ZGF0YS5zdGF0aXN0aWNzKCkuc3VpdGUsCiAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGlkfTsKICAgIHJlbmRlclNlbGVjdG9yKGFyZ3MsICdzdWl0ZURldGFpbHNTZWxlY3RvclRlbXBsYXRlJywgc3RhdHMpOwp9CgpmdW5jdGlvbiByZW5kZXJTdWl0ZURldGFpbHMoaWQpIHsKICAgIHdpbmRvdy50ZXN0ZGF0YS5lbnN1cmVMb2FkZWQoaWQsIGZ1bmN0aW9uIChpZHMpIHsKICAgICAgICB2YXIgc3VpdGUgPSB3aW5kb3cudGVzdGRhdGEuZmluZExvYWRlZChpZCk7CiAgICAgICAgdmFyIG9wdHMgPSB7bG9nVVJMOiB3aW5kb3cuc2V0dGluZ3MubG9nVVJMfTsKICAgICAgICAkLnRtcGwoJ3N1aXRlRGV0YWlsc1RlbXBsYXRlJywgc3VpdGUsIG9wdHMpLmFwcGVuZFRvKCcjZGV0YWlscy1oZWFkZXInKTsKICAgICAgICBkcmF3VGVzdERldGFpbHNUYWJsZShzdWl0ZS5hbGxUZXN0cygpLCBmYWxzZSk7CiAgICAgICAgdXBkYXRlUHJpbnRTZWxlY3RvcihzdWl0ZS5mdWxsTmFtZSk7CiAgICB9KTsKfQoKZnVuY3Rpb24gc2VhcmNoRXhlY3V0ZWQoc3VpdGUsIHRlc3QsIGluY2x1ZGUsIGV4Y2x1ZGUpIHsKICAgIHJlbmRlclNlYXJjaFNlbGVjdG9yKHN1aXRlLCB0ZXN0LCBpbmNsdWRlLCBleGNsdWRlKTsKICAgIGlmIChzdWl0ZSB8fCB0ZXN0IHx8IGluY2x1ZGUgfHwgZXhjbHVkZSkgewogICAgICAgIHJlbmRlclNlYXJjaERldGFpbHMoc3VpdGUsIHRlc3QsIGluY2x1ZGUsIGV4Y2x1ZGUpOwogICAgICAgIHNjcm9sbFRvU2VsZWN0b3IoJ3NlYXJjaCcgKwogICAgICAgICAgICAgICAgICAgICAgICAgJz9zdWl0ZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHN1aXRlKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAnJnRlc3Q9JyArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXN0KSArCiAgICAgICAgICAgICAgICAgICAgICAgICAnJmluY2x1ZGU9JyArIGVuY29kZVVSSUNvbXBvbmVudChpbmNsdWRlKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAnJmV4Y2x1ZGU9JyArIGVuY29kZVVSSUNvbXBvbmVudChleGNsdWRlKSk7CiAgICB9IGVsc2UgewogICAgICAgIHNjcm9sbFRvU2VsZWN0b3IoJ3NlYXJjaCcpOwogICAgfQp9CgpmdW5jdGlvbiByZW5kZXJTZWFyY2hTZWxlY3RvcihzdWl0ZSwgdGVzdCwgaW5jbHVkZSwgZXhjbHVkZSkgewogICAgdmFyIGFyZ3MgPSB7bGlua1RhcmdldDogKHN1aXRlIHx8IHRlc3QgfHwgaW5jbHVkZSB8fCBleGNsdWRlKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3NlYXJjaD9zdWl0ZT0nICsgc3VpdGUgKyAnJnRlc3Q9JyArIHRlc3QgKyAnJmluY2x1ZGU9JyArIGluY2x1ZGUgKyAnJmV4Y2x1ZGU9JyArIGV4Y2x1ZGUpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWFyY2gnLAogICAgICAgICAgICAgICAgc2VhcmNoVGFiU3RhdHVzOiAnZGV0YWlsLXRhYi1zZWxlY3RlZCd9OwogICAgdmFyIHNlYXJjaCA9IHtzdWl0ZTogc3VpdGUsIHRlc3Q6IHRlc3QsIGluY2x1ZGU6IGluY2x1ZGUsIGV4Y2x1ZGU6IGV4Y2x1ZGV9OwogICAgcmVuZGVyU2VsZWN0b3IoYXJncywgJ3NlYXJjaFNlbGVjdG9yVGVtcGxhdGUnLCBzZWFyY2gpOwp9CgpmdW5jdGlvbiByZW5kZXJTZWFyY2hEZXRhaWxzKHN1aXRlLCB0ZXN0LCBpbmNsdWRlLCBleGNsdWRlKSB7CiAgICB2YXIgdGVzdHMgPSBzZWFyY2hUZXN0cyh1dGlsLmVzY2FwZShzdWl0ZSksIHV0aWwuZXNjYXBlKHRlc3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5lc2NhcGUoaW5jbHVkZSksIHV0aWwuZXNjYXBlKGV4Y2x1ZGUpKTsKICAgIHZhciBzdGF0cyA9IGNhbGN1bGF0ZVN0YXRzKHRlc3RzKTsKICAgIHN0YXRzLnRvdGFsVGltZSA9IGNhbGN1bGF0ZVRvdGFsVGltZSh0ZXN0cyk7CiAgICAkLnRtcGwoJ3RhZ09yVG90YWxEZXRhaWxzVGVtcGxhdGUnLCBzdGF0cykuYXBwZW5kVG8oJyNkZXRhaWxzLWhlYWRlcicpOwogICAgZHJhd1Rlc3REZXRhaWxzVGFibGUodGVzdHMsIHRydWUpOwp9CgpmdW5jdGlvbiBzZWFyY2hUZXN0cyhzdWl0ZVBhdHRlcm4sIHRlc3RQYXR0ZXJuLCBpbmNsdWRlUGF0dGVybiwgZXhjbHVkZVBhdHRlcm4pIHsKICAgIHZhciB0ZXN0czsKICAgIGlmIChzdWl0ZVBhdHRlcm4pCiAgICAgICAgdGVzdHMgPSB3aW5kb3cudGVzdGRhdGEuc3VpdGUoKS5zZWFyY2hUZXN0c0luU3VpdGUoc3VpdGVQYXR0ZXJuKTsKICAgIGVsc2UKICAgICAgICB0ZXN0cyA9IHdpbmRvdy50ZXN0ZGF0YS5zdWl0ZSgpLmFsbFRlc3RzKCk7CiAgICByZXR1cm4gdXRpbC5maWx0ZXIodGVzdHMsIGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgaWYgKHRlc3RQYXR0ZXJuICYmICF0ZXN0Lm1hdGNoZXNOYW1lUGF0dGVybih0ZXN0UGF0dGVybikpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoaW5jbHVkZVBhdHRlcm4gJiYgIXRlc3QubWF0Y2hlc1RhZ1BhdHRlcm4oaW5jbHVkZVBhdHRlcm4pKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuICEoZXhjbHVkZVBhdHRlcm4gJiYgdGVzdC5tYXRjaGVzVGFnUGF0dGVybihleGNsdWRlUGF0dGVybikpOwogICAgfSk7Cn0KCmZ1bmN0aW9uIHNjcm9sbFRvU2VsZWN0b3IoYmFzZSwgcXVlcnkpIHsKICAgICQoJyN0ZXN0LWRldGFpbHMtY29udGFpbmVyJykuY3NzKCdtaW4taGVpZ2h0JywgJCh3aW5kb3cpLmhlaWdodCgpKTsKICAgIHZhciBhbmNob3IgPSBxdWVyeSA/IGJhc2UgKyAnPycgKyBlbmNvZGVVUklDb21wb25lbnQocXVlcnkpIDogYmFzZTsKICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gJyc7CiAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IHdpbmRvdy5wcmV2TG9jYXRpb25IYXNoID0gYW5jaG9yOwp9CgpmdW5jdGlvbiByZW5kZXJTZWxlY3RvcihhcmdzLCB0ZW1wbGF0ZSwgc3RhdHMpIHsKICAgIHdpbmRvdy5lbGVtZW50c1RvUmVuZGVyID0gW107CiAgICB2YXIgY29udGFpbmVyID0gJCgnI3Rlc3QtZGV0YWlscy1jb250YWluZXInKTsKICAgIGNvbnRhaW5lci5lbXB0eSgpOwogICAgJC50bXBsKCdkZXRhaWxzSGVhZGVyVGVtcGxhdGUnLCBhcmdzKS5hcHBlbmRUbyhjb250YWluZXIpOwogICAgJC50bXBsKHRlbXBsYXRlLCBzdGF0cykuYXBwZW5kVG8oY29udGFpbmVyKTsKfQoKZnVuY3Rpb24gZHJhd1Rlc3REZXRhaWxzVGFibGUodGVzdHMsIHNvcnRCeVN0YXR1cykgewogICAgaWYgKCF0ZXN0cy5sZW5ndGgpCiAgICAgICAgcmV0dXJuOwogICAgcmVuZGVyVGVzdERldGFpbHNIZWFkZXIoKTsKICAgIHdpbmRvdy5lbGVtZW50c1RvUmVuZGVyID0gdGVzdHM7CiAgICB2YXIgdGFyZ2V0ID0gJCgnI3Rlc3QtZGV0YWlscycpLmZpbmQoJ3Rib2R5Jyk7CiAgICByZW5kZXJUZXN0RGV0YWlscyhzb3J0QnlTdGF0dXMsIHRhcmdldCk7Cn0KCmZ1bmN0aW9uIHJlbmRlclRlc3REZXRhaWxzSGVhZGVyKCkgewogICAgdmFyIGhlYWRlciA9ICQudG1wbCgndGVzdERldGFpbHNUYWJsZVRlbXBsYXRlJyk7CiAgICBoaWRlSGlkZGVuRGV0YWlsc0NvbHVtbnMoaGVhZGVyKTsKICAgIGhlYWRlci5hcHBlbmRUbygnI3Rlc3QtZGV0YWlscy1jb250YWluZXInKTsKfQoKZnVuY3Rpb24gc29ydEJ5U3RhdHVzKHQxLCB0MikgewogICAgaWYgKHQxLnN0YXR1cyA9PSB0Mi5zdGF0dXMpCiAgICAgICAgcmV0dXJuIHQxLmZ1bGxOYW1lIDwgdDIuZnVsbE5hbWUgPyAtMSA6IDE7CiAgICBzdGF0dXNlcyA9IHsnRkFJTCc6IC0xLCAnU0tJUCc6IDAsICdQQVNTJzogMX07CiAgICByZXR1cm4gc3RhdHVzZXNbdDEuc3RhdHVzXSA8IHN0YXR1c2VzW3QyLnN0YXR1c10gPyAtMSA6IDE7Cn0KCmZ1bmN0aW9uIGdldFRlc3RzSGF2aW5nVGFnKHRhZykgewogICAgcmV0dXJuIHdpbmRvdy50ZXN0ZGF0YS5zdWl0ZSgpLnNlYXJjaFRlc3RzQnlUYWcodGFnKS5zb3J0KHNvcnRCeVN0YXR1cyk7Cn0KCmZ1bmN0aW9uIGNhbGN1bGF0ZVRvdGFsVGltZSh0ZXN0cykgewogICAgdmFyIHRvdGFsID0gMDsKICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0ZXN0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykKICAgICAgICB0b3RhbCArPSB0ZXN0c1tpXS50aW1lcy5lbGFwc2VkTWlsbGlzOwogICAgcmV0dXJuIHV0aWwuZm9ybWF0RWxhcHNlZCh0b3RhbCk7Cn0KCmZ1bmN0aW9uIGNhbGN1bGF0ZVN0YXRzKHRlc3RzKSB7CiAgICB2YXIgcGFzc2VkID0gdXRpbC5maWx0ZXIodGVzdHMsIGZ1bmN0aW9uICh0ZXN0KSB7CiAgICAgICAgcmV0dXJuIHRlc3Quc3RhdHVzID09ICdQQVNTJzsKICAgIH0pOwogICAgdmFyIGZhaWxlZCA9IHV0aWwuZmlsdGVyKHRlc3RzLCBmdW5jdGlvbiAodGVzdCkgewogICAgICAgIHJldHVybiB0ZXN0LnN0YXR1cyA9PSAnRkFJTCc7CiAgICB9KTsKICAgIHJldHVybiB7CiAgICAgIHRvdGFsOiB0ZXN0cy5sZW5ndGgsCiAgICAgIHBhc3M6IHBhc3NlZC5sZW5ndGgsCiAgICAgIGZhaWw6IGZhaWxlZC5sZW5ndGgsCiAgICAgIHNraXA6IHRlc3RzLmxlbmd0aCAtIHBhc3NlZC5sZW5ndGggLSBmYWlsZWQubGVuZ3RoCiAgICB9Owp9CgpmdW5jdGlvbiByZW5kZXJUZXN0RGV0YWlscyhzb3J0QnlTdGF0dXMsIHRhcmdldCkgewogICAgaWYgKCF3aW5kb3cuZWxlbWVudHNUb1JlbmRlci5sZW5ndGgpCiAgICAgICAgcmV0dXJuOwogICAgdmFyIHRlc3RzID0gcG9wVXBUbyh3aW5kb3cuZWxlbWVudHNUb1JlbmRlciwgNTApOwogICAgcmVuZGVyVGVzdERldGFpbHNSb3dzKHRlc3RzLCB0YXJnZXQpOwogICAgaWYgKHdpbmRvdy5lbGVtZW50c1RvUmVuZGVyLmxlbmd0aCkKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtyZW5kZXJUZXN0RGV0YWlscyhzb3J0QnlTdGF0dXMsIHRhcmdldCk7fSwgMCk7CiAgICBlbHNlCiAgICAgICAgY29uZmlndXJlVGFibGVTb3J0ZXIoc29ydEJ5U3RhdHVzKTsKfQoKZnVuY3Rpb24gcmVuZGVyVGVzdERldGFpbHNSb3dzKHRlc3RzLCB0YXJnZXQpIHsKICAgIHZhciByb3dzID0gJC50bXBsKCd0ZXN0RGV0YWlsc1RhYmxlUm93VGVtcGxhdGUnLCB0ZXN0cywKICAgICAgICAgICAgICAgICAgICAgIHtsb2dVUkw6IHdpbmRvdy5zZXR0aW5ncy5sb2dVUkx9KTsKICAgIHJvd3MuZmluZCgnYScpLmNsaWNrKHN0b3BQcm9wYWdhdGlvbik7CiAgICBoaWRlSGlkZGVuRGV0YWlsc0NvbHVtbnMocm93cyk7CiAgICByb3dzLmFwcGVuZFRvKHRhcmdldCk7Cn0KCmZ1bmN0aW9uIGNvbmZpZ3VyZVRhYmxlU29ydGVyKHNvcnRCeVN0YXR1cykgewogICAgdmFyIGNvbmZpZyA9IHtoZWFkZXJzOiB7Mzoge3NvcnRlcjogJ3N0YXR1cyd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNToge3NvcnRJbml0aWFsT3JkZXI6ICdkZXNjJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2OiB7c29ydGVyOiAndGltZXMnfX0sCiAgICAgICAgICAgICAgICAgIHNlbGVjdG9yU29ydDogJy5kZXRhaWxzLWNvbC1oZWFkZXInfTsKICAgIGlmIChzb3J0QnlTdGF0dXMpCiAgICAgICAgY29uZmlnWydzb3J0TGlzdCddID0gW1szLCAwXV07CiAgICAkKCcjdGVzdC1kZXRhaWxzJykudGFibGVzb3J0ZXIoY29uZmlnKTsKfQoKZnVuY3Rpb24gcG9wVXBUbyhsaXN0LCB1cFRvKSB7CiAgICB2YXIgcmVzdWx0ID0gW107CiAgICB3aGlsZSAobGlzdC5sZW5ndGggPiAwICYmIHJlc3VsdC5sZW5ndGggPCB1cFRvKQogICAgICAgIHJlc3VsdC5wdXNoKGxpc3Quc2hpZnQoKSk7CiAgICByZXR1cm4gcmVzdWx0Owp9CgpmdW5jdGlvbiB0b2dnbGVEZXRhaWxzQ29sdW1uKG5hbWUpIHsKICAgIHZhciBjb2x1bW4gPSAkKCcuZGV0YWlscy1jb2wtJyArIG5hbWUpOwogICAgY29sdW1uLnRvZ2dsZUNsYXNzKCdoaWRkZW4nKTsKICAgIHZhciBoaWRkZW4gPSBjb2x1bW4uaGFzQ2xhc3MoJ2hpZGRlbicpOwogICAgc3RvcmFnZS5zZXQobmFtZSwgaGlkZGVuID8gJ2hpZGRlbicgOiAndmlzaWJsZScpOwogICAgY29sdW1uLmZpbmQoJy5kZXRhaWxzLWNvbC10b2dnbGUnKS5odG1sKGhpZGRlbiA/ICcmaGVsbGlwOycgOiAnJnRpbWVzOycpOwp9CgpmdW5jdGlvbiBoaWRlSGlkZGVuRGV0YWlsc0NvbHVtbnMoZWxlbSkgewogICAgdmFyIG5hbWVzID0gWydkb2MnLCAndGFncycsICdtc2cnLCAnZWxhcHNlZCcsICd0aW1lcyddOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBuYW1lID0gbmFtZXNbaV07CiAgICAgICAgaWYgKHN0b3JhZ2UuZ2V0KG5hbWUsICd2aXNpYmxlJykgPT0gJ2hpZGRlbicpIHsKICAgICAgICAgICAgdmFyIGNvbHVtbiA9IGVsZW0uZmluZCgnLmRldGFpbHMtY29sLScgKyBuYW1lKTsKICAgICAgICAgICAgY29sdW1uLmFkZENsYXNzKCdoaWRkZW4nKTsKICAgICAgICAgICAgY29sdW1uLmZpbmQoJy5kZXRhaWxzLWNvbC10b2dnbGUnKS5odG1sKCcmaGVsbGlwOycpOwogICAgICAgIH0KICAgIH0KfQo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ic3VtbWFyeVRhYmxlVGVtcGxhdGUiPgogIDxoMj5TdW1tYXJ5IEluZm9ybWF0aW9uPC9oMj4KICA8dGFibGUgY2xhc3M9ImRldGFpbHMiPgogICAgPHRyPgogICAgICA8dGg+U3RhdHVzOjwvdGg+CiAgICAgIHt7aWYgZmFpbH19CiAgICAgIDx0ZD48YSBocmVmPSIjdG90YWxzIiBvbmNsaWNrPSJ0b3RhbERldGFpbFNlbGVjdGVkKCkiCiAgICAgICAgICAgICBjbGFzcz0iZmFpbCI+JHtmYWlsfSB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fXt7aWYgZmFpbCAhPSAxfX1ze3svaWZ9fSBmYWlsZWQ8L2E+PC90ZD4KICAgICAge3tlbHNlIHBhc3MgJiYgc2tpcH19CiAgICAgIDx0ZD48YSBocmVmPSIjdG90YWxzIiBvbmNsaWNrPSJ0b3RhbERldGFpbFNlbGVjdGVkKCkiCiAgICAgICAgICAgICBjbGFzcz0icGFzcyI+JHtwYXNzfSB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fXt7aWYgcGFzcyAhPSAxfX1ze3svaWZ9fSBwYXNzZWQsCiAgICAgICAgICAgICAke3NraXB9IHt7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19e3tpZiBza2lwICE9IDF9fXN7ey9pZn19IHNraXBwZWQ8L2E+PC90ZD4KICAgICAge3tlbHNlIHBhc3N9fQogICAgICA8dGQ+PGEgaHJlZj0iI3RvdGFscyIgb25jbGljaz0idG90YWxEZXRhaWxTZWxlY3RlZCgpIgogICAgICAgICAgICAgY2xhc3M9InBhc3MiPkFsbCB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fXMgcGFzc2VkPC9hPjwvdGQ+CiAgICAgIHt7ZWxzZX19CiAgICAgIDx0ZD48YSBocmVmPSIjdG90YWxzIiBvbmNsaWNrPSJ0b3RhbERldGFpbFNlbGVjdGVkKCkiCiAgICAgICAgICAgICBjbGFzcz0ic2tpcCI+QWxsIHt7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19cyBza2lwcGVkPC9hPjwvdGQ+CiAgICAgIHt7L2lmfX0KICAgIDwvdHI+CiAgICB7e2lmIGRvYygpfX0KICAgIDx0cj4KICAgICAgPHRoPkRvY3VtZW50YXRpb246PC90aD4KICAgICAgPHRkIGNsYXNzPSJkb2MiPnt7aHRtbCBkb2MoKX19PC90ZD4KICAgIDwvdHI+CiAgICB7ey9pZn19CiAgICB7e2VhY2ggbWV0YWRhdGF9fQogICAgPHRyPgogICAgICA8dGg+e3todG1sICR2YWx1ZVswXX19OjwvdGg+CiAgICAgIDx0ZCBjbGFzcz0iZG9jIj57e2h0bWwgJHZhbHVlWzFdfX08L3RkPgogICAgPC90cj4KICAgIHt7L2VhY2h9fQogICAge3tpZiB0aW1lcy5zdGFydFRpbWUgIT0gJ04vQSd9fQogICAgPHRyPgogICAgICA8dGg+U3RhcnQgVGltZTo8L3RoPgogICAgICA8dGQ+JHt0aW1lcy5zdGFydFRpbWV9PC90ZD4KICAgIDwvdHI+CiAgICB7ey9pZn19CiAgICB7e2lmIHRpbWVzLmVuZFRpbWUgIT0gJ04vQSd9fQogICAgPHRyPgogICAgICA8dGg+RW5kIFRpbWU6PC90aD4KICAgICAgPHRkPiR7dGltZXMuZW5kVGltZX08L3RkPgogICAgPC90cj4KICAgIHt7L2lmfX0KICAgIDx0cj4KICAgICAgPHRoPkVsYXBzZWQgVGltZTo8L3RoPgogICAgICA8dGQ+JHt0aW1lcy5lbGFwc2VkVGltZX08L3RkPgogICAgPC90cj4KICAgIHt7aWYgJGl0ZW0ubG9nVVJMfX0KICAgIDx0cj4KICAgICAgPHRoPkxvZyBGaWxlOjwvdGg+CiAgICAgIDx0ZD48YSBocmVmPSIkeyRpdGVtLmxvZ1VSTH0iPiR7JGl0ZW0ubG9nVVJMfTwvYT48L3RkPgogICAgPC90cj4KICAgIHt7L2lmfX0KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idG90YWxTdGF0aXN0aWNzUm93VGVtcGxhdGUiPgogIDx0ciBvbmNsaWNrPSJ0b3RhbERldGFpbFNlbGVjdGVkKCdhbGwnKSIgY2xhc3M9InJvdy0keyRpdGVtLmluZGV4fSI+CiAgICA8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIj4KICAgICAgPGRpdiBjbGFzcz0ic3RhdC1uYW1lIj4KICAgICAgICA8YSBocmVmPSIjdG90YWxzIj57e2h0bWwgbGFiZWx9fTwvYT4KICAgICAgPC9kaXY+CiAgICA8L3RkPgogICAge3t0bXBsKCRkYXRhKSAnc3RhdENvbHVtbnNUZW1wbGF0ZSd9fQogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJ0YWdTdGF0aXN0aWNzUm93VGVtcGxhdGUiPgogIDx0ciBvbmNsaWNrPSJ0YWdEZXRhaWxTZWxlY3RlZCgnJHtsYWJlbH0nKSIgY2xhc3M9InJvdy0keyRpdGVtLmluZGV4fSI+CiAgICA8dGQgY2xhc3M9InN0YXRzLWNvbC1uYW1lIiB0aXRsZT0ie3todG1sIGRvY319Ij4KICAgICAgPGRpdiBjbGFzcz0ic3RhdC1uYW1lIj4KICAgICAgICA8YSBocmVmPSIjdGFncz8ke2xhYmVsfSI+e3todG1sIGxhYmVsfX08L2E+CiAgICAgICAge3tpZiBpbmZvfX0oJHtpbmZvfSl7ey9pZn19CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJ0YWctbGlua3MiPgogICAgICAgIHt7ZWFjaCBsaW5rc319CiAgICAgICAgPHNwYW4+WzxhIGhyZWY9Int7aHRtbCAkdmFsdWUudXJsfX0iIG9uY2xpY2s9InN0b3BQcm9wYWdhdGlvbihldmVudCkiCiAgICAgICAgICAgICAgICAgIHRpdGxlPSJ7e2h0bWwgJHZhbHVlLnVybH19Ij57e2h0bWwgJHZhbHVlLnRpdGxlfX08L2E+XTwvc3Bhbj4KICAgICAgICB7ey9lYWNofX0KICAgICAgPC9kaXY+CiAgICA8L3RkPgogICAge3t0bXBsKCRkYXRhKSAnc3RhdENvbHVtbnNUZW1wbGF0ZSd9fQogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJzdWl0ZVN0YXRpc3RpY3NSb3dUZW1wbGF0ZSI+CiAgPHRyIG9uY2xpY2s9InN1aXRlRGV0YWlsU2VsZWN0ZWQoJyR7aWR9JykiIGNsYXNzPSJyb3ctJHskaXRlbS5pbmRleH0iPgogICAgPHRkIGNsYXNzPSJzdGF0cy1jb2wtbmFtZSIgdGl0bGU9Int7aHRtbCBsYWJlbH19Ij4KICAgICAgPGRpdiBjbGFzcz0ic3RhdC1uYW1lIj4KICAgICAgICA8YSBocmVmPSIjc3VpdGVzPyR7aWR9Ij48c3BhbiBjbGFzcz0icGFyZW50LW5hbWUiPnt7aHRtbCBmb3JtYXRQYXJlbnROYW1lfX08L3NwYW4+e3todG1sIG5hbWV9fTwvYT4KICAgICAgPC9kaXY+CiAgICA8L3RkPgogICAge3t0bXBsKCRkYXRhKSAnc3RhdENvbHVtbnNUZW1wbGF0ZSd9fQogIDwvdHI+Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L3gtanF1ZXJ5LXRtcGwiIGlkPSJkZXRhaWxzSGVhZGVyVGVtcGxhdGUiPgogIDxoMiBpZD0iJHtsaW5rVGFyZ2V0fSI+e3s9IHRlc3RPclRhc2soJ3tUZXN0fSBEZXRhaWxzJyl9fTwvaDI+CiAgPHVsIGlkPSJkZXRhaWwtdGFicyI+CiAgICA8bGkgY2xhc3M9IiR7dG90YWxUYWJTdGF0dXN9IGRldGFpbC10YWIiPgogICAgICA8YSBocmVmPSIjdG90YWxzIiBvbmNsaWNrPSJyZW5kZXJUb3RhbFNlbGVjdG9yKCkiCiAgICAgICAgIHRpdGxlPSJ7ez0gdGVzdE9yVGFzaygnU2hvdyBhbGwge3Rlc3RzfScpfX0iPkFsbDwvYT4KICAgIDwvbGk+CiAgICA8bGkgY2xhc3M9IiR7dGFnVGFiU3RhdHVzfSBkZXRhaWwtdGFiIj4KICAgICAgPGEgaHJlZj0iI3RhZ3MiIG9uY2xpY2s9InJlbmRlclRhZ1NlbGVjdG9yKCkiCiAgICAgICAgIHRpdGxlPSJ7ez0gdGVzdE9yVGFzaygnU2hvdyB7dGVzdHN9IGJ5IHRhZycpfX0iPlRhZ3M8L2E+CiAgICA8L2xpPgogICAgPGxpIGNsYXNzPSIke3N1aXRlVGFiU3RhdHVzfSBkZXRhaWwtdGFiIj4KICAgICAgPGEgaHJlZj0iI3N1aXRlcyIgb25jbGljaz0icmVuZGVyU3VpdGVTZWxlY3RvcigpIgogICAgICAgICB0aXRsZT0ie3s9IHRlc3RPclRhc2soJ1Nob3cge3Rlc3RzfSBieSBzdWl0ZScpfX0iPlN1aXRlczwvYT4KICAgIDwvbGk+CiAgICA8bGkgY2xhc3M9IiR7c2VhcmNoVGFiU3RhdHVzfSBkZXRhaWwtdGFiIj4KICAgICAgPGEgaHJlZj0iI3NlYXJjaCIgb25jbGljaz0icmVuZGVyU2VhcmNoU2VsZWN0b3IoKSIKICAgICAgICAgdGl0bGU9Int7PSB0ZXN0T3JUYXNrKCdGcmVlIHt0ZXN0fSBzZWFyY2gnKX19Ij5TZWFyY2g8L2E+CiAgICA8L2xpPgogIDwvdWw+Cjwvc2NyaXB0PgoKPHNjcmlwdCAgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idG90YWxEZXRhaWxzU2VsZWN0b3JUZW1wbGF0ZSI+CiAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBpZD0iZGV0YWlscy1oZWFkZXIiPgogIDwvdGFibGU+Cjwvc2NyaXB0PgoKPHNjcmlwdCAgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idGFnRGV0YWlsc1NlbGVjdG9yVGVtcGxhdGUiPgogIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgaWQ9ImRldGFpbHMtaGVhZGVyIj4KICAgIDx0ciBjbGFzcz0ic2VsZWN0b3IiPgogICAgICA8dGg+VGFnOjwvdGg+CiAgICAgIDx0ZCBpZD0ibm9ybWFsLXNlbGVjdG9yIj4KICAgICAgICA8c2VsZWN0IGlkPSJ0YWctZGV0YWlsLXNlbGVjdG9yIiB0aXRsZT0iVGFnIHNlbGVjdG9yIgogICAgICAgICAgICAgICAgb25jaGFuZ2U9InRhZ0RldGFpbFNlbGVjdGVkKHRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnZhbHVlKSI+CiAgICAgICAgICA8b3B0aW9uIHNlbGVjdGVkIGRpc2FibGVkIGhpZGRlbj4tLSBTZWxlY3QgLS08L29wdGlvbj4KICAgICAgICAgIHt7ZWFjaCB0YWdzfX0KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiR7JHZhbHVlLmxhYmVsfSIKICAgICAgICAgICAgICAgICAge3tpZiAkdmFsdWUubGFiZWwgPT0gc2VsZWN0ZWR9fXNlbGVjdGVkPSJzZWxlY3RlZCJ7ey9pZn19PgogICAgICAgICAgICB7e2h0bWwgJHZhbHVlLmxhYmVsfX0ge3tpZiAkdmFsdWUuaW5mb319KCR7JHZhbHVlLmluZm99KXt7L2lmfX0KICAgICAgICAgIDwvb3B0aW9uPgogICAgICAgICAge3svZWFjaH19CiAgICAgICAgPC9zZWxlY3Q+CiAgICAgIDwvdGQ+CiAgICAgIDx0ZCBpZD0icHJpbnQtc2VsZWN0b3IiPjwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+Cjwvc2NyaXB0PgoKPHNjcmlwdCAgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ic3VpdGVEZXRhaWxzU2VsZWN0b3JUZW1wbGF0ZSI+CiAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBpZD0iZGV0YWlscy1oZWFkZXIiPgogICAgPHRyIGNsYXNzPSJzZWxlY3RvciI+CiAgICAgIDx0aD5TdWl0ZTo8L3RoPgogICAgICA8dGQgaWQ9Im5vcm1hbC1zZWxlY3RvciI+CiAgICAgICAgPHNlbGVjdCBpZD0ic3VpdGUtZGV0YWlsLXNlbGVjdG9yIiB0aXRsZT0iU3VpdGUgc2VsZWN0b3IiCiAgICAgICAgICAgICAgICBvbmNoYW5nZT0ic3VpdGVEZXRhaWxTZWxlY3RlZCh0aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS52YWx1ZSkiPgogICAgICAgICAgPG9wdGlvbiBzZWxlY3RlZCBkaXNhYmxlZCBoaWRkZW4+LS0gU2VsZWN0IC0tPC9vcHRpb24+CiAgICAgICAgICB7e2VhY2ggc3VpdGVzfX0KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiR7JHZhbHVlLmlkfSIKICAgICAgICAgICAgICAgICAge3tpZiAkdmFsdWUuaWQgPT0gc2VsZWN0ZWR9fXNlbGVjdGVkPSJzZWxlY3RlZCJ7ey9pZn19PgogICAgICAgICAgICB7e2h0bWwgJHZhbHVlLmxhYmVsfX0KICAgICAgICAgIDwvb3B0aW9uPgogICAgICAgICAge3svZWFjaH19CiAgICAgICAgPC9zZWxlY3Q+CiAgICAgIDwvdGQ+CiAgICAgIDx0ZCBpZD0icHJpbnQtc2VsZWN0b3IiPjwvdGQ+CiAgICA8L3RyPgogIDwvdGFibGU+Cjwvc2NyaXB0PgoKPHNjcmlwdCAgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0ic2VhcmNoU2VsZWN0b3JUZW1wbGF0ZSI+CiAgPGZvcm0gYWN0aW9uPSJqYXZhc2NyaXB0OnZvaWQoMCkiPgogICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBpZD0iZGV0YWlscy1oZWFkZXIiPgogICAgICA8dHIgY2xhc3M9InNlbGVjdG9yIGZpcnN0LXNlbGVjdG9yIj4KICAgICAgICA8dGg+PGxhYmVsIGZvcj0ic2VhcmNoLXN1aXRlIj5TdWl0ZTo8L2xhYmVsPjwvdGg+CiAgICAgICAgPHRkPjxpbnB1dCBpZD0ic2VhcmNoLXN1aXRlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iJHtzdWl0ZX0iPjwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBjbGFzcz0ic2VsZWN0b3IgbWlkZGxlLXNlbGVjdG9yIj4KICAgICAgICA8dGg+PGxhYmVsIGZvcj0ic2VhcmNoLXRlc3QiPnt7PSB0ZXN0T3JUYXNrKCd7VGVzdH0nKX19OjwvbGFiZWw+PC90aD4KICAgICAgICA8dGQ+PGlucHV0IGlkPSJzZWFyY2gtdGVzdCIgdHlwZT0idGV4dCIgdmFsdWU9IiR7dGVzdH0iPjwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBjbGFzcz0ic2VsZWN0b3IgbWlkZGxlLXNlbGVjdG9yIj4KICAgICAgICA8dGg+PGxhYmVsIGZvcj0ic2VhcmNoLWluY2x1ZGUiPkluY2x1ZGU6PC9sYWJlbD48L3RoPgogICAgICAgIDx0ZD48aW5wdXQgaWQ9InNlYXJjaC1pbmNsdWRlIiB0eXBlPSJ0ZXh0IiB2YWx1ZT0iJHtpbmNsdWRlfSI+PC90ZD4KICAgICAgPC90cj4KICAgICAgPHRyIGNsYXNzPSJzZWxlY3RvciBtaWRkbGUtc2VsZWN0b3IiPgogICAgICAgIDx0aD48bGFiZWwgZm9yPSJzZWFyY2gtZXhjbHVkZSI+RXhjbHVkZTo8L2xhYmVsPjwvdGg+CiAgICAgICAgPHRkPjxpbnB1dCBpZD0ic2VhcmNoLWV4Y2x1ZGUiIHR5cGU9InRleHQiIHZhbHVlPSIke2V4Y2x1ZGV9Ij48L3RkPgogICAgICA8L3RyPgogICAgICA8dHIgY2xhc3M9InNlbGVjdG9yIGxhc3Qtc2VsZWN0b3IiIGlkPSJzZWFyY2gtYnV0dG9ucyI+CiAgICAgICAgPHRoPjwvdGg+CiAgICAgICAgPHRkPgogICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNlYXJjaCIKICAgICAgICAgICAgICAgICBvbmNsaWNrPSJzZWFyY2hFeGVjdXRlZCgkKCcjc2VhcmNoLXN1aXRlJykudmFsKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3NlYXJjaC10ZXN0JykudmFsKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3NlYXJjaC1pbmNsdWRlJykudmFsKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3NlYXJjaC1leGNsdWRlJykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsiPgogICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IkNsZWFyIgogICAgICAgICAgICAgICAgIG9uY2xpY2s9IiQoJyNzZWFyY2gtc3VpdGUnKS52YWwoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNzZWFyY2gtdGVzdCcpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3NlYXJjaC1pbmNsdWRlJykudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjc2VhcmNoLWV4Y2x1ZGUnKS52YWwoJycpOyI+CiAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIG9uY2xpY2s9IiQoJyNzZWFyY2gtaGVscCcpLnRvZ2dsZSgpIgogICAgICAgICAgICAgdGl0bGU9IlRvZ2dsZSBzZWFyY2ggaGVscC4iPkhlbHA8L2E+CiAgICAgICAgPC90ZD4KICAgICAgPC90cj4KICAgICAgPHRyIGlkPSJzZWFyY2gtaGVscCIgc3R5bGU9ImRpc3BsYXk6IG5vbmUiPgogICAgICAgIDx0aD48L3RoPgogICAgICAgIDx0ZD4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxoMz5TZWFyY2ggZmllbGRzPC9oMz4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAge3s9IHRlc3RPclRhc2soJ3tUZXN0fScpfX1zIGNhbiBiZSBzZWFyY2hlZCBiYXNlZCBvbiBzdWl0ZSBhbmQKICAgICAgICAgICAgICB7ez0gdGVzdE9yVGFzaygne3Rlc3R9Jyl9fSBuYW1lcyBhcyB3ZWxsIGFzIGJhc2VkIG9uIHRhZ3MuIElmCiAgICAgICAgICAgICAgbXVsdGlwbGUgc2VhcmNoIGNyaXRlcmlhIGFyZSB1c2VkLCBvbmx5CiAgICAgICAgICAgICAge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX1zIG1hdGNoaW5nIGFsbCBvZiB0aGVtIGFyZSBpbmNsdWRlZC4KICAgICAgICAgICAgICBTZWFyY2ggZmllbGRzIGhhdmUgc2FtZSBzZW1hbnRpY3MgYXMKICAgICAgICAgICAgICA8ZW0+JiM4MjA5OyYjODIwOTtzdWl0ZTwvZW0+LAogICAgICAgICAgICAgIDxlbT4mIzgyMDk7JiM4MjA5O3t7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19PC9lbT4sCiAgICAgICAgICAgICAgPGVtPiYjODIwOTsmIzgyMDk7aW5jbHVkZTwvZW0+IGFuZAogICAgICAgICAgICAgIDxlbT4mIzgyMDk7JiM4MjA5O2V4Y2x1ZGU8L2VtPiBjb21tYW5kIGxpbmUgb3B0aW9ucywgcmVzcGVjdGl2ZWx5LgogICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0ic2VhcmNoLWhlbHAtZXhhbXBsZXMiPgogICAgICAgICAgICAgIDxjb2wgY2xhc3M9ImhlbHAtaXRlbSI+CiAgICAgICAgICAgICAgPGNvbCBjbGFzcz0iaGVscC1leHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgPGNvbCBjbGFzcz0iaGVscC1leGFtcGxlcz4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGg+RmllbGQ8L3RoPgogICAgICAgICAgICAgICAgPHRoPkV4cGxhbmF0aW9uPC90aD4KICAgICAgICAgICAgICAgIDx0aD5FeGFtcGxlczwvdGg+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+U3VpdGU8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICB7ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fXMgaW4gbWF0Y2hpbmcgc3VpdGVzIGFyZSBpbmNsdWRlZC4KICAgICAgICAgICAgICAgICAgVGhlIHBhdHRlcm4gY2FuIG1hdGNoIGVpdGhlciBzdWl0ZSdzIG5hbWUgb3IgaXRzIGZ1bGwgbmFtZQogICAgICAgICAgICAgICAgICB0aGF0IGNvbnRhaW5zIGFsc28gcGFyZW50IHN1aXRlIG5hbWVzLgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5NeSBTdWl0ZTxicj5Sb290LlBhcmVudC5TdWkqPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD57ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIE1hdGNoaW5nIHt7PSB0ZXN0T3JUYXNrKCd7dGVzdH0nKX19cyBhcmUgaW5jbHVkZWQuIFRoZQogICAgICAgICAgICAgICAgICBwYXR0ZXJuIGNhbiBtYXRjaCBlaXRoZXIge3s9IHRlc3RPclRhc2soJ3t0ZXN0fScpfX0ncyBuYW1lCiAgICAgICAgICAgICAgICAgIG9yIGl0cyBmdWxsIG5hbWUgdGhhdCBjb250YWlucyBhbHNvIHBhcmVudCBzdWl0ZSBuYW1lcy4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+RXhhbXBsZSBOYW1lPGJyPlJvb3QuUGEqLlQ/Pz88L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPkluY2x1ZGU8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICB7ez0gdGVzdE9yVGFzaygne1Rlc3R9Jyl9fXMgdGhhdCBjb250YWluIG1hdGNoaW5nIHRhZ3MgYXJlCiAgICAgICAgICAgICAgICAgIGluY2x1ZGVkLgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5zbW9rZTxicj5idWctKjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+RXhjbHVkZTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIHt7PSB0ZXN0T3JUYXNrKCd7VGVzdH0nKX19cyB0aGF0IGNvbnRhaW4gbWF0Y2hpbmcgdGFncyBhcmUKICAgICAgICAgICAgICAgICAgbm90IGluY2x1ZGVkLgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5zbG93PGJyPmZlYXR1cmUtND88L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDxoMz5QYXR0ZXJuczwvaDM+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIEFsbCBzZWFyY2hlcyBzdXBwb3J0IDxlbT4qPC9lbT4gYW5kIDxlbT4/PC9lbT4gd2lsZGNhcmRzIGFuZCBhcmUKICAgICAgICAgICAgICBjYXNlLCBzcGFjZSBhbmQgdW5kZXJzY29yZSBpbnNlbnNpdGl2ZS4gVGFnIHJlbGF0ZWQgc2VhcmNoZXMgYWxzbwogICAgICAgICAgICAgIHN1cHBvcnQgPGVtPkFORDwvZW0+LCA8ZW0+T1I8L2VtPiBhbmQgPGVtPk5PVDwvZW0+IChjYXNlLXNlbnNpdGl2ZSkKICAgICAgICAgICAgICBjb21iaW5pbmcgb3BlcmF0b3JzLiBJZiBvcGVyYXRvcnMgYXJlIHVzZWQgdG9nZXRoZXIsIHRoZWlyCiAgICAgICAgICAgICAgcHJlY2VkZW5jZSwgZnJvbSBoaWdoZXN0IHRvIGxvd2VzdCwgaXMgPGVtPkFORDwvZW0+LCA8ZW0+T1I8L2VtPiwKICAgICAgICAgICAgICA8ZW0+Tk9UPC9lbT4uIFNlZSA8ZW0+U2ltcGxlIHBhdHRlcm5zPC9lbT4gYW5kCiAgICAgICAgICAgICAgPGVtPlRhZyBwYXR0ZXJuczwvZW0+IHNlY3Rpb25zIGluCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3JvYm90ZnJhbWV3b3JrLm9yZy9yb2JvdGZyYW1ld29yay8jdXNlci1ndWlkZSI+Um9ib3QKICAgICAgICAgICAgICBGcmFtZXdvcmsgVXNlciBHdWlkZTwvYT4gZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8dGFibGUgY2xhc3M9InNlYXJjaC1oZWxwLWV4YW1wbGVzIj4KICAgICAgICAgICAgICA8Y29sIGNsYXNzPSJoZWxwLWl0ZW0iPgogICAgICAgICAgICAgIDxjb2wgY2xhc3M9ImhlbHAtZXhwbGFuYXRpb24iPgogICAgICAgICAgICAgIDxjb2wgY2xhc3M9ImhlbHAtZXhhbXBsZXM+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPlBhdHRlcm48L3RoPgogICAgICAgICAgICAgICAgPHRoPkV4cGxhbmF0aW9uPC90aD4KICAgICAgICAgICAgICAgIDx0aD5FeGFtcGxlczwvdGg+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+KjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+TWF0Y2hlcyBhbnl0aGluZywgZXZlbiBhbiBlbXB0eSBzdHJpbmcuPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5mKjxicj5zcHJpbnQtKjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+PzwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+TWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3Rlci48L3RkPgogICAgICAgICAgICAgICAgPHRkPmY/Pzxicj5zcHJpbnQtMT88L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPkFORDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+TWF0Y2hlcyBpZiBhbGwgcGF0dGVybnMgbWF0Y2guPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5mb28gQU5EIGJhcjxicj54IEFORCB5KiBBTkQgej8/PC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD5PUjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+TWF0Y2hlcyBpZiBhbnkgcGF0dGVybiBtYXRjaGVzLjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+Zm9vIE9SIGJhcjxicj54IE9SIHkqIE9SIHoxIEFORCB6MjwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+Tk9UPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICBNYXRjaGVzIGlmIChvcHRpb25hbCkgcGF0dGVybiBiZWZvcmUgbWF0Y2hlcyBhbmQgcGF0dGVybgogICAgICAgICAgICAgICAgICAgIGFmdGVyIGRvZXMgbm90LgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD5mb28gTk9UIGJhcjxicj4qIE5PVCBpZC0qIEFORCBzbW9rZTxicj5OT1QgYmFyPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZD4KICAgICAgPC90cj4KICAgIDwvdGFibGU+CiAgPC9mb3JtPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idGFnT3JUb3RhbERldGFpbHNUZW1wbGF0ZSI+CiAgPHRyPgogICAgPHRoPlN0YXR1czo8L3RoPgogICAgPHRkPnt7dG1wbCgkZGF0YSkgJ3N1aXRlU3RhdHVzTWVzc2FnZVRlbXBsYXRlJ319PC90ZD4KICA8L3RyPgogIHt7aWYgZG9jfX0KICA8dHI+CiAgICA8dGg+RG9jdW1lbnRhdGlvbjo8L3RoPgogICAgPHRkPnt7aHRtbCBkb2N9fTwvdGQ+CiAgPC90cj4KICB7ey9pZn19CiAge3tpZiBjb21iaW5lZH19CiAgPHRyPgogICAgPHRoPlBhdHRlcm46PC90aD4KICAgIDx0ZD57e2h0bWwgY29tYmluZWR9fTwvdGQ+CiAgPC90cj4KICB7ey9pZn19CiAge3tpZiBsaW5rc319e3tpZiBsaW5rcy5sZW5ndGh9fQogIDx0cj4KICAgIDx0aD5MaW5rczo8L3RoPgogICAgPHRkPnt7ZWFjaCBsaW5rc319PGEgaHJlZj0ie3todG1sICR2YWx1ZS51cmx9fSIKICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJ7e2h0bWwgJHZhbHVlLnVybH19Ij57e2h0bWwgJHZhbHVlLnRpdGxlfX08L2E+ICZuYnNwOyB7ey9lYWNofX08L3RkPgogIDwvdHI+CiAge3svaWZ9fXt7L2lmfX0KICA8dHI+CiAgICA8dGg+VG90YWwgVGltZTo8L3RoPgogICAgPHRkPiR7dG90YWxUaW1lfTwvdGQ+CiAgPC90cj4KPC9zY3JpcHQ+Cgo8c2NyaXB0IHR5cGU9InRleHQveC1qcXVlcnktdG1wbCIgaWQ9InN1aXRlRGV0YWlsc1RlbXBsYXRlIj4KICA8dHI+CiAgICA8dGg+U3RhdHVzOjwvdGg+CiAgICA8dGQ+e3t0bXBsKCRkYXRhKSAnc3VpdGVTdGF0dXNNZXNzYWdlVGVtcGxhdGUnfX08L3RkPgogIDwvdHI+CiAge3tpZiBkb2MoKX19CiAgPHRyPgogICAgPHRoPkRvY3VtZW50YXRpb246PC90aD4KICAgIDx0ZCBjbGFzcz0iZG9jIj57e2h0bWwgZG9jKCl9fTwvdGQ+CiAgPC90cj4KICB7ey9pZn19CiAge3tlYWNoIG1ldGFkYXRhfX0KICA8dHI+CiAgICA8dGg+e3todG1sICR2YWx1ZVswXX19OjwvdGg+CiAgICA8dGQgY2xhc3M9ImRvYyI+e3todG1sICR2YWx1ZVsxXX19PC90ZD4KICA8L3RyPgogIHt7L2VhY2h9fQogIHt7aWYgbWVzc2FnZSgpfX0KICA8dHI+CiAgICA8dGg+TWVzc2FnZTo8L3RoPgogICAgPHRkIGNsYXNzPSJtZXNzYWdlIj57e2h0bWwgbWVzc2FnZSgpfX08L3RkPgogIDwvdHI+CiAge3svaWZ9fQogIDx0cj4KICAgIDx0aD5TdGFydCAvIEVuZCBUaW1lOjwvdGg+CiAgICA8dGQ+JHt0aW1lcy5zdGFydFRpbWV9IC8gJHt0aW1lcy5lbmRUaW1lfTwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGg+RWxhcHNlZCBUaW1lOjwvdGg+CiAgICA8dGQ+JHt0aW1lcy5lbGFwc2VkVGltZX08L3RkPgogIDwvdHI+CiAge3tpZiAkaXRlbS5sb2dVUkx9fQogIDx0cj4KICAgIDx0aD5Mb2cgRmlsZTo8L3RoPgogICAgPHRkPjxhIGhyZWY9IiR7JGl0ZW0ubG9nVVJMfSMke2lkfSIKICAgICAgICAgICB0aXRsZT0ie3todG1sIGZ1bGxOYW1lfX0iPiR7JGl0ZW0ubG9nVVJMfSMke2lkfTwvYT48L3RkPgogIDwvdHI+CiAge3svaWZ9fQo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idGVzdERldGFpbHNUYWJsZVRlbXBsYXRlIj4KICA8dGFibGUgaWQ9InRlc3QtZGV0YWlscyI+CiAgICA8dGhlYWQ+CiAgICAgIDx0cj4KICAgICAgICA8dGggY2xhc3M9ImRldGFpbHMtY29sLW5hbWUiIHRpdGxlPSJOYW1lIj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLWhlYWRlcic+TmFtZTwvZGl2PgogICAgICAgIDwvdGg+CiAgICAgICAgPHRoIGNsYXNzPSJkZXRhaWxzLWNvbC1kb2MiIHRpdGxlPSJEb2N1bWVudGF0aW9uIj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLXRvZ2dsZScgb25jbGljaz0idG9nZ2xlRGV0YWlsc0NvbHVtbignZG9jJykiPiZ0aW1lczs8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLWhlYWRlcic+RG9jdW1lbnRhdGlvbjwvZGl2PgogICAgICAgIDwvdGg+CiAgICAgICAgPHRoIGNsYXNzPSJkZXRhaWxzLWNvbC10YWdzIiB0aXRsZT0iVGFncyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC10b2dnbGUnIG9uY2xpY2s9InRvZ2dsZURldGFpbHNDb2x1bW4oJ3RhZ3MnKSI+JnRpbWVzOzwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtaGVhZGVyJz5UYWdzPC9kaXY+CiAgICAgICAgPC90aD4KICAgICAgICA8dGggY2xhc3M9ImRldGFpbHMtY29sLXN0YXR1cyIgdGl0bGU9IlN0YXR1cyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC1oZWFkZXInPlN0YXR1czwvZGl2PgogICAgICAgIDwvdGg+CiAgICAgICAgPHRoIGNsYXNzPSJkZXRhaWxzLWNvbC1tc2ciIHRpdGxlPSJNZXNzYWdlIj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLXRvZ2dsZScgb25jbGljaz0idG9nZ2xlRGV0YWlsc0NvbHVtbignbXNnJykiPiZ0aW1lczs8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLWhlYWRlcic+TWVzc2FnZTwvZGl2PgogICAgICAgIDwvdGg+CiAgICAgICAgPHRoIGNsYXNzPSJkZXRhaWxzLWNvbC1lbGFwc2VkIiB0aXRsZT0iRWxhcHNlZCBUaW1lIj4KICAgICAgICAgIDxkaXYgY2xhc3M9J2RldGFpbHMtY29sLXRvZ2dsZScgb25jbGljaz0idG9nZ2xlRGV0YWlsc0NvbHVtbignZWxhcHNlZCcpIj4mdGltZXM7PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC1oZWFkZXInPkVsYXBzZWQ8L2Rpdj4KICAgICAgICA8L3RoPgogICAgICAgIDx0aCBjbGFzcz0iZGV0YWlscy1jb2wtdGltZXMiIHRpdGxlPSJTdGFydCBUaW1lIC8gRW5kIFRpbWUiPgogICAgICAgICAgPGRpdiBjbGFzcz0nZGV0YWlscy1jb2wtdG9nZ2xlJyBvbmNsaWNrPSJ0b2dnbGVEZXRhaWxzQ29sdW1uKCd0aW1lcycpIj4mdGltZXM7PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSdkZXRhaWxzLWNvbC1oZWFkZXInPlN0YXJ0IC8gRW5kPC9kaXY+CiAgICAgICAgPC90aD4KICAgICAgPC90cj4KICAgIDwvdGhlYWQ+CiAgICA8dGJvZHk+PC90Ym9keT4KICA8L3RhYmxlPgo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC94LWpxdWVyeS10bXBsIiBpZD0idGVzdERldGFpbHNUYWJsZVJvd1RlbXBsYXRlIj4KICB7e2lmICRpdGVtLmxvZ1VSTH19CiAgPHRyIG9uY2xpY2s9ImxvY2F0aW9uID0gJyR7JGl0ZW0ubG9nVVJMfSMke2lkfSciIHRpdGxlPSJ7e2h0bWwgZnVsbE5hbWV9fSI+CiAgICA8dGQgY2xhc3M9ImRldGFpbHMtY29sLW5hbWUiPgogICAgICA8ZGl2PjxhIGhyZWY9IiR7JGl0ZW0ubG9nVVJMfSMke2lkfSI+PHNwYW4gY2xhc3M9InBhcmVudC1uYW1lIj57e2h0bWwgZm9ybWF0UGFyZW50TmFtZX19PC9zcGFuPnt7aHRtbCBuYW1lfX08L2E+PC9kaXY+CiAgICA8L3RkPgogIHt7ZWxzZX19CiAgPHRyIHRpdGxlPSJ7e2h0bWwgZnVsbE5hbWV9fSI+CiAgICA8dGQgY2xhc3M9ImRldGFpbHMtY29sLW5hbWUiPgogICAgICA8ZGl2PjxzcGFuIGNsYXNzPSJwYXJlbnQtbmFtZSI+e3todG1sIGZvcm1hdFBhcmVudE5hbWV9fTwvc3Bhbj57e2h0bWwgbmFtZX19PC9kaXY+CiAgICA8L3RkPgogIHt7L2lmfX0KICAgIDx0ZCBjbGFzcz0iZGV0YWlscy1jb2wtZG9jIj48ZGl2IGNsYXNzPSJkb2MgZGV0YWlscy1saW1pdGVkIj57e2h0bWwgZG9jKCl9fTwvZGl2PjwvdGQ+CiAgICA8dGQgY2xhc3M9ImRldGFpbHMtY29sLXRhZ3MiPjxkaXY+e3todG1sIHRhZ3Muam9pbignLCAnKX19PC9kaXY+PC90ZD4KICAgIDx0ZCBjbGFzcz0iZGV0YWlscy1jb2wtc3RhdHVzIj48ZGl2PjxzcGFuIGNsYXNzPSJsYWJlbCAke3N0YXR1cy50b0xvd2VyQ2FzZSgpfSI+JHtzdGF0dXN9PC9zcGFuPjwvZGl2PjwvdGQ+CiAgICA8dGQgY2xhc3M9ImRldGFpbHMtY29sLW1zZyI+PGRpdiBjbGFzcz0ibWVzc2FnZSBkZXRhaWxzLWxpbWl0ZWQiPnt7aHRtbCBtZXNzYWdlKCl9fTwvZGl2PjwvdGQ+CiAgICA8dGQgY2xhc3M9ImRldGFpbHMtY29sLWVsYXBzZWQiPjxkaXY+JHt0aW1lcy5lbGFwc2VkVGltZX08L2Rpdj48L3RkPgogICAgPHRkIGNsYXNzPSJkZXRhaWxzLWNvbC10aW1lcyI+PGRpdj4ke3RpbWVzLnN0YXJ0VGltZX08YnI+JHt0aW1lcy5lbmRUaW1lfTwvZGl2PjwvdGQ+CiAgPC90cj4KPC9zY3JpcHQ+Cgo8L2JvZHk+CjwvaHRtbD4K';w.document.open();w.document.write(window.atob(d));w.document.close();var a=w.document.createElement('a');a.appendChild(w.document.createTextNode('Download'));a.href='data:text/html;base64,' + d;a.download='report.html';a.style='position:fixed;top:0;right:0;color:white;background:black;text-decoration:none;font-weight:bold;padding:7px 14px;border-radius:0 0 0 5px;';w.document.body.append(a);})(this);\">Report</a></p>" ] }, "metadata": {}, "output_type": "display_data" }, { "ename": "", "evalue": "", "output_type": "error", "traceback": [ "==============================================================================", "Jupyter ", "==============================================================================", "Demonstrate failing test | FAIL |", "Page should have contained text 'Hello World!' but did not.", "------------------------------------------------------------------------------", "Jupyter | FAIL |", "1 test, 0 passed, 1 failed", "==============================================================================", "Output: /run/user/1000/tmprt350m3p/output.xml" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAAMvCAYAAAAqJrS9AAAgAElEQVR4XuydB7zN5R/Hvy0ZEQpRNiUjpETISGRGRWRklRHZs+yMbJEkM4oiI7K3zJKR7LJJdoq2//fz3H73/7vnnvE75577c8fn+3r1qu75jef3fp7zO8/n+Y7nlqxpi90QGgmQAAmQAAmQAAmQAAmQAAmEQODohc1BnXULBUhQvHgwCZAACZAACZAACZAACZCAjQAFCIcDCZAACZAACZAACZAACZCAawQoQFxDzRuRAAmQAAmQAAmQAAmQAAlQgHAMkAAJkAAJkAAJkAAJkAAJuEaAAsQ11LwRCZAACZAACZAACZAACZAABQjHAAmQAAmQAAmQAAmQAAmQgGsEKEBcQ80bkQAJkAAJkAAJkAAJkAAJUIBwDJAACZAACZAACZAACZAACbhGgALENdS8EQmQAAnEHwJlKxSXV1vVkfsypZNTJ3+SSe9/JmtXbDEP8ECWjNKxRzMp+OjDcvWXX2XB5ytlyvjZcuPGDZk8a4hkz5VZ6tdsL6dO/CTJkieVVVs/lk+nL5IJY2ea//a0qmWayqK1k6L9/ZUXO0r3vq0kT76c5rPffr0u3+3aL8MHTDTXxr2sz6yTRw+ZIukz3CN1X6kufbqNluVfrjcf4dhbb7tVGtXqJLfccos0aVlbnnuhvCRPkUz27jks7+p5hw8ekzadXjHn2m396m3Sre07Meo8+3UvXbwiq5dvlnEjp8v1a78HZOqvvW+93UYqVi0lpQrVNtd59PH8MnZyX3n7rbFy+dIvMuy9HnL16m9STRn/+edf5phnq5WWXgPfkCuXr0qlUo18PjMY++I4ftTHMmL8W16Z4Jq49ugJveWxYgXkhYot5acz56Rlu/rSoGnNaOf8ePi4GS8YGxvXb5denUdI0mR3yhudG0nZZ4qbftu49hsZOXiyGW9PPlXEPNcXOu4G93nfXM/iW/HJhuZ5Q7U770wia76Z6fX0NzsOkwZNavocj5Fj0OO58XeMU4zBIf0+kGU6JvGsR384KQ1f7CB///1P5DNhnP189kLksfjvQM9assxj8lqblyVzlvvk7E8X5OMpC2Th3JWhIog8z/ruel7o6SfqmXFbp0E1qVW/iqRJk8p8h0YNnmS+Q1b/4Lx///1X+/68zP74S/MOqPxcWXnr7dbSouGbsnvHfnPpTd99LosXrJXhAz+MfD+8Wq+bfL/7kPkc3+d5Kz4w31uME4yXmFquB7NK++5N5eF8ueTKlatmLOEdZrUd/YDvva+xVaBQHvlg+gBZNG+1DOz1ngQaN2v0+06LSoAChCOCBEiABEggCoF8j+SWCTMGyeavdqjo2Cyln35CipUsLM1e7iZHfzwpH88fLbffdptMnzRXsuV4QF6oW0kmjvtUJqtIsUTBxnXfSOfWg7wKEHy2+Iu1kffctmmXrNg8XTz//rX+/d2JfSRV6pTy3oiPJG3au80k9tCBo9LylbfMvazPrIsd2n9UatauYCbO53++KHWqvyHXfrseRYDUb1JDWrVvIJ/N+FJ+OHRcj60myZMnk5eqtZbXWtc15/br8a788cef5rLndFK3Z/fBGI0Sa4Lc/80xki59WmnY7HkzwWr7Wl+5M2kSv0z9tbfzW80DChA0vHu7IbJu1VbzDJjQYqLlKUA8nxki1BfHDi36S8Eiec31evR9XY4d0XExdYH5/6/WfC2pta/mLR8vt956q3ww5hOZNuFzyZEri2TNcb+ZULbt0li+nL9GNm3YLr+qYPh68+4oAqT/sA5SsszjOsbmyR+//ylNWtQyk9w2TXtHThIheF+t1132fncobAIEk9wyzxQzz1GnYTXJ/WA26f/WGPP/e3YdlHdGd/U5HnFMOkyWPZ4bf/cmQPD3McOmycxpXwQUIL6eNeP96WXSrHfku50HZMGcFYbZ0xWfNJy2b9sTozFrCRDP7+W6lVulRq1npNNbr5k+/F6/GxgnKVOlkDrV2kj+gg+ZMTZj8nw5sPcHHZ+ltV2PSZtmfSTDffc6EiD4bo56Z7Jp/8uNnpPWHRua/w6HAElxVzKZtXCsLmhcM+yzZM8kdRtWN/c7efwn0/ZAAqRLr+bKoIJZFKlSpon8peLe37g5p0KSFpUABQhHBAmQAAmQQBQC3fu2NJOGyk81NpP3VHffJQNHdtHJxmr5Uyfl/Yd1jPIDDZGAFcUqpZvIpJnvSE797zvuuF06vT5QdnzzfTQPCFZC4amwzJrofD5rqfEKwP7RVWGs2Ns9F/g7JqYlnnpMyhV92Xx2u96neYMe5hystmKyak32//rrb5nzyWIzybNf57MvI7wDr9WPOK/IEwWkcfNaZgW3UvUyZjL1XPnXzMQYZnkpYjJMPFfocQ/8rUmdLnL/Axn8Mv100Rif7a2jE6dAHpCTx8/IgX0/Ss9OI3SSeJfxNp059bPcrcLO7gHxfOZAHC0eSzZMlV3f7oviJarXuIY0e/0l2aIiNnvOzGZiahmEyIx5I80YwFiwzPKAjNaJ4BerJxqBaI2TxipAXn29jjR4voNkyHivmSSifw/tP2KEcbg8IPY+HjC8kzxW/BGBV8Uyf+MRx/h6bm8CBO3/84+/VCS3kYcezhE58fXmAfH1rK+1qWsWAKo//aoR3FiJ7z24rXylHqPFC9bEZMhGWTywf19x0U8WjDbfT3gUYYVUjI6b2l9GDJokp0+ejTKJz5bzAflEFy3eGzFd4P0L5AHBeE2WLKl5JgivKZ8ONW3Jki1TWARIxapPSe9BbaVd836CxQ8YPIJ4J3yz9TvTdnhPN6s3DvZq6zry4suVzTiAdy1Jkjt0fH4o21Q0l3+2hPTpOkqWL94QydrbuIlRRyTQkylAEmjH8rFIgARIIFQC703pZ1YqX6zUKtolELrUrNVLJqzmzOmfzedtNFSmrq4WV9WVwGHvvWlCZq5cuioZ709nJodLv5oWJQRr7qdL5YPRn5hz//zrL7NK7hmatXLpRhOKgwnfHUlul1av9JQ099ytYT89jTDAxMczBOvC+ctSrWzTyMnoJ7oiX6teFUEoFyYYaFeTl7rIhp2fmZVbhE54mrcQrLrqRTl25FSoOCMY/RfaZU1irAkb2pBeWftiWr1cM1mw6kOf7XUSgjXzo4VSU1drsVL7TKWSxouE8JKnyhX1GYKFZ66uIWoQSt44WhNPPJs3ATJ97ggVOefMqvzQsd3VU/H/kJpAAmTep8sEYxBhZNYkukTpx8x1enYaLtev/2EmiVi9RvsG9X5fPXH3m/+OaQiWvZN9CRBf4xHn+npubwIEYUfFSxU2k+AVS77yK0B8PWu/oR3kobw5zGJBuM1aGPD8vkI0rd/xqSxbtEH7KMI7hFDGlVtmCI7dtP7b/0/iN3wrz9epKM01RKzrG4ONAA4kQGbpeK1Vr7IKhP5yVkP3PvvyPQ0rm2/EXTg8IPiu4T1W85nmGrJ2Pgo2e/iYJ09rbMEziLHRqHZn6d6npVy6dEU6tHg78nAKEGcjkQLEGSceRQIkQAKJhsC7H/ZW8ZBealV+PdozN9Uf76b64x1FgPw3ubYLkN5dRspHn48QTCYQ9+8rBwRCY1DvcUaArFq2UWPFF5t7YjXy+NHT0UQGJgxdNLQLYVgQICnuSi4Deo415yCW3h6Og/a8P22AmcTclTKFESCNddKwdvssWbpwnbmvp1lCAROKa9eum4/37/3ReH5iYp4CBPkz709724igDBnT+WQKQTV3+Qc+2+tEgHRqNUD6DukgwwZMkCo1ysmJY6cladI7TdiP3QPi+czNdXUdk3pvHP0JkAfzZJeps4fJ0P4TNOxri8xePE6WKO9hb08wCAMJkPmfLY/MY7EEiDUxtAsQhMmUKV/MhAdu0LCvas8/7YoAsecd2cejv+f2JkDwnUA+A/KcEK6EUDtfOSC+nhUCBNdGP77UoKoJbYMtW7Re+nYfHZMhG+kBsV8E31es+EOALF24PlKA2MWKJUDs58ETCe+IkxwQhHI+UjiPWeBA/kiFyqWMAOnR7/WwCJBGzV80oZY11MsJb5PdrHGGsMHvdhwwH9V8qaIJa7MEyDvvdpPcebLJKy90NN+PBs1qSg0VMxfOXTLHU4A4G3YUIM448SgSIAESSDQEEN9cSROVK+mq6u+62oxQHYR1YFLzt4aNIASrR/uhsnZlRFI6BEtunXRiFRYhWFay9+sdGhgPBEIW7AIECZkIt4JdvHhZBcL5yDAtz1APiIy7UibXZOPx0rzty5IpkwqjKq+bdnmGw1gdZJ/sFyik8ejj3jThIshfwcR51sIxcvHCZWnVqKc5pUjR/FJPJ3/jNETECsEK50o67uEpQKy4dnsIli+mM79412d74aVACE65x182OSvFSz0qw/V5kfOBsB14ChAKhwlU1uz3m8nq6417SW3tl0f1ue0CxPOZA3G0eHt6QJA8jvwJuyHfBN4ctCmQAMEY+EK9PnM+WaKJ5xHFCaxJY8MXOhiPkRWnj/yDmdqfGGP4J5z95ssD4ms8+ntuhCV6JqFboYjIt3rw4eym/f4EiLdntcKDMJnGGEd+0YefDBZ8x8IlQDy/r0ieRwgWBD/6A2YJanseBSbx8ITiffLukKkya/pCkycxcERnaa85RFs37jTFBlZv+8SE2+F4LETA23PkhxPmO3PxwhWTtH/1l99M4YtweEDgBew7pH2UPBmImyuXf9GQ0b1+c0DwbkN4IEJM7Wbl8lCAOP+ZpABxzopHkgAJkECiIPCgxqNP+XSICdNB4jImr5jYItfi0IFjGs89Sm6//XaThJ4l2/0mXGLqB3NMlSu7KMCq6MwF7+qE8Z4oAsRXDgiSXRfOXRXJ+FtNokV+iSVorEmOldRsJaGjgpVlSCp/Xlcs7eE4WLEsVfZxOaj5AhAgWCnGZBHVgpA8jdCOlOohqV21tQmFsio//X49okLVhfOXIivyhDoArMk8YsvTZ0grjV57MTIJPYnG7ftj6q+9qHqF0CR4ChDKU1urEmXN/oDmXLTW0JyckZMphM2gahWqUT1foYUM1mRq8LQLELTN/szlKjzpl6M3AYJwOoSMQeyhqhAMIUJ4fktgBRIgCL3DBBHFDz6aONeITSSho8ISqid5Viqyr/y7IUC8jcfpE+f5fW5w9yVAwMcId2XnT4Dg++j5rMiHmaQi/eC+Iyrql5h8LYxtLBag4EFMzF7BznNhAAnYEBYII9uz64ARnKnTpJS61dvKw/lzRZnEWwsUtTSk804VHJ8tGmuKP8ArAu8VqrLBS7dj+97IhYhJWtRioeYqIacFnlgkscO7Ew4BgqIPszWsC9Wv4KHFeMR3fszQqXJMva7+ktAraP4IhBDYYuEE1qFHU80/uxEpxugBcTbqKECcceJRJEACJJCoCCA/oJkm/T6Q+T5ThneyTiatUpKZNGm645vNpHCRfCYfA6IBZXqRBO7plUCSJsJE7B4QXwLEE7BVhtea8OFzTLZRfQmTmZGaD+KvDK81Gc2k4WQfq2jC5MIqw/vKay9oyE55uVsnbKiuhMkHwrpuVhlef0xRmclXe8EEAhAejXvuTWMm/qgYhgpI9ok6kpKxcguhgkR/bwLEzh+TXasMry+O3gRI8ZLqgXn/TXmn73iT/wHDhG/J+qmatLvLTLCdCBCcg754umIJue322zSvYLuMGDhRfrny/zK8VqWi27Qi27Q5w8x13RQg9vGI5+2v49zXc0+dMMenAMF1Ovd8Tau3VQwoQLw96xMlCkmLN+qZ8tcoGgHO74+cES2/IdgXmD8BgmtBDNWuX9WU4d2v1a5GaZlkiHxPgQhBAoE17cPP5YN3P9HSzI/I61qFDh45iHuIAHhEPe8HTwmqiiF/yBJe4RAgaDsS4zv2eFXL8OaUX7S082LNCcM7DAst/gQIctCwgICCDZZZYal4X+EdQgHibKRRgDjjxKNIgARIgARIgARIgARIgATCQIACJAwQeQkSIAESIAESIAESIAESIAFnBChAnHHiUSRAAiRAAiRAAiRAAiRAAmEgQAESBoi8BAmQAAmQAAmQAAmQAAmQgDMCFCDOOPEoEiABEiABEiABEiABEiCBMBCgAAkDRF6CBEiABEiABEiABEiABEjAGYGgBYhe9oazS/MoEiABEiABEiABEiABEiABEohK4MaN4OTELdJrcXBnkDgJkAAJkAAJkAAJkAAJkAAJ/EfgRt9KQbGgAAkKFw8mARIgARIgARIgARIgARKwE6AA4XggARIgARIgARIgARIgARJwjQAFiGuoeSMSIAESIAESIAESIAESIAEKEI4BEiABEiABEiABEiABEiAB1whQgLiGmjciARIgARIgARIgARIgARKgAOEYIAESIAESIAESIAESIAEScI0ABYhrqHkjEiABEiABEiABEiABEiABChCOARIgARIgARIgARIgARIgAdcIUIC4hpo3IgESIAESIAESIAESIAESoADhGCABEiABEiABEiABEiABEnCNAAWIa6h5IxIgARIgARIgARIgARIgAQoQjgESIAESIAESIAESIAESIAHXCFCAuIaaNyIBEiABEiABEiABEiABEqAA4RggARIgARIgARIgARIgARJwjQAFiGuoeSMSIAESIAESIAESIAESIAEKEI4BEiABEiABEiABEiABEiAB1whQgLiGmjciARIgARIgARIgARIgARKgAOEYIAESIAESIAESIAESIAEScI0ABYhrqHkjEiABEiABEiABEiABEiABChCOARIgARIgARIgARIgARIgAdcIUIC4hpo3IgESIAESIAESIAESIAESSHQCJFvqZPJcngyCfxfKmEoK3ZdSUie9I3IkHL18XfDP2iMX5fLvf8m0nafMv2kkQAIkQAIkQAIkQAIkQAIxJ5AoBAgExnN50ksNFR41Hs4QNLX5+87KVBUiC/afDfpcnkACJEACJEACJEACJEACJPB/AglegLxS6H4ZVenhKF6OUAcAPCON53+n3pELoV6C55EACZAACZAACZAACZBAoiaQYAVIoftSyUgVHmWypQ17B8Mj0n7pPhOqRSMBEiABEiABEiABEiABEnBOIEEKkEaFH5CRz+bx6fW48vvfMl/DqXb+9Iv+c9XQOnrpmmRLk9z8d5lsaTQ3JJX++x65O+ntXmkiL6TslG3mGjQSIAESIAESIAESIAESIAFnBBKcAIH4mFKj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AAlQgHAMkAAJkAAJkAAJkAAJkAAJuEaAAsQ11LwRCZAACZAACZAACZAACZAABQjHAAmQAAmQAAmQAAmQAAmQgGsEKEBcQ80bkQAJkAAJkAAJkAAJkAAJUIBwDJAACZAACZAACZAACZAACbhGgALENdS8EQmQAAmQAAmQAAmQAAmQAAUIxwAJkAAJkAAJkAAJkAAJkIBrBChAXEPNG5EACZAACZAACZAACZAACVCAcAyQAAmQAAmQAAmQAAmQAAm4RoACxDXUvBEJkAAJkAAJkAAJkAAJkAAFCMcACZAACZAACZAACZAACZCAawQoQFxDzRuRAAmQAAmQAAmQAAmQAAlQgHAMkAAJkAAJkAAJkAAJkAAJuEaAAsQ11LwRCZAACZAACZAACZAACZAABQjHAAmQAAmQAAmQAAmQAAmQgGsEKEBcQ80bkQAJkAAJkAAJkAAJkAAJUIBwDJAACZAACZAACZAACZAACbhGgALENdS8EQmQAAmQAAmQAAmQAAmQAAUIxwAJkAAJkAAJkAAJkAAJkIBrBChAXEPNG5EACZAACZAACZAACZAACVCAcAyQAAmQAAmQAAmQAAmQAAm4RoACxDXUvBEJkAAJkAAJkAAJkAAJkAAFCMcACZAACZAACZAACZAACZCAawQoQFxDzRuRAAmQAAmQAAmQAAmQAAlQgHAMkAAJkAAJkAAJkAAJkAAJuEaAAsQ11LwRCZAACZAACZAACZAACZAABQjHAAmQAAmQAAmQAAmQAAmQgGsEKEBcQ80bkQAJkAAJkAAJkAAJkAAJUIBwDJAACZAACZAACZAACZAACbhGgALENdS8EQmQAAmQAAmQAAmQAAmQAAUIxwAJkAAJkAAJkAAJkAAJkIBrBChAXEPNG5EACZAACZAACZAACZAACVCAcAyQAAmQAAmQAAmQAAmQAAm4RoACxDXUvBEJkAAJkAAJkAAJkAAJkAAFCMcACZAACZAACZAACZAACZCAawQoQFxDzRuRAAmQAAmQAAmQAAmQAAlQgHAMkAAJkAAJkAAJkAAJkAAJuEaAAsQ11LwRCZAACZAACZAACZAACZAABQjHAAmQAAmQAAmQAAmQAAmQgGsEKEBcQ80bkQAJkAAJkAAJkAAJkAAJUIBwDJAACZAACZAACZAACZAACbhGgALENdS8EQmQAAmQAAmQAAmQAAmQAAUIxwAJ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kAAFCMcACZAACZAACZAACZAACZBArhGgAMk11OyIBEiABEiABEiABEiABEiAAoRjgARIgARIgARIgARIgARIINcIUIDkGmp2RAIkQAIkQAIkQAIkQAIkQAHCMUACJEACJEACJEACJEACJJBrBChAcg01OyIBEiABEiABEiABEiABEqAA4RggARIgARIgARIgARIgARLINQIUILmGmh2RAAmQAAmQAAmQAAmQAAlQgHAMkAAJkAAJkAAJkAAJkAAJ5BoBCpBcQ82OSIAESIAESIAESIAESIAEKEA4BkiABEiABEiABEiABEiABHKNAAVIrqFmRyRAAiRAAiRAAiRAAiRAAhQgHAMkQAIkQAIkQAIkQAIkQAK5RoACJNdQsyMSIAESIAESIAESIAESIAEKEI4BEiABEiABEiABEiABEiCBXCNAAZJrqNkRCZAACZAACZAACZAACZAABQjHAAmQAAmQAAmQAAmQAAmQQK4RoADJNdTsiARIgARIgARIgARIgARIgAKEY4AESIAESIAESIAESIAESCDXCFCA5BpqdkQCJEACJEACJEACJEACJEABwjFAAiRAAiRAAiRAAiRAAiSQawQoQHINNTsiARIgARIgARIgARIgARKgAOEYIAESIAESIAESIAESIAESyDUCFCC5hpodkQAJkAAJkAAJkEBiEChYIL/cXu8aueHqy+XMU0+U/Pnzyo9bfpNm3YfJb3/+kxg3ybtIWQIUIAlm2u9XPi+HFy6k72rKa8vk7n5PJ9gd8nb8BC4pfaYsmzo48OMOvZ6Ulxa8TVAWBK4qX0ZeHdcrcEajux+VxW+vs7hCYh36wuP3y/VXXqZv6pvvt0rZencl1g0mwd30u6ep3Nmsrr7TCvXvka++/SkJ7jpxbjHVPlOJQzY17qR40SPl1bG9pEypkoc80PnXd5Ctv/6ZGg+axE+xYEI/qXhJKf0EH27cJNWaPpDET3PoraetAKl5VVmZPvK+AJG31nwsN3ccEJFx35w+RC4674zAsTe07i2rP/wionOzOyiZBUiePHmk6uUXSoPaV0qtq8rJmVe3zu5xQ/4e1xjX/87A7zGhx8Q+ERsFSOxWSYTJ0sqXhsn5Z50a8mH27t0nf23/VzZt3iIrP9ioFgiWanERrFGABMdY5LBCcsM1l0u1Ky6Si88/U44tdpQcOCBy3nXtDznBK0DK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" }, "metadata": { "image/png": { "height": 815, "width": 800 } }, "output_type": "display_data" } ], "source": [ "*** Test Cases ***\n", "\n", "Demonstrate failing test\n", " Open url https://plone.org\n", " Page should contain Hello World!" ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Robot Framework", "language": "robotframework", "name": "robotkernel" }, "language_info": { "codemirror_mode": "robotframework", "file_extension": ".robot", "mimetype": "text/x-robotframework", "name": "Robot Framework", "pygments_lexer": "robotframework" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "0bab9b2bb5624def96724e0a8d9da4f9": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "0c030c88050e45f5bb3a56092d922ba0": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "ButtonModel", "state": { "description": "Open url", "layout": "IPY_MODEL_0bab9b2bb5624def96724e0a8d9da4f9", "style": "IPY_MODEL_b36c1289d26f4fbcbed418dafe6c7a3a" } }, "129906d4d9924471aed20ef02d39efde": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "description_width": "" } }, "18fab28f885245c2afeea2664da0c78a": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "layout": "IPY_MODEL_cc3dc065ee0c43ad847dca2e08f99024" } }, "24b87188d4aa495a87f14487927e1f83": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "display": "flex", "flex_flow": "row", "justify_content": "flex-start" } }, "657745f53b3d43478550ab3bce571409": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "description_width": "" } }, "87f92d034f664719999f98f89c796f01": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "9509a16cb4b14edc9d2925cfe7bd0b8e": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "BoxModel", "state": { "children": [ "IPY_MODEL_0c030c88050e45f5bb3a56092d922ba0", "IPY_MODEL_ac686a5a8eba4000aa2c60e2e66faaf0", "IPY_MODEL_9ac009a09d9f46eeaa76dd95869ee56f" ], "layout": "IPY_MODEL_24b87188d4aa495a87f14487927e1f83" } }, "9ac009a09d9f46eeaa76dd95869ee56f": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "TextModel", "state": { "layout": "IPY_MODEL_cbb823fe9472482f8ea6124623219028", "style": "IPY_MODEL_129906d4d9924471aed20ef02d39efde" } }, "ac686a5a8eba4000aa2c60e2e66faaf0": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "LabelModel", "state": { "layout": "IPY_MODEL_87f92d034f664719999f98f89c796f01", "style": "IPY_MODEL_657745f53b3d43478550ab3bce571409", "value": "url=" } }, "b36c1289d26f4fbcbed418dafe6c7a3a": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "ButtonStyleModel", "state": {} }, "cbb823fe9472482f8ea6124623219028": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "cc3dc065ee0c43ad847dca2e08f99024": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 4 }