@valbuild/ui 0.31.0 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/valbuild-ui.cjs.d.ts +7 -9
- package/dist/valbuild-ui.cjs.js +20748 -20174
- package/dist/valbuild-ui.esm.js +20749 -20175
- package/package.json +3 -3
- package/server/.tmp/assets/index-a75a6d05.js +200 -0
- package/server/.tmp/index.html +1 -1
- package/server/dist/valbuild-ui-main.cjs.js +24299 -23724
- package/server/dist/valbuild-ui-main.esm.js +24299 -23724
- package/server/dist/valbuild-ui-server.cjs.js +1 -1
- package/server/dist/valbuild-ui-server.esm.js +1 -1
- package/server/.tmp/assets/index-9616f8c2.js +0 -197
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const files = JSON.parse(
|
|
4
|
-
`{"/assets/index-8e61e324.css":"Kiw6YmVmb3JlLDphZnRlcntib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym9yZGVyLXdpZHRoOjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjojZTVlN2VifTpiZWZvcmUsOmFmdGVyey0tdHctY29udGVudDogIiJ9aHRtbHtsaW5lLWhlaWdodDoxLjU7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OjEwMCU7LW1vei10YWItc2l6ZTo0Oy1vLXRhYi1zaXplOjQ7dGFiLXNpemU6NDtmb250LWZhbWlseTpSb2JvdG8sc2Fucy1zZXJpZjtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOm5vcm1hbH1ib2R5e21hcmdpbjowO2xpbmUtaGVpZ2h0OmluaGVyaXR9aHJ7aGVpZ2h0OjA7Y29sb3I6aW5oZXJpdDtib3JkZXItdG9wLXdpZHRoOjFweH1hYmJyOndoZXJlKFt0aXRsZV0pey13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWR9aDEsaDIsaDMsaDQsaDUsaDZ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6aW5oZXJpdH1he2NvbG9yOmluaGVyaXQ7dGV4dC1kZWNvcmF0aW9uOmluaGVyaXR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6Ym9sZGVyfWNvZGUsa2JkLHNhbXAscHJle2ZvbnQtZmFtaWx5OnVpLW1vbm9zcGFjZSxTRk1vbm8tUmVndWxhcixNZW5sbyxNb25hY28sQ29uc29sYXMsTGliZXJhdGlvbiBNb25vLENvdXJpZXIgTmV3LG1vbm9zcGFjZTtmb250LXNpemU6MWVtfXNtYWxse2ZvbnQtc2l6ZTo4MCV9c3ViLHN1cHtmb250LXNpemU6NzUlO2xpbmUtaGVpZ2h0OjA7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9c3Vie2JvdHRvbTotLjI1ZW19c3Vwe3RvcDotLjVlbX10YWJsZXt0ZXh0LWluZGVudDowO2JvcmRlci1jb2xvcjppbmhlcml0O2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX1idXR0b24saW5wdXQsb3B0Z3JvdXAsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOjEwMCU7Zm9udC13ZWlnaHQ6aW5oZXJpdDtsaW5lLWhlaWdodDppbmhlcml0O2NvbG9yOmluaGVyaXQ7bWFyZ2luOjA7cGFkZGluZzowfWJ1dHRvbixzZWxlY3R7dGV4dC10cmFuc2Zvcm06bm9uZX1idXR0b24sW3R5cGU9YnV0dG9uXSxbdHlwZT1yZXNldF0sW3R5cGU9c3VibWl0XXstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7YmFja2dyb3VuZC1pbWFnZTpub25lfTotbW96LWZvY3VzcmluZ3tvdXRsaW5lOmF1dG99Oi1tb3otdWktaW52YWxpZHtib3gtc2hhZG93Om5vbmV9cHJvZ3Jlc3N7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9Ojotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLDo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbntoZWlnaHQ6YXV0b31bdHlwZT1zZWFyY2hdey13ZWJraXQtYXBwZWFyYW5jZTp0ZXh0ZmllbGQ7b3V0bGluZS1vZmZzZXQ6LTJweH06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Ojotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO2ZvbnQ6aW5oZXJpdH1zdW1tYXJ5e2Rpc3BsYXk6bGlzdC1pdGVtfWJsb2NrcXVvdGUsZGwsZGQsaDEsaDIsaDMsaDQsaDUsaDYsaHIsZmlndXJlLHAscHJle21hcmdpbjowfWZpZWxkc2V0e21hcmdpbjowO3BhZGRpbmc6MH1sZWdlbmR7cGFkZGluZzowfW9sLHVsLG1lbnV7bGlzdC1zdHlsZTpub25lO21hcmdpbjowO3BhZGRpbmc6MH10ZXh0YXJlYXtyZXNpemU6dmVydGljYWx9aW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXIsdGV4dGFyZWE6Oi1tb3otcGxhY2Vob2xkZXJ7b3BhY2l0eToxO2NvbG9yOiM5Y2EzYWZ9aW5wdXQ6OnBsYWNlaG9sZGVyLHRleHRhcmVhOjpwbGFjZWhvbGRlcntvcGFjaXR5OjE7Y29sb3I6IzljYTNhZn1idXR0b24sW3JvbGU9YnV0dG9uXXtjdXJzb3I6cG9pbnRlcn06ZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHR9aW1nLHN2Zyx2aWRlbyxjYW52YXMsYXVkaW8saWZyYW1lLGVtYmVkLG9iamVjdHtkaXNwbGF5OmJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX1pbWcsdmlkZW97bWF4LXdpZHRoOjEwMCU7aGVpZ2h0OmF1dG99W2hpZGRlbl17ZGlzcGxheTpub25lfTpob3N0ey0tYmFja2dyb3VuZDogMCAwJSAxMDAlOy0tZm9yZWdyb3VuZDogMjIyLjIgODQlIDQuOSU7LS1jYXJkOiAwIDAlIDEwMCU7LS1jYXJkLWZvcmVncm91bmQ6IDIyMi4yIDg0JSA0LjklOy0tcG9wb3ZlcjogMCAwJSAxMDAlOy0tcG9wb3Zlci1mb3JlZ3JvdW5kOiAyMjIuMiA4NCUgNC45JTstLXByaW1hcnk6IDIyMi4yIDQ3LjQlIDExLjIlOy0tcHJpbWFyeS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLXNlY29uZGFyeTogMjEwIDQwJSA5Ni4xJTstLXNlY29uZGFyeS1mb3JlZ3JvdW5kOiAyMjIuMiA0Ny40JSAxMS4yJTstLW11dGVkOiAwIDAlIDU3LjMlOy0tbXV0ZWQtZm9yZWdyb3VuZDogMjE1LjQgMTYuMyUgNDYuOSU7LS1hY2NlbnQ6IDE1OSwgNjAlLCA1MSUsIDE7LS1hY2NlbnQtZm9yZWdyb3VuZDogMjIyLjIgNDcuNCUgMTEuMiU7LS1kZXN0cnVjdGl2ZTogMCA4NC4yJSA2MC4yJTstLWRlc3RydWN0aXZlLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tYm9yZGVyOiAyMTQuMyAzMS44JSA5MS40JTstLWlucHV0OiAyMTQuMyAzMS44JSA5MS40JTstLXJpbmc6IDIyMi4yIDg0JSA0LjklOy0tcmFkaXVzOiAuNXJlbX06cm9vdHstLWJhY2tncm91bmQ6IDAgMCUgMTAwJTstLWZvcmVncm91bmQ6IDIyMi4yIDg0JSA0LjklOy0tY2FyZDogMCAwJSAxMDAlOy0tY2FyZC1mb3JlZ3JvdW5kOiAyMjIuMiA4NCUgNC45JTstLXBvcG92ZXI6IDAgMCUgMTAwJTstLXBvcG92ZXItZm9yZWdyb3VuZDogMjIyLjIgODQlIDQuOSU7LS1wcmltYXJ5OiAyMjIuMiA0Ny40JSAxMS4yJTstLXByaW1hcnktZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1zZWNvbmRhcnk6IDIxMCA0MCUgOTYuMSU7LS1zZWNvbmRhcnktZm9yZWdyb3VuZDogMjIyLjIgNDcuNCUgMTEuMiU7LS1tdXRlZDogMCAwJSA1Ny4zJTstLW11dGVkLWZvcmVncm91bmQ6IDIxNS40IDE2LjMlIDQ2LjklOy0tYWNjZW50OiAxNTksIDYwJSwgNTElLCAxOy0tYWNjZW50LWZvcmVncm91bmQ6IDIyMi4yIDQ3LjQlIDExLjIlOy0tZGVzdHJ1Y3RpdmU6IDAgODQuMiUgNjAuMiU7LS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLWJvcmRlcjogMjE0LjMgMzEuOCUgOTEuNCU7LS1pbnB1dDogMjE0LjMgMzEuOCUgOTEuNCU7LS1yaW5nOiAyMjIuMiA4NCUgNC45JTstLXJhZGl1czogLjVyZW19KltkYXRhLW1vZGU9ZGFya117LS1iYWNrZ3JvdW5kOiAwIDAlIDQlOy0tZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1jYXJkOiAyMjIuMiA4NCUgNC45JTstLWNhcmQtZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1wb3BvdmVyOiAyMjIuMiA4NCUgNC45JTstLXBvcG92ZXItZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1wcmltYXJ5OiAyMTAgNDAlIDk4JTstLXByaW1hcnktZm9yZWdyb3VuZDogMjIyLjIgNDcuNCUgMTEuMiU7LS1zZWNvbmRhcnk6IDIxNy4yIDMyLjYlIDE3LjUlOy0tc2Vjb25kYXJ5LWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tbXV0ZWQ6IDE3OCwgMjMlLCA3NiUsIDE7LS1tdXRlZC1mb3JlZ3JvdW5kOiAyMTUgMjAuMiUgNjUuMSU7LS1hY2NlbnQ6IDE1OSwgNjAlLCA1MSUsIDE7LS1hY2NlbnQtZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1kZXN0cnVjdGl2ZTogMCA2Mi44JSAzMC42JTstLWRlc3RydWN0aXZlLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tYm9yZGVyOiAyMTcuMiAzMi42JSAxNy41JTstLWlucHV0OiAyMTcuMiAzMi42JSAxNy41JTstLXJpbmc6IDIxMi43IDI2LjglIDgzLjklfSp7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1ib3JkZXIpKX1ib2R5e2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKTtjb2xvcjpoc2wodmFyKC0tZm9yZWdyb3VuZCkpfSosOmJlZm9yZSw6YWZ0ZXJ7LS10dy1ib3JkZXItc3BhY2luZy14OiAwOy0tdHctYm9yZGVyLXNwYWNpbmcteTogMDstLXR3LXRyYW5zbGF0ZS14OiAwOy0tdHctdHJhbnNsYXRlLXk6IDA7LS10dy1yb3RhdGU6IDA7LS10dy1za2V3LXg6IDA7LS10dy1za2V3LXk6IDA7LS10dy1zY2FsZS14OiAxOy0tdHctc2NhbGUteTogMTstLXR3LXBhbi14OiA7LS10dy1wYW4teTogOy0tdHctcGluY2gtem9vbTogOy0tdHctc2Nyb2xsLXNuYXAtc3RyaWN0bmVzczogcHJveGltaXR5Oy0tdHctZ3JhZGllbnQtZnJvbS1wb3NpdGlvbjogOy0tdHctZ3JhZGllbnQtdmlhLXBvc2l0aW9uOiA7LS10dy1ncmFkaWVudC10by1wb3NpdGlvbjogOy0tdHctb3JkaW5hbDogOy0tdHctc2xhc2hlZC16ZXJvOiA7LS10dy1udW1lcmljLWZpZ3VyZTogOy0tdHctbnVtZXJpYy1zcGFjaW5nOiA7LS10dy1udW1lcmljLWZyYWN0aW9uOiA7LS10dy1yaW5nLWluc2V0OiA7LS10dy1yaW5nLW9mZnNldC13aWR0aDogMHB4Oy0tdHctcmluZy1vZmZzZXQtY29sb3I6ICNmZmY7LS10dy1yaW5nLWNvbG9yOiByZ2IoNTkgMTMwIDI0NiAvIC41KTstLXR3LXJpbmctb2Zmc2V0LXNoYWRvdzogMCAwICMwMDAwOy0tdHctcmluZy1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXNoYWRvdzogMCAwICMwMDAwOy0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMCAjMDAwMDstLXR3LWJsdXI6IDstLXR3LWJyaWdodG5lc3M6IDstLXR3LWNvbnRyYXN0OiA7LS10dy1ncmF5c2NhbGU6IDstLXR3LWh1ZS1yb3RhdGU6IDstLXR3LWludmVydDogOy0tdHctc2F0dXJhdGU6IDstLXR3LXNlcGlhOiA7LS10dy1kcm9wLXNoYWRvdzogOy0tdHctYmFja2Ryb3AtYmx1cjogOy0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzczogOy0tdHctYmFja2Ryb3AtY29udHJhc3Q6IDstLXR3LWJhY2tkcm9wLWdyYXlzY2FsZTogOy0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZTogOy0tdHctYmFja2Ryb3AtaW52ZXJ0OiA7LS10dy1iYWNrZHJvcC1vcGFjaXR5OiA7LS10dy1iYWNrZHJvcC1zYXR1cmF0ZTogOy0tdHctYmFja2Ryb3Atc2VwaWE6IH06OmJhY2tkcm9wey0tdHctYm9yZGVyLXNwYWNpbmcteDogMDstLXR3LWJvcmRlci1zcGFjaW5nLXk6IDA7LS10dy10cmFuc2xhdGUteDogMDstLXR3LXRyYW5zbGF0ZS15OiAwOy0tdHctcm90YXRlOiAwOy0tdHctc2tldy14OiAwOy0tdHctc2tldy15OiAwOy0tdHctc2NhbGUteDogMTstLXR3LXNjYWxlLXk6IDE7LS10dy1wYW4teDogOy0tdHctcGFuLXk6IDstLXR3LXBpbmNoLXpvb206IDstLXR3LXNjcm9sbC1zbmFwLXN0cmljdG5lc3M6IHByb3hpbWl0eTstLXR3LWdyYWRpZW50LWZyb20tcG9zaXRpb246IDstLXR3LWdyYWRpZW50LXZpYS1wb3NpdGlvbjogOy0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb246IDstLXR3LW9yZGluYWw6IDstLXR3LXNsYXNoZWQtemVybzogOy0tdHctbnVtZXJpYy1maWd1cmU6IDstLXR3LW51bWVyaWMtc3BhY2luZzogOy0tdHctbnVtZXJpYy1mcmFjdGlvbjogOy0tdHctcmluZy1pbnNldDogOy0tdHctcmluZy1vZmZzZXQtd2lkdGg6IDBweDstLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiAjZmZmOy0tdHctcmluZy1jb2xvcjogcmdiKDU5IDEzMCAyNDYgLyAuNSk7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXJpbmctc2hhZG93OiAwIDAgIzAwMDA7LS10dy1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7LS10dy1ibHVyOiA7LS10dy1icmlnaHRuZXNzOiA7LS10dy1jb250cmFzdDogOy0tdHctZ3JheXNjYWxlOiA7LS10dy1odWUtcm90YXRlOiA7LS10dy1pbnZlcnQ6IDstLXR3LXNhdHVyYXRlOiA7LS10dy1zZXBpYTogOy0tdHctZHJvcC1zaGFkb3c6IDstLXR3LWJhY2tkcm9wLWJsdXI6IDstLXR3LWJhY2tkcm9wLWJyaWdodG5lc3M6IDstLXR3LWJhY2tkcm9wLWNvbnRyYXN0OiA7LS10dy1iYWNrZHJvcC1ncmF5c2NhbGU6IDstLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGU6IDstLXR3LWJhY2tkcm9wLWludmVydDogOy0tdHctYmFja2Ryb3Atb3BhY2l0eTogOy0tdHctYmFja2Ryb3Atc2F0dXJhdGU6IDstLXR3LWJhY2tkcm9wLXNlcGlhOiB9LnNyLW9ubHl7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O2hlaWdodDoxcHg7cGFkZGluZzowO21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtjbGlwOnJlY3QoMCwwLDAsMCk7d2hpdGUtc3BhY2U6bm93cmFwO2JvcmRlci13aWR0aDowfS5wb2ludGVyLWV2ZW50cy1ub25le3BvaW50ZXItZXZlbnRzOm5vbmV9LmludmlzaWJsZXt2aXNpYmlsaXR5OmhpZGRlbn0uc3RhdGlje3Bvc2l0aW9uOnN0YXRpY30uZml4ZWR7cG9zaXRpb246Zml4ZWR9LmFic29sdXRle3Bvc2l0aW9uOmFic29sdXRlfS5yZWxhdGl2ZXtwb3NpdGlvbjpyZWxhdGl2ZX0uc3RpY2t5e3Bvc2l0aW9uOnN0aWNreX0uaW5zZXQtMHt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MH0uaW5zZXQteS0we3RvcDowO2JvdHRvbTowfS4tbGVmdC0ye2xlZnQ6LS41cmVtfS4tcmlnaHQtXFsxMHB4XF17cmlnaHQ6LTEwcHh9Li10b3AtXFsxMHB4XF17dG9wOi0xMHB4fS4tdG9wLVxbNHB4XF17dG9wOi00cHh9LmJvdHRvbS0we2JvdHRvbTowfS5ib3R0b20tNHtib3R0b206MXJlbX0ubGVmdC0we2xlZnQ6MH0ubGVmdC0xe2xlZnQ6LjI1cmVtfS5sZWZ0LTFcLzJ7bGVmdDo1MCV9LmxlZnQtMntsZWZ0Oi41cmVtfS5sZWZ0LVxbNTBcJVxde2xlZnQ6NTAlfS5yaWdodC0we3JpZ2h0OjB9LnJpZ2h0LTF7cmlnaHQ6LjI1cmVtfS5yaWdodC00e3JpZ2h0OjFyZW19LnJpZ2h0LVxbMTZweFxde3JpZ2h0OjE2cHh9LnRvcC0we3RvcDowfS50b3AtNHt0b3A6MXJlbX0udG9wLVxbNTBcJVxde3RvcDo1MCV9LnotNTB7ei1pbmRleDo1MH0uei1cWzVcXXt6LWluZGV4OjV9Lnotb3ZlcmxheXt6LWluZGV4OjR9Li1teC0xe21hcmdpbi1sZWZ0Oi0uMjVyZW07bWFyZ2luLXJpZ2h0Oi0uMjVyZW19Li1teS0ye21hcmdpbi10b3A6LS41cmVtO21hcmdpbi1ib3R0b206LS41cmVtfS4tbXktXFsxMDBweFxde21hcmdpbi10b3A6LTEwMHB4O21hcmdpbi1ib3R0b206LTEwMHB4fS5teC0ye21hcmdpbi1sZWZ0Oi41cmVtO21hcmdpbi1yaWdodDouNXJlbX0ubXktMXttYXJnaW4tdG9wOi4yNXJlbTttYXJnaW4tYm90dG9tOi4yNXJlbX0ubWItNHttYXJnaW4tYm90dG9tOjFyZW19Lm1sLTJ7bWFyZ2luLWxlZnQ6LjVyZW19Lm1sLTR7bWFyZ2luLWxlZnQ6MXJlbX0ubWwtXFsyMHB4XF17bWFyZ2luLWxlZnQ6MjBweH0ubWwtYXV0b3ttYXJnaW4tbGVmdDphdXRvfS5tci0ye21hcmdpbi1yaWdodDouNXJlbX0ubXQtMnttYXJnaW4tdG9wOi41cmVtfS5ibG9ja3tkaXNwbGF5OmJsb2NrfS5pbmxpbmV7ZGlzcGxheTppbmxpbmV9LmZsZXh7ZGlzcGxheTpmbGV4fS5pbmxpbmUtZmxleHtkaXNwbGF5OmlubGluZS1mbGV4fS50YWJsZXtkaXNwbGF5OnRhYmxlfS5ncmlke2Rpc3BsYXk6Z3JpZH0uaGlkZGVue2Rpc3BsYXk6bm9uZX0uYXNwZWN0LXNxdWFyZXthc3BlY3QtcmF0aW86MSAvIDF9LmgtMTB7aGVpZ2h0OjIuNXJlbX0uaC0xMXtoZWlnaHQ6Mi43NXJlbX0uaC0ye2hlaWdodDouNXJlbX0uaC0yXC41e2hlaWdodDouNjI1cmVtfS5oLTN7aGVpZ2h0Oi43NXJlbX0uaC0zXC41e2hlaWdodDouODc1cmVtfS5oLTR7aGVpZ2h0OjFyZW19LmgtN3toZWlnaHQ6MS43NXJlbX0uaC05e2hlaWdodDoyLjI1cmVtfS5oLVxbMTRweFxde2hlaWdodDoxNHB4fS5oLVxbMThweFxde2hlaWdodDoxOHB4fS5oLVxbMXB4XF17aGVpZ2h0OjFweH0uaC1cWzIwcHhcXXtoZWlnaHQ6MjBweH0uaC1cWzIycHhcXXtoZWlnaHQ6MjJweH0uaC1cWzI0cHhcXXtoZWlnaHQ6MjRweH0uaC1cWzMycHhcXXtoZWlnaHQ6MzJweH0uaC1cWzUwcHhcXXtoZWlnaHQ6NTBweH0uaC1cWzc1cHhcXXtoZWlnaHQ6NzVweH0uaC1cWzlweFxde2hlaWdodDo5cHh9LmgtXFt2YXJcKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItaGVpZ2h0XClcXXtoZWlnaHQ6dmFyKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItaGVpZ2h0KX0uaC1mdWxse2hlaWdodDoxMDAlfS5oLXB4e2hlaWdodDoxcHh9Lmgtc2NyZWVue2hlaWdodDoxMDB2aH0ubWF4LWgtXFszMDBweFxde21heC1oZWlnaHQ6MzAwcHh9Lm1pbi1oLVxbMjAwcHhcXXttaW4taGVpZ2h0OjIwMHB4fS5taW4taC1cWzMwMHB4XF17bWluLWhlaWdodDozMDBweH0ubWluLWgtc2NyZWVue21pbi1oZWlnaHQ6MTAwdmh9LnctMVwvM3t3aWR0aDozMy4zMzMzMzMlfS53LTEwe3dpZHRoOjIuNXJlbX0udy0ye3dpZHRoOi41cmVtfS53LTJcLjV7d2lkdGg6LjYyNXJlbX0udy0ze3dpZHRoOi43NXJlbX0udy0zXC41e3dpZHRoOi44NzVyZW19LnctNHt3aWR0aDoxcmVtfS53LTV7d2lkdGg6MS4yNXJlbX0udy03e3dpZHRoOjEuNzVyZW19LnctNzJ7d2lkdGg6MThyZW19LnctOXt3aWR0aDoyLjI1cmVtfS53LVxbMTRweFxde3dpZHRoOjE0cHh9LnctXFsxcHhcXXt3aWR0aDoxcHh9LnctXFsyMHB4XF17d2lkdGg6MjBweH0udy1cWzI0cHhcXXt3aWR0aDoyNHB4fS53LVxbMzJweFxde3dpZHRoOjMycHh9LnctXFs0NHB4XF17d2lkdGg6NDRweH0udy1cWzlweFxde3dpZHRoOjlweH0udy1maXR7d2lkdGg6LW1vei1maXQtY29udGVudDt3aWR0aDpmaXQtY29udGVudH0udy1mdWxse3dpZHRoOjEwMCV9Lnctc2NyZWVue3dpZHRoOjEwMHZ3fS5taW4tdy0we21pbi13aWR0aDowcHh9Lm1pbi13LVxbMzIwcHhcXXttaW4td2lkdGg6MzIwcHh9Lm1pbi13LVxbNTAwcHhcXXttaW4td2lkdGg6NTAwcHh9Lm1pbi13LVxbOHJlbVxde21pbi13aWR0aDo4cmVtfS5taW4tdy1cW3ZhclwoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci13aWR0aFwpXF17bWluLXdpZHRoOnZhcigtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLXdpZHRoKX0ubWF4LXctNHhse21heC13aWR0aDo1NnJlbX0ubWF4LXctXFsxMDAwcHhcXXttYXgtd2lkdGg6MTAwMHB4fS5tYXgtdy1cWzEwdndcXXttYXgtd2lkdGg6MTB2d30ubWF4LXctXFszMDBweFxde21heC13aWR0aDozMDBweH0ubWF4LXctXFs5MHZ3XF17bWF4LXdpZHRoOjkwdnd9Lm1heC13LWxne21heC13aWR0aDozMnJlbX0uZmxleC0xe2ZsZXg6MSAxIDAlfS5mbGV4LWF1dG97ZmxleDoxIDEgYXV0b30uZmxleC1zaHJpbmstMCwuc2hyaW5rLTB7ZmxleC1zaHJpbms6MH0uZmxleC1ncm93e2ZsZXgtZ3JvdzoxfS5ib3JkZXItY29sbGFwc2V7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlfS4tdHJhbnNsYXRlLXgtMVwvMiwudHJhbnNsYXRlLXgtXFstNTBcJVxdey0tdHctdHJhbnNsYXRlLXg6IC01MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LnRyYW5zbGF0ZS15LVxbLTUwXCVcXXstLXR3LXRyYW5zbGF0ZS15OiAtNTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS4tcm90YXRlLTkwey0tdHctcm90YXRlOiAtOTBkZWc7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LnJvdGF0ZS05MHstLXR3LXJvdGF0ZTogOTBkZWc7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LnJvdGF0ZS1cWy05MGRlZ1xdey0tdHctcm90YXRlOiAtOTBkZWc7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LnJvdGF0ZS1cWzkwZGVnXF17LS10dy1yb3RhdGU6IDkwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS50cmFuc2Zvcm17dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmN1cnNvci1jb2wtcmVzaXple2N1cnNvcjpjb2wtcmVzaXplfS5jdXJzb3ItZGVmYXVsdHtjdXJzb3I6ZGVmYXVsdH0uY3Vyc29yLWdyYWJ7Y3Vyc29yOmdyYWJ9LmN1cnNvci1wb2ludGVye2N1cnNvcjpwb2ludGVyfS5jdXJzb3Itc2UtcmVzaXple2N1cnNvcjpzZS1yZXNpemV9LnRvdWNoLW5vbmV7dG91Y2gtYWN0aW9uOm5vbmV9LnNlbGVjdC1ub25ley13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0ucmVzaXplLW5vbmV7cmVzaXplOm5vbmV9LnJlc2l6ZXtyZXNpemU6Ym90aH0ubGlzdC1kZWNpbWFse2xpc3Qtc3R5bGUtdHlwZTpkZWNpbWFsfS5saXN0LWRpc2N7bGlzdC1zdHlsZS10eXBlOmRpc2N9LmdyaWQtY29scy1cW21pbi1jb250ZW50XzFmclxde2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW4tY29udGVudCAxZnJ9LmdyaWQtcm93cy1cWzFmclwsX21pbi1jb250ZW50XF17Z3JpZC10ZW1wbGF0ZS1yb3dzOjFmciBtaW4tY29udGVudH0uZmxleC1yb3d7ZmxleC1kaXJlY3Rpb246cm93fS5mbGV4LWNvbHtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmZsZXgtY29sLXJldmVyc2V7ZmxleC1kaXJlY3Rpb246Y29sdW1uLXJldmVyc2V9Lml0ZW1zLXN0YXJ0e2FsaWduLWl0ZW1zOmZsZXgtc3RhcnR9Lml0ZW1zLWVuZHthbGlnbi1pdGVtczpmbGV4LWVuZH0uaXRlbXMtY2VudGVye2FsaWduLWl0ZW1zOmNlbnRlcn0uanVzdGlmeS1zdGFydHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uanVzdGlmeS1lbmR7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5qdXN0aWZ5LWNlbnRlcntqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5qdXN0aWZ5LWJldHdlZW57anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59LmdhcC0xe2dhcDouMjVyZW19LmdhcC0ye2dhcDouNXJlbX0uZ2FwLTN7Z2FwOi43NXJlbX0uZ2FwLTR7Z2FwOjFyZW19LmdhcC01e2dhcDoxLjI1cmVtfS5nYXAtXFswXC41ZW1cXXtnYXA6LjVlbX0uZ2FwLVxbMzZweFxde2dhcDozNnB4fS5nYXAteC0yey1tb3otY29sdW1uLWdhcDouNXJlbTtjb2x1bW4tZ2FwOi41cmVtfS5nYXAteC0zey1tb3otY29sdW1uLWdhcDouNzVyZW07Y29sdW1uLWdhcDouNzVyZW19LmdhcC14LTR7LW1vei1jb2x1bW4tZ2FwOjFyZW07Y29sdW1uLWdhcDoxcmVtfS5nYXAteS0ye3Jvdy1nYXA6LjVyZW19LmdhcC15LTR7cm93LWdhcDoxcmVtfS5nYXAteS02e3Jvdy1nYXA6MS41cmVtfS5nYXAteS04e3Jvdy1nYXA6MnJlbX0uc3BhY2UteC0xPjpub3QoW2hpZGRlbl0pfjpub3QoW2hpZGRlbl0pey0tdHctc3BhY2UteC1yZXZlcnNlOiAwO21hcmdpbi1yaWdodDpjYWxjKC4yNXJlbSAqIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpO21hcmdpbi1sZWZ0OmNhbGMoLjI1cmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteC1yZXZlcnNlKSkpfS5zcGFjZS15LTE+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS15LXJldmVyc2U6IDA7bWFyZ2luLXRvcDpjYWxjKC4yNXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpKTttYXJnaW4tYm90dG9tOmNhbGMoLjI1cmVtICogdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSl9LnNwYWNlLXktMVwuNT46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoLjM3NXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpKTttYXJnaW4tYm90dG9tOmNhbGMoLjM3NXJlbSAqIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpfS5zcGFjZS15LTI+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS15LXJldmVyc2U6IDA7bWFyZ2luLXRvcDpjYWxjKC41cmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSkpO21hcmdpbi1ib3R0b206Y2FsYyguNXJlbSAqIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpfS5zcGFjZS15LTQ+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS15LXJldmVyc2U6IDA7bWFyZ2luLXRvcDpjYWxjKDFyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKSk7bWFyZ2luLWJvdHRvbTpjYWxjKDFyZW0gKiB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKX0ub3ZlcmZsb3ctYXV0b3tvdmVyZmxvdzphdXRvfS5vdmVyZmxvdy1oaWRkZW57b3ZlcmZsb3c6aGlkZGVufS5vdmVyZmxvdy1jbGlwe292ZXJmbG93OmNsaXB9Lm92ZXJmbG93LXNjcm9sbHtvdmVyZmxvdzpzY3JvbGx9Lm92ZXJmbG93LXktYXV0b3tvdmVyZmxvdy15OmF1dG99Lm92ZXJmbG93LXgtaGlkZGVue292ZXJmbG93LXg6aGlkZGVufS5vdmVyZmxvdy15LXNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbH0udHJ1bmNhdGV7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwfS53aGl0ZXNwYWNlLW5vd3JhcHt3aGl0ZS1zcGFjZTpub3dyYXB9LnJvdW5kZWR7Ym9yZGVyLXJhZGl1czouMjVyZW19LnJvdW5kZWQtXFtpbmhlcml0XF17Ym9yZGVyLXJhZGl1czppbmhlcml0fS5yb3VuZGVkLWZ1bGx7Ym9yZGVyLXJhZGl1czo5OTk5cHh9LnJvdW5kZWQtbGd7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpfS5yb3VuZGVkLW1ke2JvcmRlci1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gMnB4KX0ucm91bmRlZC1zbXtib3JkZXItcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDRweCl9LmJvcmRlcntib3JkZXItd2lkdGg6MXB4fS5ib3JkZXItMiwuYm9yZGVyLVxbMnB4XF17Ym9yZGVyLXdpZHRoOjJweH0uYm9yZGVyLXl7Ym9yZGVyLXRvcC13aWR0aDoxcHg7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHh9LmJvcmRlci1ie2JvcmRlci1ib3R0b20td2lkdGg6MXB4fS5ib3JkZXItbHtib3JkZXItbGVmdC13aWR0aDoxcHh9LmJvcmRlci1sLTJ7Ym9yZGVyLWxlZnQtd2lkdGg6MnB4fS5ib3JkZXItcntib3JkZXItcmlnaHQtd2lkdGg6MXB4fS5ib3JkZXItdHtib3JkZXItdG9wLXdpZHRoOjFweH0uYm9yZGVyLWFjY2VudHtib3JkZXItY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5ib3JkZXItYm9yZGVye2JvcmRlci1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9LmJvcmRlci1jYXJke2JvcmRlci1jb2xvcjpoc2wodmFyKC0tY2FyZCkpfS5ib3JkZXItZ3JheS00MDB7LS10dy1ib3JkZXItb3BhY2l0eTogMTtib3JkZXItY29sb3I6cmdiKDE1NiAxNjMgMTc1IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKX0uYm9yZGVyLWlucHV0e2JvcmRlci1jb2xvcjpoc2wodmFyKC0taW5wdXQpKX0uYm9yZGVyLXByaW1hcnl7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1wcmltYXJ5KSl9LmJvcmRlci10cmFuc3BhcmVudHtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9LmJvcmRlci1sLXRyYW5zcGFyZW50e2JvcmRlci1sZWZ0LWNvbG9yOnRyYW5zcGFyZW50fS5ib3JkZXItdC10cmFuc3BhcmVudHtib3JkZXItdG9wLWNvbG9yOnRyYW5zcGFyZW50fS5iZy1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmJnLWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYmFja2dyb3VuZCkpfS5iZy1iYWNrZ3JvdW5kXC84MHtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSAvIC44KX0uYmctYm9yZGVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJvcmRlcikpfS5iZy1jYXJke2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWNhcmQpKX0uYmctY2FyZC1mb3JlZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWNhcmQtZm9yZWdyb3VuZCkpfS5iZy1kZXN0cnVjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1kZXN0cnVjdGl2ZSkpfS5iZy1ncmF5LTMwMHstLXR3LWJnLW9wYWNpdHk6IDE7YmFja2dyb3VuZC1jb2xvcjpyZ2IoMjA5IDIxMyAyMTkgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmJnLWdyYXktNTAwey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigxMDcgMTE0IDEyOCAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKX0uYmctbXV0ZWR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tbXV0ZWQpKX0uYmctcG9wb3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1wb3BvdmVyKSl9LmJnLXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5iZy1yZWQtNTAwey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigyMzkgNjggNjggLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmJnLXNlY29uZGFyeXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1zZWNvbmRhcnkpKX0uYmctdHJhbnNwYXJlbnR7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uYmctd2hpdGV7LS10dy1iZy1vcGFjaXR5OiAxO2JhY2tncm91bmQtY29sb3I6cmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpfS5iZy1ncmFkaWVudC10by1ie2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSx2YXIoLS10dy1ncmFkaWVudC1zdG9wcykpfS5mcm9tLXRyYW5zcGFyZW50ey0tdHctZ3JhZGllbnQtZnJvbTogdHJhbnNwYXJlbnQgdmFyKC0tdHctZ3JhZGllbnQtZnJvbS1wb3NpdGlvbik7LS10dy1ncmFkaWVudC10bzogcmdiKDAgMCAwIC8gMCkgdmFyKC0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb24pOy0tdHctZ3JhZGllbnQtc3RvcHM6IHZhcigtLXR3LWdyYWRpZW50LWZyb20pLCB2YXIoLS10dy1ncmFkaWVudC10byl9LnRvLWJhY2tncm91bmR7LS10dy1ncmFkaWVudC10bzogaHNsKHZhcigtLWJhY2tncm91bmQpKSB2YXIoLS10dy1ncmFkaWVudC10by1wb3NpdGlvbil9LmZpbGwtY3VycmVudHtmaWxsOmN1cnJlbnRDb2xvcn0uZmlsbC13aGl0ZXtmaWxsOiNmZmZ9LnN0cm9rZS1cWzJweFxde3N0cm9rZS13aWR0aDoycHh9LnN0cm9rZS1cWzNweFxde3N0cm9rZS13aWR0aDozcHh9Lm9iamVjdC1jb250YWluey1vLW9iamVjdC1maXQ6Y29udGFpbjtvYmplY3QtZml0OmNvbnRhaW59LnAtMHtwYWRkaW5nOjB9LnAtMXtwYWRkaW5nOi4yNXJlbX0ucC0xMHtwYWRkaW5nOjIuNXJlbX0ucC0ye3BhZGRpbmc6LjVyZW19LnAtM3twYWRkaW5nOi43NXJlbX0ucC00e3BhZGRpbmc6MXJlbX0ucC02e3BhZGRpbmc6MS41cmVtfS5wLVxbMXB4XF17cGFkZGluZzoxcHh9LnB4LTF7cGFkZGluZy1sZWZ0Oi4yNXJlbTtwYWRkaW5nLXJpZ2h0Oi4yNXJlbX0ucHgtMntwYWRkaW5nLWxlZnQ6LjVyZW07cGFkZGluZy1yaWdodDouNXJlbX0ucHgtMlwuNXtwYWRkaW5nLWxlZnQ6LjYyNXJlbTtwYWRkaW5nLXJpZ2h0Oi42MjVyZW19LnB4LTN7cGFkZGluZy1sZWZ0Oi43NXJlbTtwYWRkaW5nLXJpZ2h0Oi43NXJlbX0ucHgtNHtwYWRkaW5nLWxlZnQ6MXJlbTtwYWRkaW5nLXJpZ2h0OjFyZW19LnB4LTV7cGFkZGluZy1sZWZ0OjEuMjVyZW07cGFkZGluZy1yaWdodDoxLjI1cmVtfS5weC04e3BhZGRpbmctbGVmdDoycmVtO3BhZGRpbmctcmlnaHQ6MnJlbX0ucHgtXFsyNHB4XF17cGFkZGluZy1sZWZ0OjI0cHg7cGFkZGluZy1yaWdodDoyNHB4fS5weS0xe3BhZGRpbmctdG9wOi4yNXJlbTtwYWRkaW5nLWJvdHRvbTouMjVyZW19LnB5LTFcLjV7cGFkZGluZy10b3A6LjM3NXJlbTtwYWRkaW5nLWJvdHRvbTouMzc1cmVtfS5weS0ye3BhZGRpbmctdG9wOi41cmVtO3BhZGRpbmctYm90dG9tOi41cmVtfS5weS0ze3BhZGRpbmctdG9wOi43NXJlbTtwYWRkaW5nLWJvdHRvbTouNzVyZW19LnB5LTR7cGFkZGluZy10b3A6MXJlbTtwYWRkaW5nLWJvdHRvbToxcmVtfS5weS02e3BhZGRpbmctdG9wOjEuNXJlbTtwYWRkaW5nLWJvdHRvbToxLjVyZW19LnB5LTd7cGFkZGluZy10b3A6MS43NXJlbTtwYWRkaW5nLWJvdHRvbToxLjc1cmVtfS5weS1cWzJweFxde3BhZGRpbmctdG9wOjJweDtwYWRkaW5nLWJvdHRvbToycHh9LnBiLTB7cGFkZGluZy1ib3R0b206MH0ucGItMjB7cGFkZGluZy1ib3R0b206NXJlbX0ucGItNHtwYWRkaW5nLWJvdHRvbToxcmVtfS5wbC02e3BhZGRpbmctbGVmdDoxLjVyZW19LnBsLTh7cGFkZGluZy1sZWZ0OjJyZW19LnByLTF7cGFkZGluZy1yaWdodDouMjVyZW19LnByLTJ7cGFkZGluZy1yaWdodDouNXJlbX0ucHQtMHtwYWRkaW5nLXRvcDowfS5wdC0xe3BhZGRpbmctdG9wOi4yNXJlbX0ucHQtMntwYWRkaW5nLXRvcDouNXJlbX0ucHQtNHtwYWRkaW5nLXRvcDoxcmVtfS50ZXh0LWxlZnR7dGV4dC1hbGlnbjpsZWZ0fS50ZXh0LWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlcn0udGV4dC1zdGFydHt0ZXh0LWFsaWduOnN0YXJ0fS5mb250LXNhbnN7Zm9udC1mYW1pbHk6Um9ib3RvLHNhbnMtc2VyaWZ9LmZvbnQtc2VyaWZ7Zm9udC1mYW1pbHk6U3BhY2UgTW9ubyxtb25vc3BhY2V9LnRleHQtMnhse2ZvbnQtc2l6ZToxLjVyZW07bGluZS1oZWlnaHQ6MnJlbX0udGV4dC0zeGx7Zm9udC1zaXplOjEuODc1cmVtO2xpbmUtaGVpZ2h0OjIuMjVyZW19LnRleHQtNHhse2ZvbnQtc2l6ZToyLjI1cmVtO2xpbmUtaGVpZ2h0OjIuNXJlbX0udGV4dC1cWzBcLjhyZW1cXXtmb250LXNpemU6LjhyZW19LnRleHQtXFsxMnB4XF17Zm9udC1zaXplOjEycHh9LnRleHQtbGd7Zm9udC1zaXplOjEuMTI1cmVtO2xpbmUtaGVpZ2h0OjEuNzVyZW19LnRleHQtc217Zm9udC1zaXplOi44NzVyZW07bGluZS1oZWlnaHQ6MS4yNXJlbX0udGV4dC14bHtmb250LXNpemU6MS4yNXJlbTtsaW5lLWhlaWdodDoxLjc1cmVtfS50ZXh0LXhze2ZvbnQtc2l6ZTouNzVyZW07bGluZS1oZWlnaHQ6MXJlbX0uZm9udC1cWzEycHhcXXtmb250LXdlaWdodDoxMnB4fS5mb250LVxbNDAwXF17Zm9udC13ZWlnaHQ6NDAwfS5mb250LVxbNTAwXF17Zm9udC13ZWlnaHQ6NTAwfS5mb250LVxbNTUwXF17Zm9udC13ZWlnaHQ6NTUwfS5mb250LWJvbGR7Zm9udC13ZWlnaHQ6NzAwfS5mb250LWV4dHJhYm9sZHtmb250LXdlaWdodDo4MDB9LmZvbnQtbWVkaXVte2ZvbnQtd2VpZ2h0OjUwMH0uZm9udC1ub3JtYWx7Zm9udC13ZWlnaHQ6NDAwfS5mb250LXNlbWlib2xke2ZvbnQtd2VpZ2h0OjYwMH0udXBwZXJjYXNle3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX0uaXRhbGlje2ZvbnQtc3R5bGU6aXRhbGljfS5sZWFkaW5nLTR7bGluZS1oZWlnaHQ6MXJlbX0ubGVhZGluZy1ub25le2xpbmUtaGVpZ2h0OjF9LnRyYWNraW5nLVxbMFwuMDRlbVxde2xldHRlci1zcGFjaW5nOi4wNGVtfS50cmFja2luZy10aWdodHtsZXR0ZXItc3BhY2luZzotLjAyNWVtfS50cmFja2luZy13aWRlcntsZXR0ZXItc3BhY2luZzouMDVlbX0udHJhY2tpbmctd2lkZXN0e2xldHRlci1zcGFjaW5nOi4xZW19LnRleHQtYWNjZW50e2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0udGV4dC1hY2NlbnQtZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tYWNjZW50LWZvcmVncm91bmQpKX0udGV4dC1iYWNrZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LnRleHQtY2FyZC1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1jYXJkLWZvcmVncm91bmQpKX0udGV4dC1jdXJyZW50e2NvbG9yOmN1cnJlbnRDb2xvcn0udGV4dC1kZXN0cnVjdGl2ZXtjb2xvcjpoc2wodmFyKC0tZGVzdHJ1Y3RpdmUpKX0udGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kKSl9LnRleHQtZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tZm9yZWdyb3VuZCkpfS50ZXh0LW11dGVke2NvbG9yOmhzbCh2YXIoLS1tdXRlZCkpfS50ZXh0LW11dGVkLWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0udGV4dC1wb3BvdmVyLWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLXBvcG92ZXItZm9yZWdyb3VuZCkpfS50ZXh0LXByaW1hcnl7Y29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0udGV4dC1wcmltYXJ5LWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLXByaW1hcnktZm9yZWdyb3VuZCkpfS50ZXh0LXNlY29uZGFyeS1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1zZWNvbmRhcnktZm9yZWdyb3VuZCkpfS50ZXh0LXdoaXRley0tdHctdGV4dC1vcGFjaXR5OiAxO2NvbG9yOnJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpfS51bmRlcmxpbmV7dGV4dC1kZWNvcmF0aW9uLWxpbmU6dW5kZXJsaW5lfS5saW5lLXRocm91Z2h7dGV4dC1kZWNvcmF0aW9uLWxpbmU6bGluZS10aHJvdWdofS51bmRlcmxpbmUtb2Zmc2V0LTR7dGV4dC11bmRlcmxpbmUtb2Zmc2V0OjRweH0uYW50aWFsaWFzZWR7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDstbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGV9Lm9wYWNpdHktMHtvcGFjaXR5OjB9Lm9wYWNpdHktMTAwe29wYWNpdHk6MX0ub3BhY2l0eS01MHtvcGFjaXR5Oi41fS5vcGFjaXR5LTYwe29wYWNpdHk6LjZ9Lm9wYWNpdHktNzB7b3BhY2l0eTouN30ub3BhY2l0eS03NXtvcGFjaXR5Oi43NX0uc2hhZG93ey0tdHctc2hhZG93OiAwIDFweCAzcHggMCByZ2IoMCAwIDAgLyAuMSksIDAgMXB4IDJweCAtMXB4IHJnYigwIDAgMCAvIC4xKTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAzcHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDFweCAycHggLTFweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9LnNoYWRvdy1sZ3stLXR3LXNoYWRvdzogMCAxMHB4IDE1cHggLTNweCByZ2IoMCAwIDAgLyAuMSksIDAgNHB4IDZweCAtNHB4IHJnYigwIDAgMCAvIC4xKTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDEwcHggMTVweCAtM3B4IHZhcigtLXR3LXNoYWRvdy1jb2xvciksIDAgNHB4IDZweCAtNHB4IHZhcigtLXR3LXNoYWRvdy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctc2hhZG93KX0uc2hhZG93LW1key0tdHctc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2IoMCAwIDAgLyAuMSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIC4xKTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDRweCA2cHggLTFweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDJweCA0cHggLTJweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9LnNoYWRvdy1zbXstLXR3LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gLjA1KTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAycHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9Lm91dGxpbmUtbm9uZXtvdXRsaW5lOjJweCBzb2xpZCB0cmFuc3BhcmVudDtvdXRsaW5lLW9mZnNldDoycHh9Lm91dGxpbmV7b3V0bGluZS1zdHlsZTpzb2xpZH0ucmluZy0wey0tdHctcmluZy1vZmZzZXQtc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkgdmFyKC0tdHctcmluZy1vZmZzZXQtY29sb3IpOy0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMHB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksdmFyKC0tdHctcmluZy1zaGFkb3cpLHZhcigtLXR3LXNoYWRvdywgMCAwICMwMDAwKX0ucmluZy1vZmZzZXQtYmFja2dyb3VuZHstLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiBoc2wodmFyKC0tYmFja2dyb3VuZCkpfS5kcm9wLXNoYWRvdy0yeGx7LS10dy1kcm9wLXNoYWRvdzogZHJvcC1zaGFkb3coMCAyNXB4IDI1cHggcmdiKDAgMCAwIC8gLjE1KSk7ZmlsdGVyOnZhcigtLXR3LWJsdXIpIHZhcigtLXR3LWJyaWdodG5lc3MpIHZhcigtLXR3LWNvbnRyYXN0KSB2YXIoLS10dy1ncmF5c2NhbGUpIHZhcigtLXR3LWh1ZS1yb3RhdGUpIHZhcigtLXR3LWludmVydCkgdmFyKC0tdHctc2F0dXJhdGUpIHZhcigtLXR3LXNlcGlhKSB2YXIoLS10dy1kcm9wLXNoYWRvdyl9LmRyb3Atc2hhZG93LVxbMHB4XzBweF8xMnB4X3JnYmFcKDU2XCwyMDVcLDE1MlwsMFwuNjBcKVxdey0tdHctZHJvcC1zaGFkb3c6IGRyb3Atc2hhZG93KDBweCAwcHggMTJweCByZ2JhKDU2LDIwNSwxNTIsLjYpKTtmaWx0ZXI6dmFyKC0tdHctYmx1cikgdmFyKC0tdHctYnJpZ2h0bmVzcykgdmFyKC0tdHctY29udHJhc3QpIHZhcigtLXR3LWdyYXlzY2FsZSkgdmFyKC0tdHctaHVlLXJvdGF0ZSkgdmFyKC0tdHctaW52ZXJ0KSB2YXIoLS10dy1zYXR1cmF0ZSkgdmFyKC0tdHctc2VwaWEpIHZhcigtLXR3LWRyb3Atc2hhZG93KX0uZmlsdGVye2ZpbHRlcjp2YXIoLS10dy1ibHVyKSB2YXIoLS10dy1icmlnaHRuZXNzKSB2YXIoLS10dy1jb250cmFzdCkgdmFyKC0tdHctZ3JheXNjYWxlKSB2YXIoLS10dy1odWUtcm90YXRlKSB2YXIoLS10dy1pbnZlcnQpIHZhcigtLXR3LXNhdHVyYXRlKSB2YXIoLS10dy1zZXBpYSkgdmFyKC0tdHctZHJvcC1zaGFkb3cpfS5iYWNrZHJvcC1ibHVyLXNtey0tdHctYmFja2Ryb3AtYmx1cjogYmx1cig0cHgpOy13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOnZhcigtLXR3LWJhY2tkcm9wLWJsdXIpIHZhcigtLXR3LWJhY2tkcm9wLWJyaWdodG5lc3MpIHZhcigtLXR3LWJhY2tkcm9wLWNvbnRyYXN0KSB2YXIoLS10dy1iYWNrZHJvcC1ncmF5c2NhbGUpIHZhcigtLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGUpIHZhcigtLXR3LWJhY2tkcm9wLWludmVydCkgdmFyKC0tdHctYmFja2Ryb3Atb3BhY2l0eSkgdmFyKC0tdHctYmFja2Ryb3Atc2F0dXJhdGUpIHZhcigtLXR3LWJhY2tkcm9wLXNlcGlhKTtiYWNrZHJvcC1maWx0ZXI6dmFyKC0tdHctYmFja2Ryb3AtYmx1cikgdmFyKC0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzcykgdmFyKC0tdHctYmFja2Ryb3AtY29udHJhc3QpIHZhcigtLXR3LWJhY2tkcm9wLWdyYXlzY2FsZSkgdmFyKC0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZSkgdmFyKC0tdHctYmFja2Ryb3AtaW52ZXJ0KSB2YXIoLS10dy1iYWNrZHJvcC1vcGFjaXR5KSB2YXIoLS10dy1iYWNrZHJvcC1zYXR1cmF0ZSkgdmFyKC0tdHctYmFja2Ryb3Atc2VwaWEpfS50cmFuc2l0aW9uLWFsbHt0cmFuc2l0aW9uLXByb3BlcnR5OmFsbDt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKTt0cmFuc2l0aW9uLWR1cmF0aW9uOi4xNXN9LnRyYW5zaXRpb24tY29sb3Jze3RyYW5zaXRpb24tcHJvcGVydHk6Y29sb3IsYmFja2dyb3VuZC1jb2xvcixib3JkZXItY29sb3IsdGV4dC1kZWNvcmF0aW9uLWNvbG9yLGZpbGwsc3Ryb2tlO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpO3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30udHJhbnNpdGlvbi1vcGFjaXR5e3RyYW5zaXRpb24tcHJvcGVydHk6b3BhY2l0eTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKTt0cmFuc2l0aW9uLWR1cmF0aW9uOi4xNXN9LnRyYW5zaXRpb24tdHJhbnNmb3Jte3RyYW5zaXRpb24tcHJvcGVydHk6dHJhbnNmb3JtO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpO3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30uZHVyYXRpb24tMTUwe3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30uZHVyYXRpb24tMjAwe3RyYW5zaXRpb24tZHVyYXRpb246LjJzfS5lYXNlLWluLW91dHt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKX1Aa2V5ZnJhbWVzIGVudGVyezAle29wYWNpdHk6dmFyKC0tdHctZW50ZXItb3BhY2l0eSwgMSk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKHZhcigtLXR3LWVudGVyLXRyYW5zbGF0ZS14LCAwKSx2YXIoLS10dy1lbnRlci10cmFuc2xhdGUteSwgMCksMCkgc2NhbGUzZCh2YXIoLS10dy1lbnRlci1zY2FsZSwgMSksdmFyKC0tdHctZW50ZXItc2NhbGUsIDEpLHZhcigtLXR3LWVudGVyLXNjYWxlLCAxKSkgcm90YXRlKHZhcigtLXR3LWVudGVyLXJvdGF0ZSwgMCkpfX1Aa2V5ZnJhbWVzIGV4aXR7dG97b3BhY2l0eTp2YXIoLS10dy1leGl0LW9wYWNpdHksIDEpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCh2YXIoLS10dy1leGl0LXRyYW5zbGF0ZS14LCAwKSx2YXIoLS10dy1leGl0LXRyYW5zbGF0ZS15LCAwKSwwKSBzY2FsZTNkKHZhcigtLXR3LWV4aXQtc2NhbGUsIDEpLHZhcigtLXR3LWV4aXQtc2NhbGUsIDEpLHZhcigtLXR3LWV4aXQtc2NhbGUsIDEpKSByb3RhdGUodmFyKC0tdHctZXhpdC1yb3RhdGUsIDApKX19LmFuaW1hdGUtaW57YW5pbWF0aW9uLW5hbWU6ZW50ZXI7YW5pbWF0aW9uLWR1cmF0aW9uOi4xNXM7LS10dy1lbnRlci1vcGFjaXR5OiBpbml0aWFsOy0tdHctZW50ZXItc2NhbGU6IGluaXRpYWw7LS10dy1lbnRlci1yb3RhdGU6IGluaXRpYWw7LS10dy1lbnRlci10cmFuc2xhdGUteDogaW5pdGlhbDstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiBpbml0aWFsfS5mYWRlLWluLTB7LS10dy1lbnRlci1vcGFjaXR5OiAwfS56b29tLWluLTk1ey0tdHctZW50ZXItc2NhbGU6IC45NX0uZHVyYXRpb24tMTUwe2FuaW1hdGlvbi1kdXJhdGlvbjouMTVzfS5kdXJhdGlvbi0yMDB7YW5pbWF0aW9uLWR1cmF0aW9uOi4yc30uZWFzZS1pbi1vdXR7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKX0uZmlsZVw6Ym9yZGVyLTA6OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2JvcmRlci13aWR0aDowcHh9LmZpbGVcOmJnLXRyYW5zcGFyZW50OjpmaWxlLXNlbGVjdG9yLWJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5maWxlXDp0ZXh0LXNtOjpmaWxlLXNlbGVjdG9yLWJ1dHRvbntmb250LXNpemU6Ljg3NXJlbTtsaW5lLWhlaWdodDoxLjI1cmVtfS5maWxlXDpmb250LW1lZGl1bTo6ZmlsZS1zZWxlY3Rvci1idXR0b257Zm9udC13ZWlnaHQ6NTAwfS5wbGFjZWhvbGRlclw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LnBsYWNlaG9sZGVyXDp0ZXh0LW11dGVkLWZvcmVncm91bmQ6OnBsYWNlaG9sZGVye2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LmZvY3VzLXdpdGhpblw6cmVsYXRpdmU6Zm9jdXMtd2l0aGlue3Bvc2l0aW9uOnJlbGF0aXZlfS5ob3Zlclw6dy1cWzJweFxdOmhvdmVye3dpZHRoOjJweH0uaG92ZXJcOnctXFszcHhcXTpob3Zlcnt3aWR0aDozcHh9LmhvdmVyXDpjdXJzb3ItcG9pbnRlcjpob3ZlcntjdXJzb3I6cG9pbnRlcn0uaG92ZXJcOnJvdW5kZWQtbGc6aG92ZXJ7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpfS5ob3Zlclw6YmctYWNjZW50OmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5ob3Zlclw6YmctYmFja2dyb3VuZDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LmhvdmVyXDpiZy1ib3JkZXI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9LmhvdmVyXDpiZy1kZXN0cnVjdGl2ZVwvOTA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tZGVzdHJ1Y3RpdmUpIC8gLjkpfS5ob3Zlclw6YmctbXV0ZWQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tbXV0ZWQpKX0uaG92ZXJcOmJnLXByaW1hcnk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5ob3Zlclw6YmctcHJpbWFyeVwvOTA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkgLyAuOSl9LmhvdmVyXDpiZy1yZWQtNzAwOmhvdmVyey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigxODUgMjggMjggLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmhvdmVyXDpiZy1zZWNvbmRhcnlcLzgwOmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXNlY29uZGFyeSkgLyAuOCl9LmhvdmVyXDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kOmhvdmVye2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5ob3Zlclw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kOmhvdmVye2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LmhvdmVyXDp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZDpob3Zlcntjb2xvcjpoc2wodmFyKC0tcHJpbWFyeS1mb3JlZ3JvdW5kKSl9LmhvdmVyXDp0ZXh0LXdoaXRlOmhvdmVyey0tdHctdGV4dC1vcGFjaXR5OiAxO2NvbG9yOnJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpfS5ob3Zlclw6dW5kZXJsaW5lOmhvdmVye3RleHQtZGVjb3JhdGlvbi1saW5lOnVuZGVybGluZX0uaG92ZXJcOm9wYWNpdHktMTAwOmhvdmVye29wYWNpdHk6MX0uZm9jdXNcOmJnLWFjY2VudDpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uZm9jdXNcOmJnLXByaW1hcnk6Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5mb2N1c1w6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZDpmb2N1c3tjb2xvcjpoc2wodmFyKC0tYWNjZW50LWZvcmVncm91bmQpKX0uZm9jdXNcOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kOmZvY3Vze2NvbG9yOmhzbCh2YXIoLS1wcmltYXJ5LWZvcmVncm91bmQpKX0uZm9jdXNcOm91dGxpbmUtbm9uZTpmb2N1c3tvdXRsaW5lOjJweCBzb2xpZCB0cmFuc3BhcmVudDtvdXRsaW5lLW9mZnNldDoycHh9LmZvY3VzXDpyaW5nLTI6Zm9jdXN7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSB2YXIoLS10dy1yaW5nLW9mZnNldC1jb2xvcik7LS10dy1yaW5nLXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgY2FsYygycHggKyB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkpIHZhcigtLXR3LXJpbmctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93KSx2YXIoLS10dy1yaW5nLXNoYWRvdyksdmFyKC0tdHctc2hhZG93LCAwIDAgIzAwMDApfS5mb2N1c1w6cmluZy1yaW5nOmZvY3Vzey0tdHctcmluZy1jb2xvcjogaHNsKHZhcigtLXJpbmcpKX0uZm9jdXNcOnJpbmctb2Zmc2V0LTI6Zm9jdXN7LS10dy1yaW5nLW9mZnNldC13aWR0aDogMnB4fS5mb2N1cy12aXNpYmxlXDpvdXRsaW5lLW5vbmU6Zm9jdXMtdmlzaWJsZXtvdXRsaW5lOjJweCBzb2xpZCB0cmFuc3BhcmVudDtvdXRsaW5lLW9mZnNldDoycHh9LmZvY3VzLXZpc2libGVcOm91dGxpbmUtYWNjZW50OmZvY3VzLXZpc2libGV7b3V0bGluZS1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmZvY3VzLXZpc2libGVcOnJpbmctMjpmb2N1cy12aXNpYmxley0tdHctcmluZy1vZmZzZXQtc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkgdmFyKC0tdHctcmluZy1vZmZzZXQtY29sb3IpOy0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMnB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksdmFyKC0tdHctcmluZy1zaGFkb3cpLHZhcigtLXR3LXNoYWRvdywgMCAwICMwMDAwKX0uZm9jdXMtdmlzaWJsZVw6cmluZy1yaW5nOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLWNvbG9yOiBoc2wodmFyKC0tcmluZykpfS5mb2N1cy12aXNpYmxlXDpyaW5nLW9mZnNldC0yOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLW9mZnNldC13aWR0aDogMnB4fS5mb2N1cy12aXNpYmxlXDpyaW5nLW9mZnNldC1iYWNrZ3JvdW5kOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLW9mZnNldC1jb2xvcjogaHNsKHZhcigtLWJhY2tncm91bmQpKX0uZGlzYWJsZWRcOnBvaW50ZXItZXZlbnRzLW5vbmU6ZGlzYWJsZWR7cG9pbnRlci1ldmVudHM6bm9uZX0uZGlzYWJsZWRcOmN1cnNvci1ub3QtYWxsb3dlZDpkaXNhYmxlZHtjdXJzb3I6bm90LWFsbG93ZWR9LmRpc2FibGVkXDpib3JkZXItYm9yZGVyOmRpc2FibGVke2JvcmRlci1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9LmRpc2FibGVkXDp0ZXh0LWJhY2tncm91bmQ6ZGlzYWJsZWR7Y29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKX0uZGlzYWJsZWRcOm9wYWNpdHktNTA6ZGlzYWJsZWR7b3BhY2l0eTouNX0ucGVlcjpkaXNhYmxlZH4ucGVlci1kaXNhYmxlZFw6Y3Vyc29yLW5vdC1hbGxvd2Vke2N1cnNvcjpub3QtYWxsb3dlZH0ucGVlcjpkaXNhYmxlZH4ucGVlci1kaXNhYmxlZFw6b3BhY2l0eS03MHtvcGFjaXR5Oi43fS5hcmlhLXNlbGVjdGVkXDpiZy1hY2NlbnRbYXJpYS1zZWxlY3RlZD10cnVlXXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uYXJpYS1zZWxlY3RlZFw6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZFthcmlhLXNlbGVjdGVkPXRydWVde2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5hcmlhLXNlbGVjdGVkXDpvcGFjaXR5LTEwMFthcmlhLXNlbGVjdGVkPXRydWVde29wYWNpdHk6MX0uZGF0YS1cW2Rpc2FibGVkXF1cOnBvaW50ZXItZXZlbnRzLW5vbmVbZGF0YS1kaXNhYmxlZF17cG9pbnRlci1ldmVudHM6bm9uZX0uZGF0YS1cW3NpZGVcPWJvdHRvbVxdXDp0cmFuc2xhdGUteS0xW2RhdGEtc2lkZT1ib3R0b21dey0tdHctdHJhbnNsYXRlLXk6IC4yNXJlbTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uZGF0YS1cW3NpZGVcPWxlZnRcXVw6LXRyYW5zbGF0ZS14LTFbZGF0YS1zaWRlPWxlZnRdey0tdHctdHJhbnNsYXRlLXg6IC0uMjVyZW07dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmRhdGEtXFtzaWRlXD1yaWdodFxdXDp0cmFuc2xhdGUteC0xW2RhdGEtc2lkZT1yaWdodF17LS10dy10cmFuc2xhdGUteDogLjI1cmVtO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5kYXRhLVxbc2lkZVw9dG9wXF1cOi10cmFuc2xhdGUteS0xW2RhdGEtc2lkZT10b3Bdey0tdHctdHJhbnNsYXRlLXk6IC0uMjVyZW07dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmRhdGEtXFtzdGF0ZVw9Y2hlY2tlZFxdXDp0cmFuc2xhdGUteC01W2RhdGEtc3RhdGU9Y2hlY2tlZF17LS10dy10cmFuc2xhdGUteDogMS4yNXJlbTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uZGF0YS1cW3N0YXRlXD11bmNoZWNrZWRcXVw6dHJhbnNsYXRlLXgtMFtkYXRhLXN0YXRlPXVuY2hlY2tlZF17LS10dy10cmFuc2xhdGUteDogMHB4O3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfUBrZXlmcmFtZXMgYWNjb3JkaW9uLXVwezAle2hlaWdodDp2YXIoLS1yYWRpeC1hY2NvcmRpb24tY29udGVudC1oZWlnaHQpfXRve2hlaWdodDowfX0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6YW5pbWF0ZS1hY2NvcmRpb24tdXBbZGF0YS1zdGF0ZT1jbG9zZWRde2FuaW1hdGlvbjphY2NvcmRpb24tdXAgLjJzIGVhc2Utb3V0fUBrZXlmcmFtZXMgYWNjb3JkaW9uLWRvd257MCV7aGVpZ2h0OjB9dG97aGVpZ2h0OnZhcigtLXJhZGl4LWFjY29yZGlvbi1jb250ZW50LWhlaWdodCl9fS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6YW5pbWF0ZS1hY2NvcmRpb24tZG93bltkYXRhLXN0YXRlPW9wZW5de2FuaW1hdGlvbjphY2NvcmRpb24tZG93biAuMnMgZWFzZS1vdXR9LmRhdGEtXFtzdGF0ZVw9YWN0aXZlXF1cOmJnLWJhY2tncm91bmRbZGF0YS1zdGF0ZT1hY3RpdmVde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKX0uZGF0YS1cW3N0YXRlXD1jaGVja2VkXF1cOmJnLWFjY2VudFtkYXRhLXN0YXRlPWNoZWNrZWRde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5kYXRhLVxbc3RhdGVcPWNoZWNrZWRcXVw6YmctcHJpbWFyeVtkYXRhLXN0YXRlPWNoZWNrZWRde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0uZGF0YS1cW3N0YXRlXD1vblxdXDpiZy1hY2NlbnRbZGF0YS1zdGF0ZT1vbl0sLmRhdGEtXFtzdGF0ZVw9b3BlblxdXDpiZy1hY2NlbnRbZGF0YS1zdGF0ZT1vcGVuXXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uZGF0YS1cW3N0YXRlXD11bmNoZWNrZWRcXVw6YmctcHJpbWFyeVtkYXRhLXN0YXRlPXVuY2hlY2tlZF17YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5kYXRhLVxbc3RhdGVcPWFjdGl2ZVxdXDp0ZXh0LWZvcmVncm91bmRbZGF0YS1zdGF0ZT1hY3RpdmVde2NvbG9yOmhzbCh2YXIoLS1mb3JlZ3JvdW5kKSl9LmRhdGEtXFtzdGF0ZVw9Y2hlY2tlZFxdXDp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZFtkYXRhLXN0YXRlPWNoZWNrZWRde2NvbG9yOmhzbCh2YXIoLS1wcmltYXJ5LWZvcmVncm91bmQpKX0uZGF0YS1cW3N0YXRlXD1vblxdXDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kW2RhdGEtc3RhdGU9b25de2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kW2RhdGEtc3RhdGU9b3Blbl17Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0uZGF0YS1cW2Rpc2FibGVkXF1cOm9wYWNpdHktNTBbZGF0YS1kaXNhYmxlZF17b3BhY2l0eTouNX0uZGF0YS1cW3N0YXRlXD1hY3RpdmVcXVw6c2hhZG93LXNtW2RhdGEtc3RhdGU9YWN0aXZlXXstLXR3LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gLjA1KTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAycHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9LmRhdGEtXFtzdGF0ZVw9b3BlblxdXDphbmltYXRlLWluW2RhdGEtc3RhdGU9b3Blbl17YW5pbWF0aW9uLW5hbWU6ZW50ZXI7YW5pbWF0aW9uLWR1cmF0aW9uOi4xNXM7LS10dy1lbnRlci1vcGFjaXR5OiBpbml0aWFsOy0tdHctZW50ZXItc2NhbGU6IGluaXRpYWw7LS10dy1lbnRlci1yb3RhdGU6IGluaXRpYWw7LS10dy1lbnRlci10cmFuc2xhdGUteDogaW5pdGlhbDstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiBpbml0aWFsfS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDphbmltYXRlLW91dFtkYXRhLXN0YXRlPWNsb3NlZF17YW5pbWF0aW9uLW5hbWU6ZXhpdDthbmltYXRpb24tZHVyYXRpb246LjE1czstLXR3LWV4aXQtb3BhY2l0eTogaW5pdGlhbDstLXR3LWV4aXQtc2NhbGU6IGluaXRpYWw7LS10dy1leGl0LXJvdGF0ZTogaW5pdGlhbDstLXR3LWV4aXQtdHJhbnNsYXRlLXg6IGluaXRpYWw7LS10dy1leGl0LXRyYW5zbGF0ZS15OiBpbml0aWFsfS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDpmYWRlLW91dC0wW2RhdGEtc3RhdGU9Y2xvc2VkXXstLXR3LWV4aXQtb3BhY2l0eTogMH0uZGF0YS1cW3N0YXRlXD1vcGVuXF1cOmZhZGUtaW4tMFtkYXRhLXN0YXRlPW9wZW5dey0tdHctZW50ZXItb3BhY2l0eTogMH0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6em9vbS1vdXQtOTVbZGF0YS1zdGF0ZT1jbG9zZWRdey0tdHctZXhpdC1zY2FsZTogLjk1fS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6em9vbS1pbi05NVtkYXRhLXN0YXRlPW9wZW5dey0tdHctZW50ZXItc2NhbGU6IC45NX0uZGF0YS1cW3NpZGVcPWJvdHRvbVxdXDpzbGlkZS1pbi1mcm9tLXRvcC0yW2RhdGEtc2lkZT1ib3R0b21dey0tdHctZW50ZXItdHJhbnNsYXRlLXk6IC0uNXJlbX0uZGF0YS1cW3NpZGVcPWxlZnRcXVw6c2xpZGUtaW4tZnJvbS1yaWdodC0yW2RhdGEtc2lkZT1sZWZ0XXstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiAuNXJlbX0uZGF0YS1cW3NpZGVcPXJpZ2h0XF1cOnNsaWRlLWluLWZyb20tbGVmdC0yW2RhdGEtc2lkZT1yaWdodF17LS10dy1lbnRlci10cmFuc2xhdGUteDogLS41cmVtfS5kYXRhLVxbc2lkZVw9dG9wXF1cOnNsaWRlLWluLWZyb20tYm90dG9tLTJbZGF0YS1zaWRlPXRvcF17LS10dy1lbnRlci10cmFuc2xhdGUteTogLjVyZW19LmRhdGEtXFtzdGF0ZVw9Y2xvc2VkXF1cOnNsaWRlLW91dC10by1sZWZ0LTFcLzJbZGF0YS1zdGF0ZT1jbG9zZWRdey0tdHctZXhpdC10cmFuc2xhdGUteDogLTUwJX0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6c2xpZGUtb3V0LXRvLXRvcC1cWzQ4XCVcXVtkYXRhLXN0YXRlPWNsb3NlZF17LS10dy1leGl0LXRyYW5zbGF0ZS15OiAtNDglfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6c2xpZGUtaW4tZnJvbS1sZWZ0LTFcLzJbZGF0YS1zdGF0ZT1vcGVuXXstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiAtNTAlfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6c2xpZGUtaW4tZnJvbS10b3AtXFs0OFwlXF1bZGF0YS1zdGF0ZT1vcGVuXXstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiAtNDglfTppcyhbZGF0YS1tb2RlPWRhcmtdIC5kYXJrXDpib3JkZXItd2hpdGUpey0tdHctYm9yZGVyLW9wYWNpdHk6IDE7Ym9yZGVyLWNvbG9yOnJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSl9QG1lZGlhIChtaW4td2lkdGg6IDY0MHB4KXsuc21cOm10LTB7bWFyZ2luLXRvcDowfS5zbVw6YmxvY2t7ZGlzcGxheTpibG9ja30uc21cOmZsZXgtcm93e2ZsZXgtZGlyZWN0aW9uOnJvd30uc21cOmp1c3RpZnktZW5ke2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0uc21cOnNwYWNlLXgtMj46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXgtcmV2ZXJzZTogMDttYXJnaW4tcmlnaHQ6Y2FsYyguNXJlbSAqIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpO21hcmdpbi1sZWZ0OmNhbGMoLjVyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS14LXJldmVyc2UpKSl9LnNtXDpzcGFjZS14LTQ+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS14LXJldmVyc2U6IDA7bWFyZ2luLXJpZ2h0OmNhbGMoMXJlbSAqIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpO21hcmdpbi1sZWZ0OmNhbGMoMXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpKX0uc21cOnNwYWNlLXktMD46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoMHB4ICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSkpO21hcmdpbi1ib3R0b206Y2FsYygwcHggKiB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKX0uc21cOnJvdW5kZWQtbGd7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpfS5zbVw6cC0we3BhZGRpbmc6MH0uc21cOnRleHQtbGVmdHt0ZXh0LWFsaWduOmxlZnR9fUBtZWRpYSAobWluLXdpZHRoOiA3NjhweCl7Lm1kXDp3LWZ1bGx7d2lkdGg6MTAwJX19LlxbXCZcOmhhc1woXFthcmlhLXNlbGVjdGVkXF1cKVxdXDpiZy1hY2NlbnQ6aGFzKFthcmlhLXNlbGVjdGVkXSl7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmZpcnN0XDpcW1wmXDpoYXNcKFxbYXJpYS1zZWxlY3RlZFxdXClcXVw6cm91bmRlZC1sLW1kOmhhcyhbYXJpYS1zZWxlY3RlZF0pOmZpcnN0LWNoaWxke2JvcmRlci10b3AtbGVmdC1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gMnB4KTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDJweCl9Lmxhc3RcOlxbXCZcOmhhc1woXFthcmlhLXNlbGVjdGVkXF1cKVxdXDpyb3VuZGVkLXItbWQ6aGFzKFthcmlhLXNlbGVjdGVkXSk6bGFzdC1jaGlsZHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgLSAycHgpO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDJweCl9LlxbXCZcW2RhdGEtc3RhdGVcPW9wZW5cXVw+c3ZnXF1cOnJvdGF0ZS0xODBbZGF0YS1zdGF0ZT1vcGVuXT5zdmd7LS10dy1yb3RhdGU6IDE4MGRlZzt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uXFtcJl9cW2NtZGstZ3JvdXAtaGVhZGluZ1xdXF1cOnB4LTIgW2NtZGstZ3JvdXAtaGVhZGluZ117cGFkZGluZy1sZWZ0Oi41cmVtO3BhZGRpbmctcmlnaHQ6LjVyZW19LlxbXCZfXFtjbWRrLWdyb3VwLWhlYWRpbmdcXVxdXDpweS0xXC41IFtjbWRrLWdyb3VwLWhlYWRpbmdde3BhZGRpbmctdG9wOi4zNzVyZW07cGFkZGluZy1ib3R0b206LjM3NXJlbX0uXFtcJl9cW2NtZGstZ3JvdXAtaGVhZGluZ1xdXF1cOnRleHQteHMgW2NtZGstZ3JvdXAtaGVhZGluZ117Zm9udC1zaXplOi43NXJlbTtsaW5lLWhlaWdodDoxcmVtfS5cW1wmX1xbY21kay1ncm91cC1oZWFkaW5nXF1cXVw6Zm9udC1tZWRpdW0gW2NtZGstZ3JvdXAtaGVhZGluZ117Zm9udC13ZWlnaHQ6NTAwfS5cW1wmX1xbY21kay1ncm91cC1oZWFkaW5nXF1cXVw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIFtjbWRrLWdyb3VwLWhlYWRpbmdde2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LlxbXCZfXFtjbWRrLWdyb3VwXF1cOm5vdFwoXFtoaWRkZW5cXVwpX1x+XFtjbWRrLWdyb3VwXF1cXVw6cHQtMCBbY21kay1ncm91cF06bm90KFtoaWRkZW5dKX5bY21kay1ncm91cF17cGFkZGluZy10b3A6MH0uXFtcJl9cW2NtZGstZ3JvdXBcXVxdXDpweC0yIFtjbWRrLWdyb3VwXXtwYWRkaW5nLWxlZnQ6LjVyZW07cGFkZGluZy1yaWdodDouNXJlbX0uXFtcJl9cW2NtZGstaW5wdXQtd3JhcHBlclxdX3N2Z1xdXDpoLTUgW2NtZGstaW5wdXQtd3JhcHBlcl0gc3Zne2hlaWdodDoxLjI1cmVtfS5cW1wmX1xbY21kay1pbnB1dC13cmFwcGVyXF1fc3ZnXF1cOnctNSBbY21kay1pbnB1dC13cmFwcGVyXSBzdmd7d2lkdGg6MS4yNXJlbX0uXFtcJl9cW2NtZGstaW5wdXRcXVxdXDpoLTEyIFtjbWRrLWlucHV0XXtoZWlnaHQ6M3JlbX0uXFtcJl9cW2NtZGstaXRlbVxdXF1cOnB4LTIgW2NtZGstaXRlbV17cGFkZGluZy1sZWZ0Oi41cmVtO3BhZGRpbmctcmlnaHQ6LjVyZW19LlxbXCZfXFtjbWRrLWl0ZW1cXVxdXDpweS0zIFtjbWRrLWl0ZW1de3BhZGRpbmctdG9wOi43NXJlbTtwYWRkaW5nLWJvdHRvbTouNzVyZW19LlxbXCZfXFtjbWRrLWl0ZW1cXV9zdmdcXVw6aC01IFtjbWRrLWl0ZW1dIHN2Z3toZWlnaHQ6MS4yNXJlbX0uXFtcJl9cW2NtZGstaXRlbVxdX3N2Z1xdXDp3LTUgW2NtZGstaXRlbV0gc3Zne3dpZHRoOjEuMjVyZW19Cg==","/assets/index-9616f8c2.js":"dmFyIEVFPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgJEU9KGUsdCxuKT0+dCBpbiBlP0VFKGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOmVbdF09bjt2YXIgamU9KGUsdCxuKT0+KCRFKGUsdHlwZW9mIHQhPSJzeW1ib2wiP3QrIiI6dCxuKSxuKSxrRT0oZSx0LG4pPT57aWYoIXQuaGFzKGUpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIrbil9O3ZhciB6ZD0oZSx0LG4pPT57aWYodC5oYXMoZSkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7dCBpbnN0YW5jZW9mIFdlYWtTZXQ/dC5hZGQoZSk6dC5zZXQoZSxuKX07dmFyIEhhPShlLHQsbik9PihrRShlLHQsImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpLG4pO2Z1bmN0aW9uIFRFKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dFtuXTtpZih0eXBlb2YgciE9InN0cmluZyImJiFBcnJheS5pc0FycmF5KHIpKXtmb3IoY29uc3QgbyBpbiByKWlmKG8hPT0iZGVmYXVsdCImJiEobyBpbiBlKSl7Y29uc3QgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsbyk7aSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbyxpLmdldD9pOntlbnVtZXJhYmxlOiEwLGdldDooKT0+cltvXX0pfX19cmV0dXJuIE9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKX0oZnVuY3Rpb24oKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKS5yZWxMaXN0O2lmKHQmJnQuc3VwcG9ydHMmJnQuc3VwcG9ydHMoIm1vZHVsZXByZWxvYWQiKSlyZXR1cm47Zm9yKGNvbnN0IG8gb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlua1tyZWw9Im1vZHVsZXByZWxvYWQiXScpKXIobyk7bmV3IE11dGF0aW9uT2JzZXJ2ZXIobz0+e2Zvcihjb25zdCBpIG9mIG8paWYoaS50eXBlPT09ImNoaWxkTGlzdCIpZm9yKGNvbnN0IGwgb2YgaS5hZGRlZE5vZGVzKWwudGFnTmFtZT09PSJMSU5LIiYmbC5yZWw9PT0ibW9kdWxlcHJlbG9hZCImJnIobCl9KS5vYnNlcnZlKGRvY3VtZW50LHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pO2Z1bmN0aW9uIG4obyl7Y29uc3QgaT17fTtyZXR1cm4gby5pbnRlZ3JpdHkmJihpLmludGVncml0eT1vLmludGVncml0eSksby5yZWZlcnJlclBvbGljeSYmKGkucmVmZXJyZXJQb2xpY3k9by5yZWZlcnJlclBvbGljeSksby5jcm9zc09yaWdpbj09PSJ1c2UtY3JlZGVudGlhbHMiP2kuY3JlZGVudGlhbHM9ImluY2x1ZGUiOm8uY3Jvc3NPcmlnaW49PT0iYW5vbnltb3VzIj9pLmNyZWRlbnRpYWxzPSJvbWl0IjppLmNyZWRlbnRpYWxzPSJzYW1lLW9yaWdpbiIsaX1mdW5jdGlvbiByKG8pe2lmKG8uZXApcmV0dXJuO28uZXA9ITA7Y29uc3QgaT1uKG8pO2ZldGNoKG8uaHJlZixpKX19KSgpO2Z1bmN0aW9uICRhKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9dmFyIEcwPXtleHBvcnRzOnt9fSxTZT17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogcmVhY3QucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBrYT1TeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50IiksTkU9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksYkU9U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSxSRT1TeW1ib2wuZm9yKCJyZWFjdC5zdHJpY3RfbW9kZSIpLFBFPVN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIiksT0U9U3ltYm9sLmZvcigicmVhY3QucHJvdmlkZXIiKSxBRT1TeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0IiksTUU9U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSxERT1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZSIpLExFPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxJRT1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksV209U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIGpFKGUpe3JldHVybiBlPT09bnVsbHx8dHlwZW9mIGUhPSJvYmplY3QiP251bGw6KGU9V20mJmVbV21dfHxlWyJAQGl0ZXJhdG9yIl0sdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZTpudWxsKX12YXIgWTA9e2lzTW91bnRlZDpmdW5jdGlvbigpe3JldHVybiExfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbigpe319LFgwPU9iamVjdC5hc3NpZ24sUTA9e307ZnVuY3Rpb24gQWwoZSx0LG4pe3RoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9dCx0aGlzLnJlZnM9UTAsdGhpcy51cGRhdGVyPW58fFkwfUFsLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O0FsLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlIT0ib2JqZWN0IiYmdHlwZW9mIGUhPSJmdW5jdGlvbiImJmUhPW51bGwpdGhyb3cgRXJyb3IoInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLiIpO3RoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyxlLHQsInNldFN0YXRlIil9O0FsLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsZSwiZm9yY2VVcGRhdGUiKX07ZnVuY3Rpb24gSjAoKXt9SjAucHJvdG90eXBlPUFsLnByb3RvdHlwZTtmdW5jdGlvbiBScChlLHQsbil7dGhpcy5wcm9wcz1lLHRoaXMuY29udGV4dD10LHRoaXMucmVmcz1RMCx0aGlzLnVwZGF0ZXI9bnx8WTB9dmFyIFBwPVJwLnByb3RvdHlwZT1uZXcgSjA7UHAuY29uc3RydWN0b3I9UnA7WDAoUHAsQWwucHJvdG90eXBlKTtQcC5pc1B1cmVSZWFjdENvbXBvbmVudD0hMDt2YXIgVW09QXJyYXkuaXNBcnJheSxaMD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LE9wPXtjdXJyZW50Om51bGx9LHEwPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07ZnVuY3Rpb24gZTEoZSx0LG4pe3ZhciByLG89e30saT1udWxsLGw9bnVsbDtpZih0IT1udWxsKWZvcihyIGluIHQucmVmIT09dm9pZCAwJiYobD10LnJlZiksdC5rZXkhPT12b2lkIDAmJihpPSIiK3Qua2V5KSx0KVowLmNhbGwodCxyKSYmIXEwLmhhc093blByb3BlcnR5KHIpJiYob1tyXT10W3JdKTt2YXIgcz1hcmd1bWVudHMubGVuZ3RoLTI7aWYocz09PTEpby5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxzKXtmb3IodmFyIGE9QXJyYXkocyksdT0wO3U8czt1KyspYVt1XT1hcmd1bWVudHNbdSsyXTtvLmNoaWxkcmVuPWF9aWYoZSYmZS5kZWZhdWx0UHJvcHMpZm9yKHIgaW4gcz1lLmRlZmF1bHRQcm9wcyxzKW9bcl09PT12b2lkIDAmJihvW3JdPXNbcl0pO3JldHVybnskJHR5cGVvZjprYSx0eXBlOmUsa2V5OmkscmVmOmwscHJvcHM6byxfb3duZXI6T3AuY3VycmVudH19ZnVuY3Rpb24gekUoZSx0KXtyZXR1cm57JCR0eXBlb2Y6a2EsdHlwZTplLnR5cGUsa2V5OnQscmVmOmUucmVmLHByb3BzOmUucHJvcHMsX293bmVyOmUuX293bmVyfX1mdW5jdGlvbiBBcChlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmZS4kJHR5cGVvZj09PWthfWZ1bmN0aW9uIEZFKGUpe3ZhciB0PXsiPSI6Ij0wIiwiOiI6Ij0yIn07cmV0dXJuIiQiK2UucmVwbGFjZSgvWz06XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0W25dfSl9dmFyIFZtPS9cLysvZztmdW5jdGlvbiBGZChlLHQpe3JldHVybiB0eXBlb2YgZT09Im9iamVjdCImJmUhPT1udWxsJiZlLmtleSE9bnVsbD9GRSgiIitlLmtleSk6dC50b1N0cmluZygzNil9ZnVuY3Rpb24gRXUoZSx0LG4scixvKXt2YXIgaT10eXBlb2YgZTsoaT09PSJ1bmRlZmluZWQifHxpPT09ImJvb2xlYW4iKSYmKGU9bnVsbCk7dmFyIGw9ITE7aWYoZT09PW51bGwpbD0hMDtlbHNlIHN3aXRjaChpKXtjYXNlInN0cmluZyI6Y2FzZSJudW1iZXIiOmw9ITA7YnJlYWs7Y2FzZSJvYmplY3QiOnN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIGthOmNhc2UgTkU6bD0hMH19aWYobClyZXR1cm4gbD1lLG89byhsKSxlPXI9PT0iIj8iLiIrRmQobCwwKTpyLFVtKG8pPyhuPSIiLGUhPW51bGwmJihuPWUucmVwbGFjZShWbSwiJCYvIikrIi8iKSxFdShvLHQsbiwiIixmdW5jdGlvbih1KXtyZXR1cm4gdX0pKTpvIT1udWxsJiYoQXAobykmJihvPXpFKG8sbisoIW8ua2V5fHxsJiZsLmtleT09PW8ua2V5PyIiOigiIitvLmtleSkucmVwbGFjZShWbSwiJCYvIikrIi8iKStlKSksdC5wdXNoKG8pKSwxO2lmKGw9MCxyPXI9PT0iIj8iLiI6cisiOiIsVW0oZSkpZm9yKHZhciBzPTA7czxlLmxlbmd0aDtzKyspe2k9ZVtzXTt2YXIgYT1yK0ZkKGkscyk7bCs9RXUoaSx0LG4sYSxvKX1lbHNlIGlmKGE9akUoZSksdHlwZW9mIGE9PSJmdW5jdGlvbiIpZm9yKGU9YS5jYWxsKGUpLHM9MDshKGk9ZS5uZXh0KCkpLmRvbmU7KWk9aS52YWx1ZSxhPXIrRmQoaSxzKyspLGwrPUV1KGksdCxuLGEsbyk7ZWxzZSBpZihpPT09Im9iamVjdCIpdGhyb3cgdD1TdHJpbmcoZSksRXJyb3IoIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogIisodD09PSJbb2JqZWN0IE9iamVjdF0iPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKGUpLmpvaW4oIiwgIikrIn0iOnQpKyIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuIik7cmV0dXJuIGx9ZnVuY3Rpb24gS2EoZSx0LG4pe2lmKGU9PW51bGwpcmV0dXJuIGU7dmFyIHI9W10sbz0wO3JldHVybiBFdShlLHIsIiIsIiIsZnVuY3Rpb24oaSl7cmV0dXJuIHQuY2FsbChuLGksbysrKX0pLHJ9ZnVuY3Rpb24gQkUoZSl7aWYoZS5fc3RhdHVzPT09LTEpe3ZhciB0PWUuX3Jlc3VsdDt0PXQoKSx0LnRoZW4oZnVuY3Rpb24obil7KGUuX3N0YXR1cz09PTB8fGUuX3N0YXR1cz09PS0xKSYmKGUuX3N0YXR1cz0xLGUuX3Jlc3VsdD1uKX0sZnVuY3Rpb24obil7KGUuX3N0YXR1cz09PTB8fGUuX3N0YXR1cz09PS0xKSYmKGUuX3N0YXR1cz0yLGUuX3Jlc3VsdD1uKX0pLGUuX3N0YXR1cz09PS0xJiYoZS5fc3RhdHVzPTAsZS5fcmVzdWx0PXQpfWlmKGUuX3N0YXR1cz09PTEpcmV0dXJuIGUuX3Jlc3VsdC5kZWZhdWx0O3Rocm93IGUuX3Jlc3VsdH12YXIgcm49e2N1cnJlbnQ6bnVsbH0sJHU9e3RyYW5zaXRpb246bnVsbH0sV0U9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6cm4sUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6JHUsUmVhY3RDdXJyZW50T3duZXI6T3B9O1NlLkNoaWxkcmVuPXttYXA6S2EsZm9yRWFjaDpmdW5jdGlvbihlLHQsbil7S2EoZSxmdW5jdGlvbigpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxuKX0sY291bnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9MDtyZXR1cm4gS2EoZSxmdW5jdGlvbigpe3QrK30pLHR9LHRvQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIEthKGUsZnVuY3Rpb24odCl7cmV0dXJuIHR9KXx8W119LG9ubHk6ZnVuY3Rpb24oZSl7aWYoIUFwKGUpKXRocm93IEVycm9yKCJSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4iKTtyZXR1cm4gZX19O1NlLkNvbXBvbmVudD1BbDtTZS5GcmFnbWVudD1iRTtTZS5Qcm9maWxlcj1QRTtTZS5QdXJlQ29tcG9uZW50PVJwO1NlLlN0cmljdE1vZGU9UkU7U2UuU3VzcGVuc2U9REU7U2UuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9V0U7U2UuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuKXtpZihlPT1udWxsKXRocm93IEVycm9yKCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCAiK2UrIi4iKTt2YXIgcj1YMCh7fSxlLnByb3BzKSxvPWUua2V5LGk9ZS5yZWYsbD1lLl9vd25lcjtpZih0IT1udWxsKXtpZih0LnJlZiE9PXZvaWQgMCYmKGk9dC5yZWYsbD1PcC5jdXJyZW50KSx0LmtleSE9PXZvaWQgMCYmKG89IiIrdC5rZXkpLGUudHlwZSYmZS50eXBlLmRlZmF1bHRQcm9wcyl2YXIgcz1lLnR5cGUuZGVmYXVsdFByb3BzO2ZvcihhIGluIHQpWjAuY2FsbCh0LGEpJiYhcTAuaGFzT3duUHJvcGVydHkoYSkmJihyW2FdPXRbYV09PT12b2lkIDAmJnMhPT12b2lkIDA/c1thXTp0W2FdKX12YXIgYT1hcmd1bWVudHMubGVuZ3RoLTI7aWYoYT09PTEpci5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxhKXtzPUFycmF5KGEpO2Zvcih2YXIgdT0wO3U8YTt1Kyspc1t1XT1hcmd1bWVudHNbdSsyXTtyLmNoaWxkcmVuPXN9cmV0dXJueyQkdHlwZW9mOmthLHR5cGU6ZS50eXBlLGtleTpvLHJlZjppLHByb3BzOnIsX293bmVyOmx9fTtTZS5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBlPXskJHR5cGVvZjpBRSxfY3VycmVudFZhbHVlOmUsX2N1cnJlbnRWYWx1ZTI6ZSxfdGhyZWFkQ291bnQ6MCxQcm92aWRlcjpudWxsLENvbnN1bWVyOm51bGwsX2RlZmF1bHRWYWx1ZTpudWxsLF9nbG9iYWxOYW1lOm51bGx9LGUuUHJvdmlkZXI9eyQkdHlwZW9mOk9FLF9jb250ZXh0OmV9LGUuQ29uc3VtZXI9ZX07U2UuY3JlYXRlRWxlbWVudD1lMTtTZS5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKGUpe3ZhciB0PWUxLmJpbmQobnVsbCxlKTtyZXR1cm4gdC50eXBlPWUsdH07U2UuY3JlYXRlUmVmPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbH19O1NlLmZvcndhcmRSZWY9ZnVuY3Rpb24oZSl7cmV0dXJueyQkdHlwZW9mOk1FLHJlbmRlcjplfX07U2UuaXNWYWxpZEVsZW1lbnQ9QXA7U2UubGF6eT1mdW5jdGlvbihlKXtyZXR1cm57JCR0eXBlb2Y6SUUsX3BheWxvYWQ6e19zdGF0dXM6LTEsX3Jlc3VsdDplfSxfaW5pdDpCRX19O1NlLm1lbW89ZnVuY3Rpb24oZSx0KXtyZXR1cm57JCR0eXBlb2Y6TEUsdHlwZTplLGNvbXBhcmU6dD09PXZvaWQgMD9udWxsOnR9fTtTZS5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9JHUudHJhbnNpdGlvbjskdS50cmFuc2l0aW9uPXt9O3RyeXtlKCl9ZmluYWxseXskdS50cmFuc2l0aW9uPXR9fTtTZS51bnN0YWJsZV9hY3Q9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiYWN0KC4uLikgaXMgbm90IHN1cHBvcnRlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcyBvZiBSZWFjdC4iKX07U2UudXNlQ2FsbGJhY2s9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcm4uY3VycmVudC51c2VDYWxsYmFjayhlLHQpfTtTZS51c2VDb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBybi5jdXJyZW50LnVzZUNvbnRleHQoZSl9O1NlLnVzZURlYnVnVmFsdWU9ZnVuY3Rpb24oKXt9O1NlLnVzZURlZmVycmVkVmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHJuLmN1cnJlbnQudXNlRGVmZXJyZWRWYWx1ZShlKX07U2UudXNlRWZmZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHJuLmN1cnJlbnQudXNlRWZmZWN0KGUsdCl9O1NlLnVzZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHJuLmN1cnJlbnQudXNlSWQoKX07U2UudXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHJuLmN1cnJlbnQudXNlSW1wZXJhdGl2ZUhhbmRsZShlLHQsbil9O1NlLnVzZUluc2VydGlvbkVmZmVjdD1mdW5jdGlvbihlLHQpe3JldHVybiBybi5jdXJyZW50LnVzZUluc2VydGlvbkVmZmVjdChlLHQpfTtTZS51c2VMYXlvdXRFZmZlY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcm4uY3VycmVudC51c2VMYXlvdXRFZmZlY3QoZSx0KX07U2UudXNlTWVtbz1mdW5jdGlvbihlLHQpe3JldHVybiBybi5jdXJyZW50LnVzZU1lbW8oZSx0KX07U2UudXNlUmVkdWNlcj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHJuLmN1cnJlbnQudXNlUmVkdWNlcihlLHQsbil9O1NlLnVzZVJlZj1mdW5jdGlvbihlKXtyZXR1cm4gcm4uY3VycmVudC51c2VSZWYoZSl9O1NlLnVzZVN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiBybi5jdXJyZW50LnVzZVN0YXRlKGUpfTtTZS51c2VTeW5jRXh0ZXJuYWxTdG9yZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHJuLmN1cnJlbnQudXNlU3luY0V4dGVybmFsU3RvcmUoZSx0LG4pfTtTZS51c2VUcmFuc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHJuLmN1cnJlbnQudXNlVHJhbnNpdGlvbigpfTtTZS52ZXJzaW9uPSIxOC4yLjAiO0cwLmV4cG9ydHM9U2U7dmFyIHA9RzAuZXhwb3J0cztjb25zdCBxPSRhKHApLHQxPVRFKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0OnF9LFtwXSk7dmFyIERmPXt9LG4xPXtleHBvcnRzOnt9fSxUbj17fSxyMT17ZXhwb3J0czp7fX0sbzE9e307LyoqCiAqIEBsaWNlbnNlIFJlYWN0CiAqIHNjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcwogKgogKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICovKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoayxJKXt2YXIgTD1rLmxlbmd0aDtrLnB1c2goSSk7ZTpmb3IoOzA8TDspe3ZhciBWPUwtMT4+PjEsdGU9a1tWXTtpZigwPG8odGUsSSkpa1tWXT1JLGtbTF09dGUsTD1WO2Vsc2UgYnJlYWsgZX19ZnVuY3Rpb24gbihrKXtyZXR1cm4gay5sZW5ndGg9PT0wP251bGw6a1swXX1mdW5jdGlvbiByKGspe2lmKGsubGVuZ3RoPT09MClyZXR1cm4gbnVsbDt2YXIgST1rWzBdLEw9ay5wb3AoKTtpZihMIT09SSl7a1swXT1MO2U6Zm9yKHZhciBWPTAsdGU9ay5sZW5ndGgseWU9dGU+Pj4xO1Y8eWU7KXt2YXIgZmU9MiooVisxKS0xLE9lPWtbZmVdLGJlPWZlKzEsWj1rW2JlXTtpZigwPm8oT2UsTCkpYmU8dGUmJjA+byhaLE9lKT8oa1tWXT1aLGtbYmVdPUwsVj1iZSk6KGtbVl09T2Usa1tmZV09TCxWPWZlKTtlbHNlIGlmKGJlPHRlJiYwPm8oWixMKSlrW1ZdPVosa1tiZV09TCxWPWJlO2Vsc2UgYnJlYWsgZX19cmV0dXJuIEl9ZnVuY3Rpb24gbyhrLEkpe3ZhciBMPWsuc29ydEluZGV4LUkuc29ydEluZGV4O3JldHVybiBMIT09MD9MOmsuaWQtSS5pZH1pZih0eXBlb2YgcGVyZm9ybWFuY2U9PSJvYmplY3QiJiZ0eXBlb2YgcGVyZm9ybWFuY2Uubm93PT0iZnVuY3Rpb24iKXt2YXIgaT1wZXJmb3JtYW5jZTtlLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBpLm5vdygpfX1lbHNle3ZhciBsPURhdGUscz1sLm5vdygpO2UudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIGwubm93KCktc319dmFyIGE9W10sdT1bXSxjPTEsZD1udWxsLGY9MyxoPSExLGc9ITEsbT0hMSxTPXR5cGVvZiBzZXRUaW1lb3V0PT0iZnVuY3Rpb24iP3NldFRpbWVvdXQ6bnVsbCx2PXR5cGVvZiBjbGVhclRpbWVvdXQ9PSJmdW5jdGlvbiI/Y2xlYXJUaW1lb3V0Om51bGwseT10eXBlb2Ygc2V0SW1tZWRpYXRlPCJ1Ij9zZXRJbW1lZGlhdGU6bnVsbDt0eXBlb2YgbmF2aWdhdG9yPCJ1IiYmbmF2aWdhdG9yLnNjaGVkdWxpbmchPT12b2lkIDAmJm5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nIT09dm9pZCAwJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZy5iaW5kKG5hdmlnYXRvci5zY2hlZHVsaW5nKTtmdW5jdGlvbiBfKGspe2Zvcih2YXIgST1uKHUpO0khPT1udWxsOyl7aWYoSS5jYWxsYmFjaz09PW51bGwpcih1KTtlbHNlIGlmKEkuc3RhcnRUaW1lPD1rKXIodSksSS5zb3J0SW5kZXg9SS5leHBpcmF0aW9uVGltZSx0KGEsSSk7ZWxzZSBicmVhaztJPW4odSl9fWZ1bmN0aW9uIHcoayl7aWYobT0hMSxfKGspLCFnKWlmKG4oYSkhPT1udWxsKWc9ITAsUChDKTtlbHNle3ZhciBJPW4odSk7SSE9PW51bGwmJk8odyxJLnN0YXJ0VGltZS1rKX19ZnVuY3Rpb24gQyhrLEkpe2c9ITEsbSYmKG09ITEsdihUKSxUPS0xKSxoPSEwO3ZhciBMPWY7dHJ5e2ZvcihfKEkpLGQ9bihhKTtkIT09bnVsbCYmKCEoZC5leHBpcmF0aW9uVGltZT5JKXx8ayYmIWooKSk7KXt2YXIgVj1kLmNhbGxiYWNrO2lmKHR5cGVvZiBWPT0iZnVuY3Rpb24iKXtkLmNhbGxiYWNrPW51bGwsZj1kLnByaW9yaXR5TGV2ZWw7dmFyIHRlPVYoZC5leHBpcmF0aW9uVGltZTw9SSk7ST1lLnVuc3RhYmxlX25vdygpLHR5cGVvZiB0ZT09ImZ1bmN0aW9uIj9kLmNhbGxiYWNrPXRlOmQ9PT1uKGEpJiZyKGEpLF8oSSl9ZWxzZSByKGEpO2Q9bihhKX1pZihkIT09bnVsbCl2YXIgeWU9ITA7ZWxzZXt2YXIgZmU9bih1KTtmZSE9PW51bGwmJk8odyxmZS5zdGFydFRpbWUtSSkseWU9ITF9cmV0dXJuIHllfWZpbmFsbHl7ZD1udWxsLGY9TCxoPSExfX12YXIgJD0hMSxFPW51bGwsVD0tMSxNPTUsUj0tMTtmdW5jdGlvbiBqKCl7cmV0dXJuIShlLnVuc3RhYmxlX25vdygpLVI8TSl9ZnVuY3Rpb24gRigpe2lmKEUhPT1udWxsKXt2YXIgaz1lLnVuc3RhYmxlX25vdygpO1I9azt2YXIgST0hMDt0cnl7ST1FKCEwLGspfWZpbmFsbHl7ST9hZSgpOigkPSExLEU9bnVsbCl9fWVsc2UgJD0hMX12YXIgYWU7aWYodHlwZW9mIHk9PSJmdW5jdGlvbiIpYWU9ZnVuY3Rpb24oKXt5KEYpfTtlbHNlIGlmKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbDwidSIpe3ZhciBIPW5ldyBNZXNzYWdlQ2hhbm5lbCxYPUgucG9ydDI7SC5wb3J0MS5vbm1lc3NhZ2U9RixhZT1mdW5jdGlvbigpe1gucG9zdE1lc3NhZ2UobnVsbCl9fWVsc2UgYWU9ZnVuY3Rpb24oKXtTKEYsMCl9O2Z1bmN0aW9uIFAoayl7RT1rLCR8fCgkPSEwLGFlKCkpfWZ1bmN0aW9uIE8oayxJKXtUPVMoZnVuY3Rpb24oKXtrKGUudW5zdGFibGVfbm93KCkpfSxJKX1lLnVuc3RhYmxlX0lkbGVQcmlvcml0eT01LGUudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHk9MSxlLnVuc3RhYmxlX0xvd1ByaW9yaXR5PTQsZS51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eT0zLGUudW5zdGFibGVfUHJvZmlsaW5nPW51bGwsZS51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eT0yLGUudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oayl7ay5jYWxsYmFjaz1udWxsfSxlLnVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7Z3x8aHx8KGc9ITAsUChDKSl9LGUudW5zdGFibGVfZm9yY2VGcmFtZVJhdGU9ZnVuY3Rpb24oayl7MD5rfHwxMjU8az9jb25zb2xlLmVycm9yKCJmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgZm9yY2luZyBmcmFtZSByYXRlcyBoaWdoZXIgdGhhbiAxMjUgZnBzIGlzIG5vdCBzdXBwb3J0ZWQiKTpNPTA8az9NYXRoLmZsb29yKDFlMy9rKTo1fSxlLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIGZ9LGUudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gbihhKX0sZS51bnN0YWJsZV9uZXh0PWZ1bmN0aW9uKGspe3N3aXRjaChmKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzp2YXIgST0zO2JyZWFrO2RlZmF1bHQ6ST1mfXZhciBMPWY7Zj1JO3RyeXtyZXR1cm4gaygpfWZpbmFsbHl7Zj1MfX0sZS51bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbj1mdW5jdGlvbigpe30sZS51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ9ZnVuY3Rpb24oKXt9LGUudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5PWZ1bmN0aW9uKGssSSl7c3dpdGNoKGspe2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOmNhc2UgNDpjYXNlIDU6YnJlYWs7ZGVmYXVsdDprPTN9dmFyIEw9ZjtmPWs7dHJ5e3JldHVybiBJKCl9ZmluYWxseXtmPUx9fSxlLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s9ZnVuY3Rpb24oayxJLEwpe3ZhciBWPWUudW5zdGFibGVfbm93KCk7c3dpdGNoKHR5cGVvZiBMPT0ib2JqZWN0IiYmTCE9PW51bGw/KEw9TC5kZWxheSxMPXR5cGVvZiBMPT0ibnVtYmVyIiYmMDxMP1YrTDpWKTpMPVYsayl7Y2FzZSAxOnZhciB0ZT0tMTticmVhaztjYXNlIDI6dGU9MjUwO2JyZWFrO2Nhc2UgNTp0ZT0xMDczNzQxODIzO2JyZWFrO2Nhc2UgNDp0ZT0xZTQ7YnJlYWs7ZGVmYXVsdDp0ZT01ZTN9cmV0dXJuIHRlPUwrdGUsaz17aWQ6YysrLGNhbGxiYWNrOkkscHJpb3JpdHlMZXZlbDprLHN0YXJ0VGltZTpMLGV4cGlyYXRpb25UaW1lOnRlLHNvcnRJbmRleDotMX0sTD5WPyhrLnNvcnRJbmRleD1MLHQodSxrKSxuKGEpPT09bnVsbCYmaz09PW4odSkmJihtPyh2KFQpLFQ9LTEpOm09ITAsTyh3LEwtVikpKTooay5zb3J0SW5kZXg9dGUsdChhLGspLGd8fGh8fChnPSEwLFAoQykpKSxrfSxlLnVuc3RhYmxlX3Nob3VsZFlpZWxkPWosZS51bnN0YWJsZV93cmFwQ2FsbGJhY2s9ZnVuY3Rpb24oayl7dmFyIEk9ZjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgTD1mO2Y9STt0cnl7cmV0dXJuIGsuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7Zj1MfX19fSkobzEpO3IxLmV4cG9ydHM9bzE7dmFyIFVFPXIxLmV4cG9ydHM7LyoqCiAqIEBsaWNlbnNlIFJlYWN0CiAqIHJlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcwogKgogKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICovdmFyIGkxPXAsRW49VUU7ZnVuY3Rpb24gVyhlKXtmb3IodmFyIHQ9Imh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PSIrZSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0Kz0iJmFyZ3NbXT0iK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbbl0pO3JldHVybiJNaW5pZmllZCBSZWFjdCBlcnJvciAjIitlKyI7IHZpc2l0ICIrdCsiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4ifXZhciBsMT1uZXcgU2V0LEdzPXt9O2Z1bmN0aW9uIHhpKGUsdCl7dmwoZSx0KSx2bChlKyJDYXB0dXJlIix0KX1mdW5jdGlvbiB2bChlLHQpe2ZvcihHc1tlXT10LGU9MDtlPHQubGVuZ3RoO2UrKylsMS5hZGQodFtlXSl9dmFyIElyPSEodHlwZW9mIHdpbmRvdz4idSJ8fHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ+InUifHx0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ+InUiKSxMZj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFZFPS9eWzpBLVpfYS16XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMkZGXHUwMzcwLVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkRdWzpBLVpfYS16XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMkZGXHUwMzcwLVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkRcLS4wLTlcdTAwQjdcdTAzMDAtXHUwMzZGXHUyMDNGLVx1MjA0MF0qJC8sSG09e30sS209e307ZnVuY3Rpb24gSEUoZSl7cmV0dXJuIExmLmNhbGwoS20sZSk/ITA6TGYuY2FsbChIbSxlKT8hMTpWRS50ZXN0KGUpP0ttW2VdPSEwOihIbVtlXT0hMCwhMSl9ZnVuY3Rpb24gS0UoZSx0LG4scil7aWYobiE9PW51bGwmJm4udHlwZT09PTApcmV0dXJuITE7c3dpdGNoKHR5cGVvZiB0KXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6cmV0dXJuITA7Y2FzZSJib29sZWFuIjpyZXR1cm4gcj8hMTpuIT09bnVsbD8hbi5hY2NlcHRzQm9vbGVhbnM6KGU9ZS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNSksZSE9PSJkYXRhLSImJmUhPT0iYXJpYS0iKTtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBHRShlLHQsbixyKXtpZih0PT09bnVsbHx8dHlwZW9mIHQ+InUifHxLRShlLHQsbixyKSlyZXR1cm4hMDtpZihyKXJldHVybiExO2lmKG4hPT1udWxsKXN3aXRjaChuLnR5cGUpe2Nhc2UgMzpyZXR1cm4hdDtjYXNlIDQ6cmV0dXJuIHQ9PT0hMTtjYXNlIDU6cmV0dXJuIGlzTmFOKHQpO2Nhc2UgNjpyZXR1cm4gaXNOYU4odCl8fDE+dH1yZXR1cm4hMX1mdW5jdGlvbiBvbihlLHQsbixyLG8saSxsKXt0aGlzLmFjY2VwdHNCb29sZWFucz10PT09Mnx8dD09PTN8fHQ9PT00LHRoaXMuYXR0cmlidXRlTmFtZT1yLHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlPW8sdGhpcy5tdXN0VXNlUHJvcGVydHk9bix0aGlzLnByb3BlcnR5TmFtZT1lLHRoaXMudHlwZT10LHRoaXMuc2FuaXRpemVVUkw9aSx0aGlzLnJlbW92ZUVtcHR5U3RyaW5nPWx9dmFyIEx0PXt9OyJjaGlsZHJlbiBkYW5nZXJvdXNseVNldElubmVySFRNTCBkZWZhdWx0VmFsdWUgZGVmYXVsdENoZWNrZWQgaW5uZXJIVE1MIHN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyBzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcgc3R5bGUiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXtMdFtlXT1uZXcgb24oZSwwLCExLGUsbnVsbCwhMSwhMSl9KTtbWyJhY2NlcHRDaGFyc2V0IiwiYWNjZXB0LWNoYXJzZXQiXSxbImNsYXNzTmFtZSIsImNsYXNzIl0sWyJodG1sRm9yIiwiZm9yIl0sWyJodHRwRXF1aXYiLCJodHRwLWVxdWl2Il1dLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtMdFt0XT1uZXcgb24odCwxLCExLGVbMV0sbnVsbCwhMSwhMSl9KTtbImNvbnRlbnRFZGl0YWJsZSIsImRyYWdnYWJsZSIsInNwZWxsQ2hlY2siLCJ2YWx1ZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7THRbZV09bmV3IG9uKGUsMiwhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTtbImF1dG9SZXZlcnNlIiwiZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCIsImZvY3VzYWJsZSIsInByZXNlcnZlQWxwaGEiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0x0W2VdPW5ldyBvbihlLDIsITEsZSxudWxsLCExLCExKX0pOyJhbGxvd0Z1bGxTY3JlZW4gYXN5bmMgYXV0b0ZvY3VzIGF1dG9QbGF5IGNvbnRyb2xzIGRlZmF1bHQgZGVmZXIgZGlzYWJsZWQgZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgZGlzYWJsZVJlbW90ZVBsYXliYWNrIGZvcm1Ob1ZhbGlkYXRlIGhpZGRlbiBsb29wIG5vTW9kdWxlIG5vVmFsaWRhdGUgb3BlbiBwbGF5c0lubGluZSByZWFkT25seSByZXF1aXJlZCByZXZlcnNlZCBzY29wZWQgc2VhbWxlc3MgaXRlbVNjb3BlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7THRbZV09bmV3IG9uKGUsMywhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTtbImNoZWNrZWQiLCJtdWx0aXBsZSIsIm11dGVkIiwic2VsZWN0ZWQiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0x0W2VdPW5ldyBvbihlLDMsITAsZSxudWxsLCExLCExKX0pO1siY2FwdHVyZSIsImRvd25sb2FkIl0uZm9yRWFjaChmdW5jdGlvbihlKXtMdFtlXT1uZXcgb24oZSw0LCExLGUsbnVsbCwhMSwhMSl9KTtbImNvbHMiLCJyb3dzIiwic2l6ZSIsInNwYW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0x0W2VdPW5ldyBvbihlLDYsITEsZSxudWxsLCExLCExKX0pO1sicm93U3BhbiIsInN0YXJ0Il0uZm9yRWFjaChmdW5jdGlvbihlKXtMdFtlXT1uZXcgb24oZSw1LCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO3ZhciBNcD0vW1wtOl0oW2Etel0pL2c7ZnVuY3Rpb24gRHAoZSl7cmV0dXJuIGVbMV0udG9VcHBlckNhc2UoKX0iYWNjZW50LWhlaWdodCBhbGlnbm1lbnQtYmFzZWxpbmUgYXJhYmljLWZvcm0gYmFzZWxpbmUtc2hpZnQgY2FwLWhlaWdodCBjbGlwLXBhdGggY2xpcC1ydWxlIGNvbG9yLWludGVycG9sYXRpb24gY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIGNvbG9yLXByb2ZpbGUgY29sb3ItcmVuZGVyaW5nIGRvbWluYW50LWJhc2VsaW5lIGVuYWJsZS1iYWNrZ3JvdW5kIGZpbGwtb3BhY2l0eSBmaWxsLXJ1bGUgZmxvb2QtY29sb3IgZmxvb2Qtb3BhY2l0eSBmb250LWZhbWlseSBmb250LXNpemUgZm9udC1zaXplLWFkanVzdCBmb250LXN0cmV0Y2ggZm9udC1zdHlsZSBmb250LXZhcmlhbnQgZm9udC13ZWlnaHQgZ2x5cGgtbmFtZSBnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIGdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIGhvcml6LWFkdi14IGhvcml6LW9yaWdpbi14IGltYWdlLXJlbmRlcmluZyBsZXR0ZXItc3BhY2luZyBsaWdodGluZy1jb2xvciBtYXJrZXItZW5kIG1hcmtlci1taWQgbWFya2VyLXN0YXJ0IG92ZXJsaW5lLXBvc2l0aW9uIG92ZXJsaW5lLXRoaWNrbmVzcyBwYWludC1vcmRlciBwYW5vc2UtMSBwb2ludGVyLWV2ZW50cyByZW5kZXJpbmctaW50ZW50IHNoYXBlLXJlbmRlcmluZyBzdG9wLWNvbG9yIHN0b3Atb3BhY2l0eSBzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIHN0cmlrZXRocm91Z2gtdGhpY2tuZXNzIHN0cm9rZS1kYXNoYXJyYXkgc3Ryb2tlLWRhc2hvZmZzZXQgc3Ryb2tlLWxpbmVjYXAgc3Ryb2tlLWxpbmVqb2luIHN0cm9rZS1taXRlcmxpbWl0IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCB0ZXh0LWFuY2hvciB0ZXh0LWRlY29yYXRpb24gdGV4dC1yZW5kZXJpbmcgdW5kZXJsaW5lLXBvc2l0aW9uIHVuZGVybGluZS10aGlja25lc3MgdW5pY29kZS1iaWRpIHVuaWNvZGUtcmFuZ2UgdW5pdHMtcGVyLWVtIHYtYWxwaGFiZXRpYyB2LWhhbmdpbmcgdi1pZGVvZ3JhcGhpYyB2LW1hdGhlbWF0aWNhbCB2ZWN0b3ItZWZmZWN0IHZlcnQtYWR2LXkgdmVydC1vcmlnaW4teCB2ZXJ0LW9yaWdpbi15IHdvcmQtc3BhY2luZyB3cml0aW5nLW1vZGUgeG1sbnM6eGxpbmsgeC1oZWlnaHQiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoTXAsRHApO0x0W3RdPW5ldyBvbih0LDEsITEsZSxudWxsLCExLCExKX0pOyJ4bGluazphY3R1YXRlIHhsaW5rOmFyY3JvbGUgeGxpbms6cm9sZSB4bGluazpzaG93IHhsaW5rOnRpdGxlIHhsaW5rOnR5cGUiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoTXAsRHApO0x0W3RdPW5ldyBvbih0LDEsITEsZSwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsITEsITEpfSk7WyJ4bWw6YmFzZSIsInhtbDpsYW5nIiwieG1sOnNwYWNlIl0uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoTXAsRHApO0x0W3RdPW5ldyBvbih0LDEsITEsZSwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwhMSwhMSl9KTtbInRhYkluZGV4IiwiY3Jvc3NPcmlnaW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0x0W2VdPW5ldyBvbihlLDEsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7THQueGxpbmtIcmVmPW5ldyBvbigieGxpbmtIcmVmIiwxLCExLCJ4bGluazpocmVmIiwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsITAsITEpO1sic3JjIiwiaHJlZiIsImFjdGlvbiIsImZvcm1BY3Rpb24iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0x0W2VdPW5ldyBvbihlLDEsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITAsITApfSk7ZnVuY3Rpb24gTHAoZSx0LG4scil7dmFyIG89THQuaGFzT3duUHJvcGVydHkodCk/THRbdF06bnVsbDsobyE9PW51bGw/by50eXBlIT09MDpyfHwhKDI8dC5sZW5ndGgpfHx0WzBdIT09Im8iJiZ0WzBdIT09Ik8ifHx0WzFdIT09Im4iJiZ0WzFdIT09Ik4iKSYmKEdFKHQsbixvLHIpJiYobj1udWxsKSxyfHxvPT09bnVsbD9IRSh0KSYmKG49PT1udWxsP2UucmVtb3ZlQXR0cmlidXRlKHQpOmUuc2V0QXR0cmlidXRlKHQsIiIrbikpOm8ubXVzdFVzZVByb3BlcnR5P2Vbby5wcm9wZXJ0eU5hbWVdPW49PT1udWxsP28udHlwZT09PTM/ITE6IiI6bjoodD1vLmF0dHJpYnV0ZU5hbWUscj1vLmF0dHJpYnV0ZU5hbWVzcGFjZSxuPT09bnVsbD9lLnJlbW92ZUF0dHJpYnV0ZSh0KToobz1vLnR5cGUsbj1vPT09M3x8bz09PTQmJm49PT0hMD8iIjoiIituLHI/ZS5zZXRBdHRyaWJ1dGVOUyhyLHQsbik6ZS5zZXRBdHRyaWJ1dGUodCxuKSkpKX12YXIgVnI9aTEuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQsR2E9U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLFVpPVN5bWJvbC5mb3IoInJlYWN0LnBvcnRhbCIpLFZpPVN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50IiksSXA9U3ltYm9sLmZvcigicmVhY3Quc3RyaWN0X21vZGUiKSxJZj1TeW1ib2wuZm9yKCJyZWFjdC5wcm9maWxlciIpLHMxPVN5bWJvbC5mb3IoInJlYWN0LnByb3ZpZGVyIiksYTE9U3ltYm9sLmZvcigicmVhY3QuY29udGV4dCIpLGpwPVN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIiksamY9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2UiKSx6Zj1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZV9saXN0IiksenA9U3ltYm9sLmZvcigicmVhY3QubWVtbyIpLGxvPVN5bWJvbC5mb3IoInJlYWN0LmxhenkiKSx1MT1TeW1ib2wuZm9yKCJyZWFjdC5vZmZzY3JlZW4iKSxHbT1TeW1ib2wuaXRlcmF0b3I7ZnVuY3Rpb24gdHMoZSl7cmV0dXJuIGU9PT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCI/bnVsbDooZT1HbSYmZVtHbV18fGVbIkBAaXRlcmF0b3IiXSx0eXBlb2YgZT09ImZ1bmN0aW9uIj9lOm51bGwpfXZhciB0dD1PYmplY3QuYXNzaWduLEJkO2Z1bmN0aW9uIG1zKGUpe2lmKEJkPT09dm9pZCAwKXRyeXt0aHJvdyBFcnJvcigpfWNhdGNoKG4pe3ZhciB0PW4uc3RhY2sudHJpbSgpLm1hdGNoKC9cbiggKihhdCApPykvKTtCZD10JiZ0WzFdfHwiIn1yZXR1cm5gCmArQmQrZX12YXIgV2Q9ITE7ZnVuY3Rpb24gVWQoZSx0KXtpZighZXx8V2QpcmV0dXJuIiI7V2Q9ITA7dmFyIG49RXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7RXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9dm9pZCAwO3RyeXtpZih0KWlmKHQ9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInByb3BzIix7c2V0OmZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKX19KSx0eXBlb2YgUmVmbGVjdD09Im9iamVjdCImJlJlZmxlY3QuY29uc3RydWN0KXt0cnl7UmVmbGVjdC5jb25zdHJ1Y3QodCxbXSl9Y2F0Y2godSl7dmFyIHI9dX1SZWZsZWN0LmNvbnN0cnVjdChlLFtdLHQpfWVsc2V7dHJ5e3QuY2FsbCgpfWNhdGNoKHUpe3I9dX1lLmNhbGwodC5wcm90b3R5cGUpfWVsc2V7dHJ5e3Rocm93IEVycm9yKCl9Y2F0Y2godSl7cj11fWUoKX19Y2F0Y2godSl7aWYodSYmciYmdHlwZW9mIHUuc3RhY2s9PSJzdHJpbmciKXtmb3IodmFyIG89dS5zdGFjay5zcGxpdChgCmApLGk9ci5zdGFjay5zcGxpdChgCmApLGw9by5sZW5ndGgtMSxzPWkubGVuZ3RoLTE7MTw9bCYmMDw9cyYmb1tsXSE9PWlbc107KXMtLTtmb3IoOzE8PWwmJjA8PXM7bC0tLHMtLSlpZihvW2xdIT09aVtzXSl7aWYobCE9PTF8fHMhPT0xKWRvIGlmKGwtLSxzLS0sMD5zfHxvW2xdIT09aVtzXSl7dmFyIGE9YApgK29bbF0ucmVwbGFjZSgiIGF0IG5ldyAiLCIgYXQgIik7cmV0dXJuIGUuZGlzcGxheU5hbWUmJmEuaW5jbHVkZXMoIjxhbm9ueW1vdXM+IikmJihhPWEucmVwbGFjZSgiPGFub255bW91cz4iLGUuZGlzcGxheU5hbWUpKSxhfXdoaWxlKDE8PWwmJjA8PXMpO2JyZWFrfX19ZmluYWxseXtXZD0hMSxFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT1ufXJldHVybihlPWU/ZS5kaXNwbGF5TmFtZXx8ZS5uYW1lOiIiKT9tcyhlKToiIn1mdW5jdGlvbiBZRShlKXtzd2l0Y2goZS50YWcpe2Nhc2UgNTpyZXR1cm4gbXMoZS50eXBlKTtjYXNlIDE2OnJldHVybiBtcygiTGF6eSIpO2Nhc2UgMTM6cmV0dXJuIG1zKCJTdXNwZW5zZSIpO2Nhc2UgMTk6cmV0dXJuIG1zKCJTdXNwZW5zZUxpc3QiKTtjYXNlIDA6Y2FzZSAyOmNhc2UgMTU6cmV0dXJuIGU9VWQoZS50eXBlLCExKSxlO2Nhc2UgMTE6cmV0dXJuIGU9VWQoZS50eXBlLnJlbmRlciwhMSksZTtjYXNlIDE6cmV0dXJuIGU9VWQoZS50eXBlLCEwKSxlO2RlZmF1bHQ6cmV0dXJuIiJ9fWZ1bmN0aW9uIEZmKGUpe2lmKGU9PW51bGwpcmV0dXJuIG51bGw7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIGUuZGlzcGxheU5hbWV8fGUubmFtZXx8bnVsbDtpZih0eXBlb2YgZT09InN0cmluZyIpcmV0dXJuIGU7c3dpdGNoKGUpe2Nhc2UgVmk6cmV0dXJuIkZyYWdtZW50IjtjYXNlIFVpOnJldHVybiJQb3J0YWwiO2Nhc2UgSWY6cmV0dXJuIlByb2ZpbGVyIjtjYXNlIElwOnJldHVybiJTdHJpY3RNb2RlIjtjYXNlIGpmOnJldHVybiJTdXNwZW5zZSI7Y2FzZSB6ZjpyZXR1cm4iU3VzcGVuc2VMaXN0In1pZih0eXBlb2YgZT09Im9iamVjdCIpc3dpdGNoKGUuJCR0eXBlb2Ype2Nhc2UgYTE6cmV0dXJuKGUuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Db25zdW1lciI7Y2FzZSBzMTpyZXR1cm4oZS5fY29udGV4dC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLlByb3ZpZGVyIjtjYXNlIGpwOnZhciB0PWUucmVuZGVyO3JldHVybiBlPWUuZGlzcGxheU5hbWUsZXx8KGU9dC5kaXNwbGF5TmFtZXx8dC5uYW1lfHwiIixlPWUhPT0iIj8iRm9yd2FyZFJlZigiK2UrIikiOiJGb3J3YXJkUmVmIiksZTtjYXNlIHpwOnJldHVybiB0PWUuZGlzcGxheU5hbWV8fG51bGwsdCE9PW51bGw/dDpGZihlLnR5cGUpfHwiTWVtbyI7Y2FzZSBsbzp0PWUuX3BheWxvYWQsZT1lLl9pbml0O3RyeXtyZXR1cm4gRmYoZSh0KSl9Y2F0Y2h7fX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBYRShlKXt2YXIgdD1lLnR5cGU7c3dpdGNoKGUudGFnKXtjYXNlIDI0OnJldHVybiJDYWNoZSI7Y2FzZSA5OnJldHVybih0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuQ29uc3VtZXIiO2Nhc2UgMTA6cmV0dXJuKHQuX2NvbnRleHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Qcm92aWRlciI7Y2FzZSAxODpyZXR1cm4iRGVoeWRyYXRlZEZyYWdtZW50IjtjYXNlIDExOnJldHVybiBlPXQucmVuZGVyLGU9ZS5kaXNwbGF5TmFtZXx8ZS5uYW1lfHwiIix0LmRpc3BsYXlOYW1lfHwoZSE9PSIiPyJGb3J3YXJkUmVmKCIrZSsiKSI6IkZvcndhcmRSZWYiKTtjYXNlIDc6cmV0dXJuIkZyYWdtZW50IjtjYXNlIDU6cmV0dXJuIHQ7Y2FzZSA0OnJldHVybiJQb3J0YWwiO2Nhc2UgMzpyZXR1cm4iUm9vdCI7Y2FzZSA2OnJldHVybiJUZXh0IjtjYXNlIDE2OnJldHVybiBGZih0KTtjYXNlIDg6cmV0dXJuIHQ9PT1JcD8iU3RyaWN0TW9kZSI6Ik1vZGUiO2Nhc2UgMjI6cmV0dXJuIk9mZnNjcmVlbiI7Y2FzZSAxMjpyZXR1cm4iUHJvZmlsZXIiO2Nhc2UgMjE6cmV0dXJuIlNjb3BlIjtjYXNlIDEzOnJldHVybiJTdXNwZW5zZSI7Y2FzZSAxOTpyZXR1cm4iU3VzcGVuc2VMaXN0IjtjYXNlIDI1OnJldHVybiJUcmFjaW5nTWFya2VyIjtjYXNlIDE6Y2FzZSAwOmNhc2UgMTc6Y2FzZSAyOmNhc2UgMTQ6Y2FzZSAxNTppZih0eXBlb2YgdD09ImZ1bmN0aW9uIilyZXR1cm4gdC5kaXNwbGF5TmFtZXx8dC5uYW1lfHxudWxsO2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gdH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBUbyhlKXtzd2l0Y2godHlwZW9mIGUpe2Nhc2UiYm9vbGVhbiI6Y2FzZSJudW1iZXIiOmNhc2Uic3RyaW5nIjpjYXNlInVuZGVmaW5lZCI6cmV0dXJuIGU7Y2FzZSJvYmplY3QiOnJldHVybiBlO2RlZmF1bHQ6cmV0dXJuIiJ9fWZ1bmN0aW9uIGMxKGUpe3ZhciB0PWUudHlwZTtyZXR1cm4oZT1lLm5vZGVOYW1lKSYmZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmKHQ9PT0iY2hlY2tib3gifHx0PT09InJhZGlvIil9ZnVuY3Rpb24gUUUoZSl7dmFyIHQ9YzEoZSk/ImNoZWNrZWQiOiJ2YWx1ZSIsbj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUuY29uc3RydWN0b3IucHJvdG90eXBlLHQpLHI9IiIrZVt0XTtpZighZS5oYXNPd25Qcm9wZXJ0eSh0KSYmdHlwZW9mIG48InUiJiZ0eXBlb2Ygbi5nZXQ9PSJmdW5jdGlvbiImJnR5cGVvZiBuLnNldD09ImZ1bmN0aW9uIil7dmFyIG89bi5nZXQsaT1uLnNldDtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvLmNhbGwodGhpcyl9LHNldDpmdW5jdGlvbihsKXtyPSIiK2wsaS5jYWxsKHRoaXMsbCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTpuLmVudW1lcmFibGV9KSx7Z2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gcn0sc2V0VmFsdWU6ZnVuY3Rpb24obCl7cj0iIitsfSxzdG9wVHJhY2tpbmc6ZnVuY3Rpb24oKXtlLl92YWx1ZVRyYWNrZXI9bnVsbCxkZWxldGUgZVt0XX19fX1mdW5jdGlvbiBZYShlKXtlLl92YWx1ZVRyYWNrZXJ8fChlLl92YWx1ZVRyYWNrZXI9UUUoZSkpfWZ1bmN0aW9uIGQxKGUpe2lmKCFlKXJldHVybiExO3ZhciB0PWUuX3ZhbHVlVHJhY2tlcjtpZighdClyZXR1cm4hMDt2YXIgbj10LmdldFZhbHVlKCkscj0iIjtyZXR1cm4gZSYmKHI9YzEoZSk/ZS5jaGVja2VkPyJ0cnVlIjoiZmFsc2UiOmUudmFsdWUpLGU9cixlIT09bj8odC5zZXRWYWx1ZShlKSwhMCk6ITF9ZnVuY3Rpb24gVnUoZSl7aWYoZT1lfHwodHlwZW9mIGRvY3VtZW50PCJ1Ij9kb2N1bWVudDp2b2lkIDApLHR5cGVvZiBlPiJ1IilyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIGUuYWN0aXZlRWxlbWVudHx8ZS5ib2R5fWNhdGNoe3JldHVybiBlLmJvZHl9fWZ1bmN0aW9uIEJmKGUsdCl7dmFyIG49dC5jaGVja2VkO3JldHVybiB0dCh7fSx0LHtkZWZhdWx0Q2hlY2tlZDp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCx2YWx1ZTp2b2lkIDAsY2hlY2tlZDpuPz9lLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWR9KX1mdW5jdGlvbiBZbShlLHQpe3ZhciBuPXQuZGVmYXVsdFZhbHVlPT1udWxsPyIiOnQuZGVmYXVsdFZhbHVlLHI9dC5jaGVja2VkIT1udWxsP3QuY2hlY2tlZDp0LmRlZmF1bHRDaGVja2VkO249VG8odC52YWx1ZSE9bnVsbD90LnZhbHVlOm4pLGUuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbENoZWNrZWQ6cixpbml0aWFsVmFsdWU6bixjb250cm9sbGVkOnQudHlwZT09PSJjaGVja2JveCJ8fHQudHlwZT09PSJyYWRpbyI/dC5jaGVja2VkIT1udWxsOnQudmFsdWUhPW51bGx9fWZ1bmN0aW9uIGYxKGUsdCl7dD10LmNoZWNrZWQsdCE9bnVsbCYmTHAoZSwiY2hlY2tlZCIsdCwhMSl9ZnVuY3Rpb24gV2YoZSx0KXtmMShlLHQpO3ZhciBuPVRvKHQudmFsdWUpLHI9dC50eXBlO2lmKG4hPW51bGwpcj09PSJudW1iZXIiPyhuPT09MCYmZS52YWx1ZT09PSIifHxlLnZhbHVlIT1uKSYmKGUudmFsdWU9IiIrbik6ZS52YWx1ZSE9PSIiK24mJihlLnZhbHVlPSIiK24pO2Vsc2UgaWYocj09PSJzdWJtaXQifHxyPT09InJlc2V0Iil7ZS5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik7cmV0dXJufXQuaGFzT3duUHJvcGVydHkoInZhbHVlIik/VWYoZSx0LnR5cGUsbik6dC5oYXNPd25Qcm9wZXJ0eSgiZGVmYXVsdFZhbHVlIikmJlVmKGUsdC50eXBlLFRvKHQuZGVmYXVsdFZhbHVlKSksdC5jaGVja2VkPT1udWxsJiZ0LmRlZmF1bHRDaGVja2VkIT1udWxsJiYoZS5kZWZhdWx0Q2hlY2tlZD0hIXQuZGVmYXVsdENoZWNrZWQpfWZ1bmN0aW9uIFhtKGUsdCxuKXtpZih0Lmhhc093blByb3BlcnR5KCJ2YWx1ZSIpfHx0Lmhhc093blByb3BlcnR5KCJkZWZhdWx0VmFsdWUiKSl7dmFyIHI9dC50eXBlO2lmKCEociE9PSJzdWJtaXQiJiZyIT09InJlc2V0Inx8dC52YWx1ZSE9PXZvaWQgMCYmdC52YWx1ZSE9PW51bGwpKXJldHVybjt0PSIiK2UuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUsbnx8dD09PWUudmFsdWV8fChlLnZhbHVlPXQpLGUuZGVmYXVsdFZhbHVlPXR9bj1lLm5hbWUsbiE9PSIiJiYoZS5uYW1lPSIiKSxlLmRlZmF1bHRDaGVja2VkPSEhZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkLG4hPT0iIiYmKGUubmFtZT1uKX1mdW5jdGlvbiBVZihlLHQsbil7KHQhPT0ibnVtYmVyInx8VnUoZS5vd25lckRvY3VtZW50KSE9PWUpJiYobj09bnVsbD9lLmRlZmF1bHRWYWx1ZT0iIitlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlOmUuZGVmYXVsdFZhbHVlIT09IiIrbiYmKGUuZGVmYXVsdFZhbHVlPSIiK24pKX12YXIgdnM9QXJyYXkuaXNBcnJheTtmdW5jdGlvbiBpbChlLHQsbixyKXtpZihlPWUub3B0aW9ucyx0KXt0PXt9O2Zvcih2YXIgbz0wO288bi5sZW5ndGg7bysrKXRbIiQiK25bb11dPSEwO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspbz10Lmhhc093blByb3BlcnR5KCIkIitlW25dLnZhbHVlKSxlW25dLnNlbGVjdGVkIT09byYmKGVbbl0uc2VsZWN0ZWQ9byksbyYmciYmKGVbbl0uZGVmYXVsdFNlbGVjdGVkPSEwKX1lbHNle2ZvcihuPSIiK1RvKG4pLHQ9bnVsbCxvPTA7bzxlLmxlbmd0aDtvKyspe2lmKGVbb10udmFsdWU9PT1uKXtlW29dLnNlbGVjdGVkPSEwLHImJihlW29dLmRlZmF1bHRTZWxlY3RlZD0hMCk7cmV0dXJufXQhPT1udWxsfHxlW29dLmRpc2FibGVkfHwodD1lW29dKX10IT09bnVsbCYmKHQuc2VsZWN0ZWQ9ITApfX1mdW5jdGlvbiBWZihlLHQpe2lmKHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPW51bGwpdGhyb3cgRXJyb3IoVyg5MSkpO3JldHVybiB0dCh7fSx0LHt2YWx1ZTp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCxjaGlsZHJlbjoiIitlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlfSl9ZnVuY3Rpb24gUW0oZSx0KXt2YXIgbj10LnZhbHVlO2lmKG49PW51bGwpe2lmKG49dC5jaGlsZHJlbix0PXQuZGVmYXVsdFZhbHVlLG4hPW51bGwpe2lmKHQhPW51bGwpdGhyb3cgRXJyb3IoVyg5MikpO2lmKHZzKG4pKXtpZigxPG4ubGVuZ3RoKXRocm93IEVycm9yKFcoOTMpKTtuPW5bMF19dD1ufXQ9PW51bGwmJih0PSIiKSxuPXR9ZS5fd3JhcHBlclN0YXRlPXtpbml0aWFsVmFsdWU6VG8obil9fWZ1bmN0aW9uIGgxKGUsdCl7dmFyIG49VG8odC52YWx1ZSkscj1Ubyh0LmRlZmF1bHRWYWx1ZSk7biE9bnVsbCYmKG49IiIrbixuIT09ZS52YWx1ZSYmKGUudmFsdWU9biksdC5kZWZhdWx0VmFsdWU9PW51bGwmJmUuZGVmYXVsdFZhbHVlIT09biYmKGUuZGVmYXVsdFZhbHVlPW4pKSxyIT1udWxsJiYoZS5kZWZhdWx0VmFsdWU9IiIrcil9ZnVuY3Rpb24gSm0oZSl7dmFyIHQ9ZS50ZXh0Q29udGVudDt0PT09ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSYmdCE9PSIiJiZ0IT09bnVsbCYmKGUudmFsdWU9dCl9ZnVuY3Rpb24gcDEoZSl7c3dpdGNoKGUpe2Nhc2Uic3ZnIjpyZXR1cm4iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2Nhc2UibWF0aCI6cmV0dXJuImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiO2RlZmF1bHQ6cmV0dXJuImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwifX1mdW5jdGlvbiBIZihlLHQpe3JldHVybiBlPT1udWxsfHxlPT09Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiP3AxKHQpOmU9PT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciJiZ0PT09ImZvcmVpZ25PYmplY3QiPyJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIjplfXZhciBYYSxnMT1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIE1TQXBwPCJ1IiYmTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24/ZnVuY3Rpb24odCxuLHIsbyl7TVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24oKXtyZXR1cm4gZSh0LG4scixvKX0pfTplfShmdW5jdGlvbihlLHQpe2lmKGUubmFtZXNwYWNlVVJJIT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnInx8ImlubmVySFRNTCJpbiBlKWUuaW5uZXJIVE1MPXQ7ZWxzZXtmb3IoWGE9WGF8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFhhLmlubmVySFRNTD0iPHN2Zz4iK3QudmFsdWVPZigpLnRvU3RyaW5nKCkrIjwvc3ZnPiIsdD1YYS5maXJzdENoaWxkO2UuZmlyc3RDaGlsZDspZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpO2Zvcig7dC5maXJzdENoaWxkOyllLmFwcGVuZENoaWxkKHQuZmlyc3RDaGlsZCl9fSk7ZnVuY3Rpb24gWXMoZSx0KXtpZih0KXt2YXIgbj1lLmZpcnN0Q2hpbGQ7aWYobiYmbj09PWUubGFzdENoaWxkJiZuLm5vZGVUeXBlPT09Myl7bi5ub2RlVmFsdWU9dDtyZXR1cm59fWUudGV4dENvbnRlbnQ9dH12YXIgRXM9e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGFzcGVjdFJhdGlvOiEwLGJvcmRlckltYWdlT3V0c2V0OiEwLGJvcmRlckltYWdlU2xpY2U6ITAsYm9yZGVySW1hZ2VXaWR0aDohMCxib3hGbGV4OiEwLGJveEZsZXhHcm91cDohMCxib3hPcmRpbmFsR3JvdXA6ITAsY29sdW1uQ291bnQ6ITAsY29sdW1uczohMCxmbGV4OiEwLGZsZXhHcm93OiEwLGZsZXhQb3NpdGl2ZTohMCxmbGV4U2hyaW5rOiEwLGZsZXhOZWdhdGl2ZTohMCxmbGV4T3JkZXI6ITAsZ3JpZEFyZWE6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTcGFuOiEwLGdyaWRSb3dTdGFydDohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblNwYW46ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUNsYW1wOiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHRhYlNpemU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwLGZpbGxPcGFjaXR5OiEwLGZsb29kT3BhY2l0eTohMCxzdG9wT3BhY2l0eTohMCxzdHJva2VEYXNoYXJyYXk6ITAsc3Ryb2tlRGFzaG9mZnNldDohMCxzdHJva2VNaXRlcmxpbWl0OiEwLHN0cm9rZU9wYWNpdHk6ITAsc3Ryb2tlV2lkdGg6ITB9LEpFPVsiV2Via2l0IiwibXMiLCJNb3oiLCJPIl07T2JqZWN0LmtleXMoRXMpLmZvckVhY2goZnVuY3Rpb24oZSl7SkUuZm9yRWFjaChmdW5jdGlvbih0KXt0PXQrZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnN1YnN0cmluZygxKSxFc1t0XT1Fc1tlXX0pfSk7ZnVuY3Rpb24gbTEoZSx0LG4pe3JldHVybiB0PT1udWxsfHx0eXBlb2YgdD09ImJvb2xlYW4ifHx0PT09IiI/IiI6bnx8dHlwZW9mIHQhPSJudW1iZXIifHx0PT09MHx8RXMuaGFzT3duUHJvcGVydHkoZSkmJkVzW2VdPygiIit0KS50cmltKCk6dCsicHgifWZ1bmN0aW9uIHYxKGUsdCl7ZT1lLnN0eWxlO2Zvcih2YXIgbiBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkobikpe3ZhciByPW4uaW5kZXhPZigiLS0iKT09PTAsbz1tMShuLHRbbl0scik7bj09PSJmbG9hdCImJihuPSJjc3NGbG9hdCIpLHI/ZS5zZXRQcm9wZXJ0eShuLG8pOmVbbl09b319dmFyIFpFPXR0KHttZW51aXRlbTohMH0se2FyZWE6ITAsYmFzZTohMCxicjohMCxjb2w6ITAsZW1iZWQ6ITAsaHI6ITAsaW1nOiEwLGlucHV0OiEwLGtleWdlbjohMCxsaW5rOiEwLG1ldGE6ITAscGFyYW06ITAsc291cmNlOiEwLHRyYWNrOiEwLHdicjohMH0pO2Z1bmN0aW9uIEtmKGUsdCl7aWYodCl7aWYoWkVbZV0mJih0LmNoaWxkcmVuIT1udWxsfHx0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT1udWxsKSl0aHJvdyBFcnJvcihXKDEzNyxlKSk7aWYodC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9bnVsbCl7aWYodC5jaGlsZHJlbiE9bnVsbCl0aHJvdyBFcnJvcihXKDYwKSk7aWYodHlwZW9mIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPSJvYmplY3QifHwhKCJfX2h0bWwiaW4gdC5kYW5nZXJvdXNseVNldElubmVySFRNTCkpdGhyb3cgRXJyb3IoVyg2MSkpfWlmKHQuc3R5bGUhPW51bGwmJnR5cGVvZiB0LnN0eWxlIT0ib2JqZWN0Iil0aHJvdyBFcnJvcihXKDYyKSl9fWZ1bmN0aW9uIEdmKGUsdCl7aWYoZS5pbmRleE9mKCItIik9PT0tMSlyZXR1cm4gdHlwZW9mIHQuaXM9PSJzdHJpbmciO3N3aXRjaChlKXtjYXNlImFubm90YXRpb24teG1sIjpjYXNlImNvbG9yLXByb2ZpbGUiOmNhc2UiZm9udC1mYWNlIjpjYXNlImZvbnQtZmFjZS1zcmMiOmNhc2UiZm9udC1mYWNlLXVyaSI6Y2FzZSJmb250LWZhY2UtZm9ybWF0IjpjYXNlImZvbnQtZmFjZS1uYW1lIjpjYXNlIm1pc3NpbmctZ2x5cGgiOnJldHVybiExO2RlZmF1bHQ6cmV0dXJuITB9fXZhciBZZj1udWxsO2Z1bmN0aW9uIEZwKGUpe3JldHVybiBlPWUudGFyZ2V0fHxlLnNyY0VsZW1lbnR8fHdpbmRvdyxlLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50JiYoZT1lLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KSxlLm5vZGVUeXBlPT09Mz9lLnBhcmVudE5vZGU6ZX12YXIgWGY9bnVsbCxsbD1udWxsLHNsPW51bGw7ZnVuY3Rpb24gWm0oZSl7aWYoZT1iYShlKSl7aWYodHlwZW9mIFhmIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFcoMjgwKSk7dmFyIHQ9ZS5zdGF0ZU5vZGU7dCYmKHQ9R2ModCksWGYoZS5zdGF0ZU5vZGUsZS50eXBlLHQpKX19ZnVuY3Rpb24geTEoZSl7bGw/c2w/c2wucHVzaChlKTpzbD1bZV06bGw9ZX1mdW5jdGlvbiB4MSgpe2lmKGxsKXt2YXIgZT1sbCx0PXNsO2lmKHNsPWxsPW51bGwsWm0oZSksdClmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKVptKHRbZV0pfX1mdW5jdGlvbiBfMShlLHQpe3JldHVybiBlKHQpfWZ1bmN0aW9uIHcxKCl7fXZhciBWZD0hMTtmdW5jdGlvbiBTMShlLHQsbil7aWYoVmQpcmV0dXJuIGUodCxuKTtWZD0hMDt0cnl7cmV0dXJuIF8xKGUsdCxuKX1maW5hbGx5e1ZkPSExLChsbCE9PW51bGx8fHNsIT09bnVsbCkmJih3MSgpLHgxKCkpfX1mdW5jdGlvbiBYcyhlLHQpe3ZhciBuPWUuc3RhdGVOb2RlO2lmKG49PT1udWxsKXJldHVybiBudWxsO3ZhciByPUdjKG4pO2lmKHI9PT1udWxsKXJldHVybiBudWxsO249clt0XTtlOnN3aXRjaCh0KXtjYXNlIm9uQ2xpY2siOmNhc2Uib25DbGlja0NhcHR1cmUiOmNhc2Uib25Eb3VibGVDbGljayI6Y2FzZSJvbkRvdWJsZUNsaWNrQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRG93biI6Y2FzZSJvbk1vdXNlRG93bkNhcHR1cmUiOmNhc2Uib25Nb3VzZU1vdmUiOmNhc2Uib25Nb3VzZU1vdmVDYXB0dXJlIjpjYXNlIm9uTW91c2VVcCI6Y2FzZSJvbk1vdXNlVXBDYXB0dXJlIjpjYXNlIm9uTW91c2VFbnRlciI6KHI9IXIuZGlzYWJsZWQpfHwoZT1lLnR5cGUscj0hKGU9PT0iYnV0dG9uInx8ZT09PSJpbnB1dCJ8fGU9PT0ic2VsZWN0Inx8ZT09PSJ0ZXh0YXJlYSIpKSxlPSFyO2JyZWFrIGU7ZGVmYXVsdDplPSExfWlmKGUpcmV0dXJuIG51bGw7aWYobiYmdHlwZW9mIG4hPSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoVygyMzEsdCx0eXBlb2YgbikpO3JldHVybiBufXZhciBRZj0hMTtpZihJcil0cnl7dmFyIG5zPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShucywicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe1FmPSEwfX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0Iixucyxucyksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLG5zLG5zKX1jYXRjaHtRZj0hMX1mdW5jdGlvbiBxRShlLHQsbixyLG8saSxsLHMsYSl7dmFyIHU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpO3RyeXt0LmFwcGx5KG4sdSl9Y2F0Y2goYyl7dGhpcy5vbkVycm9yKGMpfX12YXIgJHM9ITEsSHU9bnVsbCxLdT0hMSxKZj1udWxsLGUkPXtvbkVycm9yOmZ1bmN0aW9uKGUpeyRzPSEwLEh1PWV9fTtmdW5jdGlvbiB0JChlLHQsbixyLG8saSxsLHMsYSl7JHM9ITEsSHU9bnVsbCxxRS5hcHBseShlJCxhcmd1bWVudHMpfWZ1bmN0aW9uIG4kKGUsdCxuLHIsbyxpLGwscyxhKXtpZih0JC5hcHBseSh0aGlzLGFyZ3VtZW50cyksJHMpe2lmKCRzKXt2YXIgdT1IdTskcz0hMSxIdT1udWxsfWVsc2UgdGhyb3cgRXJyb3IoVygxOTgpKTtLdXx8KEt1PSEwLEpmPXUpfX1mdW5jdGlvbiBfaShlKXt2YXIgdD1lLG49ZTtpZihlLmFsdGVybmF0ZSlmb3IoO3QucmV0dXJuOyl0PXQucmV0dXJuO2Vsc2V7ZT10O2RvIHQ9ZSx0LmZsYWdzJjQwOTgmJihuPXQucmV0dXJuKSxlPXQucmV0dXJuO3doaWxlKGUpfXJldHVybiB0LnRhZz09PTM/bjpudWxsfWZ1bmN0aW9uIEMxKGUpe2lmKGUudGFnPT09MTMpe3ZhciB0PWUubWVtb2l6ZWRTdGF0ZTtpZih0PT09bnVsbCYmKGU9ZS5hbHRlcm5hdGUsZSE9PW51bGwmJih0PWUubWVtb2l6ZWRTdGF0ZSkpLHQhPT1udWxsKXJldHVybiB0LmRlaHlkcmF0ZWR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gcW0oZSl7aWYoX2koZSkhPT1lKXRocm93IEVycm9yKFcoMTg4KSl9ZnVuY3Rpb24gciQoZSl7dmFyIHQ9ZS5hbHRlcm5hdGU7aWYoIXQpe2lmKHQ9X2koZSksdD09PW51bGwpdGhyb3cgRXJyb3IoVygxODgpKTtyZXR1cm4gdCE9PWU/bnVsbDplfWZvcih2YXIgbj1lLHI9dDs7KXt2YXIgbz1uLnJldHVybjtpZihvPT09bnVsbClicmVhazt2YXIgaT1vLmFsdGVybmF0ZTtpZihpPT09bnVsbCl7aWYocj1vLnJldHVybixyIT09bnVsbCl7bj1yO2NvbnRpbnVlfWJyZWFrfWlmKG8uY2hpbGQ9PT1pLmNoaWxkKXtmb3IoaT1vLmNoaWxkO2k7KXtpZihpPT09bilyZXR1cm4gcW0obyksZTtpZihpPT09cilyZXR1cm4gcW0obyksdDtpPWkuc2libGluZ310aHJvdyBFcnJvcihXKDE4OCkpfWlmKG4ucmV0dXJuIT09ci5yZXR1cm4pbj1vLHI9aTtlbHNle2Zvcih2YXIgbD0hMSxzPW8uY2hpbGQ7czspe2lmKHM9PT1uKXtsPSEwLG49byxyPWk7YnJlYWt9aWYocz09PXIpe2w9ITAscj1vLG49aTticmVha31zPXMuc2libGluZ31pZighbCl7Zm9yKHM9aS5jaGlsZDtzOyl7aWYocz09PW4pe2w9ITAsbj1pLHI9bzticmVha31pZihzPT09cil7bD0hMCxyPWksbj1vO2JyZWFrfXM9cy5zaWJsaW5nfWlmKCFsKXRocm93IEVycm9yKFcoMTg5KSl9fWlmKG4uYWx0ZXJuYXRlIT09cil0aHJvdyBFcnJvcihXKDE5MCkpfWlmKG4udGFnIT09Myl0aHJvdyBFcnJvcihXKDE4OCkpO3JldHVybiBuLnN0YXRlTm9kZS5jdXJyZW50PT09bj9lOnR9ZnVuY3Rpb24gRTEoZSl7cmV0dXJuIGU9ciQoZSksZSE9PW51bGw/JDEoZSk6bnVsbH1mdW5jdGlvbiAkMShlKXtpZihlLnRhZz09PTV8fGUudGFnPT09NilyZXR1cm4gZTtmb3IoZT1lLmNoaWxkO2UhPT1udWxsOyl7dmFyIHQ9JDEoZSk7aWYodCE9PW51bGwpcmV0dXJuIHQ7ZT1lLnNpYmxpbmd9cmV0dXJuIG51bGx9dmFyIGsxPUVuLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2ssZXY9RW4udW5zdGFibGVfY2FuY2VsQ2FsbGJhY2ssbyQ9RW4udW5zdGFibGVfc2hvdWxkWWllbGQsaSQ9RW4udW5zdGFibGVfcmVxdWVzdFBhaW50LHV0PUVuLnVuc3RhYmxlX25vdyxsJD1Fbi51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCxCcD1Fbi51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSxUMT1Fbi51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxHdT1Fbi51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSxzJD1Fbi51bnN0YWJsZV9Mb3dQcmlvcml0eSxOMT1Fbi51bnN0YWJsZV9JZGxlUHJpb3JpdHksVWM9bnVsbCxwcj1udWxsO2Z1bmN0aW9uIGEkKGUpe2lmKHByJiZ0eXBlb2YgcHIub25Db21taXRGaWJlclJvb3Q9PSJmdW5jdGlvbiIpdHJ5e3ByLm9uQ29tbWl0RmliZXJSb290KFVjLGUsdm9pZCAwLChlLmN1cnJlbnQuZmxhZ3MmMTI4KT09PTEyOCl9Y2F0Y2h7fX12YXIgcW49TWF0aC5jbHozMj9NYXRoLmNsejMyOmQkLHUkPU1hdGgubG9nLGMkPU1hdGguTE4yO2Z1bmN0aW9uIGQkKGUpe3JldHVybiBlPj4+PTAsZT09PTA/MzI6MzEtKHUkKGUpL2MkfDApfDB9dmFyIFFhPTY0LEphPTQxOTQzMDQ7ZnVuY3Rpb24geXMoZSl7c3dpdGNoKGUmLWUpe2Nhc2UgMTpyZXR1cm4gMTtjYXNlIDI6cmV0dXJuIDI7Y2FzZSA0OnJldHVybiA0O2Nhc2UgODpyZXR1cm4gODtjYXNlIDE2OnJldHVybiAxNjtjYXNlIDMyOnJldHVybiAzMjtjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiBlJjQxOTQyNDA7Y2FzZSA0MTk0MzA0OmNhc2UgODM4ODYwODpjYXNlIDE2Nzc3MjE2OmNhc2UgMzM1NTQ0MzI6Y2FzZSA2NzEwODg2NDpyZXR1cm4gZSYxMzAwMjM0MjQ7Y2FzZSAxMzQyMTc3Mjg6cmV0dXJuIDEzNDIxNzcyODtjYXNlIDI2ODQzNTQ1NjpyZXR1cm4gMjY4NDM1NDU2O2Nhc2UgNTM2ODcwOTEyOnJldHVybiA1MzY4NzA5MTI7Y2FzZSAxMDczNzQxODI0OnJldHVybiAxMDczNzQxODI0O2RlZmF1bHQ6cmV0dXJuIGV9fWZ1bmN0aW9uIFl1KGUsdCl7dmFyIG49ZS5wZW5kaW5nTGFuZXM7aWYobj09PTApcmV0dXJuIDA7dmFyIHI9MCxvPWUuc3VzcGVuZGVkTGFuZXMsaT1lLnBpbmdlZExhbmVzLGw9biYyNjg0MzU0NTU7aWYobCE9PTApe3ZhciBzPWwmfm87cyE9PTA/cj15cyhzKTooaSY9bCxpIT09MCYmKHI9eXMoaSkpKX1lbHNlIGw9biZ+byxsIT09MD9yPXlzKGwpOmkhPT0wJiYocj15cyhpKSk7aWYocj09PTApcmV0dXJuIDA7aWYodCE9PTAmJnQhPT1yJiYhKHQmbykmJihvPXImLXIsaT10Ji10LG8+PWl8fG89PT0xNiYmKGkmNDE5NDI0MCkhPT0wKSlyZXR1cm4gdDtpZihyJjQmJihyfD1uJjE2KSx0PWUuZW50YW5nbGVkTGFuZXMsdCE9PTApZm9yKGU9ZS5lbnRhbmdsZW1lbnRzLHQmPXI7MDx0OyluPTMxLXFuKHQpLG89MTw8bixyfD1lW25dLHQmPX5vO3JldHVybiByfWZ1bmN0aW9uIGYkKGUsdCl7c3dpdGNoKGUpe2Nhc2UgMTpjYXNlIDI6Y2FzZSA0OnJldHVybiB0KzI1MDtjYXNlIDg6Y2FzZSAxNjpjYXNlIDMyOmNhc2UgNjQ6Y2FzZSAxMjg6Y2FzZSAyNTY6Y2FzZSA1MTI6Y2FzZSAxMDI0OmNhc2UgMjA0ODpjYXNlIDQwOTY6Y2FzZSA4MTkyOmNhc2UgMTYzODQ6Y2FzZSAzMjc2ODpjYXNlIDY1NTM2OmNhc2UgMTMxMDcyOmNhc2UgMjYyMTQ0OmNhc2UgNTI0Mjg4OmNhc2UgMTA0ODU3NjpjYXNlIDIwOTcxNTI6cmV0dXJuIHQrNWUzO2Nhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6cmV0dXJuLTE7Y2FzZSAxMzQyMTc3Mjg6Y2FzZSAyNjg0MzU0NTY6Y2FzZSA1MzY4NzA5MTI6Y2FzZSAxMDczNzQxODI0OnJldHVybi0xO2RlZmF1bHQ6cmV0dXJuLTF9fWZ1bmN0aW9uIGgkKGUsdCl7Zm9yKHZhciBuPWUuc3VzcGVuZGVkTGFuZXMscj1lLnBpbmdlZExhbmVzLG89ZS5leHBpcmF0aW9uVGltZXMsaT1lLnBlbmRpbmdMYW5lczswPGk7KXt2YXIgbD0zMS1xbihpKSxzPTE8PGwsYT1vW2xdO2E9PT0tMT8oIShzJm4pfHxzJnIpJiYob1tsXT1mJChzLHQpKTphPD10JiYoZS5leHBpcmVkTGFuZXN8PXMpLGkmPX5zfX1mdW5jdGlvbiBaZihlKXtyZXR1cm4gZT1lLnBlbmRpbmdMYW5lcyYtMTA3Mzc0MTgyNSxlIT09MD9lOmUmMTA3Mzc0MTgyND8xMDczNzQxODI0OjB9ZnVuY3Rpb24gYjEoKXt2YXIgZT1RYTtyZXR1cm4gUWE8PD0xLCEoUWEmNDE5NDI0MCkmJihRYT02NCksZX1mdW5jdGlvbiBIZChlKXtmb3IodmFyIHQ9W10sbj0wOzMxPm47bisrKXQucHVzaChlKTtyZXR1cm4gdH1mdW5jdGlvbiBUYShlLHQsbil7ZS5wZW5kaW5nTGFuZXN8PXQsdCE9PTUzNjg3MDkxMiYmKGUuc3VzcGVuZGVkTGFuZXM9MCxlLnBpbmdlZExhbmVzPTApLGU9ZS5ldmVudFRpbWVzLHQ9MzEtcW4odCksZVt0XT1ufWZ1bmN0aW9uIHAkKGUsdCl7dmFyIG49ZS5wZW5kaW5nTGFuZXMmfnQ7ZS5wZW5kaW5nTGFuZXM9dCxlLnN1c3BlbmRlZExhbmVzPTAsZS5waW5nZWRMYW5lcz0wLGUuZXhwaXJlZExhbmVzJj10LGUubXV0YWJsZVJlYWRMYW5lcyY9dCxlLmVudGFuZ2xlZExhbmVzJj10LHQ9ZS5lbnRhbmdsZW1lbnRzO3ZhciByPWUuZXZlbnRUaW1lcztmb3IoZT1lLmV4cGlyYXRpb25UaW1lczswPG47KXt2YXIgbz0zMS1xbihuKSxpPTE8PG87dFtvXT0wLHJbb109LTEsZVtvXT0tMSxuJj1+aX19ZnVuY3Rpb24gV3AoZSx0KXt2YXIgbj1lLmVudGFuZ2xlZExhbmVzfD10O2ZvcihlPWUuZW50YW5nbGVtZW50cztuOyl7dmFyIHI9MzEtcW4obiksbz0xPDxyO28mdHxlW3JdJnQmJihlW3JdfD10KSxuJj1+b319dmFyIFBlPTA7ZnVuY3Rpb24gUjEoZSl7cmV0dXJuIGUmPS1lLDE8ZT80PGU/ZSYyNjg0MzU0NTU/MTY6NTM2ODcwOTEyOjQ6MX12YXIgUDEsVXAsTzEsQTEsTTEscWY9ITEsWmE9W10sdm89bnVsbCx5bz1udWxsLHhvPW51bGwsUXM9bmV3IE1hcCxKcz1uZXcgTWFwLHVvPVtdLGckPSJtb3VzZWRvd24gbW91c2V1cCB0b3VjaGNhbmNlbCB0b3VjaGVuZCB0b3VjaHN0YXJ0IGF1eGNsaWNrIGRibGNsaWNrIHBvaW50ZXJjYW5jZWwgcG9pbnRlcmRvd24gcG9pbnRlcnVwIGRyYWdlbmQgZHJhZ3N0YXJ0IGRyb3AgY29tcG9zaXRpb25lbmQgY29tcG9zaXRpb25zdGFydCBrZXlkb3duIGtleXByZXNzIGtleXVwIGlucHV0IHRleHRJbnB1dCBjb3B5IGN1dCBwYXN0ZSBjbGljayBjaGFuZ2UgY29udGV4dG1lbnUgcmVzZXQgc3VibWl0Ii5zcGxpdCgiICIpO2Z1bmN0aW9uIHR2KGUsdCl7c3dpdGNoKGUpe2Nhc2UiZm9jdXNpbiI6Y2FzZSJmb2N1c291dCI6dm89bnVsbDticmVhaztjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnbGVhdmUiOnlvPW51bGw7YnJlYWs7Y2FzZSJtb3VzZW92ZXIiOmNhc2UibW91c2VvdXQiOnhvPW51bGw7YnJlYWs7Y2FzZSJwb2ludGVyb3ZlciI6Y2FzZSJwb2ludGVyb3V0IjpRcy5kZWxldGUodC5wb2ludGVySWQpO2JyZWFrO2Nhc2UiZ290cG9pbnRlcmNhcHR1cmUiOmNhc2UibG9zdHBvaW50ZXJjYXB0dXJlIjpKcy5kZWxldGUodC5wb2ludGVySWQpfX1mdW5jdGlvbiBycyhlLHQsbixyLG8saSl7cmV0dXJuIGU9PT1udWxsfHxlLm5hdGl2ZUV2ZW50IT09aT8oZT17YmxvY2tlZE9uOnQsZG9tRXZlbnROYW1lOm4sZXZlbnRTeXN0ZW1GbGFnczpyLG5hdGl2ZUV2ZW50OmksdGFyZ2V0Q29udGFpbmVyczpbb119LHQhPT1udWxsJiYodD1iYSh0KSx0IT09bnVsbCYmVXAodCkpLGUpOihlLmV2ZW50U3lzdGVtRmxhZ3N8PXIsdD1lLnRhcmdldENvbnRhaW5lcnMsbyE9PW51bGwmJnQuaW5kZXhPZihvKT09PS0xJiZ0LnB1c2gobyksZSl9ZnVuY3Rpb24gbSQoZSx0LG4scixvKXtzd2l0Y2godCl7Y2FzZSJmb2N1c2luIjpyZXR1cm4gdm89cnModm8sZSx0LG4scixvKSwhMDtjYXNlImRyYWdlbnRlciI6cmV0dXJuIHlvPXJzKHlvLGUsdCxuLHIsbyksITA7Y2FzZSJtb3VzZW92ZXIiOnJldHVybiB4bz1ycyh4byxlLHQsbixyLG8pLCEwO2Nhc2UicG9pbnRlcm92ZXIiOnZhciBpPW8ucG9pbnRlcklkO3JldHVybiBRcy5zZXQoaSxycyhRcy5nZXQoaSl8fG51bGwsZSx0LG4scixvKSksITA7Y2FzZSJnb3Rwb2ludGVyY2FwdHVyZSI6cmV0dXJuIGk9by5wb2ludGVySWQsSnMuc2V0KGkscnMoSnMuZ2V0KGkpfHxudWxsLGUsdCxuLHIsbykpLCEwfXJldHVybiExfWZ1bmN0aW9uIEQxKGUpe3ZhciB0PVFvKGUudGFyZ2V0KTtpZih0IT09bnVsbCl7dmFyIG49X2kodCk7aWYobiE9PW51bGwpe2lmKHQ9bi50YWcsdD09PTEzKXtpZih0PUMxKG4pLHQhPT1udWxsKXtlLmJsb2NrZWRPbj10LE0xKGUucHJpb3JpdHksZnVuY3Rpb24oKXtPMShuKX0pO3JldHVybn19ZWxzZSBpZih0PT09MyYmbi5zdGF0ZU5vZGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl7ZS5ibG9ja2VkT249bi50YWc9PT0zP24uc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDtyZXR1cm59fX1lLmJsb2NrZWRPbj1udWxsfWZ1bmN0aW9uIGt1KGUpe2lmKGUuYmxvY2tlZE9uIT09bnVsbClyZXR1cm4hMTtmb3IodmFyIHQ9ZS50YXJnZXRDb250YWluZXJzOzA8dC5sZW5ndGg7KXt2YXIgbj1laChlLmRvbUV2ZW50TmFtZSxlLmV2ZW50U3lzdGVtRmxhZ3MsdFswXSxlLm5hdGl2ZUV2ZW50KTtpZihuPT09bnVsbCl7bj1lLm5hdGl2ZUV2ZW50O3ZhciByPW5ldyBuLmNvbnN0cnVjdG9yKG4udHlwZSxuKTtZZj1yLG4udGFyZ2V0LmRpc3BhdGNoRXZlbnQociksWWY9bnVsbH1lbHNlIHJldHVybiB0PWJhKG4pLHQhPT1udWxsJiZVcCh0KSxlLmJsb2NrZWRPbj1uLCExO3Quc2hpZnQoKX1yZXR1cm4hMH1mdW5jdGlvbiBudihlLHQsbil7a3UoZSkmJm4uZGVsZXRlKHQpfWZ1bmN0aW9uIHYkKCl7cWY9ITEsdm8hPT1udWxsJiZrdSh2bykmJih2bz1udWxsKSx5byE9PW51bGwmJmt1KHlvKSYmKHlvPW51bGwpLHhvIT09bnVsbCYma3UoeG8pJiYoeG89bnVsbCksUXMuZm9yRWFjaChudiksSnMuZm9yRWFjaChudil9ZnVuY3Rpb24gb3MoZSx0KXtlLmJsb2NrZWRPbj09PXQmJihlLmJsb2NrZWRPbj1udWxsLHFmfHwocWY9ITAsRW4udW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhFbi51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSx2JCkpKX1mdW5jdGlvbiBacyhlKXtmdW5jdGlvbiB0KG8pe3JldHVybiBvcyhvLGUpfWlmKDA8WmEubGVuZ3RoKXtvcyhaYVswXSxlKTtmb3IodmFyIG49MTtuPFphLmxlbmd0aDtuKyspe3ZhciByPVphW25dO3IuYmxvY2tlZE9uPT09ZSYmKHIuYmxvY2tlZE9uPW51bGwpfX1mb3Iodm8hPT1udWxsJiZvcyh2byxlKSx5byE9PW51bGwmJm9zKHlvLGUpLHhvIT09bnVsbCYmb3MoeG8sZSksUXMuZm9yRWFjaCh0KSxKcy5mb3JFYWNoKHQpLG49MDtuPHVvLmxlbmd0aDtuKyspcj11b1tuXSxyLmJsb2NrZWRPbj09PWUmJihyLmJsb2NrZWRPbj1udWxsKTtmb3IoOzA8dW8ubGVuZ3RoJiYobj11b1swXSxuLmJsb2NrZWRPbj09PW51bGwpOylEMShuKSxuLmJsb2NrZWRPbj09PW51bGwmJnVvLnNoaWZ0KCl9dmFyIGFsPVZyLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLFh1PSEwO2Z1bmN0aW9uIHkkKGUsdCxuLHIpe3ZhciBvPVBlLGk9YWwudHJhbnNpdGlvbjthbC50cmFuc2l0aW9uPW51bGw7dHJ5e1BlPTEsVnAoZSx0LG4scil9ZmluYWxseXtQZT1vLGFsLnRyYW5zaXRpb249aX19ZnVuY3Rpb24geCQoZSx0LG4scil7dmFyIG89UGUsaT1hbC50cmFuc2l0aW9uO2FsLnRyYW5zaXRpb249bnVsbDt0cnl7UGU9NCxWcChlLHQsbixyKX1maW5hbGx5e1BlPW8sYWwudHJhbnNpdGlvbj1pfX1mdW5jdGlvbiBWcChlLHQsbixyKXtpZihYdSl7dmFyIG89ZWgoZSx0LG4scik7aWYobz09PW51bGwpdGYoZSx0LHIsUXUsbiksdHYoZSxyKTtlbHNlIGlmKG0kKG8sZSx0LG4scikpci5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKHR2KGUsciksdCY0JiYtMTxnJC5pbmRleE9mKGUpKXtmb3IoO28hPT1udWxsOyl7dmFyIGk9YmEobyk7aWYoaSE9PW51bGwmJlAxKGkpLGk9ZWgoZSx0LG4sciksaT09PW51bGwmJnRmKGUsdCxyLFF1LG4pLGk9PT1vKWJyZWFrO289aX1vIT09bnVsbCYmci5zdG9wUHJvcGFnYXRpb24oKX1lbHNlIHRmKGUsdCxyLG51bGwsbil9fXZhciBRdT1udWxsO2Z1bmN0aW9uIGVoKGUsdCxuLHIpe2lmKFF1PW51bGwsZT1GcChyKSxlPVFvKGUpLGUhPT1udWxsKWlmKHQ9X2koZSksdD09PW51bGwpZT1udWxsO2Vsc2UgaWYobj10LnRhZyxuPT09MTMpe2lmKGU9QzEodCksZSE9PW51bGwpcmV0dXJuIGU7ZT1udWxsfWVsc2UgaWYobj09PTMpe2lmKHQuc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpcmV0dXJuIHQudGFnPT09Mz90LnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7ZT1udWxsfWVsc2UgdCE9PWUmJihlPW51bGwpO3JldHVybiBRdT1lLG51bGx9ZnVuY3Rpb24gTDEoZSl7c3dpdGNoKGUpe2Nhc2UiY2FuY2VsIjpjYXNlImNsaWNrIjpjYXNlImNsb3NlIjpjYXNlImNvbnRleHRtZW51IjpjYXNlImNvcHkiOmNhc2UiY3V0IjpjYXNlImF1eGNsaWNrIjpjYXNlImRibGNsaWNrIjpjYXNlImRyYWdlbmQiOmNhc2UiZHJhZ3N0YXJ0IjpjYXNlImRyb3AiOmNhc2UiZm9jdXNpbiI6Y2FzZSJmb2N1c291dCI6Y2FzZSJpbnB1dCI6Y2FzZSJpbnZhbGlkIjpjYXNlImtleWRvd24iOmNhc2Uia2V5cHJlc3MiOmNhc2Uia2V5dXAiOmNhc2UibW91c2Vkb3duIjpjYXNlIm1vdXNldXAiOmNhc2UicGFzdGUiOmNhc2UicGF1c2UiOmNhc2UicGxheSI6Y2FzZSJwb2ludGVyY2FuY2VsIjpjYXNlInBvaW50ZXJkb3duIjpjYXNlInBvaW50ZXJ1cCI6Y2FzZSJyYXRlY2hhbmdlIjpjYXNlInJlc2V0IjpjYXNlInJlc2l6ZSI6Y2FzZSJzZWVrZWQiOmNhc2Uic3VibWl0IjpjYXNlInRvdWNoY2FuY2VsIjpjYXNlInRvdWNoZW5kIjpjYXNlInRvdWNoc3RhcnQiOmNhc2Uidm9sdW1lY2hhbmdlIjpjYXNlImNoYW5nZSI6Y2FzZSJzZWxlY3Rpb25jaGFuZ2UiOmNhc2UidGV4dElucHV0IjpjYXNlImNvbXBvc2l0aW9uc3RhcnQiOmNhc2UiY29tcG9zaXRpb25lbmQiOmNhc2UiY29tcG9zaXRpb251cGRhdGUiOmNhc2UiYmVmb3JlYmx1ciI6Y2FzZSJhZnRlcmJsdXIiOmNhc2UiYmVmb3JlaW5wdXQiOmNhc2UiYmx1ciI6Y2FzZSJmdWxsc2NyZWVuY2hhbmdlIjpjYXNlImZvY3VzIjpjYXNlImhhc2hjaGFuZ2UiOmNhc2UicG9wc3RhdGUiOmNhc2Uic2VsZWN0IjpjYXNlInNlbGVjdHN0YXJ0IjpyZXR1cm4gMTtjYXNlImRyYWciOmNhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdleGl0IjpjYXNlImRyYWdsZWF2ZSI6Y2FzZSJkcmFnb3ZlciI6Y2FzZSJtb3VzZW1vdmUiOmNhc2UibW91c2VvdXQiOmNhc2UibW91c2VvdmVyIjpjYXNlInBvaW50ZXJtb3ZlIjpjYXNlInBvaW50ZXJvdXQiOmNhc2UicG9pbnRlcm92ZXIiOmNhc2Uic2Nyb2xsIjpjYXNlInRvZ2dsZSI6Y2FzZSJ0b3VjaG1vdmUiOmNhc2Uid2hlZWwiOmNhc2UibW91c2VlbnRlciI6Y2FzZSJtb3VzZWxlYXZlIjpjYXNlInBvaW50ZXJlbnRlciI6Y2FzZSJwb2ludGVybGVhdmUiOnJldHVybiA0O2Nhc2UibWVzc2FnZSI6c3dpdGNoKGwkKCkpe2Nhc2UgQnA6cmV0dXJuIDE7Y2FzZSBUMTpyZXR1cm4gNDtjYXNlIEd1OmNhc2UgcyQ6cmV0dXJuIDE2O2Nhc2UgTjE6cmV0dXJuIDUzNjg3MDkxMjtkZWZhdWx0OnJldHVybiAxNn1kZWZhdWx0OnJldHVybiAxNn19dmFyIGhvPW51bGwsSHA9bnVsbCxUdT1udWxsO2Z1bmN0aW9uIEkxKCl7aWYoVHUpcmV0dXJuIFR1O3ZhciBlLHQ9SHAsbj10Lmxlbmd0aCxyLG89InZhbHVlImluIGhvP2hvLnZhbHVlOmhvLnRleHRDb250ZW50LGk9by5sZW5ndGg7Zm9yKGU9MDtlPG4mJnRbZV09PT1vW2VdO2UrKyk7dmFyIGw9bi1lO2ZvcihyPTE7cjw9bCYmdFtuLXJdPT09b1tpLXJdO3IrKyk7cmV0dXJuIFR1PW8uc2xpY2UoZSwxPHI/MS1yOnZvaWQgMCl9ZnVuY3Rpb24gTnUoZSl7dmFyIHQ9ZS5rZXlDb2RlO3JldHVybiJjaGFyQ29kZSJpbiBlPyhlPWUuY2hhckNvZGUsZT09PTAmJnQ9PT0xMyYmKGU9MTMpKTplPXQsZT09PTEwJiYoZT0xMyksMzI8PWV8fGU9PT0xMz9lOjB9ZnVuY3Rpb24gcWEoKXtyZXR1cm4hMH1mdW5jdGlvbiBydigpe3JldHVybiExfWZ1bmN0aW9uIE5uKGUpe2Z1bmN0aW9uIHQobixyLG8saSxsKXt0aGlzLl9yZWFjdE5hbWU9bix0aGlzLl90YXJnZXRJbnN0PW8sdGhpcy50eXBlPXIsdGhpcy5uYXRpdmVFdmVudD1pLHRoaXMudGFyZ2V0PWwsdGhpcy5jdXJyZW50VGFyZ2V0PW51bGw7Zm9yKHZhciBzIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShzKSYmKG49ZVtzXSx0aGlzW3NdPW4/bihpKTppW3NdKTtyZXR1cm4gdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9KGkuZGVmYXVsdFByZXZlbnRlZCE9bnVsbD9pLmRlZmF1bHRQcmV2ZW50ZWQ6aS5yZXR1cm5WYWx1ZT09PSExKT9xYTpydix0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXJ2LHRoaXN9cmV0dXJuIHR0KHQucHJvdG90eXBlLHtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMDt2YXIgbj10aGlzLm5hdGl2ZUV2ZW50O24mJihuLnByZXZlbnREZWZhdWx0P24ucHJldmVudERlZmF1bHQoKTp0eXBlb2Ygbi5yZXR1cm5WYWx1ZSE9InVua25vd24iJiYobi5yZXR1cm5WYWx1ZT0hMSksdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9cWEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgbj10aGlzLm5hdGl2ZUV2ZW50O24mJihuLnN0b3BQcm9wYWdhdGlvbj9uLnN0b3BQcm9wYWdhdGlvbigpOnR5cGVvZiBuLmNhbmNlbEJ1YmJsZSE9InVua25vd24iJiYobi5jYW5jZWxCdWJibGU9ITApLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9cWEpfSxwZXJzaXN0OmZ1bmN0aW9uKCl7fSxpc1BlcnNpc3RlbnQ6cWF9KSx0fXZhciBNbD17ZXZlbnRQaGFzZTowLGJ1YmJsZXM6MCxjYW5jZWxhYmxlOjAsdGltZVN0YW1wOmZ1bmN0aW9uKGUpe3JldHVybiBlLnRpbWVTdGFtcHx8RGF0ZS5ub3coKX0sZGVmYXVsdFByZXZlbnRlZDowLGlzVHJ1c3RlZDowfSxLcD1ObihNbCksTmE9dHQoe30sTWwse3ZpZXc6MCxkZXRhaWw6MH0pLF8kPU5uKE5hKSxLZCxHZCxpcyxWYz10dCh7fSxOYSx7c2NyZWVuWDowLHNjcmVlblk6MCxjbGllbnRYOjAsY2xpZW50WTowLHBhZ2VYOjAscGFnZVk6MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAsZ2V0TW9kaWZpZXJTdGF0ZTpHcCxidXR0b246MCxidXR0b25zOjAscmVsYXRlZFRhcmdldDpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWxhdGVkVGFyZ2V0PT09dm9pZCAwP2UuZnJvbUVsZW1lbnQ9PT1lLnNyY0VsZW1lbnQ/ZS50b0VsZW1lbnQ6ZS5mcm9tRWxlbWVudDplLnJlbGF0ZWRUYXJnZXR9LG1vdmVtZW50WDpmdW5jdGlvbihlKXtyZXR1cm4ibW92ZW1lbnRYImluIGU/ZS5tb3ZlbWVudFg6KGUhPT1pcyYmKGlzJiZlLnR5cGU9PT0ibW91c2Vtb3ZlIj8oS2Q9ZS5zY3JlZW5YLWlzLnNjcmVlblgsR2Q9ZS5zY3JlZW5ZLWlzLnNjcmVlblkpOkdkPUtkPTAsaXM9ZSksS2QpfSxtb3ZlbWVudFk6ZnVuY3Rpb24oZSl7cmV0dXJuIm1vdmVtZW50WSJpbiBlP2UubW92ZW1lbnRZOkdkfX0pLG92PU5uKFZjKSx3JD10dCh7fSxWYyx7ZGF0YVRyYW5zZmVyOjB9KSxTJD1Obih3JCksQyQ9dHQoe30sTmEse3JlbGF0ZWRUYXJnZXQ6MH0pLFlkPU5uKEMkKSxFJD10dCh7fSxNbCx7YW5pbWF0aW9uTmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksJCQ9Tm4oRSQpLGskPXR0KHt9LE1sLHtjbGlwYm9hcmREYXRhOmZ1bmN0aW9uKGUpe3JldHVybiJjbGlwYm9hcmREYXRhImluIGU/ZS5jbGlwYm9hcmREYXRhOndpbmRvdy5jbGlwYm9hcmREYXRhfX0pLFQkPU5uKGskKSxOJD10dCh7fSxNbCx7ZGF0YTowfSksaXY9Tm4oTiQpLGIkPXtFc2M6IkVzY2FwZSIsU3BhY2ViYXI6IiAiLExlZnQ6IkFycm93TGVmdCIsVXA6IkFycm93VXAiLFJpZ2h0OiJBcnJvd1JpZ2h0IixEb3duOiJBcnJvd0Rvd24iLERlbDoiRGVsZXRlIixXaW46Ik9TIixNZW51OiJDb250ZXh0TWVudSIsQXBwczoiQ29udGV4dE1lbnUiLFNjcm9sbDoiU2Nyb2xsTG9jayIsTW96UHJpbnRhYmxlS2V5OiJVbmlkZW50aWZpZWQifSxSJD17ODoiQmFja3NwYWNlIiw5OiJUYWIiLDEyOiJDbGVhciIsMTM6IkVudGVyIiwxNjoiU2hpZnQiLDE3OiJDb250cm9sIiwxODoiQWx0IiwxOToiUGF1c2UiLDIwOiJDYXBzTG9jayIsMjc6IkVzY2FwZSIsMzI6IiAiLDMzOiJQYWdlVXAiLDM0OiJQYWdlRG93biIsMzU6IkVuZCIsMzY6IkhvbWUiLDM3OiJBcnJvd0xlZnQiLDM4OiJBcnJvd1VwIiwzOToiQXJyb3dSaWdodCIsNDA6IkFycm93RG93biIsNDU6Ikluc2VydCIsNDY6IkRlbGV0ZSIsMTEyOiJGMSIsMTEzOiJGMiIsMTE0OiJGMyIsMTE1OiJGNCIsMTE2OiJGNSIsMTE3OiJGNiIsMTE4OiJGNyIsMTE5OiJGOCIsMTIwOiJGOSIsMTIxOiJGMTAiLDEyMjoiRjExIiwxMjM6IkYxMiIsMTQ0OiJOdW1Mb2NrIiwxNDU6IlNjcm9sbExvY2siLDIyNDoiTWV0YSJ9LFAkPXtBbHQ6ImFsdEtleSIsQ29udHJvbDoiY3RybEtleSIsTWV0YToibWV0YUtleSIsU2hpZnQ6InNoaWZ0S2V5In07ZnVuY3Rpb24gTyQoZSl7dmFyIHQ9dGhpcy5uYXRpdmVFdmVudDtyZXR1cm4gdC5nZXRNb2RpZmllclN0YXRlP3QuZ2V0TW9kaWZpZXJTdGF0ZShlKTooZT1QJFtlXSk/ISF0W2VdOiExfWZ1bmN0aW9uIEdwKCl7cmV0dXJuIE8kfXZhciBBJD10dCh7fSxOYSx7a2V5OmZ1bmN0aW9uKGUpe2lmKGUua2V5KXt2YXIgdD1iJFtlLmtleV18fGUua2V5O2lmKHQhPT0iVW5pZGVudGlmaWVkIilyZXR1cm4gdH1yZXR1cm4gZS50eXBlPT09ImtleXByZXNzIj8oZT1OdShlKSxlPT09MTM/IkVudGVyIjpTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKTplLnR5cGU9PT0ia2V5ZG93biJ8fGUudHlwZT09PSJrZXl1cCI/UiRbZS5rZXlDb2RlXXx8IlVuaWRlbnRpZmllZCI6IiJ9LGNvZGU6MCxsb2NhdGlvbjowLGN0cmxLZXk6MCxzaGlmdEtleTowLGFsdEtleTowLG1ldGFLZXk6MCxyZXBlYXQ6MCxsb2NhbGU6MCxnZXRNb2RpZmllclN0YXRlOkdwLGNoYXJDb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT0ia2V5cHJlc3MiP051KGUpOjB9LGtleUNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09PSJrZXlkb3duInx8ZS50eXBlPT09ImtleXVwIj9lLmtleUNvZGU6MH0sd2hpY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09PSJrZXlwcmVzcyI/TnUoZSk6ZS50eXBlPT09ImtleWRvd24ifHxlLnR5cGU9PT0ia2V5dXAiP2Uua2V5Q29kZTowfX0pLE0kPU5uKEEkKSxEJD10dCh7fSxWYyx7cG9pbnRlcklkOjAsd2lkdGg6MCxoZWlnaHQ6MCxwcmVzc3VyZTowLHRhbmdlbnRpYWxQcmVzc3VyZTowLHRpbHRYOjAsdGlsdFk6MCx0d2lzdDowLHBvaW50ZXJUeXBlOjAsaXNQcmltYXJ5OjB9KSxsdj1ObihEJCksTCQ9dHQoe30sTmEse3RvdWNoZXM6MCx0YXJnZXRUb3VjaGVzOjAsY2hhbmdlZFRvdWNoZXM6MCxhbHRLZXk6MCxtZXRhS2V5OjAsY3RybEtleTowLHNoaWZ0S2V5OjAsZ2V0TW9kaWZpZXJTdGF0ZTpHcH0pLEkkPU5uKEwkKSxqJD10dCh7fSxNbCx7cHJvcGVydHlOYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSx6JD1ObihqJCksRiQ9dHQoe30sVmMse2RlbHRhWDpmdW5jdGlvbihlKXtyZXR1cm4iZGVsdGFYImluIGU/ZS5kZWx0YVg6IndoZWVsRGVsdGFYImluIGU/LWUud2hlZWxEZWx0YVg6MH0sZGVsdGFZOmZ1bmN0aW9uKGUpe3JldHVybiJkZWx0YVkiaW4gZT9lLmRlbHRhWToid2hlZWxEZWx0YVkiaW4gZT8tZS53aGVlbERlbHRhWToid2hlZWxEZWx0YSJpbiBlPy1lLndoZWVsRGVsdGE6MH0sZGVsdGFaOjAsZGVsdGFNb2RlOjB9KSxCJD1ObihGJCksVyQ9WzksMTMsMjcsMzJdLFlwPUlyJiYiQ29tcG9zaXRpb25FdmVudCJpbiB3aW5kb3csa3M9bnVsbDtJciYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmKGtzPWRvY3VtZW50LmRvY3VtZW50TW9kZSk7dmFyIFUkPUlyJiYiVGV4dEV2ZW50ImluIHdpbmRvdyYmIWtzLGoxPUlyJiYoIVlwfHxrcyYmODxrcyYmMTE+PWtzKSxzdj1TdHJpbmcuZnJvbUNoYXJDb2RlKDMyKSxhdj0hMTtmdW5jdGlvbiB6MShlLHQpe3N3aXRjaChlKXtjYXNlImtleXVwIjpyZXR1cm4gVyQuaW5kZXhPZih0LmtleUNvZGUpIT09LTE7Y2FzZSJrZXlkb3duIjpyZXR1cm4gdC5rZXlDb2RlIT09MjI5O2Nhc2Uia2V5cHJlc3MiOmNhc2UibW91c2Vkb3duIjpjYXNlImZvY3Vzb3V0IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBGMShlKXtyZXR1cm4gZT1lLmRldGFpbCx0eXBlb2YgZT09Im9iamVjdCImJiJkYXRhImluIGU/ZS5kYXRhOm51bGx9dmFyIEhpPSExO2Z1bmN0aW9uIFYkKGUsdCl7c3dpdGNoKGUpe2Nhc2UiY29tcG9zaXRpb25lbmQiOnJldHVybiBGMSh0KTtjYXNlImtleXByZXNzIjpyZXR1cm4gdC53aGljaCE9PTMyP251bGw6KGF2PSEwLHN2KTtjYXNlInRleHRJbnB1dCI6cmV0dXJuIGU9dC5kYXRhLGU9PT1zdiYmYXY/bnVsbDplO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIEgkKGUsdCl7aWYoSGkpcmV0dXJuIGU9PT0iY29tcG9zaXRpb25lbmQifHwhWXAmJnoxKGUsdCk/KGU9STEoKSxUdT1IcD1obz1udWxsLEhpPSExLGUpOm51bGw7c3dpdGNoKGUpe2Nhc2UicGFzdGUiOnJldHVybiBudWxsO2Nhc2Uia2V5cHJlc3MiOmlmKCEodC5jdHJsS2V5fHx0LmFsdEtleXx8dC5tZXRhS2V5KXx8dC5jdHJsS2V5JiZ0LmFsdEtleSl7aWYodC5jaGFyJiYxPHQuY2hhci5sZW5ndGgpcmV0dXJuIHQuY2hhcjtpZih0LndoaWNoKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHQud2hpY2gpfXJldHVybiBudWxsO2Nhc2UiY29tcG9zaXRpb25lbmQiOnJldHVybiBqMSYmdC5sb2NhbGUhPT0ia28iP251bGw6dC5kYXRhO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciBLJD17Y29sb3I6ITAsZGF0ZTohMCxkYXRldGltZTohMCwiZGF0ZXRpbWUtbG9jYWwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJlcjohMCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZTohMCx1cmw6ITAsd2VlazohMH07ZnVuY3Rpb24gdXYoZSl7dmFyIHQ9ZSYmZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0PT09ImlucHV0Ij8hIUskW2UudHlwZV06dD09PSJ0ZXh0YXJlYSJ9ZnVuY3Rpb24gQjEoZSx0LG4scil7eTEociksdD1KdSh0LCJvbkNoYW5nZSIpLDA8dC5sZW5ndGgmJihuPW5ldyBLcCgib25DaGFuZ2UiLCJjaGFuZ2UiLG51bGwsbixyKSxlLnB1c2goe2V2ZW50Om4sbGlzdGVuZXJzOnR9KSl9dmFyIFRzPW51bGwscXM9bnVsbDtmdW5jdGlvbiBHJChlKXtaMShlLDApfWZ1bmN0aW9uIEhjKGUpe3ZhciB0PVlpKGUpO2lmKGQxKHQpKXJldHVybiBlfWZ1bmN0aW9uIFkkKGUsdCl7aWYoZT09PSJjaGFuZ2UiKXJldHVybiB0fXZhciBXMT0hMTtpZihJcil7dmFyIFhkO2lmKElyKXt2YXIgUWQ9Im9uaW5wdXQiaW4gZG9jdW1lbnQ7aWYoIVFkKXt2YXIgY3Y9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Y3Yuc2V0QXR0cmlidXRlKCJvbmlucHV0IiwicmV0dXJuOyIpLFFkPXR5cGVvZiBjdi5vbmlucHV0PT0iZnVuY3Rpb24ifVhkPVFkfWVsc2UgWGQ9ITE7VzE9WGQmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PGRvY3VtZW50LmRvY3VtZW50TW9kZSl9ZnVuY3Rpb24gZHYoKXtUcyYmKFRzLmRldGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixVMSkscXM9VHM9bnVsbCl9ZnVuY3Rpb24gVTEoZSl7aWYoZS5wcm9wZXJ0eU5hbWU9PT0idmFsdWUiJiZIYyhxcykpe3ZhciB0PVtdO0IxKHQscXMsZSxGcChlKSksUzEoRyQsdCl9fWZ1bmN0aW9uIFgkKGUsdCxuKXtlPT09ImZvY3VzaW4iPyhkdigpLFRzPXQscXM9bixUcy5hdHRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIsVTEpKTplPT09ImZvY3Vzb3V0IiYmZHYoKX1mdW5jdGlvbiBRJChlKXtpZihlPT09InNlbGVjdGlvbmNoYW5nZSJ8fGU9PT0ia2V5dXAifHxlPT09ImtleWRvd24iKXJldHVybiBIYyhxcyl9ZnVuY3Rpb24gSiQoZSx0KXtpZihlPT09ImNsaWNrIilyZXR1cm4gSGModCl9ZnVuY3Rpb24gWiQoZSx0KXtpZihlPT09ImlucHV0Inx8ZT09PSJjaGFuZ2UiKXJldHVybiBIYyh0KX1mdW5jdGlvbiBxJChlLHQpe3JldHVybiBlPT09dCYmKGUhPT0wfHwxL2U9PT0xL3QpfHxlIT09ZSYmdCE9PXR9dmFyIHRyPXR5cGVvZiBPYmplY3QuaXM9PSJmdW5jdGlvbiI/T2JqZWN0LmlzOnEkO2Z1bmN0aW9uIGVhKGUsdCl7aWYodHIoZSx0KSlyZXR1cm4hMDtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsfHx0eXBlb2YgdCE9Im9iamVjdCJ8fHQ9PT1udWxsKXJldHVybiExO3ZhciBuPU9iamVjdC5rZXlzKGUpLHI9T2JqZWN0LmtleXModCk7aWYobi5sZW5ndGghPT1yLmxlbmd0aClyZXR1cm4hMTtmb3Iocj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdO2lmKCFMZi5jYWxsKHQsbyl8fCF0cihlW29dLHRbb10pKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGZ2KGUpe2Zvcig7ZSYmZS5maXJzdENoaWxkOyllPWUuZmlyc3RDaGlsZDtyZXR1cm4gZX1mdW5jdGlvbiBodihlLHQpe3ZhciBuPWZ2KGUpO2U9MDtmb3IodmFyIHI7bjspe2lmKG4ubm9kZVR5cGU9PT0zKXtpZihyPWUrbi50ZXh0Q29udGVudC5sZW5ndGgsZTw9dCYmcj49dClyZXR1cm57bm9kZTpuLG9mZnNldDp0LWV9O2U9cn1lOntmb3IoO247KXtpZihuLm5leHRTaWJsaW5nKXtuPW4ubmV4dFNpYmxpbmc7YnJlYWsgZX1uPW4ucGFyZW50Tm9kZX1uPXZvaWQgMH1uPWZ2KG4pfX1mdW5jdGlvbiBWMShlLHQpe3JldHVybiBlJiZ0P2U9PT10PyEwOmUmJmUubm9kZVR5cGU9PT0zPyExOnQmJnQubm9kZVR5cGU9PT0zP1YxKGUsdC5wYXJlbnROb2RlKToiY29udGFpbnMiaW4gZT9lLmNvbnRhaW5zKHQpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ISEoZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KSYxNik6ITE6ITF9ZnVuY3Rpb24gSDEoKXtmb3IodmFyIGU9d2luZG93LHQ9VnUoKTt0IGluc3RhbmNlb2YgZS5IVE1MSUZyYW1lRWxlbWVudDspe3RyeXt2YXIgbj10eXBlb2YgdC5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWY9PSJzdHJpbmcifWNhdGNoe249ITF9aWYobillPXQuY29udGVudFdpbmRvdztlbHNlIGJyZWFrO3Q9VnUoZS5kb2N1bWVudCl9cmV0dXJuIHR9ZnVuY3Rpb24gWHAoZSl7dmFyIHQ9ZSYmZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0JiYodD09PSJpbnB1dCImJihlLnR5cGU9PT0idGV4dCJ8fGUudHlwZT09PSJzZWFyY2gifHxlLnR5cGU9PT0idGVsInx8ZS50eXBlPT09InVybCJ8fGUudHlwZT09PSJwYXNzd29yZCIpfHx0PT09InRleHRhcmVhInx8ZS5jb250ZW50RWRpdGFibGU9PT0idHJ1ZSIpfWZ1bmN0aW9uIGVrKGUpe3ZhciB0PUgxKCksbj1lLmZvY3VzZWRFbGVtLHI9ZS5zZWxlY3Rpb25SYW5nZTtpZih0IT09biYmbiYmbi5vd25lckRvY3VtZW50JiZWMShuLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LG4pKXtpZihyIT09bnVsbCYmWHAobikpe2lmKHQ9ci5zdGFydCxlPXIuZW5kLGU9PT12b2lkIDAmJihlPXQpLCJzZWxlY3Rpb25TdGFydCJpbiBuKW4uc2VsZWN0aW9uU3RhcnQ9dCxuLnNlbGVjdGlvbkVuZD1NYXRoLm1pbihlLG4udmFsdWUubGVuZ3RoKTtlbHNlIGlmKGU9KHQ9bi5vd25lckRvY3VtZW50fHxkb2N1bWVudCkmJnQuZGVmYXVsdFZpZXd8fHdpbmRvdyxlLmdldFNlbGVjdGlvbil7ZT1lLmdldFNlbGVjdGlvbigpO3ZhciBvPW4udGV4dENvbnRlbnQubGVuZ3RoLGk9TWF0aC5taW4oci5zdGFydCxvKTtyPXIuZW5kPT09dm9pZCAwP2k6TWF0aC5taW4oci5lbmQsbyksIWUuZXh0ZW5kJiZpPnImJihvPXIscj1pLGk9byksbz1odihuLGkpO3ZhciBsPWh2KG4scik7byYmbCYmKGUucmFuZ2VDb3VudCE9PTF8fGUuYW5jaG9yTm9kZSE9PW8ubm9kZXx8ZS5hbmNob3JPZmZzZXQhPT1vLm9mZnNldHx8ZS5mb2N1c05vZGUhPT1sLm5vZGV8fGUuZm9jdXNPZmZzZXQhPT1sLm9mZnNldCkmJih0PXQuY3JlYXRlUmFuZ2UoKSx0LnNldFN0YXJ0KG8ubm9kZSxvLm9mZnNldCksZS5yZW1vdmVBbGxSYW5nZXMoKSxpPnI/KGUuYWRkUmFuZ2UodCksZS5leHRlbmQobC5ub2RlLGwub2Zmc2V0KSk6KHQuc2V0RW5kKGwubm9kZSxsLm9mZnNldCksZS5hZGRSYW5nZSh0KSkpfX1mb3IodD1bXSxlPW47ZT1lLnBhcmVudE5vZGU7KWUubm9kZVR5cGU9PT0xJiZ0LnB1c2goe2VsZW1lbnQ6ZSxsZWZ0OmUuc2Nyb2xsTGVmdCx0b3A6ZS5zY3JvbGxUb3B9KTtmb3IodHlwZW9mIG4uZm9jdXM9PSJmdW5jdGlvbiImJm4uZm9jdXMoKSxuPTA7bjx0Lmxlbmd0aDtuKyspZT10W25dLGUuZWxlbWVudC5zY3JvbGxMZWZ0PWUubGVmdCxlLmVsZW1lbnQuc2Nyb2xsVG9wPWUudG9wfX12YXIgdGs9SXImJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJjExPj1kb2N1bWVudC5kb2N1bWVudE1vZGUsS2k9bnVsbCx0aD1udWxsLE5zPW51bGwsbmg9ITE7ZnVuY3Rpb24gcHYoZSx0LG4pe3ZhciByPW4ud2luZG93PT09bj9uLmRvY3VtZW50Om4ubm9kZVR5cGU9PT05P246bi5vd25lckRvY3VtZW50O25ofHxLaT09bnVsbHx8S2khPT1WdShyKXx8KHI9S2ksInNlbGVjdGlvblN0YXJ0ImluIHImJlhwKHIpP3I9e3N0YXJ0OnIuc2VsZWN0aW9uU3RhcnQsZW5kOnIuc2VsZWN0aW9uRW5kfToocj0oci5vd25lckRvY3VtZW50JiZyLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCkscj17YW5jaG9yTm9kZTpyLmFuY2hvck5vZGUsYW5jaG9yT2Zmc2V0OnIuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTpyLmZvY3VzTm9kZSxmb2N1c09mZnNldDpyLmZvY3VzT2Zmc2V0fSksTnMmJmVhKE5zLHIpfHwoTnM9cixyPUp1KHRoLCJvblNlbGVjdCIpLDA8ci5sZW5ndGgmJih0PW5ldyBLcCgib25TZWxlY3QiLCJzZWxlY3QiLG51bGwsdCxuKSxlLnB1c2goe2V2ZW50OnQsbGlzdGVuZXJzOnJ9KSx0LnRhcmdldD1LaSkpKX1mdW5jdGlvbiBldShlLHQpe3ZhciBuPXt9O3JldHVybiBuW2UudG9Mb3dlckNhc2UoKV09dC50b0xvd2VyQ2FzZSgpLG5bIldlYmtpdCIrZV09IndlYmtpdCIrdCxuWyJNb3oiK2VdPSJtb3oiK3Qsbn12YXIgR2k9e2FuaW1hdGlvbmVuZDpldSgiQW5pbWF0aW9uIiwiQW5pbWF0aW9uRW5kIiksYW5pbWF0aW9uaXRlcmF0aW9uOmV1KCJBbmltYXRpb24iLCJBbmltYXRpb25JdGVyYXRpb24iKSxhbmltYXRpb25zdGFydDpldSgiQW5pbWF0aW9uIiwiQW5pbWF0aW9uU3RhcnQiKSx0cmFuc2l0aW9uZW5kOmV1KCJUcmFuc2l0aW9uIiwiVHJhbnNpdGlvbkVuZCIpfSxKZD17fSxLMT17fTtJciYmKEsxPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJBbmltYXRpb25FdmVudCJpbiB3aW5kb3d8fChkZWxldGUgR2kuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbixkZWxldGUgR2kuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbixkZWxldGUgR2kuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uKSwiVHJhbnNpdGlvbkV2ZW50ImluIHdpbmRvd3x8ZGVsZXRlIEdpLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbik7ZnVuY3Rpb24gS2MoZSl7aWYoSmRbZV0pcmV0dXJuIEpkW2VdO2lmKCFHaVtlXSlyZXR1cm4gZTt2YXIgdD1HaVtlXSxuO2ZvcihuIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShuKSYmbiBpbiBLMSlyZXR1cm4gSmRbZV09dFtuXTtyZXR1cm4gZX12YXIgRzE9S2MoImFuaW1hdGlvbmVuZCIpLFkxPUtjKCJhbmltYXRpb25pdGVyYXRpb24iKSxYMT1LYygiYW5pbWF0aW9uc3RhcnQiKSxRMT1LYygidHJhbnNpdGlvbmVuZCIpLEoxPW5ldyBNYXAsZ3Y9ImFib3J0IGF1eENsaWNrIGNhbmNlbCBjYW5QbGF5IGNhblBsYXlUaHJvdWdoIGNsaWNrIGNsb3NlIGNvbnRleHRNZW51IGNvcHkgY3V0IGRyYWcgZHJhZ0VuZCBkcmFnRW50ZXIgZHJhZ0V4aXQgZHJhZ0xlYXZlIGRyYWdPdmVyIGRyYWdTdGFydCBkcm9wIGR1cmF0aW9uQ2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGdvdFBvaW50ZXJDYXB0dXJlIGlucHV0IGludmFsaWQga2V5RG93biBrZXlQcmVzcyBrZXlVcCBsb2FkIGxvYWRlZERhdGEgbG9hZGVkTWV0YWRhdGEgbG9hZFN0YXJ0IGxvc3RQb2ludGVyQ2FwdHVyZSBtb3VzZURvd24gbW91c2VNb3ZlIG1vdXNlT3V0IG1vdXNlT3ZlciBtb3VzZVVwIHBhc3RlIHBhdXNlIHBsYXkgcGxheWluZyBwb2ludGVyQ2FuY2VsIHBvaW50ZXJEb3duIHBvaW50ZXJNb3ZlIHBvaW50ZXJPdXQgcG9pbnRlck92ZXIgcG9pbnRlclVwIHByb2dyZXNzIHJhdGVDaGFuZ2UgcmVzZXQgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VibWl0IHN1c3BlbmQgdGltZVVwZGF0ZSB0b3VjaENhbmNlbCB0b3VjaEVuZCB0b3VjaFN0YXJ0IHZvbHVtZUNoYW5nZSBzY3JvbGwgdG9nZ2xlIHRvdWNoTW92ZSB3YWl0aW5nIHdoZWVsIi5zcGxpdCgiICIpO2Z1bmN0aW9uIElvKGUsdCl7SjEuc2V0KGUsdCkseGkodCxbZV0pfWZvcih2YXIgWmQ9MDtaZDxndi5sZW5ndGg7WmQrKyl7dmFyIHFkPWd2W1pkXSxuaz1xZC50b0xvd2VyQ2FzZSgpLHJrPXFkWzBdLnRvVXBwZXJDYXNlKCkrcWQuc2xpY2UoMSk7SW8obmssIm9uIityayl9SW8oRzEsIm9uQW5pbWF0aW9uRW5kIik7SW8oWTEsIm9uQW5pbWF0aW9uSXRlcmF0aW9uIik7SW8oWDEsIm9uQW5pbWF0aW9uU3RhcnQiKTtJbygiZGJsY2xpY2siLCJvbkRvdWJsZUNsaWNrIik7SW8oImZvY3VzaW4iLCJvbkZvY3VzIik7SW8oImZvY3Vzb3V0Iiwib25CbHVyIik7SW8oUTEsIm9uVHJhbnNpdGlvbkVuZCIpO3ZsKCJvbk1vdXNlRW50ZXIiLFsibW91c2VvdXQiLCJtb3VzZW92ZXIiXSk7dmwoIm9uTW91c2VMZWF2ZSIsWyJtb3VzZW91dCIsIm1vdXNlb3ZlciJdKTt2bCgib25Qb2ludGVyRW50ZXIiLFsicG9pbnRlcm91dCIsInBvaW50ZXJvdmVyIl0pO3ZsKCJvblBvaW50ZXJMZWF2ZSIsWyJwb2ludGVyb3V0IiwicG9pbnRlcm92ZXIiXSk7eGkoIm9uQ2hhbmdlIiwiY2hhbmdlIGNsaWNrIGZvY3VzaW4gZm9jdXNvdXQgaW5wdXQga2V5ZG93biBrZXl1cCBzZWxlY3Rpb25jaGFuZ2UiLnNwbGl0KCIgIikpO3hpKCJvblNlbGVjdCIsImZvY3Vzb3V0IGNvbnRleHRtZW51IGRyYWdlbmQgZm9jdXNpbiBrZXlkb3duIGtleXVwIG1vdXNlZG93biBtb3VzZXVwIHNlbGVjdGlvbmNoYW5nZSIuc3BsaXQoIiAiKSk7eGkoIm9uQmVmb3JlSW5wdXQiLFsiY29tcG9zaXRpb25lbmQiLCJrZXlwcmVzcyIsInRleHRJbnB1dCIsInBhc3RlIl0pO3hpKCJvbkNvbXBvc2l0aW9uRW5kIiwiY29tcG9zaXRpb25lbmQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpO3hpKCJvbkNvbXBvc2l0aW9uU3RhcnQiLCJjb21wb3NpdGlvbnN0YXJ0IGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTt4aSgib25Db21wb3NpdGlvblVwZGF0ZSIsImNvbXBvc2l0aW9udXBkYXRlIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTt2YXIgeHM9ImFib3J0IGNhbnBsYXkgY2FucGxheXRocm91Z2ggZHVyYXRpb25jaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YSBsb2Fkc3RhcnQgcGF1c2UgcGxheSBwbGF5aW5nIHByb2dyZXNzIHJhdGVjaGFuZ2UgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VzcGVuZCB0aW1ldXBkYXRlIHZvbHVtZWNoYW5nZSB3YWl0aW5nIi5zcGxpdCgiICIpLG9rPW5ldyBTZXQoImNhbmNlbCBjbG9zZSBpbnZhbGlkIGxvYWQgc2Nyb2xsIHRvZ2dsZSIuc3BsaXQoIiAiKS5jb25jYXQoeHMpKTtmdW5jdGlvbiBtdihlLHQsbil7dmFyIHI9ZS50eXBlfHwidW5rbm93bi1ldmVudCI7ZS5jdXJyZW50VGFyZ2V0PW4sbiQocix0LHZvaWQgMCxlKSxlLmN1cnJlbnRUYXJnZXQ9bnVsbH1mdW5jdGlvbiBaMShlLHQpe3Q9KHQmNCkhPT0wO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dLG89ci5ldmVudDtyPXIubGlzdGVuZXJzO2U6e3ZhciBpPXZvaWQgMDtpZih0KWZvcih2YXIgbD1yLmxlbmd0aC0xOzA8PWw7bC0tKXt2YXIgcz1yW2xdLGE9cy5pbnN0YW5jZSx1PXMuY3VycmVudFRhcmdldDtpZihzPXMubGlzdGVuZXIsYSE9PWkmJm8uaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVhayBlO212KG8scyx1KSxpPWF9ZWxzZSBmb3IobD0wO2w8ci5sZW5ndGg7bCsrKXtpZihzPXJbbF0sYT1zLmluc3RhbmNlLHU9cy5jdXJyZW50VGFyZ2V0LHM9cy5saXN0ZW5lcixhIT09aSYmby5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGU7bXYobyxzLHUpLGk9YX19fWlmKEt1KXRocm93IGU9SmYsS3U9ITEsSmY9bnVsbCxlfWZ1bmN0aW9uIFVlKGUsdCl7dmFyIG49dFtzaF07bj09PXZvaWQgMCYmKG49dFtzaF09bmV3IFNldCk7dmFyIHI9ZSsiX19idWJibGUiO24uaGFzKHIpfHwocTEodCxlLDIsITEpLG4uYWRkKHIpKX1mdW5jdGlvbiBlZihlLHQsbil7dmFyIHI9MDt0JiYocnw9NCkscTEobixlLHIsdCl9dmFyIHR1PSJfcmVhY3RMaXN0ZW5pbmciK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO2Z1bmN0aW9uIHRhKGUpe2lmKCFlW3R1XSl7ZVt0dV09ITAsbDEuZm9yRWFjaChmdW5jdGlvbihuKXtuIT09InNlbGVjdGlvbmNoYW5nZSImJihvay5oYXMobil8fGVmKG4sITEsZSksZWYobiwhMCxlKSl9KTt2YXIgdD1lLm5vZGVUeXBlPT09OT9lOmUub3duZXJEb2N1bWVudDt0PT09bnVsbHx8dFt0dV18fCh0W3R1XT0hMCxlZigic2VsZWN0aW9uY2hhbmdlIiwhMSx0KSl9fWZ1bmN0aW9uIHExKGUsdCxuLHIpe3N3aXRjaChMMSh0KSl7Y2FzZSAxOnZhciBvPXkkO2JyZWFrO2Nhc2UgNDpvPXgkO2JyZWFrO2RlZmF1bHQ6bz1WcH1uPW8uYmluZChudWxsLHQsbixlKSxvPXZvaWQgMCwhUWZ8fHQhPT0idG91Y2hzdGFydCImJnQhPT0idG91Y2htb3ZlIiYmdCE9PSJ3aGVlbCJ8fChvPSEwKSxyP28hPT12b2lkIDA/ZS5hZGRFdmVudExpc3RlbmVyKHQsbix7Y2FwdHVyZTohMCxwYXNzaXZlOm99KTplLmFkZEV2ZW50TGlzdGVuZXIodCxuLCEwKTpvIT09dm9pZCAwP2UuYWRkRXZlbnRMaXN0ZW5lcih0LG4se3Bhc3NpdmU6b30pOmUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITEpfWZ1bmN0aW9uIHRmKGUsdCxuLHIsbyl7dmFyIGk9cjtpZighKHQmMSkmJiEodCYyKSYmciE9PW51bGwpZTpmb3IoOzspe2lmKHI9PT1udWxsKXJldHVybjt2YXIgbD1yLnRhZztpZihsPT09M3x8bD09PTQpe3ZhciBzPXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87aWYocz09PW98fHMubm9kZVR5cGU9PT04JiZzLnBhcmVudE5vZGU9PT1vKWJyZWFrO2lmKGw9PT00KWZvcihsPXIucmV0dXJuO2whPT1udWxsOyl7dmFyIGE9bC50YWc7aWYoKGE9PT0zfHxhPT09NCkmJihhPWwuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sYT09PW98fGEubm9kZVR5cGU9PT04JiZhLnBhcmVudE5vZGU9PT1vKSlyZXR1cm47bD1sLnJldHVybn1mb3IoO3MhPT1udWxsOyl7aWYobD1RbyhzKSxsPT09bnVsbClyZXR1cm47aWYoYT1sLnRhZyxhPT09NXx8YT09PTYpe3I9aT1sO2NvbnRpbnVlIGV9cz1zLnBhcmVudE5vZGV9fXI9ci5yZXR1cm59UzEoZnVuY3Rpb24oKXt2YXIgdT1pLGM9RnAobiksZD1bXTtlOnt2YXIgZj1KMS5nZXQoZSk7aWYoZiE9PXZvaWQgMCl7dmFyIGg9S3AsZz1lO3N3aXRjaChlKXtjYXNlImtleXByZXNzIjppZihOdShuKT09PTApYnJlYWsgZTtjYXNlImtleWRvd24iOmNhc2Uia2V5dXAiOmg9TSQ7YnJlYWs7Y2FzZSJmb2N1c2luIjpnPSJmb2N1cyIsaD1ZZDticmVhaztjYXNlImZvY3Vzb3V0IjpnPSJibHVyIixoPVlkO2JyZWFrO2Nhc2UiYmVmb3JlYmx1ciI6Y2FzZSJhZnRlcmJsdXIiOmg9WWQ7YnJlYWs7Y2FzZSJjbGljayI6aWYobi5idXR0b249PT0yKWJyZWFrIGU7Y2FzZSJhdXhjbGljayI6Y2FzZSJkYmxjbGljayI6Y2FzZSJtb3VzZWRvd24iOmNhc2UibW91c2Vtb3ZlIjpjYXNlIm1vdXNldXAiOmNhc2UibW91c2VvdXQiOmNhc2UibW91c2VvdmVyIjpjYXNlImNvbnRleHRtZW51IjpoPW92O2JyZWFrO2Nhc2UiZHJhZyI6Y2FzZSJkcmFnZW5kIjpjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnZXhpdCI6Y2FzZSJkcmFnbGVhdmUiOmNhc2UiZHJhZ292ZXIiOmNhc2UiZHJhZ3N0YXJ0IjpjYXNlImRyb3AiOmg9UyQ7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Y2FzZSJ0b3VjaGVuZCI6Y2FzZSJ0b3VjaG1vdmUiOmNhc2UidG91Y2hzdGFydCI6aD1JJDticmVhaztjYXNlIEcxOmNhc2UgWTE6Y2FzZSBYMTpoPSQkO2JyZWFrO2Nhc2UgUTE6aD16JDticmVhaztjYXNlInNjcm9sbCI6aD1fJDticmVhaztjYXNlIndoZWVsIjpoPUIkO2JyZWFrO2Nhc2UiY29weSI6Y2FzZSJjdXQiOmNhc2UicGFzdGUiOmg9VCQ7YnJlYWs7Y2FzZSJnb3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJsb3N0cG9pbnRlcmNhcHR1cmUiOmNhc2UicG9pbnRlcmNhbmNlbCI6Y2FzZSJwb2ludGVyZG93biI6Y2FzZSJwb2ludGVybW92ZSI6Y2FzZSJwb2ludGVyb3V0IjpjYXNlInBvaW50ZXJvdmVyIjpjYXNlInBvaW50ZXJ1cCI6aD1sdn12YXIgbT0odCY0KSE9PTAsUz0hbSYmZT09PSJzY3JvbGwiLHY9bT9mIT09bnVsbD9mKyJDYXB0dXJlIjpudWxsOmY7bT1bXTtmb3IodmFyIHk9dSxfO3khPT1udWxsOyl7Xz15O3ZhciB3PV8uc3RhdGVOb2RlO2lmKF8udGFnPT09NSYmdyE9PW51bGwmJihfPXcsdiE9PW51bGwmJih3PVhzKHksdiksdyE9bnVsbCYmbS5wdXNoKG5hKHksdyxfKSkpKSxTKWJyZWFrO3k9eS5yZXR1cm59MDxtLmxlbmd0aCYmKGY9bmV3IGgoZixnLG51bGwsbixjKSxkLnB1c2goe2V2ZW50OmYsbGlzdGVuZXJzOm19KSl9fWlmKCEodCY3KSl7ZTp7aWYoZj1lPT09Im1vdXNlb3ZlciJ8fGU9PT0icG9pbnRlcm92ZXIiLGg9ZT09PSJtb3VzZW91dCJ8fGU9PT0icG9pbnRlcm91dCIsZiYmbiE9PVlmJiYoZz1uLnJlbGF0ZWRUYXJnZXR8fG4uZnJvbUVsZW1lbnQpJiYoUW8oZyl8fGdbanJdKSlicmVhayBlO2lmKChofHxmKSYmKGY9Yy53aW5kb3c9PT1jP2M6KGY9Yy5vd25lckRvY3VtZW50KT9mLmRlZmF1bHRWaWV3fHxmLnBhcmVudFdpbmRvdzp3aW5kb3csaD8oZz1uLnJlbGF0ZWRUYXJnZXR8fG4udG9FbGVtZW50LGg9dSxnPWc/UW8oZyk6bnVsbCxnIT09bnVsbCYmKFM9X2koZyksZyE9PVN8fGcudGFnIT09NSYmZy50YWchPT02KSYmKGc9bnVsbCkpOihoPW51bGwsZz11KSxoIT09Zykpe2lmKG09b3Ysdz0ib25Nb3VzZUxlYXZlIix2PSJvbk1vdXNlRW50ZXIiLHk9Im1vdXNlIiwoZT09PSJwb2ludGVyb3V0Inx8ZT09PSJwb2ludGVyb3ZlciIpJiYobT1sdix3PSJvblBvaW50ZXJMZWF2ZSIsdj0ib25Qb2ludGVyRW50ZXIiLHk9InBvaW50ZXIiKSxTPWg9PW51bGw/ZjpZaShoKSxfPWc9PW51bGw/ZjpZaShnKSxmPW5ldyBtKHcseSsibGVhdmUiLGgsbixjKSxmLnRhcmdldD1TLGYucmVsYXRlZFRhcmdldD1fLHc9bnVsbCxRbyhjKT09PXUmJihtPW5ldyBtKHYseSsiZW50ZXIiLGcsbixjKSxtLnRhcmdldD1fLG0ucmVsYXRlZFRhcmdldD1TLHc9bSksUz13LGgmJmcpdDp7Zm9yKG09aCx2PWcseT0wLF89bTtfO189T2koXykpeSsrO2ZvcihfPTAsdz12O3c7dz1PaSh3KSlfKys7Zm9yKDswPHktXzspbT1PaShtKSx5LS07Zm9yKDswPF8teTspdj1PaSh2KSxfLS07Zm9yKDt5LS07KXtpZihtPT09dnx8diE9PW51bGwmJm09PT12LmFsdGVybmF0ZSlicmVhayB0O209T2kobSksdj1PaSh2KX1tPW51bGx9ZWxzZSBtPW51bGw7aCE9PW51bGwmJnZ2KGQsZixoLG0sITEpLGchPT1udWxsJiZTIT09bnVsbCYmdnYoZCxTLGcsbSwhMCl9fWU6e2lmKGY9dT9ZaSh1KTp3aW5kb3csaD1mLm5vZGVOYW1lJiZmLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksaD09PSJzZWxlY3QifHxoPT09ImlucHV0IiYmZi50eXBlPT09ImZpbGUiKXZhciBDPVkkO2Vsc2UgaWYodXYoZikpaWYoVzEpQz1aJDtlbHNle0M9USQ7dmFyICQ9WCR9ZWxzZShoPWYubm9kZU5hbWUpJiZoLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYoZi50eXBlPT09ImNoZWNrYm94Inx8Zi50eXBlPT09InJhZGlvIikmJihDPUokKTtpZihDJiYoQz1DKGUsdSkpKXtCMShkLEMsbixjKTticmVhayBlfSQmJiQoZSxmLHUpLGU9PT0iZm9jdXNvdXQiJiYoJD1mLl93cmFwcGVyU3RhdGUpJiYkLmNvbnRyb2xsZWQmJmYudHlwZT09PSJudW1iZXIiJiZVZihmLCJudW1iZXIiLGYudmFsdWUpfXN3aXRjaCgkPXU/WWkodSk6d2luZG93LGUpe2Nhc2UiZm9jdXNpbiI6KHV2KCQpfHwkLmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIikmJihLaT0kLHRoPXUsTnM9bnVsbCk7YnJlYWs7Y2FzZSJmb2N1c291dCI6TnM9dGg9S2k9bnVsbDticmVhaztjYXNlIm1vdXNlZG93biI6bmg9ITA7YnJlYWs7Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJtb3VzZXVwIjpjYXNlImRyYWdlbmQiOm5oPSExLHB2KGQsbixjKTticmVhaztjYXNlInNlbGVjdGlvbmNoYW5nZSI6aWYodGspYnJlYWs7Y2FzZSJrZXlkb3duIjpjYXNlImtleXVwIjpwdihkLG4sYyl9dmFyIEU7aWYoWXApZTp7c3dpdGNoKGUpe2Nhc2UiY29tcG9zaXRpb25zdGFydCI6dmFyIFQ9Im9uQ29tcG9zaXRpb25TdGFydCI7YnJlYWsgZTtjYXNlImNvbXBvc2l0aW9uZW5kIjpUPSJvbkNvbXBvc2l0aW9uRW5kIjticmVhayBlO2Nhc2UiY29tcG9zaXRpb251cGRhdGUiOlQ9Im9uQ29tcG9zaXRpb25VcGRhdGUiO2JyZWFrIGV9VD12b2lkIDB9ZWxzZSBIaT96MShlLG4pJiYoVD0ib25Db21wb3NpdGlvbkVuZCIpOmU9PT0ia2V5ZG93biImJm4ua2V5Q29kZT09PTIyOSYmKFQ9Im9uQ29tcG9zaXRpb25TdGFydCIpO1QmJihqMSYmbi5sb2NhbGUhPT0ia28iJiYoSGl8fFQhPT0ib25Db21wb3NpdGlvblN0YXJ0Ij9UPT09Im9uQ29tcG9zaXRpb25FbmQiJiZIaSYmKEU9STEoKSk6KGhvPWMsSHA9InZhbHVlImluIGhvP2hvLnZhbHVlOmhvLnRleHRDb250ZW50LEhpPSEwKSksJD1KdSh1LFQpLDA8JC5sZW5ndGgmJihUPW5ldyBpdihULGUsbnVsbCxuLGMpLGQucHVzaCh7ZXZlbnQ6VCxsaXN0ZW5lcnM6JH0pLEU/VC5kYXRhPUU6KEU9RjEobiksRSE9PW51bGwmJihULmRhdGE9RSkpKSksKEU9VSQ/ViQoZSxuKTpIJChlLG4pKSYmKHU9SnUodSwib25CZWZvcmVJbnB1dCIpLDA8dS5sZW5ndGgmJihjPW5ldyBpdigib25CZWZvcmVJbnB1dCIsImJlZm9yZWlucHV0IixudWxsLG4sYyksZC5wdXNoKHtldmVudDpjLGxpc3RlbmVyczp1fSksYy5kYXRhPUUpKX1aMShkLHQpfSl9ZnVuY3Rpb24gbmEoZSx0LG4pe3JldHVybntpbnN0YW5jZTplLGxpc3RlbmVyOnQsY3VycmVudFRhcmdldDpufX1mdW5jdGlvbiBKdShlLHQpe2Zvcih2YXIgbj10KyJDYXB0dXJlIixyPVtdO2UhPT1udWxsOyl7dmFyIG89ZSxpPW8uc3RhdGVOb2RlO28udGFnPT09NSYmaSE9PW51bGwmJihvPWksaT1YcyhlLG4pLGkhPW51bGwmJnIudW5zaGlmdChuYShlLGksbykpLGk9WHMoZSx0KSxpIT1udWxsJiZyLnB1c2gobmEoZSxpLG8pKSksZT1lLnJldHVybn1yZXR1cm4gcn1mdW5jdGlvbiBPaShlKXtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtkbyBlPWUucmV0dXJuO3doaWxlKGUmJmUudGFnIT09NSk7cmV0dXJuIGV8fG51bGx9ZnVuY3Rpb24gdnYoZSx0LG4scixvKXtmb3IodmFyIGk9dC5fcmVhY3ROYW1lLGw9W107biE9PW51bGwmJm4hPT1yOyl7dmFyIHM9bixhPXMuYWx0ZXJuYXRlLHU9cy5zdGF0ZU5vZGU7aWYoYSE9PW51bGwmJmE9PT1yKWJyZWFrO3MudGFnPT09NSYmdSE9PW51bGwmJihzPXUsbz8oYT1YcyhuLGkpLGEhPW51bGwmJmwudW5zaGlmdChuYShuLGEscykpKTpvfHwoYT1YcyhuLGkpLGEhPW51bGwmJmwucHVzaChuYShuLGEscykpKSksbj1uLnJldHVybn1sLmxlbmd0aCE9PTAmJmUucHVzaCh7ZXZlbnQ6dCxsaXN0ZW5lcnM6bH0pfXZhciBpaz0vXHJcbj8vZyxsaz0vXHUwMDAwfFx1RkZGRC9nO2Z1bmN0aW9uIHl2KGUpe3JldHVybih0eXBlb2YgZT09InN0cmluZyI/ZToiIitlKS5yZXBsYWNlKGlrLGAKYCkucmVwbGFjZShsaywiIil9ZnVuY3Rpb24gbnUoZSx0LG4pe2lmKHQ9eXYodCkseXYoZSkhPT10JiZuKXRocm93IEVycm9yKFcoNDI1KSl9ZnVuY3Rpb24gWnUoKXt9dmFyIHJoPW51bGwsb2g9bnVsbDtmdW5jdGlvbiBpaChlLHQpe3JldHVybiBlPT09InRleHRhcmVhInx8ZT09PSJub3NjcmlwdCJ8fHR5cGVvZiB0LmNoaWxkcmVuPT0ic3RyaW5nInx8dHlwZW9mIHQuY2hpbGRyZW49PSJudW1iZXIifHx0eXBlb2YgdC5kYW5nZXJvdXNseVNldElubmVySFRNTD09Im9iamVjdCImJnQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPT1udWxsJiZ0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCE9bnVsbH12YXIgbGg9dHlwZW9mIHNldFRpbWVvdXQ9PSJmdW5jdGlvbiI/c2V0VGltZW91dDp2b2lkIDAsc2s9dHlwZW9mIGNsZWFyVGltZW91dD09ImZ1bmN0aW9uIj9jbGVhclRpbWVvdXQ6dm9pZCAwLHh2PXR5cGVvZiBQcm9taXNlPT0iZnVuY3Rpb24iP1Byb21pc2U6dm9pZCAwLGFrPXR5cGVvZiBxdWV1ZU1pY3JvdGFzaz09ImZ1bmN0aW9uIj9xdWV1ZU1pY3JvdGFzazp0eXBlb2YgeHY8InUiP2Z1bmN0aW9uKGUpe3JldHVybiB4di5yZXNvbHZlKG51bGwpLnRoZW4oZSkuY2F0Y2godWspfTpsaDtmdW5jdGlvbiB1ayhlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgZX0pfWZ1bmN0aW9uIG5mKGUsdCl7dmFyIG49dCxyPTA7ZG97dmFyIG89bi5uZXh0U2libGluZztpZihlLnJlbW92ZUNoaWxkKG4pLG8mJm8ubm9kZVR5cGU9PT04KWlmKG49by5kYXRhLG49PT0iLyQiKXtpZihyPT09MCl7ZS5yZW1vdmVDaGlsZChvKSxacyh0KTtyZXR1cm59ci0tfWVsc2UgbiE9PSIkIiYmbiE9PSIkPyImJm4hPT0iJCEifHxyKys7bj1vfXdoaWxlKG4pO1pzKHQpfWZ1bmN0aW9uIF9vKGUpe2Zvcig7ZSE9bnVsbDtlPWUubmV4dFNpYmxpbmcpe3ZhciB0PWUubm9kZVR5cGU7aWYodD09PTF8fHQ9PT0zKWJyZWFrO2lmKHQ9PT04KXtpZih0PWUuZGF0YSx0PT09IiQifHx0PT09IiQhInx8dD09PSIkPyIpYnJlYWs7aWYodD09PSIvJCIpcmV0dXJuIG51bGx9fXJldHVybiBlfWZ1bmN0aW9uIF92KGUpe2U9ZS5wcmV2aW91c1NpYmxpbmc7Zm9yKHZhciB0PTA7ZTspe2lmKGUubm9kZVR5cGU9PT04KXt2YXIgbj1lLmRhdGE7aWYobj09PSIkInx8bj09PSIkISJ8fG49PT0iJD8iKXtpZih0PT09MClyZXR1cm4gZTt0LS19ZWxzZSBuPT09Ii8kIiYmdCsrfWU9ZS5wcmV2aW91c1NpYmxpbmd9cmV0dXJuIG51bGx9dmFyIERsPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLHVyPSJfX3JlYWN0RmliZXIkIitEbCxyYT0iX19yZWFjdFByb3BzJCIrRGwsanI9Il9fcmVhY3RDb250YWluZXIkIitEbCxzaD0iX19yZWFjdEV2ZW50cyQiK0RsLGNrPSJfX3JlYWN0TGlzdGVuZXJzJCIrRGwsZGs9Il9fcmVhY3RIYW5kbGVzJCIrRGw7ZnVuY3Rpb24gUW8oZSl7dmFyIHQ9ZVt1cl07aWYodClyZXR1cm4gdDtmb3IodmFyIG49ZS5wYXJlbnROb2RlO247KXtpZih0PW5banJdfHxuW3VyXSl7aWYobj10LmFsdGVybmF0ZSx0LmNoaWxkIT09bnVsbHx8biE9PW51bGwmJm4uY2hpbGQhPT1udWxsKWZvcihlPV92KGUpO2UhPT1udWxsOyl7aWYobj1lW3VyXSlyZXR1cm4gbjtlPV92KGUpfXJldHVybiB0fWU9bixuPWUucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBiYShlKXtyZXR1cm4gZT1lW3VyXXx8ZVtqcl0sIWV8fGUudGFnIT09NSYmZS50YWchPT02JiZlLnRhZyE9PTEzJiZlLnRhZyE9PTM/bnVsbDplfWZ1bmN0aW9uIFlpKGUpe2lmKGUudGFnPT09NXx8ZS50YWc9PT02KXJldHVybiBlLnN0YXRlTm9kZTt0aHJvdyBFcnJvcihXKDMzKSl9ZnVuY3Rpb24gR2MoZSl7cmV0dXJuIGVbcmFdfHxudWxsfXZhciBhaD1bXSxYaT0tMTtmdW5jdGlvbiBqbyhlKXtyZXR1cm57Y3VycmVudDplfX1mdW5jdGlvbiBHZShlKXswPlhpfHwoZS5jdXJyZW50PWFoW1hpXSxhaFtYaV09bnVsbCxYaS0tKX1mdW5jdGlvbiBGZShlLHQpe1hpKyssYWhbWGldPWUuY3VycmVudCxlLmN1cnJlbnQ9dH12YXIgTm89e30sR3Q9am8oTm8pLGNuPWpvKCExKSxzaT1ObztmdW5jdGlvbiB5bChlLHQpe3ZhciBuPWUudHlwZS5jb250ZXh0VHlwZXM7aWYoIW4pcmV0dXJuIE5vO3ZhciByPWUuc3RhdGVOb2RlO2lmKHImJnIuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD09PXQpcmV0dXJuIHIuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ7dmFyIG89e30saTtmb3IoaSBpbiBuKW9baV09dFtpXTtyZXR1cm4gciYmKGU9ZS5zdGF0ZU5vZGUsZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PXQsZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1vKSxvfWZ1bmN0aW9uIGRuKGUpe3JldHVybiBlPWUuY2hpbGRDb250ZXh0VHlwZXMsZSE9bnVsbH1mdW5jdGlvbiBxdSgpe0dlKGNuKSxHZShHdCl9ZnVuY3Rpb24gd3YoZSx0LG4pe2lmKEd0LmN1cnJlbnQhPT1Obyl0aHJvdyBFcnJvcihXKDE2OCkpO0ZlKEd0LHQpLEZlKGNuLG4pfWZ1bmN0aW9uIGV4KGUsdCxuKXt2YXIgcj1lLnN0YXRlTm9kZTtpZih0PXQuY2hpbGRDb250ZXh0VHlwZXMsdHlwZW9mIHIuZ2V0Q2hpbGRDb250ZXh0IT0iZnVuY3Rpb24iKXJldHVybiBuO3I9ci5nZXRDaGlsZENvbnRleHQoKTtmb3IodmFyIG8gaW4gcilpZighKG8gaW4gdCkpdGhyb3cgRXJyb3IoVygxMDgsWEUoZSl8fCJVbmtub3duIixvKSk7cmV0dXJuIHR0KHt9LG4scil9ZnVuY3Rpb24gZWMoZSl7cmV0dXJuIGU9KGU9ZS5zdGF0ZU5vZGUpJiZlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0fHxObyxzaT1HdC5jdXJyZW50LEZlKEd0LGUpLEZlKGNuLGNuLmN1cnJlbnQpLCEwfWZ1bmN0aW9uIFN2KGUsdCxuKXt2YXIgcj1lLnN0YXRlTm9kZTtpZighcil0aHJvdyBFcnJvcihXKDE2OSkpO24/KGU9ZXgoZSx0LHNpKSxyLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0PWUsR2UoY24pLEdlKEd0KSxGZShHdCxlKSk6R2UoY24pLEZlKGNuLG4pfXZhciBQcj1udWxsLFljPSExLHJmPSExO2Z1bmN0aW9uIHR4KGUpe1ByPT09bnVsbD9Qcj1bZV06UHIucHVzaChlKX1mdW5jdGlvbiBmayhlKXtZYz0hMCx0eChlKX1mdW5jdGlvbiB6bygpe2lmKCFyZiYmUHIhPT1udWxsKXtyZj0hMDt2YXIgZT0wLHQ9UGU7dHJ5e3ZhciBuPVByO2ZvcihQZT0xO2U8bi5sZW5ndGg7ZSsrKXt2YXIgcj1uW2VdO2RvIHI9cighMCk7d2hpbGUociE9PW51bGwpfVByPW51bGwsWWM9ITF9Y2F0Y2gobyl7dGhyb3cgUHIhPT1udWxsJiYoUHI9UHIuc2xpY2UoZSsxKSksazEoQnAsem8pLG99ZmluYWxseXtQZT10LHJmPSExfX1yZXR1cm4gbnVsbH12YXIgUWk9W10sSmk9MCx0Yz1udWxsLG5jPTAsT249W10sQW49MCxhaT1udWxsLE1yPTEsRHI9IiI7ZnVuY3Rpb24gS28oZSx0KXtRaVtKaSsrXT1uYyxRaVtKaSsrXT10Yyx0Yz1lLG5jPXR9ZnVuY3Rpb24gbngoZSx0LG4pe09uW0FuKytdPU1yLE9uW0FuKytdPURyLE9uW0FuKytdPWFpLGFpPWU7dmFyIHI9TXI7ZT1Ecjt2YXIgbz0zMi1xbihyKS0xO3ImPX4oMTw8byksbis9MTt2YXIgaT0zMi1xbih0KStvO2lmKDMwPGkpe3ZhciBsPW8tbyU1O2k9KHImKDE8PGwpLTEpLnRvU3RyaW5nKDMyKSxyPj49bCxvLT1sLE1yPTE8PDMyLXFuKHQpK298bjw8b3xyLERyPWkrZX1lbHNlIE1yPTE8PGl8bjw8b3xyLERyPWV9ZnVuY3Rpb24gUXAoZSl7ZS5yZXR1cm4hPT1udWxsJiYoS28oZSwxKSxueChlLDEsMCkpfWZ1bmN0aW9uIEpwKGUpe2Zvcig7ZT09PXRjOyl0Yz1RaVstLUppXSxRaVtKaV09bnVsbCxuYz1RaVstLUppXSxRaVtKaV09bnVsbDtmb3IoO2U9PT1haTspYWk9T25bLS1Bbl0sT25bQW5dPW51bGwsRHI9T25bLS1Bbl0sT25bQW5dPW51bGwsTXI9T25bLS1Bbl0sT25bQW5dPW51bGx9dmFyIF9uPW51bGwseG49bnVsbCxZZT0hMSxRbj1udWxsO2Z1bmN0aW9uIHJ4KGUsdCl7dmFyIG49TG4oNSxudWxsLG51bGwsMCk7bi5lbGVtZW50VHlwZT0iREVMRVRFRCIsbi5zdGF0ZU5vZGU9dCxuLnJldHVybj1lLHQ9ZS5kZWxldGlvbnMsdD09PW51bGw/KGUuZGVsZXRpb25zPVtuXSxlLmZsYWdzfD0xNik6dC5wdXNoKG4pfWZ1bmN0aW9uIEN2KGUsdCl7c3dpdGNoKGUudGFnKXtjYXNlIDU6dmFyIG49ZS50eXBlO3JldHVybiB0PXQubm9kZVR5cGUhPT0xfHxuLnRvTG93ZXJDYXNlKCkhPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/bnVsbDp0LHQhPT1udWxsPyhlLnN0YXRlTm9kZT10LF9uPWUseG49X28odC5maXJzdENoaWxkKSwhMCk6ITE7Y2FzZSA2OnJldHVybiB0PWUucGVuZGluZ1Byb3BzPT09IiJ8fHQubm9kZVR5cGUhPT0zP251bGw6dCx0IT09bnVsbD8oZS5zdGF0ZU5vZGU9dCxfbj1lLHhuPW51bGwsITApOiExO2Nhc2UgMTM6cmV0dXJuIHQ9dC5ub2RlVHlwZSE9PTg/bnVsbDp0LHQhPT1udWxsPyhuPWFpIT09bnVsbD97aWQ6TXIsb3ZlcmZsb3c6RHJ9Om51bGwsZS5tZW1vaXplZFN0YXRlPXtkZWh5ZHJhdGVkOnQsdHJlZUNvbnRleHQ6bixyZXRyeUxhbmU6MTA3Mzc0MTgyNH0sbj1MbigxOCxudWxsLG51bGwsMCksbi5zdGF0ZU5vZGU9dCxuLnJldHVybj1lLGUuY2hpbGQ9bixfbj1lLHhuPW51bGwsITApOiExO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIHVoKGUpe3JldHVybihlLm1vZGUmMSkhPT0wJiYoZS5mbGFncyYxMjgpPT09MH1mdW5jdGlvbiBjaChlKXtpZihZZSl7dmFyIHQ9eG47aWYodCl7dmFyIG49dDtpZighQ3YoZSx0KSl7aWYodWgoZSkpdGhyb3cgRXJyb3IoVyg0MTgpKTt0PV9vKG4ubmV4dFNpYmxpbmcpO3ZhciByPV9uO3QmJkN2KGUsdCk/cngocixuKTooZS5mbGFncz1lLmZsYWdzJi00MDk3fDIsWWU9ITEsX249ZSl9fWVsc2V7aWYodWgoZSkpdGhyb3cgRXJyb3IoVyg0MTgpKTtlLmZsYWdzPWUuZmxhZ3MmLTQwOTd8MixZZT0hMSxfbj1lfX19ZnVuY3Rpb24gRXYoZSl7Zm9yKGU9ZS5yZXR1cm47ZSE9PW51bGwmJmUudGFnIT09NSYmZS50YWchPT0zJiZlLnRhZyE9PTEzOyllPWUucmV0dXJuO19uPWV9ZnVuY3Rpb24gcnUoZSl7aWYoZSE9PV9uKXJldHVybiExO2lmKCFZZSlyZXR1cm4gRXYoZSksWWU9ITAsITE7dmFyIHQ7aWYoKHQ9ZS50YWchPT0zKSYmISh0PWUudGFnIT09NSkmJih0PWUudHlwZSx0PXQhPT0iaGVhZCImJnQhPT0iYm9keSImJiFpaChlLnR5cGUsZS5tZW1vaXplZFByb3BzKSksdCYmKHQ9eG4pKXtpZih1aChlKSl0aHJvdyBveCgpLEVycm9yKFcoNDE4KSk7Zm9yKDt0OylyeChlLHQpLHQ9X28odC5uZXh0U2libGluZyl9aWYoRXYoZSksZS50YWc9PT0xMyl7aWYoZT1lLm1lbW9pemVkU3RhdGUsZT1lIT09bnVsbD9lLmRlaHlkcmF0ZWQ6bnVsbCwhZSl0aHJvdyBFcnJvcihXKDMxNykpO2U6e2ZvcihlPWUubmV4dFNpYmxpbmcsdD0wO2U7KXtpZihlLm5vZGVUeXBlPT09OCl7dmFyIG49ZS5kYXRhO2lmKG49PT0iLyQiKXtpZih0PT09MCl7eG49X28oZS5uZXh0U2libGluZyk7YnJlYWsgZX10LS19ZWxzZSBuIT09IiQiJiZuIT09IiQhIiYmbiE9PSIkPyJ8fHQrK31lPWUubmV4dFNpYmxpbmd9eG49bnVsbH19ZWxzZSB4bj1fbj9fbyhlLnN0YXRlTm9kZS5uZXh0U2libGluZyk6bnVsbDtyZXR1cm4hMH1mdW5jdGlvbiBveCgpe2Zvcih2YXIgZT14bjtlOyllPV9vKGUubmV4dFNpYmxpbmcpfWZ1bmN0aW9uIHhsKCl7eG49X249bnVsbCxZZT0hMX1mdW5jdGlvbiBacChlKXtRbj09PW51bGw/UW49W2VdOlFuLnB1c2goZSl9dmFyIGhrPVZyLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO2Z1bmN0aW9uIEduKGUsdCl7aWYoZSYmZS5kZWZhdWx0UHJvcHMpe3Q9dHQoe30sdCksZT1lLmRlZmF1bHRQcm9wcztmb3IodmFyIG4gaW4gZSl0W25dPT09dm9pZCAwJiYodFtuXT1lW25dKTtyZXR1cm4gdH1yZXR1cm4gdH12YXIgcmM9am8obnVsbCksb2M9bnVsbCxaaT1udWxsLHFwPW51bGw7ZnVuY3Rpb24gZWcoKXtxcD1aaT1vYz1udWxsfWZ1bmN0aW9uIHRnKGUpe3ZhciB0PXJjLmN1cnJlbnQ7R2UocmMpLGUuX2N1cnJlbnRWYWx1ZT10fWZ1bmN0aW9uIGRoKGUsdCxuKXtmb3IoO2UhPT1udWxsOyl7dmFyIHI9ZS5hbHRlcm5hdGU7aWYoKGUuY2hpbGRMYW5lcyZ0KSE9PXQ/KGUuY2hpbGRMYW5lc3w9dCxyIT09bnVsbCYmKHIuY2hpbGRMYW5lc3w9dCkpOnIhPT1udWxsJiYoci5jaGlsZExhbmVzJnQpIT09dCYmKHIuY2hpbGRMYW5lc3w9dCksZT09PW4pYnJlYWs7ZT1lLnJldHVybn19ZnVuY3Rpb24gdWwoZSx0KXtvYz1lLHFwPVppPW51bGwsZT1lLmRlcGVuZGVuY2llcyxlIT09bnVsbCYmZS5maXJzdENvbnRleHQhPT1udWxsJiYoZS5sYW5lcyZ0JiYodW49ITApLGUuZmlyc3RDb250ZXh0PW51bGwpfWZ1bmN0aW9uIHpuKGUpe3ZhciB0PWUuX2N1cnJlbnRWYWx1ZTtpZihxcCE9PWUpaWYoZT17Y29udGV4dDplLG1lbW9pemVkVmFsdWU6dCxuZXh0Om51bGx9LFppPT09bnVsbCl7aWYob2M9PT1udWxsKXRocm93IEVycm9yKFcoMzA4KSk7Wmk9ZSxvYy5kZXBlbmRlbmNpZXM9e2xhbmVzOjAsZmlyc3RDb250ZXh0OmV9fWVsc2UgWmk9WmkubmV4dD1lO3JldHVybiB0fXZhciBKbz1udWxsO2Z1bmN0aW9uIG5nKGUpe0pvPT09bnVsbD9Kbz1bZV06Sm8ucHVzaChlKX1mdW5jdGlvbiBpeChlLHQsbixyKXt2YXIgbz10LmludGVybGVhdmVkO3JldHVybiBvPT09bnVsbD8obi5uZXh0PW4sbmcodCkpOihuLm5leHQ9by5uZXh0LG8ubmV4dD1uKSx0LmludGVybGVhdmVkPW4senIoZSxyKX1mdW5jdGlvbiB6cihlLHQpe2UubGFuZXN8PXQ7dmFyIG49ZS5hbHRlcm5hdGU7Zm9yKG4hPT1udWxsJiYobi5sYW5lc3w9dCksbj1lLGU9ZS5yZXR1cm47ZSE9PW51bGw7KWUuY2hpbGRMYW5lc3w9dCxuPWUuYWx0ZXJuYXRlLG4hPT1udWxsJiYobi5jaGlsZExhbmVzfD10KSxuPWUsZT1lLnJldHVybjtyZXR1cm4gbi50YWc9PT0zP24uc3RhdGVOb2RlOm51bGx9dmFyIHNvPSExO2Z1bmN0aW9uIHJnKGUpe2UudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTplLm1lbW9pemVkU3RhdGUsZmlyc3RCYXNlVXBkYXRlOm51bGwsbGFzdEJhc2VVcGRhdGU6bnVsbCxzaGFyZWQ6e3BlbmRpbmc6bnVsbCxpbnRlcmxlYXZlZDpudWxsLGxhbmVzOjB9LGVmZmVjdHM6bnVsbH19ZnVuY3Rpb24gbHgoZSx0KXtlPWUudXBkYXRlUXVldWUsdC51cGRhdGVRdWV1ZT09PWUmJih0LnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6ZS5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmUuZmlyc3RCYXNlVXBkYXRlLGxhc3RCYXNlVXBkYXRlOmUubGFzdEJhc2VVcGRhdGUsc2hhcmVkOmUuc2hhcmVkLGVmZmVjdHM6ZS5lZmZlY3RzfSl9ZnVuY3Rpb24gTHIoZSx0KXtyZXR1cm57ZXZlbnRUaW1lOmUsbGFuZTp0LHRhZzowLHBheWxvYWQ6bnVsbCxjYWxsYmFjazpudWxsLG5leHQ6bnVsbH19ZnVuY3Rpb24gd28oZSx0LG4pe3ZhciByPWUudXBkYXRlUXVldWU7aWYocj09PW51bGwpcmV0dXJuIG51bGw7aWYocj1yLnNoYXJlZCxFZSYyKXt2YXIgbz1yLnBlbmRpbmc7cmV0dXJuIG89PT1udWxsP3QubmV4dD10Oih0Lm5leHQ9by5uZXh0LG8ubmV4dD10KSxyLnBlbmRpbmc9dCx6cihlLG4pfXJldHVybiBvPXIuaW50ZXJsZWF2ZWQsbz09PW51bGw/KHQubmV4dD10LG5nKHIpKToodC5uZXh0PW8ubmV4dCxvLm5leHQ9dCksci5pbnRlcmxlYXZlZD10LHpyKGUsbil9ZnVuY3Rpb24gYnUoZSx0LG4pe2lmKHQ9dC51cGRhdGVRdWV1ZSx0IT09bnVsbCYmKHQ9dC5zaGFyZWQsKG4mNDE5NDI0MCkhPT0wKSl7dmFyIHI9dC5sYW5lcztyJj1lLnBlbmRpbmdMYW5lcyxufD1yLHQubGFuZXM9bixXcChlLG4pfX1mdW5jdGlvbiAkdihlLHQpe3ZhciBuPWUudXBkYXRlUXVldWUscj1lLmFsdGVybmF0ZTtpZihyIT09bnVsbCYmKHI9ci51cGRhdGVRdWV1ZSxuPT09cikpe3ZhciBvPW51bGwsaT1udWxsO2lmKG49bi5maXJzdEJhc2VVcGRhdGUsbiE9PW51bGwpe2Rve3ZhciBsPXtldmVudFRpbWU6bi5ldmVudFRpbWUsbGFuZTpuLmxhbmUsdGFnOm4udGFnLHBheWxvYWQ6bi5wYXlsb2FkLGNhbGxiYWNrOm4uY2FsbGJhY2ssbmV4dDpudWxsfTtpPT09bnVsbD9vPWk9bDppPWkubmV4dD1sLG49bi5uZXh0fXdoaWxlKG4hPT1udWxsKTtpPT09bnVsbD9vPWk9dDppPWkubmV4dD10fWVsc2Ugbz1pPXQ7bj17YmFzZVN0YXRlOnIuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTpvLGxhc3RCYXNlVXBkYXRlOmksc2hhcmVkOnIuc2hhcmVkLGVmZmVjdHM6ci5lZmZlY3RzfSxlLnVwZGF0ZVF1ZXVlPW47cmV0dXJufWU9bi5sYXN0QmFzZVVwZGF0ZSxlPT09bnVsbD9uLmZpcnN0QmFzZVVwZGF0ZT10OmUubmV4dD10LG4ubGFzdEJhc2VVcGRhdGU9dH1mdW5jdGlvbiBpYyhlLHQsbixyKXt2YXIgbz1lLnVwZGF0ZVF1ZXVlO3NvPSExO3ZhciBpPW8uZmlyc3RCYXNlVXBkYXRlLGw9by5sYXN0QmFzZVVwZGF0ZSxzPW8uc2hhcmVkLnBlbmRpbmc7aWYocyE9PW51bGwpe28uc2hhcmVkLnBlbmRpbmc9bnVsbDt2YXIgYT1zLHU9YS5uZXh0O2EubmV4dD1udWxsLGw9PT1udWxsP2k9dTpsLm5leHQ9dSxsPWE7dmFyIGM9ZS5hbHRlcm5hdGU7YyE9PW51bGwmJihjPWMudXBkYXRlUXVldWUscz1jLmxhc3RCYXNlVXBkYXRlLHMhPT1sJiYocz09PW51bGw/Yy5maXJzdEJhc2VVcGRhdGU9dTpzLm5leHQ9dSxjLmxhc3RCYXNlVXBkYXRlPWEpKX1pZihpIT09bnVsbCl7dmFyIGQ9by5iYXNlU3RhdGU7bD0wLGM9dT1hPW51bGwscz1pO2Rve3ZhciBmPXMubGFuZSxoPXMuZXZlbnRUaW1lO2lmKChyJmYpPT09Zil7YyE9PW51bGwmJihjPWMubmV4dD17ZXZlbnRUaW1lOmgsbGFuZTowLHRhZzpzLnRhZyxwYXlsb2FkOnMucGF5bG9hZCxjYWxsYmFjazpzLmNhbGxiYWNrLG5leHQ6bnVsbH0pO2U6e3ZhciBnPWUsbT1zO3N3aXRjaChmPXQsaD1uLG0udGFnKXtjYXNlIDE6aWYoZz1tLnBheWxvYWQsdHlwZW9mIGc9PSJmdW5jdGlvbiIpe2Q9Zy5jYWxsKGgsZCxmKTticmVhayBlfWQ9ZzticmVhayBlO2Nhc2UgMzpnLmZsYWdzPWcuZmxhZ3MmLTY1NTM3fDEyODtjYXNlIDA6aWYoZz1tLnBheWxvYWQsZj10eXBlb2YgZz09ImZ1bmN0aW9uIj9nLmNhbGwoaCxkLGYpOmcsZj09bnVsbClicmVhayBlO2Q9dHQoe30sZCxmKTticmVhayBlO2Nhc2UgMjpzbz0hMH19cy5jYWxsYmFjayE9PW51bGwmJnMubGFuZSE9PTAmJihlLmZsYWdzfD02NCxmPW8uZWZmZWN0cyxmPT09bnVsbD9vLmVmZmVjdHM9W3NdOmYucHVzaChzKSl9ZWxzZSBoPXtldmVudFRpbWU6aCxsYW5lOmYsdGFnOnMudGFnLHBheWxvYWQ6cy5wYXlsb2FkLGNhbGxiYWNrOnMuY2FsbGJhY2ssbmV4dDpudWxsfSxjPT09bnVsbD8odT1jPWgsYT1kKTpjPWMubmV4dD1oLGx8PWY7aWYocz1zLm5leHQscz09PW51bGwpe2lmKHM9by5zaGFyZWQucGVuZGluZyxzPT09bnVsbClicmVhaztmPXMscz1mLm5leHQsZi5uZXh0PW51bGwsby5sYXN0QmFzZVVwZGF0ZT1mLG8uc2hhcmVkLnBlbmRpbmc9bnVsbH19d2hpbGUoMSk7aWYoYz09PW51bGwmJihhPWQpLG8uYmFzZVN0YXRlPWEsby5maXJzdEJhc2VVcGRhdGU9dSxvLmxhc3RCYXNlVXBkYXRlPWMsdD1vLnNoYXJlZC5pbnRlcmxlYXZlZCx0IT09bnVsbCl7bz10O2RvIGx8PW8ubGFuZSxvPW8ubmV4dDt3aGlsZShvIT09dCl9ZWxzZSBpPT09bnVsbCYmKG8uc2hhcmVkLmxhbmVzPTApO2NpfD1sLGUubGFuZXM9bCxlLm1lbW9pemVkU3RhdGU9ZH19ZnVuY3Rpb24ga3YoZSx0LG4pe2lmKGU9dC5lZmZlY3RzLHQuZWZmZWN0cz1udWxsLGUhPT1udWxsKWZvcih0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciByPWVbdF0sbz1yLmNhbGxiYWNrO2lmKG8hPT1udWxsKXtpZihyLmNhbGxiYWNrPW51bGwscj1uLHR5cGVvZiBvIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFcoMTkxLG8pKTtvLmNhbGwocil9fX12YXIgc3g9bmV3IGkxLkNvbXBvbmVudCgpLnJlZnM7ZnVuY3Rpb24gZmgoZSx0LG4scil7dD1lLm1lbW9pemVkU3RhdGUsbj1uKHIsdCksbj1uPT1udWxsP3Q6dHQoe30sdCxuKSxlLm1lbW9pemVkU3RhdGU9bixlLmxhbmVzPT09MCYmKGUudXBkYXRlUXVldWUuYmFzZVN0YXRlPW4pfXZhciBYYz17aXNNb3VudGVkOmZ1bmN0aW9uKGUpe3JldHVybihlPWUuX3JlYWN0SW50ZXJuYWxzKT9faShlKT09PWU6ITF9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihlLHQsbil7ZT1lLl9yZWFjdEludGVybmFsczt2YXIgcj1ubigpLG89Q28oZSksaT1McihyLG8pO2kucGF5bG9hZD10LG4hPW51bGwmJihpLmNhbGxiYWNrPW4pLHQ9d28oZSxpLG8pLHQhPT1udWxsJiYoZXIodCxlLG8sciksYnUodCxlLG8pKX0sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbihlLHQsbil7ZT1lLl9yZWFjdEludGVybmFsczt2YXIgcj1ubigpLG89Q28oZSksaT1McihyLG8pO2kudGFnPTEsaS5wYXlsb2FkPXQsbiE9bnVsbCYmKGkuY2FsbGJhY2s9biksdD13byhlLGksbyksdCE9PW51bGwmJihlcih0LGUsbyxyKSxidSh0LGUsbykpfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oZSx0KXtlPWUuX3JlYWN0SW50ZXJuYWxzO3ZhciBuPW5uKCkscj1DbyhlKSxvPUxyKG4scik7by50YWc9Mix0IT1udWxsJiYoby5jYWxsYmFjaz10KSx0PXdvKGUsbyxyKSx0IT09bnVsbCYmKGVyKHQsZSxyLG4pLGJ1KHQsZSxyKSl9fTtmdW5jdGlvbiBUdihlLHQsbixyLG8saSxsKXtyZXR1cm4gZT1lLnN0YXRlTm9kZSx0eXBlb2YgZS5zaG91bGRDb21wb25lbnRVcGRhdGU9PSJmdW5jdGlvbiI/ZS5zaG91bGRDb21wb25lbnRVcGRhdGUocixpLGwpOnQucHJvdG90eXBlJiZ0LnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudD8hZWEobixyKXx8IWVhKG8saSk6ITB9ZnVuY3Rpb24gYXgoZSx0LG4pe3ZhciByPSExLG89Tm8saT10LmNvbnRleHRUeXBlO3JldHVybiB0eXBlb2YgaT09Im9iamVjdCImJmkhPT1udWxsP2k9em4oaSk6KG89ZG4odCk/c2k6R3QuY3VycmVudCxyPXQuY29udGV4dFR5cGVzLGk9KHI9ciE9bnVsbCk/eWwoZSxvKTpObyksdD1uZXcgdChuLGkpLGUubWVtb2l6ZWRTdGF0ZT10LnN0YXRlIT09bnVsbCYmdC5zdGF0ZSE9PXZvaWQgMD90LnN0YXRlOm51bGwsdC51cGRhdGVyPVhjLGUuc3RhdGVOb2RlPXQsdC5fcmVhY3RJbnRlcm5hbHM9ZSxyJiYoZT1lLnN0YXRlTm9kZSxlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9byxlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PWkpLHR9ZnVuY3Rpb24gTnYoZSx0LG4scil7ZT10LnN0YXRlLHR5cGVvZiB0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM9PSJmdW5jdGlvbiImJnQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuLHIpLHR5cGVvZiB0LlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzPT0iZnVuY3Rpb24iJiZ0LlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG4sciksdC5zdGF0ZSE9PWUmJlhjLmVucXVldWVSZXBsYWNlU3RhdGUodCx0LnN0YXRlLG51bGwpfWZ1bmN0aW9uIGhoKGUsdCxuLHIpe3ZhciBvPWUuc3RhdGVOb2RlO28ucHJvcHM9bixvLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxvLnJlZnM9c3gscmcoZSk7dmFyIGk9dC5jb250ZXh0VHlwZTt0eXBlb2YgaT09Im9iamVjdCImJmkhPT1udWxsP28uY29udGV4dD16bihpKTooaT1kbih0KT9zaTpHdC5jdXJyZW50LG8uY29udGV4dD15bChlLGkpKSxvLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxpPXQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLHR5cGVvZiBpPT0iZnVuY3Rpb24iJiYoZmgoZSx0LGksbiksby5zdGF0ZT1lLm1lbW9pemVkU3RhdGUpLHR5cGVvZiB0LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcz09ImZ1bmN0aW9uInx8dHlwZW9mIG8uZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiJ8fHR5cGVvZiBvLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiImJnR5cGVvZiBvLmNvbXBvbmVudFdpbGxNb3VudCE9ImZ1bmN0aW9uInx8KHQ9by5zdGF0ZSx0eXBlb2Ygby5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJm8uY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIG8uVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmby5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCksdCE9PW8uc3RhdGUmJlhjLmVucXVldWVSZXBsYWNlU3RhdGUobyxvLnN0YXRlLG51bGwpLGljKGUsbixvLHIpLG8uc3RhdGU9ZS5tZW1vaXplZFN0YXRlKSx0eXBlb2Ygby5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKGUuZmxhZ3N8PTQxOTQzMDgpfWZ1bmN0aW9uIGxzKGUsdCxuKXtpZihlPW4ucmVmLGUhPT1udWxsJiZ0eXBlb2YgZSE9ImZ1bmN0aW9uIiYmdHlwZW9mIGUhPSJvYmplY3QiKXtpZihuLl9vd25lcil7aWYobj1uLl9vd25lcixuKXtpZihuLnRhZyE9PTEpdGhyb3cgRXJyb3IoVygzMDkpKTt2YXIgcj1uLnN0YXRlTm9kZX1pZighcil0aHJvdyBFcnJvcihXKDE0NyxlKSk7dmFyIG89cixpPSIiK2U7cmV0dXJuIHQhPT1udWxsJiZ0LnJlZiE9PW51bGwmJnR5cGVvZiB0LnJlZj09ImZ1bmN0aW9uIiYmdC5yZWYuX3N0cmluZ1JlZj09PWk/dC5yZWY6KHQ9ZnVuY3Rpb24obCl7dmFyIHM9by5yZWZzO3M9PT1zeCYmKHM9by5yZWZzPXt9KSxsPT09bnVsbD9kZWxldGUgc1tpXTpzW2ldPWx9LHQuX3N0cmluZ1JlZj1pLHQpfWlmKHR5cGVvZiBlIT0ic3RyaW5nIil0aHJvdyBFcnJvcihXKDI4NCkpO2lmKCFuLl9vd25lcil0aHJvdyBFcnJvcihXKDI5MCxlKSl9cmV0dXJuIGV9ZnVuY3Rpb24gb3UoZSx0KXt0aHJvdyBlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSxFcnJvcihXKDMxLGU9PT0iW29iamVjdCBPYmplY3RdIj8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyh0KS5qb2luKCIsICIpKyJ9IjplKSl9ZnVuY3Rpb24gYnYoZSl7dmFyIHQ9ZS5faW5pdDtyZXR1cm4gdChlLl9wYXlsb2FkKX1mdW5jdGlvbiB1eChlKXtmdW5jdGlvbiB0KHYseSl7aWYoZSl7dmFyIF89di5kZWxldGlvbnM7Xz09PW51bGw/KHYuZGVsZXRpb25zPVt5XSx2LmZsYWdzfD0xNik6Xy5wdXNoKHkpfX1mdW5jdGlvbiBuKHYseSl7aWYoIWUpcmV0dXJuIG51bGw7Zm9yKDt5IT09bnVsbDspdCh2LHkpLHk9eS5zaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIHIodix5KXtmb3Iodj1uZXcgTWFwO3khPT1udWxsOyl5LmtleSE9PW51bGw/di5zZXQoeS5rZXkseSk6di5zZXQoeS5pbmRleCx5KSx5PXkuc2libGluZztyZXR1cm4gdn1mdW5jdGlvbiBvKHYseSl7cmV0dXJuIHY9RW8odix5KSx2LmluZGV4PTAsdi5zaWJsaW5nPW51bGwsdn1mdW5jdGlvbiBpKHYseSxfKXtyZXR1cm4gdi5pbmRleD1fLGU/KF89di5hbHRlcm5hdGUsXyE9PW51bGw/KF89Xy5pbmRleCxfPHk/KHYuZmxhZ3N8PTIseSk6Xyk6KHYuZmxhZ3N8PTIseSkpOih2LmZsYWdzfD0xMDQ4NTc2LHkpfWZ1bmN0aW9uIGwodil7cmV0dXJuIGUmJnYuYWx0ZXJuYXRlPT09bnVsbCYmKHYuZmxhZ3N8PTIpLHZ9ZnVuY3Rpb24gcyh2LHksXyx3KXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09Nj8oeT1kZihfLHYubW9kZSx3KSx5LnJldHVybj12LHkpOih5PW8oeSxfKSx5LnJldHVybj12LHkpfWZ1bmN0aW9uIGEodix5LF8sdyl7dmFyIEM9Xy50eXBlO3JldHVybiBDPT09Vmk/Yyh2LHksXy5wcm9wcy5jaGlsZHJlbix3LF8ua2V5KTp5IT09bnVsbCYmKHkuZWxlbWVudFR5cGU9PT1DfHx0eXBlb2YgQz09Im9iamVjdCImJkMhPT1udWxsJiZDLiQkdHlwZW9mPT09bG8mJmJ2KEMpPT09eS50eXBlKT8odz1vKHksXy5wcm9wcyksdy5yZWY9bHModix5LF8pLHcucmV0dXJuPXYsdyk6KHc9RHUoXy50eXBlLF8ua2V5LF8ucHJvcHMsbnVsbCx2Lm1vZGUsdyksdy5yZWY9bHModix5LF8pLHcucmV0dXJuPXYsdyl9ZnVuY3Rpb24gdSh2LHksXyx3KXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09NHx8eS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyE9PV8uY29udGFpbmVySW5mb3x8eS5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24hPT1fLmltcGxlbWVudGF0aW9uPyh5PWZmKF8sdi5tb2RlLHcpLHkucmV0dXJuPXYseSk6KHk9byh5LF8uY2hpbGRyZW58fFtdKSx5LnJldHVybj12LHkpfWZ1bmN0aW9uIGModix5LF8sdyxDKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09Nz8oeT1uaShfLHYubW9kZSx3LEMpLHkucmV0dXJuPXYseSk6KHk9byh5LF8pLHkucmV0dXJuPXYseSl9ZnVuY3Rpb24gZCh2LHksXyl7aWYodHlwZW9mIHk9PSJzdHJpbmciJiZ5IT09IiJ8fHR5cGVvZiB5PT0ibnVtYmVyIilyZXR1cm4geT1kZigiIit5LHYubW9kZSxfKSx5LnJldHVybj12LHk7aWYodHlwZW9mIHk9PSJvYmplY3QiJiZ5IT09bnVsbCl7c3dpdGNoKHkuJCR0eXBlb2Ype2Nhc2UgR2E6cmV0dXJuIF89RHUoeS50eXBlLHkua2V5LHkucHJvcHMsbnVsbCx2Lm1vZGUsXyksXy5yZWY9bHModixudWxsLHkpLF8ucmV0dXJuPXYsXztjYXNlIFVpOnJldHVybiB5PWZmKHksdi5tb2RlLF8pLHkucmV0dXJuPXYseTtjYXNlIGxvOnZhciB3PXkuX2luaXQ7cmV0dXJuIGQodix3KHkuX3BheWxvYWQpLF8pfWlmKHZzKHkpfHx0cyh5KSlyZXR1cm4geT1uaSh5LHYubW9kZSxfLG51bGwpLHkucmV0dXJuPXYseTtvdSh2LHkpfXJldHVybiBudWxsfWZ1bmN0aW9uIGYodix5LF8sdyl7dmFyIEM9eSE9PW51bGw/eS5rZXk6bnVsbDtpZih0eXBlb2YgXz09InN0cmluZyImJl8hPT0iInx8dHlwZW9mIF89PSJudW1iZXIiKXJldHVybiBDIT09bnVsbD9udWxsOnModix5LCIiK18sdyk7aWYodHlwZW9mIF89PSJvYmplY3QiJiZfIT09bnVsbCl7c3dpdGNoKF8uJCR0eXBlb2Ype2Nhc2UgR2E6cmV0dXJuIF8ua2V5PT09Qz9hKHYseSxfLHcpOm51bGw7Y2FzZSBVaTpyZXR1cm4gXy5rZXk9PT1DP3Uodix5LF8sdyk6bnVsbDtjYXNlIGxvOnJldHVybiBDPV8uX2luaXQsZih2LHksQyhfLl9wYXlsb2FkKSx3KX1pZih2cyhfKXx8dHMoXykpcmV0dXJuIEMhPT1udWxsP251bGw6Yyh2LHksXyx3LG51bGwpO291KHYsXyl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaCh2LHksXyx3LEMpe2lmKHR5cGVvZiB3PT0ic3RyaW5nIiYmdyE9PSIifHx0eXBlb2Ygdz09Im51bWJlciIpcmV0dXJuIHY9di5nZXQoXyl8fG51bGwscyh5LHYsIiIrdyxDKTtpZih0eXBlb2Ygdz09Im9iamVjdCImJnchPT1udWxsKXtzd2l0Y2gody4kJHR5cGVvZil7Y2FzZSBHYTpyZXR1cm4gdj12LmdldCh3LmtleT09PW51bGw/Xzp3LmtleSl8fG51bGwsYSh5LHYsdyxDKTtjYXNlIFVpOnJldHVybiB2PXYuZ2V0KHcua2V5PT09bnVsbD9fOncua2V5KXx8bnVsbCx1KHksdix3LEMpO2Nhc2UgbG86dmFyICQ9dy5faW5pdDtyZXR1cm4gaCh2LHksXywkKHcuX3BheWxvYWQpLEMpfWlmKHZzKHcpfHx0cyh3KSlyZXR1cm4gdj12LmdldChfKXx8bnVsbCxjKHksdix3LEMsbnVsbCk7b3UoeSx3KX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBnKHYseSxfLHcpe2Zvcih2YXIgQz1udWxsLCQ9bnVsbCxFPXksVD15PTAsTT1udWxsO0UhPT1udWxsJiZUPF8ubGVuZ3RoO1QrKyl7RS5pbmRleD5UPyhNPUUsRT1udWxsKTpNPUUuc2libGluZzt2YXIgUj1mKHYsRSxfW1RdLHcpO2lmKFI9PT1udWxsKXtFPT09bnVsbCYmKEU9TSk7YnJlYWt9ZSYmRSYmUi5hbHRlcm5hdGU9PT1udWxsJiZ0KHYsRSkseT1pKFIseSxUKSwkPT09bnVsbD9DPVI6JC5zaWJsaW5nPVIsJD1SLEU9TX1pZihUPT09Xy5sZW5ndGgpcmV0dXJuIG4odixFKSxZZSYmS28odixUKSxDO2lmKEU9PT1udWxsKXtmb3IoO1Q8Xy5sZW5ndGg7VCsrKUU9ZCh2LF9bVF0sdyksRSE9PW51bGwmJih5PWkoRSx5LFQpLCQ9PT1udWxsP0M9RTokLnNpYmxpbmc9RSwkPUUpO3JldHVybiBZZSYmS28odixUKSxDfWZvcihFPXIodixFKTtUPF8ubGVuZ3RoO1QrKylNPWgoRSx2LFQsX1tUXSx3KSxNIT09bnVsbCYmKGUmJk0uYWx0ZXJuYXRlIT09bnVsbCYmRS5kZWxldGUoTS5rZXk9PT1udWxsP1Q6TS5rZXkpLHk9aShNLHksVCksJD09PW51bGw/Qz1NOiQuc2libGluZz1NLCQ9TSk7cmV0dXJuIGUmJkUuZm9yRWFjaChmdW5jdGlvbihqKXtyZXR1cm4gdCh2LGopfSksWWUmJktvKHYsVCksQ31mdW5jdGlvbiBtKHYseSxfLHcpe3ZhciBDPXRzKF8pO2lmKHR5cGVvZiBDIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFcoMTUwKSk7aWYoXz1DLmNhbGwoXyksXz09bnVsbCl0aHJvdyBFcnJvcihXKDE1MSkpO2Zvcih2YXIgJD1DPW51bGwsRT15LFQ9eT0wLE09bnVsbCxSPV8ubmV4dCgpO0UhPT1udWxsJiYhUi5kb25lO1QrKyxSPV8ubmV4dCgpKXtFLmluZGV4PlQ/KE09RSxFPW51bGwpOk09RS5zaWJsaW5nO3ZhciBqPWYodixFLFIudmFsdWUsdyk7aWYoaj09PW51bGwpe0U9PT1udWxsJiYoRT1NKTticmVha31lJiZFJiZqLmFsdGVybmF0ZT09PW51bGwmJnQodixFKSx5PWkoaix5LFQpLCQ9PT1udWxsP0M9ajokLnNpYmxpbmc9aiwkPWosRT1NfWlmKFIuZG9uZSlyZXR1cm4gbih2LEUpLFllJiZLbyh2LFQpLEM7aWYoRT09PW51bGwpe2Zvcig7IVIuZG9uZTtUKyssUj1fLm5leHQoKSlSPWQodixSLnZhbHVlLHcpLFIhPT1udWxsJiYoeT1pKFIseSxUKSwkPT09bnVsbD9DPVI6JC5zaWJsaW5nPVIsJD1SKTtyZXR1cm4gWWUmJktvKHYsVCksQ31mb3IoRT1yKHYsRSk7IVIuZG9uZTtUKyssUj1fLm5leHQoKSlSPWgoRSx2LFQsUi52YWx1ZSx3KSxSIT09bnVsbCYmKGUmJlIuYWx0ZXJuYXRlIT09bnVsbCYmRS5kZWxldGUoUi5rZXk9PT1udWxsP1Q6Ui5rZXkpLHk9aShSLHksVCksJD09PW51bGw/Qz1SOiQuc2libGluZz1SLCQ9Uik7cmV0dXJuIGUmJkUuZm9yRWFjaChmdW5jdGlvbihGKXtyZXR1cm4gdCh2LEYpfSksWWUmJktvKHYsVCksQ31mdW5jdGlvbiBTKHYseSxfLHcpe2lmKHR5cGVvZiBfPT0ib2JqZWN0IiYmXyE9PW51bGwmJl8udHlwZT09PVZpJiZfLmtleT09PW51bGwmJihfPV8ucHJvcHMuY2hpbGRyZW4pLHR5cGVvZiBfPT0ib2JqZWN0IiYmXyE9PW51bGwpe3N3aXRjaChfLiQkdHlwZW9mKXtjYXNlIEdhOmU6e2Zvcih2YXIgQz1fLmtleSwkPXk7JCE9PW51bGw7KXtpZigkLmtleT09PUMpe2lmKEM9Xy50eXBlLEM9PT1WaSl7aWYoJC50YWc9PT03KXtuKHYsJC5zaWJsaW5nKSx5PW8oJCxfLnByb3BzLmNoaWxkcmVuKSx5LnJldHVybj12LHY9eTticmVhayBlfX1lbHNlIGlmKCQuZWxlbWVudFR5cGU9PT1DfHx0eXBlb2YgQz09Im9iamVjdCImJkMhPT1udWxsJiZDLiQkdHlwZW9mPT09bG8mJmJ2KEMpPT09JC50eXBlKXtuKHYsJC5zaWJsaW5nKSx5PW8oJCxfLnByb3BzKSx5LnJlZj1scyh2LCQsXykseS5yZXR1cm49dix2PXk7YnJlYWsgZX1uKHYsJCk7YnJlYWt9ZWxzZSB0KHYsJCk7JD0kLnNpYmxpbmd9Xy50eXBlPT09Vmk/KHk9bmkoXy5wcm9wcy5jaGlsZHJlbix2Lm1vZGUsdyxfLmtleSkseS5yZXR1cm49dix2PXkpOih3PUR1KF8udHlwZSxfLmtleSxfLnByb3BzLG51bGwsdi5tb2RlLHcpLHcucmVmPWxzKHYseSxfKSx3LnJldHVybj12LHY9dyl9cmV0dXJuIGwodik7Y2FzZSBVaTplOntmb3IoJD1fLmtleTt5IT09bnVsbDspe2lmKHkua2V5PT09JClpZih5LnRhZz09PTQmJnkuc3RhdGVOb2RlLmNvbnRhaW5lckluZm89PT1fLmNvbnRhaW5lckluZm8mJnkuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uPT09Xy5pbXBsZW1lbnRhdGlvbil7bih2LHkuc2libGluZykseT1vKHksXy5jaGlsZHJlbnx8W10pLHkucmV0dXJuPXYsdj15O2JyZWFrIGV9ZWxzZXtuKHYseSk7YnJlYWt9ZWxzZSB0KHYseSk7eT15LnNpYmxpbmd9eT1mZihfLHYubW9kZSx3KSx5LnJldHVybj12LHY9eX1yZXR1cm4gbCh2KTtjYXNlIGxvOnJldHVybiAkPV8uX2luaXQsUyh2LHksJChfLl9wYXlsb2FkKSx3KX1pZih2cyhfKSlyZXR1cm4gZyh2LHksXyx3KTtpZih0cyhfKSlyZXR1cm4gbSh2LHksXyx3KTtvdSh2LF8pfXJldHVybiB0eXBlb2YgXz09InN0cmluZyImJl8hPT0iInx8dHlwZW9mIF89PSJudW1iZXIiPyhfPSIiK18seSE9PW51bGwmJnkudGFnPT09Nj8obih2LHkuc2libGluZykseT1vKHksXykseS5yZXR1cm49dix2PXkpOihuKHYseSkseT1kZihfLHYubW9kZSx3KSx5LnJldHVybj12LHY9eSksbCh2KSk6bih2LHkpfXJldHVybiBTfXZhciBfbD11eCghMCksY3g9dXgoITEpLFJhPXt9LGdyPWpvKFJhKSxvYT1qbyhSYSksaWE9am8oUmEpO2Z1bmN0aW9uIFpvKGUpe2lmKGU9PT1SYSl0aHJvdyBFcnJvcihXKDE3NCkpO3JldHVybiBlfWZ1bmN0aW9uIG9nKGUsdCl7c3dpdGNoKEZlKGlhLHQpLEZlKG9hLGUpLEZlKGdyLFJhKSxlPXQubm9kZVR5cGUsZSl7Y2FzZSA5OmNhc2UgMTE6dD0odD10LmRvY3VtZW50RWxlbWVudCk/dC5uYW1lc3BhY2VVUkk6SGYobnVsbCwiIik7YnJlYWs7ZGVmYXVsdDplPWU9PT04P3QucGFyZW50Tm9kZTp0LHQ9ZS5uYW1lc3BhY2VVUkl8fG51bGwsZT1lLnRhZ05hbWUsdD1IZih0LGUpfUdlKGdyKSxGZShncix0KX1mdW5jdGlvbiB3bCgpe0dlKGdyKSxHZShvYSksR2UoaWEpfWZ1bmN0aW9uIGR4KGUpe1pvKGlhLmN1cnJlbnQpO3ZhciB0PVpvKGdyLmN1cnJlbnQpLG49SGYodCxlLnR5cGUpO3QhPT1uJiYoRmUob2EsZSksRmUoZ3IsbikpfWZ1bmN0aW9uIGlnKGUpe29hLmN1cnJlbnQ9PT1lJiYoR2UoZ3IpLEdlKG9hKSl9dmFyIEplPWpvKDApO2Z1bmN0aW9uIGxjKGUpe2Zvcih2YXIgdD1lO3QhPT1udWxsOyl7aWYodC50YWc9PT0xMyl7dmFyIG49dC5tZW1vaXplZFN0YXRlO2lmKG4hPT1udWxsJiYobj1uLmRlaHlkcmF0ZWQsbj09PW51bGx8fG4uZGF0YT09PSIkPyJ8fG4uZGF0YT09PSIkISIpKXJldHVybiB0fWVsc2UgaWYodC50YWc9PT0xOSYmdC5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyIT09dm9pZCAwKXtpZih0LmZsYWdzJjEyOClyZXR1cm4gdH1lbHNlIGlmKHQuY2hpbGQhPT1udWxsKXt0LmNoaWxkLnJldHVybj10LHQ9dC5jaGlsZDtjb250aW51ZX1pZih0PT09ZSlicmVhaztmb3IoO3Quc2libGluZz09PW51bGw7KXtpZih0LnJldHVybj09PW51bGx8fHQucmV0dXJuPT09ZSlyZXR1cm4gbnVsbDt0PXQucmV0dXJufXQuc2libGluZy5yZXR1cm49dC5yZXR1cm4sdD10LnNpYmxpbmd9cmV0dXJuIG51bGx9dmFyIG9mPVtdO2Z1bmN0aW9uIGxnKCl7Zm9yKHZhciBlPTA7ZTxvZi5sZW5ndGg7ZSsrKW9mW2VdLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PW51bGw7b2YubGVuZ3RoPTB9dmFyIFJ1PVZyLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsbGY9VnIuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsdWk9MCxxZT1udWxsLG10PW51bGwsRXQ9bnVsbCxzYz0hMSxicz0hMSxsYT0wLHBrPTA7ZnVuY3Rpb24gRnQoKXt0aHJvdyBFcnJvcihXKDMyMSkpfWZ1bmN0aW9uIHNnKGUsdCl7aWYodD09PW51bGwpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aCYmbjxlLmxlbmd0aDtuKyspaWYoIXRyKGVbbl0sdFtuXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gYWcoZSx0LG4scixvLGkpe2lmKHVpPWkscWU9dCx0Lm1lbW9pemVkU3RhdGU9bnVsbCx0LnVwZGF0ZVF1ZXVlPW51bGwsdC5sYW5lcz0wLFJ1LmN1cnJlbnQ9ZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZT09PW51bGw/eWs6eGssZT1uKHIsbyksYnMpe2k9MDtkb3tpZihicz0hMSxsYT0wLDI1PD1pKXRocm93IEVycm9yKFcoMzAxKSk7aSs9MSxFdD1tdD1udWxsLHQudXBkYXRlUXVldWU9bnVsbCxSdS5jdXJyZW50PV9rLGU9bihyLG8pfXdoaWxlKGJzKX1pZihSdS5jdXJyZW50PWFjLHQ9bXQhPT1udWxsJiZtdC5uZXh0IT09bnVsbCx1aT0wLEV0PW10PXFlPW51bGwsc2M9ITEsdCl0aHJvdyBFcnJvcihXKDMwMCkpO3JldHVybiBlfWZ1bmN0aW9uIHVnKCl7dmFyIGU9bGEhPT0wO3JldHVybiBsYT0wLGV9ZnVuY3Rpb24gc3IoKXt2YXIgZT17bWVtb2l6ZWRTdGF0ZTpudWxsLGJhc2VTdGF0ZTpudWxsLGJhc2VRdWV1ZTpudWxsLHF1ZXVlOm51bGwsbmV4dDpudWxsfTtyZXR1cm4gRXQ9PT1udWxsP3FlLm1lbW9pemVkU3RhdGU9RXQ9ZTpFdD1FdC5uZXh0PWUsRXR9ZnVuY3Rpb24gRm4oKXtpZihtdD09PW51bGwpe3ZhciBlPXFlLmFsdGVybmF0ZTtlPWUhPT1udWxsP2UubWVtb2l6ZWRTdGF0ZTpudWxsfWVsc2UgZT1tdC5uZXh0O3ZhciB0PUV0PT09bnVsbD9xZS5tZW1vaXplZFN0YXRlOkV0Lm5leHQ7aWYodCE9PW51bGwpRXQ9dCxtdD1lO2Vsc2V7aWYoZT09PW51bGwpdGhyb3cgRXJyb3IoVygzMTApKTttdD1lLGU9e21lbW9pemVkU3RhdGU6bXQubWVtb2l6ZWRTdGF0ZSxiYXNlU3RhdGU6bXQuYmFzZVN0YXRlLGJhc2VRdWV1ZTptdC5iYXNlUXVldWUscXVldWU6bXQucXVldWUsbmV4dDpudWxsfSxFdD09PW51bGw/cWUubWVtb2l6ZWRTdGF0ZT1FdD1lOkV0PUV0Lm5leHQ9ZX1yZXR1cm4gRXR9ZnVuY3Rpb24gc2EoZSx0KXtyZXR1cm4gdHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChlKTp0fWZ1bmN0aW9uIHNmKGUpe3ZhciB0PUZuKCksbj10LnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKFcoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIHI9bXQsbz1yLmJhc2VRdWV1ZSxpPW4ucGVuZGluZztpZihpIT09bnVsbCl7aWYobyE9PW51bGwpe3ZhciBsPW8ubmV4dDtvLm5leHQ9aS5uZXh0LGkubmV4dD1sfXIuYmFzZVF1ZXVlPW89aSxuLnBlbmRpbmc9bnVsbH1pZihvIT09bnVsbCl7aT1vLm5leHQscj1yLmJhc2VTdGF0ZTt2YXIgcz1sPW51bGwsYT1udWxsLHU9aTtkb3t2YXIgYz11LmxhbmU7aWYoKHVpJmMpPT09YylhIT09bnVsbCYmKGE9YS5uZXh0PXtsYW5lOjAsYWN0aW9uOnUuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6dS5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6dS5lYWdlclN0YXRlLG5leHQ6bnVsbH0pLHI9dS5oYXNFYWdlclN0YXRlP3UuZWFnZXJTdGF0ZTplKHIsdS5hY3Rpb24pO2Vsc2V7dmFyIGQ9e2xhbmU6YyxhY3Rpb246dS5hY3Rpb24saGFzRWFnZXJTdGF0ZTp1Lmhhc0VhZ2VyU3RhdGUsZWFnZXJTdGF0ZTp1LmVhZ2VyU3RhdGUsbmV4dDpudWxsfTthPT09bnVsbD8ocz1hPWQsbD1yKTphPWEubmV4dD1kLHFlLmxhbmVzfD1jLGNpfD1jfXU9dS5uZXh0fXdoaWxlKHUhPT1udWxsJiZ1IT09aSk7YT09PW51bGw/bD1yOmEubmV4dD1zLHRyKHIsdC5tZW1vaXplZFN0YXRlKXx8KHVuPSEwKSx0Lm1lbW9pemVkU3RhdGU9cix0LmJhc2VTdGF0ZT1sLHQuYmFzZVF1ZXVlPWEsbi5sYXN0UmVuZGVyZWRTdGF0ZT1yfWlmKGU9bi5pbnRlcmxlYXZlZCxlIT09bnVsbCl7bz1lO2RvIGk9by5sYW5lLHFlLmxhbmVzfD1pLGNpfD1pLG89by5uZXh0O3doaWxlKG8hPT1lKX1lbHNlIG89PT1udWxsJiYobi5sYW5lcz0wKTtyZXR1cm5bdC5tZW1vaXplZFN0YXRlLG4uZGlzcGF0Y2hdfWZ1bmN0aW9uIGFmKGUpe3ZhciB0PUZuKCksbj10LnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKFcoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIHI9bi5kaXNwYXRjaCxvPW4ucGVuZGluZyxpPXQubWVtb2l6ZWRTdGF0ZTtpZihvIT09bnVsbCl7bi5wZW5kaW5nPW51bGw7dmFyIGw9bz1vLm5leHQ7ZG8gaT1lKGksbC5hY3Rpb24pLGw9bC5uZXh0O3doaWxlKGwhPT1vKTt0cihpLHQubWVtb2l6ZWRTdGF0ZSl8fCh1bj0hMCksdC5tZW1vaXplZFN0YXRlPWksdC5iYXNlUXVldWU9PT1udWxsJiYodC5iYXNlU3RhdGU9aSksbi5sYXN0UmVuZGVyZWRTdGF0ZT1pfXJldHVybltpLHJdfWZ1bmN0aW9uIGZ4KCl7fWZ1bmN0aW9uIGh4KGUsdCl7dmFyIG49cWUscj1GbigpLG89dCgpLGk9IXRyKHIubWVtb2l6ZWRTdGF0ZSxvKTtpZihpJiYoci5tZW1vaXplZFN0YXRlPW8sdW49ITApLHI9ci5xdWV1ZSxjZyhteC5iaW5kKG51bGwsbixyLGUpLFtlXSksci5nZXRTbmFwc2hvdCE9PXR8fGl8fEV0IT09bnVsbCYmRXQubWVtb2l6ZWRTdGF0ZS50YWcmMSl7aWYobi5mbGFnc3w9MjA0OCxhYSg5LGd4LmJpbmQobnVsbCxuLHIsbyx0KSx2b2lkIDAsbnVsbCksYnQ9PT1udWxsKXRocm93IEVycm9yKFcoMzQ5KSk7dWkmMzB8fHB4KG4sdCxvKX1yZXR1cm4gb31mdW5jdGlvbiBweChlLHQsbil7ZS5mbGFnc3w9MTYzODQsZT17Z2V0U25hcHNob3Q6dCx2YWx1ZTpufSx0PXFlLnVwZGF0ZVF1ZXVlLHQ9PT1udWxsPyh0PXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LHFlLnVwZGF0ZVF1ZXVlPXQsdC5zdG9yZXM9W2VdKToobj10LnN0b3JlcyxuPT09bnVsbD90LnN0b3Jlcz1bZV06bi5wdXNoKGUpKX1mdW5jdGlvbiBneChlLHQsbixyKXt0LnZhbHVlPW4sdC5nZXRTbmFwc2hvdD1yLHZ4KHQpJiZ5eChlKX1mdW5jdGlvbiBteChlLHQsbil7cmV0dXJuIG4oZnVuY3Rpb24oKXt2eCh0KSYmeXgoZSl9KX1mdW5jdGlvbiB2eChlKXt2YXIgdD1lLmdldFNuYXBzaG90O2U9ZS52YWx1ZTt0cnl7dmFyIG49dCgpO3JldHVybiF0cihlLG4pfWNhdGNoe3JldHVybiEwfX1mdW5jdGlvbiB5eChlKXt2YXIgdD16cihlLDEpO3QhPT1udWxsJiZlcih0LGUsMSwtMSl9ZnVuY3Rpb24gUnYoZSl7dmFyIHQ9c3IoKTtyZXR1cm4gdHlwZW9mIGU9PSJmdW5jdGlvbiImJihlPWUoKSksdC5tZW1vaXplZFN0YXRlPXQuYmFzZVN0YXRlPWUsZT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6c2EsbGFzdFJlbmRlcmVkU3RhdGU6ZX0sdC5xdWV1ZT1lLGU9ZS5kaXNwYXRjaD12ay5iaW5kKG51bGwscWUsZSksW3QubWVtb2l6ZWRTdGF0ZSxlXX1mdW5jdGlvbiBhYShlLHQsbixyKXtyZXR1cm4gZT17dGFnOmUsY3JlYXRlOnQsZGVzdHJveTpuLGRlcHM6cixuZXh0Om51bGx9LHQ9cWUudXBkYXRlUXVldWUsdD09PW51bGw/KHQ9e2xhc3RFZmZlY3Q6bnVsbCxzdG9yZXM6bnVsbH0scWUudXBkYXRlUXVldWU9dCx0Lmxhc3RFZmZlY3Q9ZS5uZXh0PWUpOihuPXQubGFzdEVmZmVjdCxuPT09bnVsbD90Lmxhc3RFZmZlY3Q9ZS5uZXh0PWU6KHI9bi5uZXh0LG4ubmV4dD1lLGUubmV4dD1yLHQubGFzdEVmZmVjdD1lKSksZX1mdW5jdGlvbiB4eCgpe3JldHVybiBGbigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gUHUoZSx0LG4scil7dmFyIG89c3IoKTtxZS5mbGFnc3w9ZSxvLm1lbW9pemVkU3RhdGU9YWEoMXx0LG4sdm9pZCAwLHI9PT12b2lkIDA/bnVsbDpyKX1mdW5jdGlvbiBRYyhlLHQsbixyKXt2YXIgbz1GbigpO3I9cj09PXZvaWQgMD9udWxsOnI7dmFyIGk9dm9pZCAwO2lmKG10IT09bnVsbCl7dmFyIGw9bXQubWVtb2l6ZWRTdGF0ZTtpZihpPWwuZGVzdHJveSxyIT09bnVsbCYmc2cocixsLmRlcHMpKXtvLm1lbW9pemVkU3RhdGU9YWEodCxuLGkscik7cmV0dXJufX1xZS5mbGFnc3w9ZSxvLm1lbW9pemVkU3RhdGU9YWEoMXx0LG4saSxyKX1mdW5jdGlvbiBQdihlLHQpe3JldHVybiBQdSg4MzkwNjU2LDgsZSx0KX1mdW5jdGlvbiBjZyhlLHQpe3JldHVybiBRYygyMDQ4LDgsZSx0KX1mdW5jdGlvbiBfeChlLHQpe3JldHVybiBRYyg0LDIsZSx0KX1mdW5jdGlvbiB3eChlLHQpe3JldHVybiBRYyg0LDQsZSx0KX1mdW5jdGlvbiBTeChlLHQpe2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiBlPWUoKSx0KGUpLGZ1bmN0aW9uKCl7dChudWxsKX07aWYodCE9bnVsbClyZXR1cm4gZT1lKCksdC5jdXJyZW50PWUsZnVuY3Rpb24oKXt0LmN1cnJlbnQ9bnVsbH19ZnVuY3Rpb24gQ3goZSx0LG4pe3JldHVybiBuPW4hPW51bGw/bi5jb25jYXQoW2VdKTpudWxsLFFjKDQsNCxTeC5iaW5kKG51bGwsdCxlKSxuKX1mdW5jdGlvbiBkZygpe31mdW5jdGlvbiBFeChlLHQpe3ZhciBuPUZuKCk7dD10PT09dm9pZCAwP251bGw6dDt2YXIgcj1uLm1lbW9pemVkU3RhdGU7cmV0dXJuIHIhPT1udWxsJiZ0IT09bnVsbCYmc2codCxyWzFdKT9yWzBdOihuLm1lbW9pemVkU3RhdGU9W2UsdF0sZSl9ZnVuY3Rpb24gJHgoZSx0KXt2YXIgbj1GbigpO3Q9dD09PXZvaWQgMD9udWxsOnQ7dmFyIHI9bi5tZW1vaXplZFN0YXRlO3JldHVybiByIT09bnVsbCYmdCE9PW51bGwmJnNnKHQsclsxXSk/clswXTooZT1lKCksbi5tZW1vaXplZFN0YXRlPVtlLHRdLGUpfWZ1bmN0aW9uIGt4KGUsdCxuKXtyZXR1cm4gdWkmMjE/KHRyKG4sdCl8fChuPWIxKCkscWUubGFuZXN8PW4sY2l8PW4sZS5iYXNlU3RhdGU9ITApLHQpOihlLmJhc2VTdGF0ZSYmKGUuYmFzZVN0YXRlPSExLHVuPSEwKSxlLm1lbW9pemVkU3RhdGU9bil9ZnVuY3Rpb24gZ2soZSx0KXt2YXIgbj1QZTtQZT1uIT09MCYmND5uP246NCxlKCEwKTt2YXIgcj1sZi50cmFuc2l0aW9uO2xmLnRyYW5zaXRpb249e307dHJ5e2UoITEpLHQoKX1maW5hbGx5e1BlPW4sbGYudHJhbnNpdGlvbj1yfX1mdW5jdGlvbiBUeCgpe3JldHVybiBGbigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gbWsoZSx0LG4pe3ZhciByPUNvKGUpO2lmKG49e2xhbmU6cixhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9LE54KGUpKWJ4KHQsbik7ZWxzZSBpZihuPWl4KGUsdCxuLHIpLG4hPT1udWxsKXt2YXIgbz1ubigpO2VyKG4sZSxyLG8pLFJ4KG4sdCxyKX19ZnVuY3Rpb24gdmsoZSx0LG4pe3ZhciByPUNvKGUpLG89e2xhbmU6cixhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9O2lmKE54KGUpKWJ4KHQsbyk7ZWxzZXt2YXIgaT1lLmFsdGVybmF0ZTtpZihlLmxhbmVzPT09MCYmKGk9PT1udWxsfHxpLmxhbmVzPT09MCkmJihpPXQubGFzdFJlbmRlcmVkUmVkdWNlcixpIT09bnVsbCkpdHJ5e3ZhciBsPXQubGFzdFJlbmRlcmVkU3RhdGUscz1pKGwsbik7aWYoby5oYXNFYWdlclN0YXRlPSEwLG8uZWFnZXJTdGF0ZT1zLHRyKHMsbCkpe3ZhciBhPXQuaW50ZXJsZWF2ZWQ7YT09PW51bGw/KG8ubmV4dD1vLG5nKHQpKTooby5uZXh0PWEubmV4dCxhLm5leHQ9byksdC5pbnRlcmxlYXZlZD1vO3JldHVybn19Y2F0Y2h7fWZpbmFsbHl7fW49aXgoZSx0LG8sciksbiE9PW51bGwmJihvPW5uKCksZXIobixlLHIsbyksUngobix0LHIpKX19ZnVuY3Rpb24gTngoZSl7dmFyIHQ9ZS5hbHRlcm5hdGU7cmV0dXJuIGU9PT1xZXx8dCE9PW51bGwmJnQ9PT1xZX1mdW5jdGlvbiBieChlLHQpe2JzPXNjPSEwO3ZhciBuPWUucGVuZGluZztuPT09bnVsbD90Lm5leHQ9dDoodC5uZXh0PW4ubmV4dCxuLm5leHQ9dCksZS5wZW5kaW5nPXR9ZnVuY3Rpb24gUngoZSx0LG4pe2lmKG4mNDE5NDI0MCl7dmFyIHI9dC5sYW5lcztyJj1lLnBlbmRpbmdMYW5lcyxufD1yLHQubGFuZXM9bixXcChlLG4pfX12YXIgYWM9e3JlYWRDb250ZXh0OnpuLHVzZUNhbGxiYWNrOkZ0LHVzZUNvbnRleHQ6RnQsdXNlRWZmZWN0OkZ0LHVzZUltcGVyYXRpdmVIYW5kbGU6RnQsdXNlSW5zZXJ0aW9uRWZmZWN0OkZ0LHVzZUxheW91dEVmZmVjdDpGdCx1c2VNZW1vOkZ0LHVzZVJlZHVjZXI6RnQsdXNlUmVmOkZ0LHVzZVN0YXRlOkZ0LHVzZURlYnVnVmFsdWU6RnQsdXNlRGVmZXJyZWRWYWx1ZTpGdCx1c2VUcmFuc2l0aW9uOkZ0LHVzZU11dGFibGVTb3VyY2U6RnQsdXNlU3luY0V4dGVybmFsU3RvcmU6RnQsdXNlSWQ6RnQsdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSx5az17cmVhZENvbnRleHQ6em4sdXNlQ2FsbGJhY2s6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gc3IoKS5tZW1vaXplZFN0YXRlPVtlLHQ9PT12b2lkIDA/bnVsbDp0XSxlfSx1c2VDb250ZXh0OnpuLHVzZUVmZmVjdDpQdix1c2VJbXBlcmF0aXZlSGFuZGxlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj1uIT1udWxsP24uY29uY2F0KFtlXSk6bnVsbCxQdSg0MTk0MzA4LDQsU3guYmluZChudWxsLHQsZSksbil9LHVzZUxheW91dEVmZmVjdDpmdW5jdGlvbihlLHQpe3JldHVybiBQdSg0MTk0MzA4LDQsZSx0KX0sdXNlSW5zZXJ0aW9uRWZmZWN0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFB1KDQsMixlLHQpfSx1c2VNZW1vOmZ1bmN0aW9uKGUsdCl7dmFyIG49c3IoKTtyZXR1cm4gdD10PT09dm9pZCAwP251bGw6dCxlPWUoKSxuLm1lbW9pemVkU3RhdGU9W2UsdF0sZX0sdXNlUmVkdWNlcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9c3IoKTtyZXR1cm4gdD1uIT09dm9pZCAwP24odCk6dCxyLm1lbW9pemVkU3RhdGU9ci5iYXNlU3RhdGU9dCxlPXtwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjplLGxhc3RSZW5kZXJlZFN0YXRlOnR9LHIucXVldWU9ZSxlPWUuZGlzcGF0Y2g9bWsuYmluZChudWxsLHFlLGUpLFtyLm1lbW9pemVkU3RhdGUsZV19LHVzZVJlZjpmdW5jdGlvbihlKXt2YXIgdD1zcigpO3JldHVybiBlPXtjdXJyZW50OmV9LHQubWVtb2l6ZWRTdGF0ZT1lfSx1c2VTdGF0ZTpSdix1c2VEZWJ1Z1ZhbHVlOmRnLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHNyKCkubWVtb2l6ZWRTdGF0ZT1lfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9UnYoITEpLHQ9ZVswXTtyZXR1cm4gZT1nay5iaW5kKG51bGwsZVsxXSksc3IoKS5tZW1vaXplZFN0YXRlPWUsW3QsZV19LHVzZU11dGFibGVTb3VyY2U6ZnVuY3Rpb24oKXt9LHVzZVN5bmNFeHRlcm5hbFN0b3JlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1xZSxvPXNyKCk7aWYoWWUpe2lmKG49PT12b2lkIDApdGhyb3cgRXJyb3IoVyg0MDcpKTtuPW4oKX1lbHNle2lmKG49dCgpLGJ0PT09bnVsbCl0aHJvdyBFcnJvcihXKDM0OSkpO3VpJjMwfHxweChyLHQsbil9by5tZW1vaXplZFN0YXRlPW47dmFyIGk9e3ZhbHVlOm4sZ2V0U25hcHNob3Q6dH07cmV0dXJuIG8ucXVldWU9aSxQdihteC5iaW5kKG51bGwscixpLGUpLFtlXSksci5mbGFnc3w9MjA0OCxhYSg5LGd4LmJpbmQobnVsbCxyLGksbix0KSx2b2lkIDAsbnVsbCksbn0sdXNlSWQ6ZnVuY3Rpb24oKXt2YXIgZT1zcigpLHQ9YnQuaWRlbnRpZmllclByZWZpeDtpZihZZSl7dmFyIG49RHIscj1NcjtuPShyJn4oMTw8MzItcW4ociktMSkpLnRvU3RyaW5nKDMyKStuLHQ9IjoiK3QrIlIiK24sbj1sYSsrLDA8biYmKHQrPSJIIituLnRvU3RyaW5nKDMyKSksdCs9IjoifWVsc2Ugbj1waysrLHQ9IjoiK3QrInIiK24udG9TdHJpbmcoMzIpKyI6IjtyZXR1cm4gZS5tZW1vaXplZFN0YXRlPXR9LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0seGs9e3JlYWRDb250ZXh0OnpuLHVzZUNhbGxiYWNrOkV4LHVzZUNvbnRleHQ6em4sdXNlRWZmZWN0OmNnLHVzZUltcGVyYXRpdmVIYW5kbGU6Q3gsdXNlSW5zZXJ0aW9uRWZmZWN0Ol94LHVzZUxheW91dEVmZmVjdDp3eCx1c2VNZW1vOiR4LHVzZVJlZHVjZXI6c2YsdXNlUmVmOnh4LHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHNmKHNhKX0sdXNlRGVidWdWYWx1ZTpkZyx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PUZuKCk7cmV0dXJuIGt4KHQsbXQubWVtb2l6ZWRTdGF0ZSxlKX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBlPXNmKHNhKVswXSx0PUZuKCkubWVtb2l6ZWRTdGF0ZTtyZXR1cm5bZSx0XX0sdXNlTXV0YWJsZVNvdXJjZTpmeCx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpoeCx1c2VJZDpUeCx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LF9rPXtyZWFkQ29udGV4dDp6bix1c2VDYWxsYmFjazpFeCx1c2VDb250ZXh0OnpuLHVzZUVmZmVjdDpjZyx1c2VJbXBlcmF0aXZlSGFuZGxlOkN4LHVzZUluc2VydGlvbkVmZmVjdDpfeCx1c2VMYXlvdXRFZmZlY3Q6d3gsdXNlTWVtbzokeCx1c2VSZWR1Y2VyOmFmLHVzZVJlZjp4eCx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBhZihzYSl9LHVzZURlYnVnVmFsdWU6ZGcsdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1GbigpO3JldHVybiBtdD09PW51bGw/dC5tZW1vaXplZFN0YXRlPWU6a3godCxtdC5tZW1vaXplZFN0YXRlLGUpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9YWYoc2EpWzBdLHQ9Rm4oKS5tZW1vaXplZFN0YXRlO3JldHVybltlLHRdfSx1c2VNdXRhYmxlU291cmNlOmZ4LHVzZVN5bmNFeHRlcm5hbFN0b3JlOmh4LHVzZUlkOlR4LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX07ZnVuY3Rpb24gU2woZSx0KXt0cnl7dmFyIG49IiIscj10O2RvIG4rPVlFKHIpLHI9ci5yZXR1cm47d2hpbGUocik7dmFyIG89bn1jYXRjaChpKXtvPWAKRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogYCtpLm1lc3NhZ2UrYApgK2kuc3RhY2t9cmV0dXJue3ZhbHVlOmUsc291cmNlOnQsc3RhY2s6byxkaWdlc3Q6bnVsbH19ZnVuY3Rpb24gdWYoZSx0LG4pe3JldHVybnt2YWx1ZTplLHNvdXJjZTpudWxsLHN0YWNrOm4/P251bGwsZGlnZXN0OnQ/P251bGx9fWZ1bmN0aW9uIHBoKGUsdCl7dHJ5e2NvbnNvbGUuZXJyb3IodC52YWx1ZSl9Y2F0Y2gobil7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IG59KX19dmFyIHdrPXR5cGVvZiBXZWFrTWFwPT0iZnVuY3Rpb24iP1dlYWtNYXA6TWFwO2Z1bmN0aW9uIFB4KGUsdCxuKXtuPUxyKC0xLG4pLG4udGFnPTMsbi5wYXlsb2FkPXtlbGVtZW50Om51bGx9O3ZhciByPXQudmFsdWU7cmV0dXJuIG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtjY3x8KGNjPSEwLEVoPXIpLHBoKGUsdCl9LG59ZnVuY3Rpb24gT3goZSx0LG4pe249THIoLTEsbiksbi50YWc9Mzt2YXIgcj1lLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgbz10LnZhbHVlO24ucGF5bG9hZD1mdW5jdGlvbigpe3JldHVybiByKG8pfSxuLmNhbGxiYWNrPWZ1bmN0aW9uKCl7cGgoZSx0KX19dmFyIGk9ZS5zdGF0ZU5vZGU7cmV0dXJuIGkhPT1udWxsJiZ0eXBlb2YgaS5jb21wb25lbnREaWRDYXRjaD09ImZ1bmN0aW9uIiYmKG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtwaChlLHQpLHR5cGVvZiByIT0iZnVuY3Rpb24iJiYoU289PT1udWxsP1NvPW5ldyBTZXQoW3RoaXNdKTpTby5hZGQodGhpcykpO3ZhciBsPXQuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaCh0LnZhbHVlLHtjb21wb25lbnRTdGFjazpsIT09bnVsbD9sOiIifSl9KSxufWZ1bmN0aW9uIE92KGUsdCxuKXt2YXIgcj1lLnBpbmdDYWNoZTtpZihyPT09bnVsbCl7cj1lLnBpbmdDYWNoZT1uZXcgd2s7dmFyIG89bmV3IFNldDtyLnNldCh0LG8pfWVsc2Ugbz1yLmdldCh0KSxvPT09dm9pZCAwJiYobz1uZXcgU2V0LHIuc2V0KHQsbykpO28uaGFzKG4pfHwoby5hZGQobiksZT1Eay5iaW5kKG51bGwsZSx0LG4pLHQudGhlbihlLGUpKX1mdW5jdGlvbiBBdihlKXtkb3t2YXIgdDtpZigodD1lLnRhZz09PTEzKSYmKHQ9ZS5tZW1vaXplZFN0YXRlLHQ9dCE9PW51bGw/dC5kZWh5ZHJhdGVkIT09bnVsbDohMCksdClyZXR1cm4gZTtlPWUucmV0dXJufXdoaWxlKGUhPT1udWxsKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBNdihlLHQsbixyLG8pe3JldHVybiBlLm1vZGUmMT8oZS5mbGFnc3w9NjU1MzYsZS5sYW5lcz1vLGUpOihlPT09dD9lLmZsYWdzfD02NTUzNjooZS5mbGFnc3w9MTI4LG4uZmxhZ3N8PTEzMTA3MixuLmZsYWdzJj0tNTI4MDUsbi50YWc9PT0xJiYobi5hbHRlcm5hdGU9PT1udWxsP24udGFnPTE3Oih0PUxyKC0xLDEpLHQudGFnPTIsd28obix0LDEpKSksbi5sYW5lc3w9MSksZSl9dmFyIFNrPVZyLlJlYWN0Q3VycmVudE93bmVyLHVuPSExO2Z1bmN0aW9uIFl0KGUsdCxuLHIpe3QuY2hpbGQ9ZT09PW51bGw/Y3godCxudWxsLG4scik6X2wodCxlLmNoaWxkLG4scil9ZnVuY3Rpb24gRHYoZSx0LG4scixvKXtuPW4ucmVuZGVyO3ZhciBpPXQucmVmO3JldHVybiB1bCh0LG8pLHI9YWcoZSx0LG4scixpLG8pLG49dWcoKSxlIT09bnVsbCYmIXVuPyh0LnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdC5mbGFncyY9LTIwNTMsZS5sYW5lcyY9fm8sRnIoZSx0LG8pKTooWWUmJm4mJlFwKHQpLHQuZmxhZ3N8PTEsWXQoZSx0LHIsbyksdC5jaGlsZCl9ZnVuY3Rpb24gTHYoZSx0LG4scixvKXtpZihlPT09bnVsbCl7dmFyIGk9bi50eXBlO3JldHVybiB0eXBlb2YgaT09ImZ1bmN0aW9uIiYmIXhnKGkpJiZpLmRlZmF1bHRQcm9wcz09PXZvaWQgMCYmbi5jb21wYXJlPT09bnVsbCYmbi5kZWZhdWx0UHJvcHM9PT12b2lkIDA/KHQudGFnPTE1LHQudHlwZT1pLEF4KGUsdCxpLHIsbykpOihlPUR1KG4udHlwZSxudWxsLHIsdCx0Lm1vZGUsbyksZS5yZWY9dC5yZWYsZS5yZXR1cm49dCx0LmNoaWxkPWUpfWlmKGk9ZS5jaGlsZCwhKGUubGFuZXMmbykpe3ZhciBsPWkubWVtb2l6ZWRQcm9wcztpZihuPW4uY29tcGFyZSxuPW4hPT1udWxsP246ZWEsbihsLHIpJiZlLnJlZj09PXQucmVmKXJldHVybiBGcihlLHQsbyl9cmV0dXJuIHQuZmxhZ3N8PTEsZT1FbyhpLHIpLGUucmVmPXQucmVmLGUucmV0dXJuPXQsdC5jaGlsZD1lfWZ1bmN0aW9uIEF4KGUsdCxuLHIsbyl7aWYoZSE9PW51bGwpe3ZhciBpPWUubWVtb2l6ZWRQcm9wcztpZihlYShpLHIpJiZlLnJlZj09PXQucmVmKWlmKHVuPSExLHQucGVuZGluZ1Byb3BzPXI9aSwoZS5sYW5lcyZvKSE9PTApZS5mbGFncyYxMzEwNzImJih1bj0hMCk7ZWxzZSByZXR1cm4gdC5sYW5lcz1lLmxhbmVzLEZyKGUsdCxvKX1yZXR1cm4gZ2goZSx0LG4scixvKX1mdW5jdGlvbiBNeChlLHQsbil7dmFyIHI9dC5wZW5kaW5nUHJvcHMsbz1yLmNoaWxkcmVuLGk9ZSE9PW51bGw/ZS5tZW1vaXplZFN0YXRlOm51bGw7aWYoci5tb2RlPT09ImhpZGRlbiIpaWYoISh0Lm1vZGUmMSkpdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxGZShlbCxtbiksbW58PW47ZWxzZXtpZighKG4mMTA3Mzc0MTgyNCkpcmV0dXJuIGU9aSE9PW51bGw/aS5iYXNlTGFuZXN8bjpuLHQubGFuZXM9dC5jaGlsZExhbmVzPTEwNzM3NDE4MjQsdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6ZSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSx0LnVwZGF0ZVF1ZXVlPW51bGwsRmUoZWwsbW4pLG1ufD1lLG51bGw7dC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxyPWkhPT1udWxsP2kuYmFzZUxhbmVzOm4sRmUoZWwsbW4pLG1ufD1yfWVsc2UgaSE9PW51bGw/KHI9aS5iYXNlTGFuZXN8bix0Lm1lbW9pemVkU3RhdGU9bnVsbCk6cj1uLEZlKGVsLG1uKSxtbnw9cjtyZXR1cm4gWXQoZSx0LG8sbiksdC5jaGlsZH1mdW5jdGlvbiBEeChlLHQpe3ZhciBuPXQucmVmOyhlPT09bnVsbCYmbiE9PW51bGx8fGUhPT1udWxsJiZlLnJlZiE9PW4pJiYodC5mbGFnc3w9NTEyLHQuZmxhZ3N8PTIwOTcxNTIpfWZ1bmN0aW9uIGdoKGUsdCxuLHIsbyl7dmFyIGk9ZG4obik/c2k6R3QuY3VycmVudDtyZXR1cm4gaT15bCh0LGkpLHVsKHQsbyksbj1hZyhlLHQsbixyLGksbykscj11ZygpLGUhPT1udWxsJiYhdW4/KHQudXBkYXRlUXVldWU9ZS51cGRhdGVRdWV1ZSx0LmZsYWdzJj0tMjA1MyxlLmxhbmVzJj1+byxGcihlLHQsbykpOihZZSYmciYmUXAodCksdC5mbGFnc3w9MSxZdChlLHQsbixvKSx0LmNoaWxkKX1mdW5jdGlvbiBJdihlLHQsbixyLG8pe2lmKGRuKG4pKXt2YXIgaT0hMDtlYyh0KX1lbHNlIGk9ITE7aWYodWwodCxvKSx0LnN0YXRlTm9kZT09PW51bGwpT3UoZSx0KSxheCh0LG4sciksaGgodCxuLHIsbykscj0hMDtlbHNlIGlmKGU9PT1udWxsKXt2YXIgbD10LnN0YXRlTm9kZSxzPXQubWVtb2l6ZWRQcm9wcztsLnByb3BzPXM7dmFyIGE9bC5jb250ZXh0LHU9bi5jb250ZXh0VHlwZTt0eXBlb2YgdT09Im9iamVjdCImJnUhPT1udWxsP3U9em4odSk6KHU9ZG4obik/c2k6R3QuY3VycmVudCx1PXlsKHQsdSkpO3ZhciBjPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLGQ9dHlwZW9mIGM9PSJmdW5jdGlvbiJ8fHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24iO2R8fHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PXJ8fGEhPT11KSYmTnYodCxsLHIsdSksc289ITE7dmFyIGY9dC5tZW1vaXplZFN0YXRlO2wuc3RhdGU9ZixpYyh0LHIsbCxvKSxhPXQubWVtb2l6ZWRTdGF0ZSxzIT09cnx8ZiE9PWF8fGNuLmN1cnJlbnR8fHNvPyh0eXBlb2YgYz09ImZ1bmN0aW9uIiYmKGZoKHQsbixjLHIpLGE9dC5tZW1vaXplZFN0YXRlKSwocz1zb3x8VHYodCxuLHMscixmLGEsdSkpPyhkfHx0eXBlb2YgbC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgbC5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJmwuY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIGwuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmbC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkpLHR5cGVvZiBsLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCkpOih0eXBlb2YgbC5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQxOTQzMDgpLHQubWVtb2l6ZWRQcm9wcz1yLHQubWVtb2l6ZWRTdGF0ZT1hKSxsLnByb3BzPXIsbC5zdGF0ZT1hLGwuY29udGV4dD11LHI9cyk6KHR5cGVvZiBsLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCkscj0hMSl9ZWxzZXtsPXQuc3RhdGVOb2RlLGx4KGUsdCkscz10Lm1lbW9pemVkUHJvcHMsdT10LnR5cGU9PT10LmVsZW1lbnRUeXBlP3M6R24odC50eXBlLHMpLGwucHJvcHM9dSxkPXQucGVuZGluZ1Byb3BzLGY9bC5jb250ZXh0LGE9bi5jb250ZXh0VHlwZSx0eXBlb2YgYT09Im9iamVjdCImJmEhPT1udWxsP2E9em4oYSk6KGE9ZG4obik/c2k6R3QuY3VycmVudCxhPXlsKHQsYSkpO3ZhciBoPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhjPXR5cGVvZiBoPT0iZnVuY3Rpb24ifHx0eXBlb2YgbC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uIil8fHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PWR8fGYhPT1hKSYmTnYodCxsLHIsYSksc289ITEsZj10Lm1lbW9pemVkU3RhdGUsbC5zdGF0ZT1mLGljKHQscixsLG8pO3ZhciBnPXQubWVtb2l6ZWRTdGF0ZTtzIT09ZHx8ZiE9PWd8fGNuLmN1cnJlbnR8fHNvPyh0eXBlb2YgaD09ImZ1bmN0aW9uIiYmKGZoKHQsbixoLHIpLGc9dC5tZW1vaXplZFN0YXRlKSwodT1zb3x8VHYodCxuLHUscixmLGcsYSl8fCExKT8oY3x8dHlwZW9mIGwuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiImJnR5cGVvZiBsLmNvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgbC5jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZsLmNvbXBvbmVudFdpbGxVcGRhdGUocixnLGEpLHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZsLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKHIsZyxhKSksdHlwZW9mIGwuY29tcG9uZW50RGlkVXBkYXRlPT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NCksdHlwZW9mIGwuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiImJih0LmZsYWdzfD0xMDI0KSk6KHR5cGVvZiBsLmNvbXBvbmVudERpZFVwZGF0ZSE9ImZ1bmN0aW9uInx8cz09PWUubWVtb2l6ZWRQcm9wcyYmZj09PWUubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTQpLHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZmPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9MTAyNCksdC5tZW1vaXplZFByb3BzPXIsdC5tZW1vaXplZFN0YXRlPWcpLGwucHJvcHM9cixsLnN0YXRlPWcsbC5jb250ZXh0PWEscj11KToodHlwZW9mIGwuY29tcG9uZW50RGlkVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZmPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9NCksdHlwZW9mIGwuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUhPSJmdW5jdGlvbiJ8fHM9PT1lLm1lbW9pemVkUHJvcHMmJmY9PT1lLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD0xMDI0KSxyPSExKX1yZXR1cm4gbWgoZSx0LG4scixpLG8pfWZ1bmN0aW9uIG1oKGUsdCxuLHIsbyxpKXtEeChlLHQpO3ZhciBsPSh0LmZsYWdzJjEyOCkhPT0wO2lmKCFyJiYhbClyZXR1cm4gbyYmU3YodCxuLCExKSxGcihlLHQsaSk7cj10LnN0YXRlTm9kZSxTay5jdXJyZW50PXQ7dmFyIHM9bCYmdHlwZW9mIG4uZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT0iZnVuY3Rpb24iP251bGw6ci5yZW5kZXIoKTtyZXR1cm4gdC5mbGFnc3w9MSxlIT09bnVsbCYmbD8odC5jaGlsZD1fbCh0LGUuY2hpbGQsbnVsbCxpKSx0LmNoaWxkPV9sKHQsbnVsbCxzLGkpKTpZdChlLHQscyxpKSx0Lm1lbW9pemVkU3RhdGU9ci5zdGF0ZSxvJiZTdih0LG4sITApLHQuY2hpbGR9ZnVuY3Rpb24gTHgoZSl7dmFyIHQ9ZS5zdGF0ZU5vZGU7dC5wZW5kaW5nQ29udGV4dD93dihlLHQucGVuZGluZ0NvbnRleHQsdC5wZW5kaW5nQ29udGV4dCE9PXQuY29udGV4dCk6dC5jb250ZXh0JiZ3dihlLHQuY29udGV4dCwhMSksb2coZSx0LmNvbnRhaW5lckluZm8pfWZ1bmN0aW9uIGp2KGUsdCxuLHIsbyl7cmV0dXJuIHhsKCksWnAobyksdC5mbGFnc3w9MjU2LFl0KGUsdCxuLHIpLHQuY2hpbGR9dmFyIHZoPXtkZWh5ZHJhdGVkOm51bGwsdHJlZUNvbnRleHQ6bnVsbCxyZXRyeUxhbmU6MH07ZnVuY3Rpb24geWgoZSl7cmV0dXJue2Jhc2VMYW5lczplLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9fWZ1bmN0aW9uIEl4KGUsdCxuKXt2YXIgcj10LnBlbmRpbmdQcm9wcyxvPUplLmN1cnJlbnQsaT0hMSxsPSh0LmZsYWdzJjEyOCkhPT0wLHM7aWYoKHM9bCl8fChzPWUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGU9PT1udWxsPyExOihvJjIpIT09MCkscz8oaT0hMCx0LmZsYWdzJj0tMTI5KTooZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiYob3w9MSksRmUoSmUsbyYxKSxlPT09bnVsbClyZXR1cm4gY2godCksZT10Lm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJihlPWUuZGVoeWRyYXRlZCxlIT09bnVsbCk/KHQubW9kZSYxP2UuZGF0YT09PSIkISI/dC5sYW5lcz04OnQubGFuZXM9MTA3Mzc0MTgyNDp0LmxhbmVzPTEsbnVsbCk6KGw9ci5jaGlsZHJlbixlPXIuZmFsbGJhY2ssaT8ocj10Lm1vZGUsaT10LmNoaWxkLGw9e21vZGU6ImhpZGRlbiIsY2hpbGRyZW46bH0sIShyJjEpJiZpIT09bnVsbD8oaS5jaGlsZExhbmVzPTAsaS5wZW5kaW5nUHJvcHM9bCk6aT1xYyhsLHIsMCxudWxsKSxlPW5pKGUscixuLG51bGwpLGkucmV0dXJuPXQsZS5yZXR1cm49dCxpLnNpYmxpbmc9ZSx0LmNoaWxkPWksdC5jaGlsZC5tZW1vaXplZFN0YXRlPXloKG4pLHQubWVtb2l6ZWRTdGF0ZT12aCxlKTpmZyh0LGwpKTtpZihvPWUubWVtb2l6ZWRTdGF0ZSxvIT09bnVsbCYmKHM9by5kZWh5ZHJhdGVkLHMhPT1udWxsKSlyZXR1cm4gQ2soZSx0LGwscixzLG8sbik7aWYoaSl7aT1yLmZhbGxiYWNrLGw9dC5tb2RlLG89ZS5jaGlsZCxzPW8uc2libGluZzt2YXIgYT17bW9kZToiaGlkZGVuIixjaGlsZHJlbjpyLmNoaWxkcmVufTtyZXR1cm4hKGwmMSkmJnQuY2hpbGQhPT1vPyhyPXQuY2hpbGQsci5jaGlsZExhbmVzPTAsci5wZW5kaW5nUHJvcHM9YSx0LmRlbGV0aW9ucz1udWxsKToocj1FbyhvLGEpLHIuc3VidHJlZUZsYWdzPW8uc3VidHJlZUZsYWdzJjE0NjgwMDY0KSxzIT09bnVsbD9pPUVvKHMsaSk6KGk9bmkoaSxsLG4sbnVsbCksaS5mbGFnc3w9MiksaS5yZXR1cm49dCxyLnJldHVybj10LHIuc2libGluZz1pLHQuY2hpbGQ9cixyPWksaT10LmNoaWxkLGw9ZS5jaGlsZC5tZW1vaXplZFN0YXRlLGw9bD09PW51bGw/eWgobik6e2Jhc2VMYW5lczpsLmJhc2VMYW5lc3xuLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOmwudHJhbnNpdGlvbnN9LGkubWVtb2l6ZWRTdGF0ZT1sLGkuY2hpbGRMYW5lcz1lLmNoaWxkTGFuZXMmfm4sdC5tZW1vaXplZFN0YXRlPXZoLHJ9cmV0dXJuIGk9ZS5jaGlsZCxlPWkuc2libGluZyxyPUVvKGkse21vZGU6InZpc2libGUiLGNoaWxkcmVuOnIuY2hpbGRyZW59KSwhKHQubW9kZSYxKSYmKHIubGFuZXM9biksci5yZXR1cm49dCxyLnNpYmxpbmc9bnVsbCxlIT09bnVsbCYmKG49dC5kZWxldGlvbnMsbj09PW51bGw/KHQuZGVsZXRpb25zPVtlXSx0LmZsYWdzfD0xNik6bi5wdXNoKGUpKSx0LmNoaWxkPXIsdC5tZW1vaXplZFN0YXRlPW51bGwscn1mdW5jdGlvbiBmZyhlLHQpe3JldHVybiB0PXFjKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjp0fSxlLm1vZGUsMCxudWxsKSx0LnJldHVybj1lLGUuY2hpbGQ9dH1mdW5jdGlvbiBpdShlLHQsbixyKXtyZXR1cm4gciE9PW51bGwmJlpwKHIpLF9sKHQsZS5jaGlsZCxudWxsLG4pLGU9ZmcodCx0LnBlbmRpbmdQcm9wcy5jaGlsZHJlbiksZS5mbGFnc3w9Mix0Lm1lbW9pemVkU3RhdGU9bnVsbCxlfWZ1bmN0aW9uIENrKGUsdCxuLHIsbyxpLGwpe2lmKG4pcmV0dXJuIHQuZmxhZ3MmMjU2Pyh0LmZsYWdzJj0tMjU3LHI9dWYoRXJyb3IoVyg0MjIpKSksaXUoZSx0LGwscikpOnQubWVtb2l6ZWRTdGF0ZSE9PW51bGw/KHQuY2hpbGQ9ZS5jaGlsZCx0LmZsYWdzfD0xMjgsbnVsbCk6KGk9ci5mYWxsYmFjayxvPXQubW9kZSxyPXFjKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjpyLmNoaWxkcmVufSxvLDAsbnVsbCksaT1uaShpLG8sbCxudWxsKSxpLmZsYWdzfD0yLHIucmV0dXJuPXQsaS5yZXR1cm49dCxyLnNpYmxpbmc9aSx0LmNoaWxkPXIsdC5tb2RlJjEmJl9sKHQsZS5jaGlsZCxudWxsLGwpLHQuY2hpbGQubWVtb2l6ZWRTdGF0ZT15aChsKSx0Lm1lbW9pemVkU3RhdGU9dmgsaSk7aWYoISh0Lm1vZGUmMSkpcmV0dXJuIGl1KGUsdCxsLG51bGwpO2lmKG8uZGF0YT09PSIkISIpe2lmKHI9by5uZXh0U2libGluZyYmby5uZXh0U2libGluZy5kYXRhc2V0LHIpdmFyIHM9ci5kZ3N0O3JldHVybiByPXMsaT1FcnJvcihXKDQxOSkpLHI9dWYoaSxyLHZvaWQgMCksaXUoZSx0LGwscil9aWYocz0obCZlLmNoaWxkTGFuZXMpIT09MCx1bnx8cyl7aWYocj1idCxyIT09bnVsbCl7c3dpdGNoKGwmLWwpe2Nhc2UgNDpvPTI7YnJlYWs7Y2FzZSAxNjpvPTg7YnJlYWs7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0Om89MzI7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6bz0yNjg0MzU0NTY7YnJlYWs7ZGVmYXVsdDpvPTB9bz1vJihyLnN1c3BlbmRlZExhbmVzfGwpPzA6byxvIT09MCYmbyE9PWkucmV0cnlMYW5lJiYoaS5yZXRyeUxhbmU9byx6cihlLG8pLGVyKHIsZSxvLC0xKSl9cmV0dXJuIHlnKCkscj11ZihFcnJvcihXKDQyMSkpKSxpdShlLHQsbCxyKX1yZXR1cm4gby5kYXRhPT09IiQ/Ij8odC5mbGFnc3w9MTI4LHQuY2hpbGQ9ZS5jaGlsZCx0PUxrLmJpbmQobnVsbCxlKSxvLl9yZWFjdFJldHJ5PXQsbnVsbCk6KGU9aS50cmVlQ29udGV4dCx4bj1fbyhvLm5leHRTaWJsaW5nKSxfbj10LFllPSEwLFFuPW51bGwsZSE9PW51bGwmJihPbltBbisrXT1NcixPbltBbisrXT1EcixPbltBbisrXT1haSxNcj1lLmlkLERyPWUub3ZlcmZsb3csYWk9dCksdD1mZyh0LHIuY2hpbGRyZW4pLHQuZmxhZ3N8PTQwOTYsdCl9ZnVuY3Rpb24genYoZSx0LG4pe2UubGFuZXN8PXQ7dmFyIHI9ZS5hbHRlcm5hdGU7ciE9PW51bGwmJihyLmxhbmVzfD10KSxkaChlLnJldHVybix0LG4pfWZ1bmN0aW9uIGNmKGUsdCxuLHIsbyl7dmFyIGk9ZS5tZW1vaXplZFN0YXRlO2k9PT1udWxsP2UubWVtb2l6ZWRTdGF0ZT17aXNCYWNrd2FyZHM6dCxyZW5kZXJpbmc6bnVsbCxyZW5kZXJpbmdTdGFydFRpbWU6MCxsYXN0OnIsdGFpbDpuLHRhaWxNb2RlOm99OihpLmlzQmFja3dhcmRzPXQsaS5yZW5kZXJpbmc9bnVsbCxpLnJlbmRlcmluZ1N0YXJ0VGltZT0wLGkubGFzdD1yLGkudGFpbD1uLGkudGFpbE1vZGU9byl9ZnVuY3Rpb24gangoZSx0LG4pe3ZhciByPXQucGVuZGluZ1Byb3BzLG89ci5yZXZlYWxPcmRlcixpPXIudGFpbDtpZihZdChlLHQsci5jaGlsZHJlbixuKSxyPUplLmN1cnJlbnQsciYyKXI9ciYxfDIsdC5mbGFnc3w9MTI4O2Vsc2V7aWYoZSE9PW51bGwmJmUuZmxhZ3MmMTI4KWU6Zm9yKGU9dC5jaGlsZDtlIT09bnVsbDspe2lmKGUudGFnPT09MTMpZS5tZW1vaXplZFN0YXRlIT09bnVsbCYmenYoZSxuLHQpO2Vsc2UgaWYoZS50YWc9PT0xOSl6dihlLG4sdCk7ZWxzZSBpZihlLmNoaWxkIT09bnVsbCl7ZS5jaGlsZC5yZXR1cm49ZSxlPWUuY2hpbGQ7Y29udGludWV9aWYoZT09PXQpYnJlYWsgZTtmb3IoO2Uuc2libGluZz09PW51bGw7KXtpZihlLnJldHVybj09PW51bGx8fGUucmV0dXJuPT09dClicmVhayBlO2U9ZS5yZXR1cm59ZS5zaWJsaW5nLnJldHVybj1lLnJldHVybixlPWUuc2libGluZ31yJj0xfWlmKEZlKEplLHIpLCEodC5tb2RlJjEpKXQubWVtb2l6ZWRTdGF0ZT1udWxsO2Vsc2Ugc3dpdGNoKG8pe2Nhc2UiZm9yd2FyZHMiOmZvcihuPXQuY2hpbGQsbz1udWxsO24hPT1udWxsOyllPW4uYWx0ZXJuYXRlLGUhPT1udWxsJiZsYyhlKT09PW51bGwmJihvPW4pLG49bi5zaWJsaW5nO249byxuPT09bnVsbD8obz10LmNoaWxkLHQuY2hpbGQ9bnVsbCk6KG89bi5zaWJsaW5nLG4uc2libGluZz1udWxsKSxjZih0LCExLG8sbixpKTticmVhaztjYXNlImJhY2t3YXJkcyI6Zm9yKG49bnVsbCxvPXQuY2hpbGQsdC5jaGlsZD1udWxsO28hPT1udWxsOyl7aWYoZT1vLmFsdGVybmF0ZSxlIT09bnVsbCYmbGMoZSk9PT1udWxsKXt0LmNoaWxkPW87YnJlYWt9ZT1vLnNpYmxpbmcsby5zaWJsaW5nPW4sbj1vLG89ZX1jZih0LCEwLG4sbnVsbCxpKTticmVhaztjYXNlInRvZ2V0aGVyIjpjZih0LCExLG51bGwsbnVsbCx2b2lkIDApO2JyZWFrO2RlZmF1bHQ6dC5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIHQuY2hpbGR9ZnVuY3Rpb24gT3UoZSx0KXshKHQubW9kZSYxKSYmZSE9PW51bGwmJihlLmFsdGVybmF0ZT1udWxsLHQuYWx0ZXJuYXRlPW51bGwsdC5mbGFnc3w9Mil9ZnVuY3Rpb24gRnIoZSx0LG4pe2lmKGUhPT1udWxsJiYodC5kZXBlbmRlbmNpZXM9ZS5kZXBlbmRlbmNpZXMpLGNpfD10LmxhbmVzLCEobiZ0LmNoaWxkTGFuZXMpKXJldHVybiBudWxsO2lmKGUhPT1udWxsJiZ0LmNoaWxkIT09ZS5jaGlsZCl0aHJvdyBFcnJvcihXKDE1MykpO2lmKHQuY2hpbGQhPT1udWxsKXtmb3IoZT10LmNoaWxkLG49RW8oZSxlLnBlbmRpbmdQcm9wcyksdC5jaGlsZD1uLG4ucmV0dXJuPXQ7ZS5zaWJsaW5nIT09bnVsbDspZT1lLnNpYmxpbmcsbj1uLnNpYmxpbmc9RW8oZSxlLnBlbmRpbmdQcm9wcyksbi5yZXR1cm49dDtuLnNpYmxpbmc9bnVsbH1yZXR1cm4gdC5jaGlsZH1mdW5jdGlvbiBFayhlLHQsbil7c3dpdGNoKHQudGFnKXtjYXNlIDM6THgodCkseGwoKTticmVhaztjYXNlIDU6ZHgodCk7YnJlYWs7Y2FzZSAxOmRuKHQudHlwZSkmJmVjKHQpO2JyZWFrO2Nhc2UgNDpvZyh0LHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO2JyZWFrO2Nhc2UgMTA6dmFyIHI9dC50eXBlLl9jb250ZXh0LG89dC5tZW1vaXplZFByb3BzLnZhbHVlO0ZlKHJjLHIuX2N1cnJlbnRWYWx1ZSksci5fY3VycmVudFZhbHVlPW87YnJlYWs7Y2FzZSAxMzppZihyPXQubWVtb2l6ZWRTdGF0ZSxyIT09bnVsbClyZXR1cm4gci5kZWh5ZHJhdGVkIT09bnVsbD8oRmUoSmUsSmUuY3VycmVudCYxKSx0LmZsYWdzfD0xMjgsbnVsbCk6biZ0LmNoaWxkLmNoaWxkTGFuZXM/SXgoZSx0LG4pOihGZShKZSxKZS5jdXJyZW50JjEpLGU9RnIoZSx0LG4pLGUhPT1udWxsP2Uuc2libGluZzpudWxsKTtGZShKZSxKZS5jdXJyZW50JjEpO2JyZWFrO2Nhc2UgMTk6aWYocj0obiZ0LmNoaWxkTGFuZXMpIT09MCxlLmZsYWdzJjEyOCl7aWYocilyZXR1cm4gangoZSx0LG4pO3QuZmxhZ3N8PTEyOH1pZihvPXQubWVtb2l6ZWRTdGF0ZSxvIT09bnVsbCYmKG8ucmVuZGVyaW5nPW51bGwsby50YWlsPW51bGwsby5sYXN0RWZmZWN0PW51bGwpLEZlKEplLEplLmN1cnJlbnQpLHIpYnJlYWs7cmV0dXJuIG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiB0LmxhbmVzPTAsTXgoZSx0LG4pfXJldHVybiBGcihlLHQsbil9dmFyIHp4LHhoLEZ4LEJ4O3p4PWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXQuY2hpbGQ7biE9PW51bGw7KXtpZihuLnRhZz09PTV8fG4udGFnPT09NillLmFwcGVuZENoaWxkKG4uc3RhdGVOb2RlKTtlbHNlIGlmKG4udGFnIT09NCYmbi5jaGlsZCE9PW51bGwpe24uY2hpbGQucmV0dXJuPW4sbj1uLmNoaWxkO2NvbnRpbnVlfWlmKG49PT10KWJyZWFrO2Zvcig7bi5zaWJsaW5nPT09bnVsbDspe2lmKG4ucmV0dXJuPT09bnVsbHx8bi5yZXR1cm49PT10KXJldHVybjtuPW4ucmV0dXJufW4uc2libGluZy5yZXR1cm49bi5yZXR1cm4sbj1uLnNpYmxpbmd9fTt4aD1mdW5jdGlvbigpe307Rng9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89ZS5tZW1vaXplZFByb3BzO2lmKG8hPT1yKXtlPXQuc3RhdGVOb2RlLFpvKGdyLmN1cnJlbnQpO3ZhciBpPW51bGw7c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOm89QmYoZSxvKSxyPUJmKGUsciksaT1bXTticmVhaztjYXNlInNlbGVjdCI6bz10dCh7fSxvLHt2YWx1ZTp2b2lkIDB9KSxyPXR0KHt9LHIse3ZhbHVlOnZvaWQgMH0pLGk9W107YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6bz1WZihlLG8pLHI9VmYoZSxyKSxpPVtdO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIG8ub25DbGljayE9ImZ1bmN0aW9uIiYmdHlwZW9mIHIub25DbGljaz09ImZ1bmN0aW9uIiYmKGUub25jbGljaz1adSl9S2YobixyKTt2YXIgbDtuPW51bGw7Zm9yKHUgaW4gbylpZighci5oYXNPd25Qcm9wZXJ0eSh1KSYmby5oYXNPd25Qcm9wZXJ0eSh1KSYmb1t1XSE9bnVsbClpZih1PT09InN0eWxlIil7dmFyIHM9b1t1XTtmb3IobCBpbiBzKXMuaGFzT3duUHJvcGVydHkobCkmJihufHwobj17fSksbltsXT0iIil9ZWxzZSB1IT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiYmdSE9PSJjaGlsZHJlbiImJnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiZ1IT09ImF1dG9Gb2N1cyImJihHcy5oYXNPd25Qcm9wZXJ0eSh1KT9pfHwoaT1bXSk6KGk9aXx8W10pLnB1c2godSxudWxsKSk7Zm9yKHUgaW4gcil7dmFyIGE9clt1XTtpZihzPW8hPW51bGw/b1t1XTp2b2lkIDAsci5oYXNPd25Qcm9wZXJ0eSh1KSYmYSE9PXMmJihhIT1udWxsfHxzIT1udWxsKSlpZih1PT09InN0eWxlIilpZihzKXtmb3IobCBpbiBzKSFzLmhhc093blByb3BlcnR5KGwpfHxhJiZhLmhhc093blByb3BlcnR5KGwpfHwobnx8KG49e30pLG5bbF09IiIpO2ZvcihsIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShsKSYmc1tsXSE9PWFbbF0mJihufHwobj17fSksbltsXT1hW2xdKX1lbHNlIG58fChpfHwoaT1bXSksaS5wdXNoKHUsbikpLG49YTtlbHNlIHU9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyhhPWE/YS5fX2h0bWw6dm9pZCAwLHM9cz9zLl9faHRtbDp2b2lkIDAsYSE9bnVsbCYmcyE9PWEmJihpPWl8fFtdKS5wdXNoKHUsYSkpOnU9PT0iY2hpbGRyZW4iP3R5cGVvZiBhIT0ic3RyaW5nIiYmdHlwZW9mIGEhPSJudW1iZXIifHwoaT1pfHxbXSkucHVzaCh1LCIiK2EpOnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiYoR3MuaGFzT3duUHJvcGVydHkodSk/KGEhPW51bGwmJnU9PT0ib25TY3JvbGwiJiZVZSgic2Nyb2xsIixlKSxpfHxzPT09YXx8KGk9W10pKTooaT1pfHxbXSkucHVzaCh1LGEpKX1uJiYoaT1pfHxbXSkucHVzaCgic3R5bGUiLG4pO3ZhciB1PWk7KHQudXBkYXRlUXVldWU9dSkmJih0LmZsYWdzfD00KX19O0J4PWZ1bmN0aW9uKGUsdCxuLHIpe24hPT1yJiYodC5mbGFnc3w9NCl9O2Z1bmN0aW9uIHNzKGUsdCl7aWYoIVllKXN3aXRjaChlLnRhaWxNb2RlKXtjYXNlImhpZGRlbiI6dD1lLnRhaWw7Zm9yKHZhciBuPW51bGw7dCE9PW51bGw7KXQuYWx0ZXJuYXRlIT09bnVsbCYmKG49dCksdD10LnNpYmxpbmc7bj09PW51bGw/ZS50YWlsPW51bGw6bi5zaWJsaW5nPW51bGw7YnJlYWs7Y2FzZSJjb2xsYXBzZWQiOm49ZS50YWlsO2Zvcih2YXIgcj1udWxsO24hPT1udWxsOyluLmFsdGVybmF0ZSE9PW51bGwmJihyPW4pLG49bi5zaWJsaW5nO3I9PT1udWxsP3R8fGUudGFpbD09PW51bGw/ZS50YWlsPW51bGw6ZS50YWlsLnNpYmxpbmc9bnVsbDpyLnNpYmxpbmc9bnVsbH19ZnVuY3Rpb24gQnQoZSl7dmFyIHQ9ZS5hbHRlcm5hdGUhPT1udWxsJiZlLmFsdGVybmF0ZS5jaGlsZD09PWUuY2hpbGQsbj0wLHI9MDtpZih0KWZvcih2YXIgbz1lLmNoaWxkO28hPT1udWxsOylufD1vLmxhbmVzfG8uY2hpbGRMYW5lcyxyfD1vLnN1YnRyZWVGbGFncyYxNDY4MDA2NCxyfD1vLmZsYWdzJjE0NjgwMDY0LG8ucmV0dXJuPWUsbz1vLnNpYmxpbmc7ZWxzZSBmb3Iobz1lLmNoaWxkO28hPT1udWxsOylufD1vLmxhbmVzfG8uY2hpbGRMYW5lcyxyfD1vLnN1YnRyZWVGbGFncyxyfD1vLmZsYWdzLG8ucmV0dXJuPWUsbz1vLnNpYmxpbmc7cmV0dXJuIGUuc3VidHJlZUZsYWdzfD1yLGUuY2hpbGRMYW5lcz1uLHR9ZnVuY3Rpb24gJGsoZSx0LG4pe3ZhciByPXQucGVuZGluZ1Byb3BzO3N3aXRjaChKcCh0KSx0LnRhZyl7Y2FzZSAyOmNhc2UgMTY6Y2FzZSAxNTpjYXNlIDA6Y2FzZSAxMTpjYXNlIDc6Y2FzZSA4OmNhc2UgMTI6Y2FzZSA5OmNhc2UgMTQ6cmV0dXJuIEJ0KHQpLG51bGw7Y2FzZSAxOnJldHVybiBkbih0LnR5cGUpJiZxdSgpLEJ0KHQpLG51bGw7Y2FzZSAzOnJldHVybiByPXQuc3RhdGVOb2RlLHdsKCksR2UoY24pLEdlKEd0KSxsZygpLHIucGVuZGluZ0NvbnRleHQmJihyLmNvbnRleHQ9ci5wZW5kaW5nQ29udGV4dCxyLnBlbmRpbmdDb250ZXh0PW51bGwpLChlPT09bnVsbHx8ZS5jaGlsZD09PW51bGwpJiYocnUodCk/dC5mbGFnc3w9NDplPT09bnVsbHx8ZS5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmISh0LmZsYWdzJjI1Nil8fCh0LmZsYWdzfD0xMDI0LFFuIT09bnVsbCYmKFRoKFFuKSxRbj1udWxsKSkpLHhoKGUsdCksQnQodCksbnVsbDtjYXNlIDU6aWcodCk7dmFyIG89Wm8oaWEuY3VycmVudCk7aWYobj10LnR5cGUsZSE9PW51bGwmJnQuc3RhdGVOb2RlIT1udWxsKUZ4KGUsdCxuLHIsbyksZS5yZWYhPT10LnJlZiYmKHQuZmxhZ3N8PTUxMix0LmZsYWdzfD0yMDk3MTUyKTtlbHNle2lmKCFyKXtpZih0LnN0YXRlTm9kZT09PW51bGwpdGhyb3cgRXJyb3IoVygxNjYpKTtyZXR1cm4gQnQodCksbnVsbH1pZihlPVpvKGdyLmN1cnJlbnQpLHJ1KHQpKXtyPXQuc3RhdGVOb2RlLG49dC50eXBlO3ZhciBpPXQubWVtb2l6ZWRQcm9wcztzd2l0Y2goclt1cl09dCxyW3JhXT1pLGU9KHQubW9kZSYxKSE9PTAsbil7Y2FzZSJkaWFsb2ciOlVlKCJjYW5jZWwiLHIpLFVlKCJjbG9zZSIscik7YnJlYWs7Y2FzZSJpZnJhbWUiOmNhc2Uib2JqZWN0IjpjYXNlImVtYmVkIjpVZSgibG9hZCIscik7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKG89MDtvPHhzLmxlbmd0aDtvKyspVWUoeHNbb10scik7YnJlYWs7Y2FzZSJzb3VyY2UiOlVlKCJlcnJvciIscik7YnJlYWs7Y2FzZSJpbWciOmNhc2UiaW1hZ2UiOmNhc2UibGluayI6VWUoImVycm9yIixyKSxVZSgibG9hZCIscik7YnJlYWs7Y2FzZSJkZXRhaWxzIjpVZSgidG9nZ2xlIixyKTticmVhaztjYXNlImlucHV0IjpZbShyLGkpLFVlKCJpbnZhbGlkIixyKTticmVhaztjYXNlInNlbGVjdCI6ci5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIWkubXVsdGlwbGV9LFVlKCJpbnZhbGlkIixyKTticmVhaztjYXNlInRleHRhcmVhIjpRbShyLGkpLFVlKCJpbnZhbGlkIixyKX1LZihuLGkpLG89bnVsbDtmb3IodmFyIGwgaW4gaSlpZihpLmhhc093blByb3BlcnR5KGwpKXt2YXIgcz1pW2xdO2w9PT0iY2hpbGRyZW4iP3R5cGVvZiBzPT0ic3RyaW5nIj9yLnRleHRDb250ZW50IT09cyYmKGkuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIT09ITAmJm51KHIudGV4dENvbnRlbnQscyxlKSxvPVsiY2hpbGRyZW4iLHNdKTp0eXBlb2Ygcz09Im51bWJlciImJnIudGV4dENvbnRlbnQhPT0iIitzJiYoaS5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmbnUoci50ZXh0Q29udGVudCxzLGUpLG89WyJjaGlsZHJlbiIsIiIrc10pOkdzLmhhc093blByb3BlcnR5KGwpJiZzIT1udWxsJiZsPT09Im9uU2Nyb2xsIiYmVWUoInNjcm9sbCIscil9c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOllhKHIpLFhtKHIsaSwhMCk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6WWEociksSm0ocik7YnJlYWs7Y2FzZSJzZWxlY3QiOmNhc2Uib3B0aW9uIjpicmVhaztkZWZhdWx0OnR5cGVvZiBpLm9uQ2xpY2s9PSJmdW5jdGlvbiImJihyLm9uY2xpY2s9WnUpfXI9byx0LnVwZGF0ZVF1ZXVlPXIsciE9PW51bGwmJih0LmZsYWdzfD00KX1lbHNle2w9by5ub2RlVHlwZT09PTk/bzpvLm93bmVyRG9jdW1lbnQsZT09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiYmKGU9cDEobikpLGU9PT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI/bj09PSJzY3JpcHQiPyhlPWwuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5pbm5lckhUTUw9IjxzY3JpcHQ+PFwvc2NyaXB0PiIsZT1lLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCkpOnR5cGVvZiByLmlzPT0ic3RyaW5nIj9lPWwuY3JlYXRlRWxlbWVudChuLHtpczpyLmlzfSk6KGU9bC5jcmVhdGVFbGVtZW50KG4pLG49PT0ic2VsZWN0IiYmKGw9ZSxyLm11bHRpcGxlP2wubXVsdGlwbGU9ITA6ci5zaXplJiYobC5zaXplPXIuc2l6ZSkpKTplPWwuY3JlYXRlRWxlbWVudE5TKGUsbiksZVt1cl09dCxlW3JhXT1yLHp4KGUsdCwhMSwhMSksdC5zdGF0ZU5vZGU9ZTtlOntzd2l0Y2gobD1HZihuLHIpLG4pe2Nhc2UiZGlhbG9nIjpVZSgiY2FuY2VsIixlKSxVZSgiY2xvc2UiLGUpLG89cjticmVhaztjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmNhc2UiZW1iZWQiOlVlKCJsb2FkIixlKSxvPXI7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKG89MDtvPHhzLmxlbmd0aDtvKyspVWUoeHNbb10sZSk7bz1yO2JyZWFrO2Nhc2Uic291cmNlIjpVZSgiZXJyb3IiLGUpLG89cjticmVhaztjYXNlImltZyI6Y2FzZSJpbWFnZSI6Y2FzZSJsaW5rIjpVZSgiZXJyb3IiLGUpLFVlKCJsb2FkIixlKSxvPXI7YnJlYWs7Y2FzZSJkZXRhaWxzIjpVZSgidG9nZ2xlIixlKSxvPXI7YnJlYWs7Y2FzZSJpbnB1dCI6WW0oZSxyKSxvPUJmKGUsciksVWUoImludmFsaWQiLGUpO2JyZWFrO2Nhc2Uib3B0aW9uIjpvPXI7YnJlYWs7Y2FzZSJzZWxlY3QiOmUuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFyLm11bHRpcGxlfSxvPXR0KHt9LHIse3ZhbHVlOnZvaWQgMH0pLFVlKCJpbnZhbGlkIixlKTticmVhaztjYXNlInRleHRhcmVhIjpRbShlLHIpLG89VmYoZSxyKSxVZSgiaW52YWxpZCIsZSk7YnJlYWs7ZGVmYXVsdDpvPXJ9S2YobixvKSxzPW87Zm9yKGkgaW4gcylpZihzLmhhc093blByb3BlcnR5KGkpKXt2YXIgYT1zW2ldO2k9PT0ic3R5bGUiP3YxKGUsYSk6aT09PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/KGE9YT9hLl9faHRtbDp2b2lkIDAsYSE9bnVsbCYmZzEoZSxhKSk6aT09PSJjaGlsZHJlbiI/dHlwZW9mIGE9PSJzdHJpbmciPyhuIT09InRleHRhcmVhInx8YSE9PSIiKSYmWXMoZSxhKTp0eXBlb2YgYT09Im51bWJlciImJllzKGUsIiIrYSk6aSE9PSJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciJiZpIT09InN1cHByZXNzSHlkcmF0aW9uV2FybmluZyImJmkhPT0iYXV0b0ZvY3VzIiYmKEdzLmhhc093blByb3BlcnR5KGkpP2EhPW51bGwmJmk9PT0ib25TY3JvbGwiJiZVZSgic2Nyb2xsIixlKTphIT1udWxsJiZMcChlLGksYSxsKSl9c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOllhKGUpLFhtKGUsciwhMSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6WWEoZSksSm0oZSk7YnJlYWs7Y2FzZSJvcHRpb24iOnIudmFsdWUhPW51bGwmJmUuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIrVG8oci52YWx1ZSkpO2JyZWFrO2Nhc2Uic2VsZWN0IjplLm11bHRpcGxlPSEhci5tdWx0aXBsZSxpPXIudmFsdWUsaSE9bnVsbD9pbChlLCEhci5tdWx0aXBsZSxpLCExKTpyLmRlZmF1bHRWYWx1ZSE9bnVsbCYmaWwoZSwhIXIubXVsdGlwbGUsci5kZWZhdWx0VmFsdWUsITApO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIG8ub25DbGljaz09ImZ1bmN0aW9uIiYmKGUub25jbGljaz1adSl9c3dpdGNoKG4pe2Nhc2UiYnV0dG9uIjpjYXNlImlucHV0IjpjYXNlInNlbGVjdCI6Y2FzZSJ0ZXh0YXJlYSI6cj0hIXIuYXV0b0ZvY3VzO2JyZWFrIGU7Y2FzZSJpbWciOnI9ITA7YnJlYWsgZTtkZWZhdWx0OnI9ITF9fXImJih0LmZsYWdzfD00KX10LnJlZiE9PW51bGwmJih0LmZsYWdzfD01MTIsdC5mbGFnc3w9MjA5NzE1Mil9cmV0dXJuIEJ0KHQpLG51bGw7Y2FzZSA2OmlmKGUmJnQuc3RhdGVOb2RlIT1udWxsKUJ4KGUsdCxlLm1lbW9pemVkUHJvcHMscik7ZWxzZXtpZih0eXBlb2YgciE9InN0cmluZyImJnQuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihXKDE2NikpO2lmKG49Wm8oaWEuY3VycmVudCksWm8oZ3IuY3VycmVudCkscnUodCkpe2lmKHI9dC5zdGF0ZU5vZGUsbj10Lm1lbW9pemVkUHJvcHMsclt1cl09dCwoaT1yLm5vZGVWYWx1ZSE9PW4pJiYoZT1fbixlIT09bnVsbCkpc3dpdGNoKGUudGFnKXtjYXNlIDM6bnUoci5ub2RlVmFsdWUsbiwoZS5tb2RlJjEpIT09MCk7YnJlYWs7Y2FzZSA1OmUubWVtb2l6ZWRQcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmbnUoci5ub2RlVmFsdWUsbiwoZS5tb2RlJjEpIT09MCl9aSYmKHQuZmxhZ3N8PTQpfWVsc2Ugcj0obi5ub2RlVHlwZT09PTk/bjpuLm93bmVyRG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKHIpLHJbdXJdPXQsdC5zdGF0ZU5vZGU9cn1yZXR1cm4gQnQodCksbnVsbDtjYXNlIDEzOmlmKEdlKEplKSxyPXQubWVtb2l6ZWRTdGF0ZSxlPT09bnVsbHx8ZS5tZW1vaXplZFN0YXRlIT09bnVsbCYmZS5tZW1vaXplZFN0YXRlLmRlaHlkcmF0ZWQhPT1udWxsKXtpZihZZSYmeG4hPT1udWxsJiZ0Lm1vZGUmMSYmISh0LmZsYWdzJjEyOCkpb3goKSx4bCgpLHQuZmxhZ3N8PTk4NTYwLGk9ITE7ZWxzZSBpZihpPXJ1KHQpLHIhPT1udWxsJiZyLmRlaHlkcmF0ZWQhPT1udWxsKXtpZihlPT09bnVsbCl7aWYoIWkpdGhyb3cgRXJyb3IoVygzMTgpKTtpZihpPXQubWVtb2l6ZWRTdGF0ZSxpPWkhPT1udWxsP2kuZGVoeWRyYXRlZDpudWxsLCFpKXRocm93IEVycm9yKFcoMzE3KSk7aVt1cl09dH1lbHNlIHhsKCksISh0LmZsYWdzJjEyOCkmJih0Lm1lbW9pemVkU3RhdGU9bnVsbCksdC5mbGFnc3w9NDtCdCh0KSxpPSExfWVsc2UgUW4hPT1udWxsJiYoVGgoUW4pLFFuPW51bGwpLGk9ITA7aWYoIWkpcmV0dXJuIHQuZmxhZ3MmNjU1MzY/dDpudWxsfXJldHVybiB0LmZsYWdzJjEyOD8odC5sYW5lcz1uLHQpOihyPXIhPT1udWxsLHIhPT0oZSE9PW51bGwmJmUubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiZyJiYodC5jaGlsZC5mbGFnc3w9ODE5Mix0Lm1vZGUmMSYmKGU9PT1udWxsfHxKZS5jdXJyZW50JjE/eHQ9PT0wJiYoeHQ9Myk6eWcoKSkpLHQudXBkYXRlUXVldWUhPT1udWxsJiYodC5mbGFnc3w9NCksQnQodCksbnVsbCk7Y2FzZSA0OnJldHVybiB3bCgpLHhoKGUsdCksZT09PW51bGwmJnRhKHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLEJ0KHQpLG51bGw7Y2FzZSAxMDpyZXR1cm4gdGcodC50eXBlLl9jb250ZXh0KSxCdCh0KSxudWxsO2Nhc2UgMTc6cmV0dXJuIGRuKHQudHlwZSkmJnF1KCksQnQodCksbnVsbDtjYXNlIDE5OmlmKEdlKEplKSxpPXQubWVtb2l6ZWRTdGF0ZSxpPT09bnVsbClyZXR1cm4gQnQodCksbnVsbDtpZihyPSh0LmZsYWdzJjEyOCkhPT0wLGw9aS5yZW5kZXJpbmcsbD09PW51bGwpaWYocilzcyhpLCExKTtlbHNle2lmKHh0IT09MHx8ZSE9PW51bGwmJmUuZmxhZ3MmMTI4KWZvcihlPXQuY2hpbGQ7ZSE9PW51bGw7KXtpZihsPWxjKGUpLGwhPT1udWxsKXtmb3IodC5mbGFnc3w9MTI4LHNzKGksITEpLHI9bC51cGRhdGVRdWV1ZSxyIT09bnVsbCYmKHQudXBkYXRlUXVldWU9cix0LmZsYWdzfD00KSx0LnN1YnRyZWVGbGFncz0wLHI9bixuPXQuY2hpbGQ7biE9PW51bGw7KWk9bixlPXIsaS5mbGFncyY9MTQ2ODAwNjYsbD1pLmFsdGVybmF0ZSxsPT09bnVsbD8oaS5jaGlsZExhbmVzPTAsaS5sYW5lcz1lLGkuY2hpbGQ9bnVsbCxpLnN1YnRyZWVGbGFncz0wLGkubWVtb2l6ZWRQcm9wcz1udWxsLGkubWVtb2l6ZWRTdGF0ZT1udWxsLGkudXBkYXRlUXVldWU9bnVsbCxpLmRlcGVuZGVuY2llcz1udWxsLGkuc3RhdGVOb2RlPW51bGwpOihpLmNoaWxkTGFuZXM9bC5jaGlsZExhbmVzLGkubGFuZXM9bC5sYW5lcyxpLmNoaWxkPWwuY2hpbGQsaS5zdWJ0cmVlRmxhZ3M9MCxpLmRlbGV0aW9ucz1udWxsLGkubWVtb2l6ZWRQcm9wcz1sLm1lbW9pemVkUHJvcHMsaS5tZW1vaXplZFN0YXRlPWwubWVtb2l6ZWRTdGF0ZSxpLnVwZGF0ZVF1ZXVlPWwudXBkYXRlUXVldWUsaS50eXBlPWwudHlwZSxlPWwuZGVwZW5kZW5jaWVzLGkuZGVwZW5kZW5jaWVzPWU9PT1udWxsP251bGw6e2xhbmVzOmUubGFuZXMsZmlyc3RDb250ZXh0OmUuZmlyc3RDb250ZXh0fSksbj1uLnNpYmxpbmc7cmV0dXJuIEZlKEplLEplLmN1cnJlbnQmMXwyKSx0LmNoaWxkfWU9ZS5zaWJsaW5nfWkudGFpbCE9PW51bGwmJnV0KCk+Q2wmJih0LmZsYWdzfD0xMjgscj0hMCxzcyhpLCExKSx0LmxhbmVzPTQxOTQzMDQpfWVsc2V7aWYoIXIpaWYoZT1sYyhsKSxlIT09bnVsbCl7aWYodC5mbGFnc3w9MTI4LHI9ITAsbj1lLnVwZGF0ZVF1ZXVlLG4hPT1udWxsJiYodC51cGRhdGVRdWV1ZT1uLHQuZmxhZ3N8PTQpLHNzKGksITApLGkudGFpbD09PW51bGwmJmkudGFpbE1vZGU9PT0iaGlkZGVuIiYmIWwuYWx0ZXJuYXRlJiYhWWUpcmV0dXJuIEJ0KHQpLG51bGx9ZWxzZSAyKnV0KCktaS5yZW5kZXJpbmdTdGFydFRpbWU+Q2wmJm4hPT0xMDczNzQxODI0JiYodC5mbGFnc3w9MTI4LHI9ITAsc3MoaSwhMSksdC5sYW5lcz00MTk0MzA0KTtpLmlzQmFja3dhcmRzPyhsLnNpYmxpbmc9dC5jaGlsZCx0LmNoaWxkPWwpOihuPWkubGFzdCxuIT09bnVsbD9uLnNpYmxpbmc9bDp0LmNoaWxkPWwsaS5sYXN0PWwpfXJldHVybiBpLnRhaWwhPT1udWxsPyh0PWkudGFpbCxpLnJlbmRlcmluZz10LGkudGFpbD10LnNpYmxpbmcsaS5yZW5kZXJpbmdTdGFydFRpbWU9dXQoKSx0LnNpYmxpbmc9bnVsbCxuPUplLmN1cnJlbnQsRmUoSmUscj9uJjF8MjpuJjEpLHQpOihCdCh0KSxudWxsKTtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIHZnKCkscj10Lm1lbW9pemVkU3RhdGUhPT1udWxsLGUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGUhPT1udWxsIT09ciYmKHQuZmxhZ3N8PTgxOTIpLHImJnQubW9kZSYxP21uJjEwNzM3NDE4MjQmJihCdCh0KSx0LnN1YnRyZWVGbGFncyY2JiYodC5mbGFnc3w9ODE5MikpOkJ0KHQpLG51bGw7Y2FzZSAyNDpyZXR1cm4gbnVsbDtjYXNlIDI1OnJldHVybiBudWxsfXRocm93IEVycm9yKFcoMTU2LHQudGFnKSl9ZnVuY3Rpb24ga2soZSx0KXtzd2l0Y2goSnAodCksdC50YWcpe2Nhc2UgMTpyZXR1cm4gZG4odC50eXBlKSYmcXUoKSxlPXQuZmxhZ3MsZSY2NTUzNj8odC5mbGFncz1lJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDM6cmV0dXJuIHdsKCksR2UoY24pLEdlKEd0KSxsZygpLGU9dC5mbGFncyxlJjY1NTM2JiYhKGUmMTI4KT8odC5mbGFncz1lJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDU6cmV0dXJuIGlnKHQpLG51bGw7Y2FzZSAxMzppZihHZShKZSksZT10Lm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJmUuZGVoeWRyYXRlZCE9PW51bGwpe2lmKHQuYWx0ZXJuYXRlPT09bnVsbCl0aHJvdyBFcnJvcihXKDM0MCkpO3hsKCl9cmV0dXJuIGU9dC5mbGFncyxlJjY1NTM2Pyh0LmZsYWdzPWUmLTY1NTM3fDEyOCx0KTpudWxsO2Nhc2UgMTk6cmV0dXJuIEdlKEplKSxudWxsO2Nhc2UgNDpyZXR1cm4gd2woKSxudWxsO2Nhc2UgMTA6cmV0dXJuIHRnKHQudHlwZS5fY29udGV4dCksbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIHZnKCksbnVsbDtjYXNlIDI0OnJldHVybiBudWxsO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciBsdT0hMSxVdD0hMSxUaz10eXBlb2YgV2Vha1NldD09ImZ1bmN0aW9uIj9XZWFrU2V0OlNldCxKPW51bGw7ZnVuY3Rpb24gcWkoZSx0KXt2YXIgbj1lLnJlZjtpZihuIT09bnVsbClpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIil0cnl7bihudWxsKX1jYXRjaChyKXtudChlLHQscil9ZWxzZSBuLmN1cnJlbnQ9bnVsbH1mdW5jdGlvbiBfaChlLHQsbil7dHJ5e24oKX1jYXRjaChyKXtudChlLHQscil9fXZhciBGdj0hMTtmdW5jdGlvbiBOayhlLHQpe2lmKHJoPVh1LGU9SDEoKSxYcChlKSl7aWYoInNlbGVjdGlvblN0YXJ0ImluIGUpdmFyIG49e3N0YXJ0OmUuc2VsZWN0aW9uU3RhcnQsZW5kOmUuc2VsZWN0aW9uRW5kfTtlbHNlIGU6e249KG49ZS5vd25lckRvY3VtZW50KSYmbi5kZWZhdWx0Vmlld3x8d2luZG93O3ZhciByPW4uZ2V0U2VsZWN0aW9uJiZuLmdldFNlbGVjdGlvbigpO2lmKHImJnIucmFuZ2VDb3VudCE9PTApe249ci5hbmNob3JOb2RlO3ZhciBvPXIuYW5jaG9yT2Zmc2V0LGk9ci5mb2N1c05vZGU7cj1yLmZvY3VzT2Zmc2V0O3RyeXtuLm5vZGVUeXBlLGkubm9kZVR5cGV9Y2F0Y2h7bj1udWxsO2JyZWFrIGV9dmFyIGw9MCxzPS0xLGE9LTEsdT0wLGM9MCxkPWUsZj1udWxsO3Q6Zm9yKDs7KXtmb3IodmFyIGg7ZCE9PW58fG8hPT0wJiZkLm5vZGVUeXBlIT09M3x8KHM9bCtvKSxkIT09aXx8ciE9PTAmJmQubm9kZVR5cGUhPT0zfHwoYT1sK3IpLGQubm9kZVR5cGU9PT0zJiYobCs9ZC5ub2RlVmFsdWUubGVuZ3RoKSwoaD1kLmZpcnN0Q2hpbGQpIT09bnVsbDspZj1kLGQ9aDtmb3IoOzspe2lmKGQ9PT1lKWJyZWFrIHQ7aWYoZj09PW4mJisrdT09PW8mJihzPWwpLGY9PT1pJiYrK2M9PT1yJiYoYT1sKSwoaD1kLm5leHRTaWJsaW5nKSE9PW51bGwpYnJlYWs7ZD1mLGY9ZC5wYXJlbnROb2RlfWQ9aH1uPXM9PT0tMXx8YT09PS0xP251bGw6e3N0YXJ0OnMsZW5kOmF9fWVsc2Ugbj1udWxsfW49bnx8e3N0YXJ0OjAsZW5kOjB9fWVsc2Ugbj1udWxsO2ZvcihvaD17Zm9jdXNlZEVsZW06ZSxzZWxlY3Rpb25SYW5nZTpufSxYdT0hMSxKPXQ7SiE9PW51bGw7KWlmKHQ9SixlPXQuY2hpbGQsKHQuc3VidHJlZUZsYWdzJjEwMjgpIT09MCYmZSE9PW51bGwpZS5yZXR1cm49dCxKPWU7ZWxzZSBmb3IoO0ohPT1udWxsOyl7dD1KO3RyeXt2YXIgZz10LmFsdGVybmF0ZTtpZih0LmZsYWdzJjEwMjQpc3dpdGNoKHQudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OmJyZWFrO2Nhc2UgMTppZihnIT09bnVsbCl7dmFyIG09Zy5tZW1vaXplZFByb3BzLFM9Zy5tZW1vaXplZFN0YXRlLHY9dC5zdGF0ZU5vZGUseT12LmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKHQuZWxlbWVudFR5cGU9PT10LnR5cGU/bTpHbih0LnR5cGUsbSksUyk7di5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZT15fWJyZWFrO2Nhc2UgMzp2YXIgXz10LnN0YXRlTm9kZS5jb250YWluZXJJbmZvO18ubm9kZVR5cGU9PT0xP18udGV4dENvbnRlbnQ9IiI6Xy5ub2RlVHlwZT09PTkmJl8uZG9jdW1lbnRFbGVtZW50JiZfLnJlbW92ZUNoaWxkKF8uZG9jdW1lbnRFbGVtZW50KTticmVhaztjYXNlIDU6Y2FzZSA2OmNhc2UgNDpjYXNlIDE3OmJyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoVygxNjMpKX19Y2F0Y2godyl7bnQodCx0LnJldHVybix3KX1pZihlPXQuc2libGluZyxlIT09bnVsbCl7ZS5yZXR1cm49dC5yZXR1cm4sSj1lO2JyZWFrfUo9dC5yZXR1cm59cmV0dXJuIGc9RnYsRnY9ITEsZ31mdW5jdGlvbiBScyhlLHQsbil7dmFyIHI9dC51cGRhdGVRdWV1ZTtpZihyPXIhPT1udWxsP3IubGFzdEVmZmVjdDpudWxsLHIhPT1udWxsKXt2YXIgbz1yPXIubmV4dDtkb3tpZigoby50YWcmZSk9PT1lKXt2YXIgaT1vLmRlc3Ryb3k7by5kZXN0cm95PXZvaWQgMCxpIT09dm9pZCAwJiZfaCh0LG4saSl9bz1vLm5leHR9d2hpbGUobyE9PXIpfX1mdW5jdGlvbiBKYyhlLHQpe2lmKHQ9dC51cGRhdGVRdWV1ZSx0PXQhPT1udWxsP3QubGFzdEVmZmVjdDpudWxsLHQhPT1udWxsKXt2YXIgbj10PXQubmV4dDtkb3tpZigobi50YWcmZSk9PT1lKXt2YXIgcj1uLmNyZWF0ZTtuLmRlc3Ryb3k9cigpfW49bi5uZXh0fXdoaWxlKG4hPT10KX19ZnVuY3Rpb24gd2goZSl7dmFyIHQ9ZS5yZWY7aWYodCE9PW51bGwpe3ZhciBuPWUuc3RhdGVOb2RlO3N3aXRjaChlLnRhZyl7Y2FzZSA1OmU9bjticmVhaztkZWZhdWx0OmU9bn10eXBlb2YgdD09ImZ1bmN0aW9uIj90KGUpOnQuY3VycmVudD1lfX1mdW5jdGlvbiBXeChlKXt2YXIgdD1lLmFsdGVybmF0ZTt0IT09bnVsbCYmKGUuYWx0ZXJuYXRlPW51bGwsV3godCkpLGUuY2hpbGQ9bnVsbCxlLmRlbGV0aW9ucz1udWxsLGUuc2libGluZz1udWxsLGUudGFnPT09NSYmKHQ9ZS5zdGF0ZU5vZGUsdCE9PW51bGwmJihkZWxldGUgdFt1cl0sZGVsZXRlIHRbcmFdLGRlbGV0ZSB0W3NoXSxkZWxldGUgdFtja10sZGVsZXRlIHRbZGtdKSksZS5zdGF0ZU5vZGU9bnVsbCxlLnJldHVybj1udWxsLGUuZGVwZW5kZW5jaWVzPW51bGwsZS5tZW1vaXplZFByb3BzPW51bGwsZS5tZW1vaXplZFN0YXRlPW51bGwsZS5wZW5kaW5nUHJvcHM9bnVsbCxlLnN0YXRlTm9kZT1udWxsLGUudXBkYXRlUXVldWU9bnVsbH1mdW5jdGlvbiBVeChlKXtyZXR1cm4gZS50YWc9PT01fHxlLnRhZz09PTN8fGUudGFnPT09NH1mdW5jdGlvbiBCdihlKXtlOmZvcig7Oyl7Zm9yKDtlLnNpYmxpbmc9PT1udWxsOyl7aWYoZS5yZXR1cm49PT1udWxsfHxVeChlLnJldHVybikpcmV0dXJuIG51bGw7ZT1lLnJldHVybn1mb3IoZS5zaWJsaW5nLnJldHVybj1lLnJldHVybixlPWUuc2libGluZztlLnRhZyE9PTUmJmUudGFnIT09NiYmZS50YWchPT0xODspe2lmKGUuZmxhZ3MmMnx8ZS5jaGlsZD09PW51bGx8fGUudGFnPT09NCljb250aW51ZSBlO2UuY2hpbGQucmV0dXJuPWUsZT1lLmNoaWxkfWlmKCEoZS5mbGFncyYyKSlyZXR1cm4gZS5zdGF0ZU5vZGV9fWZ1bmN0aW9uIFNoKGUsdCxuKXt2YXIgcj1lLnRhZztpZihyPT09NXx8cj09PTYpZT1lLnN0YXRlTm9kZSx0P24ubm9kZVR5cGU9PT04P24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0KTpuLmluc2VydEJlZm9yZShlLHQpOihuLm5vZGVUeXBlPT09OD8odD1uLnBhcmVudE5vZGUsdC5pbnNlcnRCZWZvcmUoZSxuKSk6KHQ9bix0LmFwcGVuZENoaWxkKGUpKSxuPW4uX3JlYWN0Um9vdENvbnRhaW5lcixuIT1udWxsfHx0Lm9uY2xpY2shPT1udWxsfHwodC5vbmNsaWNrPVp1KSk7ZWxzZSBpZihyIT09NCYmKGU9ZS5jaGlsZCxlIT09bnVsbCkpZm9yKFNoKGUsdCxuKSxlPWUuc2libGluZztlIT09bnVsbDspU2goZSx0LG4pLGU9ZS5zaWJsaW5nfWZ1bmN0aW9uIENoKGUsdCxuKXt2YXIgcj1lLnRhZztpZihyPT09NXx8cj09PTYpZT1lLnN0YXRlTm9kZSx0P24uaW5zZXJ0QmVmb3JlKGUsdCk6bi5hcHBlbmRDaGlsZChlKTtlbHNlIGlmKHIhPT00JiYoZT1lLmNoaWxkLGUhPT1udWxsKSlmb3IoQ2goZSx0LG4pLGU9ZS5zaWJsaW5nO2UhPT1udWxsOylDaChlLHQsbiksZT1lLnNpYmxpbmd9dmFyIEF0PW51bGwsWW49ITE7ZnVuY3Rpb24gZW8oZSx0LG4pe2ZvcihuPW4uY2hpbGQ7biE9PW51bGw7KVZ4KGUsdCxuKSxuPW4uc2libGluZ31mdW5jdGlvbiBWeChlLHQsbil7aWYocHImJnR5cGVvZiBwci5vbkNvbW1pdEZpYmVyVW5tb3VudD09ImZ1bmN0aW9uIil0cnl7cHIub25Db21taXRGaWJlclVubW91bnQoVWMsbil9Y2F0Y2h7fXN3aXRjaChuLnRhZyl7Y2FzZSA1OlV0fHxxaShuLHQpO2Nhc2UgNjp2YXIgcj1BdCxvPVluO0F0PW51bGwsZW8oZSx0LG4pLEF0PXIsWW49byxBdCE9PW51bGwmJihZbj8oZT1BdCxuPW4uc3RhdGVOb2RlLGUubm9kZVR5cGU9PT04P2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTplLnJlbW92ZUNoaWxkKG4pKTpBdC5yZW1vdmVDaGlsZChuLnN0YXRlTm9kZSkpO2JyZWFrO2Nhc2UgMTg6QXQhPT1udWxsJiYoWW4/KGU9QXQsbj1uLnN0YXRlTm9kZSxlLm5vZGVUeXBlPT09OD9uZihlLnBhcmVudE5vZGUsbik6ZS5ub2RlVHlwZT09PTEmJm5mKGUsbiksWnMoZSkpOm5mKEF0LG4uc3RhdGVOb2RlKSk7YnJlYWs7Y2FzZSA0OnI9QXQsbz1ZbixBdD1uLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLFluPSEwLGVvKGUsdCxuKSxBdD1yLFluPW87YnJlYWs7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKCFVdCYmKHI9bi51cGRhdGVRdWV1ZSxyIT09bnVsbCYmKHI9ci5sYXN0RWZmZWN0LHIhPT1udWxsKSkpe289cj1yLm5leHQ7ZG97dmFyIGk9byxsPWkuZGVzdHJveTtpPWkudGFnLGwhPT12b2lkIDAmJihpJjJ8fGkmNCkmJl9oKG4sdCxsKSxvPW8ubmV4dH13aGlsZShvIT09cil9ZW8oZSx0LG4pO2JyZWFrO2Nhc2UgMTppZighVXQmJihxaShuLHQpLHI9bi5zdGF0ZU5vZGUsdHlwZW9mIHIuY29tcG9uZW50V2lsbFVubW91bnQ9PSJmdW5jdGlvbiIpKXRyeXtyLnByb3BzPW4ubWVtb2l6ZWRQcm9wcyxyLnN0YXRlPW4ubWVtb2l6ZWRTdGF0ZSxyLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2gocyl7bnQobix0LHMpfWVvKGUsdCxuKTticmVhaztjYXNlIDIxOmVvKGUsdCxuKTticmVhaztjYXNlIDIyOm4ubW9kZSYxPyhVdD0ocj1VdCl8fG4ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsZW8oZSx0LG4pLFV0PXIpOmVvKGUsdCxuKTticmVhaztkZWZhdWx0OmVvKGUsdCxuKX19ZnVuY3Rpb24gV3YoZSl7dmFyIHQ9ZS51cGRhdGVRdWV1ZTtpZih0IT09bnVsbCl7ZS51cGRhdGVRdWV1ZT1udWxsO3ZhciBuPWUuc3RhdGVOb2RlO249PT1udWxsJiYobj1lLnN0YXRlTm9kZT1uZXcgVGspLHQuZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgbz1Jay5iaW5kKG51bGwsZSxyKTtuLmhhcyhyKXx8KG4uYWRkKHIpLHIudGhlbihvLG8pKX0pfX1mdW5jdGlvbiBWbihlLHQpe3ZhciBuPXQuZGVsZXRpb25zO2lmKG4hPT1udWxsKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdO3RyeXt2YXIgaT1lLGw9dCxzPWw7ZTpmb3IoO3MhPT1udWxsOyl7c3dpdGNoKHMudGFnKXtjYXNlIDU6QXQ9cy5zdGF0ZU5vZGUsWW49ITE7YnJlYWsgZTtjYXNlIDM6QXQ9cy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxZbj0hMDticmVhayBlO2Nhc2UgNDpBdD1zLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLFluPSEwO2JyZWFrIGV9cz1zLnJldHVybn1pZihBdD09PW51bGwpdGhyb3cgRXJyb3IoVygxNjApKTtWeChpLGwsbyksQXQ9bnVsbCxZbj0hMTt2YXIgYT1vLmFsdGVybmF0ZTthIT09bnVsbCYmKGEucmV0dXJuPW51bGwpLG8ucmV0dXJuPW51bGx9Y2F0Y2godSl7bnQobyx0LHUpfX1pZih0LnN1YnRyZWVGbGFncyYxMjg1NClmb3IodD10LmNoaWxkO3QhPT1udWxsOylIeCh0LGUpLHQ9dC5zaWJsaW5nfWZ1bmN0aW9uIEh4KGUsdCl7dmFyIG49ZS5hbHRlcm5hdGUscj1lLmZsYWdzO3N3aXRjaChlLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKFZuKHQsZSksbHIoZSksciY0KXt0cnl7UnMoMyxlLGUucmV0dXJuKSxKYygzLGUpfWNhdGNoKG0pe250KGUsZS5yZXR1cm4sbSl9dHJ5e1JzKDUsZSxlLnJldHVybil9Y2F0Y2gobSl7bnQoZSxlLnJldHVybixtKX19YnJlYWs7Y2FzZSAxOlZuKHQsZSksbHIoZSksciY1MTImJm4hPT1udWxsJiZxaShuLG4ucmV0dXJuKTticmVhaztjYXNlIDU6aWYoVm4odCxlKSxscihlKSxyJjUxMiYmbiE9PW51bGwmJnFpKG4sbi5yZXR1cm4pLGUuZmxhZ3MmMzIpe3ZhciBvPWUuc3RhdGVOb2RlO3RyeXtZcyhvLCIiKX1jYXRjaChtKXtudChlLGUucmV0dXJuLG0pfX1pZihyJjQmJihvPWUuc3RhdGVOb2RlLG8hPW51bGwpKXt2YXIgaT1lLm1lbW9pemVkUHJvcHMsbD1uIT09bnVsbD9uLm1lbW9pemVkUHJvcHM6aSxzPWUudHlwZSxhPWUudXBkYXRlUXVldWU7aWYoZS51cGRhdGVRdWV1ZT1udWxsLGEhPT1udWxsKXRyeXtzPT09ImlucHV0IiYmaS50eXBlPT09InJhZGlvIiYmaS5uYW1lIT1udWxsJiZmMShvLGkpLEdmKHMsbCk7dmFyIHU9R2YocyxpKTtmb3IobD0wO2w8YS5sZW5ndGg7bCs9Mil7dmFyIGM9YVtsXSxkPWFbbCsxXTtjPT09InN0eWxlIj92MShvLGQpOmM9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP2cxKG8sZCk6Yz09PSJjaGlsZHJlbiI/WXMobyxkKTpMcChvLGMsZCx1KX1zd2l0Y2gocyl7Y2FzZSJpbnB1dCI6V2YobyxpKTticmVhaztjYXNlInRleHRhcmVhIjpoMShvLGkpO2JyZWFrO2Nhc2Uic2VsZWN0Ijp2YXIgZj1vLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7by5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlPSEhaS5tdWx0aXBsZTt2YXIgaD1pLnZhbHVlO2ghPW51bGw/aWwobywhIWkubXVsdGlwbGUsaCwhMSk6ZiE9PSEhaS5tdWx0aXBsZSYmKGkuZGVmYXVsdFZhbHVlIT1udWxsP2lsKG8sISFpLm11bHRpcGxlLGkuZGVmYXVsdFZhbHVlLCEwKTppbChvLCEhaS5tdWx0aXBsZSxpLm11bHRpcGxlP1tdOiIiLCExKSl9b1tyYV09aX1jYXRjaChtKXtudChlLGUucmV0dXJuLG0pfX1icmVhaztjYXNlIDY6aWYoVm4odCxlKSxscihlKSxyJjQpe2lmKGUuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihXKDE2MikpO289ZS5zdGF0ZU5vZGUsaT1lLm1lbW9pemVkUHJvcHM7dHJ5e28ubm9kZVZhbHVlPWl9Y2F0Y2gobSl7bnQoZSxlLnJldHVybixtKX19YnJlYWs7Y2FzZSAzOmlmKFZuKHQsZSksbHIoZSksciY0JiZuIT09bnVsbCYmbi5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl0cnl7WnModC5jb250YWluZXJJbmZvKX1jYXRjaChtKXtudChlLGUucmV0dXJuLG0pfWJyZWFrO2Nhc2UgNDpWbih0LGUpLGxyKGUpO2JyZWFrO2Nhc2UgMTM6Vm4odCxlKSxscihlKSxvPWUuY2hpbGQsby5mbGFncyY4MTkyJiYoaT1vLm1lbW9pemVkU3RhdGUhPT1udWxsLG8uc3RhdGVOb2RlLmlzSGlkZGVuPWksIWl8fG8uYWx0ZXJuYXRlIT09bnVsbCYmby5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fChnZz11dCgpKSksciY0JiZXdihlKTticmVhaztjYXNlIDIyOmlmKGM9biE9PW51bGwmJm4ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsZS5tb2RlJjE/KFV0PSh1PVV0KXx8YyxWbih0LGUpLFV0PXUpOlZuKHQsZSksbHIoZSksciY4MTkyKXtpZih1PWUubWVtb2l6ZWRTdGF0ZSE9PW51bGwsKGUuc3RhdGVOb2RlLmlzSGlkZGVuPXUpJiYhYyYmZS5tb2RlJjEpZm9yKEo9ZSxjPWUuY2hpbGQ7YyE9PW51bGw7KXtmb3IoZD1KPWM7SiE9PW51bGw7KXtzd2l0Y2goZj1KLGg9Zi5jaGlsZCxmLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OlJzKDQsZixmLnJldHVybik7YnJlYWs7Y2FzZSAxOnFpKGYsZi5yZXR1cm4pO3ZhciBnPWYuc3RhdGVOb2RlO2lmKHR5cGVvZiBnLmNvbXBvbmVudFdpbGxVbm1vdW50PT0iZnVuY3Rpb24iKXtyPWYsbj1mLnJldHVybjt0cnl7dD1yLGcucHJvcHM9dC5tZW1vaXplZFByb3BzLGcuc3RhdGU9dC5tZW1vaXplZFN0YXRlLGcuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChtKXtudChyLG4sbSl9fWJyZWFrO2Nhc2UgNTpxaShmLGYucmV0dXJuKTticmVhaztjYXNlIDIyOmlmKGYubWVtb2l6ZWRTdGF0ZSE9PW51bGwpe1Z2KGQpO2NvbnRpbnVlfX1oIT09bnVsbD8oaC5yZXR1cm49ZixKPWgpOlZ2KGQpfWM9Yy5zaWJsaW5nfWU6Zm9yKGM9bnVsbCxkPWU7Oyl7aWYoZC50YWc9PT01KXtpZihjPT09bnVsbCl7Yz1kO3RyeXtvPWQuc3RhdGVOb2RlLHU/KGk9by5zdHlsZSx0eXBlb2YgaS5zZXRQcm9wZXJ0eT09ImZ1bmN0aW9uIj9pLnNldFByb3BlcnR5KCJkaXNwbGF5Iiwibm9uZSIsImltcG9ydGFudCIpOmkuZGlzcGxheT0ibm9uZSIpOihzPWQuc3RhdGVOb2RlLGE9ZC5tZW1vaXplZFByb3BzLnN0eWxlLGw9YSE9bnVsbCYmYS5oYXNPd25Qcm9wZXJ0eSgiZGlzcGxheSIpP2EuZGlzcGxheTpudWxsLHMuc3R5bGUuZGlzcGxheT1tMSgiZGlzcGxheSIsbCkpfWNhdGNoKG0pe250KGUsZS5yZXR1cm4sbSl9fX1lbHNlIGlmKGQudGFnPT09Nil7aWYoYz09PW51bGwpdHJ5e2Quc3RhdGVOb2RlLm5vZGVWYWx1ZT11PyIiOmQubWVtb2l6ZWRQcm9wc31jYXRjaChtKXtudChlLGUucmV0dXJuLG0pfX1lbHNlIGlmKChkLnRhZyE9PTIyJiZkLnRhZyE9PTIzfHxkLm1lbW9pemVkU3RhdGU9PT1udWxsfHxkPT09ZSkmJmQuY2hpbGQhPT1udWxsKXtkLmNoaWxkLnJldHVybj1kLGQ9ZC5jaGlsZDtjb250aW51ZX1pZihkPT09ZSlicmVhayBlO2Zvcig7ZC5zaWJsaW5nPT09bnVsbDspe2lmKGQucmV0dXJuPT09bnVsbHx8ZC5yZXR1cm49PT1lKWJyZWFrIGU7Yz09PWQmJihjPW51bGwpLGQ9ZC5yZXR1cm59Yz09PWQmJihjPW51bGwpLGQuc2libGluZy5yZXR1cm49ZC5yZXR1cm4sZD1kLnNpYmxpbmd9fWJyZWFrO2Nhc2UgMTk6Vm4odCxlKSxscihlKSxyJjQmJld2KGUpO2JyZWFrO2Nhc2UgMjE6YnJlYWs7ZGVmYXVsdDpWbih0LGUpLGxyKGUpfX1mdW5jdGlvbiBscihlKXt2YXIgdD1lLmZsYWdzO2lmKHQmMil7dHJ5e2U6e2Zvcih2YXIgbj1lLnJldHVybjtuIT09bnVsbDspe2lmKFV4KG4pKXt2YXIgcj1uO2JyZWFrIGV9bj1uLnJldHVybn10aHJvdyBFcnJvcihXKDE2MCkpfXN3aXRjaChyLnRhZyl7Y2FzZSA1OnZhciBvPXIuc3RhdGVOb2RlO3IuZmxhZ3MmMzImJihZcyhvLCIiKSxyLmZsYWdzJj0tMzMpO3ZhciBpPUJ2KGUpO0NoKGUsaSxvKTticmVhaztjYXNlIDM6Y2FzZSA0OnZhciBsPXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8scz1CdihlKTtTaChlLHMsbCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihXKDE2MSkpfX1jYXRjaChhKXtudChlLGUucmV0dXJuLGEpfWUuZmxhZ3MmPS0zfXQmNDA5NiYmKGUuZmxhZ3MmPS00MDk3KX1mdW5jdGlvbiBiayhlLHQsbil7Sj1lLEt4KGUpfWZ1bmN0aW9uIEt4KGUsdCxuKXtmb3IodmFyIHI9KGUubW9kZSYxKSE9PTA7SiE9PW51bGw7KXt2YXIgbz1KLGk9by5jaGlsZDtpZihvLnRhZz09PTIyJiZyKXt2YXIgbD1vLm1lbW9pemVkU3RhdGUhPT1udWxsfHxsdTtpZighbCl7dmFyIHM9by5hbHRlcm5hdGUsYT1zIT09bnVsbCYmcy5tZW1vaXplZFN0YXRlIT09bnVsbHx8VXQ7cz1sdTt2YXIgdT1VdDtpZihsdT1sLChVdD1hKSYmIXUpZm9yKEo9bztKIT09bnVsbDspbD1KLGE9bC5jaGlsZCxsLnRhZz09PTIyJiZsLm1lbW9pemVkU3RhdGUhPT1udWxsP0h2KG8pOmEhPT1udWxsPyhhLnJldHVybj1sLEo9YSk6SHYobyk7Zm9yKDtpIT09bnVsbDspSj1pLEt4KGkpLGk9aS5zaWJsaW5nO0o9byxsdT1zLFV0PXV9VXYoZSl9ZWxzZSBvLnN1YnRyZWVGbGFncyY4NzcyJiZpIT09bnVsbD8oaS5yZXR1cm49byxKPWkpOlV2KGUpfX1mdW5jdGlvbiBVdihlKXtmb3IoO0ohPT1udWxsOyl7dmFyIHQ9SjtpZih0LmZsYWdzJjg3NzIpe3ZhciBuPXQuYWx0ZXJuYXRlO3RyeXtpZih0LmZsYWdzJjg3NzIpc3dpdGNoKHQudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OlV0fHxKYyg1LHQpO2JyZWFrO2Nhc2UgMTp2YXIgcj10LnN0YXRlTm9kZTtpZih0LmZsYWdzJjQmJiFVdClpZihuPT09bnVsbClyLmNvbXBvbmVudERpZE1vdW50KCk7ZWxzZXt2YXIgbz10LmVsZW1lbnRUeXBlPT09dC50eXBlP24ubWVtb2l6ZWRQcm9wczpHbih0LnR5cGUsbi5tZW1vaXplZFByb3BzKTtyLmNvbXBvbmVudERpZFVwZGF0ZShvLG4ubWVtb2l6ZWRTdGF0ZSxyLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKX12YXIgaT10LnVwZGF0ZVF1ZXVlO2khPT1udWxsJiZrdih0LGkscik7YnJlYWs7Y2FzZSAzOnZhciBsPXQudXBkYXRlUXVldWU7aWYobCE9PW51bGwpe2lmKG49bnVsbCx0LmNoaWxkIT09bnVsbClzd2l0Y2godC5jaGlsZC50YWcpe2Nhc2UgNTpuPXQuY2hpbGQuc3RhdGVOb2RlO2JyZWFrO2Nhc2UgMTpuPXQuY2hpbGQuc3RhdGVOb2RlfWt2KHQsbCxuKX1icmVhaztjYXNlIDU6dmFyIHM9dC5zdGF0ZU5vZGU7aWYobj09PW51bGwmJnQuZmxhZ3MmNCl7bj1zO3ZhciBhPXQubWVtb2l6ZWRQcm9wcztzd2l0Y2godC50eXBlKXtjYXNlImJ1dHRvbiI6Y2FzZSJpbnB1dCI6Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOmEuYXV0b0ZvY3VzJiZuLmZvY3VzKCk7YnJlYWs7Y2FzZSJpbWciOmEuc3JjJiYobi5zcmM9YS5zcmMpfX1icmVhaztjYXNlIDY6YnJlYWs7Y2FzZSA0OmJyZWFrO2Nhc2UgMTI6YnJlYWs7Y2FzZSAxMzppZih0Lm1lbW9pemVkU3RhdGU9PT1udWxsKXt2YXIgdT10LmFsdGVybmF0ZTtpZih1IT09bnVsbCl7dmFyIGM9dS5tZW1vaXplZFN0YXRlO2lmKGMhPT1udWxsKXt2YXIgZD1jLmRlaHlkcmF0ZWQ7ZCE9PW51bGwmJlpzKGQpfX19YnJlYWs7Y2FzZSAxOTpjYXNlIDE3OmNhc2UgMjE6Y2FzZSAyMjpjYXNlIDIzOmNhc2UgMjU6YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihXKDE2MykpfVV0fHx0LmZsYWdzJjUxMiYmd2godCl9Y2F0Y2goZil7bnQodCx0LnJldHVybixmKX19aWYodD09PWUpe0o9bnVsbDticmVha31pZihuPXQuc2libGluZyxuIT09bnVsbCl7bi5yZXR1cm49dC5yZXR1cm4sSj1uO2JyZWFrfUo9dC5yZXR1cm59fWZ1bmN0aW9uIFZ2KGUpe2Zvcig7SiE9PW51bGw7KXt2YXIgdD1KO2lmKHQ9PT1lKXtKPW51bGw7YnJlYWt9dmFyIG49dC5zaWJsaW5nO2lmKG4hPT1udWxsKXtuLnJldHVybj10LnJldHVybixKPW47YnJlYWt9Sj10LnJldHVybn19ZnVuY3Rpb24gSHYoZSl7Zm9yKDtKIT09bnVsbDspe3ZhciB0PUo7dHJ5e3N3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTp2YXIgbj10LnJldHVybjt0cnl7SmMoNCx0KX1jYXRjaChhKXtudCh0LG4sYSl9YnJlYWs7Y2FzZSAxOnZhciByPXQuc3RhdGVOb2RlO2lmKHR5cGVvZiByLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iKXt2YXIgbz10LnJldHVybjt0cnl7ci5jb21wb25lbnREaWRNb3VudCgpfWNhdGNoKGEpe250KHQsbyxhKX19dmFyIGk9dC5yZXR1cm47dHJ5e3doKHQpfWNhdGNoKGEpe250KHQsaSxhKX1icmVhaztjYXNlIDU6dmFyIGw9dC5yZXR1cm47dHJ5e3doKHQpfWNhdGNoKGEpe250KHQsbCxhKX19fWNhdGNoKGEpe250KHQsdC5yZXR1cm4sYSl9aWYodD09PWUpe0o9bnVsbDticmVha312YXIgcz10LnNpYmxpbmc7aWYocyE9PW51bGwpe3MucmV0dXJuPXQucmV0dXJuLEo9czticmVha31KPXQucmV0dXJufX12YXIgUms9TWF0aC5jZWlsLHVjPVZyLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsaGc9VnIuUmVhY3RDdXJyZW50T3duZXIsam49VnIuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsRWU9MCxidD1udWxsLGN0PW51bGwsRHQ9MCxtbj0wLGVsPWpvKDApLHh0PTAsdWE9bnVsbCxjaT0wLFpjPTAscGc9MCxQcz1udWxsLGFuPW51bGwsZ2c9MCxDbD0xLzAsTnI9bnVsbCxjYz0hMSxFaD1udWxsLFNvPW51bGwsc3U9ITEscG89bnVsbCxkYz0wLE9zPTAsJGg9bnVsbCxBdT0tMSxNdT0wO2Z1bmN0aW9uIG5uKCl7cmV0dXJuIEVlJjY/dXQoKTpBdSE9PS0xP0F1OkF1PXV0KCl9ZnVuY3Rpb24gQ28oZSl7cmV0dXJuIGUubW9kZSYxP0VlJjImJkR0IT09MD9EdCYtRHQ6aGsudHJhbnNpdGlvbiE9PW51bGw/KE11PT09MCYmKE11PWIxKCkpLE11KTooZT1QZSxlIT09MHx8KGU9d2luZG93LmV2ZW50LGU9ZT09PXZvaWQgMD8xNjpMMShlLnR5cGUpKSxlKToxfWZ1bmN0aW9uIGVyKGUsdCxuLHIpe2lmKDUwPE9zKXRocm93IE9zPTAsJGg9bnVsbCxFcnJvcihXKDE4NSkpO1RhKGUsbixyKSwoIShFZSYyKXx8ZSE9PWJ0KSYmKGU9PT1idCYmKCEoRWUmMikmJihaY3w9bikseHQ9PT00JiZjbyhlLER0KSksZm4oZSxyKSxuPT09MSYmRWU9PT0wJiYhKHQubW9kZSYxKSYmKENsPXV0KCkrNTAwLFljJiZ6bygpKSl9ZnVuY3Rpb24gZm4oZSx0KXt2YXIgbj1lLmNhbGxiYWNrTm9kZTtoJChlLHQpO3ZhciByPVl1KGUsZT09PWJ0P0R0OjApO2lmKHI9PT0wKW4hPT1udWxsJiZldihuKSxlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO2Vsc2UgaWYodD1yJi1yLGUuY2FsbGJhY2tQcmlvcml0eSE9PXQpe2lmKG4hPW51bGwmJmV2KG4pLHQ9PT0xKWUudGFnPT09MD9mayhLdi5iaW5kKG51bGwsZSkpOnR4KEt2LmJpbmQobnVsbCxlKSksYWsoZnVuY3Rpb24oKXshKEVlJjYpJiZ6bygpfSksbj1udWxsO2Vsc2V7c3dpdGNoKFIxKHIpKXtjYXNlIDE6bj1CcDticmVhaztjYXNlIDQ6bj1UMTticmVhaztjYXNlIDE2Om49R3U7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6bj1OMTticmVhaztkZWZhdWx0Om49R3V9bj1lXyhuLEd4LmJpbmQobnVsbCxlKSl9ZS5jYWxsYmFja1ByaW9yaXR5PXQsZS5jYWxsYmFja05vZGU9bn19ZnVuY3Rpb24gR3goZSx0KXtpZihBdT0tMSxNdT0wLEVlJjYpdGhyb3cgRXJyb3IoVygzMjcpKTt2YXIgbj1lLmNhbGxiYWNrTm9kZTtpZihjbCgpJiZlLmNhbGxiYWNrTm9kZSE9PW4pcmV0dXJuIG51bGw7dmFyIHI9WXUoZSxlPT09YnQ/RHQ6MCk7aWYocj09PTApcmV0dXJuIG51bGw7aWYociYzMHx8ciZlLmV4cGlyZWRMYW5lc3x8dCl0PWZjKGUscik7ZWxzZXt0PXI7dmFyIG89RWU7RWV8PTI7dmFyIGk9WHgoKTsoYnQhPT1lfHxEdCE9PXQpJiYoTnI9bnVsbCxDbD11dCgpKzUwMCx0aShlLHQpKTtkbyB0cnl7QWsoKTticmVha31jYXRjaChzKXtZeChlLHMpfXdoaWxlKDEpO2VnKCksdWMuY3VycmVudD1pLEVlPW8sY3QhPT1udWxsP3Q9MDooYnQ9bnVsbCxEdD0wLHQ9eHQpfWlmKHQhPT0wKXtpZih0PT09MiYmKG89WmYoZSksbyE9PTAmJihyPW8sdD1raChlLG8pKSksdD09PTEpdGhyb3cgbj11YSx0aShlLDApLGNvKGUsciksZm4oZSx1dCgpKSxuO2lmKHQ9PT02KWNvKGUscik7ZWxzZXtpZihvPWUuY3VycmVudC5hbHRlcm5hdGUsIShyJjMwKSYmIVBrKG8pJiYodD1mYyhlLHIpLHQ9PT0yJiYoaT1aZihlKSxpIT09MCYmKHI9aSx0PWtoKGUsaSkpKSx0PT09MSkpdGhyb3cgbj11YSx0aShlLDApLGNvKGUsciksZm4oZSx1dCgpKSxuO3N3aXRjaChlLmZpbmlzaGVkV29yaz1vLGUuZmluaXNoZWRMYW5lcz1yLHQpe2Nhc2UgMDpjYXNlIDE6dGhyb3cgRXJyb3IoVygzNDUpKTtjYXNlIDI6R28oZSxhbixOcik7YnJlYWs7Y2FzZSAzOmlmKGNvKGUsciksKHImMTMwMDIzNDI0KT09PXImJih0PWdnKzUwMC11dCgpLDEwPHQpKXtpZihZdShlLDApIT09MClicmVhaztpZihvPWUuc3VzcGVuZGVkTGFuZXMsKG8mcikhPT1yKXtubigpLGUucGluZ2VkTGFuZXN8PWUuc3VzcGVuZGVkTGFuZXMmbzticmVha31lLnRpbWVvdXRIYW5kbGU9bGgoR28uYmluZChudWxsLGUsYW4sTnIpLHQpO2JyZWFrfUdvKGUsYW4sTnIpO2JyZWFrO2Nhc2UgNDppZihjbyhlLHIpLChyJjQxOTQyNDApPT09cilicmVhaztmb3IodD1lLmV2ZW50VGltZXMsbz0tMTswPHI7KXt2YXIgbD0zMS1xbihyKTtpPTE8PGwsbD10W2xdLGw+byYmKG89bCksciY9fml9aWYocj1vLHI9dXQoKS1yLHI9KDEyMD5yPzEyMDo0ODA+cj80ODA6MTA4MD5yPzEwODA6MTkyMD5yPzE5MjA6M2UzPnI/M2UzOjQzMjA+cj80MzIwOjE5NjAqUmsoci8xOTYwKSktciwxMDxyKXtlLnRpbWVvdXRIYW5kbGU9bGgoR28uYmluZChudWxsLGUsYW4sTnIpLHIpO2JyZWFrfUdvKGUsYW4sTnIpO2JyZWFrO2Nhc2UgNTpHbyhlLGFuLE5yKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKFcoMzI5KSl9fX1yZXR1cm4gZm4oZSx1dCgpKSxlLmNhbGxiYWNrTm9kZT09PW4/R3guYmluZChudWxsLGUpOm51bGx9ZnVuY3Rpb24ga2goZSx0KXt2YXIgbj1QcztyZXR1cm4gZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkJiYodGkoZSx0KS5mbGFnc3w9MjU2KSxlPWZjKGUsdCksZSE9PTImJih0PWFuLGFuPW4sdCE9PW51bGwmJlRoKHQpKSxlfWZ1bmN0aW9uIFRoKGUpe2FuPT09bnVsbD9hbj1lOmFuLnB1c2guYXBwbHkoYW4sZSl9ZnVuY3Rpb24gUGsoZSl7Zm9yKHZhciB0PWU7Oyl7aWYodC5mbGFncyYxNjM4NCl7dmFyIG49dC51cGRhdGVRdWV1ZTtpZihuIT09bnVsbCYmKG49bi5zdG9yZXMsbiE9PW51bGwpKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdLGk9by5nZXRTbmFwc2hvdDtvPW8udmFsdWU7dHJ5e2lmKCF0cihpKCksbykpcmV0dXJuITF9Y2F0Y2h7cmV0dXJuITF9fX1pZihuPXQuY2hpbGQsdC5zdWJ0cmVlRmxhZ3MmMTYzODQmJm4hPT1udWxsKW4ucmV0dXJuPXQsdD1uO2Vsc2V7aWYodD09PWUpYnJlYWs7Zm9yKDt0LnNpYmxpbmc9PT1udWxsOyl7aWYodC5yZXR1cm49PT1udWxsfHx0LnJldHVybj09PWUpcmV0dXJuITA7dD10LnJldHVybn10LnNpYmxpbmcucmV0dXJuPXQucmV0dXJuLHQ9dC5zaWJsaW5nfX1yZXR1cm4hMH1mdW5jdGlvbiBjbyhlLHQpe2Zvcih0Jj1+cGcsdCY9flpjLGUuc3VzcGVuZGVkTGFuZXN8PXQsZS5waW5nZWRMYW5lcyY9fnQsZT1lLmV4cGlyYXRpb25UaW1lczswPHQ7KXt2YXIgbj0zMS1xbih0KSxyPTE8PG47ZVtuXT0tMSx0Jj1+cn19ZnVuY3Rpb24gS3YoZSl7aWYoRWUmNil0aHJvdyBFcnJvcihXKDMyNykpO2NsKCk7dmFyIHQ9WXUoZSwwKTtpZighKHQmMSkpcmV0dXJuIGZuKGUsdXQoKSksbnVsbDt2YXIgbj1mYyhlLHQpO2lmKGUudGFnIT09MCYmbj09PTIpe3ZhciByPVpmKGUpO3IhPT0wJiYodD1yLG49a2goZSxyKSl9aWYobj09PTEpdGhyb3cgbj11YSx0aShlLDApLGNvKGUsdCksZm4oZSx1dCgpKSxuO2lmKG49PT02KXRocm93IEVycm9yKFcoMzQ1KSk7cmV0dXJuIGUuZmluaXNoZWRXb3JrPWUuY3VycmVudC5hbHRlcm5hdGUsZS5maW5pc2hlZExhbmVzPXQsR28oZSxhbixOciksZm4oZSx1dCgpKSxudWxsfWZ1bmN0aW9uIG1nKGUsdCl7dmFyIG49RWU7RWV8PTE7dHJ5e3JldHVybiBlKHQpfWZpbmFsbHl7RWU9bixFZT09PTAmJihDbD11dCgpKzUwMCxZYyYmem8oKSl9fWZ1bmN0aW9uIGRpKGUpe3BvIT09bnVsbCYmcG8udGFnPT09MCYmIShFZSY2KSYmY2woKTt2YXIgdD1FZTtFZXw9MTt2YXIgbj1qbi50cmFuc2l0aW9uLHI9UGU7dHJ5e2lmKGpuLnRyYW5zaXRpb249bnVsbCxQZT0xLGUpcmV0dXJuIGUoKX1maW5hbGx5e1BlPXIsam4udHJhbnNpdGlvbj1uLEVlPXQsIShFZSY2KSYmem8oKX19ZnVuY3Rpb24gdmcoKXttbj1lbC5jdXJyZW50LEdlKGVsKX1mdW5jdGlvbiB0aShlLHQpe2UuZmluaXNoZWRXb3JrPW51bGwsZS5maW5pc2hlZExhbmVzPTA7dmFyIG49ZS50aW1lb3V0SGFuZGxlO2lmKG4hPT0tMSYmKGUudGltZW91dEhhbmRsZT0tMSxzayhuKSksY3QhPT1udWxsKWZvcihuPWN0LnJldHVybjtuIT09bnVsbDspe3ZhciByPW47c3dpdGNoKEpwKHIpLHIudGFnKXtjYXNlIDE6cj1yLnR5cGUuY2hpbGRDb250ZXh0VHlwZXMsciE9bnVsbCYmcXUoKTticmVhaztjYXNlIDM6d2woKSxHZShjbiksR2UoR3QpLGxnKCk7YnJlYWs7Y2FzZSA1OmlnKHIpO2JyZWFrO2Nhc2UgNDp3bCgpO2JyZWFrO2Nhc2UgMTM6R2UoSmUpO2JyZWFrO2Nhc2UgMTk6R2UoSmUpO2JyZWFrO2Nhc2UgMTA6dGcoci50eXBlLl9jb250ZXh0KTticmVhaztjYXNlIDIyOmNhc2UgMjM6dmcoKX1uPW4ucmV0dXJufWlmKGJ0PWUsY3Q9ZT1FbyhlLmN1cnJlbnQsbnVsbCksRHQ9bW49dCx4dD0wLHVhPW51bGwscGc9WmM9Y2k9MCxhbj1Qcz1udWxsLEpvIT09bnVsbCl7Zm9yKHQ9MDt0PEpvLmxlbmd0aDt0KyspaWYobj1Kb1t0XSxyPW4uaW50ZXJsZWF2ZWQsciE9PW51bGwpe24uaW50ZXJsZWF2ZWQ9bnVsbDt2YXIgbz1yLm5leHQsaT1uLnBlbmRpbmc7aWYoaSE9PW51bGwpe3ZhciBsPWkubmV4dDtpLm5leHQ9byxyLm5leHQ9bH1uLnBlbmRpbmc9cn1Kbz1udWxsfXJldHVybiBlfWZ1bmN0aW9uIFl4KGUsdCl7ZG97dmFyIG49Y3Q7dHJ5e2lmKGVnKCksUnUuY3VycmVudD1hYyxzYyl7Zm9yKHZhciByPXFlLm1lbW9pemVkU3RhdGU7ciE9PW51bGw7KXt2YXIgbz1yLnF1ZXVlO28hPT1udWxsJiYoby5wZW5kaW5nPW51bGwpLHI9ci5uZXh0fXNjPSExfWlmKHVpPTAsRXQ9bXQ9cWU9bnVsbCxicz0hMSxsYT0wLGhnLmN1cnJlbnQ9bnVsbCxuPT09bnVsbHx8bi5yZXR1cm49PT1udWxsKXt4dD0xLHVhPXQsY3Q9bnVsbDticmVha31lOnt2YXIgaT1lLGw9bi5yZXR1cm4scz1uLGE9dDtpZih0PUR0LHMuZmxhZ3N8PTMyNzY4LGEhPT1udWxsJiZ0eXBlb2YgYT09Im9iamVjdCImJnR5cGVvZiBhLnRoZW49PSJmdW5jdGlvbiIpe3ZhciB1PWEsYz1zLGQ9Yy50YWc7aWYoIShjLm1vZGUmMSkmJihkPT09MHx8ZD09PTExfHxkPT09MTUpKXt2YXIgZj1jLmFsdGVybmF0ZTtmPyhjLnVwZGF0ZVF1ZXVlPWYudXBkYXRlUXVldWUsYy5tZW1vaXplZFN0YXRlPWYubWVtb2l6ZWRTdGF0ZSxjLmxhbmVzPWYubGFuZXMpOihjLnVwZGF0ZVF1ZXVlPW51bGwsYy5tZW1vaXplZFN0YXRlPW51bGwpfXZhciBoPUF2KGwpO2lmKGghPT1udWxsKXtoLmZsYWdzJj0tMjU3LE12KGgsbCxzLGksdCksaC5tb2RlJjEmJk92KGksdSx0KSx0PWgsYT11O3ZhciBnPXQudXBkYXRlUXVldWU7aWYoZz09PW51bGwpe3ZhciBtPW5ldyBTZXQ7bS5hZGQoYSksdC51cGRhdGVRdWV1ZT1tfWVsc2UgZy5hZGQoYSk7YnJlYWsgZX1lbHNle2lmKCEodCYxKSl7T3YoaSx1LHQpLHlnKCk7YnJlYWsgZX1hPUVycm9yKFcoNDI2KSl9fWVsc2UgaWYoWWUmJnMubW9kZSYxKXt2YXIgUz1BdihsKTtpZihTIT09bnVsbCl7IShTLmZsYWdzJjY1NTM2KSYmKFMuZmxhZ3N8PTI1NiksTXYoUyxsLHMsaSx0KSxacChTbChhLHMpKTticmVhayBlfX1pPWE9U2woYSxzKSx4dCE9PTQmJih4dD0yKSxQcz09PW51bGw/UHM9W2ldOlBzLnB1c2goaSksaT1sO2Rve3N3aXRjaChpLnRhZyl7Y2FzZSAzOmkuZmxhZ3N8PTY1NTM2LHQmPS10LGkubGFuZXN8PXQ7dmFyIHY9UHgoaSxhLHQpOyR2KGksdik7YnJlYWsgZTtjYXNlIDE6cz1hO3ZhciB5PWkudHlwZSxfPWkuc3RhdGVOb2RlO2lmKCEoaS5mbGFncyYxMjgpJiYodHlwZW9mIHkuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yPT0iZnVuY3Rpb24ifHxfIT09bnVsbCYmdHlwZW9mIF8uY29tcG9uZW50RGlkQ2F0Y2g9PSJmdW5jdGlvbiImJihTbz09PW51bGx8fCFTby5oYXMoXykpKSl7aS5mbGFnc3w9NjU1MzYsdCY9LXQsaS5sYW5lc3w9dDt2YXIgdz1PeChpLHMsdCk7JHYoaSx3KTticmVhayBlfX1pPWkucmV0dXJufXdoaWxlKGkhPT1udWxsKX1KeChuKX1jYXRjaChDKXt0PUMsY3Q9PT1uJiZuIT09bnVsbCYmKGN0PW49bi5yZXR1cm4pO2NvbnRpbnVlfWJyZWFrfXdoaWxlKDEpfWZ1bmN0aW9uIFh4KCl7dmFyIGU9dWMuY3VycmVudDtyZXR1cm4gdWMuY3VycmVudD1hYyxlPT09bnVsbD9hYzplfWZ1bmN0aW9uIHlnKCl7KHh0PT09MHx8eHQ9PT0zfHx4dD09PTIpJiYoeHQ9NCksYnQ9PT1udWxsfHwhKGNpJjI2ODQzNTQ1NSkmJiEoWmMmMjY4NDM1NDU1KXx8Y28oYnQsRHQpfWZ1bmN0aW9uIGZjKGUsdCl7dmFyIG49RWU7RWV8PTI7dmFyIHI9WHgoKTsoYnQhPT1lfHxEdCE9PXQpJiYoTnI9bnVsbCx0aShlLHQpKTtkbyB0cnl7T2soKTticmVha31jYXRjaChvKXtZeChlLG8pfXdoaWxlKDEpO2lmKGVnKCksRWU9bix1Yy5jdXJyZW50PXIsY3QhPT1udWxsKXRocm93IEVycm9yKFcoMjYxKSk7cmV0dXJuIGJ0PW51bGwsRHQ9MCx4dH1mdW5jdGlvbiBPaygpe2Zvcig7Y3QhPT1udWxsOylReChjdCl9ZnVuY3Rpb24gQWsoKXtmb3IoO2N0IT09bnVsbCYmIW8kKCk7KVF4KGN0KX1mdW5jdGlvbiBReChlKXt2YXIgdD1xeChlLmFsdGVybmF0ZSxlLG1uKTtlLm1lbW9pemVkUHJvcHM9ZS5wZW5kaW5nUHJvcHMsdD09PW51bGw/SngoZSk6Y3Q9dCxoZy5jdXJyZW50PW51bGx9ZnVuY3Rpb24gSngoZSl7dmFyIHQ9ZTtkb3t2YXIgbj10LmFsdGVybmF0ZTtpZihlPXQucmV0dXJuLHQuZmxhZ3MmMzI3Njgpe2lmKG49a2sobix0KSxuIT09bnVsbCl7bi5mbGFncyY9MzI3NjcsY3Q9bjtyZXR1cm59aWYoZSE9PW51bGwpZS5mbGFnc3w9MzI3NjgsZS5zdWJ0cmVlRmxhZ3M9MCxlLmRlbGV0aW9ucz1udWxsO2Vsc2V7eHQ9NixjdD1udWxsO3JldHVybn19ZWxzZSBpZihuPSRrKG4sdCxtbiksbiE9PW51bGwpe2N0PW47cmV0dXJufWlmKHQ9dC5zaWJsaW5nLHQhPT1udWxsKXtjdD10O3JldHVybn1jdD10PWV9d2hpbGUodCE9PW51bGwpO3h0PT09MCYmKHh0PTUpfWZ1bmN0aW9uIEdvKGUsdCxuKXt2YXIgcj1QZSxvPWpuLnRyYW5zaXRpb247dHJ5e2puLnRyYW5zaXRpb249bnVsbCxQZT0xLE1rKGUsdCxuLHIpfWZpbmFsbHl7am4udHJhbnNpdGlvbj1vLFBlPXJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gTWsoZSx0LG4scil7ZG8gY2woKTt3aGlsZShwbyE9PW51bGwpO2lmKEVlJjYpdGhyb3cgRXJyb3IoVygzMjcpKTtuPWUuZmluaXNoZWRXb3JrO3ZhciBvPWUuZmluaXNoZWRMYW5lcztpZihuPT09bnVsbClyZXR1cm4gbnVsbDtpZihlLmZpbmlzaGVkV29yaz1udWxsLGUuZmluaXNoZWRMYW5lcz0wLG49PT1lLmN1cnJlbnQpdGhyb3cgRXJyb3IoVygxNzcpKTtlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO3ZhciBpPW4ubGFuZXN8bi5jaGlsZExhbmVzO2lmKHAkKGUsaSksZT09PWJ0JiYoY3Q9YnQ9bnVsbCxEdD0wKSwhKG4uc3VidHJlZUZsYWdzJjIwNjQpJiYhKG4uZmxhZ3MmMjA2NCl8fHN1fHwoc3U9ITAsZV8oR3UsZnVuY3Rpb24oKXtyZXR1cm4gY2woKSxudWxsfSkpLGk9KG4uZmxhZ3MmMTU5OTApIT09MCxuLnN1YnRyZWVGbGFncyYxNTk5MHx8aSl7aT1qbi50cmFuc2l0aW9uLGpuLnRyYW5zaXRpb249bnVsbDt2YXIgbD1QZTtQZT0xO3ZhciBzPUVlO0VlfD00LGhnLmN1cnJlbnQ9bnVsbCxOayhlLG4pLEh4KG4sZSksZWsob2gpLFh1PSEhcmgsb2g9cmg9bnVsbCxlLmN1cnJlbnQ9bixiayhuKSxpJCgpLEVlPXMsUGU9bCxqbi50cmFuc2l0aW9uPWl9ZWxzZSBlLmN1cnJlbnQ9bjtpZihzdSYmKHN1PSExLHBvPWUsZGM9byksaT1lLnBlbmRpbmdMYW5lcyxpPT09MCYmKFNvPW51bGwpLGEkKG4uc3RhdGVOb2RlKSxmbihlLHV0KCkpLHQhPT1udWxsKWZvcihyPWUub25SZWNvdmVyYWJsZUVycm9yLG49MDtuPHQubGVuZ3RoO24rKylvPXRbbl0scihvLnZhbHVlLHtjb21wb25lbnRTdGFjazpvLnN0YWNrLGRpZ2VzdDpvLmRpZ2VzdH0pO2lmKGNjKXRocm93IGNjPSExLGU9RWgsRWg9bnVsbCxlO3JldHVybiBkYyYxJiZlLnRhZyE9PTAmJmNsKCksaT1lLnBlbmRpbmdMYW5lcyxpJjE/ZT09PSRoP09zKys6KE9zPTAsJGg9ZSk6T3M9MCx6bygpLG51bGx9ZnVuY3Rpb24gY2woKXtpZihwbyE9PW51bGwpe3ZhciBlPVIxKGRjKSx0PWpuLnRyYW5zaXRpb24sbj1QZTt0cnl7aWYoam4udHJhbnNpdGlvbj1udWxsLFBlPTE2PmU/MTY6ZSxwbz09PW51bGwpdmFyIHI9ITE7ZWxzZXtpZihlPXBvLHBvPW51bGwsZGM9MCxFZSY2KXRocm93IEVycm9yKFcoMzMxKSk7dmFyIG89RWU7Zm9yKEVlfD00LEo9ZS5jdXJyZW50O0ohPT1udWxsOyl7dmFyIGk9SixsPWkuY2hpbGQ7aWYoSi5mbGFncyYxNil7dmFyIHM9aS5kZWxldGlvbnM7aWYocyE9PW51bGwpe2Zvcih2YXIgYT0wO2E8cy5sZW5ndGg7YSsrKXt2YXIgdT1zW2FdO2ZvcihKPXU7SiE9PW51bGw7KXt2YXIgYz1KO3N3aXRjaChjLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpScyg4LGMsaSl9dmFyIGQ9Yy5jaGlsZDtpZihkIT09bnVsbClkLnJldHVybj1jLEo9ZDtlbHNlIGZvcig7SiE9PW51bGw7KXtjPUo7dmFyIGY9Yy5zaWJsaW5nLGg9Yy5yZXR1cm47aWYoV3goYyksYz09PXUpe0o9bnVsbDticmVha31pZihmIT09bnVsbCl7Zi5yZXR1cm49aCxKPWY7YnJlYWt9Sj1ofX19dmFyIGc9aS5hbHRlcm5hdGU7aWYoZyE9PW51bGwpe3ZhciBtPWcuY2hpbGQ7aWYobSE9PW51bGwpe2cuY2hpbGQ9bnVsbDtkb3t2YXIgUz1tLnNpYmxpbmc7bS5zaWJsaW5nPW51bGwsbT1TfXdoaWxlKG0hPT1udWxsKX19Sj1pfX1pZihpLnN1YnRyZWVGbGFncyYyMDY0JiZsIT09bnVsbClsLnJldHVybj1pLEo9bDtlbHNlIGU6Zm9yKDtKIT09bnVsbDspe2lmKGk9SixpLmZsYWdzJjIwNDgpc3dpdGNoKGkudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OlJzKDksaSxpLnJldHVybil9dmFyIHY9aS5zaWJsaW5nO2lmKHYhPT1udWxsKXt2LnJldHVybj1pLnJldHVybixKPXY7YnJlYWsgZX1KPWkucmV0dXJufX12YXIgeT1lLmN1cnJlbnQ7Zm9yKEo9eTtKIT09bnVsbDspe2w9Sjt2YXIgXz1sLmNoaWxkO2lmKGwuc3VidHJlZUZsYWdzJjIwNjQmJl8hPT1udWxsKV8ucmV0dXJuPWwsSj1fO2Vsc2UgZTpmb3IobD15O0ohPT1udWxsOyl7aWYocz1KLHMuZmxhZ3MmMjA0OCl0cnl7c3dpdGNoKHMudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OkpjKDkscyl9fWNhdGNoKEMpe250KHMscy5yZXR1cm4sQyl9aWYocz09PWwpe0o9bnVsbDticmVhayBlfXZhciB3PXMuc2libGluZztpZih3IT09bnVsbCl7dy5yZXR1cm49cy5yZXR1cm4sSj13O2JyZWFrIGV9Sj1zLnJldHVybn19aWYoRWU9byx6bygpLHByJiZ0eXBlb2YgcHIub25Qb3N0Q29tbWl0RmliZXJSb290PT0iZnVuY3Rpb24iKXRyeXtwci5vblBvc3RDb21taXRGaWJlclJvb3QoVWMsZSl9Y2F0Y2h7fXI9ITB9cmV0dXJuIHJ9ZmluYWxseXtQZT1uLGpuLnRyYW5zaXRpb249dH19cmV0dXJuITF9ZnVuY3Rpb24gR3YoZSx0LG4pe3Q9U2wobix0KSx0PVB4KGUsdCwxKSxlPXdvKGUsdCwxKSx0PW5uKCksZSE9PW51bGwmJihUYShlLDEsdCksZm4oZSx0KSl9ZnVuY3Rpb24gbnQoZSx0LG4pe2lmKGUudGFnPT09MylHdihlLGUsbik7ZWxzZSBmb3IoO3QhPT1udWxsOyl7aWYodC50YWc9PT0zKXtHdih0LGUsbik7YnJlYWt9ZWxzZSBpZih0LnRhZz09PTEpe3ZhciByPXQuc3RhdGVOb2RlO2lmKHR5cGVvZiB0LnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yPT0iZnVuY3Rpb24ifHx0eXBlb2Ygci5jb21wb25lbnREaWRDYXRjaD09ImZ1bmN0aW9uIiYmKFNvPT09bnVsbHx8IVNvLmhhcyhyKSkpe2U9U2wobixlKSxlPU94KHQsZSwxKSx0PXdvKHQsZSwxKSxlPW5uKCksdCE9PW51bGwmJihUYSh0LDEsZSksZm4odCxlKSk7YnJlYWt9fXQ9dC5yZXR1cm59fWZ1bmN0aW9uIERrKGUsdCxuKXt2YXIgcj1lLnBpbmdDYWNoZTtyIT09bnVsbCYmci5kZWxldGUodCksdD1ubigpLGUucGluZ2VkTGFuZXN8PWUuc3VzcGVuZGVkTGFuZXMmbixidD09PWUmJihEdCZuKT09PW4mJih4dD09PTR8fHh0PT09MyYmKER0JjEzMDAyMzQyNCk9PT1EdCYmNTAwPnV0KCktZ2c/dGkoZSwwKTpwZ3w9biksZm4oZSx0KX1mdW5jdGlvbiBaeChlLHQpe3Q9PT0wJiYoZS5tb2RlJjE/KHQ9SmEsSmE8PD0xLCEoSmEmMTMwMDIzNDI0KSYmKEphPTQxOTQzMDQpKTp0PTEpO3ZhciBuPW5uKCk7ZT16cihlLHQpLGUhPT1udWxsJiYoVGEoZSx0LG4pLGZuKGUsbikpfWZ1bmN0aW9uIExrKGUpe3ZhciB0PWUubWVtb2l6ZWRTdGF0ZSxuPTA7dCE9PW51bGwmJihuPXQucmV0cnlMYW5lKSxaeChlLG4pfWZ1bmN0aW9uIElrKGUsdCl7dmFyIG49MDtzd2l0Y2goZS50YWcpe2Nhc2UgMTM6dmFyIHI9ZS5zdGF0ZU5vZGUsbz1lLm1lbW9pemVkU3RhdGU7byE9PW51bGwmJihuPW8ucmV0cnlMYW5lKTticmVhaztjYXNlIDE5OnI9ZS5zdGF0ZU5vZGU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihXKDMxNCkpfXIhPT1udWxsJiZyLmRlbGV0ZSh0KSxaeChlLG4pfXZhciBxeDtxeD1mdW5jdGlvbihlLHQsbil7aWYoZSE9PW51bGwpaWYoZS5tZW1vaXplZFByb3BzIT09dC5wZW5kaW5nUHJvcHN8fGNuLmN1cnJlbnQpdW49ITA7ZWxzZXtpZighKGUubGFuZXMmbikmJiEodC5mbGFncyYxMjgpKXJldHVybiB1bj0hMSxFayhlLHQsbik7dW49ISEoZS5mbGFncyYxMzEwNzIpfWVsc2UgdW49ITEsWWUmJnQuZmxhZ3MmMTA0ODU3NiYmbngodCxuYyx0LmluZGV4KTtzd2l0Y2godC5sYW5lcz0wLHQudGFnKXtjYXNlIDI6dmFyIHI9dC50eXBlO091KGUsdCksZT10LnBlbmRpbmdQcm9wczt2YXIgbz15bCh0LEd0LmN1cnJlbnQpO3VsKHQsbiksbz1hZyhudWxsLHQscixlLG8sbik7dmFyIGk9dWcoKTtyZXR1cm4gdC5mbGFnc3w9MSx0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsJiZ0eXBlb2Ygby5yZW5kZXI9PSJmdW5jdGlvbiImJm8uJCR0eXBlb2Y9PT12b2lkIDA/KHQudGFnPTEsdC5tZW1vaXplZFN0YXRlPW51bGwsdC51cGRhdGVRdWV1ZT1udWxsLGRuKHIpPyhpPSEwLGVjKHQpKTppPSExLHQubWVtb2l6ZWRTdGF0ZT1vLnN0YXRlIT09bnVsbCYmby5zdGF0ZSE9PXZvaWQgMD9vLnN0YXRlOm51bGwscmcodCksby51cGRhdGVyPVhjLHQuc3RhdGVOb2RlPW8sby5fcmVhY3RJbnRlcm5hbHM9dCxoaCh0LHIsZSxuKSx0PW1oKG51bGwsdCxyLCEwLGksbikpOih0LnRhZz0wLFllJiZpJiZRcCh0KSxZdChudWxsLHQsbyxuKSx0PXQuY2hpbGQpLHQ7Y2FzZSAxNjpyPXQuZWxlbWVudFR5cGU7ZTp7c3dpdGNoKE91KGUsdCksZT10LnBlbmRpbmdQcm9wcyxvPXIuX2luaXQscj1vKHIuX3BheWxvYWQpLHQudHlwZT1yLG89dC50YWc9emsociksZT1HbihyLGUpLG8pe2Nhc2UgMDp0PWdoKG51bGwsdCxyLGUsbik7YnJlYWsgZTtjYXNlIDE6dD1JdihudWxsLHQscixlLG4pO2JyZWFrIGU7Y2FzZSAxMTp0PUR2KG51bGwsdCxyLGUsbik7YnJlYWsgZTtjYXNlIDE0OnQ9THYobnVsbCx0LHIsR24oci50eXBlLGUpLG4pO2JyZWFrIGV9dGhyb3cgRXJyb3IoVygzMDYsciwiIikpfXJldHVybiB0O2Nhc2UgMDpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286R24ocixvKSxnaChlLHQscixvLG4pO2Nhc2UgMTpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286R24ocixvKSxJdihlLHQscixvLG4pO2Nhc2UgMzplOntpZihMeCh0KSxlPT09bnVsbCl0aHJvdyBFcnJvcihXKDM4NykpO3I9dC5wZW5kaW5nUHJvcHMsaT10Lm1lbW9pemVkU3RhdGUsbz1pLmVsZW1lbnQsbHgoZSx0KSxpYyh0LHIsbnVsbCxuKTt2YXIgbD10Lm1lbW9pemVkU3RhdGU7aWYocj1sLmVsZW1lbnQsaS5pc0RlaHlkcmF0ZWQpaWYoaT17ZWxlbWVudDpyLGlzRGVoeWRyYXRlZDohMSxjYWNoZTpsLmNhY2hlLHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6bC5wZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzLHRyYW5zaXRpb25zOmwudHJhbnNpdGlvbnN9LHQudXBkYXRlUXVldWUuYmFzZVN0YXRlPWksdC5tZW1vaXplZFN0YXRlPWksdC5mbGFncyYyNTYpe289U2woRXJyb3IoVyg0MjMpKSx0KSx0PWp2KGUsdCxyLG4sbyk7YnJlYWsgZX1lbHNlIGlmKHIhPT1vKXtvPVNsKEVycm9yKFcoNDI0KSksdCksdD1qdihlLHQscixuLG8pO2JyZWFrIGV9ZWxzZSBmb3IoeG49X28odC5zdGF0ZU5vZGUuY29udGFpbmVySW5mby5maXJzdENoaWxkKSxfbj10LFllPSEwLFFuPW51bGwsbj1jeCh0LG51bGwscixuKSx0LmNoaWxkPW47bjspbi5mbGFncz1uLmZsYWdzJi0zfDQwOTYsbj1uLnNpYmxpbmc7ZWxzZXtpZih4bCgpLHI9PT1vKXt0PUZyKGUsdCxuKTticmVhayBlfVl0KGUsdCxyLG4pfXQ9dC5jaGlsZH1yZXR1cm4gdDtjYXNlIDU6cmV0dXJuIGR4KHQpLGU9PT1udWxsJiZjaCh0KSxyPXQudHlwZSxvPXQucGVuZGluZ1Byb3BzLGk9ZSE9PW51bGw/ZS5tZW1vaXplZFByb3BzOm51bGwsbD1vLmNoaWxkcmVuLGloKHIsbyk/bD1udWxsOmkhPT1udWxsJiZpaChyLGkpJiYodC5mbGFnc3w9MzIpLER4KGUsdCksWXQoZSx0LGwsbiksdC5jaGlsZDtjYXNlIDY6cmV0dXJuIGU9PT1udWxsJiZjaCh0KSxudWxsO2Nhc2UgMTM6cmV0dXJuIEl4KGUsdCxuKTtjYXNlIDQ6cmV0dXJuIG9nKHQsdC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbykscj10LnBlbmRpbmdQcm9wcyxlPT09bnVsbD90LmNoaWxkPV9sKHQsbnVsbCxyLG4pOll0KGUsdCxyLG4pLHQuY2hpbGQ7Y2FzZSAxMTpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286R24ocixvKSxEdihlLHQscixvLG4pO2Nhc2UgNzpyZXR1cm4gWXQoZSx0LHQucGVuZGluZ1Byb3BzLG4pLHQuY2hpbGQ7Y2FzZSA4OnJldHVybiBZdChlLHQsdC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sbiksdC5jaGlsZDtjYXNlIDEyOnJldHVybiBZdChlLHQsdC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sbiksdC5jaGlsZDtjYXNlIDEwOmU6e2lmKHI9dC50eXBlLl9jb250ZXh0LG89dC5wZW5kaW5nUHJvcHMsaT10Lm1lbW9pemVkUHJvcHMsbD1vLnZhbHVlLEZlKHJjLHIuX2N1cnJlbnRWYWx1ZSksci5fY3VycmVudFZhbHVlPWwsaSE9PW51bGwpaWYodHIoaS52YWx1ZSxsKSl7aWYoaS5jaGlsZHJlbj09PW8uY2hpbGRyZW4mJiFjbi5jdXJyZW50KXt0PUZyKGUsdCxuKTticmVhayBlfX1lbHNlIGZvcihpPXQuY2hpbGQsaSE9PW51bGwmJihpLnJldHVybj10KTtpIT09bnVsbDspe3ZhciBzPWkuZGVwZW5kZW5jaWVzO2lmKHMhPT1udWxsKXtsPWkuY2hpbGQ7Zm9yKHZhciBhPXMuZmlyc3RDb250ZXh0O2EhPT1udWxsOyl7aWYoYS5jb250ZXh0PT09cil7aWYoaS50YWc9PT0xKXthPUxyKC0xLG4mLW4pLGEudGFnPTI7dmFyIHU9aS51cGRhdGVRdWV1ZTtpZih1IT09bnVsbCl7dT11LnNoYXJlZDt2YXIgYz11LnBlbmRpbmc7Yz09PW51bGw/YS5uZXh0PWE6KGEubmV4dD1jLm5leHQsYy5uZXh0PWEpLHUucGVuZGluZz1hfX1pLmxhbmVzfD1uLGE9aS5hbHRlcm5hdGUsYSE9PW51bGwmJihhLmxhbmVzfD1uKSxkaChpLnJldHVybixuLHQpLHMubGFuZXN8PW47YnJlYWt9YT1hLm5leHR9fWVsc2UgaWYoaS50YWc9PT0xMClsPWkudHlwZT09PXQudHlwZT9udWxsOmkuY2hpbGQ7ZWxzZSBpZihpLnRhZz09PTE4KXtpZihsPWkucmV0dXJuLGw9PT1udWxsKXRocm93IEVycm9yKFcoMzQxKSk7bC5sYW5lc3w9bixzPWwuYWx0ZXJuYXRlLHMhPT1udWxsJiYocy5sYW5lc3w9biksZGgobCxuLHQpLGw9aS5zaWJsaW5nfWVsc2UgbD1pLmNoaWxkO2lmKGwhPT1udWxsKWwucmV0dXJuPWk7ZWxzZSBmb3IobD1pO2whPT1udWxsOyl7aWYobD09PXQpe2w9bnVsbDticmVha31pZihpPWwuc2libGluZyxpIT09bnVsbCl7aS5yZXR1cm49bC5yZXR1cm4sbD1pO2JyZWFrfWw9bC5yZXR1cm59aT1sfVl0KGUsdCxvLmNoaWxkcmVuLG4pLHQ9dC5jaGlsZH1yZXR1cm4gdDtjYXNlIDk6cmV0dXJuIG89dC50eXBlLHI9dC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sdWwodCxuKSxvPXpuKG8pLHI9cihvKSx0LmZsYWdzfD0xLFl0KGUsdCxyLG4pLHQuY2hpbGQ7Y2FzZSAxNDpyZXR1cm4gcj10LnR5cGUsbz1HbihyLHQucGVuZGluZ1Byb3BzKSxvPUduKHIudHlwZSxvKSxMdihlLHQscixvLG4pO2Nhc2UgMTU6cmV0dXJuIEF4KGUsdCx0LnR5cGUsdC5wZW5kaW5nUHJvcHMsbik7Y2FzZSAxNzpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286R24ocixvKSxPdShlLHQpLHQudGFnPTEsZG4ocik/KGU9ITAsZWModCkpOmU9ITEsdWwodCxuKSxheCh0LHIsbyksaGgodCxyLG8sbiksbWgobnVsbCx0LHIsITAsZSxuKTtjYXNlIDE5OnJldHVybiBqeChlLHQsbik7Y2FzZSAyMjpyZXR1cm4gTXgoZSx0LG4pfXRocm93IEVycm9yKFcoMTU2LHQudGFnKSl9O2Z1bmN0aW9uIGVfKGUsdCl7cmV0dXJuIGsxKGUsdCl9ZnVuY3Rpb24gamsoZSx0LG4scil7dGhpcy50YWc9ZSx0aGlzLmtleT1uLHRoaXMuc2libGluZz10aGlzLmNoaWxkPXRoaXMucmV0dXJuPXRoaXMuc3RhdGVOb2RlPXRoaXMudHlwZT10aGlzLmVsZW1lbnRUeXBlPW51bGwsdGhpcy5pbmRleD0wLHRoaXMucmVmPW51bGwsdGhpcy5wZW5kaW5nUHJvcHM9dCx0aGlzLmRlcGVuZGVuY2llcz10aGlzLm1lbW9pemVkU3RhdGU9dGhpcy51cGRhdGVRdWV1ZT10aGlzLm1lbW9pemVkUHJvcHM9bnVsbCx0aGlzLm1vZGU9cix0aGlzLnN1YnRyZWVGbGFncz10aGlzLmZsYWdzPTAsdGhpcy5kZWxldGlvbnM9bnVsbCx0aGlzLmNoaWxkTGFuZXM9dGhpcy5sYW5lcz0wLHRoaXMuYWx0ZXJuYXRlPW51bGx9ZnVuY3Rpb24gTG4oZSx0LG4scil7cmV0dXJuIG5ldyBqayhlLHQsbixyKX1mdW5jdGlvbiB4ZyhlKXtyZXR1cm4gZT1lLnByb3RvdHlwZSwhKCFlfHwhZS5pc1JlYWN0Q29tcG9uZW50KX1mdW5jdGlvbiB6ayhlKXtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIilyZXR1cm4geGcoZSk/MTowO2lmKGUhPW51bGwpe2lmKGU9ZS4kJHR5cGVvZixlPT09anApcmV0dXJuIDExO2lmKGU9PT16cClyZXR1cm4gMTR9cmV0dXJuIDJ9ZnVuY3Rpb24gRW8oZSx0KXt2YXIgbj1lLmFsdGVybmF0ZTtyZXR1cm4gbj09PW51bGw/KG49TG4oZS50YWcsdCxlLmtleSxlLm1vZGUpLG4uZWxlbWVudFR5cGU9ZS5lbGVtZW50VHlwZSxuLnR5cGU9ZS50eXBlLG4uc3RhdGVOb2RlPWUuc3RhdGVOb2RlLG4uYWx0ZXJuYXRlPWUsZS5hbHRlcm5hdGU9bik6KG4ucGVuZGluZ1Byb3BzPXQsbi50eXBlPWUudHlwZSxuLmZsYWdzPTAsbi5zdWJ0cmVlRmxhZ3M9MCxuLmRlbGV0aW9ucz1udWxsKSxuLmZsYWdzPWUuZmxhZ3MmMTQ2ODAwNjQsbi5jaGlsZExhbmVzPWUuY2hpbGRMYW5lcyxuLmxhbmVzPWUubGFuZXMsbi5jaGlsZD1lLmNoaWxkLG4ubWVtb2l6ZWRQcm9wcz1lLm1lbW9pemVkUHJvcHMsbi5tZW1vaXplZFN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxuLnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdD1lLmRlcGVuZGVuY2llcyxuLmRlcGVuZGVuY2llcz10PT09bnVsbD9udWxsOntsYW5lczp0LmxhbmVzLGZpcnN0Q29udGV4dDp0LmZpcnN0Q29udGV4dH0sbi5zaWJsaW5nPWUuc2libGluZyxuLmluZGV4PWUuaW5kZXgsbi5yZWY9ZS5yZWYsbn1mdW5jdGlvbiBEdShlLHQsbixyLG8saSl7dmFyIGw9MjtpZihyPWUsdHlwZW9mIGU9PSJmdW5jdGlvbiIpeGcoZSkmJihsPTEpO2Vsc2UgaWYodHlwZW9mIGU9PSJzdHJpbmciKWw9NTtlbHNlIGU6c3dpdGNoKGUpe2Nhc2UgVmk6cmV0dXJuIG5pKG4uY2hpbGRyZW4sbyxpLHQpO2Nhc2UgSXA6bD04LG98PTg7YnJlYWs7Y2FzZSBJZjpyZXR1cm4gZT1MbigxMixuLHQsb3wyKSxlLmVsZW1lbnRUeXBlPUlmLGUubGFuZXM9aSxlO2Nhc2UgamY6cmV0dXJuIGU9TG4oMTMsbix0LG8pLGUuZWxlbWVudFR5cGU9amYsZS5sYW5lcz1pLGU7Y2FzZSB6ZjpyZXR1cm4gZT1MbigxOSxuLHQsbyksZS5lbGVtZW50VHlwZT16ZixlLmxhbmVzPWksZTtjYXNlIHUxOnJldHVybiBxYyhuLG8saSx0KTtkZWZhdWx0OmlmKHR5cGVvZiBlPT0ib2JqZWN0IiYmZSE9PW51bGwpc3dpdGNoKGUuJCR0eXBlb2Ype2Nhc2UgczE6bD0xMDticmVhayBlO2Nhc2UgYTE6bD05O2JyZWFrIGU7Y2FzZSBqcDpsPTExO2JyZWFrIGU7Y2FzZSB6cDpsPTE0O2JyZWFrIGU7Y2FzZSBsbzpsPTE2LHI9bnVsbDticmVhayBlfXRocm93IEVycm9yKFcoMTMwLGU9PW51bGw/ZTp0eXBlb2YgZSwiIikpfXJldHVybiB0PUxuKGwsbix0LG8pLHQuZWxlbWVudFR5cGU9ZSx0LnR5cGU9cix0LmxhbmVzPWksdH1mdW5jdGlvbiBuaShlLHQsbixyKXtyZXR1cm4gZT1Mbig3LGUscix0KSxlLmxhbmVzPW4sZX1mdW5jdGlvbiBxYyhlLHQsbixyKXtyZXR1cm4gZT1MbigyMixlLHIsdCksZS5lbGVtZW50VHlwZT11MSxlLmxhbmVzPW4sZS5zdGF0ZU5vZGU9e2lzSGlkZGVuOiExfSxlfWZ1bmN0aW9uIGRmKGUsdCxuKXtyZXR1cm4gZT1Mbig2LGUsbnVsbCx0KSxlLmxhbmVzPW4sZX1mdW5jdGlvbiBmZihlLHQsbil7cmV0dXJuIHQ9TG4oNCxlLmNoaWxkcmVuIT09bnVsbD9lLmNoaWxkcmVuOltdLGUua2V5LHQpLHQubGFuZXM9bix0LnN0YXRlTm9kZT17Y29udGFpbmVySW5mbzplLmNvbnRhaW5lckluZm8scGVuZGluZ0NoaWxkcmVuOm51bGwsaW1wbGVtZW50YXRpb246ZS5pbXBsZW1lbnRhdGlvbn0sdH1mdW5jdGlvbiBGayhlLHQsbixyLG8pe3RoaXMudGFnPXQsdGhpcy5jb250YWluZXJJbmZvPWUsdGhpcy5maW5pc2hlZFdvcms9dGhpcy5waW5nQ2FjaGU9dGhpcy5jdXJyZW50PXRoaXMucGVuZGluZ0NoaWxkcmVuPW51bGwsdGhpcy50aW1lb3V0SGFuZGxlPS0xLHRoaXMuY2FsbGJhY2tOb2RlPXRoaXMucGVuZGluZ0NvbnRleHQ9dGhpcy5jb250ZXh0PW51bGwsdGhpcy5jYWxsYmFja1ByaW9yaXR5PTAsdGhpcy5ldmVudFRpbWVzPUhkKDApLHRoaXMuZXhwaXJhdGlvblRpbWVzPUhkKC0xKSx0aGlzLmVudGFuZ2xlZExhbmVzPXRoaXMuZmluaXNoZWRMYW5lcz10aGlzLm11dGFibGVSZWFkTGFuZXM9dGhpcy5leHBpcmVkTGFuZXM9dGhpcy5waW5nZWRMYW5lcz10aGlzLnN1c3BlbmRlZExhbmVzPXRoaXMucGVuZGluZ0xhbmVzPTAsdGhpcy5lbnRhbmdsZW1lbnRzPUhkKDApLHRoaXMuaWRlbnRpZmllclByZWZpeD1yLHRoaXMub25SZWNvdmVyYWJsZUVycm9yPW8sdGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPW51bGx9ZnVuY3Rpb24gX2coZSx0LG4scixvLGksbCxzLGEpe3JldHVybiBlPW5ldyBGayhlLHQsbixzLGEpLHQ9PT0xPyh0PTEsaT09PSEwJiYodHw9OCkpOnQ9MCxpPUxuKDMsbnVsbCxudWxsLHQpLGUuY3VycmVudD1pLGkuc3RhdGVOb2RlPWUsaS5tZW1vaXplZFN0YXRlPXtlbGVtZW50OnIsaXNEZWh5ZHJhdGVkOm4sY2FjaGU6bnVsbCx0cmFuc2l0aW9uczpudWxsLHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6bnVsbH0scmcoaSksZX1mdW5jdGlvbiBCayhlLHQsbil7dmFyIHI9Mzxhcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7cmV0dXJueyQkdHlwZW9mOlVpLGtleTpyPT1udWxsP251bGw6IiIrcixjaGlsZHJlbjplLGNvbnRhaW5lckluZm86dCxpbXBsZW1lbnRhdGlvbjpufX1mdW5jdGlvbiB0XyhlKXtpZighZSlyZXR1cm4gTm87ZT1lLl9yZWFjdEludGVybmFscztlOntpZihfaShlKSE9PWV8fGUudGFnIT09MSl0aHJvdyBFcnJvcihXKDE3MCkpO3ZhciB0PWU7ZG97c3dpdGNoKHQudGFnKXtjYXNlIDM6dD10LnN0YXRlTm9kZS5jb250ZXh0O2JyZWFrIGU7Y2FzZSAxOmlmKGRuKHQudHlwZSkpe3Q9dC5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7YnJlYWsgZX19dD10LnJldHVybn13aGlsZSh0IT09bnVsbCk7dGhyb3cgRXJyb3IoVygxNzEpKX1pZihlLnRhZz09PTEpe3ZhciBuPWUudHlwZTtpZihkbihuKSlyZXR1cm4gZXgoZSxuLHQpfXJldHVybiB0fWZ1bmN0aW9uIG5fKGUsdCxuLHIsbyxpLGwscyxhKXtyZXR1cm4gZT1fZyhuLHIsITAsZSxvLGksbCxzLGEpLGUuY29udGV4dD10XyhudWxsKSxuPWUuY3VycmVudCxyPW5uKCksbz1DbyhuKSxpPUxyKHIsbyksaS5jYWxsYmFjaz10Pz9udWxsLHdvKG4saSxvKSxlLmN1cnJlbnQubGFuZXM9byxUYShlLG8sciksZm4oZSxyKSxlfWZ1bmN0aW9uIGVkKGUsdCxuLHIpe3ZhciBvPXQuY3VycmVudCxpPW5uKCksbD1DbyhvKTtyZXR1cm4gbj10XyhuKSx0LmNvbnRleHQ9PT1udWxsP3QuY29udGV4dD1uOnQucGVuZGluZ0NvbnRleHQ9bix0PUxyKGksbCksdC5wYXlsb2FkPXtlbGVtZW50OmV9LHI9cj09PXZvaWQgMD9udWxsOnIsciE9PW51bGwmJih0LmNhbGxiYWNrPXIpLGU9d28obyx0LGwpLGUhPT1udWxsJiYoZXIoZSxvLGwsaSksYnUoZSxvLGwpKSxsfWZ1bmN0aW9uIGhjKGUpe2lmKGU9ZS5jdXJyZW50LCFlLmNoaWxkKXJldHVybiBudWxsO3N3aXRjaChlLmNoaWxkLnRhZyl7Y2FzZSA1OnJldHVybiBlLmNoaWxkLnN0YXRlTm9kZTtkZWZhdWx0OnJldHVybiBlLmNoaWxkLnN0YXRlTm9kZX19ZnVuY3Rpb24gWXYoZSx0KXtpZihlPWUubWVtb2l6ZWRTdGF0ZSxlIT09bnVsbCYmZS5kZWh5ZHJhdGVkIT09bnVsbCl7dmFyIG49ZS5yZXRyeUxhbmU7ZS5yZXRyeUxhbmU9biE9PTAmJm48dD9uOnR9fWZ1bmN0aW9uIHdnKGUsdCl7WXYoZSx0KSwoZT1lLmFsdGVybmF0ZSkmJll2KGUsdCl9ZnVuY3Rpb24gV2soKXtyZXR1cm4gbnVsbH12YXIgcl89dHlwZW9mIHJlcG9ydEVycm9yPT0iZnVuY3Rpb24iP3JlcG9ydEVycm9yOmZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoZSl9O2Z1bmN0aW9uIFNnKGUpe3RoaXMuX2ludGVybmFsUm9vdD1lfXRkLnByb3RvdHlwZS5yZW5kZXI9U2cucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9pbnRlcm5hbFJvb3Q7aWYodD09PW51bGwpdGhyb3cgRXJyb3IoVyg0MDkpKTtlZChlLHQsbnVsbCxudWxsKX07dGQucHJvdG90eXBlLnVubW91bnQ9U2cucHJvdG90eXBlLnVubW91bnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9pbnRlcm5hbFJvb3Q7aWYoZSE9PW51bGwpe3RoaXMuX2ludGVybmFsUm9vdD1udWxsO3ZhciB0PWUuY29udGFpbmVySW5mbztkaShmdW5jdGlvbigpe2VkKG51bGwsZSxudWxsLG51bGwpfSksdFtqcl09bnVsbH19O2Z1bmN0aW9uIHRkKGUpe3RoaXMuX2ludGVybmFsUm9vdD1lfXRkLnByb3RvdHlwZS51bnN0YWJsZV9zY2hlZHVsZUh5ZHJhdGlvbj1mdW5jdGlvbihlKXtpZihlKXt2YXIgdD1BMSgpO2U9e2Jsb2NrZWRPbjpudWxsLHRhcmdldDplLHByaW9yaXR5OnR9O2Zvcih2YXIgbj0wO248dW8ubGVuZ3RoJiZ0IT09MCYmdDx1b1tuXS5wcmlvcml0eTtuKyspO3VvLnNwbGljZShuLDAsZSksbj09PTAmJkQxKGUpfX07ZnVuY3Rpb24gQ2coZSl7cmV0dXJuISghZXx8ZS5ub2RlVHlwZSE9PTEmJmUubm9kZVR5cGUhPT05JiZlLm5vZGVUeXBlIT09MTEpfWZ1bmN0aW9uIG5kKGUpe3JldHVybiEoIWV8fGUubm9kZVR5cGUhPT0xJiZlLm5vZGVUeXBlIT09OSYmZS5ub2RlVHlwZSE9PTExJiYoZS5ub2RlVHlwZSE9PTh8fGUubm9kZVZhbHVlIT09IiByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAiKSl9ZnVuY3Rpb24gWHYoKXt9ZnVuY3Rpb24gVWsoZSx0LG4scixvKXtpZihvKXtpZih0eXBlb2Ygcj09ImZ1bmN0aW9uIil7dmFyIGk9cjtyPWZ1bmN0aW9uKCl7dmFyIHU9aGMobCk7aS5jYWxsKHUpfX12YXIgbD1uXyh0LHIsZSwwLG51bGwsITEsITEsIiIsWHYpO3JldHVybiBlLl9yZWFjdFJvb3RDb250YWluZXI9bCxlW2pyXT1sLmN1cnJlbnQsdGEoZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlOmUpLGRpKCksbH1mb3IoO289ZS5sYXN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQobyk7aWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpe3ZhciBzPXI7cj1mdW5jdGlvbigpe3ZhciB1PWhjKGEpO3MuY2FsbCh1KX19dmFyIGE9X2coZSwwLCExLG51bGwsbnVsbCwhMSwhMSwiIixYdik7cmV0dXJuIGUuX3JlYWN0Um9vdENvbnRhaW5lcj1hLGVbanJdPWEuY3VycmVudCx0YShlLm5vZGVUeXBlPT09OD9lLnBhcmVudE5vZGU6ZSksZGkoZnVuY3Rpb24oKXtlZCh0LGEsbixyKX0pLGF9ZnVuY3Rpb24gcmQoZSx0LG4scixvKXt2YXIgaT1uLl9yZWFjdFJvb3RDb250YWluZXI7aWYoaSl7dmFyIGw9aTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIil7dmFyIHM9bztvPWZ1bmN0aW9uKCl7dmFyIGE9aGMobCk7cy5jYWxsKGEpfX1lZCh0LGwsZSxvKX1lbHNlIGw9VWsobix0LGUsbyxyKTtyZXR1cm4gaGMobCl9UDE9ZnVuY3Rpb24oZSl7c3dpdGNoKGUudGFnKXtjYXNlIDM6dmFyIHQ9ZS5zdGF0ZU5vZGU7aWYodC5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXt2YXIgbj15cyh0LnBlbmRpbmdMYW5lcyk7biE9PTAmJihXcCh0LG58MSksZm4odCx1dCgpKSwhKEVlJjYpJiYoQ2w9dXQoKSs1MDAsem8oKSkpfWJyZWFrO2Nhc2UgMTM6ZGkoZnVuY3Rpb24oKXt2YXIgcj16cihlLDEpO2lmKHIhPT1udWxsKXt2YXIgbz1ubigpO2VyKHIsZSwxLG8pfX0pLHdnKGUsMSl9fTtVcD1mdW5jdGlvbihlKXtpZihlLnRhZz09PTEzKXt2YXIgdD16cihlLDEzNDIxNzcyOCk7aWYodCE9PW51bGwpe3ZhciBuPW5uKCk7ZXIodCxlLDEzNDIxNzcyOCxuKX13ZyhlLDEzNDIxNzcyOCl9fTtPMT1mdW5jdGlvbihlKXtpZihlLnRhZz09PTEzKXt2YXIgdD1DbyhlKSxuPXpyKGUsdCk7aWYobiE9PW51bGwpe3ZhciByPW5uKCk7ZXIobixlLHQscil9d2coZSx0KX19O0ExPWZ1bmN0aW9uKCl7cmV0dXJuIFBlfTtNMT1mdW5jdGlvbihlLHQpe3ZhciBuPVBlO3RyeXtyZXR1cm4gUGU9ZSx0KCl9ZmluYWxseXtQZT1ufX07WGY9ZnVuY3Rpb24oZSx0LG4pe3N3aXRjaCh0KXtjYXNlImlucHV0IjppZihXZihlLG4pLHQ9bi5uYW1lLG4udHlwZT09PSJyYWRpbyImJnQhPW51bGwpe2ZvcihuPWU7bi5wYXJlbnROb2RlOyluPW4ucGFyZW50Tm9kZTtmb3Iobj1uLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9IitKU09OLnN0cmluZ2lmeSgiIit0KSsnXVt0eXBlPSJyYWRpbyJdJyksdD0wO3Q8bi5sZW5ndGg7dCsrKXt2YXIgcj1uW3RdO2lmKHIhPT1lJiZyLmZvcm09PT1lLmZvcm0pe3ZhciBvPUdjKHIpO2lmKCFvKXRocm93IEVycm9yKFcoOTApKTtkMShyKSxXZihyLG8pfX19YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6aDEoZSxuKTticmVhaztjYXNlInNlbGVjdCI6dD1uLnZhbHVlLHQhPW51bGwmJmlsKGUsISFuLm11bHRpcGxlLHQsITEpfX07XzE9bWc7dzE9ZGk7dmFyIFZrPXt1c2luZ0NsaWVudEVudHJ5UG9pbnQ6ITEsRXZlbnRzOltiYSxZaSxHYyx5MSx4MSxtZ119LGFzPXtmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTpRbyxidW5kbGVUeXBlOjAsdmVyc2lvbjoiMTguMi4wIixyZW5kZXJlclBhY2thZ2VOYW1lOiJyZWFjdC1kb20ifSxIaz17YnVuZGxlVHlwZTphcy5idW5kbGVUeXBlLHZlcnNpb246YXMudmVyc2lvbixyZW5kZXJlclBhY2thZ2VOYW1lOmFzLnJlbmRlcmVyUGFja2FnZU5hbWUscmVuZGVyZXJDb25maWc6YXMucmVuZGVyZXJDb25maWcsb3ZlcnJpZGVIb29rU3RhdGU6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzOm51bGwsb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzUmVuYW1lUGF0aDpudWxsLHNldEVycm9ySGFuZGxlcjpudWxsLHNldFN1c3BlbnNlSGFuZGxlcjpudWxsLHNjaGVkdWxlVXBkYXRlOm51bGwsY3VycmVudERpc3BhdGNoZXJSZWY6VnIuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjpmdW5jdGlvbihlKXtyZXR1cm4gZT1FMShlKSxlPT09bnVsbD9udWxsOmUuc3RhdGVOb2RlfSxmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTphcy5maW5kRmliZXJCeUhvc3RJbnN0YW5jZXx8V2ssZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoOm51bGwsc2NoZWR1bGVSZWZyZXNoOm51bGwsc2NoZWR1bGVSb290Om51bGwsc2V0UmVmcmVzaEhhbmRsZXI6bnVsbCxnZXRDdXJyZW50RmliZXI6bnVsbCxyZWNvbmNpbGVyVmVyc2lvbjoiMTguMi4wLW5leHQtOWUzYjc3MmI4LTIwMjIwNjA4In07aWYodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXzwidSIpe3ZhciBhdT1fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187aWYoIWF1LmlzRGlzYWJsZWQmJmF1LnN1cHBvcnRzRmliZXIpdHJ5e1VjPWF1LmluamVjdChIaykscHI9YXV9Y2F0Y2h7fX1Ubi5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRD1WaztUbi5jcmVhdGVQb3J0YWw9ZnVuY3Rpb24oZSx0KXt2YXIgbj0yPGFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbDtpZighQ2codCkpdGhyb3cgRXJyb3IoVygyMDApKTtyZXR1cm4gQmsoZSx0LG51bGwsbil9O1RuLmNyZWF0ZVJvb3Q9ZnVuY3Rpb24oZSx0KXtpZighQ2coZSkpdGhyb3cgRXJyb3IoVygyOTkpKTt2YXIgbj0hMSxyPSIiLG89cl87cmV0dXJuIHQhPW51bGwmJih0LnVuc3RhYmxlX3N0cmljdE1vZGU9PT0hMCYmKG49ITApLHQuaWRlbnRpZmllclByZWZpeCE9PXZvaWQgMCYmKHI9dC5pZGVudGlmaWVyUHJlZml4KSx0Lm9uUmVjb3ZlcmFibGVFcnJvciE9PXZvaWQgMCYmKG89dC5vblJlY292ZXJhYmxlRXJyb3IpKSx0PV9nKGUsMSwhMSxudWxsLG51bGwsbiwhMSxyLG8pLGVbanJdPXQuY3VycmVudCx0YShlLm5vZGVUeXBlPT09OD9lLnBhcmVudE5vZGU6ZSksbmV3IFNnKHQpfTtUbi5maW5kRE9NTm9kZT1mdW5jdGlvbihlKXtpZihlPT1udWxsKXJldHVybiBudWxsO2lmKGUubm9kZVR5cGU9PT0xKXJldHVybiBlO3ZhciB0PWUuX3JlYWN0SW50ZXJuYWxzO2lmKHQ9PT12b2lkIDApdGhyb3cgdHlwZW9mIGUucmVuZGVyPT0iZnVuY3Rpb24iP0Vycm9yKFcoMTg4KSk6KGU9T2JqZWN0LmtleXMoZSkuam9pbigiLCIpLEVycm9yKFcoMjY4LGUpKSk7cmV0dXJuIGU9RTEodCksZT1lPT09bnVsbD9udWxsOmUuc3RhdGVOb2RlLGV9O1RuLmZsdXNoU3luYz1mdW5jdGlvbihlKXtyZXR1cm4gZGkoZSl9O1RuLmh5ZHJhdGU9ZnVuY3Rpb24oZSx0LG4pe2lmKCFuZCh0KSl0aHJvdyBFcnJvcihXKDIwMCkpO3JldHVybiByZChudWxsLGUsdCwhMCxuKX07VG4uaHlkcmF0ZVJvb3Q9ZnVuY3Rpb24oZSx0LG4pe2lmKCFDZyhlKSl0aHJvdyBFcnJvcihXKDQwNSkpO3ZhciByPW4hPW51bGwmJm4uaHlkcmF0ZWRTb3VyY2VzfHxudWxsLG89ITEsaT0iIixsPXJfO2lmKG4hPW51bGwmJihuLnVuc3RhYmxlX3N0cmljdE1vZGU9PT0hMCYmKG89ITApLG4uaWRlbnRpZmllclByZWZpeCE9PXZvaWQgMCYmKGk9bi5pZGVudGlmaWVyUHJlZml4KSxuLm9uUmVjb3ZlcmFibGVFcnJvciE9PXZvaWQgMCYmKGw9bi5vblJlY292ZXJhYmxlRXJyb3IpKSx0PW5fKHQsbnVsbCxlLDEsbj8/bnVsbCxvLCExLGksbCksZVtqcl09dC5jdXJyZW50LHRhKGUpLHIpZm9yKGU9MDtlPHIubGVuZ3RoO2UrKyluPXJbZV0sbz1uLl9nZXRWZXJzaW9uLG89byhuLl9zb3VyY2UpLHQubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT09bnVsbD90Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9W24sb106dC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLnB1c2gobixvKTtyZXR1cm4gbmV3IHRkKHQpfTtUbi5yZW5kZXI9ZnVuY3Rpb24oZSx0LG4pe2lmKCFuZCh0KSl0aHJvdyBFcnJvcihXKDIwMCkpO3JldHVybiByZChudWxsLGUsdCwhMSxuKX07VG4udW5tb3VudENvbXBvbmVudEF0Tm9kZT1mdW5jdGlvbihlKXtpZighbmQoZSkpdGhyb3cgRXJyb3IoVyg0MCkpO3JldHVybiBlLl9yZWFjdFJvb3RDb250YWluZXI/KGRpKGZ1bmN0aW9uKCl7cmQobnVsbCxudWxsLGUsITEsZnVuY3Rpb24oKXtlLl9yZWFjdFJvb3RDb250YWluZXI9bnVsbCxlW2pyXT1udWxsfSl9KSwhMCk6ITF9O1RuLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzPW1nO1RuLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFuZChuKSl0aHJvdyBFcnJvcihXKDIwMCkpO2lmKGU9PW51bGx8fGUuX3JlYWN0SW50ZXJuYWxzPT09dm9pZCAwKXRocm93IEVycm9yKFcoMzgpKTtyZXR1cm4gcmQoZSx0LG4sITEscil9O1RuLnZlcnNpb249IjE4LjIuMC1uZXh0LTllM2I3NzJiOC0yMDIyMDYwOCI7ZnVuY3Rpb24gb18oKXtpZighKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18+InUifHx0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFIT0iZnVuY3Rpb24iKSl0cnl7X19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFKG9fKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX1vXygpLG4xLmV4cG9ydHM9VG47dmFyIEhyPW4xLmV4cG9ydHM7Y29uc3QgS2s9JGEoSHIpO3ZhciBRdj1IcjtEZi5jcmVhdGVSb290PVF2LmNyZWF0ZVJvb3QsRGYuaHlkcmF0ZVJvb3Q9UXYuaHlkcmF0ZVJvb3Q7dmFyIGlfPXtleHBvcnRzOnt9fSxvZD17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogcmVhY3QtanN4LXJ1bnRpbWUucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBHaz1wLFlrPVN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKSxYaz1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLFFrPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksSms9R2suX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQuUmVhY3RDdXJyZW50T3duZXIsWms9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfTtmdW5jdGlvbiBsXyhlLHQsbil7dmFyIHIsbz17fSxpPW51bGwsbD1udWxsO24hPT12b2lkIDAmJihpPSIiK24pLHQua2V5IT09dm9pZCAwJiYoaT0iIit0LmtleSksdC5yZWYhPT12b2lkIDAmJihsPXQucmVmKTtmb3IociBpbiB0KVFrLmNhbGwodCxyKSYmIVprLmhhc093blByb3BlcnR5KHIpJiYob1tyXT10W3JdKTtpZihlJiZlLmRlZmF1bHRQcm9wcylmb3IociBpbiB0PWUuZGVmYXVsdFByb3BzLHQpb1tyXT09PXZvaWQgMCYmKG9bcl09dFtyXSk7cmV0dXJueyQkdHlwZW9mOllrLHR5cGU6ZSxrZXk6aSxyZWY6bCxwcm9wczpvLF9vd25lcjpKay5jdXJyZW50fX1vZC5GcmFnbWVudD1YaztvZC5qc3g9bF87b2QuanN4cz1sXztpXy5leHBvcnRzPW9kO3ZhciB4PWlfLmV4cG9ydHM7ZnVuY3Rpb24gTmgoZSx0KXsodD09bnVsbHx8dD5lLmxlbmd0aCkmJih0PWUubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheSh0KTtuPHQ7bisrKXJbbl09ZVtuXTtyZXR1cm4gcn1mdW5jdGlvbiBFZyhlLHQpe2lmKGUpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIilyZXR1cm4gTmgoZSx0KTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwtMSk7aWYobj09PSJPYmplY3QiJiZlLmNvbnN0cnVjdG9yJiYobj1lLmNvbnN0cnVjdG9yLm5hbWUpLG49PT0iTWFwInx8bj09PSJTZXQiKXJldHVybiBBcnJheS5mcm9tKGUpO2lmKG49PT0iQXJndW1lbnRzInx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpcmV0dXJuIE5oKGUsdCl9fWZ1bmN0aW9uICRnKGUsdCl7dmFyIG49dHlwZW9mIFN5bWJvbDwidSImJmVbU3ltYm9sLml0ZXJhdG9yXXx8ZVsiQEBpdGVyYXRvciJdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KGUpfHwobj1FZyhlKSl8fHQmJmUmJnR5cGVvZiBlLmxlbmd0aD09Im51bWJlciIpe24mJihlPW4pO3ZhciByPTAsbz1mdW5jdGlvbigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PWUubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTplW3IrK119fSxlOmZ1bmN0aW9uKGEpe3Rocm93IGF9LGY6b319dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9dmFyIGk9ITAsbD0hMSxzO3JldHVybntzOmZ1bmN0aW9uKCl7bj1uLmNhbGwoZSl9LG46ZnVuY3Rpb24oKXt2YXIgYT1uLm5leHQoKTtyZXR1cm4gaT1hLmRvbmUsYX0sZTpmdW5jdGlvbihhKXtsPSEwLHM9YX0sZjpmdW5jdGlvbigpe3RyeXshaSYmbi5yZXR1cm4hPW51bGwmJm4ucmV0dXJuKCl9ZmluYWxseXtpZihsKXRocm93IHN9fX19ZnVuY3Rpb24gc18oZSl7cmV0dXJuIGUubGVuZ3RoPjB9dmFyIFBhPU9iamVjdC5mcmVlemUoe2tpbmQ6Im9rIix2YWx1ZTp2b2lkIDB9KTtmdW5jdGlvbiBPYShlKXtyZXR1cm4gZT09PXZvaWQgMD9QYTp7a2luZDoib2siLHZhbHVlOmV9fWZ1bmN0aW9uIHdpKGUpe3JldHVybntraW5kOiJlcnIiLGVycm9yOmV9fWZ1bmN0aW9uIExsKGUpe3JldHVybiBlPT09UGF8fGUua2luZD09PSJvayJ9ZnVuY3Rpb24ga2coZSl7cmV0dXJuIGUhPT1QYSYmZS5raW5kPT09ImVyciJ9ZnVuY3Rpb24gYV8oZSl7dmFyIHQ9W10sbj1bXSxyPSRnKGUpLG87dHJ5e2ZvcihyLnMoKTshKG89ci5uKCkpLmRvbmU7KXt2YXIgaT1vLnZhbHVlO0xsKGkpP3QucHVzaChpLnZhbHVlKTpuLnB1c2goaS5lcnJvcil9fWNhdGNoKGwpe3IuZShsKX1maW5hbGx5e3IuZigpfXJldHVybiBzXyhuKT93aShuKTpPYSh0KX1mdW5jdGlvbiBxayhlKXtyZXR1cm4gYV8oZSl9ZnVuY3Rpb24gZVQoZSl7dmFyIHQ9W10sbj0kZyhlKSxyO3RyeXtmb3Iobi5zKCk7IShyPW4ubigpKS5kb25lOyl7dmFyIG89ci52YWx1ZTtrZyhvKSYmdC5wdXNoKG8uZXJyb3IpfX1jYXRjaChpKXtuLmUoaSl9ZmluYWxseXtuLmYoKX1yZXR1cm4gc18odCk/d2kodCk6UGF9ZnVuY3Rpb24gdFQoZSx0KXtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKHZhciByPU9hKHQpLG89MDtvPG4ubGVuZ3RoJiZMbChyKTsrK28pcj1lKHIudmFsdWUsbltvXSxvKTtyZXR1cm4gcn19ZnVuY3Rpb24gblQoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBMbCh0KT9PYShlKHQudmFsdWUpKTp0fX1mdW5jdGlvbiByVChlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIExsKHQpP2UodC52YWx1ZSk6dH19ZnVuY3Rpb24gb1QoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBrZyh0KT93aShlKHQuZXJyb3IpKTp0fX1mdW5jdGlvbiBpVChlLHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gZShuKT9PYShuKTp3aSh0KG4pKX19dmFyIGxUPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBMbChyKT90KHIudmFsdWUpP3I6d2kobihyLnZhbHVlKSk6cn19LGRsPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHZvaWRPazpQYSxvazpPYSxlcnI6d2ksaXNPazpMbCxpc0VycjprZyxhbGxUOmFfLGFsbDpxayxhbGxWOmVULGZsYXRNYXBSZWR1Y2U6dFQsbWFwOm5ULGZsYXRNYXA6clQsbWFwRXJyOm9ULGZyb21QcmVkaWNhdGU6aVQsZmlsdGVyT3JFbHNlOmxUfSk7ZnVuY3Rpb24gc1QoZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXJldHVybiBlO3ZhciBuPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZihuIT09dm9pZCAwKXt2YXIgcj1uLmNhbGwoZSx0fHwiZGVmYXVsdCIpO2lmKHR5cGVvZiByIT0ib2JqZWN0IilyZXR1cm4gcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybih0PT09InN0cmluZyI/U3RyaW5nOk51bWJlcikoZSl9ZnVuY3Rpb24gdV8oZSl7dmFyIHQ9c1QoZSwic3RyaW5nIik7cmV0dXJuIHR5cGVvZiB0PT0ic3ltYm9sIj90OlN0cmluZyh0KX1mdW5jdGlvbiB2dChlLHQsbil7cmV0dXJuIHQ9dV8odCksdCBpbiBlP09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW3RdPW4sZX1mdW5jdGlvbiBKdihlLHQpe3ZhciBuPU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24obyl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxvKS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIEVsKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP0p2KE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXt2dChlLHIsbltyXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpKdihPYmplY3QobikpLmZvckVhY2goZnVuY3Rpb24ocil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4scikpfSl9cmV0dXJuIGV9ZnVuY3Rpb24gYVQoZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gTmgoZSl9ZnVuY3Rpb24gdVQoZSl7aWYodHlwZW9mIFN5bWJvbDwidSImJmVbU3ltYm9sLml0ZXJhdG9yXSE9bnVsbHx8ZVsiQEBpdGVyYXRvciJdIT1udWxsKXJldHVybiBBcnJheS5mcm9tKGUpfWZ1bmN0aW9uIGNUKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBkVChlKXtyZXR1cm4gYVQoZSl8fHVUKGUpfHxFZyhlKXx8Y1QoKX1mdW5jdGlvbiBwZShlKXsiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiO3JldHVybiBwZT10eXBlb2YgU3ltYm9sPT0iZnVuY3Rpb24iJiZ0eXBlb2YgU3ltYm9sLml0ZXJhdG9yPT0ic3ltYm9sIj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0eXBlb2YgU3ltYm9sPT0iZnVuY3Rpb24iJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0scGUoZSl9ZnVuY3Rpb24gZlQoZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZX1mdW5jdGlvbiBoVChlLHQpe3ZhciBuPWU9PW51bGw/bnVsbDp0eXBlb2YgU3ltYm9sPCJ1IiYmZVtTeW1ib2wuaXRlcmF0b3JdfHxlWyJAQGl0ZXJhdG9yIl07aWYobiE9bnVsbCl7dmFyIHIsbyxpLGwscz1bXSxhPSEwLHU9ITE7dHJ5e2lmKGk9KG49bi5jYWxsKGUpKS5uZXh0LHQ9PT0wKXtpZihPYmplY3QobikhPT1uKXJldHVybjthPSExfWVsc2UgZm9yKDshKGE9KHI9aS5jYWxsKG4pKS5kb25lKSYmKHMucHVzaChyLnZhbHVlKSxzLmxlbmd0aCE9PXQpO2E9ITApO31jYXRjaChjKXt1PSEwLG89Y31maW5hbGx5e3RyeXtpZighYSYmbi5yZXR1cm4hPW51bGwmJihsPW4ucmV0dXJuKCksT2JqZWN0KGwpIT09bCkpcmV0dXJufWZpbmFsbHl7aWYodSl0aHJvdyBvfX1yZXR1cm4gc319ZnVuY3Rpb24gcFQoKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9ZnVuY3Rpb24gcmkoZSx0KXtyZXR1cm4gZlQoZSl8fGhUKGUsdCl8fEVnKGUsdCl8fHBUKCl9ZnVuY3Rpb24gX3IoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBadihlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdV8oci5rZXkpLHIpfX1mdW5jdGlvbiB3cihlLHQsbil7cmV0dXJuIHQmJlp2KGUucHJvdG90eXBlLHQpLG4mJlp2KGUsbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksZX1mdW5jdGlvbiBiaChlLHQpe3JldHVybiBiaD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihyLG8pe3JldHVybiByLl9fcHJvdG9fXz1vLHJ9LGJoKGUsdCl9ZnVuY3Rpb24gU2koZSx0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIiYmdCE9PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksdCYmYmgoZSx0KX1mdW5jdGlvbiBwYyhlKXtyZXR1cm4gcGM9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24obil7cmV0dXJuIG4uX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2Yobil9LHBjKGUpfWZ1bmN0aW9uIGdUKCl7aWYodHlwZW9mIFJlZmxlY3Q+InUifHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYodHlwZW9mIFByb3h5PT0iZnVuY3Rpb24iKXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIGNfKGUpe2lmKGU9PT12b2lkIDApdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBtVChlLHQpe2lmKHQmJih0eXBlb2YgdD09Im9iamVjdCJ8fHR5cGVvZiB0PT0iZnVuY3Rpb24iKSlyZXR1cm4gdDtpZih0IT09dm9pZCAwKXRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7cmV0dXJuIGNfKGUpfWZ1bmN0aW9uIENpKGUpe3ZhciB0PWdUKCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9cGMoZSksbztpZih0KXt2YXIgaT1wYyh0aGlzKS5jb25zdHJ1Y3RvcjtvPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbz1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbVQodGhpcyxvKX19dmFyIEVpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe19yKHRoaXMsZSl9cmV0dXJuIHdyKGUsW3trZXk6ImFwcGVuZFZhbGlkYXRpb25FcnJvciIsdmFsdWU6ZnVuY3Rpb24obixyLG8saSl7cmV0dXJuIG4/KG5bcl0/bltyXS5wdXNoKHttZXNzYWdlOm8sdmFsdWU6aX0pOm5bcl09W3ttZXNzYWdlOm8sdmFsdWU6aX1dLG4pOnZ0KHt9LHIsW3ttZXNzYWdlOm8sdmFsdWU6aX1dKX19XSksZX0oKSxMdT1TeW1ib2woIkdldFNjaGVtYSIpLHF0PVN5bWJvbCgiUGF0aCIpLHl0PVN5bWJvbCgiR2V0U291cmNlIik7ZnVuY3Rpb24gdlQoZSl7cmV0dXJuIGVbTHVdfXZhciBUZz13cihmdW5jdGlvbiBlKHQpe19yKHRoaXMsZSksdGhpcy5zcGFuPXR9KSx5VD1mdW5jdGlvbihlKXtTaShuLGUpO3ZhciB0PUNpKG4pO2Z1bmN0aW9uIG4ocixvKXt2YXIgaTtyZXR1cm4gX3IodGhpcyxuKSxpPXQuY2FsbCh0aGlzLG8pLHZ0KGNfKGkpLCJ0eXBlIiwiU3ltIiksaS52YWx1ZT1yLGl9cmV0dXJuIHdyKG4sW3trZXk6InRyYW5zcGlsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZX19XSksbn0oVGcpO25ldyB5VCgiKCkiKTt2YXIgS3Q9Il90eXBlIixobj0iX3JlZiIseFQ9ZnVuY3Rpb24oZSl7U2kobixlKTt2YXIgdD1DaShuKTtmdW5jdGlvbiBuKHIpe3ZhciBvLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO3JldHVybiBfcih0aGlzLG4pLG89dC5jYWxsKHRoaXMpLG8ub3B0aW9ucz1yLG8ub3B0PWksb31yZXR1cm4gd3Iobixbe2tleToidmFsaWRhdGUiLHZhbHVlOmZ1bmN0aW9uKG8saSl7cmV0dXJuIHRoaXMub3B0JiZpPT1udWxsPyExOmk9PW51bGw/dnQoe30sbyxbe21lc3NhZ2U6Ik5vbi1vcHRpb25hbCBpbWFnZSB3YXMgbnVsbCBvciB1bmRlZmluZWQuIix2YWx1ZTppfV0pOnR5cGVvZiBpW2huXSE9InN0cmluZyI/dnQoe30sbyxbe21lc3NhZ2U6IkltYWdlIGRpZCBub3QgaGF2ZSBhIGZpbGUgcmVmZXJlbmNlIHN0cmluZy4gR290OiAiLmNvbmNhdChwZShpW2huXSkpLHZhbHVlOml9XSk6aVtLdF0hPT0iZmlsZSI/dnQoe30sbyxbe21lc3NhZ2U6IkltYWdlIGRpZCBub3QgaGF2ZSB0aGUgdmFsaWQgZmlsZSBleHRlbnNpb24gdHlwZS4gR290OiAiLmNvbmNhdChpW0t0XSksdmFsdWU6aX1dKTppLm1ldGFkYXRhP3Z0KHt9LG8sW3ttZXNzYWdlOiJGb3VuZCBtZXRhZGF0YSwgYnV0IGl0IGNvdWxkIG5vdCBiZSB2YWxpZGF0ZWQuIEltYWdlIG1ldGFkYXRhIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggdGhlIHJlcXVpcmVkIHByb3BzOiB3aWR0aCAocG9zaXRpdmUgbnVtYmVyKSwgaGVpZ2h0IChwb3NpdGl2ZSBudW1iZXIpIGFuZCBzaGEyNTYgKHN0cmluZyBvZiBsZW5ndGggNjQgb2YgdGhlIGJhc2UxNiBoYXNoKS4iLHZhbHVlOmksZml4ZXM6WyJpbWFnZTpyZXBsYWNlLW1ldGFkYXRhIl19XSk6dnQoe30sbyxbe21lc3NhZ2U6IkNvdWxkIG5vdCB2YWxpZGF0ZSBJbWFnZSBtZXRhZGF0YS4iLHZhbHVlOmksZml4ZXM6WyJpbWFnZTphZGQtbWV0YWRhdGEiXX1dKX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24obyl7cmV0dXJuIHRoaXMub3B0JiZvPT1udWxsPyEwOihvPT1udWxsP3ZvaWQgMDpvW2huXSk9PT0iaW1hZ2UiJiYobz09bnVsbD92b2lkIDA6b1tLdF0pPT09ImZpbGUifX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMub3B0aW9ucywhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6ImltYWdlIixvcHRpb25zOnRoaXMub3B0aW9ucyxvcHQ6dGhpcy5vcHR9fX1dKSxufShFaSksZF89ZnVuY3Rpb24odCl7dmFyIG47aWYoIXRbaG5dLnN0YXJ0c1dpdGgoIi9wdWJsaWMiKSl7dmFyIHI7cmV0dXJue3VybDp0W2huXSsiP3NoYTI1Nj0iLmNvbmNhdCgocj10Lm1ldGFkYXRhKT09PW51bGx8fHI9PT12b2lkIDA/dm9pZCAwOnIuc2hhMjU2KSxtZXRhZGF0YTp0Lm1ldGFkYXRhfX1yZXR1cm57dXJsOnRbaG5dLnNsaWNlKDcpKyI/c2hhMjU2PSIuY29uY2F0KChuPXQubWV0YWRhdGEpPT09bnVsbHx8bj09PXZvaWQgMD92b2lkIDA6bi5zaGEyNTYpLG1ldGFkYXRhOnQubWV0YWRhdGF9fTtmdW5jdGlvbiBmXyhlKXtyZXR1cm4gcGUoZSk9PT0ib2JqZWN0IiYmZSE9PW51bGwmJmUhPT12b2lkIDAmJigidmFsImluIGV8fCJ2YWxQYXRoImluIGUpfWZ1bmN0aW9uIF9UKGUpe3JldHVybiBwZShlKT09PSJvYmplY3QiJiZlIT09bnVsbCYmZSE9PXZvaWQgMCYmcXQgaW4gZSYmInZhbCJpbiBlfWZ1bmN0aW9uIHdUKGUpe3JldHVybiBlW3F0XX1mdW5jdGlvbiBTVChlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX1mdW5jdGlvbiBxdihlLHQsbil7cmV0dXJuIHQ/U3QoZShTdCh0LG4pKSk6U3QodCxuKX1mdW5jdGlvbiAkbyhlKXtyZXR1cm4gcGUoZSk9PT0ib2JqZWN0IiYmZSE9PW51bGwmJih5dCBpbiBlfHxxdCBpbiBlKX1mdW5jdGlvbiBTdChlLHQsbil7dmFyIHI7aWYocGUoZSk9PT0ib2JqZWN0Iil7aWYoJG8oZSkpcmV0dXJuIGU7aWYoZl8oZSkpcmV0dXJuIFN0KGUudmFsLGUudmFsUGF0aCl9aWYoZSYmZVtobl0mJmVbS3RdPT09ImZpbGUiKXt2YXIgbz1lW2huXTtpZih0eXBlb2YgbyE9InN0cmluZyIpdGhyb3cgRXJyb3IoIkludmFsaWQgZmlsZSByZWY6ICIrbyk7cmV0dXJuIFN0KGRfKGUpLHQsbil9c3dpdGNoKHBlKGUpKXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6dGhyb3cgRXJyb3IoIkludmFsaWQgc2VsZWN0b3IgdHlwZTogIi5jb25jYXQocGUoZSksIjogIikuY29uY2F0KGUpKTtjYXNlIm9iamVjdCI6aWYoZSE9PW51bGwpcmV0dXJuIG5ldyBQcm94eShlLHtoYXM6ZnVuY3Rpb24obCxzKXtyZXR1cm4gcz09PXl0fHxzPT09cXR8fHM9PT0iYW5kVGhlbiJ8fHM9PT1MdT8hMDpzIGluIGx9LGdldDpmdW5jdGlvbihsLHMpe2lmKHM9PT15dClyZXR1cm4gZTtpZihzPT09cXQpcmV0dXJuIHQ7aWYocz09PUx1KXJldHVybiBuO2lmKHM9PT0iYW5kVGhlbiIpcmV0dXJuIGZ1bmN0aW9uKHUpe3JldHVybiBxdih1LGUsdCl9O2lmKEFycmF5LmlzQXJyYXkobCkpe2lmKHM9PT0iZmlsdGVyIilyZXR1cm4gZnVuY3Rpb24odSl7dmFyIGM9bC5tYXAoZnVuY3Rpb24oZCxmKXtyZXR1cm4gU3QoZCxKbih0LGYpLG49PW51bGw/dm9pZCAwOm4uaXRlbSl9KS5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIHUmJnUgaW5zdGFuY2VvZiBFaT91LmFzc2VydChleShkKSk6ZXkodShkKSl9KTtyZXR1cm4gU3QoYyx0LG4pfTtpZihzPT09Im1hcCIpcmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciBjPWwubWFwKGZ1bmN0aW9uKGQsZil7dmFyIGg9dShTdChkLEpuKHQsZiksbj09bnVsbD92b2lkIDA6bi5pdGVtKSxTdChmKSk7cmV0dXJuICRvKGgpP2g6U3QoaCl9KTtyZXR1cm4gU3QoYyx0LG4pfX1pZihBcnJheS5pc0FycmF5KGwpJiZzPT09Imxlbmd0aCIpcmV0dXJuIFN0KGwubGVuZ3RoKTt2YXIgYT1SZWZsZWN0LmdldChsLHMpO3JldHVybiBTVChlLHMpP051bWJlci5pc05hTihOdW1iZXIocykpP1N0KGEsSm4odCxzKSxuPT1udWxsP3ZvaWQgMDpuLml0ZW1zW3NdKTpTdChhLEpuKHQsTnVtYmVyKHMpKSxuPT1udWxsP3ZvaWQgMDpuLml0ZW0pOmF9fSk7ZGVmYXVsdDpyZXR1cm4gcj17ZXE6ZnVuY3Rpb24obCl7dmFyIHM9bDtpZigkbyhsKSYmKHM9bFt5dF0scyBpbnN0YW5jZW9mIFRnKSl0aHJvdyBFcnJvcigiVE9ETzogQ2Fubm90IGV2YWx1YXRlIGVxdWFsaXR5IHdpdGggYW4gRXhwciIpO3JldHVybiBTdChlPT09cyx2b2lkIDApfSxhbmRUaGVuOmZ1bmN0aW9uKGwpe3JldHVybiBxdihsLGU9PT12b2lkIDA/bnVsbDplLHQpfX0sdnQocix5dCxlPT09dm9pZCAwP251bGw6ZSksdnQocixxdCx0KSx2dChyLEx1LG4pLHJ9fWZ1bmN0aW9uIEpuKGUsdCl7aWYocGUodCk9PT0ic3ltYm9sIil0aHJvdyBFcnJvcigiQ2Fubm90IGNyZWF0ZSB2YWwgcGF0aCBvZiBhcnJheSBpdGVtIHdpdGggc3ltYm9sIHByb3A6ICIuY29uY2F0KHQudG9TdHJpbmcoKSkpO3JldHVybiBlJiYiIi5jb25jYXQoZSwiLiIpLmNvbmNhdChKU09OLnN0cmluZ2lmeSh0KSl9ZnVuY3Rpb24gZXkoZSl7aWYocGUoZSk9PT0ib2JqZWN0IiYmKHl0IGluIGV8fHF0IGluIGUpKXt2YXIgdD1lW3l0XTtyZXR1cm4gdH1yZXR1cm4gZX12YXIgQ1Q9ZnVuY3Rpb24oZSl7U2kobixlKTt2YXIgdD1DaShuKTtmdW5jdGlvbiBuKHIpe3ZhciBvLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO3JldHVybiBfcih0aGlzLG4pLG89dC5jYWxsKHRoaXMpLG8uaXRlbXM9cixvLm9wdD1pLG99cmV0dXJuIHdyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihvLGkpe3ZhciBsPXRoaXMscz0hMTtyZXR1cm4gdGhpcy5vcHQmJmk9PW51bGw/ITE6cGUoaSkhPT0ib2JqZWN0Ij92dCh7fSxvLFt7bWVzc2FnZToiRXhwZWN0ZWQgJ29iamVjdCcsIGdvdCAnIi5jb25jYXQocGUoaSksIiciKX1dKTpBcnJheS5pc0FycmF5KGkpP3Z0KHt9LG8sW3ttZXNzYWdlOiJFeHBlY3RlZCAnb2JqZWN0JywgZ290ICdhcnJheScifV0pOihPYmplY3QuZW50cmllcyh0aGlzLml0ZW1zKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciB1PXJpKGEsMiksYz11WzBdLGQ9dVsxXSxmPUpuKG8sYyk7aWYoIWYpcz1sLmFwcGVuZFZhbGlkYXRpb25FcnJvcihzLG8sIkludGVybmFsIGVycm9yOiBjb3VsZCBub3QgY3JlYXRlIHBhdGggYXQgIi5jb25jYXQoIW8mJnR5cGVvZiBvPT0ic3RyaW5nIj8iPGVtcHR5IHN0cmluZz4iOm8sIiBhdCBrZXkgIikuY29uY2F0KGMpLGkpO2Vsc2V7dmFyIGg9ZC52YWxpZGF0ZShmLGlbY10pO2gmJnM/cz1FbChFbCh7fSxoKSxzKTpoJiYocz1oKX19KSxzKX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24obyl7aWYodGhpcy5vcHQmJm89PW51bGwpcmV0dXJuITA7aWYoIW8pcmV0dXJuITE7Zm9yKHZhciBpPTAsbD1PYmplY3QuZW50cmllcyh0aGlzLml0ZW1zKTtpPGwubGVuZ3RoO2krKyl7dmFyIHM9cmkobFtpXSwyKSxhPXNbMF0sdT1zWzFdO2lmKCF1LmFzc2VydChvW2FdKSlyZXR1cm4hMX1yZXR1cm4gcGUobyk9PT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkobyl9fSx7a2V5OiJvcHRpb25hbCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy5pdGVtcywhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6Im9iamVjdCIsaXRlbXM6T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHRoaXMuaXRlbXMpLm1hcChmdW5jdGlvbihvKXt2YXIgaT1yaShvLDIpLGw9aVswXSxzPWlbMV07cmV0dXJuW2wscy5zZXJpYWxpemUoKV19KSksb3B0OnRoaXMub3B0fX19XSksbn0oRWkpLEVUPWZ1bmN0aW9uKGUpe1NpKG4sZSk7dmFyIHQ9Q2kobik7ZnVuY3Rpb24gbihyKXt2YXIgbyxpPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gX3IodGhpcyxuKSxvPXQuY2FsbCh0aGlzKSxvLml0ZW09cixvLm9wdD1pLG99cmV0dXJuIHdyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihvLGkpe3ZhciBsPXRoaXMscz0hMTtyZXR1cm4gdGhpcy5vcHQmJmk9PW51bGw/ITE6cGUoaSkhPT0ib2JqZWN0Inx8IUFycmF5LmlzQXJyYXkoaSk/dnQoe30sbyxbe21lc3NhZ2U6IkV4cGVjdGVkICdhcnJheScsIGdvdCAnIi5jb25jYXQocGUoaSksIiciKX1dKTooaS5mb3JFYWNoKGZ1bmN0aW9uKGEsdSl7dmFyIGM9Sm4obyx1KTtpZighYylzPWwuYXBwZW5kVmFsaWRhdGlvbkVycm9yKHMsbywiSW50ZXJuYWwgZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgcGF0aCBhdCAiLmNvbmNhdCghbyYmdHlwZW9mIG89PSJzdHJpbmciPyI8ZW1wdHkgc3RyaW5nPiI6bywiIGF0IGluZGV4ICIpLmNvbmNhdCh1KSxpKTtlbHNle3ZhciBkPWwuaXRlbS52YWxpZGF0ZShjLGEpO2QmJnM/cz1FbChFbCh7fSxkKSxzKTpkJiYocz1kKX19KSxzKX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24obyl7aWYodGhpcy5vcHQmJm89PW51bGwpcmV0dXJuITA7aWYoIW8pcmV0dXJuITE7dmFyIGk9JGcobyksbDt0cnl7Zm9yKGkucygpOyEobD1pLm4oKSkuZG9uZTspe3ZhciBzPWwudmFsdWU7aWYoIXRoaXMuaXRlbS5hc3NlcnQocykpcmV0dXJuITF9fWNhdGNoKGEpe2kuZShhKX1maW5hbGx5e2kuZigpfXJldHVybiBwZShvKT09PSJvYmplY3QiJiZBcnJheS5pc0FycmF5KG8pfX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMuaXRlbSwhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6ImFycmF5IixpdGVtOnRoaXMuaXRlbS5zZXJpYWxpemUoKSxvcHQ6dGhpcy5vcHR9fX1dKSxufShFaSksJFQ9ZnVuY3Rpb24oZSl7U2kobixlKTt2YXIgdD1DaShuKTtmdW5jdGlvbiBuKHIsbyl7dmFyIGksbD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITE7cmV0dXJuIF9yKHRoaXMsbiksaT10LmNhbGwodGhpcyksaS5rZXk9cixpLml0ZW1zPW8saS5vcHQ9bCxpfXJldHVybiB3cihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24obyxpKXt0aHJvdyBuZXcgRXJyb3IoIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuIil9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKG8pe3Rocm93IG5ldyBFcnJvcigiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4iKX19LHtrZXk6Im9wdGlvbmFsIix2YWx1ZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4iKX19LHtrZXk6InNlcmlhbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToidW5pb24iLGtleTp0aGlzLmtleSxpdGVtczp0aGlzLml0ZW1zLm1hcChmdW5jdGlvbihvKXtyZXR1cm4gby5zZXJpYWxpemUoKX0pLG9wdDp0aGlzLm9wdH19fV0pLG59KEVpKSxrVD1mdW5jdGlvbihlKXtTaShuLGUpO3ZhciB0PUNpKG4pO2Z1bmN0aW9uIG4ocil7dmFyIG8saT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIF9yKHRoaXMsbiksbz10LmNhbGwodGhpcyksby5vcHRpb25zPXIsby5vcHQ9aSxvfXJldHVybiB3cihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24obyxpKXtyZXR1cm4hMX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24obyl7cmV0dXJuITB9fSx7a2V5OiJvcHRpb25hbCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy5vcHRpb25zLCEwKX19LHtrZXk6InNlcmlhbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToicmljaHRleHQiLG9wdDp0aGlzLm9wdH19fV0pLG59KEVpKSxUVD1mdW5jdGlvbihlKXtTaShuLGUpO3ZhciB0PUNpKG4pO2Z1bmN0aW9uIG4ocil7dmFyIG8saT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIF9yKHRoaXMsbiksbz10LmNhbGwodGhpcyksby5pdGVtPXIsby5vcHQ9aSxvfXJldHVybiB3cihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24obyxpKXt2YXIgbD10aGlzLHM9ITE7cmV0dXJuIHRoaXMub3B0JiZpPT1udWxsPyExOnBlKGkpIT09Im9iamVjdCI/dnQoe30sbyxbe21lc3NhZ2U6IkV4cGVjdGVkICdvYmplY3QnLCBnb3QgJyIuY29uY2F0KHBlKGkpLCInIil9XSk6QXJyYXkuaXNBcnJheShpKT92dCh7fSxvLFt7bWVzc2FnZToiRXhwZWN0ZWQgJ29iamVjdCcsIGdvdCAnYXJyYXknIn1dKTooT2JqZWN0LmVudHJpZXMoaSkuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgdT1yaShhLDIpLGM9dVswXSxkPXVbMV0sZj1KbihvLGMpO2lmKCFmKXM9bC5hcHBlbmRWYWxpZGF0aW9uRXJyb3IocyxvLCJJbnRlcm5hbCBlcnJvcjogY291bGQgbm90IGNyZWF0ZSBwYXRoIGF0ICIuY29uY2F0KCFvJiZ0eXBlb2Ygbz09InN0cmluZyI/IjxlbXB0eSBzdHJpbmc+IjpvLCIgYXQga2V5ICIpLmNvbmNhdChkKSxpKTtlbHNle3ZhciBoPWwuaXRlbS52YWxpZGF0ZShmLGQpO2gmJnM/cz1FbChFbCh7fSxoKSxzKTpoJiYocz1oKX19KSxzKX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24obyl7aWYodGhpcy5vcHQmJm89PW51bGwpcmV0dXJuITA7aWYoIW8pcmV0dXJuITE7Zm9yKHZhciBpPTAsbD1PYmplY3QuZW50cmllcyhvKTtpPGwubGVuZ3RoO2krKyl7dmFyIHM9cmkobFtpXSwyKSxhPXNbMV07aWYoIXRoaXMuaXRlbS5hc3NlcnQoYSkpcmV0dXJuITF9cmV0dXJuIHBlKG8pPT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KG8pfX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMuaXRlbSwhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6InJlY29yZCIsaXRlbTp0aGlzLml0ZW0uc2VyaWFsaXplKCksb3B0OnRoaXMub3B0fX19XSksbn0oRWkpO2Z1bmN0aW9uIE5UKGUpe3ZhciB0PWVbeXRdO2lmKHQgaW5zdGFuY2VvZiBUZyl0aHJvdyBFcnJvcigiQ2Fubm90IGdldCByYXcgc291cmNlIG9mIGFuIEV4cHIiKTt2YXIgbj10O3JldHVybiBufWZ1bmN0aW9uIGJUKGUpe3JldHVybiBlLmluZGV4T2YoIi4iKT09PS0xP1tlLCIiXTpbZS5zbGljZSgwLGUuaW5kZXhPZigiLiIpKSxlLnNsaWNlKGUuaW5kZXhPZigiLiIpKzEpXX1mdW5jdGlvbiBSVChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIENUfHxwZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0ib2JqZWN0In1mdW5jdGlvbiBQVChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFRUfHxwZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0icmVjb3JkIn1mdW5jdGlvbiBPVChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEVUfHxwZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0iYXJyYXkifWZ1bmN0aW9uIEFUKGUpe3JldHVybiBlIGluc3RhbmNlb2YgJFR8fHBlKGUpPT09Im9iamVjdCImJiJ0eXBlImluIGUmJmUudHlwZT09PSJ1bmlvbiJ9ZnVuY3Rpb24gTVQoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBrVHx8cGUoZSk9PT0ib2JqZWN0IiYmInR5cGUiaW4gZSYmZS50eXBlPT09InJpY2h0ZXh0In1mdW5jdGlvbiBEVChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHhUfHxwZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0iaW1hZ2UifWZ1bmN0aW9uIExUKGUsdCxuKXtmb3IodmFyIHI9SVQoZSksbz1kVChyKSxpPW4sbD10LHM9ZnVuY3Rpb24oKXt2YXIgYz1yLnNoaWZ0KCk7aWYoYz09PXZvaWQgMCl0aHJvdyBFcnJvcigiVW5leHBlY3RlZCB1bmRlZmluZWQgcGFydCIpO2lmKE9UKGkpKXtpZihOdW1iZXIuaXNOYU4oTnVtYmVyKGMpKSl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiBhcnJheSBzY2hlbWEgIi5jb25jYXQoSlNPTi5zdHJpbmdpZnkoaSksIiBtdXN0IGhhdmUgYSBudW1iZXIgYXMgcGF0aCwgYnV0IGdvdCAiKS5jb25jYXQoYywiLiBQYXRoOiAiKS5jb25jYXQoZSkpO2lmKHBlKGwpIT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGwpKXRocm93IEVycm9yKCJTY2hlbWEgdHlwZSBlcnJvcjogZXhwZWN0ZWQgc291cmNlIHRvIGJlIHR5cGUgb2YgYXJyYXksIGJ1dCBnb3QgIi5jb25jYXQocGUobCkpKTtpZighbFtjXSl7dmFyIGQ7dGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogYXJyYXkgc291cmNlIChsZW5ndGg6ICIuY29uY2F0KChkPWwpPT09bnVsbHx8ZD09PXZvaWQgMD92b2lkIDA6ZC5sZW5ndGgsIikgZGlkIG5vdCBoYXZlIGluZGV4ICIpLmNvbmNhdChjLCIgZnJvbSBwYXRoOiAiKS5jb25jYXQoZSkpfWw9bFtjXSxpPWkuaXRlbX1lbHNlIGlmKFBUKGkpKXtpZih0eXBlb2YgYyE9InN0cmluZyIpdGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogcmVjb3JkIHNjaGVtYSAiLmNvbmNhdChpLCIgbXVzdCBoYXZlIHBhdGg6ICIpLmNvbmNhdChjLCIgYXMgc3RyaW5nIikpO2lmKHBlKGwpIT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGwpKXRocm93IEVycm9yKCJTY2hlbWEgdHlwZSBlcnJvcjogZXhwZWN0ZWQgc291cmNlIHRvIGJlIHR5cGUgb2YgcmVjb3JkLCBidXQgZ290ICIuY29uY2F0KHBlKGwpKSk7aWYoIWxbY10pdGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogcmVjb3JkIHNvdXJjZSBkaWQgbm90IGhhdmUga2V5ICIuY29uY2F0KGMsIiBmcm9tIHBhdGg6ICIpLmNvbmNhdChlKSk7bD1sW2NdLGk9aS5pdGVtfWVsc2UgaWYoUlQoaSkpe2lmKHBlKGwpIT09Im9iamVjdCIpdGhyb3cgRXJyb3IoIlNjaGVtYSB0eXBlIGVycm9yOiBleHBlY3RlZCBzb3VyY2UgdG8gYmUgdHlwZSBvZiBvYmplY3QsIGJ1dCBnb3QgIi5jb25jYXQocGUobCkpKTtpZighbFtjXSl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiBvYmplY3Qgc291cmNlIGRpZCBub3QgaGF2ZSBrZXkgIi5jb25jYXQoYywiIGZyb20gcGF0aDogIikuY29uY2F0KGUpKTtsPWxbY10saT1pLml0ZW1zW2NdfWVsc2V7aWYoRFQoaSkpcmV0dXJue3Y6e3BhdGg6by5zbGljZSgwLG8ubGVuZ3RoLXIubGVuZ3RoLTEpLm1hcChmdW5jdGlvbihtKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobSl9KS5qb2luKCIuIiksc2NoZW1hOmksc291cmNlOmx9fTtpZihBVChpKSl7dmFyIGY9aS5rZXksaD1sW2ZdO2lmKCFoKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6IHVuaW9uIHNvdXJjZSAiLmNvbmNhdChpLCIgZGlkIG5vdCBoYXZlIHJlcXVpcmVkIGtleSAiKS5jb25jYXQoZiwiIGluIHBhdGg6ICIpLmNvbmNhdChlKSk7dmFyIGc9aS5pdGVtcy5maW5kKGZ1bmN0aW9uKG0pe3ZhciBTLHY7cmV0dXJuKG09PW51bGx8fChTPW0uaXRlbXMpPT09bnVsbHx8Uz09PXZvaWQgMHx8KHY9U1tmXSk9PT1udWxsfHx2PT09dm9pZCAwP3ZvaWQgMDp2LnZhbHVlKT09PWh9KTtpZighZyl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiB1bmlvbiBzY2hlbWEgIi5jb25jYXQoaSwiIGRpZCBub3QgaGF2ZSBhIGNoaWxkIG9iamVjdCB3aXRoICIpLmNvbmNhdChmLCIgb2YgdmFsdWUgIikuY29uY2F0KGgsIiBpbiBwYXRoOiAiKS5jb25jYXQoZSkpO2k9Zy5pdGVtc1tjXSxsPWxbY119ZWxzZXtpZihNVChpKSlyZXR1cm57djp7cGF0aDpvLnNsaWNlKDAsby5sZW5ndGgtci5sZW5ndGgtMSkubWFwKGZ1bmN0aW9uKG0pe3JldHVybiBKU09OLnN0cmluZ2lmeShtKX0pLmpvaW4oIi4iKSxzY2hlbWE6aSxzb3VyY2U6bH19O3Rocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6ICIuY29uY2F0KGMsIiByZXNvbHZlZCB0byBhbiB1bmV4cGVjdGVkIHNjaGVtYSAiKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkoaSkpKX19fTtyLmxlbmd0aD4wOyl7dmFyIGE9cygpO2lmKHBlKGEpPT09Im9iamVjdCIpcmV0dXJuIGEudn1pZihyLmxlbmd0aD4wKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6ICIuY29uY2F0KHIuam9pbigiLiIpLCIgaXMgbm90IGEgdmFsaWQgcGF0aCIpKTtyZXR1cm57cGF0aDpvLm1hcChmdW5jdGlvbih1KXtyZXR1cm4gTnVtYmVyLmlzTmFOKE51bWJlcih1KSk/SlNPTi5zdHJpbmdpZnkodSk6dX0pLmpvaW4oIi4iKSxzY2hlbWE6aSxzb3VyY2U6bH19ZnVuY3Rpb24gSVQoZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOyl7dmFyIHI9IiI7aWYoZVtuXT09PSciJyl7Zm9yKG4rKztuPGUubGVuZ3RoJiZlW25dIT09JyInOyllW25dPT09IlxcIiYmZVtuKzFdPT09JyInPyhyKz0nIicsbisrKTpyKz1lW25dLG4rKztpZihlW25dIT09JyInKXt2YXIgbzt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgKCIuY29uY2F0KEpTT04uc3RyaW5naWZ5KGUpLCIpOiBNaXNzaW5nIGNsb3NpbmcgZG91YmxlIHF1b3RlOiAiKS5jb25jYXQoKG89ZVtuXSkhPT1udWxsJiZvIT09dm9pZCAwP286ImF0IGVuZCBvZiBzdHJpbmciLCIgKGNoYXI6ICIpLmNvbmNhdChuLCI7IGxlbmd0aDogIikuY29uY2F0KGUubGVuZ3RoLCIpIikpfX1lbHNlIGZvcig7bjxlLmxlbmd0aCYmZVtuXSE9PSIuIjspcis9ZVtuXSxuKys7ciE9PSIiJiZ0LnB1c2gociksbisrfXJldHVybiB0fWZ1bmN0aW9uIGpUKGUpe3JldHVybiBoXyhCVChlKSl9ZnVuY3Rpb24gelQoZSl7cmV0dXJuICRvKGUpP3BlKGVbeXRdKT09PSJvYmplY3QiJiZwZShlW3l0XSkhPT1udWxsJiZBcnJheS5pc0FycmF5KGVbeXRdKTpBcnJheS5pc0FycmF5KGUpfWZ1bmN0aW9uIEZUKGUpe3JldHVybiAkbyhlKT9wZShlW3l0XSk9PT0ib2JqZWN0IiYmcGUoZVt5dF0pIT09bnVsbCYmIUFycmF5LmlzQXJyYXkoZVt5dF0pOnBlKGUpPT09Im9iamVjdCJ9ZnVuY3Rpb24gQlQoZSl7dmFyIHQ9U3QoZSk7ZnVuY3Rpb24gbihyKXt2YXIgbz16VChyKSxpPUZUKHIpO2lmKG8pe3ZhciBsPXl0IGluIHI/clt5dF06cixzPXF0IGluIHI/cltxdF06dm9pZCAwO3JldHVybnt2YWw6bC5tYXAoZnVuY3Rpb24oYyxkKXtyZXR1cm4gbigkbyhjKT9jOlN0KGMsSm4ocyxkKSkpfSksdmFsUGF0aDpzfX1lbHNlIGlmKGkpe3ZhciBhPXl0IGluIHI/clt5dF06cix1PXF0IGluIHI/cltxdF06dm9pZCAwO3JldHVybnt2YWw6YSE9PW51bGwmJk9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhKS5tYXAoZnVuY3Rpb24oYyl7dmFyIGQ9cmkoYywyKSxmPWRbMF0saD1kWzFdO3JldHVybltmLG4oJG8oaCk/aDpTdChoLEpuKHUsZikpKV19KSksdmFsUGF0aDp1fX1lbHNlIHJldHVybiAkbyhyKT97dmFsOm4oclt5dF0pLHZhbFBhdGg6cltxdF19OnJ9cmV0dXJuIG4odCl9ZnVuY3Rpb24gUmgoZSl7dmFyIHQ9Zl8oZSk/ZS52YWw6ZTtzd2l0Y2gocGUodCkpe2Nhc2UiZnVuY3Rpb24iOmNhc2Uic3ltYm9sIjp0aHJvdyBFcnJvcigiSW52YWxpZCB2YWwgdHlwZTogIi5jb25jYXQocGUodCkpKTtjYXNlIm9iamVjdCI6cmV0dXJuIHQ9PT1udWxsP251bGw6QXJyYXkuaXNBcnJheSh0KT90Lm1hcChSaCk6T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHQpLm1hcChmdW5jdGlvbihuKXt2YXIgcj1yaShuLDIpLG89clswXSxpPXJbMV07cmV0dXJuW28saSYmUmgoaSldfSkpO2RlZmF1bHQ6cmV0dXJuIHR9fWZ1bmN0aW9uIGhfKGUpe3ZhciB0LG49ZS52YWw7c3dpdGNoKHBlKG4pKXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6dGhyb3cgRXJyb3IoIkludmFsaWQgdmFsIHR5cGU6ICIuY29uY2F0KHBlKG4pKSk7Y2FzZSJvYmplY3QiOmlmKG4hPT1udWxsKXJldHVybiBuZXcgUHJveHkobix7aGFzOmZ1bmN0aW9uKG8saSl7cmV0dXJuIGk9PT0idmFsInx8aT09PXF0PyEwOnR5KG8saSl9LGdldDpmdW5jdGlvbihvLGkpe2lmKGk9PT1xdClyZXR1cm4gZS52YWxQYXRoO2lmKGk9PT0idmFsIilyZXR1cm4gUmgoZSk7aWYoQXJyYXkuaXNBcnJheShvKSYmaT09PSJsZW5ndGgiKXJldHVybiBvLmxlbmd0aDtpZih0eShuLGkpKXt2YXIgbCxzO3JldHVybiBoXyh7dmFsOlJlZmxlY3QuZ2V0KG8saSkudmFsLHZhbFBhdGg6KGw9KHM9UmVmbGVjdC5nZXQobyxpKSk9PT1udWxsfHxzPT09dm9pZCAwP3ZvaWQgMDpzLnZhbFBhdGgpIT09bnVsbCYmbCE9PXZvaWQgMD9sOkpuKGUudmFsUGF0aCxBcnJheS5pc0FycmF5KG8pP051bWJlcihpKTppKX0pfXJldHVybiBSZWZsZWN0LmdldChvLGkpfX0pO2RlZmF1bHQ6cmV0dXJuIHQ9e30sdnQodCxxdCxlLnZhbFBhdGgpLHZ0KHQsInZhbCIsZS52YWwpLHR9fWZ1bmN0aW9uIHR5KGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfWZ1bmN0aW9uIGZpKCl7Zmk9ZnVuY3Rpb24oKXtyZXR1cm4gdH07dmFyIGUsdD17fSxuPU9iamVjdC5wcm90b3R5cGUscj1uLmhhc093blByb3BlcnR5LG89T2JqZWN0LmRlZmluZVByb3BlcnR5fHxmdW5jdGlvbihQLE8sayl7UFtPXT1rLnZhbHVlfSxpPXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiI/U3ltYm9sOnt9LGw9aS5pdGVyYXRvcnx8IkBAaXRlcmF0b3IiLHM9aS5hc3luY0l0ZXJhdG9yfHwiQEBhc3luY0l0ZXJhdG9yIixhPWkudG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIjtmdW5jdGlvbiB1KFAsTyxrKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KFAsTyx7dmFsdWU6ayxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pLFBbT119dHJ5e3Uoe30sIiIpfWNhdGNoe3U9ZnVuY3Rpb24oTyxrLEkpe3JldHVybiBPW2tdPUl9fWZ1bmN0aW9uIGMoUCxPLGssSSl7dmFyIEw9TyYmTy5wcm90b3R5cGUgaW5zdGFuY2VvZiB2P086dixWPU9iamVjdC5jcmVhdGUoTC5wcm90b3R5cGUpLHRlPW5ldyBIKEl8fFtdKTtyZXR1cm4gbyhWLCJfaW52b2tlIix7dmFsdWU6UihQLGssdGUpfSksVn1mdW5jdGlvbiBkKFAsTyxrKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOlAuY2FsbChPLGspfX1jYXRjaChJKXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzpJfX19dC53cmFwPWM7dmFyIGY9InN1c3BlbmRlZFN0YXJ0IixoPSJzdXNwZW5kZWRZaWVsZCIsZz0iZXhlY3V0aW5nIixtPSJjb21wbGV0ZWQiLFM9e307ZnVuY3Rpb24gdigpe31mdW5jdGlvbiB5KCl7fWZ1bmN0aW9uIF8oKXt9dmFyIHc9e307dSh3LGwsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pO3ZhciBDPU9iamVjdC5nZXRQcm90b3R5cGVPZiwkPUMmJkMoQyhYKFtdKSkpOyQmJiQhPT1uJiZyLmNhbGwoJCxsKSYmKHc9JCk7dmFyIEU9Xy5wcm90b3R5cGU9di5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh3KTtmdW5jdGlvbiBUKFApe1sibmV4dCIsInRocm93IiwicmV0dXJuIl0uZm9yRWFjaChmdW5jdGlvbihPKXt1KFAsTyxmdW5jdGlvbihrKXtyZXR1cm4gdGhpcy5faW52b2tlKE8sayl9KX0pfWZ1bmN0aW9uIE0oUCxPKXtmdW5jdGlvbiBrKEwsVix0ZSx5ZSl7dmFyIGZlPWQoUFtMXSxQLFYpO2lmKGZlLnR5cGUhPT0idGhyb3ciKXt2YXIgT2U9ZmUuYXJnLGJlPU9lLnZhbHVlO3JldHVybiBiZSYmdHlwZW9mIGJlPT0ib2JqZWN0IiYmci5jYWxsKGJlLCJfX2F3YWl0Iik/Ty5yZXNvbHZlKGJlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24oWil7aygibmV4dCIsWix0ZSx5ZSl9LGZ1bmN0aW9uKFope2soInRocm93IixaLHRlLHllKX0pOk8ucmVzb2x2ZShiZSkudGhlbihmdW5jdGlvbihaKXtPZS52YWx1ZT1aLHRlKE9lKX0sZnVuY3Rpb24oWil7cmV0dXJuIGsoInRocm93IixaLHRlLHllKX0pfXllKGZlLmFyZyl9dmFyIEk7byh0aGlzLCJfaW52b2tlIix7dmFsdWU6ZnVuY3Rpb24oTCxWKXtmdW5jdGlvbiB0ZSgpe3JldHVybiBuZXcgTyhmdW5jdGlvbih5ZSxmZSl7ayhMLFYseWUsZmUpfSl9cmV0dXJuIEk9ST9JLnRoZW4odGUsdGUpOnRlKCl9fSl9ZnVuY3Rpb24gUihQLE8sayl7dmFyIEk9ZjtyZXR1cm4gZnVuY3Rpb24oTCxWKXtpZihJPT09Zyl0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtpZihJPT09bSl7aWYoTD09PSJ0aHJvdyIpdGhyb3cgVjtyZXR1cm57dmFsdWU6ZSxkb25lOiEwfX1mb3Ioay5tZXRob2Q9TCxrLmFyZz1WOzspe3ZhciB0ZT1rLmRlbGVnYXRlO2lmKHRlKXt2YXIgeWU9aih0ZSxrKTtpZih5ZSl7aWYoeWU9PT1TKWNvbnRpbnVlO3JldHVybiB5ZX19aWYoay5tZXRob2Q9PT0ibmV4dCIpay5zZW50PWsuX3NlbnQ9ay5hcmc7ZWxzZSBpZihrLm1ldGhvZD09PSJ0aHJvdyIpe2lmKEk9PT1mKXRocm93IEk9bSxrLmFyZztrLmRpc3BhdGNoRXhjZXB0aW9uKGsuYXJnKX1lbHNlIGsubWV0aG9kPT09InJldHVybiImJmsuYWJydXB0KCJyZXR1cm4iLGsuYXJnKTtJPWc7dmFyIGZlPWQoUCxPLGspO2lmKGZlLnR5cGU9PT0ibm9ybWFsIil7aWYoST1rLmRvbmU/bTpoLGZlLmFyZz09PVMpY29udGludWU7cmV0dXJue3ZhbHVlOmZlLmFyZyxkb25lOmsuZG9uZX19ZmUudHlwZT09PSJ0aHJvdyImJihJPW0say5tZXRob2Q9InRocm93IixrLmFyZz1mZS5hcmcpfX19ZnVuY3Rpb24gaihQLE8pe3ZhciBrPU8ubWV0aG9kLEk9UC5pdGVyYXRvcltrXTtpZihJPT09ZSlyZXR1cm4gTy5kZWxlZ2F0ZT1udWxsLGs9PT0idGhyb3ciJiZQLml0ZXJhdG9yLnJldHVybiYmKE8ubWV0aG9kPSJyZXR1cm4iLE8uYXJnPWUsaihQLE8pLE8ubWV0aG9kPT09InRocm93Iil8fGshPT0icmV0dXJuIiYmKE8ubWV0aG9kPSJ0aHJvdyIsTy5hcmc9bmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAnIitrKyInIG1ldGhvZCIpKSxTO3ZhciBMPWQoSSxQLml0ZXJhdG9yLE8uYXJnKTtpZihMLnR5cGU9PT0idGhyb3ciKXJldHVybiBPLm1ldGhvZD0idGhyb3ciLE8uYXJnPUwuYXJnLE8uZGVsZWdhdGU9bnVsbCxTO3ZhciBWPUwuYXJnO3JldHVybiBWP1YuZG9uZT8oT1tQLnJlc3VsdE5hbWVdPVYudmFsdWUsTy5uZXh0PVAubmV4dExvYyxPLm1ldGhvZCE9PSJyZXR1cm4iJiYoTy5tZXRob2Q9Im5leHQiLE8uYXJnPWUpLE8uZGVsZWdhdGU9bnVsbCxTKTpWOihPLm1ldGhvZD0idGhyb3ciLE8uYXJnPW5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0IiksTy5kZWxlZ2F0ZT1udWxsLFMpfWZ1bmN0aW9uIEYoUCl7dmFyIE89e3RyeUxvYzpQWzBdfTsxIGluIFAmJihPLmNhdGNoTG9jPVBbMV0pLDIgaW4gUCYmKE8uZmluYWxseUxvYz1QWzJdLE8uYWZ0ZXJMb2M9UFszXSksdGhpcy50cnlFbnRyaWVzLnB1c2goTyl9ZnVuY3Rpb24gYWUoUCl7dmFyIE89UC5jb21wbGV0aW9ufHx7fTtPLnR5cGU9Im5vcm1hbCIsZGVsZXRlIE8uYXJnLFAuY29tcGxldGlvbj1PfWZ1bmN0aW9uIEgoUCl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOiJyb290In1dLFAuZm9yRWFjaChGLHRoaXMpLHRoaXMucmVzZXQoITApfWZ1bmN0aW9uIFgoUCl7aWYoUHx8UD09PSIiKXt2YXIgTz1QW2xdO2lmKE8pcmV0dXJuIE8uY2FsbChQKTtpZih0eXBlb2YgUC5uZXh0PT0iZnVuY3Rpb24iKXJldHVybiBQO2lmKCFpc05hTihQLmxlbmd0aCkpe3ZhciBrPS0xLEk9ZnVuY3Rpb24gTCgpe2Zvcig7KytrPFAubGVuZ3RoOylpZihyLmNhbGwoUCxrKSlyZXR1cm4gTC52YWx1ZT1QW2tdLEwuZG9uZT0hMSxMO3JldHVybiBMLnZhbHVlPWUsTC5kb25lPSEwLEx9O3JldHVybiBJLm5leHQ9SX19dGhyb3cgbmV3IFR5cGVFcnJvcih0eXBlb2YgUCsiIGlzIG5vdCBpdGVyYWJsZSIpfXJldHVybiB5LnByb3RvdHlwZT1fLG8oRSwiY29uc3RydWN0b3IiLHt2YWx1ZTpfLGNvbmZpZ3VyYWJsZTohMH0pLG8oXywiY29uc3RydWN0b3IiLHt2YWx1ZTp5LGNvbmZpZ3VyYWJsZTohMH0pLHkuZGlzcGxheU5hbWU9dShfLGEsIkdlbmVyYXRvckZ1bmN0aW9uIiksdC5pc0dlbmVyYXRvckZ1bmN0aW9uPWZ1bmN0aW9uKFApe3ZhciBPPXR5cGVvZiBQPT0iZnVuY3Rpb24iJiZQLmNvbnN0cnVjdG9yO3JldHVybiEhTyYmKE89PT15fHwoTy5kaXNwbGF5TmFtZXx8Ty5uYW1lKT09PSJHZW5lcmF0b3JGdW5jdGlvbiIpfSx0Lm1hcms9ZnVuY3Rpb24oUCl7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoUCxfKTooUC5fX3Byb3RvX189Xyx1KFAsYSwiR2VuZXJhdG9yRnVuY3Rpb24iKSksUC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShFKSxQfSx0LmF3cmFwPWZ1bmN0aW9uKFApe3JldHVybntfX2F3YWl0OlB9fSxUKE0ucHJvdG90eXBlKSx1KE0ucHJvdG90eXBlLHMsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHQuQXN5bmNJdGVyYXRvcj1NLHQuYXN5bmM9ZnVuY3Rpb24oUCxPLGssSSxMKXtMPT09dm9pZCAwJiYoTD1Qcm9taXNlKTt2YXIgVj1uZXcgTShjKFAsTyxrLEkpLEwpO3JldHVybiB0LmlzR2VuZXJhdG9yRnVuY3Rpb24oTyk/VjpWLm5leHQoKS50aGVuKGZ1bmN0aW9uKHRlKXtyZXR1cm4gdGUuZG9uZT90ZS52YWx1ZTpWLm5leHQoKX0pfSxUKEUpLHUoRSxhLCJHZW5lcmF0b3IiKSx1KEUsbCxmdW5jdGlvbigpe3JldHVybiB0aGlzfSksdShFLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCBHZW5lcmF0b3JdIn0pLHQua2V5cz1mdW5jdGlvbihQKXt2YXIgTz1PYmplY3QoUCksaz1bXTtmb3IodmFyIEkgaW4gTylrLnB1c2goSSk7cmV0dXJuIGsucmV2ZXJzZSgpLGZ1bmN0aW9uIEwoKXtmb3IoO2subGVuZ3RoOyl7dmFyIFY9ay5wb3AoKTtpZihWIGluIE8pcmV0dXJuIEwudmFsdWU9VixMLmRvbmU9ITEsTH1yZXR1cm4gTC5kb25lPSEwLEx9fSx0LnZhbHVlcz1YLEgucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpILHJlc2V0OmZ1bmN0aW9uKFApe2lmKHRoaXMucHJldj0wLHRoaXMubmV4dD0wLHRoaXMuc2VudD10aGlzLl9zZW50PWUsdGhpcy5kb25lPSExLHRoaXMuZGVsZWdhdGU9bnVsbCx0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5hcmc9ZSx0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChhZSksIVApZm9yKHZhciBPIGluIHRoaXMpTy5jaGFyQXQoMCk9PT0idCImJnIuY2FsbCh0aGlzLE8pJiYhaXNOYU4oK08uc2xpY2UoMSkpJiYodGhpc1tPXT1lKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZG9uZT0hMDt2YXIgUD10aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtpZihQLnR5cGU9PT0idGhyb3ciKXRocm93IFAuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uKFApe2lmKHRoaXMuZG9uZSl0aHJvdyBQO3ZhciBPPXRoaXM7ZnVuY3Rpb24gayhmZSxPZSl7cmV0dXJuIFYudHlwZT0idGhyb3ciLFYuYXJnPVAsTy5uZXh0PWZlLE9lJiYoTy5tZXRob2Q9Im5leHQiLE8uYXJnPWUpLCEhT2V9Zm9yKHZhciBJPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtJPj0wOy0tSSl7dmFyIEw9dGhpcy50cnlFbnRyaWVzW0ldLFY9TC5jb21wbGV0aW9uO2lmKEwudHJ5TG9jPT09InJvb3QiKXJldHVybiBrKCJlbmQiKTtpZihMLnRyeUxvYzw9dGhpcy5wcmV2KXt2YXIgdGU9ci5jYWxsKEwsImNhdGNoTG9jIikseWU9ci5jYWxsKEwsImZpbmFsbHlMb2MiKTtpZih0ZSYmeWUpe2lmKHRoaXMucHJldjxMLmNhdGNoTG9jKXJldHVybiBrKEwuY2F0Y2hMb2MsITApO2lmKHRoaXMucHJldjxMLmZpbmFsbHlMb2MpcmV0dXJuIGsoTC5maW5hbGx5TG9jKX1lbHNlIGlmKHRlKXtpZih0aGlzLnByZXY8TC5jYXRjaExvYylyZXR1cm4gayhMLmNhdGNoTG9jLCEwKX1lbHNle2lmKCF5ZSl0aHJvdyBuZXcgRXJyb3IoInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5Iik7aWYodGhpcy5wcmV2PEwuZmluYWxseUxvYylyZXR1cm4gayhMLmZpbmFsbHlMb2MpfX19fSxhYnJ1cHQ6ZnVuY3Rpb24oUCxPKXtmb3IodmFyIGs9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2s+PTA7LS1rKXt2YXIgST10aGlzLnRyeUVudHJpZXNba107aWYoSS50cnlMb2M8PXRoaXMucHJldiYmci5jYWxsKEksImZpbmFsbHlMb2MiKSYmdGhpcy5wcmV2PEkuZmluYWxseUxvYyl7dmFyIEw9STticmVha319TCYmKFA9PT0iYnJlYWsifHxQPT09ImNvbnRpbnVlIikmJkwudHJ5TG9jPD1PJiZPPD1MLmZpbmFsbHlMb2MmJihMPW51bGwpO3ZhciBWPUw/TC5jb21wbGV0aW9uOnt9O3JldHVybiBWLnR5cGU9UCxWLmFyZz1PLEw/KHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLm5leHQ9TC5maW5hbGx5TG9jLFMpOnRoaXMuY29tcGxldGUoVil9LGNvbXBsZXRlOmZ1bmN0aW9uKFAsTyl7aWYoUC50eXBlPT09InRocm93Iil0aHJvdyBQLmFyZztyZXR1cm4gUC50eXBlPT09ImJyZWFrInx8UC50eXBlPT09ImNvbnRpbnVlIj90aGlzLm5leHQ9UC5hcmc6UC50eXBlPT09InJldHVybiI/KHRoaXMucnZhbD10aGlzLmFyZz1QLmFyZyx0aGlzLm1ldGhvZD0icmV0dXJuIix0aGlzLm5leHQ9ImVuZCIpOlAudHlwZT09PSJub3JtYWwiJiZPJiYodGhpcy5uZXh0PU8pLFN9LGZpbmlzaDpmdW5jdGlvbihQKXtmb3IodmFyIE89dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO08+PTA7LS1PKXt2YXIgaz10aGlzLnRyeUVudHJpZXNbT107aWYoay5maW5hbGx5TG9jPT09UClyZXR1cm4gdGhpcy5jb21wbGV0ZShrLmNvbXBsZXRpb24say5hZnRlckxvYyksYWUoayksU319LGNhdGNoOmZ1bmN0aW9uKFApe2Zvcih2YXIgTz10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7Tz49MDstLU8pe3ZhciBrPXRoaXMudHJ5RW50cmllc1tPXTtpZihrLnRyeUxvYz09PVApe3ZhciBJPWsuY29tcGxldGlvbjtpZihJLnR5cGU9PT0idGhyb3ciKXt2YXIgTD1JLmFyZzthZShrKX1yZXR1cm4gTH19dGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHQiKX0sZGVsZWdhdGVZaWVsZDpmdW5jdGlvbihQLE8sayl7cmV0dXJuIHRoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOlgoUCkscmVzdWx0TmFtZTpPLG5leHRMb2M6a30sdGhpcy5tZXRob2Q9PT0ibmV4dCImJih0aGlzLmFyZz1lKSxTfX0sdH1mdW5jdGlvbiBueShlLHQsbixyLG8saSxsKXt0cnl7dmFyIHM9ZVtpXShsKSxhPXMudmFsdWV9Y2F0Y2godSl7bih1KTtyZXR1cm59cy5kb25lP3QoYSk6UHJvbWlzZS5yZXNvbHZlKGEpLnRoZW4ocixvKX1mdW5jdGlvbiBOZyhlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyLG8pe3ZhciBpPWUuYXBwbHkodCxuKTtmdW5jdGlvbiBsKGEpe255KGkscixvLGwscywibmV4dCIsYSl9ZnVuY3Rpb24gcyhhKXtueShpLHIsbyxsLHMsInRocm93IixhKX1sKHZvaWQgMCl9KX19dmFyIFdUPWZ1bmN0aW9uKCl7dmFyIGU9TmcoZmkoKS5tYXJrKGZ1bmN0aW9uIHQobil7dmFyIHIsbyxpO3JldHVybiBmaSgpLndyYXAoZnVuY3Rpb24ocyl7Zm9yKDs7KXN3aXRjaChzLnByZXY9cy5uZXh0KXtjYXNlIDA6cmV0dXJuIHMubmV4dD0yLGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IixuKTtjYXNlIDI6cmV0dXJuIHI9cy5zZW50LG89QXJyYXkuZnJvbShuZXcgVWludDhBcnJheShyKSksaT1vLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpfSkuam9pbigiIikscy5hYnJ1cHQoInJldHVybiIsaSk7Y2FzZSA2OmNhc2UiZW5kIjpyZXR1cm4gcy5zdG9wKCl9fSx0KX0pKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSxVVD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7X3IodGhpcyxlKSx0aGlzLmhvc3Q9dH1yZXR1cm4gd3IoZSxbe2tleToiZ2V0RGlzYWJsZVVybCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4iIi5jb25jYXQodGhpcy5ob3N0LCIvZGlzYWJsZSIpfX0se2tleToiZ2V0RWRpdFVybCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4iIi5jb25jYXQodGhpcy5ob3N0LCIvc3RhdGljL2VkaXQiKX19LHtrZXk6ImdldExvZ2luVXJsIix2YWx1ZTpmdW5jdGlvbihuKXtyZXR1cm4iIi5jb25jYXQodGhpcy5ob3N0LCIvYXV0aG9yaXplP3JlZGlyZWN0X3RvPSIpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQobikpfX0se2tleToiZ2V0UGF0Y2hlcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1OZyhmaSgpLm1hcmsoZnVuY3Rpb24gcihvKXt2YXIgaSxsLHM7cmV0dXJuIGZpKCkud3JhcChmdW5jdGlvbih1KXtmb3IoOzspc3dpdGNoKHUucHJldj11Lm5leHQpe2Nhc2UgMDpyZXR1cm4gaT1vLnBhdGNoSWRzLGw9by5oZWFkZXJzLHM9aT8iPyIuY29uY2F0KGkubWFwKGZ1bmN0aW9uKGMpe3JldHVybiIiLmNvbmNhdChjLCI9IikuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChjKSl9KS5qb2luKCImIikpOiIiLHUuYWJydXB0KCJyZXR1cm4iLGZldGNoKCIiLmNvbmNhdCh0aGlzLmhvc3QsIi9wYXRjaGVzL34iKS5jb25jYXQocykse2hlYWRlcnM6bHx8eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi9qc29uIn19KS50aGVuKGZ1bmN0aW9uKGMpe3JldHVybiB1dShjKX0pKTtjYXNlIDM6Y2FzZSJlbmQiOnJldHVybiB1LnN0b3AoKX19LHIsdGhpcyl9KSk7ZnVuY3Rpb24gbihyKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIG59KCl9LHtrZXk6InBvc3RQYXRjaGVzIix2YWx1ZTpmdW5jdGlvbihuLHIsbyl7cmV0dXJuIGZldGNoKCIiLmNvbmNhdCh0aGlzLmhvc3QsIi9wYXRjaGVzL34iKSx7aGVhZGVyczpvfHx7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxtZXRob2Q6IlBPU1QiLGJvZHk6SlNPTi5zdHJpbmdpZnkodnQoe30sbixyKSl9KS50aGVuKGZ1bmN0aW9uKGkpe3JldHVybiB1dShpKX0pfX0se2tleToiZ2V0U2Vzc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZmV0Y2goIiIuY29uY2F0KHRoaXMuaG9zdCwiL3Nlc3Npb24iKSkudGhlbihmdW5jdGlvbihuKXtyZXR1cm4gdXUobil9KX19LHtrZXk6ImdldE1vZHVsZXMiLHZhbHVlOmZ1bmN0aW9uKG4pe3ZhciByPW4ucGF0Y2gsbz1yPT09dm9pZCAwPyExOnIsaT1uLmluY2x1ZGVTY2hlbWEsbD1pPT09dm9pZCAwPyExOmkscz1uLmluY2x1ZGVTb3VyY2UsYT1zPT09dm9pZCAwPyExOnMsdT1uLnRyZWVQYXRoLGM9dT09PXZvaWQgMD8iLyI6dSxkPW4uaGVhZGVycyxmPW5ldyBVUkxTZWFyY2hQYXJhbXM7cmV0dXJuIGYuc2V0KCJwYXRjaCIsby50b1N0cmluZygpKSxmLnNldCgic2NoZW1hIixsLnRvU3RyaW5nKCkpLGYuc2V0KCJzb3VyY2UiLGEudG9TdHJpbmcoKSksZmV0Y2goIiIuY29uY2F0KHRoaXMuaG9zdCwiL3RyZWUvfiIpLmNvbmNhdChjLCI/IikuY29uY2F0KGYudG9TdHJpbmcoKSkse2hlYWRlcnM6ZH0pLnRoZW4oZnVuY3Rpb24oaCl7cmV0dXJuIHV1KGgpfSl9fV0pLGV9KCk7ZnVuY3Rpb24gdXUoZSl7cmV0dXJuIFBoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBQaCgpe3JldHVybiBQaD1OZyhmaSgpLm1hcmsoZnVuY3Rpb24gZSh0KXtyZXR1cm4gZmkoKS53cmFwKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOmlmKHIucHJldj0wLCF0Lm9rKXtyLm5leHQ9OTticmVha31yZXR1cm4gci50MD1kbCxyLm5leHQ9NSx0Lmpzb24oKTtjYXNlIDU6cmV0dXJuIHIudDE9ci5zZW50LHIuYWJydXB0KCJyZXR1cm4iLHIudDAub2suY2FsbChyLnQwLHIudDEpKTtjYXNlIDk6cmV0dXJuIHIudDI9ZGwsci50Mz10LnN0YXR1cyxyLm5leHQ9MTMsdC50ZXh0KCk7Y2FzZSAxMzpyZXR1cm4gci50ND1yLnNlbnQsci50NT17c3RhdHVzQ29kZTpyLnQzLG1lc3NhZ2U6ci50NH0sci5hYnJ1cHQoInJldHVybiIsci50Mi5lcnIuY2FsbChyLnQyLHIudDUpKTtjYXNlIDE2OnIubmV4dD0yMTticmVhaztjYXNlIDE4OnJldHVybiByLnByZXY9MTgsci50Nj1yLmNhdGNoKDApLHIuYWJydXB0KCJyZXR1cm4iLHdpKHttZXNzYWdlOnIudDYgaW5zdGFuY2VvZiBFcnJvcj9yLnQ2Lm1lc3NhZ2U6IlVua25vd24gZXJyb3IifSkpO2Nhc2UgMjE6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19LGUsbnVsbCxbWzAsMThdXSl9KSksUGguYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciB3bj17Y29udmVydEZpbGVTb3VyY2U6ZF8sZ2V0U2NoZW1hOnZULGdldFZhbFBhdGg6d1QsZ2V0VmFsOmpULGdldFNvdXJjZTpOVCxyZXNvbHZlUGF0aDpMVCxzcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aDpiVCxpc1ZhbDpfVCxjcmVhdGVWYWxQYXRoT2ZJdGVtOkpuLGdldFNIQTI1Nkhhc2g6V1QsY3JlYXRlUGF0Y2hKU09OUGF0aDpmdW5jdGlvbih0KXtyZXR1cm4iLyIuY29uY2F0KHQuc3BsaXQoIi4iKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIEpTT04ucGFyc2Uobil9KS5qb2luKCIvIikpfSxWQUxfRFJBRlRfTU9ERV9DT09LSUU6InZhbF9kcmFmdF9tb2RlIixWQUxfRU5BQkxFX0NPT0tJRV9OQU1FOiJ2YWxfZW5hYmxlIixWQUxfU1RBVEVfQ09PS0lFOiJ2YWxfc3RhdGUiLFZBTF9TRVNTSU9OX0NPT0tJRToidmFsX3Nlc3Npb24ifSxwXz17ZXhwb3J0czp7fX07LyohCglDb3B5cmlnaHQgKGMpIDIwMTggSmVkIFdhdHNvbi4KCUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKSwgc2VlCglodHRwOi8vamVkd2F0c29uLmdpdGh1Yi5pby9jbGFzc25hbWVzCiovKGZ1bmN0aW9uKGUpeyhmdW5jdGlvbigpe3ZhciB0PXt9Lmhhc093blByb3BlcnR5O2Z1bmN0aW9uIG4oKXtmb3IodmFyIHI9W10sbz0wO288YXJndW1lbnRzLmxlbmd0aDtvKyspe3ZhciBpPWFyZ3VtZW50c1tvXTtpZihpKXt2YXIgbD10eXBlb2YgaTtpZihsPT09InN0cmluZyJ8fGw9PT0ibnVtYmVyIilyLnB1c2goaSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGkpKXtpZihpLmxlbmd0aCl7dmFyIHM9bi5hcHBseShudWxsLGkpO3MmJnIucHVzaChzKX19ZWxzZSBpZihsPT09Im9iamVjdCIpe2lmKGkudG9TdHJpbmchPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJiYhaS50b1N0cmluZy50b1N0cmluZygpLmluY2x1ZGVzKCJbbmF0aXZlIGNvZGVdIikpe3IucHVzaChpLnRvU3RyaW5nKCkpO2NvbnRpbnVlfWZvcih2YXIgYSBpbiBpKXQuY2FsbChpLGEpJiZpW2FdJiZyLnB1c2goYSl9fX1yZXR1cm4gci5qb2luKCIgIil9ZS5leHBvcnRzPyhuLmRlZmF1bHQ9bixlLmV4cG9ydHM9bik6d2luZG93LmNsYXNzTmFtZXM9bn0pKCl9KShwXyk7dmFyIFZUPXBfLmV4cG9ydHM7Y29uc3QgaWQ9JGEoVlQpO2Z1bmN0aW9uIGVlKCl7cmV0dXJuIGVlPU9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbi5iaW5kKCk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sZWUuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIEhUKGUsdCl7dHlwZW9mIGU9PSJmdW5jdGlvbiI/ZSh0KTplIT1udWxsJiYoZS5jdXJyZW50PXQpfWZ1bmN0aW9uIGdfKC4uLmUpe3JldHVybiB0PT5lLmZvckVhY2gobj0+SFQobix0KSl9ZnVuY3Rpb24gWGUoLi4uZSl7cmV0dXJuIHAudXNlQ2FsbGJhY2soZ18oLi4uZSksZSl9Y29uc3QgJGw9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Y2hpbGRyZW46biwuLi5yfT1lLG89cC5DaGlsZHJlbi50b0FycmF5KG4pLGk9by5maW5kKEdUKTtpZihpKXtjb25zdCBsPWkucHJvcHMuY2hpbGRyZW4scz1vLm1hcChhPT5hPT09aT9wLkNoaWxkcmVuLmNvdW50KGwpPjE/cC5DaGlsZHJlbi5vbmx5KG51bGwpOnAuaXNWYWxpZEVsZW1lbnQobCk/bC5wcm9wcy5jaGlsZHJlbjpudWxsOmEpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoT2gsZWUoe30scix7cmVmOnR9KSxwLmlzVmFsaWRFbGVtZW50KGwpP3AuY2xvbmVFbGVtZW50KGwsdm9pZCAwLHMpOm51bGwpfXJldHVybiBwLmNyZWF0ZUVsZW1lbnQoT2gsZWUoe30scix7cmVmOnR9KSxuKX0pOyRsLmRpc3BsYXlOYW1lPSJTbG90Ijtjb25zdCBPaD1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtjaGlsZHJlbjpuLC4uLnJ9PWU7cmV0dXJuIHAuaXNWYWxpZEVsZW1lbnQobik/cC5jbG9uZUVsZW1lbnQobix7Li4uWVQocixuLnByb3BzKSxyZWY6dD9nXyh0LG4ucmVmKTpuLnJlZn0pOnAuQ2hpbGRyZW4uY291bnQobik+MT9wLkNoaWxkcmVuLm9ubHkobnVsbCk6bnVsbH0pO09oLmRpc3BsYXlOYW1lPSJTbG90Q2xvbmUiO2NvbnN0IEtUPSh7Y2hpbGRyZW46ZX0pPT5wLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLGUpO2Z1bmN0aW9uIEdUKGUpe3JldHVybiBwLmlzVmFsaWRFbGVtZW50KGUpJiZlLnR5cGU9PT1LVH1mdW5jdGlvbiBZVChlLHQpe2NvbnN0IG49ey4uLnR9O2Zvcihjb25zdCByIGluIHQpe2NvbnN0IG89ZVtyXSxpPXRbcl07L15vbltBLVpdLy50ZXN0KHIpP28mJmk/bltyXT0oLi4ucyk9PntpKC4uLnMpLG8oLi4ucyl9Om8mJihuW3JdPW8pOnI9PT0ic3R5bGUiP25bcl09ey4uLm8sLi4uaX06cj09PSJjbGFzc05hbWUiJiYobltyXT1bbyxpXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpKX1yZXR1cm57Li4uZSwuLi5ufX1jb25zdCBYVD1bImEiLCJidXR0b24iLCJkaXYiLCJmb3JtIiwiaDIiLCJoMyIsImltZyIsImlucHV0IiwibGFiZWwiLCJsaSIsIm5hdiIsIm9sIiwicCIsInNwYW4iLCJzdmciLCJ1bCJdLERlPVhULnJlZHVjZSgoZSx0KT0+e2NvbnN0IG49cC5mb3J3YXJkUmVmKChyLG8pPT57Y29uc3R7YXNDaGlsZDppLC4uLmx9PXIscz1pPyRsOnQ7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57d2luZG93W1N5bWJvbC5mb3IoInJhZGl4LXVpIildPSEwfSxbXSkscC5jcmVhdGVFbGVtZW50KHMsZWUoe30sbCx7cmVmOm99KSl9KTtyZXR1cm4gbi5kaXNwbGF5TmFtZT1gUHJpbWl0aXZlLiR7dH1gLHsuLi5lLFt0XTpufX0se30pO2Z1bmN0aW9uIFFUKGUsdCl7ZSYmSHIuZmx1c2hTeW5jKCgpPT5lLmRpc3BhdGNoRXZlbnQodCkpfWNvbnN0ICRuPWdsb2JhbFRoaXMhPW51bGwmJmdsb2JhbFRoaXMuZG9jdW1lbnQ/cC51c2VMYXlvdXRFZmZlY3Q6KCk9Pnt9O2Z1bmN0aW9uIEpUKGUsdCl7cmV0dXJuIHAudXNlUmVkdWNlcigobixyKT0+e2NvbnN0IG89dFtuXVtyXTtyZXR1cm4gbz8/bn0sZSl9Y29uc3QgSWw9ZT0+e2NvbnN0e3ByZXNlbnQ6dCxjaGlsZHJlbjpufT1lLHI9WlQodCksbz10eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKHtwcmVzZW50OnIuaXNQcmVzZW50fSk6cC5DaGlsZHJlbi5vbmx5KG4pLGk9WGUoci5yZWYsby5yZWYpO3JldHVybiB0eXBlb2Ygbj09ImZ1bmN0aW9uInx8ci5pc1ByZXNlbnQ/cC5jbG9uZUVsZW1lbnQobyx7cmVmOml9KTpudWxsfTtJbC5kaXNwbGF5TmFtZT0iUHJlc2VuY2UiO2Z1bmN0aW9uIFpUKGUpe2NvbnN0W3Qsbl09cC51c2VTdGF0ZSgpLHI9cC51c2VSZWYoe30pLG89cC51c2VSZWYoZSksaT1wLnVzZVJlZigibm9uZSIpLGw9ZT8ibW91bnRlZCI6InVubW91bnRlZCIsW3MsYV09SlQobCx7bW91bnRlZDp7VU5NT1VOVDoidW5tb3VudGVkIixBTklNQVRJT05fT1VUOiJ1bm1vdW50U3VzcGVuZGVkIn0sdW5tb3VudFN1c3BlbmRlZDp7TU9VTlQ6Im1vdW50ZWQiLEFOSU1BVElPTl9FTkQ6InVubW91bnRlZCJ9LHVubW91bnRlZDp7TU9VTlQ6Im1vdW50ZWQifX0pO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IHU9Y3Uoci5jdXJyZW50KTtpLmN1cnJlbnQ9cz09PSJtb3VudGVkIj91OiJub25lIn0sW3NdKSwkbigoKT0+e2NvbnN0IHU9ci5jdXJyZW50LGM9by5jdXJyZW50O2lmKGMhPT1lKXtjb25zdCBmPWkuY3VycmVudCxoPWN1KHUpO2U/YSgiTU9VTlQiKTpoPT09Im5vbmUifHwodT09bnVsbD92b2lkIDA6dS5kaXNwbGF5KT09PSJub25lIj9hKCJVTk1PVU5UIik6YShjJiZmIT09aD8iQU5JTUFUSU9OX09VVCI6IlVOTU9VTlQiKSxvLmN1cnJlbnQ9ZX19LFtlLGFdKSwkbigoKT0+e2lmKHQpe2NvbnN0IHU9ZD0+e2NvbnN0IGg9Y3Uoci5jdXJyZW50KS5pbmNsdWRlcyhkLmFuaW1hdGlvbk5hbWUpO2QudGFyZ2V0PT09dCYmaCYmSHIuZmx1c2hTeW5jKCgpPT5hKCJBTklNQVRJT05fRU5EIikpfSxjPWQ9PntkLnRhcmdldD09PXQmJihpLmN1cnJlbnQ9Y3Uoci5jdXJyZW50KSl9O3JldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbnN0YXJ0IixjKSx0LmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmNhbmNlbCIsdSksdC5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLHUpLCgpPT57dC5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25zdGFydCIsYyksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25jYW5jZWwiLHUpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIix1KX19ZWxzZSBhKCJBTklNQVRJT05fRU5EIil9LFt0LGFdKSx7aXNQcmVzZW50OlsibW91bnRlZCIsInVubW91bnRTdXNwZW5kZWQiXS5pbmNsdWRlcyhzKSxyZWY6cC51c2VDYWxsYmFjayh1PT57dSYmKHIuY3VycmVudD1nZXRDb21wdXRlZFN0eWxlKHUpKSxuKHUpfSxbXSl9fWZ1bmN0aW9uIGN1KGUpe3JldHVybihlPT1udWxsP3ZvaWQgMDplLmFuaW1hdGlvbk5hbWUpfHwibm9uZSJ9ZnVuY3Rpb24gJGkoZSx0PVtdKXtsZXQgbj1bXTtmdW5jdGlvbiByKGksbCl7Y29uc3Qgcz1wLmNyZWF0ZUNvbnRleHQobCksYT1uLmxlbmd0aDtuPVsuLi5uLGxdO2Z1bmN0aW9uIHUoZCl7Y29uc3R7c2NvcGU6ZixjaGlsZHJlbjpoLC4uLmd9PWQsbT0oZj09bnVsbD92b2lkIDA6ZltlXVthXSl8fHMsUz1wLnVzZU1lbW8oKCk9PmcsT2JqZWN0LnZhbHVlcyhnKSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChtLlByb3ZpZGVyLHt2YWx1ZTpTfSxoKX1mdW5jdGlvbiBjKGQsZil7Y29uc3QgaD0oZj09bnVsbD92b2lkIDA6ZltlXVthXSl8fHMsZz1wLnVzZUNvbnRleHQoaCk7aWYoZylyZXR1cm4gZztpZihsIT09dm9pZCAwKXJldHVybiBsO3Rocm93IG5ldyBFcnJvcihgXGAke2R9XGAgbXVzdCBiZSB1c2VkIHdpdGhpbiBcYCR7aX1cYGApfXJldHVybiB1LmRpc3BsYXlOYW1lPWkrIlByb3ZpZGVyIixbdSxjXX1jb25zdCBvPSgpPT57Y29uc3QgaT1uLm1hcChsPT5wLmNyZWF0ZUNvbnRleHQobCkpO3JldHVybiBmdW5jdGlvbihzKXtjb25zdCBhPShzPT1udWxsP3ZvaWQgMDpzW2VdKXx8aTtyZXR1cm4gcC51c2VNZW1vKCgpPT4oe1tgX19zY29wZSR7ZX1gXTp7Li4ucyxbZV06YX19KSxbcyxhXSl9fTtyZXR1cm4gby5zY29wZU5hbWU9ZSxbcixxVChvLC4uLnQpXX1mdW5jdGlvbiBxVCguLi5lKXtjb25zdCB0PWVbMF07aWYoZS5sZW5ndGg9PT0xKXJldHVybiB0O2NvbnN0IG49KCk9Pntjb25zdCByPWUubWFwKG89Pih7dXNlU2NvcGU6bygpLHNjb3BlTmFtZTpvLnNjb3BlTmFtZX0pKTtyZXR1cm4gZnVuY3Rpb24oaSl7Y29uc3QgbD1yLnJlZHVjZSgocyx7dXNlU2NvcGU6YSxzY29wZU5hbWU6dX0pPT57Y29uc3QgZD1hKGkpW2BfX3Njb3BlJHt1fWBdO3JldHVybnsuLi5zLC4uLmR9fSx7fSk7cmV0dXJuIHAudXNlTWVtbygoKT0+KHtbYF9fc2NvcGUke3Quc2NvcGVOYW1lfWBdOmx9KSxbbF0pfX07cmV0dXJuIG4uc2NvcGVOYW1lPXQuc2NvcGVOYW1lLG59ZnVuY3Rpb24gVnQoZSl7Y29uc3QgdD1wLnVzZVJlZihlKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pnt0LmN1cnJlbnQ9ZX0pLHAudXNlTWVtbygoKT0+KC4uLm4pPT57dmFyIHI7cmV0dXJuKHI9dC5jdXJyZW50KT09PW51bGx8fHI9PT12b2lkIDA/dm9pZCAwOnIuY2FsbCh0LC4uLm4pfSxbXSl9Y29uc3QgZU49cC5jcmVhdGVDb250ZXh0KHZvaWQgMCk7ZnVuY3Rpb24gYmcoZSl7Y29uc3QgdD1wLnVzZUNvbnRleHQoZU4pO3JldHVybiBlfHx0fHwibHRyIn1mdW5jdGlvbiBBaChlLFt0LG5dKXtyZXR1cm4gTWF0aC5taW4obixNYXRoLm1heCh0LGUpKX1mdW5jdGlvbiBIZShlLHQse2NoZWNrRm9yRGVmYXVsdFByZXZlbnRlZDpuPSEwfT17fSl7cmV0dXJuIGZ1bmN0aW9uKG8pe2lmKGU9PW51bGx8fGUobyksbj09PSExfHwhby5kZWZhdWx0UHJldmVudGVkKXJldHVybiB0PT1udWxsP3ZvaWQgMDp0KG8pfX1mdW5jdGlvbiB0TihlLHQpe3JldHVybiBwLnVzZVJlZHVjZXIoKG4scik9Pntjb25zdCBvPXRbbl1bcl07cmV0dXJuIG8/P259LGUpfWNvbnN0IG1fPSJTY3JvbGxBcmVhIixbdl8sdjRdPSRpKG1fKSxbbk4sV25dPXZfKG1fKSxyTj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2Nyb2xsQXJlYTpuLHR5cGU6cj0iaG92ZXIiLGRpcjpvLHNjcm9sbEhpZGVEZWxheTppPTYwMCwuLi5sfT1lLFtzLGFdPXAudXNlU3RhdGUobnVsbCksW3UsY109cC51c2VTdGF0ZShudWxsKSxbZCxmXT1wLnVzZVN0YXRlKG51bGwpLFtoLGddPXAudXNlU3RhdGUobnVsbCksW20sU109cC51c2VTdGF0ZShudWxsKSxbdix5XT1wLnVzZVN0YXRlKDApLFtfLHddPXAudXNlU3RhdGUoMCksW0MsJF09cC51c2VTdGF0ZSghMSksW0UsVF09cC51c2VTdGF0ZSghMSksTT1YZSh0LGo9PmEoaikpLFI9Ymcobyk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChuTix7c2NvcGU6bix0eXBlOnIsZGlyOlIsc2Nyb2xsSGlkZURlbGF5Omksc2Nyb2xsQXJlYTpzLHZpZXdwb3J0OnUsb25WaWV3cG9ydENoYW5nZTpjLGNvbnRlbnQ6ZCxvbkNvbnRlbnRDaGFuZ2U6ZixzY3JvbGxiYXJYOmgsb25TY3JvbGxiYXJYQ2hhbmdlOmcsc2Nyb2xsYmFyWEVuYWJsZWQ6QyxvblNjcm9sbGJhclhFbmFibGVkQ2hhbmdlOiQsc2Nyb2xsYmFyWTptLG9uU2Nyb2xsYmFyWUNoYW5nZTpTLHNjcm9sbGJhcllFbmFibGVkOkUsb25TY3JvbGxiYXJZRW5hYmxlZENoYW5nZTpULG9uQ29ybmVyV2lkdGhDaGFuZ2U6eSxvbkNvcm5lckhlaWdodENoYW5nZTp3fSxwLmNyZWF0ZUVsZW1lbnQoRGUuZGl2LGVlKHtkaXI6Un0sbCx7cmVmOk0sc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsIi0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLXdpZHRoIjp2KyJweCIsIi0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLWhlaWdodCI6XysicHgiLC4uLmUuc3R5bGV9fSkpKX0pLG9OPSJTY3JvbGxBcmVhVmlld3BvcnQiLGlOPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sY2hpbGRyZW46ciwuLi5vfT1lLGk9V24ob04sbiksbD1wLnVzZVJlZihudWxsKSxzPVhlKHQsbCxpLm9uVmlld3BvcnRDaGFuZ2UpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLHAuY3JlYXRlRWxlbWVudCgic3R5bGUiLHtkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOiJbZGF0YS1yYWRpeC1zY3JvbGwtYXJlYS12aWV3cG9ydF17c2Nyb2xsYmFyLXdpZHRoOm5vbmU7LW1zLW92ZXJmbG93LXN0eWxlOm5vbmU7LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7fVtkYXRhLXJhZGl4LXNjcm9sbC1hcmVhLXZpZXdwb3J0XTo6LXdlYmtpdC1zY3JvbGxiYXJ7ZGlzcGxheTpub25lfSJ9fSkscC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7ImRhdGEtcmFkaXgtc2Nyb2xsLWFyZWEtdmlld3BvcnQiOiIifSxvLHtyZWY6cyxzdHlsZTp7b3ZlcmZsb3dYOmkuc2Nyb2xsYmFyWEVuYWJsZWQ/InNjcm9sbCI6ImhpZGRlbiIsb3ZlcmZsb3dZOmkuc2Nyb2xsYmFyWUVuYWJsZWQ/InNjcm9sbCI6ImhpZGRlbiIsLi4uZS5zdHlsZX19KSxwLmNyZWF0ZUVsZW1lbnQoImRpdiIse3JlZjppLm9uQ29udGVudENoYW5nZSxzdHlsZTp7bWluV2lkdGg6IjEwMCUiLGRpc3BsYXk6InRhYmxlIn19LHIpKSl9KSxLcj0iU2Nyb2xsQXJlYVNjcm9sbGJhciIseV89cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Zm9yY2VNb3VudDpuLC4uLnJ9PWUsbz1XbihLcixlLl9fc2NvcGVTY3JvbGxBcmVhKSx7b25TY3JvbGxiYXJYRW5hYmxlZENoYW5nZTppLG9uU2Nyb2xsYmFyWUVuYWJsZWRDaGFuZ2U6bH09byxzPWUub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT4ocz9pKCEwKTpsKCEwKSwoKT0+e3M/aSghMSk6bCghMSl9KSxbcyxpLGxdKSxvLnR5cGU9PT0iaG92ZXIiP3AuY3JlYXRlRWxlbWVudChsTixlZSh7fSxyLHtyZWY6dCxmb3JjZU1vdW50Om59KSk6by50eXBlPT09InNjcm9sbCI/cC5jcmVhdGVFbGVtZW50KHNOLGVlKHt9LHIse3JlZjp0LGZvcmNlTW91bnQ6bn0pKTpvLnR5cGU9PT0iYXV0byI/cC5jcmVhdGVFbGVtZW50KHhfLGVlKHt9LHIse3JlZjp0LGZvcmNlTW91bnQ6bn0pKTpvLnR5cGU9PT0iYWx3YXlzIj9wLmNyZWF0ZUVsZW1lbnQoUmcsZWUoe30scix7cmVmOnR9KSk6bnVsbH0pLGxOPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e2ZvcmNlTW91bnQ6biwuLi5yfT1lLG89V24oS3IsZS5fX3Njb3BlU2Nyb2xsQXJlYSksW2ksbF09cC51c2VTdGF0ZSghMSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3Qgcz1vLnNjcm9sbEFyZWE7bGV0IGE9MDtpZihzKXtjb25zdCB1PSgpPT57d2luZG93LmNsZWFyVGltZW91dChhKSxsKCEwKX0sYz0oKT0+e2E9d2luZG93LnNldFRpbWVvdXQoKCk9PmwoITEpLG8uc2Nyb2xsSGlkZURlbGF5KX07cmV0dXJuIHMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmVudGVyIix1KSxzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJsZWF2ZSIsYyksKCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KGEpLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmVudGVyIix1KSxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJsZWF2ZSIsYyl9fX0sW28uc2Nyb2xsQXJlYSxvLnNjcm9sbEhpZGVEZWxheV0pLHAuY3JlYXRlRWxlbWVudChJbCx7cHJlc2VudDpufHxpfSxwLmNyZWF0ZUVsZW1lbnQoeF8sZWUoeyJkYXRhLXN0YXRlIjppPyJ2aXNpYmxlIjoiaGlkZGVuIn0scix7cmVmOnR9KSkpfSksc049cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Zm9yY2VNb3VudDpuLC4uLnJ9PWUsbz1XbihLcixlLl9fc2NvcGVTY3JvbGxBcmVhKSxpPWUub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCIsbD1zZCgoKT0+YSgiU0NST0xMX0VORCIpLDEwMCksW3MsYV09dE4oImhpZGRlbiIse2hpZGRlbjp7U0NST0xMOiJzY3JvbGxpbmcifSxzY3JvbGxpbmc6e1NDUk9MTF9FTkQ6ImlkbGUiLFBPSU5URVJfRU5URVI6ImludGVyYWN0aW5nIn0saW50ZXJhY3Rpbmc6e1NDUk9MTDoiaW50ZXJhY3RpbmciLFBPSU5URVJfTEVBVkU6ImlkbGUifSxpZGxlOntISURFOiJoaWRkZW4iLFNDUk9MTDoic2Nyb2xsaW5nIixQT0lOVEVSX0VOVEVSOiJpbnRlcmFjdGluZyJ9fSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57aWYocz09PSJpZGxlIil7Y29uc3QgdT13aW5kb3cuc2V0VGltZW91dCgoKT0+YSgiSElERSIpLG8uc2Nyb2xsSGlkZURlbGF5KTtyZXR1cm4oKT0+d2luZG93LmNsZWFyVGltZW91dCh1KX19LFtzLG8uc2Nyb2xsSGlkZURlbGF5LGFdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IHU9by52aWV3cG9ydCxjPWk/InNjcm9sbExlZnQiOiJzY3JvbGxUb3AiO2lmKHUpe2xldCBkPXVbY107Y29uc3QgZj0oKT0+e2NvbnN0IGg9dVtjXTtkIT09aCYmKGEoIlNDUk9MTCIpLGwoKSksZD1ofTtyZXR1cm4gdS5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGYpLCgpPT51LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZil9fSxbby52aWV3cG9ydCxpLGEsbF0pLHAuY3JlYXRlRWxlbWVudChJbCx7cHJlc2VudDpufHxzIT09ImhpZGRlbiJ9LHAuY3JlYXRlRWxlbWVudChSZyxlZSh7ImRhdGEtc3RhdGUiOnM9PT0iaGlkZGVuIj8iaGlkZGVuIjoidmlzaWJsZSJ9LHIse3JlZjp0LG9uUG9pbnRlckVudGVyOkhlKGUub25Qb2ludGVyRW50ZXIsKCk9PmEoIlBPSU5URVJfRU5URVIiKSksb25Qb2ludGVyTGVhdmU6SGUoZS5vblBvaW50ZXJMZWF2ZSwoKT0+YSgiUE9JTlRFUl9MRUFWRSIpKX0pKSl9KSx4Xz1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdCBuPVduKEtyLGUuX19zY29wZVNjcm9sbEFyZWEpLHtmb3JjZU1vdW50OnIsLi4ub309ZSxbaSxsXT1wLnVzZVN0YXRlKCExKSxzPWUub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCIsYT1zZCgoKT0+e2lmKG4udmlld3BvcnQpe2NvbnN0IHU9bi52aWV3cG9ydC5vZmZzZXRXaWR0aDxuLnZpZXdwb3J0LnNjcm9sbFdpZHRoLGM9bi52aWV3cG9ydC5vZmZzZXRIZWlnaHQ8bi52aWV3cG9ydC5zY3JvbGxIZWlnaHQ7bChzP3U6Yyl9fSwxMCk7cmV0dXJuIGtsKG4udmlld3BvcnQsYSksa2wobi5jb250ZW50LGEpLHAuY3JlYXRlRWxlbWVudChJbCx7cHJlc2VudDpyfHxpfSxwLmNyZWF0ZUVsZW1lbnQoUmcsZWUoeyJkYXRhLXN0YXRlIjppPyJ2aXNpYmxlIjoiaGlkZGVuIn0sbyx7cmVmOnR9KSkpfSksUmc9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7b3JpZW50YXRpb246bj0idmVydGljYWwiLC4uLnJ9PWUsbz1XbihLcixlLl9fc2NvcGVTY3JvbGxBcmVhKSxpPXAudXNlUmVmKG51bGwpLGw9cC51c2VSZWYoMCksW3MsYV09cC51c2VTdGF0ZSh7Y29udGVudDowLHZpZXdwb3J0OjAsc2Nyb2xsYmFyOntzaXplOjAscGFkZGluZ1N0YXJ0OjAscGFkZGluZ0VuZDowfX0pLHU9Q18ocy52aWV3cG9ydCxzLmNvbnRlbnQpLGM9ey4uLnIsc2l6ZXM6cyxvblNpemVzQ2hhbmdlOmEsaGFzVGh1bWI6dT4wJiZ1PDEsb25UaHVtYkNoYW5nZTpmPT5pLmN1cnJlbnQ9ZixvblRodW1iUG9pbnRlclVwOigpPT5sLmN1cnJlbnQ9MCxvblRodW1iUG9pbnRlckRvd246Zj0+bC5jdXJyZW50PWZ9O2Z1bmN0aW9uIGQoZixoKXtyZXR1cm4gZ04oZixsLmN1cnJlbnQscyxoKX1yZXR1cm4gbj09PSJob3Jpem9udGFsIj9wLmNyZWF0ZUVsZW1lbnQoYU4sZWUoe30sYyx7cmVmOnQsb25UaHVtYlBvc2l0aW9uQ2hhbmdlOigpPT57aWYoby52aWV3cG9ydCYmaS5jdXJyZW50KXtjb25zdCBmPW8udmlld3BvcnQuc2Nyb2xsTGVmdCxoPXJ5KGYscyxvLmRpcik7aS5jdXJyZW50LnN0eWxlLnRyYW5zZm9ybT1gdHJhbnNsYXRlM2QoJHtofXB4LCAwLCAwKWB9fSxvbldoZWVsU2Nyb2xsOmY9PntvLnZpZXdwb3J0JiYoby52aWV3cG9ydC5zY3JvbGxMZWZ0PWYpfSxvbkRyYWdTY3JvbGw6Zj0+e28udmlld3BvcnQmJihvLnZpZXdwb3J0LnNjcm9sbExlZnQ9ZChmLG8uZGlyKSl9fSkpOm49PT0idmVydGljYWwiP3AuY3JlYXRlRWxlbWVudCh1TixlZSh7fSxjLHtyZWY6dCxvblRodW1iUG9zaXRpb25DaGFuZ2U6KCk9PntpZihvLnZpZXdwb3J0JiZpLmN1cnJlbnQpe2NvbnN0IGY9by52aWV3cG9ydC5zY3JvbGxUb3AsaD1yeShmLHMpO2kuY3VycmVudC5zdHlsZS50cmFuc2Zvcm09YHRyYW5zbGF0ZTNkKDAsICR7aH1weCwgMClgfX0sb25XaGVlbFNjcm9sbDpmPT57by52aWV3cG9ydCYmKG8udmlld3BvcnQuc2Nyb2xsVG9wPWYpfSxvbkRyYWdTY3JvbGw6Zj0+e28udmlld3BvcnQmJihvLnZpZXdwb3J0LnNjcm9sbFRvcD1kKGYpKX19KSk6bnVsbH0pLGFOPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e3NpemVzOm4sb25TaXplc0NoYW5nZTpyLC4uLm99PWUsaT1XbihLcixlLl9fc2NvcGVTY3JvbGxBcmVhKSxbbCxzXT1wLnVzZVN0YXRlKCksYT1wLnVzZVJlZihudWxsKSx1PVhlKHQsYSxpLm9uU2Nyb2xsYmFyWENoYW5nZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57YS5jdXJyZW50JiZzKGdldENvbXB1dGVkU3R5bGUoYS5jdXJyZW50KSl9LFthXSkscC5jcmVhdGVFbGVtZW50KHdfLGVlKHsiZGF0YS1vcmllbnRhdGlvbiI6Imhvcml6b250YWwifSxvLHtyZWY6dSxzaXplczpuLHN0eWxlOntib3R0b206MCxsZWZ0OmkuZGlyPT09InJ0bCI/InZhcigtLXJhZGl4LXNjcm9sbC1hcmVhLWNvcm5lci13aWR0aCkiOjAscmlnaHQ6aS5kaXI9PT0ibHRyIj8idmFyKC0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLXdpZHRoKSI6MCwiLS1yYWRpeC1zY3JvbGwtYXJlYS10aHVtYi13aWR0aCI6bGQobikrInB4IiwuLi5lLnN0eWxlfSxvblRodW1iUG9pbnRlckRvd246Yz0+ZS5vblRodW1iUG9pbnRlckRvd24oYy54KSxvbkRyYWdTY3JvbGw6Yz0+ZS5vbkRyYWdTY3JvbGwoYy54KSxvbldoZWVsU2Nyb2xsOihjLGQpPT57aWYoaS52aWV3cG9ydCl7Y29uc3QgZj1pLnZpZXdwb3J0LnNjcm9sbExlZnQrYy5kZWx0YVg7ZS5vbldoZWVsU2Nyb2xsKGYpLCRfKGYsZCkmJmMucHJldmVudERlZmF1bHQoKX19LG9uUmVzaXplOigpPT57YS5jdXJyZW50JiZpLnZpZXdwb3J0JiZsJiZyKHtjb250ZW50Omkudmlld3BvcnQuc2Nyb2xsV2lkdGgsdmlld3BvcnQ6aS52aWV3cG9ydC5vZmZzZXRXaWR0aCxzY3JvbGxiYXI6e3NpemU6YS5jdXJyZW50LmNsaWVudFdpZHRoLHBhZGRpbmdTdGFydDpnYyhsLnBhZGRpbmdMZWZ0KSxwYWRkaW5nRW5kOmdjKGwucGFkZGluZ1JpZ2h0KX19KX19KSl9KSx1Tj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtzaXplczpuLG9uU2l6ZXNDaGFuZ2U6ciwuLi5vfT1lLGk9V24oS3IsZS5fX3Njb3BlU2Nyb2xsQXJlYSksW2wsc109cC51c2VTdGF0ZSgpLGE9cC51c2VSZWYobnVsbCksdT1YZSh0LGEsaS5vblNjcm9sbGJhcllDaGFuZ2UpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2EuY3VycmVudCYmcyhnZXRDb21wdXRlZFN0eWxlKGEuY3VycmVudCkpfSxbYV0pLHAuY3JlYXRlRWxlbWVudCh3XyxlZSh7ImRhdGEtb3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCJ9LG8se3JlZjp1LHNpemVzOm4sc3R5bGU6e3RvcDowLHJpZ2h0OmkuZGlyPT09Imx0ciI/MDp2b2lkIDAsbGVmdDppLmRpcj09PSJydGwiPzA6dm9pZCAwLGJvdHRvbToidmFyKC0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLWhlaWdodCkiLCItLXJhZGl4LXNjcm9sbC1hcmVhLXRodW1iLWhlaWdodCI6bGQobikrInB4IiwuLi5lLnN0eWxlfSxvblRodW1iUG9pbnRlckRvd246Yz0+ZS5vblRodW1iUG9pbnRlckRvd24oYy55KSxvbkRyYWdTY3JvbGw6Yz0+ZS5vbkRyYWdTY3JvbGwoYy55KSxvbldoZWVsU2Nyb2xsOihjLGQpPT57aWYoaS52aWV3cG9ydCl7Y29uc3QgZj1pLnZpZXdwb3J0LnNjcm9sbFRvcCtjLmRlbHRhWTtlLm9uV2hlZWxTY3JvbGwoZiksJF8oZixkKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sb25SZXNpemU6KCk9PnthLmN1cnJlbnQmJmkudmlld3BvcnQmJmwmJnIoe2NvbnRlbnQ6aS52aWV3cG9ydC5zY3JvbGxIZWlnaHQsdmlld3BvcnQ6aS52aWV3cG9ydC5vZmZzZXRIZWlnaHQsc2Nyb2xsYmFyOntzaXplOmEuY3VycmVudC5jbGllbnRIZWlnaHQscGFkZGluZ1N0YXJ0OmdjKGwucGFkZGluZ1RvcCkscGFkZGluZ0VuZDpnYyhsLnBhZGRpbmdCb3R0b20pfX0pfX0pKX0pLFtjTixfX109dl8oS3IpLHdfPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sc2l6ZXM6cixoYXNUaHVtYjpvLG9uVGh1bWJDaGFuZ2U6aSxvblRodW1iUG9pbnRlclVwOmwsb25UaHVtYlBvaW50ZXJEb3duOnMsb25UaHVtYlBvc2l0aW9uQ2hhbmdlOmEsb25EcmFnU2Nyb2xsOnUsb25XaGVlbFNjcm9sbDpjLG9uUmVzaXplOmQsLi4uZn09ZSxoPVduKEtyLG4pLFtnLG1dPXAudXNlU3RhdGUobnVsbCksUz1YZSh0LE09Pm0oTSkpLHY9cC51c2VSZWYobnVsbCkseT1wLnVzZVJlZigiIiksXz1oLnZpZXdwb3J0LHc9ci5jb250ZW50LXIudmlld3BvcnQsQz1WdChjKSwkPVZ0KGEpLEU9c2QoZCwxMCk7ZnVuY3Rpb24gVChNKXtpZih2LmN1cnJlbnQpe2NvbnN0IFI9TS5jbGllbnRYLXYuY3VycmVudC5sZWZ0LGo9TS5jbGllbnRZLXYuY3VycmVudC50b3A7dSh7eDpSLHk6an0pfX1yZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBNPVI9Pntjb25zdCBqPVIudGFyZ2V0OyhnPT1udWxsP3ZvaWQgMDpnLmNvbnRhaW5zKGopKSYmQyhSLHcpfTtyZXR1cm4gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLE0se3Bhc3NpdmU6ITF9KSwoKT0+ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2hlZWwiLE0se3Bhc3NpdmU6ITF9KX0sW18sZyx3LENdKSxwLnVzZUVmZmVjdCgkLFtyLCRdKSxrbChnLEUpLGtsKGguY29udGVudCxFKSxwLmNyZWF0ZUVsZW1lbnQoY04se3Njb3BlOm4sc2Nyb2xsYmFyOmcsaGFzVGh1bWI6byxvblRodW1iQ2hhbmdlOlZ0KGkpLG9uVGh1bWJQb2ludGVyVXA6VnQobCksb25UaHVtYlBvc2l0aW9uQ2hhbmdlOiQsb25UaHVtYlBvaW50ZXJEb3duOlZ0KHMpfSxwLmNyZWF0ZUVsZW1lbnQoRGUuZGl2LGVlKHt9LGYse3JlZjpTLHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLC4uLmYuc3R5bGV9LG9uUG9pbnRlckRvd246SGUoZS5vblBvaW50ZXJEb3duLE09PntNLmJ1dHRvbj09PTAmJihNLnRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShNLnBvaW50ZXJJZCksdi5jdXJyZW50PWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseS5jdXJyZW50PWRvY3VtZW50LmJvZHkuc3R5bGUud2Via2l0VXNlclNlbGVjdCxkb2N1bWVudC5ib2R5LnN0eWxlLndlYmtpdFVzZXJTZWxlY3Q9Im5vbmUiLGgudmlld3BvcnQmJihoLnZpZXdwb3J0LnN0eWxlLnNjcm9sbEJlaGF2aW9yPSJhdXRvIiksVChNKSl9KSxvblBvaW50ZXJNb3ZlOkhlKGUub25Qb2ludGVyTW92ZSxUKSxvblBvaW50ZXJVcDpIZShlLm9uUG9pbnRlclVwLE09Pntjb25zdCBSPU0udGFyZ2V0O1IuaGFzUG9pbnRlckNhcHR1cmUoTS5wb2ludGVySWQpJiZSLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShNLnBvaW50ZXJJZCksZG9jdW1lbnQuYm9keS5zdHlsZS53ZWJraXRVc2VyU2VsZWN0PXkuY3VycmVudCxoLnZpZXdwb3J0JiYoaC52aWV3cG9ydC5zdHlsZS5zY3JvbGxCZWhhdmlvcj0iIiksdi5jdXJyZW50PW51bGx9KX0pKSl9KSxNaD0iU2Nyb2xsQXJlYVRodW1iIixkTj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtmb3JjZU1vdW50Om4sLi4ucn09ZSxvPV9fKE1oLGUuX19zY29wZVNjcm9sbEFyZWEpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoSWwse3ByZXNlbnQ6bnx8by5oYXNUaHVtYn0scC5jcmVhdGVFbGVtZW50KGZOLGVlKHtyZWY6dH0scikpKX0pLGZOPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sc3R5bGU6ciwuLi5vfT1lLGk9V24oTWgsbiksbD1fXyhNaCxuKSx7b25UaHVtYlBvc2l0aW9uQ2hhbmdlOnN9PWwsYT1YZSh0LGQ9Pmwub25UaHVtYkNoYW5nZShkKSksdT1wLnVzZVJlZigpLGM9c2QoKCk9Pnt1LmN1cnJlbnQmJih1LmN1cnJlbnQoKSx1LmN1cnJlbnQ9dm9pZCAwKX0sMTAwKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBkPWkudmlld3BvcnQ7aWYoZCl7Y29uc3QgZj0oKT0+e2lmKGMoKSwhdS5jdXJyZW50KXtjb25zdCBoPW1OKGQscyk7dS5jdXJyZW50PWgscygpfX07cmV0dXJuIHMoKSxkLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZiksKCk9PmQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmKX19LFtpLnZpZXdwb3J0LGMsc10pLHAuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoeyJkYXRhLXN0YXRlIjpsLmhhc1RodW1iPyJ2aXNpYmxlIjoiaGlkZGVuIn0sbyx7cmVmOmEsc3R5bGU6e3dpZHRoOiJ2YXIoLS1yYWRpeC1zY3JvbGwtYXJlYS10aHVtYi13aWR0aCkiLGhlaWdodDoidmFyKC0tcmFkaXgtc2Nyb2xsLWFyZWEtdGh1bWItaGVpZ2h0KSIsLi4ucn0sb25Qb2ludGVyRG93bkNhcHR1cmU6SGUoZS5vblBvaW50ZXJEb3duQ2FwdHVyZSxkPT57Y29uc3QgaD1kLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxnPWQuY2xpZW50WC1oLmxlZnQsbT1kLmNsaWVudFktaC50b3A7bC5vblRodW1iUG9pbnRlckRvd24oe3g6Zyx5Om19KX0pLG9uUG9pbnRlclVwOkhlKGUub25Qb2ludGVyVXAsbC5vblRodW1iUG9pbnRlclVwKX0pKX0pLFNfPSJTY3JvbGxBcmVhQ29ybmVyIixoTj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdCBuPVduKFNfLGUuX19zY29wZVNjcm9sbEFyZWEpLHI9ISEobi5zY3JvbGxiYXJYJiZuLnNjcm9sbGJhclkpO3JldHVybiBuLnR5cGUhPT0ic2Nyb2xsIiYmcj9wLmNyZWF0ZUVsZW1lbnQocE4sZWUoe30sZSx7cmVmOnR9KSk6bnVsbH0pLHBOPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sLi4ucn09ZSxvPVduKFNfLG4pLFtpLGxdPXAudXNlU3RhdGUoMCksW3MsYV09cC51c2VTdGF0ZSgwKSx1PSEhKGkmJnMpO3JldHVybiBrbChvLnNjcm9sbGJhclgsKCk9Pnt2YXIgYztjb25zdCBkPSgoYz1vLnNjcm9sbGJhclgpPT09bnVsbHx8Yz09PXZvaWQgMD92b2lkIDA6Yy5vZmZzZXRIZWlnaHQpfHwwO28ub25Db3JuZXJIZWlnaHRDaGFuZ2UoZCksYShkKX0pLGtsKG8uc2Nyb2xsYmFyWSwoKT0+e3ZhciBjO2NvbnN0IGQ9KChjPW8uc2Nyb2xsYmFyWSk9PT1udWxsfHxjPT09dm9pZCAwP3ZvaWQgMDpjLm9mZnNldFdpZHRoKXx8MDtvLm9uQ29ybmVyV2lkdGhDaGFuZ2UoZCksbChkKX0pLHU/cC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7fSxyLHtyZWY6dCxzdHlsZTp7d2lkdGg6aSxoZWlnaHQ6cyxwb3NpdGlvbjoiYWJzb2x1dGUiLHJpZ2h0Om8uZGlyPT09Imx0ciI/MDp2b2lkIDAsbGVmdDpvLmRpcj09PSJydGwiPzA6dm9pZCAwLGJvdHRvbTowLC4uLmUuc3R5bGV9fSkpOm51bGx9KTtmdW5jdGlvbiBnYyhlKXtyZXR1cm4gZT9wYXJzZUludChlLDEwKTowfWZ1bmN0aW9uIENfKGUsdCl7Y29uc3Qgbj1lL3Q7cmV0dXJuIGlzTmFOKG4pPzA6bn1mdW5jdGlvbiBsZChlKXtjb25zdCB0PUNfKGUudmlld3BvcnQsZS5jb250ZW50KSxuPWUuc2Nyb2xsYmFyLnBhZGRpbmdTdGFydCtlLnNjcm9sbGJhci5wYWRkaW5nRW5kLHI9KGUuc2Nyb2xsYmFyLnNpemUtbikqdDtyZXR1cm4gTWF0aC5tYXgociwxOCl9ZnVuY3Rpb24gZ04oZSx0LG4scj0ibHRyIil7Y29uc3Qgbz1sZChuKSxpPW8vMixsPXR8fGkscz1vLWwsYT1uLnNjcm9sbGJhci5wYWRkaW5nU3RhcnQrbCx1PW4uc2Nyb2xsYmFyLnNpemUtbi5zY3JvbGxiYXIucGFkZGluZ0VuZC1zLGM9bi5jb250ZW50LW4udmlld3BvcnQsZD1yPT09Imx0ciI/WzAsY106W2MqLTEsMF07cmV0dXJuIEVfKFthLHVdLGQpKGUpfWZ1bmN0aW9uIHJ5KGUsdCxuPSJsdHIiKXtjb25zdCByPWxkKHQpLG89dC5zY3JvbGxiYXIucGFkZGluZ1N0YXJ0K3Quc2Nyb2xsYmFyLnBhZGRpbmdFbmQsaT10LnNjcm9sbGJhci5zaXplLW8sbD10LmNvbnRlbnQtdC52aWV3cG9ydCxzPWktcixhPW49PT0ibHRyIj9bMCxsXTpbbCotMSwwXSx1PUFoKGUsYSk7cmV0dXJuIEVfKFswLGxdLFswLHNdKSh1KX1mdW5jdGlvbiBFXyhlLHQpe3JldHVybiBuPT57aWYoZVswXT09PWVbMV18fHRbMF09PT10WzFdKXJldHVybiB0WzBdO2NvbnN0IHI9KHRbMV0tdFswXSkvKGVbMV0tZVswXSk7cmV0dXJuIHRbMF0rcioobi1lWzBdKX19ZnVuY3Rpb24gJF8oZSx0KXtyZXR1cm4gZT4wJiZlPHR9Y29uc3QgbU49KGUsdD0oKT0+e30pPT57bGV0IG49e2xlZnQ6ZS5zY3JvbGxMZWZ0LHRvcDplLnNjcm9sbFRvcH0scj0wO3JldHVybiBmdW5jdGlvbiBvKCl7Y29uc3QgaT17bGVmdDplLnNjcm9sbExlZnQsdG9wOmUuc2Nyb2xsVG9wfSxsPW4ubGVmdCE9PWkubGVmdCxzPW4udG9wIT09aS50b3A7KGx8fHMpJiZ0KCksbj1pLHI9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShvKX0oKSwoKT0+d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHIpfTtmdW5jdGlvbiBzZChlLHQpe2NvbnN0IG49VnQoZSkscj1wLnVzZVJlZigwKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PigpPT53aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCksW10pLHAudXNlQ2FsbGJhY2soKCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCksci5jdXJyZW50PXdpbmRvdy5zZXRUaW1lb3V0KG4sdCl9LFtuLHRdKX1mdW5jdGlvbiBrbChlLHQpe2NvbnN0IG49VnQodCk7JG4oKCk9PntsZXQgcj0wO2lmKGUpe2NvbnN0IG89bmV3IFJlc2l6ZU9ic2VydmVyKCgpPT57Y2FuY2VsQW5pbWF0aW9uRnJhbWUocikscj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKG4pfSk7cmV0dXJuIG8ub2JzZXJ2ZShlKSwoKT0+e3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShyKSxvLnVub2JzZXJ2ZShlKX19fSxbZSxuXSl9Y29uc3Qga189ck4sdk49aU4seU49aE47ZnVuY3Rpb24gVF8oZSl7dmFyIHQsbixyPSIiO2lmKHR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJudW1iZXIiKXIrPWU7ZWxzZSBpZih0eXBlb2YgZT09Im9iamVjdCIpaWYoQXJyYXkuaXNBcnJheShlKSlmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0mJihuPVRfKGVbdF0pKSYmKHImJihyKz0iICIpLHIrPW4pO2Vsc2UgZm9yKHQgaW4gZSllW3RdJiYociYmKHIrPSIgIikscis9dCk7cmV0dXJuIHJ9ZnVuY3Rpb24geE4oKXtmb3IodmFyIGUsdCxuPTAscj0iIjtuPGFyZ3VtZW50cy5sZW5ndGg7KShlPWFyZ3VtZW50c1tuKytdKSYmKHQ9VF8oZSkpJiYociYmKHIrPSIgIikscis9dCk7cmV0dXJuIHJ9Y29uc3QgUGc9Ii0iO2Z1bmN0aW9uIF9OKGUpe2NvbnN0IHQ9U04oZSkse2NvbmZsaWN0aW5nQ2xhc3NHcm91cHM6bixjb25mbGljdGluZ0NsYXNzR3JvdXBNb2RpZmllcnM6cn09ZTtmdW5jdGlvbiBvKGwpe2NvbnN0IHM9bC5zcGxpdChQZyk7cmV0dXJuIHNbMF09PT0iIiYmcy5sZW5ndGghPT0xJiZzLnNoaWZ0KCksTl8ocyx0KXx8d04obCl9ZnVuY3Rpb24gaShsLHMpe2NvbnN0IGE9bltsXXx8W107cmV0dXJuIHMmJnJbbF0/Wy4uLmEsLi4ucltsXV06YX1yZXR1cm57Z2V0Q2xhc3NHcm91cElkOm8sZ2V0Q29uZmxpY3RpbmdDbGFzc0dyb3VwSWRzOml9fWZ1bmN0aW9uIE5fKGUsdCl7dmFyIGw7aWYoZS5sZW5ndGg9PT0wKXJldHVybiB0LmNsYXNzR3JvdXBJZDtjb25zdCBuPWVbMF0scj10Lm5leHRQYXJ0LmdldChuKSxvPXI/Tl8oZS5zbGljZSgxKSxyKTp2b2lkIDA7aWYobylyZXR1cm4gbztpZih0LnZhbGlkYXRvcnMubGVuZ3RoPT09MClyZXR1cm47Y29uc3QgaT1lLmpvaW4oUGcpO3JldHVybihsPXQudmFsaWRhdG9ycy5maW5kKCh7dmFsaWRhdG9yOnN9KT0+cyhpKSkpPT1udWxsP3ZvaWQgMDpsLmNsYXNzR3JvdXBJZH1jb25zdCBveT0vXlxbKC4rKVxdJC87ZnVuY3Rpb24gd04oZSl7aWYob3kudGVzdChlKSl7Y29uc3QgdD1veS5leGVjKGUpWzFdLG49dD09bnVsbD92b2lkIDA6dC5zdWJzdHJpbmcoMCx0LmluZGV4T2YoIjoiKSk7aWYobilyZXR1cm4iYXJiaXRyYXJ5Li4iK259fWZ1bmN0aW9uIFNOKGUpe2NvbnN0e3RoZW1lOnQscHJlZml4Om59PWUscj17bmV4dFBhcnQ6bmV3IE1hcCx2YWxpZGF0b3JzOltdfTtyZXR1cm4gRU4oT2JqZWN0LmVudHJpZXMoZS5jbGFzc0dyb3VwcyksbikuZm9yRWFjaCgoW2ksbF0pPT57RGgobCxyLGksdCl9KSxyfWZ1bmN0aW9uIERoKGUsdCxuLHIpe2UuZm9yRWFjaChvPT57aWYodHlwZW9mIG89PSJzdHJpbmciKXtjb25zdCBpPW89PT0iIj90Oml5KHQsbyk7aS5jbGFzc0dyb3VwSWQ9bjtyZXR1cm59aWYodHlwZW9mIG89PSJmdW5jdGlvbiIpe2lmKENOKG8pKXtEaChvKHIpLHQsbixyKTtyZXR1cm59dC52YWxpZGF0b3JzLnB1c2goe3ZhbGlkYXRvcjpvLGNsYXNzR3JvdXBJZDpufSk7cmV0dXJufU9iamVjdC5lbnRyaWVzKG8pLmZvckVhY2goKFtpLGxdKT0+e0RoKGwsaXkodCxpKSxuLHIpfSl9KX1mdW5jdGlvbiBpeShlLHQpe2xldCBuPWU7cmV0dXJuIHQuc3BsaXQoUGcpLmZvckVhY2gocj0+e24ubmV4dFBhcnQuaGFzKHIpfHxuLm5leHRQYXJ0LnNldChyLHtuZXh0UGFydDpuZXcgTWFwLHZhbGlkYXRvcnM6W119KSxuPW4ubmV4dFBhcnQuZ2V0KHIpfSksbn1mdW5jdGlvbiBDTihlKXtyZXR1cm4gZS5pc1RoZW1lR2V0dGVyfWZ1bmN0aW9uIEVOKGUsdCl7cmV0dXJuIHQ/ZS5tYXAoKFtuLHJdKT0+e2NvbnN0IG89ci5tYXAoaT0+dHlwZW9mIGk9PSJzdHJpbmciP3QraTp0eXBlb2YgaT09Im9iamVjdCI/T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGkpLm1hcCgoW2wsc10pPT5bdCtsLHNdKSk6aSk7cmV0dXJuW24sb119KTplfWZ1bmN0aW9uICROKGUpe2lmKGU8MSlyZXR1cm57Z2V0OigpPT57fSxzZXQ6KCk9Pnt9fTtsZXQgdD0wLG49bmV3IE1hcCxyPW5ldyBNYXA7ZnVuY3Rpb24gbyhpLGwpe24uc2V0KGksbCksdCsrLHQ+ZSYmKHQ9MCxyPW4sbj1uZXcgTWFwKX1yZXR1cm57Z2V0KGkpe2xldCBsPW4uZ2V0KGkpO2lmKGwhPT12b2lkIDApcmV0dXJuIGw7aWYoKGw9ci5nZXQoaSkpIT09dm9pZCAwKXJldHVybiBvKGksbCksbH0sc2V0KGksbCl7bi5oYXMoaSk/bi5zZXQoaSxsKTpvKGksbCl9fX1jb25zdCBiXz0iISI7ZnVuY3Rpb24ga04oZSl7Y29uc3QgdD1lLnNlcGFyYXRvcixuPXQubGVuZ3RoPT09MSxyPXRbMF0sbz10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24obCl7Y29uc3Qgcz1bXTtsZXQgYT0wLHU9MCxjO2ZvcihsZXQgbT0wO208bC5sZW5ndGg7bSsrKXtsZXQgUz1sW21dO2lmKGE9PT0wKXtpZihTPT09ciYmKG58fGwuc2xpY2UobSxtK28pPT09dCkpe3MucHVzaChsLnNsaWNlKHUsbSkpLHU9bStvO2NvbnRpbnVlfWlmKFM9PT0iLyIpe2M9bTtjb250aW51ZX19Uz09PSJbIj9hKys6Uz09PSJdIiYmYS0tfWNvbnN0IGQ9cy5sZW5ndGg9PT0wP2w6bC5zdWJzdHJpbmcodSksZj1kLnN0YXJ0c1dpdGgoYl8pLGg9Zj9kLnN1YnN0cmluZygxKTpkLGc9YyYmYz51P2MtdTp2b2lkIDA7cmV0dXJue21vZGlmaWVyczpzLGhhc0ltcG9ydGFudE1vZGlmaWVyOmYsYmFzZUNsYXNzTmFtZTpoLG1heWJlUG9zdGZpeE1vZGlmaWVyUG9zaXRpb246Z319fWZ1bmN0aW9uIFROKGUpe2lmKGUubGVuZ3RoPD0xKXJldHVybiBlO2NvbnN0IHQ9W107bGV0IG49W107cmV0dXJuIGUuZm9yRWFjaChyPT57clswXT09PSJbIj8odC5wdXNoKC4uLm4uc29ydCgpLHIpLG49W10pOm4ucHVzaChyKX0pLHQucHVzaCguLi5uLnNvcnQoKSksdH1mdW5jdGlvbiBOTihlKXtyZXR1cm57Y2FjaGU6JE4oZS5jYWNoZVNpemUpLHNwbGl0TW9kaWZpZXJzOmtOKGUpLC4uLl9OKGUpfX1jb25zdCBiTj0vXHMrLztmdW5jdGlvbiBSTihlLHQpe2NvbnN0e3NwbGl0TW9kaWZpZXJzOm4sZ2V0Q2xhc3NHcm91cElkOnIsZ2V0Q29uZmxpY3RpbmdDbGFzc0dyb3VwSWRzOm99PXQsaT1uZXcgU2V0O3JldHVybiBlLnRyaW0oKS5zcGxpdChiTikubWFwKGw9Pntjb25zdHttb2RpZmllcnM6cyxoYXNJbXBvcnRhbnRNb2RpZmllcjphLGJhc2VDbGFzc05hbWU6dSxtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uOmN9PW4obCk7bGV0IGQ9cihjP3Uuc3Vic3RyaW5nKDAsYyk6dSksZj0hIWM7aWYoIWQpe2lmKCFjKXJldHVybntpc1RhaWx3aW5kQ2xhc3M6ITEsb3JpZ2luYWxDbGFzc05hbWU6bH07aWYoZD1yKHUpLCFkKXJldHVybntpc1RhaWx3aW5kQ2xhc3M6ITEsb3JpZ2luYWxDbGFzc05hbWU6bH07Zj0hMX1jb25zdCBoPVROKHMpLmpvaW4oIjoiKTtyZXR1cm57aXNUYWlsd2luZENsYXNzOiEwLG1vZGlmaWVySWQ6YT9oK2JfOmgsY2xhc3NHcm91cElkOmQsb3JpZ2luYWxDbGFzc05hbWU6bCxoYXNQb3N0Zml4TW9kaWZpZXI6Zn19KS5yZXZlcnNlKCkuZmlsdGVyKGw9PntpZighbC5pc1RhaWx3aW5kQ2xhc3MpcmV0dXJuITA7Y29uc3R7bW9kaWZpZXJJZDpzLGNsYXNzR3JvdXBJZDphLGhhc1Bvc3RmaXhNb2RpZmllcjp1fT1sLGM9cythO3JldHVybiBpLmhhcyhjKT8hMTooaS5hZGQoYyksbyhhLHUpLmZvckVhY2goZD0+aS5hZGQocytkKSksITApfSkucmV2ZXJzZSgpLm1hcChsPT5sLm9yaWdpbmFsQ2xhc3NOYW1lKS5qb2luKCIgIil9ZnVuY3Rpb24gUE4oKXtsZXQgZT0wLHQsbixyPSIiO2Zvcig7ZTxhcmd1bWVudHMubGVuZ3RoOykodD1hcmd1bWVudHNbZSsrXSkmJihuPVJfKHQpKSYmKHImJihyKz0iICIpLHIrPW4pO3JldHVybiByfWZ1bmN0aW9uIFJfKGUpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIilyZXR1cm4gZTtsZXQgdCxuPSIiO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0mJih0PVJfKGVbcl0pKSYmKG4mJihuKz0iICIpLG4rPXQpO3JldHVybiBufWZ1bmN0aW9uIE9OKGUsLi4udCl7bGV0IG4scixvLGk9bDtmdW5jdGlvbiBsKGEpe2NvbnN0IHU9dC5yZWR1Y2UoKGMsZCk9PmQoYyksZSgpKTtyZXR1cm4gbj1OTih1KSxyPW4uY2FjaGUuZ2V0LG89bi5jYWNoZS5zZXQsaT1zLHMoYSl9ZnVuY3Rpb24gcyhhKXtjb25zdCB1PXIoYSk7aWYodSlyZXR1cm4gdTtjb25zdCBjPVJOKGEsbik7cmV0dXJuIG8oYSxjKSxjfXJldHVybiBmdW5jdGlvbigpe3JldHVybiBpKFBOLmFwcGx5KG51bGwsYXJndW1lbnRzKSl9fWZ1bmN0aW9uIFdlKGUpe2NvbnN0IHQ9bj0+bltlXXx8W107cmV0dXJuIHQuaXNUaGVtZUdldHRlcj0hMCx0fWNvbnN0IFBfPS9eXFsoPzooW2Etei1dKyk6KT8oLispXF0kL2ksQU49L15cZCtcL1xkKyQvLE1OPW5ldyBTZXQoWyJweCIsImZ1bGwiLCJzY3JlZW4iXSksRE49L14oXGQrKFwuXGQrKT8pPyh4c3xzbXxtZHxsZ3x4bCkkLyxMTj0vXGQrKCV8cHh8cj9lbXxbc2RsXT92KFtod2liXXxtaW58bWF4KXxwdHxwY3xpbnxjbXxtbXxjYXB8Y2h8ZXh8cj9saHxjcSh3fGh8aXxifG1pbnxtYXgpKXxcYihjYWxjfG1pbnxtYXh8Y2xhbXApXCguK1wpfF4wJC8sSU49L14tPygoXGQrKT9cLj8oXGQrKVthLXpdK3wwKV8tPygoXGQrKT9cLj8oXGQrKVthLXpdK3wwKS8sak49L14odXJsfGltYWdlfGltYWdlLXNldHxjcm9zcy1mYWRlfGVsZW1lbnR8KHJlcGVhdGluZy0pPyhsaW5lYXJ8cmFkaWFsfGNvbmljKS1ncmFkaWVudClcKC4rXCkkLztmdW5jdGlvbiBIbihlKXtyZXR1cm4gcW8oZSl8fE1OLmhhcyhlKXx8QU4udGVzdChlKX1mdW5jdGlvbiB0byhlKXtyZXR1cm4gamwoZSwibGVuZ3RoIixLTil9ZnVuY3Rpb24gcW8oZSl7cmV0dXJuISFlJiYhTnVtYmVyLmlzTmFOKE51bWJlcihlKSl9ZnVuY3Rpb24gZHUoZSl7cmV0dXJuIGpsKGUsIm51bWJlciIscW8pfWZ1bmN0aW9uIHVzKGUpe3JldHVybiEhZSYmTnVtYmVyLmlzSW50ZWdlcihOdW1iZXIoZSkpfWZ1bmN0aW9uIHpOKGUpe3JldHVybiBlLmVuZHNXaXRoKCIlIikmJnFvKGUuc2xpY2UoMCwtMSkpfWZ1bmN0aW9uIHZlKGUpe3JldHVybiBQXy50ZXN0KGUpfWZ1bmN0aW9uIG5vKGUpe3JldHVybiBETi50ZXN0KGUpfWNvbnN0IEZOPW5ldyBTZXQoWyJsZW5ndGgiLCJzaXplIiwicGVyY2VudGFnZSJdKTtmdW5jdGlvbiBCTihlKXtyZXR1cm4gamwoZSxGTixPXyl9ZnVuY3Rpb24gV04oZSl7cmV0dXJuIGpsKGUsInBvc2l0aW9uIixPXyl9Y29uc3QgVU49bmV3IFNldChbImltYWdlIiwidXJsIl0pO2Z1bmN0aW9uIFZOKGUpe3JldHVybiBqbChlLFVOLFlOKX1mdW5jdGlvbiBITihlKXtyZXR1cm4gamwoZSwiIixHTil9ZnVuY3Rpb24gY3MoKXtyZXR1cm4hMH1mdW5jdGlvbiBqbChlLHQsbil7Y29uc3Qgcj1QXy5leGVjKGUpO3JldHVybiByP3JbMV0/dHlwZW9mIHQ9PSJzdHJpbmciP3JbMV09PT10OnQuaGFzKHJbMV0pOm4oclsyXSk6ITF9ZnVuY3Rpb24gS04oZSl7cmV0dXJuIExOLnRlc3QoZSl9ZnVuY3Rpb24gT18oKXtyZXR1cm4hMX1mdW5jdGlvbiBHTihlKXtyZXR1cm4gSU4udGVzdChlKX1mdW5jdGlvbiBZTihlKXtyZXR1cm4gak4udGVzdChlKX1mdW5jdGlvbiBYTigpe2NvbnN0IGU9V2UoImNvbG9ycyIpLHQ9V2UoInNwYWNpbmciKSxuPVdlKCJibHVyIikscj1XZSgiYnJpZ2h0bmVzcyIpLG89V2UoImJvcmRlckNvbG9yIiksaT1XZSgiYm9yZGVyUmFkaXVzIiksbD1XZSgiYm9yZGVyU3BhY2luZyIpLHM9V2UoImJvcmRlcldpZHRoIiksYT1XZSgiY29udHJhc3QiKSx1PVdlKCJncmF5c2NhbGUiKSxjPVdlKCJodWVSb3RhdGUiKSxkPVdlKCJpbnZlcnQiKSxmPVdlKCJnYXAiKSxoPVdlKCJncmFkaWVudENvbG9yU3RvcHMiKSxnPVdlKCJncmFkaWVudENvbG9yU3RvcFBvc2l0aW9ucyIpLG09V2UoImluc2V0IiksUz1XZSgibWFyZ2luIiksdj1XZSgib3BhY2l0eSIpLHk9V2UoInBhZGRpbmciKSxfPVdlKCJzYXR1cmF0ZSIpLHc9V2UoInNjYWxlIiksQz1XZSgic2VwaWEiKSwkPVdlKCJza2V3IiksRT1XZSgic3BhY2UiKSxUPVdlKCJ0cmFuc2xhdGUiKSxNPSgpPT5bImF1dG8iLCJjb250YWluIiwibm9uZSJdLFI9KCk9PlsiYXV0byIsImhpZGRlbiIsImNsaXAiLCJ2aXNpYmxlIiwic2Nyb2xsIl0saj0oKT0+WyJhdXRvIix2ZSx0XSxGPSgpPT5bdmUsdF0sYWU9KCk9PlsiIixIbix0b10sSD0oKT0+WyJhdXRvIixxbyx2ZV0sWD0oKT0+WyJib3R0b20iLCJjZW50ZXIiLCJsZWZ0IiwibGVmdC1ib3R0b20iLCJsZWZ0LXRvcCIsInJpZ2h0IiwicmlnaHQtYm90dG9tIiwicmlnaHQtdG9wIiwidG9wIl0sUD0oKT0+WyJzb2xpZCIsImRhc2hlZCIsImRvdHRlZCIsImRvdWJsZSIsIm5vbmUiXSxPPSgpPT5bIm5vcm1hbCIsIm11bHRpcGx5Iiwic2NyZWVuIiwib3ZlcmxheSIsImRhcmtlbiIsImxpZ2h0ZW4iLCJjb2xvci1kb2RnZSIsImNvbG9yLWJ1cm4iLCJoYXJkLWxpZ2h0Iiwic29mdC1saWdodCIsImRpZmZlcmVuY2UiLCJleGNsdXNpb24iLCJodWUiLCJzYXR1cmF0aW9uIiwiY29sb3IiLCJsdW1pbm9zaXR5IiwicGx1cy1saWdodGVyIl0saz0oKT0+WyJzdGFydCIsImVuZCIsImNlbnRlciIsImJldHdlZW4iLCJhcm91bmQiLCJldmVubHkiLCJzdHJldGNoIl0sST0oKT0+WyIiLCIwIix2ZV0sTD0oKT0+WyJhdXRvIiwiYXZvaWQiLCJhbGwiLCJhdm9pZC1wYWdlIiwicGFnZSIsImxlZnQiLCJyaWdodCIsImNvbHVtbiJdLFY9KCk9PltxbyxkdV0sdGU9KCk9Pltxbyx2ZV07cmV0dXJue2NhY2hlU2l6ZTo1MDAsc2VwYXJhdG9yOiI6Iix0aGVtZTp7Y29sb3JzOltjc10sc3BhY2luZzpbSG4sdG9dLGJsdXI6WyJub25lIiwiIixubyx2ZV0sYnJpZ2h0bmVzczpWKCksYm9yZGVyQ29sb3I6W2VdLGJvcmRlclJhZGl1czpbIm5vbmUiLCIiLCJmdWxsIixubyx2ZV0sYm9yZGVyU3BhY2luZzpGKCksYm9yZGVyV2lkdGg6YWUoKSxjb250cmFzdDpWKCksZ3JheXNjYWxlOkkoKSxodWVSb3RhdGU6dGUoKSxpbnZlcnQ6SSgpLGdhcDpGKCksZ3JhZGllbnRDb2xvclN0b3BzOltlXSxncmFkaWVudENvbG9yU3RvcFBvc2l0aW9uczpbek4sdG9dLGluc2V0OmooKSxtYXJnaW46aigpLG9wYWNpdHk6VigpLHBhZGRpbmc6RigpLHNhdHVyYXRlOlYoKSxzY2FsZTpWKCksc2VwaWE6SSgpLHNrZXc6dGUoKSxzcGFjZTpGKCksdHJhbnNsYXRlOkYoKX0sY2xhc3NHcm91cHM6e2FzcGVjdDpbe2FzcGVjdDpbImF1dG8iLCJzcXVhcmUiLCJ2aWRlbyIsdmVdfV0sY29udGFpbmVyOlsiY29udGFpbmVyIl0sY29sdW1uczpbe2NvbHVtbnM6W25vXX1dLCJicmVhay1hZnRlciI6W3siYnJlYWstYWZ0ZXIiOkwoKX1dLCJicmVhay1iZWZvcmUiOlt7ImJyZWFrLWJlZm9yZSI6TCgpfV0sImJyZWFrLWluc2lkZSI6W3siYnJlYWstaW5zaWRlIjpbImF1dG8iLCJhdm9pZCIsImF2b2lkLXBhZ2UiLCJhdm9pZC1jb2x1bW4iXX1dLCJib3gtZGVjb3JhdGlvbiI6W3siYm94LWRlY29yYXRpb24iOlsic2xpY2UiLCJjbG9uZSJdfV0sYm94Olt7Ym94OlsiYm9yZGVyIiwiY29udGVudCJdfV0sZGlzcGxheTpbImJsb2NrIiwiaW5saW5lLWJsb2NrIiwiaW5saW5lIiwiZmxleCIsImlubGluZS1mbGV4IiwidGFibGUiLCJpbmxpbmUtdGFibGUiLCJ0YWJsZS1jYXB0aW9uIiwidGFibGUtY2VsbCIsInRhYmxlLWNvbHVtbiIsInRhYmxlLWNvbHVtbi1ncm91cCIsInRhYmxlLWZvb3Rlci1ncm91cCIsInRhYmxlLWhlYWRlci1ncm91cCIsInRhYmxlLXJvdy1ncm91cCIsInRhYmxlLXJvdyIsImZsb3ctcm9vdCIsImdyaWQiLCJpbmxpbmUtZ3JpZCIsImNvbnRlbnRzIiwibGlzdC1pdGVtIiwiaGlkZGVuIl0sZmxvYXQ6W3tmbG9hdDpbInJpZ2h0IiwibGVmdCIsIm5vbmUiXX1dLGNsZWFyOlt7Y2xlYXI6WyJsZWZ0IiwicmlnaHQiLCJib3RoIiwibm9uZSJdfV0saXNvbGF0aW9uOlsiaXNvbGF0ZSIsImlzb2xhdGlvbi1hdXRvIl0sIm9iamVjdC1maXQiOlt7b2JqZWN0OlsiY29udGFpbiIsImNvdmVyIiwiZmlsbCIsIm5vbmUiLCJzY2FsZS1kb3duIl19XSwib2JqZWN0LXBvc2l0aW9uIjpbe29iamVjdDpbLi4uWCgpLHZlXX1dLG92ZXJmbG93Olt7b3ZlcmZsb3c6UigpfV0sIm92ZXJmbG93LXgiOlt7Im92ZXJmbG93LXgiOlIoKX1dLCJvdmVyZmxvdy15IjpbeyJvdmVyZmxvdy15IjpSKCl9XSxvdmVyc2Nyb2xsOlt7b3ZlcnNjcm9sbDpNKCl9XSwib3ZlcnNjcm9sbC14IjpbeyJvdmVyc2Nyb2xsLXgiOk0oKX1dLCJvdmVyc2Nyb2xsLXkiOlt7Im92ZXJzY3JvbGwteSI6TSgpfV0scG9zaXRpb246WyJzdGF0aWMiLCJmaXhlZCIsImFic29sdXRlIiwicmVsYXRpdmUiLCJzdGlja3kiXSxpbnNldDpbe2luc2V0OlttXX1dLCJpbnNldC14IjpbeyJpbnNldC14IjpbbV19XSwiaW5zZXQteSI6W3siaW5zZXQteSI6W21dfV0sc3RhcnQ6W3tzdGFydDpbbV19XSxlbmQ6W3tlbmQ6W21dfV0sdG9wOlt7dG9wOlttXX1dLHJpZ2h0Olt7cmlnaHQ6W21dfV0sYm90dG9tOlt7Ym90dG9tOlttXX1dLGxlZnQ6W3tsZWZ0OlttXX1dLHZpc2liaWxpdHk6WyJ2aXNpYmxlIiwiaW52aXNpYmxlIiwiY29sbGFwc2UiXSx6Olt7ejpbImF1dG8iLHVzLHZlXX1dLGJhc2lzOlt7YmFzaXM6aigpfV0sImZsZXgtZGlyZWN0aW9uIjpbe2ZsZXg6WyJyb3ciLCJyb3ctcmV2ZXJzZSIsImNvbCIsImNvbC1yZXZlcnNlIl19XSwiZmxleC13cmFwIjpbe2ZsZXg6WyJ3cmFwIiwid3JhcC1yZXZlcnNlIiwibm93cmFwIl19XSxmbGV4Olt7ZmxleDpbIjEiLCJhdXRvIiwiaW5pdGlhbCIsIm5vbmUiLHZlXX1dLGdyb3c6W3tncm93OkkoKX1dLHNocmluazpbe3NocmluazpJKCl9XSxvcmRlcjpbe29yZGVyOlsiZmlyc3QiLCJsYXN0Iiwibm9uZSIsdXMsdmVdfV0sImdyaWQtY29scyI6W3siZ3JpZC1jb2xzIjpbY3NdfV0sImNvbC1zdGFydC1lbmQiOlt7Y29sOlsiYXV0byIse3NwYW46WyJmdWxsIix1cyx2ZV19LHZlXX1dLCJjb2wtc3RhcnQiOlt7ImNvbC1zdGFydCI6SCgpfV0sImNvbC1lbmQiOlt7ImNvbC1lbmQiOkgoKX1dLCJncmlkLXJvd3MiOlt7ImdyaWQtcm93cyI6W2NzXX1dLCJyb3ctc3RhcnQtZW5kIjpbe3JvdzpbImF1dG8iLHtzcGFuOlt1cyx2ZV19LHZlXX1dLCJyb3ctc3RhcnQiOlt7InJvdy1zdGFydCI6SCgpfV0sInJvdy1lbmQiOlt7InJvdy1lbmQiOkgoKX1dLCJncmlkLWZsb3ciOlt7ImdyaWQtZmxvdyI6WyJyb3ciLCJjb2wiLCJkZW5zZSIsInJvdy1kZW5zZSIsImNvbC1kZW5zZSJdfV0sImF1dG8tY29scyI6W3siYXV0by1jb2xzIjpbImF1dG8iLCJtaW4iLCJtYXgiLCJmciIsdmVdfV0sImF1dG8tcm93cyI6W3siYXV0by1yb3dzIjpbImF1dG8iLCJtaW4iLCJtYXgiLCJmciIsdmVdfV0sZ2FwOlt7Z2FwOltmXX1dLCJnYXAteCI6W3siZ2FwLXgiOltmXX1dLCJnYXAteSI6W3siZ2FwLXkiOltmXX1dLCJqdXN0aWZ5LWNvbnRlbnQiOlt7anVzdGlmeTpbIm5vcm1hbCIsLi4uaygpXX1dLCJqdXN0aWZ5LWl0ZW1zIjpbeyJqdXN0aWZ5LWl0ZW1zIjpbInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwic3RyZXRjaCJdfV0sImp1c3RpZnktc2VsZiI6W3sianVzdGlmeS1zZWxmIjpbImF1dG8iLCJzdGFydCIsImVuZCIsImNlbnRlciIsInN0cmV0Y2giXX1dLCJhbGlnbi1jb250ZW50Ijpbe2NvbnRlbnQ6WyJub3JtYWwiLC4uLmsoKSwiYmFzZWxpbmUiXX1dLCJhbGlnbi1pdGVtcyI6W3tpdGVtczpbInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwiYmFzZWxpbmUiLCJzdHJldGNoIl19XSwiYWxpZ24tc2VsZiI6W3tzZWxmOlsiYXV0byIsInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwic3RyZXRjaCIsImJhc2VsaW5lIl19XSwicGxhY2UtY29udGVudCI6W3sicGxhY2UtY29udGVudCI6Wy4uLmsoKSwiYmFzZWxpbmUiXX1dLCJwbGFjZS1pdGVtcyI6W3sicGxhY2UtaXRlbXMiOlsic3RhcnQiLCJlbmQiLCJjZW50ZXIiLCJiYXNlbGluZSIsInN0cmV0Y2giXX1dLCJwbGFjZS1zZWxmIjpbeyJwbGFjZS1zZWxmIjpbImF1dG8iLCJzdGFydCIsImVuZCIsImNlbnRlciIsInN0cmV0Y2giXX1dLHA6W3twOlt5XX1dLHB4Olt7cHg6W3ldfV0scHk6W3tweTpbeV19XSxwczpbe3BzOlt5XX1dLHBlOlt7cGU6W3ldfV0scHQ6W3twdDpbeV19XSxwcjpbe3ByOlt5XX1dLHBiOlt7cGI6W3ldfV0scGw6W3twbDpbeV19XSxtOlt7bTpbU119XSxteDpbe214OltTXX1dLG15Olt7bXk6W1NdfV0sbXM6W3ttczpbU119XSxtZTpbe21lOltTXX1dLG10Olt7bXQ6W1NdfV0sbXI6W3ttcjpbU119XSxtYjpbe21iOltTXX1dLG1sOlt7bWw6W1NdfV0sInNwYWNlLXgiOlt7InNwYWNlLXgiOltFXX1dLCJzcGFjZS14LXJldmVyc2UiOlsic3BhY2UteC1yZXZlcnNlIl0sInNwYWNlLXkiOlt7InNwYWNlLXkiOltFXX1dLCJzcGFjZS15LXJldmVyc2UiOlsic3BhY2UteS1yZXZlcnNlIl0sdzpbe3c6WyJhdXRvIiwibWluIiwibWF4IiwiZml0Iix2ZSx0XX1dLCJtaW4tdyI6W3sibWluLXciOlsibWluIiwibWF4IiwiZml0Iix2ZSxIbl19XSwibWF4LXciOlt7Im1heC13IjpbIjAiLCJub25lIiwiZnVsbCIsIm1pbiIsIm1heCIsImZpdCIsInByb3NlIix7c2NyZWVuOltub119LG5vLHZlXX1dLGg6W3toOlt2ZSx0LCJhdXRvIiwibWluIiwibWF4IiwiZml0Il19XSwibWluLWgiOlt7Im1pbi1oIjpbIm1pbiIsIm1heCIsImZpdCIsSG4sdmVdfV0sIm1heC1oIjpbeyJtYXgtaCI6W3ZlLHQsIm1pbiIsIm1heCIsImZpdCJdfV0sImZvbnQtc2l6ZSI6W3t0ZXh0OlsiYmFzZSIsbm8sdG9dfV0sImZvbnQtc21vb3RoaW5nIjpbImFudGlhbGlhc2VkIiwic3VicGl4ZWwtYW50aWFsaWFzZWQiXSwiZm9udC1zdHlsZSI6WyJpdGFsaWMiLCJub3QtaXRhbGljIl0sImZvbnQtd2VpZ2h0Ijpbe2ZvbnQ6WyJ0aGluIiwiZXh0cmFsaWdodCIsImxpZ2h0Iiwibm9ybWFsIiwibWVkaXVtIiwic2VtaWJvbGQiLCJib2xkIiwiZXh0cmFib2xkIiwiYmxhY2siLGR1XX1dLCJmb250LWZhbWlseSI6W3tmb250Oltjc119XSwiZnZuLW5vcm1hbCI6WyJub3JtYWwtbnVtcyJdLCJmdm4tb3JkaW5hbCI6WyJvcmRpbmFsIl0sImZ2bi1zbGFzaGVkLXplcm8iOlsic2xhc2hlZC16ZXJvIl0sImZ2bi1maWd1cmUiOlsibGluaW5nLW51bXMiLCJvbGRzdHlsZS1udW1zIl0sImZ2bi1zcGFjaW5nIjpbInByb3BvcnRpb25hbC1udW1zIiwidGFidWxhci1udW1zIl0sImZ2bi1mcmFjdGlvbiI6WyJkaWFnb25hbC1mcmFjdGlvbnMiLCJzdGFja2VkLWZyYWN0b25zIl0sdHJhY2tpbmc6W3t0cmFja2luZzpbInRpZ2h0ZXIiLCJ0aWdodCIsIm5vcm1hbCIsIndpZGUiLCJ3aWRlciIsIndpZGVzdCIsdmVdfV0sImxpbmUtY2xhbXAiOlt7ImxpbmUtY2xhbXAiOlsibm9uZSIscW8sZHVdfV0sbGVhZGluZzpbe2xlYWRpbmc6WyJub25lIiwidGlnaHQiLCJzbnVnIiwibm9ybWFsIiwicmVsYXhlZCIsImxvb3NlIixIbix2ZV19XSwibGlzdC1pbWFnZSI6W3sibGlzdC1pbWFnZSI6WyJub25lIix2ZV19XSwibGlzdC1zdHlsZS10eXBlIjpbe2xpc3Q6WyJub25lIiwiZGlzYyIsImRlY2ltYWwiLHZlXX1dLCJsaXN0LXN0eWxlLXBvc2l0aW9uIjpbe2xpc3Q6WyJpbnNpZGUiLCJvdXRzaWRlIl19XSwicGxhY2Vob2xkZXItY29sb3IiOlt7cGxhY2Vob2xkZXI6W2VdfV0sInBsYWNlaG9sZGVyLW9wYWNpdHkiOlt7InBsYWNlaG9sZGVyLW9wYWNpdHkiOlt2XX1dLCJ0ZXh0LWFsaWdubWVudCI6W3t0ZXh0OlsibGVmdCIsImNlbnRlciIsInJpZ2h0IiwianVzdGlmeSIsInN0YXJ0IiwiZW5kIl19XSwidGV4dC1jb2xvciI6W3t0ZXh0OltlXX1dLCJ0ZXh0LW9wYWNpdHkiOlt7InRleHQtb3BhY2l0eSI6W3ZdfV0sInRleHQtZGVjb3JhdGlvbiI6WyJ1bmRlcmxpbmUiLCJvdmVybGluZSIsImxpbmUtdGhyb3VnaCIsIm5vLXVuZGVybGluZSJdLCJ0ZXh0LWRlY29yYXRpb24tc3R5bGUiOlt7ZGVjb3JhdGlvbjpbLi4uUCgpLCJ3YXZ5Il19XSwidGV4dC1kZWNvcmF0aW9uLXRoaWNrbmVzcyI6W3tkZWNvcmF0aW9uOlsiYXV0byIsImZyb20tZm9udCIsSG4sdG9dfV0sInVuZGVybGluZS1vZmZzZXQiOlt7InVuZGVybGluZS1vZmZzZXQiOlsiYXV0byIsSG4sdmVdfV0sInRleHQtZGVjb3JhdGlvbi1jb2xvciI6W3tkZWNvcmF0aW9uOltlXX1dLCJ0ZXh0LXRyYW5zZm9ybSI6WyJ1cHBlcmNhc2UiLCJsb3dlcmNhc2UiLCJjYXBpdGFsaXplIiwibm9ybWFsLWNhc2UiXSwidGV4dC1vdmVyZmxvdyI6WyJ0cnVuY2F0ZSIsInRleHQtZWxsaXBzaXMiLCJ0ZXh0LWNsaXAiXSxpbmRlbnQ6W3tpbmRlbnQ6RigpfV0sInZlcnRpY2FsLWFsaWduIjpbe2FsaWduOlsiYmFzZWxpbmUiLCJ0b3AiLCJtaWRkbGUiLCJib3R0b20iLCJ0ZXh0LXRvcCIsInRleHQtYm90dG9tIiwic3ViIiwic3VwZXIiLHZlXX1dLHdoaXRlc3BhY2U6W3t3aGl0ZXNwYWNlOlsibm9ybWFsIiwibm93cmFwIiwicHJlIiwicHJlLWxpbmUiLCJwcmUtd3JhcCIsImJyZWFrLXNwYWNlcyJdfV0sYnJlYWs6W3ticmVhazpbIm5vcm1hbCIsIndvcmRzIiwiYWxsIiwia2VlcCJdfV0saHlwaGVuczpbe2h5cGhlbnM6WyJub25lIiwibWFudWFsIiwiYXV0byJdfV0sY29udGVudDpbe2NvbnRlbnQ6WyJub25lIix2ZV19XSwiYmctYXR0YWNobWVudCI6W3tiZzpbImZpeGVkIiwibG9jYWwiLCJzY3JvbGwiXX1dLCJiZy1jbGlwIjpbeyJiZy1jbGlwIjpbImJvcmRlciIsInBhZGRpbmciLCJjb250ZW50IiwidGV4dCJdfV0sImJnLW9wYWNpdHkiOlt7ImJnLW9wYWNpdHkiOlt2XX1dLCJiZy1vcmlnaW4iOlt7ImJnLW9yaWdpbiI6WyJib3JkZXIiLCJwYWRkaW5nIiwiY29udGVudCJdfV0sImJnLXBvc2l0aW9uIjpbe2JnOlsuLi5YKCksV05dfV0sImJnLXJlcGVhdCI6W3tiZzpbIm5vLXJlcGVhdCIse3JlcGVhdDpbIiIsIngiLCJ5Iiwicm91bmQiLCJzcGFjZSJdfV19XSwiYmctc2l6ZSI6W3tiZzpbImF1dG8iLCJjb3ZlciIsImNvbnRhaW4iLEJOXX1dLCJiZy1pbWFnZSI6W3tiZzpbIm5vbmUiLHsiZ3JhZGllbnQtdG8iOlsidCIsInRyIiwiciIsImJyIiwiYiIsImJsIiwibCIsInRsIl19LFZOXX1dLCJiZy1jb2xvciI6W3tiZzpbZV19XSwiZ3JhZGllbnQtZnJvbS1wb3MiOlt7ZnJvbTpbZ119XSwiZ3JhZGllbnQtdmlhLXBvcyI6W3t2aWE6W2ddfV0sImdyYWRpZW50LXRvLXBvcyI6W3t0bzpbZ119XSwiZ3JhZGllbnQtZnJvbSI6W3tmcm9tOltoXX1dLCJncmFkaWVudC12aWEiOlt7dmlhOltoXX1dLCJncmFkaWVudC10byI6W3t0bzpbaF19XSxyb3VuZGVkOlt7cm91bmRlZDpbaV19XSwicm91bmRlZC1zIjpbeyJyb3VuZGVkLXMiOltpXX1dLCJyb3VuZGVkLWUiOlt7InJvdW5kZWQtZSI6W2ldfV0sInJvdW5kZWQtdCI6W3sicm91bmRlZC10IjpbaV19XSwicm91bmRlZC1yIjpbeyJyb3VuZGVkLXIiOltpXX1dLCJyb3VuZGVkLWIiOlt7InJvdW5kZWQtYiI6W2ldfV0sInJvdW5kZWQtbCI6W3sicm91bmRlZC1sIjpbaV19XSwicm91bmRlZC1zcyI6W3sicm91bmRlZC1zcyI6W2ldfV0sInJvdW5kZWQtc2UiOlt7InJvdW5kZWQtc2UiOltpXX1dLCJyb3VuZGVkLWVlIjpbeyJyb3VuZGVkLWVlIjpbaV19XSwicm91bmRlZC1lcyI6W3sicm91bmRlZC1lcyI6W2ldfV0sInJvdW5kZWQtdGwiOlt7InJvdW5kZWQtdGwiOltpXX1dLCJyb3VuZGVkLXRyIjpbeyJyb3VuZGVkLXRyIjpbaV19XSwicm91bmRlZC1iciI6W3sicm91bmRlZC1iciI6W2ldfV0sInJvdW5kZWQtYmwiOlt7InJvdW5kZWQtYmwiOltpXX1dLCJib3JkZXItdyI6W3tib3JkZXI6W3NdfV0sImJvcmRlci13LXgiOlt7ImJvcmRlci14Ijpbc119XSwiYm9yZGVyLXcteSI6W3siYm9yZGVyLXkiOltzXX1dLCJib3JkZXItdy1zIjpbeyJib3JkZXItcyI6W3NdfV0sImJvcmRlci13LWUiOlt7ImJvcmRlci1lIjpbc119XSwiYm9yZGVyLXctdCI6W3siYm9yZGVyLXQiOltzXX1dLCJib3JkZXItdy1yIjpbeyJib3JkZXItciI6W3NdfV0sImJvcmRlci13LWIiOlt7ImJvcmRlci1iIjpbc119XSwiYm9yZGVyLXctbCI6W3siYm9yZGVyLWwiOltzXX1dLCJib3JkZXItb3BhY2l0eSI6W3siYm9yZGVyLW9wYWNpdHkiOlt2XX1dLCJib3JkZXItc3R5bGUiOlt7Ym9yZGVyOlsuLi5QKCksImhpZGRlbiJdfV0sImRpdmlkZS14IjpbeyJkaXZpZGUteCI6W3NdfV0sImRpdmlkZS14LXJldmVyc2UiOlsiZGl2aWRlLXgtcmV2ZXJzZSJdLCJkaXZpZGUteSI6W3siZGl2aWRlLXkiOltzXX1dLCJkaXZpZGUteS1yZXZlcnNlIjpbImRpdmlkZS15LXJldmVyc2UiXSwiZGl2aWRlLW9wYWNpdHkiOlt7ImRpdmlkZS1vcGFjaXR5Ijpbdl19XSwiZGl2aWRlLXN0eWxlIjpbe2RpdmlkZTpQKCl9XSwiYm9yZGVyLWNvbG9yIjpbe2JvcmRlcjpbb119XSwiYm9yZGVyLWNvbG9yLXgiOlt7ImJvcmRlci14Ijpbb119XSwiYm9yZGVyLWNvbG9yLXkiOlt7ImJvcmRlci15Ijpbb119XSwiYm9yZGVyLWNvbG9yLXQiOlt7ImJvcmRlci10Ijpbb119XSwiYm9yZGVyLWNvbG9yLXIiOlt7ImJvcmRlci1yIjpbb119XSwiYm9yZGVyLWNvbG9yLWIiOlt7ImJvcmRlci1iIjpbb119XSwiYm9yZGVyLWNvbG9yLWwiOlt7ImJvcmRlci1sIjpbb119XSwiZGl2aWRlLWNvbG9yIjpbe2RpdmlkZTpbb119XSwib3V0bGluZS1zdHlsZSI6W3tvdXRsaW5lOlsiIiwuLi5QKCldfV0sIm91dGxpbmUtb2Zmc2V0IjpbeyJvdXRsaW5lLW9mZnNldCI6W0huLHZlXX1dLCJvdXRsaW5lLXciOlt7b3V0bGluZTpbSG4sdG9dfV0sIm91dGxpbmUtY29sb3IiOlt7b3V0bGluZTpbZV19XSwicmluZy13Ijpbe3Jpbmc6YWUoKX1dLCJyaW5nLXctaW5zZXQiOlsicmluZy1pbnNldCJdLCJyaW5nLWNvbG9yIjpbe3Jpbmc6W2VdfV0sInJpbmctb3BhY2l0eSI6W3sicmluZy1vcGFjaXR5Ijpbdl19XSwicmluZy1vZmZzZXQtdyI6W3sicmluZy1vZmZzZXQiOltIbix0b119XSwicmluZy1vZmZzZXQtY29sb3IiOlt7InJpbmctb2Zmc2V0IjpbZV19XSxzaGFkb3c6W3tzaGFkb3c6WyIiLCJpbm5lciIsIm5vbmUiLG5vLEhOXX1dLCJzaGFkb3ctY29sb3IiOlt7c2hhZG93Oltjc119XSxvcGFjaXR5Olt7b3BhY2l0eTpbdl19XSwibWl4LWJsZW5kIjpbeyJtaXgtYmxlbmQiOk8oKX1dLCJiZy1ibGVuZCI6W3siYmctYmxlbmQiOk8oKX1dLGZpbHRlcjpbe2ZpbHRlcjpbIiIsIm5vbmUiXX1dLGJsdXI6W3tibHVyOltuXX1dLGJyaWdodG5lc3M6W3ticmlnaHRuZXNzOltyXX1dLGNvbnRyYXN0Olt7Y29udHJhc3Q6W2FdfV0sImRyb3Atc2hhZG93IjpbeyJkcm9wLXNoYWRvdyI6WyIiLCJub25lIixubyx2ZV19XSxncmF5c2NhbGU6W3tncmF5c2NhbGU6W3VdfV0sImh1ZS1yb3RhdGUiOlt7Imh1ZS1yb3RhdGUiOltjXX1dLGludmVydDpbe2ludmVydDpbZF19XSxzYXR1cmF0ZTpbe3NhdHVyYXRlOltfXX1dLHNlcGlhOlt7c2VwaWE6W0NdfV0sImJhY2tkcm9wLWZpbHRlciI6W3siYmFja2Ryb3AtZmlsdGVyIjpbIiIsIm5vbmUiXX1dLCJiYWNrZHJvcC1ibHVyIjpbeyJiYWNrZHJvcC1ibHVyIjpbbl19XSwiYmFja2Ryb3AtYnJpZ2h0bmVzcyI6W3siYmFja2Ryb3AtYnJpZ2h0bmVzcyI6W3JdfV0sImJhY2tkcm9wLWNvbnRyYXN0IjpbeyJiYWNrZHJvcC1jb250cmFzdCI6W2FdfV0sImJhY2tkcm9wLWdyYXlzY2FsZSI6W3siYmFja2Ryb3AtZ3JheXNjYWxlIjpbdV19XSwiYmFja2Ryb3AtaHVlLXJvdGF0ZSI6W3siYmFja2Ryb3AtaHVlLXJvdGF0ZSI6W2NdfV0sImJhY2tkcm9wLWludmVydCI6W3siYmFja2Ryb3AtaW52ZXJ0IjpbZF19XSwiYmFja2Ryb3Atb3BhY2l0eSI6W3siYmFja2Ryb3Atb3BhY2l0eSI6W3ZdfV0sImJhY2tkcm9wLXNhdHVyYXRlIjpbeyJiYWNrZHJvcC1zYXR1cmF0ZSI6W19dfV0sImJhY2tkcm9wLXNlcGlhIjpbeyJiYWNrZHJvcC1zZXBpYSI6W0NdfV0sImJvcmRlci1jb2xsYXBzZSI6W3tib3JkZXI6WyJjb2xsYXBzZSIsInNlcGFyYXRlIl19XSwiYm9yZGVyLXNwYWNpbmciOlt7ImJvcmRlci1zcGFjaW5nIjpbbF19XSwiYm9yZGVyLXNwYWNpbmcteCI6W3siYm9yZGVyLXNwYWNpbmcteCI6W2xdfV0sImJvcmRlci1zcGFjaW5nLXkiOlt7ImJvcmRlci1zcGFjaW5nLXkiOltsXX1dLCJ0YWJsZS1sYXlvdXQiOlt7dGFibGU6WyJhdXRvIiwiZml4ZWQiXX1dLGNhcHRpb246W3tjYXB0aW9uOlsidG9wIiwiYm90dG9tIl19XSx0cmFuc2l0aW9uOlt7dHJhbnNpdGlvbjpbIm5vbmUiLCJhbGwiLCIiLCJjb2xvcnMiLCJvcGFjaXR5Iiwic2hhZG93IiwidHJhbnNmb3JtIix2ZV19XSxkdXJhdGlvbjpbe2R1cmF0aW9uOnRlKCl9XSxlYXNlOlt7ZWFzZTpbImxpbmVhciIsImluIiwib3V0IiwiaW4tb3V0Iix2ZV19XSxkZWxheTpbe2RlbGF5OnRlKCl9XSxhbmltYXRlOlt7YW5pbWF0ZTpbIm5vbmUiLCJzcGluIiwicGluZyIsInB1bHNlIiwiYm91bmNlIix2ZV19XSx0cmFuc2Zvcm06W3t0cmFuc2Zvcm06WyIiLCJncHUiLCJub25lIl19XSxzY2FsZTpbe3NjYWxlOlt3XX1dLCJzY2FsZS14IjpbeyJzY2FsZS14Ijpbd119XSwic2NhbGUteSI6W3sic2NhbGUteSI6W3ddfV0scm90YXRlOlt7cm90YXRlOlt1cyx2ZV19XSwidHJhbnNsYXRlLXgiOlt7InRyYW5zbGF0ZS14IjpbVF19XSwidHJhbnNsYXRlLXkiOlt7InRyYW5zbGF0ZS15IjpbVF19XSwic2tldy14IjpbeyJza2V3LXgiOlskXX1dLCJza2V3LXkiOlt7InNrZXcteSI6WyRdfV0sInRyYW5zZm9ybS1vcmlnaW4iOlt7b3JpZ2luOlsiY2VudGVyIiwidG9wIiwidG9wLXJpZ2h0IiwicmlnaHQiLCJib3R0b20tcmlnaHQiLCJib3R0b20iLCJib3R0b20tbGVmdCIsImxlZnQiLCJ0b3AtbGVmdCIsdmVdfV0sYWNjZW50Olt7YWNjZW50OlsiYXV0byIsZV19XSxhcHBlYXJhbmNlOlsiYXBwZWFyYW5jZS1ub25lIl0sY3Vyc29yOlt7Y3Vyc29yOlsiYXV0byIsImRlZmF1bHQiLCJwb2ludGVyIiwid2FpdCIsInRleHQiLCJtb3ZlIiwiaGVscCIsIm5vdC1hbGxvd2VkIiwibm9uZSIsImNvbnRleHQtbWVudSIsInByb2dyZXNzIiwiY2VsbCIsImNyb3NzaGFpciIsInZlcnRpY2FsLXRleHQiLCJhbGlhcyIsImNvcHkiLCJuby1kcm9wIiwiZ3JhYiIsImdyYWJiaW5nIiwiYWxsLXNjcm9sbCIsImNvbC1yZXNpemUiLCJyb3ctcmVzaXplIiwibi1yZXNpemUiLCJlLXJlc2l6ZSIsInMtcmVzaXplIiwidy1yZXNpemUiLCJuZS1yZXNpemUiLCJudy1yZXNpemUiLCJzZS1yZXNpemUiLCJzdy1yZXNpemUiLCJldy1yZXNpemUiLCJucy1yZXNpemUiLCJuZXN3LXJlc2l6ZSIsIm53c2UtcmVzaXplIiwiem9vbS1pbiIsInpvb20tb3V0Iix2ZV19XSwiY2FyZXQtY29sb3IiOlt7Y2FyZXQ6W2VdfV0sInBvaW50ZXItZXZlbnRzIjpbeyJwb2ludGVyLWV2ZW50cyI6WyJub25lIiwiYXV0byJdfV0scmVzaXplOlt7cmVzaXplOlsibm9uZSIsInkiLCJ4IiwiIl19XSwic2Nyb2xsLWJlaGF2aW9yIjpbe3Njcm9sbDpbImF1dG8iLCJzbW9vdGgiXX1dLCJzY3JvbGwtbSI6W3sic2Nyb2xsLW0iOkYoKX1dLCJzY3JvbGwtbXgiOlt7InNjcm9sbC1teCI6RigpfV0sInNjcm9sbC1teSI6W3sic2Nyb2xsLW15IjpGKCl9XSwic2Nyb2xsLW1zIjpbeyJzY3JvbGwtbXMiOkYoKX1dLCJzY3JvbGwtbWUiOlt7InNjcm9sbC1tZSI6RigpfV0sInNjcm9sbC1tdCI6W3sic2Nyb2xsLW10IjpGKCl9XSwic2Nyb2xsLW1yIjpbeyJzY3JvbGwtbXIiOkYoKX1dLCJzY3JvbGwtbWIiOlt7InNjcm9sbC1tYiI6RigpfV0sInNjcm9sbC1tbCI6W3sic2Nyb2xsLW1sIjpGKCl9XSwic2Nyb2xsLXAiOlt7InNjcm9sbC1wIjpGKCl9XSwic2Nyb2xsLXB4IjpbeyJzY3JvbGwtcHgiOkYoKX1dLCJzY3JvbGwtcHkiOlt7InNjcm9sbC1weSI6RigpfV0sInNjcm9sbC1wcyI6W3sic2Nyb2xsLXBzIjpGKCl9XSwic2Nyb2xsLXBlIjpbeyJzY3JvbGwtcGUiOkYoKX1dLCJzY3JvbGwtcHQiOlt7InNjcm9sbC1wdCI6RigpfV0sInNjcm9sbC1wciI6W3sic2Nyb2xsLXByIjpGKCl9XSwic2Nyb2xsLXBiIjpbeyJzY3JvbGwtcGIiOkYoKX1dLCJzY3JvbGwtcGwiOlt7InNjcm9sbC1wbCI6RigpfV0sInNuYXAtYWxpZ24iOlt7c25hcDpbInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwiYWxpZ24tbm9uZSJdfV0sInNuYXAtc3RvcCI6W3tzbmFwOlsibm9ybWFsIiwiYWx3YXlzIl19XSwic25hcC10eXBlIjpbe3NuYXA6WyJub25lIiwieCIsInkiLCJib3RoIl19XSwic25hcC1zdHJpY3RuZXNzIjpbe3NuYXA6WyJtYW5kYXRvcnkiLCJwcm94aW1pdHkiXX1dLHRvdWNoOlt7dG91Y2g6WyJhdXRvIiwibm9uZSIsIm1hbmlwdWxhdGlvbiJdfV0sInRvdWNoLXgiOlt7InRvdWNoLXBhbiI6WyJ4IiwibGVmdCIsInJpZ2h0Il19XSwidG91Y2gteSI6W3sidG91Y2gtcGFuIjpbInkiLCJ1cCIsImRvd24iXX1dLCJ0b3VjaC1weiI6WyJ0b3VjaC1waW5jaC16b29tIl0sc2VsZWN0Olt7c2VsZWN0Olsibm9uZSIsInRleHQiLCJhbGwiLCJhdXRvIl19XSwid2lsbC1jaGFuZ2UiOlt7IndpbGwtY2hhbmdlIjpbImF1dG8iLCJzY3JvbGwiLCJjb250ZW50cyIsInRyYW5zZm9ybSIsdmVdfV0sZmlsbDpbe2ZpbGw6W2UsIm5vbmUiXX1dLCJzdHJva2UtdyI6W3tzdHJva2U6W0huLHRvLGR1XX1dLHN0cm9rZTpbe3N0cm9rZTpbZSwibm9uZSJdfV0sc3I6WyJzci1vbmx5Iiwibm90LXNyLW9ubHkiXX0sY29uZmxpY3RpbmdDbGFzc0dyb3Vwczp7b3ZlcmZsb3c6WyJvdmVyZmxvdy14Iiwib3ZlcmZsb3cteSJdLG92ZXJzY3JvbGw6WyJvdmVyc2Nyb2xsLXgiLCJvdmVyc2Nyb2xsLXkiXSxpbnNldDpbImluc2V0LXgiLCJpbnNldC15Iiwic3RhcnQiLCJlbmQiLCJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXSwiaW5zZXQteCI6WyJyaWdodCIsImxlZnQiXSwiaW5zZXQteSI6WyJ0b3AiLCJib3R0b20iXSxmbGV4OlsiYmFzaXMiLCJncm93Iiwic2hyaW5rIl0sZ2FwOlsiZ2FwLXgiLCJnYXAteSJdLHA6WyJweCIsInB5IiwicHMiLCJwZSIsInB0IiwicHIiLCJwYiIsInBsIl0scHg6WyJwciIsInBsIl0scHk6WyJwdCIsInBiIl0sbTpbIm14IiwibXkiLCJtcyIsIm1lIiwibXQiLCJtciIsIm1iIiwibWwiXSxteDpbIm1yIiwibWwiXSxteTpbIm10IiwibWIiXSwiZm9udC1zaXplIjpbImxlYWRpbmciXSwiZnZuLW5vcm1hbCI6WyJmdm4tb3JkaW5hbCIsImZ2bi1zbGFzaGVkLXplcm8iLCJmdm4tZmlndXJlIiwiZnZuLXNwYWNpbmciLCJmdm4tZnJhY3Rpb24iXSwiZnZuLW9yZGluYWwiOlsiZnZuLW5vcm1hbCJdLCJmdm4tc2xhc2hlZC16ZXJvIjpbImZ2bi1ub3JtYWwiXSwiZnZuLWZpZ3VyZSI6WyJmdm4tbm9ybWFsIl0sImZ2bi1zcGFjaW5nIjpbImZ2bi1ub3JtYWwiXSwiZnZuLWZyYWN0aW9uIjpbImZ2bi1ub3JtYWwiXSxyb3VuZGVkOlsicm91bmRlZC1zIiwicm91bmRlZC1lIiwicm91bmRlZC10Iiwicm91bmRlZC1yIiwicm91bmRlZC1iIiwicm91bmRlZC1sIiwicm91bmRlZC1zcyIsInJvdW5kZWQtc2UiLCJyb3VuZGVkLWVlIiwicm91bmRlZC1lcyIsInJvdW5kZWQtdGwiLCJyb3VuZGVkLXRyIiwicm91bmRlZC1iciIsInJvdW5kZWQtYmwiXSwicm91bmRlZC1zIjpbInJvdW5kZWQtc3MiLCJyb3VuZGVkLWVzIl0sInJvdW5kZWQtZSI6WyJyb3VuZGVkLXNlIiwicm91bmRlZC1lZSJdLCJyb3VuZGVkLXQiOlsicm91bmRlZC10bCIsInJvdW5kZWQtdHIiXSwicm91bmRlZC1yIjpbInJvdW5kZWQtdHIiLCJyb3VuZGVkLWJyIl0sInJvdW5kZWQtYiI6WyJyb3VuZGVkLWJyIiwicm91bmRlZC1ibCJdLCJyb3VuZGVkLWwiOlsicm91bmRlZC10bCIsInJvdW5kZWQtYmwiXSwiYm9yZGVyLXNwYWNpbmciOlsiYm9yZGVyLXNwYWNpbmcteCIsImJvcmRlci1zcGFjaW5nLXkiXSwiYm9yZGVyLXciOlsiYm9yZGVyLXctcyIsImJvcmRlci13LWUiLCJib3JkZXItdy10IiwiYm9yZGVyLXctciIsImJvcmRlci13LWIiLCJib3JkZXItdy1sIl0sImJvcmRlci13LXgiOlsiYm9yZGVyLXctciIsImJvcmRlci13LWwiXSwiYm9yZGVyLXcteSI6WyJib3JkZXItdy10IiwiYm9yZGVyLXctYiJdLCJib3JkZXItY29sb3IiOlsiYm9yZGVyLWNvbG9yLXQiLCJib3JkZXItY29sb3ItciIsImJvcmRlci1jb2xvci1iIiwiYm9yZGVyLWNvbG9yLWwiXSwiYm9yZGVyLWNvbG9yLXgiOlsiYm9yZGVyLWNvbG9yLXIiLCJib3JkZXItY29sb3ItbCJdLCJib3JkZXItY29sb3IteSI6WyJib3JkZXItY29sb3ItdCIsImJvcmRlci1jb2xvci1iIl0sInNjcm9sbC1tIjpbInNjcm9sbC1teCIsInNjcm9sbC1teSIsInNjcm9sbC1tcyIsInNjcm9sbC1tZSIsInNjcm9sbC1tdCIsInNjcm9sbC1tciIsInNjcm9sbC1tYiIsInNjcm9sbC1tbCJdLCJzY3JvbGwtbXgiOlsic2Nyb2xsLW1yIiwic2Nyb2xsLW1sIl0sInNjcm9sbC1teSI6WyJzY3JvbGwtbXQiLCJzY3JvbGwtbWIiXSwic2Nyb2xsLXAiOlsic2Nyb2xsLXB4Iiwic2Nyb2xsLXB5Iiwic2Nyb2xsLXBzIiwic2Nyb2xsLXBlIiwic2Nyb2xsLXB0Iiwic2Nyb2xsLXByIiwic2Nyb2xsLXBiIiwic2Nyb2xsLXBsIl0sInNjcm9sbC1weCI6WyJzY3JvbGwtcHIiLCJzY3JvbGwtcGwiXSwic2Nyb2xsLXB5IjpbInNjcm9sbC1wdCIsInNjcm9sbC1wYiJdLHRvdWNoOlsidG91Y2gteCIsInRvdWNoLXkiLCJ0b3VjaC1weiJdLCJ0b3VjaC14IjpbInRvdWNoIl0sInRvdWNoLXkiOlsidG91Y2giXSwidG91Y2gtcHoiOlsidG91Y2giXX0sY29uZmxpY3RpbmdDbGFzc0dyb3VwTW9kaWZpZXJzOnsiZm9udC1zaXplIjpbImxlYWRpbmciXX19fWNvbnN0IFFOPU9OKFhOKTtmdW5jdGlvbiBvdCguLi5lKXtyZXR1cm4gUU4oeE4oZSkpfWNvbnN0IEFzPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLGNoaWxkcmVuOnQsLi4ubn0scik9PnguanN4cyhrXyx7cmVmOnIsY2xhc3NOYW1lOm90KCJyZWxhdGl2ZSBvdmVyZmxvdy1oaWRkZW4iLGUpLC4uLm4sY2hpbGRyZW46W3guanN4KHZOLHtjbGFzc05hbWU6ImgtZnVsbCB3LWZ1bGwgcm91bmRlZC1baW5oZXJpdF0iLGNoaWxkcmVuOnR9KSx4LmpzeChBXyx7fSkseC5qc3goeU4se30pXX0pKTtBcy5kaXNwbGF5TmFtZT1rXy5kaXNwbGF5TmFtZTtjb25zdCBBXz1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxvcmllbnRhdGlvbjp0PSJ2ZXJ0aWNhbCIsLi4ubn0scik9PnguanN4KHlfLHtyZWY6cixvcmllbnRhdGlvbjp0LGNsYXNzTmFtZTpvdCgiZmxleCB0b3VjaC1ub25lIHNlbGVjdC1ub25lIHRyYW5zaXRpb24tY29sb3JzIix0PT09InZlcnRpY2FsIiYmImgtZnVsbCB3LTIuNSBib3JkZXItbCBib3JkZXItbC10cmFuc3BhcmVudCBwLVsxcHhdIix0PT09Imhvcml6b250YWwiJiYiaC0yLjUgZmxleC1jb2wgYm9yZGVyLXQgYm9yZGVyLXQtdHJhbnNwYXJlbnQgcC1bMXB4XSIsZSksLi4ubixjaGlsZHJlbjp4LmpzeChkTix7Y2xhc3NOYW1lOm90KCJyZWxhdGl2ZSByb3VuZGVkLWZ1bGwgYmctYm9yZGVyIix0PT09InZlcnRpY2FsIiYmImZsZXgtMSIpfSl9KSk7QV8uZGlzcGxheU5hbWU9eV8uZGlzcGxheU5hbWU7ZnVuY3Rpb24gTXMoe2NoaWxkcmVuOmV9KXtjb25zdCB0PXAudXNlUmVmKG51bGwpLG49cC51c2VSZWYobnVsbCkscj1wLnVzZVJlZighMSksbz1wLnVzZVJlZigwKSxpPXAudXNlUmVmKG51bGwpLGw9cC51c2VSZWYoMCkscz0oKT0+e3IuY3VycmVudD0hMSxpLmN1cnJlbnQ9bnVsbCxvLmN1cnJlbnQ9MCxsLmN1cnJlbnQ9MH0sYT1TPT57Uy5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IHY9aS5jdXJyZW50PT09ImxlZnQiP3Q6bjtpZih2LmN1cnJlbnQmJnIuY3VycmVudCl7Y29uc3QgeT1pLmN1cnJlbnQ9PT0ibGVmdCI/Uy5zY3JlZW5YLW8uY3VycmVudDpvLmN1cnJlbnQtUy5zY3JlZW5YO3YuY3VycmVudC5zdHlsZS53aWR0aD1gJHtNYXRoLm1heChsLmN1cnJlbnQreSwxNTApfXB4YH19LHU9Uz0+dj0+e2lmKHYudGFyZ2V0KXtjb25zdCBfPVM9PT0ibGVmdCI/dDpTPT09InJpZ2h0Ij9uOm51bGw7ci5jdXJyZW50PSEwLF8mJl8uY3VycmVudCYmKG8uY3VycmVudD12LnNjcmVlblgsaS5jdXJyZW50PVMsXy5jdXJyZW50JiYobC5jdXJyZW50PV8uY3VycmVudC5vZmZzZXRXaWR0aCkpfX0sW2MsZCxmLGgsZyxtXT1wLkNoaWxkcmVuLnRvQXJyYXkoZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT4oZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIscyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixhKSwoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHMpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsYSl9KSxbXSkseC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaC1zY3JlZW4iLGNoaWxkcmVuOlt4LmpzeHMoImRpdiIse3JlZjp0LGNsYXNzTmFtZToicmVsYXRpdmUgYm9yZGVyLXIgYm9yZGVyLWJvcmRlciIsc3R5bGU6e3dpZHRoOjMwMH0sY2hpbGRyZW46W3guanN4cyhNcy5Db2x1bW4se2NoaWxkcmVuOltjLHguanN4KEFzLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpkfSldfSkseC5qc3goImRpdiIse2NsYXNzTmFtZToiYWJzb2x1dGUgaW5zZXQteS0wIHJpZ2h0LTAgY3Vyc29yLWNvbC1yZXNpemUgdy1bMXB4XSBob3Zlcjp3LVszcHhdIGgtZnVsbCBob3ZlcjpiZy1ib3JkZXIiLG9uTW91c2VEb3duOnUoImxlZnQiKX0pXX0pLHguanN4KCJkaXYiLHtjbGFzc05hbWU6aWQoIiIseyJ3LWZ1bGwiOiFnJiYhbX0pLGNoaWxkcmVuOnguanN4cyhNcy5Db2x1bW4se2NoaWxkcmVuOltmLHguanN4KEFzLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpofSldfSl9KSxnfHxtJiZ4LmpzeHMoImRpdiIse3JlZjpuLGNsYXNzTmFtZToicmVsYXRpdmUgaC1zY3JlZW4gYm9yZGVyLWwgYm9yZGVyLWJvcmRlciIsc3R5bGU6e3dpZHRoOjMwMH0sY2hpbGRyZW46W3guanN4cyhNcy5Db2x1bW4se2NoaWxkcmVuOltnLHguanN4KEFzLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjptfSldfSkseC5qc3goImRpdiIse29uTW91c2VEb3duOnUoInJpZ2h0IiksY2xhc3NOYW1lOiJhYnNvbHV0ZSBpbnNldC15LTAgbGVmdC0wIGN1cnNvci1jb2wtcmVzaXplIHctWzFweF0gYmctYm9yZGVyIGhvdmVyOnctWzNweF0gaG92ZXI6YmctYm9yZGVyIn0pXX0pXX0pfU1zLkNvbHVtbj0oe2NoaWxkcmVuOmV9KT0+e2NvbnN0W3Qsbl09cC5DaGlsZHJlbi50b0FycmF5KGUpO3JldHVybiB4LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCIsY2hpbGRyZW46W3guanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGJvcmRlci1iIGJvcmRlci1ib3JkZXIiLGNoaWxkcmVuOnR9KSxuXX0pfTtjb25zdCBKTj0oe2NsYXNzTmFtZTplfSk9PnguanN4cygic3ZnIix7d2lkdGg6IjEyIixoZWlnaHQ6IjEyIix2aWV3Qm94OiIwIDAgOSAxMCIsZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjbGFzc05hbWU6ZSxjaGlsZHJlbjpbeC5qc3hzKCJnIix7Y2xpcFBhdGg6InVybCgjY2xpcDBfMTIyNV8xNjM4KSIsY2hpbGRyZW46W3guanN4KCJyZWN0Iix7eToiMC41Iix3aWR0aDoiOSIsaGVpZ2h0OiI5In0pLHguanN4KCJwYXRoIix7ZDoiTTAgN0w4LjUgNSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IifSkseC5qc3goImNpcmNsZSIse2N4OiIzIixjeToiMy41IixyOiIxIixmaWxsOiJjdXJyZW50Q29sb3IifSldfSkseC5qc3goInJlY3QiLHt4OiIwLjUiLHk6IjEiLHdpZHRoOiI4IixoZWlnaHQ6IjgiLHN0cm9rZToiY3VycmVudENvbG9yIn0pLHguanN4KCJkZWZzIix7Y2hpbGRyZW46eC5qc3goImNsaXBQYXRoIix7aWQ6ImNsaXAwXzEyMjVfMTYzOCIsY2hpbGRyZW46eC5qc3goInJlY3QiLHt5OiIwLjUiLHdpZHRoOiI5IixoZWlnaHQ6IjkiLGZpbGw6IndoaXRlIn0pfSl9KV19KSxNXz1KTixaTj0oe2NsYXNzTmFtZTplfSk9PnguanN4cygic3ZnIix7d2lkdGg6IjkiLGhlaWdodDoiMTAiLHZpZXdCb3g6IjAgMCA5IDEwIixjbGFzc05hbWU6ZSxmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46W3guanN4cygiZyIse2NsaXBQYXRoOiJ1cmwoI2NsaXAwXzEyMjJfMTYxOCkiLGNoaWxkcmVuOlt4LmpzeCgicGF0aCIse2ZpbGxSdWxlOiJldmVub2RkIixjbGlwUnVsZToiZXZlbm9kZCIsZDoiTTkgMS41SDBWMC41SDlWMS41WiIsZmlsbDoiY3VycmVudENvbG9yIn0pLHguanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNOSA5LjVIMFY4LjVIOVY5LjVaIixmaWxsOiJjdXJyZW50Q29sb3IifSldfSkseC5qc3goImRlZnMiLHtjaGlsZHJlbjp4LmpzeCgiY2xpcFBhdGgiLHtpZDoiY2xpcDBfMTIyMl8xNjE4IixjaGlsZHJlbjp4LmpzeCgicmVjdCIse3dpZHRoOiI5IixoZWlnaHQ6IjkiLGZpbGw6IndoaXRlIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgwIDAuNSkifSl9KX0pXX0pLHFOPVpOLGViPSh7Y2xhc3NOYW1lOmV9KT0+eC5qc3goInN2ZyIse3dpZHRoOiI5IixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgOSAxMCIsZmlsbDoiY3VycmVudENvbG9yIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGNsYXNzTmFtZTplLGNoaWxkcmVuOnguanN4KCJnIix7Y2xpcFBhdGg6InVybCgjY2xpcDBfMTIyOV8xNjI1KSIsY2hpbGRyZW46eC5qc3goInBhdGgiLHtkOiJNMC4wMTQ1NTEzIDAuNUg4Ljk4NTQ1TDkgMy4xODU2OUg4LjU3MDc0QzguNDMwMDcgMi4yMjc2IDguMDI3NDkgMS41Nzk0OCA3LjM2Mjk4IDEuMjQxMzNDNi45ODk0OSAxLjA1NDkxIDYuNDMxNjkgMC45NTMwMzUgNS42ODk1NyAwLjkzNTY5NFY3Ljk0NTgxQzUuNjg5NTcgOC40MzU2OSA1Ljc4NDE2IDguNzYwODQgNS45NzMzMiA4LjkyMTI0QzYuMTY3MzQgOS4wODE2NSA2LjU2NzUgOS4xNjE4NSA3LjE3MzgxIDkuMTYxODVWOS41SDEuODYyNTdWOS4xNjE4NUMyLjQ0NDYyIDkuMTYxODUgMi44MzAyMyA5LjA4MTY1IDMuMDE5NCA4LjkyMTI0QzMuMjEzNDIgOC43NTY1IDMuMzEwNDMgOC40MzEzNiAzLjMxMDQzIDcuOTQ1ODFWMC45MzU2OTRDMi41ODI4NiAwLjk1MzAzNSAyLjAyNTA2IDEuMDU0OTEgMS42MzcwMyAxLjI0MTMzQzAuOTI0MDEgMS41ODgxNSAwLjUyMTQyMyAyLjIzNjI3IDAuNDI5MjY0IDMuMTg1NjlIMEwwLjAxNDU1MTMgMC41WiJ9KX0pfSksdGI9ZWI7ZnVuY3Rpb24gRF8oe2NoaWxkcmVuOmUscm9vdFBhdGg6dH0pe3JldHVybiB4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIHctZnVsbCBweS0yIHRleHQteHMiLGNoaWxkcmVuOnAuQ2hpbGRyZW4ubWFwKGUsbj0+cC5jbG9uZUVsZW1lbnQobix7cGF0aHM6W3RdfSkpfSl9RF8uTm9kZT0oe2NoaWxkcmVuOmUscGF0aHM6dD1bXSxwYXRoOm4sbGV2ZWw6cj0xLHR5cGU6byxzZXRBY3RpdmVQYXRoOml9KT0+e2NvbnN0IGw9ciozMCxzPW89PT0ic3RyaW5nIj94LmpzeCh0Yix7fSk6bz09PSJpbWFnZSI/eC5qc3goTV8se2NsYXNzTmFtZToiaC1bOXB4XSB3LVs5cHhdIn0pOnguanN4KHFOLHt9KTtyZXR1cm4geC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCIsY2hpbGRyZW46W3guanN4KCJidXR0b24iLHtjbGFzc05hbWU6ImZsZXgganVzdGlmeS1iZXR3ZWVuIHctZnVsbCBncm91cCBweS0yIHRleHQteHMgZm9udC1bNDAwXSBzaHJpbmstMCIsb25DbGljazooKT0+e2kmJmkobil9LHN0eWxlOntwYWRkaW5nTGVmdDpsfSxjaGlsZHJlbjp4LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIiLGNoaWxkcmVuOltzLHguanN4KCJwIix7Y2hpbGRyZW46bn0pXX0pfSksZSYmeC5qc3goeC5GcmFnbWVudCx7Y2hpbGRyZW46cC5DaGlsZHJlbi5tYXAoZSxhPT5wLmNsb25lRWxlbWVudChhLHtsZXZlbDpyKzEscGF0aHM6Wy4uLnQsbl19KSl9KV19KX07Y29uc3QgbmI9L15kYXRhOihpbWFnZVwvKHBuZ3xqcGVnfGpwZ3xnaWZ8d2VicHxibXB8dGlmZnxpY298c3ZnXCt4bWwpKTtiYXNlNjQsLztmdW5jdGlvbiBPZyhlKXtjb25zdCB0PW5iLmV4ZWMoZSk7aWYodCYmdFsxXSlyZXR1cm4gdFsxXX1mdW5jdGlvbiBBZyhlKXtyZXR1cm4gZT09PSJpbWFnZS9zdmcreG1sIj8ic3ZnIjplPT09ImltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiI/ImljbyI6ZS5zdGFydHNXaXRoKCJpbWFnZS8iKT9lLnNsaWNlKDYpOmV9dmFyIGxuPXt9LEQ9e307bGV0IGFkPXt9LExfPXt9LGNhPXt9LERzPXt9LExoPXt9LGZsPXt9LE1nPXt9LEloPXt9LGRhPXt9LGZhPXt9LGdvPXt9LERnPXt9LExnPXt9LElfPXt9LGpfPXt9LHpfPXt9LEZfPXt9LEJfPXt9LFdfPXt9LFVfPXt9LG1jPXt9LFZfPXt9LEhfPXt9LEtfPXt9LEdfPXt9LFlfPXt9LFhfPXt9LFFfPXt9LEpfPXt9LFpfPXt9LElnPXt9LGpnPXt9LGpoPXt9LHFfPXt9LGV3PXt9LHR3PXt9O2Z1bmN0aW9uIFUoZSl7bGV0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtczt0LmFwcGVuZCgiY29kZSIsZSk7Zm9yKGxldCBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LmFwcGVuZCgidiIsYXJndW1lbnRzW25dKTt0aHJvdyBFcnJvcihgTWluaWZpZWQgTGV4aWNhbCBlcnJvciAjJHtlfTsgdmlzaXQgaHR0cHM6Ly9sZXhpY2FsLmRldi9kb2NzL2Vycm9yPyR7dH0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLmApfWxldCBHcj10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudDwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSIscmI9R3ImJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQ/ZG9jdW1lbnQuZG9jdW1lbnRNb2RlOm51bGwsV3Q9R3ImJi9NYWN8aVBvZHxpUGhvbmV8aVBhZC8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pLGJvPUdyJiYvXig/IS4qU2VhbW9ua2V5KSg/PS4qRmlyZWZveCkuKi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksdmM9R3ImJiJJbnB1dEV2ZW50ImluIHdpbmRvdyYmIXJiPyJnZXRUYXJnZXRSYW5nZXMiaW4gbmV3IHdpbmRvdy5JbnB1dEV2ZW50KCJpbnB1dCIpOiExLHpnPUdyJiYvVmVyc2lvblwvW1xkLl0rLipTYWZhcmkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksdWQ9R3ImJi9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhd2luZG93Lk1TU3RyZWFtLG9iPUdyJiYvXig/PS4qQ2hyb21lKS4qL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxGZz1HciYmL0FwcGxlV2ViS2l0XC9bXGQuXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiFvYixjZD16Z3x8dWR8fEZnPyLCoCI6IuKAiyIsaWI9Ym8/IsKgIjpjZCxsYj0vXlteQS1aYS16XHUwMGMwLVx1MDBkNlx1MDBkOC1cdTAwZjZcdTAwZjgtXHUwMmI4XHUwMzAwLVx1MDU5MFx1MDgwMC1cdTFmZmZcdTIwMGVcdTJjMDAtXHVmYjFjXHVmZTAwLVx1ZmU2Zlx1ZmVmZC1cdWZmZmZdKltcdTA1OTEtXHUwN2ZmXHVmYjFkLVx1ZmRmZFx1ZmU3MC1cdWZlZmNdLyxzYj0vXlteXHUwNTkxLVx1MDdmZlx1ZmIxZC1cdWZkZmRcdWZlNzAtXHVmZWZjXSpbQS1aYS16XHUwMGMwLVx1MDBkNlx1MDBkOC1cdTAwZjZcdTAwZjgtXHUwMmI4XHUwMzAwLVx1MDU5MFx1MDgwMC1cdTFmZmZcdTIwMGVcdTJjMDAtXHVmYjFjXHVmZTAwLVx1ZmU2Zlx1ZmVmZC1cdWZmZmZdLyxvaT17Ym9sZDoxLGNvZGU6MTYsaGlnaGxpZ2h0OjEyOCxpdGFsaWM6MixzdHJpa2V0aHJvdWdoOjQsc3Vic2NyaXB0OjMyLHN1cGVyc2NyaXB0OjY0LHVuZGVybGluZTo4fSxhYj17ZGlyZWN0aW9ubGVzczoxLHVubWVyZ2VhYmxlOjJ9LGx5PXtjZW50ZXI6MixlbmQ6NixqdXN0aWZ5OjQsbGVmdDoxLHJpZ2h0OjMsc3RhcnQ6NX0sdWI9ezI6ImNlbnRlciIsNjoiZW5kIiw0OiJqdXN0aWZ5IiwxOiJsZWZ0IiwzOiJyaWdodCIsNToic3RhcnQifSxjYj17bm9ybWFsOjAsc2VnbWVudGVkOjIsdG9rZW46MX0sZGI9ezA6Im5vcm1hbCIsMjoic2VnbWVudGVkIiwxOiJ0b2tlbiJ9LHpoPSExLEJnPTA7ZnVuY3Rpb24gZmIoZSl7Qmc9ZS50aW1lU3RhbXB9ZnVuY3Rpb24gaGYoZSx0LG4pe3JldHVybiB0Ll9fbGV4aWNhbExpbmVCcmVhaz09PWV8fGVbYF9fbGV4aWNhbEtleV8ke24uX2tleX1gXSE9PXZvaWQgMH1mdW5jdGlvbiBoYihlKXtyZXR1cm4gZS5nZXRFZGl0b3JTdGF0ZSgpLnJlYWQoKCk9PntsZXQgdD1LZSgpO3JldHVybiB0IT09bnVsbD90LmNsb25lKCk6bnVsbH0pfWZ1bmN0aW9uIG53KGUsdCxuKXt6aD0hMDtsZXQgcj0xMDA8cGVyZm9ybWFuY2Uubm93KCktQmc7dHJ5e2tuKGUsKCk9PntsZXQgbz1LZSgpfHxoYihlKTt2YXIgaT1uZXcgTWFwLGw9ZS5nZXRSb290RWxlbWVudCgpLHM9ZS5fZWRpdG9yU3RhdGUsYT1lLl9ibG9ja0N1cnNvckVsZW1lbnQ7bGV0IHU9ITEsYz0iIjtmb3IodmFyIGQ9MDtkPHQubGVuZ3RoO2QrKyl7dmFyIGY9dFtkXSxoPWYudHlwZSxnPWYudGFyZ2V0LG09TWEoZyxzKTtpZighKG09PT1udWxsJiZnIT09bHx8VmUobSkpKXtpZihoPT09ImNoYXJhY3RlckRhdGEiKXtpZihmPXImJlEobSkpZTp7Zj1vLGg9Zzt2YXIgUz1tO2lmKGRlKGYpKXt2YXIgdj1mLmFuY2hvci5nZXROb2RlKCk7aWYodi5pcyhTKSYmZi5mb3JtYXQhPT12LmdldEZvcm1hdCgpKXtmPSExO2JyZWFrIGV9fWY9aC5ub2RlVHlwZT09PTMmJlMuaXNBdHRhY2hlZCgpfWYmJihTPUNyKGUuX3dpbmRvdyksaD1mPW51bGwsUyE9PW51bGwmJlMuYW5jaG9yTm9kZT09PWcmJihmPVMuYW5jaG9yT2Zmc2V0LGg9Uy5mb2N1c09mZnNldCksZz1nLm5vZGVWYWx1ZSxnIT09bnVsbCYmR2cobSxnLGYsaCwhMSkpfWVsc2UgaWYoaD09PSJjaGlsZExpc3QiKXtmb3IodT0hMCxoPWYuYWRkZWROb2RlcyxTPTA7UzxoLmxlbmd0aDtTKyspe3Y9aFtTXTt2YXIgeT11dyh2KSxfPXYucGFyZW50Tm9kZTtfPT1udWxsfHx2PT09YXx8eSE9PW51bGx8fHYubm9kZU5hbWU9PT0iQlIiJiZoZih2LF8sZSl8fChibyYmKHk9di5pbm5lclRleHR8fHYubm9kZVZhbHVlKSYmKGMrPXkpLF8ucmVtb3ZlQ2hpbGQodikpfWlmKGY9Zi5yZW1vdmVkTm9kZXMsaD1mLmxlbmd0aCwwPGgpe2ZvcihTPTAsdj0wO3Y8aDt2KyspXz1mW3ZdLChfLm5vZGVOYW1lPT09IkJSIiYmaGYoXyxnLGUpfHxhPT09XykmJihnLmFwcGVuZENoaWxkKF8pLFMrKyk7aCE9PVMmJihnPT09bCYmKG09cy5fbm9kZU1hcC5nZXQoInJvb3QiKSksaS5zZXQoZyxtKSl9fX19aWYoMDxpLnNpemUpZm9yKGxldFt3LENdb2YgaSlpZihCKEMpKWZvcihpPUMuZ2V0Q2hpbGRyZW5LZXlzKCksbD13LmZpcnN0Q2hpbGQscz0wO3M8aS5sZW5ndGg7cysrKWE9ZS5nZXRFbGVtZW50QnlLZXkoaVtzXSksYSE9PW51bGwmJihsPT1udWxsPyh3LmFwcGVuZENoaWxkKGEpLGw9YSk6bCE9PWEmJncucmVwbGFjZUNoaWxkKGEsbCksbD1sLm5leHRTaWJsaW5nKTtlbHNlIFEoQykmJkMubWFya0RpcnR5KCk7aWYoaT1uLnRha2VSZWNvcmRzKCksMDxpLmxlbmd0aCl7Zm9yKGw9MDtsPGkubGVuZ3RoO2wrKylmb3IoYT1pW2xdLHM9YS5hZGRlZE5vZGVzLGE9YS50YXJnZXQsZD0wO2Q8cy5sZW5ndGg7ZCsrKW09c1tkXSxnPW0ucGFyZW50Tm9kZSxnPT1udWxsfHxtLm5vZGVOYW1lIT09IkJSInx8aGYobSxhLGUpfHxnLnJlbW92ZUNoaWxkKG0pO24udGFrZVJlY29yZHMoKX1vIT09bnVsbCYmKHUmJihvLmRpcnR5PSEwLHZyKG8pKSxibyYmaHcoZSkmJm8uaW5zZXJ0UmF3VGV4dChjKSl9KX1maW5hbGx5e3poPSExfX1mdW5jdGlvbiBydyhlKXtsZXQgdD1lLl9vYnNlcnZlcjtpZih0IT09bnVsbCl7bGV0IG49dC50YWtlUmVjb3JkcygpO253KGUsbix0KX19ZnVuY3Rpb24gb3coZSl7Qmc9PT0wJiZmZChlKS5hZGRFdmVudExpc3RlbmVyKCJ0ZXh0SW5wdXQiLGZiLCEwKSxlLl9vYnNlcnZlcj1uZXcgTXV0YXRpb25PYnNlcnZlcigodCxuKT0+e253KGUsdCxuKX0pfWZ1bmN0aW9uIHN5KGUsdCl7bGV0IG49ZS5fX21vZGUscj1lLl9fZm9ybWF0O2U9ZS5fX3N0eWxlO2xldCBvPXQuX19tb2RlLGk9dC5fX2Zvcm1hdDtyZXR1cm4gdD10Ll9fc3R5bGUsKG49PT1udWxsfHxuPT09bykmJihyPT09bnVsbHx8cj09PWkpJiYoZT09PW51bGx8fGU9PT10KX1mdW5jdGlvbiBheShlLHQpe2xldCBuPWUubWVyZ2VXaXRoU2libGluZyh0KSxyPWV0KCkuX25vcm1hbGl6ZWROb2RlcztyZXR1cm4gci5hZGQoZS5fX2tleSksci5hZGQodC5fX2tleSksbn1mdW5jdGlvbiBpdyhlKXtpZihlLl9fdGV4dD09PSIiJiZlLmlzU2ltcGxlVGV4dCgpJiYhZS5pc1VubWVyZ2VhYmxlKCkpZS5yZW1vdmUoKTtlbHNle2Zvcih2YXIgdDsodD1lLmdldFByZXZpb3VzU2libGluZygpKSE9PW51bGwmJlEodCkmJnQuaXNTaW1wbGVUZXh0KCkmJiF0LmlzVW5tZXJnZWFibGUoKTspaWYodC5fX3RleHQ9PT0iIil0LnJlbW92ZSgpO2Vsc2V7c3kodCxlKSYmKGU9YXkodCxlKSk7YnJlYWt9Zm9yKHZhciBuOyhuPWUuZ2V0TmV4dFNpYmxpbmcoKSkhPT1udWxsJiZRKG4pJiZuLmlzU2ltcGxlVGV4dCgpJiYhbi5pc1VubWVyZ2VhYmxlKCk7KWlmKG4uX190ZXh0PT09IiIpbi5yZW1vdmUoKTtlbHNle3N5KGUsbikmJmF5KGUsbik7YnJlYWt9fX1mdW5jdGlvbiBXZyhlKXtyZXR1cm4gdXkoZS5hbmNob3IpLHV5KGUuZm9jdXMpLGV9ZnVuY3Rpb24gdXkoZSl7Zm9yKDtlLnR5cGU9PT0iZWxlbWVudCI7KXt2YXIgdD1lLmdldE5vZGUoKSxuPWUub2Zmc2V0O2lmKG49PT10LmdldENoaWxkcmVuU2l6ZSgpPyh0PXQuZ2V0Q2hpbGRBdEluZGV4KG4tMSksbj0hMCk6KHQ9dC5nZXRDaGlsZEF0SW5kZXgobiksbj0hMSksUSh0KSl7ZS5zZXQodC5fX2tleSxuP3QuZ2V0VGV4dENvbnRlbnRTaXplKCk6MCwidGV4dCIpO2JyZWFrfWVsc2UgaWYoIUIodCkpYnJlYWs7ZS5zZXQodC5fX2tleSxuP3QuZ2V0Q2hpbGRyZW5TaXplKCk6MCwiZWxlbWVudCIpfX1sZXQgcGI9MSxnYj10eXBlb2YgcXVldWVNaWNyb3Rhc2s9PSJmdW5jdGlvbiI/cXVldWVNaWNyb3Rhc2s6ZT0+e1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oZSl9O2Z1bmN0aW9uIFVnKGUpe2xldCB0PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYodD09PW51bGwpcmV0dXJuITE7bGV0IG49dC5ub2RlTmFtZTtyZXR1cm4gVmUoTWEoZSkpJiYobj09PSJJTlBVVCJ8fG49PT0iVEVYVEFSRUEifHx0LmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIiYmdC5fX2xleGljYWxFZGl0b3I9PW51bGwpfWZ1bmN0aW9uIEFhKGUsdCxuKXtsZXQgcj1lLmdldFJvb3RFbGVtZW50KCk7dHJ5e3JldHVybiByIT09bnVsbCYmci5jb250YWlucyh0KSYmci5jb250YWlucyhuKSYmdCE9PW51bGwmJiFVZyh0KSYmVmcodCk9PT1lfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBWZyhlKXtmb3IoO2UhPW51bGw7KXtsZXQgdD1lLl9fbGV4aWNhbEVkaXRvcjtpZih0IT1udWxsKXJldHVybiB0O2U9ZGQoZSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gRmgoZSl7cmV0dXJuIGUuaXNUb2tlbigpfHxlLmlzU2VnbWVudGVkKCl9ZnVuY3Rpb24geWMoZSl7Zm9yKDtlIT1udWxsOyl7aWYoZS5ub2RlVHlwZT09PTMpcmV0dXJuIGU7ZT1lLmZpcnN0Q2hpbGR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gbHcoZSx0LG4pe3JldHVybiB0PW9pW3RdLGUmdCYmKG49PT1udWxsfHwhKG4mdCkpP2VedDpuPT09bnVsbHx8biZ0P2V8dDplfWZ1bmN0aW9uIHN3KGUpe3JldHVybiBRKGUpfHxtYShlKXx8VmUoZSl9ZnVuY3Rpb24gYXcoZSx0KXtpZih0IT1udWxsKWUuX19rZXk9dDtlbHNle1p0KCksOTk8dmEmJlUoMTQpLHQ9ZXQoKTt2YXIgbj1FcigpLHI9IiIrcGIrKztuLl9ub2RlTWFwLnNldChyLGUpLEIoZSk/dC5fZGlydHlFbGVtZW50cy5zZXQociwhMCk6dC5fZGlydHlMZWF2ZXMuYWRkKHIpLHQuX2Nsb25lTm90TmVlZGVkLmFkZChyKSx0Ll9kaXJ0eVR5cGU9MSxlLl9fa2V5PXJ9fWZ1bmN0aW9uIGlpKGUpe3ZhciB0PWUuZ2V0UGFyZW50KCk7aWYodCE9PW51bGwpe2xldCBvPWUuZ2V0V3JpdGFibGUoKTt0PXQuZ2V0V3JpdGFibGUoKTt2YXIgbj1lLmdldFByZXZpb3VzU2libGluZygpO2lmKGU9ZS5nZXROZXh0U2libGluZygpLG49PT1udWxsKWlmKGUhPT1udWxsKXt2YXIgcj1lLmdldFdyaXRhYmxlKCk7dC5fX2ZpcnN0PWUuX19rZXksci5fX3ByZXY9bnVsbH1lbHNlIHQuX19maXJzdD1udWxsO2Vsc2V7aWYocj1uLmdldFdyaXRhYmxlKCksZSE9PW51bGwpe2xldCBpPWUuZ2V0V3JpdGFibGUoKTtpLl9fcHJldj1yLl9fa2V5LHIuX19uZXh0PWkuX19rZXl9ZWxzZSByLl9fbmV4dD1udWxsO28uX19wcmV2PW51bGx9ZT09PW51bGw/biE9PW51bGw/KGU9bi5nZXRXcml0YWJsZSgpLHQuX19sYXN0PW4uX19rZXksZS5fX25leHQ9bnVsbCk6dC5fX2xhc3Q9bnVsbDooZT1lLmdldFdyaXRhYmxlKCksbiE9PW51bGw/KG49bi5nZXRXcml0YWJsZSgpLG4uX19uZXh0PWUuX19rZXksZS5fX3ByZXY9bi5fX2tleSk6ZS5fX3ByZXY9bnVsbCxvLl9fbmV4dD1udWxsKSx0Ll9fc2l6ZS0tLG8uX19wYXJlbnQ9bnVsbH19ZnVuY3Rpb24geGMoZSl7OTk8dmEmJlUoMTQpO3ZhciB0PWUuZ2V0TGF0ZXN0KCksbj10Ll9fcGFyZW50LHI9RXIoKTtsZXQgbz1ldCgpLGk9ci5fbm9kZU1hcDtpZihyPW8uX2RpcnR5RWxlbWVudHMsbiE9PW51bGwpZTpmb3IoO24hPT1udWxsOyl7aWYoci5oYXMobikpYnJlYWsgZTtsZXQgbD1pLmdldChuKTtpZihsPT09dm9pZCAwKWJyZWFrO3Iuc2V0KG4sITEpLG49bC5fX3BhcmVudH10PXQuX19rZXksby5fZGlydHlUeXBlPTEsQihlKT9yLnNldCh0LCEwKTpvLl9kaXJ0eUxlYXZlcy5hZGQodCl9ZnVuY3Rpb24gTXQoZSl7WnQoKTt2YXIgdD1ldCgpO2xldCBuPXQuX2NvbXBvc2l0aW9uS2V5O2UhPT1uJiYodC5fY29tcG9zaXRpb25LZXk9ZSxuIT09bnVsbCYmKHQ9JHQobiksdCE9PW51bGwmJnQuZ2V0V3JpdGFibGUoKSksZSE9PW51bGwmJihlPSR0KGUpLGUhPT1udWxsJiZlLmdldFdyaXRhYmxlKCkpKX1mdW5jdGlvbiBtbygpe3JldHVybiBVbCgpP251bGw6ZXQoKS5fY29tcG9zaXRpb25LZXl9ZnVuY3Rpb24gJHQoZSx0KXtyZXR1cm4gZT0odHx8RXIoKSkuX25vZGVNYXAuZ2V0KGUpLGU9PT12b2lkIDA/bnVsbDplfWZ1bmN0aW9uIHV3KGUsdCl7bGV0IG49ZXQoKTtyZXR1cm4gZT1lW2BfX2xleGljYWxLZXlfJHtuLl9rZXl9YF0sZSE9PXZvaWQgMD8kdChlLHQpOm51bGx9ZnVuY3Rpb24gTWEoZSx0KXtmb3IoO2UhPW51bGw7KXtsZXQgbj11dyhlLHQpO2lmKG4hPT1udWxsKXJldHVybiBuO2U9ZGQoZSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gY3coZSl7bGV0IHQ9T2JqZWN0LmFzc2lnbih7fSxlLl9kZWNvcmF0b3JzKTtyZXR1cm4gZS5fcGVuZGluZ0RlY29yYXRvcnM9dH1mdW5jdGlvbiBjeShlKXtyZXR1cm4gZS5yZWFkKCgpPT5TcigpLmdldFRleHRDb250ZW50KCkpfWZ1bmN0aW9uIG1iKGUsdCl7a24oZSwoKT0+e3ZhciBuPUVyKCk7aWYoIW4uaXNFbXB0eSgpKWlmKHQ9PT0icm9vdCIpU3IoKS5tYXJrRGlydHkoKTtlbHNle249bi5fbm9kZU1hcDtmb3IobGV0WyxyXW9mIG4pci5tYXJrRGlydHkoKX19LGUuX3BlbmRpbmdFZGl0b3JTdGF0ZT09PW51bGw/e3RhZzoiaGlzdG9yeS1tZXJnZSJ9OnZvaWQgMCl9ZnVuY3Rpb24gU3IoKXtyZXR1cm4gRXIoKS5fbm9kZU1hcC5nZXQoInJvb3QiKX1mdW5jdGlvbiB2cihlKXtadCgpO2xldCB0PUVyKCk7ZSE9PW51bGwmJihlLmRpcnR5PSEwLGUuX2NhY2hlZE5vZGVzPW51bGwpLHQuX3NlbGVjdGlvbj1lfWZ1bmN0aW9uIHRsKGUpe3ZhciB0PWV0KCksbjtlOntmb3Iobj1lO24hPW51bGw7KXtsZXQgcj1uW2BfX2xleGljYWxLZXlfJHt0Ll9rZXl9YF07aWYociE9PXZvaWQgMCl7bj1yO2JyZWFrIGV9bj1kZChuKX1uPW51bGx9cmV0dXJuIG49PT1udWxsPyh0PXQuZ2V0Um9vdEVsZW1lbnQoKSxlPT09dD8kdCgicm9vdCIpOm51bGwpOiR0KG4pfWZ1bmN0aW9uIGR3KGUpe3JldHVybi9bXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl0vZy50ZXN0KGUpfWZ1bmN0aW9uIEhnKGUpe2xldCB0PVtdO2Zvcig7ZSE9PW51bGw7KXQucHVzaChlKSxlPWUuX3BhcmVudEVkaXRvcjtyZXR1cm4gdH1mdW5jdGlvbiBmdygpe3JldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5yZXBsYWNlKC9bXmEtel0rL2csIiIpLnN1YnN0cigwLDUpfWZ1bmN0aW9uIEtnKGUsdCxuKXtpZih0PUNyKHQuX3dpbmRvdyksdCE9PW51bGwpe3ZhciByPXQuYW5jaG9yTm9kZSx7YW5jaG9yT2Zmc2V0Om8sZm9jdXNPZmZzZXQ6aX09dDtpZihyIT09bnVsbCYmKHQ9ci5ub2RlVHlwZT09PTM/ci5ub2RlVmFsdWU6bnVsbCxyPU1hKHIpLHQhPT1udWxsJiZRKHIpKSl7aWYodD09PWNkJiZuKXtsZXQgbD1uLmxlbmd0aDt0PW4saT1vPWx9dCE9PW51bGwmJkdnKHIsdCxvLGksZSl9fX1mdW5jdGlvbiBHZyhlLHQsbixyLG8pe2xldCBpPWU7aWYoaS5pc0F0dGFjaGVkKCkmJihvfHwhaS5pc0RpcnR5KCkpKXtsZXQgdT1pLmlzQ29tcG9zaW5nKCksYz10O2lmKCh1fHxvKSYmdFt0Lmxlbmd0aC0xXT09PWNkJiYoYz10LnNsaWNlKDAsLTEpKSx0PWkuZ2V0VGV4dENvbnRlbnQoKSxvfHxjIT09dClpZihjPT09IiIpaWYoTXQobnVsbCksemd8fHVkfHxGZylpLnJlbW92ZSgpO2Vsc2V7bGV0IGQ9ZXQoKTtzZXRUaW1lb3V0KCgpPT57ZC51cGRhdGUoKCk9PntpLmlzQXR0YWNoZWQoKSYmaS5yZW1vdmUoKX0pfSwyMCl9ZWxzZXtvPWkuZ2V0UGFyZW50KCksdD1XbCgpO3ZhciBsPWkuZ2V0VGV4dENvbnRlbnRTaXplKCkscz1tbygpLGE9aS5nZXRLZXkoKTtpLmlzVG9rZW4oKXx8cyE9PW51bGwmJmE9PT1zJiYhdXx8ZGUodCkmJihvIT09bnVsbCYmIW8uY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZ0LmFuY2hvci5vZmZzZXQ9PT0wfHx0LmFuY2hvci5rZXk9PT1lLl9fa2V5JiZ0LmFuY2hvci5vZmZzZXQ9PT0wJiYhaS5jYW5JbnNlcnRUZXh0QmVmb3JlKCl8fHQuZm9jdXMua2V5PT09ZS5fX2tleSYmdC5mb2N1cy5vZmZzZXQ9PT1sJiYhaS5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSk/aS5tYXJrRGlydHkoKTooZT1LZSgpLGRlKGUpJiZuIT09bnVsbCYmciE9PW51bGwmJihlLnNldFRleHROb2RlUmFuZ2UoaSxuLGksciksaS5pc1NlZ21lbnRlZCgpJiYobj1pLmdldFRleHRDb250ZW50KCksbj1DdChuKSxpLnJlcGxhY2UobiksaT1uKSksaS5zZXRUZXh0Q29udGVudChjKSl9fX1mdW5jdGlvbiB2YihlLHQpe2lmKHQuaXNTZWdtZW50ZWQoKSlyZXR1cm4hMDtpZighZS5pc0NvbGxhcHNlZCgpKXJldHVybiExO2U9ZS5hbmNob3Iub2Zmc2V0O2xldCBuPXQuZ2V0UGFyZW50T3JUaHJvdygpLHI9dC5pc1Rva2VuKCk7cmV0dXJuIGU9PT0wPygoZT0hdC5jYW5JbnNlcnRUZXh0QmVmb3JlKCl8fCFuLmNhbkluc2VydFRleHRCZWZvcmUoKXx8cil8fCh0PXQuZ2V0UHJldmlvdXNTaWJsaW5nKCksZT0oUSh0KXx8Qih0KSYmdC5pc0lubGluZSgpKSYmIXQuY2FuSW5zZXJ0VGV4dEFmdGVyKCkpLGUpOmU9PT10LmdldFRleHRDb250ZW50U2l6ZSgpPyF0LmNhbkluc2VydFRleHRBZnRlcigpfHwhbi5jYW5JbnNlcnRUZXh0QWZ0ZXIoKXx8cjohMX1mdW5jdGlvbiBMcyhlLHQpe2UuX19sZXhpY2FsQ2xhc3NOYW1lQ2FjaGU9PT12b2lkIDAmJihlLl9fbGV4aWNhbENsYXNzTmFtZUNhY2hlPXt9KTtsZXQgbj1lLl9fbGV4aWNhbENsYXNzTmFtZUNhY2hlLHI9blt0XTtyZXR1cm4gciE9PXZvaWQgMD9yOihlPWVbdF0sdHlwZW9mIGU9PSJzdHJpbmciPyhlPWUuc3BsaXQoIiAiKSxuW3RdPWUpOmUpfWZ1bmN0aW9uIFlnKGUsdCxuLHIsbyl7bi5zaXplIT09MCYmKG49ci5fX3R5cGUscj1yLl9fa2V5LHQ9dC5nZXQobiksdD09PXZvaWQgMCYmVSgzMyxuKSxuPXQua2xhc3MsdD1lLmdldChuKSx0PT09dm9pZCAwJiYodD1uZXcgTWFwLGUuc2V0KG4sdCkpLGU9dC5nZXQociksbj1lPT09ImRlc3Ryb3llZCImJm89PT0iY3JlYXRlZCIsKGU9PT12b2lkIDB8fG4pJiZ0LnNldChyLG4/InVwZGF0ZWQiOm8pKX1mdW5jdGlvbiBkeShlLHQsbil7bGV0IHI9ZS5nZXRQYXJlbnQoKSxvPW47cmV0dXJuIHIhPT1udWxsJiYodCYmbj09PTA/KG89ZS5nZXRJbmRleFdpdGhpblBhcmVudCgpLGU9cik6dHx8biE9PWUuZ2V0Q2hpbGRyZW5TaXplKCl8fChvPWUuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxLGU9cikpLGUuZ2V0Q2hpbGRBdEluZGV4KHQ/by0xOm8pfWZ1bmN0aW9uIEJoKGUsdCl7dmFyIG49ZS5vZmZzZXQ7cmV0dXJuIGUudHlwZT09PSJlbGVtZW50Ij8oZT1lLmdldE5vZGUoKSxkeShlLHQsbikpOihlPWUuZ2V0Tm9kZSgpLHQmJm49PT0wfHwhdCYmbj09PWUuZ2V0VGV4dENvbnRlbnRTaXplKCk/KG49dD9lLmdldFByZXZpb3VzU2libGluZygpOmUuZ2V0TmV4dFNpYmxpbmcoKSxuPT09bnVsbD9keShlLmdldFBhcmVudE9yVGhyb3coKSx0LGUuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsodD8wOjEpKTpuKTpudWxsKX1mdW5jdGlvbiBodyhlKXtyZXR1cm4gZT0oZT1mZChlKS5ldmVudCkmJmUuaW5wdXRUeXBlLGU9PT0iaW5zZXJ0RnJvbVBhc3RlInx8ZT09PSJpbnNlcnRGcm9tUGFzdGVBc1F1b3RhdGlvbiJ9ZnVuY3Rpb24gX2MoZSl7cmV0dXJuIWVuKGUpJiYhZS5pc0xhc3RDaGlsZCgpJiYhZS5pc0lubGluZSgpfWZ1bmN0aW9uIHdjKGUsdCl7cmV0dXJuIGU9ZS5fa2V5VG9ET01NYXAuZ2V0KHQpLGU9PT12b2lkIDAmJlUoNzUsdCksZX1mdW5jdGlvbiBkZChlKXtyZXR1cm4gZT1lLmFzc2lnbmVkU2xvdHx8ZS5wYXJlbnRFbGVtZW50LGUhPT1udWxsJiZlLm5vZGVUeXBlPT09MTE/ZS5ob3N0OmV9ZnVuY3Rpb24gU2MoZSx0KXtmb3IoZT1lLmdldFBhcmVudCgpO2UhPT1udWxsOyl7aWYoZS5pcyh0KSlyZXR1cm4hMDtlPWUuZ2V0UGFyZW50KCl9cmV0dXJuITF9ZnVuY3Rpb24gZmQoZSl7cmV0dXJuIGU9ZS5fd2luZG93LGU9PT1udWxsJiZVKDc4KSxlfWZ1bmN0aW9uIHB3KGUpe2ZvcihlPWUuZ2V0UGFyZW50T3JUaHJvdygpO2UhPT1udWxsJiYhWm4oZSk7KWU9ZS5nZXRQYXJlbnRPclRocm93KCk7cmV0dXJuIGV9ZnVuY3Rpb24gWm4oZSl7cmV0dXJuIGVuKGUpfHxCKGUpJiZlLmlzU2hhZG93Um9vdCgpfWZ1bmN0aW9uIGd3KGUpe3JldHVybiBlPWUuY29uc3RydWN0b3IuY2xvbmUoZSksYXcoZSxudWxsKSxlfWZ1bmN0aW9uIERhKGUpe3ZhciB0PWV0KCk7bGV0IG49ZS5jb25zdHJ1Y3Rvci5nZXRUeXBlKCk7cmV0dXJuIHQ9dC5fbm9kZXMuZ2V0KG4pLHQ9PT12b2lkIDAmJlUoOTcpLHQ9dC5yZXBsYWNlLHQhPT1udWxsPyh0PXQoZSksdCBpbnN0YW5jZW9mIGUuY29uc3RydWN0b3J8fFUoOTgpLHQpOmV9ZnVuY3Rpb24gcGYoZSx0KXtlPWUuZ2V0UGFyZW50KCksIWVuKGUpfHxCKHQpfHxWZSh0KXx8VSg5OSl9ZnVuY3Rpb24gZ2YoZSl7cmV0dXJuKFZlKGUpfHxCKGUpJiYhZS5jYW5CZUVtcHR5KCkpJiYhZS5pc0lubGluZSgpfWZ1bmN0aW9uIFdoKGUsdCxuKXtuLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJjYXJldC1jb2xvciIpLHQuX2Jsb2NrQ3Vyc29yRWxlbWVudD1udWxsLHQ9ZS5wYXJlbnRFbGVtZW50LHQhPT1udWxsJiZ0LnJlbW92ZUNoaWxkKGUpfWZ1bmN0aW9uIENyKGUpe3JldHVybiBHcj8oZXx8d2luZG93KS5nZXRTZWxlY3Rpb24oKTpudWxsfWZ1bmN0aW9uIG13KGUsdCl7bGV0IG49ZS5nZXRDaGlsZEF0SW5kZXgodCk7bj09bnVsbCYmKG49ZSksWm4oZSkmJlUoMTAyKTtsZXQgcj1sPT57Y29uc3Qgcz1sLmdldFBhcmVudE9yVGhyb3coKSxhPVpuKHMpLHU9bCE9PW58fGE/Z3cobCk6bDtpZihhKXJldHVybiBsLmluc2VydEFmdGVyKHUpLFtsLHUsdV07Y29uc3RbYyxkLGZdPXIocyk7cmV0dXJuIGw9bC5nZXROZXh0U2libGluZ3MoKSxmLmFwcGVuZCh1LC4uLmwpLFtjLGQsdV19LFtvLGldPXIobik7cmV0dXJuW28saV19ZnVuY3Rpb24gQ2MoZSx0KXtmb3IoO2UhPT1TcigpJiZlIT1udWxsOyl7aWYodChlKSlyZXR1cm4gZTtlPWUuZ2V0UGFyZW50KCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24geWIoZSl7bGV0IHQ9W10sbj1bZV07Zm9yKDswPG4ubGVuZ3RoOyl7bGV0IHI9bi5wb3AoKTtyPT09dm9pZCAwJiZVKDExMiksQihyKSYmbi51bnNoaWZ0KC4uLnIuZ2V0Q2hpbGRyZW4oKSksciE9PWUmJnQucHVzaChyKX1yZXR1cm4gdH1mdW5jdGlvbiBoZChlKXtyZXR1cm4gZS5ub2RlVHlwZT09PTF9ZnVuY3Rpb24gdncoZSx0LG4scixvLGkpe2ZvcihlPWUuZ2V0Rmlyc3RDaGlsZCgpO2UhPT1udWxsOyl7bGV0IGw9ZS5fX2tleTtlLl9fcGFyZW50PT09dCYmKEIoZSkmJnZ3KGUsbCxuLHIsbyxpKSxuLmhhcyhsKXx8aS5kZWxldGUobCksby5wdXNoKGwpKSxlPWUuZ2V0TmV4dFNpYmxpbmcoKX19ZnVuY3Rpb24geGIoZSx0LG4scil7ZT1lLl9ub2RlTWFwLHQ9dC5fbm9kZU1hcDtsZXQgbz1bXTtmb3IobGV0W2ldb2Ygcil7bGV0IGw9dC5nZXQoaSk7bD09PXZvaWQgMHx8bC5pc0F0dGFjaGVkKCl8fChCKGwpJiZ2dyhsLGksZSx0LG8sciksZS5oYXMoaSl8fHIuZGVsZXRlKGkpLG8ucHVzaChpKSl9Zm9yKGxldCBpIG9mIG8pdC5kZWxldGUoaSk7Zm9yKGxldCBpIG9mIG4pcj10LmdldChpKSxyPT09dm9pZCAwfHxyLmlzQXR0YWNoZWQoKXx8KGUuaGFzKGkpfHxuLmRlbGV0ZShpKSx0LmRlbGV0ZShpKSl9bGV0IGd0PSIiLEp0PSIiLE9yPSIiLFJvLEh0LGhhLHl3PSExLFhnPSExLHBkLEl1PW51bGwsVWgsVmgsaGksUG8sSGgscGE7ZnVuY3Rpb24ganUoZSx0KXtsZXQgbj1oaS5nZXQoZSk7aWYodCE9PW51bGwpe2xldCByPVloKGUpO3IucGFyZW50Tm9kZT09PXQmJnQucmVtb3ZlQ2hpbGQocil9UG8uaGFzKGUpfHxIdC5fa2V5VG9ET01NYXAuZGVsZXRlKGUpLEIobikmJihlPUVjKG4saGkpLEtoKGUsMCxlLmxlbmd0aC0xLG51bGwpKSxuIT09dm9pZCAwJiZZZyhwYSxoYSxwZCxuLCJkZXN0cm95ZWQiKX1mdW5jdGlvbiBLaChlLHQsbixyKXtmb3IoO3Q8PW47Kyt0KXtsZXQgbz1lW3RdO28hPT12b2lkIDAmJmp1KG8scil9fWZ1bmN0aW9uIEhvKGUsdCl7ZS5zZXRQcm9wZXJ0eSgidGV4dC1hbGlnbiIsdCl9ZnVuY3Rpb24geHcoZSx0KXt2YXIgbj1Sby50aGVtZS5pbmRlbnQ7aWYodHlwZW9mIG49PSJzdHJpbmciKXtsZXQgcj1lLmNsYXNzTGlzdC5jb250YWlucyhuKTswPHQmJiFyP2UuY2xhc3NMaXN0LmFkZChuKToxPnQmJnImJmUuY2xhc3NMaXN0LnJlbW92ZShuKX1uPWdldENvbXB1dGVkU3R5bGUoZSkuZ2V0UHJvcGVydHlWYWx1ZSgiLS1sZXhpY2FsLWluZGVudC1iYXNlLXZhbHVlIil8fCI0MHB4IixlLnN0eWxlLnNldFByb3BlcnR5KCJwYWRkaW5nLWlubGluZS1zdGFydCIsdD09PTA/IiI6YGNhbGMoJHt0fSAqICR7bn0pYCl9ZnVuY3Rpb24gX3coZSx0KXtlPWUuc3R5bGUsdD09PTA/SG8oZSwiIik6dD09PTE/SG8oZSwibGVmdCIpOnQ9PT0yP0hvKGUsImNlbnRlciIpOnQ9PT0zP0hvKGUsInJpZ2h0Iik6dD09PTQ/SG8oZSwianVzdGlmeSIpOnQ9PT01P0hvKGUsInN0YXJ0Iik6dD09PTYmJkhvKGUsImVuZCIpfWZ1bmN0aW9uIHp1KGUsdCxuKXtsZXQgcj1Qby5nZXQoZSk7cj09PXZvaWQgMCYmVSg2MCk7bGV0IG89ci5jcmVhdGVET00oUm8sSHQpO3ZhciBpPUh0Ll9rZXlUb0RPTU1hcDtpZihvWyJfX2xleGljYWxLZXlfIitIdC5fa2V5XT1lLGkuc2V0KGUsbyksUShyKT9vLnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLXRleHQiLCJ0cnVlIik6VmUocikmJm8uc2V0QXR0cmlidXRlKCJkYXRhLWxleGljYWwtZGVjb3JhdG9yIiwidHJ1ZSIpLEIocikpe2lmKGU9ci5fX2luZGVudCxpPXIuX19zaXplLGUhPT0wJiZ4dyhvLGUpLGkhPT0wKXstLWksZT1FYyhyLFBvKTt2YXIgbD1KdDtKdD0iIixHaChlLHIsMCxpLG8sbnVsbCksU3cocixvKSxKdD1sfWU9ci5fX2Zvcm1hdCxlIT09MCYmX3cobyxlKSxyLmlzSW5saW5lKCl8fHd3KG51bGwscixvKSxfYyhyKSYmKGd0Kz1gCgpgLE9yKz1gCgpgKX1lbHNlIGk9ci5nZXRUZXh0Q29udGVudCgpLFZlKHIpPyhsPXIuZGVjb3JhdGUoSHQsUm8pLGwhPT1udWxsJiZDdyhlLGwpLG8uY29udGVudEVkaXRhYmxlPSJmYWxzZSIpOlEocikmJihyLmlzRGlyZWN0aW9ubGVzcygpfHwoSnQrPWkpKSxndCs9aSxPcis9aTtyZXR1cm4gdCE9PW51bGwmJihuIT1udWxsP3QuaW5zZXJ0QmVmb3JlKG8sbik6KG49dC5fX2xleGljYWxMaW5lQnJlYWssbiE9bnVsbD90Lmluc2VydEJlZm9yZShvLG4pOnQuYXBwZW5kQ2hpbGQobykpKSxZZyhwYSxoYSxwZCxyLCJjcmVhdGVkIiksb31mdW5jdGlvbiBHaChlLHQsbixyLG8saSl7bGV0IGw9Z3Q7Zm9yKGd0PSIiO248PXI7KytuKXp1KGVbbl0sbyxpKTtfYyh0KSYmKGd0Kz1gCgpgKSxvLl9fbGV4aWNhbFRleHRDb250ZW50PWd0LGd0PWwrZ3R9ZnVuY3Rpb24gZnkoZSx0KXtyZXR1cm4gZT10LmdldChlKSxtYShlKXx8VmUoZSkmJmUuaXNJbmxpbmUoKX1mdW5jdGlvbiB3dyhlLHQsbil7ZT1lIT09bnVsbCYmKGUuX19zaXplPT09MHx8ZnkoZS5fX2xhc3QsaGkpKSx0PXQuX19zaXplPT09MHx8ZnkodC5fX2xhc3QsUG8pLGU/dHx8KHQ9bi5fX2xleGljYWxMaW5lQnJlYWssdCE9bnVsbCYmbi5yZW1vdmVDaGlsZCh0KSxuLl9fbGV4aWNhbExpbmVCcmVhaz1udWxsKTp0JiYodD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpLG4uX19sZXhpY2FsTGluZUJyZWFrPXQsbi5hcHBlbmRDaGlsZCh0KSl9ZnVuY3Rpb24gU3coZSx0KXt2YXIgbj10Ll9fbGV4aWNhbERpcjtpZih0Ll9fbGV4aWNhbERpclRleHRDb250ZW50IT09SnR8fG4hPT1JdSl7bGV0IGk9SnQ9PT0iIjtpZihpKXZhciByPUl1O2Vsc2Ugcj1KdCxyPWxiLnRlc3Qocik/InJ0bCI6c2IudGVzdChyKT8ibHRyIjpudWxsO2lmKHIhPT1uKXtsZXQgbD10LmNsYXNzTGlzdCxzPVJvLnRoZW1lO3ZhciBvPW4hPT1udWxsP3Nbbl06dm9pZCAwO2xldCBhPXIhPT1udWxsP3Nbcl06dm9pZCAwO28hPT12b2lkIDAmJih0eXBlb2Ygbz09InN0cmluZyImJihvPW8uc3BsaXQoIiAiKSxvPXNbbl09byksbC5yZW1vdmUoLi4ubykpLHI9PT1udWxsfHxpJiZyPT09Imx0ciI/dC5yZW1vdmVBdHRyaWJ1dGUoImRpciIpOihhIT09dm9pZCAwJiYodHlwZW9mIGE9PSJzdHJpbmciJiYobj1hLnNwbGl0KCIgIiksYT1zW3JdPW4pLGEhPT12b2lkIDAmJmwuYWRkKC4uLmEpKSx0LmRpcj1yKSxYZ3x8KGUuZ2V0V3JpdGFibGUoKS5fX2Rpcj1yKX1JdT1yLHQuX19sZXhpY2FsRGlyVGV4dENvbnRlbnQ9SnQsdC5fX2xleGljYWxEaXI9cn19ZnVuY3Rpb24gRWMoZSx0KXtsZXQgbj1bXTtmb3IoZT1lLl9fZmlyc3Q7ZSE9PW51bGw7KXtsZXQgcj10LmdldChlKTtyPT09dm9pZCAwJiZVKDEwMSksbi5wdXNoKGUpLGU9ci5fX25leHR9cmV0dXJuIG59ZnVuY3Rpb24gX3MoZSx0KXt2YXIgbj1oaS5nZXQoZSkscj1Qby5nZXQoZSk7biE9PXZvaWQgMCYmciE9PXZvaWQgMHx8VSg2MSk7dmFyIG89eXd8fFZoLmhhcyhlKXx8VWguaGFzKGUpO2xldCBpPXdjKEh0LGUpO2lmKG49PT1yJiYhbylyZXR1cm4gQihuKT8ocj1pLl9fbGV4aWNhbFRleHRDb250ZW50LHIhPT12b2lkIDAmJihndCs9cixPcis9cikscj1pLl9fbGV4aWNhbERpclRleHRDb250ZW50LHIhPT12b2lkIDAmJihKdCs9cikpOihyPW4uZ2V0VGV4dENvbnRlbnQoKSxRKG4pJiYhbi5pc0RpcmVjdGlvbmxlc3MoKSYmKEp0Kz1yKSxPcis9cixndCs9ciksaTtpZihuIT09ciYmbyYmWWcocGEsaGEscGQsciwidXBkYXRlZCIpLHIudXBkYXRlRE9NKG4saSxSbykpcmV0dXJuIHI9enUoZSxudWxsLG51bGwpLHQ9PT1udWxsJiZVKDYyKSx0LnJlcGxhY2VDaGlsZChyLGkpLGp1KGUsbnVsbCkscjtpZihCKG4pJiZCKHIpKXtpZihlPXIuX19pbmRlbnQsZSE9PW4uX19pbmRlbnQmJnh3KGksZSksZT1yLl9fZm9ybWF0LGUhPT1uLl9fZm9ybWF0JiZfdyhpLGUpLG8pe2U9cixvPUp0LEp0PSIiLHQ9Z3Q7dmFyIGw9bi5fX3NpemUscz1lLl9fc2l6ZTtpZihndD0iIixsPT09MSYmcz09PTEpe3ZhciBhPW4uX19maXJzdCx1PWUuX19maXJzdDtpZihhPT09dSlfcyhhLGkpO2Vsc2V7dmFyIGM9WWgoYSk7dT16dSh1LG51bGwsbnVsbCksaS5yZXBsYWNlQ2hpbGQodSxjKSxqdShhLG51bGwpfX1lbHNle3U9RWMobixoaSk7dmFyIGQ9RWMoZSxQbyk7aWYobD09PTApcyE9PTAmJkdoKGQsZSwwLHMtMSxpLG51bGwpO2Vsc2UgaWYocz09PTApbCE9PTAmJihhPWkuX19sZXhpY2FsTGluZUJyZWFrPT1udWxsLEtoKHUsMCxsLTEsYT9udWxsOmkpLGEmJihpLnRleHRDb250ZW50PSIiKSk7ZWxzZXt2YXIgZj11O3U9ZCxkPWwtMSxsPXMtMTtsZXQgZz1pLmZpcnN0Q2hpbGQsbT0wO2ZvcihzPTA7bTw9ZCYmczw9bDspe3ZhciBoPWZbbV07bGV0IFM9dVtzXTtpZihoPT09UylnPW1mKF9zKFMsaSkpLG0rKyxzKys7ZWxzZXthPT09dm9pZCAwJiYoYT1uZXcgU2V0KGYpKSxjPT09dm9pZCAwJiYoYz1uZXcgU2V0KHUpKTtsZXQgdj1jLmhhcyhoKSx5PWEuaGFzKFMpO3Y/KHk/KGg9d2MoSHQsUyksaD09PWc/Zz1tZihfcyhTLGkpKTooZyE9bnVsbD9pLmluc2VydEJlZm9yZShoLGcpOmkuYXBwZW5kQ2hpbGQoaCksX3MoUyxpKSksbSsrKTp6dShTLGksZykscysrKTooZz1tZihZaChoKSksanUoaCxpKSxtKyspfX1hPW0+ZCxjPXM+bCxhJiYhYz8oYT11W2wrMV0sYT1hPT09dm9pZCAwP251bGw6SHQuZ2V0RWxlbWVudEJ5S2V5KGEpLEdoKHUsZSxzLGwsaSxhKSk6YyYmIWEmJktoKGYsbSxkLGkpfX1fYyhlKSYmKGd0Kz1gCgpgKSxpLl9fbGV4aWNhbFRleHRDb250ZW50PWd0LGd0PXQrZ3QsU3coZSxpKSxKdD1vLGVuKHIpfHxyLmlzSW5saW5lKCl8fHd3KG4scixpKX1fYyhyKSYmKGd0Kz1gCgpgLE9yKz1gCgpgKX1lbHNlIG49ci5nZXRUZXh0Q29udGVudCgpLFZlKHIpPyhvPXIuZGVjb3JhdGUoSHQsUm8pLG8hPT1udWxsJiZDdyhlLG8pKTpRKHIpJiYhci5pc0RpcmVjdGlvbmxlc3MoKSYmKEp0Kz1uKSxndCs9bixPcis9bjtyZXR1cm4hWGcmJmVuKHIpJiZyLl9fY2FjaGVkVGV4dCE9PU9yJiYocj1yLmdldFdyaXRhYmxlKCksci5fX2NhY2hlZFRleHQ9T3IpLGl9ZnVuY3Rpb24gQ3coZSx0KXtsZXQgbj1IdC5fcGVuZGluZ0RlY29yYXRvcnMscj1IdC5fZGVjb3JhdG9ycztpZihuPT09bnVsbCl7aWYocltlXT09PXQpcmV0dXJuO249Y3coSHQpfW5bZV09dH1mdW5jdGlvbiBtZihlKXtyZXR1cm4gZT1lLm5leHRTaWJsaW5nLGUhPT1udWxsJiZlPT09SHQuX2Jsb2NrQ3Vyc29yRWxlbWVudCYmKGU9ZS5uZXh0U2libGluZyksZX1mdW5jdGlvbiBZaChlKXtsZXQgdD1IaC5nZXQoZSk7cmV0dXJuIHQ9PT12b2lkIDAmJlUoNzUsZSksdH1sZXQgVHI9T2JqZWN0LmZyZWV6ZSh7fSksWGg9W1sia2V5ZG93biIsVGJdLFsicG9pbnRlcmRvd24iLHdiXSxbImNvbXBvc2l0aW9uc3RhcnQiLCRiXSxbImNvbXBvc2l0aW9uZW5kIixrYl0sWyJpbnB1dCIsRWJdLFsiY2xpY2siLF9iXSxbImN1dCIsVHJdLFsiY29weSIsVHJdLFsiZHJhZ3N0YXJ0IixUcl0sWyJkcmFnb3ZlciIsVHJdLFsiZHJhZ2VuZCIsVHJdLFsicGFzdGUiLFRyXSxbImZvY3VzIixUcl0sWyJibHVyIixUcl0sWyJkcm9wIixUcl1dO3ZjJiZYaC5wdXNoKFsiYmVmb3JlaW5wdXQiLChlLHQpPT5DYihlLHQpXSk7bGV0IGdhPTAsRXc9MCwkdz0wLFdpPW51bGwsSXM9MCxRaD0hMSxKaD0hMSxqcz0hMSx3cz0hMSxrdz1bMCwiIiwwLCJyb290IiwwXTtmdW5jdGlvbiBUdyhlLHQsbixyLG8pe2xldCBpPWUuYW5jaG9yLGw9ZS5mb2N1cyxzPWkuZ2V0Tm9kZSgpO3ZhciBhPWV0KCk7bGV0IHU9Q3IoYS5fd2luZG93KSxjPXUhPT1udWxsP3UuYW5jaG9yTm9kZTpudWxsLGQ9aS5rZXk7YT1hLmdldEVsZW1lbnRCeUtleShkKTtsZXQgZj1uLmxlbmd0aDtyZXR1cm4gZCE9PWwua2V5fHwhUShzKXx8KCFvJiYoIXZjfHwkdzxyKzUwKXx8cy5pc0RpcnR5KCkmJjI+Znx8ZHcobikpJiZpLm9mZnNldCE9PWwub2Zmc2V0JiYhcy5pc0NvbXBvc2luZygpfHxGaChzKXx8cy5pc0RpcnR5KCkmJjE8Znx8KG98fCF2YykmJmEhPT1udWxsJiYhcy5pc0NvbXBvc2luZygpJiZjIT09eWMoYSl8fHUhPT1udWxsJiZ0IT09bnVsbCYmKCF0LmNvbGxhcHNlZHx8dC5zdGFydENvbnRhaW5lciE9PXUuYW5jaG9yTm9kZXx8dC5zdGFydE9mZnNldCE9PXUuYW5jaG9yT2Zmc2V0KXx8cy5nZXRGb3JtYXQoKSE9PWUuZm9ybWF0fHxzLmdldFN0eWxlKCkhPT1lLnN0eWxlfHx2YihlLHMpfWZ1bmN0aW9uIGh5KGUsdCl7cmV0dXJuIGUhPT1udWxsJiZlLm5vZGVWYWx1ZSE9PW51bGwmJmUubm9kZVR5cGU9PT0zJiZ0IT09MCYmdCE9PWUubm9kZVZhbHVlLmxlbmd0aH1mdW5jdGlvbiBweShlLHQsbil7bGV0e2FuY2hvck5vZGU6cixhbmNob3JPZmZzZXQ6byxmb2N1c05vZGU6aSxmb2N1c09mZnNldDpsfT1lO1FoJiYoUWg9ITEsaHkocixvKSYmaHkoaSxsKSl8fGtuKHQsKCk9PntpZighbil2cihudWxsKTtlbHNlIGlmKEFhKHQscixpKSl7dmFyIHM9S2UoKTtpZihkZShzKSl7dmFyIGE9cy5hbmNob3IsdT1hLmdldE5vZGUoKTtpZihzLmlzQ29sbGFwc2VkKCkpe2UudHlwZT09PSJSYW5nZSImJmUuYW5jaG9yTm9kZT09PWUuZm9jdXNOb2RlJiYocy5kaXJ0eT0hMCk7dmFyIGM9ZmQodCkuZXZlbnQ7Yz1jP2MudGltZVN0YW1wOnBlcmZvcm1hbmNlLm5vdygpO2xldFtkLGYsaCxnLG1dPWt3O2M8bSsyMDAmJmEub2Zmc2V0PT09aCYmYS5rZXk9PT1nPyhzLmZvcm1hdD1kLHMuc3R5bGU9Zik6YS50eXBlPT09InRleHQiPyhzLmZvcm1hdD11LmdldEZvcm1hdCgpLHMuc3R5bGU9dS5nZXRTdHlsZSgpKTphLnR5cGU9PT0iZWxlbWVudCImJihzLmZvcm1hdD0wLHMuc3R5bGU9IiIpfWVsc2V7YT0yNTUsdT0hMSxjPXMuZ2V0Tm9kZXMoKTtsZXQgZD1jLmxlbmd0aDtmb3IobGV0IGY9MDtmPGQ7ZisrKXtsZXQgaD1jW2ZdO2lmKFEoaCkmJih1PSEwLGEmPWguZ2V0Rm9ybWF0KCksYT09PTApKWJyZWFrfXMuZm9ybWF0PXU/YTowfX1ZKHQsYWQsdm9pZCAwKX19KX1mdW5jdGlvbiBfYihlLHQpe2tuKHQsKCk9PntsZXQgbj1LZSgpO3ZhciByPUNyKHQuX3dpbmRvdyk7bGV0IG89V2woKTtpZihyKWlmKGRlKG4pKXtsZXQgbD1uLmFuY2hvcjt2YXIgaT1sLmdldE5vZGUoKTtsLnR5cGU9PT0iZWxlbWVudCImJmwub2Zmc2V0PT09MCYmbi5pc0NvbGxhcHNlZCgpJiYhZW4oaSkmJlNyKCkuZ2V0Q2hpbGRyZW5TaXplKCk9PT0xJiZpLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5pc0VtcHR5KCkmJm8hPT1udWxsJiZuLmlzKG8pPyhyLnJlbW92ZUFsbFJhbmdlcygpLG4uZGlydHk9ITApOmUuZGV0YWlsIT09M3x8bi5pc0NvbGxhcHNlZCgpfHwocj1uLmZvY3VzLmdldE5vZGUoKSxpIT09ciYmKEIoaSk/aS5zZWxlY3QoMCk6aS5nZXRQYXJlbnRPclRocm93KCkuc2VsZWN0KDApKSl9ZWxzZSBlLnBvaW50ZXJUeXBlPT09InRvdWNoIiYmKGk9ci5hbmNob3JOb2RlLGkhPT1udWxsJiYoaT1pLm5vZGVUeXBlLGk9PT0xfHxpPT09MykpJiYocj1KZyhvLHIsdCksdnIocikpO1kodCxMXyxlKX0pfWZ1bmN0aW9uIHdiKGUsdCl7bGV0IG49ZS50YXJnZXQ7ZT1lLnBvaW50ZXJUeXBlLG4gaW5zdGFuY2VvZiBOb2RlJiZlIT09InRvdWNoIiYma24odCwoKT0+e1ZlKE1hKG4pKXx8KEpoPSEwKX0pfWZ1bmN0aW9uIE53KGUpe3JldHVybiBlLmdldFRhcmdldFJhbmdlcz8oZT1lLmdldFRhcmdldFJhbmdlcygpLGUubGVuZ3RoPT09MD9udWxsOmVbMF0pOm51bGx9ZnVuY3Rpb24gU2IoZSx0KXtyZXR1cm4gZSE9PXR8fEIoZSl8fEIodCl8fCFlLmlzVG9rZW4oKXx8IXQuaXNUb2tlbigpfWZ1bmN0aW9uIENiKGUsdCl7bGV0IG49ZS5pbnB1dFR5cGUscj1OdyhlKTtuPT09ImRlbGV0ZUNvbXBvc2l0aW9uVGV4dCJ8fGJvJiZodyh0KXx8biE9PSJpbnNlcnRDb21wb3NpdGlvblRleHQiJiZrbih0LCgpPT57bGV0IG89S2UoKTtpZihuPT09ImRlbGV0ZUNvbnRlbnRCYWNrd2FyZCIpe2lmKG89PT1udWxsKXt2YXIgaT1XbCgpO2lmKCFkZShpKSlyZXR1cm47dnIoaS5jbG9uZSgpKX1pZihkZShvKSl7RXc9PT0yMjkmJmUudGltZVN0YW1wPGdhKzMwJiZ0LmlzQ29tcG9zaW5nKCkmJm8uYW5jaG9yLmtleT09PW8uZm9jdXMua2V5PyhNdChudWxsKSxnYT0wLHNldFRpbWVvdXQoKCk9Pntrbih0LCgpPT57TXQobnVsbCl9KX0sMzApLGRlKG8pJiYoaT1vLmFuY2hvci5nZXROb2RlKCksaS5tYXJrRGlydHkoKSxvLmZvcm1hdD1pLmdldEZvcm1hdCgpLG8uc3R5bGU9aS5nZXRTdHlsZSgpKSk6KGUucHJldmVudERlZmF1bHQoKSxZKHQsY2EsITApKTtyZXR1cm59fWlmKGRlKG8pKXtpPWUuZGF0YSxXaSE9PW51bGwmJktnKCExLHQsV2kpLG8uZGlydHkmJldpPT09bnVsbHx8IW8uaXNDb2xsYXBzZWQoKXx8ZW4oby5hbmNob3IuZ2V0Tm9kZSgpKXx8cj09PW51bGx8fG8uYXBwbHlET01SYW5nZShyKSxXaT1udWxsO3ZhciBsPW8uZm9jdXMscz1vLmFuY2hvci5nZXROb2RlKCk7aWYobD1sLmdldE5vZGUoKSxuPT09Imluc2VydFRleHQifHxuPT09Imluc2VydFRyYW5zcG9zZSIpaT09PWAKYD8oZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxEcywhMSkpOmk9PT1gCgpgPyhlLnByZXZlbnREZWZhdWx0KCksWSh0LExoLHZvaWQgMCkpOmk9PW51bGwmJmUuZGF0YVRyYW5zZmVyPyhpPWUuZGF0YVRyYW5zZmVyLmdldERhdGEoInRleHQvcGxhaW4iKSxlLnByZXZlbnREZWZhdWx0KCksby5pbnNlcnRSYXdUZXh0KGkpKTppIT1udWxsJiZUdyhvLHIsaSxlLnRpbWVTdGFtcCwhMCk/KGUucHJldmVudERlZmF1bHQoKSxZKHQsZmwsaSkpOldpPWksJHc9ZS50aW1lU3RhbXA7ZWxzZSBzd2l0Y2goZS5wcmV2ZW50RGVmYXVsdCgpLG4pe2Nhc2UiaW5zZXJ0RnJvbVlhbmsiOmNhc2UiaW5zZXJ0RnJvbURyb3AiOmNhc2UiaW5zZXJ0UmVwbGFjZW1lbnRUZXh0IjpZKHQsZmwsZSk7YnJlYWs7Y2FzZSJpbnNlcnRGcm9tQ29tcG9zaXRpb24iOk10KG51bGwpLFkodCxmbCxlKTticmVhaztjYXNlImluc2VydExpbmVCcmVhayI6TXQobnVsbCksWSh0LERzLCExKTticmVhaztjYXNlImluc2VydFBhcmFncmFwaCI6TXQobnVsbCksanMmJiF1ZD8oanM9ITEsWSh0LERzLCExKSk6WSh0LExoLHZvaWQgMCk7YnJlYWs7Y2FzZSJpbnNlcnRGcm9tUGFzdGUiOmNhc2UiaW5zZXJ0RnJvbVBhc3RlQXNRdW90YXRpb24iOlkodCxNZyxlKTticmVhaztjYXNlImRlbGV0ZUJ5Q29tcG9zaXRpb24iOlNiKHMsbCkmJlkodCxJaCxlKTticmVhaztjYXNlImRlbGV0ZUJ5RHJhZyI6Y2FzZSJkZWxldGVCeUN1dCI6WSh0LEloLGUpO2JyZWFrO2Nhc2UiZGVsZXRlQ29udGVudCI6WSh0LGNhLCExKTticmVhaztjYXNlImRlbGV0ZVdvcmRCYWNrd2FyZCI6WSh0LGRhLCEwKTticmVhaztjYXNlImRlbGV0ZVdvcmRGb3J3YXJkIjpZKHQsZGEsITEpO2JyZWFrO2Nhc2UiZGVsZXRlSGFyZExpbmVCYWNrd2FyZCI6Y2FzZSJkZWxldGVTb2Z0TGluZUJhY2t3YXJkIjpZKHQsZmEsITApO2JyZWFrO2Nhc2UiZGVsZXRlQ29udGVudEZvcndhcmQiOmNhc2UiZGVsZXRlSGFyZExpbmVGb3J3YXJkIjpjYXNlImRlbGV0ZVNvZnRMaW5lRm9yd2FyZCI6WSh0LGZhLCExKTticmVhaztjYXNlImZvcm1hdFN0cmlrZVRocm91Z2giOlkodCxnbywic3RyaWtldGhyb3VnaCIpO2JyZWFrO2Nhc2UiZm9ybWF0Qm9sZCI6WSh0LGdvLCJib2xkIik7YnJlYWs7Y2FzZSJmb3JtYXRJdGFsaWMiOlkodCxnbywiaXRhbGljIik7YnJlYWs7Y2FzZSJmb3JtYXRVbmRlcmxpbmUiOlkodCxnbywidW5kZXJsaW5lIik7YnJlYWs7Y2FzZSJoaXN0b3J5VW5kbyI6WSh0LERnLHZvaWQgMCk7YnJlYWs7Y2FzZSJoaXN0b3J5UmVkbyI6WSh0LExnLHZvaWQgMCl9fX0pfWZ1bmN0aW9uIEViKGUsdCl7ZS5zdG9wUHJvcGFnYXRpb24oKSxrbih0LCgpPT57dmFyIG49S2UoKSxyPWUuZGF0YSxvPU53KGUpO2lmKHIhPW51bGwmJmRlKG4pJiZUdyhuLG8scixlLnRpbWVTdGFtcCwhMSkpe3dzJiYoWmgodCxyKSx3cz0hMSk7dmFyIGk9bi5hbmNob3IsbD1pLmdldE5vZGUoKTtpZihvPUNyKHQuX3dpbmRvdyksbz09PW51bGwpcmV0dXJuO2xldCBzPWkub2Zmc2V0OyhpPXZjJiYhbi5pc0NvbGxhcHNlZCgpJiZRKGwpJiZvLmFuY2hvck5vZGUhPT1udWxsKSYmKGw9bC5nZXRUZXh0Q29udGVudCgpLnNsaWNlKDAscykrcitsLmdldFRleHRDb250ZW50KCkuc2xpY2UocytuLmZvY3VzLm9mZnNldCksbz1vLmFuY2hvck5vZGUsaT1sPT09KG8ubm9kZVR5cGU9PT0zP28ubm9kZVZhbHVlOm51bGwpKSxpfHxZKHQsZmwscikscj1yLmxlbmd0aCxibyYmMTxyJiZlLmlucHV0VHlwZT09PSJpbnNlcnRDb21wb3NpdGlvblRleHQiJiYhdC5pc0NvbXBvc2luZygpJiYobi5hbmNob3Iub2Zmc2V0LT1yKSx6Z3x8dWR8fEZnfHwhdC5pc0NvbXBvc2luZygpfHwoZ2E9MCxNdChudWxsKSl9ZWxzZSBLZyghMSx0LHIhPT1udWxsP3I6dm9pZCAwKSx3cyYmKFpoKHQscnx8dm9pZCAwKSx3cz0hMSk7WnQoKSxuPWV0KCkscncobil9KSxXaT1udWxsfWZ1bmN0aW9uICRiKGUsdCl7a24odCwoKT0+e2xldCBuPUtlKCk7aWYoZGUobikmJiF0LmlzQ29tcG9zaW5nKCkpe2xldCByPW4uYW5jaG9yLG89bi5hbmNob3IuZ2V0Tm9kZSgpO010KHIua2V5KSwoZS50aW1lU3RhbXA8Z2ErMzB8fHIudHlwZT09PSJlbGVtZW50Inx8IW4uaXNDb2xsYXBzZWQoKXx8by5nZXRGb3JtYXQoKSE9PW4uZm9ybWF0fHxvLmdldFN0eWxlKCkhPT1uLnN0eWxlKSYmWSh0LGZsLGliKX19KX1mdW5jdGlvbiBaaChlLHQpe3ZhciBuPWUuX2NvbXBvc2l0aW9uS2V5O2lmKE10KG51bGwpLG4hPT1udWxsJiZ0IT1udWxsKXtpZih0PT09IiIpe3Q9JHQobiksZT15YyhlLmdldEVsZW1lbnRCeUtleShuKSksZSE9PW51bGwmJmUubm9kZVZhbHVlIT09bnVsbCYmUSh0KSYmR2codCxlLm5vZGVWYWx1ZSxudWxsLG51bGwsITApO3JldHVybn1pZih0W3QubGVuZ3RoLTFdPT09YApgJiYobj1LZSgpLGRlKG4pKSl7dD1uLmZvY3VzLG4uYW5jaG9yLnNldCh0LmtleSx0Lm9mZnNldCx0LnR5cGUpLFkoZSxtYyxudWxsKTtyZXR1cm59fUtnKCEwLGUsdCl9ZnVuY3Rpb24ga2IoZSx0KXtibz93cz0hMDprbih0LCgpPT57WmgodCxlLmRhdGEpfSl9ZnVuY3Rpb24gVGIoZSx0KXtpZihnYT1lLnRpbWVTdGFtcCxFdz1lLmtleUNvZGUsIXQuaXNDb21wb3NpbmcoKSl7dmFye2tleUNvZGU6bixzaGlmdEtleTpyLGN0cmxLZXk6byxtZXRhS2V5OmksYWx0S2V5Omx9PWU7aWYoIVkodCxJXyxlKSl7aWYobiE9PTM5fHxvfHxpfHxsKWlmKG4hPT0zOXx8bHx8cnx8IW8mJiFpKWlmKG4hPT0zN3x8b3x8aXx8bClpZihuIT09Mzd8fGx8fHJ8fCFvJiYhaSlpZihuIT09Mzh8fG98fGkpaWYobiE9PTQwfHxvfHxpKWlmKG49PT0xMyYmcilqcz0hMCxZKHQsbWMsZSk7ZWxzZSBpZihuPT09MzIpWSh0LFZfLGUpO2Vsc2UgaWYoV3QmJm8mJm49PT03OSllLnByZXZlbnREZWZhdWx0KCksanM9ITAsWSh0LERzLCEwKTtlbHNlIGlmKG4hPT0xM3x8cil7dmFyIHM9V3Q/bHx8aT8hMTpuPT09OHx8bj09PTcyJiZvOm98fGx8fGk/ITE6bj09PTg7cz9uPT09OD9ZKHQsSF8sZSk6KGUucHJldmVudERlZmF1bHQoKSxZKHQsY2EsITApKTpuPT09Mjc/WSh0LEtfLGUpOihzPVd0P3J8fGx8fGk/ITE6bj09PTQ2fHxuPT09NjgmJm86b3x8bHx8aT8hMTpuPT09NDYscz9uPT09NDY/WSh0LEdfLGUpOihlLnByZXZlbnREZWZhdWx0KCksWSh0LGNhLCExKSk6bj09PTgmJihXdD9sOm8pPyhlLnByZXZlbnREZWZhdWx0KCksWSh0LGRhLCEwKSk6bj09PTQ2JiYoV3Q/bDpvKT8oZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxkYSwhMSkpOld0JiZpJiZuPT09OD8oZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxmYSwhMCkpOld0JiZpJiZuPT09NDY/KGUucHJldmVudERlZmF1bHQoKSxZKHQsZmEsITEpKTpuPT09NjYmJiFsJiYoV3Q/aTpvKT8oZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxnbywiYm9sZCIpKTpuPT09ODUmJiFsJiYoV3Q/aTpvKT8oZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxnbywidW5kZXJsaW5lIikpOm49PT03MyYmIWwmJihXdD9pOm8pPyhlLnByZXZlbnREZWZhdWx0KCksWSh0LGdvLCJpdGFsaWMiKSk6biE9PTl8fGx8fG98fGk/bj09PTkwJiYhciYmKFd0P2k6byk/KGUucHJldmVudERlZmF1bHQoKSxZKHQsRGcsdm9pZCAwKSk6KHM9V3Q/bj09PTkwJiZpJiZyOm49PT04OSYmb3x8bj09PTkwJiZvJiZyLHM/KGUucHJldmVudERlZmF1bHQoKSxZKHQsTGcsdm9pZCAwKSk6QmwodC5fZWRpdG9yU3RhdGUuX3NlbGVjdGlvbik/KHM9cj8hMTpuPT09Njc/V3Q/aTpvOiExLHM/KGUucHJldmVudERlZmF1bHQoKSxZKHQsSWcsZSkpOihzPXI/ITE6bj09PTg4P1d0P2k6bzohMSxzPyhlLnByZXZlbnREZWZhdWx0KCksWSh0LGpnLGUpKTpuPT09NjUmJihXdD9pOm8pJiYoZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxqaCxlKSkpKTohYm8mJm49PT02NSYmKFd0P2k6bykmJihlLnByZXZlbnREZWZhdWx0KCksWSh0LGpoLGUpKSk6WSh0LFlfLGUpKX1lbHNlIGpzPSExLFkodCxtYyxlKTtlbHNlIFkodCxVXyxlKTtlbHNlIFkodCxXXyxlKTtlbHNlIFkodCxCXyxlKTtlbHNlIFkodCxGXyxlKTtlbHNlIFkodCx6XyxlKTtlbHNlIFkodCxqXyxlKTsob3x8cnx8bHx8aSkmJlkodCx0dyxlKX19fWZ1bmN0aW9uIGJ3KGUpe2xldCB0PWUuX19sZXhpY2FsRXZlbnRIYW5kbGVzO3JldHVybiB0PT09dm9pZCAwJiYodD1bXSxlLl9fbGV4aWNhbEV2ZW50SGFuZGxlcz10KSx0fWxldCBobD1uZXcgTWFwO2Z1bmN0aW9uIFJ3KGUpe2U9ZS50YXJnZXQ7bGV0IHQ9Q3IoZT09bnVsbD9udWxsOmUubm9kZVR5cGU9PT05P2UuZGVmYXVsdFZpZXc6ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KTtpZih0IT09bnVsbCl7dmFyIG49VmcodC5hbmNob3JOb2RlKTtpZihuIT09bnVsbCl7SmgmJihKaD0hMSxrbihuLCgpPT57dmFyIGw9V2woKSxzPXQuYW5jaG9yTm9kZTtzIT09bnVsbCYmKHM9cy5ub2RlVHlwZSxzPT09MXx8cz09PTMpJiYobD1KZyhsLHQsbiksdnIobCkpfSkpLGU9SGcobiksZT1lW2UubGVuZ3RoLTFdO3ZhciByPWUuX2tleSxvPWhsLmdldChyKSxpPW98fGU7aSE9PW4mJnB5KHQsaSwhMSkscHkodCxuLCEwKSxuIT09ZT9obC5zZXQocixuKTpvJiZobC5kZWxldGUocil9fX1mdW5jdGlvbiBOYihlLHQpe0lzPT09MCYmZS5vd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsUncpLElzKyssZS5fX2xleGljYWxFZGl0b3I9dDtsZXQgbj1idyhlKTtmb3IobGV0IHI9MDtyPFhoLmxlbmd0aDtyKyspe2xldFtvLGldPVhoW3JdLGw9dHlwZW9mIGk9PSJmdW5jdGlvbiI/cz0+e3MuX2xleGljYWxIYW5kbGVkIT09ITAmJihzLl9sZXhpY2FsSGFuZGxlZD0hMCx0LmlzRWRpdGFibGUoKSYmaShzLHQpKX06cz0+e2lmKHMuX2xleGljYWxIYW5kbGVkIT09ITAmJihzLl9sZXhpY2FsSGFuZGxlZD0hMCx0LmlzRWRpdGFibGUoKSkpc3dpdGNoKG8pe2Nhc2UiY3V0IjpyZXR1cm4gWSh0LGpnLHMpO2Nhc2UiY29weSI6cmV0dXJuIFkodCxJZyxzKTtjYXNlInBhc3RlIjpyZXR1cm4gWSh0LE1nLHMpO2Nhc2UiZHJhZ3N0YXJ0IjpyZXR1cm4gWSh0LFFfLHMpO2Nhc2UiZHJhZ292ZXIiOnJldHVybiBZKHQsSl8scyk7Y2FzZSJkcmFnZW5kIjpyZXR1cm4gWSh0LFpfLHMpO2Nhc2UiZm9jdXMiOnJldHVybiBZKHQscV8scyk7Y2FzZSJibHVyIjpyZXR1cm4gWSh0LGV3LHMpO2Nhc2UiZHJvcCI6cmV0dXJuIFkodCxYXyxzKX19O2UuYWRkRXZlbnRMaXN0ZW5lcihvLGwpLG4ucHVzaCgoKT0+e2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLGwpfSl9fWZ1bmN0aW9uIHFoKGUsdCxuKXtadCgpO3ZhciByPWUuX19rZXk7bGV0IG89ZS5nZXRQYXJlbnQoKTtpZihvIT09bnVsbCl7dmFyIGk9S2UoKTtpZihkZShpKSYmQihlKSl7dmFye2FuY2hvcjpsLGZvY3VzOnN9PWksYT1sLmdldE5vZGUoKSx1PXMuZ2V0Tm9kZSgpO1NjKGEsZSkmJmwuc2V0KGUuX19rZXksMCwiZWxlbWVudCIpLFNjKHUsZSkmJnMuc2V0KGUuX19rZXksMCwiZWxlbWVudCIpfWlmKGE9aSx1PSExLGRlKGEpJiZ0KXtpPWEuYW5jaG9yO2xldCBjPWEuZm9jdXM7aS5rZXk9PT1yJiYoa2MoaSxlLG8sZS5nZXRQcmV2aW91c1NpYmxpbmcoKSxlLmdldE5leHRTaWJsaW5nKCkpLHU9ITApLGMua2V5PT09ciYmKGtjKGMsZSxvLGUuZ2V0UHJldmlvdXNTaWJsaW5nKCksZS5nZXROZXh0U2libGluZygpKSx1PSEwKX1lbHNlIEJsKGEpJiZ0JiZlLmlzU2VsZWN0ZWQoKSYmZS5zZWxlY3RQcmV2aW91cygpO2RlKGEpJiZ0JiYhdT8ocj1lLmdldEluZGV4V2l0aGluUGFyZW50KCksaWkoZSksJGMoYSxvLHIsLTEpKTppaShlKSxufHxabihvKXx8by5jYW5CZUVtcHR5KCl8fCFvLmlzRW1wdHkoKXx8cWgobyx0KSx0JiZlbihvKSYmby5pc0VtcHR5KCkmJm8uc2VsZWN0RW5kKCl9fWNsYXNzIExhe3N0YXRpYyBnZXRUeXBlKCl7VSg2NCx0aGlzLm5hbWUpfXN0YXRpYyBjbG9uZSgpe1UoNjUsdGhpcy5uYW1lKX1jb25zdHJ1Y3Rvcih0KXt0aGlzLl9fdHlwZT10aGlzLmNvbnN0cnVjdG9yLmdldFR5cGUoKSx0aGlzLl9fbmV4dD10aGlzLl9fcHJldj10aGlzLl9fcGFyZW50PW51bGwsYXcodGhpcyx0KX1nZXRUeXBlKCl7cmV0dXJuIHRoaXMuX190eXBlfWlzQXR0YWNoZWQoKXtmb3IodmFyIHQ9dGhpcy5fX2tleTt0IT09bnVsbDspe2lmKHQ9PT0icm9vdCIpcmV0dXJuITA7aWYodD0kdCh0KSx0PT09bnVsbClicmVhazt0PXQuX19wYXJlbnR9cmV0dXJuITF9aXNTZWxlY3RlZCh0KXtpZih0PXR8fEtlKCksdD09bnVsbClyZXR1cm4hMTtsZXQgbj10LmdldE5vZGVzKCkuc29tZShyPT5yLl9fa2V5PT09dGhpcy5fX2tleSk7cmV0dXJuIFEodGhpcyk/bjpkZSh0KSYmdC5hbmNob3IudHlwZT09PSJlbGVtZW50IiYmdC5mb2N1cy50eXBlPT09ImVsZW1lbnQiJiZ0LmFuY2hvci5rZXk9PT10LmZvY3VzLmtleSYmdC5hbmNob3Iub2Zmc2V0PT09dC5mb2N1cy5vZmZzZXQ/ITE6bn1nZXRLZXkoKXtyZXR1cm4gdGhpcy5fX2tleX1nZXRJbmRleFdpdGhpblBhcmVudCgpe3ZhciB0PXRoaXMuZ2V0UGFyZW50KCk7aWYodD09PW51bGwpcmV0dXJuLTE7dD10LmdldEZpcnN0Q2hpbGQoKTtsZXQgbj0wO2Zvcig7dCE9PW51bGw7KXtpZih0aGlzLmlzKHQpKXJldHVybiBuO24rKyx0PXQuZ2V0TmV4dFNpYmxpbmcoKX1yZXR1cm4tMX1nZXRQYXJlbnQoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpLl9fcGFyZW50O3JldHVybiB0PT09bnVsbD9udWxsOiR0KHQpfWdldFBhcmVudE9yVGhyb3coKXtsZXQgdD10aGlzLmdldFBhcmVudCgpO3JldHVybiB0PT09bnVsbCYmVSg2Nix0aGlzLl9fa2V5KSx0fWdldFRvcExldmVsRWxlbWVudCgpe2xldCB0PXRoaXM7Zm9yKDt0IT09bnVsbDspe2xldCBuPXQuZ2V0UGFyZW50KCk7aWYoWm4obikpcmV0dXJuIHQ7dD1ufXJldHVybiBudWxsfWdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKXtsZXQgdD10aGlzLmdldFRvcExldmVsRWxlbWVudCgpO3JldHVybiB0PT09bnVsbCYmVSg2Nyx0aGlzLl9fa2V5KSx0fWdldFBhcmVudHMoKXtsZXQgdD1bXSxuPXRoaXMuZ2V0UGFyZW50KCk7Zm9yKDtuIT09bnVsbDspdC5wdXNoKG4pLG49bi5nZXRQYXJlbnQoKTtyZXR1cm4gdH1nZXRQYXJlbnRLZXlzKCl7bGV0IHQ9W10sbj10aGlzLmdldFBhcmVudCgpO2Zvcig7biE9PW51bGw7KXQucHVzaChuLl9fa2V5KSxuPW4uZ2V0UGFyZW50KCk7cmV0dXJuIHR9Z2V0UHJldmlvdXNTaWJsaW5nKCl7bGV0IHQ9dGhpcy5nZXRMYXRlc3QoKS5fX3ByZXY7cmV0dXJuIHQ9PT1udWxsP251bGw6JHQodCl9Z2V0UHJldmlvdXNTaWJsaW5ncygpe2xldCB0PVtdO3ZhciBuPXRoaXMuZ2V0UGFyZW50KCk7aWYobj09PW51bGwpcmV0dXJuIHQ7Zm9yKG49bi5nZXRGaXJzdENoaWxkKCk7biE9PW51bGwmJiFuLmlzKHRoaXMpOyl0LnB1c2gobiksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0TmV4dFNpYmxpbmcoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpLl9fbmV4dDtyZXR1cm4gdD09PW51bGw/bnVsbDokdCh0KX1nZXROZXh0U2libGluZ3MoKXtsZXQgdD1bXSxuPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKTtmb3IoO24hPT1udWxsOyl0LnB1c2gobiksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0Q29tbW9uQW5jZXN0b3IodCl7bGV0IG49dGhpcy5nZXRQYXJlbnRzKCk7dmFyIHI9dC5nZXRQYXJlbnRzKCk7Qih0aGlzKSYmbi51bnNoaWZ0KHRoaXMpLEIodCkmJnIudW5zaGlmdCh0KSx0PW4ubGVuZ3RoO3ZhciBvPXIubGVuZ3RoO2lmKHQ9PT0wfHxvPT09MHx8blt0LTFdIT09cltvLTFdKXJldHVybiBudWxsO2ZvcihyPW5ldyBTZXQociksbz0wO288dDtvKyspe2xldCBpPW5bb107aWYoci5oYXMoaSkpcmV0dXJuIGl9cmV0dXJuIG51bGx9aXModCl7cmV0dXJuIHQ9PW51bGw/ITE6dGhpcy5fX2tleT09PXQuX19rZXl9aXNCZWZvcmUodCl7aWYodGhpcz09PXQpcmV0dXJuITE7aWYodC5pc1BhcmVudE9mKHRoaXMpKXJldHVybiEwO2lmKHRoaXMuaXNQYXJlbnRPZih0KSlyZXR1cm4hMTt2YXIgbj10aGlzLmdldENvbW1vbkFuY2VzdG9yKHQpO2xldCByPXRoaXM7Zm9yKDs7KXt2YXIgbz1yLmdldFBhcmVudE9yVGhyb3coKTtpZihvPT09bil7bz1yLmdldEluZGV4V2l0aGluUGFyZW50KCk7YnJlYWt9cj1vfWZvcihyPXQ7Oyl7aWYodD1yLmdldFBhcmVudE9yVGhyb3coKSx0PT09bil7bj1yLmdldEluZGV4V2l0aGluUGFyZW50KCk7YnJlYWt9cj10fXJldHVybiBvPG59aXNQYXJlbnRPZih0KXtsZXQgbj10aGlzLl9fa2V5O2lmKG49PT10Ll9fa2V5KXJldHVybiExO2Zvcig7dCE9PW51bGw7KXtpZih0Ll9fa2V5PT09bilyZXR1cm4hMDt0PXQuZ2V0UGFyZW50KCl9cmV0dXJuITF9Z2V0Tm9kZXNCZXR3ZWVuKHQpe2xldCBuPXRoaXMuaXNCZWZvcmUodCkscj1bXSxvPW5ldyBTZXQ7Zm9yKHZhciBpPXRoaXM7Oyl7dmFyIGw9aS5fX2tleTtpZihvLmhhcyhsKXx8KG8uYWRkKGwpLHIucHVzaChpKSksaT09PXQpYnJlYWs7aWYobD1CKGkpP24/aS5nZXRGaXJzdENoaWxkKCk6aS5nZXRMYXN0Q2hpbGQoKTpudWxsLGwhPT1udWxsKWk9bDtlbHNlIGlmKGw9bj9pLmdldE5leHRTaWJsaW5nKCk6aS5nZXRQcmV2aW91c1NpYmxpbmcoKSxsIT09bnVsbClpPWw7ZWxzZXtpZihpPWkuZ2V0UGFyZW50T3JUaHJvdygpLG8uaGFzKGkuX19rZXkpfHxyLnB1c2goaSksaT09PXQpYnJlYWs7bD1pO2RvIGw9PT1udWxsJiZVKDY4KSxpPW4/bC5nZXROZXh0U2libGluZygpOmwuZ2V0UHJldmlvdXNTaWJsaW5nKCksbD1sLmdldFBhcmVudCgpLGwhPT1udWxsJiYoaSE9PW51bGx8fG8uaGFzKGwuX19rZXkpfHxyLnB1c2gobCkpO3doaWxlKGk9PT1udWxsKX19cmV0dXJuIG58fHIucmV2ZXJzZSgpLHJ9aXNEaXJ0eSgpe2xldCB0PWV0KCkuX2RpcnR5TGVhdmVzO3JldHVybiB0IT09bnVsbCYmdC5oYXModGhpcy5fX2tleSl9Z2V0TGF0ZXN0KCl7bGV0IHQ9JHQodGhpcy5fX2tleSk7cmV0dXJuIHQ9PT1udWxsJiZVKDExMyksdH1nZXRXcml0YWJsZSgpe1p0KCk7dmFyIHQ9RXIoKSxuPWV0KCk7dD10Ll9ub2RlTWFwO2xldCByPXRoaXMuX19rZXksbz10aGlzLmdldExhdGVzdCgpLGk9by5fX3BhcmVudDtuPW4uX2Nsb25lTm90TmVlZGVkO3ZhciBsPUtlKCk7cmV0dXJuIGwhPT1udWxsJiYobC5fY2FjaGVkTm9kZXM9bnVsbCksbi5oYXMocik/KHhjKG8pLG8pOihsPW8uY29uc3RydWN0b3IuY2xvbmUobyksbC5fX3BhcmVudD1pLGwuX19uZXh0PW8uX19uZXh0LGwuX19wcmV2PW8uX19wcmV2LEIobykmJkIobCk/KGwuX19maXJzdD1vLl9fZmlyc3QsbC5fX2xhc3Q9by5fX2xhc3QsbC5fX3NpemU9by5fX3NpemUsbC5fX2luZGVudD1vLl9faW5kZW50LGwuX19mb3JtYXQ9by5fX2Zvcm1hdCxsLl9fZGlyPW8uX19kaXIpOlEobykmJlEobCkmJihsLl9fZm9ybWF0PW8uX19mb3JtYXQsbC5fX3N0eWxlPW8uX19zdHlsZSxsLl9fbW9kZT1vLl9fbW9kZSxsLl9fZGV0YWlsPW8uX19kZXRhaWwpLG4uYWRkKHIpLGwuX19rZXk9cix4YyhsKSx0LnNldChyLGwpLGwpfWdldFRleHRDb250ZW50KCl7cmV0dXJuIiJ9Z2V0VGV4dENvbnRlbnRTaXplKCl7cmV0dXJuIHRoaXMuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9Y3JlYXRlRE9NKCl7VSg3MCl9dXBkYXRlRE9NKCl7VSg3MSl9ZXhwb3J0RE9NKHQpe3JldHVybntlbGVtZW50OnRoaXMuY3JlYXRlRE9NKHQuX2NvbmZpZyx0KX19ZXhwb3J0SlNPTigpe1UoNzIpfXN0YXRpYyBpbXBvcnRKU09OKCl7VSgxOCx0aGlzLm5hbWUpfXN0YXRpYyB0cmFuc2Zvcm0oKXtyZXR1cm4gbnVsbH1yZW1vdmUodCl7cWgodGhpcywhMCx0KX1yZXBsYWNlKHQsbil7WnQoKTt2YXIgcj1LZSgpO3IhPT1udWxsJiYocj1yLmNsb25lKCkpLHBmKHRoaXMsdCk7bGV0IG89dGhpcy5nZXRMYXRlc3QoKSxpPXRoaXMuX19rZXksbD10Ll9fa2V5LHM9dC5nZXRXcml0YWJsZSgpO3Q9dGhpcy5nZXRQYXJlbnRPclRocm93KCkuZ2V0V3JpdGFibGUoKTtsZXQgYT10Ll9fc2l6ZTtpaShzKTtsZXQgdT1vLmdldFByZXZpb3VzU2libGluZygpLGM9by5nZXROZXh0U2libGluZygpLGQ9by5fX3ByZXYsZj1vLl9fbmV4dCxoPW8uX19wYXJlbnQ7cmV0dXJuIHFoKG8sITEsITApLHU9PT1udWxsP3QuX19maXJzdD1sOnUuZ2V0V3JpdGFibGUoKS5fX25leHQ9bCxzLl9fcHJldj1kLGM9PT1udWxsP3QuX19sYXN0PWw6Yy5nZXRXcml0YWJsZSgpLl9fcHJldj1sLHMuX19uZXh0PWYscy5fX3BhcmVudD1oLHQuX19zaXplPWEsbiYmdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2goZz0+e3MuYXBwZW5kKGcpfSksZGUocikmJih2cihyKSxuPXIuYW5jaG9yLHI9ci5mb2N1cyxuLmtleT09PWkmJnZ5KG4scyksci5rZXk9PT1pJiZ2eShyLHMpKSxtbygpPT09aSYmTXQobCksc31pbnNlcnRBZnRlcih0LG49ITApe1p0KCkscGYodGhpcyx0KTt2YXIgcj10aGlzLmdldFdyaXRhYmxlKCk7bGV0IG89dC5nZXRXcml0YWJsZSgpO3ZhciBpPW8uZ2V0UGFyZW50KCk7bGV0IGw9S2UoKTt2YXIgcz0hMSxhPSExO2lmKGkhPT1udWxsKXt2YXIgdT10LmdldEluZGV4V2l0aGluUGFyZW50KCk7aWkobyksZGUobCkmJihhPWkuX19rZXkscz1sLmFuY2hvcixpPWwuZm9jdXMscz1zLnR5cGU9PT0iZWxlbWVudCImJnMua2V5PT09YSYmcy5vZmZzZXQ9PT11KzEsYT1pLnR5cGU9PT0iZWxlbWVudCImJmkua2V5PT09YSYmaS5vZmZzZXQ9PT11KzEpfWk9dGhpcy5nZXROZXh0U2libGluZygpLHU9dGhpcy5nZXRQYXJlbnRPclRocm93KCkuZ2V0V3JpdGFibGUoKTtsZXQgYz1vLl9fa2V5LGQ9ci5fX25leHQ7cmV0dXJuIGk9PT1udWxsP3UuX19sYXN0PWM6aS5nZXRXcml0YWJsZSgpLl9fcHJldj1jLHUuX19zaXplKyssci5fX25leHQ9YyxvLl9fbmV4dD1kLG8uX19wcmV2PXIuX19rZXksby5fX3BhcmVudD1yLl9fcGFyZW50LG4mJmRlKGwpJiYobj10aGlzLmdldEluZGV4V2l0aGluUGFyZW50KCksJGMobCx1LG4rMSkscj11Ll9fa2V5LHMmJmwuYW5jaG9yLnNldChyLG4rMiwiZWxlbWVudCIpLGEmJmwuZm9jdXMuc2V0KHIsbisyLCJlbGVtZW50IikpLHR9aW5zZXJ0QmVmb3JlKHQsbj0hMCl7WnQoKSxwZih0aGlzLHQpO3ZhciByPXRoaXMuZ2V0V3JpdGFibGUoKTtsZXQgbz10LmdldFdyaXRhYmxlKCksaT1vLl9fa2V5O2lpKG8pO2xldCBsPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCkscz10aGlzLmdldFBhcmVudE9yVGhyb3coKS5nZXRXcml0YWJsZSgpLGE9ci5fX3ByZXYsdT10aGlzLmdldEluZGV4V2l0aGluUGFyZW50KCk7cmV0dXJuIGw9PT1udWxsP3MuX19maXJzdD1pOmwuZ2V0V3JpdGFibGUoKS5fX25leHQ9aSxzLl9fc2l6ZSsrLHIuX19wcmV2PWksby5fX3ByZXY9YSxvLl9fbmV4dD1yLl9fa2V5LG8uX19wYXJlbnQ9ci5fX3BhcmVudCxyPUtlKCksbiYmZGUocikmJihuPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLCRjKHIsbix1KSksdH1pc1BhcmVudFJlcXVpcmVkKCl7cmV0dXJuITF9Y3JlYXRlUGFyZW50RWxlbWVudE5vZGUoKXtyZXR1cm4gcGkoKX1zZWxlY3RQcmV2aW91cyh0LG4pe1p0KCk7bGV0IHI9dGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKSxvPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpO3JldHVybiByPT09bnVsbD9vLnNlbGVjdCgwLDApOkIocik/ci5zZWxlY3QoKTpRKHIpP3Iuc2VsZWN0KHQsbik6KHQ9ci5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEsby5zZWxlY3QodCx0KSl9c2VsZWN0TmV4dCh0LG4pe1p0KCk7bGV0IHI9dGhpcy5nZXROZXh0U2libGluZygpLG89dGhpcy5nZXRQYXJlbnRPclRocm93KCk7cmV0dXJuIHI9PT1udWxsP28uc2VsZWN0KCk6QihyKT9yLnNlbGVjdCgwLDApOlEocik/ci5zZWxlY3QodCxuKToodD1yLmdldEluZGV4V2l0aGluUGFyZW50KCksby5zZWxlY3QodCx0KSl9bWFya0RpcnR5KCl7dGhpcy5nZXRXcml0YWJsZSgpfX1jbGFzcyB6bCBleHRlbmRzIExhe3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImxpbmVicmVhayJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgemwodC5fX2tleSl9Y29uc3RydWN0b3IodCl7c3VwZXIodCl9Z2V0VGV4dENvbnRlbnQoKXtyZXR1cm5gCmB9Y3JlYXRlRE9NKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIil9dXBkYXRlRE9NKCl7cmV0dXJuITF9c3RhdGljIGltcG9ydERPTSgpe3JldHVybnticjp0PT57bGV0IG49dC5wYXJlbnRFbGVtZW50LHIsbztyZXR1cm4gbiE9PW51bGwmJigocj1uLmZpcnN0Q2hpbGQpPT09dHx8ci5uZXh0U2libGluZz09PXQmJnIubm9kZVR5cGU9PT0zJiYoci50ZXh0Q29udGVudHx8IiIpLm1hdGNoKC9eKCB8XHR8XHI/XG4pKyQvKSE9PW51bGwpJiYoKG89bi5sYXN0Q2hpbGQpPT09dHx8by5wcmV2aW91c1NpYmxpbmc9PT10JiZvLm5vZGVUeXBlPT09MyYmKG8udGV4dENvbnRlbnR8fCIiKS5tYXRjaCgvXiggfFx0fFxyP1xuKSskLykhPT1udWxsKT9udWxsOntjb252ZXJzaW9uOmJiLHByaW9yaXR5OjB9fX19c3RhdGljIGltcG9ydEpTT04oKXtyZXR1cm4gVGwoKX1leHBvcnRKU09OKCl7cmV0dXJue3R5cGU6ImxpbmVicmVhayIsdmVyc2lvbjoxfX19ZnVuY3Rpb24gYmIoKXtyZXR1cm57bm9kZTpUbCgpfX1mdW5jdGlvbiBUbCgpe3JldHVybiBEYShuZXcgemwpfWZ1bmN0aW9uIG1hKGUpe3JldHVybiBlIGluc3RhbmNlb2Ygemx9ZnVuY3Rpb24gdmYoZSx0KXtyZXR1cm4gdCYxNj8iY29kZSI6dCYxMjg/Im1hcmsiOnQmMzI/InN1YiI6dCY2ND8ic3VwIjpudWxsfWZ1bmN0aW9uIHlmKGUsdCl7cmV0dXJuIHQmMT8ic3Ryb25nIjp0JjI/ImVtIjoic3BhbiJ9ZnVuY3Rpb24geGYoZSx0LG4scixvKXtlPXIuY2xhc3NMaXN0LHI9THMobywiYmFzZSIpLHIhPT12b2lkIDAmJmUuYWRkKC4uLnIpLHI9THMobywidW5kZXJsaW5lU3RyaWtldGhyb3VnaCIpO2xldCBpPSExLGw9dCY4JiZ0JjQ7dmFyIHM9biY4JiZuJjQ7ciE9PXZvaWQgMCYmKHM/KGk9ITAsbHx8ZS5hZGQoLi4ucikpOmwmJmUucmVtb3ZlKC4uLnIpKTtmb3IobGV0IGEgaW4gb2kpcz1vaVthXSxyPUxzKG8sYSksciE9PXZvaWQgMCYmKG4mcz8haXx8YSE9PSJ1bmRlcmxpbmUiJiZhIT09InN0cmlrZXRocm91Z2giPyghKHQmcyl8fGwmJmE9PT0idW5kZXJsaW5lInx8YT09PSJzdHJpa2V0aHJvdWdoIikmJmUuYWRkKC4uLnIpOnQmcyYmZS5yZW1vdmUoLi4ucik6dCZzJiZlLnJlbW92ZSguLi5yKSl9ZnVuY3Rpb24gX2YoZSx0LG4pe2xldCByPXQuZmlyc3RDaGlsZDtpZihuPW4uaXNDb21wb3NpbmcoKSxlKz1uP2NkOiIiLHI9PW51bGwpdC50ZXh0Q29udGVudD1lO2Vsc2UgaWYodD1yLm5vZGVWYWx1ZSx0IT09ZSlpZihufHxibyl7bj10Lmxlbmd0aDtsZXQgbz1lLmxlbmd0aCxpPTAsbD0wO2Zvcig7aTxuJiZpPG8mJnRbaV09PT1lW2ldOylpKys7Zm9yKDtsK2k8biYmbCtpPG8mJnRbbi1sLTFdPT09ZVtvLWwtMV07KWwrKztlPVtpLG4taS1sLGUuc2xpY2UoaSxvLWwpXTtsZXRbcyxhLHVdPWU7YSE9PTAmJnIuZGVsZXRlRGF0YShzLGEpLHIuaW5zZXJ0RGF0YShzLHUpfWVsc2Ugci5ub2RlVmFsdWU9ZX1mdW5jdGlvbiBmdShlLHQpe3JldHVybiB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCksdC5hcHBlbmRDaGlsZChlKSx0fWNsYXNzIGtpIGV4dGVuZHMgTGF7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4idGV4dCJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcga2kodC5fX3RleHQsdC5fX2tleSl9Y29uc3RydWN0b3IodCxuKXtzdXBlcihuKSx0aGlzLl9fdGV4dD10LHRoaXMuX19mb3JtYXQ9MCx0aGlzLl9fc3R5bGU9IiIsdGhpcy5fX2RldGFpbD10aGlzLl9fbW9kZT0wfWdldEZvcm1hdCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fZm9ybWF0fWdldERldGFpbCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fZGV0YWlsfWdldE1vZGUoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpO3JldHVybiBkYlt0Ll9fbW9kZV19Z2V0U3R5bGUoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3N0eWxlfWlzVG9rZW4oKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX21vZGU9PT0xfWlzQ29tcG9zaW5nKCl7cmV0dXJuIHRoaXMuX19rZXk9PT1tbygpfWlzU2VnbWVudGVkKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19tb2RlPT09Mn1pc0RpcmVjdGlvbmxlc3MoKXtyZXR1cm4odGhpcy5nZXRMYXRlc3QoKS5fX2RldGFpbCYxKSE9PTB9aXNVbm1lcmdlYWJsZSgpe3JldHVybih0aGlzLmdldExhdGVzdCgpLl9fZGV0YWlsJjIpIT09MH1oYXNGb3JtYXQodCl7cmV0dXJuIHQ9b2lbdF0sKHRoaXMuZ2V0Rm9ybWF0KCkmdCkhPT0wfWlzU2ltcGxlVGV4dCgpe3JldHVybiB0aGlzLl9fdHlwZT09PSJ0ZXh0IiYmdGhpcy5fX21vZGU9PT0wfWdldFRleHRDb250ZW50KCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX190ZXh0fWdldEZvcm1hdEZsYWdzKHQsbil7bGV0IHI9dGhpcy5nZXRMYXRlc3QoKS5fX2Zvcm1hdDtyZXR1cm4gbHcocix0LG4pfWNyZWF0ZURPTSh0KXt2YXIgbj10aGlzLl9fZm9ybWF0LHI9dmYodGhpcyxuKTtsZXQgbz15Zih0aGlzLG4pLGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChyPT09bnVsbD9vOnIpLGw9aTtyZXR1cm4gdGhpcy5oYXNGb3JtYXQoImNvZGUiKSYmaS5zZXRBdHRyaWJ1dGUoInNwZWxsY2hlY2siLCJmYWxzZSIpLHIhPT1udWxsJiYobD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KG8pLGkuYXBwZW5kQ2hpbGQobCkpLHI9bCxfZih0aGlzLl9fdGV4dCxyLHRoaXMpLHQ9dC50aGVtZS50ZXh0LHQhPT12b2lkIDAmJnhmKG8sMCxuLHIsdCksbj10aGlzLl9fc3R5bGUsbiE9PSIiJiYoaS5zdHlsZS5jc3NUZXh0PW4pLGl9dXBkYXRlRE9NKHQsbixyKXtsZXQgbz10aGlzLl9fdGV4dDt2YXIgaT10Ll9fZm9ybWF0LGw9dGhpcy5fX2Zvcm1hdCxzPXZmKHRoaXMsaSk7bGV0IGE9dmYodGhpcyxsKTt2YXIgdT15Zih0aGlzLGkpO2xldCBjPXlmKHRoaXMsbCk7cmV0dXJuKHM9PT1udWxsP3U6cykhPT0oYT09PW51bGw/YzphKT8hMDpzPT09YSYmdSE9PWM/KGk9bi5maXJzdENoaWxkLGk9PW51bGwmJlUoNDgpLHQ9cz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGMpLF9mKG8sdCx0aGlzKSxyPXIudGhlbWUudGV4dCxyIT09dm9pZCAwJiZ4ZihjLDAsbCx0LHIpLG4ucmVwbGFjZUNoaWxkKHMsaSksITEpOih1PW4sYSE9PW51bGwmJnMhPT1udWxsJiYodT1uLmZpcnN0Q2hpbGQsdT09bnVsbCYmVSg0OSkpLF9mKG8sdSx0aGlzKSxyPXIudGhlbWUudGV4dCxyIT09dm9pZCAwJiZpIT09bCYmeGYoYyxpLGwsdSxyKSxsPXRoaXMuX19zdHlsZSx0Ll9fc3R5bGUhPT1sJiYobi5zdHlsZS5jc3NUZXh0PWwpLCExKX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJueyIjdGV4dCI6KCk9Pih7Y29udmVyc2lvbjpPYixwcmlvcml0eTowfSksYjooKT0+KHtjb252ZXJzaW9uOlBiLHByaW9yaXR5OjB9KSxjb2RlOigpPT4oe2NvbnZlcnNpb246cm8scHJpb3JpdHk6MH0pLGVtOigpPT4oe2NvbnZlcnNpb246cm8scHJpb3JpdHk6MH0pLGk6KCk9Pih7Y29udmVyc2lvbjpybyxwcmlvcml0eTowfSksczooKT0+KHtjb252ZXJzaW9uOnJvLHByaW9yaXR5OjB9KSxzcGFuOigpPT4oe2NvbnZlcnNpb246UmIscHJpb3JpdHk6MH0pLHN0cm9uZzooKT0+KHtjb252ZXJzaW9uOnJvLHByaW9yaXR5OjB9KSxzdWI6KCk9Pih7Y29udmVyc2lvbjpybyxwcmlvcml0eTowfSksc3VwOigpPT4oe2NvbnZlcnNpb246cm8scHJpb3JpdHk6MH0pLHU6KCk9Pih7Y29udmVyc2lvbjpybyxwcmlvcml0eTowfSl9fXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPUN0KHQudGV4dCk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldERldGFpbCh0LmRldGFpbCksbi5zZXRNb2RlKHQubW9kZSksbi5zZXRTdHlsZSh0LnN0eWxlKSxufWV4cG9ydERPTSh0KXtyZXR1cm57ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCE9PW51bGwmJmhkKHQpfHxVKDEzMiksdC5zdHlsZS53aGl0ZVNwYWNlPSJwcmUtd3JhcCIsdGhpcy5oYXNGb3JtYXQoImJvbGQiKSYmKHQ9ZnUodCwiYiIpKSx0aGlzLmhhc0Zvcm1hdCgiaXRhbGljIikmJih0PWZ1KHQsImkiKSksdGhpcy5oYXNGb3JtYXQoInN0cmlrZXRocm91Z2giKSYmKHQ9ZnUodCwicyIpKSx0aGlzLmhhc0Zvcm1hdCgidW5kZXJsaW5lIikmJih0PWZ1KHQsInUiKSkse2VsZW1lbnQ6dH19ZXhwb3J0SlNPTigpe3JldHVybntkZXRhaWw6dGhpcy5nZXREZXRhaWwoKSxmb3JtYXQ6dGhpcy5nZXRGb3JtYXQoKSxtb2RlOnRoaXMuZ2V0TW9kZSgpLHN0eWxlOnRoaXMuZ2V0U3R5bGUoKSx0ZXh0OnRoaXMuZ2V0VGV4dENvbnRlbnQoKSx0eXBlOiJ0ZXh0Iix2ZXJzaW9uOjF9fXNlbGVjdGlvblRyYW5zZm9ybSgpe31zZXRGb3JtYXQodCl7bGV0IG49dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiBuLl9fZm9ybWF0PXR5cGVvZiB0PT0ic3RyaW5nIj9vaVt0XTp0LG59c2V0RGV0YWlsKHQpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gbi5fX2RldGFpbD10eXBlb2YgdD09InN0cmluZyI/YWJbdF06dCxufXNldFN0eWxlKHQpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gbi5fX3N0eWxlPXQsbn10b2dnbGVGb3JtYXQodCl7cmV0dXJuIHQ9b2lbdF0sdGhpcy5zZXRGb3JtYXQodGhpcy5nZXRGb3JtYXQoKV50KX10b2dnbGVEaXJlY3Rpb25sZXNzKCl7bGV0IHQ9dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiB0Ll9fZGV0YWlsXj0xLHR9dG9nZ2xlVW5tZXJnZWFibGUoKXtsZXQgdD10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIHQuX19kZXRhaWxePTIsdH1zZXRNb2RlKHQpe2lmKHQ9Y2JbdF0sdGhpcy5fX21vZGU9PT10KXJldHVybiB0aGlzO2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gbi5fX21vZGU9dCxufXNldFRleHRDb250ZW50KHQpe2lmKHRoaXMuX190ZXh0PT09dClyZXR1cm4gdGhpcztsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX190ZXh0PXQsbn1zZWxlY3QodCxuKXtadCgpO2xldCByPUtlKCk7dmFyIG89dGhpcy5nZXRUZXh0Q29udGVudCgpO2xldCBpPXRoaXMuX19rZXk7aWYodHlwZW9mIG89PSJzdHJpbmciPyhvPW8ubGVuZ3RoLHQ9PT12b2lkIDAmJih0PW8pLG49PT12b2lkIDAmJihuPW8pKTpuPXQ9MCxkZShyKSlvPW1vKCksbyE9PXIuYW5jaG9yLmtleSYmbyE9PXIuZm9jdXMua2V5fHxNdChpKSxyLnNldFRleHROb2RlUmFuZ2UodGhpcyx0LHRoaXMsbik7ZWxzZSByZXR1cm4gQXcoaSx0LGksbiwidGV4dCIsInRleHQiKTtyZXR1cm4gcn1zcGxpY2VUZXh0KHQsbixyLG8pe2xldCBpPXRoaXMuZ2V0V3JpdGFibGUoKSxsPWkuX190ZXh0LHM9ci5sZW5ndGgsYT10OzA+YSYmKGE9cythLDA+YSYmKGE9MCkpO2xldCB1PUtlKCk7cmV0dXJuIG8mJmRlKHUpJiYodCs9cyx1LnNldFRleHROb2RlUmFuZ2UoaSx0LGksdCkpLG49bC5zbGljZSgwLGEpK3IrbC5zbGljZShhK24pLGkuX190ZXh0PW4saX1jYW5JbnNlcnRUZXh0QmVmb3JlKCl7cmV0dXJuITB9Y2FuSW5zZXJ0VGV4dEFmdGVyKCl7cmV0dXJuITB9c3BsaXRUZXh0KC4uLnQpe1p0KCk7dmFyIG49dGhpcy5nZXRMYXRlc3QoKSxyPW4uZ2V0VGV4dENvbnRlbnQoKSxvPW4uX19rZXksaT1tbygpLGw9bmV3IFNldCh0KTt0PVtdO2Zvcih2YXIgcz1yLmxlbmd0aCxhPSIiLHU9MDt1PHM7dSsrKWEhPT0iIiYmbC5oYXModSkmJih0LnB1c2goYSksYT0iIiksYSs9clt1XTtpZihhIT09IiImJnQucHVzaChhKSxsPXQubGVuZ3RoLGw9PT0wKXJldHVybltdO2lmKHRbMF09PT1yKXJldHVybltuXTt2YXIgYz10WzBdO3I9bi5nZXRQYXJlbnRPclRocm93KCksdT1uLmdldEZvcm1hdCgpO2xldCBkPW4uZ2V0U3R5bGUoKSxmPW4uX19kZXRhaWw7cz0hMSxuLmlzU2VnbWVudGVkKCk/KGE9Q3QoYyksYS5fX2Zvcm1hdD11LGEuX19zdHlsZT1kLGEuX19kZXRhaWw9ZixzPSEwKTooYT1uLmdldFdyaXRhYmxlKCksYS5fX3RleHQ9Yyksbj1LZSgpLGE9W2FdLGM9Yy5sZW5ndGg7Zm9yKGxldCBtPTE7bTxsO20rKyl7dmFyIGg9dFttXSxnPWgubGVuZ3RoO2g9Q3QoaCkuZ2V0V3JpdGFibGUoKSxoLl9fZm9ybWF0PXUsaC5fX3N0eWxlPWQsaC5fX2RldGFpbD1mO2xldCBTPWguX19rZXk7aWYoZz1jK2csZGUobikpe2xldCB2PW4uYW5jaG9yLHk9bi5mb2N1czt2LmtleT09PW8mJnYudHlwZT09PSJ0ZXh0IiYmdi5vZmZzZXQ+YyYmdi5vZmZzZXQ8PWcmJih2LmtleT1TLHYub2Zmc2V0LT1jLG4uZGlydHk9ITApLHkua2V5PT09byYmeS50eXBlPT09InRleHQiJiZ5Lm9mZnNldD5jJiZ5Lm9mZnNldDw9ZyYmKHkua2V5PVMseS5vZmZzZXQtPWMsbi5kaXJ0eT0hMCl9aT09PW8mJk10KFMpLGM9ZyxhLnB1c2goaCl9cmV0dXJuIG89dGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKSxpPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKSxvIT09bnVsbCYmeGMobyksaSE9PW51bGwmJnhjKGkpLG89ci5nZXRXcml0YWJsZSgpLGk9dGhpcy5nZXRJbmRleFdpdGhpblBhcmVudCgpLHM/KG8uc3BsaWNlKGksMCxhKSx0aGlzLnJlbW92ZSgpKTpvLnNwbGljZShpLDEsYSksZGUobikmJiRjKG4scixpLGwtMSksYX1tZXJnZVdpdGhTaWJsaW5nKHQpe3ZhciBuPXQ9PT10aGlzLmdldFByZXZpb3VzU2libGluZygpO258fHQ9PT10aGlzLmdldE5leHRTaWJsaW5nKCl8fFUoNTApO3ZhciByPXRoaXMuX19rZXk7bGV0IG89dC5fX2tleSxpPXRoaXMuX190ZXh0LGw9aS5sZW5ndGg7bW8oKT09PW8mJk10KHIpO2xldCBzPUtlKCk7aWYoZGUocykpe2xldCBhPXMuYW5jaG9yLHU9cy5mb2N1czthIT09bnVsbCYmYS5rZXk9PT1vJiYoRXkoYSxuLHIsdCxsKSxzLmRpcnR5PSEwKSx1IT09bnVsbCYmdS5rZXk9PT1vJiYoRXkodSxuLHIsdCxsKSxzLmRpcnR5PSEwKX1yZXR1cm4gcj10Ll9fdGV4dCx0aGlzLnNldFRleHRDb250ZW50KG4/citpOmkrciksbj10aGlzLmdldFdyaXRhYmxlKCksdC5yZW1vdmUoKSxufWlzVGV4dEVudGl0eSgpe3JldHVybiExfX1mdW5jdGlvbiBSYihlKXtsZXQgdD1lLnN0eWxlLmZvbnRXZWlnaHQ9PT0iNzAwIixuPWUuc3R5bGUudGV4dERlY29yYXRpb249PT0ibGluZS10aHJvdWdoIixyPWUuc3R5bGUuZm9udFN0eWxlPT09Iml0YWxpYyIsbz1lLnN0eWxlLnRleHREZWNvcmF0aW9uPT09InVuZGVybGluZSIsaT1lLnN0eWxlLnZlcnRpY2FsQWxpZ247cmV0dXJue2ZvckNoaWxkOmw9PihRKGwpJiYodCYmbC50b2dnbGVGb3JtYXQoImJvbGQiKSxuJiZsLnRvZ2dsZUZvcm1hdCgic3RyaWtldGhyb3VnaCIpLHImJmwudG9nZ2xlRm9ybWF0KCJpdGFsaWMiKSxvJiZsLnRvZ2dsZUZvcm1hdCgidW5kZXJsaW5lIiksaT09PSJzdWIiJiZsLnRvZ2dsZUZvcm1hdCgic3Vic2NyaXB0IiksaT09PSJzdXBlciImJmwudG9nZ2xlRm9ybWF0KCJzdXBlcnNjcmlwdCIpKSxsKSxub2RlOm51bGx9fWZ1bmN0aW9uIFBiKGUpe2xldCB0PWUuc3R5bGUuZm9udFdlaWdodD09PSJub3JtYWwiO3JldHVybntmb3JDaGlsZDpuPT4oUShuKSYmIXQmJm4udG9nZ2xlRm9ybWF0KCJib2xkIiksbiksbm9kZTpudWxsfX1sZXQgZ3k9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gT2IoZSl7ZS5wYXJlbnRFbGVtZW50PT09bnVsbCYmVSgxMjkpO2Zvcih2YXIgdD1lLnRleHRDb250ZW50fHwiIixuLHI9ZS5wYXJlbnROb2RlLG89W2VdO3IhPT1udWxsJiYobj1neS5nZXQocikpPT09dm9pZCAwJiYhKHIubm9kZU5hbWU9PT0iUFJFInx8ci5ub2RlVHlwZT09PTEmJnIuc3R5bGUud2hpdGVTcGFjZS5zdGFydHNXaXRoKCJwcmUiKSk7KW8ucHVzaChyKSxyPXIucGFyZW50Tm9kZTtmb3Iobj1uPT09dm9pZCAwP3I6bixyPTA7cjxvLmxlbmd0aDtyKyspZ3kuc2V0KG9bcl0sbik7aWYobiE9PW51bGwpe2Zvcih0PXQuc3BsaXQoLyhccj9cbnxcdCkvKSxlPVtdLG89dC5sZW5ndGgsbj0wO248bztuKyspcj10W25dLHI9PT1gCmB8fHI9PT1gXHIKYD9lLnB1c2goVGwoKSk6cj09PSIJIj9lLnB1c2goZ2QoKSk6ciE9PSIiJiZlLnB1c2goQ3QocikpO3JldHVybntub2RlOmV9fWlmKHQ9dC5yZXBsYWNlKC9cci9nLCIiKS5yZXBsYWNlKC9bIFx0XG5dKy9nLCIgIiksdD09PSIiKXJldHVybntub2RlOm51bGx9O2lmKHRbMF09PT0iICIpe2ZvcihvPWUsbj0hMDtvIT09bnVsbCYmKG89bXkobywhMSkpIT09bnVsbDspaWYocj1vLnRleHRDb250ZW50fHwiIiwwPHIubGVuZ3RoKXsvWyBcdFxuXSQvLnRlc3QocikmJih0PXQuc2xpY2UoMSkpLG49ITE7YnJlYWt9biYmKHQ9dC5zbGljZSgxKSl9aWYodFt0Lmxlbmd0aC0xXT09PSIgIil7Zm9yKG89ITA7ZSE9PW51bGwmJihlPW15KGUsITApKSE9PW51bGw7KWlmKDA8KGUudGV4dENvbnRlbnR8fCIiKS5yZXBsYWNlKC9eKCB8XHR8XHI/XG4pKy8sIiIpLmxlbmd0aCl7bz0hMTticmVha31vJiYodD10LnNsaWNlKDAsdC5sZW5ndGgtMSkpfXJldHVybiB0PT09IiI/e25vZGU6bnVsbH06e25vZGU6Q3QodCl9fWxldCBBYj1uZXcgUmVnRXhwKC9eKGF8YWJicnxhY3JvbnltfGJ8Y2l0ZXxjb2RlfGRlbHxlbXxpfGluc3xrYmR8bGFiZWx8b3V0cHV0fHF8cnVieXxzfHNhbXB8c3BhbnxzdHJvbmd8c3VifHN1cHx0aW1lfHV8dHR8dmFyKSQvLCJpIik7ZnVuY3Rpb24gbXkoZSx0KXtmb3IoOzspe2Zvcih2YXIgbj12b2lkIDA7KG49dD9lLm5leHRTaWJsaW5nOmUucHJldmlvdXNTaWJsaW5nKT09PW51bGw7KWlmKGU9ZS5wYXJlbnRFbGVtZW50LGU9PT1udWxsKXJldHVybiBudWxsO2lmKGU9bixlLm5vZGVUeXBlPT09MSYmKG49ZS5zdHlsZS5kaXNwbGF5LG49PT0iIiYmZS5ub2RlTmFtZS5tYXRjaChBYik9PT1udWxsfHxuIT09IiImJiFuLnN0YXJ0c1dpdGgoImlubGluZSIpKSlyZXR1cm4gbnVsbDtmb3IoOyhuPXQ/ZS5maXJzdENoaWxkOmUubGFzdENoaWxkKSE9PW51bGw7KWU9bjtpZihlLm5vZGVUeXBlPT09MylyZXR1cm4gZTtpZihlLm5vZGVOYW1lPT09IkJSIilyZXR1cm4gbnVsbH19bGV0IE1iPXtjb2RlOiJjb2RlIixlbToiaXRhbGljIixpOiJpdGFsaWMiLHM6InN0cmlrZXRocm91Z2giLHN0cm9uZzoiYm9sZCIsc3ViOiJzdWJzY3JpcHQiLHN1cDoic3VwZXJzY3JpcHQiLHU6InVuZGVybGluZSJ9O2Z1bmN0aW9uIHJvKGUpe2xldCB0PU1iW2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07cmV0dXJuIHQ9PT12b2lkIDA/e25vZGU6bnVsbH06e2ZvckNoaWxkOm49PihRKG4pJiYhbi5oYXNGb3JtYXQodCkmJm4udG9nZ2xlRm9ybWF0KHQpLG4pLG5vZGU6bnVsbH19ZnVuY3Rpb24gQ3QoZT0iIil7cmV0dXJuIERhKG5ldyBraShlKSl9ZnVuY3Rpb24gUShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGtpfWNsYXNzIEZsIGV4dGVuZHMga2l7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4idGFiIn1zdGF0aWMgY2xvbmUodCl7bGV0IG49bmV3IEZsKHQuX19rZXkpO3JldHVybiBuLl9fdGV4dD10Ll9fdGV4dCxuLl9fZm9ybWF0PXQuX19mb3JtYXQsbi5fX3N0eWxlPXQuX19zdHlsZSxufWNvbnN0cnVjdG9yKHQpe3N1cGVyKCIJIix0KSx0aGlzLl9fZGV0YWlsPTJ9c3RhdGljIGltcG9ydERPTSgpe3JldHVybiBudWxsfXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPWdkKCk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldFN0eWxlKHQuc3R5bGUpLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdHlwZToidGFiIix2ZXJzaW9uOjF9fXNldFRleHRDb250ZW50KCl7VSgxMjYpfXNldERldGFpbCgpe1UoMTI3KX1zZXRNb2RlKCl7VSgxMjgpfWNhbkluc2VydFRleHRCZWZvcmUoKXtyZXR1cm4hMX1jYW5JbnNlcnRUZXh0QWZ0ZXIoKXtyZXR1cm4hMX19ZnVuY3Rpb24gZ2QoKXtyZXR1cm4gRGEobmV3IEZsKX1jbGFzcyB5cntjb25zdHJ1Y3Rvcih0LG4scil7dGhpcy5fc2VsZWN0aW9uPW51bGwsdGhpcy5rZXk9dCx0aGlzLm9mZnNldD1uLHRoaXMudHlwZT1yfWlzKHQpe3JldHVybiB0aGlzLmtleT09PXQua2V5JiZ0aGlzLm9mZnNldD09PXQub2Zmc2V0JiZ0aGlzLnR5cGU9PT10LnR5cGV9aXNCZWZvcmUodCl7bGV0IG49dGhpcy5nZXROb2RlKCkscj10LmdldE5vZGUoKSxvPXRoaXMub2Zmc2V0O2lmKHQ9dC5vZmZzZXQsQihuKSl7dmFyIGk9bi5nZXREZXNjZW5kYW50QnlJbmRleChvKTtuPWk/P259cmV0dXJuIEIocikmJihpPXIuZ2V0RGVzY2VuZGFudEJ5SW5kZXgodCkscj1pPz9yKSxuPT09cj9vPHQ6bi5pc0JlZm9yZShyKX1nZXROb2RlKCl7bGV0IHQ9JHQodGhpcy5rZXkpO3JldHVybiB0PT09bnVsbCYmVSgyMCksdH1zZXQodCxuLHIpe2xldCBvPXRoaXMuX3NlbGVjdGlvbixpPXRoaXMua2V5O3RoaXMua2V5PXQsdGhpcy5vZmZzZXQ9bix0aGlzLnR5cGU9cixVbCgpfHwobW8oKT09PWkmJk10KHQpLG8hPT1udWxsJiYoby5fY2FjaGVkTm9kZXM9bnVsbCxvLmRpcnR5PSEwKSl9fWZ1bmN0aW9uIHdmKGUsdCl7bGV0IG49dC5fX2tleSxyPWUub2Zmc2V0LG89ImVsZW1lbnQiO2lmKFEodCkpbz0idGV4dCIsdD10LmdldFRleHRDb250ZW50U2l6ZSgpLHI+dCYmKHI9dCk7ZWxzZSBpZighQih0KSl7dmFyIGk9dC5nZXROZXh0U2libGluZygpO1EoaSk/KG49aS5fX2tleSxyPTAsbz0idGV4dCIpOihpPXQuZ2V0UGFyZW50KCkpJiYobj1pLl9fa2V5LHI9dC5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEpfWUuc2V0KG4scixvKX1mdW5jdGlvbiB2eShlLHQpe2lmKEIodCkpe2xldCBuPXQuZ2V0TGFzdERlc2NlbmRhbnQoKTtCKG4pfHxRKG4pP3dmKGUsbik6d2YoZSx0KX1lbHNlIHdmKGUsdCl9ZnVuY3Rpb24geXkoZSx0LG4scil7bGV0IG89ZS5nZXROb2RlKCksaT1vLmdldENoaWxkQXRJbmRleChlLm9mZnNldCksbD1DdCgpLHM9ZW4obyk/cGkoKS5hcHBlbmQobCk6bDtsLnNldEZvcm1hdChuKSxsLnNldFN0eWxlKHIpLGk9PT1udWxsP28uYXBwZW5kKHMpOihpLmluc2VydEJlZm9yZShzKSx0LnR5cGU9PT0iZWxlbWVudCImJnQua2V5PT09ZS5rZXkmJnQub2Zmc2V0IT09ZS5vZmZzZXQmJnQuc2V0KHQua2V5LHQub2Zmc2V0KzEsImVsZW1lbnQiKSksZS5pcyh0KSYmdC5zZXQobC5fX2tleSwwLCJ0ZXh0IiksZS5zZXQobC5fX2tleSwwLCJ0ZXh0Iil9ZnVuY3Rpb24gYW8oZSx0LG4scil7ZS5rZXk9dCxlLm9mZnNldD1uLGUudHlwZT1yfWNsYXNzIG1ke2NvbnN0cnVjdG9yKHQpe3RoaXMuZGlydHk9ITEsdGhpcy5fbm9kZXM9dCx0aGlzLl9jYWNoZWROb2Rlcz1udWxsfWlzKHQpe2lmKCFCbCh0KSlyZXR1cm4hMTtsZXQgbj10aGlzLl9ub2RlcyxyPXQuX25vZGVzO3JldHVybiBuLnNpemU9PT1yLnNpemUmJkFycmF5LmZyb20obikuZXZlcnkobz0+ci5oYXMobykpfWFkZCh0KXt0aGlzLmRpcnR5PSEwLHRoaXMuX25vZGVzLmFkZCh0KSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsfWRlbGV0ZSh0KXt0aGlzLmRpcnR5PSEwLHRoaXMuX25vZGVzLmRlbGV0ZSh0KSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsfWNsZWFyKCl7dGhpcy5kaXJ0eT0hMCx0aGlzLl9ub2Rlcy5jbGVhcigpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9aGFzKHQpe3JldHVybiB0aGlzLl9ub2Rlcy5oYXModCl9Y2xvbmUoKXtyZXR1cm4gbmV3IG1kKG5ldyBTZXQodGhpcy5fbm9kZXMpKX1leHRyYWN0KCl7cmV0dXJuIHRoaXMuZ2V0Tm9kZXMoKX1pbnNlcnRSYXdUZXh0KCl7fWluc2VydFRleHQoKXt9aW5zZXJ0Tm9kZXModCxuKXtsZXQgcj10aGlzLmdldE5vZGVzKCksbz1yLmxlbmd0aDt2YXIgaT1yW28tMV07aWYoUShpKSlpPWkuc2VsZWN0KCk7ZWxzZXtsZXQgbD1pLmdldEluZGV4V2l0aGluUGFyZW50KCkrMTtpPWkuZ2V0UGFyZW50T3JUaHJvdygpLnNlbGVjdChsLGwpfWZvcihpLmluc2VydE5vZGVzKHQsbiksdD0wO3Q8bzt0Kyspclt0XS5yZW1vdmUoKTtyZXR1cm4hMH1nZXROb2Rlcygpe3ZhciB0PXRoaXMuX2NhY2hlZE5vZGVzO2lmKHQhPT1udWxsKXJldHVybiB0O3ZhciBuPXRoaXMuX25vZGVzO3Q9W107Zm9yKGxldCByIG9mIG4pbj0kdChyKSxuIT09bnVsbCYmdC5wdXNoKG4pO3JldHVybiBVbCgpfHwodGhpcy5fY2FjaGVkTm9kZXM9dCksdH1nZXRUZXh0Q29udGVudCgpe2xldCB0PXRoaXMuZ2V0Tm9kZXMoKSxuPSIiO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKW4rPXRbcl0uZ2V0VGV4dENvbnRlbnQoKTtyZXR1cm4gbn19ZnVuY3Rpb24gZGUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBUaX1mdW5jdGlvbiBlcChlKXtsZXRbdCwsbl09RHcoZSk7ZT1uLmdldENoaWxkcmVuKCk7bGV0IHI9ZS5sZW5ndGg7dmFyIG89ZVswXS5nZXRDaGlsZHJlbigpLmxlbmd0aDtsZXQgaT1BcnJheShyKTtmb3IodmFyIGw9MDtsPHI7bCsrKWlbbF09QXJyYXkobyk7Zm9yKG89MDtvPHI7bysrKXtsPWVbb10uZ2V0Q2hpbGRyZW4oKTtsZXQgcz0wO2ZvcihsZXQgYT0wO2E8bC5sZW5ndGg7YSsrKXtmb3IoO2lbb11bc107KXMrKztsZXQgdT1sW2FdLGM9dS5fX3Jvd1NwYW58fDEsZD11Ll9fY29sU3Bhbnx8MTtmb3IobGV0IGY9MDtmPGM7ZisrKWZvcihsZXQgaD0wO2g8ZDtoKyspaVtvK2ZdW3MraF09dTtpZih0PT09dSlyZXR1cm57Y29sU3BhbjpkLGNvbHVtbkluZGV4OnMscm93SW5kZXg6byxyb3dTcGFuOmN9O3MrPWR9fXJldHVybiBudWxsfWNsYXNzIHZke2NvbnN0cnVjdG9yKHQsbixyKXt0aGlzLmdyaWRLZXk9dCx0aGlzLmFuY2hvcj1uLHRoaXMuZm9jdXM9cix0aGlzLmRpcnR5PSExLHRoaXMuX2NhY2hlZE5vZGVzPW51bGwsbi5fc2VsZWN0aW9uPXRoaXMsci5fc2VsZWN0aW9uPXRoaXN9aXModCl7cmV0dXJuIFFnKHQpP3RoaXMuZ3JpZEtleT09PXQuZ3JpZEtleSYmdGhpcy5hbmNob3IuaXModC5hbmNob3IpJiZ0aGlzLmZvY3VzLmlzKHQuZm9jdXMpOiExfXNldCh0LG4scil7dGhpcy5kaXJ0eT0hMCx0aGlzLmdyaWRLZXk9dCx0aGlzLmFuY2hvci5rZXk9bix0aGlzLmZvY3VzLmtleT1yLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9Y2xvbmUoKXtyZXR1cm4gbmV3IHZkKHRoaXMuZ3JpZEtleSx0aGlzLmFuY2hvcix0aGlzLmZvY3VzKX1pc0NvbGxhcHNlZCgpe3JldHVybiExfWlzQmFja3dhcmQoKXtyZXR1cm4gdGhpcy5mb2N1cy5pc0JlZm9yZSh0aGlzLmFuY2hvcil9Z2V0Q2hhcmFjdGVyT2Zmc2V0cygpe3JldHVybiBGdSh0aGlzKX1leHRyYWN0KCl7cmV0dXJuIHRoaXMuZ2V0Tm9kZXMoKX1pbnNlcnRSYXdUZXh0KCl7fWluc2VydFRleHQoKXt9aW5zZXJ0Tm9kZXModCxuKXtsZXQgcj10aGlzLmZvY3VzLmdldE5vZGUoKTtyZXR1cm4gV2coci5zZWxlY3QoMCxyLmdldENoaWxkcmVuU2l6ZSgpKSkuaW5zZXJ0Tm9kZXModCxuKX1nZXRTaGFwZSgpe3ZhciB0PSR0KHRoaXMuYW5jaG9yLmtleSk7aWYoTW4odCl8fFUoMTAzKSx0PWVwKHQpLHQ9PT1udWxsKXRocm93IEVycm9yKCJnZXRDZWxsUmVjdDogZXhwZWN0ZWQgdG8gZmluZCBBbmNob3JOb2RlIik7dmFyIG49JHQodGhpcy5mb2N1cy5rZXkpO01uKG4pfHxVKDEwNCk7bGV0IHI9ZXAobik7aWYocj09PW51bGwpdGhyb3cgRXJyb3IoImdldENlbGxSZWN0OiBleHBlY3RlZCB0byBmaW5kIGZvY3VzQ2VsbE5vZGUiKTtuPU1hdGgubWluKHQuY29sdW1uSW5kZXgsci5jb2x1bW5JbmRleCk7bGV0IG89TWF0aC5tYXgodC5jb2x1bW5JbmRleCxyLmNvbHVtbkluZGV4KSxpPU1hdGgubWluKHQucm93SW5kZXgsci5yb3dJbmRleCk7cmV0dXJuIHQ9TWF0aC5tYXgodC5yb3dJbmRleCxyLnJvd0luZGV4KSx7ZnJvbVg6TWF0aC5taW4obixvKSxmcm9tWTpNYXRoLm1pbihpLHQpLHRvWDpNYXRoLm1heChuLG8pLHRvWTpNYXRoLm1heChpLHQpfX1nZXROb2Rlcygpe2Z1bmN0aW9uIHQoUyl7bGV0e2NlbGw6dixzdGFydENvbHVtbjp5LHN0YXJ0Um93Ol99PVM7YT1NYXRoLm1pbihhLHkpLHU9TWF0aC5taW4odSxfKSxjPU1hdGgubWF4KGMseSt2Ll9fY29sU3Bhbi0xKSxkPU1hdGgubWF4KGQsXyt2Ll9fcm93U3Bhbi0xKX12YXIgbj10aGlzLl9jYWNoZWROb2RlcztpZihuIT09bnVsbClyZXR1cm4gbjt2YXIgcj10aGlzLmFuY2hvci5nZXROb2RlKCk7bj10aGlzLmZvY3VzLmdldE5vZGUoKSxyPUNjKHIsTW4pO3ZhciBvPUNjKG4sTW4pO01uKHIpfHxVKDEwMyksTW4obyl8fFUoMTA0KSxuPXIuZ2V0UGFyZW50KCkseWEobil8fFUoMTA1KSxuPW4uZ2V0UGFyZW50KCksdG0obil8fFUoMTA2KTtsZXRbaSxsLHNdPU13KG4scixvKSxhPU1hdGgubWluKGwuc3RhcnRDb2x1bW4scy5zdGFydENvbHVtbiksdT1NYXRoLm1pbihsLnN0YXJ0Um93LHMuc3RhcnRSb3cpLGM9TWF0aC5tYXgobC5zdGFydENvbHVtbitsLmNlbGwuX19jb2xTcGFuLTEscy5zdGFydENvbHVtbitzLmNlbGwuX19jb2xTcGFuLTEpLGQ9TWF0aC5tYXgobC5zdGFydFJvdytsLmNlbGwuX19yb3dTcGFuLTEscy5zdGFydFJvdytzLmNlbGwuX19yb3dTcGFuLTEpO3I9YSxvPXU7Zm9yKHZhciBmPWEsaD11O2E8cnx8dTxvfHxjPmZ8fGQ+aDspe2lmKGE8cil7dmFyIGc9aC1vOy0tcjtmb3IodmFyIG09MDttPD1nO20rKyl0KGlbbyttXVtyXSl9aWYodTxvKWZvcihnPWYtciwtLW8sbT0wO208PWc7bSsrKXQoaVtvXVtyK21dKTtpZihjPmYpZm9yKGc9aC1vLGYrPTEsbT0wO208PWc7bSsrKXQoaVtvK21dW2ZdKTtpZihkPmgpZm9yKGc9Zi1yLGgrPTEsbT0wO208PWc7bSsrKXQoaVtoXVtyK21dKX1mb3Iobj1bbl0scj1udWxsLG89dTtvPD1kO28rKylmb3IoZj1hO2Y8PWM7ZisrKSh7Y2VsbDpofT1pW29dW2ZdKSxnPWguZ2V0UGFyZW50KCkseWEoZyl8fFUoMTA3KSxnIT09ciYmbi5wdXNoKGcpLG4ucHVzaChoLC4uLnliKGgpKSxyPWc7cmV0dXJuIFVsKCl8fCh0aGlzLl9jYWNoZWROb2Rlcz1uKSxufWdldFRleHRDb250ZW50KCl7bGV0IHQ9dGhpcy5nZXROb2RlcygpLG49IiI7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspbis9dFtyXS5nZXRUZXh0Q29udGVudCgpO3JldHVybiBufX1mdW5jdGlvbiBRZyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHZkfWNsYXNzIFRpe2NvbnN0cnVjdG9yKHQsbixyLG8pe3RoaXMuYW5jaG9yPXQsdGhpcy5mb2N1cz1uLHRoaXMuZGlydHk9ITEsdGhpcy5mb3JtYXQ9cix0aGlzLnN0eWxlPW8sdGhpcy5fY2FjaGVkTm9kZXM9bnVsbCx0Ll9zZWxlY3Rpb249dGhpcyxuLl9zZWxlY3Rpb249dGhpc31pcyh0KXtyZXR1cm4gZGUodCk/dGhpcy5hbmNob3IuaXModC5hbmNob3IpJiZ0aGlzLmZvY3VzLmlzKHQuZm9jdXMpJiZ0aGlzLmZvcm1hdD09PXQuZm9ybWF0JiZ0aGlzLnN0eWxlPT09dC5zdHlsZTohMX1pc0JhY2t3YXJkKCl7cmV0dXJuIHRoaXMuZm9jdXMuaXNCZWZvcmUodGhpcy5hbmNob3IpfWlzQ29sbGFwc2VkKCl7cmV0dXJuIHRoaXMuYW5jaG9yLmlzKHRoaXMuZm9jdXMpfWdldE5vZGVzKCl7dmFyIHQ9dGhpcy5fY2FjaGVkTm9kZXM7aWYodCE9PW51bGwpcmV0dXJuIHQ7dD10aGlzLmFuY2hvcjt2YXIgbj10aGlzLmZvY3VzLHI9dC5pc0JlZm9yZShuKSxvPXI/dDpuO3I9cj9uOnQsdD1vLmdldE5vZGUoKSxuPXIuZ2V0Tm9kZSgpO2xldCBpPW8ub2Zmc2V0O3JldHVybiBvPXIub2Zmc2V0LEIodCkmJihyPXQuZ2V0RGVzY2VuZGFudEJ5SW5kZXgoaSksdD1yPz90KSxCKG4pJiYocj1uLmdldERlc2NlbmRhbnRCeUluZGV4KG8pLHIhPT1udWxsJiZyIT09dCYmbi5nZXRDaGlsZEF0SW5kZXgobyk9PT1yJiYocj1yLmdldFByZXZpb3VzU2libGluZygpKSxuPXI/P24pLHQ9dC5pcyhuKT9CKHQpJiYwPHQuZ2V0Q2hpbGRyZW5TaXplKCk/W106W3RdOnQuZ2V0Tm9kZXNCZXR3ZWVuKG4pLFVsKCl8fCh0aGlzLl9jYWNoZWROb2Rlcz10KSx0fXNldFRleHROb2RlUmFuZ2UodCxuLHIsbyl7YW8odGhpcy5hbmNob3IsdC5fX2tleSxuLCJ0ZXh0IiksYW8odGhpcy5mb2N1cyxyLl9fa2V5LG8sInRleHQiKSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsLHRoaXMuZGlydHk9ITB9Z2V0VGV4dENvbnRlbnQoKXtsZXQgdD10aGlzLmdldE5vZGVzKCk7aWYodC5sZW5ndGg9PT0wKXJldHVybiIiO2xldCBuPXRbMF0scj10W3QubGVuZ3RoLTFdLG89dGhpcy5hbmNob3IsaT10aGlzLmZvY3VzLGw9by5pc0JlZm9yZShpKSxbcyxhXT1GdSh0aGlzKSx1PSIiLGM9ITA7Zm9yKGxldCBkPTA7ZDx0Lmxlbmd0aDtkKyspe2xldCBmPXRbZF07aWYoQihmKSYmIWYuaXNJbmxpbmUoKSljfHwodSs9YApgKSxjPSFmLmlzRW1wdHkoKTtlbHNlIGlmKGM9ITEsUShmKSl7bGV0IGg9Zi5nZXRUZXh0Q29udGVudCgpO2Y9PT1uP2Y9PT1yPyhvLnR5cGUhPT0iZWxlbWVudCJ8fGkudHlwZSE9PSJlbGVtZW50Inx8aS5vZmZzZXQ9PT1vLm9mZnNldCkmJihoPXM8YT9oLnNsaWNlKHMsYSk6aC5zbGljZShhLHMpKTpoPWw/aC5zbGljZShzKTpoLnNsaWNlKGEpOmY9PT1yJiYoaD1sP2guc2xpY2UoMCxhKTpoLnNsaWNlKDAscykpLHUrPWh9ZWxzZSFWZShmKSYmIW1hKGYpfHxmPT09ciYmdGhpcy5pc0NvbGxhcHNlZCgpfHwodSs9Zi5nZXRUZXh0Q29udGVudCgpKX1yZXR1cm4gdX1hcHBseURPTVJhbmdlKHQpe2xldCBuPWV0KCkscj1uLmdldEVkaXRvclN0YXRlKCkuX3NlbGVjdGlvbjtpZih0PU93KHQuc3RhcnRDb250YWluZXIsdC5zdGFydE9mZnNldCx0LmVuZENvbnRhaW5lcix0LmVuZE9mZnNldCxuLHIpLHQhPT1udWxsKXt2YXJbbyxpXT10O2FvKHRoaXMuYW5jaG9yLG8ua2V5LG8ub2Zmc2V0LG8udHlwZSksYW8odGhpcy5mb2N1cyxpLmtleSxpLm9mZnNldCxpLnR5cGUpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9fWNsb25lKCl7bGV0IHQ9dGhpcy5hbmNob3Isbj10aGlzLmZvY3VzO3JldHVybiBuZXcgVGkobmV3IHlyKHQua2V5LHQub2Zmc2V0LHQudHlwZSksbmV3IHlyKG4ua2V5LG4ub2Zmc2V0LG4udHlwZSksdGhpcy5mb3JtYXQsdGhpcy5zdHlsZSl9dG9nZ2xlRm9ybWF0KHQpe3RoaXMuZm9ybWF0PWx3KHRoaXMuZm9ybWF0LHQsbnVsbCksdGhpcy5kaXJ0eT0hMH1zZXRTdHlsZSh0KXt0aGlzLnN0eWxlPXQsdGhpcy5kaXJ0eT0hMH1oYXNGb3JtYXQodCl7cmV0dXJuKHRoaXMuZm9ybWF0Jm9pW3RdKSE9PTB9aW5zZXJ0UmF3VGV4dCh0KXt0PXQuc3BsaXQoLyhccj9cbnxcdCkvKTtsZXQgbj1bXSxyPXQubGVuZ3RoO2ZvcihsZXQgbz0wO288cjtvKyspe2xldCBpPXRbb107aT09PWAKYHx8aT09PWBccgpgP24ucHVzaChUbCgpKTppPT09IgkiP24ucHVzaChnZCgpKTpuLnB1c2goQ3QoaSkpfXRoaXMuaW5zZXJ0Tm9kZXMobil9aW5zZXJ0VGV4dCh0KXt2YXIgbj10aGlzLmFuY2hvcixyPXRoaXMuZm9jdXMsbz10aGlzLmlzQ29sbGFwc2VkKCl8fG4uaXNCZWZvcmUociksaT10aGlzLmZvcm1hdCxsPXRoaXMuc3R5bGU7byYmbi50eXBlPT09ImVsZW1lbnQiP3l5KG4scixpLGwpOm98fHIudHlwZSE9PSJlbGVtZW50Inx8eXkocixuLGksbCk7dmFyIHM9dGhpcy5nZXROb2RlcygpLGE9cy5sZW5ndGgsdT1vP3I6bjtyPShvP246cikub2Zmc2V0O3ZhciBjPXUub2Zmc2V0O249c1swXSxRKG4pfHxVKDI2KSxvPW4uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGg7dmFyIGQ9bi5nZXRQYXJlbnRPclRocm93KCksZj1zW2EtMV07aWYodGhpcy5pc0NvbGxhcHNlZCgpJiZyPT09byYmKG4uaXNTZWdtZW50ZWQoKXx8bi5pc1Rva2VuKCl8fCFuLmNhbkluc2VydFRleHRBZnRlcigpfHwhZC5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSYmbi5nZXROZXh0U2libGluZygpPT09bnVsbCkpe3ZhciBoPW4uZ2V0TmV4dFNpYmxpbmcoKTtpZihRKGgpJiZoLmNhbkluc2VydFRleHRCZWZvcmUoKSYmIUZoKGgpfHwoaD1DdCgpLGguc2V0Rm9ybWF0KGkpLGQuY2FuSW5zZXJ0VGV4dEFmdGVyKCk/bi5pbnNlcnRBZnRlcihoKTpkLmluc2VydEFmdGVyKGgpKSxoLnNlbGVjdCgwLDApLG49aCx0IT09IiIpe3RoaXMuaW5zZXJ0VGV4dCh0KTtyZXR1cm59fWVsc2UgaWYodGhpcy5pc0NvbGxhcHNlZCgpJiZyPT09MCYmKG4uaXNTZWdtZW50ZWQoKXx8bi5pc1Rva2VuKCl8fCFuLmNhbkluc2VydFRleHRCZWZvcmUoKXx8IWQuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZuLmdldFByZXZpb3VzU2libGluZygpPT09bnVsbCkpe2lmKGg9bi5nZXRQcmV2aW91c1NpYmxpbmcoKSwoIVEoaCl8fEZoKGgpKSYmKGg9Q3QoKSxoLnNldEZvcm1hdChpKSxkLmNhbkluc2VydFRleHRCZWZvcmUoKT9uLmluc2VydEJlZm9yZShoKTpkLmluc2VydEJlZm9yZShoKSksaC5zZWxlY3QoKSxuPWgsdCE9PSIiKXt0aGlzLmluc2VydFRleHQodCk7cmV0dXJufX1lbHNlIGlmKG4uaXNTZWdtZW50ZWQoKSYmciE9PW8pZD1DdChuLmdldFRleHRDb250ZW50KCkpLGQuc2V0Rm9ybWF0KGkpLG4ucmVwbGFjZShkKSxuPWQ7ZWxzZSBpZighKHRoaXMuaXNDb2xsYXBzZWQoKXx8dD09PSIifHwoaD1mLmdldFBhcmVudCgpLGQuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZkLmNhbkluc2VydFRleHRBZnRlcigpJiYoIUIoaCl8fGguY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZoLmNhbkluc2VydFRleHRBZnRlcigpKSkpKXt0aGlzLmluc2VydFRleHQoIiIpLFB3KHRoaXMuYW5jaG9yLHRoaXMuZm9jdXMsbnVsbCksdGhpcy5pbnNlcnRUZXh0KHQpO3JldHVybn1pZihhPT09MSlpZihuLmlzVG9rZW4oKSl0PUN0KHQpLHQuc2VsZWN0KCksbi5yZXBsYWNlKHQpO2Vsc2V7aWYocz1uLmdldEZvcm1hdCgpLGE9bi5nZXRTdHlsZSgpLHI9PT1jJiYocyE9PWl8fGEhPT1sKSlpZihuLmdldFRleHRDb250ZW50KCk9PT0iIiluLnNldEZvcm1hdChpKSxuLnNldFN0eWxlKGwpO2Vsc2V7cz1DdCh0KSxzLnNldEZvcm1hdChpKSxzLnNldFN0eWxlKGwpLHMuc2VsZWN0KCkscj09PTA/bi5pbnNlcnRCZWZvcmUocywhMSk6KFthXT1uLnNwbGl0VGV4dChyKSxhLmluc2VydEFmdGVyKHMsITEpKSxzLmlzQ29tcG9zaW5nKCkmJnRoaXMuYW5jaG9yLnR5cGU9PT0idGV4dCImJih0aGlzLmFuY2hvci5vZmZzZXQtPXQubGVuZ3RoKTtyZXR1cm59bj1uLnNwbGljZVRleHQocixjLXIsdCwhMCksbi5nZXRUZXh0Q29udGVudCgpPT09IiI/bi5yZW1vdmUoKTp0aGlzLmFuY2hvci50eXBlPT09InRleHQiJiYobi5pc0NvbXBvc2luZygpP3RoaXMuYW5jaG9yLm9mZnNldC09dC5sZW5ndGg6KHRoaXMuZm9ybWF0PXMsdGhpcy5zdHlsZT1hKSl9ZWxzZXtpZihpPW5ldyBTZXQoWy4uLm4uZ2V0UGFyZW50S2V5cygpLC4uLmYuZ2V0UGFyZW50S2V5cygpXSksaD1CKG4pP246bi5nZXRQYXJlbnRPclRocm93KCksbD1CKGYpP2Y6Zi5nZXRQYXJlbnRPclRocm93KCksZD1mLCFoLmlzKGwpJiZsLmlzSW5saW5lKCkpZG8gZD1sLGw9bC5nZXRQYXJlbnRPclRocm93KCk7d2hpbGUobC5pc0lubGluZSgpKTtpZih1LnR5cGU9PT0idGV4dCImJihjIT09MHx8Zi5nZXRUZXh0Q29udGVudCgpPT09IiIpfHx1LnR5cGU9PT0iZWxlbWVudCImJmYuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKTxjKWlmKFEoZikmJiFmLmlzVG9rZW4oKSYmYyE9PWYuZ2V0VGV4dENvbnRlbnRTaXplKCkpe2lmKGYuaXNTZWdtZW50ZWQoKSl7dmFyIGc9Q3QoZi5nZXRUZXh0Q29udGVudCgpKTtmLnJlcGxhY2UoZyksZj1nfWVuKHUuZ2V0Tm9kZSgpKXx8KGY9Zi5zcGxpY2VUZXh0KDAsYywiIikpLGkuYWRkKGYuX19rZXkpfWVsc2UgdT1mLmdldFBhcmVudE9yVGhyb3coKSx1LmNhbkJlRW1wdHkoKXx8dS5nZXRDaGlsZHJlblNpemUoKSE9PTE/Zi5yZW1vdmUoKTp1LnJlbW92ZSgpO2Vsc2UgaS5hZGQoZi5fX2tleSk7Zm9yKHU9bC5nZXRDaGlsZHJlbigpLGM9bmV3IFNldChzKSxmPWguaXMobCksaD1oLmlzSW5saW5lKCkmJm4uZ2V0TmV4dFNpYmxpbmcoKT09PW51bGw/aDpuLGc9dS5sZW5ndGgtMTswPD1nO2ctLSl7bGV0IG09dVtnXTtpZihtLmlzKG4pfHxCKG0pJiZtLmlzUGFyZW50T2YobikpYnJlYWs7bS5pc0F0dGFjaGVkKCkmJighYy5oYXMobSl8fG0uaXMoZCk/Znx8aC5pbnNlcnRBZnRlcihtLCExKTptLnJlbW92ZSgpKX1pZighZilmb3IodT1sLGM9bnVsbDt1IT09bnVsbDspbD11LmdldENoaWxkcmVuKCksZj1sLmxlbmd0aCwoZj09PTB8fGxbZi0xXS5pcyhjKSkmJihpLmRlbGV0ZSh1Ll9fa2V5KSxjPXUpLHU9dS5nZXRQYXJlbnQoKTtmb3Iobi5pc1Rva2VuKCk/cj09PW8/bi5zZWxlY3QoKToodD1DdCh0KSx0LnNlbGVjdCgpLG4ucmVwbGFjZSh0KSk6KG49bi5zcGxpY2VUZXh0KHIsby1yLHQsITApLG4uZ2V0VGV4dENvbnRlbnQoKT09PSIiP24ucmVtb3ZlKCk6bi5pc0NvbXBvc2luZygpJiZ0aGlzLmFuY2hvci50eXBlPT09InRleHQiJiYodGhpcy5hbmNob3Iub2Zmc2V0LT10Lmxlbmd0aCkpLHQ9MTt0PGE7dCsrKW49c1t0XSxpLmhhcyhuLl9fa2V5KXx8bi5yZW1vdmUoKX19cmVtb3ZlVGV4dCgpe3RoaXMuaW5zZXJ0VGV4dCgiIil9Zm9ybWF0VGV4dCh0KXtpZih0aGlzLmlzQ29sbGFwc2VkKCkpdGhpcy50b2dnbGVGb3JtYXQodCksTXQobnVsbCk7ZWxzZXt2YXIgbj10aGlzLmdldE5vZGVzKCkscj1bXTtmb3IodmFyIG8gb2YgbilRKG8pJiZyLnB1c2gobyk7dmFyIGk9ci5sZW5ndGg7aWYoaT09PTApdGhpcy50b2dnbGVGb3JtYXQodCksTXQobnVsbCk7ZWxzZXtvPXRoaXMuYW5jaG9yO3ZhciBsPXRoaXMuZm9jdXMscz10aGlzLmlzQmFja3dhcmQoKTtuPXM/bDpvLG89cz9vOmw7dmFyIGE9MCx1PXJbMF07aWYobD1uLnR5cGU9PT0iZWxlbWVudCI/MDpuLm9mZnNldCxuLnR5cGU9PT0idGV4dCImJmw9PT11LmdldFRleHRDb250ZW50U2l6ZSgpJiYoYT0xLHU9clsxXSxsPTApLHUhPW51bGwpe3M9dS5nZXRGb3JtYXRGbGFncyh0LG51bGwpO3ZhciBjPWktMSxkPXJbY107aWYoaT1vLnR5cGU9PT0idGV4dCI/by5vZmZzZXQ6ZC5nZXRUZXh0Q29udGVudFNpemUoKSx1LmlzKGQpKWwhPT1pJiYobD09PTAmJmk9PT11LmdldFRleHRDb250ZW50U2l6ZSgpP3Uuc2V0Rm9ybWF0KHMpOih0PXUuc3BsaXRUZXh0KGwsaSksdD1sPT09MD90WzBdOnRbMV0sdC5zZXRGb3JtYXQocyksbi50eXBlPT09InRleHQiJiZuLnNldCh0Ll9fa2V5LDAsInRleHQiKSxvLnR5cGU9PT0idGV4dCImJm8uc2V0KHQuX19rZXksaS1sLCJ0ZXh0IikpLHRoaXMuZm9ybWF0PXMpO2Vsc2V7bCE9PTAmJihbLHVdPXUuc3BsaXRUZXh0KGwpLGw9MCksdS5zZXRGb3JtYXQocyk7dmFyIGY9ZC5nZXRGb3JtYXRGbGFncyh0LHMpO2ZvcigwPGkmJihpIT09ZC5nZXRUZXh0Q29udGVudFNpemUoKSYmKFtkXT1kLnNwbGl0VGV4dChpKSksZC5zZXRGb3JtYXQoZikpLGErPTE7YTxjO2ErKyl7bGV0IGg9clthXTtpZighaC5pc1Rva2VuKCkpe2xldCBnPWguZ2V0Rm9ybWF0RmxhZ3ModCxmKTtoLnNldEZvcm1hdChnKX19bi50eXBlPT09InRleHQiJiZuLnNldCh1Ll9fa2V5LGwsInRleHQiKSxvLnR5cGU9PT0idGV4dCImJm8uc2V0KGQuX19rZXksaSwidGV4dCIpLHRoaXMuZm9ybWF0PXN8Zn19fX19aW5zZXJ0Tm9kZXModCxuKXtpZighdGhpcy5pc0NvbGxhcHNlZCgpKXt2YXIgcj10aGlzLmlzQmFja3dhcmQoKT90aGlzLmFuY2hvcjp0aGlzLmZvY3VzLG89ci5nZXROb2RlKCkuZ2V0TmV4dFNpYmxpbmcoKTtpZihvPW8/by5nZXRLZXkoKTpudWxsLHI9KHI9ci5nZXROb2RlKCkuZ2V0UHJldmlvdXNTaWJsaW5nKCkpP3IuZ2V0S2V5KCk6bnVsbCx0aGlzLnJlbW92ZVRleHQoKSx0aGlzLmlzQ29sbGFwc2VkKCkmJnRoaXMuZm9jdXMudHlwZT09PSJlbGVtZW50Iil7aWYodGhpcy5mb2N1cy5rZXk9PT1vJiZ0aGlzLmZvY3VzLm9mZnNldD09PTApe3ZhciBpPUN0KCk7dGhpcy5mb2N1cy5nZXROb2RlKCkuaW5zZXJ0QmVmb3JlKGkpfWVsc2UgdGhpcy5mb2N1cy5rZXk9PT1yJiZ0aGlzLmZvY3VzLm9mZnNldD09PXRoaXMuZm9jdXMuZ2V0Tm9kZSgpLmdldENoaWxkcmVuU2l6ZSgpJiYoaT1DdCgpLHRoaXMuZm9jdXMuZ2V0Tm9kZSgpLmluc2VydEFmdGVyKGkpKTtpJiYodGhpcy5mb2N1cy5zZXQoaS5fX2tleSwwLCJ0ZXh0IiksdGhpcy5hbmNob3Iuc2V0KGkuX19rZXksMCwidGV4dCIpKX19aT10aGlzLmFuY2hvcixyPWkub2Zmc2V0O3ZhciBsPWkuZ2V0Tm9kZSgpO289bCxpLnR5cGU9PT0iZWxlbWVudCImJihpPWkuZ2V0Tm9kZSgpLG89aS5nZXRDaGlsZEF0SW5kZXgoci0xKSxvPW89PT1udWxsP2k6byksaT1bXTt2YXIgcz1sLmdldE5leHRTaWJsaW5ncygpLGE9Wm4obCk/bnVsbDpsLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKTtpZihRKGwpKWlmKG89bC5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCxyPT09MCYmbyE9PTApbz1sLmdldFByZXZpb3VzU2libGluZygpLG89byE9PW51bGw/bzpsLmdldFBhcmVudE9yVGhyb3coKSxpLnB1c2gobCk7ZWxzZSBpZihyPT09bylvPWw7ZWxzZXtpZihsLmlzVG9rZW4oKSlyZXR1cm4hMTtbbyxsXT1sLnNwbGl0VGV4dChyKSxpLnB1c2gobCl9bD1vLGkucHVzaCguLi5zKSxzPXRbMF07dmFyIHU9ITEsYz1udWxsO2ZvcihsZXQgZz0wO2c8dC5sZW5ndGg7ZysrKXt2YXIgZD10W2ddO2lmKFpuKG8pfHxWZShvKXx8IUIoZCl8fGQuaXNJbmxpbmUoKSl1JiYhQihkKSYmIVZlKGQpJiZabihvLmdldFBhcmVudCgpKSYmVSgyOCk7ZWxzZXtpZihkLmlzKHMpKXtpZihCKG8pJiZvLmlzRW1wdHkoKSYmby5jYW5SZXBsYWNlV2l0aChkKSl7by5yZXBsYWNlKGQpLG89ZCx1PSEwO2NvbnRpbnVlfWlmKHU9ZC5nZXRGaXJzdERlc2NlbmRhbnQoKSxzdyh1KSl7Zm9yKHZhciBmPXUuZ2V0UGFyZW50T3JUaHJvdygpO2YuaXNJbmxpbmUoKTspZj1mLmdldFBhcmVudE9yVGhyb3coKTtpZihjPWYuZ2V0Q2hpbGRyZW4oKSx1PWMubGVuZ3RoLEIobykpe3ZhciBoPW8uZ2V0Rmlyc3RDaGlsZCgpO2ZvcihsZXQgbT0wO208dTttKyspe2xldCBTPWNbbV07aD09PW51bGw/by5hcHBlbmQoUyk6aC5pbnNlcnRBZnRlcihTKSxoPVN9fWVsc2V7Zm9yKGg9dS0xOzA8PWg7aC0tKW8uaW5zZXJ0QWZ0ZXIoY1toXSk7bz1vLmdldFBhcmVudE9yVGhyb3coKX1pZihjPWNbdS0xXSxmLnJlbW92ZSgpLHU9ITAsZi5pcyhkKSljb250aW51ZX19UShvKSYmKGE9PT1udWxsJiZVKDI3KSxvPWEpfXU9ITEsQihvKSYmIW8uaXNJbmxpbmUoKT8oYz1kLFZlKGQpJiYhZC5pc0lubGluZSgpP289dC5sZW5ndGg9PT0xJiZvLmNhbkJlRW1wdHkoKSYmby5pc0VtcHR5KCk/by5pbnNlcnRCZWZvcmUoZCwhMSk6by5pbnNlcnRBZnRlcihkLCExKTpCKGQpPyhkLmNhbkJlRW1wdHkoKXx8IWQuaXNFbXB0eSgpKSYmKGVuKG8pPyhmPW8uZ2V0Q2hpbGRBdEluZGV4KHIpLGYhPT1udWxsP2YuaW5zZXJ0QmVmb3JlKGQpOm8uYXBwZW5kKGQpLG89ZCk6ZC5pc0lubGluZSgpPyhvLmFwcGVuZChkKSxvPWQpOm89by5pbnNlcnRBZnRlcihkLCExKSk6KGY9by5nZXRGaXJzdENoaWxkKCksZiE9PW51bGw/Zi5pbnNlcnRCZWZvcmUoZCk6by5hcHBlbmQoZCksbz1kKSk6IUIoZCl8fEIoZCkmJmQuaXNJbmxpbmUoKXx8VmUobykmJiFvLmlzSW5saW5lKCk/KGM9ZCxkZSh0aGlzKSYmVmUoZCkmJihCKG8pfHxRKG8pKSYmIWQuaXNJbmxpbmUoKT8oUShvKT8oZj1vLmdldFBhcmVudE9yVGhyb3coKSxbb109by5zcGxpdFRleHQociksbz1vLmdldEluZGV4V2l0aGluUGFyZW50KCkrMSk6KGY9byxvPXIpLFssb109bXcoZixvKSxvPW8uaW5zZXJ0QmVmb3JlKGQpKTpvPW8uaW5zZXJ0QWZ0ZXIoZCwhMSkpOihkPW8uZ2V0UGFyZW50T3JUaHJvdygpLG1hKG8pJiZvLnJlbW92ZSgpLG89ZCxnLS0pfWlmKG4mJihRKGwpP2wuc2VsZWN0KCk6KHQ9by5nZXRQcmV2aW91c1NpYmxpbmcoKSxRKHQpP3Quc2VsZWN0KCk6KHQ9by5nZXRJbmRleFdpdGhpblBhcmVudCgpLG8uZ2V0UGFyZW50T3JUaHJvdygpLnNlbGVjdCh0LHQpKSkpLEIobykpe2lmKHQ9UShjKT9jOkIoYykmJmMuaXNJbmxpbmUoKT9jLmdldExhc3REZXNjZW5kYW50KCk6by5nZXRMYXN0RGVzY2VuZGFudCgpLG58fCh0PT09bnVsbD9vLnNlbGVjdCgpOlEodCk/dC5nZXRUZXh0Q29udGVudCgpPT09IiI/dC5zZWxlY3RQcmV2aW91cygpOnQuc2VsZWN0KCk6dC5zZWxlY3ROZXh0KCkpLGkubGVuZ3RoIT09MClmb3Iobj1vLHQ9aS5sZW5ndGgtMTswPD10O3QtLSlyPWlbdF0sYT1yLmdldFBhcmVudE9yVGhyb3coKSwhQihvKXx8dHAocil8fFZlKHIpJiYoIXIuaXNJbmxpbmUoKXx8ci5pc0lzb2xhdGVkKCkpP0Iobyl8fHRwKHIpP0IocikmJiFyLmNhbkluc2VydEFmdGVyKG8pPyhsPWEuY29uc3RydWN0b3IuY2xvbmUoYSksQihsKXx8VSgyOSksbC5hcHBlbmQociksby5pbnNlcnRBZnRlcihsKSk6by5pbnNlcnRBZnRlcihyKTooby5pbnNlcnRCZWZvcmUociksbz1yKToobj09PW8/by5hcHBlbmQocik6by5pbnNlcnRCZWZvcmUociksbz1yKSxhLmlzRW1wdHkoKSYmIWEuY2FuQmVFbXB0eSgpJiZhLnJlbW92ZSgpfWVsc2Ugbnx8KFEobyk/by5zZWxlY3QoKToobj1vLmdldFBhcmVudE9yVGhyb3coKSx0PW8uZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxLG4uc2VsZWN0KHQsdCkpKTtyZXR1cm4hMH1pbnNlcnRQYXJhZ3JhcGgoKXt0aGlzLmlzQ29sbGFwc2VkKCl8fHRoaXMucmVtb3ZlVGV4dCgpO3ZhciB0PXRoaXMuYW5jaG9yLG49dC5vZmZzZXQscj1bXTtpZih0LnR5cGU9PT0idGV4dCIpe3ZhciBvPXQuZ2V0Tm9kZSgpLGk9by5nZXROZXh0U2libGluZ3MoKS5yZXZlcnNlKCksbD1vLmdldFBhcmVudE9yVGhyb3coKSxzPWwuaXNJbmxpbmUoKSxhPXM/bC5nZXRUZXh0Q29udGVudFNpemUoKTpvLmdldFRleHRDb250ZW50U2l6ZSgpO249PT0wP2kucHVzaChvKToocyYmKHI9bC5nZXROZXh0U2libGluZ3MoKSksbj09PWF8fHMmJm49PT1vLmdldFRleHRDb250ZW50U2l6ZSgpfHwoWyxvXT1vLnNwbGl0VGV4dChuKSxpLnB1c2gobykpKX1lbHNle2lmKGw9dC5nZXROb2RlKCksWm4obCkpe2k9cGkoKSxyPWwuZ2V0Q2hpbGRBdEluZGV4KG4pLGkuc2VsZWN0KCksciE9PW51bGw/ci5pbnNlcnRCZWZvcmUoaSwhMSk6bC5hcHBlbmQoaSk7cmV0dXJufWk9bC5nZXRDaGlsZHJlbigpLnNsaWNlKG4pLnJldmVyc2UoKX1pZihvPWkubGVuZ3RoLG49PT0wJiYwPG8mJmwuaXNJbmxpbmUoKSl7aWYocj1sLmdldFBhcmVudE9yVGhyb3coKSxpPXIuaW5zZXJ0TmV3QWZ0ZXIodGhpcywhMSksQihpKSlmb3Iocj1yLmdldENoaWxkcmVuKCksbD0wO2w8ci5sZW5ndGg7bCsrKWkuYXBwZW5kKHJbbF0pfWVsc2UgaWYocz1sLmluc2VydE5ld0FmdGVyKHRoaXMsITEpLHM9PT1udWxsKXRoaXMuaW5zZXJ0TGluZUJyZWFrKCk7ZWxzZSBpZihCKHMpKWlmKGE9bC5nZXRGaXJzdENoaWxkKCksbj09PTAmJihsLmlzKHQuZ2V0Tm9kZSgpKXx8YSYmYS5pcyh0LmdldE5vZGUoKSkpJiYwPG8pbC5pbnNlcnRCZWZvcmUocyk7ZWxzZXtpZihsPW51bGwsbj1yLmxlbmd0aCx0PXMuZ2V0UGFyZW50T3JUaHJvdygpLDA8bilmb3IoYT0wO2E8bjthKyspdC5hcHBlbmQoclthXSk7aWYobyE9PTApZm9yKHI9MDtyPG87cisrKW49aVtyXSxsPT09bnVsbD9zLmFwcGVuZChuKTpsLmluc2VydEJlZm9yZShuKSxsPW47cy5jYW5CZUVtcHR5KCl8fHMuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wP3Muc2VsZWN0U3RhcnQoKToocy5zZWxlY3RQcmV2aW91cygpLHMucmVtb3ZlKCkpfX1pbnNlcnRMaW5lQnJlYWsodCl7bGV0IG49VGwoKTt2YXIgcj10aGlzLmFuY2hvcjtyLnR5cGU9PT0iZWxlbWVudCImJihyPXIuZ2V0Tm9kZSgpLGVuKHIpJiZ0aGlzLmluc2VydFBhcmFncmFwaCgpKSx0P3RoaXMuaW5zZXJ0Tm9kZXMoW25dLCEwKTp0aGlzLmluc2VydE5vZGVzKFtuXSkmJm4uc2VsZWN0TmV4dCgwLDApfWdldENoYXJhY3Rlck9mZnNldHMoKXtyZXR1cm4gRnUodGhpcyl9ZXh0cmFjdCgpe3ZhciB0PXRoaXMuZ2V0Tm9kZXMoKSxuPXQubGVuZ3RoLHI9bi0xLG89dGhpcy5hbmNob3I7bGV0IGk9dGhpcy5mb2N1czt2YXIgbD10WzBdO2xldCBzPXRbcl0sW2EsdV09RnUodGhpcyk7cmV0dXJuIG49PT0wP1tdOm49PT0xP1EobCkmJiF0aGlzLmlzQ29sbGFwc2VkKCk/KHQ9YT51P3U6YSxyPWwuc3BsaXRUZXh0KHQsYT51P2E6dSksdD10PT09MD9yWzBdOnJbMV0sdCE9bnVsbD9bdF06W10pOltsXToobj1vLmlzQmVmb3JlKGkpLFEobCkmJihvPW4/YTp1LG89PT1sLmdldFRleHRDb250ZW50U2l6ZSgpP3Quc2hpZnQoKTpvIT09MCYmKFssbF09bC5zcGxpdFRleHQobyksdFswXT1sKSksUShzKSYmKGw9cy5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCxuPW4/dTphLG49PT0wP3QucG9wKCk6biE9PWwmJihbc109cy5zcGxpdFRleHQobiksdFtyXT1zKSksdCl9bW9kaWZ5KHQsbixyKXt2YXIgbz10aGlzLmZvY3VzLGk9dGhpcy5hbmNob3IsbD10PT09Im1vdmUiLHM9QmgobyxuKTtpZihWZShzKSYmIXMuaXNJc29sYXRlZCgpKWwmJnMuaXNLZXlib2FyZFNlbGVjdGFibGUoKT8obj1ucCgpLG4uYWRkKHMuX19rZXkpLHZyKG4pKToodD1uP3MuZ2V0UHJldmlvdXNTaWJsaW5nKCk6cy5nZXROZXh0U2libGluZygpLFEodCk/KHM9dC5fX2tleSxuPW4/dC5nZXRUZXh0Q29udGVudCgpLmxlbmd0aDowLG8uc2V0KHMsbiwidGV4dCIpLGwmJmkuc2V0KHMsbiwidGV4dCIpKToocj1zLmdldFBhcmVudE9yVGhyb3coKSxCKHQpPyhyPXQuX19rZXkscz1uP3QuZ2V0Q2hpbGRyZW5TaXplKCk6MCk6KHM9cy5nZXRJbmRleFdpdGhpblBhcmVudCgpLHI9ci5fX2tleSxufHxzKyspLG8uc2V0KHIscywiZWxlbWVudCIpLGwmJmkuc2V0KHIscywiZWxlbWVudCIpKSk7ZWxzZSBpZihpPWV0KCksbz1DcihpLl93aW5kb3cpKXt2YXIgYT1pLl9ibG9ja0N1cnNvckVsZW1lbnQsdT1pLl9yb290RWxlbWVudDtpZih1PT09bnVsbHx8YT09PW51bGx8fCFCKHMpfHxzLmlzSW5saW5lKCl8fHMuY2FuQmVFbXB0eSgpfHxXaChhLGksdSksby5tb2RpZnkodCxuPyJiYWNrd2FyZCI6ImZvcndhcmQiLHIpLDA8by5yYW5nZUNvdW50JiYocz1vLmdldFJhbmdlQXQoMCksaT10aGlzLmFuY2hvci5nZXROb2RlKCksaT1lbihpKT9pOnB3KGkpLHRoaXMuYXBwbHlET01SYW5nZShzKSx0aGlzLmRpcnR5PSEwLCFsKSl7Zm9yKGw9dGhpcy5nZXROb2RlcygpLHQ9W10scj0hMSxhPTA7YTxsLmxlbmd0aDthKyspdT1sW2FdLFNjKHUsaSk/dC5wdXNoKHUpOnI9ITA7ciYmMDx0Lmxlbmd0aCYmKG4/KG49dFswXSxCKG4pP24uc2VsZWN0U3RhcnQoKTpuLmdldFBhcmVudE9yVGhyb3coKS5zZWxlY3RTdGFydCgpKToobj10W3QubGVuZ3RoLTFdLEIobik/bi5zZWxlY3RFbmQoKTpuLmdldFBhcmVudE9yVGhyb3coKS5zZWxlY3RFbmQoKSkpLChvLmFuY2hvck5vZGUhPT1zLnN0YXJ0Q29udGFpbmVyfHxvLmFuY2hvck9mZnNldCE9PXMuc3RhcnRPZmZzZXQpJiYobj10aGlzLmZvY3VzLGw9dGhpcy5hbmNob3Isbz1sLmtleSxzPWwub2Zmc2V0LGk9bC50eXBlLGFvKGwsbi5rZXksbi5vZmZzZXQsbi50eXBlKSxhbyhuLG8scyxpKSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsKX19fWRlbGV0ZUNoYXJhY3Rlcih0KXtsZXQgbj10aGlzLmlzQ29sbGFwc2VkKCk7aWYodGhpcy5pc0NvbGxhcHNlZCgpKXt2YXIgcj10aGlzLmFuY2hvcixvPXRoaXMuZm9jdXMsaT1yLmdldE5vZGUoKTtpZighdCYmKHIudHlwZT09PSJlbGVtZW50IiYmQihpKSYmci5vZmZzZXQ9PT1pLmdldENoaWxkcmVuU2l6ZSgpfHxyLnR5cGU9PT0idGV4dCImJnIub2Zmc2V0PT09aS5nZXRUZXh0Q29udGVudFNpemUoKSkpe3ZhciBsPWkuZ2V0UGFyZW50KCk7aWYobD1pLmdldE5leHRTaWJsaW5nKCl8fChsPT09bnVsbD9udWxsOmwuZ2V0TmV4dFNpYmxpbmcoKSksQihsKSYmbC5pc1NoYWRvd1Jvb3QoKSlyZXR1cm59aWYobD1CaChvLHQpLFZlKGwpJiYhbC5pc0lzb2xhdGVkKCkpe2wuaXNLZXlib2FyZFNlbGVjdGFibGUoKSYmQihpKSYmaS5nZXRDaGlsZHJlblNpemUoKT09PTA/KGkucmVtb3ZlKCksdD1ucCgpLHQuYWRkKGwuX19rZXkpLHZyKHQpKToobC5yZW1vdmUoKSxldCgpLmRpc3BhdGNoQ29tbWFuZChhZCx2b2lkIDApKTtyZXR1cm59aWYoIXQmJkIobCkmJkIoaSkmJmkuaXNFbXB0eSgpKXtpLnJlbW92ZSgpLGwuc2VsZWN0U3RhcnQoKTtyZXR1cm59aWYodGhpcy5tb2RpZnkoImV4dGVuZCIsdCwiY2hhcmFjdGVyIiksdGhpcy5pc0NvbGxhcHNlZCgpKXtpZih0JiZyLm9mZnNldD09PTAmJihyLnR5cGU9PT0iZWxlbWVudCI/ci5nZXROb2RlKCk6ci5nZXROb2RlKCkuZ2V0UGFyZW50T3JUaHJvdygpKS5jb2xsYXBzZUF0U3RhcnQodGhpcykpcmV0dXJufWVsc2V7aWYobD1vLnR5cGU9PT0idGV4dCI/by5nZXROb2RlKCk6bnVsbCxpPXIudHlwZT09PSJ0ZXh0Ij9yLmdldE5vZGUoKTpudWxsLGwhPT1udWxsJiZsLmlzU2VnbWVudGVkKCkpe2lmKHI9by5vZmZzZXQsbz1sLmdldFRleHRDb250ZW50U2l6ZSgpLGwuaXMoaSl8fHQmJnIhPT1vfHwhdCYmciE9PTApe195KGwsdCxyKTtyZXR1cm59fWVsc2UgaWYoaSE9PW51bGwmJmkuaXNTZWdtZW50ZWQoKSYmKHI9ci5vZmZzZXQsbz1pLmdldFRleHRDb250ZW50U2l6ZSgpLGkuaXMobCl8fHQmJnIhPT0wfHwhdCYmciE9PW8pKXtfeShpLHQscik7cmV0dXJufWlmKGk9dGhpcy5hbmNob3IsbD10aGlzLmZvY3VzLHI9aS5nZXROb2RlKCksbz1sLmdldE5vZGUoKSxyPT09byYmaS50eXBlPT09InRleHQiJiZsLnR5cGU9PT0idGV4dCIpe3ZhciBzPWkub2Zmc2V0LGE9bC5vZmZzZXQ7bGV0IHU9czxhO289dT9zOmEsYT11P2E6cyxzPWEtMSxvIT09cyYmKHI9ci5nZXRUZXh0Q29udGVudCgpLnNsaWNlKG8sYSksZHcocil8fCh0P2wub2Zmc2V0PXM6aS5vZmZzZXQ9cykpfX19dGhpcy5yZW1vdmVUZXh0KCksdCYmIW4mJnRoaXMuaXNDb2xsYXBzZWQoKSYmdGhpcy5hbmNob3IudHlwZT09PSJlbGVtZW50IiYmdGhpcy5hbmNob3Iub2Zmc2V0PT09MCYmKHQ9dGhpcy5hbmNob3IuZ2V0Tm9kZSgpLHQuaXNFbXB0eSgpJiZlbih0LmdldFBhcmVudCgpKSYmdC5nZXRJbmRleFdpdGhpblBhcmVudCgpPT09MCYmdC5jb2xsYXBzZUF0U3RhcnQodGhpcykpfWRlbGV0ZUxpbmUodCl7dGhpcy5pc0NvbGxhcHNlZCgpJiYodGhpcy5hbmNob3IudHlwZT09PSJ0ZXh0IiYmdGhpcy5tb2RpZnkoImV4dGVuZCIsdCwibGluZWJvdW5kYXJ5IiksKHQ/dGhpcy5mb2N1czp0aGlzLmFuY2hvcikub2Zmc2V0PT09MCYmdGhpcy5tb2RpZnkoImV4dGVuZCIsdCwiY2hhcmFjdGVyIikpLHRoaXMucmVtb3ZlVGV4dCgpfWRlbGV0ZVdvcmQodCl7dGhpcy5pc0NvbGxhcHNlZCgpJiZ0aGlzLm1vZGlmeSgiZXh0ZW5kIix0LCJ3b3JkIiksdGhpcy5yZW1vdmVUZXh0KCl9fWZ1bmN0aW9uIEJsKGUpe3JldHVybiBlIGluc3RhbmNlb2YgbWR9ZnVuY3Rpb24geHkoZSl7bGV0IHQ9ZS5vZmZzZXQ7cmV0dXJuIGUudHlwZT09PSJ0ZXh0Ij90OihlPWUuZ2V0Tm9kZSgpLHQ9PT1lLmdldENoaWxkcmVuU2l6ZSgpP2UuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGg6MCl9ZnVuY3Rpb24gRnUoZSl7bGV0IHQ9ZS5hbmNob3I7cmV0dXJuIGU9ZS5mb2N1cyx0LnR5cGU9PT0iZWxlbWVudCImJmUudHlwZT09PSJlbGVtZW50IiYmdC5rZXk9PT1lLmtleSYmdC5vZmZzZXQ9PT1lLm9mZnNldD9bMCwwXTpbeHkodCkseHkoZSldfWZ1bmN0aW9uIF95KGUsdCxuKXtsZXQgcj1lLmdldFRleHRDb250ZW50KCkuc3BsaXQoLyg/PVxzKS9nKSxvPXIubGVuZ3RoLGk9MCxsPTA7Zm9yKGxldCBzPTA7czxvO3MrKyl7bGV0IGE9cltzXSx1PXM9PT1vLTE7aWYobD1pLGkrPWEubGVuZ3RoLHQmJmk9PT1ufHxpPm58fHUpe3Iuc3BsaWNlKHMsMSksdSYmKGw9dm9pZCAwKTticmVha319dD1yLmpvaW4oIiIpLnRyaW0oKSx0PT09IiI/ZS5yZW1vdmUoKTooZS5zZXRUZXh0Q29udGVudCh0KSxlLnNlbGVjdChsLGwpKX1mdW5jdGlvbiB3eShlLHQsbixyKXt2YXIgbz10O2lmKGUubm9kZVR5cGU9PT0xKXtsZXQgcz0hMTt2YXIgaT1lLmNoaWxkTm9kZXMsbD1pLmxlbmd0aDtvPT09bCYmKHM9ITAsbz1sLTEpO2xldCBhPWlbb107aWYobD0hMSxhPT09ci5fYmxvY2tDdXJzb3JFbGVtZW50PyhhPWlbbysxXSxsPSEwKTpyLl9ibG9ja0N1cnNvckVsZW1lbnQhPT1udWxsJiZvLS0scj10bChhKSxRKHIpKW89cz9yLmdldFRleHRDb250ZW50U2l6ZSgpOjA7ZWxzZXtpZihpPXRsKGUpLGk9PT1udWxsKXJldHVybiBudWxsO2lmKEIoaSk/KGU9aS5nZXRDaGlsZEF0SW5kZXgobyksKHQ9QihlKSkmJih0PWUuZ2V0UGFyZW50KCksdD1uPT09bnVsbHx8dD09PW51bGx8fCF0LmNhbkJlRW1wdHkoKXx8dCE9PW4uZ2V0Tm9kZSgpKSx0JiYobj1zP2UuZ2V0TGFzdERlc2NlbmRhbnQoKTplLmdldEZpcnN0RGVzY2VuZGFudCgpLG49PT1udWxsPyhpPWUsbz0wKTooZT1uLGk9QihlKT9lOmUuZ2V0UGFyZW50T3JUaHJvdygpKSksUShlKT8ocj1lLGk9bnVsbCxvPXM/ZS5nZXRUZXh0Q29udGVudFNpemUoKTowKTplIT09aSYmcyYmIWwmJm8rKyk6KG89aS5nZXRJbmRleFdpdGhpblBhcmVudCgpLG89dD09PTAmJlZlKGkpJiZ0bChlKT09PWk/bzpvKzEsaT1pLmdldFBhcmVudE9yVGhyb3coKSksQihpKSlyZXR1cm4gbmV3IHlyKGkuX19rZXksbywiZWxlbWVudCIpfX1lbHNlIHI9dGwoZSk7cmV0dXJuIFEocik/bmV3IHlyKHIuX19rZXksbywidGV4dCIpOm51bGx9ZnVuY3Rpb24gU3koZSx0LG4pe3ZhciByPWUub2Zmc2V0LG89ZS5nZXROb2RlKCk7cj09PTA/KHI9by5nZXRQcmV2aW91c1NpYmxpbmcoKSxvPW8uZ2V0UGFyZW50KCksdD8obnx8IXQpJiZyPT09bnVsbCYmQihvKSYmby5pc0lubGluZSgpJiYodD1vLmdldFByZXZpb3VzU2libGluZygpLFEodCkmJihlLmtleT10Ll9fa2V5LGUub2Zmc2V0PXQuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgpKTpCKHIpJiYhbiYmci5pc0lubGluZSgpPyhlLmtleT1yLl9fa2V5LGUub2Zmc2V0PXIuZ2V0Q2hpbGRyZW5TaXplKCksZS50eXBlPSJlbGVtZW50Iik6UShyKSYmKGUua2V5PXIuX19rZXksZS5vZmZzZXQ9ci5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCkpOnI9PT1vLmdldFRleHRDb250ZW50KCkubGVuZ3RoJiYocj1vLmdldE5leHRTaWJsaW5nKCksbz1vLmdldFBhcmVudCgpLHQmJkIocikmJnIuaXNJbmxpbmUoKT8oZS5rZXk9ci5fX2tleSxlLm9mZnNldD0wLGUudHlwZT0iZWxlbWVudCIpOihufHx0KSYmcj09PW51bGwmJkIobykmJm8uaXNJbmxpbmUoKSYmIW8uY2FuSW5zZXJ0VGV4dEFmdGVyKCkmJih0PW8uZ2V0TmV4dFNpYmxpbmcoKSxRKHQpJiYoZS5rZXk9dC5fX2tleSxlLm9mZnNldD0wKSkpfWZ1bmN0aW9uIFB3KGUsdCxuKXtpZihlLnR5cGU9PT0idGV4dCImJnQudHlwZT09PSJ0ZXh0Iil7dmFyIHI9ZS5pc0JlZm9yZSh0KTtsZXQgbz1lLmlzKHQpO1N5KGUscixvKSxTeSh0LCFyLG8pLG8mJih0LmtleT1lLmtleSx0Lm9mZnNldD1lLm9mZnNldCx0LnR5cGU9ZS50eXBlKSxyPWV0KCksci5pc0NvbXBvc2luZygpJiZyLl9jb21wb3NpdGlvbktleSE9PWUua2V5JiZkZShuKSYmKHI9bi5hbmNob3Isbj1uLmZvY3VzLGFvKGUsci5rZXksci5vZmZzZXQsci50eXBlKSxhbyh0LG4ua2V5LG4ub2Zmc2V0LG4udHlwZSkpfX1mdW5jdGlvbiBPdyhlLHQsbixyLG8saSl7cmV0dXJuIGU9PT1udWxsfHxuPT09bnVsbHx8IUFhKG8sZSxuKXx8KHQ9d3koZSx0LGRlKGkpP2kuYW5jaG9yOm51bGwsbyksdD09PW51bGwpfHwocj13eShuLHIsZGUoaSk/aS5mb2N1czpudWxsLG8pLHI9PT1udWxsfHx0LnR5cGU9PT0iZWxlbWVudCImJnIudHlwZT09PSJlbGVtZW50IiYmKGU9dGwoZSksbj10bChuKSxWZShlKSYmVmUobikpKT9udWxsOihQdyh0LHIsaSksW3Qscl0pfWZ1bmN0aW9uIHRwKGUpe3JldHVybiBCKGUpJiYhZS5pc0lubGluZSgpfWZ1bmN0aW9uIEF3KGUsdCxuLHIsbyxpKXtsZXQgbD1FcigpO3JldHVybiBlPW5ldyBUaShuZXcgeXIoZSx0LG8pLG5ldyB5cihuLHIsaSksMCwiIiksZS5kaXJ0eT0hMCxsLl9zZWxlY3Rpb249ZX1mdW5jdGlvbiBucCgpe3JldHVybiBuZXcgbWQobmV3IFNldCl9ZnVuY3Rpb24gRGIoZSl7bGV0IHQ9ZS5nZXRFZGl0b3JTdGF0ZSgpLl9zZWxlY3Rpb24sbj1DcihlLl93aW5kb3cpO3JldHVybiBCbCh0KXx8UWcodCk/dC5jbG9uZSgpOkpnKHQsbixlKX1mdW5jdGlvbiBKZyhlLHQsbil7dmFyIHI9bi5fd2luZG93O2lmKHI9PT1udWxsKXJldHVybiBudWxsO3ZhciBvPXIuZXZlbnQsaT1vP28udHlwZTp2b2lkIDA7cj1pPT09InNlbGVjdGlvbmNoYW5nZSIsbz0hemgmJihyfHxpPT09ImJlZm9yZWlucHV0Inx8aT09PSJjb21wb3NpdGlvbnN0YXJ0Inx8aT09PSJjb21wb3NpdGlvbmVuZCJ8fGk9PT0iY2xpY2siJiZvJiZvLmRldGFpbD09PTN8fGk9PT0iZHJvcCJ8fGk9PT12b2lkIDApO2xldCBsO2lmKCFkZShlKXx8byl7aWYodD09PW51bGwpcmV0dXJuIG51bGw7aWYobz10LmFuY2hvck5vZGUsaT10LmZvY3VzTm9kZSxsPXQuYW5jaG9yT2Zmc2V0LHQ9dC5mb2N1c09mZnNldCxyJiZkZShlKSYmIUFhKG4sbyxpKSlyZXR1cm4gZS5jbG9uZSgpfWVsc2UgcmV0dXJuIGUuY2xvbmUoKTtpZihuPU93KG8sbCxpLHQsbixlKSxuPT09bnVsbClyZXR1cm4gbnVsbDtsZXRbcyxhXT1uO3JldHVybiBuZXcgVGkocyxhLGRlKGUpP2UuZm9ybWF0OjAsZGUoZSk/ZS5zdHlsZToiIil9ZnVuY3Rpb24gS2UoKXtyZXR1cm4gRXIoKS5fc2VsZWN0aW9ufWZ1bmN0aW9uIFdsKCl7cmV0dXJuIGV0KCkuX2VkaXRvclN0YXRlLl9zZWxlY3Rpb259ZnVuY3Rpb24gJGMoZSx0LG4scj0xKXt2YXIgbz1lLmFuY2hvcixpPWUuZm9jdXMsbD1vLmdldE5vZGUoKSxzPWkuZ2V0Tm9kZSgpO2lmKHQuaXMobCl8fHQuaXMocykpe2lmKGw9dC5fX2tleSxlLmlzQ29sbGFwc2VkKCkpdD1vLm9mZnNldCwobjw9dCYmMDxyfHxuPHQmJjA+cikmJihuPU1hdGgubWF4KDAsdCtyKSxvLnNldChsLG4sImVsZW1lbnQiKSxpLnNldChsLG4sImVsZW1lbnQiKSxDeShlKSk7ZWxzZXtsZXQgdT1lLmlzQmFja3dhcmQoKTtzPXU/aTpvO3ZhciBhPXMuZ2V0Tm9kZSgpO289dT9vOmksaT1vLmdldE5vZGUoKSx0LmlzKGEpJiYoYT1zLm9mZnNldCwobjw9YSYmMDxyfHxuPGEmJjA+cikmJnMuc2V0KGwsTWF0aC5tYXgoMCxhK3IpLCJlbGVtZW50IikpLHQuaXMoaSkmJih0PW8ub2Zmc2V0LChuPD10JiYwPHJ8fG48dCYmMD5yKSYmby5zZXQobCxNYXRoLm1heCgwLHQrciksImVsZW1lbnQiKSl9Q3koZSl9fWZ1bmN0aW9uIEN5KGUpe3ZhciB0PWUuYW5jaG9yLG49dC5vZmZzZXQ7bGV0IHI9ZS5mb2N1czt2YXIgbz1yLm9mZnNldCxpPXQuZ2V0Tm9kZSgpLGw9ci5nZXROb2RlKCk7aWYoZS5pc0NvbGxhcHNlZCgpKUIoaSkmJihsPWkuZ2V0Q2hpbGRyZW5TaXplKCksbD0obz1uPj1sKT9pLmdldENoaWxkQXRJbmRleChsLTEpOmkuZ2V0Q2hpbGRBdEluZGV4KG4pLFEobCkmJihuPTAsbyYmKG49bC5nZXRUZXh0Q29udGVudFNpemUoKSksdC5zZXQobC5fX2tleSxuLCJ0ZXh0Iiksci5zZXQobC5fX2tleSxuLCJ0ZXh0IikpKTtlbHNle2lmKEIoaSkpe2xldCBzPWkuZ2V0Q2hpbGRyZW5TaXplKCk7bj0oZT1uPj1zKT9pLmdldENoaWxkQXRJbmRleChzLTEpOmkuZ2V0Q2hpbGRBdEluZGV4KG4pLFEobikmJihpPTAsZSYmKGk9bi5nZXRUZXh0Q29udGVudFNpemUoKSksdC5zZXQobi5fX2tleSxpLCJ0ZXh0IikpfUIobCkmJihuPWwuZ2V0Q2hpbGRyZW5TaXplKCksbz0odD1vPj1uKT9sLmdldENoaWxkQXRJbmRleChuLTEpOmwuZ2V0Q2hpbGRBdEluZGV4KG8pLFEobykmJihsPTAsdCYmKGw9by5nZXRUZXh0Q29udGVudFNpemUoKSksci5zZXQoby5fX2tleSxsLCJ0ZXh0IikpKX19ZnVuY3Rpb24gTGIoZSx0KXtpZih0PXQuZ2V0RWRpdG9yU3RhdGUoKS5fc2VsZWN0aW9uLGU9ZS5fc2VsZWN0aW9uLGRlKGUpKXt2YXIgbj1lLmFuY2hvcjtsZXQgcj1lLmZvY3VzLG87bi50eXBlPT09InRleHQiJiYobz1uLmdldE5vZGUoKSxvLnNlbGVjdGlvblRyYW5zZm9ybSh0LGUpKSxyLnR5cGU9PT0idGV4dCImJihuPXIuZ2V0Tm9kZSgpLG8hPT1uJiZuLnNlbGVjdGlvblRyYW5zZm9ybSh0LGUpKX19ZnVuY3Rpb24ga2MoZSx0LG4scixvKXtsZXQgaT1udWxsLGw9MCxzPW51bGw7ciE9PW51bGw/KGk9ci5fX2tleSxRKHIpPyhsPXIuZ2V0VGV4dENvbnRlbnRTaXplKCkscz0idGV4dCIpOkIocikmJihsPXIuZ2V0Q2hpbGRyZW5TaXplKCkscz0iZWxlbWVudCIpKTpvIT09bnVsbCYmKGk9by5fX2tleSxRKG8pP3M9InRleHQiOkIobykmJihzPSJlbGVtZW50IikpLGkhPT1udWxsJiZzIT09bnVsbD9lLnNldChpLGwscyk6KGw9dC5nZXRJbmRleFdpdGhpblBhcmVudCgpLGw9PT0tMSYmKGw9bi5nZXRDaGlsZHJlblNpemUoKSksZS5zZXQobi5fX2tleSxsLCJlbGVtZW50IikpfWZ1bmN0aW9uIEV5KGUsdCxuLHIsbyl7ZS50eXBlPT09InRleHQiPyhlLmtleT1uLHR8fChlLm9mZnNldCs9bykpOmUub2Zmc2V0PnIuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSYmLS1lLm9mZnNldH1mdW5jdGlvbiBNdyhlLHQsbil7bGV0IHI9W10sbz1udWxsLGk9bnVsbDtlPWUuZ2V0Q2hpbGRyZW4oKTtmb3IobGV0IGM9MDtjPGUubGVuZ3RoO2MrKyl7dmFyIGw9ZVtjXTt5YShsKXx8VSgxMDgpO3ZhciBzPWwuZ2V0Q2hpbGRyZW4oKTtsPTA7Zm9yKGxldCBkIG9mIHMpe2ZvcihNbihkKXx8VSgxMDkpO3JbY10hPT12b2lkIDAmJnJbY11bbF0hPT12b2lkIDA7KWwrKztzPWM7dmFyIGE9bCx1PWQ7bGV0IGY9e2NlbGw6dSxzdGFydENvbHVtbjphLHN0YXJ0Um93OnN9LGg9dS5fX3Jvd1NwYW4sZz11Ll9fY29sU3Bhbjtmb3IobGV0IG09MDttPGg7bSsrKXtyW3MrbV09PT12b2lkIDAmJihyW3MrbV09W10pO2ZvcihsZXQgUz0wO1M8ZztTKyspcltzK21dW2ErU109Zn10LmlzKHUpJiYobz1mKSxuLmlzKHUpJiYoaT1mKSxsKz1kLl9fY29sU3Bhbn19cmV0dXJuIG89PT1udWxsJiZVKDExMCksaT09PW51bGwmJlUoMTExKSxbcixvLGldfWZ1bmN0aW9uIER3KGUpe2UgaW5zdGFuY2VvZiBlbXx8KGUgaW5zdGFuY2VvZiBMYT8oZT1DYyhlLE1uKSxNbihlKXx8VSgxMTQpKTooZT1DYyhlLmdldE5vZGUoKSxNbiksTW4oZSl8fFUoMTE0KSkpO2xldCB0PWUuZ2V0UGFyZW50KCk7eWEodCl8fFUoMTE1KTtsZXQgbj10LmdldFBhcmVudCgpO3JldHVybiB0bShuKXx8VSgxMTYpLFtlLHQsbl19bGV0IGt0PW51bGwsVHQ9bnVsbCxwbj0hMSxTZj0hMSx2YT0wLCR5PXtjaGFyYWN0ZXJEYXRhOiEwLGNoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfTtmdW5jdGlvbiBVbCgpe3JldHVybiBwbnx8a3QhPT1udWxsJiZrdC5fcmVhZE9ubHl9ZnVuY3Rpb24gWnQoKXtwbiYmVSgxMyl9ZnVuY3Rpb24gRXIoKXtyZXR1cm4ga3Q9PT1udWxsJiZVKDE1KSxrdH1mdW5jdGlvbiBldCgpe3JldHVybiBUdD09PW51bGwmJlUoMTYpLFR0fWZ1bmN0aW9uIGt5KGUsdCxuKXt2YXIgcj10Ll9fdHlwZTtsZXQgbz1lLl9ub2Rlcy5nZXQocik7Zm9yKG89PT12b2lkIDAmJlUoMzAsciksZT1uLmdldChyKSxlPT09dm9pZCAwJiYoZT1BcnJheS5mcm9tKG8udHJhbnNmb3Jtcyksbi5zZXQocixlKSksbj1lLmxlbmd0aCxyPTA7cjxuJiYoZVtyXSh0KSx0LmlzQXR0YWNoZWQoKSk7cisrKTt9ZnVuY3Rpb24gSWIoZSx0KXt0PXQuX2RpcnR5TGVhdmVzLGU9ZS5fbm9kZU1hcDtmb3IobGV0IG4gb2YgdCl0PWUuZ2V0KG4pLFEodCkmJnQuaXNBdHRhY2hlZCgpJiZ0LmlzU2ltcGxlVGV4dCgpJiYhdC5pc1VubWVyZ2VhYmxlKCkmJml3KHQpfWZ1bmN0aW9uIGpiKGUsdCl7bGV0IG49dC5fZGlydHlMZWF2ZXMscj10Ll9kaXJ0eUVsZW1lbnRzO2U9ZS5fbm9kZU1hcDtsZXQgbz1tbygpLGk9bmV3IE1hcDt2YXIgbD1uO2xldCBzPWwuc2l6ZTtmb3IodmFyIGE9cix1PWEuc2l6ZTswPHN8fDA8dTspe2lmKDA8cyl7dC5fZGlydHlMZWF2ZXM9bmV3IFNldDtmb3IobGV0IGMgb2YgbClsPWUuZ2V0KGMpLFEobCkmJmwuaXNBdHRhY2hlZCgpJiZsLmlzU2ltcGxlVGV4dCgpJiYhbC5pc1VubWVyZ2VhYmxlKCkmJml3KGwpLGwhPT12b2lkIDAmJmwhPT12b2lkIDAmJmwuX19rZXkhPT1vJiZsLmlzQXR0YWNoZWQoKSYma3kodCxsLGkpLG4uYWRkKGMpO2lmKGw9dC5fZGlydHlMZWF2ZXMscz1sLnNpemUsMDxzKXt2YSsrO2NvbnRpbnVlfX10Ll9kaXJ0eUxlYXZlcz1uZXcgU2V0LHQuX2RpcnR5RWxlbWVudHM9bmV3IE1hcDtmb3IobGV0IGMgb2YgYSlhPWNbMF0sdT1jWzFdLChhPT09InJvb3QifHx1KSYmKGw9ZS5nZXQoYSksbCE9PXZvaWQgMCYmbCE9PXZvaWQgMCYmbC5fX2tleSE9PW8mJmwuaXNBdHRhY2hlZCgpJiZreSh0LGwsaSksci5zZXQoYSx1KSk7bD10Ll9kaXJ0eUxlYXZlcyxzPWwuc2l6ZSxhPXQuX2RpcnR5RWxlbWVudHMsdT1hLnNpemUsdmErK310Ll9kaXJ0eUxlYXZlcz1uLHQuX2RpcnR5RWxlbWVudHM9cn1mdW5jdGlvbiBaZyhlLHQpe3ZhciBuPWUudHlwZSxyPXQuZ2V0KG4pO2lmKHI9PT12b2lkIDAmJlUoMTcsbiksbj1yLmtsYXNzLGUudHlwZSE9PW4uZ2V0VHlwZSgpJiZVKDE4LG4ubmFtZSksbj1uLmltcG9ydEpTT04oZSksZT1lLmNoaWxkcmVuLEIobikmJkFycmF5LmlzQXJyYXkoZSkpZm9yKHI9MDtyPGUubGVuZ3RoO3IrKyl7bGV0IG89WmcoZVtyXSx0KTtuLmFwcGVuZChvKX1yZXR1cm4gbn1mdW5jdGlvbiBUeShlLHQpe2xldCBuPWt0LHI9cG4sbz1UdDtrdD1lLHBuPSEwLFR0PW51bGw7dHJ5e3JldHVybiB0KCl9ZmluYWxseXtrdD1uLHBuPXIsVHQ9b319ZnVuY3Rpb24gbGkoZSx0KXtsZXQgbj1lLl9wZW5kaW5nRWRpdG9yU3RhdGUscj1lLl9yb290RWxlbWVudCxvPWUuX2hlYWRsZXNzfHxyPT09bnVsbDtpZihuIT09bnVsbCl7dmFyIGk9ZS5fZWRpdG9yU3RhdGUsbD1pLl9zZWxlY3Rpb24scz1uLl9zZWxlY3Rpb24sYT1lLl9kaXJ0eVR5cGUhPT0wLHU9a3QsYz1wbixkPVR0LGY9ZS5fdXBkYXRpbmcsaD1lLl9vYnNlcnZlcixnPW51bGw7aWYoZS5fcGVuZGluZ0VkaXRvclN0YXRlPW51bGwsZS5fZWRpdG9yU3RhdGU9biwhbyYmYSYmaCE9PW51bGwpe1R0PWUsa3Q9bixwbj0hMSxlLl91cGRhdGluZz0hMDt0cnl7bGV0IFRlPWUuX2RpcnR5VHlwZSxmdD1lLl9kaXJ0eUVsZW1lbnRzLGh0PWUuX2RpcnR5TGVhdmVzO2guZGlzY29ubmVjdCgpO3ZhciBtPVRlLFM9ZnQsdj1odDtKdD1Pcj1ndD0iIix5dz1tPT09MixJdT1udWxsLEh0PWUsUm89ZS5fY29uZmlnLGhhPWUuX25vZGVzLHBkPUh0Ll9saXN0ZW5lcnMubXV0YXRpb24sVWg9UyxWaD12LGhpPWkuX25vZGVNYXAsUG89bi5fbm9kZU1hcCxYZz1uLl9yZWFkT25seSxIaD1uZXcgTWFwKGUuX2tleVRvRE9NTWFwKTtsZXQgX3Q9bmV3IE1hcDtwYT1fdCxfcygicm9vdCIsbnVsbCkscGE9SGg9Um89UG89aGk9Vmg9VWg9aGE9SHQ9dm9pZCAwLGc9X3R9Y2F0Y2goVGUpe2lmKFRlIGluc3RhbmNlb2YgRXJyb3ImJmUuX29uRXJyb3IoVGUpLFNmKXRocm93IFRlO3p3KGUsbnVsbCxyLG4pLG93KGUpLGUuX2RpcnR5VHlwZT0yLFNmPSEwLGxpKGUsaSksU2Y9ITE7cmV0dXJufWZpbmFsbHl7aC5vYnNlcnZlKHIsJHkpLGUuX3VwZGF0aW5nPWYsa3Q9dSxwbj1jLFR0PWR9fW4uX3JlYWRPbmx5fHwobi5fcmVhZE9ubHk9ITApO3ZhciB5PWUuX2RpcnR5TGVhdmVzLF89ZS5fZGlydHlFbGVtZW50cyx3PWUuX25vcm1hbGl6ZWROb2RlcyxDPWUuX3VwZGF0ZVRhZ3MsJD1lLl9kZWZlcnJlZDthJiYoZS5fZGlydHlUeXBlPTAsZS5fY2xvbmVOb3ROZWVkZWQuY2xlYXIoKSxlLl9kaXJ0eUxlYXZlcz1uZXcgU2V0LGUuX2RpcnR5RWxlbWVudHM9bmV3IE1hcCxlLl9ub3JtYWxpemVkTm9kZXM9bmV3IFNldCxlLl91cGRhdGVUYWdzPW5ldyBTZXQpO3ZhciBFPWUuX2RlY29yYXRvcnMsVD1lLl9wZW5kaW5nRGVjb3JhdG9yc3x8RSxNPW4uX25vZGVNYXAsUjtmb3IoUiBpbiBUKU0uaGFzKFIpfHwoVD09PUUmJihUPWN3KGUpKSxkZWxldGUgVFtSXSk7dmFyIGo9bz9udWxsOkNyKGUuX3dpbmRvdyk7aWYoZS5fZWRpdGFibGUmJmohPT1udWxsJiYoYXx8cz09PW51bGx8fHMuZGlydHkpKXtUdD1lLGt0PW47dHJ5e2lmKGghPT1udWxsJiZoLmRpc2Nvbm5lY3QoKSxhfHxzPT09bnVsbHx8cy5kaXJ0eSl7bGV0IFRlPWUuX2Jsb2NrQ3Vyc29yRWxlbWVudDtUZSE9PW51bGwmJldoKFRlLGUscik7ZTp7bGV0IGZ0PWouYW5jaG9yTm9kZSxodD1qLmZvY3VzTm9kZSxfdD1qLmFuY2hvck9mZnNldCxnbj1qLmZvY3VzT2Zmc2V0LEl0PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoIShDLmhhcygiY29sbGFib3JhdGlvbiIpJiZJdCE9PXJ8fEl0IT09bnVsbCYmVWcoSXQpKSlpZihkZShzKSl7dmFyIEY9cy5hbmNob3IsYWU9cy5mb2N1cyxIPUYua2V5LFg9YWUua2V5LFA9d2MoZSxIKSxPPXdjKGUsWCksaz1GLm9mZnNldCxJPWFlLm9mZnNldCxMPXMuZm9ybWF0LFY9cy5zdHlsZSx0ZT1zLmlzQ29sbGFwc2VkKCkseWU9UCxmZT1PLE9lPSExO2lmKEYudHlwZT09PSJ0ZXh0Iil7eWU9eWMoUCk7bGV0IHd0PUYuZ2V0Tm9kZSgpO09lPXd0LmdldEZvcm1hdCgpIT09THx8d3QuZ2V0U3R5bGUoKSE9PVZ9ZWxzZSBkZShsKSYmbC5hbmNob3IudHlwZT09PSJ0ZXh0IiYmKE9lPSEwKTtpZihhZS50eXBlPT09InRleHQiJiYoZmU9eWMoTykpLHllIT09bnVsbCYmZmUhPT1udWxsKXtpZih0ZSYmKGw9PT1udWxsfHxPZXx8ZGUobCkmJihsLmZvcm1hdCE9PUx8fGwuc3R5bGUhPT1WKSkpe3ZhciBiZT1wZXJmb3JtYW5jZS5ub3coKTtrdz1bTCxWLGssSCxiZV19aWYoX3Q9PT1rJiZnbj09PUkmJmZ0PT09eWUmJmh0PT09ZmUmJihqLnR5cGUhPT0iUmFuZ2UifHwhdGUpJiYoSXQhPT1udWxsJiZyLmNvbnRhaW5zKEl0KXx8ci5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLEYudHlwZSE9PSJlbGVtZW50IikpYnJlYWsgZTt0cnl7ai5zZXRCYXNlQW5kRXh0ZW50KHllLGssZmUsSSl9Y2F0Y2h7fWlmKCFDLmhhcygic2tpcC1zY3JvbGwtaW50by12aWV3IikmJnMuaXNDb2xsYXBzZWQoKSYmciE9PW51bGwmJnI9PT1kb2N1bWVudC5hY3RpdmVFbGVtZW50KXtsZXQgd3Q9cyBpbnN0YW5jZW9mIFRpJiZzLmFuY2hvci50eXBlPT09ImVsZW1lbnQiP3llLmNoaWxkTm9kZXNba118fG51bGw6MDxqLnJhbmdlQ291bnQ/ai5nZXRSYW5nZUF0KDApOm51bGw7aWYod3QhPT1udWxsKXtsZXQgT3Q7aWYod3QgaW5zdGFuY2VvZiBUZXh0KXtsZXQgenQ9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTt6dC5zZWxlY3ROb2RlKHd0KSxPdD16dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1lbHNlIE90PXd0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2xldCBvcj1yLm93bmVyRG9jdW1lbnQsanQ9b3IuZGVmYXVsdFZpZXc7aWYoanQhPT1udWxsKWZvcih2YXJ7dG9wOlosYm90dG9tOmtlfT1PdCxjZSxfZSxtZT1yO21lIT09bnVsbDspe2xldCB6dD1tZT09PW9yLmJvZHk7aWYoenQpY2U9MCxfZT1mZChlKS5pbm5lckhlaWdodDtlbHNle2xldCBXbz1tZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjZT1Xby50b3AsX2U9V28uYm90dG9tfWxldCBpcj0wO2lmKFo8Y2U/aXI9LShjZS1aKTprZT5fZSYmKGlyPWtlLV9lKSxpciE9PTApaWYoenQpanQuc2Nyb2xsQnkoMCxpcik7ZWxzZXtsZXQgV289bWUuc2Nyb2xsVG9wO21lLnNjcm9sbFRvcCs9aXI7bGV0IFdhPW1lLnNjcm9sbFRvcC1XbztaLT1XYSxrZS09V2F9aWYoenQpYnJlYWs7bWU9ZGQobWUpfX19UWg9ITB9fWVsc2UgbCE9PW51bGwmJkFhKGUsZnQsaHQpJiZqLnJlbW92ZUFsbFJhbmdlcygpfX1lOntsZXQgVGU9ZS5fYmxvY2tDdXJzb3JFbGVtZW50O2lmKGRlKHMpJiZzLmlzQ29sbGFwc2VkKCkmJnMuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCImJnIuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpe2xldCBmdD1zLmFuY2hvcixodD1mdC5nZXROb2RlKCksX3Q9ZnQub2Zmc2V0LGduPWh0LmdldENoaWxkcmVuU2l6ZSgpLEl0PSExLHd0PW51bGw7aWYoX3Q9PT1nbil7bGV0IE90PWh0LmdldENoaWxkQXRJbmRleChfdC0xKTtnZihPdCkmJihJdD0hMCl9ZWxzZXtsZXQgT3Q9aHQuZ2V0Q2hpbGRBdEluZGV4KF90KTtpZihnZihPdCkpe2xldCBvcj1PdC5nZXRQcmV2aW91c1NpYmxpbmcoKTsob3I9PT1udWxsfHxnZihvcikpJiYoSXQ9ITAsd3Q9ZS5nZXRFbGVtZW50QnlLZXkoT3QuX19rZXkpKX19aWYoSXQpe2xldCBPdD1lLmdldEVsZW1lbnRCeUtleShodC5fX2tleSk7aWYoVGU9PT1udWxsKXtsZXQgb3I9ZS5fY29uZmlnLnRoZW1lLGp0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2p0LmNvbnRlbnRFZGl0YWJsZT0iZmFsc2UiLGp0LnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLWN1cnNvciIsInRydWUiKTtsZXQgenQ9b3IuYmxvY2tDdXJzb3I7aWYoenQhPT12b2lkIDApe2lmKHR5cGVvZiB6dD09InN0cmluZyIpe2xldCBpcj16dC5zcGxpdCgiICIpO3p0PW9yLmJsb2NrQ3Vyc29yPWlyfXp0IT09dm9pZCAwJiZqdC5jbGFzc0xpc3QuYWRkKC4uLnp0KX1lLl9ibG9ja0N1cnNvckVsZW1lbnQ9VGU9anR9ci5zdHlsZS5jYXJldENvbG9yPSJ0cmFuc3BhcmVudCIsd3Q9PT1udWxsP090LmFwcGVuZENoaWxkKFRlKTpPdC5pbnNlcnRCZWZvcmUoVGUsd3QpO2JyZWFrIGV9fVRlIT09bnVsbCYmV2goVGUsZSxyKX1oIT09bnVsbCYmaC5vYnNlcnZlKHIsJHkpfWZpbmFsbHl7VHQ9ZCxrdD11fX1pZihnIT09bnVsbCl7dmFyICRlPWc7bGV0IFRlPUFycmF5LmZyb20oZS5fbGlzdGVuZXJzLm11dGF0aW9uKSxmdD1UZS5sZW5ndGg7Zm9yKGxldCBodD0wO2h0PGZ0O2h0Kyspe2xldFtfdCxnbl09VGVbaHRdLEl0PSRlLmdldChnbik7SXQhPT12b2lkIDAmJl90KEl0LHtkaXJ0eUxlYXZlczp5LHByZXZFZGl0b3JTdGF0ZTppLHVwZGF0ZVRhZ3M6Q30pfX1kZShzKXx8cz09PW51bGx8fGwhPT1udWxsJiZsLmlzKHMpfHxlLmRpc3BhdGNoQ29tbWFuZChhZCx2b2lkIDApO3ZhciBCZT1lLl9wZW5kaW5nRGVjb3JhdG9ycztCZSE9PW51bGwmJihlLl9kZWNvcmF0b3JzPUJlLGUuX3BlbmRpbmdEZWNvcmF0b3JzPW51bGwsenMoImRlY29yYXRvciIsZSwhMCxCZSkpO3ZhciBQdD1jeSh0fHxpKSxzbj1jeShuKTtpZihQdCE9PXNuJiZ6cygidGV4dGNvbnRlbnQiLGUsITAsc24pLHpzKCJ1cGRhdGUiLGUsITAse2RpcnR5RWxlbWVudHM6XyxkaXJ0eUxlYXZlczp5LGVkaXRvclN0YXRlOm4sbm9ybWFsaXplZE5vZGVzOncscHJldkVkaXRvclN0YXRlOnR8fGksdGFnczpDfSksZS5fZGVmZXJyZWQ9W10sJC5sZW5ndGghPT0wKXtsZXQgVGU9ZS5fdXBkYXRpbmc7ZS5fdXBkYXRpbmc9ITA7dHJ5e2ZvcihsZXQgZnQ9MDtmdDwkLmxlbmd0aDtmdCsrKSRbZnRdKCl9ZmluYWxseXtlLl91cGRhdGluZz1UZX19dmFyIFJuPWUuX3VwZGF0ZXM7aWYoUm4ubGVuZ3RoIT09MCl7bGV0IFRlPVJuLnNoaWZ0KCk7aWYoVGUpe2xldFtmdCxodF09VGU7THcoZSxmdCxodCl9fX19ZnVuY3Rpb24genMoZSx0LG4sLi4ucil7bGV0IG89dC5fdXBkYXRpbmc7dC5fdXBkYXRpbmc9bjt0cnl7bGV0IGk9QXJyYXkuZnJvbSh0Ll9saXN0ZW5lcnNbZV0pO2ZvcihlPTA7ZTxpLmxlbmd0aDtlKyspaVtlXS5hcHBseShudWxsLHIpfWZpbmFsbHl7dC5fdXBkYXRpbmc9b319ZnVuY3Rpb24gWShlLHQsbil7aWYoZS5fdXBkYXRpbmc9PT0hMXx8VHQhPT1lKXtsZXQgaT0hMTtyZXR1cm4gZS51cGRhdGUoKCk9PntpPVkoZSx0LG4pfSksaX1sZXQgcj1IZyhlKTtmb3IobGV0IGk9NDswPD1pO2ktLSlmb3IobGV0IGw9MDtsPHIubGVuZ3RoO2wrKyl7dmFyIG89cltsXS5fY29tbWFuZHMuZ2V0KHQpO2lmKG8hPT12b2lkIDAmJihvPW9baV0sbyE9PXZvaWQgMCkpe289QXJyYXkuZnJvbShvKTtsZXQgcz1vLmxlbmd0aDtmb3IobGV0IGE9MDthPHM7YSsrKWlmKG9bYV0obixlKT09PSEwKXJldHVybiEwfX1yZXR1cm4hMX1mdW5jdGlvbiBOeShlLHQpe2xldCBuPWUuX3VwZGF0ZXM7Zm9yKHQ9dHx8ITE7bi5sZW5ndGghPT0wOyl7dmFyIHI9bi5zaGlmdCgpO2lmKHIpe2xldFtvLGldPXIsbDtpIT09dm9pZCAwJiYocj1pLm9uVXBkYXRlLGw9aS50YWcsaS5za2lwVHJhbnNmb3JtcyYmKHQ9ITApLHImJmUuX2RlZmVycmVkLnB1c2gociksbCYmZS5fdXBkYXRlVGFncy5hZGQobCkpLG8oKX19cmV0dXJuIHR9ZnVuY3Rpb24gTHcoZSx0LG4pe2xldCByPWUuX3VwZGF0ZVRhZ3M7dmFyIG8saT1vPSExO2lmKG4hPT12b2lkIDApe3ZhciBsPW4ub25VcGRhdGU7bz1uLnRhZyxvIT1udWxsJiZyLmFkZChvKSxvPW4uc2tpcFRyYW5zZm9ybXN8fCExLGk9bi5kaXNjcmV0ZXx8ITF9bCYmZS5fZGVmZXJyZWQucHVzaChsKSxuPWUuX2VkaXRvclN0YXRlLGw9ZS5fcGVuZGluZ0VkaXRvclN0YXRlO2xldCBzPSExOyhsPT09bnVsbHx8bC5fcmVhZE9ubHkpJiYobD1lLl9wZW5kaW5nRWRpdG9yU3RhdGU9bmV3IHlkKG5ldyBNYXAoKGx8fG4pLl9ub2RlTWFwKSkscz0hMCksbC5fZmx1c2hTeW5jPWksaT1rdDtsZXQgYT1wbix1PVR0LGM9ZS5fdXBkYXRpbmc7a3Q9bCxwbj0hMSxlLl91cGRhdGluZz0hMCxUdD1lO3RyeXtzJiYoZS5faGVhZGxlc3M/bi5fc2VsZWN0aW9uIT1udWxsJiYobC5fc2VsZWN0aW9uPW4uX3NlbGVjdGlvbi5jbG9uZSgpKTpsLl9zZWxlY3Rpb249RGIoZSkpO2xldCBkPWUuX2NvbXBvc2l0aW9uS2V5O3QoKSxvPU55KGUsbyksTGIobCxlKSxlLl9kaXJ0eVR5cGUhPT0wJiYobz9JYihsLGUpOmpiKGwsZSksTnkoZSkseGIobixsLGUuX2RpcnR5TGVhdmVzLGUuX2RpcnR5RWxlbWVudHMpKSxkIT09ZS5fY29tcG9zaXRpb25LZXkmJihsLl9mbHVzaFN5bmM9ITApO2xldCBmPWwuX3NlbGVjdGlvbjtpZihkZShmKSl7bGV0IGg9bC5fbm9kZU1hcCxnPWYuZm9jdXMua2V5O2guZ2V0KGYuYW5jaG9yLmtleSkhPT12b2lkIDAmJmguZ2V0KGcpIT09dm9pZCAwfHxVKDE5KX1lbHNlIEJsKGYpJiZmLl9ub2Rlcy5zaXplPT09MCYmKGwuX3NlbGVjdGlvbj1udWxsKX1jYXRjaChkKXtkIGluc3RhbmNlb2YgRXJyb3ImJmUuX29uRXJyb3IoZCksZS5fcGVuZGluZ0VkaXRvclN0YXRlPW4sZS5fZGlydHlUeXBlPTIsZS5fY2xvbmVOb3ROZWVkZWQuY2xlYXIoKSxlLl9kaXJ0eUxlYXZlcz1uZXcgU2V0LGUuX2RpcnR5RWxlbWVudHMuY2xlYXIoKSxsaShlKTtyZXR1cm59ZmluYWxseXtrdD1pLHBuPWEsVHQ9dSxlLl91cGRhdGluZz1jLHZhPTB9ZS5fZGlydHlUeXBlIT09MHx8emIobCxlKT9sLl9mbHVzaFN5bmM/KGwuX2ZsdXNoU3luYz0hMSxsaShlKSk6cyYmZ2IoKCk9PntsaShlKX0pOihsLl9mbHVzaFN5bmM9ITEscyYmKHIuY2xlYXIoKSxlLl9kZWZlcnJlZD1bXSxlLl9wZW5kaW5nRWRpdG9yU3RhdGU9bnVsbCkpfWZ1bmN0aW9uIGtuKGUsdCxuKXtlLl91cGRhdGluZz9lLl91cGRhdGVzLnB1c2goW3Qsbl0pOkx3KGUsdCxuKX1jbGFzcyBJdyBleHRlbmRzIExhe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWRlY29yYXRlKCl7VSg0Nyl9aXNJc29sYXRlZCgpe3JldHVybiExfWlzSW5saW5lKCl7cmV0dXJuITB9aXNLZXlib2FyZFNlbGVjdGFibGUoKXtyZXR1cm4hMH19ZnVuY3Rpb24gVmUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBJd31jbGFzcyBOaSBleHRlbmRzIExhe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuX19sYXN0PXRoaXMuX19maXJzdD1udWxsLHRoaXMuX19pbmRlbnQ9dGhpcy5fX2Zvcm1hdD10aGlzLl9fc2l6ZT0wLHRoaXMuX19kaXI9bnVsbH1nZXRGb3JtYXQoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2Zvcm1hdH1nZXRGb3JtYXRUeXBlKCl7bGV0IHQ9dGhpcy5nZXRGb3JtYXQoKTtyZXR1cm4gdWJbdF18fCIifWdldEluZGVudCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9faW5kZW50fWdldENoaWxkcmVuKCl7bGV0IHQ9W10sbj10aGlzLmdldEZpcnN0Q2hpbGQoKTtmb3IoO24hPT1udWxsOyl0LnB1c2gobiksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0Q2hpbGRyZW5LZXlzKCl7bGV0IHQ9W10sbj10aGlzLmdldEZpcnN0Q2hpbGQoKTtmb3IoO24hPT1udWxsOyl0LnB1c2gobi5fX2tleSksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0Q2hpbGRyZW5TaXplKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19zaXplfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5nZXRDaGlsZHJlblNpemUoKT09PTB9aXNEaXJ0eSgpe2xldCB0PWV0KCkuX2RpcnR5RWxlbWVudHM7cmV0dXJuIHQhPT1udWxsJiZ0Lmhhcyh0aGlzLl9fa2V5KX1pc0xhc3RDaGlsZCgpe2xldCB0PXRoaXMuZ2V0TGF0ZXN0KCksbj10aGlzLmdldFBhcmVudE9yVGhyb3coKS5nZXRMYXN0Q2hpbGQoKTtyZXR1cm4gbiE9PW51bGwmJm4uaXModCl9Z2V0QWxsVGV4dE5vZGVzKCl7bGV0IHQ9W10sbj10aGlzLmdldEZpcnN0Q2hpbGQoKTtmb3IoO24hPT1udWxsOyl7aWYoUShuKSYmdC5wdXNoKG4pLEIobikpe2xldCByPW4uZ2V0QWxsVGV4dE5vZGVzKCk7dC5wdXNoKC4uLnIpfW49bi5nZXROZXh0U2libGluZygpfXJldHVybiB0fWdldEZpcnN0RGVzY2VuZGFudCgpe2xldCB0PXRoaXMuZ2V0Rmlyc3RDaGlsZCgpO2Zvcig7dCE9PW51bGw7KXtpZihCKHQpKXtsZXQgbj10LmdldEZpcnN0Q2hpbGQoKTtpZihuIT09bnVsbCl7dD1uO2NvbnRpbnVlfX1icmVha31yZXR1cm4gdH1nZXRMYXN0RGVzY2VuZGFudCgpe2xldCB0PXRoaXMuZ2V0TGFzdENoaWxkKCk7Zm9yKDt0IT09bnVsbDspe2lmKEIodCkpe2xldCBuPXQuZ2V0TGFzdENoaWxkKCk7aWYobiE9PW51bGwpe3Q9bjtjb250aW51ZX19YnJlYWt9cmV0dXJuIHR9Z2V0RGVzY2VuZGFudEJ5SW5kZXgodCl7bGV0IG49dGhpcy5nZXRDaGlsZHJlbigpLHI9bi5sZW5ndGg7cmV0dXJuIHQ+PXI/KHQ9bltyLTFdLEIodCkmJnQuZ2V0TGFzdERlc2NlbmRhbnQoKXx8dHx8bnVsbCk6KHQ9blt0XSxCKHQpJiZ0LmdldEZpcnN0RGVzY2VuZGFudCgpfHx0fHxudWxsKX1nZXRGaXJzdENoaWxkKCl7bGV0IHQ9dGhpcy5nZXRMYXRlc3QoKS5fX2ZpcnN0O3JldHVybiB0PT09bnVsbD9udWxsOiR0KHQpfWdldEZpcnN0Q2hpbGRPclRocm93KCl7bGV0IHQ9dGhpcy5nZXRGaXJzdENoaWxkKCk7cmV0dXJuIHQ9PT1udWxsJiZVKDQ1LHRoaXMuX19rZXkpLHR9Z2V0TGFzdENoaWxkKCl7bGV0IHQ9dGhpcy5nZXRMYXRlc3QoKS5fX2xhc3Q7cmV0dXJuIHQ9PT1udWxsP251bGw6JHQodCl9Z2V0TGFzdENoaWxkT3JUaHJvdygpe2xldCB0PXRoaXMuZ2V0TGFzdENoaWxkKCk7cmV0dXJuIHQ9PT1udWxsJiZVKDk2LHRoaXMuX19rZXkpLHR9Z2V0Q2hpbGRBdEluZGV4KHQpe3ZhciBuPXRoaXMuZ2V0Q2hpbGRyZW5TaXplKCk7bGV0IHI7aWYodDxuLzIpe2ZvcihyPXRoaXMuZ2V0Rmlyc3RDaGlsZCgpLG49MDtyIT09bnVsbCYmbjw9dDspe2lmKG49PT10KXJldHVybiByO3I9ci5nZXROZXh0U2libGluZygpLG4rK31yZXR1cm4gbnVsbH1mb3Iocj10aGlzLmdldExhc3RDaGlsZCgpLC0tbjtyIT09bnVsbCYmbj49dDspe2lmKG49PT10KXJldHVybiByO3I9ci5nZXRQcmV2aW91c1NpYmxpbmcoKSxuLS19cmV0dXJuIG51bGx9Z2V0VGV4dENvbnRlbnQoKXtsZXQgdD0iIixuPXRoaXMuZ2V0Q2hpbGRyZW4oKSxyPW4ubGVuZ3RoO2ZvcihsZXQgbz0wO288cjtvKyspe2xldCBpPW5bb107dCs9aS5nZXRUZXh0Q29udGVudCgpLEIoaSkmJm8hPT1yLTEmJiFpLmlzSW5saW5lKCkmJih0Kz1gCgpgKX1yZXR1cm4gdH1nZXRUZXh0Q29udGVudFNpemUoKXtsZXQgdD0wLG49dGhpcy5nZXRDaGlsZHJlbigpLHI9bi5sZW5ndGg7Zm9yKGxldCBvPTA7bzxyO28rKyl7bGV0IGk9bltvXTt0Kz1pLmdldFRleHRDb250ZW50U2l6ZSgpLEIoaSkmJm8hPT1yLTEmJiFpLmlzSW5saW5lKCkmJih0Kz0yKX1yZXR1cm4gdH1nZXREaXJlY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2Rpcn1oYXNGb3JtYXQodCl7cmV0dXJuIHQhPT0iIj8odD1seVt0XSwodGhpcy5nZXRGb3JtYXQoKSZ0KSE9PTApOiExfXNlbGVjdCh0LG4pe1p0KCk7bGV0IHI9S2UoKSxvPXQsaT1uO3ZhciBsPXRoaXMuZ2V0Q2hpbGRyZW5TaXplKCk7aWYoIXRoaXMuY2FuQmVFbXB0eSgpKXtpZih0PT09MCYmbj09PTApe2lmKHQ9dGhpcy5nZXRGaXJzdENoaWxkKCksUSh0KXx8Qih0KSlyZXR1cm4gdC5zZWxlY3QoMCwwKX1lbHNlIGlmKCEodCE9PXZvaWQgMCYmdCE9PWx8fG4hPT12b2lkIDAmJm4hPT1sKSYmKHQ9dGhpcy5nZXRMYXN0Q2hpbGQoKSxRKHQpfHxCKHQpKSlyZXR1cm4gdC5zZWxlY3QoKX1pZihvPT09dm9pZCAwJiYobz1sKSxpPT09dm9pZCAwJiYoaT1sKSxsPXRoaXMuX19rZXksZGUocikpci5hbmNob3Iuc2V0KGwsbywiZWxlbWVudCIpLHIuZm9jdXMuc2V0KGwsaSwiZWxlbWVudCIpLHIuZGlydHk9ITA7ZWxzZSByZXR1cm4gQXcobCxvLGwsaSwiZWxlbWVudCIsImVsZW1lbnQiKTtyZXR1cm4gcn1zZWxlY3RTdGFydCgpe2xldCB0PXRoaXMuZ2V0Rmlyc3REZXNjZW5kYW50KCk7cmV0dXJuIEIodCl8fFEodCk/dC5zZWxlY3QoMCwwKTp0IT09bnVsbD90LnNlbGVjdFByZXZpb3VzKCk6dGhpcy5zZWxlY3QoMCwwKX1zZWxlY3RFbmQoKXtsZXQgdD10aGlzLmdldExhc3REZXNjZW5kYW50KCk7cmV0dXJuIEIodCl8fFEodCk/dC5zZWxlY3QoKTp0IT09bnVsbD90LnNlbGVjdE5leHQoKTp0aGlzLnNlbGVjdCgpfWNsZWFyKCl7bGV0IHQ9dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiB0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChuPT5uLnJlbW92ZSgpKSx0fWFwcGVuZCguLi50KXtyZXR1cm4gdGhpcy5zcGxpY2UodGhpcy5nZXRDaGlsZHJlblNpemUoKSwwLHQpfXNldERpcmVjdGlvbih0KXtsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX19kaXI9dCxufXNldEZvcm1hdCh0KXtyZXR1cm4gdGhpcy5nZXRXcml0YWJsZSgpLl9fZm9ybWF0PXQhPT0iIj9seVt0XTowLHRoaXN9c2V0SW5kZW50KHQpe3JldHVybiB0aGlzLmdldFdyaXRhYmxlKCkuX19pbmRlbnQ9dCx0aGlzfXNwbGljZSh0LG4scil7bGV0IG89ci5sZW5ndGgsaT10aGlzLmdldENoaWxkcmVuU2l6ZSgpLGw9dGhpcy5nZXRXcml0YWJsZSgpLHM9bC5fX2tleTt2YXIgYT1bXSx1PVtdO2xldCBjPXRoaXMuZ2V0Q2hpbGRBdEluZGV4KHQrbiksZD1udWxsLGY9aS1uK287aWYodCE9PTApaWYodD09PWkpZD10aGlzLmdldExhc3RDaGlsZCgpO2Vsc2V7dmFyIGg9dGhpcy5nZXRDaGlsZEF0SW5kZXgodCk7aCE9PW51bGwmJihkPWguZ2V0UHJldmlvdXNTaWJsaW5nKCkpfWlmKDA8bil7dmFyIGc9ZD09PW51bGw/dGhpcy5nZXRGaXJzdENoaWxkKCk6ZC5nZXROZXh0U2libGluZygpO2ZvcihoPTA7aDxuO2grKyl7Zz09PW51bGwmJlUoMTAwKTt2YXIgbT1nLmdldE5leHRTaWJsaW5nKCksUz1nLl9fa2V5O2c9Zy5nZXRXcml0YWJsZSgpLGlpKGcpLHUucHVzaChTKSxnPW19fWZvcihoPWQsbT0wO208bzttKyspe1M9clttXSxoIT09bnVsbCYmUy5pcyhoKSYmKGQ9aD1oLmdldFByZXZpb3VzU2libGluZygpKSxnPVMuZ2V0V3JpdGFibGUoKSxnLl9fcGFyZW50PT09cyYmZi0tLGlpKGcpO2xldCB2PVMuX19rZXk7aD09PW51bGw/KGwuX19maXJzdD12LGcuX19wcmV2PW51bGwpOihoPWguZ2V0V3JpdGFibGUoKSxoLl9fbmV4dD12LGcuX19wcmV2PWguX19rZXkpLFMuX19rZXk9PT1zJiZVKDc2KSxnLl9fcGFyZW50PXMsYS5wdXNoKHYpLGg9U31pZih0K249PT1pP2ghPT1udWxsJiYoaC5nZXRXcml0YWJsZSgpLl9fbmV4dD1udWxsLGwuX19sYXN0PWguX19rZXkpOmMhPT1udWxsJiYodD1jLmdldFdyaXRhYmxlKCksaCE9PW51bGw/KG49aC5nZXRXcml0YWJsZSgpLHQuX19wcmV2PWguX19rZXksbi5fX25leHQ9Yy5fX2tleSk6dC5fX3ByZXY9bnVsbCksbC5fX3NpemU9Zix1Lmxlbmd0aCYmKHQ9S2UoKSxkZSh0KSkpe3U9bmV3IFNldCh1KSxhPW5ldyBTZXQoYSk7bGV0e2FuY2hvcjp2LGZvY3VzOnl9PXQ7Ynkodix1LGEpJiZrYyh2LHYuZ2V0Tm9kZSgpLHRoaXMsZCxjKSxieSh5LHUsYSkmJmtjKHkseS5nZXROb2RlKCksdGhpcyxkLGMpLGYhPT0wfHx0aGlzLmNhbkJlRW1wdHkoKXx8Wm4odGhpcyl8fHRoaXMucmVtb3ZlKCl9cmV0dXJuIGx9ZXhwb3J0SlNPTigpe3JldHVybntjaGlsZHJlbjpbXSxkaXJlY3Rpb246dGhpcy5nZXREaXJlY3Rpb24oKSxmb3JtYXQ6dGhpcy5nZXRGb3JtYXRUeXBlKCksaW5kZW50OnRoaXMuZ2V0SW5kZW50KCksdHlwZToiZWxlbWVudCIsdmVyc2lvbjoxfX1pbnNlcnROZXdBZnRlcigpe3JldHVybiBudWxsfWNhbkluZGVudCgpe3JldHVybiEwfWNvbGxhcHNlQXRTdGFydCgpe3JldHVybiExfWV4Y2x1ZGVGcm9tQ29weSgpe3JldHVybiExfWNhbkV4dHJhY3RDb250ZW50cygpe3JldHVybiEwfWNhblJlcGxhY2VXaXRoKCl7cmV0dXJuITB9Y2FuSW5zZXJ0QWZ0ZXIoKXtyZXR1cm4hMH1jYW5CZUVtcHR5KCl7cmV0dXJuITB9Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiEwfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiEwfWlzSW5saW5lKCl7cmV0dXJuITF9aXNTaGFkb3dSb290KCl7cmV0dXJuITF9Y2FuTWVyZ2VXaXRoKCl7cmV0dXJuITF9ZXh0cmFjdFdpdGhDaGlsZCgpe3JldHVybiExfX1mdW5jdGlvbiBCKGUpe3JldHVybiBlIGluc3RhbmNlb2YgTml9ZnVuY3Rpb24gYnkoZSx0LG4pe2ZvcihlPWUuZ2V0Tm9kZSgpO2U7KXtsZXQgcj1lLl9fa2V5O2lmKHQuaGFzKHIpJiYhbi5oYXMocikpcmV0dXJuITA7ZT1lLmdldFBhcmVudCgpfXJldHVybiExfWNsYXNzIFZsIGV4dGVuZHMgTml7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4icm9vdCJ9c3RhdGljIGNsb25lKCl7cmV0dXJuIG5ldyBWbH1jb25zdHJ1Y3Rvcigpe3N1cGVyKCJyb290IiksdGhpcy5fX2NhY2hlZFRleHQ9bnVsbH1nZXRUb3BMZXZlbEVsZW1lbnRPclRocm93KCl7VSg1MSl9Z2V0VGV4dENvbnRlbnQoKXtsZXQgdD10aGlzLl9fY2FjaGVkVGV4dDtyZXR1cm4hVWwoKSYmZXQoKS5fZGlydHlUeXBlIT09MHx8dD09PW51bGw/c3VwZXIuZ2V0VGV4dENvbnRlbnQoKTp0fXJlbW92ZSgpe1UoNTIpfXJlcGxhY2UoKXtVKDUzKX1pbnNlcnRCZWZvcmUoKXtVKDU0KX1pbnNlcnRBZnRlcigpe1UoNTUpfXVwZGF0ZURPTSgpe3JldHVybiExfWFwcGVuZCguLi50KXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7bGV0IHI9dFtuXTtCKHIpfHxWZShyKXx8VSg1Nil9cmV0dXJuIHN1cGVyLmFwcGVuZCguLi50KX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgbj1TcigpO3JldHVybiBuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXRJbmRlbnQodC5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxufWV4cG9ydEpTT04oKXtyZXR1cm57Y2hpbGRyZW46W10sZGlyZWN0aW9uOnRoaXMuZ2V0RGlyZWN0aW9uKCksZm9ybWF0OnRoaXMuZ2V0Rm9ybWF0VHlwZSgpLGluZGVudDp0aGlzLmdldEluZGVudCgpLHR5cGU6InJvb3QiLHZlcnNpb246MX19Y29sbGFwc2VBdFN0YXJ0KCl7cmV0dXJuITB9fWZ1bmN0aW9uIGVuKGUpe3JldHVybiBlIGluc3RhbmNlb2YgVmx9ZnVuY3Rpb24gemIoZSx0KXtpZih0PXQuZ2V0RWRpdG9yU3RhdGUoKS5fc2VsZWN0aW9uLGU9ZS5fc2VsZWN0aW9uLGUhPT1udWxsKXtpZihlLmRpcnR5fHwhZS5pcyh0KSlyZXR1cm4hMH1lbHNlIGlmKHQhPT1udWxsKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIHFnKCl7cmV0dXJuIG5ldyB5ZChuZXcgTWFwKFtbInJvb3QiLG5ldyBWbF1dKSl9ZnVuY3Rpb24gancoZSl7bGV0IHQ9ZS5leHBvcnRKU09OKCk7dmFyIG49ZS5jb25zdHJ1Y3Rvcjt0LnR5cGUhPT1uLmdldFR5cGUoKSYmVSgxMzAsbi5uYW1lKTtsZXQgcj10LmNoaWxkcmVuO2lmKEIoZSkpZm9yKEFycmF5LmlzQXJyYXkocil8fFUoNTksbi5uYW1lKSxlPWUuZ2V0Q2hpbGRyZW4oKSxuPTA7bjxlLmxlbmd0aDtuKyspe2xldCBvPWp3KGVbbl0pO3IucHVzaChvKX1yZXR1cm4gdH1jbGFzcyB5ZHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuX25vZGVNYXA9dCx0aGlzLl9zZWxlY3Rpb249bnx8bnVsbCx0aGlzLl9yZWFkT25seT10aGlzLl9mbHVzaFN5bmM9ITF9aXNFbXB0eSgpe3JldHVybiB0aGlzLl9ub2RlTWFwLnNpemU9PT0xJiZ0aGlzLl9zZWxlY3Rpb249PT1udWxsfXJlYWQodCl7cmV0dXJuIFR5KHRoaXMsdCl9Y2xvbmUodCl7cmV0dXJuIHQ9bmV3IHlkKHRoaXMuX25vZGVNYXAsdD09PXZvaWQgMD90aGlzLl9zZWxlY3Rpb246dCksdC5fcmVhZE9ubHk9ITAsdH10b0pTT04oKXtyZXR1cm4gVHkodGhpcywoKT0+KHtyb290Omp3KFNyKCkpfSkpfX1jbGFzcyBIbCBleHRlbmRzIE5pe3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInBhcmFncmFwaCJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgSGwodC5fX2tleSl9Y3JlYXRlRE9NKHQpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKTtyZXR1cm4gdD1Mcyh0LnRoZW1lLCJwYXJhZ3JhcGgiKSx0IT09dm9pZCAwJiZuLmNsYXNzTGlzdC5hZGQoLi4udCksbn11cGRhdGVET00oKXtyZXR1cm4hMX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJue3A6KCk9Pih7Y29udmVyc2lvbjpGYixwcmlvcml0eTowfSl9fWV4cG9ydERPTSh0KXtpZih7ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCYmaGQodCkpe3RoaXMuaXNFbXB0eSgpJiZ0LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpKTt2YXIgbj10aGlzLmdldEZvcm1hdFR5cGUoKTt0LnN0eWxlLnRleHRBbGlnbj1uLChuPXRoaXMuZ2V0RGlyZWN0aW9uKCkpJiYodC5kaXI9biksbj10aGlzLmdldEluZGVudCgpLDA8biYmKHQuc3R5bGUudGV4dEluZGVudD1gJHsyMCpufXB4YCl9cmV0dXJue2VsZW1lbnQ6dH19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49cGkoKTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSx0eXBlOiJwYXJhZ3JhcGgiLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIodCxuKXt0PXBpKCk7bGV0IHI9dGhpcy5nZXREaXJlY3Rpb24oKTtyZXR1cm4gdC5zZXREaXJlY3Rpb24ociksdGhpcy5pbnNlcnRBZnRlcih0LG4pLHR9Y29sbGFwc2VBdFN0YXJ0KCl7bGV0IHQ9dGhpcy5nZXRDaGlsZHJlbigpO2lmKHQubGVuZ3RoPT09MHx8USh0WzBdKSYmdFswXS5nZXRUZXh0Q29udGVudCgpLnRyaW0oKT09PSIiKXtpZih0aGlzLmdldE5leHRTaWJsaW5nKCkhPT1udWxsKXJldHVybiB0aGlzLnNlbGVjdE5leHQoKSx0aGlzLnJlbW92ZSgpLCEwO2lmKHRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCkhPT1udWxsKXJldHVybiB0aGlzLnNlbGVjdFByZXZpb3VzKCksdGhpcy5yZW1vdmUoKSwhMH1yZXR1cm4hMX19ZnVuY3Rpb24gRmIoZSl7bGV0IHQ9cGkoKTtyZXR1cm4gZS5zdHlsZSYmKHQuc2V0Rm9ybWF0KGUuc3R5bGUudGV4dEFsaWduKSxlPXBhcnNlSW50KGUuc3R5bGUudGV4dEluZGVudCwxMCkvMjAsMDxlJiZ0LnNldEluZGVudChlKSkse25vZGU6dH19ZnVuY3Rpb24gcGkoKXtyZXR1cm4gRGEobmV3IEhsKX1mdW5jdGlvbiB6dyhlLHQsbixyKXtsZXQgbz1lLl9rZXlUb0RPTU1hcDtvLmNsZWFyKCksZS5fZWRpdG9yU3RhdGU9cWcoKSxlLl9wZW5kaW5nRWRpdG9yU3RhdGU9cixlLl9jb21wb3NpdGlvbktleT1udWxsLGUuX2RpcnR5VHlwZT0wLGUuX2Nsb25lTm90TmVlZGVkLmNsZWFyKCksZS5fZGlydHlMZWF2ZXM9bmV3IFNldCxlLl9kaXJ0eUVsZW1lbnRzLmNsZWFyKCksZS5fbm9ybWFsaXplZE5vZGVzPW5ldyBTZXQsZS5fdXBkYXRlVGFncz1uZXcgU2V0LGUuX3VwZGF0ZXM9W10sZS5fYmxvY2tDdXJzb3JFbGVtZW50PW51bGwscj1lLl9vYnNlcnZlcixyIT09bnVsbCYmKHIuZGlzY29ubmVjdCgpLGUuX29ic2VydmVyPW51bGwpLHQhPT1udWxsJiYodC50ZXh0Q29udGVudD0iIiksbiE9PW51bGwmJihuLnRleHRDb250ZW50PSIiLG8uc2V0KCJyb290IixuKSl9ZnVuY3Rpb24gQmIoZSl7bGV0IHQ9bmV3IE1hcCxuPW5ldyBTZXQ7cmV0dXJuIGUuZm9yRWFjaChyPT57aWYocj1yLmtsYXNzLmltcG9ydERPTSE9bnVsbD9yLmtsYXNzLmltcG9ydERPTS5iaW5kKHIua2xhc3MpOm51bGwsciE9bnVsbCYmIW4uaGFzKHIpKXtuLmFkZChyKTt2YXIgbz1yKCk7byE9PW51bGwmJk9iamVjdC5rZXlzKG8pLmZvckVhY2goaT0+e2xldCBsPXQuZ2V0KGkpO2w9PT12b2lkIDAmJihsPVtdLHQuc2V0KGksbCkpLGwucHVzaChvW2ldKX0pfX0pLHR9Y2xhc3MgV2J7Y29uc3RydWN0b3IodCxuLHIsbyxpLGwscyl7dGhpcy5fcGFyZW50RWRpdG9yPW4sdGhpcy5fcm9vdEVsZW1lbnQ9bnVsbCx0aGlzLl9lZGl0b3JTdGF0ZT10LHRoaXMuX2NvbXBvc2l0aW9uS2V5PXRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZT1udWxsLHRoaXMuX2RlZmVycmVkPVtdLHRoaXMuX2tleVRvRE9NTWFwPW5ldyBNYXAsdGhpcy5fdXBkYXRlcz1bXSx0aGlzLl91cGRhdGluZz0hMSx0aGlzLl9saXN0ZW5lcnM9e2RlY29yYXRvcjpuZXcgU2V0LGVkaXRhYmxlOm5ldyBTZXQsbXV0YXRpb246bmV3IE1hcCxyb290Om5ldyBTZXQsdGV4dGNvbnRlbnQ6bmV3IFNldCx1cGRhdGU6bmV3IFNldH0sdGhpcy5fY29tbWFuZHM9bmV3IE1hcCx0aGlzLl9jb25maWc9byx0aGlzLl9ub2Rlcz1yLHRoaXMuX2RlY29yYXRvcnM9e30sdGhpcy5fcGVuZGluZ0RlY29yYXRvcnM9bnVsbCx0aGlzLl9kaXJ0eVR5cGU9MCx0aGlzLl9jbG9uZU5vdE5lZWRlZD1uZXcgU2V0LHRoaXMuX2RpcnR5TGVhdmVzPW5ldyBTZXQsdGhpcy5fZGlydHlFbGVtZW50cz1uZXcgTWFwLHRoaXMuX25vcm1hbGl6ZWROb2Rlcz1uZXcgU2V0LHRoaXMuX3VwZGF0ZVRhZ3M9bmV3IFNldCx0aGlzLl9vYnNlcnZlcj1udWxsLHRoaXMuX2tleT1mdygpLHRoaXMuX29uRXJyb3I9aSx0aGlzLl9odG1sQ29udmVyc2lvbnM9bCx0aGlzLl9lZGl0YWJsZT1zLHRoaXMuX2hlYWRsZXNzPW4hPT1udWxsJiZuLl9oZWFkbGVzcyx0aGlzLl9ibG9ja0N1cnNvckVsZW1lbnQ9dGhpcy5fd2luZG93PW51bGx9aXNDb21wb3NpbmcoKXtyZXR1cm4gdGhpcy5fY29tcG9zaXRpb25LZXkhPW51bGx9cmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcih0KXtsZXQgbj10aGlzLl9saXN0ZW5lcnMudXBkYXRlO3JldHVybiBuLmFkZCh0KSwoKT0+e24uZGVsZXRlKHQpfX1yZWdpc3RlckVkaXRhYmxlTGlzdGVuZXIodCl7bGV0IG49dGhpcy5fbGlzdGVuZXJzLmVkaXRhYmxlO3JldHVybiBuLmFkZCh0KSwoKT0+e24uZGVsZXRlKHQpfX1yZWdpc3RlckRlY29yYXRvckxpc3RlbmVyKHQpe2xldCBuPXRoaXMuX2xpc3RlbmVycy5kZWNvcmF0b3I7cmV0dXJuIG4uYWRkKHQpLCgpPT57bi5kZWxldGUodCl9fXJlZ2lzdGVyVGV4dENvbnRlbnRMaXN0ZW5lcih0KXtsZXQgbj10aGlzLl9saXN0ZW5lcnMudGV4dGNvbnRlbnQ7cmV0dXJuIG4uYWRkKHQpLCgpPT57bi5kZWxldGUodCl9fXJlZ2lzdGVyUm9vdExpc3RlbmVyKHQpe2xldCBuPXRoaXMuX2xpc3RlbmVycy5yb290O3JldHVybiB0KHRoaXMuX3Jvb3RFbGVtZW50LG51bGwpLG4uYWRkKHQpLCgpPT57dChudWxsLHRoaXMuX3Jvb3RFbGVtZW50KSxuLmRlbGV0ZSh0KX19cmVnaXN0ZXJDb21tYW5kKHQsbixyKXtyPT09dm9pZCAwJiZVKDM1KTtsZXQgbz10aGlzLl9jb21tYW5kcztvLmhhcyh0KXx8by5zZXQodCxbbmV3IFNldCxuZXcgU2V0LG5ldyBTZXQsbmV3IFNldCxuZXcgU2V0XSk7bGV0IGk9by5nZXQodCk7aT09PXZvaWQgMCYmVSgzNixTdHJpbmcodCkpO2xldCBsPWlbcl07cmV0dXJuIGwuYWRkKG4pLCgpPT57bC5kZWxldGUobiksaS5ldmVyeShzPT5zLnNpemU9PT0wKSYmby5kZWxldGUodCl9fXJlZ2lzdGVyTXV0YXRpb25MaXN0ZW5lcih0LG4pe3RoaXMuX25vZGVzLmdldCh0LmdldFR5cGUoKSk9PT12b2lkIDAmJlUoMzcsdC5uYW1lKTtsZXQgcj10aGlzLl9saXN0ZW5lcnMubXV0YXRpb247cmV0dXJuIHIuc2V0KG4sdCksKCk9PntyLmRlbGV0ZShuKX19cmVnaXN0ZXJOb2RlVHJhbnNmb3JtVG9LbGFzcyh0LG4pe3ZhciByPXQuZ2V0VHlwZSgpO3JldHVybiByPXRoaXMuX25vZGVzLmdldChyKSxyPT09dm9pZCAwJiZVKDM3LHQubmFtZSksci50cmFuc2Zvcm1zLmFkZChuKSxyfXJlZ2lzdGVyTm9kZVRyYW5zZm9ybSh0LG4pe3ZhciByPXRoaXMucmVnaXN0ZXJOb2RlVHJhbnNmb3JtVG9LbGFzcyh0LG4pO2xldCBvPVtyXTtyZXR1cm4gcj1yLnJlcGxhY2VXaXRoS2xhc3MsciE9bnVsbCYmKHI9dGhpcy5yZWdpc3Rlck5vZGVUcmFuc2Zvcm1Ub0tsYXNzKHIsbiksby5wdXNoKHIpKSxtYih0aGlzLHQuZ2V0VHlwZSgpKSwoKT0+e28uZm9yRWFjaChpPT5pLnRyYW5zZm9ybXMuZGVsZXRlKG4pKX19aGFzTm9kZSh0KXtyZXR1cm4gdGhpcy5fbm9kZXMuaGFzKHQuZ2V0VHlwZSgpKX1oYXNOb2Rlcyh0KXtyZXR1cm4gdC5ldmVyeSh0aGlzLmhhc05vZGUuYmluZCh0aGlzKSl9ZGlzcGF0Y2hDb21tYW5kKHQsbil7cmV0dXJuIFkodGhpcyx0LG4pfWdldERlY29yYXRvcnMoKXtyZXR1cm4gdGhpcy5fZGVjb3JhdG9yc31nZXRSb290RWxlbWVudCgpe3JldHVybiB0aGlzLl9yb290RWxlbWVudH1nZXRLZXkoKXtyZXR1cm4gdGhpcy5fa2V5fXNldFJvb3RFbGVtZW50KHQpe2xldCBuPXRoaXMuX3Jvb3RFbGVtZW50O2lmKHQhPT1uKXtsZXQgbD1Mcyh0aGlzLl9jb25maWcudGhlbWUsInJvb3QiKTt2YXIgcj10aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGV8fHRoaXMuX2VkaXRvclN0YXRlO2lmKHRoaXMuX3Jvb3RFbGVtZW50PXQsencodGhpcyxuLHQsciksbiE9PW51bGwpe2lmKCF0aGlzLl9jb25maWcuZGlzYWJsZUV2ZW50cyl7SXMhPT0wJiYoSXMtLSxJcz09PTAmJm4ub3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLFJ3KSk7dmFyIG89bi5fX2xleGljYWxFZGl0b3I7aWYobyE9bnVsbCl7aWYoby5fcGFyZW50RWRpdG9yIT09bnVsbCl7dmFyIGk9SGcobyk7aT1pW2kubGVuZ3RoLTFdLl9rZXksaGwuZ2V0KGkpPT09byYmaGwuZGVsZXRlKGkpfWVsc2UgaGwuZGVsZXRlKG8uX2tleSk7bi5fX2xleGljYWxFZGl0b3I9bnVsbH1mb3Iobz1idyhuKSxpPTA7aTxvLmxlbmd0aDtpKyspb1tpXSgpO24uX19sZXhpY2FsRXZlbnRIYW5kbGVzPVtdfWwhPW51bGwmJm4uY2xhc3NMaXN0LnJlbW92ZSguLi5sKX10IT09bnVsbD8ocj0ocj10Lm93bmVyRG9jdW1lbnQpJiZyLmRlZmF1bHRWaWV3fHxudWxsLG89dC5zdHlsZSxvLnVzZXJTZWxlY3Q9InRleHQiLG8ud2hpdGVTcGFjZT0icHJlLXdyYXAiLG8ud29yZEJyZWFrPSJicmVhay13b3JkIix0LnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLWVkaXRvciIsInRydWUiKSx0aGlzLl93aW5kb3c9cix0aGlzLl9kaXJ0eVR5cGU9Mixvdyh0aGlzKSx0aGlzLl91cGRhdGVUYWdzLmFkZCgiaGlzdG9yeS1tZXJnZSIpLGxpKHRoaXMpLHRoaXMuX2NvbmZpZy5kaXNhYmxlRXZlbnRzfHxOYih0LHRoaXMpLGwhPW51bGwmJnQuY2xhc3NMaXN0LmFkZCguLi5sKSk6KHRoaXMuX2VkaXRvclN0YXRlPXIsdGhpcy5fd2luZG93PXRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZT1udWxsKSx6cygicm9vdCIsdGhpcywhMSx0LG4pfX1nZXRFbGVtZW50QnlLZXkodCl7cmV0dXJuIHRoaXMuX2tleVRvRE9NTWFwLmdldCh0KXx8bnVsbH1nZXRFZGl0b3JTdGF0ZSgpe3JldHVybiB0aGlzLl9lZGl0b3JTdGF0ZX1zZXRFZGl0b3JTdGF0ZSh0LG4pe3QuaXNFbXB0eSgpJiZVKDM4KSxydyh0aGlzKTtsZXQgcj10aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGUsbz10aGlzLl91cGRhdGVUYWdzO249biE9PXZvaWQgMD9uLnRhZzpudWxsLHI9PT1udWxsfHxyLmlzRW1wdHkoKXx8KG4hPW51bGwmJm8uYWRkKG4pLGxpKHRoaXMpKSx0aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGU9dCx0aGlzLl9kaXJ0eVR5cGU9Mix0aGlzLl9kaXJ0eUVsZW1lbnRzLnNldCgicm9vdCIsITEpLHRoaXMuX2NvbXBvc2l0aW9uS2V5PW51bGwsbiE9bnVsbCYmby5hZGQobiksbGkodGhpcyl9cGFyc2VFZGl0b3JTdGF0ZSh0LG4pe3Q9dHlwZW9mIHQ9PSJzdHJpbmciP0pTT04ucGFyc2UodCk6dDtsZXQgcj1xZygpLG89a3QsaT1wbixsPVR0LHM9dGhpcy5fZGlydHlFbGVtZW50cyxhPXRoaXMuX2RpcnR5TGVhdmVzLHU9dGhpcy5fY2xvbmVOb3ROZWVkZWQsYz10aGlzLl9kaXJ0eVR5cGU7dGhpcy5fZGlydHlFbGVtZW50cz1uZXcgTWFwLHRoaXMuX2RpcnR5TGVhdmVzPW5ldyBTZXQsdGhpcy5fY2xvbmVOb3ROZWVkZWQ9bmV3IFNldCx0aGlzLl9kaXJ0eVR5cGU9MCxrdD1yLHBuPSExLFR0PXRoaXM7dHJ5e1pnKHQucm9vdCx0aGlzLl9ub2RlcyksbiYmbigpLHIuX3JlYWRPbmx5PSEwfWNhdGNoKGQpe2QgaW5zdGFuY2VvZiBFcnJvciYmdGhpcy5fb25FcnJvcihkKX1maW5hbGx5e3RoaXMuX2RpcnR5RWxlbWVudHM9cyx0aGlzLl9kaXJ0eUxlYXZlcz1hLHRoaXMuX2Nsb25lTm90TmVlZGVkPXUsdGhpcy5fZGlydHlUeXBlPWMsa3Q9byxwbj1pLFR0PWx9cmV0dXJuIHJ9dXBkYXRlKHQsbil7a24odGhpcyx0LG4pfWZvY3VzKHQsbj17fSl7bGV0IHI9dGhpcy5fcm9vdEVsZW1lbnQ7ciE9PW51bGwmJihyLnNldEF0dHJpYnV0ZSgiYXV0b2NhcGl0YWxpemUiLCJvZmYiKSxrbih0aGlzLCgpPT57bGV0IG89S2UoKSxpPVNyKCk7byE9PW51bGw/by5kaXJ0eT0hMDppLmdldENoaWxkcmVuU2l6ZSgpIT09MCYmKG4uZGVmYXVsdFNlbGVjdGlvbj09PSJyb290U3RhcnQiP2kuc2VsZWN0U3RhcnQoKTppLnNlbGVjdEVuZCgpKX0se29uVXBkYXRlOigpPT57ci5yZW1vdmVBdHRyaWJ1dGUoImF1dG9jYXBpdGFsaXplIiksdCYmdCgpfSx0YWc6ImZvY3VzIn0pLHRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZT09PW51bGwmJnIucmVtb3ZlQXR0cmlidXRlKCJhdXRvY2FwaXRhbGl6ZSIpKX1ibHVyKCl7dmFyIHQ9dGhpcy5fcm9vdEVsZW1lbnQ7dCE9PW51bGwmJnQuYmx1cigpLHQ9Q3IodGhpcy5fd2luZG93KSx0IT09bnVsbCYmdC5yZW1vdmVBbGxSYW5nZXMoKX1pc0VkaXRhYmxlKCl7cmV0dXJuIHRoaXMuX2VkaXRhYmxlfXNldEVkaXRhYmxlKHQpe3RoaXMuX2VkaXRhYmxlIT09dCYmKHRoaXMuX2VkaXRhYmxlPXQsenMoImVkaXRhYmxlIix0aGlzLCEwLHQpKX10b0pTT04oKXtyZXR1cm57ZWRpdG9yU3RhdGU6dGhpcy5fZWRpdG9yU3RhdGUudG9KU09OKCl9fX1jbGFzcyBlbSBleHRlbmRzIE5pe2NvbnN0cnVjdG9yKHQsbil7c3VwZXIobiksdGhpcy5fX2NvbFNwYW49dCx0aGlzLl9fcm93U3Bhbj0xfWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLGNvbFNwYW46dGhpcy5fX2NvbFNwYW4scm93U3Bhbjp0aGlzLl9fcm93U3Bhbn19Z2V0Q29sU3Bhbigpe3JldHVybiB0aGlzLl9fY29sU3Bhbn1zZXRDb2xTcGFuKHQpe3JldHVybiB0aGlzLmdldFdyaXRhYmxlKCkuX19jb2xTcGFuPXQsdGhpc31nZXRSb3dTcGFuKCl7cmV0dXJuIHRoaXMuX19yb3dTcGFufXNldFJvd1NwYW4odCl7cmV0dXJuIHRoaXMuZ2V0V3JpdGFibGUoKS5fX3Jvd1NwYW49dCx0aGlzfX1mdW5jdGlvbiBNbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGVtfWNsYXNzIEZ3IGV4dGVuZHMgTml7fWZ1bmN0aW9uIHRtKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRnd9Y2xhc3MgQncgZXh0ZW5kcyBOaXt9ZnVuY3Rpb24geWEoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBCd31ELiRhZGRVcGRhdGVUYWc9ZnVuY3Rpb24oZSl7WnQoKSxldCgpLl91cGRhdGVUYWdzLmFkZChlKX07RC4kYXBwbHlOb2RlUmVwbGFjZW1lbnQ9RGE7RC4kY29weU5vZGU9Z3c7RC4kY3JlYXRlTGluZUJyZWFrTm9kZT1UbDtELiRjcmVhdGVOb2RlU2VsZWN0aW9uPW5wO0QuJGNyZWF0ZVBhcmFncmFwaE5vZGU9cGk7RC4kY3JlYXRlUmFuZ2VTZWxlY3Rpb249ZnVuY3Rpb24oKXtsZXQgZT1uZXcgeXIoInJvb3QiLDAsImVsZW1lbnQiKSx0PW5ldyB5cigicm9vdCIsMCwiZWxlbWVudCIpO3JldHVybiBuZXcgVGkoZSx0LDAsIiIpfTtELiRjcmVhdGVUYWJOb2RlPWdkO0QuJGNyZWF0ZVRleHROb2RlPUN0O0QuJGdldEFkamFjZW50Tm9kZT1CaDtELiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlPU1hO0QuJGdldE5lYXJlc3RSb290T3JTaGFkb3dSb290PXB3O0QuJGdldE5vZGVCeUtleT0kdDtELiRnZXRQcmV2aW91c1NlbGVjdGlvbj1XbDtELiRnZXRSb290PVNyO0QuJGdldFNlbGVjdGlvbj1LZTtELiRnZXRUZXh0Q29udGVudD1mdW5jdGlvbigpe2xldCBlPUtlKCk7cmV0dXJuIGU9PT1udWxsPyIiOmUuZ2V0VGV4dENvbnRlbnQoKX07RC4kaGFzQW5jZXN0b3I9U2M7RC4kaGFzVXBkYXRlVGFnPWZ1bmN0aW9uKGUpe3JldHVybiBldCgpLl91cGRhdGVUYWdzLmhhcyhlKX07RC4kaW5zZXJ0Tm9kZXM9ZnVuY3Rpb24oZSx0KXtsZXQgbj1LZSgpfHxXbCgpO3JldHVybiBuPT09bnVsbCYmKG49U3IoKS5zZWxlY3RFbmQoKSksbi5pbnNlcnROb2RlcyhlLHQpfTtELiRpc0Jsb2NrRWxlbWVudE5vZGU9dHA7RC4kaXNEZWNvcmF0b3JOb2RlPVZlO0QuJGlzRWxlbWVudE5vZGU9QjtELiRpc0lubGluZUVsZW1lbnRPckRlY29yYXRvck5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIEIoZSkmJmUuaXNJbmxpbmUoKXx8VmUoZSkmJmUuaXNJbmxpbmUoKX07RC4kaXNMZWFmTm9kZT1zdztELiRpc0xpbmVCcmVha05vZGU9bWE7RC4kaXNOb2RlU2VsZWN0aW9uPUJsO0QuJGlzUGFyYWdyYXBoTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEhsfTtELiRpc1JhbmdlU2VsZWN0aW9uPWRlO0QuJGlzUm9vdE5vZGU9ZW47RC4kaXNSb290T3JTaGFkb3dSb290PVpuO0QuJGlzVGFiTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEZsfTtELiRpc1RleHROb2RlPVE7RC4kbm9kZXNPZlR5cGU9ZnVuY3Rpb24oZSl7dmFyIHQ9RXIoKTtsZXQgbj10Ll9yZWFkT25seSxyPWUuZ2V0VHlwZSgpO3Q9dC5fbm9kZU1hcDtsZXQgbz1bXTtmb3IobGV0WyxpXW9mIHQpaSBpbnN0YW5jZW9mIGUmJmkuX190eXBlPT09ciYmKG58fGkuaXNBdHRhY2hlZCgpKSYmby5wdXNoKGkpO3JldHVybiBvfTtELiRub3JtYWxpemVTZWxlY3Rpb25fX0VYUEVSSU1FTlRBTD1XZztELiRwYXJzZVNlcmlhbGl6ZWROb2RlPWZ1bmN0aW9uKGUpe3JldHVybiBaZyhlLGV0KCkuX25vZGVzKX07RC4kc2VsZWN0QWxsPWZ1bmN0aW9uKCl7dmFyIGU9U3IoKTtlPWUuc2VsZWN0KDAsZS5nZXRDaGlsZHJlblNpemUoKSksdnIoV2coZSkpfTtELiRzZXRDb21wb3NpdGlvbktleT1NdDtELiRzZXRTZWxlY3Rpb249dnI7RC4kc3BsaXROb2RlPW13O0QuQkxVUl9DT01NQU5EPWV3O0QuQ0FOX1JFRE9fQ09NTUFORD17fTtELkNBTl9VTkRPX0NPTU1BTkQ9e307RC5DTEVBUl9FRElUT1JfQ09NTUFORD17fTtELkNMRUFSX0hJU1RPUllfQ09NTUFORD17fTtELkNMSUNLX0NPTU1BTkQ9TF87RC5DT01NQU5EX1BSSU9SSVRZX0NSSVRJQ0FMPTQ7RC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUj0wO0QuQ09NTUFORF9QUklPUklUWV9ISUdIPTM7RC5DT01NQU5EX1BSSU9SSVRZX0xPVz0xO0QuQ09NTUFORF9QUklPUklUWV9OT1JNQUw9MjtELkNPTlRST0xMRURfVEVYVF9JTlNFUlRJT05fQ09NTUFORD1mbDtELkNPUFlfQ09NTUFORD1JZztELkNVVF9DT01NQU5EPWpnO0QuREVMRVRFX0NIQVJBQ1RFUl9DT01NQU5EPWNhO0QuREVMRVRFX0xJTkVfQ09NTUFORD1mYTtELkRFTEVURV9XT1JEX0NPTU1BTkQ9ZGE7RC5ERVBSRUNBVEVEXyRjb21wdXRlR3JpZE1hcD1NdztELkRFUFJFQ0FURURfJGNyZWF0ZUdyaWRTZWxlY3Rpb249ZnVuY3Rpb24oKXtsZXQgZT1uZXcgeXIoInJvb3QiLDAsImVsZW1lbnQiKSx0PW5ldyB5cigicm9vdCIsMCwiZWxlbWVudCIpO3JldHVybiBuZXcgdmQoInJvb3QiLGUsdCl9O0QuREVQUkVDQVRFRF8kZ2V0R3JpZENlbGxOb2RlUmVjdD1lcDtELkRFUFJFQ0FURURfJGdldE5vZGVUcmlwbGV0PUR3O0QuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGU9TW47RC5ERVBSRUNBVEVEXyRpc0dyaWROb2RlPXRtO0QuREVQUkVDQVRFRF8kaXNHcmlkUm93Tm9kZT15YTtELkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbj1RZztELkRFUFJFQ0FURURfR3JpZENlbGxOb2RlPWVtO0QuREVQUkVDQVRFRF9HcmlkTm9kZT1GdztELkRFUFJFQ0FURURfR3JpZFJvd05vZGU9Qnc7RC5EUkFHRU5EX0NPTU1BTkQ9Wl87RC5EUkFHT1ZFUl9DT01NQU5EPUpfO0QuRFJBR1NUQVJUX0NPTU1BTkQ9UV87RC5EUk9QX0NPTU1BTkQ9WF87RC5EZWNvcmF0b3JOb2RlPUl3O0QuRWxlbWVudE5vZGU9Tmk7RC5GT0NVU19DT01NQU5EPXFfO0QuRk9STUFUX0VMRU1FTlRfQ09NTUFORD17fTtELkZPUk1BVF9URVhUX0NPTU1BTkQ9Z287RC5JTkRFTlRfQ09OVEVOVF9DT01NQU5EPXt9O0QuSU5TRVJUX0xJTkVfQlJFQUtfQ09NTUFORD1EcztELklOU0VSVF9QQVJBR1JBUEhfQ09NTUFORD1MaDtELklOU0VSVF9UQUJfQ09NTUFORD17fTtELktFWV9BUlJPV19ET1dOX0NPTU1BTkQ9VV87RC5LRVlfQVJST1dfTEVGVF9DT01NQU5EPUZfO0QuS0VZX0FSUk9XX1JJR0hUX0NPTU1BTkQ9al87RC5LRVlfQVJST1dfVVBfQ09NTUFORD1XXztELktFWV9CQUNLU1BBQ0VfQ09NTUFORD1IXztELktFWV9ERUxFVEVfQ09NTUFORD1HXztELktFWV9ET1dOX0NPTU1BTkQ9SV87RC5LRVlfRU5URVJfQ09NTUFORD1tYztELktFWV9FU0NBUEVfQ09NTUFORD1LXztELktFWV9NT0RJRklFUl9DT01NQU5EPXR3O0QuS0VZX1NQQUNFX0NPTU1BTkQ9Vl87RC5LRVlfVEFCX0NPTU1BTkQ9WV87RC5MaW5lQnJlYWtOb2RlPXpsO0QuTU9WRV9UT19FTkQ9el87RC5NT1ZFX1RPX1NUQVJUPUJfO0QuT1VUREVOVF9DT05URU5UX0NPTU1BTkQ9e307RC5QQVNURV9DT01NQU5EPU1nO0QuUGFyYWdyYXBoTm9kZT1IbDtELlJFRE9fQ09NTUFORD1MZztELlJFTU9WRV9URVhUX0NPTU1BTkQ9SWg7RC5Sb290Tm9kZT1WbDtELlNFTEVDVElPTl9DSEFOR0VfQ09NTUFORD1hZDtELlNFTEVDVF9BTExfQ09NTUFORD1qaDtELlRhYk5vZGU9Rmw7RC5UZXh0Tm9kZT1raTtELlVORE9fQ09NTUFORD1EZztELmNyZWF0ZUNvbW1hbmQ9ZnVuY3Rpb24oKXtyZXR1cm57fX07RC5jcmVhdGVFZGl0b3I9ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8e30sbj1UdCxyPXQudGhlbWV8fHt9O2xldCBvPWU9PT12b2lkIDA/bjp0LnBhcmVudEVkaXRvcnx8bnVsbCxpPXQuZGlzYWJsZUV2ZW50c3x8ITEsbD1xZygpLHM9dC5uYW1lc3BhY2V8fChvIT09bnVsbD9vLl9jb25maWcubmFtZXNwYWNlOmZ3KCkpLGE9dC5lZGl0b3JTdGF0ZSx1PVtWbCxraSx6bCxGbCxIbCwuLi50Lm5vZGVzfHxbXV0sYz10Lm9uRXJyb3I7aWYodD10LmVkaXRhYmxlIT09dm9pZCAwP3QuZWRpdGFibGU6ITAsZT09PXZvaWQgMCYmbiE9PW51bGwpZT1uLl9ub2RlcztlbHNlIGZvcihlPW5ldyBNYXAsbj0wO248dS5sZW5ndGg7bisrKXtsZXQgZj11W25dLGg9bnVsbDt2YXIgZD1udWxsO3R5cGVvZiBmIT0iZnVuY3Rpb24iJiYoZD1mLGY9ZC5yZXBsYWNlLGg9ZC53aXRoLGQ9ZC53aXRoS2xhc3M/ZC53aXRoS2xhc3M6bnVsbCk7bGV0IGc9Zi5nZXRUeXBlKCksbT1mLnRyYW5zZm9ybSgpLFM9bmV3IFNldDttIT09bnVsbCYmUy5hZGQobSksZS5zZXQoZyx7a2xhc3M6ZixyZXBsYWNlOmgscmVwbGFjZVdpdGhLbGFzczpkLHRyYW5zZm9ybXM6U30pfXJldHVybiByPW5ldyBXYihsLG8sZSx7ZGlzYWJsZUV2ZW50czppLG5hbWVzcGFjZTpzLHRoZW1lOnJ9LGN8fGNvbnNvbGUuZXJyb3IsQmIoZSksdCksYSE9PXZvaWQgMCYmKHIuX3BlbmRpbmdFZGl0b3JTdGF0ZT1hLHIuX2RpcnR5VHlwZT0yKSxyfTtELmdldE5lYXJlc3RFZGl0b3JGcm9tRE9NTm9kZT1WZztELmlzSFRNTEFuY2hvckVsZW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGhkKGUpJiZlLnRhZ05hbWU9PT0iQSJ9O0QuaXNIVE1MRWxlbWVudD1oZDtELmlzU2VsZWN0aW9uQ2FwdHVyZWRJbkRlY29yYXRvcklucHV0PVVnO0QuaXNTZWxlY3Rpb25XaXRoaW5FZGl0b3I9QWE7Y29uc3QgVWI9RDt2YXIgZ2U9VWIsZHQ9e30sUnQ9e30sbmU9Z2U7bGV0IFRjPW5ldyBNYXA7ZnVuY3Rpb24gUnkoZSl7Zm9yKDtlIT1udWxsOyl7aWYoZS5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXJldHVybiBlO2U9ZS5maXJzdENoaWxkfXJldHVybiBudWxsfWZ1bmN0aW9uIFB5KGUpe2xldCB0PWUucGFyZW50Tm9kZTtpZih0PT1udWxsKXRocm93IEVycm9yKCJTaG91bGQgbmV2ZXIgaGFwcGVuIik7cmV0dXJuW3QsQXJyYXkuZnJvbSh0LmNoaWxkTm9kZXMpLmluZGV4T2YoZSldfWZ1bmN0aW9uIFd3KGUpe2xldCB0PXt9O2U9ZS5zcGxpdCgiOyIpO2ZvcihsZXQgbiBvZiBlKWlmKG4hPT0iIil7bGV0W3Isb109bi5zcGxpdCgvOihbXl0rKS8pO3Rbci50cmltKCldPW8udHJpbSgpfXJldHVybiB0fWZ1bmN0aW9uIE5jKGUpe2xldCB0PVRjLmdldChlKTtyZXR1cm4gdD09PXZvaWQgMCYmKHQ9V3coZSksVGMuc2V0KGUsdCkpLHR9ZnVuY3Rpb24gVmIoZSl7bGV0IHQ9IiI7Zm9yKGxldCBuIGluIGUpbiYmKHQrPWAke259OiAke2Vbbl19O2ApO3JldHVybiB0fWZ1bmN0aW9uIEFpKGUsdCl7dmFyIG49TmMoImdldFN0eWxlImluIGU/ZS5nZXRTdHlsZSgpOmUuc3R5bGUpO3Q9T2JqZWN0LmVudHJpZXModCkucmVkdWNlKChyLFtvLGldKT0+KGk9PT1udWxsP2RlbGV0ZSByW29dOnJbb109aSxyKSx7Li4ubn0pLG49VmIodCksZS5zZXRTdHlsZShuKSxUYy5zZXQobix0KX1mdW5jdGlvbiBVdyhlLHQpe3ZhciBuPWUuZ2V0Tm9kZXMoKSxyPW4ubGVuZ3RoO2lmKG5lLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihlKSl7Zm9yKHZhciBvPW5lLiRjcmVhdGVSYW5nZVNlbGVjdGlvbigpLGk9by5hbmNob3IsbD1vLmZvY3VzLHM9MDtzPHI7cysrKXt2YXIgYT1uW3NdO25lLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGEpJiYoaS5zZXQoYS5nZXRLZXkoKSwwLCJlbGVtZW50IiksbC5zZXQoYS5nZXRLZXkoKSxhLmdldENoaWxkcmVuU2l6ZSgpLCJlbGVtZW50IiksVXcobmUuJG5vcm1hbGl6ZVNlbGVjdGlvbl9fRVhQRVJJTUVOVEFMKG8pLHQpKX1uZS4kc2V0U2VsZWN0aW9uKGUpfWVsc2UgaWYoLS1yLG89blswXSxpPW5bcl0sZS5pc0NvbGxhcHNlZCgpKUFpKGUsdCk7ZWxzZXt2YXIgdT1lLmFuY2hvcixjPWUuZm9jdXM7cz1vLmdldFRleHRDb250ZW50KCkubGVuZ3RoLGE9Yy5vZmZzZXQ7dmFyIGQ9dS5vZmZzZXQsZj11LmlzQmVmb3JlKGMpO2w9Zj9kOmEsZT1mP2E6ZDt2YXIgaD1mP3UudHlwZTpjLnR5cGUsZz1mP2MudHlwZTp1LnR5cGU7aWYodT1mP2Mua2V5OnUua2V5LG5lLiRpc1RleHROb2RlKG8pJiZsPT09cyYmKGM9by5nZXROZXh0U2libGluZygpLG5lLiRpc1RleHROb2RlKGMpJiYobD1kPTAsbz1jKSksbi5sZW5ndGg9PT0xKW5lLiRpc1RleHROb2RlKG8pJiYobD1oPT09ImVsZW1lbnQiPzA6ZD5hP2E6ZCxlPWc9PT0iZWxlbWVudCI/czpkPmE/ZDphLGwhPT1lJiYobD09PTAmJmU9PT1zPyhBaShvLHQpLG8uc2VsZWN0KGwsZSkpOihuPW8uc3BsaXRUZXh0KGwsZSksbj1sPT09MD9uWzBdOm5bMV0sQWkobix0KSxuLnNlbGVjdCgwLGUtbCkpKSk7ZWxzZSBmb3IobmUuJGlzVGV4dE5vZGUobykmJmw8by5nZXRUZXh0Q29udGVudFNpemUoKSYmKGwhPT0wJiYobz1vLnNwbGl0VGV4dChsKVsxXSksQWkobyx0KSksbmUuJGlzVGV4dE5vZGUoaSkmJihsPWkuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgsaS5fX2tleSE9PXUmJmUhPT0wJiYoZT1sKSxlIT09bCYmKFtpXT1pLnNwbGl0VGV4dChlKSksZSE9PTAmJkFpKGksdCkpLGU9MTtlPHI7ZSsrKWw9bltlXSxzPWwuZ2V0S2V5KCksbmUuJGlzVGV4dE5vZGUobCkmJnMhPT1vLmdldEtleSgpJiZzIT09aS5nZXRLZXkoKSYmIWwuaXNUb2tlbigpJiZBaShsLHQpfX1mdW5jdGlvbiBIYihlKXtmb3IoO2UhPT1udWxsJiYhbmUuJGlzUm9vdE9yU2hhZG93Um9vdChlKTspe2xldCB0PWUuZ2V0TGF0ZXN0KCksbj1lLmdldFBhcmVudCgpO3QuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZlLnJlbW92ZSghMCksZT1ufX1mdW5jdGlvbiBDZihlLHQsbixyLG89bnVsbCl7aWYodC5sZW5ndGghPT0wKXt2YXIgaT10WzBdLGw9bmV3IE1hcCxzPVtdO2k9bmUuJGlzRWxlbWVudE5vZGUoaSk/aTppLmdldFBhcmVudE9yVGhyb3coKSxpLmlzSW5saW5lKCkmJihpPWkuZ2V0UGFyZW50T3JUaHJvdygpKTtmb3IodmFyIGE9ITE7aSE9PW51bGw7KXt2YXIgdT1pLmdldFByZXZpb3VzU2libGluZygpO2lmKHUhPT1udWxsKXtpPXUsYT0hMDticmVha31pZihpPWkuZ2V0UGFyZW50T3JUaHJvdygpLG5lLiRpc1Jvb3RPclNoYWRvd1Jvb3QoaSkpYnJlYWt9dT1uZXcgU2V0O2Zvcih2YXIgYz0wO2M8bjtjKyspe3ZhciBkPXRbY107bmUuJGlzRWxlbWVudE5vZGUoZCkmJmQuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZ1LmFkZChkLmdldEtleSgpKX12YXIgZj1uZXcgU2V0O2ZvcihjPTA7YzxuO2MrKyl7ZD10W2NdO3ZhciBoPWQuZ2V0UGFyZW50KCk7aWYoaCE9PW51bGwmJmguaXNJbmxpbmUoKSYmKGg9aC5nZXRQYXJlbnQoKSksaCE9PW51bGwmJm5lLiRpc0xlYWZOb2RlKGQpJiYhZi5oYXMoZC5nZXRLZXkoKSkpe2lmKGQ9aC5nZXRLZXkoKSxsLmdldChkKT09PXZvaWQgMCl7bGV0IGc9cigpO2cuc2V0Rm9ybWF0KGguZ2V0Rm9ybWF0VHlwZSgpKSxnLnNldEluZGVudChoLmdldEluZGVudCgpKSxzLnB1c2goZyksbC5zZXQoZCxnKSxoLmdldENoaWxkcmVuKCkuZm9yRWFjaChtPT57Zy5hcHBlbmQobSksZi5hZGQobS5nZXRLZXkoKSksbmUuJGlzRWxlbWVudE5vZGUobSkmJm0uZ2V0Q2hpbGRyZW5LZXlzKCkuZm9yRWFjaChTPT5mLmFkZChTKSl9KSxIYihoKX19ZWxzZSB1LmhhcyhkLmdldEtleSgpKSYmKGg9cigpLGguc2V0Rm9ybWF0KGQuZ2V0Rm9ybWF0VHlwZSgpKSxoLnNldEluZGVudChkLmdldEluZGVudCgpKSxzLnB1c2goaCksZC5yZW1vdmUoITApKX1pZihvIT09bnVsbClmb3IodD0wO3Q8cy5sZW5ndGg7dCsrKW8uYXBwZW5kKHNbdF0pO2lmKHQ9bnVsbCxuZS4kaXNSb290T3JTaGFkb3dSb290KGkpKWlmKGEpaWYobyE9PW51bGwpaS5pbnNlcnRBZnRlcihvKTtlbHNlIGZvcihvPXMubGVuZ3RoLTE7MDw9bztvLS0paS5pbnNlcnRBZnRlcihzW29dKTtlbHNlIGlmKGE9aS5nZXRGaXJzdENoaWxkKCksbmUuJGlzRWxlbWVudE5vZGUoYSkmJihpPWEpLGE9PT1udWxsKWlmKG8paS5hcHBlbmQobyk7ZWxzZSBmb3Iobz0wO288cy5sZW5ndGg7bysrKWE9c1tvXSxpLmFwcGVuZChhKSx0PWE7ZWxzZSBpZihvIT09bnVsbClhLmluc2VydEJlZm9yZShvKTtlbHNlIGZvcihpPTA7aTxzLmxlbmd0aDtpKyspbz1zW2ldLGEuaW5zZXJ0QmVmb3JlKG8pLHQ9bztlbHNlIGlmKG8paS5pbnNlcnRBZnRlcihvKTtlbHNlIGZvcihvPXMubGVuZ3RoLTE7MDw9bztvLS0pYT1zW29dLGkuaW5zZXJ0QWZ0ZXIoYSksdD1hO3M9bmUuJGdldFByZXZpb3VzU2VsZWN0aW9uKCksbmUuJGlzUmFuZ2VTZWxlY3Rpb24ocykmJnMuYW5jaG9yLmdldE5vZGUoKS5pc0F0dGFjaGVkKCkmJnMuZm9jdXMuZ2V0Tm9kZSgpLmlzQXR0YWNoZWQoKT9uZS4kc2V0U2VsZWN0aW9uKHMuY2xvbmUoKSk6dCE9PW51bGw/dC5zZWxlY3RFbmQoKTplLmRpcnR5PSEwfX1mdW5jdGlvbiBWdyhlLHQsbixyKXtlLm1vZGlmeSh0PyJleHRlbmQiOiJtb3ZlIixuLHIpfWZ1bmN0aW9uIEh3KGUpe3JldHVybiBlPWUuYW5jaG9yLmdldE5vZGUoKSwobmUuJGlzUm9vdE5vZGUoZSk/ZTplLmdldFBhcmVudE9yVGhyb3coKSkuZ2V0RGlyZWN0aW9uKCk9PT0icnRsIn1SdC4kYWRkTm9kZVN0eWxlPWZ1bmN0aW9uKGUpe2U9ZS5nZXRTdHlsZSgpO2xldCB0PVd3KGUpO1RjLnNldChlLHQpfTtSdC4kY2xvbmVXaXRoUHJvcGVydGllcz1mdW5jdGlvbihlKXtsZXQgdD1lLmNvbnN0cnVjdG9yLmNsb25lKGUpO3JldHVybiB0Ll9fcGFyZW50PWUuX19wYXJlbnQsdC5fX25leHQ9ZS5fX25leHQsdC5fX3ByZXY9ZS5fX3ByZXYsbmUuJGlzRWxlbWVudE5vZGUoZSkmJm5lLiRpc0VsZW1lbnROb2RlKHQpPyh0Ll9fZmlyc3Q9ZS5fX2ZpcnN0LHQuX19sYXN0PWUuX19sYXN0LHQuX19zaXplPWUuX19zaXplLHQuX19mb3JtYXQ9ZS5fX2Zvcm1hdCx0Ll9faW5kZW50PWUuX19pbmRlbnQsdC5fX2Rpcj1lLl9fZGlyLHQpOihuZS4kaXNUZXh0Tm9kZShlKSYmbmUuJGlzVGV4dE5vZGUodCkmJih0Ll9fZm9ybWF0PWUuX19mb3JtYXQsdC5fX3N0eWxlPWUuX19zdHlsZSx0Ll9fbW9kZT1lLl9fbW9kZSx0Ll9fZGV0YWlsPWUuX19kZXRhaWwpLHQpfTtSdC4kZ2V0U2VsZWN0aW9uU3R5bGVWYWx1ZUZvclByb3BlcnR5PWZ1bmN0aW9uKGUsdCxuPSIiKXtsZXQgcj1udWxsLG89ZS5nZXROb2RlcygpO3ZhciBpPWUuYW5jaG9yLGw9ZS5mb2N1cyxzPWUuaXNCYWNrd2FyZCgpO2xldCBhPXM/bC5vZmZzZXQ6aS5vZmZzZXQ7aWYoaT1zP2wuZ2V0Tm9kZSgpOmkuZ2V0Tm9kZSgpLGUuc3R5bGUhPT0iIiYmKGU9TmMoZS5zdHlsZSksZSE9PW51bGwmJnQgaW4gZSkpcmV0dXJuIGVbdF07Zm9yKGU9MDtlPG8ubGVuZ3RoO2UrKyl7dmFyIHU9b1tlXTtpZigoZT09PTB8fGEhPT0wfHwhdS5pcyhpKSkmJm5lLiRpc1RleHROb2RlKHUpKXtpZihsPXQscz1uLHU9dS5nZXRTdHlsZSgpLHU9TmModSksbD11IT09bnVsbCYmdVtsXXx8cyxyPT09bnVsbClyPWw7ZWxzZSBpZihyIT09bCl7cj0iIjticmVha319fXJldHVybiByPT09bnVsbD9uOnJ9O1J0LiRpc0F0Tm9kZUVuZD1mdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09InRleHQiP2Uub2Zmc2V0PT09ZS5nZXROb2RlKCkuZ2V0VGV4dENvbnRlbnRTaXplKCk6ZS5vZmZzZXQ9PT1lLmdldE5vZGUoKS5nZXRDaGlsZHJlblNpemUoKX07UnQuJGlzUGFyZW50RWxlbWVudFJUTD1IdztSdC4kbW92ZUNhcmV0U2VsZWN0aW9uPVZ3O1J0LiRtb3ZlQ2hhcmFjdGVyPWZ1bmN0aW9uKGUsdCxuKXtsZXQgcj1IdyhlKTtWdyhlLHQsbj8hcjpyLCJjaGFyYWN0ZXIiKX07UnQuJHBhdGNoU3R5bGVUZXh0PVV3O1J0LiRzZWxlY3RBbGw9ZnVuY3Rpb24oZSl7bGV0IHQ9ZS5hbmNob3I7ZT1lLmZvY3VzO3ZhciBuPXQuZ2V0Tm9kZSgpLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5nZXRQYXJlbnRPclRocm93KCk7bGV0IHI9bi5nZXRGaXJzdERlc2NlbmRhbnQoKTtuPW4uZ2V0TGFzdERlc2NlbmRhbnQoKTtsZXQgbz0iZWxlbWVudCIsaT0iZWxlbWVudCIsbD0wO25lLiRpc1RleHROb2RlKHIpP289InRleHQiOm5lLiRpc0VsZW1lbnROb2RlKHIpfHxyPT09bnVsbHx8KHI9ci5nZXRQYXJlbnRPclRocm93KCkpLG5lLiRpc1RleHROb2RlKG4pPyhpPSJ0ZXh0IixsPW4uZ2V0VGV4dENvbnRlbnRTaXplKCkpOm5lLiRpc0VsZW1lbnROb2RlKG4pfHxuPT09bnVsbHx8KG49bi5nZXRQYXJlbnRPclRocm93KCkpLHImJm4mJih0LnNldChyLmdldEtleSgpLDAsbyksZS5zZXQobi5nZXRLZXkoKSxsLGkpKX07UnQuJHNldEJsb2Nrc1R5cGU9ZnVuY3Rpb24oZSx0KXtpZihlLmFuY2hvci5rZXk9PT0icm9vdCIpe3Q9dCgpO3ZhciBuPW5lLiRnZXRSb290KCk7KGU9bi5nZXRGaXJzdENoaWxkKCkpP2UucmVwbGFjZSh0LCEwKTpuLmFwcGVuZCh0KX1lbHNlIGZvcihuPWUuZ2V0Tm9kZXMoKSxlPWUuYW5jaG9yLmdldE5vZGUoKS5nZXRQYXJlbnRPclRocm93KCksbi5pbmRleE9mKGUpPT09LTEmJm4ucHVzaChlKSxlLmlzSW5saW5lKCkmJihlPWUuZ2V0UGFyZW50T3JUaHJvdygpLG4uaW5kZXhPZihlKT09PS0xJiZuLnB1c2goZSkpLGU9MDtlPG4ubGVuZ3RoO2UrKyl7bGV0IGk9bltlXTt2YXIgcj1pO2lmKCFuZS4kaXNFbGVtZW50Tm9kZShyKXx8bmUuJGlzUm9vdE9yU2hhZG93Um9vdChyKSlyPSExO2Vsc2V7dmFyIG89ci5nZXRGaXJzdENoaWxkKCk7bz1vPT09bnVsbHx8bmUuJGlzTGluZUJyZWFrTm9kZShvKXx8bmUuJGlzVGV4dE5vZGUobyl8fG8uaXNJbmxpbmUoKSxyPSFyLmlzSW5saW5lKCkmJnIuY2FuQmVFbXB0eSgpIT09ITEmJm99ciYmKHI9dCgpLHIuc2V0Rm9ybWF0KGkuZ2V0Rm9ybWF0VHlwZSgpKSxyLnNldEluZGVudChpLmdldEluZGVudCgpKSxpLnJlcGxhY2UociwhMCkpfX07UnQuJHNob3VsZE92ZXJyaWRlRGVmYXVsdENoYXJhY3RlclNlbGVjdGlvbj1mdW5jdGlvbihlLHQpe3JldHVybiBlPW5lLiRnZXRBZGphY2VudE5vZGUoZS5mb2N1cyx0KSxuZS4kaXNEZWNvcmF0b3JOb2RlKGUpJiYhZS5pc0lzb2xhdGVkKCl8fG5lLiRpc0VsZW1lbnROb2RlKGUpJiYhZS5pc0lubGluZSgpJiYhZS5jYW5CZUVtcHR5KCl9O1J0LiRzbGljZVNlbGVjdGVkVGV4dE5vZGVDb250ZW50PWZ1bmN0aW9uKGUsdCl7aWYodC5pc1NlbGVjdGVkKCkmJiF0LmlzU2VnbWVudGVkKCkmJiF0LmlzVG9rZW4oKSYmKG5lLiRpc1JhbmdlU2VsZWN0aW9uKGUpfHxuZS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24oZSkpKXt2YXIgbj1lLmFuY2hvci5nZXROb2RlKCkscj1lLmZvY3VzLmdldE5vZGUoKSxvPXQuaXMobiksaT10LmlzKHIpO2lmKG98fGkpe289ZS5pc0JhY2t3YXJkKCk7bGV0W2wsc109ZS5nZXRDaGFyYWN0ZXJPZmZzZXRzKCk7ZT1uLmlzKHIpLGk9dC5pcyhvP3I6bikscj10LmlzKG8/bjpyKSxuPTA7bGV0IGE7ZT8obj1sPnM/czpsLGE9bD5zP2w6cyk6aT8obj1vP3M6bCxhPXZvaWQgMCk6ciYmKG89bz9sOnMsbj0wLGE9byksdC5fX3RleHQ9dC5fX3RleHQuc2xpY2UobixhKX19cmV0dXJuIHR9O1J0LiR3cmFwTm9kZXM9ZnVuY3Rpb24oZSx0LG49bnVsbCl7dmFyIHI9ZS5nZXROb2RlcygpO2xldCBvPXIubGVuZ3RoO3ZhciBpPWUuYW5jaG9yO2lmKG89PT0wfHxvPT09MSYmaS50eXBlPT09ImVsZW1lbnQiJiZpLmdldE5vZGUoKS5nZXRDaGlsZHJlblNpemUoKT09PTApe2U9aS50eXBlPT09InRleHQiP2kuZ2V0Tm9kZSgpLmdldFBhcmVudE9yVGhyb3coKTppLmdldE5vZGUoKSxyPWUuZ2V0Q2hpbGRyZW4oKTtsZXQgcz10KCk7cy5zZXRGb3JtYXQoZS5nZXRGb3JtYXRUeXBlKCkpLHMuc2V0SW5kZW50KGUuZ2V0SW5kZW50KCkpLHIuZm9yRWFjaChhPT5zLmFwcGVuZChhKSksbiYmKHM9bi5hcHBlbmQocykpLGUucmVwbGFjZShzKX1lbHNle2k9bnVsbDt2YXIgbD1bXTtmb3IobGV0IHM9MDtzPG87cysrKXtsZXQgYT1yW3NdO25lLiRpc1Jvb3RPclNoYWRvd1Jvb3QoYSk/KENmKGUsbCxsLmxlbmd0aCx0LG4pLGw9W10saT1hKTppPT09bnVsbHx8aSE9PW51bGwmJm5lLiRoYXNBbmNlc3RvcihhLGkpP2wucHVzaChhKTooQ2YoZSxsLGwubGVuZ3RoLHQsbiksbD1bYV0pfUNmKGUsbCxsLmxlbmd0aCx0LG4pfX07UnQuY3JlYXRlRE9NUmFuZ2U9ZnVuY3Rpb24oZSx0LG4scixvKXtsZXQgaT10LmdldEtleSgpLGw9ci5nZXRLZXkoKSxzPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCksYT1lLmdldEVsZW1lbnRCeUtleShpKTtpZihlPWUuZ2V0RWxlbWVudEJ5S2V5KGwpLG5lLiRpc1RleHROb2RlKHQpJiYoYT1SeShhKSksbmUuJGlzVGV4dE5vZGUocikmJihlPVJ5KGUpKSx0PT09dm9pZCAwfHxyPT09dm9pZCAwfHxhPT09bnVsbHx8ZT09PW51bGwpcmV0dXJuIG51bGw7YS5ub2RlTmFtZT09PSJCUiImJihbYSxuXT1QeShhKSksZS5ub2RlTmFtZT09PSJCUiImJihbZSxvXT1QeShlKSksdD1hLmZpcnN0Q2hpbGQsYT09PWUmJnQhPW51bGwmJnQubm9kZU5hbWU9PT0iQlIiJiZuPT09MCYmbz09PTAmJihvPTEpO3RyeXtzLnNldFN0YXJ0KGEsbikscy5zZXRFbmQoZSxvKX1jYXRjaHtyZXR1cm4gbnVsbH1yZXR1cm4hcy5jb2xsYXBzZWR8fG49PT1vJiZpPT09bHx8KHMuc2V0U3RhcnQoZSxvKSxzLnNldEVuZChhLG4pKSxzfTtSdC5jcmVhdGVSZWN0c0Zyb21ET01SYW5nZT1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZ2V0Um9vdEVsZW1lbnQoKTtpZihuPT09bnVsbClyZXR1cm5bXTtlPW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1nZXRDb21wdXRlZFN0eWxlKG4pLG49cGFyc2VGbG9hdChuLnBhZGRpbmdMZWZ0KStwYXJzZUZsb2F0KG4ucGFkZGluZ1JpZ2h0KSx0PUFycmF5LmZyb20odC5nZXRDbGllbnRSZWN0cygpKTtsZXQgcj10Lmxlbmd0aDt0LnNvcnQoKGksbCk9PntsZXQgcz1pLnRvcC1sLnRvcDtyZXR1cm4gMz49TWF0aC5hYnMocyk/aS5sZWZ0LWwubGVmdDpzfSk7bGV0IG87Zm9yKGxldCBpPTA7aTxyO2krKyl7bGV0IGw9dFtpXSxzPWwud2lkdGgrbj09PWUud2lkdGg7byYmby50b3A8PWwudG9wJiZvLnRvcCtvLmhlaWdodD5sLnRvcCYmby5sZWZ0K28ud2lkdGg+bC5sZWZ0fHxzPyh0LnNwbGljZShpLS0sMSksci0tKTpvPWx9cmV0dXJuIHR9O1J0LmdldFN0eWxlT2JqZWN0RnJvbUNTUz1OYztSdC50cmltVGV4dENvbnRlbnRGcm9tQW5jaG9yPWZ1bmN0aW9uKGUsdCxuKXtsZXQgcj10LmdldE5vZGUoKTtpZihuZS4kaXNFbGVtZW50Tm9kZShyKSl7dmFyIG89ci5nZXREZXNjZW5kYW50QnlJbmRleCh0Lm9mZnNldCk7byE9PW51bGwmJihyPW8pfWZvcig7MDxuJiZyIT09bnVsbDspe3ZhciBpPXIuZ2V0UHJldmlvdXNTaWJsaW5nKCksbD0wO2lmKGk9PT1udWxsKXtvPXIuZ2V0UGFyZW50T3JUaHJvdygpO2Zvcih2YXIgcz1vLmdldFByZXZpb3VzU2libGluZygpO3M9PT1udWxsOyl7aWYobz1vLmdldFBhcmVudCgpLG89PT1udWxsKXtpPW51bGw7YnJlYWt9cz1vLmdldFByZXZpb3VzU2libGluZygpfW8hPT1udWxsJiYobD1vLmlzSW5saW5lKCk/MDoyLGk9bmUuJGlzRWxlbWVudE5vZGUocyk/cy5nZXRMYXN0RGVzY2VuZGFudCgpOnMpfWlmKHM9ci5nZXRUZXh0Q29udGVudCgpLHM9PT0iIiYmbmUuJGlzRWxlbWVudE5vZGUocikmJiFyLmlzSW5saW5lKCkmJihzPWAKCmApLG89cy5sZW5ndGgsIW5lLiRpc1RleHROb2RlKHIpfHxuPj1vKXM9ci5nZXRQYXJlbnQoKSxyLnJlbW92ZSgpLHM9PW51bGx8fHMuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wfHxuZS4kaXNSb290Tm9kZShzKXx8cy5yZW1vdmUoKSxuLT1vK2wscj1pO2Vsc2V7bGV0IGE9ci5nZXRLZXkoKTtsPWUuZ2V0RWRpdG9yU3RhdGUoKS5yZWFkKCgpPT57Y29uc3QgYz1uZS4kZ2V0Tm9kZUJ5S2V5KGEpO3JldHVybiBuZS4kaXNUZXh0Tm9kZShjKSYmYy5pc1NpbXBsZVRleHQoKT9jLmdldFRleHRDb250ZW50KCk6bnVsbH0pLGk9by1uO2xldCB1PXMuc2xpY2UoMCxpKTtsIT09bnVsbCYmbCE9PXM/KG49bmUuJGdldFByZXZpb3VzU2VsZWN0aW9uKCksbz1yLHIuaXNTaW1wbGVUZXh0KCk/ci5zZXRUZXh0Q29udGVudChsKToobz1uZS4kY3JlYXRlVGV4dE5vZGUobCksci5yZXBsYWNlKG8pKSxuZS4kaXNSYW5nZVNlbGVjdGlvbihuKSYmbi5pc0NvbGxhcHNlZCgpJiYobj1uLmFuY2hvci5vZmZzZXQsby5zZWxlY3QobixuKSkpOnIuaXNTaW1wbGVUZXh0KCk/KGw9dC5rZXk9PT1hLHM9dC5vZmZzZXQsczxuJiYocz1vKSxuPWw/cy1uOjAsbz1sP3M6aSxsJiZuPT09MD8oW25dPXIuc3BsaXRUZXh0KG4sbyksbi5yZW1vdmUoKSk6KFssbl09ci5zcGxpdFRleHQobixvKSxuLnJlbW92ZSgpKSk6KG49bmUuJGNyZWF0ZVRleHROb2RlKHUpLHIucmVwbGFjZShuKSksbj0wfX19O2NvbnN0IEtiPVJ0O3ZhciBPbz1LYixHYj1PbyxhdD1nZTtmdW5jdGlvbiBZYihlKXtsZXQgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3QuYXBwZW5kKCJjb2RlIixlKTtmb3IobGV0IG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQuYXBwZW5kKCJ2Iixhcmd1bWVudHNbbl0pO3Rocm93IEVycm9yKGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke2V9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHt0fSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuYCl9ZnVuY3Rpb24gS3coZSx0KXtmb3IobGV0IG4gb2YgdClpZihlLnR5cGUuc3RhcnRzV2l0aChuKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBHdyhlLHQpe2Zvcig7ZSE9PWF0LiRnZXRSb290KCkmJmUhPW51bGw7KXtpZih0KGUpKXJldHVybiBlO2U9ZS5nZXRQYXJlbnQoKX1yZXR1cm4gbnVsbH1kdC4kc3BsaXROb2RlPWF0LiRzcGxpdE5vZGU7ZHQuaXNIVE1MQW5jaG9yRWxlbWVudD1hdC5pc0hUTUxBbmNob3JFbGVtZW50O2R0LmlzSFRNTEVsZW1lbnQ9YXQuaXNIVE1MRWxlbWVudDtkdC4kZGZzPWZ1bmN0aW9uKGUsdCl7bGV0IG49W107ZT0oZXx8YXQuJGdldFJvb3QoKSkuZ2V0TGF0ZXN0KCksdD10fHwoYXQuJGlzRWxlbWVudE5vZGUoZSk/ZS5nZXRMYXN0RGVzY2VuZGFudCgpOmUpO2Zvcih2YXIgcj1lLG89MDsocj1yLmdldFBhcmVudCgpKSE9PW51bGw7KW8rKztmb3Iocj1vO2UhPT1udWxsJiYhZS5pcyh0KTspaWYobi5wdXNoKHtkZXB0aDpyLG5vZGU6ZX0pLGF0LiRpc0VsZW1lbnROb2RlKGUpJiYwPGUuZ2V0Q2hpbGRyZW5TaXplKCkpZT1lLmdldEZpcnN0Q2hpbGQoKSxyKys7ZWxzZSBmb3Iobz1udWxsO289PT1udWxsJiZlIT09bnVsbDspbz1lLmdldE5leHRTaWJsaW5nKCksbz09PW51bGw/KGU9ZS5nZXRQYXJlbnQoKSxyLS0pOmU9bztyZXR1cm4gZSE9PW51bGwmJmUuaXModCkmJm4ucHVzaCh7ZGVwdGg6cixub2RlOmV9KSxufTtkdC4kZmlsdGVyPWZ1bmN0aW9uKGUsdCl7bGV0IG49W107Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspe2xldCBvPXQoZVtyXSk7byE9PW51bGwmJm4ucHVzaChvKX1yZXR1cm4gbn07ZHQuJGZpbmRNYXRjaGluZ1BhcmVudD1HdztkdC4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdz1mdW5jdGlvbihlKXtsZXQgdD1HdyhlLG49PmF0LiRpc0VsZW1lbnROb2RlKG4pJiYhbi5pc0lubGluZSgpKTtyZXR1cm4gYXQuJGlzRWxlbWVudE5vZGUodCl8fFliKDQsZS5fX2tleSksdH07ZHQuJGdldE5lYXJlc3ROb2RlT2ZUeXBlPWZ1bmN0aW9uKGUsdCl7Zm9yKDtlIT1udWxsOyl7aWYoZSBpbnN0YW5jZW9mIHQpcmV0dXJuIGU7ZT1lLmdldFBhcmVudCgpfXJldHVybiBudWxsfTtkdC4kaW5zZXJ0Rmlyc3Q9ZnVuY3Rpb24oZSx0KXtsZXQgbj1lLmdldEZpcnN0Q2hpbGQoKTtuIT09bnVsbD9uLmluc2VydEJlZm9yZSh0KTplLmFwcGVuZCh0KX07ZHQuJGluc2VydE5vZGVUb05lYXJlc3RSb290PWZ1bmN0aW9uKGUpe3ZhciB0PWF0LiRnZXRTZWxlY3Rpb24oKXx8YXQuJGdldFByZXZpb3VzU2VsZWN0aW9uKCk7aWYoYXQuJGlzUmFuZ2VTZWxlY3Rpb24odCkpe3Zhcntmb2N1czpufT10O2lmKHQ9bi5nZXROb2RlKCksbj1uLm9mZnNldCxhdC4kaXNSb290T3JTaGFkb3dSb290KHQpKW49dC5nZXRDaGlsZEF0SW5kZXgobiksbj09bnVsbD90LmFwcGVuZChlKTpuLmluc2VydEJlZm9yZShlKSxlLnNlbGVjdE5leHQoKTtlbHNle2xldCByLG87YXQuJGlzVGV4dE5vZGUodCk/KHI9dC5nZXRQYXJlbnRPclRocm93KCksbz10LmdldEluZGV4V2l0aGluUGFyZW50KCksMDxuJiYobys9MSx0LnNwbGl0VGV4dChuKSkpOihyPXQsbz1uKSxbLHRdPWF0LiRzcGxpdE5vZGUocixvKSx0Lmluc2VydEJlZm9yZShlKSx0LnNlbGVjdFN0YXJ0KCl9fWVsc2UgYXQuJGlzTm9kZVNlbGVjdGlvbih0KXx8YXQuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKHQpPyh0PXQuZ2V0Tm9kZXMoKSx0W3QubGVuZ3RoLTFdLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5pbnNlcnRBZnRlcihlKSk6YXQuJGdldFJvb3QoKS5hcHBlbmQoZSksdD1hdC4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLGUuaW5zZXJ0QWZ0ZXIodCksdC5zZWxlY3QoKTtyZXR1cm4gZS5nZXRMYXRlc3QoKX07ZHQuJHJlc3RvcmVFZGl0b3JTdGF0ZT1mdW5jdGlvbihlLHQpe2xldCBuPW5ldyBNYXAscj1lLl9wZW5kaW5nRWRpdG9yU3RhdGU7Zm9yKGxldFtvLGldb2YgdC5fbm9kZU1hcCl7bGV0IGw9R2IuJGNsb25lV2l0aFByb3BlcnRpZXMoaSk7YXQuJGlzVGV4dE5vZGUobCkmJihsLl9fdGV4dD1pLl9fdGV4dCksbi5zZXQobyxsKX1yJiYoci5fbm9kZU1hcD1uKSxlLl9kaXJ0eVR5cGU9MixlPXQuX3NlbGVjdGlvbixhdC4kc2V0U2VsZWN0aW9uKGU9PT1udWxsP251bGw6ZS5jbG9uZSgpKX07ZHQuJHdyYXBOb2RlSW5FbGVtZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9dCgpLGUucmVwbGFjZSh0KSx0LmFwcGVuZChlKSx0fTtkdC5hZGRDbGFzc05hbWVzVG9FbGVtZW50PWZ1bmN0aW9uKGUsLi4udCl7dC5mb3JFYWNoKG49Pnt0eXBlb2Ygbj09InN0cmluZyImJihuPW4uc3BsaXQoIiAiKS5maWx0ZXIocj0+ciE9PSIiKSxlLmNsYXNzTGlzdC5hZGQoLi4ubikpfSl9O2R0LmlzTWltZVR5cGU9S3c7ZHQubWVkaWFGaWxlUmVhZGVyPWZ1bmN0aW9uKGUsdCl7bGV0IG49ZVtTeW1ib2wuaXRlcmF0b3JdKCk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG8pPT57bGV0IGk9W10sbD0oKT0+e2NvbnN0e2RvbmU6cyx2YWx1ZTphfT1uLm5leHQoKTtpZihzKXJldHVybiByKGkpO2NvbnN0IHU9bmV3IEZpbGVSZWFkZXI7dS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsbyksdS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoKT0+e2NvbnN0IGM9dS5yZXN1bHQ7dHlwZW9mIGM9PSJzdHJpbmciJiZpLnB1c2goe2ZpbGU6YSxyZXN1bHQ6Y30pLGwoKX0pLEt3KGEsdCk/dS5yZWFkQXNEYXRhVVJMKGEpOmwoKX07bCgpfSl9O2R0Lm1lcmdlUmVnaXN0ZXI9ZnVuY3Rpb24oLi4uZSl7cmV0dXJuKCk9PntlLmZvckVhY2godD0+dCgpKX19O2R0Lm9iamVjdEtsYXNzRXF1YWxzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUhPT1udWxsP09iamVjdC5nZXRQcm90b3R5cGVPZihlKS5jb25zdHJ1Y3Rvci5uYW1lPT09dC5uYW1lOiExfTtkdC5yZWdpc3Rlck5lc3RlZEVsZW1lbnRSZXNvbHZlcj1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gZS5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0odCxvPT57ZTp7Zm9yKHZhciBpPW8uZ2V0Q2hpbGRyZW4oKSxsPTA7bDxpLmxlbmd0aDtsKyspaWYoaVtsXWluc3RhbmNlb2YgdCl7aT1udWxsO2JyZWFrIGV9Zm9yKGk9bztpIT09bnVsbDspaWYobD1pLGk9aS5nZXRQYXJlbnQoKSxpIGluc3RhbmNlb2YgdCl7aT17Y2hpbGQ6bCxwYXJlbnQ6aX07YnJlYWsgZX1pPW51bGx9aWYoaSE9PW51bGwpe2NvbnN0e2NoaWxkOnMscGFyZW50OmF9PWk7aWYocy5pcyhvKSl7aWYocihhLG8pLG89cy5nZXROZXh0U2libGluZ3MoKSxpPW8ubGVuZ3RoLGEuaW5zZXJ0QWZ0ZXIocyksaSE9PTApe2w9bihhKSxzLmluc2VydEFmdGVyKGwpO2ZvcihsZXQgdT0wO3U8aTt1KyspbC5hcHBlbmQob1t1XSl9YS5jYW5CZUVtcHR5KCl8fGEuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wfHxhLnJlbW92ZSgpfX19KX07ZHQucmVtb3ZlQ2xhc3NOYW1lc0Zyb21FbGVtZW50PWZ1bmN0aW9uKGUsLi4udCl7dC5mb3JFYWNoKG49Pnt0eXBlb2Ygbj09InN0cmluZyImJmUuY2xhc3NMaXN0LnJlbW92ZSguLi5uLnNwbGl0KCIgIikpfSl9O2NvbnN0IFhiPWR0O3ZhciBOdD1YYixOZT1nZSxBbz1OdDtmdW5jdGlvbiBObChlKXtsZXQgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3QuYXBwZW5kKCJjb2RlIixlKTtmb3IobGV0IG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQuYXBwZW5kKCJ2Iixhcmd1bWVudHNbbl0pO3Rocm93IEVycm9yKGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke2V9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHt0fSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuYCl9ZnVuY3Rpb24gWXcoZSl7bGV0IHQ9MTtmb3IoZT1lLmdldFBhcmVudCgpO2UhPW51bGw7KXtpZihaZShlKSl7aWYoZT1lLmdldFBhcmVudCgpLHhlKGUpKXt0KyssZT1lLmdldFBhcmVudCgpO2NvbnRpbnVlfU5sKDQwKX1icmVha31yZXR1cm4gdH1mdW5jdGlvbiBycChlKXtlPWUuZ2V0UGFyZW50KCkseGUoZSl8fE5sKDQwKTtsZXQgdD1lO2Zvcig7dCE9PW51bGw7KXQ9dC5nZXRQYXJlbnQoKSx4ZSh0KSYmKGU9dCk7cmV0dXJuIGV9ZnVuY3Rpb24gWHcoZSl7bGV0IHQ9W107ZT1lLmdldENoaWxkcmVuKCkuZmlsdGVyKFplKTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IHI9ZVtuXSxvPXIuZ2V0Rmlyc3RDaGlsZCgpO3hlKG8pP3Q9dC5jb25jYXQoWHcobykpOnQucHVzaChyKX1yZXR1cm4gdH1mdW5jdGlvbiBhcihlKXtyZXR1cm4gWmUoZSkmJnhlKGUuZ2V0Rmlyc3RDaGlsZCgpKX1mdW5jdGlvbiBRYihlKXtmb3IoO2UuZ2V0TmV4dFNpYmxpbmcoKT09bnVsbCYmZS5nZXRQcmV2aW91c1NpYmxpbmcoKT09bnVsbDspe2xldCB0PWUuZ2V0UGFyZW50KCk7aWYodD09bnVsbHx8IVplKGUpJiYheGUoZSkpYnJlYWs7ZT10fWUucmVtb3ZlKCl9ZnVuY3Rpb24gT3koZSl7cmV0dXJuIFNuKCkuYXBwZW5kKGUpfWZ1bmN0aW9uIFF3KGUsdCl7cmV0dXJuIFplKGUpJiYodC5sZW5ndGg9PT0wfHx0Lmxlbmd0aD09PTEmJmUuaXModFswXSkmJmUuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wKX1mdW5jdGlvbiBnaShlLHQpe2Uuc3BsaWNlKGUuZ2V0Q2hpbGRyZW5TaXplKCksMCx0KX1mdW5jdGlvbiBBeShlLHQpe2lmKHhlKGUpKXJldHVybiBlO2xldCBuPWUuZ2V0UHJldmlvdXNTaWJsaW5nKCkscj1lLmdldE5leHRTaWJsaW5nKCksbz1TbigpO3JldHVybiBvLnNldEZvcm1hdChlLmdldEZvcm1hdFR5cGUoKSksby5zZXRJbmRlbnQoZS5nZXRJbmRlbnQoKSksZ2kobyxlLmdldENoaWxkcmVuKCkpLHhlKG4pJiZ0PT09bi5nZXRMaXN0VHlwZSgpPyhuLmFwcGVuZChvKSxlLnJlbW92ZSgpLHhlKHIpJiZ0PT09ci5nZXRMaXN0VHlwZSgpJiYoZ2kobixyLmdldENoaWxkcmVuKCkpLHIucmVtb3ZlKCkpLG4pOnhlKHIpJiZ0PT09ci5nZXRMaXN0VHlwZSgpPyhyLmdldEZpcnN0Q2hpbGRPclRocm93KCkuaW5zZXJ0QmVmb3JlKG8pLGUucmVtb3ZlKCkscik6KHQ9dG4odCksdC5hcHBlbmQobyksZS5yZXBsYWNlKHQpLFh0KHQpLHQpfWZ1bmN0aW9uIEp3KGUsdCl7dmFyIG49ZS5nZXRMYXN0Q2hpbGQoKTtsZXQgcj10LmdldEZpcnN0Q2hpbGQoKTtuJiZyJiZhcihuKSYmYXIocikmJihKdyhuLmdldEZpcnN0Q2hpbGQoKSxyLmdldEZpcnN0Q2hpbGQoKSksci5yZW1vdmUoKSksbj10LmdldENoaWxkcmVuKCksMDxuLmxlbmd0aCYmKGUuYXBwZW5kKC4uLm4pLFh0KGUpKSx0LnJlbW92ZSgpfWZ1bmN0aW9uIFh0KGUsdCl7aWYoZT10fHxlLmdldENoaWxkcmVuKCksZSE9PXZvaWQgMClmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgaT1lW3RdO2lmKFplKGkpKXtsZXQgbD1pLmdldFZhbHVlKCk7dmFyIG49aSxyPW4uZ2V0UGFyZW50KCksbz0xO2ZvcihyIT1udWxsJiYoeGUocik/bz1yLmdldFN0YXJ0KCk6TmwoNDQpKSxuPW4uZ2V0UHJldmlvdXNTaWJsaW5ncygpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7bGV0IHM9bltyXTtaZShzKSYmIXhlKHMuZ2V0Rmlyc3RDaGlsZCgpKSYmbysrfWwhPT1vJiZpLnNldFZhbHVlKG8pfX19ZnVuY3Rpb24gSmIoZSl7aWYoIWFyKGUpKXt2YXIgdD1lLmdldFBhcmVudCgpLG49dD90LmdldFBhcmVudCgpOnZvaWQgMCxyPW4/bi5nZXRQYXJlbnQoKTp2b2lkIDA7aWYoeGUocikmJlplKG4pJiZ4ZSh0KSl7dmFyIG89dD90LmdldEZpcnN0Q2hpbGQoKTp2b2lkIDAsaT10P3QuZ2V0TGFzdENoaWxkKCk6dm9pZCAwO2lmKGUuaXMobykpbi5pbnNlcnRCZWZvcmUoZSksdC5pc0VtcHR5KCkmJm4ucmVtb3ZlKCk7ZWxzZSBpZihlLmlzKGkpKW4uaW5zZXJ0QWZ0ZXIoZSksdC5pc0VtcHR5KCkmJm4ucmVtb3ZlKCk7ZWxzZXt2YXIgbD10LmdldExpc3RUeXBlKCk7bz1TbigpO2xldCBzPXRuKGwpO28uYXBwZW5kKHMpLGUuZ2V0UHJldmlvdXNTaWJsaW5ncygpLmZvckVhY2goYT0+cy5hcHBlbmQoYSkpLGk9U24oKSxsPXRuKGwpLGkuYXBwZW5kKGwpLGdpKGwsZS5nZXROZXh0U2libGluZ3MoKSksbi5pbnNlcnRCZWZvcmUobyksbi5pbnNlcnRBZnRlcihpKSxuLnJlcGxhY2UoZSl9WHQodCksWHQocil9fX1sZXQgeGQ9Y2xhc3MgWncgZXh0ZW5kcyBOZS5FbGVtZW50Tm9kZXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJsaXN0aXRlbSJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgWncodC5fX3ZhbHVlLHQuX19jaGVja2VkLHQuX19rZXkpfWNvbnN0cnVjdG9yKHQsbixyKXtzdXBlcihyKSx0aGlzLl9fdmFsdWU9dD09PXZvaWQgMD8xOnQsdGhpcy5fX2NoZWNrZWQ9bn1jcmVhdGVET00odCl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKSxyPXRoaXMuZ2V0UGFyZW50KCk7cmV0dXJuIHhlKHIpJiZyLmdldExpc3RUeXBlKCk9PT0iY2hlY2siJiZEeShuLHRoaXMsbnVsbCksbi52YWx1ZT10aGlzLl9fdmFsdWUsTXkobix0LnRoZW1lLHRoaXMpLG59dXBkYXRlRE9NKHQsbixyKXtsZXQgbz10aGlzLmdldFBhcmVudCgpO3JldHVybiB4ZShvKSYmby5nZXRMaXN0VHlwZSgpPT09ImNoZWNrIiYmRHkobix0aGlzLHQpLG4udmFsdWU9dGhpcy5fX3ZhbHVlLE15KG4sci50aGVtZSx0aGlzKSwhMX1zdGF0aWMgdHJhbnNmb3JtKCl7cmV0dXJuIHQ9PntsZXQgbj10LmdldFBhcmVudCgpO3hlKG4pJiYoWHQobiksbi5nZXRMaXN0VHlwZSgpIT09ImNoZWNrIiYmdC5nZXRDaGVja2VkKCkhPW51bGwmJnQuc2V0Q2hlY2tlZCh2b2lkIDApKX19c3RhdGljIGltcG9ydERPTSgpe3JldHVybntsaTooKT0+KHtjb252ZXJzaW9uOlpiLHByaW9yaXR5OjB9KX19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49U24oKTtyZXR1cm4gbi5zZXRDaGVja2VkKHQuY2hlY2tlZCksbi5zZXRWYWx1ZSh0LnZhbHVlKSxuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksY2hlY2tlZDp0aGlzLmdldENoZWNrZWQoKSx0eXBlOiJsaXN0aXRlbSIsdmFsdWU6dGhpcy5nZXRWYWx1ZSgpLHZlcnNpb246MX19YXBwZW5kKC4uLnQpe2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtsZXQgcj10W25dO2lmKE5lLiRpc0VsZW1lbnROb2RlKHIpJiZ0aGlzLmNhbk1lcmdlV2l0aChyKSl7bGV0IG89ci5nZXRDaGlsZHJlbigpO3RoaXMuYXBwZW5kKC4uLm8pLHIucmVtb3ZlKCl9ZWxzZSBzdXBlci5hcHBlbmQocil9cmV0dXJuIHRoaXN9cmVwbGFjZSh0LG4pe2lmKFplKHQpKXJldHVybiBzdXBlci5yZXBsYWNlKHQpO3RoaXMuc2V0SW5kZW50KDApO2xldCByPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpO2lmKCF4ZShyKSlyZXR1cm4gdDtpZihyLl9fZmlyc3Q9PT10aGlzLmdldEtleSgpKXIuaW5zZXJ0QmVmb3JlKHQpO2Vsc2UgaWYoci5fX2xhc3Q9PT10aGlzLmdldEtleSgpKXIuaW5zZXJ0QWZ0ZXIodCk7ZWxzZXtsZXQgbz10bihyLmdldExpc3RUeXBlKCkpLGk9dGhpcy5nZXROZXh0U2libGluZygpO2Zvcig7aTspe2xldCBsPWk7aT1pLmdldE5leHRTaWJsaW5nKCksby5hcHBlbmQobCl9ci5pbnNlcnRBZnRlcih0KSx0Lmluc2VydEFmdGVyKG8pfXJldHVybiBuJiZ0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChvPT57dC5hcHBlbmQobyl9KSx0aGlzLnJlbW92ZSgpLHIuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZyLnJlbW92ZSgpLHR9aW5zZXJ0QWZ0ZXIodCxuPSEwKXt2YXIgcj10aGlzLmdldFBhcmVudE9yVGhyb3coKTt4ZShyKXx8TmwoMzkpO3ZhciBvPXRoaXMuZ2V0TmV4dFNpYmxpbmdzKCk7aWYoWmUodCkpcmV0dXJuIG49c3VwZXIuaW5zZXJ0QWZ0ZXIodCxuKSx0PXQuZ2V0UGFyZW50T3JUaHJvdygpLHhlKHQpJiZYdCh0KSxuO2lmKHhlKHQpKXtmb3Iocj10LHQ9dC5nZXRDaGlsZHJlbigpLG89dC5sZW5ndGgtMTswPD1vO28tLSlyPXRbb10sdGhpcy5pbnNlcnRBZnRlcihyLG4pO3JldHVybiByfWlmKHIuaW5zZXJ0QWZ0ZXIodCxuKSxvLmxlbmd0aCE9PTApe2xldCBpPXRuKHIuZ2V0TGlzdFR5cGUoKSk7by5mb3JFYWNoKGw9PmkuYXBwZW5kKGwpKSx0Lmluc2VydEFmdGVyKGksbil9cmV0dXJuIHR9cmVtb3ZlKHQpe2xldCBuPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCkscj10aGlzLmdldE5leHRTaWJsaW5nKCk7c3VwZXIucmVtb3ZlKHQpLG4mJnImJmFyKG4pJiZhcihyKT8oSncobi5nZXRGaXJzdENoaWxkKCksci5nZXRGaXJzdENoaWxkKCkpLHIucmVtb3ZlKCkpOnImJih0PXIuZ2V0UGFyZW50KCkseGUodCkmJlh0KHQpKX1pbnNlcnROZXdBZnRlcih0LG49ITApe3JldHVybiB0PVNuKHRoaXMuX19jaGVja2VkPT1udWxsP3ZvaWQgMDohMSksdGhpcy5pbnNlcnRBZnRlcih0LG4pLHR9Y29sbGFwc2VBdFN0YXJ0KHQpe2xldCBuPU5lLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7dGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2gobD0+bi5hcHBlbmQobCkpO3ZhciByPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLG89ci5nZXRQYXJlbnRPclRocm93KCk7bGV0IGk9WmUobyk7cmV0dXJuIHIuZ2V0Q2hpbGRyZW5TaXplKCk9PT0xP2k/KHIucmVtb3ZlKCksby5zZWxlY3QoKSk6KHIuaW5zZXJ0QmVmb3JlKG4pLHIucmVtb3ZlKCkscj10LmFuY2hvcix0PXQuZm9jdXMsbz1uLmdldEtleSgpLHIudHlwZT09PSJlbGVtZW50IiYmci5nZXROb2RlKCkuaXModGhpcykmJnIuc2V0KG8sci5vZmZzZXQsImVsZW1lbnQiKSx0LnR5cGU9PT0iZWxlbWVudCImJnQuZ2V0Tm9kZSgpLmlzKHRoaXMpJiZ0LnNldChvLHQub2Zmc2V0LCJlbGVtZW50IikpOihyLmluc2VydEJlZm9yZShuKSx0aGlzLnJlbW92ZSgpKSwhMH1nZXRWYWx1ZSgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdmFsdWV9c2V0VmFsdWUodCl7dGhpcy5nZXRXcml0YWJsZSgpLl9fdmFsdWU9dH1nZXRDaGVja2VkKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19jaGVja2VkfXNldENoZWNrZWQodCl7dGhpcy5nZXRXcml0YWJsZSgpLl9fY2hlY2tlZD10fXRvZ2dsZUNoZWNrZWQoKXt0aGlzLnNldENoZWNrZWQoIXRoaXMuX19jaGVja2VkKX1nZXRJbmRlbnQoKXt2YXIgdD10aGlzLmdldFBhcmVudCgpO2lmKHQ9PT1udWxsKXJldHVybiB0aGlzLmdldExhdGVzdCgpLl9faW5kZW50O3Q9dC5nZXRQYXJlbnRPclRocm93KCk7bGV0IG49MDtmb3IoO1plKHQpOyl0PXQuZ2V0UGFyZW50T3JUaHJvdygpLmdldFBhcmVudE9yVGhyb3coKSxuKys7cmV0dXJuIG59c2V0SW5kZW50KHQpe3R5cGVvZiB0PT0ibnVtYmVyIiYmLTE8dHx8TmwoMTE3KTtsZXQgbj10aGlzLmdldEluZGVudCgpO2Zvcig7biE9PXQ7KWlmKG48dCl7ZTp7dmFyIHI9bmV3IFNldDtpZihhcih0aGlzKXx8ci5oYXModGhpcy5nZXRLZXkoKSkpYnJlYWsgZTtsZXQgcz10aGlzLmdldFBhcmVudCgpO3ZhciBvPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKSxpPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCk7aWYoYXIobykmJmFyKGkpKXtpZihpPWkuZ2V0Rmlyc3RDaGlsZCgpLHhlKGkpKXtpLmFwcGVuZCh0aGlzKTt2YXIgbD1vLmdldEZpcnN0Q2hpbGQoKTt4ZShsKSYmKGw9bC5nZXRDaGlsZHJlbigpLGdpKGksbCksby5yZW1vdmUoKSxyLmFkZChvLmdldEtleSgpKSksWHQoaSl9fWVsc2UgYXIobyk/KG89by5nZXRGaXJzdENoaWxkKCkseGUobykmJihyPW8uZ2V0Rmlyc3RDaGlsZCgpLHIhPT1udWxsJiZyLmluc2VydEJlZm9yZSh0aGlzKSxYdChvKSkpOmFyKGkpPyhvPWkuZ2V0Rmlyc3RDaGlsZCgpLHhlKG8pJiYoby5hcHBlbmQodGhpcyksWHQobykpKTp4ZShzKSYmKHI9U24oKSxsPXRuKHMuZ2V0TGlzdFR5cGUoKSksci5hcHBlbmQobCksbC5hcHBlbmQodGhpcyksaT9pLmluc2VydEFmdGVyKHIpOm8/by5pbnNlcnRCZWZvcmUocik6cy5hcHBlbmQociksWHQobCkpO3hlKHMpJiZYdChzKX1uKyt9ZWxzZSBKYih0aGlzKSxuLS07cmV0dXJuIHRoaXN9aW5zZXJ0QmVmb3JlKHQpe2lmKFplKHQpKXtsZXQgbj10aGlzLmdldFBhcmVudE9yVGhyb3coKTtpZih4ZShuKSl7bGV0IHI9dGhpcy5nZXROZXh0U2libGluZ3MoKTtYdChuLHIpfX1yZXR1cm4gc3VwZXIuaW5zZXJ0QmVmb3JlKHQpfWNhbkluc2VydEFmdGVyKHQpe3JldHVybiBaZSh0KX1jYW5SZXBsYWNlV2l0aCh0KXtyZXR1cm4gWmUodCl9Y2FuTWVyZ2VXaXRoKHQpe3JldHVybiBOZS4kaXNQYXJhZ3JhcGhOb2RlKHQpfHxaZSh0KX1leHRyYWN0V2l0aENoaWxkKHQsbil7aWYoIU5lLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXJldHVybiExO3Q9bi5hbmNob3IuZ2V0Tm9kZSgpO2xldCByPW4uZm9jdXMuZ2V0Tm9kZSgpO3JldHVybiB0aGlzLmlzUGFyZW50T2YodCkmJnRoaXMuaXNQYXJlbnRPZihyKSYmdGhpcy5nZXRUZXh0Q29udGVudCgpLmxlbmd0aD09PW4uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9aXNQYXJlbnRSZXF1aXJlZCgpe3JldHVybiEwfWNyZWF0ZVBhcmVudEVsZW1lbnROb2RlKCl7cmV0dXJuIHRuKCJidWxsZXQiKX19O2Z1bmN0aW9uIE15KGUsdCxuKXtsZXQgcj1bXSxvPVtdO3ZhciBpPSh0PXQubGlzdCk/dC5saXN0aXRlbTp2b2lkIDA7aWYodCYmdC5uZXN0ZWQpdmFyIGw9dC5uZXN0ZWQubGlzdGl0ZW07aWYoaSE9PXZvaWQgMCYmKGk9aS5zcGxpdCgiICIpLHIucHVzaCguLi5pKSksdCl7aT1uLmdldFBhcmVudCgpLGk9eGUoaSkmJmkuZ2V0TGlzdFR5cGUoKT09PSJjaGVjayI7bGV0IHM9bi5nZXRDaGVja2VkKCk7aSYmIXN8fG8ucHVzaCh0Lmxpc3RpdGVtVW5jaGVja2VkKSxpJiZzfHxvLnB1c2godC5saXN0aXRlbUNoZWNrZWQpLGkmJnIucHVzaChzP3QubGlzdGl0ZW1DaGVja2VkOnQubGlzdGl0ZW1VbmNoZWNrZWQpfWwhPT12b2lkIDAmJihsPWwuc3BsaXQoIiAiKSxuLmdldENoaWxkcmVuKCkuc29tZShzPT54ZShzKSk/ci5wdXNoKC4uLmwpOm8ucHVzaCguLi5sKSksMDxvLmxlbmd0aCYmQW8ucmVtb3ZlQ2xhc3NOYW1lc0Zyb21FbGVtZW50KGUsLi4ubyksMDxyLmxlbmd0aCYmQW8uYWRkQ2xhc3NOYW1lc1RvRWxlbWVudChlLC4uLnIpfWZ1bmN0aW9uIER5KGUsdCxuKXt4ZSh0LmdldEZpcnN0Q2hpbGQoKSk/KGUucmVtb3ZlQXR0cmlidXRlKCJyb2xlIiksZS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IiksZS5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIpKTooZS5zZXRBdHRyaWJ1dGUoInJvbGUiLCJjaGVja2JveCIpLGUuc2V0QXR0cmlidXRlKCJ0YWJJbmRleCIsIi0xIiksbiYmdC5fX2NoZWNrZWQ9PT1uLl9fY2hlY2tlZHx8ZS5zZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIsdC5nZXRDaGVja2VkKCk/InRydWUiOiJmYWxzZSIpKX1mdW5jdGlvbiBaYihlKXtyZXR1cm4gZT1Bby5pc0hUTUxFbGVtZW50KGUpJiZlLmdldEF0dHJpYnV0ZSgiYXJpYS1jaGVja2VkIik9PT0idHJ1ZSIse25vZGU6U24oZSl9fWZ1bmN0aW9uIFNuKGUpe3JldHVybiBOZS4kYXBwbHlOb2RlUmVwbGFjZW1lbnQobmV3IHhkKHZvaWQgMCxlKSl9ZnVuY3Rpb24gWmUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiB4ZH1sZXQgbm09Y2xhc3MgcXcgZXh0ZW5kcyBOZS5FbGVtZW50Tm9kZXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJsaXN0In1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBxdyh0Ll9fbGlzdFR5cGV8fGp5W3QuX190YWddLHQuX19zdGFydCx0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0LG4scil7c3VwZXIociksdGhpcy5fX2xpc3RUeXBlPXQ9anlbdF18fHQsdGhpcy5fX3RhZz10PT09Im51bWJlciI/Im9sIjoidWwiLHRoaXMuX19zdGFydD1ufWdldFRhZygpe3JldHVybiB0aGlzLl9fdGFnfXNldExpc3RUeXBlKHQpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtuLl9fbGlzdFR5cGU9dCxuLl9fdGFnPXQ9PT0ibnVtYmVyIj8ib2wiOiJ1bCJ9Z2V0TGlzdFR5cGUoKXtyZXR1cm4gdGhpcy5fX2xpc3RUeXBlfWdldFN0YXJ0KCl7cmV0dXJuIHRoaXMuX19zdGFydH1jcmVhdGVET00odCl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLl9fdGFnKTtyZXR1cm4gdGhpcy5fX3N0YXJ0IT09MSYmbi5zZXRBdHRyaWJ1dGUoInN0YXJ0IixTdHJpbmcodGhpcy5fX3N0YXJ0KSksbi5fX2xleGljYWxMaXN0VHlwZT10aGlzLl9fbGlzdFR5cGUsTHkobix0LnRoZW1lLHRoaXMpLG59dXBkYXRlRE9NKHQsbixyKXtyZXR1cm4gdC5fX3RhZyE9PXRoaXMuX190YWc/ITA6KEx5KG4sci50aGVtZSx0aGlzKSwhMSl9c3RhdGljIGltcG9ydERPTSgpe3JldHVybntvbDooKT0+KHtjb252ZXJzaW9uOkl5LHByaW9yaXR5OjB9KSx1bDooKT0+KHtjb252ZXJzaW9uOkl5LHByaW9yaXR5OjB9KX19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49dG4odC5saXN0VHlwZSx0LnN0YXJ0KTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1leHBvcnRET00odCl7cmV0dXJue2VsZW1lbnQ6dH09c3VwZXIuZXhwb3J0RE9NKHQpLHQmJkFvLmlzSFRNTEVsZW1lbnQodCkmJih0aGlzLl9fc3RhcnQhPT0xJiZ0LnNldEF0dHJpYnV0ZSgic3RhcnQiLFN0cmluZyh0aGlzLl9fc3RhcnQpKSx0aGlzLl9fbGlzdFR5cGU9PT0iY2hlY2siJiZ0LnNldEF0dHJpYnV0ZSgiX19sZXhpY2FsTGlzdFR5cGUiLCJjaGVjayIpKSx7ZWxlbWVudDp0fX1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSxsaXN0VHlwZTp0aGlzLmdldExpc3RUeXBlKCksc3RhcnQ6dGhpcy5nZXRTdGFydCgpLHRhZzp0aGlzLmdldFRhZygpLHR5cGU6Imxpc3QiLHZlcnNpb246MX19Y2FuQmVFbXB0eSgpe3JldHVybiExfWNhbkluZGVudCgpe3JldHVybiExfWFwcGVuZCguLi50KXtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG49dFtyXTtpZihaZShuKSlzdXBlci5hcHBlbmQobik7ZWxzZXtsZXQgbz1TbigpO3hlKG4pfHxOZS4kaXNFbGVtZW50Tm9kZShuKSYmKG49TmUuJGNyZWF0ZVRleHROb2RlKG4uZ2V0VGV4dENvbnRlbnQoKSkpLG8uYXBwZW5kKG4pLHN1cGVyLmFwcGVuZChvKX19cmV0dXJuIFh0KHRoaXMpLHRoaXN9ZXh0cmFjdFdpdGhDaGlsZCh0KXtyZXR1cm4gWmUodCl9fTtmdW5jdGlvbiBMeShlLHQsbil7bGV0IHI9W10sbz1bXTt2YXIgaT10Lmxpc3Q7aWYoaSE9PXZvaWQgMCl7bGV0IHM9aVtgJHtuLl9fdGFnfURlcHRoYF18fFtdO3Q9WXcobiktMTtsZXQgYT10JXMubGVuZ3RoO3ZhciBsPXNbYV07bGV0IHU9aVtuLl9fdGFnXSxjO2lmKGk9aS5uZXN0ZWQsaSE9PXZvaWQgMCYmaS5saXN0JiYoYz1pLmxpc3QpLHUhPT12b2lkIDAmJnIucHVzaCh1KSxsIT09dm9pZCAwKWZvcihsPWwuc3BsaXQoIiAiKSxyLnB1c2goLi4ubCksbD0wO2w8cy5sZW5ndGg7bCsrKWwhPT1hJiZvLnB1c2gobi5fX3RhZytsKTtjIT09dm9pZCAwJiYobj1jLnNwbGl0KCIgIiksMTx0P3IucHVzaCguLi5uKTpvLnB1c2goLi4ubikpfTA8by5sZW5ndGgmJkFvLnJlbW92ZUNsYXNzTmFtZXNGcm9tRWxlbWVudChlLC4uLm8pLDA8ci5sZW5ndGgmJkFvLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQoZSwuLi5yKX1mdW5jdGlvbiBxYihlKXtsZXQgdD1bXTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49ZVtyXTtaZShuKT8odC5wdXNoKG4pLG49bi5nZXRDaGlsZHJlbigpLDE8bi5sZW5ndGgmJm4uZm9yRWFjaChvPT57eGUobykmJnQucHVzaChPeShvKSl9KSk6dC5wdXNoKE95KG4pKX1yZXR1cm4gdH1mdW5jdGlvbiBJeShlKXtsZXQgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj1udWxsO3JldHVybiB0PT09Im9sIj9uPXRuKCJudW1iZXIiLGUuc3RhcnQpOnQ9PT0idWwiJiYobj1Bby5pc0hUTUxFbGVtZW50KGUpJiZlLmdldEF0dHJpYnV0ZSgiX19sZXhpY2FsbGlzdHR5cGUiKT09PSJjaGVjayI/dG4oImNoZWNrIik6dG4oImJ1bGxldCIpKSx7YWZ0ZXI6cWIsbm9kZTpufX1sZXQgank9e29sOiJudW1iZXIiLHVsOiJidWxsZXQifTtmdW5jdGlvbiB0bihlLHQ9MSl7cmV0dXJuIE5lLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgbm0oZSx0KSl9ZnVuY3Rpb24geGUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBubX1sZXQgZTI9TmUuY3JlYXRlQ29tbWFuZCgiSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQiKSx0Mj1OZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQiKSxuMj1OZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfQ0hFQ0tfTElTVF9DT01NQU5EIikscjI9TmUuY3JlYXRlQ29tbWFuZCgiUkVNT1ZFX0xJU1RfQ09NTUFORCIpO2xuLiRjcmVhdGVMaXN0SXRlbU5vZGU9U247bG4uJGNyZWF0ZUxpc3ROb2RlPXRuO2xuLiRnZXRMaXN0RGVwdGg9WXc7bG4uJGhhbmRsZUxpc3RJbnNlcnRQYXJhZ3JhcGg9ZnVuY3Rpb24oKXt2YXIgZT1OZS4kZ2V0U2VsZWN0aW9uKCk7aWYoIU5lLiRpc1JhbmdlU2VsZWN0aW9uKGUpfHwhZS5pc0NvbGxhcHNlZCgpfHwoZT1lLmFuY2hvci5nZXROb2RlKCksIVplKGUpfHxlLmdldENoaWxkcmVuU2l6ZSgpIT09MCkpcmV0dXJuITE7dmFyIHQ9cnAoZSksbj1lLmdldFBhcmVudCgpO3hlKG4pfHxObCg0MCk7bGV0IHI9bi5nZXRQYXJlbnQoKSxvO2lmKE5lLiRpc1Jvb3RPclNoYWRvd1Jvb3Qocikpbz1OZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLHQuaW5zZXJ0QWZ0ZXIobyk7ZWxzZSBpZihaZShyKSlvPVNuKCksci5pbnNlcnRBZnRlcihvKTtlbHNlIHJldHVybiExO2lmKG8uc2VsZWN0KCksdD1lLmdldE5leHRTaWJsaW5ncygpLDA8dC5sZW5ndGgpe2xldCBpPXRuKG4uZ2V0TGlzdFR5cGUoKSk7TmUuJGlzUGFyYWdyYXBoTm9kZShvKT9vLmluc2VydEFmdGVyKGkpOihuPVNuKCksbi5hcHBlbmQoaSksby5pbnNlcnRBZnRlcihuKSksdC5mb3JFYWNoKGw9PntsLnJlbW92ZSgpLGkuYXBwZW5kKGwpfSl9cmV0dXJuIFFiKGUpLCEwfTtsbi4kaXNMaXN0SXRlbU5vZGU9WmU7bG4uJGlzTGlzdE5vZGU9eGU7bG4uSU5TRVJUX0NIRUNLX0xJU1RfQ09NTUFORD1uMjtsbi5JTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQ9dDI7bG4uSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQ9ZTI7bG4uTGlzdEl0ZW1Ob2RlPXhkO2xuLkxpc3ROb2RlPW5tO2xuLlJFTU9WRV9MSVNUX0NPTU1BTkQ9cjI7bG4uaW5zZXJ0TGlzdD1mdW5jdGlvbihlLHQpe2UudXBkYXRlKCgpPT57dmFyIG49TmUuJGdldFNlbGVjdGlvbigpO2lmKE5lLiRpc1JhbmdlU2VsZWN0aW9uKG4pfHxOZS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24obikpe3ZhciByPW4uZ2V0Tm9kZXMoKTtuPW4uYW5jaG9yLmdldE5vZGUoKTt2YXIgbz1uLmdldFBhcmVudCgpO2lmKFF3KG4scikpcj10bih0KSxOZS4kaXNSb290T3JTaGFkb3dSb290KG8pPyhuLnJlcGxhY2Uociksbz1TbigpLE5lLiRpc0VsZW1lbnROb2RlKG4pJiYoby5zZXRGb3JtYXQobi5nZXRGb3JtYXRUeXBlKCkpLG8uc2V0SW5kZW50KG4uZ2V0SW5kZW50KCkpKSxyLmFwcGVuZChvKSk6WmUobikmJihuPW4uZ2V0UGFyZW50T3JUaHJvdygpLGdpKHIsbi5nZXRDaGlsZHJlbigpKSxuLnJlcGxhY2UocikpO2Vsc2UgZm9yKG49bmV3IFNldCxvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb107aWYoTmUuJGlzRWxlbWVudE5vZGUoaSkmJmkuaXNFbXB0eSgpJiYhbi5oYXMoaS5nZXRLZXkoKSkpQXkoaSx0KTtlbHNlIGlmKE5lLiRpc0xlYWZOb2RlKGkpKWZvcihpPWkuZ2V0UGFyZW50KCk7aSE9bnVsbDspe2xldCBzPWkuZ2V0S2V5KCk7aWYoeGUoaSkpe2lmKCFuLmhhcyhzKSl7dmFyIGw9dG4odCk7Z2kobCxpLmdldENoaWxkcmVuKCkpLGkucmVwbGFjZShsKSxYdChsKSxuLmFkZChzKX1icmVha31lbHNle2lmKGw9aS5nZXRQYXJlbnQoKSxOZS4kaXNSb290T3JTaGFkb3dSb290KGwpJiYhbi5oYXMocykpe24uYWRkKHMpLEF5KGksdCk7YnJlYWt9aT1sfX19fX0pfTtsbi5yZW1vdmVMaXN0PWZ1bmN0aW9uKGUpe2UudXBkYXRlKCgpPT57bGV0IHQ9TmUuJGdldFNlbGVjdGlvbigpO2lmKE5lLiRpc1JhbmdlU2VsZWN0aW9uKHQpKXt2YXIgbj1uZXcgU2V0LHI9dC5nZXROb2RlcygpLG89dC5hbmNob3IuZ2V0Tm9kZSgpO2lmKFF3KG8scikpbi5hZGQocnAobykpO2Vsc2UgZm9yKG89MDtvPHIubGVuZ3RoO28rKyl7dmFyIGk9cltvXTtOZS4kaXNMZWFmTm9kZShpKSYmKGk9QW8uJGdldE5lYXJlc3ROb2RlT2ZUeXBlKGkseGQpLGkhPW51bGwmJm4uYWRkKHJwKGkpKSl9Zm9yKGxldCBsIG9mIG4pe249bCxyPVh3KGwpO2ZvcihsZXQgcyBvZiByKXI9TmUuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSxnaShyLHMuZ2V0Q2hpbGRyZW4oKSksbi5pbnNlcnRBZnRlcihyKSxuPXIscy5fX2tleT09PXQuYW5jaG9yLmtleSYmdC5hbmNob3Iuc2V0KHIuZ2V0S2V5KCksMCwiZWxlbWVudCIpLHMuX19rZXk9PT10LmZvY3VzLmtleSYmdC5mb2N1cy5zZXQoci5nZXRLZXkoKSwwLCJlbGVtZW50Iikscy5yZW1vdmUoKTtsLnJlbW92ZSgpfX19KX07Y29uc3QgbzI9bG47dmFyIGZvPW8yLGVTPXt9LF9kPXt9LHRTPXA7ZnVuY3Rpb24gaTIoZSl7bGV0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtczt0LmFwcGVuZCgiY29kZSIsZSk7Zm9yKGxldCBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LmFwcGVuZCgidiIsYXJndW1lbnRzW25dKTt0aHJvdyBFcnJvcihgTWluaWZpZWQgTGV4aWNhbCBlcnJvciAjJHtlfTsgdmlzaXQgaHR0cHM6Ly9sZXhpY2FsLmRldi9kb2NzL2Vycm9yPyR7dH0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLmApfWxldCBuUz10Uy5jcmVhdGVDb250ZXh0KG51bGwpO19kLkxleGljYWxDb21wb3NlckNvbnRleHQ9blM7X2QuY3JlYXRlTGV4aWNhbENvbXBvc2VyQ29udGV4dD1mdW5jdGlvbihlLHQpe2xldCBuPW51bGw7cmV0dXJuIGUhPW51bGwmJihuPWVbMV0pLHtnZXRUaGVtZTpmdW5jdGlvbigpe3JldHVybiB0Pz8obiE9bnVsbD9uLmdldFRoZW1lKCk6bnVsbCl9fX07X2QudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dD1mdW5jdGlvbigpe2xldCBlPXRTLnVzZUNvbnRleHQoblMpO3JldHVybiBlPT1udWxsJiZpMig4KSxlfTtjb25zdCBsMj1fZDt2YXIgcnI9bDIsenk9cnIsU3M9Z2UsYmM9cDtsZXQgclM9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiO3ZhciBzMj1yUz9iYy51c2VMYXlvdXRFZmZlY3Q6YmMudXNlRWZmZWN0O2xldCBodT17dGFnOiJoaXN0b3J5LW1lcmdlIn07ZnVuY3Rpb24gYTIoZSx0KXtpZih0IT09bnVsbCl7aWYodD09PXZvaWQgMCllLnVwZGF0ZSgoKT0+e3ZhciBuPVNzLiRnZXRSb290KCk7aWYobi5pc0VtcHR5KCkpe2xldCByPVNzLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7bi5hcHBlbmQociksbj1yUz9kb2N1bWVudC5hY3RpdmVFbGVtZW50Om51bGwsKFNzLiRnZXRTZWxlY3Rpb24oKSE9PW51bGx8fG4hPT1udWxsJiZuPT09ZS5nZXRSb290RWxlbWVudCgpKSYmci5zZWxlY3QoKX19LGh1KTtlbHNlIGlmKHQhPT1udWxsKXN3aXRjaCh0eXBlb2YgdCl7Y2FzZSJzdHJpbmciOmxldCBuPWUucGFyc2VFZGl0b3JTdGF0ZSh0KTtlLnNldEVkaXRvclN0YXRlKG4saHUpO2JyZWFrO2Nhc2Uib2JqZWN0IjplLnNldEVkaXRvclN0YXRlKHQsaHUpO2JyZWFrO2Nhc2UiZnVuY3Rpb24iOmUudXBkYXRlKCgpPT57U3MuJGdldFJvb3QoKS5pc0VtcHR5KCkmJnQoZSl9LGh1KX19fWVTLkxleGljYWxDb21wb3Nlcj1mdW5jdGlvbih7aW5pdGlhbENvbmZpZzplLGNoaWxkcmVuOnR9KXtsZXQgbj1iYy51c2VNZW1vKCgpPT57Y29uc3R7dGhlbWU6cixuYW1lc3BhY2U6byxlZGl0b3JfX0RFUFJFQ0FURUQ6aSxub2RlczpsLG9uRXJyb3I6cyxlZGl0b3JTdGF0ZTphfT1lLHU9enkuY3JlYXRlTGV4aWNhbENvbXBvc2VyQ29udGV4dChudWxsLHIpO2xldCBjPWl8fG51bGw7aWYoYz09PW51bGwpe2NvbnN0IGQ9U3MuY3JlYXRlRWRpdG9yKHtlZGl0YWJsZTplLmVkaXRhYmxlLG5hbWVzcGFjZTpvLG5vZGVzOmwsb25FcnJvcjpmPT5zKGYsZCksdGhlbWU6cn0pO2EyKGQsYSksYz1kfXJldHVybltjLHVdfSxbXSk7cmV0dXJuIHMyKCgpPT57bGV0IHI9ZS5lZGl0YWJsZSxbb109bjtvLnNldEVkaXRhYmxlKHIhPT12b2lkIDA/cjohMCl9LFtdKSxiYy5jcmVhdGVFbGVtZW50KHp5LkxleGljYWxDb21wb3NlckNvbnRleHQuUHJvdmlkZXIse3ZhbHVlOm59LHQpfTtjb25zdCB1Mj1lUzt2YXIgYzI9dTIsRnM9cDtmdW5jdGlvbiBvcChlLHQpe3JldHVybiBvcD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihuLHIpe3JldHVybiBuLl9fcHJvdG9fXz1yLG59LG9wKGUsdCl9ZnVuY3Rpb24gZDIoZSx0KXtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLG9wKGUsdCl9ZnVuY3Rpb24gZjIoZSx0KXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9W10pLHQ9PT12b2lkIDAmJih0PVtdKSxlLmxlbmd0aCE9PXQubGVuZ3RofHxlLnNvbWUoZnVuY3Rpb24obixyKXtyZXR1cm4hT2JqZWN0LmlzKG4sdFtyXSl9KX12YXIgRnk9e2Vycm9yOm51bGx9LGgyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtmb3IodmFyIHIsbz1hcmd1bWVudHMubGVuZ3RoLGk9QXJyYXkobyksbD0wO2w8bztsKyspaVtsXT1hcmd1bWVudHNbbF07cmV0dXJuIHI9ZS5jYWxsLmFwcGx5KGUsW3RoaXNdLmNvbmNhdChpKSl8fHRoaXMsci5zdGF0ZT1GeSxyLnJlc2V0RXJyb3JCb3VuZGFyeT1mdW5jdGlvbigpe2Zvcih2YXIgcyxhPWFyZ3VtZW50cy5sZW5ndGgsdT1BcnJheShhKSxjPTA7YzxhO2MrKyl1W2NdPWFyZ3VtZW50c1tjXTtyLnByb3BzLm9uUmVzZXQ9PW51bGx8fChzPXIucHJvcHMpLm9uUmVzZXQuYXBwbHkocyx1KSxyLnJlc2V0KCl9LHJ9ZDIodCxlKSx0LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj1mdW5jdGlvbihyKXtyZXR1cm57ZXJyb3I6cn19O3ZhciBuPXQucHJvdG90eXBlO3JldHVybiBuLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5zZXRTdGF0ZShGeSl9LG4uY29tcG9uZW50RGlkQ2F0Y2g9ZnVuY3Rpb24ocixvKXt2YXIgaSxsOyhpPShsPXRoaXMucHJvcHMpLm9uRXJyb3IpPT1udWxsfHxpLmNhbGwobCxyLG8pfSxuLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbihyLG8pe3ZhciBpPXRoaXMucHJvcHMucmVzZXRLZXlzO2lmKHRoaXMuc3RhdGUuZXJyb3IhPT1udWxsJiZvLmVycm9yIT09bnVsbCYmZjIoci5yZXNldEtleXMsaSkpe3ZhciBsLHM7KGw9KHM9dGhpcy5wcm9wcykub25SZXNldEtleXNDaGFuZ2UpPT1udWxsfHxsLmNhbGwocyxyLnJlc2V0S2V5cyxpKSx0aGlzLnJlc2V0KCl9fSxuLnJlbmRlcj1mdW5jdGlvbigpe3ZhciByPXRoaXMuc3RhdGUuZXJyb3Isbz10aGlzLnByb3BzLGk9by5mYWxsYmFja1JlbmRlcixsPW8uRmFsbGJhY2tDb21wb25lbnQ7aWYobz1vLmZhbGxiYWNrLHIhPT1udWxsKXtpZihyPXtlcnJvcjpyLHJlc2V0RXJyb3JCb3VuZGFyeTp0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeX0sRnMuaXNWYWxpZEVsZW1lbnQobykpcmV0dXJuIG87aWYodHlwZW9mIGk9PSJmdW5jdGlvbiIpcmV0dXJuIGkocik7aWYobClyZXR1cm4gRnMuY3JlYXRlRWxlbWVudChsLHIpO3Rocm93IEVycm9yKCJyZWFjdC1lcnJvci1ib3VuZGFyeSByZXF1aXJlcyBlaXRoZXIgYSBmYWxsYmFjaywgZmFsbGJhY2tSZW5kZXIsIG9yIEZhbGxiYWNrQ29tcG9uZW50IHByb3AiKX1yZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbn0sdH0oRnMuQ29tcG9uZW50KSxwMj1mdW5jdGlvbih7Y2hpbGRyZW46ZSxvbkVycm9yOnR9KXtyZXR1cm4gRnMuY3JlYXRlRWxlbWVudChoMix7ZmFsbGJhY2s6RnMuY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6e2JvcmRlcjoiMXB4IHNvbGlkICNmMDAiLGNvbG9yOiIjZjAwIixwYWRkaW5nOiI4cHgifX0sIkFuIGVycm9yIHdhcyB0aHJvd24uIiksb25FcnJvcjp0fSxlKX07Y29uc3QgZzI9cDI7dmFyIG0yPWcyO2NvbnN0IHYyPSRhKG0yKTt2YXIgcm09e30sb209e30seTI9TnQsemU9Z2U7ZnVuY3Rpb24geDIoZSx0LG4scixvKXtpZihlPT09bnVsbHx8bi5zaXplPT09MCYmci5zaXplPT09MCYmIW8pcmV0dXJuIDA7dmFyIGk9dC5fc2VsZWN0aW9uLGw9ZS5fc2VsZWN0aW9uO2lmKG8pcmV0dXJuIDE7aWYoISh6ZS4kaXNSYW5nZVNlbGVjdGlvbihpKSYmemUuJGlzUmFuZ2VTZWxlY3Rpb24obCkmJmwuaXNDb2xsYXBzZWQoKSYmaS5pc0NvbGxhcHNlZCgpKSlyZXR1cm4gMDtvPXQuX25vZGVNYXA7bGV0IHM9W107Zm9yKGxldCBhIG9mIG4pbj1vLmdldChhKSxuIT09dm9pZCAwJiZzLnB1c2gobik7Zm9yKGxldFthLHVdb2Ygcil1JiYocj1vLmdldChhKSxyPT09dm9pZCAwfHx6ZS4kaXNSb290Tm9kZShyKXx8cy5wdXNoKHIpKTtyZXR1cm4gcy5sZW5ndGg9PT0wPzA6MTxzLmxlbmd0aD8ocj10Ll9ub2RlTWFwLHQ9ci5nZXQoaS5hbmNob3Iua2V5KSxsPXIuZ2V0KGwuYW5jaG9yLmtleSksdCYmbCYmIWUuX25vZGVNYXAuaGFzKHQuX19rZXkpJiZ6ZS4kaXNUZXh0Tm9kZSh0KSYmdC5fX3RleHQubGVuZ3RoPT09MSYmaS5hbmNob3Iub2Zmc2V0PT09MT8yOjApOih0PXNbMF0sZT1lLl9ub2RlTWFwLmdldCh0Ll9fa2V5KSwhemUuJGlzVGV4dE5vZGUoZSl8fCF6ZS4kaXNUZXh0Tm9kZSh0KXx8ZS5fX21vZGUhPT10Ll9fbW9kZXx8KGU9ZS5fX3RleHQsdD10Ll9fdGV4dCxlPT09dCl8fChpPWkuYW5jaG9yLGw9bC5hbmNob3IsaS5rZXkhPT1sLmtleXx8aS50eXBlIT09InRleHQiKT8wOihpPWkub2Zmc2V0LGw9bC5vZmZzZXQsZT10Lmxlbmd0aC1lLmxlbmd0aCxlPT09MSYmbD09PWktMT8yOmU9PT0tMSYmbD09PWkrMT8zOmU9PT0tMSYmbD09PWk/NDowKSl9ZnVuY3Rpb24gXzIoZSx0KXtsZXQgbj1EYXRlLm5vdygpLHI9MDtyZXR1cm4obyxpLGwscyxhLHUpPT57bGV0IGM9RGF0ZS5ub3coKTtpZih1LmhhcygiaGlzdG9yaWMiKSlyZXR1cm4gcj0wLG49YywyO2xldCBkPXgyKG8saSxzLGEsZS5pc0NvbXBvc2luZygpKSxmPSgoKT0+e3ZhciBoPWw9PT1udWxsfHxsLmVkaXRvcj09PWUsZz11LmhhcygiaGlzdG9yeS1wdXNoIik7aWYoIWcmJmgmJnUuaGFzKCJoaXN0b3J5LW1lcmdlIikpcmV0dXJuIDA7aWYobz09PW51bGwpcmV0dXJuIDE7dmFyIG09aS5fc2VsZWN0aW9uO2lmKCEoMDxzLnNpemV8fDA8YS5zaXplKSlyZXR1cm4gbSE9PW51bGw/MDoyO2lmKGc9PT0hMSYmZCE9PTAmJmQ9PT1yJiZjPG4rdCYmaClyZXR1cm4gMDtpZihzLnNpemU9PT0xKXt7Zz1BcnJheS5mcm9tKHMpWzBdLGg9by5fbm9kZU1hcC5nZXQoZyksZz1pLl9ub2RlTWFwLmdldChnKSxtPW8uX3NlbGVjdGlvbjtsZXQgUz1pLl9zZWxlY3Rpb24sdj0hMTt6ZS4kaXNSYW5nZVNlbGVjdGlvbihtKSYmemUuJGlzUmFuZ2VTZWxlY3Rpb24oUykmJih2PW0uYW5jaG9yLnR5cGU9PT0iZWxlbWVudCImJm0uZm9jdXMudHlwZT09PSJlbGVtZW50IiYmUy5hbmNob3IudHlwZT09PSJ0ZXh0IiYmUy5mb2N1cy50eXBlPT09InRleHQiKSxoPSF2JiZ6ZS4kaXNUZXh0Tm9kZShoKSYmemUuJGlzVGV4dE5vZGUoZyk/aC5fX3R5cGU9PT1nLl9fdHlwZSYmaC5fX3RleHQ9PT1nLl9fdGV4dCYmaC5fX21vZGU9PT1nLl9fbW9kZSYmaC5fX2RldGFpbD09PWcuX19kZXRhaWwmJmguX19zdHlsZT09PWcuX19zdHlsZSYmaC5fX2Zvcm1hdD09PWcuX19mb3JtYXQmJmguX19wYXJlbnQ9PT1nLl9fcGFyZW50OiExfWlmKGgpcmV0dXJuIDB9cmV0dXJuIDF9KSgpO3JldHVybiBuPWMscj1kLGZ9fW9tLmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbCxyZWRvU3RhY2s6W10sdW5kb1N0YWNrOltdfX07b20ucmVnaXN0ZXJIaXN0b3J5PWZ1bmN0aW9uKGUsdCxuKXtsZXQgcj1fMihlLG4pO249KHtlZGl0b3JTdGF0ZTpsLHByZXZFZGl0b3JTdGF0ZTpzLGRpcnR5TGVhdmVzOmEsZGlydHlFbGVtZW50czp1LHRhZ3M6Y30pPT57Y29uc3QgZD10LmN1cnJlbnQsZj10LnJlZG9TdGFjayxoPXQudW5kb1N0YWNrLGc9ZD09PW51bGw/bnVsbDpkLmVkaXRvclN0YXRlO2lmKGQ9PT1udWxsfHxsIT09Zyl7aWYocz1yKHMsbCxkLGEsdSxjKSxzPT09MSlmLmxlbmd0aCE9PTAmJih0LnJlZG9TdGFjaz1bXSxlLmRpc3BhdGNoQ29tbWFuZCh6ZS5DQU5fUkVET19DT01NQU5ELCExKSksZCE9PW51bGwmJihoLnB1c2goey4uLmR9KSxlLmRpc3BhdGNoQ29tbWFuZCh6ZS5DQU5fVU5ET19DT01NQU5ELCEwKSk7ZWxzZSBpZihzPT09MilyZXR1cm47dC5jdXJyZW50PXtlZGl0b3I6ZSxlZGl0b3JTdGF0ZTpsfX19O2xldCBvPXkyLm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoemUuVU5ET19DT01NQU5ELCgpPT57bGV0IGw9dC5yZWRvU3RhY2sscz10LnVuZG9TdGFjaztpZihzLmxlbmd0aCE9PTApe2xldCBhPXQuY3VycmVudCx1PXMucG9wKCk7YSE9PW51bGwmJihsLnB1c2goYSksZS5kaXNwYXRjaENvbW1hbmQoemUuQ0FOX1JFRE9fQ09NTUFORCwhMCkpLHMubGVuZ3RoPT09MCYmZS5kaXNwYXRjaENvbW1hbmQoemUuQ0FOX1VORE9fQ09NTUFORCwhMSksdC5jdXJyZW50PXV8fG51bGwsdSYmdS5lZGl0b3Iuc2V0RWRpdG9yU3RhdGUodS5lZGl0b3JTdGF0ZSx7dGFnOiJoaXN0b3JpYyJ9KX1yZXR1cm4hMH0semUuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKHplLlJFRE9fQ09NTUFORCwoKT0+e2xldCBsPXQucmVkb1N0YWNrO3ZhciBzPXQudW5kb1N0YWNrO2lmKGwubGVuZ3RoIT09MCl7bGV0IGE9dC5jdXJyZW50O2EhPT1udWxsJiYocy5wdXNoKGEpLGUuZGlzcGF0Y2hDb21tYW5kKHplLkNBTl9VTkRPX0NPTU1BTkQsITApKSxzPWwucG9wKCksbC5sZW5ndGg9PT0wJiZlLmRpc3BhdGNoQ29tbWFuZCh6ZS5DQU5fUkVET19DT01NQU5ELCExKSx0LmN1cnJlbnQ9c3x8bnVsbCxzJiZzLmVkaXRvci5zZXRFZGl0b3JTdGF0ZShzLmVkaXRvclN0YXRlLHt0YWc6Imhpc3RvcmljIn0pfXJldHVybiEwfSx6ZS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoemUuQ0xFQVJfRURJVE9SX0NPTU1BTkQsKCk9Pih0LnVuZG9TdGFjaz1bXSx0LnJlZG9TdGFjaz1bXSx0LmN1cnJlbnQ9bnVsbCwhMSksemUuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKHplLkNMRUFSX0hJU1RPUllfQ09NTUFORCwoKT0+KHQudW5kb1N0YWNrPVtdLHQucmVkb1N0YWNrPVtdLHQuY3VycmVudD1udWxsLGUuZGlzcGF0Y2hDb21tYW5kKHplLkNBTl9SRURPX0NPTU1BTkQsITEpLGUuZGlzcGF0Y2hDb21tYW5kKHplLkNBTl9VTkRPX0NPTU1BTkQsITEpLCEwKSx6ZS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKG4pKSxpPWUucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcihuKTtyZXR1cm4oKT0+e28oKSxpKCl9fTtjb25zdCB3Mj1vbTt2YXIgUzI9dzIsQzI9cnIsaXA9UzIsQnk9cDtmdW5jdGlvbiBFMihlLHQsbj0xZTMpe2xldCByPUJ5LnVzZU1lbW8oKCk9PnR8fGlwLmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlKCksW3RdKTtCeS51c2VFZmZlY3QoKCk9PmlwLnJlZ2lzdGVySGlzdG9yeShlLHIsbiksW24sZSxyXSl9cm0uY3JlYXRlRW1wdHlIaXN0b3J5U3RhdGU9aXAuY3JlYXRlRW1wdHlIaXN0b3J5U3RhdGU7cm0uSGlzdG9yeVBsdWdpbj1mdW5jdGlvbih7ZXh0ZXJuYWxIaXN0b3J5U3RhdGU6ZX0pe2xldFt0XT1DMi51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIEUyKHQsZSksbnVsbH07Y29uc3QgJDI9cm07dmFyIGsyPSQyLG9TPXt9LFQyPXJyLEJzPXAsTjI9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiP0JzLnVzZUxheW91dEVmZmVjdDpCcy51c2VFZmZlY3Q7ZnVuY3Rpb24gYjIoZSl7bGV0W3RdPVQyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKSxuPUJzLnVzZU1lbW8oKCk9PmUodCksW3QsZV0pLHI9QnMudXNlUmVmKG4uaW5pdGlhbFZhbHVlRm4oKSksW28saV09QnMudXNlU3RhdGUoci5jdXJyZW50KTtyZXR1cm4gTjIoKCk9PntsZXR7aW5pdGlhbFZhbHVlRm46bCxzdWJzY3JpYmU6c309bixhPWwoKTtyZXR1cm4gci5jdXJyZW50IT09YSYmKHIuY3VycmVudD1hLGkoYSkpLHModT0+e3IuY3VycmVudD11LGkodSl9KX0sW24sZV0pLG99ZnVuY3Rpb24gUjIoZSl7cmV0dXJue2luaXRpYWxWYWx1ZUZuOigpPT5lLmlzRWRpdGFibGUoKSxzdWJzY3JpYmU6dD0+ZS5yZWdpc3RlckVkaXRhYmxlTGlzdGVuZXIodCl9fXZhciBQMj1mdW5jdGlvbigpe3JldHVybiBiMihSMil9O2NvbnN0IE8yPVAyO3ZhciBBMj1PMixGbz17fSxRdD1nZTtmdW5jdGlvbiBpbShlLHQ9ITApe3JldHVybiBlPyExOihlPWlTKCksdCYmKGU9ZS50cmltKCkpLGU9PT0iIil9ZnVuY3Rpb24gaVMoKXtyZXR1cm4gUXQuJGdldFJvb3QoKS5nZXRUZXh0Q29udGVudCgpfWZ1bmN0aW9uIGxTKGUpe2lmKCFpbShlLCExKSlyZXR1cm4hMTtlPVF0LiRnZXRSb290KCkuZ2V0Q2hpbGRyZW4oKTtsZXQgdD1lLmxlbmd0aDtpZigxPHQpcmV0dXJuITE7Zm9yKGxldCByPTA7cjx0O3IrKyl7dmFyIG49ZVtyXTtpZihRdC4kaXNEZWNvcmF0b3JOb2RlKG4pKXJldHVybiExO2lmKFF0LiRpc0VsZW1lbnROb2RlKG4pKXtpZighUXQuJGlzUGFyYWdyYXBoTm9kZShuKXx8bi5fX2luZGVudCE9PTApcmV0dXJuITE7bj1uLmdldENoaWxkcmVuKCk7bGV0IG89bi5sZW5ndGg7Zm9yKGxldCBpPTA7aTxvO2krKylpZighUXQuJGlzVGV4dE5vZGUobltyXSkpcmV0dXJuITF9fXJldHVybiEwfUZvLiRjYW5TaG93UGxhY2Vob2xkZXI9bFM7Rm8uJGNhblNob3dQbGFjZWhvbGRlckN1cnJ5PWZ1bmN0aW9uKGUpe3JldHVybigpPT5sUyhlKX07Rm8uJGZpbmRUZXh0SW50ZXJzZWN0aW9uRnJvbUNoYXJhY3RlcnM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmdldEZpcnN0Q2hpbGQoKTtlPTA7ZTpmb3IoO24hPT1udWxsOyl7aWYoUXQuJGlzRWxlbWVudE5vZGUobikpe3ZhciByPW4uZ2V0Rmlyc3RDaGlsZCgpO2lmKHIhPT1udWxsKXtuPXI7Y29udGludWV9fWVsc2UgaWYoUXQuJGlzVGV4dE5vZGUobikpe2lmKHI9bi5nZXRUZXh0Q29udGVudFNpemUoKSxlK3I+dClyZXR1cm57bm9kZTpuLG9mZnNldDp0LWV9O2UrPXJ9aWYocj1uLmdldE5leHRTaWJsaW5nKCksciE9PW51bGwpbj1yO2Vsc2V7Zm9yKG49bi5nZXRQYXJlbnQoKTtuIT09bnVsbDspe2lmKHI9bi5nZXROZXh0U2libGluZygpLHIhPT1udWxsKXtuPXI7Y29udGludWUgZX1uPW4uZ2V0UGFyZW50KCl9YnJlYWt9fXJldHVybiBudWxsfTtGby4kaXNSb290VGV4dENvbnRlbnRFbXB0eT1pbTtGby4kaXNSb290VGV4dENvbnRlbnRFbXB0eUN1cnJ5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuKCk9PmltKGUsdCl9O0ZvLiRyb290VGV4dENvbnRlbnQ9aVM7Rm8ucmVnaXN0ZXJMZXhpY2FsVGV4dEVudGl0eT1mdW5jdGlvbihlLHQsbixyKXtsZXQgbz1sPT57Y29uc3Qgcz1RdC4kY3JlYXRlVGV4dE5vZGUobC5nZXRUZXh0Q29udGVudCgpKTtzLnNldEZvcm1hdChsLmdldEZvcm1hdCgpKSxsLnJlcGxhY2Uocyl9LGk9ZS5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0oUXQuVGV4dE5vZGUsbD0+e2lmKGwuaXNTaW1wbGVUZXh0KCkpe3ZhciBzPWwuZ2V0UHJldmlvdXNTaWJsaW5nKCksYT1sLmdldFRleHRDb250ZW50KCksdT1sO2lmKFF0LiRpc1RleHROb2RlKHMpKXt2YXIgYz1zLmdldFRleHRDb250ZW50KCksZD10KGMrYSk7aWYocyBpbnN0YW5jZW9mIG4pe2lmKGQ9PT1udWxsfHxzLmdldExhdGVzdCgpLl9fbW9kZSE9PTApe28ocyk7cmV0dXJufWlmKGQ9ZC5lbmQtYy5sZW5ndGgsMDxkKXt1PWEuc2xpY2UoMCxkKSx1PWMrdSxzLnNlbGVjdCgpLHMuc2V0VGV4dENvbnRlbnQodSksZD09PWEubGVuZ3RoP2wucmVtb3ZlKCk6KHM9YS5zbGljZShkKSxsLnNldFRleHRDb250ZW50KHMpKTtyZXR1cm59fWVsc2UgaWYoZD09PW51bGx8fGQuc3RhcnQ8Yy5sZW5ndGgpcmV0dXJufWZvcig7Oyl7aWYobD10KGEpLGE9ZD1sPT09bnVsbD8iIjphLnNsaWNlKGwuZW5kKSxkPT09IiIpe2lmKGM9dS5nZXROZXh0U2libGluZygpLFF0LiRpc1RleHROb2RlKGMpKXtpZihkPXUuZ2V0VGV4dENvbnRlbnQoKStjLmdldFRleHRDb250ZW50KCksZD10KGQpLGQ9PT1udWxsKXtjIGluc3RhbmNlb2Ygbj9vKGMpOmMubWFya0RpcnR5KCk7YnJlYWt9ZWxzZSBpZihkLnN0YXJ0IT09MClicmVha319ZWxzZSBpZihjPXQoZCksYyE9PW51bGwmJmMuc3RhcnQ9PT0wKWJyZWFrO2lmKGw9PT1udWxsKWJyZWFrO2lmKGwuc3RhcnQ9PT0wJiZRdC4kaXNUZXh0Tm9kZShzKSYmcy5pc1RleHRFbnRpdHkoKSljb250aW51ZTtsZXQgZjtpZihsLnN0YXJ0PT09MD9bZix1XT11LnNwbGl0VGV4dChsLmVuZCk6WyxmLHVdPXUuc3BsaXRUZXh0KGwuc3RhcnQsbC5lbmQpLGw9cihmKSxsLnNldEZvcm1hdChmLmdldEZvcm1hdCgpKSxmLnJlcGxhY2UobCksdT09bnVsbClicmVha319fSk7cmV0dXJuIGU9ZS5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0obixsPT57dmFyIHM9bC5nZXRUZXh0Q29udGVudCgpO2NvbnN0IGE9dChzKTthPT09bnVsbHx8YS5zdGFydCE9PTA/byhsKTpzLmxlbmd0aD5hLmVuZD9sLnNwbGl0VGV4dChhLmVuZCk6KHM9bC5nZXRQcmV2aW91c1NpYmxpbmcoKSxRdC4kaXNUZXh0Tm9kZShzKSYmcy5pc1RleHRFbnRpdHkoKSYmKG8ocyksbyhsKSkscz1sLmdldE5leHRTaWJsaW5nKCksUXQuJGlzVGV4dE5vZGUocykmJnMuaXNUZXh0RW50aXR5KCkmJihvKHMpLGwgaW5zdGFuY2VvZiBuJiZvKGwpKSl9KSxbaSxlXX07Y29uc3QgTTI9Rm87dmFyIEQyPU0yLHNTPXt9LHB1PWdlO3NTLnJlZ2lzdGVyRHJhZ29uU3VwcG9ydD1mdW5jdGlvbihlKXtsZXQgdD13aW5kb3cubG9jYXRpb24ub3JpZ2luLG49cj0+e2lmKHIub3JpZ2luPT09dCl7dmFyIG89ZS5nZXRSb290RWxlbWVudCgpO2lmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1vJiYobz1yLmRhdGEsdHlwZW9mIG89PSJzdHJpbmciKSl7dHJ5e3ZhciBpPUpTT04ucGFyc2Uobyl9Y2F0Y2h7cmV0dXJufWlmKGkmJmkucHJvdG9jb2w9PT0ibnVhbnJpYV9tZXNzYWdpbmciJiZpLnR5cGU9PT0icmVxdWVzdCImJihpPWkucGF5bG9hZCkmJmkuZnVuY3Rpb25JZD09PSJtYWtlQ2hhbmdlcyImJihpPWkuYXJncykpe2NvbnN0W2wscyxhLHUsY109aTtlLnVwZGF0ZSgoKT0+e2NvbnN0IGQ9cHUuJGdldFNlbGVjdGlvbigpO2lmKHB1LiRpc1JhbmdlU2VsZWN0aW9uKGQpKXt2YXIgZj1kLmFuY2hvcjtsZXQgaD1mLmdldE5vZGUoKSxnPTAsbT0wO3B1LiRpc1RleHROb2RlKGgpJiYwPD1sJiYwPD1zJiYoZz1sLG09bCtzLGQuc2V0VGV4dE5vZGVSYW5nZShoLGcsaCxtKSksKGchPT1tfHxhIT09IiIpJiYoZC5pbnNlcnRSYXdUZXh0KGEpLGg9Zi5nZXROb2RlKCkpLHB1LiRpc1RleHROb2RlKGgpJiYoZz11LG09dStjLGY9aC5nZXRUZXh0Q29udGVudFNpemUoKSxnPWc+Zj9mOmcsbT1tPmY/ZjptLGQuc2V0VGV4dE5vZGVSYW5nZShoLGcsaCxtKSksci5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX19KX19fX07cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuLCEwKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuLCEwKX19O2NvbnN0IEwyPXNTO3ZhciBJMj1MMiwkcj17fSxZcj17fSxsbT17fSxXeT1PbyxqMj1OdCxubD1nZTtmdW5jdGlvbiBhUyhlLHQsbixyPW51bGwpe2xldCBvPXIhPW51bGw/dC5pc1NlbGVjdGVkKHIpOiEwLGk9bmwuJGlzRWxlbWVudE5vZGUodCkmJnQuZXhjbHVkZUZyb21Db3B5KCJodG1sIik7dmFyIGw9dDtyIT09bnVsbCYmKGw9V3kuJGNsb25lV2l0aFByb3BlcnRpZXModCksbD1ubC4kaXNUZXh0Tm9kZShsKSYmciE9bnVsbD9XeS4kc2xpY2VTZWxlY3RlZFRleHROb2RlQ29udGVudChyLGwpOmwpO2xldCBzPW5sLiRpc0VsZW1lbnROb2RlKGwpP2wuZ2V0Q2hpbGRyZW4oKTpbXSx7ZWxlbWVudDphLGFmdGVyOnV9PWwuZXhwb3J0RE9NKGUpO2lmKCFhKXJldHVybiExO2xldCBjPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IobGV0IGQ9MDtkPHMubGVuZ3RoO2QrKyl7bGV0IGY9c1tkXSxoPWFTKGUsZixjLHIpOyFvJiZubC4kaXNFbGVtZW50Tm9kZSh0KSYmaCYmdC5leHRyYWN0V2l0aENoaWxkKGYsciwiaHRtbCIpJiYobz0hMCl9cmV0dXJuIG8mJiFpPyhqMi5pc0hUTUxFbGVtZW50KGEpJiZhLmFwcGVuZChjKSxuLmFwcGVuZChhKSx1JiYoZT11LmNhbGwobCxhKSkmJmEucmVwbGFjZVdpdGgoZSkpOm4uYXBwZW5kKGMpLG99bGV0IHVTPW5ldyBTZXQoWyJTVFlMRSIsIlNDUklQVCJdKTtmdW5jdGlvbiBjUyhlLHQsbj1uZXcgTWFwLHIpe2xldCBvPVtdO2lmKHVTLmhhcyhlLm5vZGVOYW1lKSlyZXR1cm4gbztsZXQgaT1udWxsO3ZhciBsLHtub2RlTmFtZTpzfT1lLGE9dC5faHRtbENvbnZlcnNpb25zLmdldChzLnRvTG93ZXJDYXNlKCkpO2lmKHM9bnVsbCxhIT09dm9pZCAwKWZvcihsIG9mIGEpYT1sKGUpLGEhPT1udWxsJiYocz09PW51bGx8fHMucHJpb3JpdHk8YS5wcmlvcml0eSkmJihzPWEpO2lmKHM9KGw9cyE9PW51bGw/cy5jb252ZXJzaW9uOm51bGwpP2woZSk6bnVsbCxsPW51bGwscyE9PW51bGwpe2lmKGw9cy5hZnRlcixhPXMubm9kZSxpPUFycmF5LmlzQXJyYXkoYSk/YVthLmxlbmd0aC0xXTphLGkhPT1udWxsKXtmb3IodmFyWyx1XW9mIG4paWYoaT11KGksciksIWkpYnJlYWs7aSYmby5wdXNoKC4uLkFycmF5LmlzQXJyYXkoYSk/YTpbaV0pfXMuZm9yQ2hpbGQhPW51bGwmJm4uc2V0KGUubm9kZU5hbWUscy5mb3JDaGlsZCl9Zm9yKGU9ZS5jaGlsZE5vZGVzLHI9W10sdT0wO3U8ZS5sZW5ndGg7dSsrKXIucHVzaCguLi5jUyhlW3VdLHQsbmV3IE1hcChuKSxpKSk7cmV0dXJuIGwhPW51bGwmJihyPWwocikpLGk9PW51bGw/bz1vLmNvbmNhdChyKTpubC4kaXNFbGVtZW50Tm9kZShpKSYmaS5hcHBlbmQoLi4uciksb31sbS4kZ2VuZXJhdGVIdG1sRnJvbU5vZGVzPWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIGRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdz4idSIpdGhyb3cgRXJyb3IoIlRvIHVzZSAkZ2VuZXJhdGVIdG1sRnJvbU5vZGVzIGluIGhlYWRsZXNzIG1vZGUgcGxlYXNlIGluaXRpYWxpemUgYSBoZWFkbGVzcyBicm93c2VyIGltcGxlbWVudGF0aW9uIHN1Y2ggYXMgSlNEb20gYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4iKTtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxyPW5sLiRnZXRSb290KCkuZ2V0Q2hpbGRyZW4oKTtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKylhUyhlLHJbb10sbix0KTtyZXR1cm4gbi5pbm5lckhUTUx9O2xtLiRnZW5lcmF0ZU5vZGVzRnJvbURPTT1mdW5jdGlvbihlLHQpe3Q9dC5ib2R5P3QuYm9keS5jaGlsZE5vZGVzOltdO2xldCBuPVtdO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXt2YXIgcj10W29dO3VTLmhhcyhyLm5vZGVOYW1lKXx8KHI9Y1MocixlKSxyIT09bnVsbCYmKG49bi5jb25jYXQocikpKX1yZXR1cm4gbn07Y29uc3QgejI9bG07dmFyIEYyPXoyLGRTPUYyLGxwPU9vLHBsPU50LHVlPWdlO2Z1bmN0aW9uIEFyKGUpe2xldCB0PW5ldyBVUkxTZWFyY2hQYXJhbXM7dC5hcHBlbmQoImNvZGUiLGUpO2ZvcihsZXQgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdC5hcHBlbmQoInYiLGFyZ3VtZW50c1tuXSk7dGhyb3cgRXJyb3IoYE1pbmlmaWVkIExleGljYWwgZXJyb3IgIyR7ZX07IHZpc2l0IGh0dHBzOi8vbGV4aWNhbC5kZXYvZG9jcy9lcnJvcj8ke3R9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5gKX1sZXQgZlM9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiO2Z1bmN0aW9uIGhTKGUpe2xldCB0PXVlLiRnZXRTZWxlY3Rpb24oKTtpZih0PT1udWxsKXRocm93IEVycm9yKCJFeHBlY3RlZCB2YWxpZCBMZXhpY2FsU2VsZWN0aW9uIik7cmV0dXJuIHVlLiRpc1JhbmdlU2VsZWN0aW9uKHQpJiZ0LmlzQ29sbGFwc2VkKCl8fHQuZ2V0Tm9kZXMoKS5sZW5ndGg9PT0wPyIiOmRTLiRnZW5lcmF0ZUh0bWxGcm9tTm9kZXMoZSx0KX1mdW5jdGlvbiBwUyhlKXtsZXQgdD11ZS4kZ2V0U2VsZWN0aW9uKCk7aWYodD09bnVsbCl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgdmFsaWQgTGV4aWNhbFNlbGVjdGlvbiIpO3JldHVybiB1ZS4kaXNSYW5nZVNlbGVjdGlvbih0KSYmdC5pc0NvbGxhcHNlZCgpfHx0LmdldE5vZGVzKCkubGVuZ3RoPT09MD9udWxsOkpTT04uc3RyaW5naWZ5KG1TKGUsdCkpfWZ1bmN0aW9uIHNwKGUsdCxuKXsodWUuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pfHxwbC4kZmluZE1hdGNoaW5nUGFyZW50KG4uYW5jaG9yLmdldE5vZGUoKSxyPT51ZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZShyKSkhPT1udWxsJiZwbC4kZmluZE1hdGNoaW5nUGFyZW50KG4uZm9jdXMuZ2V0Tm9kZSgpLHI9PnVlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKHIpKSE9PW51bGwpJiZ0Lmxlbmd0aD09PTEmJnVlLkRFUFJFQ0FURURfJGlzR3JpZE5vZGUodFswXSk/VzIodCxuLCExLGUpOkIyKHQsbil9ZnVuY3Rpb24gQjIoZSx0KXtsZXQgbj1bXSxyPW51bGw7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspe2xldCBpPWVbb10sbD11ZS4kaXNMaW5lQnJlYWtOb2RlKGkpO2lmKGx8fHVlLiRpc0RlY29yYXRvck5vZGUoaSkmJmkuaXNJbmxpbmUoKXx8dWUuJGlzRWxlbWVudE5vZGUoaSkmJmkuaXNJbmxpbmUoKXx8dWUuJGlzVGV4dE5vZGUoaSl8fGkuaXNQYXJlbnRSZXF1aXJlZCgpKXtpZihyPT09bnVsbCYmKHI9aS5jcmVhdGVQYXJlbnRFbGVtZW50Tm9kZSgpLG4ucHVzaChyKSxsKSljb250aW51ZTtyIT09bnVsbCYmci5hcHBlbmQoaSl9ZWxzZSBuLnB1c2goaSkscj1udWxsfXVlLiRpc1JhbmdlU2VsZWN0aW9uKHQpP3QuaW5zZXJ0Tm9kZXMobik6dWUuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKHQpJiYoZT10LmFuY2hvci5nZXROb2RlKCksdWUuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUoZSl8fEFyKDQxKSxlLmFwcGVuZCguLi5uKSl9ZnVuY3Rpb24gVzIoZSx0LG4scil7ZS5sZW5ndGg9PT0xJiZ1ZS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKGVbMF0pfHxBcig0Mik7dmFyIG89ZVswXTtlPW8uZ2V0Q2hpbGRyZW4oKSxuPW8uZ2V0Rmlyc3RDaGlsZE9yVGhyb3coKS5nZXRDaGlsZHJlblNpemUoKTt2YXIgaT1vLmdldENoaWxkcmVuU2l6ZSgpLGw9cGwuJGZpbmRNYXRjaGluZ1BhcmVudCh0LmFuY2hvci5nZXROb2RlKCksaD0+dWUuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUoaCkpO3Q9KG89bCYmcGwuJGZpbmRNYXRjaGluZ1BhcmVudChsLGg9PnVlLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoaCkpKSYmcGwuJGZpbmRNYXRjaGluZ1BhcmVudChvLGg9PnVlLkRFUFJFQ0FURURfJGlzR3JpZE5vZGUoaCkpLHVlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGwpJiZ1ZS5ERVBSRUNBVEVEXyRpc0dyaWRSb3dOb2RlKG8pJiZ1ZS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKHQpfHxBcig0Myk7dmFyIHM9by5nZXRJbmRleFdpdGhpblBhcmVudCgpLGE9TWF0aC5taW4odC5nZXRDaGlsZHJlblNpemUoKS0xLHMraS0xKTtpPWwuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxsPU1hdGgubWluKG8uZ2V0Q2hpbGRyZW5TaXplKCktMSxpK24tMSksbj1NYXRoLm1pbihpLGwpLG89TWF0aC5taW4ocyxhKSxpPU1hdGgubWF4KGksbCkscz1NYXRoLm1heChzLGEpLGE9dC5nZXRDaGlsZHJlbigpLGw9MDtsZXQgdSxjO2ZvcihsZXQgaD1vO2g8PXM7aCsrKXt2YXIgZD1hW2hdO3VlLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoZCl8fEFyKDI0KTt2YXIgZj1lW2xdO3VlLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoZil8fEFyKDI0KSxkPWQuZ2V0Q2hpbGRyZW4oKSxmPWYuZ2V0Q2hpbGRyZW4oKTtsZXQgZz0wO2ZvcihsZXQgbT1uO208PWk7bSsrKXtsZXQgUz1kW21dO3VlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKFMpfHxBcigyNSk7bGV0IHY9ZltnXTt1ZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZSh2KXx8QXIoMjUpLGg9PT1vJiZtPT09bj91PVMuZ2V0S2V5KCk6aD09PXMmJm09PT1pJiYoYz1TLmdldEtleSgpKTtsZXQgeT1TLmdldENoaWxkcmVuKCk7di5nZXRDaGlsZHJlbigpLmZvckVhY2goXz0+e3VlLiRpc1RleHROb2RlKF8pJiZ1ZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLmFwcGVuZChfKSxTLmFwcGVuZChfKX0pLHkuZm9yRWFjaChfPT5fLnJlbW92ZSgpKSxnKyt9bCsrfXUmJmMmJihlPXVlLkRFUFJFQ0FURURfJGNyZWF0ZUdyaWRTZWxlY3Rpb24oKSxlLnNldCh0LmdldEtleSgpLHUsYyksdWUuJHNldFNlbGVjdGlvbihlKSxyLmRpc3BhdGNoQ29tbWFuZCh1ZS5TRUxFQ1RJT05fQ0hBTkdFX0NPTU1BTkQsdm9pZCAwKSl9ZnVuY3Rpb24gZ1MoZSx0LG4scj1bXSl7bGV0IG89dCE9bnVsbD9uLmlzU2VsZWN0ZWQodCk6ITAsaT11ZS4kaXNFbGVtZW50Tm9kZShuKSYmbi5leGNsdWRlRnJvbUNvcHkoImh0bWwiKTt2YXIgbD1uO2lmKHQhPT1udWxsKXt2YXIgcz1scC4kY2xvbmVXaXRoUHJvcGVydGllcyhuKTtsPXM9dWUuJGlzVGV4dE5vZGUocykmJnQhPW51bGw/bHAuJHNsaWNlU2VsZWN0ZWRUZXh0Tm9kZUNvbnRlbnQodCxzKTpzfWxldCBhPXVlLiRpc0VsZW1lbnROb2RlKGwpP2wuZ2V0Q2hpbGRyZW4oKTpbXTt2YXIgdT1sO3M9dS5leHBvcnRKU09OKCk7dmFyIGM9dS5jb25zdHJ1Y3RvcjtzLnR5cGUhPT1jLmdldFR5cGUoKSYmQXIoNTgsYy5uYW1lKTtsZXQgZD1zLmNoaWxkcmVuO2Zvcih1ZS4kaXNFbGVtZW50Tm9kZSh1KSYmKEFycmF5LmlzQXJyYXkoZCl8fEFyKDU5LGMubmFtZSkpLHVlLiRpc1RleHROb2RlKGwpJiYobD1sLl9fdGV4dCwwPGwubGVuZ3RoP3MudGV4dD1sOm89ITEpLGw9MDtsPGEubGVuZ3RoO2wrKyl1PWFbbF0sYz1nUyhlLHQsdSxzLmNoaWxkcmVuKSwhbyYmdWUuJGlzRWxlbWVudE5vZGUobikmJmMmJm4uZXh0cmFjdFdpdGhDaGlsZCh1LHQsImNsb25lIikmJihvPSEwKTtpZihvJiYhaSlyLnB1c2gocyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHMuY2hpbGRyZW4pKWZvcihlPTA7ZTxzLmNoaWxkcmVuLmxlbmd0aDtlKyspci5wdXNoKHMuY2hpbGRyZW5bZV0pO3JldHVybiBvfWZ1bmN0aW9uIG1TKGUsdCl7bGV0IG49W10scj11ZS4kZ2V0Um9vdCgpLmdldENoaWxkcmVuKCk7Zm9yKGxldCBvPTA7bzxyLmxlbmd0aDtvKyspZ1MoZSx0LHJbb10sbik7cmV0dXJue25hbWVzcGFjZTplLl9jb25maWcubmFtZXNwYWNlLG5vZGVzOm59fWZ1bmN0aW9uIHZTKGUpe2xldCB0PVtdO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj11ZS4kcGFyc2VTZXJpYWxpemVkTm9kZShlW25dKTt1ZS4kaXNUZXh0Tm9kZShyKSYmbHAuJGFkZE5vZGVTdHlsZShyKSx0LnB1c2gocil9cmV0dXJuIHR9bGV0IE1pPW51bGw7ZnVuY3Rpb24gVXkoZSx0KXt2YXIgbj1mUz8oZS5fd2luZG93fHx3aW5kb3cpLmdldFNlbGVjdGlvbigpOm51bGw7aWYoIW4pcmV0dXJuITE7dmFyIHI9bi5hbmNob3JOb2RlO2lmKG49bi5mb2N1c05vZGUsciE9PW51bGwmJm4hPT1udWxsJiYhdWUuaXNTZWxlY3Rpb25XaXRoaW5FZGl0b3IoZSxyLG4pfHwodC5wcmV2ZW50RGVmYXVsdCgpLHQ9dC5jbGlwYm9hcmREYXRhLHI9dWUuJGdldFNlbGVjdGlvbigpLHQ9PT1udWxsfHxyPT09bnVsbCkpcmV0dXJuITE7bj1oUyhlKSxlPXBTKGUpO2xldCBvPSIiO3JldHVybiByIT09bnVsbCYmKG89ci5nZXRUZXh0Q29udGVudCgpKSxuIT09bnVsbCYmdC5zZXREYXRhKCJ0ZXh0L2h0bWwiLG4pLGUhPT1udWxsJiZ0LnNldERhdGEoImFwcGxpY2F0aW9uL3gtbGV4aWNhbC1lZGl0b3IiLGUpLHQuc2V0RGF0YSgidGV4dC9wbGFpbiIsbyksITB9WXIuJGdlbmVyYXRlSlNPTkZyb21TZWxlY3RlZE5vZGVzPW1TO1lyLiRnZW5lcmF0ZU5vZGVzRnJvbVNlcmlhbGl6ZWROb2Rlcz12UztZci4kZ2V0SHRtbENvbnRlbnQ9aFM7WXIuJGdldExleGljYWxDb250ZW50PXBTO1lyLiRpbnNlcnREYXRhVHJhbnNmZXJGb3JQbGFpblRleHQ9ZnVuY3Rpb24oZSx0KXtlPWUuZ2V0RGF0YSgidGV4dC9wbGFpbiIpfHxlLmdldERhdGEoInRleHQvdXJpLWxpc3QiKSxlIT1udWxsJiZ0Lmluc2VydFJhd1RleHQoZSl9O1lyLiRpbnNlcnREYXRhVHJhbnNmZXJGb3JSaWNoVGV4dD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXREYXRhKCJhcHBsaWNhdGlvbi94LWxleGljYWwtZWRpdG9yIik7aWYocil0cnl7bGV0IGw9SlNPTi5wYXJzZShyKTtpZihsLm5hbWVzcGFjZT09PW4uX2NvbmZpZy5uYW1lc3BhY2UmJkFycmF5LmlzQXJyYXkobC5ub2Rlcykpe2xldCBzPXZTKGwubm9kZXMpO3JldHVybiBzcChuLHMsdCl9fWNhdGNoe31pZihyPWUuZ2V0RGF0YSgidGV4dC9odG1sIikpdHJ5e3ZhciBvPW5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcociwidGV4dC9odG1sIiksaT1kUy4kZ2VuZXJhdGVOb2Rlc0Zyb21ET00obixvKTtyZXR1cm4gc3AobixpLHQpfWNhdGNoe31pZihlPWUuZ2V0RGF0YSgidGV4dC9wbGFpbiIpfHxlLmdldERhdGEoInRleHQvdXJpLWxpc3QiKSxlIT1udWxsKWlmKHVlLiRpc1JhbmdlU2VsZWN0aW9uKHQpKWZvcihlPWUuc3BsaXQoLyhccj9cbnxcdCkvKSxuPWUubGVuZ3RoLG89MDtvPG47bysrKWk9ZVtvXSxpPT09YApgfHxpPT09YFxyCmA/dC5pbnNlcnRQYXJhZ3JhcGgoKTppPT09IgkiP3QuaW5zZXJ0Tm9kZXMoW3VlLiRjcmVhdGVUYWJOb2RlKCldKTp0Lmluc2VydFRleHQoaSk7ZWxzZSB0Lmluc2VydFJhd1RleHQoZSl9O1lyLiRpbnNlcnRHZW5lcmF0ZWROb2Rlcz1zcDtZci5jb3B5VG9DbGlwYm9hcmQ9YXN5bmMgZnVuY3Rpb24oZSx0KXtpZihNaSE9PW51bGwpcmV0dXJuITE7aWYodCE9PW51bGwpcmV0dXJuIG5ldyBQcm9taXNlKGw9PntlLnVwZGF0ZSgoKT0+e2woVXkoZSx0KSl9KX0pO3ZhciBuPWUuZ2V0Um9vdEVsZW1lbnQoKTtsZXQgcj1lLl93aW5kb3c9PW51bGw/d2luZG93LmRvY3VtZW50OmUuX3dpbmRvdy5kb2N1bWVudCxvPWZTPyhlLl93aW5kb3d8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCk6bnVsbDtpZihuPT09bnVsbHx8bz09PW51bGwpcmV0dXJuITE7bGV0IGk9ci5jcmVhdGVFbGVtZW50KCJzcGFuIik7cmV0dXJuIGkuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246IGZpeGVkOyB0b3A6IC0xMDAwcHg7IixpLmFwcGVuZChyLmNyZWF0ZVRleHROb2RlKCIjIikpLG4uYXBwZW5kKGkpLG49bmV3IFJhbmdlLG4uc2V0U3RhcnQoaSwwKSxuLnNldEVuZChpLDEpLG8ucmVtb3ZlQWxsUmFuZ2VzKCksby5hZGRSYW5nZShuKSxuZXcgUHJvbWlzZShsPT57bGV0IHM9ZS5yZWdpc3RlckNvbW1hbmQodWUuQ09QWV9DT01NQU5ELGE9PihwbC5vYmplY3RLbGFzc0VxdWFscyhhLENsaXBib2FyZEV2ZW50KSYmKHMoKSxNaSE9PW51bGwmJih3aW5kb3cuY2xlYXJUaW1lb3V0KE1pKSxNaT1udWxsKSxsKFV5KGUsYSkpKSwhMCksdWUuQ09NTUFORF9QUklPUklUWV9DUklUSUNBTCk7TWk9d2luZG93LnNldFRpbWVvdXQoKCk9PntzKCksTWk9bnVsbCxsKCExKX0sNTApLHIuZXhlY0NvbW1hbmQoImNvcHkiKSxpLnJlbW92ZSgpfSl9O2NvbnN0IFUyPVlyO3ZhciBWMj1VMixSYz1WMixndT1Pbyxkcj1OdCxiPWdlO2Z1bmN0aW9uIFZ5KGUsdCl7cmV0dXJuIHR5cGVvZiBkb2N1bWVudC5jYXJldFJhbmdlRnJvbVBvaW50PCJ1Ij8oZT1kb2N1bWVudC5jYXJldFJhbmdlRnJvbVBvaW50KGUsdCksZT09PW51bGw/bnVsbDp7bm9kZTplLnN0YXJ0Q29udGFpbmVyLG9mZnNldDplLnN0YXJ0T2Zmc2V0fSk6ZG9jdW1lbnQuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCE9PSJ1bmRlZmluZWQiPyhlPWRvY3VtZW50LmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQoZSx0KSxlPT09bnVsbD9udWxsOntub2RlOmUub2Zmc2V0Tm9kZSxvZmZzZXQ6ZS5vZmZzZXR9KTpudWxsfWxldCBLbD10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudDwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSIsSDI9S2wmJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQ/ZG9jdW1lbnQuZG9jdW1lbnRNb2RlOm51bGwsSzI9S2wmJiJJbnB1dEV2ZW50ImluIHdpbmRvdyYmIUgyPyJnZXRUYXJnZXRSYW5nZXMiaW4gbmV3IHdpbmRvdy5JbnB1dEV2ZW50KCJpbnB1dCIpOiExLEcyPUtsJiYvVmVyc2lvblwvW1xkLl0rLipTYWZhcmkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksWTI9S2wmJi9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhd2luZG93Lk1TU3RyZWFtLFgyPUtsJiYvXig/PS4qQ2hyb21lKS4qL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxRMj1LbCYmL0FwcGxlV2ViS2l0XC9bXGQuXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiFYMixhcD1iLmNyZWF0ZUNvbW1hbmQoIkRSQUdfRFJPUF9QQVNURV9GSUxFIiksc209Y2xhc3MgeVMgZXh0ZW5kcyBiLkVsZW1lbnROb2Rle3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInF1b3RlIn1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyB5Uyh0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1jcmVhdGVET00odCl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYmxvY2txdW90ZSIpO3JldHVybiBkci5hZGRDbGFzc05hbWVzVG9FbGVtZW50KG4sdC50aGVtZS5xdW90ZSksbn11cGRhdGVET00oKXtyZXR1cm4hMX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJue2Jsb2NrcXVvdGU6KCk9Pih7Y29udmVyc2lvbjpKMixwcmlvcml0eTowfSl9fWV4cG9ydERPTSh0KXtpZih7ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCYmZHIuaXNIVE1MRWxlbWVudCh0KSl7dGhpcy5pc0VtcHR5KCkmJnQuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpO3ZhciBuPXRoaXMuZ2V0Rm9ybWF0VHlwZSgpO3Quc3R5bGUudGV4dEFsaWduPW4sKG49dGhpcy5nZXREaXJlY3Rpb24oKSkmJih0LmRpcj1uKX1yZXR1cm57ZWxlbWVudDp0fX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgbj1hbSgpO3JldHVybiBuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXRJbmRlbnQodC5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxufWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLHR5cGU6InF1b3RlIn19aW5zZXJ0TmV3QWZ0ZXIodCxuKXt0PWIuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKTtsZXQgcj10aGlzLmdldERpcmVjdGlvbigpO3JldHVybiB0LnNldERpcmVjdGlvbihyKSx0aGlzLmluc2VydEFmdGVyKHQsbiksdH1jb2xsYXBzZUF0U3RhcnQoKXtsZXQgdD1iLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKG49PnQuYXBwZW5kKG4pKSx0aGlzLnJlcGxhY2UodCksITB9fTtmdW5jdGlvbiBhbSgpe3JldHVybiBiLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgc20pfWxldCB1bT1jbGFzcyB4UyBleHRlbmRzIGIuRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4iaGVhZGluZyJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgeFModC5fX3RhZyx0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKG4pLHRoaXMuX190YWc9dH1nZXRUYWcoKXtyZXR1cm4gdGhpcy5fX3RhZ31jcmVhdGVET00odCl7bGV0IG49dGhpcy5fX3RhZyxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobik7cmV0dXJuIHQ9dC50aGVtZS5oZWFkaW5nLHQhPT12b2lkIDAmJmRyLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQocix0W25dKSxyfXVwZGF0ZURPTSgpe3JldHVybiExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57aDE6KCk9Pih7Y29udmVyc2lvbjpEaSxwcmlvcml0eTowfSksaDI6KCk9Pih7Y29udmVyc2lvbjpEaSxwcmlvcml0eTowfSksaDM6KCk9Pih7Y29udmVyc2lvbjpEaSxwcmlvcml0eTowfSksaDQ6KCk9Pih7Y29udmVyc2lvbjpEaSxwcmlvcml0eTowfSksaDU6KCk9Pih7Y29udmVyc2lvbjpEaSxwcmlvcml0eTowfSksaDY6KCk9Pih7Y29udmVyc2lvbjpEaSxwcmlvcml0eTowfSkscDp0PT4odD10LmZpcnN0Q2hpbGQsdCE9PW51bGwmJkh5KHQpP3tjb252ZXJzaW9uOigpPT4oe25vZGU6bnVsbH0pLHByaW9yaXR5OjN9Om51bGwpLHNwYW46dD0+SHkodCk/e2NvbnZlcnNpb246KCk9Pih7bm9kZTpybCgiaDEiKX0pLHByaW9yaXR5OjN9Om51bGx9fWV4cG9ydERPTSh0KXtpZih7ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCYmZHIuaXNIVE1MRWxlbWVudCh0KSl7dGhpcy5pc0VtcHR5KCkmJnQuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpO3ZhciBuPXRoaXMuZ2V0Rm9ybWF0VHlwZSgpO3Quc3R5bGUudGV4dEFsaWduPW4sKG49dGhpcy5nZXREaXJlY3Rpb24oKSkmJih0LmRpcj1uKX1yZXR1cm57ZWxlbWVudDp0fX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgbj1ybCh0LnRhZyk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldEluZGVudCh0LmluZGVudCksbi5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdGFnOnRoaXMuZ2V0VGFnKCksdHlwZToiaGVhZGluZyIsdmVyc2lvbjoxfX1pbnNlcnROZXdBZnRlcih0LG49ITApe3Q9dD90LmFuY2hvci5vZmZzZXQ6MCx0PTA8dCYmdDx0aGlzLmdldFRleHRDb250ZW50U2l6ZSgpP3JsKHRoaXMuZ2V0VGFnKCkpOmIuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKTtsZXQgcj10aGlzLmdldERpcmVjdGlvbigpO3JldHVybiB0LnNldERpcmVjdGlvbihyKSx0aGlzLmluc2VydEFmdGVyKHQsbiksdH1jb2xsYXBzZUF0U3RhcnQoKXtsZXQgdD10aGlzLmlzRW1wdHkoKT9iLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk6cmwodGhpcy5nZXRUYWcoKSk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKG49PnQuYXBwZW5kKG4pKSx0aGlzLnJlcGxhY2UodCksITB9ZXh0cmFjdFdpdGhDaGlsZCgpe3JldHVybiEwfX07ZnVuY3Rpb24gSHkoZSl7cmV0dXJuIGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzcGFuIj9lLnN0eWxlLmZvbnRTaXplPT09IjI2cHQiOiExfWZ1bmN0aW9uIERpKGUpe2xldCB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxuPW51bGw7cmV0dXJuKHQ9PT0iaDEifHx0PT09ImgyInx8dD09PSJoMyJ8fHQ9PT0iaDQifHx0PT09Img1Inx8dD09PSJoNiIpJiYobj1ybCh0KSxlLnN0eWxlIT09bnVsbCYmbi5zZXRGb3JtYXQoZS5zdHlsZS50ZXh0QWxpZ24pKSx7bm9kZTpufX1mdW5jdGlvbiBKMihlKXtsZXQgdD1hbSgpO3JldHVybiBlLnN0eWxlIT09bnVsbCYmdC5zZXRGb3JtYXQoZS5zdHlsZS50ZXh0QWxpZ24pLHtub2RlOnR9fWZ1bmN0aW9uIHJsKGUpe3JldHVybiBiLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgdW0oZSkpfWZ1bmN0aW9uIFoyKGUsdCl7ZS5wcmV2ZW50RGVmYXVsdCgpLHQudXBkYXRlKCgpPT57bGV0IG49Yi4kZ2V0U2VsZWN0aW9uKCkscj1lIGluc3RhbmNlb2YgSW5wdXRFdmVudHx8ZSBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQ/bnVsbDplLmNsaXBib2FyZERhdGE7ciE9bnVsbCYmKGIuJGlzUmFuZ2VTZWxlY3Rpb24obil8fGIuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pKSYmUmMuJGluc2VydERhdGFUcmFuc2ZlckZvclJpY2hUZXh0KHIsbix0KX0se3RhZzoicGFzdGUifSl9YXN5bmMgZnVuY3Rpb24gcTIoZSx0KXthd2FpdCBSYy5jb3B5VG9DbGlwYm9hcmQodCxkci5vYmplY3RLbGFzc0VxdWFscyhlLENsaXBib2FyZEV2ZW50KT9lOm51bGwpLHQudXBkYXRlKCgpPT57bGV0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7Yi4kaXNSYW5nZVNlbGVjdGlvbihuKT9uLnJlbW92ZVRleHQoKTpiLiRpc05vZGVTZWxlY3Rpb24obikmJm4uZ2V0Tm9kZXMoKS5mb3JFYWNoKHI9PnIucmVtb3ZlKCkpfSl9ZnVuY3Rpb24gQ3MoZSl7bGV0IHQ9bnVsbDtpZihlIGluc3RhbmNlb2YgRHJhZ0V2ZW50P3Q9ZS5kYXRhVHJhbnNmZXI6ZSBpbnN0YW5jZW9mIENsaXBib2FyZEV2ZW50JiYodD1lLmNsaXBib2FyZERhdGEpLHQ9PT1udWxsKXJldHVyblshMSxbXSwhMV07dmFyIG49dC50eXBlcztyZXR1cm4gZT1uLmluY2x1ZGVzKCJGaWxlcyIpLG49bi5pbmNsdWRlcygidGV4dC9odG1sIil8fG4uaW5jbHVkZXMoInRleHQvcGxhaW4iKSxbZSxBcnJheS5mcm9tKHQuZmlsZXMpLG5dfWZ1bmN0aW9uIEt5KGUpe3ZhciB0PWIuJGdldFNlbGVjdGlvbigpO2lmKCFiLiRpc1JhbmdlU2VsZWN0aW9uKHQpKXJldHVybiExO2xldCBuPW5ldyBTZXQ7dD10LmdldE5vZGVzKCk7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciByPXRbaV0sbz1yLmdldEtleSgpO24uaGFzKG8pfHwocj1kci4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdyhyKSxvPXIuZ2V0S2V5KCksci5jYW5JbmRlbnQoKSYmIW4uaGFzKG8pJiYobi5hZGQobyksZShyKSkpfXJldHVybiAwPG4uc2l6ZX1mdW5jdGlvbiBtdShlKXtyZXR1cm4gZT1iLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlKGUpLGIuJGlzRGVjb3JhdG9yTm9kZShlKX0kci4kY3JlYXRlSGVhZGluZ05vZGU9cmw7JHIuJGNyZWF0ZVF1b3RlTm9kZT1hbTskci4kaXNIZWFkaW5nTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHVtfTskci4kaXNRdW90ZU5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBzbX07JHIuRFJBR19EUk9QX1BBU1RFPWFwOyRyLkhlYWRpbmdOb2RlPXVtOyRyLlF1b3RlTm9kZT1zbTskci5ldmVudEZpbGVzPUNzOyRyLnJlZ2lzdGVyUmljaFRleHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGRyLm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoYi5DTElDS19DT01NQU5ELCgpPT57Y29uc3QgdD1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gYi4kaXNOb2RlU2VsZWN0aW9uKHQpPyh0LmNsZWFyKCksITApOiExfSwwKSxlLnJlZ2lzdGVyQ29tbWFuZChiLkRFTEVURV9DSEFSQUNURVJfQ09NTUFORCx0PT57Y29uc3Qgbj1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gYi4kaXNSYW5nZVNlbGVjdGlvbihuKT8obi5kZWxldGVDaGFyYWN0ZXIodCksITApOiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLkRFTEVURV9XT1JEX0NPTU1BTkQsdD0+e2NvbnN0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIGIuJGlzUmFuZ2VTZWxlY3Rpb24obik/KG4uZGVsZXRlV29yZCh0KSwhMCk6ITF9LGIuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKGIuREVMRVRFX0xJTkVfQ09NTUFORCx0PT57Y29uc3Qgbj1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gYi4kaXNSYW5nZVNlbGVjdGlvbihuKT8obi5kZWxldGVMaW5lKHQpLCEwKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5DT05UUk9MTEVEX1RFWFRfSU5TRVJUSU9OX0NPTU1BTkQsdD0+e2NvbnN0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7aWYodHlwZW9mIHQ9PSJzdHJpbmciKWIuJGlzUmFuZ2VTZWxlY3Rpb24obik/bi5pbnNlcnRUZXh0KHQpOmIuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pO2Vsc2V7aWYoIWIuJGlzUmFuZ2VTZWxlY3Rpb24obikmJiFiLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihuKSlyZXR1cm4hMTtjb25zdCByPXQuZGF0YVRyYW5zZmVyO3IhPW51bGw/UmMuJGluc2VydERhdGFUcmFuc2ZlckZvclJpY2hUZXh0KHIsbixlKTpiLiRpc1JhbmdlU2VsZWN0aW9uKG4pJiYodD10LmRhdGEpJiZuLmluc2VydFRleHQodCl9cmV0dXJuITB9LGIuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKGIuUkVNT1ZFX1RFWFRfQ09NTUFORCwoKT0+e2NvbnN0IHQ9Yi4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIGIuJGlzUmFuZ2VTZWxlY3Rpb24odCk/KHQucmVtb3ZlVGV4dCgpLCEwKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5GT1JNQVRfVEVYVF9DT01NQU5ELHQ9Pntjb25zdCBuPWIuJGdldFNlbGVjdGlvbigpO3JldHVybiBiLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyhuLmZvcm1hdFRleHQodCksITApOiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLkZPUk1BVF9FTEVNRU5UX0NPTU1BTkQsdD0+e3ZhciBuPWIuJGdldFNlbGVjdGlvbigpO2lmKCFiLiRpc1JhbmdlU2VsZWN0aW9uKG4pJiYhYi4kaXNOb2RlU2VsZWN0aW9uKG4pKXJldHVybiExO249bi5nZXROb2RlcygpO2Zvcihjb25zdCByIG9mIG4pbj1kci4kZmluZE1hdGNoaW5nUGFyZW50KHIsbz0+Yi4kaXNFbGVtZW50Tm9kZShvKSYmIW8uaXNJbmxpbmUoKSksbiE9PW51bGwmJm4uc2V0Rm9ybWF0KHQpO3JldHVybiEwfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLklOU0VSVF9MSU5FX0JSRUFLX0NPTU1BTkQsdD0+e2NvbnN0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIGIuJGlzUmFuZ2VTZWxlY3Rpb24obik/KG4uaW5zZXJ0TGluZUJyZWFrKHQpLCEwKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5JTlNFUlRfUEFSQUdSQVBIX0NPTU1BTkQsKCk9Pntjb25zdCB0PWIuJGdldFNlbGVjdGlvbigpO3JldHVybiBiLiRpc1JhbmdlU2VsZWN0aW9uKHQpPyh0Lmluc2VydFBhcmFncmFwaCgpLCEwKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5JTlNFUlRfVEFCX0NPTU1BTkQsKCk9PihiLiRpbnNlcnROb2RlcyhbYi4kY3JlYXRlVGFiTm9kZSgpXSksITApLGIuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKGIuSU5ERU5UX0NPTlRFTlRfQ09NTUFORCwoKT0+S3kodD0+e2NvbnN0IG49dC5nZXRJbmRlbnQoKTt0LnNldEluZGVudChuKzEpfSksYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5PVVRERU5UX0NPTlRFTlRfQ09NTUFORCwoKT0+S3kodD0+e2NvbnN0IG49dC5nZXRJbmRlbnQoKTswPG4mJnQuc2V0SW5kZW50KG4tMSl9KSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLktFWV9BUlJPV19VUF9DT01NQU5ELHQ9Pnt2YXIgbj1iLiRnZXRTZWxlY3Rpb24oKTtpZihiLiRpc05vZGVTZWxlY3Rpb24obikmJiFtdSh0LnRhcmdldCkpe2lmKHQ9bi5nZXROb2RlcygpLDA8dC5sZW5ndGgpcmV0dXJuIHRbMF0uc2VsZWN0UHJldmlvdXMoKSwhMH1lbHNlIGlmKGIuJGlzUmFuZ2VTZWxlY3Rpb24obikmJihuPWIuJGdldEFkamFjZW50Tm9kZShuLmZvY3VzLCEwKSwhdC5zaGlmdEtleSYmYi4kaXNEZWNvcmF0b3JOb2RlKG4pJiYhbi5pc0lzb2xhdGVkKCkmJiFuLmlzSW5saW5lKCkpKXJldHVybiBuLnNlbGVjdFByZXZpb3VzKCksdC5wcmV2ZW50RGVmYXVsdCgpLCEwO3JldHVybiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLktFWV9BUlJPV19ET1dOX0NPTU1BTkQsdD0+e3ZhciBuPWIuJGdldFNlbGVjdGlvbigpO2lmKGIuJGlzTm9kZVNlbGVjdGlvbihuKSl7aWYodD1uLmdldE5vZGVzKCksMDx0Lmxlbmd0aClyZXR1cm4gdFswXS5zZWxlY3ROZXh0KDAsMCksITB9ZWxzZSBpZihiLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXtsZXQgcj1uLmZvY3VzO2lmKHIua2V5PT09InJvb3QiJiZyLm9mZnNldD09PWIuJGdldFJvb3QoKS5nZXRDaGlsZHJlblNpemUoKSlyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLCEwO2lmKG49Yi4kZ2V0QWRqYWNlbnROb2RlKG4uZm9jdXMsITEpLCF0LnNoaWZ0S2V5JiZiLiRpc0RlY29yYXRvck5vZGUobikmJiFuLmlzSXNvbGF0ZWQoKSYmIW4uaXNJbmxpbmUoKSlyZXR1cm4gbi5zZWxlY3ROZXh0KCksdC5wcmV2ZW50RGVmYXVsdCgpLCEwfXJldHVybiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLktFWV9BUlJPV19MRUZUX0NPTU1BTkQsdD0+e2NvbnN0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7aWYoYi4kaXNOb2RlU2VsZWN0aW9uKG4pKXt2YXIgcj1uLmdldE5vZGVzKCk7aWYoMDxyLmxlbmd0aClyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLHJbMF0uc2VsZWN0UHJldmlvdXMoKSwhMH1yZXR1cm4gYi4kaXNSYW5nZVNlbGVjdGlvbihuKSYmZ3UuJHNob3VsZE92ZXJyaWRlRGVmYXVsdENoYXJhY3RlclNlbGVjdGlvbihuLCEwKT8ocj10LnNoaWZ0S2V5LHQucHJldmVudERlZmF1bHQoKSxndS4kbW92ZUNoYXJhY3RlcihuLHIsITApLCEwKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5LRVlfQVJST1dfUklHSFRfQ09NTUFORCx0PT57Y29uc3Qgbj1iLiRnZXRTZWxlY3Rpb24oKTtpZihiLiRpc05vZGVTZWxlY3Rpb24obikmJiFtdSh0LnRhcmdldCkpe3ZhciByPW4uZ2V0Tm9kZXMoKTtpZigwPHIubGVuZ3RoKXJldHVybiB0LnByZXZlbnREZWZhdWx0KCksclswXS5zZWxlY3ROZXh0KDAsMCksITB9cmV0dXJuIGIuJGlzUmFuZ2VTZWxlY3Rpb24obik/KHI9dC5zaGlmdEtleSxndS4kc2hvdWxkT3ZlcnJpZGVEZWZhdWx0Q2hhcmFjdGVyU2VsZWN0aW9uKG4sITEpPyh0LnByZXZlbnREZWZhdWx0KCksZ3UuJG1vdmVDaGFyYWN0ZXIobixyLCExKSwhMCk6ITEpOiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLktFWV9CQUNLU1BBQ0VfQ09NTUFORCx0PT57aWYobXUodC50YXJnZXQpKXJldHVybiExO2NvbnN0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7aWYoIWIuJGlzUmFuZ2VTZWxlY3Rpb24obikpcmV0dXJuITE7dC5wcmV2ZW50RGVmYXVsdCgpLHthbmNob3I6dH09bjtjb25zdCByPXQuZ2V0Tm9kZSgpO3JldHVybiBuLmlzQ29sbGFwc2VkKCkmJnQub2Zmc2V0PT09MCYmIWIuJGlzUm9vdE5vZGUocikmJjA8ZHIuJGdldE5lYXJlc3RCbG9ja0VsZW1lbnRBbmNlc3Rvck9yVGhyb3cocikuZ2V0SW5kZW50KCk/ZS5kaXNwYXRjaENvbW1hbmQoYi5PVVRERU5UX0NPTlRFTlRfQ09NTUFORCx2b2lkIDApOmUuZGlzcGF0Y2hDb21tYW5kKGIuREVMRVRFX0NIQVJBQ1RFUl9DT01NQU5ELCEwKX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5LRVlfREVMRVRFX0NPTU1BTkQsdD0+e2lmKG11KHQudGFyZ2V0KSlyZXR1cm4hMTtjb25zdCBuPWIuJGdldFNlbGVjdGlvbigpO3JldHVybiBiLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyh0LnByZXZlbnREZWZhdWx0KCksZS5kaXNwYXRjaENvbW1hbmQoYi5ERUxFVEVfQ0hBUkFDVEVSX0NPTU1BTkQsITEpKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5LRVlfRU5URVJfQ09NTUFORCx0PT57Y29uc3Qgbj1iLiRnZXRTZWxlY3Rpb24oKTtpZighYi4kaXNSYW5nZVNlbGVjdGlvbihuKSlyZXR1cm4hMTtpZih0IT09bnVsbCl7aWYoKFkyfHxHMnx8UTIpJiZLMilyZXR1cm4hMTtpZih0LnByZXZlbnREZWZhdWx0KCksdC5zaGlmdEtleSlyZXR1cm4gZS5kaXNwYXRjaENvbW1hbmQoYi5JTlNFUlRfTElORV9CUkVBS19DT01NQU5ELCExKX1yZXR1cm4gZS5kaXNwYXRjaENvbW1hbmQoYi5JTlNFUlRfUEFSQUdSQVBIX0NPTU1BTkQsdm9pZCAwKX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5LRVlfRVNDQVBFX0NPTU1BTkQsKCk9Pntjb25zdCB0PWIuJGdldFNlbGVjdGlvbigpO3JldHVybiBiLiRpc1JhbmdlU2VsZWN0aW9uKHQpPyhlLmJsdXIoKSwhMCk6ITF9LGIuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKGIuRFJPUF9DT01NQU5ELHQ9Pntjb25zdFssbl09Q3ModCk7aWYoMDxuLmxlbmd0aCl7dmFyIHI9VnkodC5jbGllbnRYLHQuY2xpZW50WSk7aWYociE9PW51bGwpe2NvbnN0e29mZnNldDppLG5vZGU6bH09cjt2YXIgbz1iLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlKGwpO2lmKG8hPT1udWxsKXtpZihyPWIuJGNyZWF0ZVJhbmdlU2VsZWN0aW9uKCksYi4kaXNUZXh0Tm9kZShvKSlyLmFuY2hvci5zZXQoby5nZXRLZXkoKSxpLCJ0ZXh0Iiksci5mb2N1cy5zZXQoby5nZXRLZXkoKSxpLCJ0ZXh0Iik7ZWxzZXtjb25zdCBzPW8uZ2V0UGFyZW50T3JUaHJvdygpLmdldEtleSgpO289by5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEsci5hbmNob3Iuc2V0KHMsbywiZWxlbWVudCIpLHIuZm9jdXMuc2V0KHMsbywiZWxlbWVudCIpfXI9Yi4kbm9ybWFsaXplU2VsZWN0aW9uX19FWFBFUklNRU5UQUwociksYi4kc2V0U2VsZWN0aW9uKHIpfWUuZGlzcGF0Y2hDb21tYW5kKGFwLG4pfXJldHVybiB0LnByZXZlbnREZWZhdWx0KCksITB9cmV0dXJuIHQ9Yi4kZ2V0U2VsZWN0aW9uKCksISFiLiRpc1JhbmdlU2VsZWN0aW9uKHQpfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLkRSQUdTVEFSVF9DT01NQU5ELHQ9PntbdF09Q3ModCk7Y29uc3Qgbj1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4hKHQmJiFiLiRpc1JhbmdlU2VsZWN0aW9uKG4pKX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5EUkFHT1ZFUl9DT01NQU5ELHQ9Pnt2YXJbbl09Q3ModCk7Y29uc3Qgcj1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gbiYmIWIuJGlzUmFuZ2VTZWxlY3Rpb24ocik/ITE6KG49VnkodC5jbGllbnRYLHQuY2xpZW50WSksbiE9PW51bGwmJihuPWIuJGdldE5lYXJlc3ROb2RlRnJvbURPTU5vZGUobi5ub2RlKSxiLiRpc0RlY29yYXRvck5vZGUobikmJnQucHJldmVudERlZmF1bHQoKSksITApfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLlNFTEVDVF9BTExfQ09NTUFORCwoKT0+KGIuJHNlbGVjdEFsbCgpLCEwKSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLkNPUFlfQ09NTUFORCx0PT4oUmMuY29weVRvQ2xpcGJvYXJkKGUsZHIub2JqZWN0S2xhc3NFcXVhbHModCxDbGlwYm9hcmRFdmVudCk/dDpudWxsKSwhMCksYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5DVVRfQ09NTUFORCx0PT4ocTIodCxlKSwhMCksYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5QQVNURV9DT01NQU5ELHQ9Pntjb25zdFssbixyXT1Dcyh0KTtpZigwPG4ubGVuZ3RoJiYhcilyZXR1cm4gZS5kaXNwYXRjaENvbW1hbmQoYXAsbiksITA7aWYoYi5pc1NlbGVjdGlvbkNhcHR1cmVkSW5EZWNvcmF0b3JJbnB1dCh0LnRhcmdldCkpcmV0dXJuITE7Y29uc3Qgbz1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gYi4kaXNSYW5nZVNlbGVjdGlvbihvKXx8Yi5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24obyk/KFoyKHQsZSksITApOiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSl9O2NvbnN0IGVSPSRyO3ZhciBXcz1lUixfUz1ycix0Uj1BMixEbj1wLG5SPUQyLHdTPU50LEd5PUhyLHJSPUkyLG9SPVdzLGNtPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1Ij9Ebi51c2VMYXlvdXRFZmZlY3Q6RG4udXNlRWZmZWN0O2Z1bmN0aW9uIFl5KGUpe3JldHVybiBlLmdldEVkaXRvclN0YXRlKCkucmVhZChuUi4kY2FuU2hvd1BsYWNlaG9sZGVyQ3VycnkoZS5pc0NvbXBvc2luZygpKSl9ZnVuY3Rpb24gaVIoZSl7bGV0W3Qsbl09RG4udXNlU3RhdGUoKCk9Pll5KGUpKTtyZXR1cm4gY20oKCk9PntmdW5jdGlvbiByKCl7bGV0IG89WXkoZSk7bihvKX1yZXR1cm4gcigpLHdTLm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKCgpPT57cigpfSksZS5yZWdpc3RlckVkaXRhYmxlTGlzdGVuZXIoKCk9PntyKCl9KSl9LFtlXSksdH1mdW5jdGlvbiBsUihlLHQpe2xldFtuLHJdPURuLnVzZVN0YXRlKCgpPT5lLmdldERlY29yYXRvcnMoKSk7cmV0dXJuIGNtKCgpPT5lLnJlZ2lzdGVyRGVjb3JhdG9yTGlzdGVuZXIobz0+e0d5LmZsdXNoU3luYygoKT0+e3Iobyl9KX0pLFtlXSksRG4udXNlRWZmZWN0KCgpPT57cihlLmdldERlY29yYXRvcnMoKSl9LFtlXSksRG4udXNlTWVtbygoKT0+e2xldCBvPVtdLGk9T2JqZWN0LmtleXMobik7Zm9yKGxldCBsPTA7bDxpLmxlbmd0aDtsKyspe2xldCBzPWlbbF0sYT1Ebi5jcmVhdGVFbGVtZW50KHQse29uRXJyb3I6Yz0+ZS5fb25FcnJvcihjKX0sRG4uY3JlYXRlRWxlbWVudChEbi5TdXNwZW5zZSx7ZmFsbGJhY2s6bnVsbH0sbltzXSkpLHU9ZS5nZXRFbGVtZW50QnlLZXkocyk7dSE9PW51bGwmJm8ucHVzaChHeS5jcmVhdGVQb3J0YWwoYSx1LHMpKX1yZXR1cm4gb30sW3QsbixlXSl9ZnVuY3Rpb24gc1IoZSl7Y20oKCk9PndTLm1lcmdlUmVnaXN0ZXIob1IucmVnaXN0ZXJSaWNoVGV4dChlKSxyUi5yZWdpc3RlckRyYWdvblN1cHBvcnQoZSkpLFtlXSl9ZnVuY3Rpb24gYVIoe2NvbnRlbnQ6ZX0pe3Zhclt0XT1fUy51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7dD1pUih0KTtsZXQgbj10UigpO3JldHVybiB0P3R5cGVvZiBlPT0iZnVuY3Rpb24iP2Uobik6ZTpudWxsfW9TLlJpY2hUZXh0UGx1Z2luPWZ1bmN0aW9uKHtjb250ZW50RWRpdGFibGU6ZSxwbGFjZWhvbGRlcjp0LEVycm9yQm91bmRhcnk6bn0pe2xldFtyXT1fUy51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIG49bFIocixuKSxzUihyKSxEbi5jcmVhdGVFbGVtZW50KERuLkZyYWdtZW50LG51bGwsZSxEbi5jcmVhdGVFbGVtZW50KGFSLHtjb250ZW50OnR9KSxuKX07Y29uc3QgdVI9b1M7dmFyIGNSPXVSLFNTPXt9LGJyPWZvLGRSPXJyLENTPXAsZlI9TnQsZHM9Z2U7ZnVuY3Rpb24gaFIoZSl7Q1MudXNlRWZmZWN0KCgpPT5mUi5tZXJnZVJlZ2lzdGVyKGUucmVnaXN0ZXJDb21tYW5kKGJyLklOU0VSVF9PUkRFUkVEX0xJU1RfQ09NTUFORCwoKT0+KGJyLmluc2VydExpc3QoZSwibnVtYmVyIiksITApLGRzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSxlLnJlZ2lzdGVyQ29tbWFuZChici5JTlNFUlRfVU5PUkRFUkVEX0xJU1RfQ09NTUFORCwoKT0+KGJyLmluc2VydExpc3QoZSwiYnVsbGV0IiksITApLGRzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSxlLnJlZ2lzdGVyQ29tbWFuZChici5SRU1PVkVfTElTVF9DT01NQU5ELCgpPT4oYnIucmVtb3ZlTGlzdChlKSwhMCksZHMuQ09NTUFORF9QUklPUklUWV9MT1cpLGUucmVnaXN0ZXJDb21tYW5kKGRzLklOU0VSVF9QQVJBR1JBUEhfQ09NTUFORCwoKT0+ISFici4kaGFuZGxlTGlzdEluc2VydFBhcmFncmFwaCgpLGRzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSksW2VdKX1TUy5MaXN0UGx1Z2luPWZ1bmN0aW9uKCl7bGV0W2VdPWRSLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gQ1MudXNlRWZmZWN0KCgpPT57aWYoIWUuaGFzTm9kZXMoW2JyLkxpc3ROb2RlLGJyLkxpc3RJdGVtTm9kZV0pKXRocm93IEVycm9yKCJMaXN0UGx1Z2luOiBMaXN0Tm9kZSBhbmQvb3IgTGlzdEl0ZW1Ob2RlIG5vdCByZWdpc3RlcmVkIG9uIGVkaXRvciIpfSxbZV0pLGhSKGUpLG51bGx9O2NvbnN0IHBSPVNTO3ZhciBnUj1wUixFUz17fSxYcj17fSwkUz1OdCxtcj1nZTtsZXQgbVI9bmV3IFNldChbImh0dHA6IiwiaHR0cHM6IiwibWFpbHRvOiIsInNtczoiLCJ0ZWw6Il0pO2NsYXNzIEdsIGV4dGVuZHMgbXIuRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4ibGluayJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgR2wodC5fX3VybCx7cmVsOnQuX19yZWwsdGFyZ2V0OnQuX190YXJnZXQsdGl0bGU6dC5fX3RpdGxlfSx0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0LG49e30scil7c3VwZXIocik7bGV0e3RhcmdldDpvPW51bGwscmVsOmk9bnVsbCx0aXRsZTpsPW51bGx9PW47dGhpcy5fX3VybD10LHRoaXMuX190YXJnZXQ9byx0aGlzLl9fcmVsPWksdGhpcy5fX3RpdGxlPWx9Y3JlYXRlRE9NKHQpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtyZXR1cm4gbi5ocmVmPXRoaXMuc2FuaXRpemVVcmwodGhpcy5fX3VybCksdGhpcy5fX3RhcmdldCE9PW51bGwmJihuLnRhcmdldD10aGlzLl9fdGFyZ2V0KSx0aGlzLl9fcmVsIT09bnVsbCYmKG4ucmVsPXRoaXMuX19yZWwpLHRoaXMuX190aXRsZSE9PW51bGwmJihuLnRpdGxlPXRoaXMuX190aXRsZSksJFMuYWRkQ2xhc3NOYW1lc1RvRWxlbWVudChuLHQudGhlbWUubGluayksbn11cGRhdGVET00odCxuKXtsZXQgcj10aGlzLl9fdXJsLG89dGhpcy5fX3RhcmdldCxpPXRoaXMuX19yZWwsbD10aGlzLl9fdGl0bGU7cmV0dXJuIHIhPT10Ll9fdXJsJiYobi5ocmVmPXIpLG8hPT10Ll9fdGFyZ2V0JiYobz9uLnRhcmdldD1vOm4ucmVtb3ZlQXR0cmlidXRlKCJ0YXJnZXQiKSksaSE9PXQuX19yZWwmJihpP24ucmVsPWk6bi5yZW1vdmVBdHRyaWJ1dGUoInJlbCIpKSxsIT09dC5fX3RpdGxlJiYobD9uLnRpdGxlPWw6bi5yZW1vdmVBdHRyaWJ1dGUoInRpdGxlIikpLCExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57YTooKT0+KHtjb252ZXJzaW9uOnZSLHByaW9yaXR5OjF9KX19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49eGEodC51cmwse3JlbDp0LnJlbCx0YXJnZXQ6dC50YXJnZXQsdGl0bGU6dC50aXRsZX0pO3JldHVybiBuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXRJbmRlbnQodC5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxufXNhbml0aXplVXJsKHQpe3RyeXtsZXQgbj1uZXcgVVJMKHQpO2lmKCFtUi5oYXMobi5wcm90b2NvbCkpcmV0dXJuImFib3V0OmJsYW5rIn1jYXRjaHt9cmV0dXJuIHR9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCkscmVsOnRoaXMuZ2V0UmVsKCksdGFyZ2V0OnRoaXMuZ2V0VGFyZ2V0KCksdGl0bGU6dGhpcy5nZXRUaXRsZSgpLHR5cGU6ImxpbmsiLHVybDp0aGlzLmdldFVSTCgpLHZlcnNpb246MX19Z2V0VVJMKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX191cmx9c2V0VVJMKHQpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3VybD10fWdldFRhcmdldCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdGFyZ2V0fXNldFRhcmdldCh0KXt0aGlzLmdldFdyaXRhYmxlKCkuX190YXJnZXQ9dH1nZXRSZWwoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3JlbH1zZXRSZWwodCl7dGhpcy5nZXRXcml0YWJsZSgpLl9fcmVsPXR9Z2V0VGl0bGUoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3RpdGxlfXNldFRpdGxlKHQpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3RpdGxlPXR9aW5zZXJ0TmV3QWZ0ZXIodCxuPSEwKXtyZXR1cm4gdD10aGlzLmdldFBhcmVudE9yVGhyb3coKS5pbnNlcnROZXdBZnRlcih0LG4pLG1yLiRpc0VsZW1lbnROb2RlKHQpPyhuPXhhKHRoaXMuX191cmwse3JlbDp0aGlzLl9fcmVsLHRhcmdldDp0aGlzLl9fdGFyZ2V0LHRpdGxlOnRoaXMuX190aXRsZX0pLHQuYXBwZW5kKG4pLG4pOm51bGx9Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiExfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiExfWNhbkJlRW1wdHkoKXtyZXR1cm4hMX1pc0lubGluZSgpe3JldHVybiEwfWV4dHJhY3RXaXRoQ2hpbGQodCxuKXtpZighbXIuJGlzUmFuZ2VTZWxlY3Rpb24obikpcmV0dXJuITE7dD1uLmFuY2hvci5nZXROb2RlKCk7bGV0IHI9bi5mb2N1cy5nZXROb2RlKCk7cmV0dXJuIHRoaXMuaXNQYXJlbnRPZih0KSYmdGhpcy5pc1BhcmVudE9mKHIpJiYwPG4uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9fWZ1bmN0aW9uIHZSKGUpe2xldCB0PW51bGw7aWYoJFMuaXNIVE1MQW5jaG9yRWxlbWVudChlKSl7bGV0IG49ZS50ZXh0Q29udGVudDtuIT09bnVsbCYmbiE9PSIiJiYodD14YShlLmdldEF0dHJpYnV0ZSgiaHJlZiIpfHwiIix7cmVsOmUuZ2V0QXR0cmlidXRlKCJyZWwiKSx0YXJnZXQ6ZS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLHRpdGxlOmUuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpfSkpfXJldHVybntub2RlOnR9fWZ1bmN0aW9uIHhhKGUsdCl7cmV0dXJuIG1yLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgR2woZSx0KSl9ZnVuY3Rpb24gWW8oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBHbH1jbGFzcyBJYSBleHRlbmRzIEdse3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImF1dG9saW5rIn1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBJYSh0Ll9fdXJsLHtyZWw6dC5fX3JlbCx0YXJnZXQ6dC5fX3RhcmdldCx0aXRsZTp0Ll9fdGl0bGV9LHQuX19rZXkpfXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPXVwKHQudXJsLHtyZWw6dC5yZWwsdGFyZ2V0OnQudGFyZ2V0LHRpdGxlOnQudGl0bGV9KTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJuIG51bGx9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdHlwZToiYXV0b2xpbmsiLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIodCxuPSEwKXtyZXR1cm4gdD10aGlzLmdldFBhcmVudE9yVGhyb3coKS5pbnNlcnROZXdBZnRlcih0LG4pLG1yLiRpc0VsZW1lbnROb2RlKHQpPyhuPXVwKHRoaXMuX191cmwse3JlbDp0aGlzLl9yZWwsdGFyZ2V0OnRoaXMuX190YXJnZXQsdGl0bGU6dGhpcy5fX3RpdGxlfSksdC5hcHBlbmQobiksbik6bnVsbH19ZnVuY3Rpb24gdXAoZSx0KXtyZXR1cm4gbXIuJGFwcGx5Tm9kZVJlcGxhY2VtZW50KG5ldyBJYShlLHQpKX1sZXQgeVI9bXIuY3JlYXRlQ29tbWFuZCgiVE9HR0xFX0xJTktfQ09NTUFORCIpO2Z1bmN0aW9uIHhSKGUsdCl7Zm9yKDtlIT09bnVsbCYmKGU9ZS5nZXRQYXJlbnQoKSkhPT1udWxsJiYhdChlKTspO3JldHVybiBlfVhyLiRjcmVhdGVBdXRvTGlua05vZGU9dXA7WHIuJGNyZWF0ZUxpbmtOb2RlPXhhO1hyLiRpc0F1dG9MaW5rTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIElhfTtYci4kaXNMaW5rTm9kZT1ZbztYci5BdXRvTGlua05vZGU9SWE7WHIuTGlua05vZGU9R2w7WHIuVE9HR0xFX0xJTktfQ09NTUFORD15UjtYci50b2dnbGVMaW5rPWZ1bmN0aW9uKGUsdD17fSl7bGV0e3RhcmdldDpuLHRpdGxlOnJ9PXQsbz10LnJlbD09PXZvaWQgMD8ibm9yZWZlcnJlciI6dC5yZWw7aWYodD1tci4kZ2V0U2VsZWN0aW9uKCksbXIuJGlzUmFuZ2VTZWxlY3Rpb24odCkpaWYodD10LmV4dHJhY3QoKSxlPT09bnVsbCl0LmZvckVhY2gobD0+e2lmKGw9bC5nZXRQYXJlbnQoKSxZbyhsKSl7bGV0IHM9bC5nZXRDaGlsZHJlbigpO2ZvcihsZXQgYT0wO2E8cy5sZW5ndGg7YSsrKWwuaW5zZXJ0QmVmb3JlKHNbYV0pO2wucmVtb3ZlKCl9fSk7ZWxzZXtpZih0Lmxlbmd0aD09PTEpe3ZhciBpPXRbMF07aWYoaT1ZbyhpKT9pOnhSKGksWW8pLGkhPT1udWxsKXtpLnNldFVSTChlKSxuIT09dm9pZCAwJiZpLnNldFRhcmdldChuKSxvIT09bnVsbCYmaS5zZXRSZWwobyksciE9PXZvaWQgMCYmaS5zZXRUaXRsZShyKTtyZXR1cm59fWxldCBsPW51bGwscz1udWxsO3QuZm9yRWFjaChhPT57dmFyIHU9YS5nZXRQYXJlbnQoKTtpZih1IT09cyYmdSE9PW51bGwmJighbXIuJGlzRWxlbWVudE5vZGUoYSl8fGEuaXNJbmxpbmUoKSkpaWYoWW8odSkpcz11LHUuc2V0VVJMKGUpLG4hPT12b2lkIDAmJnUuc2V0VGFyZ2V0KG4pLG8hPT1udWxsJiZzLnNldFJlbChvKSxyIT09dm9pZCAwJiZzLnNldFRpdGxlKHIpO2Vsc2UgaWYodS5pcyhsKXx8KGw9dSxzPXhhKGUse3JlbDpvLHRhcmdldDpufSksWW8odSk/YS5nZXRQcmV2aW91c1NpYmxpbmcoKT09PW51bGw/dS5pbnNlcnRCZWZvcmUocyk6dS5pbnNlcnRBZnRlcihzKTphLmluc2VydEJlZm9yZShzKSksWW8oYSkpe2lmKCFhLmlzKHMpKXtpZihzIT09bnVsbCl7dT1hLmdldENoaWxkcmVuKCk7Zm9yKGxldCBjPTA7Yzx1Lmxlbmd0aDtjKyspcy5hcHBlbmQodVtjXSl9YS5yZW1vdmUoKX19ZWxzZSBzIT09bnVsbCYmcy5hcHBlbmQoYSl9KX19O2NvbnN0IF9SPVhyO3ZhciBibD1fUixMaT1ibCx3Uj1ycixTUj1OdCxJaT1nZSxDUj1wO0VTLkxpbmtQbHVnaW49ZnVuY3Rpb24oe3ZhbGlkYXRlVXJsOmV9KXtsZXRbdF09d1IudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBDUi51c2VFZmZlY3QoKCk9PntpZighdC5oYXNOb2RlcyhbTGkuTGlua05vZGVdKSl0aHJvdyBFcnJvcigiTGlua1BsdWdpbjogTGlua05vZGUgbm90IHJlZ2lzdGVyZWQgb24gZWRpdG9yIik7cmV0dXJuIFNSLm1lcmdlUmVnaXN0ZXIodC5yZWdpc3RlckNvbW1hbmQoTGkuVE9HR0xFX0xJTktfQ09NTUFORCxuPT57aWYobj09PW51bGwpcmV0dXJuIExpLnRvZ2dsZUxpbmsobiksITA7aWYodHlwZW9mIG49PSJzdHJpbmciKXJldHVybiBlPT09dm9pZCAwfHxlKG4pPyhMaS50b2dnbGVMaW5rKG4pLCEwKTohMTtsZXR7dXJsOnIsdGFyZ2V0Om8scmVsOmksdGl0bGU6bH09bjtyZXR1cm4gTGkudG9nZ2xlTGluayhyLHtyZWw6aSx0YXJnZXQ6byx0aXRsZTpsfSksITB9LElpLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSxlIT09dm9pZCAwP3QucmVnaXN0ZXJDb21tYW5kKElpLlBBU1RFX0NPTU1BTkQsbj0+e2xldCByPUlpLiRnZXRTZWxlY3Rpb24oKTtpZighSWkuJGlzUmFuZ2VTZWxlY3Rpb24ocil8fHIuaXNDb2xsYXBzZWQoKXx8IShuIGluc3RhbmNlb2YgQ2xpcGJvYXJkRXZlbnQpfHxuLmNsaXBib2FyZERhdGE9PW51bGwpcmV0dXJuITE7bGV0IG89bi5jbGlwYm9hcmREYXRhLmdldERhdGEoInRleHQiKTtyZXR1cm4gZShvKT9yLmdldE5vZGVzKCkuc29tZShpPT5JaS4kaXNFbGVtZW50Tm9kZShpKSk/ITE6KHQuZGlzcGF0Y2hDb21tYW5kKExpLlRPR0dMRV9MSU5LX0NPTU1BTkQsbyksbi5wcmV2ZW50RGVmYXVsdCgpLCEwKTohMX0sSWkuQ09NTUFORF9QUklPUklUWV9MT1cpOigpPT57fSl9LFt0LGVdKSxudWxsfTtjb25zdCBFUj1FUzt2YXIgJFI9RVI7ZnVuY3Rpb24ga1Ioe2FyaWFBY3RpdmVEZXNjZW5kYW50OmUsYXJpYUF1dG9Db21wbGV0ZTp0LGFyaWFDb250cm9sczpuLGFyaWFEZXNjcmliZWRCeTpyLGFyaWFFeHBhbmRlZDpvLGFyaWFMYWJlbDppLGFyaWFMYWJlbGxlZEJ5OmwsYXJpYU11bHRpbGluZTpzLGFyaWFPd25zOmEsYXJpYVJlcXVpcmVkOnUsYXV0b0NhcGl0YWxpemU6YyxjbGFzc05hbWU6ZCxpZDpmLHJvbGU6aD0idGV4dGJveCIsc3BlbGxDaGVjazpnPSEwLHN0eWxlOm0sdGFiSW5kZXg6UywiZGF0YS10ZXN0aWQiOnYsLi4ueX0pe2NvbnN0W19dPXJyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKSxbdyxDXT1wLnVzZVN0YXRlKCExKSwkPXAudXNlQ2FsbGJhY2soRT0+e3ZhciBNO18uc2V0Um9vdEVsZW1lbnQoRSk7Y29uc3QgVD0oTT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidmFsLXVpIikpPT1udWxsP3ZvaWQgMDpNLnNoYWRvd1Jvb3Q7aWYoVCYmImdldFNlbGVjdGlvbiJpbiBUKXtfLl93aW5kb3c9VDtyZXR1cm59fSxbX10pO3JldHVybiBwLnVzZUxheW91dEVmZmVjdCgoKT0+KEMoXy5pc0VkaXRhYmxlKCkpLF8ucmVnaXN0ZXJFZGl0YWJsZUxpc3RlbmVyKEU9PntDKEUpfSkpLFtfXSkseC5qc3goImRpdiIsey4uLnksImFyaWEtYWN0aXZlZGVzY2VuZGFudCI6dz9lOnZvaWQgMCwiYXJpYS1hdXRvY29tcGxldGUiOnc/dDoibm9uZSIsImFyaWEtY29udHJvbHMiOnc/bjp2b2lkIDAsImFyaWEtZGVzY3JpYmVkYnkiOnIsImFyaWEtZXhwYW5kZWQiOncmJmg9PT0iY29tYm9ib3giPyEhbzp2b2lkIDAsImFyaWEtbGFiZWwiOmksImFyaWEtbGFiZWxsZWRieSI6bCwiYXJpYS1tdWx0aWxpbmUiOnMsImFyaWEtb3ducyI6dz9hOnZvaWQgMCwiYXJpYS1yZWFkb25seSI6dz92b2lkIDA6ITAsImFyaWEtcmVxdWlyZWQiOnUsYXV0b0NhcGl0YWxpemU6YyxjbGFzc05hbWU6ZCxjb250ZW50RWRpdGFibGU6dywiZGF0YS10ZXN0aWQiOnYsaWQ6ZixyZWY6JCxyb2xlOmgsc3BlbGxDaGVjazpnLHN0eWxlOm0sdGFiSW5kZXg6U30pfWZ1bmN0aW9uIFRSKHtjbGFzc05hbWU6ZX0pe3JldHVybiB4LmpzeChrUix7Y2xhc3NOYW1lOmV9KX1jbGFzcyBqYSBleHRlbmRzIGdlLkRlY29yYXRvck5vZGV7Y29uc3RydWN0b3IodCxuKXtzdXBlcihuKSx0aGlzLl9fc3JjPXQuc3JjLHRoaXMuX19hbHRUZXh0PXQuYWx0VGV4dCx0aGlzLl9fd2lkdGg9dC53aWR0aCx0aGlzLl9faGVpZ2h0PXQuaGVpZ2h0fXN0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImltYWdlIn1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBqYSh7c3JjOnQuX19zcmMsYWx0VGV4dDp0Ll9fYWx0VGV4dCx3aWR0aDp0Ll9fd2lkdGgsaGVpZ2h0OnQuX19oZWlnaHR9KX1leHBvcnRKU09OKCl7cmV0dXJue2FsdFRleHQ6dGhpcy5fX2FsdFRleHQsaGVpZ2h0OnRoaXMuX193aWR0aCxzcmM6dGhpcy5fX3NyYyx0eXBlOiJpbWFnZSIsdmVyc2lvbjoxLHdpZHRoOnRoaXMuX193aWR0aH19c3RhdGljIGltcG9ydEpTT04odCl7cmV0dXJuIGtTKHQpfWNyZWF0ZURPTSgpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX11cGRhdGVET00oKXtyZXR1cm4hMX1kZWNvcmF0ZSgpe3JldHVybiB4LmpzeChOUix7c3JjOnRoaXMuX19zcmMsYWx0VGV4dDp0aGlzLl9fYWx0VGV4dCxlbXB0eTp0aGlzLl9fZW1wdHksaGVpZ2h0OnRoaXMuX19oZWlnaHQsbm9kZUtleTp0aGlzLmdldEtleSgpfSl9fWZ1bmN0aW9uIE5SKGUpe3JldHVybiB4LmpzeCgiaW1nIix7c3JjOmUuc3JjfSl9ZnVuY3Rpb24ga1MoZSl7cmV0dXJuIG5ldyBqYShlKX1mdW5jdGlvbiBiUigpe2NvbnN0W2VdPXJyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntlLmZvY3VzKCl9LFtlXSksbnVsbH1jb25zdCBUUz1nZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfSU1BR0VfQ09NTUFORCIpO2Z1bmN0aW9uIFJSKCl7Y29uc3RbZV09cnIudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2lmKCFlLmhhc05vZGVzKFtqYV0pKXRocm93IG5ldyBFcnJvcigiSW1hZ2VzUGx1Z2luOiBJbWFnZU5vZGUgbm90IHJlZ2lzdGVyZWQgb24gZWRpdG9yIik7cmV0dXJuIE50Lm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoVFMsdD0+e2NvbnN0IG49a1ModCk7cmV0dXJuIGdlLiRpbnNlcnROb2Rlcyhbbl0pLGdlLiRpc1Jvb3RPclNoYWRvd1Jvb3Qobi5nZXRQYXJlbnRPclRocm93KCkpJiZOdC4kd3JhcE5vZGVJbkVsZW1lbnQobixnZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSkuc2VsZWN0RW5kKCksITB9LGdlLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSl9LFtlXSksbnVsbH1jb25zdCBQUj0oe2NsYXNzTmFtZTplfSk9PnguanN4cygic3ZnIix7aGVpZ2h0OjEyLHdpZHRoOjEyLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNsYXNzTmFtZTplLGNoaWxkcmVuOlt4LmpzeCgicGF0aCIse2Q6Ik02IDRoOGE0IDQgMCAwIDEgNCA0IDQgNCAwIDAgMS00IDRINnoifSkseC5qc3goInBhdGgiLHtkOiJNNiAxMmg5YTQgNCAwIDAgMSA0IDQgNCA0IDAgMCAxLTQgNEg2eiJ9KV19KSxPUj1QUixBUj0oe2NsYXNzTmFtZTplfSk9PnguanN4cygic3ZnIix7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsY2xhc3NOYW1lOmUsd2lkdGg6MTIsaGVpZ2h0OjEyLGNoaWxkcmVuOlt4LmpzeCgibGluZSIse3gxOiIxOSIseTE6IjQiLHgyOiIxMCIseTI6IjQifSkseC5qc3goImxpbmUiLHt4MToiMTQiLHkxOiIyMCIseDI6IjUiLHkyOiIyMCJ9KSx4LmpzeCgibGluZSIse3gxOiIxNSIseTE6IjQiLHgyOiI5Iix5MjoiMjAifSldfSksTVI9QVIsRFI9KHtjbGFzc05hbWU6ZX0pPT54LmpzeCgic3ZnIix7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix2aWV3Qm94OiIwIDAgMjQgMjQiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMSIsY2xhc3NOYW1lOmUsd2lkdGg6MTIsaGVpZ2h0OjEyLGNoaWxkcmVuOnguanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGQ6Ik0xMywxNSBMMTMsMjEgQzEzLDIxLjU1MjI4NDcgMTIuNTUyMjg0NywyMiAxMiwyMiBDMTEuNDQ3NzE1MywyMiAxMSwyMS41NTIyODQ3IDExLDIxIEwxMSwxNSBMMTMsMTUgWiBNMywxMyBDMi40NDc3MTUyNSwxMyAyLDEyLjU1MjI4NDcgMiwxMiBDMiwxMS40NDc3MTUzIDIuNDQ3NzE1MjUsMTEgMywxMSBMMjEsMTEgQzIxLjU1MjI4NDcsMTEgMjIsMTEuNDQ3NzE1MyAyMiwxMiBDMjIsMTIuNTUyMjg0NyAyMS41NTIyODQ3LDEzIDIxLDEzIEwzLDEzIFogTTE5LDIgQzE5LjU1MjI4NDcsMiAyMCwyLjQ0NzcxNTI1IDIwLDMgQzIwLDMuNTUyMjg0NzUgMTkuNTUyMjg0Nyw0IDE5LDQgTDEzLDQgTDEzLDkgTDExLDkgTDExLDQgTDUsNCBDNC40NDc3MTUyNSw0IDQsMy41NTIyODQ3NSA0LDMgQzQsMi40NDc3MTUyNSA0LjQ0NzcxNTI1LDIgNSwyIEwxOSwyIFoifSl9KSxMUj1EUixJUj0oe3ZhcmlhbnQ6ZT0icHJpbWFyeSIsb25DbGljazp0LGNoaWxkcmVuOm4saWNvbjpyLGRpc2FibGVkOm89ITF9KT0+eC5qc3goImJ1dHRvbiIse2Rpc2FibGVkOm8sY2xhc3NOYW1lOmlkKCJmb250LXNhbnMgZm9udC1bMTJweF0gdHJhY2tpbmctWzAuMDRlbV0gcHktMSBweC0yIHJvdW5kZWQgd2hpdGVzcGFjZS1ub3dyYXAgZ3JvdXAgcmVsYXRpdmUgdGV4dC1wcmltYXJ5Iix7ImZvbnQtYm9sZCI6ZT09PSJwcmltYXJ5IiwiYmctYmFja2dyb3VuZCBob3ZlcjpiZy1iYWNrZ3JvdW5kIHRleHQtZmlsbCBkaXNhYmxlZDpiZy1maWxsIGRpc2FibGVkOnRleHQtYmFja2dyb3VuZCI6ZT09PSJwcmltYXJ5IiwiYmctdHJhbnNwYXJlbnQgYm9yZGVyIGJvcmRlci1wcmltYXJ5IHRleHQtcHJpbWFyeSBob3Zlcjpib3JkZXItaGlnaGxpZ2h0IGhvdmVyOnRleHQtaGlnaGxpZ2h0IGRpc2FibGVkOmJnLWZpbGwgZGlzYWJsZWQ6dGV4dC1iYWNrZ3JvdW5kIjplIT09InByaW1hcnkifSksb25DbGljazp0LGNoaWxkcmVuOnguanN4cygic3BhbiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIiLGNoaWxkcmVuOltyJiZyLG5dfSl9KSxYbz1JUixqUj0oe2NsYXNzTmFtZTplfSk9PnguanN4cygic3ZnIix7d2lkdGg6IjEwIixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgMTIgMTIiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2xhc3NOYW1lOmUsY2hpbGRyZW46W3guanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNMy43MDczMyAxLjAwMDE1TDguNzc4NCA2LjA3MTIxTDguMDcxMjkgNi43NzgzMkwzLjAwMDIyIDEuNzA3MjVMMy43MDczMyAxLjAwMDE1WiIsZmlsbDoiY3VycmVudENvbG9yIn0pLHguanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNMy4wMDAxNSAxMC40NzA5TDguMDcxMjEgNS4zOTk4M0w4Ljc3ODMyIDYuMTA2OTNMMy43MDcyNSAxMS4xNzhMMy4wMDAxNSAxMC40NzA5WiIsZmlsbDoiY3VycmVudENvbG9yIn0pXX0pLHpSPWpSLE5TPXEuY3JlYXRlQ29udGV4dCh7Z2V0IGFwaSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNlc3Npb24oKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCB0aGVtZSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNldFRoZW1lKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgZWRpdE1vZGUoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBzZXRFZGl0TW9kZSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IGhpZ2hsaWdodCgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNldEhpZ2hsaWdodCgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNldFdpbmRvd1NpemUoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCB3aW5kb3dTaXplKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfX0pO2Z1bmN0aW9uIGRtKCl7cmV0dXJuIHEudXNlQ29udGV4dChOUyl9Y29uc3QgRlI9KHtvcHRpb25zOmUsb25DaGFuZ2U6dCxsYWJlbDpuLGljb246cn0pPT57Y29uc3RbbyxpXT1wLnVzZVN0YXRlKCExKSxsPXAudXNlUmVmKG51bGwpLFtzLGFdPXAudXNlU3RhdGUoMCkse3dpbmRvd1NpemU6dX09ZG0oKSxjPSgpPT57aSghbyl9LGQ9KGYsaCk9PnthKGgpLHQoZiksaSghMSl9O3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IGY9aD0+e28mJmwuY3VycmVudCYmIWwuY3VycmVudC5jb250YWlucyhoLnRhcmdldCkmJmkoITEpfTtyZXR1cm4gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGYpLCgpPT57ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGYpfX0sW10pLHguanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtWzEycHhdIixyZWY6bCxjaGlsZHJlbjp4LmpzeChYbyx7b25DbGljazpmPT57Zi5wcmV2ZW50RGVmYXVsdCgpLGMoKX0saWNvbjp4LmpzeCh6Uix7Y2xhc3NOYW1lOmByb3RhdGUtWy05MGRlZ10gdHJhbnNpdGlvbi10cmFuc2Zvcm0gZHVyYXRpb24tMTUwIGVhc2UtaW4tb3V0ICR7bz8iIjoicm90YXRlLVs5MGRlZ10ifWB9KSxjaGlsZHJlbjp4LmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVsYXRpdmUiLGNoaWxkcmVuOlt4LmpzeHMoInNwYW4iLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0xIixjaGlsZHJlbjpbbixyJiZyXX0pLG8mJnguanN4KCJkaXYiLHtjbGFzc05hbWU6ImFic29sdXRlIC10b3AtWzRweF0gb3ZlcmZsb3ctc2Nyb2xsIHNoYWRvdy1sZyAtbGVmdC0yIHRleHQtcHJpbWFyeSBiZy1ib3JkZXIgdy1maXQgei1vdmVybGF5IixzdHlsZTp7bWF4SGVpZ2h0OnU9PW51bGw/dm9pZCAwOnUuaW5uZXJIZWlnaHR9LGNoaWxkcmVuOnguanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wgIixjaGlsZHJlbjplPT1udWxsP3ZvaWQgMDplLm1hcCgoZixoKT0+eC5qc3goImJ1dHRvbiIse29uQ2xpY2s6Zz0+e2cucHJldmVudERlZmF1bHQoKSxkKGYsaCl9LGNsYXNzTmFtZTpgdGV4dC1sZWZ0IHB4LTIgcHktMSBob3ZlcjpiZy1iYWNrZ3JvdW5kIGhvdmVyOnRleHQtaGlnaGxpZ2h0ICAke2g9PT1zJiYiZm9udC1ib2xkIGJnLWJhY2tncm91bmQgaG92ZXI6YmctYmFja2dyb3VuZCB0cnVuY2F0ZSJ9YCxjaGlsZHJlbjpmfSxmKSl9KX0pXX0pfSl9KX0sQlI9RlIsV1I9bmV3IFRleHRFbmNvZGVyO2Z1bmN0aW9uIGJTKGUpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e3ZhciBpO2NvbnN0IHI9KGk9ZS5jdXJyZW50VGFyZ2V0LmZpbGVzKT09bnVsbD92b2lkIDA6aVswXSxvPW5ldyBGaWxlUmVhZGVyO28uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKCk9Pntjb25zdCBsPW8ucmVzdWx0O2lmKHR5cGVvZiBsPT0ic3RyaW5nIil7Y29uc3Qgcz1uZXcgSW1hZ2U7cy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixhc3luYygpPT57Y29uc3QgYT1hd2FpdCB3bi5nZXRTSEEyNTZIYXNoKFdSLmVuY29kZShsKSk7aWYocy5uYXR1cmFsV2lkdGgmJnMubmF0dXJhbEhlaWdodCl7Y29uc3QgdT1PZyhsKTt0KHtzcmM6bCx3aWR0aDpzLm5hdHVyYWxXaWR0aCxoZWlnaHQ6cy5uYXR1cmFsSGVpZ2h0LGZpbGVuYW1lOnI9PW51bGw/dm9pZCAwOnIubmFtZSxzaGEyNTY6YSxtaW1lVHlwZTp1LGZpbGVFeHQ6dSYmQWcodSl9KX1lbHNlIHQoe3NyYzpsLGZpbGVuYW1lOnI9PW51bGw/dm9pZCAwOnIubmFtZSxzaGEyNTY6YX0pfSkscy5zcmM9bH1lbHNlIG4obD97bWVzc2FnZToiVW5leHBlY3RlZCBpbWFnZSByZXN1bHQgdHlwZSIscmVzdWx0Omx9OnttZXNzYWdlOiJFbXB0eSByZXN1bHQifSl9KSxyJiZvLnJlYWRBc0RhdGFVUkwocil9KX1mdW5jdGlvbiBSUyhlKXtjb25zdCB0PWUuYW5jaG9yLG49ZS5mb2N1cyxyPWUuYW5jaG9yLmdldE5vZGUoKSxvPWUuZm9jdXMuZ2V0Tm9kZSgpO3JldHVybiByPT09bz9yOmUuaXNCYWNrd2FyZCgpP09vLiRpc0F0Tm9kZUVuZChuKT9yOm86T28uJGlzQXROb2RlRW5kKHQpP3I6b31mdW5jdGlvbiBVUigpe2NvbnN0W2VdPXJyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pk50Lm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoZ2UuQ0xJQ0tfQ09NTUFORCx0PT57Y29uc3Qgbj1nZS4kZ2V0U2VsZWN0aW9uKCk7aWYoZ2UuJGlzUmFuZ2VTZWxlY3Rpb24obikpe2NvbnN0IHI9UlMobiksbz1OdC4kZmluZE1hdGNoaW5nUGFyZW50KHIsYmwuJGlzTGlua05vZGUpO2lmKGJsLiRpc0xpbmtOb2RlKG8pJiYodC5tZXRhS2V5fHx0LmN0cmxLZXkpKXJldHVybiB3aW5kb3cub3BlbihvLmdldFVSTCgpLCJfYmxhbmsiKSwhMH1yZXR1cm4hMX0sZ2UuQ09NTUFORF9QUklPUklUWV9MT1cpKSxbXSksbnVsbH12YXIgUFM9e2V4cG9ydHM6e319LFZSPSJTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCIsSFI9VlIsS1I9SFI7ZnVuY3Rpb24gT1MoKXt9ZnVuY3Rpb24gQVMoKXt9QVMucmVzZXRXYXJuaW5nQ2FjaGU9T1M7dmFyIEdSPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShyLG8saSxsLHMsYSl7aWYoYSE9PUtSKXt2YXIgdT1uZXcgRXJyb3IoIkNhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuIFVzZSBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKSB0byBjYWxsIHRoZW0uIFJlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMiKTt0aHJvdyB1Lm5hbWU9IkludmFyaWFudCBWaW9sYXRpb24iLHV9fWUuaXNSZXF1aXJlZD1lO2Z1bmN0aW9uIHQoKXtyZXR1cm4gZX12YXIgbj17YXJyYXk6ZSxiaWdpbnQ6ZSxib29sOmUsZnVuYzplLG51bWJlcjplLG9iamVjdDplLHN0cmluZzplLHN5bWJvbDplLGFueTplLGFycmF5T2Y6dCxlbGVtZW50OmUsZWxlbWVudFR5cGU6ZSxpbnN0YW5jZU9mOnQsbm9kZTplLG9iamVjdE9mOnQsb25lT2Y6dCxvbmVPZlR5cGU6dCxzaGFwZTp0LGV4YWN0OnQsY2hlY2tQcm9wVHlwZXM6QVMscmVzZXRXYXJuaW5nQ2FjaGU6T1N9O3JldHVybiBuLlByb3BUeXBlcz1uLG59O1BTLmV4cG9ydHM9R1IoKTt2YXIgWVI9UFMuZXhwb3J0cztjb25zdCBJbj0kYShZUik7ZnVuY3Rpb24gY3AoKXtyZXR1cm4gY3A9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sY3AuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIFhSKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj1RUihlLHQpLHIsbztpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2ZvcihvPTA7bzxpLmxlbmd0aDtvKyspcj1pW29dLCEodC5pbmRleE9mKHIpPj0wKSYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscikmJihuW3JdPWVbcl0pfXJldHVybiBufWZ1bmN0aW9uIFFSKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj17fSxyPU9iamVjdC5rZXlzKGUpLG8saTtmb3IoaT0wO2k8ci5sZW5ndGg7aSsrKW89cltpXSwhKHQuaW5kZXhPZihvKT49MCkmJihuW29dPWVbb10pO3JldHVybiBufXZhciBmbT1wLmZvcndhcmRSZWYoZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNvbG9yLHI9bj09PXZvaWQgMD8iY3VycmVudENvbG9yIjpuLG89ZS5zaXplLGk9bz09PXZvaWQgMD8yNDpvLGw9WFIoZSxbImNvbG9yIiwic2l6ZSJdKTtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KCJzdmciLGNwKHtyZWY6dCx4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHdpZHRoOmksaGVpZ2h0Omksdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6cixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCJ9LGwpLHEuY3JlYXRlRWxlbWVudCgicG9seWxpbmUiLHtwb2ludHM6IjIwIDYgOSAxNyA0IDEyIn0pKX0pO2ZtLnByb3BUeXBlcz17Y29sb3I6SW4uc3RyaW5nLHNpemU6SW4ub25lT2ZUeXBlKFtJbi5zdHJpbmcsSW4ubnVtYmVyXSl9O2ZtLmRpc3BsYXlOYW1lPSJDaGVjayI7Y29uc3QgSlI9Zm07ZnVuY3Rpb24gZHAoKXtyZXR1cm4gZHA9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sZHAuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIFpSKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj1xUihlLHQpLHIsbztpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2ZvcihvPTA7bzxpLmxlbmd0aDtvKyspcj1pW29dLCEodC5pbmRleE9mKHIpPj0wKSYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscikmJihuW3JdPWVbcl0pfXJldHVybiBufWZ1bmN0aW9uIHFSKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj17fSxyPU9iamVjdC5rZXlzKGUpLG8saTtmb3IoaT0wO2k8ci5sZW5ndGg7aSsrKW89cltpXSwhKHQuaW5kZXhPZihvKT49MCkmJihuW29dPWVbb10pO3JldHVybiBufXZhciBobT1wLmZvcndhcmRSZWYoZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNvbG9yLHI9bj09PXZvaWQgMD8iY3VycmVudENvbG9yIjpuLG89ZS5zaXplLGk9bz09PXZvaWQgMD8yNDpvLGw9WlIoZSxbImNvbG9yIiwic2l6ZSJdKTtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KCJzdmciLGRwKHtyZWY6dCx4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHdpZHRoOmksaGVpZ2h0Omksdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6cixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCJ9LGwpLHEuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0xMCAxM2E1IDUgMCAwIDAgNy41NC41NGwzLTNhNSA1IDAgMCAwLTcuMDctNy4wN2wtMS43MiAxLjcxIn0pLHEuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0xNCAxMWE1IDUgMCAwIDAtNy41NC0uNTRsLTMgM2E1IDUgMCAwIDAgNy4wNyA3LjA3bDEuNzEtMS43MSJ9KSl9KTtobS5wcm9wVHlwZXM9e2NvbG9yOkluLnN0cmluZyxzaXplOkluLm9uZU9mVHlwZShbSW4uc3RyaW5nLEluLm51bWJlcl0pfTtobS5kaXNwbGF5TmFtZT0iTGluayI7Y29uc3QgZVA9aG07ZnVuY3Rpb24gZnAoKXtyZXR1cm4gZnA9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sZnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIHRQKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj1uUChlLHQpLHIsbztpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2ZvcihvPTA7bzxpLmxlbmd0aDtvKyspcj1pW29dLCEodC5pbmRleE9mKHIpPj0wKSYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscikmJihuW3JdPWVbcl0pfXJldHVybiBufWZ1bmN0aW9uIG5QKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj17fSxyPU9iamVjdC5rZXlzKGUpLG8saTtmb3IoaT0wO2k8ci5sZW5ndGg7aSsrKW89cltpXSwhKHQuaW5kZXhPZihvKT49MCkmJihuW29dPWVbb10pO3JldHVybiBufXZhciBwbT1wLmZvcndhcmRSZWYoZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNvbG9yLHI9bj09PXZvaWQgMD8iY3VycmVudENvbG9yIjpuLG89ZS5zaXplLGk9bz09PXZvaWQgMD8yNDpvLGw9dFAoZSxbImNvbG9yIiwic2l6ZSJdKTtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KCJzdmciLGZwKHtyZWY6dCx4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHdpZHRoOmksaGVpZ2h0Omksdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6cixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCJ9LGwpLHEuY3JlYXRlRWxlbWVudCgibGluZSIse3gxOiIxOCIseTE6IjYiLHgyOiI2Iix5MjoiMTgifSkscS5jcmVhdGVFbGVtZW50KCJsaW5lIix7eDE6IjYiLHkxOiI2Iix4MjoiMTgiLHkyOiIxOCJ9KSl9KTtwbS5wcm9wVHlwZXM9e2NvbG9yOkluLnN0cmluZyxzaXplOkluLm9uZU9mVHlwZShbSW4uc3RyaW5nLEluLm51bWJlcl0pfTtwbS5kaXNwbGF5TmFtZT0iWCI7Y29uc3QgclA9cG0sb1A9KHtmb250U2l6ZXM6ZSxmb250c0ZhbWlsaWVzOnQsb25FZGl0b3I6bixjb2xvcnM6cn0pPT57Y29uc3Rbb109cnIudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3AudXNlRWZmZWN0KCgpPT57biYmbihvKX0sW29dKTtjb25zdFtpLGxdPXAudXNlU3RhdGUobyksW3MsYV09cC51c2VTdGF0ZShudWxsKSxbdSxjXT1wLnVzZVN0YXRlKCExKSxbZCxmXT1wLnVzZVN0YXRlKCExKSxbaCxnXT1wLnVzZVN0YXRlKCExKSxbbSxTXT1wLnVzZVN0YXRlKCExKTtwLnVzZVN0YXRlKCIxNXB4IikscC51c2VTdGF0ZSgiIzAwMCIpLHAudXNlU3RhdGUoIlNhbnMiKTtjb25zdFt2LHldPXAudXNlU3RhdGUoInBhcmFncmFwaCIpO3AudXNlU3RhdGUoITEpLHAudXNlU3RhdGUoITEpLHAudXNlU3RhdGUoInVybCIpLHAudXNlU3RhdGUobnVsbCk7Y29uc3RbXyx3XT1wLnVzZVN0YXRlKG51bGwpLEM9Uj0+e28uZGlzcGF0Y2hDb21tYW5kKGJsLlRPR0dMRV9MSU5LX0NPTU1BTkQsUil9LCQ9e3BhcmFncmFwaDoiTm9ybWFsIixoMToiSGVhZGluZyAxIixoMjoiSGVhZGluZyAyIixoMzoiSGVhZGluZyAzIixoNDoiSGVhZGluZyA0IixoNToiSGVhZGluZyA1IixoNjoiSGVhZGluZyA2IixudW1iZXI6Ik51bWJlcmVkIExpc3QiLGJ1bGxldDoiQnVsbGV0ZWQgTGlzdCJ9LEU9e307Zm9yKGNvbnN0IFIgaW4gJClFWyRbUl1dPVI7Y29uc3QgVD1wLnVzZUNhbGxiYWNrKCgpPT57Y29uc3QgUj1nZS4kZ2V0U2VsZWN0aW9uKCk7aWYoZ2UuJGlzUmFuZ2VTZWxlY3Rpb24oUikpe2NvbnN0IGo9Ui5hbmNob3IuZ2V0Tm9kZSgpO2xldCBGPWouZ2V0S2V5KCk9PT0icm9vdCI/ajpOdC4kZmluZE1hdGNoaW5nUGFyZW50KGosTz0+e2NvbnN0IGs9Ty5nZXRQYXJlbnQoKTtyZXR1cm4gayE9PW51bGwmJmdlLiRpc1Jvb3RPclNoYWRvd1Jvb3Qoayl9KTtGPT09bnVsbCYmKEY9ai5nZXRUb3BMZXZlbEVsZW1lbnRPclRocm93KCkpO2NvbnN0IGFlPVJTKFIpLEg9TnQuJGZpbmRNYXRjaGluZ1BhcmVudChhZSxibC4kaXNMaW5rTm9kZSk7aWYoSCE9PW51bGwpe2NvbnN0IE89SC5nZXRVUkwoKTt3KE8pfWVsc2UgdyhudWxsKTtjb25zdCBYPUYuZ2V0S2V5KCksUD1pLmdldEVsZW1lbnRCeUtleShYKTtpZihjKFIuaGFzRm9ybWF0KCJib2xkIikpLGYoUi5oYXNGb3JtYXQoIml0YWxpYyIpKSxnKFIuaGFzRm9ybWF0KCJzdHJpa2V0aHJvdWdoIikpLFMoUi5oYXNGb3JtYXQoInVuZGVybGluZSIpKSxQIT09bnVsbClpZihhKFgpLGZvLiRpc0xpc3ROb2RlKEYpKXtjb25zdCBPPU50LiRnZXROZWFyZXN0Tm9kZU9mVHlwZShqLGZvLkxpc3ROb2RlKSxrPU8/Ty5nZXRMaXN0VHlwZSgpOkYuZ2V0TGlzdFR5cGUoKTt5KGspfWVsc2V7Y29uc3QgTz1Xcy4kaXNIZWFkaW5nTm9kZShGKT9GLmdldFRhZygpOkYuZ2V0VHlwZSgpO08gaW4gJCYmeShPKX19fSxbaV0pO3AudXNlRWZmZWN0KCgpPT5OdC5tZXJnZVJlZ2lzdGVyKG8ucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcigoe2VkaXRvclN0YXRlOlJ9KT0+e1IucmVhZCgoKT0+e1QoKX0pfSkpLFtULGksb10pLHAudXNlRWZmZWN0KCgpPT5vLnJlZ2lzdGVyQ29tbWFuZChnZS5TRUxFQ1RJT05fQ0hBTkdFX0NPTU1BTkQsKFIsaik9PihUKCksbChqKSwhMSksZ2UuQ09NTUFORF9QUklPUklUWV9DUklUSUNBTCksW28sVF0pO2NvbnN0IE09Uj0+e1siaDEiLCJoMiIsImgzIiwiaDQiLCJoNSIsImg2Il0uaW5jbHVkZXMoUik/diE9PVImJm8udXBkYXRlKCgpPT57Y29uc3Qgaj1nZS4kZ2V0U2VsZWN0aW9uKCk7Z2UuJGlzUmFuZ2VTZWxlY3Rpb24oaikmJk9vLiRzZXRCbG9ja3NUeXBlKGosKCk9PldzLiRjcmVhdGVIZWFkaW5nTm9kZShSKSl9KTpSPT09InBhcmFncmFwaCImJnYhPT0icGFyYWdyYXBoIj9vLnVwZGF0ZSgoKT0+e2NvbnN0IGo9Z2UuJGdldFNlbGVjdGlvbigpOyhnZS4kaXNSYW5nZVNlbGVjdGlvbihqKXx8Z2UuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKGopKSYmT28uJHNldEJsb2Nrc1R5cGUoaiwoKT0+Z2UuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSl9KTpSPT09Im51bWJlciImJnYhPT0ibnVtYmVyIj9vLmRpc3BhdGNoQ29tbWFuZChmby5JTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQsdm9pZCAwKTpSPT09ImJ1bGxldCImJnYhPT0iYnVsbGV0Ij9vLmRpc3BhdGNoQ29tbWFuZChmby5JTlNFUlRfVU5PUkRFUkVEX0xJU1RfQ09NTUFORCx2b2lkIDApOm8uZGlzcGF0Y2hDb21tYW5kKGZvLlJFTU9WRV9MSVNUX0NPTU1BTkQsdm9pZCAwKX07cmV0dXJuIHAudXNlQ2FsbGJhY2soKCk9PntvLnVwZGF0ZSgoKT0+e2NvbnN0IFI9Z2UuJGdldFNlbGVjdGlvbigpO2lmKGdlLiRpc1JhbmdlU2VsZWN0aW9uKFIpKXtjb25zdCBqPVIuYW5jaG9yLEY9Ui5mb2N1cyxhZT1SLmdldE5vZGVzKCk7aWYoai5rZXk9PT1GLmtleSYmai5vZmZzZXQ9PT1GLm9mZnNldClyZXR1cm47YWUuZm9yRWFjaCgoSCxYKT0+e2dlLiRpc1RleHROb2RlKEgpPyhYPT09MCYmai5vZmZzZXQhPT0wJiYoSD1ILnNwbGl0VGV4dChqLm9mZnNldClbMV18fEgpLFg9PT1hZS5sZW5ndGgtMSYmKEg9SC5zcGxpdFRleHQoRi5vZmZzZXQpWzBdfHxIKSxILl9fc3R5bGUhPT0iIiYmSC5zZXRTdHlsZSgiIiksSC5fX2Zvcm1hdCE9PTAmJihILnNldEZvcm1hdCgwKSxOdC4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdyhIKS5zZXRGb3JtYXQoIiIpKSk6V3MuJGlzSGVhZGluZ05vZGUoSCkmJkgucmVwbGFjZShnZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLCEwKX0pfX0pfSxbaV0pLHguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJzdGlja3kgdG9wLTAgYm9yZGVyLWIgYmctYmFja2dyb3VuZCBib3JkZXItaGlnaGxpZ2h0IGZsZXggZmxleC1jb2wiLGNoaWxkcmVuOlt4LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBnYXAtMSIsY2hpbGRyZW46W3guanN4KEJSLHtvcHRpb25zOk9iamVjdC52YWx1ZXMoJCksbGFiZWw6JFt2XT8/disiIChub3Qgc3VwcG9ydGVkKSIsb25DaGFuZ2U6Uj0+e00oRVtSXSl9fSkseC5qc3goWG8se3ZhcmlhbnQ6InByaW1hcnkiLG9uQ2xpY2s6Uj0+e1IucHJldmVudERlZmF1bHQoKSxvLmRpc3BhdGNoQ29tbWFuZChnZS5GT1JNQVRfVEVYVF9DT01NQU5ELCJib2xkIil9LGFjdGl2ZTp1LGljb246eC5qc3goT1Ise2NsYXNzTmFtZTpgJHt1JiYic3Ryb2tlLVszcHhdIn1gfSl9KSx4LmpzeChYbyx7YWN0aXZlOmgsb25DbGljazpSPT57Ui5wcmV2ZW50RGVmYXVsdCgpLG8uZGlzcGF0Y2hDb21tYW5kKGdlLkZPUk1BVF9URVhUX0NPTU1BTkQsInN0cmlrZXRocm91Z2giKX0saWNvbjp4LmpzeChMUix7Y2xhc3NOYW1lOmAke2gmJiJzdHJva2UtWzJweF0ifWB9KX0pLHguanN4KFhvLHthY3RpdmU6ZCxvbkNsaWNrOlI9PntSLnByZXZlbnREZWZhdWx0KCksby5kaXNwYXRjaENvbW1hbmQoZ2UuRk9STUFUX1RFWFRfQ09NTUFORCwiaXRhbGljIil9LGljb246eC5qc3goTVIse2NsYXNzTmFtZTpgJHtkJiYic3Ryb2tlLVszcHhdIn1gfSl9KSx4LmpzeChYbyx7YWN0aXZlOl8hPT1udWxsLG9uQ2xpY2s6Uj0+e1IucHJldmVudERlZmF1bHQoKSx3KCIiKSxDKCIiKX0saWNvbjp4LmpzeChlUCx7d2lkdGg6MTIsaGVpZ2h0OjEyLGNsYXNzTmFtZTpgJHtfIT09bnVsbCYmInN0cm9rZS1bM3B4XSJ9YH0pfSkseC5qc3hzKCJsYWJlbCIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgY3Vyc29yLXBvaW50ZXIiLGNoaWxkcmVuOlt4LmpzeChNXyx7fSkseC5qc3goImlucHV0Iix7dHlwZToiZmlsZSIsaGlkZGVuOiEwLG9uQ2hhbmdlOlI9PntSLnByZXZlbnREZWZhdWx0KCksYlMoUikudGhlbihqPT57by5kaXNwYXRjaENvbW1hbmQoVFMsey4uLmp9KX0pLmNhdGNoKGo9Pntjb25zb2xlLmVycm9yKCJFcnJvciByZWFkaW5nIGltYWdlIixqKX0pfX0pXX0pXX0pLF8hPT1udWxsJiZ4LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBwLTIiLGNoaWxkcmVuOlt4LmpzeCgiaW5wdXQiLHt0eXBlOiJ0ZXh0IixwbGFjZWhvbGRlcjoiRW50ZXIgVVJMIixjbGFzc05hbWU6InctMS8zIHRleHQtcHJpbWFyeSBiZy1iYWNrZ3JvdW5kIHB4LTIiLHZhbHVlOl8sb25DaGFuZ2U6Uj0+e1IucHJldmVudERlZmF1bHQoKSx3KFIudGFyZ2V0LnZhbHVlKX19KSx4LmpzeChYbyx7dmFyaWFudDoicHJpbWFyeSIsb25DbGljazpSPT57Ui5wcmV2ZW50RGVmYXVsdCgpLEMoX3x8bnVsbCl9LGljb246eC5qc3goSlIse3NpemU6MTR9KX0pLHguanN4KFhvLHt2YXJpYW50OiJwcmltYXJ5IixvbkNsaWNrOlI9PntSLnByZXZlbnREZWZhdWx0KCksQyhudWxsKX0saWNvbjp4LmpzeChyUCx7c2l6ZToxNH0pfSldfSldfSl9LGlQPW9QLG5yPXt2ZXJzaW9uOjEsZm9ybWF0OiIiLGluZGVudDowLGRpcmVjdGlvbjpudWxsfTtmdW5jdGlvbiBZbChlLHQ9ITEpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIilyZXR1cm57Li4ubnIsdHlwZToidGV4dCIsZm9ybWF0OiIiLHRleHQ6ZX07aWYoInRhZyJpbiBlKXN3aXRjaChlLnRhZyl7Y2FzZSJoMSI6cmV0dXJuIGppKGUpO2Nhc2UiaDIiOnJldHVybiBqaShlKTtjYXNlImgzIjpyZXR1cm4gamkoZSk7Y2FzZSJoNCI6cmV0dXJuIGppKGUpO2Nhc2UiaDUiOnJldHVybiBqaShlKTtjYXNlImg2IjpyZXR1cm4gamkoZSk7Y2FzZSJsaSI6cmV0dXJuIGRQKGUpO2Nhc2UicCI6cmV0dXJuIHVQKGUpO2Nhc2UidWwiOnJldHVybiBYeShlKTtjYXNlIm9sIjpyZXR1cm4gWHkoZSk7Y2FzZSJzcGFuIjpyZXR1cm4gTVMoZSk7Y2FzZSJhIjpyZXR1cm4gc1AoZSk7Y2FzZSJpbWciOnJldHVybiBsUChlKTtjYXNlImJyIjpyZXR1cm4gdD97Li4ubnIsdHlwZToibGluZWJyZWFrIn06Y1AoKTtkZWZhdWx0OnRocm93IEVycm9yKCJVbmV4cGVjdGVkIG5vZGUgdGFnOiAiK0pTT04uc3RyaW5naWZ5KGUsbnVsbCwyKSl9ZWxzZSB0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBub2RlOiAiK0pTT04uc3RyaW5naWZ5KGUsbnVsbCwyKSl9ZnVuY3Rpb24gbFAoZSl7Y29uc3QgdD1lLnNyYztyZXR1cm57Li4ubnIsdHlwZToiaW1hZ2UiLHNyYzp0LHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fX1mdW5jdGlvbiBzUChlKXtyZXR1cm57Li4ubnIsdHlwZToibGluayIsdXJsOmUuaHJlZixjaGlsZHJlbjplLmNoaWxkcmVuLm1hcCh0PT5ZbCh0KSl9fWZ1bmN0aW9uIGFQKGUpe3JldHVybnsuLi5ucixmb3JtYXQ6IiIsdHlwZToicm9vdCIsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAodD0+WWwodCkpfX1mdW5jdGlvbiBqaShlKXtyZXR1cm57Li4ubnIsdHlwZToiaGVhZGluZyIsdGFnOmUudGFnLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKHQ9PllsKHQpKX19ZnVuY3Rpb24gdVAoZSl7cmV0dXJuey4uLm5yLHR5cGU6InBhcmFncmFwaCIsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAodD0+WWwodCwhMCkpfX1mdW5jdGlvbiBjUCgpe3JldHVybnsuLi5ucix0eXBlOiJwYXJhZ3JhcGgiLGNoaWxkcmVuOltdfX1mdW5jdGlvbiBkUChlKXtyZXR1cm57Li4ubnIsdHlwZToibGlzdGl0ZW0iLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKHQ9PllsKHQsITApKX19ZnVuY3Rpb24gWHkoZSl7cmV0dXJuey4uLm5yLHR5cGU6Imxpc3QiLGxpc3RUeXBlOmUudGFnPT09Im9sIj8ibnVtYmVyIjoiYnVsbGV0IixjaGlsZHJlbjplLmNoaWxkcmVuLm1hcCh0PT5ZbCh0KSksLi4uZS5kaXI/e2RpcmVjdGlvbjplLmRpcn06e2RpcmVjdGlvbjpudWxsfX19Y29uc3QgZlA9e2JvbGQ6MSxpdGFsaWM6MiwibGluZS10aHJvdWdoIjo0fTtmdW5jdGlvbiBoUChlKXtyZXR1cm4gZS5yZWR1Y2UoKHQsbik9PnR8ZlBbbl0sMCl9ZnVuY3Rpb24gTVMoZSl7Y29uc3QgdD1lLmNoaWxkcmVuWzBdO3JldHVybiB0eXBlb2YgdD09InN0cmluZyI/ey4uLm5yLHR5cGU6InRleHQiLHRleHQ6dCxmb3JtYXQ6aFAoZS5jbGFzc2VzKX06TVMoey4uLnQsY2xhc3NlczplLmNsYXNzZXMuY29uY2F0KHQuY2xhc3Nlcyl9KX1mdW5jdGlvbiBwUChlKXtjb25zb2xlLmVycm9yKGUpfWNvbnN0IGdQPTI4LG1QPSh7cmljaHRleHQ6ZSxvbkVkaXRvcjp0fSk9Pntjb25zdHt3aW5kb3dTaXplOm59PWRtKCksbz17bmFtZXNwYWNlOiJ2YWwiLGVkaXRvclN0YXRlOmk9PntpLnNldEVkaXRvclN0YXRlKGkucGFyc2VFZGl0b3JTdGF0ZSh7cm9vdDphUChCUyhlKSl9KSl9LG5vZGVzOltXcy5IZWFkaW5nTm9kZSxqYSxmby5MaXN0Tm9kZSxmby5MaXN0SXRlbU5vZGUsYmwuTGlua05vZGVdLHRoZW1lOnt0ZXh0Ontib2xkOiJmb250LXNlbWlib2xkIix1bmRlcmxpbmU6InVuZGVybGluZSIsaXRhbGljOiJpdGFsaWMiLHN0cmlrZXRocm91Z2g6ImxpbmUtdGhyb3VnaCIsdW5kZXJsaW5lU3RyaWtldGhyb3VnaDoidW5kZXJsaW5lIGxpbmUtdGhyb3VnaCJ9LGxpc3Q6e2xpc3RpdGVtOiJtbC1bMjBweF0iLG9sOiJsaXN0LWRlY2ltYWwiLHVsOiJsaXN0LWRpc2MifSxoZWFkaW5nOntoMToidGV4dC00eGwgZm9udC1ib2xkIixoMjoidGV4dC0zeGwgZm9udC1ib2xkIixoMzoidGV4dC0yeGwgZm9udC1ib2xkIixoNDoidGV4dC14bCBmb250LWJvbGQiLGg1OiJ0ZXh0LWxnIGZvbnQtYm9sZCIsaDY6InRleHQtbWQgZm9udC1ib2xkIn0sbGluazoidGV4dC1oaWdobGlnaHQgdW5kZXJsaW5lIn0sb25FcnJvcjpwUH07cmV0dXJuIHguanN4cyhjMi5MZXhpY2FsQ29tcG9zZXIse2luaXRpYWxDb25maWc6byxjaGlsZHJlbjpbeC5qc3goYlIse30pLHguanN4KGlQLHtvbkVkaXRvcjp0fSkseC5qc3goY1IuUmljaFRleHRQbHVnaW4se2NvbnRlbnRFZGl0YWJsZTp4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmb250LXNhbnMgYm9yZGVyLWIgdGV4dC1wcmltYXJ5IGJvcmRlci1oaWdobGlnaHQiLHN0eWxlOnttaW5IZWlnaHQ6biE9bnVsbCYmbi5pbm5lckhlaWdodD8obj09bnVsbD92b2lkIDA6bi5pbm5lckhlaWdodCktZ1A6dm9pZCAwfSxjaGlsZHJlbjp4LmpzeChUUix7Y2xhc3NOYW1lOiJwLTQgb3V0bGluZS1ub25lIGJnLWZpbGwifSl9KSxwbGFjZWhvbGRlcjp4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiIiLGNoaWxkcmVuOiJFbnRlciBzb21lIHRleHQuLi4ifSksRXJyb3JCb3VuZGFyeTp2Mn0pLHguanN4KCRSLkxpbmtQbHVnaW4se30pLHguanN4KFVSLHt9KSx4LmpzeChnUi5MaXN0UGx1Z2luLHt9KSx4LmpzeChSUix7fSkseC5qc3goazIuSGlzdG9yeVBsdWdpbix7fSldfSl9O3ZhciB2UD17eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix3aWR0aDoyNCxoZWlnaHQ6MjQsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6MixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIn07Y29uc3QgeVA9ZT0+ZS5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCIkMS0kMiIpLnRvTG93ZXJDYXNlKCksYm49KGUsdCk9Pntjb25zdCBuPXAuZm9yd2FyZFJlZigoe2NvbG9yOnI9ImN1cnJlbnRDb2xvciIsc2l6ZTpvPTI0LHN0cm9rZVdpZHRoOmk9MixhYnNvbHV0ZVN0cm9rZVdpZHRoOmwsY2hpbGRyZW46cywuLi5hfSx1KT0+cC5jcmVhdGVFbGVtZW50KCJzdmciLHtyZWY6dSwuLi52UCx3aWR0aDpvLGhlaWdodDpvLHN0cm9rZTpyLHN0cm9rZVdpZHRoOmw/TnVtYmVyKGkpKjI0L051bWJlcihvKTppLGNsYXNzTmFtZTpgbHVjaWRlIGx1Y2lkZS0ke3lQKGUpfWAsLi4uYX0sWy4uLnQubWFwKChbYyxkXSk9PnAuY3JlYXRlRWxlbWVudChjLGQpKSwuLi4oQXJyYXkuaXNBcnJheShzKT9zOltzXSl8fFtdXSkpO3JldHVybiBuLmRpc3BsYXlOYW1lPWAke2V9YCxufSx4UD1ibigiQ2hlY2siLFtbInBvbHlsaW5lIix7cG9pbnRzOiIyMCA2IDkgMTcgNCAxMiIsa2V5OiIxMGpqZmoifV1dKSxEUz1ibigiQ2hldnJvbkRvd24iLFtbInBhdGgiLHtkOiJtNiA5IDYgNiA2LTYiLGtleToicXJ1bnNsIn1dXSksX1A9Ym4oIkNoZXZyb25MZWZ0IixbWyJwYXRoIix7ZDoibTE1IDE4LTYtNiA2LTYiLGtleToiMXduZmczIn1dXSksd1A9Ym4oIkxvZ0luIixbWyJwYXRoIix7ZDoiTTE1IDNoNGEyIDIgMCAwIDEgMiAydjE0YTIgMiAwIDAgMS0yIDJoLTQiLGtleToidTUzczZyIn1dLFsicG9seWxpbmUiLHtwb2ludHM6IjEwIDE3IDE1IDEyIDEwIDciLGtleToiMWFpbDBoIn1dLFsibGluZSIse3gxOiIxNSIseDI6IjMiLHkxOiIxMiIseTI6IjEyIixrZXk6InY2Z3J4OCJ9XV0pLFNQPWJuKCJNYXhpbWl6ZSIsW1sicGF0aCIse2Q6Ik04IDNINWEyIDIgMCAwIDAtMiAydjMiLGtleToiMWRjbWl0In1dLFsicGF0aCIse2Q6Ik0yMSA4VjVhMiAyIDAgMCAwLTItMmgtMyIsa2V5OiIxZTRndDMifV0sWyJwYXRoIix7ZDoiTTMgMTZ2M2EyIDIgMCAwIDAgMiAyaDMiLGtleToid3NsNXNjIn1dLFsicGF0aCIse2Q6Ik0xNiAyMWgzYTIgMiAwIDAgMCAyLTJ2LTMiLGtleToiMTh0cmVrIn1dXSksQ1A9Ym4oIk1pbmltaXplIixbWyJwYXRoIix7ZDoiTTggM3YzYTIgMiAwIDAgMS0yIDJIMyIsa2V5OiJob2hidHIifV0sWyJwYXRoIix7ZDoiTTIxIDhoLTNhMiAyIDAgMCAxLTItMlYzIixrZXk6IjVqdzFmMyJ9XSxbInBhdGgiLHtkOiJNMyAxNmgzYTIgMiAwIDAgMSAyIDJ2MyIsa2V5OiIxOTh0dnIifV0sWyJwYXRoIix7ZDoiTTE2IDIxdi0zYTIgMiAwIDAgMSAyLTJoMyIsa2V5OiJwaDhteHAifV1dKSxFUD1ibigiTW9vbiIsW1sicGF0aCIse2Q6Ik0xMiAzYTYgNiAwIDAgMCA5IDkgOSA5IDAgMSAxLTktOVoiLGtleToiYTd0bjE4In1dXSksJFA9Ym4oIlBhdXNlIixbWyJyZWN0Iix7d2lkdGg6IjQiLGhlaWdodDoiMTYiLHg6IjYiLHk6IjQiLGtleToiaWZmaGU0In1dLFsicmVjdCIse3dpZHRoOiI0IixoZWlnaHQ6IjE2Iix4OiIxNCIseToiNCIsa2V5OiJzamluN2oifV1dKSxrUD1ibigiUGxheSIsW1sicG9seWdvbiIse3BvaW50czoiNSAzIDE5IDEyIDUgMjEgNSAzIixrZXk6IjE5MTYzNyJ9XV0pLFRQPWJuKCJQb3dlciIsW1sicGF0aCIse2Q6Ik0xMiAydjEwIixrZXk6Im1uZmJsIn1dLFsicGF0aCIse2Q6Ik0xOC40IDYuNmE5IDkgMCAxIDEtMTIuNzcuMDQiLGtleToib2JvZnU5In1dXSksTlA9Ym4oIlNlbmQiLFtbInBhdGgiLHtkOiJtMjIgMi03IDIwLTQtOS05LTRaIixrZXk6IjFxM3ZnZyJ9XSxbInBhdGgiLHtkOiJNMjIgMiAxMSAxMyIsa2V5OiJuemJxZWYifV1dKSxiUD1ibigiU3VuIixbWyJjaXJjbGUiLHtjeDoiMTIiLGN5OiIxMiIscjoiNCIsa2V5OiI0ZXhpcDIifV0sWyJwYXRoIix7ZDoiTTEyIDJ2MiIsa2V5OiJ0dXMwM20ifV0sWyJwYXRoIix7ZDoiTTEyIDIwdjIiLGtleToiMWxoMWtnIn1dLFsicGF0aCIse2Q6Im00LjkzIDQuOTMgMS40MSAxLjQxIixrZXk6IjE0OXQ2aiJ9XSxbInBhdGgiLHtkOiJtMTcuNjYgMTcuNjYgMS40MSAxLjQxIixrZXk6InB0Ymd1diJ9XSxbInBhdGgiLHtkOiJNMiAxMmgyIixrZXk6IjF0OGY4biJ9XSxbInBhdGgiLHtkOiJNMjAgMTJoMiIsa2V5OiIxcThtancifV0sWyJwYXRoIix7ZDoibTYuMzQgMTcuNjYtMS40MSAxLjQxIixrZXk6IjFtOHp6NSJ9XSxbInBhdGgiLHtkOiJtMTkuMDcgNC45My0xLjQxIDEuNDEiLGtleToiMXNobGNzIn1dXSksUlA9Ym4oIlgiLFtbInBhdGgiLHtkOiJNMTggNiA2IDE4IixrZXk6IjFibDVmOCJ9XSxbInBhdGgiLHtkOiJtNiA2IDEyIDEyIixrZXk6ImQ4Yms2diJ9XV0pLGhwPSJwLTEgYm9yZGVyIHJvdW5kZWQtZnVsbCBzaGFkb3cgYm9yZGVyLWFjY2VudCIsUXk9InZhbGJ1aWxkOnVybEJlZm9yZU5hdmlnYXRpb24iO2Z1bmN0aW9uIFBQKHthcGk6ZX0pe2NvbnN0e3RoZW1lOnQsc2V0VGhlbWU6bixlZGl0TW9kZTpyLHNldEVkaXRNb2RlOm8sc2Vzc2lvbjppfT1kbSgpO2lmKGkuc3RhdHVzPT09InN1Y2Nlc3MiJiZpLmRhdGE9PT0ibm90LWF1dGhlbnRpY2F0ZWQiKXJldHVybiB4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgaC1mdWxsIGZvbnQtc2FucyBib3JkZXItMiByb3VuZGVkLWZ1bGwgZ2FwLXgtMyB0ZXh0LXByaW1hcnkgYmctYmFja2dyb3VuZCBib3JkZXItZmlsbCIsY2hpbGRyZW46eC5qc3goImEiLHtjbGFzc05hbWU6aHAsaHJlZjplLmdldExvZ2luVXJsKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxjaGlsZHJlbjp4LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtMiBnYXAteC0yIixjaGlsZHJlbjpbeC5qc3goInNwYW4iLHtjaGlsZHJlbjoiTG9naW4ifSkseC5qc3god1Ase3NpemU6MTh9KV19KX0pfSk7Y29uc3RbbCxzXT1wLnVzZVN0YXRlKCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57aS5zdGF0dXM9PT0ic3VjY2VzcyImJmkuZGF0YSE9PSJub3QtYXV0aGVudGljYXRlZCImJmUuZ2V0UGF0Y2hlcyh7fSkudGhlbihhPT57aWYoZGwuaXNPayhhKSl7bGV0IHU9MDtmb3IoY29uc3QgYyBpbiBhLnZhbHVlKXUrPWEudmFsdWVbY10ubGVuZ3RoO3ModSl9ZWxzZSBjb25zb2xlLmVycm9yKCJDb3VsZCBub3QgbG9hZCBwYXRjaGVzIixhLmVycm9yKX0pfSxbaV0pLHguanN4cyhPUCx7Y2hpbGRyZW46W3guanN4KHZ1LHthY3RpdmU6cj09PSJob3ZlciIsb25DbGljazooKT0+e28oYT0+YT09PSJob3ZlciI/Im9mZiI6ImhvdmVyIil9LGNoaWxkcmVuOnguanN4KCJkaXYiLHtjbGFzc05hbWU6ImgtWzI0cHhdIHctWzI0cHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIixjaGlsZHJlbjpyPT09ImhvdmVyIj94LmpzeCgkUCx7c2l6ZToxOH0pOnguanN4KGtQLHtzaXplOjE4fSl9KX0pLHguanN4KHZ1LHtvbkNsaWNrOigpPT57bih0PT09ImRhcmsiPyJsaWdodCI6ImRhcmsiKX0sY2hpbGRyZW46eC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImgtWzI0cHhdIHctWzI0cHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIixjaGlsZHJlbjpbdD09PSJkYXJrIiYmeC5qc3goYlAse3NpemU6MTV9KSx0PT09ImxpZ2h0IiYmeC5qc3goRVAse3NpemU6MTV9KV19KX0pLHguanN4KHZ1LHthY3RpdmU6cj09PSJmdWxsIixvbkNsaWNrOigpPT57aWYociE9PSJmdWxsIilsb2NhbFN0b3JhZ2Uuc2V0SXRlbShReSx3aW5kb3cubG9jYXRpb24uaHJlZiksd2luZG93LmxvY2F0aW9uLmhyZWY9ZS5nZXRFZGl0VXJsKCk7ZWxzZSBpZihyPT09ImZ1bGwiKXtjb25zdCBhPWxvY2FsU3RvcmFnZS5nZXRJdGVtKFF5KTt3aW5kb3cubG9jYXRpb24uaHJlZj1hfHwiLyJ9fSxjaGlsZHJlbjp4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJoLVsyNHB4XSB3LVsyNHB4XSBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciIsY2hpbGRyZW46cj09PSJmdWxsIj94LmpzeChDUCx7c2l6ZToxNX0pOnguanN4KFNQLHtzaXplOjE1fSl9KX0pLGwmJnguanN4KHZ1LHtvbkNsaWNrOigpPT57fSxjaGlsZHJlbjp4LmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVsYXRpdmUgaC1bMjRweF0gdy1bMjRweF0gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIiLGNoaWxkcmVuOlt4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSAtcmlnaHQtWzEwcHhdIC10b3AtWzEwcHhdIGJvcmRlciBib3JkZXItYm9yZGVyIHJvdW5kZWQtZnVsbCBweC0xIGZvbnQtc2FucyB0ZXh0LXhzIGJnLWNhcmQgdGV4dC1hY2NlbnQiLGNoaWxkcmVuOmx9KSx4LmpzeChOUCx7c2l6ZToxOH0pXX0pfSkseC5qc3goImEiLHtjbGFzc05hbWU6aHAsaHJlZjplLmdldERpc2FibGVVcmwoKSxjaGlsZHJlbjp4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJoLVsyNHB4XSB3LVsyNHB4XSBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciIsY2hpbGRyZW46eC5qc3goVFAse3NpemU6MTh9KX0pfSldfSl9ZnVuY3Rpb24gT1Aoe2NoaWxkcmVuOmV9KXtyZXR1cm4geC5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtZnVsbCBweC0yIHB5LTIgZm9udC1zYW5zIGJvcmRlci0yIHJvdW5kZWQtZnVsbCBnYXAteC0zIHRleHQtcHJpbWFyeSBiZy1iYWNrZ3JvdW5kIGJvcmRlci1maWxsIixjaGlsZHJlbjplfSl9ZnVuY3Rpb24gdnUoe2FjdGl2ZTplLG9uQ2xpY2s6dCxjaGlsZHJlbjpufSl7cmV0dXJuIHguanN4KCJidXR0b24iLHtjbGFzc05hbWU6aWQoaHAseyJiZy1hY2NlbnQgZHJvcC1zaGFkb3ctWzBweF8wcHhfMTJweF9yZ2JhKDU2LDIwNSwxNTIsMC42MCldIjplfSksb25DbGljazp0LGNoaWxkcmVuOm59KX1mdW5jdGlvbiBMUyhlKXt2YXIgdCxuLHI9IiI7aWYodHlwZW9mIGU9PSJzdHJpbmcifHx0eXBlb2YgZT09Im51bWJlciIpcis9ZTtlbHNlIGlmKHR5cGVvZiBlPT0ib2JqZWN0IilpZihBcnJheS5pc0FycmF5KGUpKWZvcih0PTA7dDxlLmxlbmd0aDt0KyspZVt0XSYmKG49TFMoZVt0XSkpJiYociYmKHIrPSIgIikscis9bik7ZWxzZSBmb3IodCBpbiBlKWVbdF0mJihyJiYocis9IiAiKSxyKz10KTtyZXR1cm4gcn1mdW5jdGlvbiBBUCgpe2Zvcih2YXIgZSx0LG49MCxyPSIiO248YXJndW1lbnRzLmxlbmd0aDspKGU9YXJndW1lbnRzW24rK10pJiYodD1MUyhlKSkmJihyJiYocis9IiAiKSxyKz10KTtyZXR1cm4gcn1jb25zdCBKeT1lPT50eXBlb2YgZT09ImJvb2xlYW4iPyIiLmNvbmNhdChlKTplPT09MD8iMCI6ZSxaeT1BUCxNUD0oZSx0KT0+bj0+e3ZhciByO2lmKCh0PT1udWxsP3ZvaWQgMDp0LnZhcmlhbnRzKT09bnVsbClyZXR1cm4gWnkoZSxuPT1udWxsP3ZvaWQgMDpuLmNsYXNzLG49PW51bGw/dm9pZCAwOm4uY2xhc3NOYW1lKTtjb25zdHt2YXJpYW50czpvLGRlZmF1bHRWYXJpYW50czppfT10LGw9T2JqZWN0LmtleXMobykubWFwKHU9Pntjb25zdCBjPW49PW51bGw/dm9pZCAwOm5bdV0sZD1pPT1udWxsP3ZvaWQgMDppW3VdO2lmKGM9PT1udWxsKXJldHVybiBudWxsO2NvbnN0IGY9SnkoYyl8fEp5KGQpO3JldHVybiBvW3VdW2ZdfSkscz1uJiZPYmplY3QuZW50cmllcyhuKS5yZWR1Y2UoKHUsYyk9PntsZXRbZCxmXT1jO3JldHVybiBmPT09dm9pZCAwfHwodVtkXT1mKSx1fSx7fSksYT10PT1udWxsfHwocj10LmNvbXBvdW5kVmFyaWFudHMpPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci5yZWR1Y2UoKHUsYyk9PntsZXR7Y2xhc3M6ZCxjbGFzc05hbWU6ZiwuLi5ofT1jO3JldHVybiBPYmplY3QuZW50cmllcyhoKS5ldmVyeShnPT57bGV0W20sU109ZztyZXR1cm4gQXJyYXkuaXNBcnJheShTKT9TLmluY2x1ZGVzKHsuLi5pLC4uLnN9W21dKTp7Li4uaSwuLi5zfVttXT09PVN9KT9bLi4udSxkLGZdOnV9LFtdKTtyZXR1cm4gWnkoZSxsLGEsbj09bnVsbD92b2lkIDA6bi5jbGFzcyxuPT1udWxsP3ZvaWQgMDpuLmNsYXNzTmFtZSl9LERQPU1QKCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgd2hpdGVzcGFjZS1ub3dyYXAgcm91bmRlZC1tZCB0ZXh0LXNtIGZvbnQtbWVkaXVtIHJpbmctb2Zmc2V0LWJhY2tncm91bmQgdHJhbnNpdGlvbi1jb2xvcnMgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC0yIGRpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmUgZGlzYWJsZWQ6b3BhY2l0eS01MCIse3ZhcmlhbnRzOnt2YXJpYW50OntkZWZhdWx0OiJiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGhvdmVyOmJnLXByaW1hcnkvOTAiLGRlc3RydWN0aXZlOiJiZy1kZXN0cnVjdGl2ZSB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQgaG92ZXI6YmctZGVzdHJ1Y3RpdmUvOTAiLG91dGxpbmU6ImJvcmRlciBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCIsc2Vjb25kYXJ5OiJiZy1zZWNvbmRhcnkgdGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZCBob3ZlcjpiZy1zZWNvbmRhcnkvODAiLGdob3N0OiJob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCIsbGluazoidGV4dC1wcmltYXJ5IHVuZGVybGluZS1vZmZzZXQtNCBob3Zlcjp1bmRlcmxpbmUifSxzaXplOntkZWZhdWx0OiJoLTEwIHB4LTQgcHktMiIsc206ImgtOSByb3VuZGVkLW1kIHB4LTMiLGxnOiJoLTExIHJvdW5kZWQtbWQgcHgtOCIsaWNvbjoiaC0xMCB3LTEwIn19LGRlZmF1bHRWYXJpYW50czp7dmFyaWFudDoiZGVmYXVsdCIsc2l6ZToiZGVmYXVsdCJ9fSksWGw9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsdmFyaWFudDp0LHNpemU6bixhc0NoaWxkOnI9ITEsLi4ub30saSk9Pntjb25zdCBsPXI/JGw6ImJ1dHRvbiI7cmV0dXJuIHguanN4KGwse2NsYXNzTmFtZTpvdChEUCh7dmFyaWFudDp0LHNpemU6bixjbGFzc05hbWU6ZX0pKSxyZWY6aSwuLi5vfSl9KTtYbC5kaXNwbGF5TmFtZT0iQnV0dG9uIjtmdW5jdGlvbiBMUChlPSJkYXJrIil7Y29uc3RbdCxuXT1wLnVzZVN0YXRlKGUpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2xvY2FsU3RvcmFnZS5nZXRJdGVtKCJ2YWwtdGhlbWUiKT09PSJsaWdodCI/bigibGlnaHQiKTpsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidmFsLXRoZW1lIik9PT0iZGFyayJ8fHdpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIpLm1hdGNoZXM/bigiZGFyayIpOndpbmRvdy5tYXRjaE1lZGlhJiZ3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCkiKS5tYXRjaGVzJiZuKCJsaWdodCIpO2NvbnN0IHI9bz0+e2xvY2FsU3RvcmFnZS5nZXRJdGVtKCJ2YWwtdGhlbWUiKXx8bihvLm1hdGNoZXM/ImRhcmsiOiJsaWdodCIpfTtyZXR1cm4gd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykiKS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHIpLCgpPT57d2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykiKS5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHIpfX0sW10pLFt0LHI9Pntsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgidmFsLXRoZW1lIixyKSxuKHIpfV19ZnVuY3Rpb24gZ20oKXtyZXR1cm57YXN5bmM6ITEsYnJlYWtzOiExLGV4dGVuc2lvbnM6bnVsbCxnZm06ITAsaG9va3M6bnVsbCxwZWRhbnRpYzohMSxyZW5kZXJlcjpudWxsLHNpbGVudDohMSx0b2tlbml6ZXI6bnVsbCx3YWxrVG9rZW5zOm51bGx9fWxldCBiaT1nbSgpO2Z1bmN0aW9uIElTKGUpe2JpPWV9Y29uc3QgalM9L1smPD4iJ10vLElQPW5ldyBSZWdFeHAoalMuc291cmNlLCJnIikselM9L1s8PiInXXwmKD8hKCNcZHsxLDd9fCNbWHhdW2EtZkEtRjAtOV17MSw2fXxcdyspOykvLGpQPW5ldyBSZWdFeHAoelMuc291cmNlLCJnIikselA9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyJ9LHF5PWU9PnpQW2VdO2Z1bmN0aW9uIHZuKGUsdCl7aWYodCl7aWYoalMudGVzdChlKSlyZXR1cm4gZS5yZXBsYWNlKElQLHF5KX1lbHNlIGlmKHpTLnRlc3QoZSkpcmV0dXJuIGUucmVwbGFjZShqUCxxeSk7cmV0dXJuIGV9Y29uc3QgRlA9LyYoIyg/OlxkKyl8KD86I3hbMC05QS1GYS1mXSspfCg/Olx3KykpOz8vaWc7ZnVuY3Rpb24gQlAoZSl7cmV0dXJuIGUucmVwbGFjZShGUCwodCxuKT0+KG49bi50b0xvd2VyQ2FzZSgpLG49PT0iY29sb24iPyI6IjpuLmNoYXJBdCgwKT09PSIjIj9uLmNoYXJBdCgxKT09PSJ4Ij9TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KG4uc3Vic3RyaW5nKDIpLDE2KSk6U3RyaW5nLmZyb21DaGFyQ29kZSgrbi5zdWJzdHJpbmcoMSkpOiIiKSl9Y29uc3QgV1A9LyhefFteXFtdKVxeL2c7ZnVuY3Rpb24gUmUoZSx0KXtlPXR5cGVvZiBlPT0ic3RyaW5nIj9lOmUuc291cmNlLHQ9dHx8IiI7Y29uc3Qgbj17cmVwbGFjZToocixvKT0+KG89dHlwZW9mIG89PSJvYmplY3QiJiYic291cmNlImluIG8/by5zb3VyY2U6byxvPW8ucmVwbGFjZShXUCwiJDEiKSxlPWUucmVwbGFjZShyLG8pLG4pLGdldFJlZ2V4OigpPT5uZXcgUmVnRXhwKGUsdCl9O3JldHVybiBufWZ1bmN0aW9uIGUwKGUpe3RyeXtlPWVuY29kZVVSSShlKS5yZXBsYWNlKC8lMjUvZywiJSIpfWNhdGNoe3JldHVybiBudWxsfXJldHVybiBlfWNvbnN0IFBjPXtleGVjOigpPT5udWxsfTtmdW5jdGlvbiB0MChlLHQpe2NvbnN0IG49ZS5yZXBsYWNlKC9cfC9nLChpLGwscyk9PntsZXQgYT0hMSx1PWw7Zm9yKDstLXU+PTAmJnNbdV09PT0iXFwiOylhPSFhO3JldHVybiBhPyJ8IjoiIHwifSkscj1uLnNwbGl0KC8gXHwvKTtsZXQgbz0wO2lmKHJbMF0udHJpbSgpfHxyLnNoaWZ0KCksci5sZW5ndGg+MCYmIXJbci5sZW5ndGgtMV0udHJpbSgpJiZyLnBvcCgpLHQpaWYoci5sZW5ndGg+dClyLnNwbGljZSh0KTtlbHNlIGZvcig7ci5sZW5ndGg8dDspci5wdXNoKCIiKTtmb3IoO288ci5sZW5ndGg7bysrKXJbb109cltvXS50cmltKCkucmVwbGFjZSgvXFxcfC9nLCJ8Iik7cmV0dXJuIHJ9ZnVuY3Rpb24gRWYoZSx0LG4pe2NvbnN0IHI9ZS5sZW5ndGg7aWYocj09PTApcmV0dXJuIiI7bGV0IG89MDtmb3IoO288cjspe2NvbnN0IGk9ZS5jaGFyQXQoci1vLTEpO2lmKGk9PT10JiYhbilvKys7ZWxzZSBpZihpIT09dCYmbilvKys7ZWxzZSBicmVha31yZXR1cm4gZS5zbGljZSgwLHItbyl9ZnVuY3Rpb24gVVAoZSx0KXtpZihlLmluZGV4T2YodFsxXSk9PT0tMSlyZXR1cm4tMTtsZXQgbj0wO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKGVbcl09PT0iXFwiKXIrKztlbHNlIGlmKGVbcl09PT10WzBdKW4rKztlbHNlIGlmKGVbcl09PT10WzFdJiYobi0tLG48MCkpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gbjAoZSx0LG4scil7Y29uc3Qgbz10LmhyZWYsaT10LnRpdGxlP3ZuKHQudGl0bGUpOm51bGwsbD1lWzFdLnJlcGxhY2UoL1xcKFtcW1xdXSkvZywiJDEiKTtpZihlWzBdLmNoYXJBdCgwKSE9PSIhIil7ci5zdGF0ZS5pbkxpbms9ITA7Y29uc3Qgcz17dHlwZToibGluayIscmF3Om4saHJlZjpvLHRpdGxlOmksdGV4dDpsLHRva2VuczpyLmlubGluZVRva2VucyhsKX07cmV0dXJuIHIuc3RhdGUuaW5MaW5rPSExLHN9cmV0dXJue3R5cGU6ImltYWdlIixyYXc6bixocmVmOm8sdGl0bGU6aSx0ZXh0OnZuKGwpfX1mdW5jdGlvbiBWUChlLHQpe2NvbnN0IG49ZS5tYXRjaCgvXihccyspKD86YGBgKS8pO2lmKG49PT1udWxsKXJldHVybiB0O2NvbnN0IHI9blsxXTtyZXR1cm4gdC5zcGxpdChgCmApLm1hcChvPT57Y29uc3QgaT1vLm1hdGNoKC9eXHMrLyk7aWYoaT09PW51bGwpcmV0dXJuIG87Y29uc3RbbF09aTtyZXR1cm4gbC5sZW5ndGg+PXIubGVuZ3RoP28uc2xpY2Uoci5sZW5ndGgpOm99KS5qb2luKGAKYCl9Y2xhc3MgT2N7Y29uc3RydWN0b3IodCl7amUodGhpcywib3B0aW9ucyIpO2plKHRoaXMsInJ1bGVzIik7amUodGhpcywibGV4ZXIiKTt0aGlzLm9wdGlvbnM9dHx8Yml9c3BhY2UodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLm5ld2xpbmUuZXhlYyh0KTtpZihuJiZuWzBdLmxlbmd0aD4wKXJldHVybnt0eXBlOiJzcGFjZSIscmF3Om5bMF19fWNvZGUodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmNvZGUuZXhlYyh0KTtpZihuKXtjb25zdCByPW5bMF0ucmVwbGFjZSgvXiB7MSw0fS9nbSwiIik7cmV0dXJue3R5cGU6ImNvZGUiLHJhdzpuWzBdLGNvZGVCbG9ja1N0eWxlOiJpbmRlbnRlZCIsdGV4dDp0aGlzLm9wdGlvbnMucGVkYW50aWM/cjpFZihyLGAKYCl9fX1mZW5jZXModCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmZlbmNlcy5leGVjKHQpO2lmKG4pe2NvbnN0IHI9blswXSxvPVZQKHIsblszXXx8IiIpO3JldHVybnt0eXBlOiJjb2RlIixyYXc6cixsYW5nOm5bMl0/blsyXS50cmltKCkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5fZXNjYXBlcywiJDEiKTpuWzJdLHRleHQ6b319fWhlYWRpbmcodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmhlYWRpbmcuZXhlYyh0KTtpZihuKXtsZXQgcj1uWzJdLnRyaW0oKTtpZigvIyQvLnRlc3Qocikpe2NvbnN0IG89RWYociwiIyIpOyh0aGlzLm9wdGlvbnMucGVkYW50aWN8fCFvfHwvICQvLnRlc3QobykpJiYocj1vLnRyaW0oKSl9cmV0dXJue3R5cGU6ImhlYWRpbmciLHJhdzpuWzBdLGRlcHRoOm5bMV0ubGVuZ3RoLHRleHQ6cix0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUocil9fX1ocih0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2suaHIuZXhlYyh0KTtpZihuKXJldHVybnt0eXBlOiJociIscmF3Om5bMF19fWJsb2NrcXVvdGUodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmJsb2NrcXVvdGUuZXhlYyh0KTtpZihuKXtjb25zdCByPW5bMF0ucmVwbGFjZSgvXiAqPlsgXHRdPy9nbSwiIiksbz10aGlzLmxleGVyLnN0YXRlLnRvcDt0aGlzLmxleGVyLnN0YXRlLnRvcD0hMDtjb25zdCBpPXRoaXMubGV4ZXIuYmxvY2tUb2tlbnMocik7cmV0dXJuIHRoaXMubGV4ZXIuc3RhdGUudG9wPW8se3R5cGU6ImJsb2NrcXVvdGUiLHJhdzpuWzBdLHRva2VuczppLHRleHQ6cn19fWxpc3QodCl7bGV0IG49dGhpcy5ydWxlcy5ibG9jay5saXN0LmV4ZWModCk7aWYobil7bGV0IHI9blsxXS50cmltKCk7Y29uc3Qgbz1yLmxlbmd0aD4xLGk9e3R5cGU6Imxpc3QiLHJhdzoiIixvcmRlcmVkOm8sc3RhcnQ6bz8rci5zbGljZSgwLC0xKToiIixsb29zZTohMSxpdGVtczpbXX07cj1vP2BcXGR7MSw5fVxcJHtyLnNsaWNlKC0xKX1gOmBcXCR7cn1gLHRoaXMub3B0aW9ucy5wZWRhbnRpYyYmKHI9bz9yOiJbKistXSIpO2NvbnN0IGw9bmV3IFJlZ0V4cChgXiggezAsM30ke3J9KSgoPzpbCSBdW15cXG5dKik/KD86XFxufCQpKWApO2xldCBzPSIiLGE9IiIsdT0hMTtmb3IoO3Q7KXtsZXQgYz0hMTtpZighKG49bC5leGVjKHQpKXx8dGhpcy5ydWxlcy5ibG9jay5oci50ZXN0KHQpKWJyZWFrO3M9blswXSx0PXQuc3Vic3RyaW5nKHMubGVuZ3RoKTtsZXQgZD1uWzJdLnNwbGl0KGAKYCwxKVswXS5yZXBsYWNlKC9eXHQrLyx2PT4iICIucmVwZWF0KDMqdi5sZW5ndGgpKSxmPXQuc3BsaXQoYApgLDEpWzBdLGg9MDt0aGlzLm9wdGlvbnMucGVkYW50aWM/KGg9MixhPWQudHJpbVN0YXJ0KCkpOihoPW5bMl0uc2VhcmNoKC9bXiBdLyksaD1oPjQ/MTpoLGE9ZC5zbGljZShoKSxoKz1uWzFdLmxlbmd0aCk7bGV0IGc9ITE7aWYoIWQmJi9eICokLy50ZXN0KGYpJiYocys9ZitgCmAsdD10LnN1YnN0cmluZyhmLmxlbmd0aCsxKSxjPSEwKSwhYyl7Y29uc3Qgdj1uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxoLTEpfX0oPzpbKistXXxcXGR7MSw5fVsuKV0pKCg/OlsgCV1bXlxcbl0qKT8oPzpcXG58JCkpYCkseT1uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxoLTEpfX0oKD86LSAqKXszLH18KD86XyAqKXszLH18KD86XFwqICopezMsfSkoPzpcXG4rfCQpYCksXz1uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxoLTEpfX0oPzpcYFxgXGB8fn5+KWApLHc9bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsaC0xKX19I2ApO2Zvcig7dDspe2NvbnN0IEM9dC5zcGxpdChgCmAsMSlbMF07aWYoZj1DLHRoaXMub3B0aW9ucy5wZWRhbnRpYyYmKGY9Zi5yZXBsYWNlKC9eIHsxLDR9KD89KCB7NH0pKlteIF0pL2csIiAgIikpLF8udGVzdChmKXx8dy50ZXN0KGYpfHx2LnRlc3QoZil8fHkudGVzdCh0KSlicmVhaztpZihmLnNlYXJjaCgvW14gXS8pPj1ofHwhZi50cmltKCkpYSs9YApgK2Yuc2xpY2UoaCk7ZWxzZXtpZihnfHxkLnNlYXJjaCgvW14gXS8pPj00fHxfLnRlc3QoZCl8fHcudGVzdChkKXx8eS50ZXN0KGQpKWJyZWFrO2ErPWAKYCtmfSFnJiYhZi50cmltKCkmJihnPSEwKSxzKz1DK2AKYCx0PXQuc3Vic3RyaW5nKEMubGVuZ3RoKzEpLGQ9Zi5zbGljZShoKX19aS5sb29zZXx8KHU/aS5sb29zZT0hMDovXG4gKlxuICokLy50ZXN0KHMpJiYodT0hMCkpO2xldCBtPW51bGwsUzt0aGlzLm9wdGlvbnMuZ2ZtJiYobT0vXlxbWyB4WF1cXSAvLmV4ZWMoYSksbSYmKFM9bVswXSE9PSJbIF0gIixhPWEucmVwbGFjZSgvXlxbWyB4WF1cXSArLywiIikpKSxpLml0ZW1zLnB1c2goe3R5cGU6Imxpc3RfaXRlbSIscmF3OnMsdGFzazohIW0sY2hlY2tlZDpTLGxvb3NlOiExLHRleHQ6YSx0b2tlbnM6W119KSxpLnJhdys9c31pLml0ZW1zW2kuaXRlbXMubGVuZ3RoLTFdLnJhdz1zLnRyaW1FbmQoKSxpLml0ZW1zW2kuaXRlbXMubGVuZ3RoLTFdLnRleHQ9YS50cmltRW5kKCksaS5yYXc9aS5yYXcudHJpbUVuZCgpO2ZvcihsZXQgYz0wO2M8aS5pdGVtcy5sZW5ndGg7YysrKWlmKHRoaXMubGV4ZXIuc3RhdGUudG9wPSExLGkuaXRlbXNbY10udG9rZW5zPXRoaXMubGV4ZXIuYmxvY2tUb2tlbnMoaS5pdGVtc1tjXS50ZXh0LFtdKSwhaS5sb29zZSl7Y29uc3QgZD1pLml0ZW1zW2NdLnRva2Vucy5maWx0ZXIoaD0+aC50eXBlPT09InNwYWNlIiksZj1kLmxlbmd0aD4wJiZkLnNvbWUoaD0+L1xuLipcbi8udGVzdChoLnJhdykpO2kubG9vc2U9Zn1pZihpLmxvb3NlKWZvcihsZXQgYz0wO2M8aS5pdGVtcy5sZW5ndGg7YysrKWkuaXRlbXNbY10ubG9vc2U9ITA7cmV0dXJuIGl9fWh0bWwodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmh0bWwuZXhlYyh0KTtpZihuKXJldHVybnt0eXBlOiJodG1sIixibG9jazohMCxyYXc6blswXSxwcmU6blsxXT09PSJwcmUifHxuWzFdPT09InNjcmlwdCJ8fG5bMV09PT0ic3R5bGUiLHRleHQ6blswXX19ZGVmKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5kZWYuZXhlYyh0KTtpZihuKXtjb25zdCByPW5bMV0udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ccysvZywiICIpLG89blsyXT9uWzJdLnJlcGxhY2UoL148KC4qKT4kLywiJDEiKS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLl9lc2NhcGVzLCIkMSIpOiIiLGk9blszXT9uWzNdLnN1YnN0cmluZygxLG5bM10ubGVuZ3RoLTEpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIik6blszXTtyZXR1cm57dHlwZToiZGVmIix0YWc6cixyYXc6blswXSxocmVmOm8sdGl0bGU6aX19fXRhYmxlKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay50YWJsZS5leGVjKHQpO2lmKG4pe2lmKCEvWzp8XS8udGVzdChuWzJdKSlyZXR1cm47Y29uc3Qgcj17dHlwZToidGFibGUiLHJhdzpuWzBdLGhlYWRlcjp0MChuWzFdKS5tYXAobz0+KHt0ZXh0Om8sdG9rZW5zOltdfSkpLGFsaWduOm5bMl0ucmVwbGFjZSgvXlx8fFx8ICokL2csIiIpLnNwbGl0KCJ8Iikscm93czpuWzNdJiZuWzNdLnRyaW0oKT9uWzNdLnJlcGxhY2UoL1xuWyBcdF0qJC8sIiIpLnNwbGl0KGAKYCk6W119O2lmKHIuaGVhZGVyLmxlbmd0aD09PXIuYWxpZ24ubGVuZ3RoKXtsZXQgbz1yLmFsaWduLmxlbmd0aCxpLGwscyxhO2ZvcihpPTA7aTxvO2krKyl7Y29uc3QgdT1yLmFsaWduW2ldO3UmJigvXiAqLSs6ICokLy50ZXN0KHUpP3IuYWxpZ25baV09InJpZ2h0IjovXiAqOi0rOiAqJC8udGVzdCh1KT9yLmFsaWduW2ldPSJjZW50ZXIiOi9eICo6LSsgKiQvLnRlc3QodSk/ci5hbGlnbltpXT0ibGVmdCI6ci5hbGlnbltpXT1udWxsKX1mb3Iobz1yLnJvd3MubGVuZ3RoLGk9MDtpPG87aSsrKXIucm93c1tpXT10MChyLnJvd3NbaV0sci5oZWFkZXIubGVuZ3RoKS5tYXAodT0+KHt0ZXh0OnUsdG9rZW5zOltdfSkpO2ZvcihvPXIuaGVhZGVyLmxlbmd0aCxsPTA7bDxvO2wrKylyLmhlYWRlcltsXS50b2tlbnM9dGhpcy5sZXhlci5pbmxpbmUoci5oZWFkZXJbbF0udGV4dCk7Zm9yKG89ci5yb3dzLmxlbmd0aCxsPTA7bDxvO2wrKylmb3IoYT1yLnJvd3NbbF0scz0wO3M8YS5sZW5ndGg7cysrKWFbc10udG9rZW5zPXRoaXMubGV4ZXIuaW5saW5lKGFbc10udGV4dCk7cmV0dXJuIHJ9fX1saGVhZGluZyh0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2subGhlYWRpbmcuZXhlYyh0KTtpZihuKXJldHVybnt0eXBlOiJoZWFkaW5nIixyYXc6blswXSxkZXB0aDpuWzJdLmNoYXJBdCgwKT09PSI9Ij8xOjIsdGV4dDpuWzFdLHRva2Vuczp0aGlzLmxleGVyLmlubGluZShuWzFdKX19cGFyYWdyYXBoKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5wYXJhZ3JhcGguZXhlYyh0KTtpZihuKXtjb25zdCByPW5bMV0uY2hhckF0KG5bMV0ubGVuZ3RoLTEpPT09YApgP25bMV0uc2xpY2UoMCwtMSk6blsxXTtyZXR1cm57dHlwZToicGFyYWdyYXBoIixyYXc6blswXSx0ZXh0OnIsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKHIpfX19dGV4dCh0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2sudGV4dC5leGVjKHQpO2lmKG4pcmV0dXJue3R5cGU6InRleHQiLHJhdzpuWzBdLHRleHQ6blswXSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUoblswXSl9fWVzY2FwZSh0KXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLmVzY2FwZS5leGVjKHQpO2lmKG4pcmV0dXJue3R5cGU6ImVzY2FwZSIscmF3Om5bMF0sdGV4dDp2bihuWzFdKX19dGFnKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUudGFnLmV4ZWModCk7aWYobilyZXR1cm4hdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsmJi9ePGEgL2kudGVzdChuWzBdKT90aGlzLmxleGVyLnN0YXRlLmluTGluaz0hMDp0aGlzLmxleGVyLnN0YXRlLmluTGluayYmL148XC9hPi9pLnRlc3QoblswXSkmJih0aGlzLmxleGVyLnN0YXRlLmluTGluaz0hMSksIXRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayYmL148KHByZXxjb2RlfGtiZHxzY3JpcHQpKFxzfD4pL2kudGVzdChuWzBdKT90aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s9ITA6dGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrJiYvXjxcLyhwcmV8Y29kZXxrYmR8c2NyaXB0KShcc3w+KS9pLnRlc3QoblswXSkmJih0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s9ITEpLHt0eXBlOiJodG1sIixyYXc6blswXSxpbkxpbms6dGhpcy5sZXhlci5zdGF0ZS5pbkxpbmssaW5SYXdCbG9jazp0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2ssYmxvY2s6ITEsdGV4dDpuWzBdfX1saW5rKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUubGluay5leGVjKHQpO2lmKG4pe2NvbnN0IHI9blsyXS50cmltKCk7aWYoIXRoaXMub3B0aW9ucy5wZWRhbnRpYyYmL148Ly50ZXN0KHIpKXtpZighLz4kLy50ZXN0KHIpKXJldHVybjtjb25zdCBsPUVmKHIuc2xpY2UoMCwtMSksIlxcIik7aWYoKHIubGVuZ3RoLWwubGVuZ3RoKSUyPT09MClyZXR1cm59ZWxzZXtjb25zdCBsPVVQKG5bMl0sIigpIik7aWYobD4tMSl7Y29uc3QgYT0oblswXS5pbmRleE9mKCIhIik9PT0wPzU6NCkrblsxXS5sZW5ndGgrbDtuWzJdPW5bMl0uc3Vic3RyaW5nKDAsbCksblswXT1uWzBdLnN1YnN0cmluZygwLGEpLnRyaW0oKSxuWzNdPSIifX1sZXQgbz1uWzJdLGk9IiI7aWYodGhpcy5vcHRpb25zLnBlZGFudGljKXtjb25zdCBsPS9eKFteJyJdKlteXHNdKVxzKyhbJyJdKSguKilcMi8uZXhlYyhvKTtsJiYobz1sWzFdLGk9bFszXSl9ZWxzZSBpPW5bM10/blszXS5zbGljZSgxLC0xKToiIjtyZXR1cm4gbz1vLnRyaW0oKSwvXjwvLnRlc3QobykmJih0aGlzLm9wdGlvbnMucGVkYW50aWMmJiEvPiQvLnRlc3Qocik/bz1vLnNsaWNlKDEpOm89by5zbGljZSgxLC0xKSksbjAobix7aHJlZjpvJiZvLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIiksdGl0bGU6aSYmaS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLl9lc2NhcGVzLCIkMSIpfSxuWzBdLHRoaXMubGV4ZXIpfX1yZWZsaW5rKHQsbil7bGV0IHI7aWYoKHI9dGhpcy5ydWxlcy5pbmxpbmUucmVmbGluay5leGVjKHQpKXx8KHI9dGhpcy5ydWxlcy5pbmxpbmUubm9saW5rLmV4ZWModCkpKXtsZXQgbz0oclsyXXx8clsxXSkucmVwbGFjZSgvXHMrL2csIiAiKTtpZihvPW5bby50b0xvd2VyQ2FzZSgpXSwhbyl7Y29uc3QgaT1yWzBdLmNoYXJBdCgwKTtyZXR1cm57dHlwZToidGV4dCIscmF3OmksdGV4dDppfX1yZXR1cm4gbjAocixvLHJbMF0sdGhpcy5sZXhlcil9fWVtU3Ryb25nKHQsbixyPSIiKXtsZXQgbz10aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZy5sRGVsaW0uZXhlYyh0KTtpZighb3x8b1szXSYmci5tYXRjaCgvW1xwe0x9XHB7Tn1dL3UpKXJldHVybjtpZighKG9bMV18fG9bMl18fCIiKXx8IXJ8fHRoaXMucnVsZXMuaW5saW5lLnB1bmN0dWF0aW9uLmV4ZWMocikpe2NvbnN0IGw9Wy4uLm9bMF1dLmxlbmd0aC0xO2xldCBzLGEsdT1sLGM9MDtjb25zdCBkPW9bMF1bMF09PT0iKiI/dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmcuckRlbGltQXN0OnRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nLnJEZWxpbVVuZDtmb3IoZC5sYXN0SW5kZXg9MCxuPW4uc2xpY2UoLTEqdC5sZW5ndGgrb1swXS5sZW5ndGgtMSk7KG89ZC5leGVjKG4pKSE9bnVsbDspe2lmKHM9b1sxXXx8b1syXXx8b1szXXx8b1s0XXx8b1s1XXx8b1s2XSwhcyljb250aW51ZTtpZihhPVsuLi5zXS5sZW5ndGgsb1szXXx8b1s0XSl7dSs9YTtjb250aW51ZX1lbHNlIGlmKChvWzVdfHxvWzZdKSYmbCUzJiYhKChsK2EpJTMpKXtjKz1hO2NvbnRpbnVlfWlmKHUtPWEsdT4wKWNvbnRpbnVlO2E9TWF0aC5taW4oYSxhK3UrYyk7Y29uc3QgZj1bLi4udF0uc2xpY2UoMCxsK28uaW5kZXgrYSsxKS5qb2luKCIiKTtpZihNYXRoLm1pbihsLGEpJTIpe2NvbnN0IGc9Zi5zbGljZSgxLC0xKTtyZXR1cm57dHlwZToiZW0iLHJhdzpmLHRleHQ6Zyx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmVUb2tlbnMoZyl9fWNvbnN0IGg9Zi5zbGljZSgyLC0yKTtyZXR1cm57dHlwZToic3Ryb25nIixyYXc6Zix0ZXh0OmgsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKGgpfX19fWNvZGVzcGFuKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUuY29kZS5leGVjKHQpO2lmKG4pe2xldCByPW5bMl0ucmVwbGFjZSgvXG4vZywiICIpO2NvbnN0IG89L1teIF0vLnRlc3QociksaT0vXiAvLnRlc3QocikmJi8gJC8udGVzdChyKTtyZXR1cm4gbyYmaSYmKHI9ci5zdWJzdHJpbmcoMSxyLmxlbmd0aC0xKSkscj12bihyLCEwKSx7dHlwZToiY29kZXNwYW4iLHJhdzpuWzBdLHRleHQ6cn19fWJyKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUuYnIuZXhlYyh0KTtpZihuKXJldHVybnt0eXBlOiJiciIscmF3Om5bMF19fWRlbCh0KXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLmRlbC5leGVjKHQpO2lmKG4pcmV0dXJue3R5cGU6ImRlbCIscmF3Om5bMF0sdGV4dDpuWzJdLHRva2Vuczp0aGlzLmxleGVyLmlubGluZVRva2VucyhuWzJdKX19YXV0b2xpbmsodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS5hdXRvbGluay5leGVjKHQpO2lmKG4pe2xldCByLG87cmV0dXJuIG5bMl09PT0iQCI/KHI9dm4oblsxXSksbz0ibWFpbHRvOiIrcik6KHI9dm4oblsxXSksbz1yKSx7dHlwZToibGluayIscmF3Om5bMF0sdGV4dDpyLGhyZWY6byx0b2tlbnM6W3t0eXBlOiJ0ZXh0IixyYXc6cix0ZXh0OnJ9XX19fXVybCh0KXtsZXQgbjtpZihuPXRoaXMucnVsZXMuaW5saW5lLnVybC5leGVjKHQpKXtsZXQgcixvO2lmKG5bMl09PT0iQCIpcj12bihuWzBdKSxvPSJtYWlsdG86IityO2Vsc2V7bGV0IGk7ZG8gaT1uWzBdLG5bMF09dGhpcy5ydWxlcy5pbmxpbmUuX2JhY2twZWRhbC5leGVjKG5bMF0pWzBdO3doaWxlKGkhPT1uWzBdKTtyPXZuKG5bMF0pLG5bMV09PT0id3d3LiI/bz0iaHR0cDovLyIrblswXTpvPW5bMF19cmV0dXJue3R5cGU6ImxpbmsiLHJhdzpuWzBdLHRleHQ6cixocmVmOm8sdG9rZW5zOlt7dHlwZToidGV4dCIscmF3OnIsdGV4dDpyfV19fX1pbmxpbmVUZXh0KHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUudGV4dC5leGVjKHQpO2lmKG4pe2xldCByO3JldHVybiB0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s/cj1uWzBdOnI9dm4oblswXSkse3R5cGU6InRleHQiLHJhdzpuWzBdLHRleHQ6cn19fX1jb25zdCByZT17bmV3bGluZTovXig/OiAqKD86XG58JCkpKy8sY29kZTovXiggezR9W15cbl0rKD86XG4oPzogKig/OlxufCQpKSopPykrLyxmZW5jZXM6L14gezAsM30oYHszLH0oPz1bXmBcbl0qKD86XG58JCkpfH57Myx9KShbXlxuXSopKD86XG58JCkoPzp8KFtcc1xTXSo/KSg/OlxufCQpKSg/OiB7MCwzfVwxW35gXSogKig/PVxufCQpfCQpLyxocjovXiB7MCwzfSgoPzotW1x0IF0qKXszLH18KD86X1sgXHRdKil7Myx9fCg/OlwqWyBcdF0qKXszLH0pKD86XG4rfCQpLyxoZWFkaW5nOi9eIHswLDN9KCN7MSw2fSkoPz1cc3wkKSguKikoPzpcbit8JCkvLGJsb2NrcXVvdGU6L14oIHswLDN9PiA/KHBhcmFncmFwaHxbXlxuXSopKD86XG58JCkpKy8sbGlzdDovXiggezAsM31idWxsKShbIFx0XVteXG5dKz8pPyg/OlxufCQpLyxodG1sOiJeIHswLDN9KD86PChzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKVtcXHM+XVtcXHNcXFNdKj8oPzo8L1xcMT5bXlxcbl0qXFxuK3wkKXxjb21tZW50W15cXG5dKihcXG4rfCQpfDxcXD9bXFxzXFxTXSo/KD86XFw/Plxcbip8JCl8PCFbQS1aXVtcXHNcXFNdKj8oPzo+XFxuKnwkKXw8IVxcW0NEQVRBXFxbW1xcc1xcU10qPyg/OlxcXVxcXT5cXG4qfCQpfDwvPyh0YWcpKD86ICt8XFxufC8/PilbXFxzXFxTXSo/KD86KD86XFxuICopK1xcbnwkKXw8KD8hc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSkoW2Etel1bXFx3LV0qKSg/OmF0dHJpYnV0ZSkqPyAqLz8+KD89WyBcXHRdKig/OlxcbnwkKSlbXFxzXFxTXSo/KD86KD86XFxuICopK1xcbnwkKXw8Lyg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpW2Etel1bXFx3LV0qXFxzKj4oPz1bIFxcdF0qKD86XFxufCQpKVtcXHNcXFNdKj8oPzooPzpcXG4gKikrXFxufCQpKSIsZGVmOi9eIHswLDN9XFsobGFiZWwpXF06ICooPzpcbiAqKT8oW148XHNdW15cc10qfDwuKj8+KSg/Oig/OiArKD86XG4gKik/fCAqXG4gKikodGl0bGUpKT8gKig/OlxuK3wkKS8sdGFibGU6UGMsbGhlYWRpbmc6L14oPyFidWxsICkoKD86Lnxcbig/IVxzKj9cbnxidWxsICkpKz8pXG4gezAsM30oPSt8LSspICooPzpcbit8JCkvLF9wYXJhZ3JhcGg6L14oW15cbl0rKD86XG4oPyFocnxoZWFkaW5nfGxoZWFkaW5nfGJsb2NrcXVvdGV8ZmVuY2VzfGxpc3R8aHRtbHx0YWJsZXwgK1xuKVteXG5dKykqKS8sdGV4dDovXlteXG5dKy99O3JlLl9sYWJlbD0vKD8hXHMqXF0pKD86XFwufFteXFtcXVxcXSkrLztyZS5fdGl0bGU9Lyg/OiIoPzpcXCI/fFteIlxcXSkqInwnW14nXG5dKig/OlxuW14nXG5dKykqXG4/J3xcKFteKCldKlwpKS87cmUuZGVmPVJlKHJlLmRlZikucmVwbGFjZSgibGFiZWwiLHJlLl9sYWJlbCkucmVwbGFjZSgidGl0bGUiLHJlLl90aXRsZSkuZ2V0UmVnZXgoKTtyZS5idWxsZXQ9Lyg/OlsqKy1dfFxkezEsOX1bLildKS87cmUubGlzdEl0ZW1TdGFydD1SZSgvXiggKikoYnVsbCkgKi8pLnJlcGxhY2UoImJ1bGwiLHJlLmJ1bGxldCkuZ2V0UmVnZXgoKTtyZS5saXN0PVJlKHJlLmxpc3QpLnJlcGxhY2UoL2J1bGwvZyxyZS5idWxsZXQpLnJlcGxhY2UoImhyIiwiXFxuKyg/PVxcMT8oPzooPzotICopezMsfXwoPzpfICopezMsfXwoPzpcXCogKil7Myx9KSg/Olxcbit8JCkpIikucmVwbGFjZSgiZGVmIiwiXFxuKyg/PSIrcmUuZGVmLnNvdXJjZSsiKSIpLmdldFJlZ2V4KCk7cmUuX3RhZz0iYWRkcmVzc3xhcnRpY2xlfGFzaWRlfGJhc2V8YmFzZWZvbnR8YmxvY2txdW90ZXxib2R5fGNhcHRpb258Y2VudGVyfGNvbHxjb2xncm91cHxkZHxkZXRhaWxzfGRpYWxvZ3xkaXJ8ZGl2fGRsfGR0fGZpZWxkc2V0fGZpZ2NhcHRpb258ZmlndXJlfGZvb3Rlcnxmb3JtfGZyYW1lfGZyYW1lc2V0fGhbMS02XXxoZWFkfGhlYWRlcnxocnxodG1sfGlmcmFtZXxsZWdlbmR8bGl8bGlua3xtYWlufG1lbnV8bWVudWl0ZW18bWV0YXxuYXZ8bm9mcmFtZXN8b2x8b3B0Z3JvdXB8b3B0aW9ufHB8cGFyYW18c2VjdGlvbnxzb3VyY2V8c3VtbWFyeXx0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0aGVhZHx0aXRsZXx0cnx0cmFja3x1bCI7cmUuX2NvbW1lbnQ9LzwhLS0oPyEtPz4pW1xzXFNdKj8oPzotLT58JCkvO3JlLmh0bWw9UmUocmUuaHRtbCwiaSIpLnJlcGxhY2UoImNvbW1lbnQiLHJlLl9jb21tZW50KS5yZXBsYWNlKCJ0YWciLHJlLl90YWcpLnJlcGxhY2UoImF0dHJpYnV0ZSIsLyArW2EtekEtWjpfXVtcdy46LV0qKD86ICo9ICoiW14iXG5dKiJ8ICo9IConW14nXG5dKid8ICo9ICpbXlxzIic9PD5gXSspPy8pLmdldFJlZ2V4KCk7cmUubGhlYWRpbmc9UmUocmUubGhlYWRpbmcpLnJlcGxhY2UoL2J1bGwvZyxyZS5idWxsZXQpLmdldFJlZ2V4KCk7cmUucGFyYWdyYXBoPVJlKHJlLl9wYXJhZ3JhcGgpLnJlcGxhY2UoImhyIixyZS5ocikucmVwbGFjZSgiaGVhZGluZyIsIiB7MCwzfSN7MSw2fSAiKS5yZXBsYWNlKCJ8bGhlYWRpbmciLCIiKS5yZXBsYWNlKCJ8dGFibGUiLCIiKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoImZlbmNlcyIsIiB7MCwzfSg/OmB7Myx9KD89W15gXFxuXSpcXG4pfH57Myx9KVteXFxuXSpcXG4iKS5yZXBsYWNlKCJsaXN0IiwiIHswLDN9KD86WyorLV18MVsuKV0pICIpLnJlcGxhY2UoImh0bWwiLCI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIscmUuX3RhZykuZ2V0UmVnZXgoKTtyZS5ibG9ja3F1b3RlPVJlKHJlLmJsb2NrcXVvdGUpLnJlcGxhY2UoInBhcmFncmFwaCIscmUucGFyYWdyYXBoKS5nZXRSZWdleCgpO3JlLm5vcm1hbD17Li4ucmV9O3JlLmdmbT17Li4ucmUubm9ybWFsLHRhYmxlOiJeICooW15cXG4gXS4qKVxcbiB7MCwzfSgoPzpcXHwgKik/Oj8tKzo/ICooPzpcXHwgKjo/LSs6PyAqKSooPzpcXHwgKik/KSg/OlxcbigoPzooPyEgKlxcbnxocnxoZWFkaW5nfGJsb2NrcXVvdGV8Y29kZXxmZW5jZXN8bGlzdHxodG1sKS4qKD86XFxufCQpKSopXFxuKnwkKSJ9O3JlLmdmbS50YWJsZT1SZShyZS5nZm0udGFibGUpLnJlcGxhY2UoImhyIixyZS5ocikucmVwbGFjZSgiaGVhZGluZyIsIiB7MCwzfSN7MSw2fSAiKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoImNvZGUiLCIgezR9W15cXG5dIikucmVwbGFjZSgiZmVuY2VzIiwiIHswLDN9KD86YHszLH0oPz1bXmBcXG5dKlxcbil8fnszLH0pW15cXG5dKlxcbiIpLnJlcGxhY2UoImxpc3QiLCIgezAsM30oPzpbKistXXwxWy4pXSkgIikucmVwbGFjZSgiaHRtbCIsIjwvPyg/OnRhZykoPzogK3xcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pIikucmVwbGFjZSgidGFnIixyZS5fdGFnKS5nZXRSZWdleCgpO3JlLmdmbS5wYXJhZ3JhcGg9UmUocmUuX3BhcmFncmFwaCkucmVwbGFjZSgiaHIiLHJlLmhyKS5yZXBsYWNlKCJoZWFkaW5nIiwiIHswLDN9I3sxLDZ9ICIpLnJlcGxhY2UoInxsaGVhZGluZyIsIiIpLnJlcGxhY2UoInRhYmxlIixyZS5nZm0udGFibGUpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCIgezAsM30+IikucmVwbGFjZSgiZmVuY2VzIiwiIHswLDN9KD86YHszLH0oPz1bXmBcXG5dKlxcbil8fnszLH0pW15cXG5dKlxcbiIpLnJlcGxhY2UoImxpc3QiLCIgezAsM30oPzpbKistXXwxWy4pXSkgIikucmVwbGFjZSgiaHRtbCIsIjwvPyg/OnRhZykoPzogK3xcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pIikucmVwbGFjZSgidGFnIixyZS5fdGFnKS5nZXRSZWdleCgpO3JlLnBlZGFudGljPXsuLi5yZS5ub3JtYWwsaHRtbDpSZShgXiAqKD86Y29tbWVudCAqKD86XFxufFxccyokKXw8KHRhZylbXFxzXFxTXSs/PC9cXDE+ICooPzpcXG57Mix9fFxccyokKXw8dGFnKD86IlteIl0qInwnW14nXSonfFxcc1teJyIvPlxcc10qKSo/Lz8+ICooPzpcXG57Mix9fFxccyokKSlgKS5yZXBsYWNlKCJjb21tZW50IixyZS5fY29tbWVudCkucmVwbGFjZSgvdGFnL2csIig/ISg/OmF8ZW18c3Ryb25nfHNtYWxsfHN8Y2l0ZXxxfGRmbnxhYmJyfGRhdGF8dGltZXxjb2RlfHZhcnxzYW1wfGtiZHxzdWJ8c3VwfGl8Ynx1fG1hcmt8cnVieXxydHxycHxiZGl8YmRvfHNwYW58YnJ8d2JyfGluc3xkZWx8aW1nKVxcYilcXHcrKD8hOnxbXlxcd1xcc0BdKkApXFxiIikuZ2V0UmVnZXgoKSxkZWY6L14gKlxbKFteXF1dKylcXTogKjw/KFteXHM+XSspPj8oPzogKyhbIihdW15cbl0rWyIpXSkpPyAqKD86XG4rfCQpLyxoZWFkaW5nOi9eKCN7MSw2fSkoLiopKD86XG4rfCQpLyxmZW5jZXM6UGMsbGhlYWRpbmc6L14oLis/KVxuIHswLDN9KD0rfC0rKSAqKD86XG4rfCQpLyxwYXJhZ3JhcGg6UmUocmUubm9ybWFsLl9wYXJhZ3JhcGgpLnJlcGxhY2UoImhyIixyZS5ocikucmVwbGFjZSgiaGVhZGluZyIsYCAqI3sxLDZ9ICpbXgpdYCkucmVwbGFjZSgibGhlYWRpbmciLHJlLmxoZWFkaW5nKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoInxmZW5jZXMiLCIiKS5yZXBsYWNlKCJ8bGlzdCIsIiIpLnJlcGxhY2UoInxodG1sIiwiIikuZ2V0UmVnZXgoKX07Y29uc3QgSz17ZXNjYXBlOi9eXFwoWyEiIyQlJicoKSorLFwtLi86Ozw9Pj9AXFtcXVxcXl9ge3x9fl0pLyxhdXRvbGluazovXjwoc2NoZW1lOlteXHNceDAwLVx4MWY8Pl0qfGVtYWlsKT4vLHVybDpQYyx0YWc6Il5jb21tZW50fF48L1thLXpBLVpdW1xcdzotXSpcXHMqPnxePFthLXpBLVpdW1xcdy1dKig/OmF0dHJpYnV0ZSkqP1xccyovPz58XjxcXD9bXFxzXFxTXSo/XFw/PnxePCFbYS16QS1aXStcXHNbXFxzXFxTXSo/PnxePCFcXFtDREFUQVxcW1tcXHNcXFNdKj9cXF1cXF0+IixsaW5rOi9eIT9cWyhsYWJlbClcXVwoXHMqKGhyZWYpKD86XHMrKHRpdGxlKSk/XHMqXCkvLHJlZmxpbms6L14hP1xbKGxhYmVsKVxdXFsocmVmKVxdLyxub2xpbms6L14hP1xbKHJlZilcXSg/OlxbXF0pPy8scmVmbGlua1NlYXJjaDoicmVmbGlua3xub2xpbmsoPyFcXCgpIixlbVN0cm9uZzp7bERlbGltOi9eKD86XCorKD86KCg/IVwqKVtwdW5jdF0pfFteXHMqXSkpfF5fKyg/OigoPyFfKVtwdW5jdF0pfChbXlxzX10pKS8sckRlbGltQXN0Oi9eW15fKl0qP19fW15fKl0qP1wqW15fKl0qPyg/PV9fKXxbXipdKyg/PVteKl0pfCg/IVwqKVtwdW5jdF0oXCorKSg/PVtcc118JCl8W15wdW5jdFxzXShcKispKD8hXCopKD89W3B1bmN0XHNdfCQpfCg/IVwqKVtwdW5jdFxzXShcKispKD89W15wdW5jdFxzXSl8W1xzXShcKispKD8hXCopKD89W3B1bmN0XSl8KD8hXCopW3B1bmN0XShcKispKD8hXCopKD89W3B1bmN0XSl8W15wdW5jdFxzXShcKispKD89W15wdW5jdFxzXSkvLHJEZWxpbVVuZDovXlteXypdKj9cKlwqW15fKl0qP19bXl8qXSo/KD89XCpcKil8W15fXSsoPz1bXl9dKXwoPyFfKVtwdW5jdF0oXyspKD89W1xzXXwkKXxbXnB1bmN0XHNdKF8rKSg/IV8pKD89W3B1bmN0XHNdfCQpfCg/IV8pW3B1bmN0XHNdKF8rKSg/PVtecHVuY3Rcc10pfFtcc10oXyspKD8hXykoPz1bcHVuY3RdKXwoPyFfKVtwdW5jdF0oXyspKD8hXykoPz1bcHVuY3RdKS99LGNvZGU6L14oYCspKFteYF18W15gXVtcc1xTXSo/W15gXSlcMSg/IWApLyxicjovXiggezIsfXxcXClcbig/IVxzKiQpLyxkZWw6UGMsdGV4dDovXihgK3xbXmBdKSg/Oig/PSB7Mix9XG4pfFtcc1xTXSo/KD86KD89W1xcPCFcW2AqX118XGJffCQpfFteIF0oPz0gezIsfVxuKSkpLyxwdW5jdHVhdGlvbjovXigoPyFbKl9dKVtcc3B1bmN0dWF0aW9uXSkvfTtLLl9wdW5jdHVhdGlvbj0iXFxwe1B9JCs8PT5gXnx+IjtLLnB1bmN0dWF0aW9uPVJlKEsucHVuY3R1YXRpb24sInUiKS5yZXBsYWNlKC9wdW5jdHVhdGlvbi9nLEsuX3B1bmN0dWF0aW9uKS5nZXRSZWdleCgpO0suYmxvY2tTa2lwPS9cW1teW1xdXSo/XF1cKFteXChcKV0qP1wpfGBbXmBdKj9gfDxbXjw+XSo/Pi9nO0suYW55UHVuY3R1YXRpb249L1xcW3B1bmN0XS9nO0suX2VzY2FwZXM9L1xcKFtwdW5jdF0pL2c7Sy5fY29tbWVudD1SZShyZS5fY29tbWVudCkucmVwbGFjZSgiKD86LS0+fCQpIiwiLS0+IikuZ2V0UmVnZXgoKTtLLmVtU3Ryb25nLmxEZWxpbT1SZShLLmVtU3Ryb25nLmxEZWxpbSwidSIpLnJlcGxhY2UoL3B1bmN0L2csSy5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7Sy5lbVN0cm9uZy5yRGVsaW1Bc3Q9UmUoSy5lbVN0cm9uZy5yRGVsaW1Bc3QsImd1IikucmVwbGFjZSgvcHVuY3QvZyxLLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtLLmVtU3Ryb25nLnJEZWxpbVVuZD1SZShLLmVtU3Ryb25nLnJEZWxpbVVuZCwiZ3UiKS5yZXBsYWNlKC9wdW5jdC9nLEsuX3B1bmN0dWF0aW9uKS5nZXRSZWdleCgpO0suYW55UHVuY3R1YXRpb249UmUoSy5hbnlQdW5jdHVhdGlvbiwiZ3UiKS5yZXBsYWNlKC9wdW5jdC9nLEsuX3B1bmN0dWF0aW9uKS5nZXRSZWdleCgpO0suX2VzY2FwZXM9UmUoSy5fZXNjYXBlcywiZ3UiKS5yZXBsYWNlKC9wdW5jdC9nLEsuX3B1bmN0dWF0aW9uKS5nZXRSZWdleCgpO0suX3NjaGVtZT0vW2EtekEtWl1bYS16QS1aMC05Ky4tXXsxLDMxfS87Sy5fZW1haWw9L1thLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rKEApW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKyg/IVstX10pLztLLmF1dG9saW5rPVJlKEsuYXV0b2xpbmspLnJlcGxhY2UoInNjaGVtZSIsSy5fc2NoZW1lKS5yZXBsYWNlKCJlbWFpbCIsSy5fZW1haWwpLmdldFJlZ2V4KCk7Sy5fYXR0cmlidXRlPS9ccytbYS16QS1aOl9dW1x3LjotXSooPzpccyo9XHMqIlteIl0qInxccyo9XHMqJ1teJ10qJ3xccyo9XHMqW15ccyInPTw+YF0rKT8vO0sudGFnPVJlKEsudGFnKS5yZXBsYWNlKCJjb21tZW50IixLLl9jb21tZW50KS5yZXBsYWNlKCJhdHRyaWJ1dGUiLEsuX2F0dHJpYnV0ZSkuZ2V0UmVnZXgoKTtLLl9sYWJlbD0vKD86XFsoPzpcXC58W15cW1xdXFxdKSpcXXxcXC58YFteYF0qYHxbXlxbXF1cXGBdKSo/LztLLl9ocmVmPS88KD86XFwufFteXG48PlxcXSkrPnxbXlxzXHgwMC1ceDFmXSovO0suX3RpdGxlPS8iKD86XFwiP3xbXiJcXF0pKiJ8Jyg/OlxcJz98W14nXFxdKSonfFwoKD86XFxcKT98W14pXFxdKSpcKS87Sy5saW5rPVJlKEsubGluaykucmVwbGFjZSgibGFiZWwiLEsuX2xhYmVsKS5yZXBsYWNlKCJocmVmIixLLl9ocmVmKS5yZXBsYWNlKCJ0aXRsZSIsSy5fdGl0bGUpLmdldFJlZ2V4KCk7Sy5yZWZsaW5rPVJlKEsucmVmbGluaykucmVwbGFjZSgibGFiZWwiLEsuX2xhYmVsKS5yZXBsYWNlKCJyZWYiLHJlLl9sYWJlbCkuZ2V0UmVnZXgoKTtLLm5vbGluaz1SZShLLm5vbGluaykucmVwbGFjZSgicmVmIixyZS5fbGFiZWwpLmdldFJlZ2V4KCk7Sy5yZWZsaW5rU2VhcmNoPVJlKEsucmVmbGlua1NlYXJjaCwiZyIpLnJlcGxhY2UoInJlZmxpbmsiLEsucmVmbGluaykucmVwbGFjZSgibm9saW5rIixLLm5vbGluaykuZ2V0UmVnZXgoKTtLLm5vcm1hbD17Li4uS307Sy5wZWRhbnRpYz17Li4uSy5ub3JtYWwsc3Ryb25nOntzdGFydDovXl9ffFwqXCovLG1pZGRsZTovXl9fKD89XFMpKFtcc1xTXSo/XFMpX18oPyFfKXxeXCpcKig/PVxTKShbXHNcU10qP1xTKVwqXCooPyFcKikvLGVuZEFzdDovXCpcKig/IVwqKS9nLGVuZFVuZDovX18oPyFfKS9nfSxlbTp7c3RhcnQ6L15ffFwqLyxtaWRkbGU6L14oKVwqKD89XFMpKFtcc1xTXSo/XFMpXCooPyFcKil8Xl8oPz1cUykoW1xzXFNdKj9cUylfKD8hXykvLGVuZEFzdDovXCooPyFcKikvZyxlbmRVbmQ6L18oPyFfKS9nfSxsaW5rOlJlKC9eIT9cWyhsYWJlbClcXVwoKC4qPylcKS8pLnJlcGxhY2UoImxhYmVsIixLLl9sYWJlbCkuZ2V0UmVnZXgoKSxyZWZsaW5rOlJlKC9eIT9cWyhsYWJlbClcXVxzKlxbKFteXF1dKilcXS8pLnJlcGxhY2UoImxhYmVsIixLLl9sYWJlbCkuZ2V0UmVnZXgoKX07Sy5nZm09ey4uLksubm9ybWFsLGVzY2FwZTpSZShLLmVzY2FwZSkucmVwbGFjZSgiXSkiLCJ+fF0pIikuZ2V0UmVnZXgoKSxfZXh0ZW5kZWRfZW1haWw6L1tBLVphLXowLTkuXystXSsoQClbYS16QS1aMC05LV9dKyg/OlwuW2EtekEtWjAtOS1fXSpbYS16QS1aMC05XSkrKD8hWy1fXSkvLHVybDovXigoPzpmdHB8aHR0cHM/KTpcL1wvfHd3d1wuKSg/OlthLXpBLVowLTlcLV0rXC4/KStbXlxzPF0qfF5lbWFpbC8sX2JhY2twZWRhbDovKD86W14/IS4sOjsqXycifigpJl0rfFwoW14pXSpcKXwmKD8hW2EtekEtWjAtOV0rOyQpfFs/IS4sOjsqXycifildKyg/ISQpKSsvLGRlbDovXih+fj8pKD89W15cc35dKShbXHNcU10qP1teXHN+XSlcMSg/PVtefl18JCkvLHRleHQ6L14oW2B+XSt8W15gfl0pKD86KD89IHsyLH1cbil8KD89W2EtekEtWjAtOS4hIyQlJicqK1wvPT9fYHtcfH1+LV0rQCl8W1xzXFNdKj8oPzooPz1bXFw8IVxbYCp+X118XGJffGh0dHBzPzpcL1wvfGZ0cDpcL1wvfHd3d1wufCQpfFteIF0oPz0gezIsfVxuKXxbXmEtekEtWjAtOS4hIyQlJicqK1wvPT9fYHtcfH1+LV0oPz1bYS16QS1aMC05LiEjJCUmJyorXC89P19ge1x8fX4tXStAKSkpL307Sy5nZm0udXJsPVJlKEsuZ2ZtLnVybCwiaSIpLnJlcGxhY2UoImVtYWlsIixLLmdmbS5fZXh0ZW5kZWRfZW1haWwpLmdldFJlZ2V4KCk7Sy5icmVha3M9ey4uLksuZ2ZtLGJyOlJlKEsuYnIpLnJlcGxhY2UoInsyLH0iLCIqIikuZ2V0UmVnZXgoKSx0ZXh0OlJlKEsuZ2ZtLnRleHQpLnJlcGxhY2UoIlxcYl8iLCJcXGJffCB7Mix9XFxuIikucmVwbGFjZSgvXHsyLFx9L2csIioiKS5nZXRSZWdleCgpfTtjbGFzcyBmcntjb25zdHJ1Y3Rvcih0KXtqZSh0aGlzLCJ0b2tlbnMiKTtqZSh0aGlzLCJvcHRpb25zIik7amUodGhpcywic3RhdGUiKTtqZSh0aGlzLCJ0b2tlbml6ZXIiKTtqZSh0aGlzLCJpbmxpbmVRdWV1ZSIpO3RoaXMudG9rZW5zPVtdLHRoaXMudG9rZW5zLmxpbmtzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5vcHRpb25zPXR8fGJpLHRoaXMub3B0aW9ucy50b2tlbml6ZXI9dGhpcy5vcHRpb25zLnRva2VuaXplcnx8bmV3IE9jLHRoaXMudG9rZW5pemVyPXRoaXMub3B0aW9ucy50b2tlbml6ZXIsdGhpcy50b2tlbml6ZXIub3B0aW9ucz10aGlzLm9wdGlvbnMsdGhpcy50b2tlbml6ZXIubGV4ZXI9dGhpcyx0aGlzLmlubGluZVF1ZXVlPVtdLHRoaXMuc3RhdGU9e2luTGluazohMSxpblJhd0Jsb2NrOiExLHRvcDohMH07Y29uc3Qgbj17YmxvY2s6cmUubm9ybWFsLGlubGluZTpLLm5vcm1hbH07dGhpcy5vcHRpb25zLnBlZGFudGljPyhuLmJsb2NrPXJlLnBlZGFudGljLG4uaW5saW5lPUsucGVkYW50aWMpOnRoaXMub3B0aW9ucy5nZm0mJihuLmJsb2NrPXJlLmdmbSx0aGlzLm9wdGlvbnMuYnJlYWtzP24uaW5saW5lPUsuYnJlYWtzOm4uaW5saW5lPUsuZ2ZtKSx0aGlzLnRva2VuaXplci5ydWxlcz1ufXN0YXRpYyBnZXQgcnVsZXMoKXtyZXR1cm57YmxvY2s6cmUsaW5saW5lOkt9fXN0YXRpYyBsZXgodCxuKXtyZXR1cm4gbmV3IGZyKG4pLmxleCh0KX1zdGF0aWMgbGV4SW5saW5lKHQsbil7cmV0dXJuIG5ldyBmcihuKS5pbmxpbmVUb2tlbnModCl9bGV4KHQpe3Q9dC5yZXBsYWNlKC9cclxufFxyL2csYApgKSx0aGlzLmJsb2NrVG9rZW5zKHQsdGhpcy50b2tlbnMpO2xldCBuO2Zvcig7bj10aGlzLmlubGluZVF1ZXVlLnNoaWZ0KCk7KXRoaXMuaW5saW5lVG9rZW5zKG4uc3JjLG4udG9rZW5zKTtyZXR1cm4gdGhpcy50b2tlbnN9YmxvY2tUb2tlbnModCxuPVtdKXt0aGlzLm9wdGlvbnMucGVkYW50aWM/dD10LnJlcGxhY2UoL1x0L2csIiAgICAiKS5yZXBsYWNlKC9eICskL2dtLCIiKTp0PXQucmVwbGFjZSgvXiggKikoXHQrKS9nbSwocyxhLHUpPT5hKyIgICAgIi5yZXBlYXQodS5sZW5ndGgpKTtsZXQgcixvLGksbDtmb3IoO3Q7KWlmKCEodGhpcy5vcHRpb25zLmV4dGVuc2lvbnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLmJsb2NrJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5ibG9jay5zb21lKHM9PihyPXMuY2FsbCh7bGV4ZXI6dGhpc30sdCxuKSk/KHQ9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gociksITApOiExKSkpe2lmKHI9dGhpcy50b2tlbml6ZXIuc3BhY2UodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxyLnJhdy5sZW5ndGg9PT0xJiZuLmxlbmd0aD4wP25bbi5sZW5ndGgtMV0ucmF3Kz1gCmA6bi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuY29kZSh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG89bltuLmxlbmd0aC0xXSxvJiYoby50eXBlPT09InBhcmFncmFwaCJ8fG8udHlwZT09PSJ0ZXh0Iik/KG8ucmF3Kz1gCmArci5yYXcsby50ZXh0Kz1gCmArci50ZXh0LHRoaXMuaW5saW5lUXVldWVbdGhpcy5pbmxpbmVRdWV1ZS5sZW5ndGgtMV0uc3JjPW8udGV4dCk6bi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuZmVuY2VzKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuaGVhZGluZyh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmhyKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuYmxvY2txdW90ZSh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmxpc3QodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5odG1sKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuZGVmKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbz1uW24ubGVuZ3RoLTFdLG8mJihvLnR5cGU9PT0icGFyYWdyYXBoInx8by50eXBlPT09InRleHQiKT8oby5yYXcrPWAKYCtyLnJhdyxvLnRleHQrPWAKYCtyLnJhdyx0aGlzLmlubGluZVF1ZXVlW3RoaXMuaW5saW5lUXVldWUubGVuZ3RoLTFdLnNyYz1vLnRleHQpOnRoaXMudG9rZW5zLmxpbmtzW3IudGFnXXx8KHRoaXMudG9rZW5zLmxpbmtzW3IudGFnXT17aHJlZjpyLmhyZWYsdGl0bGU6ci50aXRsZX0pO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIudGFibGUodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5saGVhZGluZyh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihpPXQsdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0QmxvY2spe2xldCBzPTEvMDtjb25zdCBhPXQuc2xpY2UoMSk7bGV0IHU7dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRCbG9jay5mb3JFYWNoKGM9Pnt1PWMuY2FsbCh7bGV4ZXI6dGhpc30sYSksdHlwZW9mIHU9PSJudW1iZXIiJiZ1Pj0wJiYocz1NYXRoLm1pbihzLHUpKX0pLHM8MS8wJiZzPj0wJiYoaT10LnN1YnN0cmluZygwLHMrMSkpfWlmKHRoaXMuc3RhdGUudG9wJiYocj10aGlzLnRva2VuaXplci5wYXJhZ3JhcGgoaSkpKXtvPW5bbi5sZW5ndGgtMV0sbCYmby50eXBlPT09InBhcmFncmFwaCI/KG8ucmF3Kz1gCmArci5yYXcsby50ZXh0Kz1gCmArci50ZXh0LHRoaXMuaW5saW5lUXVldWUucG9wKCksdGhpcy5pbmxpbmVRdWV1ZVt0aGlzLmlubGluZVF1ZXVlLmxlbmd0aC0xXS5zcmM9by50ZXh0KTpuLnB1c2gociksbD1pLmxlbmd0aCE9PXQubGVuZ3RoLHQ9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLnRleHQodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxvPW5bbi5sZW5ndGgtMV0sbyYmby50eXBlPT09InRleHQiPyhvLnJhdys9YApgK3IucmF3LG8udGV4dCs9YApgK3IudGV4dCx0aGlzLmlubGluZVF1ZXVlLnBvcCgpLHRoaXMuaW5saW5lUXVldWVbdGhpcy5pbmxpbmVRdWV1ZS5sZW5ndGgtMV0uc3JjPW8udGV4dCk6bi5wdXNoKHIpO2NvbnRpbnVlfWlmKHQpe2NvbnN0IHM9IkluZmluaXRlIGxvb3Agb24gYnl0ZTogIit0LmNoYXJDb2RlQXQoMCk7aWYodGhpcy5vcHRpb25zLnNpbGVudCl7Y29uc29sZS5lcnJvcihzKTticmVha31lbHNlIHRocm93IG5ldyBFcnJvcihzKX19cmV0dXJuIHRoaXMuc3RhdGUudG9wPSEwLG59aW5saW5lKHQsbj1bXSl7cmV0dXJuIHRoaXMuaW5saW5lUXVldWUucHVzaCh7c3JjOnQsdG9rZW5zOm59KSxufWlubGluZVRva2Vucyh0LG49W10pe2xldCByLG8saSxsPXQscyxhLHU7aWYodGhpcy50b2tlbnMubGlua3Mpe2NvbnN0IGM9T2JqZWN0LmtleXModGhpcy50b2tlbnMubGlua3MpO2lmKGMubGVuZ3RoPjApZm9yKDsocz10aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUucmVmbGlua1NlYXJjaC5leGVjKGwpKSE9bnVsbDspYy5pbmNsdWRlcyhzWzBdLnNsaWNlKHNbMF0ubGFzdEluZGV4T2YoIlsiKSsxLC0xKSkmJihsPWwuc2xpY2UoMCxzLmluZGV4KSsiWyIrImEiLnJlcGVhdChzWzBdLmxlbmd0aC0yKSsiXSIrbC5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUucmVmbGlua1NlYXJjaC5sYXN0SW5kZXgpKX1mb3IoOyhzPXRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAuZXhlYyhsKSkhPW51bGw7KWw9bC5zbGljZSgwLHMuaW5kZXgpKyJbIisiYSIucmVwZWF0KHNbMF0ubGVuZ3RoLTIpKyJdIitsLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAubGFzdEluZGV4KTtmb3IoOyhzPXRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbi5leGVjKGwpKSE9bnVsbDspbD1sLnNsaWNlKDAscy5pbmRleCkrIisrIitsLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbi5sYXN0SW5kZXgpO2Zvcig7dDspaWYoYXx8KHU9IiIpLGE9ITEsISh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuaW5saW5lJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5pbmxpbmUuc29tZShjPT4ocj1jLmNhbGwoe2xleGVyOnRoaXN9LHQsbikpPyh0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpLCEwKTohMSkpKXtpZihyPXRoaXMudG9rZW5pemVyLmVzY2FwZSh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLnRhZyh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG89bltuLmxlbmd0aC0xXSxvJiZyLnR5cGU9PT0idGV4dCImJm8udHlwZT09PSJ0ZXh0Ij8oby5yYXcrPXIucmF3LG8udGV4dCs9ci50ZXh0KTpuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5saW5rKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIucmVmbGluayh0LHRoaXMudG9rZW5zLmxpbmtzKSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG89bltuLmxlbmd0aC0xXSxvJiZyLnR5cGU9PT0idGV4dCImJm8udHlwZT09PSJ0ZXh0Ij8oby5yYXcrPXIucmF3LG8udGV4dCs9ci50ZXh0KTpuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5lbVN0cm9uZyh0LGwsdSkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5jb2Rlc3Bhbih0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmJyKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuZGVsKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuYXV0b2xpbmsodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYoIXRoaXMuc3RhdGUuaW5MaW5rJiYocj10aGlzLnRva2VuaXplci51cmwodCkpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKGk9dCx0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRJbmxpbmUpe2xldCBjPTEvMDtjb25zdCBkPXQuc2xpY2UoMSk7bGV0IGY7dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRJbmxpbmUuZm9yRWFjaChoPT57Zj1oLmNhbGwoe2xleGVyOnRoaXN9LGQpLHR5cGVvZiBmPT0ibnVtYmVyIiYmZj49MCYmKGM9TWF0aC5taW4oYyxmKSl9KSxjPDEvMCYmYz49MCYmKGk9dC5zdWJzdHJpbmcoMCxjKzEpKX1pZihyPXRoaXMudG9rZW5pemVyLmlubGluZVRleHQoaSkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxyLnJhdy5zbGljZSgtMSkhPT0iXyImJih1PXIucmF3LnNsaWNlKC0xKSksYT0hMCxvPW5bbi5sZW5ndGgtMV0sbyYmby50eXBlPT09InRleHQiPyhvLnJhdys9ci5yYXcsby50ZXh0Kz1yLnRleHQpOm4ucHVzaChyKTtjb250aW51ZX1pZih0KXtjb25zdCBjPSJJbmZpbml0ZSBsb29wIG9uIGJ5dGU6ICIrdC5jaGFyQ29kZUF0KDApO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpe2NvbnNvbGUuZXJyb3IoYyk7YnJlYWt9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYyl9fXJldHVybiBufX1jbGFzcyBBY3tjb25zdHJ1Y3Rvcih0KXtqZSh0aGlzLCJvcHRpb25zIik7dGhpcy5vcHRpb25zPXR8fGJpfWNvZGUodCxuLHIpe3ZhciBpO2NvbnN0IG89KGk9KG58fCIiKS5tYXRjaCgvXlxTKi8pKT09bnVsbD92b2lkIDA6aVswXTtyZXR1cm4gdD10LnJlcGxhY2UoL1xuJC8sIiIpK2AKYCxvPyc8cHJlPjxjb2RlIGNsYXNzPSJsYW5ndWFnZS0nK3ZuKG8pKyciPicrKHI/dDp2bih0LCEwKSkrYDwvY29kZT48L3ByZT4KYDoiPHByZT48Y29kZT4iKyhyP3Q6dm4odCwhMCkpK2A8L2NvZGU+PC9wcmU+CmB9YmxvY2txdW90ZSh0KXtyZXR1cm5gPGJsb2NrcXVvdGU+CiR7dH08L2Jsb2NrcXVvdGU+CmB9aHRtbCh0LG4pe3JldHVybiB0fWhlYWRpbmcodCxuLHIpe3JldHVybmA8aCR7bn0+JHt0fTwvaCR7bn0+CmB9aHIoKXtyZXR1cm5gPGhyPgpgfWxpc3QodCxuLHIpe2NvbnN0IG89bj8ib2wiOiJ1bCIsaT1uJiZyIT09MT8nIHN0YXJ0PSInK3IrJyInOiIiO3JldHVybiI8IitvK2krYD4KYCt0KyI8LyIrbytgPgpgfWxpc3RpdGVtKHQsbixyKXtyZXR1cm5gPGxpPiR7dH08L2xpPgpgfWNoZWNrYm94KHQpe3JldHVybiI8aW5wdXQgIisodD8nY2hlY2tlZD0iIiAnOiIiKSsnZGlzYWJsZWQ9IiIgdHlwZT0iY2hlY2tib3giPid9cGFyYWdyYXBoKHQpe3JldHVybmA8cD4ke3R9PC9wPgpgfXRhYmxlKHQsbil7cmV0dXJuIG4mJihuPWA8dGJvZHk+JHtufTwvdGJvZHk+YCksYDx0YWJsZT4KPHRoZWFkPgpgK3QrYDwvdGhlYWQ+CmArbitgPC90YWJsZT4KYH10YWJsZXJvdyh0KXtyZXR1cm5gPHRyPgoke3R9PC90cj4KYH10YWJsZWNlbGwodCxuKXtjb25zdCByPW4uaGVhZGVyPyJ0aCI6InRkIjtyZXR1cm4obi5hbGlnbj9gPCR7cn0gYWxpZ249IiR7bi5hbGlnbn0iPmA6YDwke3J9PmApK3QrYDwvJHtyfT4KYH1zdHJvbmcodCl7cmV0dXJuYDxzdHJvbmc+JHt0fTwvc3Ryb25nPmB9ZW0odCl7cmV0dXJuYDxlbT4ke3R9PC9lbT5gfWNvZGVzcGFuKHQpe3JldHVybmA8Y29kZT4ke3R9PC9jb2RlPmB9YnIoKXtyZXR1cm4iPGJyPiJ9ZGVsKHQpe3JldHVybmA8ZGVsPiR7dH08L2RlbD5gfWxpbmsodCxuLHIpe2NvbnN0IG89ZTAodCk7aWYobz09PW51bGwpcmV0dXJuIHI7dD1vO2xldCBpPSc8YSBocmVmPSInK3QrJyInO3JldHVybiBuJiYoaSs9JyB0aXRsZT0iJytuKyciJyksaSs9Ij4iK3IrIjwvYT4iLGl9aW1hZ2UodCxuLHIpe2NvbnN0IG89ZTAodCk7aWYobz09PW51bGwpcmV0dXJuIHI7dD1vO2xldCBpPWA8aW1nIHNyYz0iJHt0fSIgYWx0PSIke3J9ImA7cmV0dXJuIG4mJihpKz1gIHRpdGxlPSIke259ImApLGkrPSI+IixpfXRleHQodCl7cmV0dXJuIHR9fWNsYXNzIG1te3N0cm9uZyh0KXtyZXR1cm4gdH1lbSh0KXtyZXR1cm4gdH1jb2Rlc3Bhbih0KXtyZXR1cm4gdH1kZWwodCl7cmV0dXJuIHR9aHRtbCh0KXtyZXR1cm4gdH10ZXh0KHQpe3JldHVybiB0fWxpbmsodCxuLHIpe3JldHVybiIiK3J9aW1hZ2UodCxuLHIpe3JldHVybiIiK3J9YnIoKXtyZXR1cm4iIn19Y2xhc3MgaHJ7Y29uc3RydWN0b3IodCl7amUodGhpcywib3B0aW9ucyIpO2plKHRoaXMsInJlbmRlcmVyIik7amUodGhpcywidGV4dFJlbmRlcmVyIik7dGhpcy5vcHRpb25zPXR8fGJpLHRoaXMub3B0aW9ucy5yZW5kZXJlcj10aGlzLm9wdGlvbnMucmVuZGVyZXJ8fG5ldyBBYyx0aGlzLnJlbmRlcmVyPXRoaXMub3B0aW9ucy5yZW5kZXJlcix0aGlzLnJlbmRlcmVyLm9wdGlvbnM9dGhpcy5vcHRpb25zLHRoaXMudGV4dFJlbmRlcmVyPW5ldyBtbX1zdGF0aWMgcGFyc2UodCxuKXtyZXR1cm4gbmV3IGhyKG4pLnBhcnNlKHQpfXN0YXRpYyBwYXJzZUlubGluZSh0LG4pe3JldHVybiBuZXcgaHIobikucGFyc2VJbmxpbmUodCl9cGFyc2UodCxuPSEwKXtsZXQgcj0iIjtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgaT10W29dO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1tpLnR5cGVdKXtjb25zdCBsPWkscz10aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbbC50eXBlXS5jYWxsKHtwYXJzZXI6dGhpc30sbCk7aWYocyE9PSExfHwhWyJzcGFjZSIsImhyIiwiaGVhZGluZyIsImNvZGUiLCJ0YWJsZSIsImJsb2NrcXVvdGUiLCJsaXN0IiwiaHRtbCIsInBhcmFncmFwaCIsInRleHQiXS5pbmNsdWRlcyhsLnR5cGUpKXtyKz1zfHwiIjtjb250aW51ZX19c3dpdGNoKGkudHlwZSl7Y2FzZSJzcGFjZSI6Y29udGludWU7Y2FzZSJociI6e3IrPXRoaXMucmVuZGVyZXIuaHIoKTtjb250aW51ZX1jYXNlImhlYWRpbmciOntjb25zdCBsPWk7cis9dGhpcy5yZW5kZXJlci5oZWFkaW5nKHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMpLGwuZGVwdGgsQlAodGhpcy5wYXJzZUlubGluZShsLnRva2Vucyx0aGlzLnRleHRSZW5kZXJlcikpKTtjb250aW51ZX1jYXNlImNvZGUiOntjb25zdCBsPWk7cis9dGhpcy5yZW5kZXJlci5jb2RlKGwudGV4dCxsLmxhbmcsISFsLmVzY2FwZWQpO2NvbnRpbnVlfWNhc2UidGFibGUiOntjb25zdCBsPWk7bGV0IHM9IiIsYT0iIjtmb3IobGV0IGM9MDtjPGwuaGVhZGVyLmxlbmd0aDtjKyspYSs9dGhpcy5yZW5kZXJlci50YWJsZWNlbGwodGhpcy5wYXJzZUlubGluZShsLmhlYWRlcltjXS50b2tlbnMpLHtoZWFkZXI6ITAsYWxpZ246bC5hbGlnbltjXX0pO3MrPXRoaXMucmVuZGVyZXIudGFibGVyb3coYSk7bGV0IHU9IiI7Zm9yKGxldCBjPTA7YzxsLnJvd3MubGVuZ3RoO2MrKyl7Y29uc3QgZD1sLnJvd3NbY107YT0iIjtmb3IobGV0IGY9MDtmPGQubGVuZ3RoO2YrKylhKz10aGlzLnJlbmRlcmVyLnRhYmxlY2VsbCh0aGlzLnBhcnNlSW5saW5lKGRbZl0udG9rZW5zKSx7aGVhZGVyOiExLGFsaWduOmwuYWxpZ25bZl19KTt1Kz10aGlzLnJlbmRlcmVyLnRhYmxlcm93KGEpfXIrPXRoaXMucmVuZGVyZXIudGFibGUocyx1KTtjb250aW51ZX1jYXNlImJsb2NrcXVvdGUiOntjb25zdCBsPWkscz10aGlzLnBhcnNlKGwudG9rZW5zKTtyKz10aGlzLnJlbmRlcmVyLmJsb2NrcXVvdGUocyk7Y29udGludWV9Y2FzZSJsaXN0Ijp7Y29uc3QgbD1pLHM9bC5vcmRlcmVkLGE9bC5zdGFydCx1PWwubG9vc2U7bGV0IGM9IiI7Zm9yKGxldCBkPTA7ZDxsLml0ZW1zLmxlbmd0aDtkKyspe2NvbnN0IGY9bC5pdGVtc1tkXSxoPWYuY2hlY2tlZCxnPWYudGFzaztsZXQgbT0iIjtpZihmLnRhc2spe2NvbnN0IFM9dGhpcy5yZW5kZXJlci5jaGVja2JveCghIWgpO3U/Zi50b2tlbnMubGVuZ3RoPjAmJmYudG9rZW5zWzBdLnR5cGU9PT0icGFyYWdyYXBoIj8oZi50b2tlbnNbMF0udGV4dD1TKyIgIitmLnRva2Vuc1swXS50ZXh0LGYudG9rZW5zWzBdLnRva2VucyYmZi50b2tlbnNbMF0udG9rZW5zLmxlbmd0aD4wJiZmLnRva2Vuc1swXS50b2tlbnNbMF0udHlwZT09PSJ0ZXh0IiYmKGYudG9rZW5zWzBdLnRva2Vuc1swXS50ZXh0PVMrIiAiK2YudG9rZW5zWzBdLnRva2Vuc1swXS50ZXh0KSk6Zi50b2tlbnMudW5zaGlmdCh7dHlwZToidGV4dCIsdGV4dDpTKyIgIn0pOm0rPVMrIiAifW0rPXRoaXMucGFyc2UoZi50b2tlbnMsdSksYys9dGhpcy5yZW5kZXJlci5saXN0aXRlbShtLGcsISFoKX1yKz10aGlzLnJlbmRlcmVyLmxpc3QoYyxzLGEpO2NvbnRpbnVlfWNhc2UiaHRtbCI6e2NvbnN0IGw9aTtyKz10aGlzLnJlbmRlcmVyLmh0bWwobC50ZXh0LGwuYmxvY2spO2NvbnRpbnVlfWNhc2UicGFyYWdyYXBoIjp7Y29uc3QgbD1pO3IrPXRoaXMucmVuZGVyZXIucGFyYWdyYXBoKHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMpKTtjb250aW51ZX1jYXNlInRleHQiOntsZXQgbD1pLHM9bC50b2tlbnM/dGhpcy5wYXJzZUlubGluZShsLnRva2Vucyk6bC50ZXh0O2Zvcig7bysxPHQubGVuZ3RoJiZ0W28rMV0udHlwZT09PSJ0ZXh0IjspbD10Wysrb10scys9YApgKyhsLnRva2Vucz90aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zKTpsLnRleHQpO3IrPW4/dGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgocyk6cztjb250aW51ZX1kZWZhdWx0Ontjb25zdCBsPSdUb2tlbiB3aXRoICInK2kudHlwZSsnIiB0eXBlIHdhcyBub3QgZm91bmQuJztpZih0aGlzLm9wdGlvbnMuc2lsZW50KXJldHVybiBjb25zb2xlLmVycm9yKGwpLCIiO3Rocm93IG5ldyBFcnJvcihsKX19fXJldHVybiByfXBhcnNlSW5saW5lKHQsbil7bj1ufHx0aGlzLnJlbmRlcmVyO2xldCByPSIiO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBpPXRbb107aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVycyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2kudHlwZV0pe2NvbnN0IGw9dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2kudHlwZV0uY2FsbCh7cGFyc2VyOnRoaXN9LGkpO2lmKGwhPT0hMXx8IVsiZXNjYXBlIiwiaHRtbCIsImxpbmsiLCJpbWFnZSIsInN0cm9uZyIsImVtIiwiY29kZXNwYW4iLCJiciIsImRlbCIsInRleHQiXS5pbmNsdWRlcyhpLnR5cGUpKXtyKz1sfHwiIjtjb250aW51ZX19c3dpdGNoKGkudHlwZSl7Y2FzZSJlc2NhcGUiOntjb25zdCBsPWk7cis9bi50ZXh0KGwudGV4dCk7YnJlYWt9Y2FzZSJodG1sIjp7Y29uc3QgbD1pO3IrPW4uaHRtbChsLnRleHQpO2JyZWFrfWNhc2UibGluayI6e2NvbnN0IGw9aTtyKz1uLmxpbmsobC5ocmVmLGwudGl0bGUsdGhpcy5wYXJzZUlubGluZShsLnRva2VucyxuKSk7YnJlYWt9Y2FzZSJpbWFnZSI6e2NvbnN0IGw9aTtyKz1uLmltYWdlKGwuaHJlZixsLnRpdGxlLGwudGV4dCk7YnJlYWt9Y2FzZSJzdHJvbmciOntjb25zdCBsPWk7cis9bi5zdHJvbmcodGhpcy5wYXJzZUlubGluZShsLnRva2VucyxuKSk7YnJlYWt9Y2FzZSJlbSI6e2NvbnN0IGw9aTtyKz1uLmVtKHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMsbikpO2JyZWFrfWNhc2UiY29kZXNwYW4iOntjb25zdCBsPWk7cis9bi5jb2Rlc3BhbihsLnRleHQpO2JyZWFrfWNhc2UiYnIiOntyKz1uLmJyKCk7YnJlYWt9Y2FzZSJkZWwiOntjb25zdCBsPWk7cis9bi5kZWwodGhpcy5wYXJzZUlubGluZShsLnRva2VucyxuKSk7YnJlYWt9Y2FzZSJ0ZXh0Ijp7Y29uc3QgbD1pO3IrPW4udGV4dChsLnRleHQpO2JyZWFrfWRlZmF1bHQ6e2NvbnN0IGw9J1Rva2VuIHdpdGggIicraS50eXBlKyciIHR5cGUgd2FzIG5vdCBmb3VuZC4nO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpcmV0dXJuIGNvbnNvbGUuZXJyb3IobCksIiI7dGhyb3cgbmV3IEVycm9yKGwpfX19cmV0dXJuIHJ9fWNsYXNzIFVze2NvbnN0cnVjdG9yKHQpe2plKHRoaXMsIm9wdGlvbnMiKTt0aGlzLm9wdGlvbnM9dHx8Yml9cHJlcHJvY2Vzcyh0KXtyZXR1cm4gdH1wb3N0cHJvY2Vzcyh0KXtyZXR1cm4gdH19amUoVXMsInBhc3NUaHJvdWdoSG9va3MiLG5ldyBTZXQoWyJwcmVwcm9jZXNzIiwicG9zdHByb2Nlc3MiXSkpO3ZhciBFYSxwcCxXYyxGUztjbGFzcyBIUHtjb25zdHJ1Y3RvciguLi50KXt6ZCh0aGlzLEVhKTt6ZCh0aGlzLFdjKTtqZSh0aGlzLCJkZWZhdWx0cyIsZ20oKSk7amUodGhpcywib3B0aW9ucyIsdGhpcy5zZXRPcHRpb25zKTtqZSh0aGlzLCJwYXJzZSIsSGEodGhpcyxFYSxwcCkuY2FsbCh0aGlzLGZyLmxleCxoci5wYXJzZSkpO2plKHRoaXMsInBhcnNlSW5saW5lIixIYSh0aGlzLEVhLHBwKS5jYWxsKHRoaXMsZnIubGV4SW5saW5lLGhyLnBhcnNlSW5saW5lKSk7amUodGhpcywiUGFyc2VyIixocik7amUodGhpcywicGFyc2VyIixoci5wYXJzZSk7amUodGhpcywiUmVuZGVyZXIiLEFjKTtqZSh0aGlzLCJUZXh0UmVuZGVyZXIiLG1tKTtqZSh0aGlzLCJMZXhlciIsZnIpO2plKHRoaXMsImxleGVyIixmci5sZXgpO2plKHRoaXMsIlRva2VuaXplciIsT2MpO2plKHRoaXMsIkhvb2tzIixVcyk7dGhpcy51c2UoLi4udCl9d2Fsa1Rva2Vucyh0LG4pe3ZhciBvLGk7bGV0IHI9W107Zm9yKGNvbnN0IGwgb2YgdClzd2l0Y2gocj1yLmNvbmNhdChuLmNhbGwodGhpcyxsKSksbC50eXBlKXtjYXNlInRhYmxlIjp7Y29uc3Qgcz1sO2Zvcihjb25zdCBhIG9mIHMuaGVhZGVyKXI9ci5jb25jYXQodGhpcy53YWxrVG9rZW5zKGEudG9rZW5zLG4pKTtmb3IoY29uc3QgYSBvZiBzLnJvd3MpZm9yKGNvbnN0IHUgb2YgYSlyPXIuY29uY2F0KHRoaXMud2Fsa1Rva2Vucyh1LnRva2VucyxuKSk7YnJlYWt9Y2FzZSJsaXN0Ijp7Y29uc3Qgcz1sO3I9ci5jb25jYXQodGhpcy53YWxrVG9rZW5zKHMuaXRlbXMsbikpO2JyZWFrfWRlZmF1bHQ6e2NvbnN0IHM9bDsoaT0obz10aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnMpPT1udWxsP3ZvaWQgMDpvLmNoaWxkVG9rZW5zKSE9bnVsbCYmaVtzLnR5cGVdP3RoaXMuZGVmYXVsdHMuZXh0ZW5zaW9ucy5jaGlsZFRva2Vuc1tzLnR5cGVdLmZvckVhY2goYT0+e3I9ci5jb25jYXQodGhpcy53YWxrVG9rZW5zKHNbYV0sbikpfSk6cy50b2tlbnMmJihyPXIuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhzLnRva2VucyxuKSkpfX1yZXR1cm4gcn11c2UoLi4udCl7Y29uc3Qgbj10aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnN8fHtyZW5kZXJlcnM6e30sY2hpbGRUb2tlbnM6e319O3JldHVybiB0LmZvckVhY2gocj0+e2NvbnN0IG89ey4uLnJ9O2lmKG8uYXN5bmM9dGhpcy5kZWZhdWx0cy5hc3luY3x8by5hc3luY3x8ITEsci5leHRlbnNpb25zJiYoci5leHRlbnNpb25zLmZvckVhY2goaT0+e2lmKCFpLm5hbWUpdGhyb3cgbmV3IEVycm9yKCJleHRlbnNpb24gbmFtZSByZXF1aXJlZCIpO2lmKCJyZW5kZXJlciJpbiBpKXtjb25zdCBsPW4ucmVuZGVyZXJzW2kubmFtZV07bD9uLnJlbmRlcmVyc1tpLm5hbWVdPWZ1bmN0aW9uKC4uLnMpe2xldCBhPWkucmVuZGVyZXIuYXBwbHkodGhpcyxzKTtyZXR1cm4gYT09PSExJiYoYT1sLmFwcGx5KHRoaXMscykpLGF9Om4ucmVuZGVyZXJzW2kubmFtZV09aS5yZW5kZXJlcn1pZigidG9rZW5pemVyImluIGkpe2lmKCFpLmxldmVsfHxpLmxldmVsIT09ImJsb2NrIiYmaS5sZXZlbCE9PSJpbmxpbmUiKXRocm93IG5ldyBFcnJvcigiZXh0ZW5zaW9uIGxldmVsIG11c3QgYmUgJ2Jsb2NrJyBvciAnaW5saW5lJyIpO2NvbnN0IGw9bltpLmxldmVsXTtsP2wudW5zaGlmdChpLnRva2VuaXplcik6bltpLmxldmVsXT1baS50b2tlbml6ZXJdLGkuc3RhcnQmJihpLmxldmVsPT09ImJsb2NrIj9uLnN0YXJ0QmxvY2s/bi5zdGFydEJsb2NrLnB1c2goaS5zdGFydCk6bi5zdGFydEJsb2NrPVtpLnN0YXJ0XTppLmxldmVsPT09ImlubGluZSImJihuLnN0YXJ0SW5saW5lP24uc3RhcnRJbmxpbmUucHVzaChpLnN0YXJ0KTpuLnN0YXJ0SW5saW5lPVtpLnN0YXJ0XSkpfSJjaGlsZFRva2VucyJpbiBpJiZpLmNoaWxkVG9rZW5zJiYobi5jaGlsZFRva2Vuc1tpLm5hbWVdPWkuY2hpbGRUb2tlbnMpfSksby5leHRlbnNpb25zPW4pLHIucmVuZGVyZXIpe2NvbnN0IGk9dGhpcy5kZWZhdWx0cy5yZW5kZXJlcnx8bmV3IEFjKHRoaXMuZGVmYXVsdHMpO2Zvcihjb25zdCBsIGluIHIucmVuZGVyZXIpe2NvbnN0IHM9ci5yZW5kZXJlcltsXSxhPWwsdT1pW2FdO2lbYV09KC4uLmMpPT57bGV0IGQ9cy5hcHBseShpLGMpO3JldHVybiBkPT09ITEmJihkPXUuYXBwbHkoaSxjKSksZHx8IiJ9fW8ucmVuZGVyZXI9aX1pZihyLnRva2VuaXplcil7Y29uc3QgaT10aGlzLmRlZmF1bHRzLnRva2VuaXplcnx8bmV3IE9jKHRoaXMuZGVmYXVsdHMpO2Zvcihjb25zdCBsIGluIHIudG9rZW5pemVyKXtjb25zdCBzPXIudG9rZW5pemVyW2xdLGE9bCx1PWlbYV07aVthXT0oLi4uYyk9PntsZXQgZD1zLmFwcGx5KGksYyk7cmV0dXJuIGQ9PT0hMSYmKGQ9dS5hcHBseShpLGMpKSxkfX1vLnRva2VuaXplcj1pfWlmKHIuaG9va3Mpe2NvbnN0IGk9dGhpcy5kZWZhdWx0cy5ob29rc3x8bmV3IFVzO2Zvcihjb25zdCBsIGluIHIuaG9va3Mpe2NvbnN0IHM9ci5ob29rc1tsXSxhPWwsdT1pW2FdO1VzLnBhc3NUaHJvdWdoSG9va3MuaGFzKGwpP2lbYV09Yz0+e2lmKHRoaXMuZGVmYXVsdHMuYXN5bmMpcmV0dXJuIFByb21pc2UucmVzb2x2ZShzLmNhbGwoaSxjKSkudGhlbihmPT51LmNhbGwoaSxmKSk7Y29uc3QgZD1zLmNhbGwoaSxjKTtyZXR1cm4gdS5jYWxsKGksZCl9OmlbYV09KC4uLmMpPT57bGV0IGQ9cy5hcHBseShpLGMpO3JldHVybiBkPT09ITEmJihkPXUuYXBwbHkoaSxjKSksZH19by5ob29rcz1pfWlmKHIud2Fsa1Rva2Vucyl7Y29uc3QgaT10aGlzLmRlZmF1bHRzLndhbGtUb2tlbnMsbD1yLndhbGtUb2tlbnM7by53YWxrVG9rZW5zPWZ1bmN0aW9uKHMpe2xldCBhPVtdO3JldHVybiBhLnB1c2gobC5jYWxsKHRoaXMscykpLGkmJihhPWEuY29uY2F0KGkuY2FsbCh0aGlzLHMpKSksYX19dGhpcy5kZWZhdWx0cz17Li4udGhpcy5kZWZhdWx0cywuLi5vfX0pLHRoaXN9c2V0T3B0aW9ucyh0KXtyZXR1cm4gdGhpcy5kZWZhdWx0cz17Li4udGhpcy5kZWZhdWx0cywuLi50fSx0aGlzfX1FYT1uZXcgV2Vha1NldCxwcD1mdW5jdGlvbih0LG4pe3JldHVybihyLG8pPT57Y29uc3QgaT17Li4ub30sbD17Li4udGhpcy5kZWZhdWx0cywuLi5pfTt0aGlzLmRlZmF1bHRzLmFzeW5jPT09ITAmJmkuYXN5bmM9PT0hMSYmKGwuc2lsZW50fHxjb25zb2xlLndhcm4oIm1hcmtlZCgpOiBUaGUgYXN5bmMgb3B0aW9uIHdhcyBzZXQgdG8gdHJ1ZSBieSBhbiBleHRlbnNpb24uIFRoZSBhc3luYzogZmFsc2Ugb3B0aW9uIHNlbnQgdG8gcGFyc2Ugd2lsbCBiZSBpZ25vcmVkLiIpLGwuYXN5bmM9ITApO2NvbnN0IHM9SGEodGhpcyxXYyxGUykuY2FsbCh0aGlzLCEhbC5zaWxlbnQsISFsLmFzeW5jKTtpZih0eXBlb2Ygcj4idSJ8fHI9PT1udWxsKXJldHVybiBzKG5ldyBFcnJvcigibWFya2VkKCk6IGlucHV0IHBhcmFtZXRlciBpcyB1bmRlZmluZWQgb3IgbnVsbCIpKTtpZih0eXBlb2YgciE9InN0cmluZyIpcmV0dXJuIHMobmV3IEVycm9yKCJtYXJrZWQoKTogaW5wdXQgcGFyYW1ldGVyIGlzIG9mIHR5cGUgIitPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocikrIiwgc3RyaW5nIGV4cGVjdGVkIikpO2lmKGwuaG9va3MmJihsLmhvb2tzLm9wdGlvbnM9bCksbC5hc3luYylyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGwuaG9va3M/bC5ob29rcy5wcmVwcm9jZXNzKHIpOnIpLnRoZW4oYT0+dChhLGwpKS50aGVuKGE9Pmwud2Fsa1Rva2Vucz9Qcm9taXNlLmFsbCh0aGlzLndhbGtUb2tlbnMoYSxsLndhbGtUb2tlbnMpKS50aGVuKCgpPT5hKTphKS50aGVuKGE9Pm4oYSxsKSkudGhlbihhPT5sLmhvb2tzP2wuaG9va3MucG9zdHByb2Nlc3MoYSk6YSkuY2F0Y2gocyk7dHJ5e2wuaG9va3MmJihyPWwuaG9va3MucHJlcHJvY2VzcyhyKSk7Y29uc3QgYT10KHIsbCk7bC53YWxrVG9rZW5zJiZ0aGlzLndhbGtUb2tlbnMoYSxsLndhbGtUb2tlbnMpO2xldCB1PW4oYSxsKTtyZXR1cm4gbC5ob29rcyYmKHU9bC5ob29rcy5wb3N0cHJvY2Vzcyh1KSksdX1jYXRjaChhKXtyZXR1cm4gcyhhKX19fSxXYz1uZXcgV2Vha1NldCxGUz1mdW5jdGlvbih0LG4pe3JldHVybiByPT57aWYoci5tZXNzYWdlKz1gClBsZWFzZSByZXBvcnQgdGhpcyB0byBodHRwczovL2dpdGh1Yi5jb20vbWFya2VkanMvbWFya2VkLmAsdCl7Y29uc3Qgbz0iPHA+QW4gZXJyb3Igb2NjdXJyZWQ6PC9wPjxwcmU+Iit2bihyLm1lc3NhZ2UrIiIsITApKyI8L3ByZT4iO3JldHVybiBuP1Byb21pc2UucmVzb2x2ZShvKTpvfWlmKG4pcmV0dXJuIFByb21pc2UucmVqZWN0KHIpO3Rocm93IHJ9fTtjb25zdCBtaT1uZXcgSFA7ZnVuY3Rpb24gTWUoZSx0KXtyZXR1cm4gbWkucGFyc2UoZSx0KX1NZS5vcHRpb25zPU1lLnNldE9wdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIG1pLnNldE9wdGlvbnMoZSksTWUuZGVmYXVsdHM9bWkuZGVmYXVsdHMsSVMoTWUuZGVmYXVsdHMpLE1lfTtNZS5nZXREZWZhdWx0cz1nbTtNZS5kZWZhdWx0cz1iaTtNZS51c2U9ZnVuY3Rpb24oLi4uZSl7cmV0dXJuIG1pLnVzZSguLi5lKSxNZS5kZWZhdWx0cz1taS5kZWZhdWx0cyxJUyhNZS5kZWZhdWx0cyksTWV9O01lLndhbGtUb2tlbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbWkud2Fsa1Rva2VucyhlLHQpfTtNZS5wYXJzZUlubGluZT1taS5wYXJzZUlubGluZTtNZS5QYXJzZXI9aHI7TWUucGFyc2VyPWhyLnBhcnNlO01lLlJlbmRlcmVyPUFjO01lLlRleHRSZW5kZXJlcj1tbTtNZS5MZXhlcj1mcjtNZS5sZXhlcj1mci5sZXg7TWUuVG9rZW5pemVyPU9jO01lLkhvb2tzPVVzO01lLnBhcnNlPU1lO01lLm9wdGlvbnM7TWUuc2V0T3B0aW9ucztNZS51c2U7TWUud2Fsa1Rva2VucztNZS5wYXJzZUlubGluZTtoci5wYXJzZTtjb25zdCBLUD1mci5sZXgsTWM9Jzx2YWwgdmFsdWU9IicsZ3A9JyI+JyxtcD0iPC92YWw+IjtmdW5jdGlvbiBLbihlLHQsbixyPSExKXt2YXIgaSxsO2NvbnN0IG89W107Zm9yKDtuPGUubGVuZ3RoOyl7Y29uc3Qgcz1lW25dO2lmKHMudHlwZT09PSJoZWFkaW5nIilvLnB1c2goe3RhZzpgaCR7cy5kZXB0aH1gLGNoaWxkcmVuOktuKHMudG9rZW5zP3MudG9rZW5zOltdLHQsMCkuY2hpbGRyZW59KTtlbHNlIGlmKHMudHlwZT09PSJwYXJhZ3JhcGgiKW8ucHVzaCh7dGFnOiJwIixjaGlsZHJlbjpLbihzLnRva2Vucz9zLnRva2VuczpbXSx0LDApLmNoaWxkcmVufSk7ZWxzZSBpZihzLnR5cGU9PT0ic3Ryb25nIilvLnB1c2goe3RhZzoic3BhbiIsY2xhc3NlczpbImJvbGQiXSxjaGlsZHJlbjpLbihzLnRva2Vucz9zLnRva2VuczpbXSx0LDApLmNoaWxkcmVufSk7ZWxzZSBpZihzLnR5cGU9PT0iZW0iKW8ucHVzaCh7dGFnOiJzcGFuIixjbGFzc2VzOlsiaXRhbGljIl0sY2hpbGRyZW46S24ocy50b2tlbnM/cy50b2tlbnM6W10sdCwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYocy50eXBlPT09ImRlbCIpby5wdXNoKHt0YWc6InNwYW4iLGNsYXNzZXM6WyJsaW5lLXRocm91Z2giXSxjaGlsZHJlbjpLbihzLnRva2Vucz9zLnRva2VuczpbXSx0LDApLmNoaWxkcmVufSk7ZWxzZSBpZihzLnR5cGU9PT0idGV4dCIpaWYoInRva2VucyJpbiBzJiZBcnJheS5pc0FycmF5KHMudG9rZW5zKSlvLnB1c2goLi4uS24ocy50b2tlbnMsdCxuLHIpLmNoaWxkcmVuKTtlbHNlIGlmKHImJnR5cGVvZiBzLnJhdz09InN0cmluZyIpe2NvbnN0IGE9cy5yYXcuc3BsaXQoYApgKSx1PWEuZmxhdE1hcCgoYyxkKT0+ZD09PWEubGVuZ3RoLTE/W2NdOltjLHt0YWc6ImJyIixjaGlsZHJlbjpbXX1dKTtvLnB1c2goLi4udSl9ZWxzZSBvLnB1c2gocy5yYXcpO2Vsc2UgaWYocy50eXBlPT09Imxpc3QiKW8ucHVzaCh7dGFnOnMub3JkZXJlZD8ib2wiOiJ1bCIsY2hpbGRyZW46S24ocy5pdGVtcyx0LDApLmNoaWxkcmVufSk7ZWxzZSBpZihzLnR5cGU9PT0ibGlzdF9pdGVtIilvLnB1c2goe3RhZzoibGkiLGNoaWxkcmVuOktuKHMudG9rZW5zP3MudG9rZW5zOltdLHQsMCwhMCkuY2hpbGRyZW59KTtlbHNlIGlmKHMudHlwZSE9PSJzcGFjZSIpaWYocy50eXBlPT09Imh0bWwiKXtpZihzLnRleHQ9PT1tcClyZXR1cm57Y2hpbGRyZW46byxjdXJzb3I6bn07Y29uc3QgYT1zLnRleHQuaW5kZXhPZihncCk7aWYocy50ZXh0LnN0YXJ0c1dpdGgoTWMpJiZhPi0xKXtjb25zdCBjPU51bWJlcihzLnRleHQuc2xpY2UoTWMubGVuZ3RoLGEpKTtpZihOdW1iZXIuaXNOYU4oYykpdGhyb3cgRXJyb3IoYElsbGVnYWwgdmFsIGludGVybWVkaWF0ZSBub2RlOiAke0pTT04uc3RyaW5naWZ5KHMpfWApO2NvbnN0e2NoaWxkcmVuOmQsY3Vyc29yOmZ9PUtuKGUubWFwKGc9PmcudHlwZT09PSJsaW5rInx8Zy50eXBlPT09Imxpc3QiP3t0eXBlOiJ0ZXh0IixyYXc6Zy5yYXcsdGV4dDpnLnJhd306ZyksdCxuKzEpLGg9dFtjXTtoLl90eXBlPT09ImxpbmsiP28ucHVzaCh7dGFnOiJhIixocmVmOmguaHJlZixjaGlsZHJlbjpkfSk6aC5fdHlwZT09PSJmaWxlIiYmby5wdXNoKHt0YWc6ImltZyIsc3JjOnduLmNvbnZlcnRGaWxlU291cmNlKGgpLnVybCx3aWR0aDooaT1oLm1ldGFkYXRhKT09bnVsbD92b2lkIDA6aS53aWR0aCxoZWlnaHQ6KGw9aC5tZXRhZGF0YSk9PW51bGw/dm9pZCAwOmwuaGVpZ2h0LGNoaWxkcmVuOltdfSksbj1mfWNvbnN0IHU9LzxiclxzKlwvPz4vZ2k7cy50ZXh0LnRyaW0oKS5tYXRjaCh1KSYmby5wdXNoKHt0YWc6ImJyIixjaGlsZHJlbjpbXX0pfWVsc2Ugcy50eXBlPT09ImxpbmsiP3MucmF3PT09cy5ocmVmP28ucHVzaChzLnJhdyk6by5wdXNoKHt0YWc6ImEiLGhyZWY6cy5ocmVmLGNoaWxkcmVuOktuKHMudG9rZW5zP3MudG9rZW5zOltdLHQsMCkuY2hpbGRyZW59KTpzLnR5cGU9PT0iYnIiP28ucHVzaCh7dGFnOiJiciIsY2hpbGRyZW46W119KTpjb25zb2xlLmVycm9yKGBDb3VsZCBub3QgcGFyc2UgbWFya2Rvd246IHVuc3VwcG9ydGVkIHRva2VuIHR5cGU6ICR7cy50eXBlfS4gRm91bmQ6ICR7cy5yYXd9YCk7bisrfXJldHVybntjaGlsZHJlbjpvLGN1cnNvcjpufX1mdW5jdGlvbiBCUyh7dGVtcGxhdGVTdHJpbmdzOmUsZXhwcnM6dH0pe2NvbnN0IG49ZS5mbGF0TWFwKChsLHMpPT57Y29uc3QgYT10W3NdO3JldHVybiBhP2FbS3RdPT09ImxpbmsiP2wuY29uY2F0KGAke01jfSR7c30ke2dwfSR7YS5jaGlsZHJlblswXX0ke21wfWApOmwuY29uY2F0KGAke01jfSR7c30ke2dwfSR7bXB9YCk6bH0pLmpvaW4oIiIpLHI9S1Aobix7Z2ZtOiEwfSkse2NoaWxkcmVuOm8sY3Vyc29yOml9PUtuKHIsdCwwKTtpZihpIT09ci5sZW5ndGgpdGhyb3cgRXJyb3IoIlVuZXhwZWN0ZWRseSB0ZXJtaW5hdGVkIG1hcmtkb3duIHBhcnNpbmcuIFBvc3NpYmxlIHJlYXNvbjogdW5jbG9zZWQgaHRtbCB0YWc/Iik7cmV0dXJue1tLdF06InJpY2h0ZXh0IixjaGlsZHJlbjpvfX1jb25zdCBHUD0vXmgoW1xkK10pJC87ZnVuY3Rpb24gWVAoZSl7Y29uc3QgdD1lLmNoaWxkcmVuLm1hcChYUCk7cmV0dXJuIFFQKHQpfWZ1bmN0aW9uIFhQKGUpe3ZhciB0O2lmKGUudHlwZT09PSJoZWFkaW5nIil7bGV0IG49IiI7Y29uc3Qgcj1OdW1iZXIoKHQ9ZS50YWcubWF0Y2goR1ApKT09bnVsbD92b2lkIDA6dFsxXSk7aWYoTnVtYmVyLmlzTmFOKHIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBoZWFkZXIgZGVwdGgiKTtmb3IobGV0IGk9MDtpPE51bWJlcihyKTtpKyspbis9IiMiO3JldHVybnt0eXBlOiJibG9jayIsY2hpbGRyZW46W2Ake259IGBdLmNvbmNhdCguLi5lLmNoaWxkcmVuLm1hcCh2cCkpfX1lbHNle2lmKGUudHlwZT09PSJwYXJhZ3JhcGgiKXJldHVybiBlLmNoaWxkcmVuLmxlbmd0aD09PTA/e3R5cGU6ImJsb2NrIixjaGlsZHJlbjpbIjxiciAvPiJdfTp7dHlwZToiYmxvY2siLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKG49PnZwKG4pKX07aWYoZS50eXBlPT09Imxpc3QiKXJldHVybnt0eXBlOiJibG9jayIsY2hpbGRyZW46ZS5jaGlsZHJlbi5mbGF0TWFwKChuLHIpPT5VUyhWUyhlKSxuLDAscj09PTApKX07e2NvbnN0IG49ZTt0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBub2RlIHR5cGU6ICR7InR5cGUiaW4gbj8iZXhoYXVzdGl2ZUNoZWNrLnR5cGUiOiJ1bmtub3duIn1gKX19fWFzeW5jIGZ1bmN0aW9uIFFQKGUpe2NvbnN0IHQ9W2AKYF0sbj1bXSxyPXt9O2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7bysrKXtjb25zdCBpPWVbb107Zm9yKGNvbnN0IGwgb2YgaS5jaGlsZHJlbilpZih0eXBlb2YgbD09InN0cmluZyIpdFt0Lmxlbmd0aC0xXSs9bDtlbHNle2lmKGwudHlwZT09PSJpbWFnZSIpbi5wdXNoKGF3YWl0IGVPKGwscikpO2Vsc2UgaWYobC50eXBlPT09ImxpbmsiKW4ucHVzaChuTyhsKSk7ZWxzZXtjb25zdCBzPWw7dGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG5vZGUgdHlwZTogJHtKU09OLnN0cmluZ2lmeShzLG51bGwsMil9YCl9dC5wdXNoKCIiKX1vPT09ZS5sZW5ndGgtMT90W3QubGVuZ3RoLTFdKz1gCmA6dFt0Lmxlbmd0aC0xXSs9YAoKYH1yZXR1cm57W0t0XToicmljaHRleHQiLHRlbXBsYXRlU3RyaW5nczp0LGV4cHJzOm4sZmlsZXM6cn19ZnVuY3Rpb24gV1MoZSl7Y29uc3QgdD10eXBlb2YgZS5mb3JtYXQ9PSJudW1iZXIiP1pQKGUuZm9ybWF0KTpbXTtsZXQgbj1lLnRleHQudHJpbVN0YXJ0KCk7Y29uc3Qgcj1lLnRleHQubGVuZ3RoLW4ubGVuZ3RoO249bi50cmltRW5kKCk7Y29uc3Qgbz1lLnRleHQubGVuZ3RoLW4ubGVuZ3RoLXI7cmV0dXJuIHQuaW5jbHVkZXMoImJvbGQiKSYmdC5pbmNsdWRlcygiaXRhbGljIik/bj1gKioqJHtufSoqKmA6dC5pbmNsdWRlcygiYm9sZCIpP249YCoqJHtufSoqYDp0LmluY2x1ZGVzKCJpdGFsaWMiKSYmKG49YF8ke259X2ApLHQuaW5jbHVkZXMoImxpbmUtdGhyb3VnaCIpJiYobj1gfn4ke259fn5gKSxgJHsiICIucmVwZWF0KHIpfSR7bn0keyIgIi5yZXBlYXQobyl9YH1mdW5jdGlvbiB2cChlKXtyZXR1cm4gZS50eXBlPT09InRleHQiP1dTKGUpOmUudHlwZT09PSJsaW5lYnJlYWsiP2AKYDplfWZ1bmN0aW9uIFVTKGUsdCxuLHI9ITEpe3ZhciBsLHM7Y29uc3QgaT1bYCR7cj8iIjpgCmB9JHsiICIucmVwZWF0KG4pfSR7ZX1gXTtyZXR1cm4oKHM9KGw9dC5jaGlsZHJlbik9PW51bGw/dm9pZCAwOmxbMF0pPT1udWxsP3ZvaWQgMDpzLnR5cGUpIT09Imxpc3QiJiZpLnB1c2goIiAiKSxpLmNvbmNhdCh0LmNoaWxkcmVuLmZsYXRNYXAoYT0+YS50eXBlPT09Imxpc3QiP2EuY2hpbGRyZW4uZmxhdE1hcCh1PT5VUyhWUyhhKSx1LG4rNCkpOlt2cChhKV0pKX1mdW5jdGlvbiBWUyhlKXtpZihlLmxpc3RUeXBlPT09ImJ1bGxldCIpcmV0dXJuIi0iO2lmKGUubGlzdFR5cGU9PT0ibnVtYmVyIilyZXR1cm4iMS4iO3Rocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIGxpc3QgdHlwZTogJHtlLmxpc3RUeXBlfWApfWNvbnN0IEpQPXtib2xkOjEsaXRhbGljOjIsImxpbmUtdGhyb3VnaCI6NH07ZnVuY3Rpb24gWlAoZSl7cmV0dXJuIE9iamVjdC5lbnRyaWVzKEpQKS5mbGF0TWFwKChbdCxuXSk9PihuJmUpPT09bj9bdF06W10pfWNvbnN0IHFQPW5ldyBUZXh0RW5jb2Rlcjthc3luYyBmdW5jdGlvbiBlTyhlLHQpe2lmKGUuc3JjLnN0YXJ0c1dpdGgoImRhdGE6Iikpe2NvbnN0IG49YXdhaXQgd24uZ2V0U0hBMjU2SGFzaChxUC5lbmNvZGUoZS5zcmMpKSxyPU9nKGUuc3JjKTtpZihyPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGRldGVjdCBNaW1lIFR5cGUgZm9yIGltYWdlOiAke2Uuc3JjfWApO2NvbnN0IG89QWcociksaT1gL3B1YmxpYy8ke259LiR7b31gO3JldHVybiB0W2ldPWUuc3JjLHtbS3RdOiJmaWxlIixbaG5dOmksbWV0YWRhdGE6e3dpZHRoOmUud2lkdGh8fDAsaGVpZ2h0OmUuaGVpZ2h0fHwwLHNoYTI1NjpufHwiIn19fWVsc2V7Y29uc3Qgbj10Tygic2hhMjU2IixlLnNyYyk7cmV0dXJue1tLdF06ImZpbGUiLFtobl06YC9wdWJsaWMke2Uuc3JjLnNwbGl0KCI/IilbMF19YCxtZXRhZGF0YTp7d2lkdGg6ZS53aWR0aHx8MCxoZWlnaHQ6ZS5oZWlnaHR8fDAsc2hhMjU2Om58fCIifX19fWZ1bmN0aW9uIHRPKGUsdCl7Y29uc3Qgbj10LnNwbGl0KCI/Iik7aWYobi5sZW5ndGg8MilyZXR1cm47Y29uc3Qgcj1uWzFdLG89bmV3IFVSTFNlYXJjaFBhcmFtcyhyKTtpZihvLmhhcyhlKSlyZXR1cm4gby5nZXQoZSl9ZnVuY3Rpb24gbk8oZSl7cmV0dXJue1tLdF06ImxpbmsiLGhyZWY6ZS51cmwsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAoV1MpfX1jb25zdCB2bT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSx0eXBlOnQsLi4ubn0scik9PnguanN4KCJpbnB1dCIse3R5cGU6dCxjbGFzc05hbWU6b3QoImZsZXggaC0xMCB3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWlucHV0IGJnLWJhY2tncm91bmQgcHgtMyBweS0yIHRleHQtc20gcmluZy1vZmZzZXQtYmFja2dyb3VuZCBmaWxlOmJvcmRlci0wIGZpbGU6YmctdHJhbnNwYXJlbnQgZmlsZTp0ZXh0LXNtIGZpbGU6Zm9udC1tZWRpdW0gcGxhY2Vob2xkZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCIsZSkscmVmOnIsLi4ubn0pKTt2bS5kaXNwbGF5TmFtZT0iSW5wdXQiO2Z1bmN0aW9uIEhTKGUpe2NvbnN0IHQ9ZSsiQ29sbGVjdGlvblByb3ZpZGVyIixbbixyXT0kaSh0KSxbbyxpXT1uKHQse2NvbGxlY3Rpb25SZWY6e2N1cnJlbnQ6bnVsbH0saXRlbU1hcDpuZXcgTWFwfSksbD1oPT57Y29uc3R7c2NvcGU6ZyxjaGlsZHJlbjptfT1oLFM9cS51c2VSZWYobnVsbCksdj1xLnVzZVJlZihuZXcgTWFwKS5jdXJyZW50O3JldHVybiBxLmNyZWF0ZUVsZW1lbnQobyx7c2NvcGU6ZyxpdGVtTWFwOnYsY29sbGVjdGlvblJlZjpTfSxtKX0scz1lKyJDb2xsZWN0aW9uU2xvdCIsYT1xLmZvcndhcmRSZWYoKGgsZyk9Pntjb25zdHtzY29wZTptLGNoaWxkcmVuOlN9PWgsdj1pKHMsbSkseT1YZShnLHYuY29sbGVjdGlvblJlZik7cmV0dXJuIHEuY3JlYXRlRWxlbWVudCgkbCx7cmVmOnl9LFMpfSksdT1lKyJDb2xsZWN0aW9uSXRlbVNsb3QiLGM9ImRhdGEtcmFkaXgtY29sbGVjdGlvbi1pdGVtIixkPXEuZm9yd2FyZFJlZigoaCxnKT0+e2NvbnN0e3Njb3BlOm0sY2hpbGRyZW46UywuLi52fT1oLHk9cS51c2VSZWYobnVsbCksXz1YZShnLHkpLHc9aSh1LG0pO3JldHVybiBxLnVzZUVmZmVjdCgoKT0+KHcuaXRlbU1hcC5zZXQoeSx7cmVmOnksLi4udn0pLCgpPT52b2lkIHcuaXRlbU1hcC5kZWxldGUoeSkpKSxxLmNyZWF0ZUVsZW1lbnQoJGwse1tjXToiIixyZWY6X30sUyl9KTtmdW5jdGlvbiBmKGgpe2NvbnN0IGc9aShlKyJDb2xsZWN0aW9uQ29uc3VtZXIiLGgpO3JldHVybiBxLnVzZUNhbGxiYWNrKCgpPT57Y29uc3QgUz1nLmNvbGxlY3Rpb25SZWYuY3VycmVudDtpZighUylyZXR1cm5bXTtjb25zdCB2PUFycmF5LmZyb20oUy5xdWVyeVNlbGVjdG9yQWxsKGBbJHtjfV1gKSk7cmV0dXJuIEFycmF5LmZyb20oZy5pdGVtTWFwLnZhbHVlcygpKS5zb3J0KCh3LEMpPT52LmluZGV4T2Yody5yZWYuY3VycmVudCktdi5pbmRleE9mKEMucmVmLmN1cnJlbnQpKX0sW2cuY29sbGVjdGlvblJlZixnLml0ZW1NYXBdKX1yZXR1cm5be1Byb3ZpZGVyOmwsU2xvdDphLEl0ZW1TbG90OmR9LGYscl19ZnVuY3Rpb24gck8oZSx0PWdsb2JhbFRoaXM9PW51bGw/dm9pZCAwOmdsb2JhbFRoaXMuZG9jdW1lbnQpe2NvbnN0IG49VnQoZSk7cC51c2VFZmZlY3QoKCk9Pntjb25zdCByPW89PntvLmtleT09PSJFc2NhcGUiJiZuKG8pfTtyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixyKSwoKT0+dC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixyKX0sW24sdF0pfWNvbnN0IHlwPSJkaXNtaXNzYWJsZUxheWVyLnVwZGF0ZSIsb089ImRpc21pc3NhYmxlTGF5ZXIucG9pbnRlckRvd25PdXRzaWRlIixpTz0iZGlzbWlzc2FibGVMYXllci5mb2N1c091dHNpZGUiO2xldCByMDtjb25zdCBsTz1wLmNyZWF0ZUNvbnRleHQoe2xheWVyczpuZXcgU2V0LGxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkOm5ldyBTZXQsYnJhbmNoZXM6bmV3IFNldH0pLHNPPXAuZm9yd2FyZFJlZigoZSx0KT0+e3ZhciBuO2NvbnN0e2Rpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50czpyPSExLG9uRXNjYXBlS2V5RG93bjpvLG9uUG9pbnRlckRvd25PdXRzaWRlOmksb25Gb2N1c091dHNpZGU6bCxvbkludGVyYWN0T3V0c2lkZTpzLG9uRGlzbWlzczphLC4uLnV9PWUsYz1wLnVzZUNvbnRleHQobE8pLFtkLGZdPXAudXNlU3RhdGUobnVsbCksaD0obj1kPT1udWxsP3ZvaWQgMDpkLm93bmVyRG9jdW1lbnQpIT09bnVsbCYmbiE9PXZvaWQgMD9uOmdsb2JhbFRoaXM9PW51bGw/dm9pZCAwOmdsb2JhbFRoaXMuZG9jdW1lbnQsWyxnXT1wLnVzZVN0YXRlKHt9KSxtPVhlKHQsVD0+ZihUKSksUz1BcnJheS5mcm9tKGMubGF5ZXJzKSxbdl09Wy4uLmMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWRdLnNsaWNlKC0xKSx5PVMuaW5kZXhPZih2KSxfPWQ/Uy5pbmRleE9mKGQpOi0xLHc9Yy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5zaXplPjAsQz1fPj15LCQ9YU8oVD0+e2NvbnN0IE09VC50YXJnZXQsUj1bLi4uYy5icmFuY2hlc10uc29tZShqPT5qLmNvbnRhaW5zKE0pKTshQ3x8Unx8KGk9PW51bGx8fGkoVCkscz09bnVsbHx8cyhUKSxULmRlZmF1bHRQcmV2ZW50ZWR8fGE9PW51bGx8fGEoKSl9LGgpLEU9dU8oVD0+e2NvbnN0IE09VC50YXJnZXQ7Wy4uLmMuYnJhbmNoZXNdLnNvbWUoaj0+ai5jb250YWlucyhNKSl8fChsPT1udWxsfHxsKFQpLHM9PW51bGx8fHMoVCksVC5kZWZhdWx0UHJldmVudGVkfHxhPT1udWxsfHxhKCkpfSxoKTtyZXR1cm4gck8oVD0+e189PT1jLmxheWVycy5zaXplLTEmJihvPT1udWxsfHxvKFQpLCFULmRlZmF1bHRQcmV2ZW50ZWQmJmEmJihULnByZXZlbnREZWZhdWx0KCksYSgpKSl9LGgpLHAudXNlRWZmZWN0KCgpPT57aWYoZClyZXR1cm4gciYmKGMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZT09PTAmJihyMD1oLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyxoLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIpLGMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuYWRkKGQpKSxjLmxheWVycy5hZGQoZCksbzAoKSwoKT0+e3ImJmMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZT09PTEmJihoLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1yMCl9fSxbZCxoLHIsY10pLHAudXNlRWZmZWN0KCgpPT4oKT0+e2QmJihjLmxheWVycy5kZWxldGUoZCksYy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5kZWxldGUoZCksbzAoKSl9LFtkLGNdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IFQ9KCk9Pmcoe30pO3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHlwLFQpLCgpPT5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHlwLFQpfSxbXSkscC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7fSx1LHtyZWY6bSxzdHlsZTp7cG9pbnRlckV2ZW50czp3P0M/ImF1dG8iOiJub25lIjp2b2lkIDAsLi4uZS5zdHlsZX0sb25Gb2N1c0NhcHR1cmU6SGUoZS5vbkZvY3VzQ2FwdHVyZSxFLm9uRm9jdXNDYXB0dXJlKSxvbkJsdXJDYXB0dXJlOkhlKGUub25CbHVyQ2FwdHVyZSxFLm9uQmx1ckNhcHR1cmUpLG9uUG9pbnRlckRvd25DYXB0dXJlOkhlKGUub25Qb2ludGVyRG93bkNhcHR1cmUsJC5vblBvaW50ZXJEb3duQ2FwdHVyZSl9KSl9KTtmdW5jdGlvbiBhTyhlLHQ9Z2xvYmFsVGhpcz09bnVsbD92b2lkIDA6Z2xvYmFsVGhpcy5kb2N1bWVudCl7Y29uc3Qgbj1WdChlKSxyPXAudXNlUmVmKCExKSxvPXAudXNlUmVmKCgpPT57fSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgaT1zPT57aWYocy50YXJnZXQmJiFyLmN1cnJlbnQpe2xldCBjPWZ1bmN0aW9uKCl7S1Mob08sbix1LHtkaXNjcmV0ZTohMH0pfTt2YXIgYT1jO2NvbnN0IHU9e29yaWdpbmFsRXZlbnQ6c307cy5wb2ludGVyVHlwZT09PSJ0b3VjaCI/KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLG8uY3VycmVudCksby5jdXJyZW50PWMsdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsby5jdXJyZW50LHtvbmNlOiEwfSkpOmMoKX1lbHNlIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLG8uY3VycmVudCk7ci5jdXJyZW50PSExfSxsPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT57dC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsaSl9LDApO3JldHVybigpPT57d2luZG93LmNsZWFyVGltZW91dChsKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIixpKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixvLmN1cnJlbnQpfX0sW3Qsbl0pLHtvblBvaW50ZXJEb3duQ2FwdHVyZTooKT0+ci5jdXJyZW50PSEwfX1mdW5jdGlvbiB1TyhlLHQ9Z2xvYmFsVGhpcz09bnVsbD92b2lkIDA6Z2xvYmFsVGhpcy5kb2N1bWVudCl7Y29uc3Qgbj1WdChlKSxyPXAudXNlUmVmKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBvPWk9PntpLnRhcmdldCYmIXIuY3VycmVudCYmS1MoaU8sbix7b3JpZ2luYWxFdmVudDppfSx7ZGlzY3JldGU6ITF9KX07cmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsbyksKCk9PnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsbyl9LFt0LG5dKSx7b25Gb2N1c0NhcHR1cmU6KCk9PnIuY3VycmVudD0hMCxvbkJsdXJDYXB0dXJlOigpPT5yLmN1cnJlbnQ9ITF9fWZ1bmN0aW9uIG8wKCl7Y29uc3QgZT1uZXcgQ3VzdG9tRXZlbnQoeXApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQoZSl9ZnVuY3Rpb24gS1MoZSx0LG4se2Rpc2NyZXRlOnJ9KXtjb25zdCBvPW4ub3JpZ2luYWxFdmVudC50YXJnZXQsaT1uZXcgQ3VzdG9tRXZlbnQoZSx7YnViYmxlczohMSxjYW5jZWxhYmxlOiEwLGRldGFpbDpufSk7dCYmby5hZGRFdmVudExpc3RlbmVyKGUsdCx7b25jZTohMH0pLHI/UVQobyxpKTpvLmRpc3BhdGNoRXZlbnQoaSl9bGV0ICRmPTA7ZnVuY3Rpb24gY08oKXtwLnVzZUVmZmVjdCgoKT0+e3ZhciBlLHQ7Y29uc3Qgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1yYWRpeC1mb2N1cy1ndWFyZF0iKTtyZXR1cm4gZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyYmVnaW4iLChlPW5bMF0pIT09bnVsbCYmZSE9PXZvaWQgMD9lOmkwKCkpLGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLCh0PW5bMV0pIT09bnVsbCYmdCE9PXZvaWQgMD90OmkwKCkpLCRmKyssKCk9PnskZj09PTEmJmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLXJhZGl4LWZvY3VzLWd1YXJkXSIpLmZvckVhY2gocj0+ci5yZW1vdmUoKSksJGYtLX19LFtdKX1mdW5jdGlvbiBpMCgpe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3JldHVybiBlLnNldEF0dHJpYnV0ZSgiZGF0YS1yYWRpeC1mb2N1cy1ndWFyZCIsIiIpLGUudGFiSW5kZXg9MCxlLnN0eWxlLmNzc1RleHQ9Im91dGxpbmU6IG5vbmU7IG9wYWNpdHk6IDA7IHBvc2l0aW9uOiBmaXhlZDsgcG9pbnRlci1ldmVudHM6IG5vbmUiLGV9Y29uc3Qga2Y9ImZvY3VzU2NvcGUuYXV0b0ZvY3VzT25Nb3VudCIsVGY9ImZvY3VzU2NvcGUuYXV0b0ZvY3VzT25Vbm1vdW50IixsMD17YnViYmxlczohMSxjYW5jZWxhYmxlOiEwfSxkTz1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtsb29wOm49ITEsdHJhcHBlZDpyPSExLG9uTW91bnRBdXRvRm9jdXM6byxvblVubW91bnRBdXRvRm9jdXM6aSwuLi5sfT1lLFtzLGFdPXAudXNlU3RhdGUobnVsbCksdT1WdChvKSxjPVZ0KGkpLGQ9cC51c2VSZWYobnVsbCksZj1YZSh0LG09PmEobSkpLGg9cC51c2VSZWYoe3BhdXNlZDohMSxwYXVzZSgpe3RoaXMucGF1c2VkPSEwfSxyZXN1bWUoKXt0aGlzLnBhdXNlZD0hMX19KS5jdXJyZW50O3AudXNlRWZmZWN0KCgpPT57aWYocil7bGV0IHk9ZnVuY3Rpb24oJCl7aWYoaC5wYXVzZWR8fCFzKXJldHVybjtjb25zdCBFPSQudGFyZ2V0O3MuY29udGFpbnMoRSk/ZC5jdXJyZW50PUU6b28oZC5jdXJyZW50LHtzZWxlY3Q6ITB9KX0sXz1mdW5jdGlvbigkKXtpZihoLnBhdXNlZHx8IXMpcmV0dXJuO2NvbnN0IEU9JC5yZWxhdGVkVGFyZ2V0O0UhPT1udWxsJiYocy5jb250YWlucyhFKXx8b28oZC5jdXJyZW50LHtzZWxlY3Q6ITB9KSl9LHc9ZnVuY3Rpb24oJCl7aWYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PWRvY3VtZW50LmJvZHkpZm9yKGNvbnN0IFQgb2YgJClULnJlbW92ZWROb2Rlcy5sZW5ndGg+MCYmb28ocyl9O3ZhciBtPXksUz1fLHY9dztkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmb2N1c2luIix5KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmb2N1c291dCIsXyk7Y29uc3QgQz1uZXcgTXV0YXRpb25PYnNlcnZlcih3KTtyZXR1cm4gcyYmQy5vYnNlcnZlKHMse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSksKCk9Pntkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1c2luIix5KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1c291dCIsXyksQy5kaXNjb25uZWN0KCl9fX0sW3IscyxoLnBhdXNlZF0pLHAudXNlRWZmZWN0KCgpPT57aWYocyl7YTAuYWRkKGgpO2NvbnN0IG09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZighcy5jb250YWlucyhtKSl7Y29uc3Qgdj1uZXcgQ3VzdG9tRXZlbnQoa2YsbDApO3MuYWRkRXZlbnRMaXN0ZW5lcihrZix1KSxzLmRpc3BhdGNoRXZlbnQodiksdi5kZWZhdWx0UHJldmVudGVkfHwoZk8odk8oR1MocykpLHtzZWxlY3Q6ITB9KSxkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09bSYmb28ocykpfXJldHVybigpPT57cy5yZW1vdmVFdmVudExpc3RlbmVyKGtmLHUpLHNldFRpbWVvdXQoKCk9Pntjb25zdCB2PW5ldyBDdXN0b21FdmVudChUZixsMCk7cy5hZGRFdmVudExpc3RlbmVyKFRmLGMpLHMuZGlzcGF0Y2hFdmVudCh2KSx2LmRlZmF1bHRQcmV2ZW50ZWR8fG9vKG0/P2RvY3VtZW50LmJvZHkse3NlbGVjdDohMH0pLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihUZixjKSxhMC5yZW1vdmUoaCl9LDApfX19LFtzLHUsYyxoXSk7Y29uc3QgZz1wLnVzZUNhbGxiYWNrKG09PntpZighbiYmIXJ8fGgucGF1c2VkKXJldHVybjtjb25zdCBTPW0ua2V5PT09IlRhYiImJiFtLmFsdEtleSYmIW0uY3RybEtleSYmIW0ubWV0YUtleSx2PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoUyYmdil7Y29uc3QgeT1tLmN1cnJlbnRUYXJnZXQsW18sd109aE8oeSk7XyYmdz8hbS5zaGlmdEtleSYmdj09PXc/KG0ucHJldmVudERlZmF1bHQoKSxuJiZvbyhfLHtzZWxlY3Q6ITB9KSk6bS5zaGlmdEtleSYmdj09PV8mJihtLnByZXZlbnREZWZhdWx0KCksbiYmb28odyx7c2VsZWN0OiEwfSkpOnY9PT15JiZtLnByZXZlbnREZWZhdWx0KCl9fSxbbixyLGgucGF1c2VkXSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoe3RhYkluZGV4Oi0xfSxsLHtyZWY6ZixvbktleURvd246Z30pKX0pO2Z1bmN0aW9uIGZPKGUse3NlbGVjdDp0PSExfT17fSl7Y29uc3Qgbj1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2Zvcihjb25zdCByIG9mIGUpaWYob28ocix7c2VsZWN0OnR9KSxkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09bilyZXR1cm59ZnVuY3Rpb24gaE8oZSl7Y29uc3QgdD1HUyhlKSxuPXMwKHQsZSkscj1zMCh0LnJldmVyc2UoKSxlKTtyZXR1cm5bbixyXX1mdW5jdGlvbiBHUyhlKXtjb25zdCB0PVtdLG49ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihlLE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULHthY2NlcHROb2RlOnI9Pntjb25zdCBvPXIudGFnTmFtZT09PSJJTlBVVCImJnIudHlwZT09PSJoaWRkZW4iO3JldHVybiByLmRpc2FibGVkfHxyLmhpZGRlbnx8bz9Ob2RlRmlsdGVyLkZJTFRFUl9TS0lQOnIudGFiSW5kZXg+PTA/Tm9kZUZpbHRlci5GSUxURVJfQUNDRVBUOk5vZGVGaWx0ZXIuRklMVEVSX1NLSVB9fSk7Zm9yKDtuLm5leHROb2RlKCk7KXQucHVzaChuLmN1cnJlbnROb2RlKTtyZXR1cm4gdH1mdW5jdGlvbiBzMChlLHQpe2Zvcihjb25zdCBuIG9mIGUpaWYoIXBPKG4se3VwVG86dH0pKXJldHVybiBufWZ1bmN0aW9uIHBPKGUse3VwVG86dH0pe2lmKGdldENvbXB1dGVkU3R5bGUoZSkudmlzaWJpbGl0eT09PSJoaWRkZW4iKXJldHVybiEwO2Zvcig7ZTspe2lmKHQhPT12b2lkIDAmJmU9PT10KXJldHVybiExO2lmKGdldENvbXB1dGVkU3R5bGUoZSkuZGlzcGxheT09PSJub25lIilyZXR1cm4hMDtlPWUucGFyZW50RWxlbWVudH1yZXR1cm4hMX1mdW5jdGlvbiBnTyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQmJiJzZWxlY3QiaW4gZX1mdW5jdGlvbiBvbyhlLHtzZWxlY3Q6dD0hMX09e30pe2lmKGUmJmUuZm9jdXMpe2NvbnN0IG49ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtlLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSksZSE9PW4mJmdPKGUpJiZ0JiZlLnNlbGVjdCgpfX1jb25zdCBhMD1tTygpO2Z1bmN0aW9uIG1PKCl7bGV0IGU9W107cmV0dXJue2FkZCh0KXtjb25zdCBuPWVbMF07dCE9PW4mJihuPT1udWxsfHxuLnBhdXNlKCkpLGU9dTAoZSx0KSxlLnVuc2hpZnQodCl9LHJlbW92ZSh0KXt2YXIgbjtlPXUwKGUsdCksKG49ZVswXSk9PT1udWxsfHxuPT09dm9pZCAwfHxuLnJlc3VtZSgpfX19ZnVuY3Rpb24gdTAoZSx0KXtjb25zdCBuPVsuLi5lXSxyPW4uaW5kZXhPZih0KTtyZXR1cm4gciE9PS0xJiZuLnNwbGljZShyLDEpLG59ZnVuY3Rpb24gdk8oZSl7cmV0dXJuIGUuZmlsdGVyKHQ9PnQudGFnTmFtZSE9PSJBIil9Y29uc3QgeU89dDFbInVzZUlkIi50b1N0cmluZygpXXx8KCgpPT57fSk7bGV0IHhPPTA7ZnVuY3Rpb24gd2QoZSl7Y29uc3RbdCxuXT1wLnVzZVN0YXRlKHlPKCkpO3JldHVybiAkbigoKT0+e2V8fG4ocj0+cj8/U3RyaW5nKHhPKyspKX0sW2VdKSxlfHwodD9gcmFkaXgtJHt0fWA6IiIpfWNvbnN0IF9PPVsidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0Il0sTW89TWF0aC5taW4seW49TWF0aC5tYXgsRGM9TWF0aC5yb3VuZCx5dT1NYXRoLmZsb29yLERvPWU9Pih7eDplLHk6ZX0pLHdPPXtsZWZ0OiJyaWdodCIscmlnaHQ6ImxlZnQiLGJvdHRvbToidG9wIix0b3A6ImJvdHRvbSJ9LFNPPXtzdGFydDoiZW5kIixlbmQ6InN0YXJ0In07ZnVuY3Rpb24geHAoZSx0LG4pe3JldHVybiB5bihlLE1vKHQsbikpfWZ1bmN0aW9uIEJyKGUsdCl7cmV0dXJuIHR5cGVvZiBlPT0iZnVuY3Rpb24iP2UodCk6ZX1mdW5jdGlvbiBXcihlKXtyZXR1cm4gZS5zcGxpdCgiLSIpWzBdfWZ1bmN0aW9uIFFsKGUpe3JldHVybiBlLnNwbGl0KCItIilbMV19ZnVuY3Rpb24geW0oZSl7cmV0dXJuIGU9PT0ieCI/InkiOiJ4In1mdW5jdGlvbiB4bShlKXtyZXR1cm4gZT09PSJ5Ij8iaGVpZ2h0Ijoid2lkdGgifWZ1bmN0aW9uIEpsKGUpe3JldHVyblsidG9wIiwiYm90dG9tIl0uaW5jbHVkZXMoV3IoZSkpPyJ5IjoieCJ9ZnVuY3Rpb24gX20oZSl7cmV0dXJuIHltKEpsKGUpKX1mdW5jdGlvbiBDTyhlLHQsbil7bj09PXZvaWQgMCYmKG49ITEpO2NvbnN0IHI9UWwoZSksbz1fbShlKSxpPXhtKG8pO2xldCBsPW89PT0ieCI/cj09PShuPyJlbmQiOiJzdGFydCIpPyJyaWdodCI6ImxlZnQiOnI9PT0ic3RhcnQiPyJib3R0b20iOiJ0b3AiO3JldHVybiB0LnJlZmVyZW5jZVtpXT50LmZsb2F0aW5nW2ldJiYobD1MYyhsKSksW2wsTGMobCldfWZ1bmN0aW9uIEVPKGUpe2NvbnN0IHQ9TGMoZSk7cmV0dXJuW19wKGUpLHQsX3AodCldfWZ1bmN0aW9uIF9wKGUpe3JldHVybiBlLnJlcGxhY2UoL3N0YXJ0fGVuZC9nLHQ9PlNPW3RdKX1mdW5jdGlvbiAkTyhlLHQsbil7Y29uc3Qgcj1bImxlZnQiLCJyaWdodCJdLG89WyJyaWdodCIsImxlZnQiXSxpPVsidG9wIiwiYm90dG9tIl0sbD1bImJvdHRvbSIsInRvcCJdO3N3aXRjaChlKXtjYXNlInRvcCI6Y2FzZSJib3R0b20iOnJldHVybiBuP3Q/bzpyOnQ/cjpvO2Nhc2UibGVmdCI6Y2FzZSJyaWdodCI6cmV0dXJuIHQ/aTpsO2RlZmF1bHQ6cmV0dXJuW119fWZ1bmN0aW9uIGtPKGUsdCxuLHIpe2NvbnN0IG89UWwoZSk7bGV0IGk9JE8oV3IoZSksbj09PSJzdGFydCIscik7cmV0dXJuIG8mJihpPWkubWFwKGw9PmwrIi0iK28pLHQmJihpPWkuY29uY2F0KGkubWFwKF9wKSkpKSxpfWZ1bmN0aW9uIExjKGUpe3JldHVybiBlLnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLHQ9PndPW3RdKX1mdW5jdGlvbiBUTyhlKXtyZXR1cm57dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjAsLi4uZX19ZnVuY3Rpb24gWVMoZSl7cmV0dXJuIHR5cGVvZiBlIT0ibnVtYmVyIj9UTyhlKTp7dG9wOmUscmlnaHQ6ZSxib3R0b206ZSxsZWZ0OmV9fWZ1bmN0aW9uIEljKGUpe3JldHVybnsuLi5lLHRvcDplLnksbGVmdDplLngscmlnaHQ6ZS54K2Uud2lkdGgsYm90dG9tOmUueStlLmhlaWdodH19ZnVuY3Rpb24gYzAoZSx0LG4pe2xldHtyZWZlcmVuY2U6cixmbG9hdGluZzpvfT1lO2NvbnN0IGk9SmwodCksbD1fbSh0KSxzPXhtKGwpLGE9V3IodCksdT1pPT09InkiLGM9ci54K3Iud2lkdGgvMi1vLndpZHRoLzIsZD1yLnkrci5oZWlnaHQvMi1vLmhlaWdodC8yLGY9cltzXS8yLW9bc10vMjtsZXQgaDtzd2l0Y2goYSl7Y2FzZSJ0b3AiOmg9e3g6Yyx5OnIueS1vLmhlaWdodH07YnJlYWs7Y2FzZSJib3R0b20iOmg9e3g6Yyx5OnIueStyLmhlaWdodH07YnJlYWs7Y2FzZSJyaWdodCI6aD17eDpyLngrci53aWR0aCx5OmR9O2JyZWFrO2Nhc2UibGVmdCI6aD17eDpyLngtby53aWR0aCx5OmR9O2JyZWFrO2RlZmF1bHQ6aD17eDpyLngseTpyLnl9fXN3aXRjaChRbCh0KSl7Y2FzZSJzdGFydCI6aFtsXS09ZioobiYmdT8tMToxKTticmVhaztjYXNlImVuZCI6aFtsXSs9ZioobiYmdT8tMToxKTticmVha31yZXR1cm4gaH1jb25zdCBOTz1hc3luYyhlLHQsbik9Pntjb25zdHtwbGFjZW1lbnQ6cj0iYm90dG9tIixzdHJhdGVneTpvPSJhYnNvbHV0ZSIsbWlkZGxld2FyZTppPVtdLHBsYXRmb3JtOmx9PW4scz1pLmZpbHRlcihCb29sZWFuKSxhPWF3YWl0KGwuaXNSVEw9PW51bGw/dm9pZCAwOmwuaXNSVEwodCkpO2xldCB1PWF3YWl0IGwuZ2V0RWxlbWVudFJlY3RzKHtyZWZlcmVuY2U6ZSxmbG9hdGluZzp0LHN0cmF0ZWd5Om99KSx7eDpjLHk6ZH09YzAodSxyLGEpLGY9cixoPXt9LGc9MDtmb3IobGV0IG09MDttPHMubGVuZ3RoO20rKyl7Y29uc3R7bmFtZTpTLGZuOnZ9PXNbbV0se3g6eSx5Ol8sZGF0YTp3LHJlc2V0OkN9PWF3YWl0IHYoe3g6Yyx5OmQsaW5pdGlhbFBsYWNlbWVudDpyLHBsYWNlbWVudDpmLHN0cmF0ZWd5Om8sbWlkZGxld2FyZURhdGE6aCxyZWN0czp1LHBsYXRmb3JtOmwsZWxlbWVudHM6e3JlZmVyZW5jZTplLGZsb2F0aW5nOnR9fSk7aWYoYz15Pz9jLGQ9Xz8/ZCxoPXsuLi5oLFtTXTp7Li4uaFtTXSwuLi53fX0sQyYmZzw9NTApe2crKyx0eXBlb2YgQz09Im9iamVjdCImJihDLnBsYWNlbWVudCYmKGY9Qy5wbGFjZW1lbnQpLEMucmVjdHMmJih1PUMucmVjdHM9PT0hMD9hd2FpdCBsLmdldEVsZW1lbnRSZWN0cyh7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dCxzdHJhdGVneTpvfSk6Qy5yZWN0cykse3g6Yyx5OmR9PWMwKHUsZixhKSksbT0tMTtjb250aW51ZX19cmV0dXJue3g6Yyx5OmQscGxhY2VtZW50OmYsc3RyYXRlZ3k6byxtaWRkbGV3YXJlRGF0YTpofX07YXN5bmMgZnVuY3Rpb24gX2EoZSx0KXt2YXIgbjt0PT09dm9pZCAwJiYodD17fSk7Y29uc3R7eDpyLHk6byxwbGF0Zm9ybTppLHJlY3RzOmwsZWxlbWVudHM6cyxzdHJhdGVneTphfT1lLHtib3VuZGFyeTp1PSJjbGlwcGluZ0FuY2VzdG9ycyIscm9vdEJvdW5kYXJ5OmM9InZpZXdwb3J0IixlbGVtZW50Q29udGV4dDpkPSJmbG9hdGluZyIsYWx0Qm91bmRhcnk6Zj0hMSxwYWRkaW5nOmg9MH09QnIodCxlKSxnPVlTKGgpLFM9c1tmP2Q9PT0iZmxvYXRpbmciPyJyZWZlcmVuY2UiOiJmbG9hdGluZyI6ZF0sdj1JYyhhd2FpdCBpLmdldENsaXBwaW5nUmVjdCh7ZWxlbWVudDoobj1hd2FpdChpLmlzRWxlbWVudD09bnVsbD92b2lkIDA6aS5pc0VsZW1lbnQoUykpKT09bnVsbHx8bj9TOlMuY29udGV4dEVsZW1lbnR8fGF3YWl0KGkuZ2V0RG9jdW1lbnRFbGVtZW50PT1udWxsP3ZvaWQgMDppLmdldERvY3VtZW50RWxlbWVudChzLmZsb2F0aW5nKSksYm91bmRhcnk6dSxyb290Qm91bmRhcnk6YyxzdHJhdGVneTphfSkpLHk9ZD09PSJmbG9hdGluZyI/ey4uLmwuZmxvYXRpbmcseDpyLHk6b306bC5yZWZlcmVuY2UsXz1hd2FpdChpLmdldE9mZnNldFBhcmVudD09bnVsbD92b2lkIDA6aS5nZXRPZmZzZXRQYXJlbnQocy5mbG9hdGluZykpLHc9YXdhaXQoaS5pc0VsZW1lbnQ9PW51bGw/dm9pZCAwOmkuaXNFbGVtZW50KF8pKT9hd2FpdChpLmdldFNjYWxlPT1udWxsP3ZvaWQgMDppLmdldFNjYWxlKF8pKXx8e3g6MSx5OjF9Ont4OjEseToxfSxDPUljKGkuY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3Q/YXdhaXQgaS5jb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdCh7cmVjdDp5LG9mZnNldFBhcmVudDpfLHN0cmF0ZWd5OmF9KTp5KTtyZXR1cm57dG9wOih2LnRvcC1DLnRvcCtnLnRvcCkvdy55LGJvdHRvbTooQy5ib3R0b20tdi5ib3R0b20rZy5ib3R0b20pL3cueSxsZWZ0Oih2LmxlZnQtQy5sZWZ0K2cubGVmdCkvdy54LHJpZ2h0OihDLnJpZ2h0LXYucmlnaHQrZy5yaWdodCkvdy54fX1jb25zdCBkMD1lPT4oe25hbWU6ImFycm93IixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7eDpuLHk6cixwbGFjZW1lbnQ6byxyZWN0czppLHBsYXRmb3JtOmwsZWxlbWVudHM6cyxtaWRkbGV3YXJlRGF0YTphfT10LHtlbGVtZW50OnUscGFkZGluZzpjPTB9PUJyKGUsdCl8fHt9O2lmKHU9PW51bGwpcmV0dXJue307Y29uc3QgZD1ZUyhjKSxmPXt4Om4seTpyfSxoPV9tKG8pLGc9eG0oaCksbT1hd2FpdCBsLmdldERpbWVuc2lvbnModSksUz1oPT09InkiLHY9Uz8idG9wIjoibGVmdCIseT1TPyJib3R0b20iOiJyaWdodCIsXz1TPyJjbGllbnRIZWlnaHQiOiJjbGllbnRXaWR0aCIsdz1pLnJlZmVyZW5jZVtnXStpLnJlZmVyZW5jZVtoXS1mW2hdLWkuZmxvYXRpbmdbZ10sQz1mW2hdLWkucmVmZXJlbmNlW2hdLCQ9YXdhaXQobC5nZXRPZmZzZXRQYXJlbnQ9PW51bGw/dm9pZCAwOmwuZ2V0T2Zmc2V0UGFyZW50KHUpKTtsZXQgRT0kPyRbX106MDsoIUV8fCFhd2FpdChsLmlzRWxlbWVudD09bnVsbD92b2lkIDA6bC5pc0VsZW1lbnQoJCkpKSYmKEU9cy5mbG9hdGluZ1tfXXx8aS5mbG9hdGluZ1tnXSk7Y29uc3QgVD13LzItQy8yLE09RS8yLW1bZ10vMi0xLFI9TW8oZFt2XSxNKSxqPU1vKGRbeV0sTSksRj1SLGFlPUUtbVtnXS1qLEg9RS8yLW1bZ10vMitULFg9eHAoRixILGFlKSxQPSFhLmFycm93JiZRbChvKSE9bnVsbCYmSCE9WCYmaS5yZWZlcmVuY2VbZ10vMi0oSDxGP1I6aiktbVtnXS8yPDAsTz1QP0g8Rj9ILUY6SC1hZTowO3JldHVybntbaF06ZltoXStPLGRhdGE6e1toXTpYLGNlbnRlck9mZnNldDpILVgtTywuLi5QJiZ7YWxpZ25tZW50T2Zmc2V0Ok99fSxyZXNldDpQfX19KSxiTz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJmbGlwIixvcHRpb25zOmUsYXN5bmMgZm4odCl7dmFyIG4scjtjb25zdHtwbGFjZW1lbnQ6byxtaWRkbGV3YXJlRGF0YTppLHJlY3RzOmwsaW5pdGlhbFBsYWNlbWVudDpzLHBsYXRmb3JtOmEsZWxlbWVudHM6dX09dCx7bWFpbkF4aXM6Yz0hMCxjcm9zc0F4aXM6ZD0hMCxmYWxsYmFja1BsYWNlbWVudHM6ZixmYWxsYmFja1N0cmF0ZWd5Omg9ImJlc3RGaXQiLGZhbGxiYWNrQXhpc1NpZGVEaXJlY3Rpb246Zz0ibm9uZSIsZmxpcEFsaWdubWVudDptPSEwLC4uLlN9PUJyKGUsdCk7aWYoKG49aS5hcnJvdykhPW51bGwmJm4uYWxpZ25tZW50T2Zmc2V0KXJldHVybnt9O2NvbnN0IHY9V3IobykseT1XcihzKT09PXMsXz1hd2FpdChhLmlzUlRMPT1udWxsP3ZvaWQgMDphLmlzUlRMKHUuZmxvYXRpbmcpKSx3PWZ8fCh5fHwhbT9bTGMocyldOkVPKHMpKTshZiYmZyE9PSJub25lIiYmdy5wdXNoKC4uLmtPKHMsbSxnLF8pKTtjb25zdCBDPVtzLC4uLnddLCQ9YXdhaXQgX2EodCxTKSxFPVtdO2xldCBUPSgocj1pLmZsaXApPT1udWxsP3ZvaWQgMDpyLm92ZXJmbG93cyl8fFtdO2lmKGMmJkUucHVzaCgkW3ZdKSxkKXtjb25zdCBGPUNPKG8sbCxfKTtFLnB1c2goJFtGWzBdXSwkW0ZbMV1dKX1pZihUPVsuLi5ULHtwbGFjZW1lbnQ6byxvdmVyZmxvd3M6RX1dLCFFLmV2ZXJ5KEY9PkY8PTApKXt2YXIgTSxSO2NvbnN0IEY9KCgoTT1pLmZsaXApPT1udWxsP3ZvaWQgMDpNLmluZGV4KXx8MCkrMSxhZT1DW0ZdO2lmKGFlKXJldHVybntkYXRhOntpbmRleDpGLG92ZXJmbG93czpUfSxyZXNldDp7cGxhY2VtZW50OmFlfX07bGV0IEg9KFI9VC5maWx0ZXIoWD0+WC5vdmVyZmxvd3NbMF08PTApLnNvcnQoKFgsUCk9Plgub3ZlcmZsb3dzWzFdLVAub3ZlcmZsb3dzWzFdKVswXSk9PW51bGw/dm9pZCAwOlIucGxhY2VtZW50O2lmKCFIKXN3aXRjaChoKXtjYXNlImJlc3RGaXQiOnt2YXIgajtjb25zdCBYPShqPVQubWFwKFA9PltQLnBsYWNlbWVudCxQLm92ZXJmbG93cy5maWx0ZXIoTz0+Tz4wKS5yZWR1Y2UoKE8sayk9Pk8raywwKV0pLnNvcnQoKFAsTyk9PlBbMV0tT1sxXSlbMF0pPT1udWxsP3ZvaWQgMDpqWzBdO1gmJihIPVgpO2JyZWFrfWNhc2UiaW5pdGlhbFBsYWNlbWVudCI6SD1zO2JyZWFrfWlmKG8hPT1IKXJldHVybntyZXNldDp7cGxhY2VtZW50Okh9fX1yZXR1cm57fX19fTtmdW5jdGlvbiBmMChlLHQpe3JldHVybnt0b3A6ZS50b3AtdC5oZWlnaHQscmlnaHQ6ZS5yaWdodC10LndpZHRoLGJvdHRvbTplLmJvdHRvbS10LmhlaWdodCxsZWZ0OmUubGVmdC10LndpZHRofX1mdW5jdGlvbiBoMChlKXtyZXR1cm4gX08uc29tZSh0PT5lW3RdPj0wKX1jb25zdCBSTz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJoaWRlIixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7cmVjdHM6bn09dCx7c3RyYXRlZ3k6cj0icmVmZXJlbmNlSGlkZGVuIiwuLi5vfT1CcihlLHQpO3N3aXRjaChyKXtjYXNlInJlZmVyZW5jZUhpZGRlbiI6e2NvbnN0IGk9YXdhaXQgX2EodCx7Li4ubyxlbGVtZW50Q29udGV4dDoicmVmZXJlbmNlIn0pLGw9ZjAoaSxuLnJlZmVyZW5jZSk7cmV0dXJue2RhdGE6e3JlZmVyZW5jZUhpZGRlbk9mZnNldHM6bCxyZWZlcmVuY2VIaWRkZW46aDAobCl9fX1jYXNlImVzY2FwZWQiOntjb25zdCBpPWF3YWl0IF9hKHQsey4uLm8sYWx0Qm91bmRhcnk6ITB9KSxsPWYwKGksbi5mbG9hdGluZyk7cmV0dXJue2RhdGE6e2VzY2FwZWRPZmZzZXRzOmwsZXNjYXBlZDpoMChsKX19fWRlZmF1bHQ6cmV0dXJue319fX19O2FzeW5jIGZ1bmN0aW9uIFBPKGUsdCl7Y29uc3R7cGxhY2VtZW50Om4scGxhdGZvcm06cixlbGVtZW50czpvfT1lLGk9YXdhaXQoci5pc1JUTD09bnVsbD92b2lkIDA6ci5pc1JUTChvLmZsb2F0aW5nKSksbD1XcihuKSxzPVFsKG4pLGE9Smwobik9PT0ieSIsdT1bImxlZnQiLCJ0b3AiXS5pbmNsdWRlcyhsKT8tMToxLGM9aSYmYT8tMToxLGQ9QnIodCxlKTtsZXR7bWFpbkF4aXM6Zixjcm9zc0F4aXM6aCxhbGlnbm1lbnRBeGlzOmd9PXR5cGVvZiBkPT0ibnVtYmVyIj97bWFpbkF4aXM6ZCxjcm9zc0F4aXM6MCxhbGlnbm1lbnRBeGlzOm51bGx9OnttYWluQXhpczowLGNyb3NzQXhpczowLGFsaWdubWVudEF4aXM6bnVsbCwuLi5kfTtyZXR1cm4gcyYmdHlwZW9mIGc9PSJudW1iZXIiJiYoaD1zPT09ImVuZCI/ZyotMTpnKSxhP3t4OmgqYyx5OmYqdX06e3g6Zip1LHk6aCpjfX1jb25zdCBPTz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9MCkse25hbWU6Im9mZnNldCIsb3B0aW9uczplLGFzeW5jIGZuKHQpe2NvbnN0e3g6bix5OnJ9PXQsbz1hd2FpdCBQTyh0LGUpO3JldHVybnt4Om4rby54LHk6citvLnksZGF0YTpvfX19fSxBTz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJzaGlmdCIsb3B0aW9uczplLGFzeW5jIGZuKHQpe2NvbnN0e3g6bix5OnIscGxhY2VtZW50Om99PXQse21haW5BeGlzOmk9ITAsY3Jvc3NBeGlzOmw9ITEsbGltaXRlcjpzPXtmbjpTPT57bGV0e3g6dix5fT1TO3JldHVybnt4OnYseX19fSwuLi5hfT1CcihlLHQpLHU9e3g6bix5OnJ9LGM9YXdhaXQgX2EodCxhKSxkPUpsKFdyKG8pKSxmPXltKGQpO2xldCBoPXVbZl0sZz11W2RdO2lmKGkpe2NvbnN0IFM9Zj09PSJ5Ij8idG9wIjoibGVmdCIsdj1mPT09InkiPyJib3R0b20iOiJyaWdodCIseT1oK2NbU10sXz1oLWNbdl07aD14cCh5LGgsXyl9aWYobCl7Y29uc3QgUz1kPT09InkiPyJ0b3AiOiJsZWZ0Iix2PWQ9PT0ieSI/ImJvdHRvbSI6InJpZ2h0Iix5PWcrY1tTXSxfPWctY1t2XTtnPXhwKHksZyxfKX1jb25zdCBtPXMuZm4oey4uLnQsW2ZdOmgsW2RdOmd9KTtyZXR1cm57Li4ubSxkYXRhOnt4Om0ueC1uLHk6bS55LXJ9fX19fSxNTz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtvcHRpb25zOmUsZm4odCl7Y29uc3R7eDpuLHk6cixwbGFjZW1lbnQ6byxyZWN0czppLG1pZGRsZXdhcmVEYXRhOmx9PXQse29mZnNldDpzPTAsbWFpbkF4aXM6YT0hMCxjcm9zc0F4aXM6dT0hMH09QnIoZSx0KSxjPXt4Om4seTpyfSxkPUpsKG8pLGY9eW0oZCk7bGV0IGg9Y1tmXSxnPWNbZF07Y29uc3QgbT1CcihzLHQpLFM9dHlwZW9mIG09PSJudW1iZXIiP3ttYWluQXhpczptLGNyb3NzQXhpczowfTp7bWFpbkF4aXM6MCxjcm9zc0F4aXM6MCwuLi5tfTtpZihhKXtjb25zdCBfPWY9PT0ieSI/ImhlaWdodCI6IndpZHRoIix3PWkucmVmZXJlbmNlW2ZdLWkuZmxvYXRpbmdbX10rUy5tYWluQXhpcyxDPWkucmVmZXJlbmNlW2ZdK2kucmVmZXJlbmNlW19dLVMubWFpbkF4aXM7aDx3P2g9dzpoPkMmJihoPUMpfWlmKHUpe3ZhciB2LHk7Y29uc3QgXz1mPT09InkiPyJ3aWR0aCI6ImhlaWdodCIsdz1bInRvcCIsImxlZnQiXS5pbmNsdWRlcyhXcihvKSksQz1pLnJlZmVyZW5jZVtkXS1pLmZsb2F0aW5nW19dKyh3JiYoKHY9bC5vZmZzZXQpPT1udWxsP3ZvaWQgMDp2W2RdKXx8MCkrKHc/MDpTLmNyb3NzQXhpcyksJD1pLnJlZmVyZW5jZVtkXStpLnJlZmVyZW5jZVtfXSsodz8wOigoeT1sLm9mZnNldCk9PW51bGw/dm9pZCAwOnlbZF0pfHwwKS0odz9TLmNyb3NzQXhpczowKTtnPEM/Zz1DOmc+JCYmKGc9JCl9cmV0dXJue1tmXTpoLFtkXTpnfX19fSxETz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJzaXplIixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7cGxhY2VtZW50Om4scmVjdHM6cixwbGF0Zm9ybTpvLGVsZW1lbnRzOml9PXQse2FwcGx5Omw9KCk9Pnt9LC4uLnN9PUJyKGUsdCksYT1hd2FpdCBfYSh0LHMpLHU9V3IobiksYz1RbChuKSxkPUpsKG4pPT09InkiLHt3aWR0aDpmLGhlaWdodDpofT1yLmZsb2F0aW5nO2xldCBnLG07dT09PSJ0b3AifHx1PT09ImJvdHRvbSI/KGc9dSxtPWM9PT0oYXdhaXQoby5pc1JUTD09bnVsbD92b2lkIDA6by5pc1JUTChpLmZsb2F0aW5nKSk/InN0YXJ0IjoiZW5kIik/ImxlZnQiOiJyaWdodCIpOihtPXUsZz1jPT09ImVuZCI/InRvcCI6ImJvdHRvbSIpO2NvbnN0IFM9aC1hW2ddLHY9Zi1hW21dLHk9IXQubWlkZGxld2FyZURhdGEuc2hpZnQ7bGV0IF89Uyx3PXY7aWYoZCl7Y29uc3QgJD1mLWEubGVmdC1hLnJpZ2h0O3c9Y3x8eT9Nbyh2LCQpOiR9ZWxzZXtjb25zdCAkPWgtYS50b3AtYS5ib3R0b207Xz1jfHx5P01vKFMsJCk6JH1pZih5JiYhYyl7Y29uc3QgJD15bihhLmxlZnQsMCksRT15bihhLnJpZ2h0LDApLFQ9eW4oYS50b3AsMCksTT15bihhLmJvdHRvbSwwKTtkP3c9Zi0yKigkIT09MHx8RSE9PTA/JCtFOnluKGEubGVmdCxhLnJpZ2h0KSk6Xz1oLTIqKFQhPT0wfHxNIT09MD9UK006eW4oYS50b3AsYS5ib3R0b20pKX1hd2FpdCBsKHsuLi50LGF2YWlsYWJsZVdpZHRoOncsYXZhaWxhYmxlSGVpZ2h0Ol99KTtjb25zdCBDPWF3YWl0IG8uZ2V0RGltZW5zaW9ucyhpLmZsb2F0aW5nKTtyZXR1cm4gZiE9PUMud2lkdGh8fGghPT1DLmhlaWdodD97cmVzZXQ6e3JlY3RzOiEwfX06e319fX07ZnVuY3Rpb24gTG8oZSl7cmV0dXJuIFhTKGUpPyhlLm5vZGVOYW1lfHwiIikudG9Mb3dlckNhc2UoKToiI2RvY3VtZW50In1mdW5jdGlvbiBDbihlKXt2YXIgdDtyZXR1cm4oZT09bnVsbHx8KHQ9ZS5vd25lckRvY3VtZW50KT09bnVsbD92b2lkIDA6dC5kZWZhdWx0Vmlldyl8fHdpbmRvd31mdW5jdGlvbiBRcihlKXt2YXIgdDtyZXR1cm4odD0oWFMoZSk/ZS5vd25lckRvY3VtZW50OmUuZG9jdW1lbnQpfHx3aW5kb3cuZG9jdW1lbnQpPT1udWxsP3ZvaWQgMDp0LmRvY3VtZW50RWxlbWVudH1mdW5jdGlvbiBYUyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIE5vZGV8fGUgaW5zdGFuY2VvZiBDbihlKS5Ob2RlfWZ1bmN0aW9uIFVyKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRWxlbWVudHx8ZSBpbnN0YW5jZW9mIENuKGUpLkVsZW1lbnR9ZnVuY3Rpb24geHIoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudHx8ZSBpbnN0YW5jZW9mIENuKGUpLkhUTUxFbGVtZW50fWZ1bmN0aW9uIHAwKGUpe3JldHVybiB0eXBlb2YgU2hhZG93Um9vdD4idSI/ITE6ZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3R8fGUgaW5zdGFuY2VvZiBDbihlKS5TaGFkb3dSb290fWZ1bmN0aW9uIHphKGUpe2NvbnN0e292ZXJmbG93OnQsb3ZlcmZsb3dYOm4sb3ZlcmZsb3dZOnIsZGlzcGxheTpvfT1CbihlKTtyZXR1cm4vYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW58Y2xpcC8udGVzdCh0K3IrbikmJiFbImlubGluZSIsImNvbnRlbnRzIl0uaW5jbHVkZXMobyl9ZnVuY3Rpb24gTE8oZSl7cmV0dXJuWyJ0YWJsZSIsInRkIiwidGgiXS5pbmNsdWRlcyhMbyhlKSl9ZnVuY3Rpb24gd20oZSl7Y29uc3QgdD1TbSgpLG49Qm4oZSk7cmV0dXJuIG4udHJhbnNmb3JtIT09Im5vbmUifHxuLnBlcnNwZWN0aXZlIT09Im5vbmUifHwobi5jb250YWluZXJUeXBlP24uY29udGFpbmVyVHlwZSE9PSJub3JtYWwiOiExKXx8IXQmJihuLmJhY2tkcm9wRmlsdGVyP24uYmFja2Ryb3BGaWx0ZXIhPT0ibm9uZSI6ITEpfHwhdCYmKG4uZmlsdGVyP24uZmlsdGVyIT09Im5vbmUiOiExKXx8WyJ0cmFuc2Zvcm0iLCJwZXJzcGVjdGl2ZSIsImZpbHRlciJdLnNvbWUocj0+KG4ud2lsbENoYW5nZXx8IiIpLmluY2x1ZGVzKHIpKXx8WyJwYWludCIsImxheW91dCIsInN0cmljdCIsImNvbnRlbnQiXS5zb21lKHI9PihuLmNvbnRhaW58fCIiKS5pbmNsdWRlcyhyKSl9ZnVuY3Rpb24gSU8oZSl7bGV0IHQ9UmwoZSk7Zm9yKDt4cih0KSYmIVNkKHQpOyl7aWYod20odCkpcmV0dXJuIHQ7dD1SbCh0KX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBTbSgpe3JldHVybiB0eXBlb2YgQ1NTPiJ1Inx8IUNTUy5zdXBwb3J0cz8hMTpDU1Muc3VwcG9ydHMoIi13ZWJraXQtYmFja2Ryb3AtZmlsdGVyIiwibm9uZSIpfWZ1bmN0aW9uIFNkKGUpe3JldHVyblsiaHRtbCIsImJvZHkiLCIjZG9jdW1lbnQiXS5pbmNsdWRlcyhMbyhlKSl9ZnVuY3Rpb24gQm4oZSl7cmV0dXJuIENuKGUpLmdldENvbXB1dGVkU3R5bGUoZSl9ZnVuY3Rpb24gQ2QoZSl7cmV0dXJuIFVyKGUpP3tzY3JvbGxMZWZ0OmUuc2Nyb2xsTGVmdCxzY3JvbGxUb3A6ZS5zY3JvbGxUb3B9OntzY3JvbGxMZWZ0OmUucGFnZVhPZmZzZXQsc2Nyb2xsVG9wOmUucGFnZVlPZmZzZXR9fWZ1bmN0aW9uIFJsKGUpe2lmKExvKGUpPT09Imh0bWwiKXJldHVybiBlO2NvbnN0IHQ9ZS5hc3NpZ25lZFNsb3R8fGUucGFyZW50Tm9kZXx8cDAoZSkmJmUuaG9zdHx8UXIoZSk7cmV0dXJuIHAwKHQpP3QuaG9zdDp0fWZ1bmN0aW9uIFFTKGUpe2NvbnN0IHQ9UmwoZSk7cmV0dXJuIFNkKHQpP2Uub3duZXJEb2N1bWVudD9lLm93bmVyRG9jdW1lbnQuYm9keTplLmJvZHk6eHIodCkmJnphKHQpP3Q6UVModCl9ZnVuY3Rpb24gd2EoZSx0LG4pe3ZhciByO3Q9PT12b2lkIDAmJih0PVtdKSxuPT09dm9pZCAwJiYobj0hMCk7Y29uc3Qgbz1RUyhlKSxpPW89PT0oKHI9ZS5vd25lckRvY3VtZW50KT09bnVsbD92b2lkIDA6ci5ib2R5KSxsPUNuKG8pO3JldHVybiBpP3QuY29uY2F0KGwsbC52aXN1YWxWaWV3cG9ydHx8W10semEobyk/bzpbXSxsLmZyYW1lRWxlbWVudCYmbj93YShsLmZyYW1lRWxlbWVudCk6W10pOnQuY29uY2F0KG8sd2EobyxbXSxuKSl9ZnVuY3Rpb24gSlMoZSl7Y29uc3QgdD1CbihlKTtsZXQgbj1wYXJzZUZsb2F0KHQud2lkdGgpfHwwLHI9cGFyc2VGbG9hdCh0LmhlaWdodCl8fDA7Y29uc3Qgbz14cihlKSxpPW8/ZS5vZmZzZXRXaWR0aDpuLGw9bz9lLm9mZnNldEhlaWdodDpyLHM9RGMobikhPT1pfHxEYyhyKSE9PWw7cmV0dXJuIHMmJihuPWkscj1sKSx7d2lkdGg6bixoZWlnaHQ6ciwkOnN9fWZ1bmN0aW9uIENtKGUpe3JldHVybiBVcihlKT9lOmUuY29udGV4dEVsZW1lbnR9ZnVuY3Rpb24gZ2woZSl7Y29uc3QgdD1DbShlKTtpZigheHIodCkpcmV0dXJuIERvKDEpO2NvbnN0IG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7d2lkdGg6cixoZWlnaHQ6bywkOml9PUpTKHQpO2xldCBsPShpP0RjKG4ud2lkdGgpOm4ud2lkdGgpL3Iscz0oaT9EYyhuLmhlaWdodCk6bi5oZWlnaHQpL287cmV0dXJuKCFsfHwhTnVtYmVyLmlzRmluaXRlKGwpKSYmKGw9MSksKCFzfHwhTnVtYmVyLmlzRmluaXRlKHMpKSYmKHM9MSkse3g6bCx5OnN9fWNvbnN0IGpPPURvKDApO2Z1bmN0aW9uIFpTKGUpe2NvbnN0IHQ9Q24oZSk7cmV0dXJuIVNtKCl8fCF0LnZpc3VhbFZpZXdwb3J0P2pPOnt4OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdCx5OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wfX1mdW5jdGlvbiB6TyhlLHQsbil7cmV0dXJuIHQ9PT12b2lkIDAmJih0PSExKSwhbnx8dCYmbiE9PUNuKGUpPyExOnR9ZnVuY3Rpb24gdmkoZSx0LG4scil7dD09PXZvaWQgMCYmKHQ9ITEpLG49PT12b2lkIDAmJihuPSExKTtjb25zdCBvPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksaT1DbShlKTtsZXQgbD1EbygxKTt0JiYocj9VcihyKSYmKGw9Z2wocikpOmw9Z2woZSkpO2NvbnN0IHM9ek8oaSxuLHIpP1pTKGkpOkRvKDApO2xldCBhPShvLmxlZnQrcy54KS9sLngsdT0oby50b3Arcy55KS9sLnksYz1vLndpZHRoL2wueCxkPW8uaGVpZ2h0L2wueTtpZihpKXtjb25zdCBmPUNuKGkpLGg9ciYmVXIocik/Q24ocik6cjtsZXQgZz1mLmZyYW1lRWxlbWVudDtmb3IoO2cmJnImJmghPT1mOyl7Y29uc3QgbT1nbChnKSxTPWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdj1CbihnKSx5PVMubGVmdCsoZy5jbGllbnRMZWZ0K3BhcnNlRmxvYXQodi5wYWRkaW5nTGVmdCkpKm0ueCxfPVMudG9wKyhnLmNsaWVudFRvcCtwYXJzZUZsb2F0KHYucGFkZGluZ1RvcCkpKm0ueTthKj1tLngsdSo9bS55LGMqPW0ueCxkKj1tLnksYSs9eSx1Kz1fLGc9Q24oZykuZnJhbWVFbGVtZW50fX1yZXR1cm4gSWMoe3dpZHRoOmMsaGVpZ2h0OmQseDphLHk6dX0pfWZ1bmN0aW9uIEZPKGUpe2xldHtyZWN0OnQsb2Zmc2V0UGFyZW50Om4sc3RyYXRlZ3k6cn09ZTtjb25zdCBvPXhyKG4pLGk9UXIobik7aWYobj09PWkpcmV0dXJuIHQ7bGV0IGw9e3Njcm9sbExlZnQ6MCxzY3JvbGxUb3A6MH0scz1EbygxKTtjb25zdCBhPURvKDApO2lmKChvfHwhbyYmciE9PSJmaXhlZCIpJiYoKExvKG4pIT09ImJvZHkifHx6YShpKSkmJihsPUNkKG4pKSx4cihuKSkpe2NvbnN0IHU9dmkobik7cz1nbChuKSxhLng9dS54K24uY2xpZW50TGVmdCxhLnk9dS55K24uY2xpZW50VG9wfXJldHVybnt3aWR0aDp0LndpZHRoKnMueCxoZWlnaHQ6dC5oZWlnaHQqcy55LHg6dC54KnMueC1sLnNjcm9sbExlZnQqcy54K2EueCx5OnQueSpzLnktbC5zY3JvbGxUb3Aqcy55K2EueX19ZnVuY3Rpb24gQk8oZSl7cmV0dXJuIEFycmF5LmZyb20oZS5nZXRDbGllbnRSZWN0cygpKX1mdW5jdGlvbiBxUyhlKXtyZXR1cm4gdmkoUXIoZSkpLmxlZnQrQ2QoZSkuc2Nyb2xsTGVmdH1mdW5jdGlvbiBXTyhlKXtjb25zdCB0PVFyKGUpLG49Q2QoZSkscj1lLm93bmVyRG9jdW1lbnQuYm9keSxvPXluKHQuc2Nyb2xsV2lkdGgsdC5jbGllbnRXaWR0aCxyLnNjcm9sbFdpZHRoLHIuY2xpZW50V2lkdGgpLGk9eW4odC5zY3JvbGxIZWlnaHQsdC5jbGllbnRIZWlnaHQsci5zY3JvbGxIZWlnaHQsci5jbGllbnRIZWlnaHQpO2xldCBsPS1uLnNjcm9sbExlZnQrcVMoZSk7Y29uc3Qgcz0tbi5zY3JvbGxUb3A7cmV0dXJuIEJuKHIpLmRpcmVjdGlvbj09PSJydGwiJiYobCs9eW4odC5jbGllbnRXaWR0aCxyLmNsaWVudFdpZHRoKS1vKSx7d2lkdGg6byxoZWlnaHQ6aSx4OmwseTpzfX1mdW5jdGlvbiBVTyhlLHQpe2NvbnN0IG49Q24oZSkscj1RcihlKSxvPW4udmlzdWFsVmlld3BvcnQ7bGV0IGk9ci5jbGllbnRXaWR0aCxsPXIuY2xpZW50SGVpZ2h0LHM9MCxhPTA7aWYobyl7aT1vLndpZHRoLGw9by5oZWlnaHQ7Y29uc3QgdT1TbSgpOyghdXx8dSYmdD09PSJmaXhlZCIpJiYocz1vLm9mZnNldExlZnQsYT1vLm9mZnNldFRvcCl9cmV0dXJue3dpZHRoOmksaGVpZ2h0OmwseDpzLHk6YX19ZnVuY3Rpb24gVk8oZSx0KXtjb25zdCBuPXZpKGUsITAsdD09PSJmaXhlZCIpLHI9bi50b3ArZS5jbGllbnRUb3Asbz1uLmxlZnQrZS5jbGllbnRMZWZ0LGk9eHIoZSk/Z2woZSk6RG8oMSksbD1lLmNsaWVudFdpZHRoKmkueCxzPWUuY2xpZW50SGVpZ2h0KmkueSxhPW8qaS54LHU9cippLnk7cmV0dXJue3dpZHRoOmwsaGVpZ2h0OnMseDphLHk6dX19ZnVuY3Rpb24gZzAoZSx0LG4pe2xldCByO2lmKHQ9PT0idmlld3BvcnQiKXI9VU8oZSxuKTtlbHNlIGlmKHQ9PT0iZG9jdW1lbnQiKXI9V08oUXIoZSkpO2Vsc2UgaWYoVXIodCkpcj1WTyh0LG4pO2Vsc2V7Y29uc3Qgbz1aUyhlKTtyPXsuLi50LHg6dC54LW8ueCx5OnQueS1vLnl9fXJldHVybiBJYyhyKX1mdW5jdGlvbiBlQyhlLHQpe2NvbnN0IG49UmwoZSk7cmV0dXJuIG49PT10fHwhVXIobil8fFNkKG4pPyExOkJuKG4pLnBvc2l0aW9uPT09ImZpeGVkInx8ZUMobix0KX1mdW5jdGlvbiBITyhlLHQpe2NvbnN0IG49dC5nZXQoZSk7aWYobilyZXR1cm4gbjtsZXQgcj13YShlLFtdLCExKS5maWx0ZXIocz0+VXIocykmJkxvKHMpIT09ImJvZHkiKSxvPW51bGw7Y29uc3QgaT1CbihlKS5wb3NpdGlvbj09PSJmaXhlZCI7bGV0IGw9aT9SbChlKTplO2Zvcig7VXIobCkmJiFTZChsKTspe2NvbnN0IHM9Qm4obCksYT13bShsKTshYSYmcy5wb3NpdGlvbj09PSJmaXhlZCImJihvPW51bGwpLChpPyFhJiYhbzohYSYmcy5wb3NpdGlvbj09PSJzdGF0aWMiJiYhIW8mJlsiYWJzb2x1dGUiLCJmaXhlZCJdLmluY2x1ZGVzKG8ucG9zaXRpb24pfHx6YShsKSYmIWEmJmVDKGUsbCkpP3I9ci5maWx0ZXIoYz0+YyE9PWwpOm89cyxsPVJsKGwpfXJldHVybiB0LnNldChlLHIpLHJ9ZnVuY3Rpb24gS08oZSl7bGV0e2VsZW1lbnQ6dCxib3VuZGFyeTpuLHJvb3RCb3VuZGFyeTpyLHN0cmF0ZWd5Om99PWU7Y29uc3QgbD1bLi4ubj09PSJjbGlwcGluZ0FuY2VzdG9ycyI/SE8odCx0aGlzLl9jKTpbXS5jb25jYXQobikscl0scz1sWzBdLGE9bC5yZWR1Y2UoKHUsYyk9Pntjb25zdCBkPWcwKHQsYyxvKTtyZXR1cm4gdS50b3A9eW4oZC50b3AsdS50b3ApLHUucmlnaHQ9TW8oZC5yaWdodCx1LnJpZ2h0KSx1LmJvdHRvbT1NbyhkLmJvdHRvbSx1LmJvdHRvbSksdS5sZWZ0PXluKGQubGVmdCx1LmxlZnQpLHV9LGcwKHQscyxvKSk7cmV0dXJue3dpZHRoOmEucmlnaHQtYS5sZWZ0LGhlaWdodDphLmJvdHRvbS1hLnRvcCx4OmEubGVmdCx5OmEudG9wfX1mdW5jdGlvbiBHTyhlKXtyZXR1cm4gSlMoZSl9ZnVuY3Rpb24gWU8oZSx0LG4pe2NvbnN0IHI9eHIodCksbz1Rcih0KSxpPW49PT0iZml4ZWQiLGw9dmkoZSwhMCxpLHQpO2xldCBzPXtzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjB9O2NvbnN0IGE9RG8oMCk7aWYocnx8IXImJiFpKWlmKChMbyh0KSE9PSJib2R5Inx8emEobykpJiYocz1DZCh0KSkscil7Y29uc3QgdT12aSh0LCEwLGksdCk7YS54PXUueCt0LmNsaWVudExlZnQsYS55PXUueSt0LmNsaWVudFRvcH1lbHNlIG8mJihhLng9cVMobykpO3JldHVybnt4OmwubGVmdCtzLnNjcm9sbExlZnQtYS54LHk6bC50b3Arcy5zY3JvbGxUb3AtYS55LHdpZHRoOmwud2lkdGgsaGVpZ2h0OmwuaGVpZ2h0fX1mdW5jdGlvbiBtMChlLHQpe3JldHVybiF4cihlKXx8Qm4oZSkucG9zaXRpb249PT0iZml4ZWQiP251bGw6dD90KGUpOmUub2Zmc2V0UGFyZW50fWZ1bmN0aW9uIHRDKGUsdCl7Y29uc3Qgbj1DbihlKTtpZigheHIoZSkpcmV0dXJuIG47bGV0IHI9bTAoZSx0KTtmb3IoO3ImJkxPKHIpJiZCbihyKS5wb3NpdGlvbj09PSJzdGF0aWMiOylyPW0wKHIsdCk7cmV0dXJuIHImJihMbyhyKT09PSJodG1sInx8TG8ocik9PT0iYm9keSImJkJuKHIpLnBvc2l0aW9uPT09InN0YXRpYyImJiF3bShyKSk/bjpyfHxJTyhlKXx8bn1jb25zdCBYTz1hc3luYyBmdW5jdGlvbihlKXtsZXR7cmVmZXJlbmNlOnQsZmxvYXRpbmc6bixzdHJhdGVneTpyfT1lO2NvbnN0IG89dGhpcy5nZXRPZmZzZXRQYXJlbnR8fHRDLGk9dGhpcy5nZXREaW1lbnNpb25zO3JldHVybntyZWZlcmVuY2U6WU8odCxhd2FpdCBvKG4pLHIpLGZsb2F0aW5nOnt4OjAseTowLC4uLmF3YWl0IGkobil9fX07ZnVuY3Rpb24gUU8oZSl7cmV0dXJuIEJuKGUpLmRpcmVjdGlvbj09PSJydGwifWNvbnN0IEpPPXtjb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdDpGTyxnZXREb2N1bWVudEVsZW1lbnQ6UXIsZ2V0Q2xpcHBpbmdSZWN0OktPLGdldE9mZnNldFBhcmVudDp0QyxnZXRFbGVtZW50UmVjdHM6WE8sZ2V0Q2xpZW50UmVjdHM6Qk8sZ2V0RGltZW5zaW9uczpHTyxnZXRTY2FsZTpnbCxpc0VsZW1lbnQ6VXIsaXNSVEw6UU99O2Z1bmN0aW9uIFpPKGUsdCl7bGV0IG49bnVsbCxyO2NvbnN0IG89UXIoZSk7ZnVuY3Rpb24gaSgpe2NsZWFyVGltZW91dChyKSxuJiZuLmRpc2Nvbm5lY3QoKSxuPW51bGx9ZnVuY3Rpb24gbChzLGEpe3M9PT12b2lkIDAmJihzPSExKSxhPT09dm9pZCAwJiYoYT0xKSxpKCk7Y29uc3R7bGVmdDp1LHRvcDpjLHdpZHRoOmQsaGVpZ2h0OmZ9PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoc3x8dCgpLCFkfHwhZilyZXR1cm47Y29uc3QgaD15dShjKSxnPXl1KG8uY2xpZW50V2lkdGgtKHUrZCkpLG09eXUoby5jbGllbnRIZWlnaHQtKGMrZikpLFM9eXUodSkseT17cm9vdE1hcmdpbjotaCsicHggIistZysicHggIistbSsicHggIistUysicHgiLHRocmVzaG9sZDp5bigwLE1vKDEsYSkpfHwxfTtsZXQgXz0hMDtmdW5jdGlvbiB3KEMpe2NvbnN0ICQ9Q1swXS5pbnRlcnNlY3Rpb25SYXRpbztpZigkIT09YSl7aWYoIV8pcmV0dXJuIGwoKTskP2woITEsJCk6cj1zZXRUaW1lb3V0KCgpPT57bCghMSwxZS03KX0sMTAwKX1fPSExfXRyeXtuPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcih3LHsuLi55LHJvb3Q6by5vd25lckRvY3VtZW50fSl9Y2F0Y2h7bj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIodyx5KX1uLm9ic2VydmUoZSl9cmV0dXJuIGwoITApLGl9ZnVuY3Rpb24gcU8oZSx0LG4scil7cj09PXZvaWQgMCYmKHI9e30pO2NvbnN0e2FuY2VzdG9yU2Nyb2xsOm89ITAsYW5jZXN0b3JSZXNpemU6aT0hMCxlbGVtZW50UmVzaXplOmw9dHlwZW9mIFJlc2l6ZU9ic2VydmVyPT0iZnVuY3Rpb24iLGxheW91dFNoaWZ0OnM9dHlwZW9mIEludGVyc2VjdGlvbk9ic2VydmVyPT0iZnVuY3Rpb24iLGFuaW1hdGlvbkZyYW1lOmE9ITF9PXIsdT1DbShlKSxjPW98fGk/Wy4uLnU/d2EodSk6W10sLi4ud2EodCldOltdO2MuZm9yRWFjaCh2PT57byYmdi5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4se3Bhc3NpdmU6ITB9KSxpJiZ2LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsbil9KTtjb25zdCBkPXUmJnM/Wk8odSxuKTpudWxsO2xldCBmPS0xLGg9bnVsbDtsJiYoaD1uZXcgUmVzaXplT2JzZXJ2ZXIodj0+e2xldFt5XT12O3kmJnkudGFyZ2V0PT09dSYmaCYmKGgudW5vYnNlcnZlKHQpLGNhbmNlbEFuaW1hdGlvbkZyYW1lKGYpLGY9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57aCYmaC5vYnNlcnZlKHQpfSkpLG4oKX0pLHUmJiFhJiZoLm9ic2VydmUodSksaC5vYnNlcnZlKHQpKTtsZXQgZyxtPWE/dmkoZSk6bnVsbDthJiZTKCk7ZnVuY3Rpb24gUygpe2NvbnN0IHY9dmkoZSk7bSYmKHYueCE9PW0ueHx8di55IT09bS55fHx2LndpZHRoIT09bS53aWR0aHx8di5oZWlnaHQhPT1tLmhlaWdodCkmJm4oKSxtPXYsZz1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoUyl9cmV0dXJuIG4oKSwoKT0+e2MuZm9yRWFjaCh2PT57byYmdi5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4pLGkmJnYucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixuKX0pLGQmJmQoKSxoJiZoLmRpc2Nvbm5lY3QoKSxoPW51bGwsYSYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoZyl9fWNvbnN0IGU1PShlLHQsbik9Pntjb25zdCByPW5ldyBNYXAsbz17cGxhdGZvcm06Sk8sLi4ubn0saT17Li4uby5wbGF0Zm9ybSxfYzpyfTtyZXR1cm4gTk8oZSx0LHsuLi5vLHBsYXRmb3JtOml9KX0sdDU9ZT0+e2Z1bmN0aW9uIHQobil7cmV0dXJue30uaGFzT3duUHJvcGVydHkuY2FsbChuLCJjdXJyZW50Iil9cmV0dXJue25hbWU6ImFycm93IixvcHRpb25zOmUsZm4obil7Y29uc3R7ZWxlbWVudDpyLHBhZGRpbmc6b309dHlwZW9mIGU9PSJmdW5jdGlvbiI/ZShuKTplO3JldHVybiByJiZ0KHIpP3IuY3VycmVudCE9bnVsbD9kMCh7ZWxlbWVudDpyLmN1cnJlbnQscGFkZGluZzpvfSkuZm4obik6e306cj9kMCh7ZWxlbWVudDpyLHBhZGRpbmc6b30pLmZuKG4pOnt9fX19O3ZhciBCdT10eXBlb2YgZG9jdW1lbnQ8InUiP3AudXNlTGF5b3V0RWZmZWN0OnAudXNlRWZmZWN0O2Z1bmN0aW9uIGpjKGUsdCl7aWYoZT09PXQpcmV0dXJuITA7aWYodHlwZW9mIGUhPXR5cGVvZiB0KXJldHVybiExO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iJiZlLnRvU3RyaW5nKCk9PT10LnRvU3RyaW5nKCkpcmV0dXJuITA7bGV0IG4scixvO2lmKGUmJnQmJnR5cGVvZiBlPT0ib2JqZWN0Iil7aWYoQXJyYXkuaXNBcnJheShlKSl7aWYobj1lLmxlbmd0aCxuIT10Lmxlbmd0aClyZXR1cm4hMTtmb3Iocj1uO3ItLSE9PTA7KWlmKCFqYyhlW3JdLHRbcl0pKXJldHVybiExO3JldHVybiEwfWlmKG89T2JqZWN0LmtleXMoZSksbj1vLmxlbmd0aCxuIT09T2JqZWN0LmtleXModCkubGVuZ3RoKXJldHVybiExO2ZvcihyPW47ci0tIT09MDspaWYoIXt9Lmhhc093blByb3BlcnR5LmNhbGwodCxvW3JdKSlyZXR1cm4hMTtmb3Iocj1uO3ItLSE9PTA7KXtjb25zdCBpPW9bcl07aWYoIShpPT09Il9vd25lciImJmUuJCR0eXBlb2YpJiYhamMoZVtpXSx0W2ldKSlyZXR1cm4hMX1yZXR1cm4hMH1yZXR1cm4gZSE9PWUmJnQhPT10fWZ1bmN0aW9uIG5DKGUpe3JldHVybiB0eXBlb2Ygd2luZG93PiJ1Ij8xOihlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZGV2aWNlUGl4ZWxSYXRpb3x8MX1mdW5jdGlvbiB2MChlLHQpe2NvbnN0IG49bkMoZSk7cmV0dXJuIE1hdGgucm91bmQodCpuKS9ufWZ1bmN0aW9uIHkwKGUpe2NvbnN0IHQ9cC51c2VSZWYoZSk7cmV0dXJuIEJ1KCgpPT57dC5jdXJyZW50PWV9KSx0fWZ1bmN0aW9uIG41KGUpe2U9PT12b2lkIDAmJihlPXt9KTtjb25zdHtwbGFjZW1lbnQ6dD0iYm90dG9tIixzdHJhdGVneTpuPSJhYnNvbHV0ZSIsbWlkZGxld2FyZTpyPVtdLHBsYXRmb3JtOm8sZWxlbWVudHM6e3JlZmVyZW5jZTppLGZsb2F0aW5nOmx9PXt9LHRyYW5zZm9ybTpzPSEwLHdoaWxlRWxlbWVudHNNb3VudGVkOmEsb3Blbjp1fT1lLFtjLGRdPXAudXNlU3RhdGUoe3g6MCx5OjAsc3RyYXRlZ3k6bixwbGFjZW1lbnQ6dCxtaWRkbGV3YXJlRGF0YTp7fSxpc1Bvc2l0aW9uZWQ6ITF9KSxbZixoXT1wLnVzZVN0YXRlKHIpO2pjKGYscil8fGgocik7Y29uc3RbZyxtXT1wLnVzZVN0YXRlKG51bGwpLFtTLHZdPXAudXNlU3RhdGUobnVsbCkseT1wLnVzZUNhbGxiYWNrKFA9PntQIT0kLmN1cnJlbnQmJigkLmN1cnJlbnQ9UCxtKFApKX0sW21dKSxfPXAudXNlQ2FsbGJhY2soUD0+e1AhPT1FLmN1cnJlbnQmJihFLmN1cnJlbnQ9UCx2KFApKX0sW3ZdKSx3PWl8fGcsQz1sfHxTLCQ9cC51c2VSZWYobnVsbCksRT1wLnVzZVJlZihudWxsKSxUPXAudXNlUmVmKGMpLE09eTAoYSksUj15MChvKSxqPXAudXNlQ2FsbGJhY2soKCk9PntpZighJC5jdXJyZW50fHwhRS5jdXJyZW50KXJldHVybjtjb25zdCBQPXtwbGFjZW1lbnQ6dCxzdHJhdGVneTpuLG1pZGRsZXdhcmU6Zn07Ui5jdXJyZW50JiYoUC5wbGF0Zm9ybT1SLmN1cnJlbnQpLGU1KCQuY3VycmVudCxFLmN1cnJlbnQsUCkudGhlbihPPT57Y29uc3Qgaz17Li4uTyxpc1Bvc2l0aW9uZWQ6ITB9O0YuY3VycmVudCYmIWpjKFQuY3VycmVudCxrKSYmKFQuY3VycmVudD1rLEhyLmZsdXNoU3luYygoKT0+e2Qoayl9KSl9KX0sW2YsdCxuLFJdKTtCdSgoKT0+e3U9PT0hMSYmVC5jdXJyZW50LmlzUG9zaXRpb25lZCYmKFQuY3VycmVudC5pc1Bvc2l0aW9uZWQ9ITEsZChQPT4oey4uLlAsaXNQb3NpdGlvbmVkOiExfSkpKX0sW3VdKTtjb25zdCBGPXAudXNlUmVmKCExKTtCdSgoKT0+KEYuY3VycmVudD0hMCwoKT0+e0YuY3VycmVudD0hMX0pLFtdKSxCdSgoKT0+e2lmKHcmJigkLmN1cnJlbnQ9dyksQyYmKEUuY3VycmVudD1DKSx3JiZDKXtpZihNLmN1cnJlbnQpcmV0dXJuIE0uY3VycmVudCh3LEMsaik7aigpfX0sW3csQyxqLE1dKTtjb25zdCBhZT1wLnVzZU1lbW8oKCk9Pih7cmVmZXJlbmNlOiQsZmxvYXRpbmc6RSxzZXRSZWZlcmVuY2U6eSxzZXRGbG9hdGluZzpffSksW3ksX10pLEg9cC51c2VNZW1vKCgpPT4oe3JlZmVyZW5jZTp3LGZsb2F0aW5nOkN9KSxbdyxDXSksWD1wLnVzZU1lbW8oKCk9Pntjb25zdCBQPXtwb3NpdGlvbjpuLGxlZnQ6MCx0b3A6MH07aWYoIUguZmxvYXRpbmcpcmV0dXJuIFA7Y29uc3QgTz12MChILmZsb2F0aW5nLGMueCksaz12MChILmZsb2F0aW5nLGMueSk7cmV0dXJuIHM/ey4uLlAsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoIitPKyJweCwgIitrKyJweCkiLC4uLm5DKEguZmxvYXRpbmcpPj0xLjUmJnt3aWxsQ2hhbmdlOiJ0cmFuc2Zvcm0ifX06e3Bvc2l0aW9uOm4sbGVmdDpPLHRvcDprfX0sW24scyxILmZsb2F0aW5nLGMueCxjLnldKTtyZXR1cm4gcC51c2VNZW1vKCgpPT4oey4uLmMsdXBkYXRlOmoscmVmczphZSxlbGVtZW50czpILGZsb2F0aW5nU3R5bGVzOlh9KSxbYyxqLGFlLEgsWF0pfWZ1bmN0aW9uIHJDKGUpe2NvbnN0W3Qsbl09cC51c2VTdGF0ZSh2b2lkIDApO3JldHVybiAkbigoKT0+e2lmKGUpe24oe3dpZHRoOmUub2Zmc2V0V2lkdGgsaGVpZ2h0OmUub2Zmc2V0SGVpZ2h0fSk7Y29uc3Qgcj1uZXcgUmVzaXplT2JzZXJ2ZXIobz0+e2lmKCFBcnJheS5pc0FycmF5KG8pfHwhby5sZW5ndGgpcmV0dXJuO2NvbnN0IGk9b1swXTtsZXQgbCxzO2lmKCJib3JkZXJCb3hTaXplImluIGkpe2NvbnN0IGE9aS5ib3JkZXJCb3hTaXplLHU9QXJyYXkuaXNBcnJheShhKT9hWzBdOmE7bD11LmlubGluZVNpemUscz11LmJsb2NrU2l6ZX1lbHNlIGw9ZS5vZmZzZXRXaWR0aCxzPWUub2Zmc2V0SGVpZ2h0O24oe3dpZHRoOmwsaGVpZ2h0OnN9KX0pO3JldHVybiByLm9ic2VydmUoZSx7Ym94OiJib3JkZXItYm94In0pLCgpPT5yLnVub2JzZXJ2ZShlKX1lbHNlIG4odm9pZCAwKX0sW2VdKSx0fWNvbnN0IG9DPSJQb3BwZXIiLFtpQyxsQ109JGkob0MpLFtyNSxzQ109aUMob0MpLG81PWU9Pntjb25zdHtfX3Njb3BlUG9wcGVyOnQsY2hpbGRyZW46bn09ZSxbcixvXT1wLnVzZVN0YXRlKG51bGwpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocjUse3Njb3BlOnQsYW5jaG9yOnIsb25BbmNob3JDaGFuZ2U6b30sbil9LGk1PSJQb3BwZXJBbmNob3IiLGw1PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVQb3BwZXI6bix2aXJ0dWFsUmVmOnIsLi4ub309ZSxpPXNDKGk1LG4pLGw9cC51c2VSZWYobnVsbCkscz1YZSh0LGwpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2kub25BbmNob3JDaGFuZ2UoKHI9PW51bGw/dm9pZCAwOnIuY3VycmVudCl8fGwuY3VycmVudCl9KSxyP251bGw6cC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7fSxvLHtyZWY6c30pKX0pLGFDPSJQb3BwZXJDb250ZW50IixbczUseTRdPWlDKGFDKSxhNT1wLmZvcndhcmRSZWYoKGUsdCk9Pnt2YXIgbixyLG8saSxsLHMsYSx1O2NvbnN0e19fc2NvcGVQb3BwZXI6YyxzaWRlOmQ9ImJvdHRvbSIsc2lkZU9mZnNldDpmPTAsYWxpZ246aD0iY2VudGVyIixhbGlnbk9mZnNldDpnPTAsYXJyb3dQYWRkaW5nOm09MCxhdm9pZENvbGxpc2lvbnM6Uz0hMCxjb2xsaXNpb25Cb3VuZGFyeTp2PVtdLGNvbGxpc2lvblBhZGRpbmc6eT0wLHN0aWNreTpfPSJwYXJ0aWFsIixoaWRlV2hlbkRldGFjaGVkOnc9ITEsdXBkYXRlUG9zaXRpb25TdHJhdGVneTpDPSJvcHRpbWl6ZWQiLG9uUGxhY2VkOiQsLi4uRX09ZSxUPXNDKGFDLGMpLFtNLFJdPXAudXNlU3RhdGUobnVsbCksaj1YZSh0LHNuPT5SKHNuKSksW0YsYWVdPXAudXNlU3RhdGUobnVsbCksSD1yQyhGKSxYPShuPUg9PW51bGw/dm9pZCAwOkgud2lkdGgpIT09bnVsbCYmbiE9PXZvaWQgMD9uOjAsUD0ocj1IPT1udWxsP3ZvaWQgMDpILmhlaWdodCkhPT1udWxsJiZyIT09dm9pZCAwP3I6MCxPPWQrKGghPT0iY2VudGVyIj8iLSIraDoiIiksaz10eXBlb2YgeT09Im51bWJlciI/eTp7dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjAsLi4ueX0sST1BcnJheS5pc0FycmF5KHYpP3Y6W3ZdLEw9SS5sZW5ndGg+MCxWPXtwYWRkaW5nOmssYm91bmRhcnk6SS5maWx0ZXIodTUpLGFsdEJvdW5kYXJ5Okx9LHtyZWZzOnRlLGZsb2F0aW5nU3R5bGVzOnllLHBsYWNlbWVudDpmZSxpc1Bvc2l0aW9uZWQ6T2UsbWlkZGxld2FyZURhdGE6YmV9PW41KHtzdHJhdGVneToiZml4ZWQiLHBsYWNlbWVudDpPLHdoaWxlRWxlbWVudHNNb3VudGVkOiguLi5zbik9PnFPKC4uLnNuLHthbmltYXRpb25GcmFtZTpDPT09ImFsd2F5cyJ9KSxlbGVtZW50czp7cmVmZXJlbmNlOlQuYW5jaG9yfSxtaWRkbGV3YXJlOltPTyh7bWFpbkF4aXM6ZitQLGFsaWdubWVudEF4aXM6Z30pLFMmJkFPKHttYWluQXhpczohMCxjcm9zc0F4aXM6ITEsbGltaXRlcjpfPT09InBhcnRpYWwiP01PKCk6dm9pZCAwLC4uLlZ9KSxTJiZiTyh7Li4uVn0pLERPKHsuLi5WLGFwcGx5Oih7ZWxlbWVudHM6c24scmVjdHM6Um4sYXZhaWxhYmxlV2lkdGg6VGUsYXZhaWxhYmxlSGVpZ2h0OmZ0fSk9Pntjb25zdHt3aWR0aDpodCxoZWlnaHQ6X3R9PVJuLnJlZmVyZW5jZSxnbj1zbi5mbG9hdGluZy5zdHlsZTtnbi5zZXRQcm9wZXJ0eSgiLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLXdpZHRoIixgJHtUZX1weGApLGduLnNldFByb3BlcnR5KCItLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0IixgJHtmdH1weGApLGduLnNldFByb3BlcnR5KCItLXJhZGl4LXBvcHBlci1hbmNob3Itd2lkdGgiLGAke2h0fXB4YCksZ24uc2V0UHJvcGVydHkoIi0tcmFkaXgtcG9wcGVyLWFuY2hvci1oZWlnaHQiLGAke190fXB4YCl9fSksRiYmdDUoe2VsZW1lbnQ6RixwYWRkaW5nOm19KSxjNSh7YXJyb3dXaWR0aDpYLGFycm93SGVpZ2h0OlB9KSx3JiZSTyh7c3RyYXRlZ3k6InJlZmVyZW5jZUhpZGRlbiIsLi4uVn0pXX0pLFtaLGtlXT11QyhmZSksY2U9VnQoJCk7JG4oKCk9PntPZSYmKGNlPT1udWxsfHxjZSgpKX0sW09lLGNlXSk7Y29uc3QgX2U9KG89YmUuYXJyb3cpPT09bnVsbHx8bz09PXZvaWQgMD92b2lkIDA6by54LG1lPShpPWJlLmFycm93KT09PW51bGx8fGk9PT12b2lkIDA/dm9pZCAwOmkueSwkZT0oKGw9YmUuYXJyb3cpPT09bnVsbHx8bD09PXZvaWQgMD92b2lkIDA6bC5jZW50ZXJPZmZzZXQpIT09MCxbQmUsUHRdPXAudXNlU3RhdGUoKTtyZXR1cm4gJG4oKCk9PntNJiZQdCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShNKS56SW5kZXgpfSxbTV0pLHAuY3JlYXRlRWxlbWVudCgiZGl2Iix7cmVmOnRlLnNldEZsb2F0aW5nLCJkYXRhLXJhZGl4LXBvcHBlci1jb250ZW50LXdyYXBwZXIiOiIiLHN0eWxlOnsuLi55ZSx0cmFuc2Zvcm06T2U/eWUudHJhbnNmb3JtOiJ0cmFuc2xhdGUoMCwgLTIwMCUpIixtaW5XaWR0aDoibWF4LWNvbnRlbnQiLHpJbmRleDpCZSwiLS1yYWRpeC1wb3BwZXItdHJhbnNmb3JtLW9yaWdpbiI6WyhzPWJlLnRyYW5zZm9ybU9yaWdpbik9PT1udWxsfHxzPT09dm9pZCAwP3ZvaWQgMDpzLngsKGE9YmUudHJhbnNmb3JtT3JpZ2luKT09PW51bGx8fGE9PT12b2lkIDA/dm9pZCAwOmEueV0uam9pbigiICIpfSxkaXI6ZS5kaXJ9LHAuY3JlYXRlRWxlbWVudChzNSx7c2NvcGU6YyxwbGFjZWRTaWRlOlosb25BcnJvd0NoYW5nZTphZSxhcnJvd1g6X2UsYXJyb3dZOm1lLHNob3VsZEhpZGVBcnJvdzokZX0scC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7ImRhdGEtc2lkZSI6WiwiZGF0YS1hbGlnbiI6a2V9LEUse3JlZjpqLHN0eWxlOnsuLi5FLnN0eWxlLGFuaW1hdGlvbjpPZT92b2lkIDA6Im5vbmUiLG9wYWNpdHk6KHU9YmUuaGlkZSkhPT1udWxsJiZ1IT09dm9pZCAwJiZ1LnJlZmVyZW5jZUhpZGRlbj8wOnZvaWQgMH19KSkpKX0pO2Z1bmN0aW9uIHU1KGUpe3JldHVybiBlIT09bnVsbH1jb25zdCBjNT1lPT4oe25hbWU6InRyYW5zZm9ybU9yaWdpbiIsb3B0aW9uczplLGZuKHQpe3ZhciBuLHIsbyxpLGw7Y29uc3R7cGxhY2VtZW50OnMscmVjdHM6YSxtaWRkbGV3YXJlRGF0YTp1fT10LGQ9KChuPXUuYXJyb3cpPT09bnVsbHx8bj09PXZvaWQgMD92b2lkIDA6bi5jZW50ZXJPZmZzZXQpIT09MCxmPWQ/MDplLmFycm93V2lkdGgsaD1kPzA6ZS5hcnJvd0hlaWdodCxbZyxtXT11QyhzKSxTPXtzdGFydDoiMCUiLGNlbnRlcjoiNTAlIixlbmQ6IjEwMCUifVttXSx2PSgocj0obz11LmFycm93KT09PW51bGx8fG89PT12b2lkIDA/dm9pZCAwOm8ueCkhPT1udWxsJiZyIT09dm9pZCAwP3I6MCkrZi8yLHk9KChpPShsPXUuYXJyb3cpPT09bnVsbHx8bD09PXZvaWQgMD92b2lkIDA6bC55KSE9PW51bGwmJmkhPT12b2lkIDA/aTowKStoLzI7bGV0IF89IiIsdz0iIjtyZXR1cm4gZz09PSJib3R0b20iPyhfPWQ/UzpgJHt2fXB4YCx3PWAkey1ofXB4YCk6Zz09PSJ0b3AiPyhfPWQ/UzpgJHt2fXB4YCx3PWAke2EuZmxvYXRpbmcuaGVpZ2h0K2h9cHhgKTpnPT09InJpZ2h0Ij8oXz1gJHstaH1weGAsdz1kP1M6YCR7eX1weGApOmc9PT0ibGVmdCImJihfPWAke2EuZmxvYXRpbmcud2lkdGgraH1weGAsdz1kP1M6YCR7eX1weGApLHtkYXRhOnt4Ol8seTp3fX19fSk7ZnVuY3Rpb24gdUMoZSl7Y29uc3RbdCxuPSJjZW50ZXIiXT1lLnNwbGl0KCItIik7cmV0dXJuW3Qsbl19Y29uc3QgZDU9bzUsZjU9bDUsaDU9YTUscDU9cC5mb3J3YXJkUmVmKChlLHQpPT57dmFyIG47Y29uc3R7Y29udGFpbmVyOnI9Z2xvYmFsVGhpcz09bnVsbHx8KG49Z2xvYmFsVGhpcy5kb2N1bWVudCk9PT1udWxsfHxuPT09dm9pZCAwP3ZvaWQgMDpuLmJvZHksLi4ub309ZTtyZXR1cm4gcj9Lay5jcmVhdGVQb3J0YWwocC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7fSxvLHtyZWY6dH0pKSxyKTpudWxsfSk7ZnVuY3Rpb24gUGwoe3Byb3A6ZSxkZWZhdWx0UHJvcDp0LG9uQ2hhbmdlOm49KCk9Pnt9fSl7Y29uc3RbcixvXT1nNSh7ZGVmYXVsdFByb3A6dCxvbkNoYW5nZTpufSksaT1lIT09dm9pZCAwLGw9aT9lOnIscz1WdChuKSxhPXAudXNlQ2FsbGJhY2sodT0+e2lmKGkpe2NvbnN0IGQ9dHlwZW9mIHU9PSJmdW5jdGlvbiI/dShlKTp1O2QhPT1lJiZzKGQpfWVsc2Ugbyh1KX0sW2ksZSxvLHNdKTtyZXR1cm5bbCxhXX1mdW5jdGlvbiBnNSh7ZGVmYXVsdFByb3A6ZSxvbkNoYW5nZTp0fSl7Y29uc3Qgbj1wLnVzZVN0YXRlKGUpLFtyXT1uLG89cC51c2VSZWYociksaT1WdCh0KTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntvLmN1cnJlbnQhPT1yJiYoaShyKSxvLmN1cnJlbnQ9cil9LFtyLG8saV0pLG59ZnVuY3Rpb24gY0MoZSl7Y29uc3QgdD1wLnVzZVJlZih7dmFsdWU6ZSxwcmV2aW91czplfSk7cmV0dXJuIHAudXNlTWVtbygoKT0+KHQuY3VycmVudC52YWx1ZSE9PWUmJih0LmN1cnJlbnQucHJldmlvdXM9dC5jdXJyZW50LnZhbHVlLHQuY3VycmVudC52YWx1ZT1lKSx0LmN1cnJlbnQucHJldmlvdXMpLFtlXSl9Y29uc3QgbTU9cC5mb3J3YXJkUmVmKChlLHQpPT5wLmNyZWF0ZUVsZW1lbnQoRGUuc3BhbixlZSh7fSxlLHtyZWY6dCxzdHlsZTp7cG9zaXRpb246ImFic29sdXRlIixib3JkZXI6MCx3aWR0aDoxLGhlaWdodDoxLHBhZGRpbmc6MCxtYXJnaW46LTEsb3ZlcmZsb3c6ImhpZGRlbiIsY2xpcDoicmVjdCgwLCAwLCAwLCAwKSIsd2hpdGVTcGFjZToibm93cmFwIix3b3JkV3JhcDoibm9ybWFsIiwuLi5lLnN0eWxlfX0pKSk7dmFyIHY1PWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBkb2N1bWVudD4idSIpcmV0dXJuIG51bGw7dmFyIHQ9QXJyYXkuaXNBcnJheShlKT9lWzBdOmU7cmV0dXJuIHQub3duZXJEb2N1bWVudC5ib2R5fSx6aT1uZXcgV2Vha01hcCx4dT1uZXcgV2Vha01hcCxfdT17fSxOZj0wLGRDPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYoZS5ob3N0fHxkQyhlLnBhcmVudE5vZGUpKX0seTU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24obil7aWYoZS5jb250YWlucyhuKSlyZXR1cm4gbjt2YXIgcj1kQyhuKTtyZXR1cm4gciYmZS5jb250YWlucyhyKT9yOihjb25zb2xlLmVycm9yKCJhcmlhLWhpZGRlbiIsbiwiaW4gbm90IGNvbnRhaW5lZCBpbnNpZGUiLGUsIi4gRG9pbmcgbm90aGluZyIpLG51bGwpfSkuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiEhbn0pfSx4NT1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz15NSh0LEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pO191W25dfHwoX3Vbbl09bmV3IFdlYWtNYXApO3ZhciBpPV91W25dLGw9W10scz1uZXcgU2V0LGE9bmV3IFNldChvKSx1PWZ1bmN0aW9uKGQpeyFkfHxzLmhhcyhkKXx8KHMuYWRkKGQpLHUoZC5wYXJlbnROb2RlKSl9O28uZm9yRWFjaCh1KTt2YXIgYz1mdW5jdGlvbihkKXshZHx8YS5oYXMoZCl8fEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZC5jaGlsZHJlbixmdW5jdGlvbihmKXtpZihzLmhhcyhmKSljKGYpO2Vsc2V7dmFyIGg9Zi5nZXRBdHRyaWJ1dGUociksZz1oIT09bnVsbCYmaCE9PSJmYWxzZSIsbT0oemkuZ2V0KGYpfHwwKSsxLFM9KGkuZ2V0KGYpfHwwKSsxO3ppLnNldChmLG0pLGkuc2V0KGYsUyksbC5wdXNoKGYpLG09PT0xJiZnJiZ4dS5zZXQoZiwhMCksUz09PTEmJmYuc2V0QXR0cmlidXRlKG4sInRydWUiKSxnfHxmLnNldEF0dHJpYnV0ZShyLCJ0cnVlIil9fSl9O3JldHVybiBjKHQpLHMuY2xlYXIoKSxOZisrLGZ1bmN0aW9uKCl7bC5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBmPXppLmdldChkKS0xLGg9aS5nZXQoZCktMTt6aS5zZXQoZCxmKSxpLnNldChkLGgpLGZ8fCh4dS5oYXMoZCl8fGQucmVtb3ZlQXR0cmlidXRlKHIpLHh1LmRlbGV0ZShkKSksaHx8ZC5yZW1vdmVBdHRyaWJ1dGUobil9KSxOZi0tLE5mfHwoemk9bmV3IFdlYWtNYXAsemk9bmV3IFdlYWtNYXAseHU9bmV3IFdlYWtNYXAsX3U9e30pfX0sXzU9ZnVuY3Rpb24oZSx0LG4pe249PT12b2lkIDAmJihuPSJkYXRhLWFyaWEtaGlkZGVuIik7dmFyIHI9QXJyYXkuZnJvbShBcnJheS5pc0FycmF5KGUpP2U6W2VdKSxvPXR8fHY1KGUpO3JldHVybiBvPyhyLnB1c2guYXBwbHkocixBcnJheS5mcm9tKG8ucXVlcnlTZWxlY3RvckFsbCgiW2FyaWEtbGl2ZV0iKSkpLHg1KHIsbyxuLCJhcmlhLWhpZGRlbiIpKTpmdW5jdGlvbigpe3JldHVybiBudWxsfX0sY3I9ZnVuY3Rpb24oKXtyZXR1cm4gY3I9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBuLHI9MSxvPWFyZ3VtZW50cy5sZW5ndGg7cjxvO3IrKyl7bj1hcmd1bWVudHNbcl07Zm9yKHZhciBpIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4saSkmJih0W2ldPW5baV0pfXJldHVybiB0fSxjci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2Z1bmN0aW9uIGZDKGUsdCl7dmFyIG49e307Zm9yKHZhciByIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUscikmJnQuaW5kZXhPZihyKTwwJiYobltyXT1lW3JdKTtpZihlIT1udWxsJiZ0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz09ImZ1bmN0aW9uIilmb3IodmFyIG89MCxyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7bzxyLmxlbmd0aDtvKyspdC5pbmRleE9mKHJbb10pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLHJbb10pJiYobltyW29dXT1lW3Jbb11dKTtyZXR1cm4gbn1mdW5jdGlvbiB3NShlLHQsbil7aWYobnx8YXJndW1lbnRzLmxlbmd0aD09PTIpZm9yKHZhciByPTAsbz10Lmxlbmd0aCxpO3I8bztyKyspKGl8fCEociBpbiB0KSkmJihpfHwoaT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LDAscikpLGlbcl09dFtyXSk7cmV0dXJuIGUuY29uY2F0KGl8fEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpKX12YXIgV3U9InJpZ2h0LXNjcm9sbC1iYXItcG9zaXRpb24iLFV1PSJ3aWR0aC1iZWZvcmUtc2Nyb2xsLWJhciIsUzU9IndpdGgtc2Nyb2xsLWJhcnMtaGlkZGVuIixDNT0iLS1yZW1vdmVkLWJvZHktc2Nyb2xsLWJhci1zaXplIjtmdW5jdGlvbiBFNShlLHQpe3JldHVybiB0eXBlb2YgZT09ImZ1bmN0aW9uIj9lKHQpOmUmJihlLmN1cnJlbnQ9dCksZX1mdW5jdGlvbiAkNShlLHQpe3ZhciBuPXAudXNlU3RhdGUoZnVuY3Rpb24oKXtyZXR1cm57dmFsdWU6ZSxjYWxsYmFjazp0LGZhY2FkZTp7Z2V0IGN1cnJlbnQoKXtyZXR1cm4gbi52YWx1ZX0sc2V0IGN1cnJlbnQocil7dmFyIG89bi52YWx1ZTtvIT09ciYmKG4udmFsdWU9cixuLmNhbGxiYWNrKHIsbykpfX19fSlbMF07cmV0dXJuIG4uY2FsbGJhY2s9dCxuLmZhY2FkZX1mdW5jdGlvbiBrNShlLHQpe3JldHVybiAkNSh0fHxudWxsLGZ1bmN0aW9uKG4pe3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24ocil7cmV0dXJuIEU1KHIsbil9KX0pfWZ1bmN0aW9uIFQ1KGUpe3JldHVybiBlfWZ1bmN0aW9uIE41KGUsdCl7dD09PXZvaWQgMCYmKHQ9VDUpO3ZhciBuPVtdLHI9ITEsbz17cmVhZDpmdW5jdGlvbigpe2lmKHIpdGhyb3cgbmV3IEVycm9yKCJTaWRlY2FyOiBjb3VsZCBub3QgYHJlYWRgIGZyb20gYW4gYGFzc2lnbmVkYCBtZWRpdW0uIGByZWFkYCBjb3VsZCBiZSB1c2VkIG9ubHkgd2l0aCBgdXNlTWVkaXVtYC4iKTtyZXR1cm4gbi5sZW5ndGg/bltuLmxlbmd0aC0xXTplfSx1c2VNZWRpdW06ZnVuY3Rpb24oaSl7dmFyIGw9dChpLHIpO3JldHVybiBuLnB1c2gobCksZnVuY3Rpb24oKXtuPW4uZmlsdGVyKGZ1bmN0aW9uKHMpe3JldHVybiBzIT09bH0pfX0sYXNzaWduU3luY01lZGl1bTpmdW5jdGlvbihpKXtmb3Iocj0hMDtuLmxlbmd0aDspe3ZhciBsPW47bj1bXSxsLmZvckVhY2goaSl9bj17cHVzaDpmdW5jdGlvbihzKXtyZXR1cm4gaShzKX0sZmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG59fX0sYXNzaWduTWVkaXVtOmZ1bmN0aW9uKGkpe3I9ITA7dmFyIGw9W107aWYobi5sZW5ndGgpe3ZhciBzPW47bj1bXSxzLmZvckVhY2goaSksbD1ufXZhciBhPWZ1bmN0aW9uKCl7dmFyIGM9bDtsPVtdLGMuZm9yRWFjaChpKX0sdT1mdW5jdGlvbigpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGEpfTt1KCksbj17cHVzaDpmdW5jdGlvbihjKXtsLnB1c2goYyksdSgpfSxmaWx0ZXI6ZnVuY3Rpb24oYyl7cmV0dXJuIGw9bC5maWx0ZXIoYyksbn19fX07cmV0dXJuIG99ZnVuY3Rpb24gYjUoZSl7ZT09PXZvaWQgMCYmKGU9e30pO3ZhciB0PU41KG51bGwpO3JldHVybiB0Lm9wdGlvbnM9Y3Ioe2FzeW5jOiEwLHNzcjohMX0sZSksdH12YXIgaEM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zaWRlQ2FyLG49ZkMoZSxbInNpZGVDYXIiXSk7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJTaWRlY2FyOiBwbGVhc2UgcHJvdmlkZSBgc2lkZUNhcmAgcHJvcGVydHkgdG8gaW1wb3J0IHRoZSByaWdodCBjYXIiKTt2YXIgcj10LnJlYWQoKTtpZighcil0aHJvdyBuZXcgRXJyb3IoIlNpZGVjYXIgbWVkaXVtIG5vdCBmb3VuZCIpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocixjcih7fSxuKSl9O2hDLmlzU2lkZUNhckV4cG9ydD0hMDtmdW5jdGlvbiBSNShlLHQpe3JldHVybiBlLnVzZU1lZGl1bSh0KSxoQ312YXIgcEM9YjUoKSxiZj1mdW5jdGlvbigpe30sRWQ9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKGUsdCl7dmFyIG49cC51c2VSZWYobnVsbCkscj1wLnVzZVN0YXRlKHtvblNjcm9sbENhcHR1cmU6YmYsb25XaGVlbENhcHR1cmU6YmYsb25Ub3VjaE1vdmVDYXB0dXJlOmJmfSksbz1yWzBdLGk9clsxXSxsPWUuZm9yd2FyZFByb3BzLHM9ZS5jaGlsZHJlbixhPWUuY2xhc3NOYW1lLHU9ZS5yZW1vdmVTY3JvbGxCYXIsYz1lLmVuYWJsZWQsZD1lLnNoYXJkcyxmPWUuc2lkZUNhcixoPWUubm9Jc29sYXRpb24sZz1lLmluZXJ0LG09ZS5hbGxvd1BpbmNoWm9vbSxTPWUuYXMsdj1TPT09dm9pZCAwPyJkaXYiOlMseT1mQyhlLFsiZm9yd2FyZFByb3BzIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJyZW1vdmVTY3JvbGxCYXIiLCJlbmFibGVkIiwic2hhcmRzIiwic2lkZUNhciIsIm5vSXNvbGF0aW9uIiwiaW5lcnQiLCJhbGxvd1BpbmNoWm9vbSIsImFzIl0pLF89Zix3PWs1KFtuLHRdKSxDPWNyKGNyKHt9LHkpLG8pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLGMmJnAuY3JlYXRlRWxlbWVudChfLHtzaWRlQ2FyOnBDLHJlbW92ZVNjcm9sbEJhcjp1LHNoYXJkczpkLG5vSXNvbGF0aW9uOmgsaW5lcnQ6ZyxzZXRDYWxsYmFja3M6aSxhbGxvd1BpbmNoWm9vbTohIW0sbG9ja1JlZjpufSksbD9wLmNsb25lRWxlbWVudChwLkNoaWxkcmVuLm9ubHkocyksY3IoY3Ioe30sQykse3JlZjp3fSkpOnAuY3JlYXRlRWxlbWVudCh2LGNyKHt9LEMse2NsYXNzTmFtZTphLHJlZjp3fSkscykpfSk7RWQuZGVmYXVsdFByb3BzPXtlbmFibGVkOiEwLHJlbW92ZVNjcm9sbEJhcjohMCxpbmVydDohMX07RWQuY2xhc3NOYW1lcz17ZnVsbFdpZHRoOlV1LHplcm9SaWdodDpXdX07dmFyIHgwLFA1PWZ1bmN0aW9uKCl7aWYoeDApcmV0dXJuIHgwO2lmKHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXzwidSIpcmV0dXJuIF9fd2VicGFja19ub25jZV9ffTtmdW5jdGlvbiBPNSgpe2lmKCFkb2N1bWVudClyZXR1cm4gbnVsbDt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2UudHlwZT0idGV4dC9jc3MiO3ZhciB0PVA1KCk7cmV0dXJuIHQmJmUuc2V0QXR0cmlidXRlKCJub25jZSIsdCksZX1mdW5jdGlvbiBBNShlLHQpe2Uuc3R5bGVTaGVldD9lLnN0eWxlU2hlZXQuY3NzVGV4dD10OmUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodCkpfWZ1bmN0aW9uIE01KGUpe3ZhciB0PWRvY3VtZW50LmhlYWR8fGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07dC5hcHBlbmRDaGlsZChlKX12YXIgRDU9ZnVuY3Rpb24oKXt2YXIgZT0wLHQ9bnVsbDtyZXR1cm57YWRkOmZ1bmN0aW9uKG4pe2U9PTAmJih0PU81KCkpJiYoQTUodCxuKSxNNSh0KSksZSsrfSxyZW1vdmU6ZnVuY3Rpb24oKXtlLS0sIWUmJnQmJih0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGwpfX19LEw1PWZ1bmN0aW9uKCl7dmFyIGU9RDUoKTtyZXR1cm4gZnVuY3Rpb24odCxuKXtwLnVzZUVmZmVjdChmdW5jdGlvbigpe3JldHVybiBlLmFkZCh0KSxmdW5jdGlvbigpe2UucmVtb3ZlKCl9fSxbdCYmbl0pfX0sZ0M9ZnVuY3Rpb24oKXt2YXIgZT1MNSgpLHQ9ZnVuY3Rpb24obil7dmFyIHI9bi5zdHlsZXMsbz1uLmR5bmFtaWM7cmV0dXJuIGUocixvKSxudWxsfTtyZXR1cm4gdH0sSTU9e2xlZnQ6MCx0b3A6MCxyaWdodDowLGdhcDowfSxSZj1mdW5jdGlvbihlKXtyZXR1cm4gcGFyc2VJbnQoZXx8IiIsMTApfHwwfSxqNT1mdW5jdGlvbihlKXt2YXIgdD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KSxuPXRbZT09PSJwYWRkaW5nIj8icGFkZGluZ0xlZnQiOiJtYXJnaW5MZWZ0Il0scj10W2U9PT0icGFkZGluZyI/InBhZGRpbmdUb3AiOiJtYXJnaW5Ub3AiXSxvPXRbZT09PSJwYWRkaW5nIj8icGFkZGluZ1JpZ2h0IjoibWFyZ2luUmlnaHQiXTtyZXR1cm5bUmYobiksUmYociksUmYobyldfSx6NT1mdW5jdGlvbihlKXtpZihlPT09dm9pZCAwJiYoZT0ibWFyZ2luIiksdHlwZW9mIHdpbmRvdz4idSIpcmV0dXJuIEk1O3ZhciB0PWo1KGUpLG49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLHI9d2luZG93LmlubmVyV2lkdGg7cmV0dXJue2xlZnQ6dFswXSx0b3A6dFsxXSxyaWdodDp0WzJdLGdhcDpNYXRoLm1heCgwLHItbit0WzJdLXRbMF0pfX0sRjU9Z0MoKSxCNT1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz1lLmxlZnQsaT1lLnRvcCxsPWUucmlnaHQscz1lLmdhcDtyZXR1cm4gbj09PXZvaWQgMCYmKG49Im1hcmdpbiIpLGAKICAuYC5jb25jYXQoUzUsYCB7CiAgIG92ZXJmbG93OiBoaWRkZW4gYCkuY29uY2F0KHIsYDsKICAgcGFkZGluZy1yaWdodDogYCkuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLGA7CiAgfQogIGJvZHkgewogICAgb3ZlcmZsb3c6IGhpZGRlbiBgKS5jb25jYXQocixgOwogICAgb3ZlcnNjcm9sbC1iZWhhdmlvcjogY29udGFpbjsKICAgIGApLmNvbmNhdChbdCYmInBvc2l0aW9uOiByZWxhdGl2ZSAiLmNvbmNhdChyLCI7Iiksbj09PSJtYXJnaW4iJiZgCiAgICBwYWRkaW5nLWxlZnQ6IGAuY29uY2F0KG8sYHB4OwogICAgcGFkZGluZy10b3A6IGApLmNvbmNhdChpLGBweDsKICAgIHBhZGRpbmctcmlnaHQ6IGApLmNvbmNhdChsLGBweDsKICAgIG1hcmdpbi1sZWZ0OjA7CiAgICBtYXJnaW4tdG9wOjA7CiAgICBtYXJnaW4tcmlnaHQ6IGApLmNvbmNhdChzLCJweCAiKS5jb25jYXQocixgOwogICAgYCksbj09PSJwYWRkaW5nIiYmInBhZGRpbmctcmlnaHQ6ICIuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLCI7IildLmZpbHRlcihCb29sZWFuKS5qb2luKCIiKSxgCiAgfQogIAogIC5gKS5jb25jYXQoV3UsYCB7CiAgICByaWdodDogYCkuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLGA7CiAgfQogIAogIC5gKS5jb25jYXQoVXUsYCB7CiAgICBtYXJnaW4tcmlnaHQ6IGApLmNvbmNhdChzLCJweCAiKS5jb25jYXQocixgOwogIH0KICAKICAuYCkuY29uY2F0KFd1LCIgLiIpLmNvbmNhdChXdSxgIHsKICAgIHJpZ2h0OiAwIGApLmNvbmNhdChyLGA7CiAgfQogIAogIC5gKS5jb25jYXQoVXUsIiAuIikuY29uY2F0KFV1LGAgewogICAgbWFyZ2luLXJpZ2h0OiAwIGApLmNvbmNhdChyLGA7CiAgfQogIAogIGJvZHkgewogICAgYCkuY29uY2F0KEM1LCI6ICIpLmNvbmNhdChzLGBweDsKICB9CmApfSxXNT1mdW5jdGlvbihlKXt2YXIgdD1lLm5vUmVsYXRpdmUsbj1lLm5vSW1wb3J0YW50LHI9ZS5nYXBNb2RlLG89cj09PXZvaWQgMD8ibWFyZ2luIjpyLGk9cC51c2VNZW1vKGZ1bmN0aW9uKCl7cmV0dXJuIHo1KG8pfSxbb10pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoRjUse3N0eWxlczpCNShpLCF0LG8sbj8iIjoiIWltcG9ydGFudCIpfSl9LHdwPSExO2lmKHR5cGVvZiB3aW5kb3c8InUiKXRyeXt2YXIgd3U9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHdwPSEwLCEwfX0pO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0Iix3dSx3dSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLHd1LHd1KX1jYXRjaHt3cD0hMX12YXIgRmk9d3A/e3Bhc3NpdmU6ITF9OiExLFU1PWZ1bmN0aW9uKGUpe3JldHVybiBlLnRhZ05hbWU9PT0iVEVYVEFSRUEifSxtQz1mdW5jdGlvbihlLHQpe3ZhciBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpO3JldHVybiBuW3RdIT09ImhpZGRlbiImJiEobi5vdmVyZmxvd1k9PT1uLm92ZXJmbG93WCYmIVU1KGUpJiZuW3RdPT09InZpc2libGUiKX0sVjU9ZnVuY3Rpb24oZSl7cmV0dXJuIG1DKGUsIm92ZXJmbG93WSIpfSxINT1mdW5jdGlvbihlKXtyZXR1cm4gbUMoZSwib3ZlcmZsb3dYIil9LF8wPWZ1bmN0aW9uKGUsdCl7dmFyIG49dDtkb3t0eXBlb2YgU2hhZG93Um9vdDwidSImJm4gaW5zdGFuY2VvZiBTaGFkb3dSb290JiYobj1uLmhvc3QpO3ZhciByPXZDKGUsbik7aWYocil7dmFyIG89eUMoZSxuKSxpPW9bMV0sbD1vWzJdO2lmKGk+bClyZXR1cm4hMH1uPW4ucGFyZW50Tm9kZX13aGlsZShuJiZuIT09ZG9jdW1lbnQuYm9keSk7cmV0dXJuITF9LEs1PWZ1bmN0aW9uKGUpe3ZhciB0PWUuc2Nyb2xsVG9wLG49ZS5zY3JvbGxIZWlnaHQscj1lLmNsaWVudEhlaWdodDtyZXR1cm5bdCxuLHJdfSxHNT1mdW5jdGlvbihlKXt2YXIgdD1lLnNjcm9sbExlZnQsbj1lLnNjcm9sbFdpZHRoLHI9ZS5jbGllbnRXaWR0aDtyZXR1cm5bdCxuLHJdfSx2Qz1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09InYiP1Y1KHQpOkg1KHQpfSx5Qz1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09InYiP0s1KHQpOkc1KHQpfSxZNT1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09ImgiJiZ0PT09InJ0bCI/LTE6MX0sWDU9ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgaT1ZNShlLHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLmRpcmVjdGlvbiksbD1pKnIscz1uLnRhcmdldCxhPXQuY29udGFpbnMocyksdT0hMSxjPWw+MCxkPTAsZj0wO2Rve3ZhciBoPXlDKGUscyksZz1oWzBdLG09aFsxXSxTPWhbMl0sdj1tLVMtaSpnOyhnfHx2KSYmdkMoZSxzKSYmKGQrPXYsZis9Zykscz1zLnBhcmVudE5vZGV9d2hpbGUoIWEmJnMhPT1kb2N1bWVudC5ib2R5fHxhJiYodC5jb250YWlucyhzKXx8dD09PXMpKTtyZXR1cm4oYyYmKG8mJmQ9PT0wfHwhbyYmbD5kKXx8IWMmJihvJiZmPT09MHx8IW8mJi1sPmYpKSYmKHU9ITApLHV9LFN1PWZ1bmN0aW9uKGUpe3JldHVybiJjaGFuZ2VkVG91Y2hlcyJpbiBlP1tlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFgsZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZXTpbMCwwXX0sdzA9ZnVuY3Rpb24oZSl7cmV0dXJuW2UuZGVsdGFYLGUuZGVsdGFZXX0sUzA9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJjdXJyZW50ImluIGU/ZS5jdXJyZW50OmV9LFE1PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbMF09PT10WzBdJiZlWzFdPT09dFsxXX0sSjU9ZnVuY3Rpb24oZSl7cmV0dXJuYAogIC5ibG9jay1pbnRlcmFjdGl2aXR5LWAuY29uY2F0KGUsYCB7cG9pbnRlci1ldmVudHM6IG5vbmU7fQogIC5hbGxvdy1pbnRlcmFjdGl2aXR5LWApLmNvbmNhdChlLGAge3BvaW50ZXItZXZlbnRzOiBhbGw7fQpgKX0sWjU9MCxCaT1bXTtmdW5jdGlvbiBxNShlKXt2YXIgdD1wLnVzZVJlZihbXSksbj1wLnVzZVJlZihbMCwwXSkscj1wLnVzZVJlZigpLG89cC51c2VTdGF0ZShaNSsrKVswXSxpPXAudXNlU3RhdGUoZnVuY3Rpb24oKXtyZXR1cm4gZ0MoKX0pWzBdLGw9cC51c2VSZWYoZSk7cC51c2VFZmZlY3QoZnVuY3Rpb24oKXtsLmN1cnJlbnQ9ZX0sW2VdKSxwLnVzZUVmZmVjdChmdW5jdGlvbigpe2lmKGUuaW5lcnQpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgiYmxvY2staW50ZXJhY3Rpdml0eS0iLmNvbmNhdChvKSk7dmFyIG09dzUoW2UubG9ja1JlZi5jdXJyZW50XSwoZS5zaGFyZHN8fFtdKS5tYXAoUzApLCEwKS5maWx0ZXIoQm9vbGVhbik7cmV0dXJuIG0uZm9yRWFjaChmdW5jdGlvbihTKXtyZXR1cm4gUy5jbGFzc0xpc3QuYWRkKCJhbGxvdy1pbnRlcmFjdGl2aXR5LSIuY29uY2F0KG8pKX0pLGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCJibG9jay1pbnRlcmFjdGl2aXR5LSIuY29uY2F0KG8pKSxtLmZvckVhY2goZnVuY3Rpb24oUyl7cmV0dXJuIFMuY2xhc3NMaXN0LnJlbW92ZSgiYWxsb3ctaW50ZXJhY3Rpdml0eS0iLmNvbmNhdChvKSl9KX19fSxbZS5pbmVydCxlLmxvY2tSZWYuY3VycmVudCxlLnNoYXJkc10pO3ZhciBzPXAudXNlQ2FsbGJhY2soZnVuY3Rpb24obSxTKXtpZigidG91Y2hlcyJpbiBtJiZtLnRvdWNoZXMubGVuZ3RoPT09MilyZXR1cm4hbC5jdXJyZW50LmFsbG93UGluY2hab29tO3ZhciB2PVN1KG0pLHk9bi5jdXJyZW50LF89ImRlbHRhWCJpbiBtP20uZGVsdGFYOnlbMF0tdlswXSx3PSJkZWx0YVkiaW4gbT9tLmRlbHRhWTp5WzFdLXZbMV0sQywkPW0udGFyZ2V0LEU9TWF0aC5hYnMoXyk+TWF0aC5hYnModyk/ImgiOiJ2IjtpZigidG91Y2hlcyJpbiBtJiZFPT09ImgiJiYkLnR5cGU9PT0icmFuZ2UiKXJldHVybiExO3ZhciBUPV8wKEUsJCk7aWYoIVQpcmV0dXJuITA7aWYoVD9DPUU6KEM9RT09PSJ2Ij8iaCI6InYiLFQ9XzAoRSwkKSksIVQpcmV0dXJuITE7aWYoIXIuY3VycmVudCYmImNoYW5nZWRUb3VjaGVzImluIG0mJihffHx3KSYmKHIuY3VycmVudD1DKSwhQylyZXR1cm4hMDt2YXIgTT1yLmN1cnJlbnR8fEM7cmV0dXJuIFg1KE0sUyxtLE09PT0iaCI/Xzp3LCEwKX0sW10pLGE9cC51c2VDYWxsYmFjayhmdW5jdGlvbihtKXt2YXIgUz1tO2lmKCEoIUJpLmxlbmd0aHx8QmlbQmkubGVuZ3RoLTFdIT09aSkpe3ZhciB2PSJkZWx0YVkiaW4gUz93MChTKTpTdShTKSx5PXQuY3VycmVudC5maWx0ZXIoZnVuY3Rpb24oQyl7cmV0dXJuIEMubmFtZT09PVMudHlwZSYmQy50YXJnZXQ9PT1TLnRhcmdldCYmUTUoQy5kZWx0YSx2KX0pWzBdO2lmKHkmJnkuc2hvdWxkKXtTLmNhbmNlbGFibGUmJlMucHJldmVudERlZmF1bHQoKTtyZXR1cm59aWYoIXkpe3ZhciBfPShsLmN1cnJlbnQuc2hhcmRzfHxbXSkubWFwKFMwKS5maWx0ZXIoQm9vbGVhbikuZmlsdGVyKGZ1bmN0aW9uKEMpe3JldHVybiBDLmNvbnRhaW5zKFMudGFyZ2V0KX0pLHc9Xy5sZW5ndGg+MD9zKFMsX1swXSk6IWwuY3VycmVudC5ub0lzb2xhdGlvbjt3JiZTLmNhbmNlbGFibGUmJlMucHJldmVudERlZmF1bHQoKX19fSxbXSksdT1wLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKG0sUyx2LHkpe3ZhciBfPXtuYW1lOm0sZGVsdGE6Uyx0YXJnZXQ6dixzaG91bGQ6eX07dC5jdXJyZW50LnB1c2goXyksc2V0VGltZW91dChmdW5jdGlvbigpe3QuY3VycmVudD10LmN1cnJlbnQuZmlsdGVyKGZ1bmN0aW9uKHcpe3JldHVybiB3IT09X30pfSwxKX0sW10pLGM9cC51c2VDYWxsYmFjayhmdW5jdGlvbihtKXtuLmN1cnJlbnQ9U3UobSksci5jdXJyZW50PXZvaWQgMH0sW10pLGQ9cC51c2VDYWxsYmFjayhmdW5jdGlvbihtKXt1KG0udHlwZSx3MChtKSxtLnRhcmdldCxzKG0sZS5sb2NrUmVmLmN1cnJlbnQpKX0sW10pLGY9cC51c2VDYWxsYmFjayhmdW5jdGlvbihtKXt1KG0udHlwZSxTdShtKSxtLnRhcmdldCxzKG0sZS5sb2NrUmVmLmN1cnJlbnQpKX0sW10pO3AudXNlRWZmZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIEJpLnB1c2goaSksZS5zZXRDYWxsYmFja3Moe29uU2Nyb2xsQ2FwdHVyZTpkLG9uV2hlZWxDYXB0dXJlOmQsb25Ub3VjaE1vdmVDYXB0dXJlOmZ9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsYSxGaSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixhLEZpKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixjLEZpKSxmdW5jdGlvbigpe0JpPUJpLmZpbHRlcihmdW5jdGlvbihtKXtyZXR1cm4gbSE9PWl9KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3aGVlbCIsYSxGaSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixhLEZpKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixjLEZpKX19LFtdKTt2YXIgaD1lLnJlbW92ZVNjcm9sbEJhcixnPWUuaW5lcnQ7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwsZz9wLmNyZWF0ZUVsZW1lbnQoaSx7c3R5bGVzOko1KG8pfSk6bnVsbCxoP3AuY3JlYXRlRWxlbWVudChXNSx7Z2FwTW9kZToibWFyZ2luIn0pOm51bGwpfWNvbnN0IGVBPVI1KHBDLHE1KTt2YXIgeEM9cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChFZCxjcih7fSxlLHtyZWY6dCxzaWRlQ2FyOmVBfSkpfSk7eEMuY2xhc3NOYW1lcz1FZC5jbGFzc05hbWVzO2NvbnN0IHRBPXhDLG5BPVsiICIsIkVudGVyIiwiQXJyb3dVcCIsIkFycm93RG93biJdLHJBPVsiICIsIkVudGVyIl0sJGQ9IlNlbGVjdCIsW2tkLEVtLG9BXT1IUygkZCksW1psLHg0XT0kaSgkZCxbb0EsbENdKSwkbT1sQygpLFtpQSxSaV09WmwoJGQpLFtsQSxzQV09WmwoJGQpLGFBPWU9Pntjb25zdHtfX3Njb3BlU2VsZWN0OnQsY2hpbGRyZW46bixvcGVuOnIsZGVmYXVsdE9wZW46byxvbk9wZW5DaGFuZ2U6aSx2YWx1ZTpsLGRlZmF1bHRWYWx1ZTpzLG9uVmFsdWVDaGFuZ2U6YSxkaXI6dSxuYW1lOmMsYXV0b0NvbXBsZXRlOmQsZGlzYWJsZWQ6ZixyZXF1aXJlZDpofT1lLGc9JG0odCksW20sU109cC51c2VTdGF0ZShudWxsKSxbdix5XT1wLnVzZVN0YXRlKG51bGwpLFtfLHddPXAudXNlU3RhdGUoITEpLEM9YmcodSksWyQ9ITEsRV09UGwoe3Byb3A6cixkZWZhdWx0UHJvcDpvLG9uQ2hhbmdlOml9KSxbVCxNXT1QbCh7cHJvcDpsLGRlZmF1bHRQcm9wOnMsb25DaGFuZ2U6YX0pLFI9cC51c2VSZWYobnVsbCksaj1tPyEhbS5jbG9zZXN0KCJmb3JtIik6ITAsW0YsYWVdPXAudXNlU3RhdGUobmV3IFNldCksSD1BcnJheS5mcm9tKEYpLm1hcChYPT5YLnByb3BzLnZhbHVlKS5qb2luKCI7Iik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChkNSxnLHAuY3JlYXRlRWxlbWVudChpQSx7cmVxdWlyZWQ6aCxzY29wZTp0LHRyaWdnZXI6bSxvblRyaWdnZXJDaGFuZ2U6Uyx2YWx1ZU5vZGU6dixvblZhbHVlTm9kZUNoYW5nZTp5LHZhbHVlTm9kZUhhc0NoaWxkcmVuOl8sb25WYWx1ZU5vZGVIYXNDaGlsZHJlbkNoYW5nZTp3LGNvbnRlbnRJZDp3ZCgpLHZhbHVlOlQsb25WYWx1ZUNoYW5nZTpNLG9wZW46JCxvbk9wZW5DaGFuZ2U6RSxkaXI6Qyx0cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWY6UixkaXNhYmxlZDpmfSxwLmNyZWF0ZUVsZW1lbnQoa2QuUHJvdmlkZXIse3Njb3BlOnR9LHAuY3JlYXRlRWxlbWVudChsQSx7c2NvcGU6ZS5fX3Njb3BlU2VsZWN0LG9uTmF0aXZlT3B0aW9uQWRkOnAudXNlQ2FsbGJhY2soWD0+e2FlKFA9Pm5ldyBTZXQoUCkuYWRkKFgpKX0sW10pLG9uTmF0aXZlT3B0aW9uUmVtb3ZlOnAudXNlQ2FsbGJhY2soWD0+e2FlKFA9Pntjb25zdCBPPW5ldyBTZXQoUCk7cmV0dXJuIE8uZGVsZXRlKFgpLE99KX0sW10pfSxuKSksaj9wLmNyZWF0ZUVsZW1lbnQoQ0Mse2tleTpILCJhcmlhLWhpZGRlbiI6ITAscmVxdWlyZWQ6aCx0YWJJbmRleDotMSxuYW1lOmMsYXV0b0NvbXBsZXRlOmQsdmFsdWU6VCxvbkNoYW5nZTpYPT5NKFgudGFyZ2V0LnZhbHVlKSxkaXNhYmxlZDpmfSxUPT09dm9pZCAwP3AuY3JlYXRlRWxlbWVudCgib3B0aW9uIix7dmFsdWU6IiJ9KTpudWxsLEFycmF5LmZyb20oRikpOm51bGwpKX0sdUE9IlNlbGVjdFRyaWdnZXIiLGNBPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixkaXNhYmxlZDpyPSExLC4uLm99PWUsaT0kbShuKSxsPVJpKHVBLG4pLHM9bC5kaXNhYmxlZHx8cixhPVhlKHQsbC5vblRyaWdnZXJDaGFuZ2UpLHU9RW0obiksW2MsZCxmXT1FQyhnPT57Y29uc3QgbT11KCkuZmlsdGVyKHk9PiF5LmRpc2FibGVkKSxTPW0uZmluZCh5PT55LnZhbHVlPT09bC52YWx1ZSksdj0kQyhtLGcsUyk7diE9PXZvaWQgMCYmbC5vblZhbHVlQ2hhbmdlKHYudmFsdWUpfSksaD0oKT0+e3N8fChsLm9uT3BlbkNoYW5nZSghMCksZigpKX07cmV0dXJuIHAuY3JlYXRlRWxlbWVudChmNSxlZSh7YXNDaGlsZDohMH0saSkscC5jcmVhdGVFbGVtZW50KERlLmJ1dHRvbixlZSh7dHlwZToiYnV0dG9uIixyb2xlOiJjb21ib2JveCIsImFyaWEtY29udHJvbHMiOmwuY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjpsLm9wZW4sImFyaWEtcmVxdWlyZWQiOmwucmVxdWlyZWQsImFyaWEtYXV0b2NvbXBsZXRlIjoibm9uZSIsZGlyOmwuZGlyLCJkYXRhLXN0YXRlIjpsLm9wZW4/Im9wZW4iOiJjbG9zZWQiLGRpc2FibGVkOnMsImRhdGEtZGlzYWJsZWQiOnM/IiI6dm9pZCAwLCJkYXRhLXBsYWNlaG9sZGVyIjpTQyhsLnZhbHVlKT8iIjp2b2lkIDB9LG8se3JlZjphLG9uQ2xpY2s6SGUoby5vbkNsaWNrLGc9PntnLmN1cnJlbnRUYXJnZXQuZm9jdXMoKX0pLG9uUG9pbnRlckRvd246SGUoby5vblBvaW50ZXJEb3duLGc9Pntjb25zdCBtPWcudGFyZ2V0O20uaGFzUG9pbnRlckNhcHR1cmUoZy5wb2ludGVySWQpJiZtLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShnLnBvaW50ZXJJZCksZy5idXR0b249PT0wJiZnLmN0cmxLZXk9PT0hMSYmKGgoKSxsLnRyaWdnZXJQb2ludGVyRG93blBvc1JlZi5jdXJyZW50PXt4Ok1hdGgucm91bmQoZy5wYWdlWCkseTpNYXRoLnJvdW5kKGcucGFnZVkpfSxnLnByZXZlbnREZWZhdWx0KCkpfSksb25LZXlEb3duOkhlKG8ub25LZXlEb3duLGc9Pntjb25zdCBtPWMuY3VycmVudCE9PSIiOyEoZy5jdHJsS2V5fHxnLmFsdEtleXx8Zy5tZXRhS2V5KSYmZy5rZXkubGVuZ3RoPT09MSYmZChnLmtleSksIShtJiZnLmtleT09PSIgIikmJm5BLmluY2x1ZGVzKGcua2V5KSYmKGgoKSxnLnByZXZlbnREZWZhdWx0KCkpfSl9KSkpfSksZEE9IlNlbGVjdFZhbHVlIixmQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sY2xhc3NOYW1lOnIsc3R5bGU6byxjaGlsZHJlbjppLHBsYWNlaG9sZGVyOmw9IiIsLi4uc309ZSxhPVJpKGRBLG4pLHtvblZhbHVlTm9kZUhhc0NoaWxkcmVuQ2hhbmdlOnV9PWEsYz1pIT09dm9pZCAwLGQ9WGUodCxhLm9uVmFsdWVOb2RlQ2hhbmdlKTtyZXR1cm4gJG4oKCk9Pnt1KGMpfSxbdSxjXSkscC5jcmVhdGVFbGVtZW50KERlLnNwYW4sZWUoe30scyx7cmVmOmQsc3R5bGU6e3BvaW50ZXJFdmVudHM6Im5vbmUifX0pLFNDKGEudmFsdWUpP3AuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwsbCk6aSl9KSxoQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sY2hpbGRyZW46ciwuLi5vfT1lO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoRGUuc3BhbixlZSh7ImFyaWEtaGlkZGVuIjohMH0sbyx7cmVmOnR9KSxyfHwi4pa8Iil9KSxwQT1lPT5wLmNyZWF0ZUVsZW1lbnQocDUsZWUoe2FzQ2hpbGQ6ITB9LGUpKSxPbD0iU2VsZWN0Q29udGVudCIsZ0E9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3Qgbj1SaShPbCxlLl9fc2NvcGVTZWxlY3QpLFtyLG9dPXAudXNlU3RhdGUoKTtpZigkbigoKT0+e28obmV3IERvY3VtZW50RnJhZ21lbnQpfSxbXSksIW4ub3Blbil7Y29uc3QgaT1yO3JldHVybiBpP0hyLmNyZWF0ZVBvcnRhbChwLmNyZWF0ZUVsZW1lbnQoX0Mse3Njb3BlOmUuX19zY29wZVNlbGVjdH0scC5jcmVhdGVFbGVtZW50KGtkLlNsb3Qse3Njb3BlOmUuX19zY29wZVNlbGVjdH0scC5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsZS5jaGlsZHJlbikpKSxpKTpudWxsfXJldHVybiBwLmNyZWF0ZUVsZW1lbnQobUEsZWUoe30sZSx7cmVmOnR9KSl9KSxScj0xMCxbX0MsVGRdPVpsKE9sKSxtQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4scG9zaXRpb246cj0iaXRlbS1hbGlnbmVkIixvbkNsb3NlQXV0b0ZvY3VzOm8sb25Fc2NhcGVLZXlEb3duOmksb25Qb2ludGVyRG93bk91dHNpZGU6bCxzaWRlOnMsc2lkZU9mZnNldDphLGFsaWduOnUsYWxpZ25PZmZzZXQ6YyxhcnJvd1BhZGRpbmc6ZCxjb2xsaXNpb25Cb3VuZGFyeTpmLGNvbGxpc2lvblBhZGRpbmc6aCxzdGlja3k6ZyxoaWRlV2hlbkRldGFjaGVkOm0sYXZvaWRDb2xsaXNpb25zOlMsLi4udn09ZSx5PVJpKE9sLG4pLFtfLHddPXAudXNlU3RhdGUobnVsbCksW0MsJF09cC51c2VTdGF0ZShudWxsKSxFPVhlKHQsWj0+dyhaKSksW1QsTV09cC51c2VTdGF0ZShudWxsKSxbUixqXT1wLnVzZVN0YXRlKG51bGwpLEY9RW0obiksW2FlLEhdPXAudXNlU3RhdGUoITEpLFg9cC51c2VSZWYoITEpO3AudXNlRWZmZWN0KCgpPT57aWYoXylyZXR1cm4gXzUoXyl9LFtfXSksY08oKTtjb25zdCBQPXAudXNlQ2FsbGJhY2soWj0+e2NvbnN0W2tlLC4uLmNlXT1GKCkubWFwKCRlPT4kZS5yZWYuY3VycmVudCksW19lXT1jZS5zbGljZSgtMSksbWU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtmb3IoY29uc3QgJGUgb2YgWilpZigkZT09PW1lfHwoJGU9PW51bGx8fCRlLnNjcm9sbEludG9WaWV3KHtibG9jazoibmVhcmVzdCJ9KSwkZT09PWtlJiZDJiYoQy5zY3JvbGxUb3A9MCksJGU9PT1fZSYmQyYmKEMuc2Nyb2xsVG9wPUMuc2Nyb2xsSGVpZ2h0KSwkZT09bnVsbHx8JGUuZm9jdXMoKSxkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09bWUpKXJldHVybn0sW0YsQ10pLE89cC51c2VDYWxsYmFjaygoKT0+UChbVCxfXSksW1AsVCxfXSk7cC51c2VFZmZlY3QoKCk9PnthZSYmTygpfSxbYWUsT10pO2NvbnN0e29uT3BlbkNoYW5nZTprLHRyaWdnZXJQb2ludGVyRG93blBvc1JlZjpJfT15O3AudXNlRWZmZWN0KCgpPT57aWYoXyl7bGV0IFo9e3g6MCx5OjB9O2NvbnN0IGtlPV9lPT57dmFyIG1lLCRlLEJlLFB0O1o9e3g6TWF0aC5hYnMoTWF0aC5yb3VuZChfZS5wYWdlWCktKChtZT0oJGU9SS5jdXJyZW50KT09PW51bGx8fCRlPT09dm9pZCAwP3ZvaWQgMDokZS54KSE9PW51bGwmJm1lIT09dm9pZCAwP21lOjApKSx5Ok1hdGguYWJzKE1hdGgucm91bmQoX2UucGFnZVkpLSgoQmU9KFB0PUkuY3VycmVudCk9PT1udWxsfHxQdD09PXZvaWQgMD92b2lkIDA6UHQueSkhPT1udWxsJiZCZSE9PXZvaWQgMD9CZTowKSl9fSxjZT1fZT0+e1oueDw9MTAmJloueTw9MTA/X2UucHJldmVudERlZmF1bHQoKTpfLmNvbnRhaW5zKF9lLnRhcmdldCl8fGsoITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIixrZSksSS5jdXJyZW50PW51bGx9O3JldHVybiBJLmN1cnJlbnQhPT1udWxsJiYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLGtlKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLGNlLHtjYXB0dXJlOiEwLG9uY2U6ITB9KSksKCk9Pntkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsa2UpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsY2Use2NhcHR1cmU6ITB9KX19fSxbXyxrLEldKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IFo9KCk9PmsoITEpO3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsWiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsWiksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYmx1ciIsWiksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsWil9fSxba10pO2NvbnN0W0wsVl09RUMoWj0+e2NvbnN0IGtlPUYoKS5maWx0ZXIobWU9PiFtZS5kaXNhYmxlZCksY2U9a2UuZmluZChtZT0+bWUucmVmLmN1cnJlbnQ9PT1kb2N1bWVudC5hY3RpdmVFbGVtZW50KSxfZT0kQyhrZSxaLGNlKTtfZSYmc2V0VGltZW91dCgoKT0+X2UucmVmLmN1cnJlbnQuZm9jdXMoKSl9KSx0ZT1wLnVzZUNhbGxiYWNrKChaLGtlLGNlKT0+e2NvbnN0IF9lPSFYLmN1cnJlbnQmJiFjZTsoeS52YWx1ZSE9PXZvaWQgMCYmeS52YWx1ZT09PWtlfHxfZSkmJihNKFopLF9lJiYoWC5jdXJyZW50PSEwKSl9LFt5LnZhbHVlXSkseWU9cC51c2VDYWxsYmFjaygoKT0+Xz09bnVsbD92b2lkIDA6Xy5mb2N1cygpLFtfXSksZmU9cC51c2VDYWxsYmFjaygoWixrZSxjZSk9Pntjb25zdCBfZT0hWC5jdXJyZW50JiYhY2U7KHkudmFsdWUhPT12b2lkIDAmJnkudmFsdWU9PT1rZXx8X2UpJiZqKFopfSxbeS52YWx1ZV0pLE9lPXI9PT0icG9wcGVyIj9DMDp2QSxiZT1PZT09PUMwP3tzaWRlOnMsc2lkZU9mZnNldDphLGFsaWduOnUsYWxpZ25PZmZzZXQ6YyxhcnJvd1BhZGRpbmc6ZCxjb2xsaXNpb25Cb3VuZGFyeTpmLGNvbGxpc2lvblBhZGRpbmc6aCxzdGlja3k6ZyxoaWRlV2hlbkRldGFjaGVkOm0sYXZvaWRDb2xsaXNpb25zOlN9Ont9O3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoX0Mse3Njb3BlOm4sY29udGVudDpfLHZpZXdwb3J0OkMsb25WaWV3cG9ydENoYW5nZTokLGl0ZW1SZWZDYWxsYmFjazp0ZSxzZWxlY3RlZEl0ZW06VCxvbkl0ZW1MZWF2ZTp5ZSxpdGVtVGV4dFJlZkNhbGxiYWNrOmZlLGZvY3VzU2VsZWN0ZWRJdGVtOk8sc2VsZWN0ZWRJdGVtVGV4dDpSLHBvc2l0aW9uOnIsaXNQb3NpdGlvbmVkOmFlLHNlYXJjaFJlZjpMfSxwLmNyZWF0ZUVsZW1lbnQodEEse2FzOiRsLGFsbG93UGluY2hab29tOiEwfSxwLmNyZWF0ZUVsZW1lbnQoZE8se2FzQ2hpbGQ6ITAsdHJhcHBlZDp5Lm9wZW4sb25Nb3VudEF1dG9Gb2N1czpaPT57Wi5wcmV2ZW50RGVmYXVsdCgpfSxvblVubW91bnRBdXRvRm9jdXM6SGUobyxaPT57dmFyIGtlOyhrZT15LnRyaWdnZXIpPT09bnVsbHx8a2U9PT12b2lkIDB8fGtlLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSksWi5wcmV2ZW50RGVmYXVsdCgpfSl9LHAuY3JlYXRlRWxlbWVudChzTyx7YXNDaGlsZDohMCxkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHM6ITAsb25Fc2NhcGVLZXlEb3duOmksb25Qb2ludGVyRG93bk91dHNpZGU6bCxvbkZvY3VzT3V0c2lkZTpaPT5aLnByZXZlbnREZWZhdWx0KCksb25EaXNtaXNzOigpPT55Lm9uT3BlbkNoYW5nZSghMSl9LHAuY3JlYXRlRWxlbWVudChPZSxlZSh7cm9sZToibGlzdGJveCIsaWQ6eS5jb250ZW50SWQsImRhdGEtc3RhdGUiOnkub3Blbj8ib3BlbiI6ImNsb3NlZCIsZGlyOnkuZGlyLG9uQ29udGV4dE1lbnU6Wj0+Wi5wcmV2ZW50RGVmYXVsdCgpfSx2LGJlLHtvblBsYWNlZDooKT0+SCghMCkscmVmOkUsc3R5bGU6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246ImNvbHVtbiIsb3V0bGluZToibm9uZSIsLi4udi5zdHlsZX0sb25LZXlEb3duOkhlKHYub25LZXlEb3duLFo9Pntjb25zdCBrZT1aLmN0cmxLZXl8fFouYWx0S2V5fHxaLm1ldGFLZXk7aWYoWi5rZXk9PT0iVGFiIiYmWi5wcmV2ZW50RGVmYXVsdCgpLCFrZSYmWi5rZXkubGVuZ3RoPT09MSYmVihaLmtleSksWyJBcnJvd1VwIiwiQXJyb3dEb3duIiwiSG9tZSIsIkVuZCJdLmluY2x1ZGVzKFoua2V5KSl7bGV0IF9lPUYoKS5maWx0ZXIobWU9PiFtZS5kaXNhYmxlZCkubWFwKG1lPT5tZS5yZWYuY3VycmVudCk7aWYoWyJBcnJvd1VwIiwiRW5kIl0uaW5jbHVkZXMoWi5rZXkpJiYoX2U9X2Uuc2xpY2UoKS5yZXZlcnNlKCkpLFsiQXJyb3dVcCIsIkFycm93RG93biJdLmluY2x1ZGVzKFoua2V5KSl7Y29uc3QgbWU9Wi50YXJnZXQsJGU9X2UuaW5kZXhPZihtZSk7X2U9X2Uuc2xpY2UoJGUrMSl9c2V0VGltZW91dCgoKT0+UChfZSkpLFoucHJldmVudERlZmF1bHQoKX19KX0pKSkpKSl9KSx2QT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sb25QbGFjZWQ6ciwuLi5vfT1lLGk9UmkoT2wsbiksbD1UZChPbCxuKSxbcyxhXT1wLnVzZVN0YXRlKG51bGwpLFt1LGNdPXAudXNlU3RhdGUobnVsbCksZD1YZSh0LEU9PmMoRSkpLGY9RW0obiksaD1wLnVzZVJlZighMSksZz1wLnVzZVJlZighMCkse3ZpZXdwb3J0Om0sc2VsZWN0ZWRJdGVtOlMsc2VsZWN0ZWRJdGVtVGV4dDp2LGZvY3VzU2VsZWN0ZWRJdGVtOnl9PWwsXz1wLnVzZUNhbGxiYWNrKCgpPT57aWYoaS50cmlnZ2VyJiZpLnZhbHVlTm9kZSYmcyYmdSYmbSYmUyYmdil7Y29uc3QgRT1pLnRyaWdnZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksVD11LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLE09aS52YWx1ZU5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksUj12LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKGkuZGlyIT09InJ0bCIpe2NvbnN0IG1lPVIubGVmdC1ULmxlZnQsJGU9TS5sZWZ0LW1lLEJlPUUubGVmdC0kZSxQdD1FLndpZHRoK0JlLHNuPU1hdGgubWF4KFB0LFQud2lkdGgpLFJuPXdpbmRvdy5pbm5lcldpZHRoLVJyLFRlPUFoKCRlLFtScixSbi1zbl0pO3Muc3R5bGUubWluV2lkdGg9UHQrInB4IixzLnN0eWxlLmxlZnQ9VGUrInB4In1lbHNle2NvbnN0IG1lPVQucmlnaHQtUi5yaWdodCwkZT13aW5kb3cuaW5uZXJXaWR0aC1NLnJpZ2h0LW1lLEJlPXdpbmRvdy5pbm5lcldpZHRoLUUucmlnaHQtJGUsUHQ9RS53aWR0aCtCZSxzbj1NYXRoLm1heChQdCxULndpZHRoKSxSbj13aW5kb3cuaW5uZXJXaWR0aC1ScixUZT1BaCgkZSxbUnIsUm4tc25dKTtzLnN0eWxlLm1pbldpZHRoPVB0KyJweCIscy5zdHlsZS5yaWdodD1UZSsicHgifWNvbnN0IGo9ZigpLEY9d2luZG93LmlubmVySGVpZ2h0LVJyKjIsYWU9bS5zY3JvbGxIZWlnaHQsSD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh1KSxYPXBhcnNlSW50KEguYm9yZGVyVG9wV2lkdGgsMTApLFA9cGFyc2VJbnQoSC5wYWRkaW5nVG9wLDEwKSxPPXBhcnNlSW50KEguYm9yZGVyQm90dG9tV2lkdGgsMTApLGs9cGFyc2VJbnQoSC5wYWRkaW5nQm90dG9tLDEwKSxJPVgrUCthZStrK08sTD1NYXRoLm1pbihTLm9mZnNldEhlaWdodCo1LEkpLFY9d2luZG93LmdldENvbXB1dGVkU3R5bGUobSksdGU9cGFyc2VJbnQoVi5wYWRkaW5nVG9wLDEwKSx5ZT1wYXJzZUludChWLnBhZGRpbmdCb3R0b20sMTApLGZlPUUudG9wK0UuaGVpZ2h0LzItUnIsT2U9Ri1mZSxiZT1TLm9mZnNldEhlaWdodC8yLFo9Uy5vZmZzZXRUb3ArYmUsa2U9WCtQK1osY2U9SS1rZTtpZihrZTw9ZmUpe2NvbnN0IG1lPVM9PT1qW2oubGVuZ3RoLTFdLnJlZi5jdXJyZW50O3Muc3R5bGUuYm90dG9tPSIwcHgiO2NvbnN0ICRlPXUuY2xpZW50SGVpZ2h0LW0ub2Zmc2V0VG9wLW0ub2Zmc2V0SGVpZ2h0LEJlPU1hdGgubWF4KE9lLGJlKyhtZT95ZTowKSskZStPKSxQdD1rZStCZTtzLnN0eWxlLmhlaWdodD1QdCsicHgifWVsc2V7Y29uc3QgbWU9Uz09PWpbMF0ucmVmLmN1cnJlbnQ7cy5zdHlsZS50b3A9IjBweCI7Y29uc3QgQmU9TWF0aC5tYXgoZmUsWCttLm9mZnNldFRvcCsobWU/dGU6MCkrYmUpK2NlO3Muc3R5bGUuaGVpZ2h0PUJlKyJweCIsbS5zY3JvbGxUb3A9a2UtZmUrbS5vZmZzZXRUb3B9cy5zdHlsZS5tYXJnaW49YCR7UnJ9cHggMGAscy5zdHlsZS5taW5IZWlnaHQ9TCsicHgiLHMuc3R5bGUubWF4SGVpZ2h0PUYrInB4IixyPT1udWxsfHxyKCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT5oLmN1cnJlbnQ9ITApfX0sW2YsaS50cmlnZ2VyLGkudmFsdWVOb2RlLHMsdSxtLFMsdixpLmRpcixyXSk7JG4oKCk9Pl8oKSxbX10pO2NvbnN0W3csQ109cC51c2VTdGF0ZSgpOyRuKCgpPT57dSYmQyh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh1KS56SW5kZXgpfSxbdV0pO2NvbnN0ICQ9cC51c2VDYWxsYmFjayhFPT57RSYmZy5jdXJyZW50PT09ITAmJihfKCkseT09bnVsbHx8eSgpLGcuY3VycmVudD0hMSl9LFtfLHldKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHlBLHtzY29wZTpuLGNvbnRlbnRXcmFwcGVyOnMsc2hvdWxkRXhwYW5kT25TY3JvbGxSZWY6aCxvblNjcm9sbEJ1dHRvbkNoYW5nZTokfSxwLmNyZWF0ZUVsZW1lbnQoImRpdiIse3JlZjphLHN0eWxlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLHBvc2l0aW9uOiJmaXhlZCIsekluZGV4Ond9fSxwLmNyZWF0ZUVsZW1lbnQoRGUuZGl2LGVlKHt9LG8se3JlZjpkLHN0eWxlOntib3hTaXppbmc6ImJvcmRlci1ib3giLG1heEhlaWdodDoiMTAwJSIsLi4uby5zdHlsZX19KSkpKX0pLEMwPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixhbGlnbjpyPSJzdGFydCIsY29sbGlzaW9uUGFkZGluZzpvPVJyLC4uLml9PWUsbD0kbShuKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KGg1LGVlKHt9LGwsaSx7cmVmOnQsYWxpZ246cixjb2xsaXNpb25QYWRkaW5nOm8sc3R5bGU6e2JveFNpemluZzoiYm9yZGVyLWJveCIsLi4uaS5zdHlsZSwiLS1yYWRpeC1zZWxlY3QtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luIjoidmFyKC0tcmFkaXgtcG9wcGVyLXRyYW5zZm9ybS1vcmlnaW4pIiwiLS1yYWRpeC1zZWxlY3QtY29udGVudC1hdmFpbGFibGUtd2lkdGgiOiJ2YXIoLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLXdpZHRoKSIsIi0tcmFkaXgtc2VsZWN0LWNvbnRlbnQtYXZhaWxhYmxlLWhlaWdodCI6InZhcigtLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0KSIsIi0tcmFkaXgtc2VsZWN0LXRyaWdnZXItd2lkdGgiOiJ2YXIoLS1yYWRpeC1wb3BwZXItYW5jaG9yLXdpZHRoKSIsIi0tcmFkaXgtc2VsZWN0LXRyaWdnZXItaGVpZ2h0IjoidmFyKC0tcmFkaXgtcG9wcGVyLWFuY2hvci1oZWlnaHQpIn19KSl9KSxbeUEseEFdPVpsKE9sLHt9KSxFMD0iU2VsZWN0Vmlld3BvcnQiLF9BPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6biwuLi5yfT1lLG89VGQoRTAsbiksaT14QShFMCxuKSxsPVhlKHQsby5vblZpZXdwb3J0Q2hhbmdlKSxzPXAudXNlUmVmKDApO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLHAuY3JlYXRlRWxlbWVudCgic3R5bGUiLHtkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOiJbZGF0YS1yYWRpeC1zZWxlY3Qtdmlld3BvcnRde3Njcm9sbGJhci13aWR0aDpub25lOy1tcy1vdmVyZmxvdy1zdHlsZTpub25lOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoO31bZGF0YS1yYWRpeC1zZWxlY3Qtdmlld3BvcnRdOjotd2Via2l0LXNjcm9sbGJhcntkaXNwbGF5Om5vbmV9In19KSxwLmNyZWF0ZUVsZW1lbnQoa2QuU2xvdCx7c2NvcGU6bn0scC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7ImRhdGEtcmFkaXgtc2VsZWN0LXZpZXdwb3J0IjoiIixyb2xlOiJwcmVzZW50YXRpb24ifSxyLHtyZWY6bCxzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIixmbGV4OjEsb3ZlcmZsb3c6ImF1dG8iLC4uLnIuc3R5bGV9LG9uU2Nyb2xsOkhlKHIub25TY3JvbGwsYT0+e2NvbnN0IHU9YS5jdXJyZW50VGFyZ2V0LHtjb250ZW50V3JhcHBlcjpjLHNob3VsZEV4cGFuZE9uU2Nyb2xsUmVmOmR9PWk7aWYoZCE9bnVsbCYmZC5jdXJyZW50JiZjKXtjb25zdCBmPU1hdGguYWJzKHMuY3VycmVudC11LnNjcm9sbFRvcCk7aWYoZj4wKXtjb25zdCBoPXdpbmRvdy5pbm5lckhlaWdodC1ScioyLGc9cGFyc2VGbG9hdChjLnN0eWxlLm1pbkhlaWdodCksbT1wYXJzZUZsb2F0KGMuc3R5bGUuaGVpZ2h0KSxTPU1hdGgubWF4KGcsbSk7aWYoUzxoKXtjb25zdCB2PVMrZix5PU1hdGgubWluKGgsdiksXz12LXk7Yy5zdHlsZS5oZWlnaHQ9eSsicHgiLGMuc3R5bGUuYm90dG9tPT09IjBweCImJih1LnNjcm9sbFRvcD1fPjA/XzowLGMuc3R5bGUuanVzdGlmeUNvbnRlbnQ9ImZsZXgtZW5kIil9fX1zLmN1cnJlbnQ9dS5zY3JvbGxUb3B9KX0pKSkpfSksd0E9IlNlbGVjdEdyb3VwIixbXzQsU0FdPVpsKHdBKSxDQT0iU2VsZWN0TGFiZWwiLEVBPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6biwuLi5yfT1lLG89U0EoQ0Esbik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoe2lkOm8uaWR9LHIse3JlZjp0fSkpfSksU3A9IlNlbGVjdEl0ZW0iLFskQSx3Q109WmwoU3ApLGtBPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bix2YWx1ZTpyLGRpc2FibGVkOm89ITEsdGV4dFZhbHVlOmksLi4ubH09ZSxzPVJpKFNwLG4pLGE9VGQoU3AsbiksdT1zLnZhbHVlPT09cixbYyxkXT1wLnVzZVN0YXRlKGk/PyIiKSxbZixoXT1wLnVzZVN0YXRlKCExKSxnPVhlKHQsdj0+e3ZhciB5O3JldHVybih5PWEuaXRlbVJlZkNhbGxiYWNrKT09PW51bGx8fHk9PT12b2lkIDA/dm9pZCAwOnkuY2FsbChhLHYscixvKX0pLG09d2QoKSxTPSgpPT57b3x8KHMub25WYWx1ZUNoYW5nZShyKSxzLm9uT3BlbkNoYW5nZSghMSkpfTtpZihyPT09IiIpdGhyb3cgbmV3IEVycm9yKCJBIDxTZWxlY3QuSXRlbSAvPiBtdXN0IGhhdmUgYSB2YWx1ZSBwcm9wIHRoYXQgaXMgbm90IGFuIGVtcHR5IHN0cmluZy4gVGhpcyBpcyBiZWNhdXNlIHRoZSBTZWxlY3QgdmFsdWUgY2FuIGJlIHNldCB0byBhbiBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIHNlbGVjdGlvbiBhbmQgc2hvdyB0aGUgcGxhY2Vob2xkZXIuIik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudCgkQSx7c2NvcGU6bix2YWx1ZTpyLGRpc2FibGVkOm8sdGV4dElkOm0saXNTZWxlY3RlZDp1LG9uSXRlbVRleHRDaGFuZ2U6cC51c2VDYWxsYmFjayh2PT57ZCh5PT57dmFyIF87cmV0dXJuIHl8fCgoXz12PT1udWxsP3ZvaWQgMDp2LnRleHRDb250ZW50KSE9PW51bGwmJl8hPT12b2lkIDA/XzoiIikudHJpbSgpfSl9LFtdKX0scC5jcmVhdGVFbGVtZW50KGtkLkl0ZW1TbG90LHtzY29wZTpuLHZhbHVlOnIsZGlzYWJsZWQ6byx0ZXh0VmFsdWU6Y30scC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7cm9sZToib3B0aW9uIiwiYXJpYS1sYWJlbGxlZGJ5IjptLCJkYXRhLWhpZ2hsaWdodGVkIjpmPyIiOnZvaWQgMCwiYXJpYS1zZWxlY3RlZCI6dSYmZiwiZGF0YS1zdGF0ZSI6dT8iY2hlY2tlZCI6InVuY2hlY2tlZCIsImFyaWEtZGlzYWJsZWQiOm98fHZvaWQgMCwiZGF0YS1kaXNhYmxlZCI6bz8iIjp2b2lkIDAsdGFiSW5kZXg6bz92b2lkIDA6LTF9LGwse3JlZjpnLG9uRm9jdXM6SGUobC5vbkZvY3VzLCgpPT5oKCEwKSksb25CbHVyOkhlKGwub25CbHVyLCgpPT5oKCExKSksb25Qb2ludGVyVXA6SGUobC5vblBvaW50ZXJVcCxTKSxvblBvaW50ZXJNb3ZlOkhlKGwub25Qb2ludGVyTW92ZSx2PT57aWYobyl7dmFyIHk7KHk9YS5vbkl0ZW1MZWF2ZSk9PT1udWxsfHx5PT09dm9pZCAwfHx5LmNhbGwoYSl9ZWxzZSB2LmN1cnJlbnRUYXJnZXQuZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KX0pLG9uUG9pbnRlckxlYXZlOkhlKGwub25Qb2ludGVyTGVhdmUsdj0+e2lmKHYuY3VycmVudFRhcmdldD09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpe3ZhciB5Oyh5PWEub25JdGVtTGVhdmUpPT09bnVsbHx8eT09PXZvaWQgMHx8eS5jYWxsKGEpfX0pLG9uS2V5RG93bjpIZShsLm9uS2V5RG93bix2PT57dmFyIHk7KCh5PWEuc2VhcmNoUmVmKT09PW51bGx8fHk9PT12b2lkIDA/dm9pZCAwOnkuY3VycmVudCkhPT0iIiYmdi5rZXk9PT0iICJ8fChyQS5pbmNsdWRlcyh2LmtleSkmJlMoKSx2LmtleT09PSIgIiYmdi5wcmV2ZW50RGVmYXVsdCgpKX0pfSkpKSl9KSxDdT0iU2VsZWN0SXRlbVRleHQiLFRBPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixjbGFzc05hbWU6cixzdHlsZTpvLC4uLml9PWUsbD1SaShDdSxuKSxzPVRkKEN1LG4pLGE9d0MoQ3UsbiksdT1zQShDdSxuKSxbYyxkXT1wLnVzZVN0YXRlKG51bGwpLGY9WGUodCx2PT5kKHYpLGEub25JdGVtVGV4dENoYW5nZSx2PT57dmFyIHk7cmV0dXJuKHk9cy5pdGVtVGV4dFJlZkNhbGxiYWNrKT09PW51bGx8fHk9PT12b2lkIDA/dm9pZCAwOnkuY2FsbChzLHYsYS52YWx1ZSxhLmRpc2FibGVkKX0pLGg9Yz09bnVsbD92b2lkIDA6Yy50ZXh0Q29udGVudCxnPXAudXNlTWVtbygoKT0+cC5jcmVhdGVFbGVtZW50KCJvcHRpb24iLHtrZXk6YS52YWx1ZSx2YWx1ZTphLnZhbHVlLGRpc2FibGVkOmEuZGlzYWJsZWR9LGgpLFthLmRpc2FibGVkLGEudmFsdWUsaF0pLHtvbk5hdGl2ZU9wdGlvbkFkZDptLG9uTmF0aXZlT3B0aW9uUmVtb3ZlOlN9PXU7cmV0dXJuICRuKCgpPT4obShnKSwoKT0+UyhnKSksW20sUyxnXSkscC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxwLmNyZWF0ZUVsZW1lbnQoRGUuc3BhbixlZSh7aWQ6YS50ZXh0SWR9LGkse3JlZjpmfSkpLGEuaXNTZWxlY3RlZCYmbC52YWx1ZU5vZGUmJiFsLnZhbHVlTm9kZUhhc0NoaWxkcmVuP0hyLmNyZWF0ZVBvcnRhbChpLmNoaWxkcmVuLGwudmFsdWVOb2RlKTpudWxsKX0pLE5BPSJTZWxlY3RJdGVtSW5kaWNhdG9yIixiQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sLi4ucn09ZTtyZXR1cm4gd0MoTkEsbikuaXNTZWxlY3RlZD9wLmNyZWF0ZUVsZW1lbnQoRGUuc3BhbixlZSh7ImFyaWEtaGlkZGVuIjohMH0scix7cmVmOnR9KSk6bnVsbH0pLFJBPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6biwuLi5yfT1lO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoRGUuZGl2LGVlKHsiYXJpYS1oaWRkZW4iOiEwfSxyLHtyZWY6dH0pKX0pO2Z1bmN0aW9uIFNDKGUpe3JldHVybiBlPT09IiJ8fGU9PT12b2lkIDB9Y29uc3QgQ0M9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dmFsdWU6biwuLi5yfT1lLG89cC51c2VSZWYobnVsbCksaT1YZSh0LG8pLGw9Y0Mobik7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3Qgcz1vLmN1cnJlbnQsYT13aW5kb3cuSFRNTFNlbGVjdEVsZW1lbnQucHJvdG90eXBlLGM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLCJ2YWx1ZSIpLnNldDtpZihsIT09biYmYyl7Y29uc3QgZD1uZXcgRXZlbnQoImNoYW5nZSIse2J1YmJsZXM6ITB9KTtjLmNhbGwocyxuKSxzLmRpc3BhdGNoRXZlbnQoZCl9fSxbbCxuXSkscC5jcmVhdGVFbGVtZW50KG01LHthc0NoaWxkOiEwfSxwLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIsZWUoe30scix7cmVmOmksZGVmYXVsdFZhbHVlOm59KSkpfSk7Q0MuZGlzcGxheU5hbWU9IkJ1YmJsZVNlbGVjdCI7ZnVuY3Rpb24gRUMoZSl7Y29uc3QgdD1WdChlKSxuPXAudXNlUmVmKCIiKSxyPXAudXNlUmVmKDApLG89cC51c2VDYWxsYmFjayhsPT57Y29uc3Qgcz1uLmN1cnJlbnQrbDt0KHMpLGZ1bmN0aW9uIGEodSl7bi5jdXJyZW50PXUsd2luZG93LmNsZWFyVGltZW91dChyLmN1cnJlbnQpLHUhPT0iIiYmKHIuY3VycmVudD13aW5kb3cuc2V0VGltZW91dCgoKT0+YSgiIiksMWUzKSl9KHMpfSxbdF0pLGk9cC51c2VDYWxsYmFjaygoKT0+e24uY3VycmVudD0iIix3aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCl9LFtdKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PigpPT53aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCksW10pLFtuLG8saV19ZnVuY3Rpb24gJEMoZSx0LG4pe2NvbnN0IG89dC5sZW5ndGg+MSYmQXJyYXkuZnJvbSh0KS5ldmVyeSh1PT51PT09dFswXSk/dFswXTp0LGk9bj9lLmluZGV4T2Yobik6LTE7bGV0IGw9UEEoZSxNYXRoLm1heChpLDApKTtvLmxlbmd0aD09PTEmJihsPWwuZmlsdGVyKHU9PnUhPT1uKSk7Y29uc3QgYT1sLmZpbmQodT0+dS50ZXh0VmFsdWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG8udG9Mb3dlckNhc2UoKSkpO3JldHVybiBhIT09bj9hOnZvaWQgMH1mdW5jdGlvbiBQQShlLHQpe3JldHVybiBlLm1hcCgobixyKT0+ZVsodCtyKSVlLmxlbmd0aF0pfWNvbnN0IE9BPWFBLGtDPWNBLEFBPWZBLE1BPWhBLERBPXBBLFRDPWdBLExBPV9BLE5DPUVBLGJDPWtBLElBPVRBLGpBPWJBLFJDPVJBLHpBPU9BLEZBPUFBLFBDPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLGNoaWxkcmVuOnQsLi4ubn0scik9PnguanN4cyhrQyx7cmVmOnIsY2xhc3NOYW1lOm90KCJmbGV4IGgtMTAgdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWlucHV0IGJnLWJhY2tncm91bmQgcHgtMyBweS0yIHRleHQtc20gcmluZy1vZmZzZXQtYmFja2dyb3VuZCBwbGFjZWhvbGRlcjp0ZXh0LW11dGVkLWZvcmVncm91bmQgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLXJpbmcgZm9jdXM6cmluZy1vZmZzZXQtMiBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCIsZSksLi4ubixjaGlsZHJlbjpbdCx4LmpzeChNQSx7YXNDaGlsZDohMCxjaGlsZHJlbjp4LmpzeChEUyx7Y2xhc3NOYW1lOiJ3LTQgaC00IG9wYWNpdHktNTAifSl9KV19KSk7UEMuZGlzcGxheU5hbWU9a0MuZGlzcGxheU5hbWU7Y29uc3QgT0M9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsY2hpbGRyZW46dCxwb3NpdGlvbjpuPSJwb3BwZXIiLC4uLnJ9LG8pPT54LmpzeChEQSx7Y2hpbGRyZW46eC5qc3goVEMse3JlZjpvLGNsYXNzTmFtZTpvdCgicmVsYXRpdmUgei01MCBtaW4tdy1bOHJlbV0gb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtbWQgYm9yZGVyIGJnLXBvcG92ZXIgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQgc2hhZG93LW1kIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmZhZGUtb3V0LTAgZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wIGRhdGEtW3N0YXRlPWNsb3NlZF06em9vbS1vdXQtOTUgZGF0YS1bc3RhdGU9b3Blbl06em9vbS1pbi05NSBkYXRhLVtzaWRlPWJvdHRvbV06c2xpZGUtaW4tZnJvbS10b3AtMiBkYXRhLVtzaWRlPWxlZnRdOnNsaWRlLWluLWZyb20tcmlnaHQtMiBkYXRhLVtzaWRlPXJpZ2h0XTpzbGlkZS1pbi1mcm9tLWxlZnQtMiBkYXRhLVtzaWRlPXRvcF06c2xpZGUtaW4tZnJvbS1ib3R0b20tMiIsbj09PSJwb3BwZXIiJiYiZGF0YS1bc2lkZT1ib3R0b21dOnRyYW5zbGF0ZS15LTEgZGF0YS1bc2lkZT1sZWZ0XTotdHJhbnNsYXRlLXgtMSBkYXRhLVtzaWRlPXJpZ2h0XTp0cmFuc2xhdGUteC0xIGRhdGEtW3NpZGU9dG9wXTotdHJhbnNsYXRlLXktMSIsZSkscG9zaXRpb246biwuLi5yLGNoaWxkcmVuOnguanN4KExBLHtjbGFzc05hbWU6b3QoInAtMSIsbj09PSJwb3BwZXIiJiYiaC1bdmFyKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItaGVpZ2h0KV0gdy1mdWxsIG1pbi13LVt2YXIoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci13aWR0aCldIiksY2hpbGRyZW46dH0pfSl9KSk7T0MuZGlzcGxheU5hbWU9VEMuZGlzcGxheU5hbWU7Y29uc3QgQkE9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PnguanN4KE5DLHtyZWY6bixjbGFzc05hbWU6b3QoInB5LTEuNSBwbC04IHByLTIgdGV4dC1zbSBmb250LXNlbWlib2xkIixlKSwuLi50fSkpO0JBLmRpc3BsYXlOYW1lPU5DLmRpc3BsYXlOYW1lO2NvbnN0IEFDPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLGNoaWxkcmVuOnQsLi4ubn0scik9PnguanN4cyhiQyx7cmVmOnIsY2xhc3NOYW1lOm90KCJyZWxhdGl2ZSBmbGV4IHctZnVsbCBjdXJzb3ItZGVmYXVsdCBzZWxlY3Qtbm9uZSBpdGVtcy1jZW50ZXIgcm91bmRlZC1zbSBweS0xLjUgcGwtOCBwci0yIHRleHQtc20gb3V0bGluZS1ub25lIGZvY3VzOmJnLWFjY2VudCBmb2N1czp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIGRhdGEtW2Rpc2FibGVkXTpwb2ludGVyLWV2ZW50cy1ub25lIGRhdGEtW2Rpc2FibGVkXTpvcGFjaXR5LTUwIixlKSwuLi5uLGNoaWxkcmVuOlt4LmpzeCgic3BhbiIse2NsYXNzTmFtZToiYWJzb2x1dGUgbGVmdC0yIGZsZXggaC0zLjUgdy0zLjUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIixjaGlsZHJlbjp4LmpzeChqQSx7Y2hpbGRyZW46eC5qc3goeFAse2NsYXNzTmFtZToidy00IGgtNCJ9KX0pfSkseC5qc3goSUEse2NoaWxkcmVuOnR9KV19KSk7QUMuZGlzcGxheU5hbWU9YkMuZGlzcGxheU5hbWU7Y29uc3QgV0E9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PnguanN4KFJDLHtyZWY6bixjbGFzc05hbWU6b3QoIi1teC0xIG15LTEgaC1weCBiZy1tdXRlZCIsZSksLi4udH0pKTtXQS5kaXNwbGF5TmFtZT1SQy5kaXNwbGF5TmFtZTtmdW5jdGlvbiBNQyh7cGF0aDplLGRpc2FibGVkOnQsc291cmNlOm4sc2NoZW1hOnIscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm8sb25TdWJtaXQ6aX0pe3JldHVybih0eXBlb2Ygbj09InN0cmluZyJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0ic3RyaW5nIj94LmpzeChHQSx7ZGVmYXVsdFZhbHVlOm4sZGlzYWJsZWQ6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6byxvblN1Ym1pdDppfSk6KHR5cGVvZiBuPT0ibnVtYmVyInx8bj09PW51bGwpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJudW1iZXIiP3guanN4KEtBLHtkZWZhdWx0VmFsdWU6bixkaXNhYmxlZDp0LHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazpvLG9uU3VibWl0Oml9KToodHlwZW9mIG49PSJudW1iZXIifHx0eXBlb2Ygbj09InN0cmluZyJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0ia2V5T2YiP3guanN4KEhBLHtkZWZhdWx0VmFsdWU6bixkaXNhYmxlZDp0LHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazpvLG9uU3VibWl0Omksc2VsZWN0b3I6ci5zZWxlY3Rvcn0pOih0eXBlb2Ygbj09Im9iamVjdCJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0icmljaHRleHQiP3guanN4KFZBLHtyZWdpc3RlclBhdGNoQ2FsbGJhY2s6byxvblN1Ym1pdDppLGRlZmF1bHRWYWx1ZTpufSk6KHR5cGVvZiBuPT0ib2JqZWN0Inx8bj09PW51bGwpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJpbWFnZSI/eC5qc3goVUEse3BhdGg6ZSxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6byxvblN1Ym1pdDppLGRlZmF1bHRWYWx1ZTpufSk6eC5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbIlVuc3VwcG9ydGVkIHNjaGVtYTogIixyLnR5cGVdfSl9ZnVuY3Rpb24gJDAoZSx0LG4scil7aWYoIXR8fCFyKXJldHVybltdO2NvbnN0IG89ci5zaGEyNTYuc2xpY2UoMCw1KSxpPWZ1bmN0aW9uKCl7Y29uc3QgbD1PZyh0KT8/InVua25vd24iLHM9QWcobCk7cmV0dXJuIG4/YC9wdWJsaWMvJHtuLnNwbGl0KCIuIikuc2xpY2UoMCwtMSkuam9pbigiLiIpfHxufV8ke299LiR7c31gOmAvcHVibGljLyR7ci5zaGEyNTZ9LiR7c31gfSgpO3JldHVyblt7dmFsdWU6e1tobl06aSxbS3RdOiJmaWxlIixtZXRhZGF0YTpyfSxvcDoicmVwbGFjZSIscGF0aDplfSx7dmFsdWU6dCxvcDoiZmlsZSIscGF0aDplLGZpbGVQYXRoOml9XX1mdW5jdGlvbiBVQSh7cGF0aDplLGRlZmF1bHRWYWx1ZTp0LG9uU3VibWl0Om4scmVnaXN0ZXJQYXRjaENhbGxiYWNrOnJ9KXtjb25zdFtvLGldPXAudXNlU3RhdGUobnVsbCksW2wsc109cC51c2VTdGF0ZSghMSksW2EsdV09cC51c2VTdGF0ZSgpLFtjLGRdPXAudXNlU3RhdGUoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntkKHQmJnduLmNvbnZlcnRGaWxlU291cmNlKHQpLnVybCl9LFt0XSkscC51c2VFZmZlY3QoKCk9PntyJiZyKGFzeW5jIGY9PiQwKGYsKG89PW51bGw/dm9pZCAwOm8uc3JjKT8/bnVsbCwobz09bnVsbD92b2lkIDA6by5maWxlbmFtZSk/P251bGwsYSkpfSxbbyx0XSkseC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6Im1heC13LTR4bCBwLTQiLGNoaWxkcmVuOlt4LmpzeHMoImxhYmVsIix7aHRtbEZvcjpgaW1nX2lucHV0OiR7ZX1gLGNsYXNzTmFtZToiIixjaGlsZHJlbjpbb3x8Yz94LmpzeCgiaW1nIix7c3JjOihvPT1udWxsP3ZvaWQgMDpvLnNyYyl8fGN9KTp4LmpzeCgiZGl2Iix7Y2hpbGRyZW46IkVtcHR5In0pLHguanN4KCJpbnB1dCIse2lkOmBpbWdfaW5wdXQ6JHtlfWAsdHlwZToiZmlsZSIsaGlkZGVuOiEwLG9uQ2hhbmdlOmY9PntiUyhmKS50aGVuKGg9PntpKHtzcmM6aC5zcmMsZmlsZW5hbWU6aC5maWxlbmFtZX0pLGgud2lkdGgmJmguaGVpZ2h0P3Uoe3NoYTI1NjpoLnNoYTI1Nix3aWR0aDpoLndpZHRoLGhlaWdodDpoLmhlaWdodH0pOnUodm9pZCAwKX0pLmNhdGNoKGg9Pntjb25zb2xlLmVycm9yKGgubWVzc2FnZSksaShudWxsKSx1KHZvaWQgMCl9KX19KV19KSxuJiZ4LmpzeCgiZGl2Iix7Y2hpbGRyZW46byYmeC5qc3goWGwse2Rpc2FibGVkOmwsb25DbGljazooKT0+e3MoITApLG4oZj0+UHJvbWlzZS5yZXNvbHZlKCQwKGYsby5zcmMsby5maWxlbmFtZT8/bnVsbCxhKSkpLmZpbmFsbHkoKCk9PntzKCExKSxpKG51bGwpLHUodm9pZCAwKX0pfSxjaGlsZHJlbjpsPyJTYXZpbmcuLi4iOiJTdWJtaXQifSl9KV19LGUpfWFzeW5jIGZ1bmN0aW9uIGswKGUsdCl7Y29uc3R7dGVtcGxhdGVTdHJpbmdzOm4sZXhwcnM6cixmaWxlczpvfT10P2F3YWl0IFlQKHQuZ2V0RWRpdG9yU3RhdGUoKS50b0pTT04oKS5yb290KTp7W0t0XToicmljaHRleHQiLHRlbXBsYXRlU3RyaW5nczpbIiJdLGV4cHJzOltdLGZpbGVzOnt9fTtyZXR1cm5be29wOiJyZXBsYWNlIixwYXRoOmUsdmFsdWU6e3RlbXBsYXRlU3RyaW5nczpuLGV4cHJzOnIsW0t0XToicmljaHRleHQifX0sLi4uT2JqZWN0LmVudHJpZXMobykubWFwKChbaSxsXSk9Pih7b3A6ImZpbGUiLHBhdGg6ZSxmaWxlUGF0aDppLHZhbHVlOmx9KSldfWZ1bmN0aW9uIFZBKHtkZWZhdWx0VmFsdWU6ZSxvblN1Ym1pdDp0LHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazpufSl7Y29uc3RbcixvXT1wLnVzZVN0YXRlKG51bGwpLFtpLGxdPXAudXNlU3RhdGUoITEpLFtzLGFdPXAudXNlU3RhdGUoITEpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e3ImJihsKCExKSxyLnJlZ2lzdGVyVGV4dENvbnRlbnRMaXN0ZW5lcigoKT0+e2woITApfSksci5yZWdpc3RlckRlY29yYXRvckxpc3RlbmVyKCgpPT57bCghMCl9KSl9LFtyXSkscC51c2VFZmZlY3QoKCk9PntyJiZuJiZuKHU9PmswKHUscikpfSxbcl0pLHguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgYm9yZGVyIHJvdW5kZWQgYm9yZGVyLWNhcmQiLGNoaWxkcmVuOlt4LmpzeChtUCx7b25FZGl0b3I6dT0+e28odSl9LHJpY2h0ZXh0OmV8fHtjaGlsZHJlbjpbXSxbS3RdOiJyb290In19KSx0JiZ4LmpzeCgiZGl2Iix7Y2hpbGRyZW46aSYmeC5qc3goWGwse2Rpc2FibGVkOnN8fCFyLG9uQ2xpY2s6KCk9PntyJiYoYSghMCksdCh1PT5rMCh1LHIpKS5maW5hbGx5KCgpPT57YSghMSksbCghMSl9KSl9LGNoaWxkcmVuOnM/IlNhdmluZy4uLiI6IlN1Ym1pdCJ9KX0pXX0pfWZ1bmN0aW9uIEhBKHtkaXNhYmxlZDplLGRlZmF1bHRWYWx1ZTp0LHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazpuLG9uU3VibWl0OnIsc2VsZWN0b3I6b30pe2NvbnN0IGk9cDMobykscz0oaD0+QXJyYXkuaXNBcnJheShoLm1vZHVsZVNvdXJjZSk/e3R5cGU6Im51bWJlciIsdmFsdWVzOk9iamVjdC5rZXlzKGgubW9kdWxlU291cmNlKS5tYXAoZz0+cGFyc2VJbnQoZykpfTp7dHlwZToic3RyaW5nIix2YWx1ZXM6T2JqZWN0LmtleXMoaC5tb2R1bGVTb3VyY2U/P1siRVJST1IgZmV0Y2hpbmcgc291cmNlIl0pfSkoaSksW2EsdV09cC51c2VTdGF0ZSh0Pz9zLnZhbHVlc1swXSksW2MsZF09cC51c2VTdGF0ZSghMSk7cC51c2VFZmZlY3QoKCk9PntkKGUpfSxbZV0pO2NvbnN0IGY9aD0+e2lmKHMudHlwZT09PSJudW1iZXIiKXtpZihoPT09IiIpdGhyb3cgbmV3IEVycm9yKCJWYWx1ZSBjYW5ub3QgYmUgZW1wdHkiKTtpZihOdW1iZXIuaXNOYU4oTnVtYmVyKGgpKSl0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIHdhcyBub3QgYSBudW1iZXI6ICIrSlNPTi5zdHJpbmdpZnkoaCkpO3JldHVybiBOdW1iZXIoaCl9cmV0dXJuIGh9O3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e24mJm4oYXN5bmMgaD0+W3tvcDoicmVwbGFjZSIscGF0aDpoLHZhbHVlOmF9XSl9LFthXSkseC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wganVzdGlmeS1iZXR3ZWVuIGgtZnVsbCBnYXAteS00IixjaGlsZHJlbjpbeC5qc3hzKHpBLHtkZWZhdWx0VmFsdWU6YS50b1N0cmluZygpLGRpc2FibGVkOmMsb25WYWx1ZUNoYW5nZTpoPT57dShmKGgpKX0sY2hpbGRyZW46W3guanN4KFBDLHtjaGlsZHJlbjp4LmpzeChGQSx7cGxhY2Vob2xkZXI6IlNlbGVjdCBhIHZhbHVlIn0pfSkseC5qc3goT0Mse2NoaWxkcmVuOnMudmFsdWVzLm1hcChoPT54LmpzeChBQyx7dmFsdWU6aC50b1N0cmluZygpLGNoaWxkcmVuOmgudG9TdHJpbmcoKX0saCkpfSldfSksciYmeC5qc3goImRpdiIse2NoaWxkcmVuOnQhPT1hJiZ4LmpzeChYbCx7ZGlzYWJsZWQ6YyxvbkNsaWNrOigpPT57ZCghMCkscihhc3luYyBoPT5be29wOiJyZXBsYWNlIixwYXRoOmgsdmFsdWU6YX1dKS5maW5hbGx5KCgpPT57ZCghMSl9KX0sY2hpbGRyZW46Yz8iU2F2aW5nLi4uIjoiU3VibWl0In0pfSldfSl9ZnVuY3Rpb24gS0Eoe2Rpc2FibGVkOmUsZGVmYXVsdFZhbHVlOnQscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm4sb25TdWJtaXQ6cn0pe2NvbnN0W28saV09cC51c2VTdGF0ZSh0fHwwKSxbbCxzXT1wLnVzZVN0YXRlKCExKTtwLnVzZUVmZmVjdCgoKT0+e3MoZSl9LFtlXSk7Y29uc3QgYT1wLnVzZVJlZihudWxsKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntuJiZuKGFzeW5jIHU9Pnt2YXIgYztyZXR1cm5be29wOiJyZXBsYWNlIixwYXRoOnUsdmFsdWU6TnVtYmVyKChjPWEuY3VycmVudCk9PW51bGw/dm9pZCAwOmMudmFsdWUpfHwwfV19KX0sW10pLHguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiBoLWZ1bGwgZ2FwLXktNCIsY2hpbGRyZW46W3guanN4KHZtLHtyZWY6YSxkaXNhYmxlZDpsLGRlZmF1bHRWYWx1ZTpvPz8wLG9uQ2hhbmdlOnU9PmkoTnVtYmVyKHUudGFyZ2V0LnZhbHVlKSksdHlwZToibnVtYmVyIn0pLHImJnguanN4KCJkaXYiLHtjaGlsZHJlbjp0IT09byYmeC5qc3goWGwse2Rpc2FibGVkOmwsb25DbGljazooKT0+e3MoITApLHIoYXN5bmMgdT0+e3ZhciBjO3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6dSx2YWx1ZTpOdW1iZXIoKGM9YS5jdXJyZW50KT09bnVsbD92b2lkIDA6Yy52YWx1ZSl8fDB9XX0pLmZpbmFsbHkoKCk9PntzKCExKX0pfSxjaGlsZHJlbjpsPyJTYXZpbmcuLi4iOiJTdWJtaXQifSl9KV19KX1mdW5jdGlvbiBHQSh7ZGlzYWJsZWQ6ZSxkZWZhdWx0VmFsdWU6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6bixvblN1Ym1pdDpyfSl7Y29uc3RbbyxpXT1wLnVzZVN0YXRlKHR8fCIiKSxbbCxzXT1wLnVzZVN0YXRlKCExKTtwLnVzZUVmZmVjdCgoKT0+e3MoZSl9LFtlXSk7Y29uc3QgYT1wLnVzZVJlZihudWxsKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntuJiZuKGFzeW5jIHU9Pnt2YXIgYztyZXR1cm5be29wOiJyZXBsYWNlIixwYXRoOnUsdmFsdWU6KChjPWEuY3VycmVudCk9PW51bGw/dm9pZCAwOmMudmFsdWUpfHwiIn1dfSl9LFtdKSx4LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW4gaC1mdWxsIGdhcC15LTQiLGNoaWxkcmVuOlt4LmpzeCh2bSx7cmVmOmEsZGlzYWJsZWQ6bCxkZWZhdWx0VmFsdWU6bz8/IiIsb25DaGFuZ2U6dT0+aSh1LnRhcmdldC52YWx1ZSl9KSxyJiZ4LmpzeCgiZGl2Iix7Y2hpbGRyZW46dCE9PW8mJnguanN4KFhsLHtkaXNhYmxlZDpsLG9uQ2xpY2s6KCk9PntzKCEwKSxyKGFzeW5jIHU9Pnt2YXIgYztyZXR1cm5be29wOiJyZXBsYWNlIixwYXRoOnUsdmFsdWU6KChjPWEuY3VycmVudCk9PW51bGw/dm9pZCAwOmMudmFsdWUpfHwiIn1dfSkuZmluYWxseSgoKT0+e3MoITEpfSl9LGNoaWxkcmVuOmw/IlNhdmluZy4uLiI6IlN1Ym1pdCJ9KX0pXX0pfWNvbnN0IFlBPSh7Y2xhc3NOYW1lOmV9KT0+eC5qc3hzKCJzdmciLHt3aWR0aDoiNTgiLGhlaWdodDoiMzQiLHZpZXdCb3g6IjAgMCA1OCAzNCIsZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjbGFzc05hbWU6ZSxjaGlsZHJlbjpbeC5qc3goImciLHtmaWx0ZXI6InVybCgjZmlsdGVyMF9kXzIxXzE2NzcpIixjaGlsZHJlbjp4LmpzeCgicGF0aCIse2Q6Ik01IDUuMzY0MjZDNSA1LjE2MzA5IDUuMTYzMDkgNSA1LjM2NDI2IDVIMTcuNjU4MUMxNy44NTkzIDUgMTguMDIyMyA1LjE2MzA5IDE4LjAyMjMgNS4zNjQyNlYyOC40OTQ5QzE4LjAyMjMgMjguNjk2IDE3Ljg1OTMgMjguODU5MSAxNy42NTgxIDI4Ljg1OTFINS4zNjQyNkM1LjE2MzA5IDI4Ljg1OTEgNSAyOC42OTYgNSAyOC40OTQ5VjUuMzY0MjZaIixmaWxsOiIjMzhDRDk4In0pfSkseC5qc3goImciLHtmaWx0ZXI6InVybCgjZmlsdGVyMV9pXzIxXzE2NzcpIixjaGlsZHJlbjp4LmpzeCgiY2lyY2xlIix7Y3g6IjExLjQ2NTYiLGN5OiIyMy43NTk1IixyOiIyLjE4NTU3IixmaWxsOiJjdXJyZW50Q29sb3IifSl9KSx4LmpzeCgicGF0aCIse2ZpbGxSdWxlOiJldmVub2RkIixjbGlwUnVsZToiZXZlbm9kZCIsZDoiTTUyLjg1ODggMjMuODM5SDQ4LjcyNTdINDguNTM3SDQ4LjExMjhDNDcuNjcxNSAyMy44MzkgNDcuNDUwOCAyMy41OTQyIDQ3LjQ1MDggMjMuMTA0NFYxMy43MjkzQzQ3LjQ1MDggMTMuNTc4NCA0Ny4zMjg1IDEzLjQ1NjEgNDcuMTc3NyAxMy40NTYxSDQ1LjgxMThDNDUuNjYwOSAxMy40NTYxIDQ1LjUzODYgMTMuNTc4NCA0NS41Mzg2IDEzLjcyOTNWMTUuMTgzNkM0NS41Mzg2IDE1LjI4NDQgNDUuNDU2OSAxNS4zNjYxIDQ1LjM1NjEgMTUuMzY2MUM0NS4yODc2IDE1LjM2NjEgNDUuMjI1IDE1LjMyNzUgNDUuMTkyNCAxNS4yNjcyQzQ0LjgwNSAxNC41NTAzIDQ0LjI4MyAxNC4wMiA0My42MjY0IDEzLjY3NjVDNDIuOTU2MyAxMy4zMDEgNDIuMjA0NSAxMy4xMTMyIDQxLjM3MDkgMTMuMTEzMkM0MC42MDI4IDEzLjExMzIgMzkuODc1NSAxMy4yNTIgMzkuMTg5IDEzLjUyOTVDMzguNTAyNiAxMy44MDcxIDM3Ljg5NzkgMTQuMjE1MiAzNy4zNzQ4IDE0Ljc1MzlDMzYuODY4MiAxNS4yNzY0IDM2LjQ2NzggMTUuOTIxMiAzNi4xNzM2IDE2LjY4ODVDMzUuODc5NCAxNy40NTU4IDM1LjczMjMgMTguMzM3NCAzNS43MzIzIDE5LjMzMzJWMTkuNzI1QzM1LjczMjMgMjAuNzM3MiAzNS44Nzk0IDIxLjYyNyAzNi4xNzM2IDIyLjM5NDJDMzYuNDY3OCAyMy4xNjE1IDM2Ljg2ODIgMjMuODE0NiAzNy4zNzQ4IDI0LjM1MzNDMzcuODk3OSAyNC44NzU3IDM4LjUwMjYgMjUuMjc1NyAzOS4xODkgMjUuNTUzMkMzOS44NzU1IDI1LjgxNDQgNDAuNjE5MSAyNS45NDUgNDEuNDIgMjUuOTQ1QzQyLjE4ODEgMjUuOTQ1IDQyLjkxNTQgMjUuNzQ5MSA0My42MDE5IDI1LjM1NzNDNDQuMjc1MSAyNC45ODIgNDQuODA1OCAyNC40MTE5IDQ1LjE5NDEgMjMuNjQ3MUM0NS4yMjU1IDIzLjU4NTIgNDUuMjg4NiAyMy41NDUyIDQ1LjM1OCAyMy41NDUySDQ1LjM5MTdDNDUuNDcyOCAyMy41NDUyIDQ1LjUzODYgMjMuNjExIDQ1LjUzODYgMjMuNjkyMUM0NS41Mzg2IDIzLjc5MDQgNDUuNTQ0IDIzLjg4NTYgNDUuNTU0NyAyMy45Nzc3VjI1LjEzOTJDNDUuNTU0NyAyNS4zOTA0IDQ1Ljc1ODQgMjUuNTk0MSA0Ni4wMDk2IDI1LjU5NDFINDcuMjI2MUM0Ny4yOTE0IDI1LjU5OTUgNDcuMzU4MSAyNS42MDIyIDQ3LjQyNjMgMjUuNjAyMkg0OC41MzdINDguNzI1N0g1Ny43MjY4QzU3Ljg3NzcgMjUuNjAyMiA1OCAyNS40Nzk5IDU4IDI1LjMyOVYyNC4xMTIyQzU4IDIzLjk2MTQgNTcuODc3NyAyMy44MzkgNTcuNzI2OCAyMy44MzlINTUuMzE3NEM1NS4xNjY1IDIzLjgzOSA1NS4wNDQyIDIzLjcxNjcgNTUuMDQ0MiAyMy41NjU5VjguNzMzNjhDNTUuMDQ0MiA4LjU4Mjc5IDU0LjkyMTkgOC40NjA0OCA1NC43NzEgOC40NjA0OEg1MC41MDU0QzUwLjM1NDUgOC40NjA0OCA1MC4yMzIyIDguNTgyNzkgNTAuMjMyMiA4LjczMzY4VjkuOTUwNDNDNTAuMjMyMiAxMC4xMDEzIDUwLjM1NDUgMTAuMjIzNiA1MC41MDU0IDEwLjIyMzZINTIuODU4OEM1My4wMDk3IDEwLjIyMzYgNTMuMTMyIDEwLjM0NTkgNTMuMTMyIDEwLjQ5NjhWMjMuNTY1OUM1My4xMzIgMjMuNzE2NyA1My4wMDk3IDIzLjgzOSA1Mi44NTg4IDIzLjgzOVpNNDEuNjE2MSAyNC4xMzI5QzQyLjE4ODEgMjQuMTMyOSA0Mi43MTExIDI0LjAyNjggNDMuMTg1MSAyMy44MTQ2QzQzLjY3NTQgMjMuNjAyMyA0NC4wOTIyIDIzLjMwMDMgNDQuNDM1NCAyMi45MDg1QzQ0Ljc3ODYgMjIuNTE2NyA0NS4wNDgzIDIyLjA1MTQgNDUuMjQ0NCAyMS41MTI3QzQ1LjQ0MDYgMjAuOTU3NiA0NS41Mzg2IDIwLjM0NTQgNDUuNTM4NiAxOS42NzYxVjE5LjM4MjJDNDUuNTM4NiAxOC43MjkyIDQ1LjQ0MDYgMTguMTMzMyA0NS4yNDQ0IDE3LjU5NDZDNDUuMDQ4MyAxNy4wMzk1IDQ0Ljc3MDUgMTYuNTY2MSA0NC40MTA5IDE2LjE3NDNDNDQuMDY3NyAxNS43ODI0IDQzLjY1MDkgMTUuNDgwNCA0My4xNjA2IDE1LjI2ODJDNDIuNjg2NiAxNS4wMzk2IDQyLjE3MTggMTQuOTI1NCA0MS42MTYxIDE0LjkyNTRDNDEuMDQ0IDE0LjkyNTQgNDAuNTIxIDE1LjAzMTUgNDAuMDQ3MSAxNS4yNDM3QzM5LjU3MzEgMTUuNDU1OSAzOS4xNTYzIDE1Ljc1OCAzOC43OTY4IDE2LjE0OThDMzguNDUzNSAxNi41MjUyIDM4LjE4MzkgMTYuOTkwNSAzNy45ODc3IDE3LjU0NTZDMzcuNzkxNiAxOC4wODQzIDM3LjY5MzYgMTguNjgwMiAzNy42OTM2IDE5LjMzMzJWMTkuNzI1QzM3LjY5MzYgMjEuMTEyNyAzOC4wNTMxIDIyLjE5ODMgMzguNzcyMiAyMi45ODJDMzkuNTA3NyAyMy43NDkzIDQwLjQ1NTcgMjQuMTMyOSA0MS42MTYxIDI0LjEzMjlaTTMxLjExMTUgMjUuNDE5MUMzMS4wNzMyIDI1LjUyODcgMzAuOTY5OCAyNS42MDIyIDMwLjg1MzYgMjUuNjAyMkgyNy40NjYxQzI3LjM1IDI1LjYwMjIgMjcuMjQ2NSAyNS41Mjg3IDI3LjIwODIgMjUuNDE5MUwyMy4xNTc4IDEzLjgxOTNDMjMuMDk1OCAxMy42NDE3IDIzLjIyNzYgMTMuNDU2MSAyMy40MTU3IDEzLjQ1NjFIMjUuMDg5QzI1LjIwNjggMTMuNDU2MSAyNS4zMTE0IDEzLjUzMTYgMjUuMzQ4NCAxMy42NDM1TDI4Ljk2NjYgMjQuNTgxQzI4Ljk5NDIgMjQuNjY0MyAyOS4wNzIxIDI0LjcyMDYgMjkuMTU5OSAyNC43MjA2QzI5LjI0NzcgMjQuNzIwNiAyOS4zMjU2IDI0LjY2NDMgMjkuMzUzMiAyNC41ODFMMzIuOTcxNCAxMy42NDM1QzMzLjAwODQgMTMuNTMxNiAzMy4xMTI5IDEzLjQ1NjEgMzMuMjMwOCAxMy40NTYxSDM0LjkwNDFDMzUuMDkyMiAxMy40NTYxIDM1LjIyNCAxMy42NDE3IDM1LjE2MiAxMy44MTkzTDMxLjExMTUgMjUuNDE5MVoiLGZpbGw6ImN1cnJlbnRDb2xvciJ9KSx4LmpzeHMoImRlZnMiLHtjaGlsZHJlbjpbeC5qc3hzKCJmaWx0ZXIiLHtpZDoiZmlsdGVyMF9kXzIxXzE2NzciLHg6IjAuMTI0NzIyIix5OiIwLjEyNDcyMiIsd2lkdGg6IjIyLjc3MjkiLGhlaWdodDoiMzMuNjA5NyIsZmlsdGVyVW5pdHM6InVzZXJTcGFjZU9uVXNlIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJzUkdCIixjaGlsZHJlbjpbeC5qc3goImZlRmxvb2QiLHtmbG9vZE9wYWNpdHk6IjAiLHJlc3VsdDoiQmFja2dyb3VuZEltYWdlRml4In0pLHguanN4KCJmZUNvbG9yTWF0cml4Iix7aW46IlNvdXJjZUFscGhhIix0eXBlOiJtYXRyaXgiLHZhbHVlczoiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLHJlc3VsdDoiaGFyZEFscGhhIn0pLHguanN4KCJmZU9mZnNldCIse30pLHguanN4KCJmZUdhdXNzaWFuQmx1ciIse3N0ZERldmlhdGlvbjoiMi40Mzc2NCJ9KSx4LmpzeCgiZmVDb21wb3NpdGUiLHtpbjI6ImhhcmRBbHBoYSIsb3BlcmF0b3I6Im91dCJ9KSx4LmpzeCgiZmVDb2xvck1hdHJpeCIse3R5cGU6Im1hdHJpeCIsdmFsdWVzOiIwIDAgMCAwIDAuMjE5NjA4IDAgMCAwIDAgMC44MDM5MjIgMCAwIDAgMCAwLjUwMTk2MSAwIDAgMCAwLjMgMCJ9KSx4LmpzeCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW4yOiJCYWNrZ3JvdW5kSW1hZ2VGaXgiLHJlc3VsdDoiZWZmZWN0MV9kcm9wU2hhZG93XzIxXzE2NzcifSkseC5qc3goImZlQmxlbmQiLHttb2RlOiJub3JtYWwiLGluOiJTb3VyY2VHcmFwaGljIixpbjI6ImVmZmVjdDFfZHJvcFNoYWRvd18yMV8xNjc3IixyZXN1bHQ6InNoYXBlIn0pXX0pLHguanN4cygiZmlsdGVyIix7aWQ6ImZpbHRlcjFfaV8yMV8xNjc3Iix4OiI5LjI4MDAzIix5OiIyMS41NzM5Iix3aWR0aDoiNC4zNzExMiIsaGVpZ2h0OiI0LjM3MTEyIixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlt4LmpzeCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSkseC5qc3goImZlQmxlbmQiLHttb2RlOiJub3JtYWwiLGluOiJTb3VyY2VHcmFwaGljIixpbjI6IkJhY2tncm91bmRJbWFnZUZpeCIscmVzdWx0OiJzaGFwZSJ9KSx4LmpzeCgiZmVDb2xvck1hdHJpeCIse2luOiJTb3VyY2VBbHBoYSIsdHlwZToibWF0cml4Iix2YWx1ZXM6IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIixyZXN1bHQ6ImhhcmRBbHBoYSJ9KSx4LmpzeCgiZmVPZmZzZXQiLHt9KSx4LmpzeCgiZmVHYXVzc2lhbkJsdXIiLHtzdGREZXZpYXRpb246IjAuNTQ2MzkyIn0pLHguanN4KCJmZUNvbXBvc2l0ZSIse2luMjoiaGFyZEFscGhhIixvcGVyYXRvcjoiYXJpdGhtZXRpYyIsazI6Ii0xIixrMzoiMSJ9KSx4LmpzeCgiZmVDb2xvck1hdHJpeCIse3R5cGU6Im1hdHJpeCIsdmFsdWVzOiIwIDAgMCAwIDAuMjE5NjA4IDAgMCAwIDAgMC44MDM5MjIgMCAwIDAgMCAwLjUwMTk2MSAwIDAgMCAwLjMgMCJ9KSx4LmpzeCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW4yOiJzaGFwZSIscmVzdWx0OiJlZmZlY3QxX2lubmVyU2hhZG93XzIxXzE2NzcifSldfSldfSldfSksREM9WUEsTEM9IlN3aXRjaCIsW1hBLHc0XT0kaShMQyksW1FBLEpBXT1YQShMQyksWkE9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVN3aXRjaDpuLG5hbWU6cixjaGVja2VkOm8sZGVmYXVsdENoZWNrZWQ6aSxyZXF1aXJlZDpsLGRpc2FibGVkOnMsdmFsdWU6YT0ib24iLG9uQ2hlY2tlZENoYW5nZTp1LC4uLmN9PWUsW2QsZl09cC51c2VTdGF0ZShudWxsKSxoPVhlKHQseT0+Zih5KSksZz1wLnVzZVJlZighMSksbT1kPyEhZC5jbG9zZXN0KCJmb3JtIik6ITAsW1M9ITEsdl09UGwoe3Byb3A6byxkZWZhdWx0UHJvcDppLG9uQ2hhbmdlOnV9KTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KFFBLHtzY29wZTpuLGNoZWNrZWQ6UyxkaXNhYmxlZDpzfSxwLmNyZWF0ZUVsZW1lbnQoRGUuYnV0dG9uLGVlKHt0eXBlOiJidXR0b24iLHJvbGU6InN3aXRjaCIsImFyaWEtY2hlY2tlZCI6UywiYXJpYS1yZXF1aXJlZCI6bCwiZGF0YS1zdGF0ZSI6SUMoUyksImRhdGEtZGlzYWJsZWQiOnM/IiI6dm9pZCAwLGRpc2FibGVkOnMsdmFsdWU6YX0sYyx7cmVmOmgsb25DbGljazpIZShlLm9uQ2xpY2sseT0+e3YoXz0+IV8pLG0mJihnLmN1cnJlbnQ9eS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpLGcuY3VycmVudHx8eS5zdG9wUHJvcGFnYXRpb24oKSl9KX0pKSxtJiZwLmNyZWF0ZUVsZW1lbnQodE0se2NvbnRyb2w6ZCxidWJibGVzOiFnLmN1cnJlbnQsbmFtZTpyLHZhbHVlOmEsY2hlY2tlZDpTLHJlcXVpcmVkOmwsZGlzYWJsZWQ6cyxzdHlsZTp7dHJhbnNmb3JtOiJ0cmFuc2xhdGVYKC0xMDAlKSJ9fSkpfSkscUE9IlN3aXRjaFRodW1iIixlTT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU3dpdGNoOm4sLi4ucn09ZSxvPUpBKHFBLG4pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoRGUuc3BhbixlZSh7ImRhdGEtc3RhdGUiOklDKG8uY2hlY2tlZCksImRhdGEtZGlzYWJsZWQiOm8uZGlzYWJsZWQ/IiI6dm9pZCAwfSxyLHtyZWY6dH0pKX0pLHRNPWU9Pntjb25zdHtjb250cm9sOnQsY2hlY2tlZDpuLGJ1YmJsZXM6cj0hMCwuLi5vfT1lLGk9cC51c2VSZWYobnVsbCksbD1jQyhuKSxzPXJDKHQpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IGE9aS5jdXJyZW50LHU9d2luZG93LkhUTUxJbnB1dEVsZW1lbnQucHJvdG90eXBlLGQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih1LCJjaGVja2VkIikuc2V0O2lmKGwhPT1uJiZkKXtjb25zdCBmPW5ldyBFdmVudCgiY2xpY2siLHtidWJibGVzOnJ9KTtkLmNhbGwoYSxuKSxhLmRpc3BhdGNoRXZlbnQoZil9fSxbbCxuLHJdKSxwLmNyZWF0ZUVsZW1lbnQoImlucHV0IixlZSh7dHlwZToiY2hlY2tib3giLCJhcmlhLWhpZGRlbiI6ITAsZGVmYXVsdENoZWNrZWQ6bn0sbyx7dGFiSW5kZXg6LTEscmVmOmksc3R5bGU6ey4uLmUuc3R5bGUsLi4ucyxwb3NpdGlvbjoiYWJzb2x1dGUiLHBvaW50ZXJFdmVudHM6Im5vbmUiLG9wYWNpdHk6MCxtYXJnaW46MH19KSl9O2Z1bmN0aW9uIElDKGUpe3JldHVybiBlPyJjaGVja2VkIjoidW5jaGVja2VkIn1jb25zdCBqQz1aQSxuTT1lTSxDcD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+eC5qc3goakMse2NsYXNzTmFtZTpvdCgicGVlciBpbmxpbmUtZmxleCBoLVsyMnB4XSB3LVs0NHB4XSBzaHJpbmstMCBjdXJzb3ItcG9pbnRlciBpdGVtcy1jZW50ZXIgcm91bmRlZC1mdWxsIGJvcmRlci0yIGJvcmRlci10cmFuc3BhcmVudCB0cmFuc2l0aW9uLWNvbG9ycyBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTIgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC1iYWNrZ3JvdW5kIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwIGRhdGEtW3N0YXRlPWNoZWNrZWRdOmJnLWFjY2VudCBkYXRhLVtzdGF0ZT11bmNoZWNrZWRdOmJnLXByaW1hcnkiLGUpLC4uLnQscmVmOm4sY2hpbGRyZW46eC5qc3gobk0se2NsYXNzTmFtZTpvdCgicG9pbnRlci1ldmVudHMtbm9uZSBibG9jayBoLVsxOHB4XSB3LTUgcm91bmRlZC1mdWxsIGJnLWJhY2tncm91bmQgc2hhZG93LWxnIHJpbmctMCB0cmFuc2l0aW9uLXRyYW5zZm9ybSBkYXRhLVtzdGF0ZT1jaGVja2VkXTp0cmFuc2xhdGUteC01IGRhdGEtW3N0YXRlPXVuY2hlY2tlZF06dHJhbnNsYXRlLXgtMCIpfSl9KSk7Q3AuZGlzcGxheU5hbWU9akMuZGlzcGxheU5hbWU7Y29uc3Qga209cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PnguanN4KCJkaXYiLHtyZWY6bixjbGFzc05hbWU6b3QoInJvdW5kZWQtbGcgYm9yZGVyIGJnLWNhcmQgdGV4dC1jYXJkLWZvcmVncm91bmQgc2hhZG93LXNtIixlKSwuLi50fSkpO2ttLmRpc3BsYXlOYW1lPSJDYXJkIjtjb25zdCByTT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+eC5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTpvdCgiZmxleCBmbGV4LWNvbCBzcGFjZS15LTEuNSBwLTYiLGUpLC4uLnR9KSk7ck0uZGlzcGxheU5hbWU9IkNhcmRIZWFkZXIiO2NvbnN0IG9NPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT54LmpzeCgiaDMiLHtyZWY6bixjbGFzc05hbWU6b3QoInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgbGVhZGluZy1ub25lIHRyYWNraW5nLXRpZ2h0IixlKSwuLi50fSkpO29NLmRpc3BsYXlOYW1lPSJDYXJkVGl0bGUiO2NvbnN0IGlNPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT54LmpzeCgicCIse3JlZjpuLGNsYXNzTmFtZTpvdCgidGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmQiLGUpLC4uLnR9KSk7aU0uZGlzcGxheU5hbWU9IkNhcmREZXNjcmlwdGlvbiI7Y29uc3QgbE09cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PnguanN4KCJkaXYiLHtyZWY6bixjbGFzc05hbWU6b3QoInAtNiBwdC0wIixlKSwuLi50fSkpO2xNLmRpc3BsYXlOYW1lPSJDYXJkQ29udGVudCI7Y29uc3Qgc009cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PnguanN4KCJkaXYiLHtyZWY6bixjbGFzc05hbWU6b3QoImZsZXggaXRlbXMtY2VudGVyIHAtNiBwdC0wIixlKSwuLi50fSkpO3NNLmRpc3BsYXlOYW1lPSJDYXJkRm9vdGVyIjsvKioKICogQHJlbWl4LXJ1bi9yb3V0ZXIgdjEuMTEuMAogKgogKiBDb3B5cmlnaHQgKGMpIFJlbWl4IFNvZnR3YXJlIEluYy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UubWQgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICoKICogQGxpY2Vuc2UgTUlUCiAqL2Z1bmN0aW9uIHJ0KCl7cmV0dXJuIHJ0PU9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbi5iaW5kKCk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0scnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciBsdDsoZnVuY3Rpb24oZSl7ZS5Qb3A9IlBPUCIsZS5QdXNoPSJQVVNIIixlLlJlcGxhY2U9IlJFUExBQ0UifSkobHR8fChsdD17fSkpO2NvbnN0IFQwPSJwb3BzdGF0ZSI7ZnVuY3Rpb24gYU0oZSl7ZT09PXZvaWQgMCYmKGU9e30pO2Z1bmN0aW9uIHQocixvKXtsZXR7cGF0aG5hbWU6aSxzZWFyY2g6bCxoYXNoOnN9PXIubG9jYXRpb247cmV0dXJuIFNhKCIiLHtwYXRobmFtZTppLHNlYXJjaDpsLGhhc2g6c30sby5zdGF0ZSYmby5zdGF0ZS51c3J8fG51bGwsby5zdGF0ZSYmby5zdGF0ZS5rZXl8fCJkZWZhdWx0Iil9ZnVuY3Rpb24gbihyLG8pe3JldHVybiB0eXBlb2Ygbz09InN0cmluZyI/bzpGYShvKX1yZXR1cm4gY00odCxuLG51bGwsZSl9ZnVuY3Rpb24gd2UoZSx0KXtpZihlPT09ITF8fGU9PT1udWxsfHx0eXBlb2YgZT4idSIpdGhyb3cgbmV3IEVycm9yKHQpfWZ1bmN0aW9uIHlpKGUsdCl7aWYoIWUpe3R5cGVvZiBjb25zb2xlPCJ1IiYmY29uc29sZS53YXJuKHQpO3RyeXt0aHJvdyBuZXcgRXJyb3IodCl9Y2F0Y2h7fX19ZnVuY3Rpb24gdU0oKXtyZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsOCl9ZnVuY3Rpb24gTjAoZSx0KXtyZXR1cm57dXNyOmUuc3RhdGUsa2V5OmUua2V5LGlkeDp0fX1mdW5jdGlvbiBTYShlLHQsbixyKXtyZXR1cm4gbj09PXZvaWQgMCYmKG49bnVsbCkscnQoe3BhdGhuYW1lOnR5cGVvZiBlPT0ic3RyaW5nIj9lOmUucGF0aG5hbWUsc2VhcmNoOiIiLGhhc2g6IiJ9LHR5cGVvZiB0PT0ic3RyaW5nIj9Kcih0KTp0LHtzdGF0ZTpuLGtleTp0JiZ0LmtleXx8cnx8dU0oKX0pfWZ1bmN0aW9uIEZhKGUpe2xldHtwYXRobmFtZTp0PSIvIixzZWFyY2g6bj0iIixoYXNoOnI9IiJ9PWU7cmV0dXJuIG4mJm4hPT0iPyImJih0Kz1uLmNoYXJBdCgwKT09PSI/Ij9uOiI/IituKSxyJiZyIT09IiMiJiYodCs9ci5jaGFyQXQoMCk9PT0iIyI/cjoiIyIrciksdH1mdW5jdGlvbiBKcihlKXtsZXQgdD17fTtpZihlKXtsZXQgbj1lLmluZGV4T2YoIiMiKTtuPj0wJiYodC5oYXNoPWUuc3Vic3RyKG4pLGU9ZS5zdWJzdHIoMCxuKSk7bGV0IHI9ZS5pbmRleE9mKCI/Iik7cj49MCYmKHQuc2VhcmNoPWUuc3Vic3RyKHIpLGU9ZS5zdWJzdHIoMCxyKSksZSYmKHQucGF0aG5hbWU9ZSl9cmV0dXJuIHR9ZnVuY3Rpb24gY00oZSx0LG4scil7cj09PXZvaWQgMCYmKHI9e30pO2xldHt3aW5kb3c6bz1kb2N1bWVudC5kZWZhdWx0Vmlldyx2NUNvbXBhdDppPSExfT1yLGw9by5oaXN0b3J5LHM9bHQuUG9wLGE9bnVsbCx1PWMoKTt1PT1udWxsJiYodT0wLGwucmVwbGFjZVN0YXRlKHJ0KHt9LGwuc3RhdGUse2lkeDp1fSksIiIpKTtmdW5jdGlvbiBjKCl7cmV0dXJuKGwuc3RhdGV8fHtpZHg6bnVsbH0pLmlkeH1mdW5jdGlvbiBkKCl7cz1sdC5Qb3A7bGV0IFM9YygpLHY9Uz09bnVsbD9udWxsOlMtdTt1PVMsYSYmYSh7YWN0aW9uOnMsbG9jYXRpb246bS5sb2NhdGlvbixkZWx0YTp2fSl9ZnVuY3Rpb24gZihTLHYpe3M9bHQuUHVzaDtsZXQgeT1TYShtLmxvY2F0aW9uLFMsdik7biYmbih5LFMpLHU9YygpKzE7bGV0IF89TjAoeSx1KSx3PW0uY3JlYXRlSHJlZih5KTt0cnl7bC5wdXNoU3RhdGUoXywiIix3KX1jYXRjaChDKXtpZihDIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uJiZDLm5hbWU9PT0iRGF0YUNsb25lRXJyb3IiKXRocm93IEM7by5sb2NhdGlvbi5hc3NpZ24odyl9aSYmYSYmYSh7YWN0aW9uOnMsbG9jYXRpb246bS5sb2NhdGlvbixkZWx0YToxfSl9ZnVuY3Rpb24gaChTLHYpe3M9bHQuUmVwbGFjZTtsZXQgeT1TYShtLmxvY2F0aW9uLFMsdik7biYmbih5LFMpLHU9YygpO2xldCBfPU4wKHksdSksdz1tLmNyZWF0ZUhyZWYoeSk7bC5yZXBsYWNlU3RhdGUoXywiIix3KSxpJiZhJiZhKHthY3Rpb246cyxsb2NhdGlvbjptLmxvY2F0aW9uLGRlbHRhOjB9KX1mdW5jdGlvbiBnKFMpe2xldCB2PW8ubG9jYXRpb24ub3JpZ2luIT09Im51bGwiP28ubG9jYXRpb24ub3JpZ2luOm8ubG9jYXRpb24uaHJlZix5PXR5cGVvZiBTPT0ic3RyaW5nIj9TOkZhKFMpO3JldHVybiB3ZSh2LCJObyB3aW5kb3cubG9jYXRpb24uKG9yaWdpbnxocmVmKSBhdmFpbGFibGUgdG8gY3JlYXRlIFVSTCBmb3IgaHJlZjogIit5KSxuZXcgVVJMKHksdil9bGV0IG09e2dldCBhY3Rpb24oKXtyZXR1cm4gc30sZ2V0IGxvY2F0aW9uKCl7cmV0dXJuIGUobyxsKX0sbGlzdGVuKFMpe2lmKGEpdGhyb3cgbmV3IEVycm9yKCJBIGhpc3Rvcnkgb25seSBhY2NlcHRzIG9uZSBhY3RpdmUgbGlzdGVuZXIiKTtyZXR1cm4gby5hZGRFdmVudExpc3RlbmVyKFQwLGQpLGE9UywoKT0+e28ucmVtb3ZlRXZlbnRMaXN0ZW5lcihUMCxkKSxhPW51bGx9fSxjcmVhdGVIcmVmKFMpe3JldHVybiB0KG8sUyl9LGNyZWF0ZVVSTDpnLGVuY29kZUxvY2F0aW9uKFMpe2xldCB2PWcoUyk7cmV0dXJue3BhdGhuYW1lOnYucGF0aG5hbWUsc2VhcmNoOnYuc2VhcmNoLGhhc2g6di5oYXNofX0scHVzaDpmLHJlcGxhY2U6aCxnbyhTKXtyZXR1cm4gbC5nbyhTKX19O3JldHVybiBtfXZhciBzdDsoZnVuY3Rpb24oZSl7ZS5kYXRhPSJkYXRhIixlLmRlZmVycmVkPSJkZWZlcnJlZCIsZS5yZWRpcmVjdD0icmVkaXJlY3QiLGUuZXJyb3I9ImVycm9yIn0pKHN0fHwoc3Q9e30pKTtjb25zdCBkTT1uZXcgU2V0KFsibGF6eSIsImNhc2VTZW5zaXRpdmUiLCJwYXRoIiwiaWQiLCJpbmRleCIsImNoaWxkcmVuIl0pO2Z1bmN0aW9uIGZNKGUpe3JldHVybiBlLmluZGV4PT09ITB9ZnVuY3Rpb24gRXAoZSx0LG4scil7cmV0dXJuIG49PT12b2lkIDAmJihuPVtdKSxyPT09dm9pZCAwJiYocj17fSksZS5tYXAoKG8saSk9PntsZXQgbD1bLi4ubixpXSxzPXR5cGVvZiBvLmlkPT0ic3RyaW5nIj9vLmlkOmwuam9pbigiLSIpO2lmKHdlKG8uaW5kZXghPT0hMHx8IW8uY2hpbGRyZW4sIkNhbm5vdCBzcGVjaWZ5IGNoaWxkcmVuIG9uIGFuIGluZGV4IHJvdXRlIiksd2UoIXJbc10sJ0ZvdW5kIGEgcm91dGUgaWQgY29sbGlzaW9uIG9uIGlkICInK3MrYCIuICBSb3V0ZSBpZCdzIG11c3QgYmUgZ2xvYmFsbHkgdW5pcXVlIHdpdGhpbiBEYXRhIFJvdXRlciB1c2FnZXNgKSxmTShvKSl7bGV0IGE9cnQoe30sbyx0KG8pLHtpZDpzfSk7cmV0dXJuIHJbc109YSxhfWVsc2V7bGV0IGE9cnQoe30sbyx0KG8pLHtpZDpzLGNoaWxkcmVuOnZvaWQgMH0pO3JldHVybiByW3NdPWEsby5jaGlsZHJlbiYmKGEuY2hpbGRyZW49RXAoby5jaGlsZHJlbix0LGwscikpLGF9fSl9ZnVuY3Rpb24gb2woZSx0LG4pe249PT12b2lkIDAmJihuPSIvIik7bGV0IHI9dHlwZW9mIHQ9PSJzdHJpbmciP0pyKHQpOnQsbz1CYShyLnBhdGhuYW1lfHwiLyIsbik7aWYobz09bnVsbClyZXR1cm4gbnVsbDtsZXQgaT16QyhlKTtwTShpKTtsZXQgbD1udWxsO2ZvcihsZXQgcz0wO2w9PW51bGwmJnM8aS5sZW5ndGg7KytzKWw9Q00oaVtzXSxrTShvKSk7cmV0dXJuIGx9ZnVuY3Rpb24gaE0oZSx0KXtsZXR7cm91dGU6bixwYXRobmFtZTpyLHBhcmFtczpvfT1lO3JldHVybntpZDpuLmlkLHBhdGhuYW1lOnIscGFyYW1zOm8sZGF0YTp0W24uaWRdLGhhbmRsZTpuLmhhbmRsZX19ZnVuY3Rpb24gekMoZSx0LG4scil7dD09PXZvaWQgMCYmKHQ9W10pLG49PT12b2lkIDAmJihuPVtdKSxyPT09dm9pZCAwJiYocj0iIik7bGV0IG89KGksbCxzKT0+e2xldCBhPXtyZWxhdGl2ZVBhdGg6cz09PXZvaWQgMD9pLnBhdGh8fCIiOnMsY2FzZVNlbnNpdGl2ZTppLmNhc2VTZW5zaXRpdmU9PT0hMCxjaGlsZHJlbkluZGV4Omwscm91dGU6aX07YS5yZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgiLyIpJiYod2UoYS5yZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChyKSwnQWJzb2x1dGUgcm91dGUgcGF0aCAiJythLnJlbGF0aXZlUGF0aCsnIiBuZXN0ZWQgdW5kZXIgcGF0aCAnKygnIicrcisnIiBpcyBub3QgdmFsaWQuIEFuIGFic29sdXRlIGNoaWxkIHJvdXRlIHBhdGggJykrIm11c3Qgc3RhcnQgd2l0aCB0aGUgY29tYmluZWQgcGF0aCBvZiBhbGwgaXRzIHBhcmVudCByb3V0ZXMuIiksYS5yZWxhdGl2ZVBhdGg9YS5yZWxhdGl2ZVBhdGguc2xpY2Uoci5sZW5ndGgpKTtsZXQgdT1rbyhbcixhLnJlbGF0aXZlUGF0aF0pLGM9bi5jb25jYXQoYSk7aS5jaGlsZHJlbiYmaS5jaGlsZHJlbi5sZW5ndGg+MCYmKHdlKGkuaW5kZXghPT0hMCwiSW5kZXggcm91dGVzIG11c3Qgbm90IGhhdmUgY2hpbGQgcm91dGVzLiBQbGVhc2UgcmVtb3ZlICIrKCdhbGwgY2hpbGQgcm91dGVzIGZyb20gcm91dGUgcGF0aCAiJyt1KyciLicpKSx6QyhpLmNoaWxkcmVuLHQsYyx1KSksIShpLnBhdGg9PW51bGwmJiFpLmluZGV4KSYmdC5wdXNoKHtwYXRoOnUsc2NvcmU6d00odSxpLmluZGV4KSxyb3V0ZXNNZXRhOmN9KX07cmV0dXJuIGUuZm9yRWFjaCgoaSxsKT0+e3ZhciBzO2lmKGkucGF0aD09PSIifHwhKChzPWkucGF0aCkhPW51bGwmJnMuaW5jbHVkZXMoIj8iKSkpbyhpLGwpO2Vsc2UgZm9yKGxldCBhIG9mIEZDKGkucGF0aCkpbyhpLGwsYSl9KSx0fWZ1bmN0aW9uIEZDKGUpe2xldCB0PWUuc3BsaXQoIi8iKTtpZih0Lmxlbmd0aD09PTApcmV0dXJuW107bGV0W24sLi4ucl09dCxvPW4uZW5kc1dpdGgoIj8iKSxpPW4ucmVwbGFjZSgvXD8kLywiIik7aWYoci5sZW5ndGg9PT0wKXJldHVybiBvP1tpLCIiXTpbaV07bGV0IGw9RkMoci5qb2luKCIvIikpLHM9W107cmV0dXJuIHMucHVzaCguLi5sLm1hcChhPT5hPT09IiI/aTpbaSxhXS5qb2luKCIvIikpKSxvJiZzLnB1c2goLi4ubCkscy5tYXAoYT0+ZS5zdGFydHNXaXRoKCIvIikmJmE9PT0iIj8iLyI6YSl9ZnVuY3Rpb24gcE0oZSl7ZS5zb3J0KCh0LG4pPT50LnNjb3JlIT09bi5zY29yZT9uLnNjb3JlLXQuc2NvcmU6U00odC5yb3V0ZXNNZXRhLm1hcChyPT5yLmNoaWxkcmVuSW5kZXgpLG4ucm91dGVzTWV0YS5tYXAocj0+ci5jaGlsZHJlbkluZGV4KSkpfWNvbnN0IGdNPS9eOlx3KyQvLG1NPTMsdk09Mix5TT0xLHhNPTEwLF9NPS0yLGIwPWU9PmU9PT0iKiI7ZnVuY3Rpb24gd00oZSx0KXtsZXQgbj1lLnNwbGl0KCIvIikscj1uLmxlbmd0aDtyZXR1cm4gbi5zb21lKGIwKSYmKHIrPV9NKSx0JiYocis9dk0pLG4uZmlsdGVyKG89PiFiMChvKSkucmVkdWNlKChvLGkpPT5vKyhnTS50ZXN0KGkpP21NOmk9PT0iIj95TTp4TSkscil9ZnVuY3Rpb24gU00oZSx0KXtyZXR1cm4gZS5sZW5ndGg9PT10Lmxlbmd0aCYmZS5zbGljZSgwLC0xKS5ldmVyeSgocixvKT0+cj09PXRbb10pP2VbZS5sZW5ndGgtMV0tdFt0Lmxlbmd0aC0xXTowfWZ1bmN0aW9uIENNKGUsdCl7bGV0e3JvdXRlc01ldGE6bn09ZSxyPXt9LG89Ii8iLGk9W107Zm9yKGxldCBsPTA7bDxuLmxlbmd0aDsrK2wpe2xldCBzPW5bbF0sYT1sPT09bi5sZW5ndGgtMSx1PW89PT0iLyI/dDp0LnNsaWNlKG8ubGVuZ3RoKXx8Ii8iLGM9RU0oe3BhdGg6cy5yZWxhdGl2ZVBhdGgsY2FzZVNlbnNpdGl2ZTpzLmNhc2VTZW5zaXRpdmUsZW5kOmF9LHUpO2lmKCFjKXJldHVybiBudWxsO09iamVjdC5hc3NpZ24ocixjLnBhcmFtcyk7bGV0IGQ9cy5yb3V0ZTtpLnB1c2goe3BhcmFtczpyLHBhdGhuYW1lOmtvKFtvLGMucGF0aG5hbWVdKSxwYXRobmFtZUJhc2U6Uk0oa28oW28sYy5wYXRobmFtZUJhc2VdKSkscm91dGU6ZH0pLGMucGF0aG5hbWVCYXNlIT09Ii8iJiYobz1rbyhbbyxjLnBhdGhuYW1lQmFzZV0pKX1yZXR1cm4gaX1mdW5jdGlvbiBFTShlLHQpe3R5cGVvZiBlPT0ic3RyaW5nIiYmKGU9e3BhdGg6ZSxjYXNlU2Vuc2l0aXZlOiExLGVuZDohMH0pO2xldFtuLHJdPSRNKGUucGF0aCxlLmNhc2VTZW5zaXRpdmUsZS5lbmQpLG89dC5tYXRjaChuKTtpZighbylyZXR1cm4gbnVsbDtsZXQgaT1vWzBdLGw9aS5yZXBsYWNlKC8oLilcLyskLywiJDEiKSxzPW8uc2xpY2UoMSk7cmV0dXJue3BhcmFtczpyLnJlZHVjZSgodSxjLGQpPT57bGV0e3BhcmFtTmFtZTpmLGlzT3B0aW9uYWw6aH09YztpZihmPT09IioiKXtsZXQgbT1zW2RdfHwiIjtsPWkuc2xpY2UoMCxpLmxlbmd0aC1tLmxlbmd0aCkucmVwbGFjZSgvKC4pXC8rJC8sIiQxIil9Y29uc3QgZz1zW2RdO3JldHVybiBoJiYhZz91W2ZdPXZvaWQgMDp1W2ZdPVRNKGd8fCIiLGYpLHV9LHt9KSxwYXRobmFtZTppLHBhdGhuYW1lQmFzZTpsLHBhdHRlcm46ZX19ZnVuY3Rpb24gJE0oZSx0LG4pe3Q9PT12b2lkIDAmJih0PSExKSxuPT09dm9pZCAwJiYobj0hMCkseWkoZT09PSIqInx8IWUuZW5kc1dpdGgoIioiKXx8ZS5lbmRzV2l0aCgiLyoiKSwnUm91dGUgcGF0aCAiJytlKyciIHdpbGwgYmUgdHJlYXRlZCBhcyBpZiBpdCB3ZXJlICcrKCciJytlLnJlcGxhY2UoL1wqJC8sIi8qIikrJyIgYmVjYXVzZSB0aGUgYCpgIGNoYXJhY3RlciBtdXN0ICcpKyJhbHdheXMgZm9sbG93IGEgYC9gIGluIHRoZSBwYXR0ZXJuLiBUbyBnZXQgcmlkIG9mIHRoaXMgd2FybmluZywgIisoJ3BsZWFzZSBjaGFuZ2UgdGhlIHJvdXRlIHBhdGggdG8gIicrZS5yZXBsYWNlKC9cKiQvLCIvKiIpKyciLicpKTtsZXQgcj1bXSxvPSJeIitlLnJlcGxhY2UoL1wvKlwqPyQvLCIiKS5yZXBsYWNlKC9eXC8qLywiLyIpLnJlcGxhY2UoL1tcXC4qK14ke318KClbXF1dL2csIlxcJCYiKS5yZXBsYWNlKC9cLzooXHcrKShcPyk/L2csKGwscyxhKT0+KHIucHVzaCh7cGFyYW1OYW1lOnMsaXNPcHRpb25hbDphIT1udWxsfSksYT8iLz8oW15cXC9dKyk/IjoiLyhbXlxcL10rKSIpKTtyZXR1cm4gZS5lbmRzV2l0aCgiKiIpPyhyLnB1c2goe3BhcmFtTmFtZToiKiJ9KSxvKz1lPT09IioifHxlPT09Ii8qIj8iKC4qKSQiOiIoPzpcXC8oLispfFxcLyopJCIpOm4/bys9IlxcLyokIjplIT09IiImJmUhPT0iLyImJihvKz0iKD86KD89XFwvfCQpKSIpLFtuZXcgUmVnRXhwKG8sdD92b2lkIDA6ImkiKSxyXX1mdW5jdGlvbiBrTShlKXt0cnl7cmV0dXJuIGRlY29kZVVSSShlKX1jYXRjaCh0KXtyZXR1cm4geWkoITEsJ1RoZSBVUkwgcGF0aCAiJytlKyciIGNvdWxkIG5vdCBiZSBkZWNvZGVkIGJlY2F1c2UgaXQgaXMgaXMgYSBtYWxmb3JtZWQgVVJMIHNlZ21lbnQuIFRoaXMgaXMgcHJvYmFibHkgZHVlIHRvIGEgYmFkIHBlcmNlbnQgJysoImVuY29kaW5nICgiK3QrIikuIikpLGV9fWZ1bmN0aW9uIFRNKGUsdCl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2gobil7cmV0dXJuIHlpKCExLCdUaGUgdmFsdWUgZm9yIHRoZSBVUkwgcGFyYW0gIicrdCsnIiB3aWxsIG5vdCBiZSBkZWNvZGVkIGJlY2F1c2UnKygnIHRoZSBzdHJpbmcgIicrZSsnIiBpcyBhIG1hbGZvcm1lZCBVUkwgc2VnbWVudC4gVGhpcyBpcyBwcm9iYWJseScpKygiIGR1ZSB0byBhIGJhZCBwZXJjZW50IGVuY29kaW5nICgiK24rIikuIikpLGV9fWZ1bmN0aW9uIEJhKGUsdCl7aWYodD09PSIvIilyZXR1cm4gZTtpZighZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgodC50b0xvd2VyQ2FzZSgpKSlyZXR1cm4gbnVsbDtsZXQgbj10LmVuZHNXaXRoKCIvIik/dC5sZW5ndGgtMTp0Lmxlbmd0aCxyPWUuY2hhckF0KG4pO3JldHVybiByJiZyIT09Ii8iP251bGw6ZS5zbGljZShuKXx8Ii8ifWZ1bmN0aW9uIE5NKGUsdCl7dD09PXZvaWQgMCYmKHQ9Ii8iKTtsZXR7cGF0aG5hbWU6bixzZWFyY2g6cj0iIixoYXNoOm89IiJ9PXR5cGVvZiBlPT0ic3RyaW5nIj9KcihlKTplO3JldHVybntwYXRobmFtZTpuP24uc3RhcnRzV2l0aCgiLyIpP246Yk0obix0KTp0LHNlYXJjaDpQTShyKSxoYXNoOk9NKG8pfX1mdW5jdGlvbiBiTShlLHQpe2xldCBuPXQucmVwbGFjZSgvXC8rJC8sIiIpLnNwbGl0KCIvIik7cmV0dXJuIGUuc3BsaXQoIi8iKS5mb3JFYWNoKG89PntvPT09Ii4uIj9uLmxlbmd0aD4xJiZuLnBvcCgpOm8hPT0iLiImJm4ucHVzaChvKX0pLG4ubGVuZ3RoPjE/bi5qb2luKCIvIik6Ii8ifWZ1bmN0aW9uIFBmKGUsdCxuLHIpe3JldHVybiJDYW5ub3QgaW5jbHVkZSBhICciK2UrIicgY2hhcmFjdGVyIGluIGEgbWFudWFsbHkgc3BlY2lmaWVkICIrKCJgdG8uIit0KyJgIGZpZWxkIFsiK0pTT04uc3RyaW5naWZ5KHIpKyJdLiAgUGxlYXNlIHNlcGFyYXRlIGl0IG91dCB0byB0aGUgIikrKCJgdG8uIituKyJgIGZpZWxkLiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgcHJvdmlkZSB0aGUgZnVsbCBwYXRoIGFzICIpKydhIHN0cmluZyBpbiA8TGluayB0bz0iLi4uIj4gYW5kIHRoZSByb3V0ZXIgd2lsbCBwYXJzZSBpdCBmb3IgeW91Lid9ZnVuY3Rpb24gVG0oZSl7cmV0dXJuIGUuZmlsdGVyKCh0LG4pPT5uPT09MHx8dC5yb3V0ZS5wYXRoJiZ0LnJvdXRlLnBhdGgubGVuZ3RoPjApfWZ1bmN0aW9uIEJDKGUsdCxuLHIpe3I9PT12b2lkIDAmJihyPSExKTtsZXQgbzt0eXBlb2YgZT09InN0cmluZyI/bz1KcihlKToobz1ydCh7fSxlKSx3ZSghby5wYXRobmFtZXx8IW8ucGF0aG5hbWUuaW5jbHVkZXMoIj8iKSxQZigiPyIsInBhdGhuYW1lIiwic2VhcmNoIixvKSksd2UoIW8ucGF0aG5hbWV8fCFvLnBhdGhuYW1lLmluY2x1ZGVzKCIjIiksUGYoIiMiLCJwYXRobmFtZSIsImhhc2giLG8pKSx3ZSghby5zZWFyY2h8fCFvLnNlYXJjaC5pbmNsdWRlcygiIyIpLFBmKCIjIiwic2VhcmNoIiwiaGFzaCIsbykpKTtsZXQgaT1lPT09IiJ8fG8ucGF0aG5hbWU9PT0iIixsPWk/Ii8iOm8ucGF0aG5hbWUscztpZihyfHxsPT1udWxsKXM9bjtlbHNle2xldCBkPXQubGVuZ3RoLTE7aWYobC5zdGFydHNXaXRoKCIuLiIpKXtsZXQgZj1sLnNwbGl0KCIvIik7Zm9yKDtmWzBdPT09Ii4uIjspZi5zaGlmdCgpLGQtPTE7by5wYXRobmFtZT1mLmpvaW4oIi8iKX1zPWQ+PTA/dFtkXToiLyJ9bGV0IGE9Tk0obyxzKSx1PWwmJmwhPT0iLyImJmwuZW5kc1dpdGgoIi8iKSxjPShpfHxsPT09Ii4iKSYmbi5lbmRzV2l0aCgiLyIpO3JldHVybiFhLnBhdGhuYW1lLmVuZHNXaXRoKCIvIikmJih1fHxjKSYmKGEucGF0aG5hbWUrPSIvIiksYX1jb25zdCBrbz1lPT5lLmpvaW4oIi8iKS5yZXBsYWNlKC9cL1wvKy9nLCIvIiksUk09ZT0+ZS5yZXBsYWNlKC9cLyskLywiIikucmVwbGFjZSgvXlwvKi8sIi8iKSxQTT1lPT4hZXx8ZT09PSI/Ij8iIjplLnN0YXJ0c1dpdGgoIj8iKT9lOiI/IitlLE9NPWU9PiFlfHxlPT09IiMiPyIiOmUuc3RhcnRzV2l0aCgiIyIpP2U6IiMiK2U7Y2xhc3MgTm17Y29uc3RydWN0b3IodCxuLHIsbyl7bz09PXZvaWQgMCYmKG89ITEpLHRoaXMuc3RhdHVzPXQsdGhpcy5zdGF0dXNUZXh0PW58fCIiLHRoaXMuaW50ZXJuYWw9byxyIGluc3RhbmNlb2YgRXJyb3I/KHRoaXMuZGF0YT1yLnRvU3RyaW5nKCksdGhpcy5lcnJvcj1yKTp0aGlzLmRhdGE9cn19ZnVuY3Rpb24gV0MoZSl7cmV0dXJuIGUhPW51bGwmJnR5cGVvZiBlLnN0YXR1cz09Im51bWJlciImJnR5cGVvZiBlLnN0YXR1c1RleHQ9PSJzdHJpbmciJiZ0eXBlb2YgZS5pbnRlcm5hbD09ImJvb2xlYW4iJiYiZGF0YSJpbiBlfWNvbnN0IFVDPVsicG9zdCIsInB1dCIsInBhdGNoIiwiZGVsZXRlIl0sQU09bmV3IFNldChVQyksTU09WyJnZXQiLC4uLlVDXSxETT1uZXcgU2V0KE1NKSxMTT1uZXcgU2V0KFszMDEsMzAyLDMwMywzMDcsMzA4XSksSU09bmV3IFNldChbMzA3LDMwOF0pLE9mPXtzdGF0ZToiaWRsZSIsbG9jYXRpb246dm9pZCAwLGZvcm1NZXRob2Q6dm9pZCAwLGZvcm1BY3Rpb246dm9pZCAwLGZvcm1FbmNUeXBlOnZvaWQgMCxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDB9LGpNPXtzdGF0ZToiaWRsZSIsZGF0YTp2b2lkIDAsZm9ybU1ldGhvZDp2b2lkIDAsZm9ybUFjdGlvbjp2b2lkIDAsZm9ybUVuY1R5cGU6dm9pZCAwLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0OnZvaWQgMH0sZnM9e3N0YXRlOiJ1bmJsb2NrZWQiLHByb2NlZWQ6dm9pZCAwLHJlc2V0OnZvaWQgMCxsb2NhdGlvbjp2b2lkIDB9LFZDPS9eKD86W2Etel1bYS16MC05Ky4tXSo6fFwvXC8pL2ksek09ZT0+KHtoYXNFcnJvckJvdW5kYXJ5OiEhZS5oYXNFcnJvckJvdW5kYXJ5fSksSEM9InJlbWl4LXJvdXRlci10cmFuc2l0aW9ucyI7ZnVuY3Rpb24gRk0oZSl7Y29uc3QgdD1lLndpbmRvdz9lLndpbmRvdzp0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6dm9pZCAwLG49dHlwZW9mIHQ8InUiJiZ0eXBlb2YgdC5kb2N1bWVudDwidSImJnR5cGVvZiB0LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiLHI9IW47d2UoZS5yb3V0ZXMubGVuZ3RoPjAsIllvdSBtdXN0IHByb3ZpZGUgYSBub24tZW1wdHkgcm91dGVzIGFycmF5IHRvIGNyZWF0ZVJvdXRlciIpO2xldCBvO2lmKGUubWFwUm91dGVQcm9wZXJ0aWVzKW89ZS5tYXBSb3V0ZVByb3BlcnRpZXM7ZWxzZSBpZihlLmRldGVjdEVycm9yQm91bmRhcnkpe2xldCBOPWUuZGV0ZWN0RXJyb3JCb3VuZGFyeTtvPUE9Pih7aGFzRXJyb3JCb3VuZGFyeTpOKEEpfSl9ZWxzZSBvPXpNO2xldCBpPXt9LGw9RXAoZS5yb3V0ZXMsbyx2b2lkIDAsaSkscyxhPWUuYmFzZW5hbWV8fCIvIix1PXJ0KHt2N19mZXRjaGVyUGVyc2lzdDohMSx2N19ub3JtYWxpemVGb3JtTWV0aG9kOiExLHY3X3ByZXBlbmRCYXNlbmFtZTohMX0sZS5mdXR1cmUpLGM9bnVsbCxkPW5ldyBTZXQsZj1udWxsLGg9bnVsbCxnPW51bGwsbT1lLmh5ZHJhdGlvbkRhdGEhPW51bGwsUz1vbChsLGUuaGlzdG9yeS5sb2NhdGlvbixhKSx2PW51bGw7aWYoUz09bnVsbCl7bGV0IE49UG4oNDA0LHtwYXRobmFtZTplLmhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWV9KSx7bWF0Y2hlczpBLHJvdXRlOnp9PUkwKGwpO1M9QSx2PXtbei5pZF06Tn19bGV0IHk9IVMuc29tZShOPT5OLnJvdXRlLmxhenkpJiYoIVMuc29tZShOPT5OLnJvdXRlLmxvYWRlcil8fGUuaHlkcmF0aW9uRGF0YSE9bnVsbCksXyx3PXtoaXN0b3J5QWN0aW9uOmUuaGlzdG9yeS5hY3Rpb24sbG9jYXRpb246ZS5oaXN0b3J5LmxvY2F0aW9uLG1hdGNoZXM6Uyxpbml0aWFsaXplZDp5LG5hdmlnYXRpb246T2YscmVzdG9yZVNjcm9sbFBvc2l0aW9uOmUuaHlkcmF0aW9uRGF0YSE9bnVsbD8hMTpudWxsLHByZXZlbnRTY3JvbGxSZXNldDohMSxyZXZhbGlkYXRpb246ImlkbGUiLGxvYWRlckRhdGE6ZS5oeWRyYXRpb25EYXRhJiZlLmh5ZHJhdGlvbkRhdGEubG9hZGVyRGF0YXx8e30sYWN0aW9uRGF0YTplLmh5ZHJhdGlvbkRhdGEmJmUuaHlkcmF0aW9uRGF0YS5hY3Rpb25EYXRhfHxudWxsLGVycm9yczplLmh5ZHJhdGlvbkRhdGEmJmUuaHlkcmF0aW9uRGF0YS5lcnJvcnN8fHYsZmV0Y2hlcnM6bmV3IE1hcCxibG9ja2VyczpuZXcgTWFwfSxDPWx0LlBvcCwkPSExLEUsVD0hMSxNPW5ldyBNYXAsUj1udWxsLGo9ITEsRj0hMSxhZT1bXSxIPVtdLFg9bmV3IE1hcCxQPTAsTz0tMSxrPW5ldyBNYXAsST1uZXcgU2V0LEw9bmV3IE1hcCxWPW5ldyBNYXAsdGU9bmV3IFNldCx5ZT1uZXcgTWFwLGZlPW5ldyBNYXAsT2U9ITE7ZnVuY3Rpb24gYmUoKXtpZihjPWUuaGlzdG9yeS5saXN0ZW4oTj0+e2xldHthY3Rpb246QSxsb2NhdGlvbjp6LGRlbHRhOkd9PU47aWYoT2Upe09lPSExO3JldHVybn15aShmZS5zaXplPT09MHx8RyE9bnVsbCwiWW91IGFyZSB0cnlpbmcgdG8gdXNlIGEgYmxvY2tlciBvbiBhIFBPUCBuYXZpZ2F0aW9uIHRvIGEgbG9jYXRpb24gdGhhdCB3YXMgbm90IGNyZWF0ZWQgYnkgQHJlbWl4LXJ1bi9yb3V0ZXIuIFRoaXMgd2lsbCBmYWlsIHNpbGVudGx5IGluIHByb2R1Y3Rpb24uIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgYXJlIG5hdmlnYXRpbmcgb3V0c2lkZSB0aGUgcm91dGVyIHZpYSBgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlYC9gd2luZG93LmxvY2F0aW9uLmhhc2hgIGluc3RlYWQgb2YgdXNpbmcgcm91dGVyIG5hdmlnYXRpb24gQVBJcy4gIFRoaXMgY2FuIGFsc28gaGFwcGVuIGlmIHlvdSBhcmUgdXNpbmcgY3JlYXRlSGFzaFJvdXRlciBhbmQgdGhlIHVzZXIgbWFudWFsbHkgY2hhbmdlcyB0aGUgVVJMLiIpO2xldCBpZT1qbSh7Y3VycmVudExvY2F0aW9uOncubG9jYXRpb24sbmV4dExvY2F0aW9uOnosaGlzdG9yeUFjdGlvbjpBfSk7aWYoaWUmJkchPW51bGwpe09lPSEwLGUuaGlzdG9yeS5nbyhHKi0xKSxVYShpZSx7c3RhdGU6ImJsb2NrZWQiLGxvY2F0aW9uOnoscHJvY2VlZCgpe1VhKGllLHtzdGF0ZToicHJvY2VlZGluZyIscHJvY2VlZDp2b2lkIDAscmVzZXQ6dm9pZCAwLGxvY2F0aW9uOnp9KSxlLmhpc3RvcnkuZ28oRyl9LHJlc2V0KCl7bGV0IGxlPW5ldyBNYXAody5ibG9ja2Vycyk7bGUuc2V0KGllLGZzKSxjZSh7YmxvY2tlcnM6bGV9KX19KTtyZXR1cm59cmV0dXJuIEJlKEEseil9KSxuKXtKTSh0LE0pO2xldCBOPSgpPT5aTSh0LE0pO3QuYWRkRXZlbnRMaXN0ZW5lcigicGFnZWhpZGUiLE4pLFI9KCk9PnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicGFnZWhpZGUiLE4pfXJldHVybiB3LmluaXRpYWxpemVkfHxCZShsdC5Qb3Asdy5sb2NhdGlvbiksX31mdW5jdGlvbiBaKCl7YyYmYygpLFImJlIoKSxkLmNsZWFyKCksRSYmRS5hYm9ydCgpLHcuZmV0Y2hlcnMuZm9yRWFjaCgoTixBKT0+T3QoQSkpLHcuYmxvY2tlcnMuZm9yRWFjaCgoTixBKT0+SW0oQSkpfWZ1bmN0aW9uIGtlKE4pe3JldHVybiBkLmFkZChOKSwoKT0+ZC5kZWxldGUoTil9ZnVuY3Rpb24gY2UoTixBKXt3PXJ0KHt9LHcsTik7bGV0IHo9W10sRz1bXTt1LnY3X2ZldGNoZXJQZXJzaXN0JiZ3LmZldGNoZXJzLmZvckVhY2goKGllLGxlKT0+e2llLnN0YXRlPT09ImlkbGUiJiYodGUuaGFzKGxlKT9HLnB1c2gobGUpOnoucHVzaChsZSkpfSksZC5mb3JFYWNoKGllPT5pZSh3LHtkZWxldGVkRmV0Y2hlcnM6Ryx1bnN0YWJsZV92aWV3VHJhbnNpdGlvbk9wdHM6QX0pKSx1LnY3X2ZldGNoZXJQZXJzaXN0JiYoei5mb3JFYWNoKGllPT53LmZldGNoZXJzLmRlbGV0ZShpZSkpLEcuZm9yRWFjaChpZT0+T3QoaWUpKSl9ZnVuY3Rpb24gX2UoTixBKXt2YXIgeixHO2xldCBpZT13LmFjdGlvbkRhdGEhPW51bGwmJncubmF2aWdhdGlvbi5mb3JtTWV0aG9kIT1udWxsJiZYbih3Lm5hdmlnYXRpb24uZm9ybU1ldGhvZCkmJncubmF2aWdhdGlvbi5zdGF0ZT09PSJsb2FkaW5nIiYmKCh6PU4uc3RhdGUpPT1udWxsP3ZvaWQgMDp6Ll9pc1JlZGlyZWN0KSE9PSEwLGxlO0EuYWN0aW9uRGF0YT9PYmplY3Qua2V5cyhBLmFjdGlvbkRhdGEpLmxlbmd0aD4wP2xlPUEuYWN0aW9uRGF0YTpsZT1udWxsOmllP2xlPXcuYWN0aW9uRGF0YTpsZT1udWxsO2xldCBoZT1BLmxvYWRlckRhdGE/TDAody5sb2FkZXJEYXRhLEEubG9hZGVyRGF0YSxBLm1hdGNoZXN8fFtdLEEuZXJyb3JzKTp3LmxvYWRlckRhdGEsc2U9dy5ibG9ja2VycztzZS5zaXplPjAmJihzZT1uZXcgTWFwKHNlKSxzZS5mb3JFYWNoKChRZSxDZSk9PnNlLnNldChDZSxmcykpKTtsZXQgb2U9JD09PSEwfHx3Lm5hdmlnYXRpb24uZm9ybU1ldGhvZCE9bnVsbCYmWG4ody5uYXZpZ2F0aW9uLmZvcm1NZXRob2QpJiYoKEc9Ti5zdGF0ZSk9PW51bGw/dm9pZCAwOkcuX2lzUmVkaXJlY3QpIT09ITA7cyYmKGw9cyxzPXZvaWQgMCksanx8Qz09PWx0LlBvcHx8KEM9PT1sdC5QdXNoP2UuaGlzdG9yeS5wdXNoKE4sTi5zdGF0ZSk6Qz09PWx0LlJlcGxhY2UmJmUuaGlzdG9yeS5yZXBsYWNlKE4sTi5zdGF0ZSkpO2xldCBMZTtpZihDPT09bHQuUG9wKXtsZXQgUWU9TS5nZXQody5sb2NhdGlvbi5wYXRobmFtZSk7UWUmJlFlLmhhcyhOLnBhdGhuYW1lKT9MZT17Y3VycmVudExvY2F0aW9uOncubG9jYXRpb24sbmV4dExvY2F0aW9uOk59Ok0uaGFzKE4ucGF0aG5hbWUpJiYoTGU9e2N1cnJlbnRMb2NhdGlvbjpOLG5leHRMb2NhdGlvbjp3LmxvY2F0aW9ufSl9ZWxzZSBpZihUKXtsZXQgUWU9TS5nZXQody5sb2NhdGlvbi5wYXRobmFtZSk7UWU/UWUuYWRkKE4ucGF0aG5hbWUpOihRZT1uZXcgU2V0KFtOLnBhdGhuYW1lXSksTS5zZXQody5sb2NhdGlvbi5wYXRobmFtZSxRZSkpLExlPXtjdXJyZW50TG9jYXRpb246dy5sb2NhdGlvbixuZXh0TG9jYXRpb246Tn19Y2UocnQoe30sQSx7YWN0aW9uRGF0YTpsZSxsb2FkZXJEYXRhOmhlLGhpc3RvcnlBY3Rpb246Qyxsb2NhdGlvbjpOLGluaXRpYWxpemVkOiEwLG5hdmlnYXRpb246T2YscmV2YWxpZGF0aW9uOiJpZGxlIixyZXN0b3JlU2Nyb2xsUG9zaXRpb246Rm0oTixBLm1hdGNoZXN8fHcubWF0Y2hlcykscHJldmVudFNjcm9sbFJlc2V0Om9lLGJsb2NrZXJzOnNlfSksTGUpLEM9bHQuUG9wLCQ9ITEsVD0hMSxqPSExLEY9ITEsYWU9W10sSD1bXX1hc3luYyBmdW5jdGlvbiBtZShOLEEpe2lmKHR5cGVvZiBOPT0ibnVtYmVyIil7ZS5oaXN0b3J5LmdvKE4pO3JldHVybn1sZXQgej0kcCh3LmxvY2F0aW9uLHcubWF0Y2hlcyxhLHUudjdfcHJlcGVuZEJhc2VuYW1lLE4sQT09bnVsbD92b2lkIDA6QS5mcm9tUm91dGVJZCxBPT1udWxsP3ZvaWQgMDpBLnJlbGF0aXZlKSx7cGF0aDpHLHN1Ym1pc3Npb246aWUsZXJyb3I6bGV9PVIwKHUudjdfbm9ybWFsaXplRm9ybU1ldGhvZCwhMSx6LEEpLGhlPXcubG9jYXRpb24sc2U9U2Eody5sb2NhdGlvbixHLEEmJkEuc3RhdGUpO3NlPXJ0KHt9LHNlLGUuaGlzdG9yeS5lbmNvZGVMb2NhdGlvbihzZSkpO2xldCBvZT1BJiZBLnJlcGxhY2UhPW51bGw/QS5yZXBsYWNlOnZvaWQgMCxMZT1sdC5QdXNoO29lPT09ITA/TGU9bHQuUmVwbGFjZTpvZT09PSExfHxpZSE9bnVsbCYmWG4oaWUuZm9ybU1ldGhvZCkmJmllLmZvcm1BY3Rpb249PT13LmxvY2F0aW9uLnBhdGhuYW1lK3cubG9jYXRpb24uc2VhcmNoJiYoTGU9bHQuUmVwbGFjZSk7bGV0IFFlPUEmJiJwcmV2ZW50U2Nyb2xsUmVzZXQiaW4gQT9BLnByZXZlbnRTY3JvbGxSZXNldD09PSEwOnZvaWQgMCxDZT1qbSh7Y3VycmVudExvY2F0aW9uOmhlLG5leHRMb2NhdGlvbjpzZSxoaXN0b3J5QWN0aW9uOkxlfSk7aWYoQ2Upe1VhKENlLHtzdGF0ZToiYmxvY2tlZCIsbG9jYXRpb246c2UscHJvY2VlZCgpe1VhKENlLHtzdGF0ZToicHJvY2VlZGluZyIscHJvY2VlZDp2b2lkIDAscmVzZXQ6dm9pZCAwLGxvY2F0aW9uOnNlfSksbWUoTixBKX0scmVzZXQoKXtsZXQgSWU9bmV3IE1hcCh3LmJsb2NrZXJzKTtJZS5zZXQoQ2UsZnMpLGNlKHtibG9ja2VyczpJZX0pfX0pO3JldHVybn1yZXR1cm4gYXdhaXQgQmUoTGUsc2Use3N1Ym1pc3Npb246aWUscGVuZGluZ0Vycm9yOmxlLHByZXZlbnRTY3JvbGxSZXNldDpRZSxyZXBsYWNlOkEmJkEucmVwbGFjZSxlbmFibGVWaWV3VHJhbnNpdGlvbjpBJiZBLnVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9ufSl9ZnVuY3Rpb24gJGUoKXtpZihJdCgpLGNlKHtyZXZhbGlkYXRpb246ImxvYWRpbmcifSksdy5uYXZpZ2F0aW9uLnN0YXRlIT09InN1Ym1pdHRpbmciKXtpZih3Lm5hdmlnYXRpb24uc3RhdGU9PT0iaWRsZSIpe0JlKHcuaGlzdG9yeUFjdGlvbix3LmxvY2F0aW9uLHtzdGFydFVuaW50ZXJydXB0ZWRSZXZhbGlkYXRpb246ITB9KTtyZXR1cm59QmUoQ3x8dy5oaXN0b3J5QWN0aW9uLHcubmF2aWdhdGlvbi5sb2NhdGlvbix7b3ZlcnJpZGVOYXZpZ2F0aW9uOncubmF2aWdhdGlvbn0pfX1hc3luYyBmdW5jdGlvbiBCZShOLEEseil7RSYmRS5hYm9ydCgpLEU9bnVsbCxDPU4saj0oeiYmei5zdGFydFVuaW50ZXJydXB0ZWRSZXZhbGlkYXRpb24pPT09ITAsd0Uody5sb2NhdGlvbix3Lm1hdGNoZXMpLCQ9KHomJnoucHJldmVudFNjcm9sbFJlc2V0KT09PSEwLFQ9KHomJnouZW5hYmxlVmlld1RyYW5zaXRpb24pPT09ITA7bGV0IEc9c3x8bCxpZT16JiZ6Lm92ZXJyaWRlTmF2aWdhdGlvbixsZT1vbChHLEEsYSk7aWYoIWxlKXtsZXQgSWU9UG4oNDA0LHtwYXRobmFtZTpBLnBhdGhuYW1lfSkse21hdGNoZXM6cHQscm91dGU6VW99PUkwKEcpO01kKCksX2UoQSx7bWF0Y2hlczpwdCxsb2FkZXJEYXRhOnt9LGVycm9yczp7W1VvLmlkXTpJZX19KTtyZXR1cm59aWYody5pbml0aWFsaXplZCYmIUYmJkhNKHcubG9jYXRpb24sQSkmJiEoeiYmei5zdWJtaXNzaW9uJiZYbih6LnN1Ym1pc3Npb24uZm9ybU1ldGhvZCkpKXtfZShBLHttYXRjaGVzOmxlfSk7cmV0dXJufUU9bmV3IEFib3J0Q29udHJvbGxlcjtsZXQgaGU9cHMoZS5oaXN0b3J5LEEsRS5zaWduYWwseiYmei5zdWJtaXNzaW9uKSxzZSxvZTtpZih6JiZ6LnBlbmRpbmdFcnJvcilvZT17W1ZzKGxlKS5yb3V0ZS5pZF06ei5wZW5kaW5nRXJyb3J9O2Vsc2UgaWYoeiYmei5zdWJtaXNzaW9uJiZYbih6LnN1Ym1pc3Npb24uZm9ybU1ldGhvZCkpe2xldCBJZT1hd2FpdCBQdChoZSxBLHouc3VibWlzc2lvbixsZSx7cmVwbGFjZTp6LnJlcGxhY2V9KTtpZihJZS5zaG9ydENpcmN1aXRlZClyZXR1cm47c2U9SWUucGVuZGluZ0FjdGlvbkRhdGEsb2U9SWUucGVuZGluZ0FjdGlvbkVycm9yLGllPUFmKEEsei5zdWJtaXNzaW9uKSxoZT1uZXcgUmVxdWVzdChoZS51cmwse3NpZ25hbDpoZS5zaWduYWx9KX1sZXR7c2hvcnRDaXJjdWl0ZWQ6TGUsbG9hZGVyRGF0YTpRZSxlcnJvcnM6Q2V9PWF3YWl0IHNuKGhlLEEsbGUsaWUseiYmei5zdWJtaXNzaW9uLHomJnouZmV0Y2hlclN1Ym1pc3Npb24seiYmei5yZXBsYWNlLHNlLG9lKTtMZXx8KEU9bnVsbCxfZShBLHJ0KHttYXRjaGVzOmxlfSxzZT97YWN0aW9uRGF0YTpzZX06e30se2xvYWRlckRhdGE6UWUsZXJyb3JzOkNlfSkpKX1hc3luYyBmdW5jdGlvbiBQdChOLEEseixHLGllKXtpZT09PXZvaWQgMCYmKGllPXt9KSxJdCgpO2xldCBsZT1YTShBLHopO2NlKHtuYXZpZ2F0aW9uOmxlfSk7bGV0IGhlLHNlPVRwKEcsQSk7aWYoIXNlLnJvdXRlLmFjdGlvbiYmIXNlLnJvdXRlLmxhenkpaGU9e3R5cGU6c3QuZXJyb3IsZXJyb3I6UG4oNDA1LHttZXRob2Q6Ti5tZXRob2QscGF0aG5hbWU6QS5wYXRobmFtZSxyb3V0ZUlkOnNlLnJvdXRlLmlkfSl9O2Vsc2UgaWYoaGU9YXdhaXQgaHMoImFjdGlvbiIsTixzZSxHLGksbyxhKSxOLnNpZ25hbC5hYm9ydGVkKXJldHVybntzaG9ydENpcmN1aXRlZDohMH07aWYobWwoaGUpKXtsZXQgb2U7cmV0dXJuIGllJiZpZS5yZXBsYWNlIT1udWxsP29lPWllLnJlcGxhY2U6b2U9aGUubG9jYXRpb249PT13LmxvY2F0aW9uLnBhdGhuYW1lK3cubG9jYXRpb24uc2VhcmNoLGF3YWl0IF90KHcsaGUse3N1Ym1pc3Npb246eixyZXBsYWNlOm9lfSkse3Nob3J0Q2lyY3VpdGVkOiEwfX1pZihIcyhoZSkpe2xldCBvZT1WcyhHLHNlLnJvdXRlLmlkKTtyZXR1cm4oaWUmJmllLnJlcGxhY2UpIT09ITAmJihDPWx0LlB1c2gpLHtwZW5kaW5nQWN0aW9uRGF0YTp7fSxwZW5kaW5nQWN0aW9uRXJyb3I6e1tvZS5yb3V0ZS5pZF06aGUuZXJyb3J9fX1pZihlaShoZSkpdGhyb3cgUG4oNDAwLHt0eXBlOiJkZWZlci1hY3Rpb24ifSk7cmV0dXJue3BlbmRpbmdBY3Rpb25EYXRhOntbc2Uucm91dGUuaWRdOmhlLmRhdGF9fX1hc3luYyBmdW5jdGlvbiBzbihOLEEseixHLGllLGxlLGhlLHNlLG9lKXtsZXQgTGU9R3x8QWYoQSxpZSksUWU9aWV8fGxlfHxGMChMZSksQ2U9c3x8bCxbSWUscHRdPVAwKGUuaGlzdG9yeSx3LHosUWUsQSxGLGFlLEgsTCxJLENlLGEsc2Usb2UpO2lmKE1kKEFlPT4hKHomJnouc29tZShVbj0+VW4ucm91dGUuaWQ9PT1BZSkpfHxJZSYmSWUuc29tZShVbj0+VW4ucm91dGUuaWQ9PT1BZSkpLE89KytQLEllLmxlbmd0aD09PTAmJnB0Lmxlbmd0aD09PTApe2xldCBBZT1pcigpO3JldHVybiBfZShBLHJ0KHttYXRjaGVzOnosbG9hZGVyRGF0YTp7fSxlcnJvcnM6b2V8fG51bGx9LHNlP3thY3Rpb25EYXRhOnNlfTp7fSxBZT97ZmV0Y2hlcnM6bmV3IE1hcCh3LmZldGNoZXJzKX06e30pKSx7c2hvcnRDaXJjdWl0ZWQ6ITB9fWlmKCFqKXtwdC5mb3JFYWNoKFVuPT57bGV0IHFyPXcuZmV0Y2hlcnMuZ2V0KFVuLmtleSksaXQ9Z3Modm9pZCAwLHFyP3FyLmRhdGE6dm9pZCAwKTt3LmZldGNoZXJzLnNldChVbi5rZXksaXQpfSk7bGV0IEFlPXNlfHx3LmFjdGlvbkRhdGE7Y2UocnQoe25hdmlnYXRpb246TGV9LEFlP09iamVjdC5rZXlzKEFlKS5sZW5ndGg9PT0wP3thY3Rpb25EYXRhOm51bGx9OnthY3Rpb25EYXRhOkFlfTp7fSxwdC5sZW5ndGg+MD97ZmV0Y2hlcnM6bmV3IE1hcCh3LmZldGNoZXJzKX06e30pKX1wdC5mb3JFYWNoKEFlPT57WC5oYXMoQWUua2V5KSYmanQoQWUua2V5KSxBZS5jb250cm9sbGVyJiZYLnNldChBZS5rZXksQWUuY29udHJvbGxlcil9KTtsZXQgVW89KCk9PnB0LmZvckVhY2goQWU9Pmp0KEFlLmtleSkpO0UmJkUuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixVbyk7bGV0e3Jlc3VsdHM6Vm8sbG9hZGVyUmVzdWx0czpxbCxmZXRjaGVyUmVzdWx0czpEZH09YXdhaXQgZ24ody5tYXRjaGVzLHosSWUscHQsTik7aWYoTi5zaWduYWwuYWJvcnRlZClyZXR1cm57c2hvcnRDaXJjdWl0ZWQ6ITB9O0UmJkUuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixVbykscHQuZm9yRWFjaChBZT0+WC5kZWxldGUoQWUua2V5KSk7bGV0IGtyPWowKFZvKTtpZihrcil7aWYoa3IuaWR4Pj1JZS5sZW5ndGgpe2xldCBBZT1wdFtrci5pZHgtSWUubGVuZ3RoXS5rZXk7SS5hZGQoQWUpfXJldHVybiBhd2FpdCBfdCh3LGtyLnJlc3VsdCx7cmVwbGFjZTpoZX0pLHtzaG9ydENpcmN1aXRlZDohMH19bGV0e2xvYWRlckRhdGE6WnIsZXJyb3JzOlZhfT1EMCh3LHosSWUscWwsb2UscHQsRGQseWUpO3llLmZvckVhY2goKEFlLFVuKT0+e0FlLnN1YnNjcmliZShxcj0+eyhxcnx8QWUuZG9uZSkmJnllLmRlbGV0ZShVbil9KX0pO2xldCBMZD1pcigpLElkPVdvKE8pLGpkPUxkfHxJZHx8cHQubGVuZ3RoPjA7cmV0dXJuIHJ0KHtsb2FkZXJEYXRhOlpyLGVycm9yczpWYX0samQ/e2ZldGNoZXJzOm5ldyBNYXAody5mZXRjaGVycyl9Ont9KX1mdW5jdGlvbiBSbihOKXtyZXR1cm4gdS52N19mZXRjaGVyUGVyc2lzdCYmKFYuc2V0KE4sKFYuZ2V0KE4pfHwwKSsxKSx0ZS5oYXMoTikmJnRlLmRlbGV0ZShOKSksdy5mZXRjaGVycy5nZXQoTil8fGpNfWZ1bmN0aW9uIFRlKE4sQSx6LEcpe2lmKHIpdGhyb3cgbmV3IEVycm9yKCJyb3V0ZXIuZmV0Y2goKSB3YXMgY2FsbGVkIGR1cmluZyB0aGUgc2VydmVyIHJlbmRlciwgYnV0IGl0IHNob3VsZG4ndCBiZS4gWW91IGFyZSBsaWtlbHkgY2FsbGluZyBhIHVzZUZldGNoZXIoKSBtZXRob2QgaW4gdGhlIGJvZHkgb2YgeW91ciBjb21wb25lbnQuIFRyeSBtb3ZpbmcgaXQgdG8gYSB1c2VFZmZlY3Qgb3IgYSBjYWxsYmFjay4iKTtYLmhhcyhOKSYmanQoTik7bGV0IGllPXN8fGwsbGU9JHAody5sb2NhdGlvbix3Lm1hdGNoZXMsYSx1LnY3X3ByZXBlbmRCYXNlbmFtZSx6LEEsRz09bnVsbD92b2lkIDA6Ry5yZWxhdGl2ZSksaGU9b2woaWUsbGUsYSk7aWYoIWhlKXt3dChOLEEsUG4oNDA0LHtwYXRobmFtZTpsZX0pKTtyZXR1cm59bGV0e3BhdGg6c2Usc3VibWlzc2lvbjpvZSxlcnJvcjpMZX09UjAodS52N19ub3JtYWxpemVGb3JtTWV0aG9kLCEwLGxlLEcpO2lmKExlKXt3dChOLEEsTGUpO3JldHVybn1sZXQgUWU9VHAoaGUsc2UpO2lmKCQ9KEcmJkcucHJldmVudFNjcm9sbFJlc2V0KT09PSEwLG9lJiZYbihvZS5mb3JtTWV0aG9kKSl7ZnQoTixBLHNlLFFlLGhlLG9lKTtyZXR1cm59TC5zZXQoTix7cm91dGVJZDpBLHBhdGg6c2V9KSxodChOLEEsc2UsUWUsaGUsb2UpfWFzeW5jIGZ1bmN0aW9uIGZ0KE4sQSx6LEcsaWUsbGUpe2lmKEl0KCksTC5kZWxldGUoTiksIUcucm91dGUuYWN0aW9uJiYhRy5yb3V0ZS5sYXp5KXtsZXQgaXQ9UG4oNDA1LHttZXRob2Q6bGUuZm9ybU1ldGhvZCxwYXRobmFtZTp6LHJvdXRlSWQ6QX0pO3d0KE4sQSxpdCk7cmV0dXJufWxldCBoZT13LmZldGNoZXJzLmdldChOKSxzZT1RTShsZSxoZSk7dy5mZXRjaGVycy5zZXQoTixzZSksY2Uoe2ZldGNoZXJzOm5ldyBNYXAody5mZXRjaGVycyl9KTtsZXQgb2U9bmV3IEFib3J0Q29udHJvbGxlcixMZT1wcyhlLmhpc3RvcnkseixvZS5zaWduYWwsbGUpO1guc2V0KE4sb2UpO2xldCBRZT1QLENlPWF3YWl0IGhzKCJhY3Rpb24iLExlLEcsaWUsaSxvLGEpO2lmKExlLnNpZ25hbC5hYm9ydGVkKXtYLmdldChOKT09PW9lJiZYLmRlbGV0ZShOKTtyZXR1cm59aWYodGUuaGFzKE4pKXt3LmZldGNoZXJzLnNldChOLGlvKHZvaWQgMCkpLGNlKHtmZXRjaGVyczpuZXcgTWFwKHcuZmV0Y2hlcnMpfSk7cmV0dXJufWlmKG1sKENlKSlpZihYLmRlbGV0ZShOKSxPPlFlKXtsZXQgaXQ9aW8odm9pZCAwKTt3LmZldGNoZXJzLnNldChOLGl0KSxjZSh7ZmV0Y2hlcnM6bmV3IE1hcCh3LmZldGNoZXJzKX0pO3JldHVybn1lbHNle0kuYWRkKE4pO2xldCBpdD1ncyhsZSk7cmV0dXJuIHcuZmV0Y2hlcnMuc2V0KE4saXQpLGNlKHtmZXRjaGVyczpuZXcgTWFwKHcuZmV0Y2hlcnMpfSksX3QodyxDZSx7ZmV0Y2hlclN1Ym1pc3Npb246bGV9KX1pZihIcyhDZSkpe3d0KE4sQSxDZS5lcnJvcik7cmV0dXJufWlmKGVpKENlKSl0aHJvdyBQbig0MDAse3R5cGU6ImRlZmVyLWFjdGlvbiJ9KTtsZXQgSWU9dy5uYXZpZ2F0aW9uLmxvY2F0aW9ufHx3LmxvY2F0aW9uLHB0PXBzKGUuaGlzdG9yeSxJZSxvZS5zaWduYWwpLFVvPXN8fGwsVm89dy5uYXZpZ2F0aW9uLnN0YXRlIT09ImlkbGUiP29sKFVvLHcubmF2aWdhdGlvbi5sb2NhdGlvbixhKTp3Lm1hdGNoZXM7d2UoVm8sIkRpZG4ndCBmaW5kIGFueSBtYXRjaGVzIGFmdGVyIGZldGNoZXIgYWN0aW9uIik7bGV0IHFsPSsrUDtrLnNldChOLHFsKTtsZXQgRGQ9Z3MobGUsQ2UuZGF0YSk7dy5mZXRjaGVycy5zZXQoTixEZCk7bGV0W2tyLFpyXT1QMChlLmhpc3RvcnksdyxWbyxsZSxJZSxGLGFlLEgsTCxJLFVvLGEse1tHLnJvdXRlLmlkXTpDZS5kYXRhfSx2b2lkIDApO1pyLmZpbHRlcihpdD0+aXQua2V5IT09TikuZm9yRWFjaChpdD0+e2xldCBlcz1pdC5rZXksQm09dy5mZXRjaGVycy5nZXQoZXMpLENFPWdzKHZvaWQgMCxCbT9CbS5kYXRhOnZvaWQgMCk7dy5mZXRjaGVycy5zZXQoZXMsQ0UpLFguaGFzKGVzKSYmanQoZXMpLGl0LmNvbnRyb2xsZXImJlguc2V0KGVzLGl0LmNvbnRyb2xsZXIpfSksY2Uoe2ZldGNoZXJzOm5ldyBNYXAody5mZXRjaGVycyl9KTtsZXQgVmE9KCk9PlpyLmZvckVhY2goaXQ9Pmp0KGl0LmtleSkpO29lLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsVmEpO2xldHtyZXN1bHRzOkxkLGxvYWRlclJlc3VsdHM6SWQsZmV0Y2hlclJlc3VsdHM6amR9PWF3YWl0IGduKHcubWF0Y2hlcyxWbyxrcixacixwdCk7aWYob2Uuc2lnbmFsLmFib3J0ZWQpcmV0dXJuO29lLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsVmEpLGsuZGVsZXRlKE4pLFguZGVsZXRlKE4pLFpyLmZvckVhY2goaXQ9PlguZGVsZXRlKGl0LmtleSkpO2xldCBBZT1qMChMZCk7aWYoQWUpe2lmKEFlLmlkeD49a3IubGVuZ3RoKXtsZXQgaXQ9WnJbQWUuaWR4LWtyLmxlbmd0aF0ua2V5O0kuYWRkKGl0KX1yZXR1cm4gX3QodyxBZS5yZXN1bHQpfWxldHtsb2FkZXJEYXRhOlVuLGVycm9yczpxcn09RDAodyx3Lm1hdGNoZXMsa3IsSWQsdm9pZCAwLFpyLGpkLHllKTtpZih3LmZldGNoZXJzLmhhcyhOKSl7bGV0IGl0PWlvKENlLmRhdGEpO3cuZmV0Y2hlcnMuc2V0KE4saXQpfVdvKHFsKSx3Lm5hdmlnYXRpb24uc3RhdGU9PT0ibG9hZGluZyImJnFsPk8/KHdlKEMsIkV4cGVjdGVkIHBlbmRpbmcgYWN0aW9uIiksRSYmRS5hYm9ydCgpLF9lKHcubmF2aWdhdGlvbi5sb2NhdGlvbix7bWF0Y2hlczpWbyxsb2FkZXJEYXRhOlVuLGVycm9yczpxcixmZXRjaGVyczpuZXcgTWFwKHcuZmV0Y2hlcnMpfSkpOihjZSh7ZXJyb3JzOnFyLGxvYWRlckRhdGE6TDAody5sb2FkZXJEYXRhLFVuLFZvLHFyKSxmZXRjaGVyczpuZXcgTWFwKHcuZmV0Y2hlcnMpfSksRj0hMSl9YXN5bmMgZnVuY3Rpb24gaHQoTixBLHosRyxpZSxsZSl7bGV0IGhlPXcuZmV0Y2hlcnMuZ2V0KE4pLHNlPWdzKGxlLGhlP2hlLmRhdGE6dm9pZCAwKTt3LmZldGNoZXJzLnNldChOLHNlKSxjZSh7ZmV0Y2hlcnM6bmV3IE1hcCh3LmZldGNoZXJzKX0pO2xldCBvZT1uZXcgQWJvcnRDb250cm9sbGVyLExlPXBzKGUuaGlzdG9yeSx6LG9lLnNpZ25hbCk7WC5zZXQoTixvZSk7bGV0IFFlPVAsQ2U9YXdhaXQgaHMoImxvYWRlciIsTGUsRyxpZSxpLG8sYSk7aWYoZWkoQ2UpJiYoQ2U9YXdhaXQgWUMoQ2UsTGUuc2lnbmFsLCEwKXx8Q2UpLFguZ2V0KE4pPT09b2UmJlguZGVsZXRlKE4pLExlLnNpZ25hbC5hYm9ydGVkKXJldHVybjtpZih0ZS5oYXMoTikpe3cuZmV0Y2hlcnMuc2V0KE4saW8odm9pZCAwKSksY2Uoe2ZldGNoZXJzOm5ldyBNYXAody5mZXRjaGVycyl9KTtyZXR1cm59aWYobWwoQ2UpKWlmKE8+UWUpe2xldCBwdD1pbyh2b2lkIDApO3cuZmV0Y2hlcnMuc2V0KE4scHQpLGNlKHtmZXRjaGVyczpuZXcgTWFwKHcuZmV0Y2hlcnMpfSk7cmV0dXJufWVsc2V7SS5hZGQoTiksYXdhaXQgX3QodyxDZSk7cmV0dXJufWlmKEhzKENlKSl7d3QoTixBLENlLmVycm9yKTtyZXR1cm59d2UoIWVpKENlKSwiVW5oYW5kbGVkIGZldGNoZXIgZGVmZXJyZWQgZGF0YSIpO2xldCBJZT1pbyhDZS5kYXRhKTt3LmZldGNoZXJzLnNldChOLEllKSxjZSh7ZmV0Y2hlcnM6bmV3IE1hcCh3LmZldGNoZXJzKX0pfWFzeW5jIGZ1bmN0aW9uIF90KE4sQSx6KXtsZXR7c3VibWlzc2lvbjpHLGZldGNoZXJTdWJtaXNzaW9uOmllLHJlcGxhY2U6bGV9PXo9PT12b2lkIDA/e306ejtBLnJldmFsaWRhdGUmJihGPSEwKTtsZXQgaGU9U2EoTi5sb2NhdGlvbixBLmxvY2F0aW9uLHtfaXNSZWRpcmVjdDohMH0pO2lmKHdlKGhlLCJFeHBlY3RlZCBhIGxvY2F0aW9uIG9uIHRoZSByZWRpcmVjdCBuYXZpZ2F0aW9uIiksbil7bGV0IEllPSExO2lmKEEucmVsb2FkRG9jdW1lbnQpSWU9ITA7ZWxzZSBpZihWQy50ZXN0KEEubG9jYXRpb24pKXtjb25zdCBwdD1lLmhpc3RvcnkuY3JlYXRlVVJMKEEubG9jYXRpb24pO0llPXB0Lm9yaWdpbiE9PXQubG9jYXRpb24ub3JpZ2lufHxCYShwdC5wYXRobmFtZSxhKT09bnVsbH1pZihJZSl7bGU/dC5sb2NhdGlvbi5yZXBsYWNlKEEubG9jYXRpb24pOnQubG9jYXRpb24uYXNzaWduKEEubG9jYXRpb24pO3JldHVybn19RT1udWxsO2xldCBzZT1sZT09PSEwP2x0LlJlcGxhY2U6bHQuUHVzaCx7Zm9ybU1ldGhvZDpvZSxmb3JtQWN0aW9uOkxlLGZvcm1FbmNUeXBlOlFlfT1OLm5hdmlnYXRpb247IUcmJiFpZSYmb2UmJkxlJiZRZSYmKEc9RjAoTi5uYXZpZ2F0aW9uKSk7bGV0IENlPUd8fGllO2lmKElNLmhhcyhBLnN0YXR1cykmJkNlJiZYbihDZS5mb3JtTWV0aG9kKSlhd2FpdCBCZShzZSxoZSx7c3VibWlzc2lvbjpydCh7fSxDZSx7Zm9ybUFjdGlvbjpBLmxvY2F0aW9ufSkscHJldmVudFNjcm9sbFJlc2V0OiR9KTtlbHNle2xldCBJZT1BZihoZSxHKTthd2FpdCBCZShzZSxoZSx7b3ZlcnJpZGVOYXZpZ2F0aW9uOkllLGZldGNoZXJTdWJtaXNzaW9uOmllLHByZXZlbnRTY3JvbGxSZXNldDokfSl9fWFzeW5jIGZ1bmN0aW9uIGduKE4sQSx6LEcsaWUpe2xldCBsZT1hd2FpdCBQcm9taXNlLmFsbChbLi4uei5tYXAob2U9PmhzKCJsb2FkZXIiLGllLG9lLEEsaSxvLGEpKSwuLi5HLm1hcChvZT0+b2UubWF0Y2hlcyYmb2UubWF0Y2gmJm9lLmNvbnRyb2xsZXI/aHMoImxvYWRlciIscHMoZS5oaXN0b3J5LG9lLnBhdGgsb2UuY29udHJvbGxlci5zaWduYWwpLG9lLm1hdGNoLG9lLm1hdGNoZXMsaSxvLGEpOnt0eXBlOnN0LmVycm9yLGVycm9yOlBuKDQwNCx7cGF0aG5hbWU6b2UucGF0aH0pfSldKSxoZT1sZS5zbGljZSgwLHoubGVuZ3RoKSxzZT1sZS5zbGljZSh6Lmxlbmd0aCk7cmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFt6MChOLHosaGUsaGUubWFwKCgpPT5pZS5zaWduYWwpLCExLHcubG9hZGVyRGF0YSksejAoTixHLm1hcChvZT0+b2UubWF0Y2gpLHNlLEcubWFwKG9lPT5vZS5jb250cm9sbGVyP29lLmNvbnRyb2xsZXIuc2lnbmFsOm51bGwpLCEwKV0pLHtyZXN1bHRzOmxlLGxvYWRlclJlc3VsdHM6aGUsZmV0Y2hlclJlc3VsdHM6c2V9fWZ1bmN0aW9uIEl0KCl7Rj0hMCxhZS5wdXNoKC4uLk1kKCkpLEwuZm9yRWFjaCgoTixBKT0+e1guaGFzKEEpJiYoSC5wdXNoKEEpLGp0KEEpKX0pfWZ1bmN0aW9uIHd0KE4sQSx6KXtsZXQgRz1Wcyh3Lm1hdGNoZXMsQSk7T3QoTiksY2Uoe2Vycm9yczp7W0cucm91dGUuaWRdOnp9LGZldGNoZXJzOm5ldyBNYXAody5mZXRjaGVycyl9KX1mdW5jdGlvbiBPdChOKXtsZXQgQT13LmZldGNoZXJzLmdldChOKTtYLmhhcyhOKSYmIShBJiZBLnN0YXRlPT09ImxvYWRpbmciJiZrLmhhcyhOKSkmJmp0KE4pLEwuZGVsZXRlKE4pLGsuZGVsZXRlKE4pLEkuZGVsZXRlKE4pLHRlLmRlbGV0ZShOKSx3LmZldGNoZXJzLmRlbGV0ZShOKX1mdW5jdGlvbiBvcihOKXtpZih1LnY3X2ZldGNoZXJQZXJzaXN0KXtsZXQgQT0oVi5nZXQoTil8fDApLTE7QTw9MD8oVi5kZWxldGUoTiksdGUuYWRkKE4pKTpWLnNldChOLEEpfWVsc2UgT3QoTik7Y2Uoe2ZldGNoZXJzOm5ldyBNYXAody5mZXRjaGVycyl9KX1mdW5jdGlvbiBqdChOKXtsZXQgQT1YLmdldChOKTt3ZShBLCJFeHBlY3RlZCBmZXRjaCBjb250cm9sbGVyOiAiK04pLEEuYWJvcnQoKSxYLmRlbGV0ZShOKX1mdW5jdGlvbiB6dChOKXtmb3IobGV0IEEgb2YgTil7bGV0IHo9Um4oQSksRz1pbyh6LmRhdGEpO3cuZmV0Y2hlcnMuc2V0KEEsRyl9fWZ1bmN0aW9uIGlyKCl7bGV0IE49W10sQT0hMTtmb3IobGV0IHogb2YgSSl7bGV0IEc9dy5mZXRjaGVycy5nZXQoeik7d2UoRywiRXhwZWN0ZWQgZmV0Y2hlcjogIit6KSxHLnN0YXRlPT09ImxvYWRpbmciJiYoSS5kZWxldGUoeiksTi5wdXNoKHopLEE9ITApfXJldHVybiB6dChOKSxBfWZ1bmN0aW9uIFdvKE4pe2xldCBBPVtdO2ZvcihsZXRbeixHXW9mIGspaWYoRzxOKXtsZXQgaWU9dy5mZXRjaGVycy5nZXQoeik7d2UoaWUsIkV4cGVjdGVkIGZldGNoZXI6ICIreiksaWUuc3RhdGU9PT0ibG9hZGluZyImJihqdCh6KSxrLmRlbGV0ZSh6KSxBLnB1c2goeikpfXJldHVybiB6dChBKSxBLmxlbmd0aD4wfWZ1bmN0aW9uIFdhKE4sQSl7bGV0IHo9dy5ibG9ja2Vycy5nZXQoTil8fGZzO3JldHVybiBmZS5nZXQoTikhPT1BJiZmZS5zZXQoTixBKSx6fWZ1bmN0aW9uIEltKE4pe3cuYmxvY2tlcnMuZGVsZXRlKE4pLGZlLmRlbGV0ZShOKX1mdW5jdGlvbiBVYShOLEEpe2xldCB6PXcuYmxvY2tlcnMuZ2V0KE4pfHxmczt3ZSh6LnN0YXRlPT09InVuYmxvY2tlZCImJkEuc3RhdGU9PT0iYmxvY2tlZCJ8fHouc3RhdGU9PT0iYmxvY2tlZCImJkEuc3RhdGU9PT0iYmxvY2tlZCJ8fHouc3RhdGU9PT0iYmxvY2tlZCImJkEuc3RhdGU9PT0icHJvY2VlZGluZyJ8fHouc3RhdGU9PT0iYmxvY2tlZCImJkEuc3RhdGU9PT0idW5ibG9ja2VkInx8ei5zdGF0ZT09PSJwcm9jZWVkaW5nIiYmQS5zdGF0ZT09PSJ1bmJsb2NrZWQiLCJJbnZhbGlkIGJsb2NrZXIgc3RhdGUgdHJhbnNpdGlvbjogIit6LnN0YXRlKyIgLT4gIitBLnN0YXRlKTtsZXQgRz1uZXcgTWFwKHcuYmxvY2tlcnMpO0cuc2V0KE4sQSksY2Uoe2Jsb2NrZXJzOkd9KX1mdW5jdGlvbiBqbShOKXtsZXR7Y3VycmVudExvY2F0aW9uOkEsbmV4dExvY2F0aW9uOnosaGlzdG9yeUFjdGlvbjpHfT1OO2lmKGZlLnNpemU9PT0wKXJldHVybjtmZS5zaXplPjEmJnlpKCExLCJBIHJvdXRlciBvbmx5IHN1cHBvcnRzIG9uZSBibG9ja2VyIGF0IGEgdGltZSIpO2xldCBpZT1BcnJheS5mcm9tKGZlLmVudHJpZXMoKSksW2xlLGhlXT1pZVtpZS5sZW5ndGgtMV0sc2U9dy5ibG9ja2Vycy5nZXQobGUpO2lmKCEoc2UmJnNlLnN0YXRlPT09InByb2NlZWRpbmciKSYmaGUoe2N1cnJlbnRMb2NhdGlvbjpBLG5leHRMb2NhdGlvbjp6LGhpc3RvcnlBY3Rpb246R30pKXJldHVybiBsZX1mdW5jdGlvbiBNZChOKXtsZXQgQT1bXTtyZXR1cm4geWUuZm9yRWFjaCgoeixHKT0+eyghTnx8TihHKSkmJih6LmNhbmNlbCgpLEEucHVzaChHKSx5ZS5kZWxldGUoRykpfSksQX1mdW5jdGlvbiBfRShOLEEseil7aWYoZj1OLGc9QSxoPXp8fG51bGwsIW0mJncubmF2aWdhdGlvbj09PU9mKXttPSEwO2xldCBHPUZtKHcubG9jYXRpb24sdy5tYXRjaGVzKTtHIT1udWxsJiZjZSh7cmVzdG9yZVNjcm9sbFBvc2l0aW9uOkd9KX1yZXR1cm4oKT0+e2Y9bnVsbCxnPW51bGwsaD1udWxsfX1mdW5jdGlvbiB6bShOLEEpe3JldHVybiBoJiZoKE4sQS5tYXAoRz0+aE0oRyx3LmxvYWRlckRhdGEpKSl8fE4ua2V5fWZ1bmN0aW9uIHdFKE4sQSl7aWYoZiYmZyl7bGV0IHo9em0oTixBKTtmW3pdPWcoKX19ZnVuY3Rpb24gRm0oTixBKXtpZihmKXtsZXQgej16bShOLEEpLEc9Zlt6XTtpZih0eXBlb2YgRz09Im51bWJlciIpcmV0dXJuIEd9cmV0dXJuIG51bGx9ZnVuY3Rpb24gU0UoTil7aT17fSxzPUVwKE4sbyx2b2lkIDAsaSl9cmV0dXJuIF89e2dldCBiYXNlbmFtZSgpe3JldHVybiBhfSxnZXQgc3RhdGUoKXtyZXR1cm4gd30sZ2V0IHJvdXRlcygpe3JldHVybiBsfSxnZXQgd2luZG93KCl7cmV0dXJuIHR9LGluaXRpYWxpemU6YmUsc3Vic2NyaWJlOmtlLGVuYWJsZVNjcm9sbFJlc3RvcmF0aW9uOl9FLG5hdmlnYXRlOm1lLGZldGNoOlRlLHJldmFsaWRhdGU6JGUsY3JlYXRlSHJlZjpOPT5lLmhpc3RvcnkuY3JlYXRlSHJlZihOKSxlbmNvZGVMb2NhdGlvbjpOPT5lLmhpc3RvcnkuZW5jb2RlTG9jYXRpb24oTiksZ2V0RmV0Y2hlcjpSbixkZWxldGVGZXRjaGVyOm9yLGRpc3Bvc2U6WixnZXRCbG9ja2VyOldhLGRlbGV0ZUJsb2NrZXI6SW0sX2ludGVybmFsRmV0Y2hDb250cm9sbGVyczpYLF9pbnRlcm5hbEFjdGl2ZURlZmVycmVkczp5ZSxfaW50ZXJuYWxTZXRSb3V0ZXM6U0V9LF99ZnVuY3Rpb24gQk0oZSl7cmV0dXJuIGUhPW51bGwmJigiZm9ybURhdGEiaW4gZSYmZS5mb3JtRGF0YSE9bnVsbHx8ImJvZHkiaW4gZSYmZS5ib2R5IT09dm9pZCAwKX1mdW5jdGlvbiAkcChlLHQsbixyLG8saSxsKXtsZXQgcyxhO2lmKGkhPW51bGwmJmwhPT0icGF0aCIpe3M9W107Zm9yKGxldCBjIG9mIHQpaWYocy5wdXNoKGMpLGMucm91dGUuaWQ9PT1pKXthPWM7YnJlYWt9fWVsc2Ugcz10LGE9dFt0Lmxlbmd0aC0xXTtsZXQgdT1CQyhvfHwiLiIsVG0ocykubWFwKGM9PmMucGF0aG5hbWVCYXNlKSxCYShlLnBhdGhuYW1lLG4pfHxlLnBhdGhuYW1lLGw9PT0icGF0aCIpO3JldHVybiBvPT1udWxsJiYodS5zZWFyY2g9ZS5zZWFyY2gsdS5oYXNoPWUuaGFzaCksKG89PW51bGx8fG89PT0iInx8bz09PSIuIikmJmEmJmEucm91dGUuaW5kZXgmJiFibSh1LnNlYXJjaCkmJih1LnNlYXJjaD11LnNlYXJjaD91LnNlYXJjaC5yZXBsYWNlKC9eXD8vLCI/aW5kZXgmIik6Ij9pbmRleCIpLHImJm4hPT0iLyImJih1LnBhdGhuYW1lPXUucGF0aG5hbWU9PT0iLyI/bjprbyhbbix1LnBhdGhuYW1lXSkpLEZhKHUpfWZ1bmN0aW9uIFIwKGUsdCxuLHIpe2lmKCFyfHwhQk0ocikpcmV0dXJue3BhdGg6bn07aWYoci5mb3JtTWV0aG9kJiYhWU0oci5mb3JtTWV0aG9kKSlyZXR1cm57cGF0aDpuLGVycm9yOlBuKDQwNSx7bWV0aG9kOnIuZm9ybU1ldGhvZH0pfTtsZXQgbz0oKT0+KHtwYXRoOm4sZXJyb3I6UG4oNDAwLHt0eXBlOiJpbnZhbGlkLWJvZHkifSl9KSxpPXIuZm9ybU1ldGhvZHx8ImdldCIsbD1lP2kudG9VcHBlckNhc2UoKTppLnRvTG93ZXJDYXNlKCkscz1HQyhuKTtpZihyLmJvZHkhPT12b2lkIDApe2lmKHIuZm9ybUVuY1R5cGU9PT0idGV4dC9wbGFpbiIpe2lmKCFYbihsKSlyZXR1cm4gbygpO2xldCBmPXR5cGVvZiByLmJvZHk9PSJzdHJpbmciP3IuYm9keTpyLmJvZHkgaW5zdGFuY2VvZiBGb3JtRGF0YXx8ci5ib2R5IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zP0FycmF5LmZyb20oci5ib2R5LmVudHJpZXMoKSkucmVkdWNlKChoLGcpPT57bGV0W20sU109ZztyZXR1cm4iIitoK20rIj0iK1MrYApgfSwiIik6U3RyaW5nKHIuYm9keSk7cmV0dXJue3BhdGg6bixzdWJtaXNzaW9uOntmb3JtTWV0aG9kOmwsZm9ybUFjdGlvbjpzLGZvcm1FbmNUeXBlOnIuZm9ybUVuY1R5cGUsZm9ybURhdGE6dm9pZCAwLGpzb246dm9pZCAwLHRleHQ6Zn19fWVsc2UgaWYoci5mb3JtRW5jVHlwZT09PSJhcHBsaWNhdGlvbi9qc29uIil7aWYoIVhuKGwpKXJldHVybiBvKCk7dHJ5e2xldCBmPXR5cGVvZiByLmJvZHk9PSJzdHJpbmciP0pTT04ucGFyc2Uoci5ib2R5KTpyLmJvZHk7cmV0dXJue3BhdGg6bixzdWJtaXNzaW9uOntmb3JtTWV0aG9kOmwsZm9ybUFjdGlvbjpzLGZvcm1FbmNUeXBlOnIuZm9ybUVuY1R5cGUsZm9ybURhdGE6dm9pZCAwLGpzb246Zix0ZXh0OnZvaWQgMH19fWNhdGNoe3JldHVybiBvKCl9fX13ZSh0eXBlb2YgRm9ybURhdGE9PSJmdW5jdGlvbiIsIkZvcm1EYXRhIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBlbnZpcm9ubWVudCIpO2xldCBhLHU7aWYoci5mb3JtRGF0YSlhPWtwKHIuZm9ybURhdGEpLHU9ci5mb3JtRGF0YTtlbHNlIGlmKHIuYm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhKWE9a3Aoci5ib2R5KSx1PXIuYm9keTtlbHNlIGlmKHIuYm9keSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcylhPXIuYm9keSx1PU0wKGEpO2Vsc2UgaWYoci5ib2R5PT1udWxsKWE9bmV3IFVSTFNlYXJjaFBhcmFtcyx1PW5ldyBGb3JtRGF0YTtlbHNlIHRyeXthPW5ldyBVUkxTZWFyY2hQYXJhbXMoci5ib2R5KSx1PU0wKGEpfWNhdGNoe3JldHVybiBvKCl9bGV0IGM9e2Zvcm1NZXRob2Q6bCxmb3JtQWN0aW9uOnMsZm9ybUVuY1R5cGU6ciYmci5mb3JtRW5jVHlwZXx8ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsZm9ybURhdGE6dSxqc29uOnZvaWQgMCx0ZXh0OnZvaWQgMH07aWYoWG4oYy5mb3JtTWV0aG9kKSlyZXR1cm57cGF0aDpuLHN1Ym1pc3Npb246Y307bGV0IGQ9SnIobik7cmV0dXJuIHQmJmQuc2VhcmNoJiZibShkLnNlYXJjaCkmJmEuYXBwZW5kKCJpbmRleCIsIiIpLGQuc2VhcmNoPSI/IithLHtwYXRoOkZhKGQpLHN1Ym1pc3Npb246Y319ZnVuY3Rpb24gV00oZSx0KXtsZXQgbj1lO2lmKHQpe2xldCByPWUuZmluZEluZGV4KG89Pm8ucm91dGUuaWQ9PT10KTtyPj0wJiYobj1lLnNsaWNlKDAscikpfXJldHVybiBufWZ1bmN0aW9uIFAwKGUsdCxuLHIsbyxpLGwscyxhLHUsYyxkLGYsaCl7bGV0IGc9aD9PYmplY3QudmFsdWVzKGgpWzBdOmY/T2JqZWN0LnZhbHVlcyhmKVswXTp2b2lkIDAsbT1lLmNyZWF0ZVVSTCh0LmxvY2F0aW9uKSxTPWUuY3JlYXRlVVJMKG8pLHY9aD9PYmplY3Qua2V5cyhoKVswXTp2b2lkIDAsXz1XTShuLHYpLmZpbHRlcigoQywkKT0+e2lmKEMucm91dGUubGF6eSlyZXR1cm4hMDtpZihDLnJvdXRlLmxvYWRlcj09bnVsbClyZXR1cm4hMTtpZihVTSh0LmxvYWRlckRhdGEsdC5tYXRjaGVzWyRdLEMpfHxsLnNvbWUoTT0+TT09PUMucm91dGUuaWQpKXJldHVybiEwO2xldCBFPXQubWF0Y2hlc1skXSxUPUM7cmV0dXJuIE8wKEMscnQoe2N1cnJlbnRVcmw6bSxjdXJyZW50UGFyYW1zOkUucGFyYW1zLG5leHRVcmw6UyxuZXh0UGFyYW1zOlQucGFyYW1zfSxyLHthY3Rpb25SZXN1bHQ6ZyxkZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZTppfHxtLnBhdGhuYW1lK20uc2VhcmNoPT09Uy5wYXRobmFtZStTLnNlYXJjaHx8bS5zZWFyY2ghPT1TLnNlYXJjaHx8S0MoRSxUKX0pKX0pLHc9W107cmV0dXJuIGEuZm9yRWFjaCgoQywkKT0+e2lmKCFuLnNvbWUoaj0+ai5yb3V0ZS5pZD09PUMucm91dGVJZCkpcmV0dXJuO2xldCBFPW9sKGMsQy5wYXRoLGQpO2lmKCFFKXt3LnB1c2goe2tleTokLHJvdXRlSWQ6Qy5yb3V0ZUlkLHBhdGg6Qy5wYXRoLG1hdGNoZXM6bnVsbCxtYXRjaDpudWxsLGNvbnRyb2xsZXI6bnVsbH0pO3JldHVybn1sZXQgVD10LmZldGNoZXJzLmdldCgkKSxNPVRwKEUsQy5wYXRoKSxSPSExO3UuaGFzKCQpP1I9ITE6cy5pbmNsdWRlcygkKT9SPSEwOlQmJlQuc3RhdGUhPT0iaWRsZSImJlQuZGF0YT09PXZvaWQgMD9SPWk6Uj1PMChNLHJ0KHtjdXJyZW50VXJsOm0sY3VycmVudFBhcmFtczp0Lm1hdGNoZXNbdC5tYXRjaGVzLmxlbmd0aC0xXS5wYXJhbXMsbmV4dFVybDpTLG5leHRQYXJhbXM6bltuLmxlbmd0aC0xXS5wYXJhbXN9LHIse2FjdGlvblJlc3VsdDpnLGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlOml9KSksUiYmdy5wdXNoKHtrZXk6JCxyb3V0ZUlkOkMucm91dGVJZCxwYXRoOkMucGF0aCxtYXRjaGVzOkUsbWF0Y2g6TSxjb250cm9sbGVyOm5ldyBBYm9ydENvbnRyb2xsZXJ9KX0pLFtfLHddfWZ1bmN0aW9uIFVNKGUsdCxuKXtsZXQgcj0hdHx8bi5yb3V0ZS5pZCE9PXQucm91dGUuaWQsbz1lW24ucm91dGUuaWRdPT09dm9pZCAwO3JldHVybiByfHxvfWZ1bmN0aW9uIEtDKGUsdCl7bGV0IG49ZS5yb3V0ZS5wYXRoO3JldHVybiBlLnBhdGhuYW1lIT09dC5wYXRobmFtZXx8biE9bnVsbCYmbi5lbmRzV2l0aCgiKiIpJiZlLnBhcmFtc1siKiJdIT09dC5wYXJhbXNbIioiXX1mdW5jdGlvbiBPMChlLHQpe2lmKGUucm91dGUuc2hvdWxkUmV2YWxpZGF0ZSl7bGV0IG49ZS5yb3V0ZS5zaG91bGRSZXZhbGlkYXRlKHQpO2lmKHR5cGVvZiBuPT0iYm9vbGVhbiIpcmV0dXJuIG59cmV0dXJuIHQuZGVmYXVsdFNob3VsZFJldmFsaWRhdGV9YXN5bmMgZnVuY3Rpb24gQTAoZSx0LG4pe2lmKCFlLmxhenkpcmV0dXJuO2xldCByPWF3YWl0IGUubGF6eSgpO2lmKCFlLmxhenkpcmV0dXJuO2xldCBvPW5bZS5pZF07d2UobywiTm8gcm91dGUgZm91bmQgaW4gbWFuaWZlc3QiKTtsZXQgaT17fTtmb3IobGV0IGwgaW4gcil7bGV0IGE9b1tsXSE9PXZvaWQgMCYmbCE9PSJoYXNFcnJvckJvdW5kYXJ5Ijt5aSghYSwnUm91dGUgIicrby5pZCsnIiBoYXMgYSBzdGF0aWMgcHJvcGVydHkgIicrbCsnIiBkZWZpbmVkIGJ1dCBpdHMgbGF6eSBmdW5jdGlvbiBpcyBhbHNvIHJldHVybmluZyBhIHZhbHVlIGZvciB0aGlzIHByb3BlcnR5LiAnKygnVGhlIGxhenkgcm91dGUgcHJvcGVydHkgIicrbCsnIiB3aWxsIGJlIGlnbm9yZWQuJykpLCFhJiYhZE0uaGFzKGwpJiYoaVtsXT1yW2xdKX1PYmplY3QuYXNzaWduKG8saSksT2JqZWN0LmFzc2lnbihvLHJ0KHt9LHQobykse2xhenk6dm9pZCAwfSkpfWFzeW5jIGZ1bmN0aW9uIGhzKGUsdCxuLHIsbyxpLGwscyl7cz09PXZvaWQgMCYmKHM9e30pO2xldCBhLHUsYyxkPWc9PntsZXQgbSxTPW5ldyBQcm9taXNlKCh2LHkpPT5tPXkpO3JldHVybiBjPSgpPT5tKCksdC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGMpLFByb21pc2UucmFjZShbZyh7cmVxdWVzdDp0LHBhcmFtczpuLnBhcmFtcyxjb250ZXh0OnMucmVxdWVzdENvbnRleHR9KSxTXSl9O3RyeXtsZXQgZz1uLnJvdXRlW2VdO2lmKG4ucm91dGUubGF6eSlpZihnKXtsZXQgbSxTPWF3YWl0IFByb21pc2UuYWxsKFtkKGcpLmNhdGNoKHY9PnttPXZ9KSxBMChuLnJvdXRlLGksbyldKTtpZihtKXRocm93IG07dT1TWzBdfWVsc2UgaWYoYXdhaXQgQTAobi5yb3V0ZSxpLG8pLGc9bi5yb3V0ZVtlXSxnKXU9YXdhaXQgZChnKTtlbHNlIGlmKGU9PT0iYWN0aW9uIil7bGV0IG09bmV3IFVSTCh0LnVybCksUz1tLnBhdGhuYW1lK20uc2VhcmNoO3Rocm93IFBuKDQwNSx7bWV0aG9kOnQubWV0aG9kLHBhdGhuYW1lOlMscm91dGVJZDpuLnJvdXRlLmlkfSl9ZWxzZSByZXR1cm57dHlwZTpzdC5kYXRhLGRhdGE6dm9pZCAwfTtlbHNlIGlmKGcpdT1hd2FpdCBkKGcpO2Vsc2V7bGV0IG09bmV3IFVSTCh0LnVybCksUz1tLnBhdGhuYW1lK20uc2VhcmNoO3Rocm93IFBuKDQwNCx7cGF0aG5hbWU6U30pfXdlKHUhPT12b2lkIDAsIllvdSBkZWZpbmVkICIrKGU9PT0iYWN0aW9uIj8iYW4gYWN0aW9uIjoiYSBsb2FkZXIiKSsiIGZvciByb3V0ZSAiKygnIicrbi5yb3V0ZS5pZCsiXCIgYnV0IGRpZG4ndCByZXR1cm4gYW55dGhpbmcgZnJvbSB5b3VyIGAiK2UrImAgIikrImZ1bmN0aW9uLiBQbGVhc2UgcmV0dXJuIGEgdmFsdWUgb3IgYG51bGxgLiIpfWNhdGNoKGcpe2E9c3QuZXJyb3IsdT1nfWZpbmFsbHl7YyYmdC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGMpfWlmKEdNKHUpKXtsZXQgZz11LnN0YXR1cztpZihMTS5oYXMoZykpe2xldCB2PXUuaGVhZGVycy5nZXQoIkxvY2F0aW9uIik7aWYod2UodiwiUmVkaXJlY3RzIHJldHVybmVkL3Rocm93biBmcm9tIGxvYWRlcnMvYWN0aW9ucyBtdXN0IGhhdmUgYSBMb2NhdGlvbiBoZWFkZXIiKSwhVkMudGVzdCh2KSl2PSRwKG5ldyBVUkwodC51cmwpLHIuc2xpY2UoMCxyLmluZGV4T2YobikrMSksbCwhMCx2KTtlbHNlIGlmKCFzLmlzU3RhdGljUmVxdWVzdCl7bGV0IHk9bmV3IFVSTCh0LnVybCksXz12LnN0YXJ0c1dpdGgoIi8vIik/bmV3IFVSTCh5LnByb3RvY29sK3YpOm5ldyBVUkwodiksdz1CYShfLnBhdGhuYW1lLGwpIT1udWxsO18ub3JpZ2luPT09eS5vcmlnaW4mJncmJih2PV8ucGF0aG5hbWUrXy5zZWFyY2grXy5oYXNoKX1pZihzLmlzU3RhdGljUmVxdWVzdCl0aHJvdyB1LmhlYWRlcnMuc2V0KCJMb2NhdGlvbiIsdiksdTtyZXR1cm57dHlwZTpzdC5yZWRpcmVjdCxzdGF0dXM6Zyxsb2NhdGlvbjp2LHJldmFsaWRhdGU6dS5oZWFkZXJzLmdldCgiWC1SZW1peC1SZXZhbGlkYXRlIikhPT1udWxsLHJlbG9hZERvY3VtZW50OnUuaGVhZGVycy5nZXQoIlgtUmVtaXgtUmVsb2FkLURvY3VtZW50IikhPT1udWxsfX1pZihzLmlzUm91dGVSZXF1ZXN0KXRocm93e3R5cGU6YT09PXN0LmVycm9yP3N0LmVycm9yOnN0LmRhdGEscmVzcG9uc2U6dX07bGV0IG0sUz11LmhlYWRlcnMuZ2V0KCJDb250ZW50LVR5cGUiKTtyZXR1cm4gUyYmL1xiYXBwbGljYXRpb25cL2pzb25cYi8udGVzdChTKT9tPWF3YWl0IHUuanNvbigpOm09YXdhaXQgdS50ZXh0KCksYT09PXN0LmVycm9yP3t0eXBlOmEsZXJyb3I6bmV3IE5tKGcsdS5zdGF0dXNUZXh0LG0pLGhlYWRlcnM6dS5oZWFkZXJzfTp7dHlwZTpzdC5kYXRhLGRhdGE6bSxzdGF0dXNDb2RlOnUuc3RhdHVzLGhlYWRlcnM6dS5oZWFkZXJzfX1pZihhPT09c3QuZXJyb3IpcmV0dXJue3R5cGU6YSxlcnJvcjp1fTtpZihLTSh1KSl7dmFyIGYsaDtyZXR1cm57dHlwZTpzdC5kZWZlcnJlZCxkZWZlcnJlZERhdGE6dSxzdGF0dXNDb2RlOihmPXUuaW5pdCk9PW51bGw/dm9pZCAwOmYuc3RhdHVzLGhlYWRlcnM6KChoPXUuaW5pdCk9PW51bGw/dm9pZCAwOmguaGVhZGVycykmJm5ldyBIZWFkZXJzKHUuaW5pdC5oZWFkZXJzKX19cmV0dXJue3R5cGU6c3QuZGF0YSxkYXRhOnV9fWZ1bmN0aW9uIHBzKGUsdCxuLHIpe2xldCBvPWUuY3JlYXRlVVJMKEdDKHQpKS50b1N0cmluZygpLGk9e3NpZ25hbDpufTtpZihyJiZYbihyLmZvcm1NZXRob2QpKXtsZXR7Zm9ybU1ldGhvZDpsLGZvcm1FbmNUeXBlOnN9PXI7aS5tZXRob2Q9bC50b1VwcGVyQ2FzZSgpLHM9PT0iYXBwbGljYXRpb24vanNvbiI/KGkuaGVhZGVycz1uZXcgSGVhZGVycyh7IkNvbnRlbnQtVHlwZSI6c30pLGkuYm9keT1KU09OLnN0cmluZ2lmeShyLmpzb24pKTpzPT09InRleHQvcGxhaW4iP2kuYm9keT1yLnRleHQ6cz09PSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiJiZyLmZvcm1EYXRhP2kuYm9keT1rcChyLmZvcm1EYXRhKTppLmJvZHk9ci5mb3JtRGF0YX1yZXR1cm4gbmV3IFJlcXVlc3QobyxpKX1mdW5jdGlvbiBrcChlKXtsZXQgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO2ZvcihsZXRbbixyXW9mIGUuZW50cmllcygpKXQuYXBwZW5kKG4sdHlwZW9mIHI9PSJzdHJpbmciP3I6ci5uYW1lKTtyZXR1cm4gdH1mdW5jdGlvbiBNMChlKXtsZXQgdD1uZXcgRm9ybURhdGE7Zm9yKGxldFtuLHJdb2YgZS5lbnRyaWVzKCkpdC5hcHBlbmQobixyKTtyZXR1cm4gdH1mdW5jdGlvbiBWTShlLHQsbixyLG8pe2xldCBpPXt9LGw9bnVsbCxzLGE9ITEsdT17fTtyZXR1cm4gbi5mb3JFYWNoKChjLGQpPT57bGV0IGY9dFtkXS5yb3V0ZS5pZDtpZih3ZSghbWwoYyksIkNhbm5vdCBoYW5kbGUgcmVkaXJlY3QgcmVzdWx0cyBpbiBwcm9jZXNzTG9hZGVyRGF0YSIpLEhzKGMpKXtsZXQgaD1WcyhlLGYpLGc9Yy5lcnJvcjtyJiYoZz1PYmplY3QudmFsdWVzKHIpWzBdLHI9dm9pZCAwKSxsPWx8fHt9LGxbaC5yb3V0ZS5pZF09PW51bGwmJihsW2gucm91dGUuaWRdPWcpLGlbZl09dm9pZCAwLGF8fChhPSEwLHM9V0MoYy5lcnJvcik/Yy5lcnJvci5zdGF0dXM6NTAwKSxjLmhlYWRlcnMmJih1W2ZdPWMuaGVhZGVycyl9ZWxzZSBlaShjKT8oby5zZXQoZixjLmRlZmVycmVkRGF0YSksaVtmXT1jLmRlZmVycmVkRGF0YS5kYXRhKTppW2ZdPWMuZGF0YSxjLnN0YXR1c0NvZGUhPW51bGwmJmMuc3RhdHVzQ29kZSE9PTIwMCYmIWEmJihzPWMuc3RhdHVzQ29kZSksYy5oZWFkZXJzJiYodVtmXT1jLmhlYWRlcnMpfSksciYmKGw9cixpW09iamVjdC5rZXlzKHIpWzBdXT12b2lkIDApLHtsb2FkZXJEYXRhOmksZXJyb3JzOmwsc3RhdHVzQ29kZTpzfHwyMDAsbG9hZGVySGVhZGVyczp1fX1mdW5jdGlvbiBEMChlLHQsbixyLG8saSxsLHMpe2xldHtsb2FkZXJEYXRhOmEsZXJyb3JzOnV9PVZNKHQsbixyLG8scyk7Zm9yKGxldCBjPTA7YzxpLmxlbmd0aDtjKyspe2xldHtrZXk6ZCxtYXRjaDpmLGNvbnRyb2xsZXI6aH09aVtjXTt3ZShsIT09dm9pZCAwJiZsW2NdIT09dm9pZCAwLCJEaWQgbm90IGZpbmQgY29ycmVzcG9uZGluZyBmZXRjaGVyIHJlc3VsdCIpO2xldCBnPWxbY107aWYoIShoJiZoLnNpZ25hbC5hYm9ydGVkKSlpZihIcyhnKSl7bGV0IG09VnMoZS5tYXRjaGVzLGY9PW51bGw/dm9pZCAwOmYucm91dGUuaWQpO3UmJnVbbS5yb3V0ZS5pZF18fCh1PXJ0KHt9LHUse1ttLnJvdXRlLmlkXTpnLmVycm9yfSkpLGUuZmV0Y2hlcnMuZGVsZXRlKGQpfWVsc2UgaWYobWwoZykpd2UoITEsIlVuaGFuZGxlZCBmZXRjaGVyIHJldmFsaWRhdGlvbiByZWRpcmVjdCIpO2Vsc2UgaWYoZWkoZykpd2UoITEsIlVuaGFuZGxlZCBmZXRjaGVyIGRlZmVycmVkIGRhdGEiKTtlbHNle2xldCBtPWlvKGcuZGF0YSk7ZS5mZXRjaGVycy5zZXQoZCxtKX19cmV0dXJue2xvYWRlckRhdGE6YSxlcnJvcnM6dX19ZnVuY3Rpb24gTDAoZSx0LG4scil7bGV0IG89cnQoe30sdCk7Zm9yKGxldCBpIG9mIG4pe2xldCBsPWkucm91dGUuaWQ7aWYodC5oYXNPd25Qcm9wZXJ0eShsKT90W2xdIT09dm9pZCAwJiYob1tsXT10W2xdKTplW2xdIT09dm9pZCAwJiZpLnJvdXRlLmxvYWRlciYmKG9bbF09ZVtsXSksciYmci5oYXNPd25Qcm9wZXJ0eShsKSlicmVha31yZXR1cm4gb31mdW5jdGlvbiBWcyhlLHQpe3JldHVybih0P2Uuc2xpY2UoMCxlLmZpbmRJbmRleChyPT5yLnJvdXRlLmlkPT09dCkrMSk6Wy4uLmVdKS5yZXZlcnNlKCkuZmluZChyPT5yLnJvdXRlLmhhc0Vycm9yQm91bmRhcnk9PT0hMCl8fGVbMF19ZnVuY3Rpb24gSTAoZSl7bGV0IHQ9ZS5sZW5ndGg9PT0xP2VbMF06ZS5maW5kKG49Pm4uaW5kZXh8fCFuLnBhdGh8fG4ucGF0aD09PSIvIil8fHtpZDoiX19zaGltLWVycm9yLXJvdXRlX18ifTtyZXR1cm57bWF0Y2hlczpbe3BhcmFtczp7fSxwYXRobmFtZToiIixwYXRobmFtZUJhc2U6IiIscm91dGU6dH1dLHJvdXRlOnR9fWZ1bmN0aW9uIFBuKGUsdCl7bGV0e3BhdGhuYW1lOm4scm91dGVJZDpyLG1ldGhvZDpvLHR5cGU6aX09dD09PXZvaWQgMD97fTp0LGw9IlVua25vd24gU2VydmVyIEVycm9yIixzPSJVbmtub3duIEByZW1peC1ydW4vcm91dGVyIGVycm9yIjtyZXR1cm4gZT09PTQwMD8obD0iQmFkIFJlcXVlc3QiLG8mJm4mJnI/cz0iWW91IG1hZGUgYSAiK28rJyByZXF1ZXN0IHRvICInK24rJyIgYnV0ICcrKCdkaWQgbm90IHByb3ZpZGUgYSBgbG9hZGVyYCBmb3Igcm91dGUgIicrcisnIiwgJykrInNvIHRoZXJlIGlzIG5vIHdheSB0byBoYW5kbGUgdGhlIHJlcXVlc3QuIjppPT09ImRlZmVyLWFjdGlvbiI/cz0iZGVmZXIoKSBpcyBub3Qgc3VwcG9ydGVkIGluIGFjdGlvbnMiOmk9PT0iaW52YWxpZC1ib2R5IiYmKHM9IlVuYWJsZSB0byBlbmNvZGUgc3VibWlzc2lvbiBib2R5IikpOmU9PT00MDM/KGw9IkZvcmJpZGRlbiIscz0nUm91dGUgIicrcisnIiBkb2VzIG5vdCBtYXRjaCBVUkwgIicrbisnIicpOmU9PT00MDQ/KGw9Ik5vdCBGb3VuZCIscz0nTm8gcm91dGUgbWF0Y2hlcyBVUkwgIicrbisnIicpOmU9PT00MDUmJihsPSJNZXRob2QgTm90IEFsbG93ZWQiLG8mJm4mJnI/cz0iWW91IG1hZGUgYSAiK28udG9VcHBlckNhc2UoKSsnIHJlcXVlc3QgdG8gIicrbisnIiBidXQgJysoJ2RpZCBub3QgcHJvdmlkZSBhbiBgYWN0aW9uYCBmb3Igcm91dGUgIicrcisnIiwgJykrInNvIHRoZXJlIGlzIG5vIHdheSB0byBoYW5kbGUgdGhlIHJlcXVlc3QuIjpvJiYocz0nSW52YWxpZCByZXF1ZXN0IG1ldGhvZCAiJytvLnRvVXBwZXJDYXNlKCkrJyInKSksbmV3IE5tKGV8fDUwMCxsLG5ldyBFcnJvcihzKSwhMCl9ZnVuY3Rpb24gajAoZSl7Zm9yKGxldCB0PWUubGVuZ3RoLTE7dD49MDt0LS0pe2xldCBuPWVbdF07aWYobWwobikpcmV0dXJue3Jlc3VsdDpuLGlkeDp0fX19ZnVuY3Rpb24gR0MoZSl7bGV0IHQ9dHlwZW9mIGU9PSJzdHJpbmciP0pyKGUpOmU7cmV0dXJuIEZhKHJ0KHt9LHQse2hhc2g6IiJ9KSl9ZnVuY3Rpb24gSE0oZSx0KXtyZXR1cm4gZS5wYXRobmFtZSE9PXQucGF0aG5hbWV8fGUuc2VhcmNoIT09dC5zZWFyY2g/ITE6ZS5oYXNoPT09IiI/dC5oYXNoIT09IiI6ZS5oYXNoPT09dC5oYXNoPyEwOnQuaGFzaCE9PSIifWZ1bmN0aW9uIGVpKGUpe3JldHVybiBlLnR5cGU9PT1zdC5kZWZlcnJlZH1mdW5jdGlvbiBIcyhlKXtyZXR1cm4gZS50eXBlPT09c3QuZXJyb3J9ZnVuY3Rpb24gbWwoZSl7cmV0dXJuKGUmJmUudHlwZSk9PT1zdC5yZWRpcmVjdH1mdW5jdGlvbiBLTShlKXtsZXQgdD1lO3JldHVybiB0JiZ0eXBlb2YgdD09Im9iamVjdCImJnR5cGVvZiB0LmRhdGE9PSJvYmplY3QiJiZ0eXBlb2YgdC5zdWJzY3JpYmU9PSJmdW5jdGlvbiImJnR5cGVvZiB0LmNhbmNlbD09ImZ1bmN0aW9uIiYmdHlwZW9mIHQucmVzb2x2ZURhdGE9PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gR00oZSl7cmV0dXJuIGUhPW51bGwmJnR5cGVvZiBlLnN0YXR1cz09Im51bWJlciImJnR5cGVvZiBlLnN0YXR1c1RleHQ9PSJzdHJpbmciJiZ0eXBlb2YgZS5oZWFkZXJzPT0ib2JqZWN0IiYmdHlwZW9mIGUuYm9keTwidSJ9ZnVuY3Rpb24gWU0oZSl7cmV0dXJuIERNLmhhcyhlLnRvTG93ZXJDYXNlKCkpfWZ1bmN0aW9uIFhuKGUpe3JldHVybiBBTS5oYXMoZS50b0xvd2VyQ2FzZSgpKX1hc3luYyBmdW5jdGlvbiB6MChlLHQsbixyLG8saSl7Zm9yKGxldCBsPTA7bDxuLmxlbmd0aDtsKyspe2xldCBzPW5bbF0sYT10W2xdO2lmKCFhKWNvbnRpbnVlO2xldCB1PWUuZmluZChkPT5kLnJvdXRlLmlkPT09YS5yb3V0ZS5pZCksYz11IT1udWxsJiYhS0ModSxhKSYmKGkmJmlbYS5yb3V0ZS5pZF0pIT09dm9pZCAwO2lmKGVpKHMpJiYob3x8Yykpe2xldCBkPXJbbF07d2UoZCwiRXhwZWN0ZWQgYW4gQWJvcnRTaWduYWwgZm9yIHJldmFsaWRhdGluZyBmZXRjaGVyIGRlZmVycmVkIHJlc3VsdCIpLGF3YWl0IFlDKHMsZCxvKS50aGVuKGY9PntmJiYobltsXT1mfHxuW2xdKX0pfX19YXN5bmMgZnVuY3Rpb24gWUMoZSx0LG4pe2lmKG49PT12b2lkIDAmJihuPSExKSwhYXdhaXQgZS5kZWZlcnJlZERhdGEucmVzb2x2ZURhdGEodCkpe2lmKG4pdHJ5e3JldHVybnt0eXBlOnN0LmRhdGEsZGF0YTplLmRlZmVycmVkRGF0YS51bndyYXBwZWREYXRhfX1jYXRjaChvKXtyZXR1cm57dHlwZTpzdC5lcnJvcixlcnJvcjpvfX1yZXR1cm57dHlwZTpzdC5kYXRhLGRhdGE6ZS5kZWZlcnJlZERhdGEuZGF0YX19fWZ1bmN0aW9uIGJtKGUpe3JldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKGUpLmdldEFsbCgiaW5kZXgiKS5zb21lKHQ9PnQ9PT0iIil9ZnVuY3Rpb24gVHAoZSx0KXtsZXQgbj10eXBlb2YgdD09InN0cmluZyI/SnIodCkuc2VhcmNoOnQuc2VhcmNoO2lmKGVbZS5sZW5ndGgtMV0ucm91dGUuaW5kZXgmJmJtKG58fCIiKSlyZXR1cm4gZVtlLmxlbmd0aC0xXTtsZXQgcj1UbShlKTtyZXR1cm4gcltyLmxlbmd0aC0xXX1mdW5jdGlvbiBGMChlKXtsZXR7Zm9ybU1ldGhvZDp0LGZvcm1BY3Rpb246bixmb3JtRW5jVHlwZTpyLHRleHQ6byxmb3JtRGF0YTppLGpzb246bH09ZTtpZighKCF0fHwhbnx8IXIpKXtpZihvIT1udWxsKXJldHVybntmb3JtTWV0aG9kOnQsZm9ybUFjdGlvbjpuLGZvcm1FbmNUeXBlOnIsZm9ybURhdGE6dm9pZCAwLGpzb246dm9pZCAwLHRleHQ6b307aWYoaSE9bnVsbClyZXR1cm57Zm9ybU1ldGhvZDp0LGZvcm1BY3Rpb246bixmb3JtRW5jVHlwZTpyLGZvcm1EYXRhOmksanNvbjp2b2lkIDAsdGV4dDp2b2lkIDB9O2lmKGwhPT12b2lkIDApcmV0dXJue2Zvcm1NZXRob2Q6dCxmb3JtQWN0aW9uOm4sZm9ybUVuY1R5cGU6cixmb3JtRGF0YTp2b2lkIDAsanNvbjpsLHRleHQ6dm9pZCAwfX19ZnVuY3Rpb24gQWYoZSx0KXtyZXR1cm4gdD97c3RhdGU6ImxvYWRpbmciLGxvY2F0aW9uOmUsZm9ybU1ldGhvZDp0LmZvcm1NZXRob2QsZm9ybUFjdGlvbjp0LmZvcm1BY3Rpb24sZm9ybUVuY1R5cGU6dC5mb3JtRW5jVHlwZSxmb3JtRGF0YTp0LmZvcm1EYXRhLGpzb246dC5qc29uLHRleHQ6dC50ZXh0fTp7c3RhdGU6ImxvYWRpbmciLGxvY2F0aW9uOmUsZm9ybU1ldGhvZDp2b2lkIDAsZm9ybUFjdGlvbjp2b2lkIDAsZm9ybUVuY1R5cGU6dm9pZCAwLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0OnZvaWQgMH19ZnVuY3Rpb24gWE0oZSx0KXtyZXR1cm57c3RhdGU6InN1Ym1pdHRpbmciLGxvY2F0aW9uOmUsZm9ybU1ldGhvZDp0LmZvcm1NZXRob2QsZm9ybUFjdGlvbjp0LmZvcm1BY3Rpb24sZm9ybUVuY1R5cGU6dC5mb3JtRW5jVHlwZSxmb3JtRGF0YTp0LmZvcm1EYXRhLGpzb246dC5qc29uLHRleHQ6dC50ZXh0fX1mdW5jdGlvbiBncyhlLHQpe3JldHVybiBlP3tzdGF0ZToibG9hZGluZyIsZm9ybU1ldGhvZDplLmZvcm1NZXRob2QsZm9ybUFjdGlvbjplLmZvcm1BY3Rpb24sZm9ybUVuY1R5cGU6ZS5mb3JtRW5jVHlwZSxmb3JtRGF0YTplLmZvcm1EYXRhLGpzb246ZS5qc29uLHRleHQ6ZS50ZXh0LGRhdGE6dH06e3N0YXRlOiJsb2FkaW5nIixmb3JtTWV0aG9kOnZvaWQgMCxmb3JtQWN0aW9uOnZvaWQgMCxmb3JtRW5jVHlwZTp2b2lkIDAsZm9ybURhdGE6dm9pZCAwLGpzb246dm9pZCAwLHRleHQ6dm9pZCAwLGRhdGE6dH19ZnVuY3Rpb24gUU0oZSx0KXtyZXR1cm57c3RhdGU6InN1Ym1pdHRpbmciLGZvcm1NZXRob2Q6ZS5mb3JtTWV0aG9kLGZvcm1BY3Rpb246ZS5mb3JtQWN0aW9uLGZvcm1FbmNUeXBlOmUuZm9ybUVuY1R5cGUsZm9ybURhdGE6ZS5mb3JtRGF0YSxqc29uOmUuanNvbix0ZXh0OmUudGV4dCxkYXRhOnQ/dC5kYXRhOnZvaWQgMH19ZnVuY3Rpb24gaW8oZSl7cmV0dXJue3N0YXRlOiJpZGxlIixmb3JtTWV0aG9kOnZvaWQgMCxmb3JtQWN0aW9uOnZvaWQgMCxmb3JtRW5jVHlwZTp2b2lkIDAsZm9ybURhdGE6dm9pZCAwLGpzb246dm9pZCAwLHRleHQ6dm9pZCAwLGRhdGE6ZX19ZnVuY3Rpb24gSk0oZSx0KXt0cnl7bGV0IG49ZS5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKEhDKTtpZihuKXtsZXQgcj1KU09OLnBhcnNlKG4pO2ZvcihsZXRbbyxpXW9mIE9iamVjdC5lbnRyaWVzKHJ8fHt9KSlpJiZBcnJheS5pc0FycmF5KGkpJiZ0LnNldChvLG5ldyBTZXQoaXx8W10pKX19Y2F0Y2h7fX1mdW5jdGlvbiBaTShlLHQpe2lmKHQuc2l6ZT4wKXtsZXQgbj17fTtmb3IobGV0W3Isb11vZiB0KW5bcl09Wy4uLm9dO3RyeXtlLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oSEMsSlNPTi5zdHJpbmdpZnkobikpfWNhdGNoKHIpe3lpKCExLCJGYWlsZWQgdG8gc2F2ZSBhcHBsaWVkIHZpZXcgdHJhbnNpdGlvbnMgaW4gc2Vzc2lvblN0b3JhZ2UgKCIrcisiKS4iKX19fS8qKgogKiBSZWFjdCBSb3V0ZXIgdjYuMTguMAogKgogKiBDb3B5cmlnaHQgKGMpIFJlbWl4IFNvZnR3YXJlIEluYy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UubWQgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICoKICogQGxpY2Vuc2UgTUlUCiAqL2Z1bmN0aW9uIHpjKCl7cmV0dXJuIHpjPU9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbi5iaW5kKCk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0semMuYXBwbHkodGhpcyxhcmd1bWVudHMpfWNvbnN0IE5kPXAuY3JlYXRlQ29udGV4dChudWxsKSxYQz1wLmNyZWF0ZUNvbnRleHQobnVsbCksYmQ9cC5jcmVhdGVDb250ZXh0KG51bGwpLFJkPXAuY3JlYXRlQ29udGV4dChudWxsKSxQaT1wLmNyZWF0ZUNvbnRleHQoe291dGxldDpudWxsLG1hdGNoZXM6W10saXNEYXRhUm91dGU6ITF9KSxRQz1wLmNyZWF0ZUNvbnRleHQobnVsbCk7ZnVuY3Rpb24gUGQoKXtyZXR1cm4gcC51c2VDb250ZXh0KFJkKSE9bnVsbH1mdW5jdGlvbiBKQygpe3JldHVybiBQZCgpfHx3ZSghMSkscC51c2VDb250ZXh0KFJkKS5sb2NhdGlvbn1mdW5jdGlvbiBaQyhlKXtwLnVzZUNvbnRleHQoYmQpLnN0YXRpY3x8cC51c2VMYXlvdXRFZmZlY3QoZSl9ZnVuY3Rpb24gUm0oKXtsZXR7aXNEYXRhUm91dGU6ZX09cC51c2VDb250ZXh0KFBpKTtyZXR1cm4gZT9kMygpOnFNKCl9ZnVuY3Rpb24gcU0oKXtQZCgpfHx3ZSghMSk7bGV0IGU9cC51c2VDb250ZXh0KE5kKSx7YmFzZW5hbWU6dCxuYXZpZ2F0b3I6bn09cC51c2VDb250ZXh0KGJkKSx7bWF0Y2hlczpyfT1wLnVzZUNvbnRleHQoUGkpLHtwYXRobmFtZTpvfT1KQygpLGk9SlNPTi5zdHJpbmdpZnkoVG0ocikubWFwKGE9PmEucGF0aG5hbWVCYXNlKSksbD1wLnVzZVJlZighMSk7cmV0dXJuIFpDKCgpPT57bC5jdXJyZW50PSEwfSkscC51c2VDYWxsYmFjayhmdW5jdGlvbihhLHUpe2lmKHU9PT12b2lkIDAmJih1PXt9KSwhbC5jdXJyZW50KXJldHVybjtpZih0eXBlb2YgYT09Im51bWJlciIpe24uZ28oYSk7cmV0dXJufWxldCBjPUJDKGEsSlNPTi5wYXJzZShpKSxvLHUucmVsYXRpdmU9PT0icGF0aCIpO2U9PW51bGwmJnQhPT0iLyImJihjLnBhdGhuYW1lPWMucGF0aG5hbWU9PT0iLyI/dDprbyhbdCxjLnBhdGhuYW1lXSkpLCh1LnJlcGxhY2U/bi5yZXBsYWNlOm4ucHVzaCkoYyx1LnN0YXRlLHUpfSxbdCxuLGksbyxlXSl9ZnVuY3Rpb24gZTMoKXtsZXR7bWF0Y2hlczplfT1wLnVzZUNvbnRleHQoUGkpLHQ9ZVtlLmxlbmd0aC0xXTtyZXR1cm4gdD90LnBhcmFtczp7fX1mdW5jdGlvbiB0MyhlLHQsbil7UGQoKXx8d2UoITEpO2xldHtuYXZpZ2F0b3I6cn09cC51c2VDb250ZXh0KGJkKSx7bWF0Y2hlczpvfT1wLnVzZUNvbnRleHQoUGkpLGk9b1tvLmxlbmd0aC0xXSxsPWk/aS5wYXJhbXM6e307aSYmaS5wYXRobmFtZTtsZXQgcz1pP2kucGF0aG5hbWVCYXNlOiIvIjtpJiZpLnJvdXRlO2xldCBhPUpDKCksdTtpZih0KXt2YXIgYztsZXQgbT10eXBlb2YgdD09InN0cmluZyI/SnIodCk6dDtzPT09Ii8ifHwoYz1tLnBhdGhuYW1lKSE9bnVsbCYmYy5zdGFydHNXaXRoKHMpfHx3ZSghMSksdT1tfWVsc2UgdT1hO2xldCBkPXUucGF0aG5hbWV8fCIvIixmPXM9PT0iLyI/ZDpkLnNsaWNlKHMubGVuZ3RoKXx8Ii8iLGg9b2woZSx7cGF0aG5hbWU6Zn0pLGc9bDMoaCYmaC5tYXAobT0+T2JqZWN0LmFzc2lnbih7fSxtLHtwYXJhbXM6T2JqZWN0LmFzc2lnbih7fSxsLG0ucGFyYW1zKSxwYXRobmFtZTprbyhbcyxyLmVuY29kZUxvY2F0aW9uP3IuZW5jb2RlTG9jYXRpb24obS5wYXRobmFtZSkucGF0aG5hbWU6bS5wYXRobmFtZV0pLHBhdGhuYW1lQmFzZTptLnBhdGhuYW1lQmFzZT09PSIvIj9zOmtvKFtzLHIuZW5jb2RlTG9jYXRpb24/ci5lbmNvZGVMb2NhdGlvbihtLnBhdGhuYW1lQmFzZSkucGF0aG5hbWU6bS5wYXRobmFtZUJhc2VdKX0pKSxvLG4pO3JldHVybiB0JiZnP3AuY3JlYXRlRWxlbWVudChSZC5Qcm92aWRlcix7dmFsdWU6e2xvY2F0aW9uOnpjKHtwYXRobmFtZToiLyIsc2VhcmNoOiIiLGhhc2g6IiIsc3RhdGU6bnVsbCxrZXk6ImRlZmF1bHQifSx1KSxuYXZpZ2F0aW9uVHlwZTpsdC5Qb3B9fSxnKTpnfWZ1bmN0aW9uIG4zKCl7bGV0IGU9YzMoKSx0PVdDKGUpP2Uuc3RhdHVzKyIgIitlLnN0YXR1c1RleHQ6ZSBpbnN0YW5jZW9mIEVycm9yP2UubWVzc2FnZTpKU09OLnN0cmluZ2lmeShlKSxuPWUgaW5zdGFuY2VvZiBFcnJvcj9lLnN0YWNrOm51bGwsbz17cGFkZGluZzoiMC41cmVtIixiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMjAwLDIwMCwyMDAsIDAuNSkifSxpPW51bGw7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwscC5jcmVhdGVFbGVtZW50KCJoMiIsbnVsbCwiVW5leHBlY3RlZCBBcHBsaWNhdGlvbiBFcnJvciEiKSxwLmNyZWF0ZUVsZW1lbnQoImgzIix7c3R5bGU6e2ZvbnRTdHlsZToiaXRhbGljIn19LHQpLG4/cC5jcmVhdGVFbGVtZW50KCJwcmUiLHtzdHlsZTpvfSxuKTpudWxsLGkpfWNvbnN0IHIzPXAuY3JlYXRlRWxlbWVudChuMyxudWxsKTtjbGFzcyBvMyBleHRlbmRzIHAuQ29tcG9uZW50e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuc3RhdGU9e2xvY2F0aW9uOnQubG9jYXRpb24scmV2YWxpZGF0aW9uOnQucmV2YWxpZGF0aW9uLGVycm9yOnQuZXJyb3J9fXN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IodCl7cmV0dXJue2Vycm9yOnR9fXN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHModCxuKXtyZXR1cm4gbi5sb2NhdGlvbiE9PXQubG9jYXRpb258fG4ucmV2YWxpZGF0aW9uIT09ImlkbGUiJiZ0LnJldmFsaWRhdGlvbj09PSJpZGxlIj97ZXJyb3I6dC5lcnJvcixsb2NhdGlvbjp0LmxvY2F0aW9uLHJldmFsaWRhdGlvbjp0LnJldmFsaWRhdGlvbn06e2Vycm9yOnQuZXJyb3J8fG4uZXJyb3IsbG9jYXRpb246bi5sb2NhdGlvbixyZXZhbGlkYXRpb246dC5yZXZhbGlkYXRpb258fG4ucmV2YWxpZGF0aW9ufX1jb21wb25lbnREaWRDYXRjaCh0LG4pe2NvbnNvbGUuZXJyb3IoIlJlYWN0IFJvdXRlciBjYXVnaHQgdGhlIGZvbGxvd2luZyBlcnJvciBkdXJpbmcgcmVuZGVyIix0LG4pfXJlbmRlcigpe3JldHVybiB0aGlzLnN0YXRlLmVycm9yP3AuY3JlYXRlRWxlbWVudChQaS5Qcm92aWRlcix7dmFsdWU6dGhpcy5wcm9wcy5yb3V0ZUNvbnRleHR9LHAuY3JlYXRlRWxlbWVudChRQy5Qcm92aWRlcix7dmFsdWU6dGhpcy5zdGF0ZS5lcnJvcixjaGlsZHJlbjp0aGlzLnByb3BzLmNvbXBvbmVudH0pKTp0aGlzLnByb3BzLmNoaWxkcmVufX1mdW5jdGlvbiBpMyhlKXtsZXR7cm91dGVDb250ZXh0OnQsbWF0Y2g6bixjaGlsZHJlbjpyfT1lLG89cC51c2VDb250ZXh0KE5kKTtyZXR1cm4gbyYmby5zdGF0aWMmJm8uc3RhdGljQ29udGV4dCYmKG4ucm91dGUuZXJyb3JFbGVtZW50fHxuLnJvdXRlLkVycm9yQm91bmRhcnkpJiYoby5zdGF0aWNDb250ZXh0Ll9kZWVwZXN0UmVuZGVyZWRCb3VuZGFyeUlkPW4ucm91dGUuaWQpLHAuY3JlYXRlRWxlbWVudChQaS5Qcm92aWRlcix7dmFsdWU6dH0scil9ZnVuY3Rpb24gbDMoZSx0LG4pe3ZhciByO2lmKHQ9PT12b2lkIDAmJih0PVtdKSxuPT09dm9pZCAwJiYobj1udWxsKSxlPT1udWxsKXt2YXIgbztpZigobz1uKSE9bnVsbCYmby5lcnJvcnMpZT1uLm1hdGNoZXM7ZWxzZSByZXR1cm4gbnVsbH1sZXQgaT1lLGw9KHI9bik9PW51bGw/dm9pZCAwOnIuZXJyb3JzO2lmKGwhPW51bGwpe2xldCBzPWkuZmluZEluZGV4KGE9PmEucm91dGUuaWQmJihsPT1udWxsP3ZvaWQgMDpsW2Eucm91dGUuaWRdKSk7cz49MHx8d2UoITEpLGk9aS5zbGljZSgwLE1hdGgubWluKGkubGVuZ3RoLHMrMSkpfXJldHVybiBpLnJlZHVjZVJpZ2h0KChzLGEsdSk9PntsZXQgYz1hLnJvdXRlLmlkP2w9PW51bGw/dm9pZCAwOmxbYS5yb3V0ZS5pZF06bnVsbCxkPW51bGw7biYmKGQ9YS5yb3V0ZS5lcnJvckVsZW1lbnR8fHIzKTtsZXQgZj10LmNvbmNhdChpLnNsaWNlKDAsdSsxKSksaD0oKT0+e2xldCBnO3JldHVybiBjP2c9ZDphLnJvdXRlLkNvbXBvbmVudD9nPXAuY3JlYXRlRWxlbWVudChhLnJvdXRlLkNvbXBvbmVudCxudWxsKTphLnJvdXRlLmVsZW1lbnQ/Zz1hLnJvdXRlLmVsZW1lbnQ6Zz1zLHAuY3JlYXRlRWxlbWVudChpMyx7bWF0Y2g6YSxyb3V0ZUNvbnRleHQ6e291dGxldDpzLG1hdGNoZXM6Zixpc0RhdGFSb3V0ZTpuIT1udWxsfSxjaGlsZHJlbjpnfSl9O3JldHVybiBuJiYoYS5yb3V0ZS5FcnJvckJvdW5kYXJ5fHxhLnJvdXRlLmVycm9yRWxlbWVudHx8dT09PTApP3AuY3JlYXRlRWxlbWVudChvMyx7bG9jYXRpb246bi5sb2NhdGlvbixyZXZhbGlkYXRpb246bi5yZXZhbGlkYXRpb24sY29tcG9uZW50OmQsZXJyb3I6YyxjaGlsZHJlbjpoKCkscm91dGVDb250ZXh0OntvdXRsZXQ6bnVsbCxtYXRjaGVzOmYsaXNEYXRhUm91dGU6ITB9fSk6aCgpfSxudWxsKX12YXIgcUM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuVXNlQmxvY2tlcj0idXNlQmxvY2tlciIsZS5Vc2VSZXZhbGlkYXRvcj0idXNlUmV2YWxpZGF0b3IiLGUuVXNlTmF2aWdhdGVTdGFibGU9InVzZU5hdmlnYXRlIixlfShxQ3x8e30pLEZjPWZ1bmN0aW9uKGUpe3JldHVybiBlLlVzZUJsb2NrZXI9InVzZUJsb2NrZXIiLGUuVXNlTG9hZGVyRGF0YT0idXNlTG9hZGVyRGF0YSIsZS5Vc2VBY3Rpb25EYXRhPSJ1c2VBY3Rpb25EYXRhIixlLlVzZVJvdXRlRXJyb3I9InVzZVJvdXRlRXJyb3IiLGUuVXNlTmF2aWdhdGlvbj0idXNlTmF2aWdhdGlvbiIsZS5Vc2VSb3V0ZUxvYWRlckRhdGE9InVzZVJvdXRlTG9hZGVyRGF0YSIsZS5Vc2VNYXRjaGVzPSJ1c2VNYXRjaGVzIixlLlVzZVJldmFsaWRhdG9yPSJ1c2VSZXZhbGlkYXRvciIsZS5Vc2VOYXZpZ2F0ZVN0YWJsZT0idXNlTmF2aWdhdGUiLGUuVXNlUm91dGVJZD0idXNlUm91dGVJZCIsZX0oRmN8fHt9KTtmdW5jdGlvbiBzMyhlKXtsZXQgdD1wLnVzZUNvbnRleHQoTmQpO3JldHVybiB0fHx3ZSghMSksdH1mdW5jdGlvbiBhMyhlKXtsZXQgdD1wLnVzZUNvbnRleHQoWEMpO3JldHVybiB0fHx3ZSghMSksdH1mdW5jdGlvbiB1MyhlKXtsZXQgdD1wLnVzZUNvbnRleHQoUGkpO3JldHVybiB0fHx3ZSghMSksdH1mdW5jdGlvbiBlRShlKXtsZXQgdD11MygpLG49dC5tYXRjaGVzW3QubWF0Y2hlcy5sZW5ndGgtMV07cmV0dXJuIG4ucm91dGUuaWR8fHdlKCExKSxuLnJvdXRlLmlkfWZ1bmN0aW9uIGMzKCl7dmFyIGU7bGV0IHQ9cC51c2VDb250ZXh0KFFDKSxuPWEzKEZjLlVzZVJvdXRlRXJyb3IpLHI9ZUUoRmMuVXNlUm91dGVFcnJvcik7cmV0dXJuIHR8fCgoZT1uLmVycm9ycyk9PW51bGw/dm9pZCAwOmVbcl0pfWZ1bmN0aW9uIGQzKCl7bGV0e3JvdXRlcjplfT1zMyhxQy5Vc2VOYXZpZ2F0ZVN0YWJsZSksdD1lRShGYy5Vc2VOYXZpZ2F0ZVN0YWJsZSksbj1wLnVzZVJlZighMSk7cmV0dXJuIFpDKCgpPT57bi5jdXJyZW50PSEwfSkscC51c2VDYWxsYmFjayhmdW5jdGlvbihvLGkpe2k9PT12b2lkIDAmJihpPXt9KSxuLmN1cnJlbnQmJih0eXBlb2Ygbz09Im51bWJlciI/ZS5uYXZpZ2F0ZShvKTplLm5hdmlnYXRlKG8semMoe2Zyb21Sb3V0ZUlkOnR9LGkpKSl9LFtlLHRdKX1mdW5jdGlvbiBmMyhlKXtsZXR7YmFzZW5hbWU6dD0iLyIsY2hpbGRyZW46bj1udWxsLGxvY2F0aW9uOnIsbmF2aWdhdGlvblR5cGU6bz1sdC5Qb3AsbmF2aWdhdG9yOmksc3RhdGljOmw9ITF9PWU7UGQoKSYmd2UoITEpO2xldCBzPXQucmVwbGFjZSgvXlwvKi8sIi8iKSxhPXAudXNlTWVtbygoKT0+KHtiYXNlbmFtZTpzLG5hdmlnYXRvcjppLHN0YXRpYzpsfSksW3MsaSxsXSk7dHlwZW9mIHI9PSJzdHJpbmciJiYocj1KcihyKSk7bGV0e3BhdGhuYW1lOnU9Ii8iLHNlYXJjaDpjPSIiLGhhc2g6ZD0iIixzdGF0ZTpmPW51bGwsa2V5Omg9ImRlZmF1bHQifT1yLGc9cC51c2VNZW1vKCgpPT57bGV0IG09QmEodSxzKTtyZXR1cm4gbT09bnVsbD9udWxsOntsb2NhdGlvbjp7cGF0aG5hbWU6bSxzZWFyY2g6YyxoYXNoOmQsc3RhdGU6ZixrZXk6aH0sbmF2aWdhdGlvblR5cGU6b319LFtzLHUsYyxkLGYsaCxvXSk7cmV0dXJuIGc9PW51bGw/bnVsbDpwLmNyZWF0ZUVsZW1lbnQoYmQuUHJvdmlkZXIse3ZhbHVlOmF9LHAuY3JlYXRlRWxlbWVudChSZC5Qcm92aWRlcix7Y2hpbGRyZW46bix2YWx1ZTpnfSkpfW5ldyBQcm9taXNlKCgpPT57fSk7ZnVuY3Rpb24gaDMoZSl7bGV0IHQ9e2hhc0Vycm9yQm91bmRhcnk6ZS5FcnJvckJvdW5kYXJ5IT1udWxsfHxlLmVycm9yRWxlbWVudCE9bnVsbH07cmV0dXJuIGUuQ29tcG9uZW50JiZPYmplY3QuYXNzaWduKHQse2VsZW1lbnQ6cC5jcmVhdGVFbGVtZW50KGUuQ29tcG9uZW50KSxDb21wb25lbnQ6dm9pZCAwfSksZS5FcnJvckJvdW5kYXJ5JiZPYmplY3QuYXNzaWduKHQse2Vycm9yRWxlbWVudDpwLmNyZWF0ZUVsZW1lbnQoZS5FcnJvckJvdW5kYXJ5KSxFcnJvckJvdW5kYXJ5OnZvaWQgMH0pLHR9Y29uc3QgdEU9cS5jcmVhdGVDb250ZXh0KG51bGwpLHAzPWU9Pnt2YXIgcyxhO2NvbnN0IHQ9cS51c2VDb250ZXh0KHRFKSxbbixyXT13bi5zcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aChlKSxvPShzPXQ9PW51bGw/dm9pZCAwOnRbbl0pPT1udWxsP3ZvaWQgMDpzLnNvdXJjZSxpPShhPXQ9PW51bGw/dm9pZCAwOnRbbl0pPT1udWxsP3ZvaWQgMDphLnNjaGVtYTtpZighb3x8IWkpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIG1vZHVsZTogIituKTtjb25zdCBsPXduLnJlc29sdmVQYXRoKHIsbyxpKTtyZXR1cm57bW9kdWxlSWQ6bixtb2R1bGVTb3VyY2U6bC5zb3VyY2UsbW9kdWxlU2NoZW1hOmwuc2NoZW1hfX0sZzM9KHt2YWxBcGk6ZX0pPT57dmFyIHcsQztjb25zdHsiKiI6dH09ZTMoKSxbbixyXT1wLnVzZVN0YXRlKG51bGwpLFtvLGldPXAudXNlU3RhdGUobnVsbCksW2wsc109cC51c2VTdGF0ZSgpLFthXT1sP3duLnNwbGl0TW9kdWxlSWRBbmRNb2R1bGVQYXRoKGwpOlt2b2lkIDAsdm9pZCAwXSx1PWEmJigodz1uPT1udWxsP3ZvaWQgMDpuW2FdKT09bnVsbD92b2lkIDA6dy5zb3VyY2UpLGM9YSYmKChDPW49PW51bGw/dm9pZCAwOm5bYV0pPT1udWxsP3ZvaWQgMDpDLnNjaGVtYSksZD1PYmplY3QuZW50cmllcyhufHx7fSkuZmxhdE1hcCgoWywkXSk9PiQuZXJyb3JzPyQuZXJyb3JzLmZhdGFsPyQuZXJyb3JzLmZhdGFsOltdOltdKSxmPU9iamVjdC5lbnRyaWVzKG58fHt9KS5mbGF0TWFwKChbLCRdKT0+JC5lcnJvcnMmJiQuZXJyb3JzLnZhbGlkYXRpb24/WyQuZXJyb3JzLnZhbGlkYXRpb25dOltdKTtpZihkJiZkLmxlbmd0aD4wKXtjb25zdCAkPWQubGVuZ3RoPT09MT9kWzBdLm1lc3NhZ2U6YE11bHRpcGxlIGVycm9ycyBkZXRlY3RlZDoKJHtkLm1hcCgoVCxNKT0+YCR7TSsxfS4gJHtULm1lc3NhZ2V9YCkuam9pbihgCmApfQoKU2hvd2luZyBzdGFjayB0cmFjZSBvZjogMC4gJHtkWzBdLm1lc3NhZ2V9YCxFPW5ldyBFcnJvcigkKTt0aHJvdyBFLnN0YWNrPWRbMF0uc3RhY2ssRX1mJiZmLmxlbmd0aD4wJiZjb25zb2xlLndhcm4oIlZhbCBlbmNvdW50ZXJlZCB2YWxpZGF0aW9uIGVycm9yczoiLGYpLHAudXNlRWZmZWN0KCgpPT57cyh0P2AvJHt0fWA6bCl9LFt0XSk7Y29uc3RbaCxnXT1wLnVzZVN0YXRlKG51bGwpO3AudXNlRWZmZWN0KCgpPT57dHJ5e25ldyBXZWJTb2NrZXQoYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbi5yZXBsYWNlKCJodHRwOi8vIiwid3M6Ly8iKX0vX25leHQvd2VicGFjay1obXJgKS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixFPT57bGV0IFQ7dHJ5e1Q9SlNPTi5wYXJzZShFLmRhdGEpfWNhdGNoe2NvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBwYXJzZSBITVIiKX10eXBlb2YoVD09bnVsbD92b2lkIDA6VC5oYXNoKT09InN0cmluZyImJihUPT1udWxsP3ZvaWQgMDpULmFjdGlvbik9PT0iYnVpbHQiJiZnKFQuaGFzaCl9KX1jYXRjaCgkKXtjb25zb2xlLndhcm4oIkZhaWxlZCB0byBpbml0aWFsaXplIEhNUiIsJCl9fSxbXSkscC51c2VFZmZlY3QoKCk9Pntjb25zb2xlLmxvZygiKFJlKS1mZXRjaGluZyBtb2R1bGVzIiksZS5nZXRNb2R1bGVzKHtwYXRjaDohMCxpbmNsdWRlU2NoZW1hOiEwLGluY2x1ZGVTb3VyY2U6ITB9KS50aGVuKCQ9PntkbC5pc09rKCQpP3IoJC52YWx1ZS5tb2R1bGVzKTooaSgiQ291bGQgbm90IGxvYWQgbW9kdWxlczogIiskLmVycm9yLm1lc3NhZ2UpLGNvbnNvbGUuZXJyb3IoJC5lcnJvcikpfSl9LFtoXSk7Y29uc3QgbT1SbSgpLFtTLHZdPUxQKCk7cC51c2VFZmZlY3QoKCk9Pntjb25zdCAkPUU9Pntjb25zb2xlLmxvZygicG9wc3RhdGUiLEUpfTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvcHN0YXRlIiwkKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb3BzdGF0ZSIsJCl9fSxbXSk7Y29uc3QgeT1xLnVzZVJlZihudWxsKSxfPXAudXNlQ2FsbGJhY2soJD0+YXN5bmMgRT0+e2NvbnN0W1QsTV09d24uc3BsaXRNb2R1bGVJZEFuZE1vZHVsZVBhdGgoJCksUj1hd2FpdCBFKHduLmNyZWF0ZVBhdGNoSlNPTlBhdGgoTSkpO3JldHVybiBlLnBvc3RQYXRjaGVzKFQsUikudGhlbihqPT57aWYoZGwuaXNFcnIoaikpdGhyb3cgai5lcnJvcjtpZihjb25zb2xlLmxvZygic3VibWl0dGVkIixSKSwhaClyZXR1cm4gZS5nZXRNb2R1bGVzKHtwYXRjaDohMCxpbmNsdWRlU2NoZW1hOiEwLGluY2x1ZGVTb3VyY2U6ITB9KS50aGVuKEY9PntkbC5pc09rKEYpP3IoRi52YWx1ZS5tb2R1bGVzKTooaSgiQ291bGQgbm90IGxvYWQgbW9kdWxlczogIitGLmVycm9yLm1lc3NhZ2UpLGNvbnNvbGUuZXJyb3IoRi5lcnJvcikpfSl9KS5jYXRjaChqPT57Y29uc29sZS5lcnJvcihqKX0pfSxbXSk7cmV0dXJuIHguanN4KE5TLlByb3ZpZGVyLHt2YWx1ZTp7dGhlbWU6UyxzZXRUaGVtZTp2LGFwaTplLGVkaXRNb2RlOiJmdWxsIixzZXNzaW9uOntzdGF0dXM6Im5vdC1hc2tlZCJ9LGhpZ2hsaWdodDohMSxzZXRIaWdobGlnaHQ6KCk9Pnt9LHNldEVkaXRNb2RlOigpPT57fSxzZXRXaW5kb3dTaXplOigpPT57fX0sY2hpbGRyZW46eC5qc3hzKCJkaXYiLHtpZDoidmFsLWZ1bGxzY3JlZW4tY29udGFpbmVyIixjbGFzc05hbWU6InJlbGF0aXZlIGZvbnQtc2VyaWYgYW50aWFsaWFzZWQiLCJkYXRhLW1vZGUiOlMsY2hpbGRyZW46W3guanN4KCJkaXYiLHtjbGFzc05hbWU6ImZpeGVkIC10cmFuc2xhdGUteC0xLzIgei1vdmVybGF5IGxlZnQtMS8yIGJvdHRvbS00IixjaGlsZHJlbjp4LmpzeChQUCx7YXBpOmV9KX0pLHguanN4KCJkaXYiLHtpZDoidmFsLWZ1bGxzY3JlZW4taG92ZXIiLHJlZjp5fSkseC5qc3gobkUuUHJvdmlkZXIse3ZhbHVlOntob3ZlckVsZW06eT09bnVsbD92b2lkIDA6eS5jdXJyZW50fSxjaGlsZHJlbjp4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LXByaW1hcnkgYmctYmFja2dyb3VuZCIsY2hpbGRyZW46eC5qc3hzKE1zLHtjaGlsZHJlbjpbeC5qc3goImRpdiIse2NsYXNzTmFtZToicHgtNCBoLVs1MHB4XSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciIsY2hpbGRyZW46eC5qc3goREMse30pfSkseC5qc3goQXMse2NsYXNzTmFtZToicHgtNCIsY2hpbGRyZW46bj94LmpzeChFMyx7cGF0aHM6T2JqZWN0LmtleXMobiksc2V0U2VsZWN0ZWRNb2R1bGVJZDokPT57bSgkKX19KTohbyYmeC5qc3goImRpdiIse2NsYXNzTmFtZToicHktNCIsY2hpbGRyZW46IkxvYWRpbmcuLi4ifSl9KSx4LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1zdGFydCB3LWZ1bGwgaC1bNTBweF0gZ2FwLTIgZm9udC1zZXJpZiB0ZXh0LXhzIixjaGlsZHJlbjpbeC5qc3goImJ1dHRvbiIse29uQ2xpY2s6KCk9PntoaXN0b3J5LmJhY2soKX0sY2hpbGRyZW46eC5qc3goX1Ase30pfSkseC5qc3goInAiLHtjaGlsZHJlbjpsfHwiLyJ9KV19KSx4LmpzeHMoImRpdiIse2NsYXNzTmFtZToicC00IixjaGlsZHJlbjpbbyYmeC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InRleHQtbGcgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIixjaGlsZHJlbjpbIkVSUk9SOiAiLG9dfSksbiYmbCYmYSYmdSE9PXZvaWQgMCYmYyE9PXZvaWQgMCYmeC5qc3godEUuUHJvdmlkZXIse3ZhbHVlOm4sY2hpbGRyZW46eC5qc3godjMse3BhdGg6bCxzb3VyY2U6dSxzY2hlbWE6YyxzZXRTZWxlY3RlZFBhdGg6cyxpbml0T25TdWJtaXQ6X30pfSldfSldfSl9KX0pXX0pfSl9LG5FPXEuY3JlYXRlQ29udGV4dCh7aG92ZXJFbGVtOm51bGx9KSxtMz0oKT0+cS51c2VDb250ZXh0KG5FKTtmdW5jdGlvbiB2Myh7cGF0aDplLHNvdXJjZTp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDpvfSl7Y29uc3RbLGldPXduLnNwbGl0TW9kdWxlSWRBbmRNb2R1bGVQYXRoKGUpLGw9d24ucmVzb2x2ZVBhdGgoaSx0LG4pO2lmKCFsKXRocm93IEVycm9yKCJDb3VsZCBub3QgcmVzb2x2ZSBtb2R1bGU6ICIrZSk7cmV0dXJuIHguanN4KHJFLHtwYXRoOmUsc291cmNlOmwuc291cmNlLHNjaGVtYTpsLnNjaGVtYSxzZXRTZWxlY3RlZFBhdGg6cixpbml0T25TdWJtaXQ6byx0b3A6ITB9KX1mdW5jdGlvbiByRSh7cGF0aDplLHNvdXJjZTp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyLGZpZWxkOm8saW5pdE9uU3VibWl0OmksdG9wOmx9KXtyZXR1cm4gdD09PW51bGx8fG4ub3B0P3guanN4KHczLHtwYXRoOmUsc291cmNlOnQsc2NoZW1hOm4sZmllbGQ6byxpbml0T25TdWJtaXQ6aSxzZXRTZWxlY3RlZFBhdGg6cn0pOm4udHlwZT09PSJvYmplY3QiP3R5cGVvZiB0IT0ib2JqZWN0Inx8S3ModCk/eC5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbIkVSUk9SOiBleHBlY3RlZCBvYmplY3QsIGJ1dCBmb3VuZCAiLHR5cGVvZiB0XX0pOnguanN4KG9FLHtzb3VyY2U6dCxwYXRoOmUsc2NoZW1hOm4saW5pdE9uU3VibWl0Omksc2V0U2VsZWN0ZWRQYXRoOnIsdG9wOmx9KTpuLnR5cGU9PT0iYXJyYXkiP3R5cGVvZiB0IT0ib2JqZWN0Inx8IUtzKHQpP3guanN4cygiZGl2Iix7Y2hpbGRyZW46WyJFUlJPUjogZXhwZWN0ZWQgYXJyYXksIGJ1dCBmb3VuZCAiLHR5cGVvZiB0XX0pOnguanN4KGlFLHtzb3VyY2U6dCxwYXRoOmUsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnJ9KTpuLnR5cGU9PT0icmVjb3JkIj90eXBlb2YgdCE9Im9iamVjdCI/eC5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbIkVSUk9SOiBleHBlY3RlZCBvYmplY3QgZm9yICIsbi50eXBlLCIsIGJ1dCBmb3VuZCAiLHR5cGVvZiB0XX0pOktzKHQpP3guanN4cygiZGl2Iix7Y2hpbGRyZW46WyJFUlJPUjogZGlkIG5vdCBleHBlY3QgYXJyYXkgZm9yICIsbi50eXBlXX0pOnguanN4KHkzLHtzb3VyY2U6dCxwYXRoOmUsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnJ9KTp4LmpzeHMoImRpdiIse2NsYXNzTmFtZToicHktMiBnYXAteS00IixjaGlsZHJlbjpbeC5qc3goImRpdiIse2NsYXNzTmFtZToidGV4dC1sZWZ0IixjaGlsZHJlbjpvfHxlfSkseC5qc3goTUMse3BhdGg6ZSxkaXNhYmxlZDohMSxzb3VyY2U6dCxzY2hlbWE6bixvblN1Ym1pdDppKGUpfSldfSl9ZnVuY3Rpb24gb0Uoe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cixpbml0T25TdWJtaXQ6byx0b3A6aX0pe3JldHVybiB4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOmlkKCJmbGV4IGZsZXgtY29sIGdhcC15LTgiLHsiYm9yZGVyLWwtMiBib3JkZXItYm9yZGVyIHBsLTYiOiFpfSksY2hpbGRyZW46T2JqZWN0LmVudHJpZXMobi5pdGVtcykubWFwKChbbCxzXSk9Pntjb25zdCBhPUNhKGUsbCk7cmV0dXJuIHguanN4KHJFLHtwYXRoOmEsc291cmNlOnRbbF0sc2NoZW1hOnMsc2V0U2VsZWN0ZWRQYXRoOnIsZmllbGQ6bCxpbml0T25TdWJtaXQ6b30sYSl9KX0sZSl9ZnVuY3Rpb24geTMoe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pe2NvbnN0IG89Um0oKTtyZXR1cm4geC5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCBnYXAtNCBwLTIiLGNoaWxkcmVuOk9iamVjdC5lbnRyaWVzKHQpLm1hcCgoW2ksbF0pPT57Y29uc3Qgcz1DYShlLGkpO3JldHVybiB4LmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e3IocyksbyhzKX0sY2hpbGRyZW46eC5qc3goeDMse3JlY29yZEtleTppLHBhdGg6cyxzb3VyY2U6bCxzY2hlbWE6bi5pdGVtfSl9LHMpfSl9LGUpfWNvbnN0IE5wPTE3MDtmdW5jdGlvbiB4Myh7cmVjb3JkS2V5OmUscGF0aDp0LHNvdXJjZTpuLHNjaGVtYTpyfSl7Y29uc3Qgbz1xLnVzZVJlZihudWxsKSxbaSxsXT1wLnVzZVN0YXRlKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntvLmN1cnJlbnQmJm8uY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ+PU5wJiZsKCEwKX0sW10pLHguanN4cyhrbSx7cmVmOm8sY2xhc3NOYW1lOiJyZWxhdGl2ZSBweC00IHB0LTIgcGItNCBvdmVyZmxvdy1oaWRkZW4gYm9yZGVyIGdhcC15LTIiLHN0eWxlOnttYXhIZWlnaHQ6TnB9LGNoaWxkcmVuOlt4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwYi00IGZvbnQtc2VyaWYgdGV4dC1sZWZ0IHRleHQtYWNjZW50IixjaGlsZHJlbjplfSkseC5qc3goImRpdiIse2NsYXNzTmFtZToidGV4dC14cyIsY2hpbGRyZW46eC5qc3goUG0se3BhdGg6dCxzb3VyY2U6bixzY2hlbWE6cn0pfSksaSYmeC5qc3goImRpdiIse2NsYXNzTmFtZToiYWJzb2x1dGUgYm90dG9tLTAgbGVmdC0wIHctZnVsbCBoLVsyMHB4XSBiZy1ncmFkaWVudC10by1iIGZyb20tdHJhbnNwYXJlbnQgdG8tYmFja2dyb3VuZCJ9KV19LHQpfWZ1bmN0aW9uIGlFKHtwYXRoOmUsc291cmNlOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnJ9KXtjb25zdCBvPVJtKCk7cmV0dXJuIHguanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wgZ2FwLTQgcC0yIixjaGlsZHJlbjp0Lm1hcCgoaSxsKT0+e2NvbnN0IHM9Q2EoZSxsKTtyZXR1cm4geC5qc3goImJ1dHRvbiIse29uQ2xpY2s6KCk9PntyKHMpLG8ocyl9LGNoaWxkcmVuOnguanN4KF8zLHtpbmRleDpsLHBhdGg6cyxzb3VyY2U6aSxzY2hlbWE6bi5pdGVtfSxzKX0scyl9KX0sZSl9Y29uc3QgQjA9TnA7ZnVuY3Rpb24gXzMoe2luZGV4OmUscGF0aDp0LHNvdXJjZTpuLHNjaGVtYTpyfSl7Y29uc3Qgbz1xLnVzZVJlZihudWxsKSxbaSxsXT1wLnVzZVN0YXRlKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntvLmN1cnJlbnQmJm8uY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ+PUIwJiZsKCEwKX0sW10pLHguanN4cyhrbSx7cmVmOm8sY2xhc3NOYW1lOiJyZWxhdGl2ZSBweC00IHB0LTIgcGItNCBvdmVyZmxvdy1oaWRkZW4gYm9yZGVyIGdhcC15LTIiLHN0eWxlOnttYXhIZWlnaHQ6QjB9LGNoaWxkcmVuOlt4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwYi00IGZvbnQtc2VyaWYgdGV4dC1sZWZ0IHVwcGVyY2FzZSB0ZXh0LWFjY2VudCIsY2hpbGRyZW46ZSsxPDEwP2AwJHtlKzF9YDplKzF9KSx4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LXhzIixjaGlsZHJlbjp4LmpzeChQbSx7cGF0aDp0LHNvdXJjZTpuLHNjaGVtYTpyfSl9KSxpJiZ4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGgtWzIwcHhdIGJnLWdyYWRpZW50LXRvLWIgZnJvbS10cmFuc3BhcmVudCB0by1iYWNrZ3JvdW5kIn0pXX0pfWZ1bmN0aW9uIENhKGUsdCl7Y29uc3Qgbj13bi5jcmVhdGVWYWxQYXRoT2ZJdGVtKGUsdCk7aWYoIW4pdGhyb3cgRXJyb3IoYENvdWxkIG5vdCBjcmVhdGUgdmFsIHBhdGg6ICR7ZX0gb2YgJHt0PT1udWxsP3ZvaWQgMDp0LnRvU3RyaW5nKCl9YCk7cmV0dXJuIG59ZnVuY3Rpb24gUG0oe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bn0pe2NvbnN0W3Isb109cC51c2VTdGF0ZShudWxsKSx7aG92ZXJFbGVtOml9PW0zKCk7aWYobi50eXBlPT09Im9iamVjdCIpcmV0dXJuIHguanN4KCJkaXYiLHtjbGFzc05hbWU6ImdyaWQgZ3JpZC1jb2xzLVttaW4tY29udGVudF8xZnJdIGdhcC0yIHRleHQtbGVmdCIsY2hpbGRyZW46T2JqZWN0LmVudHJpZXMobi5pdGVtcykubWFwKChbbF0pPT54LmpzeHMocC5GcmFnbWVudCx7Y2hpbGRyZW46W3guanN4cygic3BhbiIse2NsYXNzTmFtZToidGV4dC1tdXRlZCIsY2hpbGRyZW46W2wsIjoiXX0pLHguanN4KCJzcGFuIix7Y2hpbGRyZW46eC5qc3goUG0se3NvdXJjZToodD09bnVsbD92b2lkIDA6dFtsXSk/P251bGwsc2NoZW1hOm4uaXRlbXNbbF0scGF0aDpDYShlLGwpfSl9KV19LENhKGUsbCkpKX0sZSk7aWYobi50eXBlPT09ImFycmF5IilyZXR1cm4gdD09PW51bGw/eC5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSxlKTpBcnJheS5pc0FycmF5KHQpP3guanN4cygic3BhbiIse2NoaWxkcmVuOlt4LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOnQubGVuZ3RofSkseC5qc3goInNwYW4iLHtjaGlsZHJlbjp0Lmxlbmd0aD09PTE/IiBpdGVtIjoiIGl0ZW1zIn0pXX0sZSk6eC5qc3goInNwYW4iLHtjbGFzc05hbWU6InB4LTIgYmctZGVzdHJ1Y3RpdmUgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIixjaGlsZHJlbjoiVW5rbm93biBsZW5ndGgifSxlKTtpZihuLnR5cGU9PT0icmljaHRleHQiKXJldHVybiB0PT09bnVsbD94LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LGUpOnR5cGVvZiB0IT0ib2JqZWN0Ij94LmpzeHMoImRpdiIse2NsYXNzTmFtZToicC00IHRleHQtZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZCBiZy1kZXN0cnVjdGl2ZSIsY2hpbGRyZW46WyJFUlJPUjogIix0eXBlb2YgdCwiIG5vdCBhbiBvYmplY3QiXX0sZSk6IShLdCBpbiB0KXx8dFtLdF0hPT0icmljaHRleHQiP3guanN4KCJkaXYiLHtjbGFzc05hbWU6InAtNCB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQgYmctZGVzdHJ1Y3RpdmUiLGNoaWxkcmVuOiJFUlJPUjogb2JqZWN0IGlzIG5vdCByaWNodGV4dCJ9LGUpOnguanN4KCQzLHtjaGlsZHJlbjpCUyh0KX0sZSk7aWYobi50eXBlPT09InN0cmluZyIpcmV0dXJuIHQ9PT1udWxsP3guanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46IkVtcHR5In0sZSk6eC5qc3goInNwYW4iLHtjaGlsZHJlbjp0fSk7aWYobi50eXBlPT09ImltYWdlIil7aWYodD09PW51bGwpcmV0dXJuIHguanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46IkVtcHR5In0sZSk7aWYodHlwZW9mIHQhPSJvYmplY3QiKXJldHVybiB4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGJnLWRlc3RydWN0aXZlIixjaGlsZHJlbjoiRVJST1I6IG5vdCBhbiBvYmplY3QifSxlKTtpZighKGhuIGluIHQpfHx0eXBlb2YgdFtobl0hPSJzdHJpbmciKXJldHVybiB4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGJnLWRlc3RydWN0aXZlIixjaGlsZHJlbjoiRVJST1I6IG9iamVjdCBpcyBub3QgYW4gaW1hZ2UifSxlKTtjb25zdCBsPXduLmNvbnZlcnRGaWxlU291cmNlKHQpLnVybDtyZXR1cm4geC5qc3hzKCJzcGFuIix7b25Nb3VzZU92ZXI6cz0+e28oe3g6cy5jbGllbnRYLHk6cy5jbGllbnRZfSl9LG9uTW91c2VMZWF2ZTooKT0+e28obnVsbCl9LGNsYXNzTmFtZToicmVsYXRpdmUgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1zdGFydCBnYXAtMSIsY2hpbGRyZW46W3guanN4KCJhIix7aHJlZjpsLGNsYXNzTmFtZToib3ZlcmZsb3ctaGlkZGVuIHVuZGVybGluZSB0cnVuY2F0ZSAiLGNoaWxkcmVuOnRbaG5dfSksciYmaSYmSHIuY3JlYXRlUG9ydGFsKHguanN4KCJpbWciLHtjbGFzc05hbWU6ImFic29sdXRlIHotWzVdIG1heC13LVsxMHZ3XSIsc3R5bGU6e2xlZnQ6ci54KzEwLHRvcDpyLnkrMTB9LHNyYzpsfSksaSldfSxlKX1lbHNle2lmKG4udHlwZT09PSJib29sZWFuIilyZXR1cm4gdD09PW51bGw/eC5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSxlKTp4LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOnQ/InRydWUiOiJmYWxzZSJ9LGUpO2lmKG4udHlwZT09PSJudW1iZXIiKXJldHVybiB0PT09bnVsbD94LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LGUpOnguanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46dC50b1N0cmluZygpfSk7aWYobi50eXBlPT09ImtleU9mIilyZXR1cm4gdD09PW51bGw/eC5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSxlKTp4LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOnQudG9TdHJpbmcoKX0sZSl9cmV0dXJuIHguanN4cygiZGl2Iix7Y2hpbGRyZW46WyJUT0RPOiAiLG4udHlwZV19LGUpfWZ1bmN0aW9uIHczKHtwYXRoOmUsc291cmNlOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0Om8sZmllbGQ6aX0pe2NvbnN0W2wsc109cC51c2VTdGF0ZSh0IT09bnVsbCk7cmV0dXJuIHguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIGdhcC15LTYiLGNoaWxkcmVuOltpP3guanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IGdhcC14LTQiLGNoaWxkcmVuOlt4LmpzeChDcCx7Y2hlY2tlZDpsLG9uQ2xpY2s6KCk9PntzKGE9PiFhKX19KSx4LmpzeCgic3BhbiIse2NoaWxkcmVuOml9KV19KTp4LmpzeChDcCx7Y2hlY2tlZDpsLG9uQ2xpY2s6KCk9PntzKGE9PiFhKX19KSxsJiZ4LmpzeChTMyx7c291cmNlOnQsc2NoZW1hOm4scGF0aDplLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDpvfSldfSxlKX1mdW5jdGlvbiBTMyh7c291cmNlOmUscGF0aDp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDpvfSl7aWYobi50eXBlPT09ImFycmF5Iil7aWYodHlwZW9mIGU9PSJvYmplY3QiJiYoZT09PW51bGx8fEtzKGUpKSlyZXR1cm4geC5qc3goaUUse3NvdXJjZTplPT09bnVsbD9bXTplLHBhdGg6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pfWVsc2UgaWYobi50eXBlPT09Im9iamVjdCIpe2lmKHR5cGVvZiBlPT0ib2JqZWN0IiYmKGU9PT1udWxsfHwhS3MoZSkpKXJldHVybiB4LmpzeChvRSx7c291cmNlOmUscGF0aDp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDpvfSl9ZWxzZSBpZihuLnR5cGU9PT0icmljaHRleHQifHxuLnR5cGU9PT0ic3RyaW5nInx8bi50eXBlPT09ImltYWdlInx8bi50eXBlPT09Im51bWJlciJ8fG4udHlwZT09PSJrZXlPZiIpcmV0dXJuIHguanN4KE1DLHtwYXRoOnQsZGlzYWJsZWQ6ITEsc291cmNlOmUsc2NoZW1hOm4sb25TdWJtaXQ6byh0KX0sdCk7cmV0dXJuIHguanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgYmctZGVzdHJ1Y3RpdmUgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIixjaGlsZHJlbjpbIkVSUk9SOiB1bmV4cGVjdGVkIHNvdXJjZSB0eXBlICIsdHlwZW9mIGUsIiBmb3Igc2NoZW1hIHR5cGUiLCIgIixuLnR5cGVdfSl9ZnVuY3Rpb24gS3MoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl9ZnVuY3Rpb24gQzMoZSl7Y29uc3QgdD17fTtyZXR1cm4gZS5mb3JFYWNoKG49Pntjb25zdCByPW4uc3BsaXQoIi8iKS5maWx0ZXIoaT0+aSE9PSIiKTtsZXQgbz10O3IuZm9yRWFjaChpPT57b1tpXXx8KG9baV09e30pLG89b1tpXX0pfSksdH1mdW5jdGlvbiBFMyh7cGF0aHM6ZSxzZXRTZWxlY3RlZE1vZHVsZUlkOnR9KXtjb25zdCBuPUMzKGUpO3JldHVybiB4LmpzeChEXyx7Y2hpbGRyZW46T2JqZWN0LmVudHJpZXMobikubWFwKChbcixvXSk9PnguanN4KCJkaXYiLHtjbGFzc05hbWU6InB4LTQgcHktMiIsY2hpbGRyZW46eC5qc3gobEUse25hbWU6cix0cmVlOm8sbW9kdWxlSWQ6YC8ke3J9YCxzZXRTZWxlY3RlZE1vZHVsZUlkOnR9KX0sYC8ke3J9YCkpfSl9ZnVuY3Rpb24gbEUoe25hbWU6ZSx0cmVlOnQsbW9kdWxlSWQ6bixzZXRTZWxlY3RlZE1vZHVsZUlkOnJ9KXtyZXR1cm4geC5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbeC5qc3goImJ1dHRvbiIse29uQ2xpY2s6KCk9PntyKG4pfSxjaGlsZHJlbjplfSksT2JqZWN0LmVudHJpZXModCkubWFwKChbbyxpXSk9PnguanN4KCJkaXYiLHtjbGFzc05hbWU6InB4LTQgcHktMSIsY2hpbGRyZW46eC5qc3gobEUse25hbWU6byx0cmVlOmksbW9kdWxlSWQ6YCR7bn0vJHtvfWAsc2V0U2VsZWN0ZWRNb2R1bGVJZDpyfSl9LGAke259LyR7b31gKSldfSl9Y29uc3QgVzA9e3RhZ3M6e2gxOiJmb250LWJvbGQiLGgyOiJmb250LWJvbGQiLGgzOiJmb250LWJvbGQiLGg0OiJmb250LWJvbGQiLGg1OiJmb250LWJvbGQiLGg2OiJmb250LWJvbGQiLHA6IiJ9LGNsYXNzZXM6e2JvbGQ6ImZvbnQtYm9sZCIsaXRhbGljOiJpdGFsaWMiLGxpbmVUaHJvdWdoOiJsaW5lLXRocm91Z2gifX07ZnVuY3Rpb24gJDMoe2NoaWxkcmVuOmV9KXtjb25zdCB0PWU7ZnVuY3Rpb24gbihpLGwpe2NvbnN0IHM9VzAudGFnc1tpXTtyZXR1cm4gcyYmbD9bbCxzXS5qb2luKCIgIik6c3x8bH1mdW5jdGlvbiByKGksbCl7Y29uc3Qgcz1XMC5jbGFzc2VzW2ldO3JldHVybiBzJiZsP1tsLHNdLmpvaW4oIiAiKTpzfHxsfWZ1bmN0aW9uIG8oaSxsKXt2YXIgdSxjO2lmKHR5cGVvZiBpPT0ic3RyaW5nIilyZXR1cm4gaTtpZihpLnRhZz09PSJwIilyZXR1cm4geC5qc3goInAiLHtjbGFzc05hbWU6bigicCIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJpbWciKXJldHVybiB4LmpzeCgiaW1nIix7Y2xhc3NOYW1lOm4oImltZyIpLHNyYzppLnNyY30sbCk7aWYoaS50YWc9PT0idWwiKXJldHVybiB4LmpzeCgidWwiLHtjbGFzc05hbWU6bigidWwiKSxjaGlsZHJlbjppLmNoaWxkcmVuLm1hcCgoZCxmKT0+byhkLGYpKX0sbCk7aWYoaS50YWc9PT0ib2wiKXJldHVybiB4LmpzeCgib2wiLHtjbGFzc05hbWU6bigib2wiKSxjaGlsZHJlbjppLmNoaWxkcmVuLm1hcCgoZCxmKT0+byhkLGYpKX0sbCk7aWYoaS50YWc9PT0ibGkiKXJldHVybiB4LmpzeCgibGkiLHtjbGFzc05hbWU6bigibGkiKSxjaGlsZHJlbjppLmNoaWxkcmVuLm1hcCgoZCxmKT0+byhkLGYpKX0sbCk7aWYoaS50YWc9PT0ic3BhbiIpcmV0dXJuIHguanN4KCJzcGFuIix7Y2xhc3NOYW1lOmkuY2xhc3Nlcy5tYXAoZD0+e3N3aXRjaChkKXtjYXNlImJvbGQiOnJldHVybiByKCJib2xkIik7Y2FzZSJsaW5lLXRocm91Z2giOnJldHVybiByKCJsaW5lVGhyb3VnaCIpO2Nhc2UiaXRhbGljIjpyZXR1cm4gcigiaXRhbGljIil9fSkuam9pbigiICIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJoMSIpcmV0dXJuIHguanN4KCJoMSIse2NsYXNzTmFtZTpuKCJoMSIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJoMiIpcmV0dXJuIHguanN4KCJoMiIse2NsYXNzTmFtZTpuKCJoMiIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJoMyIpcmV0dXJuIHguanN4KCJoMyIse2NsYXNzTmFtZTpuKCJoMyIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJoNCIpcmV0dXJuIHguanN4KCJoNCIse2NsYXNzTmFtZTpuKCJoNCIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJoNSIpcmV0dXJuIHguanN4KCJoNSIse2NsYXNzTmFtZTpuKCJoNSIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJoNiIpcmV0dXJuIHguanN4KCJoNiIse2NsYXNzTmFtZTpuKCJoNiIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJiciIpcmV0dXJuIHguanN4KCJiciIse30sbCk7aWYoaS50YWc9PT0iYSIpcmV0dXJuIHguanN4KCJhIix7aHJlZjppLmhyZWYsY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2NvbnNvbGUuZXJyb3IoIlVua25vd24gdGFnIixpLnRhZyk7Y29uc3QgYT1pLnRhZztyZXR1cm4gYSE9bnVsbCYmYS50YWc/cS5jcmVhdGVFbGVtZW50KGEudGFnLHtrZXk6bCxjbGFzc05hbWU6KHU9YS5jbGFzcyk9PW51bGw/dm9pZCAwOnUuam9pbigiICIpLGNoaWxkcmVuOihjPWEuY2hpbGRyZW4pPT1udWxsP3ZvaWQgMDpjLm1hcChvKX0pOm51bGx9cmV0dXJuIHguanN4KCJzcGFuIix7ImRhdGEtdmFsLXBhdGgiOnQudmFsUGF0aCxjaGlsZHJlbjp0LmNoaWxkcmVuLm1hcCgoaSxsKT0+byhpLGwpKX0pfWNvbnN0IGszPXAuY3JlYXRlQ29udGV4dChudWxsKSxNZj17ZGlkQ2F0Y2g6ITEsZXJyb3I6bnVsbH07Y2xhc3MgVDMgZXh0ZW5kcyBwLkNvbXBvbmVudHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeT10aGlzLnJlc2V0RXJyb3JCb3VuZGFyeS5iaW5kKHRoaXMpLHRoaXMuc3RhdGU9TWZ9c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcih0KXtyZXR1cm57ZGlkQ2F0Y2g6ITAsZXJyb3I6dH19cmVzZXRFcnJvckJvdW5kYXJ5KCl7Y29uc3R7ZXJyb3I6dH09dGhpcy5zdGF0ZTtpZih0IT09bnVsbCl7Zm9yKHZhciBuLHIsbz1hcmd1bWVudHMubGVuZ3RoLGk9bmV3IEFycmF5KG8pLGw9MDtsPG87bCsrKWlbbF09YXJndW1lbnRzW2xdOyhuPShyPXRoaXMucHJvcHMpLm9uUmVzZXQpPT09bnVsbHx8bj09PXZvaWQgMHx8bi5jYWxsKHIse2FyZ3M6aSxyZWFzb246ImltcGVyYXRpdmUtYXBpIn0pLHRoaXMuc2V0U3RhdGUoTWYpfX1jb21wb25lbnREaWRDYXRjaCh0LG4pe3ZhciByLG87KHI9KG89dGhpcy5wcm9wcykub25FcnJvcik9PT1udWxsfHxyPT09dm9pZCAwfHxyLmNhbGwobyx0LG4pfWNvbXBvbmVudERpZFVwZGF0ZSh0LG4pe2NvbnN0e2RpZENhdGNoOnJ9PXRoaXMuc3RhdGUse3Jlc2V0S2V5czpvfT10aGlzLnByb3BzO2lmKHImJm4uZXJyb3IhPT1udWxsJiZOMyh0LnJlc2V0S2V5cyxvKSl7dmFyIGksbDsoaT0obD10aGlzLnByb3BzKS5vblJlc2V0KT09PW51bGx8fGk9PT12b2lkIDB8fGkuY2FsbChsLHtuZXh0Om8scHJldjp0LnJlc2V0S2V5cyxyZWFzb246ImtleXMifSksdGhpcy5zZXRTdGF0ZShNZil9fXJlbmRlcigpe2NvbnN0e2NoaWxkcmVuOnQsZmFsbGJhY2tSZW5kZXI6bixGYWxsYmFja0NvbXBvbmVudDpyLGZhbGxiYWNrOm99PXRoaXMucHJvcHMse2RpZENhdGNoOmksZXJyb3I6bH09dGhpcy5zdGF0ZTtsZXQgcz10O2lmKGkpe2NvbnN0IGE9e2Vycm9yOmwscmVzZXRFcnJvckJvdW5kYXJ5OnRoaXMucmVzZXRFcnJvckJvdW5kYXJ5fTtpZihwLmlzVmFsaWRFbGVtZW50KG8pKXM9bztlbHNlIGlmKHR5cGVvZiBuPT0iZnVuY3Rpb24iKXM9bihhKTtlbHNlIGlmKHIpcz1wLmNyZWF0ZUVsZW1lbnQocixhKTtlbHNlIHRocm93IGx9cmV0dXJuIHAuY3JlYXRlRWxlbWVudChrMy5Qcm92aWRlcix7dmFsdWU6e2RpZENhdGNoOmksZXJyb3I6bCxyZXNldEVycm9yQm91bmRhcnk6dGhpcy5yZXNldEVycm9yQm91bmRhcnl9fSxzKX19ZnVuY3Rpb24gTjMoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXZvaWQgMD9hcmd1bWVudHNbMF06W10sdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06W107cmV0dXJuIGUubGVuZ3RoIT09dC5sZW5ndGh8fGUuc29tZSgobixyKT0+IU9iamVjdC5pcyhuLHRbcl0pKX1jb25zdCBzRT0iQ29sbGFwc2libGUiLFtiMyxhRV09JGkoc0UpLFtSMyxPbV09YjMoc0UpLFAzPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVDb2xsYXBzaWJsZTpuLG9wZW46cixkZWZhdWx0T3BlbjpvLGRpc2FibGVkOmksb25PcGVuQ2hhbmdlOmwsLi4uc309ZSxbYT0hMSx1XT1QbCh7cHJvcDpyLGRlZmF1bHRQcm9wOm8sb25DaGFuZ2U6bH0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoUjMse3Njb3BlOm4sZGlzYWJsZWQ6aSxjb250ZW50SWQ6d2QoKSxvcGVuOmEsb25PcGVuVG9nZ2xlOnAudXNlQ2FsbGJhY2soKCk9PnUoYz0+IWMpLFt1XSl9LHAuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoeyJkYXRhLXN0YXRlIjpBbShhKSwiZGF0YS1kaXNhYmxlZCI6aT8iIjp2b2lkIDB9LHMse3JlZjp0fSkpKX0pLE8zPSJDb2xsYXBzaWJsZVRyaWdnZXIiLEEzPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVDb2xsYXBzaWJsZTpuLC4uLnJ9PWUsbz1PbShPMyxuKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KERlLmJ1dHRvbixlZSh7dHlwZToiYnV0dG9uIiwiYXJpYS1jb250cm9scyI6by5jb250ZW50SWQsImFyaWEtZXhwYW5kZWQiOm8ub3Blbnx8ITEsImRhdGEtc3RhdGUiOkFtKG8ub3BlbiksImRhdGEtZGlzYWJsZWQiOm8uZGlzYWJsZWQ/IiI6dm9pZCAwLGRpc2FibGVkOm8uZGlzYWJsZWR9LHIse3JlZjp0LG9uQ2xpY2s6SGUoZS5vbkNsaWNrLG8ub25PcGVuVG9nZ2xlKX0pKX0pLHVFPSJDb2xsYXBzaWJsZUNvbnRlbnQiLE0zPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e2ZvcmNlTW91bnQ6biwuLi5yfT1lLG89T20odUUsZS5fX3Njb3BlQ29sbGFwc2libGUpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoSWwse3ByZXNlbnQ6bnx8by5vcGVufSwoe3ByZXNlbnQ6aX0pPT5wLmNyZWF0ZUVsZW1lbnQoRDMsZWUoe30scix7cmVmOnQscHJlc2VudDppfSkpKX0pLEQzPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVDb2xsYXBzaWJsZTpuLHByZXNlbnQ6cixjaGlsZHJlbjpvLC4uLml9PWUsbD1PbSh1RSxuKSxbcyxhXT1wLnVzZVN0YXRlKHIpLHU9cC51c2VSZWYobnVsbCksYz1YZSh0LHUpLGQ9cC51c2VSZWYoMCksZj1kLmN1cnJlbnQsaD1wLnVzZVJlZigwKSxnPWguY3VycmVudCxtPWwub3Blbnx8cyxTPXAudXNlUmVmKG0pLHY9cC51c2VSZWYoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCB5PXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+Uy5jdXJyZW50PSExKTtyZXR1cm4oKT0+Y2FuY2VsQW5pbWF0aW9uRnJhbWUoeSl9LFtdKSwkbigoKT0+e2NvbnN0IHk9dS5jdXJyZW50O2lmKHkpe3YuY3VycmVudD12LmN1cnJlbnR8fHt0cmFuc2l0aW9uRHVyYXRpb246eS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24sYW5pbWF0aW9uTmFtZTp5LnN0eWxlLmFuaW1hdGlvbk5hbWV9LHkuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPSIwcyIseS5zdHlsZS5hbmltYXRpb25OYW1lPSJub25lIjtjb25zdCBfPXkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZC5jdXJyZW50PV8uaGVpZ2h0LGguY3VycmVudD1fLndpZHRoLFMuY3VycmVudHx8KHkuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPXYuY3VycmVudC50cmFuc2l0aW9uRHVyYXRpb24seS5zdHlsZS5hbmltYXRpb25OYW1lPXYuY3VycmVudC5hbmltYXRpb25OYW1lKSxhKHIpfX0sW2wub3BlbixyXSkscC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7ImRhdGEtc3RhdGUiOkFtKGwub3BlbiksImRhdGEtZGlzYWJsZWQiOmwuZGlzYWJsZWQ/IiI6dm9pZCAwLGlkOmwuY29udGVudElkLGhpZGRlbjohbX0saSx7cmVmOmMsc3R5bGU6eyItLXJhZGl4LWNvbGxhcHNpYmxlLWNvbnRlbnQtaGVpZ2h0IjpmP2Ake2Z9cHhgOnZvaWQgMCwiLS1yYWRpeC1jb2xsYXBzaWJsZS1jb250ZW50LXdpZHRoIjpnP2Ake2d9cHhgOnZvaWQgMCwuLi5lLnN0eWxlfX0pLG0mJm8pfSk7ZnVuY3Rpb24gQW0oZSl7cmV0dXJuIGU/Im9wZW4iOiJjbG9zZWQifWNvbnN0IEwzPVAzLEkzPUEzLGozPU0zLEJvPSJBY2NvcmRpb24iLHozPVsiSG9tZSIsIkVuZCIsIkFycm93RG93biIsIkFycm93VXAiLCJBcnJvd0xlZnQiLCJBcnJvd1JpZ2h0Il0sW01tLEYzLEIzXT1IUyhCbyksW09kLFM0XT0kaShCbyxbQjMsYUVdKSxEbT1hRSgpLGNFPXEuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e3R5cGU6biwuLi5yfT1lLG89cixpPXI7cmV0dXJuIHEuY3JlYXRlRWxlbWVudChNbS5Qcm92aWRlcix7c2NvcGU6ZS5fX3Njb3BlQWNjb3JkaW9ufSxuPT09Im11bHRpcGxlIj9xLmNyZWF0ZUVsZW1lbnQoSDMsZWUoe30saSx7cmVmOnR9KSk6cS5jcmVhdGVFbGVtZW50KFYzLGVlKHt9LG8se3JlZjp0fSkpKX0pO2NFLnByb3BUeXBlcz17dHlwZShlKXtjb25zdCB0PWUudmFsdWV8fGUuZGVmYXVsdFZhbHVlO3JldHVybiBlLnR5cGUmJiFbInNpbmdsZSIsIm11bHRpcGxlIl0uaW5jbHVkZXMoZS50eXBlKT9uZXcgRXJyb3IoIkludmFsaWQgcHJvcCBgdHlwZWAgc3VwcGxpZWQgdG8gYEFjY29yZGlvbmAuIEV4cGVjdGVkIG9uZSBvZiBgc2luZ2xlIHwgbXVsdGlwbGVgLiIpOmUudHlwZT09PSJtdWx0aXBsZSImJnR5cGVvZiB0PT0ic3RyaW5nIj9uZXcgRXJyb3IoIkludmFsaWQgcHJvcCBgdHlwZWAgc3VwcGxpZWQgdG8gYEFjY29yZGlvbmAuIEV4cGVjdGVkIGBzaW5nbGVgIHdoZW4gYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBpcyB0eXBlIGBzdHJpbmdgLiIpOmUudHlwZT09PSJzaW5nbGUiJiZBcnJheS5pc0FycmF5KHQpP25ldyBFcnJvcigiSW52YWxpZCBwcm9wIGB0eXBlYCBzdXBwbGllZCB0byBgQWNjb3JkaW9uYC4gRXhwZWN0ZWQgYG11bHRpcGxlYCB3aGVuIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgaXMgdHlwZSBgc3RyaW5nW11gLiIpOm51bGx9fTtjb25zdFtkRSxXM109T2QoQm8pLFtmRSxVM109T2QoQm8se2NvbGxhcHNpYmxlOiExfSksVjM9cS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dmFsdWU6bixkZWZhdWx0VmFsdWU6cixvblZhbHVlQ2hhbmdlOm89KCk9Pnt9LGNvbGxhcHNpYmxlOmk9ITEsLi4ubH09ZSxbcyxhXT1QbCh7cHJvcDpuLGRlZmF1bHRQcm9wOnIsb25DaGFuZ2U6b30pO3JldHVybiBxLmNyZWF0ZUVsZW1lbnQoZEUse3Njb3BlOmUuX19zY29wZUFjY29yZGlvbix2YWx1ZTpzP1tzXTpbXSxvbkl0ZW1PcGVuOmEsb25JdGVtQ2xvc2U6cS51c2VDYWxsYmFjaygoKT0+aSYmYSgiIiksW2ksYV0pfSxxLmNyZWF0ZUVsZW1lbnQoZkUse3Njb3BlOmUuX19zY29wZUFjY29yZGlvbixjb2xsYXBzaWJsZTppfSxxLmNyZWF0ZUVsZW1lbnQoaEUsZWUoe30sbCx7cmVmOnR9KSkpKX0pLEgzPXEuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e3ZhbHVlOm4sZGVmYXVsdFZhbHVlOnIsb25WYWx1ZUNoYW5nZTpvPSgpPT57fSwuLi5pfT1lLFtsPVtdLHNdPVBsKHtwcm9wOm4sZGVmYXVsdFByb3A6cixvbkNoYW5nZTpvfSksYT1xLnVzZUNhbGxiYWNrKGM9PnMoKGQ9W10pPT5bLi4uZCxjXSksW3NdKSx1PXEudXNlQ2FsbGJhY2soYz0+cygoZD1bXSk9PmQuZmlsdGVyKGY9PmYhPT1jKSksW3NdKTtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KGRFLHtzY29wZTplLl9fc2NvcGVBY2NvcmRpb24sdmFsdWU6bCxvbkl0ZW1PcGVuOmEsb25JdGVtQ2xvc2U6dX0scS5jcmVhdGVFbGVtZW50KGZFLHtzY29wZTplLl9fc2NvcGVBY2NvcmRpb24sY29sbGFwc2libGU6ITB9LHEuY3JlYXRlRWxlbWVudChoRSxlZSh7fSxpLHtyZWY6dH0pKSkpfSksW0szLEFkXT1PZChCbyksaEU9cS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZUFjY29yZGlvbjpuLGRpc2FibGVkOnIsZGlyOm8sb3JpZW50YXRpb246aT0idmVydGljYWwiLC4uLmx9PWUscz1xLnVzZVJlZihudWxsKSxhPVhlKHMsdCksdT1GMyhuKSxkPWJnKG8pPT09Imx0ciIsZj1IZShlLm9uS2V5RG93bixoPT57dmFyIGc7aWYoIXozLmluY2x1ZGVzKGgua2V5KSlyZXR1cm47Y29uc3QgbT1oLnRhcmdldCxTPXUoKS5maWx0ZXIoTT0+e3ZhciBSO3JldHVybiEoKFI9TS5yZWYuY3VycmVudCkhPT1udWxsJiZSIT09dm9pZCAwJiZSLmRpc2FibGVkKX0pLHY9Uy5maW5kSW5kZXgoTT0+TS5yZWYuY3VycmVudD09PW0pLHk9Uy5sZW5ndGg7aWYodj09PS0xKXJldHVybjtoLnByZXZlbnREZWZhdWx0KCk7bGV0IF89djtjb25zdCB3PTAsQz15LTEsJD0oKT0+e189disxLF8+QyYmKF89dyl9LEU9KCk9PntfPXYtMSxfPHcmJihfPUMpfTtzd2l0Y2goaC5rZXkpe2Nhc2UiSG9tZSI6Xz13O2JyZWFrO2Nhc2UiRW5kIjpfPUM7YnJlYWs7Y2FzZSJBcnJvd1JpZ2h0IjppPT09Imhvcml6b250YWwiJiYoZD8kKCk6RSgpKTticmVhaztjYXNlIkFycm93RG93biI6aT09PSJ2ZXJ0aWNhbCImJiQoKTticmVhaztjYXNlIkFycm93TGVmdCI6aT09PSJob3Jpem9udGFsIiYmKGQ/RSgpOiQoKSk7YnJlYWs7Y2FzZSJBcnJvd1VwIjppPT09InZlcnRpY2FsIiYmRSgpO2JyZWFrfWNvbnN0IFQ9XyV5OyhnPVNbVF0ucmVmLmN1cnJlbnQpPT09bnVsbHx8Zz09PXZvaWQgMHx8Zy5mb2N1cygpfSk7cmV0dXJuIHEuY3JlYXRlRWxlbWVudChLMyx7c2NvcGU6bixkaXNhYmxlZDpyLGRpcmVjdGlvbjpvLG9yaWVudGF0aW9uOml9LHEuY3JlYXRlRWxlbWVudChNbS5TbG90LHtzY29wZTpufSxxLmNyZWF0ZUVsZW1lbnQoRGUuZGl2LGVlKHt9LGwseyJkYXRhLW9yaWVudGF0aW9uIjppLHJlZjphLG9uS2V5RG93bjpyP3ZvaWQgMDpmfSkpKSl9KSxicD0iQWNjb3JkaW9uSXRlbSIsW0czLExtXT1PZChicCksWTM9cS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZUFjY29yZGlvbjpuLHZhbHVlOnIsLi4ub309ZSxpPUFkKGJwLG4pLGw9VzMoYnAsbikscz1EbShuKSxhPXdkKCksdT1yJiZsLnZhbHVlLmluY2x1ZGVzKHIpfHwhMSxjPWkuZGlzYWJsZWR8fGUuZGlzYWJsZWQ7cmV0dXJuIHEuY3JlYXRlRWxlbWVudChHMyx7c2NvcGU6bixvcGVuOnUsZGlzYWJsZWQ6Yyx0cmlnZ2VySWQ6YX0scS5jcmVhdGVFbGVtZW50KEwzLGVlKHsiZGF0YS1vcmllbnRhdGlvbiI6aS5vcmllbnRhdGlvbiwiZGF0YS1zdGF0ZSI6cEUodSl9LHMsbyx7cmVmOnQsZGlzYWJsZWQ6YyxvcGVuOnUsb25PcGVuQ2hhbmdlOmQ9PntkP2wub25JdGVtT3BlbihyKTpsLm9uSXRlbUNsb3NlKHIpfX0pKSl9KSxYMz0iQWNjb3JkaW9uSGVhZGVyIixRMz1xLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sLi4ucn09ZSxvPUFkKEJvLG4pLGk9TG0oWDMsbik7cmV0dXJuIHEuY3JlYXRlRWxlbWVudChEZS5oMyxlZSh7ImRhdGEtb3JpZW50YXRpb24iOm8ub3JpZW50YXRpb24sImRhdGEtc3RhdGUiOnBFKGkub3BlbiksImRhdGEtZGlzYWJsZWQiOmkuZGlzYWJsZWQ/IiI6dm9pZCAwfSxyLHtyZWY6dH0pKX0pLFUwPSJBY2NvcmRpb25UcmlnZ2VyIixKMz1xLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sLi4ucn09ZSxvPUFkKEJvLG4pLGk9TG0oVTAsbiksbD1VMyhVMCxuKSxzPURtKG4pO3JldHVybiBxLmNyZWF0ZUVsZW1lbnQoTW0uSXRlbVNsb3Qse3Njb3BlOm59LHEuY3JlYXRlRWxlbWVudChJMyxlZSh7ImFyaWEtZGlzYWJsZWQiOmkub3BlbiYmIWwuY29sbGFwc2libGV8fHZvaWQgMCwiZGF0YS1vcmllbnRhdGlvbiI6by5vcmllbnRhdGlvbixpZDppLnRyaWdnZXJJZH0scyxyLHtyZWY6dH0pKSl9KSxaMz0iQWNjb3JkaW9uQ29udGVudCIscTM9cS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZUFjY29yZGlvbjpuLC4uLnJ9PWUsbz1BZChCbyxuKSxpPUxtKFozLG4pLGw9RG0obik7cmV0dXJuIHEuY3JlYXRlRWxlbWVudChqMyxlZSh7cm9sZToicmVnaW9uIiwiYXJpYS1sYWJlbGxlZGJ5IjppLnRyaWdnZXJJZCwiZGF0YS1vcmllbnRhdGlvbiI6by5vcmllbnRhdGlvbn0sbCxyLHtyZWY6dCxzdHlsZTp7Ii0tcmFkaXgtYWNjb3JkaW9uLWNvbnRlbnQtaGVpZ2h0IjoidmFyKC0tcmFkaXgtY29sbGFwc2libGUtY29udGVudC1oZWlnaHQpIiwiLS1yYWRpeC1hY2NvcmRpb24tY29udGVudC13aWR0aCI6InZhcigtLXJhZGl4LWNvbGxhcHNpYmxlLWNvbnRlbnQtd2lkdGgpIiwuLi5lLnN0eWxlfX0pKX0pO2Z1bmN0aW9uIHBFKGUpe3JldHVybiBlPyJvcGVuIjoiY2xvc2VkIn1jb25zdCBlND1jRSx0ND1ZMyxuND1RMyxnRT1KMyxtRT1xMyxyND1lNCx2RT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+eC5qc3godDQse3JlZjpuLGNsYXNzTmFtZTpvdCgiYm9yZGVyLWIiLGUpLC4uLnR9KSk7dkUuZGlzcGxheU5hbWU9IkFjY29yZGlvbkl0ZW0iO2NvbnN0IHlFPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLGNoaWxkcmVuOnQsLi4ubn0scik9PnguanN4KG40LHtjbGFzc05hbWU6ImZsZXgiLGNoaWxkcmVuOnguanN4cyhnRSx7cmVmOnIsY2xhc3NOYW1lOm90KCJmbGV4IGZsZXgtMSBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB5LTQgZm9udC1tZWRpdW0gdHJhbnNpdGlvbi1hbGwgaG92ZXI6dW5kZXJsaW5lIFsmW2RhdGEtc3RhdGU9b3Blbl0+c3ZnXTpyb3RhdGUtMTgwIixlKSwuLi5uLGNoaWxkcmVuOlt0LHguanN4KERTLHtjbGFzc05hbWU6InctNCBoLTQgdHJhbnNpdGlvbi10cmFuc2Zvcm0gZHVyYXRpb24tMjAwIHNocmluay0wIn0pXX0pfSkpO3lFLmRpc3BsYXlOYW1lPWdFLmRpc3BsYXlOYW1lO2NvbnN0IHhFPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLGNoaWxkcmVuOnQsLi4ubn0scik9PnguanN4KG1FLHtyZWY6cixjbGFzc05hbWU6b3QoIm92ZXJmbG93LWhpZGRlbiB0ZXh0LXNtIHRyYW5zaXRpb24tYWxsIGRhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1hY2NvcmRpb24tdXAgZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1hY2NvcmRpb24tZG93biIsZSksLi4ubixjaGlsZHJlbjp4LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwdC0wIHBiLTQiLGNoaWxkcmVuOnR9KX0pKTt4RS5kaXNwbGF5TmFtZT1tRS5kaXNwbGF5TmFtZTsvKioKICogUmVhY3QgUm91dGVyIERPTSB2Ni4xOC4wCiAqCiAqIENvcHlyaWdodCAoYykgUmVtaXggU29mdHdhcmUgSW5jLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRS5tZCBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKgogKiBAbGljZW5zZSBNSVQKICovZnVuY3Rpb24gQmMoKXtyZXR1cm4gQmM9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSxCYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gbzQoZSx0KXtyZXR1cm4gRk0oe2Jhc2VuYW1lOnQ9PW51bGw/dm9pZCAwOnQuYmFzZW5hbWUsZnV0dXJlOkJjKHt9LHQ9PW51bGw/dm9pZCAwOnQuZnV0dXJlLHt2N19wcmVwZW5kQmFzZW5hbWU6ITB9KSxoaXN0b3J5OmFNKHt3aW5kb3c6dD09bnVsbD92b2lkIDA6dC53aW5kb3d9KSxoeWRyYXRpb25EYXRhOih0PT1udWxsP3ZvaWQgMDp0Lmh5ZHJhdGlvbkRhdGEpfHxpNCgpLHJvdXRlczplLG1hcFJvdXRlUHJvcGVydGllczpoMyx3aW5kb3c6dD09bnVsbD92b2lkIDA6dC53aW5kb3d9KS5pbml0aWFsaXplKCl9ZnVuY3Rpb24gaTQoKXt2YXIgZTtsZXQgdD0oZT13aW5kb3cpPT1udWxsP3ZvaWQgMDplLl9fc3RhdGljUm91dGVySHlkcmF0aW9uRGF0YTtyZXR1cm4gdCYmdC5lcnJvcnMmJih0PUJjKHt9LHQse2Vycm9yczpsNCh0LmVycm9ycyl9KSksdH1mdW5jdGlvbiBsNChlKXtpZighZSlyZXR1cm4gbnVsbDtsZXQgdD1PYmplY3QuZW50cmllcyhlKSxuPXt9O2ZvcihsZXRbcixvXW9mIHQpaWYobyYmby5fX3R5cGU9PT0iUm91dGVFcnJvclJlc3BvbnNlIiluW3JdPW5ldyBObShvLnN0YXR1cyxvLnN0YXR1c1RleHQsby5kYXRhLG8uaW50ZXJuYWw9PT0hMCk7ZWxzZSBpZihvJiZvLl9fdHlwZT09PSJFcnJvciIpe2lmKG8uX19zdWJUeXBlKXtsZXQgaT13aW5kb3dbby5fX3N1YlR5cGVdO2lmKHR5cGVvZiBpPT0iZnVuY3Rpb24iKXRyeXtsZXQgbD1uZXcgaShvLm1lc3NhZ2UpO2wuc3RhY2s9IiIsbltyXT1sfWNhdGNoe319aWYobltyXT09bnVsbCl7bGV0IGk9bmV3IEVycm9yKG8ubWVzc2FnZSk7aS5zdGFjaz0iIixuW3JdPWl9fWVsc2UgbltyXT1vO3JldHVybiBufWNvbnN0IHM0PXAuY3JlYXRlQ29udGV4dCh7aXNUcmFuc2l0aW9uaW5nOiExfSksYTQ9cC5jcmVhdGVDb250ZXh0KG5ldyBNYXApLHU0PSJzdGFydFRyYW5zaXRpb24iLFYwPXQxW3U0XTtmdW5jdGlvbiBjNChlKXtWMD9WMChlKTplKCl9Y2xhc3MgZDR7Y29uc3RydWN0b3IoKXt0aGlzLnN0YXR1cz0icGVuZGluZyIsdGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKCh0LG4pPT57dGhpcy5yZXNvbHZlPXI9Pnt0aGlzLnN0YXR1cz09PSJwZW5kaW5nIiYmKHRoaXMuc3RhdHVzPSJyZXNvbHZlZCIsdChyKSl9LHRoaXMucmVqZWN0PXI9Pnt0aGlzLnN0YXR1cz09PSJwZW5kaW5nIiYmKHRoaXMuc3RhdHVzPSJyZWplY3RlZCIsbihyKSl9fSl9fWZ1bmN0aW9uIGY0KGUpe2xldHtmYWxsYmFja0VsZW1lbnQ6dCxyb3V0ZXI6bixmdXR1cmU6cn09ZSxbbyxpXT1wLnVzZVN0YXRlKG4uc3RhdGUpLFtsLHNdPXAudXNlU3RhdGUoKSxbYSx1XT1wLnVzZVN0YXRlKHtpc1RyYW5zaXRpb25pbmc6ITF9KSxbYyxkXT1wLnVzZVN0YXRlKCksW2YsaF09cC51c2VTdGF0ZSgpLFtnLG1dPXAudXNlU3RhdGUoKSxTPXAudXNlUmVmKG5ldyBNYXApLHt2N19zdGFydFRyYW5zaXRpb246dn09cnx8e30seT1wLnVzZUNhbGxiYWNrKEU9Pnt2P2M0KEUpOkUoKX0sW3ZdKSxfPXAudXNlQ2FsbGJhY2soKEUsVCk9PntsZXR7ZGVsZXRlZEZldGNoZXJzOk0sdW5zdGFibGVfdmlld1RyYW5zaXRpb25PcHRzOlJ9PVQ7TS5mb3JFYWNoKGo9PlMuY3VycmVudC5kZWxldGUoaikpLEUuZmV0Y2hlcnMuZm9yRWFjaCgoaixGKT0+e2ouZGF0YSE9PXZvaWQgMCYmUy5jdXJyZW50LnNldChGLGouZGF0YSl9KSwhUnx8bi53aW5kb3c9PW51bGx8fHR5cGVvZiBuLndpbmRvdy5kb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uIT0iZnVuY3Rpb24iP3koKCk9PmkoRSkpOmYmJmM/KGMucmVzb2x2ZSgpLGYuc2tpcFRyYW5zaXRpb24oKSxtKHtzdGF0ZTpFLGN1cnJlbnRMb2NhdGlvbjpSLmN1cnJlbnRMb2NhdGlvbixuZXh0TG9jYXRpb246Ui5uZXh0TG9jYXRpb259KSk6KHMoRSksdSh7aXNUcmFuc2l0aW9uaW5nOiEwLGN1cnJlbnRMb2NhdGlvbjpSLmN1cnJlbnRMb2NhdGlvbixuZXh0TG9jYXRpb246Ui5uZXh0TG9jYXRpb259KSl9LFtuLndpbmRvdyxmLGMsUyx5XSk7cC51c2VMYXlvdXRFZmZlY3QoKCk9Pm4uc3Vic2NyaWJlKF8pLFtuLF9dKSxwLnVzZUVmZmVjdCgoKT0+e2EuaXNUcmFuc2l0aW9uaW5nJiZkKG5ldyBkNCl9LFthLmlzVHJhbnNpdGlvbmluZ10pLHAudXNlRWZmZWN0KCgpPT57aWYoYyYmbCYmbi53aW5kb3cpe2xldCBFPWwsVD1jLnByb21pc2UsTT1uLndpbmRvdy5kb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGFzeW5jKCk9Pnt5KCgpPT5pKEUpKSxhd2FpdCBUfSk7TS5maW5pc2hlZC5maW5hbGx5KCgpPT57ZCh2b2lkIDApLGgodm9pZCAwKSxzKHZvaWQgMCksdSh7aXNUcmFuc2l0aW9uaW5nOiExfSl9KSxoKE0pfX0sW3ksbCxjLG4ud2luZG93XSkscC51c2VFZmZlY3QoKCk9PntjJiZsJiZvLmxvY2F0aW9uLmtleT09PWwubG9jYXRpb24ua2V5JiZjLnJlc29sdmUoKX0sW2MsZixvLmxvY2F0aW9uLGxdKSxwLnVzZUVmZmVjdCgoKT0+eyFhLmlzVHJhbnNpdGlvbmluZyYmZyYmKHMoZy5zdGF0ZSksdSh7aXNUcmFuc2l0aW9uaW5nOiEwLGN1cnJlbnRMb2NhdGlvbjpnLmN1cnJlbnRMb2NhdGlvbixuZXh0TG9jYXRpb246Zy5uZXh0TG9jYXRpb259KSxtKHZvaWQgMCkpfSxbYS5pc1RyYW5zaXRpb25pbmcsZ10pO2xldCB3PXAudXNlTWVtbygoKT0+KHtjcmVhdGVIcmVmOm4uY3JlYXRlSHJlZixlbmNvZGVMb2NhdGlvbjpuLmVuY29kZUxvY2F0aW9uLGdvOkU9Pm4ubmF2aWdhdGUoRSkscHVzaDooRSxULE0pPT5uLm5hdmlnYXRlKEUse3N0YXRlOlQscHJldmVudFNjcm9sbFJlc2V0Ok09PW51bGw/dm9pZCAwOk0ucHJldmVudFNjcm9sbFJlc2V0fSkscmVwbGFjZTooRSxULE0pPT5uLm5hdmlnYXRlKEUse3JlcGxhY2U6ITAsc3RhdGU6VCxwcmV2ZW50U2Nyb2xsUmVzZXQ6TT09bnVsbD92b2lkIDA6TS5wcmV2ZW50U2Nyb2xsUmVzZXR9KX0pLFtuXSksQz1uLmJhc2VuYW1lfHwiLyIsJD1wLnVzZU1lbW8oKCk9Pih7cm91dGVyOm4sbmF2aWdhdG9yOncsc3RhdGljOiExLGJhc2VuYW1lOkN9KSxbbix3LENdKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxwLmNyZWF0ZUVsZW1lbnQoTmQuUHJvdmlkZXIse3ZhbHVlOiR9LHAuY3JlYXRlRWxlbWVudChYQy5Qcm92aWRlcix7dmFsdWU6b30scC5jcmVhdGVFbGVtZW50KGE0LlByb3ZpZGVyLHt2YWx1ZTpTLmN1cnJlbnR9LHAuY3JlYXRlRWxlbWVudChzNC5Qcm92aWRlcix7dmFsdWU6YX0scC5jcmVhdGVFbGVtZW50KGYzLHtiYXNlbmFtZTpDLGxvY2F0aW9uOm8ubG9jYXRpb24sbmF2aWdhdGlvblR5cGU6by5oaXN0b3J5QWN0aW9uLG5hdmlnYXRvcjp3fSxvLmluaXRpYWxpemVkP3AuY3JlYXRlRWxlbWVudChoNCx7cm91dGVzOm4ucm91dGVzLHN0YXRlOm99KTp0KSkpKSksbnVsbCl9ZnVuY3Rpb24gaDQoZSl7bGV0e3JvdXRlczp0LHN0YXRlOm59PWU7cmV0dXJuIHQzKHQsdm9pZCAwLG4pfXZhciBIMDsoZnVuY3Rpb24oZSl7ZS5Vc2VTY3JvbGxSZXN0b3JhdGlvbj0idXNlU2Nyb2xsUmVzdG9yYXRpb24iLGUuVXNlU3VibWl0PSJ1c2VTdWJtaXQiLGUuVXNlU3VibWl0RmV0Y2hlcj0idXNlU3VibWl0RmV0Y2hlciIsZS5Vc2VGZXRjaGVyPSJ1c2VGZXRjaGVyIixlLnVzZVZpZXdUcmFuc2l0aW9uU3RhdGU9InVzZVZpZXdUcmFuc2l0aW9uU3RhdGUifSkoSDB8fChIMD17fSkpO3ZhciBLMDsoZnVuY3Rpb24oZSl7ZS5Vc2VGZXRjaGVyPSJ1c2VGZXRjaGVyIixlLlVzZUZldGNoZXJzPSJ1c2VGZXRjaGVycyIsZS5Vc2VTY3JvbGxSZXN0b3JhdGlvbj0idXNlU2Nyb2xsUmVzdG9yYXRpb24ifSkoSzB8fChLMD17fSkpO2Z1bmN0aW9uIHA0KHtlcnJvcjplLHJlc2V0RXJyb3JCb3VuZGFyeTp0fSl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoZSkseC5qc3goImRpdiIse2NsYXNzTmFtZToiYWJzb2x1dGUgdG9wLTAgbGVmdC0wIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctc2NyZWVuIGgtc2NyZWVuIGJnLWNhcmQtZm9yZWdyb3VuZCIsY2hpbGRyZW46eC5qc3goImRpdiIse2NsYXNzTmFtZToidy1mdWxsIGgtZnVsbCBwLTEwIixjaGlsZHJlbjp4LmpzeHMoImRpdiIse2NsYXNzTmFtZToidy1mdWxsIGgtZnVsbCBwLTEwIGJnLWNhcmQgdGV4dC1wcmltYXJ5IixjaGlsZHJlbjpbeC5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiIsY2hpbGRyZW46W3guanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtWzAuNWVtXSB0ZXh0LWxnIGZvbnQtYm9sZCB0ZXh0LWNlbnRlciBweS0yIixjaGlsZHJlbjpbeC5qc3goREMse30pLCIgZW5jb3VudGVyZWQgYW4gZXJyb3IiXX0pLHguanN4KCJidXR0b24iLHtvbkNsaWNrOnQsY2hpbGRyZW46eC5qc3goUlAse30pfSldfSkseC5qc3goImRpdiIse2NsYXNzTmFtZToidGV4dC00eGwgZm9udC1ub3JtYWwgIixjaGlsZHJlbjoiTWVzc2FnZToifSkseC5qc3goInByZSIse2NoaWxkcmVuOmUubWVzc2FnZX0pLGUuc3RhY2smJnguanN4KHI0LHt0eXBlOiJzaW5nbGUiLGNsYXNzTmFtZToiZm9udC1zZXJpZiIsY29sbGFwc2libGU6ITAsZGVmYXVsdFZhbHVlOiJlcnJvciIsY2hpbGRyZW46eC5qc3hzKHZFLHt2YWx1ZToiZXJyb3IiLGNoaWxkcmVuOlt4LmpzeCh5RSx7Y2hpbGRyZW46IlN0YWNrIHRyYWNlOiJ9KSx4LmpzeCh4RSx7Y2xhc3NOYW1lOiJwLTQgYmctcG9wb3ZlciB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCIsY2hpbGRyZW46ZS5zdGFjayYmeC5qc3goInByZSIse2NoaWxkcmVuOmUuc3RhY2t9KX0pXX0pfSldfSl9KX0pfWZ1bmN0aW9uIGc0KCl7Y29uc3QgZT1vNChbe3BhdGg6Ii8qIixlbGVtZW50OnguanN4KFQzLHtmYWxsYmFja1JlbmRlcjpwNCxjaGlsZHJlbjp4LmpzeChnMyx7dmFsQXBpOm5ldyBVVCgiL2FwaS92YWwiKX0pfSl9XSx7YmFzZW5hbWU6Ii9hcGkvdmFsL3N0YXRpYy9lZGl0In0pO3JldHVybiB4LmpzeChmNCx7cm91dGVyOmV9KX1EZi5jcmVhdGVSb290KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyb290IikpLnJlbmRlcihxLmNyZWF0ZUVsZW1lbnQocS5TdHJpY3RNb2RlLG51bGwscS5jcmVhdGVFbGVtZW50KGc0LG51bGwpKSk7Cg==","/index.html":"PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+CiAgICA8dGl0bGU+VmFsPC90aXRsZT4KICAgIAogICAgPHNjcmlwdCB0eXBlPSJtb2R1bGUiIGNyb3Nzb3JpZ2luIHNyYz0iL2FwaS92YWwvc3RhdGljL2Fzc2V0cy9pbmRleC05NjE2ZjhjMi5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9hcGkvdmFsL3N0YXRpYy9hc3NldHMvaW5kZXgtOGU2MWUzMjQuY3NzIj4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJyb290Ij48L2Rpdj4KICA8L2JvZHk+CjwvaHRtbD4K"}`
|
|
4
|
+
`{"/assets/index-8e61e324.css":"Kiw6YmVmb3JlLDphZnRlcntib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym9yZGVyLXdpZHRoOjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjojZTVlN2VifTpiZWZvcmUsOmFmdGVyey0tdHctY29udGVudDogIiJ9aHRtbHtsaW5lLWhlaWdodDoxLjU7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OjEwMCU7LW1vei10YWItc2l6ZTo0Oy1vLXRhYi1zaXplOjQ7dGFiLXNpemU6NDtmb250LWZhbWlseTpSb2JvdG8sc2Fucy1zZXJpZjtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOm5vcm1hbH1ib2R5e21hcmdpbjowO2xpbmUtaGVpZ2h0OmluaGVyaXR9aHJ7aGVpZ2h0OjA7Y29sb3I6aW5oZXJpdDtib3JkZXItdG9wLXdpZHRoOjFweH1hYmJyOndoZXJlKFt0aXRsZV0pey13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWR9aDEsaDIsaDMsaDQsaDUsaDZ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6aW5oZXJpdH1he2NvbG9yOmluaGVyaXQ7dGV4dC1kZWNvcmF0aW9uOmluaGVyaXR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6Ym9sZGVyfWNvZGUsa2JkLHNhbXAscHJle2ZvbnQtZmFtaWx5OnVpLW1vbm9zcGFjZSxTRk1vbm8tUmVndWxhcixNZW5sbyxNb25hY28sQ29uc29sYXMsTGliZXJhdGlvbiBNb25vLENvdXJpZXIgTmV3LG1vbm9zcGFjZTtmb250LXNpemU6MWVtfXNtYWxse2ZvbnQtc2l6ZTo4MCV9c3ViLHN1cHtmb250LXNpemU6NzUlO2xpbmUtaGVpZ2h0OjA7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9c3Vie2JvdHRvbTotLjI1ZW19c3Vwe3RvcDotLjVlbX10YWJsZXt0ZXh0LWluZGVudDowO2JvcmRlci1jb2xvcjppbmhlcml0O2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX1idXR0b24saW5wdXQsb3B0Z3JvdXAsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOjEwMCU7Zm9udC13ZWlnaHQ6aW5oZXJpdDtsaW5lLWhlaWdodDppbmhlcml0O2NvbG9yOmluaGVyaXQ7bWFyZ2luOjA7cGFkZGluZzowfWJ1dHRvbixzZWxlY3R7dGV4dC10cmFuc2Zvcm06bm9uZX1idXR0b24sW3R5cGU9YnV0dG9uXSxbdHlwZT1yZXNldF0sW3R5cGU9c3VibWl0XXstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7YmFja2dyb3VuZC1pbWFnZTpub25lfTotbW96LWZvY3VzcmluZ3tvdXRsaW5lOmF1dG99Oi1tb3otdWktaW52YWxpZHtib3gtc2hhZG93Om5vbmV9cHJvZ3Jlc3N7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9Ojotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLDo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbntoZWlnaHQ6YXV0b31bdHlwZT1zZWFyY2hdey13ZWJraXQtYXBwZWFyYW5jZTp0ZXh0ZmllbGQ7b3V0bGluZS1vZmZzZXQ6LTJweH06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Ojotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO2ZvbnQ6aW5oZXJpdH1zdW1tYXJ5e2Rpc3BsYXk6bGlzdC1pdGVtfWJsb2NrcXVvdGUsZGwsZGQsaDEsaDIsaDMsaDQsaDUsaDYsaHIsZmlndXJlLHAscHJle21hcmdpbjowfWZpZWxkc2V0e21hcmdpbjowO3BhZGRpbmc6MH1sZWdlbmR7cGFkZGluZzowfW9sLHVsLG1lbnV7bGlzdC1zdHlsZTpub25lO21hcmdpbjowO3BhZGRpbmc6MH10ZXh0YXJlYXtyZXNpemU6dmVydGljYWx9aW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXIsdGV4dGFyZWE6Oi1tb3otcGxhY2Vob2xkZXJ7b3BhY2l0eToxO2NvbG9yOiM5Y2EzYWZ9aW5wdXQ6OnBsYWNlaG9sZGVyLHRleHRhcmVhOjpwbGFjZWhvbGRlcntvcGFjaXR5OjE7Y29sb3I6IzljYTNhZn1idXR0b24sW3JvbGU9YnV0dG9uXXtjdXJzb3I6cG9pbnRlcn06ZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHR9aW1nLHN2Zyx2aWRlbyxjYW52YXMsYXVkaW8saWZyYW1lLGVtYmVkLG9iamVjdHtkaXNwbGF5OmJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX1pbWcsdmlkZW97bWF4LXdpZHRoOjEwMCU7aGVpZ2h0OmF1dG99W2hpZGRlbl17ZGlzcGxheTpub25lfTpob3N0ey0tYmFja2dyb3VuZDogMCAwJSAxMDAlOy0tZm9yZWdyb3VuZDogMjIyLjIgODQlIDQuOSU7LS1jYXJkOiAwIDAlIDEwMCU7LS1jYXJkLWZvcmVncm91bmQ6IDIyMi4yIDg0JSA0LjklOy0tcG9wb3ZlcjogMCAwJSAxMDAlOy0tcG9wb3Zlci1mb3JlZ3JvdW5kOiAyMjIuMiA4NCUgNC45JTstLXByaW1hcnk6IDIyMi4yIDQ3LjQlIDExLjIlOy0tcHJpbWFyeS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLXNlY29uZGFyeTogMjEwIDQwJSA5Ni4xJTstLXNlY29uZGFyeS1mb3JlZ3JvdW5kOiAyMjIuMiA0Ny40JSAxMS4yJTstLW11dGVkOiAwIDAlIDU3LjMlOy0tbXV0ZWQtZm9yZWdyb3VuZDogMjE1LjQgMTYuMyUgNDYuOSU7LS1hY2NlbnQ6IDE1OSwgNjAlLCA1MSUsIDE7LS1hY2NlbnQtZm9yZWdyb3VuZDogMjIyLjIgNDcuNCUgMTEuMiU7LS1kZXN0cnVjdGl2ZTogMCA4NC4yJSA2MC4yJTstLWRlc3RydWN0aXZlLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tYm9yZGVyOiAyMTQuMyAzMS44JSA5MS40JTstLWlucHV0OiAyMTQuMyAzMS44JSA5MS40JTstLXJpbmc6IDIyMi4yIDg0JSA0LjklOy0tcmFkaXVzOiAuNXJlbX06cm9vdHstLWJhY2tncm91bmQ6IDAgMCUgMTAwJTstLWZvcmVncm91bmQ6IDIyMi4yIDg0JSA0LjklOy0tY2FyZDogMCAwJSAxMDAlOy0tY2FyZC1mb3JlZ3JvdW5kOiAyMjIuMiA4NCUgNC45JTstLXBvcG92ZXI6IDAgMCUgMTAwJTstLXBvcG92ZXItZm9yZWdyb3VuZDogMjIyLjIgODQlIDQuOSU7LS1wcmltYXJ5OiAyMjIuMiA0Ny40JSAxMS4yJTstLXByaW1hcnktZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1zZWNvbmRhcnk6IDIxMCA0MCUgOTYuMSU7LS1zZWNvbmRhcnktZm9yZWdyb3VuZDogMjIyLjIgNDcuNCUgMTEuMiU7LS1tdXRlZDogMCAwJSA1Ny4zJTstLW11dGVkLWZvcmVncm91bmQ6IDIxNS40IDE2LjMlIDQ2LjklOy0tYWNjZW50OiAxNTksIDYwJSwgNTElLCAxOy0tYWNjZW50LWZvcmVncm91bmQ6IDIyMi4yIDQ3LjQlIDExLjIlOy0tZGVzdHJ1Y3RpdmU6IDAgODQuMiUgNjAuMiU7LS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLWJvcmRlcjogMjE0LjMgMzEuOCUgOTEuNCU7LS1pbnB1dDogMjE0LjMgMzEuOCUgOTEuNCU7LS1yaW5nOiAyMjIuMiA4NCUgNC45JTstLXJhZGl1czogLjVyZW19KltkYXRhLW1vZGU9ZGFya117LS1iYWNrZ3JvdW5kOiAwIDAlIDQlOy0tZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1jYXJkOiAyMjIuMiA4NCUgNC45JTstLWNhcmQtZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1wb3BvdmVyOiAyMjIuMiA4NCUgNC45JTstLXBvcG92ZXItZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1wcmltYXJ5OiAyMTAgNDAlIDk4JTstLXByaW1hcnktZm9yZWdyb3VuZDogMjIyLjIgNDcuNCUgMTEuMiU7LS1zZWNvbmRhcnk6IDIxNy4yIDMyLjYlIDE3LjUlOy0tc2Vjb25kYXJ5LWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tbXV0ZWQ6IDE3OCwgMjMlLCA3NiUsIDE7LS1tdXRlZC1mb3JlZ3JvdW5kOiAyMTUgMjAuMiUgNjUuMSU7LS1hY2NlbnQ6IDE1OSwgNjAlLCA1MSUsIDE7LS1hY2NlbnQtZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1kZXN0cnVjdGl2ZTogMCA2Mi44JSAzMC42JTstLWRlc3RydWN0aXZlLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tYm9yZGVyOiAyMTcuMiAzMi42JSAxNy41JTstLWlucHV0OiAyMTcuMiAzMi42JSAxNy41JTstLXJpbmc6IDIxMi43IDI2LjglIDgzLjklfSp7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1ib3JkZXIpKX1ib2R5e2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKTtjb2xvcjpoc2wodmFyKC0tZm9yZWdyb3VuZCkpfSosOmJlZm9yZSw6YWZ0ZXJ7LS10dy1ib3JkZXItc3BhY2luZy14OiAwOy0tdHctYm9yZGVyLXNwYWNpbmcteTogMDstLXR3LXRyYW5zbGF0ZS14OiAwOy0tdHctdHJhbnNsYXRlLXk6IDA7LS10dy1yb3RhdGU6IDA7LS10dy1za2V3LXg6IDA7LS10dy1za2V3LXk6IDA7LS10dy1zY2FsZS14OiAxOy0tdHctc2NhbGUteTogMTstLXR3LXBhbi14OiA7LS10dy1wYW4teTogOy0tdHctcGluY2gtem9vbTogOy0tdHctc2Nyb2xsLXNuYXAtc3RyaWN0bmVzczogcHJveGltaXR5Oy0tdHctZ3JhZGllbnQtZnJvbS1wb3NpdGlvbjogOy0tdHctZ3JhZGllbnQtdmlhLXBvc2l0aW9uOiA7LS10dy1ncmFkaWVudC10by1wb3NpdGlvbjogOy0tdHctb3JkaW5hbDogOy0tdHctc2xhc2hlZC16ZXJvOiA7LS10dy1udW1lcmljLWZpZ3VyZTogOy0tdHctbnVtZXJpYy1zcGFjaW5nOiA7LS10dy1udW1lcmljLWZyYWN0aW9uOiA7LS10dy1yaW5nLWluc2V0OiA7LS10dy1yaW5nLW9mZnNldC13aWR0aDogMHB4Oy0tdHctcmluZy1vZmZzZXQtY29sb3I6ICNmZmY7LS10dy1yaW5nLWNvbG9yOiByZ2IoNTkgMTMwIDI0NiAvIC41KTstLXR3LXJpbmctb2Zmc2V0LXNoYWRvdzogMCAwICMwMDAwOy0tdHctcmluZy1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXNoYWRvdzogMCAwICMwMDAwOy0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMCAjMDAwMDstLXR3LWJsdXI6IDstLXR3LWJyaWdodG5lc3M6IDstLXR3LWNvbnRyYXN0OiA7LS10dy1ncmF5c2NhbGU6IDstLXR3LWh1ZS1yb3RhdGU6IDstLXR3LWludmVydDogOy0tdHctc2F0dXJhdGU6IDstLXR3LXNlcGlhOiA7LS10dy1kcm9wLXNoYWRvdzogOy0tdHctYmFja2Ryb3AtYmx1cjogOy0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzczogOy0tdHctYmFja2Ryb3AtY29udHJhc3Q6IDstLXR3LWJhY2tkcm9wLWdyYXlzY2FsZTogOy0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZTogOy0tdHctYmFja2Ryb3AtaW52ZXJ0OiA7LS10dy1iYWNrZHJvcC1vcGFjaXR5OiA7LS10dy1iYWNrZHJvcC1zYXR1cmF0ZTogOy0tdHctYmFja2Ryb3Atc2VwaWE6IH06OmJhY2tkcm9wey0tdHctYm9yZGVyLXNwYWNpbmcteDogMDstLXR3LWJvcmRlci1zcGFjaW5nLXk6IDA7LS10dy10cmFuc2xhdGUteDogMDstLXR3LXRyYW5zbGF0ZS15OiAwOy0tdHctcm90YXRlOiAwOy0tdHctc2tldy14OiAwOy0tdHctc2tldy15OiAwOy0tdHctc2NhbGUteDogMTstLXR3LXNjYWxlLXk6IDE7LS10dy1wYW4teDogOy0tdHctcGFuLXk6IDstLXR3LXBpbmNoLXpvb206IDstLXR3LXNjcm9sbC1zbmFwLXN0cmljdG5lc3M6IHByb3hpbWl0eTstLXR3LWdyYWRpZW50LWZyb20tcG9zaXRpb246IDstLXR3LWdyYWRpZW50LXZpYS1wb3NpdGlvbjogOy0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb246IDstLXR3LW9yZGluYWw6IDstLXR3LXNsYXNoZWQtemVybzogOy0tdHctbnVtZXJpYy1maWd1cmU6IDstLXR3LW51bWVyaWMtc3BhY2luZzogOy0tdHctbnVtZXJpYy1mcmFjdGlvbjogOy0tdHctcmluZy1pbnNldDogOy0tdHctcmluZy1vZmZzZXQtd2lkdGg6IDBweDstLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiAjZmZmOy0tdHctcmluZy1jb2xvcjogcmdiKDU5IDEzMCAyNDYgLyAuNSk7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXJpbmctc2hhZG93OiAwIDAgIzAwMDA7LS10dy1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7LS10dy1ibHVyOiA7LS10dy1icmlnaHRuZXNzOiA7LS10dy1jb250cmFzdDogOy0tdHctZ3JheXNjYWxlOiA7LS10dy1odWUtcm90YXRlOiA7LS10dy1pbnZlcnQ6IDstLXR3LXNhdHVyYXRlOiA7LS10dy1zZXBpYTogOy0tdHctZHJvcC1zaGFkb3c6IDstLXR3LWJhY2tkcm9wLWJsdXI6IDstLXR3LWJhY2tkcm9wLWJyaWdodG5lc3M6IDstLXR3LWJhY2tkcm9wLWNvbnRyYXN0OiA7LS10dy1iYWNrZHJvcC1ncmF5c2NhbGU6IDstLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGU6IDstLXR3LWJhY2tkcm9wLWludmVydDogOy0tdHctYmFja2Ryb3Atb3BhY2l0eTogOy0tdHctYmFja2Ryb3Atc2F0dXJhdGU6IDstLXR3LWJhY2tkcm9wLXNlcGlhOiB9LnNyLW9ubHl7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O2hlaWdodDoxcHg7cGFkZGluZzowO21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtjbGlwOnJlY3QoMCwwLDAsMCk7d2hpdGUtc3BhY2U6bm93cmFwO2JvcmRlci13aWR0aDowfS5wb2ludGVyLWV2ZW50cy1ub25le3BvaW50ZXItZXZlbnRzOm5vbmV9LmludmlzaWJsZXt2aXNpYmlsaXR5OmhpZGRlbn0uc3RhdGlje3Bvc2l0aW9uOnN0YXRpY30uZml4ZWR7cG9zaXRpb246Zml4ZWR9LmFic29sdXRle3Bvc2l0aW9uOmFic29sdXRlfS5yZWxhdGl2ZXtwb3NpdGlvbjpyZWxhdGl2ZX0uc3RpY2t5e3Bvc2l0aW9uOnN0aWNreX0uaW5zZXQtMHt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MH0uaW5zZXQteS0we3RvcDowO2JvdHRvbTowfS4tbGVmdC0ye2xlZnQ6LS41cmVtfS4tcmlnaHQtXFsxMHB4XF17cmlnaHQ6LTEwcHh9Li10b3AtXFsxMHB4XF17dG9wOi0xMHB4fS4tdG9wLVxbNHB4XF17dG9wOi00cHh9LmJvdHRvbS0we2JvdHRvbTowfS5ib3R0b20tNHtib3R0b206MXJlbX0ubGVmdC0we2xlZnQ6MH0ubGVmdC0xe2xlZnQ6LjI1cmVtfS5sZWZ0LTFcLzJ7bGVmdDo1MCV9LmxlZnQtMntsZWZ0Oi41cmVtfS5sZWZ0LVxbNTBcJVxde2xlZnQ6NTAlfS5yaWdodC0we3JpZ2h0OjB9LnJpZ2h0LTF7cmlnaHQ6LjI1cmVtfS5yaWdodC00e3JpZ2h0OjFyZW19LnJpZ2h0LVxbMTZweFxde3JpZ2h0OjE2cHh9LnRvcC0we3RvcDowfS50b3AtNHt0b3A6MXJlbX0udG9wLVxbNTBcJVxde3RvcDo1MCV9LnotNTB7ei1pbmRleDo1MH0uei1cWzVcXXt6LWluZGV4OjV9Lnotb3ZlcmxheXt6LWluZGV4OjR9Li1teC0xe21hcmdpbi1sZWZ0Oi0uMjVyZW07bWFyZ2luLXJpZ2h0Oi0uMjVyZW19Li1teS0ye21hcmdpbi10b3A6LS41cmVtO21hcmdpbi1ib3R0b206LS41cmVtfS4tbXktXFsxMDBweFxde21hcmdpbi10b3A6LTEwMHB4O21hcmdpbi1ib3R0b206LTEwMHB4fS5teC0ye21hcmdpbi1sZWZ0Oi41cmVtO21hcmdpbi1yaWdodDouNXJlbX0ubXktMXttYXJnaW4tdG9wOi4yNXJlbTttYXJnaW4tYm90dG9tOi4yNXJlbX0ubWItNHttYXJnaW4tYm90dG9tOjFyZW19Lm1sLTJ7bWFyZ2luLWxlZnQ6LjVyZW19Lm1sLTR7bWFyZ2luLWxlZnQ6MXJlbX0ubWwtXFsyMHB4XF17bWFyZ2luLWxlZnQ6MjBweH0ubWwtYXV0b3ttYXJnaW4tbGVmdDphdXRvfS5tci0ye21hcmdpbi1yaWdodDouNXJlbX0ubXQtMnttYXJnaW4tdG9wOi41cmVtfS5ibG9ja3tkaXNwbGF5OmJsb2NrfS5pbmxpbmV7ZGlzcGxheTppbmxpbmV9LmZsZXh7ZGlzcGxheTpmbGV4fS5pbmxpbmUtZmxleHtkaXNwbGF5OmlubGluZS1mbGV4fS50YWJsZXtkaXNwbGF5OnRhYmxlfS5ncmlke2Rpc3BsYXk6Z3JpZH0uaGlkZGVue2Rpc3BsYXk6bm9uZX0uYXNwZWN0LXNxdWFyZXthc3BlY3QtcmF0aW86MSAvIDF9LmgtMTB7aGVpZ2h0OjIuNXJlbX0uaC0xMXtoZWlnaHQ6Mi43NXJlbX0uaC0ye2hlaWdodDouNXJlbX0uaC0yXC41e2hlaWdodDouNjI1cmVtfS5oLTN7aGVpZ2h0Oi43NXJlbX0uaC0zXC41e2hlaWdodDouODc1cmVtfS5oLTR7aGVpZ2h0OjFyZW19LmgtN3toZWlnaHQ6MS43NXJlbX0uaC05e2hlaWdodDoyLjI1cmVtfS5oLVxbMTRweFxde2hlaWdodDoxNHB4fS5oLVxbMThweFxde2hlaWdodDoxOHB4fS5oLVxbMXB4XF17aGVpZ2h0OjFweH0uaC1cWzIwcHhcXXtoZWlnaHQ6MjBweH0uaC1cWzIycHhcXXtoZWlnaHQ6MjJweH0uaC1cWzI0cHhcXXtoZWlnaHQ6MjRweH0uaC1cWzMycHhcXXtoZWlnaHQ6MzJweH0uaC1cWzUwcHhcXXtoZWlnaHQ6NTBweH0uaC1cWzc1cHhcXXtoZWlnaHQ6NzVweH0uaC1cWzlweFxde2hlaWdodDo5cHh9LmgtXFt2YXJcKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItaGVpZ2h0XClcXXtoZWlnaHQ6dmFyKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItaGVpZ2h0KX0uaC1mdWxse2hlaWdodDoxMDAlfS5oLXB4e2hlaWdodDoxcHh9Lmgtc2NyZWVue2hlaWdodDoxMDB2aH0ubWF4LWgtXFszMDBweFxde21heC1oZWlnaHQ6MzAwcHh9Lm1pbi1oLVxbMjAwcHhcXXttaW4taGVpZ2h0OjIwMHB4fS5taW4taC1cWzMwMHB4XF17bWluLWhlaWdodDozMDBweH0ubWluLWgtc2NyZWVue21pbi1oZWlnaHQ6MTAwdmh9LnctMVwvM3t3aWR0aDozMy4zMzMzMzMlfS53LTEwe3dpZHRoOjIuNXJlbX0udy0ye3dpZHRoOi41cmVtfS53LTJcLjV7d2lkdGg6LjYyNXJlbX0udy0ze3dpZHRoOi43NXJlbX0udy0zXC41e3dpZHRoOi44NzVyZW19LnctNHt3aWR0aDoxcmVtfS53LTV7d2lkdGg6MS4yNXJlbX0udy03e3dpZHRoOjEuNzVyZW19LnctNzJ7d2lkdGg6MThyZW19LnctOXt3aWR0aDoyLjI1cmVtfS53LVxbMTRweFxde3dpZHRoOjE0cHh9LnctXFsxcHhcXXt3aWR0aDoxcHh9LnctXFsyMHB4XF17d2lkdGg6MjBweH0udy1cWzI0cHhcXXt3aWR0aDoyNHB4fS53LVxbMzJweFxde3dpZHRoOjMycHh9LnctXFs0NHB4XF17d2lkdGg6NDRweH0udy1cWzlweFxde3dpZHRoOjlweH0udy1maXR7d2lkdGg6LW1vei1maXQtY29udGVudDt3aWR0aDpmaXQtY29udGVudH0udy1mdWxse3dpZHRoOjEwMCV9Lnctc2NyZWVue3dpZHRoOjEwMHZ3fS5taW4tdy0we21pbi13aWR0aDowcHh9Lm1pbi13LVxbMzIwcHhcXXttaW4td2lkdGg6MzIwcHh9Lm1pbi13LVxbNTAwcHhcXXttaW4td2lkdGg6NTAwcHh9Lm1pbi13LVxbOHJlbVxde21pbi13aWR0aDo4cmVtfS5taW4tdy1cW3ZhclwoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci13aWR0aFwpXF17bWluLXdpZHRoOnZhcigtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLXdpZHRoKX0ubWF4LXctNHhse21heC13aWR0aDo1NnJlbX0ubWF4LXctXFsxMDAwcHhcXXttYXgtd2lkdGg6MTAwMHB4fS5tYXgtdy1cWzEwdndcXXttYXgtd2lkdGg6MTB2d30ubWF4LXctXFszMDBweFxde21heC13aWR0aDozMDBweH0ubWF4LXctXFs5MHZ3XF17bWF4LXdpZHRoOjkwdnd9Lm1heC13LWxne21heC13aWR0aDozMnJlbX0uZmxleC0xe2ZsZXg6MSAxIDAlfS5mbGV4LWF1dG97ZmxleDoxIDEgYXV0b30uZmxleC1zaHJpbmstMCwuc2hyaW5rLTB7ZmxleC1zaHJpbms6MH0uZmxleC1ncm93e2ZsZXgtZ3JvdzoxfS5ib3JkZXItY29sbGFwc2V7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlfS4tdHJhbnNsYXRlLXgtMVwvMiwudHJhbnNsYXRlLXgtXFstNTBcJVxdey0tdHctdHJhbnNsYXRlLXg6IC01MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LnRyYW5zbGF0ZS15LVxbLTUwXCVcXXstLXR3LXRyYW5zbGF0ZS15OiAtNTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS4tcm90YXRlLTkwey0tdHctcm90YXRlOiAtOTBkZWc7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LnJvdGF0ZS05MHstLXR3LXJvdGF0ZTogOTBkZWc7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LnJvdGF0ZS1cWy05MGRlZ1xdey0tdHctcm90YXRlOiAtOTBkZWc7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LnJvdGF0ZS1cWzkwZGVnXF17LS10dy1yb3RhdGU6IDkwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS50cmFuc2Zvcm17dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmN1cnNvci1jb2wtcmVzaXple2N1cnNvcjpjb2wtcmVzaXplfS5jdXJzb3ItZGVmYXVsdHtjdXJzb3I6ZGVmYXVsdH0uY3Vyc29yLWdyYWJ7Y3Vyc29yOmdyYWJ9LmN1cnNvci1wb2ludGVye2N1cnNvcjpwb2ludGVyfS5jdXJzb3Itc2UtcmVzaXple2N1cnNvcjpzZS1yZXNpemV9LnRvdWNoLW5vbmV7dG91Y2gtYWN0aW9uOm5vbmV9LnNlbGVjdC1ub25ley13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0ucmVzaXplLW5vbmV7cmVzaXplOm5vbmV9LnJlc2l6ZXtyZXNpemU6Ym90aH0ubGlzdC1kZWNpbWFse2xpc3Qtc3R5bGUtdHlwZTpkZWNpbWFsfS5saXN0LWRpc2N7bGlzdC1zdHlsZS10eXBlOmRpc2N9LmdyaWQtY29scy1cW21pbi1jb250ZW50XzFmclxde2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW4tY29udGVudCAxZnJ9LmdyaWQtcm93cy1cWzFmclwsX21pbi1jb250ZW50XF17Z3JpZC10ZW1wbGF0ZS1yb3dzOjFmciBtaW4tY29udGVudH0uZmxleC1yb3d7ZmxleC1kaXJlY3Rpb246cm93fS5mbGV4LWNvbHtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmZsZXgtY29sLXJldmVyc2V7ZmxleC1kaXJlY3Rpb246Y29sdW1uLXJldmVyc2V9Lml0ZW1zLXN0YXJ0e2FsaWduLWl0ZW1zOmZsZXgtc3RhcnR9Lml0ZW1zLWVuZHthbGlnbi1pdGVtczpmbGV4LWVuZH0uaXRlbXMtY2VudGVye2FsaWduLWl0ZW1zOmNlbnRlcn0uanVzdGlmeS1zdGFydHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uanVzdGlmeS1lbmR7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5qdXN0aWZ5LWNlbnRlcntqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5qdXN0aWZ5LWJldHdlZW57anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59LmdhcC0xe2dhcDouMjVyZW19LmdhcC0ye2dhcDouNXJlbX0uZ2FwLTN7Z2FwOi43NXJlbX0uZ2FwLTR7Z2FwOjFyZW19LmdhcC01e2dhcDoxLjI1cmVtfS5nYXAtXFswXC41ZW1cXXtnYXA6LjVlbX0uZ2FwLVxbMzZweFxde2dhcDozNnB4fS5nYXAteC0yey1tb3otY29sdW1uLWdhcDouNXJlbTtjb2x1bW4tZ2FwOi41cmVtfS5nYXAteC0zey1tb3otY29sdW1uLWdhcDouNzVyZW07Y29sdW1uLWdhcDouNzVyZW19LmdhcC14LTR7LW1vei1jb2x1bW4tZ2FwOjFyZW07Y29sdW1uLWdhcDoxcmVtfS5nYXAteS0ye3Jvdy1nYXA6LjVyZW19LmdhcC15LTR7cm93LWdhcDoxcmVtfS5nYXAteS02e3Jvdy1nYXA6MS41cmVtfS5nYXAteS04e3Jvdy1nYXA6MnJlbX0uc3BhY2UteC0xPjpub3QoW2hpZGRlbl0pfjpub3QoW2hpZGRlbl0pey0tdHctc3BhY2UteC1yZXZlcnNlOiAwO21hcmdpbi1yaWdodDpjYWxjKC4yNXJlbSAqIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpO21hcmdpbi1sZWZ0OmNhbGMoLjI1cmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteC1yZXZlcnNlKSkpfS5zcGFjZS15LTE+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS15LXJldmVyc2U6IDA7bWFyZ2luLXRvcDpjYWxjKC4yNXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpKTttYXJnaW4tYm90dG9tOmNhbGMoLjI1cmVtICogdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSl9LnNwYWNlLXktMVwuNT46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoLjM3NXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpKTttYXJnaW4tYm90dG9tOmNhbGMoLjM3NXJlbSAqIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpfS5zcGFjZS15LTI+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS15LXJldmVyc2U6IDA7bWFyZ2luLXRvcDpjYWxjKC41cmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSkpO21hcmdpbi1ib3R0b206Y2FsYyguNXJlbSAqIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpfS5zcGFjZS15LTQ+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS15LXJldmVyc2U6IDA7bWFyZ2luLXRvcDpjYWxjKDFyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKSk7bWFyZ2luLWJvdHRvbTpjYWxjKDFyZW0gKiB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKX0ub3ZlcmZsb3ctYXV0b3tvdmVyZmxvdzphdXRvfS5vdmVyZmxvdy1oaWRkZW57b3ZlcmZsb3c6aGlkZGVufS5vdmVyZmxvdy1jbGlwe292ZXJmbG93OmNsaXB9Lm92ZXJmbG93LXNjcm9sbHtvdmVyZmxvdzpzY3JvbGx9Lm92ZXJmbG93LXktYXV0b3tvdmVyZmxvdy15OmF1dG99Lm92ZXJmbG93LXgtaGlkZGVue292ZXJmbG93LXg6aGlkZGVufS5vdmVyZmxvdy15LXNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbH0udHJ1bmNhdGV7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwfS53aGl0ZXNwYWNlLW5vd3JhcHt3aGl0ZS1zcGFjZTpub3dyYXB9LnJvdW5kZWR7Ym9yZGVyLXJhZGl1czouMjVyZW19LnJvdW5kZWQtXFtpbmhlcml0XF17Ym9yZGVyLXJhZGl1czppbmhlcml0fS5yb3VuZGVkLWZ1bGx7Ym9yZGVyLXJhZGl1czo5OTk5cHh9LnJvdW5kZWQtbGd7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpfS5yb3VuZGVkLW1ke2JvcmRlci1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gMnB4KX0ucm91bmRlZC1zbXtib3JkZXItcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDRweCl9LmJvcmRlcntib3JkZXItd2lkdGg6MXB4fS5ib3JkZXItMiwuYm9yZGVyLVxbMnB4XF17Ym9yZGVyLXdpZHRoOjJweH0uYm9yZGVyLXl7Ym9yZGVyLXRvcC13aWR0aDoxcHg7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHh9LmJvcmRlci1ie2JvcmRlci1ib3R0b20td2lkdGg6MXB4fS5ib3JkZXItbHtib3JkZXItbGVmdC13aWR0aDoxcHh9LmJvcmRlci1sLTJ7Ym9yZGVyLWxlZnQtd2lkdGg6MnB4fS5ib3JkZXItcntib3JkZXItcmlnaHQtd2lkdGg6MXB4fS5ib3JkZXItdHtib3JkZXItdG9wLXdpZHRoOjFweH0uYm9yZGVyLWFjY2VudHtib3JkZXItY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5ib3JkZXItYm9yZGVye2JvcmRlci1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9LmJvcmRlci1jYXJke2JvcmRlci1jb2xvcjpoc2wodmFyKC0tY2FyZCkpfS5ib3JkZXItZ3JheS00MDB7LS10dy1ib3JkZXItb3BhY2l0eTogMTtib3JkZXItY29sb3I6cmdiKDE1NiAxNjMgMTc1IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKX0uYm9yZGVyLWlucHV0e2JvcmRlci1jb2xvcjpoc2wodmFyKC0taW5wdXQpKX0uYm9yZGVyLXByaW1hcnl7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1wcmltYXJ5KSl9LmJvcmRlci10cmFuc3BhcmVudHtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9LmJvcmRlci1sLXRyYW5zcGFyZW50e2JvcmRlci1sZWZ0LWNvbG9yOnRyYW5zcGFyZW50fS5ib3JkZXItdC10cmFuc3BhcmVudHtib3JkZXItdG9wLWNvbG9yOnRyYW5zcGFyZW50fS5iZy1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmJnLWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYmFja2dyb3VuZCkpfS5iZy1iYWNrZ3JvdW5kXC84MHtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSAvIC44KX0uYmctYm9yZGVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJvcmRlcikpfS5iZy1jYXJke2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWNhcmQpKX0uYmctY2FyZC1mb3JlZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWNhcmQtZm9yZWdyb3VuZCkpfS5iZy1kZXN0cnVjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1kZXN0cnVjdGl2ZSkpfS5iZy1ncmF5LTMwMHstLXR3LWJnLW9wYWNpdHk6IDE7YmFja2dyb3VuZC1jb2xvcjpyZ2IoMjA5IDIxMyAyMTkgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmJnLWdyYXktNTAwey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigxMDcgMTE0IDEyOCAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKX0uYmctbXV0ZWR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tbXV0ZWQpKX0uYmctcG9wb3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1wb3BvdmVyKSl9LmJnLXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5iZy1yZWQtNTAwey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigyMzkgNjggNjggLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmJnLXNlY29uZGFyeXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1zZWNvbmRhcnkpKX0uYmctdHJhbnNwYXJlbnR7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uYmctd2hpdGV7LS10dy1iZy1vcGFjaXR5OiAxO2JhY2tncm91bmQtY29sb3I6cmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpfS5iZy1ncmFkaWVudC10by1ie2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSx2YXIoLS10dy1ncmFkaWVudC1zdG9wcykpfS5mcm9tLXRyYW5zcGFyZW50ey0tdHctZ3JhZGllbnQtZnJvbTogdHJhbnNwYXJlbnQgdmFyKC0tdHctZ3JhZGllbnQtZnJvbS1wb3NpdGlvbik7LS10dy1ncmFkaWVudC10bzogcmdiKDAgMCAwIC8gMCkgdmFyKC0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb24pOy0tdHctZ3JhZGllbnQtc3RvcHM6IHZhcigtLXR3LWdyYWRpZW50LWZyb20pLCB2YXIoLS10dy1ncmFkaWVudC10byl9LnRvLWJhY2tncm91bmR7LS10dy1ncmFkaWVudC10bzogaHNsKHZhcigtLWJhY2tncm91bmQpKSB2YXIoLS10dy1ncmFkaWVudC10by1wb3NpdGlvbil9LmZpbGwtY3VycmVudHtmaWxsOmN1cnJlbnRDb2xvcn0uZmlsbC13aGl0ZXtmaWxsOiNmZmZ9LnN0cm9rZS1cWzJweFxde3N0cm9rZS13aWR0aDoycHh9LnN0cm9rZS1cWzNweFxde3N0cm9rZS13aWR0aDozcHh9Lm9iamVjdC1jb250YWluey1vLW9iamVjdC1maXQ6Y29udGFpbjtvYmplY3QtZml0OmNvbnRhaW59LnAtMHtwYWRkaW5nOjB9LnAtMXtwYWRkaW5nOi4yNXJlbX0ucC0xMHtwYWRkaW5nOjIuNXJlbX0ucC0ye3BhZGRpbmc6LjVyZW19LnAtM3twYWRkaW5nOi43NXJlbX0ucC00e3BhZGRpbmc6MXJlbX0ucC02e3BhZGRpbmc6MS41cmVtfS5wLVxbMXB4XF17cGFkZGluZzoxcHh9LnB4LTF7cGFkZGluZy1sZWZ0Oi4yNXJlbTtwYWRkaW5nLXJpZ2h0Oi4yNXJlbX0ucHgtMntwYWRkaW5nLWxlZnQ6LjVyZW07cGFkZGluZy1yaWdodDouNXJlbX0ucHgtMlwuNXtwYWRkaW5nLWxlZnQ6LjYyNXJlbTtwYWRkaW5nLXJpZ2h0Oi42MjVyZW19LnB4LTN7cGFkZGluZy1sZWZ0Oi43NXJlbTtwYWRkaW5nLXJpZ2h0Oi43NXJlbX0ucHgtNHtwYWRkaW5nLWxlZnQ6MXJlbTtwYWRkaW5nLXJpZ2h0OjFyZW19LnB4LTV7cGFkZGluZy1sZWZ0OjEuMjVyZW07cGFkZGluZy1yaWdodDoxLjI1cmVtfS5weC04e3BhZGRpbmctbGVmdDoycmVtO3BhZGRpbmctcmlnaHQ6MnJlbX0ucHgtXFsyNHB4XF17cGFkZGluZy1sZWZ0OjI0cHg7cGFkZGluZy1yaWdodDoyNHB4fS5weS0xe3BhZGRpbmctdG9wOi4yNXJlbTtwYWRkaW5nLWJvdHRvbTouMjVyZW19LnB5LTFcLjV7cGFkZGluZy10b3A6LjM3NXJlbTtwYWRkaW5nLWJvdHRvbTouMzc1cmVtfS5weS0ye3BhZGRpbmctdG9wOi41cmVtO3BhZGRpbmctYm90dG9tOi41cmVtfS5weS0ze3BhZGRpbmctdG9wOi43NXJlbTtwYWRkaW5nLWJvdHRvbTouNzVyZW19LnB5LTR7cGFkZGluZy10b3A6MXJlbTtwYWRkaW5nLWJvdHRvbToxcmVtfS5weS02e3BhZGRpbmctdG9wOjEuNXJlbTtwYWRkaW5nLWJvdHRvbToxLjVyZW19LnB5LTd7cGFkZGluZy10b3A6MS43NXJlbTtwYWRkaW5nLWJvdHRvbToxLjc1cmVtfS5weS1cWzJweFxde3BhZGRpbmctdG9wOjJweDtwYWRkaW5nLWJvdHRvbToycHh9LnBiLTB7cGFkZGluZy1ib3R0b206MH0ucGItMjB7cGFkZGluZy1ib3R0b206NXJlbX0ucGItNHtwYWRkaW5nLWJvdHRvbToxcmVtfS5wbC02e3BhZGRpbmctbGVmdDoxLjVyZW19LnBsLTh7cGFkZGluZy1sZWZ0OjJyZW19LnByLTF7cGFkZGluZy1yaWdodDouMjVyZW19LnByLTJ7cGFkZGluZy1yaWdodDouNXJlbX0ucHQtMHtwYWRkaW5nLXRvcDowfS5wdC0xe3BhZGRpbmctdG9wOi4yNXJlbX0ucHQtMntwYWRkaW5nLXRvcDouNXJlbX0ucHQtNHtwYWRkaW5nLXRvcDoxcmVtfS50ZXh0LWxlZnR7dGV4dC1hbGlnbjpsZWZ0fS50ZXh0LWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlcn0udGV4dC1zdGFydHt0ZXh0LWFsaWduOnN0YXJ0fS5mb250LXNhbnN7Zm9udC1mYW1pbHk6Um9ib3RvLHNhbnMtc2VyaWZ9LmZvbnQtc2VyaWZ7Zm9udC1mYW1pbHk6U3BhY2UgTW9ubyxtb25vc3BhY2V9LnRleHQtMnhse2ZvbnQtc2l6ZToxLjVyZW07bGluZS1oZWlnaHQ6MnJlbX0udGV4dC0zeGx7Zm9udC1zaXplOjEuODc1cmVtO2xpbmUtaGVpZ2h0OjIuMjVyZW19LnRleHQtNHhse2ZvbnQtc2l6ZToyLjI1cmVtO2xpbmUtaGVpZ2h0OjIuNXJlbX0udGV4dC1cWzBcLjhyZW1cXXtmb250LXNpemU6LjhyZW19LnRleHQtXFsxMnB4XF17Zm9udC1zaXplOjEycHh9LnRleHQtbGd7Zm9udC1zaXplOjEuMTI1cmVtO2xpbmUtaGVpZ2h0OjEuNzVyZW19LnRleHQtc217Zm9udC1zaXplOi44NzVyZW07bGluZS1oZWlnaHQ6MS4yNXJlbX0udGV4dC14bHtmb250LXNpemU6MS4yNXJlbTtsaW5lLWhlaWdodDoxLjc1cmVtfS50ZXh0LXhze2ZvbnQtc2l6ZTouNzVyZW07bGluZS1oZWlnaHQ6MXJlbX0uZm9udC1cWzEycHhcXXtmb250LXdlaWdodDoxMnB4fS5mb250LVxbNDAwXF17Zm9udC13ZWlnaHQ6NDAwfS5mb250LVxbNTAwXF17Zm9udC13ZWlnaHQ6NTAwfS5mb250LVxbNTUwXF17Zm9udC13ZWlnaHQ6NTUwfS5mb250LWJvbGR7Zm9udC13ZWlnaHQ6NzAwfS5mb250LWV4dHJhYm9sZHtmb250LXdlaWdodDo4MDB9LmZvbnQtbWVkaXVte2ZvbnQtd2VpZ2h0OjUwMH0uZm9udC1ub3JtYWx7Zm9udC13ZWlnaHQ6NDAwfS5mb250LXNlbWlib2xke2ZvbnQtd2VpZ2h0OjYwMH0udXBwZXJjYXNle3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX0uaXRhbGlje2ZvbnQtc3R5bGU6aXRhbGljfS5sZWFkaW5nLTR7bGluZS1oZWlnaHQ6MXJlbX0ubGVhZGluZy1ub25le2xpbmUtaGVpZ2h0OjF9LnRyYWNraW5nLVxbMFwuMDRlbVxde2xldHRlci1zcGFjaW5nOi4wNGVtfS50cmFja2luZy10aWdodHtsZXR0ZXItc3BhY2luZzotLjAyNWVtfS50cmFja2luZy13aWRlcntsZXR0ZXItc3BhY2luZzouMDVlbX0udHJhY2tpbmctd2lkZXN0e2xldHRlci1zcGFjaW5nOi4xZW19LnRleHQtYWNjZW50e2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0udGV4dC1hY2NlbnQtZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tYWNjZW50LWZvcmVncm91bmQpKX0udGV4dC1iYWNrZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LnRleHQtY2FyZC1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1jYXJkLWZvcmVncm91bmQpKX0udGV4dC1jdXJyZW50e2NvbG9yOmN1cnJlbnRDb2xvcn0udGV4dC1kZXN0cnVjdGl2ZXtjb2xvcjpoc2wodmFyKC0tZGVzdHJ1Y3RpdmUpKX0udGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kKSl9LnRleHQtZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tZm9yZWdyb3VuZCkpfS50ZXh0LW11dGVke2NvbG9yOmhzbCh2YXIoLS1tdXRlZCkpfS50ZXh0LW11dGVkLWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0udGV4dC1wb3BvdmVyLWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLXBvcG92ZXItZm9yZWdyb3VuZCkpfS50ZXh0LXByaW1hcnl7Y29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0udGV4dC1wcmltYXJ5LWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLXByaW1hcnktZm9yZWdyb3VuZCkpfS50ZXh0LXNlY29uZGFyeS1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1zZWNvbmRhcnktZm9yZWdyb3VuZCkpfS50ZXh0LXdoaXRley0tdHctdGV4dC1vcGFjaXR5OiAxO2NvbG9yOnJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpfS51bmRlcmxpbmV7dGV4dC1kZWNvcmF0aW9uLWxpbmU6dW5kZXJsaW5lfS5saW5lLXRocm91Z2h7dGV4dC1kZWNvcmF0aW9uLWxpbmU6bGluZS10aHJvdWdofS51bmRlcmxpbmUtb2Zmc2V0LTR7dGV4dC11bmRlcmxpbmUtb2Zmc2V0OjRweH0uYW50aWFsaWFzZWR7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDstbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGV9Lm9wYWNpdHktMHtvcGFjaXR5OjB9Lm9wYWNpdHktMTAwe29wYWNpdHk6MX0ub3BhY2l0eS01MHtvcGFjaXR5Oi41fS5vcGFjaXR5LTYwe29wYWNpdHk6LjZ9Lm9wYWNpdHktNzB7b3BhY2l0eTouN30ub3BhY2l0eS03NXtvcGFjaXR5Oi43NX0uc2hhZG93ey0tdHctc2hhZG93OiAwIDFweCAzcHggMCByZ2IoMCAwIDAgLyAuMSksIDAgMXB4IDJweCAtMXB4IHJnYigwIDAgMCAvIC4xKTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAzcHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDFweCAycHggLTFweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9LnNoYWRvdy1sZ3stLXR3LXNoYWRvdzogMCAxMHB4IDE1cHggLTNweCByZ2IoMCAwIDAgLyAuMSksIDAgNHB4IDZweCAtNHB4IHJnYigwIDAgMCAvIC4xKTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDEwcHggMTVweCAtM3B4IHZhcigtLXR3LXNoYWRvdy1jb2xvciksIDAgNHB4IDZweCAtNHB4IHZhcigtLXR3LXNoYWRvdy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctc2hhZG93KX0uc2hhZG93LW1key0tdHctc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2IoMCAwIDAgLyAuMSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIC4xKTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDRweCA2cHggLTFweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDJweCA0cHggLTJweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9LnNoYWRvdy1zbXstLXR3LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gLjA1KTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAycHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9Lm91dGxpbmUtbm9uZXtvdXRsaW5lOjJweCBzb2xpZCB0cmFuc3BhcmVudDtvdXRsaW5lLW9mZnNldDoycHh9Lm91dGxpbmV7b3V0bGluZS1zdHlsZTpzb2xpZH0ucmluZy0wey0tdHctcmluZy1vZmZzZXQtc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkgdmFyKC0tdHctcmluZy1vZmZzZXQtY29sb3IpOy0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMHB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksdmFyKC0tdHctcmluZy1zaGFkb3cpLHZhcigtLXR3LXNoYWRvdywgMCAwICMwMDAwKX0ucmluZy1vZmZzZXQtYmFja2dyb3VuZHstLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiBoc2wodmFyKC0tYmFja2dyb3VuZCkpfS5kcm9wLXNoYWRvdy0yeGx7LS10dy1kcm9wLXNoYWRvdzogZHJvcC1zaGFkb3coMCAyNXB4IDI1cHggcmdiKDAgMCAwIC8gLjE1KSk7ZmlsdGVyOnZhcigtLXR3LWJsdXIpIHZhcigtLXR3LWJyaWdodG5lc3MpIHZhcigtLXR3LWNvbnRyYXN0KSB2YXIoLS10dy1ncmF5c2NhbGUpIHZhcigtLXR3LWh1ZS1yb3RhdGUpIHZhcigtLXR3LWludmVydCkgdmFyKC0tdHctc2F0dXJhdGUpIHZhcigtLXR3LXNlcGlhKSB2YXIoLS10dy1kcm9wLXNoYWRvdyl9LmRyb3Atc2hhZG93LVxbMHB4XzBweF8xMnB4X3JnYmFcKDU2XCwyMDVcLDE1MlwsMFwuNjBcKVxdey0tdHctZHJvcC1zaGFkb3c6IGRyb3Atc2hhZG93KDBweCAwcHggMTJweCByZ2JhKDU2LDIwNSwxNTIsLjYpKTtmaWx0ZXI6dmFyKC0tdHctYmx1cikgdmFyKC0tdHctYnJpZ2h0bmVzcykgdmFyKC0tdHctY29udHJhc3QpIHZhcigtLXR3LWdyYXlzY2FsZSkgdmFyKC0tdHctaHVlLXJvdGF0ZSkgdmFyKC0tdHctaW52ZXJ0KSB2YXIoLS10dy1zYXR1cmF0ZSkgdmFyKC0tdHctc2VwaWEpIHZhcigtLXR3LWRyb3Atc2hhZG93KX0uZmlsdGVye2ZpbHRlcjp2YXIoLS10dy1ibHVyKSB2YXIoLS10dy1icmlnaHRuZXNzKSB2YXIoLS10dy1jb250cmFzdCkgdmFyKC0tdHctZ3JheXNjYWxlKSB2YXIoLS10dy1odWUtcm90YXRlKSB2YXIoLS10dy1pbnZlcnQpIHZhcigtLXR3LXNhdHVyYXRlKSB2YXIoLS10dy1zZXBpYSkgdmFyKC0tdHctZHJvcC1zaGFkb3cpfS5iYWNrZHJvcC1ibHVyLXNtey0tdHctYmFja2Ryb3AtYmx1cjogYmx1cig0cHgpOy13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOnZhcigtLXR3LWJhY2tkcm9wLWJsdXIpIHZhcigtLXR3LWJhY2tkcm9wLWJyaWdodG5lc3MpIHZhcigtLXR3LWJhY2tkcm9wLWNvbnRyYXN0KSB2YXIoLS10dy1iYWNrZHJvcC1ncmF5c2NhbGUpIHZhcigtLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGUpIHZhcigtLXR3LWJhY2tkcm9wLWludmVydCkgdmFyKC0tdHctYmFja2Ryb3Atb3BhY2l0eSkgdmFyKC0tdHctYmFja2Ryb3Atc2F0dXJhdGUpIHZhcigtLXR3LWJhY2tkcm9wLXNlcGlhKTtiYWNrZHJvcC1maWx0ZXI6dmFyKC0tdHctYmFja2Ryb3AtYmx1cikgdmFyKC0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzcykgdmFyKC0tdHctYmFja2Ryb3AtY29udHJhc3QpIHZhcigtLXR3LWJhY2tkcm9wLWdyYXlzY2FsZSkgdmFyKC0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZSkgdmFyKC0tdHctYmFja2Ryb3AtaW52ZXJ0KSB2YXIoLS10dy1iYWNrZHJvcC1vcGFjaXR5KSB2YXIoLS10dy1iYWNrZHJvcC1zYXR1cmF0ZSkgdmFyKC0tdHctYmFja2Ryb3Atc2VwaWEpfS50cmFuc2l0aW9uLWFsbHt0cmFuc2l0aW9uLXByb3BlcnR5OmFsbDt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKTt0cmFuc2l0aW9uLWR1cmF0aW9uOi4xNXN9LnRyYW5zaXRpb24tY29sb3Jze3RyYW5zaXRpb24tcHJvcGVydHk6Y29sb3IsYmFja2dyb3VuZC1jb2xvcixib3JkZXItY29sb3IsdGV4dC1kZWNvcmF0aW9uLWNvbG9yLGZpbGwsc3Ryb2tlO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpO3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30udHJhbnNpdGlvbi1vcGFjaXR5e3RyYW5zaXRpb24tcHJvcGVydHk6b3BhY2l0eTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKTt0cmFuc2l0aW9uLWR1cmF0aW9uOi4xNXN9LnRyYW5zaXRpb24tdHJhbnNmb3Jte3RyYW5zaXRpb24tcHJvcGVydHk6dHJhbnNmb3JtO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpO3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30uZHVyYXRpb24tMTUwe3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30uZHVyYXRpb24tMjAwe3RyYW5zaXRpb24tZHVyYXRpb246LjJzfS5lYXNlLWluLW91dHt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKX1Aa2V5ZnJhbWVzIGVudGVyezAle29wYWNpdHk6dmFyKC0tdHctZW50ZXItb3BhY2l0eSwgMSk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKHZhcigtLXR3LWVudGVyLXRyYW5zbGF0ZS14LCAwKSx2YXIoLS10dy1lbnRlci10cmFuc2xhdGUteSwgMCksMCkgc2NhbGUzZCh2YXIoLS10dy1lbnRlci1zY2FsZSwgMSksdmFyKC0tdHctZW50ZXItc2NhbGUsIDEpLHZhcigtLXR3LWVudGVyLXNjYWxlLCAxKSkgcm90YXRlKHZhcigtLXR3LWVudGVyLXJvdGF0ZSwgMCkpfX1Aa2V5ZnJhbWVzIGV4aXR7dG97b3BhY2l0eTp2YXIoLS10dy1leGl0LW9wYWNpdHksIDEpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCh2YXIoLS10dy1leGl0LXRyYW5zbGF0ZS14LCAwKSx2YXIoLS10dy1leGl0LXRyYW5zbGF0ZS15LCAwKSwwKSBzY2FsZTNkKHZhcigtLXR3LWV4aXQtc2NhbGUsIDEpLHZhcigtLXR3LWV4aXQtc2NhbGUsIDEpLHZhcigtLXR3LWV4aXQtc2NhbGUsIDEpKSByb3RhdGUodmFyKC0tdHctZXhpdC1yb3RhdGUsIDApKX19LmFuaW1hdGUtaW57YW5pbWF0aW9uLW5hbWU6ZW50ZXI7YW5pbWF0aW9uLWR1cmF0aW9uOi4xNXM7LS10dy1lbnRlci1vcGFjaXR5OiBpbml0aWFsOy0tdHctZW50ZXItc2NhbGU6IGluaXRpYWw7LS10dy1lbnRlci1yb3RhdGU6IGluaXRpYWw7LS10dy1lbnRlci10cmFuc2xhdGUteDogaW5pdGlhbDstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiBpbml0aWFsfS5mYWRlLWluLTB7LS10dy1lbnRlci1vcGFjaXR5OiAwfS56b29tLWluLTk1ey0tdHctZW50ZXItc2NhbGU6IC45NX0uZHVyYXRpb24tMTUwe2FuaW1hdGlvbi1kdXJhdGlvbjouMTVzfS5kdXJhdGlvbi0yMDB7YW5pbWF0aW9uLWR1cmF0aW9uOi4yc30uZWFzZS1pbi1vdXR7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKX0uZmlsZVw6Ym9yZGVyLTA6OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2JvcmRlci13aWR0aDowcHh9LmZpbGVcOmJnLXRyYW5zcGFyZW50OjpmaWxlLXNlbGVjdG9yLWJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5maWxlXDp0ZXh0LXNtOjpmaWxlLXNlbGVjdG9yLWJ1dHRvbntmb250LXNpemU6Ljg3NXJlbTtsaW5lLWhlaWdodDoxLjI1cmVtfS5maWxlXDpmb250LW1lZGl1bTo6ZmlsZS1zZWxlY3Rvci1idXR0b257Zm9udC13ZWlnaHQ6NTAwfS5wbGFjZWhvbGRlclw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LnBsYWNlaG9sZGVyXDp0ZXh0LW11dGVkLWZvcmVncm91bmQ6OnBsYWNlaG9sZGVye2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LmZvY3VzLXdpdGhpblw6cmVsYXRpdmU6Zm9jdXMtd2l0aGlue3Bvc2l0aW9uOnJlbGF0aXZlfS5ob3Zlclw6dy1cWzJweFxdOmhvdmVye3dpZHRoOjJweH0uaG92ZXJcOnctXFszcHhcXTpob3Zlcnt3aWR0aDozcHh9LmhvdmVyXDpjdXJzb3ItcG9pbnRlcjpob3ZlcntjdXJzb3I6cG9pbnRlcn0uaG92ZXJcOnJvdW5kZWQtbGc6aG92ZXJ7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpfS5ob3Zlclw6YmctYWNjZW50OmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5ob3Zlclw6YmctYmFja2dyb3VuZDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LmhvdmVyXDpiZy1ib3JkZXI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9LmhvdmVyXDpiZy1kZXN0cnVjdGl2ZVwvOTA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tZGVzdHJ1Y3RpdmUpIC8gLjkpfS5ob3Zlclw6YmctbXV0ZWQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tbXV0ZWQpKX0uaG92ZXJcOmJnLXByaW1hcnk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5ob3Zlclw6YmctcHJpbWFyeVwvOTA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkgLyAuOSl9LmhvdmVyXDpiZy1yZWQtNzAwOmhvdmVyey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigxODUgMjggMjggLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmhvdmVyXDpiZy1zZWNvbmRhcnlcLzgwOmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXNlY29uZGFyeSkgLyAuOCl9LmhvdmVyXDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kOmhvdmVye2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5ob3Zlclw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kOmhvdmVye2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LmhvdmVyXDp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZDpob3Zlcntjb2xvcjpoc2wodmFyKC0tcHJpbWFyeS1mb3JlZ3JvdW5kKSl9LmhvdmVyXDp0ZXh0LXdoaXRlOmhvdmVyey0tdHctdGV4dC1vcGFjaXR5OiAxO2NvbG9yOnJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpfS5ob3Zlclw6dW5kZXJsaW5lOmhvdmVye3RleHQtZGVjb3JhdGlvbi1saW5lOnVuZGVybGluZX0uaG92ZXJcOm9wYWNpdHktMTAwOmhvdmVye29wYWNpdHk6MX0uZm9jdXNcOmJnLWFjY2VudDpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uZm9jdXNcOmJnLXByaW1hcnk6Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5mb2N1c1w6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZDpmb2N1c3tjb2xvcjpoc2wodmFyKC0tYWNjZW50LWZvcmVncm91bmQpKX0uZm9jdXNcOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kOmZvY3Vze2NvbG9yOmhzbCh2YXIoLS1wcmltYXJ5LWZvcmVncm91bmQpKX0uZm9jdXNcOm91dGxpbmUtbm9uZTpmb2N1c3tvdXRsaW5lOjJweCBzb2xpZCB0cmFuc3BhcmVudDtvdXRsaW5lLW9mZnNldDoycHh9LmZvY3VzXDpyaW5nLTI6Zm9jdXN7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSB2YXIoLS10dy1yaW5nLW9mZnNldC1jb2xvcik7LS10dy1yaW5nLXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgY2FsYygycHggKyB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkpIHZhcigtLXR3LXJpbmctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93KSx2YXIoLS10dy1yaW5nLXNoYWRvdyksdmFyKC0tdHctc2hhZG93LCAwIDAgIzAwMDApfS5mb2N1c1w6cmluZy1yaW5nOmZvY3Vzey0tdHctcmluZy1jb2xvcjogaHNsKHZhcigtLXJpbmcpKX0uZm9jdXNcOnJpbmctb2Zmc2V0LTI6Zm9jdXN7LS10dy1yaW5nLW9mZnNldC13aWR0aDogMnB4fS5mb2N1cy12aXNpYmxlXDpvdXRsaW5lLW5vbmU6Zm9jdXMtdmlzaWJsZXtvdXRsaW5lOjJweCBzb2xpZCB0cmFuc3BhcmVudDtvdXRsaW5lLW9mZnNldDoycHh9LmZvY3VzLXZpc2libGVcOm91dGxpbmUtYWNjZW50OmZvY3VzLXZpc2libGV7b3V0bGluZS1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmZvY3VzLXZpc2libGVcOnJpbmctMjpmb2N1cy12aXNpYmxley0tdHctcmluZy1vZmZzZXQtc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkgdmFyKC0tdHctcmluZy1vZmZzZXQtY29sb3IpOy0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMnB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksdmFyKC0tdHctcmluZy1zaGFkb3cpLHZhcigtLXR3LXNoYWRvdywgMCAwICMwMDAwKX0uZm9jdXMtdmlzaWJsZVw6cmluZy1yaW5nOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLWNvbG9yOiBoc2wodmFyKC0tcmluZykpfS5mb2N1cy12aXNpYmxlXDpyaW5nLW9mZnNldC0yOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLW9mZnNldC13aWR0aDogMnB4fS5mb2N1cy12aXNpYmxlXDpyaW5nLW9mZnNldC1iYWNrZ3JvdW5kOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLW9mZnNldC1jb2xvcjogaHNsKHZhcigtLWJhY2tncm91bmQpKX0uZGlzYWJsZWRcOnBvaW50ZXItZXZlbnRzLW5vbmU6ZGlzYWJsZWR7cG9pbnRlci1ldmVudHM6bm9uZX0uZGlzYWJsZWRcOmN1cnNvci1ub3QtYWxsb3dlZDpkaXNhYmxlZHtjdXJzb3I6bm90LWFsbG93ZWR9LmRpc2FibGVkXDpib3JkZXItYm9yZGVyOmRpc2FibGVke2JvcmRlci1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9LmRpc2FibGVkXDp0ZXh0LWJhY2tncm91bmQ6ZGlzYWJsZWR7Y29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKX0uZGlzYWJsZWRcOm9wYWNpdHktNTA6ZGlzYWJsZWR7b3BhY2l0eTouNX0ucGVlcjpkaXNhYmxlZH4ucGVlci1kaXNhYmxlZFw6Y3Vyc29yLW5vdC1hbGxvd2Vke2N1cnNvcjpub3QtYWxsb3dlZH0ucGVlcjpkaXNhYmxlZH4ucGVlci1kaXNhYmxlZFw6b3BhY2l0eS03MHtvcGFjaXR5Oi43fS5hcmlhLXNlbGVjdGVkXDpiZy1hY2NlbnRbYXJpYS1zZWxlY3RlZD10cnVlXXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uYXJpYS1zZWxlY3RlZFw6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZFthcmlhLXNlbGVjdGVkPXRydWVde2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5hcmlhLXNlbGVjdGVkXDpvcGFjaXR5LTEwMFthcmlhLXNlbGVjdGVkPXRydWVde29wYWNpdHk6MX0uZGF0YS1cW2Rpc2FibGVkXF1cOnBvaW50ZXItZXZlbnRzLW5vbmVbZGF0YS1kaXNhYmxlZF17cG9pbnRlci1ldmVudHM6bm9uZX0uZGF0YS1cW3NpZGVcPWJvdHRvbVxdXDp0cmFuc2xhdGUteS0xW2RhdGEtc2lkZT1ib3R0b21dey0tdHctdHJhbnNsYXRlLXk6IC4yNXJlbTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uZGF0YS1cW3NpZGVcPWxlZnRcXVw6LXRyYW5zbGF0ZS14LTFbZGF0YS1zaWRlPWxlZnRdey0tdHctdHJhbnNsYXRlLXg6IC0uMjVyZW07dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmRhdGEtXFtzaWRlXD1yaWdodFxdXDp0cmFuc2xhdGUteC0xW2RhdGEtc2lkZT1yaWdodF17LS10dy10cmFuc2xhdGUteDogLjI1cmVtO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5kYXRhLVxbc2lkZVw9dG9wXF1cOi10cmFuc2xhdGUteS0xW2RhdGEtc2lkZT10b3Bdey0tdHctdHJhbnNsYXRlLXk6IC0uMjVyZW07dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmRhdGEtXFtzdGF0ZVw9Y2hlY2tlZFxdXDp0cmFuc2xhdGUteC01W2RhdGEtc3RhdGU9Y2hlY2tlZF17LS10dy10cmFuc2xhdGUteDogMS4yNXJlbTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uZGF0YS1cW3N0YXRlXD11bmNoZWNrZWRcXVw6dHJhbnNsYXRlLXgtMFtkYXRhLXN0YXRlPXVuY2hlY2tlZF17LS10dy10cmFuc2xhdGUteDogMHB4O3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfUBrZXlmcmFtZXMgYWNjb3JkaW9uLXVwezAle2hlaWdodDp2YXIoLS1yYWRpeC1hY2NvcmRpb24tY29udGVudC1oZWlnaHQpfXRve2hlaWdodDowfX0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6YW5pbWF0ZS1hY2NvcmRpb24tdXBbZGF0YS1zdGF0ZT1jbG9zZWRde2FuaW1hdGlvbjphY2NvcmRpb24tdXAgLjJzIGVhc2Utb3V0fUBrZXlmcmFtZXMgYWNjb3JkaW9uLWRvd257MCV7aGVpZ2h0OjB9dG97aGVpZ2h0OnZhcigtLXJhZGl4LWFjY29yZGlvbi1jb250ZW50LWhlaWdodCl9fS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6YW5pbWF0ZS1hY2NvcmRpb24tZG93bltkYXRhLXN0YXRlPW9wZW5de2FuaW1hdGlvbjphY2NvcmRpb24tZG93biAuMnMgZWFzZS1vdXR9LmRhdGEtXFtzdGF0ZVw9YWN0aXZlXF1cOmJnLWJhY2tncm91bmRbZGF0YS1zdGF0ZT1hY3RpdmVde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKX0uZGF0YS1cW3N0YXRlXD1jaGVja2VkXF1cOmJnLWFjY2VudFtkYXRhLXN0YXRlPWNoZWNrZWRde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5kYXRhLVxbc3RhdGVcPWNoZWNrZWRcXVw6YmctcHJpbWFyeVtkYXRhLXN0YXRlPWNoZWNrZWRde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0uZGF0YS1cW3N0YXRlXD1vblxdXDpiZy1hY2NlbnRbZGF0YS1zdGF0ZT1vbl0sLmRhdGEtXFtzdGF0ZVw9b3BlblxdXDpiZy1hY2NlbnRbZGF0YS1zdGF0ZT1vcGVuXXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uZGF0YS1cW3N0YXRlXD11bmNoZWNrZWRcXVw6YmctcHJpbWFyeVtkYXRhLXN0YXRlPXVuY2hlY2tlZF17YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5kYXRhLVxbc3RhdGVcPWFjdGl2ZVxdXDp0ZXh0LWZvcmVncm91bmRbZGF0YS1zdGF0ZT1hY3RpdmVde2NvbG9yOmhzbCh2YXIoLS1mb3JlZ3JvdW5kKSl9LmRhdGEtXFtzdGF0ZVw9Y2hlY2tlZFxdXDp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZFtkYXRhLXN0YXRlPWNoZWNrZWRde2NvbG9yOmhzbCh2YXIoLS1wcmltYXJ5LWZvcmVncm91bmQpKX0uZGF0YS1cW3N0YXRlXD1vblxdXDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kW2RhdGEtc3RhdGU9b25de2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kW2RhdGEtc3RhdGU9b3Blbl17Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0uZGF0YS1cW2Rpc2FibGVkXF1cOm9wYWNpdHktNTBbZGF0YS1kaXNhYmxlZF17b3BhY2l0eTouNX0uZGF0YS1cW3N0YXRlXD1hY3RpdmVcXVw6c2hhZG93LXNtW2RhdGEtc3RhdGU9YWN0aXZlXXstLXR3LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gLjA1KTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAycHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9LmRhdGEtXFtzdGF0ZVw9b3BlblxdXDphbmltYXRlLWluW2RhdGEtc3RhdGU9b3Blbl17YW5pbWF0aW9uLW5hbWU6ZW50ZXI7YW5pbWF0aW9uLWR1cmF0aW9uOi4xNXM7LS10dy1lbnRlci1vcGFjaXR5OiBpbml0aWFsOy0tdHctZW50ZXItc2NhbGU6IGluaXRpYWw7LS10dy1lbnRlci1yb3RhdGU6IGluaXRpYWw7LS10dy1lbnRlci10cmFuc2xhdGUteDogaW5pdGlhbDstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiBpbml0aWFsfS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDphbmltYXRlLW91dFtkYXRhLXN0YXRlPWNsb3NlZF17YW5pbWF0aW9uLW5hbWU6ZXhpdDthbmltYXRpb24tZHVyYXRpb246LjE1czstLXR3LWV4aXQtb3BhY2l0eTogaW5pdGlhbDstLXR3LWV4aXQtc2NhbGU6IGluaXRpYWw7LS10dy1leGl0LXJvdGF0ZTogaW5pdGlhbDstLXR3LWV4aXQtdHJhbnNsYXRlLXg6IGluaXRpYWw7LS10dy1leGl0LXRyYW5zbGF0ZS15OiBpbml0aWFsfS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDpmYWRlLW91dC0wW2RhdGEtc3RhdGU9Y2xvc2VkXXstLXR3LWV4aXQtb3BhY2l0eTogMH0uZGF0YS1cW3N0YXRlXD1vcGVuXF1cOmZhZGUtaW4tMFtkYXRhLXN0YXRlPW9wZW5dey0tdHctZW50ZXItb3BhY2l0eTogMH0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6em9vbS1vdXQtOTVbZGF0YS1zdGF0ZT1jbG9zZWRdey0tdHctZXhpdC1zY2FsZTogLjk1fS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6em9vbS1pbi05NVtkYXRhLXN0YXRlPW9wZW5dey0tdHctZW50ZXItc2NhbGU6IC45NX0uZGF0YS1cW3NpZGVcPWJvdHRvbVxdXDpzbGlkZS1pbi1mcm9tLXRvcC0yW2RhdGEtc2lkZT1ib3R0b21dey0tdHctZW50ZXItdHJhbnNsYXRlLXk6IC0uNXJlbX0uZGF0YS1cW3NpZGVcPWxlZnRcXVw6c2xpZGUtaW4tZnJvbS1yaWdodC0yW2RhdGEtc2lkZT1sZWZ0XXstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiAuNXJlbX0uZGF0YS1cW3NpZGVcPXJpZ2h0XF1cOnNsaWRlLWluLWZyb20tbGVmdC0yW2RhdGEtc2lkZT1yaWdodF17LS10dy1lbnRlci10cmFuc2xhdGUteDogLS41cmVtfS5kYXRhLVxbc2lkZVw9dG9wXF1cOnNsaWRlLWluLWZyb20tYm90dG9tLTJbZGF0YS1zaWRlPXRvcF17LS10dy1lbnRlci10cmFuc2xhdGUteTogLjVyZW19LmRhdGEtXFtzdGF0ZVw9Y2xvc2VkXF1cOnNsaWRlLW91dC10by1sZWZ0LTFcLzJbZGF0YS1zdGF0ZT1jbG9zZWRdey0tdHctZXhpdC10cmFuc2xhdGUteDogLTUwJX0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6c2xpZGUtb3V0LXRvLXRvcC1cWzQ4XCVcXVtkYXRhLXN0YXRlPWNsb3NlZF17LS10dy1leGl0LXRyYW5zbGF0ZS15OiAtNDglfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6c2xpZGUtaW4tZnJvbS1sZWZ0LTFcLzJbZGF0YS1zdGF0ZT1vcGVuXXstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiAtNTAlfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6c2xpZGUtaW4tZnJvbS10b3AtXFs0OFwlXF1bZGF0YS1zdGF0ZT1vcGVuXXstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiAtNDglfTppcyhbZGF0YS1tb2RlPWRhcmtdIC5kYXJrXDpib3JkZXItd2hpdGUpey0tdHctYm9yZGVyLW9wYWNpdHk6IDE7Ym9yZGVyLWNvbG9yOnJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSl9QG1lZGlhIChtaW4td2lkdGg6IDY0MHB4KXsuc21cOm10LTB7bWFyZ2luLXRvcDowfS5zbVw6YmxvY2t7ZGlzcGxheTpibG9ja30uc21cOmZsZXgtcm93e2ZsZXgtZGlyZWN0aW9uOnJvd30uc21cOmp1c3RpZnktZW5ke2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0uc21cOnNwYWNlLXgtMj46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXgtcmV2ZXJzZTogMDttYXJnaW4tcmlnaHQ6Y2FsYyguNXJlbSAqIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpO21hcmdpbi1sZWZ0OmNhbGMoLjVyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS14LXJldmVyc2UpKSl9LnNtXDpzcGFjZS14LTQ+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS14LXJldmVyc2U6IDA7bWFyZ2luLXJpZ2h0OmNhbGMoMXJlbSAqIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpO21hcmdpbi1sZWZ0OmNhbGMoMXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpKX0uc21cOnNwYWNlLXktMD46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoMHB4ICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSkpO21hcmdpbi1ib3R0b206Y2FsYygwcHggKiB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKX0uc21cOnJvdW5kZWQtbGd7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpfS5zbVw6cC0we3BhZGRpbmc6MH0uc21cOnRleHQtbGVmdHt0ZXh0LWFsaWduOmxlZnR9fUBtZWRpYSAobWluLXdpZHRoOiA3NjhweCl7Lm1kXDp3LWZ1bGx7d2lkdGg6MTAwJX19LlxbXCZcOmhhc1woXFthcmlhLXNlbGVjdGVkXF1cKVxdXDpiZy1hY2NlbnQ6aGFzKFthcmlhLXNlbGVjdGVkXSl7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmZpcnN0XDpcW1wmXDpoYXNcKFxbYXJpYS1zZWxlY3RlZFxdXClcXVw6cm91bmRlZC1sLW1kOmhhcyhbYXJpYS1zZWxlY3RlZF0pOmZpcnN0LWNoaWxke2JvcmRlci10b3AtbGVmdC1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gMnB4KTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDJweCl9Lmxhc3RcOlxbXCZcOmhhc1woXFthcmlhLXNlbGVjdGVkXF1cKVxdXDpyb3VuZGVkLXItbWQ6aGFzKFthcmlhLXNlbGVjdGVkXSk6bGFzdC1jaGlsZHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgLSAycHgpO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDJweCl9LlxbXCZcW2RhdGEtc3RhdGVcPW9wZW5cXVw+c3ZnXF1cOnJvdGF0ZS0xODBbZGF0YS1zdGF0ZT1vcGVuXT5zdmd7LS10dy1yb3RhdGU6IDE4MGRlZzt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uXFtcJl9cW2NtZGstZ3JvdXAtaGVhZGluZ1xdXF1cOnB4LTIgW2NtZGstZ3JvdXAtaGVhZGluZ117cGFkZGluZy1sZWZ0Oi41cmVtO3BhZGRpbmctcmlnaHQ6LjVyZW19LlxbXCZfXFtjbWRrLWdyb3VwLWhlYWRpbmdcXVxdXDpweS0xXC41IFtjbWRrLWdyb3VwLWhlYWRpbmdde3BhZGRpbmctdG9wOi4zNzVyZW07cGFkZGluZy1ib3R0b206LjM3NXJlbX0uXFtcJl9cW2NtZGstZ3JvdXAtaGVhZGluZ1xdXF1cOnRleHQteHMgW2NtZGstZ3JvdXAtaGVhZGluZ117Zm9udC1zaXplOi43NXJlbTtsaW5lLWhlaWdodDoxcmVtfS5cW1wmX1xbY21kay1ncm91cC1oZWFkaW5nXF1cXVw6Zm9udC1tZWRpdW0gW2NtZGstZ3JvdXAtaGVhZGluZ117Zm9udC13ZWlnaHQ6NTAwfS5cW1wmX1xbY21kay1ncm91cC1oZWFkaW5nXF1cXVw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIFtjbWRrLWdyb3VwLWhlYWRpbmdde2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LlxbXCZfXFtjbWRrLWdyb3VwXF1cOm5vdFwoXFtoaWRkZW5cXVwpX1x+XFtjbWRrLWdyb3VwXF1cXVw6cHQtMCBbY21kay1ncm91cF06bm90KFtoaWRkZW5dKX5bY21kay1ncm91cF17cGFkZGluZy10b3A6MH0uXFtcJl9cW2NtZGstZ3JvdXBcXVxdXDpweC0yIFtjbWRrLWdyb3VwXXtwYWRkaW5nLWxlZnQ6LjVyZW07cGFkZGluZy1yaWdodDouNXJlbX0uXFtcJl9cW2NtZGstaW5wdXQtd3JhcHBlclxdX3N2Z1xdXDpoLTUgW2NtZGstaW5wdXQtd3JhcHBlcl0gc3Zne2hlaWdodDoxLjI1cmVtfS5cW1wmX1xbY21kay1pbnB1dC13cmFwcGVyXF1fc3ZnXF1cOnctNSBbY21kay1pbnB1dC13cmFwcGVyXSBzdmd7d2lkdGg6MS4yNXJlbX0uXFtcJl9cW2NtZGstaW5wdXRcXVxdXDpoLTEyIFtjbWRrLWlucHV0XXtoZWlnaHQ6M3JlbX0uXFtcJl9cW2NtZGstaXRlbVxdXF1cOnB4LTIgW2NtZGstaXRlbV17cGFkZGluZy1sZWZ0Oi41cmVtO3BhZGRpbmctcmlnaHQ6LjVyZW19LlxbXCZfXFtjbWRrLWl0ZW1cXVxdXDpweS0zIFtjbWRrLWl0ZW1de3BhZGRpbmctdG9wOi43NXJlbTtwYWRkaW5nLWJvdHRvbTouNzVyZW19LlxbXCZfXFtjbWRrLWl0ZW1cXV9zdmdcXVw6aC01IFtjbWRrLWl0ZW1dIHN2Z3toZWlnaHQ6MS4yNXJlbX0uXFtcJl9cW2NtZGstaXRlbVxdX3N2Z1xdXDp3LTUgW2NtZGstaXRlbV0gc3Zne3dpZHRoOjEuMjVyZW19Cg==","/assets/index-a75a6d05.js":"dmFyIERDPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgSUM9KGUsdCxuKT0+dCBpbiBlP0RDKGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOmVbdF09bjt2YXIgamU9KGUsdCxuKT0+KElDKGUsdHlwZW9mIHQhPSJzeW1ib2wiP3QrIiI6dCxuKSxuKSxqQz0oZSx0LG4pPT57aWYoIXQuaGFzKGUpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIrbil9O3ZhciBXZD0oZSx0LG4pPT57aWYodC5oYXMoZSkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7dCBpbnN0YW5jZW9mIFdlYWtTZXQ/dC5hZGQoZSk6dC5zZXQoZSxuKX07dmFyIFlhPShlLHQsbik9PihqQyhlLHQsImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpLG4pO2Z1bmN0aW9uIHpDKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dFtuXTtpZih0eXBlb2YgciE9InN0cmluZyImJiFBcnJheS5pc0FycmF5KHIpKXtmb3IoY29uc3QgbyBpbiByKWlmKG8hPT0iZGVmYXVsdCImJiEobyBpbiBlKSl7Y29uc3QgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsbyk7aSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbyxpLmdldD9pOntlbnVtZXJhYmxlOiEwLGdldDooKT0+cltvXX0pfX19cmV0dXJuIE9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKX0oZnVuY3Rpb24oKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKS5yZWxMaXN0O2lmKHQmJnQuc3VwcG9ydHMmJnQuc3VwcG9ydHMoIm1vZHVsZXByZWxvYWQiKSlyZXR1cm47Zm9yKGNvbnN0IG8gb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlua1tyZWw9Im1vZHVsZXByZWxvYWQiXScpKXIobyk7bmV3IE11dGF0aW9uT2JzZXJ2ZXIobz0+e2Zvcihjb25zdCBpIG9mIG8paWYoaS50eXBlPT09ImNoaWxkTGlzdCIpZm9yKGNvbnN0IGwgb2YgaS5hZGRlZE5vZGVzKWwudGFnTmFtZT09PSJMSU5LIiYmbC5yZWw9PT0ibW9kdWxlcHJlbG9hZCImJnIobCl9KS5vYnNlcnZlKGRvY3VtZW50LHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pO2Z1bmN0aW9uIG4obyl7Y29uc3QgaT17fTtyZXR1cm4gby5pbnRlZ3JpdHkmJihpLmludGVncml0eT1vLmludGVncml0eSksby5yZWZlcnJlclBvbGljeSYmKGkucmVmZXJyZXJQb2xpY3k9by5yZWZlcnJlclBvbGljeSksby5jcm9zc09yaWdpbj09PSJ1c2UtY3JlZGVudGlhbHMiP2kuY3JlZGVudGlhbHM9ImluY2x1ZGUiOm8uY3Jvc3NPcmlnaW49PT0iYW5vbnltb3VzIj9pLmNyZWRlbnRpYWxzPSJvbWl0IjppLmNyZWRlbnRpYWxzPSJzYW1lLW9yaWdpbiIsaX1mdW5jdGlvbiByKG8pe2lmKG8uZXApcmV0dXJuO28uZXA9ITA7Y29uc3QgaT1uKG8pO2ZldGNoKG8uaHJlZixpKX19KSgpO2Z1bmN0aW9uIGJhKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9dmFyIG8xPXtleHBvcnRzOnt9fSxFZT17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogcmVhY3QucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBOYT1TeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50IiksRkM9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksQkM9U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSxXQz1TeW1ib2wuZm9yKCJyZWFjdC5zdHJpY3RfbW9kZSIpLFVDPVN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIiksVkM9U3ltYm9sLmZvcigicmVhY3QucHJvdmlkZXIiKSxIQz1TeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0IiksS0M9U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSxHQz1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZSIpLFlDPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxYQz1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksSm09U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIFFDKGUpe3JldHVybiBlPT09bnVsbHx8dHlwZW9mIGUhPSJvYmplY3QiP251bGw6KGU9Sm0mJmVbSm1dfHxlWyJAQGl0ZXJhdG9yIl0sdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZTpudWxsKX12YXIgaTE9e2lzTW91bnRlZDpmdW5jdGlvbigpe3JldHVybiExfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbigpe319LGwxPU9iamVjdC5hc3NpZ24sczE9e307ZnVuY3Rpb24gTGwoZSx0LG4pe3RoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9dCx0aGlzLnJlZnM9czEsdGhpcy51cGRhdGVyPW58fGkxfUxsLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O0xsLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlIT0ib2JqZWN0IiYmdHlwZW9mIGUhPSJmdW5jdGlvbiImJmUhPW51bGwpdGhyb3cgRXJyb3IoInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLiIpO3RoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyxlLHQsInNldFN0YXRlIil9O0xsLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsZSwiZm9yY2VVcGRhdGUiKX07ZnVuY3Rpb24gYTEoKXt9YTEucHJvdG90eXBlPUxsLnByb3RvdHlwZTtmdW5jdGlvbiBqcChlLHQsbil7dGhpcy5wcm9wcz1lLHRoaXMuY29udGV4dD10LHRoaXMucmVmcz1zMSx0aGlzLnVwZGF0ZXI9bnx8aTF9dmFyIHpwPWpwLnByb3RvdHlwZT1uZXcgYTE7enAuY29uc3RydWN0b3I9anA7bDEoenAsTGwucHJvdG90eXBlKTt6cC5pc1B1cmVSZWFjdENvbXBvbmVudD0hMDt2YXIgWm09QXJyYXkuaXNBcnJheSx1MT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEZwPXtjdXJyZW50Om51bGx9LGMxPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07ZnVuY3Rpb24gZDEoZSx0LG4pe3ZhciByLG89e30saT1udWxsLGw9bnVsbDtpZih0IT1udWxsKWZvcihyIGluIHQucmVmIT09dm9pZCAwJiYobD10LnJlZiksdC5rZXkhPT12b2lkIDAmJihpPSIiK3Qua2V5KSx0KXUxLmNhbGwodCxyKSYmIWMxLmhhc093blByb3BlcnR5KHIpJiYob1tyXT10W3JdKTt2YXIgcz1hcmd1bWVudHMubGVuZ3RoLTI7aWYocz09PTEpby5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxzKXtmb3IodmFyIGE9QXJyYXkocyksdT0wO3U8czt1KyspYVt1XT1hcmd1bWVudHNbdSsyXTtvLmNoaWxkcmVuPWF9aWYoZSYmZS5kZWZhdWx0UHJvcHMpZm9yKHIgaW4gcz1lLmRlZmF1bHRQcm9wcyxzKW9bcl09PT12b2lkIDAmJihvW3JdPXNbcl0pO3JldHVybnskJHR5cGVvZjpOYSx0eXBlOmUsa2V5OmkscmVmOmwscHJvcHM6byxfb3duZXI6RnAuY3VycmVudH19ZnVuY3Rpb24gSkMoZSx0KXtyZXR1cm57JCR0eXBlb2Y6TmEsdHlwZTplLnR5cGUsa2V5OnQscmVmOmUucmVmLHByb3BzOmUucHJvcHMsX293bmVyOmUuX293bmVyfX1mdW5jdGlvbiBCcChlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmZS4kJHR5cGVvZj09PU5hfWZ1bmN0aW9uIFpDKGUpe3ZhciB0PXsiPSI6Ij0wIiwiOiI6Ij0yIn07cmV0dXJuIiQiK2UucmVwbGFjZSgvWz06XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0W25dfSl9dmFyIHFtPS9cLysvZztmdW5jdGlvbiBVZChlLHQpe3JldHVybiB0eXBlb2YgZT09Im9iamVjdCImJmUhPT1udWxsJiZlLmtleSE9bnVsbD9aQygiIitlLmtleSk6dC50b1N0cmluZygzNil9ZnVuY3Rpb24gVHUoZSx0LG4scixvKXt2YXIgaT10eXBlb2YgZTsoaT09PSJ1bmRlZmluZWQifHxpPT09ImJvb2xlYW4iKSYmKGU9bnVsbCk7dmFyIGw9ITE7aWYoZT09PW51bGwpbD0hMDtlbHNlIHN3aXRjaChpKXtjYXNlInN0cmluZyI6Y2FzZSJudW1iZXIiOmw9ITA7YnJlYWs7Y2FzZSJvYmplY3QiOnN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIE5hOmNhc2UgRkM6bD0hMH19aWYobClyZXR1cm4gbD1lLG89byhsKSxlPXI9PT0iIj8iLiIrVWQobCwwKTpyLFptKG8pPyhuPSIiLGUhPW51bGwmJihuPWUucmVwbGFjZShxbSwiJCYvIikrIi8iKSxUdShvLHQsbiwiIixmdW5jdGlvbih1KXtyZXR1cm4gdX0pKTpvIT1udWxsJiYoQnAobykmJihvPUpDKG8sbisoIW8ua2V5fHxsJiZsLmtleT09PW8ua2V5PyIiOigiIitvLmtleSkucmVwbGFjZShxbSwiJCYvIikrIi8iKStlKSksdC5wdXNoKG8pKSwxO2lmKGw9MCxyPXI9PT0iIj8iLiI6cisiOiIsWm0oZSkpZm9yKHZhciBzPTA7czxlLmxlbmd0aDtzKyspe2k9ZVtzXTt2YXIgYT1yK1VkKGkscyk7bCs9VHUoaSx0LG4sYSxvKX1lbHNlIGlmKGE9UUMoZSksdHlwZW9mIGE9PSJmdW5jdGlvbiIpZm9yKGU9YS5jYWxsKGUpLHM9MDshKGk9ZS5uZXh0KCkpLmRvbmU7KWk9aS52YWx1ZSxhPXIrVWQoaSxzKyspLGwrPVR1KGksdCxuLGEsbyk7ZWxzZSBpZihpPT09Im9iamVjdCIpdGhyb3cgdD1TdHJpbmcoZSksRXJyb3IoIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogIisodD09PSJbb2JqZWN0IE9iamVjdF0iPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKGUpLmpvaW4oIiwgIikrIn0iOnQpKyIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuIik7cmV0dXJuIGx9ZnVuY3Rpb24gWGEoZSx0LG4pe2lmKGU9PW51bGwpcmV0dXJuIGU7dmFyIHI9W10sbz0wO3JldHVybiBUdShlLHIsIiIsIiIsZnVuY3Rpb24oaSl7cmV0dXJuIHQuY2FsbChuLGksbysrKX0pLHJ9ZnVuY3Rpb24gcUMoZSl7aWYoZS5fc3RhdHVzPT09LTEpe3ZhciB0PWUuX3Jlc3VsdDt0PXQoKSx0LnRoZW4oZnVuY3Rpb24obil7KGUuX3N0YXR1cz09PTB8fGUuX3N0YXR1cz09PS0xKSYmKGUuX3N0YXR1cz0xLGUuX3Jlc3VsdD1uKX0sZnVuY3Rpb24obil7KGUuX3N0YXR1cz09PTB8fGUuX3N0YXR1cz09PS0xKSYmKGUuX3N0YXR1cz0yLGUuX3Jlc3VsdD1uKX0pLGUuX3N0YXR1cz09PS0xJiYoZS5fc3RhdHVzPTAsZS5fcmVzdWx0PXQpfWlmKGUuX3N0YXR1cz09PTEpcmV0dXJuIGUuX3Jlc3VsdC5kZWZhdWx0O3Rocm93IGUuX3Jlc3VsdH12YXIgbG49e2N1cnJlbnQ6bnVsbH0sYnU9e3RyYW5zaXRpb246bnVsbH0sZSQ9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6bG4sUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6YnUsUmVhY3RDdXJyZW50T3duZXI6RnB9O0VlLkNoaWxkcmVuPXttYXA6WGEsZm9yRWFjaDpmdW5jdGlvbihlLHQsbil7WGEoZSxmdW5jdGlvbigpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxuKX0sY291bnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9MDtyZXR1cm4gWGEoZSxmdW5jdGlvbigpe3QrK30pLHR9LHRvQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIFhhKGUsZnVuY3Rpb24odCl7cmV0dXJuIHR9KXx8W119LG9ubHk6ZnVuY3Rpb24oZSl7aWYoIUJwKGUpKXRocm93IEVycm9yKCJSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4iKTtyZXR1cm4gZX19O0VlLkNvbXBvbmVudD1MbDtFZS5GcmFnbWVudD1CQztFZS5Qcm9maWxlcj1VQztFZS5QdXJlQ29tcG9uZW50PWpwO0VlLlN0cmljdE1vZGU9V0M7RWUuU3VzcGVuc2U9R0M7RWUuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9ZSQ7RWUuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuKXtpZihlPT1udWxsKXRocm93IEVycm9yKCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCAiK2UrIi4iKTt2YXIgcj1sMSh7fSxlLnByb3BzKSxvPWUua2V5LGk9ZS5yZWYsbD1lLl9vd25lcjtpZih0IT1udWxsKXtpZih0LnJlZiE9PXZvaWQgMCYmKGk9dC5yZWYsbD1GcC5jdXJyZW50KSx0LmtleSE9PXZvaWQgMCYmKG89IiIrdC5rZXkpLGUudHlwZSYmZS50eXBlLmRlZmF1bHRQcm9wcyl2YXIgcz1lLnR5cGUuZGVmYXVsdFByb3BzO2ZvcihhIGluIHQpdTEuY2FsbCh0LGEpJiYhYzEuaGFzT3duUHJvcGVydHkoYSkmJihyW2FdPXRbYV09PT12b2lkIDAmJnMhPT12b2lkIDA/c1thXTp0W2FdKX12YXIgYT1hcmd1bWVudHMubGVuZ3RoLTI7aWYoYT09PTEpci5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxhKXtzPUFycmF5KGEpO2Zvcih2YXIgdT0wO3U8YTt1Kyspc1t1XT1hcmd1bWVudHNbdSsyXTtyLmNoaWxkcmVuPXN9cmV0dXJueyQkdHlwZW9mOk5hLHR5cGU6ZS50eXBlLGtleTpvLHJlZjppLHByb3BzOnIsX293bmVyOmx9fTtFZS5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBlPXskJHR5cGVvZjpIQyxfY3VycmVudFZhbHVlOmUsX2N1cnJlbnRWYWx1ZTI6ZSxfdGhyZWFkQ291bnQ6MCxQcm92aWRlcjpudWxsLENvbnN1bWVyOm51bGwsX2RlZmF1bHRWYWx1ZTpudWxsLF9nbG9iYWxOYW1lOm51bGx9LGUuUHJvdmlkZXI9eyQkdHlwZW9mOlZDLF9jb250ZXh0OmV9LGUuQ29uc3VtZXI9ZX07RWUuY3JlYXRlRWxlbWVudD1kMTtFZS5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKGUpe3ZhciB0PWQxLmJpbmQobnVsbCxlKTtyZXR1cm4gdC50eXBlPWUsdH07RWUuY3JlYXRlUmVmPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbH19O0VlLmZvcndhcmRSZWY9ZnVuY3Rpb24oZSl7cmV0dXJueyQkdHlwZW9mOktDLHJlbmRlcjplfX07RWUuaXNWYWxpZEVsZW1lbnQ9QnA7RWUubGF6eT1mdW5jdGlvbihlKXtyZXR1cm57JCR0eXBlb2Y6WEMsX3BheWxvYWQ6e19zdGF0dXM6LTEsX3Jlc3VsdDplfSxfaW5pdDpxQ319O0VlLm1lbW89ZnVuY3Rpb24oZSx0KXtyZXR1cm57JCR0eXBlb2Y6WUMsdHlwZTplLGNvbXBhcmU6dD09PXZvaWQgMD9udWxsOnR9fTtFZS5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9YnUudHJhbnNpdGlvbjtidS50cmFuc2l0aW9uPXt9O3RyeXtlKCl9ZmluYWxseXtidS50cmFuc2l0aW9uPXR9fTtFZS51bnN0YWJsZV9hY3Q9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiYWN0KC4uLikgaXMgbm90IHN1cHBvcnRlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcyBvZiBSZWFjdC4iKX07RWUudXNlQ2FsbGJhY2s9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbG4uY3VycmVudC51c2VDYWxsYmFjayhlLHQpfTtFZS51c2VDb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBsbi5jdXJyZW50LnVzZUNvbnRleHQoZSl9O0VlLnVzZURlYnVnVmFsdWU9ZnVuY3Rpb24oKXt9O0VlLnVzZURlZmVycmVkVmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGxuLmN1cnJlbnQudXNlRGVmZXJyZWRWYWx1ZShlKX07RWUudXNlRWZmZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGxuLmN1cnJlbnQudXNlRWZmZWN0KGUsdCl9O0VlLnVzZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIGxuLmN1cnJlbnQudXNlSWQoKX07RWUudXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGxuLmN1cnJlbnQudXNlSW1wZXJhdGl2ZUhhbmRsZShlLHQsbil9O0VlLnVzZUluc2VydGlvbkVmZmVjdD1mdW5jdGlvbihlLHQpe3JldHVybiBsbi5jdXJyZW50LnVzZUluc2VydGlvbkVmZmVjdChlLHQpfTtFZS51c2VMYXlvdXRFZmZlY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbG4uY3VycmVudC51c2VMYXlvdXRFZmZlY3QoZSx0KX07RWUudXNlTWVtbz1mdW5jdGlvbihlLHQpe3JldHVybiBsbi5jdXJyZW50LnVzZU1lbW8oZSx0KX07RWUudXNlUmVkdWNlcj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGxuLmN1cnJlbnQudXNlUmVkdWNlcihlLHQsbil9O0VlLnVzZVJlZj1mdW5jdGlvbihlKXtyZXR1cm4gbG4uY3VycmVudC51c2VSZWYoZSl9O0VlLnVzZVN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiBsbi5jdXJyZW50LnVzZVN0YXRlKGUpfTtFZS51c2VTeW5jRXh0ZXJuYWxTdG9yZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGxuLmN1cnJlbnQudXNlU3luY0V4dGVybmFsU3RvcmUoZSx0LG4pfTtFZS51c2VUcmFuc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGxuLmN1cnJlbnQudXNlVHJhbnNpdGlvbigpfTtFZS52ZXJzaW9uPSIxOC4yLjAiO28xLmV4cG9ydHM9RWU7dmFyIHA9bzEuZXhwb3J0cztjb25zdCBlZT1iYShwKSxmMT16Qyh7X19wcm90b19fOm51bGwsZGVmYXVsdDplZX0sW3BdKTt2YXIgamY9e30saDE9e2V4cG9ydHM6e319LE5uPXt9LHAxPXtleHBvcnRzOnt9fSxnMT17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzCiAqCiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKi8oZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChFLEEpe3ZhciBSPUUubGVuZ3RoO0UucHVzaChBKTtlOmZvcig7MDxSOyl7dmFyIHo9Ui0xPj4+MSxWPUVbel07aWYoMDxvKFYsQSkpRVt6XT1BLEVbUl09VixSPXo7ZWxzZSBicmVhayBlfX1mdW5jdGlvbiBuKEUpe3JldHVybiBFLmxlbmd0aD09PTA/bnVsbDpFWzBdfWZ1bmN0aW9uIHIoRSl7aWYoRS5sZW5ndGg9PT0wKXJldHVybiBudWxsO3ZhciBBPUVbMF0sUj1FLnBvcCgpO2lmKFIhPT1BKXtFWzBdPVI7ZTpmb3IodmFyIHo9MCxWPUUubGVuZ3RoLGllPVY+Pj4xO3o8aWU7KXt2YXIgbmU9MiooeisxKS0xLENlPUVbbmVdLHdlPW5lKzEsWD1FW3dlXTtpZigwPm8oQ2UsUikpd2U8ViYmMD5vKFgsQ2UpPyhFW3pdPVgsRVt3ZV09Uix6PXdlKTooRVt6XT1DZSxFW25lXT1SLHo9bmUpO2Vsc2UgaWYod2U8ViYmMD5vKFgsUikpRVt6XT1YLEVbd2VdPVIsej13ZTtlbHNlIGJyZWFrIGV9fXJldHVybiBBfWZ1bmN0aW9uIG8oRSxBKXt2YXIgUj1FLnNvcnRJbmRleC1BLnNvcnRJbmRleDtyZXR1cm4gUiE9PTA/UjpFLmlkLUEuaWR9aWYodHlwZW9mIHBlcmZvcm1hbmNlPT0ib2JqZWN0IiYmdHlwZW9mIHBlcmZvcm1hbmNlLm5vdz09ImZ1bmN0aW9uIil7dmFyIGk9cGVyZm9ybWFuY2U7ZS51bnN0YWJsZV9ub3c9ZnVuY3Rpb24oKXtyZXR1cm4gaS5ub3coKX19ZWxzZXt2YXIgbD1EYXRlLHM9bC5ub3coKTtlLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBsLm5vdygpLXN9fXZhciBhPVtdLHU9W10sYz0xLGQ9bnVsbCxmPTMsaD0hMSxtPSExLGc9ITEsUz10eXBlb2Ygc2V0VGltZW91dD09ImZ1bmN0aW9uIj9zZXRUaW1lb3V0Om51bGwsdj10eXBlb2YgY2xlYXJUaW1lb3V0PT0iZnVuY3Rpb24iP2NsZWFyVGltZW91dDpudWxsLHk9dHlwZW9mIHNldEltbWVkaWF0ZTwidSI/c2V0SW1tZWRpYXRlOm51bGw7dHlwZW9mIG5hdmlnYXRvcjwidSImJm5hdmlnYXRvci5zY2hlZHVsaW5nIT09dm9pZCAwJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZyE9PXZvaWQgMCYmbmF2aWdhdG9yLnNjaGVkdWxpbmcuaXNJbnB1dFBlbmRpbmcuYmluZChuYXZpZ2F0b3Iuc2NoZWR1bGluZyk7ZnVuY3Rpb24geChFKXtmb3IodmFyIEE9bih1KTtBIT09bnVsbDspe2lmKEEuY2FsbGJhY2s9PT1udWxsKXIodSk7ZWxzZSBpZihBLnN0YXJ0VGltZTw9RSlyKHUpLEEuc29ydEluZGV4PUEuZXhwaXJhdGlvblRpbWUsdChhLEEpO2Vsc2UgYnJlYWs7QT1uKHUpfX1mdW5jdGlvbiB3KEUpe2lmKGc9ITEseChFKSwhbSlpZihuKGEpIT09bnVsbCltPSEwLEMoayk7ZWxzZXt2YXIgQT1uKHUpO0EhPT1udWxsJiYkKHcsQS5zdGFydFRpbWUtRSl9fWZ1bmN0aW9uIGsoRSxBKXttPSExLGcmJihnPSExLHYoTiksTj0tMSksaD0hMDt2YXIgUj1mO3RyeXtmb3IoeChBKSxkPW4oYSk7ZCE9PW51bGwmJighKGQuZXhwaXJhdGlvblRpbWU+QSl8fEUmJiFqKCkpOyl7dmFyIHo9ZC5jYWxsYmFjaztpZih0eXBlb2Ygej09ImZ1bmN0aW9uIil7ZC5jYWxsYmFjaz1udWxsLGY9ZC5wcmlvcml0eUxldmVsO3ZhciBWPXooZC5leHBpcmF0aW9uVGltZTw9QSk7QT1lLnVuc3RhYmxlX25vdygpLHR5cGVvZiBWPT0iZnVuY3Rpb24iP2QuY2FsbGJhY2s9VjpkPT09bihhKSYmcihhKSx4KEEpfWVsc2UgcihhKTtkPW4oYSl9aWYoZCE9PW51bGwpdmFyIGllPSEwO2Vsc2V7dmFyIG5lPW4odSk7bmUhPT1udWxsJiYkKHcsbmUuc3RhcnRUaW1lLUEpLGllPSExfXJldHVybiBpZX1maW5hbGx5e2Q9bnVsbCxmPVIsaD0hMX19dmFyIGI9ITEsVD1udWxsLE49LTEsRD01LE89LTE7ZnVuY3Rpb24gaigpe3JldHVybiEoZS51bnN0YWJsZV9ub3coKS1PPEQpfWZ1bmN0aW9uIEIoKXtpZihUIT09bnVsbCl7dmFyIEU9ZS51bnN0YWJsZV9ub3coKTtPPUU7dmFyIEE9ITA7dHJ5e0E9VCghMCxFKX1maW5hbGx5e0E/YWUoKTooYj0hMSxUPW51bGwpfX1lbHNlIGI9ITF9dmFyIGFlO2lmKHR5cGVvZiB5PT0iZnVuY3Rpb24iKWFlPWZ1bmN0aW9uKCl7eShCKX07ZWxzZSBpZih0eXBlb2YgTWVzc2FnZUNoYW5uZWw8InUiKXt2YXIgSD1uZXcgTWVzc2FnZUNoYW5uZWwsRz1ILnBvcnQyO0gucG9ydDEub25tZXNzYWdlPUIsYWU9ZnVuY3Rpb24oKXtHLnBvc3RNZXNzYWdlKG51bGwpfX1lbHNlIGFlPWZ1bmN0aW9uKCl7UyhCLDApfTtmdW5jdGlvbiBDKEUpe1Q9RSxifHwoYj0hMCxhZSgpKX1mdW5jdGlvbiAkKEUsQSl7Tj1TKGZ1bmN0aW9uKCl7RShlLnVuc3RhYmxlX25vdygpKX0sQSl9ZS51bnN0YWJsZV9JZGxlUHJpb3JpdHk9NSxlLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5PTEsZS51bnN0YWJsZV9Mb3dQcmlvcml0eT00LGUudW5zdGFibGVfTm9ybWFsUHJpb3JpdHk9MyxlLnVuc3RhYmxlX1Byb2ZpbGluZz1udWxsLGUudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHk9MixlLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrPWZ1bmN0aW9uKEUpe0UuY2FsbGJhY2s9bnVsbH0sZS51bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbj1mdW5jdGlvbigpe218fGh8fChtPSEwLEMoaykpfSxlLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKEUpezA+RXx8MTI1PEU/Y29uc29sZS5lcnJvcigiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkIik6RD0wPEU/TWF0aC5mbG9vcigxZTMvRSk6NX0sZS51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbD1mdW5jdGlvbigpe3JldHVybiBmfSxlLnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIG4oYSl9LGUudW5zdGFibGVfbmV4dD1mdW5jdGlvbihFKXtzd2l0Y2goZil7Y2FzZSAxOmNhc2UgMjpjYXNlIDM6dmFyIEE9MzticmVhaztkZWZhdWx0OkE9Zn12YXIgUj1mO2Y9QTt0cnl7cmV0dXJuIEUoKX1maW5hbGx5e2Y9Un19LGUudW5zdGFibGVfcGF1c2VFeGVjdXRpb249ZnVuY3Rpb24oKXt9LGUudW5zdGFibGVfcmVxdWVzdFBhaW50PWZ1bmN0aW9uKCl7fSxlLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eT1mdW5jdGlvbihFLEEpe3N3aXRjaChFKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6RT0zfXZhciBSPWY7Zj1FO3RyeXtyZXR1cm4gQSgpfWZpbmFsbHl7Zj1SfX0sZS51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrPWZ1bmN0aW9uKEUsQSxSKXt2YXIgej1lLnVuc3RhYmxlX25vdygpO3N3aXRjaCh0eXBlb2YgUj09Im9iamVjdCImJlIhPT1udWxsPyhSPVIuZGVsYXksUj10eXBlb2YgUj09Im51bWJlciImJjA8Uj96K1I6eik6Uj16LEUpe2Nhc2UgMTp2YXIgVj0tMTticmVhaztjYXNlIDI6Vj0yNTA7YnJlYWs7Y2FzZSA1OlY9MTA3Mzc0MTgyMzticmVhaztjYXNlIDQ6Vj0xZTQ7YnJlYWs7ZGVmYXVsdDpWPTVlM31yZXR1cm4gVj1SK1YsRT17aWQ6YysrLGNhbGxiYWNrOkEscHJpb3JpdHlMZXZlbDpFLHN0YXJ0VGltZTpSLGV4cGlyYXRpb25UaW1lOlYsc29ydEluZGV4Oi0xfSxSPno/KEUuc29ydEluZGV4PVIsdCh1LEUpLG4oYSk9PT1udWxsJiZFPT09bih1KSYmKGc/KHYoTiksTj0tMSk6Zz0hMCwkKHcsUi16KSkpOihFLnNvcnRJbmRleD1WLHQoYSxFKSxtfHxofHwobT0hMCxDKGspKSksRX0sZS51bnN0YWJsZV9zaG91bGRZaWVsZD1qLGUudW5zdGFibGVfd3JhcENhbGxiYWNrPWZ1bmN0aW9uKEUpe3ZhciBBPWY7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIFI9ZjtmPUE7dHJ5e3JldHVybiBFLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e2Y9Un19fX0pKGcxKTtwMS5leHBvcnRzPWcxO3ZhciB0JD1wMS5leHBvcnRzOy8qKgogKiBAbGljZW5zZSBSZWFjdAogKiByZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBtMT1wLGtuPXQkO2Z1bmN0aW9uIFUoZSl7Zm9yKHZhciB0PSJodHRwczovL3JlYWN0anMub3JnL2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD0iK2Usbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdCs9IiZhcmdzW109IitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW25dKTtyZXR1cm4iTWluaWZpZWQgUmVhY3QgZXJyb3IgIyIrZSsiOyB2aXNpdCAiK3QrIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIn12YXIgdjE9bmV3IFNldCxYcz17fTtmdW5jdGlvbiBfaShlLHQpe3hsKGUsdCkseGwoZSsiQ2FwdHVyZSIsdCl9ZnVuY3Rpb24geGwoZSx0KXtmb3IoWHNbZV09dCxlPTA7ZTx0Lmxlbmd0aDtlKyspdjEuYWRkKHRbZV0pfXZhciB6cj0hKHR5cGVvZiB3aW5kb3c+InUifHx0eXBlb2Ygd2luZG93LmRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PiJ1IiksemY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxuJD0vXls6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXVs6QS1aX2Etelx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDJGRlx1MDM3MC1cdTAzN0RcdTAzN0YtXHUxRkZGXHUyMDBDLVx1MjAwRFx1MjA3MC1cdTIxOEZcdTJDMDAtXHUyRkVGXHUzMDAxLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkZEXC0uMC05XHUwMEI3XHUwMzAwLVx1MDM2Rlx1MjAzRi1cdTIwNDBdKiQvLGV2PXt9LHR2PXt9O2Z1bmN0aW9uIHIkKGUpe3JldHVybiB6Zi5jYWxsKHR2LGUpPyEwOnpmLmNhbGwoZXYsZSk/ITE6biQudGVzdChlKT90dltlXT0hMDooZXZbZV09ITAsITEpfWZ1bmN0aW9uIG8kKGUsdCxuLHIpe2lmKG4hPT1udWxsJiZuLnR5cGU9PT0wKXJldHVybiExO3N3aXRjaCh0eXBlb2YgdCl7Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOnJldHVybiEwO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIHI/ITE6biE9PW51bGw/IW4uYWNjZXB0c0Jvb2xlYW5zOihlPWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLDUpLGUhPT0iZGF0YS0iJiZlIT09ImFyaWEtIik7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gaSQoZSx0LG4scil7aWYodD09PW51bGx8fHR5cGVvZiB0PiJ1Inx8byQoZSx0LG4scikpcmV0dXJuITA7aWYocilyZXR1cm4hMTtpZihuIT09bnVsbClzd2l0Y2gobi50eXBlKXtjYXNlIDM6cmV0dXJuIXQ7Y2FzZSA0OnJldHVybiB0PT09ITE7Y2FzZSA1OnJldHVybiBpc05hTih0KTtjYXNlIDY6cmV0dXJuIGlzTmFOKHQpfHwxPnR9cmV0dXJuITF9ZnVuY3Rpb24gc24oZSx0LG4scixvLGksbCl7dGhpcy5hY2NlcHRzQm9vbGVhbnM9dD09PTJ8fHQ9PT0zfHx0PT09NCx0aGlzLmF0dHJpYnV0ZU5hbWU9cix0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZT1vLHRoaXMubXVzdFVzZVByb3BlcnR5PW4sdGhpcy5wcm9wZXJ0eU5hbWU9ZSx0aGlzLnR5cGU9dCx0aGlzLnNhbml0aXplVVJMPWksdGhpcy5yZW1vdmVFbXB0eVN0cmluZz1sfXZhciBJdD17fTsiY2hpbGRyZW4gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgZGVmYXVsdFZhbHVlIGRlZmF1bHRDaGVja2VkIGlubmVySFRNTCBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIHN0eWxlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7SXRbZV09bmV3IHNuKGUsMCwhMSxlLG51bGwsITEsITEpfSk7W1siYWNjZXB0Q2hhcnNldCIsImFjY2VwdC1jaGFyc2V0Il0sWyJjbGFzc05hbWUiLCJjbGFzcyJdLFsiaHRtbEZvciIsImZvciJdLFsiaHR0cEVxdWl2IiwiaHR0cC1lcXVpdiJdXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWVbMF07SXRbdF09bmV3IHNuKHQsMSwhMSxlWzFdLG51bGwsITEsITEpfSk7WyJjb250ZW50RWRpdGFibGUiLCJkcmFnZ2FibGUiLCJzcGVsbENoZWNrIiwidmFsdWUiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0l0W2VdPW5ldyBzbihlLDIsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJhdXRvUmV2ZXJzZSIsImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiLCJmb2N1c2FibGUiLCJwcmVzZXJ2ZUFscGhhIl0uZm9yRWFjaChmdW5jdGlvbihlKXtJdFtlXT1uZXcgc24oZSwyLCExLGUsbnVsbCwhMSwhMSl9KTsiYWxsb3dGdWxsU2NyZWVuIGFzeW5jIGF1dG9Gb2N1cyBhdXRvUGxheSBjb250cm9scyBkZWZhdWx0IGRlZmVyIGRpc2FibGVkIGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIGRpc2FibGVSZW1vdGVQbGF5YmFjayBmb3JtTm9WYWxpZGF0ZSBoaWRkZW4gbG9vcCBub01vZHVsZSBub1ZhbGlkYXRlIG9wZW4gcGxheXNJbmxpbmUgcmVhZE9ubHkgcmVxdWlyZWQgcmV2ZXJzZWQgc2NvcGVkIHNlYW1sZXNzIGl0ZW1TY29wZSIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0l0W2VdPW5ldyBzbihlLDMsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7WyJjaGVja2VkIiwibXVsdGlwbGUiLCJtdXRlZCIsInNlbGVjdGVkIl0uZm9yRWFjaChmdW5jdGlvbihlKXtJdFtlXT1uZXcgc24oZSwzLCEwLGUsbnVsbCwhMSwhMSl9KTtbImNhcHR1cmUiLCJkb3dubG9hZCJdLmZvckVhY2goZnVuY3Rpb24oZSl7SXRbZV09bmV3IHNuKGUsNCwhMSxlLG51bGwsITEsITEpfSk7WyJjb2xzIiwicm93cyIsInNpemUiLCJzcGFuIl0uZm9yRWFjaChmdW5jdGlvbihlKXtJdFtlXT1uZXcgc24oZSw2LCExLGUsbnVsbCwhMSwhMSl9KTtbInJvd1NwYW4iLCJzdGFydCJdLmZvckVhY2goZnVuY3Rpb24oZSl7SXRbZV09bmV3IHNuKGUsNSwhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTt2YXIgV3A9L1tcLTpdKFthLXpdKS9nO2Z1bmN0aW9uIFVwKGUpe3JldHVybiBlWzFdLnRvVXBwZXJDYXNlKCl9ImFjY2VudC1oZWlnaHQgYWxpZ25tZW50LWJhc2VsaW5lIGFyYWJpYy1mb3JtIGJhc2VsaW5lLXNoaWZ0IGNhcC1oZWlnaHQgY2xpcC1wYXRoIGNsaXAtcnVsZSBjb2xvci1pbnRlcnBvbGF0aW9uIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyBjb2xvci1wcm9maWxlIGNvbG9yLXJlbmRlcmluZyBkb21pbmFudC1iYXNlbGluZSBlbmFibGUtYmFja2dyb3VuZCBmaWxsLW9wYWNpdHkgZmlsbC1ydWxlIGZsb29kLWNvbG9yIGZsb29kLW9wYWNpdHkgZm9udC1mYW1pbHkgZm9udC1zaXplIGZvbnQtc2l6ZS1hZGp1c3QgZm9udC1zdHJldGNoIGZvbnQtc3R5bGUgZm9udC12YXJpYW50IGZvbnQtd2VpZ2h0IGdseXBoLW5hbWUgZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCBnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCBob3Jpei1hZHYteCBob3Jpei1vcmlnaW4teCBpbWFnZS1yZW5kZXJpbmcgbGV0dGVyLXNwYWNpbmcgbGlnaHRpbmctY29sb3IgbWFya2VyLWVuZCBtYXJrZXItbWlkIG1hcmtlci1zdGFydCBvdmVybGluZS1wb3NpdGlvbiBvdmVybGluZS10aGlja25lc3MgcGFpbnQtb3JkZXIgcGFub3NlLTEgcG9pbnRlci1ldmVudHMgcmVuZGVyaW5nLWludGVudCBzaGFwZS1yZW5kZXJpbmcgc3RvcC1jb2xvciBzdG9wLW9wYWNpdHkgc3RyaWtldGhyb3VnaC1wb3NpdGlvbiBzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyBzdHJva2UtZGFzaGFycmF5IHN0cm9rZS1kYXNob2Zmc2V0IHN0cm9rZS1saW5lY2FwIHN0cm9rZS1saW5lam9pbiBzdHJva2UtbWl0ZXJsaW1pdCBzdHJva2Utb3BhY2l0eSBzdHJva2Utd2lkdGggdGV4dC1hbmNob3IgdGV4dC1kZWNvcmF0aW9uIHRleHQtcmVuZGVyaW5nIHVuZGVybGluZS1wb3NpdGlvbiB1bmRlcmxpbmUtdGhpY2tuZXNzIHVuaWNvZGUtYmlkaSB1bmljb2RlLXJhbmdlIHVuaXRzLXBlci1lbSB2LWFscGhhYmV0aWMgdi1oYW5naW5nIHYtaWRlb2dyYXBoaWMgdi1tYXRoZW1hdGljYWwgdmVjdG9yLWVmZmVjdCB2ZXJ0LWFkdi15IHZlcnQtb3JpZ2luLXggdmVydC1vcmlnaW4teSB3b3JkLXNwYWNpbmcgd3JpdGluZy1tb2RlIHhtbG5zOnhsaW5rIHgtaGVpZ2h0Ii5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFdwLFVwKTtJdFt0XT1uZXcgc24odCwxLCExLGUsbnVsbCwhMSwhMSl9KTsieGxpbms6YWN0dWF0ZSB4bGluazphcmNyb2xlIHhsaW5rOnJvbGUgeGxpbms6c2hvdyB4bGluazp0aXRsZSB4bGluazp0eXBlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFdwLFVwKTtJdFt0XT1uZXcgc24odCwxLCExLGUsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCExLCExKX0pO1sieG1sOmJhc2UiLCJ4bWw6bGFuZyIsInhtbDpzcGFjZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFdwLFVwKTtJdFt0XT1uZXcgc24odCwxLCExLGUsImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsITEsITEpfSk7WyJ0YWJJbmRleCIsImNyb3NzT3JpZ2luIl0uZm9yRWFjaChmdW5jdGlvbihlKXtJdFtlXT1uZXcgc24oZSwxLCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO0l0LnhsaW5rSHJlZj1uZXcgc24oInhsaW5rSHJlZiIsMSwhMSwieGxpbms6aHJlZiIsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCEwLCExKTtbInNyYyIsImhyZWYiLCJhY3Rpb24iLCJmb3JtQWN0aW9uIl0uZm9yRWFjaChmdW5jdGlvbihlKXtJdFtlXT1uZXcgc24oZSwxLCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCEwLCEwKX0pO2Z1bmN0aW9uIFZwKGUsdCxuLHIpe3ZhciBvPUl0Lmhhc093blByb3BlcnR5KHQpP0l0W3RdOm51bGw7KG8hPT1udWxsP28udHlwZSE9PTA6cnx8ISgyPHQubGVuZ3RoKXx8dFswXSE9PSJvIiYmdFswXSE9PSJPInx8dFsxXSE9PSJuIiYmdFsxXSE9PSJOIikmJihpJCh0LG4sbyxyKSYmKG49bnVsbCkscnx8bz09PW51bGw/ciQodCkmJihuPT09bnVsbD9lLnJlbW92ZUF0dHJpYnV0ZSh0KTplLnNldEF0dHJpYnV0ZSh0LCIiK24pKTpvLm11c3RVc2VQcm9wZXJ0eT9lW28ucHJvcGVydHlOYW1lXT1uPT09bnVsbD9vLnR5cGU9PT0zPyExOiIiOm46KHQ9by5hdHRyaWJ1dGVOYW1lLHI9by5hdHRyaWJ1dGVOYW1lc3BhY2Usbj09PW51bGw/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6KG89by50eXBlLG49bz09PTN8fG89PT00JiZuPT09ITA/IiI6IiIrbixyP2Uuc2V0QXR0cmlidXRlTlMocix0LG4pOmUuc2V0QXR0cmlidXRlKHQsbikpKSl9dmFyIEtyPW0xLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELFFhPVN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKSxIaT1TeW1ib2wuZm9yKCJyZWFjdC5wb3J0YWwiKSxLaT1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLEhwPVN5bWJvbC5mb3IoInJlYWN0LnN0cmljdF9tb2RlIiksRmY9U3ltYm9sLmZvcigicmVhY3QucHJvZmlsZXIiKSx5MT1TeW1ib2wuZm9yKCJyZWFjdC5wcm92aWRlciIpLHgxPVN5bWJvbC5mb3IoInJlYWN0LmNvbnRleHQiKSxLcD1TeW1ib2wuZm9yKCJyZWFjdC5mb3J3YXJkX3JlZiIpLEJmPVN5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlIiksV2Y9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2VfbGlzdCIpLEdwPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxhbz1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksdzE9U3ltYm9sLmZvcigicmVhY3Qub2Zmc2NyZWVuIiksbnY9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIHJzKGUpe3JldHVybiBlPT09bnVsbHx8dHlwZW9mIGUhPSJvYmplY3QiP251bGw6KGU9bnYmJmVbbnZdfHxlWyJAQGl0ZXJhdG9yIl0sdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZTpudWxsKX12YXIgbnQ9T2JqZWN0LmFzc2lnbixWZDtmdW5jdGlvbiB5cyhlKXtpZihWZD09PXZvaWQgMCl0cnl7dGhyb3cgRXJyb3IoKX1jYXRjaChuKXt2YXIgdD1uLnN0YWNrLnRyaW0oKS5tYXRjaCgvXG4oICooYXQgKT8pLyk7VmQ9dCYmdFsxXXx8IiJ9cmV0dXJuYApgK1ZkK2V9dmFyIEhkPSExO2Z1bmN0aW9uIEtkKGUsdCl7aWYoIWV8fEhkKXJldHVybiIiO0hkPSEwO3ZhciBuPUVycm9yLnByZXBhcmVTdGFja1RyYWNlO0Vycm9yLnByZXBhcmVTdGFja1RyYWNlPXZvaWQgMDt0cnl7aWYodClpZih0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJwcm9wcyIse3NldDpmdW5jdGlvbigpe3Rocm93IEVycm9yKCl9fSksdHlwZW9mIFJlZmxlY3Q9PSJvYmplY3QiJiZSZWZsZWN0LmNvbnN0cnVjdCl7dHJ5e1JlZmxlY3QuY29uc3RydWN0KHQsW10pfWNhdGNoKHUpe3ZhciByPXV9UmVmbGVjdC5jb25zdHJ1Y3QoZSxbXSx0KX1lbHNle3RyeXt0LmNhbGwoKX1jYXRjaCh1KXtyPXV9ZS5jYWxsKHQucHJvdG90eXBlKX1lbHNle3RyeXt0aHJvdyBFcnJvcigpfWNhdGNoKHUpe3I9dX1lKCl9fWNhdGNoKHUpe2lmKHUmJnImJnR5cGVvZiB1LnN0YWNrPT0ic3RyaW5nIil7Zm9yKHZhciBvPXUuc3RhY2suc3BsaXQoYApgKSxpPXIuc3RhY2suc3BsaXQoYApgKSxsPW8ubGVuZ3RoLTEscz1pLmxlbmd0aC0xOzE8PWwmJjA8PXMmJm9bbF0hPT1pW3NdOylzLS07Zm9yKDsxPD1sJiYwPD1zO2wtLSxzLS0paWYob1tsXSE9PWlbc10pe2lmKGwhPT0xfHxzIT09MSlkbyBpZihsLS0scy0tLDA+c3x8b1tsXSE9PWlbc10pe3ZhciBhPWAKYCtvW2xdLnJlcGxhY2UoIiBhdCBuZXcgIiwiIGF0ICIpO3JldHVybiBlLmRpc3BsYXlOYW1lJiZhLmluY2x1ZGVzKCI8YW5vbnltb3VzPiIpJiYoYT1hLnJlcGxhY2UoIjxhbm9ueW1vdXM+IixlLmRpc3BsYXlOYW1lKSksYX13aGlsZSgxPD1sJiYwPD1zKTticmVha319fWZpbmFsbHl7SGQ9ITEsRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9bn1yZXR1cm4oZT1lP2UuZGlzcGxheU5hbWV8fGUubmFtZToiIik/eXMoZSk6IiJ9ZnVuY3Rpb24gbCQoZSl7c3dpdGNoKGUudGFnKXtjYXNlIDU6cmV0dXJuIHlzKGUudHlwZSk7Y2FzZSAxNjpyZXR1cm4geXMoIkxhenkiKTtjYXNlIDEzOnJldHVybiB5cygiU3VzcGVuc2UiKTtjYXNlIDE5OnJldHVybiB5cygiU3VzcGVuc2VMaXN0Iik7Y2FzZSAwOmNhc2UgMjpjYXNlIDE1OnJldHVybiBlPUtkKGUudHlwZSwhMSksZTtjYXNlIDExOnJldHVybiBlPUtkKGUudHlwZS5yZW5kZXIsITEpLGU7Y2FzZSAxOnJldHVybiBlPUtkKGUudHlwZSwhMCksZTtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBVZihlKXtpZihlPT1udWxsKXJldHVybiBudWxsO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiBlLmRpc3BsYXlOYW1lfHxlLm5hbWV8fG51bGw7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiBlO3N3aXRjaChlKXtjYXNlIEtpOnJldHVybiJGcmFnbWVudCI7Y2FzZSBIaTpyZXR1cm4iUG9ydGFsIjtjYXNlIEZmOnJldHVybiJQcm9maWxlciI7Y2FzZSBIcDpyZXR1cm4iU3RyaWN0TW9kZSI7Y2FzZSBCZjpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgV2Y6cmV0dXJuIlN1c3BlbnNlTGlzdCJ9aWYodHlwZW9mIGU9PSJvYmplY3QiKXN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIHgxOnJldHVybihlLmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuQ29uc3VtZXIiO2Nhc2UgeTE6cmV0dXJuKGUuX2NvbnRleHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Qcm92aWRlciI7Y2FzZSBLcDp2YXIgdD1lLnJlbmRlcjtyZXR1cm4gZT1lLmRpc3BsYXlOYW1lLGV8fChlPXQuZGlzcGxheU5hbWV8fHQubmFtZXx8IiIsZT1lIT09IiI/IkZvcndhcmRSZWYoIitlKyIpIjoiRm9yd2FyZFJlZiIpLGU7Y2FzZSBHcDpyZXR1cm4gdD1lLmRpc3BsYXlOYW1lfHxudWxsLHQhPT1udWxsP3Q6VWYoZS50eXBlKXx8Ik1lbW8iO2Nhc2UgYW86dD1lLl9wYXlsb2FkLGU9ZS5faW5pdDt0cnl7cmV0dXJuIFVmKGUodCkpfWNhdGNoe319cmV0dXJuIG51bGx9ZnVuY3Rpb24gcyQoZSl7dmFyIHQ9ZS50eXBlO3N3aXRjaChlLnRhZyl7Y2FzZSAyNDpyZXR1cm4iQ2FjaGUiO2Nhc2UgOTpyZXR1cm4odC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLkNvbnN1bWVyIjtjYXNlIDEwOnJldHVybih0Ll9jb250ZXh0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuUHJvdmlkZXIiO2Nhc2UgMTg6cmV0dXJuIkRlaHlkcmF0ZWRGcmFnbWVudCI7Y2FzZSAxMTpyZXR1cm4gZT10LnJlbmRlcixlPWUuZGlzcGxheU5hbWV8fGUubmFtZXx8IiIsdC5kaXNwbGF5TmFtZXx8KGUhPT0iIj8iRm9yd2FyZFJlZigiK2UrIikiOiJGb3J3YXJkUmVmIik7Y2FzZSA3OnJldHVybiJGcmFnbWVudCI7Y2FzZSA1OnJldHVybiB0O2Nhc2UgNDpyZXR1cm4iUG9ydGFsIjtjYXNlIDM6cmV0dXJuIlJvb3QiO2Nhc2UgNjpyZXR1cm4iVGV4dCI7Y2FzZSAxNjpyZXR1cm4gVWYodCk7Y2FzZSA4OnJldHVybiB0PT09SHA/IlN0cmljdE1vZGUiOiJNb2RlIjtjYXNlIDIyOnJldHVybiJPZmZzY3JlZW4iO2Nhc2UgMTI6cmV0dXJuIlByb2ZpbGVyIjtjYXNlIDIxOnJldHVybiJTY29wZSI7Y2FzZSAxMzpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgMTk6cmV0dXJuIlN1c3BlbnNlTGlzdCI7Y2FzZSAyNTpyZXR1cm4iVHJhY2luZ01hcmtlciI7Y2FzZSAxOmNhc2UgMDpjYXNlIDE3OmNhc2UgMjpjYXNlIDE0OmNhc2UgMTU6aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiIpcmV0dXJuIHQuZGlzcGxheU5hbWV8fHQubmFtZXx8bnVsbDtpZih0eXBlb2YgdD09InN0cmluZyIpcmV0dXJuIHR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gTm8oZSl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlImJvb2xlYW4iOmNhc2UibnVtYmVyIjpjYXNlInN0cmluZyI6Y2FzZSJ1bmRlZmluZWQiOnJldHVybiBlO2Nhc2Uib2JqZWN0IjpyZXR1cm4gZTtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBfMShlKXt2YXIgdD1lLnR5cGU7cmV0dXJuKGU9ZS5ub2RlTmFtZSkmJmUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJih0PT09ImNoZWNrYm94Inx8dD09PSJyYWRpbyIpfWZ1bmN0aW9uIGEkKGUpe3ZhciB0PV8xKGUpPyJjaGVja2VkIjoidmFsdWUiLG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSx0KSxyPSIiK2VbdF07aWYoIWUuaGFzT3duUHJvcGVydHkodCkmJnR5cGVvZiBuPCJ1IiYmdHlwZW9mIG4uZ2V0PT0iZnVuY3Rpb24iJiZ0eXBlb2Ygbi5zZXQ9PSJmdW5jdGlvbiIpe3ZhciBvPW4uZ2V0LGk9bi5zZXQ7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5jYWxsKHRoaXMpfSxzZXQ6ZnVuY3Rpb24obCl7cj0iIitsLGkuY2FsbCh0aGlzLGwpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6bi5lbnVtZXJhYmxlfSkse2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LHNldFZhbHVlOmZ1bmN0aW9uKGwpe3I9IiIrbH0sc3RvcFRyYWNraW5nOmZ1bmN0aW9uKCl7ZS5fdmFsdWVUcmFja2VyPW51bGwsZGVsZXRlIGVbdF19fX19ZnVuY3Rpb24gSmEoZSl7ZS5fdmFsdWVUcmFja2VyfHwoZS5fdmFsdWVUcmFja2VyPWEkKGUpKX1mdW5jdGlvbiBTMShlKXtpZighZSlyZXR1cm4hMTt2YXIgdD1lLl92YWx1ZVRyYWNrZXI7aWYoIXQpcmV0dXJuITA7dmFyIG49dC5nZXRWYWx1ZSgpLHI9IiI7cmV0dXJuIGUmJihyPV8xKGUpP2UuY2hlY2tlZD8idHJ1ZSI6ImZhbHNlIjplLnZhbHVlKSxlPXIsZSE9PW4/KHQuc2V0VmFsdWUoZSksITApOiExfWZ1bmN0aW9uIEd1KGUpe2lmKGU9ZXx8KHR5cGVvZiBkb2N1bWVudDwidSI/ZG9jdW1lbnQ6dm9pZCAwKSx0eXBlb2YgZT4idSIpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBlLmFjdGl2ZUVsZW1lbnR8fGUuYm9keX1jYXRjaHtyZXR1cm4gZS5ib2R5fX1mdW5jdGlvbiBWZihlLHQpe3ZhciBuPXQuY2hlY2tlZDtyZXR1cm4gbnQoe30sdCx7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6dm9pZCAwLGNoZWNrZWQ6bj8/ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkfSl9ZnVuY3Rpb24gcnYoZSx0KXt2YXIgbj10LmRlZmF1bHRWYWx1ZT09bnVsbD8iIjp0LmRlZmF1bHRWYWx1ZSxyPXQuY2hlY2tlZCE9bnVsbD90LmNoZWNrZWQ6dC5kZWZhdWx0Q2hlY2tlZDtuPU5vKHQudmFsdWUhPW51bGw/dC52YWx1ZTpuKSxlLl93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOnIsaW5pdGlhbFZhbHVlOm4sY29udHJvbGxlZDp0LnR5cGU9PT0iY2hlY2tib3gifHx0LnR5cGU9PT0icmFkaW8iP3QuY2hlY2tlZCE9bnVsbDp0LnZhbHVlIT1udWxsfX1mdW5jdGlvbiBFMShlLHQpe3Q9dC5jaGVja2VkLHQhPW51bGwmJlZwKGUsImNoZWNrZWQiLHQsITEpfWZ1bmN0aW9uIEhmKGUsdCl7RTEoZSx0KTt2YXIgbj1Obyh0LnZhbHVlKSxyPXQudHlwZTtpZihuIT1udWxsKXI9PT0ibnVtYmVyIj8obj09PTAmJmUudmFsdWU9PT0iInx8ZS52YWx1ZSE9bikmJihlLnZhbHVlPSIiK24pOmUudmFsdWUhPT0iIituJiYoZS52YWx1ZT0iIituKTtlbHNlIGlmKHI9PT0ic3VibWl0Inx8cj09PSJyZXNldCIpe2UucmVtb3ZlQXR0cmlidXRlKCJ2YWx1ZSIpO3JldHVybn10Lmhhc093blByb3BlcnR5KCJ2YWx1ZSIpP0tmKGUsdC50eXBlLG4pOnQuaGFzT3duUHJvcGVydHkoImRlZmF1bHRWYWx1ZSIpJiZLZihlLHQudHlwZSxObyh0LmRlZmF1bHRWYWx1ZSkpLHQuY2hlY2tlZD09bnVsbCYmdC5kZWZhdWx0Q2hlY2tlZCE9bnVsbCYmKGUuZGVmYXVsdENoZWNrZWQ9ISF0LmRlZmF1bHRDaGVja2VkKX1mdW5jdGlvbiBvdihlLHQsbil7aWYodC5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKXx8dC5oYXNPd25Qcm9wZXJ0eSgiZGVmYXVsdFZhbHVlIikpe3ZhciByPXQudHlwZTtpZighKHIhPT0ic3VibWl0IiYmciE9PSJyZXNldCJ8fHQudmFsdWUhPT12b2lkIDAmJnQudmFsdWUhPT1udWxsKSlyZXR1cm47dD0iIitlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlLG58fHQ9PT1lLnZhbHVlfHwoZS52YWx1ZT10KSxlLmRlZmF1bHRWYWx1ZT10fW49ZS5uYW1lLG4hPT0iIiYmKGUubmFtZT0iIiksZS5kZWZhdWx0Q2hlY2tlZD0hIWUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZCxuIT09IiImJihlLm5hbWU9bil9ZnVuY3Rpb24gS2YoZSx0LG4peyh0IT09Im51bWJlciJ8fEd1KGUub3duZXJEb2N1bWVudCkhPT1lKSYmKG49PW51bGw/ZS5kZWZhdWx0VmFsdWU9IiIrZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTplLmRlZmF1bHRWYWx1ZSE9PSIiK24mJihlLmRlZmF1bHRWYWx1ZT0iIituKSl9dmFyIHhzPUFycmF5LmlzQXJyYXk7ZnVuY3Rpb24gc2woZSx0LG4scil7aWYoZT1lLm9wdGlvbnMsdCl7dD17fTtmb3IodmFyIG89MDtvPG4ubGVuZ3RoO28rKyl0WyIkIituW29dXT0hMDtmb3Iobj0wO248ZS5sZW5ndGg7bisrKW89dC5oYXNPd25Qcm9wZXJ0eSgiJCIrZVtuXS52YWx1ZSksZVtuXS5zZWxlY3RlZCE9PW8mJihlW25dLnNlbGVjdGVkPW8pLG8mJnImJihlW25dLmRlZmF1bHRTZWxlY3RlZD0hMCl9ZWxzZXtmb3Iobj0iIitObyhuKSx0PW51bGwsbz0wO288ZS5sZW5ndGg7bysrKXtpZihlW29dLnZhbHVlPT09bil7ZVtvXS5zZWxlY3RlZD0hMCxyJiYoZVtvXS5kZWZhdWx0U2VsZWN0ZWQ9ITApO3JldHVybn10IT09bnVsbHx8ZVtvXS5kaXNhYmxlZHx8KHQ9ZVtvXSl9dCE9PW51bGwmJih0LnNlbGVjdGVkPSEwKX19ZnVuY3Rpb24gR2YoZSx0KXtpZih0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT1udWxsKXRocm93IEVycm9yKFUoOTEpKTtyZXR1cm4gbnQoe30sdCx7dmFsdWU6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsY2hpbGRyZW46IiIrZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0pfWZ1bmN0aW9uIGl2KGUsdCl7dmFyIG49dC52YWx1ZTtpZihuPT1udWxsKXtpZihuPXQuY2hpbGRyZW4sdD10LmRlZmF1bHRWYWx1ZSxuIT1udWxsKXtpZih0IT1udWxsKXRocm93IEVycm9yKFUoOTIpKTtpZih4cyhuKSl7aWYoMTxuLmxlbmd0aCl0aHJvdyBFcnJvcihVKDkzKSk7bj1uWzBdfXQ9bn10PT1udWxsJiYodD0iIiksbj10fWUuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbFZhbHVlOk5vKG4pfX1mdW5jdGlvbiBDMShlLHQpe3ZhciBuPU5vKHQudmFsdWUpLHI9Tm8odC5kZWZhdWx0VmFsdWUpO24hPW51bGwmJihuPSIiK24sbiE9PWUudmFsdWUmJihlLnZhbHVlPW4pLHQuZGVmYXVsdFZhbHVlPT1udWxsJiZlLmRlZmF1bHRWYWx1ZSE9PW4mJihlLmRlZmF1bHRWYWx1ZT1uKSksciE9bnVsbCYmKGUuZGVmYXVsdFZhbHVlPSIiK3IpfWZ1bmN0aW9uIGx2KGUpe3ZhciB0PWUudGV4dENvbnRlbnQ7dD09PWUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUmJnQhPT0iIiYmdCE9PW51bGwmJihlLnZhbHVlPXQpfWZ1bmN0aW9uICQxKGUpe3N3aXRjaChlKXtjYXNlInN2ZyI6cmV0dXJuImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjtjYXNlIm1hdGgiOnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIjtkZWZhdWx0OnJldHVybiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIn19ZnVuY3Rpb24gWWYoZSx0KXtyZXR1cm4gZT09bnVsbHx8ZT09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj8kMSh0KTplPT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiYmdD09PSJmb3JlaWduT2JqZWN0Ij8iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI6ZX12YXIgWmEsazE9ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBNU0FwcDwidSImJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKHQsbixyLG8pe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGUodCxuLHIsbyl9KX06ZX0oZnVuY3Rpb24oZSx0KXtpZihlLm5hbWVzcGFjZVVSSSE9PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJ8fCJpbm5lckhUTUwiaW4gZSllLmlubmVySFRNTD10O2Vsc2V7Zm9yKFphPVphfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxaYS5pbm5lckhUTUw9Ijxzdmc+Iit0LnZhbHVlT2YoKS50b1N0cmluZygpKyI8L3N2Zz4iLHQ9WmEuZmlyc3RDaGlsZDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtmb3IoO3QuZmlyc3RDaGlsZDspZS5hcHBlbmRDaGlsZCh0LmZpcnN0Q2hpbGQpfX0pO2Z1bmN0aW9uIFFzKGUsdCl7aWYodCl7dmFyIG49ZS5maXJzdENoaWxkO2lmKG4mJm49PT1lLmxhc3RDaGlsZCYmbi5ub2RlVHlwZT09PTMpe24ubm9kZVZhbHVlPXQ7cmV0dXJufX1lLnRleHRDb250ZW50PXR9dmFyIGtzPXthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxhc3BlY3RSYXRpbzohMCxib3JkZXJJbWFnZU91dHNldDohMCxib3JkZXJJbWFnZVNsaWNlOiEwLGJvcmRlckltYWdlV2lkdGg6ITAsYm94RmxleDohMCxib3hGbGV4R3JvdXA6ITAsYm94T3JkaW5hbEdyb3VwOiEwLGNvbHVtbkNvdW50OiEwLGNvbHVtbnM6ITAsZmxleDohMCxmbGV4R3JvdzohMCxmbGV4UG9zaXRpdmU6ITAsZmxleFNocmluazohMCxmbGV4TmVnYXRpdmU6ITAsZmxleE9yZGVyOiEwLGdyaWRBcmVhOiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3BhbjohMCxncmlkUm93U3RhcnQ6ITAsZ3JpZENvbHVtbjohMCxncmlkQ29sdW1uRW5kOiEwLGdyaWRDb2x1bW5TcGFuOiEwLGdyaWRDb2x1bW5TdGFydDohMCxmb250V2VpZ2h0OiEwLGxpbmVDbGFtcDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx0YWJTaXplOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMCxmaWxsT3BhY2l0eTohMCxmbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSx1JD1bIldlYmtpdCIsIm1zIiwiTW96IiwiTyJdO09iamVjdC5rZXlzKGtzKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3UkLmZvckVhY2goZnVuY3Rpb24odCl7dD10K2UuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHJpbmcoMSksa3NbdF09a3NbZV19KX0pO2Z1bmN0aW9uIFQxKGUsdCxuKXtyZXR1cm4gdD09bnVsbHx8dHlwZW9mIHQ9PSJib29sZWFuInx8dD09PSIiPyIiOm58fHR5cGVvZiB0IT0ibnVtYmVyInx8dD09PTB8fGtzLmhhc093blByb3BlcnR5KGUpJiZrc1tlXT8oIiIrdCkudHJpbSgpOnQrInB4In1mdW5jdGlvbiBiMShlLHQpe2U9ZS5zdHlsZTtmb3IodmFyIG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pKXt2YXIgcj1uLmluZGV4T2YoIi0tIik9PT0wLG89VDEobix0W25dLHIpO249PT0iZmxvYXQiJiYobj0iY3NzRmxvYXQiKSxyP2Uuc2V0UHJvcGVydHkobixvKTplW25dPW99fXZhciBjJD1udCh7bWVudWl0ZW06ITB9LHthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9KTtmdW5jdGlvbiBYZihlLHQpe2lmKHQpe2lmKGMkW2VdJiYodC5jaGlsZHJlbiE9bnVsbHx8dC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9bnVsbCkpdGhyb3cgRXJyb3IoVSgxMzcsZSkpO2lmKHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPW51bGwpe2lmKHQuY2hpbGRyZW4hPW51bGwpdGhyb3cgRXJyb3IoVSg2MCkpO2lmKHR5cGVvZiB0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT0ib2JqZWN0Inx8ISgiX19odG1sImluIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKFUoNjEpKX1pZih0LnN0eWxlIT1udWxsJiZ0eXBlb2YgdC5zdHlsZSE9Im9iamVjdCIpdGhyb3cgRXJyb3IoVSg2MikpfX1mdW5jdGlvbiBRZihlLHQpe2lmKGUuaW5kZXhPZigiLSIpPT09LTEpcmV0dXJuIHR5cGVvZiB0LmlzPT0ic3RyaW5nIjtzd2l0Y2goZSl7Y2FzZSJhbm5vdGF0aW9uLXhtbCI6Y2FzZSJjb2xvci1wcm9maWxlIjpjYXNlImZvbnQtZmFjZSI6Y2FzZSJmb250LWZhY2Utc3JjIjpjYXNlImZvbnQtZmFjZS11cmkiOmNhc2UiZm9udC1mYWNlLWZvcm1hdCI6Y2FzZSJmb250LWZhY2UtbmFtZSI6Y2FzZSJtaXNzaW5nLWdseXBoIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX12YXIgSmY9bnVsbDtmdW5jdGlvbiBZcChlKXtyZXR1cm4gZT1lLnRhcmdldHx8ZS5zcmNFbGVtZW50fHx3aW5kb3csZS5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCYmKGU9ZS5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCksZS5ub2RlVHlwZT09PTM/ZS5wYXJlbnROb2RlOmV9dmFyIFpmPW51bGwsYWw9bnVsbCx1bD1udWxsO2Z1bmN0aW9uIHN2KGUpe2lmKGU9T2EoZSkpe2lmKHR5cGVvZiBaZiE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihVKDI4MCkpO3ZhciB0PWUuc3RhdGVOb2RlO3QmJih0PVFjKHQpLFpmKGUuc3RhdGVOb2RlLGUudHlwZSx0KSl9fWZ1bmN0aW9uIE4xKGUpe2FsP3VsP3VsLnB1c2goZSk6dWw9W2VdOmFsPWV9ZnVuY3Rpb24gUjEoKXtpZihhbCl7dmFyIGU9YWwsdD11bDtpZih1bD1hbD1udWxsLHN2KGUpLHQpZm9yKGU9MDtlPHQubGVuZ3RoO2UrKylzdih0W2VdKX19ZnVuY3Rpb24gUDEoZSx0KXtyZXR1cm4gZSh0KX1mdW5jdGlvbiBPMSgpe312YXIgR2Q9ITE7ZnVuY3Rpb24gQTEoZSx0LG4pe2lmKEdkKXJldHVybiBlKHQsbik7R2Q9ITA7dHJ5e3JldHVybiBQMShlLHQsbil9ZmluYWxseXtHZD0hMSwoYWwhPT1udWxsfHx1bCE9PW51bGwpJiYoTzEoKSxSMSgpKX19ZnVuY3Rpb24gSnMoZSx0KXt2YXIgbj1lLnN0YXRlTm9kZTtpZihuPT09bnVsbClyZXR1cm4gbnVsbDt2YXIgcj1RYyhuKTtpZihyPT09bnVsbClyZXR1cm4gbnVsbDtuPXJbdF07ZTpzd2l0Y2godCl7Y2FzZSJvbkNsaWNrIjpjYXNlIm9uQ2xpY2tDYXB0dXJlIjpjYXNlIm9uRG91YmxlQ2xpY2siOmNhc2Uib25Eb3VibGVDbGlja0NhcHR1cmUiOmNhc2Uib25Nb3VzZURvd24iOmNhc2Uib25Nb3VzZURvd25DYXB0dXJlIjpjYXNlIm9uTW91c2VNb3ZlIjpjYXNlIm9uTW91c2VNb3ZlQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlVXAiOmNhc2Uib25Nb3VzZVVwQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRW50ZXIiOihyPSFyLmRpc2FibGVkKXx8KGU9ZS50eXBlLHI9IShlPT09ImJ1dHRvbiJ8fGU9PT0iaW5wdXQifHxlPT09InNlbGVjdCJ8fGU9PT0idGV4dGFyZWEiKSksZT0hcjticmVhayBlO2RlZmF1bHQ6ZT0hMX1pZihlKXJldHVybiBudWxsO2lmKG4mJnR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFUoMjMxLHQsdHlwZW9mIG4pKTtyZXR1cm4gbn12YXIgcWY9ITE7aWYoenIpdHJ5e3ZhciBvcz17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkob3MsInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtxZj0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsb3Msb3MpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0Iixvcyxvcyl9Y2F0Y2h7cWY9ITF9ZnVuY3Rpb24gZCQoZSx0LG4scixvLGksbCxzLGEpe3ZhciB1PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywzKTt0cnl7dC5hcHBseShuLHUpfWNhdGNoKGMpe3RoaXMub25FcnJvcihjKX19dmFyIFRzPSExLFl1PW51bGwsWHU9ITEsZWg9bnVsbCxmJD17b25FcnJvcjpmdW5jdGlvbihlKXtUcz0hMCxZdT1lfX07ZnVuY3Rpb24gaCQoZSx0LG4scixvLGksbCxzLGEpe1RzPSExLFl1PW51bGwsZCQuYXBwbHkoZiQsYXJndW1lbnRzKX1mdW5jdGlvbiBwJChlLHQsbixyLG8saSxsLHMsYSl7aWYoaCQuYXBwbHkodGhpcyxhcmd1bWVudHMpLFRzKXtpZihUcyl7dmFyIHU9WXU7VHM9ITEsWXU9bnVsbH1lbHNlIHRocm93IEVycm9yKFUoMTk4KSk7WHV8fChYdT0hMCxlaD11KX19ZnVuY3Rpb24gU2koZSl7dmFyIHQ9ZSxuPWU7aWYoZS5hbHRlcm5hdGUpZm9yKDt0LnJldHVybjspdD10LnJldHVybjtlbHNle2U9dDtkbyB0PWUsdC5mbGFncyY0MDk4JiYobj10LnJldHVybiksZT10LnJldHVybjt3aGlsZShlKX1yZXR1cm4gdC50YWc9PT0zP246bnVsbH1mdW5jdGlvbiBNMShlKXtpZihlLnRhZz09PTEzKXt2YXIgdD1lLm1lbW9pemVkU3RhdGU7aWYodD09PW51bGwmJihlPWUuYWx0ZXJuYXRlLGUhPT1udWxsJiYodD1lLm1lbW9pemVkU3RhdGUpKSx0IT09bnVsbClyZXR1cm4gdC5kZWh5ZHJhdGVkfXJldHVybiBudWxsfWZ1bmN0aW9uIGF2KGUpe2lmKFNpKGUpIT09ZSl0aHJvdyBFcnJvcihVKDE4OCkpfWZ1bmN0aW9uIGckKGUpe3ZhciB0PWUuYWx0ZXJuYXRlO2lmKCF0KXtpZih0PVNpKGUpLHQ9PT1udWxsKXRocm93IEVycm9yKFUoMTg4KSk7cmV0dXJuIHQhPT1lP251bGw6ZX1mb3IodmFyIG49ZSxyPXQ7Oyl7dmFyIG89bi5yZXR1cm47aWYobz09PW51bGwpYnJlYWs7dmFyIGk9by5hbHRlcm5hdGU7aWYoaT09PW51bGwpe2lmKHI9by5yZXR1cm4sciE9PW51bGwpe249cjtjb250aW51ZX1icmVha31pZihvLmNoaWxkPT09aS5jaGlsZCl7Zm9yKGk9by5jaGlsZDtpOyl7aWYoaT09PW4pcmV0dXJuIGF2KG8pLGU7aWYoaT09PXIpcmV0dXJuIGF2KG8pLHQ7aT1pLnNpYmxpbmd9dGhyb3cgRXJyb3IoVSgxODgpKX1pZihuLnJldHVybiE9PXIucmV0dXJuKW49byxyPWk7ZWxzZXtmb3IodmFyIGw9ITEscz1vLmNoaWxkO3M7KXtpZihzPT09bil7bD0hMCxuPW8scj1pO2JyZWFrfWlmKHM9PT1yKXtsPSEwLHI9byxuPWk7YnJlYWt9cz1zLnNpYmxpbmd9aWYoIWwpe2ZvcihzPWkuY2hpbGQ7czspe2lmKHM9PT1uKXtsPSEwLG49aSxyPW87YnJlYWt9aWYocz09PXIpe2w9ITAscj1pLG49bzticmVha31zPXMuc2libGluZ31pZighbCl0aHJvdyBFcnJvcihVKDE4OSkpfX1pZihuLmFsdGVybmF0ZSE9PXIpdGhyb3cgRXJyb3IoVSgxOTApKX1pZihuLnRhZyE9PTMpdGhyb3cgRXJyb3IoVSgxODgpKTtyZXR1cm4gbi5zdGF0ZU5vZGUuY3VycmVudD09PW4/ZTp0fWZ1bmN0aW9uIEwxKGUpe3JldHVybiBlPWckKGUpLGUhPT1udWxsP0QxKGUpOm51bGx9ZnVuY3Rpb24gRDEoZSl7aWYoZS50YWc9PT01fHxlLnRhZz09PTYpcmV0dXJuIGU7Zm9yKGU9ZS5jaGlsZDtlIT09bnVsbDspe3ZhciB0PUQxKGUpO2lmKHQhPT1udWxsKXJldHVybiB0O2U9ZS5zaWJsaW5nfXJldHVybiBudWxsfXZhciBJMT1rbi51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLHV2PWtuLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrLG0kPWtuLnVuc3RhYmxlX3Nob3VsZFlpZWxkLHYkPWtuLnVuc3RhYmxlX3JlcXVlc3RQYWludCxjdD1rbi51bnN0YWJsZV9ub3cseSQ9a24udW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsWHA9a24udW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHksajE9a24udW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksUXU9a24udW5zdGFibGVfTm9ybWFsUHJpb3JpdHkseCQ9a24udW5zdGFibGVfTG93UHJpb3JpdHksejE9a24udW5zdGFibGVfSWRsZVByaW9yaXR5LEtjPW51bGwsbXI9bnVsbDtmdW5jdGlvbiB3JChlKXtpZihtciYmdHlwZW9mIG1yLm9uQ29tbWl0RmliZXJSb290PT0iZnVuY3Rpb24iKXRyeXttci5vbkNvbW1pdEZpYmVyUm9vdChLYyxlLHZvaWQgMCwoZS5jdXJyZW50LmZsYWdzJjEyOCk9PT0xMjgpfWNhdGNoe319dmFyIHRyPU1hdGguY2x6MzI/TWF0aC5jbHozMjpFJCxfJD1NYXRoLmxvZyxTJD1NYXRoLkxOMjtmdW5jdGlvbiBFJChlKXtyZXR1cm4gZT4+Pj0wLGU9PT0wPzMyOjMxLShfJChlKS9TJHwwKXwwfXZhciBxYT02NCxldT00MTk0MzA0O2Z1bmN0aW9uIHdzKGUpe3N3aXRjaChlJi1lKXtjYXNlIDE6cmV0dXJuIDE7Y2FzZSAyOnJldHVybiAyO2Nhc2UgNDpyZXR1cm4gNDtjYXNlIDg6cmV0dXJuIDg7Y2FzZSAxNjpyZXR1cm4gMTY7Y2FzZSAzMjpyZXR1cm4gMzI7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpyZXR1cm4gZSY0MTk0MjQwO2Nhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6cmV0dXJuIGUmMTMwMDIzNDI0O2Nhc2UgMTM0MjE3NzI4OnJldHVybiAxMzQyMTc3Mjg7Y2FzZSAyNjg0MzU0NTY6cmV0dXJuIDI2ODQzNTQ1NjtjYXNlIDUzNjg3MDkxMjpyZXR1cm4gNTM2ODcwOTEyO2Nhc2UgMTA3Mzc0MTgyNDpyZXR1cm4gMTA3Mzc0MTgyNDtkZWZhdWx0OnJldHVybiBlfX1mdW5jdGlvbiBKdShlLHQpe3ZhciBuPWUucGVuZGluZ0xhbmVzO2lmKG49PT0wKXJldHVybiAwO3ZhciByPTAsbz1lLnN1c3BlbmRlZExhbmVzLGk9ZS5waW5nZWRMYW5lcyxsPW4mMjY4NDM1NDU1O2lmKGwhPT0wKXt2YXIgcz1sJn5vO3MhPT0wP3I9d3Mocyk6KGkmPWwsaSE9PTAmJihyPXdzKGkpKSl9ZWxzZSBsPW4mfm8sbCE9PTA/cj13cyhsKTppIT09MCYmKHI9d3MoaSkpO2lmKHI9PT0wKXJldHVybiAwO2lmKHQhPT0wJiZ0IT09ciYmISh0Jm8pJiYobz1yJi1yLGk9dCYtdCxvPj1pfHxvPT09MTYmJihpJjQxOTQyNDApIT09MCkpcmV0dXJuIHQ7aWYociY0JiYocnw9biYxNiksdD1lLmVudGFuZ2xlZExhbmVzLHQhPT0wKWZvcihlPWUuZW50YW5nbGVtZW50cyx0Jj1yOzA8dDspbj0zMS10cih0KSxvPTE8PG4scnw9ZVtuXSx0Jj1+bztyZXR1cm4gcn1mdW5jdGlvbiBDJChlLHQpe3N3aXRjaChlKXtjYXNlIDE6Y2FzZSAyOmNhc2UgNDpyZXR1cm4gdCsyNTA7Y2FzZSA4OmNhc2UgMTY6Y2FzZSAzMjpjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiB0KzVlMztjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OnJldHVybi0xO2Nhc2UgMTM0MjE3NzI4OmNhc2UgMjY4NDM1NDU2OmNhc2UgNTM2ODcwOTEyOmNhc2UgMTA3Mzc0MTgyNDpyZXR1cm4tMTtkZWZhdWx0OnJldHVybi0xfX1mdW5jdGlvbiAkJChlLHQpe2Zvcih2YXIgbj1lLnN1c3BlbmRlZExhbmVzLHI9ZS5waW5nZWRMYW5lcyxvPWUuZXhwaXJhdGlvblRpbWVzLGk9ZS5wZW5kaW5nTGFuZXM7MDxpOyl7dmFyIGw9MzEtdHIoaSkscz0xPDxsLGE9b1tsXTthPT09LTE/KCEocyZuKXx8cyZyKSYmKG9bbF09QyQocyx0KSk6YTw9dCYmKGUuZXhwaXJlZExhbmVzfD1zKSxpJj1+c319ZnVuY3Rpb24gdGgoZSl7cmV0dXJuIGU9ZS5wZW5kaW5nTGFuZXMmLTEwNzM3NDE4MjUsZSE9PTA/ZTplJjEwNzM3NDE4MjQ/MTA3Mzc0MTgyNDowfWZ1bmN0aW9uIEYxKCl7dmFyIGU9cWE7cmV0dXJuIHFhPDw9MSwhKHFhJjQxOTQyNDApJiYocWE9NjQpLGV9ZnVuY3Rpb24gWWQoZSl7Zm9yKHZhciB0PVtdLG49MDszMT5uO24rKyl0LnB1c2goZSk7cmV0dXJuIHR9ZnVuY3Rpb24gUmEoZSx0LG4pe2UucGVuZGluZ0xhbmVzfD10LHQhPT01MzY4NzA5MTImJihlLnN1c3BlbmRlZExhbmVzPTAsZS5waW5nZWRMYW5lcz0wKSxlPWUuZXZlbnRUaW1lcyx0PTMxLXRyKHQpLGVbdF09bn1mdW5jdGlvbiBrJChlLHQpe3ZhciBuPWUucGVuZGluZ0xhbmVzJn50O2UucGVuZGluZ0xhbmVzPXQsZS5zdXNwZW5kZWRMYW5lcz0wLGUucGluZ2VkTGFuZXM9MCxlLmV4cGlyZWRMYW5lcyY9dCxlLm11dGFibGVSZWFkTGFuZXMmPXQsZS5lbnRhbmdsZWRMYW5lcyY9dCx0PWUuZW50YW5nbGVtZW50czt2YXIgcj1lLmV2ZW50VGltZXM7Zm9yKGU9ZS5leHBpcmF0aW9uVGltZXM7MDxuOyl7dmFyIG89MzEtdHIobiksaT0xPDxvO3Rbb109MCxyW29dPS0xLGVbb109LTEsbiY9fml9fWZ1bmN0aW9uIFFwKGUsdCl7dmFyIG49ZS5lbnRhbmdsZWRMYW5lc3w9dDtmb3IoZT1lLmVudGFuZ2xlbWVudHM7bjspe3ZhciByPTMxLXRyKG4pLG89MTw8cjtvJnR8ZVtyXSZ0JiYoZVtyXXw9dCksbiY9fm99fXZhciBPZT0wO2Z1bmN0aW9uIEIxKGUpe3JldHVybiBlJj0tZSwxPGU/NDxlP2UmMjY4NDM1NDU1PzE2OjUzNjg3MDkxMjo0OjF9dmFyIFcxLEpwLFUxLFYxLEgxLG5oPSExLHR1PVtdLHhvPW51bGwsd289bnVsbCxfbz1udWxsLFpzPW5ldyBNYXAscXM9bmV3IE1hcCxmbz1bXSxUJD0ibW91c2Vkb3duIG1vdXNldXAgdG91Y2hjYW5jZWwgdG91Y2hlbmQgdG91Y2hzdGFydCBhdXhjbGljayBkYmxjbGljayBwb2ludGVyY2FuY2VsIHBvaW50ZXJkb3duIHBvaW50ZXJ1cCBkcmFnZW5kIGRyYWdzdGFydCBkcm9wIGNvbXBvc2l0aW9uZW5kIGNvbXBvc2l0aW9uc3RhcnQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBpbnB1dCB0ZXh0SW5wdXQgY29weSBjdXQgcGFzdGUgY2xpY2sgY2hhbmdlIGNvbnRleHRtZW51IHJlc2V0IHN1Ym1pdCIuc3BsaXQoIiAiKTtmdW5jdGlvbiBjdihlLHQpe3N3aXRjaChlKXtjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOnhvPW51bGw7YnJlYWs7Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2xlYXZlIjp3bz1udWxsO2JyZWFrO2Nhc2UibW91c2VvdmVyIjpjYXNlIm1vdXNlb3V0Ijpfbz1udWxsO2JyZWFrO2Nhc2UicG9pbnRlcm92ZXIiOmNhc2UicG9pbnRlcm91dCI6WnMuZGVsZXRlKHQucG9pbnRlcklkKTticmVhaztjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpjYXNlImxvc3Rwb2ludGVyY2FwdHVyZSI6cXMuZGVsZXRlKHQucG9pbnRlcklkKX19ZnVuY3Rpb24gaXMoZSx0LG4scixvLGkpe3JldHVybiBlPT09bnVsbHx8ZS5uYXRpdmVFdmVudCE9PWk/KGU9e2Jsb2NrZWRPbjp0LGRvbUV2ZW50TmFtZTpuLGV2ZW50U3lzdGVtRmxhZ3M6cixuYXRpdmVFdmVudDppLHRhcmdldENvbnRhaW5lcnM6W29dfSx0IT09bnVsbCYmKHQ9T2EodCksdCE9PW51bGwmJkpwKHQpKSxlKTooZS5ldmVudFN5c3RlbUZsYWdzfD1yLHQ9ZS50YXJnZXRDb250YWluZXJzLG8hPT1udWxsJiZ0LmluZGV4T2Yobyk9PT0tMSYmdC5wdXNoKG8pLGUpfWZ1bmN0aW9uIGIkKGUsdCxuLHIsbyl7c3dpdGNoKHQpe2Nhc2UiZm9jdXNpbiI6cmV0dXJuIHhvPWlzKHhvLGUsdCxuLHIsbyksITA7Y2FzZSJkcmFnZW50ZXIiOnJldHVybiB3bz1pcyh3byxlLHQsbixyLG8pLCEwO2Nhc2UibW91c2VvdmVyIjpyZXR1cm4gX289aXMoX28sZSx0LG4scixvKSwhMDtjYXNlInBvaW50ZXJvdmVyIjp2YXIgaT1vLnBvaW50ZXJJZDtyZXR1cm4gWnMuc2V0KGksaXMoWnMuZ2V0KGkpfHxudWxsLGUsdCxuLHIsbykpLCEwO2Nhc2UiZ290cG9pbnRlcmNhcHR1cmUiOnJldHVybiBpPW8ucG9pbnRlcklkLHFzLnNldChpLGlzKHFzLmdldChpKXx8bnVsbCxlLHQsbixyLG8pKSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBLMShlKXt2YXIgdD1abyhlLnRhcmdldCk7aWYodCE9PW51bGwpe3ZhciBuPVNpKHQpO2lmKG4hPT1udWxsKXtpZih0PW4udGFnLHQ9PT0xMyl7aWYodD1NMShuKSx0IT09bnVsbCl7ZS5ibG9ja2VkT249dCxIMShlLnByaW9yaXR5LGZ1bmN0aW9uKCl7VTEobil9KTtyZXR1cm59fWVsc2UgaWYodD09PTMmJm4uc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpe2UuYmxvY2tlZE9uPW4udGFnPT09Mz9uLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7cmV0dXJufX19ZS5ibG9ja2VkT249bnVsbH1mdW5jdGlvbiBOdShlKXtpZihlLmJsb2NrZWRPbiE9PW51bGwpcmV0dXJuITE7Zm9yKHZhciB0PWUudGFyZ2V0Q29udGFpbmVyczswPHQubGVuZ3RoOyl7dmFyIG49cmgoZS5kb21FdmVudE5hbWUsZS5ldmVudFN5c3RlbUZsYWdzLHRbMF0sZS5uYXRpdmVFdmVudCk7aWYobj09PW51bGwpe249ZS5uYXRpdmVFdmVudDt2YXIgcj1uZXcgbi5jb25zdHJ1Y3RvcihuLnR5cGUsbik7SmY9cixuLnRhcmdldC5kaXNwYXRjaEV2ZW50KHIpLEpmPW51bGx9ZWxzZSByZXR1cm4gdD1PYShuKSx0IT09bnVsbCYmSnAodCksZS5ibG9ja2VkT249biwhMTt0LnNoaWZ0KCl9cmV0dXJuITB9ZnVuY3Rpb24gZHYoZSx0LG4pe051KGUpJiZuLmRlbGV0ZSh0KX1mdW5jdGlvbiBOJCgpe25oPSExLHhvIT09bnVsbCYmTnUoeG8pJiYoeG89bnVsbCksd28hPT1udWxsJiZOdSh3bykmJih3bz1udWxsKSxfbyE9PW51bGwmJk51KF9vKSYmKF9vPW51bGwpLFpzLmZvckVhY2goZHYpLHFzLmZvckVhY2goZHYpfWZ1bmN0aW9uIGxzKGUsdCl7ZS5ibG9ja2VkT249PT10JiYoZS5ibG9ja2VkT249bnVsbCxuaHx8KG5oPSEwLGtuLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soa24udW5zdGFibGVfTm9ybWFsUHJpb3JpdHksTiQpKSl9ZnVuY3Rpb24gZWEoZSl7ZnVuY3Rpb24gdChvKXtyZXR1cm4gbHMobyxlKX1pZigwPHR1Lmxlbmd0aCl7bHModHVbMF0sZSk7Zm9yKHZhciBuPTE7bjx0dS5sZW5ndGg7bisrKXt2YXIgcj10dVtuXTtyLmJsb2NrZWRPbj09PWUmJihyLmJsb2NrZWRPbj1udWxsKX19Zm9yKHhvIT09bnVsbCYmbHMoeG8sZSksd28hPT1udWxsJiZscyh3byxlKSxfbyE9PW51bGwmJmxzKF9vLGUpLFpzLmZvckVhY2godCkscXMuZm9yRWFjaCh0KSxuPTA7bjxmby5sZW5ndGg7bisrKXI9Zm9bbl0sci5ibG9ja2VkT249PT1lJiYoci5ibG9ja2VkT249bnVsbCk7Zm9yKDswPGZvLmxlbmd0aCYmKG49Zm9bMF0sbi5ibG9ja2VkT249PT1udWxsKTspSzEobiksbi5ibG9ja2VkT249PT1udWxsJiZmby5zaGlmdCgpfXZhciBjbD1Lci5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxadT0hMDtmdW5jdGlvbiBSJChlLHQsbixyKXt2YXIgbz1PZSxpPWNsLnRyYW5zaXRpb247Y2wudHJhbnNpdGlvbj1udWxsO3RyeXtPZT0xLFpwKGUsdCxuLHIpfWZpbmFsbHl7T2U9byxjbC50cmFuc2l0aW9uPWl9fWZ1bmN0aW9uIFAkKGUsdCxuLHIpe3ZhciBvPU9lLGk9Y2wudHJhbnNpdGlvbjtjbC50cmFuc2l0aW9uPW51bGw7dHJ5e09lPTQsWnAoZSx0LG4scil9ZmluYWxseXtPZT1vLGNsLnRyYW5zaXRpb249aX19ZnVuY3Rpb24gWnAoZSx0LG4scil7aWYoWnUpe3ZhciBvPXJoKGUsdCxuLHIpO2lmKG89PT1udWxsKW9mKGUsdCxyLHF1LG4pLGN2KGUscik7ZWxzZSBpZihiJChvLGUsdCxuLHIpKXIuc3RvcFByb3BhZ2F0aW9uKCk7ZWxzZSBpZihjdihlLHIpLHQmNCYmLTE8VCQuaW5kZXhPZihlKSl7Zm9yKDtvIT09bnVsbDspe3ZhciBpPU9hKG8pO2lmKGkhPT1udWxsJiZXMShpKSxpPXJoKGUsdCxuLHIpLGk9PT1udWxsJiZvZihlLHQscixxdSxuKSxpPT09bylicmVhaztvPWl9byE9PW51bGwmJnIuc3RvcFByb3BhZ2F0aW9uKCl9ZWxzZSBvZihlLHQscixudWxsLG4pfX12YXIgcXU9bnVsbDtmdW5jdGlvbiByaChlLHQsbixyKXtpZihxdT1udWxsLGU9WXAociksZT1abyhlKSxlIT09bnVsbClpZih0PVNpKGUpLHQ9PT1udWxsKWU9bnVsbDtlbHNlIGlmKG49dC50YWcsbj09PTEzKXtpZihlPU0xKHQpLGUhPT1udWxsKXJldHVybiBlO2U9bnVsbH1lbHNlIGlmKG49PT0zKXtpZih0LnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXJldHVybiB0LnRhZz09PTM/dC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO2U9bnVsbH1lbHNlIHQhPT1lJiYoZT1udWxsKTtyZXR1cm4gcXU9ZSxudWxsfWZ1bmN0aW9uIEcxKGUpe3N3aXRjaChlKXtjYXNlImNhbmNlbCI6Y2FzZSJjbGljayI6Y2FzZSJjbG9zZSI6Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJhdXhjbGljayI6Y2FzZSJkYmxjbGljayI6Y2FzZSJkcmFnZW5kIjpjYXNlImRyYWdzdGFydCI6Y2FzZSJkcm9wIjpjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOmNhc2UiaW5wdXQiOmNhc2UiaW52YWxpZCI6Y2FzZSJrZXlkb3duIjpjYXNlImtleXByZXNzIjpjYXNlImtleXVwIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJtb3VzZXVwIjpjYXNlInBhc3RlIjpjYXNlInBhdXNlIjpjYXNlInBsYXkiOmNhc2UicG9pbnRlcmNhbmNlbCI6Y2FzZSJwb2ludGVyZG93biI6Y2FzZSJwb2ludGVydXAiOmNhc2UicmF0ZWNoYW5nZSI6Y2FzZSJyZXNldCI6Y2FzZSJyZXNpemUiOmNhc2Uic2Vla2VkIjpjYXNlInN1Ym1pdCI6Y2FzZSJ0b3VjaGNhbmNlbCI6Y2FzZSJ0b3VjaGVuZCI6Y2FzZSJ0b3VjaHN0YXJ0IjpjYXNlInZvbHVtZWNoYW5nZSI6Y2FzZSJjaGFuZ2UiOmNhc2Uic2VsZWN0aW9uY2hhbmdlIjpjYXNlInRleHRJbnB1dCI6Y2FzZSJjb21wb3NpdGlvbnN0YXJ0IjpjYXNlImNvbXBvc2l0aW9uZW5kIjpjYXNlImNvbXBvc2l0aW9udXBkYXRlIjpjYXNlImJlZm9yZWJsdXIiOmNhc2UiYWZ0ZXJibHVyIjpjYXNlImJlZm9yZWlucHV0IjpjYXNlImJsdXIiOmNhc2UiZnVsbHNjcmVlbmNoYW5nZSI6Y2FzZSJmb2N1cyI6Y2FzZSJoYXNoY2hhbmdlIjpjYXNlInBvcHN0YXRlIjpjYXNlInNlbGVjdCI6Y2FzZSJzZWxlY3RzdGFydCI6cmV0dXJuIDE7Y2FzZSJkcmFnIjpjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnZXhpdCI6Y2FzZSJkcmFnbGVhdmUiOmNhc2UiZHJhZ292ZXIiOmNhc2UibW91c2Vtb3ZlIjpjYXNlIm1vdXNlb3V0IjpjYXNlIm1vdXNlb3ZlciI6Y2FzZSJwb2ludGVybW92ZSI6Y2FzZSJwb2ludGVyb3V0IjpjYXNlInBvaW50ZXJvdmVyIjpjYXNlInNjcm9sbCI6Y2FzZSJ0b2dnbGUiOmNhc2UidG91Y2htb3ZlIjpjYXNlIndoZWVsIjpjYXNlIm1vdXNlZW50ZXIiOmNhc2UibW91c2VsZWF2ZSI6Y2FzZSJwb2ludGVyZW50ZXIiOmNhc2UicG9pbnRlcmxlYXZlIjpyZXR1cm4gNDtjYXNlIm1lc3NhZ2UiOnN3aXRjaCh5JCgpKXtjYXNlIFhwOnJldHVybiAxO2Nhc2UgajE6cmV0dXJuIDQ7Y2FzZSBRdTpjYXNlIHgkOnJldHVybiAxNjtjYXNlIHoxOnJldHVybiA1MzY4NzA5MTI7ZGVmYXVsdDpyZXR1cm4gMTZ9ZGVmYXVsdDpyZXR1cm4gMTZ9fXZhciBnbz1udWxsLHFwPW51bGwsUnU9bnVsbDtmdW5jdGlvbiBZMSgpe2lmKFJ1KXJldHVybiBSdTt2YXIgZSx0PXFwLG49dC5sZW5ndGgscixvPSJ2YWx1ZSJpbiBnbz9nby52YWx1ZTpnby50ZXh0Q29udGVudCxpPW8ubGVuZ3RoO2ZvcihlPTA7ZTxuJiZ0W2VdPT09b1tlXTtlKyspO3ZhciBsPW4tZTtmb3Iocj0xO3I8PWwmJnRbbi1yXT09PW9baS1yXTtyKyspO3JldHVybiBSdT1vLnNsaWNlKGUsMTxyPzEtcjp2b2lkIDApfWZ1bmN0aW9uIFB1KGUpe3ZhciB0PWUua2V5Q29kZTtyZXR1cm4iY2hhckNvZGUiaW4gZT8oZT1lLmNoYXJDb2RlLGU9PT0wJiZ0PT09MTMmJihlPTEzKSk6ZT10LGU9PT0xMCYmKGU9MTMpLDMyPD1lfHxlPT09MTM/ZTowfWZ1bmN0aW9uIG51KCl7cmV0dXJuITB9ZnVuY3Rpb24gZnYoKXtyZXR1cm4hMX1mdW5jdGlvbiBSbihlKXtmdW5jdGlvbiB0KG4scixvLGksbCl7dGhpcy5fcmVhY3ROYW1lPW4sdGhpcy5fdGFyZ2V0SW5zdD1vLHRoaXMudHlwZT1yLHRoaXMubmF0aXZlRXZlbnQ9aSx0aGlzLnRhcmdldD1sLHRoaXMuY3VycmVudFRhcmdldD1udWxsO2Zvcih2YXIgcyBpbiBlKWUuaGFzT3duUHJvcGVydHkocykmJihuPWVbc10sdGhpc1tzXT1uP24oaSk6aVtzXSk7cmV0dXJuIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPShpLmRlZmF1bHRQcmV2ZW50ZWQhPW51bGw/aS5kZWZhdWx0UHJldmVudGVkOmkucmV0dXJuVmFsdWU9PT0hMSk/bnU6ZnYsdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1mdix0aGlzfXJldHVybiBudCh0LnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIG49dGhpcy5uYXRpdmVFdmVudDtuJiYobi5wcmV2ZW50RGVmYXVsdD9uLnByZXZlbnREZWZhdWx0KCk6dHlwZW9mIG4ucmV0dXJuVmFsdWUhPSJ1bmtub3duIiYmKG4ucmV0dXJuVmFsdWU9ITEpLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPW51KX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIG49dGhpcy5uYXRpdmVFdmVudDtuJiYobi5zdG9wUHJvcGFnYXRpb24/bi5zdG9wUHJvcGFnYXRpb24oKTp0eXBlb2Ygbi5jYW5jZWxCdWJibGUhPSJ1bmtub3duIiYmKG4uY2FuY2VsQnViYmxlPSEwKSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPW51KX0scGVyc2lzdDpmdW5jdGlvbigpe30saXNQZXJzaXN0ZW50Om51fSksdH12YXIgRGw9e2V2ZW50UGhhc2U6MCxidWJibGVzOjAsY2FuY2VsYWJsZTowLHRpbWVTdGFtcDpmdW5jdGlvbihlKXtyZXR1cm4gZS50aW1lU3RhbXB8fERhdGUubm93KCl9LGRlZmF1bHRQcmV2ZW50ZWQ6MCxpc1RydXN0ZWQ6MH0sZWc9Um4oRGwpLFBhPW50KHt9LERsLHt2aWV3OjAsZGV0YWlsOjB9KSxPJD1SbihQYSksWGQsUWQsc3MsR2M9bnQoe30sUGEse3NjcmVlblg6MCxzY3JlZW5ZOjAsY2xpZW50WDowLGNsaWVudFk6MCxwYWdlWDowLHBhZ2VZOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLGdldE1vZGlmaWVyU3RhdGU6dGcsYnV0dG9uOjAsYnV0dG9uczowLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVsYXRlZFRhcmdldD09PXZvaWQgMD9lLmZyb21FbGVtZW50PT09ZS5zcmNFbGVtZW50P2UudG9FbGVtZW50OmUuZnJvbUVsZW1lbnQ6ZS5yZWxhdGVkVGFyZ2V0fSxtb3ZlbWVudFg6ZnVuY3Rpb24oZSl7cmV0dXJuIm1vdmVtZW50WCJpbiBlP2UubW92ZW1lbnRYOihlIT09c3MmJihzcyYmZS50eXBlPT09Im1vdXNlbW92ZSI/KFhkPWUuc2NyZWVuWC1zcy5zY3JlZW5YLFFkPWUuc2NyZWVuWS1zcy5zY3JlZW5ZKTpRZD1YZD0wLHNzPWUpLFhkKX0sbW92ZW1lbnRZOmZ1bmN0aW9uKGUpe3JldHVybiJtb3ZlbWVudFkiaW4gZT9lLm1vdmVtZW50WTpRZH19KSxodj1SbihHYyksQSQ9bnQoe30sR2Mse2RhdGFUcmFuc2ZlcjowfSksTSQ9Um4oQSQpLEwkPW50KHt9LFBhLHtyZWxhdGVkVGFyZ2V0OjB9KSxKZD1SbihMJCksRCQ9bnQoe30sRGwse2FuaW1hdGlvbk5hbWU6MCxlbGFwc2VkVGltZTowLHBzZXVkb0VsZW1lbnQ6MH0pLEkkPVJuKEQkKSxqJD1udCh7fSxEbCx7Y2xpcGJvYXJkRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4iY2xpcGJvYXJkRGF0YSJpbiBlP2UuY2xpcGJvYXJkRGF0YTp3aW5kb3cuY2xpcGJvYXJkRGF0YX19KSx6JD1SbihqJCksRiQ9bnQoe30sRGwse2RhdGE6MH0pLHB2PVJuKEYkKSxCJD17RXNjOiJFc2NhcGUiLFNwYWNlYmFyOiIgIixMZWZ0OiJBcnJvd0xlZnQiLFVwOiJBcnJvd1VwIixSaWdodDoiQXJyb3dSaWdodCIsRG93bjoiQXJyb3dEb3duIixEZWw6IkRlbGV0ZSIsV2luOiJPUyIsTWVudToiQ29udGV4dE1lbnUiLEFwcHM6IkNvbnRleHRNZW51IixTY3JvbGw6IlNjcm9sbExvY2siLE1velByaW50YWJsZUtleToiVW5pZGVudGlmaWVkIn0sVyQ9ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMjoiQ2xlYXIiLDEzOiJFbnRlciIsMTY6IlNoaWZ0IiwxNzoiQ29udHJvbCIsMTg6IkFsdCIsMTk6IlBhdXNlIiwyMDoiQ2Fwc0xvY2siLDI3OiJFc2NhcGUiLDMyOiIgIiwzMzoiUGFnZVVwIiwzNDoiUGFnZURvd24iLDM1OiJFbmQiLDM2OiJIb21lIiwzNzoiQXJyb3dMZWZ0IiwzODoiQXJyb3dVcCIsMzk6IkFycm93UmlnaHQiLDQwOiJBcnJvd0Rvd24iLDQ1OiJJbnNlcnQiLDQ2OiJEZWxldGUiLDExMjoiRjEiLDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYiLDExODoiRjciLDExOToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIiLDE0NDoiTnVtTG9jayIsMTQ1OiJTY3JvbGxMb2NrIiwyMjQ6Ik1ldGEifSxVJD17QWx0OiJhbHRLZXkiLENvbnRyb2w6ImN0cmxLZXkiLE1ldGE6Im1ldGFLZXkiLFNoaWZ0OiJzaGlmdEtleSJ9O2Z1bmN0aW9uIFYkKGUpe3ZhciB0PXRoaXMubmF0aXZlRXZlbnQ7cmV0dXJuIHQuZ2V0TW9kaWZpZXJTdGF0ZT90LmdldE1vZGlmaWVyU3RhdGUoZSk6KGU9VSRbZV0pPyEhdFtlXTohMX1mdW5jdGlvbiB0Zygpe3JldHVybiBWJH12YXIgSCQ9bnQoe30sUGEse2tleTpmdW5jdGlvbihlKXtpZihlLmtleSl7dmFyIHQ9QiRbZS5rZXldfHxlLmtleTtpZih0IT09IlVuaWRlbnRpZmllZCIpcmV0dXJuIHR9cmV0dXJuIGUudHlwZT09PSJrZXlwcmVzcyI/KGU9UHUoZSksZT09PTEzPyJFbnRlciI6U3RyaW5nLmZyb21DaGFyQ29kZShlKSk6ZS50eXBlPT09ImtleWRvd24ifHxlLnR5cGU9PT0ia2V5dXAiP1ckW2Uua2V5Q29kZV18fCJVbmlkZW50aWZpZWQiOiIifSxjb2RlOjAsbG9jYXRpb246MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAscmVwZWF0OjAsbG9jYWxlOjAsZ2V0TW9kaWZpZXJTdGF0ZTp0ZyxjaGFyQ29kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09ImtleXByZXNzIj9QdShlKTowfSxrZXlDb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT0ia2V5ZG93biJ8fGUudHlwZT09PSJrZXl1cCI/ZS5rZXlDb2RlOjB9LHdoaWNoOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT0ia2V5cHJlc3MiP1B1KGUpOmUudHlwZT09PSJrZXlkb3duInx8ZS50eXBlPT09ImtleXVwIj9lLmtleUNvZGU6MH19KSxLJD1SbihIJCksRyQ9bnQoe30sR2Mse3BvaW50ZXJJZDowLHdpZHRoOjAsaGVpZ2h0OjAscHJlc3N1cmU6MCx0YW5nZW50aWFsUHJlc3N1cmU6MCx0aWx0WDowLHRpbHRZOjAsdHdpc3Q6MCxwb2ludGVyVHlwZTowLGlzUHJpbWFyeTowfSksZ3Y9Um4oRyQpLFkkPW50KHt9LFBhLHt0b3VjaGVzOjAsdGFyZ2V0VG91Y2hlczowLGNoYW5nZWRUb3VjaGVzOjAsYWx0S2V5OjAsbWV0YUtleTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGdldE1vZGlmaWVyU3RhdGU6dGd9KSxYJD1SbihZJCksUSQ9bnQoe30sRGwse3Byb3BlcnR5TmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksSiQ9Um4oUSQpLFokPW50KHt9LEdjLHtkZWx0YVg6ZnVuY3Rpb24oZSl7cmV0dXJuImRlbHRhWCJpbiBlP2UuZGVsdGFYOiJ3aGVlbERlbHRhWCJpbiBlPy1lLndoZWVsRGVsdGFYOjB9LGRlbHRhWTpmdW5jdGlvbihlKXtyZXR1cm4iZGVsdGFZImluIGU/ZS5kZWx0YVk6IndoZWVsRGVsdGFZImluIGU/LWUud2hlZWxEZWx0YVk6IndoZWVsRGVsdGEiaW4gZT8tZS53aGVlbERlbHRhOjB9LGRlbHRhWjowLGRlbHRhTW9kZTowfSkscSQ9Um4oWiQpLGVrPVs5LDEzLDI3LDMyXSxuZz16ciYmIkNvbXBvc2l0aW9uRXZlbnQiaW4gd2luZG93LGJzPW51bGw7enImJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJihicz1kb2N1bWVudC5kb2N1bWVudE1vZGUpO3ZhciB0az16ciYmIlRleHRFdmVudCJpbiB3aW5kb3cmJiFicyxYMT16ciYmKCFuZ3x8YnMmJjg8YnMmJjExPj1icyksbXY9U3RyaW5nLmZyb21DaGFyQ29kZSgzMiksdnY9ITE7ZnVuY3Rpb24gUTEoZSx0KXtzd2l0Y2goZSl7Y2FzZSJrZXl1cCI6cmV0dXJuIGVrLmluZGV4T2YodC5rZXlDb2RlKSE9PS0xO2Nhc2Uia2V5ZG93biI6cmV0dXJuIHQua2V5Q29kZSE9PTIyOTtjYXNlImtleXByZXNzIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJmb2N1c291dCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gSjEoZSl7cmV0dXJuIGU9ZS5kZXRhaWwsdHlwZW9mIGU9PSJvYmplY3QiJiYiZGF0YSJpbiBlP2UuZGF0YTpudWxsfXZhciBHaT0hMTtmdW5jdGlvbiBuayhlLHQpe3N3aXRjaChlKXtjYXNlImNvbXBvc2l0aW9uZW5kIjpyZXR1cm4gSjEodCk7Y2FzZSJrZXlwcmVzcyI6cmV0dXJuIHQud2hpY2ghPT0zMj9udWxsOih2dj0hMCxtdik7Y2FzZSJ0ZXh0SW5wdXQiOnJldHVybiBlPXQuZGF0YSxlPT09bXYmJnZ2P251bGw6ZTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiByayhlLHQpe2lmKEdpKXJldHVybiBlPT09ImNvbXBvc2l0aW9uZW5kInx8IW5nJiZRMShlLHQpPyhlPVkxKCksUnU9cXA9Z289bnVsbCxHaT0hMSxlKTpudWxsO3N3aXRjaChlKXtjYXNlInBhc3RlIjpyZXR1cm4gbnVsbDtjYXNlImtleXByZXNzIjppZighKHQuY3RybEtleXx8dC5hbHRLZXl8fHQubWV0YUtleSl8fHQuY3RybEtleSYmdC5hbHRLZXkpe2lmKHQuY2hhciYmMTx0LmNoYXIubGVuZ3RoKXJldHVybiB0LmNoYXI7aWYodC53aGljaClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0LndoaWNoKX1yZXR1cm4gbnVsbDtjYXNlImNvbXBvc2l0aW9uZW5kIjpyZXR1cm4gWDEmJnQubG9jYWxlIT09ImtvIj9udWxsOnQuZGF0YTtkZWZhdWx0OnJldHVybiBudWxsfX12YXIgb2s9e2NvbG9yOiEwLGRhdGU6ITAsZGF0ZXRpbWU6ITAsImRhdGV0aW1lLWxvY2FsIjohMCxlbWFpbDohMCxtb250aDohMCxudW1iZXI6ITAscGFzc3dvcmQ6ITAscmFuZ2U6ITAsc2VhcmNoOiEwLHRlbDohMCx0ZXh0OiEwLHRpbWU6ITAsdXJsOiEwLHdlZWs6ITB9O2Z1bmN0aW9uIHl2KGUpe3ZhciB0PWUmJmUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gdD09PSJpbnB1dCI/ISFva1tlLnR5cGVdOnQ9PT0idGV4dGFyZWEifWZ1bmN0aW9uIFoxKGUsdCxuLHIpe04xKHIpLHQ9ZWModCwib25DaGFuZ2UiKSwwPHQubGVuZ3RoJiYobj1uZXcgZWcoIm9uQ2hhbmdlIiwiY2hhbmdlIixudWxsLG4sciksZS5wdXNoKHtldmVudDpuLGxpc3RlbmVyczp0fSkpfXZhciBOcz1udWxsLHRhPW51bGw7ZnVuY3Rpb24gaWsoZSl7dXgoZSwwKX1mdW5jdGlvbiBZYyhlKXt2YXIgdD1RaShlKTtpZihTMSh0KSlyZXR1cm4gZX1mdW5jdGlvbiBsayhlLHQpe2lmKGU9PT0iY2hhbmdlIilyZXR1cm4gdH12YXIgcTE9ITE7aWYoenIpe3ZhciBaZDtpZih6cil7dmFyIHFkPSJvbmlucHV0ImluIGRvY3VtZW50O2lmKCFxZCl7dmFyIHh2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3h2LnNldEF0dHJpYnV0ZSgib25pbnB1dCIsInJldHVybjsiKSxxZD10eXBlb2YgeHYub25pbnB1dD09ImZ1bmN0aW9uIn1aZD1xZH1lbHNlIFpkPSExO3ExPVpkJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8OTxkb2N1bWVudC5kb2N1bWVudE1vZGUpfWZ1bmN0aW9uIHd2KCl7TnMmJihOcy5kZXRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIsZXgpLHRhPU5zPW51bGwpfWZ1bmN0aW9uIGV4KGUpe2lmKGUucHJvcGVydHlOYW1lPT09InZhbHVlIiYmWWModGEpKXt2YXIgdD1bXTtaMSh0LHRhLGUsWXAoZSkpLEExKGlrLHQpfX1mdW5jdGlvbiBzayhlLHQsbil7ZT09PSJmb2N1c2luIj8od3YoKSxOcz10LHRhPW4sTnMuYXR0YWNoRXZlbnQoIm9ucHJvcGVydHljaGFuZ2UiLGV4KSk6ZT09PSJmb2N1c291dCImJnd2KCl9ZnVuY3Rpb24gYWsoZSl7aWYoZT09PSJzZWxlY3Rpb25jaGFuZ2UifHxlPT09ImtleXVwInx8ZT09PSJrZXlkb3duIilyZXR1cm4gWWModGEpfWZ1bmN0aW9uIHVrKGUsdCl7aWYoZT09PSJjbGljayIpcmV0dXJuIFljKHQpfWZ1bmN0aW9uIGNrKGUsdCl7aWYoZT09PSJpbnB1dCJ8fGU9PT0iY2hhbmdlIilyZXR1cm4gWWModCl9ZnVuY3Rpb24gZGsoZSx0KXtyZXR1cm4gZT09PXQmJihlIT09MHx8MS9lPT09MS90KXx8ZSE9PWUmJnQhPT10fXZhciBycj10eXBlb2YgT2JqZWN0LmlzPT0iZnVuY3Rpb24iP09iamVjdC5pczpkaztmdW5jdGlvbiBuYShlLHQpe2lmKHJyKGUsdCkpcmV0dXJuITA7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbHx8dHlwZW9mIHQhPSJvYmplY3QifHx0PT09bnVsbClyZXR1cm4hMTt2YXIgbj1PYmplY3Qua2V5cyhlKSxyPU9iamVjdC5rZXlzKHQpO2lmKG4ubGVuZ3RoIT09ci5sZW5ndGgpcmV0dXJuITE7Zm9yKHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXTtpZighemYuY2FsbCh0LG8pfHwhcnIoZVtvXSx0W29dKSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBfdihlKXtmb3IoO2UmJmUuZmlyc3RDaGlsZDspZT1lLmZpcnN0Q2hpbGQ7cmV0dXJuIGV9ZnVuY3Rpb24gU3YoZSx0KXt2YXIgbj1fdihlKTtlPTA7Zm9yKHZhciByO247KXtpZihuLm5vZGVUeXBlPT09Myl7aWYocj1lK24udGV4dENvbnRlbnQubGVuZ3RoLGU8PXQmJnI+PXQpcmV0dXJue25vZGU6bixvZmZzZXQ6dC1lfTtlPXJ9ZTp7Zm9yKDtuOyl7aWYobi5uZXh0U2libGluZyl7bj1uLm5leHRTaWJsaW5nO2JyZWFrIGV9bj1uLnBhcmVudE5vZGV9bj12b2lkIDB9bj1fdihuKX19ZnVuY3Rpb24gdHgoZSx0KXtyZXR1cm4gZSYmdD9lPT09dD8hMDplJiZlLm5vZGVUeXBlPT09Mz8hMTp0JiZ0Lm5vZGVUeXBlPT09Mz90eChlLHQucGFyZW50Tm9kZSk6ImNvbnRhaW5zImluIGU/ZS5jb250YWlucyh0KTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPyEhKGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkmMTYpOiExOiExfWZ1bmN0aW9uIG54KCl7Zm9yKHZhciBlPXdpbmRvdyx0PUd1KCk7dCBpbnN0YW5jZW9mIGUuSFRNTElGcmFtZUVsZW1lbnQ7KXt0cnl7dmFyIG49dHlwZW9mIHQuY29udGVudFdpbmRvdy5sb2NhdGlvbi5ocmVmPT0ic3RyaW5nIn1jYXRjaHtuPSExfWlmKG4pZT10LmNvbnRlbnRXaW5kb3c7ZWxzZSBicmVhazt0PUd1KGUuZG9jdW1lbnQpfXJldHVybiB0fWZ1bmN0aW9uIHJnKGUpe3ZhciB0PWUmJmUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gdCYmKHQ9PT0iaW5wdXQiJiYoZS50eXBlPT09InRleHQifHxlLnR5cGU9PT0ic2VhcmNoInx8ZS50eXBlPT09InRlbCJ8fGUudHlwZT09PSJ1cmwifHxlLnR5cGU9PT0icGFzc3dvcmQiKXx8dD09PSJ0ZXh0YXJlYSJ8fGUuY29udGVudEVkaXRhYmxlPT09InRydWUiKX1mdW5jdGlvbiBmayhlKXt2YXIgdD1ueCgpLG49ZS5mb2N1c2VkRWxlbSxyPWUuc2VsZWN0aW9uUmFuZ2U7aWYodCE9PW4mJm4mJm4ub3duZXJEb2N1bWVudCYmdHgobi5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxuKSl7aWYociE9PW51bGwmJnJnKG4pKXtpZih0PXIuc3RhcnQsZT1yLmVuZCxlPT09dm9pZCAwJiYoZT10KSwic2VsZWN0aW9uU3RhcnQiaW4gbiluLnNlbGVjdGlvblN0YXJ0PXQsbi5zZWxlY3Rpb25FbmQ9TWF0aC5taW4oZSxuLnZhbHVlLmxlbmd0aCk7ZWxzZSBpZihlPSh0PW4ub3duZXJEb2N1bWVudHx8ZG9jdW1lbnQpJiZ0LmRlZmF1bHRWaWV3fHx3aW5kb3csZS5nZXRTZWxlY3Rpb24pe2U9ZS5nZXRTZWxlY3Rpb24oKTt2YXIgbz1uLnRleHRDb250ZW50Lmxlbmd0aCxpPU1hdGgubWluKHIuc3RhcnQsbyk7cj1yLmVuZD09PXZvaWQgMD9pOk1hdGgubWluKHIuZW5kLG8pLCFlLmV4dGVuZCYmaT5yJiYobz1yLHI9aSxpPW8pLG89U3YobixpKTt2YXIgbD1TdihuLHIpO28mJmwmJihlLnJhbmdlQ291bnQhPT0xfHxlLmFuY2hvck5vZGUhPT1vLm5vZGV8fGUuYW5jaG9yT2Zmc2V0IT09by5vZmZzZXR8fGUuZm9jdXNOb2RlIT09bC5ub2RlfHxlLmZvY3VzT2Zmc2V0IT09bC5vZmZzZXQpJiYodD10LmNyZWF0ZVJhbmdlKCksdC5zZXRTdGFydChvLm5vZGUsby5vZmZzZXQpLGUucmVtb3ZlQWxsUmFuZ2VzKCksaT5yPyhlLmFkZFJhbmdlKHQpLGUuZXh0ZW5kKGwubm9kZSxsLm9mZnNldCkpOih0LnNldEVuZChsLm5vZGUsbC5vZmZzZXQpLGUuYWRkUmFuZ2UodCkpKX19Zm9yKHQ9W10sZT1uO2U9ZS5wYXJlbnROb2RlOyllLm5vZGVUeXBlPT09MSYmdC5wdXNoKHtlbGVtZW50OmUsbGVmdDplLnNjcm9sbExlZnQsdG9wOmUuc2Nyb2xsVG9wfSk7Zm9yKHR5cGVvZiBuLmZvY3VzPT0iZnVuY3Rpb24iJiZuLmZvY3VzKCksbj0wO248dC5sZW5ndGg7bisrKWU9dFtuXSxlLmVsZW1lbnQuc2Nyb2xsTGVmdD1lLmxlZnQsZS5lbGVtZW50LnNjcm9sbFRvcD1lLnRvcH19dmFyIGhrPXpyJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50JiYxMT49ZG9jdW1lbnQuZG9jdW1lbnRNb2RlLFlpPW51bGwsb2g9bnVsbCxScz1udWxsLGloPSExO2Z1bmN0aW9uIEV2KGUsdCxuKXt2YXIgcj1uLndpbmRvdz09PW4/bi5kb2N1bWVudDpuLm5vZGVUeXBlPT09OT9uOm4ub3duZXJEb2N1bWVudDtpaHx8WWk9PW51bGx8fFlpIT09R3Uocil8fChyPVlpLCJzZWxlY3Rpb25TdGFydCJpbiByJiZyZyhyKT9yPXtzdGFydDpyLnNlbGVjdGlvblN0YXJ0LGVuZDpyLnNlbGVjdGlvbkVuZH06KHI9KHIub3duZXJEb2N1bWVudCYmci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx3aW5kb3cpLmdldFNlbGVjdGlvbigpLHI9e2FuY2hvck5vZGU6ci5hbmNob3JOb2RlLGFuY2hvck9mZnNldDpyLmFuY2hvck9mZnNldCxmb2N1c05vZGU6ci5mb2N1c05vZGUsZm9jdXNPZmZzZXQ6ci5mb2N1c09mZnNldH0pLFJzJiZuYShScyxyKXx8KFJzPXIscj1lYyhvaCwib25TZWxlY3QiKSwwPHIubGVuZ3RoJiYodD1uZXcgZWcoIm9uU2VsZWN0Iiwic2VsZWN0IixudWxsLHQsbiksZS5wdXNoKHtldmVudDp0LGxpc3RlbmVyczpyfSksdC50YXJnZXQ9WWkpKSl9ZnVuY3Rpb24gcnUoZSx0KXt2YXIgbj17fTtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldPXQudG9Mb3dlckNhc2UoKSxuWyJXZWJraXQiK2VdPSJ3ZWJraXQiK3QsblsiTW96IitlXT0ibW96Iit0LG59dmFyIFhpPXthbmltYXRpb25lbmQ6cnUoIkFuaW1hdGlvbiIsIkFuaW1hdGlvbkVuZCIpLGFuaW1hdGlvbml0ZXJhdGlvbjpydSgiQW5pbWF0aW9uIiwiQW5pbWF0aW9uSXRlcmF0aW9uIiksYW5pbWF0aW9uc3RhcnQ6cnUoIkFuaW1hdGlvbiIsIkFuaW1hdGlvblN0YXJ0IiksdHJhbnNpdGlvbmVuZDpydSgiVHJhbnNpdGlvbiIsIlRyYW5zaXRpb25FbmQiKX0sZWY9e30scng9e307enImJihyeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSwiQW5pbWF0aW9uRXZlbnQiaW4gd2luZG93fHwoZGVsZXRlIFhpLmFuaW1hdGlvbmVuZC5hbmltYXRpb24sZGVsZXRlIFhpLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb24sZGVsZXRlIFhpLmFuaW1hdGlvbnN0YXJ0LmFuaW1hdGlvbiksIlRyYW5zaXRpb25FdmVudCJpbiB3aW5kb3d8fGRlbGV0ZSBYaS50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb24pO2Z1bmN0aW9uIFhjKGUpe2lmKGVmW2VdKXJldHVybiBlZltlXTtpZighWGlbZV0pcmV0dXJuIGU7dmFyIHQ9WGlbZV0sbjtmb3IobiBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkobikmJm4gaW4gcngpcmV0dXJuIGVmW2VdPXRbbl07cmV0dXJuIGV9dmFyIG94PVhjKCJhbmltYXRpb25lbmQiKSxpeD1YYygiYW5pbWF0aW9uaXRlcmF0aW9uIiksbHg9WGMoImFuaW1hdGlvbnN0YXJ0Iiksc3g9WGMoInRyYW5zaXRpb25lbmQiKSxheD1uZXcgTWFwLEN2PSJhYm9ydCBhdXhDbGljayBjYW5jZWwgY2FuUGxheSBjYW5QbGF5VGhyb3VnaCBjbGljayBjbG9zZSBjb250ZXh0TWVudSBjb3B5IGN1dCBkcmFnIGRyYWdFbmQgZHJhZ0VudGVyIGRyYWdFeGl0IGRyYWdMZWF2ZSBkcmFnT3ZlciBkcmFnU3RhcnQgZHJvcCBkdXJhdGlvbkNoYW5nZSBlbXB0aWVkIGVuY3J5cHRlZCBlbmRlZCBlcnJvciBnb3RQb2ludGVyQ2FwdHVyZSBpbnB1dCBpbnZhbGlkIGtleURvd24ga2V5UHJlc3Mga2V5VXAgbG9hZCBsb2FkZWREYXRhIGxvYWRlZE1ldGFkYXRhIGxvYWRTdGFydCBsb3N0UG9pbnRlckNhcHR1cmUgbW91c2VEb3duIG1vdXNlTW92ZSBtb3VzZU91dCBtb3VzZU92ZXIgbW91c2VVcCBwYXN0ZSBwYXVzZSBwbGF5IHBsYXlpbmcgcG9pbnRlckNhbmNlbCBwb2ludGVyRG93biBwb2ludGVyTW92ZSBwb2ludGVyT3V0IHBvaW50ZXJPdmVyIHBvaW50ZXJVcCBwcm9ncmVzcyByYXRlQ2hhbmdlIHJlc2V0IHJlc2l6ZSBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1Ym1pdCBzdXNwZW5kIHRpbWVVcGRhdGUgdG91Y2hDYW5jZWwgdG91Y2hFbmQgdG91Y2hTdGFydCB2b2x1bWVDaGFuZ2Ugc2Nyb2xsIHRvZ2dsZSB0b3VjaE1vdmUgd2FpdGluZyB3aGVlbCIuc3BsaXQoIiAiKTtmdW5jdGlvbiB6byhlLHQpe2F4LnNldChlLHQpLF9pKHQsW2VdKX1mb3IodmFyIHRmPTA7dGY8Q3YubGVuZ3RoO3RmKyspe3ZhciBuZj1Ddlt0Zl0scGs9bmYudG9Mb3dlckNhc2UoKSxnaz1uZlswXS50b1VwcGVyQ2FzZSgpK25mLnNsaWNlKDEpO3pvKHBrLCJvbiIrZ2spfXpvKG94LCJvbkFuaW1hdGlvbkVuZCIpO3pvKGl4LCJvbkFuaW1hdGlvbkl0ZXJhdGlvbiIpO3pvKGx4LCJvbkFuaW1hdGlvblN0YXJ0Iik7em8oImRibGNsaWNrIiwib25Eb3VibGVDbGljayIpO3pvKCJmb2N1c2luIiwib25Gb2N1cyIpO3pvKCJmb2N1c291dCIsIm9uQmx1ciIpO3pvKHN4LCJvblRyYW5zaXRpb25FbmQiKTt4bCgib25Nb3VzZUVudGVyIixbIm1vdXNlb3V0IiwibW91c2VvdmVyIl0pO3hsKCJvbk1vdXNlTGVhdmUiLFsibW91c2VvdXQiLCJtb3VzZW92ZXIiXSk7eGwoIm9uUG9pbnRlckVudGVyIixbInBvaW50ZXJvdXQiLCJwb2ludGVyb3ZlciJdKTt4bCgib25Qb2ludGVyTGVhdmUiLFsicG9pbnRlcm91dCIsInBvaW50ZXJvdmVyIl0pO19pKCJvbkNoYW5nZSIsImNoYW5nZSBjbGljayBmb2N1c2luIGZvY3Vzb3V0IGlucHV0IGtleWRvd24ga2V5dXAgc2VsZWN0aW9uY2hhbmdlIi5zcGxpdCgiICIpKTtfaSgib25TZWxlY3QiLCJmb2N1c291dCBjb250ZXh0bWVudSBkcmFnZW5kIGZvY3VzaW4ga2V5ZG93biBrZXl1cCBtb3VzZWRvd24gbW91c2V1cCBzZWxlY3Rpb25jaGFuZ2UiLnNwbGl0KCIgIikpO19pKCJvbkJlZm9yZUlucHV0IixbImNvbXBvc2l0aW9uZW5kIiwia2V5cHJlc3MiLCJ0ZXh0SW5wdXQiLCJwYXN0ZSJdKTtfaSgib25Db21wb3NpdGlvbkVuZCIsImNvbXBvc2l0aW9uZW5kIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTtfaSgib25Db21wb3NpdGlvblN0YXJ0IiwiY29tcG9zaXRpb25zdGFydCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93biIuc3BsaXQoIiAiKSk7X2koIm9uQ29tcG9zaXRpb25VcGRhdGUiLCJjb21wb3NpdGlvbnVwZGF0ZSBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93biIuc3BsaXQoIiAiKSk7dmFyIF9zPSJhYm9ydCBjYW5wbGF5IGNhbnBsYXl0aHJvdWdoIGR1cmF0aW9uY2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGxvYWRlZGRhdGEgbG9hZGVkbWV0YWRhdGEgbG9hZHN0YXJ0IHBhdXNlIHBsYXkgcGxheWluZyBwcm9ncmVzcyByYXRlY2hhbmdlIHJlc2l6ZSBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1c3BlbmQgdGltZXVwZGF0ZSB2b2x1bWVjaGFuZ2Ugd2FpdGluZyIuc3BsaXQoIiAiKSxtaz1uZXcgU2V0KCJjYW5jZWwgY2xvc2UgaW52YWxpZCBsb2FkIHNjcm9sbCB0b2dnbGUiLnNwbGl0KCIgIikuY29uY2F0KF9zKSk7ZnVuY3Rpb24gJHYoZSx0LG4pe3ZhciByPWUudHlwZXx8InVua25vd24tZXZlbnQiO2UuY3VycmVudFRhcmdldD1uLHAkKHIsdCx2b2lkIDAsZSksZS5jdXJyZW50VGFyZ2V0PW51bGx9ZnVuY3Rpb24gdXgoZSx0KXt0PSh0JjQpIT09MDtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXSxvPXIuZXZlbnQ7cj1yLmxpc3RlbmVycztlOnt2YXIgaT12b2lkIDA7aWYodClmb3IodmFyIGw9ci5sZW5ndGgtMTswPD1sO2wtLSl7dmFyIHM9cltsXSxhPXMuaW5zdGFuY2UsdT1zLmN1cnJlbnRUYXJnZXQ7aWYocz1zLmxpc3RlbmVyLGEhPT1pJiZvLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgZTskdihvLHMsdSksaT1hfWVsc2UgZm9yKGw9MDtsPHIubGVuZ3RoO2wrKyl7aWYocz1yW2xdLGE9cy5pbnN0YW5jZSx1PXMuY3VycmVudFRhcmdldCxzPXMubGlzdGVuZXIsYSE9PWkmJm8uaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVhayBlOyR2KG8scyx1KSxpPWF9fX1pZihYdSl0aHJvdyBlPWVoLFh1PSExLGVoPW51bGwsZX1mdW5jdGlvbiBVZShlLHQpe3ZhciBuPXRbY2hdO249PT12b2lkIDAmJihuPXRbY2hdPW5ldyBTZXQpO3ZhciByPWUrIl9fYnViYmxlIjtuLmhhcyhyKXx8KGN4KHQsZSwyLCExKSxuLmFkZChyKSl9ZnVuY3Rpb24gcmYoZSx0LG4pe3ZhciByPTA7dCYmKHJ8PTQpLGN4KG4sZSxyLHQpfXZhciBvdT0iX3JlYWN0TGlzdGVuaW5nIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtmdW5jdGlvbiByYShlKXtpZighZVtvdV0pe2Vbb3VdPSEwLHYxLmZvckVhY2goZnVuY3Rpb24obil7biE9PSJzZWxlY3Rpb25jaGFuZ2UiJiYobWsuaGFzKG4pfHxyZihuLCExLGUpLHJmKG4sITAsZSkpfSk7dmFyIHQ9ZS5ub2RlVHlwZT09PTk/ZTplLm93bmVyRG9jdW1lbnQ7dD09PW51bGx8fHRbb3VdfHwodFtvdV09ITAscmYoInNlbGVjdGlvbmNoYW5nZSIsITEsdCkpfX1mdW5jdGlvbiBjeChlLHQsbixyKXtzd2l0Y2goRzEodCkpe2Nhc2UgMTp2YXIgbz1SJDticmVhaztjYXNlIDQ6bz1QJDticmVhaztkZWZhdWx0Om89WnB9bj1vLmJpbmQobnVsbCx0LG4sZSksbz12b2lkIDAsIXFmfHx0IT09InRvdWNoc3RhcnQiJiZ0IT09InRvdWNobW92ZSImJnQhPT0id2hlZWwifHwobz0hMCkscj9vIT09dm9pZCAwP2UuYWRkRXZlbnRMaXN0ZW5lcih0LG4se2NhcHR1cmU6ITAscGFzc2l2ZTpvfSk6ZS5hZGRFdmVudExpc3RlbmVyKHQsbiwhMCk6byE9PXZvaWQgMD9lLmFkZEV2ZW50TGlzdGVuZXIodCxuLHtwYXNzaXZlOm99KTplLmFkZEV2ZW50TGlzdGVuZXIodCxuLCExKX1mdW5jdGlvbiBvZihlLHQsbixyLG8pe3ZhciBpPXI7aWYoISh0JjEpJiYhKHQmMikmJnIhPT1udWxsKWU6Zm9yKDs7KXtpZihyPT09bnVsbClyZXR1cm47dmFyIGw9ci50YWc7aWYobD09PTN8fGw9PT00KXt2YXIgcz1yLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2lmKHM9PT1vfHxzLm5vZGVUeXBlPT09OCYmcy5wYXJlbnROb2RlPT09bylicmVhaztpZihsPT09NClmb3IobD1yLnJldHVybjtsIT09bnVsbDspe3ZhciBhPWwudGFnO2lmKChhPT09M3x8YT09PTQpJiYoYT1sLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLGE9PT1vfHxhLm5vZGVUeXBlPT09OCYmYS5wYXJlbnROb2RlPT09bykpcmV0dXJuO2w9bC5yZXR1cm59Zm9yKDtzIT09bnVsbDspe2lmKGw9Wm8ocyksbD09PW51bGwpcmV0dXJuO2lmKGE9bC50YWcsYT09PTV8fGE9PT02KXtyPWk9bDtjb250aW51ZSBlfXM9cy5wYXJlbnROb2RlfX1yPXIucmV0dXJufUExKGZ1bmN0aW9uKCl7dmFyIHU9aSxjPVlwKG4pLGQ9W107ZTp7dmFyIGY9YXguZ2V0KGUpO2lmKGYhPT12b2lkIDApe3ZhciBoPWVnLG09ZTtzd2l0Y2goZSl7Y2FzZSJrZXlwcmVzcyI6aWYoUHUobik9PT0wKWJyZWFrIGU7Y2FzZSJrZXlkb3duIjpjYXNlImtleXVwIjpoPUskO2JyZWFrO2Nhc2UiZm9jdXNpbiI6bT0iZm9jdXMiLGg9SmQ7YnJlYWs7Y2FzZSJmb2N1c291dCI6bT0iYmx1ciIsaD1KZDticmVhaztjYXNlImJlZm9yZWJsdXIiOmNhc2UiYWZ0ZXJibHVyIjpoPUpkO2JyZWFrO2Nhc2UiY2xpY2siOmlmKG4uYnV0dG9uPT09MilicmVhayBlO2Nhc2UiYXV4Y2xpY2siOmNhc2UiZGJsY2xpY2siOmNhc2UibW91c2Vkb3duIjpjYXNlIm1vdXNlbW92ZSI6Y2FzZSJtb3VzZXVwIjpjYXNlIm1vdXNlb3V0IjpjYXNlIm1vdXNlb3ZlciI6Y2FzZSJjb250ZXh0bWVudSI6aD1odjticmVhaztjYXNlImRyYWciOmNhc2UiZHJhZ2VuZCI6Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2V4aXQiOmNhc2UiZHJhZ2xlYXZlIjpjYXNlImRyYWdvdmVyIjpjYXNlImRyYWdzdGFydCI6Y2FzZSJkcm9wIjpoPU0kO2JyZWFrO2Nhc2UidG91Y2hjYW5jZWwiOmNhc2UidG91Y2hlbmQiOmNhc2UidG91Y2htb3ZlIjpjYXNlInRvdWNoc3RhcnQiOmg9WCQ7YnJlYWs7Y2FzZSBveDpjYXNlIGl4OmNhc2UgbHg6aD1JJDticmVhaztjYXNlIHN4Omg9SiQ7YnJlYWs7Y2FzZSJzY3JvbGwiOmg9TyQ7YnJlYWs7Y2FzZSJ3aGVlbCI6aD1xJDticmVhaztjYXNlImNvcHkiOmNhc2UiY3V0IjpjYXNlInBhc3RlIjpoPXokO2JyZWFrO2Nhc2UiZ290cG9pbnRlcmNhcHR1cmUiOmNhc2UibG9zdHBvaW50ZXJjYXB0dXJlIjpjYXNlInBvaW50ZXJjYW5jZWwiOmNhc2UicG9pbnRlcmRvd24iOmNhc2UicG9pbnRlcm1vdmUiOmNhc2UicG9pbnRlcm91dCI6Y2FzZSJwb2ludGVyb3ZlciI6Y2FzZSJwb2ludGVydXAiOmg9Z3Z9dmFyIGc9KHQmNCkhPT0wLFM9IWcmJmU9PT0ic2Nyb2xsIix2PWc/ZiE9PW51bGw/ZisiQ2FwdHVyZSI6bnVsbDpmO2c9W107Zm9yKHZhciB5PXUseDt5IT09bnVsbDspe3g9eTt2YXIgdz14LnN0YXRlTm9kZTtpZih4LnRhZz09PTUmJnchPT1udWxsJiYoeD13LHYhPT1udWxsJiYodz1Kcyh5LHYpLHchPW51bGwmJmcucHVzaChvYSh5LHcseCkpKSksUylicmVhazt5PXkucmV0dXJufTA8Zy5sZW5ndGgmJihmPW5ldyBoKGYsbSxudWxsLG4sYyksZC5wdXNoKHtldmVudDpmLGxpc3RlbmVyczpnfSkpfX1pZighKHQmNykpe2U6e2lmKGY9ZT09PSJtb3VzZW92ZXIifHxlPT09InBvaW50ZXJvdmVyIixoPWU9PT0ibW91c2VvdXQifHxlPT09InBvaW50ZXJvdXQiLGYmJm4hPT1KZiYmKG09bi5yZWxhdGVkVGFyZ2V0fHxuLmZyb21FbGVtZW50KSYmKFpvKG0pfHxtW0ZyXSkpYnJlYWsgZTtpZigoaHx8ZikmJihmPWMud2luZG93PT09Yz9jOihmPWMub3duZXJEb2N1bWVudCk/Zi5kZWZhdWx0Vmlld3x8Zi5wYXJlbnRXaW5kb3c6d2luZG93LGg/KG09bi5yZWxhdGVkVGFyZ2V0fHxuLnRvRWxlbWVudCxoPXUsbT1tP1pvKG0pOm51bGwsbSE9PW51bGwmJihTPVNpKG0pLG0hPT1TfHxtLnRhZyE9PTUmJm0udGFnIT09NikmJihtPW51bGwpKTooaD1udWxsLG09dSksaCE9PW0pKXtpZihnPWh2LHc9Im9uTW91c2VMZWF2ZSIsdj0ib25Nb3VzZUVudGVyIix5PSJtb3VzZSIsKGU9PT0icG9pbnRlcm91dCJ8fGU9PT0icG9pbnRlcm92ZXIiKSYmKGc9Z3Ysdz0ib25Qb2ludGVyTGVhdmUiLHY9Im9uUG9pbnRlckVudGVyIix5PSJwb2ludGVyIiksUz1oPT1udWxsP2Y6UWkoaCkseD1tPT1udWxsP2Y6UWkobSksZj1uZXcgZyh3LHkrImxlYXZlIixoLG4sYyksZi50YXJnZXQ9UyxmLnJlbGF0ZWRUYXJnZXQ9eCx3PW51bGwsWm8oYyk9PT11JiYoZz1uZXcgZyh2LHkrImVudGVyIixtLG4sYyksZy50YXJnZXQ9eCxnLnJlbGF0ZWRUYXJnZXQ9Uyx3PWcpLFM9dyxoJiZtKXQ6e2ZvcihnPWgsdj1tLHk9MCx4PWc7eDt4PU1pKHgpKXkrKztmb3IoeD0wLHc9djt3O3c9TWkodykpeCsrO2Zvcig7MDx5LXg7KWc9TWkoZykseS0tO2Zvcig7MDx4LXk7KXY9TWkodikseC0tO2Zvcig7eS0tOyl7aWYoZz09PXZ8fHYhPT1udWxsJiZnPT09di5hbHRlcm5hdGUpYnJlYWsgdDtnPU1pKGcpLHY9TWkodil9Zz1udWxsfWVsc2UgZz1udWxsO2ghPT1udWxsJiZrdihkLGYsaCxnLCExKSxtIT09bnVsbCYmUyE9PW51bGwmJmt2KGQsUyxtLGcsITApfX1lOntpZihmPXU/UWkodSk6d2luZG93LGg9Zi5ub2RlTmFtZSYmZi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGg9PT0ic2VsZWN0Inx8aD09PSJpbnB1dCImJmYudHlwZT09PSJmaWxlIil2YXIgaz1saztlbHNlIGlmKHl2KGYpKWlmKHExKWs9Y2s7ZWxzZXtrPWFrO3ZhciBiPXNrfWVsc2UoaD1mLm5vZGVOYW1lKSYmaC50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmKGYudHlwZT09PSJjaGVja2JveCJ8fGYudHlwZT09PSJyYWRpbyIpJiYoaz11ayk7aWYoayYmKGs9ayhlLHUpKSl7WjEoZCxrLG4sYyk7YnJlYWsgZX1iJiZiKGUsZix1KSxlPT09ImZvY3Vzb3V0IiYmKGI9Zi5fd3JhcHBlclN0YXRlKSYmYi5jb250cm9sbGVkJiZmLnR5cGU9PT0ibnVtYmVyIiYmS2YoZiwibnVtYmVyIixmLnZhbHVlKX1zd2l0Y2goYj11P1FpKHUpOndpbmRvdyxlKXtjYXNlImZvY3VzaW4iOih5dihiKXx8Yi5jb250ZW50RWRpdGFibGU9PT0idHJ1ZSIpJiYoWWk9YixvaD11LFJzPW51bGwpO2JyZWFrO2Nhc2UiZm9jdXNvdXQiOlJzPW9oPVlpPW51bGw7YnJlYWs7Y2FzZSJtb3VzZWRvd24iOmloPSEwO2JyZWFrO2Nhc2UiY29udGV4dG1lbnUiOmNhc2UibW91c2V1cCI6Y2FzZSJkcmFnZW5kIjppaD0hMSxFdihkLG4sYyk7YnJlYWs7Y2FzZSJzZWxlY3Rpb25jaGFuZ2UiOmlmKGhrKWJyZWFrO2Nhc2Uia2V5ZG93biI6Y2FzZSJrZXl1cCI6RXYoZCxuLGMpfXZhciBUO2lmKG5nKWU6e3N3aXRjaChlKXtjYXNlImNvbXBvc2l0aW9uc3RhcnQiOnZhciBOPSJvbkNvbXBvc2l0aW9uU3RhcnQiO2JyZWFrIGU7Y2FzZSJjb21wb3NpdGlvbmVuZCI6Tj0ib25Db21wb3NpdGlvbkVuZCI7YnJlYWsgZTtjYXNlImNvbXBvc2l0aW9udXBkYXRlIjpOPSJvbkNvbXBvc2l0aW9uVXBkYXRlIjticmVhayBlfU49dm9pZCAwfWVsc2UgR2k/UTEoZSxuKSYmKE49Im9uQ29tcG9zaXRpb25FbmQiKTplPT09ImtleWRvd24iJiZuLmtleUNvZGU9PT0yMjkmJihOPSJvbkNvbXBvc2l0aW9uU3RhcnQiKTtOJiYoWDEmJm4ubG9jYWxlIT09ImtvIiYmKEdpfHxOIT09Im9uQ29tcG9zaXRpb25TdGFydCI/Tj09PSJvbkNvbXBvc2l0aW9uRW5kIiYmR2kmJihUPVkxKCkpOihnbz1jLHFwPSJ2YWx1ZSJpbiBnbz9nby52YWx1ZTpnby50ZXh0Q29udGVudCxHaT0hMCkpLGI9ZWModSxOKSwwPGIubGVuZ3RoJiYoTj1uZXcgcHYoTixlLG51bGwsbixjKSxkLnB1c2goe2V2ZW50Ok4sbGlzdGVuZXJzOmJ9KSxUP04uZGF0YT1UOihUPUoxKG4pLFQhPT1udWxsJiYoTi5kYXRhPVQpKSkpLChUPXRrP25rKGUsbik6cmsoZSxuKSkmJih1PWVjKHUsIm9uQmVmb3JlSW5wdXQiKSwwPHUubGVuZ3RoJiYoYz1uZXcgcHYoIm9uQmVmb3JlSW5wdXQiLCJiZWZvcmVpbnB1dCIsbnVsbCxuLGMpLGQucHVzaCh7ZXZlbnQ6YyxsaXN0ZW5lcnM6dX0pLGMuZGF0YT1UKSl9dXgoZCx0KX0pfWZ1bmN0aW9uIG9hKGUsdCxuKXtyZXR1cm57aW5zdGFuY2U6ZSxsaXN0ZW5lcjp0LGN1cnJlbnRUYXJnZXQ6bn19ZnVuY3Rpb24gZWMoZSx0KXtmb3IodmFyIG49dCsiQ2FwdHVyZSIscj1bXTtlIT09bnVsbDspe3ZhciBvPWUsaT1vLnN0YXRlTm9kZTtvLnRhZz09PTUmJmkhPT1udWxsJiYobz1pLGk9SnMoZSxuKSxpIT1udWxsJiZyLnVuc2hpZnQob2EoZSxpLG8pKSxpPUpzKGUsdCksaSE9bnVsbCYmci5wdXNoKG9hKGUsaSxvKSkpLGU9ZS5yZXR1cm59cmV0dXJuIHJ9ZnVuY3Rpb24gTWkoZSl7aWYoZT09PW51bGwpcmV0dXJuIG51bGw7ZG8gZT1lLnJldHVybjt3aGlsZShlJiZlLnRhZyE9PTUpO3JldHVybiBlfHxudWxsfWZ1bmN0aW9uIGt2KGUsdCxuLHIsbyl7Zm9yKHZhciBpPXQuX3JlYWN0TmFtZSxsPVtdO24hPT1udWxsJiZuIT09cjspe3ZhciBzPW4sYT1zLmFsdGVybmF0ZSx1PXMuc3RhdGVOb2RlO2lmKGEhPT1udWxsJiZhPT09cilicmVhaztzLnRhZz09PTUmJnUhPT1udWxsJiYocz11LG8/KGE9SnMobixpKSxhIT1udWxsJiZsLnVuc2hpZnQob2EobixhLHMpKSk6b3x8KGE9SnMobixpKSxhIT1udWxsJiZsLnB1c2gob2EobixhLHMpKSkpLG49bi5yZXR1cm59bC5sZW5ndGghPT0wJiZlLnB1c2goe2V2ZW50OnQsbGlzdGVuZXJzOmx9KX12YXIgdms9L1xyXG4/L2cseWs9L1x1MDAwMHxcdUZGRkQvZztmdW5jdGlvbiBUdihlKXtyZXR1cm4odHlwZW9mIGU9PSJzdHJpbmciP2U6IiIrZSkucmVwbGFjZSh2ayxgCmApLnJlcGxhY2UoeWssIiIpfWZ1bmN0aW9uIGl1KGUsdCxuKXtpZih0PVR2KHQpLFR2KGUpIT09dCYmbil0aHJvdyBFcnJvcihVKDQyNSkpfWZ1bmN0aW9uIHRjKCl7fXZhciBsaD1udWxsLHNoPW51bGw7ZnVuY3Rpb24gYWgoZSx0KXtyZXR1cm4gZT09PSJ0ZXh0YXJlYSJ8fGU9PT0ibm9zY3JpcHQifHx0eXBlb2YgdC5jaGlsZHJlbj09InN0cmluZyJ8fHR5cGVvZiB0LmNoaWxkcmVuPT0ibnVtYmVyInx8dHlwZW9mIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9PSJvYmplY3QiJiZ0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT09bnVsbCYmdC5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwhPW51bGx9dmFyIHVoPXR5cGVvZiBzZXRUaW1lb3V0PT0iZnVuY3Rpb24iP3NldFRpbWVvdXQ6dm9pZCAwLHhrPXR5cGVvZiBjbGVhclRpbWVvdXQ9PSJmdW5jdGlvbiI/Y2xlYXJUaW1lb3V0OnZvaWQgMCxidj10eXBlb2YgUHJvbWlzZT09ImZ1bmN0aW9uIj9Qcm9taXNlOnZvaWQgMCx3az10eXBlb2YgcXVldWVNaWNyb3Rhc2s9PSJmdW5jdGlvbiI/cXVldWVNaWNyb3Rhc2s6dHlwZW9mIGJ2PCJ1Ij9mdW5jdGlvbihlKXtyZXR1cm4gYnYucmVzb2x2ZShudWxsKS50aGVuKGUpLmNhdGNoKF9rKX06dWg7ZnVuY3Rpb24gX2soZSl7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IGV9KX1mdW5jdGlvbiBsZihlLHQpe3ZhciBuPXQscj0wO2Rve3ZhciBvPW4ubmV4dFNpYmxpbmc7aWYoZS5yZW1vdmVDaGlsZChuKSxvJiZvLm5vZGVUeXBlPT09OClpZihuPW8uZGF0YSxuPT09Ii8kIil7aWYocj09PTApe2UucmVtb3ZlQ2hpbGQobyksZWEodCk7cmV0dXJufXItLX1lbHNlIG4hPT0iJCImJm4hPT0iJD8iJiZuIT09IiQhInx8cisrO249b313aGlsZShuKTtlYSh0KX1mdW5jdGlvbiBTbyhlKXtmb3IoO2UhPW51bGw7ZT1lLm5leHRTaWJsaW5nKXt2YXIgdD1lLm5vZGVUeXBlO2lmKHQ9PT0xfHx0PT09MylicmVhaztpZih0PT09OCl7aWYodD1lLmRhdGEsdD09PSIkInx8dD09PSIkISJ8fHQ9PT0iJD8iKWJyZWFrO2lmKHQ9PT0iLyQiKXJldHVybiBudWxsfX1yZXR1cm4gZX1mdW5jdGlvbiBOdihlKXtlPWUucHJldmlvdXNTaWJsaW5nO2Zvcih2YXIgdD0wO2U7KXtpZihlLm5vZGVUeXBlPT09OCl7dmFyIG49ZS5kYXRhO2lmKG49PT0iJCJ8fG49PT0iJCEifHxuPT09IiQ/Iil7aWYodD09PTApcmV0dXJuIGU7dC0tfWVsc2Ugbj09PSIvJCImJnQrK31lPWUucHJldmlvdXNTaWJsaW5nfXJldHVybiBudWxsfXZhciBJbD1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSxkcj0iX19yZWFjdEZpYmVyJCIrSWwsaWE9Il9fcmVhY3RQcm9wcyQiK0lsLEZyPSJfX3JlYWN0Q29udGFpbmVyJCIrSWwsY2g9Il9fcmVhY3RFdmVudHMkIitJbCxTaz0iX19yZWFjdExpc3RlbmVycyQiK0lsLEVrPSJfX3JlYWN0SGFuZGxlcyQiK0lsO2Z1bmN0aW9uIFpvKGUpe3ZhciB0PWVbZHJdO2lmKHQpcmV0dXJuIHQ7Zm9yKHZhciBuPWUucGFyZW50Tm9kZTtuOyl7aWYodD1uW0ZyXXx8bltkcl0pe2lmKG49dC5hbHRlcm5hdGUsdC5jaGlsZCE9PW51bGx8fG4hPT1udWxsJiZuLmNoaWxkIT09bnVsbClmb3IoZT1OdihlKTtlIT09bnVsbDspe2lmKG49ZVtkcl0pcmV0dXJuIG47ZT1OdihlKX1yZXR1cm4gdH1lPW4sbj1lLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gT2EoZSl7cmV0dXJuIGU9ZVtkcl18fGVbRnJdLCFlfHxlLnRhZyE9PTUmJmUudGFnIT09NiYmZS50YWchPT0xMyYmZS50YWchPT0zP251bGw6ZX1mdW5jdGlvbiBRaShlKXtpZihlLnRhZz09PTV8fGUudGFnPT09NilyZXR1cm4gZS5zdGF0ZU5vZGU7dGhyb3cgRXJyb3IoVSgzMykpfWZ1bmN0aW9uIFFjKGUpe3JldHVybiBlW2lhXXx8bnVsbH12YXIgZGg9W10sSmk9LTE7ZnVuY3Rpb24gRm8oZSl7cmV0dXJue2N1cnJlbnQ6ZX19ZnVuY3Rpb24gR2UoZSl7MD5KaXx8KGUuY3VycmVudD1kaFtKaV0sZGhbSmldPW51bGwsSmktLSl9ZnVuY3Rpb24gRmUoZSx0KXtKaSsrLGRoW0ppXT1lLmN1cnJlbnQsZS5jdXJyZW50PXR9dmFyIFJvPXt9LFh0PUZvKFJvKSxmbj1GbyghMSksdWk9Um87ZnVuY3Rpb24gd2woZSx0KXt2YXIgbj1lLnR5cGUuY29udGV4dFR5cGVzO2lmKCFuKXJldHVybiBSbzt2YXIgcj1lLnN0YXRlTm9kZTtpZihyJiZyLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9PT10KXJldHVybiByLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O3ZhciBvPXt9LGk7Zm9yKGkgaW4gbilvW2ldPXRbaV07cmV0dXJuIHImJihlPWUuc3RhdGVOb2RlLGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD10LGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ9byksb31mdW5jdGlvbiBobihlKXtyZXR1cm4gZT1lLmNoaWxkQ29udGV4dFR5cGVzLGUhPW51bGx9ZnVuY3Rpb24gbmMoKXtHZShmbiksR2UoWHQpfWZ1bmN0aW9uIFJ2KGUsdCxuKXtpZihYdC5jdXJyZW50IT09Um8pdGhyb3cgRXJyb3IoVSgxNjgpKTtGZShYdCx0KSxGZShmbixuKX1mdW5jdGlvbiBkeChlLHQsbil7dmFyIHI9ZS5zdGF0ZU5vZGU7aWYodD10LmNoaWxkQ29udGV4dFR5cGVzLHR5cGVvZiByLmdldENoaWxkQ29udGV4dCE9ImZ1bmN0aW9uIilyZXR1cm4gbjtyPXIuZ2V0Q2hpbGRDb250ZXh0KCk7Zm9yKHZhciBvIGluIHIpaWYoIShvIGluIHQpKXRocm93IEVycm9yKFUoMTA4LHMkKGUpfHwiVW5rbm93biIsbykpO3JldHVybiBudCh7fSxuLHIpfWZ1bmN0aW9uIHJjKGUpe3JldHVybiBlPShlPWUuc3RhdGVOb2RlKSYmZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dHx8Um8sdWk9WHQuY3VycmVudCxGZShYdCxlKSxGZShmbixmbi5jdXJyZW50KSwhMH1mdW5jdGlvbiBQdihlLHQsbil7dmFyIHI9ZS5zdGF0ZU5vZGU7aWYoIXIpdGhyb3cgRXJyb3IoVSgxNjkpKTtuPyhlPWR4KGUsdCx1aSksci5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dD1lLEdlKGZuKSxHZShYdCksRmUoWHQsZSkpOkdlKGZuKSxGZShmbixuKX12YXIgQXI9bnVsbCxKYz0hMSxzZj0hMTtmdW5jdGlvbiBmeChlKXtBcj09PW51bGw/QXI9W2VdOkFyLnB1c2goZSl9ZnVuY3Rpb24gQ2soZSl7SmM9ITAsZngoZSl9ZnVuY3Rpb24gQm8oKXtpZighc2YmJkFyIT09bnVsbCl7c2Y9ITA7dmFyIGU9MCx0PU9lO3RyeXt2YXIgbj1Bcjtmb3IoT2U9MTtlPG4ubGVuZ3RoO2UrKyl7dmFyIHI9bltlXTtkbyByPXIoITApO3doaWxlKHIhPT1udWxsKX1Bcj1udWxsLEpjPSExfWNhdGNoKG8pe3Rocm93IEFyIT09bnVsbCYmKEFyPUFyLnNsaWNlKGUrMSkpLEkxKFhwLEJvKSxvfWZpbmFsbHl7T2U9dCxzZj0hMX19cmV0dXJuIG51bGx9dmFyIFppPVtdLHFpPTAsb2M9bnVsbCxpYz0wLE1uPVtdLExuPTAsY2k9bnVsbCxEcj0xLElyPSIiO2Z1bmN0aW9uIFlvKGUsdCl7WmlbcWkrK109aWMsWmlbcWkrK109b2Msb2M9ZSxpYz10fWZ1bmN0aW9uIGh4KGUsdCxuKXtNbltMbisrXT1EcixNbltMbisrXT1JcixNbltMbisrXT1jaSxjaT1lO3ZhciByPURyO2U9SXI7dmFyIG89MzItdHIociktMTtyJj1+KDE8PG8pLG4rPTE7dmFyIGk9MzItdHIodCkrbztpZigzMDxpKXt2YXIgbD1vLW8lNTtpPShyJigxPDxsKS0xKS50b1N0cmluZygzMikscj4+PWwsby09bCxEcj0xPDwzMi10cih0KStvfG48PG98cixJcj1pK2V9ZWxzZSBEcj0xPDxpfG48PG98cixJcj1lfWZ1bmN0aW9uIG9nKGUpe2UucmV0dXJuIT09bnVsbCYmKFlvKGUsMSksaHgoZSwxLDApKX1mdW5jdGlvbiBpZyhlKXtmb3IoO2U9PT1vYzspb2M9WmlbLS1xaV0sWmlbcWldPW51bGwsaWM9WmlbLS1xaV0sWmlbcWldPW51bGw7Zm9yKDtlPT09Y2k7KWNpPU1uWy0tTG5dLE1uW0xuXT1udWxsLElyPU1uWy0tTG5dLE1uW0xuXT1udWxsLERyPU1uWy0tTG5dLE1uW0xuXT1udWxsfXZhciBTbj1udWxsLF9uPW51bGwsWWU9ITEsWm49bnVsbDtmdW5jdGlvbiBweChlLHQpe3ZhciBuPWpuKDUsbnVsbCxudWxsLDApO24uZWxlbWVudFR5cGU9IkRFTEVURUQiLG4uc3RhdGVOb2RlPXQsbi5yZXR1cm49ZSx0PWUuZGVsZXRpb25zLHQ9PT1udWxsPyhlLmRlbGV0aW9ucz1bbl0sZS5mbGFnc3w9MTYpOnQucHVzaChuKX1mdW5jdGlvbiBPdihlLHQpe3N3aXRjaChlLnRhZyl7Y2FzZSA1OnZhciBuPWUudHlwZTtyZXR1cm4gdD10Lm5vZGVUeXBlIT09MXx8bi50b0xvd2VyQ2FzZSgpIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP251bGw6dCx0IT09bnVsbD8oZS5zdGF0ZU5vZGU9dCxTbj1lLF9uPVNvKHQuZmlyc3RDaGlsZCksITApOiExO2Nhc2UgNjpyZXR1cm4gdD1lLnBlbmRpbmdQcm9wcz09PSIifHx0Lm5vZGVUeXBlIT09Mz9udWxsOnQsdCE9PW51bGw/KGUuc3RhdGVOb2RlPXQsU249ZSxfbj1udWxsLCEwKTohMTtjYXNlIDEzOnJldHVybiB0PXQubm9kZVR5cGUhPT04P251bGw6dCx0IT09bnVsbD8obj1jaSE9PW51bGw/e2lkOkRyLG92ZXJmbG93OklyfTpudWxsLGUubWVtb2l6ZWRTdGF0ZT17ZGVoeWRyYXRlZDp0LHRyZWVDb250ZXh0Om4scmV0cnlMYW5lOjEwNzM3NDE4MjR9LG49am4oMTgsbnVsbCxudWxsLDApLG4uc3RhdGVOb2RlPXQsbi5yZXR1cm49ZSxlLmNoaWxkPW4sU249ZSxfbj1udWxsLCEwKTohMTtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBmaChlKXtyZXR1cm4oZS5tb2RlJjEpIT09MCYmKGUuZmxhZ3MmMTI4KT09PTB9ZnVuY3Rpb24gaGgoZSl7aWYoWWUpe3ZhciB0PV9uO2lmKHQpe3ZhciBuPXQ7aWYoIU92KGUsdCkpe2lmKGZoKGUpKXRocm93IEVycm9yKFUoNDE4KSk7dD1TbyhuLm5leHRTaWJsaW5nKTt2YXIgcj1Tbjt0JiZPdihlLHQpP3B4KHIsbik6KGUuZmxhZ3M9ZS5mbGFncyYtNDA5N3wyLFllPSExLFNuPWUpfX1lbHNle2lmKGZoKGUpKXRocm93IEVycm9yKFUoNDE4KSk7ZS5mbGFncz1lLmZsYWdzJi00MDk3fDIsWWU9ITEsU249ZX19fWZ1bmN0aW9uIEF2KGUpe2ZvcihlPWUucmV0dXJuO2UhPT1udWxsJiZlLnRhZyE9PTUmJmUudGFnIT09MyYmZS50YWchPT0xMzspZT1lLnJldHVybjtTbj1lfWZ1bmN0aW9uIGx1KGUpe2lmKGUhPT1TbilyZXR1cm4hMTtpZighWWUpcmV0dXJuIEF2KGUpLFllPSEwLCExO3ZhciB0O2lmKCh0PWUudGFnIT09MykmJiEodD1lLnRhZyE9PTUpJiYodD1lLnR5cGUsdD10IT09ImhlYWQiJiZ0IT09ImJvZHkiJiYhYWgoZS50eXBlLGUubWVtb2l6ZWRQcm9wcykpLHQmJih0PV9uKSl7aWYoZmgoZSkpdGhyb3cgZ3goKSxFcnJvcihVKDQxOCkpO2Zvcig7dDspcHgoZSx0KSx0PVNvKHQubmV4dFNpYmxpbmcpfWlmKEF2KGUpLGUudGFnPT09MTMpe2lmKGU9ZS5tZW1vaXplZFN0YXRlLGU9ZSE9PW51bGw/ZS5kZWh5ZHJhdGVkOm51bGwsIWUpdGhyb3cgRXJyb3IoVSgzMTcpKTtlOntmb3IoZT1lLm5leHRTaWJsaW5nLHQ9MDtlOyl7aWYoZS5ub2RlVHlwZT09PTgpe3ZhciBuPWUuZGF0YTtpZihuPT09Ii8kIil7aWYodD09PTApe19uPVNvKGUubmV4dFNpYmxpbmcpO2JyZWFrIGV9dC0tfWVsc2UgbiE9PSIkIiYmbiE9PSIkISImJm4hPT0iJD8ifHx0Kyt9ZT1lLm5leHRTaWJsaW5nfV9uPW51bGx9fWVsc2UgX249U24/U28oZS5zdGF0ZU5vZGUubmV4dFNpYmxpbmcpOm51bGw7cmV0dXJuITB9ZnVuY3Rpb24gZ3goKXtmb3IodmFyIGU9X247ZTspZT1TbyhlLm5leHRTaWJsaW5nKX1mdW5jdGlvbiBfbCgpe19uPVNuPW51bGwsWWU9ITF9ZnVuY3Rpb24gbGcoZSl7Wm49PT1udWxsP1puPVtlXTpabi5wdXNoKGUpfXZhciAkaz1Lci5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztmdW5jdGlvbiBYbihlLHQpe2lmKGUmJmUuZGVmYXVsdFByb3BzKXt0PW50KHt9LHQpLGU9ZS5kZWZhdWx0UHJvcHM7Zm9yKHZhciBuIGluIGUpdFtuXT09PXZvaWQgMCYmKHRbbl09ZVtuXSk7cmV0dXJuIHR9cmV0dXJuIHR9dmFyIGxjPUZvKG51bGwpLHNjPW51bGwsZWw9bnVsbCxzZz1udWxsO2Z1bmN0aW9uIGFnKCl7c2c9ZWw9c2M9bnVsbH1mdW5jdGlvbiB1ZyhlKXt2YXIgdD1sYy5jdXJyZW50O0dlKGxjKSxlLl9jdXJyZW50VmFsdWU9dH1mdW5jdGlvbiBwaChlLHQsbil7Zm9yKDtlIT09bnVsbDspe3ZhciByPWUuYWx0ZXJuYXRlO2lmKChlLmNoaWxkTGFuZXMmdCkhPT10PyhlLmNoaWxkTGFuZXN8PXQsciE9PW51bGwmJihyLmNoaWxkTGFuZXN8PXQpKTpyIT09bnVsbCYmKHIuY2hpbGRMYW5lcyZ0KSE9PXQmJihyLmNoaWxkTGFuZXN8PXQpLGU9PT1uKWJyZWFrO2U9ZS5yZXR1cm59fWZ1bmN0aW9uIGRsKGUsdCl7c2M9ZSxzZz1lbD1udWxsLGU9ZS5kZXBlbmRlbmNpZXMsZSE9PW51bGwmJmUuZmlyc3RDb250ZXh0IT09bnVsbCYmKGUubGFuZXMmdCYmKGRuPSEwKSxlLmZpcnN0Q29udGV4dD1udWxsKX1mdW5jdGlvbiBCbihlKXt2YXIgdD1lLl9jdXJyZW50VmFsdWU7aWYoc2chPT1lKWlmKGU9e2NvbnRleHQ6ZSxtZW1vaXplZFZhbHVlOnQsbmV4dDpudWxsfSxlbD09PW51bGwpe2lmKHNjPT09bnVsbCl0aHJvdyBFcnJvcihVKDMwOCkpO2VsPWUsc2MuZGVwZW5kZW5jaWVzPXtsYW5lczowLGZpcnN0Q29udGV4dDplfX1lbHNlIGVsPWVsLm5leHQ9ZTtyZXR1cm4gdH12YXIgcW89bnVsbDtmdW5jdGlvbiBjZyhlKXtxbz09PW51bGw/cW89W2VdOnFvLnB1c2goZSl9ZnVuY3Rpb24gbXgoZSx0LG4scil7dmFyIG89dC5pbnRlcmxlYXZlZDtyZXR1cm4gbz09PW51bGw/KG4ubmV4dD1uLGNnKHQpKToobi5uZXh0PW8ubmV4dCxvLm5leHQ9biksdC5pbnRlcmxlYXZlZD1uLEJyKGUscil9ZnVuY3Rpb24gQnIoZSx0KXtlLmxhbmVzfD10O3ZhciBuPWUuYWx0ZXJuYXRlO2ZvcihuIT09bnVsbCYmKG4ubGFuZXN8PXQpLG49ZSxlPWUucmV0dXJuO2UhPT1udWxsOyllLmNoaWxkTGFuZXN8PXQsbj1lLmFsdGVybmF0ZSxuIT09bnVsbCYmKG4uY2hpbGRMYW5lc3w9dCksbj1lLGU9ZS5yZXR1cm47cmV0dXJuIG4udGFnPT09Mz9uLnN0YXRlTm9kZTpudWxsfXZhciB1bz0hMTtmdW5jdGlvbiBkZyhlKXtlLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6ZS5tZW1vaXplZFN0YXRlLGZpcnN0QmFzZVVwZGF0ZTpudWxsLGxhc3RCYXNlVXBkYXRlOm51bGwsc2hhcmVkOntwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowfSxlZmZlY3RzOm51bGx9fWZ1bmN0aW9uIHZ4KGUsdCl7ZT1lLnVwZGF0ZVF1ZXVlLHQudXBkYXRlUXVldWU9PT1lJiYodC51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOmUuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTplLmZpcnN0QmFzZVVwZGF0ZSxsYXN0QmFzZVVwZGF0ZTplLmxhc3RCYXNlVXBkYXRlLHNoYXJlZDplLnNoYXJlZCxlZmZlY3RzOmUuZWZmZWN0c30pfWZ1bmN0aW9uIGpyKGUsdCl7cmV0dXJue2V2ZW50VGltZTplLGxhbmU6dCx0YWc6MCxwYXlsb2FkOm51bGwsY2FsbGJhY2s6bnVsbCxuZXh0Om51bGx9fWZ1bmN0aW9uIEVvKGUsdCxuKXt2YXIgcj1lLnVwZGF0ZVF1ZXVlO2lmKHI9PT1udWxsKXJldHVybiBudWxsO2lmKHI9ci5zaGFyZWQsa2UmMil7dmFyIG89ci5wZW5kaW5nO3JldHVybiBvPT09bnVsbD90Lm5leHQ9dDoodC5uZXh0PW8ubmV4dCxvLm5leHQ9dCksci5wZW5kaW5nPXQsQnIoZSxuKX1yZXR1cm4gbz1yLmludGVybGVhdmVkLG89PT1udWxsPyh0Lm5leHQ9dCxjZyhyKSk6KHQubmV4dD1vLm5leHQsby5uZXh0PXQpLHIuaW50ZXJsZWF2ZWQ9dCxCcihlLG4pfWZ1bmN0aW9uIE91KGUsdCxuKXtpZih0PXQudXBkYXRlUXVldWUsdCE9PW51bGwmJih0PXQuc2hhcmVkLChuJjQxOTQyNDApIT09MCkpe3ZhciByPXQubGFuZXM7ciY9ZS5wZW5kaW5nTGFuZXMsbnw9cix0LmxhbmVzPW4sUXAoZSxuKX19ZnVuY3Rpb24gTXYoZSx0KXt2YXIgbj1lLnVwZGF0ZVF1ZXVlLHI9ZS5hbHRlcm5hdGU7aWYociE9PW51bGwmJihyPXIudXBkYXRlUXVldWUsbj09PXIpKXt2YXIgbz1udWxsLGk9bnVsbDtpZihuPW4uZmlyc3RCYXNlVXBkYXRlLG4hPT1udWxsKXtkb3t2YXIgbD17ZXZlbnRUaW1lOm4uZXZlbnRUaW1lLGxhbmU6bi5sYW5lLHRhZzpuLnRhZyxwYXlsb2FkOm4ucGF5bG9hZCxjYWxsYmFjazpuLmNhbGxiYWNrLG5leHQ6bnVsbH07aT09PW51bGw/bz1pPWw6aT1pLm5leHQ9bCxuPW4ubmV4dH13aGlsZShuIT09bnVsbCk7aT09PW51bGw/bz1pPXQ6aT1pLm5leHQ9dH1lbHNlIG89aT10O249e2Jhc2VTdGF0ZTpyLmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6byxsYXN0QmFzZVVwZGF0ZTppLHNoYXJlZDpyLnNoYXJlZCxlZmZlY3RzOnIuZWZmZWN0c30sZS51cGRhdGVRdWV1ZT1uO3JldHVybn1lPW4ubGFzdEJhc2VVcGRhdGUsZT09PW51bGw/bi5maXJzdEJhc2VVcGRhdGU9dDplLm5leHQ9dCxuLmxhc3RCYXNlVXBkYXRlPXR9ZnVuY3Rpb24gYWMoZSx0LG4scil7dmFyIG89ZS51cGRhdGVRdWV1ZTt1bz0hMTt2YXIgaT1vLmZpcnN0QmFzZVVwZGF0ZSxsPW8ubGFzdEJhc2VVcGRhdGUscz1vLnNoYXJlZC5wZW5kaW5nO2lmKHMhPT1udWxsKXtvLnNoYXJlZC5wZW5kaW5nPW51bGw7dmFyIGE9cyx1PWEubmV4dDthLm5leHQ9bnVsbCxsPT09bnVsbD9pPXU6bC5uZXh0PXUsbD1hO3ZhciBjPWUuYWx0ZXJuYXRlO2MhPT1udWxsJiYoYz1jLnVwZGF0ZVF1ZXVlLHM9Yy5sYXN0QmFzZVVwZGF0ZSxzIT09bCYmKHM9PT1udWxsP2MuZmlyc3RCYXNlVXBkYXRlPXU6cy5uZXh0PXUsYy5sYXN0QmFzZVVwZGF0ZT1hKSl9aWYoaSE9PW51bGwpe3ZhciBkPW8uYmFzZVN0YXRlO2w9MCxjPXU9YT1udWxsLHM9aTtkb3t2YXIgZj1zLmxhbmUsaD1zLmV2ZW50VGltZTtpZigociZmKT09PWYpe2MhPT1udWxsJiYoYz1jLm5leHQ9e2V2ZW50VGltZTpoLGxhbmU6MCx0YWc6cy50YWcscGF5bG9hZDpzLnBheWxvYWQsY2FsbGJhY2s6cy5jYWxsYmFjayxuZXh0Om51bGx9KTtlOnt2YXIgbT1lLGc9cztzd2l0Y2goZj10LGg9bixnLnRhZyl7Y2FzZSAxOmlmKG09Zy5wYXlsb2FkLHR5cGVvZiBtPT0iZnVuY3Rpb24iKXtkPW0uY2FsbChoLGQsZik7YnJlYWsgZX1kPW07YnJlYWsgZTtjYXNlIDM6bS5mbGFncz1tLmZsYWdzJi02NTUzN3wxMjg7Y2FzZSAwOmlmKG09Zy5wYXlsb2FkLGY9dHlwZW9mIG09PSJmdW5jdGlvbiI/bS5jYWxsKGgsZCxmKTptLGY9PW51bGwpYnJlYWsgZTtkPW50KHt9LGQsZik7YnJlYWsgZTtjYXNlIDI6dW89ITB9fXMuY2FsbGJhY2shPT1udWxsJiZzLmxhbmUhPT0wJiYoZS5mbGFnc3w9NjQsZj1vLmVmZmVjdHMsZj09PW51bGw/by5lZmZlY3RzPVtzXTpmLnB1c2gocykpfWVsc2UgaD17ZXZlbnRUaW1lOmgsbGFuZTpmLHRhZzpzLnRhZyxwYXlsb2FkOnMucGF5bG9hZCxjYWxsYmFjazpzLmNhbGxiYWNrLG5leHQ6bnVsbH0sYz09PW51bGw/KHU9Yz1oLGE9ZCk6Yz1jLm5leHQ9aCxsfD1mO2lmKHM9cy5uZXh0LHM9PT1udWxsKXtpZihzPW8uc2hhcmVkLnBlbmRpbmcscz09PW51bGwpYnJlYWs7Zj1zLHM9Zi5uZXh0LGYubmV4dD1udWxsLG8ubGFzdEJhc2VVcGRhdGU9ZixvLnNoYXJlZC5wZW5kaW5nPW51bGx9fXdoaWxlKDEpO2lmKGM9PT1udWxsJiYoYT1kKSxvLmJhc2VTdGF0ZT1hLG8uZmlyc3RCYXNlVXBkYXRlPXUsby5sYXN0QmFzZVVwZGF0ZT1jLHQ9by5zaGFyZWQuaW50ZXJsZWF2ZWQsdCE9PW51bGwpe289dDtkbyBsfD1vLmxhbmUsbz1vLm5leHQ7d2hpbGUobyE9PXQpfWVsc2UgaT09PW51bGwmJihvLnNoYXJlZC5sYW5lcz0wKTtmaXw9bCxlLmxhbmVzPWwsZS5tZW1vaXplZFN0YXRlPWR9fWZ1bmN0aW9uIEx2KGUsdCxuKXtpZihlPXQuZWZmZWN0cyx0LmVmZmVjdHM9bnVsbCxlIT09bnVsbClmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgcj1lW3RdLG89ci5jYWxsYmFjaztpZihvIT09bnVsbCl7aWYoci5jYWxsYmFjaz1udWxsLHI9bix0eXBlb2YgbyE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihVKDE5MSxvKSk7by5jYWxsKHIpfX19dmFyIHl4PW5ldyBtMS5Db21wb25lbnQoKS5yZWZzO2Z1bmN0aW9uIGdoKGUsdCxuLHIpe3Q9ZS5tZW1vaXplZFN0YXRlLG49bihyLHQpLG49bj09bnVsbD90Om50KHt9LHQsbiksZS5tZW1vaXplZFN0YXRlPW4sZS5sYW5lcz09PTAmJihlLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1uKX12YXIgWmM9e2lzTW91bnRlZDpmdW5jdGlvbihlKXtyZXR1cm4oZT1lLl9yZWFjdEludGVybmFscyk/U2koZSk9PT1lOiExfSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oZSx0LG4pe2U9ZS5fcmVhY3RJbnRlcm5hbHM7dmFyIHI9b24oKSxvPSRvKGUpLGk9anIocixvKTtpLnBheWxvYWQ9dCxuIT1udWxsJiYoaS5jYWxsYmFjaz1uKSx0PUVvKGUsaSxvKSx0IT09bnVsbCYmKG5yKHQsZSxvLHIpLE91KHQsZSxvKSl9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oZSx0LG4pe2U9ZS5fcmVhY3RJbnRlcm5hbHM7dmFyIHI9b24oKSxvPSRvKGUpLGk9anIocixvKTtpLnRhZz0xLGkucGF5bG9hZD10LG4hPW51bGwmJihpLmNhbGxiYWNrPW4pLHQ9RW8oZSxpLG8pLHQhPT1udWxsJiYobnIodCxlLG8sciksT3UodCxlLG8pKX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKGUsdCl7ZT1lLl9yZWFjdEludGVybmFsczt2YXIgbj1vbigpLHI9JG8oZSksbz1qcihuLHIpO28udGFnPTIsdCE9bnVsbCYmKG8uY2FsbGJhY2s9dCksdD1FbyhlLG8sciksdCE9PW51bGwmJihucih0LGUscixuKSxPdSh0LGUscikpfX07ZnVuY3Rpb24gRHYoZSx0LG4scixvLGksbCl7cmV0dXJuIGU9ZS5zdGF0ZU5vZGUsdHlwZW9mIGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlPT0iZnVuY3Rpb24iP2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKHIsaSxsKTp0LnByb3RvdHlwZSYmdC5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQ/IW5hKG4scil8fCFuYShvLGkpOiEwfWZ1bmN0aW9uIHh4KGUsdCxuKXt2YXIgcj0hMSxvPVJvLGk9dC5jb250ZXh0VHlwZTtyZXR1cm4gdHlwZW9mIGk9PSJvYmplY3QiJiZpIT09bnVsbD9pPUJuKGkpOihvPWhuKHQpP3VpOlh0LmN1cnJlbnQscj10LmNvbnRleHRUeXBlcyxpPShyPXIhPW51bGwpP3dsKGUsbyk6Um8pLHQ9bmV3IHQobixpKSxlLm1lbW9pemVkU3RhdGU9dC5zdGF0ZSE9PW51bGwmJnQuc3RhdGUhPT12b2lkIDA/dC5zdGF0ZTpudWxsLHQudXBkYXRlcj1aYyxlLnN0YXRlTm9kZT10LHQuX3JlYWN0SW50ZXJuYWxzPWUsciYmKGU9ZS5zdGF0ZU5vZGUsZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PW8sZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1pKSx0fWZ1bmN0aW9uIEl2KGUsdCxuLHIpe2U9dC5zdGF0ZSx0eXBlb2YgdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzPT0iZnVuY3Rpb24iJiZ0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobixyKSx0eXBlb2YgdC5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcz09ImZ1bmN0aW9uIiYmdC5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuLHIpLHQuc3RhdGUhPT1lJiZaYy5lbnF1ZXVlUmVwbGFjZVN0YXRlKHQsdC5zdGF0ZSxudWxsKX1mdW5jdGlvbiBtaChlLHQsbixyKXt2YXIgbz1lLnN0YXRlTm9kZTtvLnByb3BzPW4sby5zdGF0ZT1lLm1lbW9pemVkU3RhdGUsby5yZWZzPXl4LGRnKGUpO3ZhciBpPXQuY29udGV4dFR5cGU7dHlwZW9mIGk9PSJvYmplY3QiJiZpIT09bnVsbD9vLmNvbnRleHQ9Qm4oaSk6KGk9aG4odCk/dWk6WHQuY3VycmVudCxvLmNvbnRleHQ9d2woZSxpKSksby5zdGF0ZT1lLm1lbW9pemVkU3RhdGUsaT10LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyx0eXBlb2YgaT09ImZ1bmN0aW9uIiYmKGdoKGUsdCxpLG4pLG8uc3RhdGU9ZS5tZW1vaXplZFN0YXRlKSx0eXBlb2YgdC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM9PSJmdW5jdGlvbiJ8fHR5cGVvZiBvLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24ifHx0eXBlb2Ygby5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24iJiZ0eXBlb2Ygby5jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiJ8fCh0PW8uc3RhdGUsdHlwZW9mIG8uY29tcG9uZW50V2lsbE1vdW50PT0iZnVuY3Rpb24iJiZvLmNvbXBvbmVudFdpbGxNb3VudCgpLHR5cGVvZiBvLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJm8uVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpLHQhPT1vLnN0YXRlJiZaYy5lbnF1ZXVlUmVwbGFjZVN0YXRlKG8sby5zdGF0ZSxudWxsKSxhYyhlLG4sbyxyKSxvLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSksdHlwZW9mIG8uY29tcG9uZW50RGlkTW91bnQ9PSJmdW5jdGlvbiImJihlLmZsYWdzfD00MTk0MzA4KX1mdW5jdGlvbiBhcyhlLHQsbil7aWYoZT1uLnJlZixlIT09bnVsbCYmdHlwZW9mIGUhPSJmdW5jdGlvbiImJnR5cGVvZiBlIT0ib2JqZWN0Iil7aWYobi5fb3duZXIpe2lmKG49bi5fb3duZXIsbil7aWYobi50YWchPT0xKXRocm93IEVycm9yKFUoMzA5KSk7dmFyIHI9bi5zdGF0ZU5vZGV9aWYoIXIpdGhyb3cgRXJyb3IoVSgxNDcsZSkpO3ZhciBvPXIsaT0iIitlO3JldHVybiB0IT09bnVsbCYmdC5yZWYhPT1udWxsJiZ0eXBlb2YgdC5yZWY9PSJmdW5jdGlvbiImJnQucmVmLl9zdHJpbmdSZWY9PT1pP3QucmVmOih0PWZ1bmN0aW9uKGwpe3ZhciBzPW8ucmVmcztzPT09eXgmJihzPW8ucmVmcz17fSksbD09PW51bGw/ZGVsZXRlIHNbaV06c1tpXT1sfSx0Ll9zdHJpbmdSZWY9aSx0KX1pZih0eXBlb2YgZSE9InN0cmluZyIpdGhyb3cgRXJyb3IoVSgyODQpKTtpZighbi5fb3duZXIpdGhyb3cgRXJyb3IoVSgyOTAsZSkpfXJldHVybiBlfWZ1bmN0aW9uIHN1KGUsdCl7dGhyb3cgZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCksRXJyb3IoVSgzMSxlPT09IltvYmplY3QgT2JqZWN0XSI/Im9iamVjdCB3aXRoIGtleXMgeyIrT2JqZWN0LmtleXModCkuam9pbigiLCAiKSsifSI6ZSkpfWZ1bmN0aW9uIGp2KGUpe3ZhciB0PWUuX2luaXQ7cmV0dXJuIHQoZS5fcGF5bG9hZCl9ZnVuY3Rpb24gd3goZSl7ZnVuY3Rpb24gdCh2LHkpe2lmKGUpe3ZhciB4PXYuZGVsZXRpb25zO3g9PT1udWxsPyh2LmRlbGV0aW9ucz1beV0sdi5mbGFnc3w9MTYpOngucHVzaCh5KX19ZnVuY3Rpb24gbih2LHkpe2lmKCFlKXJldHVybiBudWxsO2Zvcig7eSE9PW51bGw7KXQodix5KSx5PXkuc2libGluZztyZXR1cm4gbnVsbH1mdW5jdGlvbiByKHYseSl7Zm9yKHY9bmV3IE1hcDt5IT09bnVsbDspeS5rZXkhPT1udWxsP3Yuc2V0KHkua2V5LHkpOnYuc2V0KHkuaW5kZXgseSkseT15LnNpYmxpbmc7cmV0dXJuIHZ9ZnVuY3Rpb24gbyh2LHkpe3JldHVybiB2PWtvKHYseSksdi5pbmRleD0wLHYuc2libGluZz1udWxsLHZ9ZnVuY3Rpb24gaSh2LHkseCl7cmV0dXJuIHYuaW5kZXg9eCxlPyh4PXYuYWx0ZXJuYXRlLHghPT1udWxsPyh4PXguaW5kZXgseDx5Pyh2LmZsYWdzfD0yLHkpOngpOih2LmZsYWdzfD0yLHkpKToodi5mbGFnc3w9MTA0ODU3Nix5KX1mdW5jdGlvbiBsKHYpe3JldHVybiBlJiZ2LmFsdGVybmF0ZT09PW51bGwmJih2LmZsYWdzfD0yKSx2fWZ1bmN0aW9uIHModix5LHgsdyl7cmV0dXJuIHk9PT1udWxsfHx5LnRhZyE9PTY/KHk9cGYoeCx2Lm1vZGUsdykseS5yZXR1cm49dix5KTooeT1vKHkseCkseS5yZXR1cm49dix5KX1mdW5jdGlvbiBhKHYseSx4LHcpe3ZhciBrPXgudHlwZTtyZXR1cm4gaz09PUtpP2Modix5LHgucHJvcHMuY2hpbGRyZW4sdyx4LmtleSk6eSE9PW51bGwmJih5LmVsZW1lbnRUeXBlPT09a3x8dHlwZW9mIGs9PSJvYmplY3QiJiZrIT09bnVsbCYmay4kJHR5cGVvZj09PWFvJiZqdihrKT09PXkudHlwZSk/KHc9byh5LHgucHJvcHMpLHcucmVmPWFzKHYseSx4KSx3LnJldHVybj12LHcpOih3PWp1KHgudHlwZSx4LmtleSx4LnByb3BzLG51bGwsdi5tb2RlLHcpLHcucmVmPWFzKHYseSx4KSx3LnJldHVybj12LHcpfWZ1bmN0aW9uIHUodix5LHgsdyl7cmV0dXJuIHk9PT1udWxsfHx5LnRhZyE9PTR8fHkuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8hPT14LmNvbnRhaW5lckluZm98fHkuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uIT09eC5pbXBsZW1lbnRhdGlvbj8oeT1nZih4LHYubW9kZSx3KSx5LnJldHVybj12LHkpOih5PW8oeSx4LmNoaWxkcmVufHxbXSkseS5yZXR1cm49dix5KX1mdW5jdGlvbiBjKHYseSx4LHcsayl7cmV0dXJuIHk9PT1udWxsfHx5LnRhZyE9PTc/KHk9b2koeCx2Lm1vZGUsdyxrKSx5LnJldHVybj12LHkpOih5PW8oeSx4KSx5LnJldHVybj12LHkpfWZ1bmN0aW9uIGQodix5LHgpe2lmKHR5cGVvZiB5PT0ic3RyaW5nIiYmeSE9PSIifHx0eXBlb2YgeT09Im51bWJlciIpcmV0dXJuIHk9cGYoIiIreSx2Lm1vZGUseCkseS5yZXR1cm49dix5O2lmKHR5cGVvZiB5PT0ib2JqZWN0IiYmeSE9PW51bGwpe3N3aXRjaCh5LiQkdHlwZW9mKXtjYXNlIFFhOnJldHVybiB4PWp1KHkudHlwZSx5LmtleSx5LnByb3BzLG51bGwsdi5tb2RlLHgpLHgucmVmPWFzKHYsbnVsbCx5KSx4LnJldHVybj12LHg7Y2FzZSBIaTpyZXR1cm4geT1nZih5LHYubW9kZSx4KSx5LnJldHVybj12LHk7Y2FzZSBhbzp2YXIgdz15Ll9pbml0O3JldHVybiBkKHYsdyh5Ll9wYXlsb2FkKSx4KX1pZih4cyh5KXx8cnMoeSkpcmV0dXJuIHk9b2koeSx2Lm1vZGUseCxudWxsKSx5LnJldHVybj12LHk7c3Uodix5KX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBmKHYseSx4LHcpe3ZhciBrPXkhPT1udWxsP3kua2V5Om51bGw7aWYodHlwZW9mIHg9PSJzdHJpbmciJiZ4IT09IiJ8fHR5cGVvZiB4PT0ibnVtYmVyIilyZXR1cm4gayE9PW51bGw/bnVsbDpzKHYseSwiIit4LHcpO2lmKHR5cGVvZiB4PT0ib2JqZWN0IiYmeCE9PW51bGwpe3N3aXRjaCh4LiQkdHlwZW9mKXtjYXNlIFFhOnJldHVybiB4LmtleT09PWs/YSh2LHkseCx3KTpudWxsO2Nhc2UgSGk6cmV0dXJuIHgua2V5PT09az91KHYseSx4LHcpOm51bGw7Y2FzZSBhbzpyZXR1cm4gaz14Ll9pbml0LGYodix5LGsoeC5fcGF5bG9hZCksdyl9aWYoeHMoeCl8fHJzKHgpKXJldHVybiBrIT09bnVsbD9udWxsOmModix5LHgsdyxudWxsKTtzdSh2LHgpfXJldHVybiBudWxsfWZ1bmN0aW9uIGgodix5LHgsdyxrKXtpZih0eXBlb2Ygdz09InN0cmluZyImJnchPT0iInx8dHlwZW9mIHc9PSJudW1iZXIiKXJldHVybiB2PXYuZ2V0KHgpfHxudWxsLHMoeSx2LCIiK3csayk7aWYodHlwZW9mIHc9PSJvYmplY3QiJiZ3IT09bnVsbCl7c3dpdGNoKHcuJCR0eXBlb2Ype2Nhc2UgUWE6cmV0dXJuIHY9di5nZXQody5rZXk9PT1udWxsP3g6dy5rZXkpfHxudWxsLGEoeSx2LHcsayk7Y2FzZSBIaTpyZXR1cm4gdj12LmdldCh3LmtleT09PW51bGw/eDp3LmtleSl8fG51bGwsdSh5LHYsdyxrKTtjYXNlIGFvOnZhciBiPXcuX2luaXQ7cmV0dXJuIGgodix5LHgsYih3Ll9wYXlsb2FkKSxrKX1pZih4cyh3KXx8cnModykpcmV0dXJuIHY9di5nZXQoeCl8fG51bGwsYyh5LHYsdyxrLG51bGwpO3N1KHksdyl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gbSh2LHkseCx3KXtmb3IodmFyIGs9bnVsbCxiPW51bGwsVD15LE49eT0wLEQ9bnVsbDtUIT09bnVsbCYmTjx4Lmxlbmd0aDtOKyspe1QuaW5kZXg+Tj8oRD1ULFQ9bnVsbCk6RD1ULnNpYmxpbmc7dmFyIE89Zih2LFQseFtOXSx3KTtpZihPPT09bnVsbCl7VD09PW51bGwmJihUPUQpO2JyZWFrfWUmJlQmJk8uYWx0ZXJuYXRlPT09bnVsbCYmdCh2LFQpLHk9aShPLHksTiksYj09PW51bGw/az1POmIuc2libGluZz1PLGI9TyxUPUR9aWYoTj09PXgubGVuZ3RoKXJldHVybiBuKHYsVCksWWUmJllvKHYsTiksaztpZihUPT09bnVsbCl7Zm9yKDtOPHgubGVuZ3RoO04rKylUPWQodix4W05dLHcpLFQhPT1udWxsJiYoeT1pKFQseSxOKSxiPT09bnVsbD9rPVQ6Yi5zaWJsaW5nPVQsYj1UKTtyZXR1cm4gWWUmJllvKHYsTiksa31mb3IoVD1yKHYsVCk7Tjx4Lmxlbmd0aDtOKyspRD1oKFQsdixOLHhbTl0sdyksRCE9PW51bGwmJihlJiZELmFsdGVybmF0ZSE9PW51bGwmJlQuZGVsZXRlKEQua2V5PT09bnVsbD9OOkQua2V5KSx5PWkoRCx5LE4pLGI9PT1udWxsP2s9RDpiLnNpYmxpbmc9RCxiPUQpO3JldHVybiBlJiZULmZvckVhY2goZnVuY3Rpb24oail7cmV0dXJuIHQodixqKX0pLFllJiZZbyh2LE4pLGt9ZnVuY3Rpb24gZyh2LHkseCx3KXt2YXIgaz1ycyh4KTtpZih0eXBlb2YgayE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihVKDE1MCkpO2lmKHg9ay5jYWxsKHgpLHg9PW51bGwpdGhyb3cgRXJyb3IoVSgxNTEpKTtmb3IodmFyIGI9az1udWxsLFQ9eSxOPXk9MCxEPW51bGwsTz14Lm5leHQoKTtUIT09bnVsbCYmIU8uZG9uZTtOKyssTz14Lm5leHQoKSl7VC5pbmRleD5OPyhEPVQsVD1udWxsKTpEPVQuc2libGluZzt2YXIgaj1mKHYsVCxPLnZhbHVlLHcpO2lmKGo9PT1udWxsKXtUPT09bnVsbCYmKFQ9RCk7YnJlYWt9ZSYmVCYmai5hbHRlcm5hdGU9PT1udWxsJiZ0KHYsVCkseT1pKGoseSxOKSxiPT09bnVsbD9rPWo6Yi5zaWJsaW5nPWosYj1qLFQ9RH1pZihPLmRvbmUpcmV0dXJuIG4odixUKSxZZSYmWW8odixOKSxrO2lmKFQ9PT1udWxsKXtmb3IoOyFPLmRvbmU7TisrLE89eC5uZXh0KCkpTz1kKHYsTy52YWx1ZSx3KSxPIT09bnVsbCYmKHk9aShPLHksTiksYj09PW51bGw/az1POmIuc2libGluZz1PLGI9Tyk7cmV0dXJuIFllJiZZbyh2LE4pLGt9Zm9yKFQ9cih2LFQpOyFPLmRvbmU7TisrLE89eC5uZXh0KCkpTz1oKFQsdixOLE8udmFsdWUsdyksTyE9PW51bGwmJihlJiZPLmFsdGVybmF0ZSE9PW51bGwmJlQuZGVsZXRlKE8ua2V5PT09bnVsbD9OOk8ua2V5KSx5PWkoTyx5LE4pLGI9PT1udWxsP2s9TzpiLnNpYmxpbmc9TyxiPU8pO3JldHVybiBlJiZULmZvckVhY2goZnVuY3Rpb24oQil7cmV0dXJuIHQodixCKX0pLFllJiZZbyh2LE4pLGt9ZnVuY3Rpb24gUyh2LHkseCx3KXtpZih0eXBlb2YgeD09Im9iamVjdCImJnghPT1udWxsJiZ4LnR5cGU9PT1LaSYmeC5rZXk9PT1udWxsJiYoeD14LnByb3BzLmNoaWxkcmVuKSx0eXBlb2YgeD09Im9iamVjdCImJnghPT1udWxsKXtzd2l0Y2goeC4kJHR5cGVvZil7Y2FzZSBRYTplOntmb3IodmFyIGs9eC5rZXksYj15O2IhPT1udWxsOyl7aWYoYi5rZXk9PT1rKXtpZihrPXgudHlwZSxrPT09S2kpe2lmKGIudGFnPT09Nyl7bih2LGIuc2libGluZykseT1vKGIseC5wcm9wcy5jaGlsZHJlbikseS5yZXR1cm49dix2PXk7YnJlYWsgZX19ZWxzZSBpZihiLmVsZW1lbnRUeXBlPT09a3x8dHlwZW9mIGs9PSJvYmplY3QiJiZrIT09bnVsbCYmay4kJHR5cGVvZj09PWFvJiZqdihrKT09PWIudHlwZSl7bih2LGIuc2libGluZykseT1vKGIseC5wcm9wcykseS5yZWY9YXModixiLHgpLHkucmV0dXJuPXYsdj15O2JyZWFrIGV9bih2LGIpO2JyZWFrfWVsc2UgdCh2LGIpO2I9Yi5zaWJsaW5nfXgudHlwZT09PUtpPyh5PW9pKHgucHJvcHMuY2hpbGRyZW4sdi5tb2RlLHcseC5rZXkpLHkucmV0dXJuPXYsdj15KToodz1qdSh4LnR5cGUseC5rZXkseC5wcm9wcyxudWxsLHYubW9kZSx3KSx3LnJlZj1hcyh2LHkseCksdy5yZXR1cm49dix2PXcpfXJldHVybiBsKHYpO2Nhc2UgSGk6ZTp7Zm9yKGI9eC5rZXk7eSE9PW51bGw7KXtpZih5LmtleT09PWIpaWYoeS50YWc9PT00JiZ5LnN0YXRlTm9kZS5jb250YWluZXJJbmZvPT09eC5jb250YWluZXJJbmZvJiZ5LnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbj09PXguaW1wbGVtZW50YXRpb24pe24odix5LnNpYmxpbmcpLHk9byh5LHguY2hpbGRyZW58fFtdKSx5LnJldHVybj12LHY9eTticmVhayBlfWVsc2V7bih2LHkpO2JyZWFrfWVsc2UgdCh2LHkpO3k9eS5zaWJsaW5nfXk9Z2YoeCx2Lm1vZGUsdykseS5yZXR1cm49dix2PXl9cmV0dXJuIGwodik7Y2FzZSBhbzpyZXR1cm4gYj14Ll9pbml0LFModix5LGIoeC5fcGF5bG9hZCksdyl9aWYoeHMoeCkpcmV0dXJuIG0odix5LHgsdyk7aWYocnMoeCkpcmV0dXJuIGcodix5LHgsdyk7c3Uodix4KX1yZXR1cm4gdHlwZW9mIHg9PSJzdHJpbmciJiZ4IT09IiJ8fHR5cGVvZiB4PT0ibnVtYmVyIj8oeD0iIit4LHkhPT1udWxsJiZ5LnRhZz09PTY/KG4odix5LnNpYmxpbmcpLHk9byh5LHgpLHkucmV0dXJuPXYsdj15KToobih2LHkpLHk9cGYoeCx2Lm1vZGUsdykseS5yZXR1cm49dix2PXkpLGwodikpOm4odix5KX1yZXR1cm4gU312YXIgU2w9d3goITApLF94PXd4KCExKSxBYT17fSx2cj1GbyhBYSksbGE9Rm8oQWEpLHNhPUZvKEFhKTtmdW5jdGlvbiBlaShlKXtpZihlPT09QWEpdGhyb3cgRXJyb3IoVSgxNzQpKTtyZXR1cm4gZX1mdW5jdGlvbiBmZyhlLHQpe3N3aXRjaChGZShzYSx0KSxGZShsYSxlKSxGZSh2cixBYSksZT10Lm5vZGVUeXBlLGUpe2Nhc2UgOTpjYXNlIDExOnQ9KHQ9dC5kb2N1bWVudEVsZW1lbnQpP3QubmFtZXNwYWNlVVJJOllmKG51bGwsIiIpO2JyZWFrO2RlZmF1bHQ6ZT1lPT09OD90LnBhcmVudE5vZGU6dCx0PWUubmFtZXNwYWNlVVJJfHxudWxsLGU9ZS50YWdOYW1lLHQ9WWYodCxlKX1HZSh2ciksRmUodnIsdCl9ZnVuY3Rpb24gRWwoKXtHZSh2ciksR2UobGEpLEdlKHNhKX1mdW5jdGlvbiBTeChlKXtlaShzYS5jdXJyZW50KTt2YXIgdD1laSh2ci5jdXJyZW50KSxuPVlmKHQsZS50eXBlKTt0IT09biYmKEZlKGxhLGUpLEZlKHZyLG4pKX1mdW5jdGlvbiBoZyhlKXtsYS5jdXJyZW50PT09ZSYmKEdlKHZyKSxHZShsYSkpfXZhciBaZT1GbygwKTtmdW5jdGlvbiB1YyhlKXtmb3IodmFyIHQ9ZTt0IT09bnVsbDspe2lmKHQudGFnPT09MTMpe3ZhciBuPXQubWVtb2l6ZWRTdGF0ZTtpZihuIT09bnVsbCYmKG49bi5kZWh5ZHJhdGVkLG49PT1udWxsfHxuLmRhdGE9PT0iJD8ifHxuLmRhdGE9PT0iJCEiKSlyZXR1cm4gdH1lbHNlIGlmKHQudGFnPT09MTkmJnQubWVtb2l6ZWRQcm9wcy5yZXZlYWxPcmRlciE9PXZvaWQgMCl7aWYodC5mbGFncyYxMjgpcmV0dXJuIHR9ZWxzZSBpZih0LmNoaWxkIT09bnVsbCl7dC5jaGlsZC5yZXR1cm49dCx0PXQuY2hpbGQ7Y29udGludWV9aWYodD09PWUpYnJlYWs7Zm9yKDt0LnNpYmxpbmc9PT1udWxsOyl7aWYodC5yZXR1cm49PT1udWxsfHx0LnJldHVybj09PWUpcmV0dXJuIG51bGw7dD10LnJldHVybn10LnNpYmxpbmcucmV0dXJuPXQucmV0dXJuLHQ9dC5zaWJsaW5nfXJldHVybiBudWxsfXZhciBhZj1bXTtmdW5jdGlvbiBwZygpe2Zvcih2YXIgZT0wO2U8YWYubGVuZ3RoO2UrKylhZltlXS5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeT1udWxsO2FmLmxlbmd0aD0wfXZhciBBdT1Lci5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLHVmPUtyLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLGRpPTAsZXQ9bnVsbCx2dD1udWxsLCR0PW51bGwsY2M9ITEsUHM9ITEsYWE9MCxraz0wO2Z1bmN0aW9uIEJ0KCl7dGhyb3cgRXJyb3IoVSgzMjEpKX1mdW5jdGlvbiBnZyhlLHQpe2lmKHQ9PT1udWxsKXJldHVybiExO2Zvcih2YXIgbj0wO248dC5sZW5ndGgmJm48ZS5sZW5ndGg7bisrKWlmKCFycihlW25dLHRbbl0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIG1nKGUsdCxuLHIsbyxpKXtpZihkaT1pLGV0PXQsdC5tZW1vaXplZFN0YXRlPW51bGwsdC51cGRhdGVRdWV1ZT1udWxsLHQubGFuZXM9MCxBdS5jdXJyZW50PWU9PT1udWxsfHxlLm1lbW9pemVkU3RhdGU9PT1udWxsP1JrOlBrLGU9bihyLG8pLFBzKXtpPTA7ZG97aWYoUHM9ITEsYWE9MCwyNTw9aSl0aHJvdyBFcnJvcihVKDMwMSkpO2krPTEsJHQ9dnQ9bnVsbCx0LnVwZGF0ZVF1ZXVlPW51bGwsQXUuY3VycmVudD1PayxlPW4ocixvKX13aGlsZShQcyl9aWYoQXUuY3VycmVudD1kYyx0PXZ0IT09bnVsbCYmdnQubmV4dCE9PW51bGwsZGk9MCwkdD12dD1ldD1udWxsLGNjPSExLHQpdGhyb3cgRXJyb3IoVSgzMDApKTtyZXR1cm4gZX1mdW5jdGlvbiB2Zygpe3ZhciBlPWFhIT09MDtyZXR1cm4gYWE9MCxlfWZ1bmN0aW9uIHVyKCl7dmFyIGU9e21lbW9pemVkU3RhdGU6bnVsbCxiYXNlU3RhdGU6bnVsbCxiYXNlUXVldWU6bnVsbCxxdWV1ZTpudWxsLG5leHQ6bnVsbH07cmV0dXJuICR0PT09bnVsbD9ldC5tZW1vaXplZFN0YXRlPSR0PWU6JHQ9JHQubmV4dD1lLCR0fWZ1bmN0aW9uIFduKCl7aWYodnQ9PT1udWxsKXt2YXIgZT1ldC5hbHRlcm5hdGU7ZT1lIT09bnVsbD9lLm1lbW9pemVkU3RhdGU6bnVsbH1lbHNlIGU9dnQubmV4dDt2YXIgdD0kdD09PW51bGw/ZXQubWVtb2l6ZWRTdGF0ZTokdC5uZXh0O2lmKHQhPT1udWxsKSR0PXQsdnQ9ZTtlbHNle2lmKGU9PT1udWxsKXRocm93IEVycm9yKFUoMzEwKSk7dnQ9ZSxlPXttZW1vaXplZFN0YXRlOnZ0Lm1lbW9pemVkU3RhdGUsYmFzZVN0YXRlOnZ0LmJhc2VTdGF0ZSxiYXNlUXVldWU6dnQuYmFzZVF1ZXVlLHF1ZXVlOnZ0LnF1ZXVlLG5leHQ6bnVsbH0sJHQ9PT1udWxsP2V0Lm1lbW9pemVkU3RhdGU9JHQ9ZTokdD0kdC5uZXh0PWV9cmV0dXJuICR0fWZ1bmN0aW9uIHVhKGUsdCl7cmV0dXJuIHR5cGVvZiB0PT0iZnVuY3Rpb24iP3QoZSk6dH1mdW5jdGlvbiBjZihlKXt2YXIgdD1XbigpLG49dC5xdWV1ZTtpZihuPT09bnVsbCl0aHJvdyBFcnJvcihVKDMxMSkpO24ubGFzdFJlbmRlcmVkUmVkdWNlcj1lO3ZhciByPXZ0LG89ci5iYXNlUXVldWUsaT1uLnBlbmRpbmc7aWYoaSE9PW51bGwpe2lmKG8hPT1udWxsKXt2YXIgbD1vLm5leHQ7by5uZXh0PWkubmV4dCxpLm5leHQ9bH1yLmJhc2VRdWV1ZT1vPWksbi5wZW5kaW5nPW51bGx9aWYobyE9PW51bGwpe2k9by5uZXh0LHI9ci5iYXNlU3RhdGU7dmFyIHM9bD1udWxsLGE9bnVsbCx1PWk7ZG97dmFyIGM9dS5sYW5lO2lmKChkaSZjKT09PWMpYSE9PW51bGwmJihhPWEubmV4dD17bGFuZTowLGFjdGlvbjp1LmFjdGlvbixoYXNFYWdlclN0YXRlOnUuaGFzRWFnZXJTdGF0ZSxlYWdlclN0YXRlOnUuZWFnZXJTdGF0ZSxuZXh0Om51bGx9KSxyPXUuaGFzRWFnZXJTdGF0ZT91LmVhZ2VyU3RhdGU6ZShyLHUuYWN0aW9uKTtlbHNle3ZhciBkPXtsYW5lOmMsYWN0aW9uOnUuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6dS5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6dS5lYWdlclN0YXRlLG5leHQ6bnVsbH07YT09PW51bGw/KHM9YT1kLGw9cik6YT1hLm5leHQ9ZCxldC5sYW5lc3w9YyxmaXw9Y311PXUubmV4dH13aGlsZSh1IT09bnVsbCYmdSE9PWkpO2E9PT1udWxsP2w9cjphLm5leHQ9cyxycihyLHQubWVtb2l6ZWRTdGF0ZSl8fChkbj0hMCksdC5tZW1vaXplZFN0YXRlPXIsdC5iYXNlU3RhdGU9bCx0LmJhc2VRdWV1ZT1hLG4ubGFzdFJlbmRlcmVkU3RhdGU9cn1pZihlPW4uaW50ZXJsZWF2ZWQsZSE9PW51bGwpe289ZTtkbyBpPW8ubGFuZSxldC5sYW5lc3w9aSxmaXw9aSxvPW8ubmV4dDt3aGlsZShvIT09ZSl9ZWxzZSBvPT09bnVsbCYmKG4ubGFuZXM9MCk7cmV0dXJuW3QubWVtb2l6ZWRTdGF0ZSxuLmRpc3BhdGNoXX1mdW5jdGlvbiBkZihlKXt2YXIgdD1XbigpLG49dC5xdWV1ZTtpZihuPT09bnVsbCl0aHJvdyBFcnJvcihVKDMxMSkpO24ubGFzdFJlbmRlcmVkUmVkdWNlcj1lO3ZhciByPW4uZGlzcGF0Y2gsbz1uLnBlbmRpbmcsaT10Lm1lbW9pemVkU3RhdGU7aWYobyE9PW51bGwpe24ucGVuZGluZz1udWxsO3ZhciBsPW89by5uZXh0O2RvIGk9ZShpLGwuYWN0aW9uKSxsPWwubmV4dDt3aGlsZShsIT09byk7cnIoaSx0Lm1lbW9pemVkU3RhdGUpfHwoZG49ITApLHQubWVtb2l6ZWRTdGF0ZT1pLHQuYmFzZVF1ZXVlPT09bnVsbCYmKHQuYmFzZVN0YXRlPWkpLG4ubGFzdFJlbmRlcmVkU3RhdGU9aX1yZXR1cm5baSxyXX1mdW5jdGlvbiBFeCgpe31mdW5jdGlvbiBDeChlLHQpe3ZhciBuPWV0LHI9V24oKSxvPXQoKSxpPSFycihyLm1lbW9pemVkU3RhdGUsbyk7aWYoaSYmKHIubWVtb2l6ZWRTdGF0ZT1vLGRuPSEwKSxyPXIucXVldWUseWcoVHguYmluZChudWxsLG4scixlKSxbZV0pLHIuZ2V0U25hcHNob3QhPT10fHxpfHwkdCE9PW51bGwmJiR0Lm1lbW9pemVkU3RhdGUudGFnJjEpe2lmKG4uZmxhZ3N8PTIwNDgsY2EoOSxreC5iaW5kKG51bGwsbixyLG8sdCksdm9pZCAwLG51bGwpLFJ0PT09bnVsbCl0aHJvdyBFcnJvcihVKDM0OSkpO2RpJjMwfHwkeChuLHQsbyl9cmV0dXJuIG99ZnVuY3Rpb24gJHgoZSx0LG4pe2UuZmxhZ3N8PTE2Mzg0LGU9e2dldFNuYXBzaG90OnQsdmFsdWU6bn0sdD1ldC51cGRhdGVRdWV1ZSx0PT09bnVsbD8odD17bGFzdEVmZmVjdDpudWxsLHN0b3JlczpudWxsfSxldC51cGRhdGVRdWV1ZT10LHQuc3RvcmVzPVtlXSk6KG49dC5zdG9yZXMsbj09PW51bGw/dC5zdG9yZXM9W2VdOm4ucHVzaChlKSl9ZnVuY3Rpb24ga3goZSx0LG4scil7dC52YWx1ZT1uLHQuZ2V0U25hcHNob3Q9cixieCh0KSYmTngoZSl9ZnVuY3Rpb24gVHgoZSx0LG4pe3JldHVybiBuKGZ1bmN0aW9uKCl7YngodCkmJk54KGUpfSl9ZnVuY3Rpb24gYngoZSl7dmFyIHQ9ZS5nZXRTbmFwc2hvdDtlPWUudmFsdWU7dHJ5e3ZhciBuPXQoKTtyZXR1cm4hcnIoZSxuKX1jYXRjaHtyZXR1cm4hMH19ZnVuY3Rpb24gTngoZSl7dmFyIHQ9QnIoZSwxKTt0IT09bnVsbCYmbnIodCxlLDEsLTEpfWZ1bmN0aW9uIHp2KGUpe3ZhciB0PXVyKCk7cmV0dXJuIHR5cGVvZiBlPT0iZnVuY3Rpb24iJiYoZT1lKCkpLHQubWVtb2l6ZWRTdGF0ZT10LmJhc2VTdGF0ZT1lLGU9e3BlbmRpbmc6bnVsbCxpbnRlcmxlYXZlZDpudWxsLGxhbmVzOjAsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOnVhLGxhc3RSZW5kZXJlZFN0YXRlOmV9LHQucXVldWU9ZSxlPWUuZGlzcGF0Y2g9TmsuYmluZChudWxsLGV0LGUpLFt0Lm1lbW9pemVkU3RhdGUsZV19ZnVuY3Rpb24gY2EoZSx0LG4scil7cmV0dXJuIGU9e3RhZzplLGNyZWF0ZTp0LGRlc3Ryb3k6bixkZXBzOnIsbmV4dDpudWxsfSx0PWV0LnVwZGF0ZVF1ZXVlLHQ9PT1udWxsPyh0PXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LGV0LnVwZGF0ZVF1ZXVlPXQsdC5sYXN0RWZmZWN0PWUubmV4dD1lKToobj10Lmxhc3RFZmZlY3Qsbj09PW51bGw/dC5sYXN0RWZmZWN0PWUubmV4dD1lOihyPW4ubmV4dCxuLm5leHQ9ZSxlLm5leHQ9cix0Lmxhc3RFZmZlY3Q9ZSkpLGV9ZnVuY3Rpb24gUngoKXtyZXR1cm4gV24oKS5tZW1vaXplZFN0YXRlfWZ1bmN0aW9uIE11KGUsdCxuLHIpe3ZhciBvPXVyKCk7ZXQuZmxhZ3N8PWUsby5tZW1vaXplZFN0YXRlPWNhKDF8dCxuLHZvaWQgMCxyPT09dm9pZCAwP251bGw6cil9ZnVuY3Rpb24gcWMoZSx0LG4scil7dmFyIG89V24oKTtyPXI9PT12b2lkIDA/bnVsbDpyO3ZhciBpPXZvaWQgMDtpZih2dCE9PW51bGwpe3ZhciBsPXZ0Lm1lbW9pemVkU3RhdGU7aWYoaT1sLmRlc3Ryb3ksciE9PW51bGwmJmdnKHIsbC5kZXBzKSl7by5tZW1vaXplZFN0YXRlPWNhKHQsbixpLHIpO3JldHVybn19ZXQuZmxhZ3N8PWUsby5tZW1vaXplZFN0YXRlPWNhKDF8dCxuLGkscil9ZnVuY3Rpb24gRnYoZSx0KXtyZXR1cm4gTXUoODM5MDY1Niw4LGUsdCl9ZnVuY3Rpb24geWcoZSx0KXtyZXR1cm4gcWMoMjA0OCw4LGUsdCl9ZnVuY3Rpb24gUHgoZSx0KXtyZXR1cm4gcWMoNCwyLGUsdCl9ZnVuY3Rpb24gT3goZSx0KXtyZXR1cm4gcWMoNCw0LGUsdCl9ZnVuY3Rpb24gQXgoZSx0KXtpZih0eXBlb2YgdD09ImZ1bmN0aW9uIilyZXR1cm4gZT1lKCksdChlKSxmdW5jdGlvbigpe3QobnVsbCl9O2lmKHQhPW51bGwpcmV0dXJuIGU9ZSgpLHQuY3VycmVudD1lLGZ1bmN0aW9uKCl7dC5jdXJyZW50PW51bGx9fWZ1bmN0aW9uIE14KGUsdCxuKXtyZXR1cm4gbj1uIT1udWxsP24uY29uY2F0KFtlXSk6bnVsbCxxYyg0LDQsQXguYmluZChudWxsLHQsZSksbil9ZnVuY3Rpb24geGcoKXt9ZnVuY3Rpb24gTHgoZSx0KXt2YXIgbj1XbigpO3Q9dD09PXZvaWQgMD9udWxsOnQ7dmFyIHI9bi5tZW1vaXplZFN0YXRlO3JldHVybiByIT09bnVsbCYmdCE9PW51bGwmJmdnKHQsclsxXSk/clswXToobi5tZW1vaXplZFN0YXRlPVtlLHRdLGUpfWZ1bmN0aW9uIER4KGUsdCl7dmFyIG49V24oKTt0PXQ9PT12b2lkIDA/bnVsbDp0O3ZhciByPW4ubWVtb2l6ZWRTdGF0ZTtyZXR1cm4gciE9PW51bGwmJnQhPT1udWxsJiZnZyh0LHJbMV0pP3JbMF06KGU9ZSgpLG4ubWVtb2l6ZWRTdGF0ZT1bZSx0XSxlKX1mdW5jdGlvbiBJeChlLHQsbil7cmV0dXJuIGRpJjIxPyhycihuLHQpfHwobj1GMSgpLGV0LmxhbmVzfD1uLGZpfD1uLGUuYmFzZVN0YXRlPSEwKSx0KTooZS5iYXNlU3RhdGUmJihlLmJhc2VTdGF0ZT0hMSxkbj0hMCksZS5tZW1vaXplZFN0YXRlPW4pfWZ1bmN0aW9uIFRrKGUsdCl7dmFyIG49T2U7T2U9biE9PTAmJjQ+bj9uOjQsZSghMCk7dmFyIHI9dWYudHJhbnNpdGlvbjt1Zi50cmFuc2l0aW9uPXt9O3RyeXtlKCExKSx0KCl9ZmluYWxseXtPZT1uLHVmLnRyYW5zaXRpb249cn19ZnVuY3Rpb24gangoKXtyZXR1cm4gV24oKS5tZW1vaXplZFN0YXRlfWZ1bmN0aW9uIGJrKGUsdCxuKXt2YXIgcj0kbyhlKTtpZihuPXtsYW5lOnIsYWN0aW9uOm4saGFzRWFnZXJTdGF0ZTohMSxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfSx6eChlKSlGeCh0LG4pO2Vsc2UgaWYobj1teChlLHQsbixyKSxuIT09bnVsbCl7dmFyIG89b24oKTtucihuLGUscixvKSxCeChuLHQscil9fWZ1bmN0aW9uIE5rKGUsdCxuKXt2YXIgcj0kbyhlKSxvPXtsYW5lOnIsYWN0aW9uOm4saGFzRWFnZXJTdGF0ZTohMSxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfTtpZih6eChlKSlGeCh0LG8pO2Vsc2V7dmFyIGk9ZS5hbHRlcm5hdGU7aWYoZS5sYW5lcz09PTAmJihpPT09bnVsbHx8aS5sYW5lcz09PTApJiYoaT10Lmxhc3RSZW5kZXJlZFJlZHVjZXIsaSE9PW51bGwpKXRyeXt2YXIgbD10Lmxhc3RSZW5kZXJlZFN0YXRlLHM9aShsLG4pO2lmKG8uaGFzRWFnZXJTdGF0ZT0hMCxvLmVhZ2VyU3RhdGU9cyxycihzLGwpKXt2YXIgYT10LmludGVybGVhdmVkO2E9PT1udWxsPyhvLm5leHQ9byxjZyh0KSk6KG8ubmV4dD1hLm5leHQsYS5uZXh0PW8pLHQuaW50ZXJsZWF2ZWQ9bztyZXR1cm59fWNhdGNoe31maW5hbGx5e31uPW14KGUsdCxvLHIpLG4hPT1udWxsJiYobz1vbigpLG5yKG4sZSxyLG8pLEJ4KG4sdCxyKSl9fWZ1bmN0aW9uIHp4KGUpe3ZhciB0PWUuYWx0ZXJuYXRlO3JldHVybiBlPT09ZXR8fHQhPT1udWxsJiZ0PT09ZXR9ZnVuY3Rpb24gRngoZSx0KXtQcz1jYz0hMDt2YXIgbj1lLnBlbmRpbmc7bj09PW51bGw/dC5uZXh0PXQ6KHQubmV4dD1uLm5leHQsbi5uZXh0PXQpLGUucGVuZGluZz10fWZ1bmN0aW9uIEJ4KGUsdCxuKXtpZihuJjQxOTQyNDApe3ZhciByPXQubGFuZXM7ciY9ZS5wZW5kaW5nTGFuZXMsbnw9cix0LmxhbmVzPW4sUXAoZSxuKX19dmFyIGRjPXtyZWFkQ29udGV4dDpCbix1c2VDYWxsYmFjazpCdCx1c2VDb250ZXh0OkJ0LHVzZUVmZmVjdDpCdCx1c2VJbXBlcmF0aXZlSGFuZGxlOkJ0LHVzZUluc2VydGlvbkVmZmVjdDpCdCx1c2VMYXlvdXRFZmZlY3Q6QnQsdXNlTWVtbzpCdCx1c2VSZWR1Y2VyOkJ0LHVzZVJlZjpCdCx1c2VTdGF0ZTpCdCx1c2VEZWJ1Z1ZhbHVlOkJ0LHVzZURlZmVycmVkVmFsdWU6QnQsdXNlVHJhbnNpdGlvbjpCdCx1c2VNdXRhYmxlU291cmNlOkJ0LHVzZVN5bmNFeHRlcm5hbFN0b3JlOkJ0LHVzZUlkOkJ0LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0sUms9e3JlYWRDb250ZXh0OkJuLHVzZUNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHVyKCkubWVtb2l6ZWRTdGF0ZT1bZSx0PT09dm9pZCAwP251bGw6dF0sZX0sdXNlQ29udGV4dDpCbix1c2VFZmZlY3Q6RnYsdXNlSW1wZXJhdGl2ZUhhbmRsZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG49biE9bnVsbD9uLmNvbmNhdChbZV0pOm51bGwsTXUoNDE5NDMwOCw0LEF4LmJpbmQobnVsbCx0LGUpLG4pfSx1c2VMYXlvdXRFZmZlY3Q6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTXUoNDE5NDMwOCw0LGUsdCl9LHVzZUluc2VydGlvbkVmZmVjdDpmdW5jdGlvbihlLHQpe3JldHVybiBNdSg0LDIsZSx0KX0sdXNlTWVtbzpmdW5jdGlvbihlLHQpe3ZhciBuPXVyKCk7cmV0dXJuIHQ9dD09PXZvaWQgMD9udWxsOnQsZT1lKCksbi5tZW1vaXplZFN0YXRlPVtlLHRdLGV9LHVzZVJlZHVjZXI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXVyKCk7cmV0dXJuIHQ9biE9PXZvaWQgMD9uKHQpOnQsci5tZW1vaXplZFN0YXRlPXIuYmFzZVN0YXRlPXQsZT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6ZSxsYXN0UmVuZGVyZWRTdGF0ZTp0fSxyLnF1ZXVlPWUsZT1lLmRpc3BhdGNoPWJrLmJpbmQobnVsbCxldCxlKSxbci5tZW1vaXplZFN0YXRlLGVdfSx1c2VSZWY6ZnVuY3Rpb24oZSl7dmFyIHQ9dXIoKTtyZXR1cm4gZT17Y3VycmVudDplfSx0Lm1lbW9pemVkU3RhdGU9ZX0sdXNlU3RhdGU6enYsdXNlRGVidWdWYWx1ZTp4Zyx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB1cigpLm1lbW9pemVkU3RhdGU9ZX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBlPXp2KCExKSx0PWVbMF07cmV0dXJuIGU9VGsuYmluZChudWxsLGVbMV0pLHVyKCkubWVtb2l6ZWRTdGF0ZT1lLFt0LGVdfSx1c2VNdXRhYmxlU291cmNlOmZ1bmN0aW9uKCl7fSx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZXQsbz11cigpO2lmKFllKXtpZihuPT09dm9pZCAwKXRocm93IEVycm9yKFUoNDA3KSk7bj1uKCl9ZWxzZXtpZihuPXQoKSxSdD09PW51bGwpdGhyb3cgRXJyb3IoVSgzNDkpKTtkaSYzMHx8JHgocix0LG4pfW8ubWVtb2l6ZWRTdGF0ZT1uO3ZhciBpPXt2YWx1ZTpuLGdldFNuYXBzaG90OnR9O3JldHVybiBvLnF1ZXVlPWksRnYoVHguYmluZChudWxsLHIsaSxlKSxbZV0pLHIuZmxhZ3N8PTIwNDgsY2EoOSxreC5iaW5kKG51bGwscixpLG4sdCksdm9pZCAwLG51bGwpLG59LHVzZUlkOmZ1bmN0aW9uKCl7dmFyIGU9dXIoKSx0PVJ0LmlkZW50aWZpZXJQcmVmaXg7aWYoWWUpe3ZhciBuPUlyLHI9RHI7bj0ociZ+KDE8PDMyLXRyKHIpLTEpKS50b1N0cmluZygzMikrbix0PSI6Iit0KyJSIituLG49YWErKywwPG4mJih0Kz0iSCIrbi50b1N0cmluZygzMikpLHQrPSI6In1lbHNlIG49a2srKyx0PSI6Iit0KyJyIituLnRvU3RyaW5nKDMyKSsiOiI7cmV0dXJuIGUubWVtb2l6ZWRTdGF0ZT10fSx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LFBrPXtyZWFkQ29udGV4dDpCbix1c2VDYWxsYmFjazpMeCx1c2VDb250ZXh0OkJuLHVzZUVmZmVjdDp5Zyx1c2VJbXBlcmF0aXZlSGFuZGxlOk14LHVzZUluc2VydGlvbkVmZmVjdDpQeCx1c2VMYXlvdXRFZmZlY3Q6T3gsdXNlTWVtbzpEeCx1c2VSZWR1Y2VyOmNmLHVzZVJlZjpSeCx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBjZih1YSl9LHVzZURlYnVnVmFsdWU6eGcsdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1XbigpO3JldHVybiBJeCh0LHZ0Lm1lbW9pemVkU3RhdGUsZSl9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgZT1jZih1YSlbMF0sdD1XbigpLm1lbW9pemVkU3RhdGU7cmV0dXJuW2UsdF19LHVzZU11dGFibGVTb3VyY2U6RXgsdXNlU3luY0V4dGVybmFsU3RvcmU6Q3gsdXNlSWQ6angsdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxPaz17cmVhZENvbnRleHQ6Qm4sdXNlQ2FsbGJhY2s6THgsdXNlQ29udGV4dDpCbix1c2VFZmZlY3Q6eWcsdXNlSW1wZXJhdGl2ZUhhbmRsZTpNeCx1c2VJbnNlcnRpb25FZmZlY3Q6UHgsdXNlTGF5b3V0RWZmZWN0Ok94LHVzZU1lbW86RHgsdXNlUmVkdWNlcjpkZix1c2VSZWY6UngsdXNlU3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gZGYodWEpfSx1c2VEZWJ1Z1ZhbHVlOnhnLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9V24oKTtyZXR1cm4gdnQ9PT1udWxsP3QubWVtb2l6ZWRTdGF0ZT1lOkl4KHQsdnQubWVtb2l6ZWRTdGF0ZSxlKX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBlPWRmKHVhKVswXSx0PVduKCkubWVtb2l6ZWRTdGF0ZTtyZXR1cm5bZSx0XX0sdXNlTXV0YWJsZVNvdXJjZTpFeCx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpDeCx1c2VJZDpqeCx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9O2Z1bmN0aW9uIENsKGUsdCl7dHJ5e3ZhciBuPSIiLHI9dDtkbyBuKz1sJChyKSxyPXIucmV0dXJuO3doaWxlKHIpO3ZhciBvPW59Y2F0Y2goaSl7bz1gCkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6IGAraS5tZXNzYWdlK2AKYCtpLnN0YWNrfXJldHVybnt2YWx1ZTplLHNvdXJjZTp0LHN0YWNrOm8sZGlnZXN0Om51bGx9fWZ1bmN0aW9uIGZmKGUsdCxuKXtyZXR1cm57dmFsdWU6ZSxzb3VyY2U6bnVsbCxzdGFjazpuPz9udWxsLGRpZ2VzdDp0Pz9udWxsfX1mdW5jdGlvbiB2aChlLHQpe3RyeXtjb25zb2xlLmVycm9yKHQudmFsdWUpfWNhdGNoKG4pe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBufSl9fXZhciBBaz10eXBlb2YgV2Vha01hcD09ImZ1bmN0aW9uIj9XZWFrTWFwOk1hcDtmdW5jdGlvbiBXeChlLHQsbil7bj1qcigtMSxuKSxuLnRhZz0zLG4ucGF5bG9hZD17ZWxlbWVudDpudWxsfTt2YXIgcj10LnZhbHVlO3JldHVybiBuLmNhbGxiYWNrPWZ1bmN0aW9uKCl7aGN8fChoYz0hMCxUaD1yKSx2aChlLHQpfSxufWZ1bmN0aW9uIFV4KGUsdCxuKXtuPWpyKC0xLG4pLG4udGFnPTM7dmFyIHI9ZS50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjtpZih0eXBlb2Ygcj09ImZ1bmN0aW9uIil7dmFyIG89dC52YWx1ZTtuLnBheWxvYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gcihvKX0sbi5jYWxsYmFjaz1mdW5jdGlvbigpe3ZoKGUsdCl9fXZhciBpPWUuc3RhdGVOb2RlO3JldHVybiBpIT09bnVsbCYmdHlwZW9mIGkuY29tcG9uZW50RGlkQ2F0Y2g9PSJmdW5jdGlvbiImJihuLmNhbGxiYWNrPWZ1bmN0aW9uKCl7dmgoZSx0KSx0eXBlb2YgciE9ImZ1bmN0aW9uIiYmKENvPT09bnVsbD9Dbz1uZXcgU2V0KFt0aGlzXSk6Q28uYWRkKHRoaXMpKTt2YXIgbD10LnN0YWNrO3RoaXMuY29tcG9uZW50RGlkQ2F0Y2godC52YWx1ZSx7Y29tcG9uZW50U3RhY2s6bCE9PW51bGw/bDoiIn0pfSksbn1mdW5jdGlvbiBCdihlLHQsbil7dmFyIHI9ZS5waW5nQ2FjaGU7aWYocj09PW51bGwpe3I9ZS5waW5nQ2FjaGU9bmV3IEFrO3ZhciBvPW5ldyBTZXQ7ci5zZXQodCxvKX1lbHNlIG89ci5nZXQodCksbz09PXZvaWQgMCYmKG89bmV3IFNldCxyLnNldCh0LG8pKTtvLmhhcyhuKXx8KG8uYWRkKG4pLGU9R2suYmluZChudWxsLGUsdCxuKSx0LnRoZW4oZSxlKSl9ZnVuY3Rpb24gV3YoZSl7ZG97dmFyIHQ7aWYoKHQ9ZS50YWc9PT0xMykmJih0PWUubWVtb2l6ZWRTdGF0ZSx0PXQhPT1udWxsP3QuZGVoeWRyYXRlZCE9PW51bGw6ITApLHQpcmV0dXJuIGU7ZT1lLnJldHVybn13aGlsZShlIT09bnVsbCk7cmV0dXJuIG51bGx9ZnVuY3Rpb24gVXYoZSx0LG4scixvKXtyZXR1cm4gZS5tb2RlJjE/KGUuZmxhZ3N8PTY1NTM2LGUubGFuZXM9byxlKTooZT09PXQ/ZS5mbGFnc3w9NjU1MzY6KGUuZmxhZ3N8PTEyOCxuLmZsYWdzfD0xMzEwNzIsbi5mbGFncyY9LTUyODA1LG4udGFnPT09MSYmKG4uYWx0ZXJuYXRlPT09bnVsbD9uLnRhZz0xNzoodD1qcigtMSwxKSx0LnRhZz0yLEVvKG4sdCwxKSkpLG4ubGFuZXN8PTEpLGUpfXZhciBNaz1Lci5SZWFjdEN1cnJlbnRPd25lcixkbj0hMTtmdW5jdGlvbiBRdChlLHQsbixyKXt0LmNoaWxkPWU9PT1udWxsP194KHQsbnVsbCxuLHIpOlNsKHQsZS5jaGlsZCxuLHIpfWZ1bmN0aW9uIFZ2KGUsdCxuLHIsbyl7bj1uLnJlbmRlcjt2YXIgaT10LnJlZjtyZXR1cm4gZGwodCxvKSxyPW1nKGUsdCxuLHIsaSxvKSxuPXZnKCksZSE9PW51bGwmJiFkbj8odC51cGRhdGVRdWV1ZT1lLnVwZGF0ZVF1ZXVlLHQuZmxhZ3MmPS0yMDUzLGUubGFuZXMmPX5vLFdyKGUsdCxvKSk6KFllJiZuJiZvZyh0KSx0LmZsYWdzfD0xLFF0KGUsdCxyLG8pLHQuY2hpbGQpfWZ1bmN0aW9uIEh2KGUsdCxuLHIsbyl7aWYoZT09PW51bGwpe3ZhciBpPW4udHlwZTtyZXR1cm4gdHlwZW9mIGk9PSJmdW5jdGlvbiImJiFUZyhpKSYmaS5kZWZhdWx0UHJvcHM9PT12b2lkIDAmJm4uY29tcGFyZT09PW51bGwmJm4uZGVmYXVsdFByb3BzPT09dm9pZCAwPyh0LnRhZz0xNSx0LnR5cGU9aSxWeChlLHQsaSxyLG8pKTooZT1qdShuLnR5cGUsbnVsbCxyLHQsdC5tb2RlLG8pLGUucmVmPXQucmVmLGUucmV0dXJuPXQsdC5jaGlsZD1lKX1pZihpPWUuY2hpbGQsIShlLmxhbmVzJm8pKXt2YXIgbD1pLm1lbW9pemVkUHJvcHM7aWYobj1uLmNvbXBhcmUsbj1uIT09bnVsbD9uOm5hLG4obCxyKSYmZS5yZWY9PT10LnJlZilyZXR1cm4gV3IoZSx0LG8pfXJldHVybiB0LmZsYWdzfD0xLGU9a28oaSxyKSxlLnJlZj10LnJlZixlLnJldHVybj10LHQuY2hpbGQ9ZX1mdW5jdGlvbiBWeChlLHQsbixyLG8pe2lmKGUhPT1udWxsKXt2YXIgaT1lLm1lbW9pemVkUHJvcHM7aWYobmEoaSxyKSYmZS5yZWY9PT10LnJlZilpZihkbj0hMSx0LnBlbmRpbmdQcm9wcz1yPWksKGUubGFuZXMmbykhPT0wKWUuZmxhZ3MmMTMxMDcyJiYoZG49ITApO2Vsc2UgcmV0dXJuIHQubGFuZXM9ZS5sYW5lcyxXcihlLHQsbyl9cmV0dXJuIHloKGUsdCxuLHIsbyl9ZnVuY3Rpb24gSHgoZSx0LG4pe3ZhciByPXQucGVuZGluZ1Byb3BzLG89ci5jaGlsZHJlbixpPWUhPT1udWxsP2UubWVtb2l6ZWRTdGF0ZTpudWxsO2lmKHIubW9kZT09PSJoaWRkZW4iKWlmKCEodC5tb2RlJjEpKXQubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOjAsY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6bnVsbH0sRmUobmwseW4pLHlufD1uO2Vsc2V7aWYoIShuJjEwNzM3NDE4MjQpKXJldHVybiBlPWkhPT1udWxsP2kuYmFzZUxhbmVzfG46bix0LmxhbmVzPXQuY2hpbGRMYW5lcz0xMDczNzQxODI0LHQubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOmUsY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6bnVsbH0sdC51cGRhdGVRdWV1ZT1udWxsLEZlKG5sLHluKSx5bnw9ZSxudWxsO3QubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOjAsY2FjaGVQb29sOm51bGwsdHJhbnNpdGlvbnM6bnVsbH0scj1pIT09bnVsbD9pLmJhc2VMYW5lczpuLEZlKG5sLHluKSx5bnw9cn1lbHNlIGkhPT1udWxsPyhyPWkuYmFzZUxhbmVzfG4sdC5tZW1vaXplZFN0YXRlPW51bGwpOnI9bixGZShubCx5bikseW58PXI7cmV0dXJuIFF0KGUsdCxvLG4pLHQuY2hpbGR9ZnVuY3Rpb24gS3goZSx0KXt2YXIgbj10LnJlZjsoZT09PW51bGwmJm4hPT1udWxsfHxlIT09bnVsbCYmZS5yZWYhPT1uKSYmKHQuZmxhZ3N8PTUxMix0LmZsYWdzfD0yMDk3MTUyKX1mdW5jdGlvbiB5aChlLHQsbixyLG8pe3ZhciBpPWhuKG4pP3VpOlh0LmN1cnJlbnQ7cmV0dXJuIGk9d2wodCxpKSxkbCh0LG8pLG49bWcoZSx0LG4scixpLG8pLHI9dmcoKSxlIT09bnVsbCYmIWRuPyh0LnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdC5mbGFncyY9LTIwNTMsZS5sYW5lcyY9fm8sV3IoZSx0LG8pKTooWWUmJnImJm9nKHQpLHQuZmxhZ3N8PTEsUXQoZSx0LG4sbyksdC5jaGlsZCl9ZnVuY3Rpb24gS3YoZSx0LG4scixvKXtpZihobihuKSl7dmFyIGk9ITA7cmModCl9ZWxzZSBpPSExO2lmKGRsKHQsbyksdC5zdGF0ZU5vZGU9PT1udWxsKUx1KGUsdCkseHgodCxuLHIpLG1oKHQsbixyLG8pLHI9ITA7ZWxzZSBpZihlPT09bnVsbCl7dmFyIGw9dC5zdGF0ZU5vZGUscz10Lm1lbW9pemVkUHJvcHM7bC5wcm9wcz1zO3ZhciBhPWwuY29udGV4dCx1PW4uY29udGV4dFR5cGU7dHlwZW9mIHU9PSJvYmplY3QiJiZ1IT09bnVsbD91PUJuKHUpOih1PWhuKG4pP3VpOlh0LmN1cnJlbnQsdT13bCh0LHUpKTt2YXIgYz1uLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyxkPXR5cGVvZiBjPT0iZnVuY3Rpb24ifHx0eXBlb2YgbC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uIjtkfHx0eXBlb2YgbC5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyE9ImZ1bmN0aW9uIiYmdHlwZW9mIGwuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyE9ImZ1bmN0aW9uInx8KHMhPT1yfHxhIT09dSkmJkl2KHQsbCxyLHUpLHVvPSExO3ZhciBmPXQubWVtb2l6ZWRTdGF0ZTtsLnN0YXRlPWYsYWModCxyLGwsbyksYT10Lm1lbW9pemVkU3RhdGUscyE9PXJ8fGYhPT1hfHxmbi5jdXJyZW50fHx1bz8odHlwZW9mIGM9PSJmdW5jdGlvbiImJihnaCh0LG4sYyxyKSxhPXQubWVtb2l6ZWRTdGF0ZSksKHM9dW98fER2KHQsbixzLHIsZixhLHUpKT8oZHx8dHlwZW9mIGwuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCE9ImZ1bmN0aW9uIiYmdHlwZW9mIGwuY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24ifHwodHlwZW9mIGwuY29tcG9uZW50V2lsbE1vdW50PT0iZnVuY3Rpb24iJiZsLmNvbXBvbmVudFdpbGxNb3VudCgpLHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJmwuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpKSx0eXBlb2YgbC5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQxOTQzMDgpKToodHlwZW9mIGwuY29tcG9uZW50RGlkTW91bnQ9PSJmdW5jdGlvbiImJih0LmZsYWdzfD00MTk0MzA4KSx0Lm1lbW9pemVkUHJvcHM9cix0Lm1lbW9pemVkU3RhdGU9YSksbC5wcm9wcz1yLGwuc3RhdGU9YSxsLmNvbnRleHQ9dSxyPXMpOih0eXBlb2YgbC5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQxOTQzMDgpLHI9ITEpfWVsc2V7bD10LnN0YXRlTm9kZSx2eChlLHQpLHM9dC5tZW1vaXplZFByb3BzLHU9dC50eXBlPT09dC5lbGVtZW50VHlwZT9zOlhuKHQudHlwZSxzKSxsLnByb3BzPXUsZD10LnBlbmRpbmdQcm9wcyxmPWwuY29udGV4dCxhPW4uY29udGV4dFR5cGUsdHlwZW9mIGE9PSJvYmplY3QiJiZhIT09bnVsbD9hPUJuKGEpOihhPWhuKG4pP3VpOlh0LmN1cnJlbnQsYT13bCh0LGEpKTt2YXIgaD1uLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczsoYz10eXBlb2YgaD09ImZ1bmN0aW9uInx8dHlwZW9mIGwuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiIpfHx0eXBlb2YgbC5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyE9ImZ1bmN0aW9uIiYmdHlwZW9mIGwuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyE9ImZ1bmN0aW9uInx8KHMhPT1kfHxmIT09YSkmJkl2KHQsbCxyLGEpLHVvPSExLGY9dC5tZW1vaXplZFN0YXRlLGwuc3RhdGU9ZixhYyh0LHIsbCxvKTt2YXIgbT10Lm1lbW9pemVkU3RhdGU7cyE9PWR8fGYhPT1tfHxmbi5jdXJyZW50fHx1bz8odHlwZW9mIGg9PSJmdW5jdGlvbiImJihnaCh0LG4saCxyKSxtPXQubWVtb2l6ZWRTdGF0ZSksKHU9dW98fER2KHQsbix1LHIsZixtLGEpfHwhMSk/KGN8fHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsVXBkYXRlIT0iZnVuY3Rpb24ifHwodHlwZW9mIGwuY29tcG9uZW50V2lsbFVwZGF0ZT09ImZ1bmN0aW9uIiYmbC5jb21wb25lbnRXaWxsVXBkYXRlKHIsbSxhKSx0eXBlb2YgbC5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZT09ImZ1bmN0aW9uIiYmbC5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShyLG0sYSkpLHR5cGVvZiBsLmNvbXBvbmVudERpZFVwZGF0ZT09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQpLHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9MTAyNCkpOih0eXBlb2YgbC5jb21wb25lbnREaWRVcGRhdGUhPSJmdW5jdGlvbiJ8fHM9PT1lLm1lbW9pemVkUHJvcHMmJmY9PT1lLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD00KSx0eXBlb2YgbC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9ImZ1bmN0aW9uInx8cz09PWUubWVtb2l6ZWRQcm9wcyYmZj09PWUubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTEwMjQpLHQubWVtb2l6ZWRQcm9wcz1yLHQubWVtb2l6ZWRTdGF0ZT1tKSxsLnByb3BzPXIsbC5zdGF0ZT1tLGwuY29udGV4dD1hLHI9dSk6KHR5cGVvZiBsLmNvbXBvbmVudERpZFVwZGF0ZSE9ImZ1bmN0aW9uInx8cz09PWUubWVtb2l6ZWRQcm9wcyYmZj09PWUubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTQpLHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZmPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9MTAyNCkscj0hMSl9cmV0dXJuIHhoKGUsdCxuLHIsaSxvKX1mdW5jdGlvbiB4aChlLHQsbixyLG8saSl7S3goZSx0KTt2YXIgbD0odC5mbGFncyYxMjgpIT09MDtpZighciYmIWwpcmV0dXJuIG8mJlB2KHQsbiwhMSksV3IoZSx0LGkpO3I9dC5zdGF0ZU5vZGUsTWsuY3VycmVudD10O3ZhciBzPWwmJnR5cGVvZiBuLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciE9ImZ1bmN0aW9uIj9udWxsOnIucmVuZGVyKCk7cmV0dXJuIHQuZmxhZ3N8PTEsZSE9PW51bGwmJmw/KHQuY2hpbGQ9U2wodCxlLmNoaWxkLG51bGwsaSksdC5jaGlsZD1TbCh0LG51bGwscyxpKSk6UXQoZSx0LHMsaSksdC5tZW1vaXplZFN0YXRlPXIuc3RhdGUsbyYmUHYodCxuLCEwKSx0LmNoaWxkfWZ1bmN0aW9uIEd4KGUpe3ZhciB0PWUuc3RhdGVOb2RlO3QucGVuZGluZ0NvbnRleHQ/UnYoZSx0LnBlbmRpbmdDb250ZXh0LHQucGVuZGluZ0NvbnRleHQhPT10LmNvbnRleHQpOnQuY29udGV4dCYmUnYoZSx0LmNvbnRleHQsITEpLGZnKGUsdC5jb250YWluZXJJbmZvKX1mdW5jdGlvbiBHdihlLHQsbixyLG8pe3JldHVybiBfbCgpLGxnKG8pLHQuZmxhZ3N8PTI1NixRdChlLHQsbixyKSx0LmNoaWxkfXZhciB3aD17ZGVoeWRyYXRlZDpudWxsLHRyZWVDb250ZXh0Om51bGwscmV0cnlMYW5lOjB9O2Z1bmN0aW9uIF9oKGUpe3JldHVybntiYXNlTGFuZXM6ZSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfX1mdW5jdGlvbiBZeChlLHQsbil7dmFyIHI9dC5wZW5kaW5nUHJvcHMsbz1aZS5jdXJyZW50LGk9ITEsbD0odC5mbGFncyYxMjgpIT09MCxzO2lmKChzPWwpfHwocz1lIT09bnVsbCYmZS5tZW1vaXplZFN0YXRlPT09bnVsbD8hMToobyYyKSE9PTApLHM/KGk9ITAsdC5mbGFncyY9LTEyOSk6KGU9PT1udWxsfHxlLm1lbW9pemVkU3RhdGUhPT1udWxsKSYmKG98PTEpLEZlKFplLG8mMSksZT09PW51bGwpcmV0dXJuIGhoKHQpLGU9dC5tZW1vaXplZFN0YXRlLGUhPT1udWxsJiYoZT1lLmRlaHlkcmF0ZWQsZSE9PW51bGwpPyh0Lm1vZGUmMT9lLmRhdGE9PT0iJCEiP3QubGFuZXM9ODp0LmxhbmVzPTEwNzM3NDE4MjQ6dC5sYW5lcz0xLG51bGwpOihsPXIuY2hpbGRyZW4sZT1yLmZhbGxiYWNrLGk/KHI9dC5tb2RlLGk9dC5jaGlsZCxsPXttb2RlOiJoaWRkZW4iLGNoaWxkcmVuOmx9LCEociYxKSYmaSE9PW51bGw/KGkuY2hpbGRMYW5lcz0wLGkucGVuZGluZ1Byb3BzPWwpOmk9bmQobCxyLDAsbnVsbCksZT1vaShlLHIsbixudWxsKSxpLnJldHVybj10LGUucmV0dXJuPXQsaS5zaWJsaW5nPWUsdC5jaGlsZD1pLHQuY2hpbGQubWVtb2l6ZWRTdGF0ZT1faChuKSx0Lm1lbW9pemVkU3RhdGU9d2gsZSk6d2codCxsKSk7aWYobz1lLm1lbW9pemVkU3RhdGUsbyE9PW51bGwmJihzPW8uZGVoeWRyYXRlZCxzIT09bnVsbCkpcmV0dXJuIExrKGUsdCxsLHIscyxvLG4pO2lmKGkpe2k9ci5mYWxsYmFjayxsPXQubW9kZSxvPWUuY2hpbGQscz1vLnNpYmxpbmc7dmFyIGE9e21vZGU6ImhpZGRlbiIsY2hpbGRyZW46ci5jaGlsZHJlbn07cmV0dXJuIShsJjEpJiZ0LmNoaWxkIT09bz8ocj10LmNoaWxkLHIuY2hpbGRMYW5lcz0wLHIucGVuZGluZ1Byb3BzPWEsdC5kZWxldGlvbnM9bnVsbCk6KHI9a28obyxhKSxyLnN1YnRyZWVGbGFncz1vLnN1YnRyZWVGbGFncyYxNDY4MDA2NCkscyE9PW51bGw/aT1rbyhzLGkpOihpPW9pKGksbCxuLG51bGwpLGkuZmxhZ3N8PTIpLGkucmV0dXJuPXQsci5yZXR1cm49dCxyLnNpYmxpbmc9aSx0LmNoaWxkPXIscj1pLGk9dC5jaGlsZCxsPWUuY2hpbGQubWVtb2l6ZWRTdGF0ZSxsPWw9PT1udWxsP19oKG4pOntiYXNlTGFuZXM6bC5iYXNlTGFuZXN8bixjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpsLnRyYW5zaXRpb25zfSxpLm1lbW9pemVkU3RhdGU9bCxpLmNoaWxkTGFuZXM9ZS5jaGlsZExhbmVzJn5uLHQubWVtb2l6ZWRTdGF0ZT13aCxyfXJldHVybiBpPWUuY2hpbGQsZT1pLnNpYmxpbmcscj1rbyhpLHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjpyLmNoaWxkcmVufSksISh0Lm1vZGUmMSkmJihyLmxhbmVzPW4pLHIucmV0dXJuPXQsci5zaWJsaW5nPW51bGwsZSE9PW51bGwmJihuPXQuZGVsZXRpb25zLG49PT1udWxsPyh0LmRlbGV0aW9ucz1bZV0sdC5mbGFnc3w9MTYpOm4ucHVzaChlKSksdC5jaGlsZD1yLHQubWVtb2l6ZWRTdGF0ZT1udWxsLHJ9ZnVuY3Rpb24gd2coZSx0KXtyZXR1cm4gdD1uZCh7bW9kZToidmlzaWJsZSIsY2hpbGRyZW46dH0sZS5tb2RlLDAsbnVsbCksdC5yZXR1cm49ZSxlLmNoaWxkPXR9ZnVuY3Rpb24gYXUoZSx0LG4scil7cmV0dXJuIHIhPT1udWxsJiZsZyhyKSxTbCh0LGUuY2hpbGQsbnVsbCxuKSxlPXdnKHQsdC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4pLGUuZmxhZ3N8PTIsdC5tZW1vaXplZFN0YXRlPW51bGwsZX1mdW5jdGlvbiBMayhlLHQsbixyLG8saSxsKXtpZihuKXJldHVybiB0LmZsYWdzJjI1Nj8odC5mbGFncyY9LTI1NyxyPWZmKEVycm9yKFUoNDIyKSkpLGF1KGUsdCxsLHIpKTp0Lm1lbW9pemVkU3RhdGUhPT1udWxsPyh0LmNoaWxkPWUuY2hpbGQsdC5mbGFnc3w9MTI4LG51bGwpOihpPXIuZmFsbGJhY2ssbz10Lm1vZGUscj1uZCh7bW9kZToidmlzaWJsZSIsY2hpbGRyZW46ci5jaGlsZHJlbn0sbywwLG51bGwpLGk9b2koaSxvLGwsbnVsbCksaS5mbGFnc3w9MixyLnJldHVybj10LGkucmV0dXJuPXQsci5zaWJsaW5nPWksdC5jaGlsZD1yLHQubW9kZSYxJiZTbCh0LGUuY2hpbGQsbnVsbCxsKSx0LmNoaWxkLm1lbW9pemVkU3RhdGU9X2gobCksdC5tZW1vaXplZFN0YXRlPXdoLGkpO2lmKCEodC5tb2RlJjEpKXJldHVybiBhdShlLHQsbCxudWxsKTtpZihvLmRhdGE9PT0iJCEiKXtpZihyPW8ubmV4dFNpYmxpbmcmJm8ubmV4dFNpYmxpbmcuZGF0YXNldCxyKXZhciBzPXIuZGdzdDtyZXR1cm4gcj1zLGk9RXJyb3IoVSg0MTkpKSxyPWZmKGkscix2b2lkIDApLGF1KGUsdCxsLHIpfWlmKHM9KGwmZS5jaGlsZExhbmVzKSE9PTAsZG58fHMpe2lmKHI9UnQsciE9PW51bGwpe3N3aXRjaChsJi1sKXtjYXNlIDQ6bz0yO2JyZWFrO2Nhc2UgMTY6bz04O2JyZWFrO2Nhc2UgNjQ6Y2FzZSAxMjg6Y2FzZSAyNTY6Y2FzZSA1MTI6Y2FzZSAxMDI0OmNhc2UgMjA0ODpjYXNlIDQwOTY6Y2FzZSA4MTkyOmNhc2UgMTYzODQ6Y2FzZSAzMjc2ODpjYXNlIDY1NTM2OmNhc2UgMTMxMDcyOmNhc2UgMjYyMTQ0OmNhc2UgNTI0Mjg4OmNhc2UgMTA0ODU3NjpjYXNlIDIwOTcxNTI6Y2FzZSA0MTk0MzA0OmNhc2UgODM4ODYwODpjYXNlIDE2Nzc3MjE2OmNhc2UgMzM1NTQ0MzI6Y2FzZSA2NzEwODg2NDpvPTMyO2JyZWFrO2Nhc2UgNTM2ODcwOTEyOm89MjY4NDM1NDU2O2JyZWFrO2RlZmF1bHQ6bz0wfW89byYoci5zdXNwZW5kZWRMYW5lc3xsKT8wOm8sbyE9PTAmJm8hPT1pLnJldHJ5TGFuZSYmKGkucmV0cnlMYW5lPW8sQnIoZSxvKSxucihyLGUsbywtMSkpfXJldHVybiBrZygpLHI9ZmYoRXJyb3IoVSg0MjEpKSksYXUoZSx0LGwscil9cmV0dXJuIG8uZGF0YT09PSIkPyI/KHQuZmxhZ3N8PTEyOCx0LmNoaWxkPWUuY2hpbGQsdD1Zay5iaW5kKG51bGwsZSksby5fcmVhY3RSZXRyeT10LG51bGwpOihlPWkudHJlZUNvbnRleHQsX249U28oby5uZXh0U2libGluZyksU249dCxZZT0hMCxabj1udWxsLGUhPT1udWxsJiYoTW5bTG4rK109RHIsTW5bTG4rK109SXIsTW5bTG4rK109Y2ksRHI9ZS5pZCxJcj1lLm92ZXJmbG93LGNpPXQpLHQ9d2codCxyLmNoaWxkcmVuKSx0LmZsYWdzfD00MDk2LHQpfWZ1bmN0aW9uIFl2KGUsdCxuKXtlLmxhbmVzfD10O3ZhciByPWUuYWx0ZXJuYXRlO3IhPT1udWxsJiYoci5sYW5lc3w9dCkscGgoZS5yZXR1cm4sdCxuKX1mdW5jdGlvbiBoZihlLHQsbixyLG8pe3ZhciBpPWUubWVtb2l6ZWRTdGF0ZTtpPT09bnVsbD9lLm1lbW9pemVkU3RhdGU9e2lzQmFja3dhcmRzOnQscmVuZGVyaW5nOm51bGwscmVuZGVyaW5nU3RhcnRUaW1lOjAsbGFzdDpyLHRhaWw6bix0YWlsTW9kZTpvfTooaS5pc0JhY2t3YXJkcz10LGkucmVuZGVyaW5nPW51bGwsaS5yZW5kZXJpbmdTdGFydFRpbWU9MCxpLmxhc3Q9cixpLnRhaWw9bixpLnRhaWxNb2RlPW8pfWZ1bmN0aW9uIFh4KGUsdCxuKXt2YXIgcj10LnBlbmRpbmdQcm9wcyxvPXIucmV2ZWFsT3JkZXIsaT1yLnRhaWw7aWYoUXQoZSx0LHIuY2hpbGRyZW4sbikscj1aZS5jdXJyZW50LHImMilyPXImMXwyLHQuZmxhZ3N8PTEyODtlbHNle2lmKGUhPT1udWxsJiZlLmZsYWdzJjEyOCllOmZvcihlPXQuY2hpbGQ7ZSE9PW51bGw7KXtpZihlLnRhZz09PTEzKWUubWVtb2l6ZWRTdGF0ZSE9PW51bGwmJll2KGUsbix0KTtlbHNlIGlmKGUudGFnPT09MTkpWXYoZSxuLHQpO2Vsc2UgaWYoZS5jaGlsZCE9PW51bGwpe2UuY2hpbGQucmV0dXJuPWUsZT1lLmNoaWxkO2NvbnRpbnVlfWlmKGU9PT10KWJyZWFrIGU7Zm9yKDtlLnNpYmxpbmc9PT1udWxsOyl7aWYoZS5yZXR1cm49PT1udWxsfHxlLnJldHVybj09PXQpYnJlYWsgZTtlPWUucmV0dXJufWUuc2libGluZy5yZXR1cm49ZS5yZXR1cm4sZT1lLnNpYmxpbmd9ciY9MX1pZihGZShaZSxyKSwhKHQubW9kZSYxKSl0Lm1lbW9pemVkU3RhdGU9bnVsbDtlbHNlIHN3aXRjaChvKXtjYXNlImZvcndhcmRzIjpmb3Iobj10LmNoaWxkLG89bnVsbDtuIT09bnVsbDspZT1uLmFsdGVybmF0ZSxlIT09bnVsbCYmdWMoZSk9PT1udWxsJiYobz1uKSxuPW4uc2libGluZztuPW8sbj09PW51bGw/KG89dC5jaGlsZCx0LmNoaWxkPW51bGwpOihvPW4uc2libGluZyxuLnNpYmxpbmc9bnVsbCksaGYodCwhMSxvLG4saSk7YnJlYWs7Y2FzZSJiYWNrd2FyZHMiOmZvcihuPW51bGwsbz10LmNoaWxkLHQuY2hpbGQ9bnVsbDtvIT09bnVsbDspe2lmKGU9by5hbHRlcm5hdGUsZSE9PW51bGwmJnVjKGUpPT09bnVsbCl7dC5jaGlsZD1vO2JyZWFrfWU9by5zaWJsaW5nLG8uc2libGluZz1uLG49byxvPWV9aGYodCwhMCxuLG51bGwsaSk7YnJlYWs7Y2FzZSJ0b2dldGhlciI6aGYodCwhMSxudWxsLG51bGwsdm9pZCAwKTticmVhaztkZWZhdWx0OnQubWVtb2l6ZWRTdGF0ZT1udWxsfXJldHVybiB0LmNoaWxkfWZ1bmN0aW9uIEx1KGUsdCl7ISh0Lm1vZGUmMSkmJmUhPT1udWxsJiYoZS5hbHRlcm5hdGU9bnVsbCx0LmFsdGVybmF0ZT1udWxsLHQuZmxhZ3N8PTIpfWZ1bmN0aW9uIFdyKGUsdCxuKXtpZihlIT09bnVsbCYmKHQuZGVwZW5kZW5jaWVzPWUuZGVwZW5kZW5jaWVzKSxmaXw9dC5sYW5lcywhKG4mdC5jaGlsZExhbmVzKSlyZXR1cm4gbnVsbDtpZihlIT09bnVsbCYmdC5jaGlsZCE9PWUuY2hpbGQpdGhyb3cgRXJyb3IoVSgxNTMpKTtpZih0LmNoaWxkIT09bnVsbCl7Zm9yKGU9dC5jaGlsZCxuPWtvKGUsZS5wZW5kaW5nUHJvcHMpLHQuY2hpbGQ9bixuLnJldHVybj10O2Uuc2libGluZyE9PW51bGw7KWU9ZS5zaWJsaW5nLG49bi5zaWJsaW5nPWtvKGUsZS5wZW5kaW5nUHJvcHMpLG4ucmV0dXJuPXQ7bi5zaWJsaW5nPW51bGx9cmV0dXJuIHQuY2hpbGR9ZnVuY3Rpb24gRGsoZSx0LG4pe3N3aXRjaCh0LnRhZyl7Y2FzZSAzOkd4KHQpLF9sKCk7YnJlYWs7Y2FzZSA1OlN4KHQpO2JyZWFrO2Nhc2UgMTpobih0LnR5cGUpJiZyYyh0KTticmVhaztjYXNlIDQ6ZmcodCx0LnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTticmVhaztjYXNlIDEwOnZhciByPXQudHlwZS5fY29udGV4dCxvPXQubWVtb2l6ZWRQcm9wcy52YWx1ZTtGZShsYyxyLl9jdXJyZW50VmFsdWUpLHIuX2N1cnJlbnRWYWx1ZT1vO2JyZWFrO2Nhc2UgMTM6aWYocj10Lm1lbW9pemVkU3RhdGUsciE9PW51bGwpcmV0dXJuIHIuZGVoeWRyYXRlZCE9PW51bGw/KEZlKFplLFplLmN1cnJlbnQmMSksdC5mbGFnc3w9MTI4LG51bGwpOm4mdC5jaGlsZC5jaGlsZExhbmVzP1l4KGUsdCxuKTooRmUoWmUsWmUuY3VycmVudCYxKSxlPVdyKGUsdCxuKSxlIT09bnVsbD9lLnNpYmxpbmc6bnVsbCk7RmUoWmUsWmUuY3VycmVudCYxKTticmVhaztjYXNlIDE5OmlmKHI9KG4mdC5jaGlsZExhbmVzKSE9PTAsZS5mbGFncyYxMjgpe2lmKHIpcmV0dXJuIFh4KGUsdCxuKTt0LmZsYWdzfD0xMjh9aWYobz10Lm1lbW9pemVkU3RhdGUsbyE9PW51bGwmJihvLnJlbmRlcmluZz1udWxsLG8udGFpbD1udWxsLG8ubGFzdEVmZmVjdD1udWxsKSxGZShaZSxaZS5jdXJyZW50KSxyKWJyZWFrO3JldHVybiBudWxsO2Nhc2UgMjI6Y2FzZSAyMzpyZXR1cm4gdC5sYW5lcz0wLEh4KGUsdCxuKX1yZXR1cm4gV3IoZSx0LG4pfXZhciBReCxTaCxKeCxaeDtReD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj10LmNoaWxkO24hPT1udWxsOyl7aWYobi50YWc9PT01fHxuLnRhZz09PTYpZS5hcHBlbmRDaGlsZChuLnN0YXRlTm9kZSk7ZWxzZSBpZihuLnRhZyE9PTQmJm4uY2hpbGQhPT1udWxsKXtuLmNoaWxkLnJldHVybj1uLG49bi5jaGlsZDtjb250aW51ZX1pZihuPT09dClicmVhaztmb3IoO24uc2libGluZz09PW51bGw7KXtpZihuLnJldHVybj09PW51bGx8fG4ucmV0dXJuPT09dClyZXR1cm47bj1uLnJldHVybn1uLnNpYmxpbmcucmV0dXJuPW4ucmV0dXJuLG49bi5zaWJsaW5nfX07U2g9ZnVuY3Rpb24oKXt9O0p4PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPWUubWVtb2l6ZWRQcm9wcztpZihvIT09cil7ZT10LnN0YXRlTm9kZSxlaSh2ci5jdXJyZW50KTt2YXIgaT1udWxsO3N3aXRjaChuKXtjYXNlImlucHV0IjpvPVZmKGUsbykscj1WZihlLHIpLGk9W107YnJlYWs7Y2FzZSJzZWxlY3QiOm89bnQoe30sbyx7dmFsdWU6dm9pZCAwfSkscj1udCh7fSxyLHt2YWx1ZTp2b2lkIDB9KSxpPVtdO2JyZWFrO2Nhc2UidGV4dGFyZWEiOm89R2YoZSxvKSxyPUdmKGUsciksaT1bXTticmVhaztkZWZhdWx0OnR5cGVvZiBvLm9uQ2xpY2shPSJmdW5jdGlvbiImJnR5cGVvZiByLm9uQ2xpY2s9PSJmdW5jdGlvbiImJihlLm9uY2xpY2s9dGMpfVhmKG4scik7dmFyIGw7bj1udWxsO2Zvcih1IGluIG8paWYoIXIuaGFzT3duUHJvcGVydHkodSkmJm8uaGFzT3duUHJvcGVydHkodSkmJm9bdV0hPW51bGwpaWYodT09PSJzdHlsZSIpe3ZhciBzPW9bdV07Zm9yKGwgaW4gcylzLmhhc093blByb3BlcnR5KGwpJiYobnx8KG49e30pLG5bbF09IiIpfWVsc2UgdSE9PSJkYW5nZXJvdXNseVNldElubmVySFRNTCImJnUhPT0iY2hpbGRyZW4iJiZ1IT09InN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyImJnUhPT0ic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIiYmdSE9PSJhdXRvRm9jdXMiJiYoWHMuaGFzT3duUHJvcGVydHkodSk/aXx8KGk9W10pOihpPWl8fFtdKS5wdXNoKHUsbnVsbCkpO2Zvcih1IGluIHIpe3ZhciBhPXJbdV07aWYocz1vIT1udWxsP29bdV06dm9pZCAwLHIuaGFzT3duUHJvcGVydHkodSkmJmEhPT1zJiYoYSE9bnVsbHx8cyE9bnVsbCkpaWYodT09PSJzdHlsZSIpaWYocyl7Zm9yKGwgaW4gcykhcy5oYXNPd25Qcm9wZXJ0eShsKXx8YSYmYS5oYXNPd25Qcm9wZXJ0eShsKXx8KG58fChuPXt9KSxuW2xdPSIiKTtmb3IobCBpbiBhKWEuaGFzT3duUHJvcGVydHkobCkmJnNbbF0hPT1hW2xdJiYobnx8KG49e30pLG5bbF09YVtsXSl9ZWxzZSBufHwoaXx8KGk9W10pLGkucHVzaCh1LG4pKSxuPWE7ZWxzZSB1PT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIj8oYT1hP2EuX19odG1sOnZvaWQgMCxzPXM/cy5fX2h0bWw6dm9pZCAwLGEhPW51bGwmJnMhPT1hJiYoaT1pfHxbXSkucHVzaCh1LGEpKTp1PT09ImNoaWxkcmVuIj90eXBlb2YgYSE9InN0cmluZyImJnR5cGVvZiBhIT0ibnVtYmVyInx8KGk9aXx8W10pLnB1c2godSwiIithKTp1IT09InN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyImJnUhPT0ic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIiYmKFhzLmhhc093blByb3BlcnR5KHUpPyhhIT1udWxsJiZ1PT09Im9uU2Nyb2xsIiYmVWUoInNjcm9sbCIsZSksaXx8cz09PWF8fChpPVtdKSk6KGk9aXx8W10pLnB1c2godSxhKSl9biYmKGk9aXx8W10pLnB1c2goInN0eWxlIixuKTt2YXIgdT1pOyh0LnVwZGF0ZVF1ZXVlPXUpJiYodC5mbGFnc3w9NCl9fTtaeD1mdW5jdGlvbihlLHQsbixyKXtuIT09ciYmKHQuZmxhZ3N8PTQpfTtmdW5jdGlvbiB1cyhlLHQpe2lmKCFZZSlzd2l0Y2goZS50YWlsTW9kZSl7Y2FzZSJoaWRkZW4iOnQ9ZS50YWlsO2Zvcih2YXIgbj1udWxsO3QhPT1udWxsOyl0LmFsdGVybmF0ZSE9PW51bGwmJihuPXQpLHQ9dC5zaWJsaW5nO249PT1udWxsP2UudGFpbD1udWxsOm4uc2libGluZz1udWxsO2JyZWFrO2Nhc2UiY29sbGFwc2VkIjpuPWUudGFpbDtmb3IodmFyIHI9bnVsbDtuIT09bnVsbDspbi5hbHRlcm5hdGUhPT1udWxsJiYocj1uKSxuPW4uc2libGluZztyPT09bnVsbD90fHxlLnRhaWw9PT1udWxsP2UudGFpbD1udWxsOmUudGFpbC5zaWJsaW5nPW51bGw6ci5zaWJsaW5nPW51bGx9fWZ1bmN0aW9uIFd0KGUpe3ZhciB0PWUuYWx0ZXJuYXRlIT09bnVsbCYmZS5hbHRlcm5hdGUuY2hpbGQ9PT1lLmNoaWxkLG49MCxyPTA7aWYodClmb3IodmFyIG89ZS5jaGlsZDtvIT09bnVsbDspbnw9by5sYW5lc3xvLmNoaWxkTGFuZXMscnw9by5zdWJ0cmVlRmxhZ3MmMTQ2ODAwNjQscnw9by5mbGFncyYxNDY4MDA2NCxvLnJldHVybj1lLG89by5zaWJsaW5nO2Vsc2UgZm9yKG89ZS5jaGlsZDtvIT09bnVsbDspbnw9by5sYW5lc3xvLmNoaWxkTGFuZXMscnw9by5zdWJ0cmVlRmxhZ3Mscnw9by5mbGFncyxvLnJldHVybj1lLG89by5zaWJsaW5nO3JldHVybiBlLnN1YnRyZWVGbGFnc3w9cixlLmNoaWxkTGFuZXM9bix0fWZ1bmN0aW9uIElrKGUsdCxuKXt2YXIgcj10LnBlbmRpbmdQcm9wcztzd2l0Y2goaWcodCksdC50YWcpe2Nhc2UgMjpjYXNlIDE2OmNhc2UgMTU6Y2FzZSAwOmNhc2UgMTE6Y2FzZSA3OmNhc2UgODpjYXNlIDEyOmNhc2UgOTpjYXNlIDE0OnJldHVybiBXdCh0KSxudWxsO2Nhc2UgMTpyZXR1cm4gaG4odC50eXBlKSYmbmMoKSxXdCh0KSxudWxsO2Nhc2UgMzpyZXR1cm4gcj10LnN0YXRlTm9kZSxFbCgpLEdlKGZuKSxHZShYdCkscGcoKSxyLnBlbmRpbmdDb250ZXh0JiYoci5jb250ZXh0PXIucGVuZGluZ0NvbnRleHQsci5wZW5kaW5nQ29udGV4dD1udWxsKSwoZT09PW51bGx8fGUuY2hpbGQ9PT1udWxsKSYmKGx1KHQpP3QuZmxhZ3N8PTQ6ZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQmJiEodC5mbGFncyYyNTYpfHwodC5mbGFnc3w9MTAyNCxabiE9PW51bGwmJihSaChabiksWm49bnVsbCkpKSxTaChlLHQpLFd0KHQpLG51bGw7Y2FzZSA1OmhnKHQpO3ZhciBvPWVpKHNhLmN1cnJlbnQpO2lmKG49dC50eXBlLGUhPT1udWxsJiZ0LnN0YXRlTm9kZSE9bnVsbClKeChlLHQsbixyLG8pLGUucmVmIT09dC5yZWYmJih0LmZsYWdzfD01MTIsdC5mbGFnc3w9MjA5NzE1Mik7ZWxzZXtpZighcil7aWYodC5zdGF0ZU5vZGU9PT1udWxsKXRocm93IEVycm9yKFUoMTY2KSk7cmV0dXJuIFd0KHQpLG51bGx9aWYoZT1laSh2ci5jdXJyZW50KSxsdSh0KSl7cj10LnN0YXRlTm9kZSxuPXQudHlwZTt2YXIgaT10Lm1lbW9pemVkUHJvcHM7c3dpdGNoKHJbZHJdPXQscltpYV09aSxlPSh0Lm1vZGUmMSkhPT0wLG4pe2Nhc2UiZGlhbG9nIjpVZSgiY2FuY2VsIixyKSxVZSgiY2xvc2UiLHIpO2JyZWFrO2Nhc2UiaWZyYW1lIjpjYXNlIm9iamVjdCI6Y2FzZSJlbWJlZCI6VWUoImxvYWQiLHIpO2JyZWFrO2Nhc2UidmlkZW8iOmNhc2UiYXVkaW8iOmZvcihvPTA7bzxfcy5sZW5ndGg7bysrKVVlKF9zW29dLHIpO2JyZWFrO2Nhc2Uic291cmNlIjpVZSgiZXJyb3IiLHIpO2JyZWFrO2Nhc2UiaW1nIjpjYXNlImltYWdlIjpjYXNlImxpbmsiOlVlKCJlcnJvciIsciksVWUoImxvYWQiLHIpO2JyZWFrO2Nhc2UiZGV0YWlscyI6VWUoInRvZ2dsZSIscik7YnJlYWs7Y2FzZSJpbnB1dCI6cnYocixpKSxVZSgiaW52YWxpZCIscik7YnJlYWs7Y2FzZSJzZWxlY3QiOnIuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFpLm11bHRpcGxlfSxVZSgiaW52YWxpZCIscik7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6aXYocixpKSxVZSgiaW52YWxpZCIscil9WGYobixpKSxvPW51bGw7Zm9yKHZhciBsIGluIGkpaWYoaS5oYXNPd25Qcm9wZXJ0eShsKSl7dmFyIHM9aVtsXTtsPT09ImNoaWxkcmVuIj90eXBlb2Ygcz09InN0cmluZyI/ci50ZXh0Q29udGVudCE9PXMmJihpLnN1cHByZXNzSHlkcmF0aW9uV2FybmluZyE9PSEwJiZpdShyLnRleHRDb250ZW50LHMsZSksbz1bImNoaWxkcmVuIixzXSk6dHlwZW9mIHM9PSJudW1iZXIiJiZyLnRleHRDb250ZW50IT09IiIrcyYmKGkuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIT09ITAmJml1KHIudGV4dENvbnRlbnQscyxlKSxvPVsiY2hpbGRyZW4iLCIiK3NdKTpYcy5oYXNPd25Qcm9wZXJ0eShsKSYmcyE9bnVsbCYmbD09PSJvblNjcm9sbCImJlVlKCJzY3JvbGwiLHIpfXN3aXRjaChuKXtjYXNlImlucHV0IjpKYShyKSxvdihyLGksITApO2JyZWFrO2Nhc2UidGV4dGFyZWEiOkphKHIpLGx2KHIpO2JyZWFrO2Nhc2Uic2VsZWN0IjpjYXNlIm9wdGlvbiI6YnJlYWs7ZGVmYXVsdDp0eXBlb2YgaS5vbkNsaWNrPT0iZnVuY3Rpb24iJiYoci5vbmNsaWNrPXRjKX1yPW8sdC51cGRhdGVRdWV1ZT1yLHIhPT1udWxsJiYodC5mbGFnc3w9NCl9ZWxzZXtsPW8ubm9kZVR5cGU9PT05P286by5vd25lckRvY3VtZW50LGU9PT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCImJihlPSQxKG4pKSxlPT09Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiP249PT0ic2NyaXB0Ij8oZT1sLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuaW5uZXJIVE1MPSI8c2NyaXB0PjxcL3NjcmlwdD4iLGU9ZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpKTp0eXBlb2Ygci5pcz09InN0cmluZyI/ZT1sLmNyZWF0ZUVsZW1lbnQobix7aXM6ci5pc30pOihlPWwuY3JlYXRlRWxlbWVudChuKSxuPT09InNlbGVjdCImJihsPWUsci5tdWx0aXBsZT9sLm11bHRpcGxlPSEwOnIuc2l6ZSYmKGwuc2l6ZT1yLnNpemUpKSk6ZT1sLmNyZWF0ZUVsZW1lbnROUyhlLG4pLGVbZHJdPXQsZVtpYV09cixReChlLHQsITEsITEpLHQuc3RhdGVOb2RlPWU7ZTp7c3dpdGNoKGw9UWYobixyKSxuKXtjYXNlImRpYWxvZyI6VWUoImNhbmNlbCIsZSksVWUoImNsb3NlIixlKSxvPXI7YnJlYWs7Y2FzZSJpZnJhbWUiOmNhc2Uib2JqZWN0IjpjYXNlImVtYmVkIjpVZSgibG9hZCIsZSksbz1yO2JyZWFrO2Nhc2UidmlkZW8iOmNhc2UiYXVkaW8iOmZvcihvPTA7bzxfcy5sZW5ndGg7bysrKVVlKF9zW29dLGUpO289cjticmVhaztjYXNlInNvdXJjZSI6VWUoImVycm9yIixlKSxvPXI7YnJlYWs7Y2FzZSJpbWciOmNhc2UiaW1hZ2UiOmNhc2UibGluayI6VWUoImVycm9yIixlKSxVZSgibG9hZCIsZSksbz1yO2JyZWFrO2Nhc2UiZGV0YWlscyI6VWUoInRvZ2dsZSIsZSksbz1yO2JyZWFrO2Nhc2UiaW5wdXQiOnJ2KGUsciksbz1WZihlLHIpLFVlKCJpbnZhbGlkIixlKTticmVhaztjYXNlIm9wdGlvbiI6bz1yO2JyZWFrO2Nhc2Uic2VsZWN0IjplLl93cmFwcGVyU3RhdGU9e3dhc011bHRpcGxlOiEhci5tdWx0aXBsZX0sbz1udCh7fSxyLHt2YWx1ZTp2b2lkIDB9KSxVZSgiaW52YWxpZCIsZSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6aXYoZSxyKSxvPUdmKGUsciksVWUoImludmFsaWQiLGUpO2JyZWFrO2RlZmF1bHQ6bz1yfVhmKG4sbykscz1vO2ZvcihpIGluIHMpaWYocy5oYXNPd25Qcm9wZXJ0eShpKSl7dmFyIGE9c1tpXTtpPT09InN0eWxlIj9iMShlLGEpOmk9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyhhPWE/YS5fX2h0bWw6dm9pZCAwLGEhPW51bGwmJmsxKGUsYSkpOmk9PT0iY2hpbGRyZW4iP3R5cGVvZiBhPT0ic3RyaW5nIj8obiE9PSJ0ZXh0YXJlYSJ8fGEhPT0iIikmJlFzKGUsYSk6dHlwZW9mIGE9PSJudW1iZXIiJiZRcyhlLCIiK2EpOmkhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmaSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiZpIT09ImF1dG9Gb2N1cyImJihYcy5oYXNPd25Qcm9wZXJ0eShpKT9hIT1udWxsJiZpPT09Im9uU2Nyb2xsIiYmVWUoInNjcm9sbCIsZSk6YSE9bnVsbCYmVnAoZSxpLGEsbCkpfXN3aXRjaChuKXtjYXNlImlucHV0IjpKYShlKSxvdihlLHIsITEpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOkphKGUpLGx2KGUpO2JyZWFrO2Nhc2Uib3B0aW9uIjpyLnZhbHVlIT1udWxsJiZlLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiK05vKHIudmFsdWUpKTticmVhaztjYXNlInNlbGVjdCI6ZS5tdWx0aXBsZT0hIXIubXVsdGlwbGUsaT1yLnZhbHVlLGkhPW51bGw/c2woZSwhIXIubXVsdGlwbGUsaSwhMSk6ci5kZWZhdWx0VmFsdWUhPW51bGwmJnNsKGUsISFyLm11bHRpcGxlLHIuZGVmYXVsdFZhbHVlLCEwKTticmVhaztkZWZhdWx0OnR5cGVvZiBvLm9uQ2xpY2s9PSJmdW5jdGlvbiImJihlLm9uY2xpY2s9dGMpfXN3aXRjaChuKXtjYXNlImJ1dHRvbiI6Y2FzZSJpbnB1dCI6Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOnI9ISFyLmF1dG9Gb2N1czticmVhayBlO2Nhc2UiaW1nIjpyPSEwO2JyZWFrIGU7ZGVmYXVsdDpyPSExfX1yJiYodC5mbGFnc3w9NCl9dC5yZWYhPT1udWxsJiYodC5mbGFnc3w9NTEyLHQuZmxhZ3N8PTIwOTcxNTIpfXJldHVybiBXdCh0KSxudWxsO2Nhc2UgNjppZihlJiZ0LnN0YXRlTm9kZSE9bnVsbClaeChlLHQsZS5tZW1vaXplZFByb3BzLHIpO2Vsc2V7aWYodHlwZW9mIHIhPSJzdHJpbmciJiZ0LnN0YXRlTm9kZT09PW51bGwpdGhyb3cgRXJyb3IoVSgxNjYpKTtpZihuPWVpKHNhLmN1cnJlbnQpLGVpKHZyLmN1cnJlbnQpLGx1KHQpKXtpZihyPXQuc3RhdGVOb2RlLG49dC5tZW1vaXplZFByb3BzLHJbZHJdPXQsKGk9ci5ub2RlVmFsdWUhPT1uKSYmKGU9U24sZSE9PW51bGwpKXN3aXRjaChlLnRhZyl7Y2FzZSAzOml1KHIubm9kZVZhbHVlLG4sKGUubW9kZSYxKSE9PTApO2JyZWFrO2Nhc2UgNTplLm1lbW9pemVkUHJvcHMuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIT09ITAmJml1KHIubm9kZVZhbHVlLG4sKGUubW9kZSYxKSE9PTApfWkmJih0LmZsYWdzfD00KX1lbHNlIHI9KG4ubm9kZVR5cGU9PT05P246bi5vd25lckRvY3VtZW50KS5jcmVhdGVUZXh0Tm9kZShyKSxyW2RyXT10LHQuc3RhdGVOb2RlPXJ9cmV0dXJuIFd0KHQpLG51bGw7Y2FzZSAxMzppZihHZShaZSkscj10Lm1lbW9pemVkU3RhdGUsZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZSE9PW51bGwmJmUubWVtb2l6ZWRTdGF0ZS5kZWh5ZHJhdGVkIT09bnVsbCl7aWYoWWUmJl9uIT09bnVsbCYmdC5tb2RlJjEmJiEodC5mbGFncyYxMjgpKWd4KCksX2woKSx0LmZsYWdzfD05ODU2MCxpPSExO2Vsc2UgaWYoaT1sdSh0KSxyIT09bnVsbCYmci5kZWh5ZHJhdGVkIT09bnVsbCl7aWYoZT09PW51bGwpe2lmKCFpKXRocm93IEVycm9yKFUoMzE4KSk7aWYoaT10Lm1lbW9pemVkU3RhdGUsaT1pIT09bnVsbD9pLmRlaHlkcmF0ZWQ6bnVsbCwhaSl0aHJvdyBFcnJvcihVKDMxNykpO2lbZHJdPXR9ZWxzZSBfbCgpLCEodC5mbGFncyYxMjgpJiYodC5tZW1vaXplZFN0YXRlPW51bGwpLHQuZmxhZ3N8PTQ7V3QodCksaT0hMX1lbHNlIFpuIT09bnVsbCYmKFJoKFpuKSxabj1udWxsKSxpPSEwO2lmKCFpKXJldHVybiB0LmZsYWdzJjY1NTM2P3Q6bnVsbH1yZXR1cm4gdC5mbGFncyYxMjg/KHQubGFuZXM9bix0KToocj1yIT09bnVsbCxyIT09KGUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGUhPT1udWxsKSYmciYmKHQuY2hpbGQuZmxhZ3N8PTgxOTIsdC5tb2RlJjEmJihlPT09bnVsbHx8WmUuY3VycmVudCYxP3d0PT09MCYmKHd0PTMpOmtnKCkpKSx0LnVwZGF0ZVF1ZXVlIT09bnVsbCYmKHQuZmxhZ3N8PTQpLFd0KHQpLG51bGwpO2Nhc2UgNDpyZXR1cm4gRWwoKSxTaChlLHQpLGU9PT1udWxsJiZyYSh0LnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxXdCh0KSxudWxsO2Nhc2UgMTA6cmV0dXJuIHVnKHQudHlwZS5fY29udGV4dCksV3QodCksbnVsbDtjYXNlIDE3OnJldHVybiBobih0LnR5cGUpJiZuYygpLFd0KHQpLG51bGw7Y2FzZSAxOTppZihHZShaZSksaT10Lm1lbW9pemVkU3RhdGUsaT09PW51bGwpcmV0dXJuIFd0KHQpLG51bGw7aWYocj0odC5mbGFncyYxMjgpIT09MCxsPWkucmVuZGVyaW5nLGw9PT1udWxsKWlmKHIpdXMoaSwhMSk7ZWxzZXtpZih3dCE9PTB8fGUhPT1udWxsJiZlLmZsYWdzJjEyOClmb3IoZT10LmNoaWxkO2UhPT1udWxsOyl7aWYobD11YyhlKSxsIT09bnVsbCl7Zm9yKHQuZmxhZ3N8PTEyOCx1cyhpLCExKSxyPWwudXBkYXRlUXVldWUsciE9PW51bGwmJih0LnVwZGF0ZVF1ZXVlPXIsdC5mbGFnc3w9NCksdC5zdWJ0cmVlRmxhZ3M9MCxyPW4sbj10LmNoaWxkO24hPT1udWxsOylpPW4sZT1yLGkuZmxhZ3MmPTE0NjgwMDY2LGw9aS5hbHRlcm5hdGUsbD09PW51bGw/KGkuY2hpbGRMYW5lcz0wLGkubGFuZXM9ZSxpLmNoaWxkPW51bGwsaS5zdWJ0cmVlRmxhZ3M9MCxpLm1lbW9pemVkUHJvcHM9bnVsbCxpLm1lbW9pemVkU3RhdGU9bnVsbCxpLnVwZGF0ZVF1ZXVlPW51bGwsaS5kZXBlbmRlbmNpZXM9bnVsbCxpLnN0YXRlTm9kZT1udWxsKTooaS5jaGlsZExhbmVzPWwuY2hpbGRMYW5lcyxpLmxhbmVzPWwubGFuZXMsaS5jaGlsZD1sLmNoaWxkLGkuc3VidHJlZUZsYWdzPTAsaS5kZWxldGlvbnM9bnVsbCxpLm1lbW9pemVkUHJvcHM9bC5tZW1vaXplZFByb3BzLGkubWVtb2l6ZWRTdGF0ZT1sLm1lbW9pemVkU3RhdGUsaS51cGRhdGVRdWV1ZT1sLnVwZGF0ZVF1ZXVlLGkudHlwZT1sLnR5cGUsZT1sLmRlcGVuZGVuY2llcyxpLmRlcGVuZGVuY2llcz1lPT09bnVsbD9udWxsOntsYW5lczplLmxhbmVzLGZpcnN0Q29udGV4dDplLmZpcnN0Q29udGV4dH0pLG49bi5zaWJsaW5nO3JldHVybiBGZShaZSxaZS5jdXJyZW50JjF8MiksdC5jaGlsZH1lPWUuc2libGluZ31pLnRhaWwhPT1udWxsJiZjdCgpPiRsJiYodC5mbGFnc3w9MTI4LHI9ITAsdXMoaSwhMSksdC5sYW5lcz00MTk0MzA0KX1lbHNle2lmKCFyKWlmKGU9dWMobCksZSE9PW51bGwpe2lmKHQuZmxhZ3N8PTEyOCxyPSEwLG49ZS51cGRhdGVRdWV1ZSxuIT09bnVsbCYmKHQudXBkYXRlUXVldWU9bix0LmZsYWdzfD00KSx1cyhpLCEwKSxpLnRhaWw9PT1udWxsJiZpLnRhaWxNb2RlPT09ImhpZGRlbiImJiFsLmFsdGVybmF0ZSYmIVllKXJldHVybiBXdCh0KSxudWxsfWVsc2UgMipjdCgpLWkucmVuZGVyaW5nU3RhcnRUaW1lPiRsJiZuIT09MTA3Mzc0MTgyNCYmKHQuZmxhZ3N8PTEyOCxyPSEwLHVzKGksITEpLHQubGFuZXM9NDE5NDMwNCk7aS5pc0JhY2t3YXJkcz8obC5zaWJsaW5nPXQuY2hpbGQsdC5jaGlsZD1sKToobj1pLmxhc3QsbiE9PW51bGw/bi5zaWJsaW5nPWw6dC5jaGlsZD1sLGkubGFzdD1sKX1yZXR1cm4gaS50YWlsIT09bnVsbD8odD1pLnRhaWwsaS5yZW5kZXJpbmc9dCxpLnRhaWw9dC5zaWJsaW5nLGkucmVuZGVyaW5nU3RhcnRUaW1lPWN0KCksdC5zaWJsaW5nPW51bGwsbj1aZS5jdXJyZW50LEZlKFplLHI/biYxfDI6biYxKSx0KTooV3QodCksbnVsbCk7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiAkZygpLHI9dC5tZW1vaXplZFN0YXRlIT09bnVsbCxlIT09bnVsbCYmZS5tZW1vaXplZFN0YXRlIT09bnVsbCE9PXImJih0LmZsYWdzfD04MTkyKSxyJiZ0Lm1vZGUmMT95biYxMDczNzQxODI0JiYoV3QodCksdC5zdWJ0cmVlRmxhZ3MmNiYmKHQuZmxhZ3N8PTgxOTIpKTpXdCh0KSxudWxsO2Nhc2UgMjQ6cmV0dXJuIG51bGw7Y2FzZSAyNTpyZXR1cm4gbnVsbH10aHJvdyBFcnJvcihVKDE1Nix0LnRhZykpfWZ1bmN0aW9uIGprKGUsdCl7c3dpdGNoKGlnKHQpLHQudGFnKXtjYXNlIDE6cmV0dXJuIGhuKHQudHlwZSkmJm5jKCksZT10LmZsYWdzLGUmNjU1MzY/KHQuZmxhZ3M9ZSYtNjU1Mzd8MTI4LHQpOm51bGw7Y2FzZSAzOnJldHVybiBFbCgpLEdlKGZuKSxHZShYdCkscGcoKSxlPXQuZmxhZ3MsZSY2NTUzNiYmIShlJjEyOCk/KHQuZmxhZ3M9ZSYtNjU1Mzd8MTI4LHQpOm51bGw7Y2FzZSA1OnJldHVybiBoZyh0KSxudWxsO2Nhc2UgMTM6aWYoR2UoWmUpLGU9dC5tZW1vaXplZFN0YXRlLGUhPT1udWxsJiZlLmRlaHlkcmF0ZWQhPT1udWxsKXtpZih0LmFsdGVybmF0ZT09PW51bGwpdGhyb3cgRXJyb3IoVSgzNDApKTtfbCgpfXJldHVybiBlPXQuZmxhZ3MsZSY2NTUzNj8odC5mbGFncz1lJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDE5OnJldHVybiBHZShaZSksbnVsbDtjYXNlIDQ6cmV0dXJuIEVsKCksbnVsbDtjYXNlIDEwOnJldHVybiB1Zyh0LnR5cGUuX2NvbnRleHQpLG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiAkZygpLG51bGw7Y2FzZSAyNDpyZXR1cm4gbnVsbDtkZWZhdWx0OnJldHVybiBudWxsfX12YXIgdXU9ITEsVnQ9ITEsems9dHlwZW9mIFdlYWtTZXQ9PSJmdW5jdGlvbiI/V2Vha1NldDpTZXQscT1udWxsO2Z1bmN0aW9uIHRsKGUsdCl7dmFyIG49ZS5yZWY7aWYobiE9PW51bGwpaWYodHlwZW9mIG49PSJmdW5jdGlvbiIpdHJ5e24obnVsbCl9Y2F0Y2gocil7cnQoZSx0LHIpfWVsc2Ugbi5jdXJyZW50PW51bGx9ZnVuY3Rpb24gRWgoZSx0LG4pe3RyeXtuKCl9Y2F0Y2gocil7cnQoZSx0LHIpfX12YXIgWHY9ITE7ZnVuY3Rpb24gRmsoZSx0KXtpZihsaD1adSxlPW54KCkscmcoZSkpe2lmKCJzZWxlY3Rpb25TdGFydCJpbiBlKXZhciBuPXtzdGFydDplLnNlbGVjdGlvblN0YXJ0LGVuZDplLnNlbGVjdGlvbkVuZH07ZWxzZSBlOntuPShuPWUub3duZXJEb2N1bWVudCkmJm4uZGVmYXVsdFZpZXd8fHdpbmRvdzt2YXIgcj1uLmdldFNlbGVjdGlvbiYmbi5nZXRTZWxlY3Rpb24oKTtpZihyJiZyLnJhbmdlQ291bnQhPT0wKXtuPXIuYW5jaG9yTm9kZTt2YXIgbz1yLmFuY2hvck9mZnNldCxpPXIuZm9jdXNOb2RlO3I9ci5mb2N1c09mZnNldDt0cnl7bi5ub2RlVHlwZSxpLm5vZGVUeXBlfWNhdGNoe249bnVsbDticmVhayBlfXZhciBsPTAscz0tMSxhPS0xLHU9MCxjPTAsZD1lLGY9bnVsbDt0OmZvcig7Oyl7Zm9yKHZhciBoO2QhPT1ufHxvIT09MCYmZC5ub2RlVHlwZSE9PTN8fChzPWwrbyksZCE9PWl8fHIhPT0wJiZkLm5vZGVUeXBlIT09M3x8KGE9bCtyKSxkLm5vZGVUeXBlPT09MyYmKGwrPWQubm9kZVZhbHVlLmxlbmd0aCksKGg9ZC5maXJzdENoaWxkKSE9PW51bGw7KWY9ZCxkPWg7Zm9yKDs7KXtpZihkPT09ZSlicmVhayB0O2lmKGY9PT1uJiYrK3U9PT1vJiYocz1sKSxmPT09aSYmKytjPT09ciYmKGE9bCksKGg9ZC5uZXh0U2libGluZykhPT1udWxsKWJyZWFrO2Q9ZixmPWQucGFyZW50Tm9kZX1kPWh9bj1zPT09LTF8fGE9PT0tMT9udWxsOntzdGFydDpzLGVuZDphfX1lbHNlIG49bnVsbH1uPW58fHtzdGFydDowLGVuZDowfX1lbHNlIG49bnVsbDtmb3Ioc2g9e2ZvY3VzZWRFbGVtOmUsc2VsZWN0aW9uUmFuZ2U6bn0sWnU9ITEscT10O3EhPT1udWxsOylpZih0PXEsZT10LmNoaWxkLCh0LnN1YnRyZWVGbGFncyYxMDI4KSE9PTAmJmUhPT1udWxsKWUucmV0dXJuPXQscT1lO2Vsc2UgZm9yKDtxIT09bnVsbDspe3Q9cTt0cnl7dmFyIG09dC5hbHRlcm5hdGU7aWYodC5mbGFncyYxMDI0KXN3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpicmVhaztjYXNlIDE6aWYobSE9PW51bGwpe3ZhciBnPW0ubWVtb2l6ZWRQcm9wcyxTPW0ubWVtb2l6ZWRTdGF0ZSx2PXQuc3RhdGVOb2RlLHk9di5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSh0LmVsZW1lbnRUeXBlPT09dC50eXBlP2c6WG4odC50eXBlLGcpLFMpO3YuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGU9eX1icmVhaztjYXNlIDM6dmFyIHg9dC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzt4Lm5vZGVUeXBlPT09MT94LnRleHRDb250ZW50PSIiOngubm9kZVR5cGU9PT05JiZ4LmRvY3VtZW50RWxlbWVudCYmeC5yZW1vdmVDaGlsZCh4LmRvY3VtZW50RWxlbWVudCk7YnJlYWs7Y2FzZSA1OmNhc2UgNjpjYXNlIDQ6Y2FzZSAxNzpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKFUoMTYzKSl9fWNhdGNoKHcpe3J0KHQsdC5yZXR1cm4sdyl9aWYoZT10LnNpYmxpbmcsZSE9PW51bGwpe2UucmV0dXJuPXQucmV0dXJuLHE9ZTticmVha31xPXQucmV0dXJufXJldHVybiBtPVh2LFh2PSExLG19ZnVuY3Rpb24gT3MoZSx0LG4pe3ZhciByPXQudXBkYXRlUXVldWU7aWYocj1yIT09bnVsbD9yLmxhc3RFZmZlY3Q6bnVsbCxyIT09bnVsbCl7dmFyIG89cj1yLm5leHQ7ZG97aWYoKG8udGFnJmUpPT09ZSl7dmFyIGk9by5kZXN0cm95O28uZGVzdHJveT12b2lkIDAsaSE9PXZvaWQgMCYmRWgodCxuLGkpfW89by5uZXh0fXdoaWxlKG8hPT1yKX19ZnVuY3Rpb24gZWQoZSx0KXtpZih0PXQudXBkYXRlUXVldWUsdD10IT09bnVsbD90Lmxhc3RFZmZlY3Q6bnVsbCx0IT09bnVsbCl7dmFyIG49dD10Lm5leHQ7ZG97aWYoKG4udGFnJmUpPT09ZSl7dmFyIHI9bi5jcmVhdGU7bi5kZXN0cm95PXIoKX1uPW4ubmV4dH13aGlsZShuIT09dCl9fWZ1bmN0aW9uIENoKGUpe3ZhciB0PWUucmVmO2lmKHQhPT1udWxsKXt2YXIgbj1lLnN0YXRlTm9kZTtzd2l0Y2goZS50YWcpe2Nhc2UgNTplPW47YnJlYWs7ZGVmYXVsdDplPW59dHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChlKTp0LmN1cnJlbnQ9ZX19ZnVuY3Rpb24gcXgoZSl7dmFyIHQ9ZS5hbHRlcm5hdGU7dCE9PW51bGwmJihlLmFsdGVybmF0ZT1udWxsLHF4KHQpKSxlLmNoaWxkPW51bGwsZS5kZWxldGlvbnM9bnVsbCxlLnNpYmxpbmc9bnVsbCxlLnRhZz09PTUmJih0PWUuc3RhdGVOb2RlLHQhPT1udWxsJiYoZGVsZXRlIHRbZHJdLGRlbGV0ZSB0W2lhXSxkZWxldGUgdFtjaF0sZGVsZXRlIHRbU2tdLGRlbGV0ZSB0W0VrXSkpLGUuc3RhdGVOb2RlPW51bGwsZS5yZXR1cm49bnVsbCxlLmRlcGVuZGVuY2llcz1udWxsLGUubWVtb2l6ZWRQcm9wcz1udWxsLGUubWVtb2l6ZWRTdGF0ZT1udWxsLGUucGVuZGluZ1Byb3BzPW51bGwsZS5zdGF0ZU5vZGU9bnVsbCxlLnVwZGF0ZVF1ZXVlPW51bGx9ZnVuY3Rpb24gZXcoZSl7cmV0dXJuIGUudGFnPT09NXx8ZS50YWc9PT0zfHxlLnRhZz09PTR9ZnVuY3Rpb24gUXYoZSl7ZTpmb3IoOzspe2Zvcig7ZS5zaWJsaW5nPT09bnVsbDspe2lmKGUucmV0dXJuPT09bnVsbHx8ZXcoZS5yZXR1cm4pKXJldHVybiBudWxsO2U9ZS5yZXR1cm59Zm9yKGUuc2libGluZy5yZXR1cm49ZS5yZXR1cm4sZT1lLnNpYmxpbmc7ZS50YWchPT01JiZlLnRhZyE9PTYmJmUudGFnIT09MTg7KXtpZihlLmZsYWdzJjJ8fGUuY2hpbGQ9PT1udWxsfHxlLnRhZz09PTQpY29udGludWUgZTtlLmNoaWxkLnJldHVybj1lLGU9ZS5jaGlsZH1pZighKGUuZmxhZ3MmMikpcmV0dXJuIGUuc3RhdGVOb2RlfX1mdW5jdGlvbiAkaChlLHQsbil7dmFyIHI9ZS50YWc7aWYocj09PTV8fHI9PT02KWU9ZS5zdGF0ZU5vZGUsdD9uLm5vZGVUeXBlPT09OD9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdCk6bi5pbnNlcnRCZWZvcmUoZSx0KToobi5ub2RlVHlwZT09PTg/KHQ9bi5wYXJlbnROb2RlLHQuaW5zZXJ0QmVmb3JlKGUsbikpOih0PW4sdC5hcHBlbmRDaGlsZChlKSksbj1uLl9yZWFjdFJvb3RDb250YWluZXIsbiE9bnVsbHx8dC5vbmNsaWNrIT09bnVsbHx8KHQub25jbGljaz10YykpO2Vsc2UgaWYociE9PTQmJihlPWUuY2hpbGQsZSE9PW51bGwpKWZvcigkaChlLHQsbiksZT1lLnNpYmxpbmc7ZSE9PW51bGw7KSRoKGUsdCxuKSxlPWUuc2libGluZ31mdW5jdGlvbiBraChlLHQsbil7dmFyIHI9ZS50YWc7aWYocj09PTV8fHI9PT02KWU9ZS5zdGF0ZU5vZGUsdD9uLmluc2VydEJlZm9yZShlLHQpOm4uYXBwZW5kQ2hpbGQoZSk7ZWxzZSBpZihyIT09NCYmKGU9ZS5jaGlsZCxlIT09bnVsbCkpZm9yKGtoKGUsdCxuKSxlPWUuc2libGluZztlIT09bnVsbDspa2goZSx0LG4pLGU9ZS5zaWJsaW5nfXZhciBNdD1udWxsLFFuPSExO2Z1bmN0aW9uIG5vKGUsdCxuKXtmb3Iobj1uLmNoaWxkO24hPT1udWxsOyl0dyhlLHQsbiksbj1uLnNpYmxpbmd9ZnVuY3Rpb24gdHcoZSx0LG4pe2lmKG1yJiZ0eXBlb2YgbXIub25Db21taXRGaWJlclVubW91bnQ9PSJmdW5jdGlvbiIpdHJ5e21yLm9uQ29tbWl0RmliZXJVbm1vdW50KEtjLG4pfWNhdGNoe31zd2l0Y2gobi50YWcpe2Nhc2UgNTpWdHx8dGwobix0KTtjYXNlIDY6dmFyIHI9TXQsbz1RbjtNdD1udWxsLG5vKGUsdCxuKSxNdD1yLFFuPW8sTXQhPT1udWxsJiYoUW4/KGU9TXQsbj1uLnN0YXRlTm9kZSxlLm5vZGVUeXBlPT09OD9lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobik6ZS5yZW1vdmVDaGlsZChuKSk6TXQucmVtb3ZlQ2hpbGQobi5zdGF0ZU5vZGUpKTticmVhaztjYXNlIDE4Ok10IT09bnVsbCYmKFFuPyhlPU10LG49bi5zdGF0ZU5vZGUsZS5ub2RlVHlwZT09PTg/bGYoZS5wYXJlbnROb2RlLG4pOmUubm9kZVR5cGU9PT0xJiZsZihlLG4pLGVhKGUpKTpsZihNdCxuLnN0YXRlTm9kZSkpO2JyZWFrO2Nhc2UgNDpyPU10LG89UW4sTXQ9bi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxRbj0hMCxubyhlLHQsbiksTXQ9cixRbj1vO2JyZWFrO2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTppZighVnQmJihyPW4udXBkYXRlUXVldWUsciE9PW51bGwmJihyPXIubGFzdEVmZmVjdCxyIT09bnVsbCkpKXtvPXI9ci5uZXh0O2Rve3ZhciBpPW8sbD1pLmRlc3Ryb3k7aT1pLnRhZyxsIT09dm9pZCAwJiYoaSYyfHxpJjQpJiZFaChuLHQsbCksbz1vLm5leHR9d2hpbGUobyE9PXIpfW5vKGUsdCxuKTticmVhaztjYXNlIDE6aWYoIVZ0JiYodGwobix0KSxyPW4uc3RhdGVOb2RlLHR5cGVvZiByLmNvbXBvbmVudFdpbGxVbm1vdW50PT0iZnVuY3Rpb24iKSl0cnl7ci5wcm9wcz1uLm1lbW9pemVkUHJvcHMsci5zdGF0ZT1uLm1lbW9pemVkU3RhdGUsci5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKHMpe3J0KG4sdCxzKX1ubyhlLHQsbik7YnJlYWs7Y2FzZSAyMTpubyhlLHQsbik7YnJlYWs7Y2FzZSAyMjpuLm1vZGUmMT8oVnQ9KHI9VnQpfHxuLm1lbW9pemVkU3RhdGUhPT1udWxsLG5vKGUsdCxuKSxWdD1yKTpubyhlLHQsbik7YnJlYWs7ZGVmYXVsdDpubyhlLHQsbil9fWZ1bmN0aW9uIEp2KGUpe3ZhciB0PWUudXBkYXRlUXVldWU7aWYodCE9PW51bGwpe2UudXBkYXRlUXVldWU9bnVsbDt2YXIgbj1lLnN0YXRlTm9kZTtuPT09bnVsbCYmKG49ZS5zdGF0ZU5vZGU9bmV3IHprKSx0LmZvckVhY2goZnVuY3Rpb24ocil7dmFyIG89WGsuYmluZChudWxsLGUscik7bi5oYXMocil8fChuLmFkZChyKSxyLnRoZW4obyxvKSl9KX19ZnVuY3Rpb24gS24oZSx0KXt2YXIgbj10LmRlbGV0aW9ucztpZihuIT09bnVsbClmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXTt0cnl7dmFyIGk9ZSxsPXQscz1sO2U6Zm9yKDtzIT09bnVsbDspe3N3aXRjaChzLnRhZyl7Y2FzZSA1Ok10PXMuc3RhdGVOb2RlLFFuPSExO2JyZWFrIGU7Y2FzZSAzOk10PXMuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sUW49ITA7YnJlYWsgZTtjYXNlIDQ6TXQ9cy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxRbj0hMDticmVhayBlfXM9cy5yZXR1cm59aWYoTXQ9PT1udWxsKXRocm93IEVycm9yKFUoMTYwKSk7dHcoaSxsLG8pLE10PW51bGwsUW49ITE7dmFyIGE9by5hbHRlcm5hdGU7YSE9PW51bGwmJihhLnJldHVybj1udWxsKSxvLnJldHVybj1udWxsfWNhdGNoKHUpe3J0KG8sdCx1KX19aWYodC5zdWJ0cmVlRmxhZ3MmMTI4NTQpZm9yKHQ9dC5jaGlsZDt0IT09bnVsbDspbncodCxlKSx0PXQuc2libGluZ31mdW5jdGlvbiBudyhlLHQpe3ZhciBuPWUuYWx0ZXJuYXRlLHI9ZS5mbGFncztzd2l0Y2goZS50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTppZihLbih0LGUpLGFyKGUpLHImNCl7dHJ5e09zKDMsZSxlLnJldHVybiksZWQoMyxlKX1jYXRjaChnKXtydChlLGUucmV0dXJuLGcpfXRyeXtPcyg1LGUsZS5yZXR1cm4pfWNhdGNoKGcpe3J0KGUsZS5yZXR1cm4sZyl9fWJyZWFrO2Nhc2UgMTpLbih0LGUpLGFyKGUpLHImNTEyJiZuIT09bnVsbCYmdGwobixuLnJldHVybik7YnJlYWs7Y2FzZSA1OmlmKEtuKHQsZSksYXIoZSksciY1MTImJm4hPT1udWxsJiZ0bChuLG4ucmV0dXJuKSxlLmZsYWdzJjMyKXt2YXIgbz1lLnN0YXRlTm9kZTt0cnl7UXMobywiIil9Y2F0Y2goZyl7cnQoZSxlLnJldHVybixnKX19aWYociY0JiYobz1lLnN0YXRlTm9kZSxvIT1udWxsKSl7dmFyIGk9ZS5tZW1vaXplZFByb3BzLGw9biE9PW51bGw/bi5tZW1vaXplZFByb3BzOmkscz1lLnR5cGUsYT1lLnVwZGF0ZVF1ZXVlO2lmKGUudXBkYXRlUXVldWU9bnVsbCxhIT09bnVsbCl0cnl7cz09PSJpbnB1dCImJmkudHlwZT09PSJyYWRpbyImJmkubmFtZSE9bnVsbCYmRTEobyxpKSxRZihzLGwpO3ZhciB1PVFmKHMsaSk7Zm9yKGw9MDtsPGEubGVuZ3RoO2wrPTIpe3ZhciBjPWFbbF0sZD1hW2wrMV07Yz09PSJzdHlsZSI/YjEobyxkKTpjPT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIj9rMShvLGQpOmM9PT0iY2hpbGRyZW4iP1FzKG8sZCk6VnAobyxjLGQsdSl9c3dpdGNoKHMpe2Nhc2UiaW5wdXQiOkhmKG8saSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6QzEobyxpKTticmVhaztjYXNlInNlbGVjdCI6dmFyIGY9by5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO28uX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZT0hIWkubXVsdGlwbGU7dmFyIGg9aS52YWx1ZTtoIT1udWxsP3NsKG8sISFpLm11bHRpcGxlLGgsITEpOmYhPT0hIWkubXVsdGlwbGUmJihpLmRlZmF1bHRWYWx1ZSE9bnVsbD9zbChvLCEhaS5tdWx0aXBsZSxpLmRlZmF1bHRWYWx1ZSwhMCk6c2wobywhIWkubXVsdGlwbGUsaS5tdWx0aXBsZT9bXToiIiwhMSkpfW9baWFdPWl9Y2F0Y2goZyl7cnQoZSxlLnJldHVybixnKX19YnJlYWs7Y2FzZSA2OmlmKEtuKHQsZSksYXIoZSksciY0KXtpZihlLnN0YXRlTm9kZT09PW51bGwpdGhyb3cgRXJyb3IoVSgxNjIpKTtvPWUuc3RhdGVOb2RlLGk9ZS5tZW1vaXplZFByb3BzO3RyeXtvLm5vZGVWYWx1ZT1pfWNhdGNoKGcpe3J0KGUsZS5yZXR1cm4sZyl9fWJyZWFrO2Nhc2UgMzppZihLbih0LGUpLGFyKGUpLHImNCYmbiE9PW51bGwmJm4ubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpdHJ5e2VhKHQuY29udGFpbmVySW5mbyl9Y2F0Y2goZyl7cnQoZSxlLnJldHVybixnKX1icmVhaztjYXNlIDQ6S24odCxlKSxhcihlKTticmVhaztjYXNlIDEzOktuKHQsZSksYXIoZSksbz1lLmNoaWxkLG8uZmxhZ3MmODE5MiYmKGk9by5tZW1vaXplZFN0YXRlIT09bnVsbCxvLnN0YXRlTm9kZS5pc0hpZGRlbj1pLCFpfHxvLmFsdGVybmF0ZSE9PW51bGwmJm8uYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUhPT1udWxsfHwoRWc9Y3QoKSkpLHImNCYmSnYoZSk7YnJlYWs7Y2FzZSAyMjppZihjPW4hPT1udWxsJiZuLm1lbW9pemVkU3RhdGUhPT1udWxsLGUubW9kZSYxPyhWdD0odT1WdCl8fGMsS24odCxlKSxWdD11KTpLbih0LGUpLGFyKGUpLHImODE5Mil7aWYodT1lLm1lbW9pemVkU3RhdGUhPT1udWxsLChlLnN0YXRlTm9kZS5pc0hpZGRlbj11KSYmIWMmJmUubW9kZSYxKWZvcihxPWUsYz1lLmNoaWxkO2MhPT1udWxsOyl7Zm9yKGQ9cT1jO3EhPT1udWxsOyl7c3dpdGNoKGY9cSxoPWYuY2hpbGQsZi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTpPcyg0LGYsZi5yZXR1cm4pO2JyZWFrO2Nhc2UgMTp0bChmLGYucmV0dXJuKTt2YXIgbT1mLnN0YXRlTm9kZTtpZih0eXBlb2YgbS5jb21wb25lbnRXaWxsVW5tb3VudD09ImZ1bmN0aW9uIil7cj1mLG49Zi5yZXR1cm47dHJ5e3Q9cixtLnByb3BzPXQubWVtb2l6ZWRQcm9wcyxtLnN0YXRlPXQubWVtb2l6ZWRTdGF0ZSxtLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2goZyl7cnQocixuLGcpfX1icmVhaztjYXNlIDU6dGwoZixmLnJldHVybik7YnJlYWs7Y2FzZSAyMjppZihmLm1lbW9pemVkU3RhdGUhPT1udWxsKXtxdihkKTtjb250aW51ZX19aCE9PW51bGw/KGgucmV0dXJuPWYscT1oKTpxdihkKX1jPWMuc2libGluZ31lOmZvcihjPW51bGwsZD1lOzspe2lmKGQudGFnPT09NSl7aWYoYz09PW51bGwpe2M9ZDt0cnl7bz1kLnN0YXRlTm9kZSx1PyhpPW8uc3R5bGUsdHlwZW9mIGkuc2V0UHJvcGVydHk9PSJmdW5jdGlvbiI/aS5zZXRQcm9wZXJ0eSgiZGlzcGxheSIsIm5vbmUiLCJpbXBvcnRhbnQiKTppLmRpc3BsYXk9Im5vbmUiKToocz1kLnN0YXRlTm9kZSxhPWQubWVtb2l6ZWRQcm9wcy5zdHlsZSxsPWEhPW51bGwmJmEuaGFzT3duUHJvcGVydHkoImRpc3BsYXkiKT9hLmRpc3BsYXk6bnVsbCxzLnN0eWxlLmRpc3BsYXk9VDEoImRpc3BsYXkiLGwpKX1jYXRjaChnKXtydChlLGUucmV0dXJuLGcpfX19ZWxzZSBpZihkLnRhZz09PTYpe2lmKGM9PT1udWxsKXRyeXtkLnN0YXRlTm9kZS5ub2RlVmFsdWU9dT8iIjpkLm1lbW9pemVkUHJvcHN9Y2F0Y2goZyl7cnQoZSxlLnJldHVybixnKX19ZWxzZSBpZigoZC50YWchPT0yMiYmZC50YWchPT0yM3x8ZC5tZW1vaXplZFN0YXRlPT09bnVsbHx8ZD09PWUpJiZkLmNoaWxkIT09bnVsbCl7ZC5jaGlsZC5yZXR1cm49ZCxkPWQuY2hpbGQ7Y29udGludWV9aWYoZD09PWUpYnJlYWsgZTtmb3IoO2Quc2libGluZz09PW51bGw7KXtpZihkLnJldHVybj09PW51bGx8fGQucmV0dXJuPT09ZSlicmVhayBlO2M9PT1kJiYoYz1udWxsKSxkPWQucmV0dXJufWM9PT1kJiYoYz1udWxsKSxkLnNpYmxpbmcucmV0dXJuPWQucmV0dXJuLGQ9ZC5zaWJsaW5nfX1icmVhaztjYXNlIDE5OktuKHQsZSksYXIoZSksciY0JiZKdihlKTticmVhaztjYXNlIDIxOmJyZWFrO2RlZmF1bHQ6S24odCxlKSxhcihlKX19ZnVuY3Rpb24gYXIoZSl7dmFyIHQ9ZS5mbGFncztpZih0JjIpe3RyeXtlOntmb3IodmFyIG49ZS5yZXR1cm47biE9PW51bGw7KXtpZihldyhuKSl7dmFyIHI9bjticmVhayBlfW49bi5yZXR1cm59dGhyb3cgRXJyb3IoVSgxNjApKX1zd2l0Y2goci50YWcpe2Nhc2UgNTp2YXIgbz1yLnN0YXRlTm9kZTtyLmZsYWdzJjMyJiYoUXMobywiIiksci5mbGFncyY9LTMzKTt2YXIgaT1RdihlKTtraChlLGksbyk7YnJlYWs7Y2FzZSAzOmNhc2UgNDp2YXIgbD1yLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLHM9UXYoZSk7JGgoZSxzLGwpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoVSgxNjEpKX19Y2F0Y2goYSl7cnQoZSxlLnJldHVybixhKX1lLmZsYWdzJj0tM310JjQwOTYmJihlLmZsYWdzJj0tNDA5Nyl9ZnVuY3Rpb24gQmsoZSx0LG4pe3E9ZSxydyhlKX1mdW5jdGlvbiBydyhlLHQsbil7Zm9yKHZhciByPShlLm1vZGUmMSkhPT0wO3EhPT1udWxsOyl7dmFyIG89cSxpPW8uY2hpbGQ7aWYoby50YWc9PT0yMiYmcil7dmFyIGw9by5tZW1vaXplZFN0YXRlIT09bnVsbHx8dXU7aWYoIWwpe3ZhciBzPW8uYWx0ZXJuYXRlLGE9cyE9PW51bGwmJnMubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fFZ0O3M9dXU7dmFyIHU9VnQ7aWYodXU9bCwoVnQ9YSkmJiF1KWZvcihxPW87cSE9PW51bGw7KWw9cSxhPWwuY2hpbGQsbC50YWc9PT0yMiYmbC5tZW1vaXplZFN0YXRlIT09bnVsbD9leShvKTphIT09bnVsbD8oYS5yZXR1cm49bCxxPWEpOmV5KG8pO2Zvcig7aSE9PW51bGw7KXE9aSxydyhpKSxpPWkuc2libGluZztxPW8sdXU9cyxWdD11fVp2KGUpfWVsc2Ugby5zdWJ0cmVlRmxhZ3MmODc3MiYmaSE9PW51bGw/KGkucmV0dXJuPW8scT1pKTpadihlKX19ZnVuY3Rpb24gWnYoZSl7Zm9yKDtxIT09bnVsbDspe3ZhciB0PXE7aWYodC5mbGFncyY4NzcyKXt2YXIgbj10LmFsdGVybmF0ZTt0cnl7aWYodC5mbGFncyY4NzcyKXN3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpWdHx8ZWQoNSx0KTticmVhaztjYXNlIDE6dmFyIHI9dC5zdGF0ZU5vZGU7aWYodC5mbGFncyY0JiYhVnQpaWYobj09PW51bGwpci5jb21wb25lbnREaWRNb3VudCgpO2Vsc2V7dmFyIG89dC5lbGVtZW50VHlwZT09PXQudHlwZT9uLm1lbW9pemVkUHJvcHM6WG4odC50eXBlLG4ubWVtb2l6ZWRQcm9wcyk7ci5jb21wb25lbnREaWRVcGRhdGUobyxuLm1lbW9pemVkU3RhdGUsci5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSl9dmFyIGk9dC51cGRhdGVRdWV1ZTtpIT09bnVsbCYmTHYodCxpLHIpO2JyZWFrO2Nhc2UgMzp2YXIgbD10LnVwZGF0ZVF1ZXVlO2lmKGwhPT1udWxsKXtpZihuPW51bGwsdC5jaGlsZCE9PW51bGwpc3dpdGNoKHQuY2hpbGQudGFnKXtjYXNlIDU6bj10LmNoaWxkLnN0YXRlTm9kZTticmVhaztjYXNlIDE6bj10LmNoaWxkLnN0YXRlTm9kZX1Mdih0LGwsbil9YnJlYWs7Y2FzZSA1OnZhciBzPXQuc3RhdGVOb2RlO2lmKG49PT1udWxsJiZ0LmZsYWdzJjQpe249czt2YXIgYT10Lm1lbW9pemVkUHJvcHM7c3dpdGNoKHQudHlwZSl7Y2FzZSJidXR0b24iOmNhc2UiaW5wdXQiOmNhc2Uic2VsZWN0IjpjYXNlInRleHRhcmVhIjphLmF1dG9Gb2N1cyYmbi5mb2N1cygpO2JyZWFrO2Nhc2UiaW1nIjphLnNyYyYmKG4uc3JjPWEuc3JjKX19YnJlYWs7Y2FzZSA2OmJyZWFrO2Nhc2UgNDpicmVhaztjYXNlIDEyOmJyZWFrO2Nhc2UgMTM6aWYodC5tZW1vaXplZFN0YXRlPT09bnVsbCl7dmFyIHU9dC5hbHRlcm5hdGU7aWYodSE9PW51bGwpe3ZhciBjPXUubWVtb2l6ZWRTdGF0ZTtpZihjIT09bnVsbCl7dmFyIGQ9Yy5kZWh5ZHJhdGVkO2QhPT1udWxsJiZlYShkKX19fWJyZWFrO2Nhc2UgMTk6Y2FzZSAxNzpjYXNlIDIxOmNhc2UgMjI6Y2FzZSAyMzpjYXNlIDI1OmJyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoVSgxNjMpKX1WdHx8dC5mbGFncyY1MTImJkNoKHQpfWNhdGNoKGYpe3J0KHQsdC5yZXR1cm4sZil9fWlmKHQ9PT1lKXtxPW51bGw7YnJlYWt9aWYobj10LnNpYmxpbmcsbiE9PW51bGwpe24ucmV0dXJuPXQucmV0dXJuLHE9bjticmVha31xPXQucmV0dXJufX1mdW5jdGlvbiBxdihlKXtmb3IoO3EhPT1udWxsOyl7dmFyIHQ9cTtpZih0PT09ZSl7cT1udWxsO2JyZWFrfXZhciBuPXQuc2libGluZztpZihuIT09bnVsbCl7bi5yZXR1cm49dC5yZXR1cm4scT1uO2JyZWFrfXE9dC5yZXR1cm59fWZ1bmN0aW9uIGV5KGUpe2Zvcig7cSE9PW51bGw7KXt2YXIgdD1xO3RyeXtzd2l0Y2godC50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6dmFyIG49dC5yZXR1cm47dHJ5e2VkKDQsdCl9Y2F0Y2goYSl7cnQodCxuLGEpfWJyZWFrO2Nhc2UgMTp2YXIgcj10LnN0YXRlTm9kZTtpZih0eXBlb2Ygci5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIil7dmFyIG89dC5yZXR1cm47dHJ5e3IuY29tcG9uZW50RGlkTW91bnQoKX1jYXRjaChhKXtydCh0LG8sYSl9fXZhciBpPXQucmV0dXJuO3RyeXtDaCh0KX1jYXRjaChhKXtydCh0LGksYSl9YnJlYWs7Y2FzZSA1OnZhciBsPXQucmV0dXJuO3RyeXtDaCh0KX1jYXRjaChhKXtydCh0LGwsYSl9fX1jYXRjaChhKXtydCh0LHQucmV0dXJuLGEpfWlmKHQ9PT1lKXtxPW51bGw7YnJlYWt9dmFyIHM9dC5zaWJsaW5nO2lmKHMhPT1udWxsKXtzLnJldHVybj10LnJldHVybixxPXM7YnJlYWt9cT10LnJldHVybn19dmFyIFdrPU1hdGguY2VpbCxmYz1Lci5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLF9nPUtyLlJlYWN0Q3VycmVudE93bmVyLEZuPUtyLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLGtlPTAsUnQ9bnVsbCxkdD1udWxsLER0PTAseW49MCxubD1GbygwKSx3dD0wLGRhPW51bGwsZmk9MCx0ZD0wLFNnPTAsQXM9bnVsbCxjbj1udWxsLEVnPTAsJGw9MS8wLFJyPW51bGwsaGM9ITEsVGg9bnVsbCxDbz1udWxsLGN1PSExLG1vPW51bGwscGM9MCxNcz0wLGJoPW51bGwsRHU9LTEsSXU9MDtmdW5jdGlvbiBvbigpe3JldHVybiBrZSY2P2N0KCk6RHUhPT0tMT9EdTpEdT1jdCgpfWZ1bmN0aW9uICRvKGUpe3JldHVybiBlLm1vZGUmMT9rZSYyJiZEdCE9PTA/RHQmLUR0OiRrLnRyYW5zaXRpb24hPT1udWxsPyhJdT09PTAmJihJdT1GMSgpKSxJdSk6KGU9T2UsZSE9PTB8fChlPXdpbmRvdy5ldmVudCxlPWU9PT12b2lkIDA/MTY6RzEoZS50eXBlKSksZSk6MX1mdW5jdGlvbiBucihlLHQsbixyKXtpZig1MDxNcyl0aHJvdyBNcz0wLGJoPW51bGwsRXJyb3IoVSgxODUpKTtSYShlLG4sciksKCEoa2UmMil8fGUhPT1SdCkmJihlPT09UnQmJighKGtlJjIpJiYodGR8PW4pLHd0PT09NCYmaG8oZSxEdCkpLHBuKGUsciksbj09PTEmJmtlPT09MCYmISh0Lm1vZGUmMSkmJigkbD1jdCgpKzUwMCxKYyYmQm8oKSkpfWZ1bmN0aW9uIHBuKGUsdCl7dmFyIG49ZS5jYWxsYmFja05vZGU7JCQoZSx0KTt2YXIgcj1KdShlLGU9PT1SdD9EdDowKTtpZihyPT09MCluIT09bnVsbCYmdXYobiksZS5jYWxsYmFja05vZGU9bnVsbCxlLmNhbGxiYWNrUHJpb3JpdHk9MDtlbHNlIGlmKHQ9ciYtcixlLmNhbGxiYWNrUHJpb3JpdHkhPT10KXtpZihuIT1udWxsJiZ1dihuKSx0PT09MSllLnRhZz09PTA/Q2sodHkuYmluZChudWxsLGUpKTpmeCh0eS5iaW5kKG51bGwsZSkpLHdrKGZ1bmN0aW9uKCl7IShrZSY2KSYmQm8oKX0pLG49bnVsbDtlbHNle3N3aXRjaChCMShyKSl7Y2FzZSAxOm49WHA7YnJlYWs7Y2FzZSA0Om49ajE7YnJlYWs7Y2FzZSAxNjpuPVF1O2JyZWFrO2Nhc2UgNTM2ODcwOTEyOm49ejE7YnJlYWs7ZGVmYXVsdDpuPVF1fW49ZHcobixvdy5iaW5kKG51bGwsZSkpfWUuY2FsbGJhY2tQcmlvcml0eT10LGUuY2FsbGJhY2tOb2RlPW59fWZ1bmN0aW9uIG93KGUsdCl7aWYoRHU9LTEsSXU9MCxrZSY2KXRocm93IEVycm9yKFUoMzI3KSk7dmFyIG49ZS5jYWxsYmFja05vZGU7aWYoZmwoKSYmZS5jYWxsYmFja05vZGUhPT1uKXJldHVybiBudWxsO3ZhciByPUp1KGUsZT09PVJ0P0R0OjApO2lmKHI9PT0wKXJldHVybiBudWxsO2lmKHImMzB8fHImZS5leHBpcmVkTGFuZXN8fHQpdD1nYyhlLHIpO2Vsc2V7dD1yO3ZhciBvPWtlO2tlfD0yO3ZhciBpPWx3KCk7KFJ0IT09ZXx8RHQhPT10KSYmKFJyPW51bGwsJGw9Y3QoKSs1MDAscmkoZSx0KSk7ZG8gdHJ5e0hrKCk7YnJlYWt9Y2F0Y2gocyl7aXcoZSxzKX13aGlsZSgxKTthZygpLGZjLmN1cnJlbnQ9aSxrZT1vLGR0IT09bnVsbD90PTA6KFJ0PW51bGwsRHQ9MCx0PXd0KX1pZih0IT09MCl7aWYodD09PTImJihvPXRoKGUpLG8hPT0wJiYocj1vLHQ9TmgoZSxvKSkpLHQ9PT0xKXRocm93IG49ZGEscmkoZSwwKSxobyhlLHIpLHBuKGUsY3QoKSksbjtpZih0PT09NilobyhlLHIpO2Vsc2V7aWYobz1lLmN1cnJlbnQuYWx0ZXJuYXRlLCEociYzMCkmJiFVayhvKSYmKHQ9Z2MoZSxyKSx0PT09MiYmKGk9dGgoZSksaSE9PTAmJihyPWksdD1OaChlLGkpKSksdD09PTEpKXRocm93IG49ZGEscmkoZSwwKSxobyhlLHIpLHBuKGUsY3QoKSksbjtzd2l0Y2goZS5maW5pc2hlZFdvcms9byxlLmZpbmlzaGVkTGFuZXM9cix0KXtjYXNlIDA6Y2FzZSAxOnRocm93IEVycm9yKFUoMzQ1KSk7Y2FzZSAyOlhvKGUsY24sUnIpO2JyZWFrO2Nhc2UgMzppZihobyhlLHIpLChyJjEzMDAyMzQyNCk9PT1yJiYodD1FZys1MDAtY3QoKSwxMDx0KSl7aWYoSnUoZSwwKSE9PTApYnJlYWs7aWYobz1lLnN1c3BlbmRlZExhbmVzLChvJnIpIT09cil7b24oKSxlLnBpbmdlZExhbmVzfD1lLnN1c3BlbmRlZExhbmVzJm87YnJlYWt9ZS50aW1lb3V0SGFuZGxlPXVoKFhvLmJpbmQobnVsbCxlLGNuLFJyKSx0KTticmVha31YbyhlLGNuLFJyKTticmVhaztjYXNlIDQ6aWYoaG8oZSxyKSwociY0MTk0MjQwKT09PXIpYnJlYWs7Zm9yKHQ9ZS5ldmVudFRpbWVzLG89LTE7MDxyOyl7dmFyIGw9MzEtdHIocik7aT0xPDxsLGw9dFtsXSxsPm8mJihvPWwpLHImPX5pfWlmKHI9byxyPWN0KCktcixyPSgxMjA+cj8xMjA6NDgwPnI/NDgwOjEwODA+cj8xMDgwOjE5MjA+cj8xOTIwOjNlMz5yPzNlMzo0MzIwPnI/NDMyMDoxOTYwKldrKHIvMTk2MCkpLXIsMTA8cil7ZS50aW1lb3V0SGFuZGxlPXVoKFhvLmJpbmQobnVsbCxlLGNuLFJyKSxyKTticmVha31YbyhlLGNuLFJyKTticmVhaztjYXNlIDU6WG8oZSxjbixScik7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihVKDMyOSkpfX19cmV0dXJuIHBuKGUsY3QoKSksZS5jYWxsYmFja05vZGU9PT1uP293LmJpbmQobnVsbCxlKTpudWxsfWZ1bmN0aW9uIE5oKGUsdCl7dmFyIG49QXM7cmV0dXJuIGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmKHJpKGUsdCkuZmxhZ3N8PTI1NiksZT1nYyhlLHQpLGUhPT0yJiYodD1jbixjbj1uLHQhPT1udWxsJiZSaCh0KSksZX1mdW5jdGlvbiBSaChlKXtjbj09PW51bGw/Y249ZTpjbi5wdXNoLmFwcGx5KGNuLGUpfWZ1bmN0aW9uIFVrKGUpe2Zvcih2YXIgdD1lOzspe2lmKHQuZmxhZ3MmMTYzODQpe3ZhciBuPXQudXBkYXRlUXVldWU7aWYobiE9PW51bGwmJihuPW4uc3RvcmVzLG4hPT1udWxsKSlmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXSxpPW8uZ2V0U25hcHNob3Q7bz1vLnZhbHVlO3RyeXtpZighcnIoaSgpLG8pKXJldHVybiExfWNhdGNoe3JldHVybiExfX19aWYobj10LmNoaWxkLHQuc3VidHJlZUZsYWdzJjE2Mzg0JiZuIT09bnVsbCluLnJldHVybj10LHQ9bjtlbHNle2lmKHQ9PT1lKWJyZWFrO2Zvcig7dC5zaWJsaW5nPT09bnVsbDspe2lmKHQucmV0dXJuPT09bnVsbHx8dC5yZXR1cm49PT1lKXJldHVybiEwO3Q9dC5yZXR1cm59dC5zaWJsaW5nLnJldHVybj10LnJldHVybix0PXQuc2libGluZ319cmV0dXJuITB9ZnVuY3Rpb24gaG8oZSx0KXtmb3IodCY9flNnLHQmPX50ZCxlLnN1c3BlbmRlZExhbmVzfD10LGUucGluZ2VkTGFuZXMmPX50LGU9ZS5leHBpcmF0aW9uVGltZXM7MDx0Oyl7dmFyIG49MzEtdHIodCkscj0xPDxuO2Vbbl09LTEsdCY9fnJ9fWZ1bmN0aW9uIHR5KGUpe2lmKGtlJjYpdGhyb3cgRXJyb3IoVSgzMjcpKTtmbCgpO3ZhciB0PUp1KGUsMCk7aWYoISh0JjEpKXJldHVybiBwbihlLGN0KCkpLG51bGw7dmFyIG49Z2MoZSx0KTtpZihlLnRhZyE9PTAmJm49PT0yKXt2YXIgcj10aChlKTtyIT09MCYmKHQ9cixuPU5oKGUscikpfWlmKG49PT0xKXRocm93IG49ZGEscmkoZSwwKSxobyhlLHQpLHBuKGUsY3QoKSksbjtpZihuPT09Nil0aHJvdyBFcnJvcihVKDM0NSkpO3JldHVybiBlLmZpbmlzaGVkV29yaz1lLmN1cnJlbnQuYWx0ZXJuYXRlLGUuZmluaXNoZWRMYW5lcz10LFhvKGUsY24sUnIpLHBuKGUsY3QoKSksbnVsbH1mdW5jdGlvbiBDZyhlLHQpe3ZhciBuPWtlO2tlfD0xO3RyeXtyZXR1cm4gZSh0KX1maW5hbGx5e2tlPW4sa2U9PT0wJiYoJGw9Y3QoKSs1MDAsSmMmJkJvKCkpfX1mdW5jdGlvbiBoaShlKXttbyE9PW51bGwmJm1vLnRhZz09PTAmJiEoa2UmNikmJmZsKCk7dmFyIHQ9a2U7a2V8PTE7dmFyIG49Rm4udHJhbnNpdGlvbixyPU9lO3RyeXtpZihGbi50cmFuc2l0aW9uPW51bGwsT2U9MSxlKXJldHVybiBlKCl9ZmluYWxseXtPZT1yLEZuLnRyYW5zaXRpb249bixrZT10LCEoa2UmNikmJkJvKCl9fWZ1bmN0aW9uICRnKCl7eW49bmwuY3VycmVudCxHZShubCl9ZnVuY3Rpb24gcmkoZSx0KXtlLmZpbmlzaGVkV29yaz1udWxsLGUuZmluaXNoZWRMYW5lcz0wO3ZhciBuPWUudGltZW91dEhhbmRsZTtpZihuIT09LTEmJihlLnRpbWVvdXRIYW5kbGU9LTEseGsobikpLGR0IT09bnVsbClmb3Iobj1kdC5yZXR1cm47biE9PW51bGw7KXt2YXIgcj1uO3N3aXRjaChpZyhyKSxyLnRhZyl7Y2FzZSAxOnI9ci50eXBlLmNoaWxkQ29udGV4dFR5cGVzLHIhPW51bGwmJm5jKCk7YnJlYWs7Y2FzZSAzOkVsKCksR2UoZm4pLEdlKFh0KSxwZygpO2JyZWFrO2Nhc2UgNTpoZyhyKTticmVhaztjYXNlIDQ6RWwoKTticmVhaztjYXNlIDEzOkdlKFplKTticmVhaztjYXNlIDE5OkdlKFplKTticmVhaztjYXNlIDEwOnVnKHIudHlwZS5fY29udGV4dCk7YnJlYWs7Y2FzZSAyMjpjYXNlIDIzOiRnKCl9bj1uLnJldHVybn1pZihSdD1lLGR0PWU9a28oZS5jdXJyZW50LG51bGwpLER0PXluPXQsd3Q9MCxkYT1udWxsLFNnPXRkPWZpPTAsY249QXM9bnVsbCxxbyE9PW51bGwpe2Zvcih0PTA7dDxxby5sZW5ndGg7dCsrKWlmKG49cW9bdF0scj1uLmludGVybGVhdmVkLHIhPT1udWxsKXtuLmludGVybGVhdmVkPW51bGw7dmFyIG89ci5uZXh0LGk9bi5wZW5kaW5nO2lmKGkhPT1udWxsKXt2YXIgbD1pLm5leHQ7aS5uZXh0PW8sci5uZXh0PWx9bi5wZW5kaW5nPXJ9cW89bnVsbH1yZXR1cm4gZX1mdW5jdGlvbiBpdyhlLHQpe2Rve3ZhciBuPWR0O3RyeXtpZihhZygpLEF1LmN1cnJlbnQ9ZGMsY2Mpe2Zvcih2YXIgcj1ldC5tZW1vaXplZFN0YXRlO3IhPT1udWxsOyl7dmFyIG89ci5xdWV1ZTtvIT09bnVsbCYmKG8ucGVuZGluZz1udWxsKSxyPXIubmV4dH1jYz0hMX1pZihkaT0wLCR0PXZ0PWV0PW51bGwsUHM9ITEsYWE9MCxfZy5jdXJyZW50PW51bGwsbj09PW51bGx8fG4ucmV0dXJuPT09bnVsbCl7d3Q9MSxkYT10LGR0PW51bGw7YnJlYWt9ZTp7dmFyIGk9ZSxsPW4ucmV0dXJuLHM9bixhPXQ7aWYodD1EdCxzLmZsYWdzfD0zMjc2OCxhIT09bnVsbCYmdHlwZW9mIGE9PSJvYmplY3QiJiZ0eXBlb2YgYS50aGVuPT0iZnVuY3Rpb24iKXt2YXIgdT1hLGM9cyxkPWMudGFnO2lmKCEoYy5tb2RlJjEpJiYoZD09PTB8fGQ9PT0xMXx8ZD09PTE1KSl7dmFyIGY9Yy5hbHRlcm5hdGU7Zj8oYy51cGRhdGVRdWV1ZT1mLnVwZGF0ZVF1ZXVlLGMubWVtb2l6ZWRTdGF0ZT1mLm1lbW9pemVkU3RhdGUsYy5sYW5lcz1mLmxhbmVzKTooYy51cGRhdGVRdWV1ZT1udWxsLGMubWVtb2l6ZWRTdGF0ZT1udWxsKX12YXIgaD1XdihsKTtpZihoIT09bnVsbCl7aC5mbGFncyY9LTI1NyxVdihoLGwscyxpLHQpLGgubW9kZSYxJiZCdihpLHUsdCksdD1oLGE9dTt2YXIgbT10LnVwZGF0ZVF1ZXVlO2lmKG09PT1udWxsKXt2YXIgZz1uZXcgU2V0O2cuYWRkKGEpLHQudXBkYXRlUXVldWU9Z31lbHNlIG0uYWRkKGEpO2JyZWFrIGV9ZWxzZXtpZighKHQmMSkpe0J2KGksdSx0KSxrZygpO2JyZWFrIGV9YT1FcnJvcihVKDQyNikpfX1lbHNlIGlmKFllJiZzLm1vZGUmMSl7dmFyIFM9V3YobCk7aWYoUyE9PW51bGwpeyEoUy5mbGFncyY2NTUzNikmJihTLmZsYWdzfD0yNTYpLFV2KFMsbCxzLGksdCksbGcoQ2woYSxzKSk7YnJlYWsgZX19aT1hPUNsKGEscyksd3QhPT00JiYod3Q9MiksQXM9PT1udWxsP0FzPVtpXTpBcy5wdXNoKGkpLGk9bDtkb3tzd2l0Y2goaS50YWcpe2Nhc2UgMzppLmZsYWdzfD02NTUzNix0Jj0tdCxpLmxhbmVzfD10O3ZhciB2PVd4KGksYSx0KTtNdihpLHYpO2JyZWFrIGU7Y2FzZSAxOnM9YTt2YXIgeT1pLnR5cGUseD1pLnN0YXRlTm9kZTtpZighKGkuZmxhZ3MmMTI4KSYmKHR5cGVvZiB5LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj09ImZ1bmN0aW9uInx8eCE9PW51bGwmJnR5cGVvZiB4LmNvbXBvbmVudERpZENhdGNoPT0iZnVuY3Rpb24iJiYoQ289PT1udWxsfHwhQ28uaGFzKHgpKSkpe2kuZmxhZ3N8PTY1NTM2LHQmPS10LGkubGFuZXN8PXQ7dmFyIHc9VXgoaSxzLHQpO012KGksdyk7YnJlYWsgZX19aT1pLnJldHVybn13aGlsZShpIT09bnVsbCl9YXcobil9Y2F0Y2goayl7dD1rLGR0PT09biYmbiE9PW51bGwmJihkdD1uPW4ucmV0dXJuKTtjb250aW51ZX1icmVha313aGlsZSgxKX1mdW5jdGlvbiBsdygpe3ZhciBlPWZjLmN1cnJlbnQ7cmV0dXJuIGZjLmN1cnJlbnQ9ZGMsZT09PW51bGw/ZGM6ZX1mdW5jdGlvbiBrZygpeyh3dD09PTB8fHd0PT09M3x8d3Q9PT0yKSYmKHd0PTQpLFJ0PT09bnVsbHx8IShmaSYyNjg0MzU0NTUpJiYhKHRkJjI2ODQzNTQ1NSl8fGhvKFJ0LER0KX1mdW5jdGlvbiBnYyhlLHQpe3ZhciBuPWtlO2tlfD0yO3ZhciByPWx3KCk7KFJ0IT09ZXx8RHQhPT10KSYmKFJyPW51bGwscmkoZSx0KSk7ZG8gdHJ5e1ZrKCk7YnJlYWt9Y2F0Y2gobyl7aXcoZSxvKX13aGlsZSgxKTtpZihhZygpLGtlPW4sZmMuY3VycmVudD1yLGR0IT09bnVsbCl0aHJvdyBFcnJvcihVKDI2MSkpO3JldHVybiBSdD1udWxsLER0PTAsd3R9ZnVuY3Rpb24gVmsoKXtmb3IoO2R0IT09bnVsbDspc3coZHQpfWZ1bmN0aW9uIEhrKCl7Zm9yKDtkdCE9PW51bGwmJiFtJCgpOylzdyhkdCl9ZnVuY3Rpb24gc3coZSl7dmFyIHQ9Y3coZS5hbHRlcm5hdGUsZSx5bik7ZS5tZW1vaXplZFByb3BzPWUucGVuZGluZ1Byb3BzLHQ9PT1udWxsP2F3KGUpOmR0PXQsX2cuY3VycmVudD1udWxsfWZ1bmN0aW9uIGF3KGUpe3ZhciB0PWU7ZG97dmFyIG49dC5hbHRlcm5hdGU7aWYoZT10LnJldHVybix0LmZsYWdzJjMyNzY4KXtpZihuPWprKG4sdCksbiE9PW51bGwpe24uZmxhZ3MmPTMyNzY3LGR0PW47cmV0dXJufWlmKGUhPT1udWxsKWUuZmxhZ3N8PTMyNzY4LGUuc3VidHJlZUZsYWdzPTAsZS5kZWxldGlvbnM9bnVsbDtlbHNle3d0PTYsZHQ9bnVsbDtyZXR1cm59fWVsc2UgaWYobj1JayhuLHQseW4pLG4hPT1udWxsKXtkdD1uO3JldHVybn1pZih0PXQuc2libGluZyx0IT09bnVsbCl7ZHQ9dDtyZXR1cm59ZHQ9dD1lfXdoaWxlKHQhPT1udWxsKTt3dD09PTAmJih3dD01KX1mdW5jdGlvbiBYbyhlLHQsbil7dmFyIHI9T2Usbz1Gbi50cmFuc2l0aW9uO3RyeXtGbi50cmFuc2l0aW9uPW51bGwsT2U9MSxLayhlLHQsbixyKX1maW5hbGx5e0ZuLnRyYW5zaXRpb249byxPZT1yfXJldHVybiBudWxsfWZ1bmN0aW9uIEtrKGUsdCxuLHIpe2RvIGZsKCk7d2hpbGUobW8hPT1udWxsKTtpZihrZSY2KXRocm93IEVycm9yKFUoMzI3KSk7bj1lLmZpbmlzaGVkV29yazt2YXIgbz1lLmZpbmlzaGVkTGFuZXM7aWYobj09PW51bGwpcmV0dXJuIG51bGw7aWYoZS5maW5pc2hlZFdvcms9bnVsbCxlLmZpbmlzaGVkTGFuZXM9MCxuPT09ZS5jdXJyZW50KXRocm93IEVycm9yKFUoMTc3KSk7ZS5jYWxsYmFja05vZGU9bnVsbCxlLmNhbGxiYWNrUHJpb3JpdHk9MDt2YXIgaT1uLmxhbmVzfG4uY2hpbGRMYW5lcztpZihrJChlLGkpLGU9PT1SdCYmKGR0PVJ0PW51bGwsRHQ9MCksIShuLnN1YnRyZWVGbGFncyYyMDY0KSYmIShuLmZsYWdzJjIwNjQpfHxjdXx8KGN1PSEwLGR3KFF1LGZ1bmN0aW9uKCl7cmV0dXJuIGZsKCksbnVsbH0pKSxpPShuLmZsYWdzJjE1OTkwKSE9PTAsbi5zdWJ0cmVlRmxhZ3MmMTU5OTB8fGkpe2k9Rm4udHJhbnNpdGlvbixGbi50cmFuc2l0aW9uPW51bGw7dmFyIGw9T2U7T2U9MTt2YXIgcz1rZTtrZXw9NCxfZy5jdXJyZW50PW51bGwsRmsoZSxuKSxudyhuLGUpLGZrKHNoKSxadT0hIWxoLHNoPWxoPW51bGwsZS5jdXJyZW50PW4sQmsobiksdiQoKSxrZT1zLE9lPWwsRm4udHJhbnNpdGlvbj1pfWVsc2UgZS5jdXJyZW50PW47aWYoY3UmJihjdT0hMSxtbz1lLHBjPW8pLGk9ZS5wZW5kaW5nTGFuZXMsaT09PTAmJihDbz1udWxsKSx3JChuLnN0YXRlTm9kZSkscG4oZSxjdCgpKSx0IT09bnVsbClmb3Iocj1lLm9uUmVjb3ZlcmFibGVFcnJvcixuPTA7bjx0Lmxlbmd0aDtuKyspbz10W25dLHIoby52YWx1ZSx7Y29tcG9uZW50U3RhY2s6by5zdGFjayxkaWdlc3Q6by5kaWdlc3R9KTtpZihoYyl0aHJvdyBoYz0hMSxlPVRoLFRoPW51bGwsZTtyZXR1cm4gcGMmMSYmZS50YWchPT0wJiZmbCgpLGk9ZS5wZW5kaW5nTGFuZXMsaSYxP2U9PT1iaD9NcysrOihNcz0wLGJoPWUpOk1zPTAsQm8oKSxudWxsfWZ1bmN0aW9uIGZsKCl7aWYobW8hPT1udWxsKXt2YXIgZT1CMShwYyksdD1Gbi50cmFuc2l0aW9uLG49T2U7dHJ5e2lmKEZuLnRyYW5zaXRpb249bnVsbCxPZT0xNj5lPzE2OmUsbW89PT1udWxsKXZhciByPSExO2Vsc2V7aWYoZT1tbyxtbz1udWxsLHBjPTAsa2UmNil0aHJvdyBFcnJvcihVKDMzMSkpO3ZhciBvPWtlO2ZvcihrZXw9NCxxPWUuY3VycmVudDtxIT09bnVsbDspe3ZhciBpPXEsbD1pLmNoaWxkO2lmKHEuZmxhZ3MmMTYpe3ZhciBzPWkuZGVsZXRpb25zO2lmKHMhPT1udWxsKXtmb3IodmFyIGE9MDthPHMubGVuZ3RoO2ErKyl7dmFyIHU9c1thXTtmb3IocT11O3EhPT1udWxsOyl7dmFyIGM9cTtzd2l0Y2goYy50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6T3MoOCxjLGkpfXZhciBkPWMuY2hpbGQ7aWYoZCE9PW51bGwpZC5yZXR1cm49YyxxPWQ7ZWxzZSBmb3IoO3EhPT1udWxsOyl7Yz1xO3ZhciBmPWMuc2libGluZyxoPWMucmV0dXJuO2lmKHF4KGMpLGM9PT11KXtxPW51bGw7YnJlYWt9aWYoZiE9PW51bGwpe2YucmV0dXJuPWgscT1mO2JyZWFrfXE9aH19fXZhciBtPWkuYWx0ZXJuYXRlO2lmKG0hPT1udWxsKXt2YXIgZz1tLmNoaWxkO2lmKGchPT1udWxsKXttLmNoaWxkPW51bGw7ZG97dmFyIFM9Zy5zaWJsaW5nO2cuc2libGluZz1udWxsLGc9U313aGlsZShnIT09bnVsbCl9fXE9aX19aWYoaS5zdWJ0cmVlRmxhZ3MmMjA2NCYmbCE9PW51bGwpbC5yZXR1cm49aSxxPWw7ZWxzZSBlOmZvcig7cSE9PW51bGw7KXtpZihpPXEsaS5mbGFncyYyMDQ4KXN3aXRjaChpLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpPcyg5LGksaS5yZXR1cm4pfXZhciB2PWkuc2libGluZztpZih2IT09bnVsbCl7di5yZXR1cm49aS5yZXR1cm4scT12O2JyZWFrIGV9cT1pLnJldHVybn19dmFyIHk9ZS5jdXJyZW50O2ZvcihxPXk7cSE9PW51bGw7KXtsPXE7dmFyIHg9bC5jaGlsZDtpZihsLnN1YnRyZWVGbGFncyYyMDY0JiZ4IT09bnVsbCl4LnJldHVybj1sLHE9eDtlbHNlIGU6Zm9yKGw9eTtxIT09bnVsbDspe2lmKHM9cSxzLmZsYWdzJjIwNDgpdHJ5e3N3aXRjaChzLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTplZCg5LHMpfX1jYXRjaChrKXtydChzLHMucmV0dXJuLGspfWlmKHM9PT1sKXtxPW51bGw7YnJlYWsgZX12YXIgdz1zLnNpYmxpbmc7aWYodyE9PW51bGwpe3cucmV0dXJuPXMucmV0dXJuLHE9dzticmVhayBlfXE9cy5yZXR1cm59fWlmKGtlPW8sQm8oKSxtciYmdHlwZW9mIG1yLm9uUG9zdENvbW1pdEZpYmVyUm9vdD09ImZ1bmN0aW9uIil0cnl7bXIub25Qb3N0Q29tbWl0RmliZXJSb290KEtjLGUpfWNhdGNoe31yPSEwfXJldHVybiByfWZpbmFsbHl7T2U9bixGbi50cmFuc2l0aW9uPXR9fXJldHVybiExfWZ1bmN0aW9uIG55KGUsdCxuKXt0PUNsKG4sdCksdD1XeChlLHQsMSksZT1FbyhlLHQsMSksdD1vbigpLGUhPT1udWxsJiYoUmEoZSwxLHQpLHBuKGUsdCkpfWZ1bmN0aW9uIHJ0KGUsdCxuKXtpZihlLnRhZz09PTMpbnkoZSxlLG4pO2Vsc2UgZm9yKDt0IT09bnVsbDspe2lmKHQudGFnPT09Myl7bnkodCxlLG4pO2JyZWFrfWVsc2UgaWYodC50YWc9PT0xKXt2YXIgcj10LnN0YXRlTm9kZTtpZih0eXBlb2YgdC50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj09ImZ1bmN0aW9uInx8dHlwZW9mIHIuY29tcG9uZW50RGlkQ2F0Y2g9PSJmdW5jdGlvbiImJihDbz09PW51bGx8fCFDby5oYXMocikpKXtlPUNsKG4sZSksZT1VeCh0LGUsMSksdD1Fbyh0LGUsMSksZT1vbigpLHQhPT1udWxsJiYoUmEodCwxLGUpLHBuKHQsZSkpO2JyZWFrfX10PXQucmV0dXJufX1mdW5jdGlvbiBHayhlLHQsbil7dmFyIHI9ZS5waW5nQ2FjaGU7ciE9PW51bGwmJnIuZGVsZXRlKHQpLHQ9b24oKSxlLnBpbmdlZExhbmVzfD1lLnN1c3BlbmRlZExhbmVzJm4sUnQ9PT1lJiYoRHQmbik9PT1uJiYod3Q9PT00fHx3dD09PTMmJihEdCYxMzAwMjM0MjQpPT09RHQmJjUwMD5jdCgpLUVnP3JpKGUsMCk6U2d8PW4pLHBuKGUsdCl9ZnVuY3Rpb24gdXcoZSx0KXt0PT09MCYmKGUubW9kZSYxPyh0PWV1LGV1PDw9MSwhKGV1JjEzMDAyMzQyNCkmJihldT00MTk0MzA0KSk6dD0xKTt2YXIgbj1vbigpO2U9QnIoZSx0KSxlIT09bnVsbCYmKFJhKGUsdCxuKSxwbihlLG4pKX1mdW5jdGlvbiBZayhlKXt2YXIgdD1lLm1lbW9pemVkU3RhdGUsbj0wO3QhPT1udWxsJiYobj10LnJldHJ5TGFuZSksdXcoZSxuKX1mdW5jdGlvbiBYayhlLHQpe3ZhciBuPTA7c3dpdGNoKGUudGFnKXtjYXNlIDEzOnZhciByPWUuc3RhdGVOb2RlLG89ZS5tZW1vaXplZFN0YXRlO28hPT1udWxsJiYobj1vLnJldHJ5TGFuZSk7YnJlYWs7Y2FzZSAxOTpyPWUuc3RhdGVOb2RlO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoVSgzMTQpKX1yIT09bnVsbCYmci5kZWxldGUodCksdXcoZSxuKX12YXIgY3c7Y3c9ZnVuY3Rpb24oZSx0LG4pe2lmKGUhPT1udWxsKWlmKGUubWVtb2l6ZWRQcm9wcyE9PXQucGVuZGluZ1Byb3BzfHxmbi5jdXJyZW50KWRuPSEwO2Vsc2V7aWYoIShlLmxhbmVzJm4pJiYhKHQuZmxhZ3MmMTI4KSlyZXR1cm4gZG49ITEsRGsoZSx0LG4pO2RuPSEhKGUuZmxhZ3MmMTMxMDcyKX1lbHNlIGRuPSExLFllJiZ0LmZsYWdzJjEwNDg1NzYmJmh4KHQsaWMsdC5pbmRleCk7c3dpdGNoKHQubGFuZXM9MCx0LnRhZyl7Y2FzZSAyOnZhciByPXQudHlwZTtMdShlLHQpLGU9dC5wZW5kaW5nUHJvcHM7dmFyIG89d2wodCxYdC5jdXJyZW50KTtkbCh0LG4pLG89bWcobnVsbCx0LHIsZSxvLG4pO3ZhciBpPXZnKCk7cmV0dXJuIHQuZmxhZ3N8PTEsdHlwZW9mIG89PSJvYmplY3QiJiZvIT09bnVsbCYmdHlwZW9mIG8ucmVuZGVyPT0iZnVuY3Rpb24iJiZvLiQkdHlwZW9mPT09dm9pZCAwPyh0LnRhZz0xLHQubWVtb2l6ZWRTdGF0ZT1udWxsLHQudXBkYXRlUXVldWU9bnVsbCxobihyKT8oaT0hMCxyYyh0KSk6aT0hMSx0Lm1lbW9pemVkU3RhdGU9by5zdGF0ZSE9PW51bGwmJm8uc3RhdGUhPT12b2lkIDA/by5zdGF0ZTpudWxsLGRnKHQpLG8udXBkYXRlcj1aYyx0LnN0YXRlTm9kZT1vLG8uX3JlYWN0SW50ZXJuYWxzPXQsbWgodCxyLGUsbiksdD14aChudWxsLHQsciwhMCxpLG4pKToodC50YWc9MCxZZSYmaSYmb2codCksUXQobnVsbCx0LG8sbiksdD10LmNoaWxkKSx0O2Nhc2UgMTY6cj10LmVsZW1lbnRUeXBlO2U6e3N3aXRjaChMdShlLHQpLGU9dC5wZW5kaW5nUHJvcHMsbz1yLl9pbml0LHI9byhyLl9wYXlsb2FkKSx0LnR5cGU9cixvPXQudGFnPUprKHIpLGU9WG4ocixlKSxvKXtjYXNlIDA6dD15aChudWxsLHQscixlLG4pO2JyZWFrIGU7Y2FzZSAxOnQ9S3YobnVsbCx0LHIsZSxuKTticmVhayBlO2Nhc2UgMTE6dD1WdihudWxsLHQscixlLG4pO2JyZWFrIGU7Y2FzZSAxNDp0PUh2KG51bGwsdCxyLFhuKHIudHlwZSxlKSxuKTticmVhayBlfXRocm93IEVycm9yKFUoMzA2LHIsIiIpKX1yZXR1cm4gdDtjYXNlIDA6cmV0dXJuIHI9dC50eXBlLG89dC5wZW5kaW5nUHJvcHMsbz10LmVsZW1lbnRUeXBlPT09cj9vOlhuKHIsbykseWgoZSx0LHIsbyxuKTtjYXNlIDE6cmV0dXJuIHI9dC50eXBlLG89dC5wZW5kaW5nUHJvcHMsbz10LmVsZW1lbnRUeXBlPT09cj9vOlhuKHIsbyksS3YoZSx0LHIsbyxuKTtjYXNlIDM6ZTp7aWYoR3godCksZT09PW51bGwpdGhyb3cgRXJyb3IoVSgzODcpKTtyPXQucGVuZGluZ1Byb3BzLGk9dC5tZW1vaXplZFN0YXRlLG89aS5lbGVtZW50LHZ4KGUsdCksYWModCxyLG51bGwsbik7dmFyIGw9dC5tZW1vaXplZFN0YXRlO2lmKHI9bC5lbGVtZW50LGkuaXNEZWh5ZHJhdGVkKWlmKGk9e2VsZW1lbnQ6cixpc0RlaHlkcmF0ZWQ6ITEsY2FjaGU6bC5jYWNoZSxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOmwucGVuZGluZ1N1c3BlbnNlQm91bmRhcmllcyx0cmFuc2l0aW9uczpsLnRyYW5zaXRpb25zfSx0LnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1pLHQubWVtb2l6ZWRTdGF0ZT1pLHQuZmxhZ3MmMjU2KXtvPUNsKEVycm9yKFUoNDIzKSksdCksdD1HdihlLHQscixuLG8pO2JyZWFrIGV9ZWxzZSBpZihyIT09byl7bz1DbChFcnJvcihVKDQyNCkpLHQpLHQ9R3YoZSx0LHIsbixvKTticmVhayBlfWVsc2UgZm9yKF9uPVNvKHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8uZmlyc3RDaGlsZCksU249dCxZZT0hMCxabj1udWxsLG49X3godCxudWxsLHIsbiksdC5jaGlsZD1uO247KW4uZmxhZ3M9bi5mbGFncyYtM3w0MDk2LG49bi5zaWJsaW5nO2Vsc2V7aWYoX2woKSxyPT09byl7dD1XcihlLHQsbik7YnJlYWsgZX1RdChlLHQscixuKX10PXQuY2hpbGR9cmV0dXJuIHQ7Y2FzZSA1OnJldHVybiBTeCh0KSxlPT09bnVsbCYmaGgodCkscj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxpPWUhPT1udWxsP2UubWVtb2l6ZWRQcm9wczpudWxsLGw9by5jaGlsZHJlbixhaChyLG8pP2w9bnVsbDppIT09bnVsbCYmYWgocixpKSYmKHQuZmxhZ3N8PTMyKSxLeChlLHQpLFF0KGUsdCxsLG4pLHQuY2hpbGQ7Y2FzZSA2OnJldHVybiBlPT09bnVsbCYmaGgodCksbnVsbDtjYXNlIDEzOnJldHVybiBZeChlLHQsbik7Y2FzZSA0OnJldHVybiBmZyh0LHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLHI9dC5wZW5kaW5nUHJvcHMsZT09PW51bGw/dC5jaGlsZD1TbCh0LG51bGwscixuKTpRdChlLHQscixuKSx0LmNoaWxkO2Nhc2UgMTE6cmV0dXJuIHI9dC50eXBlLG89dC5wZW5kaW5nUHJvcHMsbz10LmVsZW1lbnRUeXBlPT09cj9vOlhuKHIsbyksVnYoZSx0LHIsbyxuKTtjYXNlIDc6cmV0dXJuIFF0KGUsdCx0LnBlbmRpbmdQcm9wcyxuKSx0LmNoaWxkO2Nhc2UgODpyZXR1cm4gUXQoZSx0LHQucGVuZGluZ1Byb3BzLmNoaWxkcmVuLG4pLHQuY2hpbGQ7Y2FzZSAxMjpyZXR1cm4gUXQoZSx0LHQucGVuZGluZ1Byb3BzLmNoaWxkcmVuLG4pLHQuY2hpbGQ7Y2FzZSAxMDplOntpZihyPXQudHlwZS5fY29udGV4dCxvPXQucGVuZGluZ1Byb3BzLGk9dC5tZW1vaXplZFByb3BzLGw9by52YWx1ZSxGZShsYyxyLl9jdXJyZW50VmFsdWUpLHIuX2N1cnJlbnRWYWx1ZT1sLGkhPT1udWxsKWlmKHJyKGkudmFsdWUsbCkpe2lmKGkuY2hpbGRyZW49PT1vLmNoaWxkcmVuJiYhZm4uY3VycmVudCl7dD1XcihlLHQsbik7YnJlYWsgZX19ZWxzZSBmb3IoaT10LmNoaWxkLGkhPT1udWxsJiYoaS5yZXR1cm49dCk7aSE9PW51bGw7KXt2YXIgcz1pLmRlcGVuZGVuY2llcztpZihzIT09bnVsbCl7bD1pLmNoaWxkO2Zvcih2YXIgYT1zLmZpcnN0Q29udGV4dDthIT09bnVsbDspe2lmKGEuY29udGV4dD09PXIpe2lmKGkudGFnPT09MSl7YT1qcigtMSxuJi1uKSxhLnRhZz0yO3ZhciB1PWkudXBkYXRlUXVldWU7aWYodSE9PW51bGwpe3U9dS5zaGFyZWQ7dmFyIGM9dS5wZW5kaW5nO2M9PT1udWxsP2EubmV4dD1hOihhLm5leHQ9Yy5uZXh0LGMubmV4dD1hKSx1LnBlbmRpbmc9YX19aS5sYW5lc3w9bixhPWkuYWx0ZXJuYXRlLGEhPT1udWxsJiYoYS5sYW5lc3w9bikscGgoaS5yZXR1cm4sbix0KSxzLmxhbmVzfD1uO2JyZWFrfWE9YS5uZXh0fX1lbHNlIGlmKGkudGFnPT09MTApbD1pLnR5cGU9PT10LnR5cGU/bnVsbDppLmNoaWxkO2Vsc2UgaWYoaS50YWc9PT0xOCl7aWYobD1pLnJldHVybixsPT09bnVsbCl0aHJvdyBFcnJvcihVKDM0MSkpO2wubGFuZXN8PW4scz1sLmFsdGVybmF0ZSxzIT09bnVsbCYmKHMubGFuZXN8PW4pLHBoKGwsbix0KSxsPWkuc2libGluZ31lbHNlIGw9aS5jaGlsZDtpZihsIT09bnVsbClsLnJldHVybj1pO2Vsc2UgZm9yKGw9aTtsIT09bnVsbDspe2lmKGw9PT10KXtsPW51bGw7YnJlYWt9aWYoaT1sLnNpYmxpbmcsaSE9PW51bGwpe2kucmV0dXJuPWwucmV0dXJuLGw9aTticmVha31sPWwucmV0dXJufWk9bH1RdChlLHQsby5jaGlsZHJlbixuKSx0PXQuY2hpbGR9cmV0dXJuIHQ7Y2FzZSA5OnJldHVybiBvPXQudHlwZSxyPXQucGVuZGluZ1Byb3BzLmNoaWxkcmVuLGRsKHQsbiksbz1CbihvKSxyPXIobyksdC5mbGFnc3w9MSxRdChlLHQscixuKSx0LmNoaWxkO2Nhc2UgMTQ6cmV0dXJuIHI9dC50eXBlLG89WG4ocix0LnBlbmRpbmdQcm9wcyksbz1YbihyLnR5cGUsbyksSHYoZSx0LHIsbyxuKTtjYXNlIDE1OnJldHVybiBWeChlLHQsdC50eXBlLHQucGVuZGluZ1Byb3BzLG4pO2Nhc2UgMTc6cmV0dXJuIHI9dC50eXBlLG89dC5wZW5kaW5nUHJvcHMsbz10LmVsZW1lbnRUeXBlPT09cj9vOlhuKHIsbyksTHUoZSx0KSx0LnRhZz0xLGhuKHIpPyhlPSEwLHJjKHQpKTplPSExLGRsKHQsbikseHgodCxyLG8pLG1oKHQscixvLG4pLHhoKG51bGwsdCxyLCEwLGUsbik7Y2FzZSAxOTpyZXR1cm4gWHgoZSx0LG4pO2Nhc2UgMjI6cmV0dXJuIEh4KGUsdCxuKX10aHJvdyBFcnJvcihVKDE1Nix0LnRhZykpfTtmdW5jdGlvbiBkdyhlLHQpe3JldHVybiBJMShlLHQpfWZ1bmN0aW9uIFFrKGUsdCxuLHIpe3RoaXMudGFnPWUsdGhpcy5rZXk9bix0aGlzLnNpYmxpbmc9dGhpcy5jaGlsZD10aGlzLnJldHVybj10aGlzLnN0YXRlTm9kZT10aGlzLnR5cGU9dGhpcy5lbGVtZW50VHlwZT1udWxsLHRoaXMuaW5kZXg9MCx0aGlzLnJlZj1udWxsLHRoaXMucGVuZGluZ1Byb3BzPXQsdGhpcy5kZXBlbmRlbmNpZXM9dGhpcy5tZW1vaXplZFN0YXRlPXRoaXMudXBkYXRlUXVldWU9dGhpcy5tZW1vaXplZFByb3BzPW51bGwsdGhpcy5tb2RlPXIsdGhpcy5zdWJ0cmVlRmxhZ3M9dGhpcy5mbGFncz0wLHRoaXMuZGVsZXRpb25zPW51bGwsdGhpcy5jaGlsZExhbmVzPXRoaXMubGFuZXM9MCx0aGlzLmFsdGVybmF0ZT1udWxsfWZ1bmN0aW9uIGpuKGUsdCxuLHIpe3JldHVybiBuZXcgUWsoZSx0LG4scil9ZnVuY3Rpb24gVGcoZSl7cmV0dXJuIGU9ZS5wcm90b3R5cGUsISghZXx8IWUuaXNSZWFjdENvbXBvbmVudCl9ZnVuY3Rpb24gSmsoZSl7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIFRnKGUpPzE6MDtpZihlIT1udWxsKXtpZihlPWUuJCR0eXBlb2YsZT09PUtwKXJldHVybiAxMTtpZihlPT09R3ApcmV0dXJuIDE0fXJldHVybiAyfWZ1bmN0aW9uIGtvKGUsdCl7dmFyIG49ZS5hbHRlcm5hdGU7cmV0dXJuIG49PT1udWxsPyhuPWpuKGUudGFnLHQsZS5rZXksZS5tb2RlKSxuLmVsZW1lbnRUeXBlPWUuZWxlbWVudFR5cGUsbi50eXBlPWUudHlwZSxuLnN0YXRlTm9kZT1lLnN0YXRlTm9kZSxuLmFsdGVybmF0ZT1lLGUuYWx0ZXJuYXRlPW4pOihuLnBlbmRpbmdQcm9wcz10LG4udHlwZT1lLnR5cGUsbi5mbGFncz0wLG4uc3VidHJlZUZsYWdzPTAsbi5kZWxldGlvbnM9bnVsbCksbi5mbGFncz1lLmZsYWdzJjE0NjgwMDY0LG4uY2hpbGRMYW5lcz1lLmNoaWxkTGFuZXMsbi5sYW5lcz1lLmxhbmVzLG4uY2hpbGQ9ZS5jaGlsZCxuLm1lbW9pemVkUHJvcHM9ZS5tZW1vaXplZFByb3BzLG4ubWVtb2l6ZWRTdGF0ZT1lLm1lbW9pemVkU3RhdGUsbi51cGRhdGVRdWV1ZT1lLnVwZGF0ZVF1ZXVlLHQ9ZS5kZXBlbmRlbmNpZXMsbi5kZXBlbmRlbmNpZXM9dD09PW51bGw/bnVsbDp7bGFuZXM6dC5sYW5lcyxmaXJzdENvbnRleHQ6dC5maXJzdENvbnRleHR9LG4uc2libGluZz1lLnNpYmxpbmcsbi5pbmRleD1lLmluZGV4LG4ucmVmPWUucmVmLG59ZnVuY3Rpb24ganUoZSx0LG4scixvLGkpe3ZhciBsPTI7aWYocj1lLHR5cGVvZiBlPT0iZnVuY3Rpb24iKVRnKGUpJiYobD0xKTtlbHNlIGlmKHR5cGVvZiBlPT0ic3RyaW5nIilsPTU7ZWxzZSBlOnN3aXRjaChlKXtjYXNlIEtpOnJldHVybiBvaShuLmNoaWxkcmVuLG8saSx0KTtjYXNlIEhwOmw9OCxvfD04O2JyZWFrO2Nhc2UgRmY6cmV0dXJuIGU9am4oMTIsbix0LG98MiksZS5lbGVtZW50VHlwZT1GZixlLmxhbmVzPWksZTtjYXNlIEJmOnJldHVybiBlPWpuKDEzLG4sdCxvKSxlLmVsZW1lbnRUeXBlPUJmLGUubGFuZXM9aSxlO2Nhc2UgV2Y6cmV0dXJuIGU9am4oMTksbix0LG8pLGUuZWxlbWVudFR5cGU9V2YsZS5sYW5lcz1pLGU7Y2FzZSB3MTpyZXR1cm4gbmQobixvLGksdCk7ZGVmYXVsdDppZih0eXBlb2YgZT09Im9iamVjdCImJmUhPT1udWxsKXN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIHkxOmw9MTA7YnJlYWsgZTtjYXNlIHgxOmw9OTticmVhayBlO2Nhc2UgS3A6bD0xMTticmVhayBlO2Nhc2UgR3A6bD0xNDticmVhayBlO2Nhc2UgYW86bD0xNixyPW51bGw7YnJlYWsgZX10aHJvdyBFcnJvcihVKDEzMCxlPT1udWxsP2U6dHlwZW9mIGUsIiIpKX1yZXR1cm4gdD1qbihsLG4sdCxvKSx0LmVsZW1lbnRUeXBlPWUsdC50eXBlPXIsdC5sYW5lcz1pLHR9ZnVuY3Rpb24gb2koZSx0LG4scil7cmV0dXJuIGU9am4oNyxlLHIsdCksZS5sYW5lcz1uLGV9ZnVuY3Rpb24gbmQoZSx0LG4scil7cmV0dXJuIGU9am4oMjIsZSxyLHQpLGUuZWxlbWVudFR5cGU9dzEsZS5sYW5lcz1uLGUuc3RhdGVOb2RlPXtpc0hpZGRlbjohMX0sZX1mdW5jdGlvbiBwZihlLHQsbil7cmV0dXJuIGU9am4oNixlLG51bGwsdCksZS5sYW5lcz1uLGV9ZnVuY3Rpb24gZ2YoZSx0LG4pe3JldHVybiB0PWpuKDQsZS5jaGlsZHJlbiE9PW51bGw/ZS5jaGlsZHJlbjpbXSxlLmtleSx0KSx0LmxhbmVzPW4sdC5zdGF0ZU5vZGU9e2NvbnRhaW5lckluZm86ZS5jb250YWluZXJJbmZvLHBlbmRpbmdDaGlsZHJlbjpudWxsLGltcGxlbWVudGF0aW9uOmUuaW1wbGVtZW50YXRpb259LHR9ZnVuY3Rpb24gWmsoZSx0LG4scixvKXt0aGlzLnRhZz10LHRoaXMuY29udGFpbmVySW5mbz1lLHRoaXMuZmluaXNoZWRXb3JrPXRoaXMucGluZ0NhY2hlPXRoaXMuY3VycmVudD10aGlzLnBlbmRpbmdDaGlsZHJlbj1udWxsLHRoaXMudGltZW91dEhhbmRsZT0tMSx0aGlzLmNhbGxiYWNrTm9kZT10aGlzLnBlbmRpbmdDb250ZXh0PXRoaXMuY29udGV4dD1udWxsLHRoaXMuY2FsbGJhY2tQcmlvcml0eT0wLHRoaXMuZXZlbnRUaW1lcz1ZZCgwKSx0aGlzLmV4cGlyYXRpb25UaW1lcz1ZZCgtMSksdGhpcy5lbnRhbmdsZWRMYW5lcz10aGlzLmZpbmlzaGVkTGFuZXM9dGhpcy5tdXRhYmxlUmVhZExhbmVzPXRoaXMuZXhwaXJlZExhbmVzPXRoaXMucGluZ2VkTGFuZXM9dGhpcy5zdXNwZW5kZWRMYW5lcz10aGlzLnBlbmRpbmdMYW5lcz0wLHRoaXMuZW50YW5nbGVtZW50cz1ZZCgwKSx0aGlzLmlkZW50aWZpZXJQcmVmaXg9cix0aGlzLm9uUmVjb3ZlcmFibGVFcnJvcj1vLHRoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1udWxsfWZ1bmN0aW9uIGJnKGUsdCxuLHIsbyxpLGwscyxhKXtyZXR1cm4gZT1uZXcgWmsoZSx0LG4scyxhKSx0PT09MT8odD0xLGk9PT0hMCYmKHR8PTgpKTp0PTAsaT1qbigzLG51bGwsbnVsbCx0KSxlLmN1cnJlbnQ9aSxpLnN0YXRlTm9kZT1lLGkubWVtb2l6ZWRTdGF0ZT17ZWxlbWVudDpyLGlzRGVoeWRyYXRlZDpuLGNhY2hlOm51bGwsdHJhbnNpdGlvbnM6bnVsbCxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOm51bGx9LGRnKGkpLGV9ZnVuY3Rpb24gcWsoZSx0LG4pe3ZhciByPTM8YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTpudWxsO3JldHVybnskJHR5cGVvZjpIaSxrZXk6cj09bnVsbD9udWxsOiIiK3IsY2hpbGRyZW46ZSxjb250YWluZXJJbmZvOnQsaW1wbGVtZW50YXRpb246bn19ZnVuY3Rpb24gZncoZSl7aWYoIWUpcmV0dXJuIFJvO2U9ZS5fcmVhY3RJbnRlcm5hbHM7ZTp7aWYoU2koZSkhPT1lfHxlLnRhZyE9PTEpdGhyb3cgRXJyb3IoVSgxNzApKTt2YXIgdD1lO2Rve3N3aXRjaCh0LnRhZyl7Y2FzZSAzOnQ9dC5zdGF0ZU5vZGUuY29udGV4dDticmVhayBlO2Nhc2UgMTppZihobih0LnR5cGUpKXt0PXQuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O2JyZWFrIGV9fXQ9dC5yZXR1cm59d2hpbGUodCE9PW51bGwpO3Rocm93IEVycm9yKFUoMTcxKSl9aWYoZS50YWc9PT0xKXt2YXIgbj1lLnR5cGU7aWYoaG4obikpcmV0dXJuIGR4KGUsbix0KX1yZXR1cm4gdH1mdW5jdGlvbiBodyhlLHQsbixyLG8saSxsLHMsYSl7cmV0dXJuIGU9YmcobixyLCEwLGUsbyxpLGwscyxhKSxlLmNvbnRleHQ9ZncobnVsbCksbj1lLmN1cnJlbnQscj1vbigpLG89JG8obiksaT1qcihyLG8pLGkuY2FsbGJhY2s9dD8/bnVsbCxFbyhuLGksbyksZS5jdXJyZW50LmxhbmVzPW8sUmEoZSxvLHIpLHBuKGUsciksZX1mdW5jdGlvbiByZChlLHQsbixyKXt2YXIgbz10LmN1cnJlbnQsaT1vbigpLGw9JG8obyk7cmV0dXJuIG49ZncobiksdC5jb250ZXh0PT09bnVsbD90LmNvbnRleHQ9bjp0LnBlbmRpbmdDb250ZXh0PW4sdD1qcihpLGwpLHQucGF5bG9hZD17ZWxlbWVudDplfSxyPXI9PT12b2lkIDA/bnVsbDpyLHIhPT1udWxsJiYodC5jYWxsYmFjaz1yKSxlPUVvKG8sdCxsKSxlIT09bnVsbCYmKG5yKGUsbyxsLGkpLE91KGUsbyxsKSksbH1mdW5jdGlvbiBtYyhlKXtpZihlPWUuY3VycmVudCwhZS5jaGlsZClyZXR1cm4gbnVsbDtzd2l0Y2goZS5jaGlsZC50YWcpe2Nhc2UgNTpyZXR1cm4gZS5jaGlsZC5zdGF0ZU5vZGU7ZGVmYXVsdDpyZXR1cm4gZS5jaGlsZC5zdGF0ZU5vZGV9fWZ1bmN0aW9uIHJ5KGUsdCl7aWYoZT1lLm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJmUuZGVoeWRyYXRlZCE9PW51bGwpe3ZhciBuPWUucmV0cnlMYW5lO2UucmV0cnlMYW5lPW4hPT0wJiZuPHQ/bjp0fX1mdW5jdGlvbiBOZyhlLHQpe3J5KGUsdCksKGU9ZS5hbHRlcm5hdGUpJiZyeShlLHQpfWZ1bmN0aW9uIGVUKCl7cmV0dXJuIG51bGx9dmFyIHB3PXR5cGVvZiByZXBvcnRFcnJvcj09ImZ1bmN0aW9uIj9yZXBvcnRFcnJvcjpmdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKGUpfTtmdW5jdGlvbiBSZyhlKXt0aGlzLl9pbnRlcm5hbFJvb3Q9ZX1vZC5wcm90b3R5cGUucmVuZGVyPVJnLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5faW50ZXJuYWxSb290O2lmKHQ9PT1udWxsKXRocm93IEVycm9yKFUoNDA5KSk7cmQoZSx0LG51bGwsbnVsbCl9O29kLnByb3RvdHlwZS51bm1vdW50PVJnLnByb3RvdHlwZS51bm1vdW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5faW50ZXJuYWxSb290O2lmKGUhPT1udWxsKXt0aGlzLl9pbnRlcm5hbFJvb3Q9bnVsbDt2YXIgdD1lLmNvbnRhaW5lckluZm87aGkoZnVuY3Rpb24oKXtyZChudWxsLGUsbnVsbCxudWxsKX0pLHRbRnJdPW51bGx9fTtmdW5jdGlvbiBvZChlKXt0aGlzLl9pbnRlcm5hbFJvb3Q9ZX1vZC5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb249ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9VjEoKTtlPXtibG9ja2VkT246bnVsbCx0YXJnZXQ6ZSxwcmlvcml0eTp0fTtmb3IodmFyIG49MDtuPGZvLmxlbmd0aCYmdCE9PTAmJnQ8Zm9bbl0ucHJpb3JpdHk7bisrKTtmby5zcGxpY2UobiwwLGUpLG49PT0wJiZLMShlKX19O2Z1bmN0aW9uIFBnKGUpe3JldHVybiEoIWV8fGUubm9kZVR5cGUhPT0xJiZlLm5vZGVUeXBlIT09OSYmZS5ub2RlVHlwZSE9PTExKX1mdW5jdGlvbiBpZChlKXtyZXR1cm4hKCFlfHxlLm5vZGVUeXBlIT09MSYmZS5ub2RlVHlwZSE9PTkmJmUubm9kZVR5cGUhPT0xMSYmKGUubm9kZVR5cGUhPT04fHxlLm5vZGVWYWx1ZSE9PSIgcmVhY3QtbW91bnQtcG9pbnQtdW5zdGFibGUgIikpfWZ1bmN0aW9uIG95KCl7fWZ1bmN0aW9uIHRUKGUsdCxuLHIsbyl7aWYobyl7aWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpe3ZhciBpPXI7cj1mdW5jdGlvbigpe3ZhciB1PW1jKGwpO2kuY2FsbCh1KX19dmFyIGw9aHcodCxyLGUsMCxudWxsLCExLCExLCIiLG95KTtyZXR1cm4gZS5fcmVhY3RSb290Q29udGFpbmVyPWwsZVtGcl09bC5jdXJyZW50LHJhKGUubm9kZVR5cGU9PT04P2UucGFyZW50Tm9kZTplKSxoaSgpLGx9Zm9yKDtvPWUubGFzdENoaWxkOyllLnJlbW92ZUNoaWxkKG8pO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgcz1yO3I9ZnVuY3Rpb24oKXt2YXIgdT1tYyhhKTtzLmNhbGwodSl9fXZhciBhPWJnKGUsMCwhMSxudWxsLG51bGwsITEsITEsIiIsb3kpO3JldHVybiBlLl9yZWFjdFJvb3RDb250YWluZXI9YSxlW0ZyXT1hLmN1cnJlbnQscmEoZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlOmUpLGhpKGZ1bmN0aW9uKCl7cmQodCxhLG4scil9KSxhfWZ1bmN0aW9uIGxkKGUsdCxuLHIsbyl7dmFyIGk9bi5fcmVhY3RSb290Q29udGFpbmVyO2lmKGkpe3ZhciBsPWk7aWYodHlwZW9mIG89PSJmdW5jdGlvbiIpe3ZhciBzPW87bz1mdW5jdGlvbigpe3ZhciBhPW1jKGwpO3MuY2FsbChhKX19cmQodCxsLGUsbyl9ZWxzZSBsPXRUKG4sdCxlLG8scik7cmV0dXJuIG1jKGwpfVcxPWZ1bmN0aW9uKGUpe3N3aXRjaChlLnRhZyl7Y2FzZSAzOnZhciB0PWUuc3RhdGVOb2RlO2lmKHQuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl7dmFyIG49d3ModC5wZW5kaW5nTGFuZXMpO24hPT0wJiYoUXAodCxufDEpLHBuKHQsY3QoKSksIShrZSY2KSYmKCRsPWN0KCkrNTAwLEJvKCkpKX1icmVhaztjYXNlIDEzOmhpKGZ1bmN0aW9uKCl7dmFyIHI9QnIoZSwxKTtpZihyIT09bnVsbCl7dmFyIG89b24oKTtucihyLGUsMSxvKX19KSxOZyhlLDEpfX07SnA9ZnVuY3Rpb24oZSl7aWYoZS50YWc9PT0xMyl7dmFyIHQ9QnIoZSwxMzQyMTc3MjgpO2lmKHQhPT1udWxsKXt2YXIgbj1vbigpO25yKHQsZSwxMzQyMTc3Mjgsbil9TmcoZSwxMzQyMTc3MjgpfX07VTE9ZnVuY3Rpb24oZSl7aWYoZS50YWc9PT0xMyl7dmFyIHQ9JG8oZSksbj1CcihlLHQpO2lmKG4hPT1udWxsKXt2YXIgcj1vbigpO25yKG4sZSx0LHIpfU5nKGUsdCl9fTtWMT1mdW5jdGlvbigpe3JldHVybiBPZX07SDE9ZnVuY3Rpb24oZSx0KXt2YXIgbj1PZTt0cnl7cmV0dXJuIE9lPWUsdCgpfWZpbmFsbHl7T2U9bn19O1pmPWZ1bmN0aW9uKGUsdCxuKXtzd2l0Y2godCl7Y2FzZSJpbnB1dCI6aWYoSGYoZSxuKSx0PW4ubmFtZSxuLnR5cGU9PT0icmFkaW8iJiZ0IT1udWxsKXtmb3Iobj1lO24ucGFyZW50Tm9kZTspbj1uLnBhcmVudE5vZGU7Zm9yKG49bi5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lPSIrSlNPTi5zdHJpbmdpZnkoIiIrdCkrJ11bdHlwZT0icmFkaW8iXScpLHQ9MDt0PG4ubGVuZ3RoO3QrKyl7dmFyIHI9blt0XTtpZihyIT09ZSYmci5mb3JtPT09ZS5mb3JtKXt2YXIgbz1RYyhyKTtpZighbyl0aHJvdyBFcnJvcihVKDkwKSk7UzEociksSGYocixvKX19fWJyZWFrO2Nhc2UidGV4dGFyZWEiOkMxKGUsbik7YnJlYWs7Y2FzZSJzZWxlY3QiOnQ9bi52YWx1ZSx0IT1udWxsJiZzbChlLCEhbi5tdWx0aXBsZSx0LCExKX19O1AxPUNnO08xPWhpO3ZhciBuVD17dXNpbmdDbGllbnRFbnRyeVBvaW50OiExLEV2ZW50czpbT2EsUWksUWMsTjEsUjEsQ2ddfSxjcz17ZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6Wm8sYnVuZGxlVHlwZTowLHZlcnNpb246IjE4LjIuMCIscmVuZGVyZXJQYWNrYWdlTmFtZToicmVhY3QtZG9tIn0sclQ9e2J1bmRsZVR5cGU6Y3MuYnVuZGxlVHlwZSx2ZXJzaW9uOmNzLnZlcnNpb24scmVuZGVyZXJQYWNrYWdlTmFtZTpjcy5yZW5kZXJlclBhY2thZ2VOYW1lLHJlbmRlcmVyQ29uZmlnOmNzLnJlbmRlcmVyQ29uZmlnLG92ZXJyaWRlSG9va1N0YXRlOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wczpudWxsLG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoOm51bGwsb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6bnVsbCxzZXRFcnJvckhhbmRsZXI6bnVsbCxzZXRTdXNwZW5zZUhhbmRsZXI6bnVsbCxzY2hlZHVsZVVwZGF0ZTpudWxsLGN1cnJlbnREaXNwYXRjaGVyUmVmOktyLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9TDEoZSksZT09PW51bGw/bnVsbDplLnN0YXRlTm9kZX0sZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6Y3MuZmluZEZpYmVyQnlIb3N0SW5zdGFuY2V8fGVULGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDpudWxsLHNjaGVkdWxlUmVmcmVzaDpudWxsLHNjaGVkdWxlUm9vdDpudWxsLHNldFJlZnJlc2hIYW5kbGVyOm51bGwsZ2V0Q3VycmVudEZpYmVyOm51bGwscmVjb25jaWxlclZlcnNpb246IjE4LjIuMC1uZXh0LTllM2I3NzJiOC0yMDIyMDYwOCJ9O2lmKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX188InUiKXt2YXIgZHU9X19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO2lmKCFkdS5pc0Rpc2FibGVkJiZkdS5zdXBwb3J0c0ZpYmVyKXRyeXtLYz1kdS5pbmplY3QoclQpLG1yPWR1fWNhdGNoe319Tm4uX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9blQ7Tm4uY3JlYXRlUG9ydGFsPWZ1bmN0aW9uKGUsdCl7dmFyIG49Mjxhcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOm51bGw7aWYoIVBnKHQpKXRocm93IEVycm9yKFUoMjAwKSk7cmV0dXJuIHFrKGUsdCxudWxsLG4pfTtObi5jcmVhdGVSb290PWZ1bmN0aW9uKGUsdCl7aWYoIVBnKGUpKXRocm93IEVycm9yKFUoMjk5KSk7dmFyIG49ITEscj0iIixvPXB3O3JldHVybiB0IT1udWxsJiYodC51bnN0YWJsZV9zdHJpY3RNb2RlPT09ITAmJihuPSEwKSx0LmlkZW50aWZpZXJQcmVmaXghPT12b2lkIDAmJihyPXQuaWRlbnRpZmllclByZWZpeCksdC5vblJlY292ZXJhYmxlRXJyb3IhPT12b2lkIDAmJihvPXQub25SZWNvdmVyYWJsZUVycm9yKSksdD1iZyhlLDEsITEsbnVsbCxudWxsLG4sITEscixvKSxlW0ZyXT10LmN1cnJlbnQscmEoZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlOmUpLG5ldyBSZyh0KX07Tm4uZmluZERPTU5vZGU9ZnVuY3Rpb24oZSl7aWYoZT09bnVsbClyZXR1cm4gbnVsbDtpZihlLm5vZGVUeXBlPT09MSlyZXR1cm4gZTt2YXIgdD1lLl9yZWFjdEludGVybmFscztpZih0PT09dm9pZCAwKXRocm93IHR5cGVvZiBlLnJlbmRlcj09ImZ1bmN0aW9uIj9FcnJvcihVKDE4OCkpOihlPU9iamVjdC5rZXlzKGUpLmpvaW4oIiwiKSxFcnJvcihVKDI2OCxlKSkpO3JldHVybiBlPUwxKHQpLGU9ZT09PW51bGw/bnVsbDplLnN0YXRlTm9kZSxlfTtObi5mbHVzaFN5bmM9ZnVuY3Rpb24oZSl7cmV0dXJuIGhpKGUpfTtObi5oeWRyYXRlPWZ1bmN0aW9uKGUsdCxuKXtpZighaWQodCkpdGhyb3cgRXJyb3IoVSgyMDApKTtyZXR1cm4gbGQobnVsbCxlLHQsITAsbil9O05uLmh5ZHJhdGVSb290PWZ1bmN0aW9uKGUsdCxuKXtpZighUGcoZSkpdGhyb3cgRXJyb3IoVSg0MDUpKTt2YXIgcj1uIT1udWxsJiZuLmh5ZHJhdGVkU291cmNlc3x8bnVsbCxvPSExLGk9IiIsbD1wdztpZihuIT1udWxsJiYobi51bnN0YWJsZV9zdHJpY3RNb2RlPT09ITAmJihvPSEwKSxuLmlkZW50aWZpZXJQcmVmaXghPT12b2lkIDAmJihpPW4uaWRlbnRpZmllclByZWZpeCksbi5vblJlY292ZXJhYmxlRXJyb3IhPT12b2lkIDAmJihsPW4ub25SZWNvdmVyYWJsZUVycm9yKSksdD1odyh0LG51bGwsZSwxLG4/P251bGwsbywhMSxpLGwpLGVbRnJdPXQuY3VycmVudCxyYShlKSxyKWZvcihlPTA7ZTxyLmxlbmd0aDtlKyspbj1yW2VdLG89bi5fZ2V0VmVyc2lvbixvPW8obi5fc291cmNlKSx0Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9PW51bGw/dC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPVtuLG9dOnQubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKG4sbyk7cmV0dXJuIG5ldyBvZCh0KX07Tm4ucmVuZGVyPWZ1bmN0aW9uKGUsdCxuKXtpZighaWQodCkpdGhyb3cgRXJyb3IoVSgyMDApKTtyZXR1cm4gbGQobnVsbCxlLHQsITEsbil9O05uLnVubW91bnRDb21wb25lbnRBdE5vZGU9ZnVuY3Rpb24oZSl7aWYoIWlkKGUpKXRocm93IEVycm9yKFUoNDApKTtyZXR1cm4gZS5fcmVhY3RSb290Q29udGFpbmVyPyhoaShmdW5jdGlvbigpe2xkKG51bGwsbnVsbCxlLCExLGZ1bmN0aW9uKCl7ZS5fcmVhY3RSb290Q29udGFpbmVyPW51bGwsZVtGcl09bnVsbH0pfSksITApOiExfTtObi51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcz1DZztObi51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcj1mdW5jdGlvbihlLHQsbixyKXtpZighaWQobikpdGhyb3cgRXJyb3IoVSgyMDApKTtpZihlPT1udWxsfHxlLl9yZWFjdEludGVybmFscz09PXZvaWQgMCl0aHJvdyBFcnJvcihVKDM4KSk7cmV0dXJuIGxkKGUsdCxuLCExLHIpfTtObi52ZXJzaW9uPSIxOC4yLjAtbmV4dC05ZTNiNzcyYjgtMjAyMjA2MDgiO2Z1bmN0aW9uIGd3KCl7aWYoISh0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fPiJ1Inx8dHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSE9ImZ1bmN0aW9uIikpdHJ5e19fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShndyl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKX19Z3coKSxoMS5leHBvcnRzPU5uO3ZhciBHcj1oMS5leHBvcnRzO2NvbnN0IG9UPWJhKEdyKTt2YXIgaXk9R3I7amYuY3JlYXRlUm9vdD1peS5jcmVhdGVSb290LGpmLmh5ZHJhdGVSb290PWl5Lmh5ZHJhdGVSb290O3ZhciBtdz17ZXhwb3J0czp7fX0sc2Q9e307LyoqCiAqIEBsaWNlbnNlIFJlYWN0CiAqIHJlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzCiAqCiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKi92YXIgaVQ9cCxsVD1TeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iiksc1Q9U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSxhVD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHVUPWlULl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVELlJlYWN0Q3VycmVudE93bmVyLGNUPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07ZnVuY3Rpb24gdncoZSx0LG4pe3ZhciByLG89e30saT1udWxsLGw9bnVsbDtuIT09dm9pZCAwJiYoaT0iIituKSx0LmtleSE9PXZvaWQgMCYmKGk9IiIrdC5rZXkpLHQucmVmIT09dm9pZCAwJiYobD10LnJlZik7Zm9yKHIgaW4gdClhVC5jYWxsKHQscikmJiFjVC5oYXNPd25Qcm9wZXJ0eShyKSYmKG9bcl09dFtyXSk7aWYoZSYmZS5kZWZhdWx0UHJvcHMpZm9yKHIgaW4gdD1lLmRlZmF1bHRQcm9wcyx0KW9bcl09PT12b2lkIDAmJihvW3JdPXRbcl0pO3JldHVybnskJHR5cGVvZjpsVCx0eXBlOmUsa2V5OmkscmVmOmwscHJvcHM6byxfb3duZXI6dVQuY3VycmVudH19c2QuRnJhZ21lbnQ9c1Q7c2QuanN4PXZ3O3NkLmpzeHM9dnc7bXcuZXhwb3J0cz1zZDt2YXIgXz1tdy5leHBvcnRzO2Z1bmN0aW9uIFBoKGUsdCl7KHQ9PW51bGx8fHQ+ZS5sZW5ndGgpJiYodD1lLmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkodCk7bjx0O24rKylyW25dPWVbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gT2coZSx0KXtpZihlKXtpZih0eXBlb2YgZT09InN0cmluZyIpcmV0dXJuIFBoKGUsdCk7dmFyIG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsLTEpO2lmKG49PT0iT2JqZWN0IiYmZS5jb25zdHJ1Y3RvciYmKG49ZS5jb25zdHJ1Y3Rvci5uYW1lKSxuPT09Ik1hcCJ8fG49PT0iU2V0IilyZXR1cm4gQXJyYXkuZnJvbShlKTtpZihuPT09IkFyZ3VtZW50cyJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKXJldHVybiBQaChlLHQpfX1mdW5jdGlvbiBBZyhlLHQpe3ZhciBuPXR5cGVvZiBTeW1ib2w8InUiJiZlW1N5bWJvbC5pdGVyYXRvcl18fGVbIkBAaXRlcmF0b3IiXTtpZighbil7aWYoQXJyYXkuaXNBcnJheShlKXx8KG49T2coZSkpfHx0JiZlJiZ0eXBlb2YgZS5sZW5ndGg9PSJudW1iZXIiKXtuJiYoZT1uKTt2YXIgcj0wLG89ZnVuY3Rpb24oKXt9O3JldHVybntzOm8sbjpmdW5jdGlvbigpe3JldHVybiByPj1lLmxlbmd0aD97ZG9uZTohMH06e2RvbmU6ITEsdmFsdWU6ZVtyKytdfX0sZTpmdW5jdGlvbihhKXt0aHJvdyBhfSxmOm99fXRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfXZhciBpPSEwLGw9ITEscztyZXR1cm57czpmdW5jdGlvbigpe249bi5jYWxsKGUpfSxuOmZ1bmN0aW9uKCl7dmFyIGE9bi5uZXh0KCk7cmV0dXJuIGk9YS5kb25lLGF9LGU6ZnVuY3Rpb24oYSl7bD0hMCxzPWF9LGY6ZnVuY3Rpb24oKXt0cnl7IWkmJm4ucmV0dXJuIT1udWxsJiZuLnJldHVybigpfWZpbmFsbHl7aWYobCl0aHJvdyBzfX19fWZ1bmN0aW9uIHl3KGUpe3JldHVybiBlLmxlbmd0aD4wfXZhciBNYT1PYmplY3QuZnJlZXplKHtraW5kOiJvayIsdmFsdWU6dm9pZCAwfSk7ZnVuY3Rpb24gTGEoZSl7cmV0dXJuIGU9PT12b2lkIDA/TWE6e2tpbmQ6Im9rIix2YWx1ZTplfX1mdW5jdGlvbiBFaShlKXtyZXR1cm57a2luZDoiZXJyIixlcnJvcjplfX1mdW5jdGlvbiBqbChlKXtyZXR1cm4gZT09PU1hfHxlLmtpbmQ9PT0ib2sifWZ1bmN0aW9uIE1nKGUpe3JldHVybiBlIT09TWEmJmUua2luZD09PSJlcnIifWZ1bmN0aW9uIHh3KGUpe3ZhciB0PVtdLG49W10scj1BZyhlKSxvO3RyeXtmb3Ioci5zKCk7IShvPXIubigpKS5kb25lOyl7dmFyIGk9by52YWx1ZTtqbChpKT90LnB1c2goaS52YWx1ZSk6bi5wdXNoKGkuZXJyb3IpfX1jYXRjaChsKXtyLmUobCl9ZmluYWxseXtyLmYoKX1yZXR1cm4geXcobik/RWkobik6TGEodCl9ZnVuY3Rpb24gZFQoZSl7cmV0dXJuIHh3KGUpfWZ1bmN0aW9uIGZUKGUpe3ZhciB0PVtdLG49QWcoZSkscjt0cnl7Zm9yKG4ucygpOyEocj1uLm4oKSkuZG9uZTspe3ZhciBvPXIudmFsdWU7TWcobykmJnQucHVzaChvLmVycm9yKX19Y2F0Y2goaSl7bi5lKGkpfWZpbmFsbHl7bi5mKCl9cmV0dXJuIHl3KHQpP0VpKHQpOk1hfWZ1bmN0aW9uIGhUKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2Zvcih2YXIgcj1MYSh0KSxvPTA7bzxuLmxlbmd0aCYmamwocik7KytvKXI9ZShyLnZhbHVlLG5bb10sbyk7cmV0dXJuIHJ9fWZ1bmN0aW9uIHBUKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gamwodCk/TGEoZSh0LnZhbHVlKSk6dH19ZnVuY3Rpb24gZ1QoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBqbCh0KT9lKHQudmFsdWUpOnR9fWZ1bmN0aW9uIG1UKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gTWcodCk/RWkoZSh0LmVycm9yKSk6dH19ZnVuY3Rpb24gdlQoZSx0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUobik/TGEobik6RWkodChuKSl9fXZhciB5VD1mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gamwocik/dChyLnZhbHVlKT9yOkVpKG4oci52YWx1ZSkpOnJ9fSxobD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCx2b2lkT2s6TWEsb2s6TGEsZXJyOkVpLGlzT2s6amwsaXNFcnI6TWcsYWxsVDp4dyxhbGw6ZFQsYWxsVjpmVCxmbGF0TWFwUmVkdWNlOmhULG1hcDpwVCxmbGF0TWFwOmdULG1hcEVycjptVCxmcm9tUHJlZGljYXRlOnZULGZpbHRlck9yRWxzZTp5VH0pO2Z1bmN0aW9uIHhUKGUsdCl7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbClyZXR1cm4gZTt2YXIgbj1lW1N5bWJvbC50b1ByaW1pdGl2ZV07aWYobiE9PXZvaWQgMCl7dmFyIHI9bi5jYWxsKGUsdHx8ImRlZmF1bHQiKTtpZih0eXBlb2YgciE9Im9iamVjdCIpcmV0dXJuIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4odD09PSJzdHJpbmciP1N0cmluZzpOdW1iZXIpKGUpfWZ1bmN0aW9uIHd3KGUpe3ZhciB0PXhUKGUsInN0cmluZyIpO3JldHVybiB0eXBlb2YgdD09InN5bWJvbCI/dDpTdHJpbmcodCl9ZnVuY3Rpb24geXQoZSx0LG4pe3JldHVybiB0PXd3KHQpLHQgaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1uLGV9ZnVuY3Rpb24gbHkoZSx0KXt2YXIgbj1PYmplY3Qua2V5cyhlKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO3QmJihyPXIuZmlsdGVyKGZ1bmN0aW9uKG8pe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsbykuZW51bWVyYWJsZX0pKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBrbChlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF0hPW51bGw/YXJndW1lbnRzW3RdOnt9O3QlMj9seShPYmplY3QobiksITApLmZvckVhY2goZnVuY3Rpb24ocil7eXQoZSxyLG5bcl0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6bHkoT2JqZWN0KG4pKS5mb3JFYWNoKGZ1bmN0aW9uKHIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHIpKX0pfXJldHVybiBlfWZ1bmN0aW9uIHdUKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIFBoKGUpfWZ1bmN0aW9uIF9UKGUpe2lmKHR5cGVvZiBTeW1ib2w8InUiJiZlW1N5bWJvbC5pdGVyYXRvcl0hPW51bGx8fGVbIkBAaXRlcmF0b3IiXSE9bnVsbClyZXR1cm4gQXJyYXkuZnJvbShlKX1mdW5jdGlvbiBTVCgpe3Rocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9ZnVuY3Rpb24gRVQoZSl7cmV0dXJuIHdUKGUpfHxfVChlKXx8T2coZSl8fFNUKCl9ZnVuY3Rpb24gZ2UoZSl7IkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjtyZXR1cm4gZ2U9dHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdHlwZW9mIFN5bWJvbC5pdGVyYXRvcj09InN5bWJvbCI/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmdHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9LGdlKGUpfWZ1bmN0aW9uIENUKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGV9ZnVuY3Rpb24gJFQoZSx0KXt2YXIgbj1lPT1udWxsP251bGw6dHlwZW9mIFN5bWJvbDwidSImJmVbU3ltYm9sLml0ZXJhdG9yXXx8ZVsiQEBpdGVyYXRvciJdO2lmKG4hPW51bGwpe3ZhciByLG8saSxsLHM9W10sYT0hMCx1PSExO3RyeXtpZihpPShuPW4uY2FsbChlKSkubmV4dCx0PT09MCl7aWYoT2JqZWN0KG4pIT09bilyZXR1cm47YT0hMX1lbHNlIGZvcig7IShhPShyPWkuY2FsbChuKSkuZG9uZSkmJihzLnB1c2goci52YWx1ZSkscy5sZW5ndGghPT10KTthPSEwKTt9Y2F0Y2goYyl7dT0hMCxvPWN9ZmluYWxseXt0cnl7aWYoIWEmJm4ucmV0dXJuIT1udWxsJiYobD1uLnJldHVybigpLE9iamVjdChsKSE9PWwpKXJldHVybn1maW5hbGx5e2lmKHUpdGhyb3cgb319cmV0dXJuIHN9fWZ1bmN0aW9uIGtUKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uIGlpKGUsdCl7cmV0dXJuIENUKGUpfHwkVChlLHQpfHxPZyhlLHQpfHxrVCgpfWZ1bmN0aW9uIFNyKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gc3koZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHd3KHIua2V5KSxyKX19ZnVuY3Rpb24gRXIoZSx0LG4pe3JldHVybiB0JiZzeShlLnByb3RvdHlwZSx0KSxuJiZzeShlLG4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLGV9ZnVuY3Rpb24gT2goZSx0KXtyZXR1cm4gT2g9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24ocixvKXtyZXR1cm4gci5fX3Byb3RvX189byxyfSxPaChlLHQpfWZ1bmN0aW9uIENpKGUsdCl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiImJnQhPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLHQmJk9oKGUsdCl9ZnVuY3Rpb24gdmMoZSl7cmV0dXJuIHZjPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKG4pe3JldHVybiBuLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pfSx2YyhlKX1mdW5jdGlvbiBUVCgpe2lmKHR5cGVvZiBSZWZsZWN0PiJ1Inx8IVJlZmxlY3QuY29uc3RydWN0fHxSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKHR5cGVvZiBQcm94eT09ImZ1bmN0aW9uIilyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChCb29sZWFuLFtdLGZ1bmN0aW9uKCl7fSkpLCEwfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBfdyhlKXtpZihlPT09dm9pZCAwKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIGV9ZnVuY3Rpb24gYlQoZSx0KXtpZih0JiYodHlwZW9mIHQ9PSJvYmplY3QifHx0eXBlb2YgdD09ImZ1bmN0aW9uIikpcmV0dXJuIHQ7aWYodCE9PXZvaWQgMCl0aHJvdyBuZXcgVHlwZUVycm9yKCJEZXJpdmVkIGNvbnN0cnVjdG9ycyBtYXkgb25seSByZXR1cm4gb2JqZWN0IG9yIHVuZGVmaW5lZCIpO3JldHVybiBfdyhlKX1mdW5jdGlvbiAkaShlKXt2YXIgdD1UVCgpO3JldHVybiBmdW5jdGlvbigpe3ZhciByPXZjKGUpLG87aWYodCl7dmFyIGk9dmModGhpcykuY29uc3RydWN0b3I7bz1SZWZsZWN0LmNvbnN0cnVjdChyLGFyZ3VtZW50cyxpKX1lbHNlIG89ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGJUKHRoaXMsbyl9fXZhciBraT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtTcih0aGlzLGUpfXJldHVybiBFcihlLFt7a2V5OiJhcHBlbmRWYWxpZGF0aW9uRXJyb3IiLHZhbHVlOmZ1bmN0aW9uKG4scixvLGkpe3JldHVybiBuPyhuW3JdP25bcl0ucHVzaCh7bWVzc2FnZTpvLHZhbHVlOml9KTpuW3JdPVt7bWVzc2FnZTpvLHZhbHVlOml9XSxuKTp5dCh7fSxyLFt7bWVzc2FnZTpvLHZhbHVlOml9XSl9fV0pLGV9KCksenU9U3ltYm9sKCJHZXRTY2hlbWEiKSx0bj1TeW1ib2woIlBhdGgiKSx4dD1TeW1ib2woIkdldFNvdXJjZSIpO2Z1bmN0aW9uIE5UKGUpe3JldHVybiBlW3p1XX12YXIgTGc9RXIoZnVuY3Rpb24gZSh0KXtTcih0aGlzLGUpLHRoaXMuc3Bhbj10fSksUlQ9ZnVuY3Rpb24oZSl7Q2kobixlKTt2YXIgdD0kaShuKTtmdW5jdGlvbiBuKHIsbyl7dmFyIGk7cmV0dXJuIFNyKHRoaXMsbiksaT10LmNhbGwodGhpcyxvKSx5dChfdyhpKSwidHlwZSIsIlN5bSIpLGkudmFsdWU9cixpfXJldHVybiBFcihuLFt7a2V5OiJ0cmFuc3BpbGUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWV9fV0pLG59KExnKTtuZXcgUlQoIigpIik7dmFyIFl0PSJfdHlwZSIsZ249Il9yZWYiLFBUPWZ1bmN0aW9uKGUpe0NpKG4sZSk7dmFyIHQ9JGkobik7ZnVuY3Rpb24gbihyKXt2YXIgbyxpPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gU3IodGhpcyxuKSxvPXQuY2FsbCh0aGlzKSxvLm9wdGlvbnM9cixvLm9wdD1pLG99cmV0dXJuIEVyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihvLGkpe3JldHVybiB0aGlzLm9wdCYmaT09bnVsbD8hMTppPT1udWxsP3l0KHt9LG8sW3ttZXNzYWdlOiJOb24tb3B0aW9uYWwgaW1hZ2Ugd2FzIG51bGwgb3IgdW5kZWZpbmVkLiIsdmFsdWU6aX1dKTp0eXBlb2YgaVtnbl0hPSJzdHJpbmciP3l0KHt9LG8sW3ttZXNzYWdlOiJJbWFnZSBkaWQgbm90IGhhdmUgYSBmaWxlIHJlZmVyZW5jZSBzdHJpbmcuIEdvdDogIi5jb25jYXQoZ2UoaVtnbl0pKSx2YWx1ZTppfV0pOmlbWXRdIT09ImZpbGUiP3l0KHt9LG8sW3ttZXNzYWdlOiJJbWFnZSBkaWQgbm90IGhhdmUgdGhlIHZhbGlkIGZpbGUgZXh0ZW5zaW9uIHR5cGUuIEdvdDogIi5jb25jYXQoaVtZdF0pLHZhbHVlOml9XSk6aS5tZXRhZGF0YT95dCh7fSxvLFt7bWVzc2FnZToiRm91bmQgbWV0YWRhdGEsIGJ1dCBpdCBjb3VsZCBub3QgYmUgdmFsaWRhdGVkLiBJbWFnZSBtZXRhZGF0YSBtdXN0IGJlIGFuIG9iamVjdCB3aXRoIHRoZSByZXF1aXJlZCBwcm9wczogd2lkdGggKHBvc2l0aXZlIG51bWJlciksIGhlaWdodCAocG9zaXRpdmUgbnVtYmVyKSBhbmQgc2hhMjU2IChzdHJpbmcgb2YgbGVuZ3RoIDY0IG9mIHRoZSBiYXNlMTYgaGFzaCkuIix2YWx1ZTppLGZpeGVzOlsiaW1hZ2U6cmVwbGFjZS1tZXRhZGF0YSJdfV0pOnl0KHt9LG8sW3ttZXNzYWdlOiJDb3VsZCBub3QgdmFsaWRhdGUgSW1hZ2UgbWV0YWRhdGEuIix2YWx1ZTppLGZpeGVzOlsiaW1hZ2U6YWRkLW1ldGFkYXRhIl19XSl9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKG8pe3JldHVybiB0aGlzLm9wdCYmbz09bnVsbD8hMDoobz09bnVsbD92b2lkIDA6b1tnbl0pPT09ImltYWdlIiYmKG89PW51bGw/dm9pZCAwOm9bWXRdKT09PSJmaWxlIn19LHtrZXk6Im9wdGlvbmFsIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLm9wdGlvbnMsITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJpbWFnZSIsb3B0aW9uczp0aGlzLm9wdGlvbnMsb3B0OnRoaXMub3B0fX19XSksbn0oa2kpLFN3PWZ1bmN0aW9uKHQpe3ZhciBuO2lmKCF0W2duXS5zdGFydHNXaXRoKCIvcHVibGljIikpe3ZhciByO3JldHVybnt1cmw6dFtnbl0rIj9zaGEyNTY9Ii5jb25jYXQoKHI9dC5tZXRhZGF0YSk9PT1udWxsfHxyPT09dm9pZCAwP3ZvaWQgMDpyLnNoYTI1NiksbWV0YWRhdGE6dC5tZXRhZGF0YX19cmV0dXJue3VybDp0W2duXS5zbGljZSg3KSsiP3NoYTI1Nj0iLmNvbmNhdCgobj10Lm1ldGFkYXRhKT09PW51bGx8fG49PT12b2lkIDA/dm9pZCAwOm4uc2hhMjU2KSxtZXRhZGF0YTp0Lm1ldGFkYXRhfX07ZnVuY3Rpb24gRXcoZSl7cmV0dXJuIGdlKGUpPT09Im9iamVjdCImJmUhPT1udWxsJiZlIT09dm9pZCAwJiYoInZhbCJpbiBlfHwidmFsUGF0aCJpbiBlKX1mdW5jdGlvbiBPVChlKXtyZXR1cm4gZ2UoZSk9PT0ib2JqZWN0IiYmZSE9PW51bGwmJmUhPT12b2lkIDAmJnRuIGluIGUmJiJ2YWwiaW4gZX1mdW5jdGlvbiBBVChlKXtyZXR1cm4gZVt0bl19ZnVuY3Rpb24gTVQoZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9ZnVuY3Rpb24gYXkoZSx0LG4pe3JldHVybiB0P0V0KGUoRXQodCxuKSkpOkV0KHQsbil9ZnVuY3Rpb24gVG8oZSl7cmV0dXJuIGdlKGUpPT09Im9iamVjdCImJmUhPT1udWxsJiYoeHQgaW4gZXx8dG4gaW4gZSl9ZnVuY3Rpb24gRXQoZSx0LG4pe3ZhciByO2lmKGdlKGUpPT09Im9iamVjdCIpe2lmKFRvKGUpKXJldHVybiBlO2lmKEV3KGUpKXJldHVybiBFdChlLnZhbCxlLnZhbFBhdGgpfWlmKGUmJmVbZ25dJiZlW1l0XT09PSJmaWxlIil7dmFyIG89ZVtnbl07aWYodHlwZW9mIG8hPSJzdHJpbmciKXRocm93IEVycm9yKCJJbnZhbGlkIGZpbGUgcmVmOiAiK28pO3JldHVybiBFdChTdyhlKSx0LG4pfXN3aXRjaChnZShlKSl7Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOnRocm93IEVycm9yKCJJbnZhbGlkIHNlbGVjdG9yIHR5cGU6ICIuY29uY2F0KGdlKGUpLCI6ICIpLmNvbmNhdChlKSk7Y2FzZSJvYmplY3QiOmlmKGUhPT1udWxsKXJldHVybiBuZXcgUHJveHkoZSx7aGFzOmZ1bmN0aW9uKGwscyl7cmV0dXJuIHM9PT14dHx8cz09PXRufHxzPT09ImFuZFRoZW4ifHxzPT09enU/ITA6cyBpbiBsfSxnZXQ6ZnVuY3Rpb24obCxzKXtpZihzPT09eHQpcmV0dXJuIGU7aWYocz09PXRuKXJldHVybiB0O2lmKHM9PT16dSlyZXR1cm4gbjtpZihzPT09ImFuZFRoZW4iKXJldHVybiBmdW5jdGlvbih1KXtyZXR1cm4gYXkodSxlLHQpfTtpZihBcnJheS5pc0FycmF5KGwpKXtpZihzPT09ImZpbHRlciIpcmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciBjPWwubWFwKGZ1bmN0aW9uKGQsZil7cmV0dXJuIEV0KGQscW4odCxmKSxuPT1udWxsP3ZvaWQgMDpuLml0ZW0pfSkuZmlsdGVyKGZ1bmN0aW9uKGQpe3JldHVybiB1JiZ1IGluc3RhbmNlb2Yga2k/dS5hc3NlcnQodXkoZCkpOnV5KHUoZCkpfSk7cmV0dXJuIEV0KGMsdCxuKX07aWYocz09PSJtYXAiKXJldHVybiBmdW5jdGlvbih1KXt2YXIgYz1sLm1hcChmdW5jdGlvbihkLGYpe3ZhciBoPXUoRXQoZCxxbih0LGYpLG49PW51bGw/dm9pZCAwOm4uaXRlbSksRXQoZikpO3JldHVybiBUbyhoKT9oOkV0KGgpfSk7cmV0dXJuIEV0KGMsdCxuKX19aWYoQXJyYXkuaXNBcnJheShsKSYmcz09PSJsZW5ndGgiKXJldHVybiBFdChsLmxlbmd0aCk7dmFyIGE9UmVmbGVjdC5nZXQobCxzKTtyZXR1cm4gTVQoZSxzKT9OdW1iZXIuaXNOYU4oTnVtYmVyKHMpKT9FdChhLHFuKHQscyksbj09bnVsbD92b2lkIDA6bi5pdGVtc1tzXSk6RXQoYSxxbih0LE51bWJlcihzKSksbj09bnVsbD92b2lkIDA6bi5pdGVtKTphfX0pO2RlZmF1bHQ6cmV0dXJuIHI9e2VxOmZ1bmN0aW9uKGwpe3ZhciBzPWw7aWYoVG8obCkmJihzPWxbeHRdLHMgaW5zdGFuY2VvZiBMZykpdGhyb3cgRXJyb3IoIlRPRE86IENhbm5vdCBldmFsdWF0ZSBlcXVhbGl0eSB3aXRoIGFuIEV4cHIiKTtyZXR1cm4gRXQoZT09PXMsdm9pZCAwKX0sYW5kVGhlbjpmdW5jdGlvbihsKXtyZXR1cm4gYXkobCxlPT09dm9pZCAwP251bGw6ZSx0KX19LHl0KHIseHQsZT09PXZvaWQgMD9udWxsOmUpLHl0KHIsdG4sdCkseXQocix6dSxuKSxyfX1mdW5jdGlvbiBxbihlLHQpe2lmKGdlKHQpPT09InN5bWJvbCIpdGhyb3cgRXJyb3IoIkNhbm5vdCBjcmVhdGUgdmFsIHBhdGggb2YgYXJyYXkgaXRlbSB3aXRoIHN5bWJvbCBwcm9wOiAiLmNvbmNhdCh0LnRvU3RyaW5nKCkpKTtyZXR1cm4gZSYmIiIuY29uY2F0KGUsIi4iKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkodCkpfWZ1bmN0aW9uIHV5KGUpe2lmKGdlKGUpPT09Im9iamVjdCImJih4dCBpbiBlfHx0biBpbiBlKSl7dmFyIHQ9ZVt4dF07cmV0dXJuIHR9cmV0dXJuIGV9dmFyIExUPWZ1bmN0aW9uKGUpe0NpKG4sZSk7dmFyIHQ9JGkobik7ZnVuY3Rpb24gbihyKXt2YXIgbyxpPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gU3IodGhpcyxuKSxvPXQuY2FsbCh0aGlzKSxvLml0ZW1zPXIsby5vcHQ9aSxvfXJldHVybiBFcihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24obyxpKXt2YXIgbD10aGlzLHM9ITE7cmV0dXJuIHRoaXMub3B0JiZpPT1udWxsPyExOmdlKGkpIT09Im9iamVjdCI/eXQoe30sbyxbe21lc3NhZ2U6IkV4cGVjdGVkICdvYmplY3QnLCBnb3QgJyIuY29uY2F0KGdlKGkpLCInIil9XSk6QXJyYXkuaXNBcnJheShpKT95dCh7fSxvLFt7bWVzc2FnZToiRXhwZWN0ZWQgJ29iamVjdCcsIGdvdCAnYXJyYXknIn1dKTooT2JqZWN0LmVudHJpZXModGhpcy5pdGVtcykuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgdT1paShhLDIpLGM9dVswXSxkPXVbMV0sZj1xbihvLGMpO2lmKCFmKXM9bC5hcHBlbmRWYWxpZGF0aW9uRXJyb3IocyxvLCJJbnRlcm5hbCBlcnJvcjogY291bGQgbm90IGNyZWF0ZSBwYXRoIGF0ICIuY29uY2F0KCFvJiZ0eXBlb2Ygbz09InN0cmluZyI/IjxlbXB0eSBzdHJpbmc+IjpvLCIgYXQga2V5ICIpLmNvbmNhdChjKSxpKTtlbHNle3ZhciBoPWQudmFsaWRhdGUoZixpW2NdKTtoJiZzP3M9a2woa2woe30saCkscyk6aCYmKHM9aCl9fSkscyl9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKG8pe2lmKHRoaXMub3B0JiZvPT1udWxsKXJldHVybiEwO2lmKCFvKXJldHVybiExO2Zvcih2YXIgaT0wLGw9T2JqZWN0LmVudHJpZXModGhpcy5pdGVtcyk7aTxsLmxlbmd0aDtpKyspe3ZhciBzPWlpKGxbaV0sMiksYT1zWzBdLHU9c1sxXTtpZighdS5hc3NlcnQob1thXSkpcmV0dXJuITF9cmV0dXJuIGdlKG8pPT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KG8pfX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMuaXRlbXMsITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJvYmplY3QiLGl0ZW1zOk9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0aGlzLml0ZW1zKS5tYXAoZnVuY3Rpb24obyl7dmFyIGk9aWkobywyKSxsPWlbMF0scz1pWzFdO3JldHVybltsLHMuc2VyaWFsaXplKCldfSkpLG9wdDp0aGlzLm9wdH19fV0pLG59KGtpKSxEVD1mdW5jdGlvbihlKXtDaShuLGUpO3ZhciB0PSRpKG4pO2Z1bmN0aW9uIG4ocil7dmFyIG8saT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIFNyKHRoaXMsbiksbz10LmNhbGwodGhpcyksby5pdGVtPXIsby5vcHQ9aSxvfXJldHVybiBFcihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24obyxpKXt2YXIgbD10aGlzLHM9ITE7cmV0dXJuIHRoaXMub3B0JiZpPT1udWxsPyExOmdlKGkpIT09Im9iamVjdCJ8fCFBcnJheS5pc0FycmF5KGkpP3l0KHt9LG8sW3ttZXNzYWdlOiJFeHBlY3RlZCAnYXJyYXknLCBnb3QgJyIuY29uY2F0KGdlKGkpLCInIil9XSk6KGkuZm9yRWFjaChmdW5jdGlvbihhLHUpe3ZhciBjPXFuKG8sdSk7aWYoIWMpcz1sLmFwcGVuZFZhbGlkYXRpb25FcnJvcihzLG8sIkludGVybmFsIGVycm9yOiBjb3VsZCBub3QgY3JlYXRlIHBhdGggYXQgIi5jb25jYXQoIW8mJnR5cGVvZiBvPT0ic3RyaW5nIj8iPGVtcHR5IHN0cmluZz4iOm8sIiBhdCBpbmRleCAiKS5jb25jYXQodSksaSk7ZWxzZXt2YXIgZD1sLml0ZW0udmFsaWRhdGUoYyxhKTtkJiZzP3M9a2woa2woe30sZCkscyk6ZCYmKHM9ZCl9fSkscyl9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKG8pe2lmKHRoaXMub3B0JiZvPT1udWxsKXJldHVybiEwO2lmKCFvKXJldHVybiExO3ZhciBpPUFnKG8pLGw7dHJ5e2ZvcihpLnMoKTshKGw9aS5uKCkpLmRvbmU7KXt2YXIgcz1sLnZhbHVlO2lmKCF0aGlzLml0ZW0uYXNzZXJ0KHMpKXJldHVybiExfX1jYXRjaChhKXtpLmUoYSl9ZmluYWxseXtpLmYoKX1yZXR1cm4gZ2Uobyk9PT0ib2JqZWN0IiYmQXJyYXkuaXNBcnJheShvKX19LHtrZXk6Im9wdGlvbmFsIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLml0ZW0sITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJhcnJheSIsaXRlbTp0aGlzLml0ZW0uc2VyaWFsaXplKCksb3B0OnRoaXMub3B0fX19XSksbn0oa2kpLElUPWZ1bmN0aW9uKGUpe0NpKG4sZSk7dmFyIHQ9JGkobik7ZnVuY3Rpb24gbihyLG8pe3ZhciBpLGw9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOiExO3JldHVybiBTcih0aGlzLG4pLGk9dC5jYWxsKHRoaXMpLGkua2V5PXIsaS5pdGVtcz1vLGkub3B0PWwsaX1yZXR1cm4gRXIobixbe2tleToidmFsaWRhdGUiLHZhbHVlOmZ1bmN0aW9uKG8saSl7dGhyb3cgbmV3IEVycm9yKCJNZXRob2Qgbm90IGltcGxlbWVudGVkLiIpfX0se2tleToiYXNzZXJ0Iix2YWx1ZTpmdW5jdGlvbihvKXt0aHJvdyBuZXcgRXJyb3IoIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuIil9fSx7a2V5OiJvcHRpb25hbCIsdmFsdWU6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuIil9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6InVuaW9uIixrZXk6dGhpcy5rZXksaXRlbXM6dGhpcy5pdGVtcy5tYXAoZnVuY3Rpb24obyl7cmV0dXJuIG8uc2VyaWFsaXplKCl9KSxvcHQ6dGhpcy5vcHR9fX1dKSxufShraSksalQ9ZnVuY3Rpb24oZSl7Q2kobixlKTt2YXIgdD0kaShuKTtmdW5jdGlvbiBuKHIpe3ZhciBvLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO3JldHVybiBTcih0aGlzLG4pLG89dC5jYWxsKHRoaXMpLG8ub3B0aW9ucz1yLG8ub3B0PWksb31yZXR1cm4gRXIobixbe2tleToidmFsaWRhdGUiLHZhbHVlOmZ1bmN0aW9uKG8saSl7cmV0dXJuITF9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKG8pe3JldHVybiEwfX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMub3B0aW9ucywhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6InJpY2h0ZXh0IixvcHQ6dGhpcy5vcHR9fX1dKSxufShraSkselQ9ZnVuY3Rpb24oZSl7Q2kobixlKTt2YXIgdD0kaShuKTtmdW5jdGlvbiBuKHIpe3ZhciBvLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO3JldHVybiBTcih0aGlzLG4pLG89dC5jYWxsKHRoaXMpLG8uaXRlbT1yLG8ub3B0PWksb31yZXR1cm4gRXIobixbe2tleToidmFsaWRhdGUiLHZhbHVlOmZ1bmN0aW9uKG8saSl7dmFyIGw9dGhpcyxzPSExO3JldHVybiB0aGlzLm9wdCYmaT09bnVsbD8hMTpnZShpKSE9PSJvYmplY3QiP3l0KHt9LG8sW3ttZXNzYWdlOiJFeHBlY3RlZCAnb2JqZWN0JywgZ290ICciLmNvbmNhdChnZShpKSwiJyIpfV0pOkFycmF5LmlzQXJyYXkoaSk/eXQoe30sbyxbe21lc3NhZ2U6IkV4cGVjdGVkICdvYmplY3QnLCBnb3QgJ2FycmF5JyJ9XSk6KE9iamVjdC5lbnRyaWVzKGkpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIHU9aWkoYSwyKSxjPXVbMF0sZD11WzFdLGY9cW4obyxjKTtpZighZilzPWwuYXBwZW5kVmFsaWRhdGlvbkVycm9yKHMsbywiSW50ZXJuYWwgZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgcGF0aCBhdCAiLmNvbmNhdCghbyYmdHlwZW9mIG89PSJzdHJpbmciPyI8ZW1wdHkgc3RyaW5nPiI6bywiIGF0IGtleSAiKS5jb25jYXQoZCksaSk7ZWxzZXt2YXIgaD1sLml0ZW0udmFsaWRhdGUoZixkKTtoJiZzP3M9a2woa2woe30saCkscyk6aCYmKHM9aCl9fSkscyl9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKG8pe2lmKHRoaXMub3B0JiZvPT1udWxsKXJldHVybiEwO2lmKCFvKXJldHVybiExO2Zvcih2YXIgaT0wLGw9T2JqZWN0LmVudHJpZXMobyk7aTxsLmxlbmd0aDtpKyspe3ZhciBzPWlpKGxbaV0sMiksYT1zWzFdO2lmKCF0aGlzLml0ZW0uYXNzZXJ0KGEpKXJldHVybiExfXJldHVybiBnZShvKT09PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheShvKX19LHtrZXk6Im9wdGlvbmFsIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLml0ZW0sITApfX0se2tleToic2VyaWFsaXplIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJyZWNvcmQiLGl0ZW06dGhpcy5pdGVtLnNlcmlhbGl6ZSgpLG9wdDp0aGlzLm9wdH19fV0pLG59KGtpKTtmdW5jdGlvbiBGVChlKXt2YXIgdD1lW3h0XTtpZih0IGluc3RhbmNlb2YgTGcpdGhyb3cgRXJyb3IoIkNhbm5vdCBnZXQgcmF3IHNvdXJjZSBvZiBhbiBFeHByIik7dmFyIG49dDtyZXR1cm4gbn1mdW5jdGlvbiBCVChlKXtyZXR1cm4gZS5pbmRleE9mKCIuIik9PT0tMT9bZSwiIl06W2Uuc2xpY2UoMCxlLmluZGV4T2YoIi4iKSksZS5zbGljZShlLmluZGV4T2YoIi4iKSsxKV19ZnVuY3Rpb24gV1QoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBMVHx8Z2UoZSk9PT0ib2JqZWN0IiYmInR5cGUiaW4gZSYmZS50eXBlPT09Im9iamVjdCJ9ZnVuY3Rpb24gVVQoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiB6VHx8Z2UoZSk9PT0ib2JqZWN0IiYmInR5cGUiaW4gZSYmZS50eXBlPT09InJlY29yZCJ9ZnVuY3Rpb24gVlQoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBEVHx8Z2UoZSk9PT0ib2JqZWN0IiYmInR5cGUiaW4gZSYmZS50eXBlPT09ImFycmF5In1mdW5jdGlvbiBIVChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIElUfHxnZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0idW5pb24ifWZ1bmN0aW9uIEtUKGUpe3JldHVybiBlIGluc3RhbmNlb2YgalR8fGdlKGUpPT09Im9iamVjdCImJiJ0eXBlImluIGUmJmUudHlwZT09PSJyaWNodGV4dCJ9ZnVuY3Rpb24gR1QoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBQVHx8Z2UoZSk9PT0ib2JqZWN0IiYmInR5cGUiaW4gZSYmZS50eXBlPT09ImltYWdlIn1mdW5jdGlvbiBZVChlLHQsbil7Zm9yKHZhciByPVhUKGUpLG89RVQociksaT1uLGw9dCxzPWZ1bmN0aW9uKCl7dmFyIGM9ci5zaGlmdCgpO2lmKGM9PT12b2lkIDApdGhyb3cgRXJyb3IoIlVuZXhwZWN0ZWQgdW5kZWZpbmVkIHBhcnQiKTtpZihWVChpKSl7aWYoTnVtYmVyLmlzTmFOKE51bWJlcihjKSkpdGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogYXJyYXkgc2NoZW1hICIuY29uY2F0KEpTT04uc3RyaW5naWZ5KGkpLCIgbXVzdCBoYXZlIGEgbnVtYmVyIGFzIHBhdGgsIGJ1dCBnb3QgIikuY29uY2F0KGMsIi4gUGF0aDogIikuY29uY2F0KGUpKTtpZihnZShsKSE9PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheShsKSl0aHJvdyBFcnJvcigiU2NoZW1hIHR5cGUgZXJyb3I6IGV4cGVjdGVkIHNvdXJjZSB0byBiZSB0eXBlIG9mIGFycmF5LCBidXQgZ290ICIuY29uY2F0KGdlKGwpKSk7aWYoIWxbY10pe3ZhciBkO3Rocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6IGFycmF5IHNvdXJjZSAobGVuZ3RoOiAiLmNvbmNhdCgoZD1sKT09PW51bGx8fGQ9PT12b2lkIDA/dm9pZCAwOmQubGVuZ3RoLCIpIGRpZCBub3QgaGF2ZSBpbmRleCAiKS5jb25jYXQoYywiIGZyb20gcGF0aDogIikuY29uY2F0KGUpKX1sPWxbY10saT1pLml0ZW19ZWxzZSBpZihVVChpKSl7aWYodHlwZW9mIGMhPSJzdHJpbmciKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6IHJlY29yZCBzY2hlbWEgIi5jb25jYXQoaSwiIG11c3QgaGF2ZSBwYXRoOiAiKS5jb25jYXQoYywiIGFzIHN0cmluZyIpKTtpZihnZShsKSE9PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheShsKSl0aHJvdyBFcnJvcigiU2NoZW1hIHR5cGUgZXJyb3I6IGV4cGVjdGVkIHNvdXJjZSB0byBiZSB0eXBlIG9mIHJlY29yZCwgYnV0IGdvdCAiLmNvbmNhdChnZShsKSkpO2lmKCFsW2NdKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6IHJlY29yZCBzb3VyY2UgZGlkIG5vdCBoYXZlIGtleSAiLmNvbmNhdChjLCIgZnJvbSBwYXRoOiAiKS5jb25jYXQoZSkpO2w9bFtjXSxpPWkuaXRlbX1lbHNlIGlmKFdUKGkpKXtpZihnZShsKSE9PSJvYmplY3QiKXRocm93IEVycm9yKCJTY2hlbWEgdHlwZSBlcnJvcjogZXhwZWN0ZWQgc291cmNlIHRvIGJlIHR5cGUgb2Ygb2JqZWN0LCBidXQgZ290ICIuY29uY2F0KGdlKGwpKSk7aWYoIWxbY10pdGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogb2JqZWN0IHNvdXJjZSBkaWQgbm90IGhhdmUga2V5ICIuY29uY2F0KGMsIiBmcm9tIHBhdGg6ICIpLmNvbmNhdChlKSk7bD1sW2NdLGk9aS5pdGVtc1tjXX1lbHNle2lmKEdUKGkpKXJldHVybnt2OntwYXRoOm8uc2xpY2UoMCxvLmxlbmd0aC1yLmxlbmd0aC0xKS5tYXAoZnVuY3Rpb24oZyl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGcpfSkuam9pbigiLiIpLHNjaGVtYTppLHNvdXJjZTpsfX07aWYoSFQoaSkpe3ZhciBmPWkua2V5LGg9bFtmXTtpZighaCl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiB1bmlvbiBzb3VyY2UgIi5jb25jYXQoaSwiIGRpZCBub3QgaGF2ZSByZXF1aXJlZCBrZXkgIikuY29uY2F0KGYsIiBpbiBwYXRoOiAiKS5jb25jYXQoZSkpO3ZhciBtPWkuaXRlbXMuZmluZChmdW5jdGlvbihnKXt2YXIgUyx2O3JldHVybihnPT1udWxsfHwoUz1nLml0ZW1zKT09PW51bGx8fFM9PT12b2lkIDB8fCh2PVNbZl0pPT09bnVsbHx8dj09PXZvaWQgMD92b2lkIDA6di52YWx1ZSk9PT1ofSk7aWYoIW0pdGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogdW5pb24gc2NoZW1hICIuY29uY2F0KGksIiBkaWQgbm90IGhhdmUgYSBjaGlsZCBvYmplY3Qgd2l0aCAiKS5jb25jYXQoZiwiIG9mIHZhbHVlICIpLmNvbmNhdChoLCIgaW4gcGF0aDogIikuY29uY2F0KGUpKTtpPW0uaXRlbXNbY10sbD1sW2NdfWVsc2V7aWYoS1QoaSkpcmV0dXJue3Y6e3BhdGg6by5zbGljZSgwLG8ubGVuZ3RoLXIubGVuZ3RoLTEpLm1hcChmdW5jdGlvbihnKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZyl9KS5qb2luKCIuIiksc2NoZW1hOmksc291cmNlOmx9fTt0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiAiLmNvbmNhdChjLCIgcmVzb2x2ZWQgdG8gYW4gdW5leHBlY3RlZCBzY2hlbWEgIikuY29uY2F0KEpTT04uc3RyaW5naWZ5KGkpKSl9fX07ci5sZW5ndGg+MDspe3ZhciBhPXMoKTtpZihnZShhKT09PSJvYmplY3QiKXJldHVybiBhLnZ9aWYoci5sZW5ndGg+MCl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiAiLmNvbmNhdChyLmpvaW4oIi4iKSwiIGlzIG5vdCBhIHZhbGlkIHBhdGgiKSk7cmV0dXJue3BhdGg6by5tYXAoZnVuY3Rpb24odSl7cmV0dXJuIE51bWJlci5pc05hTihOdW1iZXIodSkpP0pTT04uc3RyaW5naWZ5KHUpOnV9KS5qb2luKCIuIiksc2NoZW1hOmksc291cmNlOmx9fWZ1bmN0aW9uIFhUKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDspe3ZhciByPSIiO2lmKGVbbl09PT0nIicpe2ZvcihuKys7bjxlLmxlbmd0aCYmZVtuXSE9PSciJzspZVtuXT09PSJcXCImJmVbbisxXT09PSciJz8ocis9JyInLG4rKyk6cis9ZVtuXSxuKys7aWYoZVtuXSE9PSciJyl7dmFyIG87dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0ICgiLmNvbmNhdChKU09OLnN0cmluZ2lmeShlKSwiKTogTWlzc2luZyBjbG9zaW5nIGRvdWJsZSBxdW90ZTogIikuY29uY2F0KChvPWVbbl0pIT09bnVsbCYmbyE9PXZvaWQgMD9vOiJhdCBlbmQgb2Ygc3RyaW5nIiwiIChjaGFyOiAiKS5jb25jYXQobiwiOyBsZW5ndGg6ICIpLmNvbmNhdChlLmxlbmd0aCwiKSIpKX19ZWxzZSBmb3IoO248ZS5sZW5ndGgmJmVbbl0hPT0iLiI7KXIrPWVbbl0sbisrO3IhPT0iIiYmdC5wdXNoKHIpLG4rK31yZXR1cm4gdH1mdW5jdGlvbiBRVChlKXtyZXR1cm4gQ3cocVQoZSkpfWZ1bmN0aW9uIEpUKGUpe3JldHVybiBUbyhlKT9nZShlW3h0XSk9PT0ib2JqZWN0IiYmZ2UoZVt4dF0pIT09bnVsbCYmQXJyYXkuaXNBcnJheShlW3h0XSk6QXJyYXkuaXNBcnJheShlKX1mdW5jdGlvbiBaVChlKXtyZXR1cm4gVG8oZSk/Z2UoZVt4dF0pPT09Im9iamVjdCImJmdlKGVbeHRdKSE9PW51bGwmJiFBcnJheS5pc0FycmF5KGVbeHRdKTpnZShlKT09PSJvYmplY3QifWZ1bmN0aW9uIHFUKGUpe3ZhciB0PUV0KGUpO2Z1bmN0aW9uIG4ocil7dmFyIG89SlQociksaT1aVChyKTtpZihvKXt2YXIgbD14dCBpbiByP3JbeHRdOnIscz10biBpbiByP3JbdG5dOnZvaWQgMDtyZXR1cm57dmFsOmwubWFwKGZ1bmN0aW9uKGMsZCl7cmV0dXJuIG4oVG8oYyk/YzpFdChjLHFuKHMsZCkpKX0pLHZhbFBhdGg6c319ZWxzZSBpZihpKXt2YXIgYT14dCBpbiByP3JbeHRdOnIsdT10biBpbiByP3JbdG5dOnZvaWQgMDtyZXR1cm57dmFsOmEhPT1udWxsJiZPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYSkubWFwKGZ1bmN0aW9uKGMpe3ZhciBkPWlpKGMsMiksZj1kWzBdLGg9ZFsxXTtyZXR1cm5bZixuKFRvKGgpP2g6RXQoaCxxbih1LGYpKSldfSkpLHZhbFBhdGg6dX19ZWxzZSByZXR1cm4gVG8ocik/e3ZhbDpuKHJbeHRdKSx2YWxQYXRoOnJbdG5dfTpyfXJldHVybiBuKHQpfWZ1bmN0aW9uIEFoKGUpe3ZhciB0PUV3KGUpP2UudmFsOmU7c3dpdGNoKGdlKHQpKXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6dGhyb3cgRXJyb3IoIkludmFsaWQgdmFsIHR5cGU6ICIuY29uY2F0KGdlKHQpKSk7Y2FzZSJvYmplY3QiOnJldHVybiB0PT09bnVsbD9udWxsOkFycmF5LmlzQXJyYXkodCk/dC5tYXAoQWgpOk9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0KS5tYXAoZnVuY3Rpb24obil7dmFyIHI9aWkobiwyKSxvPXJbMF0saT1yWzFdO3JldHVybltvLGkmJkFoKGkpXX0pKTtkZWZhdWx0OnJldHVybiB0fX1mdW5jdGlvbiBDdyhlKXt2YXIgdCxuPWUudmFsO3N3aXRjaChnZShuKSl7Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOnRocm93IEVycm9yKCJJbnZhbGlkIHZhbCB0eXBlOiAiLmNvbmNhdChnZShuKSkpO2Nhc2Uib2JqZWN0IjppZihuIT09bnVsbClyZXR1cm4gbmV3IFByb3h5KG4se2hhczpmdW5jdGlvbihvLGkpe3JldHVybiBpPT09InZhbCJ8fGk9PT10bj8hMDpjeShvLGkpfSxnZXQ6ZnVuY3Rpb24obyxpKXtpZihpPT09dG4pcmV0dXJuIGUudmFsUGF0aDtpZihpPT09InZhbCIpcmV0dXJuIEFoKGUpO2lmKEFycmF5LmlzQXJyYXkobykmJmk9PT0ibGVuZ3RoIilyZXR1cm4gby5sZW5ndGg7aWYoY3kobixpKSl7dmFyIGwscztyZXR1cm4gQ3coe3ZhbDpSZWZsZWN0LmdldChvLGkpLnZhbCx2YWxQYXRoOihsPShzPVJlZmxlY3QuZ2V0KG8saSkpPT09bnVsbHx8cz09PXZvaWQgMD92b2lkIDA6cy52YWxQYXRoKSE9PW51bGwmJmwhPT12b2lkIDA/bDpxbihlLnZhbFBhdGgsQXJyYXkuaXNBcnJheShvKT9OdW1iZXIoaSk6aSl9KX1yZXR1cm4gUmVmbGVjdC5nZXQobyxpKX19KTtkZWZhdWx0OnJldHVybiB0PXt9LHl0KHQsdG4sZS52YWxQYXRoKSx5dCh0LCJ2YWwiLGUudmFsKSx0fX1mdW5jdGlvbiBjeShlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX1mdW5jdGlvbiBwaSgpe3BpPWZ1bmN0aW9uKCl7cmV0dXJuIHR9O3ZhciBlLHQ9e30sbj1PYmplY3QucHJvdG90eXBlLHI9bi5oYXNPd25Qcm9wZXJ0eSxvPU9iamVjdC5kZWZpbmVQcm9wZXJ0eXx8ZnVuY3Rpb24oQywkLEUpe0NbJF09RS52YWx1ZX0saT10eXBlb2YgU3ltYm9sPT0iZnVuY3Rpb24iP1N5bWJvbDp7fSxsPWkuaXRlcmF0b3J8fCJAQGl0ZXJhdG9yIixzPWkuYXN5bmNJdGVyYXRvcnx8IkBAYXN5bmNJdGVyYXRvciIsYT1pLnRvU3RyaW5nVGFnfHwiQEB0b1N0cmluZ1RhZyI7ZnVuY3Rpb24gdShDLCQsRSl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCQse3ZhbHVlOkUsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KSxDWyRdfXRyeXt1KHt9LCIiKX1jYXRjaHt1PWZ1bmN0aW9uKCQsRSxBKXtyZXR1cm4gJFtFXT1BfX1mdW5jdGlvbiBjKEMsJCxFLEEpe3ZhciBSPSQmJiQucHJvdG90eXBlIGluc3RhbmNlb2Ygdj8kOnYsej1PYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKSxWPW5ldyBIKEF8fFtdKTtyZXR1cm4gbyh6LCJfaW52b2tlIix7dmFsdWU6TyhDLEUsVil9KSx6fWZ1bmN0aW9uIGQoQywkLEUpe3RyeXtyZXR1cm57dHlwZToibm9ybWFsIixhcmc6Qy5jYWxsKCQsRSl9fWNhdGNoKEEpe3JldHVybnt0eXBlOiJ0aHJvdyIsYXJnOkF9fX10LndyYXA9Yzt2YXIgZj0ic3VzcGVuZGVkU3RhcnQiLGg9InN1c3BlbmRlZFlpZWxkIixtPSJleGVjdXRpbmciLGc9ImNvbXBsZXRlZCIsUz17fTtmdW5jdGlvbiB2KCl7fWZ1bmN0aW9uIHkoKXt9ZnVuY3Rpb24geCgpe312YXIgdz17fTt1KHcsbCxmdW5jdGlvbigpe3JldHVybiB0aGlzfSk7dmFyIGs9T2JqZWN0LmdldFByb3RvdHlwZU9mLGI9ayYmayhrKEcoW10pKSk7YiYmYiE9PW4mJnIuY2FsbChiLGwpJiYodz1iKTt2YXIgVD14LnByb3RvdHlwZT12LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHcpO2Z1bmN0aW9uIE4oQyl7WyJuZXh0IiwidGhyb3ciLCJyZXR1cm4iXS5mb3JFYWNoKGZ1bmN0aW9uKCQpe3UoQywkLGZ1bmN0aW9uKEUpe3JldHVybiB0aGlzLl9pbnZva2UoJCxFKX0pfSl9ZnVuY3Rpb24gRChDLCQpe2Z1bmN0aW9uIEUoUix6LFYsaWUpe3ZhciBuZT1kKENbUl0sQyx6KTtpZihuZS50eXBlIT09InRocm93Iil7dmFyIENlPW5lLmFyZyx3ZT1DZS52YWx1ZTtyZXR1cm4gd2UmJnR5cGVvZiB3ZT09Im9iamVjdCImJnIuY2FsbCh3ZSwiX19hd2FpdCIpPyQucmVzb2x2ZSh3ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKFgpe0UoIm5leHQiLFgsVixpZSl9LGZ1bmN0aW9uKFgpe0UoInRocm93IixYLFYsaWUpfSk6JC5yZXNvbHZlKHdlKS50aGVuKGZ1bmN0aW9uKFgpe0NlLnZhbHVlPVgsVihDZSl9LGZ1bmN0aW9uKFgpe3JldHVybiBFKCJ0aHJvdyIsWCxWLGllKX0pfWllKG5lLmFyZyl9dmFyIEE7byh0aGlzLCJfaW52b2tlIix7dmFsdWU6ZnVuY3Rpb24oUix6KXtmdW5jdGlvbiBWKCl7cmV0dXJuIG5ldyAkKGZ1bmN0aW9uKGllLG5lKXtFKFIseixpZSxuZSl9KX1yZXR1cm4gQT1BP0EudGhlbihWLFYpOlYoKX19KX1mdW5jdGlvbiBPKEMsJCxFKXt2YXIgQT1mO3JldHVybiBmdW5jdGlvbihSLHope2lmKEE9PT1tKXRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpO2lmKEE9PT1nKXtpZihSPT09InRocm93Iil0aHJvdyB6O3JldHVybnt2YWx1ZTplLGRvbmU6ITB9fWZvcihFLm1ldGhvZD1SLEUuYXJnPXo7Oyl7dmFyIFY9RS5kZWxlZ2F0ZTtpZihWKXt2YXIgaWU9aihWLEUpO2lmKGllKXtpZihpZT09PVMpY29udGludWU7cmV0dXJuIGllfX1pZihFLm1ldGhvZD09PSJuZXh0IilFLnNlbnQ9RS5fc2VudD1FLmFyZztlbHNlIGlmKEUubWV0aG9kPT09InRocm93Iil7aWYoQT09PWYpdGhyb3cgQT1nLEUuYXJnO0UuZGlzcGF0Y2hFeGNlcHRpb24oRS5hcmcpfWVsc2UgRS5tZXRob2Q9PT0icmV0dXJuIiYmRS5hYnJ1cHQoInJldHVybiIsRS5hcmcpO0E9bTt2YXIgbmU9ZChDLCQsRSk7aWYobmUudHlwZT09PSJub3JtYWwiKXtpZihBPUUuZG9uZT9nOmgsbmUuYXJnPT09Uyljb250aW51ZTtyZXR1cm57dmFsdWU6bmUuYXJnLGRvbmU6RS5kb25lfX1uZS50eXBlPT09InRocm93IiYmKEE9ZyxFLm1ldGhvZD0idGhyb3ciLEUuYXJnPW5lLmFyZyl9fX1mdW5jdGlvbiBqKEMsJCl7dmFyIEU9JC5tZXRob2QsQT1DLml0ZXJhdG9yW0VdO2lmKEE9PT1lKXJldHVybiAkLmRlbGVnYXRlPW51bGwsRT09PSJ0aHJvdyImJkMuaXRlcmF0b3IucmV0dXJuJiYoJC5tZXRob2Q9InJldHVybiIsJC5hcmc9ZSxqKEMsJCksJC5tZXRob2Q9PT0idGhyb3ciKXx8RSE9PSJyZXR1cm4iJiYoJC5tZXRob2Q9InRocm93IiwkLmFyZz1uZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICciK0UrIicgbWV0aG9kIikpLFM7dmFyIFI9ZChBLEMuaXRlcmF0b3IsJC5hcmcpO2lmKFIudHlwZT09PSJ0aHJvdyIpcmV0dXJuICQubWV0aG9kPSJ0aHJvdyIsJC5hcmc9Ui5hcmcsJC5kZWxlZ2F0ZT1udWxsLFM7dmFyIHo9Ui5hcmc7cmV0dXJuIHo/ei5kb25lPygkW0MucmVzdWx0TmFtZV09ei52YWx1ZSwkLm5leHQ9Qy5uZXh0TG9jLCQubWV0aG9kIT09InJldHVybiImJigkLm1ldGhvZD0ibmV4dCIsJC5hcmc9ZSksJC5kZWxlZ2F0ZT1udWxsLFMpOno6KCQubWV0aG9kPSJ0aHJvdyIsJC5hcmc9bmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKSwkLmRlbGVnYXRlPW51bGwsUyl9ZnVuY3Rpb24gQihDKXt2YXIgJD17dHJ5TG9jOkNbMF19OzEgaW4gQyYmKCQuY2F0Y2hMb2M9Q1sxXSksMiBpbiBDJiYoJC5maW5hbGx5TG9jPUNbMl0sJC5hZnRlckxvYz1DWzNdKSx0aGlzLnRyeUVudHJpZXMucHVzaCgkKX1mdW5jdGlvbiBhZShDKXt2YXIgJD1DLmNvbXBsZXRpb258fHt9OyQudHlwZT0ibm9ybWFsIixkZWxldGUgJC5hcmcsQy5jb21wbGV0aW9uPSR9ZnVuY3Rpb24gSChDKXt0aGlzLnRyeUVudHJpZXM9W3t0cnlMb2M6InJvb3QifV0sQy5mb3JFYWNoKEIsdGhpcyksdGhpcy5yZXNldCghMCl9ZnVuY3Rpb24gRyhDKXtpZihDfHxDPT09IiIpe3ZhciAkPUNbbF07aWYoJClyZXR1cm4gJC5jYWxsKEMpO2lmKHR5cGVvZiBDLm5leHQ9PSJmdW5jdGlvbiIpcmV0dXJuIEM7aWYoIWlzTmFOKEMubGVuZ3RoKSl7dmFyIEU9LTEsQT1mdW5jdGlvbiBSKCl7Zm9yKDsrK0U8Qy5sZW5ndGg7KWlmKHIuY2FsbChDLEUpKXJldHVybiBSLnZhbHVlPUNbRV0sUi5kb25lPSExLFI7cmV0dXJuIFIudmFsdWU9ZSxSLmRvbmU9ITAsUn07cmV0dXJuIEEubmV4dD1BfX10aHJvdyBuZXcgVHlwZUVycm9yKHR5cGVvZiBDKyIgaXMgbm90IGl0ZXJhYmxlIil9cmV0dXJuIHkucHJvdG90eXBlPXgsbyhULCJjb25zdHJ1Y3RvciIse3ZhbHVlOngsY29uZmlndXJhYmxlOiEwfSksbyh4LCJjb25zdHJ1Y3RvciIse3ZhbHVlOnksY29uZmlndXJhYmxlOiEwfSkseS5kaXNwbGF5TmFtZT11KHgsYSwiR2VuZXJhdG9yRnVuY3Rpb24iKSx0LmlzR2VuZXJhdG9yRnVuY3Rpb249ZnVuY3Rpb24oQyl7dmFyICQ9dHlwZW9mIEM9PSJmdW5jdGlvbiImJkMuY29uc3RydWN0b3I7cmV0dXJuISEkJiYoJD09PXl8fCgkLmRpc3BsYXlOYW1lfHwkLm5hbWUpPT09IkdlbmVyYXRvckZ1bmN0aW9uIil9LHQubWFyaz1mdW5jdGlvbihDKXtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihDLHgpOihDLl9fcHJvdG9fXz14LHUoQyxhLCJHZW5lcmF0b3JGdW5jdGlvbiIpKSxDLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFQpLEN9LHQuYXdyYXA9ZnVuY3Rpb24oQyl7cmV0dXJue19fYXdhaXQ6Q319LE4oRC5wcm90b3R5cGUpLHUoRC5wcm90b3R5cGUscyxmdW5jdGlvbigpe3JldHVybiB0aGlzfSksdC5Bc3luY0l0ZXJhdG9yPUQsdC5hc3luYz1mdW5jdGlvbihDLCQsRSxBLFIpe1I9PT12b2lkIDAmJihSPVByb21pc2UpO3ZhciB6PW5ldyBEKGMoQywkLEUsQSksUik7cmV0dXJuIHQuaXNHZW5lcmF0b3JGdW5jdGlvbigkKT96OnoubmV4dCgpLnRoZW4oZnVuY3Rpb24oVil7cmV0dXJuIFYuZG9uZT9WLnZhbHVlOnoubmV4dCgpfSl9LE4oVCksdShULGEsIkdlbmVyYXRvciIpLHUoVCxsLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSx1KFQsInRvU3RyaW5nIixmdW5jdGlvbigpe3JldHVybiJbb2JqZWN0IEdlbmVyYXRvcl0ifSksdC5rZXlzPWZ1bmN0aW9uKEMpe3ZhciAkPU9iamVjdChDKSxFPVtdO2Zvcih2YXIgQSBpbiAkKUUucHVzaChBKTtyZXR1cm4gRS5yZXZlcnNlKCksZnVuY3Rpb24gUigpe2Zvcig7RS5sZW5ndGg7KXt2YXIgej1FLnBvcCgpO2lmKHogaW4gJClyZXR1cm4gUi52YWx1ZT16LFIuZG9uZT0hMSxSfXJldHVybiBSLmRvbmU9ITAsUn19LHQudmFsdWVzPUcsSC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkgscmVzZXQ6ZnVuY3Rpb24oQyl7aWYodGhpcy5wcmV2PTAsdGhpcy5uZXh0PTAsdGhpcy5zZW50PXRoaXMuX3NlbnQ9ZSx0aGlzLmRvbmU9ITEsdGhpcy5kZWxlZ2F0ZT1udWxsLHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLmFyZz1lLHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKGFlKSwhQylmb3IodmFyICQgaW4gdGhpcykkLmNoYXJBdCgwKT09PSJ0IiYmci5jYWxsKHRoaXMsJCkmJiFpc05hTigrJC5zbGljZSgxKSkmJih0aGlzWyRdPWUpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5kb25lPSEwO3ZhciBDPXRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uO2lmKEMudHlwZT09PSJ0aHJvdyIpdGhyb3cgQy5hcmc7cmV0dXJuIHRoaXMucnZhbH0sZGlzcGF0Y2hFeGNlcHRpb246ZnVuY3Rpb24oQyl7aWYodGhpcy5kb25lKXRocm93IEM7dmFyICQ9dGhpcztmdW5jdGlvbiBFKG5lLENlKXtyZXR1cm4gei50eXBlPSJ0aHJvdyIsei5hcmc9QywkLm5leHQ9bmUsQ2UmJigkLm1ldGhvZD0ibmV4dCIsJC5hcmc9ZSksISFDZX1mb3IodmFyIEE9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO0E+PTA7LS1BKXt2YXIgUj10aGlzLnRyeUVudHJpZXNbQV0sej1SLmNvbXBsZXRpb247aWYoUi50cnlMb2M9PT0icm9vdCIpcmV0dXJuIEUoImVuZCIpO2lmKFIudHJ5TG9jPD10aGlzLnByZXYpe3ZhciBWPXIuY2FsbChSLCJjYXRjaExvYyIpLGllPXIuY2FsbChSLCJmaW5hbGx5TG9jIik7aWYoViYmaWUpe2lmKHRoaXMucHJldjxSLmNhdGNoTG9jKXJldHVybiBFKFIuY2F0Y2hMb2MsITApO2lmKHRoaXMucHJldjxSLmZpbmFsbHlMb2MpcmV0dXJuIEUoUi5maW5hbGx5TG9jKX1lbHNlIGlmKFYpe2lmKHRoaXMucHJldjxSLmNhdGNoTG9jKXJldHVybiBFKFIuY2F0Y2hMb2MsITApfWVsc2V7aWYoIWllKXRocm93IG5ldyBFcnJvcigidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHkiKTtpZih0aGlzLnByZXY8Ui5maW5hbGx5TG9jKXJldHVybiBFKFIuZmluYWxseUxvYyl9fX19LGFicnVwdDpmdW5jdGlvbihDLCQpe2Zvcih2YXIgRT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7RT49MDstLUUpe3ZhciBBPXRoaXMudHJ5RW50cmllc1tFXTtpZihBLnRyeUxvYzw9dGhpcy5wcmV2JiZyLmNhbGwoQSwiZmluYWxseUxvYyIpJiZ0aGlzLnByZXY8QS5maW5hbGx5TG9jKXt2YXIgUj1BO2JyZWFrfX1SJiYoQz09PSJicmVhayJ8fEM9PT0iY29udGludWUiKSYmUi50cnlMb2M8PSQmJiQ8PVIuZmluYWxseUxvYyYmKFI9bnVsbCk7dmFyIHo9Uj9SLmNvbXBsZXRpb246e307cmV0dXJuIHoudHlwZT1DLHouYXJnPSQsUj8odGhpcy5tZXRob2Q9Im5leHQiLHRoaXMubmV4dD1SLmZpbmFsbHlMb2MsUyk6dGhpcy5jb21wbGV0ZSh6KX0sY29tcGxldGU6ZnVuY3Rpb24oQywkKXtpZihDLnR5cGU9PT0idGhyb3ciKXRocm93IEMuYXJnO3JldHVybiBDLnR5cGU9PT0iYnJlYWsifHxDLnR5cGU9PT0iY29udGludWUiP3RoaXMubmV4dD1DLmFyZzpDLnR5cGU9PT0icmV0dXJuIj8odGhpcy5ydmFsPXRoaXMuYXJnPUMuYXJnLHRoaXMubWV0aG9kPSJyZXR1cm4iLHRoaXMubmV4dD0iZW5kIik6Qy50eXBlPT09Im5vcm1hbCImJiQmJih0aGlzLm5leHQ9JCksU30sZmluaXNoOmZ1bmN0aW9uKEMpe2Zvcih2YXIgJD10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7JD49MDstLSQpe3ZhciBFPXRoaXMudHJ5RW50cmllc1skXTtpZihFLmZpbmFsbHlMb2M9PT1DKXJldHVybiB0aGlzLmNvbXBsZXRlKEUuY29tcGxldGlvbixFLmFmdGVyTG9jKSxhZShFKSxTfX0sY2F0Y2g6ZnVuY3Rpb24oQyl7Zm9yKHZhciAkPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTskPj0wOy0tJCl7dmFyIEU9dGhpcy50cnlFbnRyaWVzWyRdO2lmKEUudHJ5TG9jPT09Qyl7dmFyIEE9RS5jb21wbGV0aW9uO2lmKEEudHlwZT09PSJ0aHJvdyIpe3ZhciBSPUEuYXJnO2FlKEUpfXJldHVybiBSfX10aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpfSxkZWxlZ2F0ZVlpZWxkOmZ1bmN0aW9uKEMsJCxFKXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZT17aXRlcmF0b3I6RyhDKSxyZXN1bHROYW1lOiQsbmV4dExvYzpFfSx0aGlzLm1ldGhvZD09PSJuZXh0IiYmKHRoaXMuYXJnPWUpLFN9fSx0fWZ1bmN0aW9uIGR5KGUsdCxuLHIsbyxpLGwpe3RyeXt2YXIgcz1lW2ldKGwpLGE9cy52YWx1ZX1jYXRjaCh1KXtuKHUpO3JldHVybn1zLmRvbmU/dChhKTpQcm9taXNlLnJlc29sdmUoYSkudGhlbihyLG8pfWZ1bmN0aW9uIERnKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHIsbyl7dmFyIGk9ZS5hcHBseSh0LG4pO2Z1bmN0aW9uIGwoYSl7ZHkoaSxyLG8sbCxzLCJuZXh0IixhKX1mdW5jdGlvbiBzKGEpe2R5KGkscixvLGwscywidGhyb3ciLGEpfWwodm9pZCAwKX0pfX12YXIgZWI9ZnVuY3Rpb24oKXt2YXIgZT1EZyhwaSgpLm1hcmsoZnVuY3Rpb24gdChuKXt2YXIgcixvLGk7cmV0dXJuIHBpKCkud3JhcChmdW5jdGlvbihzKXtmb3IoOzspc3dpdGNoKHMucHJldj1zLm5leHQpe2Nhc2UgMDpyZXR1cm4gcy5uZXh0PTIsY3J5cHRvLnN1YnRsZS5kaWdlc3QoIlNIQS0yNTYiLG4pO2Nhc2UgMjpyZXR1cm4gcj1zLnNlbnQsbz1BcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KHIpKSxpPW8ubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIil9KS5qb2luKCIiKSxzLmFicnVwdCgicmV0dXJuIixpKTtjYXNlIDY6Y2FzZSJlbmQiOnJldHVybiBzLnN0b3AoKX19LHQpfSkpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpLHRiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtTcih0aGlzLGUpLHRoaXMuaG9zdD10fXJldHVybiBFcihlLFt7a2V5OiJnZXREaXNhYmxlVXJsIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiIiLmNvbmNhdCh0aGlzLmhvc3QsIi9kaXNhYmxlIil9fSx7a2V5OiJnZXRFZGl0VXJsIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiIiLmNvbmNhdCh0aGlzLmhvc3QsIi9zdGF0aWMvZWRpdCIpfX0se2tleToiZ2V0TG9naW5VcmwiLHZhbHVlOmZ1bmN0aW9uKG4pe3JldHVybiIiLmNvbmNhdCh0aGlzLmhvc3QsIi9hdXRob3JpemU/cmVkaXJlY3RfdG89IikuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChuKSl9fSx7a2V5OiJnZXRQYXRjaGVzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PURnKHBpKCkubWFyayhmdW5jdGlvbiByKG8pe3ZhciBpLGwscztyZXR1cm4gcGkoKS53cmFwKGZ1bmN0aW9uKHUpe2Zvcig7Oylzd2l0Y2godS5wcmV2PXUubmV4dCl7Y2FzZSAwOnJldHVybiBpPW8ucGF0Y2hJZHMsbD1vLmhlYWRlcnMscz1pPyI/Ii5jb25jYXQoaS5tYXAoZnVuY3Rpb24oYyl7cmV0dXJuIiIuY29uY2F0KGMsIj0iKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KGMpKX0pLmpvaW4oIiYiKSk6IiIsdS5hYnJ1cHQoInJldHVybiIsZmV0Y2goIiIuY29uY2F0KHRoaXMuaG9zdCwiL3BhdGNoZXMvfiIpLmNvbmNhdChzKSx7aGVhZGVyczpsfHx7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifX0pLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIGZ1KGMpfSkpO2Nhc2UgMzpjYXNlImVuZCI6cmV0dXJuIHUuc3RvcCgpfX0scix0aGlzKX0pKTtmdW5jdGlvbiBuKHIpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbn0oKX0se2tleToicG9zdFBhdGNoZXMiLHZhbHVlOmZ1bmN0aW9uKG4scixvKXtyZXR1cm4gZmV0Y2goIiIuY29uY2F0KHRoaXMuaG9zdCwiL3BhdGNoZXMvfiIpLHtoZWFkZXJzOm98fHsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9LG1ldGhvZDoiUE9TVCIsYm9keTpKU09OLnN0cmluZ2lmeSh5dCh7fSxuLHIpKX0pLnRoZW4oZnVuY3Rpb24oaSl7cmV0dXJuIGZ1KGkpfSl9fSx7a2V5OiJnZXRTZXNzaW9uIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBmZXRjaCgiIi5jb25jYXQodGhpcy5ob3N0LCIvc2Vzc2lvbiIpKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiBmdShuKX0pfX0se2tleToiZ2V0TW9kdWxlcyIsdmFsdWU6ZnVuY3Rpb24obil7dmFyIHI9bi5wYXRjaCxvPXI9PT12b2lkIDA/ITE6cixpPW4uaW5jbHVkZVNjaGVtYSxsPWk9PT12b2lkIDA/ITE6aSxzPW4uaW5jbHVkZVNvdXJjZSxhPXM9PT12b2lkIDA/ITE6cyx1PW4udHJlZVBhdGgsYz11PT09dm9pZCAwPyIvIjp1LGQ9bi5oZWFkZXJzLGY9bmV3IFVSTFNlYXJjaFBhcmFtcztyZXR1cm4gZi5zZXQoInBhdGNoIixvLnRvU3RyaW5nKCkpLGYuc2V0KCJzY2hlbWEiLGwudG9TdHJpbmcoKSksZi5zZXQoInNvdXJjZSIsYS50b1N0cmluZygpKSxmZXRjaCgiIi5jb25jYXQodGhpcy5ob3N0LCIvdHJlZS9+IikuY29uY2F0KGMsIj8iKS5jb25jYXQoZi50b1N0cmluZygpKSx7aGVhZGVyczpkfSkudGhlbihmdW5jdGlvbihoKXtyZXR1cm4gZnUoaCl9KX19XSksZX0oKTtmdW5jdGlvbiBmdShlKXtyZXR1cm4gTWguYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIE1oKCl7cmV0dXJuIE1oPURnKHBpKCkubWFyayhmdW5jdGlvbiBlKHQpe3JldHVybiBwaSgpLndyYXAoZnVuY3Rpb24ocil7Zm9yKDs7KXN3aXRjaChyLnByZXY9ci5uZXh0KXtjYXNlIDA6aWYoci5wcmV2PTAsIXQub2spe3IubmV4dD05O2JyZWFrfXJldHVybiByLnQwPWhsLHIubmV4dD01LHQuanNvbigpO2Nhc2UgNTpyZXR1cm4gci50MT1yLnNlbnQsci5hYnJ1cHQoInJldHVybiIsci50MC5vay5jYWxsKHIudDAsci50MSkpO2Nhc2UgOTpyZXR1cm4gci50Mj1obCxyLnQzPXQuc3RhdHVzLHIubmV4dD0xMyx0LnRleHQoKTtjYXNlIDEzOnJldHVybiByLnQ0PXIuc2VudCxyLnQ1PXtzdGF0dXNDb2RlOnIudDMsbWVzc2FnZTpyLnQ0fSxyLmFicnVwdCgicmV0dXJuIixyLnQyLmVyci5jYWxsKHIudDIsci50NSkpO2Nhc2UgMTY6ci5uZXh0PTIxO2JyZWFrO2Nhc2UgMTg6cmV0dXJuIHIucHJldj0xOCxyLnQ2PXIuY2F0Y2goMCksci5hYnJ1cHQoInJldHVybiIsRWkoe21lc3NhZ2U6ci50NiBpbnN0YW5jZW9mIEVycm9yP3IudDYubWVzc2FnZToiVW5rbm93biBlcnJvciJ9KSk7Y2FzZSAyMTpjYXNlImVuZCI6cmV0dXJuIHIuc3RvcCgpfX0sZSxudWxsLFtbMCwxOF1dKX0pKSxNaC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIEVuPXtjb252ZXJ0RmlsZVNvdXJjZTpTdyxnZXRTY2hlbWE6TlQsZ2V0VmFsUGF0aDpBVCxnZXRWYWw6UVQsZ2V0U291cmNlOkZULHJlc29sdmVQYXRoOllULHNwbGl0TW9kdWxlSWRBbmRNb2R1bGVQYXRoOkJULGlzVmFsOk9ULGNyZWF0ZVZhbFBhdGhPZkl0ZW06cW4sZ2V0U0hBMjU2SGFzaDplYixjcmVhdGVQYXRjaEpTT05QYXRoOmZ1bmN0aW9uKHQpe3JldHVybiIvIi5jb25jYXQodC5zcGxpdCgiLiIpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gSlNPTi5wYXJzZShuKX0pLmpvaW4oIi8iKSl9LFZBTF9EUkFGVF9NT0RFX0NPT0tJRToidmFsX2RyYWZ0X21vZGUiLFZBTF9FTkFCTEVfQ09PS0lFX05BTUU6InZhbF9lbmFibGUiLFZBTF9TVEFURV9DT09LSUU6InZhbF9zdGF0ZSIsVkFMX1NFU1NJT05fQ09PS0lFOiJ2YWxfc2Vzc2lvbiJ9LCR3PXtleHBvcnRzOnt9fTsvKiEKCUNvcHlyaWdodCAoYykgMjAxOCBKZWQgV2F0c29uLgoJTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChNSVQpLCBzZWUKCWh0dHA6Ly9qZWR3YXRzb24uZ2l0aHViLmlvL2NsYXNzbmFtZXMKKi8oZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKCl7dmFyIHQ9e30uaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gbigpe2Zvcih2YXIgcj1bXSxvPTA7bzxhcmd1bWVudHMubGVuZ3RoO28rKyl7dmFyIGk9YXJndW1lbnRzW29dO2lmKGkpe3ZhciBsPXR5cGVvZiBpO2lmKGw9PT0ic3RyaW5nInx8bD09PSJudW1iZXIiKXIucHVzaChpKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkoaSkpe2lmKGkubGVuZ3RoKXt2YXIgcz1uLmFwcGx5KG51bGwsaSk7cyYmci5wdXNoKHMpfX1lbHNlIGlmKGw9PT0ib2JqZWN0Iil7aWYoaS50b1N0cmluZyE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcmJiFpLnRvU3RyaW5nLnRvU3RyaW5nKCkuaW5jbHVkZXMoIltuYXRpdmUgY29kZV0iKSl7ci5wdXNoKGkudG9TdHJpbmcoKSk7Y29udGludWV9Zm9yKHZhciBhIGluIGkpdC5jYWxsKGksYSkmJmlbYV0mJnIucHVzaChhKX19fXJldHVybiByLmpvaW4oIiAiKX1lLmV4cG9ydHM/KG4uZGVmYXVsdD1uLGUuZXhwb3J0cz1uKTp3aW5kb3cuY2xhc3NOYW1lcz1ufSkoKX0pKCR3KTt2YXIgbmI9JHcuZXhwb3J0cztjb25zdCBhZD1iYShuYik7ZnVuY3Rpb24gdGUoKXtyZXR1cm4gdGU9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSx0ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcmIoZSx0KXt0eXBlb2YgZT09ImZ1bmN0aW9uIj9lKHQpOmUhPW51bGwmJihlLmN1cnJlbnQ9dCl9ZnVuY3Rpb24ga3coLi4uZSl7cmV0dXJuIHQ9PmUuZm9yRWFjaChuPT5yYihuLHQpKX1mdW5jdGlvbiBRZSguLi5lKXtyZXR1cm4gcC51c2VDYWxsYmFjayhrdyguLi5lKSxlKX1jb25zdCBUbD1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtjaGlsZHJlbjpuLC4uLnJ9PWUsbz1wLkNoaWxkcmVuLnRvQXJyYXkobiksaT1vLmZpbmQoaWIpO2lmKGkpe2NvbnN0IGw9aS5wcm9wcy5jaGlsZHJlbixzPW8ubWFwKGE9PmE9PT1pP3AuQ2hpbGRyZW4uY291bnQobCk+MT9wLkNoaWxkcmVuLm9ubHkobnVsbCk6cC5pc1ZhbGlkRWxlbWVudChsKT9sLnByb3BzLmNoaWxkcmVuOm51bGw6YSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChMaCx0ZSh7fSxyLHtyZWY6dH0pLHAuaXNWYWxpZEVsZW1lbnQobCk/cC5jbG9uZUVsZW1lbnQobCx2b2lkIDAscyk6bnVsbCl9cmV0dXJuIHAuY3JlYXRlRWxlbWVudChMaCx0ZSh7fSxyLHtyZWY6dH0pLG4pfSk7VGwuZGlzcGxheU5hbWU9IlNsb3QiO2NvbnN0IExoPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e2NoaWxkcmVuOm4sLi4ucn09ZTtyZXR1cm4gcC5pc1ZhbGlkRWxlbWVudChuKT9wLmNsb25lRWxlbWVudChuLHsuLi5sYihyLG4ucHJvcHMpLHJlZjp0P2t3KHQsbi5yZWYpOm4ucmVmfSk6cC5DaGlsZHJlbi5jb3VudChuKT4xP3AuQ2hpbGRyZW4ub25seShudWxsKTpudWxsfSk7TGguZGlzcGxheU5hbWU9IlNsb3RDbG9uZSI7Y29uc3Qgb2I9KHtjaGlsZHJlbjplfSk9PnAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwsZSk7ZnVuY3Rpb24gaWIoZSl7cmV0dXJuIHAuaXNWYWxpZEVsZW1lbnQoZSkmJmUudHlwZT09PW9ifWZ1bmN0aW9uIGxiKGUsdCl7Y29uc3Qgbj17Li4udH07Zm9yKGNvbnN0IHIgaW4gdCl7Y29uc3Qgbz1lW3JdLGk9dFtyXTsvXm9uW0EtWl0vLnRlc3Qocik/byYmaT9uW3JdPSguLi5zKT0+e2koLi4ucyksbyguLi5zKX06byYmKG5bcl09byk6cj09PSJzdHlsZSI/bltyXT17Li4ubywuLi5pfTpyPT09ImNsYXNzTmFtZSImJihuW3JdPVtvLGldLmZpbHRlcihCb29sZWFuKS5qb2luKCIgIikpfXJldHVybnsuLi5lLC4uLm59fWNvbnN0IHNiPVsiYSIsImJ1dHRvbiIsImRpdiIsImZvcm0iLCJoMiIsImgzIiwiaW1nIiwiaW5wdXQiLCJsYWJlbCIsImxpIiwibmF2Iiwib2wiLCJwIiwic3BhbiIsInN2ZyIsInVsIl0sTGU9c2IucmVkdWNlKChlLHQpPT57Y29uc3Qgbj1wLmZvcndhcmRSZWYoKHIsbyk9Pntjb25zdHthc0NoaWxkOmksLi4ubH09cixzPWk/VGw6dDtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pnt3aW5kb3dbU3ltYm9sLmZvcigicmFkaXgtdWkiKV09ITB9LFtdKSxwLmNyZWF0ZUVsZW1lbnQocyx0ZSh7fSxsLHtyZWY6b30pKX0pO3JldHVybiBuLmRpc3BsYXlOYW1lPWBQcmltaXRpdmUuJHt0fWAsey4uLmUsW3RdOm59fSx7fSk7ZnVuY3Rpb24gYWIoZSx0KXtlJiZHci5mbHVzaFN5bmMoKCk9PmUuZGlzcGF0Y2hFdmVudCh0KSl9Y29uc3QgVG49Z2xvYmFsVGhpcyE9bnVsbCYmZ2xvYmFsVGhpcy5kb2N1bWVudD9wLnVzZUxheW91dEVmZmVjdDooKT0+e307ZnVuY3Rpb24gdWIoZSx0KXtyZXR1cm4gcC51c2VSZWR1Y2VyKChuLHIpPT57Y29uc3Qgbz10W25dW3JdO3JldHVybiBvPz9ufSxlKX1jb25zdCB6bD1lPT57Y29uc3R7cHJlc2VudDp0LGNoaWxkcmVuOm59PWUscj1jYih0KSxvPXR5cGVvZiBuPT0iZnVuY3Rpb24iP24oe3ByZXNlbnQ6ci5pc1ByZXNlbnR9KTpwLkNoaWxkcmVuLm9ubHkobiksaT1RZShyLnJlZixvLnJlZik7cmV0dXJuIHR5cGVvZiBuPT0iZnVuY3Rpb24ifHxyLmlzUHJlc2VudD9wLmNsb25lRWxlbWVudChvLHtyZWY6aX0pOm51bGx9O3psLmRpc3BsYXlOYW1lPSJQcmVzZW5jZSI7ZnVuY3Rpb24gY2IoZSl7Y29uc3RbdCxuXT1wLnVzZVN0YXRlKCkscj1wLnVzZVJlZih7fSksbz1wLnVzZVJlZihlKSxpPXAudXNlUmVmKCJub25lIiksbD1lPyJtb3VudGVkIjoidW5tb3VudGVkIixbcyxhXT11YihsLHttb3VudGVkOntVTk1PVU5UOiJ1bm1vdW50ZWQiLEFOSU1BVElPTl9PVVQ6InVubW91bnRTdXNwZW5kZWQifSx1bm1vdW50U3VzcGVuZGVkOntNT1VOVDoibW91bnRlZCIsQU5JTUFUSU9OX0VORDoidW5tb3VudGVkIn0sdW5tb3VudGVkOntNT1VOVDoibW91bnRlZCJ9fSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgdT1odShyLmN1cnJlbnQpO2kuY3VycmVudD1zPT09Im1vdW50ZWQiP3U6Im5vbmUifSxbc10pLFRuKCgpPT57Y29uc3QgdT1yLmN1cnJlbnQsYz1vLmN1cnJlbnQ7aWYoYyE9PWUpe2NvbnN0IGY9aS5jdXJyZW50LGg9aHUodSk7ZT9hKCJNT1VOVCIpOmg9PT0ibm9uZSJ8fCh1PT1udWxsP3ZvaWQgMDp1LmRpc3BsYXkpPT09Im5vbmUiP2EoIlVOTU9VTlQiKTphKGMmJmYhPT1oPyJBTklNQVRJT05fT1VUIjoiVU5NT1VOVCIpLG8uY3VycmVudD1lfX0sW2UsYV0pLFRuKCgpPT57aWYodCl7Y29uc3QgdT1kPT57Y29uc3QgaD1odShyLmN1cnJlbnQpLmluY2x1ZGVzKGQuYW5pbWF0aW9uTmFtZSk7ZC50YXJnZXQ9PT10JiZoJiZHci5mbHVzaFN5bmMoKCk9PmEoIkFOSU1BVElPTl9FTkQiKSl9LGM9ZD0+e2QudGFyZ2V0PT09dCYmKGkuY3VycmVudD1odShyLmN1cnJlbnQpKX07cmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uc3RhcnQiLGMpLHQuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uY2FuY2VsIix1KSx0LmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsdSksKCk9Pnt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbnN0YXJ0IixjKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmNhbmNlbCIsdSksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLHUpfX1lbHNlIGEoIkFOSU1BVElPTl9FTkQiKX0sW3QsYV0pLHtpc1ByZXNlbnQ6WyJtb3VudGVkIiwidW5tb3VudFN1c3BlbmRlZCJdLmluY2x1ZGVzKHMpLHJlZjpwLnVzZUNhbGxiYWNrKHU9Pnt1JiYoci5jdXJyZW50PWdldENvbXB1dGVkU3R5bGUodSkpLG4odSl9LFtdKX19ZnVuY3Rpb24gaHUoZSl7cmV0dXJuKGU9PW51bGw/dm9pZCAwOmUuYW5pbWF0aW9uTmFtZSl8fCJub25lIn1mdW5jdGlvbiBUaShlLHQ9W10pe2xldCBuPVtdO2Z1bmN0aW9uIHIoaSxsKXtjb25zdCBzPXAuY3JlYXRlQ29udGV4dChsKSxhPW4ubGVuZ3RoO249Wy4uLm4sbF07ZnVuY3Rpb24gdShkKXtjb25zdHtzY29wZTpmLGNoaWxkcmVuOmgsLi4ubX09ZCxnPShmPT1udWxsP3ZvaWQgMDpmW2VdW2FdKXx8cyxTPXAudXNlTWVtbygoKT0+bSxPYmplY3QudmFsdWVzKG0pKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KGcuUHJvdmlkZXIse3ZhbHVlOlN9LGgpfWZ1bmN0aW9uIGMoZCxmKXtjb25zdCBoPShmPT1udWxsP3ZvaWQgMDpmW2VdW2FdKXx8cyxtPXAudXNlQ29udGV4dChoKTtpZihtKXJldHVybiBtO2lmKGwhPT12b2lkIDApcmV0dXJuIGw7dGhyb3cgbmV3IEVycm9yKGBcYCR7ZH1cYCBtdXN0IGJlIHVzZWQgd2l0aGluIFxgJHtpfVxgYCl9cmV0dXJuIHUuZGlzcGxheU5hbWU9aSsiUHJvdmlkZXIiLFt1LGNdfWNvbnN0IG89KCk9Pntjb25zdCBpPW4ubWFwKGw9PnAuY3JlYXRlQ29udGV4dChsKSk7cmV0dXJuIGZ1bmN0aW9uKHMpe2NvbnN0IGE9KHM9PW51bGw/dm9pZCAwOnNbZV0pfHxpO3JldHVybiBwLnVzZU1lbW8oKCk9Pih7W2BfX3Njb3BlJHtlfWBdOnsuLi5zLFtlXTphfX0pLFtzLGFdKX19O3JldHVybiBvLnNjb3BlTmFtZT1lLFtyLGRiKG8sLi4udCldfWZ1bmN0aW9uIGRiKC4uLmUpe2NvbnN0IHQ9ZVswXTtpZihlLmxlbmd0aD09PTEpcmV0dXJuIHQ7Y29uc3Qgbj0oKT0+e2NvbnN0IHI9ZS5tYXAobz0+KHt1c2VTY29wZTpvKCksc2NvcGVOYW1lOm8uc2NvcGVOYW1lfSkpO3JldHVybiBmdW5jdGlvbihpKXtjb25zdCBsPXIucmVkdWNlKChzLHt1c2VTY29wZTphLHNjb3BlTmFtZTp1fSk9Pntjb25zdCBkPWEoaSlbYF9fc2NvcGUke3V9YF07cmV0dXJuey4uLnMsLi4uZH19LHt9KTtyZXR1cm4gcC51c2VNZW1vKCgpPT4oe1tgX19zY29wZSR7dC5zY29wZU5hbWV9YF06bH0pLFtsXSl9fTtyZXR1cm4gbi5zY29wZU5hbWU9dC5zY29wZU5hbWUsbn1mdW5jdGlvbiBLdChlKXtjb25zdCB0PXAudXNlUmVmKGUpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e3QuY3VycmVudD1lfSkscC51c2VNZW1vKCgpPT4oLi4ubik9Pnt2YXIgcjtyZXR1cm4ocj10LmN1cnJlbnQpPT09bnVsbHx8cj09PXZvaWQgMD92b2lkIDA6ci5jYWxsKHQsLi4ubil9LFtdKX1jb25zdCBmYj1wLmNyZWF0ZUNvbnRleHQodm9pZCAwKTtmdW5jdGlvbiBJZyhlKXtjb25zdCB0PXAudXNlQ29udGV4dChmYik7cmV0dXJuIGV8fHR8fCJsdHIifWZ1bmN0aW9uIERoKGUsW3Qsbl0pe3JldHVybiBNYXRoLm1pbihuLE1hdGgubWF4KHQsZSkpfWZ1bmN0aW9uIEhlKGUsdCx7Y2hlY2tGb3JEZWZhdWx0UHJldmVudGVkOm49ITB9PXt9KXtyZXR1cm4gZnVuY3Rpb24obyl7aWYoZT09bnVsbHx8ZShvKSxuPT09ITF8fCFvLmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuIHQ9PW51bGw/dm9pZCAwOnQobyl9fWZ1bmN0aW9uIGhiKGUsdCl7cmV0dXJuIHAudXNlUmVkdWNlcigobixyKT0+e2NvbnN0IG89dFtuXVtyXTtyZXR1cm4gbz8/bn0sZSl9Y29uc3QgVHc9IlNjcm9sbEFyZWEiLFtidyx6NF09VGkoVHcpLFtwYixWbl09YncoVHcpLGdiPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sdHlwZTpyPSJob3ZlciIsZGlyOm8sc2Nyb2xsSGlkZURlbGF5Omk9NjAwLC4uLmx9PWUsW3MsYV09cC51c2VTdGF0ZShudWxsKSxbdSxjXT1wLnVzZVN0YXRlKG51bGwpLFtkLGZdPXAudXNlU3RhdGUobnVsbCksW2gsbV09cC51c2VTdGF0ZShudWxsKSxbZyxTXT1wLnVzZVN0YXRlKG51bGwpLFt2LHldPXAudXNlU3RhdGUoMCksW3gsd109cC51c2VTdGF0ZSgwKSxbayxiXT1wLnVzZVN0YXRlKCExKSxbVCxOXT1wLnVzZVN0YXRlKCExKSxEPVFlKHQsaj0+YShqKSksTz1JZyhvKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHBiLHtzY29wZTpuLHR5cGU6cixkaXI6TyxzY3JvbGxIaWRlRGVsYXk6aSxzY3JvbGxBcmVhOnMsdmlld3BvcnQ6dSxvblZpZXdwb3J0Q2hhbmdlOmMsY29udGVudDpkLG9uQ29udGVudENoYW5nZTpmLHNjcm9sbGJhclg6aCxvblNjcm9sbGJhclhDaGFuZ2U6bSxzY3JvbGxiYXJYRW5hYmxlZDprLG9uU2Nyb2xsYmFyWEVuYWJsZWRDaGFuZ2U6YixzY3JvbGxiYXJZOmcsb25TY3JvbGxiYXJZQ2hhbmdlOlMsc2Nyb2xsYmFyWUVuYWJsZWQ6VCxvblNjcm9sbGJhcllFbmFibGVkQ2hhbmdlOk4sb25Db3JuZXJXaWR0aENoYW5nZTp5LG9uQ29ybmVySGVpZ2h0Q2hhbmdlOnd9LHAuY3JlYXRlRWxlbWVudChMZS5kaXYsdGUoe2RpcjpPfSxsLHtyZWY6RCxzdHlsZTp7cG9zaXRpb246InJlbGF0aXZlIiwiLS1yYWRpeC1zY3JvbGwtYXJlYS1jb3JuZXItd2lkdGgiOnYrInB4IiwiLS1yYWRpeC1zY3JvbGwtYXJlYS1jb3JuZXItaGVpZ2h0Ijp4KyJweCIsLi4uZS5zdHlsZX19KSkpfSksbWI9IlNjcm9sbEFyZWFWaWV3cG9ydCIsdmI9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNjcm9sbEFyZWE6bixjaGlsZHJlbjpyLC4uLm99PWUsaT1WbihtYixuKSxsPXAudXNlUmVmKG51bGwpLHM9UWUodCxsLGkub25WaWV3cG9ydENoYW5nZSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwscC5jcmVhdGVFbGVtZW50KCJzdHlsZSIse2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MOntfX2h0bWw6IltkYXRhLXJhZGl4LXNjcm9sbC1hcmVhLXZpZXdwb3J0XXtzY3JvbGxiYXItd2lkdGg6bm9uZTstbXMtb3ZlcmZsb3ctc3R5bGU6bm9uZTstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaDt9W2RhdGEtcmFkaXgtc2Nyb2xsLWFyZWEtdmlld3BvcnRdOjotd2Via2l0LXNjcm9sbGJhcntkaXNwbGF5Om5vbmV9In19KSxwLmNyZWF0ZUVsZW1lbnQoTGUuZGl2LHRlKHsiZGF0YS1yYWRpeC1zY3JvbGwtYXJlYS12aWV3cG9ydCI6IiJ9LG8se3JlZjpzLHN0eWxlOntvdmVyZmxvd1g6aS5zY3JvbGxiYXJYRW5hYmxlZD8ic2Nyb2xsIjoiaGlkZGVuIixvdmVyZmxvd1k6aS5zY3JvbGxiYXJZRW5hYmxlZD8ic2Nyb2xsIjoiaGlkZGVuIiwuLi5lLnN0eWxlfX0pLHAuY3JlYXRlRWxlbWVudCgiZGl2Iix7cmVmOmkub25Db250ZW50Q2hhbmdlLHN0eWxlOnttaW5XaWR0aDoiMTAwJSIsZGlzcGxheToidGFibGUifX0scikpKX0pLFlyPSJTY3JvbGxBcmVhU2Nyb2xsYmFyIixOdz1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtmb3JjZU1vdW50Om4sLi4ucn09ZSxvPVZuKFlyLGUuX19zY29wZVNjcm9sbEFyZWEpLHtvblNjcm9sbGJhclhFbmFibGVkQ2hhbmdlOmksb25TY3JvbGxiYXJZRW5hYmxlZENoYW5nZTpsfT1vLHM9ZS5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIjtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PihzP2koITApOmwoITApLCgpPT57cz9pKCExKTpsKCExKX0pLFtzLGksbF0pLG8udHlwZT09PSJob3ZlciI/cC5jcmVhdGVFbGVtZW50KHliLHRlKHt9LHIse3JlZjp0LGZvcmNlTW91bnQ6bn0pKTpvLnR5cGU9PT0ic2Nyb2xsIj9wLmNyZWF0ZUVsZW1lbnQoeGIsdGUoe30scix7cmVmOnQsZm9yY2VNb3VudDpufSkpOm8udHlwZT09PSJhdXRvIj9wLmNyZWF0ZUVsZW1lbnQoUncsdGUoe30scix7cmVmOnQsZm9yY2VNb3VudDpufSkpOm8udHlwZT09PSJhbHdheXMiP3AuY3JlYXRlRWxlbWVudChqZyx0ZSh7fSxyLHtyZWY6dH0pKTpudWxsfSkseWI9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Zm9yY2VNb3VudDpuLC4uLnJ9PWUsbz1WbihZcixlLl9fc2NvcGVTY3JvbGxBcmVhKSxbaSxsXT1wLnVzZVN0YXRlKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBzPW8uc2Nyb2xsQXJlYTtsZXQgYT0wO2lmKHMpe2NvbnN0IHU9KCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KGEpLGwoITApfSxjPSgpPT57YT13aW5kb3cuc2V0VGltZW91dCgoKT0+bCghMSksby5zY3JvbGxIaWRlRGVsYXkpfTtyZXR1cm4gcy5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZW50ZXIiLHUpLHMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmxlYXZlIixjKSwoKT0+e3dpbmRvdy5jbGVhclRpbWVvdXQoYSkscy5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyZW50ZXIiLHUpLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmxlYXZlIixjKX19fSxbby5zY3JvbGxBcmVhLG8uc2Nyb2xsSGlkZURlbGF5XSkscC5jcmVhdGVFbGVtZW50KHpsLHtwcmVzZW50Om58fGl9LHAuY3JlYXRlRWxlbWVudChSdyx0ZSh7ImRhdGEtc3RhdGUiOmk/InZpc2libGUiOiJoaWRkZW4ifSxyLHtyZWY6dH0pKSl9KSx4Yj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtmb3JjZU1vdW50Om4sLi4ucn09ZSxvPVZuKFlyLGUuX19zY29wZVNjcm9sbEFyZWEpLGk9ZS5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIixsPWNkKCgpPT5hKCJTQ1JPTExfRU5EIiksMTAwKSxbcyxhXT1oYigiaGlkZGVuIix7aGlkZGVuOntTQ1JPTEw6InNjcm9sbGluZyJ9LHNjcm9sbGluZzp7U0NST0xMX0VORDoiaWRsZSIsUE9JTlRFUl9FTlRFUjoiaW50ZXJhY3RpbmcifSxpbnRlcmFjdGluZzp7U0NST0xMOiJpbnRlcmFjdGluZyIsUE9JTlRFUl9MRUFWRToiaWRsZSJ9LGlkbGU6e0hJREU6ImhpZGRlbiIsU0NST0xMOiJzY3JvbGxpbmciLFBPSU5URVJfRU5URVI6ImludGVyYWN0aW5nIn19KTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntpZihzPT09ImlkbGUiKXtjb25zdCB1PXdpbmRvdy5zZXRUaW1lb3V0KCgpPT5hKCJISURFIiksby5zY3JvbGxIaWRlRGVsYXkpO3JldHVybigpPT53aW5kb3cuY2xlYXJUaW1lb3V0KHUpfX0sW3Msby5zY3JvbGxIaWRlRGVsYXksYV0pLHAudXNlRWZmZWN0KCgpPT57Y29uc3QgdT1vLnZpZXdwb3J0LGM9aT8ic2Nyb2xsTGVmdCI6InNjcm9sbFRvcCI7aWYodSl7bGV0IGQ9dVtjXTtjb25zdCBmPSgpPT57Y29uc3QgaD11W2NdO2QhPT1oJiYoYSgiU0NST0xMIiksbCgpKSxkPWh9O3JldHVybiB1LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZiksKCk9PnUucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmKX19LFtvLnZpZXdwb3J0LGksYSxsXSkscC5jcmVhdGVFbGVtZW50KHpsLHtwcmVzZW50Om58fHMhPT0iaGlkZGVuIn0scC5jcmVhdGVFbGVtZW50KGpnLHRlKHsiZGF0YS1zdGF0ZSI6cz09PSJoaWRkZW4iPyJoaWRkZW4iOiJ2aXNpYmxlIn0scix7cmVmOnQsb25Qb2ludGVyRW50ZXI6SGUoZS5vblBvaW50ZXJFbnRlciwoKT0+YSgiUE9JTlRFUl9FTlRFUiIpKSxvblBvaW50ZXJMZWF2ZTpIZShlLm9uUG9pbnRlckxlYXZlLCgpPT5hKCJQT0lOVEVSX0xFQVZFIikpfSkpKX0pLFJ3PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0IG49Vm4oWXIsZS5fX3Njb3BlU2Nyb2xsQXJlYSkse2ZvcmNlTW91bnQ6ciwuLi5vfT1lLFtpLGxdPXAudXNlU3RhdGUoITEpLHM9ZS5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIixhPWNkKCgpPT57aWYobi52aWV3cG9ydCl7Y29uc3QgdT1uLnZpZXdwb3J0Lm9mZnNldFdpZHRoPG4udmlld3BvcnQuc2Nyb2xsV2lkdGgsYz1uLnZpZXdwb3J0Lm9mZnNldEhlaWdodDxuLnZpZXdwb3J0LnNjcm9sbEhlaWdodDtsKHM/dTpjKX19LDEwKTtyZXR1cm4gYmwobi52aWV3cG9ydCxhKSxibChuLmNvbnRlbnQsYSkscC5jcmVhdGVFbGVtZW50KHpsLHtwcmVzZW50OnJ8fGl9LHAuY3JlYXRlRWxlbWVudChqZyx0ZSh7ImRhdGEtc3RhdGUiOmk/InZpc2libGUiOiJoaWRkZW4ifSxvLHtyZWY6dH0pKSl9KSxqZz1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtvcmllbnRhdGlvbjpuPSJ2ZXJ0aWNhbCIsLi4ucn09ZSxvPVZuKFlyLGUuX19zY29wZVNjcm9sbEFyZWEpLGk9cC51c2VSZWYobnVsbCksbD1wLnVzZVJlZigwKSxbcyxhXT1wLnVzZVN0YXRlKHtjb250ZW50OjAsdmlld3BvcnQ6MCxzY3JvbGxiYXI6e3NpemU6MCxwYWRkaW5nU3RhcnQ6MCxwYWRkaW5nRW5kOjB9fSksdT1NdyhzLnZpZXdwb3J0LHMuY29udGVudCksYz17Li4ucixzaXplczpzLG9uU2l6ZXNDaGFuZ2U6YSxoYXNUaHVtYjp1PjAmJnU8MSxvblRodW1iQ2hhbmdlOmY9PmkuY3VycmVudD1mLG9uVGh1bWJQb2ludGVyVXA6KCk9PmwuY3VycmVudD0wLG9uVGh1bWJQb2ludGVyRG93bjpmPT5sLmN1cnJlbnQ9Zn07ZnVuY3Rpb24gZChmLGgpe3JldHVybiBUYihmLGwuY3VycmVudCxzLGgpfXJldHVybiBuPT09Imhvcml6b250YWwiP3AuY3JlYXRlRWxlbWVudCh3Yix0ZSh7fSxjLHtyZWY6dCxvblRodW1iUG9zaXRpb25DaGFuZ2U6KCk9PntpZihvLnZpZXdwb3J0JiZpLmN1cnJlbnQpe2NvbnN0IGY9by52aWV3cG9ydC5zY3JvbGxMZWZ0LGg9ZnkoZixzLG8uZGlyKTtpLmN1cnJlbnQuc3R5bGUudHJhbnNmb3JtPWB0cmFuc2xhdGUzZCgke2h9cHgsIDAsIDApYH19LG9uV2hlZWxTY3JvbGw6Zj0+e28udmlld3BvcnQmJihvLnZpZXdwb3J0LnNjcm9sbExlZnQ9Zil9LG9uRHJhZ1Njcm9sbDpmPT57by52aWV3cG9ydCYmKG8udmlld3BvcnQuc2Nyb2xsTGVmdD1kKGYsby5kaXIpKX19KSk6bj09PSJ2ZXJ0aWNhbCI/cC5jcmVhdGVFbGVtZW50KF9iLHRlKHt9LGMse3JlZjp0LG9uVGh1bWJQb3NpdGlvbkNoYW5nZTooKT0+e2lmKG8udmlld3BvcnQmJmkuY3VycmVudCl7Y29uc3QgZj1vLnZpZXdwb3J0LnNjcm9sbFRvcCxoPWZ5KGYscyk7aS5jdXJyZW50LnN0eWxlLnRyYW5zZm9ybT1gdHJhbnNsYXRlM2QoMCwgJHtofXB4LCAwKWB9fSxvbldoZWVsU2Nyb2xsOmY9PntvLnZpZXdwb3J0JiYoby52aWV3cG9ydC5zY3JvbGxUb3A9Zil9LG9uRHJhZ1Njcm9sbDpmPT57by52aWV3cG9ydCYmKG8udmlld3BvcnQuc2Nyb2xsVG9wPWQoZikpfX0pKTpudWxsfSksd2I9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7c2l6ZXM6bixvblNpemVzQ2hhbmdlOnIsLi4ub309ZSxpPVZuKFlyLGUuX19zY29wZVNjcm9sbEFyZWEpLFtsLHNdPXAudXNlU3RhdGUoKSxhPXAudXNlUmVmKG51bGwpLHU9UWUodCxhLGkub25TY3JvbGxiYXJYQ2hhbmdlKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PnthLmN1cnJlbnQmJnMoZ2V0Q29tcHV0ZWRTdHlsZShhLmN1cnJlbnQpKX0sW2FdKSxwLmNyZWF0ZUVsZW1lbnQoT3csdGUoeyJkYXRhLW9yaWVudGF0aW9uIjoiaG9yaXpvbnRhbCJ9LG8se3JlZjp1LHNpemVzOm4sc3R5bGU6e2JvdHRvbTowLGxlZnQ6aS5kaXI9PT0icnRsIj8idmFyKC0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLXdpZHRoKSI6MCxyaWdodDppLmRpcj09PSJsdHIiPyJ2YXIoLS1yYWRpeC1zY3JvbGwtYXJlYS1jb3JuZXItd2lkdGgpIjowLCItLXJhZGl4LXNjcm9sbC1hcmVhLXRodW1iLXdpZHRoIjp1ZChuKSsicHgiLC4uLmUuc3R5bGV9LG9uVGh1bWJQb2ludGVyRG93bjpjPT5lLm9uVGh1bWJQb2ludGVyRG93bihjLngpLG9uRHJhZ1Njcm9sbDpjPT5lLm9uRHJhZ1Njcm9sbChjLngpLG9uV2hlZWxTY3JvbGw6KGMsZCk9PntpZihpLnZpZXdwb3J0KXtjb25zdCBmPWkudmlld3BvcnQuc2Nyb2xsTGVmdCtjLmRlbHRhWDtlLm9uV2hlZWxTY3JvbGwoZiksRHcoZixkKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sb25SZXNpemU6KCk9PnthLmN1cnJlbnQmJmkudmlld3BvcnQmJmwmJnIoe2NvbnRlbnQ6aS52aWV3cG9ydC5zY3JvbGxXaWR0aCx2aWV3cG9ydDppLnZpZXdwb3J0Lm9mZnNldFdpZHRoLHNjcm9sbGJhcjp7c2l6ZTphLmN1cnJlbnQuY2xpZW50V2lkdGgscGFkZGluZ1N0YXJ0OnljKGwucGFkZGluZ0xlZnQpLHBhZGRpbmdFbmQ6eWMobC5wYWRkaW5nUmlnaHQpfX0pfX0pKX0pLF9iPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e3NpemVzOm4sb25TaXplc0NoYW5nZTpyLC4uLm99PWUsaT1WbihZcixlLl9fc2NvcGVTY3JvbGxBcmVhKSxbbCxzXT1wLnVzZVN0YXRlKCksYT1wLnVzZVJlZihudWxsKSx1PVFlKHQsYSxpLm9uU2Nyb2xsYmFyWUNoYW5nZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57YS5jdXJyZW50JiZzKGdldENvbXB1dGVkU3R5bGUoYS5jdXJyZW50KSl9LFthXSkscC5jcmVhdGVFbGVtZW50KE93LHRlKHsiZGF0YS1vcmllbnRhdGlvbiI6InZlcnRpY2FsIn0sbyx7cmVmOnUsc2l6ZXM6bixzdHlsZTp7dG9wOjAscmlnaHQ6aS5kaXI9PT0ibHRyIj8wOnZvaWQgMCxsZWZ0OmkuZGlyPT09InJ0bCI/MDp2b2lkIDAsYm90dG9tOiJ2YXIoLS1yYWRpeC1zY3JvbGwtYXJlYS1jb3JuZXItaGVpZ2h0KSIsIi0tcmFkaXgtc2Nyb2xsLWFyZWEtdGh1bWItaGVpZ2h0Ijp1ZChuKSsicHgiLC4uLmUuc3R5bGV9LG9uVGh1bWJQb2ludGVyRG93bjpjPT5lLm9uVGh1bWJQb2ludGVyRG93bihjLnkpLG9uRHJhZ1Njcm9sbDpjPT5lLm9uRHJhZ1Njcm9sbChjLnkpLG9uV2hlZWxTY3JvbGw6KGMsZCk9PntpZihpLnZpZXdwb3J0KXtjb25zdCBmPWkudmlld3BvcnQuc2Nyb2xsVG9wK2MuZGVsdGFZO2Uub25XaGVlbFNjcm9sbChmKSxEdyhmLGQpJiZjLnByZXZlbnREZWZhdWx0KCl9fSxvblJlc2l6ZTooKT0+e2EuY3VycmVudCYmaS52aWV3cG9ydCYmbCYmcih7Y29udGVudDppLnZpZXdwb3J0LnNjcm9sbEhlaWdodCx2aWV3cG9ydDppLnZpZXdwb3J0Lm9mZnNldEhlaWdodCxzY3JvbGxiYXI6e3NpemU6YS5jdXJyZW50LmNsaWVudEhlaWdodCxwYWRkaW5nU3RhcnQ6eWMobC5wYWRkaW5nVG9wKSxwYWRkaW5nRW5kOnljKGwucGFkZGluZ0JvdHRvbSl9fSl9fSkpfSksW1NiLFB3XT1idyhZciksT3c9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNjcm9sbEFyZWE6bixzaXplczpyLGhhc1RodW1iOm8sb25UaHVtYkNoYW5nZTppLG9uVGh1bWJQb2ludGVyVXA6bCxvblRodW1iUG9pbnRlckRvd246cyxvblRodW1iUG9zaXRpb25DaGFuZ2U6YSxvbkRyYWdTY3JvbGw6dSxvbldoZWVsU2Nyb2xsOmMsb25SZXNpemU6ZCwuLi5mfT1lLGg9Vm4oWXIsbiksW20sZ109cC51c2VTdGF0ZShudWxsKSxTPVFlKHQsRD0+ZyhEKSksdj1wLnVzZVJlZihudWxsKSx5PXAudXNlUmVmKCIiKSx4PWgudmlld3BvcnQsdz1yLmNvbnRlbnQtci52aWV3cG9ydCxrPUt0KGMpLGI9S3QoYSksVD1jZChkLDEwKTtmdW5jdGlvbiBOKEQpe2lmKHYuY3VycmVudCl7Y29uc3QgTz1ELmNsaWVudFgtdi5jdXJyZW50LmxlZnQsaj1ELmNsaWVudFktdi5jdXJyZW50LnRvcDt1KHt4Ok8seTpqfSl9fXJldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IEQ9Tz0+e2NvbnN0IGo9Ty50YXJnZXQ7KG09PW51bGw/dm9pZCAwOm0uY29udGFpbnMoaikpJiZrKE8sdyl9O3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsRCx7cGFzc2l2ZTohMX0pLCgpPT5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3aGVlbCIsRCx7cGFzc2l2ZTohMX0pfSxbeCxtLHcsa10pLHAudXNlRWZmZWN0KGIsW3IsYl0pLGJsKG0sVCksYmwoaC5jb250ZW50LFQpLHAuY3JlYXRlRWxlbWVudChTYix7c2NvcGU6bixzY3JvbGxiYXI6bSxoYXNUaHVtYjpvLG9uVGh1bWJDaGFuZ2U6S3QoaSksb25UaHVtYlBvaW50ZXJVcDpLdChsKSxvblRodW1iUG9zaXRpb25DaGFuZ2U6YixvblRodW1iUG9pbnRlckRvd246S3Qocyl9LHAuY3JlYXRlRWxlbWVudChMZS5kaXYsdGUoe30sZix7cmVmOlMsc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsLi4uZi5zdHlsZX0sb25Qb2ludGVyRG93bjpIZShlLm9uUG9pbnRlckRvd24sRD0+e0QuYnV0dG9uPT09MCYmKEQudGFyZ2V0LnNldFBvaW50ZXJDYXB0dXJlKEQucG9pbnRlcklkKSx2LmN1cnJlbnQ9bS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx5LmN1cnJlbnQ9ZG9jdW1lbnQuYm9keS5zdHlsZS53ZWJraXRVc2VyU2VsZWN0LGRvY3VtZW50LmJvZHkuc3R5bGUud2Via2l0VXNlclNlbGVjdD0ibm9uZSIsaC52aWV3cG9ydCYmKGgudmlld3BvcnQuc3R5bGUuc2Nyb2xsQmVoYXZpb3I9ImF1dG8iKSxOKEQpKX0pLG9uUG9pbnRlck1vdmU6SGUoZS5vblBvaW50ZXJNb3ZlLE4pLG9uUG9pbnRlclVwOkhlKGUub25Qb2ludGVyVXAsRD0+e2NvbnN0IE89RC50YXJnZXQ7Ty5oYXNQb2ludGVyQ2FwdHVyZShELnBvaW50ZXJJZCkmJk8ucmVsZWFzZVBvaW50ZXJDYXB0dXJlKEQucG9pbnRlcklkKSxkb2N1bWVudC5ib2R5LnN0eWxlLndlYmtpdFVzZXJTZWxlY3Q9eS5jdXJyZW50LGgudmlld3BvcnQmJihoLnZpZXdwb3J0LnN0eWxlLnNjcm9sbEJlaGF2aW9yPSIiKSx2LmN1cnJlbnQ9bnVsbH0pfSkpKX0pLEloPSJTY3JvbGxBcmVhVGh1bWIiLEViPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e2ZvcmNlTW91bnQ6biwuLi5yfT1lLG89UHcoSWgsZS5fX3Njb3BlU2Nyb2xsQXJlYSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudCh6bCx7cHJlc2VudDpufHxvLmhhc1RodW1ifSxwLmNyZWF0ZUVsZW1lbnQoQ2IsdGUoe3JlZjp0fSxyKSkpfSksQ2I9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNjcm9sbEFyZWE6bixzdHlsZTpyLC4uLm99PWUsaT1WbihJaCxuKSxsPVB3KEloLG4pLHtvblRodW1iUG9zaXRpb25DaGFuZ2U6c309bCxhPVFlKHQsZD0+bC5vblRodW1iQ2hhbmdlKGQpKSx1PXAudXNlUmVmKCksYz1jZCgoKT0+e3UuY3VycmVudCYmKHUuY3VycmVudCgpLHUuY3VycmVudD12b2lkIDApfSwxMDApO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IGQ9aS52aWV3cG9ydDtpZihkKXtjb25zdCBmPSgpPT57aWYoYygpLCF1LmN1cnJlbnQpe2NvbnN0IGg9YmIoZCxzKTt1LmN1cnJlbnQ9aCxzKCl9fTtyZXR1cm4gcygpLGQuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmKSwoKT0+ZC5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLGYpfX0sW2kudmlld3BvcnQsYyxzXSkscC5jcmVhdGVFbGVtZW50KExlLmRpdix0ZSh7ImRhdGEtc3RhdGUiOmwuaGFzVGh1bWI/InZpc2libGUiOiJoaWRkZW4ifSxvLHtyZWY6YSxzdHlsZTp7d2lkdGg6InZhcigtLXJhZGl4LXNjcm9sbC1hcmVhLXRodW1iLXdpZHRoKSIsaGVpZ2h0OiJ2YXIoLS1yYWRpeC1zY3JvbGwtYXJlYS10aHVtYi1oZWlnaHQpIiwuLi5yfSxvblBvaW50ZXJEb3duQ2FwdHVyZTpIZShlLm9uUG9pbnRlckRvd25DYXB0dXJlLGQ9Pntjb25zdCBoPWQudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG09ZC5jbGllbnRYLWgubGVmdCxnPWQuY2xpZW50WS1oLnRvcDtsLm9uVGh1bWJQb2ludGVyRG93bih7eDptLHk6Z30pfSksb25Qb2ludGVyVXA6SGUoZS5vblBvaW50ZXJVcCxsLm9uVGh1bWJQb2ludGVyVXApfSkpfSksQXc9IlNjcm9sbEFyZWFDb3JuZXIiLCRiPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0IG49Vm4oQXcsZS5fX3Njb3BlU2Nyb2xsQXJlYSkscj0hIShuLnNjcm9sbGJhclgmJm4uc2Nyb2xsYmFyWSk7cmV0dXJuIG4udHlwZSE9PSJzY3JvbGwiJiZyP3AuY3JlYXRlRWxlbWVudChrYix0ZSh7fSxlLHtyZWY6dH0pKTpudWxsfSksa2I9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNjcm9sbEFyZWE6biwuLi5yfT1lLG89Vm4oQXcsbiksW2ksbF09cC51c2VTdGF0ZSgwKSxbcyxhXT1wLnVzZVN0YXRlKDApLHU9ISEoaSYmcyk7cmV0dXJuIGJsKG8uc2Nyb2xsYmFyWCwoKT0+e3ZhciBjO2NvbnN0IGQ9KChjPW8uc2Nyb2xsYmFyWCk9PT1udWxsfHxjPT09dm9pZCAwP3ZvaWQgMDpjLm9mZnNldEhlaWdodCl8fDA7by5vbkNvcm5lckhlaWdodENoYW5nZShkKSxhKGQpfSksYmwoby5zY3JvbGxiYXJZLCgpPT57dmFyIGM7Y29uc3QgZD0oKGM9by5zY3JvbGxiYXJZKT09PW51bGx8fGM9PT12b2lkIDA/dm9pZCAwOmMub2Zmc2V0V2lkdGgpfHwwO28ub25Db3JuZXJXaWR0aENoYW5nZShkKSxsKGQpfSksdT9wLmNyZWF0ZUVsZW1lbnQoTGUuZGl2LHRlKHt9LHIse3JlZjp0LHN0eWxlOnt3aWR0aDppLGhlaWdodDpzLHBvc2l0aW9uOiJhYnNvbHV0ZSIscmlnaHQ6by5kaXI9PT0ibHRyIj8wOnZvaWQgMCxsZWZ0Om8uZGlyPT09InJ0bCI/MDp2b2lkIDAsYm90dG9tOjAsLi4uZS5zdHlsZX19KSk6bnVsbH0pO2Z1bmN0aW9uIHljKGUpe3JldHVybiBlP3BhcnNlSW50KGUsMTApOjB9ZnVuY3Rpb24gTXcoZSx0KXtjb25zdCBuPWUvdDtyZXR1cm4gaXNOYU4obik/MDpufWZ1bmN0aW9uIHVkKGUpe2NvbnN0IHQ9TXcoZS52aWV3cG9ydCxlLmNvbnRlbnQpLG49ZS5zY3JvbGxiYXIucGFkZGluZ1N0YXJ0K2Uuc2Nyb2xsYmFyLnBhZGRpbmdFbmQscj0oZS5zY3JvbGxiYXIuc2l6ZS1uKSp0O3JldHVybiBNYXRoLm1heChyLDE4KX1mdW5jdGlvbiBUYihlLHQsbixyPSJsdHIiKXtjb25zdCBvPXVkKG4pLGk9by8yLGw9dHx8aSxzPW8tbCxhPW4uc2Nyb2xsYmFyLnBhZGRpbmdTdGFydCtsLHU9bi5zY3JvbGxiYXIuc2l6ZS1uLnNjcm9sbGJhci5wYWRkaW5nRW5kLXMsYz1uLmNvbnRlbnQtbi52aWV3cG9ydCxkPXI9PT0ibHRyIj9bMCxjXTpbYyotMSwwXTtyZXR1cm4gTHcoW2EsdV0sZCkoZSl9ZnVuY3Rpb24gZnkoZSx0LG49Imx0ciIpe2NvbnN0IHI9dWQodCksbz10LnNjcm9sbGJhci5wYWRkaW5nU3RhcnQrdC5zY3JvbGxiYXIucGFkZGluZ0VuZCxpPXQuc2Nyb2xsYmFyLnNpemUtbyxsPXQuY29udGVudC10LnZpZXdwb3J0LHM9aS1yLGE9bj09PSJsdHIiP1swLGxdOltsKi0xLDBdLHU9RGgoZSxhKTtyZXR1cm4gTHcoWzAsbF0sWzAsc10pKHUpfWZ1bmN0aW9uIEx3KGUsdCl7cmV0dXJuIG49PntpZihlWzBdPT09ZVsxXXx8dFswXT09PXRbMV0pcmV0dXJuIHRbMF07Y29uc3Qgcj0odFsxXS10WzBdKS8oZVsxXS1lWzBdKTtyZXR1cm4gdFswXStyKihuLWVbMF0pfX1mdW5jdGlvbiBEdyhlLHQpe3JldHVybiBlPjAmJmU8dH1jb25zdCBiYj0oZSx0PSgpPT57fSk9PntsZXQgbj17bGVmdDplLnNjcm9sbExlZnQsdG9wOmUuc2Nyb2xsVG9wfSxyPTA7cmV0dXJuIGZ1bmN0aW9uIG8oKXtjb25zdCBpPXtsZWZ0OmUuc2Nyb2xsTGVmdCx0b3A6ZS5zY3JvbGxUb3B9LGw9bi5sZWZ0IT09aS5sZWZ0LHM9bi50b3AhPT1pLnRvcDsobHx8cykmJnQoKSxuPWkscj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKG8pfSgpLCgpPT53aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUocil9O2Z1bmN0aW9uIGNkKGUsdCl7Y29uc3Qgbj1LdChlKSxyPXAudXNlUmVmKDApO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+KCk9PndpbmRvdy5jbGVhclRpbWVvdXQoci5jdXJyZW50KSxbXSkscC51c2VDYWxsYmFjaygoKT0+e3dpbmRvdy5jbGVhclRpbWVvdXQoci5jdXJyZW50KSxyLmN1cnJlbnQ9d2luZG93LnNldFRpbWVvdXQobix0KX0sW24sdF0pfWZ1bmN0aW9uIGJsKGUsdCl7Y29uc3Qgbj1LdCh0KTtUbigoKT0+e2xldCByPTA7aWYoZSl7Y29uc3Qgbz1uZXcgUmVzaXplT2JzZXJ2ZXIoKCk9PntjYW5jZWxBbmltYXRpb25GcmFtZShyKSxyPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobil9KTtyZXR1cm4gby5vYnNlcnZlKGUpLCgpPT57d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHIpLG8udW5vYnNlcnZlKGUpfX19LFtlLG5dKX1jb25zdCBJdz1nYixOYj12YixSYj0kYjtmdW5jdGlvbiBqdyhlKXt2YXIgdCxuLHI9IiI7aWYodHlwZW9mIGU9PSJzdHJpbmcifHx0eXBlb2YgZT09Im51bWJlciIpcis9ZTtlbHNlIGlmKHR5cGVvZiBlPT0ib2JqZWN0IilpZihBcnJheS5pc0FycmF5KGUpKWZvcih0PTA7dDxlLmxlbmd0aDt0KyspZVt0XSYmKG49ancoZVt0XSkpJiYociYmKHIrPSIgIikscis9bik7ZWxzZSBmb3IodCBpbiBlKWVbdF0mJihyJiYocis9IiAiKSxyKz10KTtyZXR1cm4gcn1mdW5jdGlvbiBQYigpe2Zvcih2YXIgZSx0LG49MCxyPSIiO248YXJndW1lbnRzLmxlbmd0aDspKGU9YXJndW1lbnRzW24rK10pJiYodD1qdyhlKSkmJihyJiYocis9IiAiKSxyKz10KTtyZXR1cm4gcn1jb25zdCB6Zz0iLSI7ZnVuY3Rpb24gT2IoZSl7Y29uc3QgdD1NYihlKSx7Y29uZmxpY3RpbmdDbGFzc0dyb3VwczpuLGNvbmZsaWN0aW5nQ2xhc3NHcm91cE1vZGlmaWVyczpyfT1lO2Z1bmN0aW9uIG8obCl7Y29uc3Qgcz1sLnNwbGl0KHpnKTtyZXR1cm4gc1swXT09PSIiJiZzLmxlbmd0aCE9PTEmJnMuc2hpZnQoKSx6dyhzLHQpfHxBYihsKX1mdW5jdGlvbiBpKGwscyl7Y29uc3QgYT1uW2xdfHxbXTtyZXR1cm4gcyYmcltsXT9bLi4uYSwuLi5yW2xdXTphfXJldHVybntnZXRDbGFzc0dyb3VwSWQ6byxnZXRDb25mbGljdGluZ0NsYXNzR3JvdXBJZHM6aX19ZnVuY3Rpb24gencoZSx0KXt2YXIgbDtpZihlLmxlbmd0aD09PTApcmV0dXJuIHQuY2xhc3NHcm91cElkO2NvbnN0IG49ZVswXSxyPXQubmV4dFBhcnQuZ2V0KG4pLG89cj96dyhlLnNsaWNlKDEpLHIpOnZvaWQgMDtpZihvKXJldHVybiBvO2lmKHQudmFsaWRhdG9ycy5sZW5ndGg9PT0wKXJldHVybjtjb25zdCBpPWUuam9pbih6Zyk7cmV0dXJuKGw9dC52YWxpZGF0b3JzLmZpbmQoKHt2YWxpZGF0b3I6c30pPT5zKGkpKSk9PW51bGw/dm9pZCAwOmwuY2xhc3NHcm91cElkfWNvbnN0IGh5PS9eXFsoLispXF0kLztmdW5jdGlvbiBBYihlKXtpZihoeS50ZXN0KGUpKXtjb25zdCB0PWh5LmV4ZWMoZSlbMV0sbj10PT1udWxsP3ZvaWQgMDp0LnN1YnN0cmluZygwLHQuaW5kZXhPZigiOiIpKTtpZihuKXJldHVybiJhcmJpdHJhcnkuLiIrbn19ZnVuY3Rpb24gTWIoZSl7Y29uc3R7dGhlbWU6dCxwcmVmaXg6bn09ZSxyPXtuZXh0UGFydDpuZXcgTWFwLHZhbGlkYXRvcnM6W119O3JldHVybiBEYihPYmplY3QuZW50cmllcyhlLmNsYXNzR3JvdXBzKSxuKS5mb3JFYWNoKChbaSxsXSk9PntqaChsLHIsaSx0KX0pLHJ9ZnVuY3Rpb24gamgoZSx0LG4scil7ZS5mb3JFYWNoKG89PntpZih0eXBlb2Ygbz09InN0cmluZyIpe2NvbnN0IGk9bz09PSIiP3Q6cHkodCxvKTtpLmNsYXNzR3JvdXBJZD1uO3JldHVybn1pZih0eXBlb2Ygbz09ImZ1bmN0aW9uIil7aWYoTGIobykpe2poKG8ociksdCxuLHIpO3JldHVybn10LnZhbGlkYXRvcnMucHVzaCh7dmFsaWRhdG9yOm8sY2xhc3NHcm91cElkOm59KTtyZXR1cm59T2JqZWN0LmVudHJpZXMobykuZm9yRWFjaCgoW2ksbF0pPT57amgobCxweSh0LGkpLG4scil9KX0pfWZ1bmN0aW9uIHB5KGUsdCl7bGV0IG49ZTtyZXR1cm4gdC5zcGxpdCh6ZykuZm9yRWFjaChyPT57bi5uZXh0UGFydC5oYXMocil8fG4ubmV4dFBhcnQuc2V0KHIse25leHRQYXJ0Om5ldyBNYXAsdmFsaWRhdG9yczpbXX0pLG49bi5uZXh0UGFydC5nZXQocil9KSxufWZ1bmN0aW9uIExiKGUpe3JldHVybiBlLmlzVGhlbWVHZXR0ZXJ9ZnVuY3Rpb24gRGIoZSx0KXtyZXR1cm4gdD9lLm1hcCgoW24scl0pPT57Y29uc3Qgbz1yLm1hcChpPT50eXBlb2YgaT09InN0cmluZyI/dCtpOnR5cGVvZiBpPT0ib2JqZWN0Ij9PYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoaSkubWFwKChbbCxzXSk9Plt0K2wsc10pKTppKTtyZXR1cm5bbixvXX0pOmV9ZnVuY3Rpb24gSWIoZSl7aWYoZTwxKXJldHVybntnZXQ6KCk9Pnt9LHNldDooKT0+e319O2xldCB0PTAsbj1uZXcgTWFwLHI9bmV3IE1hcDtmdW5jdGlvbiBvKGksbCl7bi5zZXQoaSxsKSx0KyssdD5lJiYodD0wLHI9bixuPW5ldyBNYXApfXJldHVybntnZXQoaSl7bGV0IGw9bi5nZXQoaSk7aWYobCE9PXZvaWQgMClyZXR1cm4gbDtpZigobD1yLmdldChpKSkhPT12b2lkIDApcmV0dXJuIG8oaSxsKSxsfSxzZXQoaSxsKXtuLmhhcyhpKT9uLnNldChpLGwpOm8oaSxsKX19fWNvbnN0IEZ3PSIhIjtmdW5jdGlvbiBqYihlKXtjb25zdCB0PWUuc2VwYXJhdG9yLG49dC5sZW5ndGg9PT0xLHI9dFswXSxvPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihsKXtjb25zdCBzPVtdO2xldCBhPTAsdT0wLGM7Zm9yKGxldCBnPTA7ZzxsLmxlbmd0aDtnKyspe2xldCBTPWxbZ107aWYoYT09PTApe2lmKFM9PT1yJiYobnx8bC5zbGljZShnLGcrbyk9PT10KSl7cy5wdXNoKGwuc2xpY2UodSxnKSksdT1nK287Y29udGludWV9aWYoUz09PSIvIil7Yz1nO2NvbnRpbnVlfX1TPT09IlsiP2ErKzpTPT09Il0iJiZhLS19Y29uc3QgZD1zLmxlbmd0aD09PTA/bDpsLnN1YnN0cmluZyh1KSxmPWQuc3RhcnRzV2l0aChGdyksaD1mP2Quc3Vic3RyaW5nKDEpOmQsbT1jJiZjPnU/Yy11OnZvaWQgMDtyZXR1cm57bW9kaWZpZXJzOnMsaGFzSW1wb3J0YW50TW9kaWZpZXI6ZixiYXNlQ2xhc3NOYW1lOmgsbWF5YmVQb3N0Zml4TW9kaWZpZXJQb3NpdGlvbjptfX19ZnVuY3Rpb24gemIoZSl7aWYoZS5sZW5ndGg8PTEpcmV0dXJuIGU7Y29uc3QgdD1bXTtsZXQgbj1bXTtyZXR1cm4gZS5mb3JFYWNoKHI9PntyWzBdPT09IlsiPyh0LnB1c2goLi4ubi5zb3J0KCksciksbj1bXSk6bi5wdXNoKHIpfSksdC5wdXNoKC4uLm4uc29ydCgpKSx0fWZ1bmN0aW9uIEZiKGUpe3JldHVybntjYWNoZTpJYihlLmNhY2hlU2l6ZSksc3BsaXRNb2RpZmllcnM6amIoZSksLi4uT2IoZSl9fWNvbnN0IEJiPS9ccysvO2Z1bmN0aW9uIFdiKGUsdCl7Y29uc3R7c3BsaXRNb2RpZmllcnM6bixnZXRDbGFzc0dyb3VwSWQ6cixnZXRDb25mbGljdGluZ0NsYXNzR3JvdXBJZHM6b309dCxpPW5ldyBTZXQ7cmV0dXJuIGUudHJpbSgpLnNwbGl0KEJiKS5tYXAobD0+e2NvbnN0e21vZGlmaWVyczpzLGhhc0ltcG9ydGFudE1vZGlmaWVyOmEsYmFzZUNsYXNzTmFtZTp1LG1heWJlUG9zdGZpeE1vZGlmaWVyUG9zaXRpb246Y309bihsKTtsZXQgZD1yKGM/dS5zdWJzdHJpbmcoMCxjKTp1KSxmPSEhYztpZighZCl7aWYoIWMpcmV0dXJue2lzVGFpbHdpbmRDbGFzczohMSxvcmlnaW5hbENsYXNzTmFtZTpsfTtpZihkPXIodSksIWQpcmV0dXJue2lzVGFpbHdpbmRDbGFzczohMSxvcmlnaW5hbENsYXNzTmFtZTpsfTtmPSExfWNvbnN0IGg9emIocykuam9pbigiOiIpO3JldHVybntpc1RhaWx3aW5kQ2xhc3M6ITAsbW9kaWZpZXJJZDphP2grRnc6aCxjbGFzc0dyb3VwSWQ6ZCxvcmlnaW5hbENsYXNzTmFtZTpsLGhhc1Bvc3RmaXhNb2RpZmllcjpmfX0pLnJldmVyc2UoKS5maWx0ZXIobD0+e2lmKCFsLmlzVGFpbHdpbmRDbGFzcylyZXR1cm4hMDtjb25zdHttb2RpZmllcklkOnMsY2xhc3NHcm91cElkOmEsaGFzUG9zdGZpeE1vZGlmaWVyOnV9PWwsYz1zK2E7cmV0dXJuIGkuaGFzKGMpPyExOihpLmFkZChjKSxvKGEsdSkuZm9yRWFjaChkPT5pLmFkZChzK2QpKSwhMCl9KS5yZXZlcnNlKCkubWFwKGw9Pmwub3JpZ2luYWxDbGFzc05hbWUpLmpvaW4oIiAiKX1mdW5jdGlvbiBVYigpe2xldCBlPTAsdCxuLHI9IiI7Zm9yKDtlPGFyZ3VtZW50cy5sZW5ndGg7KSh0PWFyZ3VtZW50c1tlKytdKSYmKG49QncodCkpJiYociYmKHIrPSIgIikscis9bik7cmV0dXJuIHJ9ZnVuY3Rpb24gQncoZSl7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiBlO2xldCB0LG49IiI7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspZVtyXSYmKHQ9QncoZVtyXSkpJiYobiYmKG4rPSIgIiksbis9dCk7cmV0dXJuIG59ZnVuY3Rpb24gVmIoZSwuLi50KXtsZXQgbixyLG8saT1sO2Z1bmN0aW9uIGwoYSl7Y29uc3QgdT10LnJlZHVjZSgoYyxkKT0+ZChjKSxlKCkpO3JldHVybiBuPUZiKHUpLHI9bi5jYWNoZS5nZXQsbz1uLmNhY2hlLnNldCxpPXMscyhhKX1mdW5jdGlvbiBzKGEpe2NvbnN0IHU9cihhKTtpZih1KXJldHVybiB1O2NvbnN0IGM9V2IoYSxuKTtyZXR1cm4gbyhhLGMpLGN9cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGkoVWIuYXBwbHkobnVsbCxhcmd1bWVudHMpKX19ZnVuY3Rpb24gV2UoZSl7Y29uc3QgdD1uPT5uW2VdfHxbXTtyZXR1cm4gdC5pc1RoZW1lR2V0dGVyPSEwLHR9Y29uc3QgV3c9L15cWyg/OihbYS16LV0rKTopPyguKylcXSQvaSxIYj0vXlxkK1wvXGQrJC8sS2I9bmV3IFNldChbInB4IiwiZnVsbCIsInNjcmVlbiJdKSxHYj0vXihcZCsoXC5cZCspPyk/KHhzfHNtfG1kfGxnfHhsKSQvLFliPS9cZCsoJXxweHxyP2VtfFtzZGxdP3YoW2h3aWJdfG1pbnxtYXgpfHB0fHBjfGlufGNtfG1tfGNhcHxjaHxleHxyP2xofGNxKHd8aHxpfGJ8bWlufG1heCkpfFxiKGNhbGN8bWlufG1heHxjbGFtcClcKC4rXCl8XjAkLyxYYj0vXi0/KChcZCspP1wuPyhcZCspW2Etel0rfDApXy0/KChcZCspP1wuPyhcZCspW2Etel0rfDApLyxRYj0vXih1cmx8aW1hZ2V8aW1hZ2Utc2V0fGNyb3NzLWZhZGV8ZWxlbWVudHwocmVwZWF0aW5nLSk/KGxpbmVhcnxyYWRpYWx8Y29uaWMpLWdyYWRpZW50KVwoLitcKSQvO2Z1bmN0aW9uIEduKGUpe3JldHVybiB0aShlKXx8S2IuaGFzKGUpfHxIYi50ZXN0KGUpfWZ1bmN0aW9uIHJvKGUpe3JldHVybiBGbChlLCJsZW5ndGgiLG9OKX1mdW5jdGlvbiB0aShlKXtyZXR1cm4hIWUmJiFOdW1iZXIuaXNOYU4oTnVtYmVyKGUpKX1mdW5jdGlvbiBwdShlKXtyZXR1cm4gRmwoZSwibnVtYmVyIix0aSl9ZnVuY3Rpb24gZHMoZSl7cmV0dXJuISFlJiZOdW1iZXIuaXNJbnRlZ2VyKE51bWJlcihlKSl9ZnVuY3Rpb24gSmIoZSl7cmV0dXJuIGUuZW5kc1dpdGgoIiUiKSYmdGkoZS5zbGljZSgwLC0xKSl9ZnVuY3Rpb24geWUoZSl7cmV0dXJuIFd3LnRlc3QoZSl9ZnVuY3Rpb24gb28oZSl7cmV0dXJuIEdiLnRlc3QoZSl9Y29uc3QgWmI9bmV3IFNldChbImxlbmd0aCIsInNpemUiLCJwZXJjZW50YWdlIl0pO2Z1bmN0aW9uIHFiKGUpe3JldHVybiBGbChlLFpiLFV3KX1mdW5jdGlvbiBlTihlKXtyZXR1cm4gRmwoZSwicG9zaXRpb24iLFV3KX1jb25zdCB0Tj1uZXcgU2V0KFsiaW1hZ2UiLCJ1cmwiXSk7ZnVuY3Rpb24gbk4oZSl7cmV0dXJuIEZsKGUsdE4sbE4pfWZ1bmN0aW9uIHJOKGUpe3JldHVybiBGbChlLCIiLGlOKX1mdW5jdGlvbiBmcygpe3JldHVybiEwfWZ1bmN0aW9uIEZsKGUsdCxuKXtjb25zdCByPVd3LmV4ZWMoZSk7cmV0dXJuIHI/clsxXT90eXBlb2YgdD09InN0cmluZyI/clsxXT09PXQ6dC5oYXMoclsxXSk6bihyWzJdKTohMX1mdW5jdGlvbiBvTihlKXtyZXR1cm4gWWIudGVzdChlKX1mdW5jdGlvbiBVdygpe3JldHVybiExfWZ1bmN0aW9uIGlOKGUpe3JldHVybiBYYi50ZXN0KGUpfWZ1bmN0aW9uIGxOKGUpe3JldHVybiBRYi50ZXN0KGUpfWZ1bmN0aW9uIHNOKCl7Y29uc3QgZT1XZSgiY29sb3JzIiksdD1XZSgic3BhY2luZyIpLG49V2UoImJsdXIiKSxyPVdlKCJicmlnaHRuZXNzIiksbz1XZSgiYm9yZGVyQ29sb3IiKSxpPVdlKCJib3JkZXJSYWRpdXMiKSxsPVdlKCJib3JkZXJTcGFjaW5nIikscz1XZSgiYm9yZGVyV2lkdGgiKSxhPVdlKCJjb250cmFzdCIpLHU9V2UoImdyYXlzY2FsZSIpLGM9V2UoImh1ZVJvdGF0ZSIpLGQ9V2UoImludmVydCIpLGY9V2UoImdhcCIpLGg9V2UoImdyYWRpZW50Q29sb3JTdG9wcyIpLG09V2UoImdyYWRpZW50Q29sb3JTdG9wUG9zaXRpb25zIiksZz1XZSgiaW5zZXQiKSxTPVdlKCJtYXJnaW4iKSx2PVdlKCJvcGFjaXR5IikseT1XZSgicGFkZGluZyIpLHg9V2UoInNhdHVyYXRlIiksdz1XZSgic2NhbGUiKSxrPVdlKCJzZXBpYSIpLGI9V2UoInNrZXciKSxUPVdlKCJzcGFjZSIpLE49V2UoInRyYW5zbGF0ZSIpLEQ9KCk9PlsiYXV0byIsImNvbnRhaW4iLCJub25lIl0sTz0oKT0+WyJhdXRvIiwiaGlkZGVuIiwiY2xpcCIsInZpc2libGUiLCJzY3JvbGwiXSxqPSgpPT5bImF1dG8iLHllLHRdLEI9KCk9Plt5ZSx0XSxhZT0oKT0+WyIiLEduLHJvXSxIPSgpPT5bImF1dG8iLHRpLHllXSxHPSgpPT5bImJvdHRvbSIsImNlbnRlciIsImxlZnQiLCJsZWZ0LWJvdHRvbSIsImxlZnQtdG9wIiwicmlnaHQiLCJyaWdodC1ib3R0b20iLCJyaWdodC10b3AiLCJ0b3AiXSxDPSgpPT5bInNvbGlkIiwiZGFzaGVkIiwiZG90dGVkIiwiZG91YmxlIiwibm9uZSJdLCQ9KCk9Plsibm9ybWFsIiwibXVsdGlwbHkiLCJzY3JlZW4iLCJvdmVybGF5IiwiZGFya2VuIiwibGlnaHRlbiIsImNvbG9yLWRvZGdlIiwiY29sb3ItYnVybiIsImhhcmQtbGlnaHQiLCJzb2Z0LWxpZ2h0IiwiZGlmZmVyZW5jZSIsImV4Y2x1c2lvbiIsImh1ZSIsInNhdHVyYXRpb24iLCJjb2xvciIsImx1bWlub3NpdHkiLCJwbHVzLWxpZ2h0ZXIiXSxFPSgpPT5bInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwiYmV0d2VlbiIsImFyb3VuZCIsImV2ZW5seSIsInN0cmV0Y2giXSxBPSgpPT5bIiIsIjAiLHllXSxSPSgpPT5bImF1dG8iLCJhdm9pZCIsImFsbCIsImF2b2lkLXBhZ2UiLCJwYWdlIiwibGVmdCIsInJpZ2h0IiwiY29sdW1uIl0sej0oKT0+W3RpLHB1XSxWPSgpPT5bdGkseWVdO3JldHVybntjYWNoZVNpemU6NTAwLHNlcGFyYXRvcjoiOiIsdGhlbWU6e2NvbG9yczpbZnNdLHNwYWNpbmc6W0duLHJvXSxibHVyOlsibm9uZSIsIiIsb28seWVdLGJyaWdodG5lc3M6eigpLGJvcmRlckNvbG9yOltlXSxib3JkZXJSYWRpdXM6WyJub25lIiwiIiwiZnVsbCIsb28seWVdLGJvcmRlclNwYWNpbmc6QigpLGJvcmRlcldpZHRoOmFlKCksY29udHJhc3Q6eigpLGdyYXlzY2FsZTpBKCksaHVlUm90YXRlOlYoKSxpbnZlcnQ6QSgpLGdhcDpCKCksZ3JhZGllbnRDb2xvclN0b3BzOltlXSxncmFkaWVudENvbG9yU3RvcFBvc2l0aW9uczpbSmIscm9dLGluc2V0OmooKSxtYXJnaW46aigpLG9wYWNpdHk6eigpLHBhZGRpbmc6QigpLHNhdHVyYXRlOnooKSxzY2FsZTp6KCksc2VwaWE6QSgpLHNrZXc6VigpLHNwYWNlOkIoKSx0cmFuc2xhdGU6QigpfSxjbGFzc0dyb3Vwczp7YXNwZWN0Olt7YXNwZWN0OlsiYXV0byIsInNxdWFyZSIsInZpZGVvIix5ZV19XSxjb250YWluZXI6WyJjb250YWluZXIiXSxjb2x1bW5zOlt7Y29sdW1uczpbb29dfV0sImJyZWFrLWFmdGVyIjpbeyJicmVhay1hZnRlciI6UigpfV0sImJyZWFrLWJlZm9yZSI6W3siYnJlYWstYmVmb3JlIjpSKCl9XSwiYnJlYWstaW5zaWRlIjpbeyJicmVhay1pbnNpZGUiOlsiYXV0byIsImF2b2lkIiwiYXZvaWQtcGFnZSIsImF2b2lkLWNvbHVtbiJdfV0sImJveC1kZWNvcmF0aW9uIjpbeyJib3gtZGVjb3JhdGlvbiI6WyJzbGljZSIsImNsb25lIl19XSxib3g6W3tib3g6WyJib3JkZXIiLCJjb250ZW50Il19XSxkaXNwbGF5OlsiYmxvY2siLCJpbmxpbmUtYmxvY2siLCJpbmxpbmUiLCJmbGV4IiwiaW5saW5lLWZsZXgiLCJ0YWJsZSIsImlubGluZS10YWJsZSIsInRhYmxlLWNhcHRpb24iLCJ0YWJsZS1jZWxsIiwidGFibGUtY29sdW1uIiwidGFibGUtY29sdW1uLWdyb3VwIiwidGFibGUtZm9vdGVyLWdyb3VwIiwidGFibGUtaGVhZGVyLWdyb3VwIiwidGFibGUtcm93LWdyb3VwIiwidGFibGUtcm93IiwiZmxvdy1yb290IiwiZ3JpZCIsImlubGluZS1ncmlkIiwiY29udGVudHMiLCJsaXN0LWl0ZW0iLCJoaWRkZW4iXSxmbG9hdDpbe2Zsb2F0OlsicmlnaHQiLCJsZWZ0Iiwibm9uZSJdfV0sY2xlYXI6W3tjbGVhcjpbImxlZnQiLCJyaWdodCIsImJvdGgiLCJub25lIl19XSxpc29sYXRpb246WyJpc29sYXRlIiwiaXNvbGF0aW9uLWF1dG8iXSwib2JqZWN0LWZpdCI6W3tvYmplY3Q6WyJjb250YWluIiwiY292ZXIiLCJmaWxsIiwibm9uZSIsInNjYWxlLWRvd24iXX1dLCJvYmplY3QtcG9zaXRpb24iOlt7b2JqZWN0OlsuLi5HKCkseWVdfV0sb3ZlcmZsb3c6W3tvdmVyZmxvdzpPKCl9XSwib3ZlcmZsb3cteCI6W3sib3ZlcmZsb3cteCI6TygpfV0sIm92ZXJmbG93LXkiOlt7Im92ZXJmbG93LXkiOk8oKX1dLG92ZXJzY3JvbGw6W3tvdmVyc2Nyb2xsOkQoKX1dLCJvdmVyc2Nyb2xsLXgiOlt7Im92ZXJzY3JvbGwteCI6RCgpfV0sIm92ZXJzY3JvbGwteSI6W3sib3ZlcnNjcm9sbC15IjpEKCl9XSxwb3NpdGlvbjpbInN0YXRpYyIsImZpeGVkIiwiYWJzb2x1dGUiLCJyZWxhdGl2ZSIsInN0aWNreSJdLGluc2V0Olt7aW5zZXQ6W2ddfV0sImluc2V0LXgiOlt7Imluc2V0LXgiOltnXX1dLCJpbnNldC15IjpbeyJpbnNldC15IjpbZ119XSxzdGFydDpbe3N0YXJ0OltnXX1dLGVuZDpbe2VuZDpbZ119XSx0b3A6W3t0b3A6W2ddfV0scmlnaHQ6W3tyaWdodDpbZ119XSxib3R0b206W3tib3R0b206W2ddfV0sbGVmdDpbe2xlZnQ6W2ddfV0sdmlzaWJpbGl0eTpbInZpc2libGUiLCJpbnZpc2libGUiLCJjb2xsYXBzZSJdLHo6W3t6OlsiYXV0byIsZHMseWVdfV0sYmFzaXM6W3tiYXNpczpqKCl9XSwiZmxleC1kaXJlY3Rpb24iOlt7ZmxleDpbInJvdyIsInJvdy1yZXZlcnNlIiwiY29sIiwiY29sLXJldmVyc2UiXX1dLCJmbGV4LXdyYXAiOlt7ZmxleDpbIndyYXAiLCJ3cmFwLXJldmVyc2UiLCJub3dyYXAiXX1dLGZsZXg6W3tmbGV4OlsiMSIsImF1dG8iLCJpbml0aWFsIiwibm9uZSIseWVdfV0sZ3Jvdzpbe2dyb3c6QSgpfV0sc2hyaW5rOlt7c2hyaW5rOkEoKX1dLG9yZGVyOlt7b3JkZXI6WyJmaXJzdCIsImxhc3QiLCJub25lIixkcyx5ZV19XSwiZ3JpZC1jb2xzIjpbeyJncmlkLWNvbHMiOltmc119XSwiY29sLXN0YXJ0LWVuZCI6W3tjb2w6WyJhdXRvIix7c3BhbjpbImZ1bGwiLGRzLHllXX0seWVdfV0sImNvbC1zdGFydCI6W3siY29sLXN0YXJ0IjpIKCl9XSwiY29sLWVuZCI6W3siY29sLWVuZCI6SCgpfV0sImdyaWQtcm93cyI6W3siZ3JpZC1yb3dzIjpbZnNdfV0sInJvdy1zdGFydC1lbmQiOlt7cm93OlsiYXV0byIse3NwYW46W2RzLHllXX0seWVdfV0sInJvdy1zdGFydCI6W3sicm93LXN0YXJ0IjpIKCl9XSwicm93LWVuZCI6W3sicm93LWVuZCI6SCgpfV0sImdyaWQtZmxvdyI6W3siZ3JpZC1mbG93IjpbInJvdyIsImNvbCIsImRlbnNlIiwicm93LWRlbnNlIiwiY29sLWRlbnNlIl19XSwiYXV0by1jb2xzIjpbeyJhdXRvLWNvbHMiOlsiYXV0byIsIm1pbiIsIm1heCIsImZyIix5ZV19XSwiYXV0by1yb3dzIjpbeyJhdXRvLXJvd3MiOlsiYXV0byIsIm1pbiIsIm1heCIsImZyIix5ZV19XSxnYXA6W3tnYXA6W2ZdfV0sImdhcC14IjpbeyJnYXAteCI6W2ZdfV0sImdhcC15IjpbeyJnYXAteSI6W2ZdfV0sImp1c3RpZnktY29udGVudCI6W3tqdXN0aWZ5Olsibm9ybWFsIiwuLi5FKCldfV0sImp1c3RpZnktaXRlbXMiOlt7Imp1c3RpZnktaXRlbXMiOlsic3RhcnQiLCJlbmQiLCJjZW50ZXIiLCJzdHJldGNoIl19XSwianVzdGlmeS1zZWxmIjpbeyJqdXN0aWZ5LXNlbGYiOlsiYXV0byIsInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwic3RyZXRjaCJdfV0sImFsaWduLWNvbnRlbnQiOlt7Y29udGVudDpbIm5vcm1hbCIsLi4uRSgpLCJiYXNlbGluZSJdfV0sImFsaWduLWl0ZW1zIjpbe2l0ZW1zOlsic3RhcnQiLCJlbmQiLCJjZW50ZXIiLCJiYXNlbGluZSIsInN0cmV0Y2giXX1dLCJhbGlnbi1zZWxmIjpbe3NlbGY6WyJhdXRvIiwic3RhcnQiLCJlbmQiLCJjZW50ZXIiLCJzdHJldGNoIiwiYmFzZWxpbmUiXX1dLCJwbGFjZS1jb250ZW50IjpbeyJwbGFjZS1jb250ZW50IjpbLi4uRSgpLCJiYXNlbGluZSJdfV0sInBsYWNlLWl0ZW1zIjpbeyJwbGFjZS1pdGVtcyI6WyJzdGFydCIsImVuZCIsImNlbnRlciIsImJhc2VsaW5lIiwic3RyZXRjaCJdfV0sInBsYWNlLXNlbGYiOlt7InBsYWNlLXNlbGYiOlsiYXV0byIsInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwic3RyZXRjaCJdfV0scDpbe3A6W3ldfV0scHg6W3tweDpbeV19XSxweTpbe3B5Olt5XX1dLHBzOlt7cHM6W3ldfV0scGU6W3twZTpbeV19XSxwdDpbe3B0Olt5XX1dLHByOlt7cHI6W3ldfV0scGI6W3twYjpbeV19XSxwbDpbe3BsOlt5XX1dLG06W3ttOltTXX1dLG14Olt7bXg6W1NdfV0sbXk6W3tteTpbU119XSxtczpbe21zOltTXX1dLG1lOlt7bWU6W1NdfV0sbXQ6W3ttdDpbU119XSxtcjpbe21yOltTXX1dLG1iOlt7bWI6W1NdfV0sbWw6W3ttbDpbU119XSwic3BhY2UteCI6W3sic3BhY2UteCI6W1RdfV0sInNwYWNlLXgtcmV2ZXJzZSI6WyJzcGFjZS14LXJldmVyc2UiXSwic3BhY2UteSI6W3sic3BhY2UteSI6W1RdfV0sInNwYWNlLXktcmV2ZXJzZSI6WyJzcGFjZS15LXJldmVyc2UiXSx3Olt7dzpbImF1dG8iLCJtaW4iLCJtYXgiLCJmaXQiLHllLHRdfV0sIm1pbi13IjpbeyJtaW4tdyI6WyJtaW4iLCJtYXgiLCJmaXQiLHllLEduXX1dLCJtYXgtdyI6W3sibWF4LXciOlsiMCIsIm5vbmUiLCJmdWxsIiwibWluIiwibWF4IiwiZml0IiwicHJvc2UiLHtzY3JlZW46W29vXX0sb28seWVdfV0saDpbe2g6W3llLHQsImF1dG8iLCJtaW4iLCJtYXgiLCJmaXQiXX1dLCJtaW4taCI6W3sibWluLWgiOlsibWluIiwibWF4IiwiZml0IixHbix5ZV19XSwibWF4LWgiOlt7Im1heC1oIjpbeWUsdCwibWluIiwibWF4IiwiZml0Il19XSwiZm9udC1zaXplIjpbe3RleHQ6WyJiYXNlIixvbyxyb119XSwiZm9udC1zbW9vdGhpbmciOlsiYW50aWFsaWFzZWQiLCJzdWJwaXhlbC1hbnRpYWxpYXNlZCJdLCJmb250LXN0eWxlIjpbIml0YWxpYyIsIm5vdC1pdGFsaWMiXSwiZm9udC13ZWlnaHQiOlt7Zm9udDpbInRoaW4iLCJleHRyYWxpZ2h0IiwibGlnaHQiLCJub3JtYWwiLCJtZWRpdW0iLCJzZW1pYm9sZCIsImJvbGQiLCJleHRyYWJvbGQiLCJibGFjayIscHVdfV0sImZvbnQtZmFtaWx5Ijpbe2ZvbnQ6W2ZzXX1dLCJmdm4tbm9ybWFsIjpbIm5vcm1hbC1udW1zIl0sImZ2bi1vcmRpbmFsIjpbIm9yZGluYWwiXSwiZnZuLXNsYXNoZWQtemVybyI6WyJzbGFzaGVkLXplcm8iXSwiZnZuLWZpZ3VyZSI6WyJsaW5pbmctbnVtcyIsIm9sZHN0eWxlLW51bXMiXSwiZnZuLXNwYWNpbmciOlsicHJvcG9ydGlvbmFsLW51bXMiLCJ0YWJ1bGFyLW51bXMiXSwiZnZuLWZyYWN0aW9uIjpbImRpYWdvbmFsLWZyYWN0aW9ucyIsInN0YWNrZWQtZnJhY3RvbnMiXSx0cmFja2luZzpbe3RyYWNraW5nOlsidGlnaHRlciIsInRpZ2h0Iiwibm9ybWFsIiwid2lkZSIsIndpZGVyIiwid2lkZXN0Iix5ZV19XSwibGluZS1jbGFtcCI6W3sibGluZS1jbGFtcCI6WyJub25lIix0aSxwdV19XSxsZWFkaW5nOlt7bGVhZGluZzpbIm5vbmUiLCJ0aWdodCIsInNudWciLCJub3JtYWwiLCJyZWxheGVkIiwibG9vc2UiLEduLHllXX1dLCJsaXN0LWltYWdlIjpbeyJsaXN0LWltYWdlIjpbIm5vbmUiLHllXX1dLCJsaXN0LXN0eWxlLXR5cGUiOlt7bGlzdDpbIm5vbmUiLCJkaXNjIiwiZGVjaW1hbCIseWVdfV0sImxpc3Qtc3R5bGUtcG9zaXRpb24iOlt7bGlzdDpbImluc2lkZSIsIm91dHNpZGUiXX1dLCJwbGFjZWhvbGRlci1jb2xvciI6W3twbGFjZWhvbGRlcjpbZV19XSwicGxhY2Vob2xkZXItb3BhY2l0eSI6W3sicGxhY2Vob2xkZXItb3BhY2l0eSI6W3ZdfV0sInRleHQtYWxpZ25tZW50Ijpbe3RleHQ6WyJsZWZ0IiwiY2VudGVyIiwicmlnaHQiLCJqdXN0aWZ5Iiwic3RhcnQiLCJlbmQiXX1dLCJ0ZXh0LWNvbG9yIjpbe3RleHQ6W2VdfV0sInRleHQtb3BhY2l0eSI6W3sidGV4dC1vcGFjaXR5Ijpbdl19XSwidGV4dC1kZWNvcmF0aW9uIjpbInVuZGVybGluZSIsIm92ZXJsaW5lIiwibGluZS10aHJvdWdoIiwibm8tdW5kZXJsaW5lIl0sInRleHQtZGVjb3JhdGlvbi1zdHlsZSI6W3tkZWNvcmF0aW9uOlsuLi5DKCksIndhdnkiXX1dLCJ0ZXh0LWRlY29yYXRpb24tdGhpY2tuZXNzIjpbe2RlY29yYXRpb246WyJhdXRvIiwiZnJvbS1mb250IixHbixyb119XSwidW5kZXJsaW5lLW9mZnNldCI6W3sidW5kZXJsaW5lLW9mZnNldCI6WyJhdXRvIixHbix5ZV19XSwidGV4dC1kZWNvcmF0aW9uLWNvbG9yIjpbe2RlY29yYXRpb246W2VdfV0sInRleHQtdHJhbnNmb3JtIjpbInVwcGVyY2FzZSIsImxvd2VyY2FzZSIsImNhcGl0YWxpemUiLCJub3JtYWwtY2FzZSJdLCJ0ZXh0LW92ZXJmbG93IjpbInRydW5jYXRlIiwidGV4dC1lbGxpcHNpcyIsInRleHQtY2xpcCJdLGluZGVudDpbe2luZGVudDpCKCl9XSwidmVydGljYWwtYWxpZ24iOlt7YWxpZ246WyJiYXNlbGluZSIsInRvcCIsIm1pZGRsZSIsImJvdHRvbSIsInRleHQtdG9wIiwidGV4dC1ib3R0b20iLCJzdWIiLCJzdXBlciIseWVdfV0sd2hpdGVzcGFjZTpbe3doaXRlc3BhY2U6WyJub3JtYWwiLCJub3dyYXAiLCJwcmUiLCJwcmUtbGluZSIsInByZS13cmFwIiwiYnJlYWstc3BhY2VzIl19XSxicmVhazpbe2JyZWFrOlsibm9ybWFsIiwid29yZHMiLCJhbGwiLCJrZWVwIl19XSxoeXBoZW5zOlt7aHlwaGVuczpbIm5vbmUiLCJtYW51YWwiLCJhdXRvIl19XSxjb250ZW50Olt7Y29udGVudDpbIm5vbmUiLHllXX1dLCJiZy1hdHRhY2htZW50Ijpbe2JnOlsiZml4ZWQiLCJsb2NhbCIsInNjcm9sbCJdfV0sImJnLWNsaXAiOlt7ImJnLWNsaXAiOlsiYm9yZGVyIiwicGFkZGluZyIsImNvbnRlbnQiLCJ0ZXh0Il19XSwiYmctb3BhY2l0eSI6W3siYmctb3BhY2l0eSI6W3ZdfV0sImJnLW9yaWdpbiI6W3siYmctb3JpZ2luIjpbImJvcmRlciIsInBhZGRpbmciLCJjb250ZW50Il19XSwiYmctcG9zaXRpb24iOlt7Ymc6Wy4uLkcoKSxlTl19XSwiYmctcmVwZWF0Ijpbe2JnOlsibm8tcmVwZWF0Iix7cmVwZWF0OlsiIiwieCIsInkiLCJyb3VuZCIsInNwYWNlIl19XX1dLCJiZy1zaXplIjpbe2JnOlsiYXV0byIsImNvdmVyIiwiY29udGFpbiIscWJdfV0sImJnLWltYWdlIjpbe2JnOlsibm9uZSIseyJncmFkaWVudC10byI6WyJ0IiwidHIiLCJyIiwiYnIiLCJiIiwiYmwiLCJsIiwidGwiXX0sbk5dfV0sImJnLWNvbG9yIjpbe2JnOltlXX1dLCJncmFkaWVudC1mcm9tLXBvcyI6W3tmcm9tOlttXX1dLCJncmFkaWVudC12aWEtcG9zIjpbe3ZpYTpbbV19XSwiZ3JhZGllbnQtdG8tcG9zIjpbe3RvOlttXX1dLCJncmFkaWVudC1mcm9tIjpbe2Zyb206W2hdfV0sImdyYWRpZW50LXZpYSI6W3t2aWE6W2hdfV0sImdyYWRpZW50LXRvIjpbe3RvOltoXX1dLHJvdW5kZWQ6W3tyb3VuZGVkOltpXX1dLCJyb3VuZGVkLXMiOlt7InJvdW5kZWQtcyI6W2ldfV0sInJvdW5kZWQtZSI6W3sicm91bmRlZC1lIjpbaV19XSwicm91bmRlZC10IjpbeyJyb3VuZGVkLXQiOltpXX1dLCJyb3VuZGVkLXIiOlt7InJvdW5kZWQtciI6W2ldfV0sInJvdW5kZWQtYiI6W3sicm91bmRlZC1iIjpbaV19XSwicm91bmRlZC1sIjpbeyJyb3VuZGVkLWwiOltpXX1dLCJyb3VuZGVkLXNzIjpbeyJyb3VuZGVkLXNzIjpbaV19XSwicm91bmRlZC1zZSI6W3sicm91bmRlZC1zZSI6W2ldfV0sInJvdW5kZWQtZWUiOlt7InJvdW5kZWQtZWUiOltpXX1dLCJyb3VuZGVkLWVzIjpbeyJyb3VuZGVkLWVzIjpbaV19XSwicm91bmRlZC10bCI6W3sicm91bmRlZC10bCI6W2ldfV0sInJvdW5kZWQtdHIiOlt7InJvdW5kZWQtdHIiOltpXX1dLCJyb3VuZGVkLWJyIjpbeyJyb3VuZGVkLWJyIjpbaV19XSwicm91bmRlZC1ibCI6W3sicm91bmRlZC1ibCI6W2ldfV0sImJvcmRlci13Ijpbe2JvcmRlcjpbc119XSwiYm9yZGVyLXcteCI6W3siYm9yZGVyLXgiOltzXX1dLCJib3JkZXItdy15IjpbeyJib3JkZXIteSI6W3NdfV0sImJvcmRlci13LXMiOlt7ImJvcmRlci1zIjpbc119XSwiYm9yZGVyLXctZSI6W3siYm9yZGVyLWUiOltzXX1dLCJib3JkZXItdy10IjpbeyJib3JkZXItdCI6W3NdfV0sImJvcmRlci13LXIiOlt7ImJvcmRlci1yIjpbc119XSwiYm9yZGVyLXctYiI6W3siYm9yZGVyLWIiOltzXX1dLCJib3JkZXItdy1sIjpbeyJib3JkZXItbCI6W3NdfV0sImJvcmRlci1vcGFjaXR5IjpbeyJib3JkZXItb3BhY2l0eSI6W3ZdfV0sImJvcmRlci1zdHlsZSI6W3tib3JkZXI6Wy4uLkMoKSwiaGlkZGVuIl19XSwiZGl2aWRlLXgiOlt7ImRpdmlkZS14Ijpbc119XSwiZGl2aWRlLXgtcmV2ZXJzZSI6WyJkaXZpZGUteC1yZXZlcnNlIl0sImRpdmlkZS15IjpbeyJkaXZpZGUteSI6W3NdfV0sImRpdmlkZS15LXJldmVyc2UiOlsiZGl2aWRlLXktcmV2ZXJzZSJdLCJkaXZpZGUtb3BhY2l0eSI6W3siZGl2aWRlLW9wYWNpdHkiOlt2XX1dLCJkaXZpZGUtc3R5bGUiOlt7ZGl2aWRlOkMoKX1dLCJib3JkZXItY29sb3IiOlt7Ym9yZGVyOltvXX1dLCJib3JkZXItY29sb3IteCI6W3siYm9yZGVyLXgiOltvXX1dLCJib3JkZXItY29sb3IteSI6W3siYm9yZGVyLXkiOltvXX1dLCJib3JkZXItY29sb3ItdCI6W3siYm9yZGVyLXQiOltvXX1dLCJib3JkZXItY29sb3ItciI6W3siYm9yZGVyLXIiOltvXX1dLCJib3JkZXItY29sb3ItYiI6W3siYm9yZGVyLWIiOltvXX1dLCJib3JkZXItY29sb3ItbCI6W3siYm9yZGVyLWwiOltvXX1dLCJkaXZpZGUtY29sb3IiOlt7ZGl2aWRlOltvXX1dLCJvdXRsaW5lLXN0eWxlIjpbe291dGxpbmU6WyIiLC4uLkMoKV19XSwib3V0bGluZS1vZmZzZXQiOlt7Im91dGxpbmUtb2Zmc2V0IjpbR24seWVdfV0sIm91dGxpbmUtdyI6W3tvdXRsaW5lOltHbixyb119XSwib3V0bGluZS1jb2xvciI6W3tvdXRsaW5lOltlXX1dLCJyaW5nLXciOlt7cmluZzphZSgpfV0sInJpbmctdy1pbnNldCI6WyJyaW5nLWluc2V0Il0sInJpbmctY29sb3IiOlt7cmluZzpbZV19XSwicmluZy1vcGFjaXR5IjpbeyJyaW5nLW9wYWNpdHkiOlt2XX1dLCJyaW5nLW9mZnNldC13IjpbeyJyaW5nLW9mZnNldCI6W0duLHJvXX1dLCJyaW5nLW9mZnNldC1jb2xvciI6W3sicmluZy1vZmZzZXQiOltlXX1dLHNoYWRvdzpbe3NoYWRvdzpbIiIsImlubmVyIiwibm9uZSIsb28sck5dfV0sInNoYWRvdy1jb2xvciI6W3tzaGFkb3c6W2ZzXX1dLG9wYWNpdHk6W3tvcGFjaXR5Olt2XX1dLCJtaXgtYmxlbmQiOlt7Im1peC1ibGVuZCI6JCgpfV0sImJnLWJsZW5kIjpbeyJiZy1ibGVuZCI6JCgpfV0sZmlsdGVyOlt7ZmlsdGVyOlsiIiwibm9uZSJdfV0sYmx1cjpbe2JsdXI6W25dfV0sYnJpZ2h0bmVzczpbe2JyaWdodG5lc3M6W3JdfV0sY29udHJhc3Q6W3tjb250cmFzdDpbYV19XSwiZHJvcC1zaGFkb3ciOlt7ImRyb3Atc2hhZG93IjpbIiIsIm5vbmUiLG9vLHllXX1dLGdyYXlzY2FsZTpbe2dyYXlzY2FsZTpbdV19XSwiaHVlLXJvdGF0ZSI6W3siaHVlLXJvdGF0ZSI6W2NdfV0saW52ZXJ0Olt7aW52ZXJ0OltkXX1dLHNhdHVyYXRlOlt7c2F0dXJhdGU6W3hdfV0sc2VwaWE6W3tzZXBpYTpba119XSwiYmFja2Ryb3AtZmlsdGVyIjpbeyJiYWNrZHJvcC1maWx0ZXIiOlsiIiwibm9uZSJdfV0sImJhY2tkcm9wLWJsdXIiOlt7ImJhY2tkcm9wLWJsdXIiOltuXX1dLCJiYWNrZHJvcC1icmlnaHRuZXNzIjpbeyJiYWNrZHJvcC1icmlnaHRuZXNzIjpbcl19XSwiYmFja2Ryb3AtY29udHJhc3QiOlt7ImJhY2tkcm9wLWNvbnRyYXN0IjpbYV19XSwiYmFja2Ryb3AtZ3JheXNjYWxlIjpbeyJiYWNrZHJvcC1ncmF5c2NhbGUiOlt1XX1dLCJiYWNrZHJvcC1odWUtcm90YXRlIjpbeyJiYWNrZHJvcC1odWUtcm90YXRlIjpbY119XSwiYmFja2Ryb3AtaW52ZXJ0IjpbeyJiYWNrZHJvcC1pbnZlcnQiOltkXX1dLCJiYWNrZHJvcC1vcGFjaXR5IjpbeyJiYWNrZHJvcC1vcGFjaXR5Ijpbdl19XSwiYmFja2Ryb3Atc2F0dXJhdGUiOlt7ImJhY2tkcm9wLXNhdHVyYXRlIjpbeF19XSwiYmFja2Ryb3Atc2VwaWEiOlt7ImJhY2tkcm9wLXNlcGlhIjpba119XSwiYm9yZGVyLWNvbGxhcHNlIjpbe2JvcmRlcjpbImNvbGxhcHNlIiwic2VwYXJhdGUiXX1dLCJib3JkZXItc3BhY2luZyI6W3siYm9yZGVyLXNwYWNpbmciOltsXX1dLCJib3JkZXItc3BhY2luZy14IjpbeyJib3JkZXItc3BhY2luZy14IjpbbF19XSwiYm9yZGVyLXNwYWNpbmcteSI6W3siYm9yZGVyLXNwYWNpbmcteSI6W2xdfV0sInRhYmxlLWxheW91dCI6W3t0YWJsZTpbImF1dG8iLCJmaXhlZCJdfV0sY2FwdGlvbjpbe2NhcHRpb246WyJ0b3AiLCJib3R0b20iXX1dLHRyYW5zaXRpb246W3t0cmFuc2l0aW9uOlsibm9uZSIsImFsbCIsIiIsImNvbG9ycyIsIm9wYWNpdHkiLCJzaGFkb3ciLCJ0cmFuc2Zvcm0iLHllXX1dLGR1cmF0aW9uOlt7ZHVyYXRpb246VigpfV0sZWFzZTpbe2Vhc2U6WyJsaW5lYXIiLCJpbiIsIm91dCIsImluLW91dCIseWVdfV0sZGVsYXk6W3tkZWxheTpWKCl9XSxhbmltYXRlOlt7YW5pbWF0ZTpbIm5vbmUiLCJzcGluIiwicGluZyIsInB1bHNlIiwiYm91bmNlIix5ZV19XSx0cmFuc2Zvcm06W3t0cmFuc2Zvcm06WyIiLCJncHUiLCJub25lIl19XSxzY2FsZTpbe3NjYWxlOlt3XX1dLCJzY2FsZS14IjpbeyJzY2FsZS14Ijpbd119XSwic2NhbGUteSI6W3sic2NhbGUteSI6W3ddfV0scm90YXRlOlt7cm90YXRlOltkcyx5ZV19XSwidHJhbnNsYXRlLXgiOlt7InRyYW5zbGF0ZS14IjpbTl19XSwidHJhbnNsYXRlLXkiOlt7InRyYW5zbGF0ZS15IjpbTl19XSwic2tldy14IjpbeyJza2V3LXgiOltiXX1dLCJza2V3LXkiOlt7InNrZXcteSI6W2JdfV0sInRyYW5zZm9ybS1vcmlnaW4iOlt7b3JpZ2luOlsiY2VudGVyIiwidG9wIiwidG9wLXJpZ2h0IiwicmlnaHQiLCJib3R0b20tcmlnaHQiLCJib3R0b20iLCJib3R0b20tbGVmdCIsImxlZnQiLCJ0b3AtbGVmdCIseWVdfV0sYWNjZW50Olt7YWNjZW50OlsiYXV0byIsZV19XSxhcHBlYXJhbmNlOlsiYXBwZWFyYW5jZS1ub25lIl0sY3Vyc29yOlt7Y3Vyc29yOlsiYXV0byIsImRlZmF1bHQiLCJwb2ludGVyIiwid2FpdCIsInRleHQiLCJtb3ZlIiwiaGVscCIsIm5vdC1hbGxvd2VkIiwibm9uZSIsImNvbnRleHQtbWVudSIsInByb2dyZXNzIiwiY2VsbCIsImNyb3NzaGFpciIsInZlcnRpY2FsLXRleHQiLCJhbGlhcyIsImNvcHkiLCJuby1kcm9wIiwiZ3JhYiIsImdyYWJiaW5nIiwiYWxsLXNjcm9sbCIsImNvbC1yZXNpemUiLCJyb3ctcmVzaXplIiwibi1yZXNpemUiLCJlLXJlc2l6ZSIsInMtcmVzaXplIiwidy1yZXNpemUiLCJuZS1yZXNpemUiLCJudy1yZXNpemUiLCJzZS1yZXNpemUiLCJzdy1yZXNpemUiLCJldy1yZXNpemUiLCJucy1yZXNpemUiLCJuZXN3LXJlc2l6ZSIsIm53c2UtcmVzaXplIiwiem9vbS1pbiIsInpvb20tb3V0Iix5ZV19XSwiY2FyZXQtY29sb3IiOlt7Y2FyZXQ6W2VdfV0sInBvaW50ZXItZXZlbnRzIjpbeyJwb2ludGVyLWV2ZW50cyI6WyJub25lIiwiYXV0byJdfV0scmVzaXplOlt7cmVzaXplOlsibm9uZSIsInkiLCJ4IiwiIl19XSwic2Nyb2xsLWJlaGF2aW9yIjpbe3Njcm9sbDpbImF1dG8iLCJzbW9vdGgiXX1dLCJzY3JvbGwtbSI6W3sic2Nyb2xsLW0iOkIoKX1dLCJzY3JvbGwtbXgiOlt7InNjcm9sbC1teCI6QigpfV0sInNjcm9sbC1teSI6W3sic2Nyb2xsLW15IjpCKCl9XSwic2Nyb2xsLW1zIjpbeyJzY3JvbGwtbXMiOkIoKX1dLCJzY3JvbGwtbWUiOlt7InNjcm9sbC1tZSI6QigpfV0sInNjcm9sbC1tdCI6W3sic2Nyb2xsLW10IjpCKCl9XSwic2Nyb2xsLW1yIjpbeyJzY3JvbGwtbXIiOkIoKX1dLCJzY3JvbGwtbWIiOlt7InNjcm9sbC1tYiI6QigpfV0sInNjcm9sbC1tbCI6W3sic2Nyb2xsLW1sIjpCKCl9XSwic2Nyb2xsLXAiOlt7InNjcm9sbC1wIjpCKCl9XSwic2Nyb2xsLXB4IjpbeyJzY3JvbGwtcHgiOkIoKX1dLCJzY3JvbGwtcHkiOlt7InNjcm9sbC1weSI6QigpfV0sInNjcm9sbC1wcyI6W3sic2Nyb2xsLXBzIjpCKCl9XSwic2Nyb2xsLXBlIjpbeyJzY3JvbGwtcGUiOkIoKX1dLCJzY3JvbGwtcHQiOlt7InNjcm9sbC1wdCI6QigpfV0sInNjcm9sbC1wciI6W3sic2Nyb2xsLXByIjpCKCl9XSwic2Nyb2xsLXBiIjpbeyJzY3JvbGwtcGIiOkIoKX1dLCJzY3JvbGwtcGwiOlt7InNjcm9sbC1wbCI6QigpfV0sInNuYXAtYWxpZ24iOlt7c25hcDpbInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwiYWxpZ24tbm9uZSJdfV0sInNuYXAtc3RvcCI6W3tzbmFwOlsibm9ybWFsIiwiYWx3YXlzIl19XSwic25hcC10eXBlIjpbe3NuYXA6WyJub25lIiwieCIsInkiLCJib3RoIl19XSwic25hcC1zdHJpY3RuZXNzIjpbe3NuYXA6WyJtYW5kYXRvcnkiLCJwcm94aW1pdHkiXX1dLHRvdWNoOlt7dG91Y2g6WyJhdXRvIiwibm9uZSIsIm1hbmlwdWxhdGlvbiJdfV0sInRvdWNoLXgiOlt7InRvdWNoLXBhbiI6WyJ4IiwibGVmdCIsInJpZ2h0Il19XSwidG91Y2gteSI6W3sidG91Y2gtcGFuIjpbInkiLCJ1cCIsImRvd24iXX1dLCJ0b3VjaC1weiI6WyJ0b3VjaC1waW5jaC16b29tIl0sc2VsZWN0Olt7c2VsZWN0Olsibm9uZSIsInRleHQiLCJhbGwiLCJhdXRvIl19XSwid2lsbC1jaGFuZ2UiOlt7IndpbGwtY2hhbmdlIjpbImF1dG8iLCJzY3JvbGwiLCJjb250ZW50cyIsInRyYW5zZm9ybSIseWVdfV0sZmlsbDpbe2ZpbGw6W2UsIm5vbmUiXX1dLCJzdHJva2UtdyI6W3tzdHJva2U6W0duLHJvLHB1XX1dLHN0cm9rZTpbe3N0cm9rZTpbZSwibm9uZSJdfV0sc3I6WyJzci1vbmx5Iiwibm90LXNyLW9ubHkiXX0sY29uZmxpY3RpbmdDbGFzc0dyb3Vwczp7b3ZlcmZsb3c6WyJvdmVyZmxvdy14Iiwib3ZlcmZsb3cteSJdLG92ZXJzY3JvbGw6WyJvdmVyc2Nyb2xsLXgiLCJvdmVyc2Nyb2xsLXkiXSxpbnNldDpbImluc2V0LXgiLCJpbnNldC15Iiwic3RhcnQiLCJlbmQiLCJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXSwiaW5zZXQteCI6WyJyaWdodCIsImxlZnQiXSwiaW5zZXQteSI6WyJ0b3AiLCJib3R0b20iXSxmbGV4OlsiYmFzaXMiLCJncm93Iiwic2hyaW5rIl0sZ2FwOlsiZ2FwLXgiLCJnYXAteSJdLHA6WyJweCIsInB5IiwicHMiLCJwZSIsInB0IiwicHIiLCJwYiIsInBsIl0scHg6WyJwciIsInBsIl0scHk6WyJwdCIsInBiIl0sbTpbIm14IiwibXkiLCJtcyIsIm1lIiwibXQiLCJtciIsIm1iIiwibWwiXSxteDpbIm1yIiwibWwiXSxteTpbIm10IiwibWIiXSwiZm9udC1zaXplIjpbImxlYWRpbmciXSwiZnZuLW5vcm1hbCI6WyJmdm4tb3JkaW5hbCIsImZ2bi1zbGFzaGVkLXplcm8iLCJmdm4tZmlndXJlIiwiZnZuLXNwYWNpbmciLCJmdm4tZnJhY3Rpb24iXSwiZnZuLW9yZGluYWwiOlsiZnZuLW5vcm1hbCJdLCJmdm4tc2xhc2hlZC16ZXJvIjpbImZ2bi1ub3JtYWwiXSwiZnZuLWZpZ3VyZSI6WyJmdm4tbm9ybWFsIl0sImZ2bi1zcGFjaW5nIjpbImZ2bi1ub3JtYWwiXSwiZnZuLWZyYWN0aW9uIjpbImZ2bi1ub3JtYWwiXSxyb3VuZGVkOlsicm91bmRlZC1zIiwicm91bmRlZC1lIiwicm91bmRlZC10Iiwicm91bmRlZC1yIiwicm91bmRlZC1iIiwicm91bmRlZC1sIiwicm91bmRlZC1zcyIsInJvdW5kZWQtc2UiLCJyb3VuZGVkLWVlIiwicm91bmRlZC1lcyIsInJvdW5kZWQtdGwiLCJyb3VuZGVkLXRyIiwicm91bmRlZC1iciIsInJvdW5kZWQtYmwiXSwicm91bmRlZC1zIjpbInJvdW5kZWQtc3MiLCJyb3VuZGVkLWVzIl0sInJvdW5kZWQtZSI6WyJyb3VuZGVkLXNlIiwicm91bmRlZC1lZSJdLCJyb3VuZGVkLXQiOlsicm91bmRlZC10bCIsInJvdW5kZWQtdHIiXSwicm91bmRlZC1yIjpbInJvdW5kZWQtdHIiLCJyb3VuZGVkLWJyIl0sInJvdW5kZWQtYiI6WyJyb3VuZGVkLWJyIiwicm91bmRlZC1ibCJdLCJyb3VuZGVkLWwiOlsicm91bmRlZC10bCIsInJvdW5kZWQtYmwiXSwiYm9yZGVyLXNwYWNpbmciOlsiYm9yZGVyLXNwYWNpbmcteCIsImJvcmRlci1zcGFjaW5nLXkiXSwiYm9yZGVyLXciOlsiYm9yZGVyLXctcyIsImJvcmRlci13LWUiLCJib3JkZXItdy10IiwiYm9yZGVyLXctciIsImJvcmRlci13LWIiLCJib3JkZXItdy1sIl0sImJvcmRlci13LXgiOlsiYm9yZGVyLXctciIsImJvcmRlci13LWwiXSwiYm9yZGVyLXcteSI6WyJib3JkZXItdy10IiwiYm9yZGVyLXctYiJdLCJib3JkZXItY29sb3IiOlsiYm9yZGVyLWNvbG9yLXQiLCJib3JkZXItY29sb3ItciIsImJvcmRlci1jb2xvci1iIiwiYm9yZGVyLWNvbG9yLWwiXSwiYm9yZGVyLWNvbG9yLXgiOlsiYm9yZGVyLWNvbG9yLXIiLCJib3JkZXItY29sb3ItbCJdLCJib3JkZXItY29sb3IteSI6WyJib3JkZXItY29sb3ItdCIsImJvcmRlci1jb2xvci1iIl0sInNjcm9sbC1tIjpbInNjcm9sbC1teCIsInNjcm9sbC1teSIsInNjcm9sbC1tcyIsInNjcm9sbC1tZSIsInNjcm9sbC1tdCIsInNjcm9sbC1tciIsInNjcm9sbC1tYiIsInNjcm9sbC1tbCJdLCJzY3JvbGwtbXgiOlsic2Nyb2xsLW1yIiwic2Nyb2xsLW1sIl0sInNjcm9sbC1teSI6WyJzY3JvbGwtbXQiLCJzY3JvbGwtbWIiXSwic2Nyb2xsLXAiOlsic2Nyb2xsLXB4Iiwic2Nyb2xsLXB5Iiwic2Nyb2xsLXBzIiwic2Nyb2xsLXBlIiwic2Nyb2xsLXB0Iiwic2Nyb2xsLXByIiwic2Nyb2xsLXBiIiwic2Nyb2xsLXBsIl0sInNjcm9sbC1weCI6WyJzY3JvbGwtcHIiLCJzY3JvbGwtcGwiXSwic2Nyb2xsLXB5IjpbInNjcm9sbC1wdCIsInNjcm9sbC1wYiJdLHRvdWNoOlsidG91Y2gteCIsInRvdWNoLXkiLCJ0b3VjaC1weiJdLCJ0b3VjaC14IjpbInRvdWNoIl0sInRvdWNoLXkiOlsidG91Y2giXSwidG91Y2gtcHoiOlsidG91Y2giXX0sY29uZmxpY3RpbmdDbGFzc0dyb3VwTW9kaWZpZXJzOnsiZm9udC1zaXplIjpbImxlYWRpbmciXX19fWNvbnN0IGFOPVZiKHNOKTtmdW5jdGlvbiBpdCguLi5lKXtyZXR1cm4gYU4oUGIoZSkpfWNvbnN0IExzPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLGNoaWxkcmVuOnQsLi4ubn0scik9Pl8uanN4cyhJdyx7cmVmOnIsY2xhc3NOYW1lOml0KCJyZWxhdGl2ZSBvdmVyZmxvdy1oaWRkZW4iLGUpLC4uLm4sY2hpbGRyZW46W18uanN4KE5iLHtjbGFzc05hbWU6ImgtZnVsbCB3LWZ1bGwgcm91bmRlZC1baW5oZXJpdF0iLGNoaWxkcmVuOnR9KSxfLmpzeChWdyx7fSksXy5qc3goUmIse30pXX0pKTtMcy5kaXNwbGF5TmFtZT1Jdy5kaXNwbGF5TmFtZTtjb25zdCBWdz1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxvcmllbnRhdGlvbjp0PSJ2ZXJ0aWNhbCIsLi4ubn0scik9Pl8uanN4KE53LHtyZWY6cixvcmllbnRhdGlvbjp0LGNsYXNzTmFtZTppdCgiZmxleCB0b3VjaC1ub25lIHNlbGVjdC1ub25lIHRyYW5zaXRpb24tY29sb3JzIix0PT09InZlcnRpY2FsIiYmImgtZnVsbCB3LTIuNSBib3JkZXItbCBib3JkZXItbC10cmFuc3BhcmVudCBwLVsxcHhdIix0PT09Imhvcml6b250YWwiJiYiaC0yLjUgZmxleC1jb2wgYm9yZGVyLXQgYm9yZGVyLXQtdHJhbnNwYXJlbnQgcC1bMXB4XSIsZSksLi4ubixjaGlsZHJlbjpfLmpzeChFYix7Y2xhc3NOYW1lOml0KCJyZWxhdGl2ZSByb3VuZGVkLWZ1bGwgYmctYm9yZGVyIix0PT09InZlcnRpY2FsIiYmImZsZXgtMSIpfSl9KSk7VncuZGlzcGxheU5hbWU9TncuZGlzcGxheU5hbWU7ZnVuY3Rpb24gRHMoe2NoaWxkcmVuOmV9KXtjb25zdCB0PXAudXNlUmVmKG51bGwpLG49cC51c2VSZWYobnVsbCkscj1wLnVzZVJlZighMSksbz1wLnVzZVJlZigwKSxpPXAudXNlUmVmKG51bGwpLGw9cC51c2VSZWYoMCkscz0oKT0+e3IuY3VycmVudD0hMSxpLmN1cnJlbnQ9bnVsbCxvLmN1cnJlbnQ9MCxsLmN1cnJlbnQ9MH0sYT1TPT57Uy5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IHY9aS5jdXJyZW50PT09ImxlZnQiP3Q6bjtpZih2LmN1cnJlbnQmJnIuY3VycmVudCl7Y29uc3QgeT1pLmN1cnJlbnQ9PT0ibGVmdCI/Uy5zY3JlZW5YLW8uY3VycmVudDpvLmN1cnJlbnQtUy5zY3JlZW5YO3YuY3VycmVudC5zdHlsZS53aWR0aD1gJHtNYXRoLm1heChsLmN1cnJlbnQreSwxNTApfXB4YH19LHU9Uz0+dj0+e2lmKHYudGFyZ2V0KXtjb25zdCB4PVM9PT0ibGVmdCI/dDpTPT09InJpZ2h0Ij9uOm51bGw7ci5jdXJyZW50PSEwLHgmJnguY3VycmVudCYmKG8uY3VycmVudD12LnNjcmVlblgsaS5jdXJyZW50PVMseC5jdXJyZW50JiYobC5jdXJyZW50PXguY3VycmVudC5vZmZzZXRXaWR0aCkpfX0sW2MsZCxmLGgsbSxnXT1wLkNoaWxkcmVuLnRvQXJyYXkoZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT4oZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIscyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixhKSwoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHMpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsYSl9KSxbXSksXy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaC1zY3JlZW4iLGNoaWxkcmVuOltfLmpzeHMoImRpdiIse3JlZjp0LGNsYXNzTmFtZToicmVsYXRpdmUgYm9yZGVyLXIgYm9yZGVyLWJvcmRlciIsc3R5bGU6e3dpZHRoOjMwMH0sY2hpbGRyZW46W18uanN4cyhEcy5Db2x1bW4se2NoaWxkcmVuOltjLF8uanN4KExzLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpkfSldfSksXy5qc3goImRpdiIse2NsYXNzTmFtZToiYWJzb2x1dGUgaW5zZXQteS0wIHJpZ2h0LTAgY3Vyc29yLWNvbC1yZXNpemUgdy1bMXB4XSBob3Zlcjp3LVszcHhdIGgtZnVsbCBob3ZlcjpiZy1ib3JkZXIiLG9uTW91c2VEb3duOnUoImxlZnQiKX0pXX0pLF8uanN4KCJkaXYiLHtjbGFzc05hbWU6YWQoIiIseyJ3LWZ1bGwiOiFtJiYhZ30pLGNoaWxkcmVuOl8uanN4cyhEcy5Db2x1bW4se2NoaWxkcmVuOltmLF8uanN4KExzLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpofSldfSl9KSxtfHxnJiZfLmpzeHMoImRpdiIse3JlZjpuLGNsYXNzTmFtZToicmVsYXRpdmUgaC1zY3JlZW4gYm9yZGVyLWwgYm9yZGVyLWJvcmRlciIsc3R5bGU6e3dpZHRoOjMwMH0sY2hpbGRyZW46W18uanN4cyhEcy5Db2x1bW4se2NoaWxkcmVuOlttLF8uanN4KExzLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpnfSldfSksXy5qc3goImRpdiIse29uTW91c2VEb3duOnUoInJpZ2h0IiksY2xhc3NOYW1lOiJhYnNvbHV0ZSBpbnNldC15LTAgbGVmdC0wIGN1cnNvci1jb2wtcmVzaXplIHctWzFweF0gYmctYm9yZGVyIGhvdmVyOnctWzNweF0gaG92ZXI6YmctYm9yZGVyIn0pXX0pXX0pfURzLkNvbHVtbj0oe2NoaWxkcmVuOmV9KT0+e2NvbnN0W3Qsbl09cC5DaGlsZHJlbi50b0FycmF5KGUpO3JldHVybiBfLmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCIsY2hpbGRyZW46W18uanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGJvcmRlci1iIGJvcmRlci1ib3JkZXIiLGNoaWxkcmVuOnR9KSxuXX0pfTtjb25zdCB1Tj0oe2NsYXNzTmFtZTplfSk9Pl8uanN4cygic3ZnIix7d2lkdGg6IjEyIixoZWlnaHQ6IjEyIix2aWV3Qm94OiIwIDAgOSAxMCIsZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjbGFzc05hbWU6ZSxjaGlsZHJlbjpbXy5qc3hzKCJnIix7Y2xpcFBhdGg6InVybCgjY2xpcDBfMTIyNV8xNjM4KSIsY2hpbGRyZW46W18uanN4KCJyZWN0Iix7eToiMC41Iix3aWR0aDoiOSIsaGVpZ2h0OiI5In0pLF8uanN4KCJwYXRoIix7ZDoiTTAgN0w4LjUgNSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IifSksXy5qc3goImNpcmNsZSIse2N4OiIzIixjeToiMy41IixyOiIxIixmaWxsOiJjdXJyZW50Q29sb3IifSldfSksXy5qc3goInJlY3QiLHt4OiIwLjUiLHk6IjEiLHdpZHRoOiI4IixoZWlnaHQ6IjgiLHN0cm9rZToiY3VycmVudENvbG9yIn0pLF8uanN4KCJkZWZzIix7Y2hpbGRyZW46Xy5qc3goImNsaXBQYXRoIix7aWQ6ImNsaXAwXzEyMjVfMTYzOCIsY2hpbGRyZW46Xy5qc3goInJlY3QiLHt5OiIwLjUiLHdpZHRoOiI5IixoZWlnaHQ6IjkiLGZpbGw6IndoaXRlIn0pfSl9KV19KSxIdz11TixjTj0oe2NsYXNzTmFtZTplfSk9Pl8uanN4cygic3ZnIix7d2lkdGg6IjkiLGhlaWdodDoiMTAiLHZpZXdCb3g6IjAgMCA5IDEwIixjbGFzc05hbWU6ZSxmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46W18uanN4cygiZyIse2NsaXBQYXRoOiJ1cmwoI2NsaXAwXzEyMjJfMTYxOCkiLGNoaWxkcmVuOltfLmpzeCgicGF0aCIse2ZpbGxSdWxlOiJldmVub2RkIixjbGlwUnVsZToiZXZlbm9kZCIsZDoiTTkgMS41SDBWMC41SDlWMS41WiIsZmlsbDoiY3VycmVudENvbG9yIn0pLF8uanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNOSA5LjVIMFY4LjVIOVY5LjVaIixmaWxsOiJjdXJyZW50Q29sb3IifSldfSksXy5qc3goImRlZnMiLHtjaGlsZHJlbjpfLmpzeCgiY2xpcFBhdGgiLHtpZDoiY2xpcDBfMTIyMl8xNjE4IixjaGlsZHJlbjpfLmpzeCgicmVjdCIse3dpZHRoOiI5IixoZWlnaHQ6IjkiLGZpbGw6IndoaXRlIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgwIDAuNSkifSl9KX0pXX0pLGROPWNOLGZOPSh7Y2xhc3NOYW1lOmV9KT0+Xy5qc3goInN2ZyIse3dpZHRoOiI5IixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgOSAxMCIsZmlsbDoiY3VycmVudENvbG9yIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGNsYXNzTmFtZTplLGNoaWxkcmVuOl8uanN4KCJnIix7Y2xpcFBhdGg6InVybCgjY2xpcDBfMTIyOV8xNjI1KSIsY2hpbGRyZW46Xy5qc3goInBhdGgiLHtkOiJNMC4wMTQ1NTEzIDAuNUg4Ljk4NTQ1TDkgMy4xODU2OUg4LjU3MDc0QzguNDMwMDcgMi4yMjc2IDguMDI3NDkgMS41Nzk0OCA3LjM2Mjk4IDEuMjQxMzNDNi45ODk0OSAxLjA1NDkxIDYuNDMxNjkgMC45NTMwMzUgNS42ODk1NyAwLjkzNTY5NFY3Ljk0NTgxQzUuNjg5NTcgOC40MzU2OSA1Ljc4NDE2IDguNzYwODQgNS45NzMzMiA4LjkyMTI0QzYuMTY3MzQgOS4wODE2NSA2LjU2NzUgOS4xNjE4NSA3LjE3MzgxIDkuMTYxODVWOS41SDEuODYyNTdWOS4xNjE4NUMyLjQ0NDYyIDkuMTYxODUgMi44MzAyMyA5LjA4MTY1IDMuMDE5NCA4LjkyMTI0QzMuMjEzNDIgOC43NTY1IDMuMzEwNDMgOC40MzEzNiAzLjMxMDQzIDcuOTQ1ODFWMC45MzU2OTRDMi41ODI4NiAwLjk1MzAzNSAyLjAyNTA2IDEuMDU0OTEgMS42MzcwMyAxLjI0MTMzQzAuOTI0MDEgMS41ODgxNSAwLjUyMTQyMyAyLjIzNjI3IDAuNDI5MjY0IDMuMTg1NjlIMEwwLjAxNDU1MTMgMC41WiJ9KX0pfSksaE49Zk47ZnVuY3Rpb24gS3coe2NoaWxkcmVuOmUscm9vdFBhdGg6dH0pe3JldHVybiBfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIHctZnVsbCBweS0yIHRleHQteHMiLGNoaWxkcmVuOnAuQ2hpbGRyZW4ubWFwKGUsbj0+cC5jbG9uZUVsZW1lbnQobix7cGF0aHM6W3RdfSkpfSl9S3cuTm9kZT0oe2NoaWxkcmVuOmUscGF0aHM6dD1bXSxwYXRoOm4sbGV2ZWw6cj0xLHR5cGU6byxzZXRBY3RpdmVQYXRoOml9KT0+e2NvbnN0IGw9ciozMCxzPW89PT0ic3RyaW5nIj9fLmpzeChoTix7fSk6bz09PSJpbWFnZSI/Xy5qc3goSHcse2NsYXNzTmFtZToiaC1bOXB4XSB3LVs5cHhdIn0pOl8uanN4KGROLHt9KTtyZXR1cm4gXy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCIsY2hpbGRyZW46W18uanN4KCJidXR0b24iLHtjbGFzc05hbWU6ImZsZXgganVzdGlmeS1iZXR3ZWVuIHctZnVsbCBncm91cCBweS0yIHRleHQteHMgZm9udC1bNDAwXSBzaHJpbmstMCIsb25DbGljazooKT0+e2kmJmkobil9LHN0eWxlOntwYWRkaW5nTGVmdDpsfSxjaGlsZHJlbjpfLmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIiLGNoaWxkcmVuOltzLF8uanN4KCJwIix7Y2hpbGRyZW46bn0pXX0pfSksZSYmXy5qc3goXy5GcmFnbWVudCx7Y2hpbGRyZW46cC5DaGlsZHJlbi5tYXAoZSxhPT5wLmNsb25lRWxlbWVudChhLHtsZXZlbDpyKzEscGF0aHM6Wy4uLnQsbl19KSl9KV19KX07ZnVuY3Rpb24gRmcoKXtyZXR1cm57YXN5bmM6ITEsYnJlYWtzOiExLGV4dGVuc2lvbnM6bnVsbCxnZm06ITAsaG9va3M6bnVsbCxwZWRhbnRpYzohMSxyZW5kZXJlcjpudWxsLHNpbGVudDohMSx0b2tlbml6ZXI6bnVsbCx3YWxrVG9rZW5zOm51bGx9fWxldCBiaT1GZygpO2Z1bmN0aW9uIEd3KGUpe2JpPWV9Y29uc3QgWXc9L1smPD4iJ10vLHBOPW5ldyBSZWdFeHAoWXcuc291cmNlLCJnIiksWHc9L1s8PiInXXwmKD8hKCNcZHsxLDd9fCNbWHhdW2EtZkEtRjAtOV17MSw2fXxcdyspOykvLGdOPW5ldyBSZWdFeHAoWHcuc291cmNlLCJnIiksbU49eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyJ9LGd5PWU9Pm1OW2VdO2Z1bmN0aW9uIHhuKGUsdCl7aWYodCl7aWYoWXcudGVzdChlKSlyZXR1cm4gZS5yZXBsYWNlKHBOLGd5KX1lbHNlIGlmKFh3LnRlc3QoZSkpcmV0dXJuIGUucmVwbGFjZShnTixneSk7cmV0dXJuIGV9Y29uc3Qgdk49LyYoIyg/OlxkKyl8KD86I3hbMC05QS1GYS1mXSspfCg/Olx3KykpOz8vaWc7ZnVuY3Rpb24geU4oZSl7cmV0dXJuIGUucmVwbGFjZSh2TiwodCxuKT0+KG49bi50b0xvd2VyQ2FzZSgpLG49PT0iY29sb24iPyI6IjpuLmNoYXJBdCgwKT09PSIjIj9uLmNoYXJBdCgxKT09PSJ4Ij9TdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KG4uc3Vic3RyaW5nKDIpLDE2KSk6U3RyaW5nLmZyb21DaGFyQ29kZSgrbi5zdWJzdHJpbmcoMSkpOiIiKSl9Y29uc3QgeE49LyhefFteXFtdKVxeL2c7ZnVuY3Rpb24gUGUoZSx0KXtlPXR5cGVvZiBlPT0ic3RyaW5nIj9lOmUuc291cmNlLHQ9dHx8IiI7Y29uc3Qgbj17cmVwbGFjZToocixvKT0+KG89dHlwZW9mIG89PSJvYmplY3QiJiYic291cmNlImluIG8/by5zb3VyY2U6byxvPW8ucmVwbGFjZSh4TiwiJDEiKSxlPWUucmVwbGFjZShyLG8pLG4pLGdldFJlZ2V4OigpPT5uZXcgUmVnRXhwKGUsdCl9O3JldHVybiBufWZ1bmN0aW9uIG15KGUpe3RyeXtlPWVuY29kZVVSSShlKS5yZXBsYWNlKC8lMjUvZywiJSIpfWNhdGNoe3JldHVybiBudWxsfXJldHVybiBlfWNvbnN0IHhjPXtleGVjOigpPT5udWxsfTtmdW5jdGlvbiB2eShlLHQpe2NvbnN0IG49ZS5yZXBsYWNlKC9cfC9nLChpLGwscyk9PntsZXQgYT0hMSx1PWw7Zm9yKDstLXU+PTAmJnNbdV09PT0iXFwiOylhPSFhO3JldHVybiBhPyJ8IjoiIHwifSkscj1uLnNwbGl0KC8gXHwvKTtsZXQgbz0wO2lmKHJbMF0udHJpbSgpfHxyLnNoaWZ0KCksci5sZW5ndGg+MCYmIXJbci5sZW5ndGgtMV0udHJpbSgpJiZyLnBvcCgpLHQpaWYoci5sZW5ndGg+dClyLnNwbGljZSh0KTtlbHNlIGZvcig7ci5sZW5ndGg8dDspci5wdXNoKCIiKTtmb3IoO288ci5sZW5ndGg7bysrKXJbb109cltvXS50cmltKCkucmVwbGFjZSgvXFxcfC9nLCJ8Iik7cmV0dXJuIHJ9ZnVuY3Rpb24gbWYoZSx0LG4pe2NvbnN0IHI9ZS5sZW5ndGg7aWYocj09PTApcmV0dXJuIiI7bGV0IG89MDtmb3IoO288cjspe2NvbnN0IGk9ZS5jaGFyQXQoci1vLTEpO2lmKGk9PT10JiYhbilvKys7ZWxzZSBpZihpIT09dCYmbilvKys7ZWxzZSBicmVha31yZXR1cm4gZS5zbGljZSgwLHItbyl9ZnVuY3Rpb24gd04oZSx0KXtpZihlLmluZGV4T2YodFsxXSk9PT0tMSlyZXR1cm4tMTtsZXQgbj0wO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWlmKGVbcl09PT0iXFwiKXIrKztlbHNlIGlmKGVbcl09PT10WzBdKW4rKztlbHNlIGlmKGVbcl09PT10WzFdJiYobi0tLG48MCkpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24geXkoZSx0LG4scil7Y29uc3Qgbz10LmhyZWYsaT10LnRpdGxlP3huKHQudGl0bGUpOm51bGwsbD1lWzFdLnJlcGxhY2UoL1xcKFtcW1xdXSkvZywiJDEiKTtpZihlWzBdLmNoYXJBdCgwKSE9PSIhIil7ci5zdGF0ZS5pbkxpbms9ITA7Y29uc3Qgcz17dHlwZToibGluayIscmF3Om4saHJlZjpvLHRpdGxlOmksdGV4dDpsLHRva2VuczpyLmlubGluZVRva2VucyhsKX07cmV0dXJuIHIuc3RhdGUuaW5MaW5rPSExLHN9cmV0dXJue3R5cGU6ImltYWdlIixyYXc6bixocmVmOm8sdGl0bGU6aSx0ZXh0OnhuKGwpfX1mdW5jdGlvbiBfTihlLHQpe2NvbnN0IG49ZS5tYXRjaCgvXihccyspKD86YGBgKS8pO2lmKG49PT1udWxsKXJldHVybiB0O2NvbnN0IHI9blsxXTtyZXR1cm4gdC5zcGxpdChgCmApLm1hcChvPT57Y29uc3QgaT1vLm1hdGNoKC9eXHMrLyk7aWYoaT09PW51bGwpcmV0dXJuIG87Y29uc3RbbF09aTtyZXR1cm4gbC5sZW5ndGg+PXIubGVuZ3RoP28uc2xpY2Uoci5sZW5ndGgpOm99KS5qb2luKGAKYCl9Y2xhc3Mgd2N7Y29uc3RydWN0b3IodCl7amUodGhpcywib3B0aW9ucyIpO2plKHRoaXMsInJ1bGVzIik7amUodGhpcywibGV4ZXIiKTt0aGlzLm9wdGlvbnM9dHx8Yml9c3BhY2UodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLm5ld2xpbmUuZXhlYyh0KTtpZihuJiZuWzBdLmxlbmd0aD4wKXJldHVybnt0eXBlOiJzcGFjZSIscmF3Om5bMF19fWNvZGUodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmNvZGUuZXhlYyh0KTtpZihuKXtjb25zdCByPW5bMF0ucmVwbGFjZSgvXiB7MSw0fS9nbSwiIik7cmV0dXJue3R5cGU6ImNvZGUiLHJhdzpuWzBdLGNvZGVCbG9ja1N0eWxlOiJpbmRlbnRlZCIsdGV4dDp0aGlzLm9wdGlvbnMucGVkYW50aWM/cjptZihyLGAKYCl9fX1mZW5jZXModCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmZlbmNlcy5leGVjKHQpO2lmKG4pe2NvbnN0IHI9blswXSxvPV9OKHIsblszXXx8IiIpO3JldHVybnt0eXBlOiJjb2RlIixyYXc6cixsYW5nOm5bMl0/blsyXS50cmltKCkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5fZXNjYXBlcywiJDEiKTpuWzJdLHRleHQ6b319fWhlYWRpbmcodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmhlYWRpbmcuZXhlYyh0KTtpZihuKXtsZXQgcj1uWzJdLnRyaW0oKTtpZigvIyQvLnRlc3Qocikpe2NvbnN0IG89bWYociwiIyIpOyh0aGlzLm9wdGlvbnMucGVkYW50aWN8fCFvfHwvICQvLnRlc3QobykpJiYocj1vLnRyaW0oKSl9cmV0dXJue3R5cGU6ImhlYWRpbmciLHJhdzpuWzBdLGRlcHRoOm5bMV0ubGVuZ3RoLHRleHQ6cix0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUocil9fX1ocih0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2suaHIuZXhlYyh0KTtpZihuKXJldHVybnt0eXBlOiJociIscmF3Om5bMF19fWJsb2NrcXVvdGUodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmJsb2NrcXVvdGUuZXhlYyh0KTtpZihuKXtjb25zdCByPW5bMF0ucmVwbGFjZSgvXiAqPlsgXHRdPy9nbSwiIiksbz10aGlzLmxleGVyLnN0YXRlLnRvcDt0aGlzLmxleGVyLnN0YXRlLnRvcD0hMDtjb25zdCBpPXRoaXMubGV4ZXIuYmxvY2tUb2tlbnMocik7cmV0dXJuIHRoaXMubGV4ZXIuc3RhdGUudG9wPW8se3R5cGU6ImJsb2NrcXVvdGUiLHJhdzpuWzBdLHRva2VuczppLHRleHQ6cn19fWxpc3QodCl7bGV0IG49dGhpcy5ydWxlcy5ibG9jay5saXN0LmV4ZWModCk7aWYobil7bGV0IHI9blsxXS50cmltKCk7Y29uc3Qgbz1yLmxlbmd0aD4xLGk9e3R5cGU6Imxpc3QiLHJhdzoiIixvcmRlcmVkOm8sc3RhcnQ6bz8rci5zbGljZSgwLC0xKToiIixsb29zZTohMSxpdGVtczpbXX07cj1vP2BcXGR7MSw5fVxcJHtyLnNsaWNlKC0xKX1gOmBcXCR7cn1gLHRoaXMub3B0aW9ucy5wZWRhbnRpYyYmKHI9bz9yOiJbKistXSIpO2NvbnN0IGw9bmV3IFJlZ0V4cChgXiggezAsM30ke3J9KSgoPzpbCSBdW15cXG5dKik/KD86XFxufCQpKWApO2xldCBzPSIiLGE9IiIsdT0hMTtmb3IoO3Q7KXtsZXQgYz0hMTtpZighKG49bC5leGVjKHQpKXx8dGhpcy5ydWxlcy5ibG9jay5oci50ZXN0KHQpKWJyZWFrO3M9blswXSx0PXQuc3Vic3RyaW5nKHMubGVuZ3RoKTtsZXQgZD1uWzJdLnNwbGl0KGAKYCwxKVswXS5yZXBsYWNlKC9eXHQrLyx2PT4iICIucmVwZWF0KDMqdi5sZW5ndGgpKSxmPXQuc3BsaXQoYApgLDEpWzBdLGg9MDt0aGlzLm9wdGlvbnMucGVkYW50aWM/KGg9MixhPWQudHJpbVN0YXJ0KCkpOihoPW5bMl0uc2VhcmNoKC9bXiBdLyksaD1oPjQ/MTpoLGE9ZC5zbGljZShoKSxoKz1uWzFdLmxlbmd0aCk7bGV0IG09ITE7aWYoIWQmJi9eICokLy50ZXN0KGYpJiYocys9ZitgCmAsdD10LnN1YnN0cmluZyhmLmxlbmd0aCsxKSxjPSEwKSwhYyl7Y29uc3Qgdj1uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxoLTEpfX0oPzpbKistXXxcXGR7MSw5fVsuKV0pKCg/OlsgCV1bXlxcbl0qKT8oPzpcXG58JCkpYCkseT1uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxoLTEpfX0oKD86LSAqKXszLH18KD86XyAqKXszLH18KD86XFwqICopezMsfSkoPzpcXG4rfCQpYCkseD1uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxoLTEpfX0oPzpcYFxgXGB8fn5+KWApLHc9bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsaC0xKX19I2ApO2Zvcig7dDspe2NvbnN0IGs9dC5zcGxpdChgCmAsMSlbMF07aWYoZj1rLHRoaXMub3B0aW9ucy5wZWRhbnRpYyYmKGY9Zi5yZXBsYWNlKC9eIHsxLDR9KD89KCB7NH0pKlteIF0pL2csIiAgIikpLHgudGVzdChmKXx8dy50ZXN0KGYpfHx2LnRlc3QoZil8fHkudGVzdCh0KSlicmVhaztpZihmLnNlYXJjaCgvW14gXS8pPj1ofHwhZi50cmltKCkpYSs9YApgK2Yuc2xpY2UoaCk7ZWxzZXtpZihtfHxkLnNlYXJjaCgvW14gXS8pPj00fHx4LnRlc3QoZCl8fHcudGVzdChkKXx8eS50ZXN0KGQpKWJyZWFrO2ErPWAKYCtmfSFtJiYhZi50cmltKCkmJihtPSEwKSxzKz1rK2AKYCx0PXQuc3Vic3RyaW5nKGsubGVuZ3RoKzEpLGQ9Zi5zbGljZShoKX19aS5sb29zZXx8KHU/aS5sb29zZT0hMDovXG4gKlxuICokLy50ZXN0KHMpJiYodT0hMCkpO2xldCBnPW51bGwsUzt0aGlzLm9wdGlvbnMuZ2ZtJiYoZz0vXlxbWyB4WF1cXSAvLmV4ZWMoYSksZyYmKFM9Z1swXSE9PSJbIF0gIixhPWEucmVwbGFjZSgvXlxbWyB4WF1cXSArLywiIikpKSxpLml0ZW1zLnB1c2goe3R5cGU6Imxpc3RfaXRlbSIscmF3OnMsdGFzazohIWcsY2hlY2tlZDpTLGxvb3NlOiExLHRleHQ6YSx0b2tlbnM6W119KSxpLnJhdys9c31pLml0ZW1zW2kuaXRlbXMubGVuZ3RoLTFdLnJhdz1zLnRyaW1FbmQoKSxpLml0ZW1zW2kuaXRlbXMubGVuZ3RoLTFdLnRleHQ9YS50cmltRW5kKCksaS5yYXc9aS5yYXcudHJpbUVuZCgpO2ZvcihsZXQgYz0wO2M8aS5pdGVtcy5sZW5ndGg7YysrKWlmKHRoaXMubGV4ZXIuc3RhdGUudG9wPSExLGkuaXRlbXNbY10udG9rZW5zPXRoaXMubGV4ZXIuYmxvY2tUb2tlbnMoaS5pdGVtc1tjXS50ZXh0LFtdKSwhaS5sb29zZSl7Y29uc3QgZD1pLml0ZW1zW2NdLnRva2Vucy5maWx0ZXIoaD0+aC50eXBlPT09InNwYWNlIiksZj1kLmxlbmd0aD4wJiZkLnNvbWUoaD0+L1xuLipcbi8udGVzdChoLnJhdykpO2kubG9vc2U9Zn1pZihpLmxvb3NlKWZvcihsZXQgYz0wO2M8aS5pdGVtcy5sZW5ndGg7YysrKWkuaXRlbXNbY10ubG9vc2U9ITA7cmV0dXJuIGl9fWh0bWwodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmh0bWwuZXhlYyh0KTtpZihuKXJldHVybnt0eXBlOiJodG1sIixibG9jazohMCxyYXc6blswXSxwcmU6blsxXT09PSJwcmUifHxuWzFdPT09InNjcmlwdCJ8fG5bMV09PT0ic3R5bGUiLHRleHQ6blswXX19ZGVmKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5kZWYuZXhlYyh0KTtpZihuKXtjb25zdCByPW5bMV0udG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ccysvZywiICIpLG89blsyXT9uWzJdLnJlcGxhY2UoL148KC4qKT4kLywiJDEiKS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLl9lc2NhcGVzLCIkMSIpOiIiLGk9blszXT9uWzNdLnN1YnN0cmluZygxLG5bM10ubGVuZ3RoLTEpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIik6blszXTtyZXR1cm57dHlwZToiZGVmIix0YWc6cixyYXc6blswXSxocmVmOm8sdGl0bGU6aX19fXRhYmxlKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay50YWJsZS5leGVjKHQpO2lmKG4pe2lmKCEvWzp8XS8udGVzdChuWzJdKSlyZXR1cm47Y29uc3Qgcj17dHlwZToidGFibGUiLHJhdzpuWzBdLGhlYWRlcjp2eShuWzFdKS5tYXAobz0+KHt0ZXh0Om8sdG9rZW5zOltdfSkpLGFsaWduOm5bMl0ucmVwbGFjZSgvXlx8fFx8ICokL2csIiIpLnNwbGl0KCJ8Iikscm93czpuWzNdJiZuWzNdLnRyaW0oKT9uWzNdLnJlcGxhY2UoL1xuWyBcdF0qJC8sIiIpLnNwbGl0KGAKYCk6W119O2lmKHIuaGVhZGVyLmxlbmd0aD09PXIuYWxpZ24ubGVuZ3RoKXtsZXQgbz1yLmFsaWduLmxlbmd0aCxpLGwscyxhO2ZvcihpPTA7aTxvO2krKyl7Y29uc3QgdT1yLmFsaWduW2ldO3UmJigvXiAqLSs6ICokLy50ZXN0KHUpP3IuYWxpZ25baV09InJpZ2h0IjovXiAqOi0rOiAqJC8udGVzdCh1KT9yLmFsaWduW2ldPSJjZW50ZXIiOi9eICo6LSsgKiQvLnRlc3QodSk/ci5hbGlnbltpXT0ibGVmdCI6ci5hbGlnbltpXT1udWxsKX1mb3Iobz1yLnJvd3MubGVuZ3RoLGk9MDtpPG87aSsrKXIucm93c1tpXT12eShyLnJvd3NbaV0sci5oZWFkZXIubGVuZ3RoKS5tYXAodT0+KHt0ZXh0OnUsdG9rZW5zOltdfSkpO2ZvcihvPXIuaGVhZGVyLmxlbmd0aCxsPTA7bDxvO2wrKylyLmhlYWRlcltsXS50b2tlbnM9dGhpcy5sZXhlci5pbmxpbmUoci5oZWFkZXJbbF0udGV4dCk7Zm9yKG89ci5yb3dzLmxlbmd0aCxsPTA7bDxvO2wrKylmb3IoYT1yLnJvd3NbbF0scz0wO3M8YS5sZW5ndGg7cysrKWFbc10udG9rZW5zPXRoaXMubGV4ZXIuaW5saW5lKGFbc10udGV4dCk7cmV0dXJuIHJ9fX1saGVhZGluZyh0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2subGhlYWRpbmcuZXhlYyh0KTtpZihuKXJldHVybnt0eXBlOiJoZWFkaW5nIixyYXc6blswXSxkZXB0aDpuWzJdLmNoYXJBdCgwKT09PSI9Ij8xOjIsdGV4dDpuWzFdLHRva2Vuczp0aGlzLmxleGVyLmlubGluZShuWzFdKX19cGFyYWdyYXBoKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5wYXJhZ3JhcGguZXhlYyh0KTtpZihuKXtjb25zdCByPW5bMV0uY2hhckF0KG5bMV0ubGVuZ3RoLTEpPT09YApgP25bMV0uc2xpY2UoMCwtMSk6blsxXTtyZXR1cm57dHlwZToicGFyYWdyYXBoIixyYXc6blswXSx0ZXh0OnIsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKHIpfX19dGV4dCh0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2sudGV4dC5leGVjKHQpO2lmKG4pcmV0dXJue3R5cGU6InRleHQiLHJhdzpuWzBdLHRleHQ6blswXSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUoblswXSl9fWVzY2FwZSh0KXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLmVzY2FwZS5leGVjKHQpO2lmKG4pcmV0dXJue3R5cGU6ImVzY2FwZSIscmF3Om5bMF0sdGV4dDp4bihuWzFdKX19dGFnKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUudGFnLmV4ZWModCk7aWYobilyZXR1cm4hdGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsmJi9ePGEgL2kudGVzdChuWzBdKT90aGlzLmxleGVyLnN0YXRlLmluTGluaz0hMDp0aGlzLmxleGVyLnN0YXRlLmluTGluayYmL148XC9hPi9pLnRlc3QoblswXSkmJih0aGlzLmxleGVyLnN0YXRlLmluTGluaz0hMSksIXRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayYmL148KHByZXxjb2RlfGtiZHxzY3JpcHQpKFxzfD4pL2kudGVzdChuWzBdKT90aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s9ITA6dGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrJiYvXjxcLyhwcmV8Y29kZXxrYmR8c2NyaXB0KShcc3w+KS9pLnRlc3QoblswXSkmJih0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s9ITEpLHt0eXBlOiJodG1sIixyYXc6blswXSxpbkxpbms6dGhpcy5sZXhlci5zdGF0ZS5pbkxpbmssaW5SYXdCbG9jazp0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2ssYmxvY2s6ITEsdGV4dDpuWzBdfX1saW5rKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUubGluay5leGVjKHQpO2lmKG4pe2NvbnN0IHI9blsyXS50cmltKCk7aWYoIXRoaXMub3B0aW9ucy5wZWRhbnRpYyYmL148Ly50ZXN0KHIpKXtpZighLz4kLy50ZXN0KHIpKXJldHVybjtjb25zdCBsPW1mKHIuc2xpY2UoMCwtMSksIlxcIik7aWYoKHIubGVuZ3RoLWwubGVuZ3RoKSUyPT09MClyZXR1cm59ZWxzZXtjb25zdCBsPXdOKG5bMl0sIigpIik7aWYobD4tMSl7Y29uc3QgYT0oblswXS5pbmRleE9mKCIhIik9PT0wPzU6NCkrblsxXS5sZW5ndGgrbDtuWzJdPW5bMl0uc3Vic3RyaW5nKDAsbCksblswXT1uWzBdLnN1YnN0cmluZygwLGEpLnRyaW0oKSxuWzNdPSIifX1sZXQgbz1uWzJdLGk9IiI7aWYodGhpcy5vcHRpb25zLnBlZGFudGljKXtjb25zdCBsPS9eKFteJyJdKlteXHNdKVxzKyhbJyJdKSguKilcMi8uZXhlYyhvKTtsJiYobz1sWzFdLGk9bFszXSl9ZWxzZSBpPW5bM10/blszXS5zbGljZSgxLC0xKToiIjtyZXR1cm4gbz1vLnRyaW0oKSwvXjwvLnRlc3QobykmJih0aGlzLm9wdGlvbnMucGVkYW50aWMmJiEvPiQvLnRlc3Qocik/bz1vLnNsaWNlKDEpOm89by5zbGljZSgxLC0xKSkseXkobix7aHJlZjpvJiZvLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIiksdGl0bGU6aSYmaS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLl9lc2NhcGVzLCIkMSIpfSxuWzBdLHRoaXMubGV4ZXIpfX1yZWZsaW5rKHQsbil7bGV0IHI7aWYoKHI9dGhpcy5ydWxlcy5pbmxpbmUucmVmbGluay5leGVjKHQpKXx8KHI9dGhpcy5ydWxlcy5pbmxpbmUubm9saW5rLmV4ZWModCkpKXtsZXQgbz0oclsyXXx8clsxXSkucmVwbGFjZSgvXHMrL2csIiAiKTtpZihvPW5bby50b0xvd2VyQ2FzZSgpXSwhbyl7Y29uc3QgaT1yWzBdLmNoYXJBdCgwKTtyZXR1cm57dHlwZToidGV4dCIscmF3OmksdGV4dDppfX1yZXR1cm4geXkocixvLHJbMF0sdGhpcy5sZXhlcil9fWVtU3Ryb25nKHQsbixyPSIiKXtsZXQgbz10aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZy5sRGVsaW0uZXhlYyh0KTtpZighb3x8b1szXSYmci5tYXRjaCgvW1xwe0x9XHB7Tn1dL3UpKXJldHVybjtpZighKG9bMV18fG9bMl18fCIiKXx8IXJ8fHRoaXMucnVsZXMuaW5saW5lLnB1bmN0dWF0aW9uLmV4ZWMocikpe2NvbnN0IGw9Wy4uLm9bMF1dLmxlbmd0aC0xO2xldCBzLGEsdT1sLGM9MDtjb25zdCBkPW9bMF1bMF09PT0iKiI/dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmcuckRlbGltQXN0OnRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nLnJEZWxpbVVuZDtmb3IoZC5sYXN0SW5kZXg9MCxuPW4uc2xpY2UoLTEqdC5sZW5ndGgrb1swXS5sZW5ndGgtMSk7KG89ZC5leGVjKG4pKSE9bnVsbDspe2lmKHM9b1sxXXx8b1syXXx8b1szXXx8b1s0XXx8b1s1XXx8b1s2XSwhcyljb250aW51ZTtpZihhPVsuLi5zXS5sZW5ndGgsb1szXXx8b1s0XSl7dSs9YTtjb250aW51ZX1lbHNlIGlmKChvWzVdfHxvWzZdKSYmbCUzJiYhKChsK2EpJTMpKXtjKz1hO2NvbnRpbnVlfWlmKHUtPWEsdT4wKWNvbnRpbnVlO2E9TWF0aC5taW4oYSxhK3UrYyk7Y29uc3QgZj1bLi4udF0uc2xpY2UoMCxsK28uaW5kZXgrYSsxKS5qb2luKCIiKTtpZihNYXRoLm1pbihsLGEpJTIpe2NvbnN0IG09Zi5zbGljZSgxLC0xKTtyZXR1cm57dHlwZToiZW0iLHJhdzpmLHRleHQ6bSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmVUb2tlbnMobSl9fWNvbnN0IGg9Zi5zbGljZSgyLC0yKTtyZXR1cm57dHlwZToic3Ryb25nIixyYXc6Zix0ZXh0OmgsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKGgpfX19fWNvZGVzcGFuKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUuY29kZS5leGVjKHQpO2lmKG4pe2xldCByPW5bMl0ucmVwbGFjZSgvXG4vZywiICIpO2NvbnN0IG89L1teIF0vLnRlc3QociksaT0vXiAvLnRlc3QocikmJi8gJC8udGVzdChyKTtyZXR1cm4gbyYmaSYmKHI9ci5zdWJzdHJpbmcoMSxyLmxlbmd0aC0xKSkscj14bihyLCEwKSx7dHlwZToiY29kZXNwYW4iLHJhdzpuWzBdLHRleHQ6cn19fWJyKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUuYnIuZXhlYyh0KTtpZihuKXJldHVybnt0eXBlOiJiciIscmF3Om5bMF19fWRlbCh0KXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLmRlbC5leGVjKHQpO2lmKG4pcmV0dXJue3R5cGU6ImRlbCIscmF3Om5bMF0sdGV4dDpuWzJdLHRva2Vuczp0aGlzLmxleGVyLmlubGluZVRva2VucyhuWzJdKX19YXV0b2xpbmsodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS5hdXRvbGluay5leGVjKHQpO2lmKG4pe2xldCByLG87cmV0dXJuIG5bMl09PT0iQCI/KHI9eG4oblsxXSksbz0ibWFpbHRvOiIrcik6KHI9eG4oblsxXSksbz1yKSx7dHlwZToibGluayIscmF3Om5bMF0sdGV4dDpyLGhyZWY6byx0b2tlbnM6W3t0eXBlOiJ0ZXh0IixyYXc6cix0ZXh0OnJ9XX19fXVybCh0KXtsZXQgbjtpZihuPXRoaXMucnVsZXMuaW5saW5lLnVybC5leGVjKHQpKXtsZXQgcixvO2lmKG5bMl09PT0iQCIpcj14bihuWzBdKSxvPSJtYWlsdG86IityO2Vsc2V7bGV0IGk7ZG8gaT1uWzBdLG5bMF09dGhpcy5ydWxlcy5pbmxpbmUuX2JhY2twZWRhbC5leGVjKG5bMF0pWzBdO3doaWxlKGkhPT1uWzBdKTtyPXhuKG5bMF0pLG5bMV09PT0id3d3LiI/bz0iaHR0cDovLyIrblswXTpvPW5bMF19cmV0dXJue3R5cGU6ImxpbmsiLHJhdzpuWzBdLHRleHQ6cixocmVmOm8sdG9rZW5zOlt7dHlwZToidGV4dCIscmF3OnIsdGV4dDpyfV19fX1pbmxpbmVUZXh0KHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUudGV4dC5leGVjKHQpO2lmKG4pe2xldCByO3JldHVybiB0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2s/cj1uWzBdOnI9eG4oblswXSkse3R5cGU6InRleHQiLHJhdzpuWzBdLHRleHQ6cn19fX1jb25zdCBvZT17bmV3bGluZTovXig/OiAqKD86XG58JCkpKy8sY29kZTovXiggezR9W15cbl0rKD86XG4oPzogKig/OlxufCQpKSopPykrLyxmZW5jZXM6L14gezAsM30oYHszLH0oPz1bXmBcbl0qKD86XG58JCkpfH57Myx9KShbXlxuXSopKD86XG58JCkoPzp8KFtcc1xTXSo/KSg/OlxufCQpKSg/OiB7MCwzfVwxW35gXSogKig/PVxufCQpfCQpLyxocjovXiB7MCwzfSgoPzotW1x0IF0qKXszLH18KD86X1sgXHRdKil7Myx9fCg/OlwqWyBcdF0qKXszLH0pKD86XG4rfCQpLyxoZWFkaW5nOi9eIHswLDN9KCN7MSw2fSkoPz1cc3wkKSguKikoPzpcbit8JCkvLGJsb2NrcXVvdGU6L14oIHswLDN9PiA/KHBhcmFncmFwaHxbXlxuXSopKD86XG58JCkpKy8sbGlzdDovXiggezAsM31idWxsKShbIFx0XVteXG5dKz8pPyg/OlxufCQpLyxodG1sOiJeIHswLDN9KD86PChzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKVtcXHM+XVtcXHNcXFNdKj8oPzo8L1xcMT5bXlxcbl0qXFxuK3wkKXxjb21tZW50W15cXG5dKihcXG4rfCQpfDxcXD9bXFxzXFxTXSo/KD86XFw/Plxcbip8JCl8PCFbQS1aXVtcXHNcXFNdKj8oPzo+XFxuKnwkKXw8IVxcW0NEQVRBXFxbW1xcc1xcU10qPyg/OlxcXVxcXT5cXG4qfCQpfDwvPyh0YWcpKD86ICt8XFxufC8/PilbXFxzXFxTXSo/KD86KD86XFxuICopK1xcbnwkKXw8KD8hc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSkoW2Etel1bXFx3LV0qKSg/OmF0dHJpYnV0ZSkqPyAqLz8+KD89WyBcXHRdKig/OlxcbnwkKSlbXFxzXFxTXSo/KD86KD86XFxuICopK1xcbnwkKXw8Lyg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpW2Etel1bXFx3LV0qXFxzKj4oPz1bIFxcdF0qKD86XFxufCQpKVtcXHNcXFNdKj8oPzooPzpcXG4gKikrXFxufCQpKSIsZGVmOi9eIHswLDN9XFsobGFiZWwpXF06ICooPzpcbiAqKT8oW148XHNdW15cc10qfDwuKj8+KSg/Oig/OiArKD86XG4gKik/fCAqXG4gKikodGl0bGUpKT8gKig/OlxuK3wkKS8sdGFibGU6eGMsbGhlYWRpbmc6L14oPyFidWxsICkoKD86Lnxcbig/IVxzKj9cbnxidWxsICkpKz8pXG4gezAsM30oPSt8LSspICooPzpcbit8JCkvLF9wYXJhZ3JhcGg6L14oW15cbl0rKD86XG4oPyFocnxoZWFkaW5nfGxoZWFkaW5nfGJsb2NrcXVvdGV8ZmVuY2VzfGxpc3R8aHRtbHx0YWJsZXwgK1xuKVteXG5dKykqKS8sdGV4dDovXlteXG5dKy99O29lLl9sYWJlbD0vKD8hXHMqXF0pKD86XFwufFteXFtcXVxcXSkrLztvZS5fdGl0bGU9Lyg/OiIoPzpcXCI/fFteIlxcXSkqInwnW14nXG5dKig/OlxuW14nXG5dKykqXG4/J3xcKFteKCldKlwpKS87b2UuZGVmPVBlKG9lLmRlZikucmVwbGFjZSgibGFiZWwiLG9lLl9sYWJlbCkucmVwbGFjZSgidGl0bGUiLG9lLl90aXRsZSkuZ2V0UmVnZXgoKTtvZS5idWxsZXQ9Lyg/OlsqKy1dfFxkezEsOX1bLildKS87b2UubGlzdEl0ZW1TdGFydD1QZSgvXiggKikoYnVsbCkgKi8pLnJlcGxhY2UoImJ1bGwiLG9lLmJ1bGxldCkuZ2V0UmVnZXgoKTtvZS5saXN0PVBlKG9lLmxpc3QpLnJlcGxhY2UoL2J1bGwvZyxvZS5idWxsZXQpLnJlcGxhY2UoImhyIiwiXFxuKyg/PVxcMT8oPzooPzotICopezMsfXwoPzpfICopezMsfXwoPzpcXCogKil7Myx9KSg/Olxcbit8JCkpIikucmVwbGFjZSgiZGVmIiwiXFxuKyg/PSIrb2UuZGVmLnNvdXJjZSsiKSIpLmdldFJlZ2V4KCk7b2UuX3RhZz0iYWRkcmVzc3xhcnRpY2xlfGFzaWRlfGJhc2V8YmFzZWZvbnR8YmxvY2txdW90ZXxib2R5fGNhcHRpb258Y2VudGVyfGNvbHxjb2xncm91cHxkZHxkZXRhaWxzfGRpYWxvZ3xkaXJ8ZGl2fGRsfGR0fGZpZWxkc2V0fGZpZ2NhcHRpb258ZmlndXJlfGZvb3Rlcnxmb3JtfGZyYW1lfGZyYW1lc2V0fGhbMS02XXxoZWFkfGhlYWRlcnxocnxodG1sfGlmcmFtZXxsZWdlbmR8bGl8bGlua3xtYWlufG1lbnV8bWVudWl0ZW18bWV0YXxuYXZ8bm9mcmFtZXN8b2x8b3B0Z3JvdXB8b3B0aW9ufHB8cGFyYW18c2VjdGlvbnxzb3VyY2V8c3VtbWFyeXx0YWJsZXx0Ym9keXx0ZHx0Zm9vdHx0aHx0aGVhZHx0aXRsZXx0cnx0cmFja3x1bCI7b2UuX2NvbW1lbnQ9LzwhLS0oPyEtPz4pW1xzXFNdKj8oPzotLT58JCkvO29lLmh0bWw9UGUob2UuaHRtbCwiaSIpLnJlcGxhY2UoImNvbW1lbnQiLG9lLl9jb21tZW50KS5yZXBsYWNlKCJ0YWciLG9lLl90YWcpLnJlcGxhY2UoImF0dHJpYnV0ZSIsLyArW2EtekEtWjpfXVtcdy46LV0qKD86ICo9ICoiW14iXG5dKiJ8ICo9IConW14nXG5dKid8ICo9ICpbXlxzIic9PD5gXSspPy8pLmdldFJlZ2V4KCk7b2UubGhlYWRpbmc9UGUob2UubGhlYWRpbmcpLnJlcGxhY2UoL2J1bGwvZyxvZS5idWxsZXQpLmdldFJlZ2V4KCk7b2UucGFyYWdyYXBoPVBlKG9lLl9wYXJhZ3JhcGgpLnJlcGxhY2UoImhyIixvZS5ocikucmVwbGFjZSgiaGVhZGluZyIsIiB7MCwzfSN7MSw2fSAiKS5yZXBsYWNlKCJ8bGhlYWRpbmciLCIiKS5yZXBsYWNlKCJ8dGFibGUiLCIiKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoImZlbmNlcyIsIiB7MCwzfSg/OmB7Myx9KD89W15gXFxuXSpcXG4pfH57Myx9KVteXFxuXSpcXG4iKS5yZXBsYWNlKCJsaXN0IiwiIHswLDN9KD86WyorLV18MVsuKV0pICIpLnJlcGxhY2UoImh0bWwiLCI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIsb2UuX3RhZykuZ2V0UmVnZXgoKTtvZS5ibG9ja3F1b3RlPVBlKG9lLmJsb2NrcXVvdGUpLnJlcGxhY2UoInBhcmFncmFwaCIsb2UucGFyYWdyYXBoKS5nZXRSZWdleCgpO29lLm5vcm1hbD17Li4ub2V9O29lLmdmbT17Li4ub2Uubm9ybWFsLHRhYmxlOiJeICooW15cXG4gXS4qKVxcbiB7MCwzfSgoPzpcXHwgKik/Oj8tKzo/ICooPzpcXHwgKjo/LSs6PyAqKSooPzpcXHwgKik/KSg/OlxcbigoPzooPyEgKlxcbnxocnxoZWFkaW5nfGJsb2NrcXVvdGV8Y29kZXxmZW5jZXN8bGlzdHxodG1sKS4qKD86XFxufCQpKSopXFxuKnwkKSJ9O29lLmdmbS50YWJsZT1QZShvZS5nZm0udGFibGUpLnJlcGxhY2UoImhyIixvZS5ocikucmVwbGFjZSgiaGVhZGluZyIsIiB7MCwzfSN7MSw2fSAiKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoImNvZGUiLCIgezR9W15cXG5dIikucmVwbGFjZSgiZmVuY2VzIiwiIHswLDN9KD86YHszLH0oPz1bXmBcXG5dKlxcbil8fnszLH0pW15cXG5dKlxcbiIpLnJlcGxhY2UoImxpc3QiLCIgezAsM30oPzpbKistXXwxWy4pXSkgIikucmVwbGFjZSgiaHRtbCIsIjwvPyg/OnRhZykoPzogK3xcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pIikucmVwbGFjZSgidGFnIixvZS5fdGFnKS5nZXRSZWdleCgpO29lLmdmbS5wYXJhZ3JhcGg9UGUob2UuX3BhcmFncmFwaCkucmVwbGFjZSgiaHIiLG9lLmhyKS5yZXBsYWNlKCJoZWFkaW5nIiwiIHswLDN9I3sxLDZ9ICIpLnJlcGxhY2UoInxsaGVhZGluZyIsIiIpLnJlcGxhY2UoInRhYmxlIixvZS5nZm0udGFibGUpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCIgezAsM30+IikucmVwbGFjZSgiZmVuY2VzIiwiIHswLDN9KD86YHszLH0oPz1bXmBcXG5dKlxcbil8fnszLH0pW15cXG5dKlxcbiIpLnJlcGxhY2UoImxpc3QiLCIgezAsM30oPzpbKistXXwxWy4pXSkgIikucmVwbGFjZSgiaHRtbCIsIjwvPyg/OnRhZykoPzogK3xcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pIikucmVwbGFjZSgidGFnIixvZS5fdGFnKS5nZXRSZWdleCgpO29lLnBlZGFudGljPXsuLi5vZS5ub3JtYWwsaHRtbDpQZShgXiAqKD86Y29tbWVudCAqKD86XFxufFxccyokKXw8KHRhZylbXFxzXFxTXSs/PC9cXDE+ICooPzpcXG57Mix9fFxccyokKXw8dGFnKD86IlteIl0qInwnW14nXSonfFxcc1teJyIvPlxcc10qKSo/Lz8+ICooPzpcXG57Mix9fFxccyokKSlgKS5yZXBsYWNlKCJjb21tZW50IixvZS5fY29tbWVudCkucmVwbGFjZSgvdGFnL2csIig/ISg/OmF8ZW18c3Ryb25nfHNtYWxsfHN8Y2l0ZXxxfGRmbnxhYmJyfGRhdGF8dGltZXxjb2RlfHZhcnxzYW1wfGtiZHxzdWJ8c3VwfGl8Ynx1fG1hcmt8cnVieXxydHxycHxiZGl8YmRvfHNwYW58YnJ8d2JyfGluc3xkZWx8aW1nKVxcYilcXHcrKD8hOnxbXlxcd1xcc0BdKkApXFxiIikuZ2V0UmVnZXgoKSxkZWY6L14gKlxbKFteXF1dKylcXTogKjw/KFteXHM+XSspPj8oPzogKyhbIihdW15cbl0rWyIpXSkpPyAqKD86XG4rfCQpLyxoZWFkaW5nOi9eKCN7MSw2fSkoLiopKD86XG4rfCQpLyxmZW5jZXM6eGMsbGhlYWRpbmc6L14oLis/KVxuIHswLDN9KD0rfC0rKSAqKD86XG4rfCQpLyxwYXJhZ3JhcGg6UGUob2Uubm9ybWFsLl9wYXJhZ3JhcGgpLnJlcGxhY2UoImhyIixvZS5ocikucmVwbGFjZSgiaGVhZGluZyIsYCAqI3sxLDZ9ICpbXgpdYCkucmVwbGFjZSgibGhlYWRpbmciLG9lLmxoZWFkaW5nKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoInxmZW5jZXMiLCIiKS5yZXBsYWNlKCJ8bGlzdCIsIiIpLnJlcGxhY2UoInxodG1sIiwiIikuZ2V0UmVnZXgoKX07Y29uc3QgWT17ZXNjYXBlOi9eXFwoWyEiIyQlJicoKSorLFwtLi86Ozw9Pj9AXFtcXVxcXl9ge3x9fl0pLyxhdXRvbGluazovXjwoc2NoZW1lOlteXHNceDAwLVx4MWY8Pl0qfGVtYWlsKT4vLHVybDp4Yyx0YWc6Il5jb21tZW50fF48L1thLXpBLVpdW1xcdzotXSpcXHMqPnxePFthLXpBLVpdW1xcdy1dKig/OmF0dHJpYnV0ZSkqP1xccyovPz58XjxcXD9bXFxzXFxTXSo/XFw/PnxePCFbYS16QS1aXStcXHNbXFxzXFxTXSo/PnxePCFcXFtDREFUQVxcW1tcXHNcXFNdKj9cXF1cXF0+IixsaW5rOi9eIT9cWyhsYWJlbClcXVwoXHMqKGhyZWYpKD86XHMrKHRpdGxlKSk/XHMqXCkvLHJlZmxpbms6L14hP1xbKGxhYmVsKVxdXFsocmVmKVxdLyxub2xpbms6L14hP1xbKHJlZilcXSg/OlxbXF0pPy8scmVmbGlua1NlYXJjaDoicmVmbGlua3xub2xpbmsoPyFcXCgpIixlbVN0cm9uZzp7bERlbGltOi9eKD86XCorKD86KCg/IVwqKVtwdW5jdF0pfFteXHMqXSkpfF5fKyg/OigoPyFfKVtwdW5jdF0pfChbXlxzX10pKS8sckRlbGltQXN0Oi9eW15fKl0qP19fW15fKl0qP1wqW15fKl0qPyg/PV9fKXxbXipdKyg/PVteKl0pfCg/IVwqKVtwdW5jdF0oXCorKSg/PVtcc118JCl8W15wdW5jdFxzXShcKispKD8hXCopKD89W3B1bmN0XHNdfCQpfCg/IVwqKVtwdW5jdFxzXShcKispKD89W15wdW5jdFxzXSl8W1xzXShcKispKD8hXCopKD89W3B1bmN0XSl8KD8hXCopW3B1bmN0XShcKispKD8hXCopKD89W3B1bmN0XSl8W15wdW5jdFxzXShcKispKD89W15wdW5jdFxzXSkvLHJEZWxpbVVuZDovXlteXypdKj9cKlwqW15fKl0qP19bXl8qXSo/KD89XCpcKil8W15fXSsoPz1bXl9dKXwoPyFfKVtwdW5jdF0oXyspKD89W1xzXXwkKXxbXnB1bmN0XHNdKF8rKSg/IV8pKD89W3B1bmN0XHNdfCQpfCg/IV8pW3B1bmN0XHNdKF8rKSg/PVtecHVuY3Rcc10pfFtcc10oXyspKD8hXykoPz1bcHVuY3RdKXwoPyFfKVtwdW5jdF0oXyspKD8hXykoPz1bcHVuY3RdKS99LGNvZGU6L14oYCspKFteYF18W15gXVtcc1xTXSo/W15gXSlcMSg/IWApLyxicjovXiggezIsfXxcXClcbig/IVxzKiQpLyxkZWw6eGMsdGV4dDovXihgK3xbXmBdKSg/Oig/PSB7Mix9XG4pfFtcc1xTXSo/KD86KD89W1xcPCFcW2AqX118XGJffCQpfFteIF0oPz0gezIsfVxuKSkpLyxwdW5jdHVhdGlvbjovXigoPyFbKl9dKVtcc3B1bmN0dWF0aW9uXSkvfTtZLl9wdW5jdHVhdGlvbj0iXFxwe1B9JCs8PT5gXnx+IjtZLnB1bmN0dWF0aW9uPVBlKFkucHVuY3R1YXRpb24sInUiKS5yZXBsYWNlKC9wdW5jdHVhdGlvbi9nLFkuX3B1bmN0dWF0aW9uKS5nZXRSZWdleCgpO1kuYmxvY2tTa2lwPS9cW1teW1xdXSo/XF1cKFteXChcKV0qP1wpfGBbXmBdKj9gfDxbXjw+XSo/Pi9nO1kuYW55UHVuY3R1YXRpb249L1xcW3B1bmN0XS9nO1kuX2VzY2FwZXM9L1xcKFtwdW5jdF0pL2c7WS5fY29tbWVudD1QZShvZS5fY29tbWVudCkucmVwbGFjZSgiKD86LS0+fCQpIiwiLS0+IikuZ2V0UmVnZXgoKTtZLmVtU3Ryb25nLmxEZWxpbT1QZShZLmVtU3Ryb25nLmxEZWxpbSwidSIpLnJlcGxhY2UoL3B1bmN0L2csWS5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7WS5lbVN0cm9uZy5yRGVsaW1Bc3Q9UGUoWS5lbVN0cm9uZy5yRGVsaW1Bc3QsImd1IikucmVwbGFjZSgvcHVuY3QvZyxZLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtZLmVtU3Ryb25nLnJEZWxpbVVuZD1QZShZLmVtU3Ryb25nLnJEZWxpbVVuZCwiZ3UiKS5yZXBsYWNlKC9wdW5jdC9nLFkuX3B1bmN0dWF0aW9uKS5nZXRSZWdleCgpO1kuYW55UHVuY3R1YXRpb249UGUoWS5hbnlQdW5jdHVhdGlvbiwiZ3UiKS5yZXBsYWNlKC9wdW5jdC9nLFkuX3B1bmN0dWF0aW9uKS5nZXRSZWdleCgpO1kuX2VzY2FwZXM9UGUoWS5fZXNjYXBlcywiZ3UiKS5yZXBsYWNlKC9wdW5jdC9nLFkuX3B1bmN0dWF0aW9uKS5nZXRSZWdleCgpO1kuX3NjaGVtZT0vW2EtekEtWl1bYS16QS1aMC05Ky4tXXsxLDMxfS87WS5fZW1haWw9L1thLXpBLVowLTkuISMkJSYnKisvPT9eX2B7fH1+LV0rKEApW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKyg/IVstX10pLztZLmF1dG9saW5rPVBlKFkuYXV0b2xpbmspLnJlcGxhY2UoInNjaGVtZSIsWS5fc2NoZW1lKS5yZXBsYWNlKCJlbWFpbCIsWS5fZW1haWwpLmdldFJlZ2V4KCk7WS5fYXR0cmlidXRlPS9ccytbYS16QS1aOl9dW1x3LjotXSooPzpccyo9XHMqIlteIl0qInxccyo9XHMqJ1teJ10qJ3xccyo9XHMqW15ccyInPTw+YF0rKT8vO1kudGFnPVBlKFkudGFnKS5yZXBsYWNlKCJjb21tZW50IixZLl9jb21tZW50KS5yZXBsYWNlKCJhdHRyaWJ1dGUiLFkuX2F0dHJpYnV0ZSkuZ2V0UmVnZXgoKTtZLl9sYWJlbD0vKD86XFsoPzpcXC58W15cW1xdXFxdKSpcXXxcXC58YFteYF0qYHxbXlxbXF1cXGBdKSo/LztZLl9ocmVmPS88KD86XFwufFteXG48PlxcXSkrPnxbXlxzXHgwMC1ceDFmXSovO1kuX3RpdGxlPS8iKD86XFwiP3xbXiJcXF0pKiJ8Jyg/OlxcJz98W14nXFxdKSonfFwoKD86XFxcKT98W14pXFxdKSpcKS87WS5saW5rPVBlKFkubGluaykucmVwbGFjZSgibGFiZWwiLFkuX2xhYmVsKS5yZXBsYWNlKCJocmVmIixZLl9ocmVmKS5yZXBsYWNlKCJ0aXRsZSIsWS5fdGl0bGUpLmdldFJlZ2V4KCk7WS5yZWZsaW5rPVBlKFkucmVmbGluaykucmVwbGFjZSgibGFiZWwiLFkuX2xhYmVsKS5yZXBsYWNlKCJyZWYiLG9lLl9sYWJlbCkuZ2V0UmVnZXgoKTtZLm5vbGluaz1QZShZLm5vbGluaykucmVwbGFjZSgicmVmIixvZS5fbGFiZWwpLmdldFJlZ2V4KCk7WS5yZWZsaW5rU2VhcmNoPVBlKFkucmVmbGlua1NlYXJjaCwiZyIpLnJlcGxhY2UoInJlZmxpbmsiLFkucmVmbGluaykucmVwbGFjZSgibm9saW5rIixZLm5vbGluaykuZ2V0UmVnZXgoKTtZLm5vcm1hbD17Li4uWX07WS5wZWRhbnRpYz17Li4uWS5ub3JtYWwsc3Ryb25nOntzdGFydDovXl9ffFwqXCovLG1pZGRsZTovXl9fKD89XFMpKFtcc1xTXSo/XFMpX18oPyFfKXxeXCpcKig/PVxTKShbXHNcU10qP1xTKVwqXCooPyFcKikvLGVuZEFzdDovXCpcKig/IVwqKS9nLGVuZFVuZDovX18oPyFfKS9nfSxlbTp7c3RhcnQ6L15ffFwqLyxtaWRkbGU6L14oKVwqKD89XFMpKFtcc1xTXSo/XFMpXCooPyFcKil8Xl8oPz1cUykoW1xzXFNdKj9cUylfKD8hXykvLGVuZEFzdDovXCooPyFcKikvZyxlbmRVbmQ6L18oPyFfKS9nfSxsaW5rOlBlKC9eIT9cWyhsYWJlbClcXVwoKC4qPylcKS8pLnJlcGxhY2UoImxhYmVsIixZLl9sYWJlbCkuZ2V0UmVnZXgoKSxyZWZsaW5rOlBlKC9eIT9cWyhsYWJlbClcXVxzKlxbKFteXF1dKilcXS8pLnJlcGxhY2UoImxhYmVsIixZLl9sYWJlbCkuZ2V0UmVnZXgoKX07WS5nZm09ey4uLlkubm9ybWFsLGVzY2FwZTpQZShZLmVzY2FwZSkucmVwbGFjZSgiXSkiLCJ+fF0pIikuZ2V0UmVnZXgoKSxfZXh0ZW5kZWRfZW1haWw6L1tBLVphLXowLTkuXystXSsoQClbYS16QS1aMC05LV9dKyg/OlwuW2EtekEtWjAtOS1fXSpbYS16QS1aMC05XSkrKD8hWy1fXSkvLHVybDovXigoPzpmdHB8aHR0cHM/KTpcL1wvfHd3d1wuKSg/OlthLXpBLVowLTlcLV0rXC4/KStbXlxzPF0qfF5lbWFpbC8sX2JhY2twZWRhbDovKD86W14/IS4sOjsqXycifigpJl0rfFwoW14pXSpcKXwmKD8hW2EtekEtWjAtOV0rOyQpfFs/IS4sOjsqXycifildKyg/ISQpKSsvLGRlbDovXih+fj8pKD89W15cc35dKShbXHNcU10qP1teXHN+XSlcMSg/PVtefl18JCkvLHRleHQ6L14oW2B+XSt8W15gfl0pKD86KD89IHsyLH1cbil8KD89W2EtekEtWjAtOS4hIyQlJicqK1wvPT9fYHtcfH1+LV0rQCl8W1xzXFNdKj8oPzooPz1bXFw8IVxbYCp+X118XGJffGh0dHBzPzpcL1wvfGZ0cDpcL1wvfHd3d1wufCQpfFteIF0oPz0gezIsfVxuKXxbXmEtekEtWjAtOS4hIyQlJicqK1wvPT9fYHtcfH1+LV0oPz1bYS16QS1aMC05LiEjJCUmJyorXC89P19ge1x8fX4tXStAKSkpL307WS5nZm0udXJsPVBlKFkuZ2ZtLnVybCwiaSIpLnJlcGxhY2UoImVtYWlsIixZLmdmbS5fZXh0ZW5kZWRfZW1haWwpLmdldFJlZ2V4KCk7WS5icmVha3M9ey4uLlkuZ2ZtLGJyOlBlKFkuYnIpLnJlcGxhY2UoInsyLH0iLCIqIikuZ2V0UmVnZXgoKSx0ZXh0OlBlKFkuZ2ZtLnRleHQpLnJlcGxhY2UoIlxcYl8iLCJcXGJffCB7Mix9XFxuIikucmVwbGFjZSgvXHsyLFx9L2csIioiKS5nZXRSZWdleCgpfTtjbGFzcyBocntjb25zdHJ1Y3Rvcih0KXtqZSh0aGlzLCJ0b2tlbnMiKTtqZSh0aGlzLCJvcHRpb25zIik7amUodGhpcywic3RhdGUiKTtqZSh0aGlzLCJ0b2tlbml6ZXIiKTtqZSh0aGlzLCJpbmxpbmVRdWV1ZSIpO3RoaXMudG9rZW5zPVtdLHRoaXMudG9rZW5zLmxpbmtzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5vcHRpb25zPXR8fGJpLHRoaXMub3B0aW9ucy50b2tlbml6ZXI9dGhpcy5vcHRpb25zLnRva2VuaXplcnx8bmV3IHdjLHRoaXMudG9rZW5pemVyPXRoaXMub3B0aW9ucy50b2tlbml6ZXIsdGhpcy50b2tlbml6ZXIub3B0aW9ucz10aGlzLm9wdGlvbnMsdGhpcy50b2tlbml6ZXIubGV4ZXI9dGhpcyx0aGlzLmlubGluZVF1ZXVlPVtdLHRoaXMuc3RhdGU9e2luTGluazohMSxpblJhd0Jsb2NrOiExLHRvcDohMH07Y29uc3Qgbj17YmxvY2s6b2Uubm9ybWFsLGlubGluZTpZLm5vcm1hbH07dGhpcy5vcHRpb25zLnBlZGFudGljPyhuLmJsb2NrPW9lLnBlZGFudGljLG4uaW5saW5lPVkucGVkYW50aWMpOnRoaXMub3B0aW9ucy5nZm0mJihuLmJsb2NrPW9lLmdmbSx0aGlzLm9wdGlvbnMuYnJlYWtzP24uaW5saW5lPVkuYnJlYWtzOm4uaW5saW5lPVkuZ2ZtKSx0aGlzLnRva2VuaXplci5ydWxlcz1ufXN0YXRpYyBnZXQgcnVsZXMoKXtyZXR1cm57YmxvY2s6b2UsaW5saW5lOll9fXN0YXRpYyBsZXgodCxuKXtyZXR1cm4gbmV3IGhyKG4pLmxleCh0KX1zdGF0aWMgbGV4SW5saW5lKHQsbil7cmV0dXJuIG5ldyBocihuKS5pbmxpbmVUb2tlbnModCl9bGV4KHQpe3Q9dC5yZXBsYWNlKC9cclxufFxyL2csYApgKSx0aGlzLmJsb2NrVG9rZW5zKHQsdGhpcy50b2tlbnMpO2xldCBuO2Zvcig7bj10aGlzLmlubGluZVF1ZXVlLnNoaWZ0KCk7KXRoaXMuaW5saW5lVG9rZW5zKG4uc3JjLG4udG9rZW5zKTtyZXR1cm4gdGhpcy50b2tlbnN9YmxvY2tUb2tlbnModCxuPVtdKXt0aGlzLm9wdGlvbnMucGVkYW50aWM/dD10LnJlcGxhY2UoL1x0L2csIiAgICAiKS5yZXBsYWNlKC9eICskL2dtLCIiKTp0PXQucmVwbGFjZSgvXiggKikoXHQrKS9nbSwocyxhLHUpPT5hKyIgICAgIi5yZXBlYXQodS5sZW5ndGgpKTtsZXQgcixvLGksbDtmb3IoO3Q7KWlmKCEodGhpcy5vcHRpb25zLmV4dGVuc2lvbnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLmJsb2NrJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5ibG9jay5zb21lKHM9PihyPXMuY2FsbCh7bGV4ZXI6dGhpc30sdCxuKSk/KHQ9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gociksITApOiExKSkpe2lmKHI9dGhpcy50b2tlbml6ZXIuc3BhY2UodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxyLnJhdy5sZW5ndGg9PT0xJiZuLmxlbmd0aD4wP25bbi5sZW5ndGgtMV0ucmF3Kz1gCmA6bi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuY29kZSh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG89bltuLmxlbmd0aC0xXSxvJiYoby50eXBlPT09InBhcmFncmFwaCJ8fG8udHlwZT09PSJ0ZXh0Iik/KG8ucmF3Kz1gCmArci5yYXcsby50ZXh0Kz1gCmArci50ZXh0LHRoaXMuaW5saW5lUXVldWVbdGhpcy5pbmxpbmVRdWV1ZS5sZW5ndGgtMV0uc3JjPW8udGV4dCk6bi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuZmVuY2VzKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuaGVhZGluZyh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmhyKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuYmxvY2txdW90ZSh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmxpc3QodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5odG1sKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuZGVmKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbz1uW24ubGVuZ3RoLTFdLG8mJihvLnR5cGU9PT0icGFyYWdyYXBoInx8by50eXBlPT09InRleHQiKT8oby5yYXcrPWAKYCtyLnJhdyxvLnRleHQrPWAKYCtyLnJhdyx0aGlzLmlubGluZVF1ZXVlW3RoaXMuaW5saW5lUXVldWUubGVuZ3RoLTFdLnNyYz1vLnRleHQpOnRoaXMudG9rZW5zLmxpbmtzW3IudGFnXXx8KHRoaXMudG9rZW5zLmxpbmtzW3IudGFnXT17aHJlZjpyLmhyZWYsdGl0bGU6ci50aXRsZX0pO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIudGFibGUodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5saGVhZGluZyh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihpPXQsdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0QmxvY2spe2xldCBzPTEvMDtjb25zdCBhPXQuc2xpY2UoMSk7bGV0IHU7dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRCbG9jay5mb3JFYWNoKGM9Pnt1PWMuY2FsbCh7bGV4ZXI6dGhpc30sYSksdHlwZW9mIHU9PSJudW1iZXIiJiZ1Pj0wJiYocz1NYXRoLm1pbihzLHUpKX0pLHM8MS8wJiZzPj0wJiYoaT10LnN1YnN0cmluZygwLHMrMSkpfWlmKHRoaXMuc3RhdGUudG9wJiYocj10aGlzLnRva2VuaXplci5wYXJhZ3JhcGgoaSkpKXtvPW5bbi5sZW5ndGgtMV0sbCYmby50eXBlPT09InBhcmFncmFwaCI/KG8ucmF3Kz1gCmArci5yYXcsby50ZXh0Kz1gCmArci50ZXh0LHRoaXMuaW5saW5lUXVldWUucG9wKCksdGhpcy5pbmxpbmVRdWV1ZVt0aGlzLmlubGluZVF1ZXVlLmxlbmd0aC0xXS5zcmM9by50ZXh0KTpuLnB1c2gociksbD1pLmxlbmd0aCE9PXQubGVuZ3RoLHQ9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLnRleHQodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxvPW5bbi5sZW5ndGgtMV0sbyYmby50eXBlPT09InRleHQiPyhvLnJhdys9YApgK3IucmF3LG8udGV4dCs9YApgK3IudGV4dCx0aGlzLmlubGluZVF1ZXVlLnBvcCgpLHRoaXMuaW5saW5lUXVldWVbdGhpcy5pbmxpbmVRdWV1ZS5sZW5ndGgtMV0uc3JjPW8udGV4dCk6bi5wdXNoKHIpO2NvbnRpbnVlfWlmKHQpe2NvbnN0IHM9IkluZmluaXRlIGxvb3Agb24gYnl0ZTogIit0LmNoYXJDb2RlQXQoMCk7aWYodGhpcy5vcHRpb25zLnNpbGVudCl7Y29uc29sZS5lcnJvcihzKTticmVha31lbHNlIHRocm93IG5ldyBFcnJvcihzKX19cmV0dXJuIHRoaXMuc3RhdGUudG9wPSEwLG59aW5saW5lKHQsbj1bXSl7cmV0dXJuIHRoaXMuaW5saW5lUXVldWUucHVzaCh7c3JjOnQsdG9rZW5zOm59KSxufWlubGluZVRva2Vucyh0LG49W10pe2xldCByLG8saSxsPXQscyxhLHU7aWYodGhpcy50b2tlbnMubGlua3Mpe2NvbnN0IGM9T2JqZWN0LmtleXModGhpcy50b2tlbnMubGlua3MpO2lmKGMubGVuZ3RoPjApZm9yKDsocz10aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUucmVmbGlua1NlYXJjaC5leGVjKGwpKSE9bnVsbDspYy5pbmNsdWRlcyhzWzBdLnNsaWNlKHNbMF0ubGFzdEluZGV4T2YoIlsiKSsxLC0xKSkmJihsPWwuc2xpY2UoMCxzLmluZGV4KSsiWyIrImEiLnJlcGVhdChzWzBdLmxlbmd0aC0yKSsiXSIrbC5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUucmVmbGlua1NlYXJjaC5sYXN0SW5kZXgpKX1mb3IoOyhzPXRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAuZXhlYyhsKSkhPW51bGw7KWw9bC5zbGljZSgwLHMuaW5kZXgpKyJbIisiYSIucmVwZWF0KHNbMF0ubGVuZ3RoLTIpKyJdIitsLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5ibG9ja1NraXAubGFzdEluZGV4KTtmb3IoOyhzPXRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbi5leGVjKGwpKSE9bnVsbDspbD1sLnNsaWNlKDAscy5pbmRleCkrIisrIitsLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5hbnlQdW5jdHVhdGlvbi5sYXN0SW5kZXgpO2Zvcig7dDspaWYoYXx8KHU9IiIpLGE9ITEsISh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuaW5saW5lJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5pbmxpbmUuc29tZShjPT4ocj1jLmNhbGwoe2xleGVyOnRoaXN9LHQsbikpPyh0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpLCEwKTohMSkpKXtpZihyPXRoaXMudG9rZW5pemVyLmVzY2FwZSh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLnRhZyh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG89bltuLmxlbmd0aC0xXSxvJiZyLnR5cGU9PT0idGV4dCImJm8udHlwZT09PSJ0ZXh0Ij8oby5yYXcrPXIucmF3LG8udGV4dCs9ci50ZXh0KTpuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5saW5rKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIucmVmbGluayh0LHRoaXMudG9rZW5zLmxpbmtzKSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG89bltuLmxlbmd0aC0xXSxvJiZyLnR5cGU9PT0idGV4dCImJm8udHlwZT09PSJ0ZXh0Ij8oby5yYXcrPXIucmF3LG8udGV4dCs9ci50ZXh0KTpuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5lbVN0cm9uZyh0LGwsdSkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5jb2Rlc3Bhbih0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmJyKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuZGVsKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuYXV0b2xpbmsodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYoIXRoaXMuc3RhdGUuaW5MaW5rJiYocj10aGlzLnRva2VuaXplci51cmwodCkpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKGk9dCx0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRJbmxpbmUpe2xldCBjPTEvMDtjb25zdCBkPXQuc2xpY2UoMSk7bGV0IGY7dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRJbmxpbmUuZm9yRWFjaChoPT57Zj1oLmNhbGwoe2xleGVyOnRoaXN9LGQpLHR5cGVvZiBmPT0ibnVtYmVyIiYmZj49MCYmKGM9TWF0aC5taW4oYyxmKSl9KSxjPDEvMCYmYz49MCYmKGk9dC5zdWJzdHJpbmcoMCxjKzEpKX1pZihyPXRoaXMudG9rZW5pemVyLmlubGluZVRleHQoaSkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxyLnJhdy5zbGljZSgtMSkhPT0iXyImJih1PXIucmF3LnNsaWNlKC0xKSksYT0hMCxvPW5bbi5sZW5ndGgtMV0sbyYmby50eXBlPT09InRleHQiPyhvLnJhdys9ci5yYXcsby50ZXh0Kz1yLnRleHQpOm4ucHVzaChyKTtjb250aW51ZX1pZih0KXtjb25zdCBjPSJJbmZpbml0ZSBsb29wIG9uIGJ5dGU6ICIrdC5jaGFyQ29kZUF0KDApO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpe2NvbnNvbGUuZXJyb3IoYyk7YnJlYWt9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYyl9fXJldHVybiBufX1jbGFzcyBfY3tjb25zdHJ1Y3Rvcih0KXtqZSh0aGlzLCJvcHRpb25zIik7dGhpcy5vcHRpb25zPXR8fGJpfWNvZGUodCxuLHIpe3ZhciBpO2NvbnN0IG89KGk9KG58fCIiKS5tYXRjaCgvXlxTKi8pKT09bnVsbD92b2lkIDA6aVswXTtyZXR1cm4gdD10LnJlcGxhY2UoL1xuJC8sIiIpK2AKYCxvPyc8cHJlPjxjb2RlIGNsYXNzPSJsYW5ndWFnZS0nK3huKG8pKyciPicrKHI/dDp4bih0LCEwKSkrYDwvY29kZT48L3ByZT4KYDoiPHByZT48Y29kZT4iKyhyP3Q6eG4odCwhMCkpK2A8L2NvZGU+PC9wcmU+CmB9YmxvY2txdW90ZSh0KXtyZXR1cm5gPGJsb2NrcXVvdGU+CiR7dH08L2Jsb2NrcXVvdGU+CmB9aHRtbCh0LG4pe3JldHVybiB0fWhlYWRpbmcodCxuLHIpe3JldHVybmA8aCR7bn0+JHt0fTwvaCR7bn0+CmB9aHIoKXtyZXR1cm5gPGhyPgpgfWxpc3QodCxuLHIpe2NvbnN0IG89bj8ib2wiOiJ1bCIsaT1uJiZyIT09MT8nIHN0YXJ0PSInK3IrJyInOiIiO3JldHVybiI8IitvK2krYD4KYCt0KyI8LyIrbytgPgpgfWxpc3RpdGVtKHQsbixyKXtyZXR1cm5gPGxpPiR7dH08L2xpPgpgfWNoZWNrYm94KHQpe3JldHVybiI8aW5wdXQgIisodD8nY2hlY2tlZD0iIiAnOiIiKSsnZGlzYWJsZWQ9IiIgdHlwZT0iY2hlY2tib3giPid9cGFyYWdyYXBoKHQpe3JldHVybmA8cD4ke3R9PC9wPgpgfXRhYmxlKHQsbil7cmV0dXJuIG4mJihuPWA8dGJvZHk+JHtufTwvdGJvZHk+YCksYDx0YWJsZT4KPHRoZWFkPgpgK3QrYDwvdGhlYWQ+CmArbitgPC90YWJsZT4KYH10YWJsZXJvdyh0KXtyZXR1cm5gPHRyPgoke3R9PC90cj4KYH10YWJsZWNlbGwodCxuKXtjb25zdCByPW4uaGVhZGVyPyJ0aCI6InRkIjtyZXR1cm4obi5hbGlnbj9gPCR7cn0gYWxpZ249IiR7bi5hbGlnbn0iPmA6YDwke3J9PmApK3QrYDwvJHtyfT4KYH1zdHJvbmcodCl7cmV0dXJuYDxzdHJvbmc+JHt0fTwvc3Ryb25nPmB9ZW0odCl7cmV0dXJuYDxlbT4ke3R9PC9lbT5gfWNvZGVzcGFuKHQpe3JldHVybmA8Y29kZT4ke3R9PC9jb2RlPmB9YnIoKXtyZXR1cm4iPGJyPiJ9ZGVsKHQpe3JldHVybmA8ZGVsPiR7dH08L2RlbD5gfWxpbmsodCxuLHIpe2NvbnN0IG89bXkodCk7aWYobz09PW51bGwpcmV0dXJuIHI7dD1vO2xldCBpPSc8YSBocmVmPSInK3QrJyInO3JldHVybiBuJiYoaSs9JyB0aXRsZT0iJytuKyciJyksaSs9Ij4iK3IrIjwvYT4iLGl9aW1hZ2UodCxuLHIpe2NvbnN0IG89bXkodCk7aWYobz09PW51bGwpcmV0dXJuIHI7dD1vO2xldCBpPWA8aW1nIHNyYz0iJHt0fSIgYWx0PSIke3J9ImA7cmV0dXJuIG4mJihpKz1gIHRpdGxlPSIke259ImApLGkrPSI+IixpfXRleHQodCl7cmV0dXJuIHR9fWNsYXNzIEJne3N0cm9uZyh0KXtyZXR1cm4gdH1lbSh0KXtyZXR1cm4gdH1jb2Rlc3Bhbih0KXtyZXR1cm4gdH1kZWwodCl7cmV0dXJuIHR9aHRtbCh0KXtyZXR1cm4gdH10ZXh0KHQpe3JldHVybiB0fWxpbmsodCxuLHIpe3JldHVybiIiK3J9aW1hZ2UodCxuLHIpe3JldHVybiIiK3J9YnIoKXtyZXR1cm4iIn19Y2xhc3MgcHJ7Y29uc3RydWN0b3IodCl7amUodGhpcywib3B0aW9ucyIpO2plKHRoaXMsInJlbmRlcmVyIik7amUodGhpcywidGV4dFJlbmRlcmVyIik7dGhpcy5vcHRpb25zPXR8fGJpLHRoaXMub3B0aW9ucy5yZW5kZXJlcj10aGlzLm9wdGlvbnMucmVuZGVyZXJ8fG5ldyBfYyx0aGlzLnJlbmRlcmVyPXRoaXMub3B0aW9ucy5yZW5kZXJlcix0aGlzLnJlbmRlcmVyLm9wdGlvbnM9dGhpcy5vcHRpb25zLHRoaXMudGV4dFJlbmRlcmVyPW5ldyBCZ31zdGF0aWMgcGFyc2UodCxuKXtyZXR1cm4gbmV3IHByKG4pLnBhcnNlKHQpfXN0YXRpYyBwYXJzZUlubGluZSh0LG4pe3JldHVybiBuZXcgcHIobikucGFyc2VJbmxpbmUodCl9cGFyc2UodCxuPSEwKXtsZXQgcj0iIjtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgaT10W29dO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1tpLnR5cGVdKXtjb25zdCBsPWkscz10aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbbC50eXBlXS5jYWxsKHtwYXJzZXI6dGhpc30sbCk7aWYocyE9PSExfHwhWyJzcGFjZSIsImhyIiwiaGVhZGluZyIsImNvZGUiLCJ0YWJsZSIsImJsb2NrcXVvdGUiLCJsaXN0IiwiaHRtbCIsInBhcmFncmFwaCIsInRleHQiXS5pbmNsdWRlcyhsLnR5cGUpKXtyKz1zfHwiIjtjb250aW51ZX19c3dpdGNoKGkudHlwZSl7Y2FzZSJzcGFjZSI6Y29udGludWU7Y2FzZSJociI6e3IrPXRoaXMucmVuZGVyZXIuaHIoKTtjb250aW51ZX1jYXNlImhlYWRpbmciOntjb25zdCBsPWk7cis9dGhpcy5yZW5kZXJlci5oZWFkaW5nKHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMpLGwuZGVwdGgseU4odGhpcy5wYXJzZUlubGluZShsLnRva2Vucyx0aGlzLnRleHRSZW5kZXJlcikpKTtjb250aW51ZX1jYXNlImNvZGUiOntjb25zdCBsPWk7cis9dGhpcy5yZW5kZXJlci5jb2RlKGwudGV4dCxsLmxhbmcsISFsLmVzY2FwZWQpO2NvbnRpbnVlfWNhc2UidGFibGUiOntjb25zdCBsPWk7bGV0IHM9IiIsYT0iIjtmb3IobGV0IGM9MDtjPGwuaGVhZGVyLmxlbmd0aDtjKyspYSs9dGhpcy5yZW5kZXJlci50YWJsZWNlbGwodGhpcy5wYXJzZUlubGluZShsLmhlYWRlcltjXS50b2tlbnMpLHtoZWFkZXI6ITAsYWxpZ246bC5hbGlnbltjXX0pO3MrPXRoaXMucmVuZGVyZXIudGFibGVyb3coYSk7bGV0IHU9IiI7Zm9yKGxldCBjPTA7YzxsLnJvd3MubGVuZ3RoO2MrKyl7Y29uc3QgZD1sLnJvd3NbY107YT0iIjtmb3IobGV0IGY9MDtmPGQubGVuZ3RoO2YrKylhKz10aGlzLnJlbmRlcmVyLnRhYmxlY2VsbCh0aGlzLnBhcnNlSW5saW5lKGRbZl0udG9rZW5zKSx7aGVhZGVyOiExLGFsaWduOmwuYWxpZ25bZl19KTt1Kz10aGlzLnJlbmRlcmVyLnRhYmxlcm93KGEpfXIrPXRoaXMucmVuZGVyZXIudGFibGUocyx1KTtjb250aW51ZX1jYXNlImJsb2NrcXVvdGUiOntjb25zdCBsPWkscz10aGlzLnBhcnNlKGwudG9rZW5zKTtyKz10aGlzLnJlbmRlcmVyLmJsb2NrcXVvdGUocyk7Y29udGludWV9Y2FzZSJsaXN0Ijp7Y29uc3QgbD1pLHM9bC5vcmRlcmVkLGE9bC5zdGFydCx1PWwubG9vc2U7bGV0IGM9IiI7Zm9yKGxldCBkPTA7ZDxsLml0ZW1zLmxlbmd0aDtkKyspe2NvbnN0IGY9bC5pdGVtc1tkXSxoPWYuY2hlY2tlZCxtPWYudGFzaztsZXQgZz0iIjtpZihmLnRhc2spe2NvbnN0IFM9dGhpcy5yZW5kZXJlci5jaGVja2JveCghIWgpO3U/Zi50b2tlbnMubGVuZ3RoPjAmJmYudG9rZW5zWzBdLnR5cGU9PT0icGFyYWdyYXBoIj8oZi50b2tlbnNbMF0udGV4dD1TKyIgIitmLnRva2Vuc1swXS50ZXh0LGYudG9rZW5zWzBdLnRva2VucyYmZi50b2tlbnNbMF0udG9rZW5zLmxlbmd0aD4wJiZmLnRva2Vuc1swXS50b2tlbnNbMF0udHlwZT09PSJ0ZXh0IiYmKGYudG9rZW5zWzBdLnRva2Vuc1swXS50ZXh0PVMrIiAiK2YudG9rZW5zWzBdLnRva2Vuc1swXS50ZXh0KSk6Zi50b2tlbnMudW5zaGlmdCh7dHlwZToidGV4dCIsdGV4dDpTKyIgIn0pOmcrPVMrIiAifWcrPXRoaXMucGFyc2UoZi50b2tlbnMsdSksYys9dGhpcy5yZW5kZXJlci5saXN0aXRlbShnLG0sISFoKX1yKz10aGlzLnJlbmRlcmVyLmxpc3QoYyxzLGEpO2NvbnRpbnVlfWNhc2UiaHRtbCI6e2NvbnN0IGw9aTtyKz10aGlzLnJlbmRlcmVyLmh0bWwobC50ZXh0LGwuYmxvY2spO2NvbnRpbnVlfWNhc2UicGFyYWdyYXBoIjp7Y29uc3QgbD1pO3IrPXRoaXMucmVuZGVyZXIucGFyYWdyYXBoKHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMpKTtjb250aW51ZX1jYXNlInRleHQiOntsZXQgbD1pLHM9bC50b2tlbnM/dGhpcy5wYXJzZUlubGluZShsLnRva2Vucyk6bC50ZXh0O2Zvcig7bysxPHQubGVuZ3RoJiZ0W28rMV0udHlwZT09PSJ0ZXh0IjspbD10Wysrb10scys9YApgKyhsLnRva2Vucz90aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zKTpsLnRleHQpO3IrPW4/dGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgocyk6cztjb250aW51ZX1kZWZhdWx0Ontjb25zdCBsPSdUb2tlbiB3aXRoICInK2kudHlwZSsnIiB0eXBlIHdhcyBub3QgZm91bmQuJztpZih0aGlzLm9wdGlvbnMuc2lsZW50KXJldHVybiBjb25zb2xlLmVycm9yKGwpLCIiO3Rocm93IG5ldyBFcnJvcihsKX19fXJldHVybiByfXBhcnNlSW5saW5lKHQsbil7bj1ufHx0aGlzLnJlbmRlcmVyO2xldCByPSIiO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBpPXRbb107aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVycyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2kudHlwZV0pe2NvbnN0IGw9dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2kudHlwZV0uY2FsbCh7cGFyc2VyOnRoaXN9LGkpO2lmKGwhPT0hMXx8IVsiZXNjYXBlIiwiaHRtbCIsImxpbmsiLCJpbWFnZSIsInN0cm9uZyIsImVtIiwiY29kZXNwYW4iLCJiciIsImRlbCIsInRleHQiXS5pbmNsdWRlcyhpLnR5cGUpKXtyKz1sfHwiIjtjb250aW51ZX19c3dpdGNoKGkudHlwZSl7Y2FzZSJlc2NhcGUiOntjb25zdCBsPWk7cis9bi50ZXh0KGwudGV4dCk7YnJlYWt9Y2FzZSJodG1sIjp7Y29uc3QgbD1pO3IrPW4uaHRtbChsLnRleHQpO2JyZWFrfWNhc2UibGluayI6e2NvbnN0IGw9aTtyKz1uLmxpbmsobC5ocmVmLGwudGl0bGUsdGhpcy5wYXJzZUlubGluZShsLnRva2VucyxuKSk7YnJlYWt9Y2FzZSJpbWFnZSI6e2NvbnN0IGw9aTtyKz1uLmltYWdlKGwuaHJlZixsLnRpdGxlLGwudGV4dCk7YnJlYWt9Y2FzZSJzdHJvbmciOntjb25zdCBsPWk7cis9bi5zdHJvbmcodGhpcy5wYXJzZUlubGluZShsLnRva2VucyxuKSk7YnJlYWt9Y2FzZSJlbSI6e2NvbnN0IGw9aTtyKz1uLmVtKHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMsbikpO2JyZWFrfWNhc2UiY29kZXNwYW4iOntjb25zdCBsPWk7cis9bi5jb2Rlc3BhbihsLnRleHQpO2JyZWFrfWNhc2UiYnIiOntyKz1uLmJyKCk7YnJlYWt9Y2FzZSJkZWwiOntjb25zdCBsPWk7cis9bi5kZWwodGhpcy5wYXJzZUlubGluZShsLnRva2VucyxuKSk7YnJlYWt9Y2FzZSJ0ZXh0Ijp7Y29uc3QgbD1pO3IrPW4udGV4dChsLnRleHQpO2JyZWFrfWRlZmF1bHQ6e2NvbnN0IGw9J1Rva2VuIHdpdGggIicraS50eXBlKyciIHR5cGUgd2FzIG5vdCBmb3VuZC4nO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpcmV0dXJuIGNvbnNvbGUuZXJyb3IobCksIiI7dGhyb3cgbmV3IEVycm9yKGwpfX19cmV0dXJuIHJ9fWNsYXNzIElze2NvbnN0cnVjdG9yKHQpe2plKHRoaXMsIm9wdGlvbnMiKTt0aGlzLm9wdGlvbnM9dHx8Yml9cHJlcHJvY2Vzcyh0KXtyZXR1cm4gdH1wb3N0cHJvY2Vzcyh0KXtyZXR1cm4gdH19amUoSXMsInBhc3NUaHJvdWdoSG9va3MiLG5ldyBTZXQoWyJwcmVwcm9jZXNzIiwicG9zdHByb2Nlc3MiXSkpO3ZhciBUYSx6aCxIYyxRdztjbGFzcyBTTntjb25zdHJ1Y3RvciguLi50KXtXZCh0aGlzLFRhKTtXZCh0aGlzLEhjKTtqZSh0aGlzLCJkZWZhdWx0cyIsRmcoKSk7amUodGhpcywib3B0aW9ucyIsdGhpcy5zZXRPcHRpb25zKTtqZSh0aGlzLCJwYXJzZSIsWWEodGhpcyxUYSx6aCkuY2FsbCh0aGlzLGhyLmxleCxwci5wYXJzZSkpO2plKHRoaXMsInBhcnNlSW5saW5lIixZYSh0aGlzLFRhLHpoKS5jYWxsKHRoaXMsaHIubGV4SW5saW5lLHByLnBhcnNlSW5saW5lKSk7amUodGhpcywiUGFyc2VyIixwcik7amUodGhpcywicGFyc2VyIixwci5wYXJzZSk7amUodGhpcywiUmVuZGVyZXIiLF9jKTtqZSh0aGlzLCJUZXh0UmVuZGVyZXIiLEJnKTtqZSh0aGlzLCJMZXhlciIsaHIpO2plKHRoaXMsImxleGVyIixoci5sZXgpO2plKHRoaXMsIlRva2VuaXplciIsd2MpO2plKHRoaXMsIkhvb2tzIixJcyk7dGhpcy51c2UoLi4udCl9d2Fsa1Rva2Vucyh0LG4pe3ZhciBvLGk7bGV0IHI9W107Zm9yKGNvbnN0IGwgb2YgdClzd2l0Y2gocj1yLmNvbmNhdChuLmNhbGwodGhpcyxsKSksbC50eXBlKXtjYXNlInRhYmxlIjp7Y29uc3Qgcz1sO2Zvcihjb25zdCBhIG9mIHMuaGVhZGVyKXI9ci5jb25jYXQodGhpcy53YWxrVG9rZW5zKGEudG9rZW5zLG4pKTtmb3IoY29uc3QgYSBvZiBzLnJvd3MpZm9yKGNvbnN0IHUgb2YgYSlyPXIuY29uY2F0KHRoaXMud2Fsa1Rva2Vucyh1LnRva2VucyxuKSk7YnJlYWt9Y2FzZSJsaXN0Ijp7Y29uc3Qgcz1sO3I9ci5jb25jYXQodGhpcy53YWxrVG9rZW5zKHMuaXRlbXMsbikpO2JyZWFrfWRlZmF1bHQ6e2NvbnN0IHM9bDsoaT0obz10aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnMpPT1udWxsP3ZvaWQgMDpvLmNoaWxkVG9rZW5zKSE9bnVsbCYmaVtzLnR5cGVdP3RoaXMuZGVmYXVsdHMuZXh0ZW5zaW9ucy5jaGlsZFRva2Vuc1tzLnR5cGVdLmZvckVhY2goYT0+e3I9ci5jb25jYXQodGhpcy53YWxrVG9rZW5zKHNbYV0sbikpfSk6cy50b2tlbnMmJihyPXIuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhzLnRva2VucyxuKSkpfX1yZXR1cm4gcn11c2UoLi4udCl7Y29uc3Qgbj10aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnN8fHtyZW5kZXJlcnM6e30sY2hpbGRUb2tlbnM6e319O3JldHVybiB0LmZvckVhY2gocj0+e2NvbnN0IG89ey4uLnJ9O2lmKG8uYXN5bmM9dGhpcy5kZWZhdWx0cy5hc3luY3x8by5hc3luY3x8ITEsci5leHRlbnNpb25zJiYoci5leHRlbnNpb25zLmZvckVhY2goaT0+e2lmKCFpLm5hbWUpdGhyb3cgbmV3IEVycm9yKCJleHRlbnNpb24gbmFtZSByZXF1aXJlZCIpO2lmKCJyZW5kZXJlciJpbiBpKXtjb25zdCBsPW4ucmVuZGVyZXJzW2kubmFtZV07bD9uLnJlbmRlcmVyc1tpLm5hbWVdPWZ1bmN0aW9uKC4uLnMpe2xldCBhPWkucmVuZGVyZXIuYXBwbHkodGhpcyxzKTtyZXR1cm4gYT09PSExJiYoYT1sLmFwcGx5KHRoaXMscykpLGF9Om4ucmVuZGVyZXJzW2kubmFtZV09aS5yZW5kZXJlcn1pZigidG9rZW5pemVyImluIGkpe2lmKCFpLmxldmVsfHxpLmxldmVsIT09ImJsb2NrIiYmaS5sZXZlbCE9PSJpbmxpbmUiKXRocm93IG5ldyBFcnJvcigiZXh0ZW5zaW9uIGxldmVsIG11c3QgYmUgJ2Jsb2NrJyBvciAnaW5saW5lJyIpO2NvbnN0IGw9bltpLmxldmVsXTtsP2wudW5zaGlmdChpLnRva2VuaXplcik6bltpLmxldmVsXT1baS50b2tlbml6ZXJdLGkuc3RhcnQmJihpLmxldmVsPT09ImJsb2NrIj9uLnN0YXJ0QmxvY2s/bi5zdGFydEJsb2NrLnB1c2goaS5zdGFydCk6bi5zdGFydEJsb2NrPVtpLnN0YXJ0XTppLmxldmVsPT09ImlubGluZSImJihuLnN0YXJ0SW5saW5lP24uc3RhcnRJbmxpbmUucHVzaChpLnN0YXJ0KTpuLnN0YXJ0SW5saW5lPVtpLnN0YXJ0XSkpfSJjaGlsZFRva2VucyJpbiBpJiZpLmNoaWxkVG9rZW5zJiYobi5jaGlsZFRva2Vuc1tpLm5hbWVdPWkuY2hpbGRUb2tlbnMpfSksby5leHRlbnNpb25zPW4pLHIucmVuZGVyZXIpe2NvbnN0IGk9dGhpcy5kZWZhdWx0cy5yZW5kZXJlcnx8bmV3IF9jKHRoaXMuZGVmYXVsdHMpO2Zvcihjb25zdCBsIGluIHIucmVuZGVyZXIpe2NvbnN0IHM9ci5yZW5kZXJlcltsXSxhPWwsdT1pW2FdO2lbYV09KC4uLmMpPT57bGV0IGQ9cy5hcHBseShpLGMpO3JldHVybiBkPT09ITEmJihkPXUuYXBwbHkoaSxjKSksZHx8IiJ9fW8ucmVuZGVyZXI9aX1pZihyLnRva2VuaXplcil7Y29uc3QgaT10aGlzLmRlZmF1bHRzLnRva2VuaXplcnx8bmV3IHdjKHRoaXMuZGVmYXVsdHMpO2Zvcihjb25zdCBsIGluIHIudG9rZW5pemVyKXtjb25zdCBzPXIudG9rZW5pemVyW2xdLGE9bCx1PWlbYV07aVthXT0oLi4uYyk9PntsZXQgZD1zLmFwcGx5KGksYyk7cmV0dXJuIGQ9PT0hMSYmKGQ9dS5hcHBseShpLGMpKSxkfX1vLnRva2VuaXplcj1pfWlmKHIuaG9va3Mpe2NvbnN0IGk9dGhpcy5kZWZhdWx0cy5ob29rc3x8bmV3IElzO2Zvcihjb25zdCBsIGluIHIuaG9va3Mpe2NvbnN0IHM9ci5ob29rc1tsXSxhPWwsdT1pW2FdO0lzLnBhc3NUaHJvdWdoSG9va3MuaGFzKGwpP2lbYV09Yz0+e2lmKHRoaXMuZGVmYXVsdHMuYXN5bmMpcmV0dXJuIFByb21pc2UucmVzb2x2ZShzLmNhbGwoaSxjKSkudGhlbihmPT51LmNhbGwoaSxmKSk7Y29uc3QgZD1zLmNhbGwoaSxjKTtyZXR1cm4gdS5jYWxsKGksZCl9OmlbYV09KC4uLmMpPT57bGV0IGQ9cy5hcHBseShpLGMpO3JldHVybiBkPT09ITEmJihkPXUuYXBwbHkoaSxjKSksZH19by5ob29rcz1pfWlmKHIud2Fsa1Rva2Vucyl7Y29uc3QgaT10aGlzLmRlZmF1bHRzLndhbGtUb2tlbnMsbD1yLndhbGtUb2tlbnM7by53YWxrVG9rZW5zPWZ1bmN0aW9uKHMpe2xldCBhPVtdO3JldHVybiBhLnB1c2gobC5jYWxsKHRoaXMscykpLGkmJihhPWEuY29uY2F0KGkuY2FsbCh0aGlzLHMpKSksYX19dGhpcy5kZWZhdWx0cz17Li4udGhpcy5kZWZhdWx0cywuLi5vfX0pLHRoaXN9c2V0T3B0aW9ucyh0KXtyZXR1cm4gdGhpcy5kZWZhdWx0cz17Li4udGhpcy5kZWZhdWx0cywuLi50fSx0aGlzfX1UYT1uZXcgV2Vha1NldCx6aD1mdW5jdGlvbih0LG4pe3JldHVybihyLG8pPT57Y29uc3QgaT17Li4ub30sbD17Li4udGhpcy5kZWZhdWx0cywuLi5pfTt0aGlzLmRlZmF1bHRzLmFzeW5jPT09ITAmJmkuYXN5bmM9PT0hMSYmKGwuc2lsZW50fHxjb25zb2xlLndhcm4oIm1hcmtlZCgpOiBUaGUgYXN5bmMgb3B0aW9uIHdhcyBzZXQgdG8gdHJ1ZSBieSBhbiBleHRlbnNpb24uIFRoZSBhc3luYzogZmFsc2Ugb3B0aW9uIHNlbnQgdG8gcGFyc2Ugd2lsbCBiZSBpZ25vcmVkLiIpLGwuYXN5bmM9ITApO2NvbnN0IHM9WWEodGhpcyxIYyxRdykuY2FsbCh0aGlzLCEhbC5zaWxlbnQsISFsLmFzeW5jKTtpZih0eXBlb2Ygcj4idSJ8fHI9PT1udWxsKXJldHVybiBzKG5ldyBFcnJvcigibWFya2VkKCk6IGlucHV0IHBhcmFtZXRlciBpcyB1bmRlZmluZWQgb3IgbnVsbCIpKTtpZih0eXBlb2YgciE9InN0cmluZyIpcmV0dXJuIHMobmV3IEVycm9yKCJtYXJrZWQoKTogaW5wdXQgcGFyYW1ldGVyIGlzIG9mIHR5cGUgIitPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocikrIiwgc3RyaW5nIGV4cGVjdGVkIikpO2lmKGwuaG9va3MmJihsLmhvb2tzLm9wdGlvbnM9bCksbC5hc3luYylyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGwuaG9va3M/bC5ob29rcy5wcmVwcm9jZXNzKHIpOnIpLnRoZW4oYT0+dChhLGwpKS50aGVuKGE9Pmwud2Fsa1Rva2Vucz9Qcm9taXNlLmFsbCh0aGlzLndhbGtUb2tlbnMoYSxsLndhbGtUb2tlbnMpKS50aGVuKCgpPT5hKTphKS50aGVuKGE9Pm4oYSxsKSkudGhlbihhPT5sLmhvb2tzP2wuaG9va3MucG9zdHByb2Nlc3MoYSk6YSkuY2F0Y2gocyk7dHJ5e2wuaG9va3MmJihyPWwuaG9va3MucHJlcHJvY2VzcyhyKSk7Y29uc3QgYT10KHIsbCk7bC53YWxrVG9rZW5zJiZ0aGlzLndhbGtUb2tlbnMoYSxsLndhbGtUb2tlbnMpO2xldCB1PW4oYSxsKTtyZXR1cm4gbC5ob29rcyYmKHU9bC5ob29rcy5wb3N0cHJvY2Vzcyh1KSksdX1jYXRjaChhKXtyZXR1cm4gcyhhKX19fSxIYz1uZXcgV2Vha1NldCxRdz1mdW5jdGlvbih0LG4pe3JldHVybiByPT57aWYoci5tZXNzYWdlKz1gClBsZWFzZSByZXBvcnQgdGhpcyB0byBodHRwczovL2dpdGh1Yi5jb20vbWFya2VkanMvbWFya2VkLmAsdCl7Y29uc3Qgbz0iPHA+QW4gZXJyb3Igb2NjdXJyZWQ6PC9wPjxwcmU+Iit4bihyLm1lc3NhZ2UrIiIsITApKyI8L3ByZT4iO3JldHVybiBuP1Byb21pc2UucmVzb2x2ZShvKTpvfWlmKG4pcmV0dXJuIFByb21pc2UucmVqZWN0KHIpO3Rocm93IHJ9fTtjb25zdCBnaT1uZXcgU047ZnVuY3Rpb24gTWUoZSx0KXtyZXR1cm4gZ2kucGFyc2UoZSx0KX1NZS5vcHRpb25zPU1lLnNldE9wdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIGdpLnNldE9wdGlvbnMoZSksTWUuZGVmYXVsdHM9Z2kuZGVmYXVsdHMsR3coTWUuZGVmYXVsdHMpLE1lfTtNZS5nZXREZWZhdWx0cz1GZztNZS5kZWZhdWx0cz1iaTtNZS51c2U9ZnVuY3Rpb24oLi4uZSl7cmV0dXJuIGdpLnVzZSguLi5lKSxNZS5kZWZhdWx0cz1naS5kZWZhdWx0cyxHdyhNZS5kZWZhdWx0cyksTWV9O01lLndhbGtUb2tlbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZ2kud2Fsa1Rva2VucyhlLHQpfTtNZS5wYXJzZUlubGluZT1naS5wYXJzZUlubGluZTtNZS5QYXJzZXI9cHI7TWUucGFyc2VyPXByLnBhcnNlO01lLlJlbmRlcmVyPV9jO01lLlRleHRSZW5kZXJlcj1CZztNZS5MZXhlcj1ocjtNZS5sZXhlcj1oci5sZXg7TWUuVG9rZW5pemVyPXdjO01lLkhvb2tzPUlzO01lLnBhcnNlPU1lO01lLm9wdGlvbnM7TWUuc2V0T3B0aW9ucztNZS51c2U7TWUud2Fsa1Rva2VucztNZS5wYXJzZUlubGluZTtwci5wYXJzZTtjb25zdCBFTj1oci5sZXg7ZnVuY3Rpb24gZmEoKXtmYT1mdW5jdGlvbigpe3JldHVybiB0fTt2YXIgZSx0PXt9LG49T2JqZWN0LnByb3RvdHlwZSxyPW4uaGFzT3duUHJvcGVydHksbz1PYmplY3QuZGVmaW5lUHJvcGVydHl8fGZ1bmN0aW9uKEMsJCxFKXtDWyRdPUUudmFsdWV9LGk9dHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIj9TeW1ib2w6e30sbD1pLml0ZXJhdG9yfHwiQEBpdGVyYXRvciIscz1pLmFzeW5jSXRlcmF0b3J8fCJAQGFzeW5jSXRlcmF0b3IiLGE9aS50b1N0cmluZ1RhZ3x8IkBAdG9TdHJpbmdUYWciO2Z1bmN0aW9uIHUoQywkLEUpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoQywkLHt2YWx1ZTpFLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksQ1skXX10cnl7dSh7fSwiIil9Y2F0Y2h7dT1mdW5jdGlvbigkLEUsQSl7cmV0dXJuICRbRV09QX19ZnVuY3Rpb24gYyhDLCQsRSxBKXt2YXIgUj0kJiYkLnByb3RvdHlwZSBpbnN0YW5jZW9mIHY/JDp2LHo9T2JqZWN0LmNyZWF0ZShSLnByb3RvdHlwZSksVj1uZXcgSChBfHxbXSk7cmV0dXJuIG8oeiwiX2ludm9rZSIse3ZhbHVlOk8oQyxFLFYpfSksen1mdW5jdGlvbiBkKEMsJCxFKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOkMuY2FsbCgkLEUpfX1jYXRjaChBKXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzpBfX19dC53cmFwPWM7dmFyIGY9InN1c3BlbmRlZFN0YXJ0IixoPSJzdXNwZW5kZWRZaWVsZCIsbT0iZXhlY3V0aW5nIixnPSJjb21wbGV0ZWQiLFM9e307ZnVuY3Rpb24gdigpe31mdW5jdGlvbiB5KCl7fWZ1bmN0aW9uIHgoKXt9dmFyIHc9e307dSh3LGwsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pO3ZhciBrPU9iamVjdC5nZXRQcm90b3R5cGVPZixiPWsmJmsoayhHKFtdKSkpO2ImJmIhPT1uJiZyLmNhbGwoYixsKSYmKHc9Yik7dmFyIFQ9eC5wcm90b3R5cGU9di5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh3KTtmdW5jdGlvbiBOKEMpe1sibmV4dCIsInRocm93IiwicmV0dXJuIl0uZm9yRWFjaChmdW5jdGlvbigkKXt1KEMsJCxmdW5jdGlvbihFKXtyZXR1cm4gdGhpcy5faW52b2tlKCQsRSl9KX0pfWZ1bmN0aW9uIEQoQywkKXtmdW5jdGlvbiBFKFIseixWLGllKXt2YXIgbmU9ZChDW1JdLEMseik7aWYobmUudHlwZSE9PSJ0aHJvdyIpe3ZhciBDZT1uZS5hcmcsd2U9Q2UudmFsdWU7cmV0dXJuIHdlJiZ0eXBlb2Ygd2U9PSJvYmplY3QiJiZyLmNhbGwod2UsIl9fYXdhaXQiKT8kLnJlc29sdmUod2UuX19hd2FpdCkudGhlbihmdW5jdGlvbihYKXtFKCJuZXh0IixYLFYsaWUpfSxmdW5jdGlvbihYKXtFKCJ0aHJvdyIsWCxWLGllKX0pOiQucmVzb2x2ZSh3ZSkudGhlbihmdW5jdGlvbihYKXtDZS52YWx1ZT1YLFYoQ2UpfSxmdW5jdGlvbihYKXtyZXR1cm4gRSgidGhyb3ciLFgsVixpZSl9KX1pZShuZS5hcmcpfXZhciBBO28odGhpcywiX2ludm9rZSIse3ZhbHVlOmZ1bmN0aW9uKFIseil7ZnVuY3Rpb24gVigpe3JldHVybiBuZXcgJChmdW5jdGlvbihpZSxuZSl7RShSLHosaWUsbmUpfSl9cmV0dXJuIEE9QT9BLnRoZW4oVixWKTpWKCl9fSl9ZnVuY3Rpb24gTyhDLCQsRSl7dmFyIEE9ZjtyZXR1cm4gZnVuY3Rpb24oUix6KXtpZihBPT09bSl0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtpZihBPT09Zyl7aWYoUj09PSJ0aHJvdyIpdGhyb3cgejtyZXR1cm57dmFsdWU6ZSxkb25lOiEwfX1mb3IoRS5tZXRob2Q9UixFLmFyZz16Ozspe3ZhciBWPUUuZGVsZWdhdGU7aWYoVil7dmFyIGllPWooVixFKTtpZihpZSl7aWYoaWU9PT1TKWNvbnRpbnVlO3JldHVybiBpZX19aWYoRS5tZXRob2Q9PT0ibmV4dCIpRS5zZW50PUUuX3NlbnQ9RS5hcmc7ZWxzZSBpZihFLm1ldGhvZD09PSJ0aHJvdyIpe2lmKEE9PT1mKXRocm93IEE9ZyxFLmFyZztFLmRpc3BhdGNoRXhjZXB0aW9uKEUuYXJnKX1lbHNlIEUubWV0aG9kPT09InJldHVybiImJkUuYWJydXB0KCJyZXR1cm4iLEUuYXJnKTtBPW07dmFyIG5lPWQoQywkLEUpO2lmKG5lLnR5cGU9PT0ibm9ybWFsIil7aWYoQT1FLmRvbmU/ZzpoLG5lLmFyZz09PVMpY29udGludWU7cmV0dXJue3ZhbHVlOm5lLmFyZyxkb25lOkUuZG9uZX19bmUudHlwZT09PSJ0aHJvdyImJihBPWcsRS5tZXRob2Q9InRocm93IixFLmFyZz1uZS5hcmcpfX19ZnVuY3Rpb24gaihDLCQpe3ZhciBFPSQubWV0aG9kLEE9Qy5pdGVyYXRvcltFXTtpZihBPT09ZSlyZXR1cm4gJC5kZWxlZ2F0ZT1udWxsLEU9PT0idGhyb3ciJiZDLml0ZXJhdG9yLnJldHVybiYmKCQubWV0aG9kPSJyZXR1cm4iLCQuYXJnPWUsaihDLCQpLCQubWV0aG9kPT09InRocm93Iil8fEUhPT0icmV0dXJuIiYmKCQubWV0aG9kPSJ0aHJvdyIsJC5hcmc9bmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAnIitFKyInIG1ldGhvZCIpKSxTO3ZhciBSPWQoQSxDLml0ZXJhdG9yLCQuYXJnKTtpZihSLnR5cGU9PT0idGhyb3ciKXJldHVybiAkLm1ldGhvZD0idGhyb3ciLCQuYXJnPVIuYXJnLCQuZGVsZWdhdGU9bnVsbCxTO3ZhciB6PVIuYXJnO3JldHVybiB6P3ouZG9uZT8oJFtDLnJlc3VsdE5hbWVdPXoudmFsdWUsJC5uZXh0PUMubmV4dExvYywkLm1ldGhvZCE9PSJyZXR1cm4iJiYoJC5tZXRob2Q9Im5leHQiLCQuYXJnPWUpLCQuZGVsZWdhdGU9bnVsbCxTKTp6OigkLm1ldGhvZD0idGhyb3ciLCQuYXJnPW5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0IiksJC5kZWxlZ2F0ZT1udWxsLFMpfWZ1bmN0aW9uIEIoQyl7dmFyICQ9e3RyeUxvYzpDWzBdfTsxIGluIEMmJigkLmNhdGNoTG9jPUNbMV0pLDIgaW4gQyYmKCQuZmluYWxseUxvYz1DWzJdLCQuYWZ0ZXJMb2M9Q1szXSksdGhpcy50cnlFbnRyaWVzLnB1c2goJCl9ZnVuY3Rpb24gYWUoQyl7dmFyICQ9Qy5jb21wbGV0aW9ufHx7fTskLnR5cGU9Im5vcm1hbCIsZGVsZXRlICQuYXJnLEMuY29tcGxldGlvbj0kfWZ1bmN0aW9uIEgoQyl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOiJyb290In1dLEMuZm9yRWFjaChCLHRoaXMpLHRoaXMucmVzZXQoITApfWZ1bmN0aW9uIEcoQyl7aWYoQ3x8Qz09PSIiKXt2YXIgJD1DW2xdO2lmKCQpcmV0dXJuICQuY2FsbChDKTtpZih0eXBlb2YgQy5uZXh0PT0iZnVuY3Rpb24iKXJldHVybiBDO2lmKCFpc05hTihDLmxlbmd0aCkpe3ZhciBFPS0xLEE9ZnVuY3Rpb24gUigpe2Zvcig7KytFPEMubGVuZ3RoOylpZihyLmNhbGwoQyxFKSlyZXR1cm4gUi52YWx1ZT1DW0VdLFIuZG9uZT0hMSxSO3JldHVybiBSLnZhbHVlPWUsUi5kb25lPSEwLFJ9O3JldHVybiBBLm5leHQ9QX19dGhyb3cgbmV3IFR5cGVFcnJvcih0eXBlb2YgQysiIGlzIG5vdCBpdGVyYWJsZSIpfXJldHVybiB5LnByb3RvdHlwZT14LG8oVCwiY29uc3RydWN0b3IiLHt2YWx1ZTp4LGNvbmZpZ3VyYWJsZTohMH0pLG8oeCwiY29uc3RydWN0b3IiLHt2YWx1ZTp5LGNvbmZpZ3VyYWJsZTohMH0pLHkuZGlzcGxheU5hbWU9dSh4LGEsIkdlbmVyYXRvckZ1bmN0aW9uIiksdC5pc0dlbmVyYXRvckZ1bmN0aW9uPWZ1bmN0aW9uKEMpe3ZhciAkPXR5cGVvZiBDPT0iZnVuY3Rpb24iJiZDLmNvbnN0cnVjdG9yO3JldHVybiEhJCYmKCQ9PT15fHwoJC5kaXNwbGF5TmFtZXx8JC5uYW1lKT09PSJHZW5lcmF0b3JGdW5jdGlvbiIpfSx0Lm1hcms9ZnVuY3Rpb24oQyl7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoQyx4KTooQy5fX3Byb3RvX189eCx1KEMsYSwiR2VuZXJhdG9yRnVuY3Rpb24iKSksQy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShUKSxDfSx0LmF3cmFwPWZ1bmN0aW9uKEMpe3JldHVybntfX2F3YWl0OkN9fSxOKEQucHJvdG90eXBlKSx1KEQucHJvdG90eXBlLHMsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHQuQXN5bmNJdGVyYXRvcj1ELHQuYXN5bmM9ZnVuY3Rpb24oQywkLEUsQSxSKXtSPT09dm9pZCAwJiYoUj1Qcm9taXNlKTt2YXIgej1uZXcgRChjKEMsJCxFLEEpLFIpO3JldHVybiB0LmlzR2VuZXJhdG9yRnVuY3Rpb24oJCk/ejp6Lm5leHQoKS50aGVuKGZ1bmN0aW9uKFYpe3JldHVybiBWLmRvbmU/Vi52YWx1ZTp6Lm5leHQoKX0pfSxOKFQpLHUoVCxhLCJHZW5lcmF0b3IiKSx1KFQsbCxmdW5jdGlvbigpe3JldHVybiB0aGlzfSksdShULCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCBHZW5lcmF0b3JdIn0pLHQua2V5cz1mdW5jdGlvbihDKXt2YXIgJD1PYmplY3QoQyksRT1bXTtmb3IodmFyIEEgaW4gJClFLnB1c2goQSk7cmV0dXJuIEUucmV2ZXJzZSgpLGZ1bmN0aW9uIFIoKXtmb3IoO0UubGVuZ3RoOyl7dmFyIHo9RS5wb3AoKTtpZih6IGluICQpcmV0dXJuIFIudmFsdWU9eixSLmRvbmU9ITEsUn1yZXR1cm4gUi5kb25lPSEwLFJ9fSx0LnZhbHVlcz1HLEgucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpILHJlc2V0OmZ1bmN0aW9uKEMpe2lmKHRoaXMucHJldj0wLHRoaXMubmV4dD0wLHRoaXMuc2VudD10aGlzLl9zZW50PWUsdGhpcy5kb25lPSExLHRoaXMuZGVsZWdhdGU9bnVsbCx0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5hcmc9ZSx0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChhZSksIUMpZm9yKHZhciAkIGluIHRoaXMpJC5jaGFyQXQoMCk9PT0idCImJnIuY2FsbCh0aGlzLCQpJiYhaXNOYU4oKyQuc2xpY2UoMSkpJiYodGhpc1skXT1lKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZG9uZT0hMDt2YXIgQz10aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtpZihDLnR5cGU9PT0idGhyb3ciKXRocm93IEMuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uKEMpe2lmKHRoaXMuZG9uZSl0aHJvdyBDO3ZhciAkPXRoaXM7ZnVuY3Rpb24gRShuZSxDZSl7cmV0dXJuIHoudHlwZT0idGhyb3ciLHouYXJnPUMsJC5uZXh0PW5lLENlJiYoJC5tZXRob2Q9Im5leHQiLCQuYXJnPWUpLCEhQ2V9Zm9yKHZhciBBPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtBPj0wOy0tQSl7dmFyIFI9dGhpcy50cnlFbnRyaWVzW0FdLHo9Ui5jb21wbGV0aW9uO2lmKFIudHJ5TG9jPT09InJvb3QiKXJldHVybiBFKCJlbmQiKTtpZihSLnRyeUxvYzw9dGhpcy5wcmV2KXt2YXIgVj1yLmNhbGwoUiwiY2F0Y2hMb2MiKSxpZT1yLmNhbGwoUiwiZmluYWxseUxvYyIpO2lmKFYmJmllKXtpZih0aGlzLnByZXY8Ui5jYXRjaExvYylyZXR1cm4gRShSLmNhdGNoTG9jLCEwKTtpZih0aGlzLnByZXY8Ui5maW5hbGx5TG9jKXJldHVybiBFKFIuZmluYWxseUxvYyl9ZWxzZSBpZihWKXtpZih0aGlzLnByZXY8Ui5jYXRjaExvYylyZXR1cm4gRShSLmNhdGNoTG9jLCEwKX1lbHNle2lmKCFpZSl0aHJvdyBuZXcgRXJyb3IoInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5Iik7aWYodGhpcy5wcmV2PFIuZmluYWxseUxvYylyZXR1cm4gRShSLmZpbmFsbHlMb2MpfX19fSxhYnJ1cHQ6ZnVuY3Rpb24oQywkKXtmb3IodmFyIEU9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO0U+PTA7LS1FKXt2YXIgQT10aGlzLnRyeUVudHJpZXNbRV07aWYoQS50cnlMb2M8PXRoaXMucHJldiYmci5jYWxsKEEsImZpbmFsbHlMb2MiKSYmdGhpcy5wcmV2PEEuZmluYWxseUxvYyl7dmFyIFI9QTticmVha319UiYmKEM9PT0iYnJlYWsifHxDPT09ImNvbnRpbnVlIikmJlIudHJ5TG9jPD0kJiYkPD1SLmZpbmFsbHlMb2MmJihSPW51bGwpO3ZhciB6PVI/Ui5jb21wbGV0aW9uOnt9O3JldHVybiB6LnR5cGU9Qyx6LmFyZz0kLFI/KHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLm5leHQ9Ui5maW5hbGx5TG9jLFMpOnRoaXMuY29tcGxldGUoeil9LGNvbXBsZXRlOmZ1bmN0aW9uKEMsJCl7aWYoQy50eXBlPT09InRocm93Iil0aHJvdyBDLmFyZztyZXR1cm4gQy50eXBlPT09ImJyZWFrInx8Qy50eXBlPT09ImNvbnRpbnVlIj90aGlzLm5leHQ9Qy5hcmc6Qy50eXBlPT09InJldHVybiI/KHRoaXMucnZhbD10aGlzLmFyZz1DLmFyZyx0aGlzLm1ldGhvZD0icmV0dXJuIix0aGlzLm5leHQ9ImVuZCIpOkMudHlwZT09PSJub3JtYWwiJiYkJiYodGhpcy5uZXh0PSQpLFN9LGZpbmlzaDpmdW5jdGlvbihDKXtmb3IodmFyICQ9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xOyQ+PTA7LS0kKXt2YXIgRT10aGlzLnRyeUVudHJpZXNbJF07aWYoRS5maW5hbGx5TG9jPT09QylyZXR1cm4gdGhpcy5jb21wbGV0ZShFLmNvbXBsZXRpb24sRS5hZnRlckxvYyksYWUoRSksU319LGNhdGNoOmZ1bmN0aW9uKEMpe2Zvcih2YXIgJD10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7JD49MDstLSQpe3ZhciBFPXRoaXMudHJ5RW50cmllc1skXTtpZihFLnRyeUxvYz09PUMpe3ZhciBBPUUuY29tcGxldGlvbjtpZihBLnR5cGU9PT0idGhyb3ciKXt2YXIgUj1BLmFyZzthZShFKX1yZXR1cm4gUn19dGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHQiKX0sZGVsZWdhdGVZaWVsZDpmdW5jdGlvbihDLCQsRSl7cmV0dXJuIHRoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOkcoQykscmVzdWx0TmFtZTokLG5leHRMb2M6RX0sdGhpcy5tZXRob2Q9PT0ibmV4dCImJih0aGlzLmFyZz1lKSxTfX0sdH1mdW5jdGlvbiBGaChlLHQpeyh0PT1udWxsfHx0PmUubGVuZ3RoKSYmKHQ9ZS5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KHQpO248dDtuKyspcltuXT1lW25dO3JldHVybiByfWZ1bmN0aW9uIFdnKGUsdCl7aWYoZSl7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiBGaChlLHQpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtpZihuPT09Ik9iamVjdCImJmUuY29uc3RydWN0b3ImJihuPWUuY29uc3RydWN0b3IubmFtZSksbj09PSJNYXAifHxuPT09IlNldCIpcmV0dXJuIEFycmF5LmZyb20oZSk7aWYobj09PSJBcmd1bWVudHMifHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gRmgoZSx0KX19ZnVuY3Rpb24gQ04oZSx0KXt2YXIgbj10eXBlb2YgU3ltYm9sPCJ1IiYmZVtTeW1ib2wuaXRlcmF0b3JdfHxlWyJAQGl0ZXJhdG9yIl07aWYoIW4pe2lmKEFycmF5LmlzQXJyYXkoZSl8fChuPVdnKGUpKXx8dCYmZSYmdHlwZW9mIGUubGVuZ3RoPT0ibnVtYmVyIil7biYmKGU9bik7dmFyIHI9MCxvPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpvLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49ZS5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOmVbcisrXX19LGU6ZnVuY3Rpb24oYSl7dGhyb3cgYX0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX12YXIgaT0hMCxsPSExLHM7cmV0dXJue3M6ZnVuY3Rpb24oKXtuPW4uY2FsbChlKX0sbjpmdW5jdGlvbigpe3ZhciBhPW4ubmV4dCgpO3JldHVybiBpPWEuZG9uZSxhfSxlOmZ1bmN0aW9uKGEpe2w9ITAscz1hfSxmOmZ1bmN0aW9uKCl7dHJ5eyFpJiZuLnJldHVybiE9bnVsbCYmbi5yZXR1cm4oKX1maW5hbGx5e2lmKGwpdGhyb3cgc319fX1mdW5jdGlvbiAkTihlLHQpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8ZT09PW51bGwpcmV0dXJuIGU7dmFyIG49ZVtTeW1ib2wudG9QcmltaXRpdmVdO2lmKG4hPT12b2lkIDApe3ZhciByPW4uY2FsbChlLHR8fCJkZWZhdWx0Iik7aWYodHlwZW9mIHIhPSJvYmplY3QiKXJldHVybiByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKHQ9PT0ic3RyaW5nIj9TdHJpbmc6TnVtYmVyKShlKX1mdW5jdGlvbiBrTihlKXt2YXIgdD0kTihlLCJzdHJpbmciKTtyZXR1cm4gdHlwZW9mIHQ9PSJzeW1ib2wiP3Q6U3RyaW5nKHQpfWZ1bmN0aW9uIEh0KGUsdCxuKXtyZXR1cm4gdD1rTih0KSx0IGluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09bixlfWZ1bmN0aW9uIFROKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGV9ZnVuY3Rpb24gYk4oZSx0KXt2YXIgbj1lPT1udWxsP251bGw6dHlwZW9mIFN5bWJvbDwidSImJmVbU3ltYm9sLml0ZXJhdG9yXXx8ZVsiQEBpdGVyYXRvciJdO2lmKG4hPW51bGwpe3ZhciByLG8saSxsLHM9W10sYT0hMCx1PSExO3RyeXtpZihpPShuPW4uY2FsbChlKSkubmV4dCx0PT09MCl7aWYoT2JqZWN0KG4pIT09bilyZXR1cm47YT0hMX1lbHNlIGZvcig7IShhPShyPWkuY2FsbChuKSkuZG9uZSkmJihzLnB1c2goci52YWx1ZSkscy5sZW5ndGghPT10KTthPSEwKTt9Y2F0Y2goYyl7dT0hMCxvPWN9ZmluYWxseXt0cnl7aWYoIWEmJm4ucmV0dXJuIT1udWxsJiYobD1uLnJldHVybigpLE9iamVjdChsKSE9PWwpKXJldHVybn1maW5hbGx5e2lmKHUpdGhyb3cgb319cmV0dXJuIHN9fWZ1bmN0aW9uIE5OKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uIFJOKGUsdCl7cmV0dXJuIFROKGUpfHxiTihlLHQpfHxXZyhlLHQpfHxOTigpfWZ1bmN0aW9uIHh5KGUsdCxuLHIsbyxpLGwpe3RyeXt2YXIgcz1lW2ldKGwpLGE9cy52YWx1ZX1jYXRjaCh1KXtuKHUpO3JldHVybn1zLmRvbmU/dChhKTpQcm9taXNlLnJlc29sdmUoYSkudGhlbihyLG8pfWZ1bmN0aW9uIEp3KGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHIsbyl7dmFyIGk9ZS5hcHBseSh0LG4pO2Z1bmN0aW9uIGwoYSl7eHkoaSxyLG8sbCxzLCJuZXh0IixhKX1mdW5jdGlvbiBzKGEpe3h5KGkscixvLGwscywidGhyb3ciLGEpfWwodm9pZCAwKX0pfX1mdW5jdGlvbiBQTihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBGaChlKX1mdW5jdGlvbiBPTihlKXtpZih0eXBlb2YgU3ltYm9sPCJ1IiYmZVtTeW1ib2wuaXRlcmF0b3JdIT1udWxsfHxlWyJAQGl0ZXJhdG9yIl0hPW51bGwpcmV0dXJuIEFycmF5LmZyb20oZSl9ZnVuY3Rpb24gQU4oKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS4KSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLmApfWZ1bmN0aW9uIEJoKGUpe3JldHVybiBQTihlKXx8T04oZSl8fFdnKGUpfHxBTigpfXZhciBNTj0vXmRhdGE6KGltYWdlXC8ocG5nfGpwZWd8anBnfGdpZnx3ZWJwfGJtcHx0aWZmfGljb3xzdmdcK3htbCkpO2Jhc2U2NCwvO2Z1bmN0aW9uIFVnKGUpe3ZhciB0PU1OLmV4ZWMoZSk7aWYodCYmdFsxXSlyZXR1cm4gdFsxXX1mdW5jdGlvbiBWZyhlKXtyZXR1cm4gZT09PSJpbWFnZS9zdmcreG1sIj8ic3ZnIjplPT09ImltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiI/ImljbyI6ZS5zdGFydHNXaXRoKCJpbWFnZS8iKT9lLnNsaWNlKDYpOmV9dmFyIExOPS9eaChbXGQrXSkkLztmdW5jdGlvbiBETihlKXt2YXIgdD1lLmNoaWxkcmVuLm1hcChJTik7cmV0dXJuIGpOKHQpfWZ1bmN0aW9uIElOKGUpe2lmKGUudHlwZT09PSJoZWFkaW5nIil7dmFyIHQsbj0iIixyPU51bWJlcigodD1lLnRhZy5tYXRjaChMTikpPT09bnVsbHx8dD09PXZvaWQgMD92b2lkIDA6dFsxXSk7aWYoTnVtYmVyLmlzTmFOKHIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBoZWFkZXIgZGVwdGgiKTtmb3IodmFyIG89MDtvPE51bWJlcihyKTtvKyspbis9IiMiO3ZhciBpPVsiIi5jb25jYXQobiwiICIpXTtyZXR1cm57dHlwZToiYmxvY2siLGNoaWxkcmVuOmkuY29uY2F0LmFwcGx5KGksQmgoZS5jaGlsZHJlbi5tYXAoVWgpKSl9fWVsc2V7aWYoZS50eXBlPT09InBhcmFncmFwaCIpcmV0dXJuIGUuY2hpbGRyZW4ubGVuZ3RoPT09MD97dHlwZToiYmxvY2siLGNoaWxkcmVuOlsiPGJyIC8+Il19Ont0eXBlOiJibG9jayIsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24ocyl7cmV0dXJuIFVoKHMpfSl9O2lmKGUudHlwZT09PSJsaXN0IilyZXR1cm57dHlwZToiYmxvY2siLGNoaWxkcmVuOmUuY2hpbGRyZW4uZmxhdE1hcChmdW5jdGlvbihzLGEpe3JldHVybiBxdyhlXyhlKSxzLDAsYT09PTApfSl9O3ZhciBsPWU7dGhyb3cgbmV3IEVycm9yKCJVbmhhbmRsZWQgbm9kZSB0eXBlOiAiLmNvbmNhdCgidHlwZSJpbiBsPyJleGhhdXN0aXZlQ2hlY2sudHlwZSI6InVua25vd24iKSl9fWZ1bmN0aW9uIGpOKGUpe3JldHVybiBXaC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gV2goKXtyZXR1cm4gV2g9SncoZmEoKS5tYXJrKGZ1bmN0aW9uIGUodCl7dmFyIG4scixvLGksbCxzLGEsdSxjLGQ7cmV0dXJuIGZhKCkud3JhcChmdW5jdGlvbihoKXtmb3IoOzspc3dpdGNoKGgucHJldj1oLm5leHQpe2Nhc2UgMDpyPVtgCmBdLG89W10saT17fSxsPTA7Y2FzZSA0OmlmKCEobDx0Lmxlbmd0aCkpe2gubmV4dD00NDticmVha31zPXRbbF0sYT1DTihzLmNoaWxkcmVuKSxoLnByZXY9NyxhLnMoKTtjYXNlIDk6aWYoKHU9YS5uKCkpLmRvbmUpe2gubmV4dD0zMjticmVha31pZihjPXUudmFsdWUsdHlwZW9mIGMhPSJzdHJpbmciKXtoLm5leHQ9MTU7YnJlYWt9cltyLmxlbmd0aC0xXSs9YyxoLm5leHQ9MzA7YnJlYWs7Y2FzZSAxNTppZihjLnR5cGUhPT0iaW1hZ2UiKXtoLm5leHQ9MjM7YnJlYWt9cmV0dXJuIGgudDA9byxoLm5leHQ9MTksV04oYyxpKTtjYXNlIDE5OmgudDE9aC5zZW50LGgudDAucHVzaC5jYWxsKGgudDAsaC50MSksaC5uZXh0PTI5O2JyZWFrO2Nhc2UgMjM6aWYoYy50eXBlIT09ImxpbmsiKXtoLm5leHQ9Mjc7YnJlYWt9by5wdXNoKFZOKGMpKSxoLm5leHQ9Mjk7YnJlYWs7Y2FzZSAyNzp0aHJvdyBkPWMsbmV3IEVycm9yKCJVbmV4cGVjdGVkIG5vZGUgdHlwZTogIi5jb25jYXQoSlNPTi5zdHJpbmdpZnkoZCxudWxsLDIpKSk7Y2FzZSAyOTpyLnB1c2goIiIpO2Nhc2UgMzA6aC5uZXh0PTk7YnJlYWs7Y2FzZSAzMjpoLm5leHQ9Mzc7YnJlYWs7Y2FzZSAzNDpoLnByZXY9MzQsaC50Mj1oLmNhdGNoKDcpLGEuZShoLnQyKTtjYXNlIDM3OnJldHVybiBoLnByZXY9MzcsYS5mKCksaC5maW5pc2goMzcpO2Nhc2UgNDA6bD09PXQubGVuZ3RoLTE/cltyLmxlbmd0aC0xXSs9YApgOnJbci5sZW5ndGgtMV0rPWAKCmA7Y2FzZSA0MTpsKyssaC5uZXh0PTQ7YnJlYWs7Y2FzZSA0NDpyZXR1cm4gaC5hYnJ1cHQoInJldHVybiIsKG49e30sSHQobixZdCwicmljaHRleHQiKSxIdChuLCJ0ZW1wbGF0ZVN0cmluZ3MiLHIpLEh0KG4sImV4cHJzIixvKSxIdChuLCJmaWxlcyIsaSksbikpO2Nhc2UgNDU6Y2FzZSJlbmQiOnJldHVybiBoLnN0b3AoKX19LGUsbnVsbCxbWzcsMzQsMzcsNDBdXSl9KSksV2guYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIFp3KGUpe3ZhciB0PXR5cGVvZiBlLmZvcm1hdD09Im51bWJlciI/Rk4oZS5mb3JtYXQpOltdLG49ZS50ZXh0LnRyaW1TdGFydCgpLHI9ZS50ZXh0Lmxlbmd0aC1uLmxlbmd0aDtuPW4udHJpbUVuZCgpO3ZhciBvPWUudGV4dC5sZW5ndGgtbi5sZW5ndGgtcjtyZXR1cm4gdC5pbmNsdWRlcygiYm9sZCIpJiZ0LmluY2x1ZGVzKCJpdGFsaWMiKT9uPSIqKioiLmNvbmNhdChuLCIqKioiKTp0LmluY2x1ZGVzKCJib2xkIik/bj0iKioiLmNvbmNhdChuLCIqKiIpOnQuaW5jbHVkZXMoIml0YWxpYyIpJiYobj0iXyIuY29uY2F0KG4sIl8iKSksdC5pbmNsdWRlcygibGluZS10aHJvdWdoIikmJihuPSJ+fiIuY29uY2F0KG4sIn5+IikpLCIiLmNvbmNhdCgiICIucmVwZWF0KHIpKS5jb25jYXQobikuY29uY2F0KCIgIi5yZXBlYXQobykpfWZ1bmN0aW9uIFVoKGUpe3JldHVybiBlLnR5cGU9PT0idGV4dCI/WncoZSk6ZS50eXBlPT09ImxpbmVicmVhayI/YApgOmV9ZnVuY3Rpb24gcXcoZSx0LG4pe3ZhciByLG8saT1hcmd1bWVudHMubGVuZ3RoPjMmJmFyZ3VtZW50c1szXSE9PXZvaWQgMD9hcmd1bWVudHNbM106ITEsbD1pPyIiOmAKYCxzPVsiIi5jb25jYXQobCkuY29uY2F0KCIgIi5yZXBlYXQobikpLmNvbmNhdChlKV07cmV0dXJuKChyPXQuY2hpbGRyZW4pPT09bnVsbHx8cj09PXZvaWQgMHx8KG89clswXSk9PT1udWxsfHxvPT09dm9pZCAwP3ZvaWQgMDpvLnR5cGUpIT09Imxpc3QiJiZzLnB1c2goIiAiKSxzLmNvbmNhdCh0LmNoaWxkcmVuLmZsYXRNYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09PSJsaXN0Ij9hLmNoaWxkcmVuLmZsYXRNYXAoZnVuY3Rpb24odSl7cmV0dXJuIHF3KGVfKGEpLHUsbis0KX0pOltVaChhKV19KSl9ZnVuY3Rpb24gZV8oZSl7aWYoZS5saXN0VHlwZT09PSJidWxsZXQiKXJldHVybiItIjtpZihlLmxpc3RUeXBlPT09Im51bWJlciIpcmV0dXJuIjEuIjt0aHJvdyBuZXcgRXJyb3IoIlVuaGFuZGxlZCBsaXN0IHR5cGU6ICIuY29uY2F0KGUubGlzdFR5cGUpKX12YXIgek49e2JvbGQ6MSxpdGFsaWM6MiwibGluZS10aHJvdWdoIjo0fTtmdW5jdGlvbiBGTihlKXtyZXR1cm4gT2JqZWN0LmVudHJpZXMoek4pLmZsYXRNYXAoZnVuY3Rpb24odCl7dmFyIG49Uk4odCwyKSxyPW5bMF0sbz1uWzFdO3JldHVybihvJmUpPT09bz9bcl06W119KX12YXIgQk49bmV3IFRleHRFbmNvZGVyO2Z1bmN0aW9uIFdOKGUsdCl7cmV0dXJuIFZoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBWaCgpe3JldHVybiBWaD1KdyhmYSgpLm1hcmsoZnVuY3Rpb24gZSh0LG4pe3ZhciByLG8saSxsLHMsYSx1O3JldHVybiBmYSgpLndyYXAoZnVuY3Rpb24oZCl7Zm9yKDs7KXN3aXRjaChkLnByZXY9ZC5uZXh0KXtjYXNlIDA6aWYoIXQuc3JjLnN0YXJ0c1dpdGgoImRhdGE6Iikpe2QubmV4dD0xMzticmVha31yZXR1cm4gZC5uZXh0PTMsRW4uZ2V0U0hBMjU2SGFzaChCTi5lbmNvZGUodC5zcmMpKTtjYXNlIDM6aWYobz1kLnNlbnQsaT1VZyh0LnNyYyksaSE9PXZvaWQgMCl7ZC5uZXh0PTc7YnJlYWt9dGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgZGV0ZWN0IE1pbWUgVHlwZSBmb3IgaW1hZ2U6ICIuY29uY2F0KHQuc3JjKSk7Y2FzZSA3OnJldHVybiBsPVZnKGkpLHM9Ii9wdWJsaWMvIi5jb25jYXQobywiLiIpLmNvbmNhdChsKSxuW3NdPXQuc3JjLGQuYWJydXB0KCJyZXR1cm4iLChyPXt9LEh0KHIsWXQsImZpbGUiKSxIdChyLGduLHMpLEh0KHIsIm1ldGFkYXRhIix7d2lkdGg6dC53aWR0aHx8MCxoZWlnaHQ6dC5oZWlnaHR8fDAsc2hhMjU2Om98fCIifSkscikpO2Nhc2UgMTM6cmV0dXJuIHU9VU4oInNoYTI1NiIsdC5zcmMpLGQuYWJydXB0KCJyZXR1cm4iLChhPXt9LEh0KGEsWXQsImZpbGUiKSxIdChhLGduLCIvcHVibGljIi5jb25jYXQodC5zcmMuc3BsaXQoIj8iKVswXSkpLEh0KGEsIm1ldGFkYXRhIix7d2lkdGg6dC53aWR0aHx8MCxoZWlnaHQ6dC5oZWlnaHR8fDAsc2hhMjU2OnV8fCIifSksYSkpO2Nhc2UgMTU6Y2FzZSJlbmQiOnJldHVybiBkLnN0b3AoKX19LGUpfSkpLFZoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBVTihlLHQpe3ZhciBuPXQuc3BsaXQoIj8iKTtpZighKG4ubGVuZ3RoPDIpKXt2YXIgcj1uWzFdLG89bmV3IFVSTFNlYXJjaFBhcmFtcyhyKTtpZihvLmhhcyhlKSlyZXR1cm4gby5nZXQoZSl9fWZ1bmN0aW9uIFZOKGUpe3ZhciB0O3JldHVybiB0PXt9LEh0KHQsWXQsImxpbmsiKSxIdCh0LCJocmVmIixlLnVybCksSHQodCwiY2hpbGRyZW4iLGUuY2hpbGRyZW4ubWFwKFp3KSksdH1mdW5jdGlvbiB3eShlLHQpe3ZhciBuPU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24obyl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxvKS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIFhlKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP3d5KE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXtIdChlLHIsbltyXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTp3eShPYmplY3QobikpLmZvckVhY2goZnVuY3Rpb24ocil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4scikpfSl9cmV0dXJuIGV9dmFyIG9yPXt2ZXJzaW9uOjEsZm9ybWF0OiIiLGluZGVudDowLGRpcmVjdGlvbjpudWxsfTtmdW5jdGlvbiBCbChlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiBYZShYZSh7fSxvcikse30se3R5cGU6InRleHQiLGZvcm1hdDoiIix0ZXh0OmV9KTtpZigidGFnImluIGUpc3dpdGNoKGUudGFnKXtjYXNlImgxIjpyZXR1cm4gTGkoZSk7Y2FzZSJoMiI6cmV0dXJuIExpKGUpO2Nhc2UiaDMiOnJldHVybiBMaShlKTtjYXNlImg0IjpyZXR1cm4gTGkoZSk7Y2FzZSJoNSI6cmV0dXJuIExpKGUpO2Nhc2UiaDYiOnJldHVybiBMaShlKTtjYXNlImxpIjpyZXR1cm4gUU4oZSk7Y2FzZSJwIjpyZXR1cm4gWU4oZSk7Y2FzZSJ1bCI6cmV0dXJuIF95KGUpO2Nhc2Uib2wiOnJldHVybiBfeShlKTtjYXNlInNwYW4iOnJldHVybiB0XyhlKTtjYXNlImEiOnJldHVybiBLTihlKTtjYXNlImltZyI6cmV0dXJuIEhOKGUpO2Nhc2UiYnIiOnJldHVybiB0P1hlKFhlKHt9LG9yKSx7fSx7dHlwZToibGluZWJyZWFrIn0pOlhOKCk7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBub2RlIHRhZzogIitKU09OLnN0cmluZ2lmeShlLG51bGwsMikpfWVsc2UgdGhyb3cgRXJyb3IoIlVuZXhwZWN0ZWQgbm9kZTogIitKU09OLnN0cmluZ2lmeShlLG51bGwsMikpfWZ1bmN0aW9uIEhOKGUpe3ZhciB0PWUuc3JjO3JldHVybiBYZShYZSh7fSxvcikse30se3R5cGU6ImltYWdlIixzcmM6dCx3aWR0aDplLndpZHRoLGhlaWdodDplLmhlaWdodH0pfWZ1bmN0aW9uIEtOKGUpe3JldHVybiBYZShYZSh7fSxvcikse30se3R5cGU6ImxpbmsiLHVybDplLmhyZWYsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIEJsKHQpfSl9KX1mdW5jdGlvbiBHTihlKXtyZXR1cm4gWGUoWGUoe30sb3IpLHt9LHtmb3JtYXQ6IiIsdHlwZToicm9vdCIsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIEJsKHQpfSl9KX1mdW5jdGlvbiBMaShlKXtyZXR1cm4gWGUoWGUoe30sb3IpLHt9LHt0eXBlOiJoZWFkaW5nIix0YWc6ZS50YWcsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIEJsKHQpfSl9KX1mdW5jdGlvbiBZTihlKXtyZXR1cm4gWGUoWGUoe30sb3IpLHt9LHt0eXBlOiJwYXJhZ3JhcGgiLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBCbCh0LCEwKX0pfSl9ZnVuY3Rpb24gWE4oKXtyZXR1cm4gWGUoWGUoe30sb3IpLHt9LHt0eXBlOiJwYXJhZ3JhcGgiLGNoaWxkcmVuOltdfSl9ZnVuY3Rpb24gUU4oZSl7cmV0dXJuIFhlKFhlKHt9LG9yKSx7fSx7dHlwZToibGlzdGl0ZW0iLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBCbCh0LCEwKX0pfSl9ZnVuY3Rpb24gX3koZSl7cmV0dXJuIFhlKFhlKHt9LG9yKSx7fSx7dHlwZToibGlzdCIsbGlzdFR5cGU6ZS50YWc9PT0ib2wiPyJudW1iZXIiOiJidWxsZXQiLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBCbCh0KX0pfSxlLmRpcj97ZGlyZWN0aW9uOmUuZGlyfTp7ZGlyZWN0aW9uOm51bGx9KX12YXIgSk49e2JvbGQ6MSxpdGFsaWM6MiwibGluZS10aHJvdWdoIjo0fTtmdW5jdGlvbiBaTihlKXtyZXR1cm4gZS5yZWR1Y2UoZnVuY3Rpb24odCxuKXtyZXR1cm4gdHxKTltuXX0sMCl9ZnVuY3Rpb24gdF8oZSl7dmFyIHQ9ZS5jaGlsZHJlblswXTtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmciP1hlKFhlKHt9LG9yKSx7fSx7dHlwZToidGV4dCIsdGV4dDp0LGZvcm1hdDpaTihlLmNsYXNzZXMpfSk6dF8oWGUoWGUoe30sdCkse30se2NsYXNzZXM6ZS5jbGFzc2VzLmNvbmNhdCh0LmNsYXNzZXMpfSkpfWZ1bmN0aW9uIEhoKGUpeyJAYmFiZWwvaGVscGVycyAtIHR5cGVvZiI7cmV0dXJuIEhoPXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PSJzeW1ib2wiP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiImJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxIaChlKX12YXIgU2M9Jzx2YWwgdmFsdWU9IicsS2g9JyI+JyxHaD0iPC92YWw+IjtmdW5jdGlvbiBZbihlLHQsbil7Zm9yKHZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmYXJndW1lbnRzWzNdIT09dm9pZCAwP2FyZ3VtZW50c1szXTohMSxvPVtdLGk9ZnVuY3Rpb24oKXt2YXIgYT1lW25dO2lmKGEudHlwZT09PSJoZWFkaW5nIilvLnB1c2goe3RhZzoiaCIuY29uY2F0KGEuZGVwdGgpLGNoaWxkcmVuOlluKGEudG9rZW5zP2EudG9rZW5zOltdLHQsMCkuY2hpbGRyZW59KTtlbHNlIGlmKGEudHlwZT09PSJwYXJhZ3JhcGgiKW8ucHVzaCh7dGFnOiJwIixjaGlsZHJlbjpZbihhLnRva2Vucz9hLnRva2VuczpbXSx0LDApLmNoaWxkcmVufSk7ZWxzZSBpZihhLnR5cGU9PT0ic3Ryb25nIilvLnB1c2goe3RhZzoic3BhbiIsY2xhc3NlczpbImJvbGQiXSxjaGlsZHJlbjpZbihhLnRva2Vucz9hLnRva2VuczpbXSx0LDApLmNoaWxkcmVufSk7ZWxzZSBpZihhLnR5cGU9PT0iZW0iKW8ucHVzaCh7dGFnOiJzcGFuIixjbGFzc2VzOlsiaXRhbGljIl0sY2hpbGRyZW46WW4oYS50b2tlbnM/YS50b2tlbnM6W10sdCwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYoYS50eXBlPT09ImRlbCIpby5wdXNoKHt0YWc6InNwYW4iLGNsYXNzZXM6WyJsaW5lLXRocm91Z2giXSxjaGlsZHJlbjpZbihhLnRva2Vucz9hLnRva2VuczpbXSx0LDApLmNoaWxkcmVufSk7ZWxzZSBpZihhLnR5cGU9PT0idGV4dCIpaWYoInRva2VucyJpbiBhJiZBcnJheS5pc0FycmF5KGEudG9rZW5zKSlvLnB1c2guYXBwbHkobyxCaChZbihhLnRva2Vucyx0LG4scikuY2hpbGRyZW4pKTtlbHNlIGlmKHImJnR5cGVvZiBhLnJhdz09InN0cmluZyIpe3ZhciB1PWEucmF3LnNwbGl0KGAKYCksYz11LmZsYXRNYXAoZnVuY3Rpb24odyxrKXtyZXR1cm4gaz09PXUubGVuZ3RoLTE/W3ddOlt3LHt0YWc6ImJyIixjaGlsZHJlbjpbXX1dfSk7by5wdXNoLmFwcGx5KG8sQmgoYykpfWVsc2Ugby5wdXNoKGEucmF3KTtlbHNlIGlmKGEudHlwZT09PSJsaXN0IilvLnB1c2goe3RhZzphLm9yZGVyZWQ/Im9sIjoidWwiLGNoaWxkcmVuOlluKGEuaXRlbXMsdCwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYoYS50eXBlPT09Imxpc3RfaXRlbSIpby5wdXNoKHt0YWc6ImxpIixjaGlsZHJlbjpZbihhLnRva2Vucz9hLnRva2VuczpbXSx0LDAsITApLmNoaWxkcmVufSk7ZWxzZSBpZihhLnR5cGUhPT0ic3BhY2UiKWlmKGEudHlwZT09PSJodG1sIil7aWYoYS50ZXh0PT09R2gpcmV0dXJue3Y6e2NoaWxkcmVuOm8sY3Vyc29yOm59fTt2YXIgZD1hLnRleHQuaW5kZXhPZihLaCk7aWYoYS50ZXh0LnN0YXJ0c1dpdGgoU2MpJiZkPi0xKXt2YXIgZj1OdW1iZXIoYS50ZXh0LnNsaWNlKFNjLmxlbmd0aCxkKSk7aWYoTnVtYmVyLmlzTmFOKGYpKXRocm93IEVycm9yKCJJbGxlZ2FsIHZhbCBpbnRlcm1lZGlhdGUgbm9kZTogIi5jb25jYXQoSlNPTi5zdHJpbmdpZnkoYSkpKTt2YXIgaD1ZbihlLm1hcChmdW5jdGlvbih3KXtyZXR1cm4gdy50eXBlPT09ImxpbmsifHx3LnR5cGU9PT0ibGlzdCI/e3R5cGU6InRleHQiLHJhdzp3LnJhdyx0ZXh0OncucmF3fTp3fSksdCxuKzEpLG09aC5jaGlsZHJlbixnPWguY3Vyc29yLFM9dFtmXTtpZihTLl90eXBlPT09ImxpbmsiKW8ucHVzaCh7dGFnOiJhIixocmVmOlMuaHJlZixjaGlsZHJlbjptfSk7ZWxzZSBpZihTLl90eXBlPT09ImZpbGUiKXt2YXIgdix5O28ucHVzaCh7dGFnOiJpbWciLHNyYzpFbi5jb252ZXJ0RmlsZVNvdXJjZShTKS51cmwsd2lkdGg6KHY9Uy5tZXRhZGF0YSk9PT1udWxsfHx2PT09dm9pZCAwP3ZvaWQgMDp2LndpZHRoLGhlaWdodDooeT1TLm1ldGFkYXRhKT09PW51bGx8fHk9PT12b2lkIDA/dm9pZCAwOnkuaGVpZ2h0LGNoaWxkcmVuOltdfSl9bj1nfXZhciB4PS88YnJccypcLz8+L2dpO2EudGV4dC50cmltKCkubWF0Y2goeCkmJm8ucHVzaCh7dGFnOiJiciIsY2hpbGRyZW46W119KX1lbHNlIGEudHlwZT09PSJsaW5rIj9hLnJhdz09PWEuaHJlZj9vLnB1c2goYS5yYXcpOm8ucHVzaCh7dGFnOiJhIixocmVmOmEuaHJlZixjaGlsZHJlbjpZbihhLnRva2Vucz9hLnRva2VuczpbXSx0LDApLmNoaWxkcmVufSk6YS50eXBlPT09ImJyIj9vLnB1c2goe3RhZzoiYnIiLGNoaWxkcmVuOltdfSk6Y29uc29sZS5lcnJvcigiQ291bGQgbm90IHBhcnNlIG1hcmtkb3duOiB1bnN1cHBvcnRlZCB0b2tlbiB0eXBlOiAiLmNvbmNhdChhLnR5cGUsIi4gRm91bmQ6ICIpLmNvbmNhdChhLnJhdykpO24rK307bjxlLmxlbmd0aDspe3ZhciBsPWkoKTtpZihIaChsKT09PSJvYmplY3QiKXJldHVybiBsLnZ9cmV0dXJue2NoaWxkcmVuOm8sY3Vyc29yOm59fWZ1bmN0aW9uIG5fKGUpe3ZhciB0LG49ZS50ZW1wbGF0ZVN0cmluZ3Mscj1lLmV4cHJzLG89bi5mbGF0TWFwKGZ1bmN0aW9uKHUsYyl7dmFyIGQ9cltjXTtyZXR1cm4gZD9kW1l0XT09PSJsaW5rIj91LmNvbmNhdCgiIi5jb25jYXQoU2MpLmNvbmNhdChjKS5jb25jYXQoS2gpLmNvbmNhdChkLmNoaWxkcmVuWzBdKS5jb25jYXQoR2gpKTp1LmNvbmNhdCgiIi5jb25jYXQoU2MpLmNvbmNhdChjKS5jb25jYXQoS2gpLmNvbmNhdChHaCkpOnV9KS5qb2luKCIiKSxpPUVOKG8se2dmbTohMH0pLGw9WW4oaSxyLDApLHM9bC5jaGlsZHJlbixhPWwuY3Vyc29yO2lmKGEhPT1pLmxlbmd0aCl0aHJvdyBFcnJvcigiVW5leHBlY3RlZGx5IHRlcm1pbmF0ZWQgbWFya2Rvd24gcGFyc2luZy4gUG9zc2libGUgcmVhc29uOiB1bmNsb3NlZCBodG1sIHRhZz8iKTtyZXR1cm4gdD17fSxIdCh0LFl0LCJyaWNodGV4dCIpLEh0KHQsImNoaWxkcmVuIixzKSx0fXZhciBhbj17fSxJPXt9O2xldCBkZD17fSxyXz17fSxoYT17fSxqcz17fSxZaD17fSxwbD17fSxIZz17fSxYaD17fSxwYT17fSxnYT17fSx2bz17fSxLZz17fSxHZz17fSxvXz17fSxpXz17fSxsXz17fSxzXz17fSxhXz17fSx1Xz17fSxjXz17fSxFYz17fSxkXz17fSxmXz17fSxoXz17fSxwXz17fSxnXz17fSxtXz17fSx2Xz17fSx5Xz17fSx4Xz17fSxZZz17fSxYZz17fSxRaD17fSx3Xz17fSxfXz17fSxTXz17fTtmdW5jdGlvbiBLKGUpe2xldCB0PW5ldyBVUkxTZWFyY2hQYXJhbXM7dC5hcHBlbmQoImNvZGUiLGUpO2ZvcihsZXQgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdC5hcHBlbmQoInYiLGFyZ3VtZW50c1tuXSk7dGhyb3cgRXJyb3IoYE1pbmlmaWVkIExleGljYWwgZXJyb3IgIyR7ZX07IHZpc2l0IGh0dHBzOi8vbGV4aWNhbC5kZXYvZG9jcy9lcnJvcj8ke3R9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5gKX1sZXQgWHI9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiLHFOPVhyJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50P2RvY3VtZW50LmRvY3VtZW50TW9kZTpudWxsLFV0PVhyJiYvTWFjfGlQb2R8aVBob25lfGlQYWQvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKSxQbz1YciYmL14oPyEuKlNlYW1vbmtleSkoPz0uKkZpcmVmb3gpLiovaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLENjPVhyJiYiSW5wdXRFdmVudCJpbiB3aW5kb3cmJiFxTj8iZ2V0VGFyZ2V0UmFuZ2VzImluIG5ldyB3aW5kb3cuSW5wdXRFdmVudCgiaW5wdXQiKTohMSxRZz1YciYmL1ZlcnNpb25cL1tcZC5dKy4qU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGZkPVhyJiYvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIXdpbmRvdy5NU1N0cmVhbSxlMj1YciYmL14oPz0uKkNocm9tZSkuKi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksSmc9WHImJi9BcHBsZVdlYktpdFwvW1xkLl0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhZTIsaGQ9UWd8fGZkfHxKZz8iwqAiOiLigIsiLHQyPVBvPyLCoCI6aGQsbjI9L15bXkEtWmEtelx1MDBjMC1cdTAwZDZcdTAwZDgtXHUwMGY2XHUwMGY4LVx1MDJiOFx1MDMwMC1cdTA1OTBcdTA4MDAtXHUxZmZmXHUyMDBlXHUyYzAwLVx1ZmIxY1x1ZmUwMC1cdWZlNmZcdWZlZmQtXHVmZmZmXSpbXHUwNTkxLVx1MDdmZlx1ZmIxZC1cdWZkZmRcdWZlNzAtXHVmZWZjXS8scjI9L15bXlx1MDU5MS1cdTA3ZmZcdWZiMWQtXHVmZGZkXHVmZTcwLVx1ZmVmY10qW0EtWmEtelx1MDBjMC1cdTAwZDZcdTAwZDgtXHUwMGY2XHUwMGY4LVx1MDJiOFx1MDMwMC1cdTA1OTBcdTA4MDAtXHUxZmZmXHUyMDBlXHUyYzAwLVx1ZmIxY1x1ZmUwMC1cdWZlNmZcdWZlZmQtXHVmZmZmXS8sbGk9e2JvbGQ6MSxjb2RlOjE2LGhpZ2hsaWdodDoxMjgsaXRhbGljOjIsc3RyaWtldGhyb3VnaDo0LHN1YnNjcmlwdDozMixzdXBlcnNjcmlwdDo2NCx1bmRlcmxpbmU6OH0sbzI9e2RpcmVjdGlvbmxlc3M6MSx1bm1lcmdlYWJsZToyfSxTeT17Y2VudGVyOjIsZW5kOjYsanVzdGlmeTo0LGxlZnQ6MSxyaWdodDozLHN0YXJ0OjV9LGkyPXsyOiJjZW50ZXIiLDY6ImVuZCIsNDoianVzdGlmeSIsMToibGVmdCIsMzoicmlnaHQiLDU6InN0YXJ0In0sbDI9e25vcm1hbDowLHNlZ21lbnRlZDoyLHRva2VuOjF9LHMyPXswOiJub3JtYWwiLDI6InNlZ21lbnRlZCIsMToidG9rZW4ifSxKaD0hMSxaZz0wO2Z1bmN0aW9uIGEyKGUpe1pnPWUudGltZVN0YW1wfWZ1bmN0aW9uIHZmKGUsdCxuKXtyZXR1cm4gdC5fX2xleGljYWxMaW5lQnJlYWs9PT1lfHxlW2BfX2xleGljYWxLZXlfJHtuLl9rZXl9YF0hPT12b2lkIDB9ZnVuY3Rpb24gdTIoZSl7cmV0dXJuIGUuZ2V0RWRpdG9yU3RhdGUoKS5yZWFkKCgpPT57bGV0IHQ9S2UoKTtyZXR1cm4gdCE9PW51bGw/dC5jbG9uZSgpOm51bGx9KX1mdW5jdGlvbiBFXyhlLHQsbil7Smg9ITA7bGV0IHI9MTAwPHBlcmZvcm1hbmNlLm5vdygpLVpnO3RyeXtibihlLCgpPT57bGV0IG89S2UoKXx8dTIoZSk7dmFyIGk9bmV3IE1hcCxsPWUuZ2V0Um9vdEVsZW1lbnQoKSxzPWUuX2VkaXRvclN0YXRlLGE9ZS5fYmxvY2tDdXJzb3JFbGVtZW50O2xldCB1PSExLGM9IiI7Zm9yKHZhciBkPTA7ZDx0Lmxlbmd0aDtkKyspe3ZhciBmPXRbZF0saD1mLnR5cGUsbT1mLnRhcmdldCxnPUlhKG0scyk7aWYoIShnPT09bnVsbCYmbSE9PWx8fFZlKGcpKSl7aWYoaD09PSJjaGFyYWN0ZXJEYXRhIil7aWYoZj1yJiZaKGcpKWU6e2Y9byxoPW07dmFyIFM9ZztpZihoZShmKSl7dmFyIHY9Zi5hbmNob3IuZ2V0Tm9kZSgpO2lmKHYuaXMoUykmJmYuZm9ybWF0IT09di5nZXRGb3JtYXQoKSl7Zj0hMTticmVhayBlfX1mPWgubm9kZVR5cGU9PT0zJiZTLmlzQXR0YWNoZWQoKX1mJiYoUz0kcihlLl93aW5kb3cpLGg9Zj1udWxsLFMhPT1udWxsJiZTLmFuY2hvck5vZGU9PT1tJiYoZj1TLmFuY2hvck9mZnNldCxoPVMuZm9jdXNPZmZzZXQpLG09bS5ub2RlVmFsdWUsbSE9PW51bGwmJm9tKGcsbSxmLGgsITEpKX1lbHNlIGlmKGg9PT0iY2hpbGRMaXN0Iil7Zm9yKHU9ITAsaD1mLmFkZGVkTm9kZXMsUz0wO1M8aC5sZW5ndGg7UysrKXt2PWhbU107dmFyIHk9Ul8odikseD12LnBhcmVudE5vZGU7eD09bnVsbHx8dj09PWF8fHkhPT1udWxsfHx2Lm5vZGVOYW1lPT09IkJSIiYmdmYodix4LGUpfHwoUG8mJih5PXYuaW5uZXJUZXh0fHx2Lm5vZGVWYWx1ZSkmJihjKz15KSx4LnJlbW92ZUNoaWxkKHYpKX1pZihmPWYucmVtb3ZlZE5vZGVzLGg9Zi5sZW5ndGgsMDxoKXtmb3IoUz0wLHY9MDt2PGg7disrKXg9Zlt2XSwoeC5ub2RlTmFtZT09PSJCUiImJnZmKHgsbSxlKXx8YT09PXgpJiYobS5hcHBlbmRDaGlsZCh4KSxTKyspO2ghPT1TJiYobT09PWwmJihnPXMuX25vZGVNYXAuZ2V0KCJyb290IikpLGkuc2V0KG0sZykpfX19fWlmKDA8aS5zaXplKWZvcihsZXRbdyxrXW9mIGkpaWYoVyhrKSlmb3IoaT1rLmdldENoaWxkcmVuS2V5cygpLGw9dy5maXJzdENoaWxkLHM9MDtzPGkubGVuZ3RoO3MrKylhPWUuZ2V0RWxlbWVudEJ5S2V5KGlbc10pLGEhPT1udWxsJiYobD09bnVsbD8ody5hcHBlbmRDaGlsZChhKSxsPWEpOmwhPT1hJiZ3LnJlcGxhY2VDaGlsZChhLGwpLGw9bC5uZXh0U2libGluZyk7ZWxzZSBaKGspJiZrLm1hcmtEaXJ0eSgpO2lmKGk9bi50YWtlUmVjb3JkcygpLDA8aS5sZW5ndGgpe2ZvcihsPTA7bDxpLmxlbmd0aDtsKyspZm9yKGE9aVtsXSxzPWEuYWRkZWROb2RlcyxhPWEudGFyZ2V0LGQ9MDtkPHMubGVuZ3RoO2QrKylnPXNbZF0sbT1nLnBhcmVudE5vZGUsbT09bnVsbHx8Zy5ub2RlTmFtZSE9PSJCUiJ8fHZmKGcsYSxlKXx8bS5yZW1vdmVDaGlsZChnKTtuLnRha2VSZWNvcmRzKCl9byE9PW51bGwmJih1JiYoby5kaXJ0eT0hMCx4cihvKSksUG8mJk1fKGUpJiZvLmluc2VydFJhd1RleHQoYykpfSl9ZmluYWxseXtKaD0hMX19ZnVuY3Rpb24gQ18oZSl7bGV0IHQ9ZS5fb2JzZXJ2ZXI7aWYodCE9PW51bGwpe2xldCBuPXQudGFrZVJlY29yZHMoKTtFXyhlLG4sdCl9fWZ1bmN0aW9uICRfKGUpe1pnPT09MCYmZ2QoZSkuYWRkRXZlbnRMaXN0ZW5lcigidGV4dElucHV0IixhMiwhMCksZS5fb2JzZXJ2ZXI9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKHQsbik9PntFXyhlLHQsbil9KX1mdW5jdGlvbiBFeShlLHQpe2xldCBuPWUuX19tb2RlLHI9ZS5fX2Zvcm1hdDtlPWUuX19zdHlsZTtsZXQgbz10Ll9fbW9kZSxpPXQuX19mb3JtYXQ7cmV0dXJuIHQ9dC5fX3N0eWxlLChuPT09bnVsbHx8bj09PW8pJiYocj09PW51bGx8fHI9PT1pKSYmKGU9PT1udWxsfHxlPT09dCl9ZnVuY3Rpb24gQ3koZSx0KXtsZXQgbj1lLm1lcmdlV2l0aFNpYmxpbmcodCkscj10dCgpLl9ub3JtYWxpemVkTm9kZXM7cmV0dXJuIHIuYWRkKGUuX19rZXkpLHIuYWRkKHQuX19rZXkpLG59ZnVuY3Rpb24ga18oZSl7aWYoZS5fX3RleHQ9PT0iIiYmZS5pc1NpbXBsZVRleHQoKSYmIWUuaXNVbm1lcmdlYWJsZSgpKWUucmVtb3ZlKCk7ZWxzZXtmb3IodmFyIHQ7KHQ9ZS5nZXRQcmV2aW91c1NpYmxpbmcoKSkhPT1udWxsJiZaKHQpJiZ0LmlzU2ltcGxlVGV4dCgpJiYhdC5pc1VubWVyZ2VhYmxlKCk7KWlmKHQuX190ZXh0PT09IiIpdC5yZW1vdmUoKTtlbHNle0V5KHQsZSkmJihlPUN5KHQsZSkpO2JyZWFrfWZvcih2YXIgbjsobj1lLmdldE5leHRTaWJsaW5nKCkpIT09bnVsbCYmWihuKSYmbi5pc1NpbXBsZVRleHQoKSYmIW4uaXNVbm1lcmdlYWJsZSgpOylpZihuLl9fdGV4dD09PSIiKW4ucmVtb3ZlKCk7ZWxzZXtFeShlLG4pJiZDeShlLG4pO2JyZWFrfX19ZnVuY3Rpb24gcWcoZSl7cmV0dXJuICR5KGUuYW5jaG9yKSwkeShlLmZvY3VzKSxlfWZ1bmN0aW9uICR5KGUpe2Zvcig7ZS50eXBlPT09ImVsZW1lbnQiOyl7dmFyIHQ9ZS5nZXROb2RlKCksbj1lLm9mZnNldDtpZihuPT09dC5nZXRDaGlsZHJlblNpemUoKT8odD10LmdldENoaWxkQXRJbmRleChuLTEpLG49ITApOih0PXQuZ2V0Q2hpbGRBdEluZGV4KG4pLG49ITEpLFoodCkpe2Uuc2V0KHQuX19rZXksbj90LmdldFRleHRDb250ZW50U2l6ZSgpOjAsInRleHQiKTticmVha31lbHNlIGlmKCFXKHQpKWJyZWFrO2Uuc2V0KHQuX19rZXksbj90LmdldENoaWxkcmVuU2l6ZSgpOjAsImVsZW1lbnQiKX19bGV0IGMyPTEsZDI9dHlwZW9mIHF1ZXVlTWljcm90YXNrPT0iZnVuY3Rpb24iP3F1ZXVlTWljcm90YXNrOmU9PntQcm9taXNlLnJlc29sdmUoKS50aGVuKGUpfTtmdW5jdGlvbiBlbShlKXtsZXQgdD1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2lmKHQ9PT1udWxsKXJldHVybiExO2xldCBuPXQubm9kZU5hbWU7cmV0dXJuIFZlKElhKGUpKSYmKG49PT0iSU5QVVQifHxuPT09IlRFWFRBUkVBInx8dC5jb250ZW50RWRpdGFibGU9PT0idHJ1ZSImJnQuX19sZXhpY2FsRWRpdG9yPT1udWxsKX1mdW5jdGlvbiBEYShlLHQsbil7bGV0IHI9ZS5nZXRSb290RWxlbWVudCgpO3RyeXtyZXR1cm4gciE9PW51bGwmJnIuY29udGFpbnModCkmJnIuY29udGFpbnMobikmJnQhPT1udWxsJiYhZW0odCkmJnRtKHQpPT09ZX1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gdG0oZSl7Zm9yKDtlIT1udWxsOyl7bGV0IHQ9ZS5fX2xleGljYWxFZGl0b3I7aWYodCE9bnVsbClyZXR1cm4gdDtlPXBkKGUpfXJldHVybiBudWxsfWZ1bmN0aW9uIFpoKGUpe3JldHVybiBlLmlzVG9rZW4oKXx8ZS5pc1NlZ21lbnRlZCgpfWZ1bmN0aW9uICRjKGUpe2Zvcig7ZSE9bnVsbDspe2lmKGUubm9kZVR5cGU9PT0zKXJldHVybiBlO2U9ZS5maXJzdENoaWxkfXJldHVybiBudWxsfWZ1bmN0aW9uIFRfKGUsdCxuKXtyZXR1cm4gdD1saVt0XSxlJnQmJihuPT09bnVsbHx8IShuJnQpKT9lXnQ6bj09PW51bGx8fG4mdD9lfHQ6ZX1mdW5jdGlvbiBiXyhlKXtyZXR1cm4gWihlKXx8eGEoZSl8fFZlKGUpfWZ1bmN0aW9uIE5fKGUsdCl7aWYodCE9bnVsbCllLl9fa2V5PXQ7ZWxzZXtlbigpLDk5PHdhJiZLKDE0KSx0PXR0KCk7dmFyIG49a3IoKSxyPSIiK2MyKys7bi5fbm9kZU1hcC5zZXQocixlKSxXKGUpP3QuX2RpcnR5RWxlbWVudHMuc2V0KHIsITApOnQuX2RpcnR5TGVhdmVzLmFkZChyKSx0Ll9jbG9uZU5vdE5lZWRlZC5hZGQociksdC5fZGlydHlUeXBlPTEsZS5fX2tleT1yfX1mdW5jdGlvbiBzaShlKXt2YXIgdD1lLmdldFBhcmVudCgpO2lmKHQhPT1udWxsKXtsZXQgbz1lLmdldFdyaXRhYmxlKCk7dD10LmdldFdyaXRhYmxlKCk7dmFyIG49ZS5nZXRQcmV2aW91c1NpYmxpbmcoKTtpZihlPWUuZ2V0TmV4dFNpYmxpbmcoKSxuPT09bnVsbClpZihlIT09bnVsbCl7dmFyIHI9ZS5nZXRXcml0YWJsZSgpO3QuX19maXJzdD1lLl9fa2V5LHIuX19wcmV2PW51bGx9ZWxzZSB0Ll9fZmlyc3Q9bnVsbDtlbHNle2lmKHI9bi5nZXRXcml0YWJsZSgpLGUhPT1udWxsKXtsZXQgaT1lLmdldFdyaXRhYmxlKCk7aS5fX3ByZXY9ci5fX2tleSxyLl9fbmV4dD1pLl9fa2V5fWVsc2Ugci5fX25leHQ9bnVsbDtvLl9fcHJldj1udWxsfWU9PT1udWxsP24hPT1udWxsPyhlPW4uZ2V0V3JpdGFibGUoKSx0Ll9fbGFzdD1uLl9fa2V5LGUuX19uZXh0PW51bGwpOnQuX19sYXN0PW51bGw6KGU9ZS5nZXRXcml0YWJsZSgpLG4hPT1udWxsPyhuPW4uZ2V0V3JpdGFibGUoKSxuLl9fbmV4dD1lLl9fa2V5LGUuX19wcmV2PW4uX19rZXkpOmUuX19wcmV2PW51bGwsby5fX25leHQ9bnVsbCksdC5fX3NpemUtLSxvLl9fcGFyZW50PW51bGx9fWZ1bmN0aW9uIGtjKGUpezk5PHdhJiZLKDE0KTt2YXIgdD1lLmdldExhdGVzdCgpLG49dC5fX3BhcmVudCxyPWtyKCk7bGV0IG89dHQoKSxpPXIuX25vZGVNYXA7aWYocj1vLl9kaXJ0eUVsZW1lbnRzLG4hPT1udWxsKWU6Zm9yKDtuIT09bnVsbDspe2lmKHIuaGFzKG4pKWJyZWFrIGU7bGV0IGw9aS5nZXQobik7aWYobD09PXZvaWQgMClicmVhaztyLnNldChuLCExKSxuPWwuX19wYXJlbnR9dD10Ll9fa2V5LG8uX2RpcnR5VHlwZT0xLFcoZSk/ci5zZXQodCwhMCk6by5fZGlydHlMZWF2ZXMuYWRkKHQpfWZ1bmN0aW9uIEx0KGUpe2VuKCk7dmFyIHQ9dHQoKTtsZXQgbj10Ll9jb21wb3NpdGlvbktleTtlIT09biYmKHQuX2NvbXBvc2l0aW9uS2V5PWUsbiE9PW51bGwmJih0PWt0KG4pLHQhPT1udWxsJiZ0LmdldFdyaXRhYmxlKCkpLGUhPT1udWxsJiYoZT1rdChlKSxlIT09bnVsbCYmZS5nZXRXcml0YWJsZSgpKSl9ZnVuY3Rpb24geW8oKXtyZXR1cm4gS2woKT9udWxsOnR0KCkuX2NvbXBvc2l0aW9uS2V5fWZ1bmN0aW9uIGt0KGUsdCl7cmV0dXJuIGU9KHR8fGtyKCkpLl9ub2RlTWFwLmdldChlKSxlPT09dm9pZCAwP251bGw6ZX1mdW5jdGlvbiBSXyhlLHQpe2xldCBuPXR0KCk7cmV0dXJuIGU9ZVtgX19sZXhpY2FsS2V5XyR7bi5fa2V5fWBdLGUhPT12b2lkIDA/a3QoZSx0KTpudWxsfWZ1bmN0aW9uIElhKGUsdCl7Zm9yKDtlIT1udWxsOyl7bGV0IG49Ul8oZSx0KTtpZihuIT09bnVsbClyZXR1cm4gbjtlPXBkKGUpfXJldHVybiBudWxsfWZ1bmN0aW9uIFBfKGUpe2xldCB0PU9iamVjdC5hc3NpZ24oe30sZS5fZGVjb3JhdG9ycyk7cmV0dXJuIGUuX3BlbmRpbmdEZWNvcmF0b3JzPXR9ZnVuY3Rpb24ga3koZSl7cmV0dXJuIGUucmVhZCgoKT0+Q3IoKS5nZXRUZXh0Q29udGVudCgpKX1mdW5jdGlvbiBmMihlLHQpe2JuKGUsKCk9Pnt2YXIgbj1rcigpO2lmKCFuLmlzRW1wdHkoKSlpZih0PT09InJvb3QiKUNyKCkubWFya0RpcnR5KCk7ZWxzZXtuPW4uX25vZGVNYXA7Zm9yKGxldFsscl1vZiBuKXIubWFya0RpcnR5KCl9fSxlLl9wZW5kaW5nRWRpdG9yU3RhdGU9PT1udWxsP3t0YWc6Imhpc3RvcnktbWVyZ2UifTp2b2lkIDApfWZ1bmN0aW9uIENyKCl7cmV0dXJuIGtyKCkuX25vZGVNYXAuZ2V0KCJyb290Iil9ZnVuY3Rpb24geHIoZSl7ZW4oKTtsZXQgdD1rcigpO2UhPT1udWxsJiYoZS5kaXJ0eT0hMCxlLl9jYWNoZWROb2Rlcz1udWxsKSx0Ll9zZWxlY3Rpb249ZX1mdW5jdGlvbiBybChlKXt2YXIgdD10dCgpLG47ZTp7Zm9yKG49ZTtuIT1udWxsOyl7bGV0IHI9bltgX19sZXhpY2FsS2V5XyR7dC5fa2V5fWBdO2lmKHIhPT12b2lkIDApe249cjticmVhayBlfW49cGQobil9bj1udWxsfXJldHVybiBuPT09bnVsbD8odD10LmdldFJvb3RFbGVtZW50KCksZT09PXQ/a3QoInJvb3QiKTpudWxsKTprdChuKX1mdW5jdGlvbiBPXyhlKXtyZXR1cm4vW1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdL2cudGVzdChlKX1mdW5jdGlvbiBubShlKXtsZXQgdD1bXTtmb3IoO2UhPT1udWxsOyl0LnB1c2goZSksZT1lLl9wYXJlbnRFZGl0b3I7cmV0dXJuIHR9ZnVuY3Rpb24gQV8oKXtyZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikucmVwbGFjZSgvW15hLXpdKy9nLCIiKS5zdWJzdHIoMCw1KX1mdW5jdGlvbiBybShlLHQsbil7aWYodD0kcih0Ll93aW5kb3cpLHQhPT1udWxsKXt2YXIgcj10LmFuY2hvck5vZGUse2FuY2hvck9mZnNldDpvLGZvY3VzT2Zmc2V0Oml9PXQ7aWYociE9PW51bGwmJih0PXIubm9kZVR5cGU9PT0zP3Iubm9kZVZhbHVlOm51bGwscj1JYShyKSx0IT09bnVsbCYmWihyKSkpe2lmKHQ9PT1oZCYmbil7bGV0IGw9bi5sZW5ndGg7dD1uLGk9bz1sfXQhPT1udWxsJiZvbShyLHQsbyxpLGUpfX19ZnVuY3Rpb24gb20oZSx0LG4scixvKXtsZXQgaT1lO2lmKGkuaXNBdHRhY2hlZCgpJiYob3x8IWkuaXNEaXJ0eSgpKSl7bGV0IHU9aS5pc0NvbXBvc2luZygpLGM9dDtpZigodXx8bykmJnRbdC5sZW5ndGgtMV09PT1oZCYmKGM9dC5zbGljZSgwLC0xKSksdD1pLmdldFRleHRDb250ZW50KCksb3x8YyE9PXQpaWYoYz09PSIiKWlmKEx0KG51bGwpLFFnfHxmZHx8SmcpaS5yZW1vdmUoKTtlbHNle2xldCBkPXR0KCk7c2V0VGltZW91dCgoKT0+e2QudXBkYXRlKCgpPT57aS5pc0F0dGFjaGVkKCkmJmkucmVtb3ZlKCl9KX0sMjApfWVsc2V7bz1pLmdldFBhcmVudCgpLHQ9SGwoKTt2YXIgbD1pLmdldFRleHRDb250ZW50U2l6ZSgpLHM9eW8oKSxhPWkuZ2V0S2V5KCk7aS5pc1Rva2VuKCl8fHMhPT1udWxsJiZhPT09cyYmIXV8fGhlKHQpJiYobyE9PW51bGwmJiFvLmNhbkluc2VydFRleHRCZWZvcmUoKSYmdC5hbmNob3Iub2Zmc2V0PT09MHx8dC5hbmNob3Iua2V5PT09ZS5fX2tleSYmdC5hbmNob3Iub2Zmc2V0PT09MCYmIWkuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpfHx0LmZvY3VzLmtleT09PWUuX19rZXkmJnQuZm9jdXMub2Zmc2V0PT09bCYmIWkuY2FuSW5zZXJ0VGV4dEFmdGVyKCkpP2kubWFya0RpcnR5KCk6KGU9S2UoKSxoZShlKSYmbiE9PW51bGwmJnIhPT1udWxsJiYoZS5zZXRUZXh0Tm9kZVJhbmdlKGksbixpLHIpLGkuaXNTZWdtZW50ZWQoKSYmKG49aS5nZXRUZXh0Q29udGVudCgpLG49Q3QobiksaS5yZXBsYWNlKG4pLGk9bikpLGkuc2V0VGV4dENvbnRlbnQoYykpfX19ZnVuY3Rpb24gaDIoZSx0KXtpZih0LmlzU2VnbWVudGVkKCkpcmV0dXJuITA7aWYoIWUuaXNDb2xsYXBzZWQoKSlyZXR1cm4hMTtlPWUuYW5jaG9yLm9mZnNldDtsZXQgbj10LmdldFBhcmVudE9yVGhyb3coKSxyPXQuaXNUb2tlbigpO3JldHVybiBlPT09MD8oKGU9IXQuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpfHwhbi5jYW5JbnNlcnRUZXh0QmVmb3JlKCl8fHIpfHwodD10LmdldFByZXZpb3VzU2libGluZygpLGU9KFoodCl8fFcodCkmJnQuaXNJbmxpbmUoKSkmJiF0LmNhbkluc2VydFRleHRBZnRlcigpKSxlKTplPT09dC5nZXRUZXh0Q29udGVudFNpemUoKT8hdC5jYW5JbnNlcnRUZXh0QWZ0ZXIoKXx8IW4uY2FuSW5zZXJ0VGV4dEFmdGVyKCl8fHI6ITF9ZnVuY3Rpb24genMoZSx0KXtlLl9fbGV4aWNhbENsYXNzTmFtZUNhY2hlPT09dm9pZCAwJiYoZS5fX2xleGljYWxDbGFzc05hbWVDYWNoZT17fSk7bGV0IG49ZS5fX2xleGljYWxDbGFzc05hbWVDYWNoZSxyPW5bdF07cmV0dXJuIHIhPT12b2lkIDA/cjooZT1lW3RdLHR5cGVvZiBlPT0ic3RyaW5nIj8oZT1lLnNwbGl0KCIgIiksblt0XT1lKTplKX1mdW5jdGlvbiBpbShlLHQsbixyLG8pe24uc2l6ZSE9PTAmJihuPXIuX190eXBlLHI9ci5fX2tleSx0PXQuZ2V0KG4pLHQ9PT12b2lkIDAmJksoMzMsbiksbj10LmtsYXNzLHQ9ZS5nZXQobiksdD09PXZvaWQgMCYmKHQ9bmV3IE1hcCxlLnNldChuLHQpKSxlPXQuZ2V0KHIpLG49ZT09PSJkZXN0cm95ZWQiJiZvPT09ImNyZWF0ZWQiLChlPT09dm9pZCAwfHxuKSYmdC5zZXQocixuPyJ1cGRhdGVkIjpvKSl9ZnVuY3Rpb24gVHkoZSx0LG4pe2xldCByPWUuZ2V0UGFyZW50KCksbz1uO3JldHVybiByIT09bnVsbCYmKHQmJm49PT0wPyhvPWUuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxlPXIpOnR8fG4hPT1lLmdldENoaWxkcmVuU2l6ZSgpfHwobz1lLmdldEluZGV4V2l0aGluUGFyZW50KCkrMSxlPXIpKSxlLmdldENoaWxkQXRJbmRleCh0P28tMTpvKX1mdW5jdGlvbiBxaChlLHQpe3ZhciBuPWUub2Zmc2V0O3JldHVybiBlLnR5cGU9PT0iZWxlbWVudCI/KGU9ZS5nZXROb2RlKCksVHkoZSx0LG4pKTooZT1lLmdldE5vZGUoKSx0JiZuPT09MHx8IXQmJm49PT1lLmdldFRleHRDb250ZW50U2l6ZSgpPyhuPXQ/ZS5nZXRQcmV2aW91c1NpYmxpbmcoKTplLmdldE5leHRTaWJsaW5nKCksbj09PW51bGw/VHkoZS5nZXRQYXJlbnRPclRocm93KCksdCxlLmdldEluZGV4V2l0aGluUGFyZW50KCkrKHQ/MDoxKSk6bik6bnVsbCl9ZnVuY3Rpb24gTV8oZSl7cmV0dXJuIGU9KGU9Z2QoZSkuZXZlbnQpJiZlLmlucHV0VHlwZSxlPT09Imluc2VydEZyb21QYXN0ZSJ8fGU9PT0iaW5zZXJ0RnJvbVBhc3RlQXNRdW90YXRpb24ifWZ1bmN0aW9uIFRjKGUpe3JldHVybiFubihlKSYmIWUuaXNMYXN0Q2hpbGQoKSYmIWUuaXNJbmxpbmUoKX1mdW5jdGlvbiBiYyhlLHQpe3JldHVybiBlPWUuX2tleVRvRE9NTWFwLmdldCh0KSxlPT09dm9pZCAwJiZLKDc1LHQpLGV9ZnVuY3Rpb24gcGQoZSl7cmV0dXJuIGU9ZS5hc3NpZ25lZFNsb3R8fGUucGFyZW50RWxlbWVudCxlIT09bnVsbCYmZS5ub2RlVHlwZT09PTExP2UuaG9zdDplfWZ1bmN0aW9uIE5jKGUsdCl7Zm9yKGU9ZS5nZXRQYXJlbnQoKTtlIT09bnVsbDspe2lmKGUuaXModCkpcmV0dXJuITA7ZT1lLmdldFBhcmVudCgpfXJldHVybiExfWZ1bmN0aW9uIGdkKGUpe3JldHVybiBlPWUuX3dpbmRvdyxlPT09bnVsbCYmSyg3OCksZX1mdW5jdGlvbiBMXyhlKXtmb3IoZT1lLmdldFBhcmVudE9yVGhyb3coKTtlIT09bnVsbCYmIWVyKGUpOyllPWUuZ2V0UGFyZW50T3JUaHJvdygpO3JldHVybiBlfWZ1bmN0aW9uIGVyKGUpe3JldHVybiBubihlKXx8VyhlKSYmZS5pc1NoYWRvd1Jvb3QoKX1mdW5jdGlvbiBEXyhlKXtyZXR1cm4gZT1lLmNvbnN0cnVjdG9yLmNsb25lKGUpLE5fKGUsbnVsbCksZX1mdW5jdGlvbiBqYShlKXt2YXIgdD10dCgpO2xldCBuPWUuY29uc3RydWN0b3IuZ2V0VHlwZSgpO3JldHVybiB0PXQuX25vZGVzLmdldChuKSx0PT09dm9pZCAwJiZLKDk3KSx0PXQucmVwbGFjZSx0IT09bnVsbD8odD10KGUpLHQgaW5zdGFuY2VvZiBlLmNvbnN0cnVjdG9yfHxLKDk4KSx0KTplfWZ1bmN0aW9uIHlmKGUsdCl7ZT1lLmdldFBhcmVudCgpLCFubihlKXx8Vyh0KXx8VmUodCl8fEsoOTkpfWZ1bmN0aW9uIHhmKGUpe3JldHVybihWZShlKXx8VyhlKSYmIWUuY2FuQmVFbXB0eSgpKSYmIWUuaXNJbmxpbmUoKX1mdW5jdGlvbiBlcChlLHQsbil7bi5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgiY2FyZXQtY29sb3IiKSx0Ll9ibG9ja0N1cnNvckVsZW1lbnQ9bnVsbCx0PWUucGFyZW50RWxlbWVudCx0IT09bnVsbCYmdC5yZW1vdmVDaGlsZChlKX1mdW5jdGlvbiAkcihlKXtyZXR1cm4gWHI/KGV8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCk6bnVsbH1mdW5jdGlvbiBJXyhlLHQpe2xldCBuPWUuZ2V0Q2hpbGRBdEluZGV4KHQpO249PW51bGwmJihuPWUpLGVyKGUpJiZLKDEwMik7bGV0IHI9bD0+e2NvbnN0IHM9bC5nZXRQYXJlbnRPclRocm93KCksYT1lcihzKSx1PWwhPT1ufHxhP0RfKGwpOmw7aWYoYSlyZXR1cm4gbC5pbnNlcnRBZnRlcih1KSxbbCx1LHVdO2NvbnN0W2MsZCxmXT1yKHMpO3JldHVybiBsPWwuZ2V0TmV4dFNpYmxpbmdzKCksZi5hcHBlbmQodSwuLi5sKSxbYyxkLHVdfSxbbyxpXT1yKG4pO3JldHVybltvLGldfWZ1bmN0aW9uIFJjKGUsdCl7Zm9yKDtlIT09Q3IoKSYmZSE9bnVsbDspe2lmKHQoZSkpcmV0dXJuIGU7ZT1lLmdldFBhcmVudCgpfXJldHVybiBudWxsfWZ1bmN0aW9uIHAyKGUpe2xldCB0PVtdLG49W2VdO2Zvcig7MDxuLmxlbmd0aDspe2xldCByPW4ucG9wKCk7cj09PXZvaWQgMCYmSygxMTIpLFcocikmJm4udW5zaGlmdCguLi5yLmdldENoaWxkcmVuKCkpLHIhPT1lJiZ0LnB1c2gocil9cmV0dXJuIHR9ZnVuY3Rpb24gbWQoZSl7cmV0dXJuIGUubm9kZVR5cGU9PT0xfWZ1bmN0aW9uIGpfKGUsdCxuLHIsbyxpKXtmb3IoZT1lLmdldEZpcnN0Q2hpbGQoKTtlIT09bnVsbDspe2xldCBsPWUuX19rZXk7ZS5fX3BhcmVudD09PXQmJihXKGUpJiZqXyhlLGwsbixyLG8saSksbi5oYXMobCl8fGkuZGVsZXRlKGwpLG8ucHVzaChsKSksZT1lLmdldE5leHRTaWJsaW5nKCl9fWZ1bmN0aW9uIGcyKGUsdCxuLHIpe2U9ZS5fbm9kZU1hcCx0PXQuX25vZGVNYXA7bGV0IG89W107Zm9yKGxldFtpXW9mIHIpe2xldCBsPXQuZ2V0KGkpO2w9PT12b2lkIDB8fGwuaXNBdHRhY2hlZCgpfHwoVyhsKSYmal8obCxpLGUsdCxvLHIpLGUuaGFzKGkpfHxyLmRlbGV0ZShpKSxvLnB1c2goaSkpfWZvcihsZXQgaSBvZiBvKXQuZGVsZXRlKGkpO2ZvcihsZXQgaSBvZiBuKXI9dC5nZXQoaSkscj09PXZvaWQgMHx8ci5pc0F0dGFjaGVkKCl8fChlLmhhcyhpKXx8bi5kZWxldGUoaSksdC5kZWxldGUoaSkpfWxldCBtdD0iIixxdD0iIixNcj0iIixPbyxHdCxtYSx6Xz0hMSxsbT0hMSx2ZCxGdT1udWxsLHRwLG5wLG1pLEFvLHJwLHZhO2Z1bmN0aW9uIEJ1KGUsdCl7bGV0IG49bWkuZ2V0KGUpO2lmKHQhPT1udWxsKXtsZXQgcj1scChlKTtyLnBhcmVudE5vZGU9PT10JiZ0LnJlbW92ZUNoaWxkKHIpfUFvLmhhcyhlKXx8R3QuX2tleVRvRE9NTWFwLmRlbGV0ZShlKSxXKG4pJiYoZT1QYyhuLG1pKSxvcChlLDAsZS5sZW5ndGgtMSxudWxsKSksbiE9PXZvaWQgMCYmaW0odmEsbWEsdmQsbiwiZGVzdHJveWVkIil9ZnVuY3Rpb24gb3AoZSx0LG4scil7Zm9yKDt0PD1uOysrdCl7bGV0IG89ZVt0XTtvIT09dm9pZCAwJiZCdShvLHIpfX1mdW5jdGlvbiBHbyhlLHQpe2Uuc2V0UHJvcGVydHkoInRleHQtYWxpZ24iLHQpfWZ1bmN0aW9uIEZfKGUsdCl7dmFyIG49T28udGhlbWUuaW5kZW50O2lmKHR5cGVvZiBuPT0ic3RyaW5nIil7bGV0IHI9ZS5jbGFzc0xpc3QuY29udGFpbnMobik7MDx0JiYhcj9lLmNsYXNzTGlzdC5hZGQobik6MT50JiZyJiZlLmNsYXNzTGlzdC5yZW1vdmUobil9bj1nZXRDb21wdXRlZFN0eWxlKGUpLmdldFByb3BlcnR5VmFsdWUoIi0tbGV4aWNhbC1pbmRlbnQtYmFzZS12YWx1ZSIpfHwiNDBweCIsZS5zdHlsZS5zZXRQcm9wZXJ0eSgicGFkZGluZy1pbmxpbmUtc3RhcnQiLHQ9PT0wPyIiOmBjYWxjKCR7dH0gKiAke259KWApfWZ1bmN0aW9uIEJfKGUsdCl7ZT1lLnN0eWxlLHQ9PT0wP0dvKGUsIiIpOnQ9PT0xP0dvKGUsImxlZnQiKTp0PT09Mj9HbyhlLCJjZW50ZXIiKTp0PT09Mz9HbyhlLCJyaWdodCIpOnQ9PT00P0dvKGUsImp1c3RpZnkiKTp0PT09NT9HbyhlLCJzdGFydCIpOnQ9PT02JiZHbyhlLCJlbmQiKX1mdW5jdGlvbiBXdShlLHQsbil7bGV0IHI9QW8uZ2V0KGUpO3I9PT12b2lkIDAmJksoNjApO2xldCBvPXIuY3JlYXRlRE9NKE9vLEd0KTt2YXIgaT1HdC5fa2V5VG9ET01NYXA7aWYob1siX19sZXhpY2FsS2V5XyIrR3QuX2tleV09ZSxpLnNldChlLG8pLFoocik/by5zZXRBdHRyaWJ1dGUoImRhdGEtbGV4aWNhbC10ZXh0IiwidHJ1ZSIpOlZlKHIpJiZvLnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLWRlY29yYXRvciIsInRydWUiKSxXKHIpKXtpZihlPXIuX19pbmRlbnQsaT1yLl9fc2l6ZSxlIT09MCYmRl8obyxlKSxpIT09MCl7LS1pLGU9UGMocixBbyk7dmFyIGw9cXQ7cXQ9IiIsaXAoZSxyLDAsaSxvLG51bGwpLFVfKHIsbykscXQ9bH1lPXIuX19mb3JtYXQsZSE9PTAmJkJfKG8sZSksci5pc0lubGluZSgpfHxXXyhudWxsLHIsbyksVGMocikmJihtdCs9YAoKYCxNcis9YAoKYCl9ZWxzZSBpPXIuZ2V0VGV4dENvbnRlbnQoKSxWZShyKT8obD1yLmRlY29yYXRlKEd0LE9vKSxsIT09bnVsbCYmVl8oZSxsKSxvLmNvbnRlbnRFZGl0YWJsZT0iZmFsc2UiKTpaKHIpJiYoci5pc0RpcmVjdGlvbmxlc3MoKXx8KHF0Kz1pKSksbXQrPWksTXIrPWk7cmV0dXJuIHQhPT1udWxsJiYobiE9bnVsbD90Lmluc2VydEJlZm9yZShvLG4pOihuPXQuX19sZXhpY2FsTGluZUJyZWFrLG4hPW51bGw/dC5pbnNlcnRCZWZvcmUobyxuKTp0LmFwcGVuZENoaWxkKG8pKSksaW0odmEsbWEsdmQsciwiY3JlYXRlZCIpLG99ZnVuY3Rpb24gaXAoZSx0LG4scixvLGkpe2xldCBsPW10O2ZvcihtdD0iIjtuPD1yOysrbilXdShlW25dLG8saSk7VGModCkmJihtdCs9YAoKYCksby5fX2xleGljYWxUZXh0Q29udGVudD1tdCxtdD1sK210fWZ1bmN0aW9uIGJ5KGUsdCl7cmV0dXJuIGU9dC5nZXQoZSkseGEoZSl8fFZlKGUpJiZlLmlzSW5saW5lKCl9ZnVuY3Rpb24gV18oZSx0LG4pe2U9ZSE9PW51bGwmJihlLl9fc2l6ZT09PTB8fGJ5KGUuX19sYXN0LG1pKSksdD10Ll9fc2l6ZT09PTB8fGJ5KHQuX19sYXN0LEFvKSxlP3R8fCh0PW4uX19sZXhpY2FsTGluZUJyZWFrLHQhPW51bGwmJm4ucmVtb3ZlQ2hpbGQodCksbi5fX2xleGljYWxMaW5lQnJlYWs9bnVsbCk6dCYmKHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSxuLl9fbGV4aWNhbExpbmVCcmVhaz10LG4uYXBwZW5kQ2hpbGQodCkpfWZ1bmN0aW9uIFVfKGUsdCl7dmFyIG49dC5fX2xleGljYWxEaXI7aWYodC5fX2xleGljYWxEaXJUZXh0Q29udGVudCE9PXF0fHxuIT09RnUpe2xldCBpPXF0PT09IiI7aWYoaSl2YXIgcj1GdTtlbHNlIHI9cXQscj1uMi50ZXN0KHIpPyJydGwiOnIyLnRlc3Qocik/Imx0ciI6bnVsbDtpZihyIT09bil7bGV0IGw9dC5jbGFzc0xpc3Qscz1Pby50aGVtZTt2YXIgbz1uIT09bnVsbD9zW25dOnZvaWQgMDtsZXQgYT1yIT09bnVsbD9zW3JdOnZvaWQgMDtvIT09dm9pZCAwJiYodHlwZW9mIG89PSJzdHJpbmciJiYobz1vLnNwbGl0KCIgIiksbz1zW25dPW8pLGwucmVtb3ZlKC4uLm8pKSxyPT09bnVsbHx8aSYmcj09PSJsdHIiP3QucmVtb3ZlQXR0cmlidXRlKCJkaXIiKTooYSE9PXZvaWQgMCYmKHR5cGVvZiBhPT0ic3RyaW5nIiYmKG49YS5zcGxpdCgiICIpLGE9c1tyXT1uKSxhIT09dm9pZCAwJiZsLmFkZCguLi5hKSksdC5kaXI9ciksbG18fChlLmdldFdyaXRhYmxlKCkuX19kaXI9cil9RnU9cix0Ll9fbGV4aWNhbERpclRleHRDb250ZW50PXF0LHQuX19sZXhpY2FsRGlyPXJ9fWZ1bmN0aW9uIFBjKGUsdCl7bGV0IG49W107Zm9yKGU9ZS5fX2ZpcnN0O2UhPT1udWxsOyl7bGV0IHI9dC5nZXQoZSk7cj09PXZvaWQgMCYmSygxMDEpLG4ucHVzaChlKSxlPXIuX19uZXh0fXJldHVybiBufWZ1bmN0aW9uIFNzKGUsdCl7dmFyIG49bWkuZ2V0KGUpLHI9QW8uZ2V0KGUpO24hPT12b2lkIDAmJnIhPT12b2lkIDB8fEsoNjEpO3ZhciBvPXpffHxucC5oYXMoZSl8fHRwLmhhcyhlKTtsZXQgaT1iYyhHdCxlKTtpZihuPT09ciYmIW8pcmV0dXJuIFcobik/KHI9aS5fX2xleGljYWxUZXh0Q29udGVudCxyIT09dm9pZCAwJiYobXQrPXIsTXIrPXIpLHI9aS5fX2xleGljYWxEaXJUZXh0Q29udGVudCxyIT09dm9pZCAwJiYocXQrPXIpKToocj1uLmdldFRleHRDb250ZW50KCksWihuKSYmIW4uaXNEaXJlY3Rpb25sZXNzKCkmJihxdCs9ciksTXIrPXIsbXQrPXIpLGk7aWYobiE9PXImJm8mJmltKHZhLG1hLHZkLHIsInVwZGF0ZWQiKSxyLnVwZGF0ZURPTShuLGksT28pKXJldHVybiByPVd1KGUsbnVsbCxudWxsKSx0PT09bnVsbCYmSyg2MiksdC5yZXBsYWNlQ2hpbGQocixpKSxCdShlLG51bGwpLHI7aWYoVyhuKSYmVyhyKSl7aWYoZT1yLl9faW5kZW50LGUhPT1uLl9faW5kZW50JiZGXyhpLGUpLGU9ci5fX2Zvcm1hdCxlIT09bi5fX2Zvcm1hdCYmQl8oaSxlKSxvKXtlPXIsbz1xdCxxdD0iIix0PW10O3ZhciBsPW4uX19zaXplLHM9ZS5fX3NpemU7aWYobXQ9IiIsbD09PTEmJnM9PT0xKXt2YXIgYT1uLl9fZmlyc3QsdT1lLl9fZmlyc3Q7aWYoYT09PXUpU3MoYSxpKTtlbHNle3ZhciBjPWxwKGEpO3U9V3UodSxudWxsLG51bGwpLGkucmVwbGFjZUNoaWxkKHUsYyksQnUoYSxudWxsKX19ZWxzZXt1PVBjKG4sbWkpO3ZhciBkPVBjKGUsQW8pO2lmKGw9PT0wKXMhPT0wJiZpcChkLGUsMCxzLTEsaSxudWxsKTtlbHNlIGlmKHM9PT0wKWwhPT0wJiYoYT1pLl9fbGV4aWNhbExpbmVCcmVhaz09bnVsbCxvcCh1LDAsbC0xLGE/bnVsbDppKSxhJiYoaS50ZXh0Q29udGVudD0iIikpO2Vsc2V7dmFyIGY9dTt1PWQsZD1sLTEsbD1zLTE7bGV0IG09aS5maXJzdENoaWxkLGc9MDtmb3Iocz0wO2c8PWQmJnM8PWw7KXt2YXIgaD1mW2ddO2xldCBTPXVbc107aWYoaD09PVMpbT13ZihTcyhTLGkpKSxnKysscysrO2Vsc2V7YT09PXZvaWQgMCYmKGE9bmV3IFNldChmKSksYz09PXZvaWQgMCYmKGM9bmV3IFNldCh1KSk7bGV0IHY9Yy5oYXMoaCkseT1hLmhhcyhTKTt2Pyh5PyhoPWJjKEd0LFMpLGg9PT1tP209d2YoU3MoUyxpKSk6KG0hPW51bGw/aS5pbnNlcnRCZWZvcmUoaCxtKTppLmFwcGVuZENoaWxkKGgpLFNzKFMsaSkpLGcrKyk6V3UoUyxpLG0pLHMrKyk6KG09d2YobHAoaCkpLEJ1KGgsaSksZysrKX19YT1nPmQsYz1zPmwsYSYmIWM/KGE9dVtsKzFdLGE9YT09PXZvaWQgMD9udWxsOkd0LmdldEVsZW1lbnRCeUtleShhKSxpcCh1LGUscyxsLGksYSkpOmMmJiFhJiZvcChmLGcsZCxpKX19VGMoZSkmJihtdCs9YAoKYCksaS5fX2xleGljYWxUZXh0Q29udGVudD1tdCxtdD10K210LFVfKGUsaSkscXQ9byxubihyKXx8ci5pc0lubGluZSgpfHxXXyhuLHIsaSl9VGMocikmJihtdCs9YAoKYCxNcis9YAoKYCl9ZWxzZSBuPXIuZ2V0VGV4dENvbnRlbnQoKSxWZShyKT8obz1yLmRlY29yYXRlKEd0LE9vKSxvIT09bnVsbCYmVl8oZSxvKSk6WihyKSYmIXIuaXNEaXJlY3Rpb25sZXNzKCkmJihxdCs9biksbXQrPW4sTXIrPW47cmV0dXJuIWxtJiZubihyKSYmci5fX2NhY2hlZFRleHQhPT1NciYmKHI9ci5nZXRXcml0YWJsZSgpLHIuX19jYWNoZWRUZXh0PU1yKSxpfWZ1bmN0aW9uIFZfKGUsdCl7bGV0IG49R3QuX3BlbmRpbmdEZWNvcmF0b3JzLHI9R3QuX2RlY29yYXRvcnM7aWYobj09PW51bGwpe2lmKHJbZV09PT10KXJldHVybjtuPVBfKEd0KX1uW2VdPXR9ZnVuY3Rpb24gd2YoZSl7cmV0dXJuIGU9ZS5uZXh0U2libGluZyxlIT09bnVsbCYmZT09PUd0Ll9ibG9ja0N1cnNvckVsZW1lbnQmJihlPWUubmV4dFNpYmxpbmcpLGV9ZnVuY3Rpb24gbHAoZSl7bGV0IHQ9cnAuZ2V0KGUpO3JldHVybiB0PT09dm9pZCAwJiZLKDc1LGUpLHR9bGV0IE5yPU9iamVjdC5mcmVlemUoe30pLHNwPVtbImtleWRvd24iLEUyXSxbInBvaW50ZXJkb3duIix2Ml0sWyJjb21wb3NpdGlvbnN0YXJ0IixfMl0sWyJjb21wb3NpdGlvbmVuZCIsUzJdLFsiaW5wdXQiLHcyXSxbImNsaWNrIixtMl0sWyJjdXQiLE5yXSxbImNvcHkiLE5yXSxbImRyYWdzdGFydCIsTnJdLFsiZHJhZ292ZXIiLE5yXSxbImRyYWdlbmQiLE5yXSxbInBhc3RlIixOcl0sWyJmb2N1cyIsTnJdLFsiYmx1ciIsTnJdLFsiZHJvcCIsTnJdXTtDYyYmc3AucHVzaChbImJlZm9yZWlucHV0IiwoZSx0KT0+eDIoZSx0KV0pO2xldCB5YT0wLEhfPTAsS189MCxWaT1udWxsLEZzPTAsYXA9ITEsdXA9ITEsQnM9ITEsRXM9ITEsR189WzAsIiIsMCwicm9vdCIsMF07ZnVuY3Rpb24gWV8oZSx0LG4scixvKXtsZXQgaT1lLmFuY2hvcixsPWUuZm9jdXMscz1pLmdldE5vZGUoKTt2YXIgYT10dCgpO2xldCB1PSRyKGEuX3dpbmRvdyksYz11IT09bnVsbD91LmFuY2hvck5vZGU6bnVsbCxkPWkua2V5O2E9YS5nZXRFbGVtZW50QnlLZXkoZCk7bGV0IGY9bi5sZW5ndGg7cmV0dXJuIGQhPT1sLmtleXx8IVoocyl8fCghbyYmKCFDY3x8S188cis1MCl8fHMuaXNEaXJ0eSgpJiYyPmZ8fE9fKG4pKSYmaS5vZmZzZXQhPT1sLm9mZnNldCYmIXMuaXNDb21wb3NpbmcoKXx8Wmgocyl8fHMuaXNEaXJ0eSgpJiYxPGZ8fChvfHwhQ2MpJiZhIT09bnVsbCYmIXMuaXNDb21wb3NpbmcoKSYmYyE9PSRjKGEpfHx1IT09bnVsbCYmdCE9PW51bGwmJighdC5jb2xsYXBzZWR8fHQuc3RhcnRDb250YWluZXIhPT11LmFuY2hvck5vZGV8fHQuc3RhcnRPZmZzZXQhPT11LmFuY2hvck9mZnNldCl8fHMuZ2V0Rm9ybWF0KCkhPT1lLmZvcm1hdHx8cy5nZXRTdHlsZSgpIT09ZS5zdHlsZXx8aDIoZSxzKX1mdW5jdGlvbiBOeShlLHQpe3JldHVybiBlIT09bnVsbCYmZS5ub2RlVmFsdWUhPT1udWxsJiZlLm5vZGVUeXBlPT09MyYmdCE9PTAmJnQhPT1lLm5vZGVWYWx1ZS5sZW5ndGh9ZnVuY3Rpb24gUnkoZSx0LG4pe2xldHthbmNob3JOb2RlOnIsYW5jaG9yT2Zmc2V0Om8sZm9jdXNOb2RlOmksZm9jdXNPZmZzZXQ6bH09ZTthcCYmKGFwPSExLE55KHIsbykmJk55KGksbCkpfHxibih0LCgpPT57aWYoIW4peHIobnVsbCk7ZWxzZSBpZihEYSh0LHIsaSkpe3ZhciBzPUtlKCk7aWYoaGUocykpe3ZhciBhPXMuYW5jaG9yLHU9YS5nZXROb2RlKCk7aWYocy5pc0NvbGxhcHNlZCgpKXtlLnR5cGU9PT0iUmFuZ2UiJiZlLmFuY2hvck5vZGU9PT1lLmZvY3VzTm9kZSYmKHMuZGlydHk9ITApO3ZhciBjPWdkKHQpLmV2ZW50O2M9Yz9jLnRpbWVTdGFtcDpwZXJmb3JtYW5jZS5ub3coKTtsZXRbZCxmLGgsbSxnXT1HXztjPGcrMjAwJiZhLm9mZnNldD09PWgmJmEua2V5PT09bT8ocy5mb3JtYXQ9ZCxzLnN0eWxlPWYpOmEudHlwZT09PSJ0ZXh0Ij8ocy5mb3JtYXQ9dS5nZXRGb3JtYXQoKSxzLnN0eWxlPXUuZ2V0U3R5bGUoKSk6YS50eXBlPT09ImVsZW1lbnQiJiYocy5mb3JtYXQ9MCxzLnN0eWxlPSIiKX1lbHNle2E9MjU1LHU9ITEsYz1zLmdldE5vZGVzKCk7bGV0IGQ9Yy5sZW5ndGg7Zm9yKGxldCBmPTA7ZjxkO2YrKyl7bGV0IGg9Y1tmXTtpZihaKGgpJiYodT0hMCxhJj1oLmdldEZvcm1hdCgpLGE9PT0wKSlicmVha31zLmZvcm1hdD11P2E6MH19Sih0LGRkLHZvaWQgMCl9fSl9ZnVuY3Rpb24gbTIoZSx0KXtibih0LCgpPT57bGV0IG49S2UoKTt2YXIgcj0kcih0Ll93aW5kb3cpO2xldCBvPUhsKCk7aWYocilpZihoZShuKSl7bGV0IGw9bi5hbmNob3I7dmFyIGk9bC5nZXROb2RlKCk7bC50eXBlPT09ImVsZW1lbnQiJiZsLm9mZnNldD09PTAmJm4uaXNDb2xsYXBzZWQoKSYmIW5uKGkpJiZDcigpLmdldENoaWxkcmVuU2l6ZSgpPT09MSYmaS5nZXRUb3BMZXZlbEVsZW1lbnRPclRocm93KCkuaXNFbXB0eSgpJiZvIT09bnVsbCYmbi5pcyhvKT8oci5yZW1vdmVBbGxSYW5nZXMoKSxuLmRpcnR5PSEwKTplLmRldGFpbCE9PTN8fG4uaXNDb2xsYXBzZWQoKXx8KHI9bi5mb2N1cy5nZXROb2RlKCksaSE9PXImJihXKGkpP2kuc2VsZWN0KDApOmkuZ2V0UGFyZW50T3JUaHJvdygpLnNlbGVjdCgwKSkpfWVsc2UgZS5wb2ludGVyVHlwZT09PSJ0b3VjaCImJihpPXIuYW5jaG9yTm9kZSxpIT09bnVsbCYmKGk9aS5ub2RlVHlwZSxpPT09MXx8aT09PTMpKSYmKHI9YW0obyxyLHQpLHhyKHIpKTtKKHQscl8sZSl9KX1mdW5jdGlvbiB2MihlLHQpe2xldCBuPWUudGFyZ2V0O2U9ZS5wb2ludGVyVHlwZSxuIGluc3RhbmNlb2YgTm9kZSYmZSE9PSJ0b3VjaCImJmJuKHQsKCk9PntWZShJYShuKSl8fCh1cD0hMCl9KX1mdW5jdGlvbiBYXyhlKXtyZXR1cm4gZS5nZXRUYXJnZXRSYW5nZXM/KGU9ZS5nZXRUYXJnZXRSYW5nZXMoKSxlLmxlbmd0aD09PTA/bnVsbDplWzBdKTpudWxsfWZ1bmN0aW9uIHkyKGUsdCl7cmV0dXJuIGUhPT10fHxXKGUpfHxXKHQpfHwhZS5pc1Rva2VuKCl8fCF0LmlzVG9rZW4oKX1mdW5jdGlvbiB4MihlLHQpe2xldCBuPWUuaW5wdXRUeXBlLHI9WF8oZSk7bj09PSJkZWxldGVDb21wb3NpdGlvblRleHQifHxQbyYmTV8odCl8fG4hPT0iaW5zZXJ0Q29tcG9zaXRpb25UZXh0IiYmYm4odCwoKT0+e2xldCBvPUtlKCk7aWYobj09PSJkZWxldGVDb250ZW50QmFja3dhcmQiKXtpZihvPT09bnVsbCl7dmFyIGk9SGwoKTtpZighaGUoaSkpcmV0dXJuO3hyKGkuY2xvbmUoKSl9aWYoaGUobykpe0hfPT09MjI5JiZlLnRpbWVTdGFtcDx5YSszMCYmdC5pc0NvbXBvc2luZygpJiZvLmFuY2hvci5rZXk9PT1vLmZvY3VzLmtleT8oTHQobnVsbCkseWE9MCxzZXRUaW1lb3V0KCgpPT57Ym4odCwoKT0+e0x0KG51bGwpfSl9LDMwKSxoZShvKSYmKGk9by5hbmNob3IuZ2V0Tm9kZSgpLGkubWFya0RpcnR5KCksby5mb3JtYXQ9aS5nZXRGb3JtYXQoKSxvLnN0eWxlPWkuZ2V0U3R5bGUoKSkpOihlLnByZXZlbnREZWZhdWx0KCksSih0LGhhLCEwKSk7cmV0dXJufX1pZihoZShvKSl7aT1lLmRhdGEsVmkhPT1udWxsJiZybSghMSx0LFZpKSxvLmRpcnR5JiZWaT09PW51bGx8fCFvLmlzQ29sbGFwc2VkKCl8fG5uKG8uYW5jaG9yLmdldE5vZGUoKSl8fHI9PT1udWxsfHxvLmFwcGx5RE9NUmFuZ2UociksVmk9bnVsbDt2YXIgbD1vLmZvY3VzLHM9by5hbmNob3IuZ2V0Tm9kZSgpO2lmKGw9bC5nZXROb2RlKCksbj09PSJpbnNlcnRUZXh0Inx8bj09PSJpbnNlcnRUcmFuc3Bvc2UiKWk9PT1gCmA/KGUucHJldmVudERlZmF1bHQoKSxKKHQsanMsITEpKTppPT09YAoKYD8oZS5wcmV2ZW50RGVmYXVsdCgpLEoodCxZaCx2b2lkIDApKTppPT1udWxsJiZlLmRhdGFUcmFuc2Zlcj8oaT1lLmRhdGFUcmFuc2Zlci5nZXREYXRhKCJ0ZXh0L3BsYWluIiksZS5wcmV2ZW50RGVmYXVsdCgpLG8uaW5zZXJ0UmF3VGV4dChpKSk6aSE9bnVsbCYmWV8obyxyLGksZS50aW1lU3RhbXAsITApPyhlLnByZXZlbnREZWZhdWx0KCksSih0LHBsLGkpKTpWaT1pLEtfPWUudGltZVN0YW1wO2Vsc2Ugc3dpdGNoKGUucHJldmVudERlZmF1bHQoKSxuKXtjYXNlImluc2VydEZyb21ZYW5rIjpjYXNlImluc2VydEZyb21Ecm9wIjpjYXNlImluc2VydFJlcGxhY2VtZW50VGV4dCI6Sih0LHBsLGUpO2JyZWFrO2Nhc2UiaW5zZXJ0RnJvbUNvbXBvc2l0aW9uIjpMdChudWxsKSxKKHQscGwsZSk7YnJlYWs7Y2FzZSJpbnNlcnRMaW5lQnJlYWsiOkx0KG51bGwpLEoodCxqcywhMSk7YnJlYWs7Y2FzZSJpbnNlcnRQYXJhZ3JhcGgiOkx0KG51bGwpLEJzJiYhZmQ/KEJzPSExLEoodCxqcywhMSkpOkoodCxZaCx2b2lkIDApO2JyZWFrO2Nhc2UiaW5zZXJ0RnJvbVBhc3RlIjpjYXNlImluc2VydEZyb21QYXN0ZUFzUXVvdGF0aW9uIjpKKHQsSGcsZSk7YnJlYWs7Y2FzZSJkZWxldGVCeUNvbXBvc2l0aW9uIjp5MihzLGwpJiZKKHQsWGgsZSk7YnJlYWs7Y2FzZSJkZWxldGVCeURyYWciOmNhc2UiZGVsZXRlQnlDdXQiOkoodCxYaCxlKTticmVhaztjYXNlImRlbGV0ZUNvbnRlbnQiOkoodCxoYSwhMSk7YnJlYWs7Y2FzZSJkZWxldGVXb3JkQmFja3dhcmQiOkoodCxwYSwhMCk7YnJlYWs7Y2FzZSJkZWxldGVXb3JkRm9yd2FyZCI6Sih0LHBhLCExKTticmVhaztjYXNlImRlbGV0ZUhhcmRMaW5lQmFja3dhcmQiOmNhc2UiZGVsZXRlU29mdExpbmVCYWNrd2FyZCI6Sih0LGdhLCEwKTticmVhaztjYXNlImRlbGV0ZUNvbnRlbnRGb3J3YXJkIjpjYXNlImRlbGV0ZUhhcmRMaW5lRm9yd2FyZCI6Y2FzZSJkZWxldGVTb2Z0TGluZUZvcndhcmQiOkoodCxnYSwhMSk7YnJlYWs7Y2FzZSJmb3JtYXRTdHJpa2VUaHJvdWdoIjpKKHQsdm8sInN0cmlrZXRocm91Z2giKTticmVhaztjYXNlImZvcm1hdEJvbGQiOkoodCx2bywiYm9sZCIpO2JyZWFrO2Nhc2UiZm9ybWF0SXRhbGljIjpKKHQsdm8sIml0YWxpYyIpO2JyZWFrO2Nhc2UiZm9ybWF0VW5kZXJsaW5lIjpKKHQsdm8sInVuZGVybGluZSIpO2JyZWFrO2Nhc2UiaGlzdG9yeVVuZG8iOkoodCxLZyx2b2lkIDApO2JyZWFrO2Nhc2UiaGlzdG9yeVJlZG8iOkoodCxHZyx2b2lkIDApfX19KX1mdW5jdGlvbiB3MihlLHQpe2Uuc3RvcFByb3BhZ2F0aW9uKCksYm4odCwoKT0+e3ZhciBuPUtlKCkscj1lLmRhdGEsbz1YXyhlKTtpZihyIT1udWxsJiZoZShuKSYmWV8obixvLHIsZS50aW1lU3RhbXAsITEpKXtFcyYmKGNwKHQsciksRXM9ITEpO3ZhciBpPW4uYW5jaG9yLGw9aS5nZXROb2RlKCk7aWYobz0kcih0Ll93aW5kb3cpLG89PT1udWxsKXJldHVybjtsZXQgcz1pLm9mZnNldDsoaT1DYyYmIW4uaXNDb2xsYXBzZWQoKSYmWihsKSYmby5hbmNob3JOb2RlIT09bnVsbCkmJihsPWwuZ2V0VGV4dENvbnRlbnQoKS5zbGljZSgwLHMpK3IrbC5nZXRUZXh0Q29udGVudCgpLnNsaWNlKHMrbi5mb2N1cy5vZmZzZXQpLG89by5hbmNob3JOb2RlLGk9bD09PShvLm5vZGVUeXBlPT09Mz9vLm5vZGVWYWx1ZTpudWxsKSksaXx8Sih0LHBsLHIpLHI9ci5sZW5ndGgsUG8mJjE8ciYmZS5pbnB1dFR5cGU9PT0iaW5zZXJ0Q29tcG9zaXRpb25UZXh0IiYmIXQuaXNDb21wb3NpbmcoKSYmKG4uYW5jaG9yLm9mZnNldC09ciksUWd8fGZkfHxKZ3x8IXQuaXNDb21wb3NpbmcoKXx8KHlhPTAsTHQobnVsbCkpfWVsc2Ugcm0oITEsdCxyIT09bnVsbD9yOnZvaWQgMCksRXMmJihjcCh0LHJ8fHZvaWQgMCksRXM9ITEpO2VuKCksbj10dCgpLENfKG4pfSksVmk9bnVsbH1mdW5jdGlvbiBfMihlLHQpe2JuKHQsKCk9PntsZXQgbj1LZSgpO2lmKGhlKG4pJiYhdC5pc0NvbXBvc2luZygpKXtsZXQgcj1uLmFuY2hvcixvPW4uYW5jaG9yLmdldE5vZGUoKTtMdChyLmtleSksKGUudGltZVN0YW1wPHlhKzMwfHxyLnR5cGU9PT0iZWxlbWVudCJ8fCFuLmlzQ29sbGFwc2VkKCl8fG8uZ2V0Rm9ybWF0KCkhPT1uLmZvcm1hdHx8by5nZXRTdHlsZSgpIT09bi5zdHlsZSkmJkoodCxwbCx0Mil9fSl9ZnVuY3Rpb24gY3AoZSx0KXt2YXIgbj1lLl9jb21wb3NpdGlvbktleTtpZihMdChudWxsKSxuIT09bnVsbCYmdCE9bnVsbCl7aWYodD09PSIiKXt0PWt0KG4pLGU9JGMoZS5nZXRFbGVtZW50QnlLZXkobikpLGUhPT1udWxsJiZlLm5vZGVWYWx1ZSE9PW51bGwmJloodCkmJm9tKHQsZS5ub2RlVmFsdWUsbnVsbCxudWxsLCEwKTtyZXR1cm59aWYodFt0Lmxlbmd0aC0xXT09PWAKYCYmKG49S2UoKSxoZShuKSkpe3Q9bi5mb2N1cyxuLmFuY2hvci5zZXQodC5rZXksdC5vZmZzZXQsdC50eXBlKSxKKGUsRWMsbnVsbCk7cmV0dXJufX1ybSghMCxlLHQpfWZ1bmN0aW9uIFMyKGUsdCl7UG8/RXM9ITA6Ym4odCwoKT0+e2NwKHQsZS5kYXRhKX0pfWZ1bmN0aW9uIEUyKGUsdCl7aWYoeWE9ZS50aW1lU3RhbXAsSF89ZS5rZXlDb2RlLCF0LmlzQ29tcG9zaW5nKCkpe3ZhcntrZXlDb2RlOm4sc2hpZnRLZXk6cixjdHJsS2V5Om8sbWV0YUtleTppLGFsdEtleTpsfT1lO2lmKCFKKHQsb18sZSkpe2lmKG4hPT0zOXx8b3x8aXx8bClpZihuIT09Mzl8fGx8fHJ8fCFvJiYhaSlpZihuIT09Mzd8fG98fGl8fGwpaWYobiE9PTM3fHxsfHxyfHwhbyYmIWkpaWYobiE9PTM4fHxvfHxpKWlmKG4hPT00MHx8b3x8aSlpZihuPT09MTMmJnIpQnM9ITAsSih0LEVjLGUpO2Vsc2UgaWYobj09PTMyKUoodCxkXyxlKTtlbHNlIGlmKFV0JiZvJiZuPT09NzkpZS5wcmV2ZW50RGVmYXVsdCgpLEJzPSEwLEoodCxqcywhMCk7ZWxzZSBpZihuIT09MTN8fHIpe3ZhciBzPVV0P2x8fGk/ITE6bj09PTh8fG49PT03MiYmbzpvfHxsfHxpPyExOm49PT04O3M/bj09PTg/Sih0LGZfLGUpOihlLnByZXZlbnREZWZhdWx0KCksSih0LGhhLCEwKSk6bj09PTI3P0oodCxoXyxlKToocz1VdD9yfHxsfHxpPyExOm49PT00Nnx8bj09PTY4JiZvOm98fGx8fGk/ITE6bj09PTQ2LHM/bj09PTQ2P0oodCxwXyxlKTooZS5wcmV2ZW50RGVmYXVsdCgpLEoodCxoYSwhMSkpOm49PT04JiYoVXQ/bDpvKT8oZS5wcmV2ZW50RGVmYXVsdCgpLEoodCxwYSwhMCkpOm49PT00NiYmKFV0P2w6byk/KGUucHJldmVudERlZmF1bHQoKSxKKHQscGEsITEpKTpVdCYmaSYmbj09PTg/KGUucHJldmVudERlZmF1bHQoKSxKKHQsZ2EsITApKTpVdCYmaSYmbj09PTQ2PyhlLnByZXZlbnREZWZhdWx0KCksSih0LGdhLCExKSk6bj09PTY2JiYhbCYmKFV0P2k6byk/KGUucHJldmVudERlZmF1bHQoKSxKKHQsdm8sImJvbGQiKSk6bj09PTg1JiYhbCYmKFV0P2k6byk/KGUucHJldmVudERlZmF1bHQoKSxKKHQsdm8sInVuZGVybGluZSIpKTpuPT09NzMmJiFsJiYoVXQ/aTpvKT8oZS5wcmV2ZW50RGVmYXVsdCgpLEoodCx2bywiaXRhbGljIikpOm4hPT05fHxsfHxvfHxpP249PT05MCYmIXImJihVdD9pOm8pPyhlLnByZXZlbnREZWZhdWx0KCksSih0LEtnLHZvaWQgMCkpOihzPVV0P249PT05MCYmaSYmcjpuPT09ODkmJm98fG49PT05MCYmbyYmcixzPyhlLnByZXZlbnREZWZhdWx0KCksSih0LEdnLHZvaWQgMCkpOlZsKHQuX2VkaXRvclN0YXRlLl9zZWxlY3Rpb24pPyhzPXI/ITE6bj09PTY3P1V0P2k6bzohMSxzPyhlLnByZXZlbnREZWZhdWx0KCksSih0LFlnLGUpKToocz1yPyExOm49PT04OD9VdD9pOm86ITEscz8oZS5wcmV2ZW50RGVmYXVsdCgpLEoodCxYZyxlKSk6bj09PTY1JiYoVXQ/aTpvKSYmKGUucHJldmVudERlZmF1bHQoKSxKKHQsUWgsZSkpKSk6IVBvJiZuPT09NjUmJihVdD9pOm8pJiYoZS5wcmV2ZW50RGVmYXVsdCgpLEoodCxRaCxlKSkpOkoodCxnXyxlKSl9ZWxzZSBCcz0hMSxKKHQsRWMsZSk7ZWxzZSBKKHQsY18sZSk7ZWxzZSBKKHQsdV8sZSk7ZWxzZSBKKHQsYV8sZSk7ZWxzZSBKKHQsc18sZSk7ZWxzZSBKKHQsbF8sZSk7ZWxzZSBKKHQsaV8sZSk7KG98fHJ8fGx8fGkpJiZKKHQsU18sZSl9fX1mdW5jdGlvbiBRXyhlKXtsZXQgdD1lLl9fbGV4aWNhbEV2ZW50SGFuZGxlcztyZXR1cm4gdD09PXZvaWQgMCYmKHQ9W10sZS5fX2xleGljYWxFdmVudEhhbmRsZXM9dCksdH1sZXQgZ2w9bmV3IE1hcDtmdW5jdGlvbiBKXyhlKXtlPWUudGFyZ2V0O2xldCB0PSRyKGU9PW51bGw/bnVsbDplLm5vZGVUeXBlPT09OT9lLmRlZmF1bHRWaWV3OmUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldyk7aWYodCE9PW51bGwpe3ZhciBuPXRtKHQuYW5jaG9yTm9kZSk7aWYobiE9PW51bGwpe3VwJiYodXA9ITEsYm4obiwoKT0+e3ZhciBsPUhsKCkscz10LmFuY2hvck5vZGU7cyE9PW51bGwmJihzPXMubm9kZVR5cGUscz09PTF8fHM9PT0zKSYmKGw9YW0obCx0LG4pLHhyKGwpKX0pKSxlPW5tKG4pLGU9ZVtlLmxlbmd0aC0xXTt2YXIgcj1lLl9rZXksbz1nbC5nZXQociksaT1vfHxlO2khPT1uJiZSeSh0LGksITEpLFJ5KHQsbiwhMCksbiE9PWU/Z2wuc2V0KHIsbik6byYmZ2wuZGVsZXRlKHIpfX19ZnVuY3Rpb24gQzIoZSx0KXtGcz09PTAmJmUub3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLEpfKSxGcysrLGUuX19sZXhpY2FsRWRpdG9yPXQ7bGV0IG49UV8oZSk7Zm9yKGxldCByPTA7cjxzcC5sZW5ndGg7cisrKXtsZXRbbyxpXT1zcFtyXSxsPXR5cGVvZiBpPT0iZnVuY3Rpb24iP3M9PntzLl9sZXhpY2FsSGFuZGxlZCE9PSEwJiYocy5fbGV4aWNhbEhhbmRsZWQ9ITAsdC5pc0VkaXRhYmxlKCkmJmkocyx0KSl9OnM9PntpZihzLl9sZXhpY2FsSGFuZGxlZCE9PSEwJiYocy5fbGV4aWNhbEhhbmRsZWQ9ITAsdC5pc0VkaXRhYmxlKCkpKXN3aXRjaChvKXtjYXNlImN1dCI6cmV0dXJuIEoodCxYZyxzKTtjYXNlImNvcHkiOnJldHVybiBKKHQsWWcscyk7Y2FzZSJwYXN0ZSI6cmV0dXJuIEoodCxIZyxzKTtjYXNlImRyYWdzdGFydCI6cmV0dXJuIEoodCx2XyxzKTtjYXNlImRyYWdvdmVyIjpyZXR1cm4gSih0LHlfLHMpO2Nhc2UiZHJhZ2VuZCI6cmV0dXJuIEoodCx4XyxzKTtjYXNlImZvY3VzIjpyZXR1cm4gSih0LHdfLHMpO2Nhc2UiYmx1ciI6cmV0dXJuIEoodCxfXyxzKTtjYXNlImRyb3AiOnJldHVybiBKKHQsbV8scyl9fTtlLmFkZEV2ZW50TGlzdGVuZXIobyxsKSxuLnB1c2goKCk9PntlLnJlbW92ZUV2ZW50TGlzdGVuZXIobyxsKX0pfX1mdW5jdGlvbiBkcChlLHQsbil7ZW4oKTt2YXIgcj1lLl9fa2V5O2xldCBvPWUuZ2V0UGFyZW50KCk7aWYobyE9PW51bGwpe3ZhciBpPUtlKCk7aWYoaGUoaSkmJlcoZSkpe3ZhcnthbmNob3I6bCxmb2N1czpzfT1pLGE9bC5nZXROb2RlKCksdT1zLmdldE5vZGUoKTtOYyhhLGUpJiZsLnNldChlLl9fa2V5LDAsImVsZW1lbnQiKSxOYyh1LGUpJiZzLnNldChlLl9fa2V5LDAsImVsZW1lbnQiKX1pZihhPWksdT0hMSxoZShhKSYmdCl7aT1hLmFuY2hvcjtsZXQgYz1hLmZvY3VzO2kua2V5PT09ciYmKEFjKGksZSxvLGUuZ2V0UHJldmlvdXNTaWJsaW5nKCksZS5nZXROZXh0U2libGluZygpKSx1PSEwKSxjLmtleT09PXImJihBYyhjLGUsbyxlLmdldFByZXZpb3VzU2libGluZygpLGUuZ2V0TmV4dFNpYmxpbmcoKSksdT0hMCl9ZWxzZSBWbChhKSYmdCYmZS5pc1NlbGVjdGVkKCkmJmUuc2VsZWN0UHJldmlvdXMoKTtoZShhKSYmdCYmIXU/KHI9ZS5nZXRJbmRleFdpdGhpblBhcmVudCgpLHNpKGUpLE9jKGEsbyxyLC0xKSk6c2koZSksbnx8ZXIobyl8fG8uY2FuQmVFbXB0eSgpfHwhby5pc0VtcHR5KCl8fGRwKG8sdCksdCYmbm4obykmJm8uaXNFbXB0eSgpJiZvLnNlbGVjdEVuZCgpfX1jbGFzcyB6YXtzdGF0aWMgZ2V0VHlwZSgpe0soNjQsdGhpcy5uYW1lKX1zdGF0aWMgY2xvbmUoKXtLKDY1LHRoaXMubmFtZSl9Y29uc3RydWN0b3IodCl7dGhpcy5fX3R5cGU9dGhpcy5jb25zdHJ1Y3Rvci5nZXRUeXBlKCksdGhpcy5fX25leHQ9dGhpcy5fX3ByZXY9dGhpcy5fX3BhcmVudD1udWxsLE5fKHRoaXMsdCl9Z2V0VHlwZSgpe3JldHVybiB0aGlzLl9fdHlwZX1pc0F0dGFjaGVkKCl7Zm9yKHZhciB0PXRoaXMuX19rZXk7dCE9PW51bGw7KXtpZih0PT09InJvb3QiKXJldHVybiEwO2lmKHQ9a3QodCksdD09PW51bGwpYnJlYWs7dD10Ll9fcGFyZW50fXJldHVybiExfWlzU2VsZWN0ZWQodCl7aWYodD10fHxLZSgpLHQ9PW51bGwpcmV0dXJuITE7bGV0IG49dC5nZXROb2RlcygpLnNvbWUocj0+ci5fX2tleT09PXRoaXMuX19rZXkpO3JldHVybiBaKHRoaXMpP246aGUodCkmJnQuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCImJnQuZm9jdXMudHlwZT09PSJlbGVtZW50IiYmdC5hbmNob3Iua2V5PT09dC5mb2N1cy5rZXkmJnQuYW5jaG9yLm9mZnNldD09PXQuZm9jdXMub2Zmc2V0PyExOm59Z2V0S2V5KCl7cmV0dXJuIHRoaXMuX19rZXl9Z2V0SW5kZXhXaXRoaW5QYXJlbnQoKXt2YXIgdD10aGlzLmdldFBhcmVudCgpO2lmKHQ9PT1udWxsKXJldHVybi0xO3Q9dC5nZXRGaXJzdENoaWxkKCk7bGV0IG49MDtmb3IoO3QhPT1udWxsOyl7aWYodGhpcy5pcyh0KSlyZXR1cm4gbjtuKyssdD10LmdldE5leHRTaWJsaW5nKCl9cmV0dXJuLTF9Z2V0UGFyZW50KCl7bGV0IHQ9dGhpcy5nZXRMYXRlc3QoKS5fX3BhcmVudDtyZXR1cm4gdD09PW51bGw/bnVsbDprdCh0KX1nZXRQYXJlbnRPclRocm93KCl7bGV0IHQ9dGhpcy5nZXRQYXJlbnQoKTtyZXR1cm4gdD09PW51bGwmJksoNjYsdGhpcy5fX2tleSksdH1nZXRUb3BMZXZlbEVsZW1lbnQoKXtsZXQgdD10aGlzO2Zvcig7dCE9PW51bGw7KXtsZXQgbj10LmdldFBhcmVudCgpO2lmKGVyKG4pKXJldHVybiB0O3Q9bn1yZXR1cm4gbnVsbH1nZXRUb3BMZXZlbEVsZW1lbnRPclRocm93KCl7bGV0IHQ9dGhpcy5nZXRUb3BMZXZlbEVsZW1lbnQoKTtyZXR1cm4gdD09PW51bGwmJksoNjcsdGhpcy5fX2tleSksdH1nZXRQYXJlbnRzKCl7bGV0IHQ9W10sbj10aGlzLmdldFBhcmVudCgpO2Zvcig7biE9PW51bGw7KXQucHVzaChuKSxuPW4uZ2V0UGFyZW50KCk7cmV0dXJuIHR9Z2V0UGFyZW50S2V5cygpe2xldCB0PVtdLG49dGhpcy5nZXRQYXJlbnQoKTtmb3IoO24hPT1udWxsOyl0LnB1c2gobi5fX2tleSksbj1uLmdldFBhcmVudCgpO3JldHVybiB0fWdldFByZXZpb3VzU2libGluZygpe2xldCB0PXRoaXMuZ2V0TGF0ZXN0KCkuX19wcmV2O3JldHVybiB0PT09bnVsbD9udWxsOmt0KHQpfWdldFByZXZpb3VzU2libGluZ3MoKXtsZXQgdD1bXTt2YXIgbj10aGlzLmdldFBhcmVudCgpO2lmKG49PT1udWxsKXJldHVybiB0O2ZvcihuPW4uZ2V0Rmlyc3RDaGlsZCgpO24hPT1udWxsJiYhbi5pcyh0aGlzKTspdC5wdXNoKG4pLG49bi5nZXROZXh0U2libGluZygpO3JldHVybiB0fWdldE5leHRTaWJsaW5nKCl7bGV0IHQ9dGhpcy5nZXRMYXRlc3QoKS5fX25leHQ7cmV0dXJuIHQ9PT1udWxsP251bGw6a3QodCl9Z2V0TmV4dFNpYmxpbmdzKCl7bGV0IHQ9W10sbj10aGlzLmdldE5leHRTaWJsaW5nKCk7Zm9yKDtuIT09bnVsbDspdC5wdXNoKG4pLG49bi5nZXROZXh0U2libGluZygpO3JldHVybiB0fWdldENvbW1vbkFuY2VzdG9yKHQpe2xldCBuPXRoaXMuZ2V0UGFyZW50cygpO3ZhciByPXQuZ2V0UGFyZW50cygpO1codGhpcykmJm4udW5zaGlmdCh0aGlzKSxXKHQpJiZyLnVuc2hpZnQodCksdD1uLmxlbmd0aDt2YXIgbz1yLmxlbmd0aDtpZih0PT09MHx8bz09PTB8fG5bdC0xXSE9PXJbby0xXSlyZXR1cm4gbnVsbDtmb3Iocj1uZXcgU2V0KHIpLG89MDtvPHQ7bysrKXtsZXQgaT1uW29dO2lmKHIuaGFzKGkpKXJldHVybiBpfXJldHVybiBudWxsfWlzKHQpe3JldHVybiB0PT1udWxsPyExOnRoaXMuX19rZXk9PT10Ll9fa2V5fWlzQmVmb3JlKHQpe2lmKHRoaXM9PT10KXJldHVybiExO2lmKHQuaXNQYXJlbnRPZih0aGlzKSlyZXR1cm4hMDtpZih0aGlzLmlzUGFyZW50T2YodCkpcmV0dXJuITE7dmFyIG49dGhpcy5nZXRDb21tb25BbmNlc3Rvcih0KTtsZXQgcj10aGlzO2Zvcig7Oyl7dmFyIG89ci5nZXRQYXJlbnRPclRocm93KCk7aWYobz09PW4pe289ci5nZXRJbmRleFdpdGhpblBhcmVudCgpO2JyZWFrfXI9b31mb3Iocj10Ozspe2lmKHQ9ci5nZXRQYXJlbnRPclRocm93KCksdD09PW4pe249ci5nZXRJbmRleFdpdGhpblBhcmVudCgpO2JyZWFrfXI9dH1yZXR1cm4gbzxufWlzUGFyZW50T2YodCl7bGV0IG49dGhpcy5fX2tleTtpZihuPT09dC5fX2tleSlyZXR1cm4hMTtmb3IoO3QhPT1udWxsOyl7aWYodC5fX2tleT09PW4pcmV0dXJuITA7dD10LmdldFBhcmVudCgpfXJldHVybiExfWdldE5vZGVzQmV0d2Vlbih0KXtsZXQgbj10aGlzLmlzQmVmb3JlKHQpLHI9W10sbz1uZXcgU2V0O2Zvcih2YXIgaT10aGlzOzspe3ZhciBsPWkuX19rZXk7aWYoby5oYXMobCl8fChvLmFkZChsKSxyLnB1c2goaSkpLGk9PT10KWJyZWFrO2lmKGw9VyhpKT9uP2kuZ2V0Rmlyc3RDaGlsZCgpOmkuZ2V0TGFzdENoaWxkKCk6bnVsbCxsIT09bnVsbClpPWw7ZWxzZSBpZihsPW4/aS5nZXROZXh0U2libGluZygpOmkuZ2V0UHJldmlvdXNTaWJsaW5nKCksbCE9PW51bGwpaT1sO2Vsc2V7aWYoaT1pLmdldFBhcmVudE9yVGhyb3coKSxvLmhhcyhpLl9fa2V5KXx8ci5wdXNoKGkpLGk9PT10KWJyZWFrO2w9aTtkbyBsPT09bnVsbCYmSyg2OCksaT1uP2wuZ2V0TmV4dFNpYmxpbmcoKTpsLmdldFByZXZpb3VzU2libGluZygpLGw9bC5nZXRQYXJlbnQoKSxsIT09bnVsbCYmKGkhPT1udWxsfHxvLmhhcyhsLl9fa2V5KXx8ci5wdXNoKGwpKTt3aGlsZShpPT09bnVsbCl9fXJldHVybiBufHxyLnJldmVyc2UoKSxyfWlzRGlydHkoKXtsZXQgdD10dCgpLl9kaXJ0eUxlYXZlcztyZXR1cm4gdCE9PW51bGwmJnQuaGFzKHRoaXMuX19rZXkpfWdldExhdGVzdCgpe2xldCB0PWt0KHRoaXMuX19rZXkpO3JldHVybiB0PT09bnVsbCYmSygxMTMpLHR9Z2V0V3JpdGFibGUoKXtlbigpO3ZhciB0PWtyKCksbj10dCgpO3Q9dC5fbm9kZU1hcDtsZXQgcj10aGlzLl9fa2V5LG89dGhpcy5nZXRMYXRlc3QoKSxpPW8uX19wYXJlbnQ7bj1uLl9jbG9uZU5vdE5lZWRlZDt2YXIgbD1LZSgpO3JldHVybiBsIT09bnVsbCYmKGwuX2NhY2hlZE5vZGVzPW51bGwpLG4uaGFzKHIpPyhrYyhvKSxvKToobD1vLmNvbnN0cnVjdG9yLmNsb25lKG8pLGwuX19wYXJlbnQ9aSxsLl9fbmV4dD1vLl9fbmV4dCxsLl9fcHJldj1vLl9fcHJldixXKG8pJiZXKGwpPyhsLl9fZmlyc3Q9by5fX2ZpcnN0LGwuX19sYXN0PW8uX19sYXN0LGwuX19zaXplPW8uX19zaXplLGwuX19pbmRlbnQ9by5fX2luZGVudCxsLl9fZm9ybWF0PW8uX19mb3JtYXQsbC5fX2Rpcj1vLl9fZGlyKTpaKG8pJiZaKGwpJiYobC5fX2Zvcm1hdD1vLl9fZm9ybWF0LGwuX19zdHlsZT1vLl9fc3R5bGUsbC5fX21vZGU9by5fX21vZGUsbC5fX2RldGFpbD1vLl9fZGV0YWlsKSxuLmFkZChyKSxsLl9fa2V5PXIsa2MobCksdC5zZXQocixsKSxsKX1nZXRUZXh0Q29udGVudCgpe3JldHVybiIifWdldFRleHRDb250ZW50U2l6ZSgpe3JldHVybiB0aGlzLmdldFRleHRDb250ZW50KCkubGVuZ3RofWNyZWF0ZURPTSgpe0soNzApfXVwZGF0ZURPTSgpe0soNzEpfWV4cG9ydERPTSh0KXtyZXR1cm57ZWxlbWVudDp0aGlzLmNyZWF0ZURPTSh0Ll9jb25maWcsdCl9fWV4cG9ydEpTT04oKXtLKDcyKX1zdGF0aWMgaW1wb3J0SlNPTigpe0soMTgsdGhpcy5uYW1lKX1zdGF0aWMgdHJhbnNmb3JtKCl7cmV0dXJuIG51bGx9cmVtb3ZlKHQpe2RwKHRoaXMsITAsdCl9cmVwbGFjZSh0LG4pe2VuKCk7dmFyIHI9S2UoKTtyIT09bnVsbCYmKHI9ci5jbG9uZSgpKSx5Zih0aGlzLHQpO2xldCBvPXRoaXMuZ2V0TGF0ZXN0KCksaT10aGlzLl9fa2V5LGw9dC5fX2tleSxzPXQuZ2V0V3JpdGFibGUoKTt0PXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLmdldFdyaXRhYmxlKCk7bGV0IGE9dC5fX3NpemU7c2kocyk7bGV0IHU9by5nZXRQcmV2aW91c1NpYmxpbmcoKSxjPW8uZ2V0TmV4dFNpYmxpbmcoKSxkPW8uX19wcmV2LGY9by5fX25leHQsaD1vLl9fcGFyZW50O3JldHVybiBkcChvLCExLCEwKSx1PT09bnVsbD90Ll9fZmlyc3Q9bDp1LmdldFdyaXRhYmxlKCkuX19uZXh0PWwscy5fX3ByZXY9ZCxjPT09bnVsbD90Ll9fbGFzdD1sOmMuZ2V0V3JpdGFibGUoKS5fX3ByZXY9bCxzLl9fbmV4dD1mLHMuX19wYXJlbnQ9aCx0Ll9fc2l6ZT1hLG4mJnRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKG09PntzLmFwcGVuZChtKX0pLGhlKHIpJiYoeHIociksbj1yLmFuY2hvcixyPXIuZm9jdXMsbi5rZXk9PT1pJiZBeShuLHMpLHIua2V5PT09aSYmQXkocixzKSkseW8oKT09PWkmJkx0KGwpLHN9aW5zZXJ0QWZ0ZXIodCxuPSEwKXtlbigpLHlmKHRoaXMsdCk7dmFyIHI9dGhpcy5nZXRXcml0YWJsZSgpO2xldCBvPXQuZ2V0V3JpdGFibGUoKTt2YXIgaT1vLmdldFBhcmVudCgpO2xldCBsPUtlKCk7dmFyIHM9ITEsYT0hMTtpZihpIT09bnVsbCl7dmFyIHU9dC5nZXRJbmRleFdpdGhpblBhcmVudCgpO3NpKG8pLGhlKGwpJiYoYT1pLl9fa2V5LHM9bC5hbmNob3IsaT1sLmZvY3VzLHM9cy50eXBlPT09ImVsZW1lbnQiJiZzLmtleT09PWEmJnMub2Zmc2V0PT09dSsxLGE9aS50eXBlPT09ImVsZW1lbnQiJiZpLmtleT09PWEmJmkub2Zmc2V0PT09dSsxKX1pPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKSx1PXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLmdldFdyaXRhYmxlKCk7bGV0IGM9by5fX2tleSxkPXIuX19uZXh0O3JldHVybiBpPT09bnVsbD91Ll9fbGFzdD1jOmkuZ2V0V3JpdGFibGUoKS5fX3ByZXY9Yyx1Ll9fc2l6ZSsrLHIuX19uZXh0PWMsby5fX25leHQ9ZCxvLl9fcHJldj1yLl9fa2V5LG8uX19wYXJlbnQ9ci5fX3BhcmVudCxuJiZoZShsKSYmKG49dGhpcy5nZXRJbmRleFdpdGhpblBhcmVudCgpLE9jKGwsdSxuKzEpLHI9dS5fX2tleSxzJiZsLmFuY2hvci5zZXQocixuKzIsImVsZW1lbnQiKSxhJiZsLmZvY3VzLnNldChyLG4rMiwiZWxlbWVudCIpKSx0fWluc2VydEJlZm9yZSh0LG49ITApe2VuKCkseWYodGhpcyx0KTt2YXIgcj10aGlzLmdldFdyaXRhYmxlKCk7bGV0IG89dC5nZXRXcml0YWJsZSgpLGk9by5fX2tleTtzaShvKTtsZXQgbD10aGlzLmdldFByZXZpb3VzU2libGluZygpLHM9dGhpcy5nZXRQYXJlbnRPclRocm93KCkuZ2V0V3JpdGFibGUoKSxhPXIuX19wcmV2LHU9dGhpcy5nZXRJbmRleFdpdGhpblBhcmVudCgpO3JldHVybiBsPT09bnVsbD9zLl9fZmlyc3Q9aTpsLmdldFdyaXRhYmxlKCkuX19uZXh0PWkscy5fX3NpemUrKyxyLl9fcHJldj1pLG8uX19wcmV2PWEsby5fX25leHQ9ci5fX2tleSxvLl9fcGFyZW50PXIuX19wYXJlbnQscj1LZSgpLG4mJmhlKHIpJiYobj10aGlzLmdldFBhcmVudE9yVGhyb3coKSxPYyhyLG4sdSkpLHR9aXNQYXJlbnRSZXF1aXJlZCgpe3JldHVybiExfWNyZWF0ZVBhcmVudEVsZW1lbnROb2RlKCl7cmV0dXJuIHZpKCl9c2VsZWN0UHJldmlvdXModCxuKXtlbigpO2xldCByPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCksbz10aGlzLmdldFBhcmVudE9yVGhyb3coKTtyZXR1cm4gcj09PW51bGw/by5zZWxlY3QoMCwwKTpXKHIpP3Iuc2VsZWN0KCk6WihyKT9yLnNlbGVjdCh0LG4pOih0PXIuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxLG8uc2VsZWN0KHQsdCkpfXNlbGVjdE5leHQodCxuKXtlbigpO2xldCByPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKSxvPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpO3JldHVybiByPT09bnVsbD9vLnNlbGVjdCgpOlcocik/ci5zZWxlY3QoMCwwKTpaKHIpP3Iuc2VsZWN0KHQsbik6KHQ9ci5nZXRJbmRleFdpdGhpblBhcmVudCgpLG8uc2VsZWN0KHQsdCkpfW1hcmtEaXJ0eSgpe3RoaXMuZ2V0V3JpdGFibGUoKX19Y2xhc3MgV2wgZXh0ZW5kcyB6YXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJsaW5lYnJlYWsifXN0YXRpYyBjbG9uZSh0KXtyZXR1cm4gbmV3IFdsKHQuX19rZXkpfWNvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWdldFRleHRDb250ZW50KCl7cmV0dXJuYApgfWNyZWF0ZURPTSgpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpfXVwZGF0ZURPTSgpe3JldHVybiExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57YnI6dD0+e2xldCBuPXQucGFyZW50RWxlbWVudCxyLG87cmV0dXJuIG4hPT1udWxsJiYoKHI9bi5maXJzdENoaWxkKT09PXR8fHIubmV4dFNpYmxpbmc9PT10JiZyLm5vZGVUeXBlPT09MyYmKHIudGV4dENvbnRlbnR8fCIiKS5tYXRjaCgvXiggfFx0fFxyP1xuKSskLykhPT1udWxsKSYmKChvPW4ubGFzdENoaWxkKT09PXR8fG8ucHJldmlvdXNTaWJsaW5nPT09dCYmby5ub2RlVHlwZT09PTMmJihvLnRleHRDb250ZW50fHwiIikubWF0Y2goL14oIHxcdHxccj9cbikrJC8pIT09bnVsbCk/bnVsbDp7Y29udmVyc2lvbjokMixwcmlvcml0eTowfX19fXN0YXRpYyBpbXBvcnRKU09OKCl7cmV0dXJuIE5sKCl9ZXhwb3J0SlNPTigpe3JldHVybnt0eXBlOiJsaW5lYnJlYWsiLHZlcnNpb246MX19fWZ1bmN0aW9uICQyKCl7cmV0dXJue25vZGU6TmwoKX19ZnVuY3Rpb24gTmwoKXtyZXR1cm4gamEobmV3IFdsKX1mdW5jdGlvbiB4YShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFdsfWZ1bmN0aW9uIF9mKGUsdCl7cmV0dXJuIHQmMTY/ImNvZGUiOnQmMTI4PyJtYXJrIjp0JjMyPyJzdWIiOnQmNjQ/InN1cCI6bnVsbH1mdW5jdGlvbiBTZihlLHQpe3JldHVybiB0JjE/InN0cm9uZyI6dCYyPyJlbSI6InNwYW4ifWZ1bmN0aW9uIEVmKGUsdCxuLHIsbyl7ZT1yLmNsYXNzTGlzdCxyPXpzKG8sImJhc2UiKSxyIT09dm9pZCAwJiZlLmFkZCguLi5yKSxyPXpzKG8sInVuZGVybGluZVN0cmlrZXRocm91Z2giKTtsZXQgaT0hMSxsPXQmOCYmdCY0O3ZhciBzPW4mOCYmbiY0O3IhPT12b2lkIDAmJihzPyhpPSEwLGx8fGUuYWRkKC4uLnIpKTpsJiZlLnJlbW92ZSguLi5yKSk7Zm9yKGxldCBhIGluIGxpKXM9bGlbYV0scj16cyhvLGEpLHIhPT12b2lkIDAmJihuJnM/IWl8fGEhPT0idW5kZXJsaW5lIiYmYSE9PSJzdHJpa2V0aHJvdWdoIj8oISh0JnMpfHxsJiZhPT09InVuZGVybGluZSJ8fGE9PT0ic3RyaWtldGhyb3VnaCIpJiZlLmFkZCguLi5yKTp0JnMmJmUucmVtb3ZlKC4uLnIpOnQmcyYmZS5yZW1vdmUoLi4ucikpfWZ1bmN0aW9uIENmKGUsdCxuKXtsZXQgcj10LmZpcnN0Q2hpbGQ7aWYobj1uLmlzQ29tcG9zaW5nKCksZSs9bj9oZDoiIixyPT1udWxsKXQudGV4dENvbnRlbnQ9ZTtlbHNlIGlmKHQ9ci5ub2RlVmFsdWUsdCE9PWUpaWYobnx8UG8pe249dC5sZW5ndGg7bGV0IG89ZS5sZW5ndGgsaT0wLGw9MDtmb3IoO2k8biYmaTxvJiZ0W2ldPT09ZVtpXTspaSsrO2Zvcig7bCtpPG4mJmwraTxvJiZ0W24tbC0xXT09PWVbby1sLTFdOylsKys7ZT1baSxuLWktbCxlLnNsaWNlKGksby1sKV07bGV0W3MsYSx1XT1lO2EhPT0wJiZyLmRlbGV0ZURhdGEocyxhKSxyLmluc2VydERhdGEocyx1KX1lbHNlIHIubm9kZVZhbHVlPWV9ZnVuY3Rpb24gZ3UoZSx0KXtyZXR1cm4gdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHQpLHQuYXBwZW5kQ2hpbGQoZSksdH1jbGFzcyBOaSBleHRlbmRzIHphe3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInRleHQifXN0YXRpYyBjbG9uZSh0KXtyZXR1cm4gbmV3IE5pKHQuX190ZXh0LHQuX19rZXkpfWNvbnN0cnVjdG9yKHQsbil7c3VwZXIobiksdGhpcy5fX3RleHQ9dCx0aGlzLl9fZm9ybWF0PTAsdGhpcy5fX3N0eWxlPSIiLHRoaXMuX19kZXRhaWw9dGhpcy5fX21vZGU9MH1nZXRGb3JtYXQoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2Zvcm1hdH1nZXREZXRhaWwoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2RldGFpbH1nZXRNb2RlKCl7bGV0IHQ9dGhpcy5nZXRMYXRlc3QoKTtyZXR1cm4gczJbdC5fX21vZGVdfWdldFN0eWxlKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19zdHlsZX1pc1Rva2VuKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19tb2RlPT09MX1pc0NvbXBvc2luZygpe3JldHVybiB0aGlzLl9fa2V5PT09eW8oKX1pc1NlZ21lbnRlZCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fbW9kZT09PTJ9aXNEaXJlY3Rpb25sZXNzKCl7cmV0dXJuKHRoaXMuZ2V0TGF0ZXN0KCkuX19kZXRhaWwmMSkhPT0wfWlzVW5tZXJnZWFibGUoKXtyZXR1cm4odGhpcy5nZXRMYXRlc3QoKS5fX2RldGFpbCYyKSE9PTB9aGFzRm9ybWF0KHQpe3JldHVybiB0PWxpW3RdLCh0aGlzLmdldEZvcm1hdCgpJnQpIT09MH1pc1NpbXBsZVRleHQoKXtyZXR1cm4gdGhpcy5fX3R5cGU9PT0idGV4dCImJnRoaXMuX19tb2RlPT09MH1nZXRUZXh0Q29udGVudCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdGV4dH1nZXRGb3JtYXRGbGFncyh0LG4pe2xldCByPXRoaXMuZ2V0TGF0ZXN0KCkuX19mb3JtYXQ7cmV0dXJuIFRfKHIsdCxuKX1jcmVhdGVET00odCl7dmFyIG49dGhpcy5fX2Zvcm1hdCxyPV9mKHRoaXMsbik7bGV0IG89U2YodGhpcyxuKSxpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocj09PW51bGw/bzpyKSxsPWk7cmV0dXJuIHRoaXMuaGFzRm9ybWF0KCJjb2RlIikmJmkuc2V0QXR0cmlidXRlKCJzcGVsbGNoZWNrIiwiZmFsc2UiKSxyIT09bnVsbCYmKGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChvKSxpLmFwcGVuZENoaWxkKGwpKSxyPWwsQ2YodGhpcy5fX3RleHQscix0aGlzKSx0PXQudGhlbWUudGV4dCx0IT09dm9pZCAwJiZFZihvLDAsbixyLHQpLG49dGhpcy5fX3N0eWxlLG4hPT0iIiYmKGkuc3R5bGUuY3NzVGV4dD1uKSxpfXVwZGF0ZURPTSh0LG4scil7bGV0IG89dGhpcy5fX3RleHQ7dmFyIGk9dC5fX2Zvcm1hdCxsPXRoaXMuX19mb3JtYXQscz1fZih0aGlzLGkpO2xldCBhPV9mKHRoaXMsbCk7dmFyIHU9U2YodGhpcyxpKTtsZXQgYz1TZih0aGlzLGwpO3JldHVybihzPT09bnVsbD91OnMpIT09KGE9PT1udWxsP2M6YSk/ITA6cz09PWEmJnUhPT1jPyhpPW4uZmlyc3RDaGlsZCxpPT1udWxsJiZLKDQ4KSx0PXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjKSxDZihvLHQsdGhpcykscj1yLnRoZW1lLnRleHQsciE9PXZvaWQgMCYmRWYoYywwLGwsdCxyKSxuLnJlcGxhY2VDaGlsZChzLGkpLCExKToodT1uLGEhPT1udWxsJiZzIT09bnVsbCYmKHU9bi5maXJzdENoaWxkLHU9PW51bGwmJksoNDkpKSxDZihvLHUsdGhpcykscj1yLnRoZW1lLnRleHQsciE9PXZvaWQgMCYmaSE9PWwmJkVmKGMsaSxsLHUsciksbD10aGlzLl9fc3R5bGUsdC5fX3N0eWxlIT09bCYmKG4uc3R5bGUuY3NzVGV4dD1sKSwhMSl9c3RhdGljIGltcG9ydERPTSgpe3JldHVybnsiI3RleHQiOigpPT4oe2NvbnZlcnNpb246YjIscHJpb3JpdHk6MH0pLGI6KCk9Pih7Y29udmVyc2lvbjpUMixwcmlvcml0eTowfSksY29kZTooKT0+KHtjb252ZXJzaW9uOmlvLHByaW9yaXR5OjB9KSxlbTooKT0+KHtjb252ZXJzaW9uOmlvLHByaW9yaXR5OjB9KSxpOigpPT4oe2NvbnZlcnNpb246aW8scHJpb3JpdHk6MH0pLHM6KCk9Pih7Y29udmVyc2lvbjppbyxwcmlvcml0eTowfSksc3BhbjooKT0+KHtjb252ZXJzaW9uOmsyLHByaW9yaXR5OjB9KSxzdHJvbmc6KCk9Pih7Y29udmVyc2lvbjppbyxwcmlvcml0eTowfSksc3ViOigpPT4oe2NvbnZlcnNpb246aW8scHJpb3JpdHk6MH0pLHN1cDooKT0+KHtjb252ZXJzaW9uOmlvLHByaW9yaXR5OjB9KSx1OigpPT4oe2NvbnZlcnNpb246aW8scHJpb3JpdHk6MH0pfX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgbj1DdCh0LnRleHQpO3JldHVybiBuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXREZXRhaWwodC5kZXRhaWwpLG4uc2V0TW9kZSh0Lm1vZGUpLG4uc2V0U3R5bGUodC5zdHlsZSksbn1leHBvcnRET00odCl7cmV0dXJue2VsZW1lbnQ6dH09c3VwZXIuZXhwb3J0RE9NKHQpLHQhPT1udWxsJiZtZCh0KXx8SygxMzIpLHQuc3R5bGUud2hpdGVTcGFjZT0icHJlLXdyYXAiLHRoaXMuaGFzRm9ybWF0KCJib2xkIikmJih0PWd1KHQsImIiKSksdGhpcy5oYXNGb3JtYXQoIml0YWxpYyIpJiYodD1ndSh0LCJpIikpLHRoaXMuaGFzRm9ybWF0KCJzdHJpa2V0aHJvdWdoIikmJih0PWd1KHQsInMiKSksdGhpcy5oYXNGb3JtYXQoInVuZGVybGluZSIpJiYodD1ndSh0LCJ1IikpLHtlbGVtZW50OnR9fWV4cG9ydEpTT04oKXtyZXR1cm57ZGV0YWlsOnRoaXMuZ2V0RGV0YWlsKCksZm9ybWF0OnRoaXMuZ2V0Rm9ybWF0KCksbW9kZTp0aGlzLmdldE1vZGUoKSxzdHlsZTp0aGlzLmdldFN0eWxlKCksdGV4dDp0aGlzLmdldFRleHRDb250ZW50KCksdHlwZToidGV4dCIsdmVyc2lvbjoxfX1zZWxlY3Rpb25UcmFuc2Zvcm0oKXt9c2V0Rm9ybWF0KHQpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gbi5fX2Zvcm1hdD10eXBlb2YgdD09InN0cmluZyI/bGlbdF06dCxufXNldERldGFpbCh0KXtsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX19kZXRhaWw9dHlwZW9mIHQ9PSJzdHJpbmciP28yW3RdOnQsbn1zZXRTdHlsZSh0KXtsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX19zdHlsZT10LG59dG9nZ2xlRm9ybWF0KHQpe3JldHVybiB0PWxpW3RdLHRoaXMuc2V0Rm9ybWF0KHRoaXMuZ2V0Rm9ybWF0KCledCl9dG9nZ2xlRGlyZWN0aW9ubGVzcygpe2xldCB0PXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gdC5fX2RldGFpbF49MSx0fXRvZ2dsZVVubWVyZ2VhYmxlKCl7bGV0IHQ9dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiB0Ll9fZGV0YWlsXj0yLHR9c2V0TW9kZSh0KXtpZih0PWwyW3RdLHRoaXMuX19tb2RlPT09dClyZXR1cm4gdGhpcztsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX19tb2RlPXQsbn1zZXRUZXh0Q29udGVudCh0KXtpZih0aGlzLl9fdGV4dD09PXQpcmV0dXJuIHRoaXM7bGV0IG49dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiBuLl9fdGV4dD10LG59c2VsZWN0KHQsbil7ZW4oKTtsZXQgcj1LZSgpO3ZhciBvPXRoaXMuZ2V0VGV4dENvbnRlbnQoKTtsZXQgaT10aGlzLl9fa2V5O2lmKHR5cGVvZiBvPT0ic3RyaW5nIj8obz1vLmxlbmd0aCx0PT09dm9pZCAwJiYodD1vKSxuPT09dm9pZCAwJiYobj1vKSk6bj10PTAsaGUocikpbz15bygpLG8hPT1yLmFuY2hvci5rZXkmJm8hPT1yLmZvY3VzLmtleXx8THQoaSksci5zZXRUZXh0Tm9kZVJhbmdlKHRoaXMsdCx0aGlzLG4pO2Vsc2UgcmV0dXJuIGVTKGksdCxpLG4sInRleHQiLCJ0ZXh0Iik7cmV0dXJuIHJ9c3BsaWNlVGV4dCh0LG4scixvKXtsZXQgaT10aGlzLmdldFdyaXRhYmxlKCksbD1pLl9fdGV4dCxzPXIubGVuZ3RoLGE9dDswPmEmJihhPXMrYSwwPmEmJihhPTApKTtsZXQgdT1LZSgpO3JldHVybiBvJiZoZSh1KSYmKHQrPXMsdS5zZXRUZXh0Tm9kZVJhbmdlKGksdCxpLHQpKSxuPWwuc2xpY2UoMCxhKStyK2wuc2xpY2UoYStuKSxpLl9fdGV4dD1uLGl9Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiEwfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiEwfXNwbGl0VGV4dCguLi50KXtlbigpO3ZhciBuPXRoaXMuZ2V0TGF0ZXN0KCkscj1uLmdldFRleHRDb250ZW50KCksbz1uLl9fa2V5LGk9eW8oKSxsPW5ldyBTZXQodCk7dD1bXTtmb3IodmFyIHM9ci5sZW5ndGgsYT0iIix1PTA7dTxzO3UrKylhIT09IiImJmwuaGFzKHUpJiYodC5wdXNoKGEpLGE9IiIpLGErPXJbdV07aWYoYSE9PSIiJiZ0LnB1c2goYSksbD10Lmxlbmd0aCxsPT09MClyZXR1cm5bXTtpZih0WzBdPT09cilyZXR1cm5bbl07dmFyIGM9dFswXTtyPW4uZ2V0UGFyZW50T3JUaHJvdygpLHU9bi5nZXRGb3JtYXQoKTtsZXQgZD1uLmdldFN0eWxlKCksZj1uLl9fZGV0YWlsO3M9ITEsbi5pc1NlZ21lbnRlZCgpPyhhPUN0KGMpLGEuX19mb3JtYXQ9dSxhLl9fc3R5bGU9ZCxhLl9fZGV0YWlsPWYscz0hMCk6KGE9bi5nZXRXcml0YWJsZSgpLGEuX190ZXh0PWMpLG49S2UoKSxhPVthXSxjPWMubGVuZ3RoO2ZvcihsZXQgZz0xO2c8bDtnKyspe3ZhciBoPXRbZ10sbT1oLmxlbmd0aDtoPUN0KGgpLmdldFdyaXRhYmxlKCksaC5fX2Zvcm1hdD11LGguX19zdHlsZT1kLGguX19kZXRhaWw9ZjtsZXQgUz1oLl9fa2V5O2lmKG09YyttLGhlKG4pKXtsZXQgdj1uLmFuY2hvcix5PW4uZm9jdXM7di5rZXk9PT1vJiZ2LnR5cGU9PT0idGV4dCImJnYub2Zmc2V0PmMmJnYub2Zmc2V0PD1tJiYodi5rZXk9Uyx2Lm9mZnNldC09YyxuLmRpcnR5PSEwKSx5LmtleT09PW8mJnkudHlwZT09PSJ0ZXh0IiYmeS5vZmZzZXQ+YyYmeS5vZmZzZXQ8PW0mJih5LmtleT1TLHkub2Zmc2V0LT1jLG4uZGlydHk9ITApfWk9PT1vJiZMdChTKSxjPW0sYS5wdXNoKGgpfXJldHVybiBvPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCksaT10aGlzLmdldE5leHRTaWJsaW5nKCksbyE9PW51bGwmJmtjKG8pLGkhPT1udWxsJiZrYyhpKSxvPXIuZ2V0V3JpdGFibGUoKSxpPXRoaXMuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxzPyhvLnNwbGljZShpLDAsYSksdGhpcy5yZW1vdmUoKSk6by5zcGxpY2UoaSwxLGEpLGhlKG4pJiZPYyhuLHIsaSxsLTEpLGF9bWVyZ2VXaXRoU2libGluZyh0KXt2YXIgbj10PT09dGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKTtufHx0PT09dGhpcy5nZXROZXh0U2libGluZygpfHxLKDUwKTt2YXIgcj10aGlzLl9fa2V5O2xldCBvPXQuX19rZXksaT10aGlzLl9fdGV4dCxsPWkubGVuZ3RoO3lvKCk9PT1vJiZMdChyKTtsZXQgcz1LZSgpO2lmKGhlKHMpKXtsZXQgYT1zLmFuY2hvcix1PXMuZm9jdXM7YSE9PW51bGwmJmEua2V5PT09byYmKEZ5KGEsbixyLHQsbCkscy5kaXJ0eT0hMCksdSE9PW51bGwmJnUua2V5PT09byYmKEZ5KHUsbixyLHQsbCkscy5kaXJ0eT0hMCl9cmV0dXJuIHI9dC5fX3RleHQsdGhpcy5zZXRUZXh0Q29udGVudChuP3IraTppK3IpLG49dGhpcy5nZXRXcml0YWJsZSgpLHQucmVtb3ZlKCksbn1pc1RleHRFbnRpdHkoKXtyZXR1cm4hMX19ZnVuY3Rpb24gazIoZSl7bGV0IHQ9ZS5zdHlsZS5mb250V2VpZ2h0PT09IjcwMCIsbj1lLnN0eWxlLnRleHREZWNvcmF0aW9uPT09ImxpbmUtdGhyb3VnaCIscj1lLnN0eWxlLmZvbnRTdHlsZT09PSJpdGFsaWMiLG89ZS5zdHlsZS50ZXh0RGVjb3JhdGlvbj09PSJ1bmRlcmxpbmUiLGk9ZS5zdHlsZS52ZXJ0aWNhbEFsaWduO3JldHVybntmb3JDaGlsZDpsPT4oWihsKSYmKHQmJmwudG9nZ2xlRm9ybWF0KCJib2xkIiksbiYmbC50b2dnbGVGb3JtYXQoInN0cmlrZXRocm91Z2giKSxyJiZsLnRvZ2dsZUZvcm1hdCgiaXRhbGljIiksbyYmbC50b2dnbGVGb3JtYXQoInVuZGVybGluZSIpLGk9PT0ic3ViIiYmbC50b2dnbGVGb3JtYXQoInN1YnNjcmlwdCIpLGk9PT0ic3VwZXIiJiZsLnRvZ2dsZUZvcm1hdCgic3VwZXJzY3JpcHQiKSksbCksbm9kZTpudWxsfX1mdW5jdGlvbiBUMihlKXtsZXQgdD1lLnN0eWxlLmZvbnRXZWlnaHQ9PT0ibm9ybWFsIjtyZXR1cm57Zm9yQ2hpbGQ6bj0+KFoobikmJiF0JiZuLnRvZ2dsZUZvcm1hdCgiYm9sZCIpLG4pLG5vZGU6bnVsbH19bGV0IFB5PW5ldyBXZWFrTWFwO2Z1bmN0aW9uIGIyKGUpe2UucGFyZW50RWxlbWVudD09PW51bGwmJksoMTI5KTtmb3IodmFyIHQ9ZS50ZXh0Q29udGVudHx8IiIsbixyPWUucGFyZW50Tm9kZSxvPVtlXTtyIT09bnVsbCYmKG49UHkuZ2V0KHIpKT09PXZvaWQgMCYmIShyLm5vZGVOYW1lPT09IlBSRSJ8fHIubm9kZVR5cGU9PT0xJiZyLnN0eWxlLndoaXRlU3BhY2Uuc3RhcnRzV2l0aCgicHJlIikpOylvLnB1c2gocikscj1yLnBhcmVudE5vZGU7Zm9yKG49bj09PXZvaWQgMD9yOm4scj0wO3I8by5sZW5ndGg7cisrKVB5LnNldChvW3JdLG4pO2lmKG4hPT1udWxsKXtmb3IodD10LnNwbGl0KC8oXHI/XG58XHQpLyksZT1bXSxvPXQubGVuZ3RoLG49MDtuPG87bisrKXI9dFtuXSxyPT09YApgfHxyPT09YFxyCmA/ZS5wdXNoKE5sKCkpOnI9PT0iCSI/ZS5wdXNoKHlkKCkpOnIhPT0iIiYmZS5wdXNoKEN0KHIpKTtyZXR1cm57bm9kZTplfX1pZih0PXQucmVwbGFjZSgvXHIvZywiIikucmVwbGFjZSgvWyBcdFxuXSsvZywiICIpLHQ9PT0iIilyZXR1cm57bm9kZTpudWxsfTtpZih0WzBdPT09IiAiKXtmb3Iobz1lLG49ITA7byE9PW51bGwmJihvPU95KG8sITEpKSE9PW51bGw7KWlmKHI9by50ZXh0Q29udGVudHx8IiIsMDxyLmxlbmd0aCl7L1sgXHRcbl0kLy50ZXN0KHIpJiYodD10LnNsaWNlKDEpKSxuPSExO2JyZWFrfW4mJih0PXQuc2xpY2UoMSkpfWlmKHRbdC5sZW5ndGgtMV09PT0iICIpe2ZvcihvPSEwO2UhPT1udWxsJiYoZT1PeShlLCEwKSkhPT1udWxsOylpZigwPChlLnRleHRDb250ZW50fHwiIikucmVwbGFjZSgvXiggfFx0fFxyP1xuKSsvLCIiKS5sZW5ndGgpe289ITE7YnJlYWt9byYmKHQ9dC5zbGljZSgwLHQubGVuZ3RoLTEpKX1yZXR1cm4gdD09PSIiP3tub2RlOm51bGx9Ontub2RlOkN0KHQpfX1sZXQgTjI9bmV3IFJlZ0V4cCgvXihhfGFiYnJ8YWNyb255bXxifGNpdGV8Y29kZXxkZWx8ZW18aXxpbnN8a2JkfGxhYmVsfG91dHB1dHxxfHJ1Ynl8c3xzYW1wfHNwYW58c3Ryb25nfHN1YnxzdXB8dGltZXx1fHR0fHZhcikkLywiaSIpO2Z1bmN0aW9uIE95KGUsdCl7Zm9yKDs7KXtmb3IodmFyIG49dm9pZCAwOyhuPXQ/ZS5uZXh0U2libGluZzplLnByZXZpb3VzU2libGluZyk9PT1udWxsOylpZihlPWUucGFyZW50RWxlbWVudCxlPT09bnVsbClyZXR1cm4gbnVsbDtpZihlPW4sZS5ub2RlVHlwZT09PTEmJihuPWUuc3R5bGUuZGlzcGxheSxuPT09IiImJmUubm9kZU5hbWUubWF0Y2goTjIpPT09bnVsbHx8biE9PSIiJiYhbi5zdGFydHNXaXRoKCJpbmxpbmUiKSkpcmV0dXJuIG51bGw7Zm9yKDsobj10P2UuZmlyc3RDaGlsZDplLmxhc3RDaGlsZCkhPT1udWxsOyllPW47aWYoZS5ub2RlVHlwZT09PTMpcmV0dXJuIGU7aWYoZS5ub2RlTmFtZT09PSJCUiIpcmV0dXJuIG51bGx9fWxldCBSMj17Y29kZToiY29kZSIsZW06Iml0YWxpYyIsaToiaXRhbGljIixzOiJzdHJpa2V0aHJvdWdoIixzdHJvbmc6ImJvbGQiLHN1Yjoic3Vic2NyaXB0IixzdXA6InN1cGVyc2NyaXB0Iix1OiJ1bmRlcmxpbmUifTtmdW5jdGlvbiBpbyhlKXtsZXQgdD1SMltlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO3JldHVybiB0PT09dm9pZCAwP3tub2RlOm51bGx9Ontmb3JDaGlsZDpuPT4oWihuKSYmIW4uaGFzRm9ybWF0KHQpJiZuLnRvZ2dsZUZvcm1hdCh0KSxuKSxub2RlOm51bGx9fWZ1bmN0aW9uIEN0KGU9IiIpe3JldHVybiBqYShuZXcgTmkoZSkpfWZ1bmN0aW9uIFooZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBOaX1jbGFzcyBVbCBleHRlbmRzIE5pe3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInRhYiJ9c3RhdGljIGNsb25lKHQpe2xldCBuPW5ldyBVbCh0Ll9fa2V5KTtyZXR1cm4gbi5fX3RleHQ9dC5fX3RleHQsbi5fX2Zvcm1hdD10Ll9fZm9ybWF0LG4uX19zdHlsZT10Ll9fc3R5bGUsbn1jb25zdHJ1Y3Rvcih0KXtzdXBlcigiCSIsdCksdGhpcy5fX2RldGFpbD0yfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm4gbnVsbH1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgbj15ZCgpO3JldHVybiBuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXRTdHlsZSh0LnN0eWxlKSxufWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLHR5cGU6InRhYiIsdmVyc2lvbjoxfX1zZXRUZXh0Q29udGVudCgpe0soMTI2KX1zZXREZXRhaWwoKXtLKDEyNyl9c2V0TW9kZSgpe0soMTI4KX1jYW5JbnNlcnRUZXh0QmVmb3JlKCl7cmV0dXJuITF9Y2FuSW5zZXJ0VGV4dEFmdGVyKCl7cmV0dXJuITF9fWZ1bmN0aW9uIHlkKCl7cmV0dXJuIGphKG5ldyBVbCl9Y2xhc3Mgd3J7Y29uc3RydWN0b3IodCxuLHIpe3RoaXMuX3NlbGVjdGlvbj1udWxsLHRoaXMua2V5PXQsdGhpcy5vZmZzZXQ9bix0aGlzLnR5cGU9cn1pcyh0KXtyZXR1cm4gdGhpcy5rZXk9PT10LmtleSYmdGhpcy5vZmZzZXQ9PT10Lm9mZnNldCYmdGhpcy50eXBlPT09dC50eXBlfWlzQmVmb3JlKHQpe2xldCBuPXRoaXMuZ2V0Tm9kZSgpLHI9dC5nZXROb2RlKCksbz10aGlzLm9mZnNldDtpZih0PXQub2Zmc2V0LFcobikpe3ZhciBpPW4uZ2V0RGVzY2VuZGFudEJ5SW5kZXgobyk7bj1pPz9ufXJldHVybiBXKHIpJiYoaT1yLmdldERlc2NlbmRhbnRCeUluZGV4KHQpLHI9aT8/ciksbj09PXI/bzx0Om4uaXNCZWZvcmUocil9Z2V0Tm9kZSgpe2xldCB0PWt0KHRoaXMua2V5KTtyZXR1cm4gdD09PW51bGwmJksoMjApLHR9c2V0KHQsbixyKXtsZXQgbz10aGlzLl9zZWxlY3Rpb24saT10aGlzLmtleTt0aGlzLmtleT10LHRoaXMub2Zmc2V0PW4sdGhpcy50eXBlPXIsS2woKXx8KHlvKCk9PT1pJiZMdCh0KSxvIT09bnVsbCYmKG8uX2NhY2hlZE5vZGVzPW51bGwsby5kaXJ0eT0hMCkpfX1mdW5jdGlvbiAkZihlLHQpe2xldCBuPXQuX19rZXkscj1lLm9mZnNldCxvPSJlbGVtZW50IjtpZihaKHQpKW89InRleHQiLHQ9dC5nZXRUZXh0Q29udGVudFNpemUoKSxyPnQmJihyPXQpO2Vsc2UgaWYoIVcodCkpe3ZhciBpPXQuZ2V0TmV4dFNpYmxpbmcoKTtaKGkpPyhuPWkuX19rZXkscj0wLG89InRleHQiKTooaT10LmdldFBhcmVudCgpKSYmKG49aS5fX2tleSxyPXQuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxKX1lLnNldChuLHIsbyl9ZnVuY3Rpb24gQXkoZSx0KXtpZihXKHQpKXtsZXQgbj10LmdldExhc3REZXNjZW5kYW50KCk7VyhuKXx8WihuKT8kZihlLG4pOiRmKGUsdCl9ZWxzZSAkZihlLHQpfWZ1bmN0aW9uIE15KGUsdCxuLHIpe2xldCBvPWUuZ2V0Tm9kZSgpLGk9by5nZXRDaGlsZEF0SW5kZXgoZS5vZmZzZXQpLGw9Q3QoKSxzPW5uKG8pP3ZpKCkuYXBwZW5kKGwpOmw7bC5zZXRGb3JtYXQobiksbC5zZXRTdHlsZShyKSxpPT09bnVsbD9vLmFwcGVuZChzKTooaS5pbnNlcnRCZWZvcmUocyksdC50eXBlPT09ImVsZW1lbnQiJiZ0LmtleT09PWUua2V5JiZ0Lm9mZnNldCE9PWUub2Zmc2V0JiZ0LnNldCh0LmtleSx0Lm9mZnNldCsxLCJlbGVtZW50IikpLGUuaXModCkmJnQuc2V0KGwuX19rZXksMCwidGV4dCIpLGUuc2V0KGwuX19rZXksMCwidGV4dCIpfWZ1bmN0aW9uIGNvKGUsdCxuLHIpe2Uua2V5PXQsZS5vZmZzZXQ9bixlLnR5cGU9cn1jbGFzcyB4ZHtjb25zdHJ1Y3Rvcih0KXt0aGlzLmRpcnR5PSExLHRoaXMuX25vZGVzPXQsdGhpcy5fY2FjaGVkTm9kZXM9bnVsbH1pcyh0KXtpZighVmwodCkpcmV0dXJuITE7bGV0IG49dGhpcy5fbm9kZXMscj10Ll9ub2RlcztyZXR1cm4gbi5zaXplPT09ci5zaXplJiZBcnJheS5mcm9tKG4pLmV2ZXJ5KG89PnIuaGFzKG8pKX1hZGQodCl7dGhpcy5kaXJ0eT0hMCx0aGlzLl9ub2Rlcy5hZGQodCksdGhpcy5fY2FjaGVkTm9kZXM9bnVsbH1kZWxldGUodCl7dGhpcy5kaXJ0eT0hMCx0aGlzLl9ub2Rlcy5kZWxldGUodCksdGhpcy5fY2FjaGVkTm9kZXM9bnVsbH1jbGVhcigpe3RoaXMuZGlydHk9ITAsdGhpcy5fbm9kZXMuY2xlYXIoKSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsfWhhcyh0KXtyZXR1cm4gdGhpcy5fbm9kZXMuaGFzKHQpfWNsb25lKCl7cmV0dXJuIG5ldyB4ZChuZXcgU2V0KHRoaXMuX25vZGVzKSl9ZXh0cmFjdCgpe3JldHVybiB0aGlzLmdldE5vZGVzKCl9aW5zZXJ0UmF3VGV4dCgpe31pbnNlcnRUZXh0KCl7fWluc2VydE5vZGVzKHQsbil7bGV0IHI9dGhpcy5nZXROb2RlcygpLG89ci5sZW5ndGg7dmFyIGk9cltvLTFdO2lmKFooaSkpaT1pLnNlbGVjdCgpO2Vsc2V7bGV0IGw9aS5nZXRJbmRleFdpdGhpblBhcmVudCgpKzE7aT1pLmdldFBhcmVudE9yVGhyb3coKS5zZWxlY3QobCxsKX1mb3IoaS5pbnNlcnROb2Rlcyh0LG4pLHQ9MDt0PG87dCsrKXJbdF0ucmVtb3ZlKCk7cmV0dXJuITB9Z2V0Tm9kZXMoKXt2YXIgdD10aGlzLl9jYWNoZWROb2RlcztpZih0IT09bnVsbClyZXR1cm4gdDt2YXIgbj10aGlzLl9ub2Rlczt0PVtdO2ZvcihsZXQgciBvZiBuKW49a3QociksbiE9PW51bGwmJnQucHVzaChuKTtyZXR1cm4gS2woKXx8KHRoaXMuX2NhY2hlZE5vZGVzPXQpLHR9Z2V0VGV4dENvbnRlbnQoKXtsZXQgdD10aGlzLmdldE5vZGVzKCksbj0iIjtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyluKz10W3JdLmdldFRleHRDb250ZW50KCk7cmV0dXJuIG59fWZ1bmN0aW9uIGhlKGUpe3JldHVybiBlIGluc3RhbmNlb2YgUml9ZnVuY3Rpb24gZnAoZSl7bGV0W3QsLG5dPW5TKGUpO2U9bi5nZXRDaGlsZHJlbigpO2xldCByPWUubGVuZ3RoO3ZhciBvPWVbMF0uZ2V0Q2hpbGRyZW4oKS5sZW5ndGg7bGV0IGk9QXJyYXkocik7Zm9yKHZhciBsPTA7bDxyO2wrKylpW2xdPUFycmF5KG8pO2ZvcihvPTA7bzxyO28rKyl7bD1lW29dLmdldENoaWxkcmVuKCk7bGV0IHM9MDtmb3IobGV0IGE9MDthPGwubGVuZ3RoO2ErKyl7Zm9yKDtpW29dW3NdOylzKys7bGV0IHU9bFthXSxjPXUuX19yb3dTcGFufHwxLGQ9dS5fX2NvbFNwYW58fDE7Zm9yKGxldCBmPTA7ZjxjO2YrKylmb3IobGV0IGg9MDtoPGQ7aCsrKWlbbytmXVtzK2hdPXU7aWYodD09PXUpcmV0dXJue2NvbFNwYW46ZCxjb2x1bW5JbmRleDpzLHJvd0luZGV4Om8scm93U3BhbjpjfTtzKz1kfX1yZXR1cm4gbnVsbH1jbGFzcyB3ZHtjb25zdHJ1Y3Rvcih0LG4scil7dGhpcy5ncmlkS2V5PXQsdGhpcy5hbmNob3I9bix0aGlzLmZvY3VzPXIsdGhpcy5kaXJ0eT0hMSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsLG4uX3NlbGVjdGlvbj10aGlzLHIuX3NlbGVjdGlvbj10aGlzfWlzKHQpe3JldHVybiBzbSh0KT90aGlzLmdyaWRLZXk9PT10LmdyaWRLZXkmJnRoaXMuYW5jaG9yLmlzKHQuYW5jaG9yKSYmdGhpcy5mb2N1cy5pcyh0LmZvY3VzKTohMX1zZXQodCxuLHIpe3RoaXMuZGlydHk9ITAsdGhpcy5ncmlkS2V5PXQsdGhpcy5hbmNob3Iua2V5PW4sdGhpcy5mb2N1cy5rZXk9cix0aGlzLl9jYWNoZWROb2Rlcz1udWxsfWNsb25lKCl7cmV0dXJuIG5ldyB3ZCh0aGlzLmdyaWRLZXksdGhpcy5hbmNob3IsdGhpcy5mb2N1cyl9aXNDb2xsYXBzZWQoKXtyZXR1cm4hMX1pc0JhY2t3YXJkKCl7cmV0dXJuIHRoaXMuZm9jdXMuaXNCZWZvcmUodGhpcy5hbmNob3IpfWdldENoYXJhY3Rlck9mZnNldHMoKXtyZXR1cm4gVXUodGhpcyl9ZXh0cmFjdCgpe3JldHVybiB0aGlzLmdldE5vZGVzKCl9aW5zZXJ0UmF3VGV4dCgpe31pbnNlcnRUZXh0KCl7fWluc2VydE5vZGVzKHQsbil7bGV0IHI9dGhpcy5mb2N1cy5nZXROb2RlKCk7cmV0dXJuIHFnKHIuc2VsZWN0KDAsci5nZXRDaGlsZHJlblNpemUoKSkpLmluc2VydE5vZGVzKHQsbil9Z2V0U2hhcGUoKXt2YXIgdD1rdCh0aGlzLmFuY2hvci5rZXkpO2lmKERuKHQpfHxLKDEwMyksdD1mcCh0KSx0PT09bnVsbCl0aHJvdyBFcnJvcigiZ2V0Q2VsbFJlY3Q6IGV4cGVjdGVkIHRvIGZpbmQgQW5jaG9yTm9kZSIpO3ZhciBuPWt0KHRoaXMuZm9jdXMua2V5KTtEbihuKXx8SygxMDQpO2xldCByPWZwKG4pO2lmKHI9PT1udWxsKXRocm93IEVycm9yKCJnZXRDZWxsUmVjdDogZXhwZWN0ZWQgdG8gZmluZCBmb2N1c0NlbGxOb2RlIik7bj1NYXRoLm1pbih0LmNvbHVtbkluZGV4LHIuY29sdW1uSW5kZXgpO2xldCBvPU1hdGgubWF4KHQuY29sdW1uSW5kZXgsci5jb2x1bW5JbmRleCksaT1NYXRoLm1pbih0LnJvd0luZGV4LHIucm93SW5kZXgpO3JldHVybiB0PU1hdGgubWF4KHQucm93SW5kZXgsci5yb3dJbmRleCkse2Zyb21YOk1hdGgubWluKG4sbyksZnJvbVk6TWF0aC5taW4oaSx0KSx0b1g6TWF0aC5tYXgobixvKSx0b1k6TWF0aC5tYXgoaSx0KX19Z2V0Tm9kZXMoKXtmdW5jdGlvbiB0KFMpe2xldHtjZWxsOnYsc3RhcnRDb2x1bW46eSxzdGFydFJvdzp4fT1TO2E9TWF0aC5taW4oYSx5KSx1PU1hdGgubWluKHUseCksYz1NYXRoLm1heChjLHkrdi5fX2NvbFNwYW4tMSksZD1NYXRoLm1heChkLHgrdi5fX3Jvd1NwYW4tMSl9dmFyIG49dGhpcy5fY2FjaGVkTm9kZXM7aWYobiE9PW51bGwpcmV0dXJuIG47dmFyIHI9dGhpcy5hbmNob3IuZ2V0Tm9kZSgpO249dGhpcy5mb2N1cy5nZXROb2RlKCkscj1SYyhyLERuKTt2YXIgbz1SYyhuLERuKTtEbihyKXx8SygxMDMpLERuKG8pfHxLKDEwNCksbj1yLmdldFBhcmVudCgpLF9hKG4pfHxLKDEwNSksbj1uLmdldFBhcmVudCgpLGZtKG4pfHxLKDEwNik7bGV0W2ksbCxzXT10UyhuLHIsbyksYT1NYXRoLm1pbihsLnN0YXJ0Q29sdW1uLHMuc3RhcnRDb2x1bW4pLHU9TWF0aC5taW4obC5zdGFydFJvdyxzLnN0YXJ0Um93KSxjPU1hdGgubWF4KGwuc3RhcnRDb2x1bW4rbC5jZWxsLl9fY29sU3Bhbi0xLHMuc3RhcnRDb2x1bW4rcy5jZWxsLl9fY29sU3Bhbi0xKSxkPU1hdGgubWF4KGwuc3RhcnRSb3crbC5jZWxsLl9fcm93U3Bhbi0xLHMuc3RhcnRSb3crcy5jZWxsLl9fcm93U3Bhbi0xKTtyPWEsbz11O2Zvcih2YXIgZj1hLGg9dTthPHJ8fHU8b3x8Yz5mfHxkPmg7KXtpZihhPHIpe3ZhciBtPWgtbzstLXI7Zm9yKHZhciBnPTA7Zzw9bTtnKyspdChpW28rZ11bcl0pfWlmKHU8bylmb3IobT1mLXIsLS1vLGc9MDtnPD1tO2crKyl0KGlbb11bcitnXSk7aWYoYz5mKWZvcihtPWgtbyxmKz0xLGc9MDtnPD1tO2crKyl0KGlbbytnXVtmXSk7aWYoZD5oKWZvcihtPWYtcixoKz0xLGc9MDtnPD1tO2crKyl0KGlbaF1bcitnXSl9Zm9yKG49W25dLHI9bnVsbCxvPXU7bzw9ZDtvKyspZm9yKGY9YTtmPD1jO2YrKykoe2NlbGw6aH09aVtvXVtmXSksbT1oLmdldFBhcmVudCgpLF9hKG0pfHxLKDEwNyksbSE9PXImJm4ucHVzaChtKSxuLnB1c2goaCwuLi5wMihoKSkscj1tO3JldHVybiBLbCgpfHwodGhpcy5fY2FjaGVkTm9kZXM9biksbn1nZXRUZXh0Q29udGVudCgpe2xldCB0PXRoaXMuZ2V0Tm9kZXMoKSxuPSIiO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKW4rPXRbcl0uZ2V0VGV4dENvbnRlbnQoKTtyZXR1cm4gbn19ZnVuY3Rpb24gc20oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiB3ZH1jbGFzcyBSaXtjb25zdHJ1Y3Rvcih0LG4scixvKXt0aGlzLmFuY2hvcj10LHRoaXMuZm9jdXM9bix0aGlzLmRpcnR5PSExLHRoaXMuZm9ybWF0PXIsdGhpcy5zdHlsZT1vLHRoaXMuX2NhY2hlZE5vZGVzPW51bGwsdC5fc2VsZWN0aW9uPXRoaXMsbi5fc2VsZWN0aW9uPXRoaXN9aXModCl7cmV0dXJuIGhlKHQpP3RoaXMuYW5jaG9yLmlzKHQuYW5jaG9yKSYmdGhpcy5mb2N1cy5pcyh0LmZvY3VzKSYmdGhpcy5mb3JtYXQ9PT10LmZvcm1hdCYmdGhpcy5zdHlsZT09PXQuc3R5bGU6ITF9aXNCYWNrd2FyZCgpe3JldHVybiB0aGlzLmZvY3VzLmlzQmVmb3JlKHRoaXMuYW5jaG9yKX1pc0NvbGxhcHNlZCgpe3JldHVybiB0aGlzLmFuY2hvci5pcyh0aGlzLmZvY3VzKX1nZXROb2Rlcygpe3ZhciB0PXRoaXMuX2NhY2hlZE5vZGVzO2lmKHQhPT1udWxsKXJldHVybiB0O3Q9dGhpcy5hbmNob3I7dmFyIG49dGhpcy5mb2N1cyxyPXQuaXNCZWZvcmUobiksbz1yP3Q6bjtyPXI/bjp0LHQ9by5nZXROb2RlKCksbj1yLmdldE5vZGUoKTtsZXQgaT1vLm9mZnNldDtyZXR1cm4gbz1yLm9mZnNldCxXKHQpJiYocj10LmdldERlc2NlbmRhbnRCeUluZGV4KGkpLHQ9cj8/dCksVyhuKSYmKHI9bi5nZXREZXNjZW5kYW50QnlJbmRleChvKSxyIT09bnVsbCYmciE9PXQmJm4uZ2V0Q2hpbGRBdEluZGV4KG8pPT09ciYmKHI9ci5nZXRQcmV2aW91c1NpYmxpbmcoKSksbj1yPz9uKSx0PXQuaXMobik/Vyh0KSYmMDx0LmdldENoaWxkcmVuU2l6ZSgpP1tdOlt0XTp0LmdldE5vZGVzQmV0d2VlbihuKSxLbCgpfHwodGhpcy5fY2FjaGVkTm9kZXM9dCksdH1zZXRUZXh0Tm9kZVJhbmdlKHQsbixyLG8pe2NvKHRoaXMuYW5jaG9yLHQuX19rZXksbiwidGV4dCIpLGNvKHRoaXMuZm9jdXMsci5fX2tleSxvLCJ0ZXh0IiksdGhpcy5fY2FjaGVkTm9kZXM9bnVsbCx0aGlzLmRpcnR5PSEwfWdldFRleHRDb250ZW50KCl7bGV0IHQ9dGhpcy5nZXROb2RlcygpO2lmKHQubGVuZ3RoPT09MClyZXR1cm4iIjtsZXQgbj10WzBdLHI9dFt0Lmxlbmd0aC0xXSxvPXRoaXMuYW5jaG9yLGk9dGhpcy5mb2N1cyxsPW8uaXNCZWZvcmUoaSksW3MsYV09VXUodGhpcyksdT0iIixjPSEwO2ZvcihsZXQgZD0wO2Q8dC5sZW5ndGg7ZCsrKXtsZXQgZj10W2RdO2lmKFcoZikmJiFmLmlzSW5saW5lKCkpY3x8KHUrPWAKYCksYz0hZi5pc0VtcHR5KCk7ZWxzZSBpZihjPSExLFooZikpe2xldCBoPWYuZ2V0VGV4dENvbnRlbnQoKTtmPT09bj9mPT09cj8oby50eXBlIT09ImVsZW1lbnQifHxpLnR5cGUhPT0iZWxlbWVudCJ8fGkub2Zmc2V0PT09by5vZmZzZXQpJiYoaD1zPGE/aC5zbGljZShzLGEpOmguc2xpY2UoYSxzKSk6aD1sP2guc2xpY2Uocyk6aC5zbGljZShhKTpmPT09ciYmKGg9bD9oLnNsaWNlKDAsYSk6aC5zbGljZSgwLHMpKSx1Kz1ofWVsc2UhVmUoZikmJiF4YShmKXx8Zj09PXImJnRoaXMuaXNDb2xsYXBzZWQoKXx8KHUrPWYuZ2V0VGV4dENvbnRlbnQoKSl9cmV0dXJuIHV9YXBwbHlET01SYW5nZSh0KXtsZXQgbj10dCgpLHI9bi5nZXRFZGl0b3JTdGF0ZSgpLl9zZWxlY3Rpb247aWYodD1xXyh0LnN0YXJ0Q29udGFpbmVyLHQuc3RhcnRPZmZzZXQsdC5lbmRDb250YWluZXIsdC5lbmRPZmZzZXQsbixyKSx0IT09bnVsbCl7dmFyW28saV09dDtjbyh0aGlzLmFuY2hvcixvLmtleSxvLm9mZnNldCxvLnR5cGUpLGNvKHRoaXMuZm9jdXMsaS5rZXksaS5vZmZzZXQsaS50eXBlKSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsfX1jbG9uZSgpe2xldCB0PXRoaXMuYW5jaG9yLG49dGhpcy5mb2N1cztyZXR1cm4gbmV3IFJpKG5ldyB3cih0LmtleSx0Lm9mZnNldCx0LnR5cGUpLG5ldyB3cihuLmtleSxuLm9mZnNldCxuLnR5cGUpLHRoaXMuZm9ybWF0LHRoaXMuc3R5bGUpfXRvZ2dsZUZvcm1hdCh0KXt0aGlzLmZvcm1hdD1UXyh0aGlzLmZvcm1hdCx0LG51bGwpLHRoaXMuZGlydHk9ITB9c2V0U3R5bGUodCl7dGhpcy5zdHlsZT10LHRoaXMuZGlydHk9ITB9aGFzRm9ybWF0KHQpe3JldHVybih0aGlzLmZvcm1hdCZsaVt0XSkhPT0wfWluc2VydFJhd1RleHQodCl7dD10LnNwbGl0KC8oXHI/XG58XHQpLyk7bGV0IG49W10scj10Lmxlbmd0aDtmb3IobGV0IG89MDtvPHI7bysrKXtsZXQgaT10W29dO2k9PT1gCmB8fGk9PT1gXHIKYD9uLnB1c2goTmwoKSk6aT09PSIJIj9uLnB1c2goeWQoKSk6bi5wdXNoKEN0KGkpKX10aGlzLmluc2VydE5vZGVzKG4pfWluc2VydFRleHQodCl7dmFyIG49dGhpcy5hbmNob3Iscj10aGlzLmZvY3VzLG89dGhpcy5pc0NvbGxhcHNlZCgpfHxuLmlzQmVmb3JlKHIpLGk9dGhpcy5mb3JtYXQsbD10aGlzLnN0eWxlO28mJm4udHlwZT09PSJlbGVtZW50Ij9NeShuLHIsaSxsKTpvfHxyLnR5cGUhPT0iZWxlbWVudCJ8fE15KHIsbixpLGwpO3ZhciBzPXRoaXMuZ2V0Tm9kZXMoKSxhPXMubGVuZ3RoLHU9bz9yOm47cj0obz9uOnIpLm9mZnNldDt2YXIgYz11Lm9mZnNldDtuPXNbMF0sWihuKXx8SygyNiksbz1uLmdldFRleHRDb250ZW50KCkubGVuZ3RoO3ZhciBkPW4uZ2V0UGFyZW50T3JUaHJvdygpLGY9c1thLTFdO2lmKHRoaXMuaXNDb2xsYXBzZWQoKSYmcj09PW8mJihuLmlzU2VnbWVudGVkKCl8fG4uaXNUb2tlbigpfHwhbi5jYW5JbnNlcnRUZXh0QWZ0ZXIoKXx8IWQuY2FuSW5zZXJ0VGV4dEFmdGVyKCkmJm4uZ2V0TmV4dFNpYmxpbmcoKT09PW51bGwpKXt2YXIgaD1uLmdldE5leHRTaWJsaW5nKCk7aWYoWihoKSYmaC5jYW5JbnNlcnRUZXh0QmVmb3JlKCkmJiFaaChoKXx8KGg9Q3QoKSxoLnNldEZvcm1hdChpKSxkLmNhbkluc2VydFRleHRBZnRlcigpP24uaW5zZXJ0QWZ0ZXIoaCk6ZC5pbnNlcnRBZnRlcihoKSksaC5zZWxlY3QoMCwwKSxuPWgsdCE9PSIiKXt0aGlzLmluc2VydFRleHQodCk7cmV0dXJufX1lbHNlIGlmKHRoaXMuaXNDb2xsYXBzZWQoKSYmcj09PTAmJihuLmlzU2VnbWVudGVkKCl8fG4uaXNUb2tlbigpfHwhbi5jYW5JbnNlcnRUZXh0QmVmb3JlKCl8fCFkLmNhbkluc2VydFRleHRCZWZvcmUoKSYmbi5nZXRQcmV2aW91c1NpYmxpbmcoKT09PW51bGwpKXtpZihoPW4uZ2V0UHJldmlvdXNTaWJsaW5nKCksKCFaKGgpfHxaaChoKSkmJihoPUN0KCksaC5zZXRGb3JtYXQoaSksZC5jYW5JbnNlcnRUZXh0QmVmb3JlKCk/bi5pbnNlcnRCZWZvcmUoaCk6ZC5pbnNlcnRCZWZvcmUoaCkpLGguc2VsZWN0KCksbj1oLHQhPT0iIil7dGhpcy5pbnNlcnRUZXh0KHQpO3JldHVybn19ZWxzZSBpZihuLmlzU2VnbWVudGVkKCkmJnIhPT1vKWQ9Q3Qobi5nZXRUZXh0Q29udGVudCgpKSxkLnNldEZvcm1hdChpKSxuLnJlcGxhY2UoZCksbj1kO2Vsc2UgaWYoISh0aGlzLmlzQ29sbGFwc2VkKCl8fHQ9PT0iInx8KGg9Zi5nZXRQYXJlbnQoKSxkLmNhbkluc2VydFRleHRCZWZvcmUoKSYmZC5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSYmKCFXKGgpfHxoLmNhbkluc2VydFRleHRCZWZvcmUoKSYmaC5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSkpKSl7dGhpcy5pbnNlcnRUZXh0KCIiKSxaXyh0aGlzLmFuY2hvcix0aGlzLmZvY3VzLG51bGwpLHRoaXMuaW5zZXJ0VGV4dCh0KTtyZXR1cm59aWYoYT09PTEpaWYobi5pc1Rva2VuKCkpdD1DdCh0KSx0LnNlbGVjdCgpLG4ucmVwbGFjZSh0KTtlbHNle2lmKHM9bi5nZXRGb3JtYXQoKSxhPW4uZ2V0U3R5bGUoKSxyPT09YyYmKHMhPT1pfHxhIT09bCkpaWYobi5nZXRUZXh0Q29udGVudCgpPT09IiIpbi5zZXRGb3JtYXQoaSksbi5zZXRTdHlsZShsKTtlbHNle3M9Q3QodCkscy5zZXRGb3JtYXQoaSkscy5zZXRTdHlsZShsKSxzLnNlbGVjdCgpLHI9PT0wP24uaW5zZXJ0QmVmb3JlKHMsITEpOihbYV09bi5zcGxpdFRleHQociksYS5pbnNlcnRBZnRlcihzLCExKSkscy5pc0NvbXBvc2luZygpJiZ0aGlzLmFuY2hvci50eXBlPT09InRleHQiJiYodGhpcy5hbmNob3Iub2Zmc2V0LT10Lmxlbmd0aCk7cmV0dXJufW49bi5zcGxpY2VUZXh0KHIsYy1yLHQsITApLG4uZ2V0VGV4dENvbnRlbnQoKT09PSIiP24ucmVtb3ZlKCk6dGhpcy5hbmNob3IudHlwZT09PSJ0ZXh0IiYmKG4uaXNDb21wb3NpbmcoKT90aGlzLmFuY2hvci5vZmZzZXQtPXQubGVuZ3RoOih0aGlzLmZvcm1hdD1zLHRoaXMuc3R5bGU9YSkpfWVsc2V7aWYoaT1uZXcgU2V0KFsuLi5uLmdldFBhcmVudEtleXMoKSwuLi5mLmdldFBhcmVudEtleXMoKV0pLGg9VyhuKT9uOm4uZ2V0UGFyZW50T3JUaHJvdygpLGw9VyhmKT9mOmYuZ2V0UGFyZW50T3JUaHJvdygpLGQ9ZiwhaC5pcyhsKSYmbC5pc0lubGluZSgpKWRvIGQ9bCxsPWwuZ2V0UGFyZW50T3JUaHJvdygpO3doaWxlKGwuaXNJbmxpbmUoKSk7aWYodS50eXBlPT09InRleHQiJiYoYyE9PTB8fGYuZ2V0VGV4dENvbnRlbnQoKT09PSIiKXx8dS50eXBlPT09ImVsZW1lbnQiJiZmLmdldEluZGV4V2l0aGluUGFyZW50KCk8YylpZihaKGYpJiYhZi5pc1Rva2VuKCkmJmMhPT1mLmdldFRleHRDb250ZW50U2l6ZSgpKXtpZihmLmlzU2VnbWVudGVkKCkpe3ZhciBtPUN0KGYuZ2V0VGV4dENvbnRlbnQoKSk7Zi5yZXBsYWNlKG0pLGY9bX1ubih1LmdldE5vZGUoKSl8fChmPWYuc3BsaWNlVGV4dCgwLGMsIiIpKSxpLmFkZChmLl9fa2V5KX1lbHNlIHU9Zi5nZXRQYXJlbnRPclRocm93KCksdS5jYW5CZUVtcHR5KCl8fHUuZ2V0Q2hpbGRyZW5TaXplKCkhPT0xP2YucmVtb3ZlKCk6dS5yZW1vdmUoKTtlbHNlIGkuYWRkKGYuX19rZXkpO2Zvcih1PWwuZ2V0Q2hpbGRyZW4oKSxjPW5ldyBTZXQocyksZj1oLmlzKGwpLGg9aC5pc0lubGluZSgpJiZuLmdldE5leHRTaWJsaW5nKCk9PT1udWxsP2g6bixtPXUubGVuZ3RoLTE7MDw9bTttLS0pe2xldCBnPXVbbV07aWYoZy5pcyhuKXx8VyhnKSYmZy5pc1BhcmVudE9mKG4pKWJyZWFrO2cuaXNBdHRhY2hlZCgpJiYoIWMuaGFzKGcpfHxnLmlzKGQpP2Z8fGguaW5zZXJ0QWZ0ZXIoZywhMSk6Zy5yZW1vdmUoKSl9aWYoIWYpZm9yKHU9bCxjPW51bGw7dSE9PW51bGw7KWw9dS5nZXRDaGlsZHJlbigpLGY9bC5sZW5ndGgsKGY9PT0wfHxsW2YtMV0uaXMoYykpJiYoaS5kZWxldGUodS5fX2tleSksYz11KSx1PXUuZ2V0UGFyZW50KCk7Zm9yKG4uaXNUb2tlbigpP3I9PT1vP24uc2VsZWN0KCk6KHQ9Q3QodCksdC5zZWxlY3QoKSxuLnJlcGxhY2UodCkpOihuPW4uc3BsaWNlVGV4dChyLG8tcix0LCEwKSxuLmdldFRleHRDb250ZW50KCk9PT0iIj9uLnJlbW92ZSgpOm4uaXNDb21wb3NpbmcoKSYmdGhpcy5hbmNob3IudHlwZT09PSJ0ZXh0IiYmKHRoaXMuYW5jaG9yLm9mZnNldC09dC5sZW5ndGgpKSx0PTE7dDxhO3QrKyluPXNbdF0saS5oYXMobi5fX2tleSl8fG4ucmVtb3ZlKCl9fXJlbW92ZVRleHQoKXt0aGlzLmluc2VydFRleHQoIiIpfWZvcm1hdFRleHQodCl7aWYodGhpcy5pc0NvbGxhcHNlZCgpKXRoaXMudG9nZ2xlRm9ybWF0KHQpLEx0KG51bGwpO2Vsc2V7dmFyIG49dGhpcy5nZXROb2RlcygpLHI9W107Zm9yKHZhciBvIG9mIG4pWihvKSYmci5wdXNoKG8pO3ZhciBpPXIubGVuZ3RoO2lmKGk9PT0wKXRoaXMudG9nZ2xlRm9ybWF0KHQpLEx0KG51bGwpO2Vsc2V7bz10aGlzLmFuY2hvcjt2YXIgbD10aGlzLmZvY3VzLHM9dGhpcy5pc0JhY2t3YXJkKCk7bj1zP2w6byxvPXM/bzpsO3ZhciBhPTAsdT1yWzBdO2lmKGw9bi50eXBlPT09ImVsZW1lbnQiPzA6bi5vZmZzZXQsbi50eXBlPT09InRleHQiJiZsPT09dS5nZXRUZXh0Q29udGVudFNpemUoKSYmKGE9MSx1PXJbMV0sbD0wKSx1IT1udWxsKXtzPXUuZ2V0Rm9ybWF0RmxhZ3ModCxudWxsKTt2YXIgYz1pLTEsZD1yW2NdO2lmKGk9by50eXBlPT09InRleHQiP28ub2Zmc2V0OmQuZ2V0VGV4dENvbnRlbnRTaXplKCksdS5pcyhkKSlsIT09aSYmKGw9PT0wJiZpPT09dS5nZXRUZXh0Q29udGVudFNpemUoKT91LnNldEZvcm1hdChzKToodD11LnNwbGl0VGV4dChsLGkpLHQ9bD09PTA/dFswXTp0WzFdLHQuc2V0Rm9ybWF0KHMpLG4udHlwZT09PSJ0ZXh0IiYmbi5zZXQodC5fX2tleSwwLCJ0ZXh0Iiksby50eXBlPT09InRleHQiJiZvLnNldCh0Ll9fa2V5LGktbCwidGV4dCIpKSx0aGlzLmZvcm1hdD1zKTtlbHNle2whPT0wJiYoWyx1XT11LnNwbGl0VGV4dChsKSxsPTApLHUuc2V0Rm9ybWF0KHMpO3ZhciBmPWQuZ2V0Rm9ybWF0RmxhZ3ModCxzKTtmb3IoMDxpJiYoaSE9PWQuZ2V0VGV4dENvbnRlbnRTaXplKCkmJihbZF09ZC5zcGxpdFRleHQoaSkpLGQuc2V0Rm9ybWF0KGYpKSxhKz0xO2E8YzthKyspe2xldCBoPXJbYV07aWYoIWguaXNUb2tlbigpKXtsZXQgbT1oLmdldEZvcm1hdEZsYWdzKHQsZik7aC5zZXRGb3JtYXQobSl9fW4udHlwZT09PSJ0ZXh0IiYmbi5zZXQodS5fX2tleSxsLCJ0ZXh0Iiksby50eXBlPT09InRleHQiJiZvLnNldChkLl9fa2V5LGksInRleHQiKSx0aGlzLmZvcm1hdD1zfGZ9fX19fWluc2VydE5vZGVzKHQsbil7aWYoIXRoaXMuaXNDb2xsYXBzZWQoKSl7dmFyIHI9dGhpcy5pc0JhY2t3YXJkKCk/dGhpcy5hbmNob3I6dGhpcy5mb2N1cyxvPXIuZ2V0Tm9kZSgpLmdldE5leHRTaWJsaW5nKCk7aWYobz1vP28uZ2V0S2V5KCk6bnVsbCxyPShyPXIuZ2V0Tm9kZSgpLmdldFByZXZpb3VzU2libGluZygpKT9yLmdldEtleSgpOm51bGwsdGhpcy5yZW1vdmVUZXh0KCksdGhpcy5pc0NvbGxhcHNlZCgpJiZ0aGlzLmZvY3VzLnR5cGU9PT0iZWxlbWVudCIpe2lmKHRoaXMuZm9jdXMua2V5PT09byYmdGhpcy5mb2N1cy5vZmZzZXQ9PT0wKXt2YXIgaT1DdCgpO3RoaXMuZm9jdXMuZ2V0Tm9kZSgpLmluc2VydEJlZm9yZShpKX1lbHNlIHRoaXMuZm9jdXMua2V5PT09ciYmdGhpcy5mb2N1cy5vZmZzZXQ9PT10aGlzLmZvY3VzLmdldE5vZGUoKS5nZXRDaGlsZHJlblNpemUoKSYmKGk9Q3QoKSx0aGlzLmZvY3VzLmdldE5vZGUoKS5pbnNlcnRBZnRlcihpKSk7aSYmKHRoaXMuZm9jdXMuc2V0KGkuX19rZXksMCwidGV4dCIpLHRoaXMuYW5jaG9yLnNldChpLl9fa2V5LDAsInRleHQiKSl9fWk9dGhpcy5hbmNob3Iscj1pLm9mZnNldDt2YXIgbD1pLmdldE5vZGUoKTtvPWwsaS50eXBlPT09ImVsZW1lbnQiJiYoaT1pLmdldE5vZGUoKSxvPWkuZ2V0Q2hpbGRBdEluZGV4KHItMSksbz1vPT09bnVsbD9pOm8pLGk9W107dmFyIHM9bC5nZXROZXh0U2libGluZ3MoKSxhPWVyKGwpP251bGw6bC5nZXRUb3BMZXZlbEVsZW1lbnRPclRocm93KCk7aWYoWihsKSlpZihvPWwuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgscj09PTAmJm8hPT0wKW89bC5nZXRQcmV2aW91c1NpYmxpbmcoKSxvPW8hPT1udWxsP286bC5nZXRQYXJlbnRPclRocm93KCksaS5wdXNoKGwpO2Vsc2UgaWYocj09PW8pbz1sO2Vsc2V7aWYobC5pc1Rva2VuKCkpcmV0dXJuITE7W28sbF09bC5zcGxpdFRleHQociksaS5wdXNoKGwpfWw9byxpLnB1c2goLi4ucykscz10WzBdO3ZhciB1PSExLGM9bnVsbDtmb3IobGV0IG09MDttPHQubGVuZ3RoO20rKyl7dmFyIGQ9dFttXTtpZihlcihvKXx8VmUobyl8fCFXKGQpfHxkLmlzSW5saW5lKCkpdSYmIVcoZCkmJiFWZShkKSYmZXIoby5nZXRQYXJlbnQoKSkmJksoMjgpO2Vsc2V7aWYoZC5pcyhzKSl7aWYoVyhvKSYmby5pc0VtcHR5KCkmJm8uY2FuUmVwbGFjZVdpdGgoZCkpe28ucmVwbGFjZShkKSxvPWQsdT0hMDtjb250aW51ZX1pZih1PWQuZ2V0Rmlyc3REZXNjZW5kYW50KCksYl8odSkpe2Zvcih2YXIgZj11LmdldFBhcmVudE9yVGhyb3coKTtmLmlzSW5saW5lKCk7KWY9Zi5nZXRQYXJlbnRPclRocm93KCk7aWYoYz1mLmdldENoaWxkcmVuKCksdT1jLmxlbmd0aCxXKG8pKXt2YXIgaD1vLmdldEZpcnN0Q2hpbGQoKTtmb3IobGV0IGc9MDtnPHU7ZysrKXtsZXQgUz1jW2ddO2g9PT1udWxsP28uYXBwZW5kKFMpOmguaW5zZXJ0QWZ0ZXIoUyksaD1TfX1lbHNle2ZvcihoPXUtMTswPD1oO2gtLSlvLmluc2VydEFmdGVyKGNbaF0pO289by5nZXRQYXJlbnRPclRocm93KCl9aWYoYz1jW3UtMV0sZi5yZW1vdmUoKSx1PSEwLGYuaXMoZCkpY29udGludWV9fVoobykmJihhPT09bnVsbCYmSygyNyksbz1hKX11PSExLFcobykmJiFvLmlzSW5saW5lKCk/KGM9ZCxWZShkKSYmIWQuaXNJbmxpbmUoKT9vPXQubGVuZ3RoPT09MSYmby5jYW5CZUVtcHR5KCkmJm8uaXNFbXB0eSgpP28uaW5zZXJ0QmVmb3JlKGQsITEpOm8uaW5zZXJ0QWZ0ZXIoZCwhMSk6VyhkKT8oZC5jYW5CZUVtcHR5KCl8fCFkLmlzRW1wdHkoKSkmJihubihvKT8oZj1vLmdldENoaWxkQXRJbmRleChyKSxmIT09bnVsbD9mLmluc2VydEJlZm9yZShkKTpvLmFwcGVuZChkKSxvPWQpOmQuaXNJbmxpbmUoKT8oby5hcHBlbmQoZCksbz1kKTpvPW8uaW5zZXJ0QWZ0ZXIoZCwhMSkpOihmPW8uZ2V0Rmlyc3RDaGlsZCgpLGYhPT1udWxsP2YuaW5zZXJ0QmVmb3JlKGQpOm8uYXBwZW5kKGQpLG89ZCkpOiFXKGQpfHxXKGQpJiZkLmlzSW5saW5lKCl8fFZlKG8pJiYhby5pc0lubGluZSgpPyhjPWQsaGUodGhpcykmJlZlKGQpJiYoVyhvKXx8WihvKSkmJiFkLmlzSW5saW5lKCk/KFoobyk/KGY9by5nZXRQYXJlbnRPclRocm93KCksW29dPW8uc3BsaXRUZXh0KHIpLG89by5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEpOihmPW8sbz1yKSxbLG9dPUlfKGYsbyksbz1vLmluc2VydEJlZm9yZShkKSk6bz1vLmluc2VydEFmdGVyKGQsITEpKTooZD1vLmdldFBhcmVudE9yVGhyb3coKSx4YShvKSYmby5yZW1vdmUoKSxvPWQsbS0tKX1pZihuJiYoWihsKT9sLnNlbGVjdCgpOih0PW8uZ2V0UHJldmlvdXNTaWJsaW5nKCksWih0KT90LnNlbGVjdCgpOih0PW8uZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxvLmdldFBhcmVudE9yVGhyb3coKS5zZWxlY3QodCx0KSkpKSxXKG8pKXtpZih0PVooYyk/YzpXKGMpJiZjLmlzSW5saW5lKCk/Yy5nZXRMYXN0RGVzY2VuZGFudCgpOm8uZ2V0TGFzdERlc2NlbmRhbnQoKSxufHwodD09PW51bGw/by5zZWxlY3QoKTpaKHQpP3QuZ2V0VGV4dENvbnRlbnQoKT09PSIiP3Quc2VsZWN0UHJldmlvdXMoKTp0LnNlbGVjdCgpOnQuc2VsZWN0TmV4dCgpKSxpLmxlbmd0aCE9PTApZm9yKG49byx0PWkubGVuZ3RoLTE7MDw9dDt0LS0pcj1pW3RdLGE9ci5nZXRQYXJlbnRPclRocm93KCksIVcobyl8fGhwKHIpfHxWZShyKSYmKCFyLmlzSW5saW5lKCl8fHIuaXNJc29sYXRlZCgpKT9XKG8pfHxocChyKT9XKHIpJiYhci5jYW5JbnNlcnRBZnRlcihvKT8obD1hLmNvbnN0cnVjdG9yLmNsb25lKGEpLFcobCl8fEsoMjkpLGwuYXBwZW5kKHIpLG8uaW5zZXJ0QWZ0ZXIobCkpOm8uaW5zZXJ0QWZ0ZXIocik6KG8uaW5zZXJ0QmVmb3JlKHIpLG89cik6KG49PT1vP28uYXBwZW5kKHIpOm8uaW5zZXJ0QmVmb3JlKHIpLG89ciksYS5pc0VtcHR5KCkmJiFhLmNhbkJlRW1wdHkoKSYmYS5yZW1vdmUoKX1lbHNlIG58fChaKG8pP28uc2VsZWN0KCk6KG49by5nZXRQYXJlbnRPclRocm93KCksdD1vLmdldEluZGV4V2l0aGluUGFyZW50KCkrMSxuLnNlbGVjdCh0LHQpKSk7cmV0dXJuITB9aW5zZXJ0UGFyYWdyYXBoKCl7dGhpcy5pc0NvbGxhcHNlZCgpfHx0aGlzLnJlbW92ZVRleHQoKTt2YXIgdD10aGlzLmFuY2hvcixuPXQub2Zmc2V0LHI9W107aWYodC50eXBlPT09InRleHQiKXt2YXIgbz10LmdldE5vZGUoKSxpPW8uZ2V0TmV4dFNpYmxpbmdzKCkucmV2ZXJzZSgpLGw9by5nZXRQYXJlbnRPclRocm93KCkscz1sLmlzSW5saW5lKCksYT1zP2wuZ2V0VGV4dENvbnRlbnRTaXplKCk6by5nZXRUZXh0Q29udGVudFNpemUoKTtuPT09MD9pLnB1c2gobyk6KHMmJihyPWwuZ2V0TmV4dFNpYmxpbmdzKCkpLG49PT1hfHxzJiZuPT09by5nZXRUZXh0Q29udGVudFNpemUoKXx8KFssb109by5zcGxpdFRleHQobiksaS5wdXNoKG8pKSl9ZWxzZXtpZihsPXQuZ2V0Tm9kZSgpLGVyKGwpKXtpPXZpKCkscj1sLmdldENoaWxkQXRJbmRleChuKSxpLnNlbGVjdCgpLHIhPT1udWxsP3IuaW5zZXJ0QmVmb3JlKGksITEpOmwuYXBwZW5kKGkpO3JldHVybn1pPWwuZ2V0Q2hpbGRyZW4oKS5zbGljZShuKS5yZXZlcnNlKCl9aWYobz1pLmxlbmd0aCxuPT09MCYmMDxvJiZsLmlzSW5saW5lKCkpe2lmKHI9bC5nZXRQYXJlbnRPclRocm93KCksaT1yLmluc2VydE5ld0FmdGVyKHRoaXMsITEpLFcoaSkpZm9yKHI9ci5nZXRDaGlsZHJlbigpLGw9MDtsPHIubGVuZ3RoO2wrKylpLmFwcGVuZChyW2xdKX1lbHNlIGlmKHM9bC5pbnNlcnROZXdBZnRlcih0aGlzLCExKSxzPT09bnVsbCl0aGlzLmluc2VydExpbmVCcmVhaygpO2Vsc2UgaWYoVyhzKSlpZihhPWwuZ2V0Rmlyc3RDaGlsZCgpLG49PT0wJiYobC5pcyh0LmdldE5vZGUoKSl8fGEmJmEuaXModC5nZXROb2RlKCkpKSYmMDxvKWwuaW5zZXJ0QmVmb3JlKHMpO2Vsc2V7aWYobD1udWxsLG49ci5sZW5ndGgsdD1zLmdldFBhcmVudE9yVGhyb3coKSwwPG4pZm9yKGE9MDthPG47YSsrKXQuYXBwZW5kKHJbYV0pO2lmKG8hPT0wKWZvcihyPTA7cjxvO3IrKyluPWlbcl0sbD09PW51bGw/cy5hcHBlbmQobik6bC5pbnNlcnRCZWZvcmUobiksbD1uO3MuY2FuQmVFbXB0eSgpfHxzLmdldENoaWxkcmVuU2l6ZSgpIT09MD9zLnNlbGVjdFN0YXJ0KCk6KHMuc2VsZWN0UHJldmlvdXMoKSxzLnJlbW92ZSgpKX19aW5zZXJ0TGluZUJyZWFrKHQpe2xldCBuPU5sKCk7dmFyIHI9dGhpcy5hbmNob3I7ci50eXBlPT09ImVsZW1lbnQiJiYocj1yLmdldE5vZGUoKSxubihyKSYmdGhpcy5pbnNlcnRQYXJhZ3JhcGgoKSksdD90aGlzLmluc2VydE5vZGVzKFtuXSwhMCk6dGhpcy5pbnNlcnROb2Rlcyhbbl0pJiZuLnNlbGVjdE5leHQoMCwwKX1nZXRDaGFyYWN0ZXJPZmZzZXRzKCl7cmV0dXJuIFV1KHRoaXMpfWV4dHJhY3QoKXt2YXIgdD10aGlzLmdldE5vZGVzKCksbj10Lmxlbmd0aCxyPW4tMSxvPXRoaXMuYW5jaG9yO2xldCBpPXRoaXMuZm9jdXM7dmFyIGw9dFswXTtsZXQgcz10W3JdLFthLHVdPVV1KHRoaXMpO3JldHVybiBuPT09MD9bXTpuPT09MT9aKGwpJiYhdGhpcy5pc0NvbGxhcHNlZCgpPyh0PWE+dT91OmEscj1sLnNwbGl0VGV4dCh0LGE+dT9hOnUpLHQ9dD09PTA/clswXTpyWzFdLHQhPW51bGw/W3RdOltdKTpbbF06KG49by5pc0JlZm9yZShpKSxaKGwpJiYobz1uP2E6dSxvPT09bC5nZXRUZXh0Q29udGVudFNpemUoKT90LnNoaWZ0KCk6byE9PTAmJihbLGxdPWwuc3BsaXRUZXh0KG8pLHRbMF09bCkpLFoocykmJihsPXMuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgsbj1uP3U6YSxuPT09MD90LnBvcCgpOm4hPT1sJiYoW3NdPXMuc3BsaXRUZXh0KG4pLHRbcl09cykpLHQpfW1vZGlmeSh0LG4scil7dmFyIG89dGhpcy5mb2N1cyxpPXRoaXMuYW5jaG9yLGw9dD09PSJtb3ZlIixzPXFoKG8sbik7aWYoVmUocykmJiFzLmlzSXNvbGF0ZWQoKSlsJiZzLmlzS2V5Ym9hcmRTZWxlY3RhYmxlKCk/KG49cHAoKSxuLmFkZChzLl9fa2V5KSx4cihuKSk6KHQ9bj9zLmdldFByZXZpb3VzU2libGluZygpOnMuZ2V0TmV4dFNpYmxpbmcoKSxaKHQpPyhzPXQuX19rZXksbj1uP3QuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGg6MCxvLnNldChzLG4sInRleHQiKSxsJiZpLnNldChzLG4sInRleHQiKSk6KHI9cy5nZXRQYXJlbnRPclRocm93KCksVyh0KT8ocj10Ll9fa2V5LHM9bj90LmdldENoaWxkcmVuU2l6ZSgpOjApOihzPXMuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxyPXIuX19rZXksbnx8cysrKSxvLnNldChyLHMsImVsZW1lbnQiKSxsJiZpLnNldChyLHMsImVsZW1lbnQiKSkpO2Vsc2UgaWYoaT10dCgpLG89JHIoaS5fd2luZG93KSl7dmFyIGE9aS5fYmxvY2tDdXJzb3JFbGVtZW50LHU9aS5fcm9vdEVsZW1lbnQ7aWYodT09PW51bGx8fGE9PT1udWxsfHwhVyhzKXx8cy5pc0lubGluZSgpfHxzLmNhbkJlRW1wdHkoKXx8ZXAoYSxpLHUpLG8ubW9kaWZ5KHQsbj8iYmFja3dhcmQiOiJmb3J3YXJkIixyKSwwPG8ucmFuZ2VDb3VudCYmKHM9by5nZXRSYW5nZUF0KDApLGk9dGhpcy5hbmNob3IuZ2V0Tm9kZSgpLGk9bm4oaSk/aTpMXyhpKSx0aGlzLmFwcGx5RE9NUmFuZ2UocyksdGhpcy5kaXJ0eT0hMCwhbCkpe2ZvcihsPXRoaXMuZ2V0Tm9kZXMoKSx0PVtdLHI9ITEsYT0wO2E8bC5sZW5ndGg7YSsrKXU9bFthXSxOYyh1LGkpP3QucHVzaCh1KTpyPSEwO3ImJjA8dC5sZW5ndGgmJihuPyhuPXRbMF0sVyhuKT9uLnNlbGVjdFN0YXJ0KCk6bi5nZXRQYXJlbnRPclRocm93KCkuc2VsZWN0U3RhcnQoKSk6KG49dFt0Lmxlbmd0aC0xXSxXKG4pP24uc2VsZWN0RW5kKCk6bi5nZXRQYXJlbnRPclRocm93KCkuc2VsZWN0RW5kKCkpKSwoby5hbmNob3JOb2RlIT09cy5zdGFydENvbnRhaW5lcnx8by5hbmNob3JPZmZzZXQhPT1zLnN0YXJ0T2Zmc2V0KSYmKG49dGhpcy5mb2N1cyxsPXRoaXMuYW5jaG9yLG89bC5rZXkscz1sLm9mZnNldCxpPWwudHlwZSxjbyhsLG4ua2V5LG4ub2Zmc2V0LG4udHlwZSksY28obixvLHMsaSksdGhpcy5fY2FjaGVkTm9kZXM9bnVsbCl9fX1kZWxldGVDaGFyYWN0ZXIodCl7bGV0IG49dGhpcy5pc0NvbGxhcHNlZCgpO2lmKHRoaXMuaXNDb2xsYXBzZWQoKSl7dmFyIHI9dGhpcy5hbmNob3Isbz10aGlzLmZvY3VzLGk9ci5nZXROb2RlKCk7aWYoIXQmJihyLnR5cGU9PT0iZWxlbWVudCImJlcoaSkmJnIub2Zmc2V0PT09aS5nZXRDaGlsZHJlblNpemUoKXx8ci50eXBlPT09InRleHQiJiZyLm9mZnNldD09PWkuZ2V0VGV4dENvbnRlbnRTaXplKCkpKXt2YXIgbD1pLmdldFBhcmVudCgpO2lmKGw9aS5nZXROZXh0U2libGluZygpfHwobD09PW51bGw/bnVsbDpsLmdldE5leHRTaWJsaW5nKCkpLFcobCkmJmwuaXNTaGFkb3dSb290KCkpcmV0dXJufWlmKGw9cWgobyx0KSxWZShsKSYmIWwuaXNJc29sYXRlZCgpKXtsLmlzS2V5Ym9hcmRTZWxlY3RhYmxlKCkmJlcoaSkmJmkuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wPyhpLnJlbW92ZSgpLHQ9cHAoKSx0LmFkZChsLl9fa2V5KSx4cih0KSk6KGwucmVtb3ZlKCksdHQoKS5kaXNwYXRjaENvbW1hbmQoZGQsdm9pZCAwKSk7cmV0dXJufWlmKCF0JiZXKGwpJiZXKGkpJiZpLmlzRW1wdHkoKSl7aS5yZW1vdmUoKSxsLnNlbGVjdFN0YXJ0KCk7cmV0dXJufWlmKHRoaXMubW9kaWZ5KCJleHRlbmQiLHQsImNoYXJhY3RlciIpLHRoaXMuaXNDb2xsYXBzZWQoKSl7aWYodCYmci5vZmZzZXQ9PT0wJiYoci50eXBlPT09ImVsZW1lbnQiP3IuZ2V0Tm9kZSgpOnIuZ2V0Tm9kZSgpLmdldFBhcmVudE9yVGhyb3coKSkuY29sbGFwc2VBdFN0YXJ0KHRoaXMpKXJldHVybn1lbHNle2lmKGw9by50eXBlPT09InRleHQiP28uZ2V0Tm9kZSgpOm51bGwsaT1yLnR5cGU9PT0idGV4dCI/ci5nZXROb2RlKCk6bnVsbCxsIT09bnVsbCYmbC5pc1NlZ21lbnRlZCgpKXtpZihyPW8ub2Zmc2V0LG89bC5nZXRUZXh0Q29udGVudFNpemUoKSxsLmlzKGkpfHx0JiZyIT09b3x8IXQmJnIhPT0wKXtEeShsLHQscik7cmV0dXJufX1lbHNlIGlmKGkhPT1udWxsJiZpLmlzU2VnbWVudGVkKCkmJihyPXIub2Zmc2V0LG89aS5nZXRUZXh0Q29udGVudFNpemUoKSxpLmlzKGwpfHx0JiZyIT09MHx8IXQmJnIhPT1vKSl7RHkoaSx0LHIpO3JldHVybn1pZihpPXRoaXMuYW5jaG9yLGw9dGhpcy5mb2N1cyxyPWkuZ2V0Tm9kZSgpLG89bC5nZXROb2RlKCkscj09PW8mJmkudHlwZT09PSJ0ZXh0IiYmbC50eXBlPT09InRleHQiKXt2YXIgcz1pLm9mZnNldCxhPWwub2Zmc2V0O2xldCB1PXM8YTtvPXU/czphLGE9dT9hOnMscz1hLTEsbyE9PXMmJihyPXIuZ2V0VGV4dENvbnRlbnQoKS5zbGljZShvLGEpLE9fKHIpfHwodD9sLm9mZnNldD1zOmkub2Zmc2V0PXMpKX19fXRoaXMucmVtb3ZlVGV4dCgpLHQmJiFuJiZ0aGlzLmlzQ29sbGFwc2VkKCkmJnRoaXMuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCImJnRoaXMuYW5jaG9yLm9mZnNldD09PTAmJih0PXRoaXMuYW5jaG9yLmdldE5vZGUoKSx0LmlzRW1wdHkoKSYmbm4odC5nZXRQYXJlbnQoKSkmJnQuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKT09PTAmJnQuY29sbGFwc2VBdFN0YXJ0KHRoaXMpKX1kZWxldGVMaW5lKHQpe3RoaXMuaXNDb2xsYXBzZWQoKSYmKHRoaXMuYW5jaG9yLnR5cGU9PT0idGV4dCImJnRoaXMubW9kaWZ5KCJleHRlbmQiLHQsImxpbmVib3VuZGFyeSIpLCh0P3RoaXMuZm9jdXM6dGhpcy5hbmNob3IpLm9mZnNldD09PTAmJnRoaXMubW9kaWZ5KCJleHRlbmQiLHQsImNoYXJhY3RlciIpKSx0aGlzLnJlbW92ZVRleHQoKX1kZWxldGVXb3JkKHQpe3RoaXMuaXNDb2xsYXBzZWQoKSYmdGhpcy5tb2RpZnkoImV4dGVuZCIsdCwid29yZCIpLHRoaXMucmVtb3ZlVGV4dCgpfX1mdW5jdGlvbiBWbChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHhkfWZ1bmN0aW9uIEx5KGUpe2xldCB0PWUub2Zmc2V0O3JldHVybiBlLnR5cGU9PT0idGV4dCI/dDooZT1lLmdldE5vZGUoKSx0PT09ZS5nZXRDaGlsZHJlblNpemUoKT9lLmdldFRleHRDb250ZW50KCkubGVuZ3RoOjApfWZ1bmN0aW9uIFV1KGUpe2xldCB0PWUuYW5jaG9yO3JldHVybiBlPWUuZm9jdXMsdC50eXBlPT09ImVsZW1lbnQiJiZlLnR5cGU9PT0iZWxlbWVudCImJnQua2V5PT09ZS5rZXkmJnQub2Zmc2V0PT09ZS5vZmZzZXQ/WzAsMF06W0x5KHQpLEx5KGUpXX1mdW5jdGlvbiBEeShlLHQsbil7bGV0IHI9ZS5nZXRUZXh0Q29udGVudCgpLnNwbGl0KC8oPz1ccykvZyksbz1yLmxlbmd0aCxpPTAsbD0wO2ZvcihsZXQgcz0wO3M8bztzKyspe2xldCBhPXJbc10sdT1zPT09by0xO2lmKGw9aSxpKz1hLmxlbmd0aCx0JiZpPT09bnx8aT5ufHx1KXtyLnNwbGljZShzLDEpLHUmJihsPXZvaWQgMCk7YnJlYWt9fXQ9ci5qb2luKCIiKS50cmltKCksdD09PSIiP2UucmVtb3ZlKCk6KGUuc2V0VGV4dENvbnRlbnQodCksZS5zZWxlY3QobCxsKSl9ZnVuY3Rpb24gSXkoZSx0LG4scil7dmFyIG89dDtpZihlLm5vZGVUeXBlPT09MSl7bGV0IHM9ITE7dmFyIGk9ZS5jaGlsZE5vZGVzLGw9aS5sZW5ndGg7bz09PWwmJihzPSEwLG89bC0xKTtsZXQgYT1pW29dO2lmKGw9ITEsYT09PXIuX2Jsb2NrQ3Vyc29yRWxlbWVudD8oYT1pW28rMV0sbD0hMCk6ci5fYmxvY2tDdXJzb3JFbGVtZW50IT09bnVsbCYmby0tLHI9cmwoYSksWihyKSlvPXM/ci5nZXRUZXh0Q29udGVudFNpemUoKTowO2Vsc2V7aWYoaT1ybChlKSxpPT09bnVsbClyZXR1cm4gbnVsbDtpZihXKGkpPyhlPWkuZ2V0Q2hpbGRBdEluZGV4KG8pLCh0PVcoZSkpJiYodD1lLmdldFBhcmVudCgpLHQ9bj09PW51bGx8fHQ9PT1udWxsfHwhdC5jYW5CZUVtcHR5KCl8fHQhPT1uLmdldE5vZGUoKSksdCYmKG49cz9lLmdldExhc3REZXNjZW5kYW50KCk6ZS5nZXRGaXJzdERlc2NlbmRhbnQoKSxuPT09bnVsbD8oaT1lLG89MCk6KGU9bixpPVcoZSk/ZTplLmdldFBhcmVudE9yVGhyb3coKSkpLFooZSk/KHI9ZSxpPW51bGwsbz1zP2UuZ2V0VGV4dENvbnRlbnRTaXplKCk6MCk6ZSE9PWkmJnMmJiFsJiZvKyspOihvPWkuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxvPXQ9PT0wJiZWZShpKSYmcmwoZSk9PT1pP286bysxLGk9aS5nZXRQYXJlbnRPclRocm93KCkpLFcoaSkpcmV0dXJuIG5ldyB3cihpLl9fa2V5LG8sImVsZW1lbnQiKX19ZWxzZSByPXJsKGUpO3JldHVybiBaKHIpP25ldyB3cihyLl9fa2V5LG8sInRleHQiKTpudWxsfWZ1bmN0aW9uIGp5KGUsdCxuKXt2YXIgcj1lLm9mZnNldCxvPWUuZ2V0Tm9kZSgpO3I9PT0wPyhyPW8uZ2V0UHJldmlvdXNTaWJsaW5nKCksbz1vLmdldFBhcmVudCgpLHQ/KG58fCF0KSYmcj09PW51bGwmJlcobykmJm8uaXNJbmxpbmUoKSYmKHQ9by5nZXRQcmV2aW91c1NpYmxpbmcoKSxaKHQpJiYoZS5rZXk9dC5fX2tleSxlLm9mZnNldD10LmdldFRleHRDb250ZW50KCkubGVuZ3RoKSk6VyhyKSYmIW4mJnIuaXNJbmxpbmUoKT8oZS5rZXk9ci5fX2tleSxlLm9mZnNldD1yLmdldENoaWxkcmVuU2l6ZSgpLGUudHlwZT0iZWxlbWVudCIpOloocikmJihlLmtleT1yLl9fa2V5LGUub2Zmc2V0PXIuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgpKTpyPT09by5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCYmKHI9by5nZXROZXh0U2libGluZygpLG89by5nZXRQYXJlbnQoKSx0JiZXKHIpJiZyLmlzSW5saW5lKCk/KGUua2V5PXIuX19rZXksZS5vZmZzZXQ9MCxlLnR5cGU9ImVsZW1lbnQiKToobnx8dCkmJnI9PT1udWxsJiZXKG8pJiZvLmlzSW5saW5lKCkmJiFvLmNhbkluc2VydFRleHRBZnRlcigpJiYodD1vLmdldE5leHRTaWJsaW5nKCksWih0KSYmKGUua2V5PXQuX19rZXksZS5vZmZzZXQ9MCkpKX1mdW5jdGlvbiBaXyhlLHQsbil7aWYoZS50eXBlPT09InRleHQiJiZ0LnR5cGU9PT0idGV4dCIpe3ZhciByPWUuaXNCZWZvcmUodCk7bGV0IG89ZS5pcyh0KTtqeShlLHIsbyksankodCwhcixvKSxvJiYodC5rZXk9ZS5rZXksdC5vZmZzZXQ9ZS5vZmZzZXQsdC50eXBlPWUudHlwZSkscj10dCgpLHIuaXNDb21wb3NpbmcoKSYmci5fY29tcG9zaXRpb25LZXkhPT1lLmtleSYmaGUobikmJihyPW4uYW5jaG9yLG49bi5mb2N1cyxjbyhlLHIua2V5LHIub2Zmc2V0LHIudHlwZSksY28odCxuLmtleSxuLm9mZnNldCxuLnR5cGUpKX19ZnVuY3Rpb24gcV8oZSx0LG4scixvLGkpe3JldHVybiBlPT09bnVsbHx8bj09PW51bGx8fCFEYShvLGUsbil8fCh0PUl5KGUsdCxoZShpKT9pLmFuY2hvcjpudWxsLG8pLHQ9PT1udWxsKXx8KHI9SXkobixyLGhlKGkpP2kuZm9jdXM6bnVsbCxvKSxyPT09bnVsbHx8dC50eXBlPT09ImVsZW1lbnQiJiZyLnR5cGU9PT0iZWxlbWVudCImJihlPXJsKGUpLG49cmwobiksVmUoZSkmJlZlKG4pKSk/bnVsbDooWl8odCxyLGkpLFt0LHJdKX1mdW5jdGlvbiBocChlKXtyZXR1cm4gVyhlKSYmIWUuaXNJbmxpbmUoKX1mdW5jdGlvbiBlUyhlLHQsbixyLG8saSl7bGV0IGw9a3IoKTtyZXR1cm4gZT1uZXcgUmkobmV3IHdyKGUsdCxvKSxuZXcgd3IobixyLGkpLDAsIiIpLGUuZGlydHk9ITAsbC5fc2VsZWN0aW9uPWV9ZnVuY3Rpb24gcHAoKXtyZXR1cm4gbmV3IHhkKG5ldyBTZXQpfWZ1bmN0aW9uIFAyKGUpe2xldCB0PWUuZ2V0RWRpdG9yU3RhdGUoKS5fc2VsZWN0aW9uLG49JHIoZS5fd2luZG93KTtyZXR1cm4gVmwodCl8fHNtKHQpP3QuY2xvbmUoKTphbSh0LG4sZSl9ZnVuY3Rpb24gYW0oZSx0LG4pe3ZhciByPW4uX3dpbmRvdztpZihyPT09bnVsbClyZXR1cm4gbnVsbDt2YXIgbz1yLmV2ZW50LGk9bz9vLnR5cGU6dm9pZCAwO3I9aT09PSJzZWxlY3Rpb25jaGFuZ2UiLG89IUpoJiYocnx8aT09PSJiZWZvcmVpbnB1dCJ8fGk9PT0iY29tcG9zaXRpb25zdGFydCJ8fGk9PT0iY29tcG9zaXRpb25lbmQifHxpPT09ImNsaWNrIiYmbyYmby5kZXRhaWw9PT0zfHxpPT09ImRyb3AifHxpPT09dm9pZCAwKTtsZXQgbDtpZighaGUoZSl8fG8pe2lmKHQ9PT1udWxsKXJldHVybiBudWxsO2lmKG89dC5hbmNob3JOb2RlLGk9dC5mb2N1c05vZGUsbD10LmFuY2hvck9mZnNldCx0PXQuZm9jdXNPZmZzZXQsciYmaGUoZSkmJiFEYShuLG8saSkpcmV0dXJuIGUuY2xvbmUoKX1lbHNlIHJldHVybiBlLmNsb25lKCk7aWYobj1xXyhvLGwsaSx0LG4sZSksbj09PW51bGwpcmV0dXJuIG51bGw7bGV0W3MsYV09bjtyZXR1cm4gbmV3IFJpKHMsYSxoZShlKT9lLmZvcm1hdDowLGhlKGUpP2Uuc3R5bGU6IiIpfWZ1bmN0aW9uIEtlKCl7cmV0dXJuIGtyKCkuX3NlbGVjdGlvbn1mdW5jdGlvbiBIbCgpe3JldHVybiB0dCgpLl9lZGl0b3JTdGF0ZS5fc2VsZWN0aW9ufWZ1bmN0aW9uIE9jKGUsdCxuLHI9MSl7dmFyIG89ZS5hbmNob3IsaT1lLmZvY3VzLGw9by5nZXROb2RlKCkscz1pLmdldE5vZGUoKTtpZih0LmlzKGwpfHx0LmlzKHMpKXtpZihsPXQuX19rZXksZS5pc0NvbGxhcHNlZCgpKXQ9by5vZmZzZXQsKG48PXQmJjA8cnx8bjx0JiYwPnIpJiYobj1NYXRoLm1heCgwLHQrciksby5zZXQobCxuLCJlbGVtZW50IiksaS5zZXQobCxuLCJlbGVtZW50IiksenkoZSkpO2Vsc2V7bGV0IHU9ZS5pc0JhY2t3YXJkKCk7cz11P2k6bzt2YXIgYT1zLmdldE5vZGUoKTtvPXU/bzppLGk9by5nZXROb2RlKCksdC5pcyhhKSYmKGE9cy5vZmZzZXQsKG48PWEmJjA8cnx8bjxhJiYwPnIpJiZzLnNldChsLE1hdGgubWF4KDAsYStyKSwiZWxlbWVudCIpKSx0LmlzKGkpJiYodD1vLm9mZnNldCwobjw9dCYmMDxyfHxuPHQmJjA+cikmJm8uc2V0KGwsTWF0aC5tYXgoMCx0K3IpLCJlbGVtZW50IikpfXp5KGUpfX1mdW5jdGlvbiB6eShlKXt2YXIgdD1lLmFuY2hvcixuPXQub2Zmc2V0O2xldCByPWUuZm9jdXM7dmFyIG89ci5vZmZzZXQsaT10LmdldE5vZGUoKSxsPXIuZ2V0Tm9kZSgpO2lmKGUuaXNDb2xsYXBzZWQoKSlXKGkpJiYobD1pLmdldENoaWxkcmVuU2l6ZSgpLGw9KG89bj49bCk/aS5nZXRDaGlsZEF0SW5kZXgobC0xKTppLmdldENoaWxkQXRJbmRleChuKSxaKGwpJiYobj0wLG8mJihuPWwuZ2V0VGV4dENvbnRlbnRTaXplKCkpLHQuc2V0KGwuX19rZXksbiwidGV4dCIpLHIuc2V0KGwuX19rZXksbiwidGV4dCIpKSk7ZWxzZXtpZihXKGkpKXtsZXQgcz1pLmdldENoaWxkcmVuU2l6ZSgpO249KGU9bj49cyk/aS5nZXRDaGlsZEF0SW5kZXgocy0xKTppLmdldENoaWxkQXRJbmRleChuKSxaKG4pJiYoaT0wLGUmJihpPW4uZ2V0VGV4dENvbnRlbnRTaXplKCkpLHQuc2V0KG4uX19rZXksaSwidGV4dCIpKX1XKGwpJiYobj1sLmdldENoaWxkcmVuU2l6ZSgpLG89KHQ9bz49bik/bC5nZXRDaGlsZEF0SW5kZXgobi0xKTpsLmdldENoaWxkQXRJbmRleChvKSxaKG8pJiYobD0wLHQmJihsPW8uZ2V0VGV4dENvbnRlbnRTaXplKCkpLHIuc2V0KG8uX19rZXksbCwidGV4dCIpKSl9fWZ1bmN0aW9uIE8yKGUsdCl7aWYodD10LmdldEVkaXRvclN0YXRlKCkuX3NlbGVjdGlvbixlPWUuX3NlbGVjdGlvbixoZShlKSl7dmFyIG49ZS5hbmNob3I7bGV0IHI9ZS5mb2N1cyxvO24udHlwZT09PSJ0ZXh0IiYmKG89bi5nZXROb2RlKCksby5zZWxlY3Rpb25UcmFuc2Zvcm0odCxlKSksci50eXBlPT09InRleHQiJiYobj1yLmdldE5vZGUoKSxvIT09biYmbi5zZWxlY3Rpb25UcmFuc2Zvcm0odCxlKSl9fWZ1bmN0aW9uIEFjKGUsdCxuLHIsbyl7bGV0IGk9bnVsbCxsPTAscz1udWxsO3IhPT1udWxsPyhpPXIuX19rZXksWihyKT8obD1yLmdldFRleHRDb250ZW50U2l6ZSgpLHM9InRleHQiKTpXKHIpJiYobD1yLmdldENoaWxkcmVuU2l6ZSgpLHM9ImVsZW1lbnQiKSk6byE9PW51bGwmJihpPW8uX19rZXksWihvKT9zPSJ0ZXh0IjpXKG8pJiYocz0iZWxlbWVudCIpKSxpIT09bnVsbCYmcyE9PW51bGw/ZS5zZXQoaSxsLHMpOihsPXQuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxsPT09LTEmJihsPW4uZ2V0Q2hpbGRyZW5TaXplKCkpLGUuc2V0KG4uX19rZXksbCwiZWxlbWVudCIpKX1mdW5jdGlvbiBGeShlLHQsbixyLG8pe2UudHlwZT09PSJ0ZXh0Ij8oZS5rZXk9bix0fHwoZS5vZmZzZXQrPW8pKTplLm9mZnNldD5yLmdldEluZGV4V2l0aGluUGFyZW50KCkmJi0tZS5vZmZzZXR9ZnVuY3Rpb24gdFMoZSx0LG4pe2xldCByPVtdLG89bnVsbCxpPW51bGw7ZT1lLmdldENoaWxkcmVuKCk7Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDtjKyspe3ZhciBsPWVbY107X2EobCl8fEsoMTA4KTt2YXIgcz1sLmdldENoaWxkcmVuKCk7bD0wO2ZvcihsZXQgZCBvZiBzKXtmb3IoRG4oZCl8fEsoMTA5KTtyW2NdIT09dm9pZCAwJiZyW2NdW2xdIT09dm9pZCAwOylsKys7cz1jO3ZhciBhPWwsdT1kO2xldCBmPXtjZWxsOnUsc3RhcnRDb2x1bW46YSxzdGFydFJvdzpzfSxoPXUuX19yb3dTcGFuLG09dS5fX2NvbFNwYW47Zm9yKGxldCBnPTA7ZzxoO2crKyl7cltzK2ddPT09dm9pZCAwJiYocltzK2ddPVtdKTtmb3IobGV0IFM9MDtTPG07UysrKXJbcytnXVthK1NdPWZ9dC5pcyh1KSYmKG89Ziksbi5pcyh1KSYmKGk9ZiksbCs9ZC5fX2NvbFNwYW59fXJldHVybiBvPT09bnVsbCYmSygxMTApLGk9PT1udWxsJiZLKDExMSksW3IsbyxpXX1mdW5jdGlvbiBuUyhlKXtlIGluc3RhbmNlb2YgZG18fChlIGluc3RhbmNlb2YgemE/KGU9UmMoZSxEbiksRG4oZSl8fEsoMTE0KSk6KGU9UmMoZS5nZXROb2RlKCksRG4pLERuKGUpfHxLKDExNCkpKTtsZXQgdD1lLmdldFBhcmVudCgpO19hKHQpfHxLKDExNSk7bGV0IG49dC5nZXRQYXJlbnQoKTtyZXR1cm4gZm0obil8fEsoMTE2KSxbZSx0LG5dfWxldCBUdD1udWxsLGJ0PW51bGwsbW49ITEsa2Y9ITEsd2E9MCxCeT17Y2hhcmFjdGVyRGF0YTohMCxjaGlsZExpc3Q6ITAsc3VidHJlZTohMH07ZnVuY3Rpb24gS2woKXtyZXR1cm4gbW58fFR0IT09bnVsbCYmVHQuX3JlYWRPbmx5fWZ1bmN0aW9uIGVuKCl7bW4mJksoMTMpfWZ1bmN0aW9uIGtyKCl7cmV0dXJuIFR0PT09bnVsbCYmSygxNSksVHR9ZnVuY3Rpb24gdHQoKXtyZXR1cm4gYnQ9PT1udWxsJiZLKDE2KSxidH1mdW5jdGlvbiBXeShlLHQsbil7dmFyIHI9dC5fX3R5cGU7bGV0IG89ZS5fbm9kZXMuZ2V0KHIpO2ZvcihvPT09dm9pZCAwJiZLKDMwLHIpLGU9bi5nZXQociksZT09PXZvaWQgMCYmKGU9QXJyYXkuZnJvbShvLnRyYW5zZm9ybXMpLG4uc2V0KHIsZSkpLG49ZS5sZW5ndGgscj0wO3I8biYmKGVbcl0odCksdC5pc0F0dGFjaGVkKCkpO3IrKyk7fWZ1bmN0aW9uIEEyKGUsdCl7dD10Ll9kaXJ0eUxlYXZlcyxlPWUuX25vZGVNYXA7Zm9yKGxldCBuIG9mIHQpdD1lLmdldChuKSxaKHQpJiZ0LmlzQXR0YWNoZWQoKSYmdC5pc1NpbXBsZVRleHQoKSYmIXQuaXNVbm1lcmdlYWJsZSgpJiZrXyh0KX1mdW5jdGlvbiBNMihlLHQpe2xldCBuPXQuX2RpcnR5TGVhdmVzLHI9dC5fZGlydHlFbGVtZW50cztlPWUuX25vZGVNYXA7bGV0IG89eW8oKSxpPW5ldyBNYXA7dmFyIGw9bjtsZXQgcz1sLnNpemU7Zm9yKHZhciBhPXIsdT1hLnNpemU7MDxzfHwwPHU7KXtpZigwPHMpe3QuX2RpcnR5TGVhdmVzPW5ldyBTZXQ7Zm9yKGxldCBjIG9mIGwpbD1lLmdldChjKSxaKGwpJiZsLmlzQXR0YWNoZWQoKSYmbC5pc1NpbXBsZVRleHQoKSYmIWwuaXNVbm1lcmdlYWJsZSgpJiZrXyhsKSxsIT09dm9pZCAwJiZsIT09dm9pZCAwJiZsLl9fa2V5IT09byYmbC5pc0F0dGFjaGVkKCkmJld5KHQsbCxpKSxuLmFkZChjKTtpZihsPXQuX2RpcnR5TGVhdmVzLHM9bC5zaXplLDA8cyl7d2ErKztjb250aW51ZX19dC5fZGlydHlMZWF2ZXM9bmV3IFNldCx0Ll9kaXJ0eUVsZW1lbnRzPW5ldyBNYXA7Zm9yKGxldCBjIG9mIGEpYT1jWzBdLHU9Y1sxXSwoYT09PSJyb290Inx8dSkmJihsPWUuZ2V0KGEpLGwhPT12b2lkIDAmJmwhPT12b2lkIDAmJmwuX19rZXkhPT1vJiZsLmlzQXR0YWNoZWQoKSYmV3kodCxsLGkpLHIuc2V0KGEsdSkpO2w9dC5fZGlydHlMZWF2ZXMscz1sLnNpemUsYT10Ll9kaXJ0eUVsZW1lbnRzLHU9YS5zaXplLHdhKyt9dC5fZGlydHlMZWF2ZXM9bix0Ll9kaXJ0eUVsZW1lbnRzPXJ9ZnVuY3Rpb24gdW0oZSx0KXt2YXIgbj1lLnR5cGUscj10LmdldChuKTtpZihyPT09dm9pZCAwJiZLKDE3LG4pLG49ci5rbGFzcyxlLnR5cGUhPT1uLmdldFR5cGUoKSYmSygxOCxuLm5hbWUpLG49bi5pbXBvcnRKU09OKGUpLGU9ZS5jaGlsZHJlbixXKG4pJiZBcnJheS5pc0FycmF5KGUpKWZvcihyPTA7cjxlLmxlbmd0aDtyKyspe2xldCBvPXVtKGVbcl0sdCk7bi5hcHBlbmQobyl9cmV0dXJuIG59ZnVuY3Rpb24gVXkoZSx0KXtsZXQgbj1UdCxyPW1uLG89YnQ7VHQ9ZSxtbj0hMCxidD1udWxsO3RyeXtyZXR1cm4gdCgpfWZpbmFsbHl7VHQ9bixtbj1yLGJ0PW99fWZ1bmN0aW9uIGFpKGUsdCl7bGV0IG49ZS5fcGVuZGluZ0VkaXRvclN0YXRlLHI9ZS5fcm9vdEVsZW1lbnQsbz1lLl9oZWFkbGVzc3x8cj09PW51bGw7aWYobiE9PW51bGwpe3ZhciBpPWUuX2VkaXRvclN0YXRlLGw9aS5fc2VsZWN0aW9uLHM9bi5fc2VsZWN0aW9uLGE9ZS5fZGlydHlUeXBlIT09MCx1PVR0LGM9bW4sZD1idCxmPWUuX3VwZGF0aW5nLGg9ZS5fb2JzZXJ2ZXIsbT1udWxsO2lmKGUuX3BlbmRpbmdFZGl0b3JTdGF0ZT1udWxsLGUuX2VkaXRvclN0YXRlPW4sIW8mJmEmJmghPT1udWxsKXtidD1lLFR0PW4sbW49ITEsZS5fdXBkYXRpbmc9ITA7dHJ5e2xldCBOZT1lLl9kaXJ0eVR5cGUsaHQ9ZS5fZGlydHlFbGVtZW50cyxwdD1lLl9kaXJ0eUxlYXZlcztoLmRpc2Nvbm5lY3QoKTt2YXIgZz1OZSxTPWh0LHY9cHQ7cXQ9TXI9bXQ9IiIsel89Zz09PTIsRnU9bnVsbCxHdD1lLE9vPWUuX2NvbmZpZyxtYT1lLl9ub2Rlcyx2ZD1HdC5fbGlzdGVuZXJzLm11dGF0aW9uLHRwPVMsbnA9dixtaT1pLl9ub2RlTWFwLEFvPW4uX25vZGVNYXAsbG09bi5fcmVhZE9ubHkscnA9bmV3IE1hcChlLl9rZXlUb0RPTU1hcCk7bGV0IF90PW5ldyBNYXA7dmE9X3QsU3MoInJvb3QiLG51bGwpLHZhPXJwPU9vPUFvPW1pPW5wPXRwPW1hPUd0PXZvaWQgMCxtPV90fWNhdGNoKE5lKXtpZihOZSBpbnN0YW5jZW9mIEVycm9yJiZlLl9vbkVycm9yKE5lKSxrZil0aHJvdyBOZTtsUyhlLG51bGwscixuKSwkXyhlKSxlLl9kaXJ0eVR5cGU9MixrZj0hMCxhaShlLGkpLGtmPSExO3JldHVybn1maW5hbGx5e2gub2JzZXJ2ZShyLEJ5KSxlLl91cGRhdGluZz1mLFR0PXUsbW49YyxidD1kfX1uLl9yZWFkT25seXx8KG4uX3JlYWRPbmx5PSEwKTt2YXIgeT1lLl9kaXJ0eUxlYXZlcyx4PWUuX2RpcnR5RWxlbWVudHMsdz1lLl9ub3JtYWxpemVkTm9kZXMsaz1lLl91cGRhdGVUYWdzLGI9ZS5fZGVmZXJyZWQ7YSYmKGUuX2RpcnR5VHlwZT0wLGUuX2Nsb25lTm90TmVlZGVkLmNsZWFyKCksZS5fZGlydHlMZWF2ZXM9bmV3IFNldCxlLl9kaXJ0eUVsZW1lbnRzPW5ldyBNYXAsZS5fbm9ybWFsaXplZE5vZGVzPW5ldyBTZXQsZS5fdXBkYXRlVGFncz1uZXcgU2V0KTt2YXIgVD1lLl9kZWNvcmF0b3JzLE49ZS5fcGVuZGluZ0RlY29yYXRvcnN8fFQsRD1uLl9ub2RlTWFwLE87Zm9yKE8gaW4gTilELmhhcyhPKXx8KE49PT1UJiYoTj1QXyhlKSksZGVsZXRlIE5bT10pO3ZhciBqPW8/bnVsbDokcihlLl93aW5kb3cpO2lmKGUuX2VkaXRhYmxlJiZqIT09bnVsbCYmKGF8fHM9PT1udWxsfHxzLmRpcnR5KSl7YnQ9ZSxUdD1uO3RyeXtpZihoIT09bnVsbCYmaC5kaXNjb25uZWN0KCksYXx8cz09PW51bGx8fHMuZGlydHkpe2xldCBOZT1lLl9ibG9ja0N1cnNvckVsZW1lbnQ7TmUhPT1udWxsJiZlcChOZSxlLHIpO2U6e2xldCBodD1qLmFuY2hvck5vZGUscHQ9ai5mb2N1c05vZGUsX3Q9ai5hbmNob3JPZmZzZXQsdm49ai5mb2N1c09mZnNldCxqdD1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2lmKCEoay5oYXMoImNvbGxhYm9yYXRpb24iKSYmanQhPT1yfHxqdCE9PW51bGwmJmVtKGp0KSkpaWYoaGUocykpe3ZhciBCPXMuYW5jaG9yLGFlPXMuZm9jdXMsSD1CLmtleSxHPWFlLmtleSxDPWJjKGUsSCksJD1iYyhlLEcpLEU9Qi5vZmZzZXQsQT1hZS5vZmZzZXQsUj1zLmZvcm1hdCx6PXMuc3R5bGUsVj1zLmlzQ29sbGFwc2VkKCksaWU9QyxuZT0kLENlPSExO2lmKEIudHlwZT09PSJ0ZXh0Iil7aWU9JGMoQyk7bGV0IFN0PUIuZ2V0Tm9kZSgpO0NlPVN0LmdldEZvcm1hdCgpIT09Unx8U3QuZ2V0U3R5bGUoKSE9PXp9ZWxzZSBoZShsKSYmbC5hbmNob3IudHlwZT09PSJ0ZXh0IiYmKENlPSEwKTtpZihhZS50eXBlPT09InRleHQiJiYobmU9JGMoJCkpLGllIT09bnVsbCYmbmUhPT1udWxsKXtpZihWJiYobD09PW51bGx8fENlfHxoZShsKSYmKGwuZm9ybWF0IT09Unx8bC5zdHlsZSE9PXopKSl7dmFyIHdlPXBlcmZvcm1hbmNlLm5vdygpO0dfPVtSLHosRSxILHdlXX1pZihfdD09PUUmJnZuPT09QSYmaHQ9PT1pZSYmcHQ9PT1uZSYmKGoudHlwZSE9PSJSYW5nZSJ8fCFWKSYmKGp0IT09bnVsbCYmci5jb250YWlucyhqdCl8fHIuZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KSxCLnR5cGUhPT0iZWxlbWVudCIpKWJyZWFrIGU7dHJ5e2ouc2V0QmFzZUFuZEV4dGVudChpZSxFLG5lLEEpfWNhdGNoe31pZighay5oYXMoInNraXAtc2Nyb2xsLWludG8tdmlldyIpJiZzLmlzQ29sbGFwc2VkKCkmJnIhPT1udWxsJiZyPT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCl7bGV0IFN0PXMgaW5zdGFuY2VvZiBSaSYmcy5hbmNob3IudHlwZT09PSJlbGVtZW50Ij9pZS5jaGlsZE5vZGVzW0VdfHxudWxsOjA8ai5yYW5nZUNvdW50P2ouZ2V0UmFuZ2VBdCgwKTpudWxsO2lmKFN0IT09bnVsbCl7bGV0IEF0O2lmKFN0IGluc3RhbmNlb2YgVGV4dCl7bGV0IEZ0PWRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7RnQuc2VsZWN0Tm9kZShTdCksQXQ9RnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9ZWxzZSBBdD1TdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtsZXQgbHI9ci5vd25lckRvY3VtZW50LHp0PWxyLmRlZmF1bHRWaWV3O2lmKHp0IT09bnVsbClmb3IodmFye3RvcDpYLGJvdHRvbTpiZX09QXQsZmUsX2UsdmU9cjt2ZSE9PW51bGw7KXtsZXQgRnQ9dmU9PT1sci5ib2R5O2lmKEZ0KWZlPTAsX2U9Z2QoZSkuaW5uZXJIZWlnaHQ7ZWxzZXtsZXQgVm89dmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZmU9Vm8udG9wLF9lPVZvLmJvdHRvbX1sZXQgc3I9MDtpZihYPGZlP3NyPS0oZmUtWCk6YmU+X2UmJihzcj1iZS1fZSksc3IhPT0wKWlmKEZ0KXp0LnNjcm9sbEJ5KDAsc3IpO2Vsc2V7bGV0IFZvPXZlLnNjcm9sbFRvcDt2ZS5zY3JvbGxUb3ArPXNyO2xldCBIYT12ZS5zY3JvbGxUb3AtVm87WC09SGEsYmUtPUhhfWlmKEZ0KWJyZWFrO3ZlPXBkKHZlKX19fWFwPSEwfX1lbHNlIGwhPT1udWxsJiZEYShlLGh0LHB0KSYmai5yZW1vdmVBbGxSYW5nZXMoKX19ZTp7bGV0IE5lPWUuX2Jsb2NrQ3Vyc29yRWxlbWVudDtpZihoZShzKSYmcy5pc0NvbGxhcHNlZCgpJiZzLmFuY2hvci50eXBlPT09ImVsZW1lbnQiJiZyLmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKXtsZXQgaHQ9cy5hbmNob3IscHQ9aHQuZ2V0Tm9kZSgpLF90PWh0Lm9mZnNldCx2bj1wdC5nZXRDaGlsZHJlblNpemUoKSxqdD0hMSxTdD1udWxsO2lmKF90PT09dm4pe2xldCBBdD1wdC5nZXRDaGlsZEF0SW5kZXgoX3QtMSk7eGYoQXQpJiYoanQ9ITApfWVsc2V7bGV0IEF0PXB0LmdldENoaWxkQXRJbmRleChfdCk7aWYoeGYoQXQpKXtsZXQgbHI9QXQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7KGxyPT09bnVsbHx8eGYobHIpKSYmKGp0PSEwLFN0PWUuZ2V0RWxlbWVudEJ5S2V5KEF0Ll9fa2V5KSl9fWlmKGp0KXtsZXQgQXQ9ZS5nZXRFbGVtZW50QnlLZXkocHQuX19rZXkpO2lmKE5lPT09bnVsbCl7bGV0IGxyPWUuX2NvbmZpZy50aGVtZSx6dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt6dC5jb250ZW50RWRpdGFibGU9ImZhbHNlIix6dC5zZXRBdHRyaWJ1dGUoImRhdGEtbGV4aWNhbC1jdXJzb3IiLCJ0cnVlIik7bGV0IEZ0PWxyLmJsb2NrQ3Vyc29yO2lmKEZ0IT09dm9pZCAwKXtpZih0eXBlb2YgRnQ9PSJzdHJpbmciKXtsZXQgc3I9RnQuc3BsaXQoIiAiKTtGdD1sci5ibG9ja0N1cnNvcj1zcn1GdCE9PXZvaWQgMCYmenQuY2xhc3NMaXN0LmFkZCguLi5GdCl9ZS5fYmxvY2tDdXJzb3JFbGVtZW50PU5lPXp0fXIuc3R5bGUuY2FyZXRDb2xvcj0idHJhbnNwYXJlbnQiLFN0PT09bnVsbD9BdC5hcHBlbmRDaGlsZChOZSk6QXQuaW5zZXJ0QmVmb3JlKE5lLFN0KTticmVhayBlfX1OZSE9PW51bGwmJmVwKE5lLGUscil9aCE9PW51bGwmJmgub2JzZXJ2ZShyLEJ5KX1maW5hbGx5e2J0PWQsVHQ9dX19aWYobSE9PW51bGwpe3ZhciBUZT1tO2xldCBOZT1BcnJheS5mcm9tKGUuX2xpc3RlbmVycy5tdXRhdGlvbiksaHQ9TmUubGVuZ3RoO2ZvcihsZXQgcHQ9MDtwdDxodDtwdCsrKXtsZXRbX3Qsdm5dPU5lW3B0XSxqdD1UZS5nZXQodm4pO2p0IT09dm9pZCAwJiZfdChqdCx7ZGlydHlMZWF2ZXM6eSxwcmV2RWRpdG9yU3RhdGU6aSx1cGRhdGVUYWdzOmt9KX19aGUocyl8fHM9PT1udWxsfHxsIT09bnVsbCYmbC5pcyhzKXx8ZS5kaXNwYXRjaENvbW1hbmQoZGQsdm9pZCAwKTt2YXIgQmU9ZS5fcGVuZGluZ0RlY29yYXRvcnM7QmUhPT1udWxsJiYoZS5fZGVjb3JhdG9ycz1CZSxlLl9wZW5kaW5nRGVjb3JhdG9ycz1udWxsLFdzKCJkZWNvcmF0b3IiLGUsITAsQmUpKTt2YXIgT3Q9a3kodHx8aSksdW49a3kobik7aWYoT3QhPT11biYmV3MoInRleHRjb250ZW50IixlLCEwLHVuKSxXcygidXBkYXRlIixlLCEwLHtkaXJ0eUVsZW1lbnRzOngsZGlydHlMZWF2ZXM6eSxlZGl0b3JTdGF0ZTpuLG5vcm1hbGl6ZWROb2Rlczp3LHByZXZFZGl0b3JTdGF0ZTp0fHxpLHRhZ3M6a30pLGUuX2RlZmVycmVkPVtdLGIubGVuZ3RoIT09MCl7bGV0IE5lPWUuX3VwZGF0aW5nO2UuX3VwZGF0aW5nPSEwO3RyeXtmb3IobGV0IGh0PTA7aHQ8Yi5sZW5ndGg7aHQrKyliW2h0XSgpfWZpbmFsbHl7ZS5fdXBkYXRpbmc9TmV9fXZhciBPbj1lLl91cGRhdGVzO2lmKE9uLmxlbmd0aCE9PTApe2xldCBOZT1Pbi5zaGlmdCgpO2lmKE5lKXtsZXRbaHQscHRdPU5lO3JTKGUsaHQscHQpfX19fWZ1bmN0aW9uIFdzKGUsdCxuLC4uLnIpe2xldCBvPXQuX3VwZGF0aW5nO3QuX3VwZGF0aW5nPW47dHJ5e2xldCBpPUFycmF5LmZyb20odC5fbGlzdGVuZXJzW2VdKTtmb3IoZT0wO2U8aS5sZW5ndGg7ZSsrKWlbZV0uYXBwbHkobnVsbCxyKX1maW5hbGx5e3QuX3VwZGF0aW5nPW99fWZ1bmN0aW9uIEooZSx0LG4pe2lmKGUuX3VwZGF0aW5nPT09ITF8fGJ0IT09ZSl7bGV0IGk9ITE7cmV0dXJuIGUudXBkYXRlKCgpPT57aT1KKGUsdCxuKX0pLGl9bGV0IHI9bm0oZSk7Zm9yKGxldCBpPTQ7MDw9aTtpLS0pZm9yKGxldCBsPTA7bDxyLmxlbmd0aDtsKyspe3ZhciBvPXJbbF0uX2NvbW1hbmRzLmdldCh0KTtpZihvIT09dm9pZCAwJiYobz1vW2ldLG8hPT12b2lkIDApKXtvPUFycmF5LmZyb20obyk7bGV0IHM9by5sZW5ndGg7Zm9yKGxldCBhPTA7YTxzO2ErKylpZihvW2FdKG4sZSk9PT0hMClyZXR1cm4hMH19cmV0dXJuITF9ZnVuY3Rpb24gVnkoZSx0KXtsZXQgbj1lLl91cGRhdGVzO2Zvcih0PXR8fCExO24ubGVuZ3RoIT09MDspe3ZhciByPW4uc2hpZnQoKTtpZihyKXtsZXRbbyxpXT1yLGw7aSE9PXZvaWQgMCYmKHI9aS5vblVwZGF0ZSxsPWkudGFnLGkuc2tpcFRyYW5zZm9ybXMmJih0PSEwKSxyJiZlLl9kZWZlcnJlZC5wdXNoKHIpLGwmJmUuX3VwZGF0ZVRhZ3MuYWRkKGwpKSxvKCl9fXJldHVybiB0fWZ1bmN0aW9uIHJTKGUsdCxuKXtsZXQgcj1lLl91cGRhdGVUYWdzO3ZhciBvLGk9bz0hMTtpZihuIT09dm9pZCAwKXt2YXIgbD1uLm9uVXBkYXRlO289bi50YWcsbyE9bnVsbCYmci5hZGQobyksbz1uLnNraXBUcmFuc2Zvcm1zfHwhMSxpPW4uZGlzY3JldGV8fCExfWwmJmUuX2RlZmVycmVkLnB1c2gobCksbj1lLl9lZGl0b3JTdGF0ZSxsPWUuX3BlbmRpbmdFZGl0b3JTdGF0ZTtsZXQgcz0hMTsobD09PW51bGx8fGwuX3JlYWRPbmx5KSYmKGw9ZS5fcGVuZGluZ0VkaXRvclN0YXRlPW5ldyBfZChuZXcgTWFwKChsfHxuKS5fbm9kZU1hcCkpLHM9ITApLGwuX2ZsdXNoU3luYz1pLGk9VHQ7bGV0IGE9bW4sdT1idCxjPWUuX3VwZGF0aW5nO1R0PWwsbW49ITEsZS5fdXBkYXRpbmc9ITAsYnQ9ZTt0cnl7cyYmKGUuX2hlYWRsZXNzP24uX3NlbGVjdGlvbiE9bnVsbCYmKGwuX3NlbGVjdGlvbj1uLl9zZWxlY3Rpb24uY2xvbmUoKSk6bC5fc2VsZWN0aW9uPVAyKGUpKTtsZXQgZD1lLl9jb21wb3NpdGlvbktleTt0KCksbz1WeShlLG8pLE8yKGwsZSksZS5fZGlydHlUeXBlIT09MCYmKG8/QTIobCxlKTpNMihsLGUpLFZ5KGUpLGcyKG4sbCxlLl9kaXJ0eUxlYXZlcyxlLl9kaXJ0eUVsZW1lbnRzKSksZCE9PWUuX2NvbXBvc2l0aW9uS2V5JiYobC5fZmx1c2hTeW5jPSEwKTtsZXQgZj1sLl9zZWxlY3Rpb247aWYoaGUoZikpe2xldCBoPWwuX25vZGVNYXAsbT1mLmZvY3VzLmtleTtoLmdldChmLmFuY2hvci5rZXkpIT09dm9pZCAwJiZoLmdldChtKSE9PXZvaWQgMHx8SygxOSl9ZWxzZSBWbChmKSYmZi5fbm9kZXMuc2l6ZT09PTAmJihsLl9zZWxlY3Rpb249bnVsbCl9Y2F0Y2goZCl7ZCBpbnN0YW5jZW9mIEVycm9yJiZlLl9vbkVycm9yKGQpLGUuX3BlbmRpbmdFZGl0b3JTdGF0ZT1uLGUuX2RpcnR5VHlwZT0yLGUuX2Nsb25lTm90TmVlZGVkLmNsZWFyKCksZS5fZGlydHlMZWF2ZXM9bmV3IFNldCxlLl9kaXJ0eUVsZW1lbnRzLmNsZWFyKCksYWkoZSk7cmV0dXJufWZpbmFsbHl7VHQ9aSxtbj1hLGJ0PXUsZS5fdXBkYXRpbmc9Yyx3YT0wfWUuX2RpcnR5VHlwZSE9PTB8fEwyKGwsZSk/bC5fZmx1c2hTeW5jPyhsLl9mbHVzaFN5bmM9ITEsYWkoZSkpOnMmJmQyKCgpPT57YWkoZSl9KToobC5fZmx1c2hTeW5jPSExLHMmJihyLmNsZWFyKCksZS5fZGVmZXJyZWQ9W10sZS5fcGVuZGluZ0VkaXRvclN0YXRlPW51bGwpKX1mdW5jdGlvbiBibihlLHQsbil7ZS5fdXBkYXRpbmc/ZS5fdXBkYXRlcy5wdXNoKFt0LG5dKTpyUyhlLHQsbil9Y2xhc3Mgb1MgZXh0ZW5kcyB6YXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1kZWNvcmF0ZSgpe0soNDcpfWlzSXNvbGF0ZWQoKXtyZXR1cm4hMX1pc0lubGluZSgpe3JldHVybiEwfWlzS2V5Ym9hcmRTZWxlY3RhYmxlKCl7cmV0dXJuITB9fWZ1bmN0aW9uIFZlKGUpe3JldHVybiBlIGluc3RhbmNlb2Ygb1N9Y2xhc3MgUGkgZXh0ZW5kcyB6YXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLl9fbGFzdD10aGlzLl9fZmlyc3Q9bnVsbCx0aGlzLl9faW5kZW50PXRoaXMuX19mb3JtYXQ9dGhpcy5fX3NpemU9MCx0aGlzLl9fZGlyPW51bGx9Z2V0Rm9ybWF0KCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19mb3JtYXR9Z2V0Rm9ybWF0VHlwZSgpe2xldCB0PXRoaXMuZ2V0Rm9ybWF0KCk7cmV0dXJuIGkyW3RdfHwiIn1nZXRJbmRlbnQoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2luZGVudH1nZXRDaGlsZHJlbigpe2xldCB0PVtdLG49dGhpcy5nZXRGaXJzdENoaWxkKCk7Zm9yKDtuIT09bnVsbDspdC5wdXNoKG4pLG49bi5nZXROZXh0U2libGluZygpO3JldHVybiB0fWdldENoaWxkcmVuS2V5cygpe2xldCB0PVtdLG49dGhpcy5nZXRGaXJzdENoaWxkKCk7Zm9yKDtuIT09bnVsbDspdC5wdXNoKG4uX19rZXkpLG49bi5nZXROZXh0U2libGluZygpO3JldHVybiB0fWdldENoaWxkcmVuU2l6ZSgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fc2l6ZX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wfWlzRGlydHkoKXtsZXQgdD10dCgpLl9kaXJ0eUVsZW1lbnRzO3JldHVybiB0IT09bnVsbCYmdC5oYXModGhpcy5fX2tleSl9aXNMYXN0Q2hpbGQoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpLG49dGhpcy5nZXRQYXJlbnRPclRocm93KCkuZ2V0TGFzdENoaWxkKCk7cmV0dXJuIG4hPT1udWxsJiZuLmlzKHQpfWdldEFsbFRleHROb2Rlcygpe2xldCB0PVtdLG49dGhpcy5nZXRGaXJzdENoaWxkKCk7Zm9yKDtuIT09bnVsbDspe2lmKFoobikmJnQucHVzaChuKSxXKG4pKXtsZXQgcj1uLmdldEFsbFRleHROb2RlcygpO3QucHVzaCguLi5yKX1uPW4uZ2V0TmV4dFNpYmxpbmcoKX1yZXR1cm4gdH1nZXRGaXJzdERlc2NlbmRhbnQoKXtsZXQgdD10aGlzLmdldEZpcnN0Q2hpbGQoKTtmb3IoO3QhPT1udWxsOyl7aWYoVyh0KSl7bGV0IG49dC5nZXRGaXJzdENoaWxkKCk7aWYobiE9PW51bGwpe3Q9bjtjb250aW51ZX19YnJlYWt9cmV0dXJuIHR9Z2V0TGFzdERlc2NlbmRhbnQoKXtsZXQgdD10aGlzLmdldExhc3RDaGlsZCgpO2Zvcig7dCE9PW51bGw7KXtpZihXKHQpKXtsZXQgbj10LmdldExhc3RDaGlsZCgpO2lmKG4hPT1udWxsKXt0PW47Y29udGludWV9fWJyZWFrfXJldHVybiB0fWdldERlc2NlbmRhbnRCeUluZGV4KHQpe2xldCBuPXRoaXMuZ2V0Q2hpbGRyZW4oKSxyPW4ubGVuZ3RoO3JldHVybiB0Pj1yPyh0PW5bci0xXSxXKHQpJiZ0LmdldExhc3REZXNjZW5kYW50KCl8fHR8fG51bGwpOih0PW5bdF0sVyh0KSYmdC5nZXRGaXJzdERlc2NlbmRhbnQoKXx8dHx8bnVsbCl9Z2V0Rmlyc3RDaGlsZCgpe2xldCB0PXRoaXMuZ2V0TGF0ZXN0KCkuX19maXJzdDtyZXR1cm4gdD09PW51bGw/bnVsbDprdCh0KX1nZXRGaXJzdENoaWxkT3JUaHJvdygpe2xldCB0PXRoaXMuZ2V0Rmlyc3RDaGlsZCgpO3JldHVybiB0PT09bnVsbCYmSyg0NSx0aGlzLl9fa2V5KSx0fWdldExhc3RDaGlsZCgpe2xldCB0PXRoaXMuZ2V0TGF0ZXN0KCkuX19sYXN0O3JldHVybiB0PT09bnVsbD9udWxsOmt0KHQpfWdldExhc3RDaGlsZE9yVGhyb3coKXtsZXQgdD10aGlzLmdldExhc3RDaGlsZCgpO3JldHVybiB0PT09bnVsbCYmSyg5Nix0aGlzLl9fa2V5KSx0fWdldENoaWxkQXRJbmRleCh0KXt2YXIgbj10aGlzLmdldENoaWxkcmVuU2l6ZSgpO2xldCByO2lmKHQ8bi8yKXtmb3Iocj10aGlzLmdldEZpcnN0Q2hpbGQoKSxuPTA7ciE9PW51bGwmJm48PXQ7KXtpZihuPT09dClyZXR1cm4gcjtyPXIuZ2V0TmV4dFNpYmxpbmcoKSxuKyt9cmV0dXJuIG51bGx9Zm9yKHI9dGhpcy5nZXRMYXN0Q2hpbGQoKSwtLW47ciE9PW51bGwmJm4+PXQ7KXtpZihuPT09dClyZXR1cm4gcjtyPXIuZ2V0UHJldmlvdXNTaWJsaW5nKCksbi0tfXJldHVybiBudWxsfWdldFRleHRDb250ZW50KCl7bGV0IHQ9IiIsbj10aGlzLmdldENoaWxkcmVuKCkscj1uLmxlbmd0aDtmb3IobGV0IG89MDtvPHI7bysrKXtsZXQgaT1uW29dO3QrPWkuZ2V0VGV4dENvbnRlbnQoKSxXKGkpJiZvIT09ci0xJiYhaS5pc0lubGluZSgpJiYodCs9YAoKYCl9cmV0dXJuIHR9Z2V0VGV4dENvbnRlbnRTaXplKCl7bGV0IHQ9MCxuPXRoaXMuZ2V0Q2hpbGRyZW4oKSxyPW4ubGVuZ3RoO2ZvcihsZXQgbz0wO288cjtvKyspe2xldCBpPW5bb107dCs9aS5nZXRUZXh0Q29udGVudFNpemUoKSxXKGkpJiZvIT09ci0xJiYhaS5pc0lubGluZSgpJiYodCs9Mil9cmV0dXJuIHR9Z2V0RGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19kaXJ9aGFzRm9ybWF0KHQpe3JldHVybiB0IT09IiI/KHQ9U3lbdF0sKHRoaXMuZ2V0Rm9ybWF0KCkmdCkhPT0wKTohMX1zZWxlY3QodCxuKXtlbigpO2xldCByPUtlKCksbz10LGk9bjt2YXIgbD10aGlzLmdldENoaWxkcmVuU2l6ZSgpO2lmKCF0aGlzLmNhbkJlRW1wdHkoKSl7aWYodD09PTAmJm49PT0wKXtpZih0PXRoaXMuZ2V0Rmlyc3RDaGlsZCgpLFoodCl8fFcodCkpcmV0dXJuIHQuc2VsZWN0KDAsMCl9ZWxzZSBpZighKHQhPT12b2lkIDAmJnQhPT1sfHxuIT09dm9pZCAwJiZuIT09bCkmJih0PXRoaXMuZ2V0TGFzdENoaWxkKCksWih0KXx8Vyh0KSkpcmV0dXJuIHQuc2VsZWN0KCl9aWYobz09PXZvaWQgMCYmKG89bCksaT09PXZvaWQgMCYmKGk9bCksbD10aGlzLl9fa2V5LGhlKHIpKXIuYW5jaG9yLnNldChsLG8sImVsZW1lbnQiKSxyLmZvY3VzLnNldChsLGksImVsZW1lbnQiKSxyLmRpcnR5PSEwO2Vsc2UgcmV0dXJuIGVTKGwsbyxsLGksImVsZW1lbnQiLCJlbGVtZW50Iik7cmV0dXJuIHJ9c2VsZWN0U3RhcnQoKXtsZXQgdD10aGlzLmdldEZpcnN0RGVzY2VuZGFudCgpO3JldHVybiBXKHQpfHxaKHQpP3Quc2VsZWN0KDAsMCk6dCE9PW51bGw/dC5zZWxlY3RQcmV2aW91cygpOnRoaXMuc2VsZWN0KDAsMCl9c2VsZWN0RW5kKCl7bGV0IHQ9dGhpcy5nZXRMYXN0RGVzY2VuZGFudCgpO3JldHVybiBXKHQpfHxaKHQpP3Quc2VsZWN0KCk6dCE9PW51bGw/dC5zZWxlY3ROZXh0KCk6dGhpcy5zZWxlY3QoKX1jbGVhcigpe2xldCB0PXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2gobj0+bi5yZW1vdmUoKSksdH1hcHBlbmQoLi4udCl7cmV0dXJuIHRoaXMuc3BsaWNlKHRoaXMuZ2V0Q2hpbGRyZW5TaXplKCksMCx0KX1zZXREaXJlY3Rpb24odCl7bGV0IG49dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiBuLl9fZGlyPXQsbn1zZXRGb3JtYXQodCl7cmV0dXJuIHRoaXMuZ2V0V3JpdGFibGUoKS5fX2Zvcm1hdD10IT09IiI/U3lbdF06MCx0aGlzfXNldEluZGVudCh0KXtyZXR1cm4gdGhpcy5nZXRXcml0YWJsZSgpLl9faW5kZW50PXQsdGhpc31zcGxpY2UodCxuLHIpe2xldCBvPXIubGVuZ3RoLGk9dGhpcy5nZXRDaGlsZHJlblNpemUoKSxsPXRoaXMuZ2V0V3JpdGFibGUoKSxzPWwuX19rZXk7dmFyIGE9W10sdT1bXTtsZXQgYz10aGlzLmdldENoaWxkQXRJbmRleCh0K24pLGQ9bnVsbCxmPWktbitvO2lmKHQhPT0wKWlmKHQ9PT1pKWQ9dGhpcy5nZXRMYXN0Q2hpbGQoKTtlbHNle3ZhciBoPXRoaXMuZ2V0Q2hpbGRBdEluZGV4KHQpO2ghPT1udWxsJiYoZD1oLmdldFByZXZpb3VzU2libGluZygpKX1pZigwPG4pe3ZhciBtPWQ9PT1udWxsP3RoaXMuZ2V0Rmlyc3RDaGlsZCgpOmQuZ2V0TmV4dFNpYmxpbmcoKTtmb3IoaD0wO2g8bjtoKyspe209PT1udWxsJiZLKDEwMCk7dmFyIGc9bS5nZXROZXh0U2libGluZygpLFM9bS5fX2tleTttPW0uZ2V0V3JpdGFibGUoKSxzaShtKSx1LnB1c2goUyksbT1nfX1mb3IoaD1kLGc9MDtnPG87ZysrKXtTPXJbZ10saCE9PW51bGwmJlMuaXMoaCkmJihkPWg9aC5nZXRQcmV2aW91c1NpYmxpbmcoKSksbT1TLmdldFdyaXRhYmxlKCksbS5fX3BhcmVudD09PXMmJmYtLSxzaShtKTtsZXQgdj1TLl9fa2V5O2g9PT1udWxsPyhsLl9fZmlyc3Q9dixtLl9fcHJldj1udWxsKTooaD1oLmdldFdyaXRhYmxlKCksaC5fX25leHQ9dixtLl9fcHJldj1oLl9fa2V5KSxTLl9fa2V5PT09cyYmSyg3NiksbS5fX3BhcmVudD1zLGEucHVzaCh2KSxoPVN9aWYodCtuPT09aT9oIT09bnVsbCYmKGguZ2V0V3JpdGFibGUoKS5fX25leHQ9bnVsbCxsLl9fbGFzdD1oLl9fa2V5KTpjIT09bnVsbCYmKHQ9Yy5nZXRXcml0YWJsZSgpLGghPT1udWxsPyhuPWguZ2V0V3JpdGFibGUoKSx0Ll9fcHJldj1oLl9fa2V5LG4uX19uZXh0PWMuX19rZXkpOnQuX19wcmV2PW51bGwpLGwuX19zaXplPWYsdS5sZW5ndGgmJih0PUtlKCksaGUodCkpKXt1PW5ldyBTZXQodSksYT1uZXcgU2V0KGEpO2xldHthbmNob3I6dixmb2N1czp5fT10O0h5KHYsdSxhKSYmQWModix2LmdldE5vZGUoKSx0aGlzLGQsYyksSHkoeSx1LGEpJiZBYyh5LHkuZ2V0Tm9kZSgpLHRoaXMsZCxjKSxmIT09MHx8dGhpcy5jYW5CZUVtcHR5KCl8fGVyKHRoaXMpfHx0aGlzLnJlbW92ZSgpfXJldHVybiBsfWV4cG9ydEpTT04oKXtyZXR1cm57Y2hpbGRyZW46W10sZGlyZWN0aW9uOnRoaXMuZ2V0RGlyZWN0aW9uKCksZm9ybWF0OnRoaXMuZ2V0Rm9ybWF0VHlwZSgpLGluZGVudDp0aGlzLmdldEluZGVudCgpLHR5cGU6ImVsZW1lbnQiLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIoKXtyZXR1cm4gbnVsbH1jYW5JbmRlbnQoKXtyZXR1cm4hMH1jb2xsYXBzZUF0U3RhcnQoKXtyZXR1cm4hMX1leGNsdWRlRnJvbUNvcHkoKXtyZXR1cm4hMX1jYW5FeHRyYWN0Q29udGVudHMoKXtyZXR1cm4hMH1jYW5SZXBsYWNlV2l0aCgpe3JldHVybiEwfWNhbkluc2VydEFmdGVyKCl7cmV0dXJuITB9Y2FuQmVFbXB0eSgpe3JldHVybiEwfWNhbkluc2VydFRleHRCZWZvcmUoKXtyZXR1cm4hMH1jYW5JbnNlcnRUZXh0QWZ0ZXIoKXtyZXR1cm4hMH1pc0lubGluZSgpe3JldHVybiExfWlzU2hhZG93Um9vdCgpe3JldHVybiExfWNhbk1lcmdlV2l0aCgpe3JldHVybiExfWV4dHJhY3RXaXRoQ2hpbGQoKXtyZXR1cm4hMX19ZnVuY3Rpb24gVyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFBpfWZ1bmN0aW9uIEh5KGUsdCxuKXtmb3IoZT1lLmdldE5vZGUoKTtlOyl7bGV0IHI9ZS5fX2tleTtpZih0LmhhcyhyKSYmIW4uaGFzKHIpKXJldHVybiEwO2U9ZS5nZXRQYXJlbnQoKX1yZXR1cm4hMX1jbGFzcyBHbCBleHRlbmRzIFBpe3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInJvb3QifXN0YXRpYyBjbG9uZSgpe3JldHVybiBuZXcgR2x9Y29uc3RydWN0b3IoKXtzdXBlcigicm9vdCIpLHRoaXMuX19jYWNoZWRUZXh0PW51bGx9Z2V0VG9wTGV2ZWxFbGVtZW50T3JUaHJvdygpe0soNTEpfWdldFRleHRDb250ZW50KCl7bGV0IHQ9dGhpcy5fX2NhY2hlZFRleHQ7cmV0dXJuIUtsKCkmJnR0KCkuX2RpcnR5VHlwZSE9PTB8fHQ9PT1udWxsP3N1cGVyLmdldFRleHRDb250ZW50KCk6dH1yZW1vdmUoKXtLKDUyKX1yZXBsYWNlKCl7Syg1Myl9aW5zZXJ0QmVmb3JlKCl7Syg1NCl9aW5zZXJ0QWZ0ZXIoKXtLKDU1KX11cGRhdGVET00oKXtyZXR1cm4hMX1hcHBlbmQoLi4udCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCByPXRbbl07VyhyKXx8VmUocil8fEsoNTYpfXJldHVybiBzdXBlci5hcHBlbmQoLi4udCl9c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49Q3IoKTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1leHBvcnRKU09OKCl7cmV0dXJue2NoaWxkcmVuOltdLGRpcmVjdGlvbjp0aGlzLmdldERpcmVjdGlvbigpLGZvcm1hdDp0aGlzLmdldEZvcm1hdFR5cGUoKSxpbmRlbnQ6dGhpcy5nZXRJbmRlbnQoKSx0eXBlOiJyb290Iix2ZXJzaW9uOjF9fWNvbGxhcHNlQXRTdGFydCgpe3JldHVybiEwfX1mdW5jdGlvbiBubihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEdsfWZ1bmN0aW9uIEwyKGUsdCl7aWYodD10LmdldEVkaXRvclN0YXRlKCkuX3NlbGVjdGlvbixlPWUuX3NlbGVjdGlvbixlIT09bnVsbCl7aWYoZS5kaXJ0eXx8IWUuaXModCkpcmV0dXJuITB9ZWxzZSBpZih0IT09bnVsbClyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBjbSgpe3JldHVybiBuZXcgX2QobmV3IE1hcChbWyJyb290IixuZXcgR2xdXSkpfWZ1bmN0aW9uIGlTKGUpe2xldCB0PWUuZXhwb3J0SlNPTigpO3ZhciBuPWUuY29uc3RydWN0b3I7dC50eXBlIT09bi5nZXRUeXBlKCkmJksoMTMwLG4ubmFtZSk7bGV0IHI9dC5jaGlsZHJlbjtpZihXKGUpKWZvcihBcnJheS5pc0FycmF5KHIpfHxLKDU5LG4ubmFtZSksZT1lLmdldENoaWxkcmVuKCksbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgbz1pUyhlW25dKTtyLnB1c2gobyl9cmV0dXJuIHR9Y2xhc3MgX2R7Y29uc3RydWN0b3IodCxuKXt0aGlzLl9ub2RlTWFwPXQsdGhpcy5fc2VsZWN0aW9uPW58fG51bGwsdGhpcy5fcmVhZE9ubHk9dGhpcy5fZmx1c2hTeW5jPSExfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5fbm9kZU1hcC5zaXplPT09MSYmdGhpcy5fc2VsZWN0aW9uPT09bnVsbH1yZWFkKHQpe3JldHVybiBVeSh0aGlzLHQpfWNsb25lKHQpe3JldHVybiB0PW5ldyBfZCh0aGlzLl9ub2RlTWFwLHQ9PT12b2lkIDA/dGhpcy5fc2VsZWN0aW9uOnQpLHQuX3JlYWRPbmx5PSEwLHR9dG9KU09OKCl7cmV0dXJuIFV5KHRoaXMsKCk9Pih7cm9vdDppUyhDcigpKX0pKX19Y2xhc3MgWWwgZXh0ZW5kcyBQaXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJwYXJhZ3JhcGgifXN0YXRpYyBjbG9uZSh0KXtyZXR1cm4gbmV3IFlsKHQuX19rZXkpfWNyZWF0ZURPTSh0KXtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIik7cmV0dXJuIHQ9enModC50aGVtZSwicGFyYWdyYXBoIiksdCE9PXZvaWQgMCYmbi5jbGFzc0xpc3QuYWRkKC4uLnQpLG59dXBkYXRlRE9NKCl7cmV0dXJuITF9c3RhdGljIGltcG9ydERPTSgpe3JldHVybntwOigpPT4oe2NvbnZlcnNpb246RDIscHJpb3JpdHk6MH0pfX1leHBvcnRET00odCl7aWYoe2VsZW1lbnQ6dH09c3VwZXIuZXhwb3J0RE9NKHQpLHQmJm1kKHQpKXt0aGlzLmlzRW1wdHkoKSYmdC5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSk7dmFyIG49dGhpcy5nZXRGb3JtYXRUeXBlKCk7dC5zdHlsZS50ZXh0QWxpZ249biwobj10aGlzLmdldERpcmVjdGlvbigpKSYmKHQuZGlyPW4pLG49dGhpcy5nZXRJbmRlbnQoKSwwPG4mJih0LnN0eWxlLnRleHRJbmRlbnQ9YCR7MjAqbn1weGApfXJldHVybntlbGVtZW50OnR9fXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPXZpKCk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldEluZGVudCh0LmluZGVudCksbi5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdHlwZToicGFyYWdyYXBoIix2ZXJzaW9uOjF9fWluc2VydE5ld0FmdGVyKHQsbil7dD12aSgpO2xldCByPXRoaXMuZ2V0RGlyZWN0aW9uKCk7cmV0dXJuIHQuc2V0RGlyZWN0aW9uKHIpLHRoaXMuaW5zZXJ0QWZ0ZXIodCxuKSx0fWNvbGxhcHNlQXRTdGFydCgpe2xldCB0PXRoaXMuZ2V0Q2hpbGRyZW4oKTtpZih0Lmxlbmd0aD09PTB8fFoodFswXSkmJnRbMF0uZ2V0VGV4dENvbnRlbnQoKS50cmltKCk9PT0iIil7aWYodGhpcy5nZXROZXh0U2libGluZygpIT09bnVsbClyZXR1cm4gdGhpcy5zZWxlY3ROZXh0KCksdGhpcy5yZW1vdmUoKSwhMDtpZih0aGlzLmdldFByZXZpb3VzU2libGluZygpIT09bnVsbClyZXR1cm4gdGhpcy5zZWxlY3RQcmV2aW91cygpLHRoaXMucmVtb3ZlKCksITB9cmV0dXJuITF9fWZ1bmN0aW9uIEQyKGUpe2xldCB0PXZpKCk7cmV0dXJuIGUuc3R5bGUmJih0LnNldEZvcm1hdChlLnN0eWxlLnRleHRBbGlnbiksZT1wYXJzZUludChlLnN0eWxlLnRleHRJbmRlbnQsMTApLzIwLDA8ZSYmdC5zZXRJbmRlbnQoZSkpLHtub2RlOnR9fWZ1bmN0aW9uIHZpKCl7cmV0dXJuIGphKG5ldyBZbCl9ZnVuY3Rpb24gbFMoZSx0LG4scil7bGV0IG89ZS5fa2V5VG9ET01NYXA7by5jbGVhcigpLGUuX2VkaXRvclN0YXRlPWNtKCksZS5fcGVuZGluZ0VkaXRvclN0YXRlPXIsZS5fY29tcG9zaXRpb25LZXk9bnVsbCxlLl9kaXJ0eVR5cGU9MCxlLl9jbG9uZU5vdE5lZWRlZC5jbGVhcigpLGUuX2RpcnR5TGVhdmVzPW5ldyBTZXQsZS5fZGlydHlFbGVtZW50cy5jbGVhcigpLGUuX25vcm1hbGl6ZWROb2Rlcz1uZXcgU2V0LGUuX3VwZGF0ZVRhZ3M9bmV3IFNldCxlLl91cGRhdGVzPVtdLGUuX2Jsb2NrQ3Vyc29yRWxlbWVudD1udWxsLHI9ZS5fb2JzZXJ2ZXIsciE9PW51bGwmJihyLmRpc2Nvbm5lY3QoKSxlLl9vYnNlcnZlcj1udWxsKSx0IT09bnVsbCYmKHQudGV4dENvbnRlbnQ9IiIpLG4hPT1udWxsJiYobi50ZXh0Q29udGVudD0iIixvLnNldCgicm9vdCIsbikpfWZ1bmN0aW9uIEkyKGUpe2xldCB0PW5ldyBNYXAsbj1uZXcgU2V0O3JldHVybiBlLmZvckVhY2gocj0+e2lmKHI9ci5rbGFzcy5pbXBvcnRET00hPW51bGw/ci5rbGFzcy5pbXBvcnRET00uYmluZChyLmtsYXNzKTpudWxsLHIhPW51bGwmJiFuLmhhcyhyKSl7bi5hZGQocik7dmFyIG89cigpO28hPT1udWxsJiZPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGk9PntsZXQgbD10LmdldChpKTtsPT09dm9pZCAwJiYobD1bXSx0LnNldChpLGwpKSxsLnB1c2gob1tpXSl9KX19KSx0fWNsYXNzIGoye2NvbnN0cnVjdG9yKHQsbixyLG8saSxsLHMpe3RoaXMuX3BhcmVudEVkaXRvcj1uLHRoaXMuX3Jvb3RFbGVtZW50PW51bGwsdGhpcy5fZWRpdG9yU3RhdGU9dCx0aGlzLl9jb21wb3NpdGlvbktleT10aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGU9bnVsbCx0aGlzLl9kZWZlcnJlZD1bXSx0aGlzLl9rZXlUb0RPTU1hcD1uZXcgTWFwLHRoaXMuX3VwZGF0ZXM9W10sdGhpcy5fdXBkYXRpbmc9ITEsdGhpcy5fbGlzdGVuZXJzPXtkZWNvcmF0b3I6bmV3IFNldCxlZGl0YWJsZTpuZXcgU2V0LG11dGF0aW9uOm5ldyBNYXAscm9vdDpuZXcgU2V0LHRleHRjb250ZW50Om5ldyBTZXQsdXBkYXRlOm5ldyBTZXR9LHRoaXMuX2NvbW1hbmRzPW5ldyBNYXAsdGhpcy5fY29uZmlnPW8sdGhpcy5fbm9kZXM9cix0aGlzLl9kZWNvcmF0b3JzPXt9LHRoaXMuX3BlbmRpbmdEZWNvcmF0b3JzPW51bGwsdGhpcy5fZGlydHlUeXBlPTAsdGhpcy5fY2xvbmVOb3ROZWVkZWQ9bmV3IFNldCx0aGlzLl9kaXJ0eUxlYXZlcz1uZXcgU2V0LHRoaXMuX2RpcnR5RWxlbWVudHM9bmV3IE1hcCx0aGlzLl9ub3JtYWxpemVkTm9kZXM9bmV3IFNldCx0aGlzLl91cGRhdGVUYWdzPW5ldyBTZXQsdGhpcy5fb2JzZXJ2ZXI9bnVsbCx0aGlzLl9rZXk9QV8oKSx0aGlzLl9vbkVycm9yPWksdGhpcy5faHRtbENvbnZlcnNpb25zPWwsdGhpcy5fZWRpdGFibGU9cyx0aGlzLl9oZWFkbGVzcz1uIT09bnVsbCYmbi5faGVhZGxlc3MsdGhpcy5fYmxvY2tDdXJzb3JFbGVtZW50PXRoaXMuX3dpbmRvdz1udWxsfWlzQ29tcG9zaW5nKCl7cmV0dXJuIHRoaXMuX2NvbXBvc2l0aW9uS2V5IT1udWxsfXJlZ2lzdGVyVXBkYXRlTGlzdGVuZXIodCl7bGV0IG49dGhpcy5fbGlzdGVuZXJzLnVwZGF0ZTtyZXR1cm4gbi5hZGQodCksKCk9PntuLmRlbGV0ZSh0KX19cmVnaXN0ZXJFZGl0YWJsZUxpc3RlbmVyKHQpe2xldCBuPXRoaXMuX2xpc3RlbmVycy5lZGl0YWJsZTtyZXR1cm4gbi5hZGQodCksKCk9PntuLmRlbGV0ZSh0KX19cmVnaXN0ZXJEZWNvcmF0b3JMaXN0ZW5lcih0KXtsZXQgbj10aGlzLl9saXN0ZW5lcnMuZGVjb3JhdG9yO3JldHVybiBuLmFkZCh0KSwoKT0+e24uZGVsZXRlKHQpfX1yZWdpc3RlclRleHRDb250ZW50TGlzdGVuZXIodCl7bGV0IG49dGhpcy5fbGlzdGVuZXJzLnRleHRjb250ZW50O3JldHVybiBuLmFkZCh0KSwoKT0+e24uZGVsZXRlKHQpfX1yZWdpc3RlclJvb3RMaXN0ZW5lcih0KXtsZXQgbj10aGlzLl9saXN0ZW5lcnMucm9vdDtyZXR1cm4gdCh0aGlzLl9yb290RWxlbWVudCxudWxsKSxuLmFkZCh0KSwoKT0+e3QobnVsbCx0aGlzLl9yb290RWxlbWVudCksbi5kZWxldGUodCl9fXJlZ2lzdGVyQ29tbWFuZCh0LG4scil7cj09PXZvaWQgMCYmSygzNSk7bGV0IG89dGhpcy5fY29tbWFuZHM7by5oYXModCl8fG8uc2V0KHQsW25ldyBTZXQsbmV3IFNldCxuZXcgU2V0LG5ldyBTZXQsbmV3IFNldF0pO2xldCBpPW8uZ2V0KHQpO2k9PT12b2lkIDAmJksoMzYsU3RyaW5nKHQpKTtsZXQgbD1pW3JdO3JldHVybiBsLmFkZChuKSwoKT0+e2wuZGVsZXRlKG4pLGkuZXZlcnkocz0+cy5zaXplPT09MCkmJm8uZGVsZXRlKHQpfX1yZWdpc3Rlck11dGF0aW9uTGlzdGVuZXIodCxuKXt0aGlzLl9ub2Rlcy5nZXQodC5nZXRUeXBlKCkpPT09dm9pZCAwJiZLKDM3LHQubmFtZSk7bGV0IHI9dGhpcy5fbGlzdGVuZXJzLm11dGF0aW9uO3JldHVybiByLnNldChuLHQpLCgpPT57ci5kZWxldGUobil9fXJlZ2lzdGVyTm9kZVRyYW5zZm9ybVRvS2xhc3ModCxuKXt2YXIgcj10LmdldFR5cGUoKTtyZXR1cm4gcj10aGlzLl9ub2Rlcy5nZXQocikscj09PXZvaWQgMCYmSygzNyx0Lm5hbWUpLHIudHJhbnNmb3Jtcy5hZGQobikscn1yZWdpc3Rlck5vZGVUcmFuc2Zvcm0odCxuKXt2YXIgcj10aGlzLnJlZ2lzdGVyTm9kZVRyYW5zZm9ybVRvS2xhc3ModCxuKTtsZXQgbz1bcl07cmV0dXJuIHI9ci5yZXBsYWNlV2l0aEtsYXNzLHIhPW51bGwmJihyPXRoaXMucmVnaXN0ZXJOb2RlVHJhbnNmb3JtVG9LbGFzcyhyLG4pLG8ucHVzaChyKSksZjIodGhpcyx0LmdldFR5cGUoKSksKCk9PntvLmZvckVhY2goaT0+aS50cmFuc2Zvcm1zLmRlbGV0ZShuKSl9fWhhc05vZGUodCl7cmV0dXJuIHRoaXMuX25vZGVzLmhhcyh0LmdldFR5cGUoKSl9aGFzTm9kZXModCl7cmV0dXJuIHQuZXZlcnkodGhpcy5oYXNOb2RlLmJpbmQodGhpcykpfWRpc3BhdGNoQ29tbWFuZCh0LG4pe3JldHVybiBKKHRoaXMsdCxuKX1nZXREZWNvcmF0b3JzKCl7cmV0dXJuIHRoaXMuX2RlY29yYXRvcnN9Z2V0Um9vdEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnR9Z2V0S2V5KCl7cmV0dXJuIHRoaXMuX2tleX1zZXRSb290RWxlbWVudCh0KXtsZXQgbj10aGlzLl9yb290RWxlbWVudDtpZih0IT09bil7bGV0IGw9enModGhpcy5fY29uZmlnLnRoZW1lLCJyb290Iik7dmFyIHI9dGhpcy5fcGVuZGluZ0VkaXRvclN0YXRlfHx0aGlzLl9lZGl0b3JTdGF0ZTtpZih0aGlzLl9yb290RWxlbWVudD10LGxTKHRoaXMsbix0LHIpLG4hPT1udWxsKXtpZighdGhpcy5fY29uZmlnLmRpc2FibGVFdmVudHMpe0ZzIT09MCYmKEZzLS0sRnM9PT0wJiZuLm93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIixKXykpO3ZhciBvPW4uX19sZXhpY2FsRWRpdG9yO2lmKG8hPW51bGwpe2lmKG8uX3BhcmVudEVkaXRvciE9PW51bGwpe3ZhciBpPW5tKG8pO2k9aVtpLmxlbmd0aC0xXS5fa2V5LGdsLmdldChpKT09PW8mJmdsLmRlbGV0ZShpKX1lbHNlIGdsLmRlbGV0ZShvLl9rZXkpO24uX19sZXhpY2FsRWRpdG9yPW51bGx9Zm9yKG89UV8obiksaT0wO2k8by5sZW5ndGg7aSsrKW9baV0oKTtuLl9fbGV4aWNhbEV2ZW50SGFuZGxlcz1bXX1sIT1udWxsJiZuLmNsYXNzTGlzdC5yZW1vdmUoLi4ubCl9dCE9PW51bGw/KHI9KHI9dC5vd25lckRvY3VtZW50KSYmci5kZWZhdWx0Vmlld3x8bnVsbCxvPXQuc3R5bGUsby51c2VyU2VsZWN0PSJ0ZXh0IixvLndoaXRlU3BhY2U9InByZS13cmFwIixvLndvcmRCcmVhaz0iYnJlYWstd29yZCIsdC5zZXRBdHRyaWJ1dGUoImRhdGEtbGV4aWNhbC1lZGl0b3IiLCJ0cnVlIiksdGhpcy5fd2luZG93PXIsdGhpcy5fZGlydHlUeXBlPTIsJF8odGhpcyksdGhpcy5fdXBkYXRlVGFncy5hZGQoImhpc3RvcnktbWVyZ2UiKSxhaSh0aGlzKSx0aGlzLl9jb25maWcuZGlzYWJsZUV2ZW50c3x8QzIodCx0aGlzKSxsIT1udWxsJiZ0LmNsYXNzTGlzdC5hZGQoLi4ubCkpOih0aGlzLl9lZGl0b3JTdGF0ZT1yLHRoaXMuX3dpbmRvdz10aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGU9bnVsbCksV3MoInJvb3QiLHRoaXMsITEsdCxuKX19Z2V0RWxlbWVudEJ5S2V5KHQpe3JldHVybiB0aGlzLl9rZXlUb0RPTU1hcC5nZXQodCl8fG51bGx9Z2V0RWRpdG9yU3RhdGUoKXtyZXR1cm4gdGhpcy5fZWRpdG9yU3RhdGV9c2V0RWRpdG9yU3RhdGUodCxuKXt0LmlzRW1wdHkoKSYmSygzOCksQ18odGhpcyk7bGV0IHI9dGhpcy5fcGVuZGluZ0VkaXRvclN0YXRlLG89dGhpcy5fdXBkYXRlVGFncztuPW4hPT12b2lkIDA/bi50YWc6bnVsbCxyPT09bnVsbHx8ci5pc0VtcHR5KCl8fChuIT1udWxsJiZvLmFkZChuKSxhaSh0aGlzKSksdGhpcy5fcGVuZGluZ0VkaXRvclN0YXRlPXQsdGhpcy5fZGlydHlUeXBlPTIsdGhpcy5fZGlydHlFbGVtZW50cy5zZXQoInJvb3QiLCExKSx0aGlzLl9jb21wb3NpdGlvbktleT1udWxsLG4hPW51bGwmJm8uYWRkKG4pLGFpKHRoaXMpfXBhcnNlRWRpdG9yU3RhdGUodCxuKXt0PXR5cGVvZiB0PT0ic3RyaW5nIj9KU09OLnBhcnNlKHQpOnQ7bGV0IHI9Y20oKSxvPVR0LGk9bW4sbD1idCxzPXRoaXMuX2RpcnR5RWxlbWVudHMsYT10aGlzLl9kaXJ0eUxlYXZlcyx1PXRoaXMuX2Nsb25lTm90TmVlZGVkLGM9dGhpcy5fZGlydHlUeXBlO3RoaXMuX2RpcnR5RWxlbWVudHM9bmV3IE1hcCx0aGlzLl9kaXJ0eUxlYXZlcz1uZXcgU2V0LHRoaXMuX2Nsb25lTm90TmVlZGVkPW5ldyBTZXQsdGhpcy5fZGlydHlUeXBlPTAsVHQ9cixtbj0hMSxidD10aGlzO3RyeXt1bSh0LnJvb3QsdGhpcy5fbm9kZXMpLG4mJm4oKSxyLl9yZWFkT25seT0hMH1jYXRjaChkKXtkIGluc3RhbmNlb2YgRXJyb3ImJnRoaXMuX29uRXJyb3IoZCl9ZmluYWxseXt0aGlzLl9kaXJ0eUVsZW1lbnRzPXMsdGhpcy5fZGlydHlMZWF2ZXM9YSx0aGlzLl9jbG9uZU5vdE5lZWRlZD11LHRoaXMuX2RpcnR5VHlwZT1jLFR0PW8sbW49aSxidD1sfXJldHVybiByfXVwZGF0ZSh0LG4pe2JuKHRoaXMsdCxuKX1mb2N1cyh0LG49e30pe2xldCByPXRoaXMuX3Jvb3RFbGVtZW50O3IhPT1udWxsJiYoci5zZXRBdHRyaWJ1dGUoImF1dG9jYXBpdGFsaXplIiwib2ZmIiksYm4odGhpcywoKT0+e2xldCBvPUtlKCksaT1DcigpO28hPT1udWxsP28uZGlydHk9ITA6aS5nZXRDaGlsZHJlblNpemUoKSE9PTAmJihuLmRlZmF1bHRTZWxlY3Rpb249PT0icm9vdFN0YXJ0Ij9pLnNlbGVjdFN0YXJ0KCk6aS5zZWxlY3RFbmQoKSl9LHtvblVwZGF0ZTooKT0+e3IucmVtb3ZlQXR0cmlidXRlKCJhdXRvY2FwaXRhbGl6ZSIpLHQmJnQoKX0sdGFnOiJmb2N1cyJ9KSx0aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGU9PT1udWxsJiZyLnJlbW92ZUF0dHJpYnV0ZSgiYXV0b2NhcGl0YWxpemUiKSl9Ymx1cigpe3ZhciB0PXRoaXMuX3Jvb3RFbGVtZW50O3QhPT1udWxsJiZ0LmJsdXIoKSx0PSRyKHRoaXMuX3dpbmRvdyksdCE9PW51bGwmJnQucmVtb3ZlQWxsUmFuZ2VzKCl9aXNFZGl0YWJsZSgpe3JldHVybiB0aGlzLl9lZGl0YWJsZX1zZXRFZGl0YWJsZSh0KXt0aGlzLl9lZGl0YWJsZSE9PXQmJih0aGlzLl9lZGl0YWJsZT10LFdzKCJlZGl0YWJsZSIsdGhpcywhMCx0KSl9dG9KU09OKCl7cmV0dXJue2VkaXRvclN0YXRlOnRoaXMuX2VkaXRvclN0YXRlLnRvSlNPTigpfX19Y2xhc3MgZG0gZXh0ZW5kcyBQaXtjb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKG4pLHRoaXMuX19jb2xTcGFuPXQsdGhpcy5fX3Jvd1NwYW49MX1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSxjb2xTcGFuOnRoaXMuX19jb2xTcGFuLHJvd1NwYW46dGhpcy5fX3Jvd1NwYW59fWdldENvbFNwYW4oKXtyZXR1cm4gdGhpcy5fX2NvbFNwYW59c2V0Q29sU3Bhbih0KXtyZXR1cm4gdGhpcy5nZXRXcml0YWJsZSgpLl9fY29sU3Bhbj10LHRoaXN9Z2V0Um93U3Bhbigpe3JldHVybiB0aGlzLl9fcm93U3Bhbn1zZXRSb3dTcGFuKHQpe3JldHVybiB0aGlzLmdldFdyaXRhYmxlKCkuX19yb3dTcGFuPXQsdGhpc319ZnVuY3Rpb24gRG4oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBkbX1jbGFzcyBzUyBleHRlbmRzIFBpe31mdW5jdGlvbiBmbShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHNTfWNsYXNzIGFTIGV4dGVuZHMgUGl7fWZ1bmN0aW9uIF9hKGUpe3JldHVybiBlIGluc3RhbmNlb2YgYVN9SS4kYWRkVXBkYXRlVGFnPWZ1bmN0aW9uKGUpe2VuKCksdHQoKS5fdXBkYXRlVGFncy5hZGQoZSl9O0kuJGFwcGx5Tm9kZVJlcGxhY2VtZW50PWphO0kuJGNvcHlOb2RlPURfO0kuJGNyZWF0ZUxpbmVCcmVha05vZGU9Tmw7SS4kY3JlYXRlTm9kZVNlbGVjdGlvbj1wcDtJLiRjcmVhdGVQYXJhZ3JhcGhOb2RlPXZpO0kuJGNyZWF0ZVJhbmdlU2VsZWN0aW9uPWZ1bmN0aW9uKCl7bGV0IGU9bmV3IHdyKCJyb290IiwwLCJlbGVtZW50IiksdD1uZXcgd3IoInJvb3QiLDAsImVsZW1lbnQiKTtyZXR1cm4gbmV3IFJpKGUsdCwwLCIiKX07SS4kY3JlYXRlVGFiTm9kZT15ZDtJLiRjcmVhdGVUZXh0Tm9kZT1DdDtJLiRnZXRBZGphY2VudE5vZGU9cWg7SS4kZ2V0TmVhcmVzdE5vZGVGcm9tRE9NTm9kZT1JYTtJLiRnZXROZWFyZXN0Um9vdE9yU2hhZG93Um9vdD1MXztJLiRnZXROb2RlQnlLZXk9a3Q7SS4kZ2V0UHJldmlvdXNTZWxlY3Rpb249SGw7SS4kZ2V0Um9vdD1DcjtJLiRnZXRTZWxlY3Rpb249S2U7SS4kZ2V0VGV4dENvbnRlbnQ9ZnVuY3Rpb24oKXtsZXQgZT1LZSgpO3JldHVybiBlPT09bnVsbD8iIjplLmdldFRleHRDb250ZW50KCl9O0kuJGhhc0FuY2VzdG9yPU5jO0kuJGhhc1VwZGF0ZVRhZz1mdW5jdGlvbihlKXtyZXR1cm4gdHQoKS5fdXBkYXRlVGFncy5oYXMoZSl9O0kuJGluc2VydE5vZGVzPWZ1bmN0aW9uKGUsdCl7bGV0IG49S2UoKXx8SGwoKTtyZXR1cm4gbj09PW51bGwmJihuPUNyKCkuc2VsZWN0RW5kKCkpLG4uaW5zZXJ0Tm9kZXMoZSx0KX07SS4kaXNCbG9ja0VsZW1lbnROb2RlPWhwO0kuJGlzRGVjb3JhdG9yTm9kZT1WZTtJLiRpc0VsZW1lbnROb2RlPVc7SS4kaXNJbmxpbmVFbGVtZW50T3JEZWNvcmF0b3JOb2RlPWZ1bmN0aW9uKGUpe3JldHVybiBXKGUpJiZlLmlzSW5saW5lKCl8fFZlKGUpJiZlLmlzSW5saW5lKCl9O0kuJGlzTGVhZk5vZGU9Yl87SS4kaXNMaW5lQnJlYWtOb2RlPXhhO0kuJGlzTm9kZVNlbGVjdGlvbj1WbDtJLiRpc1BhcmFncmFwaE5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBZbH07SS4kaXNSYW5nZVNlbGVjdGlvbj1oZTtJLiRpc1Jvb3ROb2RlPW5uO0kuJGlzUm9vdE9yU2hhZG93Um9vdD1lcjtJLiRpc1RhYk5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVbH07SS4kaXNUZXh0Tm9kZT1aO0kuJG5vZGVzT2ZUeXBlPWZ1bmN0aW9uKGUpe3ZhciB0PWtyKCk7bGV0IG49dC5fcmVhZE9ubHkscj1lLmdldFR5cGUoKTt0PXQuX25vZGVNYXA7bGV0IG89W107Zm9yKGxldFssaV1vZiB0KWkgaW5zdGFuY2VvZiBlJiZpLl9fdHlwZT09PXImJihufHxpLmlzQXR0YWNoZWQoKSkmJm8ucHVzaChpKTtyZXR1cm4gb307SS4kbm9ybWFsaXplU2VsZWN0aW9uX19FWFBFUklNRU5UQUw9cWc7SS4kcGFyc2VTZXJpYWxpemVkTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gdW0oZSx0dCgpLl9ub2Rlcyl9O0kuJHNlbGVjdEFsbD1mdW5jdGlvbigpe3ZhciBlPUNyKCk7ZT1lLnNlbGVjdCgwLGUuZ2V0Q2hpbGRyZW5TaXplKCkpLHhyKHFnKGUpKX07SS4kc2V0Q29tcG9zaXRpb25LZXk9THQ7SS4kc2V0U2VsZWN0aW9uPXhyO0kuJHNwbGl0Tm9kZT1JXztJLkJMVVJfQ09NTUFORD1fXztJLkNBTl9SRURPX0NPTU1BTkQ9e307SS5DQU5fVU5ET19DT01NQU5EPXt9O0kuQ0xFQVJfRURJVE9SX0NPTU1BTkQ9e307SS5DTEVBUl9ISVNUT1JZX0NPTU1BTkQ9e307SS5DTElDS19DT01NQU5EPXJfO0kuQ09NTUFORF9QUklPUklUWV9DUklUSUNBTD00O0kuQ09NTUFORF9QUklPUklUWV9FRElUT1I9MDtJLkNPTU1BTkRfUFJJT1JJVFlfSElHSD0zO0kuQ09NTUFORF9QUklPUklUWV9MT1c9MTtJLkNPTU1BTkRfUFJJT1JJVFlfTk9STUFMPTI7SS5DT05UUk9MTEVEX1RFWFRfSU5TRVJUSU9OX0NPTU1BTkQ9cGw7SS5DT1BZX0NPTU1BTkQ9WWc7SS5DVVRfQ09NTUFORD1YZztJLkRFTEVURV9DSEFSQUNURVJfQ09NTUFORD1oYTtJLkRFTEVURV9MSU5FX0NPTU1BTkQ9Z2E7SS5ERUxFVEVfV09SRF9DT01NQU5EPXBhO0kuREVQUkVDQVRFRF8kY29tcHV0ZUdyaWRNYXA9dFM7SS5ERVBSRUNBVEVEXyRjcmVhdGVHcmlkU2VsZWN0aW9uPWZ1bmN0aW9uKCl7bGV0IGU9bmV3IHdyKCJyb290IiwwLCJlbGVtZW50IiksdD1uZXcgd3IoInJvb3QiLDAsImVsZW1lbnQiKTtyZXR1cm4gbmV3IHdkKCJyb290IixlLHQpfTtJLkRFUFJFQ0FURURfJGdldEdyaWRDZWxsTm9kZVJlY3Q9ZnA7SS5ERVBSRUNBVEVEXyRnZXROb2RlVHJpcGxldD1uUztJLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlPURuO0kuREVQUkVDQVRFRF8kaXNHcmlkTm9kZT1mbTtJLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGU9X2E7SS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb249c207SS5ERVBSRUNBVEVEX0dyaWRDZWxsTm9kZT1kbTtJLkRFUFJFQ0FURURfR3JpZE5vZGU9c1M7SS5ERVBSRUNBVEVEX0dyaWRSb3dOb2RlPWFTO0kuRFJBR0VORF9DT01NQU5EPXhfO0kuRFJBR09WRVJfQ09NTUFORD15XztJLkRSQUdTVEFSVF9DT01NQU5EPXZfO0kuRFJPUF9DT01NQU5EPW1fO0kuRGVjb3JhdG9yTm9kZT1vUztJLkVsZW1lbnROb2RlPVBpO0kuRk9DVVNfQ09NTUFORD13XztJLkZPUk1BVF9FTEVNRU5UX0NPTU1BTkQ9e307SS5GT1JNQVRfVEVYVF9DT01NQU5EPXZvO0kuSU5ERU5UX0NPTlRFTlRfQ09NTUFORD17fTtJLklOU0VSVF9MSU5FX0JSRUFLX0NPTU1BTkQ9anM7SS5JTlNFUlRfUEFSQUdSQVBIX0NPTU1BTkQ9WWg7SS5JTlNFUlRfVEFCX0NPTU1BTkQ9e307SS5LRVlfQVJST1dfRE9XTl9DT01NQU5EPWNfO0kuS0VZX0FSUk9XX0xFRlRfQ09NTUFORD1zXztJLktFWV9BUlJPV19SSUdIVF9DT01NQU5EPWlfO0kuS0VZX0FSUk9XX1VQX0NPTU1BTkQ9dV87SS5LRVlfQkFDS1NQQUNFX0NPTU1BTkQ9Zl87SS5LRVlfREVMRVRFX0NPTU1BTkQ9cF87SS5LRVlfRE9XTl9DT01NQU5EPW9fO0kuS0VZX0VOVEVSX0NPTU1BTkQ9RWM7SS5LRVlfRVNDQVBFX0NPTU1BTkQ9aF87SS5LRVlfTU9ESUZJRVJfQ09NTUFORD1TXztJLktFWV9TUEFDRV9DT01NQU5EPWRfO0kuS0VZX1RBQl9DT01NQU5EPWdfO0kuTGluZUJyZWFrTm9kZT1XbDtJLk1PVkVfVE9fRU5EPWxfO0kuTU9WRV9UT19TVEFSVD1hXztJLk9VVERFTlRfQ09OVEVOVF9DT01NQU5EPXt9O0kuUEFTVEVfQ09NTUFORD1IZztJLlBhcmFncmFwaE5vZGU9WWw7SS5SRURPX0NPTU1BTkQ9R2c7SS5SRU1PVkVfVEVYVF9DT01NQU5EPVhoO0kuUm9vdE5vZGU9R2w7SS5TRUxFQ1RJT05fQ0hBTkdFX0NPTU1BTkQ9ZGQ7SS5TRUxFQ1RfQUxMX0NPTU1BTkQ9UWg7SS5UYWJOb2RlPVVsO0kuVGV4dE5vZGU9Tmk7SS5VTkRPX0NPTU1BTkQ9S2c7SS5jcmVhdGVDb21tYW5kPWZ1bmN0aW9uKCl7cmV0dXJue319O0kuY3JlYXRlRWRpdG9yPWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHt9LG49YnQscj10LnRoZW1lfHx7fTtsZXQgbz1lPT09dm9pZCAwP246dC5wYXJlbnRFZGl0b3J8fG51bGwsaT10LmRpc2FibGVFdmVudHN8fCExLGw9Y20oKSxzPXQubmFtZXNwYWNlfHwobyE9PW51bGw/by5fY29uZmlnLm5hbWVzcGFjZTpBXygpKSxhPXQuZWRpdG9yU3RhdGUsdT1bR2wsTmksV2wsVWwsWWwsLi4udC5ub2Rlc3x8W11dLGM9dC5vbkVycm9yO2lmKHQ9dC5lZGl0YWJsZSE9PXZvaWQgMD90LmVkaXRhYmxlOiEwLGU9PT12b2lkIDAmJm4hPT1udWxsKWU9bi5fbm9kZXM7ZWxzZSBmb3IoZT1uZXcgTWFwLG49MDtuPHUubGVuZ3RoO24rKyl7bGV0IGY9dVtuXSxoPW51bGw7dmFyIGQ9bnVsbDt0eXBlb2YgZiE9ImZ1bmN0aW9uIiYmKGQ9ZixmPWQucmVwbGFjZSxoPWQud2l0aCxkPWQud2l0aEtsYXNzP2Qud2l0aEtsYXNzOm51bGwpO2xldCBtPWYuZ2V0VHlwZSgpLGc9Zi50cmFuc2Zvcm0oKSxTPW5ldyBTZXQ7ZyE9PW51bGwmJlMuYWRkKGcpLGUuc2V0KG0se2tsYXNzOmYscmVwbGFjZTpoLHJlcGxhY2VXaXRoS2xhc3M6ZCx0cmFuc2Zvcm1zOlN9KX1yZXR1cm4gcj1uZXcgajIobCxvLGUse2Rpc2FibGVFdmVudHM6aSxuYW1lc3BhY2U6cyx0aGVtZTpyfSxjfHxjb25zb2xlLmVycm9yLEkyKGUpLHQpLGEhPT12b2lkIDAmJihyLl9wZW5kaW5nRWRpdG9yU3RhdGU9YSxyLl9kaXJ0eVR5cGU9Mikscn07SS5nZXROZWFyZXN0RWRpdG9yRnJvbURPTU5vZGU9dG07SS5pc0hUTUxBbmNob3JFbGVtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBtZChlKSYmZS50YWdOYW1lPT09IkEifTtJLmlzSFRNTEVsZW1lbnQ9bWQ7SS5pc1NlbGVjdGlvbkNhcHR1cmVkSW5EZWNvcmF0b3JJbnB1dD1lbTtJLmlzU2VsZWN0aW9uV2l0aGluRWRpdG9yPURhO2NvbnN0IHoyPUk7dmFyIG1lPXoyLGZ0PXt9LFB0PXt9LHJlPW1lO2xldCBNYz1uZXcgTWFwO2Z1bmN0aW9uIEt5KGUpe2Zvcig7ZSE9bnVsbDspe2lmKGUubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSlyZXR1cm4gZTtlPWUuZmlyc3RDaGlsZH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBHeShlKXtsZXQgdD1lLnBhcmVudE5vZGU7aWYodD09bnVsbCl0aHJvdyBFcnJvcigiU2hvdWxkIG5ldmVyIGhhcHBlbiIpO3JldHVyblt0LEFycmF5LmZyb20odC5jaGlsZE5vZGVzKS5pbmRleE9mKGUpXX1mdW5jdGlvbiB1UyhlKXtsZXQgdD17fTtlPWUuc3BsaXQoIjsiKTtmb3IobGV0IG4gb2YgZSlpZihuIT09IiIpe2xldFtyLG9dPW4uc3BsaXQoLzooW15dKykvKTt0W3IudHJpbSgpXT1vLnRyaW0oKX1yZXR1cm4gdH1mdW5jdGlvbiBMYyhlKXtsZXQgdD1NYy5nZXQoZSk7cmV0dXJuIHQ9PT12b2lkIDAmJih0PXVTKGUpLE1jLnNldChlLHQpKSx0fWZ1bmN0aW9uIEYyKGUpe2xldCB0PSIiO2ZvcihsZXQgbiBpbiBlKW4mJih0Kz1gJHtufTogJHtlW25dfTtgKTtyZXR1cm4gdH1mdW5jdGlvbiBEaShlLHQpe3ZhciBuPUxjKCJnZXRTdHlsZSJpbiBlP2UuZ2V0U3R5bGUoKTplLnN0eWxlKTt0PU9iamVjdC5lbnRyaWVzKHQpLnJlZHVjZSgocixbbyxpXSk9PihpPT09bnVsbD9kZWxldGUgcltvXTpyW29dPWksciksey4uLm59KSxuPUYyKHQpLGUuc2V0U3R5bGUobiksTWMuc2V0KG4sdCl9ZnVuY3Rpb24gY1MoZSx0KXt2YXIgbj1lLmdldE5vZGVzKCkscj1uLmxlbmd0aDtpZihyZS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24oZSkpe2Zvcih2YXIgbz1yZS4kY3JlYXRlUmFuZ2VTZWxlY3Rpb24oKSxpPW8uYW5jaG9yLGw9by5mb2N1cyxzPTA7czxyO3MrKyl7dmFyIGE9bltzXTtyZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZShhKSYmKGkuc2V0KGEuZ2V0S2V5KCksMCwiZWxlbWVudCIpLGwuc2V0KGEuZ2V0S2V5KCksYS5nZXRDaGlsZHJlblNpemUoKSwiZWxlbWVudCIpLGNTKHJlLiRub3JtYWxpemVTZWxlY3Rpb25fX0VYUEVSSU1FTlRBTChvKSx0KSl9cmUuJHNldFNlbGVjdGlvbihlKX1lbHNlIGlmKC0tcixvPW5bMF0saT1uW3JdLGUuaXNDb2xsYXBzZWQoKSlEaShlLHQpO2Vsc2V7dmFyIHU9ZS5hbmNob3IsYz1lLmZvY3VzO3M9by5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCxhPWMub2Zmc2V0O3ZhciBkPXUub2Zmc2V0LGY9dS5pc0JlZm9yZShjKTtsPWY/ZDphLGU9Zj9hOmQ7dmFyIGg9Zj91LnR5cGU6Yy50eXBlLG09Zj9jLnR5cGU6dS50eXBlO2lmKHU9Zj9jLmtleTp1LmtleSxyZS4kaXNUZXh0Tm9kZShvKSYmbD09PXMmJihjPW8uZ2V0TmV4dFNpYmxpbmcoKSxyZS4kaXNUZXh0Tm9kZShjKSYmKGw9ZD0wLG89YykpLG4ubGVuZ3RoPT09MSlyZS4kaXNUZXh0Tm9kZShvKSYmKGw9aD09PSJlbGVtZW50Ij8wOmQ+YT9hOmQsZT1tPT09ImVsZW1lbnQiP3M6ZD5hP2Q6YSxsIT09ZSYmKGw9PT0wJiZlPT09cz8oRGkobyx0KSxvLnNlbGVjdChsLGUpKToobj1vLnNwbGl0VGV4dChsLGUpLG49bD09PTA/blswXTpuWzFdLERpKG4sdCksbi5zZWxlY3QoMCxlLWwpKSkpO2Vsc2UgZm9yKHJlLiRpc1RleHROb2RlKG8pJiZsPG8uZ2V0VGV4dENvbnRlbnRTaXplKCkmJihsIT09MCYmKG89by5zcGxpdFRleHQobClbMV0pLERpKG8sdCkpLHJlLiRpc1RleHROb2RlKGkpJiYobD1pLmdldFRleHRDb250ZW50KCkubGVuZ3RoLGkuX19rZXkhPT11JiZlIT09MCYmKGU9bCksZSE9PWwmJihbaV09aS5zcGxpdFRleHQoZSkpLGUhPT0wJiZEaShpLHQpKSxlPTE7ZTxyO2UrKylsPW5bZV0scz1sLmdldEtleSgpLHJlLiRpc1RleHROb2RlKGwpJiZzIT09by5nZXRLZXkoKSYmcyE9PWkuZ2V0S2V5KCkmJiFsLmlzVG9rZW4oKSYmRGkobCx0KX19ZnVuY3Rpb24gQjIoZSl7Zm9yKDtlIT09bnVsbCYmIXJlLiRpc1Jvb3RPclNoYWRvd1Jvb3QoZSk7KXtsZXQgdD1lLmdldExhdGVzdCgpLG49ZS5nZXRQYXJlbnQoKTt0LmdldENoaWxkcmVuU2l6ZSgpPT09MCYmZS5yZW1vdmUoITApLGU9bn19ZnVuY3Rpb24gVGYoZSx0LG4scixvPW51bGwpe2lmKHQubGVuZ3RoIT09MCl7dmFyIGk9dFswXSxsPW5ldyBNYXAscz1bXTtpPXJlLiRpc0VsZW1lbnROb2RlKGkpP2k6aS5nZXRQYXJlbnRPclRocm93KCksaS5pc0lubGluZSgpJiYoaT1pLmdldFBhcmVudE9yVGhyb3coKSk7Zm9yKHZhciBhPSExO2khPT1udWxsOyl7dmFyIHU9aS5nZXRQcmV2aW91c1NpYmxpbmcoKTtpZih1IT09bnVsbCl7aT11LGE9ITA7YnJlYWt9aWYoaT1pLmdldFBhcmVudE9yVGhyb3coKSxyZS4kaXNSb290T3JTaGFkb3dSb290KGkpKWJyZWFrfXU9bmV3IFNldDtmb3IodmFyIGM9MDtjPG47YysrKXt2YXIgZD10W2NdO3JlLiRpc0VsZW1lbnROb2RlKGQpJiZkLmdldENoaWxkcmVuU2l6ZSgpPT09MCYmdS5hZGQoZC5nZXRLZXkoKSl9dmFyIGY9bmV3IFNldDtmb3IoYz0wO2M8bjtjKyspe2Q9dFtjXTt2YXIgaD1kLmdldFBhcmVudCgpO2lmKGghPT1udWxsJiZoLmlzSW5saW5lKCkmJihoPWguZ2V0UGFyZW50KCkpLGghPT1udWxsJiZyZS4kaXNMZWFmTm9kZShkKSYmIWYuaGFzKGQuZ2V0S2V5KCkpKXtpZihkPWguZ2V0S2V5KCksbC5nZXQoZCk9PT12b2lkIDApe2xldCBtPXIoKTttLnNldEZvcm1hdChoLmdldEZvcm1hdFR5cGUoKSksbS5zZXRJbmRlbnQoaC5nZXRJbmRlbnQoKSkscy5wdXNoKG0pLGwuc2V0KGQsbSksaC5nZXRDaGlsZHJlbigpLmZvckVhY2goZz0+e20uYXBwZW5kKGcpLGYuYWRkKGcuZ2V0S2V5KCkpLHJlLiRpc0VsZW1lbnROb2RlKGcpJiZnLmdldENoaWxkcmVuS2V5cygpLmZvckVhY2goUz0+Zi5hZGQoUykpfSksQjIoaCl9fWVsc2UgdS5oYXMoZC5nZXRLZXkoKSkmJihoPXIoKSxoLnNldEZvcm1hdChkLmdldEZvcm1hdFR5cGUoKSksaC5zZXRJbmRlbnQoZC5nZXRJbmRlbnQoKSkscy5wdXNoKGgpLGQucmVtb3ZlKCEwKSl9aWYobyE9PW51bGwpZm9yKHQ9MDt0PHMubGVuZ3RoO3QrKylvLmFwcGVuZChzW3RdKTtpZih0PW51bGwscmUuJGlzUm9vdE9yU2hhZG93Um9vdChpKSlpZihhKWlmKG8hPT1udWxsKWkuaW5zZXJ0QWZ0ZXIobyk7ZWxzZSBmb3Iobz1zLmxlbmd0aC0xOzA8PW87by0tKWkuaW5zZXJ0QWZ0ZXIoc1tvXSk7ZWxzZSBpZihhPWkuZ2V0Rmlyc3RDaGlsZCgpLHJlLiRpc0VsZW1lbnROb2RlKGEpJiYoaT1hKSxhPT09bnVsbClpZihvKWkuYXBwZW5kKG8pO2Vsc2UgZm9yKG89MDtvPHMubGVuZ3RoO28rKylhPXNbb10saS5hcHBlbmQoYSksdD1hO2Vsc2UgaWYobyE9PW51bGwpYS5pbnNlcnRCZWZvcmUobyk7ZWxzZSBmb3IoaT0wO2k8cy5sZW5ndGg7aSsrKW89c1tpXSxhLmluc2VydEJlZm9yZShvKSx0PW87ZWxzZSBpZihvKWkuaW5zZXJ0QWZ0ZXIobyk7ZWxzZSBmb3Iobz1zLmxlbmd0aC0xOzA8PW87by0tKWE9c1tvXSxpLmluc2VydEFmdGVyKGEpLHQ9YTtzPXJlLiRnZXRQcmV2aW91c1NlbGVjdGlvbigpLHJlLiRpc1JhbmdlU2VsZWN0aW9uKHMpJiZzLmFuY2hvci5nZXROb2RlKCkuaXNBdHRhY2hlZCgpJiZzLmZvY3VzLmdldE5vZGUoKS5pc0F0dGFjaGVkKCk/cmUuJHNldFNlbGVjdGlvbihzLmNsb25lKCkpOnQhPT1udWxsP3Quc2VsZWN0RW5kKCk6ZS5kaXJ0eT0hMH19ZnVuY3Rpb24gZFMoZSx0LG4scil7ZS5tb2RpZnkodD8iZXh0ZW5kIjoibW92ZSIsbixyKX1mdW5jdGlvbiBmUyhlKXtyZXR1cm4gZT1lLmFuY2hvci5nZXROb2RlKCksKHJlLiRpc1Jvb3ROb2RlKGUpP2U6ZS5nZXRQYXJlbnRPclRocm93KCkpLmdldERpcmVjdGlvbigpPT09InJ0bCJ9UHQuJGFkZE5vZGVTdHlsZT1mdW5jdGlvbihlKXtlPWUuZ2V0U3R5bGUoKTtsZXQgdD11UyhlKTtNYy5zZXQoZSx0KX07UHQuJGNsb25lV2l0aFByb3BlcnRpZXM9ZnVuY3Rpb24oZSl7bGV0IHQ9ZS5jb25zdHJ1Y3Rvci5jbG9uZShlKTtyZXR1cm4gdC5fX3BhcmVudD1lLl9fcGFyZW50LHQuX19uZXh0PWUuX19uZXh0LHQuX19wcmV2PWUuX19wcmV2LHJlLiRpc0VsZW1lbnROb2RlKGUpJiZyZS4kaXNFbGVtZW50Tm9kZSh0KT8odC5fX2ZpcnN0PWUuX19maXJzdCx0Ll9fbGFzdD1lLl9fbGFzdCx0Ll9fc2l6ZT1lLl9fc2l6ZSx0Ll9fZm9ybWF0PWUuX19mb3JtYXQsdC5fX2luZGVudD1lLl9faW5kZW50LHQuX19kaXI9ZS5fX2Rpcix0KToocmUuJGlzVGV4dE5vZGUoZSkmJnJlLiRpc1RleHROb2RlKHQpJiYodC5fX2Zvcm1hdD1lLl9fZm9ybWF0LHQuX19zdHlsZT1lLl9fc3R5bGUsdC5fX21vZGU9ZS5fX21vZGUsdC5fX2RldGFpbD1lLl9fZGV0YWlsKSx0KX07UHQuJGdldFNlbGVjdGlvblN0eWxlVmFsdWVGb3JQcm9wZXJ0eT1mdW5jdGlvbihlLHQsbj0iIil7bGV0IHI9bnVsbCxvPWUuZ2V0Tm9kZXMoKTt2YXIgaT1lLmFuY2hvcixsPWUuZm9jdXMscz1lLmlzQmFja3dhcmQoKTtsZXQgYT1zP2wub2Zmc2V0Omkub2Zmc2V0O2lmKGk9cz9sLmdldE5vZGUoKTppLmdldE5vZGUoKSxlLnN0eWxlIT09IiImJihlPUxjKGUuc3R5bGUpLGUhPT1udWxsJiZ0IGluIGUpKXJldHVybiBlW3RdO2ZvcihlPTA7ZTxvLmxlbmd0aDtlKyspe3ZhciB1PW9bZV07aWYoKGU9PT0wfHxhIT09MHx8IXUuaXMoaSkpJiZyZS4kaXNUZXh0Tm9kZSh1KSl7aWYobD10LHM9bix1PXUuZ2V0U3R5bGUoKSx1PUxjKHUpLGw9dSE9PW51bGwmJnVbbF18fHMscj09PW51bGwpcj1sO2Vsc2UgaWYociE9PWwpe3I9IiI7YnJlYWt9fX1yZXR1cm4gcj09PW51bGw/bjpyfTtQdC4kaXNBdE5vZGVFbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09PSJ0ZXh0Ij9lLm9mZnNldD09PWUuZ2V0Tm9kZSgpLmdldFRleHRDb250ZW50U2l6ZSgpOmUub2Zmc2V0PT09ZS5nZXROb2RlKCkuZ2V0Q2hpbGRyZW5TaXplKCl9O1B0LiRpc1BhcmVudEVsZW1lbnRSVEw9ZlM7UHQuJG1vdmVDYXJldFNlbGVjdGlvbj1kUztQdC4kbW92ZUNoYXJhY3Rlcj1mdW5jdGlvbihlLHQsbil7bGV0IHI9ZlMoZSk7ZFMoZSx0LG4/IXI6ciwiY2hhcmFjdGVyIil9O1B0LiRwYXRjaFN0eWxlVGV4dD1jUztQdC4kc2VsZWN0QWxsPWZ1bmN0aW9uKGUpe2xldCB0PWUuYW5jaG9yO2U9ZS5mb2N1czt2YXIgbj10LmdldE5vZGUoKS5nZXRUb3BMZXZlbEVsZW1lbnRPclRocm93KCkuZ2V0UGFyZW50T3JUaHJvdygpO2xldCByPW4uZ2V0Rmlyc3REZXNjZW5kYW50KCk7bj1uLmdldExhc3REZXNjZW5kYW50KCk7bGV0IG89ImVsZW1lbnQiLGk9ImVsZW1lbnQiLGw9MDtyZS4kaXNUZXh0Tm9kZShyKT9vPSJ0ZXh0IjpyZS4kaXNFbGVtZW50Tm9kZShyKXx8cj09PW51bGx8fChyPXIuZ2V0UGFyZW50T3JUaHJvdygpKSxyZS4kaXNUZXh0Tm9kZShuKT8oaT0idGV4dCIsbD1uLmdldFRleHRDb250ZW50U2l6ZSgpKTpyZS4kaXNFbGVtZW50Tm9kZShuKXx8bj09PW51bGx8fChuPW4uZ2V0UGFyZW50T3JUaHJvdygpKSxyJiZuJiYodC5zZXQoci5nZXRLZXkoKSwwLG8pLGUuc2V0KG4uZ2V0S2V5KCksbCxpKSl9O1B0LiRzZXRCbG9ja3NUeXBlPWZ1bmN0aW9uKGUsdCl7aWYoZS5hbmNob3Iua2V5PT09InJvb3QiKXt0PXQoKTt2YXIgbj1yZS4kZ2V0Um9vdCgpOyhlPW4uZ2V0Rmlyc3RDaGlsZCgpKT9lLnJlcGxhY2UodCwhMCk6bi5hcHBlbmQodCl9ZWxzZSBmb3Iobj1lLmdldE5vZGVzKCksZT1lLmFuY2hvci5nZXROb2RlKCkuZ2V0UGFyZW50T3JUaHJvdygpLG4uaW5kZXhPZihlKT09PS0xJiZuLnB1c2goZSksZS5pc0lubGluZSgpJiYoZT1lLmdldFBhcmVudE9yVGhyb3coKSxuLmluZGV4T2YoZSk9PT0tMSYmbi5wdXNoKGUpKSxlPTA7ZTxuLmxlbmd0aDtlKyspe2xldCBpPW5bZV07dmFyIHI9aTtpZighcmUuJGlzRWxlbWVudE5vZGUocil8fHJlLiRpc1Jvb3RPclNoYWRvd1Jvb3Qocikpcj0hMTtlbHNle3ZhciBvPXIuZ2V0Rmlyc3RDaGlsZCgpO289bz09PW51bGx8fHJlLiRpc0xpbmVCcmVha05vZGUobyl8fHJlLiRpc1RleHROb2RlKG8pfHxvLmlzSW5saW5lKCkscj0hci5pc0lubGluZSgpJiZyLmNhbkJlRW1wdHkoKSE9PSExJiZvfXImJihyPXQoKSxyLnNldEZvcm1hdChpLmdldEZvcm1hdFR5cGUoKSksci5zZXRJbmRlbnQoaS5nZXRJbmRlbnQoKSksaS5yZXBsYWNlKHIsITApKX19O1B0LiRzaG91bGRPdmVycmlkZURlZmF1bHRDaGFyYWN0ZXJTZWxlY3Rpb249ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1yZS4kZ2V0QWRqYWNlbnROb2RlKGUuZm9jdXMsdCkscmUuJGlzRGVjb3JhdG9yTm9kZShlKSYmIWUuaXNJc29sYXRlZCgpfHxyZS4kaXNFbGVtZW50Tm9kZShlKSYmIWUuaXNJbmxpbmUoKSYmIWUuY2FuQmVFbXB0eSgpfTtQdC4kc2xpY2VTZWxlY3RlZFRleHROb2RlQ29udGVudD1mdW5jdGlvbihlLHQpe2lmKHQuaXNTZWxlY3RlZCgpJiYhdC5pc1NlZ21lbnRlZCgpJiYhdC5pc1Rva2VuKCkmJihyZS4kaXNSYW5nZVNlbGVjdGlvbihlKXx8cmUuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKGUpKSl7dmFyIG49ZS5hbmNob3IuZ2V0Tm9kZSgpLHI9ZS5mb2N1cy5nZXROb2RlKCksbz10LmlzKG4pLGk9dC5pcyhyKTtpZihvfHxpKXtvPWUuaXNCYWNrd2FyZCgpO2xldFtsLHNdPWUuZ2V0Q2hhcmFjdGVyT2Zmc2V0cygpO2U9bi5pcyhyKSxpPXQuaXMobz9yOm4pLHI9dC5pcyhvP246ciksbj0wO2xldCBhO2U/KG49bD5zP3M6bCxhPWw+cz9sOnMpOmk/KG49bz9zOmwsYT12b2lkIDApOnImJihvPW8/bDpzLG49MCxhPW8pLHQuX190ZXh0PXQuX190ZXh0LnNsaWNlKG4sYSl9fXJldHVybiB0fTtQdC4kd3JhcE5vZGVzPWZ1bmN0aW9uKGUsdCxuPW51bGwpe3ZhciByPWUuZ2V0Tm9kZXMoKTtsZXQgbz1yLmxlbmd0aDt2YXIgaT1lLmFuY2hvcjtpZihvPT09MHx8bz09PTEmJmkudHlwZT09PSJlbGVtZW50IiYmaS5nZXROb2RlKCkuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wKXtlPWkudHlwZT09PSJ0ZXh0Ij9pLmdldE5vZGUoKS5nZXRQYXJlbnRPclRocm93KCk6aS5nZXROb2RlKCkscj1lLmdldENoaWxkcmVuKCk7bGV0IHM9dCgpO3Muc2V0Rm9ybWF0KGUuZ2V0Rm9ybWF0VHlwZSgpKSxzLnNldEluZGVudChlLmdldEluZGVudCgpKSxyLmZvckVhY2goYT0+cy5hcHBlbmQoYSkpLG4mJihzPW4uYXBwZW5kKHMpKSxlLnJlcGxhY2Uocyl9ZWxzZXtpPW51bGw7dmFyIGw9W107Zm9yKGxldCBzPTA7czxvO3MrKyl7bGV0IGE9cltzXTtyZS4kaXNSb290T3JTaGFkb3dSb290KGEpPyhUZihlLGwsbC5sZW5ndGgsdCxuKSxsPVtdLGk9YSk6aT09PW51bGx8fGkhPT1udWxsJiZyZS4kaGFzQW5jZXN0b3IoYSxpKT9sLnB1c2goYSk6KFRmKGUsbCxsLmxlbmd0aCx0LG4pLGw9W2FdKX1UZihlLGwsbC5sZW5ndGgsdCxuKX19O1B0LmNyZWF0ZURPTVJhbmdlPWZ1bmN0aW9uKGUsdCxuLHIsbyl7bGV0IGk9dC5nZXRLZXkoKSxsPXIuZ2V0S2V5KCkscz1kb2N1bWVudC5jcmVhdGVSYW5nZSgpLGE9ZS5nZXRFbGVtZW50QnlLZXkoaSk7aWYoZT1lLmdldEVsZW1lbnRCeUtleShsKSxyZS4kaXNUZXh0Tm9kZSh0KSYmKGE9S3koYSkpLHJlLiRpc1RleHROb2RlKHIpJiYoZT1LeShlKSksdD09PXZvaWQgMHx8cj09PXZvaWQgMHx8YT09PW51bGx8fGU9PT1udWxsKXJldHVybiBudWxsO2Eubm9kZU5hbWU9PT0iQlIiJiYoW2Esbl09R3koYSkpLGUubm9kZU5hbWU9PT0iQlIiJiYoW2Usb109R3koZSkpLHQ9YS5maXJzdENoaWxkLGE9PT1lJiZ0IT1udWxsJiZ0Lm5vZGVOYW1lPT09IkJSIiYmbj09PTAmJm89PT0wJiYobz0xKTt0cnl7cy5zZXRTdGFydChhLG4pLHMuc2V0RW5kKGUsbyl9Y2F0Y2h7cmV0dXJuIG51bGx9cmV0dXJuIXMuY29sbGFwc2VkfHxuPT09byYmaT09PWx8fChzLnNldFN0YXJ0KGUsbykscy5zZXRFbmQoYSxuKSksc307UHQuY3JlYXRlUmVjdHNGcm9tRE9NUmFuZ2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmdldFJvb3RFbGVtZW50KCk7aWYobj09PW51bGwpcmV0dXJuW107ZT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49Z2V0Q29tcHV0ZWRTdHlsZShuKSxuPXBhcnNlRmxvYXQobi5wYWRkaW5nTGVmdCkrcGFyc2VGbG9hdChuLnBhZGRpbmdSaWdodCksdD1BcnJheS5mcm9tKHQuZ2V0Q2xpZW50UmVjdHMoKSk7bGV0IHI9dC5sZW5ndGg7dC5zb3J0KChpLGwpPT57bGV0IHM9aS50b3AtbC50b3A7cmV0dXJuIDM+PU1hdGguYWJzKHMpP2kubGVmdC1sLmxlZnQ6c30pO2xldCBvO2ZvcihsZXQgaT0wO2k8cjtpKyspe2xldCBsPXRbaV0scz1sLndpZHRoK249PT1lLndpZHRoO28mJm8udG9wPD1sLnRvcCYmby50b3Arby5oZWlnaHQ+bC50b3AmJm8ubGVmdCtvLndpZHRoPmwubGVmdHx8cz8odC5zcGxpY2UoaS0tLDEpLHItLSk6bz1sfXJldHVybiB0fTtQdC5nZXRTdHlsZU9iamVjdEZyb21DU1M9TGM7UHQudHJpbVRleHRDb250ZW50RnJvbUFuY2hvcj1mdW5jdGlvbihlLHQsbil7bGV0IHI9dC5nZXROb2RlKCk7aWYocmUuJGlzRWxlbWVudE5vZGUocikpe3ZhciBvPXIuZ2V0RGVzY2VuZGFudEJ5SW5kZXgodC5vZmZzZXQpO28hPT1udWxsJiYocj1vKX1mb3IoOzA8biYmciE9PW51bGw7KXt2YXIgaT1yLmdldFByZXZpb3VzU2libGluZygpLGw9MDtpZihpPT09bnVsbCl7bz1yLmdldFBhcmVudE9yVGhyb3coKTtmb3IodmFyIHM9by5nZXRQcmV2aW91c1NpYmxpbmcoKTtzPT09bnVsbDspe2lmKG89by5nZXRQYXJlbnQoKSxvPT09bnVsbCl7aT1udWxsO2JyZWFrfXM9by5nZXRQcmV2aW91c1NpYmxpbmcoKX1vIT09bnVsbCYmKGw9by5pc0lubGluZSgpPzA6MixpPXJlLiRpc0VsZW1lbnROb2RlKHMpP3MuZ2V0TGFzdERlc2NlbmRhbnQoKTpzKX1pZihzPXIuZ2V0VGV4dENvbnRlbnQoKSxzPT09IiImJnJlLiRpc0VsZW1lbnROb2RlKHIpJiYhci5pc0lubGluZSgpJiYocz1gCgpgKSxvPXMubGVuZ3RoLCFyZS4kaXNUZXh0Tm9kZShyKXx8bj49bylzPXIuZ2V0UGFyZW50KCksci5yZW1vdmUoKSxzPT1udWxsfHxzLmdldENoaWxkcmVuU2l6ZSgpIT09MHx8cmUuJGlzUm9vdE5vZGUocyl8fHMucmVtb3ZlKCksbi09bytsLHI9aTtlbHNle2xldCBhPXIuZ2V0S2V5KCk7bD1lLmdldEVkaXRvclN0YXRlKCkucmVhZCgoKT0+e2NvbnN0IGM9cmUuJGdldE5vZGVCeUtleShhKTtyZXR1cm4gcmUuJGlzVGV4dE5vZGUoYykmJmMuaXNTaW1wbGVUZXh0KCk/Yy5nZXRUZXh0Q29udGVudCgpOm51bGx9KSxpPW8tbjtsZXQgdT1zLnNsaWNlKDAsaSk7bCE9PW51bGwmJmwhPT1zPyhuPXJlLiRnZXRQcmV2aW91c1NlbGVjdGlvbigpLG89cixyLmlzU2ltcGxlVGV4dCgpP3Iuc2V0VGV4dENvbnRlbnQobCk6KG89cmUuJGNyZWF0ZVRleHROb2RlKGwpLHIucmVwbGFjZShvKSkscmUuJGlzUmFuZ2VTZWxlY3Rpb24obikmJm4uaXNDb2xsYXBzZWQoKSYmKG49bi5hbmNob3Iub2Zmc2V0LG8uc2VsZWN0KG4sbikpKTpyLmlzU2ltcGxlVGV4dCgpPyhsPXQua2V5PT09YSxzPXQub2Zmc2V0LHM8biYmKHM9byksbj1sP3MtbjowLG89bD9zOmksbCYmbj09PTA/KFtuXT1yLnNwbGl0VGV4dChuLG8pLG4ucmVtb3ZlKCkpOihbLG5dPXIuc3BsaXRUZXh0KG4sbyksbi5yZW1vdmUoKSkpOihuPXJlLiRjcmVhdGVUZXh0Tm9kZSh1KSxyLnJlcGxhY2UobikpLG49MH19fTtjb25zdCBXMj1QdDt2YXIgTW89VzIsVTI9TW8sdXQ9bWU7ZnVuY3Rpb24gVjIoZSl7bGV0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtczt0LmFwcGVuZCgiY29kZSIsZSk7Zm9yKGxldCBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LmFwcGVuZCgidiIsYXJndW1lbnRzW25dKTt0aHJvdyBFcnJvcihgTWluaWZpZWQgTGV4aWNhbCBlcnJvciAjJHtlfTsgdmlzaXQgaHR0cHM6Ly9sZXhpY2FsLmRldi9kb2NzL2Vycm9yPyR7dH0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLmApfWZ1bmN0aW9uIGhTKGUsdCl7Zm9yKGxldCBuIG9mIHQpaWYoZS50eXBlLnN0YXJ0c1dpdGgobikpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gcFMoZSx0KXtmb3IoO2UhPT11dC4kZ2V0Um9vdCgpJiZlIT1udWxsOyl7aWYodChlKSlyZXR1cm4gZTtlPWUuZ2V0UGFyZW50KCl9cmV0dXJuIG51bGx9ZnQuJHNwbGl0Tm9kZT11dC4kc3BsaXROb2RlO2Z0LmlzSFRNTEFuY2hvckVsZW1lbnQ9dXQuaXNIVE1MQW5jaG9yRWxlbWVudDtmdC5pc0hUTUxFbGVtZW50PXV0LmlzSFRNTEVsZW1lbnQ7ZnQuJGRmcz1mdW5jdGlvbihlLHQpe2xldCBuPVtdO2U9KGV8fHV0LiRnZXRSb290KCkpLmdldExhdGVzdCgpLHQ9dHx8KHV0LiRpc0VsZW1lbnROb2RlKGUpP2UuZ2V0TGFzdERlc2NlbmRhbnQoKTplKTtmb3IodmFyIHI9ZSxvPTA7KHI9ci5nZXRQYXJlbnQoKSkhPT1udWxsOylvKys7Zm9yKHI9bztlIT09bnVsbCYmIWUuaXModCk7KWlmKG4ucHVzaCh7ZGVwdGg6cixub2RlOmV9KSx1dC4kaXNFbGVtZW50Tm9kZShlKSYmMDxlLmdldENoaWxkcmVuU2l6ZSgpKWU9ZS5nZXRGaXJzdENoaWxkKCkscisrO2Vsc2UgZm9yKG89bnVsbDtvPT09bnVsbCYmZSE9PW51bGw7KW89ZS5nZXROZXh0U2libGluZygpLG89PT1udWxsPyhlPWUuZ2V0UGFyZW50KCksci0tKTplPW87cmV0dXJuIGUhPT1udWxsJiZlLmlzKHQpJiZuLnB1c2goe2RlcHRoOnIsbm9kZTplfSksbn07ZnQuJGZpbHRlcj1mdW5jdGlvbihlLHQpe2xldCBuPVtdO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKXtsZXQgbz10KGVbcl0pO28hPT1udWxsJiZuLnB1c2gobyl9cmV0dXJuIG59O2Z0LiRmaW5kTWF0Y2hpbmdQYXJlbnQ9cFM7ZnQuJGdldE5lYXJlc3RCbG9ja0VsZW1lbnRBbmNlc3Rvck9yVGhyb3c9ZnVuY3Rpb24oZSl7bGV0IHQ9cFMoZSxuPT51dC4kaXNFbGVtZW50Tm9kZShuKSYmIW4uaXNJbmxpbmUoKSk7cmV0dXJuIHV0LiRpc0VsZW1lbnROb2RlKHQpfHxWMig0LGUuX19rZXkpLHR9O2Z0LiRnZXROZWFyZXN0Tm9kZU9mVHlwZT1mdW5jdGlvbihlLHQpe2Zvcig7ZSE9bnVsbDspe2lmKGUgaW5zdGFuY2VvZiB0KXJldHVybiBlO2U9ZS5nZXRQYXJlbnQoKX1yZXR1cm4gbnVsbH07ZnQuJGluc2VydEZpcnN0PWZ1bmN0aW9uKGUsdCl7bGV0IG49ZS5nZXRGaXJzdENoaWxkKCk7biE9PW51bGw/bi5pbnNlcnRCZWZvcmUodCk6ZS5hcHBlbmQodCl9O2Z0LiRpbnNlcnROb2RlVG9OZWFyZXN0Um9vdD1mdW5jdGlvbihlKXt2YXIgdD11dC4kZ2V0U2VsZWN0aW9uKCl8fHV0LiRnZXRQcmV2aW91c1NlbGVjdGlvbigpO2lmKHV0LiRpc1JhbmdlU2VsZWN0aW9uKHQpKXt2YXJ7Zm9jdXM6bn09dDtpZih0PW4uZ2V0Tm9kZSgpLG49bi5vZmZzZXQsdXQuJGlzUm9vdE9yU2hhZG93Um9vdCh0KSluPXQuZ2V0Q2hpbGRBdEluZGV4KG4pLG49PW51bGw/dC5hcHBlbmQoZSk6bi5pbnNlcnRCZWZvcmUoZSksZS5zZWxlY3ROZXh0KCk7ZWxzZXtsZXQgcixvO3V0LiRpc1RleHROb2RlKHQpPyhyPXQuZ2V0UGFyZW50T3JUaHJvdygpLG89dC5nZXRJbmRleFdpdGhpblBhcmVudCgpLDA8biYmKG8rPTEsdC5zcGxpdFRleHQobikpKToocj10LG89biksWyx0XT11dC4kc3BsaXROb2RlKHIsbyksdC5pbnNlcnRCZWZvcmUoZSksdC5zZWxlY3RTdGFydCgpfX1lbHNlIHV0LiRpc05vZGVTZWxlY3Rpb24odCl8fHV0LkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbih0KT8odD10LmdldE5vZGVzKCksdFt0Lmxlbmd0aC0xXS5nZXRUb3BMZXZlbEVsZW1lbnRPclRocm93KCkuaW5zZXJ0QWZ0ZXIoZSkpOnV0LiRnZXRSb290KCkuYXBwZW5kKGUpLHQ9dXQuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSxlLmluc2VydEFmdGVyKHQpLHQuc2VsZWN0KCk7cmV0dXJuIGUuZ2V0TGF0ZXN0KCl9O2Z0LiRyZXN0b3JlRWRpdG9yU3RhdGU9ZnVuY3Rpb24oZSx0KXtsZXQgbj1uZXcgTWFwLHI9ZS5fcGVuZGluZ0VkaXRvclN0YXRlO2ZvcihsZXRbbyxpXW9mIHQuX25vZGVNYXApe2xldCBsPVUyLiRjbG9uZVdpdGhQcm9wZXJ0aWVzKGkpO3V0LiRpc1RleHROb2RlKGwpJiYobC5fX3RleHQ9aS5fX3RleHQpLG4uc2V0KG8sbCl9ciYmKHIuX25vZGVNYXA9biksZS5fZGlydHlUeXBlPTIsZT10Ll9zZWxlY3Rpb24sdXQuJHNldFNlbGVjdGlvbihlPT09bnVsbD9udWxsOmUuY2xvbmUoKSl9O2Z0LiR3cmFwTm9kZUluRWxlbWVudD1mdW5jdGlvbihlLHQpe3JldHVybiB0PXQoKSxlLnJlcGxhY2UodCksdC5hcHBlbmQoZSksdH07ZnQuYWRkQ2xhc3NOYW1lc1RvRWxlbWVudD1mdW5jdGlvbihlLC4uLnQpe3QuZm9yRWFjaChuPT57dHlwZW9mIG49PSJzdHJpbmciJiYobj1uLnNwbGl0KCIgIikuZmlsdGVyKHI9PnIhPT0iIiksZS5jbGFzc0xpc3QuYWRkKC4uLm4pKX0pfTtmdC5pc01pbWVUeXBlPWhTO2Z0Lm1lZGlhRmlsZVJlYWRlcj1mdW5jdGlvbihlLHQpe2xldCBuPWVbU3ltYm9sLml0ZXJhdG9yXSgpO3JldHVybiBuZXcgUHJvbWlzZSgocixvKT0+e2xldCBpPVtdLGw9KCk9Pntjb25zdHtkb25lOnMsdmFsdWU6YX09bi5uZXh0KCk7aWYocylyZXR1cm4gcihpKTtjb25zdCB1PW5ldyBGaWxlUmVhZGVyO3UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLG8pLHUuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKCk9Pntjb25zdCBjPXUucmVzdWx0O3R5cGVvZiBjPT0ic3RyaW5nIiYmaS5wdXNoKHtmaWxlOmEscmVzdWx0OmN9KSxsKCl9KSxoUyhhLHQpP3UucmVhZEFzRGF0YVVSTChhKTpsKCl9O2woKX0pfTtmdC5tZXJnZVJlZ2lzdGVyPWZ1bmN0aW9uKC4uLmUpe3JldHVybigpPT57ZS5mb3JFYWNoKHQ9PnQoKSl9fTtmdC5vYmplY3RLbGFzc0VxdWFscz1mdW5jdGlvbihlLHQpe3JldHVybiBlIT09bnVsbD9PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkuY29uc3RydWN0b3IubmFtZT09PXQubmFtZTohMX07ZnQucmVnaXN0ZXJOZXN0ZWRFbGVtZW50UmVzb2x2ZXI9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGUucmVnaXN0ZXJOb2RlVHJhbnNmb3JtKHQsbz0+e2U6e2Zvcih2YXIgaT1vLmdldENoaWxkcmVuKCksbD0wO2w8aS5sZW5ndGg7bCsrKWlmKGlbbF1pbnN0YW5jZW9mIHQpe2k9bnVsbDticmVhayBlfWZvcihpPW87aSE9PW51bGw7KWlmKGw9aSxpPWkuZ2V0UGFyZW50KCksaSBpbnN0YW5jZW9mIHQpe2k9e2NoaWxkOmwscGFyZW50Oml9O2JyZWFrIGV9aT1udWxsfWlmKGkhPT1udWxsKXtjb25zdHtjaGlsZDpzLHBhcmVudDphfT1pO2lmKHMuaXMobykpe2lmKHIoYSxvKSxvPXMuZ2V0TmV4dFNpYmxpbmdzKCksaT1vLmxlbmd0aCxhLmluc2VydEFmdGVyKHMpLGkhPT0wKXtsPW4oYSkscy5pbnNlcnRBZnRlcihsKTtmb3IobGV0IHU9MDt1PGk7dSsrKWwuYXBwZW5kKG9bdV0pfWEuY2FuQmVFbXB0eSgpfHxhLmdldENoaWxkcmVuU2l6ZSgpIT09MHx8YS5yZW1vdmUoKX19fSl9O2Z0LnJlbW92ZUNsYXNzTmFtZXNGcm9tRWxlbWVudD1mdW5jdGlvbihlLC4uLnQpe3QuZm9yRWFjaChuPT57dHlwZW9mIG49PSJzdHJpbmciJiZlLmNsYXNzTGlzdC5yZW1vdmUoLi4ubi5zcGxpdCgiICIpKX0pfTtjb25zdCBIMj1mdDt2YXIgTnQ9SDIsUmU9bWUsTG89TnQ7ZnVuY3Rpb24gUmwoZSl7bGV0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtczt0LmFwcGVuZCgiY29kZSIsZSk7Zm9yKGxldCBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LmFwcGVuZCgidiIsYXJndW1lbnRzW25dKTt0aHJvdyBFcnJvcihgTWluaWZpZWQgTGV4aWNhbCBlcnJvciAjJHtlfTsgdmlzaXQgaHR0cHM6Ly9sZXhpY2FsLmRldi9kb2NzL2Vycm9yPyR7dH0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLmApfWZ1bmN0aW9uIGdTKGUpe2xldCB0PTE7Zm9yKGU9ZS5nZXRQYXJlbnQoKTtlIT1udWxsOyl7aWYocWUoZSkpe2lmKGU9ZS5nZXRQYXJlbnQoKSx4ZShlKSl7dCsrLGU9ZS5nZXRQYXJlbnQoKTtjb250aW51ZX1SbCg0MCl9YnJlYWt9cmV0dXJuIHR9ZnVuY3Rpb24gZ3AoZSl7ZT1lLmdldFBhcmVudCgpLHhlKGUpfHxSbCg0MCk7bGV0IHQ9ZTtmb3IoO3QhPT1udWxsOyl0PXQuZ2V0UGFyZW50KCkseGUodCkmJihlPXQpO3JldHVybiBlfWZ1bmN0aW9uIG1TKGUpe2xldCB0PVtdO2U9ZS5nZXRDaGlsZHJlbigpLmZpbHRlcihxZSk7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCByPWVbbl0sbz1yLmdldEZpcnN0Q2hpbGQoKTt4ZShvKT90PXQuY29uY2F0KG1TKG8pKTp0LnB1c2gocil9cmV0dXJuIHR9ZnVuY3Rpb24gY3IoZSl7cmV0dXJuIHFlKGUpJiZ4ZShlLmdldEZpcnN0Q2hpbGQoKSl9ZnVuY3Rpb24gSzIoZSl7Zm9yKDtlLmdldE5leHRTaWJsaW5nKCk9PW51bGwmJmUuZ2V0UHJldmlvdXNTaWJsaW5nKCk9PW51bGw7KXtsZXQgdD1lLmdldFBhcmVudCgpO2lmKHQ9PW51bGx8fCFxZShlKSYmIXhlKGUpKWJyZWFrO2U9dH1lLnJlbW92ZSgpfWZ1bmN0aW9uIFl5KGUpe3JldHVybiBDbigpLmFwcGVuZChlKX1mdW5jdGlvbiB2UyhlLHQpe3JldHVybiBxZShlKSYmKHQubGVuZ3RoPT09MHx8dC5sZW5ndGg9PT0xJiZlLmlzKHRbMF0pJiZlLmdldENoaWxkcmVuU2l6ZSgpPT09MCl9ZnVuY3Rpb24geWkoZSx0KXtlLnNwbGljZShlLmdldENoaWxkcmVuU2l6ZSgpLDAsdCl9ZnVuY3Rpb24gWHkoZSx0KXtpZih4ZShlKSlyZXR1cm4gZTtsZXQgbj1lLmdldFByZXZpb3VzU2libGluZygpLHI9ZS5nZXROZXh0U2libGluZygpLG89Q24oKTtyZXR1cm4gby5zZXRGb3JtYXQoZS5nZXRGb3JtYXRUeXBlKCkpLG8uc2V0SW5kZW50KGUuZ2V0SW5kZW50KCkpLHlpKG8sZS5nZXRDaGlsZHJlbigpKSx4ZShuKSYmdD09PW4uZ2V0TGlzdFR5cGUoKT8obi5hcHBlbmQobyksZS5yZW1vdmUoKSx4ZShyKSYmdD09PXIuZ2V0TGlzdFR5cGUoKSYmKHlpKG4sci5nZXRDaGlsZHJlbigpKSxyLnJlbW92ZSgpKSxuKTp4ZShyKSYmdD09PXIuZ2V0TGlzdFR5cGUoKT8oci5nZXRGaXJzdENoaWxkT3JUaHJvdygpLmluc2VydEJlZm9yZShvKSxlLnJlbW92ZSgpLHIpOih0PXJuKHQpLHQuYXBwZW5kKG8pLGUucmVwbGFjZSh0KSxKdCh0KSx0KX1mdW5jdGlvbiB5UyhlLHQpe3ZhciBuPWUuZ2V0TGFzdENoaWxkKCk7bGV0IHI9dC5nZXRGaXJzdENoaWxkKCk7biYmciYmY3IobikmJmNyKHIpJiYoeVMobi5nZXRGaXJzdENoaWxkKCksci5nZXRGaXJzdENoaWxkKCkpLHIucmVtb3ZlKCkpLG49dC5nZXRDaGlsZHJlbigpLDA8bi5sZW5ndGgmJihlLmFwcGVuZCguLi5uKSxKdChlKSksdC5yZW1vdmUoKX1mdW5jdGlvbiBKdChlLHQpe2lmKGU9dHx8ZS5nZXRDaGlsZHJlbigpLGUhPT12b2lkIDApZm9yKHQ9MDt0PGUubGVuZ3RoO3QrKyl7bGV0IGk9ZVt0XTtpZihxZShpKSl7bGV0IGw9aS5nZXRWYWx1ZSgpO3ZhciBuPWkscj1uLmdldFBhcmVudCgpLG89MTtmb3IociE9bnVsbCYmKHhlKHIpP289ci5nZXRTdGFydCgpOlJsKDQ0KSksbj1uLmdldFByZXZpb3VzU2libGluZ3MoKSxyPTA7cjxuLmxlbmd0aDtyKyspe2xldCBzPW5bcl07cWUocykmJiF4ZShzLmdldEZpcnN0Q2hpbGQoKSkmJm8rK31sIT09byYmaS5zZXRWYWx1ZShvKX19fWZ1bmN0aW9uIEcyKGUpe2lmKCFjcihlKSl7dmFyIHQ9ZS5nZXRQYXJlbnQoKSxuPXQ/dC5nZXRQYXJlbnQoKTp2b2lkIDAscj1uP24uZ2V0UGFyZW50KCk6dm9pZCAwO2lmKHhlKHIpJiZxZShuKSYmeGUodCkpe3ZhciBvPXQ/dC5nZXRGaXJzdENoaWxkKCk6dm9pZCAwLGk9dD90LmdldExhc3RDaGlsZCgpOnZvaWQgMDtpZihlLmlzKG8pKW4uaW5zZXJ0QmVmb3JlKGUpLHQuaXNFbXB0eSgpJiZuLnJlbW92ZSgpO2Vsc2UgaWYoZS5pcyhpKSluLmluc2VydEFmdGVyKGUpLHQuaXNFbXB0eSgpJiZuLnJlbW92ZSgpO2Vsc2V7dmFyIGw9dC5nZXRMaXN0VHlwZSgpO289Q24oKTtsZXQgcz1ybihsKTtvLmFwcGVuZChzKSxlLmdldFByZXZpb3VzU2libGluZ3MoKS5mb3JFYWNoKGE9PnMuYXBwZW5kKGEpKSxpPUNuKCksbD1ybihsKSxpLmFwcGVuZChsKSx5aShsLGUuZ2V0TmV4dFNpYmxpbmdzKCkpLG4uaW5zZXJ0QmVmb3JlKG8pLG4uaW5zZXJ0QWZ0ZXIoaSksbi5yZXBsYWNlKGUpfUp0KHQpLEp0KHIpfX19bGV0IFNkPWNsYXNzIHhTIGV4dGVuZHMgUmUuRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4ibGlzdGl0ZW0ifXN0YXRpYyBjbG9uZSh0KXtyZXR1cm4gbmV3IHhTKHQuX192YWx1ZSx0Ll9fY2hlY2tlZCx0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0LG4scil7c3VwZXIociksdGhpcy5fX3ZhbHVlPXQ9PT12b2lkIDA/MTp0LHRoaXMuX19jaGVja2VkPW59Y3JlYXRlRE9NKHQpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIikscj10aGlzLmdldFBhcmVudCgpO3JldHVybiB4ZShyKSYmci5nZXRMaXN0VHlwZSgpPT09ImNoZWNrIiYmSnkobix0aGlzLG51bGwpLG4udmFsdWU9dGhpcy5fX3ZhbHVlLFF5KG4sdC50aGVtZSx0aGlzKSxufXVwZGF0ZURPTSh0LG4scil7bGV0IG89dGhpcy5nZXRQYXJlbnQoKTtyZXR1cm4geGUobykmJm8uZ2V0TGlzdFR5cGUoKT09PSJjaGVjayImJkp5KG4sdGhpcyx0KSxuLnZhbHVlPXRoaXMuX192YWx1ZSxReShuLHIudGhlbWUsdGhpcyksITF9c3RhdGljIHRyYW5zZm9ybSgpe3JldHVybiB0PT57bGV0IG49dC5nZXRQYXJlbnQoKTt4ZShuKSYmKEp0KG4pLG4uZ2V0TGlzdFR5cGUoKSE9PSJjaGVjayImJnQuZ2V0Q2hlY2tlZCgpIT1udWxsJiZ0LnNldENoZWNrZWQodm9pZCAwKSl9fXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57bGk6KCk9Pih7Y29udmVyc2lvbjpZMixwcmlvcml0eTowfSl9fXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPUNuKCk7cmV0dXJuIG4uc2V0Q2hlY2tlZCh0LmNoZWNrZWQpLG4uc2V0VmFsdWUodC52YWx1ZSksbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxufWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLGNoZWNrZWQ6dGhpcy5nZXRDaGVja2VkKCksdHlwZToibGlzdGl0ZW0iLHZhbHVlOnRoaXMuZ2V0VmFsdWUoKSx2ZXJzaW9uOjF9fWFwcGVuZCguLi50KXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7bGV0IHI9dFtuXTtpZihSZS4kaXNFbGVtZW50Tm9kZShyKSYmdGhpcy5jYW5NZXJnZVdpdGgocikpe2xldCBvPXIuZ2V0Q2hpbGRyZW4oKTt0aGlzLmFwcGVuZCguLi5vKSxyLnJlbW92ZSgpfWVsc2Ugc3VwZXIuYXBwZW5kKHIpfXJldHVybiB0aGlzfXJlcGxhY2UodCxuKXtpZihxZSh0KSlyZXR1cm4gc3VwZXIucmVwbGFjZSh0KTt0aGlzLnNldEluZGVudCgwKTtsZXQgcj10aGlzLmdldFBhcmVudE9yVGhyb3coKTtpZigheGUocikpcmV0dXJuIHQ7aWYoci5fX2ZpcnN0PT09dGhpcy5nZXRLZXkoKSlyLmluc2VydEJlZm9yZSh0KTtlbHNlIGlmKHIuX19sYXN0PT09dGhpcy5nZXRLZXkoKSlyLmluc2VydEFmdGVyKHQpO2Vsc2V7bGV0IG89cm4oci5nZXRMaXN0VHlwZSgpKSxpPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKTtmb3IoO2k7KXtsZXQgbD1pO2k9aS5nZXROZXh0U2libGluZygpLG8uYXBwZW5kKGwpfXIuaW5zZXJ0QWZ0ZXIodCksdC5pbnNlcnRBZnRlcihvKX1yZXR1cm4gbiYmdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2gobz0+e3QuYXBwZW5kKG8pfSksdGhpcy5yZW1vdmUoKSxyLmdldENoaWxkcmVuU2l6ZSgpPT09MCYmci5yZW1vdmUoKSx0fWluc2VydEFmdGVyKHQsbj0hMCl7dmFyIHI9dGhpcy5nZXRQYXJlbnRPclRocm93KCk7eGUocil8fFJsKDM5KTt2YXIgbz10aGlzLmdldE5leHRTaWJsaW5ncygpO2lmKHFlKHQpKXJldHVybiBuPXN1cGVyLmluc2VydEFmdGVyKHQsbiksdD10LmdldFBhcmVudE9yVGhyb3coKSx4ZSh0KSYmSnQodCksbjtpZih4ZSh0KSl7Zm9yKHI9dCx0PXQuZ2V0Q2hpbGRyZW4oKSxvPXQubGVuZ3RoLTE7MDw9bztvLS0pcj10W29dLHRoaXMuaW5zZXJ0QWZ0ZXIocixuKTtyZXR1cm4gcn1pZihyLmluc2VydEFmdGVyKHQsbiksby5sZW5ndGghPT0wKXtsZXQgaT1ybihyLmdldExpc3RUeXBlKCkpO28uZm9yRWFjaChsPT5pLmFwcGVuZChsKSksdC5pbnNlcnRBZnRlcihpLG4pfXJldHVybiB0fXJlbW92ZSh0KXtsZXQgbj10aGlzLmdldFByZXZpb3VzU2libGluZygpLHI9dGhpcy5nZXROZXh0U2libGluZygpO3N1cGVyLnJlbW92ZSh0KSxuJiZyJiZjcihuKSYmY3Iocik/KHlTKG4uZ2V0Rmlyc3RDaGlsZCgpLHIuZ2V0Rmlyc3RDaGlsZCgpKSxyLnJlbW92ZSgpKTpyJiYodD1yLmdldFBhcmVudCgpLHhlKHQpJiZKdCh0KSl9aW5zZXJ0TmV3QWZ0ZXIodCxuPSEwKXtyZXR1cm4gdD1Dbih0aGlzLl9fY2hlY2tlZD09bnVsbD92b2lkIDA6ITEpLHRoaXMuaW5zZXJ0QWZ0ZXIodCxuKSx0fWNvbGxhcHNlQXRTdGFydCh0KXtsZXQgbj1SZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpO3RoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKGw9Pm4uYXBwZW5kKGwpKTt2YXIgcj10aGlzLmdldFBhcmVudE9yVGhyb3coKSxvPXIuZ2V0UGFyZW50T3JUaHJvdygpO2xldCBpPXFlKG8pO3JldHVybiByLmdldENoaWxkcmVuU2l6ZSgpPT09MT9pPyhyLnJlbW92ZSgpLG8uc2VsZWN0KCkpOihyLmluc2VydEJlZm9yZShuKSxyLnJlbW92ZSgpLHI9dC5hbmNob3IsdD10LmZvY3VzLG89bi5nZXRLZXkoKSxyLnR5cGU9PT0iZWxlbWVudCImJnIuZ2V0Tm9kZSgpLmlzKHRoaXMpJiZyLnNldChvLHIub2Zmc2V0LCJlbGVtZW50IiksdC50eXBlPT09ImVsZW1lbnQiJiZ0LmdldE5vZGUoKS5pcyh0aGlzKSYmdC5zZXQobyx0Lm9mZnNldCwiZWxlbWVudCIpKTooci5pbnNlcnRCZWZvcmUobiksdGhpcy5yZW1vdmUoKSksITB9Z2V0VmFsdWUoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3ZhbHVlfXNldFZhbHVlKHQpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3ZhbHVlPXR9Z2V0Q2hlY2tlZCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fY2hlY2tlZH1zZXRDaGVja2VkKHQpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX2NoZWNrZWQ9dH10b2dnbGVDaGVja2VkKCl7dGhpcy5zZXRDaGVja2VkKCF0aGlzLl9fY2hlY2tlZCl9Z2V0SW5kZW50KCl7dmFyIHQ9dGhpcy5nZXRQYXJlbnQoKTtpZih0PT09bnVsbClyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2luZGVudDt0PXQuZ2V0UGFyZW50T3JUaHJvdygpO2xldCBuPTA7Zm9yKDtxZSh0KTspdD10LmdldFBhcmVudE9yVGhyb3coKS5nZXRQYXJlbnRPclRocm93KCksbisrO3JldHVybiBufXNldEluZGVudCh0KXt0eXBlb2YgdD09Im51bWJlciImJi0xPHR8fFJsKDExNyk7bGV0IG49dGhpcy5nZXRJbmRlbnQoKTtmb3IoO24hPT10OylpZihuPHQpe2U6e3ZhciByPW5ldyBTZXQ7aWYoY3IodGhpcyl8fHIuaGFzKHRoaXMuZ2V0S2V5KCkpKWJyZWFrIGU7bGV0IHM9dGhpcy5nZXRQYXJlbnQoKTt2YXIgbz10aGlzLmdldE5leHRTaWJsaW5nKCksaT10aGlzLmdldFByZXZpb3VzU2libGluZygpO2lmKGNyKG8pJiZjcihpKSl7aWYoaT1pLmdldEZpcnN0Q2hpbGQoKSx4ZShpKSl7aS5hcHBlbmQodGhpcyk7dmFyIGw9by5nZXRGaXJzdENoaWxkKCk7eGUobCkmJihsPWwuZ2V0Q2hpbGRyZW4oKSx5aShpLGwpLG8ucmVtb3ZlKCksci5hZGQoby5nZXRLZXkoKSkpLEp0KGkpfX1lbHNlIGNyKG8pPyhvPW8uZ2V0Rmlyc3RDaGlsZCgpLHhlKG8pJiYocj1vLmdldEZpcnN0Q2hpbGQoKSxyIT09bnVsbCYmci5pbnNlcnRCZWZvcmUodGhpcyksSnQobykpKTpjcihpKT8obz1pLmdldEZpcnN0Q2hpbGQoKSx4ZShvKSYmKG8uYXBwZW5kKHRoaXMpLEp0KG8pKSk6eGUocykmJihyPUNuKCksbD1ybihzLmdldExpc3RUeXBlKCkpLHIuYXBwZW5kKGwpLGwuYXBwZW5kKHRoaXMpLGk/aS5pbnNlcnRBZnRlcihyKTpvP28uaW5zZXJ0QmVmb3JlKHIpOnMuYXBwZW5kKHIpLEp0KGwpKTt4ZShzKSYmSnQocyl9bisrfWVsc2UgRzIodGhpcyksbi0tO3JldHVybiB0aGlzfWluc2VydEJlZm9yZSh0KXtpZihxZSh0KSl7bGV0IG49dGhpcy5nZXRQYXJlbnRPclRocm93KCk7aWYoeGUobikpe2xldCByPXRoaXMuZ2V0TmV4dFNpYmxpbmdzKCk7SnQobixyKX19cmV0dXJuIHN1cGVyLmluc2VydEJlZm9yZSh0KX1jYW5JbnNlcnRBZnRlcih0KXtyZXR1cm4gcWUodCl9Y2FuUmVwbGFjZVdpdGgodCl7cmV0dXJuIHFlKHQpfWNhbk1lcmdlV2l0aCh0KXtyZXR1cm4gUmUuJGlzUGFyYWdyYXBoTm9kZSh0KXx8cWUodCl9ZXh0cmFjdFdpdGhDaGlsZCh0LG4pe2lmKCFSZS4kaXNSYW5nZVNlbGVjdGlvbihuKSlyZXR1cm4hMTt0PW4uYW5jaG9yLmdldE5vZGUoKTtsZXQgcj1uLmZvY3VzLmdldE5vZGUoKTtyZXR1cm4gdGhpcy5pc1BhcmVudE9mKHQpJiZ0aGlzLmlzUGFyZW50T2YocikmJnRoaXMuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGg9PT1uLmdldFRleHRDb250ZW50KCkubGVuZ3RofWlzUGFyZW50UmVxdWlyZWQoKXtyZXR1cm4hMH1jcmVhdGVQYXJlbnRFbGVtZW50Tm9kZSgpe3JldHVybiBybigiYnVsbGV0Iil9fTtmdW5jdGlvbiBReShlLHQsbil7bGV0IHI9W10sbz1bXTt2YXIgaT0odD10Lmxpc3QpP3QubGlzdGl0ZW06dm9pZCAwO2lmKHQmJnQubmVzdGVkKXZhciBsPXQubmVzdGVkLmxpc3RpdGVtO2lmKGkhPT12b2lkIDAmJihpPWkuc3BsaXQoIiAiKSxyLnB1c2goLi4uaSkpLHQpe2k9bi5nZXRQYXJlbnQoKSxpPXhlKGkpJiZpLmdldExpc3RUeXBlKCk9PT0iY2hlY2siO2xldCBzPW4uZ2V0Q2hlY2tlZCgpO2kmJiFzfHxvLnB1c2godC5saXN0aXRlbVVuY2hlY2tlZCksaSYmc3x8by5wdXNoKHQubGlzdGl0ZW1DaGVja2VkKSxpJiZyLnB1c2gocz90Lmxpc3RpdGVtQ2hlY2tlZDp0Lmxpc3RpdGVtVW5jaGVja2VkKX1sIT09dm9pZCAwJiYobD1sLnNwbGl0KCIgIiksbi5nZXRDaGlsZHJlbigpLnNvbWUocz0+eGUocykpP3IucHVzaCguLi5sKTpvLnB1c2goLi4ubCkpLDA8by5sZW5ndGgmJkxvLnJlbW92ZUNsYXNzTmFtZXNGcm9tRWxlbWVudChlLC4uLm8pLDA8ci5sZW5ndGgmJkxvLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQoZSwuLi5yKX1mdW5jdGlvbiBKeShlLHQsbil7eGUodC5nZXRGaXJzdENoaWxkKCkpPyhlLnJlbW92ZUF0dHJpYnV0ZSgicm9sZSIpLGUucmVtb3ZlQXR0cmlidXRlKCJ0YWJJbmRleCIpLGUucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWNoZWNrZWQiKSk6KGUuc2V0QXR0cmlidXRlKCJyb2xlIiwiY2hlY2tib3giKSxlLnNldEF0dHJpYnV0ZSgidGFiSW5kZXgiLCItMSIpLG4mJnQuX19jaGVja2VkPT09bi5fX2NoZWNrZWR8fGUuc2V0QXR0cmlidXRlKCJhcmlhLWNoZWNrZWQiLHQuZ2V0Q2hlY2tlZCgpPyJ0cnVlIjoiZmFsc2UiKSl9ZnVuY3Rpb24gWTIoZSl7cmV0dXJuIGU9TG8uaXNIVE1MRWxlbWVudChlKSYmZS5nZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIpPT09InRydWUiLHtub2RlOkNuKGUpfX1mdW5jdGlvbiBDbihlKXtyZXR1cm4gUmUuJGFwcGx5Tm9kZVJlcGxhY2VtZW50KG5ldyBTZCh2b2lkIDAsZSkpfWZ1bmN0aW9uIHFlKGUpe3JldHVybiBlIGluc3RhbmNlb2YgU2R9bGV0IGhtPWNsYXNzIHdTIGV4dGVuZHMgUmUuRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4ibGlzdCJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgd1ModC5fX2xpc3RUeXBlfHxlMFt0Ll9fdGFnXSx0Ll9fc3RhcnQsdC5fX2tleSl9Y29uc3RydWN0b3IodCxuLHIpe3N1cGVyKHIpLHRoaXMuX19saXN0VHlwZT10PWUwW3RdfHx0LHRoaXMuX190YWc9dD09PSJudW1iZXIiPyJvbCI6InVsIix0aGlzLl9fc3RhcnQ9bn1nZXRUYWcoKXtyZXR1cm4gdGhpcy5fX3RhZ31zZXRMaXN0VHlwZSh0KXtsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7bi5fX2xpc3RUeXBlPXQsbi5fX3RhZz10PT09Im51bWJlciI/Im9sIjoidWwifWdldExpc3RUeXBlKCl7cmV0dXJuIHRoaXMuX19saXN0VHlwZX1nZXRTdGFydCgpe3JldHVybiB0aGlzLl9fc3RhcnR9Y3JlYXRlRE9NKHQpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5fX3RhZyk7cmV0dXJuIHRoaXMuX19zdGFydCE9PTEmJm4uc2V0QXR0cmlidXRlKCJzdGFydCIsU3RyaW5nKHRoaXMuX19zdGFydCkpLG4uX19sZXhpY2FsTGlzdFR5cGU9dGhpcy5fX2xpc3RUeXBlLFp5KG4sdC50aGVtZSx0aGlzKSxufXVwZGF0ZURPTSh0LG4scil7cmV0dXJuIHQuX190YWchPT10aGlzLl9fdGFnPyEwOihaeShuLHIudGhlbWUsdGhpcyksITEpfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57b2w6KCk9Pih7Y29udmVyc2lvbjpxeSxwcmlvcml0eTowfSksdWw6KCk9Pih7Y29udmVyc2lvbjpxeSxwcmlvcml0eTowfSl9fXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPXJuKHQubGlzdFR5cGUsdC5zdGFydCk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldEluZGVudCh0LmluZGVudCksbi5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLG59ZXhwb3J0RE9NKHQpe3JldHVybntlbGVtZW50OnR9PXN1cGVyLmV4cG9ydERPTSh0KSx0JiZMby5pc0hUTUxFbGVtZW50KHQpJiYodGhpcy5fX3N0YXJ0IT09MSYmdC5zZXRBdHRyaWJ1dGUoInN0YXJ0IixTdHJpbmcodGhpcy5fX3N0YXJ0KSksdGhpcy5fX2xpc3RUeXBlPT09ImNoZWNrIiYmdC5zZXRBdHRyaWJ1dGUoIl9fbGV4aWNhbExpc3RUeXBlIiwiY2hlY2siKSkse2VsZW1lbnQ6dH19ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksbGlzdFR5cGU6dGhpcy5nZXRMaXN0VHlwZSgpLHN0YXJ0OnRoaXMuZ2V0U3RhcnQoKSx0YWc6dGhpcy5nZXRUYWcoKSx0eXBlOiJsaXN0Iix2ZXJzaW9uOjF9fWNhbkJlRW1wdHkoKXtyZXR1cm4hMX1jYW5JbmRlbnQoKXtyZXR1cm4hMX1hcHBlbmQoLi4udCl7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBuPXRbcl07aWYocWUobikpc3VwZXIuYXBwZW5kKG4pO2Vsc2V7bGV0IG89Q24oKTt4ZShuKXx8UmUuJGlzRWxlbWVudE5vZGUobikmJihuPVJlLiRjcmVhdGVUZXh0Tm9kZShuLmdldFRleHRDb250ZW50KCkpKSxvLmFwcGVuZChuKSxzdXBlci5hcHBlbmQobyl9fXJldHVybiBKdCh0aGlzKSx0aGlzfWV4dHJhY3RXaXRoQ2hpbGQodCl7cmV0dXJuIHFlKHQpfX07ZnVuY3Rpb24gWnkoZSx0LG4pe2xldCByPVtdLG89W107dmFyIGk9dC5saXN0O2lmKGkhPT12b2lkIDApe2xldCBzPWlbYCR7bi5fX3RhZ31EZXB0aGBdfHxbXTt0PWdTKG4pLTE7bGV0IGE9dCVzLmxlbmd0aDt2YXIgbD1zW2FdO2xldCB1PWlbbi5fX3RhZ10sYztpZihpPWkubmVzdGVkLGkhPT12b2lkIDAmJmkubGlzdCYmKGM9aS5saXN0KSx1IT09dm9pZCAwJiZyLnB1c2godSksbCE9PXZvaWQgMClmb3IobD1sLnNwbGl0KCIgIiksci5wdXNoKC4uLmwpLGw9MDtsPHMubGVuZ3RoO2wrKylsIT09YSYmby5wdXNoKG4uX190YWcrbCk7YyE9PXZvaWQgMCYmKG49Yy5zcGxpdCgiICIpLDE8dD9yLnB1c2goLi4ubik6by5wdXNoKC4uLm4pKX0wPG8ubGVuZ3RoJiZMby5yZW1vdmVDbGFzc05hbWVzRnJvbUVsZW1lbnQoZSwuLi5vKSwwPHIubGVuZ3RoJiZMby5hZGRDbGFzc05hbWVzVG9FbGVtZW50KGUsLi4ucil9ZnVuY3Rpb24gWDIoZSl7bGV0IHQ9W107Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBuPWVbcl07cWUobik/KHQucHVzaChuKSxuPW4uZ2V0Q2hpbGRyZW4oKSwxPG4ubGVuZ3RoJiZuLmZvckVhY2gobz0+e3hlKG8pJiZ0LnB1c2goWXkobykpfSkpOnQucHVzaChZeShuKSl9cmV0dXJuIHR9ZnVuY3Rpb24gcXkoZSl7bGV0IHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLG49bnVsbDtyZXR1cm4gdD09PSJvbCI/bj1ybigibnVtYmVyIixlLnN0YXJ0KTp0PT09InVsIiYmKG49TG8uaXNIVE1MRWxlbWVudChlKSYmZS5nZXRBdHRyaWJ1dGUoIl9fbGV4aWNhbGxpc3R0eXBlIik9PT0iY2hlY2siP3JuKCJjaGVjayIpOnJuKCJidWxsZXQiKSkse2FmdGVyOlgyLG5vZGU6bn19bGV0IGUwPXtvbDoibnVtYmVyIix1bDoiYnVsbGV0In07ZnVuY3Rpb24gcm4oZSx0PTEpe3JldHVybiBSZS4kYXBwbHlOb2RlUmVwbGFjZW1lbnQobmV3IGhtKGUsdCkpfWZ1bmN0aW9uIHhlKGUpe3JldHVybiBlIGluc3RhbmNlb2YgaG19bGV0IFEyPVJlLmNyZWF0ZUNvbW1hbmQoIklOU0VSVF9VTk9SREVSRURfTElTVF9DT01NQU5EIiksSjI9UmUuY3JlYXRlQ29tbWFuZCgiSU5TRVJUX09SREVSRURfTElTVF9DT01NQU5EIiksWjI9UmUuY3JlYXRlQ29tbWFuZCgiSU5TRVJUX0NIRUNLX0xJU1RfQ09NTUFORCIpLHEyPVJlLmNyZWF0ZUNvbW1hbmQoIlJFTU9WRV9MSVNUX0NPTU1BTkQiKTthbi4kY3JlYXRlTGlzdEl0ZW1Ob2RlPUNuO2FuLiRjcmVhdGVMaXN0Tm9kZT1ybjthbi4kZ2V0TGlzdERlcHRoPWdTO2FuLiRoYW5kbGVMaXN0SW5zZXJ0UGFyYWdyYXBoPWZ1bmN0aW9uKCl7dmFyIGU9UmUuJGdldFNlbGVjdGlvbigpO2lmKCFSZS4kaXNSYW5nZVNlbGVjdGlvbihlKXx8IWUuaXNDb2xsYXBzZWQoKXx8KGU9ZS5hbmNob3IuZ2V0Tm9kZSgpLCFxZShlKXx8ZS5nZXRDaGlsZHJlblNpemUoKSE9PTApKXJldHVybiExO3ZhciB0PWdwKGUpLG49ZS5nZXRQYXJlbnQoKTt4ZShuKXx8UmwoNDApO2xldCByPW4uZ2V0UGFyZW50KCksbztpZihSZS4kaXNSb290T3JTaGFkb3dSb290KHIpKW89UmUuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSx0Lmluc2VydEFmdGVyKG8pO2Vsc2UgaWYocWUocikpbz1DbigpLHIuaW5zZXJ0QWZ0ZXIobyk7ZWxzZSByZXR1cm4hMTtpZihvLnNlbGVjdCgpLHQ9ZS5nZXROZXh0U2libGluZ3MoKSwwPHQubGVuZ3RoKXtsZXQgaT1ybihuLmdldExpc3RUeXBlKCkpO1JlLiRpc1BhcmFncmFwaE5vZGUobyk/by5pbnNlcnRBZnRlcihpKToobj1DbigpLG4uYXBwZW5kKGkpLG8uaW5zZXJ0QWZ0ZXIobikpLHQuZm9yRWFjaChsPT57bC5yZW1vdmUoKSxpLmFwcGVuZChsKX0pfXJldHVybiBLMihlKSwhMH07YW4uJGlzTGlzdEl0ZW1Ob2RlPXFlO2FuLiRpc0xpc3ROb2RlPXhlO2FuLklOU0VSVF9DSEVDS19MSVNUX0NPTU1BTkQ9WjI7YW4uSU5TRVJUX09SREVSRURfTElTVF9DT01NQU5EPUoyO2FuLklOU0VSVF9VTk9SREVSRURfTElTVF9DT01NQU5EPVEyO2FuLkxpc3RJdGVtTm9kZT1TZDthbi5MaXN0Tm9kZT1obTthbi5SRU1PVkVfTElTVF9DT01NQU5EPXEyO2FuLmluc2VydExpc3Q9ZnVuY3Rpb24oZSx0KXtlLnVwZGF0ZSgoKT0+e3ZhciBuPVJlLiRnZXRTZWxlY3Rpb24oKTtpZihSZS4kaXNSYW5nZVNlbGVjdGlvbihuKXx8UmUuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pKXt2YXIgcj1uLmdldE5vZGVzKCk7bj1uLmFuY2hvci5nZXROb2RlKCk7dmFyIG89bi5nZXRQYXJlbnQoKTtpZih2UyhuLHIpKXI9cm4odCksUmUuJGlzUm9vdE9yU2hhZG93Um9vdChvKT8obi5yZXBsYWNlKHIpLG89Q24oKSxSZS4kaXNFbGVtZW50Tm9kZShuKSYmKG8uc2V0Rm9ybWF0KG4uZ2V0Rm9ybWF0VHlwZSgpKSxvLnNldEluZGVudChuLmdldEluZGVudCgpKSksci5hcHBlbmQobykpOnFlKG4pJiYobj1uLmdldFBhcmVudE9yVGhyb3coKSx5aShyLG4uZ2V0Q2hpbGRyZW4oKSksbi5yZXBsYWNlKHIpKTtlbHNlIGZvcihuPW5ldyBTZXQsbz0wO288ci5sZW5ndGg7bysrKXt2YXIgaT1yW29dO2lmKFJlLiRpc0VsZW1lbnROb2RlKGkpJiZpLmlzRW1wdHkoKSYmIW4uaGFzKGkuZ2V0S2V5KCkpKVh5KGksdCk7ZWxzZSBpZihSZS4kaXNMZWFmTm9kZShpKSlmb3IoaT1pLmdldFBhcmVudCgpO2khPW51bGw7KXtsZXQgcz1pLmdldEtleSgpO2lmKHhlKGkpKXtpZighbi5oYXMocykpe3ZhciBsPXJuKHQpO3lpKGwsaS5nZXRDaGlsZHJlbigpKSxpLnJlcGxhY2UobCksSnQobCksbi5hZGQocyl9YnJlYWt9ZWxzZXtpZihsPWkuZ2V0UGFyZW50KCksUmUuJGlzUm9vdE9yU2hhZG93Um9vdChsKSYmIW4uaGFzKHMpKXtuLmFkZChzKSxYeShpLHQpO2JyZWFrfWk9bH19fX19KX07YW4ucmVtb3ZlTGlzdD1mdW5jdGlvbihlKXtlLnVwZGF0ZSgoKT0+e2xldCB0PVJlLiRnZXRTZWxlY3Rpb24oKTtpZihSZS4kaXNSYW5nZVNlbGVjdGlvbih0KSl7dmFyIG49bmV3IFNldCxyPXQuZ2V0Tm9kZXMoKSxvPXQuYW5jaG9yLmdldE5vZGUoKTtpZih2UyhvLHIpKW4uYWRkKGdwKG8pKTtlbHNlIGZvcihvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb107UmUuJGlzTGVhZk5vZGUoaSkmJihpPUxvLiRnZXROZWFyZXN0Tm9kZU9mVHlwZShpLFNkKSxpIT1udWxsJiZuLmFkZChncChpKSkpfWZvcihsZXQgbCBvZiBuKXtuPWwscj1tUyhsKTtmb3IobGV0IHMgb2YgcilyPVJlLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCkseWkocixzLmdldENoaWxkcmVuKCkpLG4uaW5zZXJ0QWZ0ZXIociksbj1yLHMuX19rZXk9PT10LmFuY2hvci5rZXkmJnQuYW5jaG9yLnNldChyLmdldEtleSgpLDAsImVsZW1lbnQiKSxzLl9fa2V5PT09dC5mb2N1cy5rZXkmJnQuZm9jdXMuc2V0KHIuZ2V0S2V5KCksMCwiZWxlbWVudCIpLHMucmVtb3ZlKCk7bC5yZW1vdmUoKX19fSl9O2NvbnN0IGVSPWFuO3ZhciBwbz1lUixfUz17fSxFZD17fSxTUz1wO2Z1bmN0aW9uIHRSKGUpe2xldCB0PW5ldyBVUkxTZWFyY2hQYXJhbXM7dC5hcHBlbmQoImNvZGUiLGUpO2ZvcihsZXQgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdC5hcHBlbmQoInYiLGFyZ3VtZW50c1tuXSk7dGhyb3cgRXJyb3IoYE1pbmlmaWVkIExleGljYWwgZXJyb3IgIyR7ZX07IHZpc2l0IGh0dHBzOi8vbGV4aWNhbC5kZXYvZG9jcy9lcnJvcj8ke3R9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5gKX1sZXQgRVM9U1MuY3JlYXRlQ29udGV4dChudWxsKTtFZC5MZXhpY2FsQ29tcG9zZXJDb250ZXh0PUVTO0VkLmNyZWF0ZUxleGljYWxDb21wb3NlckNvbnRleHQ9ZnVuY3Rpb24oZSx0KXtsZXQgbj1udWxsO3JldHVybiBlIT1udWxsJiYobj1lWzFdKSx7Z2V0VGhlbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdD8/KG4hPW51bGw/bi5nZXRUaGVtZSgpOm51bGwpfX19O0VkLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQ9ZnVuY3Rpb24oKXtsZXQgZT1TUy51c2VDb250ZXh0KEVTKTtyZXR1cm4gZT09bnVsbCYmdFIoOCksZX07Y29uc3QgblI9RWQ7dmFyIGlyPW5SLHQwPWlyLENzPW1lLERjPXA7bGV0IENTPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1Ijt2YXIgclI9Q1M/RGMudXNlTGF5b3V0RWZmZWN0OkRjLnVzZUVmZmVjdDtsZXQgbXU9e3RhZzoiaGlzdG9yeS1tZXJnZSJ9O2Z1bmN0aW9uIG9SKGUsdCl7aWYodCE9PW51bGwpe2lmKHQ9PT12b2lkIDApZS51cGRhdGUoKCk9Pnt2YXIgbj1Dcy4kZ2V0Um9vdCgpO2lmKG4uaXNFbXB0eSgpKXtsZXQgcj1Dcy4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpO24uYXBwZW5kKHIpLG49Q1M/ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDpudWxsLChDcy4kZ2V0U2VsZWN0aW9uKCkhPT1udWxsfHxuIT09bnVsbCYmbj09PWUuZ2V0Um9vdEVsZW1lbnQoKSkmJnIuc2VsZWN0KCl9fSxtdSk7ZWxzZSBpZih0IT09bnVsbClzd2l0Y2godHlwZW9mIHQpe2Nhc2Uic3RyaW5nIjpsZXQgbj1lLnBhcnNlRWRpdG9yU3RhdGUodCk7ZS5zZXRFZGl0b3JTdGF0ZShuLG11KTticmVhaztjYXNlIm9iamVjdCI6ZS5zZXRFZGl0b3JTdGF0ZSh0LG11KTticmVhaztjYXNlImZ1bmN0aW9uIjplLnVwZGF0ZSgoKT0+e0NzLiRnZXRSb290KCkuaXNFbXB0eSgpJiZ0KGUpfSxtdSl9fX1fUy5MZXhpY2FsQ29tcG9zZXI9ZnVuY3Rpb24oe2luaXRpYWxDb25maWc6ZSxjaGlsZHJlbjp0fSl7bGV0IG49RGMudXNlTWVtbygoKT0+e2NvbnN0e3RoZW1lOnIsbmFtZXNwYWNlOm8sZWRpdG9yX19ERVBSRUNBVEVEOmksbm9kZXM6bCxvbkVycm9yOnMsZWRpdG9yU3RhdGU6YX09ZSx1PXQwLmNyZWF0ZUxleGljYWxDb21wb3NlckNvbnRleHQobnVsbCxyKTtsZXQgYz1pfHxudWxsO2lmKGM9PT1udWxsKXtjb25zdCBkPUNzLmNyZWF0ZUVkaXRvcih7ZWRpdGFibGU6ZS5lZGl0YWJsZSxuYW1lc3BhY2U6byxub2RlczpsLG9uRXJyb3I6Zj0+cyhmLGQpLHRoZW1lOnJ9KTtvUihkLGEpLGM9ZH1yZXR1cm5bYyx1XX0sW10pO3JldHVybiByUigoKT0+e2xldCByPWUuZWRpdGFibGUsW29dPW47by5zZXRFZGl0YWJsZShyIT09dm9pZCAwP3I6ITApfSxbXSksRGMuY3JlYXRlRWxlbWVudCh0MC5MZXhpY2FsQ29tcG9zZXJDb250ZXh0LlByb3ZpZGVyLHt2YWx1ZTpufSx0KX07Y29uc3QgaVI9X1M7dmFyIGxSPWlSLFVzPXA7ZnVuY3Rpb24gbXAoZSx0KXtyZXR1cm4gbXA9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24obixyKXtyZXR1cm4gbi5fX3Byb3RvX189cixufSxtcChlLHQpfWZ1bmN0aW9uIHNSKGUsdCl7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSksZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxtcChlLHQpfWZ1bmN0aW9uIGFSKGUsdCl7cmV0dXJuIGU9PT12b2lkIDAmJihlPVtdKSx0PT09dm9pZCAwJiYodD1bXSksZS5sZW5ndGghPT10Lmxlbmd0aHx8ZS5zb21lKGZ1bmN0aW9uKG4scil7cmV0dXJuIU9iamVjdC5pcyhuLHRbcl0pfSl9dmFyIG4wPXtlcnJvcjpudWxsfSx1Uj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7Zm9yKHZhciByLG89YXJndW1lbnRzLmxlbmd0aCxpPUFycmF5KG8pLGw9MDtsPG87bCsrKWlbbF09YXJndW1lbnRzW2xdO3JldHVybiByPWUuY2FsbC5hcHBseShlLFt0aGlzXS5jb25jYXQoaSkpfHx0aGlzLHIuc3RhdGU9bjAsci5yZXNldEVycm9yQm91bmRhcnk9ZnVuY3Rpb24oKXtmb3IodmFyIHMsYT1hcmd1bWVudHMubGVuZ3RoLHU9QXJyYXkoYSksYz0wO2M8YTtjKyspdVtjXT1hcmd1bWVudHNbY107ci5wcm9wcy5vblJlc2V0PT1udWxsfHwocz1yLnByb3BzKS5vblJlc2V0LmFwcGx5KHMsdSksci5yZXNldCgpfSxyfXNSKHQsZSksdC5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I9ZnVuY3Rpb24ocil7cmV0dXJue2Vycm9yOnJ9fTt2YXIgbj10LnByb3RvdHlwZTtyZXR1cm4gbi5yZXNldD1mdW5jdGlvbigpe3RoaXMuc2V0U3RhdGUobjApfSxuLmNvbXBvbmVudERpZENhdGNoPWZ1bmN0aW9uKHIsbyl7dmFyIGksbDsoaT0obD10aGlzLnByb3BzKS5vbkVycm9yKT09bnVsbHx8aS5jYWxsKGwscixvKX0sbi5jb21wb25lbnREaWRVcGRhdGU9ZnVuY3Rpb24ocixvKXt2YXIgaT10aGlzLnByb3BzLnJlc2V0S2V5cztpZih0aGlzLnN0YXRlLmVycm9yIT09bnVsbCYmby5lcnJvciE9PW51bGwmJmFSKHIucmVzZXRLZXlzLGkpKXt2YXIgbCxzOyhsPShzPXRoaXMucHJvcHMpLm9uUmVzZXRLZXlzQ2hhbmdlKT09bnVsbHx8bC5jYWxsKHMsci5yZXNldEtleXMsaSksdGhpcy5yZXNldCgpfX0sbi5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgcj10aGlzLnN0YXRlLmVycm9yLG89dGhpcy5wcm9wcyxpPW8uZmFsbGJhY2tSZW5kZXIsbD1vLkZhbGxiYWNrQ29tcG9uZW50O2lmKG89by5mYWxsYmFjayxyIT09bnVsbCl7aWYocj17ZXJyb3I6cixyZXNldEVycm9yQm91bmRhcnk6dGhpcy5yZXNldEVycm9yQm91bmRhcnl9LFVzLmlzVmFsaWRFbGVtZW50KG8pKXJldHVybiBvO2lmKHR5cGVvZiBpPT0iZnVuY3Rpb24iKXJldHVybiBpKHIpO2lmKGwpcmV0dXJuIFVzLmNyZWF0ZUVsZW1lbnQobCxyKTt0aHJvdyBFcnJvcigicmVhY3QtZXJyb3ItYm91bmRhcnkgcmVxdWlyZXMgZWl0aGVyIGEgZmFsbGJhY2ssIGZhbGxiYWNrUmVuZGVyLCBvciBGYWxsYmFja0NvbXBvbmVudCBwcm9wIil9cmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW59LHR9KFVzLkNvbXBvbmVudCksY1I9ZnVuY3Rpb24oe2NoaWxkcmVuOmUsb25FcnJvcjp0fSl7cmV0dXJuIFVzLmNyZWF0ZUVsZW1lbnQodVIse2ZhbGxiYWNrOlVzLmNyZWF0ZUVsZW1lbnQoImRpdiIse3N0eWxlOntib3JkZXI6IjFweCBzb2xpZCAjZjAwIixjb2xvcjoiI2YwMCIscGFkZGluZzoiOHB4In19LCJBbiBlcnJvciB3YXMgdGhyb3duLiIpLG9uRXJyb3I6dH0sZSl9O2NvbnN0IGRSPWNSO3ZhciBmUj1kUjtjb25zdCBoUj1iYShmUik7dmFyIHBtPXt9LGdtPXt9LHBSPU50LHplPW1lO2Z1bmN0aW9uIGdSKGUsdCxuLHIsbyl7aWYoZT09PW51bGx8fG4uc2l6ZT09PTAmJnIuc2l6ZT09PTAmJiFvKXJldHVybiAwO3ZhciBpPXQuX3NlbGVjdGlvbixsPWUuX3NlbGVjdGlvbjtpZihvKXJldHVybiAxO2lmKCEoemUuJGlzUmFuZ2VTZWxlY3Rpb24oaSkmJnplLiRpc1JhbmdlU2VsZWN0aW9uKGwpJiZsLmlzQ29sbGFwc2VkKCkmJmkuaXNDb2xsYXBzZWQoKSkpcmV0dXJuIDA7bz10Ll9ub2RlTWFwO2xldCBzPVtdO2ZvcihsZXQgYSBvZiBuKW49by5nZXQoYSksbiE9PXZvaWQgMCYmcy5wdXNoKG4pO2ZvcihsZXRbYSx1XW9mIHIpdSYmKHI9by5nZXQoYSkscj09PXZvaWQgMHx8emUuJGlzUm9vdE5vZGUocil8fHMucHVzaChyKSk7cmV0dXJuIHMubGVuZ3RoPT09MD8wOjE8cy5sZW5ndGg/KHI9dC5fbm9kZU1hcCx0PXIuZ2V0KGkuYW5jaG9yLmtleSksbD1yLmdldChsLmFuY2hvci5rZXkpLHQmJmwmJiFlLl9ub2RlTWFwLmhhcyh0Ll9fa2V5KSYmemUuJGlzVGV4dE5vZGUodCkmJnQuX190ZXh0Lmxlbmd0aD09PTEmJmkuYW5jaG9yLm9mZnNldD09PTE/MjowKToodD1zWzBdLGU9ZS5fbm9kZU1hcC5nZXQodC5fX2tleSksIXplLiRpc1RleHROb2RlKGUpfHwhemUuJGlzVGV4dE5vZGUodCl8fGUuX19tb2RlIT09dC5fX21vZGV8fChlPWUuX190ZXh0LHQ9dC5fX3RleHQsZT09PXQpfHwoaT1pLmFuY2hvcixsPWwuYW5jaG9yLGkua2V5IT09bC5rZXl8fGkudHlwZSE9PSJ0ZXh0Iik/MDooaT1pLm9mZnNldCxsPWwub2Zmc2V0LGU9dC5sZW5ndGgtZS5sZW5ndGgsZT09PTEmJmw9PT1pLTE/MjplPT09LTEmJmw9PT1pKzE/MzplPT09LTEmJmw9PT1pPzQ6MCkpfWZ1bmN0aW9uIG1SKGUsdCl7bGV0IG49RGF0ZS5ub3coKSxyPTA7cmV0dXJuKG8saSxsLHMsYSx1KT0+e2xldCBjPURhdGUubm93KCk7aWYodS5oYXMoImhpc3RvcmljIikpcmV0dXJuIHI9MCxuPWMsMjtsZXQgZD1nUihvLGkscyxhLGUuaXNDb21wb3NpbmcoKSksZj0oKCk9Pnt2YXIgaD1sPT09bnVsbHx8bC5lZGl0b3I9PT1lLG09dS5oYXMoImhpc3RvcnktcHVzaCIpO2lmKCFtJiZoJiZ1LmhhcygiaGlzdG9yeS1tZXJnZSIpKXJldHVybiAwO2lmKG89PT1udWxsKXJldHVybiAxO3ZhciBnPWkuX3NlbGVjdGlvbjtpZighKDA8cy5zaXplfHwwPGEuc2l6ZSkpcmV0dXJuIGchPT1udWxsPzA6MjtpZihtPT09ITEmJmQhPT0wJiZkPT09ciYmYzxuK3QmJmgpcmV0dXJuIDA7aWYocy5zaXplPT09MSl7e209QXJyYXkuZnJvbShzKVswXSxoPW8uX25vZGVNYXAuZ2V0KG0pLG09aS5fbm9kZU1hcC5nZXQobSksZz1vLl9zZWxlY3Rpb247bGV0IFM9aS5fc2VsZWN0aW9uLHY9ITE7emUuJGlzUmFuZ2VTZWxlY3Rpb24oZykmJnplLiRpc1JhbmdlU2VsZWN0aW9uKFMpJiYodj1nLmFuY2hvci50eXBlPT09ImVsZW1lbnQiJiZnLmZvY3VzLnR5cGU9PT0iZWxlbWVudCImJlMuYW5jaG9yLnR5cGU9PT0idGV4dCImJlMuZm9jdXMudHlwZT09PSJ0ZXh0IiksaD0hdiYmemUuJGlzVGV4dE5vZGUoaCkmJnplLiRpc1RleHROb2RlKG0pP2guX190eXBlPT09bS5fX3R5cGUmJmguX190ZXh0PT09bS5fX3RleHQmJmguX19tb2RlPT09bS5fX21vZGUmJmguX19kZXRhaWw9PT1tLl9fZGV0YWlsJiZoLl9fc3R5bGU9PT1tLl9fc3R5bGUmJmguX19mb3JtYXQ9PT1tLl9fZm9ybWF0JiZoLl9fcGFyZW50PT09bS5fX3BhcmVudDohMX1pZihoKXJldHVybiAwfXJldHVybiAxfSkoKTtyZXR1cm4gbj1jLHI9ZCxmfX1nbS5jcmVhdGVFbXB0eUhpc3RvcnlTdGF0ZT1mdW5jdGlvbigpe3JldHVybntjdXJyZW50Om51bGwscmVkb1N0YWNrOltdLHVuZG9TdGFjazpbXX19O2dtLnJlZ2lzdGVySGlzdG9yeT1mdW5jdGlvbihlLHQsbil7bGV0IHI9bVIoZSxuKTtuPSh7ZWRpdG9yU3RhdGU6bCxwcmV2RWRpdG9yU3RhdGU6cyxkaXJ0eUxlYXZlczphLGRpcnR5RWxlbWVudHM6dSx0YWdzOmN9KT0+e2NvbnN0IGQ9dC5jdXJyZW50LGY9dC5yZWRvU3RhY2ssaD10LnVuZG9TdGFjayxtPWQ9PT1udWxsP251bGw6ZC5lZGl0b3JTdGF0ZTtpZihkPT09bnVsbHx8bCE9PW0pe2lmKHM9cihzLGwsZCxhLHUsYykscz09PTEpZi5sZW5ndGghPT0wJiYodC5yZWRvU3RhY2s9W10sZS5kaXNwYXRjaENvbW1hbmQoemUuQ0FOX1JFRE9fQ09NTUFORCwhMSkpLGQhPT1udWxsJiYoaC5wdXNoKHsuLi5kfSksZS5kaXNwYXRjaENvbW1hbmQoemUuQ0FOX1VORE9fQ09NTUFORCwhMCkpO2Vsc2UgaWYocz09PTIpcmV0dXJuO3QuY3VycmVudD17ZWRpdG9yOmUsZWRpdG9yU3RhdGU6bH19fTtsZXQgbz1wUi5tZXJnZVJlZ2lzdGVyKGUucmVnaXN0ZXJDb21tYW5kKHplLlVORE9fQ09NTUFORCwoKT0+e2xldCBsPXQucmVkb1N0YWNrLHM9dC51bmRvU3RhY2s7aWYocy5sZW5ndGghPT0wKXtsZXQgYT10LmN1cnJlbnQsdT1zLnBvcCgpO2EhPT1udWxsJiYobC5wdXNoKGEpLGUuZGlzcGF0Y2hDb21tYW5kKHplLkNBTl9SRURPX0NPTU1BTkQsITApKSxzLmxlbmd0aD09PTAmJmUuZGlzcGF0Y2hDb21tYW5kKHplLkNBTl9VTkRPX0NPTU1BTkQsITEpLHQuY3VycmVudD11fHxudWxsLHUmJnUuZWRpdG9yLnNldEVkaXRvclN0YXRlKHUuZWRpdG9yU3RhdGUse3RhZzoiaGlzdG9yaWMifSl9cmV0dXJuITB9LHplLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZCh6ZS5SRURPX0NPTU1BTkQsKCk9PntsZXQgbD10LnJlZG9TdGFjazt2YXIgcz10LnVuZG9TdGFjaztpZihsLmxlbmd0aCE9PTApe2xldCBhPXQuY3VycmVudDthIT09bnVsbCYmKHMucHVzaChhKSxlLmRpc3BhdGNoQ29tbWFuZCh6ZS5DQU5fVU5ET19DT01NQU5ELCEwKSkscz1sLnBvcCgpLGwubGVuZ3RoPT09MCYmZS5kaXNwYXRjaENvbW1hbmQoemUuQ0FOX1JFRE9fQ09NTUFORCwhMSksdC5jdXJyZW50PXN8fG51bGwscyYmcy5lZGl0b3Iuc2V0RWRpdG9yU3RhdGUocy5lZGl0b3JTdGF0ZSx7dGFnOiJoaXN0b3JpYyJ9KX1yZXR1cm4hMH0semUuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKHplLkNMRUFSX0VESVRPUl9DT01NQU5ELCgpPT4odC51bmRvU3RhY2s9W10sdC5yZWRvU3RhY2s9W10sdC5jdXJyZW50PW51bGwsITEpLHplLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZCh6ZS5DTEVBUl9ISVNUT1JZX0NPTU1BTkQsKCk9Pih0LnVuZG9TdGFjaz1bXSx0LnJlZG9TdGFjaz1bXSx0LmN1cnJlbnQ9bnVsbCxlLmRpc3BhdGNoQ29tbWFuZCh6ZS5DQU5fUkVET19DT01NQU5ELCExKSxlLmRpc3BhdGNoQ29tbWFuZCh6ZS5DQU5fVU5ET19DT01NQU5ELCExKSwhMCksemUuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcihuKSksaT1lLnJlZ2lzdGVyVXBkYXRlTGlzdGVuZXIobik7cmV0dXJuKCk9PntvKCksaSgpfX07Y29uc3QgdlI9Z207dmFyIHlSPXZSLHhSPWlyLHZwPXlSLHIwPXA7ZnVuY3Rpb24gd1IoZSx0LG49MWUzKXtsZXQgcj1yMC51c2VNZW1vKCgpPT50fHx2cC5jcmVhdGVFbXB0eUhpc3RvcnlTdGF0ZSgpLFt0XSk7cjAudXNlRWZmZWN0KCgpPT52cC5yZWdpc3Rlckhpc3RvcnkoZSxyLG4pLFtuLGUscl0pfXBtLmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlPXZwLmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlO3BtLkhpc3RvcnlQbHVnaW49ZnVuY3Rpb24oe2V4dGVybmFsSGlzdG9yeVN0YXRlOmV9KXtsZXRbdF09eFIudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiB3Uih0LGUpLG51bGx9O2NvbnN0IF9SPXBtO3ZhciBTUj1fUiwkUz17fSxFUj1pcixWcz1wLENSPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1Ij9Wcy51c2VMYXlvdXRFZmZlY3Q6VnMudXNlRWZmZWN0O2Z1bmN0aW9uICRSKGUpe2xldFt0XT1FUi51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCksbj1Wcy51c2VNZW1vKCgpPT5lKHQpLFt0LGVdKSxyPVZzLnVzZVJlZihuLmluaXRpYWxWYWx1ZUZuKCkpLFtvLGldPVZzLnVzZVN0YXRlKHIuY3VycmVudCk7cmV0dXJuIENSKCgpPT57bGV0e2luaXRpYWxWYWx1ZUZuOmwsc3Vic2NyaWJlOnN9PW4sYT1sKCk7cmV0dXJuIHIuY3VycmVudCE9PWEmJihyLmN1cnJlbnQ9YSxpKGEpKSxzKHU9PntyLmN1cnJlbnQ9dSxpKHUpfSl9LFtuLGVdKSxvfWZ1bmN0aW9uIGtSKGUpe3JldHVybntpbml0aWFsVmFsdWVGbjooKT0+ZS5pc0VkaXRhYmxlKCksc3Vic2NyaWJlOnQ9PmUucmVnaXN0ZXJFZGl0YWJsZUxpc3RlbmVyKHQpfX12YXIgVFI9ZnVuY3Rpb24oKXtyZXR1cm4gJFIoa1IpfTtjb25zdCBiUj1UUjt2YXIgTlI9YlIsV289e30sWnQ9bWU7ZnVuY3Rpb24gbW0oZSx0PSEwKXtyZXR1cm4gZT8hMTooZT1rUygpLHQmJihlPWUudHJpbSgpKSxlPT09IiIpfWZ1bmN0aW9uIGtTKCl7cmV0dXJuIFp0LiRnZXRSb290KCkuZ2V0VGV4dENvbnRlbnQoKX1mdW5jdGlvbiBUUyhlKXtpZighbW0oZSwhMSkpcmV0dXJuITE7ZT1adC4kZ2V0Um9vdCgpLmdldENoaWxkcmVuKCk7bGV0IHQ9ZS5sZW5ndGg7aWYoMTx0KXJldHVybiExO2ZvcihsZXQgcj0wO3I8dDtyKyspe3ZhciBuPWVbcl07aWYoWnQuJGlzRGVjb3JhdG9yTm9kZShuKSlyZXR1cm4hMTtpZihadC4kaXNFbGVtZW50Tm9kZShuKSl7aWYoIVp0LiRpc1BhcmFncmFwaE5vZGUobil8fG4uX19pbmRlbnQhPT0wKXJldHVybiExO249bi5nZXRDaGlsZHJlbigpO2xldCBvPW4ubGVuZ3RoO2ZvcihsZXQgaT0wO2k8bztpKyspaWYoIVp0LiRpc1RleHROb2RlKG5bcl0pKXJldHVybiExfX1yZXR1cm4hMH1Xby4kY2FuU2hvd1BsYWNlaG9sZGVyPVRTO1dvLiRjYW5TaG93UGxhY2Vob2xkZXJDdXJyeT1mdW5jdGlvbihlKXtyZXR1cm4oKT0+VFMoZSl9O1dvLiRmaW5kVGV4dEludGVyc2VjdGlvbkZyb21DaGFyYWN0ZXJzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5nZXRGaXJzdENoaWxkKCk7ZT0wO2U6Zm9yKDtuIT09bnVsbDspe2lmKFp0LiRpc0VsZW1lbnROb2RlKG4pKXt2YXIgcj1uLmdldEZpcnN0Q2hpbGQoKTtpZihyIT09bnVsbCl7bj1yO2NvbnRpbnVlfX1lbHNlIGlmKFp0LiRpc1RleHROb2RlKG4pKXtpZihyPW4uZ2V0VGV4dENvbnRlbnRTaXplKCksZStyPnQpcmV0dXJue25vZGU6bixvZmZzZXQ6dC1lfTtlKz1yfWlmKHI9bi5nZXROZXh0U2libGluZygpLHIhPT1udWxsKW49cjtlbHNle2ZvcihuPW4uZ2V0UGFyZW50KCk7biE9PW51bGw7KXtpZihyPW4uZ2V0TmV4dFNpYmxpbmcoKSxyIT09bnVsbCl7bj1yO2NvbnRpbnVlIGV9bj1uLmdldFBhcmVudCgpfWJyZWFrfX1yZXR1cm4gbnVsbH07V28uJGlzUm9vdFRleHRDb250ZW50RW1wdHk9bW07V28uJGlzUm9vdFRleHRDb250ZW50RW1wdHlDdXJyeT1mdW5jdGlvbihlLHQpe3JldHVybigpPT5tbShlLHQpfTtXby4kcm9vdFRleHRDb250ZW50PWtTO1dvLnJlZ2lzdGVyTGV4aWNhbFRleHRFbnRpdHk9ZnVuY3Rpb24oZSx0LG4scil7bGV0IG89bD0+e2NvbnN0IHM9WnQuJGNyZWF0ZVRleHROb2RlKGwuZ2V0VGV4dENvbnRlbnQoKSk7cy5zZXRGb3JtYXQobC5nZXRGb3JtYXQoKSksbC5yZXBsYWNlKHMpfSxpPWUucmVnaXN0ZXJOb2RlVHJhbnNmb3JtKFp0LlRleHROb2RlLGw9PntpZihsLmlzU2ltcGxlVGV4dCgpKXt2YXIgcz1sLmdldFByZXZpb3VzU2libGluZygpLGE9bC5nZXRUZXh0Q29udGVudCgpLHU9bDtpZihadC4kaXNUZXh0Tm9kZShzKSl7dmFyIGM9cy5nZXRUZXh0Q29udGVudCgpLGQ9dChjK2EpO2lmKHMgaW5zdGFuY2VvZiBuKXtpZihkPT09bnVsbHx8cy5nZXRMYXRlc3QoKS5fX21vZGUhPT0wKXtvKHMpO3JldHVybn1pZihkPWQuZW5kLWMubGVuZ3RoLDA8ZCl7dT1hLnNsaWNlKDAsZCksdT1jK3Uscy5zZWxlY3QoKSxzLnNldFRleHRDb250ZW50KHUpLGQ9PT1hLmxlbmd0aD9sLnJlbW92ZSgpOihzPWEuc2xpY2UoZCksbC5zZXRUZXh0Q29udGVudChzKSk7cmV0dXJufX1lbHNlIGlmKGQ9PT1udWxsfHxkLnN0YXJ0PGMubGVuZ3RoKXJldHVybn1mb3IoOzspe2lmKGw9dChhKSxhPWQ9bD09PW51bGw/IiI6YS5zbGljZShsLmVuZCksZD09PSIiKXtpZihjPXUuZ2V0TmV4dFNpYmxpbmcoKSxadC4kaXNUZXh0Tm9kZShjKSl7aWYoZD11LmdldFRleHRDb250ZW50KCkrYy5nZXRUZXh0Q29udGVudCgpLGQ9dChkKSxkPT09bnVsbCl7YyBpbnN0YW5jZW9mIG4/byhjKTpjLm1hcmtEaXJ0eSgpO2JyZWFrfWVsc2UgaWYoZC5zdGFydCE9PTApYnJlYWt9fWVsc2UgaWYoYz10KGQpLGMhPT1udWxsJiZjLnN0YXJ0PT09MClicmVhaztpZihsPT09bnVsbClicmVhaztpZihsLnN0YXJ0PT09MCYmWnQuJGlzVGV4dE5vZGUocykmJnMuaXNUZXh0RW50aXR5KCkpY29udGludWU7bGV0IGY7aWYobC5zdGFydD09PTA/W2YsdV09dS5zcGxpdFRleHQobC5lbmQpOlssZix1XT11LnNwbGl0VGV4dChsLnN0YXJ0LGwuZW5kKSxsPXIoZiksbC5zZXRGb3JtYXQoZi5nZXRGb3JtYXQoKSksZi5yZXBsYWNlKGwpLHU9PW51bGwpYnJlYWt9fX0pO3JldHVybiBlPWUucmVnaXN0ZXJOb2RlVHJhbnNmb3JtKG4sbD0+e3ZhciBzPWwuZ2V0VGV4dENvbnRlbnQoKTtjb25zdCBhPXQocyk7YT09PW51bGx8fGEuc3RhcnQhPT0wP28obCk6cy5sZW5ndGg+YS5lbmQ/bC5zcGxpdFRleHQoYS5lbmQpOihzPWwuZ2V0UHJldmlvdXNTaWJsaW5nKCksWnQuJGlzVGV4dE5vZGUocykmJnMuaXNUZXh0RW50aXR5KCkmJihvKHMpLG8obCkpLHM9bC5nZXROZXh0U2libGluZygpLFp0LiRpc1RleHROb2RlKHMpJiZzLmlzVGV4dEVudGl0eSgpJiYobyhzKSxsIGluc3RhbmNlb2YgbiYmbyhsKSkpfSksW2ksZV19O2NvbnN0IFJSPVdvO3ZhciBQUj1SUixiUz17fSx2dT1tZTtiUy5yZWdpc3RlckRyYWdvblN1cHBvcnQ9ZnVuY3Rpb24oZSl7bGV0IHQ9d2luZG93LmxvY2F0aW9uLm9yaWdpbixuPXI9PntpZihyLm9yaWdpbj09PXQpe3ZhciBvPWUuZ2V0Um9vdEVsZW1lbnQoKTtpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09byYmKG89ci5kYXRhLHR5cGVvZiBvPT0ic3RyaW5nIikpe3RyeXt2YXIgaT1KU09OLnBhcnNlKG8pfWNhdGNoe3JldHVybn1pZihpJiZpLnByb3RvY29sPT09Im51YW5yaWFfbWVzc2FnaW5nIiYmaS50eXBlPT09InJlcXVlc3QiJiYoaT1pLnBheWxvYWQpJiZpLmZ1bmN0aW9uSWQ9PT0ibWFrZUNoYW5nZXMiJiYoaT1pLmFyZ3MpKXtjb25zdFtsLHMsYSx1LGNdPWk7ZS51cGRhdGUoKCk9Pntjb25zdCBkPXZ1LiRnZXRTZWxlY3Rpb24oKTtpZih2dS4kaXNSYW5nZVNlbGVjdGlvbihkKSl7dmFyIGY9ZC5hbmNob3I7bGV0IGg9Zi5nZXROb2RlKCksbT0wLGc9MDt2dS4kaXNUZXh0Tm9kZShoKSYmMDw9bCYmMDw9cyYmKG09bCxnPWwrcyxkLnNldFRleHROb2RlUmFuZ2UoaCxtLGgsZykpLChtIT09Z3x8YSE9PSIiKSYmKGQuaW5zZXJ0UmF3VGV4dChhKSxoPWYuZ2V0Tm9kZSgpKSx2dS4kaXNUZXh0Tm9kZShoKSYmKG09dSxnPXUrYyxmPWguZ2V0VGV4dENvbnRlbnRTaXplKCksbT1tPmY/ZjptLGc9Zz5mP2Y6ZyxkLnNldFRleHROb2RlUmFuZ2UoaCxtLGgsZykpLHIuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9fSl9fX19O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbiwhMCksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbiwhMCl9fTtjb25zdCBPUj1iUzt2YXIgQVI9T1IsVHI9e30sUXI9e30sdm09e30sbzA9TW8sTVI9TnQsb2w9bWU7ZnVuY3Rpb24gTlMoZSx0LG4scj1udWxsKXtsZXQgbz1yIT1udWxsP3QuaXNTZWxlY3RlZChyKTohMCxpPW9sLiRpc0VsZW1lbnROb2RlKHQpJiZ0LmV4Y2x1ZGVGcm9tQ29weSgiaHRtbCIpO3ZhciBsPXQ7ciE9PW51bGwmJihsPW8wLiRjbG9uZVdpdGhQcm9wZXJ0aWVzKHQpLGw9b2wuJGlzVGV4dE5vZGUobCkmJnIhPW51bGw/bzAuJHNsaWNlU2VsZWN0ZWRUZXh0Tm9kZUNvbnRlbnQocixsKTpsKTtsZXQgcz1vbC4kaXNFbGVtZW50Tm9kZShsKT9sLmdldENoaWxkcmVuKCk6W10se2VsZW1lbnQ6YSxhZnRlcjp1fT1sLmV4cG9ydERPTShlKTtpZighYSlyZXR1cm4hMTtsZXQgYz1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Zm9yKGxldCBkPTA7ZDxzLmxlbmd0aDtkKyspe2xldCBmPXNbZF0saD1OUyhlLGYsYyxyKTshbyYmb2wuJGlzRWxlbWVudE5vZGUodCkmJmgmJnQuZXh0cmFjdFdpdGhDaGlsZChmLHIsImh0bWwiKSYmKG89ITApfXJldHVybiBvJiYhaT8oTVIuaXNIVE1MRWxlbWVudChhKSYmYS5hcHBlbmQoYyksbi5hcHBlbmQoYSksdSYmKGU9dS5jYWxsKGwsYSkpJiZhLnJlcGxhY2VXaXRoKGUpKTpuLmFwcGVuZChjKSxvfWxldCBSUz1uZXcgU2V0KFsiU1RZTEUiLCJTQ1JJUFQiXSk7ZnVuY3Rpb24gUFMoZSx0LG49bmV3IE1hcCxyKXtsZXQgbz1bXTtpZihSUy5oYXMoZS5ub2RlTmFtZSkpcmV0dXJuIG87bGV0IGk9bnVsbDt2YXIgbCx7bm9kZU5hbWU6c309ZSxhPXQuX2h0bWxDb252ZXJzaW9ucy5nZXQocy50b0xvd2VyQ2FzZSgpKTtpZihzPW51bGwsYSE9PXZvaWQgMClmb3IobCBvZiBhKWE9bChlKSxhIT09bnVsbCYmKHM9PT1udWxsfHxzLnByaW9yaXR5PGEucHJpb3JpdHkpJiYocz1hKTtpZihzPShsPXMhPT1udWxsP3MuY29udmVyc2lvbjpudWxsKT9sKGUpOm51bGwsbD1udWxsLHMhPT1udWxsKXtpZihsPXMuYWZ0ZXIsYT1zLm5vZGUsaT1BcnJheS5pc0FycmF5KGEpP2FbYS5sZW5ndGgtMV06YSxpIT09bnVsbCl7Zm9yKHZhclssdV1vZiBuKWlmKGk9dShpLHIpLCFpKWJyZWFrO2kmJm8ucHVzaCguLi5BcnJheS5pc0FycmF5KGEpP2E6W2ldKX1zLmZvckNoaWxkIT1udWxsJiZuLnNldChlLm5vZGVOYW1lLHMuZm9yQ2hpbGQpfWZvcihlPWUuY2hpbGROb2RlcyxyPVtdLHU9MDt1PGUubGVuZ3RoO3UrKylyLnB1c2goLi4uUFMoZVt1XSx0LG5ldyBNYXAobiksaSkpO3JldHVybiBsIT1udWxsJiYocj1sKHIpKSxpPT1udWxsP289by5jb25jYXQocik6b2wuJGlzRWxlbWVudE5vZGUoaSkmJmkuYXBwZW5kKC4uLnIpLG99dm0uJGdlbmVyYXRlSHRtbEZyb21Ob2Rlcz1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBkb2N1bWVudD4idSJ8fHR5cGVvZiB3aW5kb3c+InUiKXRocm93IEVycm9yKCJUbyB1c2UgJGdlbmVyYXRlSHRtbEZyb21Ob2RlcyBpbiBoZWFkbGVzcyBtb2RlIHBsZWFzZSBpbml0aWFsaXplIGEgaGVhZGxlc3MgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBzdWNoIGFzIEpTRG9tIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIik7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikscj1vbC4kZ2V0Um9vdCgpLmdldENoaWxkcmVuKCk7Zm9yKGxldCBvPTA7bzxyLmxlbmd0aDtvKyspTlMoZSxyW29dLG4sdCk7cmV0dXJuIG4uaW5uZXJIVE1MfTt2bS4kZ2VuZXJhdGVOb2Rlc0Zyb21ET009ZnVuY3Rpb24oZSx0KXt0PXQuYm9keT90LmJvZHkuY2hpbGROb2RlczpbXTtsZXQgbj1bXTtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7dmFyIHI9dFtvXTtSUy5oYXMoci5ub2RlTmFtZSl8fChyPVBTKHIsZSksciE9PW51bGwmJihuPW4uY29uY2F0KHIpKSl9cmV0dXJuIG59O2NvbnN0IExSPXZtO3ZhciBEUj1MUixPUz1EUix5cD1NbyxtbD1OdCxkZT1tZTtmdW5jdGlvbiBMcihlKXtsZXQgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3QuYXBwZW5kKCJjb2RlIixlKTtmb3IobGV0IG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQuYXBwZW5kKCJ2Iixhcmd1bWVudHNbbl0pO3Rocm93IEVycm9yKGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke2V9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHt0fSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuYCl9bGV0IEFTPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1IjtmdW5jdGlvbiBNUyhlKXtsZXQgdD1kZS4kZ2V0U2VsZWN0aW9uKCk7aWYodD09bnVsbCl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgdmFsaWQgTGV4aWNhbFNlbGVjdGlvbiIpO3JldHVybiBkZS4kaXNSYW5nZVNlbGVjdGlvbih0KSYmdC5pc0NvbGxhcHNlZCgpfHx0LmdldE5vZGVzKCkubGVuZ3RoPT09MD8iIjpPUy4kZ2VuZXJhdGVIdG1sRnJvbU5vZGVzKGUsdCl9ZnVuY3Rpb24gTFMoZSl7bGV0IHQ9ZGUuJGdldFNlbGVjdGlvbigpO2lmKHQ9PW51bGwpdGhyb3cgRXJyb3IoIkV4cGVjdGVkIHZhbGlkIExleGljYWxTZWxlY3Rpb24iKTtyZXR1cm4gZGUuJGlzUmFuZ2VTZWxlY3Rpb24odCkmJnQuaXNDb2xsYXBzZWQoKXx8dC5nZXROb2RlcygpLmxlbmd0aD09PTA/bnVsbDpKU09OLnN0cmluZ2lmeShJUyhlLHQpKX1mdW5jdGlvbiB4cChlLHQsbil7KGRlLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihuKXx8bWwuJGZpbmRNYXRjaGluZ1BhcmVudChuLmFuY2hvci5nZXROb2RlKCkscj0+ZGUuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUocikpIT09bnVsbCYmbWwuJGZpbmRNYXRjaGluZ1BhcmVudChuLmZvY3VzLmdldE5vZGUoKSxyPT5kZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZShyKSkhPT1udWxsKSYmdC5sZW5ndGg9PT0xJiZkZS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKHRbMF0pP2pSKHQsbiwhMSxlKTpJUih0LG4pfWZ1bmN0aW9uIElSKGUsdCl7bGV0IG49W10scj1udWxsO2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7bysrKXtsZXQgaT1lW29dLGw9ZGUuJGlzTGluZUJyZWFrTm9kZShpKTtpZihsfHxkZS4kaXNEZWNvcmF0b3JOb2RlKGkpJiZpLmlzSW5saW5lKCl8fGRlLiRpc0VsZW1lbnROb2RlKGkpJiZpLmlzSW5saW5lKCl8fGRlLiRpc1RleHROb2RlKGkpfHxpLmlzUGFyZW50UmVxdWlyZWQoKSl7aWYocj09PW51bGwmJihyPWkuY3JlYXRlUGFyZW50RWxlbWVudE5vZGUoKSxuLnB1c2gociksbCkpY29udGludWU7ciE9PW51bGwmJnIuYXBwZW5kKGkpfWVsc2Ugbi5wdXNoKGkpLHI9bnVsbH1kZS4kaXNSYW5nZVNlbGVjdGlvbih0KT90Lmluc2VydE5vZGVzKG4pOmRlLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbih0KSYmKGU9dC5hbmNob3IuZ2V0Tm9kZSgpLGRlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGUpfHxMcig0MSksZS5hcHBlbmQoLi4ubikpfWZ1bmN0aW9uIGpSKGUsdCxuLHIpe2UubGVuZ3RoPT09MSYmZGUuREVQUkVDQVRFRF8kaXNHcmlkTm9kZShlWzBdKXx8THIoNDIpO3ZhciBvPWVbMF07ZT1vLmdldENoaWxkcmVuKCksbj1vLmdldEZpcnN0Q2hpbGRPclRocm93KCkuZ2V0Q2hpbGRyZW5TaXplKCk7dmFyIGk9by5nZXRDaGlsZHJlblNpemUoKSxsPW1sLiRmaW5kTWF0Y2hpbmdQYXJlbnQodC5hbmNob3IuZ2V0Tm9kZSgpLGg9PmRlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGgpKTt0PShvPWwmJm1sLiRmaW5kTWF0Y2hpbmdQYXJlbnQobCxoPT5kZS5ERVBSRUNBVEVEXyRpc0dyaWRSb3dOb2RlKGgpKSkmJm1sLiRmaW5kTWF0Y2hpbmdQYXJlbnQobyxoPT5kZS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKGgpKSxkZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZShsKSYmZGUuREVQUkVDQVRFRF8kaXNHcmlkUm93Tm9kZShvKSYmZGUuREVQUkVDQVRFRF8kaXNHcmlkTm9kZSh0KXx8THIoNDMpO3ZhciBzPW8uZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxhPU1hdGgubWluKHQuZ2V0Q2hpbGRyZW5TaXplKCktMSxzK2ktMSk7aT1sLmdldEluZGV4V2l0aGluUGFyZW50KCksbD1NYXRoLm1pbihvLmdldENoaWxkcmVuU2l6ZSgpLTEsaStuLTEpLG49TWF0aC5taW4oaSxsKSxvPU1hdGgubWluKHMsYSksaT1NYXRoLm1heChpLGwpLHM9TWF0aC5tYXgocyxhKSxhPXQuZ2V0Q2hpbGRyZW4oKSxsPTA7bGV0IHUsYztmb3IobGV0IGg9bztoPD1zO2grKyl7dmFyIGQ9YVtoXTtkZS5ERVBSRUNBVEVEXyRpc0dyaWRSb3dOb2RlKGQpfHxMcigyNCk7dmFyIGY9ZVtsXTtkZS5ERVBSRUNBVEVEXyRpc0dyaWRSb3dOb2RlKGYpfHxMcigyNCksZD1kLmdldENoaWxkcmVuKCksZj1mLmdldENoaWxkcmVuKCk7bGV0IG09MDtmb3IobGV0IGc9bjtnPD1pO2crKyl7bGV0IFM9ZFtnXTtkZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZShTKXx8THIoMjUpO2xldCB2PWZbbV07ZGUuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUodil8fExyKDI1KSxoPT09byYmZz09PW4/dT1TLmdldEtleSgpOmg9PT1zJiZnPT09aSYmKGM9Uy5nZXRLZXkoKSk7bGV0IHk9Uy5nZXRDaGlsZHJlbigpO3YuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKHg9PntkZS4kaXNUZXh0Tm9kZSh4KSYmZGUuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKS5hcHBlbmQoeCksUy5hcHBlbmQoeCl9KSx5LmZvckVhY2goeD0+eC5yZW1vdmUoKSksbSsrfWwrK311JiZjJiYoZT1kZS5ERVBSRUNBVEVEXyRjcmVhdGVHcmlkU2VsZWN0aW9uKCksZS5zZXQodC5nZXRLZXkoKSx1LGMpLGRlLiRzZXRTZWxlY3Rpb24oZSksci5kaXNwYXRjaENvbW1hbmQoZGUuU0VMRUNUSU9OX0NIQU5HRV9DT01NQU5ELHZvaWQgMCkpfWZ1bmN0aW9uIERTKGUsdCxuLHI9W10pe2xldCBvPXQhPW51bGw/bi5pc1NlbGVjdGVkKHQpOiEwLGk9ZGUuJGlzRWxlbWVudE5vZGUobikmJm4uZXhjbHVkZUZyb21Db3B5KCJodG1sIik7dmFyIGw9bjtpZih0IT09bnVsbCl7dmFyIHM9eXAuJGNsb25lV2l0aFByb3BlcnRpZXMobik7bD1zPWRlLiRpc1RleHROb2RlKHMpJiZ0IT1udWxsP3lwLiRzbGljZVNlbGVjdGVkVGV4dE5vZGVDb250ZW50KHQscyk6c31sZXQgYT1kZS4kaXNFbGVtZW50Tm9kZShsKT9sLmdldENoaWxkcmVuKCk6W107dmFyIHU9bDtzPXUuZXhwb3J0SlNPTigpO3ZhciBjPXUuY29uc3RydWN0b3I7cy50eXBlIT09Yy5nZXRUeXBlKCkmJkxyKDU4LGMubmFtZSk7bGV0IGQ9cy5jaGlsZHJlbjtmb3IoZGUuJGlzRWxlbWVudE5vZGUodSkmJihBcnJheS5pc0FycmF5KGQpfHxMcig1OSxjLm5hbWUpKSxkZS4kaXNUZXh0Tm9kZShsKSYmKGw9bC5fX3RleHQsMDxsLmxlbmd0aD9zLnRleHQ9bDpvPSExKSxsPTA7bDxhLmxlbmd0aDtsKyspdT1hW2xdLGM9RFMoZSx0LHUscy5jaGlsZHJlbiksIW8mJmRlLiRpc0VsZW1lbnROb2RlKG4pJiZjJiZuLmV4dHJhY3RXaXRoQ2hpbGQodSx0LCJjbG9uZSIpJiYobz0hMCk7aWYobyYmIWkpci5wdXNoKHMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShzLmNoaWxkcmVuKSlmb3IoZT0wO2U8cy5jaGlsZHJlbi5sZW5ndGg7ZSsrKXIucHVzaChzLmNoaWxkcmVuW2VdKTtyZXR1cm4gb31mdW5jdGlvbiBJUyhlLHQpe2xldCBuPVtdLHI9ZGUuJGdldFJvb3QoKS5nZXRDaGlsZHJlbigpO2ZvcihsZXQgbz0wO288ci5sZW5ndGg7bysrKURTKGUsdCxyW29dLG4pO3JldHVybntuYW1lc3BhY2U6ZS5fY29uZmlnLm5hbWVzcGFjZSxub2RlczpufX1mdW5jdGlvbiBqUyhlKXtsZXQgdD1bXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IHI9ZGUuJHBhcnNlU2VyaWFsaXplZE5vZGUoZVtuXSk7ZGUuJGlzVGV4dE5vZGUocikmJnlwLiRhZGROb2RlU3R5bGUociksdC5wdXNoKHIpfXJldHVybiB0fWxldCBJaT1udWxsO2Z1bmN0aW9uIGkwKGUsdCl7dmFyIG49QVM/KGUuX3dpbmRvd3x8d2luZG93KS5nZXRTZWxlY3Rpb24oKTpudWxsO2lmKCFuKXJldHVybiExO3ZhciByPW4uYW5jaG9yTm9kZTtpZihuPW4uZm9jdXNOb2RlLHIhPT1udWxsJiZuIT09bnVsbCYmIWRlLmlzU2VsZWN0aW9uV2l0aGluRWRpdG9yKGUscixuKXx8KHQucHJldmVudERlZmF1bHQoKSx0PXQuY2xpcGJvYXJkRGF0YSxyPWRlLiRnZXRTZWxlY3Rpb24oKSx0PT09bnVsbHx8cj09PW51bGwpKXJldHVybiExO249TVMoZSksZT1MUyhlKTtsZXQgbz0iIjtyZXR1cm4gciE9PW51bGwmJihvPXIuZ2V0VGV4dENvbnRlbnQoKSksbiE9PW51bGwmJnQuc2V0RGF0YSgidGV4dC9odG1sIixuKSxlIT09bnVsbCYmdC5zZXREYXRhKCJhcHBsaWNhdGlvbi94LWxleGljYWwtZWRpdG9yIixlKSx0LnNldERhdGEoInRleHQvcGxhaW4iLG8pLCEwfVFyLiRnZW5lcmF0ZUpTT05Gcm9tU2VsZWN0ZWROb2Rlcz1JUztRci4kZ2VuZXJhdGVOb2Rlc0Zyb21TZXJpYWxpemVkTm9kZXM9alM7UXIuJGdldEh0bWxDb250ZW50PU1TO1FyLiRnZXRMZXhpY2FsQ29udGVudD1MUztRci4kaW5zZXJ0RGF0YVRyYW5zZmVyRm9yUGxhaW5UZXh0PWZ1bmN0aW9uKGUsdCl7ZT1lLmdldERhdGEoInRleHQvcGxhaW4iKXx8ZS5nZXREYXRhKCJ0ZXh0L3VyaS1saXN0IiksZSE9bnVsbCYmdC5pbnNlcnRSYXdUZXh0KGUpfTtRci4kaW5zZXJ0RGF0YVRyYW5zZmVyRm9yUmljaFRleHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuZ2V0RGF0YSgiYXBwbGljYXRpb24veC1sZXhpY2FsLWVkaXRvciIpO2lmKHIpdHJ5e2xldCBsPUpTT04ucGFyc2Uocik7aWYobC5uYW1lc3BhY2U9PT1uLl9jb25maWcubmFtZXNwYWNlJiZBcnJheS5pc0FycmF5KGwubm9kZXMpKXtsZXQgcz1qUyhsLm5vZGVzKTtyZXR1cm4geHAobixzLHQpfX1jYXRjaHt9aWYocj1lLmdldERhdGEoInRleHQvaHRtbCIpKXRyeXt2YXIgbz1uZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHIsInRleHQvaHRtbCIpLGk9T1MuJGdlbmVyYXRlTm9kZXNGcm9tRE9NKG4sbyk7cmV0dXJuIHhwKG4saSx0KX1jYXRjaHt9aWYoZT1lLmdldERhdGEoInRleHQvcGxhaW4iKXx8ZS5nZXREYXRhKCJ0ZXh0L3VyaS1saXN0IiksZSE9bnVsbClpZihkZS4kaXNSYW5nZVNlbGVjdGlvbih0KSlmb3IoZT1lLnNwbGl0KC8oXHI/XG58XHQpLyksbj1lLmxlbmd0aCxvPTA7bzxuO28rKylpPWVbb10saT09PWAKYHx8aT09PWBccgpgP3QuaW5zZXJ0UGFyYWdyYXBoKCk6aT09PSIJIj90Lmluc2VydE5vZGVzKFtkZS4kY3JlYXRlVGFiTm9kZSgpXSk6dC5pbnNlcnRUZXh0KGkpO2Vsc2UgdC5pbnNlcnRSYXdUZXh0KGUpfTtRci4kaW5zZXJ0R2VuZXJhdGVkTm9kZXM9eHA7UXIuY29weVRvQ2xpcGJvYXJkPWFzeW5jIGZ1bmN0aW9uKGUsdCl7aWYoSWkhPT1udWxsKXJldHVybiExO2lmKHQhPT1udWxsKXJldHVybiBuZXcgUHJvbWlzZShsPT57ZS51cGRhdGUoKCk9PntsKGkwKGUsdCkpfSl9KTt2YXIgbj1lLmdldFJvb3RFbGVtZW50KCk7bGV0IHI9ZS5fd2luZG93PT1udWxsP3dpbmRvdy5kb2N1bWVudDplLl93aW5kb3cuZG9jdW1lbnQsbz1BUz8oZS5fd2luZG93fHx3aW5kb3cpLmdldFNlbGVjdGlvbigpOm51bGw7aWYobj09PW51bGx8fG89PT1udWxsKXJldHVybiExO2xldCBpPXIuY3JlYXRlRWxlbWVudCgic3BhbiIpO3JldHVybiBpLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOiBmaXhlZDsgdG9wOiAtMTAwMHB4OyIsaS5hcHBlbmQoci5jcmVhdGVUZXh0Tm9kZSgiIyIpKSxuLmFwcGVuZChpKSxuPW5ldyBSYW5nZSxuLnNldFN0YXJ0KGksMCksbi5zZXRFbmQoaSwxKSxvLnJlbW92ZUFsbFJhbmdlcygpLG8uYWRkUmFuZ2UobiksbmV3IFByb21pc2UobD0+e2xldCBzPWUucmVnaXN0ZXJDb21tYW5kKGRlLkNPUFlfQ09NTUFORCxhPT4obWwub2JqZWN0S2xhc3NFcXVhbHMoYSxDbGlwYm9hcmRFdmVudCkmJihzKCksSWkhPT1udWxsJiYod2luZG93LmNsZWFyVGltZW91dChJaSksSWk9bnVsbCksbChpMChlLGEpKSksITApLGRlLkNPTU1BTkRfUFJJT1JJVFlfQ1JJVElDQUwpO0lpPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT57cygpLElpPW51bGwsbCghMSl9LDUwKSxyLmV4ZWNDb21tYW5kKCJjb3B5IiksaS5yZW1vdmUoKX0pfTtjb25zdCB6Uj1Rcjt2YXIgRlI9elIsSWM9RlIseXU9TW8sZ3I9TnQsTT1tZTtmdW5jdGlvbiBsMChlLHQpe3JldHVybiB0eXBlb2YgZG9jdW1lbnQuY2FyZXRSYW5nZUZyb21Qb2ludDwidSI/KGU9ZG9jdW1lbnQuY2FyZXRSYW5nZUZyb21Qb2ludChlLHQpLGU9PT1udWxsP251bGw6e25vZGU6ZS5zdGFydENvbnRhaW5lcixvZmZzZXQ6ZS5zdGFydE9mZnNldH0pOmRvY3VtZW50LmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQhPT0idW5kZWZpbmVkIj8oZT1kb2N1bWVudC5jYXJldFBvc2l0aW9uRnJvbVBvaW50KGUsdCksZT09PW51bGw/bnVsbDp7bm9kZTplLm9mZnNldE5vZGUsb2Zmc2V0OmUub2Zmc2V0fSk6bnVsbH1sZXQgWGw9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiLEJSPVhsJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50P2RvY3VtZW50LmRvY3VtZW50TW9kZTpudWxsLFdSPVhsJiYiSW5wdXRFdmVudCJpbiB3aW5kb3cmJiFCUj8iZ2V0VGFyZ2V0UmFuZ2VzImluIG5ldyB3aW5kb3cuSW5wdXRFdmVudCgiaW5wdXQiKTohMSxVUj1YbCYmL1ZlcnNpb25cL1tcZC5dKy4qU2FmYXJpLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLFZSPVhsJiYvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIXdpbmRvdy5NU1N0cmVhbSxIUj1YbCYmL14oPz0uKkNocm9tZSkuKi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksS1I9WGwmJi9BcHBsZVdlYktpdFwvW1xkLl0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhSFIsd3A9TS5jcmVhdGVDb21tYW5kKCJEUkFHX0RST1BfUEFTVEVfRklMRSIpLHltPWNsYXNzIHpTIGV4dGVuZHMgTS5FbGVtZW50Tm9kZXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJxdW90ZSJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgelModC5fX2tleSl9Y29uc3RydWN0b3IodCl7c3VwZXIodCl9Y3JlYXRlRE9NKHQpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJsb2NrcXVvdGUiKTtyZXR1cm4gZ3IuYWRkQ2xhc3NOYW1lc1RvRWxlbWVudChuLHQudGhlbWUucXVvdGUpLG59dXBkYXRlRE9NKCl7cmV0dXJuITF9c3RhdGljIGltcG9ydERPTSgpe3JldHVybntibG9ja3F1b3RlOigpPT4oe2NvbnZlcnNpb246R1IscHJpb3JpdHk6MH0pfX1leHBvcnRET00odCl7aWYoe2VsZW1lbnQ6dH09c3VwZXIuZXhwb3J0RE9NKHQpLHQmJmdyLmlzSFRNTEVsZW1lbnQodCkpe3RoaXMuaXNFbXB0eSgpJiZ0LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpKTt2YXIgbj10aGlzLmdldEZvcm1hdFR5cGUoKTt0LnN0eWxlLnRleHRBbGlnbj1uLChuPXRoaXMuZ2V0RGlyZWN0aW9uKCkpJiYodC5kaXI9bil9cmV0dXJue2VsZW1lbnQ6dH19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49eG0oKTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSx0eXBlOiJxdW90ZSJ9fWluc2VydE5ld0FmdGVyKHQsbil7dD1NLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7bGV0IHI9dGhpcy5nZXREaXJlY3Rpb24oKTtyZXR1cm4gdC5zZXREaXJlY3Rpb24ociksdGhpcy5pbnNlcnRBZnRlcih0LG4pLHR9Y29sbGFwc2VBdFN0YXJ0KCl7bGV0IHQ9TS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpO3JldHVybiB0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChuPT50LmFwcGVuZChuKSksdGhpcy5yZXBsYWNlKHQpLCEwfX07ZnVuY3Rpb24geG0oKXtyZXR1cm4gTS4kYXBwbHlOb2RlUmVwbGFjZW1lbnQobmV3IHltKX1sZXQgd209Y2xhc3MgRlMgZXh0ZW5kcyBNLkVsZW1lbnROb2Rle3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImhlYWRpbmcifXN0YXRpYyBjbG9uZSh0KXtyZXR1cm4gbmV3IEZTKHQuX190YWcsdC5fX2tleSl9Y29uc3RydWN0b3IodCxuKXtzdXBlcihuKSx0aGlzLl9fdGFnPXR9Z2V0VGFnKCl7cmV0dXJuIHRoaXMuX190YWd9Y3JlYXRlRE9NKHQpe2xldCBuPXRoaXMuX190YWcscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KG4pO3JldHVybiB0PXQudGhlbWUuaGVhZGluZyx0IT09dm9pZCAwJiZnci5hZGRDbGFzc05hbWVzVG9FbGVtZW50KHIsdFtuXSkscn11cGRhdGVET00oKXtyZXR1cm4hMX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJue2gxOigpPT4oe2NvbnZlcnNpb246amkscHJpb3JpdHk6MH0pLGgyOigpPT4oe2NvbnZlcnNpb246amkscHJpb3JpdHk6MH0pLGgzOigpPT4oe2NvbnZlcnNpb246amkscHJpb3JpdHk6MH0pLGg0OigpPT4oe2NvbnZlcnNpb246amkscHJpb3JpdHk6MH0pLGg1OigpPT4oe2NvbnZlcnNpb246amkscHJpb3JpdHk6MH0pLGg2OigpPT4oe2NvbnZlcnNpb246amkscHJpb3JpdHk6MH0pLHA6dD0+KHQ9dC5maXJzdENoaWxkLHQhPT1udWxsJiZzMCh0KT97Y29udmVyc2lvbjooKT0+KHtub2RlOm51bGx9KSxwcmlvcml0eTozfTpudWxsKSxzcGFuOnQ9PnMwKHQpP3tjb252ZXJzaW9uOigpPT4oe25vZGU6aWwoImgxIil9KSxwcmlvcml0eTozfTpudWxsfX1leHBvcnRET00odCl7aWYoe2VsZW1lbnQ6dH09c3VwZXIuZXhwb3J0RE9NKHQpLHQmJmdyLmlzSFRNTEVsZW1lbnQodCkpe3RoaXMuaXNFbXB0eSgpJiZ0LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpKTt2YXIgbj10aGlzLmdldEZvcm1hdFR5cGUoKTt0LnN0eWxlLnRleHRBbGlnbj1uLChuPXRoaXMuZ2V0RGlyZWN0aW9uKCkpJiYodC5kaXI9bil9cmV0dXJue2VsZW1lbnQ6dH19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49aWwodC50YWcpO3JldHVybiBuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXRJbmRlbnQodC5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxufWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLHRhZzp0aGlzLmdldFRhZygpLHR5cGU6ImhlYWRpbmciLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIodCxuPSEwKXt0PXQ/dC5hbmNob3Iub2Zmc2V0OjAsdD0wPHQmJnQ8dGhpcy5nZXRUZXh0Q29udGVudFNpemUoKT9pbCh0aGlzLmdldFRhZygpKTpNLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7bGV0IHI9dGhpcy5nZXREaXJlY3Rpb24oKTtyZXR1cm4gdC5zZXREaXJlY3Rpb24ociksdGhpcy5pbnNlcnRBZnRlcih0LG4pLHR9Y29sbGFwc2VBdFN0YXJ0KCl7bGV0IHQ9dGhpcy5pc0VtcHR5KCk/TS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpOmlsKHRoaXMuZ2V0VGFnKCkpO3JldHVybiB0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChuPT50LmFwcGVuZChuKSksdGhpcy5yZXBsYWNlKHQpLCEwfWV4dHJhY3RXaXRoQ2hpbGQoKXtyZXR1cm4hMH19O2Z1bmN0aW9uIHMwKGUpe3JldHVybiBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0ic3BhbiI/ZS5zdHlsZS5mb250U2l6ZT09PSIyNnB0IjohMX1mdW5jdGlvbiBqaShlKXtsZXQgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj1udWxsO3JldHVybih0PT09ImgxInx8dD09PSJoMiJ8fHQ9PT0iaDMifHx0PT09Img0Inx8dD09PSJoNSJ8fHQ9PT0iaDYiKSYmKG49aWwodCksZS5zdHlsZSE9PW51bGwmJm4uc2V0Rm9ybWF0KGUuc3R5bGUudGV4dEFsaWduKSkse25vZGU6bn19ZnVuY3Rpb24gR1IoZSl7bGV0IHQ9eG0oKTtyZXR1cm4gZS5zdHlsZSE9PW51bGwmJnQuc2V0Rm9ybWF0KGUuc3R5bGUudGV4dEFsaWduKSx7bm9kZTp0fX1mdW5jdGlvbiBpbChlKXtyZXR1cm4gTS4kYXBwbHlOb2RlUmVwbGFjZW1lbnQobmV3IHdtKGUpKX1mdW5jdGlvbiBZUihlLHQpe2UucHJldmVudERlZmF1bHQoKSx0LnVwZGF0ZSgoKT0+e2xldCBuPU0uJGdldFNlbGVjdGlvbigpLHI9ZSBpbnN0YW5jZW9mIElucHV0RXZlbnR8fGUgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50P251bGw6ZS5jbGlwYm9hcmREYXRhO3IhPW51bGwmJihNLiRpc1JhbmdlU2VsZWN0aW9uKG4pfHxNLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihuKSkmJkljLiRpbnNlcnREYXRhVHJhbnNmZXJGb3JSaWNoVGV4dChyLG4sdCl9LHt0YWc6InBhc3RlIn0pfWFzeW5jIGZ1bmN0aW9uIFhSKGUsdCl7YXdhaXQgSWMuY29weVRvQ2xpcGJvYXJkKHQsZ3Iub2JqZWN0S2xhc3NFcXVhbHMoZSxDbGlwYm9hcmRFdmVudCk/ZTpudWxsKSx0LnVwZGF0ZSgoKT0+e2xldCBuPU0uJGdldFNlbGVjdGlvbigpO00uJGlzUmFuZ2VTZWxlY3Rpb24obik/bi5yZW1vdmVUZXh0KCk6TS4kaXNOb2RlU2VsZWN0aW9uKG4pJiZuLmdldE5vZGVzKCkuZm9yRWFjaChyPT5yLnJlbW92ZSgpKX0pfWZ1bmN0aW9uICRzKGUpe2xldCB0PW51bGw7aWYoZSBpbnN0YW5jZW9mIERyYWdFdmVudD90PWUuZGF0YVRyYW5zZmVyOmUgaW5zdGFuY2VvZiBDbGlwYm9hcmRFdmVudCYmKHQ9ZS5jbGlwYm9hcmREYXRhKSx0PT09bnVsbClyZXR1cm5bITEsW10sITFdO3ZhciBuPXQudHlwZXM7cmV0dXJuIGU9bi5pbmNsdWRlcygiRmlsZXMiKSxuPW4uaW5jbHVkZXMoInRleHQvaHRtbCIpfHxuLmluY2x1ZGVzKCJ0ZXh0L3BsYWluIiksW2UsQXJyYXkuZnJvbSh0LmZpbGVzKSxuXX1mdW5jdGlvbiBhMChlKXt2YXIgdD1NLiRnZXRTZWxlY3Rpb24oKTtpZighTS4kaXNSYW5nZVNlbGVjdGlvbih0KSlyZXR1cm4hMTtsZXQgbj1uZXcgU2V0O3Q9dC5nZXROb2RlcygpO2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgcj10W2ldLG89ci5nZXRLZXkoKTtuLmhhcyhvKXx8KHI9Z3IuJGdldE5lYXJlc3RCbG9ja0VsZW1lbnRBbmNlc3Rvck9yVGhyb3cociksbz1yLmdldEtleSgpLHIuY2FuSW5kZW50KCkmJiFuLmhhcyhvKSYmKG4uYWRkKG8pLGUocikpKX1yZXR1cm4gMDxuLnNpemV9ZnVuY3Rpb24geHUoZSl7cmV0dXJuIGU9TS4kZ2V0TmVhcmVzdE5vZGVGcm9tRE9NTm9kZShlKSxNLiRpc0RlY29yYXRvck5vZGUoZSl9VHIuJGNyZWF0ZUhlYWRpbmdOb2RlPWlsO1RyLiRjcmVhdGVRdW90ZU5vZGU9eG07VHIuJGlzSGVhZGluZ05vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiB3bX07VHIuJGlzUXVvdGVOb2RlPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgeW19O1RyLkRSQUdfRFJPUF9QQVNURT13cDtUci5IZWFkaW5nTm9kZT13bTtUci5RdW90ZU5vZGU9eW07VHIuZXZlbnRGaWxlcz0kcztUci5yZWdpc3RlclJpY2hUZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBnci5tZXJnZVJlZ2lzdGVyKGUucmVnaXN0ZXJDb21tYW5kKE0uQ0xJQ0tfQ09NTUFORCwoKT0+e2NvbnN0IHQ9TS4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIE0uJGlzTm9kZVNlbGVjdGlvbih0KT8odC5jbGVhcigpLCEwKTohMX0sMCksZS5yZWdpc3RlckNvbW1hbmQoTS5ERUxFVEVfQ0hBUkFDVEVSX0NPTU1BTkQsdD0+e2NvbnN0IG49TS4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIE0uJGlzUmFuZ2VTZWxlY3Rpb24obik/KG4uZGVsZXRlQ2hhcmFjdGVyKHQpLCEwKTohMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoTS5ERUxFVEVfV09SRF9DT01NQU5ELHQ9Pntjb25zdCBuPU0uJGdldFNlbGVjdGlvbigpO3JldHVybiBNLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyhuLmRlbGV0ZVdvcmQodCksITApOiExfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChNLkRFTEVURV9MSU5FX0NPTU1BTkQsdD0+e2NvbnN0IG49TS4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIE0uJGlzUmFuZ2VTZWxlY3Rpb24obik/KG4uZGVsZXRlTGluZSh0KSwhMCk6ITF9LE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKE0uQ09OVFJPTExFRF9URVhUX0lOU0VSVElPTl9DT01NQU5ELHQ9Pntjb25zdCBuPU0uJGdldFNlbGVjdGlvbigpO2lmKHR5cGVvZiB0PT0ic3RyaW5nIilNLiRpc1JhbmdlU2VsZWN0aW9uKG4pP24uaW5zZXJ0VGV4dCh0KTpNLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihuKTtlbHNle2lmKCFNLiRpc1JhbmdlU2VsZWN0aW9uKG4pJiYhTS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24obikpcmV0dXJuITE7Y29uc3Qgcj10LmRhdGFUcmFuc2ZlcjtyIT1udWxsP0ljLiRpbnNlcnREYXRhVHJhbnNmZXJGb3JSaWNoVGV4dChyLG4sZSk6TS4kaXNSYW5nZVNlbGVjdGlvbihuKSYmKHQ9dC5kYXRhKSYmbi5pbnNlcnRUZXh0KHQpfXJldHVybiEwfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChNLlJFTU9WRV9URVhUX0NPTU1BTkQsKCk9Pntjb25zdCB0PU0uJGdldFNlbGVjdGlvbigpO3JldHVybiBNLiRpc1JhbmdlU2VsZWN0aW9uKHQpPyh0LnJlbW92ZVRleHQoKSwhMCk6ITF9LE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKE0uRk9STUFUX1RFWFRfQ09NTUFORCx0PT57Y29uc3Qgbj1NLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gTS4kaXNSYW5nZVNlbGVjdGlvbihuKT8obi5mb3JtYXRUZXh0KHQpLCEwKTohMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoTS5GT1JNQVRfRUxFTUVOVF9DT01NQU5ELHQ9Pnt2YXIgbj1NLiRnZXRTZWxlY3Rpb24oKTtpZighTS4kaXNSYW5nZVNlbGVjdGlvbihuKSYmIU0uJGlzTm9kZVNlbGVjdGlvbihuKSlyZXR1cm4hMTtuPW4uZ2V0Tm9kZXMoKTtmb3IoY29uc3QgciBvZiBuKW49Z3IuJGZpbmRNYXRjaGluZ1BhcmVudChyLG89Pk0uJGlzRWxlbWVudE5vZGUobykmJiFvLmlzSW5saW5lKCkpLG4hPT1udWxsJiZuLnNldEZvcm1hdCh0KTtyZXR1cm4hMH0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoTS5JTlNFUlRfTElORV9CUkVBS19DT01NQU5ELHQ9Pntjb25zdCBuPU0uJGdldFNlbGVjdGlvbigpO3JldHVybiBNLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyhuLmluc2VydExpbmVCcmVhayh0KSwhMCk6ITF9LE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKE0uSU5TRVJUX1BBUkFHUkFQSF9DT01NQU5ELCgpPT57Y29uc3QgdD1NLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gTS4kaXNSYW5nZVNlbGVjdGlvbih0KT8odC5pbnNlcnRQYXJhZ3JhcGgoKSwhMCk6ITF9LE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKE0uSU5TRVJUX1RBQl9DT01NQU5ELCgpPT4oTS4kaW5zZXJ0Tm9kZXMoW00uJGNyZWF0ZVRhYk5vZGUoKV0pLCEwKSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChNLklOREVOVF9DT05URU5UX0NPTU1BTkQsKCk9PmEwKHQ9Pntjb25zdCBuPXQuZ2V0SW5kZW50KCk7dC5zZXRJbmRlbnQobisxKX0pLE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKE0uT1VUREVOVF9DT05URU5UX0NPTU1BTkQsKCk9PmEwKHQ9Pntjb25zdCBuPXQuZ2V0SW5kZW50KCk7MDxuJiZ0LnNldEluZGVudChuLTEpfSksTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoTS5LRVlfQVJST1dfVVBfQ09NTUFORCx0PT57dmFyIG49TS4kZ2V0U2VsZWN0aW9uKCk7aWYoTS4kaXNOb2RlU2VsZWN0aW9uKG4pJiYheHUodC50YXJnZXQpKXtpZih0PW4uZ2V0Tm9kZXMoKSwwPHQubGVuZ3RoKXJldHVybiB0WzBdLnNlbGVjdFByZXZpb3VzKCksITB9ZWxzZSBpZihNLiRpc1JhbmdlU2VsZWN0aW9uKG4pJiYobj1NLiRnZXRBZGphY2VudE5vZGUobi5mb2N1cywhMCksIXQuc2hpZnRLZXkmJk0uJGlzRGVjb3JhdG9yTm9kZShuKSYmIW4uaXNJc29sYXRlZCgpJiYhbi5pc0lubGluZSgpKSlyZXR1cm4gbi5zZWxlY3RQcmV2aW91cygpLHQucHJldmVudERlZmF1bHQoKSwhMDtyZXR1cm4hMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoTS5LRVlfQVJST1dfRE9XTl9DT01NQU5ELHQ9Pnt2YXIgbj1NLiRnZXRTZWxlY3Rpb24oKTtpZihNLiRpc05vZGVTZWxlY3Rpb24obikpe2lmKHQ9bi5nZXROb2RlcygpLDA8dC5sZW5ndGgpcmV0dXJuIHRbMF0uc2VsZWN0TmV4dCgwLDApLCEwfWVsc2UgaWYoTS4kaXNSYW5nZVNlbGVjdGlvbihuKSl7bGV0IHI9bi5mb2N1cztpZihyLmtleT09PSJyb290IiYmci5vZmZzZXQ9PT1NLiRnZXRSb290KCkuZ2V0Q2hpbGRyZW5TaXplKCkpcmV0dXJuIHQucHJldmVudERlZmF1bHQoKSwhMDtpZihuPU0uJGdldEFkamFjZW50Tm9kZShuLmZvY3VzLCExKSwhdC5zaGlmdEtleSYmTS4kaXNEZWNvcmF0b3JOb2RlKG4pJiYhbi5pc0lzb2xhdGVkKCkmJiFuLmlzSW5saW5lKCkpcmV0dXJuIG4uc2VsZWN0TmV4dCgpLHQucHJldmVudERlZmF1bHQoKSwhMH1yZXR1cm4hMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoTS5LRVlfQVJST1dfTEVGVF9DT01NQU5ELHQ9Pntjb25zdCBuPU0uJGdldFNlbGVjdGlvbigpO2lmKE0uJGlzTm9kZVNlbGVjdGlvbihuKSl7dmFyIHI9bi5nZXROb2RlcygpO2lmKDA8ci5sZW5ndGgpcmV0dXJuIHQucHJldmVudERlZmF1bHQoKSxyWzBdLnNlbGVjdFByZXZpb3VzKCksITB9cmV0dXJuIE0uJGlzUmFuZ2VTZWxlY3Rpb24obikmJnl1LiRzaG91bGRPdmVycmlkZURlZmF1bHRDaGFyYWN0ZXJTZWxlY3Rpb24obiwhMCk/KHI9dC5zaGlmdEtleSx0LnByZXZlbnREZWZhdWx0KCkseXUuJG1vdmVDaGFyYWN0ZXIobixyLCEwKSwhMCk6ITF9LE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKE0uS0VZX0FSUk9XX1JJR0hUX0NPTU1BTkQsdD0+e2NvbnN0IG49TS4kZ2V0U2VsZWN0aW9uKCk7aWYoTS4kaXNOb2RlU2VsZWN0aW9uKG4pJiYheHUodC50YXJnZXQpKXt2YXIgcj1uLmdldE5vZGVzKCk7aWYoMDxyLmxlbmd0aClyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLHJbMF0uc2VsZWN0TmV4dCgwLDApLCEwfXJldHVybiBNLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyhyPXQuc2hpZnRLZXkseXUuJHNob3VsZE92ZXJyaWRlRGVmYXVsdENoYXJhY3RlclNlbGVjdGlvbihuLCExKT8odC5wcmV2ZW50RGVmYXVsdCgpLHl1LiRtb3ZlQ2hhcmFjdGVyKG4sciwhMSksITApOiExKTohMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoTS5LRVlfQkFDS1NQQUNFX0NPTU1BTkQsdD0+e2lmKHh1KHQudGFyZ2V0KSlyZXR1cm4hMTtjb25zdCBuPU0uJGdldFNlbGVjdGlvbigpO2lmKCFNLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXJldHVybiExO3QucHJldmVudERlZmF1bHQoKSx7YW5jaG9yOnR9PW47Y29uc3Qgcj10LmdldE5vZGUoKTtyZXR1cm4gbi5pc0NvbGxhcHNlZCgpJiZ0Lm9mZnNldD09PTAmJiFNLiRpc1Jvb3ROb2RlKHIpJiYwPGdyLiRnZXROZWFyZXN0QmxvY2tFbGVtZW50QW5jZXN0b3JPclRocm93KHIpLmdldEluZGVudCgpP2UuZGlzcGF0Y2hDb21tYW5kKE0uT1VUREVOVF9DT05URU5UX0NPTU1BTkQsdm9pZCAwKTplLmRpc3BhdGNoQ29tbWFuZChNLkRFTEVURV9DSEFSQUNURVJfQ09NTUFORCwhMCl9LE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKE0uS0VZX0RFTEVURV9DT01NQU5ELHQ9PntpZih4dSh0LnRhcmdldCkpcmV0dXJuITE7Y29uc3Qgbj1NLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gTS4kaXNSYW5nZVNlbGVjdGlvbihuKT8odC5wcmV2ZW50RGVmYXVsdCgpLGUuZGlzcGF0Y2hDb21tYW5kKE0uREVMRVRFX0NIQVJBQ1RFUl9DT01NQU5ELCExKSk6ITF9LE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKE0uS0VZX0VOVEVSX0NPTU1BTkQsdD0+e2NvbnN0IG49TS4kZ2V0U2VsZWN0aW9uKCk7aWYoIU0uJGlzUmFuZ2VTZWxlY3Rpb24obikpcmV0dXJuITE7aWYodCE9PW51bGwpe2lmKChWUnx8VVJ8fEtSKSYmV1IpcmV0dXJuITE7aWYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc2hpZnRLZXkpcmV0dXJuIGUuZGlzcGF0Y2hDb21tYW5kKE0uSU5TRVJUX0xJTkVfQlJFQUtfQ09NTUFORCwhMSl9cmV0dXJuIGUuZGlzcGF0Y2hDb21tYW5kKE0uSU5TRVJUX1BBUkFHUkFQSF9DT01NQU5ELHZvaWQgMCl9LE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKE0uS0VZX0VTQ0FQRV9DT01NQU5ELCgpPT57Y29uc3QgdD1NLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gTS4kaXNSYW5nZVNlbGVjdGlvbih0KT8oZS5ibHVyKCksITApOiExfSxNLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChNLkRST1BfQ09NTUFORCx0PT57Y29uc3RbLG5dPSRzKHQpO2lmKDA8bi5sZW5ndGgpe3ZhciByPWwwKHQuY2xpZW50WCx0LmNsaWVudFkpO2lmKHIhPT1udWxsKXtjb25zdHtvZmZzZXQ6aSxub2RlOmx9PXI7dmFyIG89TS4kZ2V0TmVhcmVzdE5vZGVGcm9tRE9NTm9kZShsKTtpZihvIT09bnVsbCl7aWYocj1NLiRjcmVhdGVSYW5nZVNlbGVjdGlvbigpLE0uJGlzVGV4dE5vZGUobykpci5hbmNob3Iuc2V0KG8uZ2V0S2V5KCksaSwidGV4dCIpLHIuZm9jdXMuc2V0KG8uZ2V0S2V5KCksaSwidGV4dCIpO2Vsc2V7Y29uc3Qgcz1vLmdldFBhcmVudE9yVGhyb3coKS5nZXRLZXkoKTtvPW8uZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxLHIuYW5jaG9yLnNldChzLG8sImVsZW1lbnQiKSxyLmZvY3VzLnNldChzLG8sImVsZW1lbnQiKX1yPU0uJG5vcm1hbGl6ZVNlbGVjdGlvbl9fRVhQRVJJTUVOVEFMKHIpLE0uJHNldFNlbGVjdGlvbihyKX1lLmRpc3BhdGNoQ29tbWFuZCh3cCxuKX1yZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLCEwfXJldHVybiB0PU0uJGdldFNlbGVjdGlvbigpLCEhTS4kaXNSYW5nZVNlbGVjdGlvbih0KX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoTS5EUkFHU1RBUlRfQ09NTUFORCx0PT57W3RdPSRzKHQpO2NvbnN0IG49TS4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuISh0JiYhTS4kaXNSYW5nZVNlbGVjdGlvbihuKSl9LE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKE0uRFJBR09WRVJfQ09NTUFORCx0PT57dmFyW25dPSRzKHQpO2NvbnN0IHI9TS4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIG4mJiFNLiRpc1JhbmdlU2VsZWN0aW9uKHIpPyExOihuPWwwKHQuY2xpZW50WCx0LmNsaWVudFkpLG4hPT1udWxsJiYobj1NLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlKG4ubm9kZSksTS4kaXNEZWNvcmF0b3JOb2RlKG4pJiZ0LnByZXZlbnREZWZhdWx0KCkpLCEwKX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoTS5TRUxFQ1RfQUxMX0NPTU1BTkQsKCk9PihNLiRzZWxlY3RBbGwoKSwhMCksTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoTS5DT1BZX0NPTU1BTkQsdD0+KEljLmNvcHlUb0NsaXBib2FyZChlLGdyLm9iamVjdEtsYXNzRXF1YWxzKHQsQ2xpcGJvYXJkRXZlbnQpP3Q6bnVsbCksITApLE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKE0uQ1VUX0NPTU1BTkQsdD0+KFhSKHQsZSksITApLE0uQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKE0uUEFTVEVfQ09NTUFORCx0PT57Y29uc3RbLG4scl09JHModCk7aWYoMDxuLmxlbmd0aCYmIXIpcmV0dXJuIGUuZGlzcGF0Y2hDb21tYW5kKHdwLG4pLCEwO2lmKE0uaXNTZWxlY3Rpb25DYXB0dXJlZEluRGVjb3JhdG9ySW5wdXQodC50YXJnZXQpKXJldHVybiExO2NvbnN0IG89TS4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIE0uJGlzUmFuZ2VTZWxlY3Rpb24obyl8fE0uREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG8pPyhZUih0LGUpLCEwKTohMX0sTS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUikpfTtjb25zdCBRUj1Ucjt2YXIgSHM9UVIsQlM9aXIsSlI9TlIsSW49cCxaUj1QUixXUz1OdCx1MD1HcixxUj1BUixlUD1IcyxfbT10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudDwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSI/SW4udXNlTGF5b3V0RWZmZWN0OkluLnVzZUVmZmVjdDtmdW5jdGlvbiBjMChlKXtyZXR1cm4gZS5nZXRFZGl0b3JTdGF0ZSgpLnJlYWQoWlIuJGNhblNob3dQbGFjZWhvbGRlckN1cnJ5KGUuaXNDb21wb3NpbmcoKSkpfWZ1bmN0aW9uIHRQKGUpe2xldFt0LG5dPUluLnVzZVN0YXRlKCgpPT5jMChlKSk7cmV0dXJuIF9tKCgpPT57ZnVuY3Rpb24gcigpe2xldCBvPWMwKGUpO24obyl9cmV0dXJuIHIoKSxXUy5tZXJnZVJlZ2lzdGVyKGUucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcigoKT0+e3IoKX0pLGUucmVnaXN0ZXJFZGl0YWJsZUxpc3RlbmVyKCgpPT57cigpfSkpfSxbZV0pLHR9ZnVuY3Rpb24gblAoZSx0KXtsZXRbbixyXT1Jbi51c2VTdGF0ZSgoKT0+ZS5nZXREZWNvcmF0b3JzKCkpO3JldHVybiBfbSgoKT0+ZS5yZWdpc3RlckRlY29yYXRvckxpc3RlbmVyKG89Pnt1MC5mbHVzaFN5bmMoKCk9PntyKG8pfSl9KSxbZV0pLEluLnVzZUVmZmVjdCgoKT0+e3IoZS5nZXREZWNvcmF0b3JzKCkpfSxbZV0pLEluLnVzZU1lbW8oKCk9PntsZXQgbz1bXSxpPU9iamVjdC5rZXlzKG4pO2ZvcihsZXQgbD0wO2w8aS5sZW5ndGg7bCsrKXtsZXQgcz1pW2xdLGE9SW4uY3JlYXRlRWxlbWVudCh0LHtvbkVycm9yOmM9PmUuX29uRXJyb3IoYyl9LEluLmNyZWF0ZUVsZW1lbnQoSW4uU3VzcGVuc2Use2ZhbGxiYWNrOm51bGx9LG5bc10pKSx1PWUuZ2V0RWxlbWVudEJ5S2V5KHMpO3UhPT1udWxsJiZvLnB1c2godTAuY3JlYXRlUG9ydGFsKGEsdSxzKSl9cmV0dXJuIG99LFt0LG4sZV0pfWZ1bmN0aW9uIHJQKGUpe19tKCgpPT5XUy5tZXJnZVJlZ2lzdGVyKGVQLnJlZ2lzdGVyUmljaFRleHQoZSkscVIucmVnaXN0ZXJEcmFnb25TdXBwb3J0KGUpKSxbZV0pfWZ1bmN0aW9uIG9QKHtjb250ZW50OmV9KXt2YXJbdF09QlMudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3Q9dFAodCk7bGV0IG49SlIoKTtyZXR1cm4gdD90eXBlb2YgZT09ImZ1bmN0aW9uIj9lKG4pOmU6bnVsbH0kUy5SaWNoVGV4dFBsdWdpbj1mdW5jdGlvbih7Y29udGVudEVkaXRhYmxlOmUscGxhY2Vob2xkZXI6dCxFcnJvckJvdW5kYXJ5Om59KXtsZXRbcl09QlMudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBuPW5QKHIsbiksclAociksSW4uY3JlYXRlRWxlbWVudChJbi5GcmFnbWVudCxudWxsLGUsSW4uY3JlYXRlRWxlbWVudChvUCx7Y29udGVudDp0fSksbil9O2NvbnN0IGlQPSRTO3ZhciBsUD1pUCxVUz17fSxQcj1wbyxzUD1pcixWUz1wLGFQPU50LGhzPW1lO2Z1bmN0aW9uIHVQKGUpe1ZTLnVzZUVmZmVjdCgoKT0+YVAubWVyZ2VSZWdpc3RlcihlLnJlZ2lzdGVyQ29tbWFuZChQci5JTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQsKCk9PihQci5pbnNlcnRMaXN0KGUsIm51bWJlciIpLCEwKSxocy5DT01NQU5EX1BSSU9SSVRZX0xPVyksZS5yZWdpc3RlckNvbW1hbmQoUHIuSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQsKCk9PihQci5pbnNlcnRMaXN0KGUsImJ1bGxldCIpLCEwKSxocy5DT01NQU5EX1BSSU9SSVRZX0xPVyksZS5yZWdpc3RlckNvbW1hbmQoUHIuUkVNT1ZFX0xJU1RfQ09NTUFORCwoKT0+KFByLnJlbW92ZUxpc3QoZSksITApLGhzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSxlLnJlZ2lzdGVyQ29tbWFuZChocy5JTlNFUlRfUEFSQUdSQVBIX0NPTU1BTkQsKCk9PiEhUHIuJGhhbmRsZUxpc3RJbnNlcnRQYXJhZ3JhcGgoKSxocy5DT01NQU5EX1BSSU9SSVRZX0xPVykpLFtlXSl9VVMuTGlzdFBsdWdpbj1mdW5jdGlvbigpe2xldFtlXT1zUC51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIFZTLnVzZUVmZmVjdCgoKT0+e2lmKCFlLmhhc05vZGVzKFtQci5MaXN0Tm9kZSxQci5MaXN0SXRlbU5vZGVdKSl0aHJvdyBFcnJvcigiTGlzdFBsdWdpbjogTGlzdE5vZGUgYW5kL29yIExpc3RJdGVtTm9kZSBub3QgcmVnaXN0ZXJlZCBvbiBlZGl0b3IiKX0sW2VdKSx1UChlKSxudWxsfTtjb25zdCBjUD1VUzt2YXIgZFA9Y1AsSFM9e30sSnI9e30sS1M9TnQseXI9bWU7bGV0IGZQPW5ldyBTZXQoWyJodHRwOiIsImh0dHBzOiIsIm1haWx0bzoiLCJzbXM6IiwidGVsOiJdKTtjbGFzcyBRbCBleHRlbmRzIHlyLkVsZW1lbnROb2Rle3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImxpbmsifXN0YXRpYyBjbG9uZSh0KXtyZXR1cm4gbmV3IFFsKHQuX191cmwse3JlbDp0Ll9fcmVsLHRhcmdldDp0Ll9fdGFyZ2V0LHRpdGxlOnQuX190aXRsZX0sdC5fX2tleSl9Y29uc3RydWN0b3IodCxuPXt9LHIpe3N1cGVyKHIpO2xldHt0YXJnZXQ6bz1udWxsLHJlbDppPW51bGwsdGl0bGU6bD1udWxsfT1uO3RoaXMuX191cmw9dCx0aGlzLl9fdGFyZ2V0PW8sdGhpcy5fX3JlbD1pLHRoaXMuX190aXRsZT1sfWNyZWF0ZURPTSh0KXtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7cmV0dXJuIG4uaHJlZj10aGlzLnNhbml0aXplVXJsKHRoaXMuX191cmwpLHRoaXMuX190YXJnZXQhPT1udWxsJiYobi50YXJnZXQ9dGhpcy5fX3RhcmdldCksdGhpcy5fX3JlbCE9PW51bGwmJihuLnJlbD10aGlzLl9fcmVsKSx0aGlzLl9fdGl0bGUhPT1udWxsJiYobi50aXRsZT10aGlzLl9fdGl0bGUpLEtTLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQobix0LnRoZW1lLmxpbmspLG59dXBkYXRlRE9NKHQsbil7bGV0IHI9dGhpcy5fX3VybCxvPXRoaXMuX190YXJnZXQsaT10aGlzLl9fcmVsLGw9dGhpcy5fX3RpdGxlO3JldHVybiByIT09dC5fX3VybCYmKG4uaHJlZj1yKSxvIT09dC5fX3RhcmdldCYmKG8/bi50YXJnZXQ9bzpuLnJlbW92ZUF0dHJpYnV0ZSgidGFyZ2V0IikpLGkhPT10Ll9fcmVsJiYoaT9uLnJlbD1pOm4ucmVtb3ZlQXR0cmlidXRlKCJyZWwiKSksbCE9PXQuX190aXRsZSYmKGw/bi50aXRsZT1sOm4ucmVtb3ZlQXR0cmlidXRlKCJ0aXRsZSIpKSwhMX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJue2E6KCk9Pih7Y29udmVyc2lvbjpoUCxwcmlvcml0eToxfSl9fXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPVNhKHQudXJsLHtyZWw6dC5yZWwsdGFyZ2V0OnQudGFyZ2V0LHRpdGxlOnQudGl0bGV9KTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1zYW5pdGl6ZVVybCh0KXt0cnl7bGV0IG49bmV3IFVSTCh0KTtpZighZlAuaGFzKG4ucHJvdG9jb2wpKXJldHVybiJhYm91dDpibGFuayJ9Y2F0Y2h7fXJldHVybiB0fWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLHJlbDp0aGlzLmdldFJlbCgpLHRhcmdldDp0aGlzLmdldFRhcmdldCgpLHRpdGxlOnRoaXMuZ2V0VGl0bGUoKSx0eXBlOiJsaW5rIix1cmw6dGhpcy5nZXRVUkwoKSx2ZXJzaW9uOjF9fWdldFVSTCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdXJsfXNldFVSTCh0KXt0aGlzLmdldFdyaXRhYmxlKCkuX191cmw9dH1nZXRUYXJnZXQoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3RhcmdldH1zZXRUYXJnZXQodCl7dGhpcy5nZXRXcml0YWJsZSgpLl9fdGFyZ2V0PXR9Z2V0UmVsKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19yZWx9c2V0UmVsKHQpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3JlbD10fWdldFRpdGxlKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX190aXRsZX1zZXRUaXRsZSh0KXt0aGlzLmdldFdyaXRhYmxlKCkuX190aXRsZT10fWluc2VydE5ld0FmdGVyKHQsbj0hMCl7cmV0dXJuIHQ9dGhpcy5nZXRQYXJlbnRPclRocm93KCkuaW5zZXJ0TmV3QWZ0ZXIodCxuKSx5ci4kaXNFbGVtZW50Tm9kZSh0KT8obj1TYSh0aGlzLl9fdXJsLHtyZWw6dGhpcy5fX3JlbCx0YXJnZXQ6dGhpcy5fX3RhcmdldCx0aXRsZTp0aGlzLl9fdGl0bGV9KSx0LmFwcGVuZChuKSxuKTpudWxsfWNhbkluc2VydFRleHRCZWZvcmUoKXtyZXR1cm4hMX1jYW5JbnNlcnRUZXh0QWZ0ZXIoKXtyZXR1cm4hMX1jYW5CZUVtcHR5KCl7cmV0dXJuITF9aXNJbmxpbmUoKXtyZXR1cm4hMH1leHRyYWN0V2l0aENoaWxkKHQsbil7aWYoIXlyLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXJldHVybiExO3Q9bi5hbmNob3IuZ2V0Tm9kZSgpO2xldCByPW4uZm9jdXMuZ2V0Tm9kZSgpO3JldHVybiB0aGlzLmlzUGFyZW50T2YodCkmJnRoaXMuaXNQYXJlbnRPZihyKSYmMDxuLmdldFRleHRDb250ZW50KCkubGVuZ3RofX1mdW5jdGlvbiBoUChlKXtsZXQgdD1udWxsO2lmKEtTLmlzSFRNTEFuY2hvckVsZW1lbnQoZSkpe2xldCBuPWUudGV4dENvbnRlbnQ7biE9PW51bGwmJm4hPT0iIiYmKHQ9U2EoZS5nZXRBdHRyaWJ1dGUoImhyZWYiKXx8IiIse3JlbDplLmdldEF0dHJpYnV0ZSgicmVsIiksdGFyZ2V0OmUuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKSx0aXRsZTplLmdldEF0dHJpYnV0ZSgidGl0bGUiKX0pKX1yZXR1cm57bm9kZTp0fX1mdW5jdGlvbiBTYShlLHQpe3JldHVybiB5ci4kYXBwbHlOb2RlUmVwbGFjZW1lbnQobmV3IFFsKGUsdCkpfWZ1bmN0aW9uIFFvKGUpe3JldHVybiBlIGluc3RhbmNlb2YgUWx9Y2xhc3MgRmEgZXh0ZW5kcyBRbHtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJhdXRvbGluayJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgRmEodC5fX3VybCx7cmVsOnQuX19yZWwsdGFyZ2V0OnQuX190YXJnZXQsdGl0bGU6dC5fX3RpdGxlfSx0Ll9fa2V5KX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgbj1fcCh0LnVybCx7cmVsOnQucmVsLHRhcmdldDp0LnRhcmdldCx0aXRsZTp0LnRpdGxlfSk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldEluZGVudCh0LmluZGVudCksbi5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLG59c3RhdGljIGltcG9ydERPTSgpe3JldHVybiBudWxsfWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLHR5cGU6ImF1dG9saW5rIix2ZXJzaW9uOjF9fWluc2VydE5ld0FmdGVyKHQsbj0hMCl7cmV0dXJuIHQ9dGhpcy5nZXRQYXJlbnRPclRocm93KCkuaW5zZXJ0TmV3QWZ0ZXIodCxuKSx5ci4kaXNFbGVtZW50Tm9kZSh0KT8obj1fcCh0aGlzLl9fdXJsLHtyZWw6dGhpcy5fcmVsLHRhcmdldDp0aGlzLl9fdGFyZ2V0LHRpdGxlOnRoaXMuX190aXRsZX0pLHQuYXBwZW5kKG4pLG4pOm51bGx9fWZ1bmN0aW9uIF9wKGUsdCl7cmV0dXJuIHlyLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgRmEoZSx0KSl9bGV0IHBQPXlyLmNyZWF0ZUNvbW1hbmQoIlRPR0dMRV9MSU5LX0NPTU1BTkQiKTtmdW5jdGlvbiBnUChlLHQpe2Zvcig7ZSE9PW51bGwmJihlPWUuZ2V0UGFyZW50KCkpIT09bnVsbCYmIXQoZSk7KTtyZXR1cm4gZX1Kci4kY3JlYXRlQXV0b0xpbmtOb2RlPV9wO0pyLiRjcmVhdGVMaW5rTm9kZT1TYTtKci4kaXNBdXRvTGlua05vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBGYX07SnIuJGlzTGlua05vZGU9UW87SnIuQXV0b0xpbmtOb2RlPUZhO0pyLkxpbmtOb2RlPVFsO0pyLlRPR0dMRV9MSU5LX0NPTU1BTkQ9cFA7SnIudG9nZ2xlTGluaz1mdW5jdGlvbihlLHQ9e30pe2xldHt0YXJnZXQ6bix0aXRsZTpyfT10LG89dC5yZWw9PT12b2lkIDA/Im5vcmVmZXJyZXIiOnQucmVsO2lmKHQ9eXIuJGdldFNlbGVjdGlvbigpLHlyLiRpc1JhbmdlU2VsZWN0aW9uKHQpKWlmKHQ9dC5leHRyYWN0KCksZT09PW51bGwpdC5mb3JFYWNoKGw9PntpZihsPWwuZ2V0UGFyZW50KCksUW8obCkpe2xldCBzPWwuZ2V0Q2hpbGRyZW4oKTtmb3IobGV0IGE9MDthPHMubGVuZ3RoO2ErKylsLmluc2VydEJlZm9yZShzW2FdKTtsLnJlbW92ZSgpfX0pO2Vsc2V7aWYodC5sZW5ndGg9PT0xKXt2YXIgaT10WzBdO2lmKGk9UW8oaSk/aTpnUChpLFFvKSxpIT09bnVsbCl7aS5zZXRVUkwoZSksbiE9PXZvaWQgMCYmaS5zZXRUYXJnZXQobiksbyE9PW51bGwmJmkuc2V0UmVsKG8pLHIhPT12b2lkIDAmJmkuc2V0VGl0bGUocik7cmV0dXJufX1sZXQgbD1udWxsLHM9bnVsbDt0LmZvckVhY2goYT0+e3ZhciB1PWEuZ2V0UGFyZW50KCk7aWYodSE9PXMmJnUhPT1udWxsJiYoIXlyLiRpc0VsZW1lbnROb2RlKGEpfHxhLmlzSW5saW5lKCkpKWlmKFFvKHUpKXM9dSx1LnNldFVSTChlKSxuIT09dm9pZCAwJiZ1LnNldFRhcmdldChuKSxvIT09bnVsbCYmcy5zZXRSZWwobyksciE9PXZvaWQgMCYmcy5zZXRUaXRsZShyKTtlbHNlIGlmKHUuaXMobCl8fChsPXUscz1TYShlLHtyZWw6byx0YXJnZXQ6bn0pLFFvKHUpP2EuZ2V0UHJldmlvdXNTaWJsaW5nKCk9PT1udWxsP3UuaW5zZXJ0QmVmb3JlKHMpOnUuaW5zZXJ0QWZ0ZXIocyk6YS5pbnNlcnRCZWZvcmUocykpLFFvKGEpKXtpZighYS5pcyhzKSl7aWYocyE9PW51bGwpe3U9YS5nZXRDaGlsZHJlbigpO2ZvcihsZXQgYz0wO2M8dS5sZW5ndGg7YysrKXMuYXBwZW5kKHVbY10pfWEucmVtb3ZlKCl9fWVsc2UgcyE9PW51bGwmJnMuYXBwZW5kKGEpfSl9fTtjb25zdCBtUD1Kcjt2YXIgUGw9bVAsemk9UGwsdlA9aXIseVA9TnQsRmk9bWUseFA9cDtIUy5MaW5rUGx1Z2luPWZ1bmN0aW9uKHt2YWxpZGF0ZVVybDplfSl7bGV0W3RdPXZQLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4geFAudXNlRWZmZWN0KCgpPT57aWYoIXQuaGFzTm9kZXMoW3ppLkxpbmtOb2RlXSkpdGhyb3cgRXJyb3IoIkxpbmtQbHVnaW46IExpbmtOb2RlIG5vdCByZWdpc3RlcmVkIG9uIGVkaXRvciIpO3JldHVybiB5UC5tZXJnZVJlZ2lzdGVyKHQucmVnaXN0ZXJDb21tYW5kKHppLlRPR0dMRV9MSU5LX0NPTU1BTkQsbj0+e2lmKG49PT1udWxsKXJldHVybiB6aS50b2dnbGVMaW5rKG4pLCEwO2lmKHR5cGVvZiBuPT0ic3RyaW5nIilyZXR1cm4gZT09PXZvaWQgMHx8ZShuKT8oemkudG9nZ2xlTGluayhuKSwhMCk6ITE7bGV0e3VybDpyLHRhcmdldDpvLHJlbDppLHRpdGxlOmx9PW47cmV0dXJuIHppLnRvZ2dsZUxpbmsocix7cmVsOmksdGFyZ2V0Om8sdGl0bGU6bH0pLCEwfSxGaS5DT01NQU5EX1BSSU9SSVRZX0xPVyksZSE9PXZvaWQgMD90LnJlZ2lzdGVyQ29tbWFuZChGaS5QQVNURV9DT01NQU5ELG49PntsZXQgcj1GaS4kZ2V0U2VsZWN0aW9uKCk7aWYoIUZpLiRpc1JhbmdlU2VsZWN0aW9uKHIpfHxyLmlzQ29sbGFwc2VkKCl8fCEobiBpbnN0YW5jZW9mIENsaXBib2FyZEV2ZW50KXx8bi5jbGlwYm9hcmREYXRhPT1udWxsKXJldHVybiExO2xldCBvPW4uY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJ0ZXh0Iik7cmV0dXJuIGUobyk/ci5nZXROb2RlcygpLnNvbWUoaT0+RmkuJGlzRWxlbWVudE5vZGUoaSkpPyExOih0LmRpc3BhdGNoQ29tbWFuZCh6aS5UT0dHTEVfTElOS19DT01NQU5ELG8pLG4ucHJldmVudERlZmF1bHQoKSwhMCk6ITF9LEZpLkNPTU1BTkRfUFJJT1JJVFlfTE9XKTooKT0+e30pfSxbdCxlXSksbnVsbH07Y29uc3Qgd1A9SFM7dmFyIF9QPXdQO2Z1bmN0aW9uIFNQKHthcmlhQWN0aXZlRGVzY2VuZGFudDplLGFyaWFBdXRvQ29tcGxldGU6dCxhcmlhQ29udHJvbHM6bixhcmlhRGVzY3JpYmVkQnk6cixhcmlhRXhwYW5kZWQ6byxhcmlhTGFiZWw6aSxhcmlhTGFiZWxsZWRCeTpsLGFyaWFNdWx0aWxpbmU6cyxhcmlhT3duczphLGFyaWFSZXF1aXJlZDp1LGF1dG9DYXBpdGFsaXplOmMsY2xhc3NOYW1lOmQsaWQ6Zixyb2xlOmg9InRleHRib3giLHNwZWxsQ2hlY2s6bT0hMCxzdHlsZTpnLHRhYkluZGV4OlMsImRhdGEtdGVzdGlkIjp2LC4uLnl9KXtjb25zdFt4XT1pci51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCksW3csa109cC51c2VTdGF0ZSghMSksYj1wLnVzZUNhbGxiYWNrKFQ9Pnt2YXIgRDt4LnNldFJvb3RFbGVtZW50KFQpO2NvbnN0IE49KEQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZhbC11aSIpKT09bnVsbD92b2lkIDA6RC5zaGFkb3dSb290O2lmKE4mJiJnZXRTZWxlY3Rpb24iaW4gTil7eC5fd2luZG93PU47cmV0dXJufX0sW3hdKTtyZXR1cm4gcC51c2VMYXlvdXRFZmZlY3QoKCk9PihrKHguaXNFZGl0YWJsZSgpKSx4LnJlZ2lzdGVyRWRpdGFibGVMaXN0ZW5lcihUPT57ayhUKX0pKSxbeF0pLF8uanN4KCJkaXYiLHsuLi55LCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiOnc/ZTp2b2lkIDAsImFyaWEtYXV0b2NvbXBsZXRlIjp3P3Q6Im5vbmUiLCJhcmlhLWNvbnRyb2xzIjp3P246dm9pZCAwLCJhcmlhLWRlc2NyaWJlZGJ5IjpyLCJhcmlhLWV4cGFuZGVkIjp3JiZoPT09ImNvbWJvYm94Ij8hIW86dm9pZCAwLCJhcmlhLWxhYmVsIjppLCJhcmlhLWxhYmVsbGVkYnkiOmwsImFyaWEtbXVsdGlsaW5lIjpzLCJhcmlhLW93bnMiOnc/YTp2b2lkIDAsImFyaWEtcmVhZG9ubHkiOnc/dm9pZCAwOiEwLCJhcmlhLXJlcXVpcmVkIjp1LGF1dG9DYXBpdGFsaXplOmMsY2xhc3NOYW1lOmQsY29udGVudEVkaXRhYmxlOncsImRhdGEtdGVzdGlkIjp2LGlkOmYscmVmOmIscm9sZTpoLHNwZWxsQ2hlY2s6bSxzdHlsZTpnLHRhYkluZGV4OlN9KX1mdW5jdGlvbiBFUCh7Y2xhc3NOYW1lOmV9KXtyZXR1cm4gXy5qc3goU1Ase2NsYXNzTmFtZTplfSl9Y2xhc3MgQmEgZXh0ZW5kcyBtZS5EZWNvcmF0b3JOb2Rle2NvbnN0cnVjdG9yKHQsbil7c3VwZXIobiksdGhpcy5fX3NyYz10LnNyYyx0aGlzLl9fYWx0VGV4dD10LmFsdFRleHQsdGhpcy5fX3dpZHRoPXQud2lkdGgsdGhpcy5fX2hlaWdodD10LmhlaWdodH1zdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJpbWFnZSJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgQmEoe3NyYzp0Ll9fc3JjLGFsdFRleHQ6dC5fX2FsdFRleHQsd2lkdGg6dC5fX3dpZHRoLGhlaWdodDp0Ll9faGVpZ2h0fSl9ZXhwb3J0SlNPTigpe3JldHVybnthbHRUZXh0OnRoaXMuX19hbHRUZXh0LGhlaWdodDp0aGlzLl9fd2lkdGgsc3JjOnRoaXMuX19zcmMsdHlwZToiaW1hZ2UiLHZlcnNpb246MSx3aWR0aDp0aGlzLl9fd2lkdGh9fXN0YXRpYyBpbXBvcnRKU09OKHQpe3JldHVybiBHUyh0KX1jcmVhdGVET00oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9dXBkYXRlRE9NKCl7cmV0dXJuITF9ZGVjb3JhdGUoKXtyZXR1cm4gXy5qc3goQ1Ase3NyYzp0aGlzLl9fc3JjLGFsdFRleHQ6dGhpcy5fX2FsdFRleHQsZW1wdHk6dGhpcy5fX2VtcHR5LGhlaWdodDp0aGlzLl9faGVpZ2h0LG5vZGVLZXk6dGhpcy5nZXRLZXkoKX0pfX1mdW5jdGlvbiBDUChlKXtyZXR1cm4gXy5qc3goImltZyIse3NyYzplLnNyY30pfWZ1bmN0aW9uIEdTKGUpe3JldHVybiBuZXcgQmEoZSl9ZnVuY3Rpb24gJFAoKXtjb25zdFtlXT1pci51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57ZS5mb2N1cygpfSxbZV0pLG51bGx9Y29uc3QgWVM9bWUuY3JlYXRlQ29tbWFuZCgiSU5TRVJUX0lNQUdFX0NPTU1BTkQiKTtmdW5jdGlvbiBrUCgpe2NvbnN0W2VdPWlyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntpZighZS5oYXNOb2RlcyhbQmFdKSl0aHJvdyBuZXcgRXJyb3IoIkltYWdlc1BsdWdpbjogSW1hZ2VOb2RlIG5vdCByZWdpc3RlcmVkIG9uIGVkaXRvciIpO3JldHVybiBOdC5tZXJnZVJlZ2lzdGVyKGUucmVnaXN0ZXJDb21tYW5kKFlTLHQ9Pntjb25zdCBuPUdTKHQpO3JldHVybiBtZS4kaW5zZXJ0Tm9kZXMoW25dKSxtZS4kaXNSb290T3JTaGFkb3dSb290KG4uZ2V0UGFyZW50T3JUaHJvdygpKSYmTnQuJHdyYXBOb2RlSW5FbGVtZW50KG4sbWUuJGNyZWF0ZVBhcmFncmFwaE5vZGUpLnNlbGVjdEVuZCgpLCEwfSxtZS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUikpfSxbZV0pLG51bGx9Y29uc3QgVFA9KHtjbGFzc05hbWU6ZX0pPT5fLmpzeHMoInN2ZyIse2hlaWdodDoxMix3aWR0aDoxMix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOiIyIixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIixjbGFzc05hbWU6ZSxjaGlsZHJlbjpbXy5qc3goInBhdGgiLHtkOiJNNiA0aDhhNCA0IDAgMCAxIDQgNCA0IDQgMCAwIDEtNCA0SDZ6In0pLF8uanN4KCJwYXRoIix7ZDoiTTYgMTJoOWE0IDQgMCAwIDEgNCA0IDQgNCAwIDAgMS00IDRINnoifSldfSksYlA9VFAsTlA9KHtjbGFzc05hbWU6ZX0pPT5fLmpzeHMoInN2ZyIse3htbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNsYXNzTmFtZTplLHdpZHRoOjEyLGhlaWdodDoxMixjaGlsZHJlbjpbXy5qc3goImxpbmUiLHt4MToiMTkiLHkxOiI0Iix4MjoiMTAiLHkyOiI0In0pLF8uanN4KCJsaW5lIix7eDE6IjE0Iix5MToiMjAiLHgyOiI1Iix5MjoiMjAifSksXy5qc3goImxpbmUiLHt4MToiMTUiLHkxOiI0Iix4MjoiOSIseTI6IjIwIn0pXX0pLFJQPU5QLFBQPSh7Y2xhc3NOYW1lOmV9KT0+Xy5qc3goInN2ZyIse3htbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdmlld0JveDoiMCAwIDI0IDI0IixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjEiLGNsYXNzTmFtZTplLHdpZHRoOjEyLGhlaWdodDoxMixjaGlsZHJlbjpfLmpzeCgicGF0aCIse2ZpbGxSdWxlOiJldmVub2RkIixkOiJNMTMsMTUgTDEzLDIxIEMxMywyMS41NTIyODQ3IDEyLjU1MjI4NDcsMjIgMTIsMjIgQzExLjQ0NzcxNTMsMjIgMTEsMjEuNTUyMjg0NyAxMSwyMSBMMTEsMTUgTDEzLDE1IFogTTMsMTMgQzIuNDQ3NzE1MjUsMTMgMiwxMi41NTIyODQ3IDIsMTIgQzIsMTEuNDQ3NzE1MyAyLjQ0NzcxNTI1LDExIDMsMTEgTDIxLDExIEMyMS41NTIyODQ3LDExIDIyLDExLjQ0NzcxNTMgMjIsMTIgQzIyLDEyLjU1MjI4NDcgMjEuNTUyMjg0NywxMyAyMSwxMyBMMywxMyBaIE0xOSwyIEMxOS41NTIyODQ3LDIgMjAsMi40NDc3MTUyNSAyMCwzIEMyMCwzLjU1MjI4NDc1IDE5LjU1MjI4NDcsNCAxOSw0IEwxMyw0IEwxMyw5IEwxMSw5IEwxMSw0IEw1LDQgQzQuNDQ3NzE1MjUsNCA0LDMuNTUyMjg0NzUgNCwzIEM0LDIuNDQ3NzE1MjUgNC40NDc3MTUyNSwyIDUsMiBMMTksMiBaIn0pfSksT1A9UFAsQVA9KHt2YXJpYW50OmU9InByaW1hcnkiLG9uQ2xpY2s6dCxjaGlsZHJlbjpuLGljb246cixkaXNhYmxlZDpvPSExfSk9Pl8uanN4KCJidXR0b24iLHtkaXNhYmxlZDpvLGNsYXNzTmFtZTphZCgiZm9udC1zYW5zIGZvbnQtWzEycHhdIHRyYWNraW5nLVswLjA0ZW1dIHB5LTEgcHgtMiByb3VuZGVkIHdoaXRlc3BhY2Utbm93cmFwIGdyb3VwIHJlbGF0aXZlIHRleHQtcHJpbWFyeSIseyJmb250LWJvbGQiOmU9PT0icHJpbWFyeSIsImJnLWJhY2tncm91bmQgaG92ZXI6YmctYmFja2dyb3VuZCB0ZXh0LWZpbGwgZGlzYWJsZWQ6YmctZmlsbCBkaXNhYmxlZDp0ZXh0LWJhY2tncm91bmQiOmU9PT0icHJpbWFyeSIsImJnLXRyYW5zcGFyZW50IGJvcmRlciBib3JkZXItcHJpbWFyeSB0ZXh0LXByaW1hcnkgaG92ZXI6Ym9yZGVyLWhpZ2hsaWdodCBob3Zlcjp0ZXh0LWhpZ2hsaWdodCBkaXNhYmxlZDpiZy1maWxsIGRpc2FibGVkOnRleHQtYmFja2dyb3VuZCI6ZSE9PSJwcmltYXJ5In0pLG9uQ2xpY2s6dCxjaGlsZHJlbjpfLmpzeHMoInNwYW4iLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0yIixjaGlsZHJlbjpbciYmcixuXX0pfSksSm89QVAsTVA9KHtjbGFzc05hbWU6ZX0pPT5fLmpzeHMoInN2ZyIse3dpZHRoOiIxMCIsaGVpZ2h0OiIxMCIsdmlld0JveDoiMCAwIDEyIDEyIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGNsYXNzTmFtZTplLGNoaWxkcmVuOltfLmpzeCgicGF0aCIse2ZpbGxSdWxlOiJldmVub2RkIixjbGlwUnVsZToiZXZlbm9kZCIsZDoiTTMuNzA3MzMgMS4wMDAxNUw4Ljc3ODQgNi4wNzEyMUw4LjA3MTI5IDYuNzc4MzJMMy4wMDAyMiAxLjcwNzI1TDMuNzA3MzMgMS4wMDAxNVoiLGZpbGw6ImN1cnJlbnRDb2xvciJ9KSxfLmpzeCgicGF0aCIse2ZpbGxSdWxlOiJldmVub2RkIixjbGlwUnVsZToiZXZlbm9kZCIsZDoiTTMuMDAwMTUgMTAuNDcwOUw4LjA3MTIxIDUuMzk5ODNMOC43NzgzMiA2LjEwNjkzTDMuNzA3MjUgMTEuMTc4TDMuMDAwMTUgMTAuNDcwOVoiLGZpbGw6ImN1cnJlbnRDb2xvciJ9KV19KSxMUD1NUCxYUz1lZS5jcmVhdGVDb250ZXh0KHtnZXQgYXBpKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgc2Vzc2lvbigpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHRoZW1lKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgc2V0VGhlbWUoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBlZGl0TW9kZSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNldEVkaXRNb2RlKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgaGlnaGxpZ2h0KCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgc2V0SGlnaGxpZ2h0KCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgc2V0V2luZG93U2l6ZSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHdpbmRvd1NpemUoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9fSk7ZnVuY3Rpb24gU20oKXtyZXR1cm4gZWUudXNlQ29udGV4dChYUyl9Y29uc3QgRFA9KHtvcHRpb25zOmUsb25DaGFuZ2U6dCxsYWJlbDpuLGljb246cn0pPT57Y29uc3RbbyxpXT1wLnVzZVN0YXRlKCExKSxsPXAudXNlUmVmKG51bGwpLFtzLGFdPXAudXNlU3RhdGUoMCkse3dpbmRvd1NpemU6dX09U20oKSxjPSgpPT57aSghbyl9LGQ9KGYsaCk9PnthKGgpLHQoZiksaSghMSl9O3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IGY9aD0+e28mJmwuY3VycmVudCYmIWwuY3VycmVudC5jb250YWlucyhoLnRhcmdldCkmJmkoITEpfTtyZXR1cm4gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGYpLCgpPT57ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGYpfX0sW10pLF8uanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtWzEycHhdIixyZWY6bCxjaGlsZHJlbjpfLmpzeChKbyx7b25DbGljazpmPT57Zi5wcmV2ZW50RGVmYXVsdCgpLGMoKX0saWNvbjpfLmpzeChMUCx7Y2xhc3NOYW1lOmByb3RhdGUtWy05MGRlZ10gdHJhbnNpdGlvbi10cmFuc2Zvcm0gZHVyYXRpb24tMTUwIGVhc2UtaW4tb3V0ICR7bz8iIjoicm90YXRlLVs5MGRlZ10ifWB9KSxjaGlsZHJlbjpfLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVsYXRpdmUiLGNoaWxkcmVuOltfLmpzeHMoInNwYW4iLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0xIixjaGlsZHJlbjpbbixyJiZyXX0pLG8mJl8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImFic29sdXRlIC10b3AtWzRweF0gb3ZlcmZsb3ctc2Nyb2xsIHNoYWRvdy1sZyAtbGVmdC0yIHRleHQtcHJpbWFyeSBiZy1ib3JkZXIgdy1maXQgei1vdmVybGF5IixzdHlsZTp7bWF4SGVpZ2h0OnU9PW51bGw/dm9pZCAwOnUuaW5uZXJIZWlnaHR9LGNoaWxkcmVuOl8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wgIixjaGlsZHJlbjplPT1udWxsP3ZvaWQgMDplLm1hcCgoZixoKT0+Xy5qc3goImJ1dHRvbiIse29uQ2xpY2s6bT0+e20ucHJldmVudERlZmF1bHQoKSxkKGYsaCl9LGNsYXNzTmFtZTpgdGV4dC1sZWZ0IHB4LTIgcHktMSBob3ZlcjpiZy1iYWNrZ3JvdW5kIGhvdmVyOnRleHQtaGlnaGxpZ2h0ICAke2g9PT1zJiYiZm9udC1ib2xkIGJnLWJhY2tncm91bmQgaG92ZXI6YmctYmFja2dyb3VuZCB0cnVuY2F0ZSJ9YCxjaGlsZHJlbjpmfSxmKSl9KX0pXX0pfSl9KX0sSVA9RFAsalA9bmV3IFRleHRFbmNvZGVyO2Z1bmN0aW9uIFFTKGUpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e3ZhciBpO2NvbnN0IHI9KGk9ZS5jdXJyZW50VGFyZ2V0LmZpbGVzKT09bnVsbD92b2lkIDA6aVswXSxvPW5ldyBGaWxlUmVhZGVyO28uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKCk9Pntjb25zdCBsPW8ucmVzdWx0O2lmKHR5cGVvZiBsPT0ic3RyaW5nIil7Y29uc3Qgcz1uZXcgSW1hZ2U7cy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixhc3luYygpPT57Y29uc3QgYT1hd2FpdCBFbi5nZXRTSEEyNTZIYXNoKGpQLmVuY29kZShsKSk7aWYocy5uYXR1cmFsV2lkdGgmJnMubmF0dXJhbEhlaWdodCl7Y29uc3QgdT1VZyhsKTt0KHtzcmM6bCx3aWR0aDpzLm5hdHVyYWxXaWR0aCxoZWlnaHQ6cy5uYXR1cmFsSGVpZ2h0LGZpbGVuYW1lOnI9PW51bGw/dm9pZCAwOnIubmFtZSxzaGEyNTY6YSxtaW1lVHlwZTp1LGZpbGVFeHQ6dSYmVmcodSl9KX1lbHNlIHQoe3NyYzpsLGZpbGVuYW1lOnI9PW51bGw/dm9pZCAwOnIubmFtZSxzaGEyNTY6YX0pfSkscy5zcmM9bH1lbHNlIG4obD97bWVzc2FnZToiVW5leHBlY3RlZCBpbWFnZSByZXN1bHQgdHlwZSIscmVzdWx0Omx9OnttZXNzYWdlOiJFbXB0eSByZXN1bHQifSl9KSxyJiZvLnJlYWRBc0RhdGFVUkwocil9KX1mdW5jdGlvbiBKUyhlKXtjb25zdCB0PWUuYW5jaG9yLG49ZS5mb2N1cyxyPWUuYW5jaG9yLmdldE5vZGUoKSxvPWUuZm9jdXMuZ2V0Tm9kZSgpO3JldHVybiByPT09bz9yOmUuaXNCYWNrd2FyZCgpP01vLiRpc0F0Tm9kZUVuZChuKT9yOm86TW8uJGlzQXROb2RlRW5kKHQpP3I6b31mdW5jdGlvbiB6UCgpe2NvbnN0W2VdPWlyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pk50Lm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQobWUuQ0xJQ0tfQ09NTUFORCx0PT57Y29uc3Qgbj1tZS4kZ2V0U2VsZWN0aW9uKCk7aWYobWUuJGlzUmFuZ2VTZWxlY3Rpb24obikpe2NvbnN0IHI9SlMobiksbz1OdC4kZmluZE1hdGNoaW5nUGFyZW50KHIsUGwuJGlzTGlua05vZGUpO2lmKFBsLiRpc0xpbmtOb2RlKG8pJiYodC5tZXRhS2V5fHx0LmN0cmxLZXkpKXJldHVybiB3aW5kb3cub3BlbihvLmdldFVSTCgpLCJfYmxhbmsiKSwhMH1yZXR1cm4hMX0sbWUuQ09NTUFORF9QUklPUklUWV9MT1cpKSxbXSksbnVsbH12YXIgWlM9e2V4cG9ydHM6e319LEZQPSJTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCIsQlA9RlAsV1A9QlA7ZnVuY3Rpb24gcVMoKXt9ZnVuY3Rpb24gZUUoKXt9ZUUucmVzZXRXYXJuaW5nQ2FjaGU9cVM7dmFyIFVQPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShyLG8saSxsLHMsYSl7aWYoYSE9PVdQKXt2YXIgdT1uZXcgRXJyb3IoIkNhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuIFVzZSBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKSB0byBjYWxsIHRoZW0uIFJlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMiKTt0aHJvdyB1Lm5hbWU9IkludmFyaWFudCBWaW9sYXRpb24iLHV9fWUuaXNSZXF1aXJlZD1lO2Z1bmN0aW9uIHQoKXtyZXR1cm4gZX12YXIgbj17YXJyYXk6ZSxiaWdpbnQ6ZSxib29sOmUsZnVuYzplLG51bWJlcjplLG9iamVjdDplLHN0cmluZzplLHN5bWJvbDplLGFueTplLGFycmF5T2Y6dCxlbGVtZW50OmUsZWxlbWVudFR5cGU6ZSxpbnN0YW5jZU9mOnQsbm9kZTplLG9iamVjdE9mOnQsb25lT2Y6dCxvbmVPZlR5cGU6dCxzaGFwZTp0LGV4YWN0OnQsY2hlY2tQcm9wVHlwZXM6ZUUscmVzZXRXYXJuaW5nQ2FjaGU6cVN9O3JldHVybiBuLlByb3BUeXBlcz1uLG59O1pTLmV4cG9ydHM9VVAoKTt2YXIgVlA9WlMuZXhwb3J0cztjb25zdCB6bj1iYShWUCk7ZnVuY3Rpb24gU3AoKXtyZXR1cm4gU3A9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sU3AuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIEhQKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj1LUChlLHQpLHIsbztpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2ZvcihvPTA7bzxpLmxlbmd0aDtvKyspcj1pW29dLCEodC5pbmRleE9mKHIpPj0wKSYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscikmJihuW3JdPWVbcl0pfXJldHVybiBufWZ1bmN0aW9uIEtQKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj17fSxyPU9iamVjdC5rZXlzKGUpLG8saTtmb3IoaT0wO2k8ci5sZW5ndGg7aSsrKW89cltpXSwhKHQuaW5kZXhPZihvKT49MCkmJihuW29dPWVbb10pO3JldHVybiBufXZhciBFbT1wLmZvcndhcmRSZWYoZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNvbG9yLHI9bj09PXZvaWQgMD8iY3VycmVudENvbG9yIjpuLG89ZS5zaXplLGk9bz09PXZvaWQgMD8yNDpvLGw9SFAoZSxbImNvbG9yIiwic2l6ZSJdKTtyZXR1cm4gZWUuY3JlYXRlRWxlbWVudCgic3ZnIixTcCh7cmVmOnQseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix3aWR0aDppLGhlaWdodDppLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOnIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQifSxsKSxlZS5jcmVhdGVFbGVtZW50KCJwb2x5bGluZSIse3BvaW50czoiMjAgNiA5IDE3IDQgMTIifSkpfSk7RW0ucHJvcFR5cGVzPXtjb2xvcjp6bi5zdHJpbmcsc2l6ZTp6bi5vbmVPZlR5cGUoW3puLnN0cmluZyx6bi5udW1iZXJdKX07RW0uZGlzcGxheU5hbWU9IkNoZWNrIjtjb25zdCBHUD1FbTtmdW5jdGlvbiBFcCgpe3JldHVybiBFcD1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSxFcC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gWVAoZSx0KXtpZihlPT1udWxsKXJldHVybnt9O3ZhciBuPVhQKGUsdCkscixvO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7Zm9yKG89MDtvPGkubGVuZ3RoO28rKylyPWlbb10sISh0LmluZGV4T2Yocik+PTApJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyKSYmKG5bcl09ZVtyXSl9cmV0dXJuIG59ZnVuY3Rpb24gWFAoZSx0KXtpZihlPT1udWxsKXJldHVybnt9O3ZhciBuPXt9LHI9T2JqZWN0LmtleXMoZSksbyxpO2ZvcihpPTA7aTxyLmxlbmd0aDtpKyspbz1yW2ldLCEodC5pbmRleE9mKG8pPj0wKSYmKG5bb109ZVtvXSk7cmV0dXJuIG59dmFyIENtPXAuZm9yd2FyZFJlZihmdW5jdGlvbihlLHQpe3ZhciBuPWUuY29sb3Iscj1uPT09dm9pZCAwPyJjdXJyZW50Q29sb3IiOm4sbz1lLnNpemUsaT1vPT09dm9pZCAwPzI0Om8sbD1ZUChlLFsiY29sb3IiLCJzaXplIl0pO3JldHVybiBlZS5jcmVhdGVFbGVtZW50KCJzdmciLEVwKHtyZWY6dCx4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHdpZHRoOmksaGVpZ2h0Omksdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6cixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCJ9LGwpLGVlLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTAgMTNhNSA1IDAgMCAwIDcuNTQuNTRsMy0zYTUgNSAwIDAgMC03LjA3LTcuMDdsLTEuNzIgMS43MSJ9KSxlZS5jcmVhdGVFbGVtZW50KCJwYXRoIix7ZDoiTTE0IDExYTUgNSAwIDAgMC03LjU0LS41NGwtMyAzYTUgNSAwIDAgMCA3LjA3IDcuMDdsMS43MS0xLjcxIn0pKX0pO0NtLnByb3BUeXBlcz17Y29sb3I6em4uc3RyaW5nLHNpemU6em4ub25lT2ZUeXBlKFt6bi5zdHJpbmcsem4ubnVtYmVyXSl9O0NtLmRpc3BsYXlOYW1lPSJMaW5rIjtjb25zdCBRUD1DbTtmdW5jdGlvbiBDcCgpe3JldHVybiBDcD1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSxDcC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gSlAoZSx0KXtpZihlPT1udWxsKXJldHVybnt9O3ZhciBuPVpQKGUsdCkscixvO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7Zm9yKG89MDtvPGkubGVuZ3RoO28rKylyPWlbb10sISh0LmluZGV4T2Yocik+PTApJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyKSYmKG5bcl09ZVtyXSl9cmV0dXJuIG59ZnVuY3Rpb24gWlAoZSx0KXtpZihlPT1udWxsKXJldHVybnt9O3ZhciBuPXt9LHI9T2JqZWN0LmtleXMoZSksbyxpO2ZvcihpPTA7aTxyLmxlbmd0aDtpKyspbz1yW2ldLCEodC5pbmRleE9mKG8pPj0wKSYmKG5bb109ZVtvXSk7cmV0dXJuIG59dmFyICRtPXAuZm9yd2FyZFJlZihmdW5jdGlvbihlLHQpe3ZhciBuPWUuY29sb3Iscj1uPT09dm9pZCAwPyJjdXJyZW50Q29sb3IiOm4sbz1lLnNpemUsaT1vPT09dm9pZCAwPzI0Om8sbD1KUChlLFsiY29sb3IiLCJzaXplIl0pO3JldHVybiBlZS5jcmVhdGVFbGVtZW50KCJzdmciLENwKHtyZWY6dCx4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHdpZHRoOmksaGVpZ2h0Omksdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6cixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCJ9LGwpLGVlLmNyZWF0ZUVsZW1lbnQoImxpbmUiLHt4MToiMTgiLHkxOiI2Iix4MjoiNiIseTI6IjE4In0pLGVlLmNyZWF0ZUVsZW1lbnQoImxpbmUiLHt4MToiNiIseTE6IjYiLHgyOiIxOCIseTI6IjE4In0pKX0pOyRtLnByb3BUeXBlcz17Y29sb3I6em4uc3RyaW5nLHNpemU6em4ub25lT2ZUeXBlKFt6bi5zdHJpbmcsem4ubnVtYmVyXSl9OyRtLmRpc3BsYXlOYW1lPSJYIjtjb25zdCBxUD0kbSxlTz0oe2ZvbnRTaXplczplLGZvbnRzRmFtaWxpZXM6dCxvbkVkaXRvcjpuLGNvbG9yczpyfSk9Pntjb25zdFtvXT1pci51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cC51c2VFZmZlY3QoKCk9PntuJiZuKG8pfSxbb10pO2NvbnN0W2ksbF09cC51c2VTdGF0ZShvKSxbcyxhXT1wLnVzZVN0YXRlKG51bGwpLFt1LGNdPXAudXNlU3RhdGUoITEpLFtkLGZdPXAudXNlU3RhdGUoITEpLFtoLG1dPXAudXNlU3RhdGUoITEpLFtnLFNdPXAudXNlU3RhdGUoITEpO3AudXNlU3RhdGUoIjE1cHgiKSxwLnVzZVN0YXRlKCIjMDAwIikscC51c2VTdGF0ZSgiU2FucyIpO2NvbnN0W3YseV09cC51c2VTdGF0ZSgicGFyYWdyYXBoIik7cC51c2VTdGF0ZSghMSkscC51c2VTdGF0ZSghMSkscC51c2VTdGF0ZSgidXJsIikscC51c2VTdGF0ZShudWxsKTtjb25zdFt4LHddPXAudXNlU3RhdGUobnVsbCksaz1PPT57by5kaXNwYXRjaENvbW1hbmQoUGwuVE9HR0xFX0xJTktfQ09NTUFORCxPKX0sYj17cGFyYWdyYXBoOiJOb3JtYWwiLGgxOiJIZWFkaW5nIDEiLGgyOiJIZWFkaW5nIDIiLGgzOiJIZWFkaW5nIDMiLGg0OiJIZWFkaW5nIDQiLGg1OiJIZWFkaW5nIDUiLGg2OiJIZWFkaW5nIDYiLG51bWJlcjoiTnVtYmVyZWQgTGlzdCIsYnVsbGV0OiJCdWxsZXRlZCBMaXN0In0sVD17fTtmb3IoY29uc3QgTyBpbiBiKVRbYltPXV09Tztjb25zdCBOPXAudXNlQ2FsbGJhY2soKCk9Pntjb25zdCBPPW1lLiRnZXRTZWxlY3Rpb24oKTtpZihtZS4kaXNSYW5nZVNlbGVjdGlvbihPKSl7Y29uc3Qgaj1PLmFuY2hvci5nZXROb2RlKCk7bGV0IEI9ai5nZXRLZXkoKT09PSJyb290Ij9qOk50LiRmaW5kTWF0Y2hpbmdQYXJlbnQoaiwkPT57Y29uc3QgRT0kLmdldFBhcmVudCgpO3JldHVybiBFIT09bnVsbCYmbWUuJGlzUm9vdE9yU2hhZG93Um9vdChFKX0pO0I9PT1udWxsJiYoQj1qLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKSk7Y29uc3QgYWU9SlMoTyksSD1OdC4kZmluZE1hdGNoaW5nUGFyZW50KGFlLFBsLiRpc0xpbmtOb2RlKTtpZihIIT09bnVsbCl7Y29uc3QgJD1ILmdldFVSTCgpO3coJCl9ZWxzZSB3KG51bGwpO2NvbnN0IEc9Qi5nZXRLZXkoKSxDPWkuZ2V0RWxlbWVudEJ5S2V5KEcpO2lmKGMoTy5oYXNGb3JtYXQoImJvbGQiKSksZihPLmhhc0Zvcm1hdCgiaXRhbGljIikpLG0oTy5oYXNGb3JtYXQoInN0cmlrZXRocm91Z2giKSksUyhPLmhhc0Zvcm1hdCgidW5kZXJsaW5lIikpLEMhPT1udWxsKWlmKGEoRykscG8uJGlzTGlzdE5vZGUoQikpe2NvbnN0ICQ9TnQuJGdldE5lYXJlc3ROb2RlT2ZUeXBlKGoscG8uTGlzdE5vZGUpLEU9JD8kLmdldExpc3RUeXBlKCk6Qi5nZXRMaXN0VHlwZSgpO3koRSl9ZWxzZXtjb25zdCAkPUhzLiRpc0hlYWRpbmdOb2RlKEIpP0IuZ2V0VGFnKCk6Qi5nZXRUeXBlKCk7JCBpbiBiJiZ5KCQpfX19LFtpXSk7cC51c2VFZmZlY3QoKCk9Pk50Lm1lcmdlUmVnaXN0ZXIoby5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKCh7ZWRpdG9yU3RhdGU6T30pPT57Ty5yZWFkKCgpPT57TigpfSl9KSksW04saSxvXSkscC51c2VFZmZlY3QoKCk9Pm8ucmVnaXN0ZXJDb21tYW5kKG1lLlNFTEVDVElPTl9DSEFOR0VfQ09NTUFORCwoTyxqKT0+KE4oKSxsKGopLCExKSxtZS5DT01NQU5EX1BSSU9SSVRZX0NSSVRJQ0FMKSxbbyxOXSk7Y29uc3QgRD1PPT57WyJoMSIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiXS5pbmNsdWRlcyhPKT92IT09TyYmby51cGRhdGUoKCk9Pntjb25zdCBqPW1lLiRnZXRTZWxlY3Rpb24oKTttZS4kaXNSYW5nZVNlbGVjdGlvbihqKSYmTW8uJHNldEJsb2Nrc1R5cGUoaiwoKT0+SHMuJGNyZWF0ZUhlYWRpbmdOb2RlKE8pKX0pOk89PT0icGFyYWdyYXBoIiYmdiE9PSJwYXJhZ3JhcGgiP28udXBkYXRlKCgpPT57Y29uc3Qgaj1tZS4kZ2V0U2VsZWN0aW9uKCk7KG1lLiRpc1JhbmdlU2VsZWN0aW9uKGopfHxtZS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24oaikpJiZNby4kc2V0QmxvY2tzVHlwZShqLCgpPT5tZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpKX0pOk89PT0ibnVtYmVyIiYmdiE9PSJudW1iZXIiP28uZGlzcGF0Y2hDb21tYW5kKHBvLklOU0VSVF9PUkRFUkVEX0xJU1RfQ09NTUFORCx2b2lkIDApOk89PT0iYnVsbGV0IiYmdiE9PSJidWxsZXQiP28uZGlzcGF0Y2hDb21tYW5kKHBvLklOU0VSVF9VTk9SREVSRURfTElTVF9DT01NQU5ELHZvaWQgMCk6by5kaXNwYXRjaENvbW1hbmQocG8uUkVNT1ZFX0xJU1RfQ09NTUFORCx2b2lkIDApfTtyZXR1cm4gcC51c2VDYWxsYmFjaygoKT0+e28udXBkYXRlKCgpPT57Y29uc3QgTz1tZS4kZ2V0U2VsZWN0aW9uKCk7aWYobWUuJGlzUmFuZ2VTZWxlY3Rpb24oTykpe2NvbnN0IGo9Ty5hbmNob3IsQj1PLmZvY3VzLGFlPU8uZ2V0Tm9kZXMoKTtpZihqLmtleT09PUIua2V5JiZqLm9mZnNldD09PUIub2Zmc2V0KXJldHVybjthZS5mb3JFYWNoKChILEcpPT57bWUuJGlzVGV4dE5vZGUoSCk/KEc9PT0wJiZqLm9mZnNldCE9PTAmJihIPUguc3BsaXRUZXh0KGoub2Zmc2V0KVsxXXx8SCksRz09PWFlLmxlbmd0aC0xJiYoSD1ILnNwbGl0VGV4dChCLm9mZnNldClbMF18fEgpLEguX19zdHlsZSE9PSIiJiZILnNldFN0eWxlKCIiKSxILl9fZm9ybWF0IT09MCYmKEguc2V0Rm9ybWF0KDApLE50LiRnZXROZWFyZXN0QmxvY2tFbGVtZW50QW5jZXN0b3JPclRocm93KEgpLnNldEZvcm1hdCgiIikpKTpIcy4kaXNIZWFkaW5nTm9kZShIKSYmSC5yZXBsYWNlKG1lLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCksITApfSl9fSl9LFtpXSksXy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InN0aWNreSB0b3AtMCBib3JkZXItYiBiZy1iYWNrZ3JvdW5kIGJvcmRlci1oaWdobGlnaHQgZmxleCBmbGV4LWNvbCIsY2hpbGRyZW46W18uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtcm93IGdhcC0xIixjaGlsZHJlbjpbXy5qc3goSVAse29wdGlvbnM6T2JqZWN0LnZhbHVlcyhiKSxsYWJlbDpiW3ZdPz92KyIgKG5vdCBzdXBwb3J0ZWQpIixvbkNoYW5nZTpPPT57RChUW09dKX19KSxfLmpzeChKbyx7dmFyaWFudDoicHJpbWFyeSIsb25DbGljazpPPT57Ty5wcmV2ZW50RGVmYXVsdCgpLG8uZGlzcGF0Y2hDb21tYW5kKG1lLkZPUk1BVF9URVhUX0NPTU1BTkQsImJvbGQiKX0sYWN0aXZlOnUsaWNvbjpfLmpzeChiUCx7Y2xhc3NOYW1lOmAke3UmJiJzdHJva2UtWzNweF0ifWB9KX0pLF8uanN4KEpvLHthY3RpdmU6aCxvbkNsaWNrOk89PntPLnByZXZlbnREZWZhdWx0KCksby5kaXNwYXRjaENvbW1hbmQobWUuRk9STUFUX1RFWFRfQ09NTUFORCwic3RyaWtldGhyb3VnaCIpfSxpY29uOl8uanN4KE9QLHtjbGFzc05hbWU6YCR7aCYmInN0cm9rZS1bMnB4XSJ9YH0pfSksXy5qc3goSm8se2FjdGl2ZTpkLG9uQ2xpY2s6Tz0+e08ucHJldmVudERlZmF1bHQoKSxvLmRpc3BhdGNoQ29tbWFuZChtZS5GT1JNQVRfVEVYVF9DT01NQU5ELCJpdGFsaWMiKX0saWNvbjpfLmpzeChSUCx7Y2xhc3NOYW1lOmAke2QmJiJzdHJva2UtWzNweF0ifWB9KX0pLF8uanN4KEpvLHthY3RpdmU6eCE9PW51bGwsb25DbGljazpPPT57Ty5wcmV2ZW50RGVmYXVsdCgpLHcoIiIpLGsoIiIpfSxpY29uOl8uanN4KFFQLHt3aWR0aDoxMixoZWlnaHQ6MTIsY2xhc3NOYW1lOmAke3ghPT1udWxsJiYic3Ryb2tlLVszcHhdIn1gfSl9KSxfLmpzeHMoImxhYmVsIix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBjdXJzb3ItcG9pbnRlciIsY2hpbGRyZW46W18uanN4KEh3LHt9KSxfLmpzeCgiaW5wdXQiLHt0eXBlOiJmaWxlIixoaWRkZW46ITAsb25DaGFuZ2U6Tz0+e08ucHJldmVudERlZmF1bHQoKSxRUyhPKS50aGVuKGo9PntvLmRpc3BhdGNoQ29tbWFuZChZUyx7Li4uan0pfSkuY2F0Y2goaj0+e2NvbnNvbGUuZXJyb3IoIkVycm9yIHJlYWRpbmcgaW1hZ2UiLGopfSl9fSldfSldfSkseCE9PW51bGwmJl8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtcm93IHAtMiIsY2hpbGRyZW46W18uanN4KCJpbnB1dCIse3R5cGU6InRleHQiLHBsYWNlaG9sZGVyOiJFbnRlciBVUkwiLGNsYXNzTmFtZToidy0xLzMgdGV4dC1wcmltYXJ5IGJnLWJhY2tncm91bmQgcHgtMiIsdmFsdWU6eCxvbkNoYW5nZTpPPT57Ty5wcmV2ZW50RGVmYXVsdCgpLHcoTy50YXJnZXQudmFsdWUpfX0pLF8uanN4KEpvLHt2YXJpYW50OiJwcmltYXJ5IixvbkNsaWNrOk89PntPLnByZXZlbnREZWZhdWx0KCksayh4fHxudWxsKX0saWNvbjpfLmpzeChHUCx7c2l6ZToxNH0pfSksXy5qc3goSm8se3ZhcmlhbnQ6InByaW1hcnkiLG9uQ2xpY2s6Tz0+e08ucHJldmVudERlZmF1bHQoKSxrKG51bGwpfSxpY29uOl8uanN4KHFQLHtzaXplOjE0fSl9KV19KV19KX0sdE89ZU87ZnVuY3Rpb24gbk8oZSl7Y29uc29sZS5lcnJvcihlKX1jb25zdCByTz0yOCxvTz0oe3JpY2h0ZXh0OmUsb25FZGl0b3I6dH0pPT57Y29uc3R7d2luZG93U2l6ZTpufT1TbSgpLG89e25hbWVzcGFjZToidmFsIixlZGl0b3JTdGF0ZTppPT57aS5zZXRFZGl0b3JTdGF0ZShpLnBhcnNlRWRpdG9yU3RhdGUoe3Jvb3Q6R04obl8oZSkpfSkpfSxub2RlczpbSHMuSGVhZGluZ05vZGUsQmEscG8uTGlzdE5vZGUscG8uTGlzdEl0ZW1Ob2RlLFBsLkxpbmtOb2RlXSx0aGVtZTp7dGV4dDp7Ym9sZDoiZm9udC1zZW1pYm9sZCIsdW5kZXJsaW5lOiJ1bmRlcmxpbmUiLGl0YWxpYzoiaXRhbGljIixzdHJpa2V0aHJvdWdoOiJsaW5lLXRocm91Z2giLHVuZGVybGluZVN0cmlrZXRocm91Z2g6InVuZGVybGluZSBsaW5lLXRocm91Z2gifSxsaXN0OntsaXN0aXRlbToibWwtWzIwcHhdIixvbDoibGlzdC1kZWNpbWFsIix1bDoibGlzdC1kaXNjIn0saGVhZGluZzp7aDE6InRleHQtNHhsIGZvbnQtYm9sZCIsaDI6InRleHQtM3hsIGZvbnQtYm9sZCIsaDM6InRleHQtMnhsIGZvbnQtYm9sZCIsaDQ6InRleHQteGwgZm9udC1ib2xkIixoNToidGV4dC1sZyBmb250LWJvbGQiLGg2OiJ0ZXh0LW1kIGZvbnQtYm9sZCJ9LGxpbms6InRleHQtaGlnaGxpZ2h0IHVuZGVybGluZSJ9LG9uRXJyb3I6bk99O3JldHVybiBfLmpzeHMobFIuTGV4aWNhbENvbXBvc2VyLHtpbml0aWFsQ29uZmlnOm8sY2hpbGRyZW46W18uanN4KCRQLHt9KSxfLmpzeCh0Tyx7b25FZGl0b3I6dH0pLF8uanN4KGxQLlJpY2hUZXh0UGx1Z2luLHtjb250ZW50RWRpdGFibGU6Xy5qc3goImRpdiIse2NsYXNzTmFtZToiZm9udC1zYW5zIGJvcmRlci1iIHRleHQtcHJpbWFyeSBib3JkZXItaGlnaGxpZ2h0IixzdHlsZTp7bWluSGVpZ2h0Om4hPW51bGwmJm4uaW5uZXJIZWlnaHQ/KG49PW51bGw/dm9pZCAwOm4uaW5uZXJIZWlnaHQpLXJPOnZvaWQgMH0sY2hpbGRyZW46Xy5qc3goRVAse2NsYXNzTmFtZToicC00IG91dGxpbmUtbm9uZSBiZy1maWxsIn0pfSkscGxhY2Vob2xkZXI6Xy5qc3goImRpdiIse2NsYXNzTmFtZToiIixjaGlsZHJlbjoiRW50ZXIgc29tZSB0ZXh0Li4uIn0pLEVycm9yQm91bmRhcnk6aFJ9KSxfLmpzeChfUC5MaW5rUGx1Z2luLHt9KSxfLmpzeCh6UCx7fSksXy5qc3goZFAuTGlzdFBsdWdpbix7fSksXy5qc3goa1Ase30pLF8uanN4KFNSLkhpc3RvcnlQbHVnaW4se30pXX0pfTt2YXIgaU89e3htbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsd2lkdGg6MjQsaGVpZ2h0OjI0LHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOjIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCJ9O2NvbnN0IGxPPWU9PmUucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywiJDEtJDIiKS50b0xvd2VyQ2FzZSgpLFBuPShlLHQpPT57Y29uc3Qgbj1wLmZvcndhcmRSZWYoKHtjb2xvcjpyPSJjdXJyZW50Q29sb3IiLHNpemU6bz0yNCxzdHJva2VXaWR0aDppPTIsYWJzb2x1dGVTdHJva2VXaWR0aDpsLGNoaWxkcmVuOnMsLi4uYX0sdSk9PnAuY3JlYXRlRWxlbWVudCgic3ZnIix7cmVmOnUsLi4uaU8sd2lkdGg6byxoZWlnaHQ6byxzdHJva2U6cixzdHJva2VXaWR0aDpsP051bWJlcihpKSoyNC9OdW1iZXIobyk6aSxjbGFzc05hbWU6YGx1Y2lkZSBsdWNpZGUtJHtsTyhlKX1gLC4uLmF9LFsuLi50Lm1hcCgoW2MsZF0pPT5wLmNyZWF0ZUVsZW1lbnQoYyxkKSksLi4uKEFycmF5LmlzQXJyYXkocyk/czpbc10pfHxbXV0pKTtyZXR1cm4gbi5kaXNwbGF5TmFtZT1gJHtlfWAsbn0sc089UG4oIkNoZWNrIixbWyJwb2x5bGluZSIse3BvaW50czoiMjAgNiA5IDE3IDQgMTIiLGtleToiMTBqamZqIn1dXSksdEU9UG4oIkNoZXZyb25Eb3duIixbWyJwYXRoIix7ZDoibTYgOSA2IDYgNi02IixrZXk6InFydW5zbCJ9XV0pLGFPPVBuKCJDaGV2cm9uTGVmdCIsW1sicGF0aCIse2Q6Im0xNSAxOC02LTYgNi02IixrZXk6IjF3bmZnMyJ9XV0pLHVPPVBuKCJMb2dJbiIsW1sicGF0aCIse2Q6Ik0xNSAzaDRhMiAyIDAgMCAxIDIgMnYxNGEyIDIgMCAwIDEtMiAyaC00IixrZXk6InU1M3M2ciJ9XSxbInBvbHlsaW5lIix7cG9pbnRzOiIxMCAxNyAxNSAxMiAxMCA3IixrZXk6IjFhaWwwaCJ9XSxbImxpbmUiLHt4MToiMTUiLHgyOiIzIix5MToiMTIiLHkyOiIxMiIsa2V5OiJ2NmdyeDgifV1dKSxjTz1QbigiTWF4aW1pemUiLFtbInBhdGgiLHtkOiJNOCAzSDVhMiAyIDAgMCAwLTIgMnYzIixrZXk6IjFkY21pdCJ9XSxbInBhdGgiLHtkOiJNMjEgOFY1YTIgMiAwIDAgMC0yLTJoLTMiLGtleToiMWU0Z3QzIn1dLFsicGF0aCIse2Q6Ik0zIDE2djNhMiAyIDAgMCAwIDIgMmgzIixrZXk6IndzbDVzYyJ9XSxbInBhdGgiLHtkOiJNMTYgMjFoM2EyIDIgMCAwIDAgMi0ydi0zIixrZXk6IjE4dHJlayJ9XV0pLGRPPVBuKCJNaW5pbWl6ZSIsW1sicGF0aCIse2Q6Ik04IDN2M2EyIDIgMCAwIDEtMiAySDMiLGtleToiaG9oYnRyIn1dLFsicGF0aCIse2Q6Ik0yMSA4aC0zYTIgMiAwIDAgMS0yLTJWMyIsa2V5OiI1ancxZjMifV0sWyJwYXRoIix7ZDoiTTMgMTZoM2EyIDIgMCAwIDEgMiAydjMiLGtleToiMTk4dHZyIn1dLFsicGF0aCIse2Q6Ik0xNiAyMXYtM2EyIDIgMCAwIDEgMi0yaDMiLGtleToicGg4bXhwIn1dXSksZk89UG4oIk1vb24iLFtbInBhdGgiLHtkOiJNMTIgM2E2IDYgMCAwIDAgOSA5IDkgOSAwIDEgMS05LTlaIixrZXk6ImE3dG4xOCJ9XV0pLGhPPVBuKCJQYXVzZSIsW1sicmVjdCIse3dpZHRoOiI0IixoZWlnaHQ6IjE2Iix4OiI2Iix5OiI0IixrZXk6ImlmZmhlNCJ9XSxbInJlY3QiLHt3aWR0aDoiNCIsaGVpZ2h0OiIxNiIseDoiMTQiLHk6IjQiLGtleToic2ppbjdqIn1dXSkscE89UG4oIlBsYXkiLFtbInBvbHlnb24iLHtwb2ludHM6IjUgMyAxOSAxMiA1IDIxIDUgMyIsa2V5OiIxOTE2MzcifV1dKSxnTz1QbigiUG93ZXIiLFtbInBhdGgiLHtkOiJNMTIgMnYxMCIsa2V5OiJtbmZibCJ9XSxbInBhdGgiLHtkOiJNMTguNCA2LjZhOSA5IDAgMSAxLTEyLjc3LjA0IixrZXk6Im9ib2Z1OSJ9XV0pLG1PPVBuKCJTZW5kIixbWyJwYXRoIix7ZDoibTIyIDItNyAyMC00LTktOS00WiIsa2V5OiIxcTN2Z2cifV0sWyJwYXRoIix7ZDoiTTIyIDIgMTEgMTMiLGtleToibnpicWVmIn1dXSksdk89UG4oIlN1biIsW1siY2lyY2xlIix7Y3g6IjEyIixjeToiMTIiLHI6IjQiLGtleToiNGV4aXAyIn1dLFsicGF0aCIse2Q6Ik0xMiAydjIiLGtleToidHVzMDNtIn1dLFsicGF0aCIse2Q6Ik0xMiAyMHYyIixrZXk6IjFsaDFrZyJ9XSxbInBhdGgiLHtkOiJtNC45MyA0LjkzIDEuNDEgMS40MSIsa2V5OiIxNDl0NmoifV0sWyJwYXRoIix7ZDoibTE3LjY2IDE3LjY2IDEuNDEgMS40MSIsa2V5OiJwdGJndXYifV0sWyJwYXRoIix7ZDoiTTIgMTJoMiIsa2V5OiIxdDhmOG4ifV0sWyJwYXRoIix7ZDoiTTIwIDEyaDIiLGtleToiMXE4bWp3In1dLFsicGF0aCIse2Q6Im02LjM0IDE3LjY2LTEuNDEgMS40MSIsa2V5OiIxbTh6ejUifV0sWyJwYXRoIix7ZDoibTE5LjA3IDQuOTMtMS40MSAxLjQxIixrZXk6IjFzaGxjcyJ9XV0pLHlPPVBuKCJYIixbWyJwYXRoIix7ZDoiTTE4IDYgNiAxOCIsa2V5OiIxYmw1ZjgifV0sWyJwYXRoIix7ZDoibTYgNiAxMiAxMiIsa2V5OiJkOGJrNnYifV1dKSwkcD0icC0xIGJvcmRlciByb3VuZGVkLWZ1bGwgc2hhZG93IGJvcmRlci1hY2NlbnQiLGQwPSJ2YWxidWlsZDp1cmxCZWZvcmVOYXZpZ2F0aW9uIjtmdW5jdGlvbiB4Tyh7YXBpOmV9KXtjb25zdHt0aGVtZTp0LHNldFRoZW1lOm4sZWRpdE1vZGU6cixzZXRFZGl0TW9kZTpvLHNlc3Npb246aX09U20oKTtpZihpLnN0YXR1cz09PSJzdWNjZXNzIiYmaS5kYXRhPT09Im5vdC1hdXRoZW50aWNhdGVkIilyZXR1cm4gXy5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtZnVsbCBmb250LXNhbnMgYm9yZGVyLTIgcm91bmRlZC1mdWxsIGdhcC14LTMgdGV4dC1wcmltYXJ5IGJnLWJhY2tncm91bmQgYm9yZGVyLWZpbGwiLGNoaWxkcmVuOl8uanN4KCJhIix7Y2xhc3NOYW1lOiRwLGhyZWY6ZS5nZXRMb2dpblVybCh3aW5kb3cubG9jYXRpb24uaHJlZiksY2hpbGRyZW46Xy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTIgZ2FwLXgtMiIsY2hpbGRyZW46W18uanN4KCJzcGFuIix7Y2hpbGRyZW46IkxvZ2luIn0pLF8uanN4KHVPLHtzaXplOjE4fSldfSl9KX0pO2NvbnN0W2wsc109cC51c2VTdGF0ZSgpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2kuc3RhdHVzPT09InN1Y2Nlc3MiJiZpLmRhdGEhPT0ibm90LWF1dGhlbnRpY2F0ZWQiJiZlLmdldFBhdGNoZXMoe30pLnRoZW4oYT0+e2lmKGhsLmlzT2soYSkpe2xldCB1PTA7Zm9yKGNvbnN0IGMgaW4gYS52YWx1ZSl1Kz1hLnZhbHVlW2NdLmxlbmd0aDtzKHUpfWVsc2UgY29uc29sZS5lcnJvcigiQ291bGQgbm90IGxvYWQgcGF0Y2hlcyIsYS5lcnJvcil9KX0sW2ldKSxfLmpzeHMod08se2NoaWxkcmVuOltfLmpzeCh3dSx7YWN0aXZlOnI9PT0iaG92ZXIiLG9uQ2xpY2s6KCk9PntvKGE9PmE9PT0iaG92ZXIiPyJvZmYiOiJob3ZlciIpfSxjaGlsZHJlbjpfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJoLVsyNHB4XSB3LVsyNHB4XSBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciIsY2hpbGRyZW46cj09PSJob3ZlciI/Xy5qc3goaE8se3NpemU6MTh9KTpfLmpzeChwTyx7c2l6ZToxOH0pfSl9KSxfLmpzeCh3dSx7b25DbGljazooKT0+e24odD09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIil9LGNoaWxkcmVuOl8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJoLVsyNHB4XSB3LVsyNHB4XSBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciIsY2hpbGRyZW46W3Q9PT0iZGFyayImJl8uanN4KHZPLHtzaXplOjE1fSksdD09PSJsaWdodCImJl8uanN4KGZPLHtzaXplOjE1fSldfSl9KSxfLmpzeCh3dSx7YWN0aXZlOnI9PT0iZnVsbCIsb25DbGljazooKT0+e2lmKHIhPT0iZnVsbCIpbG9jYWxTdG9yYWdlLnNldEl0ZW0oZDAsd2luZG93LmxvY2F0aW9uLmhyZWYpLHdpbmRvdy5sb2NhdGlvbi5ocmVmPWUuZ2V0RWRpdFVybCgpO2Vsc2UgaWYocj09PSJmdWxsIil7Y29uc3QgYT1sb2NhbFN0b3JhZ2UuZ2V0SXRlbShkMCk7d2luZG93LmxvY2F0aW9uLmhyZWY9YXx8Ii8ifX0sY2hpbGRyZW46Xy5qc3goImRpdiIse2NsYXNzTmFtZToiaC1bMjRweF0gdy1bMjRweF0gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIiLGNoaWxkcmVuOnI9PT0iZnVsbCI/Xy5qc3goZE8se3NpemU6MTV9KTpfLmpzeChjTyx7c2l6ZToxNX0pfSl9KSxsJiZfLmpzeCh3dSx7b25DbGljazooKT0+e30sY2hpbGRyZW46Xy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InJlbGF0aXZlIGgtWzI0cHhdIHctWzI0cHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIixjaGlsZHJlbjpbXy5qc3goImRpdiIse2NsYXNzTmFtZToiYWJzb2x1dGUgLXJpZ2h0LVsxMHB4XSAtdG9wLVsxMHB4XSBib3JkZXIgYm9yZGVyLWJvcmRlciByb3VuZGVkLWZ1bGwgcHgtMSBmb250LXNhbnMgdGV4dC14cyBiZy1jYXJkIHRleHQtYWNjZW50IixjaGlsZHJlbjpsfSksXy5qc3gobU8se3NpemU6MTh9KV19KX0pLF8uanN4KCJhIix7Y2xhc3NOYW1lOiRwLGhyZWY6ZS5nZXREaXNhYmxlVXJsKCksY2hpbGRyZW46Xy5qc3goImRpdiIse2NsYXNzTmFtZToiaC1bMjRweF0gdy1bMjRweF0gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIiLGNoaWxkcmVuOl8uanN4KGdPLHtzaXplOjE4fSl9KX0pXX0pfWZ1bmN0aW9uIHdPKHtjaGlsZHJlbjplfSl7cmV0dXJuIF8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHctZnVsbCBoLWZ1bGwgcHgtMiBweS0yIGZvbnQtc2FucyBib3JkZXItMiByb3VuZGVkLWZ1bGwgZ2FwLXgtMyB0ZXh0LXByaW1hcnkgYmctYmFja2dyb3VuZCBib3JkZXItZmlsbCIsY2hpbGRyZW46ZX0pfWZ1bmN0aW9uIHd1KHthY3RpdmU6ZSxvbkNsaWNrOnQsY2hpbGRyZW46bn0pe3JldHVybiBfLmpzeCgiYnV0dG9uIix7Y2xhc3NOYW1lOmFkKCRwLHsiYmctYWNjZW50IGRyb3Atc2hhZG93LVswcHhfMHB4XzEycHhfcmdiYSg1NiwyMDUsMTUyLDAuNjApXSI6ZX0pLG9uQ2xpY2s6dCxjaGlsZHJlbjpufSl9ZnVuY3Rpb24gbkUoZSl7dmFyIHQsbixyPSIiO2lmKHR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJudW1iZXIiKXIrPWU7ZWxzZSBpZih0eXBlb2YgZT09Im9iamVjdCIpaWYoQXJyYXkuaXNBcnJheShlKSlmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0mJihuPW5FKGVbdF0pKSYmKHImJihyKz0iICIpLHIrPW4pO2Vsc2UgZm9yKHQgaW4gZSllW3RdJiYociYmKHIrPSIgIikscis9dCk7cmV0dXJuIHJ9ZnVuY3Rpb24gX08oKXtmb3IodmFyIGUsdCxuPTAscj0iIjtuPGFyZ3VtZW50cy5sZW5ndGg7KShlPWFyZ3VtZW50c1tuKytdKSYmKHQ9bkUoZSkpJiYociYmKHIrPSIgIikscis9dCk7cmV0dXJuIHJ9Y29uc3QgZjA9ZT0+dHlwZW9mIGU9PSJib29sZWFuIj8iIi5jb25jYXQoZSk6ZT09PTA/IjAiOmUsaDA9X08sU089KGUsdCk9Pm49Pnt2YXIgcjtpZigodD09bnVsbD92b2lkIDA6dC52YXJpYW50cyk9PW51bGwpcmV0dXJuIGgwKGUsbj09bnVsbD92b2lkIDA6bi5jbGFzcyxuPT1udWxsP3ZvaWQgMDpuLmNsYXNzTmFtZSk7Y29uc3R7dmFyaWFudHM6byxkZWZhdWx0VmFyaWFudHM6aX09dCxsPU9iamVjdC5rZXlzKG8pLm1hcCh1PT57Y29uc3QgYz1uPT1udWxsP3ZvaWQgMDpuW3VdLGQ9aT09bnVsbD92b2lkIDA6aVt1XTtpZihjPT09bnVsbClyZXR1cm4gbnVsbDtjb25zdCBmPWYwKGMpfHxmMChkKTtyZXR1cm4gb1t1XVtmXX0pLHM9biYmT2JqZWN0LmVudHJpZXMobikucmVkdWNlKCh1LGMpPT57bGV0W2QsZl09YztyZXR1cm4gZj09PXZvaWQgMHx8KHVbZF09ZiksdX0se30pLGE9dD09bnVsbHx8KHI9dC5jb21wb3VuZFZhcmlhbnRzKT09PW51bGx8fHI9PT12b2lkIDA/dm9pZCAwOnIucmVkdWNlKCh1LGMpPT57bGV0e2NsYXNzOmQsY2xhc3NOYW1lOmYsLi4uaH09YztyZXR1cm4gT2JqZWN0LmVudHJpZXMoaCkuZXZlcnkobT0+e2xldFtnLFNdPW07cmV0dXJuIEFycmF5LmlzQXJyYXkoUyk/Uy5pbmNsdWRlcyh7Li4uaSwuLi5zfVtnXSk6ey4uLmksLi4uc31bZ109PT1TfSk/Wy4uLnUsZCxmXTp1fSxbXSk7cmV0dXJuIGgwKGUsbCxhLG49PW51bGw/dm9pZCAwOm4uY2xhc3Msbj09bnVsbD92b2lkIDA6bi5jbGFzc05hbWUpfSxFTz1TTygiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHdoaXRlc3BhY2Utbm93cmFwIHJvdW5kZWQtbWQgdGV4dC1zbSBmb250LW1lZGl1bSByaW5nLW9mZnNldC1iYWNrZ3JvdW5kIHRyYW5zaXRpb24tY29sb3JzIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAiLHt2YXJpYW50czp7dmFyaWFudDp7ZGVmYXVsdDoiYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBob3ZlcjpiZy1wcmltYXJ5LzkwIixkZXN0cnVjdGl2ZToiYmctZGVzdHJ1Y3RpdmUgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGhvdmVyOmJnLWRlc3RydWN0aXZlLzkwIixvdXRsaW5lOiJib3JkZXIgYm9yZGVyLWlucHV0IGJnLWJhY2tncm91bmQgaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQiLHNlY29uZGFyeToiYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQgaG92ZXI6Ymctc2Vjb25kYXJ5LzgwIixnaG9zdDoiaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQiLGxpbms6InRleHQtcHJpbWFyeSB1bmRlcmxpbmUtb2Zmc2V0LTQgaG92ZXI6dW5kZXJsaW5lIn0sc2l6ZTp7ZGVmYXVsdDoiaC0xMCBweC00IHB5LTIiLHNtOiJoLTkgcm91bmRlZC1tZCBweC0zIixsZzoiaC0xMSByb3VuZGVkLW1kIHB4LTgiLGljb246ImgtMTAgdy0xMCJ9fSxkZWZhdWx0VmFyaWFudHM6e3ZhcmlhbnQ6ImRlZmF1bHQiLHNpemU6ImRlZmF1bHQifX0pLEpsPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLHZhcmlhbnQ6dCxzaXplOm4sYXNDaGlsZDpyPSExLC4uLm99LGkpPT57Y29uc3QgbD1yP1RsOiJidXR0b24iO3JldHVybiBfLmpzeChsLHtjbGFzc05hbWU6aXQoRU8oe3ZhcmlhbnQ6dCxzaXplOm4sY2xhc3NOYW1lOmV9KSkscmVmOmksLi4ub30pfSk7SmwuZGlzcGxheU5hbWU9IkJ1dHRvbiI7ZnVuY3Rpb24gQ08oZT0iZGFyayIpe2NvbnN0W3Qsbl09cC51c2VTdGF0ZShlKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidmFsLXRoZW1lIik9PT0ibGlnaHQiP24oImxpZ2h0Iik6bG9jYWxTdG9yYWdlLmdldEl0ZW0oInZhbC10aGVtZSIpPT09ImRhcmsifHx3aW5kb3cubWF0Y2hNZWRpYSYmd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykiKS5tYXRjaGVzP24oImRhcmsiKTp3aW5kb3cubWF0Y2hNZWRpYSYmd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIikubWF0Y2hlcyYmbigibGlnaHQiKTtjb25zdCByPW89Pntsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidmFsLXRoZW1lIil8fG4oby5tYXRjaGVzPyJkYXJrIjoibGlnaHQiKX07cmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIikuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixyKSwoKT0+e3dpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIikucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixyKX19LFtdKSxbdCxyPT57bG9jYWxTdG9yYWdlLnNldEl0ZW0oInZhbC10aGVtZSIsciksbihyKX1dfWNvbnN0IGttPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLHR5cGU6dCwuLi5ufSxyKT0+Xy5qc3goImlucHV0Iix7dHlwZTp0LGNsYXNzTmFtZTppdCgiZmxleCBoLTEwIHctZnVsbCByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBweC0zIHB5LTIgdGV4dC1zbSByaW5nLW9mZnNldC1iYWNrZ3JvdW5kIGZpbGU6Ym9yZGVyLTAgZmlsZTpiZy10cmFuc3BhcmVudCBmaWxlOnRleHQtc20gZmlsZTpmb250LW1lZGl1bSBwbGFjZWhvbGRlcjp0ZXh0LW11dGVkLWZvcmVncm91bmQgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC0yIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwIixlKSxyZWY6ciwuLi5ufSkpO2ttLmRpc3BsYXlOYW1lPSJJbnB1dCI7ZnVuY3Rpb24gckUoZSl7Y29uc3QgdD1lKyJDb2xsZWN0aW9uUHJvdmlkZXIiLFtuLHJdPVRpKHQpLFtvLGldPW4odCx7Y29sbGVjdGlvblJlZjp7Y3VycmVudDpudWxsfSxpdGVtTWFwOm5ldyBNYXB9KSxsPWg9Pntjb25zdHtzY29wZTptLGNoaWxkcmVuOmd9PWgsUz1lZS51c2VSZWYobnVsbCksdj1lZS51c2VSZWYobmV3IE1hcCkuY3VycmVudDtyZXR1cm4gZWUuY3JlYXRlRWxlbWVudChvLHtzY29wZTptLGl0ZW1NYXA6dixjb2xsZWN0aW9uUmVmOlN9LGcpfSxzPWUrIkNvbGxlY3Rpb25TbG90IixhPWVlLmZvcndhcmRSZWYoKGgsbSk9Pntjb25zdHtzY29wZTpnLGNoaWxkcmVuOlN9PWgsdj1pKHMsZykseT1RZShtLHYuY29sbGVjdGlvblJlZik7cmV0dXJuIGVlLmNyZWF0ZUVsZW1lbnQoVGwse3JlZjp5fSxTKX0pLHU9ZSsiQ29sbGVjdGlvbkl0ZW1TbG90IixjPSJkYXRhLXJhZGl4LWNvbGxlY3Rpb24taXRlbSIsZD1lZS5mb3J3YXJkUmVmKChoLG0pPT57Y29uc3R7c2NvcGU6ZyxjaGlsZHJlbjpTLC4uLnZ9PWgseT1lZS51c2VSZWYobnVsbCkseD1RZShtLHkpLHc9aSh1LGcpO3JldHVybiBlZS51c2VFZmZlY3QoKCk9Pih3Lml0ZW1NYXAuc2V0KHkse3JlZjp5LC4uLnZ9KSwoKT0+dm9pZCB3Lml0ZW1NYXAuZGVsZXRlKHkpKSksZWUuY3JlYXRlRWxlbWVudChUbCx7W2NdOiIiLHJlZjp4fSxTKX0pO2Z1bmN0aW9uIGYoaCl7Y29uc3QgbT1pKGUrIkNvbGxlY3Rpb25Db25zdW1lciIsaCk7cmV0dXJuIGVlLnVzZUNhbGxiYWNrKCgpPT57Y29uc3QgUz1tLmNvbGxlY3Rpb25SZWYuY3VycmVudDtpZighUylyZXR1cm5bXTtjb25zdCB2PUFycmF5LmZyb20oUy5xdWVyeVNlbGVjdG9yQWxsKGBbJHtjfV1gKSk7cmV0dXJuIEFycmF5LmZyb20obS5pdGVtTWFwLnZhbHVlcygpKS5zb3J0KCh3LGspPT52LmluZGV4T2Yody5yZWYuY3VycmVudCktdi5pbmRleE9mKGsucmVmLmN1cnJlbnQpKX0sW20uY29sbGVjdGlvblJlZixtLml0ZW1NYXBdKX1yZXR1cm5be1Byb3ZpZGVyOmwsU2xvdDphLEl0ZW1TbG90OmR9LGYscl19ZnVuY3Rpb24gJE8oZSx0PWdsb2JhbFRoaXM9PW51bGw/dm9pZCAwOmdsb2JhbFRoaXMuZG9jdW1lbnQpe2NvbnN0IG49S3QoZSk7cC51c2VFZmZlY3QoKCk9Pntjb25zdCByPW89PntvLmtleT09PSJFc2NhcGUiJiZuKG8pfTtyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixyKSwoKT0+dC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixyKX0sW24sdF0pfWNvbnN0IGtwPSJkaXNtaXNzYWJsZUxheWVyLnVwZGF0ZSIsa089ImRpc21pc3NhYmxlTGF5ZXIucG9pbnRlckRvd25PdXRzaWRlIixUTz0iZGlzbWlzc2FibGVMYXllci5mb2N1c091dHNpZGUiO2xldCBwMDtjb25zdCBiTz1wLmNyZWF0ZUNvbnRleHQoe2xheWVyczpuZXcgU2V0LGxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkOm5ldyBTZXQsYnJhbmNoZXM6bmV3IFNldH0pLE5PPXAuZm9yd2FyZFJlZigoZSx0KT0+e3ZhciBuO2NvbnN0e2Rpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50czpyPSExLG9uRXNjYXBlS2V5RG93bjpvLG9uUG9pbnRlckRvd25PdXRzaWRlOmksb25Gb2N1c091dHNpZGU6bCxvbkludGVyYWN0T3V0c2lkZTpzLG9uRGlzbWlzczphLC4uLnV9PWUsYz1wLnVzZUNvbnRleHQoYk8pLFtkLGZdPXAudXNlU3RhdGUobnVsbCksaD0obj1kPT1udWxsP3ZvaWQgMDpkLm93bmVyRG9jdW1lbnQpIT09bnVsbCYmbiE9PXZvaWQgMD9uOmdsb2JhbFRoaXM9PW51bGw/dm9pZCAwOmdsb2JhbFRoaXMuZG9jdW1lbnQsWyxtXT1wLnVzZVN0YXRlKHt9KSxnPVFlKHQsTj0+ZihOKSksUz1BcnJheS5mcm9tKGMubGF5ZXJzKSxbdl09Wy4uLmMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWRdLnNsaWNlKC0xKSx5PVMuaW5kZXhPZih2KSx4PWQ/Uy5pbmRleE9mKGQpOi0xLHc9Yy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5zaXplPjAsaz14Pj15LGI9Uk8oTj0+e2NvbnN0IEQ9Ti50YXJnZXQsTz1bLi4uYy5icmFuY2hlc10uc29tZShqPT5qLmNvbnRhaW5zKEQpKTsha3x8T3x8KGk9PW51bGx8fGkoTikscz09bnVsbHx8cyhOKSxOLmRlZmF1bHRQcmV2ZW50ZWR8fGE9PW51bGx8fGEoKSl9LGgpLFQ9UE8oTj0+e2NvbnN0IEQ9Ti50YXJnZXQ7Wy4uLmMuYnJhbmNoZXNdLnNvbWUoaj0+ai5jb250YWlucyhEKSl8fChsPT1udWxsfHxsKE4pLHM9PW51bGx8fHMoTiksTi5kZWZhdWx0UHJldmVudGVkfHxhPT1udWxsfHxhKCkpfSxoKTtyZXR1cm4gJE8oTj0+e3g9PT1jLmxheWVycy5zaXplLTEmJihvPT1udWxsfHxvKE4pLCFOLmRlZmF1bHRQcmV2ZW50ZWQmJmEmJihOLnByZXZlbnREZWZhdWx0KCksYSgpKSl9LGgpLHAudXNlRWZmZWN0KCgpPT57aWYoZClyZXR1cm4gciYmKGMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZT09PTAmJihwMD1oLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyxoLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIpLGMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuYWRkKGQpKSxjLmxheWVycy5hZGQoZCksZzAoKSwoKT0+e3ImJmMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZT09PTEmJihoLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1wMCl9fSxbZCxoLHIsY10pLHAudXNlRWZmZWN0KCgpPT4oKT0+e2QmJihjLmxheWVycy5kZWxldGUoZCksYy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5kZWxldGUoZCksZzAoKSl9LFtkLGNdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IE49KCk9Pm0oe30pO3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGtwLE4pLCgpPT5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGtwLE4pfSxbXSkscC5jcmVhdGVFbGVtZW50KExlLmRpdix0ZSh7fSx1LHtyZWY6ZyxzdHlsZTp7cG9pbnRlckV2ZW50czp3P2s/ImF1dG8iOiJub25lIjp2b2lkIDAsLi4uZS5zdHlsZX0sb25Gb2N1c0NhcHR1cmU6SGUoZS5vbkZvY3VzQ2FwdHVyZSxULm9uRm9jdXNDYXB0dXJlKSxvbkJsdXJDYXB0dXJlOkhlKGUub25CbHVyQ2FwdHVyZSxULm9uQmx1ckNhcHR1cmUpLG9uUG9pbnRlckRvd25DYXB0dXJlOkhlKGUub25Qb2ludGVyRG93bkNhcHR1cmUsYi5vblBvaW50ZXJEb3duQ2FwdHVyZSl9KSl9KTtmdW5jdGlvbiBSTyhlLHQ9Z2xvYmFsVGhpcz09bnVsbD92b2lkIDA6Z2xvYmFsVGhpcy5kb2N1bWVudCl7Y29uc3Qgbj1LdChlKSxyPXAudXNlUmVmKCExKSxvPXAudXNlUmVmKCgpPT57fSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgaT1zPT57aWYocy50YXJnZXQmJiFyLmN1cnJlbnQpe2xldCBjPWZ1bmN0aW9uKCl7b0Uoa08sbix1LHtkaXNjcmV0ZTohMH0pfTt2YXIgYT1jO2NvbnN0IHU9e29yaWdpbmFsRXZlbnQ6c307cy5wb2ludGVyVHlwZT09PSJ0b3VjaCI/KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLG8uY3VycmVudCksby5jdXJyZW50PWMsdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsby5jdXJyZW50LHtvbmNlOiEwfSkpOmMoKX1lbHNlIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLG8uY3VycmVudCk7ci5jdXJyZW50PSExfSxsPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT57dC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsaSl9LDApO3JldHVybigpPT57d2luZG93LmNsZWFyVGltZW91dChsKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIixpKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixvLmN1cnJlbnQpfX0sW3Qsbl0pLHtvblBvaW50ZXJEb3duQ2FwdHVyZTooKT0+ci5jdXJyZW50PSEwfX1mdW5jdGlvbiBQTyhlLHQ9Z2xvYmFsVGhpcz09bnVsbD92b2lkIDA6Z2xvYmFsVGhpcy5kb2N1bWVudCl7Y29uc3Qgbj1LdChlKSxyPXAudXNlUmVmKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBvPWk9PntpLnRhcmdldCYmIXIuY3VycmVudCYmb0UoVE8sbix7b3JpZ2luYWxFdmVudDppfSx7ZGlzY3JldGU6ITF9KX07cmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsbyksKCk9PnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsbyl9LFt0LG5dKSx7b25Gb2N1c0NhcHR1cmU6KCk9PnIuY3VycmVudD0hMCxvbkJsdXJDYXB0dXJlOigpPT5yLmN1cnJlbnQ9ITF9fWZ1bmN0aW9uIGcwKCl7Y29uc3QgZT1uZXcgQ3VzdG9tRXZlbnQoa3ApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQoZSl9ZnVuY3Rpb24gb0UoZSx0LG4se2Rpc2NyZXRlOnJ9KXtjb25zdCBvPW4ub3JpZ2luYWxFdmVudC50YXJnZXQsaT1uZXcgQ3VzdG9tRXZlbnQoZSx7YnViYmxlczohMSxjYW5jZWxhYmxlOiEwLGRldGFpbDpufSk7dCYmby5hZGRFdmVudExpc3RlbmVyKGUsdCx7b25jZTohMH0pLHI/YWIobyxpKTpvLmRpc3BhdGNoRXZlbnQoaSl9bGV0IGJmPTA7ZnVuY3Rpb24gT08oKXtwLnVzZUVmZmVjdCgoKT0+e3ZhciBlLHQ7Y29uc3Qgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1yYWRpeC1mb2N1cy1ndWFyZF0iKTtyZXR1cm4gZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyYmVnaW4iLChlPW5bMF0pIT09bnVsbCYmZSE9PXZvaWQgMD9lOm0wKCkpLGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLCh0PW5bMV0pIT09bnVsbCYmdCE9PXZvaWQgMD90Om0wKCkpLGJmKyssKCk9PntiZj09PTEmJmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLXJhZGl4LWZvY3VzLWd1YXJkXSIpLmZvckVhY2gocj0+ci5yZW1vdmUoKSksYmYtLX19LFtdKX1mdW5jdGlvbiBtMCgpe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3JldHVybiBlLnNldEF0dHJpYnV0ZSgiZGF0YS1yYWRpeC1mb2N1cy1ndWFyZCIsIiIpLGUudGFiSW5kZXg9MCxlLnN0eWxlLmNzc1RleHQ9Im91dGxpbmU6IG5vbmU7IG9wYWNpdHk6IDA7IHBvc2l0aW9uOiBmaXhlZDsgcG9pbnRlci1ldmVudHM6IG5vbmUiLGV9Y29uc3QgTmY9ImZvY3VzU2NvcGUuYXV0b0ZvY3VzT25Nb3VudCIsUmY9ImZvY3VzU2NvcGUuYXV0b0ZvY3VzT25Vbm1vdW50Iix2MD17YnViYmxlczohMSxjYW5jZWxhYmxlOiEwfSxBTz1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtsb29wOm49ITEsdHJhcHBlZDpyPSExLG9uTW91bnRBdXRvRm9jdXM6byxvblVubW91bnRBdXRvRm9jdXM6aSwuLi5sfT1lLFtzLGFdPXAudXNlU3RhdGUobnVsbCksdT1LdChvKSxjPUt0KGkpLGQ9cC51c2VSZWYobnVsbCksZj1RZSh0LGc9PmEoZykpLGg9cC51c2VSZWYoe3BhdXNlZDohMSxwYXVzZSgpe3RoaXMucGF1c2VkPSEwfSxyZXN1bWUoKXt0aGlzLnBhdXNlZD0hMX19KS5jdXJyZW50O3AudXNlRWZmZWN0KCgpPT57aWYocil7bGV0IHk9ZnVuY3Rpb24oYil7aWYoaC5wYXVzZWR8fCFzKXJldHVybjtjb25zdCBUPWIudGFyZ2V0O3MuY29udGFpbnMoVCk/ZC5jdXJyZW50PVQ6bG8oZC5jdXJyZW50LHtzZWxlY3Q6ITB9KX0seD1mdW5jdGlvbihiKXtpZihoLnBhdXNlZHx8IXMpcmV0dXJuO2NvbnN0IFQ9Yi5yZWxhdGVkVGFyZ2V0O1QhPT1udWxsJiYocy5jb250YWlucyhUKXx8bG8oZC5jdXJyZW50LHtzZWxlY3Q6ITB9KSl9LHc9ZnVuY3Rpb24oYil7aWYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PWRvY3VtZW50LmJvZHkpZm9yKGNvbnN0IE4gb2YgYilOLnJlbW92ZWROb2Rlcy5sZW5ndGg+MCYmbG8ocyl9O3ZhciBnPXksUz14LHY9dztkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmb2N1c2luIix5KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmb2N1c291dCIseCk7Y29uc3Qgaz1uZXcgTXV0YXRpb25PYnNlcnZlcih3KTtyZXR1cm4gcyYmay5vYnNlcnZlKHMse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSksKCk9Pntkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1c2luIix5KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1c291dCIseCksay5kaXNjb25uZWN0KCl9fX0sW3IscyxoLnBhdXNlZF0pLHAudXNlRWZmZWN0KCgpPT57aWYocyl7eDAuYWRkKGgpO2NvbnN0IGc9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZighcy5jb250YWlucyhnKSl7Y29uc3Qgdj1uZXcgQ3VzdG9tRXZlbnQoTmYsdjApO3MuYWRkRXZlbnRMaXN0ZW5lcihOZix1KSxzLmRpc3BhdGNoRXZlbnQodiksdi5kZWZhdWx0UHJldmVudGVkfHwoTU8oek8oaUUocykpLHtzZWxlY3Q6ITB9KSxkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09ZyYmbG8ocykpfXJldHVybigpPT57cy5yZW1vdmVFdmVudExpc3RlbmVyKE5mLHUpLHNldFRpbWVvdXQoKCk9Pntjb25zdCB2PW5ldyBDdXN0b21FdmVudChSZix2MCk7cy5hZGRFdmVudExpc3RlbmVyKFJmLGMpLHMuZGlzcGF0Y2hFdmVudCh2KSx2LmRlZmF1bHRQcmV2ZW50ZWR8fGxvKGc/P2RvY3VtZW50LmJvZHkse3NlbGVjdDohMH0pLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihSZixjKSx4MC5yZW1vdmUoaCl9LDApfX19LFtzLHUsYyxoXSk7Y29uc3QgbT1wLnVzZUNhbGxiYWNrKGc9PntpZighbiYmIXJ8fGgucGF1c2VkKXJldHVybjtjb25zdCBTPWcua2V5PT09IlRhYiImJiFnLmFsdEtleSYmIWcuY3RybEtleSYmIWcubWV0YUtleSx2PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoUyYmdil7Y29uc3QgeT1nLmN1cnJlbnRUYXJnZXQsW3gsd109TE8oeSk7eCYmdz8hZy5zaGlmdEtleSYmdj09PXc/KGcucHJldmVudERlZmF1bHQoKSxuJiZsbyh4LHtzZWxlY3Q6ITB9KSk6Zy5zaGlmdEtleSYmdj09PXgmJihnLnByZXZlbnREZWZhdWx0KCksbiYmbG8odyx7c2VsZWN0OiEwfSkpOnY9PT15JiZnLnByZXZlbnREZWZhdWx0KCl9fSxbbixyLGgucGF1c2VkXSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChMZS5kaXYsdGUoe3RhYkluZGV4Oi0xfSxsLHtyZWY6ZixvbktleURvd246bX0pKX0pO2Z1bmN0aW9uIE1PKGUse3NlbGVjdDp0PSExfT17fSl7Y29uc3Qgbj1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2Zvcihjb25zdCByIG9mIGUpaWYobG8ocix7c2VsZWN0OnR9KSxkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09bilyZXR1cm59ZnVuY3Rpb24gTE8oZSl7Y29uc3QgdD1pRShlKSxuPXkwKHQsZSkscj15MCh0LnJldmVyc2UoKSxlKTtyZXR1cm5bbixyXX1mdW5jdGlvbiBpRShlKXtjb25zdCB0PVtdLG49ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihlLE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULHthY2NlcHROb2RlOnI9Pntjb25zdCBvPXIudGFnTmFtZT09PSJJTlBVVCImJnIudHlwZT09PSJoaWRkZW4iO3JldHVybiByLmRpc2FibGVkfHxyLmhpZGRlbnx8bz9Ob2RlRmlsdGVyLkZJTFRFUl9TS0lQOnIudGFiSW5kZXg+PTA/Tm9kZUZpbHRlci5GSUxURVJfQUNDRVBUOk5vZGVGaWx0ZXIuRklMVEVSX1NLSVB9fSk7Zm9yKDtuLm5leHROb2RlKCk7KXQucHVzaChuLmN1cnJlbnROb2RlKTtyZXR1cm4gdH1mdW5jdGlvbiB5MChlLHQpe2Zvcihjb25zdCBuIG9mIGUpaWYoIURPKG4se3VwVG86dH0pKXJldHVybiBufWZ1bmN0aW9uIERPKGUse3VwVG86dH0pe2lmKGdldENvbXB1dGVkU3R5bGUoZSkudmlzaWJpbGl0eT09PSJoaWRkZW4iKXJldHVybiEwO2Zvcig7ZTspe2lmKHQhPT12b2lkIDAmJmU9PT10KXJldHVybiExO2lmKGdldENvbXB1dGVkU3R5bGUoZSkuZGlzcGxheT09PSJub25lIilyZXR1cm4hMDtlPWUucGFyZW50RWxlbWVudH1yZXR1cm4hMX1mdW5jdGlvbiBJTyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQmJiJzZWxlY3QiaW4gZX1mdW5jdGlvbiBsbyhlLHtzZWxlY3Q6dD0hMX09e30pe2lmKGUmJmUuZm9jdXMpe2NvbnN0IG49ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtlLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSksZSE9PW4mJklPKGUpJiZ0JiZlLnNlbGVjdCgpfX1jb25zdCB4MD1qTygpO2Z1bmN0aW9uIGpPKCl7bGV0IGU9W107cmV0dXJue2FkZCh0KXtjb25zdCBuPWVbMF07dCE9PW4mJihuPT1udWxsfHxuLnBhdXNlKCkpLGU9dzAoZSx0KSxlLnVuc2hpZnQodCl9LHJlbW92ZSh0KXt2YXIgbjtlPXcwKGUsdCksKG49ZVswXSk9PT1udWxsfHxuPT09dm9pZCAwfHxuLnJlc3VtZSgpfX19ZnVuY3Rpb24gdzAoZSx0KXtjb25zdCBuPVsuLi5lXSxyPW4uaW5kZXhPZih0KTtyZXR1cm4gciE9PS0xJiZuLnNwbGljZShyLDEpLG59ZnVuY3Rpb24gek8oZSl7cmV0dXJuIGUuZmlsdGVyKHQ9PnQudGFnTmFtZSE9PSJBIil9Y29uc3QgRk89ZjFbInVzZUlkIi50b1N0cmluZygpXXx8KCgpPT57fSk7bGV0IEJPPTA7ZnVuY3Rpb24gQ2QoZSl7Y29uc3RbdCxuXT1wLnVzZVN0YXRlKEZPKCkpO3JldHVybiBUbigoKT0+e2V8fG4ocj0+cj8/U3RyaW5nKEJPKyspKX0sW2VdKSxlfHwodD9gcmFkaXgtJHt0fWA6IiIpfWNvbnN0IFdPPVsidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0Il0sRG89TWF0aC5taW4sd249TWF0aC5tYXgsamM9TWF0aC5yb3VuZCxfdT1NYXRoLmZsb29yLElvPWU9Pih7eDplLHk6ZX0pLFVPPXtsZWZ0OiJyaWdodCIscmlnaHQ6ImxlZnQiLGJvdHRvbToidG9wIix0b3A6ImJvdHRvbSJ9LFZPPXtzdGFydDoiZW5kIixlbmQ6InN0YXJ0In07ZnVuY3Rpb24gVHAoZSx0LG4pe3JldHVybiB3bihlLERvKHQsbikpfWZ1bmN0aW9uIFVyKGUsdCl7cmV0dXJuIHR5cGVvZiBlPT0iZnVuY3Rpb24iP2UodCk6ZX1mdW5jdGlvbiBWcihlKXtyZXR1cm4gZS5zcGxpdCgiLSIpWzBdfWZ1bmN0aW9uIFpsKGUpe3JldHVybiBlLnNwbGl0KCItIilbMV19ZnVuY3Rpb24gVG0oZSl7cmV0dXJuIGU9PT0ieCI/InkiOiJ4In1mdW5jdGlvbiBibShlKXtyZXR1cm4gZT09PSJ5Ij8iaGVpZ2h0Ijoid2lkdGgifWZ1bmN0aW9uIHFsKGUpe3JldHVyblsidG9wIiwiYm90dG9tIl0uaW5jbHVkZXMoVnIoZSkpPyJ5IjoieCJ9ZnVuY3Rpb24gTm0oZSl7cmV0dXJuIFRtKHFsKGUpKX1mdW5jdGlvbiBITyhlLHQsbil7bj09PXZvaWQgMCYmKG49ITEpO2NvbnN0IHI9WmwoZSksbz1ObShlKSxpPWJtKG8pO2xldCBsPW89PT0ieCI/cj09PShuPyJlbmQiOiJzdGFydCIpPyJyaWdodCI6ImxlZnQiOnI9PT0ic3RhcnQiPyJib3R0b20iOiJ0b3AiO3JldHVybiB0LnJlZmVyZW5jZVtpXT50LmZsb2F0aW5nW2ldJiYobD16YyhsKSksW2wsemMobCldfWZ1bmN0aW9uIEtPKGUpe2NvbnN0IHQ9emMoZSk7cmV0dXJuW2JwKGUpLHQsYnAodCldfWZ1bmN0aW9uIGJwKGUpe3JldHVybiBlLnJlcGxhY2UoL3N0YXJ0fGVuZC9nLHQ9PlZPW3RdKX1mdW5jdGlvbiBHTyhlLHQsbil7Y29uc3Qgcj1bImxlZnQiLCJyaWdodCJdLG89WyJyaWdodCIsImxlZnQiXSxpPVsidG9wIiwiYm90dG9tIl0sbD1bImJvdHRvbSIsInRvcCJdO3N3aXRjaChlKXtjYXNlInRvcCI6Y2FzZSJib3R0b20iOnJldHVybiBuP3Q/bzpyOnQ/cjpvO2Nhc2UibGVmdCI6Y2FzZSJyaWdodCI6cmV0dXJuIHQ/aTpsO2RlZmF1bHQ6cmV0dXJuW119fWZ1bmN0aW9uIFlPKGUsdCxuLHIpe2NvbnN0IG89WmwoZSk7bGV0IGk9R08oVnIoZSksbj09PSJzdGFydCIscik7cmV0dXJuIG8mJihpPWkubWFwKGw9PmwrIi0iK28pLHQmJihpPWkuY29uY2F0KGkubWFwKGJwKSkpKSxpfWZ1bmN0aW9uIHpjKGUpe3JldHVybiBlLnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLHQ9PlVPW3RdKX1mdW5jdGlvbiBYTyhlKXtyZXR1cm57dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjAsLi4uZX19ZnVuY3Rpb24gbEUoZSl7cmV0dXJuIHR5cGVvZiBlIT0ibnVtYmVyIj9YTyhlKTp7dG9wOmUscmlnaHQ6ZSxib3R0b206ZSxsZWZ0OmV9fWZ1bmN0aW9uIEZjKGUpe3JldHVybnsuLi5lLHRvcDplLnksbGVmdDplLngscmlnaHQ6ZS54K2Uud2lkdGgsYm90dG9tOmUueStlLmhlaWdodH19ZnVuY3Rpb24gXzAoZSx0LG4pe2xldHtyZWZlcmVuY2U6cixmbG9hdGluZzpvfT1lO2NvbnN0IGk9cWwodCksbD1ObSh0KSxzPWJtKGwpLGE9VnIodCksdT1pPT09InkiLGM9ci54K3Iud2lkdGgvMi1vLndpZHRoLzIsZD1yLnkrci5oZWlnaHQvMi1vLmhlaWdodC8yLGY9cltzXS8yLW9bc10vMjtsZXQgaDtzd2l0Y2goYSl7Y2FzZSJ0b3AiOmg9e3g6Yyx5OnIueS1vLmhlaWdodH07YnJlYWs7Y2FzZSJib3R0b20iOmg9e3g6Yyx5OnIueStyLmhlaWdodH07YnJlYWs7Y2FzZSJyaWdodCI6aD17eDpyLngrci53aWR0aCx5OmR9O2JyZWFrO2Nhc2UibGVmdCI6aD17eDpyLngtby53aWR0aCx5OmR9O2JyZWFrO2RlZmF1bHQ6aD17eDpyLngseTpyLnl9fXN3aXRjaChabCh0KSl7Y2FzZSJzdGFydCI6aFtsXS09ZioobiYmdT8tMToxKTticmVhaztjYXNlImVuZCI6aFtsXSs9ZioobiYmdT8tMToxKTticmVha31yZXR1cm4gaH1jb25zdCBRTz1hc3luYyhlLHQsbik9Pntjb25zdHtwbGFjZW1lbnQ6cj0iYm90dG9tIixzdHJhdGVneTpvPSJhYnNvbHV0ZSIsbWlkZGxld2FyZTppPVtdLHBsYXRmb3JtOmx9PW4scz1pLmZpbHRlcihCb29sZWFuKSxhPWF3YWl0KGwuaXNSVEw9PW51bGw/dm9pZCAwOmwuaXNSVEwodCkpO2xldCB1PWF3YWl0IGwuZ2V0RWxlbWVudFJlY3RzKHtyZWZlcmVuY2U6ZSxmbG9hdGluZzp0LHN0cmF0ZWd5Om99KSx7eDpjLHk6ZH09XzAodSxyLGEpLGY9cixoPXt9LG09MDtmb3IobGV0IGc9MDtnPHMubGVuZ3RoO2crKyl7Y29uc3R7bmFtZTpTLGZuOnZ9PXNbZ10se3g6eSx5OngsZGF0YTp3LHJlc2V0Omt9PWF3YWl0IHYoe3g6Yyx5OmQsaW5pdGlhbFBsYWNlbWVudDpyLHBsYWNlbWVudDpmLHN0cmF0ZWd5Om8sbWlkZGxld2FyZURhdGE6aCxyZWN0czp1LHBsYXRmb3JtOmwsZWxlbWVudHM6e3JlZmVyZW5jZTplLGZsb2F0aW5nOnR9fSk7aWYoYz15Pz9jLGQ9eD8/ZCxoPXsuLi5oLFtTXTp7Li4uaFtTXSwuLi53fX0sayYmbTw9NTApe20rKyx0eXBlb2Ygaz09Im9iamVjdCImJihrLnBsYWNlbWVudCYmKGY9ay5wbGFjZW1lbnQpLGsucmVjdHMmJih1PWsucmVjdHM9PT0hMD9hd2FpdCBsLmdldEVsZW1lbnRSZWN0cyh7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dCxzdHJhdGVneTpvfSk6ay5yZWN0cykse3g6Yyx5OmR9PV8wKHUsZixhKSksZz0tMTtjb250aW51ZX19cmV0dXJue3g6Yyx5OmQscGxhY2VtZW50OmYsc3RyYXRlZ3k6byxtaWRkbGV3YXJlRGF0YTpofX07YXN5bmMgZnVuY3Rpb24gRWEoZSx0KXt2YXIgbjt0PT09dm9pZCAwJiYodD17fSk7Y29uc3R7eDpyLHk6byxwbGF0Zm9ybTppLHJlY3RzOmwsZWxlbWVudHM6cyxzdHJhdGVneTphfT1lLHtib3VuZGFyeTp1PSJjbGlwcGluZ0FuY2VzdG9ycyIscm9vdEJvdW5kYXJ5OmM9InZpZXdwb3J0IixlbGVtZW50Q29udGV4dDpkPSJmbG9hdGluZyIsYWx0Qm91bmRhcnk6Zj0hMSxwYWRkaW5nOmg9MH09VXIodCxlKSxtPWxFKGgpLFM9c1tmP2Q9PT0iZmxvYXRpbmciPyJyZWZlcmVuY2UiOiJmbG9hdGluZyI6ZF0sdj1GYyhhd2FpdCBpLmdldENsaXBwaW5nUmVjdCh7ZWxlbWVudDoobj1hd2FpdChpLmlzRWxlbWVudD09bnVsbD92b2lkIDA6aS5pc0VsZW1lbnQoUykpKT09bnVsbHx8bj9TOlMuY29udGV4dEVsZW1lbnR8fGF3YWl0KGkuZ2V0RG9jdW1lbnRFbGVtZW50PT1udWxsP3ZvaWQgMDppLmdldERvY3VtZW50RWxlbWVudChzLmZsb2F0aW5nKSksYm91bmRhcnk6dSxyb290Qm91bmRhcnk6YyxzdHJhdGVneTphfSkpLHk9ZD09PSJmbG9hdGluZyI/ey4uLmwuZmxvYXRpbmcseDpyLHk6b306bC5yZWZlcmVuY2UseD1hd2FpdChpLmdldE9mZnNldFBhcmVudD09bnVsbD92b2lkIDA6aS5nZXRPZmZzZXRQYXJlbnQocy5mbG9hdGluZykpLHc9YXdhaXQoaS5pc0VsZW1lbnQ9PW51bGw/dm9pZCAwOmkuaXNFbGVtZW50KHgpKT9hd2FpdChpLmdldFNjYWxlPT1udWxsP3ZvaWQgMDppLmdldFNjYWxlKHgpKXx8e3g6MSx5OjF9Ont4OjEseToxfSxrPUZjKGkuY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3Q/YXdhaXQgaS5jb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdCh7cmVjdDp5LG9mZnNldFBhcmVudDp4LHN0cmF0ZWd5OmF9KTp5KTtyZXR1cm57dG9wOih2LnRvcC1rLnRvcCttLnRvcCkvdy55LGJvdHRvbTooay5ib3R0b20tdi5ib3R0b20rbS5ib3R0b20pL3cueSxsZWZ0Oih2LmxlZnQtay5sZWZ0K20ubGVmdCkvdy54LHJpZ2h0OihrLnJpZ2h0LXYucmlnaHQrbS5yaWdodCkvdy54fX1jb25zdCBTMD1lPT4oe25hbWU6ImFycm93IixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7eDpuLHk6cixwbGFjZW1lbnQ6byxyZWN0czppLHBsYXRmb3JtOmwsZWxlbWVudHM6cyxtaWRkbGV3YXJlRGF0YTphfT10LHtlbGVtZW50OnUscGFkZGluZzpjPTB9PVVyKGUsdCl8fHt9O2lmKHU9PW51bGwpcmV0dXJue307Y29uc3QgZD1sRShjKSxmPXt4Om4seTpyfSxoPU5tKG8pLG09Ym0oaCksZz1hd2FpdCBsLmdldERpbWVuc2lvbnModSksUz1oPT09InkiLHY9Uz8idG9wIjoibGVmdCIseT1TPyJib3R0b20iOiJyaWdodCIseD1TPyJjbGllbnRIZWlnaHQiOiJjbGllbnRXaWR0aCIsdz1pLnJlZmVyZW5jZVttXStpLnJlZmVyZW5jZVtoXS1mW2hdLWkuZmxvYXRpbmdbbV0saz1mW2hdLWkucmVmZXJlbmNlW2hdLGI9YXdhaXQobC5nZXRPZmZzZXRQYXJlbnQ9PW51bGw/dm9pZCAwOmwuZ2V0T2Zmc2V0UGFyZW50KHUpKTtsZXQgVD1iP2JbeF06MDsoIVR8fCFhd2FpdChsLmlzRWxlbWVudD09bnVsbD92b2lkIDA6bC5pc0VsZW1lbnQoYikpKSYmKFQ9cy5mbG9hdGluZ1t4XXx8aS5mbG9hdGluZ1ttXSk7Y29uc3QgTj13LzItay8yLEQ9VC8yLWdbbV0vMi0xLE89RG8oZFt2XSxEKSxqPURvKGRbeV0sRCksQj1PLGFlPVQtZ1ttXS1qLEg9VC8yLWdbbV0vMitOLEc9VHAoQixILGFlKSxDPSFhLmFycm93JiZabChvKSE9bnVsbCYmSCE9RyYmaS5yZWZlcmVuY2VbbV0vMi0oSDxCP086aiktZ1ttXS8yPDAsJD1DP0g8Qj9ILUI6SC1hZTowO3JldHVybntbaF06ZltoXSskLGRhdGE6e1toXTpHLGNlbnRlck9mZnNldDpILUctJCwuLi5DJiZ7YWxpZ25tZW50T2Zmc2V0OiR9fSxyZXNldDpDfX19KSxKTz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJmbGlwIixvcHRpb25zOmUsYXN5bmMgZm4odCl7dmFyIG4scjtjb25zdHtwbGFjZW1lbnQ6byxtaWRkbGV3YXJlRGF0YTppLHJlY3RzOmwsaW5pdGlhbFBsYWNlbWVudDpzLHBsYXRmb3JtOmEsZWxlbWVudHM6dX09dCx7bWFpbkF4aXM6Yz0hMCxjcm9zc0F4aXM6ZD0hMCxmYWxsYmFja1BsYWNlbWVudHM6ZixmYWxsYmFja1N0cmF0ZWd5Omg9ImJlc3RGaXQiLGZhbGxiYWNrQXhpc1NpZGVEaXJlY3Rpb246bT0ibm9uZSIsZmxpcEFsaWdubWVudDpnPSEwLC4uLlN9PVVyKGUsdCk7aWYoKG49aS5hcnJvdykhPW51bGwmJm4uYWxpZ25tZW50T2Zmc2V0KXJldHVybnt9O2NvbnN0IHY9VnIobykseT1WcihzKT09PXMseD1hd2FpdChhLmlzUlRMPT1udWxsP3ZvaWQgMDphLmlzUlRMKHUuZmxvYXRpbmcpKSx3PWZ8fCh5fHwhZz9bemMocyldOktPKHMpKTshZiYmbSE9PSJub25lIiYmdy5wdXNoKC4uLllPKHMsZyxtLHgpKTtjb25zdCBrPVtzLC4uLnddLGI9YXdhaXQgRWEodCxTKSxUPVtdO2xldCBOPSgocj1pLmZsaXApPT1udWxsP3ZvaWQgMDpyLm92ZXJmbG93cyl8fFtdO2lmKGMmJlQucHVzaChiW3ZdKSxkKXtjb25zdCBCPUhPKG8sbCx4KTtULnB1c2goYltCWzBdXSxiW0JbMV1dKX1pZihOPVsuLi5OLHtwbGFjZW1lbnQ6byxvdmVyZmxvd3M6VH1dLCFULmV2ZXJ5KEI9PkI8PTApKXt2YXIgRCxPO2NvbnN0IEI9KCgoRD1pLmZsaXApPT1udWxsP3ZvaWQgMDpELmluZGV4KXx8MCkrMSxhZT1rW0JdO2lmKGFlKXJldHVybntkYXRhOntpbmRleDpCLG92ZXJmbG93czpOfSxyZXNldDp7cGxhY2VtZW50OmFlfX07bGV0IEg9KE89Ti5maWx0ZXIoRz0+Ry5vdmVyZmxvd3NbMF08PTApLnNvcnQoKEcsQyk9Pkcub3ZlcmZsb3dzWzFdLUMub3ZlcmZsb3dzWzFdKVswXSk9PW51bGw/dm9pZCAwOk8ucGxhY2VtZW50O2lmKCFIKXN3aXRjaChoKXtjYXNlImJlc3RGaXQiOnt2YXIgajtjb25zdCBHPShqPU4ubWFwKEM9PltDLnBsYWNlbWVudCxDLm92ZXJmbG93cy5maWx0ZXIoJD0+JD4wKS5yZWR1Y2UoKCQsRSk9PiQrRSwwKV0pLnNvcnQoKEMsJCk9PkNbMV0tJFsxXSlbMF0pPT1udWxsP3ZvaWQgMDpqWzBdO0cmJihIPUcpO2JyZWFrfWNhc2UiaW5pdGlhbFBsYWNlbWVudCI6SD1zO2JyZWFrfWlmKG8hPT1IKXJldHVybntyZXNldDp7cGxhY2VtZW50Okh9fX1yZXR1cm57fX19fTtmdW5jdGlvbiBFMChlLHQpe3JldHVybnt0b3A6ZS50b3AtdC5oZWlnaHQscmlnaHQ6ZS5yaWdodC10LndpZHRoLGJvdHRvbTplLmJvdHRvbS10LmhlaWdodCxsZWZ0OmUubGVmdC10LndpZHRofX1mdW5jdGlvbiBDMChlKXtyZXR1cm4gV08uc29tZSh0PT5lW3RdPj0wKX1jb25zdCBaTz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJoaWRlIixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7cmVjdHM6bn09dCx7c3RyYXRlZ3k6cj0icmVmZXJlbmNlSGlkZGVuIiwuLi5vfT1VcihlLHQpO3N3aXRjaChyKXtjYXNlInJlZmVyZW5jZUhpZGRlbiI6e2NvbnN0IGk9YXdhaXQgRWEodCx7Li4ubyxlbGVtZW50Q29udGV4dDoicmVmZXJlbmNlIn0pLGw9RTAoaSxuLnJlZmVyZW5jZSk7cmV0dXJue2RhdGE6e3JlZmVyZW5jZUhpZGRlbk9mZnNldHM6bCxyZWZlcmVuY2VIaWRkZW46QzAobCl9fX1jYXNlImVzY2FwZWQiOntjb25zdCBpPWF3YWl0IEVhKHQsey4uLm8sYWx0Qm91bmRhcnk6ITB9KSxsPUUwKGksbi5mbG9hdGluZyk7cmV0dXJue2RhdGE6e2VzY2FwZWRPZmZzZXRzOmwsZXNjYXBlZDpDMChsKX19fWRlZmF1bHQ6cmV0dXJue319fX19O2FzeW5jIGZ1bmN0aW9uIHFPKGUsdCl7Y29uc3R7cGxhY2VtZW50Om4scGxhdGZvcm06cixlbGVtZW50czpvfT1lLGk9YXdhaXQoci5pc1JUTD09bnVsbD92b2lkIDA6ci5pc1JUTChvLmZsb2F0aW5nKSksbD1WcihuKSxzPVpsKG4pLGE9cWwobik9PT0ieSIsdT1bImxlZnQiLCJ0b3AiXS5pbmNsdWRlcyhsKT8tMToxLGM9aSYmYT8tMToxLGQ9VXIodCxlKTtsZXR7bWFpbkF4aXM6Zixjcm9zc0F4aXM6aCxhbGlnbm1lbnRBeGlzOm19PXR5cGVvZiBkPT0ibnVtYmVyIj97bWFpbkF4aXM6ZCxjcm9zc0F4aXM6MCxhbGlnbm1lbnRBeGlzOm51bGx9OnttYWluQXhpczowLGNyb3NzQXhpczowLGFsaWdubWVudEF4aXM6bnVsbCwuLi5kfTtyZXR1cm4gcyYmdHlwZW9mIG09PSJudW1iZXIiJiYoaD1zPT09ImVuZCI/bSotMTptKSxhP3t4OmgqYyx5OmYqdX06e3g6Zip1LHk6aCpjfX1jb25zdCBlNT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9MCkse25hbWU6Im9mZnNldCIsb3B0aW9uczplLGFzeW5jIGZuKHQpe2NvbnN0e3g6bix5OnJ9PXQsbz1hd2FpdCBxTyh0LGUpO3JldHVybnt4Om4rby54LHk6citvLnksZGF0YTpvfX19fSx0NT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJzaGlmdCIsb3B0aW9uczplLGFzeW5jIGZuKHQpe2NvbnN0e3g6bix5OnIscGxhY2VtZW50Om99PXQse21haW5BeGlzOmk9ITAsY3Jvc3NBeGlzOmw9ITEsbGltaXRlcjpzPXtmbjpTPT57bGV0e3g6dix5fT1TO3JldHVybnt4OnYseX19fSwuLi5hfT1VcihlLHQpLHU9e3g6bix5OnJ9LGM9YXdhaXQgRWEodCxhKSxkPXFsKFZyKG8pKSxmPVRtKGQpO2xldCBoPXVbZl0sbT11W2RdO2lmKGkpe2NvbnN0IFM9Zj09PSJ5Ij8idG9wIjoibGVmdCIsdj1mPT09InkiPyJib3R0b20iOiJyaWdodCIseT1oK2NbU10seD1oLWNbdl07aD1UcCh5LGgseCl9aWYobCl7Y29uc3QgUz1kPT09InkiPyJ0b3AiOiJsZWZ0Iix2PWQ9PT0ieSI/ImJvdHRvbSI6InJpZ2h0Iix5PW0rY1tTXSx4PW0tY1t2XTttPVRwKHksbSx4KX1jb25zdCBnPXMuZm4oey4uLnQsW2ZdOmgsW2RdOm19KTtyZXR1cm57Li4uZyxkYXRhOnt4OmcueC1uLHk6Zy55LXJ9fX19fSxuNT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtvcHRpb25zOmUsZm4odCl7Y29uc3R7eDpuLHk6cixwbGFjZW1lbnQ6byxyZWN0czppLG1pZGRsZXdhcmVEYXRhOmx9PXQse29mZnNldDpzPTAsbWFpbkF4aXM6YT0hMCxjcm9zc0F4aXM6dT0hMH09VXIoZSx0KSxjPXt4Om4seTpyfSxkPXFsKG8pLGY9VG0oZCk7bGV0IGg9Y1tmXSxtPWNbZF07Y29uc3QgZz1VcihzLHQpLFM9dHlwZW9mIGc9PSJudW1iZXIiP3ttYWluQXhpczpnLGNyb3NzQXhpczowfTp7bWFpbkF4aXM6MCxjcm9zc0F4aXM6MCwuLi5nfTtpZihhKXtjb25zdCB4PWY9PT0ieSI/ImhlaWdodCI6IndpZHRoIix3PWkucmVmZXJlbmNlW2ZdLWkuZmxvYXRpbmdbeF0rUy5tYWluQXhpcyxrPWkucmVmZXJlbmNlW2ZdK2kucmVmZXJlbmNlW3hdLVMubWFpbkF4aXM7aDx3P2g9dzpoPmsmJihoPWspfWlmKHUpe3ZhciB2LHk7Y29uc3QgeD1mPT09InkiPyJ3aWR0aCI6ImhlaWdodCIsdz1bInRvcCIsImxlZnQiXS5pbmNsdWRlcyhWcihvKSksaz1pLnJlZmVyZW5jZVtkXS1pLmZsb2F0aW5nW3hdKyh3JiYoKHY9bC5vZmZzZXQpPT1udWxsP3ZvaWQgMDp2W2RdKXx8MCkrKHc/MDpTLmNyb3NzQXhpcyksYj1pLnJlZmVyZW5jZVtkXStpLnJlZmVyZW5jZVt4XSsodz8wOigoeT1sLm9mZnNldCk9PW51bGw/dm9pZCAwOnlbZF0pfHwwKS0odz9TLmNyb3NzQXhpczowKTttPGs/bT1rOm0+YiYmKG09Yil9cmV0dXJue1tmXTpoLFtkXTptfX19fSxyNT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJzaXplIixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7cGxhY2VtZW50Om4scmVjdHM6cixwbGF0Zm9ybTpvLGVsZW1lbnRzOml9PXQse2FwcGx5Omw9KCk9Pnt9LC4uLnN9PVVyKGUsdCksYT1hd2FpdCBFYSh0LHMpLHU9VnIobiksYz1abChuKSxkPXFsKG4pPT09InkiLHt3aWR0aDpmLGhlaWdodDpofT1yLmZsb2F0aW5nO2xldCBtLGc7dT09PSJ0b3AifHx1PT09ImJvdHRvbSI/KG09dSxnPWM9PT0oYXdhaXQoby5pc1JUTD09bnVsbD92b2lkIDA6by5pc1JUTChpLmZsb2F0aW5nKSk/InN0YXJ0IjoiZW5kIik/ImxlZnQiOiJyaWdodCIpOihnPXUsbT1jPT09ImVuZCI/InRvcCI6ImJvdHRvbSIpO2NvbnN0IFM9aC1hW21dLHY9Zi1hW2ddLHk9IXQubWlkZGxld2FyZURhdGEuc2hpZnQ7bGV0IHg9Uyx3PXY7aWYoZCl7Y29uc3QgYj1mLWEubGVmdC1hLnJpZ2h0O3c9Y3x8eT9Ebyh2LGIpOmJ9ZWxzZXtjb25zdCBiPWgtYS50b3AtYS5ib3R0b207eD1jfHx5P0RvKFMsYik6Yn1pZih5JiYhYyl7Y29uc3QgYj13bihhLmxlZnQsMCksVD13bihhLnJpZ2h0LDApLE49d24oYS50b3AsMCksRD13bihhLmJvdHRvbSwwKTtkP3c9Zi0yKihiIT09MHx8VCE9PTA/YitUOnduKGEubGVmdCxhLnJpZ2h0KSk6eD1oLTIqKE4hPT0wfHxEIT09MD9OK0Q6d24oYS50b3AsYS5ib3R0b20pKX1hd2FpdCBsKHsuLi50LGF2YWlsYWJsZVdpZHRoOncsYXZhaWxhYmxlSGVpZ2h0Onh9KTtjb25zdCBrPWF3YWl0IG8uZ2V0RGltZW5zaW9ucyhpLmZsb2F0aW5nKTtyZXR1cm4gZiE9PWsud2lkdGh8fGghPT1rLmhlaWdodD97cmVzZXQ6e3JlY3RzOiEwfX06e319fX07ZnVuY3Rpb24gam8oZSl7cmV0dXJuIHNFKGUpPyhlLm5vZGVOYW1lfHwiIikudG9Mb3dlckNhc2UoKToiI2RvY3VtZW50In1mdW5jdGlvbiAkbihlKXt2YXIgdDtyZXR1cm4oZT09bnVsbHx8KHQ9ZS5vd25lckRvY3VtZW50KT09bnVsbD92b2lkIDA6dC5kZWZhdWx0Vmlldyl8fHdpbmRvd31mdW5jdGlvbiBacihlKXt2YXIgdDtyZXR1cm4odD0oc0UoZSk/ZS5vd25lckRvY3VtZW50OmUuZG9jdW1lbnQpfHx3aW5kb3cuZG9jdW1lbnQpPT1udWxsP3ZvaWQgMDp0LmRvY3VtZW50RWxlbWVudH1mdW5jdGlvbiBzRShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIE5vZGV8fGUgaW5zdGFuY2VvZiAkbihlKS5Ob2RlfWZ1bmN0aW9uIEhyKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRWxlbWVudHx8ZSBpbnN0YW5jZW9mICRuKGUpLkVsZW1lbnR9ZnVuY3Rpb24gX3IoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudHx8ZSBpbnN0YW5jZW9mICRuKGUpLkhUTUxFbGVtZW50fWZ1bmN0aW9uICQwKGUpe3JldHVybiB0eXBlb2YgU2hhZG93Um9vdD4idSI/ITE6ZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3R8fGUgaW5zdGFuY2VvZiAkbihlKS5TaGFkb3dSb290fWZ1bmN0aW9uIFdhKGUpe2NvbnN0e292ZXJmbG93OnQsb3ZlcmZsb3dYOm4sb3ZlcmZsb3dZOnIsZGlzcGxheTpvfT1VbihlKTtyZXR1cm4vYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW58Y2xpcC8udGVzdCh0K3IrbikmJiFbImlubGluZSIsImNvbnRlbnRzIl0uaW5jbHVkZXMobyl9ZnVuY3Rpb24gbzUoZSl7cmV0dXJuWyJ0YWJsZSIsInRkIiwidGgiXS5pbmNsdWRlcyhqbyhlKSl9ZnVuY3Rpb24gUm0oZSl7Y29uc3QgdD1QbSgpLG49VW4oZSk7cmV0dXJuIG4udHJhbnNmb3JtIT09Im5vbmUifHxuLnBlcnNwZWN0aXZlIT09Im5vbmUifHwobi5jb250YWluZXJUeXBlP24uY29udGFpbmVyVHlwZSE9PSJub3JtYWwiOiExKXx8IXQmJihuLmJhY2tkcm9wRmlsdGVyP24uYmFja2Ryb3BGaWx0ZXIhPT0ibm9uZSI6ITEpfHwhdCYmKG4uZmlsdGVyP24uZmlsdGVyIT09Im5vbmUiOiExKXx8WyJ0cmFuc2Zvcm0iLCJwZXJzcGVjdGl2ZSIsImZpbHRlciJdLnNvbWUocj0+KG4ud2lsbENoYW5nZXx8IiIpLmluY2x1ZGVzKHIpKXx8WyJwYWludCIsImxheW91dCIsInN0cmljdCIsImNvbnRlbnQiXS5zb21lKHI9PihuLmNvbnRhaW58fCIiKS5pbmNsdWRlcyhyKSl9ZnVuY3Rpb24gaTUoZSl7bGV0IHQ9T2woZSk7Zm9yKDtfcih0KSYmISRkKHQpOyl7aWYoUm0odCkpcmV0dXJuIHQ7dD1PbCh0KX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBQbSgpe3JldHVybiB0eXBlb2YgQ1NTPiJ1Inx8IUNTUy5zdXBwb3J0cz8hMTpDU1Muc3VwcG9ydHMoIi13ZWJraXQtYmFja2Ryb3AtZmlsdGVyIiwibm9uZSIpfWZ1bmN0aW9uICRkKGUpe3JldHVyblsiaHRtbCIsImJvZHkiLCIjZG9jdW1lbnQiXS5pbmNsdWRlcyhqbyhlKSl9ZnVuY3Rpb24gVW4oZSl7cmV0dXJuICRuKGUpLmdldENvbXB1dGVkU3R5bGUoZSl9ZnVuY3Rpb24ga2QoZSl7cmV0dXJuIEhyKGUpP3tzY3JvbGxMZWZ0OmUuc2Nyb2xsTGVmdCxzY3JvbGxUb3A6ZS5zY3JvbGxUb3B9OntzY3JvbGxMZWZ0OmUucGFnZVhPZmZzZXQsc2Nyb2xsVG9wOmUucGFnZVlPZmZzZXR9fWZ1bmN0aW9uIE9sKGUpe2lmKGpvKGUpPT09Imh0bWwiKXJldHVybiBlO2NvbnN0IHQ9ZS5hc3NpZ25lZFNsb3R8fGUucGFyZW50Tm9kZXx8JDAoZSkmJmUuaG9zdHx8WnIoZSk7cmV0dXJuICQwKHQpP3QuaG9zdDp0fWZ1bmN0aW9uIGFFKGUpe2NvbnN0IHQ9T2woZSk7cmV0dXJuICRkKHQpP2Uub3duZXJEb2N1bWVudD9lLm93bmVyRG9jdW1lbnQuYm9keTplLmJvZHk6X3IodCkmJldhKHQpP3Q6YUUodCl9ZnVuY3Rpb24gQ2EoZSx0LG4pe3ZhciByO3Q9PT12b2lkIDAmJih0PVtdKSxuPT09dm9pZCAwJiYobj0hMCk7Y29uc3Qgbz1hRShlKSxpPW89PT0oKHI9ZS5vd25lckRvY3VtZW50KT09bnVsbD92b2lkIDA6ci5ib2R5KSxsPSRuKG8pO3JldHVybiBpP3QuY29uY2F0KGwsbC52aXN1YWxWaWV3cG9ydHx8W10sV2Eobyk/bzpbXSxsLmZyYW1lRWxlbWVudCYmbj9DYShsLmZyYW1lRWxlbWVudCk6W10pOnQuY29uY2F0KG8sQ2EobyxbXSxuKSl9ZnVuY3Rpb24gdUUoZSl7Y29uc3QgdD1VbihlKTtsZXQgbj1wYXJzZUZsb2F0KHQud2lkdGgpfHwwLHI9cGFyc2VGbG9hdCh0LmhlaWdodCl8fDA7Y29uc3Qgbz1fcihlKSxpPW8/ZS5vZmZzZXRXaWR0aDpuLGw9bz9lLm9mZnNldEhlaWdodDpyLHM9amMobikhPT1pfHxqYyhyKSE9PWw7cmV0dXJuIHMmJihuPWkscj1sKSx7d2lkdGg6bixoZWlnaHQ6ciwkOnN9fWZ1bmN0aW9uIE9tKGUpe3JldHVybiBIcihlKT9lOmUuY29udGV4dEVsZW1lbnR9ZnVuY3Rpb24gdmwoZSl7Y29uc3QgdD1PbShlKTtpZighX3IodCkpcmV0dXJuIElvKDEpO2NvbnN0IG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7d2lkdGg6cixoZWlnaHQ6bywkOml9PXVFKHQpO2xldCBsPShpP2pjKG4ud2lkdGgpOm4ud2lkdGgpL3Iscz0oaT9qYyhuLmhlaWdodCk6bi5oZWlnaHQpL287cmV0dXJuKCFsfHwhTnVtYmVyLmlzRmluaXRlKGwpKSYmKGw9MSksKCFzfHwhTnVtYmVyLmlzRmluaXRlKHMpKSYmKHM9MSkse3g6bCx5OnN9fWNvbnN0IGw1PUlvKDApO2Z1bmN0aW9uIGNFKGUpe2NvbnN0IHQ9JG4oZSk7cmV0dXJuIVBtKCl8fCF0LnZpc3VhbFZpZXdwb3J0P2w1Ont4OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdCx5OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wfX1mdW5jdGlvbiBzNShlLHQsbil7cmV0dXJuIHQ9PT12b2lkIDAmJih0PSExKSwhbnx8dCYmbiE9PSRuKGUpPyExOnR9ZnVuY3Rpb24geGkoZSx0LG4scil7dD09PXZvaWQgMCYmKHQ9ITEpLG49PT12b2lkIDAmJihuPSExKTtjb25zdCBvPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksaT1PbShlKTtsZXQgbD1JbygxKTt0JiYocj9IcihyKSYmKGw9dmwocikpOmw9dmwoZSkpO2NvbnN0IHM9czUoaSxuLHIpP2NFKGkpOklvKDApO2xldCBhPShvLmxlZnQrcy54KS9sLngsdT0oby50b3Arcy55KS9sLnksYz1vLndpZHRoL2wueCxkPW8uaGVpZ2h0L2wueTtpZihpKXtjb25zdCBmPSRuKGkpLGg9ciYmSHIocik/JG4ocik6cjtsZXQgbT1mLmZyYW1lRWxlbWVudDtmb3IoO20mJnImJmghPT1mOyl7Y29uc3QgZz12bChtKSxTPW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdj1VbihtKSx5PVMubGVmdCsobS5jbGllbnRMZWZ0K3BhcnNlRmxvYXQodi5wYWRkaW5nTGVmdCkpKmcueCx4PVMudG9wKyhtLmNsaWVudFRvcCtwYXJzZUZsb2F0KHYucGFkZGluZ1RvcCkpKmcueTthKj1nLngsdSo9Zy55LGMqPWcueCxkKj1nLnksYSs9eSx1Kz14LG09JG4obSkuZnJhbWVFbGVtZW50fX1yZXR1cm4gRmMoe3dpZHRoOmMsaGVpZ2h0OmQseDphLHk6dX0pfWZ1bmN0aW9uIGE1KGUpe2xldHtyZWN0OnQsb2Zmc2V0UGFyZW50Om4sc3RyYXRlZ3k6cn09ZTtjb25zdCBvPV9yKG4pLGk9WnIobik7aWYobj09PWkpcmV0dXJuIHQ7bGV0IGw9e3Njcm9sbExlZnQ6MCxzY3JvbGxUb3A6MH0scz1JbygxKTtjb25zdCBhPUlvKDApO2lmKChvfHwhbyYmciE9PSJmaXhlZCIpJiYoKGpvKG4pIT09ImJvZHkifHxXYShpKSkmJihsPWtkKG4pKSxfcihuKSkpe2NvbnN0IHU9eGkobik7cz12bChuKSxhLng9dS54K24uY2xpZW50TGVmdCxhLnk9dS55K24uY2xpZW50VG9wfXJldHVybnt3aWR0aDp0LndpZHRoKnMueCxoZWlnaHQ6dC5oZWlnaHQqcy55LHg6dC54KnMueC1sLnNjcm9sbExlZnQqcy54K2EueCx5OnQueSpzLnktbC5zY3JvbGxUb3Aqcy55K2EueX19ZnVuY3Rpb24gdTUoZSl7cmV0dXJuIEFycmF5LmZyb20oZS5nZXRDbGllbnRSZWN0cygpKX1mdW5jdGlvbiBkRShlKXtyZXR1cm4geGkoWnIoZSkpLmxlZnQra2QoZSkuc2Nyb2xsTGVmdH1mdW5jdGlvbiBjNShlKXtjb25zdCB0PVpyKGUpLG49a2QoZSkscj1lLm93bmVyRG9jdW1lbnQuYm9keSxvPXduKHQuc2Nyb2xsV2lkdGgsdC5jbGllbnRXaWR0aCxyLnNjcm9sbFdpZHRoLHIuY2xpZW50V2lkdGgpLGk9d24odC5zY3JvbGxIZWlnaHQsdC5jbGllbnRIZWlnaHQsci5zY3JvbGxIZWlnaHQsci5jbGllbnRIZWlnaHQpO2xldCBsPS1uLnNjcm9sbExlZnQrZEUoZSk7Y29uc3Qgcz0tbi5zY3JvbGxUb3A7cmV0dXJuIFVuKHIpLmRpcmVjdGlvbj09PSJydGwiJiYobCs9d24odC5jbGllbnRXaWR0aCxyLmNsaWVudFdpZHRoKS1vKSx7d2lkdGg6byxoZWlnaHQ6aSx4OmwseTpzfX1mdW5jdGlvbiBkNShlLHQpe2NvbnN0IG49JG4oZSkscj1acihlKSxvPW4udmlzdWFsVmlld3BvcnQ7bGV0IGk9ci5jbGllbnRXaWR0aCxsPXIuY2xpZW50SGVpZ2h0LHM9MCxhPTA7aWYobyl7aT1vLndpZHRoLGw9by5oZWlnaHQ7Y29uc3QgdT1QbSgpOyghdXx8dSYmdD09PSJmaXhlZCIpJiYocz1vLm9mZnNldExlZnQsYT1vLm9mZnNldFRvcCl9cmV0dXJue3dpZHRoOmksaGVpZ2h0OmwseDpzLHk6YX19ZnVuY3Rpb24gZjUoZSx0KXtjb25zdCBuPXhpKGUsITAsdD09PSJmaXhlZCIpLHI9bi50b3ArZS5jbGllbnRUb3Asbz1uLmxlZnQrZS5jbGllbnRMZWZ0LGk9X3IoZSk/dmwoZSk6SW8oMSksbD1lLmNsaWVudFdpZHRoKmkueCxzPWUuY2xpZW50SGVpZ2h0KmkueSxhPW8qaS54LHU9cippLnk7cmV0dXJue3dpZHRoOmwsaGVpZ2h0OnMseDphLHk6dX19ZnVuY3Rpb24gazAoZSx0LG4pe2xldCByO2lmKHQ9PT0idmlld3BvcnQiKXI9ZDUoZSxuKTtlbHNlIGlmKHQ9PT0iZG9jdW1lbnQiKXI9YzUoWnIoZSkpO2Vsc2UgaWYoSHIodCkpcj1mNSh0LG4pO2Vsc2V7Y29uc3Qgbz1jRShlKTtyPXsuLi50LHg6dC54LW8ueCx5OnQueS1vLnl9fXJldHVybiBGYyhyKX1mdW5jdGlvbiBmRShlLHQpe2NvbnN0IG49T2woZSk7cmV0dXJuIG49PT10fHwhSHIobil8fCRkKG4pPyExOlVuKG4pLnBvc2l0aW9uPT09ImZpeGVkInx8ZkUobix0KX1mdW5jdGlvbiBoNShlLHQpe2NvbnN0IG49dC5nZXQoZSk7aWYobilyZXR1cm4gbjtsZXQgcj1DYShlLFtdLCExKS5maWx0ZXIocz0+SHIocykmJmpvKHMpIT09ImJvZHkiKSxvPW51bGw7Y29uc3QgaT1VbihlKS5wb3NpdGlvbj09PSJmaXhlZCI7bGV0IGw9aT9PbChlKTplO2Zvcig7SHIobCkmJiEkZChsKTspe2NvbnN0IHM9VW4obCksYT1SbShsKTshYSYmcy5wb3NpdGlvbj09PSJmaXhlZCImJihvPW51bGwpLChpPyFhJiYhbzohYSYmcy5wb3NpdGlvbj09PSJzdGF0aWMiJiYhIW8mJlsiYWJzb2x1dGUiLCJmaXhlZCJdLmluY2x1ZGVzKG8ucG9zaXRpb24pfHxXYShsKSYmIWEmJmZFKGUsbCkpP3I9ci5maWx0ZXIoYz0+YyE9PWwpOm89cyxsPU9sKGwpfXJldHVybiB0LnNldChlLHIpLHJ9ZnVuY3Rpb24gcDUoZSl7bGV0e2VsZW1lbnQ6dCxib3VuZGFyeTpuLHJvb3RCb3VuZGFyeTpyLHN0cmF0ZWd5Om99PWU7Y29uc3QgbD1bLi4ubj09PSJjbGlwcGluZ0FuY2VzdG9ycyI/aDUodCx0aGlzLl9jKTpbXS5jb25jYXQobikscl0scz1sWzBdLGE9bC5yZWR1Y2UoKHUsYyk9Pntjb25zdCBkPWswKHQsYyxvKTtyZXR1cm4gdS50b3A9d24oZC50b3AsdS50b3ApLHUucmlnaHQ9RG8oZC5yaWdodCx1LnJpZ2h0KSx1LmJvdHRvbT1EbyhkLmJvdHRvbSx1LmJvdHRvbSksdS5sZWZ0PXduKGQubGVmdCx1LmxlZnQpLHV9LGswKHQscyxvKSk7cmV0dXJue3dpZHRoOmEucmlnaHQtYS5sZWZ0LGhlaWdodDphLmJvdHRvbS1hLnRvcCx4OmEubGVmdCx5OmEudG9wfX1mdW5jdGlvbiBnNShlKXtyZXR1cm4gdUUoZSl9ZnVuY3Rpb24gbTUoZSx0LG4pe2NvbnN0IHI9X3IodCksbz1acih0KSxpPW49PT0iZml4ZWQiLGw9eGkoZSwhMCxpLHQpO2xldCBzPXtzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjB9O2NvbnN0IGE9SW8oMCk7aWYocnx8IXImJiFpKWlmKChqbyh0KSE9PSJib2R5Inx8V2EobykpJiYocz1rZCh0KSkscil7Y29uc3QgdT14aSh0LCEwLGksdCk7YS54PXUueCt0LmNsaWVudExlZnQsYS55PXUueSt0LmNsaWVudFRvcH1lbHNlIG8mJihhLng9ZEUobykpO3JldHVybnt4OmwubGVmdCtzLnNjcm9sbExlZnQtYS54LHk6bC50b3Arcy5zY3JvbGxUb3AtYS55LHdpZHRoOmwud2lkdGgsaGVpZ2h0OmwuaGVpZ2h0fX1mdW5jdGlvbiBUMChlLHQpe3JldHVybiFfcihlKXx8VW4oZSkucG9zaXRpb249PT0iZml4ZWQiP251bGw6dD90KGUpOmUub2Zmc2V0UGFyZW50fWZ1bmN0aW9uIGhFKGUsdCl7Y29uc3Qgbj0kbihlKTtpZighX3IoZSkpcmV0dXJuIG47bGV0IHI9VDAoZSx0KTtmb3IoO3ImJm81KHIpJiZVbihyKS5wb3NpdGlvbj09PSJzdGF0aWMiOylyPVQwKHIsdCk7cmV0dXJuIHImJihqbyhyKT09PSJodG1sInx8am8ocik9PT0iYm9keSImJlVuKHIpLnBvc2l0aW9uPT09InN0YXRpYyImJiFSbShyKSk/bjpyfHxpNShlKXx8bn1jb25zdCB2NT1hc3luYyBmdW5jdGlvbihlKXtsZXR7cmVmZXJlbmNlOnQsZmxvYXRpbmc6bixzdHJhdGVneTpyfT1lO2NvbnN0IG89dGhpcy5nZXRPZmZzZXRQYXJlbnR8fGhFLGk9dGhpcy5nZXREaW1lbnNpb25zO3JldHVybntyZWZlcmVuY2U6bTUodCxhd2FpdCBvKG4pLHIpLGZsb2F0aW5nOnt4OjAseTowLC4uLmF3YWl0IGkobil9fX07ZnVuY3Rpb24geTUoZSl7cmV0dXJuIFVuKGUpLmRpcmVjdGlvbj09PSJydGwifWNvbnN0IHg1PXtjb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdDphNSxnZXREb2N1bWVudEVsZW1lbnQ6WnIsZ2V0Q2xpcHBpbmdSZWN0OnA1LGdldE9mZnNldFBhcmVudDpoRSxnZXRFbGVtZW50UmVjdHM6djUsZ2V0Q2xpZW50UmVjdHM6dTUsZ2V0RGltZW5zaW9uczpnNSxnZXRTY2FsZTp2bCxpc0VsZW1lbnQ6SHIsaXNSVEw6eTV9O2Z1bmN0aW9uIHc1KGUsdCl7bGV0IG49bnVsbCxyO2NvbnN0IG89WnIoZSk7ZnVuY3Rpb24gaSgpe2NsZWFyVGltZW91dChyKSxuJiZuLmRpc2Nvbm5lY3QoKSxuPW51bGx9ZnVuY3Rpb24gbChzLGEpe3M9PT12b2lkIDAmJihzPSExKSxhPT09dm9pZCAwJiYoYT0xKSxpKCk7Y29uc3R7bGVmdDp1LHRvcDpjLHdpZHRoOmQsaGVpZ2h0OmZ9PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoc3x8dCgpLCFkfHwhZilyZXR1cm47Y29uc3QgaD1fdShjKSxtPV91KG8uY2xpZW50V2lkdGgtKHUrZCkpLGc9X3Uoby5jbGllbnRIZWlnaHQtKGMrZikpLFM9X3UodSkseT17cm9vdE1hcmdpbjotaCsicHggIistbSsicHggIistZysicHggIistUysicHgiLHRocmVzaG9sZDp3bigwLERvKDEsYSkpfHwxfTtsZXQgeD0hMDtmdW5jdGlvbiB3KGspe2NvbnN0IGI9a1swXS5pbnRlcnNlY3Rpb25SYXRpbztpZihiIT09YSl7aWYoIXgpcmV0dXJuIGwoKTtiP2woITEsYik6cj1zZXRUaW1lb3V0KCgpPT57bCghMSwxZS03KX0sMTAwKX14PSExfXRyeXtuPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcih3LHsuLi55LHJvb3Q6by5vd25lckRvY3VtZW50fSl9Y2F0Y2h7bj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIodyx5KX1uLm9ic2VydmUoZSl9cmV0dXJuIGwoITApLGl9ZnVuY3Rpb24gXzUoZSx0LG4scil7cj09PXZvaWQgMCYmKHI9e30pO2NvbnN0e2FuY2VzdG9yU2Nyb2xsOm89ITAsYW5jZXN0b3JSZXNpemU6aT0hMCxlbGVtZW50UmVzaXplOmw9dHlwZW9mIFJlc2l6ZU9ic2VydmVyPT0iZnVuY3Rpb24iLGxheW91dFNoaWZ0OnM9dHlwZW9mIEludGVyc2VjdGlvbk9ic2VydmVyPT0iZnVuY3Rpb24iLGFuaW1hdGlvbkZyYW1lOmE9ITF9PXIsdT1PbShlKSxjPW98fGk/Wy4uLnU/Q2EodSk6W10sLi4uQ2EodCldOltdO2MuZm9yRWFjaCh2PT57byYmdi5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4se3Bhc3NpdmU6ITB9KSxpJiZ2LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsbil9KTtjb25zdCBkPXUmJnM/dzUodSxuKTpudWxsO2xldCBmPS0xLGg9bnVsbDtsJiYoaD1uZXcgUmVzaXplT2JzZXJ2ZXIodj0+e2xldFt5XT12O3kmJnkudGFyZ2V0PT09dSYmaCYmKGgudW5vYnNlcnZlKHQpLGNhbmNlbEFuaW1hdGlvbkZyYW1lKGYpLGY9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57aCYmaC5vYnNlcnZlKHQpfSkpLG4oKX0pLHUmJiFhJiZoLm9ic2VydmUodSksaC5vYnNlcnZlKHQpKTtsZXQgbSxnPWE/eGkoZSk6bnVsbDthJiZTKCk7ZnVuY3Rpb24gUygpe2NvbnN0IHY9eGkoZSk7ZyYmKHYueCE9PWcueHx8di55IT09Zy55fHx2LndpZHRoIT09Zy53aWR0aHx8di5oZWlnaHQhPT1nLmhlaWdodCkmJm4oKSxnPXYsbT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoUyl9cmV0dXJuIG4oKSwoKT0+e2MuZm9yRWFjaCh2PT57byYmdi5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4pLGkmJnYucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixuKX0pLGQmJmQoKSxoJiZoLmRpc2Nvbm5lY3QoKSxoPW51bGwsYSYmY2FuY2VsQW5pbWF0aW9uRnJhbWUobSl9fWNvbnN0IFM1PShlLHQsbik9Pntjb25zdCByPW5ldyBNYXAsbz17cGxhdGZvcm06eDUsLi4ubn0saT17Li4uby5wbGF0Zm9ybSxfYzpyfTtyZXR1cm4gUU8oZSx0LHsuLi5vLHBsYXRmb3JtOml9KX0sRTU9ZT0+e2Z1bmN0aW9uIHQobil7cmV0dXJue30uaGFzT3duUHJvcGVydHkuY2FsbChuLCJjdXJyZW50Iil9cmV0dXJue25hbWU6ImFycm93IixvcHRpb25zOmUsZm4obil7Y29uc3R7ZWxlbWVudDpyLHBhZGRpbmc6b309dHlwZW9mIGU9PSJmdW5jdGlvbiI/ZShuKTplO3JldHVybiByJiZ0KHIpP3IuY3VycmVudCE9bnVsbD9TMCh7ZWxlbWVudDpyLmN1cnJlbnQscGFkZGluZzpvfSkuZm4obik6e306cj9TMCh7ZWxlbWVudDpyLHBhZGRpbmc6b30pLmZuKG4pOnt9fX19O3ZhciBWdT10eXBlb2YgZG9jdW1lbnQ8InUiP3AudXNlTGF5b3V0RWZmZWN0OnAudXNlRWZmZWN0O2Z1bmN0aW9uIEJjKGUsdCl7aWYoZT09PXQpcmV0dXJuITA7aWYodHlwZW9mIGUhPXR5cGVvZiB0KXJldHVybiExO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iJiZlLnRvU3RyaW5nKCk9PT10LnRvU3RyaW5nKCkpcmV0dXJuITA7bGV0IG4scixvO2lmKGUmJnQmJnR5cGVvZiBlPT0ib2JqZWN0Iil7aWYoQXJyYXkuaXNBcnJheShlKSl7aWYobj1lLmxlbmd0aCxuIT10Lmxlbmd0aClyZXR1cm4hMTtmb3Iocj1uO3ItLSE9PTA7KWlmKCFCYyhlW3JdLHRbcl0pKXJldHVybiExO3JldHVybiEwfWlmKG89T2JqZWN0LmtleXMoZSksbj1vLmxlbmd0aCxuIT09T2JqZWN0LmtleXModCkubGVuZ3RoKXJldHVybiExO2ZvcihyPW47ci0tIT09MDspaWYoIXt9Lmhhc093blByb3BlcnR5LmNhbGwodCxvW3JdKSlyZXR1cm4hMTtmb3Iocj1uO3ItLSE9PTA7KXtjb25zdCBpPW9bcl07aWYoIShpPT09Il9vd25lciImJmUuJCR0eXBlb2YpJiYhQmMoZVtpXSx0W2ldKSlyZXR1cm4hMX1yZXR1cm4hMH1yZXR1cm4gZSE9PWUmJnQhPT10fWZ1bmN0aW9uIHBFKGUpe3JldHVybiB0eXBlb2Ygd2luZG93PiJ1Ij8xOihlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZGV2aWNlUGl4ZWxSYXRpb3x8MX1mdW5jdGlvbiBiMChlLHQpe2NvbnN0IG49cEUoZSk7cmV0dXJuIE1hdGgucm91bmQodCpuKS9ufWZ1bmN0aW9uIE4wKGUpe2NvbnN0IHQ9cC51c2VSZWYoZSk7cmV0dXJuIFZ1KCgpPT57dC5jdXJyZW50PWV9KSx0fWZ1bmN0aW9uIEM1KGUpe2U9PT12b2lkIDAmJihlPXt9KTtjb25zdHtwbGFjZW1lbnQ6dD0iYm90dG9tIixzdHJhdGVneTpuPSJhYnNvbHV0ZSIsbWlkZGxld2FyZTpyPVtdLHBsYXRmb3JtOm8sZWxlbWVudHM6e3JlZmVyZW5jZTppLGZsb2F0aW5nOmx9PXt9LHRyYW5zZm9ybTpzPSEwLHdoaWxlRWxlbWVudHNNb3VudGVkOmEsb3Blbjp1fT1lLFtjLGRdPXAudXNlU3RhdGUoe3g6MCx5OjAsc3RyYXRlZ3k6bixwbGFjZW1lbnQ6dCxtaWRkbGV3YXJlRGF0YTp7fSxpc1Bvc2l0aW9uZWQ6ITF9KSxbZixoXT1wLnVzZVN0YXRlKHIpO0JjKGYscil8fGgocik7Y29uc3RbbSxnXT1wLnVzZVN0YXRlKG51bGwpLFtTLHZdPXAudXNlU3RhdGUobnVsbCkseT1wLnVzZUNhbGxiYWNrKEM9PntDIT1iLmN1cnJlbnQmJihiLmN1cnJlbnQ9QyxnKEMpKX0sW2ddKSx4PXAudXNlQ2FsbGJhY2soQz0+e0MhPT1ULmN1cnJlbnQmJihULmN1cnJlbnQ9Qyx2KEMpKX0sW3ZdKSx3PWl8fG0saz1sfHxTLGI9cC51c2VSZWYobnVsbCksVD1wLnVzZVJlZihudWxsKSxOPXAudXNlUmVmKGMpLEQ9TjAoYSksTz1OMChvKSxqPXAudXNlQ2FsbGJhY2soKCk9PntpZighYi5jdXJyZW50fHwhVC5jdXJyZW50KXJldHVybjtjb25zdCBDPXtwbGFjZW1lbnQ6dCxzdHJhdGVneTpuLG1pZGRsZXdhcmU6Zn07Ty5jdXJyZW50JiYoQy5wbGF0Zm9ybT1PLmN1cnJlbnQpLFM1KGIuY3VycmVudCxULmN1cnJlbnQsQykudGhlbigkPT57Y29uc3QgRT17Li4uJCxpc1Bvc2l0aW9uZWQ6ITB9O0IuY3VycmVudCYmIUJjKE4uY3VycmVudCxFKSYmKE4uY3VycmVudD1FLEdyLmZsdXNoU3luYygoKT0+e2QoRSl9KSl9KX0sW2YsdCxuLE9dKTtWdSgoKT0+e3U9PT0hMSYmTi5jdXJyZW50LmlzUG9zaXRpb25lZCYmKE4uY3VycmVudC5pc1Bvc2l0aW9uZWQ9ITEsZChDPT4oey4uLkMsaXNQb3NpdGlvbmVkOiExfSkpKX0sW3VdKTtjb25zdCBCPXAudXNlUmVmKCExKTtWdSgoKT0+KEIuY3VycmVudD0hMCwoKT0+e0IuY3VycmVudD0hMX0pLFtdKSxWdSgoKT0+e2lmKHcmJihiLmN1cnJlbnQ9dyksayYmKFQuY3VycmVudD1rKSx3JiZrKXtpZihELmN1cnJlbnQpcmV0dXJuIEQuY3VycmVudCh3LGssaik7aigpfX0sW3csayxqLERdKTtjb25zdCBhZT1wLnVzZU1lbW8oKCk9Pih7cmVmZXJlbmNlOmIsZmxvYXRpbmc6VCxzZXRSZWZlcmVuY2U6eSxzZXRGbG9hdGluZzp4fSksW3kseF0pLEg9cC51c2VNZW1vKCgpPT4oe3JlZmVyZW5jZTp3LGZsb2F0aW5nOmt9KSxbdyxrXSksRz1wLnVzZU1lbW8oKCk9Pntjb25zdCBDPXtwb3NpdGlvbjpuLGxlZnQ6MCx0b3A6MH07aWYoIUguZmxvYXRpbmcpcmV0dXJuIEM7Y29uc3QgJD1iMChILmZsb2F0aW5nLGMueCksRT1iMChILmZsb2F0aW5nLGMueSk7cmV0dXJuIHM/ey4uLkMsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoIiskKyJweCwgIitFKyJweCkiLC4uLnBFKEguZmxvYXRpbmcpPj0xLjUmJnt3aWxsQ2hhbmdlOiJ0cmFuc2Zvcm0ifX06e3Bvc2l0aW9uOm4sbGVmdDokLHRvcDpFfX0sW24scyxILmZsb2F0aW5nLGMueCxjLnldKTtyZXR1cm4gcC51c2VNZW1vKCgpPT4oey4uLmMsdXBkYXRlOmoscmVmczphZSxlbGVtZW50czpILGZsb2F0aW5nU3R5bGVzOkd9KSxbYyxqLGFlLEgsR10pfWZ1bmN0aW9uIGdFKGUpe2NvbnN0W3Qsbl09cC51c2VTdGF0ZSh2b2lkIDApO3JldHVybiBUbigoKT0+e2lmKGUpe24oe3dpZHRoOmUub2Zmc2V0V2lkdGgsaGVpZ2h0OmUub2Zmc2V0SGVpZ2h0fSk7Y29uc3Qgcj1uZXcgUmVzaXplT2JzZXJ2ZXIobz0+e2lmKCFBcnJheS5pc0FycmF5KG8pfHwhby5sZW5ndGgpcmV0dXJuO2NvbnN0IGk9b1swXTtsZXQgbCxzO2lmKCJib3JkZXJCb3hTaXplImluIGkpe2NvbnN0IGE9aS5ib3JkZXJCb3hTaXplLHU9QXJyYXkuaXNBcnJheShhKT9hWzBdOmE7bD11LmlubGluZVNpemUscz11LmJsb2NrU2l6ZX1lbHNlIGw9ZS5vZmZzZXRXaWR0aCxzPWUub2Zmc2V0SGVpZ2h0O24oe3dpZHRoOmwsaGVpZ2h0OnN9KX0pO3JldHVybiByLm9ic2VydmUoZSx7Ym94OiJib3JkZXItYm94In0pLCgpPT5yLnVub2JzZXJ2ZShlKX1lbHNlIG4odm9pZCAwKX0sW2VdKSx0fWNvbnN0IG1FPSJQb3BwZXIiLFt2RSx5RV09VGkobUUpLFskNSx4RV09dkUobUUpLGs1PWU9Pntjb25zdHtfX3Njb3BlUG9wcGVyOnQsY2hpbGRyZW46bn09ZSxbcixvXT1wLnVzZVN0YXRlKG51bGwpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoJDUse3Njb3BlOnQsYW5jaG9yOnIsb25BbmNob3JDaGFuZ2U6b30sbil9LFQ1PSJQb3BwZXJBbmNob3IiLGI1PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVQb3BwZXI6bix2aXJ0dWFsUmVmOnIsLi4ub309ZSxpPXhFKFQ1LG4pLGw9cC51c2VSZWYobnVsbCkscz1RZSh0LGwpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2kub25BbmNob3JDaGFuZ2UoKHI9PW51bGw/dm9pZCAwOnIuY3VycmVudCl8fGwuY3VycmVudCl9KSxyP251bGw6cC5jcmVhdGVFbGVtZW50KExlLmRpdix0ZSh7fSxvLHtyZWY6c30pKX0pLHdFPSJQb3BwZXJDb250ZW50IixbTjUsRjRdPXZFKHdFKSxSNT1wLmZvcndhcmRSZWYoKGUsdCk9Pnt2YXIgbixyLG8saSxsLHMsYSx1O2NvbnN0e19fc2NvcGVQb3BwZXI6YyxzaWRlOmQ9ImJvdHRvbSIsc2lkZU9mZnNldDpmPTAsYWxpZ246aD0iY2VudGVyIixhbGlnbk9mZnNldDptPTAsYXJyb3dQYWRkaW5nOmc9MCxhdm9pZENvbGxpc2lvbnM6Uz0hMCxjb2xsaXNpb25Cb3VuZGFyeTp2PVtdLGNvbGxpc2lvblBhZGRpbmc6eT0wLHN0aWNreTp4PSJwYXJ0aWFsIixoaWRlV2hlbkRldGFjaGVkOnc9ITEsdXBkYXRlUG9zaXRpb25TdHJhdGVneTprPSJvcHRpbWl6ZWQiLG9uUGxhY2VkOmIsLi4uVH09ZSxOPXhFKHdFLGMpLFtELE9dPXAudXNlU3RhdGUobnVsbCksaj1RZSh0LHVuPT5PKHVuKSksW0IsYWVdPXAudXNlU3RhdGUobnVsbCksSD1nRShCKSxHPShuPUg9PW51bGw/dm9pZCAwOkgud2lkdGgpIT09bnVsbCYmbiE9PXZvaWQgMD9uOjAsQz0ocj1IPT1udWxsP3ZvaWQgMDpILmhlaWdodCkhPT1udWxsJiZyIT09dm9pZCAwP3I6MCwkPWQrKGghPT0iY2VudGVyIj8iLSIraDoiIiksRT10eXBlb2YgeT09Im51bWJlciI/eTp7dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjAsLi4ueX0sQT1BcnJheS5pc0FycmF5KHYpP3Y6W3ZdLFI9QS5sZW5ndGg+MCx6PXtwYWRkaW5nOkUsYm91bmRhcnk6QS5maWx0ZXIoUDUpLGFsdEJvdW5kYXJ5OlJ9LHtyZWZzOlYsZmxvYXRpbmdTdHlsZXM6aWUscGxhY2VtZW50Om5lLGlzUG9zaXRpb25lZDpDZSxtaWRkbGV3YXJlRGF0YTp3ZX09QzUoe3N0cmF0ZWd5OiJmaXhlZCIscGxhY2VtZW50OiQsd2hpbGVFbGVtZW50c01vdW50ZWQ6KC4uLnVuKT0+XzUoLi4udW4se2FuaW1hdGlvbkZyYW1lOms9PT0iYWx3YXlzIn0pLGVsZW1lbnRzOntyZWZlcmVuY2U6Ti5hbmNob3J9LG1pZGRsZXdhcmU6W2U1KHttYWluQXhpczpmK0MsYWxpZ25tZW50QXhpczptfSksUyYmdDUoe21haW5BeGlzOiEwLGNyb3NzQXhpczohMSxsaW1pdGVyOng9PT0icGFydGlhbCI/bjUoKTp2b2lkIDAsLi4uen0pLFMmJkpPKHsuLi56fSkscjUoey4uLnosYXBwbHk6KHtlbGVtZW50czp1bixyZWN0czpPbixhdmFpbGFibGVXaWR0aDpOZSxhdmFpbGFibGVIZWlnaHQ6aHR9KT0+e2NvbnN0e3dpZHRoOnB0LGhlaWdodDpfdH09T24ucmVmZXJlbmNlLHZuPXVuLmZsb2F0aW5nLnN0eWxlO3ZuLnNldFByb3BlcnR5KCItLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtd2lkdGgiLGAke05lfXB4YCksdm4uc2V0UHJvcGVydHkoIi0tcmFkaXgtcG9wcGVyLWF2YWlsYWJsZS1oZWlnaHQiLGAke2h0fXB4YCksdm4uc2V0UHJvcGVydHkoIi0tcmFkaXgtcG9wcGVyLWFuY2hvci13aWR0aCIsYCR7cHR9cHhgKSx2bi5zZXRQcm9wZXJ0eSgiLS1yYWRpeC1wb3BwZXItYW5jaG9yLWhlaWdodCIsYCR7X3R9cHhgKX19KSxCJiZFNSh7ZWxlbWVudDpCLHBhZGRpbmc6Z30pLE81KHthcnJvd1dpZHRoOkcsYXJyb3dIZWlnaHQ6Q30pLHcmJlpPKHtzdHJhdGVneToicmVmZXJlbmNlSGlkZGVuIiwuLi56fSldfSksW1gsYmVdPV9FKG5lKSxmZT1LdChiKTtUbigoKT0+e0NlJiYoZmU9PW51bGx8fGZlKCkpfSxbQ2UsZmVdKTtjb25zdCBfZT0obz13ZS5hcnJvdyk9PT1udWxsfHxvPT09dm9pZCAwP3ZvaWQgMDpvLngsdmU9KGk9d2UuYXJyb3cpPT09bnVsbHx8aT09PXZvaWQgMD92b2lkIDA6aS55LFRlPSgobD13ZS5hcnJvdyk9PT1udWxsfHxsPT09dm9pZCAwP3ZvaWQgMDpsLmNlbnRlck9mZnNldCkhPT0wLFtCZSxPdF09cC51c2VTdGF0ZSgpO3JldHVybiBUbigoKT0+e0QmJk90KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKEQpLnpJbmRleCl9LFtEXSkscC5jcmVhdGVFbGVtZW50KCJkaXYiLHtyZWY6Vi5zZXRGbG9hdGluZywiZGF0YS1yYWRpeC1wb3BwZXItY29udGVudC13cmFwcGVyIjoiIixzdHlsZTp7Li4uaWUsdHJhbnNmb3JtOkNlP2llLnRyYW5zZm9ybToidHJhbnNsYXRlKDAsIC0yMDAlKSIsbWluV2lkdGg6Im1heC1jb250ZW50Iix6SW5kZXg6QmUsIi0tcmFkaXgtcG9wcGVyLXRyYW5zZm9ybS1vcmlnaW4iOlsocz13ZS50cmFuc2Zvcm1PcmlnaW4pPT09bnVsbHx8cz09PXZvaWQgMD92b2lkIDA6cy54LChhPXdlLnRyYW5zZm9ybU9yaWdpbik9PT1udWxsfHxhPT09dm9pZCAwP3ZvaWQgMDphLnldLmpvaW4oIiAiKX0sZGlyOmUuZGlyfSxwLmNyZWF0ZUVsZW1lbnQoTjUse3Njb3BlOmMscGxhY2VkU2lkZTpYLG9uQXJyb3dDaGFuZ2U6YWUsYXJyb3dYOl9lLGFycm93WTp2ZSxzaG91bGRIaWRlQXJyb3c6VGV9LHAuY3JlYXRlRWxlbWVudChMZS5kaXYsdGUoeyJkYXRhLXNpZGUiOlgsImRhdGEtYWxpZ24iOmJlfSxULHtyZWY6aixzdHlsZTp7Li4uVC5zdHlsZSxhbmltYXRpb246Q2U/dm9pZCAwOiJub25lIixvcGFjaXR5Oih1PXdlLmhpZGUpIT09bnVsbCYmdSE9PXZvaWQgMCYmdS5yZWZlcmVuY2VIaWRkZW4/MDp2b2lkIDB9fSkpKSl9KTtmdW5jdGlvbiBQNShlKXtyZXR1cm4gZSE9PW51bGx9Y29uc3QgTzU9ZT0+KHtuYW1lOiJ0cmFuc2Zvcm1PcmlnaW4iLG9wdGlvbnM6ZSxmbih0KXt2YXIgbixyLG8saSxsO2NvbnN0e3BsYWNlbWVudDpzLHJlY3RzOmEsbWlkZGxld2FyZURhdGE6dX09dCxkPSgobj11LmFycm93KT09PW51bGx8fG49PT12b2lkIDA/dm9pZCAwOm4uY2VudGVyT2Zmc2V0KSE9PTAsZj1kPzA6ZS5hcnJvd1dpZHRoLGg9ZD8wOmUuYXJyb3dIZWlnaHQsW20sZ109X0UocyksUz17c3RhcnQ6IjAlIixjZW50ZXI6IjUwJSIsZW5kOiIxMDAlIn1bZ10sdj0oKHI9KG89dS5hcnJvdyk9PT1udWxsfHxvPT09dm9pZCAwP3ZvaWQgMDpvLngpIT09bnVsbCYmciE9PXZvaWQgMD9yOjApK2YvMix5PSgoaT0obD11LmFycm93KT09PW51bGx8fGw9PT12b2lkIDA/dm9pZCAwOmwueSkhPT1udWxsJiZpIT09dm9pZCAwP2k6MCkraC8yO2xldCB4PSIiLHc9IiI7cmV0dXJuIG09PT0iYm90dG9tIj8oeD1kP1M6YCR7dn1weGAsdz1gJHstaH1weGApOm09PT0idG9wIj8oeD1kP1M6YCR7dn1weGAsdz1gJHthLmZsb2F0aW5nLmhlaWdodCtofXB4YCk6bT09PSJyaWdodCI/KHg9YCR7LWh9cHhgLHc9ZD9TOmAke3l9cHhgKTptPT09ImxlZnQiJiYoeD1gJHthLmZsb2F0aW5nLndpZHRoK2h9cHhgLHc9ZD9TOmAke3l9cHhgKSx7ZGF0YTp7eCx5Ond9fX19KTtmdW5jdGlvbiBfRShlKXtjb25zdFt0LG49ImNlbnRlciJdPWUuc3BsaXQoIi0iKTtyZXR1cm5bdCxuXX1jb25zdCBBNT1rNSxNNT1iNSxMNT1SNSxENT1wLmZvcndhcmRSZWYoKGUsdCk9Pnt2YXIgbjtjb25zdHtjb250YWluZXI6cj1nbG9iYWxUaGlzPT1udWxsfHwobj1nbG9iYWxUaGlzLmRvY3VtZW50KT09PW51bGx8fG49PT12b2lkIDA/dm9pZCAwOm4uYm9keSwuLi5vfT1lO3JldHVybiByP29ULmNyZWF0ZVBvcnRhbChwLmNyZWF0ZUVsZW1lbnQoTGUuZGl2LHRlKHt9LG8se3JlZjp0fSkpLHIpOm51bGx9KTtmdW5jdGlvbiBBbCh7cHJvcDplLGRlZmF1bHRQcm9wOnQsb25DaGFuZ2U6bj0oKT0+e319KXtjb25zdFtyLG9dPUk1KHtkZWZhdWx0UHJvcDp0LG9uQ2hhbmdlOm59KSxpPWUhPT12b2lkIDAsbD1pP2U6cixzPUt0KG4pLGE9cC51c2VDYWxsYmFjayh1PT57aWYoaSl7Y29uc3QgZD10eXBlb2YgdT09ImZ1bmN0aW9uIj91KGUpOnU7ZCE9PWUmJnMoZCl9ZWxzZSBvKHUpfSxbaSxlLG8sc10pO3JldHVybltsLGFdfWZ1bmN0aW9uIEk1KHtkZWZhdWx0UHJvcDplLG9uQ2hhbmdlOnR9KXtjb25zdCBuPXAudXNlU3RhdGUoZSksW3JdPW4sbz1wLnVzZVJlZihyKSxpPUt0KHQpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e28uY3VycmVudCE9PXImJihpKHIpLG8uY3VycmVudD1yKX0sW3IsbyxpXSksbn1mdW5jdGlvbiBTRShlKXtjb25zdCB0PXAudXNlUmVmKHt2YWx1ZTplLHByZXZpb3VzOmV9KTtyZXR1cm4gcC51c2VNZW1vKCgpPT4odC5jdXJyZW50LnZhbHVlIT09ZSYmKHQuY3VycmVudC5wcmV2aW91cz10LmN1cnJlbnQudmFsdWUsdC5jdXJyZW50LnZhbHVlPWUpLHQuY3VycmVudC5wcmV2aW91cyksW2VdKX1jb25zdCBqNT1wLmZvcndhcmRSZWYoKGUsdCk9PnAuY3JlYXRlRWxlbWVudChMZS5zcGFuLHRlKHt9LGUse3JlZjp0LHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGJvcmRlcjowLHdpZHRoOjEsaGVpZ2h0OjEscGFkZGluZzowLG1hcmdpbjotMSxvdmVyZmxvdzoiaGlkZGVuIixjbGlwOiJyZWN0KDAsIDAsIDAsIDApIix3aGl0ZVNwYWNlOiJub3dyYXAiLHdvcmRXcmFwOiJub3JtYWwiLC4uLmUuc3R5bGV9fSkpKTt2YXIgejU9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGRvY3VtZW50PiJ1IilyZXR1cm4gbnVsbDt2YXIgdD1BcnJheS5pc0FycmF5KGUpP2VbMF06ZTtyZXR1cm4gdC5vd25lckRvY3VtZW50LmJvZHl9LEJpPW5ldyBXZWFrTWFwLFN1PW5ldyBXZWFrTWFwLEV1PXt9LFBmPTAsRUU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJihlLmhvc3R8fEVFKGUucGFyZW50Tm9kZSkpfSxGNT1mdW5jdGlvbihlLHQpe3JldHVybiB0Lm1hcChmdW5jdGlvbihuKXtpZihlLmNvbnRhaW5zKG4pKXJldHVybiBuO3ZhciByPUVFKG4pO3JldHVybiByJiZlLmNvbnRhaW5zKHIpP3I6KGNvbnNvbGUuZXJyb3IoImFyaWEtaGlkZGVuIixuLCJpbiBub3QgY29udGFpbmVkIGluc2lkZSIsZSwiLiBEb2luZyBub3RoaW5nIiksbnVsbCl9KS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuISFufSl9LEI1PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPUY1KHQsQXJyYXkuaXNBcnJheShlKT9lOltlXSk7RXVbbl18fChFdVtuXT1uZXcgV2Vha01hcCk7dmFyIGk9RXVbbl0sbD1bXSxzPW5ldyBTZXQsYT1uZXcgU2V0KG8pLHU9ZnVuY3Rpb24oZCl7IWR8fHMuaGFzKGQpfHwocy5hZGQoZCksdShkLnBhcmVudE5vZGUpKX07by5mb3JFYWNoKHUpO3ZhciBjPWZ1bmN0aW9uKGQpeyFkfHxhLmhhcyhkKXx8QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkLmNoaWxkcmVuLGZ1bmN0aW9uKGYpe2lmKHMuaGFzKGYpKWMoZik7ZWxzZXt2YXIgaD1mLmdldEF0dHJpYnV0ZShyKSxtPWghPT1udWxsJiZoIT09ImZhbHNlIixnPShCaS5nZXQoZil8fDApKzEsUz0oaS5nZXQoZil8fDApKzE7Qmkuc2V0KGYsZyksaS5zZXQoZixTKSxsLnB1c2goZiksZz09PTEmJm0mJlN1LnNldChmLCEwKSxTPT09MSYmZi5zZXRBdHRyaWJ1dGUobiwidHJ1ZSIpLG18fGYuc2V0QXR0cmlidXRlKHIsInRydWUiKX19KX07cmV0dXJuIGModCkscy5jbGVhcigpLFBmKyssZnVuY3Rpb24oKXtsLmZvckVhY2goZnVuY3Rpb24oZCl7dmFyIGY9QmkuZ2V0KGQpLTEsaD1pLmdldChkKS0xO0JpLnNldChkLGYpLGkuc2V0KGQsaCksZnx8KFN1LmhhcyhkKXx8ZC5yZW1vdmVBdHRyaWJ1dGUociksU3UuZGVsZXRlKGQpKSxofHxkLnJlbW92ZUF0dHJpYnV0ZShuKX0pLFBmLS0sUGZ8fChCaT1uZXcgV2Vha01hcCxCaT1uZXcgV2Vha01hcCxTdT1uZXcgV2Vha01hcCxFdT17fSl9fSxXNT1mdW5jdGlvbihlLHQsbil7bj09PXZvaWQgMCYmKG49ImRhdGEtYXJpYS1oaWRkZW4iKTt2YXIgcj1BcnJheS5mcm9tKEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pLG89dHx8ejUoZSk7cmV0dXJuIG8/KHIucHVzaC5hcHBseShyLEFycmF5LmZyb20oby5xdWVyeVNlbGVjdG9yQWxsKCJbYXJpYS1saXZlXSIpKSksQjUocixvLG4sImFyaWEtaGlkZGVuIikpOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9fSxmcj1mdW5jdGlvbigpe3JldHVybiBmcj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIG4scj0xLG89YXJndW1lbnRzLmxlbmd0aDtyPG87cisrKXtuPWFyZ3VtZW50c1tyXTtmb3IodmFyIGkgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixpKSYmKHRbaV09bltpXSl9cmV0dXJuIHR9LGZyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07ZnVuY3Rpb24gQ0UoZSx0KXt2YXIgbj17fTtmb3IodmFyIHIgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmdC5pbmRleE9mKHIpPDAmJihuW3JdPWVbcl0pO2lmKGUhPW51bGwmJnR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzPT0iZnVuY3Rpb24iKWZvcih2YXIgbz0wLHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtvPHIubGVuZ3RoO28rKyl0LmluZGV4T2YocltvXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscltvXSkmJihuW3Jbb11dPWVbcltvXV0pO3JldHVybiBufWZ1bmN0aW9uIFU1KGUsdCxuKXtpZihufHxhcmd1bWVudHMubGVuZ3RoPT09Milmb3IodmFyIHI9MCxvPXQubGVuZ3RoLGk7cjxvO3IrKykoaXx8IShyIGluIHQpKSYmKGl8fChpPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQsMCxyKSksaVtyXT10W3JdKTtyZXR1cm4gZS5jb25jYXQoaXx8QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCkpfXZhciBIdT0icmlnaHQtc2Nyb2xsLWJhci1wb3NpdGlvbiIsS3U9IndpZHRoLWJlZm9yZS1zY3JvbGwtYmFyIixWNT0id2l0aC1zY3JvbGwtYmFycy1oaWRkZW4iLEg1PSItLXJlbW92ZWQtYm9keS1zY3JvbGwtYmFyLXNpemUiO2Z1bmN0aW9uIEs1KGUsdCl7cmV0dXJuIHR5cGVvZiBlPT0iZnVuY3Rpb24iP2UodCk6ZSYmKGUuY3VycmVudD10KSxlfWZ1bmN0aW9uIEc1KGUsdCl7dmFyIG49cC51c2VTdGF0ZShmdW5jdGlvbigpe3JldHVybnt2YWx1ZTplLGNhbGxiYWNrOnQsZmFjYWRlOntnZXQgY3VycmVudCgpe3JldHVybiBuLnZhbHVlfSxzZXQgY3VycmVudChyKXt2YXIgbz1uLnZhbHVlO28hPT1yJiYobi52YWx1ZT1yLG4uY2FsbGJhY2socixvKSl9fX19KVswXTtyZXR1cm4gbi5jYWxsYmFjaz10LG4uZmFjYWRlfWZ1bmN0aW9uIFk1KGUsdCl7cmV0dXJuIEc1KHR8fG51bGwsZnVuY3Rpb24obil7cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihyKXtyZXR1cm4gSzUocixuKX0pfSl9ZnVuY3Rpb24gWDUoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gUTUoZSx0KXt0PT09dm9pZCAwJiYodD1YNSk7dmFyIG49W10scj0hMSxvPXtyZWFkOmZ1bmN0aW9uKCl7aWYocil0aHJvdyBuZXcgRXJyb3IoIlNpZGVjYXI6IGNvdWxkIG5vdCBgcmVhZGAgZnJvbSBhbiBgYXNzaWduZWRgIG1lZGl1bS4gYHJlYWRgIGNvdWxkIGJlIHVzZWQgb25seSB3aXRoIGB1c2VNZWRpdW1gLiIpO3JldHVybiBuLmxlbmd0aD9uW24ubGVuZ3RoLTFdOmV9LHVzZU1lZGl1bTpmdW5jdGlvbihpKXt2YXIgbD10KGkscik7cmV0dXJuIG4ucHVzaChsKSxmdW5jdGlvbigpe249bi5maWx0ZXIoZnVuY3Rpb24ocyl7cmV0dXJuIHMhPT1sfSl9fSxhc3NpZ25TeW5jTWVkaXVtOmZ1bmN0aW9uKGkpe2ZvcihyPSEwO24ubGVuZ3RoOyl7dmFyIGw9bjtuPVtdLGwuZm9yRWFjaChpKX1uPXtwdXNoOmZ1bmN0aW9uKHMpe3JldHVybiBpKHMpfSxmaWx0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbn19fSxhc3NpZ25NZWRpdW06ZnVuY3Rpb24oaSl7cj0hMDt2YXIgbD1bXTtpZihuLmxlbmd0aCl7dmFyIHM9bjtuPVtdLHMuZm9yRWFjaChpKSxsPW59dmFyIGE9ZnVuY3Rpb24oKXt2YXIgYz1sO2w9W10sYy5mb3JFYWNoKGkpfSx1PWZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oYSl9O3UoKSxuPXtwdXNoOmZ1bmN0aW9uKGMpe2wucHVzaChjKSx1KCl9LGZpbHRlcjpmdW5jdGlvbihjKXtyZXR1cm4gbD1sLmZpbHRlcihjKSxufX19fTtyZXR1cm4gb31mdW5jdGlvbiBKNShlKXtlPT09dm9pZCAwJiYoZT17fSk7dmFyIHQ9UTUobnVsbCk7cmV0dXJuIHQub3B0aW9ucz1mcih7YXN5bmM6ITAsc3NyOiExfSxlKSx0fXZhciAkRT1mdW5jdGlvbihlKXt2YXIgdD1lLnNpZGVDYXIsbj1DRShlLFsic2lkZUNhciJdKTtpZighdCl0aHJvdyBuZXcgRXJyb3IoIlNpZGVjYXI6IHBsZWFzZSBwcm92aWRlIGBzaWRlQ2FyYCBwcm9wZXJ0eSB0byBpbXBvcnQgdGhlIHJpZ2h0IGNhciIpO3ZhciByPXQucmVhZCgpO2lmKCFyKXRocm93IG5ldyBFcnJvcigiU2lkZWNhciBtZWRpdW0gbm90IGZvdW5kIik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChyLGZyKHt9LG4pKX07JEUuaXNTaWRlQ2FyRXhwb3J0PSEwO2Z1bmN0aW9uIFo1KGUsdCl7cmV0dXJuIGUudXNlTWVkaXVtKHQpLCRFfXZhciBrRT1KNSgpLE9mPWZ1bmN0aW9uKCl7fSxUZD1wLmZvcndhcmRSZWYoZnVuY3Rpb24oZSx0KXt2YXIgbj1wLnVzZVJlZihudWxsKSxyPXAudXNlU3RhdGUoe29uU2Nyb2xsQ2FwdHVyZTpPZixvbldoZWVsQ2FwdHVyZTpPZixvblRvdWNoTW92ZUNhcHR1cmU6T2Z9KSxvPXJbMF0saT1yWzFdLGw9ZS5mb3J3YXJkUHJvcHMscz1lLmNoaWxkcmVuLGE9ZS5jbGFzc05hbWUsdT1lLnJlbW92ZVNjcm9sbEJhcixjPWUuZW5hYmxlZCxkPWUuc2hhcmRzLGY9ZS5zaWRlQ2FyLGg9ZS5ub0lzb2xhdGlvbixtPWUuaW5lcnQsZz1lLmFsbG93UGluY2hab29tLFM9ZS5hcyx2PVM9PT12b2lkIDA/ImRpdiI6Uyx5PUNFKGUsWyJmb3J3YXJkUHJvcHMiLCJjaGlsZHJlbiIsImNsYXNzTmFtZSIsInJlbW92ZVNjcm9sbEJhciIsImVuYWJsZWQiLCJzaGFyZHMiLCJzaWRlQ2FyIiwibm9Jc29sYXRpb24iLCJpbmVydCIsImFsbG93UGluY2hab29tIiwiYXMiXSkseD1mLHc9WTUoW24sdF0pLGs9ZnIoZnIoe30seSksbyk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwsYyYmcC5jcmVhdGVFbGVtZW50KHgse3NpZGVDYXI6a0UscmVtb3ZlU2Nyb2xsQmFyOnUsc2hhcmRzOmQsbm9Jc29sYXRpb246aCxpbmVydDptLHNldENhbGxiYWNrczppLGFsbG93UGluY2hab29tOiEhZyxsb2NrUmVmOm59KSxsP3AuY2xvbmVFbGVtZW50KHAuQ2hpbGRyZW4ub25seShzKSxmcihmcih7fSxrKSx7cmVmOnd9KSk6cC5jcmVhdGVFbGVtZW50KHYsZnIoe30sayx7Y2xhc3NOYW1lOmEscmVmOnd9KSxzKSl9KTtUZC5kZWZhdWx0UHJvcHM9e2VuYWJsZWQ6ITAscmVtb3ZlU2Nyb2xsQmFyOiEwLGluZXJ0OiExfTtUZC5jbGFzc05hbWVzPXtmdWxsV2lkdGg6S3UsemVyb1JpZ2h0Okh1fTt2YXIgUjAscTU9ZnVuY3Rpb24oKXtpZihSMClyZXR1cm4gUjA7aWYodHlwZW9mIF9fd2VicGFja19ub25jZV9fPCJ1IilyZXR1cm4gX193ZWJwYWNrX25vbmNlX199O2Z1bmN0aW9uIGVBKCl7aWYoIWRvY3VtZW50KXJldHVybiBudWxsO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7ZS50eXBlPSJ0ZXh0L2NzcyI7dmFyIHQ9cTUoKTtyZXR1cm4gdCYmZS5zZXRBdHRyaWJ1dGUoIm5vbmNlIix0KSxlfWZ1bmN0aW9uIHRBKGUsdCl7ZS5zdHlsZVNoZWV0P2Uuc3R5bGVTaGVldC5jc3NUZXh0PXQ6ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0KSl9ZnVuY3Rpb24gbkEoZSl7dmFyIHQ9ZG9jdW1lbnQuaGVhZHx8ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTt0LmFwcGVuZENoaWxkKGUpfXZhciByQT1mdW5jdGlvbigpe3ZhciBlPTAsdD1udWxsO3JldHVybnthZGQ6ZnVuY3Rpb24obil7ZT09MCYmKHQ9ZUEoKSkmJih0QSh0LG4pLG5BKHQpKSxlKyt9LHJlbW92ZTpmdW5jdGlvbigpe2UtLSwhZSYmdCYmKHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHQ9bnVsbCl9fX0sb0E9ZnVuY3Rpb24oKXt2YXIgZT1yQSgpO3JldHVybiBmdW5jdGlvbih0LG4pe3AudXNlRWZmZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIGUuYWRkKHQpLGZ1bmN0aW9uKCl7ZS5yZW1vdmUoKX19LFt0JiZuXSl9fSxURT1mdW5jdGlvbigpe3ZhciBlPW9BKCksdD1mdW5jdGlvbihuKXt2YXIgcj1uLnN0eWxlcyxvPW4uZHluYW1pYztyZXR1cm4gZShyLG8pLG51bGx9O3JldHVybiB0fSxpQT17bGVmdDowLHRvcDowLHJpZ2h0OjAsZ2FwOjB9LEFmPWZ1bmN0aW9uKGUpe3JldHVybiBwYXJzZUludChlfHwiIiwxMCl8fDB9LGxBPWZ1bmN0aW9uKGUpe3ZhciB0PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLG49dFtlPT09InBhZGRpbmciPyJwYWRkaW5nTGVmdCI6Im1hcmdpbkxlZnQiXSxyPXRbZT09PSJwYWRkaW5nIj8icGFkZGluZ1RvcCI6Im1hcmdpblRvcCJdLG89dFtlPT09InBhZGRpbmciPyJwYWRkaW5nUmlnaHQiOiJtYXJnaW5SaWdodCJdO3JldHVybltBZihuKSxBZihyKSxBZihvKV19LHNBPWZ1bmN0aW9uKGUpe2lmKGU9PT12b2lkIDAmJihlPSJtYXJnaW4iKSx0eXBlb2Ygd2luZG93PiJ1IilyZXR1cm4gaUE7dmFyIHQ9bEEoZSksbj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgscj13aW5kb3cuaW5uZXJXaWR0aDtyZXR1cm57bGVmdDp0WzBdLHRvcDp0WzFdLHJpZ2h0OnRbMl0sZ2FwOk1hdGgubWF4KDAsci1uK3RbMl0tdFswXSl9fSxhQT1URSgpLHVBPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPWUubGVmdCxpPWUudG9wLGw9ZS5yaWdodCxzPWUuZ2FwO3JldHVybiBuPT09dm9pZCAwJiYobj0ibWFyZ2luIiksYAogIC5gLmNvbmNhdChWNSxgIHsKICAgb3ZlcmZsb3c6IGhpZGRlbiBgKS5jb25jYXQocixgOwogICBwYWRkaW5nLXJpZ2h0OiBgKS5jb25jYXQocywicHggIikuY29uY2F0KHIsYDsKICB9CiAgYm9keSB7CiAgICBvdmVyZmxvdzogaGlkZGVuIGApLmNvbmNhdChyLGA7CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgYCkuY29uY2F0KFt0JiYicG9zaXRpb246IHJlbGF0aXZlICIuY29uY2F0KHIsIjsiKSxuPT09Im1hcmdpbiImJmAKICAgIHBhZGRpbmctbGVmdDogYC5jb25jYXQobyxgcHg7CiAgICBwYWRkaW5nLXRvcDogYCkuY29uY2F0KGksYHB4OwogICAgcGFkZGluZy1yaWdodDogYCkuY29uY2F0KGwsYHB4OwogICAgbWFyZ2luLWxlZnQ6MDsKICAgIG1hcmdpbi10b3A6MDsKICAgIG1hcmdpbi1yaWdodDogYCkuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLGA7CiAgICBgKSxuPT09InBhZGRpbmciJiYicGFkZGluZy1yaWdodDogIi5jb25jYXQocywicHggIikuY29uY2F0KHIsIjsiKV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiIpLGAKICB9CiAgCiAgLmApLmNvbmNhdChIdSxgIHsKICAgIHJpZ2h0OiBgKS5jb25jYXQocywicHggIikuY29uY2F0KHIsYDsKICB9CiAgCiAgLmApLmNvbmNhdChLdSxgIHsKICAgIG1hcmdpbi1yaWdodDogYCkuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLGA7CiAgfQogIAogIC5gKS5jb25jYXQoSHUsIiAuIikuY29uY2F0KEh1LGAgewogICAgcmlnaHQ6IDAgYCkuY29uY2F0KHIsYDsKICB9CiAgCiAgLmApLmNvbmNhdChLdSwiIC4iKS5jb25jYXQoS3UsYCB7CiAgICBtYXJnaW4tcmlnaHQ6IDAgYCkuY29uY2F0KHIsYDsKICB9CiAgCiAgYm9keSB7CiAgICBgKS5jb25jYXQoSDUsIjogIikuY29uY2F0KHMsYHB4OwogIH0KYCl9LGNBPWZ1bmN0aW9uKGUpe3ZhciB0PWUubm9SZWxhdGl2ZSxuPWUubm9JbXBvcnRhbnQscj1lLmdhcE1vZGUsbz1yPT09dm9pZCAwPyJtYXJnaW4iOnIsaT1wLnVzZU1lbW8oZnVuY3Rpb24oKXtyZXR1cm4gc0Eobyl9LFtvXSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChhQSx7c3R5bGVzOnVBKGksIXQsbyxuPyIiOiIhaW1wb3J0YW50Iil9KX0sTnA9ITE7aWYodHlwZW9mIHdpbmRvdzwidSIpdHJ5e3ZhciBDdT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTnA9ITAsITB9fSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLEN1LEN1KSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGVzdCIsQ3UsQ3UpfWNhdGNoe05wPSExfXZhciBXaT1OcD97cGFzc2l2ZTohMX06ITEsZEE9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGFnTmFtZT09PSJURVhUQVJFQSJ9LGJFPWZ1bmN0aW9uKGUsdCl7dmFyIG49d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSk7cmV0dXJuIG5bdF0hPT0iaGlkZGVuIiYmIShuLm92ZXJmbG93WT09PW4ub3ZlcmZsb3dYJiYhZEEoZSkmJm5bdF09PT0idmlzaWJsZSIpfSxmQT1mdW5jdGlvbihlKXtyZXR1cm4gYkUoZSwib3ZlcmZsb3dZIil9LGhBPWZ1bmN0aW9uKGUpe3JldHVybiBiRShlLCJvdmVyZmxvd1giKX0sUDA9ZnVuY3Rpb24oZSx0KXt2YXIgbj10O2Rve3R5cGVvZiBTaGFkb3dSb290PCJ1IiYmbiBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QmJihuPW4uaG9zdCk7dmFyIHI9TkUoZSxuKTtpZihyKXt2YXIgbz1SRShlLG4pLGk9b1sxXSxsPW9bMl07aWYoaT5sKXJldHVybiEwfW49bi5wYXJlbnROb2RlfXdoaWxlKG4mJm4hPT1kb2N1bWVudC5ib2R5KTtyZXR1cm4hMX0scEE9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zY3JvbGxUb3Asbj1lLnNjcm9sbEhlaWdodCxyPWUuY2xpZW50SGVpZ2h0O3JldHVyblt0LG4scl19LGdBPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc2Nyb2xsTGVmdCxuPWUuc2Nyb2xsV2lkdGgscj1lLmNsaWVudFdpZHRoO3JldHVyblt0LG4scl19LE5FPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT0idiI/ZkEodCk6aEEodCl9LFJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT0idiI/cEEodCk6Z0EodCl9LG1BPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT0iaCImJnQ9PT0icnRsIj8tMToxfSx2QT1mdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpPW1BKGUsd2luZG93LmdldENvbXB1dGVkU3R5bGUodCkuZGlyZWN0aW9uKSxsPWkqcixzPW4udGFyZ2V0LGE9dC5jb250YWlucyhzKSx1PSExLGM9bD4wLGQ9MCxmPTA7ZG97dmFyIGg9UkUoZSxzKSxtPWhbMF0sZz1oWzFdLFM9aFsyXSx2PWctUy1pKm07KG18fHYpJiZORShlLHMpJiYoZCs9dixmKz1tKSxzPXMucGFyZW50Tm9kZX13aGlsZSghYSYmcyE9PWRvY3VtZW50LmJvZHl8fGEmJih0LmNvbnRhaW5zKHMpfHx0PT09cykpO3JldHVybihjJiYobyYmZD09PTB8fCFvJiZsPmQpfHwhYyYmKG8mJmY9PT0wfHwhbyYmLWw+ZikpJiYodT0hMCksdX0sJHU9ZnVuY3Rpb24oZSl7cmV0dXJuImNoYW5nZWRUb3VjaGVzImluIGU/W2UuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCxlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFldOlswLDBdfSxPMD1mdW5jdGlvbihlKXtyZXR1cm5bZS5kZWx0YVgsZS5kZWx0YVldfSxBMD1mdW5jdGlvbihlKXtyZXR1cm4gZSYmImN1cnJlbnQiaW4gZT9lLmN1cnJlbnQ6ZX0seUE9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVswXT09PXRbMF0mJmVbMV09PT10WzFdfSx4QT1mdW5jdGlvbihlKXtyZXR1cm5gCiAgLmJsb2NrLWludGVyYWN0aXZpdHktYC5jb25jYXQoZSxgIHtwb2ludGVyLWV2ZW50czogbm9uZTt9CiAgLmFsbG93LWludGVyYWN0aXZpdHktYCkuY29uY2F0KGUsYCB7cG9pbnRlci1ldmVudHM6IGFsbDt9CmApfSx3QT0wLFVpPVtdO2Z1bmN0aW9uIF9BKGUpe3ZhciB0PXAudXNlUmVmKFtdKSxuPXAudXNlUmVmKFswLDBdKSxyPXAudXNlUmVmKCksbz1wLnVzZVN0YXRlKHdBKyspWzBdLGk9cC51c2VTdGF0ZShmdW5jdGlvbigpe3JldHVybiBURSgpfSlbMF0sbD1wLnVzZVJlZihlKTtwLnVzZUVmZmVjdChmdW5jdGlvbigpe2wuY3VycmVudD1lfSxbZV0pLHAudXNlRWZmZWN0KGZ1bmN0aW9uKCl7aWYoZS5pbmVydCl7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJibG9jay1pbnRlcmFjdGl2aXR5LSIuY29uY2F0KG8pKTt2YXIgZz1VNShbZS5sb2NrUmVmLmN1cnJlbnRdLChlLnNoYXJkc3x8W10pLm1hcChBMCksITApLmZpbHRlcihCb29sZWFuKTtyZXR1cm4gZy5mb3JFYWNoKGZ1bmN0aW9uKFMpe3JldHVybiBTLmNsYXNzTGlzdC5hZGQoImFsbG93LWludGVyYWN0aXZpdHktIi5jb25jYXQobykpfSksZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImJsb2NrLWludGVyYWN0aXZpdHktIi5jb25jYXQobykpLGcuZm9yRWFjaChmdW5jdGlvbihTKXtyZXR1cm4gUy5jbGFzc0xpc3QucmVtb3ZlKCJhbGxvdy1pbnRlcmFjdGl2aXR5LSIuY29uY2F0KG8pKX0pfX19LFtlLmluZXJ0LGUubG9ja1JlZi5jdXJyZW50LGUuc2hhcmRzXSk7dmFyIHM9cC51c2VDYWxsYmFjayhmdW5jdGlvbihnLFMpe2lmKCJ0b3VjaGVzImluIGcmJmcudG91Y2hlcy5sZW5ndGg9PT0yKXJldHVybiFsLmN1cnJlbnQuYWxsb3dQaW5jaFpvb207dmFyIHY9JHUoZykseT1uLmN1cnJlbnQseD0iZGVsdGFYImluIGc/Zy5kZWx0YVg6eVswXS12WzBdLHc9ImRlbHRhWSJpbiBnP2cuZGVsdGFZOnlbMV0tdlsxXSxrLGI9Zy50YXJnZXQsVD1NYXRoLmFicyh4KT5NYXRoLmFicyh3KT8iaCI6InYiO2lmKCJ0b3VjaGVzImluIGcmJlQ9PT0iaCImJmIudHlwZT09PSJyYW5nZSIpcmV0dXJuITE7dmFyIE49UDAoVCxiKTtpZighTilyZXR1cm4hMDtpZihOP2s9VDooaz1UPT09InYiPyJoIjoidiIsTj1QMChULGIpKSwhTilyZXR1cm4hMTtpZighci5jdXJyZW50JiYiY2hhbmdlZFRvdWNoZXMiaW4gZyYmKHh8fHcpJiYoci5jdXJyZW50PWspLCFrKXJldHVybiEwO3ZhciBEPXIuY3VycmVudHx8aztyZXR1cm4gdkEoRCxTLGcsRD09PSJoIj94OncsITApfSxbXSksYT1wLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGcpe3ZhciBTPWc7aWYoISghVWkubGVuZ3RofHxVaVtVaS5sZW5ndGgtMV0hPT1pKSl7dmFyIHY9ImRlbHRhWSJpbiBTP08wKFMpOiR1KFMpLHk9dC5jdXJyZW50LmZpbHRlcihmdW5jdGlvbihrKXtyZXR1cm4gay5uYW1lPT09Uy50eXBlJiZrLnRhcmdldD09PVMudGFyZ2V0JiZ5QShrLmRlbHRhLHYpfSlbMF07aWYoeSYmeS5zaG91bGQpe1MuY2FuY2VsYWJsZSYmUy5wcmV2ZW50RGVmYXVsdCgpO3JldHVybn1pZigheSl7dmFyIHg9KGwuY3VycmVudC5zaGFyZHN8fFtdKS5tYXAoQTApLmZpbHRlcihCb29sZWFuKS5maWx0ZXIoZnVuY3Rpb24oayl7cmV0dXJuIGsuY29udGFpbnMoUy50YXJnZXQpfSksdz14Lmxlbmd0aD4wP3MoUyx4WzBdKTohbC5jdXJyZW50Lm5vSXNvbGF0aW9uO3cmJlMuY2FuY2VsYWJsZSYmUy5wcmV2ZW50RGVmYXVsdCgpfX19LFtdKSx1PXAudXNlQ2FsbGJhY2soZnVuY3Rpb24oZyxTLHYseSl7dmFyIHg9e25hbWU6ZyxkZWx0YTpTLHRhcmdldDp2LHNob3VsZDp5fTt0LmN1cnJlbnQucHVzaCh4KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5jdXJyZW50PXQuY3VycmVudC5maWx0ZXIoZnVuY3Rpb24odyl7cmV0dXJuIHchPT14fSl9LDEpfSxbXSksYz1wLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGcpe24uY3VycmVudD0kdShnKSxyLmN1cnJlbnQ9dm9pZCAwfSxbXSksZD1wLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGcpe3UoZy50eXBlLE8wKGcpLGcudGFyZ2V0LHMoZyxlLmxvY2tSZWYuY3VycmVudCkpfSxbXSksZj1wLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGcpe3UoZy50eXBlLCR1KGcpLGcudGFyZ2V0LHMoZyxlLmxvY2tSZWYuY3VycmVudCkpfSxbXSk7cC51c2VFZmZlY3QoZnVuY3Rpb24oKXtyZXR1cm4gVWkucHVzaChpKSxlLnNldENhbGxiYWNrcyh7b25TY3JvbGxDYXB0dXJlOmQsb25XaGVlbENhcHR1cmU6ZCxvblRvdWNoTW92ZUNhcHR1cmU6Zn0pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIixhLFdpKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLGEsV2kpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLGMsV2kpLGZ1bmN0aW9uKCl7VWk9VWkuZmlsdGVyKGZ1bmN0aW9uKGcpe3JldHVybiBnIT09aX0pLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndoZWVsIixhLFdpKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLGEsV2kpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLGMsV2kpfX0sW10pO3ZhciBoPWUucmVtb3ZlU2Nyb2xsQmFyLG09ZS5pbmVydDtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxtP3AuY3JlYXRlRWxlbWVudChpLHtzdHlsZXM6eEEobyl9KTpudWxsLGg/cC5jcmVhdGVFbGVtZW50KGNBLHtnYXBNb2RlOiJtYXJnaW4ifSk6bnVsbCl9Y29uc3QgU0E9WjUoa0UsX0EpO3ZhciBQRT1wLmZvcndhcmRSZWYoZnVuY3Rpb24oZSx0KXtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KFRkLGZyKHt9LGUse3JlZjp0LHNpZGVDYXI6U0F9KSl9KTtQRS5jbGFzc05hbWVzPVRkLmNsYXNzTmFtZXM7Y29uc3QgRUE9UEUsQ0E9WyIgIiwiRW50ZXIiLCJBcnJvd1VwIiwiQXJyb3dEb3duIl0sJEE9WyIgIiwiRW50ZXIiXSxiZD0iU2VsZWN0IixbTmQsQW0sa0FdPXJFKGJkKSxbZXMsQjRdPVRpKGJkLFtrQSx5RV0pLE1tPXlFKCksW1RBLE9pXT1lcyhiZCksW2JBLE5BXT1lcyhiZCksUkE9ZT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6dCxjaGlsZHJlbjpuLG9wZW46cixkZWZhdWx0T3BlbjpvLG9uT3BlbkNoYW5nZTppLHZhbHVlOmwsZGVmYXVsdFZhbHVlOnMsb25WYWx1ZUNoYW5nZTphLGRpcjp1LG5hbWU6YyxhdXRvQ29tcGxldGU6ZCxkaXNhYmxlZDpmLHJlcXVpcmVkOmh9PWUsbT1NbSh0KSxbZyxTXT1wLnVzZVN0YXRlKG51bGwpLFt2LHldPXAudXNlU3RhdGUobnVsbCksW3gsd109cC51c2VTdGF0ZSghMSksaz1JZyh1KSxbYj0hMSxUXT1BbCh7cHJvcDpyLGRlZmF1bHRQcm9wOm8sb25DaGFuZ2U6aX0pLFtOLERdPUFsKHtwcm9wOmwsZGVmYXVsdFByb3A6cyxvbkNoYW5nZTphfSksTz1wLnVzZVJlZihudWxsKSxqPWc/ISFnLmNsb3Nlc3QoImZvcm0iKTohMCxbQixhZV09cC51c2VTdGF0ZShuZXcgU2V0KSxIPUFycmF5LmZyb20oQikubWFwKEc9PkcucHJvcHMudmFsdWUpLmpvaW4oIjsiKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KEE1LG0scC5jcmVhdGVFbGVtZW50KFRBLHtyZXF1aXJlZDpoLHNjb3BlOnQsdHJpZ2dlcjpnLG9uVHJpZ2dlckNoYW5nZTpTLHZhbHVlTm9kZTp2LG9uVmFsdWVOb2RlQ2hhbmdlOnksdmFsdWVOb2RlSGFzQ2hpbGRyZW46eCxvblZhbHVlTm9kZUhhc0NoaWxkcmVuQ2hhbmdlOncsY29udGVudElkOkNkKCksdmFsdWU6TixvblZhbHVlQ2hhbmdlOkQsb3BlbjpiLG9uT3BlbkNoYW5nZTpULGRpcjprLHRyaWdnZXJQb2ludGVyRG93blBvc1JlZjpPLGRpc2FibGVkOmZ9LHAuY3JlYXRlRWxlbWVudChOZC5Qcm92aWRlcix7c2NvcGU6dH0scC5jcmVhdGVFbGVtZW50KGJBLHtzY29wZTplLl9fc2NvcGVTZWxlY3Qsb25OYXRpdmVPcHRpb25BZGQ6cC51c2VDYWxsYmFjayhHPT57YWUoQz0+bmV3IFNldChDKS5hZGQoRykpfSxbXSksb25OYXRpdmVPcHRpb25SZW1vdmU6cC51c2VDYWxsYmFjayhHPT57YWUoQz0+e2NvbnN0ICQ9bmV3IFNldChDKTtyZXR1cm4gJC5kZWxldGUoRyksJH0pfSxbXSl9LG4pKSxqP3AuY3JlYXRlRWxlbWVudChMRSx7a2V5OkgsImFyaWEtaGlkZGVuIjohMCxyZXF1aXJlZDpoLHRhYkluZGV4Oi0xLG5hbWU6YyxhdXRvQ29tcGxldGU6ZCx2YWx1ZTpOLG9uQ2hhbmdlOkc9PkQoRy50YXJnZXQudmFsdWUpLGRpc2FibGVkOmZ9LE49PT12b2lkIDA/cC5jcmVhdGVFbGVtZW50KCJvcHRpb24iLHt2YWx1ZToiIn0pOm51bGwsQXJyYXkuZnJvbShCKSk6bnVsbCkpfSxQQT0iU2VsZWN0VHJpZ2dlciIsT0E9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLGRpc2FibGVkOnI9ITEsLi4ub309ZSxpPU1tKG4pLGw9T2koUEEsbikscz1sLmRpc2FibGVkfHxyLGE9UWUodCxsLm9uVHJpZ2dlckNoYW5nZSksdT1BbShuKSxbYyxkLGZdPURFKG09Pntjb25zdCBnPXUoKS5maWx0ZXIoeT0+IXkuZGlzYWJsZWQpLFM9Zy5maW5kKHk9PnkudmFsdWU9PT1sLnZhbHVlKSx2PUlFKGcsbSxTKTt2IT09dm9pZCAwJiZsLm9uVmFsdWVDaGFuZ2Uodi52YWx1ZSl9KSxoPSgpPT57c3x8KGwub25PcGVuQ2hhbmdlKCEwKSxmKCkpfTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KE01LHRlKHthc0NoaWxkOiEwfSxpKSxwLmNyZWF0ZUVsZW1lbnQoTGUuYnV0dG9uLHRlKHt0eXBlOiJidXR0b24iLHJvbGU6ImNvbWJvYm94IiwiYXJpYS1jb250cm9scyI6bC5jb250ZW50SWQsImFyaWEtZXhwYW5kZWQiOmwub3BlbiwiYXJpYS1yZXF1aXJlZCI6bC5yZXF1aXJlZCwiYXJpYS1hdXRvY29tcGxldGUiOiJub25lIixkaXI6bC5kaXIsImRhdGEtc3RhdGUiOmwub3Blbj8ib3BlbiI6ImNsb3NlZCIsZGlzYWJsZWQ6cywiZGF0YS1kaXNhYmxlZCI6cz8iIjp2b2lkIDAsImRhdGEtcGxhY2Vob2xkZXIiOk1FKGwudmFsdWUpPyIiOnZvaWQgMH0sbyx7cmVmOmEsb25DbGljazpIZShvLm9uQ2xpY2ssbT0+e20uY3VycmVudFRhcmdldC5mb2N1cygpfSksb25Qb2ludGVyRG93bjpIZShvLm9uUG9pbnRlckRvd24sbT0+e2NvbnN0IGc9bS50YXJnZXQ7Zy5oYXNQb2ludGVyQ2FwdHVyZShtLnBvaW50ZXJJZCkmJmcucmVsZWFzZVBvaW50ZXJDYXB0dXJlKG0ucG9pbnRlcklkKSxtLmJ1dHRvbj09PTAmJm0uY3RybEtleT09PSExJiYoaCgpLGwudHJpZ2dlclBvaW50ZXJEb3duUG9zUmVmLmN1cnJlbnQ9e3g6TWF0aC5yb3VuZChtLnBhZ2VYKSx5Ok1hdGgucm91bmQobS5wYWdlWSl9LG0ucHJldmVudERlZmF1bHQoKSl9KSxvbktleURvd246SGUoby5vbktleURvd24sbT0+e2NvbnN0IGc9Yy5jdXJyZW50IT09IiI7IShtLmN0cmxLZXl8fG0uYWx0S2V5fHxtLm1ldGFLZXkpJiZtLmtleS5sZW5ndGg9PT0xJiZkKG0ua2V5KSwhKGcmJm0ua2V5PT09IiAiKSYmQ0EuaW5jbHVkZXMobS5rZXkpJiYoaCgpLG0ucHJldmVudERlZmF1bHQoKSl9KX0pKSl9KSxBQT0iU2VsZWN0VmFsdWUiLE1BPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixjbGFzc05hbWU6cixzdHlsZTpvLGNoaWxkcmVuOmkscGxhY2Vob2xkZXI6bD0iIiwuLi5zfT1lLGE9T2koQUEsbikse29uVmFsdWVOb2RlSGFzQ2hpbGRyZW5DaGFuZ2U6dX09YSxjPWkhPT12b2lkIDAsZD1RZSh0LGEub25WYWx1ZU5vZGVDaGFuZ2UpO3JldHVybiBUbigoKT0+e3UoYyl9LFt1LGNdKSxwLmNyZWF0ZUVsZW1lbnQoTGUuc3Bhbix0ZSh7fSxzLHtyZWY6ZCxzdHlsZTp7cG9pbnRlckV2ZW50czoibm9uZSJ9fSksTUUoYS52YWx1ZSk/cC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxsKTppKX0pLExBPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixjaGlsZHJlbjpyLC4uLm99PWU7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChMZS5zcGFuLHRlKHsiYXJpYS1oaWRkZW4iOiEwfSxvLHtyZWY6dH0pLHJ8fCLilrwiKX0pLERBPWU9PnAuY3JlYXRlRWxlbWVudChENSx0ZSh7YXNDaGlsZDohMH0sZSkpLE1sPSJTZWxlY3RDb250ZW50IixJQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdCBuPU9pKE1sLGUuX19zY29wZVNlbGVjdCksW3Isb109cC51c2VTdGF0ZSgpO2lmKFRuKCgpPT57byhuZXcgRG9jdW1lbnRGcmFnbWVudCl9LFtdKSwhbi5vcGVuKXtjb25zdCBpPXI7cmV0dXJuIGk/R3IuY3JlYXRlUG9ydGFsKHAuY3JlYXRlRWxlbWVudChPRSx7c2NvcGU6ZS5fX3Njb3BlU2VsZWN0fSxwLmNyZWF0ZUVsZW1lbnQoTmQuU2xvdCx7c2NvcGU6ZS5fX3Njb3BlU2VsZWN0fSxwLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxlLmNoaWxkcmVuKSkpLGkpOm51bGx9cmV0dXJuIHAuY3JlYXRlRWxlbWVudChqQSx0ZSh7fSxlLHtyZWY6dH0pKX0pLE9yPTEwLFtPRSxSZF09ZXMoTWwpLGpBPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixwb3NpdGlvbjpyPSJpdGVtLWFsaWduZWQiLG9uQ2xvc2VBdXRvRm9jdXM6byxvbkVzY2FwZUtleURvd246aSxvblBvaW50ZXJEb3duT3V0c2lkZTpsLHNpZGU6cyxzaWRlT2Zmc2V0OmEsYWxpZ246dSxhbGlnbk9mZnNldDpjLGFycm93UGFkZGluZzpkLGNvbGxpc2lvbkJvdW5kYXJ5OmYsY29sbGlzaW9uUGFkZGluZzpoLHN0aWNreTptLGhpZGVXaGVuRGV0YWNoZWQ6Zyxhdm9pZENvbGxpc2lvbnM6UywuLi52fT1lLHk9T2koTWwsbiksW3gsd109cC51c2VTdGF0ZShudWxsKSxbayxiXT1wLnVzZVN0YXRlKG51bGwpLFQ9UWUodCxYPT53KFgpKSxbTixEXT1wLnVzZVN0YXRlKG51bGwpLFtPLGpdPXAudXNlU3RhdGUobnVsbCksQj1BbShuKSxbYWUsSF09cC51c2VTdGF0ZSghMSksRz1wLnVzZVJlZighMSk7cC51c2VFZmZlY3QoKCk9PntpZih4KXJldHVybiBXNSh4KX0sW3hdKSxPTygpO2NvbnN0IEM9cC51c2VDYWxsYmFjayhYPT57Y29uc3RbYmUsLi4uZmVdPUIoKS5tYXAoVGU9PlRlLnJlZi5jdXJyZW50KSxbX2VdPWZlLnNsaWNlKC0xKSx2ZT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2Zvcihjb25zdCBUZSBvZiBYKWlmKFRlPT09dmV8fChUZT09bnVsbHx8VGUuc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJuZWFyZXN0In0pLFRlPT09YmUmJmsmJihrLnNjcm9sbFRvcD0wKSxUZT09PV9lJiZrJiYoay5zY3JvbGxUb3A9ay5zY3JvbGxIZWlnaHQpLFRlPT1udWxsfHxUZS5mb2N1cygpLGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQhPT12ZSkpcmV0dXJufSxbQixrXSksJD1wLnVzZUNhbGxiYWNrKCgpPT5DKFtOLHhdKSxbQyxOLHhdKTtwLnVzZUVmZmVjdCgoKT0+e2FlJiYkKCl9LFthZSwkXSk7Y29uc3R7b25PcGVuQ2hhbmdlOkUsdHJpZ2dlclBvaW50ZXJEb3duUG9zUmVmOkF9PXk7cC51c2VFZmZlY3QoKCk9PntpZih4KXtsZXQgWD17eDowLHk6MH07Y29uc3QgYmU9X2U9Pnt2YXIgdmUsVGUsQmUsT3Q7WD17eDpNYXRoLmFicyhNYXRoLnJvdW5kKF9lLnBhZ2VYKS0oKHZlPShUZT1BLmN1cnJlbnQpPT09bnVsbHx8VGU9PT12b2lkIDA/dm9pZCAwOlRlLngpIT09bnVsbCYmdmUhPT12b2lkIDA/dmU6MCkpLHk6TWF0aC5hYnMoTWF0aC5yb3VuZChfZS5wYWdlWSktKChCZT0oT3Q9QS5jdXJyZW50KT09PW51bGx8fE90PT09dm9pZCAwP3ZvaWQgMDpPdC55KSE9PW51bGwmJkJlIT09dm9pZCAwP0JlOjApKX19LGZlPV9lPT57WC54PD0xMCYmWC55PD0xMD9fZS5wcmV2ZW50RGVmYXVsdCgpOnguY29udGFpbnMoX2UudGFyZ2V0KXx8RSghMSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLGJlKSxBLmN1cnJlbnQ9bnVsbH07cmV0dXJuIEEuY3VycmVudCE9PW51bGwmJihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsYmUpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsZmUse2NhcHR1cmU6ITAsb25jZTohMH0pKSwoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIixiZSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIixmZSx7Y2FwdHVyZTohMH0pfX19LFt4LEUsQV0pLHAudXNlRWZmZWN0KCgpPT57Y29uc3QgWD0oKT0+RSghMSk7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJibHVyIixYKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixYKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJibHVyIixYKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixYKX19LFtFXSk7Y29uc3RbUix6XT1ERShYPT57Y29uc3QgYmU9QigpLmZpbHRlcih2ZT0+IXZlLmRpc2FibGVkKSxmZT1iZS5maW5kKHZlPT52ZS5yZWYuY3VycmVudD09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLF9lPUlFKGJlLFgsZmUpO19lJiZzZXRUaW1lb3V0KCgpPT5fZS5yZWYuY3VycmVudC5mb2N1cygpKX0pLFY9cC51c2VDYWxsYmFjaygoWCxiZSxmZSk9Pntjb25zdCBfZT0hRy5jdXJyZW50JiYhZmU7KHkudmFsdWUhPT12b2lkIDAmJnkudmFsdWU9PT1iZXx8X2UpJiYoRChYKSxfZSYmKEcuY3VycmVudD0hMCkpfSxbeS52YWx1ZV0pLGllPXAudXNlQ2FsbGJhY2soKCk9Png9PW51bGw/dm9pZCAwOnguZm9jdXMoKSxbeF0pLG5lPXAudXNlQ2FsbGJhY2soKFgsYmUsZmUpPT57Y29uc3QgX2U9IUcuY3VycmVudCYmIWZlOyh5LnZhbHVlIT09dm9pZCAwJiZ5LnZhbHVlPT09YmV8fF9lKSYmaihYKX0sW3kudmFsdWVdKSxDZT1yPT09InBvcHBlciI/TTA6ekEsd2U9Q2U9PT1NMD97c2lkZTpzLHNpZGVPZmZzZXQ6YSxhbGlnbjp1LGFsaWduT2Zmc2V0OmMsYXJyb3dQYWRkaW5nOmQsY29sbGlzaW9uQm91bmRhcnk6Zixjb2xsaXNpb25QYWRkaW5nOmgsc3RpY2t5Om0saGlkZVdoZW5EZXRhY2hlZDpnLGF2b2lkQ29sbGlzaW9uczpTfTp7fTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KE9FLHtzY29wZTpuLGNvbnRlbnQ6eCx2aWV3cG9ydDprLG9uVmlld3BvcnRDaGFuZ2U6YixpdGVtUmVmQ2FsbGJhY2s6VixzZWxlY3RlZEl0ZW06Tixvbkl0ZW1MZWF2ZTppZSxpdGVtVGV4dFJlZkNhbGxiYWNrOm5lLGZvY3VzU2VsZWN0ZWRJdGVtOiQsc2VsZWN0ZWRJdGVtVGV4dDpPLHBvc2l0aW9uOnIsaXNQb3NpdGlvbmVkOmFlLHNlYXJjaFJlZjpSfSxwLmNyZWF0ZUVsZW1lbnQoRUEse2FzOlRsLGFsbG93UGluY2hab29tOiEwfSxwLmNyZWF0ZUVsZW1lbnQoQU8se2FzQ2hpbGQ6ITAsdHJhcHBlZDp5Lm9wZW4sb25Nb3VudEF1dG9Gb2N1czpYPT57WC5wcmV2ZW50RGVmYXVsdCgpfSxvblVubW91bnRBdXRvRm9jdXM6SGUobyxYPT57dmFyIGJlOyhiZT15LnRyaWdnZXIpPT09bnVsbHx8YmU9PT12b2lkIDB8fGJlLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSksWC5wcmV2ZW50RGVmYXVsdCgpfSl9LHAuY3JlYXRlRWxlbWVudChOTyx7YXNDaGlsZDohMCxkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHM6ITAsb25Fc2NhcGVLZXlEb3duOmksb25Qb2ludGVyRG93bk91dHNpZGU6bCxvbkZvY3VzT3V0c2lkZTpYPT5YLnByZXZlbnREZWZhdWx0KCksb25EaXNtaXNzOigpPT55Lm9uT3BlbkNoYW5nZSghMSl9LHAuY3JlYXRlRWxlbWVudChDZSx0ZSh7cm9sZToibGlzdGJveCIsaWQ6eS5jb250ZW50SWQsImRhdGEtc3RhdGUiOnkub3Blbj8ib3BlbiI6ImNsb3NlZCIsZGlyOnkuZGlyLG9uQ29udGV4dE1lbnU6WD0+WC5wcmV2ZW50RGVmYXVsdCgpfSx2LHdlLHtvblBsYWNlZDooKT0+SCghMCkscmVmOlQsc3R5bGU6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246ImNvbHVtbiIsb3V0bGluZToibm9uZSIsLi4udi5zdHlsZX0sb25LZXlEb3duOkhlKHYub25LZXlEb3duLFg9Pntjb25zdCBiZT1YLmN0cmxLZXl8fFguYWx0S2V5fHxYLm1ldGFLZXk7aWYoWC5rZXk9PT0iVGFiIiYmWC5wcmV2ZW50RGVmYXVsdCgpLCFiZSYmWC5rZXkubGVuZ3RoPT09MSYmeihYLmtleSksWyJBcnJvd1VwIiwiQXJyb3dEb3duIiwiSG9tZSIsIkVuZCJdLmluY2x1ZGVzKFgua2V5KSl7bGV0IF9lPUIoKS5maWx0ZXIodmU9PiF2ZS5kaXNhYmxlZCkubWFwKHZlPT52ZS5yZWYuY3VycmVudCk7aWYoWyJBcnJvd1VwIiwiRW5kIl0uaW5jbHVkZXMoWC5rZXkpJiYoX2U9X2Uuc2xpY2UoKS5yZXZlcnNlKCkpLFsiQXJyb3dVcCIsIkFycm93RG93biJdLmluY2x1ZGVzKFgua2V5KSl7Y29uc3QgdmU9WC50YXJnZXQsVGU9X2UuaW5kZXhPZih2ZSk7X2U9X2Uuc2xpY2UoVGUrMSl9c2V0VGltZW91dCgoKT0+QyhfZSkpLFgucHJldmVudERlZmF1bHQoKX19KX0pKSkpKSl9KSx6QT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sb25QbGFjZWQ6ciwuLi5vfT1lLGk9T2koTWwsbiksbD1SZChNbCxuKSxbcyxhXT1wLnVzZVN0YXRlKG51bGwpLFt1LGNdPXAudXNlU3RhdGUobnVsbCksZD1RZSh0LFQ9PmMoVCkpLGY9QW0obiksaD1wLnVzZVJlZighMSksbT1wLnVzZVJlZighMCkse3ZpZXdwb3J0Omcsc2VsZWN0ZWRJdGVtOlMsc2VsZWN0ZWRJdGVtVGV4dDp2LGZvY3VzU2VsZWN0ZWRJdGVtOnl9PWwseD1wLnVzZUNhbGxiYWNrKCgpPT57aWYoaS50cmlnZ2VyJiZpLnZhbHVlTm9kZSYmcyYmdSYmZyYmUyYmdil7Y29uc3QgVD1pLnRyaWdnZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksTj11LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLEQ9aS52YWx1ZU5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksTz12LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKGkuZGlyIT09InJ0bCIpe2NvbnN0IHZlPU8ubGVmdC1OLmxlZnQsVGU9RC5sZWZ0LXZlLEJlPVQubGVmdC1UZSxPdD1ULndpZHRoK0JlLHVuPU1hdGgubWF4KE90LE4ud2lkdGgpLE9uPXdpbmRvdy5pbm5lcldpZHRoLU9yLE5lPURoKFRlLFtPcixPbi11bl0pO3Muc3R5bGUubWluV2lkdGg9T3QrInB4IixzLnN0eWxlLmxlZnQ9TmUrInB4In1lbHNle2NvbnN0IHZlPU4ucmlnaHQtTy5yaWdodCxUZT13aW5kb3cuaW5uZXJXaWR0aC1ELnJpZ2h0LXZlLEJlPXdpbmRvdy5pbm5lcldpZHRoLVQucmlnaHQtVGUsT3Q9VC53aWR0aCtCZSx1bj1NYXRoLm1heChPdCxOLndpZHRoKSxPbj13aW5kb3cuaW5uZXJXaWR0aC1PcixOZT1EaChUZSxbT3IsT24tdW5dKTtzLnN0eWxlLm1pbldpZHRoPU90KyJweCIscy5zdHlsZS5yaWdodD1OZSsicHgifWNvbnN0IGo9ZigpLEI9d2luZG93LmlubmVySGVpZ2h0LU9yKjIsYWU9Zy5zY3JvbGxIZWlnaHQsSD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh1KSxHPXBhcnNlSW50KEguYm9yZGVyVG9wV2lkdGgsMTApLEM9cGFyc2VJbnQoSC5wYWRkaW5nVG9wLDEwKSwkPXBhcnNlSW50KEguYm9yZGVyQm90dG9tV2lkdGgsMTApLEU9cGFyc2VJbnQoSC5wYWRkaW5nQm90dG9tLDEwKSxBPUcrQythZStFKyQsUj1NYXRoLm1pbihTLm9mZnNldEhlaWdodCo1LEEpLHo9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZyksVj1wYXJzZUludCh6LnBhZGRpbmdUb3AsMTApLGllPXBhcnNlSW50KHoucGFkZGluZ0JvdHRvbSwxMCksbmU9VC50b3ArVC5oZWlnaHQvMi1PcixDZT1CLW5lLHdlPVMub2Zmc2V0SGVpZ2h0LzIsWD1TLm9mZnNldFRvcCt3ZSxiZT1HK0MrWCxmZT1BLWJlO2lmKGJlPD1uZSl7Y29uc3QgdmU9Uz09PWpbai5sZW5ndGgtMV0ucmVmLmN1cnJlbnQ7cy5zdHlsZS5ib3R0b209IjBweCI7Y29uc3QgVGU9dS5jbGllbnRIZWlnaHQtZy5vZmZzZXRUb3AtZy5vZmZzZXRIZWlnaHQsQmU9TWF0aC5tYXgoQ2Usd2UrKHZlP2llOjApK1RlKyQpLE90PWJlK0JlO3Muc3R5bGUuaGVpZ2h0PU90KyJweCJ9ZWxzZXtjb25zdCB2ZT1TPT09alswXS5yZWYuY3VycmVudDtzLnN0eWxlLnRvcD0iMHB4Ijtjb25zdCBCZT1NYXRoLm1heChuZSxHK2cub2Zmc2V0VG9wKyh2ZT9WOjApK3dlKStmZTtzLnN0eWxlLmhlaWdodD1CZSsicHgiLGcuc2Nyb2xsVG9wPWJlLW5lK2cub2Zmc2V0VG9wfXMuc3R5bGUubWFyZ2luPWAke09yfXB4IDBgLHMuc3R5bGUubWluSGVpZ2h0PVIrInB4IixzLnN0eWxlLm1heEhlaWdodD1CKyJweCIscj09bnVsbHx8cigpLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+aC5jdXJyZW50PSEwKX19LFtmLGkudHJpZ2dlcixpLnZhbHVlTm9kZSxzLHUsZyxTLHYsaS5kaXIscl0pO1RuKCgpPT54KCksW3hdKTtjb25zdFt3LGtdPXAudXNlU3RhdGUoKTtUbigoKT0+e3UmJmsod2luZG93LmdldENvbXB1dGVkU3R5bGUodSkuekluZGV4KX0sW3VdKTtjb25zdCBiPXAudXNlQ2FsbGJhY2soVD0+e1QmJm0uY3VycmVudD09PSEwJiYoeCgpLHk9PW51bGx8fHkoKSxtLmN1cnJlbnQ9ITEpfSxbeCx5XSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChGQSx7c2NvcGU6bixjb250ZW50V3JhcHBlcjpzLHNob3VsZEV4cGFuZE9uU2Nyb2xsUmVmOmgsb25TY3JvbGxCdXR0b25DaGFuZ2U6Yn0scC5jcmVhdGVFbGVtZW50KCJkaXYiLHtyZWY6YSxzdHlsZTp7ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixwb3NpdGlvbjoiZml4ZWQiLHpJbmRleDp3fX0scC5jcmVhdGVFbGVtZW50KExlLmRpdix0ZSh7fSxvLHtyZWY6ZCxzdHlsZTp7Ym94U2l6aW5nOiJib3JkZXItYm94IixtYXhIZWlnaHQ6IjEwMCUiLC4uLm8uc3R5bGV9fSkpKSl9KSxNMD1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sYWxpZ246cj0ic3RhcnQiLGNvbGxpc2lvblBhZGRpbmc6bz1PciwuLi5pfT1lLGw9TW0obik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChMNSx0ZSh7fSxsLGkse3JlZjp0LGFsaWduOnIsY29sbGlzaW9uUGFkZGluZzpvLHN0eWxlOntib3hTaXppbmc6ImJvcmRlci1ib3giLC4uLmkuc3R5bGUsIi0tcmFkaXgtc2VsZWN0LWNvbnRlbnQtdHJhbnNmb3JtLW9yaWdpbiI6InZhcigtLXJhZGl4LXBvcHBlci10cmFuc2Zvcm0tb3JpZ2luKSIsIi0tcmFkaXgtc2VsZWN0LWNvbnRlbnQtYXZhaWxhYmxlLXdpZHRoIjoidmFyKC0tcmFkaXgtcG9wcGVyLWF2YWlsYWJsZS13aWR0aCkiLCItLXJhZGl4LXNlbGVjdC1jb250ZW50LWF2YWlsYWJsZS1oZWlnaHQiOiJ2YXIoLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLWhlaWdodCkiLCItLXJhZGl4LXNlbGVjdC10cmlnZ2VyLXdpZHRoIjoidmFyKC0tcmFkaXgtcG9wcGVyLWFuY2hvci13aWR0aCkiLCItLXJhZGl4LXNlbGVjdC10cmlnZ2VyLWhlaWdodCI6InZhcigtLXJhZGl4LXBvcHBlci1hbmNob3ItaGVpZ2h0KSJ9fSkpfSksW0ZBLEJBXT1lcyhNbCx7fSksTDA9IlNlbGVjdFZpZXdwb3J0IixXQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sLi4ucn09ZSxvPVJkKEwwLG4pLGk9QkEoTDAsbiksbD1RZSh0LG8ub25WaWV3cG9ydENoYW5nZSkscz1wLnVzZVJlZigwKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxwLmNyZWF0ZUVsZW1lbnQoInN0eWxlIix7ZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDoiW2RhdGEtcmFkaXgtc2VsZWN0LXZpZXdwb3J0XXtzY3JvbGxiYXItd2lkdGg6bm9uZTstbXMtb3ZlcmZsb3ctc3R5bGU6bm9uZTstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaDt9W2RhdGEtcmFkaXgtc2VsZWN0LXZpZXdwb3J0XTo6LXdlYmtpdC1zY3JvbGxiYXJ7ZGlzcGxheTpub25lfSJ9fSkscC5jcmVhdGVFbGVtZW50KE5kLlNsb3Qse3Njb3BlOm59LHAuY3JlYXRlRWxlbWVudChMZS5kaXYsdGUoeyJkYXRhLXJhZGl4LXNlbGVjdC12aWV3cG9ydCI6IiIscm9sZToicHJlc2VudGF0aW9uIn0scix7cmVmOmwsc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsZmxleDoxLG92ZXJmbG93OiJhdXRvIiwuLi5yLnN0eWxlfSxvblNjcm9sbDpIZShyLm9uU2Nyb2xsLGE9Pntjb25zdCB1PWEuY3VycmVudFRhcmdldCx7Y29udGVudFdyYXBwZXI6YyxzaG91bGRFeHBhbmRPblNjcm9sbFJlZjpkfT1pO2lmKGQhPW51bGwmJmQuY3VycmVudCYmYyl7Y29uc3QgZj1NYXRoLmFicyhzLmN1cnJlbnQtdS5zY3JvbGxUb3ApO2lmKGY+MCl7Y29uc3QgaD13aW5kb3cuaW5uZXJIZWlnaHQtT3IqMixtPXBhcnNlRmxvYXQoYy5zdHlsZS5taW5IZWlnaHQpLGc9cGFyc2VGbG9hdChjLnN0eWxlLmhlaWdodCksUz1NYXRoLm1heChtLGcpO2lmKFM8aCl7Y29uc3Qgdj1TK2YseT1NYXRoLm1pbihoLHYpLHg9di15O2Muc3R5bGUuaGVpZ2h0PXkrInB4IixjLnN0eWxlLmJvdHRvbT09PSIwcHgiJiYodS5zY3JvbGxUb3A9eD4wP3g6MCxjLnN0eWxlLmp1c3RpZnlDb250ZW50PSJmbGV4LWVuZCIpfX19cy5jdXJyZW50PXUuc2Nyb2xsVG9wfSl9KSkpKX0pLFVBPSJTZWxlY3RHcm91cCIsW1c0LFZBXT1lcyhVQSksSEE9IlNlbGVjdExhYmVsIixLQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sLi4ucn09ZSxvPVZBKEhBLG4pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoTGUuZGl2LHRlKHtpZDpvLmlkfSxyLHtyZWY6dH0pKX0pLFJwPSJTZWxlY3RJdGVtIixbR0EsQUVdPWVzKFJwKSxZQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sdmFsdWU6cixkaXNhYmxlZDpvPSExLHRleHRWYWx1ZTppLC4uLmx9PWUscz1PaShScCxuKSxhPVJkKFJwLG4pLHU9cy52YWx1ZT09PXIsW2MsZF09cC51c2VTdGF0ZShpPz8iIiksW2YsaF09cC51c2VTdGF0ZSghMSksbT1RZSh0LHY9Pnt2YXIgeTtyZXR1cm4oeT1hLml0ZW1SZWZDYWxsYmFjayk9PT1udWxsfHx5PT09dm9pZCAwP3ZvaWQgMDp5LmNhbGwoYSx2LHIsbyl9KSxnPUNkKCksUz0oKT0+e298fChzLm9uVmFsdWVDaGFuZ2Uocikscy5vbk9wZW5DaGFuZ2UoITEpKX07aWYocj09PSIiKXRocm93IG5ldyBFcnJvcigiQSA8U2VsZWN0Lkl0ZW0gLz4gbXVzdCBoYXZlIGEgdmFsdWUgcHJvcCB0aGF0IGlzIG5vdCBhbiBlbXB0eSBzdHJpbmcuIFRoaXMgaXMgYmVjYXVzZSB0aGUgU2VsZWN0IHZhbHVlIGNhbiBiZSBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIGNsZWFyIHRoZSBzZWxlY3Rpb24gYW5kIHNob3cgdGhlIHBsYWNlaG9sZGVyLiIpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoR0Ese3Njb3BlOm4sdmFsdWU6cixkaXNhYmxlZDpvLHRleHRJZDpnLGlzU2VsZWN0ZWQ6dSxvbkl0ZW1UZXh0Q2hhbmdlOnAudXNlQ2FsbGJhY2sodj0+e2QoeT0+e3ZhciB4O3JldHVybiB5fHwoKHg9dj09bnVsbD92b2lkIDA6di50ZXh0Q29udGVudCkhPT1udWxsJiZ4IT09dm9pZCAwP3g6IiIpLnRyaW0oKX0pfSxbXSl9LHAuY3JlYXRlRWxlbWVudChOZC5JdGVtU2xvdCx7c2NvcGU6bix2YWx1ZTpyLGRpc2FibGVkOm8sdGV4dFZhbHVlOmN9LHAuY3JlYXRlRWxlbWVudChMZS5kaXYsdGUoe3JvbGU6Im9wdGlvbiIsImFyaWEtbGFiZWxsZWRieSI6ZywiZGF0YS1oaWdobGlnaHRlZCI6Zj8iIjp2b2lkIDAsImFyaWEtc2VsZWN0ZWQiOnUmJmYsImRhdGEtc3RhdGUiOnU/ImNoZWNrZWQiOiJ1bmNoZWNrZWQiLCJhcmlhLWRpc2FibGVkIjpvfHx2b2lkIDAsImRhdGEtZGlzYWJsZWQiOm8/IiI6dm9pZCAwLHRhYkluZGV4Om8/dm9pZCAwOi0xfSxsLHtyZWY6bSxvbkZvY3VzOkhlKGwub25Gb2N1cywoKT0+aCghMCkpLG9uQmx1cjpIZShsLm9uQmx1ciwoKT0+aCghMSkpLG9uUG9pbnRlclVwOkhlKGwub25Qb2ludGVyVXAsUyksb25Qb2ludGVyTW92ZTpIZShsLm9uUG9pbnRlck1vdmUsdj0+e2lmKG8pe3ZhciB5Oyh5PWEub25JdGVtTGVhdmUpPT09bnVsbHx8eT09PXZvaWQgMHx8eS5jYWxsKGEpfWVsc2Ugdi5jdXJyZW50VGFyZ2V0LmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSl9KSxvblBvaW50ZXJMZWF2ZTpIZShsLm9uUG9pbnRlckxlYXZlLHY9PntpZih2LmN1cnJlbnRUYXJnZXQ9PT1kb2N1bWVudC5hY3RpdmVFbGVtZW50KXt2YXIgeTsoeT1hLm9uSXRlbUxlYXZlKT09PW51bGx8fHk9PT12b2lkIDB8fHkuY2FsbChhKX19KSxvbktleURvd246SGUobC5vbktleURvd24sdj0+e3ZhciB5OygoeT1hLnNlYXJjaFJlZik9PT1udWxsfHx5PT09dm9pZCAwP3ZvaWQgMDp5LmN1cnJlbnQpIT09IiImJnYua2V5PT09IiAifHwoJEEuaW5jbHVkZXModi5rZXkpJiZTKCksdi5rZXk9PT0iICImJnYucHJldmVudERlZmF1bHQoKSl9KX0pKSkpfSksa3U9IlNlbGVjdEl0ZW1UZXh0IixYQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sY2xhc3NOYW1lOnIsc3R5bGU6bywuLi5pfT1lLGw9T2koa3Usbikscz1SZChrdSxuKSxhPUFFKGt1LG4pLHU9TkEoa3UsbiksW2MsZF09cC51c2VTdGF0ZShudWxsKSxmPVFlKHQsdj0+ZCh2KSxhLm9uSXRlbVRleHRDaGFuZ2Usdj0+e3ZhciB5O3JldHVybih5PXMuaXRlbVRleHRSZWZDYWxsYmFjayk9PT1udWxsfHx5PT09dm9pZCAwP3ZvaWQgMDp5LmNhbGwocyx2LGEudmFsdWUsYS5kaXNhYmxlZCl9KSxoPWM9PW51bGw/dm9pZCAwOmMudGV4dENvbnRlbnQsbT1wLnVzZU1lbW8oKCk9PnAuY3JlYXRlRWxlbWVudCgib3B0aW9uIix7a2V5OmEudmFsdWUsdmFsdWU6YS52YWx1ZSxkaXNhYmxlZDphLmRpc2FibGVkfSxoKSxbYS5kaXNhYmxlZCxhLnZhbHVlLGhdKSx7b25OYXRpdmVPcHRpb25BZGQ6Zyxvbk5hdGl2ZU9wdGlvblJlbW92ZTpTfT11O3JldHVybiBUbigoKT0+KGcobSksKCk9PlMobSkpLFtnLFMsbV0pLHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwscC5jcmVhdGVFbGVtZW50KExlLnNwYW4sdGUoe2lkOmEudGV4dElkfSxpLHtyZWY6Zn0pKSxhLmlzU2VsZWN0ZWQmJmwudmFsdWVOb2RlJiYhbC52YWx1ZU5vZGVIYXNDaGlsZHJlbj9Hci5jcmVhdGVQb3J0YWwoaS5jaGlsZHJlbixsLnZhbHVlTm9kZSk6bnVsbCl9KSxRQT0iU2VsZWN0SXRlbUluZGljYXRvciIsSkE9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLC4uLnJ9PWU7cmV0dXJuIEFFKFFBLG4pLmlzU2VsZWN0ZWQ/cC5jcmVhdGVFbGVtZW50KExlLnNwYW4sdGUoeyJhcmlhLWhpZGRlbiI6ITB9LHIse3JlZjp0fSkpOm51bGx9KSxaQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sLi4ucn09ZTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KExlLmRpdix0ZSh7ImFyaWEtaGlkZGVuIjohMH0scix7cmVmOnR9KSl9KTtmdW5jdGlvbiBNRShlKXtyZXR1cm4gZT09PSIifHxlPT09dm9pZCAwfWNvbnN0IExFPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e3ZhbHVlOm4sLi4ucn09ZSxvPXAudXNlUmVmKG51bGwpLGk9UWUodCxvKSxsPVNFKG4pO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IHM9by5jdXJyZW50LGE9d2luZG93LkhUTUxTZWxlY3RFbGVtZW50LnByb3RvdHlwZSxjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYSwidmFsdWUiKS5zZXQ7aWYobCE9PW4mJmMpe2NvbnN0IGQ9bmV3IEV2ZW50KCJjaGFuZ2UiLHtidWJibGVzOiEwfSk7Yy5jYWxsKHMsbikscy5kaXNwYXRjaEV2ZW50KGQpfX0sW2wsbl0pLHAuY3JlYXRlRWxlbWVudChqNSx7YXNDaGlsZDohMH0scC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiLHRlKHt9LHIse3JlZjppLGRlZmF1bHRWYWx1ZTpufSkpKX0pO0xFLmRpc3BsYXlOYW1lPSJCdWJibGVTZWxlY3QiO2Z1bmN0aW9uIERFKGUpe2NvbnN0IHQ9S3QoZSksbj1wLnVzZVJlZigiIikscj1wLnVzZVJlZigwKSxvPXAudXNlQ2FsbGJhY2sobD0+e2NvbnN0IHM9bi5jdXJyZW50K2w7dChzKSxmdW5jdGlvbiBhKHUpe24uY3VycmVudD11LHdpbmRvdy5jbGVhclRpbWVvdXQoci5jdXJyZW50KSx1IT09IiImJihyLmN1cnJlbnQ9d2luZG93LnNldFRpbWVvdXQoKCk9PmEoIiIpLDFlMykpfShzKX0sW3RdKSxpPXAudXNlQ2FsbGJhY2soKCk9PntuLmN1cnJlbnQ9IiIsd2luZG93LmNsZWFyVGltZW91dChyLmN1cnJlbnQpfSxbXSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT4oKT0+d2luZG93LmNsZWFyVGltZW91dChyLmN1cnJlbnQpLFtdKSxbbixvLGldfWZ1bmN0aW9uIElFKGUsdCxuKXtjb25zdCBvPXQubGVuZ3RoPjEmJkFycmF5LmZyb20odCkuZXZlcnkodT0+dT09PXRbMF0pP3RbMF06dCxpPW4/ZS5pbmRleE9mKG4pOi0xO2xldCBsPXFBKGUsTWF0aC5tYXgoaSwwKSk7by5sZW5ndGg9PT0xJiYobD1sLmZpbHRlcih1PT51IT09bikpO2NvbnN0IGE9bC5maW5kKHU9PnUudGV4dFZhbHVlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChvLnRvTG93ZXJDYXNlKCkpKTtyZXR1cm4gYSE9PW4/YTp2b2lkIDB9ZnVuY3Rpb24gcUEoZSx0KXtyZXR1cm4gZS5tYXAoKG4scik9PmVbKHQrciklZS5sZW5ndGhdKX1jb25zdCBlMz1SQSxqRT1PQSx0Mz1NQSxuMz1MQSxyMz1EQSx6RT1JQSxvMz1XQSxGRT1LQSxCRT1ZQSxpMz1YQSxsMz1KQSxXRT1aQSxzMz1lMyxhMz10MyxVRT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxjaGlsZHJlbjp0LC4uLm59LHIpPT5fLmpzeHMoakUse3JlZjpyLGNsYXNzTmFtZTppdCgiZmxleCBoLTEwIHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHB4LTMgcHktMiB0ZXh0LXNtIHJpbmctb2Zmc2V0LWJhY2tncm91bmQgcGxhY2Vob2xkZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1yaW5nIGZvY3VzOnJpbmctb2Zmc2V0LTIgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAiLGUpLC4uLm4sY2hpbGRyZW46W3QsXy5qc3gobjMse2FzQ2hpbGQ6ITAsY2hpbGRyZW46Xy5qc3godEUse2NsYXNzTmFtZToidy00IGgtNCBvcGFjaXR5LTUwIn0pfSldfSkpO1VFLmRpc3BsYXlOYW1lPWpFLmRpc3BsYXlOYW1lO2NvbnN0IFZFPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLGNoaWxkcmVuOnQscG9zaXRpb246bj0icG9wcGVyIiwuLi5yfSxvKT0+Xy5qc3gocjMse2NoaWxkcmVuOl8uanN4KHpFLHtyZWY6byxjbGFzc05hbWU6aXQoInJlbGF0aXZlIHotNTAgbWluLXctWzhyZW1dIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLW1kIGJvcmRlciBiZy1wb3BvdmVyIHRleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIHNoYWRvdy1tZCBkYXRhLVtzdGF0ZT1vcGVuXTphbmltYXRlLWluIGRhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1vdXQgZGF0YS1bc3RhdGU9Y2xvc2VkXTpmYWRlLW91dC0wIGRhdGEtW3N0YXRlPW9wZW5dOmZhZGUtaW4tMCBkYXRhLVtzdGF0ZT1jbG9zZWRdOnpvb20tb3V0LTk1IGRhdGEtW3N0YXRlPW9wZW5dOnpvb20taW4tOTUgZGF0YS1bc2lkZT1ib3R0b21dOnNsaWRlLWluLWZyb20tdG9wLTIgZGF0YS1bc2lkZT1sZWZ0XTpzbGlkZS1pbi1mcm9tLXJpZ2h0LTIgZGF0YS1bc2lkZT1yaWdodF06c2xpZGUtaW4tZnJvbS1sZWZ0LTIgZGF0YS1bc2lkZT10b3BdOnNsaWRlLWluLWZyb20tYm90dG9tLTIiLG49PT0icG9wcGVyIiYmImRhdGEtW3NpZGU9Ym90dG9tXTp0cmFuc2xhdGUteS0xIGRhdGEtW3NpZGU9bGVmdF06LXRyYW5zbGF0ZS14LTEgZGF0YS1bc2lkZT1yaWdodF06dHJhbnNsYXRlLXgtMSBkYXRhLVtzaWRlPXRvcF06LXRyYW5zbGF0ZS15LTEiLGUpLHBvc2l0aW9uOm4sLi4ucixjaGlsZHJlbjpfLmpzeChvMyx7Y2xhc3NOYW1lOml0KCJwLTEiLG49PT0icG9wcGVyIiYmImgtW3ZhcigtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLWhlaWdodCldIHctZnVsbCBtaW4tdy1bdmFyKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItd2lkdGgpXSIpLGNoaWxkcmVuOnR9KX0pfSkpO1ZFLmRpc3BsYXlOYW1lPXpFLmRpc3BsYXlOYW1lO2NvbnN0IHUzPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT5fLmpzeChGRSx7cmVmOm4sY2xhc3NOYW1lOml0KCJweS0xLjUgcGwtOCBwci0yIHRleHQtc20gZm9udC1zZW1pYm9sZCIsZSksLi4udH0pKTt1My5kaXNwbGF5TmFtZT1GRS5kaXNwbGF5TmFtZTtjb25zdCBIRT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxjaGlsZHJlbjp0LC4uLm59LHIpPT5fLmpzeHMoQkUse3JlZjpyLGNsYXNzTmFtZTppdCgicmVsYXRpdmUgZmxleCB3LWZ1bGwgY3Vyc29yLWRlZmF1bHQgc2VsZWN0LW5vbmUgaXRlbXMtY2VudGVyIHJvdW5kZWQtc20gcHktMS41IHBsLTggcHItMiB0ZXh0LXNtIG91dGxpbmUtbm9uZSBmb2N1czpiZy1hY2NlbnQgZm9jdXM6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCBkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCIsZSksLi4ubixjaGlsZHJlbjpbXy5qc3goInNwYW4iLHtjbGFzc05hbWU6ImFic29sdXRlIGxlZnQtMiBmbGV4IGgtMy41IHctMy41IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciIsY2hpbGRyZW46Xy5qc3gobDMse2NoaWxkcmVuOl8uanN4KHNPLHtjbGFzc05hbWU6InctNCBoLTQifSl9KX0pLF8uanN4KGkzLHtjaGlsZHJlbjp0fSldfSkpO0hFLmRpc3BsYXlOYW1lPUJFLmRpc3BsYXlOYW1lO2NvbnN0IGMzPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT5fLmpzeChXRSx7cmVmOm4sY2xhc3NOYW1lOml0KCItbXgtMSBteS0xIGgtcHggYmctbXV0ZWQiLGUpLC4uLnR9KSk7YzMuZGlzcGxheU5hbWU9V0UuZGlzcGxheU5hbWU7ZnVuY3Rpb24gS0Uoe3BhdGg6ZSxkaXNhYmxlZDp0LHNvdXJjZTpuLHNjaGVtYTpyLHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazpvLG9uU3VibWl0Oml9KXtyZXR1cm4odHlwZW9mIG49PSJzdHJpbmcifHxuPT09bnVsbCkmJihyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09InN0cmluZyI/Xy5qc3goZzMse2RlZmF1bHRWYWx1ZTpuLGRpc2FibGVkOnQscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm8sb25TdWJtaXQ6aX0pOih0eXBlb2Ygbj09Im51bWJlciJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0ibnVtYmVyIj9fLmpzeChwMyx7ZGVmYXVsdFZhbHVlOm4sZGlzYWJsZWQ6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6byxvblN1Ym1pdDppfSk6KHR5cGVvZiBuPT0ibnVtYmVyInx8dHlwZW9mIG49PSJzdHJpbmcifHxuPT09bnVsbCkmJihyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09ImtleU9mIj9fLmpzeChoMyx7ZGVmYXVsdFZhbHVlOm4sZGlzYWJsZWQ6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6byxvblN1Ym1pdDppLHNlbGVjdG9yOnIuc2VsZWN0b3J9KToodHlwZW9mIG49PSJvYmplY3QifHxuPT09bnVsbCkmJihyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09InJpY2h0ZXh0Ij9fLmpzeChmMyx7cmVnaXN0ZXJQYXRjaENhbGxiYWNrOm8sb25TdWJtaXQ6aSxkZWZhdWx0VmFsdWU6bn0pOih0eXBlb2Ygbj09Im9iamVjdCJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0iaW1hZ2UiP18uanN4KGQzLHtwYXRoOmUscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm8sb25TdWJtaXQ6aSxkZWZhdWx0VmFsdWU6bn0pOl8uanN4cygiZGl2Iix7Y2hpbGRyZW46WyJVbnN1cHBvcnRlZCBzY2hlbWE6ICIsci50eXBlXX0pfWZ1bmN0aW9uIEQwKGUsdCxuLHIpe2lmKCF0fHwhcilyZXR1cm5bXTtjb25zdCBvPXIuc2hhMjU2LnNsaWNlKDAsNSksaT1mdW5jdGlvbigpe2NvbnN0IGw9VWcodCk/PyJ1bmtub3duIixzPVZnKGwpO3JldHVybiBuP2AvcHVibGljLyR7bi5zcGxpdCgiLiIpLnNsaWNlKDAsLTEpLmpvaW4oIi4iKXx8bn1fJHtvfS4ke3N9YDpgL3B1YmxpYy8ke3Iuc2hhMjU2fS4ke3N9YH0oKTtyZXR1cm5be3ZhbHVlOntbZ25dOmksW1l0XToiZmlsZSIsbWV0YWRhdGE6cn0sb3A6InJlcGxhY2UiLHBhdGg6ZX0se3ZhbHVlOnQsb3A6ImZpbGUiLHBhdGg6ZSxmaWxlUGF0aDppfV19ZnVuY3Rpb24gZDMoe3BhdGg6ZSxkZWZhdWx0VmFsdWU6dCxvblN1Ym1pdDpuLHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazpyfSl7Y29uc3RbbyxpXT1wLnVzZVN0YXRlKG51bGwpLFtsLHNdPXAudXNlU3RhdGUoITEpLFthLHVdPXAudXNlU3RhdGUoKSxbYyxkXT1wLnVzZVN0YXRlKCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57ZCh0JiZFbi5jb252ZXJ0RmlsZVNvdXJjZSh0KS51cmwpfSxbdF0pLHAudXNlRWZmZWN0KCgpPT57ciYmcihhc3luYyBmPT5EMChmLChvPT1udWxsP3ZvaWQgMDpvLnNyYyk/P251bGwsKG89PW51bGw/dm9pZCAwOm8uZmlsZW5hbWUpPz9udWxsLGEpKX0sW28sdF0pLF8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJtYXgtdy00eGwgcC00IixjaGlsZHJlbjpbXy5qc3hzKCJsYWJlbCIse2h0bWxGb3I6YGltZ19pbnB1dDoke2V9YCxjbGFzc05hbWU6IiIsY2hpbGRyZW46W298fGM/Xy5qc3goImltZyIse3NyYzoobz09bnVsbD92b2lkIDA6by5zcmMpfHxjfSk6Xy5qc3goImRpdiIse2NoaWxkcmVuOiJFbXB0eSJ9KSxfLmpzeCgiaW5wdXQiLHtpZDpgaW1nX2lucHV0OiR7ZX1gLHR5cGU6ImZpbGUiLGhpZGRlbjohMCxvbkNoYW5nZTpmPT57UVMoZikudGhlbihoPT57aSh7c3JjOmguc3JjLGZpbGVuYW1lOmguZmlsZW5hbWV9KSxoLndpZHRoJiZoLmhlaWdodD91KHtzaGEyNTY6aC5zaGEyNTYsd2lkdGg6aC53aWR0aCxoZWlnaHQ6aC5oZWlnaHR9KTp1KHZvaWQgMCl9KS5jYXRjaChoPT57Y29uc29sZS5lcnJvcihoLm1lc3NhZ2UpLGkobnVsbCksdSh2b2lkIDApfSl9fSldfSksbiYmXy5qc3goImRpdiIse2NoaWxkcmVuOm8mJl8uanN4KEpsLHtkaXNhYmxlZDpsLG9uQ2xpY2s6KCk9PntzKCEwKSxuKGY9PlByb21pc2UucmVzb2x2ZShEMChmLG8uc3JjLG8uZmlsZW5hbWU/P251bGwsYSkpKS5maW5hbGx5KCgpPT57cyghMSksaShudWxsKSx1KHZvaWQgMCl9KX0sY2hpbGRyZW46bD8iU2F2aW5nLi4uIjoiU3VibWl0In0pfSldfSxlKX1hc3luYyBmdW5jdGlvbiBJMChlLHQpe2NvbnN0e3RlbXBsYXRlU3RyaW5nczpuLGV4cHJzOnIsZmlsZXM6b309dD9hd2FpdCBETih0LmdldEVkaXRvclN0YXRlKCkudG9KU09OKCkucm9vdCk6e1tZdF06InJpY2h0ZXh0Iix0ZW1wbGF0ZVN0cmluZ3M6WyIiXSxleHByczpbXSxmaWxlczp7fX07cmV0dXJuW3tvcDoicmVwbGFjZSIscGF0aDplLHZhbHVlOnt0ZW1wbGF0ZVN0cmluZ3M6bixleHByczpyLFtZdF06InJpY2h0ZXh0In19LC4uLk9iamVjdC5lbnRyaWVzKG8pLm1hcCgoW2ksbF0pPT4oe29wOiJmaWxlIixwYXRoOmUsZmlsZVBhdGg6aSx2YWx1ZTpsfSkpXX1mdW5jdGlvbiBmMyh7ZGVmYXVsdFZhbHVlOmUsb25TdWJtaXQ6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6bn0pe2NvbnN0W3Isb109cC51c2VTdGF0ZShudWxsKSxbaSxsXT1wLnVzZVN0YXRlKCExKSxbcyxhXT1wLnVzZVN0YXRlKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntyJiYobCghMSksci5yZWdpc3RlclRleHRDb250ZW50TGlzdGVuZXIoKCk9PntsKCEwKX0pLHIucmVnaXN0ZXJEZWNvcmF0b3JMaXN0ZW5lcigoKT0+e2woITApfSkpfSxbcl0pLHAudXNlRWZmZWN0KCgpPT57ciYmbiYmbih1PT5JMCh1LHIpKX0sW3JdKSxfLmpzeHMoImRpdiIse2NsYXNzTmFtZToicC00IGJvcmRlciByb3VuZGVkIGJvcmRlci1jYXJkIixjaGlsZHJlbjpbXy5qc3gob08se29uRWRpdG9yOnU9PntvKHUpfSxyaWNodGV4dDplfHx7Y2hpbGRyZW46W10sW1l0XToicm9vdCJ9fSksdCYmXy5qc3goImRpdiIse2NoaWxkcmVuOmkmJl8uanN4KEpsLHtkaXNhYmxlZDpzfHwhcixvbkNsaWNrOigpPT57ciYmKGEoITApLHQodT0+STAodSxyKSkuZmluYWxseSgoKT0+e2EoITEpLGwoITEpfSkpfSxjaGlsZHJlbjpzPyJTYXZpbmcuLi4iOiJTdWJtaXQifSl9KV19KX1mdW5jdGlvbiBoMyh7ZGlzYWJsZWQ6ZSxkZWZhdWx0VmFsdWU6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6bixvblN1Ym1pdDpyLHNlbGVjdG9yOm99KXtjb25zdCBpPURNKG8pLHM9KGg9PkFycmF5LmlzQXJyYXkoaC5tb2R1bGVTb3VyY2UpP3t0eXBlOiJudW1iZXIiLHZhbHVlczpPYmplY3Qua2V5cyhoLm1vZHVsZVNvdXJjZSkubWFwKG09PnBhcnNlSW50KG0pKX06e3R5cGU6InN0cmluZyIsdmFsdWVzOk9iamVjdC5rZXlzKGgubW9kdWxlU291cmNlPz9bIkVSUk9SIGZldGNoaW5nIHNvdXJjZSJdKX0pKGkpLFthLHVdPXAudXNlU3RhdGUodD8/cy52YWx1ZXNbMF0pLFtjLGRdPXAudXNlU3RhdGUoITEpO3AudXNlRWZmZWN0KCgpPT57ZChlKX0sW2VdKTtjb25zdCBmPWg9PntpZihzLnR5cGU9PT0ibnVtYmVyIil7aWYoaD09PSIiKXRocm93IG5ldyBFcnJvcigiVmFsdWUgY2Fubm90IGJlIGVtcHR5Iik7aWYoTnVtYmVyLmlzTmFOKE51bWJlcihoKSkpdGhyb3cgbmV3IEVycm9yKCJWYWx1ZSB3YXMgbm90IGEgbnVtYmVyOiAiK0pTT04uc3RyaW5naWZ5KGgpKTtyZXR1cm4gTnVtYmVyKGgpfXJldHVybiBofTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntuJiZuKGFzeW5jIGg9Plt7b3A6InJlcGxhY2UiLHBhdGg6aCx2YWx1ZTphfV0pfSxbYV0pLF8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiBoLWZ1bGwgZ2FwLXktNCIsY2hpbGRyZW46W18uanN4cyhzMyx7ZGVmYXVsdFZhbHVlOmEudG9TdHJpbmcoKSxkaXNhYmxlZDpjLG9uVmFsdWVDaGFuZ2U6aD0+e3UoZihoKSl9LGNoaWxkcmVuOltfLmpzeChVRSx7Y2hpbGRyZW46Xy5qc3goYTMse3BsYWNlaG9sZGVyOiJTZWxlY3QgYSB2YWx1ZSJ9KX0pLF8uanN4KFZFLHtjaGlsZHJlbjpzLnZhbHVlcy5tYXAoaD0+Xy5qc3goSEUse3ZhbHVlOmgudG9TdHJpbmcoKSxjaGlsZHJlbjpoLnRvU3RyaW5nKCl9LGgpKX0pXX0pLHImJl8uanN4KCJkaXYiLHtjaGlsZHJlbjp0IT09YSYmXy5qc3goSmwse2Rpc2FibGVkOmMsb25DbGljazooKT0+e2QoITApLHIoYXN5bmMgaD0+W3tvcDoicmVwbGFjZSIscGF0aDpoLHZhbHVlOmF9XSkuZmluYWxseSgoKT0+e2QoITEpfSl9LGNoaWxkcmVuOmM/IlNhdmluZy4uLiI6IlN1Ym1pdCJ9KX0pXX0pfWZ1bmN0aW9uIHAzKHtkaXNhYmxlZDplLGRlZmF1bHRWYWx1ZTp0LHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazpuLG9uU3VibWl0OnJ9KXtjb25zdFtvLGldPXAudXNlU3RhdGUodHx8MCksW2wsc109cC51c2VTdGF0ZSghMSk7cC51c2VFZmZlY3QoKCk9PntzKGUpfSxbZV0pO2NvbnN0IGE9cC51c2VSZWYobnVsbCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57biYmbihhc3luYyB1PT57dmFyIGM7cmV0dXJuW3tvcDoicmVwbGFjZSIscGF0aDp1LHZhbHVlOk51bWJlcigoYz1hLmN1cnJlbnQpPT1udWxsP3ZvaWQgMDpjLnZhbHVlKXx8MH1dfSl9LFtdKSxfLmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW4gaC1mdWxsIGdhcC15LTQiLGNoaWxkcmVuOltfLmpzeChrbSx7cmVmOmEsZGlzYWJsZWQ6bCxkZWZhdWx0VmFsdWU6bz8/MCxvbkNoYW5nZTp1PT5pKE51bWJlcih1LnRhcmdldC52YWx1ZSkpLHR5cGU6Im51bWJlciJ9KSxyJiZfLmpzeCgiZGl2Iix7Y2hpbGRyZW46dCE9PW8mJl8uanN4KEpsLHtkaXNhYmxlZDpsLG9uQ2xpY2s6KCk9PntzKCEwKSxyKGFzeW5jIHU9Pnt2YXIgYztyZXR1cm5be29wOiJyZXBsYWNlIixwYXRoOnUsdmFsdWU6TnVtYmVyKChjPWEuY3VycmVudCk9PW51bGw/dm9pZCAwOmMudmFsdWUpfHwwfV19KS5maW5hbGx5KCgpPT57cyghMSl9KX0sY2hpbGRyZW46bD8iU2F2aW5nLi4uIjoiU3VibWl0In0pfSldfSl9ZnVuY3Rpb24gZzMoe2Rpc2FibGVkOmUsZGVmYXVsdFZhbHVlOnQscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm4sb25TdWJtaXQ6cn0pe2NvbnN0W28saV09cC51c2VTdGF0ZSh0fHwiIiksW2wsc109cC51c2VTdGF0ZSghMSk7cC51c2VFZmZlY3QoKCk9PntzKGUpfSxbZV0pO2NvbnN0IGE9cC51c2VSZWYobnVsbCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57biYmbihhc3luYyB1PT57dmFyIGM7cmV0dXJuW3tvcDoicmVwbGFjZSIscGF0aDp1LHZhbHVlOigoYz1hLmN1cnJlbnQpPT1udWxsP3ZvaWQgMDpjLnZhbHVlKXx8IiJ9XX0pfSxbXSksXy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wganVzdGlmeS1iZXR3ZWVuIGgtZnVsbCBnYXAteS00IixjaGlsZHJlbjpbXy5qc3goa20se3JlZjphLGRpc2FibGVkOmwsZGVmYXVsdFZhbHVlOm8/PyIiLG9uQ2hhbmdlOnU9PmkodS50YXJnZXQudmFsdWUpfSksciYmXy5qc3goImRpdiIse2NoaWxkcmVuOnQhPT1vJiZfLmpzeChKbCx7ZGlzYWJsZWQ6bCxvbkNsaWNrOigpPT57cyghMCkscihhc3luYyB1PT57dmFyIGM7cmV0dXJuW3tvcDoicmVwbGFjZSIscGF0aDp1LHZhbHVlOigoYz1hLmN1cnJlbnQpPT1udWxsP3ZvaWQgMDpjLnZhbHVlKXx8IiJ9XX0pLmZpbmFsbHkoKCk9PntzKCExKX0pfSxjaGlsZHJlbjpsPyJTYXZpbmcuLi4iOiJTdWJtaXQifSl9KV19KX1jb25zdCBtMz0oe2NsYXNzTmFtZTplfSk9Pl8uanN4cygic3ZnIix7d2lkdGg6IjU4IixoZWlnaHQ6IjM0Iix2aWV3Qm94OiIwIDAgNTggMzQiLGZpbGw6Im5vbmUiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2xhc3NOYW1lOmUsY2hpbGRyZW46W18uanN4KCJnIix7ZmlsdGVyOiJ1cmwoI2ZpbHRlcjBfZF8yMV8xNjc3KSIsY2hpbGRyZW46Xy5qc3goInBhdGgiLHtkOiJNNSA1LjM2NDI2QzUgNS4xNjMwOSA1LjE2MzA5IDUgNS4zNjQyNiA1SDE3LjY1ODFDMTcuODU5MyA1IDE4LjAyMjMgNS4xNjMwOSAxOC4wMjIzIDUuMzY0MjZWMjguNDk0OUMxOC4wMjIzIDI4LjY5NiAxNy44NTkzIDI4Ljg1OTEgMTcuNjU4MSAyOC44NTkxSDUuMzY0MjZDNS4xNjMwOSAyOC44NTkxIDUgMjguNjk2IDUgMjguNDk0OVY1LjM2NDI2WiIsZmlsbDoiIzM4Q0Q5OCJ9KX0pLF8uanN4KCJnIix7ZmlsdGVyOiJ1cmwoI2ZpbHRlcjFfaV8yMV8xNjc3KSIsY2hpbGRyZW46Xy5qc3goImNpcmNsZSIse2N4OiIxMS40NjU2IixjeToiMjMuNzU5NSIscjoiMi4xODU1NyIsZmlsbDoiY3VycmVudENvbG9yIn0pfSksXy5qc3goInBhdGgiLHtmaWxsUnVsZToiZXZlbm9kZCIsY2xpcFJ1bGU6ImV2ZW5vZGQiLGQ6Ik01Mi44NTg4IDIzLjgzOUg0OC43MjU3SDQ4LjUzN0g0OC4xMTI4QzQ3LjY3MTUgMjMuODM5IDQ3LjQ1MDggMjMuNTk0MiA0Ny40NTA4IDIzLjEwNDRWMTMuNzI5M0M0Ny40NTA4IDEzLjU3ODQgNDcuMzI4NSAxMy40NTYxIDQ3LjE3NzcgMTMuNDU2MUg0NS44MTE4QzQ1LjY2MDkgMTMuNDU2MSA0NS41Mzg2IDEzLjU3ODQgNDUuNTM4NiAxMy43MjkzVjE1LjE4MzZDNDUuNTM4NiAxNS4yODQ0IDQ1LjQ1NjkgMTUuMzY2MSA0NS4zNTYxIDE1LjM2NjFDNDUuMjg3NiAxNS4zNjYxIDQ1LjIyNSAxNS4zMjc1IDQ1LjE5MjQgMTUuMjY3MkM0NC44MDUgMTQuNTUwMyA0NC4yODMgMTQuMDIgNDMuNjI2NCAxMy42NzY1QzQyLjk1NjMgMTMuMzAxIDQyLjIwNDUgMTMuMTEzMiA0MS4zNzA5IDEzLjExMzJDNDAuNjAyOCAxMy4xMTMyIDM5Ljg3NTUgMTMuMjUyIDM5LjE4OSAxMy41Mjk1QzM4LjUwMjYgMTMuODA3MSAzNy44OTc5IDE0LjIxNTIgMzcuMzc0OCAxNC43NTM5QzM2Ljg2ODIgMTUuMjc2NCAzNi40Njc4IDE1LjkyMTIgMzYuMTczNiAxNi42ODg1QzM1Ljg3OTQgMTcuNDU1OCAzNS43MzIzIDE4LjMzNzQgMzUuNzMyMyAxOS4zMzMyVjE5LjcyNUMzNS43MzIzIDIwLjczNzIgMzUuODc5NCAyMS42MjcgMzYuMTczNiAyMi4zOTQyQzM2LjQ2NzggMjMuMTYxNSAzNi44NjgyIDIzLjgxNDYgMzcuMzc0OCAyNC4zNTMzQzM3Ljg5NzkgMjQuODc1NyAzOC41MDI2IDI1LjI3NTcgMzkuMTg5IDI1LjU1MzJDMzkuODc1NSAyNS44MTQ0IDQwLjYxOTEgMjUuOTQ1IDQxLjQyIDI1Ljk0NUM0Mi4xODgxIDI1Ljk0NSA0Mi45MTU0IDI1Ljc0OTEgNDMuNjAxOSAyNS4zNTczQzQ0LjI3NTEgMjQuOTgyIDQ0LjgwNTggMjQuNDExOSA0NS4xOTQxIDIzLjY0NzFDNDUuMjI1NSAyMy41ODUyIDQ1LjI4ODYgMjMuNTQ1MiA0NS4zNTggMjMuNTQ1Mkg0NS4zOTE3QzQ1LjQ3MjggMjMuNTQ1MiA0NS41Mzg2IDIzLjYxMSA0NS41Mzg2IDIzLjY5MjFDNDUuNTM4NiAyMy43OTA0IDQ1LjU0NCAyMy44ODU2IDQ1LjU1NDcgMjMuOTc3N1YyNS4xMzkyQzQ1LjU1NDcgMjUuMzkwNCA0NS43NTg0IDI1LjU5NDEgNDYuMDA5NiAyNS41OTQxSDQ3LjIyNjFDNDcuMjkxNCAyNS41OTk1IDQ3LjM1ODEgMjUuNjAyMiA0Ny40MjYzIDI1LjYwMjJINDguNTM3SDQ4LjcyNTdINTcuNzI2OEM1Ny44Nzc3IDI1LjYwMjIgNTggMjUuNDc5OSA1OCAyNS4zMjlWMjQuMTEyMkM1OCAyMy45NjE0IDU3Ljg3NzcgMjMuODM5IDU3LjcyNjggMjMuODM5SDU1LjMxNzRDNTUuMTY2NSAyMy44MzkgNTUuMDQ0MiAyMy43MTY3IDU1LjA0NDIgMjMuNTY1OVY4LjczMzY4QzU1LjA0NDIgOC41ODI3OSA1NC45MjE5IDguNDYwNDggNTQuNzcxIDguNDYwNDhINTAuNTA1NEM1MC4zNTQ1IDguNDYwNDggNTAuMjMyMiA4LjU4Mjc5IDUwLjIzMjIgOC43MzM2OFY5Ljk1MDQzQzUwLjIzMjIgMTAuMTAxMyA1MC4zNTQ1IDEwLjIyMzYgNTAuNTA1NCAxMC4yMjM2SDUyLjg1ODhDNTMuMDA5NyAxMC4yMjM2IDUzLjEzMiAxMC4zNDU5IDUzLjEzMiAxMC40OTY4VjIzLjU2NTlDNTMuMTMyIDIzLjcxNjcgNTMuMDA5NyAyMy44MzkgNTIuODU4OCAyMy44MzlaTTQxLjYxNjEgMjQuMTMyOUM0Mi4xODgxIDI0LjEzMjkgNDIuNzExMSAyNC4wMjY4IDQzLjE4NTEgMjMuODE0NkM0My42NzU0IDIzLjYwMjMgNDQuMDkyMiAyMy4zMDAzIDQ0LjQzNTQgMjIuOTA4NUM0NC43Nzg2IDIyLjUxNjcgNDUuMDQ4MyAyMi4wNTE0IDQ1LjI0NDQgMjEuNTEyN0M0NS40NDA2IDIwLjk1NzYgNDUuNTM4NiAyMC4zNDU0IDQ1LjUzODYgMTkuNjc2MVYxOS4zODIyQzQ1LjUzODYgMTguNzI5MiA0NS40NDA2IDE4LjEzMzMgNDUuMjQ0NCAxNy41OTQ2QzQ1LjA0ODMgMTcuMDM5NSA0NC43NzA1IDE2LjU2NjEgNDQuNDEwOSAxNi4xNzQzQzQ0LjA2NzcgMTUuNzgyNCA0My42NTA5IDE1LjQ4MDQgNDMuMTYwNiAxNS4yNjgyQzQyLjY4NjYgMTUuMDM5NiA0Mi4xNzE4IDE0LjkyNTQgNDEuNjE2MSAxNC45MjU0QzQxLjA0NCAxNC45MjU0IDQwLjUyMSAxNS4wMzE1IDQwLjA0NzEgMTUuMjQzN0MzOS41NzMxIDE1LjQ1NTkgMzkuMTU2MyAxNS43NTggMzguNzk2OCAxNi4xNDk4QzM4LjQ1MzUgMTYuNTI1MiAzOC4xODM5IDE2Ljk5MDUgMzcuOTg3NyAxNy41NDU2QzM3Ljc5MTYgMTguMDg0MyAzNy42OTM2IDE4LjY4MDIgMzcuNjkzNiAxOS4zMzMyVjE5LjcyNUMzNy42OTM2IDIxLjExMjcgMzguMDUzMSAyMi4xOTgzIDM4Ljc3MjIgMjIuOTgyQzM5LjUwNzcgMjMuNzQ5MyA0MC40NTU3IDI0LjEzMjkgNDEuNjE2MSAyNC4xMzI5Wk0zMS4xMTE1IDI1LjQxOTFDMzEuMDczMiAyNS41Mjg3IDMwLjk2OTggMjUuNjAyMiAzMC44NTM2IDI1LjYwMjJIMjcuNDY2MUMyNy4zNSAyNS42MDIyIDI3LjI0NjUgMjUuNTI4NyAyNy4yMDgyIDI1LjQxOTFMMjMuMTU3OCAxMy44MTkzQzIzLjA5NTggMTMuNjQxNyAyMy4yMjc2IDEzLjQ1NjEgMjMuNDE1NyAxMy40NTYxSDI1LjA4OUMyNS4yMDY4IDEzLjQ1NjEgMjUuMzExNCAxMy41MzE2IDI1LjM0ODQgMTMuNjQzNUwyOC45NjY2IDI0LjU4MUMyOC45OTQyIDI0LjY2NDMgMjkuMDcyMSAyNC43MjA2IDI5LjE1OTkgMjQuNzIwNkMyOS4yNDc3IDI0LjcyMDYgMjkuMzI1NiAyNC42NjQzIDI5LjM1MzIgMjQuNTgxTDMyLjk3MTQgMTMuNjQzNUMzMy4wMDg0IDEzLjUzMTYgMzMuMTEyOSAxMy40NTYxIDMzLjIzMDggMTMuNDU2MUgzNC45MDQxQzM1LjA5MjIgMTMuNDU2MSAzNS4yMjQgMTMuNjQxNyAzNS4xNjIgMTMuODE5M0wzMS4xMTE1IDI1LjQxOTFaIixmaWxsOiJjdXJyZW50Q29sb3IifSksXy5qc3hzKCJkZWZzIix7Y2hpbGRyZW46W18uanN4cygiZmlsdGVyIix7aWQ6ImZpbHRlcjBfZF8yMV8xNjc3Iix4OiIwLjEyNDcyMiIseToiMC4xMjQ3MjIiLHdpZHRoOiIyMi43NzI5IixoZWlnaHQ6IjMzLjYwOTciLGZpbHRlclVuaXRzOiJ1c2VyU3BhY2VPblVzZSIsY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyczoic1JHQiIsY2hpbGRyZW46W18uanN4KCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSxfLmpzeCgiZmVDb2xvck1hdHJpeCIse2luOiJTb3VyY2VBbHBoYSIsdHlwZToibWF0cml4Iix2YWx1ZXM6IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIixyZXN1bHQ6ImhhcmRBbHBoYSJ9KSxfLmpzeCgiZmVPZmZzZXQiLHt9KSxfLmpzeCgiZmVHYXVzc2lhbkJsdXIiLHtzdGREZXZpYXRpb246IjIuNDM3NjQifSksXy5qc3goImZlQ29tcG9zaXRlIix7aW4yOiJoYXJkQWxwaGEiLG9wZXJhdG9yOiJvdXQifSksXy5qc3goImZlQ29sb3JNYXRyaXgiLHt0eXBlOiJtYXRyaXgiLHZhbHVlczoiMCAwIDAgMCAwLjIxOTYwOCAwIDAgMCAwIDAuODAzOTIyIDAgMCAwIDAgMC41MDE5NjEgMCAwIDAgMC4zIDAifSksXy5qc3goImZlQmxlbmQiLHttb2RlOiJub3JtYWwiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6ImVmZmVjdDFfZHJvcFNoYWRvd18yMV8xNjc3In0pLF8uanN4KCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjoiU291cmNlR3JhcGhpYyIsaW4yOiJlZmZlY3QxX2Ryb3BTaGFkb3dfMjFfMTY3NyIscmVzdWx0OiJzaGFwZSJ9KV19KSxfLmpzeHMoImZpbHRlciIse2lkOiJmaWx0ZXIxX2lfMjFfMTY3NyIseDoiOS4yODAwMyIseToiMjEuNTczOSIsd2lkdGg6IjQuMzcxMTIiLGhlaWdodDoiNC4zNzExMiIsZmlsdGVyVW5pdHM6InVzZXJTcGFjZU9uVXNlIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJzUkdCIixjaGlsZHJlbjpbXy5qc3goImZlRmxvb2QiLHtmbG9vZE9wYWNpdHk6IjAiLHJlc3VsdDoiQmFja2dyb3VuZEltYWdlRml4In0pLF8uanN4KCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjoiU291cmNlR3JhcGhpYyIsaW4yOiJCYWNrZ3JvdW5kSW1hZ2VGaXgiLHJlc3VsdDoic2hhcGUifSksXy5qc3goImZlQ29sb3JNYXRyaXgiLHtpbjoiU291cmNlQWxwaGEiLHR5cGU6Im1hdHJpeCIsdmFsdWVzOiIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMCIscmVzdWx0OiJoYXJkQWxwaGEifSksXy5qc3goImZlT2Zmc2V0Iix7fSksXy5qc3goImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIwLjU0NjM5MiJ9KSxfLmpzeCgiZmVDb21wb3NpdGUiLHtpbjI6ImhhcmRBbHBoYSIsb3BlcmF0b3I6ImFyaXRobWV0aWMiLGsyOiItMSIsazM6IjEifSksXy5qc3goImZlQ29sb3JNYXRyaXgiLHt0eXBlOiJtYXRyaXgiLHZhbHVlczoiMCAwIDAgMCAwLjIxOTYwOCAwIDAgMCAwIDAuODAzOTIyIDAgMCAwIDAgMC41MDE5NjEgMCAwIDAgMC4zIDAifSksXy5qc3goImZlQmxlbmQiLHttb2RlOiJub3JtYWwiLGluMjoic2hhcGUiLHJlc3VsdDoiZWZmZWN0MV9pbm5lclNoYWRvd18yMV8xNjc3In0pXX0pXX0pXX0pLEdFPW0zLFlFPSJTd2l0Y2giLFt2MyxVNF09VGkoWUUpLFt5Myx4M109djMoWUUpLHczPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTd2l0Y2g6bixuYW1lOnIsY2hlY2tlZDpvLGRlZmF1bHRDaGVja2VkOmkscmVxdWlyZWQ6bCxkaXNhYmxlZDpzLHZhbHVlOmE9Im9uIixvbkNoZWNrZWRDaGFuZ2U6dSwuLi5jfT1lLFtkLGZdPXAudXNlU3RhdGUobnVsbCksaD1RZSh0LHk9PmYoeSkpLG09cC51c2VSZWYoITEpLGc9ZD8hIWQuY2xvc2VzdCgiZm9ybSIpOiEwLFtTPSExLHZdPUFsKHtwcm9wOm8sZGVmYXVsdFByb3A6aSxvbkNoYW5nZTp1fSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudCh5Myx7c2NvcGU6bixjaGVja2VkOlMsZGlzYWJsZWQ6c30scC5jcmVhdGVFbGVtZW50KExlLmJ1dHRvbix0ZSh7dHlwZToiYnV0dG9uIixyb2xlOiJzd2l0Y2giLCJhcmlhLWNoZWNrZWQiOlMsImFyaWEtcmVxdWlyZWQiOmwsImRhdGEtc3RhdGUiOlhFKFMpLCJkYXRhLWRpc2FibGVkIjpzPyIiOnZvaWQgMCxkaXNhYmxlZDpzLHZhbHVlOmF9LGMse3JlZjpoLG9uQ2xpY2s6SGUoZS5vbkNsaWNrLHk9Pnt2KHg9PiF4KSxnJiYobS5jdXJyZW50PXkuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSxtLmN1cnJlbnR8fHkuc3RvcFByb3BhZ2F0aW9uKCkpfSl9KSksZyYmcC5jcmVhdGVFbGVtZW50KEUzLHtjb250cm9sOmQsYnViYmxlczohbS5jdXJyZW50LG5hbWU6cix2YWx1ZTphLGNoZWNrZWQ6UyxyZXF1aXJlZDpsLGRpc2FibGVkOnMsc3R5bGU6e3RyYW5zZm9ybToidHJhbnNsYXRlWCgtMTAwJSkifX0pKX0pLF8zPSJTd2l0Y2hUaHVtYiIsUzM9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVN3aXRjaDpuLC4uLnJ9PWUsbz14MyhfMyxuKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KExlLnNwYW4sdGUoeyJkYXRhLXN0YXRlIjpYRShvLmNoZWNrZWQpLCJkYXRhLWRpc2FibGVkIjpvLmRpc2FibGVkPyIiOnZvaWQgMH0scix7cmVmOnR9KSl9KSxFMz1lPT57Y29uc3R7Y29udHJvbDp0LGNoZWNrZWQ6bixidWJibGVzOnI9ITAsLi4ub309ZSxpPXAudXNlUmVmKG51bGwpLGw9U0Uobikscz1nRSh0KTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBhPWkuY3VycmVudCx1PXdpbmRvdy5IVE1MSW5wdXRFbGVtZW50LnByb3RvdHlwZSxkPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodSwiY2hlY2tlZCIpLnNldDtpZihsIT09biYmZCl7Y29uc3QgZj1uZXcgRXZlbnQoImNsaWNrIix7YnViYmxlczpyfSk7ZC5jYWxsKGEsbiksYS5kaXNwYXRjaEV2ZW50KGYpfX0sW2wsbixyXSkscC5jcmVhdGVFbGVtZW50KCJpbnB1dCIsdGUoe3R5cGU6ImNoZWNrYm94IiwiYXJpYS1oaWRkZW4iOiEwLGRlZmF1bHRDaGVja2VkOm59LG8se3RhYkluZGV4Oi0xLHJlZjppLHN0eWxlOnsuLi5lLnN0eWxlLC4uLnMscG9zaXRpb246ImFic29sdXRlIixwb2ludGVyRXZlbnRzOiJub25lIixvcGFjaXR5OjAsbWFyZ2luOjB9fSkpfTtmdW5jdGlvbiBYRShlKXtyZXR1cm4gZT8iY2hlY2tlZCI6InVuY2hlY2tlZCJ9Y29uc3QgUUU9dzMsQzM9UzMsUHA9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9Pl8uanN4KFFFLHtjbGFzc05hbWU6aXQoInBlZXIgaW5saW5lLWZsZXggaC1bMjJweF0gdy1bNDRweF0gc2hyaW5rLTAgY3Vyc29yLXBvaW50ZXIgaXRlbXMtY2VudGVyIHJvdW5kZWQtZnVsbCBib3JkZXItMiBib3JkZXItdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1jb2xvcnMgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLW9mZnNldC0yIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtYmFja2dyb3VuZCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCBkYXRhLVtzdGF0ZT1jaGVja2VkXTpiZy1hY2NlbnQgZGF0YS1bc3RhdGU9dW5jaGVja2VkXTpiZy1wcmltYXJ5IixlKSwuLi50LHJlZjpuLGNoaWxkcmVuOl8uanN4KEMzLHtjbGFzc05hbWU6aXQoInBvaW50ZXItZXZlbnRzLW5vbmUgYmxvY2sgaC1bMThweF0gdy01IHJvdW5kZWQtZnVsbCBiZy1iYWNrZ3JvdW5kIHNoYWRvdy1sZyByaW5nLTAgdHJhbnNpdGlvbi10cmFuc2Zvcm0gZGF0YS1bc3RhdGU9Y2hlY2tlZF06dHJhbnNsYXRlLXgtNSBkYXRhLVtzdGF0ZT11bmNoZWNrZWRdOnRyYW5zbGF0ZS14LTAiKX0pfSkpO1BwLmRpc3BsYXlOYW1lPVFFLmRpc3BsYXlOYW1lO2NvbnN0IExtPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT5fLmpzeCgiZGl2Iix7cmVmOm4sY2xhc3NOYW1lOml0KCJyb3VuZGVkLWxnIGJvcmRlciBiZy1jYXJkIHRleHQtY2FyZC1mb3JlZ3JvdW5kIHNoYWRvdy1zbSIsZSksLi4udH0pKTtMbS5kaXNwbGF5TmFtZT0iQ2FyZCI7Y29uc3QgJDM9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9Pl8uanN4KCJkaXYiLHtyZWY6bixjbGFzc05hbWU6aXQoImZsZXggZmxleC1jb2wgc3BhY2UteS0xLjUgcC02IixlKSwuLi50fSkpOyQzLmRpc3BsYXlOYW1lPSJDYXJkSGVhZGVyIjtjb25zdCBrMz1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+Xy5qc3goImgzIix7cmVmOm4sY2xhc3NOYW1lOml0KCJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIGxlYWRpbmctbm9uZSB0cmFja2luZy10aWdodCIsZSksLi4udH0pKTtrMy5kaXNwbGF5TmFtZT0iQ2FyZFRpdGxlIjtjb25zdCBUMz1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+Xy5qc3goInAiLHtyZWY6bixjbGFzc05hbWU6aXQoInRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIixlKSwuLi50fSkpO1QzLmRpc3BsYXlOYW1lPSJDYXJkRGVzY3JpcHRpb24iO2NvbnN0IGIzPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT5fLmpzeCgiZGl2Iix7cmVmOm4sY2xhc3NOYW1lOml0KCJwLTYgcHQtMCIsZSksLi4udH0pKTtiMy5kaXNwbGF5TmFtZT0iQ2FyZENvbnRlbnQiO2NvbnN0IE4zPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT5fLmpzeCgiZGl2Iix7cmVmOm4sY2xhc3NOYW1lOml0KCJmbGV4IGl0ZW1zLWNlbnRlciBwLTYgcHQtMCIsZSksLi4udH0pKTtOMy5kaXNwbGF5TmFtZT0iQ2FyZEZvb3RlciI7LyoqCiAqIEByZW1peC1ydW4vcm91dGVyIHYxLjExLjAKICoKICogQ29weXJpZ2h0IChjKSBSZW1peCBTb2Z0d2FyZSBJbmMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFLm1kIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqCiAqIEBsaWNlbnNlIE1JVAogKi9mdW5jdGlvbiBvdCgpe3JldHVybiBvdD1PYmplY3QuYXNzaWduP09iamVjdC5hc3NpZ24uYmluZCgpOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LG90LmFwcGx5KHRoaXMsYXJndW1lbnRzKX12YXIgc3Q7KGZ1bmN0aW9uKGUpe2UuUG9wPSJQT1AiLGUuUHVzaD0iUFVTSCIsZS5SZXBsYWNlPSJSRVBMQUNFIn0pKHN0fHwoc3Q9e30pKTtjb25zdCBqMD0icG9wc3RhdGUiO2Z1bmN0aW9uIFIzKGUpe2U9PT12b2lkIDAmJihlPXt9KTtmdW5jdGlvbiB0KHIsbyl7bGV0e3BhdGhuYW1lOmksc2VhcmNoOmwsaGFzaDpzfT1yLmxvY2F0aW9uO3JldHVybiAkYSgiIix7cGF0aG5hbWU6aSxzZWFyY2g6bCxoYXNoOnN9LG8uc3RhdGUmJm8uc3RhdGUudXNyfHxudWxsLG8uc3RhdGUmJm8uc3RhdGUua2V5fHwiZGVmYXVsdCIpfWZ1bmN0aW9uIG4ocixvKXtyZXR1cm4gdHlwZW9mIG89PSJzdHJpbmciP286VWEobyl9cmV0dXJuIE8zKHQsbixudWxsLGUpfWZ1bmN0aW9uIFNlKGUsdCl7aWYoZT09PSExfHxlPT09bnVsbHx8dHlwZW9mIGU+InUiKXRocm93IG5ldyBFcnJvcih0KX1mdW5jdGlvbiB3aShlLHQpe2lmKCFlKXt0eXBlb2YgY29uc29sZTwidSImJmNvbnNvbGUud2Fybih0KTt0cnl7dGhyb3cgbmV3IEVycm9yKHQpfWNhdGNoe319fWZ1bmN0aW9uIFAzKCl7cmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLDgpfWZ1bmN0aW9uIHowKGUsdCl7cmV0dXJue3VzcjplLnN0YXRlLGtleTplLmtleSxpZHg6dH19ZnVuY3Rpb24gJGEoZSx0LG4scil7cmV0dXJuIG49PT12b2lkIDAmJihuPW51bGwpLG90KHtwYXRobmFtZTp0eXBlb2YgZT09InN0cmluZyI/ZTplLnBhdGhuYW1lLHNlYXJjaDoiIixoYXNoOiIifSx0eXBlb2YgdD09InN0cmluZyI/cXIodCk6dCx7c3RhdGU6bixrZXk6dCYmdC5rZXl8fHJ8fFAzKCl9KX1mdW5jdGlvbiBVYShlKXtsZXR7cGF0aG5hbWU6dD0iLyIsc2VhcmNoOm49IiIsaGFzaDpyPSIifT1lO3JldHVybiBuJiZuIT09Ij8iJiYodCs9bi5jaGFyQXQoMCk9PT0iPyI/bjoiPyIrbiksciYmciE9PSIjIiYmKHQrPXIuY2hhckF0KDApPT09IiMiP3I6IiMiK3IpLHR9ZnVuY3Rpb24gcXIoZSl7bGV0IHQ9e307aWYoZSl7bGV0IG49ZS5pbmRleE9mKCIjIik7bj49MCYmKHQuaGFzaD1lLnN1YnN0cihuKSxlPWUuc3Vic3RyKDAsbikpO2xldCByPWUuaW5kZXhPZigiPyIpO3I+PTAmJih0LnNlYXJjaD1lLnN1YnN0cihyKSxlPWUuc3Vic3RyKDAscikpLGUmJih0LnBhdGhuYW1lPWUpfXJldHVybiB0fWZ1bmN0aW9uIE8zKGUsdCxuLHIpe3I9PT12b2lkIDAmJihyPXt9KTtsZXR7d2luZG93Om89ZG9jdW1lbnQuZGVmYXVsdFZpZXcsdjVDb21wYXQ6aT0hMX09cixsPW8uaGlzdG9yeSxzPXN0LlBvcCxhPW51bGwsdT1jKCk7dT09bnVsbCYmKHU9MCxsLnJlcGxhY2VTdGF0ZShvdCh7fSxsLnN0YXRlLHtpZHg6dX0pLCIiKSk7ZnVuY3Rpb24gYygpe3JldHVybihsLnN0YXRlfHx7aWR4Om51bGx9KS5pZHh9ZnVuY3Rpb24gZCgpe3M9c3QuUG9wO2xldCBTPWMoKSx2PVM9PW51bGw/bnVsbDpTLXU7dT1TLGEmJmEoe2FjdGlvbjpzLGxvY2F0aW9uOmcubG9jYXRpb24sZGVsdGE6dn0pfWZ1bmN0aW9uIGYoUyx2KXtzPXN0LlB1c2g7bGV0IHk9JGEoZy5sb2NhdGlvbixTLHYpO24mJm4oeSxTKSx1PWMoKSsxO2xldCB4PXowKHksdSksdz1nLmNyZWF0ZUhyZWYoeSk7dHJ5e2wucHVzaFN0YXRlKHgsIiIsdyl9Y2F0Y2goayl7aWYoayBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiYmay5uYW1lPT09IkRhdGFDbG9uZUVycm9yIil0aHJvdyBrO28ubG9jYXRpb24uYXNzaWduKHcpfWkmJmEmJmEoe2FjdGlvbjpzLGxvY2F0aW9uOmcubG9jYXRpb24sZGVsdGE6MX0pfWZ1bmN0aW9uIGgoUyx2KXtzPXN0LlJlcGxhY2U7bGV0IHk9JGEoZy5sb2NhdGlvbixTLHYpO24mJm4oeSxTKSx1PWMoKTtsZXQgeD16MCh5LHUpLHc9Zy5jcmVhdGVIcmVmKHkpO2wucmVwbGFjZVN0YXRlKHgsIiIsdyksaSYmYSYmYSh7YWN0aW9uOnMsbG9jYXRpb246Zy5sb2NhdGlvbixkZWx0YTowfSl9ZnVuY3Rpb24gbShTKXtsZXQgdj1vLmxvY2F0aW9uLm9yaWdpbiE9PSJudWxsIj9vLmxvY2F0aW9uLm9yaWdpbjpvLmxvY2F0aW9uLmhyZWYseT10eXBlb2YgUz09InN0cmluZyI/UzpVYShTKTtyZXR1cm4gU2UodiwiTm8gd2luZG93LmxvY2F0aW9uLihvcmlnaW58aHJlZikgYXZhaWxhYmxlIHRvIGNyZWF0ZSBVUkwgZm9yIGhyZWY6ICIreSksbmV3IFVSTCh5LHYpfWxldCBnPXtnZXQgYWN0aW9uKCl7cmV0dXJuIHN9LGdldCBsb2NhdGlvbigpe3JldHVybiBlKG8sbCl9LGxpc3RlbihTKXtpZihhKXRocm93IG5ldyBFcnJvcigiQSBoaXN0b3J5IG9ubHkgYWNjZXB0cyBvbmUgYWN0aXZlIGxpc3RlbmVyIik7cmV0dXJuIG8uYWRkRXZlbnRMaXN0ZW5lcihqMCxkKSxhPVMsKCk9PntvLnJlbW92ZUV2ZW50TGlzdGVuZXIoajAsZCksYT1udWxsfX0sY3JlYXRlSHJlZihTKXtyZXR1cm4gdChvLFMpfSxjcmVhdGVVUkw6bSxlbmNvZGVMb2NhdGlvbihTKXtsZXQgdj1tKFMpO3JldHVybntwYXRobmFtZTp2LnBhdGhuYW1lLHNlYXJjaDp2LnNlYXJjaCxoYXNoOnYuaGFzaH19LHB1c2g6ZixyZXBsYWNlOmgsZ28oUyl7cmV0dXJuIGwuZ28oUyl9fTtyZXR1cm4gZ312YXIgYXQ7KGZ1bmN0aW9uKGUpe2UuZGF0YT0iZGF0YSIsZS5kZWZlcnJlZD0iZGVmZXJyZWQiLGUucmVkaXJlY3Q9InJlZGlyZWN0IixlLmVycm9yPSJlcnJvciJ9KShhdHx8KGF0PXt9KSk7Y29uc3QgQTM9bmV3IFNldChbImxhenkiLCJjYXNlU2Vuc2l0aXZlIiwicGF0aCIsImlkIiwiaW5kZXgiLCJjaGlsZHJlbiJdKTtmdW5jdGlvbiBNMyhlKXtyZXR1cm4gZS5pbmRleD09PSEwfWZ1bmN0aW9uIE9wKGUsdCxuLHIpe3JldHVybiBuPT09dm9pZCAwJiYobj1bXSkscj09PXZvaWQgMCYmKHI9e30pLGUubWFwKChvLGkpPT57bGV0IGw9Wy4uLm4saV0scz10eXBlb2Ygby5pZD09InN0cmluZyI/by5pZDpsLmpvaW4oIi0iKTtpZihTZShvLmluZGV4IT09ITB8fCFvLmNoaWxkcmVuLCJDYW5ub3Qgc3BlY2lmeSBjaGlsZHJlbiBvbiBhbiBpbmRleCByb3V0ZSIpLFNlKCFyW3NdLCdGb3VuZCBhIHJvdXRlIGlkIGNvbGxpc2lvbiBvbiBpZCAiJytzK2AiLiAgUm91dGUgaWQncyBtdXN0IGJlIGdsb2JhbGx5IHVuaXF1ZSB3aXRoaW4gRGF0YSBSb3V0ZXIgdXNhZ2VzYCksTTMobykpe2xldCBhPW90KHt9LG8sdChvKSx7aWQ6c30pO3JldHVybiByW3NdPWEsYX1lbHNle2xldCBhPW90KHt9LG8sdChvKSx7aWQ6cyxjaGlsZHJlbjp2b2lkIDB9KTtyZXR1cm4gcltzXT1hLG8uY2hpbGRyZW4mJihhLmNoaWxkcmVuPU9wKG8uY2hpbGRyZW4sdCxsLHIpKSxhfX0pfWZ1bmN0aW9uIGxsKGUsdCxuKXtuPT09dm9pZCAwJiYobj0iLyIpO2xldCByPXR5cGVvZiB0PT0ic3RyaW5nIj9xcih0KTp0LG89VmEoci5wYXRobmFtZXx8Ii8iLG4pO2lmKG89PW51bGwpcmV0dXJuIG51bGw7bGV0IGk9SkUoZSk7RDMoaSk7bGV0IGw9bnVsbDtmb3IobGV0IHM9MDtsPT1udWxsJiZzPGkubGVuZ3RoOysrcylsPUgzKGlbc10sWTMobykpO3JldHVybiBsfWZ1bmN0aW9uIEwzKGUsdCl7bGV0e3JvdXRlOm4scGF0aG5hbWU6cixwYXJhbXM6b309ZTtyZXR1cm57aWQ6bi5pZCxwYXRobmFtZTpyLHBhcmFtczpvLGRhdGE6dFtuLmlkXSxoYW5kbGU6bi5oYW5kbGV9fWZ1bmN0aW9uIEpFKGUsdCxuLHIpe3Q9PT12b2lkIDAmJih0PVtdKSxuPT09dm9pZCAwJiYobj1bXSkscj09PXZvaWQgMCYmKHI9IiIpO2xldCBvPShpLGwscyk9PntsZXQgYT17cmVsYXRpdmVQYXRoOnM9PT12b2lkIDA/aS5wYXRofHwiIjpzLGNhc2VTZW5zaXRpdmU6aS5jYXNlU2Vuc2l0aXZlPT09ITAsY2hpbGRyZW5JbmRleDpsLHJvdXRlOml9O2EucmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoIi8iKSYmKFNlKGEucmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgociksJ0Fic29sdXRlIHJvdXRlIHBhdGggIicrYS5yZWxhdGl2ZVBhdGgrJyIgbmVzdGVkIHVuZGVyIHBhdGggJysoJyInK3IrJyIgaXMgbm90IHZhbGlkLiBBbiBhYnNvbHV0ZSBjaGlsZCByb3V0ZSBwYXRoICcpKyJtdXN0IHN0YXJ0IHdpdGggdGhlIGNvbWJpbmVkIHBhdGggb2YgYWxsIGl0cyBwYXJlbnQgcm91dGVzLiIpLGEucmVsYXRpdmVQYXRoPWEucmVsYXRpdmVQYXRoLnNsaWNlKHIubGVuZ3RoKSk7bGV0IHU9Ym8oW3IsYS5yZWxhdGl2ZVBhdGhdKSxjPW4uY29uY2F0KGEpO2kuY2hpbGRyZW4mJmkuY2hpbGRyZW4ubGVuZ3RoPjAmJihTZShpLmluZGV4IT09ITAsIkluZGV4IHJvdXRlcyBtdXN0IG5vdCBoYXZlIGNoaWxkIHJvdXRlcy4gUGxlYXNlIHJlbW92ZSAiKygnYWxsIGNoaWxkIHJvdXRlcyBmcm9tIHJvdXRlIHBhdGggIicrdSsnIi4nKSksSkUoaS5jaGlsZHJlbix0LGMsdSkpLCEoaS5wYXRoPT1udWxsJiYhaS5pbmRleCkmJnQucHVzaCh7cGF0aDp1LHNjb3JlOlUzKHUsaS5pbmRleCkscm91dGVzTWV0YTpjfSl9O3JldHVybiBlLmZvckVhY2goKGksbCk9Pnt2YXIgcztpZihpLnBhdGg9PT0iInx8ISgocz1pLnBhdGgpIT1udWxsJiZzLmluY2x1ZGVzKCI/IikpKW8oaSxsKTtlbHNlIGZvcihsZXQgYSBvZiBaRShpLnBhdGgpKW8oaSxsLGEpfSksdH1mdW5jdGlvbiBaRShlKXtsZXQgdD1lLnNwbGl0KCIvIik7aWYodC5sZW5ndGg9PT0wKXJldHVybltdO2xldFtuLC4uLnJdPXQsbz1uLmVuZHNXaXRoKCI/IiksaT1uLnJlcGxhY2UoL1w/JC8sIiIpO2lmKHIubGVuZ3RoPT09MClyZXR1cm4gbz9baSwiIl06W2ldO2xldCBsPVpFKHIuam9pbigiLyIpKSxzPVtdO3JldHVybiBzLnB1c2goLi4ubC5tYXAoYT0+YT09PSIiP2k6W2ksYV0uam9pbigiLyIpKSksbyYmcy5wdXNoKC4uLmwpLHMubWFwKGE9PmUuc3RhcnRzV2l0aCgiLyIpJiZhPT09IiI/Ii8iOmEpfWZ1bmN0aW9uIEQzKGUpe2Uuc29ydCgodCxuKT0+dC5zY29yZSE9PW4uc2NvcmU/bi5zY29yZS10LnNjb3JlOlYzKHQucm91dGVzTWV0YS5tYXAocj0+ci5jaGlsZHJlbkluZGV4KSxuLnJvdXRlc01ldGEubWFwKHI9PnIuY2hpbGRyZW5JbmRleCkpKX1jb25zdCBJMz0vXjpcdyskLyxqMz0zLHozPTIsRjM9MSxCMz0xMCxXMz0tMixGMD1lPT5lPT09IioiO2Z1bmN0aW9uIFUzKGUsdCl7bGV0IG49ZS5zcGxpdCgiLyIpLHI9bi5sZW5ndGg7cmV0dXJuIG4uc29tZShGMCkmJihyKz1XMyksdCYmKHIrPXozKSxuLmZpbHRlcihvPT4hRjAobykpLnJlZHVjZSgobyxpKT0+bysoSTMudGVzdChpKT9qMzppPT09IiI/RjM6QjMpLHIpfWZ1bmN0aW9uIFYzKGUsdCl7cmV0dXJuIGUubGVuZ3RoPT09dC5sZW5ndGgmJmUuc2xpY2UoMCwtMSkuZXZlcnkoKHIsbyk9PnI9PT10W29dKT9lW2UubGVuZ3RoLTFdLXRbdC5sZW5ndGgtMV06MH1mdW5jdGlvbiBIMyhlLHQpe2xldHtyb3V0ZXNNZXRhOm59PWUscj17fSxvPSIvIixpPVtdO2ZvcihsZXQgbD0wO2w8bi5sZW5ndGg7KytsKXtsZXQgcz1uW2xdLGE9bD09PW4ubGVuZ3RoLTEsdT1vPT09Ii8iP3Q6dC5zbGljZShvLmxlbmd0aCl8fCIvIixjPUszKHtwYXRoOnMucmVsYXRpdmVQYXRoLGNhc2VTZW5zaXRpdmU6cy5jYXNlU2Vuc2l0aXZlLGVuZDphfSx1KTtpZighYylyZXR1cm4gbnVsbDtPYmplY3QuYXNzaWduKHIsYy5wYXJhbXMpO2xldCBkPXMucm91dGU7aS5wdXNoKHtwYXJhbXM6cixwYXRobmFtZTpibyhbbyxjLnBhdGhuYW1lXSkscGF0aG5hbWVCYXNlOlozKGJvKFtvLGMucGF0aG5hbWVCYXNlXSkpLHJvdXRlOmR9KSxjLnBhdGhuYW1lQmFzZSE9PSIvIiYmKG89Ym8oW28sYy5wYXRobmFtZUJhc2VdKSl9cmV0dXJuIGl9ZnVuY3Rpb24gSzMoZSx0KXt0eXBlb2YgZT09InN0cmluZyImJihlPXtwYXRoOmUsY2FzZVNlbnNpdGl2ZTohMSxlbmQ6ITB9KTtsZXRbbixyXT1HMyhlLnBhdGgsZS5jYXNlU2Vuc2l0aXZlLGUuZW5kKSxvPXQubWF0Y2gobik7aWYoIW8pcmV0dXJuIG51bGw7bGV0IGk9b1swXSxsPWkucmVwbGFjZSgvKC4pXC8rJC8sIiQxIikscz1vLnNsaWNlKDEpO3JldHVybntwYXJhbXM6ci5yZWR1Y2UoKHUsYyxkKT0+e2xldHtwYXJhbU5hbWU6Zixpc09wdGlvbmFsOmh9PWM7aWYoZj09PSIqIil7bGV0IGc9c1tkXXx8IiI7bD1pLnNsaWNlKDAsaS5sZW5ndGgtZy5sZW5ndGgpLnJlcGxhY2UoLyguKVwvKyQvLCIkMSIpfWNvbnN0IG09c1tkXTtyZXR1cm4gaCYmIW0/dVtmXT12b2lkIDA6dVtmXT1YMyhtfHwiIixmKSx1fSx7fSkscGF0aG5hbWU6aSxwYXRobmFtZUJhc2U6bCxwYXR0ZXJuOmV9fWZ1bmN0aW9uIEczKGUsdCxuKXt0PT09dm9pZCAwJiYodD0hMSksbj09PXZvaWQgMCYmKG49ITApLHdpKGU9PT0iKiJ8fCFlLmVuZHNXaXRoKCIqIil8fGUuZW5kc1dpdGgoIi8qIiksJ1JvdXRlIHBhdGggIicrZSsnIiB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgaXQgd2VyZSAnKygnIicrZS5yZXBsYWNlKC9cKiQvLCIvKiIpKyciIGJlY2F1c2UgdGhlIGAqYCBjaGFyYWN0ZXIgbXVzdCAnKSsiYWx3YXlzIGZvbGxvdyBhIGAvYCBpbiB0aGUgcGF0dGVybi4gVG8gZ2V0IHJpZCBvZiB0aGlzIHdhcm5pbmcsICIrKCdwbGVhc2UgY2hhbmdlIHRoZSByb3V0ZSBwYXRoIHRvICInK2UucmVwbGFjZSgvXCokLywiLyoiKSsnIi4nKSk7bGV0IHI9W10sbz0iXiIrZS5yZXBsYWNlKC9cLypcKj8kLywiIikucmVwbGFjZSgvXlwvKi8sIi8iKS5yZXBsYWNlKC9bXFwuKiteJHt9fCgpW1xdXS9nLCJcXCQmIikucmVwbGFjZSgvXC86KFx3KykoXD8pPy9nLChsLHMsYSk9PihyLnB1c2goe3BhcmFtTmFtZTpzLGlzT3B0aW9uYWw6YSE9bnVsbH0pLGE/Ii8/KFteXFwvXSspPyI6Ii8oW15cXC9dKykiKSk7cmV0dXJuIGUuZW5kc1dpdGgoIioiKT8oci5wdXNoKHtwYXJhbU5hbWU6IioifSksbys9ZT09PSIqInx8ZT09PSIvKiI/IiguKikkIjoiKD86XFwvKC4rKXxcXC8qKSQiKTpuP28rPSJcXC8qJCI6ZSE9PSIiJiZlIT09Ii8iJiYobys9Iig/Oig/PVxcL3wkKSkiKSxbbmV3IFJlZ0V4cChvLHQ/dm9pZCAwOiJpIikscl19ZnVuY3Rpb24gWTMoZSl7dHJ5e3JldHVybiBkZWNvZGVVUkkoZSl9Y2F0Y2godCl7cmV0dXJuIHdpKCExLCdUaGUgVVJMIHBhdGggIicrZSsnIiBjb3VsZCBub3QgYmUgZGVjb2RlZCBiZWNhdXNlIGl0IGlzIGlzIGEgbWFsZm9ybWVkIFVSTCBzZWdtZW50LiBUaGlzIGlzIHByb2JhYmx5IGR1ZSB0byBhIGJhZCBwZXJjZW50ICcrKCJlbmNvZGluZyAoIit0KyIpLiIpKSxlfX1mdW5jdGlvbiBYMyhlLHQpe3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGUpfWNhdGNoKG4pe3JldHVybiB3aSghMSwnVGhlIHZhbHVlIGZvciB0aGUgVVJMIHBhcmFtICInK3QrJyIgd2lsbCBub3QgYmUgZGVjb2RlZCBiZWNhdXNlJysoJyB0aGUgc3RyaW5nICInK2UrJyIgaXMgYSBtYWxmb3JtZWQgVVJMIHNlZ21lbnQuIFRoaXMgaXMgcHJvYmFibHknKSsoIiBkdWUgdG8gYSBiYWQgcGVyY2VudCBlbmNvZGluZyAoIituKyIpLiIpKSxlfX1mdW5jdGlvbiBWYShlLHQpe2lmKHQ9PT0iLyIpcmV0dXJuIGU7aWYoIWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHQudG9Mb3dlckNhc2UoKSkpcmV0dXJuIG51bGw7bGV0IG49dC5lbmRzV2l0aCgiLyIpP3QubGVuZ3RoLTE6dC5sZW5ndGgscj1lLmNoYXJBdChuKTtyZXR1cm4gciYmciE9PSIvIj9udWxsOmUuc2xpY2Uobil8fCIvIn1mdW5jdGlvbiBRMyhlLHQpe3Q9PT12b2lkIDAmJih0PSIvIik7bGV0e3BhdGhuYW1lOm4sc2VhcmNoOnI9IiIsaGFzaDpvPSIifT10eXBlb2YgZT09InN0cmluZyI/cXIoZSk6ZTtyZXR1cm57cGF0aG5hbWU6bj9uLnN0YXJ0c1dpdGgoIi8iKT9uOkozKG4sdCk6dCxzZWFyY2g6cTMociksaGFzaDplTShvKX19ZnVuY3Rpb24gSjMoZSx0KXtsZXQgbj10LnJlcGxhY2UoL1wvKyQvLCIiKS5zcGxpdCgiLyIpO3JldHVybiBlLnNwbGl0KCIvIikuZm9yRWFjaChvPT57bz09PSIuLiI/bi5sZW5ndGg+MSYmbi5wb3AoKTpvIT09Ii4iJiZuLnB1c2gobyl9KSxuLmxlbmd0aD4xP24uam9pbigiLyIpOiIvIn1mdW5jdGlvbiBNZihlLHQsbixyKXtyZXR1cm4iQ2Fubm90IGluY2x1ZGUgYSAnIitlKyInIGNoYXJhY3RlciBpbiBhIG1hbnVhbGx5IHNwZWNpZmllZCAiKygiYHRvLiIrdCsiYCBmaWVsZCBbIitKU09OLnN0cmluZ2lmeShyKSsiXS4gIFBsZWFzZSBzZXBhcmF0ZSBpdCBvdXQgdG8gdGhlICIpKygiYHRvLiIrbisiYCBmaWVsZC4gQWx0ZXJuYXRpdmVseSB5b3UgbWF5IHByb3ZpZGUgdGhlIGZ1bGwgcGF0aCBhcyAiKSsnYSBzdHJpbmcgaW4gPExpbmsgdG89Ii4uLiI+IGFuZCB0aGUgcm91dGVyIHdpbGwgcGFyc2UgaXQgZm9yIHlvdS4nfWZ1bmN0aW9uIERtKGUpe3JldHVybiBlLmZpbHRlcigodCxuKT0+bj09PTB8fHQucm91dGUucGF0aCYmdC5yb3V0ZS5wYXRoLmxlbmd0aD4wKX1mdW5jdGlvbiBxRShlLHQsbixyKXtyPT09dm9pZCAwJiYocj0hMSk7bGV0IG87dHlwZW9mIGU9PSJzdHJpbmciP289cXIoZSk6KG89b3Qoe30sZSksU2UoIW8ucGF0aG5hbWV8fCFvLnBhdGhuYW1lLmluY2x1ZGVzKCI/IiksTWYoIj8iLCJwYXRobmFtZSIsInNlYXJjaCIsbykpLFNlKCFvLnBhdGhuYW1lfHwhby5wYXRobmFtZS5pbmNsdWRlcygiIyIpLE1mKCIjIiwicGF0aG5hbWUiLCJoYXNoIixvKSksU2UoIW8uc2VhcmNofHwhby5zZWFyY2guaW5jbHVkZXMoIiMiKSxNZigiIyIsInNlYXJjaCIsImhhc2giLG8pKSk7bGV0IGk9ZT09PSIifHxvLnBhdGhuYW1lPT09IiIsbD1pPyIvIjpvLnBhdGhuYW1lLHM7aWYocnx8bD09bnVsbClzPW47ZWxzZXtsZXQgZD10Lmxlbmd0aC0xO2lmKGwuc3RhcnRzV2l0aCgiLi4iKSl7bGV0IGY9bC5zcGxpdCgiLyIpO2Zvcig7ZlswXT09PSIuLiI7KWYuc2hpZnQoKSxkLT0xO28ucGF0aG5hbWU9Zi5qb2luKCIvIil9cz1kPj0wP3RbZF06Ii8ifWxldCBhPVEzKG8scyksdT1sJiZsIT09Ii8iJiZsLmVuZHNXaXRoKCIvIiksYz0oaXx8bD09PSIuIikmJm4uZW5kc1dpdGgoIi8iKTtyZXR1cm4hYS5wYXRobmFtZS5lbmRzV2l0aCgiLyIpJiYodXx8YykmJihhLnBhdGhuYW1lKz0iLyIpLGF9Y29uc3QgYm89ZT0+ZS5qb2luKCIvIikucmVwbGFjZSgvXC9cLysvZywiLyIpLFozPWU9PmUucmVwbGFjZSgvXC8rJC8sIiIpLnJlcGxhY2UoL15cLyovLCIvIikscTM9ZT0+IWV8fGU9PT0iPyI/IiI6ZS5zdGFydHNXaXRoKCI/Iik/ZToiPyIrZSxlTT1lPT4hZXx8ZT09PSIjIj8iIjplLnN0YXJ0c1dpdGgoIiMiKT9lOiIjIitlO2NsYXNzIElte2NvbnN0cnVjdG9yKHQsbixyLG8pe289PT12b2lkIDAmJihvPSExKSx0aGlzLnN0YXR1cz10LHRoaXMuc3RhdHVzVGV4dD1ufHwiIix0aGlzLmludGVybmFsPW8sciBpbnN0YW5jZW9mIEVycm9yPyh0aGlzLmRhdGE9ci50b1N0cmluZygpLHRoaXMuZXJyb3I9cik6dGhpcy5kYXRhPXJ9fWZ1bmN0aW9uIGVDKGUpe3JldHVybiBlIT1udWxsJiZ0eXBlb2YgZS5zdGF0dXM9PSJudW1iZXIiJiZ0eXBlb2YgZS5zdGF0dXNUZXh0PT0ic3RyaW5nIiYmdHlwZW9mIGUuaW50ZXJuYWw9PSJib29sZWFuIiYmImRhdGEiaW4gZX1jb25zdCB0Qz1bInBvc3QiLCJwdXQiLCJwYXRjaCIsImRlbGV0ZSJdLHRNPW5ldyBTZXQodEMpLG5NPVsiZ2V0IiwuLi50Q10sck09bmV3IFNldChuTSksb009bmV3IFNldChbMzAxLDMwMiwzMDMsMzA3LDMwOF0pLGlNPW5ldyBTZXQoWzMwNywzMDhdKSxMZj17c3RhdGU6ImlkbGUiLGxvY2F0aW9uOnZvaWQgMCxmb3JtTWV0aG9kOnZvaWQgMCxmb3JtQWN0aW9uOnZvaWQgMCxmb3JtRW5jVHlwZTp2b2lkIDAsZm9ybURhdGE6dm9pZCAwLGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfSxsTT17c3RhdGU6ImlkbGUiLGRhdGE6dm9pZCAwLGZvcm1NZXRob2Q6dm9pZCAwLGZvcm1BY3Rpb246dm9pZCAwLGZvcm1FbmNUeXBlOnZvaWQgMCxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDB9LHBzPXtzdGF0ZToidW5ibG9ja2VkIixwcm9jZWVkOnZvaWQgMCxyZXNldDp2b2lkIDAsbG9jYXRpb246dm9pZCAwfSxuQz0vXig/OlthLXpdW2EtejAtOSsuLV0qOnxcL1wvKS9pLHNNPWU9Pih7aGFzRXJyb3JCb3VuZGFyeTohIWUuaGFzRXJyb3JCb3VuZGFyeX0pLHJDPSJyZW1peC1yb3V0ZXItdHJhbnNpdGlvbnMiO2Z1bmN0aW9uIGFNKGUpe2NvbnN0IHQ9ZS53aW5kb3c/ZS53aW5kb3c6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93OnZvaWQgMCxuPXR5cGVvZiB0PCJ1IiYmdHlwZW9mIHQuZG9jdW1lbnQ8InUiJiZ0eXBlb2YgdC5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1IixyPSFuO1NlKGUucm91dGVzLmxlbmd0aD4wLCJZb3UgbXVzdCBwcm92aWRlIGEgbm9uLWVtcHR5IHJvdXRlcyBhcnJheSB0byBjcmVhdGVSb3V0ZXIiKTtsZXQgbztpZihlLm1hcFJvdXRlUHJvcGVydGllcylvPWUubWFwUm91dGVQcm9wZXJ0aWVzO2Vsc2UgaWYoZS5kZXRlY3RFcnJvckJvdW5kYXJ5KXtsZXQgUD1lLmRldGVjdEVycm9yQm91bmRhcnk7bz1MPT4oe2hhc0Vycm9yQm91bmRhcnk6UChMKX0pfWVsc2Ugbz1zTTtsZXQgaT17fSxsPU9wKGUucm91dGVzLG8sdm9pZCAwLGkpLHMsYT1lLmJhc2VuYW1lfHwiLyIsdT1vdCh7djdfZmV0Y2hlclBlcnNpc3Q6ITEsdjdfbm9ybWFsaXplRm9ybU1ldGhvZDohMSx2N19wcmVwZW5kQmFzZW5hbWU6ITF9LGUuZnV0dXJlKSxjPW51bGwsZD1uZXcgU2V0LGY9bnVsbCxoPW51bGwsbT1udWxsLGc9ZS5oeWRyYXRpb25EYXRhIT1udWxsLFM9bGwobCxlLmhpc3RvcnkubG9jYXRpb24sYSksdj1udWxsO2lmKFM9PW51bGwpe2xldCBQPUFuKDQwNCx7cGF0aG5hbWU6ZS5oaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lfSkse21hdGNoZXM6TCxyb3V0ZTpGfT1ZMChsKTtTPUwsdj17W0YuaWRdOlB9fWxldCB5PSFTLnNvbWUoUD0+UC5yb3V0ZS5sYXp5KSYmKCFTLnNvbWUoUD0+UC5yb3V0ZS5sb2FkZXIpfHxlLmh5ZHJhdGlvbkRhdGEhPW51bGwpLHgsdz17aGlzdG9yeUFjdGlvbjplLmhpc3RvcnkuYWN0aW9uLGxvY2F0aW9uOmUuaGlzdG9yeS5sb2NhdGlvbixtYXRjaGVzOlMsaW5pdGlhbGl6ZWQ6eSxuYXZpZ2F0aW9uOkxmLHJlc3RvcmVTY3JvbGxQb3NpdGlvbjplLmh5ZHJhdGlvbkRhdGEhPW51bGw/ITE6bnVsbCxwcmV2ZW50U2Nyb2xsUmVzZXQ6ITEscmV2YWxpZGF0aW9uOiJpZGxlIixsb2FkZXJEYXRhOmUuaHlkcmF0aW9uRGF0YSYmZS5oeWRyYXRpb25EYXRhLmxvYWRlckRhdGF8fHt9LGFjdGlvbkRhdGE6ZS5oeWRyYXRpb25EYXRhJiZlLmh5ZHJhdGlvbkRhdGEuYWN0aW9uRGF0YXx8bnVsbCxlcnJvcnM6ZS5oeWRyYXRpb25EYXRhJiZlLmh5ZHJhdGlvbkRhdGEuZXJyb3JzfHx2LGZldGNoZXJzOm5ldyBNYXAsYmxvY2tlcnM6bmV3IE1hcH0saz1zdC5Qb3AsYj0hMSxULE49ITEsRD1uZXcgTWFwLE89bnVsbCxqPSExLEI9ITEsYWU9W10sSD1bXSxHPW5ldyBNYXAsQz0wLCQ9LTEsRT1uZXcgTWFwLEE9bmV3IFNldCxSPW5ldyBNYXAsej1uZXcgTWFwLFY9bmV3IFNldCxpZT1uZXcgTWFwLG5lPW5ldyBNYXAsQ2U9ITE7ZnVuY3Rpb24gd2UoKXtpZihjPWUuaGlzdG9yeS5saXN0ZW4oUD0+e2xldHthY3Rpb246TCxsb2NhdGlvbjpGLGRlbHRhOlF9PVA7aWYoQ2Upe0NlPSExO3JldHVybn13aShuZS5zaXplPT09MHx8USE9bnVsbCwiWW91IGFyZSB0cnlpbmcgdG8gdXNlIGEgYmxvY2tlciBvbiBhIFBPUCBuYXZpZ2F0aW9uIHRvIGEgbG9jYXRpb24gdGhhdCB3YXMgbm90IGNyZWF0ZWQgYnkgQHJlbWl4LXJ1bi9yb3V0ZXIuIFRoaXMgd2lsbCBmYWlsIHNpbGVudGx5IGluIHByb2R1Y3Rpb24uIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgYXJlIG5hdmlnYXRpbmcgb3V0c2lkZSB0aGUgcm91dGVyIHZpYSBgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlYC9gd2luZG93LmxvY2F0aW9uLmhhc2hgIGluc3RlYWQgb2YgdXNpbmcgcm91dGVyIG5hdmlnYXRpb24gQVBJcy4gIFRoaXMgY2FuIGFsc28gaGFwcGVuIGlmIHlvdSBhcmUgdXNpbmcgY3JlYXRlSGFzaFJvdXRlciBhbmQgdGhlIHVzZXIgbWFudWFsbHkgY2hhbmdlcyB0aGUgVVJMLiIpO2xldCBzZT1HbSh7Y3VycmVudExvY2F0aW9uOncubG9jYXRpb24sbmV4dExvY2F0aW9uOkYsaGlzdG9yeUFjdGlvbjpMfSk7aWYoc2UmJlEhPW51bGwpe0NlPSEwLGUuaGlzdG9yeS5nbyhRKi0xKSxLYShzZSx7c3RhdGU6ImJsb2NrZWQiLGxvY2F0aW9uOkYscHJvY2VlZCgpe0thKHNlLHtzdGF0ZToicHJvY2VlZGluZyIscHJvY2VlZDp2b2lkIDAscmVzZXQ6dm9pZCAwLGxvY2F0aW9uOkZ9KSxlLmhpc3RvcnkuZ28oUSl9LHJlc2V0KCl7bGV0IHVlPW5ldyBNYXAody5ibG9ja2Vycyk7dWUuc2V0KHNlLHBzKSxmZSh7YmxvY2tlcnM6dWV9KX19KTtyZXR1cm59cmV0dXJuIEJlKEwsRil9KSxuKXt4TSh0LEQpO2xldCBQPSgpPT53TSh0LEQpO3QuYWRkRXZlbnRMaXN0ZW5lcigicGFnZWhpZGUiLFApLE89KCk9PnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicGFnZWhpZGUiLFApfXJldHVybiB3LmluaXRpYWxpemVkfHxCZShzdC5Qb3Asdy5sb2NhdGlvbikseH1mdW5jdGlvbiBYKCl7YyYmYygpLE8mJk8oKSxkLmNsZWFyKCksVCYmVC5hYm9ydCgpLHcuZmV0Y2hlcnMuZm9yRWFjaCgoUCxMKT0+QXQoTCkpLHcuYmxvY2tlcnMuZm9yRWFjaCgoUCxMKT0+S20oTCkpfWZ1bmN0aW9uIGJlKFApe3JldHVybiBkLmFkZChQKSwoKT0+ZC5kZWxldGUoUCl9ZnVuY3Rpb24gZmUoUCxMKXt3PW90KHt9LHcsUCk7bGV0IEY9W10sUT1bXTt1LnY3X2ZldGNoZXJQZXJzaXN0JiZ3LmZldGNoZXJzLmZvckVhY2goKHNlLHVlKT0+e3NlLnN0YXRlPT09ImlkbGUiJiYoVi5oYXModWUpP1EucHVzaCh1ZSk6Ri5wdXNoKHVlKSl9KSxkLmZvckVhY2goc2U9PnNlKHcse2RlbGV0ZWRGZXRjaGVyczpRLHVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uT3B0czpMfSkpLHUudjdfZmV0Y2hlclBlcnNpc3QmJihGLmZvckVhY2goc2U9PncuZmV0Y2hlcnMuZGVsZXRlKHNlKSksUS5mb3JFYWNoKHNlPT5BdChzZSkpKX1mdW5jdGlvbiBfZShQLEwpe3ZhciBGLFE7bGV0IHNlPXcuYWN0aW9uRGF0YSE9bnVsbCYmdy5uYXZpZ2F0aW9uLmZvcm1NZXRob2QhPW51bGwmJkpuKHcubmF2aWdhdGlvbi5mb3JtTWV0aG9kKSYmdy5uYXZpZ2F0aW9uLnN0YXRlPT09ImxvYWRpbmciJiYoKEY9UC5zdGF0ZSk9PW51bGw/dm9pZCAwOkYuX2lzUmVkaXJlY3QpIT09ITAsdWU7TC5hY3Rpb25EYXRhP09iamVjdC5rZXlzKEwuYWN0aW9uRGF0YSkubGVuZ3RoPjA/dWU9TC5hY3Rpb25EYXRhOnVlPW51bGw6c2U/dWU9dy5hY3Rpb25EYXRhOnVlPW51bGw7bGV0IHBlPUwubG9hZGVyRGF0YT9HMCh3LmxvYWRlckRhdGEsTC5sb2FkZXJEYXRhLEwubWF0Y2hlc3x8W10sTC5lcnJvcnMpOncubG9hZGVyRGF0YSxjZT13LmJsb2NrZXJzO2NlLnNpemU+MCYmKGNlPW5ldyBNYXAoY2UpLGNlLmZvckVhY2goKEplLCRlKT0+Y2Uuc2V0KCRlLHBzKSkpO2xldCBsZT1iPT09ITB8fHcubmF2aWdhdGlvbi5mb3JtTWV0aG9kIT1udWxsJiZKbih3Lm5hdmlnYXRpb24uZm9ybU1ldGhvZCkmJigoUT1QLnN0YXRlKT09bnVsbD92b2lkIDA6US5faXNSZWRpcmVjdCkhPT0hMDtzJiYobD1zLHM9dm9pZCAwKSxqfHxrPT09c3QuUG9wfHwoaz09PXN0LlB1c2g/ZS5oaXN0b3J5LnB1c2goUCxQLnN0YXRlKTprPT09c3QuUmVwbGFjZSYmZS5oaXN0b3J5LnJlcGxhY2UoUCxQLnN0YXRlKSk7bGV0IERlO2lmKGs9PT1zdC5Qb3Ape2xldCBKZT1ELmdldCh3LmxvY2F0aW9uLnBhdGhuYW1lKTtKZSYmSmUuaGFzKFAucGF0aG5hbWUpP0RlPXtjdXJyZW50TG9jYXRpb246dy5sb2NhdGlvbixuZXh0TG9jYXRpb246UH06RC5oYXMoUC5wYXRobmFtZSkmJihEZT17Y3VycmVudExvY2F0aW9uOlAsbmV4dExvY2F0aW9uOncubG9jYXRpb259KX1lbHNlIGlmKE4pe2xldCBKZT1ELmdldCh3LmxvY2F0aW9uLnBhdGhuYW1lKTtKZT9KZS5hZGQoUC5wYXRobmFtZSk6KEplPW5ldyBTZXQoW1AucGF0aG5hbWVdKSxELnNldCh3LmxvY2F0aW9uLnBhdGhuYW1lLEplKSksRGU9e2N1cnJlbnRMb2NhdGlvbjp3LmxvY2F0aW9uLG5leHRMb2NhdGlvbjpQfX1mZShvdCh7fSxMLHthY3Rpb25EYXRhOnVlLGxvYWRlckRhdGE6cGUsaGlzdG9yeUFjdGlvbjprLGxvY2F0aW9uOlAsaW5pdGlhbGl6ZWQ6ITAsbmF2aWdhdGlvbjpMZixyZXZhbGlkYXRpb246ImlkbGUiLHJlc3RvcmVTY3JvbGxQb3NpdGlvbjpYbShQLEwubWF0Y2hlc3x8dy5tYXRjaGVzKSxwcmV2ZW50U2Nyb2xsUmVzZXQ6bGUsYmxvY2tlcnM6Y2V9KSxEZSksaz1zdC5Qb3AsYj0hMSxOPSExLGo9ITEsQj0hMSxhZT1bXSxIPVtdfWFzeW5jIGZ1bmN0aW9uIHZlKFAsTCl7aWYodHlwZW9mIFA9PSJudW1iZXIiKXtlLmhpc3RvcnkuZ28oUCk7cmV0dXJufWxldCBGPUFwKHcubG9jYXRpb24sdy5tYXRjaGVzLGEsdS52N19wcmVwZW5kQmFzZW5hbWUsUCxMPT1udWxsP3ZvaWQgMDpMLmZyb21Sb3V0ZUlkLEw9PW51bGw/dm9pZCAwOkwucmVsYXRpdmUpLHtwYXRoOlEsc3VibWlzc2lvbjpzZSxlcnJvcjp1ZX09QjAodS52N19ub3JtYWxpemVGb3JtTWV0aG9kLCExLEYsTCkscGU9dy5sb2NhdGlvbixjZT0kYSh3LmxvY2F0aW9uLFEsTCYmTC5zdGF0ZSk7Y2U9b3Qoe30sY2UsZS5oaXN0b3J5LmVuY29kZUxvY2F0aW9uKGNlKSk7bGV0IGxlPUwmJkwucmVwbGFjZSE9bnVsbD9MLnJlcGxhY2U6dm9pZCAwLERlPXN0LlB1c2g7bGU9PT0hMD9EZT1zdC5SZXBsYWNlOmxlPT09ITF8fHNlIT1udWxsJiZKbihzZS5mb3JtTWV0aG9kKSYmc2UuZm9ybUFjdGlvbj09PXcubG9jYXRpb24ucGF0aG5hbWUrdy5sb2NhdGlvbi5zZWFyY2gmJihEZT1zdC5SZXBsYWNlKTtsZXQgSmU9TCYmInByZXZlbnRTY3JvbGxSZXNldCJpbiBMP0wucHJldmVudFNjcm9sbFJlc2V0PT09ITA6dm9pZCAwLCRlPUdtKHtjdXJyZW50TG9jYXRpb246cGUsbmV4dExvY2F0aW9uOmNlLGhpc3RvcnlBY3Rpb246RGV9KTtpZigkZSl7S2EoJGUse3N0YXRlOiJibG9ja2VkIixsb2NhdGlvbjpjZSxwcm9jZWVkKCl7S2EoJGUse3N0YXRlOiJwcm9jZWVkaW5nIixwcm9jZWVkOnZvaWQgMCxyZXNldDp2b2lkIDAsbG9jYXRpb246Y2V9KSx2ZShQLEwpfSxyZXNldCgpe2xldCBJZT1uZXcgTWFwKHcuYmxvY2tlcnMpO0llLnNldCgkZSxwcyksZmUoe2Jsb2NrZXJzOkllfSl9fSk7cmV0dXJufXJldHVybiBhd2FpdCBCZShEZSxjZSx7c3VibWlzc2lvbjpzZSxwZW5kaW5nRXJyb3I6dWUscHJldmVudFNjcm9sbFJlc2V0OkplLHJlcGxhY2U6TCYmTC5yZXBsYWNlLGVuYWJsZVZpZXdUcmFuc2l0aW9uOkwmJkwudW5zdGFibGVfdmlld1RyYW5zaXRpb259KX1mdW5jdGlvbiBUZSgpe2lmKGp0KCksZmUoe3JldmFsaWRhdGlvbjoibG9hZGluZyJ9KSx3Lm5hdmlnYXRpb24uc3RhdGUhPT0ic3VibWl0dGluZyIpe2lmKHcubmF2aWdhdGlvbi5zdGF0ZT09PSJpZGxlIil7QmUody5oaXN0b3J5QWN0aW9uLHcubG9jYXRpb24se3N0YXJ0VW5pbnRlcnJ1cHRlZFJldmFsaWRhdGlvbjohMH0pO3JldHVybn1CZShrfHx3Lmhpc3RvcnlBY3Rpb24sdy5uYXZpZ2F0aW9uLmxvY2F0aW9uLHtvdmVycmlkZU5hdmlnYXRpb246dy5uYXZpZ2F0aW9ufSl9fWFzeW5jIGZ1bmN0aW9uIEJlKFAsTCxGKXtUJiZULmFib3J0KCksVD1udWxsLGs9UCxqPShGJiZGLnN0YXJ0VW5pbnRlcnJ1cHRlZFJldmFsaWRhdGlvbik9PT0hMCxBQyh3LmxvY2F0aW9uLHcubWF0Y2hlcyksYj0oRiYmRi5wcmV2ZW50U2Nyb2xsUmVzZXQpPT09ITAsTj0oRiYmRi5lbmFibGVWaWV3VHJhbnNpdGlvbik9PT0hMDtsZXQgUT1zfHxsLHNlPUYmJkYub3ZlcnJpZGVOYXZpZ2F0aW9uLHVlPWxsKFEsTCxhKTtpZighdWUpe2xldCBJZT1Bbig0MDQse3BhdGhuYW1lOkwucGF0aG5hbWV9KSx7bWF0Y2hlczpndCxyb3V0ZTpIb309WTAoUSk7SWQoKSxfZShMLHttYXRjaGVzOmd0LGxvYWRlckRhdGE6e30sZXJyb3JzOntbSG8uaWRdOkllfX0pO3JldHVybn1pZih3LmluaXRpYWxpemVkJiYhQiYmaE0ody5sb2NhdGlvbixMKSYmIShGJiZGLnN1Ym1pc3Npb24mJkpuKEYuc3VibWlzc2lvbi5mb3JtTWV0aG9kKSkpe19lKEwse21hdGNoZXM6dWV9KTtyZXR1cm59VD1uZXcgQWJvcnRDb250cm9sbGVyO2xldCBwZT1tcyhlLmhpc3RvcnksTCxULnNpZ25hbCxGJiZGLnN1Ym1pc3Npb24pLGNlLGxlO2lmKEYmJkYucGVuZGluZ0Vycm9yKWxlPXtbS3ModWUpLnJvdXRlLmlkXTpGLnBlbmRpbmdFcnJvcn07ZWxzZSBpZihGJiZGLnN1Ym1pc3Npb24mJkpuKEYuc3VibWlzc2lvbi5mb3JtTWV0aG9kKSl7bGV0IEllPWF3YWl0IE90KHBlLEwsRi5zdWJtaXNzaW9uLHVlLHtyZXBsYWNlOkYucmVwbGFjZX0pO2lmKEllLnNob3J0Q2lyY3VpdGVkKXJldHVybjtjZT1JZS5wZW5kaW5nQWN0aW9uRGF0YSxsZT1JZS5wZW5kaW5nQWN0aW9uRXJyb3Isc2U9RGYoTCxGLnN1Ym1pc3Npb24pLHBlPW5ldyBSZXF1ZXN0KHBlLnVybCx7c2lnbmFsOnBlLnNpZ25hbH0pfWxldHtzaG9ydENpcmN1aXRlZDpEZSxsb2FkZXJEYXRhOkplLGVycm9yczokZX09YXdhaXQgdW4ocGUsTCx1ZSxzZSxGJiZGLnN1Ym1pc3Npb24sRiYmRi5mZXRjaGVyU3VibWlzc2lvbixGJiZGLnJlcGxhY2UsY2UsbGUpO0RlfHwoVD1udWxsLF9lKEwsb3Qoe21hdGNoZXM6dWV9LGNlP3thY3Rpb25EYXRhOmNlfTp7fSx7bG9hZGVyRGF0YTpKZSxlcnJvcnM6JGV9KSkpfWFzeW5jIGZ1bmN0aW9uIE90KFAsTCxGLFEsc2Upe3NlPT09dm9pZCAwJiYoc2U9e30pLGp0KCk7bGV0IHVlPXZNKEwsRik7ZmUoe25hdmlnYXRpb246dWV9KTtsZXQgcGUsY2U9THAoUSxMKTtpZighY2Uucm91dGUuYWN0aW9uJiYhY2Uucm91dGUubGF6eSlwZT17dHlwZTphdC5lcnJvcixlcnJvcjpBbig0MDUse21ldGhvZDpQLm1ldGhvZCxwYXRobmFtZTpMLnBhdGhuYW1lLHJvdXRlSWQ6Y2Uucm91dGUuaWR9KX07ZWxzZSBpZihwZT1hd2FpdCBncygiYWN0aW9uIixQLGNlLFEsaSxvLGEpLFAuc2lnbmFsLmFib3J0ZWQpcmV0dXJue3Nob3J0Q2lyY3VpdGVkOiEwfTtpZih5bChwZSkpe2xldCBsZTtyZXR1cm4gc2UmJnNlLnJlcGxhY2UhPW51bGw/bGU9c2UucmVwbGFjZTpsZT1wZS5sb2NhdGlvbj09PXcubG9jYXRpb24ucGF0aG5hbWUrdy5sb2NhdGlvbi5zZWFyY2gsYXdhaXQgX3QodyxwZSx7c3VibWlzc2lvbjpGLHJlcGxhY2U6bGV9KSx7c2hvcnRDaXJjdWl0ZWQ6ITB9fWlmKEdzKHBlKSl7bGV0IGxlPUtzKFEsY2Uucm91dGUuaWQpO3JldHVybihzZSYmc2UucmVwbGFjZSkhPT0hMCYmKGs9c3QuUHVzaCkse3BlbmRpbmdBY3Rpb25EYXRhOnt9LHBlbmRpbmdBY3Rpb25FcnJvcjp7W2xlLnJvdXRlLmlkXTpwZS5lcnJvcn19fWlmKG5pKHBlKSl0aHJvdyBBbig0MDAse3R5cGU6ImRlZmVyLWFjdGlvbiJ9KTtyZXR1cm57cGVuZGluZ0FjdGlvbkRhdGE6e1tjZS5yb3V0ZS5pZF06cGUuZGF0YX19fWFzeW5jIGZ1bmN0aW9uIHVuKFAsTCxGLFEsc2UsdWUscGUsY2UsbGUpe2xldCBEZT1RfHxEZihMLHNlKSxKZT1zZXx8dWV8fEowKERlKSwkZT1zfHxsLFtJZSxndF09VzAoZS5oaXN0b3J5LHcsRixKZSxMLEIsYWUsSCxSLEEsJGUsYSxjZSxsZSk7aWYoSWQoQWU9PiEoRiYmRi5zb21lKEhuPT5Ibi5yb3V0ZS5pZD09PUFlKSl8fEllJiZJZS5zb21lKEhuPT5Ibi5yb3V0ZS5pZD09PUFlKSksJD0rK0MsSWUubGVuZ3RoPT09MCYmZ3QubGVuZ3RoPT09MCl7bGV0IEFlPXNyKCk7cmV0dXJuIF9lKEwsb3Qoe21hdGNoZXM6Rixsb2FkZXJEYXRhOnt9LGVycm9yczpsZXx8bnVsbH0sY2U/e2FjdGlvbkRhdGE6Y2V9Ont9LEFlP3tmZXRjaGVyczpuZXcgTWFwKHcuZmV0Y2hlcnMpfTp7fSkpLHtzaG9ydENpcmN1aXRlZDohMH19aWYoIWope2d0LmZvckVhY2goSG49PntsZXQgdG89dy5mZXRjaGVycy5nZXQoSG4ua2V5KSxsdD12cyh2b2lkIDAsdG8/dG8uZGF0YTp2b2lkIDApO3cuZmV0Y2hlcnMuc2V0KEhuLmtleSxsdCl9KTtsZXQgQWU9Y2V8fHcuYWN0aW9uRGF0YTtmZShvdCh7bmF2aWdhdGlvbjpEZX0sQWU/T2JqZWN0LmtleXMoQWUpLmxlbmd0aD09PTA/e2FjdGlvbkRhdGE6bnVsbH06e2FjdGlvbkRhdGE6QWV9Ont9LGd0Lmxlbmd0aD4wP3tmZXRjaGVyczpuZXcgTWFwKHcuZmV0Y2hlcnMpfTp7fSkpfWd0LmZvckVhY2goQWU9PntHLmhhcyhBZS5rZXkpJiZ6dChBZS5rZXkpLEFlLmNvbnRyb2xsZXImJkcuc2V0KEFlLmtleSxBZS5jb250cm9sbGVyKX0pO2xldCBIbz0oKT0+Z3QuZm9yRWFjaChBZT0+enQoQWUua2V5KSk7VCYmVC5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLEhvKTtsZXR7cmVzdWx0czpLbyxsb2FkZXJSZXN1bHRzOnRzLGZldGNoZXJSZXN1bHRzOmpkfT1hd2FpdCB2bih3Lm1hdGNoZXMsRixJZSxndCxQKTtpZihQLnNpZ25hbC5hYm9ydGVkKXJldHVybntzaG9ydENpcmN1aXRlZDohMH07VCYmVC5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLEhvKSxndC5mb3JFYWNoKEFlPT5HLmRlbGV0ZShBZS5rZXkpKTtsZXQgYnI9WDAoS28pO2lmKGJyKXtpZihici5pZHg+PUllLmxlbmd0aCl7bGV0IEFlPWd0W2JyLmlkeC1JZS5sZW5ndGhdLmtleTtBLmFkZChBZSl9cmV0dXJuIGF3YWl0IF90KHcsYnIucmVzdWx0LHtyZXBsYWNlOnBlfSkse3Nob3J0Q2lyY3VpdGVkOiEwfX1sZXR7bG9hZGVyRGF0YTplbyxlcnJvcnM6R2F9PUswKHcsRixJZSx0cyxsZSxndCxqZCxpZSk7aWUuZm9yRWFjaCgoQWUsSG4pPT57QWUuc3Vic2NyaWJlKHRvPT57KHRvfHxBZS5kb25lKSYmaWUuZGVsZXRlKEhuKX0pfSk7bGV0IHpkPXNyKCksRmQ9Vm8oJCksQmQ9emR8fEZkfHxndC5sZW5ndGg+MDtyZXR1cm4gb3Qoe2xvYWRlckRhdGE6ZW8sZXJyb3JzOkdhfSxCZD97ZmV0Y2hlcnM6bmV3IE1hcCh3LmZldGNoZXJzKX06e30pfWZ1bmN0aW9uIE9uKFApe3JldHVybiB1LnY3X2ZldGNoZXJQZXJzaXN0JiYoei5zZXQoUCwoei5nZXQoUCl8fDApKzEpLFYuaGFzKFApJiZWLmRlbGV0ZShQKSksdy5mZXRjaGVycy5nZXQoUCl8fGxNfWZ1bmN0aW9uIE5lKFAsTCxGLFEpe2lmKHIpdGhyb3cgbmV3IEVycm9yKCJyb3V0ZXIuZmV0Y2goKSB3YXMgY2FsbGVkIGR1cmluZyB0aGUgc2VydmVyIHJlbmRlciwgYnV0IGl0IHNob3VsZG4ndCBiZS4gWW91IGFyZSBsaWtlbHkgY2FsbGluZyBhIHVzZUZldGNoZXIoKSBtZXRob2QgaW4gdGhlIGJvZHkgb2YgeW91ciBjb21wb25lbnQuIFRyeSBtb3ZpbmcgaXQgdG8gYSB1c2VFZmZlY3Qgb3IgYSBjYWxsYmFjay4iKTtHLmhhcyhQKSYmenQoUCk7bGV0IHNlPXN8fGwsdWU9QXAody5sb2NhdGlvbix3Lm1hdGNoZXMsYSx1LnY3X3ByZXBlbmRCYXNlbmFtZSxGLEwsUT09bnVsbD92b2lkIDA6US5yZWxhdGl2ZSkscGU9bGwoc2UsdWUsYSk7aWYoIXBlKXtTdChQLEwsQW4oNDA0LHtwYXRobmFtZTp1ZX0pKTtyZXR1cm59bGV0e3BhdGg6Y2Usc3VibWlzc2lvbjpsZSxlcnJvcjpEZX09QjAodS52N19ub3JtYWxpemVGb3JtTWV0aG9kLCEwLHVlLFEpO2lmKERlKXtTdChQLEwsRGUpO3JldHVybn1sZXQgSmU9THAocGUsY2UpO2lmKGI9KFEmJlEucHJldmVudFNjcm9sbFJlc2V0KT09PSEwLGxlJiZKbihsZS5mb3JtTWV0aG9kKSl7aHQoUCxMLGNlLEplLHBlLGxlKTtyZXR1cm59Ui5zZXQoUCx7cm91dGVJZDpMLHBhdGg6Y2V9KSxwdChQLEwsY2UsSmUscGUsbGUpfWFzeW5jIGZ1bmN0aW9uIGh0KFAsTCxGLFEsc2UsdWUpe2lmKGp0KCksUi5kZWxldGUoUCksIVEucm91dGUuYWN0aW9uJiYhUS5yb3V0ZS5sYXp5KXtsZXQgbHQ9QW4oNDA1LHttZXRob2Q6dWUuZm9ybU1ldGhvZCxwYXRobmFtZTpGLHJvdXRlSWQ6TH0pO1N0KFAsTCxsdCk7cmV0dXJufWxldCBwZT13LmZldGNoZXJzLmdldChQKSxjZT15TSh1ZSxwZSk7dy5mZXRjaGVycy5zZXQoUCxjZSksZmUoe2ZldGNoZXJzOm5ldyBNYXAody5mZXRjaGVycyl9KTtsZXQgbGU9bmV3IEFib3J0Q29udHJvbGxlcixEZT1tcyhlLmhpc3RvcnksRixsZS5zaWduYWwsdWUpO0cuc2V0KFAsbGUpO2xldCBKZT1DLCRlPWF3YWl0IGdzKCJhY3Rpb24iLERlLFEsc2UsaSxvLGEpO2lmKERlLnNpZ25hbC5hYm9ydGVkKXtHLmdldChQKT09PWxlJiZHLmRlbGV0ZShQKTtyZXR1cm59aWYoVi5oYXMoUCkpe3cuZmV0Y2hlcnMuc2V0KFAsc28odm9pZCAwKSksZmUoe2ZldGNoZXJzOm5ldyBNYXAody5mZXRjaGVycyl9KTtyZXR1cm59aWYoeWwoJGUpKWlmKEcuZGVsZXRlKFApLCQ+SmUpe2xldCBsdD1zbyh2b2lkIDApO3cuZmV0Y2hlcnMuc2V0KFAsbHQpLGZlKHtmZXRjaGVyczpuZXcgTWFwKHcuZmV0Y2hlcnMpfSk7cmV0dXJufWVsc2V7QS5hZGQoUCk7bGV0IGx0PXZzKHVlKTtyZXR1cm4gdy5mZXRjaGVycy5zZXQoUCxsdCksZmUoe2ZldGNoZXJzOm5ldyBNYXAody5mZXRjaGVycyl9KSxfdCh3LCRlLHtmZXRjaGVyU3VibWlzc2lvbjp1ZX0pfWlmKEdzKCRlKSl7U3QoUCxMLCRlLmVycm9yKTtyZXR1cm59aWYobmkoJGUpKXRocm93IEFuKDQwMCx7dHlwZToiZGVmZXItYWN0aW9uIn0pO2xldCBJZT13Lm5hdmlnYXRpb24ubG9jYXRpb258fHcubG9jYXRpb24sZ3Q9bXMoZS5oaXN0b3J5LEllLGxlLnNpZ25hbCksSG89c3x8bCxLbz13Lm5hdmlnYXRpb24uc3RhdGUhPT0iaWRsZSI/bGwoSG8sdy5uYXZpZ2F0aW9uLmxvY2F0aW9uLGEpOncubWF0Y2hlcztTZShLbywiRGlkbid0IGZpbmQgYW55IG1hdGNoZXMgYWZ0ZXIgZmV0Y2hlciBhY3Rpb24iKTtsZXQgdHM9KytDO0Uuc2V0KFAsdHMpO2xldCBqZD12cyh1ZSwkZS5kYXRhKTt3LmZldGNoZXJzLnNldChQLGpkKTtsZXRbYnIsZW9dPVcwKGUuaGlzdG9yeSx3LEtvLHVlLEllLEIsYWUsSCxSLEEsSG8sYSx7W1Eucm91dGUuaWRdOiRlLmRhdGF9LHZvaWQgMCk7ZW8uZmlsdGVyKGx0PT5sdC5rZXkhPT1QKS5mb3JFYWNoKGx0PT57bGV0IG5zPWx0LmtleSxRbT13LmZldGNoZXJzLmdldChucyksTEM9dnModm9pZCAwLFFtP1FtLmRhdGE6dm9pZCAwKTt3LmZldGNoZXJzLnNldChucyxMQyksRy5oYXMobnMpJiZ6dChucyksbHQuY29udHJvbGxlciYmRy5zZXQobnMsbHQuY29udHJvbGxlcil9KSxmZSh7ZmV0Y2hlcnM6bmV3IE1hcCh3LmZldGNoZXJzKX0pO2xldCBHYT0oKT0+ZW8uZm9yRWFjaChsdD0+enQobHQua2V5KSk7bGUuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixHYSk7bGV0e3Jlc3VsdHM6emQsbG9hZGVyUmVzdWx0czpGZCxmZXRjaGVyUmVzdWx0czpCZH09YXdhaXQgdm4ody5tYXRjaGVzLEtvLGJyLGVvLGd0KTtpZihsZS5zaWduYWwuYWJvcnRlZClyZXR1cm47bGUuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixHYSksRS5kZWxldGUoUCksRy5kZWxldGUoUCksZW8uZm9yRWFjaChsdD0+Ry5kZWxldGUobHQua2V5KSk7bGV0IEFlPVgwKHpkKTtpZihBZSl7aWYoQWUuaWR4Pj1ici5sZW5ndGgpe2xldCBsdD1lb1tBZS5pZHgtYnIubGVuZ3RoXS5rZXk7QS5hZGQobHQpfXJldHVybiBfdCh3LEFlLnJlc3VsdCl9bGV0e2xvYWRlckRhdGE6SG4sZXJyb3JzOnRvfT1LMCh3LHcubWF0Y2hlcyxicixGZCx2b2lkIDAsZW8sQmQsaWUpO2lmKHcuZmV0Y2hlcnMuaGFzKFApKXtsZXQgbHQ9c28oJGUuZGF0YSk7dy5mZXRjaGVycy5zZXQoUCxsdCl9Vm8odHMpLHcubmF2aWdhdGlvbi5zdGF0ZT09PSJsb2FkaW5nIiYmdHM+JD8oU2UoaywiRXhwZWN0ZWQgcGVuZGluZyBhY3Rpb24iKSxUJiZULmFib3J0KCksX2Uody5uYXZpZ2F0aW9uLmxvY2F0aW9uLHttYXRjaGVzOktvLGxvYWRlckRhdGE6SG4sZXJyb3JzOnRvLGZldGNoZXJzOm5ldyBNYXAody5mZXRjaGVycyl9KSk6KGZlKHtlcnJvcnM6dG8sbG9hZGVyRGF0YTpHMCh3LmxvYWRlckRhdGEsSG4sS28sdG8pLGZldGNoZXJzOm5ldyBNYXAody5mZXRjaGVycyl9KSxCPSExKX1hc3luYyBmdW5jdGlvbiBwdChQLEwsRixRLHNlLHVlKXtsZXQgcGU9dy5mZXRjaGVycy5nZXQoUCksY2U9dnModWUscGU/cGUuZGF0YTp2b2lkIDApO3cuZmV0Y2hlcnMuc2V0KFAsY2UpLGZlKHtmZXRjaGVyczpuZXcgTWFwKHcuZmV0Y2hlcnMpfSk7bGV0IGxlPW5ldyBBYm9ydENvbnRyb2xsZXIsRGU9bXMoZS5oaXN0b3J5LEYsbGUuc2lnbmFsKTtHLnNldChQLGxlKTtsZXQgSmU9QywkZT1hd2FpdCBncygibG9hZGVyIixEZSxRLHNlLGksbyxhKTtpZihuaSgkZSkmJigkZT1hd2FpdCBsQygkZSxEZS5zaWduYWwsITApfHwkZSksRy5nZXQoUCk9PT1sZSYmRy5kZWxldGUoUCksRGUuc2lnbmFsLmFib3J0ZWQpcmV0dXJuO2lmKFYuaGFzKFApKXt3LmZldGNoZXJzLnNldChQLHNvKHZvaWQgMCkpLGZlKHtmZXRjaGVyczpuZXcgTWFwKHcuZmV0Y2hlcnMpfSk7cmV0dXJufWlmKHlsKCRlKSlpZigkPkplKXtsZXQgZ3Q9c28odm9pZCAwKTt3LmZldGNoZXJzLnNldChQLGd0KSxmZSh7ZmV0Y2hlcnM6bmV3IE1hcCh3LmZldGNoZXJzKX0pO3JldHVybn1lbHNle0EuYWRkKFApLGF3YWl0IF90KHcsJGUpO3JldHVybn1pZihHcygkZSkpe1N0KFAsTCwkZS5lcnJvcik7cmV0dXJufVNlKCFuaSgkZSksIlVuaGFuZGxlZCBmZXRjaGVyIGRlZmVycmVkIGRhdGEiKTtsZXQgSWU9c28oJGUuZGF0YSk7dy5mZXRjaGVycy5zZXQoUCxJZSksZmUoe2ZldGNoZXJzOm5ldyBNYXAody5mZXRjaGVycyl9KX1hc3luYyBmdW5jdGlvbiBfdChQLEwsRil7bGV0e3N1Ym1pc3Npb246USxmZXRjaGVyU3VibWlzc2lvbjpzZSxyZXBsYWNlOnVlfT1GPT09dm9pZCAwP3t9OkY7TC5yZXZhbGlkYXRlJiYoQj0hMCk7bGV0IHBlPSRhKFAubG9jYXRpb24sTC5sb2NhdGlvbix7X2lzUmVkaXJlY3Q6ITB9KTtpZihTZShwZSwiRXhwZWN0ZWQgYSBsb2NhdGlvbiBvbiB0aGUgcmVkaXJlY3QgbmF2aWdhdGlvbiIpLG4pe2xldCBJZT0hMTtpZihMLnJlbG9hZERvY3VtZW50KUllPSEwO2Vsc2UgaWYobkMudGVzdChMLmxvY2F0aW9uKSl7Y29uc3QgZ3Q9ZS5oaXN0b3J5LmNyZWF0ZVVSTChMLmxvY2F0aW9uKTtJZT1ndC5vcmlnaW4hPT10LmxvY2F0aW9uLm9yaWdpbnx8VmEoZ3QucGF0aG5hbWUsYSk9PW51bGx9aWYoSWUpe3VlP3QubG9jYXRpb24ucmVwbGFjZShMLmxvY2F0aW9uKTp0LmxvY2F0aW9uLmFzc2lnbihMLmxvY2F0aW9uKTtyZXR1cm59fVQ9bnVsbDtsZXQgY2U9dWU9PT0hMD9zdC5SZXBsYWNlOnN0LlB1c2gse2Zvcm1NZXRob2Q6bGUsZm9ybUFjdGlvbjpEZSxmb3JtRW5jVHlwZTpKZX09UC5uYXZpZ2F0aW9uOyFRJiYhc2UmJmxlJiZEZSYmSmUmJihRPUowKFAubmF2aWdhdGlvbikpO2xldCAkZT1RfHxzZTtpZihpTS5oYXMoTC5zdGF0dXMpJiYkZSYmSm4oJGUuZm9ybU1ldGhvZCkpYXdhaXQgQmUoY2UscGUse3N1Ym1pc3Npb246b3Qoe30sJGUse2Zvcm1BY3Rpb246TC5sb2NhdGlvbn0pLHByZXZlbnRTY3JvbGxSZXNldDpifSk7ZWxzZXtsZXQgSWU9RGYocGUsUSk7YXdhaXQgQmUoY2UscGUse292ZXJyaWRlTmF2aWdhdGlvbjpJZSxmZXRjaGVyU3VibWlzc2lvbjpzZSxwcmV2ZW50U2Nyb2xsUmVzZXQ6Yn0pfX1hc3luYyBmdW5jdGlvbiB2bihQLEwsRixRLHNlKXtsZXQgdWU9YXdhaXQgUHJvbWlzZS5hbGwoWy4uLkYubWFwKGxlPT5ncygibG9hZGVyIixzZSxsZSxMLGksbyxhKSksLi4uUS5tYXAobGU9PmxlLm1hdGNoZXMmJmxlLm1hdGNoJiZsZS5jb250cm9sbGVyP2dzKCJsb2FkZXIiLG1zKGUuaGlzdG9yeSxsZS5wYXRoLGxlLmNvbnRyb2xsZXIuc2lnbmFsKSxsZS5tYXRjaCxsZS5tYXRjaGVzLGksbyxhKTp7dHlwZTphdC5lcnJvcixlcnJvcjpBbig0MDQse3BhdGhuYW1lOmxlLnBhdGh9KX0pXSkscGU9dWUuc2xpY2UoMCxGLmxlbmd0aCksY2U9dWUuc2xpY2UoRi5sZW5ndGgpO3JldHVybiBhd2FpdCBQcm9taXNlLmFsbChbUTAoUCxGLHBlLHBlLm1hcCgoKT0+c2Uuc2lnbmFsKSwhMSx3LmxvYWRlckRhdGEpLFEwKFAsUS5tYXAobGU9PmxlLm1hdGNoKSxjZSxRLm1hcChsZT0+bGUuY29udHJvbGxlcj9sZS5jb250cm9sbGVyLnNpZ25hbDpudWxsKSwhMCldKSx7cmVzdWx0czp1ZSxsb2FkZXJSZXN1bHRzOnBlLGZldGNoZXJSZXN1bHRzOmNlfX1mdW5jdGlvbiBqdCgpe0I9ITAsYWUucHVzaCguLi5JZCgpKSxSLmZvckVhY2goKFAsTCk9PntHLmhhcyhMKSYmKEgucHVzaChMKSx6dChMKSl9KX1mdW5jdGlvbiBTdChQLEwsRil7bGV0IFE9S3Mody5tYXRjaGVzLEwpO0F0KFApLGZlKHtlcnJvcnM6e1tRLnJvdXRlLmlkXTpGfSxmZXRjaGVyczpuZXcgTWFwKHcuZmV0Y2hlcnMpfSl9ZnVuY3Rpb24gQXQoUCl7bGV0IEw9dy5mZXRjaGVycy5nZXQoUCk7Ry5oYXMoUCkmJiEoTCYmTC5zdGF0ZT09PSJsb2FkaW5nIiYmRS5oYXMoUCkpJiZ6dChQKSxSLmRlbGV0ZShQKSxFLmRlbGV0ZShQKSxBLmRlbGV0ZShQKSxWLmRlbGV0ZShQKSx3LmZldGNoZXJzLmRlbGV0ZShQKX1mdW5jdGlvbiBscihQKXtpZih1LnY3X2ZldGNoZXJQZXJzaXN0KXtsZXQgTD0oei5nZXQoUCl8fDApLTE7TDw9MD8oei5kZWxldGUoUCksVi5hZGQoUCkpOnouc2V0KFAsTCl9ZWxzZSBBdChQKTtmZSh7ZmV0Y2hlcnM6bmV3IE1hcCh3LmZldGNoZXJzKX0pfWZ1bmN0aW9uIHp0KFApe2xldCBMPUcuZ2V0KFApO1NlKEwsIkV4cGVjdGVkIGZldGNoIGNvbnRyb2xsZXI6ICIrUCksTC5hYm9ydCgpLEcuZGVsZXRlKFApfWZ1bmN0aW9uIEZ0KFApe2ZvcihsZXQgTCBvZiBQKXtsZXQgRj1PbihMKSxRPXNvKEYuZGF0YSk7dy5mZXRjaGVycy5zZXQoTCxRKX19ZnVuY3Rpb24gc3IoKXtsZXQgUD1bXSxMPSExO2ZvcihsZXQgRiBvZiBBKXtsZXQgUT13LmZldGNoZXJzLmdldChGKTtTZShRLCJFeHBlY3RlZCBmZXRjaGVyOiAiK0YpLFEuc3RhdGU9PT0ibG9hZGluZyImJihBLmRlbGV0ZShGKSxQLnB1c2goRiksTD0hMCl9cmV0dXJuIEZ0KFApLEx9ZnVuY3Rpb24gVm8oUCl7bGV0IEw9W107Zm9yKGxldFtGLFFdb2YgRSlpZihRPFApe2xldCBzZT13LmZldGNoZXJzLmdldChGKTtTZShzZSwiRXhwZWN0ZWQgZmV0Y2hlcjogIitGKSxzZS5zdGF0ZT09PSJsb2FkaW5nIiYmKHp0KEYpLEUuZGVsZXRlKEYpLEwucHVzaChGKSl9cmV0dXJuIEZ0KEwpLEwubGVuZ3RoPjB9ZnVuY3Rpb24gSGEoUCxMKXtsZXQgRj13LmJsb2NrZXJzLmdldChQKXx8cHM7cmV0dXJuIG5lLmdldChQKSE9PUwmJm5lLnNldChQLEwpLEZ9ZnVuY3Rpb24gS20oUCl7dy5ibG9ja2Vycy5kZWxldGUoUCksbmUuZGVsZXRlKFApfWZ1bmN0aW9uIEthKFAsTCl7bGV0IEY9dy5ibG9ja2Vycy5nZXQoUCl8fHBzO1NlKEYuc3RhdGU9PT0idW5ibG9ja2VkIiYmTC5zdGF0ZT09PSJibG9ja2VkInx8Ri5zdGF0ZT09PSJibG9ja2VkIiYmTC5zdGF0ZT09PSJibG9ja2VkInx8Ri5zdGF0ZT09PSJibG9ja2VkIiYmTC5zdGF0ZT09PSJwcm9jZWVkaW5nInx8Ri5zdGF0ZT09PSJibG9ja2VkIiYmTC5zdGF0ZT09PSJ1bmJsb2NrZWQifHxGLnN0YXRlPT09InByb2NlZWRpbmciJiZMLnN0YXRlPT09InVuYmxvY2tlZCIsIkludmFsaWQgYmxvY2tlciBzdGF0ZSB0cmFuc2l0aW9uOiAiK0Yuc3RhdGUrIiAtPiAiK0wuc3RhdGUpO2xldCBRPW5ldyBNYXAody5ibG9ja2Vycyk7US5zZXQoUCxMKSxmZSh7YmxvY2tlcnM6UX0pfWZ1bmN0aW9uIEdtKFApe2xldHtjdXJyZW50TG9jYXRpb246TCxuZXh0TG9jYXRpb246RixoaXN0b3J5QWN0aW9uOlF9PVA7aWYobmUuc2l6ZT09PTApcmV0dXJuO25lLnNpemU+MSYmd2koITEsIkEgcm91dGVyIG9ubHkgc3VwcG9ydHMgb25lIGJsb2NrZXIgYXQgYSB0aW1lIik7bGV0IHNlPUFycmF5LmZyb20obmUuZW50cmllcygpKSxbdWUscGVdPXNlW3NlLmxlbmd0aC0xXSxjZT13LmJsb2NrZXJzLmdldCh1ZSk7aWYoIShjZSYmY2Uuc3RhdGU9PT0icHJvY2VlZGluZyIpJiZwZSh7Y3VycmVudExvY2F0aW9uOkwsbmV4dExvY2F0aW9uOkYsaGlzdG9yeUFjdGlvbjpRfSkpcmV0dXJuIHVlfWZ1bmN0aW9uIElkKFApe2xldCBMPVtdO3JldHVybiBpZS5mb3JFYWNoKChGLFEpPT57KCFQfHxQKFEpKSYmKEYuY2FuY2VsKCksTC5wdXNoKFEpLGllLmRlbGV0ZShRKSl9KSxMfWZ1bmN0aW9uIE9DKFAsTCxGKXtpZihmPVAsbT1MLGg9Rnx8bnVsbCwhZyYmdy5uYXZpZ2F0aW9uPT09TGYpe2c9ITA7bGV0IFE9WG0ody5sb2NhdGlvbix3Lm1hdGNoZXMpO1EhPW51bGwmJmZlKHtyZXN0b3JlU2Nyb2xsUG9zaXRpb246UX0pfXJldHVybigpPT57Zj1udWxsLG09bnVsbCxoPW51bGx9fWZ1bmN0aW9uIFltKFAsTCl7cmV0dXJuIGgmJmgoUCxMLm1hcChRPT5MMyhRLHcubG9hZGVyRGF0YSkpKXx8UC5rZXl9ZnVuY3Rpb24gQUMoUCxMKXtpZihmJiZtKXtsZXQgRj1ZbShQLEwpO2ZbRl09bSgpfX1mdW5jdGlvbiBYbShQLEwpe2lmKGYpe2xldCBGPVltKFAsTCksUT1mW0ZdO2lmKHR5cGVvZiBRPT0ibnVtYmVyIilyZXR1cm4gUX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBNQyhQKXtpPXt9LHM9T3AoUCxvLHZvaWQgMCxpKX1yZXR1cm4geD17Z2V0IGJhc2VuYW1lKCl7cmV0dXJuIGF9LGdldCBzdGF0ZSgpe3JldHVybiB3fSxnZXQgcm91dGVzKCl7cmV0dXJuIGx9LGdldCB3aW5kb3coKXtyZXR1cm4gdH0saW5pdGlhbGl6ZTp3ZSxzdWJzY3JpYmU6YmUsZW5hYmxlU2Nyb2xsUmVzdG9yYXRpb246T0MsbmF2aWdhdGU6dmUsZmV0Y2g6TmUscmV2YWxpZGF0ZTpUZSxjcmVhdGVIcmVmOlA9PmUuaGlzdG9yeS5jcmVhdGVIcmVmKFApLGVuY29kZUxvY2F0aW9uOlA9PmUuaGlzdG9yeS5lbmNvZGVMb2NhdGlvbihQKSxnZXRGZXRjaGVyOk9uLGRlbGV0ZUZldGNoZXI6bHIsZGlzcG9zZTpYLGdldEJsb2NrZXI6SGEsZGVsZXRlQmxvY2tlcjpLbSxfaW50ZXJuYWxGZXRjaENvbnRyb2xsZXJzOkcsX2ludGVybmFsQWN0aXZlRGVmZXJyZWRzOmllLF9pbnRlcm5hbFNldFJvdXRlczpNQ30seH1mdW5jdGlvbiB1TShlKXtyZXR1cm4gZSE9bnVsbCYmKCJmb3JtRGF0YSJpbiBlJiZlLmZvcm1EYXRhIT1udWxsfHwiYm9keSJpbiBlJiZlLmJvZHkhPT12b2lkIDApfWZ1bmN0aW9uIEFwKGUsdCxuLHIsbyxpLGwpe2xldCBzLGE7aWYoaSE9bnVsbCYmbCE9PSJwYXRoIil7cz1bXTtmb3IobGV0IGMgb2YgdClpZihzLnB1c2goYyksYy5yb3V0ZS5pZD09PWkpe2E9YzticmVha319ZWxzZSBzPXQsYT10W3QubGVuZ3RoLTFdO2xldCB1PXFFKG98fCIuIixEbShzKS5tYXAoYz0+Yy5wYXRobmFtZUJhc2UpLFZhKGUucGF0aG5hbWUsbil8fGUucGF0aG5hbWUsbD09PSJwYXRoIik7cmV0dXJuIG89PW51bGwmJih1LnNlYXJjaD1lLnNlYXJjaCx1Lmhhc2g9ZS5oYXNoKSwobz09bnVsbHx8bz09PSIifHxvPT09Ii4iKSYmYSYmYS5yb3V0ZS5pbmRleCYmIWptKHUuc2VhcmNoKSYmKHUuc2VhcmNoPXUuc2VhcmNoP3Uuc2VhcmNoLnJlcGxhY2UoL15cPy8sIj9pbmRleCYiKToiP2luZGV4IiksciYmbiE9PSIvIiYmKHUucGF0aG5hbWU9dS5wYXRobmFtZT09PSIvIj9uOmJvKFtuLHUucGF0aG5hbWVdKSksVWEodSl9ZnVuY3Rpb24gQjAoZSx0LG4scil7aWYoIXJ8fCF1TShyKSlyZXR1cm57cGF0aDpufTtpZihyLmZvcm1NZXRob2QmJiFtTShyLmZvcm1NZXRob2QpKXJldHVybntwYXRoOm4sZXJyb3I6QW4oNDA1LHttZXRob2Q6ci5mb3JtTWV0aG9kfSl9O2xldCBvPSgpPT4oe3BhdGg6bixlcnJvcjpBbig0MDAse3R5cGU6ImludmFsaWQtYm9keSJ9KX0pLGk9ci5mb3JtTWV0aG9kfHwiZ2V0IixsPWU/aS50b1VwcGVyQ2FzZSgpOmkudG9Mb3dlckNhc2UoKSxzPWlDKG4pO2lmKHIuYm9keSE9PXZvaWQgMCl7aWYoci5mb3JtRW5jVHlwZT09PSJ0ZXh0L3BsYWluIil7aWYoIUpuKGwpKXJldHVybiBvKCk7bGV0IGY9dHlwZW9mIHIuYm9keT09InN0cmluZyI/ci5ib2R5OnIuYm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhfHxyLmJvZHkgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM/QXJyYXkuZnJvbShyLmJvZHkuZW50cmllcygpKS5yZWR1Y2UoKGgsbSk9PntsZXRbZyxTXT1tO3JldHVybiIiK2grZysiPSIrUytgCmB9LCIiKTpTdHJpbmcoci5ib2R5KTtyZXR1cm57cGF0aDpuLHN1Ym1pc3Npb246e2Zvcm1NZXRob2Q6bCxmb3JtQWN0aW9uOnMsZm9ybUVuY1R5cGU6ci5mb3JtRW5jVHlwZSxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDpmfX19ZWxzZSBpZihyLmZvcm1FbmNUeXBlPT09ImFwcGxpY2F0aW9uL2pzb24iKXtpZighSm4obCkpcmV0dXJuIG8oKTt0cnl7bGV0IGY9dHlwZW9mIHIuYm9keT09InN0cmluZyI/SlNPTi5wYXJzZShyLmJvZHkpOnIuYm9keTtyZXR1cm57cGF0aDpuLHN1Ym1pc3Npb246e2Zvcm1NZXRob2Q6bCxmb3JtQWN0aW9uOnMsZm9ybUVuY1R5cGU6ci5mb3JtRW5jVHlwZSxmb3JtRGF0YTp2b2lkIDAsanNvbjpmLHRleHQ6dm9pZCAwfX19Y2F0Y2h7cmV0dXJuIG8oKX19fVNlKHR5cGVvZiBGb3JtRGF0YT09ImZ1bmN0aW9uIiwiRm9ybURhdGEgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Iik7bGV0IGEsdTtpZihyLmZvcm1EYXRhKWE9TXAoci5mb3JtRGF0YSksdT1yLmZvcm1EYXRhO2Vsc2UgaWYoci5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEpYT1NcChyLmJvZHkpLHU9ci5ib2R5O2Vsc2UgaWYoci5ib2R5IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKWE9ci5ib2R5LHU9SDAoYSk7ZWxzZSBpZihyLmJvZHk9PW51bGwpYT1uZXcgVVJMU2VhcmNoUGFyYW1zLHU9bmV3IEZvcm1EYXRhO2Vsc2UgdHJ5e2E9bmV3IFVSTFNlYXJjaFBhcmFtcyhyLmJvZHkpLHU9SDAoYSl9Y2F0Y2h7cmV0dXJuIG8oKX1sZXQgYz17Zm9ybU1ldGhvZDpsLGZvcm1BY3Rpb246cyxmb3JtRW5jVHlwZTpyJiZyLmZvcm1FbmNUeXBlfHwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixmb3JtRGF0YTp1LGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfTtpZihKbihjLmZvcm1NZXRob2QpKXJldHVybntwYXRoOm4sc3VibWlzc2lvbjpjfTtsZXQgZD1xcihuKTtyZXR1cm4gdCYmZC5zZWFyY2gmJmptKGQuc2VhcmNoKSYmYS5hcHBlbmQoImluZGV4IiwiIiksZC5zZWFyY2g9Ij8iK2Ese3BhdGg6VWEoZCksc3VibWlzc2lvbjpjfX1mdW5jdGlvbiBjTShlLHQpe2xldCBuPWU7aWYodCl7bGV0IHI9ZS5maW5kSW5kZXgobz0+by5yb3V0ZS5pZD09PXQpO3I+PTAmJihuPWUuc2xpY2UoMCxyKSl9cmV0dXJuIG59ZnVuY3Rpb24gVzAoZSx0LG4scixvLGksbCxzLGEsdSxjLGQsZixoKXtsZXQgbT1oP09iamVjdC52YWx1ZXMoaClbMF06Zj9PYmplY3QudmFsdWVzKGYpWzBdOnZvaWQgMCxnPWUuY3JlYXRlVVJMKHQubG9jYXRpb24pLFM9ZS5jcmVhdGVVUkwobyksdj1oP09iamVjdC5rZXlzKGgpWzBdOnZvaWQgMCx4PWNNKG4sdikuZmlsdGVyKChrLGIpPT57aWYoay5yb3V0ZS5sYXp5KXJldHVybiEwO2lmKGsucm91dGUubG9hZGVyPT1udWxsKXJldHVybiExO2lmKGRNKHQubG9hZGVyRGF0YSx0Lm1hdGNoZXNbYl0sayl8fGwuc29tZShEPT5EPT09ay5yb3V0ZS5pZCkpcmV0dXJuITA7bGV0IFQ9dC5tYXRjaGVzW2JdLE49aztyZXR1cm4gVTAoayxvdCh7Y3VycmVudFVybDpnLGN1cnJlbnRQYXJhbXM6VC5wYXJhbXMsbmV4dFVybDpTLG5leHRQYXJhbXM6Ti5wYXJhbXN9LHIse2FjdGlvblJlc3VsdDptLGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlOml8fGcucGF0aG5hbWUrZy5zZWFyY2g9PT1TLnBhdGhuYW1lK1Muc2VhcmNofHxnLnNlYXJjaCE9PVMuc2VhcmNofHxvQyhULE4pfSkpfSksdz1bXTtyZXR1cm4gYS5mb3JFYWNoKChrLGIpPT57aWYoIW4uc29tZShqPT5qLnJvdXRlLmlkPT09ay5yb3V0ZUlkKSlyZXR1cm47bGV0IFQ9bGwoYyxrLnBhdGgsZCk7aWYoIVQpe3cucHVzaCh7a2V5OmIscm91dGVJZDprLnJvdXRlSWQscGF0aDprLnBhdGgsbWF0Y2hlczpudWxsLG1hdGNoOm51bGwsY29udHJvbGxlcjpudWxsfSk7cmV0dXJufWxldCBOPXQuZmV0Y2hlcnMuZ2V0KGIpLEQ9THAoVCxrLnBhdGgpLE89ITE7dS5oYXMoYik/Tz0hMTpzLmluY2x1ZGVzKGIpP089ITA6TiYmTi5zdGF0ZSE9PSJpZGxlIiYmTi5kYXRhPT09dm9pZCAwP089aTpPPVUwKEQsb3Qoe2N1cnJlbnRVcmw6ZyxjdXJyZW50UGFyYW1zOnQubWF0Y2hlc1t0Lm1hdGNoZXMubGVuZ3RoLTFdLnBhcmFtcyxuZXh0VXJsOlMsbmV4dFBhcmFtczpuW24ubGVuZ3RoLTFdLnBhcmFtc30scix7YWN0aW9uUmVzdWx0Om0sZGVmYXVsdFNob3VsZFJldmFsaWRhdGU6aX0pKSxPJiZ3LnB1c2goe2tleTpiLHJvdXRlSWQ6ay5yb3V0ZUlkLHBhdGg6ay5wYXRoLG1hdGNoZXM6VCxtYXRjaDpELGNvbnRyb2xsZXI6bmV3IEFib3J0Q29udHJvbGxlcn0pfSksW3gsd119ZnVuY3Rpb24gZE0oZSx0LG4pe2xldCByPSF0fHxuLnJvdXRlLmlkIT09dC5yb3V0ZS5pZCxvPWVbbi5yb3V0ZS5pZF09PT12b2lkIDA7cmV0dXJuIHJ8fG99ZnVuY3Rpb24gb0MoZSx0KXtsZXQgbj1lLnJvdXRlLnBhdGg7cmV0dXJuIGUucGF0aG5hbWUhPT10LnBhdGhuYW1lfHxuIT1udWxsJiZuLmVuZHNXaXRoKCIqIikmJmUucGFyYW1zWyIqIl0hPT10LnBhcmFtc1siKiJdfWZ1bmN0aW9uIFUwKGUsdCl7aWYoZS5yb3V0ZS5zaG91bGRSZXZhbGlkYXRlKXtsZXQgbj1lLnJvdXRlLnNob3VsZFJldmFsaWRhdGUodCk7aWYodHlwZW9mIG49PSJib29sZWFuIilyZXR1cm4gbn1yZXR1cm4gdC5kZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZX1hc3luYyBmdW5jdGlvbiBWMChlLHQsbil7aWYoIWUubGF6eSlyZXR1cm47bGV0IHI9YXdhaXQgZS5sYXp5KCk7aWYoIWUubGF6eSlyZXR1cm47bGV0IG89bltlLmlkXTtTZShvLCJObyByb3V0ZSBmb3VuZCBpbiBtYW5pZmVzdCIpO2xldCBpPXt9O2ZvcihsZXQgbCBpbiByKXtsZXQgYT1vW2xdIT09dm9pZCAwJiZsIT09Imhhc0Vycm9yQm91bmRhcnkiO3dpKCFhLCdSb3V0ZSAiJytvLmlkKyciIGhhcyBhIHN0YXRpYyBwcm9wZXJ0eSAiJytsKyciIGRlZmluZWQgYnV0IGl0cyBsYXp5IGZ1bmN0aW9uIGlzIGFsc28gcmV0dXJuaW5nIGEgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHkuICcrKCdUaGUgbGF6eSByb3V0ZSBwcm9wZXJ0eSAiJytsKyciIHdpbGwgYmUgaWdub3JlZC4nKSksIWEmJiFBMy5oYXMobCkmJihpW2xdPXJbbF0pfU9iamVjdC5hc3NpZ24obyxpKSxPYmplY3QuYXNzaWduKG8sb3Qoe30sdChvKSx7bGF6eTp2b2lkIDB9KSl9YXN5bmMgZnVuY3Rpb24gZ3MoZSx0LG4scixvLGksbCxzKXtzPT09dm9pZCAwJiYocz17fSk7bGV0IGEsdSxjLGQ9bT0+e2xldCBnLFM9bmV3IFByb21pc2UoKHYseSk9Pmc9eSk7cmV0dXJuIGM9KCk9PmcoKSx0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsYyksUHJvbWlzZS5yYWNlKFttKHtyZXF1ZXN0OnQscGFyYW1zOm4ucGFyYW1zLGNvbnRleHQ6cy5yZXF1ZXN0Q29udGV4dH0pLFNdKX07dHJ5e2xldCBtPW4ucm91dGVbZV07aWYobi5yb3V0ZS5sYXp5KWlmKG0pe2xldCBnLFM9YXdhaXQgUHJvbWlzZS5hbGwoW2QobSkuY2F0Y2godj0+e2c9dn0pLFYwKG4ucm91dGUsaSxvKV0pO2lmKGcpdGhyb3cgZzt1PVNbMF19ZWxzZSBpZihhd2FpdCBWMChuLnJvdXRlLGksbyksbT1uLnJvdXRlW2VdLG0pdT1hd2FpdCBkKG0pO2Vsc2UgaWYoZT09PSJhY3Rpb24iKXtsZXQgZz1uZXcgVVJMKHQudXJsKSxTPWcucGF0aG5hbWUrZy5zZWFyY2g7dGhyb3cgQW4oNDA1LHttZXRob2Q6dC5tZXRob2QscGF0aG5hbWU6Uyxyb3V0ZUlkOm4ucm91dGUuaWR9KX1lbHNlIHJldHVybnt0eXBlOmF0LmRhdGEsZGF0YTp2b2lkIDB9O2Vsc2UgaWYobSl1PWF3YWl0IGQobSk7ZWxzZXtsZXQgZz1uZXcgVVJMKHQudXJsKSxTPWcucGF0aG5hbWUrZy5zZWFyY2g7dGhyb3cgQW4oNDA0LHtwYXRobmFtZTpTfSl9U2UodSE9PXZvaWQgMCwiWW91IGRlZmluZWQgIisoZT09PSJhY3Rpb24iPyJhbiBhY3Rpb24iOiJhIGxvYWRlciIpKyIgZm9yIHJvdXRlICIrKCciJytuLnJvdXRlLmlkKyJcIiBidXQgZGlkbid0IHJldHVybiBhbnl0aGluZyBmcm9tIHlvdXIgYCIrZSsiYCAiKSsiZnVuY3Rpb24uIFBsZWFzZSByZXR1cm4gYSB2YWx1ZSBvciBgbnVsbGAuIil9Y2F0Y2gobSl7YT1hdC5lcnJvcix1PW19ZmluYWxseXtjJiZ0LnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsYyl9aWYoZ00odSkpe2xldCBtPXUuc3RhdHVzO2lmKG9NLmhhcyhtKSl7bGV0IHY9dS5oZWFkZXJzLmdldCgiTG9jYXRpb24iKTtpZihTZSh2LCJSZWRpcmVjdHMgcmV0dXJuZWQvdGhyb3duIGZyb20gbG9hZGVycy9hY3Rpb25zIG11c3QgaGF2ZSBhIExvY2F0aW9uIGhlYWRlciIpLCFuQy50ZXN0KHYpKXY9QXAobmV3IFVSTCh0LnVybCksci5zbGljZSgwLHIuaW5kZXhPZihuKSsxKSxsLCEwLHYpO2Vsc2UgaWYoIXMuaXNTdGF0aWNSZXF1ZXN0KXtsZXQgeT1uZXcgVVJMKHQudXJsKSx4PXYuc3RhcnRzV2l0aCgiLy8iKT9uZXcgVVJMKHkucHJvdG9jb2wrdik6bmV3IFVSTCh2KSx3PVZhKHgucGF0aG5hbWUsbCkhPW51bGw7eC5vcmlnaW49PT15Lm9yaWdpbiYmdyYmKHY9eC5wYXRobmFtZSt4LnNlYXJjaCt4Lmhhc2gpfWlmKHMuaXNTdGF0aWNSZXF1ZXN0KXRocm93IHUuaGVhZGVycy5zZXQoIkxvY2F0aW9uIix2KSx1O3JldHVybnt0eXBlOmF0LnJlZGlyZWN0LHN0YXR1czptLGxvY2F0aW9uOnYscmV2YWxpZGF0ZTp1LmhlYWRlcnMuZ2V0KCJYLVJlbWl4LVJldmFsaWRhdGUiKSE9PW51bGwscmVsb2FkRG9jdW1lbnQ6dS5oZWFkZXJzLmdldCgiWC1SZW1peC1SZWxvYWQtRG9jdW1lbnQiKSE9PW51bGx9fWlmKHMuaXNSb3V0ZVJlcXVlc3QpdGhyb3d7dHlwZTphPT09YXQuZXJyb3I/YXQuZXJyb3I6YXQuZGF0YSxyZXNwb25zZTp1fTtsZXQgZyxTPXUuaGVhZGVycy5nZXQoIkNvbnRlbnQtVHlwZSIpO3JldHVybiBTJiYvXGJhcHBsaWNhdGlvblwvanNvblxiLy50ZXN0KFMpP2c9YXdhaXQgdS5qc29uKCk6Zz1hd2FpdCB1LnRleHQoKSxhPT09YXQuZXJyb3I/e3R5cGU6YSxlcnJvcjpuZXcgSW0obSx1LnN0YXR1c1RleHQsZyksaGVhZGVyczp1LmhlYWRlcnN9Ont0eXBlOmF0LmRhdGEsZGF0YTpnLHN0YXR1c0NvZGU6dS5zdGF0dXMsaGVhZGVyczp1LmhlYWRlcnN9fWlmKGE9PT1hdC5lcnJvcilyZXR1cm57dHlwZTphLGVycm9yOnV9O2lmKHBNKHUpKXt2YXIgZixoO3JldHVybnt0eXBlOmF0LmRlZmVycmVkLGRlZmVycmVkRGF0YTp1LHN0YXR1c0NvZGU6KGY9dS5pbml0KT09bnVsbD92b2lkIDA6Zi5zdGF0dXMsaGVhZGVyczooKGg9dS5pbml0KT09bnVsbD92b2lkIDA6aC5oZWFkZXJzKSYmbmV3IEhlYWRlcnModS5pbml0LmhlYWRlcnMpfX1yZXR1cm57dHlwZTphdC5kYXRhLGRhdGE6dX19ZnVuY3Rpb24gbXMoZSx0LG4scil7bGV0IG89ZS5jcmVhdGVVUkwoaUModCkpLnRvU3RyaW5nKCksaT17c2lnbmFsOm59O2lmKHImJkpuKHIuZm9ybU1ldGhvZCkpe2xldHtmb3JtTWV0aG9kOmwsZm9ybUVuY1R5cGU6c309cjtpLm1ldGhvZD1sLnRvVXBwZXJDYXNlKCkscz09PSJhcHBsaWNhdGlvbi9qc29uIj8oaS5oZWFkZXJzPW5ldyBIZWFkZXJzKHsiQ29udGVudC1UeXBlIjpzfSksaS5ib2R5PUpTT04uc3RyaW5naWZ5KHIuanNvbikpOnM9PT0idGV4dC9wbGFpbiI/aS5ib2R5PXIudGV4dDpzPT09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCImJnIuZm9ybURhdGE/aS5ib2R5PU1wKHIuZm9ybURhdGEpOmkuYm9keT1yLmZvcm1EYXRhfXJldHVybiBuZXcgUmVxdWVzdChvLGkpfWZ1bmN0aW9uIE1wKGUpe2xldCB0PW5ldyBVUkxTZWFyY2hQYXJhbXM7Zm9yKGxldFtuLHJdb2YgZS5lbnRyaWVzKCkpdC5hcHBlbmQobix0eXBlb2Ygcj09InN0cmluZyI/cjpyLm5hbWUpO3JldHVybiB0fWZ1bmN0aW9uIEgwKGUpe2xldCB0PW5ldyBGb3JtRGF0YTtmb3IobGV0W24scl1vZiBlLmVudHJpZXMoKSl0LmFwcGVuZChuLHIpO3JldHVybiB0fWZ1bmN0aW9uIGZNKGUsdCxuLHIsbyl7bGV0IGk9e30sbD1udWxsLHMsYT0hMSx1PXt9O3JldHVybiBuLmZvckVhY2goKGMsZCk9PntsZXQgZj10W2RdLnJvdXRlLmlkO2lmKFNlKCF5bChjKSwiQ2Fubm90IGhhbmRsZSByZWRpcmVjdCByZXN1bHRzIGluIHByb2Nlc3NMb2FkZXJEYXRhIiksR3MoYykpe2xldCBoPUtzKGUsZiksbT1jLmVycm9yO3ImJihtPU9iamVjdC52YWx1ZXMocilbMF0scj12b2lkIDApLGw9bHx8e30sbFtoLnJvdXRlLmlkXT09bnVsbCYmKGxbaC5yb3V0ZS5pZF09bSksaVtmXT12b2lkIDAsYXx8KGE9ITAscz1lQyhjLmVycm9yKT9jLmVycm9yLnN0YXR1czo1MDApLGMuaGVhZGVycyYmKHVbZl09Yy5oZWFkZXJzKX1lbHNlIG5pKGMpPyhvLnNldChmLGMuZGVmZXJyZWREYXRhKSxpW2ZdPWMuZGVmZXJyZWREYXRhLmRhdGEpOmlbZl09Yy5kYXRhLGMuc3RhdHVzQ29kZSE9bnVsbCYmYy5zdGF0dXNDb2RlIT09MjAwJiYhYSYmKHM9Yy5zdGF0dXNDb2RlKSxjLmhlYWRlcnMmJih1W2ZdPWMuaGVhZGVycyl9KSxyJiYobD1yLGlbT2JqZWN0LmtleXMocilbMF1dPXZvaWQgMCkse2xvYWRlckRhdGE6aSxlcnJvcnM6bCxzdGF0dXNDb2RlOnN8fDIwMCxsb2FkZXJIZWFkZXJzOnV9fWZ1bmN0aW9uIEswKGUsdCxuLHIsbyxpLGwscyl7bGV0e2xvYWRlckRhdGE6YSxlcnJvcnM6dX09Zk0odCxuLHIsbyxzKTtmb3IobGV0IGM9MDtjPGkubGVuZ3RoO2MrKyl7bGV0e2tleTpkLG1hdGNoOmYsY29udHJvbGxlcjpofT1pW2NdO1NlKGwhPT12b2lkIDAmJmxbY10hPT12b2lkIDAsIkRpZCBub3QgZmluZCBjb3JyZXNwb25kaW5nIGZldGNoZXIgcmVzdWx0Iik7bGV0IG09bFtjXTtpZighKGgmJmguc2lnbmFsLmFib3J0ZWQpKWlmKEdzKG0pKXtsZXQgZz1LcyhlLm1hdGNoZXMsZj09bnVsbD92b2lkIDA6Zi5yb3V0ZS5pZCk7dSYmdVtnLnJvdXRlLmlkXXx8KHU9b3Qoe30sdSx7W2cucm91dGUuaWRdOm0uZXJyb3J9KSksZS5mZXRjaGVycy5kZWxldGUoZCl9ZWxzZSBpZih5bChtKSlTZSghMSwiVW5oYW5kbGVkIGZldGNoZXIgcmV2YWxpZGF0aW9uIHJlZGlyZWN0Iik7ZWxzZSBpZihuaShtKSlTZSghMSwiVW5oYW5kbGVkIGZldGNoZXIgZGVmZXJyZWQgZGF0YSIpO2Vsc2V7bGV0IGc9c28obS5kYXRhKTtlLmZldGNoZXJzLnNldChkLGcpfX1yZXR1cm57bG9hZGVyRGF0YTphLGVycm9yczp1fX1mdW5jdGlvbiBHMChlLHQsbixyKXtsZXQgbz1vdCh7fSx0KTtmb3IobGV0IGkgb2Ygbil7bGV0IGw9aS5yb3V0ZS5pZDtpZih0Lmhhc093blByb3BlcnR5KGwpP3RbbF0hPT12b2lkIDAmJihvW2xdPXRbbF0pOmVbbF0hPT12b2lkIDAmJmkucm91dGUubG9hZGVyJiYob1tsXT1lW2xdKSxyJiZyLmhhc093blByb3BlcnR5KGwpKWJyZWFrfXJldHVybiBvfWZ1bmN0aW9uIEtzKGUsdCl7cmV0dXJuKHQ/ZS5zbGljZSgwLGUuZmluZEluZGV4KHI9PnIucm91dGUuaWQ9PT10KSsxKTpbLi4uZV0pLnJldmVyc2UoKS5maW5kKHI9PnIucm91dGUuaGFzRXJyb3JCb3VuZGFyeT09PSEwKXx8ZVswXX1mdW5jdGlvbiBZMChlKXtsZXQgdD1lLmxlbmd0aD09PTE/ZVswXTplLmZpbmQobj0+bi5pbmRleHx8IW4ucGF0aHx8bi5wYXRoPT09Ii8iKXx8e2lkOiJfX3NoaW0tZXJyb3Itcm91dGVfXyJ9O3JldHVybnttYXRjaGVzOlt7cGFyYW1zOnt9LHBhdGhuYW1lOiIiLHBhdGhuYW1lQmFzZToiIixyb3V0ZTp0fV0scm91dGU6dH19ZnVuY3Rpb24gQW4oZSx0KXtsZXR7cGF0aG5hbWU6bixyb3V0ZUlkOnIsbWV0aG9kOm8sdHlwZTppfT10PT09dm9pZCAwP3t9OnQsbD0iVW5rbm93biBTZXJ2ZXIgRXJyb3IiLHM9IlVua25vd24gQHJlbWl4LXJ1bi9yb3V0ZXIgZXJyb3IiO3JldHVybiBlPT09NDAwPyhsPSJCYWQgUmVxdWVzdCIsbyYmbiYmcj9zPSJZb3UgbWFkZSBhICIrbysnIHJlcXVlc3QgdG8gIicrbisnIiBidXQgJysoJ2RpZCBub3QgcHJvdmlkZSBhIGBsb2FkZXJgIGZvciByb3V0ZSAiJytyKyciLCAnKSsic28gdGhlcmUgaXMgbm8gd2F5IHRvIGhhbmRsZSB0aGUgcmVxdWVzdC4iOmk9PT0iZGVmZXItYWN0aW9uIj9zPSJkZWZlcigpIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYWN0aW9ucyI6aT09PSJpbnZhbGlkLWJvZHkiJiYocz0iVW5hYmxlIHRvIGVuY29kZSBzdWJtaXNzaW9uIGJvZHkiKSk6ZT09PTQwMz8obD0iRm9yYmlkZGVuIixzPSdSb3V0ZSAiJytyKyciIGRvZXMgbm90IG1hdGNoIFVSTCAiJytuKyciJyk6ZT09PTQwND8obD0iTm90IEZvdW5kIixzPSdObyByb3V0ZSBtYXRjaGVzIFVSTCAiJytuKyciJyk6ZT09PTQwNSYmKGw9Ik1ldGhvZCBOb3QgQWxsb3dlZCIsbyYmbiYmcj9zPSJZb3UgbWFkZSBhICIrby50b1VwcGVyQ2FzZSgpKycgcmVxdWVzdCB0byAiJytuKyciIGJ1dCAnKygnZGlkIG5vdCBwcm92aWRlIGFuIGBhY3Rpb25gIGZvciByb3V0ZSAiJytyKyciLCAnKSsic28gdGhlcmUgaXMgbm8gd2F5IHRvIGhhbmRsZSB0aGUgcmVxdWVzdC4iOm8mJihzPSdJbnZhbGlkIHJlcXVlc3QgbWV0aG9kICInK28udG9VcHBlckNhc2UoKSsnIicpKSxuZXcgSW0oZXx8NTAwLGwsbmV3IEVycm9yKHMpLCEwKX1mdW5jdGlvbiBYMChlKXtmb3IobGV0IHQ9ZS5sZW5ndGgtMTt0Pj0wO3QtLSl7bGV0IG49ZVt0XTtpZih5bChuKSlyZXR1cm57cmVzdWx0Om4saWR4OnR9fX1mdW5jdGlvbiBpQyhlKXtsZXQgdD10eXBlb2YgZT09InN0cmluZyI/cXIoZSk6ZTtyZXR1cm4gVWEob3Qoe30sdCx7aGFzaDoiIn0pKX1mdW5jdGlvbiBoTShlLHQpe3JldHVybiBlLnBhdGhuYW1lIT09dC5wYXRobmFtZXx8ZS5zZWFyY2ghPT10LnNlYXJjaD8hMTplLmhhc2g9PT0iIj90Lmhhc2ghPT0iIjplLmhhc2g9PT10Lmhhc2g/ITA6dC5oYXNoIT09IiJ9ZnVuY3Rpb24gbmkoZSl7cmV0dXJuIGUudHlwZT09PWF0LmRlZmVycmVkfWZ1bmN0aW9uIEdzKGUpe3JldHVybiBlLnR5cGU9PT1hdC5lcnJvcn1mdW5jdGlvbiB5bChlKXtyZXR1cm4oZSYmZS50eXBlKT09PWF0LnJlZGlyZWN0fWZ1bmN0aW9uIHBNKGUpe2xldCB0PWU7cmV0dXJuIHQmJnR5cGVvZiB0PT0ib2JqZWN0IiYmdHlwZW9mIHQuZGF0YT09Im9iamVjdCImJnR5cGVvZiB0LnN1YnNjcmliZT09ImZ1bmN0aW9uIiYmdHlwZW9mIHQuY2FuY2VsPT0iZnVuY3Rpb24iJiZ0eXBlb2YgdC5yZXNvbHZlRGF0YT09ImZ1bmN0aW9uIn1mdW5jdGlvbiBnTShlKXtyZXR1cm4gZSE9bnVsbCYmdHlwZW9mIGUuc3RhdHVzPT0ibnVtYmVyIiYmdHlwZW9mIGUuc3RhdHVzVGV4dD09InN0cmluZyImJnR5cGVvZiBlLmhlYWRlcnM9PSJvYmplY3QiJiZ0eXBlb2YgZS5ib2R5PCJ1In1mdW5jdGlvbiBtTShlKXtyZXR1cm4gck0uaGFzKGUudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gSm4oZSl7cmV0dXJuIHRNLmhhcyhlLnRvTG93ZXJDYXNlKCkpfWFzeW5jIGZ1bmN0aW9uIFEwKGUsdCxuLHIsbyxpKXtmb3IobGV0IGw9MDtsPG4ubGVuZ3RoO2wrKyl7bGV0IHM9bltsXSxhPXRbbF07aWYoIWEpY29udGludWU7bGV0IHU9ZS5maW5kKGQ9PmQucm91dGUuaWQ9PT1hLnJvdXRlLmlkKSxjPXUhPW51bGwmJiFvQyh1LGEpJiYoaSYmaVthLnJvdXRlLmlkXSkhPT12b2lkIDA7aWYobmkocykmJihvfHxjKSl7bGV0IGQ9cltsXTtTZShkLCJFeHBlY3RlZCBhbiBBYm9ydFNpZ25hbCBmb3IgcmV2YWxpZGF0aW5nIGZldGNoZXIgZGVmZXJyZWQgcmVzdWx0IiksYXdhaXQgbEMocyxkLG8pLnRoZW4oZj0+e2YmJihuW2xdPWZ8fG5bbF0pfSl9fX1hc3luYyBmdW5jdGlvbiBsQyhlLHQsbil7aWYobj09PXZvaWQgMCYmKG49ITEpLCFhd2FpdCBlLmRlZmVycmVkRGF0YS5yZXNvbHZlRGF0YSh0KSl7aWYobil0cnl7cmV0dXJue3R5cGU6YXQuZGF0YSxkYXRhOmUuZGVmZXJyZWREYXRhLnVud3JhcHBlZERhdGF9fWNhdGNoKG8pe3JldHVybnt0eXBlOmF0LmVycm9yLGVycm9yOm99fXJldHVybnt0eXBlOmF0LmRhdGEsZGF0YTplLmRlZmVycmVkRGF0YS5kYXRhfX19ZnVuY3Rpb24gam0oZSl7cmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoZSkuZ2V0QWxsKCJpbmRleCIpLnNvbWUodD0+dD09PSIiKX1mdW5jdGlvbiBMcChlLHQpe2xldCBuPXR5cGVvZiB0PT0ic3RyaW5nIj9xcih0KS5zZWFyY2g6dC5zZWFyY2g7aWYoZVtlLmxlbmd0aC0xXS5yb3V0ZS5pbmRleCYmam0obnx8IiIpKXJldHVybiBlW2UubGVuZ3RoLTFdO2xldCByPURtKGUpO3JldHVybiByW3IubGVuZ3RoLTFdfWZ1bmN0aW9uIEowKGUpe2xldHtmb3JtTWV0aG9kOnQsZm9ybUFjdGlvbjpuLGZvcm1FbmNUeXBlOnIsdGV4dDpvLGZvcm1EYXRhOmksanNvbjpsfT1lO2lmKCEoIXR8fCFufHwhcikpe2lmKG8hPW51bGwpcmV0dXJue2Zvcm1NZXRob2Q6dCxmb3JtQWN0aW9uOm4sZm9ybUVuY1R5cGU6cixmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDpvfTtpZihpIT1udWxsKXJldHVybntmb3JtTWV0aG9kOnQsZm9ybUFjdGlvbjpuLGZvcm1FbmNUeXBlOnIsZm9ybURhdGE6aSxqc29uOnZvaWQgMCx0ZXh0OnZvaWQgMH07aWYobCE9PXZvaWQgMClyZXR1cm57Zm9ybU1ldGhvZDp0LGZvcm1BY3Rpb246bixmb3JtRW5jVHlwZTpyLGZvcm1EYXRhOnZvaWQgMCxqc29uOmwsdGV4dDp2b2lkIDB9fX1mdW5jdGlvbiBEZihlLHQpe3JldHVybiB0P3tzdGF0ZToibG9hZGluZyIsbG9jYXRpb246ZSxmb3JtTWV0aG9kOnQuZm9ybU1ldGhvZCxmb3JtQWN0aW9uOnQuZm9ybUFjdGlvbixmb3JtRW5jVHlwZTp0LmZvcm1FbmNUeXBlLGZvcm1EYXRhOnQuZm9ybURhdGEsanNvbjp0Lmpzb24sdGV4dDp0LnRleHR9OntzdGF0ZToibG9hZGluZyIsbG9jYXRpb246ZSxmb3JtTWV0aG9kOnZvaWQgMCxmb3JtQWN0aW9uOnZvaWQgMCxmb3JtRW5jVHlwZTp2b2lkIDAsZm9ybURhdGE6dm9pZCAwLGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfX1mdW5jdGlvbiB2TShlLHQpe3JldHVybntzdGF0ZToic3VibWl0dGluZyIsbG9jYXRpb246ZSxmb3JtTWV0aG9kOnQuZm9ybU1ldGhvZCxmb3JtQWN0aW9uOnQuZm9ybUFjdGlvbixmb3JtRW5jVHlwZTp0LmZvcm1FbmNUeXBlLGZvcm1EYXRhOnQuZm9ybURhdGEsanNvbjp0Lmpzb24sdGV4dDp0LnRleHR9fWZ1bmN0aW9uIHZzKGUsdCl7cmV0dXJuIGU/e3N0YXRlOiJsb2FkaW5nIixmb3JtTWV0aG9kOmUuZm9ybU1ldGhvZCxmb3JtQWN0aW9uOmUuZm9ybUFjdGlvbixmb3JtRW5jVHlwZTplLmZvcm1FbmNUeXBlLGZvcm1EYXRhOmUuZm9ybURhdGEsanNvbjplLmpzb24sdGV4dDplLnRleHQsZGF0YTp0fTp7c3RhdGU6ImxvYWRpbmciLGZvcm1NZXRob2Q6dm9pZCAwLGZvcm1BY3Rpb246dm9pZCAwLGZvcm1FbmNUeXBlOnZvaWQgMCxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDAsZGF0YTp0fX1mdW5jdGlvbiB5TShlLHQpe3JldHVybntzdGF0ZToic3VibWl0dGluZyIsZm9ybU1ldGhvZDplLmZvcm1NZXRob2QsZm9ybUFjdGlvbjplLmZvcm1BY3Rpb24sZm9ybUVuY1R5cGU6ZS5mb3JtRW5jVHlwZSxmb3JtRGF0YTplLmZvcm1EYXRhLGpzb246ZS5qc29uLHRleHQ6ZS50ZXh0LGRhdGE6dD90LmRhdGE6dm9pZCAwfX1mdW5jdGlvbiBzbyhlKXtyZXR1cm57c3RhdGU6ImlkbGUiLGZvcm1NZXRob2Q6dm9pZCAwLGZvcm1BY3Rpb246dm9pZCAwLGZvcm1FbmNUeXBlOnZvaWQgMCxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDAsZGF0YTplfX1mdW5jdGlvbiB4TShlLHQpe3RyeXtsZXQgbj1lLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0ockMpO2lmKG4pe2xldCByPUpTT04ucGFyc2Uobik7Zm9yKGxldFtvLGldb2YgT2JqZWN0LmVudHJpZXMocnx8e30pKWkmJkFycmF5LmlzQXJyYXkoaSkmJnQuc2V0KG8sbmV3IFNldChpfHxbXSkpfX1jYXRjaHt9fWZ1bmN0aW9uIHdNKGUsdCl7aWYodC5zaXplPjApe2xldCBuPXt9O2ZvcihsZXRbcixvXW9mIHQpbltyXT1bLi4ub107dHJ5e2Uuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShyQyxKU09OLnN0cmluZ2lmeShuKSl9Y2F0Y2gocil7d2koITEsIkZhaWxlZCB0byBzYXZlIGFwcGxpZWQgdmlldyB0cmFuc2l0aW9ucyBpbiBzZXNzaW9uU3RvcmFnZSAoIityKyIpLiIpfX19LyoqCiAqIFJlYWN0IFJvdXRlciB2Ni4xOC4wCiAqCiAqIENvcHlyaWdodCAoYykgUmVtaXggU29mdHdhcmUgSW5jLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRS5tZCBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKgogKiBAbGljZW5zZSBNSVQKICovZnVuY3Rpb24gV2MoKXtyZXR1cm4gV2M9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSxXYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9Y29uc3QgUGQ9cC5jcmVhdGVDb250ZXh0KG51bGwpLHNDPXAuY3JlYXRlQ29udGV4dChudWxsKSxPZD1wLmNyZWF0ZUNvbnRleHQobnVsbCksQWQ9cC5jcmVhdGVDb250ZXh0KG51bGwpLEFpPXAuY3JlYXRlQ29udGV4dCh7b3V0bGV0Om51bGwsbWF0Y2hlczpbXSxpc0RhdGFSb3V0ZTohMX0pLGFDPXAuY3JlYXRlQ29udGV4dChudWxsKTtmdW5jdGlvbiBNZCgpe3JldHVybiBwLnVzZUNvbnRleHQoQWQpIT1udWxsfWZ1bmN0aW9uIHVDKCl7cmV0dXJuIE1kKCl8fFNlKCExKSxwLnVzZUNvbnRleHQoQWQpLmxvY2F0aW9ufWZ1bmN0aW9uIGNDKGUpe3AudXNlQ29udGV4dChPZCkuc3RhdGljfHxwLnVzZUxheW91dEVmZmVjdChlKX1mdW5jdGlvbiB6bSgpe2xldHtpc0RhdGFSb3V0ZTplfT1wLnVzZUNvbnRleHQoQWkpO3JldHVybiBlP0FNKCk6X00oKX1mdW5jdGlvbiBfTSgpe01kKCl8fFNlKCExKTtsZXQgZT1wLnVzZUNvbnRleHQoUGQpLHtiYXNlbmFtZTp0LG5hdmlnYXRvcjpufT1wLnVzZUNvbnRleHQoT2QpLHttYXRjaGVzOnJ9PXAudXNlQ29udGV4dChBaSkse3BhdGhuYW1lOm99PXVDKCksaT1KU09OLnN0cmluZ2lmeShEbShyKS5tYXAoYT0+YS5wYXRobmFtZUJhc2UpKSxsPXAudXNlUmVmKCExKTtyZXR1cm4gY0MoKCk9PntsLmN1cnJlbnQ9ITB9KSxwLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGEsdSl7aWYodT09PXZvaWQgMCYmKHU9e30pLCFsLmN1cnJlbnQpcmV0dXJuO2lmKHR5cGVvZiBhPT0ibnVtYmVyIil7bi5nbyhhKTtyZXR1cm59bGV0IGM9cUUoYSxKU09OLnBhcnNlKGkpLG8sdS5yZWxhdGl2ZT09PSJwYXRoIik7ZT09bnVsbCYmdCE9PSIvIiYmKGMucGF0aG5hbWU9Yy5wYXRobmFtZT09PSIvIj90OmJvKFt0LGMucGF0aG5hbWVdKSksKHUucmVwbGFjZT9uLnJlcGxhY2U6bi5wdXNoKShjLHUuc3RhdGUsdSl9LFt0LG4saSxvLGVdKX1mdW5jdGlvbiBTTSgpe2xldHttYXRjaGVzOmV9PXAudXNlQ29udGV4dChBaSksdD1lW2UubGVuZ3RoLTFdO3JldHVybiB0P3QucGFyYW1zOnt9fWZ1bmN0aW9uIEVNKGUsdCxuKXtNZCgpfHxTZSghMSk7bGV0e25hdmlnYXRvcjpyfT1wLnVzZUNvbnRleHQoT2QpLHttYXRjaGVzOm99PXAudXNlQ29udGV4dChBaSksaT1vW28ubGVuZ3RoLTFdLGw9aT9pLnBhcmFtczp7fTtpJiZpLnBhdGhuYW1lO2xldCBzPWk/aS5wYXRobmFtZUJhc2U6Ii8iO2kmJmkucm91dGU7bGV0IGE9dUMoKSx1O2lmKHQpe3ZhciBjO2xldCBnPXR5cGVvZiB0PT0ic3RyaW5nIj9xcih0KTp0O3M9PT0iLyJ8fChjPWcucGF0aG5hbWUpIT1udWxsJiZjLnN0YXJ0c1dpdGgocyl8fFNlKCExKSx1PWd9ZWxzZSB1PWE7bGV0IGQ9dS5wYXRobmFtZXx8Ii8iLGY9cz09PSIvIj9kOmQuc2xpY2Uocy5sZW5ndGgpfHwiLyIsaD1sbChlLHtwYXRobmFtZTpmfSksbT1iTShoJiZoLm1hcChnPT5PYmplY3QuYXNzaWduKHt9LGcse3BhcmFtczpPYmplY3QuYXNzaWduKHt9LGwsZy5wYXJhbXMpLHBhdGhuYW1lOmJvKFtzLHIuZW5jb2RlTG9jYXRpb24/ci5lbmNvZGVMb2NhdGlvbihnLnBhdGhuYW1lKS5wYXRobmFtZTpnLnBhdGhuYW1lXSkscGF0aG5hbWVCYXNlOmcucGF0aG5hbWVCYXNlPT09Ii8iP3M6Ym8oW3Msci5lbmNvZGVMb2NhdGlvbj9yLmVuY29kZUxvY2F0aW9uKGcucGF0aG5hbWVCYXNlKS5wYXRobmFtZTpnLnBhdGhuYW1lQmFzZV0pfSkpLG8sbik7cmV0dXJuIHQmJm0/cC5jcmVhdGVFbGVtZW50KEFkLlByb3ZpZGVyLHt2YWx1ZTp7bG9jYXRpb246V2Moe3BhdGhuYW1lOiIvIixzZWFyY2g6IiIsaGFzaDoiIixzdGF0ZTpudWxsLGtleToiZGVmYXVsdCJ9LHUpLG5hdmlnYXRpb25UeXBlOnN0LlBvcH19LG0pOm19ZnVuY3Rpb24gQ00oKXtsZXQgZT1PTSgpLHQ9ZUMoZSk/ZS5zdGF0dXMrIiAiK2Uuc3RhdHVzVGV4dDplIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOkpTT04uc3RyaW5naWZ5KGUpLG49ZSBpbnN0YW5jZW9mIEVycm9yP2Uuc3RhY2s6bnVsbCxvPXtwYWRkaW5nOiIwLjVyZW0iLGJhY2tncm91bmRDb2xvcjoicmdiYSgyMDAsMjAwLDIwMCwgMC41KSJ9LGk9bnVsbDtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxwLmNyZWF0ZUVsZW1lbnQoImgyIixudWxsLCJVbmV4cGVjdGVkIEFwcGxpY2F0aW9uIEVycm9yISIpLHAuY3JlYXRlRWxlbWVudCgiaDMiLHtzdHlsZTp7Zm9udFN0eWxlOiJpdGFsaWMifX0sdCksbj9wLmNyZWF0ZUVsZW1lbnQoInByZSIse3N0eWxlOm99LG4pOm51bGwsaSl9Y29uc3QgJE09cC5jcmVhdGVFbGVtZW50KENNLG51bGwpO2NsYXNzIGtNIGV4dGVuZHMgcC5Db21wb25lbnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5zdGF0ZT17bG9jYXRpb246dC5sb2NhdGlvbixyZXZhbGlkYXRpb246dC5yZXZhbGlkYXRpb24sZXJyb3I6dC5lcnJvcn19c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcih0KXtyZXR1cm57ZXJyb3I6dH19c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyh0LG4pe3JldHVybiBuLmxvY2F0aW9uIT09dC5sb2NhdGlvbnx8bi5yZXZhbGlkYXRpb24hPT0iaWRsZSImJnQucmV2YWxpZGF0aW9uPT09ImlkbGUiP3tlcnJvcjp0LmVycm9yLGxvY2F0aW9uOnQubG9jYXRpb24scmV2YWxpZGF0aW9uOnQucmV2YWxpZGF0aW9ufTp7ZXJyb3I6dC5lcnJvcnx8bi5lcnJvcixsb2NhdGlvbjpuLmxvY2F0aW9uLHJldmFsaWRhdGlvbjp0LnJldmFsaWRhdGlvbnx8bi5yZXZhbGlkYXRpb259fWNvbXBvbmVudERpZENhdGNoKHQsbil7Y29uc29sZS5lcnJvcigiUmVhY3QgUm91dGVyIGNhdWdodCB0aGUgZm9sbG93aW5nIGVycm9yIGR1cmluZyByZW5kZXIiLHQsbil9cmVuZGVyKCl7cmV0dXJuIHRoaXMuc3RhdGUuZXJyb3I/cC5jcmVhdGVFbGVtZW50KEFpLlByb3ZpZGVyLHt2YWx1ZTp0aGlzLnByb3BzLnJvdXRlQ29udGV4dH0scC5jcmVhdGVFbGVtZW50KGFDLlByb3ZpZGVyLHt2YWx1ZTp0aGlzLnN0YXRlLmVycm9yLGNoaWxkcmVuOnRoaXMucHJvcHMuY29tcG9uZW50fSkpOnRoaXMucHJvcHMuY2hpbGRyZW59fWZ1bmN0aW9uIFRNKGUpe2xldHtyb3V0ZUNvbnRleHQ6dCxtYXRjaDpuLGNoaWxkcmVuOnJ9PWUsbz1wLnVzZUNvbnRleHQoUGQpO3JldHVybiBvJiZvLnN0YXRpYyYmby5zdGF0aWNDb250ZXh0JiYobi5yb3V0ZS5lcnJvckVsZW1lbnR8fG4ucm91dGUuRXJyb3JCb3VuZGFyeSkmJihvLnN0YXRpY0NvbnRleHQuX2RlZXBlc3RSZW5kZXJlZEJvdW5kYXJ5SWQ9bi5yb3V0ZS5pZCkscC5jcmVhdGVFbGVtZW50KEFpLlByb3ZpZGVyLHt2YWx1ZTp0fSxyKX1mdW5jdGlvbiBiTShlLHQsbil7dmFyIHI7aWYodD09PXZvaWQgMCYmKHQ9W10pLG49PT12b2lkIDAmJihuPW51bGwpLGU9PW51bGwpe3ZhciBvO2lmKChvPW4pIT1udWxsJiZvLmVycm9ycyllPW4ubWF0Y2hlcztlbHNlIHJldHVybiBudWxsfWxldCBpPWUsbD0ocj1uKT09bnVsbD92b2lkIDA6ci5lcnJvcnM7aWYobCE9bnVsbCl7bGV0IHM9aS5maW5kSW5kZXgoYT0+YS5yb3V0ZS5pZCYmKGw9PW51bGw/dm9pZCAwOmxbYS5yb3V0ZS5pZF0pKTtzPj0wfHxTZSghMSksaT1pLnNsaWNlKDAsTWF0aC5taW4oaS5sZW5ndGgscysxKSl9cmV0dXJuIGkucmVkdWNlUmlnaHQoKHMsYSx1KT0+e2xldCBjPWEucm91dGUuaWQ/bD09bnVsbD92b2lkIDA6bFthLnJvdXRlLmlkXTpudWxsLGQ9bnVsbDtuJiYoZD1hLnJvdXRlLmVycm9yRWxlbWVudHx8JE0pO2xldCBmPXQuY29uY2F0KGkuc2xpY2UoMCx1KzEpKSxoPSgpPT57bGV0IG07cmV0dXJuIGM/bT1kOmEucm91dGUuQ29tcG9uZW50P209cC5jcmVhdGVFbGVtZW50KGEucm91dGUuQ29tcG9uZW50LG51bGwpOmEucm91dGUuZWxlbWVudD9tPWEucm91dGUuZWxlbWVudDptPXMscC5jcmVhdGVFbGVtZW50KFRNLHttYXRjaDphLHJvdXRlQ29udGV4dDp7b3V0bGV0OnMsbWF0Y2hlczpmLGlzRGF0YVJvdXRlOm4hPW51bGx9LGNoaWxkcmVuOm19KX07cmV0dXJuIG4mJihhLnJvdXRlLkVycm9yQm91bmRhcnl8fGEucm91dGUuZXJyb3JFbGVtZW50fHx1PT09MCk/cC5jcmVhdGVFbGVtZW50KGtNLHtsb2NhdGlvbjpuLmxvY2F0aW9uLHJldmFsaWRhdGlvbjpuLnJldmFsaWRhdGlvbixjb21wb25lbnQ6ZCxlcnJvcjpjLGNoaWxkcmVuOmgoKSxyb3V0ZUNvbnRleHQ6e291dGxldDpudWxsLG1hdGNoZXM6Zixpc0RhdGFSb3V0ZTohMH19KTpoKCl9LG51bGwpfXZhciBkQz1mdW5jdGlvbihlKXtyZXR1cm4gZS5Vc2VCbG9ja2VyPSJ1c2VCbG9ja2VyIixlLlVzZVJldmFsaWRhdG9yPSJ1c2VSZXZhbGlkYXRvciIsZS5Vc2VOYXZpZ2F0ZVN0YWJsZT0idXNlTmF2aWdhdGUiLGV9KGRDfHx7fSksVWM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuVXNlQmxvY2tlcj0idXNlQmxvY2tlciIsZS5Vc2VMb2FkZXJEYXRhPSJ1c2VMb2FkZXJEYXRhIixlLlVzZUFjdGlvbkRhdGE9InVzZUFjdGlvbkRhdGEiLGUuVXNlUm91dGVFcnJvcj0idXNlUm91dGVFcnJvciIsZS5Vc2VOYXZpZ2F0aW9uPSJ1c2VOYXZpZ2F0aW9uIixlLlVzZVJvdXRlTG9hZGVyRGF0YT0idXNlUm91dGVMb2FkZXJEYXRhIixlLlVzZU1hdGNoZXM9InVzZU1hdGNoZXMiLGUuVXNlUmV2YWxpZGF0b3I9InVzZVJldmFsaWRhdG9yIixlLlVzZU5hdmlnYXRlU3RhYmxlPSJ1c2VOYXZpZ2F0ZSIsZS5Vc2VSb3V0ZUlkPSJ1c2VSb3V0ZUlkIixlfShVY3x8e30pO2Z1bmN0aW9uIE5NKGUpe2xldCB0PXAudXNlQ29udGV4dChQZCk7cmV0dXJuIHR8fFNlKCExKSx0fWZ1bmN0aW9uIFJNKGUpe2xldCB0PXAudXNlQ29udGV4dChzQyk7cmV0dXJuIHR8fFNlKCExKSx0fWZ1bmN0aW9uIFBNKGUpe2xldCB0PXAudXNlQ29udGV4dChBaSk7cmV0dXJuIHR8fFNlKCExKSx0fWZ1bmN0aW9uIGZDKGUpe2xldCB0PVBNKCksbj10Lm1hdGNoZXNbdC5tYXRjaGVzLmxlbmd0aC0xXTtyZXR1cm4gbi5yb3V0ZS5pZHx8U2UoITEpLG4ucm91dGUuaWR9ZnVuY3Rpb24gT00oKXt2YXIgZTtsZXQgdD1wLnVzZUNvbnRleHQoYUMpLG49Uk0oVWMuVXNlUm91dGVFcnJvcikscj1mQyhVYy5Vc2VSb3V0ZUVycm9yKTtyZXR1cm4gdHx8KChlPW4uZXJyb3JzKT09bnVsbD92b2lkIDA6ZVtyXSl9ZnVuY3Rpb24gQU0oKXtsZXR7cm91dGVyOmV9PU5NKGRDLlVzZU5hdmlnYXRlU3RhYmxlKSx0PWZDKFVjLlVzZU5hdmlnYXRlU3RhYmxlKSxuPXAudXNlUmVmKCExKTtyZXR1cm4gY0MoKCk9PntuLmN1cnJlbnQ9ITB9KSxwLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKG8saSl7aT09PXZvaWQgMCYmKGk9e30pLG4uY3VycmVudCYmKHR5cGVvZiBvPT0ibnVtYmVyIj9lLm5hdmlnYXRlKG8pOmUubmF2aWdhdGUobyxXYyh7ZnJvbVJvdXRlSWQ6dH0saSkpKX0sW2UsdF0pfWZ1bmN0aW9uIE1NKGUpe2xldHtiYXNlbmFtZTp0PSIvIixjaGlsZHJlbjpuPW51bGwsbG9jYXRpb246cixuYXZpZ2F0aW9uVHlwZTpvPXN0LlBvcCxuYXZpZ2F0b3I6aSxzdGF0aWM6bD0hMX09ZTtNZCgpJiZTZSghMSk7bGV0IHM9dC5yZXBsYWNlKC9eXC8qLywiLyIpLGE9cC51c2VNZW1vKCgpPT4oe2Jhc2VuYW1lOnMsbmF2aWdhdG9yOmksc3RhdGljOmx9KSxbcyxpLGxdKTt0eXBlb2Ygcj09InN0cmluZyImJihyPXFyKHIpKTtsZXR7cGF0aG5hbWU6dT0iLyIsc2VhcmNoOmM9IiIsaGFzaDpkPSIiLHN0YXRlOmY9bnVsbCxrZXk6aD0iZGVmYXVsdCJ9PXIsbT1wLnVzZU1lbW8oKCk9PntsZXQgZz1WYSh1LHMpO3JldHVybiBnPT1udWxsP251bGw6e2xvY2F0aW9uOntwYXRobmFtZTpnLHNlYXJjaDpjLGhhc2g6ZCxzdGF0ZTpmLGtleTpofSxuYXZpZ2F0aW9uVHlwZTpvfX0sW3MsdSxjLGQsZixoLG9dKTtyZXR1cm4gbT09bnVsbD9udWxsOnAuY3JlYXRlRWxlbWVudChPZC5Qcm92aWRlcix7dmFsdWU6YX0scC5jcmVhdGVFbGVtZW50KEFkLlByb3ZpZGVyLHtjaGlsZHJlbjpuLHZhbHVlOm19KSl9bmV3IFByb21pc2UoKCk9Pnt9KTtmdW5jdGlvbiBMTShlKXtsZXQgdD17aGFzRXJyb3JCb3VuZGFyeTplLkVycm9yQm91bmRhcnkhPW51bGx8fGUuZXJyb3JFbGVtZW50IT1udWxsfTtyZXR1cm4gZS5Db21wb25lbnQmJk9iamVjdC5hc3NpZ24odCx7ZWxlbWVudDpwLmNyZWF0ZUVsZW1lbnQoZS5Db21wb25lbnQpLENvbXBvbmVudDp2b2lkIDB9KSxlLkVycm9yQm91bmRhcnkmJk9iamVjdC5hc3NpZ24odCx7ZXJyb3JFbGVtZW50OnAuY3JlYXRlRWxlbWVudChlLkVycm9yQm91bmRhcnkpLEVycm9yQm91bmRhcnk6dm9pZCAwfSksdH1jb25zdCBoQz1lZS5jcmVhdGVDb250ZXh0KG51bGwpLERNPWU9Pnt2YXIgcyxhO2NvbnN0IHQ9ZWUudXNlQ29udGV4dChoQyksW24scl09RW4uc3BsaXRNb2R1bGVJZEFuZE1vZHVsZVBhdGgoZSksbz0ocz10PT1udWxsP3ZvaWQgMDp0W25dKT09bnVsbD92b2lkIDA6cy5zb3VyY2UsaT0oYT10PT1udWxsP3ZvaWQgMDp0W25dKT09bnVsbD92b2lkIDA6YS5zY2hlbWE7aWYoIW98fCFpKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBtb2R1bGU6ICIrbik7Y29uc3QgbD1Fbi5yZXNvbHZlUGF0aChyLG8saSk7cmV0dXJue21vZHVsZUlkOm4sbW9kdWxlU291cmNlOmwuc291cmNlLG1vZHVsZVNjaGVtYTpsLnNjaGVtYX19LElNPSh7dmFsQXBpOmV9KT0+e3ZhciB3LGs7Y29uc3R7IioiOnR9PVNNKCksW24scl09cC51c2VTdGF0ZShudWxsKSxbbyxpXT1wLnVzZVN0YXRlKG51bGwpLFtsLHNdPXAudXNlU3RhdGUoKSxbYV09bD9Fbi5zcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aChsKTpbdm9pZCAwLHZvaWQgMF0sdT1hJiYoKHc9bj09bnVsbD92b2lkIDA6blthXSk9PW51bGw/dm9pZCAwOncuc291cmNlKSxjPWEmJigoaz1uPT1udWxsP3ZvaWQgMDpuW2FdKT09bnVsbD92b2lkIDA6ay5zY2hlbWEpLGQ9T2JqZWN0LmVudHJpZXMobnx8e30pLmZsYXRNYXAoKFssYl0pPT5iLmVycm9ycz9iLmVycm9ycy5mYXRhbD9iLmVycm9ycy5mYXRhbDpbXTpbXSksZj1PYmplY3QuZW50cmllcyhufHx7fSkuZmxhdE1hcCgoWyxiXSk9PmIuZXJyb3JzJiZiLmVycm9ycy52YWxpZGF0aW9uP1tiLmVycm9ycy52YWxpZGF0aW9uXTpbXSk7aWYoZCYmZC5sZW5ndGg+MCl7Y29uc3QgYj1kLmxlbmd0aD09PTE/ZFswXS5tZXNzYWdlOmBNdWx0aXBsZSBlcnJvcnMgZGV0ZWN0ZWQ6CiR7ZC5tYXAoKE4sRCk9PmAke0QrMX0uICR7Ti5tZXNzYWdlfWApLmpvaW4oYApgKX0KClNob3dpbmcgc3RhY2sgdHJhY2Ugb2Y6IDAuICR7ZFswXS5tZXNzYWdlfWAsVD1uZXcgRXJyb3IoYik7dGhyb3cgVC5zdGFjaz1kWzBdLnN0YWNrLFR9ZiYmZi5sZW5ndGg+MCYmY29uc29sZS53YXJuKCJWYWwgZW5jb3VudGVyZWQgdmFsaWRhdGlvbiBlcnJvcnM6IixmKSxwLnVzZUVmZmVjdCgoKT0+e3ModD9gLyR7dH1gOmwpfSxbdF0pO2NvbnN0W2gsbV09cC51c2VTdGF0ZShudWxsKTtwLnVzZUVmZmVjdCgoKT0+e3RyeXtuZXcgV2ViU29ja2V0KGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW4ucmVwbGFjZSgiaHR0cDovLyIsIndzOi8vIil9L19uZXh0L3dlYnBhY2staG1yYCkuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsVD0+e2xldCBOO3RyeXtOPUpTT04ucGFyc2UoVC5kYXRhKX1jYXRjaHtjb25zb2xlLmVycm9yKCJGYWlsZWQgdG8gcGFyc2UgSE1SIil9dHlwZW9mKE49PW51bGw/dm9pZCAwOk4uaGFzaCk9PSJzdHJpbmciJiYoTj09bnVsbD92b2lkIDA6Ti5hY3Rpb24pPT09ImJ1aWx0IiYmbShOLmhhc2gpfSl9Y2F0Y2goYil7Y29uc29sZS53YXJuKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBITVIiLGIpfX0sW10pLHAudXNlRWZmZWN0KCgpPT57Y29uc29sZS5sb2coIihSZSktZmV0Y2hpbmcgbW9kdWxlcyIpLGUuZ2V0TW9kdWxlcyh7cGF0Y2g6ITAsaW5jbHVkZVNjaGVtYTohMCxpbmNsdWRlU291cmNlOiEwfSkudGhlbihiPT57aGwuaXNPayhiKT9yKGIudmFsdWUubW9kdWxlcyk6KGkoIkNvdWxkIG5vdCBsb2FkIG1vZHVsZXM6ICIrYi5lcnJvci5tZXNzYWdlKSxjb25zb2xlLmVycm9yKGIuZXJyb3IpKX0pfSxbaF0pO2NvbnN0IGc9em0oKSxbUyx2XT1DTygpO3AudXNlRWZmZWN0KCgpPT57Y29uc3QgYj1UPT57Y29uc29sZS5sb2coInBvcHN0YXRlIixUKX07cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb3BzdGF0ZSIsYiksKCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLGIpfX0sW10pO2NvbnN0IHk9ZWUudXNlUmVmKG51bGwpLHg9cC51c2VDYWxsYmFjayhiPT5hc3luYyBUPT57Y29uc3RbTixEXT1Fbi5zcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aChiKSxPPWF3YWl0IFQoRW4uY3JlYXRlUGF0Y2hKU09OUGF0aChEKSk7cmV0dXJuIGUucG9zdFBhdGNoZXMoTixPKS50aGVuKGo9PntpZihobC5pc0VycihqKSl0aHJvdyBqLmVycm9yO2lmKGNvbnNvbGUubG9nKCJzdWJtaXR0ZWQiLE8pLCFoKXJldHVybiBlLmdldE1vZHVsZXMoe3BhdGNoOiEwLGluY2x1ZGVTY2hlbWE6ITAsaW5jbHVkZVNvdXJjZTohMH0pLnRoZW4oQj0+e2hsLmlzT2soQik/cihCLnZhbHVlLm1vZHVsZXMpOihpKCJDb3VsZCBub3QgbG9hZCBtb2R1bGVzOiAiK0IuZXJyb3IubWVzc2FnZSksY29uc29sZS5lcnJvcihCLmVycm9yKSl9KX0pLmNhdGNoKGo9Pntjb25zb2xlLmVycm9yKGopfSl9LFtdKTtyZXR1cm4gXy5qc3goWFMuUHJvdmlkZXIse3ZhbHVlOnt0aGVtZTpTLHNldFRoZW1lOnYsYXBpOmUsZWRpdE1vZGU6ImZ1bGwiLHNlc3Npb246e3N0YXR1czoibm90LWFza2VkIn0saGlnaGxpZ2h0OiExLHNldEhpZ2hsaWdodDooKT0+e30sc2V0RWRpdE1vZGU6KCk9Pnt9LHNldFdpbmRvd1NpemU6KCk9Pnt9fSxjaGlsZHJlbjpfLmpzeHMoImRpdiIse2lkOiJ2YWwtZnVsbHNjcmVlbi1jb250YWluZXIiLGNsYXNzTmFtZToicmVsYXRpdmUgZm9udC1zZXJpZiBhbnRpYWxpYXNlZCIsImRhdGEtbW9kZSI6UyxjaGlsZHJlbjpbXy5qc3goImRpdiIse2NsYXNzTmFtZToiZml4ZWQgLXRyYW5zbGF0ZS14LTEvMiB6LW92ZXJsYXkgbGVmdC0xLzIgYm90dG9tLTQiLGNoaWxkcmVuOl8uanN4KHhPLHthcGk6ZX0pfSksXy5qc3goImRpdiIse2lkOiJ2YWwtZnVsbHNjcmVlbi1ob3ZlciIscmVmOnl9KSxfLmpzeChwQy5Qcm92aWRlcix7dmFsdWU6e2hvdmVyRWxlbTp5PT1udWxsP3ZvaWQgMDp5LmN1cnJlbnR9LGNoaWxkcmVuOl8uanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtcHJpbWFyeSBiZy1iYWNrZ3JvdW5kIixjaGlsZHJlbjpfLmpzeHMoRHMse2NoaWxkcmVuOltfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJweC00IGgtWzUwcHhdIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIixjaGlsZHJlbjpfLmpzeChHRSx7fSl9KSxfLmpzeChMcyx7Y2xhc3NOYW1lOiJweC00IixjaGlsZHJlbjpuP18uanN4KEtNLHtwYXRoczpPYmplY3Qua2V5cyhuKSxzZXRTZWxlY3RlZE1vZHVsZUlkOmI9PntnKGIpfX0pOiFvJiZfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJweS00IixjaGlsZHJlbjoiTG9hZGluZy4uLiJ9KX0pLF8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IHctZnVsbCBoLVs1MHB4XSBnYXAtMiBmb250LXNlcmlmIHRleHQteHMiLGNoaWxkcmVuOltfLmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e2hpc3RvcnkuYmFjaygpfSxjaGlsZHJlbjpfLmpzeChhTyx7fSl9KSxfLmpzeCgicCIse2NoaWxkcmVuOmx8fCIvIn0pXX0pLF8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJwLTQiLGNoaWxkcmVuOltvJiZfLmpzeHMoImRpdiIse2NsYXNzTmFtZToidGV4dC1sZyB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQiLGNoaWxkcmVuOlsiRVJST1I6ICIsb119KSxuJiZsJiZhJiZ1IT09dm9pZCAwJiZjIT09dm9pZCAwJiZfLmpzeChoQy5Qcm92aWRlcix7dmFsdWU6bixjaGlsZHJlbjpfLmpzeCh6TSx7cGF0aDpsLHNvdXJjZTp1LHNjaGVtYTpjLHNldFNlbGVjdGVkUGF0aDpzLGluaXRPblN1Ym1pdDp4fSl9KV19KV19KX0pfSldfSl9KX0scEM9ZWUuY3JlYXRlQ29udGV4dCh7aG92ZXJFbGVtOm51bGx9KSxqTT0oKT0+ZWUudXNlQ29udGV4dChwQyk7ZnVuY3Rpb24gek0oe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cixpbml0T25TdWJtaXQ6b30pe2NvbnN0WyxpXT1Fbi5zcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aChlKSxsPUVuLnJlc29sdmVQYXRoKGksdCxuKTtpZighbCl0aHJvdyBFcnJvcigiQ291bGQgbm90IHJlc29sdmUgbW9kdWxlOiAiK2UpO3JldHVybiBfLmpzeChnQyx7cGF0aDplLHNvdXJjZTpsLnNvdXJjZSxzY2hlbWE6bC5zY2hlbWEsc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0Om8sdG9wOiEwfSl9ZnVuY3Rpb24gZ0Moe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cixmaWVsZDpvLGluaXRPblN1Ym1pdDppLHRvcDpsfSl7cmV0dXJuIHQ9PT1udWxsfHxuLm9wdD9fLmpzeChVTSx7cGF0aDplLHNvdXJjZTp0LHNjaGVtYTpuLGZpZWxkOm8saW5pdE9uU3VibWl0Omksc2V0U2VsZWN0ZWRQYXRoOnJ9KTpuLnR5cGU9PT0ib2JqZWN0Ij90eXBlb2YgdCE9Im9iamVjdCJ8fFlzKHQpP18uanN4cygiZGl2Iix7Y2hpbGRyZW46WyJFUlJPUjogZXhwZWN0ZWQgb2JqZWN0LCBidXQgZm91bmQgIix0eXBlb2YgdF19KTpfLmpzeChtQyx7c291cmNlOnQscGF0aDplLHNjaGVtYTpuLGluaXRPblN1Ym1pdDppLHNldFNlbGVjdGVkUGF0aDpyLHRvcDpsfSk6bi50eXBlPT09ImFycmF5Ij90eXBlb2YgdCE9Im9iamVjdCJ8fCFZcyh0KT9fLmpzeHMoImRpdiIse2NoaWxkcmVuOlsiRVJST1I6IGV4cGVjdGVkIGFycmF5LCBidXQgZm91bmQgIix0eXBlb2YgdF19KTpfLmpzeCh2Qyx7c291cmNlOnQscGF0aDplLHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyfSk6bi50eXBlPT09InJlY29yZCI/dHlwZW9mIHQhPSJvYmplY3QiP18uanN4cygiZGl2Iix7Y2hpbGRyZW46WyJFUlJPUjogZXhwZWN0ZWQgb2JqZWN0IGZvciAiLG4udHlwZSwiLCBidXQgZm91bmQgIix0eXBlb2YgdF19KTpZcyh0KT9fLmpzeHMoImRpdiIse2NoaWxkcmVuOlsiRVJST1I6IGRpZCBub3QgZXhwZWN0IGFycmF5IGZvciAiLG4udHlwZV19KTpfLmpzeChGTSx7c291cmNlOnQscGF0aDplLHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyfSk6Xy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InB5LTIgZ2FwLXktNCIsY2hpbGRyZW46W18uanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtbGVmdCIsY2hpbGRyZW46b3x8ZX0pLF8uanN4KEtFLHtwYXRoOmUsZGlzYWJsZWQ6ITEsc291cmNlOnQsc2NoZW1hOm4sb25TdWJtaXQ6aShlKX0pXX0pfWZ1bmN0aW9uIG1DKHtwYXRoOmUsc291cmNlOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0Om8sdG9wOml9KXtyZXR1cm4gXy5qc3goImRpdiIse2NsYXNzTmFtZTphZCgiZmxleCBmbGV4LWNvbCBnYXAteS04Iix7ImJvcmRlci1sLTIgYm9yZGVyLWJvcmRlciBwbC02IjohaX0pLGNoaWxkcmVuOk9iamVjdC5lbnRyaWVzKG4uaXRlbXMpLm1hcCgoW2wsc10pPT57Y29uc3QgYT1rYShlLGwpO3JldHVybiBfLmpzeChnQyx7cGF0aDphLHNvdXJjZTp0W2xdLHNjaGVtYTpzLHNldFNlbGVjdGVkUGF0aDpyLGZpZWxkOmwsaW5pdE9uU3VibWl0Om99LGEpfSl9LGUpfWZ1bmN0aW9uIEZNKHtwYXRoOmUsc291cmNlOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnJ9KXtjb25zdCBvPXptKCk7cmV0dXJuIF8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wgZ2FwLTQgcC0yIixjaGlsZHJlbjpPYmplY3QuZW50cmllcyh0KS5tYXAoKFtpLGxdKT0+e2NvbnN0IHM9a2EoZSxpKTtyZXR1cm4gXy5qc3goImJ1dHRvbiIse29uQ2xpY2s6KCk9PntyKHMpLG8ocyl9LGNoaWxkcmVuOl8uanN4KEJNLHtyZWNvcmRLZXk6aSxwYXRoOnMsc291cmNlOmwsc2NoZW1hOm4uaXRlbX0pfSxzKX0pfSxlKX1jb25zdCBEcD0xNzA7ZnVuY3Rpb24gQk0oe3JlY29yZEtleTplLHBhdGg6dCxzb3VyY2U6bixzY2hlbWE6cn0pe2NvbnN0IG89ZWUudXNlUmVmKG51bGwpLFtpLGxdPXAudXNlU3RhdGUoITEpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e28uY3VycmVudCYmby5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodD49RHAmJmwoITApfSxbXSksXy5qc3hzKExtLHtyZWY6byxjbGFzc05hbWU6InJlbGF0aXZlIHB4LTQgcHQtMiBwYi00IG92ZXJmbG93LWhpZGRlbiBib3JkZXIgZ2FwLXktMiIsc3R5bGU6e21heEhlaWdodDpEcH0sY2hpbGRyZW46W18uanN4KCJkaXYiLHtjbGFzc05hbWU6InBiLTQgZm9udC1zZXJpZiB0ZXh0LWxlZnQgdGV4dC1hY2NlbnQiLGNoaWxkcmVuOmV9KSxfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LXhzIixjaGlsZHJlbjpfLmpzeChGbSx7cGF0aDp0LHNvdXJjZTpuLHNjaGVtYTpyfSl9KSxpJiZfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGgtWzIwcHhdIGJnLWdyYWRpZW50LXRvLWIgZnJvbS10cmFuc3BhcmVudCB0by1iYWNrZ3JvdW5kIn0pXX0sdCl9ZnVuY3Rpb24gdkMoe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pe2NvbnN0IG89em0oKTtyZXR1cm4gXy5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCBnYXAtNCBwLTIiLGNoaWxkcmVuOnQubWFwKChpLGwpPT57Y29uc3Qgcz1rYShlLGwpO3JldHVybiBfLmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e3IocyksbyhzKX0sY2hpbGRyZW46Xy5qc3goV00se2luZGV4OmwscGF0aDpzLHNvdXJjZTppLHNjaGVtYTpuLml0ZW19LHMpfSxzKX0pfSxlKX1jb25zdCBaMD1EcDtmdW5jdGlvbiBXTSh7aW5kZXg6ZSxwYXRoOnQsc291cmNlOm4sc2NoZW1hOnJ9KXtjb25zdCBvPWVlLnVzZVJlZihudWxsKSxbaSxsXT1wLnVzZVN0YXRlKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntvLmN1cnJlbnQmJm8uY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ+PVowJiZsKCEwKX0sW10pLF8uanN4cyhMbSx7cmVmOm8sY2xhc3NOYW1lOiJyZWxhdGl2ZSBweC00IHB0LTIgcGItNCBvdmVyZmxvdy1oaWRkZW4gYm9yZGVyIGdhcC15LTIiLHN0eWxlOnttYXhIZWlnaHQ6WjB9LGNoaWxkcmVuOltfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwYi00IGZvbnQtc2VyaWYgdGV4dC1sZWZ0IHVwcGVyY2FzZSB0ZXh0LWFjY2VudCIsY2hpbGRyZW46ZSsxPDEwP2AwJHtlKzF9YDplKzF9KSxfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LXhzIixjaGlsZHJlbjpfLmpzeChGbSx7cGF0aDp0LHNvdXJjZTpuLHNjaGVtYTpyfSl9KSxpJiZfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGgtWzIwcHhdIGJnLWdyYWRpZW50LXRvLWIgZnJvbS10cmFuc3BhcmVudCB0by1iYWNrZ3JvdW5kIn0pXX0pfWZ1bmN0aW9uIGthKGUsdCl7Y29uc3Qgbj1Fbi5jcmVhdGVWYWxQYXRoT2ZJdGVtKGUsdCk7aWYoIW4pdGhyb3cgRXJyb3IoYENvdWxkIG5vdCBjcmVhdGUgdmFsIHBhdGg6ICR7ZX0gb2YgJHt0PT1udWxsP3ZvaWQgMDp0LnRvU3RyaW5nKCl9YCk7cmV0dXJuIG59ZnVuY3Rpb24gRm0oe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bn0pe2NvbnN0W3Isb109cC51c2VTdGF0ZShudWxsKSx7aG92ZXJFbGVtOml9PWpNKCk7aWYobi50eXBlPT09Im9iamVjdCIpcmV0dXJuIF8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImdyaWQgZ3JpZC1jb2xzLVttaW4tY29udGVudF8xZnJdIGdhcC0yIHRleHQtbGVmdCIsY2hpbGRyZW46T2JqZWN0LmVudHJpZXMobi5pdGVtcykubWFwKChbbF0pPT5fLmpzeHMocC5GcmFnbWVudCx7Y2hpbGRyZW46W18uanN4cygic3BhbiIse2NsYXNzTmFtZToidGV4dC1tdXRlZCIsY2hpbGRyZW46W2wsIjoiXX0pLF8uanN4KCJzcGFuIix7Y2hpbGRyZW46Xy5qc3goRm0se3NvdXJjZToodD09bnVsbD92b2lkIDA6dFtsXSk/P251bGwsc2NoZW1hOm4uaXRlbXNbbF0scGF0aDprYShlLGwpfSl9KV19LGthKGUsbCkpKX0sZSk7aWYobi50eXBlPT09ImFycmF5IilyZXR1cm4gdD09PW51bGw/Xy5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSxlKTpBcnJheS5pc0FycmF5KHQpP18uanN4cygic3BhbiIse2NoaWxkcmVuOltfLmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOnQubGVuZ3RofSksXy5qc3goInNwYW4iLHtjaGlsZHJlbjp0Lmxlbmd0aD09PTE/IiBpdGVtIjoiIGl0ZW1zIn0pXX0sZSk6Xy5qc3goInNwYW4iLHtjbGFzc05hbWU6InB4LTIgYmctZGVzdHJ1Y3RpdmUgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIixjaGlsZHJlbjoiVW5rbm93biBsZW5ndGgifSxlKTtpZihuLnR5cGU9PT0icmljaHRleHQiKXJldHVybiB0PT09bnVsbD9fLmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LGUpOnR5cGVvZiB0IT0ib2JqZWN0Ij9fLmpzeHMoImRpdiIse2NsYXNzTmFtZToicC00IHRleHQtZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZCBiZy1kZXN0cnVjdGl2ZSIsY2hpbGRyZW46WyJFUlJPUjogIix0eXBlb2YgdCwiIG5vdCBhbiBvYmplY3QiXX0sZSk6IShZdCBpbiB0KXx8dFtZdF0hPT0icmljaHRleHQiP18uanN4KCJkaXYiLHtjbGFzc05hbWU6InAtNCB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQgYmctZGVzdHJ1Y3RpdmUiLGNoaWxkcmVuOiJFUlJPUjogb2JqZWN0IGlzIG5vdCByaWNodGV4dCJ9LGUpOl8uanN4KEdNLHtjaGlsZHJlbjpuXyh0KX0sZSk7aWYobi50eXBlPT09InN0cmluZyIpcmV0dXJuIHQ9PT1udWxsP18uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46IkVtcHR5In0sZSk6Xy5qc3goInNwYW4iLHtjaGlsZHJlbjp0fSk7aWYobi50eXBlPT09ImltYWdlIil7aWYodD09PW51bGwpcmV0dXJuIF8uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46IkVtcHR5In0sZSk7aWYodHlwZW9mIHQhPSJvYmplY3QiKXJldHVybiBfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGJnLWRlc3RydWN0aXZlIixjaGlsZHJlbjoiRVJST1I6IG5vdCBhbiBvYmplY3QifSxlKTtpZighKGduIGluIHQpfHx0eXBlb2YgdFtnbl0hPSJzdHJpbmciKXJldHVybiBfLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGJnLWRlc3RydWN0aXZlIixjaGlsZHJlbjoiRVJST1I6IG9iamVjdCBpcyBub3QgYW4gaW1hZ2UifSxlKTtjb25zdCBsPUVuLmNvbnZlcnRGaWxlU291cmNlKHQpLnVybDtyZXR1cm4gXy5qc3hzKCJzcGFuIix7b25Nb3VzZU92ZXI6cz0+e28oe3g6cy5jbGllbnRYLHk6cy5jbGllbnRZfSl9LG9uTW91c2VMZWF2ZTooKT0+e28obnVsbCl9LGNsYXNzTmFtZToicmVsYXRpdmUgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1zdGFydCBnYXAtMSIsY2hpbGRyZW46W18uanN4KCJhIix7aHJlZjpsLGNsYXNzTmFtZToib3ZlcmZsb3ctaGlkZGVuIHVuZGVybGluZSB0cnVuY2F0ZSAiLGNoaWxkcmVuOnRbZ25dfSksciYmaSYmR3IuY3JlYXRlUG9ydGFsKF8uanN4KCJpbWciLHtjbGFzc05hbWU6ImFic29sdXRlIHotWzVdIG1heC13LVsxMHZ3XSIsc3R5bGU6e2xlZnQ6ci54KzEwLHRvcDpyLnkrMTB9LHNyYzpsfSksaSldfSxlKX1lbHNle2lmKG4udHlwZT09PSJib29sZWFuIilyZXR1cm4gdD09PW51bGw/Xy5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSxlKTpfLmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOnQ/InRydWUiOiJmYWxzZSJ9LGUpO2lmKG4udHlwZT09PSJudW1iZXIiKXJldHVybiB0PT09bnVsbD9fLmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LGUpOl8uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46dC50b1N0cmluZygpfSk7aWYobi50eXBlPT09ImtleU9mIilyZXR1cm4gdD09PW51bGw/Xy5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSxlKTpfLmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOnQudG9TdHJpbmcoKX0sZSl9cmV0dXJuIF8uanN4cygiZGl2Iix7Y2hpbGRyZW46WyJUT0RPOiAiLG4udHlwZV19LGUpfWZ1bmN0aW9uIFVNKHtwYXRoOmUsc291cmNlOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0Om8sZmllbGQ6aX0pe2NvbnN0W2wsc109cC51c2VTdGF0ZSh0IT09bnVsbCk7cmV0dXJuIF8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIGdhcC15LTYiLGNoaWxkcmVuOltpP18uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IGdhcC14LTQiLGNoaWxkcmVuOltfLmpzeChQcCx7Y2hlY2tlZDpsLG9uQ2xpY2s6KCk9PntzKGE9PiFhKX19KSxfLmpzeCgic3BhbiIse2NoaWxkcmVuOml9KV19KTpfLmpzeChQcCx7Y2hlY2tlZDpsLG9uQ2xpY2s6KCk9PntzKGE9PiFhKX19KSxsJiZfLmpzeChWTSx7c291cmNlOnQsc2NoZW1hOm4scGF0aDplLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDpvfSldfSxlKX1mdW5jdGlvbiBWTSh7c291cmNlOmUscGF0aDp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDpvfSl7aWYobi50eXBlPT09ImFycmF5Iil7aWYodHlwZW9mIGU9PSJvYmplY3QiJiYoZT09PW51bGx8fFlzKGUpKSlyZXR1cm4gXy5qc3godkMse3NvdXJjZTplPT09bnVsbD9bXTplLHBhdGg6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pfWVsc2UgaWYobi50eXBlPT09Im9iamVjdCIpe2lmKHR5cGVvZiBlPT0ib2JqZWN0IiYmKGU9PT1udWxsfHwhWXMoZSkpKXJldHVybiBfLmpzeChtQyx7c291cmNlOmUscGF0aDp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDpvfSl9ZWxzZSBpZihuLnR5cGU9PT0icmljaHRleHQifHxuLnR5cGU9PT0ic3RyaW5nInx8bi50eXBlPT09ImltYWdlInx8bi50eXBlPT09Im51bWJlciJ8fG4udHlwZT09PSJrZXlPZiIpcmV0dXJuIF8uanN4KEtFLHtwYXRoOnQsZGlzYWJsZWQ6ITEsc291cmNlOmUsc2NoZW1hOm4sb25TdWJtaXQ6byh0KX0sdCk7cmV0dXJuIF8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgYmctZGVzdHJ1Y3RpdmUgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIixjaGlsZHJlbjpbIkVSUk9SOiB1bmV4cGVjdGVkIHNvdXJjZSB0eXBlICIsdHlwZW9mIGUsIiBmb3Igc2NoZW1hIHR5cGUiLCIgIixuLnR5cGVdfSl9ZnVuY3Rpb24gWXMoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl9ZnVuY3Rpb24gSE0oZSl7Y29uc3QgdD17fTtyZXR1cm4gZS5mb3JFYWNoKG49Pntjb25zdCByPW4uc3BsaXQoIi8iKS5maWx0ZXIoaT0+aSE9PSIiKTtsZXQgbz10O3IuZm9yRWFjaChpPT57b1tpXXx8KG9baV09e30pLG89b1tpXX0pfSksdH1mdW5jdGlvbiBLTSh7cGF0aHM6ZSxzZXRTZWxlY3RlZE1vZHVsZUlkOnR9KXtjb25zdCBuPUhNKGUpO3JldHVybiBfLmpzeChLdyx7Y2hpbGRyZW46T2JqZWN0LmVudHJpZXMobikubWFwKChbcixvXSk9Pl8uanN4KCJkaXYiLHtjbGFzc05hbWU6InB4LTQgcHktMiIsY2hpbGRyZW46Xy5qc3goeUMse25hbWU6cix0cmVlOm8sbW9kdWxlSWQ6YC8ke3J9YCxzZXRTZWxlY3RlZE1vZHVsZUlkOnR9KX0sYC8ke3J9YCkpfSl9ZnVuY3Rpb24geUMoe25hbWU6ZSx0cmVlOnQsbW9kdWxlSWQ6bixzZXRTZWxlY3RlZE1vZHVsZUlkOnJ9KXtyZXR1cm4gXy5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbXy5qc3goImJ1dHRvbiIse29uQ2xpY2s6KCk9PntyKG4pfSxjaGlsZHJlbjplfSksT2JqZWN0LmVudHJpZXModCkubWFwKChbbyxpXSk9Pl8uanN4KCJkaXYiLHtjbGFzc05hbWU6InB4LTQgcHktMSIsY2hpbGRyZW46Xy5qc3goeUMse25hbWU6byx0cmVlOmksbW9kdWxlSWQ6YCR7bn0vJHtvfWAsc2V0U2VsZWN0ZWRNb2R1bGVJZDpyfSl9LGAke259LyR7b31gKSldfSl9Y29uc3QgcTA9e3RhZ3M6e2gxOiJmb250LWJvbGQiLGgyOiJmb250LWJvbGQiLGgzOiJmb250LWJvbGQiLGg0OiJmb250LWJvbGQiLGg1OiJmb250LWJvbGQiLGg2OiJmb250LWJvbGQiLHA6IiJ9LGNsYXNzZXM6e2JvbGQ6ImZvbnQtYm9sZCIsaXRhbGljOiJpdGFsaWMiLGxpbmVUaHJvdWdoOiJsaW5lLXRocm91Z2gifX07ZnVuY3Rpb24gR00oe2NoaWxkcmVuOmV9KXtjb25zdCB0PWU7ZnVuY3Rpb24gbihpLGwpe2NvbnN0IHM9cTAudGFnc1tpXTtyZXR1cm4gcyYmbD9bbCxzXS5qb2luKCIgIik6c3x8bH1mdW5jdGlvbiByKGksbCl7Y29uc3Qgcz1xMC5jbGFzc2VzW2ldO3JldHVybiBzJiZsP1tsLHNdLmpvaW4oIiAiKTpzfHxsfWZ1bmN0aW9uIG8oaSxsKXt2YXIgdSxjO2lmKHR5cGVvZiBpPT0ic3RyaW5nIilyZXR1cm4gaTtpZihpLnRhZz09PSJwIilyZXR1cm4gXy5qc3goInAiLHtjbGFzc05hbWU6bigicCIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJpbWciKXJldHVybiBfLmpzeCgiaW1nIix7Y2xhc3NOYW1lOm4oImltZyIpLHNyYzppLnNyY30sbCk7aWYoaS50YWc9PT0idWwiKXJldHVybiBfLmpzeCgidWwiLHtjbGFzc05hbWU6bigidWwiKSxjaGlsZHJlbjppLmNoaWxkcmVuLm1hcCgoZCxmKT0+byhkLGYpKX0sbCk7aWYoaS50YWc9PT0ib2wiKXJldHVybiBfLmpzeCgib2wiLHtjbGFzc05hbWU6bigib2wiKSxjaGlsZHJlbjppLmNoaWxkcmVuLm1hcCgoZCxmKT0+byhkLGYpKX0sbCk7aWYoaS50YWc9PT0ibGkiKXJldHVybiBfLmpzeCgibGkiLHtjbGFzc05hbWU6bigibGkiKSxjaGlsZHJlbjppLmNoaWxkcmVuLm1hcCgoZCxmKT0+byhkLGYpKX0sbCk7aWYoaS50YWc9PT0ic3BhbiIpcmV0dXJuIF8uanN4KCJzcGFuIix7Y2xhc3NOYW1lOmkuY2xhc3Nlcy5tYXAoZD0+e3N3aXRjaChkKXtjYXNlImJvbGQiOnJldHVybiByKCJib2xkIik7Y2FzZSJsaW5lLXRocm91Z2giOnJldHVybiByKCJsaW5lVGhyb3VnaCIpO2Nhc2UiaXRhbGljIjpyZXR1cm4gcigiaXRhbGljIil9fSkuam9pbigiICIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJoMSIpcmV0dXJuIF8uanN4KCJoMSIse2NsYXNzTmFtZTpuKCJoMSIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJoMiIpcmV0dXJuIF8uanN4KCJoMiIse2NsYXNzTmFtZTpuKCJoMiIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJoMyIpcmV0dXJuIF8uanN4KCJoMyIse2NsYXNzTmFtZTpuKCJoMyIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJoNCIpcmV0dXJuIF8uanN4KCJoNCIse2NsYXNzTmFtZTpuKCJoNCIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJoNSIpcmV0dXJuIF8uanN4KCJoNSIse2NsYXNzTmFtZTpuKCJoNSIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJoNiIpcmV0dXJuIF8uanN4KCJoNiIse2NsYXNzTmFtZTpuKCJoNiIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJiciIpcmV0dXJuIF8uanN4KCJiciIse30sbCk7aWYoaS50YWc9PT0iYSIpcmV0dXJuIF8uanN4KCJhIix7aHJlZjppLmhyZWYsY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2NvbnNvbGUuZXJyb3IoIlVua25vd24gdGFnIixpLnRhZyk7Y29uc3QgYT1pLnRhZztyZXR1cm4gYSE9bnVsbCYmYS50YWc/ZWUuY3JlYXRlRWxlbWVudChhLnRhZyx7a2V5OmwsY2xhc3NOYW1lOih1PWEuY2xhc3MpPT1udWxsP3ZvaWQgMDp1LmpvaW4oIiAiKSxjaGlsZHJlbjooYz1hLmNoaWxkcmVuKT09bnVsbD92b2lkIDA6Yy5tYXAobyl9KTpudWxsfXJldHVybiBfLmpzeCgic3BhbiIseyJkYXRhLXZhbC1wYXRoIjp0LnZhbFBhdGgsY2hpbGRyZW46dC5jaGlsZHJlbi5tYXAoKGksbCk9Pm8oaSxsKSl9KX1jb25zdCBZTT1wLmNyZWF0ZUNvbnRleHQobnVsbCksSWY9e2RpZENhdGNoOiExLGVycm9yOm51bGx9O2NsYXNzIFhNIGV4dGVuZHMgcC5Db21wb25lbnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5yZXNldEVycm9yQm91bmRhcnk9dGhpcy5yZXNldEVycm9yQm91bmRhcnkuYmluZCh0aGlzKSx0aGlzLnN0YXRlPUlmfXN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IodCl7cmV0dXJue2RpZENhdGNoOiEwLGVycm9yOnR9fXJlc2V0RXJyb3JCb3VuZGFyeSgpe2NvbnN0e2Vycm9yOnR9PXRoaXMuc3RhdGU7aWYodCE9PW51bGwpe2Zvcih2YXIgbixyLG89YXJndW1lbnRzLmxlbmd0aCxpPW5ldyBBcnJheShvKSxsPTA7bDxvO2wrKylpW2xdPWFyZ3VtZW50c1tsXTsobj0ocj10aGlzLnByb3BzKS5vblJlc2V0KT09PW51bGx8fG49PT12b2lkIDB8fG4uY2FsbChyLHthcmdzOmkscmVhc29uOiJpbXBlcmF0aXZlLWFwaSJ9KSx0aGlzLnNldFN0YXRlKElmKX19Y29tcG9uZW50RGlkQ2F0Y2godCxuKXt2YXIgcixvOyhyPShvPXRoaXMucHJvcHMpLm9uRXJyb3IpPT09bnVsbHx8cj09PXZvaWQgMHx8ci5jYWxsKG8sdCxuKX1jb21wb25lbnREaWRVcGRhdGUodCxuKXtjb25zdHtkaWRDYXRjaDpyfT10aGlzLnN0YXRlLHtyZXNldEtleXM6b309dGhpcy5wcm9wcztpZihyJiZuLmVycm9yIT09bnVsbCYmUU0odC5yZXNldEtleXMsbykpe3ZhciBpLGw7KGk9KGw9dGhpcy5wcm9wcykub25SZXNldCk9PT1udWxsfHxpPT09dm9pZCAwfHxpLmNhbGwobCx7bmV4dDpvLHByZXY6dC5yZXNldEtleXMscmVhc29uOiJrZXlzIn0pLHRoaXMuc2V0U3RhdGUoSWYpfX1yZW5kZXIoKXtjb25zdHtjaGlsZHJlbjp0LGZhbGxiYWNrUmVuZGVyOm4sRmFsbGJhY2tDb21wb25lbnQ6cixmYWxsYmFjazpvfT10aGlzLnByb3BzLHtkaWRDYXRjaDppLGVycm9yOmx9PXRoaXMuc3RhdGU7bGV0IHM9dDtpZihpKXtjb25zdCBhPXtlcnJvcjpsLHJlc2V0RXJyb3JCb3VuZGFyeTp0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeX07aWYocC5pc1ZhbGlkRWxlbWVudChvKSlzPW87ZWxzZSBpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIilzPW4oYSk7ZWxzZSBpZihyKXM9cC5jcmVhdGVFbGVtZW50KHIsYSk7ZWxzZSB0aHJvdyBsfXJldHVybiBwLmNyZWF0ZUVsZW1lbnQoWU0uUHJvdmlkZXIse3ZhbHVlOntkaWRDYXRjaDppLGVycm9yOmwscmVzZXRFcnJvckJvdW5kYXJ5OnRoaXMucmVzZXRFcnJvckJvdW5kYXJ5fX0scyl9fWZ1bmN0aW9uIFFNKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT12b2lkIDA/YXJndW1lbnRzWzBdOltdLHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOltdO3JldHVybiBlLmxlbmd0aCE9PXQubGVuZ3RofHxlLnNvbWUoKG4scik9PiFPYmplY3QuaXMobix0W3JdKSl9Y29uc3QgeEM9IkNvbGxhcHNpYmxlIixbSk0sd0NdPVRpKHhDKSxbWk0sQm1dPUpNKHhDKSxxTT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQ29sbGFwc2libGU6bixvcGVuOnIsZGVmYXVsdE9wZW46byxkaXNhYmxlZDppLG9uT3BlbkNoYW5nZTpsLC4uLnN9PWUsW2E9ITEsdV09QWwoe3Byb3A6cixkZWZhdWx0UHJvcDpvLG9uQ2hhbmdlOmx9KTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KFpNLHtzY29wZTpuLGRpc2FibGVkOmksY29udGVudElkOkNkKCksb3BlbjphLG9uT3BlblRvZ2dsZTpwLnVzZUNhbGxiYWNrKCgpPT51KGM9PiFjKSxbdV0pfSxwLmNyZWF0ZUVsZW1lbnQoTGUuZGl2LHRlKHsiZGF0YS1zdGF0ZSI6V20oYSksImRhdGEtZGlzYWJsZWQiOmk/IiI6dm9pZCAwfSxzLHtyZWY6dH0pKSl9KSxlND0iQ29sbGFwc2libGVUcmlnZ2VyIix0ND1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQ29sbGFwc2libGU6biwuLi5yfT1lLG89Qm0oZTQsbik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChMZS5idXR0b24sdGUoe3R5cGU6ImJ1dHRvbiIsImFyaWEtY29udHJvbHMiOm8uY29udGVudElkLCJhcmlhLWV4cGFuZGVkIjpvLm9wZW58fCExLCJkYXRhLXN0YXRlIjpXbShvLm9wZW4pLCJkYXRhLWRpc2FibGVkIjpvLmRpc2FibGVkPyIiOnZvaWQgMCxkaXNhYmxlZDpvLmRpc2FibGVkfSxyLHtyZWY6dCxvbkNsaWNrOkhlKGUub25DbGljayxvLm9uT3BlblRvZ2dsZSl9KSl9KSxfQz0iQ29sbGFwc2libGVDb250ZW50IixuND1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtmb3JjZU1vdW50Om4sLi4ucn09ZSxvPUJtKF9DLGUuX19zY29wZUNvbGxhcHNpYmxlKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHpsLHtwcmVzZW50Om58fG8ub3Blbn0sKHtwcmVzZW50Oml9KT0+cC5jcmVhdGVFbGVtZW50KHI0LHRlKHt9LHIse3JlZjp0LHByZXNlbnQ6aX0pKSl9KSxyND1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQ29sbGFwc2libGU6bixwcmVzZW50OnIsY2hpbGRyZW46bywuLi5pfT1lLGw9Qm0oX0MsbiksW3MsYV09cC51c2VTdGF0ZShyKSx1PXAudXNlUmVmKG51bGwpLGM9UWUodCx1KSxkPXAudXNlUmVmKDApLGY9ZC5jdXJyZW50LGg9cC51c2VSZWYoMCksbT1oLmN1cnJlbnQsZz1sLm9wZW58fHMsUz1wLnVzZVJlZihnKSx2PXAudXNlUmVmKCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgeT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PlMuY3VycmVudD0hMSk7cmV0dXJuKCk9PmNhbmNlbEFuaW1hdGlvbkZyYW1lKHkpfSxbXSksVG4oKCk9Pntjb25zdCB5PXUuY3VycmVudDtpZih5KXt2LmN1cnJlbnQ9di5jdXJyZW50fHx7dHJhbnNpdGlvbkR1cmF0aW9uOnkuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uLGFuaW1hdGlvbk5hbWU6eS5zdHlsZS5hbmltYXRpb25OYW1lfSx5LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj0iMHMiLHkuc3R5bGUuYW5pbWF0aW9uTmFtZT0ibm9uZSI7Y29uc3QgeD15LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2QuY3VycmVudD14LmhlaWdodCxoLmN1cnJlbnQ9eC53aWR0aCxTLmN1cnJlbnR8fCh5LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj12LmN1cnJlbnQudHJhbnNpdGlvbkR1cmF0aW9uLHkuc3R5bGUuYW5pbWF0aW9uTmFtZT12LmN1cnJlbnQuYW5pbWF0aW9uTmFtZSksYShyKX19LFtsLm9wZW4scl0pLHAuY3JlYXRlRWxlbWVudChMZS5kaXYsdGUoeyJkYXRhLXN0YXRlIjpXbShsLm9wZW4pLCJkYXRhLWRpc2FibGVkIjpsLmRpc2FibGVkPyIiOnZvaWQgMCxpZDpsLmNvbnRlbnRJZCxoaWRkZW46IWd9LGkse3JlZjpjLHN0eWxlOnsiLS1yYWRpeC1jb2xsYXBzaWJsZS1jb250ZW50LWhlaWdodCI6Zj9gJHtmfXB4YDp2b2lkIDAsIi0tcmFkaXgtY29sbGFwc2libGUtY29udGVudC13aWR0aCI6bT9gJHttfXB4YDp2b2lkIDAsLi4uZS5zdHlsZX19KSxnJiZvKX0pO2Z1bmN0aW9uIFdtKGUpe3JldHVybiBlPyJvcGVuIjoiY2xvc2VkIn1jb25zdCBvND1xTSxpND10NCxsND1uNCxVbz0iQWNjb3JkaW9uIixzND1bIkhvbWUiLCJFbmQiLCJBcnJvd0Rvd24iLCJBcnJvd1VwIiwiQXJyb3dMZWZ0IiwiQXJyb3dSaWdodCJdLFtVbSxhNCx1NF09ckUoVW8pLFtMZCxWNF09VGkoVW8sW3U0LHdDXSksVm09d0MoKSxTQz1lZS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dHlwZTpuLC4uLnJ9PWUsbz1yLGk9cjtyZXR1cm4gZWUuY3JlYXRlRWxlbWVudChVbS5Qcm92aWRlcix7c2NvcGU6ZS5fX3Njb3BlQWNjb3JkaW9ufSxuPT09Im11bHRpcGxlIj9lZS5jcmVhdGVFbGVtZW50KGg0LHRlKHt9LGkse3JlZjp0fSkpOmVlLmNyZWF0ZUVsZW1lbnQoZjQsdGUoe30sbyx7cmVmOnR9KSkpfSk7U0MucHJvcFR5cGVzPXt0eXBlKGUpe2NvbnN0IHQ9ZS52YWx1ZXx8ZS5kZWZhdWx0VmFsdWU7cmV0dXJuIGUudHlwZSYmIVsic2luZ2xlIiwibXVsdGlwbGUiXS5pbmNsdWRlcyhlLnR5cGUpP25ldyBFcnJvcigiSW52YWxpZCBwcm9wIGB0eXBlYCBzdXBwbGllZCB0byBgQWNjb3JkaW9uYC4gRXhwZWN0ZWQgb25lIG9mIGBzaW5nbGUgfCBtdWx0aXBsZWAuIik6ZS50eXBlPT09Im11bHRpcGxlIiYmdHlwZW9mIHQ9PSJzdHJpbmciP25ldyBFcnJvcigiSW52YWxpZCBwcm9wIGB0eXBlYCBzdXBwbGllZCB0byBgQWNjb3JkaW9uYC4gRXhwZWN0ZWQgYHNpbmdsZWAgd2hlbiBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIGlzIHR5cGUgYHN0cmluZ2AuIik6ZS50eXBlPT09InNpbmdsZSImJkFycmF5LmlzQXJyYXkodCk/bmV3IEVycm9yKCJJbnZhbGlkIHByb3AgYHR5cGVgIHN1cHBsaWVkIHRvIGBBY2NvcmRpb25gLiBFeHBlY3RlZCBgbXVsdGlwbGVgIHdoZW4gYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBpcyB0eXBlIGBzdHJpbmdbXWAuIik6bnVsbH19O2NvbnN0W0VDLGM0XT1MZChVbyksW0NDLGQ0XT1MZChVbyx7Y29sbGFwc2libGU6ITF9KSxmND1lZS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dmFsdWU6bixkZWZhdWx0VmFsdWU6cixvblZhbHVlQ2hhbmdlOm89KCk9Pnt9LGNvbGxhcHNpYmxlOmk9ITEsLi4ubH09ZSxbcyxhXT1BbCh7cHJvcDpuLGRlZmF1bHRQcm9wOnIsb25DaGFuZ2U6b30pO3JldHVybiBlZS5jcmVhdGVFbGVtZW50KEVDLHtzY29wZTplLl9fc2NvcGVBY2NvcmRpb24sdmFsdWU6cz9bc106W10sb25JdGVtT3BlbjphLG9uSXRlbUNsb3NlOmVlLnVzZUNhbGxiYWNrKCgpPT5pJiZhKCIiKSxbaSxhXSl9LGVlLmNyZWF0ZUVsZW1lbnQoQ0Mse3Njb3BlOmUuX19zY29wZUFjY29yZGlvbixjb2xsYXBzaWJsZTppfSxlZS5jcmVhdGVFbGVtZW50KCRDLHRlKHt9LGwse3JlZjp0fSkpKSl9KSxoND1lZS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dmFsdWU6bixkZWZhdWx0VmFsdWU6cixvblZhbHVlQ2hhbmdlOm89KCk9Pnt9LC4uLml9PWUsW2w9W10sc109QWwoe3Byb3A6bixkZWZhdWx0UHJvcDpyLG9uQ2hhbmdlOm99KSxhPWVlLnVzZUNhbGxiYWNrKGM9PnMoKGQ9W10pPT5bLi4uZCxjXSksW3NdKSx1PWVlLnVzZUNhbGxiYWNrKGM9PnMoKGQ9W10pPT5kLmZpbHRlcihmPT5mIT09YykpLFtzXSk7cmV0dXJuIGVlLmNyZWF0ZUVsZW1lbnQoRUMse3Njb3BlOmUuX19zY29wZUFjY29yZGlvbix2YWx1ZTpsLG9uSXRlbU9wZW46YSxvbkl0ZW1DbG9zZTp1fSxlZS5jcmVhdGVFbGVtZW50KENDLHtzY29wZTplLl9fc2NvcGVBY2NvcmRpb24sY29sbGFwc2libGU6ITB9LGVlLmNyZWF0ZUVsZW1lbnQoJEMsdGUoe30saSx7cmVmOnR9KSkpKX0pLFtwNCxEZF09TGQoVW8pLCRDPWVlLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sZGlzYWJsZWQ6cixkaXI6byxvcmllbnRhdGlvbjppPSJ2ZXJ0aWNhbCIsLi4ubH09ZSxzPWVlLnVzZVJlZihudWxsKSxhPVFlKHMsdCksdT1hNChuKSxkPUlnKG8pPT09Imx0ciIsZj1IZShlLm9uS2V5RG93bixoPT57dmFyIG07aWYoIXM0LmluY2x1ZGVzKGgua2V5KSlyZXR1cm47Y29uc3QgZz1oLnRhcmdldCxTPXUoKS5maWx0ZXIoRD0+e3ZhciBPO3JldHVybiEoKE89RC5yZWYuY3VycmVudCkhPT1udWxsJiZPIT09dm9pZCAwJiZPLmRpc2FibGVkKX0pLHY9Uy5maW5kSW5kZXgoRD0+RC5yZWYuY3VycmVudD09PWcpLHk9Uy5sZW5ndGg7aWYodj09PS0xKXJldHVybjtoLnByZXZlbnREZWZhdWx0KCk7bGV0IHg9djtjb25zdCB3PTAsaz15LTEsYj0oKT0+e3g9disxLHg+ayYmKHg9dyl9LFQ9KCk9Pnt4PXYtMSx4PHcmJih4PWspfTtzd2l0Y2goaC5rZXkpe2Nhc2UiSG9tZSI6eD13O2JyZWFrO2Nhc2UiRW5kIjp4PWs7YnJlYWs7Y2FzZSJBcnJvd1JpZ2h0IjppPT09Imhvcml6b250YWwiJiYoZD9iKCk6VCgpKTticmVhaztjYXNlIkFycm93RG93biI6aT09PSJ2ZXJ0aWNhbCImJmIoKTticmVhaztjYXNlIkFycm93TGVmdCI6aT09PSJob3Jpem9udGFsIiYmKGQ/VCgpOmIoKSk7YnJlYWs7Y2FzZSJBcnJvd1VwIjppPT09InZlcnRpY2FsIiYmVCgpO2JyZWFrfWNvbnN0IE49eCV5OyhtPVNbTl0ucmVmLmN1cnJlbnQpPT09bnVsbHx8bT09PXZvaWQgMHx8bS5mb2N1cygpfSk7cmV0dXJuIGVlLmNyZWF0ZUVsZW1lbnQocDQse3Njb3BlOm4sZGlzYWJsZWQ6cixkaXJlY3Rpb246byxvcmllbnRhdGlvbjppfSxlZS5jcmVhdGVFbGVtZW50KFVtLlNsb3Qse3Njb3BlOm59LGVlLmNyZWF0ZUVsZW1lbnQoTGUuZGl2LHRlKHt9LGwseyJkYXRhLW9yaWVudGF0aW9uIjppLHJlZjphLG9uS2V5RG93bjpyP3ZvaWQgMDpmfSkpKSl9KSxJcD0iQWNjb3JkaW9uSXRlbSIsW2c0LEhtXT1MZChJcCksbTQ9ZWUuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVBY2NvcmRpb246bix2YWx1ZTpyLC4uLm99PWUsaT1EZChJcCxuKSxsPWM0KElwLG4pLHM9Vm0obiksYT1DZCgpLHU9ciYmbC52YWx1ZS5pbmNsdWRlcyhyKXx8ITEsYz1pLmRpc2FibGVkfHxlLmRpc2FibGVkO3JldHVybiBlZS5jcmVhdGVFbGVtZW50KGc0LHtzY29wZTpuLG9wZW46dSxkaXNhYmxlZDpjLHRyaWdnZXJJZDphfSxlZS5jcmVhdGVFbGVtZW50KG80LHRlKHsiZGF0YS1vcmllbnRhdGlvbiI6aS5vcmllbnRhdGlvbiwiZGF0YS1zdGF0ZSI6a0ModSl9LHMsbyx7cmVmOnQsZGlzYWJsZWQ6YyxvcGVuOnUsb25PcGVuQ2hhbmdlOmQ9PntkP2wub25JdGVtT3BlbihyKTpsLm9uSXRlbUNsb3NlKHIpfX0pKSl9KSx2ND0iQWNjb3JkaW9uSGVhZGVyIix5ND1lZS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZUFjY29yZGlvbjpuLC4uLnJ9PWUsbz1EZChVbyxuKSxpPUhtKHY0LG4pO3JldHVybiBlZS5jcmVhdGVFbGVtZW50KExlLmgzLHRlKHsiZGF0YS1vcmllbnRhdGlvbiI6by5vcmllbnRhdGlvbiwiZGF0YS1zdGF0ZSI6a0MoaS5vcGVuKSwiZGF0YS1kaXNhYmxlZCI6aS5kaXNhYmxlZD8iIjp2b2lkIDB9LHIse3JlZjp0fSkpfSksZTE9IkFjY29yZGlvblRyaWdnZXIiLHg0PWVlLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sLi4ucn09ZSxvPURkKFVvLG4pLGk9SG0oZTEsbiksbD1kNChlMSxuKSxzPVZtKG4pO3JldHVybiBlZS5jcmVhdGVFbGVtZW50KFVtLkl0ZW1TbG90LHtzY29wZTpufSxlZS5jcmVhdGVFbGVtZW50KGk0LHRlKHsiYXJpYS1kaXNhYmxlZCI6aS5vcGVuJiYhbC5jb2xsYXBzaWJsZXx8dm9pZCAwLCJkYXRhLW9yaWVudGF0aW9uIjpvLm9yaWVudGF0aW9uLGlkOmkudHJpZ2dlcklkfSxzLHIse3JlZjp0fSkpKX0pLHc0PSJBY2NvcmRpb25Db250ZW50IixfND1lZS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZUFjY29yZGlvbjpuLC4uLnJ9PWUsbz1EZChVbyxuKSxpPUhtKHc0LG4pLGw9Vm0obik7cmV0dXJuIGVlLmNyZWF0ZUVsZW1lbnQobDQsdGUoe3JvbGU6InJlZ2lvbiIsImFyaWEtbGFiZWxsZWRieSI6aS50cmlnZ2VySWQsImRhdGEtb3JpZW50YXRpb24iOm8ub3JpZW50YXRpb259LGwscix7cmVmOnQsc3R5bGU6eyItLXJhZGl4LWFjY29yZGlvbi1jb250ZW50LWhlaWdodCI6InZhcigtLXJhZGl4LWNvbGxhcHNpYmxlLWNvbnRlbnQtaGVpZ2h0KSIsIi0tcmFkaXgtYWNjb3JkaW9uLWNvbnRlbnQtd2lkdGgiOiJ2YXIoLS1yYWRpeC1jb2xsYXBzaWJsZS1jb250ZW50LXdpZHRoKSIsLi4uZS5zdHlsZX19KSl9KTtmdW5jdGlvbiBrQyhlKXtyZXR1cm4gZT8ib3BlbiI6ImNsb3NlZCJ9Y29uc3QgUzQ9U0MsRTQ9bTQsQzQ9eTQsVEM9eDQsYkM9XzQsJDQ9UzQsTkM9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9Pl8uanN4KEU0LHtyZWY6bixjbGFzc05hbWU6aXQoImJvcmRlci1iIixlKSwuLi50fSkpO05DLmRpc3BsYXlOYW1lPSJBY2NvcmRpb25JdGVtIjtjb25zdCBSQz1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxjaGlsZHJlbjp0LC4uLm59LHIpPT5fLmpzeChDNCx7Y2xhc3NOYW1lOiJmbGV4IixjaGlsZHJlbjpfLmpzeHMoVEMse3JlZjpyLGNsYXNzTmFtZTppdCgiZmxleCBmbGV4LTEgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweS00IGZvbnQtbWVkaXVtIHRyYW5zaXRpb24tYWxsIGhvdmVyOnVuZGVybGluZSBbJltkYXRhLXN0YXRlPW9wZW5dPnN2Z106cm90YXRlLTE4MCIsZSksLi4ubixjaGlsZHJlbjpbdCxfLmpzeCh0RSx7Y2xhc3NOYW1lOiJ3LTQgaC00IHRyYW5zaXRpb24tdHJhbnNmb3JtIGR1cmF0aW9uLTIwMCBzaHJpbmstMCJ9KV19KX0pKTtSQy5kaXNwbGF5TmFtZT1UQy5kaXNwbGF5TmFtZTtjb25zdCBQQz1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxjaGlsZHJlbjp0LC4uLm59LHIpPT5fLmpzeChiQyx7cmVmOnIsY2xhc3NOYW1lOml0KCJvdmVyZmxvdy1oaWRkZW4gdGV4dC1zbSB0cmFuc2l0aW9uLWFsbCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtYWNjb3JkaW9uLXVwIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtYWNjb3JkaW9uLWRvd24iLGUpLC4uLm4sY2hpbGRyZW46Xy5qc3goImRpdiIse2NsYXNzTmFtZToicHQtMCBwYi00IixjaGlsZHJlbjp0fSl9KSk7UEMuZGlzcGxheU5hbWU9YkMuZGlzcGxheU5hbWU7LyoqCiAqIFJlYWN0IFJvdXRlciBET00gdjYuMTguMAogKgogKiBDb3B5cmlnaHQgKGMpIFJlbWl4IFNvZnR3YXJlIEluYy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UubWQgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICoKICogQGxpY2Vuc2UgTUlUCiAqL2Z1bmN0aW9uIFZjKCl7cmV0dXJuIFZjPU9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbi5iaW5kKCk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sVmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIGs0KGUsdCl7cmV0dXJuIGFNKHtiYXNlbmFtZTp0PT1udWxsP3ZvaWQgMDp0LmJhc2VuYW1lLGZ1dHVyZTpWYyh7fSx0PT1udWxsP3ZvaWQgMDp0LmZ1dHVyZSx7djdfcHJlcGVuZEJhc2VuYW1lOiEwfSksaGlzdG9yeTpSMyh7d2luZG93OnQ9PW51bGw/dm9pZCAwOnQud2luZG93fSksaHlkcmF0aW9uRGF0YToodD09bnVsbD92b2lkIDA6dC5oeWRyYXRpb25EYXRhKXx8VDQoKSxyb3V0ZXM6ZSxtYXBSb3V0ZVByb3BlcnRpZXM6TE0sd2luZG93OnQ9PW51bGw/dm9pZCAwOnQud2luZG93fSkuaW5pdGlhbGl6ZSgpfWZ1bmN0aW9uIFQ0KCl7dmFyIGU7bGV0IHQ9KGU9d2luZG93KT09bnVsbD92b2lkIDA6ZS5fX3N0YXRpY1JvdXRlckh5ZHJhdGlvbkRhdGE7cmV0dXJuIHQmJnQuZXJyb3JzJiYodD1WYyh7fSx0LHtlcnJvcnM6YjQodC5lcnJvcnMpfSkpLHR9ZnVuY3Rpb24gYjQoZSl7aWYoIWUpcmV0dXJuIG51bGw7bGV0IHQ9T2JqZWN0LmVudHJpZXMoZSksbj17fTtmb3IobGV0W3Isb11vZiB0KWlmKG8mJm8uX190eXBlPT09IlJvdXRlRXJyb3JSZXNwb25zZSIpbltyXT1uZXcgSW0oby5zdGF0dXMsby5zdGF0dXNUZXh0LG8uZGF0YSxvLmludGVybmFsPT09ITApO2Vsc2UgaWYobyYmby5fX3R5cGU9PT0iRXJyb3IiKXtpZihvLl9fc3ViVHlwZSl7bGV0IGk9d2luZG93W28uX19zdWJUeXBlXTtpZih0eXBlb2YgaT09ImZ1bmN0aW9uIil0cnl7bGV0IGw9bmV3IGkoby5tZXNzYWdlKTtsLnN0YWNrPSIiLG5bcl09bH1jYXRjaHt9fWlmKG5bcl09PW51bGwpe2xldCBpPW5ldyBFcnJvcihvLm1lc3NhZ2UpO2kuc3RhY2s9IiIsbltyXT1pfX1lbHNlIG5bcl09bztyZXR1cm4gbn1jb25zdCBOND1wLmNyZWF0ZUNvbnRleHQoe2lzVHJhbnNpdGlvbmluZzohMX0pLFI0PXAuY3JlYXRlQ29udGV4dChuZXcgTWFwKSxQND0ic3RhcnRUcmFuc2l0aW9uIix0MT1mMVtQNF07ZnVuY3Rpb24gTzQoZSl7dDE/dDEoZSk6ZSgpfWNsYXNzIEE0e2NvbnN0cnVjdG9yKCl7dGhpcy5zdGF0dXM9InBlbmRpbmciLHRoaXMucHJvbWlzZT1uZXcgUHJvbWlzZSgodCxuKT0+e3RoaXMucmVzb2x2ZT1yPT57dGhpcy5zdGF0dXM9PT0icGVuZGluZyImJih0aGlzLnN0YXR1cz0icmVzb2x2ZWQiLHQocikpfSx0aGlzLnJlamVjdD1yPT57dGhpcy5zdGF0dXM9PT0icGVuZGluZyImJih0aGlzLnN0YXR1cz0icmVqZWN0ZWQiLG4ocikpfX0pfX1mdW5jdGlvbiBNNChlKXtsZXR7ZmFsbGJhY2tFbGVtZW50OnQscm91dGVyOm4sZnV0dXJlOnJ9PWUsW28saV09cC51c2VTdGF0ZShuLnN0YXRlKSxbbCxzXT1wLnVzZVN0YXRlKCksW2EsdV09cC51c2VTdGF0ZSh7aXNUcmFuc2l0aW9uaW5nOiExfSksW2MsZF09cC51c2VTdGF0ZSgpLFtmLGhdPXAudXNlU3RhdGUoKSxbbSxnXT1wLnVzZVN0YXRlKCksUz1wLnVzZVJlZihuZXcgTWFwKSx7djdfc3RhcnRUcmFuc2l0aW9uOnZ9PXJ8fHt9LHk9cC51c2VDYWxsYmFjayhUPT57dj9PNChUKTpUKCl9LFt2XSkseD1wLnVzZUNhbGxiYWNrKChULE4pPT57bGV0e2RlbGV0ZWRGZXRjaGVyczpELHVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uT3B0czpPfT1OO0QuZm9yRWFjaChqPT5TLmN1cnJlbnQuZGVsZXRlKGopKSxULmZldGNoZXJzLmZvckVhY2goKGosQik9PntqLmRhdGEhPT12b2lkIDAmJlMuY3VycmVudC5zZXQoQixqLmRhdGEpfSksIU98fG4ud2luZG93PT1udWxsfHx0eXBlb2Ygbi53aW5kb3cuZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbiE9ImZ1bmN0aW9uIj95KCgpPT5pKFQpKTpmJiZjPyhjLnJlc29sdmUoKSxmLnNraXBUcmFuc2l0aW9uKCksZyh7c3RhdGU6VCxjdXJyZW50TG9jYXRpb246Ty5jdXJyZW50TG9jYXRpb24sbmV4dExvY2F0aW9uOk8ubmV4dExvY2F0aW9ufSkpOihzKFQpLHUoe2lzVHJhbnNpdGlvbmluZzohMCxjdXJyZW50TG9jYXRpb246Ty5jdXJyZW50TG9jYXRpb24sbmV4dExvY2F0aW9uOk8ubmV4dExvY2F0aW9ufSkpfSxbbi53aW5kb3csZixjLFMseV0pO3AudXNlTGF5b3V0RWZmZWN0KCgpPT5uLnN1YnNjcmliZSh4KSxbbix4XSkscC51c2VFZmZlY3QoKCk9PnthLmlzVHJhbnNpdGlvbmluZyYmZChuZXcgQTQpfSxbYS5pc1RyYW5zaXRpb25pbmddKSxwLnVzZUVmZmVjdCgoKT0+e2lmKGMmJmwmJm4ud2luZG93KXtsZXQgVD1sLE49Yy5wcm9taXNlLEQ9bi53aW5kb3cuZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihhc3luYygpPT57eSgoKT0+aShUKSksYXdhaXQgTn0pO0QuZmluaXNoZWQuZmluYWxseSgoKT0+e2Qodm9pZCAwKSxoKHZvaWQgMCkscyh2b2lkIDApLHUoe2lzVHJhbnNpdGlvbmluZzohMX0pfSksaChEKX19LFt5LGwsYyxuLndpbmRvd10pLHAudXNlRWZmZWN0KCgpPT57YyYmbCYmby5sb2NhdGlvbi5rZXk9PT1sLmxvY2F0aW9uLmtleSYmYy5yZXNvbHZlKCl9LFtjLGYsby5sb2NhdGlvbixsXSkscC51c2VFZmZlY3QoKCk9PnshYS5pc1RyYW5zaXRpb25pbmcmJm0mJihzKG0uc3RhdGUpLHUoe2lzVHJhbnNpdGlvbmluZzohMCxjdXJyZW50TG9jYXRpb246bS5jdXJyZW50TG9jYXRpb24sbmV4dExvY2F0aW9uOm0ubmV4dExvY2F0aW9ufSksZyh2b2lkIDApKX0sW2EuaXNUcmFuc2l0aW9uaW5nLG1dKTtsZXQgdz1wLnVzZU1lbW8oKCk9Pih7Y3JlYXRlSHJlZjpuLmNyZWF0ZUhyZWYsZW5jb2RlTG9jYXRpb246bi5lbmNvZGVMb2NhdGlvbixnbzpUPT5uLm5hdmlnYXRlKFQpLHB1c2g6KFQsTixEKT0+bi5uYXZpZ2F0ZShULHtzdGF0ZTpOLHByZXZlbnRTY3JvbGxSZXNldDpEPT1udWxsP3ZvaWQgMDpELnByZXZlbnRTY3JvbGxSZXNldH0pLHJlcGxhY2U6KFQsTixEKT0+bi5uYXZpZ2F0ZShULHtyZXBsYWNlOiEwLHN0YXRlOk4scHJldmVudFNjcm9sbFJlc2V0OkQ9PW51bGw/dm9pZCAwOkQucHJldmVudFNjcm9sbFJlc2V0fSl9KSxbbl0pLGs9bi5iYXNlbmFtZXx8Ii8iLGI9cC51c2VNZW1vKCgpPT4oe3JvdXRlcjpuLG5hdmlnYXRvcjp3LHN0YXRpYzohMSxiYXNlbmFtZTprfSksW24sdyxrXSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwscC5jcmVhdGVFbGVtZW50KFBkLlByb3ZpZGVyLHt2YWx1ZTpifSxwLmNyZWF0ZUVsZW1lbnQoc0MuUHJvdmlkZXIse3ZhbHVlOm99LHAuY3JlYXRlRWxlbWVudChSNC5Qcm92aWRlcix7dmFsdWU6Uy5jdXJyZW50fSxwLmNyZWF0ZUVsZW1lbnQoTjQuUHJvdmlkZXIse3ZhbHVlOmF9LHAuY3JlYXRlRWxlbWVudChNTSx7YmFzZW5hbWU6ayxsb2NhdGlvbjpvLmxvY2F0aW9uLG5hdmlnYXRpb25UeXBlOm8uaGlzdG9yeUFjdGlvbixuYXZpZ2F0b3I6d30sby5pbml0aWFsaXplZD9wLmNyZWF0ZUVsZW1lbnQoTDQse3JvdXRlczpuLnJvdXRlcyxzdGF0ZTpvfSk6dCkpKSkpLG51bGwpfWZ1bmN0aW9uIEw0KGUpe2xldHtyb3V0ZXM6dCxzdGF0ZTpufT1lO3JldHVybiBFTSh0LHZvaWQgMCxuKX12YXIgbjE7KGZ1bmN0aW9uKGUpe2UuVXNlU2Nyb2xsUmVzdG9yYXRpb249InVzZVNjcm9sbFJlc3RvcmF0aW9uIixlLlVzZVN1Ym1pdD0idXNlU3VibWl0IixlLlVzZVN1Ym1pdEZldGNoZXI9InVzZVN1Ym1pdEZldGNoZXIiLGUuVXNlRmV0Y2hlcj0idXNlRmV0Y2hlciIsZS51c2VWaWV3VHJhbnNpdGlvblN0YXRlPSJ1c2VWaWV3VHJhbnNpdGlvblN0YXRlIn0pKG4xfHwobjE9e30pKTt2YXIgcjE7KGZ1bmN0aW9uKGUpe2UuVXNlRmV0Y2hlcj0idXNlRmV0Y2hlciIsZS5Vc2VGZXRjaGVycz0idXNlRmV0Y2hlcnMiLGUuVXNlU2Nyb2xsUmVzdG9yYXRpb249InVzZVNjcm9sbFJlc3RvcmF0aW9uIn0pKHIxfHwocjE9e30pKTtmdW5jdGlvbiBENCh7ZXJyb3I6ZSxyZXNldEVycm9yQm91bmRhcnk6dH0pe3JldHVybiBjb25zb2xlLmVycm9yKGUpLF8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImFic29sdXRlIHRvcC0wIGxlZnQtMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LXNjcmVlbiBoLXNjcmVlbiBiZy1jYXJkLWZvcmVncm91bmQiLGNoaWxkcmVuOl8uanN4KCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCBoLWZ1bGwgcC0xMCIsY2hpbGRyZW46Xy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCBoLWZ1bGwgcC0xMCBiZy1jYXJkIHRleHQtcHJpbWFyeSIsY2hpbGRyZW46W18uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4iLGNoaWxkcmVuOltfLmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLVswLjVlbV0gdGV4dC1sZyBmb250LWJvbGQgdGV4dC1jZW50ZXIgcHktMiIsY2hpbGRyZW46W18uanN4KEdFLHt9KSwiIGVuY291bnRlcmVkIGFuIGVycm9yIl19KSxfLmpzeCgiYnV0dG9uIix7b25DbGljazp0LGNoaWxkcmVuOl8uanN4KHlPLHt9KX0pXX0pLF8uanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtNHhsIGZvbnQtbm9ybWFsICIsY2hpbGRyZW46Ik1lc3NhZ2U6In0pLF8uanN4KCJwcmUiLHtjaGlsZHJlbjplLm1lc3NhZ2V9KSxlLnN0YWNrJiZfLmpzeCgkNCx7dHlwZToic2luZ2xlIixjbGFzc05hbWU6ImZvbnQtc2VyaWYiLGNvbGxhcHNpYmxlOiEwLGRlZmF1bHRWYWx1ZToiZXJyb3IiLGNoaWxkcmVuOl8uanN4cyhOQyx7dmFsdWU6ImVycm9yIixjaGlsZHJlbjpbXy5qc3goUkMse2NoaWxkcmVuOiJTdGFjayB0cmFjZToifSksXy5qc3goUEMse2NsYXNzTmFtZToicC00IGJnLXBvcG92ZXIgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQiLGNoaWxkcmVuOmUuc3RhY2smJl8uanN4KCJwcmUiLHtjaGlsZHJlbjplLnN0YWNrfSl9KV19KX0pXX0pfSl9KX1mdW5jdGlvbiBJNCgpe2NvbnN0IGU9azQoW3twYXRoOiIvKiIsZWxlbWVudDpfLmpzeChYTSx7ZmFsbGJhY2tSZW5kZXI6RDQsY2hpbGRyZW46Xy5qc3goSU0se3ZhbEFwaTpuZXcgdGIoIi9hcGkvdmFsIil9KX0pfV0se2Jhc2VuYW1lOiIvYXBpL3ZhbC9zdGF0aWMvZWRpdCJ9KTtyZXR1cm4gXy5qc3goTTQse3JvdXRlcjplfSl9amYuY3JlYXRlUm9vdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicm9vdCIpKS5yZW5kZXIoZWUuY3JlYXRlRWxlbWVudChlZS5TdHJpY3RNb2RlLG51bGwsZWUuY3JlYXRlRWxlbWVudChJNCxudWxsKSkpOwo=","/index.html":"PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+CiAgICA8dGl0bGU+VmFsPC90aXRsZT4KICAgIAogICAgPHNjcmlwdCB0eXBlPSJtb2R1bGUiIGNyb3Nzb3JpZ2luIHNyYz0iL2FwaS92YWwvc3RhdGljL2Fzc2V0cy9pbmRleC1hNzVhNmQwNS5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9hcGkvdmFsL3N0YXRpYy9hc3NldHMvaW5kZXgtOGU2MWUzMjQuY3NzIj4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJyb290Ij48L2Rpdj4KICA8L2JvZHk+CjwvaHRtbD4K"}`
|
|
5
5
|
);
|
|
6
6
|
function createRequestHandler() {
|
|
7
7
|
if (typeof files !== "object") {
|