@citolab/qti-components 6.9.1-beta.70 → 6.9.1-beta.72
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/custom-elements.json +92 -92
- package/dist/index.global.js +1 -1
- package/dist/index.js +3 -3
- package/dist/index.min.js +1 -1
- package/dist/item.css +12 -5
- package/dist/qti-components/index.cjs +3 -3
- package/dist/qti-components/index.js +3 -3
- package/dist/qti-components-jsx.d.ts +17 -17
- package/dist/vscode.html-custom-data.json +17 -17
- package/package.json +1 -2
|
@@ -5160,11 +5160,11 @@ var QtiHotspotInteraction = class extends ChoicesMixin(Interaction, "qti-hotspot
|
|
|
5160
5160
|
}
|
|
5161
5161
|
connectedCallback() {
|
|
5162
5162
|
super.connectedCallback();
|
|
5163
|
-
this.addEventListener("qti-
|
|
5163
|
+
this.addEventListener("register-qti-hotspot-choice", this.positionHotspotOnRegister);
|
|
5164
5164
|
}
|
|
5165
5165
|
disconnectedCallback() {
|
|
5166
5166
|
super.disconnectedCallback();
|
|
5167
|
-
this.removeEventListener("qti-
|
|
5167
|
+
this.removeEventListener("unregister-qti-hotspot-choice", this.positionHotspotOnRegister);
|
|
5168
5168
|
}
|
|
5169
5169
|
};
|
|
5170
5170
|
// do not select ( highlight blue, the image)
|
|
@@ -6389,4 +6389,4 @@ export {
|
|
|
6389
6389
|
itemContextVariables,
|
|
6390
6390
|
qtiAndMixin
|
|
6391
6391
|
};
|
|
6392
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL3dhdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYvcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLXRyYW5zZm9ybWVycy9xdGktdHJhbnNmb3JtZXJzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLXRyYW5zZm9ybWVycy9xdGktdHJhbnNmb3JtLWl0ZW0udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHkuc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXByb21wdC9xdGktcHJvbXB0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXN0eWxlc2hlZXQvcXRpLXN0eWxlc2hlZXQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbi9xdGktcmVzcG9uc2UtZGVjbGFyYXRpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvL3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcnVicmljLWJsb2NrL3F0aS1jb250ZW50LWJvZHkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcnVicmljLWJsb2NrL3F0aS1ydWJyaWMtYmxvY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLWJsb2NrL3F0aS1mZWVkYmFjay1ibG9jay50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC91dGlscy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2staW5saW5lL3F0aS1mZWVkYmFjay1pbmxpbmUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrL3F0aS1tb2RhbC1mZWVkYmFjay50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbi9xdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvdm9jYWJ1bGFyeS92b2NhYnVsYXJ5LW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nL3F0aS1vdXRjb21lLXByb2Nlc3NpbmcudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3RlbXBsYXRlLXN0cmluZ3MudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktbG9va3VwLW91dGNvbWUtdmFsdWUvcXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJ1bGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktcmVzcG9uc2UtY29uZGl0aW9uL3F0aS1yZXNwb25zZS1jb25kaXRpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktc2V0LW91dGNvbWUtdmFsdWUvcXRpLXNldC1vdXRjb21lLXZhbHVlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWVsc2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtZWxzZS9xdGktcmVzcG9uc2UtaWYvcXRpLXJlc3BvbnNlLWVsc2UtaWYvcXRpLXJlc3BvbnNlLWVsc2UtaWYudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtZWxzZS9xdGktcmVzcG9uc2UtaWYvcXRpLXJlc3BvbnNlLWlmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktYW5kL3F0aS1hbmQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktYW5kL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWJhc2V2YWx1ZS9xdGktYmFzZXZhbHVlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWNvbnRhaW5zL3F0aS1jb250YWlucy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1jb3JyZWN0L3F0aS1jb3JyZWN0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWVxdWFsLXJvdW5kZWQvcXRpLWVxdWFsLXJvdW5kZWQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZXF1YWwvcXRpLWVxdWFsLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWd0L3F0aS1ndC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1ndGUvcXRpLWd0ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1pcy1udWxsL3F0aS1pcy1udWxsLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWx0L3F0aS1sdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1sdGUvcXRpLWx0ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXAtcmVzcG9uc2UvcXRpLW1hcC1yZXNwb25zZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXBwaW5nL3F0aS1tYXBwaW5nLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW1hdGNoL3F0aS1tYXRjaC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tZW1iZXIvcXRpLW1lbWJlci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tdWx0aXBsZS9xdGktbXVsdGlwbGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbm90L3F0aS1ub3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktb3IvcXRpLW9yLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW9yZGVyZWQvcXRpLW9yZGVyZWQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktcHJpbnRlZC12YXJpYWJsZS9xdGktcHJpbnRlZC12YXJpYWJsZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1wcm9kdWN0L3F0aS1wcm9kdWN0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXN0cmluZy1tYXRjaC9xdGktc3RyaW5nLW1hdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXN1bS9xdGktc3VtLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXZhcmlhYmxlL3F0aS12YXJpYWJsZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uL3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtYXBpLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcm9wcGFibGVzLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9mbGlwcGFibGVzLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL2xpdmUtcXVlcnkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9ob3RzcG90cy9ob3RzcG90LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24uc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbi9xdGktbWVkaWEtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uL3F0aS1vcmRlci1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2xpZGVyLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktY3VzdG9tLW9wZXJhdG9yL3F0aS1jdXN0b20tb3BlcmF0b3IudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWFibGUtaG90c3BvdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAtaW1nLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAtdGV4dC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1jaG9pY2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgcHJvdmlkZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcbmltcG9ydCB0eXBlIHsgSW50ZXJhY3Rpb25DaGFuZ2VkRGV0YWlscywgT3V0Y29tZUNoYW5nZWREZXRhaWxzIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXZlbnQtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBSZXNwb25zZUludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHR5cGUgeyBWYXJpYWJsZURlY2xhcmF0aW9uLCBWYXJpYWJsZVZhbHVlIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IE91dGNvbWVWYXJpYWJsZSwgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgdHlwZSB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjayc7XG5pbXBvcnQgdHlwZSB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB0eXBlIHsgUXRpUmVzcG9uc2VQcm9jZXNzaW5nIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dFZhcmlhYmxlcyB9IGZyb20gJy4vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCBRdGlSZWdpc3RlclZhcmlhYmxlIGZyb20gJy4uL2ludGVybmFsL2V2ZW50cy9xdGktcmVnaXN0ZXItdmFyaWFibGUnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktYXNzZXNzbWVudC1pdGVtIGVsZW1lbnQgY29udGFpbnMgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmRsdG5uajg3bDB5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA0LjBcbiAqXG4gKiBAZGVwZW5kZW5jeSBxdGktZmVlZGJhY2tcbiAqIEBkZXBlbmRlbmN5IHF0aS1yZXNwb25zZXByb2Nlc3NpbmdcbiAqXG4gKiBAc2xvdCAtIFRoZSBkZWZhdWx0IHNsb3Qgd2hlcmUgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMgZ28uXG4gKlxuICogQGV2ZW50IHF0aS1pbnRlcmFjdGlvbi1jaGFuZ2VkIC0gRW1pdHRlZCB3aGVuIGFuIGludGVyYWN0aW9uIGlzIGNoYW5nZWQuXG4gKiBAZXZlbnQgcXRpLW91dGNvbWUtY2hhbmdlZCAtIEVtaXR0ZWQgd2hlbiBhbiBvdXRjb21lIGhhcyBjaGFuZ2VkLlxuICogQGV2ZW50IHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nIC0gRW1pdHRlZCB3aGVuIHJlc3BvbnNlLXByb2Nlc3NpbmcgaXMgY2FsbGVkLlxuICpcbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKVxuZXhwb3J0IGNsYXNzIFF0aUFzc2Vzc21lbnRJdGVtIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aXRsZTogc3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBhZGFwdGl2ZTogJ3RydWUnIHwgJ2ZhbHNlJyA9ICdmYWxzZSc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aW1lRGVwZW5kZW50OiAndHJ1ZScgfCAnZmFsc2UnIHwgbnVsbCA9IG51bGw7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSBkaXNhYmxlZDogYm9vbGVhbjtcbiAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZURpc2FibGVkQ2hhbmdlID0gKF86IGJvb2xlYW4sIGRpc2FibGVkOiBib29sZWFuKSA9PiB7XG4gICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5kaXNhYmxlZCA9IGRpc2FibGVkKSk7XG4gIH07XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSByZWFkb25seTogYm9vbGVhbjtcbiAgQHdhdGNoKCdyZWFkb25seScsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZVJlYWRvbmx5Q2hhbmdlID0gKF86IGJvb2xlYW4sIHJlYWRvbmx5OiBib29sZWFuKSA9PlxuICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZm9yRWFjaChjaCA9PiAoY2gucmVhZG9ubHkgPSByZWFkb25seSkpO1xuXG4gIEBwcm92aWRlKHsgY29udGV4dDogaXRlbUNvbnRleHQgfSlcbiAgcHJpdmF0ZSBfY29udGV4dDogSXRlbUNvbnRleHQgPSB7XG4gICAgaWRlbnRpZmllcjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSxcbiAgICB2YXJpYWJsZXM6IGl0ZW1Db250ZXh0VmFyaWFibGVzXG4gIH07XG5cbiAgcHVibGljIGdldCB2YXJpYWJsZXMoKTogVmFyaWFibGVWYWx1ZTxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+W10ge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5tYXAodiA9PiAoe1xuICAgICAgaWRlbnRpZmllcjogdi5pZGVudGlmaWVyLFxuICAgICAgdmFsdWU6IHYudmFsdWUsXG4gICAgICB0eXBlOiB2LnR5cGUsXG4gICAgICAvLyBhZGQgZXh0ZXJuYWxzY29yZWQsIGEgZml4ZWQgcHJvcCB0byB0aGUgdGVzdCwgc28gdGhlIHRlc3Rjb250ZXh0IGNhbiByZWFkIGFuZCBkZWNpZGUgaG93IHRvIHNjb3JlIHRoaXMgaXRlbVxuICAgICAgLi4uKHYudHlwZSA9PT0gJ291dGNvbWUnICYmIHYuaWRlbnRpZmllciA9PT0gJ1NDT1JFJ1xuICAgICAgICA/IHsgZXh0ZXJuYWxTY29yZWQ6ICh2IGFzIE91dGNvbWVWYXJpYWJsZSkuZXh0ZXJuYWxTY29yZWQgfVxuICAgICAgICA6IHt9KVxuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFyaWFibGVzKHZhbHVlOiBWYXJpYWJsZVZhbHVlPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD5bXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUuc29tZSh2ID0+ICEoJ2lkZW50aWZpZXInIGluIHYpKSkge1xuICAgICAgY29uc29sZS53YXJuKCd2YXJpYWJsZXMgcHJvcGVydHkgc2hvdWxkIGJlIGFuIGFycmF5IG9mIFZhcmlhYmxlRGVjbGFyYXRpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY29udGV4dCA9IHtcbiAgICAgIC4uLnRoaXMuX2NvbnRleHQsXG4gICAgICB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2YXJpYWJsZSA9PiB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nVmFsdWUgPSB2YWx1ZS5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB2YXJpYWJsZS5pZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi52YXJpYWJsZSwgLi4ubWF0Y2hpbmdWYWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YXJpYWJsZTtcbiAgICAgIH0pXG4gICAgfTtcblxuICAgIHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdyZXNwb25zZScpIHtcbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb25FbGVtZW50ID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICAgIChlbDogSW50ZXJhY3Rpb24pID0+IGVsLnJlc3BvbnNlSWRlbnRpZmllciA9PT0gdmFyaWFibGUuaWRlbnRpZmllclxuICAgICAgICApO1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb25FbGVtZW50KSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb25FbGVtZW50LnZhbHVlID0gdmFyaWFibGUudmFsdWUgYXMgc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdvdXRjb21lJykge1xuICAgICAgICB0aGlzLl9mZWVkYmFja0VsZW1lbnRzLmZvckVhY2goZmUgPT4gZmUuY2hlY2tTaG93RmVlZGJhY2sodmFyaWFibGUuaWRlbnRpZmllcikpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbENvbnRleHQ6IFJlYWRvbmx5PEl0ZW1Db250ZXh0PiA9IHsgLi4udGhpcy5fY29udGV4dCwgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcyB9O1xuICBwcml2YXRlIF9mZWVkYmFja0VsZW1lbnRzOiBRdGlGZWVkYmFja1tdID0gW107XG4gIHByaXZhdGUgX2ludGVyYWN0aW9uRWxlbWVudHM6IEludGVyYWN0aW9uW10gPSBbXTtcblxuICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7XG4gICAgdGhpcy5fZW1pdDx7IGRldGFpbDogUXRpQXNzZXNzbWVudEl0ZW0gfT4oJ3F0aS1hc3Nlc3NtZW50LWl0ZW0tY29ubmVjdGVkJywgdGhpcyk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgdXNlIHZhcmlhYmxlcyBwcm9wZXJ0eSBpbnN0ZWFkICovXG4gIHNldCByZXNwb25zZXMobXlSZXNwb25zZXM6IFJlc3BvbnNlSW50ZXJhY3Rpb25bXSkge1xuICAgIGlmIChteVJlc3BvbnNlcykge1xuICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBteVJlc3BvbnNlcykge1xuICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlID0gdGhpcy5nZXRSZXNwb25zZShyZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAocmVzcG9uc2VWYXJpYWJsZSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlUmVzcG9uc2VWYXJpYWJsZShyZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB8IHVuZGVmaW5lZCA9IHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZmluZChcbiAgICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgICApO1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi52YWx1ZSA9IHJlc3BvbnNlLnJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIChlOiBRdGlSZWdpc3RlclZhcmlhYmxlKSA9PiB7XG4gICAgICB0aGlzLl9jb250ZXh0ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IFsuLi50aGlzLl9jb250ZXh0LnZhcmlhYmxlcywgZS5kZXRhaWwudmFyaWFibGVdIH07XG4gICAgICB0aGlzLl9pbml0aWFsQ29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWZlZWRiYWNrJywgKGU6IEN1c3RvbUV2ZW50PFF0aUZlZWRiYWNrPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGZlZWRiYWNrRWxlbWVudCA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy5fZmVlZGJhY2tFbGVtZW50cy5wdXNoKGZlZWRiYWNrRWxlbWVudCk7XG4gICAgICBmZWVkYmFja0VsZW1lbnQuY2hlY2tTaG93RmVlZGJhY2soZmVlZGJhY2tFbGVtZW50Lm91dGNvbWVJZGVudGlmaWVyKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIChlOiBDdXN0b21FdmVudDxudWxsPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMucHVzaChlLnRhcmdldCBhcyBJbnRlcmFjdGlvbik7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlbmQtYXR0ZW1wdCcsIChlOiBDdXN0b21FdmVudDx7IHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nOyBjb3VudEF0dGVtcHQ6IGJvb2xlYW4gfT4pID0+IHtcbiAgICAgIGNvbnN0IHsgcmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQgfSA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgJ3RydWUnKTtcbiAgICAgIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKGNvdW50QXR0ZW1wdCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAvLyB3b3JkdCBhYW5nZXJvZXBlbiB2YW51aXQgZGUgcHJvY2Vzc2luZ3RlbXBsYXRlXG4gICAgICAncXRpLXNldC1vdXRjb21lLXZhbHVlJyxcbiAgICAgIChlOiBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PikgPT4ge1xuICAgICAgICBjb25zdCB7IG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSB9ID0gZS5kZXRhaWw7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywgdGhpcy5oYW5kbGVVcGRhdGVSZXNwb25zZVZhcmlhYmxlKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q29ycmVjdFJlc3BvbnNlKHNob3c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlcyA9IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbHRlcihcbiAgICAgICh2YXJpOiBSZXNwb25zZVZhcmlhYmxlIHwgT3V0Y29tZVZhcmlhYmxlKSA9PiAnY29ycmVjdFJlc3BvbnNlJyBpbiB2YXJpICYmIHZhcmkuY29ycmVjdFJlc3BvbnNlXG4gICAgKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgY29uc3QgcmVzcG9uc2VzID0gcmVzcG9uc2VWYXJpYWJsZXMubWFwKGNyID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogY3IuaWRlbnRpZmllcixcbiAgICAgICAgcmVzcG9uc2U6IGNyLmNvcnJlY3RSZXNwb25zZVxuICAgICAgfTtcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgKTtcbiAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpbnRlcmFjdGlvbi5jb3JyZWN0UmVzcG9uc2UgPSBzaG93ID8gcmVzcG9uc2UucmVzcG9uc2UgOiAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJvY2Vzc1Jlc3BvbnNlKGNvdW50TnVtQXR0ZW1wdHM6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzcG9uc2VQcm9jZXNzb3IgPSB0aGlzLnF1ZXJ5U2VsZWN0b3I8UXRpUmVzcG9uc2VQcm9jZXNzaW5nPigncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnKTtcbiAgICBpZiAoIXJlc3BvbnNlUHJvY2Vzc29yKSB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oJ0NsaWVudCBzaWRlIHJlc3BvbnNlIHByb2Nlc3NpbmcgdGVtcGxhdGUgbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2VQcm9jZXNzb3IucHJvY2Vzcykge1xuICAgICAgLy8gY29uc29sZS5pbmZvKCdDbGllbnQgc2lkZSByZXNwb25zZSB3ZWJjb21wb25lbnRzIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXNwb25zZVByb2Nlc3Nvci5wcm9jZXNzKCk7XG5cbiAgICBpZiAodGhpcy5hZGFwdGl2ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgLy8gaWYgYWRhcHRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50TnVtQXR0ZW1wdHMpIHtcbiAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKFxuICAgICAgICAnbnVtQXR0ZW1wdHMnLFxuICAgICAgICAoK3RoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09ICdudW1BdHRlbXB0cycpPy52YWx1ZSArIDEpLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fZW1pdCgncXRpLXJlc3BvbnNlLXByb2Nlc3NlZCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHJlc2V0UmVzcG9uc2VzKCkge1xuICAgIHRoaXMuX2NvbnRleHQgPSB0aGlzLl9pbml0aWFsQ29udGV4dDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXNwb25zZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxSZXNwb25zZVZhcmlhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPdXRjb21lKGlkZW50aWZpZXI6IHN0cmluZyk6IFJlYWRvbmx5PE91dGNvbWVWYXJpYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpIGFzIE91dGNvbWVWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgfVxuXG4gIC8vIHNhdmluZyBwcml2YXRlcyBoZXJlOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIGhhbmRsZVVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoZXZlbnQ6IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KSB7XG4gICAgY29uc3QgeyByZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlIH0gPSBldmVudC5kZXRhaWw7XG4gICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4gKHYuaWRlbnRpZmllciAhPT0gaWRlbnRpZmllciA/IHYgOiB7IC4uLnYsIHZhbHVlOiB2YWx1ZSB9KSlcbiAgICB9O1xuXG4gICAgdGhpcy5fZW1pdDxJbnRlcmFjdGlvbkNoYW5nZWREZXRhaWxzPigncXRpLWludGVyYWN0aW9uLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZUlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmFkYXB0aXZlID09PSAnZmFsc2UnKSB7XG4gICAgICAvLyBpZiBhZGFwYXRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZU91dGNvbWVWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9IHRoaXMuZ2V0T3V0Y29tZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghb3V0Y29tZVZhcmlhYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbiBub3Qgc2V0IHF0aS1vdXRjb21lLWlkZW50aWZpZXI6ICR7aWRlbnRpZmllcn0sIGl0IGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4ge1xuICAgICAgICBpZiAodi5pZGVudGlmaWVyICE9PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi52LFxuICAgICAgICAgIHZhbHVlOiBvdXRjb21lVmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnID8gdmFsdWUgOiBbLi4udi52YWx1ZSwgdmFsdWUgYXMgc3RyaW5nXVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayhpZGVudGlmaWVyKSk7XG5cbiAgICB0aGlzLl9lbWl0PE91dGNvbWVDaGFuZ2VkRGV0YWlscz4oJ3F0aS1vdXRjb21lLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBvdXRjb21lSWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIHZhbHVlOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKT8udmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbXBsZXRpb25TdGF0dXMoKTogJ2NvbXBsZXRlZCcgfCAnaW5jb21wbGV0ZScgfCAnbm90X2F0dGVtcHRlZCcgfCAndW5rbm93bicge1xuICAgIGlmICh0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmV2ZXJ5KGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnY29tcGxldGVkJztcbiAgICBpZiAodGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5zb21lKGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnaW5jb21wbGV0ZSc7XG4gICAgcmV0dXJuICdub3RfYXR0ZW1wdGVkJztcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXQ8VD4obmFtZSwgZGV0YWlsID0gbnVsbCkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxUPihuYW1lLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzZXNzbWVudC1pdGVtJzogUXRpQXNzZXNzbWVudEl0ZW07XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXIgPSAocHJldj86IHVua25vd24sIG5leHQ/OiB1bmtub3duKSA9PiB2b2lkO1xuXG50eXBlIE5vblVuZGVmaW5lZDxBPiA9IEEgZXh0ZW5kcyB1bmRlZmluZWQgPyBuZXZlciA6IEE7XG5cbnR5cGUgVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0tPzogTm9uVW5kZWZpbmVkPFRbS10+IGV4dGVuZHMgVXBkYXRlSGFuZGxlciA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbmludGVyZmFjZSBXYXRjaE9wdGlvbnMge1xuICAvKipcbiAgICogSWYgdHJ1ZSwgd2lsbCBvbmx5IHN0YXJ0IHdhdGNoaW5nIGFmdGVyIHRoZSBpbml0aWFsIHVwZGF0ZS9yZW5kZXJcbiAgICovXG4gIHdhaXRVbnRpbEZpcnN0VXBkYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSdW5zIHdoZW4gb2JzZXJ2ZWQgcHJvcGVydGllcyBjaGFuZ2UsIGUuZy4gQHByb3BlcnR5IG9yIEBzdGF0ZSwgYnV0IGJlZm9yZSB0aGUgY29tcG9uZW50IHVwZGF0ZXMuIFRvIHdhaXQgZm9yIGFuXG4gKiB1cGRhdGUgdG8gY29tcGxldGUgYWZ0ZXIgYSBjaGFuZ2Ugb2NjdXJzLCB1c2UgYGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGVgIGluIHRoZSBoYW5kbGVyLiBUbyBzdGFydCB3YXRjaGluZyBhZnRlciB0aGVcbiAqIGluaXRpYWwgdXBkYXRlL3JlbmRlciwgdXNlIGB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH1gIG9yIGB0aGlzLmhhc1VwZGF0ZWRgIGluIHRoZSBoYW5kbGVyLlxuICpcbiAqIFVzYWdlOlxuICpcbiAqIEB3YXRjaCgncHJvcE5hbWUnKVxuICogaGFuZGxlUHJvcENoYW5nZShvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAqICAgLi4uXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXRjaChwcm9wZXJ0eU5hbWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRpb25zPzogV2F0Y2hPcHRpb25zKSB7XG4gIGNvbnN0IHJlc29sdmVkT3B0aW9uczogUmVxdWlyZWQ8V2F0Y2hPcHRpb25zPiA9IHtcbiAgICB3YWl0VW50aWxGaXJzdFVwZGF0ZTogZmFsc2UsXG4gICAgLi4ub3B0aW9uc1xuICB9O1xuICByZXR1cm4gPEVsZW1DbGFzcyBleHRlbmRzIExpdEVsZW1lbnQ+KHByb3RvOiBFbGVtQ2xhc3MsIGRlY29yYXRlZEZuTmFtZTogVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxFbGVtQ2xhc3M+KSA9PiB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHVwZGF0ZSBpcyBhIHByb3RlY3RlZCBwcm9wZXJ0eVxuICAgIGNvbnN0IHsgdXBkYXRlIH0gPSBwcm90bztcbiAgICBjb25zdCB3YXRjaGVkUHJvcGVydGllcyA9IEFycmF5LmlzQXJyYXkocHJvcGVydHlOYW1lKSA/IHByb3BlcnR5TmFtZSA6IFtwcm9wZXJ0eU5hbWVdO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHVwZGF0ZSBpcyBhIHByb3RlY3RlZCBwcm9wZXJ0eVxuICAgIHByb3RvLnVwZGF0ZSA9IGZ1bmN0aW9uICh0aGlzOiBFbGVtQ2xhc3MsIGNoYW5nZWRQcm9wczogTWFwPGtleW9mIEVsZW1DbGFzcywgRWxlbUNsYXNzW2tleW9mIEVsZW1DbGFzc10+KSB7XG4gICAgICB3YXRjaGVkUHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gcHJvcGVydHkgYXMga2V5b2YgRWxlbUNsYXNzO1xuICAgICAgICBpZiAoY2hhbmdlZFByb3BzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBjaGFuZ2VkUHJvcHMuZ2V0KGtleSk7XG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzW2tleV07XG5cbiAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXJlc29sdmVkT3B0aW9ucy53YWl0VW50aWxGaXJzdFVwZGF0ZSB8fCB0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgKHRoaXNbZGVjb3JhdGVkRm5OYW1lXSBhcyB1bmtub3duIGFzIFVwZGF0ZUhhbmRsZXIpKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdXBkYXRlLmNhbGwodGhpcywgY2hhbmdlZFByb3BzKTtcbiAgICB9O1xuICB9O1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUNvbnRleHQge1xuICBocmVmPzogc3RyaW5nO1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHZhcmlhYmxlczogUmVhZG9ubHlBcnJheTxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPj47XG59XG5cbmV4cG9ydCBjb25zdCBpdGVtQ29udGV4dFZhcmlhYmxlcyA9IFtcbiAge1xuICAgIGlkZW50aWZpZXI6ICdjb21wbGV0aW9uU3RhdHVzJyxcbiAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZScsXG4gICAgYmFzZVR5cGU6ICdzdHJpbmcnLFxuICAgIHZhbHVlOiAndW5rbm93bicsXG4gICAgdHlwZTogJ291dGNvbWUnXG4gIH0sXG4gIHtcbiAgICBpZGVudGlmaWVyOiAnbnVtQXR0ZW1wdHMnLFxuICAgIGNhcmRpbmFsaXR5OiAnc2luZ2xlJyxcbiAgICBiYXNlVHlwZTogJ2ludGVnZXInLFxuICAgIHZhbHVlOiAnMCcsXG4gICAgdHlwZTogJ3Jlc3BvbnNlJ1xuICB9XG5dIGFzIFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10+W107XG5cbmV4cG9ydCBjb25zdCBpdGVtQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8SXRlbUNvbnRleHQ+KFN5bWJvbCgnaXRlbScpKTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcXRpVHJhbnNmb3JtSXRlbSB9IGZyb20gJy4uLy4uL3F0aS10cmFuc2Zvcm1lcnMnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjdXN0b20gZWxlbWVudCBmb3IgcmVmZXJlbmNpbmcgYW4gYXNzZXNzbWVudCBzdGltdWx1cy5cbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZicpXG5leHBvcnQgY2xhc3MgUXRpQXNzZXNzbWVudFN0aW11bHVzUmVmIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgc3RpbXVsdXMuXG4gICAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllciA9ICcnO1xuXG4gIC8qKlxuICAgKiBUaGUgaHJlZiBvZiB0aGUgc3RpbXVsdXMuXG4gICAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaHJlZiA9ICcnO1xuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGNvbm5lY3RlZCB0byB0aGUgRE9NLlxuICAgKiBMb2FkcyBhbmQgYXBwZW5kcyB0aGUgc3RpbXVsdXMgaWYgdGhlICdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYtY29ubmVjdGVkJyBldmVudCBpcyBub3QgcHJldmVudGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLWNvbm5lY3RlZCcsIHsgY2FuY2VsYWJsZTogdHJ1ZSwgYnViYmxlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBpc1ByZXZlbnRlZCA9IHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICBpZiAoaXNQcmV2ZW50ZWQpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKTtcblxuICAgICAgY29uc3Qgc3RpbXVsdXNSZWYgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXN0aW11bHVzLWlkcmVmPSR7dGhpcy5pZGVudGlmaWVyfV1gKTtcbiAgICAgIGlmIChzdGltdWx1c1JlZikge1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN0aW11bHVzUmVmKHN0aW11bHVzUmVmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3RpbXVsdXMgd2l0aCBkYXRhLXN0aW11bHVzLWlkcmVmICR7dGhpcy5pZGVudGlmaWVyfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYW5kIGFwcGVuZHMgdGhlIHN0aW11bHVzIHRvIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICogQHBhcmFtIHN0aW11bHVzUmVmIC0gVGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIHN0aW11bHVzIHdpbGwgYmUgYXBwZW5kZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBkYXRlU3RpbXVsdXNSZWYoc3RpbXVsdXNSZWY6IEVsZW1lbnQpIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5ocmVmLnN1YnN0cmluZygwLCB0aGlzLmhyZWYubGFzdEluZGV4T2YoJy8nKSk7XG4gICAgY29uc3Qgc3RpbXVsdXMgPSBhd2FpdCBxdGlUcmFuc2Zvcm1JdGVtKClcbiAgICAgIC5sb2FkKHRoaXMuaHJlZilcbiAgICAgIC50aGVuKGFwaSA9PiBhcGkucGF0aChwYXRoKS5odG1sRG9jKCkpO1xuICAgIGlmIChzdGltdWx1cykgeyAgICAgIFxuICAgICAgY29uc3QgZWxlbWVudHMgPSBzdGltdWx1cy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc3RpbXVsdXMtYm9keSwgcXRpLXN0eWxlc2hlZXQnKTtcbiAgICAgIHN0aW11bHVzUmVmLmlubmVySFRNTCA9ICcnO1xuICAgICAgc3RpbXVsdXNSZWYuYXBwZW5kKC4uLmVsZW1lbnRzKTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmJzogUXRpQXNzZXNzbWVudFN0aW11bHVzUmVmO1xuICB9XG59XG4iLCAiY29uc3QgeG1sID0gU3RyaW5nLnJhdztcblxuLyogICA8IS0tIGNvbnZlcnQgQ0RBVEEgdG8gY29tbWVudHMgLS0+XG4gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCJ0ZXh0KClbY29udGFpbnMoLiwgJ0NEQVRBJyldXCI+XG4gIDx4c2w6Y29tbWVudD5cbiAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD1cIi5cIi8+XG4gIDwveHNsOmNvbW1lbnQ+XG48L3hzbDp0ZW1wbGF0ZT5cbiovXG5cbi8qXG4gIDwhLS0gcmVtb3ZlIHhtbCBjb21tZW50cyAtLT5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cImNvbW1lbnQoKVwiIC8+XG4gICovXG5cbmNvbnN0IHhtbFRvSFRNTCA9IHhtbGA8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj1cIjEuMFwiIHhtbG5zOnhzbD1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybVwiPlxuPHhzbDpvdXRwdXQgbWV0aG9kPVwiaHRtbFwiIHZlcnNpb249XCI1LjBcIiBlbmNvZGluZz1cIlVURi04XCIgaW5kZW50PVwieWVzXCIgLz5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cIkAqfG5vZGUoKVwiPlxuICAgIDx4c2w6Y29weT5cbiAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD1cIkAqfG5vZGUoKVwiLz5cbiAgICA8L3hzbDpjb3B5PlxuICA8L3hzbDp0ZW1wbGF0ZT5cblxuICA8IS0tIHJlbW92ZSBleGlzdGluZyBuYW1lc3BhY2VzIC0tPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwiKlwiPlxuICAgIDwhLS0gcmVtb3ZlIGVsZW1lbnQgcHJlZml4IC0tPlxuICAgIDx4c2w6ZWxlbWVudCBuYW1lPVwie2xvY2FsLW5hbWUoKX1cIj5cbiAgICAgIDwhLS0gcHJvY2VzcyBhdHRyaWJ1dGVzIC0tPlxuICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9XCJAKlwiPlxuICAgICAgICA8IS0tIHJlbW92ZSBhdHRyaWJ1dGUgcHJlZml4IC0tPlxuICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPVwie2xvY2FsLW5hbWUoKX1cIj5cbiAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD1cIi5cIi8+XG4gICAgICAgIDwveHNsOmF0dHJpYnV0ZT5cbiAgICAgIDwveHNsOmZvci1lYWNoPlxuICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz5cbiAgPC94c2w6ZWxlbWVudD5cbjwveHNsOnRlbXBsYXRlPlxuPC94c2w6c3R5bGVzaGVldD5gO1xuXG4vLyBGdW5jdGlvbiB0byBleHRlbmQgZWxlbWVudHMgd2l0aCBhIHNwZWNpZmljIHRhZyBuYW1lIGJ5IGFkZGluZyBhbiBleHRlbnNpb24gc3VmZml4XG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kRWxlbWVudE5hbWUoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50LCB0YWdOYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKSB7XG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGFnTmFtZSkuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCBuZXdUYWdOYW1lID0gYCR7dGFnTmFtZX0tJHtleHRlbnNpb259YDtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudFdpdGhOZXdUYWdOYW1lKGVsZW1lbnQsIG5ld1RhZ05hbWUpO1xuICAgIGVsZW1lbnQucmVwbGFjZVdpdGgobmV3RWxlbWVudCk7XG4gIH0pO1xufVxuXG4vLyBGdW5jdGlvbiB0byBleHRlbmQgYW55IGVsZW1lbnQgd2l0aCBhIHNwZWNpZmljIGNsYXNzIHBhdHRlcm4gKGUuZy4sIFwiZXh0ZW5kOnN1ZmZpeFwiKVxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzKHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudCwgY2xhc3NOYW1lUGF0dGVybjogc3RyaW5nKSB7XG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0O1xuICAgIGlmIChjbGFzc0xpc3QpIHtcbiAgICAgIGNsYXNzTGlzdC5mb3JFYWNoKGNsYXNzTmFtZSA9PiB7XG4gICAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aChgJHtjbGFzc05hbWVQYXR0ZXJufTpgKSkge1xuICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IGNsYXNzTmFtZS5zbGljZShgJHtjbGFzc05hbWVQYXR0ZXJufTpgLmxlbmd0aCk7XG4gICAgICAgICAgY29uc3QgbmV3VGFnTmFtZSA9IGAke2VsZW1lbnQubm9kZU5hbWV9LSR7c3VmZml4fWA7XG4gICAgICAgICAgY29uc3QgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnRXaXRoTmV3VGFnTmFtZShlbGVtZW50LCBuZXdUYWdOYW1lKTtcbiAgICAgICAgICBlbGVtZW50LnJlcGxhY2VXaXRoKG5ld0VsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGVsZW1lbnQgd2l0aCBhIG5ldyB0YWcgbmFtZSBhbmQgY29weSBhdHRyaWJ1dGVzIGFuZCBjaGlsZHJlblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudFdpdGhOZXdUYWdOYW1lKGVsZW1lbnQsIG5ld1RhZ05hbWUpIHtcbiAgY29uc3QgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmV3VGFnTmFtZSk7XG4gIC8vIENvcHkgYXR0cmlidXRlc1xuICBmb3IgKGNvbnN0IGF0dHIgb2YgZWxlbWVudC5hdHRyaWJ1dGVzKSB7XG4gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgfVxuICAvLyBDb3B5IGNoaWxkIG5vZGVzXG4gIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gIH1cbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpdGVtc0Zyb21UZXN0KHhtbEZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KSB7XG4gIGNvbnN0IGl0ZW1zOiB7IGlkZW50aWZpZXI6IHN0cmluZzsgaHJlZjogc3RyaW5nOyBjYXRlZ29yeTogc3RyaW5nIH1bXSA9IFtdO1xuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdxdGktYXNzZXNzbWVudC1pdGVtLXJlZicpLmZvckVhY2goZWwgPT4ge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCBocmVmID0gZWwuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSBlbC5nZXRBdHRyaWJ1dGUoJ2NhdGVnb3J5Jyk7XG4gICAgaXRlbXMucHVzaCh7IGlkZW50aWZpZXIsIGhyZWYsIGNhdGVnb3J5IH0pO1xuICB9KTtcbiAgcmV0dXJuIGl0ZW1zO1xufVxuXG5sZXQgY3VycmVudFJlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0IHwgbnVsbCA9IG51bGw7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkWE1MKHVybCwgY2FuY2VsUHJldmlvdXNSZXF1ZXN0ID0gZmFsc2UpIHtcbiAgaWYgKGNhbmNlbFByZXZpb3VzUmVxdWVzdCAmJiBjdXJyZW50UmVxdWVzdCAhPT0gbnVsbCkge1xuICAgIGN1cnJlbnRSZXF1ZXN0LmFib3J0KCk7IC8vIEFib3J0IHRoZSBvbmdvaW5nIHJlcXVlc3QgaWYgdGhlcmUgaXMgb25lXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2U8WE1MRG9jdW1lbnQgfCBudWxsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgY3VycmVudFJlcXVlc3QgPSB4aHI7IC8vIFN0b3JlIHRoZSBjdXJyZW50IHJlcXVlc3RcblxuICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuICAgIHhoci5yZXNwb25zZVR5cGUgPSAnZG9jdW1lbnQnO1xuXG4gICAgeGhyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgIHJlc29sdmUoeGhyLnJlc3BvbnNlWE1MKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHhoci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICB9O1xuXG4gICAgeGhyLnNlbmQoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVhNTCh4bWxEb2N1bWVudDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgY29uc3QgeG1sRnJhZ21lbnQgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHhtbERvY3VtZW50LCAndGV4dC94bWwnKTtcbiAgcmV0dXJuIHhtbEZyYWdtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9IVE1MKHhtbEZyYWdtZW50OiBEb2N1bWVudCk6IERvY3VtZW50RnJhZ21lbnQge1xuICBjb25zdCBwcm9jZXNzb3IgPSBuZXcgWFNMVFByb2Nlc3NvcigpO1xuICBjb25zdCB4c2x0RG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHhtbFRvSFRNTCwgJ3RleHQveG1sJyk7XG4gIHByb2Nlc3Nvci5pbXBvcnRTdHlsZXNoZWV0KHhzbHREb2N1bWVudCk7XG4gIGNvbnN0IGl0ZW1IVE1MRnJhZ21lbnQgPSBwcm9jZXNzb3IudHJhbnNmb3JtVG9GcmFnbWVudCh4bWxGcmFnbWVudCwgZG9jdW1lbnQpO1xuICByZXR1cm4gaXRlbUhUTUxGcmFnbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldExvY2F0aW9uKHhtbEZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50LCBsb2NhdGlvbjogc3RyaW5nKSB7XG4gIGlmICghbG9jYXRpb24uZW5kc1dpdGgoJy8nKSkge1xuICAgIGxvY2F0aW9uICs9ICcvJztcbiAgfVxuXG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tzcmNdLFtocmVmXSxbcHJpbWFyeS1wYXRoXScpLmZvckVhY2goZWxXaXRoU3JjID0+IHtcbiAgICBsZXQgYXR0cjogJ3NyYycgfCAnaHJlZicgfCAncHJpbWFyeS1wYXRoJyB8ICcnID0gJyc7XG5cbiAgICBpZiAoZWxXaXRoU3JjLmdldEF0dHJpYnV0ZSgnc3JjJykpIHtcbiAgICAgIGF0dHIgPSAnc3JjJztcbiAgICB9XG4gICAgaWYgKGVsV2l0aFNyYy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkge1xuICAgICAgYXR0ciA9ICdocmVmJztcbiAgICB9XG4gICAgaWYgKGVsV2l0aFNyYy5nZXRBdHRyaWJ1dGUoJ3ByaW1hcnktcGF0aCcpKSB7XG4gICAgICBhdHRyID0gJ3ByaW1hcnktcGF0aCc7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGVsV2l0aFNyYy5nZXRBdHRyaWJ1dGUoYXR0cik/LnRyaW0oKTtcblxuICAgIGlmICghYXR0clZhbHVlLnN0YXJ0c1dpdGgoJ2RhdGE6JykgJiYgIWF0dHJWYWx1ZS5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgIGNvbnN0IG5ld1NyY1ZhbHVlID0gbG9jYXRpb24gKyBlbmNvZGVVUkkoYXR0clZhbHVlKTtcbiAgICAgIGVsV2l0aFNyYy5zZXRBdHRyaWJ1dGUoYXR0ciwgbmV3U3JjVmFsdWUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQoeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpIHtcbiAgY29uc3QgY2RhdGFFbGVtZW50cyA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1jdXN0b20tb3BlcmF0b3JbY2xhc3M9XCJqcy5vcmdcIl0gPiBxdGktYmFzZS12YWx1ZScpO1xuICBjZGF0YUVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgY29uc3QgY29tbWVudFRleHQgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KGVsZW1lbnQudGV4dENvbnRlbnQpO1xuICAgIGVsZW1lbnQucmVwbGFjZUNoaWxkKGNvbW1lbnRUZXh0LCBlbGVtZW50LmZpcnN0Q2hpbGQpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwU3R5bGVTaGVldHMoeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpIHtcbiAgLy8gcmVtb3ZlIHF0aS1zdHlsZXNoZWV0IHRhZ1xuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc3R5bGVzaGVldCcpLmZvckVhY2goc3R5bGVzaGVldCA9PiBzdHlsZXNoZWV0LnJlbW92ZSgpKTtcbn1cbiIsICIvKipcbiAqIEJyb3dzZXIgYmFzZWQgUVRJLVhNTCB0byBIVE1MIHRyYW5zZm9ybWVyLlxuICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIGxvYWQsIHBhcnNlLCB0cmFuc2Zvcm0gYW5kIHNlcmlhbGl6ZSBRVEkgWE1MIGl0ZW1zLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBsb2FkLCBwYXJzZSwgdHJhbnNmb3JtIGFuZCBzZXJpYWxpemUgUVRJIFhNTCBpdGVtcy5cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBxdGlUcmFuc2Zvcm1lciA9IHF0aVRyYW5zZm9ybUl0ZW0oKTtcbiAqIGF3YWl0IHF0aVRyYW5zZm9ybWVyLmxvYWQoJ3BhdGgvdG8veG1sL2ZpbGUueG1sJyk7XG4gKiBxdGlUcmFuc2Zvcm1lci5wYXRoKCcvYXNzZXNzbWVudEl0ZW0vaXRlbUJvZHknKTtcbiAqIGNvbnN0IGh0bWwgPSBxdGlUcmFuc2Zvcm1lci5odG1sKCk7XG4gKiBjb25zdCB4bWwgPSBxdGlUcmFuc2Zvcm1lci54bWwoKTtcbiAqIGNvbnN0IGh0bWxkb2MgPSBxdGlUcmFuc2Zvcm1lci5odG1sZG9jKCk7XG4gKiBjb25zdCB4bWxkb2MgPSBxdGlUcmFuc2Zvcm1lci54bWxkb2MoKTtcbiAqXG4gKiBxdGlUcmFuc2Zvcm1JdGVtKCkucGFyc2Uoc3RvcnlYTUwpLmh0bWwoKVxuICovXG5cbmltcG9ydCB7XG4gIGNvbnZlcnRDREFUQXRvQ29tbWVudCxcbiAgZXh0ZW5kRWxlbWVudE5hbWUsXG4gIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzLFxuICBsb2FkWE1MLFxuICBwYXJzZVhNTCxcbiAgc2V0TG9jYXRpb24sXG4gIHN0cmlwU3R5bGVTaGVldHMsXG4gIHRvSFRNTFxufSBmcm9tICcuL3F0aS10cmFuc2Zvcm1lcnMnO1xuXG5leHBvcnQgdHlwZSB0cmFuc2Zvcm1JdGVtQXBpID0ge1xuICBsb2FkOiAodXJpOiBzdHJpbmcsIGNhbmNlbFByZXZpb3VzUmVxdWVzdD86IGJvb2xlYW4pID0+IFByb21pc2U8dHJhbnNmb3JtSXRlbUFwaT47XG4gIHBhcnNlOiAoeG1sU3RyaW5nOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIHBhdGg6IChsb2NhdGlvbjogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBmbjogKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBwY2lIb29rczogKHVyaTogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBleHRlbmRFbGVtZW50TmFtZTogKGVsZW1lbnROYW1lOiBzdHJpbmcsIGV4dGVuZDogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBleHRlbmRFbGVtZW50c1dpdGhDbGFzczogKHBhcmFtPzogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBjdXN0b21JbnRlcmFjdGlvbjogKGJhc2VSZWY6IHN0cmluZywgYmFzZUl0ZW06IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgY29udmVydENEQVRBdG9Db21tZW50OiAoKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBzdHJpcFN0eWxlU2hlZXRzOiAoKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBodG1sOiAoKSA9PiBzdHJpbmc7XG4gIHhtbDogKCkgPT4gc3RyaW5nO1xuICBodG1sRG9jOiAoKSA9PiBEb2N1bWVudEZyYWdtZW50O1xuICB4bWxEb2M6ICgpID0+IFhNTERvY3VtZW50O1xufTtcblxuZXhwb3J0IGNvbnN0IHF0aVRyYW5zZm9ybUl0ZW0gPSAoKSA9PiB7XG4gIGxldCB4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQ7XG5cbiAgY29uc3QgYXBpOiB0cmFuc2Zvcm1JdGVtQXBpID0ge1xuICAgIGFzeW5jIGxvYWQodXJpOiBzdHJpbmcsIGNhbmNlbFByZXZpb3VzUmVxdWVzdCA9IGZhbHNlKTogUHJvbWlzZTx0eXBlb2YgYXBpPiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8dHlwZW9mIGFwaT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsb2FkWE1MKHVyaSwgY2FuY2VsUHJldmlvdXNSZXF1ZXN0KS50aGVuKHhtbCA9PiB7XG4gICAgICAgICAgeG1sRnJhZ21lbnQgPSB4bWw7XG4gICAgICAgICAgLy8gc2V0IHRoZSBiYXNlIHBhdGggZm9yIGltYWdlcyBhbmQgb3RoZXIgcmVzb3VyY2VzLFxuICAgICAgICAgIC8vIHlvdSBwcm9iYWJseSB3YW50IHRvIHNldCB0aGUgYmFzZSBwYXRoIHRvIHRoZSBkb2N1bWVudCByb290IGVsc2UgeW91IGNhbiB1c2UgdGhlIHBhdGggbWV0aG9kIHRvIHNldCBpdFxuICAgICAgICAgIGFwaS5wYXRoKHVyaS5zdWJzdHJpbmcoMCwgdXJpLmxhc3RJbmRleE9mKCcvJykpKTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShhcGkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcGFyc2UoeG1sU3RyaW5nOiBzdHJpbmcpOiB0eXBlb2YgYXBpIHtcbiAgICAgIHhtbEZyYWdtZW50ID0gcGFyc2VYTUwoeG1sU3RyaW5nKTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBwYXRoOiAobG9jYXRpb246IHN0cmluZyk6IHR5cGVvZiBhcGkgPT4ge1xuICAgICAgc2V0TG9jYXRpb24oeG1sRnJhZ21lbnQsIGxvY2F0aW9uKTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBmbihmbjogKHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudCkgPT4gdm9pZCk6IHR5cGVvZiBhcGkge1xuICAgICAgZm4oeG1sRnJhZ21lbnQpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIHBjaUhvb2tzKHVyaTogc3RyaW5nKTogdHlwZW9mIGFwaSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gWydob29rJywgJ21vZHVsZSddO1xuICAgICAgY29uc3QgZG9jdW1lbnRQYXRoID0gdXJpLnN1YnN0cmluZygwLCB1cmkubGFzdEluZGV4T2YoJy8nKSk7XG4gICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGNvbnN0IHNyY0F0dHJpYnV0ZXMgPSB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbJyArIGF0dHJpYnV0ZSArICddJyk7XG4gICAgICAgIHNyY0F0dHJpYnV0ZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICBjb25zdCBzcmNWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkhO1xuICAgICAgICAgIGlmICghc3JjVmFsdWUuc3RhcnRzV2l0aCgnZGF0YTonKSAmJiAhc3JjVmFsdWUuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICAgICAgICAvLyBKdXN0IHBhc3RlIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBzcmMgbG9jYXRpb24gYWZ0ZXIgdGhlIGRvY3VtZW50cm9vdFBhdGhcbiAgICAgICAgICAgIC8vIG9sZCBwY2lzIGNhbiBoYXZlIGEgLmpzLCBuZXcgcGNpJ3MgZG9uJ3RcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdiYXNlLXVybCcsIHVyaSk7XG4gICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgJ21vZHVsZScsXG4gICAgICAgICAgICAgIGRvY3VtZW50UGF0aCArICcvJyArIGVuY29kZVVSSShzcmNWYWx1ZSArIChzcmNWYWx1ZS5lbmRzV2l0aCgnLmpzJykgPyAnJyA6ICcuanMnKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBleHRlbmRFbGVtZW50TmFtZTogKHRhZ05hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiB0eXBlb2YgYXBpID0+IHtcbiAgICAgIGV4dGVuZEVsZW1lbnROYW1lKHhtbEZyYWdtZW50LCB0YWdOYW1lLCBleHRlbnNpb24pO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzOiAocGFyYW06IHN0cmluZyA9ICdleHRlbmQnKTogdHlwZW9mIGFwaSA9PiB7XG4gICAgICBleHRlbmRFbGVtZW50c1dpdGhDbGFzcyh4bWxGcmFnbWVudCwgcGFyYW0pO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGN1c3RvbUludGVyYWN0aW9uKGJhc2VSZWY6IHN0cmluZywgYmFzZUl0ZW06IHN0cmluZyk6IHR5cGVvZiBhcGkge1xuICAgICAgY29uc3QgcXRpQ3VzdG9tSW50ZXJhY3Rpb24gPSB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yKCdxdGktY3VzdG9tLWludGVyYWN0aW9uJyk7XG4gICAgICBjb25zdCBxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdCA9IHF0aUN1c3RvbUludGVyYWN0aW9uLnF1ZXJ5U2VsZWN0b3IoJ29iamVjdCcpO1xuXG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYmFzZS1yZWYnLCBiYXNlUmVmKTtcbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLWl0ZW0nLCBiYXNlUmVmICsgYmFzZUl0ZW0pO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCdkYXRhJywgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QuZ2V0QXR0cmlidXRlKCdkYXRhJykpO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCd3aWR0aCcsIHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0LmdldEF0dHJpYnV0ZSgnd2lkdGgnKSk7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0LmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpO1xuXG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5yZW1vdmVDaGlsZChxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgY29udmVydENEQVRBdG9Db21tZW50KCk6IHR5cGVvZiBhcGkge1xuICAgICAgY29udmVydENEQVRBdG9Db21tZW50KHhtbEZyYWdtZW50KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBzdHJpcFN0eWxlU2hlZXRzKCk6IHR5cGVvZiBhcGkge1xuICAgICAgc3RyaXBTdHlsZVNoZWV0cyh4bWxGcmFnbWVudCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgaHRtbCgpIHtcbiAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHRvSFRNTCh4bWxGcmFnbWVudCkpO1xuICAgIH0sXG4gICAgeG1sKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh4bWxGcmFnbWVudCk7XG4gICAgfSxcbiAgICBodG1sRG9jKCkge1xuICAgICAgcmV0dXJuIHRvSFRNTCh4bWxGcmFnbWVudCk7XG4gICAgfSxcbiAgICB4bWxEb2MoKTogWE1MRG9jdW1lbnQge1xuICAgICAgcmV0dXJuIHhtbEZyYWdtZW50OyAvLyBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHhtbEZyYWdtZW50KTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBhcGk7XG59O1xuIiwgImltcG9ydCB7IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXIsIExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgaW50ZXJmYWNlIENob2ljZUludGVyZmFjZSB7XG4gIGlkZW50aWZpZXI6IHN0cmluZztcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRlciB0byBoYW5kbGUgYm9vbGVhbiBhdHRyaWJ1dGVzIGZvciBBUklBIHByb3BlcnRpZXMsXG4gKiBlbnN1cmluZyB0aGV5IGFyZSBzZXQgYXMgJ3RydWUnIG9yICdmYWxzZScgc3RyaW5ncy5cbiAqL1xuY29uc3QgYXJpYUJvb2xlYW5Db252ZXJ0ZXI6IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXI8Ym9vbGVhbiwgYm9vbGVhbj4gPSB7XG4gIHRvQXR0cmlidXRlOiAodmFsdWU6IGJvb2xlYW4pID0+ICh2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZScpLFxuICBmcm9tQXR0cmlidXRlOiAodmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHZhbHVlID09PSAndHJ1ZSdcbn07XG5cbi8qKlxuICogQSBtaXhpbiB0aGF0IGFkZHMgY2hvaWNlIGZ1bmN0aW9uYWxpdHkgdG8gYSBMaXRFbGVtZW50LWJhc2VkIGNsYXNzLlxuICogSXQgZGlzcGF0Y2hlcyBldmVudHMgd2l0aCBhIGN1c3RvbSBgdHlwZWAgYW5kIGhhbmRsZXMgc2VsZWN0aW9uIGxvZ2ljLlxuICpcbiAqIEBwYXJhbSBCYXNlIC0gVGhlIGJhc2UgY2xhc3MgdG8gZXh0ZW5kLlxuICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgY2hvaWNlLCB1c2VkIGluIGV2ZW50IG5hbWVzLlxuICogQHJldHVybnMgQSBuZXcgY2xhc3MgZXh0ZW5kaW5nIHRoZSBiYXNlIGNsYXNzIHdpdGggY2hvaWNlIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZlRWxlbWVudE1peGluSW50ZXJmYWNlIHtcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICB0YWJJbmRleDogbnVtYmVyO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHk6IGJvb2xlYW47XG4gIGludGVybmFsczogRWxlbWVudEludGVybmFscztcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gQWN0aXZlRWxlbWVudE1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oQmFzZTogVCwgdHlwZTogc3RyaW5nKSB7XG4gIGFic3RyYWN0IGNsYXNzIFF0aUNob2ljZSBleHRlbmRzIEJhc2Uge1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyBpZGVudGlmaWVyID0gJyc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogJ3RhYmluZGV4JyB9KVxuICAgIHB1YmxpYyB0YWJJbmRleCA9IDA7XG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIHJlZmxlY3Q6IHRydWUsXG4gICAgICBhdHRyaWJ1dGU6ICdhcmlhLWRpc2FibGVkJyxcbiAgICAgIGNvbnZlcnRlcjogYXJpYUJvb2xlYW5Db252ZXJ0ZXJcbiAgICB9KVxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICByZWZsZWN0OiB0cnVlLFxuICAgICAgYXR0cmlidXRlOiAnYXJpYS1yZWFkb25seScsXG4gICAgICBjb252ZXJ0ZXI6IGFyaWFCb29sZWFuQ29udmVydGVyXG4gICAgfSlcbiAgICBwdWJsaWMgcmVhZG9ubHkgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBpbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHM7XG5cbiAgICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIGhhbmRsZURpc2FibGVkQ2hhbmdlKF9vbGRWYWx1ZTogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMudGFiSW5kZXggPSBkaXNhYmxlZCA/IC0xIDogMDtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmJsdXIoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgc3VwZXIoLi4uYXJncyk7XG4gICAgICB0aGlzLmludGVybmFscyA9IHRoaXMuYXR0YWNoSW50ZXJuYWxzKCk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fb25LZXlVcCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljayk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGByZWdpc3Rlci0ke3R5cGV9YCwge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX29uS2V5VXApO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2spO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHVucmVnaXN0ZXItJHt0eXBlfWAsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX29uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5hbHRLZXkpIHJldHVybjtcblxuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdTcGFjZScpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9vbkNsaWNrKCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgdGhpcy5fYWN0aXZhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hY3RpdmF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmcgfT4oYGFjdGl2YXRlLSR7dHlwZX1gLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHsgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gICAgfVxuICB9XG4gIHJldHVybiBRdGlDaG9pY2UgYXMgQ29uc3RydWN0b3I8QWN0aXZlRWxlbWVudE1peGluSW50ZXJmYWNlPiAmIFQ7XG59XG4iLCAiaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1pdGVtLWJvZHkuc3R5bGVzJztcbmltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAgfSBmcm9tICdsaXQnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktaXRlbS1ib2R5IG5vZGUgY29udGFpbnMgdGhlIHRleHQsIGdyYXBoaWNzLCBtZWRpYSBvYmplY3RzIGFuZCBpbnRlcmFjdGlvbnMgdGhhdCBkZXNjcmliZSB0aGUgaXRlbSdzIGNvbnRlbnQgYW5kIGluZm9ybWF0aW9uIGFib3V0IGhvdyBpdCBpcyBzdHJ1Y3R1cmVkLlxuICogQGRvY3VtZW50YXRpb24gaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5zcGhwbzZsdTZ6cWlcbiAqIEBzdGF0dXMgc3RhYmxlXG4gKiBAc2luY2UgNC4wXG4gKlxuICogQHNsb3QgLSBpdGVtIGJvZHkgY29udGVudC5cbiAqIEBzbG90IHF0aS1ydWJyaWMtYmxvY2sgLSB0aGUgcXRpIHJ1YnJpYyBibG9jayBpcyBwbGFjZWQgYWJvdmUgdGhlIGl0ZW1cbiAqXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktaXRlbS1ib2R5JylcbmV4cG9ydCBjbGFzcyBRdGlJdGVtQm9keSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInF0aS1ydWJyaWMtYmxvY2tcIj48L3Nsb3Q+PHNsb3Q+PC9zbG90PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWl0ZW0tYm9keSc6IFF0aUl0ZW1Cb2R5O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wcm9tcHQnKVxuZXhwb3J0IGNsYXNzIFF0aVByb21wdCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAvLyBpZiBwcm9tcHRzIGFyZSBpbiBpbnRlcmFjdGlvbnMgdGhleSBzaG91bGQgaGF2ZSBhIHNsb3QsIHNvIHRoZSBwcm9tcHQgaGFzIHRvIGdvIHRoZXJlXG4gICAgLy8gaWYgcHJvbXB0IGlzIGluIHRoZSBib2R5LCB0aGVuIGp1c3QgZGlzcGxheSB0aGUgcHJvbXB0IHRoZXJlLlxuICAgIC8vIEEgYmV0dGVyIGNoZWNrIHdvdWxkIGJlIHRoZSBsYXR0ZXIsIGJ1dCBub3QgY2FuJ3QgZ2V0IHRocm91Z2ggdGhlIHNoYWRvd3Jvb3QgdG8gZmluZCB0aGUgc2xvdFxuICAgIGNvbnN0IGluSW50ZXJhY3Rpb24gPSB0aGlzLnBhcmVudEVsZW1lbnQudGFnTmFtZS5lbmRzV2l0aCgnSU5URVJBQ1RJT04nKTtcbiAgICBpZiAoaW5JbnRlcmFjdGlvbikge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncHJvbXB0Jyk7XG4gICAgfVxuICAgIC8vIGNvbnN0IHByb21wdFNsb3QgPSB0aGlzLnBhcmVudEVsZW1lbnQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFwiW25hbWU9J3Byb21wdCddXCIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1wcm9tcHQnOiBRdGlQcm9tcHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlTWFwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktc3R5bGVzaGVldCcpXG5leHBvcnQgY2xhc3MgUXRpU3R5bGVzaGVldCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBwcml2YXRlIHN0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlTWFwPGFueT4gfCBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBjb25zdCBsaW5rID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcblxuICAgIGlmIChsaW5rICE9PSBudWxsKSB7XG4gICAgICAvLyBGZXRjaCB0aGUgc3R5bGVzaGVldCBjb250ZW50XG4gICAgICBmZXRjaChsaW5rKVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpXG4gICAgICAgIC50aGVuKGNzc0NvbnRlbnQgPT4ge1xuICAgICAgICAgIC8vIE1pbmlmeSB0aGUgQ1NTIGNvbnRlbnQgYnkgcmVtb3Zpbmcgd2hpdGVzcGFjZSBhbmQgY29tbWVudHNcbiAgICAgICAgICBjb25zdCBtaW5pZmllZENzcyA9IHRoaXMubWluaWZ5Q3NzKGNzc0NvbnRlbnQpO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgPHN0eWxlPiBlbGVtZW50IHdpdGggQHNjb3BlIHN1cnJvdW5kaW5nIHRoZSBtaW5pZmllZCBDU1NcbiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IGBAc2NvcGUgeyR7bWluaWZpZWRDc3N9fWA7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSBzdHlsZSBlbGVtZW50IHRvIHRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGlzIGNvbXBvbmVudFxuICAgICAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN0eWxlRWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gcGFyZW50IGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBzY29wZWQgc3R5bGVzaGVldCB0by4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgc3R5bGVzaGVldDonLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRleHRDb250ZW50ICE9PSBudWxsICYmIHRoaXMudGV4dENvbnRlbnQudHJpbSgpICE9PSAnJykge1xuICAgICAgLy8gTWluaWZ5IHRoZSBpbmxpbmUgQ1NTIGNvbnRlbnRcbiAgICAgIGNvbnN0IG1pbmlmaWVkQ3NzID0gdGhpcy5taW5pZnlDc3ModGhpcy50ZXh0Q29udGVudCk7XG5cbiAgICAgIC8vIERpcmVjdGx5IGNyZWF0ZSBhIDxzdHlsZT4gZWxlbWVudCB3aXRoIHRoZSBAc2NvcGUgc3Vycm91bmRpbmcgdGhlIG1pbmlmaWVkIGlubGluZSBzdHlsZXNcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50Lm1lZGlhID0gJ3NjcmVlbic7XG4gICAgICB0aGlzLnN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IGBAc2NvcGUgeyR7bWluaWZpZWRDc3N9fWA7XG5cbiAgICAgIC8vIEFwcGVuZCB0aGUgc3R5bGUgZWxlbWVudCB0byB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhpcyBjb21wb25lbnRcbiAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc3R5bGVFbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTm8gcGFyZW50IGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBzY29wZWQgc3R5bGVzaGVldCB0by4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1pbmlmeUNzcyhjc3NDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFJlbW92ZSBjb21tZW50cywgd2hpdGVzcGFjZSwgYW5kIG5ld2xpbmUgY2hhcmFjdGVyc1xuICAgIHJldHVybiBjc3NDb250ZW50XG4gICAgICAucmVwbGFjZSgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAnJykgLy8gUmVtb3ZlIGNvbW1lbnRzXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpIC8vIENvbGxhcHNlIHdoaXRlc3BhY2VcbiAgICAgIC5yZXBsYWNlKC9cXHMqKFt7fTo7XSlcXHMqL2csICckMScpIC8vIFJlbW92ZSBzcGFjZXMgYXJvdW5kIHt9LCA6LCA7XG4gICAgICAudHJpbSgpOyAvLyBUcmltIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKHRoaXMuc3R5bGVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCByZW1vdmUgc3R5bGVzaGVldDonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXN0eWxlc2hlZXQnOiBRdGlTdHlsZXNoZWV0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQmFzZVR5cGUsIENhcmRpbmFsaXR5IH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgT3V0Y29tZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCB7IFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW91dGNvbWUtZGVjbGFyYXRpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU91dGNvbWVEZWNsYXJhdGlvbiBleHRlbmRzIFF0aVZhcmlhYmxlRGVjbGFyYXRpb24ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Jhc2UtdHlwZScgfSkgYmFzZVR5cGU6IEJhc2VUeXBlO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2V4dGVybmFsLXNjb3JlZCcgfSkgZXh0ZXJuYWxTY29yZWQ6ICdodW1hbicgfCAnZXh0ZXJuYWxNYWNoaW5lJyB8IG51bGwgPSBudWxsO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgY2FyZGluYWxpdHk6IENhcmRpbmFsaXR5O1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBnZXQgaW50ZXJwb2xhdGlvblRhYmxlKCk6IE1hcDxudW1iZXIsIG51bWJlcj4gfCBudWxsIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVycG9sYXRpb24tdGFibGUnKTtcbiAgICBpZiAodGFibGUpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpKSB7XG4gICAgICAgIGlmICghZW50cnkuZ2V0QXR0cmlidXRlKCdzb3VyY2UtdmFsdWUnKSAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoJ3RhcmdldC12YWx1ZScpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignc291cmNlLXZhbHVlIG9yIHRhcmdldC12YWx1ZSBpcyBtaXNzaW5nIGluIHF0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlVmFsdWUgPSBwYXJzZUludChlbnRyeS5nZXRBdHRyaWJ1dGUoJ3NvdXJjZS12YWx1ZScpKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmFsdWUgPSBwYXJzZUludChlbnRyeS5nZXRBdHRyaWJ1dGUoJ3RhcmdldC12YWx1ZScpKTtcbiAgICAgICAgaWYgKGlzTmFOKHNvdXJjZVZhbHVlKSB8fCBpc05hTih0YXJnZXRWYWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzb3VyY2UtdmFsdWUgb3IgdGFyZ2V0LXZhbHVlIGlzIG5vdCBhIG51bWJlciBpbiBxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpO1xuICAgICAgICB9XG4gICAgICAgIGVudHJpZXMuc2V0KHNvdXJjZVZhbHVlLCB0YXJnZXRWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cmllcztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGU6IE91dGNvbWVWYXJpYWJsZSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIGNhcmRpbmFsaXR5OiB0aGlzLmNhcmRpbmFsaXR5LFxuICAgICAgYmFzZVR5cGU6IHRoaXMuYmFzZVR5cGUsXG4gICAgICB0eXBlOiAnb3V0Y29tZScsXG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGludGVycG9sYXRpb25UYWJsZTogdGhpcy5pbnRlcnBvbGF0aW9uVGFibGUsXG4gICAgICBleHRlcm5hbFNjb3JlZDogdGhpcy5leHRlcm5hbFNjb3JlZFxuICAgIH07XG4gICAgb3V0Y29tZVZhcmlhYmxlLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWVzKG91dGNvbWVWYXJpYWJsZSk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItdmFyaWFibGUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgdmFyaWFibGU6IG91dGNvbWVWYXJpYWJsZSB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW91dGNvbWUtZGVjbGFyYXRpb24nOiBRdGlPdXRjb21lRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS12YXJpYWJsZWRlY2xhcmF0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWZhdWx0VmFsdWVzKHZhcmlhYmxlOiBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD4pIHtcbiAgICBjb25zdCBodG1sVmFsdWVzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1kZWZhdWx0LXZhbHVlID4gcXRpLXZhbHVlJykpO1xuXG4gICAgaWYgKGh0bWxWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0VmFsdWVzID0gaHRtbFZhbHVlcy5tYXAobiA9PiBuLmlubmVySFRNTC50cmltKCkpO1xuICAgIGlmIChkZWZhdWx0VmFsdWVzLmxlbmd0aCA+IDEgfHwgdmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdtdWx0aXBsZScgfHwgdmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdvcmRlcmVkJykge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXM7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VmFsdWVzWzBdO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS12YXJpYWJsZWRlY2xhcmF0aW9uJzogUXRpVmFyaWFibGVEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEJhc2VUeXBlLCBDYXJkaW5hbGl0eSB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpTWFwcGluZyB9IGZyb20gJy4uLy4uL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXBwaW5nL3F0aS1tYXBwaW5nJztcbmltcG9ydCB7IFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZURlY2xhcmF0aW9uIGV4dGVuZHMgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGU7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgY2FyZGluYWxpdHk6IENhcmRpbmFsaXR5O1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGU6IFJlc3BvbnNlVmFyaWFibGUgPSB7XG4gICAgICBiYXNlVHlwZTogdGhpcy5iYXNlVHlwZSxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIGNvcnJlY3RSZXNwb25zZTogdGhpcy5jb3JyZWN0UmVzcG9uc2UsXG4gICAgICBjYXJkaW5hbGl0eTogdGhpcy5jYXJkaW5hbGl0eSB8fCAnc2luZ2xlJyxcbiAgICAgIG1hcHBpbmc6IHRoaXMubWFwcGluZyxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcbiAgICAgIGNhbmRpZGF0ZVJlc3BvbnNlOiBudWxsXG4gICAgfTtcbiAgICByZXNwb25zZVZhcmlhYmxlLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWVzKHJlc3BvbnNlVmFyaWFibGUpO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItdmFyaWFibGUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgdmFyaWFibGU6IHJlc3BvbnNlVmFyaWFibGUgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICBjb25zdCBjb3JyZWN0UmVzcG9uc2UgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgaWYgKGNvcnJlY3RSZXNwb25zZSkge1xuICAgICAgY29uc3QgdmFsdWVzID0gY29ycmVjdFJlc3BvbnNlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS12YWx1ZScpO1xuICAgICAgaWYgKHRoaXMuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlc1swXS50ZXh0Q29udGVudDtcbiAgICAgICAgdmFsdWVzWzBdLnJlbW92ZSgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZXNbaV0udGV4dENvbnRlbnQpO1xuICAgICAgICAgIHZhbHVlc1tpXS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgbWFwcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktbWFwcGluZycpIGFzIFF0aU1hcHBpbmc7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJzogUXRpUmVzcG9uc2VEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nKVxuZXhwb3J0IGNsYXNzIFF0aUNvbXBhbmlvbk1hdGVyaWFsc0luZm8gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgLy8gc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgLy8gICBzbG90IHtcbiAgLy8gICAgIGRpc3BsYXk6IGhpZGRlbjtcbiAgLy8gICB9XG4gIC8vIGA7XG4gIC8vIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgLy8gICByZXR1cm4gaHRtbGAgPHNsb3Q+PC9zbG90PiBgO1xuICAvLyB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nOiBRdGlDb21wYW5pb25NYXRlcmlhbHNJbmZvO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWNvbnRlbnQtYm9keScpXG5leHBvcnQgY2xhc3MgUXRpQ29udGVudEJvZHkgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY29udGVudC1ib2R5JzogUXRpQ29udGVudEJvZHk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJ1YnJpYy1ibG9jaycpXG5leHBvcnQgY2xhc3MgUXRpUnVicmljQmxvY2sgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIG92ZXJyaWRlIGlkOyAvLyA9XCJxdGlBc3BlY3RJbmhvdWRSdWJyaWNCbG9ja1wiXG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHVzZTogJ2luc3RydWN0aW9ucycgfCAnc2NvcmluZycgfCAnbmF2aWdhdGlvbic7IC8vICA9IFwic2NvcmluZ1wiXG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHZpZXc6ICdhdXRob3InIHwgJ2NhbmRpZGF0ZScgfCAncHJvY3RvcicgfCAnc2NvcmVyJyB8ICd0ZXN0Q29uc3RydWN0b3InIHwgJ3R1dG9yJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIGhhbmRsZWNsYXNzTmFtZXNDaGFuZ2Uob2xkLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSB0aGlzLmNsYXNzTmFtZXMuc3BsaXQoJyAnKTtcbiAgICBjbGFzc05hbWVzLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBzd2l0Y2ggKGNsYXNzTmFtZSkge1xuICAgICAgICBjYXNlICdxdGktcnVicmljLWRpc2NyZXRpb25hcnktcGxhY2VtZW50JzpcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktcnVicmljLWJsb2NrJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1ydWJyaWMtaW5saW5lJzpcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICcnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gYnkgZGVmYXVsdCBwdXQgdGhpcyBpbiBhIHNsb3QgaW4gdGhlIGl0ZW0tYm9keVxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1ydWJyaWMtYmxvY2snKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcnVicmljLWJsb2NrJzogUXRpUnVicmljQmxvY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBQcm9wZXJ0eVZhbHVlTWFwLCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1mZWVkYmFjay1ibG9jaycpXG5leHBvcnQgY2xhc3MgUXRpRmVlZGJhY2tCbG9jayBleHRlbmRzIFF0aUZlZWRiYWNrIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLm9uIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAub2ZmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCJmZWVkYmFjayAke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tTaG93RmVlZGJhY2sodGhpcy5vdXRjb21lSWRlbnRpZmllcik7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1mZWVkYmFjay1ibG9jayc6IFF0aUZlZWRiYWNrQmxvY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tICcuLi9pbnRlcm5hbC91dGlscyc7XG5pbXBvcnQgeyBpdGVtQ29udGV4dCwgSXRlbUNvbnRleHQgfSBmcm9tICcuLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdGlGZWVkYmFjayBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Nob3ctaGlkZScgfSlcbiAgcHJvdGVjdGVkIHNob3dIaWRlOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdvdXRjb21lLWlkZW50aWZpZXInIH0pXG4gIHB1YmxpYyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwcm90ZWN0ZWQgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiBmYWxzZSB9KVxuICBwdWJsaWMgc2hvd1N0YXR1czogc3RyaW5nO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9jb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFF0aUZlZWRiYWNrPigncXRpLXJlZ2lzdGVyLWZlZWRiYWNrJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2hlY2tTaG93RmVlZGJhY2sob3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZykgeyAgICBcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGUgPSB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBvdXRjb21lSWRlbnRpZmllcikgfHwgbnVsbDs7XG5cbiAgICBpZiAodGhpcy5vdXRjb21lSWRlbnRpZmllciAhPT0gb3V0Y29tZUlkZW50aWZpZXIgfHwgIW91dGNvbWVWYXJpYWJsZSkgcmV0dXJuO1xuICAgIGxldCBpc0ZvdW5kID0gZmFsc2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3V0Y29tZVZhcmlhYmxlLnZhbHVlKSkge1xuICAgICAgaXNGb3VuZCA9IG91dGNvbWVWYXJpYWJsZS52YWx1ZS5pbmNsdWRlcyh0aGlzLmlkZW50aWZpZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpc0ZvdW5kID1cbiAgICAgICAgKCFJc051bGxPclVuZGVmaW5lZCh0aGlzLmlkZW50aWZpZXIpICYmXG4gICAgICAgICAgIUlzTnVsbE9yVW5kZWZpbmVkKG91dGNvbWVWYXJpYWJsZT8udmFsdWUpICYmXG4gICAgICAgICAgdGhpcy5pZGVudGlmaWVyID09PSBvdXRjb21lVmFyaWFibGUudmFsdWUpIHx8XG4gICAgICAgIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0ZlZWRiYWNrKGlzRm91bmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93RmVlZGJhY2sodmFsdWU6IGJvb2xlYW4pIHsgICAgXG4gICAgdGhpcy5zaG93U3RhdHVzID0gKHZhbHVlICYmIHRoaXMuc2hvd0hpZGUgPT09ICdzaG93JykgfHwgKCF2YWx1ZSAmJiB0aGlzLnNob3dIaWRlID09PSAnaGlkZScpID8gJ29uJyA6ICdvZmYnOyAgICBcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBkZWNpbWFsU2VwYXJhdG9yID0gKCkgPT4ge1xuICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KCkuZm9ybWF0KDAuMSkucmVwbGFjZSgvXFxkL2csICcnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCA9IChudW1iZXI6IG51bWJlciB8IHN0cmluZykgPT4ge1xuICAvLyBjaGVjayBpZiB0eXBlIGlzIHN0cmluZ1xuICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVtYmVyO1xuICB9XG4gIGNvbnN0IGRTZXAgPSBkZWNpbWFsU2VwYXJhdG9yKCk7XG4gIGlmIChkU2VwID09PSAnLicpIHtcbiAgICByZXR1cm4gbnVtYmVyLnRvTG9jYWxlU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bWJlci50b1N0cmluZygpLnJlcGxhY2UoJy4nLCAnJykucmVwbGFjZShkU2VwLCAnLicpO1xuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gSXNOdWxsT3JVbmRlZmluZWQodmFsdWU6IHVua25vd24pIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEb3VibGVTbGFzaGVzKHN0cjogc3RyaW5nKSB7XG4gIGNvbnN0IHNpbmdsZUZvcndhcmRTbGFzaGVzID0gc3RyXG4gICAgLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgJyQxJylcbiAgICAucmVwbGFjZSgvXFwvXFwvL2csICcvJylcbiAgICAucmVwbGFjZSgnaHR0cDovJywgJ2h0dHA6Ly8nKVxuICAgIC5yZXBsYWNlKCdodHRwczovJywgJ2h0dHBzOi8vJyk7XG4gIHJldHVybiBzaW5nbGVGb3J3YXJkU2xhc2hlcztcbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1mZWVkYmFjay1pbmxpbmUnKVxuZXhwb3J0IGNsYXNzIFF0aUZlZWRiYWNrSW5saW5lIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCIke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1mZWVkYmFjay1pbmxpbmUnOiBRdGlGZWVkYmFja0lubGluZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2snO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1vZGFsLWZlZWRiYWNrJylcbmV4cG9ydCBjbGFzcyBRdGlNb2RhbEZlZWRiYWNrIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCIke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tb2RhbC1mZWVkYmFjayc6IFF0aU1vZGFsRmVlZGJhY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaWZEZWZpbmVkIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvaWYtZGVmaW5lZC5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpRXh0ZW5kZWRUZXh0SW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3Jvd3MgPSA1O1xuXG4gIC8qKiBleHBlY3RlZCBsZW5ndGggaXMgbWFwcGVkIHRvIHRoZSBwcm9wZXJ0eSBtYXhsZW5ndGggb24gdGhlIHRleHRhcmVhICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnZXhwZWN0ZWQtbGVuZ3RoJyB9KSBleHBlY3RlZExlbmd0aDogbnVtYmVyO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncGF0dGVybi1tYXNrJyB9KSBwYXR0ZXJuTWFzazogc3RyaW5nO1xuXG4gIC8qKiB0ZXh0IGFwcGVhcmluZyBpbiB0aGUgZXh0ZW5kZWQtdGV4dC1udGVyYWN0aW9uIGlmIGl0IGlzIGVtcHR5ICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncGxhY2Vob2xkZXItdGV4dCcgfSkgcGxhY2Vob2xkZXJUZXh0OiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLXBhdHRlcm5tYXNrLW1lc3NhZ2UnIH0pIGRhdGFQYXR0ZXJubWFza01lc3NhZ2U6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF92YWx1ZSA9ICcnO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY2xhc3MnIH0pIGNsYXNzTmFtZXM7XG4gIEB3YXRjaCgnY2xhc3NOYW1lcycpXG4gIGhhbmRsZWNsYXNzTmFtZXNDaGFuZ2Uob2xkLCBjbGFzc2VzOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjbGFzc05hbWVzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xuICAgIGxldCByb3dzU2V0ID0gZmFsc2U7XG4gICAgY2xhc3NOYW1lcy5mb3JFYWNoKChjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKCdxdGktaGVpZ2h0LWxpbmVzLScpKSB7XG4gICAgICAgIGNvbnN0IG5yUm93cyA9IGNsYXNzTmFtZS5yZXBsYWNlKCdxdGktaGVpZ2h0LWxpbmVzLScsICcnKTtcbiAgICAgICAgdGhpcy5fcm93cyA9IHBhcnNlSW50KG5yUm93cyk7XG4gICAgICAgIHJvd3NTZXQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIElmIG5vIHF0aS1oZWlnaHQtbGluZXMgY2xhc3MgaXMgc2V0LCBjYWxjdWxhdGUgcm93cyBiYXNlZCBvbiBleHBlY3RlZExlbmd0aFxuICAgIGlmICghcm93c1NldCAmJiB0aGlzLmV4cGVjdGVkTGVuZ3RoKSB7XG4gICAgICBjb25zdCBlc3RpbWF0ZWRSb3dzID0gTWF0aC5jZWlsKHRoaXMuZXhwZWN0ZWRMZW5ndGggLyA1MCk7IC8vICAnNTAnIGJhc2VkIG9uIGFuIGVzdGltYXRlIGZvciBjaGFyYWN0ZXJzIHBlciByb3dcbiAgICAgIHRoaXMuX3Jvd3MgPSBlc3RpbWF0ZWRSb3dzO1xuICAgIH1cbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbDtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQodGhpcy5yZXNwb25zZUlkZW50aWZpZXIsIHZhbCk7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKGZvcm1EYXRhKTtcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHZhbGlkYXRlKCkge1xuICAgIGNvbnN0IHRleHRhcmVhID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XG4gICAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHRoaXMucGF0dGVybk1hc2sgJiYgdGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKSB7XG4gICAgICAvLyBDbGVhciBhbnkgY3VzdG9tIGVycm9yIGluaXRpYWxseVxuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KHt9KTtcbiAgICAgIHRleHRhcmVhLnNldEN1c3RvbVZhbGlkaXR5KCcnKTtcbiAgICAgIGNvbnN0IHBhdHRlcm5Tb3VyY2UgPVxuICAgICAgICB0aGlzLnBhdHRlcm5NYXNrLnN0YXJ0c1dpdGgoJ14nKSAmJiB0aGlzLnBhdHRlcm5NYXNrLmVuZHNXaXRoKCckJykgPyB0aGlzLnBhdHRlcm5NYXNrIDogYF4ke3RoaXMucGF0dGVybk1hc2t9JGA7XG5cbiAgICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKHBhdHRlcm5Tb3VyY2UpO1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHRleHRhcmVhLmNoZWNrVmFsaWRpdHkoKSAmJiBwYXR0ZXJuLnRlc3QodGV4dGFyZWEudmFsdWUpO1xuXG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgLy8gU2V0IGN1c3RvbSBlcnJvciBpZiBpbnZhbGlkXG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7IGN1c3RvbUVycm9yOiB0cnVlIH0sIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSk7XG4gICAgICAgIHRleHRhcmVhLnNldEN1c3RvbVZhbGlkaXR5KHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0ZXh0YXJlYS5jaGVja1ZhbGlkaXR5KCk7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoaXNWYWxpZCA/IHt9IDogeyBjdXN0b21FcnJvcjogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlICE9PSAnJyAmJiB0ZXh0YXJlYS5jaGVja1ZhbGlkaXR5KCk7XG4gIH1cblxuICBvdmVycmlkZSByZXBvcnRWYWxpZGl0eSgpIHtcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgIGlmICghdGV4dGFyZWEpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJ1biB0aGUgdmFsaWRhdGUgZnVuY3Rpb24gdG8gZW5zdXJlIHRoZSBjdXN0b20gdmFsaWRpdHkgc3RhdGUgaXMgdXAgdG8gZGF0ZVxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICB0ZXh0YXJlYS5yZXBvcnRWYWxpZGl0eSgpO1xuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZDtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBjc3NgXG4gICAgICAgIC8qIFBLOiBkaXNwbGF5IGhvc3QgYXMgYmxvY2ssIGVsc2UgZGVzaWduIHdpbGwgYmUgY29sbGFwc2VkICovXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuICAgICAgICB0ZXh0YXJlYSB7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgYm9yZGVyOiAwO1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90XG4gICAgICA+PHRleHRhcmVhXG4gICAgICAgIHBhcnQ9XCJ0ZXh0YXJlYVwiXG4gICAgICAgIG5hbWU9XCIke3RoaXMucmVzcG9uc2VJZGVudGlmaWVyfVwiXG4gICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIG1heGxlbmd0aD1cIiR7NTAwMH1cIlxuICAgICAgICBAa2V5ZG93bj1cIiR7ZXZlbnQgPT4gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9XCJcbiAgICAgICAgQGtleXVwPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBjaGFuZ2U9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgQGJsdXI9XCIkeyhldmVudDogRm9jdXNFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgfX1cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIiR7aWZEZWZpbmVkKHRoaXMucGxhY2Vob2xkZXJUZXh0ID8gdGhpcy5wbGFjZWhvbGRlclRleHQgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgIHJvd3M9XCIke3RoaXMuX3Jvd3N9XCJcbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiXG4gICAgICAgID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIlxuICAgICAgICAudmFsdWU9JHt0aGlzLl92YWx1ZX1cbiAgICAgID48L3RleHRhcmVhPmA7XG4gIH1cblxuICBwcm90ZWN0ZWQgdGV4dENoYW5nZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgdGhpcy5zZXRFbXB0eUF0dHJpYnV0ZShpbnB1dC52YWx1ZSk7XG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSBpbnB1dC52YWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKGlucHV0LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEVtcHR5QXR0cmlidXRlKHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdlbXB0eScsIHRleHQgPT09ICcnID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24nOiBRdGlFeHRlbmRlZFRleHRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgSUludGVyYWN0aW9uIH0gZnJvbSAnLi9pbnRlcmFjdGlvbi5pbnRlcmZhY2UnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW50ZXJhY3Rpb24gZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgSUludGVyYWN0aW9uIHtcbiAgc3RhdGljIGZvcm1Bc3NvY2lhdGVkID0gdHJ1ZTsgLy8gRW5hYmxlIGZvcm0gYXNzb2NpYXRpb25cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KSByZXNwb25zZUlkZW50aWZpZXIgPSAnJztcbiAgLyoqIGRpc2FibGVkIHNob3VsZCBiZSBleHBvc2VkIHRvIHRoZSBhdHRyaWJ1dGVzIGFuZCBhY2Nlc3NpYmxlIGFzIHByb3BlcnR5ICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKiogcmVhZG9ubHkgc2hvdWxkIGJlIGV4cG9zZWQgdG8gdGhlIGF0dHJpYnV0ZXMgYW5kIGFjY2Vzc2libGUgYXMgcHJvcGVydHkgKi9cbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KSByZWFkb25seSA9IGZhbHNlO1xuXG4gIEBzdGF0ZSgpXG4gIHByb3RlY3RlZCBfY29ycmVjdFJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnO1xuICBwcm90ZWN0ZWQgX2ludGVybmFsczogRWxlbWVudEludGVybmFscztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2ludGVybmFscyA9IHRoaXMuYXR0YWNoSW50ZXJuYWxzKCk7XG4gIH1cblxuICBhYnN0cmFjdCB2YWxpZGF0ZSgpOiBib29sZWFuO1xuXG4gIHB1YmxpYyByZXBvcnRWYWxpZGl0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW50ZXJuYWxzLnJlcG9ydFZhbGlkaXR5KCk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9ICcnO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdO1xuICBhYnN0cmFjdCBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSk7XG5cbiAgcHVibGljIGdldCBjb3JyZWN0UmVzcG9uc2UoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9jb3JyZWN0UmVzcG9uc2U7XG4gIH1cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLl9jb3JyZWN0UmVzcG9uc2UgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItaW50ZXJhY3Rpb24nLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNhdmVSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbnRlcmFjdGlvbi1yZXNwb25zZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgIHJlc3BvbnNlOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDU1NSZXN1bHRHcm91cCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IGNyZWF0ZVJlZiB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlZi5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24uc3R5bGVzJztcbkBjdXN0b21FbGVtZW50KCdxdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpVGV4dEVudHJ5SW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnZXhwZWN0ZWQtbGVuZ3RoJyB9KSBleHBlY3RlZExlbmd0aDogbnVtYmVyO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncGF0dGVybi1tYXNrJyB9KSBwYXR0ZXJuTWFzazogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncGxhY2Vob2xkZXItdGV4dCcgfSkgcGxhY2Vob2xkZXJUZXh0OiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLXBhdHRlcm5tYXNrLW1lc3NhZ2UnIH0pIGRhdGFQYXR0ZXJubWFza01lc3NhZ2U6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF92YWx1ZSA9ICcnO1xuXG4gIGlucHV0UmVmID0gY3JlYXRlUmVmPEhUTUxJbnB1dEVsZW1lbnQ+KCk7XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCh0aGlzLnJlc3BvbnNlSWRlbnRpZmllciwgdmFsKTtcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRGb3JtVmFsdWUoZm9ybURhdGEpO1xuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgdmFsaWRhdGUoKSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICBpZiAoIWlucHV0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMucGF0dGVybk1hc2sgJiYgdGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKSB7XG4gICAgICAvLyBDbGVhciBhbnkgY3VzdG9tIGVycm9yIGlmIHRoZSBpbnB1dCBpcyB2YWxpZFxuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KHt9KTtcbiAgICAgIGlucHV0LnNldEN1c3RvbVZhbGlkaXR5KCcnKTsgLy8gQ2xlYXIgdGhlIGN1c3RvbSBtZXNzYWdlXG4gICAgICBjb25zdCBpc1ZhbGlkID0gaW5wdXQuY2hlY2tWYWxpZGl0eSgpO1xuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIC8vIFNldCBjdXN0b20gZXJyb3IgaWYgaW52YWxpZFxuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoeyBjdXN0b21FcnJvcjogdHJ1ZSB9LCB0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpO1xuICAgICAgICBpbnB1dC5zZXRDdXN0b21WYWxpZGl0eSh0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpOyAvLyBTZXQgY3VzdG9tIG1lc3NhZ2Ugb25seSBpZiBpbnZhbGlkXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSBpbnB1dC5jaGVja1ZhbGlkaXR5KCk7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoaXNWYWxpZCA/IHt9IDogeyBjdXN0b21FcnJvcjogZmFsc2UgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl92YWx1ZSAhPT0gJycgJiYgaW5wdXQuY2hlY2tWYWxpZGl0eSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGlucHV0XG4gICAgICAgIHBhcnQ9XCJpbnB1dFwiXG4gICAgICAgIG5hbWU9XCIke3RoaXMucmVzcG9uc2VJZGVudGlmaWVyfVwiXG4gICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIEBibHVyPVwiJHsoZXZlbnQ6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICAgIH19XCJcbiAgICAgICAgQGtleWRvd249XCIke2V2ZW50ID0+IGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfVwiXG4gICAgICAgIEBrZXl1cD1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICBAY2hhbmdlPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIHR5cGU9XCIke3RoaXMucGF0dGVybk1hc2sgPT0gJ1swLTldKicgPyAnbnVtYmVyJyA6ICd0ZXh0J31cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIiR7aWZEZWZpbmVkKHRoaXMucGxhY2Vob2xkZXJUZXh0ID8gdGhpcy5wbGFjZWhvbGRlclRleHQgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgIC52YWx1ZT1cIiR7dGhpcy5fdmFsdWV9XCJcbiAgICAgICAgcGF0dGVybj1cIiR7aWZEZWZpbmVkKHRoaXMucGF0dGVybk1hc2sgPyB0aGlzLnBhdHRlcm5NYXNrIDogdW5kZWZpbmVkKX1cIlxuICAgICAgICBtYXhsZW5ndGg9JHsxMDAwfVxuICAgICAgICA/ZGlzYWJsZWQ9XCIke3RoaXMuZGlzYWJsZWR9XCJcbiAgICAgICAgP3JlYWRvbmx5PVwiJHt0aGlzLnJlYWRvbmx5fVwiXG4gICAgICAvPlxuICAgICAgPGRpdiBwYXJ0PVwiY29ycmVjdFwiPiR7dGhpcy5fY29ycmVjdFJlc3BvbnNlfTwvZGl2PlxuICAgIGA7XG4gIH1cbiAgcHJvdGVjdGVkIHRleHRDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMuc2V0RW1wdHlBdHRyaWJ1dGUoaW5wdXQudmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gaW5wdXQudmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZShpbnB1dC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVwb3J0VmFsaWRpdHkoKSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICBpZiAoIWlucHV0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSdW4gdGhlIHZhbGlkYXRlIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGUgY3VzdG9tIHZhbGlkaXR5IHN0YXRlIGlzIHVwIHRvIGRhdGVcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgaW5wdXQucmVwb3J0VmFsaWRpdHkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzVmFsaWQ7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl92YWx1ZSA9ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRFbXB0eUF0dHJpYnV0ZSh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZW1wdHknLCB0ZXh0ID09PSAnJyA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJzogUXRpVGV4dEVudHJ5SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIDpob3N0IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIH1cbiAgW3BhcnQ9J2NvcnJlY3QnXSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAxLjFyZW07XG4gICAgbWluLXdpZHRoOiAxLjFyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTIpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMi4zcmVtO1xuICAgIG1pbi13aWR0aDogMi4zcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0zKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDMuM3JlbTtcbiAgICBtaW4td2lkdGg6IDMuM3JlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA0LjJyZW07XG4gICAgbWluLXdpZHRoOiA0LjJyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTYpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNi42cmVtO1xuICAgIG1pbi13aWR0aDogNi42cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0xMCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA4cmVtO1xuICAgIG1pbi13aWR0aDogOHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMTUpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMTJyZW07XG4gICAgbWluLXdpZHRoOiAxMnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMjApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMTdyZW07XG4gICAgbWluLXdpZHRoOiAxN3JlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMjUpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMjByZW07XG4gICAgbWluLXdpZHRoOiAyMHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMzApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMjRyZW07XG4gICAgbWluLXdpZHRoOiAyNHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMzUpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMjhyZW07XG4gICAgbWluLXdpZHRoOiAyOHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNDApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMzJyZW07XG4gICAgbWluLXdpZHRoOiAzMnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNDUpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMzZyZW07XG4gICAgbWluLXdpZHRoOiAzNnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNTApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNDByZW07XG4gICAgbWluLXdpZHRoOiA0MHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNzIpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNTdyZW07XG4gICAgbWluLXdpZHRoOiA1N3JlbTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90dGV4dC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpSG90dGV4dEludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLWhvdHRleHQnKSB7XG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJywgJycpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nOiBRdGlIb3R0ZXh0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSwgcXVlcnkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5pbXBvcnQgeyBDaG9pY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IElJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLmludGVyZmFjZSc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmV4cG9ydCB0eXBlIENob2ljZSA9IEhUTUxFbGVtZW50ICYgQ2hvaWNlSW50ZXJmYWNlICYgeyBpbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHMgfTtcblxuZXhwb3J0IGludGVyZmFjZSBDaG9pY2VzSW50ZXJmYWNlIGV4dGVuZHMgSUludGVyYWN0aW9uIHtcbiAgX2Nob2ljZUVsZW1lbnRzOiBBcnJheTxDaG9pY2U+O1xuICBjb3JyZWN0UmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgQ2hvaWNlc01peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KHN1cGVyQ2xhc3M6IFQsIHNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgQ2hvaWNlc01peGluRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBDaG9pY2VzSW50ZXJmYWNlIHtcbiAgICBwdWJsaWMgX2Nob2ljZUVsZW1lbnRzOiBDaG9pY2VbXSA9IFtdO1xuXG4gICAgQHF1ZXJ5KCcjdmFsaWRhdGlvbk1lc3NhZ2UnKVxuICAgIHByaXZhdGUgX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudCE6IEhUTUxFbGVtZW50O1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdtaW4tY2hvaWNlcycgfSlcbiAgICBwdWJsaWMgbWluQ2hvaWNlcyA9IDA7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ21heC1jaG9pY2VzJyB9KVxuICAgIHB1YmxpYyBtYXhDaG9pY2VzID0gMTtcblxuICAgIEB3YXRjaCgnbWF4Q2hvaWNlcycsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgICBfaGFuZGxlTWF4Q2hvaWNlc0NoYW5nZShfb2xkVmFsdWU6IG51bWJlciwgX25ld1ZhbHVlOiBudW1iZXIpIHtcbiAgICAgIHRoaXMuX2RldGVybWluZUlucHV0VHlwZSgpO1xuICAgIH1cblxuICAgIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgX2hhbmRsZURpc2FibGVkQ2hhbmdlID0gKF86IGJvb2xlYW4sIGRpc2FibGVkOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5kaXNhYmxlZCA9IGRpc2FibGVkKSk7XG4gICAgfTtcblxuICAgIEB3YXRjaCgncmVhZG9ubHknLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgX2hhbmRsZVJlYWRvbmx5Q2hhbmdlID0gKF86IGJvb2xlYW4sIHJlYWRvbmx5OiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiAoY2hvaWNlLnJlYWRvbmx5ID0gcmVhZG9ubHkpKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdID0gJyc7XG5cbiAgICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpID8gdGhpcy5fdmFsdWUuam9pbignLCcpIDogdGhpcy5fdmFsdWU7XG4gICAgfVxuXG4gICAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgIGlmICh0aGlzLm1heENob2ljZXMgPiAxICYmIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsLnNwbGl0KCcsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbDtcbiAgICAgIH1cbiAgICAgIC8vIEFzc3VtaW5nIHRoaXMudmFsdWUgaXMgYW4gYXJyYXkgb2Ygc3RyaW5nc1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIHRoaXMuX3ZhbHVlLmZvckVhY2gocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCh0aGlzLnJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldEZvcm1WYWx1ZShmb3JtRGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhpcy52YWx1ZSBpcyBub3QgYW4gYXJyYXlcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldEZvcm1WYWx1ZSh0aGlzLl92YWx1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLl91cGRhdGVDaG9pY2VTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvcnJlY3RSZXNwb25zZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29ycmVjdFJlc3BvbnNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgdGhpcy5fY29ycmVjdFJlc3BvbnNlID0gdmFsdWU7XG4gICAgICBjb25zdCByZXNwb25zZUFycmF5ID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJ2luY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgICBpZiAocmVzcG9uc2VBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlQXJyYXkuaW5jbHVkZXMoY2hvaWNlLmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5hZGQoJ2NvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuYWRkKCdpbmNvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihgcmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl9yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGB1bnJlZ2lzdGVyLSR7c2VsZWN0b3J9YCwgdGhpcy5fdW5yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGBhY3RpdmF0ZS0ke3NlbGVjdG9yfWAsIHRoaXMuX2Nob2ljZUVsZW1lbnRTZWxlY3RlZEhhbmRsZXIpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl9yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGB1bnJlZ2lzdGVyLSR7c2VsZWN0b3J9YCwgdGhpcy5fdW5yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGBhY3RpdmF0ZS0ke3NlbGVjdG9yfWAsIHRoaXMuX2Nob2ljZUVsZW1lbnRTZWxlY3RlZEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2hvaWNlcyA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbHRlcihjaG9pY2UgPT4gdGhpcy5fZ2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UpKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ291bnQgPSBzZWxlY3RlZENob2ljZXMubGVuZ3RoO1xuICAgICAgbGV0IGlzVmFsaWQgPSB0cnVlO1xuICAgICAgbGV0IHZhbGlkaXR5TWVzc2FnZSA9ICcnO1xuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyAhPT0gMCAmJiBzZWxlY3RlZENvdW50ID4gdGhpcy5tYXhDaG9pY2VzKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdmFsaWRpdHlNZXNzYWdlID0gdGhpcy5kYXRhc2V0Lm1heFNlbGVjdGlvbnNNZXNzYWdlIHx8IGBZb3UgY2FuIHNlbGVjdCBhdCBtb3N0ICR7dGhpcy5tYXhDaG9pY2VzfSBjaG9pY2VzLmA7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkQ291bnQgPCB0aGlzLm1pbkNob2ljZXMpIHtcbiAgICAgICAgaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB2YWxpZGl0eU1lc3NhZ2UgPSB0aGlzLmRhdGFzZXQubWluU2VsZWN0aW9uc01lc3NhZ2UgfHwgYFlvdSBtdXN0IHNlbGVjdCBhdCBsZWFzdCAke3RoaXMubWluQ2hvaWNlc30gY2hvaWNlcy5gO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZWN0ZWRDaG9pY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KFxuICAgICAgICAgIGlzVmFsaWQgPyB7fSA6IHsgY3VzdG9tRXJyb3I6IHRydWUgfSxcbiAgICAgICAgICB2YWxpZGl0eU1lc3NhZ2UsXG4gICAgICAgICAgc2VsZWN0ZWRDaG9pY2VzW3NlbGVjdGVkQ291bnQgLSAxXSB8fCB0aGlzLl9jaG9pY2VFbGVtZW50c1swXSB8fCB0aGlzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICB9XG5cbiAgICBvdmVycmlkZSByZXBvcnRWYWxpZGl0eSgpIHtcbiAgICAgIGlmICh0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbnRlcm5hbHMudmFsaWRpdHkudmFsaWQpIHtcbiAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLl9pbnRlcm5hbHMudmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5faW50ZXJuYWxzLnZhbGlkaXR5LnZhbGlkO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlZ2lzdGVyQ2hvaWNlRWxlbWVudChldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBDaG9pY2U7XG4gICAgICBjaG9pY2VFbGVtZW50LmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDtcblxuXG4gICAgICBcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLnB1c2goY2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLl9zZXRJbnB1dFR5cGUoY2hvaWNlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdW5yZWdpc3RlckNob2ljZUVsZW1lbnQoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgQ2hvaWNlO1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maWx0ZXIoY2hvaWNlID0+IGNob2ljZSAhPT0gY2hvaWNlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGV0ZXJtaW5lSW5wdXRUeXBlKCkge1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4ge1xuICAgICAgICB0aGlzLl9zZXRJbnB1dFR5cGUoY2hvaWNlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldElucHV0VHlwZShjaG9pY2VFbGVtZW50OiBDaG9pY2UpIHtcbiAgICAgIC8vIGNob2ljZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgdGhpcy5tYXhDaG9pY2VzID09PSAxID8gJ3JhZGlvJyA6ICdjaGVja2JveCcpO1xuICAgICAgY2hvaWNlRWxlbWVudC5pbnRlcm5hbHMucm9sZSA9IHRoaXMubWF4Q2hvaWNlcyA9PT0gMSA/ICdyYWRpbycgOiAnY2hlY2tib3gnO1xuICAgICAgY2hvaWNlRWxlbWVudC5pbnRlcm5hbHMuc3RhdGVzLmFkZChjaG9pY2VFbGVtZW50LmludGVybmFscy5yb2xlKVxuICAgICAgLy8gY2hvaWNlRWxlbWVudC5pbnRlcm5hbHMuYXJpYUNoZWNrZWQgPSAnZmFsc2UnO1xuICAgICAgLy8gY2hvaWNlRWxlbWVudC5hcmlhUmVhZE9ubHkgPSB0aGlzLnJlYWRvbmx5ID09IHRydWUgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcihldmVudDogQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmcgfT4pIHtcbiAgICAgIHRoaXMuX3RvZ2dsZUNob2ljZUNoZWNrZWQoZXZlbnQudGFyZ2V0IGFzIENob2ljZSk7XG4gICAgICBpZiAodGhpcy5tYXhDaG9pY2VzID09PSAxKSB7XG4gICAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgICBpZiAoY2hvaWNlLmlkZW50aWZpZXIgIT09IGV2ZW50LmRldGFpbC5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRDaG9pY2VDaGVja2VkKGNob2ljZSwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9oYW5kbGVDaG9pY2VTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRDaG9pY2VDaGVja2VkKGNob2ljZTogQ2hvaWNlLCBjaGVja2VkOiBib29sZWFuKSB7XG4gICAgICBpZiAoY2hvaWNlLmludGVybmFscz8uc3RhdGVzKSB7XG4gICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuYWRkKCctLWNoZWNrZWQnKTtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLmFyaWFDaGVja2VkID0gJ3RydWUnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnLS1jaGVja2VkJyk7XG4gICAgICAgICAgY2hvaWNlLmludGVybmFscy5hcmlhQ2hlY2tlZCA9ICdmYWxzZSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRDaG9pY2VDaGVja2VkKGNob2ljZTogQ2hvaWNlKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gY2hvaWNlLmludGVybmFscy5zdGF0ZXMuaGFzKCctLWNoZWNrZWQnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF90b2dnbGVDaG9pY2VDaGVja2VkKGNob2ljZTogQ2hvaWNlKSB7XG4gICAgICBjb25zdCBjaGVja2VkID0gdGhpcy5fZ2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UpO1xuICAgICAgdGhpcy5fc2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UsICFjaGVja2VkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVDaG9pY2VTZWxlY3Rpb24oKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZENob2ljZXMgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maWx0ZXIoY2hvaWNlID0+IHRoaXMuX2dldENob2ljZUNoZWNrZWQoY2hvaWNlKSk7XG4gICAgICBjb25zdCBzZWxlY3RlZElkZW50aWZpZXJzID0gc2VsZWN0ZWRDaG9pY2VzLm1hcChjaG9pY2UgPT4gY2hvaWNlLmlkZW50aWZpZXIpO1xuXG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5tYXhDaG9pY2VzID09PSAxID8gc2VsZWN0ZWRJZGVudGlmaWVyc1swXSB8fCAnJyA6IHNlbGVjdGVkSWRlbnRpZmllcnM7XG4gICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl92YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIGVhY2ggY2hvaWNlIGVsZW1lbnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVzcG9uc2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfdXBkYXRlQ2hvaWNlU2VsZWN0aW9uKCkge1xuICAgICAgY29uc3QgcmVzcG9uc2VBcnJheSA9IEFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpID8gdGhpcy5fdmFsdWUgOiBbdGhpcy5fdmFsdWVdO1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4ge1xuICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gcmVzcG9uc2VBcnJheS5pbmNsdWRlcyhjaG9pY2UuaWRlbnRpZmllcik7XG4gICAgICAgIHRoaXMuX3NldENob2ljZUNoZWNrZWQoY2hvaWNlLCBpc1NlbGVjdGVkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gQ2hvaWNlc01peGluRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxDaG9pY2VzSW50ZXJmYWNlPiAmIFQ7XG59O1xuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbmludGVyZmFjZSBPcHRpb25UeXBlIHtcbiAgdGV4dENvbnRlbnQ6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XG59XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpSW5saW5lQ2hvaWNlSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgIH1cbiAgICAgICAgc2xvdCB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICB9XG4gICAgICAgIFtyb2xlPSdtZW51J10ge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICB6LWluZGV4OiAxMDAwO1xuICAgICAgICB9XG4gICAgICAgIC5hbmNob3Ige1xuICAgICAgICAgIC8qIGFuY2hvci1uYW1lOiAtLWluZm9ib3g7ICovXG4gICAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLnBvc2l0aW9uZWRFbGVtZW50IHtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgLyogcG9zaXRpb24tYW5jaG9yOiAtLWluZm9ib3g7ICovXG4gICAgICAgICAgLyogdG9wOiBhbmNob3IoYm90dG9tKTsgKi9cbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlucHV0V2lkdGhDbGFzcyA9IFtcbiAgICAnJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTInLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMScsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0zJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTQnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtNicsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xMCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xNScsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0yMCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC03MidcbiAgXTtcblxuICBAc3RhdGUoKSBvcHRpb25zOiBPcHRpb25UeXBlW10gPSBbXTtcblxuICBAc3RhdGUoKSBjb3JyZWN0T3B0aW9uOiBzdHJpbmcgPSAnJztcblxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdkYXRhLXByb21wdCcsIHR5cGU6IFN0cmluZyB9KVxuICBkYXRhUHJvbXB0OiBzdHJpbmcgPSAnc2VsZWN0JztcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2VsZWN0IHBhcnQ9XCJzZWxlY3RcIiBAY2hhbmdlPVwiJHt0aGlzLmNob2ljZVNlbGVjdGVkfVwiID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIiA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCI+XG4gICAgICAgICR7dGhpcy5vcHRpb25zLm1hcChcbiAgICAgICAgICBvcHRpb24gPT4gaHRtbGBcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIke29wdGlvbi52YWx1ZX1cIiA/c2VsZWN0ZWQ9XCIke29wdGlvbi5zZWxlY3RlZH1cIj4ke3Vuc2FmZUhUTUwob3B0aW9uLnRleHRDb250ZW50KX08L29wdGlvbj5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICA8L3NlbGVjdD5cblxuICAgICAgJHt1bnNhZmVIVE1MKHRoaXMuY29ycmVjdE9wdGlvbil9XG4gICAgYDtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdvbi1kcm9wZG93bi1zZWxlY3RlZCcsIHRoaXMuY2hvaWNlU2VsZWN0ZWQpO1xuICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWlubGluZS1jaG9pY2UnKSk7XG4gICAgdGhpcy5vcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICB0ZXh0Q29udGVudDogdGhpcy5kYXRhUHJvbXB0LFxuICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIC4uLmNob2ljZXMubWFwKGNob2ljZSA9PiAoe1xuICAgICAgICB0ZXh0Q29udGVudDogY2hvaWNlLmlubmVySFRNTCxcbiAgICAgICAgdmFsdWU6IGNob2ljZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICB9KSlcbiAgICBdO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdvbi1kcm9wZG93bi1zZWxlY3RlZCcsIHRoaXMuY2hvaWNlU2VsZWN0ZWQpO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCk7XG4gICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9uID8gc2VsZWN0ZWRPcHRpb24udmFsdWUgIT09ICcnIDogZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcCgob3B0aW9uLCBpKSA9PiAoeyAuLi5vcHRpb24sIHNlbGVjdGVkOiBpID09PSAwIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gb3B0aW9uLnZhbHVlKSB7XG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9uO1xuICAgIH0pO1xuICB9XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKS52YWx1ZTtcbiAgfVxuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9uID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29ycmVjdE9wdGlvbiA9IGA8c3BhbiBwYXJ0PVwiY29ycmVjdC1vcHRpb25cIj4ke1xuICAgICAgdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IHZhbHVlID09PSBvcHRpb24udmFsdWUpLnRleHRDb250ZW50XG4gICAgfTwvc3Bhbj5gO1xuICB9XG5cbiAgcHVibGljIGNob2ljZVNlbGVjdGVkKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uVmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMubWFwKG9wdGlvbiA9PiAoeyAuLi5vcHRpb24sIHNlbGVjdGVkOiBvcHRpb24udmFsdWUgPT09IHNlbGVjdGVkT3B0aW9uVmFsdWUgfSkpO1xuICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHNlbGVjdGVkT3B0aW9uVmFsdWUpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJzogUXRpSW5saW5lQ2hvaWNlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDaG9pY2VzSW50ZXJmYWNlLCBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgU2h1ZmZsZU1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvc2h1ZmZsZS9zaHVmZmxlLW1peGluJztcbmltcG9ydCB7IFZvY2FidWxhcnlNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL3ZvY2FidWxhcnkvdm9jYWJ1bGFyeS1taXhpbic7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlDaG9pY2VJbnRlcmFjdGlvblxuICBleHRlbmRzIFZvY2FidWxhcnlNaXhpbihcbiAgICBTaHVmZmxlTWl4aW4oQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLXNpbXBsZS1jaG9pY2UnKSwgJ3F0aS1zaW1wbGUtY2hvaWNlJyksXG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJ1xuICApXG4gIGltcGxlbWVudHMgQ2hvaWNlc0ludGVyZmFjZVxue1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+PHNsb3QgcGFydD1cInNsb3RcIj48L3Nsb3Q+XG4gICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiIGlkPVwidmFsaWRhdGlvbk1lc3NhZ2VcIj48L2Rpdj5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24nOiBRdGlDaG9pY2VJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgIi8qKlxuICogTWl4aW4gdGhhdCBwcm92aWRlcyBzaHVmZmxpbmcgZnVuY3Rpb25hbGl0eSBmb3IgYSBMaXRFbGVtZW50LlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgTGl0RWxlbWVudCBzdWJjbGFzcy5cbiAqIEBwYXJhbSB7VH0gc3VwZXJDbGFzcyAtIFRoZSBzdXBlcmNsYXNzIHRvIGV4dGVuZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFRoZSBDU1Mgc2VsZWN0b3IgZm9yIHRoZSBlbGVtZW50cyB0byBzaHVmZmxlLlxuICogQHJldHVybnMge0NvbnN0cnVjdG9yPFNodWZmbGVJbnRlcmZhY2U+ICYgVH0gLSBUaGUgZXh0ZW5kZWQgY2xhc3Mgd2l0aCBzaHVmZmxpbmcgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBhZGRzIGEgc2h1ZmZsZSBwcm9wZXJ0eSB0byB0aGUgY2xhc3Mgd2l0aCBhbiBhdHRyaWJ1dGUgY29udmVydGVyXG4gKlxuICogcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqIHF0aS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqIHF0aS1tYXRjaC1pbnRlcmFjdGlvblxuICovXG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmRlY2xhcmUgY2xhc3MgU2h1ZmZsZUludGVyZmFjZSB7fVxuZXhwb3J0IGNvbnN0IFNodWZmbGVNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihzdXBlckNsYXNzOiBULCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNodWZmbGVFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgcHJpdmF0ZSBfc2h1ZmZsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gRGVmaW5lIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBjdXN0b20gY29udmVydGVyXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIHJlZmxlY3Q6IHRydWUsXG4gICAgICBjb252ZXJ0ZXI6IHN0cmluZ1RvQm9vbGVhbkNvbnZlcnRlclxuICAgIH0pXG4gICAgc2V0IHNodWZmbGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fc2h1ZmZsZTtcbiAgICAgIHRoaXMuX3NodWZmbGUgPSB2YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9zaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVzZXRTaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCdzaHVmZmxlJywgb2xkVmFsdWUpO1xuICAgIH1cblxuICAgIGdldCBzaHVmZmxlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3NodWZmbGU7XG4gICAgfVxuXG4gICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgLy8gQ2FsbCBfcmVzZXRTaHVmZmxlQ2hvaWNlcyBpbml0aWFsbHkgdG8gc2V0IHRoZSBDU1Mgb3JkZXIgdG8gaW5pdGlhbC5cbiAgICAgIC8vIElmIHNodWZmbGUgaXMgdHJ1ZSwgX3NodWZmbGVDaG9pY2VzIHdpbGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkgdmlhIHRoZSBzZXR0ZXIuXG4gICAgICBpZiAodGhpcy5zaHVmZmxlKSB7XG4gICAgICAgIHRoaXMuX3NodWZmbGVDaG9pY2VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXNldFNodWZmbGVDaG9pY2VzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2h1ZmZsZUNob2ljZXMoKSB7XG4gICAgICBjb25zdCBjaG9pY2VzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KHNlbGVjdG9yKSk7XG4gICAgICBjb25zdCBmaXhlZEVsZW1lbnRzOiBBcnJheTx7IGVsZW1lbnQ6IEhUTUxFbGVtZW50OyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgICBjb25zdCBub25GaXhlZEVsZW1lbnRzOiBBcnJheTxIVE1MRWxlbWVudD4gPSBbXTtcblxuICAgICAgLy8gU2VwYXJhdGUgZml4ZWQgYW5kIG5vbi1maXhlZCBlbGVtZW50c1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChjaG9pY2UuaGFzQXR0cmlidXRlKCdmaXhlZCcpKSB7XG4gICAgICAgICAgZml4ZWRFbGVtZW50cy5wdXNoKHsgZWxlbWVudDogY2hvaWNlLCBpbmRleDogaW5kZXggfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9uRml4ZWRFbGVtZW50cy5wdXNoKGNob2ljZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgMSBvciBmZXdlciBub24tZml4ZWQgZWxlbWVudHMsIHRocm93IGFuIGVycm9yIChubyBzaHVmZmxlIHBvc3NpYmxlKVxuICAgICAgaWYgKG5vbkZpeGVkRWxlbWVudHMubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTaHVmZmxpbmcgaXMgbm90IHBvc3NpYmxlIHdpdGggZmV3ZXIgdGhhbiAyIG5vbi1maXhlZCBlbGVtZW50cy4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgaXNTaHVmZmxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgbWF4QXR0ZW1wdHMgPSAxMDsgLy8gTWF4IGF0dGVtcHRzIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHNcbiAgICAgIGxldCBhdHRlbXB0ID0gMDtcblxuICAgICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgb3JkZXIgZm9yIGNvbXBhcmlzb25cbiAgICAgIGNvbnN0IG9yaWdpbmFsT3JkZXIgPSBbLi4ubm9uRml4ZWRFbGVtZW50c107XG5cbiAgICAgIC8vIFNodWZmbGUgdW50aWwgdGhlIHJlc3VsdCBpcyBkaWZmZXJlbnQgb3IgbWF4QXR0ZW1wdHMgaXMgcmVhY2hlZFxuICAgICAgd2hpbGUgKCFpc1NodWZmbGVkICYmIGF0dGVtcHQgPCBtYXhBdHRlbXB0cykge1xuICAgICAgICBhdHRlbXB0Kys7XG5cbiAgICAgICAgLy8gU2h1ZmZsZSBub24tZml4ZWQgZWxlbWVudHNcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vbkZpeGVkRWxlbWVudHMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgIGNvbnN0IGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTtcbiAgICAgICAgICBbbm9uRml4ZWRFbGVtZW50c1tpXSwgbm9uRml4ZWRFbGVtZW50c1tqXV0gPSBbbm9uRml4ZWRFbGVtZW50c1tqXSwgbm9uRml4ZWRFbGVtZW50c1tpXV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2h1ZmZsZWQgcmVzdWx0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBvcmRlclxuICAgICAgICBpc1NodWZmbGVkID0gIW5vbkZpeGVkRWxlbWVudHMuZXZlcnkoKGNob2ljZSwgaW5kZXgpID0+IGNob2ljZSA9PT0gb3JpZ2luYWxPcmRlcltpbmRleF0pO1xuXG4gICAgICAgIGlmIChpc1NodWZmbGVkKSBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc1NodWZmbGVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNodWZmbGUgdGhlIGNob2ljZXMgYWZ0ZXIgbXVsdGlwbGUgYXR0ZW1wdHMuJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFzc2lnbiBvcmRlciB0byBlYWNoIGVsZW1lbnRcbiAgICAgIGxldCBvcmRlciA9IDE7XG4gICAgICBjaG9pY2VzLmZvckVhY2goKGNob2ljZTogSFRNTEVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChjaG9pY2UuaGFzQXR0cmlidXRlKCdmaXhlZCcpKSB7XG4gICAgICAgICAgY2hvaWNlLnN0eWxlLnNldFByb3BlcnR5KCdvcmRlcicsIFN0cmluZyhvcmRlcisrKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgbm9uRml4ZWRDaG9pY2UgPSBub25GaXhlZEVsZW1lbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgbm9uRml4ZWRDaG9pY2UhLnN0eWxlLnNldFByb3BlcnR5KCdvcmRlcicsIFN0cmluZyhvcmRlcisrKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc2V0U2h1ZmZsZUNob2ljZXMoKSB7XG4gICAgICBjb25zdCBjaG9pY2VzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNob2ljZS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCAnaW5pdGlhbCcpOyAvLyBjaG9pY2Uuc3R5bGUub3JkZXIgPSAnaW5pdGlhbCc7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFNodWZmbGVFbGVtZW50IGFzIENvbnN0cnVjdG9yPFNodWZmbGVJbnRlcmZhY2U+ICYgVDtcbn07XG5cbmNvbnN0IHN0cmluZ1RvQm9vbGVhbkNvbnZlcnRlciA9IHtcbiAgZnJvbUF0dHJpYnV0ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICB9LFxuICB0b0F0dHJpYnV0ZSh2YWx1ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgfVxufTtcbiIsICIvKipcbiAqIE1peGluIHRoYXQgcHJvdmlkZXMgc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIGEgTGl0RWxlbWVudC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIExpdEVsZW1lbnQgc3ViY2xhc3MuXG4gKiBAcGFyYW0ge1R9IHN1cGVyQ2xhc3MgLSBUaGUgc3VwZXJjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBUaGUgQ1NTIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudHMgdG8gc2h1ZmZsZS5cbiAqIEByZXR1cm5zIHtDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFR9IC0gVGhlIGV4dGVuZGVkIGNsYXNzIHdpdGggc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogYWRkcyBhIHNodWZmbGUgcHJvcGVydHkgdG8gdGhlIGNsYXNzIHdpdGggYW4gYXR0cmlidXRlIGNvbnZlcnRlclxuICpcbiAqIHF0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktbWF0Y2gtaW50ZXJhY3Rpb25cbiAqL1xuaW1wb3J0IHsgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlTaW1wbGVDaG9pY2UgfSBmcm9tICcuLi8uLi9xdGktc2ltcGxlLWNob2ljZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxudHlwZSBMYWJlbFR5cGUgPSAncXRpLWxhYmVscy1kZWNpbWFsJyB8ICdxdGktbGFiZWxzLWxvd2VyLWFscGhhJyB8ICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJztcbnR5cGUgTGFiZWxTdWZmaXhUeXBlID0gJ3F0aS1sYWJlbHMtc3VmZml4LXBlcmlvZCcgfCAncXRpLWxhYmVscy1zdWZmaXgtcGFyZW50aGVzaXMnO1xuXG5kZWNsYXJlIGNsYXNzIFZvY2FidWxhcnlJbnRlcmZhY2Uge31cblxuZXhwb3J0IGNvbnN0IFZvY2FidWxhcnlNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihzdXBlckNsYXNzOiBULCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFZvY2FidWxhcnlFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgcHJpdmF0ZSBfY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIF9hbGxMYWJlbHMgPSBbJ3F0aS1sYWJlbHMtZGVjaW1hbCcsICdxdGktbGFiZWxzLWxvd2VyLWFscGhhJywgJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnXTtcbiAgICBwcml2YXRlIF9hbGxMYWJlbFN1ZmZpeGVzID0gWydxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnLCAncXRpLWxhYmVscy1zdWZmaXgtcGFyZW50aGVzaXMnXSBhcyBMYWJlbFN1ZmZpeFR5cGVbXTtcbiAgICAvLyBEZWZpbmUgdGhlIHByb3BlcnR5IHdpdGggdGhlIGN1c3RvbSBjb252ZXJ0ZXJcbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVmbGVjdDogdHJ1ZVxuICAgIH0pXG4gICAgc2V0IGNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9jbGFzc2VzLmpvaW4oJyAnKTtcbiAgICAgIHRoaXMuX2NsYXNzZXMgPSB2YWx1ZS5zcGxpdCgnICcpO1xuXG4gICAgICB0aGlzLl9hZGRMYWJlbHMoKTtcbiAgICAgIC8vIHRoaXMucmVxdWVzdFVwZGF0ZSgnY2xhc3MnLCBvbGRWYWx1ZSk7XG4gICAgfVxuICAgIGdldCBjbGFzcygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX2NsYXNzZXM/LmpvaW4oJyAnKSB8fCAnJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKTogdm9pZCB7XG4gICAgICBzdXBlci51cGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICBpZiAoX2NoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2h1ZmZsZScpKSB7XG4gICAgICAgIHRoaXMuX2FkZExhYmVscygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2FkZExhYmVscygpIHtcbiAgICAgIGNvbnN0IGNsYXNzQ29udGFpbnNMYWJlbCA9IHRoaXMuX2NsYXNzZXMuc29tZShcbiAgICAgICAgY2xzID0+IHRoaXMuX2FsbExhYmVscy5pbmNsdWRlcyhjbHMpIHx8IHRoaXMuX2FsbExhYmVsU3VmZml4ZXMuaW5jbHVkZXMoY2xzIGFzIExhYmVsU3VmZml4VHlwZSlcbiAgICAgICk7XG4gICAgICBjb25zdCBpc051bWJlciA9IHZhbHVlID0+IHtcbiAgICAgICAgcmV0dXJuICFpc05hTigrdmFsdWUpO1xuICAgICAgfTtcbiAgICAgIGlmIChjbGFzc0NvbnRhaW5zTGFiZWwpIHtcbiAgICAgICAgY29uc3QgY2hvaWNlRWxlbWVudHMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1jaG9pY2UnKSkubWFwKGMgPT4gYyBhcyBRdGlTaW1wbGVDaG9pY2UpO1xuICAgICAgICBjb25zdCBjaG9pY2VzID0gY2hvaWNlRWxlbWVudHNcbiAgICAgICAgICAubWFwKChjaG9pY2U6IEhUTUxFbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgZWw6IGNob2ljZSwgb3JkZXI6IGlzTnVtYmVyKGNob2ljZS5zdHlsZS5vcmRlcikgPyArY2hvaWNlLnN0eWxlLm9yZGVyIDogaW5kZXggKyAxIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpXG4gICAgICAgICAgLm1hcChjaG9pY2UgPT4gY2hvaWNlLmVsKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgKGNob2ljZXNbaV0gYXMgUXRpU2ltcGxlQ2hvaWNlKS5tYXJrZXIgPSB0aGlzLl9nZXRMYWJlbChpICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBfZ2V0TGFiZWwoaW5kZXg6IG51bWJlcikge1xuICAgICAgbGV0IGxhc3RMYWJlbCA9IHRoaXMuX2NsYXNzZXMuZmlsdGVyKGMgPT4gdGhpcy5fYWxsTGFiZWxzLmluY2x1ZGVzKGMpKS5wb3AoKSBhcyBMYWJlbFR5cGU7XG4gICAgICBjb25zdCBsYXN0TGFiZWxTdWZmaXggPSB0aGlzLl9jbGFzc2VzLmZpbHRlcihjID0+IHRoaXMuX2FsbExhYmVsU3VmZml4ZXMuaW5jbHVkZXMoYyBhcyBMYWJlbFN1ZmZpeFR5cGUpKS5wb3AoKTtcblxuICAgICAgaWYgKCFsYXN0TGFiZWwgJiYgbGFzdExhYmVsU3VmZml4KSB7XG4gICAgICAgIC8vIGEgc3VmZml4IHdpdGhvdXQgYSBsYWJlbCBpcyBzdHJhbmdlIHNvIGFkZCBxdGktbGFiZWxzLXVwcGVyLWFscGhhXG4gICAgICAgIGxhc3RMYWJlbCA9ICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJztcbiAgICAgIH1cbiAgICAgIGxldCBsYWJlbCA9ICcnO1xuICAgICAgc3dpdGNoIChsYXN0TGFiZWwpIHtcbiAgICAgICAgY2FzZSAncXRpLWxhYmVscy1kZWNpbWFsJzpcbiAgICAgICAgICBsYWJlbCA9IGAke2luZGV4fWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1sYWJlbHMtbG93ZXItYWxwaGEnOlxuICAgICAgICAgIGxhYmVsID0gYCR7U3RyaW5nLmZyb21DaGFyQ29kZSg5NyArIGluZGV4IC0gMSl9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncXRpLWxhYmVscy11cHBlci1hbHBoYSc6XG4gICAgICAgICAgbGFiZWwgPSBgJHtTdHJpbmcuZnJvbUNoYXJDb2RlKDY1ICsgaW5kZXggLSAxKX1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGxhc3RMYWJlbFN1ZmZpeCA9PT0gJ3F0aS1sYWJlbHMtc3VmZml4LXBlcmlvZCcpIHtcbiAgICAgICAgbGFiZWwgKz0gJy4nO1xuICAgICAgfSBlbHNlIGlmIChsYXN0TGFiZWxTdWZmaXggPT09ICdxdGktbGFiZWxzLXN1ZmZpeC1wYXJlbnRoZXNpcycpIHtcbiAgICAgICAgbGFiZWwgKz0gYClgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxhYmVsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gVm9jYWJ1bGFyeUVsZW1lbnQgYXMgQ29uc3RydWN0b3I8Vm9jYWJ1bGFyeUludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIFtwYXJ0PSdzbG90J10ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IHZhcigtLXF0aS1nYXAtc2l6ZSk7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICB9XG5cbiAgOjpzbG90dGVkKHF0aS1zaW1wbGUtY2hvaWNlKSB7XG4gICAgZmxleDogMCAwXG4gICAgICBjYWxjKCgxMDAlIC0gKHZhcigtLXF0aS1nYXAtc2l6ZSkgKiB2YXIoLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nKSkpIC8gdmFyKC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZykpICFpbXBvcnRhbnQ7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xuICB9XG5cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTEpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiAxO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTIpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiAyO1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy0zKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogMztcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctNCkgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDQ7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTUpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiA1O1xuICB9XG4gIDpob3N0KFtvcmllbnRhdGlvbj0naG9yaXpvbnRhbCddKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICB9XG5gO1xuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpUnVsZSwgUXRpUnVsZUJhc2UgfSBmcm9tICcuLic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1wcm9jZXNzaW5nJylcbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgbG9naWMgPSBuZXcgUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3IoKTtcbiAgICBjb25zdCBydWxlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG4gICAgbG9naWMucHJvY2VzcyhydWxlcyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW91dGNvbWUtcHJvY2Vzc2luZyc6IFF0aU91dGNvbWVQcm9jZXNzaW5nO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZ1Byb2Nlc3NvciB7XG4gIHB1YmxpYyBwcm9jZXNzKHJ1bGVzOiBRdGlSdWxlQmFzZVtdKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICBydWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVNYXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgbWFwUmVzcG9uc2UsIG1hcFJlc3BvbnNlUG9pbnQsIG1hdGNoQ29ycmVjdCB9IGZyb20gJy4uLy4uL2ludGVybmFsL3RlbXBsYXRlLXN0cmluZ3MnO1xuaW1wb3J0IHsgdHlwZSBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUvcXRpLXJ1bGUnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUXRpUmVzcG9uc2VQcm9jZXNzaW5nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICBjb25zdCBydWxlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG5cbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgIHJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlTWFwPGFueT4gfCBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCd0ZW1wbGF0ZScpKSB7XG4gICAgICBjb25zdCBzcGxpdHRlZFRlbXBsYXRlTmFtZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCd0ZW1wbGF0ZScpIS5zcGxpdCgnLycpO1xuICAgICAgY29uc3QgdGVtcGxhdGVOYW1lID0gc3BsaXR0ZWRUZW1wbGF0ZU5hbWVbc3BsaXR0ZWRUZW1wbGF0ZU5hbWUubGVuZ3RoIC0gMV0ucmVwbGFjZSgnLnhtbCcsICcnKTtcbiAgICAgIHRoaXMuaW5uZXJIVE1MID0gJyc7XG4gICAgICBzd2l0Y2ggKHRlbXBsYXRlTmFtZSkge1xuICAgICAgICBjYXNlICdtYXBfcmVzcG9uc2UnOiB7XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXBSZXNwb25zZSkuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ21hcF9yZXNwb25zZV9wb2ludCc6IHtcbiAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuZnJhZ21lbnRGcm9tU3RyaW5nKG1hcFJlc3BvbnNlUG9pbnQpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdtYXRjaF9jb3JyZWN0JzpcbiAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuZnJhZ21lbnRGcm9tU3RyaW5nKG1hdGNoQ29ycmVjdCkuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZnJhZ21lbnRGcm9tU3RyaW5nKHN0ckhUTUw6IHN0cmluZykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChzdHJIVE1MKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcmVzcG9uc2UtcHJvY2Vzc2luZyc6IFF0aVJlc3BvbnNlUHJvY2Vzc2luZztcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBtYXRjaENvcnJlY3QgPSBgPHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nPlxuICA8cXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbiAgICA8cXRpLXJlc3BvbnNlLWlmPlxuICAgICAgPHF0aS1tYXRjaD5cbiAgICAgICAgPHF0aS12YXJpYWJsZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS12YXJpYWJsZT5cbiAgICAgICAgPHF0aS1jb3JyZWN0IGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLWNvcnJlY3Q+XG4gICAgICA8L3F0aS1tYXRjaD5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjE8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtaWY+XG4gICAgPHF0aS1yZXNwb25zZS1lbHNlPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG5cbmV4cG9ydCBjb25zdCBtYXBSZXNwb25zZSA9IGA8cXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+XG4gIDxxdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuICAgIDxxdGktcmVzcG9uc2UtaWY+XG4gICAgICA8cXRpLWlzLW51bGw+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICA8L3F0aS1pcy1udWxsPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MC4wPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktbWFwLXJlc3BvbnNlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPiA8L3F0aS1tYXAtcmVzcG9uc2U+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG5cbmV4cG9ydCBjb25zdCBtYXBSZXNwb25zZVBvaW50ID0gYDxxdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5cbiAgPHF0aS1yZXNwb25zZS1jb25kaXRpb24+XG4gICAgPHF0aS1yZXNwb25zZS1pZj5cbiAgICAgIDxxdGktaXMtbnVsbD5cbiAgICAgICAgPHF0aS12YXJpYWJsZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS12YXJpYWJsZT5cbiAgICAgIDwvcXRpLWlzLW51bGw+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4wPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktbWFwLXJlc3BvbnNlLXBvaW50IGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLW1hcC1yZXNwb25zZS1wb2ludD5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWVsc2U+XG4gIDwvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbjwvcXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+YDtcbiIsICJpbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICdAY2l0b2xhYi9xdGktY29tcG9uZW50cy9xdGktY29tcG9uZW50cyc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbi8qKlxuICogVGhlIGxvb2t1cE91dGNvbWVWYWx1ZSBydWxlIHNldHMgdGhlIHZhbHVlIG9mIGFuIG91dGNvbWUgdmFyaWFibGUgdG8gdGhlIHZhbHVlIG9idGFpbmVkXG4gKiBieSBsb29raW5nIHVwIHRoZSB2YWx1ZSBvZiB0aGUgYXNzb2NpYXRlZCBleHByZXNzaW9uIGluIHRoZSBsb29rdXBUYWJsZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoZSBvdXRjb21lJ3MgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdGlMb29rdXBPdXRjb21lVmFsdWUgZXh0ZW5kcyBRdGlSdWxlIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBnZXQgY2hpbGRFeHByZXNzaW9uKCk6IFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxzdHJpbmc+O1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHByb2Nlc3MoKTogbnVtYmVyIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGUgPSB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKS5nZXRWYXJpYWJsZShpZGVudGlmaWVyKSBhcyBPdXRjb21lVmFyaWFibGU7XG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChvdXRjb21lVmFyaWFibGUuaW50ZXJwb2xhdGlvblRhYmxlKSB7XG4gICAgICB2YWx1ZSA9IG91dGNvbWVWYXJpYWJsZS5pbnRlcnBvbGF0aW9uVGFibGUuZ2V0KHBhcnNlSW50KHRoaXMuY2hpbGRFeHByZXNzaW9uLmNhbGN1bGF0ZSgpKSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ2xvb2t1cE91dGNvbWVWYWx1ZTogdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIG91dGNvbWVJZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZScsIFF0aUxvb2t1cE91dGNvbWVWYWx1ZSk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZSc6IFF0aUxvb2t1cE91dGNvbWVWYWx1ZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ydWxlJylcbmV4cG9ydCBjbGFzcyBRdGlSdWxlIGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIFF0aVJ1bGVCYXNlIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF0aVJ1bGVCYXNlIHtcbiAgcHJvY2VzcygpOiBhbnk7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ydWxlJzogUXRpUnVsZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUNvbmRpdGlvbiBleHRlbmRzIFF0aVJ1bGUge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgcHJvY2VzcygpIHtcbiAgICBjb25zdCBicmFuY2hlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlFeHByZXNzaW9uPGFueT5bXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJyYW5jaCA9IGJyYW5jaGVzW2ldO1xuXG4gICAgICBpZiAoYnJhbmNoLmNhbGN1bGF0ZSgpKSB7XG4gICAgICAgIChicmFuY2ggYXMgdW5rbm93biBhcyBRdGlSdWxlKS5wcm9jZXNzKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1jb25kaXRpb24nLCBRdGlSZXNwb25zZUNvbmRpdGlvbik7XG4iLCAiaW1wb3J0IHsgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC91dGlscyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUsIFF0aVJ1bGVCYXNlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlIGV4dGVuZHMgUXRpUnVsZSB7XG4gIHB1YmxpYyBvdmVycmlkZSBwcm9jZXNzKCkge1xuICAgIGNvbnN0IG91dGNvbWVJZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcblxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248c3RyaW5nPjtcblxuICAgIGNvbnN0IHJ1bGUgPSBuZXcgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZShleHByZXNzaW9uKTtcbiAgICBjb25zdCB2YWx1ZSA9IHJ1bGUucHJvY2VzcygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLXNldC1vdXRjb21lLXZhbHVlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgICA/IHZhbHVlLm1hcCgodjogc3RyaW5nKSA9PiBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCh2KSlcbiAgICAgICAgICAgIDogY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZTxUPiBpbXBsZW1lbnRzIFF0aVJ1bGVCYXNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uOiBRdGlFeHByZXNzaW9uQmFzZTxUPikge31cblxuICBwcm9jZXNzKCk6IGFueSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmV4cHJlc3Npb24gPyB0aGlzLmV4cHJlc3Npb24uY2FsY3VsYXRlKCkgOiBudWxsO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2Fybignc2V0T3V0Y29tZVZhbHVlOiB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCBRdGlTZXRPdXRjb21lVmFsdWUpO1xuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRWxzZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3ViUnVsZXMoKTogUXRpUnVsZVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aVJ1bGVbXTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IHN1YlJ1bGVzID0gdGhpcy5nZXRTdWJSdWxlcygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YlJ1bGUgPSBzdWJSdWxlc1tpXTtcbiAgICAgIHN1YlJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1lbHNlJywgUXRpUmVzcG9uc2VFbHNlKTtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aVJlc3BvbnNlSWYgfSBmcm9tICcuLi9xdGktcmVzcG9uc2UtaWYnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VFbHNlSWYgZXh0ZW5kcyBRdGlSZXNwb25zZUlmIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCR7c3VwZXIucmVuZGVyKCl9YDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1lbHNlLWlmJywgUXRpUmVzcG9uc2VFbHNlSWYpO1xuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vLi4vcXRpLXJ1bGUvcXRpLXJ1bGUnO1xuaW1wb3J0IHsgUXRpUmVzcG9uc2VFbHNlIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLWVsc2UnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VJZiBleHRlbmRzIFF0aVJlc3BvbnNlRWxzZSB7XG4gIHB1YmxpYyBvdmVycmlkZSBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxib29sZWFuPjtcbiAgICBjb25zdCByZXN1bHQgPSBleHByZXNzaW9uLmNhbGN1bGF0ZSgpIGFzIGJvb2xlYW47XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRTdWJSdWxlcygpOiBRdGlSdWxlW10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtaWYnLCBRdGlSZXNwb25zZUlmKTtcbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgaXRlbUNvbnRleHQsIEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpTXVsdGlwbGUgfSBmcm9tICcuL3F0aS1tdWx0aXBsZS9xdGktbXVsdGlwbGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF0aUV4cHJlc3Npb25CYXNlPFQ+IHtcbiAgLy8gZ2V0IGFzc2Vzc21lbnRJdGVtKCk6IFF0aUFzc2Vzc21lbnRJdGVtO1xuXG4gIC8vIGdldFZhcmlhYmxlcygpOiBWYXJpYWJsZURlY2xhcmF0aW9uPG51bWJlciB8IHN0cmluZyB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBudWxsPltdO1xuICBjYWxjdWxhdGUoKTogUmVhZG9ubHk8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdGlFeHByZXNzaW9uPFQ+IGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIFF0aUV4cHJlc3Npb25CYXNlPFQ+IHtcbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIHJlc3VsdDogYW55O1xuXG4gIC8vIGhpZGUgdGhlIHNsb3Qgd2l0aCBjc3NcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICBzbG90IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8cHJlPiR7SlNPTi5zdHJpbmdpZnkodGhpcy5yZXN1bHQsIG51bGwsIDIpfTwvcHJlPlxuICAgICAgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PFQ+IHtcbiAgICB0aGlzLnJlc3VsdCA9IHRoaXMuZ2V0UmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJlc3VsdCgpOiBSZWFkb25seTxUPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcm90ZWN0ZWQgY29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIGdldFZhcmlhYmxlcyA9ICgpOiBWYXJpYWJsZURlY2xhcmF0aW9uPG51bWJlciB8IHN0cmluZyB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBudWxsPltdID0+XG4gICAgLy8gRklYTUU6IGlmIHRoaXMgaXRzZWxmIGlzIG11bHRpcGxlLCB0aGlzIHdpbGwgbmV2ZXIgZW50ZXIgdGhlIHF0aS1tdWx0aXBsZSBzd2l0Y2hcbiAgICAvLyBTZWUgdGhpcyBleGFtcGxlIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS8xRWRUZWNoL3F0aS1leGFtcGxlcy9ibG9iL21hc3Rlci9xdGl2My1leGFtcGxlcy9wYWNrYWdpbmcvaXRlbXMvRXhhbXBsZTA1LWZlZWRiYWNrQmxvY2stYWRhcHRpdmUueG1sXG5cbiAgICBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pXG4gICAgICAubWFwKChlOiBFbGVtZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICdxdGktYmFzZS12YWx1ZSc6IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGJhc2VUeXBlOiBlLmdldEF0dHJpYnV0ZSgnYmFzZS10eXBlJyksXG4gICAgICAgICAgICAgIHZhbHVlOiBlLnRleHRDb250ZW50LnRyaW0oKSxcbiAgICAgICAgICAgICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnXG4gICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS12YXJpYWJsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1tdWx0aXBsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpcGxlID0gZSBhcyBRdGlNdWx0aXBsZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG11bHRpcGxlLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJycsXG4gICAgICAgICAgICAgICAgYmFzZVR5cGU6IHZhbHVlc1swXS5iYXNlVHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVzLm1hcCh2ID0+IHYudmFsdWUpLFxuICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAnbXVsdGlwbGUnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdyZXNwb25zZSdcbiAgICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1jb3JyZWN0Jzoge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlOiBSZXNwb25zZVZhcmlhYmxlID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB8fCBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYmFzZVR5cGU6IHJlc3BvbnNlVmFyaWFibGUuYmFzZVR5cGUsXG4gICAgICAgICAgICAgIHZhbHVlOiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZSxcbiAgICAgICAgICAgICAgY2FyZGluYWxpdHk6IHJlc3BvbnNlVmFyaWFibGUuY2FyZGluYWxpdHlcbiAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgLy8gYWRkZWQgZm9yIHVzZSBvZiBxdGktZXF1YWwtcm91bmRlZFxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGUgYXMgUXRpRXhwcmVzc2lvbjxudW1iZXI+O1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGV4cHJlc3Npb24uZ2V0UmVzdWx0KCk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYmFzZVR5cGU6ICdpbnRlZ2VyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZSdcbiAgICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdkZWZhdWx0IG5vdCBzdWZmaWNpZW50Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKHYgPT4gdiAhPT0gbnVsbCk7XG59XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PGJvb2xlYW4+IHtcbiAgICB0aGlzLnJlc3VsdCA9IHRoaXMuZ2V0UmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGdldFJlc3VsdCgpOiBSZWFkb25seTxib29sZWFuPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5leHBvcnQgY2xhc3MgUXRpQW5kIGV4dGVuZHMgcXRpQW5kTWl4aW4oUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFF0aUNvbmRpdGlvbkV4cHJlc3Npb24+KSB7XG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlQ2hpbGRyZW4oQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuIGFzIHVua25vd24gYXMgUXRpRXhwcmVzc2lvbjxhbnk+W10pKTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBNb2NrUXRpRXhwcmVzc2lvbjxUPiA9IHsgY2FsY3VsYXRlOiAoKSA9PiBUIH07XG50eXBlIE1vY2tDb25zdHJ1Y3RvciA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IHt9O1xuZXhwb3J0IGZ1bmN0aW9uIHF0aUFuZE1peGluPFRCYXNlIGV4dGVuZHMgTW9ja0NvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICByZXR1cm4gY2xhc3MgTW9ja1F0aUFuZCBleHRlbmRzIEJhc2Uge1xuICAgIHB1YmxpYyBjYWxjdWxhdGVDaGlsZHJlbihjaGlsZHJlbjogQXJyYXk8TW9ja1F0aUV4cHJlc3Npb248YW55Pj4pIHtcbiAgICAgIC8vIGNoaWxkcmVuIGNhbiBiZSBhIG1peCBvZiBxdGktZXhwcmVzc2lvbiBhbmQgcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uXG4gICAgICBjb25zdCB2YWx1ZXMgPSBjaGlsZHJlbi5tYXAoYyA9PiB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IGMgYXMgTW9ja1F0aUV4cHJlc3Npb248YW55PjtcbiAgICAgICAgaWYgKCFjb25kaXRpb24uY2FsY3VsYXRlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5jYWxjdWxhdGUoKTtcbiAgICAgICAgbGV0IHZhbCA9IGZhbHNlO1xuICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB2YWx1ZSB0byBib29sZWFuIGFuZCByZXR1cm4gbnVsbCBpZiBub3QgcG9zc2libGVcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgdmFsID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICB2YWwgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWwgaW4gcXRpLW9yLCBleHBlY3RlZCBib29sZWFuJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB2YWwgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlcy5ldmVyeShlID0+IHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSAnYm9vbGVhbicgJiYgZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBRdGlBbmQgfSBmcm9tICcuL3F0aS1hbmQnO1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktYW5kJywgUXRpQW5kKTtcblxuZXhwb3J0ICogZnJvbSAnLi9xdGktYW5kJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFuZCc6IFF0aUFuZDtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQmFzZVR5cGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aUJhc2VWYWx1ZSBleHRlbmRzIFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGUgPSAnc3RyaW5nJztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktYmFzZS12YWx1ZScsIFF0aUJhc2VWYWx1ZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpQ29udGFpbnMgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBmb3Igb3RoZXIgdHlwZXMgdGhhbiBkaXJlY3RlZFBhaXJcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSA9PT0gJ211bHRpcGxlJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICAgICAgY29uc3QgZW51bWVyYWJsZSA9IHByb2plY3Rpb24xLmZpbHRlcih4ID0+IHByb2plY3Rpb24yLmluY2x1ZGVzKHgpKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBlbnVtZXJhYmxlLmxlbmd0aCA+IDA7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB2YWx1ZTEuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMi5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ID09PSAnc2luZ2xlJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uMi5pbmNsdWRlcyhwcm9qZWN0aW9uMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICd1bnN1cHBvcnRlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgY29udGFpbnMsIG9ubHkgYmFzZVR5cGU6IGRpcmVjdGVkUGFpciBhbmQgY2FyZGluYWxpdHk6IG11bHRpcGxlIGlzIHN1cHBvcnRlZCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIGNvbnRhaW5zJyk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1jb250YWlucycsIFF0aUNvbnRhaW5zKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUNvcnJlY3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIGdldCBpbnRlcnByZXRhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ludGVycHJldGF0aW9uJykgfHwgJyc7XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZTogUmVzcG9uc2VWYXJpYWJsZSA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgICBpZiAocmVzcG9uc2VWYXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgIHJldHVybiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZS5sZW5ndGggPiAwID8gcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2VbMF0gOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1jb3JyZWN0JywgUXRpQ29ycmVjdCk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlFcXVhbFJvdW5kZWQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHJvdW5kaW5nTW9kZTogJ2RlY2ltYWxQbGFjZXMnIHwgJ3NpZ25pZmljYW50RmlndXJlcycgPSAnc2lnbmlmaWNhbnRGaWd1cmVzJztcblxuICBnZXQgZmlndXJlcygpIHtcbiAgICBjb25zdCBhdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpZ3VyZXMnKTtcbiAgICBpZiAoIWF0dHIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgYXR0cmlidXRlIGlzIG1pc3NpbmcnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBmaWd1cmVzID0gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpZ3VyZXMnKSB8fCAnMCcpO1xuICAgIGlmIChpc05hTihmaWd1cmVzKSkge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBhdHRyaWJ1dGUgaXMgbm90IGEgbnVtYmVyJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGZpZ3VyZXMgPCAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGF0dHJpYnV0ZSBpcyBuZWdhdGl2ZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChmaWd1cmVzIDwgMSAmJiB0aGlzLnJvdW5kaW5nTW9kZSA9PT0gJ3NpZ25pZmljYW50RmlndXJlcycpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxIGZvciBSb3VuZGluZ01vZGUgc2lnbmlmaWNhbnRGaWd1cmVzJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpZ3VyZXM7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodGhpcy5yb3VuZGluZ01vZGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgdmFsdWUyLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMS52YWx1ZSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIudmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgZXF1YWwnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh2YWx1ZXNbMF0uYmFzZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnaW50ZWdlcic6XG4gICAgICAgIGNhc2UgJ2Zsb2F0Jzoge1xuICAgICAgICAgIGNvbnN0IGZsb2F0MSA9IHBhcnNlRmxvYXQodmFsdWUxLnZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgICAgY29uc3QgZmxvYXQyID0gcGFyc2VGbG9hdCh2YWx1ZTIudmFsdWUgYXMgc3RyaW5nKTtcblxuICAgICAgICAgIGlmICghaXNOYU4oZmxvYXQxKSAmJiAhaXNOYU4oZmxvYXQyKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm91bmRpbmdNb2RlID09PSAnc2lnbmlmaWNhbnRGaWd1cmVzJykge1xuICAgICAgICAgICAgICByZXR1cm4gZmxvYXQxLnRvUHJlY2lzaW9uKHRoaXMuZmlndXJlcykgPT09IGZsb2F0Mi50b1ByZWNpc2lvbih0aGlzLmZpZ3VyZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGZsb2F0MSAqIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpKSAvIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpID09PVxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoZmxvYXQyICogTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcykpIC8gTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcylcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgdmFsdWUgY2Fubm90IGJlIGNhc3RlZCB0byBudW1lcmljIHZhbHVlIGluIGVxdWFsUm91bmRlZCBvcGVyYXRvcjogJHtmbG9hdDF9LCAke2Zsb2F0Mn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHZhbHVlcyBvdGhlciB0aGFuIGZsb2F0IGFuZCBpbnQgY2Fubm90IGJlIHVzZWQgaW4gZXF1YWxSb3VuZGVkIG9wZXJhdG9yLmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aS1lcXVhbC1yb3VuZGVkJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZXF1YWwtcm91bmRlZCcsIFF0aUVxdWFsUm91bmRlZCk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUVxdWFsIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0b2xlcmFuY2VNb2RlOiAnZXhhY3QnIHwgJ3JlbGF0aXZlJyB8ICdhYnNvbHV0ZScgPSAnZXhhY3QnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh0aGlzLnRvbGVyYW5jZU1vZGUgIT09ICdleGFjdCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndG9sZXJhbmNlTW9kZSBpcyBub3Qgc3VwcG9ydGVkIHlldCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgdmFsdWUyLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMS52YWx1ZSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIudmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgZXF1YWwnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyh2YWx1ZTEudmFsdWUgYXMgc3RyaW5nLCB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nLCB2YWx1ZTEuYmFzZVR5cGUpO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGktZXF1YWwnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1lcXVhbCcsIFF0aUVxdWFsKTtcbiIsICJpbXBvcnQgeyBCYXNlVHlwZSB9IGZyb20gJy4uLy4uJztcblxuZXhwb3J0IGNsYXNzIFNjb3JpbmdIZWxwZXIge1xuICBwdWJsaWMgc3RhdGljIGNvbXBhcmVTaW5nbGVWYWx1ZXModmFsdWUxOiBSZWFkb25seTxzdHJpbmc+LCB2YWx1ZTI6IFJlYWRvbmx5PHN0cmluZz4sIGJhc2VUeXBlOiBCYXNlVHlwZSk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAoYmFzZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2lkZW50aWZpZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgcmV0dXJuIHZhbHVlMSA9PT0gdmFsdWUyO1xuICAgICAgY2FzZSAnaW50ZWdlcic6IHtcbiAgICAgICAgY29uc3QgaW50MSA9IHBhcnNlSW50KHZhbHVlMSwgMTApO1xuICAgICAgICBjb25zdCBpbnQyID0gcGFyc2VJbnQodmFsdWUyLCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4oaW50MSkgJiYgIWlzTmFOKGludDIpKSB7XG4gICAgICAgICAgcmV0dXJuIGludDEgPT09IGludDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgQ2Fubm90IGNvbnZlcnQgJHt2YWx1ZTF9IGFuZC9vciAke3ZhbHVlMn0gdG8gaW50LmApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZmxvYXQnOiB7XG4gICAgICAgIGNvbnN0IGZsb2F0MSA9IHBhcnNlRmxvYXQodmFsdWUxKTtcbiAgICAgICAgY29uc3QgZmxvYXQyID0gcGFyc2VGbG9hdCh2YWx1ZTIpO1xuICAgICAgICBpZiAoIWlzTmFOKGZsb2F0MSkgJiYgIWlzTmFOKGZsb2F0MikpIHtcbiAgICAgICAgICByZXR1cm4gZmxvYXQxID09PSBmbG9hdDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgY291bGRuJ3QgY29udmVydCAke3ZhbHVlMX0gYW5kL29yICR7dmFsdWUyfSB0byBmbG9hdC5gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3BhaXInOlxuICAgICAgY2FzZSAnZGlyZWN0ZWRQYWlyJzoge1xuICAgICAgICBjb25zdCBwYWlyMSA9IHZhbHVlMS5zcGxpdCgnICcpLnNvcnQoKTtcbiAgICAgICAgY29uc3QgcGFpcjIgPSB2YWx1ZTIuc3BsaXQoJyAnKS5zb3J0KCk7XG4gICAgICAgIGlmIChwYWlyMS5sZW5ndGggPT09IDIgJiYgcGFpcjIubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgaWYgKGJhc2VUeXBlID09PSAncGFpcicpIHtcbiAgICAgICAgICAgIHBhaXIxLnNvcnQoKTtcbiAgICAgICAgICAgIHBhaXIyLnNvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHBhaXIxLmpvaW4oJyAnKSA9PT0gcGFpcjIuam9pbignICcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGNvbXBhcmVkIHR3byBwYWlyIGJ1dCBvbmUgb2YgdGhlIHZhbHVlcyBkb2VzIG5vdCBoYXZlIDIgdmFsdWVzOiAxOiAke3ZhbHVlMX0gMjogJHt2YWx1ZTJ9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpR3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlID4gK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGd0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZ3QnLCBRdGlHdCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpR3RlIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA+PSArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgZ3RlJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRlJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZ3RlJywgUXRpR3RlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUlzTnVsbCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBpZiAoIXZhcmlhYmxlcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGVzWzBdLnZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJztcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIE51bGwnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1pcy1udWxsJywgUXRpSXNOdWxsKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlMdCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPCArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgbHQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gbHQnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sdCcsIFF0aUx0KTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlMdGUgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlIDw9ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBsdGUnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBsdGUnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sdGUnLCBRdGlMdGUpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJ3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1hcFJlc3BvbnNlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQociA9PiByLmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik7XG4gICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgY29uc29sZS53YXJuKGBSZXNwb25zZSAke3RoaXMuaWRlbnRpZmllcn0gY2FuIG5vdCBiZSBmb3VuZGApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1hcHBpbmcgPSByZXNwb25zZS5tYXBwaW5nO1xuICAgIGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlcyA9ICFBcnJheS5pc0FycmF5KHJlc3BvbnNlLnZhbHVlKSA/IFtyZXNwb25zZS52YWx1ZV0gOiByZXNwb25zZS52YWx1ZTtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlIG9mIGNhbmRpZGF0ZVJlc3BvbnNlcykge1xuICAgICAgY29uc3QgbWFwcGVkVmFsdWUgPSBtYXBwaW5nLm1hcEVudHJpZXMuZmluZChlbnRyeSA9PiB7XG4gICAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoZW50cnkubWFwS2V5LCBjYW5kaWRhdGVSZXNwb25zZSwgcmVzcG9uc2UuYmFzZVR5cGUpO1xuICAgICAgfSk7XG4gICAgICBpZiAoIShtYXBwZWRWYWx1ZSA9PSBudWxsIHx8IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlID09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBpbmcuZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWFwcGluZy5sb3dlckJvdW5kICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IE1hdGgubWF4KG1hcHBpbmcubG93ZXJCb3VuZCwgcmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKG1hcHBpbmcudXBwZXJCb3VuZCAhPSBudWxsKSB7XG4gICAgICByZXN1bHQgPSBNYXRoLm1pbihtYXBwaW5nLnVwcGVyQm91bmQsIHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWFwLXJlc3BvbnNlJywgUXRpTWFwUmVzcG9uc2UpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlNYXBwaW5nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2RlZmF1bHQtdmFsdWUnLCB0eXBlOiBOdW1iZXIgfSkgZGVmYXVsdFZhbHVlOiBudW1iZXIgPSAwO1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdsb3dlci1ib3VuZCcsIHR5cGU6IE51bWJlciB9KSBsb3dlckJvdW5kOiBudW1iZXI7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJywgdHlwZTogTnVtYmVyIH0pIHVwcGVyQm91bmQ6IG51bWJlcjtcblxuICBwdWJsaWMgZ2V0IG1hcEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktbWFwLWVudHJ5JykpLm1hcChlbCA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXBLZXk6IGVsLmdldEF0dHJpYnV0ZSgnbWFwLWtleScpLFxuICAgICAgICBtYXBwZWRWYWx1ZTogK2VsLmdldEF0dHJpYnV0ZSgnbWFwcGVkLXZhbHVlJylcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWFwcGluZycsIFF0aU1hcHBpbmcpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTWF0Y2ggZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgLy9QSyA6IEZJWE1FLlxuICAvLyBUaGlzIHdhcyBhIGxpdHRsZSBleHBlcmltZW50IGlmIHdlIGNvdWxkIGNhbGwgdGhlIG1hdGNoIGZ1bmN0aW9uIGFzIGEgc3RhdGljIGZ1bmN0aW9uLFxuICAvLyBUaGlzIGNhbiBiZSB1c2VkIGZvciBhbGwga2luZCBvZiB0aGluZ3MsIGJ1dCBub3cgZXNwZWNpYWxseSBmb3IgdXNlIGluXG4gIC8vIHF0aS1yZXNwb25zZS1jb25kaXRpb24tc2NyaXB0XG4gIC8vIGluIHdoaWNoIHdlIHBhc3MgdGhlIGV4cHJlc3Npb25zIGFzIHB1cmUgZnVuY3Rpb25zLCBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuXG4gIC8vIFNBRExZLCB0aGUgZ2V0VmFyaWFibGVzIHRocm93cyByb2V0IGluIGRlIGV0ZW4uLiB3ZWV0IG5vZyBuaWV0IHByZWNpZXMgaG9lIGRlemUgd2Vya3QuXG4gIC8vIE1hYXIgaWsgZ2EgZXJpbiBkdWlrZW4uXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlVG9NYXAgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCBjb3JyZWN0VmFsdWVJbmZvID0gdmFsdWVzWzFdO1xuICAgICAgcmV0dXJuIFF0aU1hdGNoLm1hdGNoKHZhbHVlVG9NYXAsIGNvcnJlY3RWYWx1ZUluZm8pO1xuICAgIH1cblxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIG1hdGNoJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG1hdGNoKHZhbHVlVG9NYXA6IFJlc3BvbnNlVmFyaWFibGUsIGNvcnJlY3RWYWx1ZUluZm86IFJlc3BvbnNlVmFyaWFibGUpIHtcbiAgICBzd2l0Y2ggKGNvcnJlY3RWYWx1ZUluZm8uY2FyZGluYWxpdHkpIHtcbiAgICAgIGNhc2UgJ3NpbmdsZSc6IHtcbiAgICAgICAgaWYgKHZhbHVlVG9NYXAudmFsdWUgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoXG4gICAgICAgICAgdmFsdWVUb01hcC52YWx1ZT8udG9TdHJpbmcoKSxcbiAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdvcmRlcmVkJzoge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZS5sZW5ndGggIT09IGNvcnJlY3RWYWx1ZUluZm8udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVUb01hcC52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhcbiAgICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8udmFsdWVbaV0sXG4gICAgICAgICAgICB2YWx1ZVRvTWFwLnZhbHVlW2ldLFxuICAgICAgICAgICAgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ211bHRpcGxlJzoge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZS5sZW5ndGggIT09IGNvcnJlY3RWYWx1ZUluZm8udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbnN3ZXJJbmRleCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgY29ycmVjdEFuc3dlciBvZiBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSB7XG4gICAgICAgICAgbGV0IG1hdGNoaW5nVmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICAgIGNvbnN0IGFyciA9IFsuLi52YWx1ZVRvTWFwLnZhbHVlXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG12IG9mIGFycikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKGNvcnJlY3RBbnN3ZXIsIG12LCBjb3JyZWN0VmFsdWVJbmZvLmJhc2VUeXBlKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgbWF0Y2hpbmdWYWx1ZSA9IG12O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1hdGNoaW5nVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIChhcnIgYXMgc3RyaW5nW10pLnNwbGljZShhcnIuaW5kZXhPZihtYXRjaGluZ1ZhbHVlKSwgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYW5zd2VySW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tYXRjaCcsIFF0aU1hdGNoKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlNZW1iZXIgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4gfCBudWxsPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG5cbiAgICBpZiAoISh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIG1lbWJlciBvcGVyYXRvciB0YWtlcyB0d28gc3ViLWV4cHJlc3Npb25zJyk7XG4gICAgfVxuXG4gICAgY29uc3QgW3ZhbHVlMSwgdmFsdWUyXSA9IHZhbHVlcztcblxuICAgIGlmICghKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlKSkge1xuICAgICAgY29uc29sZS53YXJuKCdXaGljaCBtdXN0IGJvdGggaGF2ZSB0aGUgc2FtZSBiYXNlLXR5cGUnKTtcbiAgICB9XG4gICAgaWYgKCEodmFsdWUyLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnIHx8IHZhbHVlMi5jYXJkaW5hbGl0eSA9PT0gJ29yZGVyZWQnKSkge1xuICAgICAgY29uc29sZS53YXJuKCdhbmQgdGhlIHNlY29uZCBtdXN0IGJlIGEgbXVsdGlwbGUgb3Igb3JkZXJlZCBjb250YWluZXInKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JyB8fCB2YWx1ZTIuYmFzZVR5cGUgPT09ICdmbG9hdCcpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIG1lbWJlciBvcGVyYXRvciBzaG91bGQgbm90IGJlIHVzZWQgb24gc3ViLWV4cHJlc3Npb25zIHdpdGggYSBiYXNlLXR5cGUgb2YgZmxvYXQnKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2R1cmF0aW9uJyB8fCB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkdXJhdGlvbicpIHtcbiAgICAgIGNvbnNvbGUud2FybignSXQgbXVzdCBub3QgYmUgdXNlZCBvbiBzdWItZXhwcmVzc2lvbnMgd2l0aCBhIGJhc2UtdHlwZSBvZiBkdXJhdGlvbicpO1xuICAgIH1cblxuICAgIC8vIElmIGVpdGhlciBzdWItZXhwcmVzc2lvbiBpcyBOVUxMIHRoZW4gdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0b3IgaXMgTlVMTFxuICAgIGlmICh2YWx1ZTEudmFsdWUgPT09IG51bGwgfHwgdmFsdWUyLnZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVzdWx0IGlzIGEgc2luZ2xlIGJvb2xlYW4gd2l0aCBhIHZhbHVlIG9mICd0cnVlJyBpZiB0aGUgdmFsdWUgZ2l2ZW4gYnkgdGhlIGZpcnN0IHN1Yi1leHByZXNzaW9uIGlzIGluIHRoZSBjb250YWluZXIgZGVmaW5lZCBieSB0aGUgc2Vjb25kIHN1Yi1leHByZXNzaW9uLlxuICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZztcbiAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICByZXR1cm4gcHJvamVjdGlvbjIuaW5jbHVkZXMocHJvamVjdGlvbjEpO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1lbWJlcicsIFF0aU1lbWJlcik7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSwgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aU11bHRpcGxlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPltdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogUmVzcG9uc2VWYXJpYWJsZVtdIHtcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodmFyaWFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB2YXJpYWJsZXMpIHtcbiAgICAgIGlmICh2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ211bHRpcGxlJyAmJiB2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbXVsdGlwbGUnKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0IHZhbHVlcyA9IHZhcmlhYmxlcy5tYXAodiA9PiB2LnZhbHVlKTtcbiAgICAvLyBjb25zb2xlLmxvZyh2YXJpYWJsZXMpO1xuICAgIC8vIGNvbnN0IGZsYXR0ZW5lZEFycmF5ID0gdmFsdWVzLnJlZHVjZSgoYWNjOiBzdHJpbmdbXSwgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG4gICAgLy8gICByZXR1cm4gYWNjLmNvbmNhdChBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiB2YWx1ZSk7XG4gICAgLy8gfSwgW10pO1xuICAgIC8vIHJldHVybiBmbGF0dGVuZWRBcnJheTtcblxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbXVsdGlwbGUnLCBRdGlNdWx0aXBsZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTm90IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAke3N1cGVyLnJlbmRlcigpfWA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj47XG4gICAgY29uc3QgcmVzdWx0ID0gZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSBhcyBib29sZWFuO1xuICAgIHJldHVybiAhcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW5vdCcsIFF0aU5vdCk7XG4iLCAiaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpT3IgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikubWFwKGMgPT4ge1xuICAgICAgY29uc3QgY29uZGl0aW9uID0gYyBhcyBRdGlFeHByZXNzaW9uPGFueT47XG4gICAgICBpZiAoIWNvbmRpdGlvbi5jYWxjdWxhdGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5jYWxjdWxhdGUoKTtcbiAgICAgIGxldCB2YWwgPSBmYWxzZTtcbiAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHZhbHVlIHRvIGJvb2xlYW4gYW5kIHJldHVybiBudWxsIGlmIG5vdCBwb3NzaWJsZVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICB2YWwgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgdmFsID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWwgaW4gcXRpLW9yLCBleHBlY3RlZCBib29sZWFuJyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIHZhbCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMuc29tZShlID0+IHtcbiAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gJ2Jvb2xlYW4nICYmIGU7XG4gICAgfSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktb3InLCBRdGlPcik7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aU9yZGVyZWQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPFJlc3BvbnNlVmFyaWFibGVbXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IFJlc3BvbnNlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHZhcmlhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBtdWx0aXBsZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgdmFyaWFibGVzKSB7XG4gICAgICBpZiAodmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdvcmRlcmVkJyAmJiB2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgb3JkZXJlZCcpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktb3JkZXJlZCcsIFF0aU9yZGVyZWQpO1xuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICdzcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlQcmludGVkVmFyaWFibGUgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIGNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpPy52YWx1ZTtcbiAgICByZXR1cm4gaHRtbGAke0pTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKX1gO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wcmludGVkLXZhcmlhYmxlJywgUXRpUHJpbnRlZFZhcmlhYmxlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlQcm9kdWN0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBjb25zdCBwcm9kdWN0ID0gdmFsdWVzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZS5iYXNlVHlwZSA9PSAnZmxvYXQnIHx8IGN1cnJlbnRWYWx1ZS5iYXNlVHlwZSA9PSAnaW50ZWdlcicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3IgKiBwYXJzZUludChjdXJyZW50VmFsdWUudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBjYW4gbm90IGNvbnZlcnQgdG8gbnVtYmVyYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgaGFzIGFub3RoZXIgYmFzZVR5cGUgJHtjdXJyZW50VmFsdWUuYmFzZVR5cGV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfSwgMSk7XG4gICAgcmV0dXJuIHByb2R1Y3Q7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcHJvZHVjdCcsIFF0aVByb2R1Y3QpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlTdHJpbmdNYXRjaCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Nhc2Utc2Vuc2l0aXZlJyB9KSBjYXNlU2Vuc2l0aXZlID0gJ3RydWUnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICB2YWx1ZTIuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUxLnZhbHVlKSB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBzdHJpbmctbWF0Y2gnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgdjEgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09ICd0cnVlJyA/IHZhbHVlMS52YWx1ZSA6ICh2YWx1ZTEudmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgdjIgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09ICd0cnVlJyA/IHZhbHVlMi52YWx1ZSA6ICh2YWx1ZTIudmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyh2MSBhcyBzdHJpbmcsIHYyIGFzIHN0cmluZywgdmFsdWUxLmJhc2VUeXBlKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLXN0cmluZy1tYXRjaCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXN0cmluZy1tYXRjaCcsIFF0aVN0cmluZ01hdGNoKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVN1bSBleHRlbmRzIFF0aUV4cHJlc3Npb248bnVtYmVyPiB7XG4gIHByaXZhdGUgX2V4cHJlc3Npb246IFF0aVN1bUV4cHJlc3Npb247XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZXhwcmVzc2lvbiA9IG5ldyBRdGlTdW1FeHByZXNzaW9uKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbiBhcyB1bmtub3duIGFzIFF0aUV4cHJlc3Npb25CYXNlPG51bWJlcj5bXSkpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZXhwcmVzc2lvbi5jYWxjdWxhdGUoKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF0aVN1bUV4cHJlc3Npb24gaW1wbGVtZW50cyBRdGlFeHByZXNzaW9uQmFzZTxudW1iZXI+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uczogUXRpRXhwcmVzc2lvbkJhc2U8bnVtYmVyPltdKSB7fVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5leHByZXNzaW9ucy5tYXAoYyA9PiB7XG4gICAgICBpZiAoIWMuY2FsY3VsYXRlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBjLmNhbGN1bGF0ZSgpO1xuICAgICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWx1ZSBpbiBxdGktc3VtLCBleHBlY3RlZCBudW1iZXInKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc3VtJywgUXRpU3VtKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpVmFyaWFibGUgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKS52YWx1ZVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktdmFyaWFibGUnLCBRdGlWYXJpYWJsZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IElNU3BjaSwgTW9kdWxlUmVzb2x1dGlvbkNvbmZpZywgUXRpVmFyaWFibGVKU09OIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5kZWNsYXJlIGNvbnN0IHJlcXVpcmVqczogYW55O1xuZGVjbGFyZSBjb25zdCBkZWZpbmU6IGFueTtcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHByaXZhdGUgaW50ZXJ2YWxJZDogYW55O1xuICBwcml2YXRlIHJhd1Jlc3BvbnNlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBwY2k6IElNU3BjaTx1bmtub3duPjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ21vZHVsZScgfSlcbiAgbW9kdWxlOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjdXN0b20taW50ZXJhY3Rpb24tdHlwZS1pZGVudGlmaWVyJyB9KVxuICBjdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBudWxsO1xuXG4gIHByaXZhdGUgY29udmVydFF0aVZhcmlhYmxlSlNPTihpbnB1dDogUXRpVmFyaWFibGVKU09OKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIGZvciAoY29uc3QgdG9wTGV2ZWxLZXkgaW4gaW5wdXQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIGlmIChpbnB1dC5oYXNPd25Qcm9wZXJ0eSh0b3BMZXZlbEtleSkpIHtcbiAgICAgICAgY29uc3QgbmVzdGVkT2JqZWN0ID0gaW5wdXRbdG9wTGV2ZWxLZXkgYXMgJ2xpc3QnIHwgJ2Jhc2UnXTtcbiAgICAgICAgaWYgKG5lc3RlZE9iamVjdCkge1xuICAgICAgICAgIGZvciAoY29uc3QgbmVzdGVkS2V5IGluIG5lc3RlZE9iamVjdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICAgICAgaWYgKG5lc3RlZE9iamVjdC5oYXNPd25Qcm9wZXJ0eShuZXN0ZWRLZXkpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbmVzdGVkT2JqZWN0W25lc3RlZEtleSBhcyBrZXlvZiB0eXBlb2YgbmVzdGVkT2JqZWN0XTtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcChTdHJpbmcpOyAvLyBDb252ZXJ0IGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgdG8gc3RyaW5nXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpOyAvLyBDb252ZXJ0IHRoZSBzaW5nbGUgdmFsdWUgdG8gc3RyaW5nXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0Q2hlY2tpbmcoKTogdm9pZCB7XG4gICAgLy8gYmVjYXVzZSB0aGUgcGNpIGRvZXNuJ3QgaGF2ZSBhIG1ldGhvZCB0byBjaGVjayBmb3IgY2hhbmdlcyB3ZSdsbCB1c2UgYW4gaW50ZXJ2YWxcbiAgICAvLyB0byBjaGVjayBpZiB0aGUgcmVzcG9uc2UgaGFzIGNoYW5nZWQuIElmIGNoYW5nZWQgd2UnbGwgc2F2ZSB0aGUgcmVzcG9uc2VcbiAgICB0aGlzLmludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMucGNpLmdldFJlc3BvbnNlKCk7XG4gICAgICBjb25zdCBuZXdSZXNwb25zZSA9IHRoaXMucGNpLmdldFJlc3BvbnNlKCk7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlKTtcbiAgICAgIGlmIChzdHJpbmdpZmllZCAhPT0gdGhpcy5yYXdSZXNwb25zZSkge1xuICAgICAgICB0aGlzLnJhd1Jlc3BvbnNlID0gc3RyaW5naWZpZWQ7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb252ZXJ0UXRpVmFyaWFibGVKU09OKG5ld1Jlc3BvbnNlKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSwgMjAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcENoZWNraW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludGVydmFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlOyAvLyBGT1IgTk9XXG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAvLyBPbmx5IHNldCBzdGF0ZSBpcyBzdXBwb3J0ZWQgaW4gYSBQQ0lcbiAgfVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJhd1Jlc3BvbnNlO1xuICB9XG5cbiAgZ2V0VEFPQ29uZmlnKG5vZGUpIHtcbiAgICBjb25zdCBhID0gbm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdwcm9wZXJ0aWVzJyk7XG4gICAgbGV0IGNvbmZpZyA9IHt9O1xuXG4gICAgY29uc3QgZ2V0UHJvcGVydHlWYWx1ZSA9IGVsID0+IHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0ge307XG4gICAgICBjb25zdCBrZXkgPSBlbC5nZXRBdHRyaWJ1dGUoJ2tleScpO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZWwuY2hpbGRyZW4pO1xuICAgICAgICBjb25zdCBhbGxLZXkgPSBjaGlsZHJlbi5tYXAoKGM6IEhUTUxFbGVtZW50KSA9PiBjLmdldEF0dHJpYnV0ZSgna2V5JykpO1xuICAgICAgICBjb25zdCBpc0FycmF5ID0gYWxsS2V5Lmxlbmd0aCA+IDAgJiYgIWFsbEtleS5maW5kKGsgPT4gIU51bWJlci5pc0ludGVnZXIoK2spKTtcbiAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICBwcm9wZXJ0eVtrZXldID0gY2hpbGRyZW4ubWFwKGMgPT4gZ2V0Q2hpbGRQcm9wZXJ0aWVzKGMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wZXJ0eVtrZXldID0gZWwudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0Q2hpbGRQcm9wZXJ0aWVzID0gKGVsKToge30gfCB2b2lkID0+IHtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBsZXQgcHJvcGVydGllcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsLmNoaWxkcmVuKSB7XG4gICAgICAgICAgcHJvcGVydGllcyA9IHsgLi4ucHJvcGVydGllcywgLi4uZ2V0UHJvcGVydHlWYWx1ZShjaGlsZCkgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0aWVzIG9mIGEpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnRpZXMuZ2V0QXR0cmlidXRlKCdrZXknKTtcbiAgICAgIGlmICgha2V5KSB7XG4gICAgICAgIGNvbmZpZyA9IHsgLi4uY29uZmlnLCAuLi5nZXRDaGlsZFByb3BlcnRpZXMocHJvcGVydGllcykgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdDYW4gbm90IGZpbmQgcXRpLWN1c3RvbS1pbnRlcmFjdGlvbiBjb25maWcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJlZ2lzdGVyKHBjaTogSU1TcGNpPHVua25vd24+KSB7XG4gICAgdGhpcy5wY2kgPSBwY2k7XG5cbiAgICBjb25zdCB0eXBlID0gdGhpcy5wYXJlbnRFbGVtZW50LnRhZ05hbWUgPT09ICdRVEktQ1VTVE9NLUlOVEVSQUNUSU9OJyA/ICdUQU8nIDogJ0lNUyc7XG4gICAgY29uc3QgZG9tOiBIVE1MRWxlbWVudCA9XG4gICAgICB0eXBlID09ICdJTVMnID8gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktaW50ZXJhY3Rpb24tbWFya3VwJykgOiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ21hcmt1cCcpO1xuICAgIGRvbS5jbGFzc0xpc3QuYWRkKCdxdGktY3VzdG9tSW50ZXJhY3Rpb24nKTtcblxuICAgIGlmICh0eXBlID09ICdUQU8nICYmIHRoaXMucXVlcnlTZWxlY3RvcigncHJvcGVydGllcycpKSB7XG4gICAgICAodGhpcy5xdWVyeVNlbGVjdG9yKCdwcm9wZXJ0aWVzJykgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBhbnkgPVxuICAgICAgdHlwZSA9PSAnSU1TJ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHRoaXMuZGF0YXNldCxcbiAgICAgICAgICAgIG9ucmVhZHk6ICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ29ucmVhZHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogdGhpcy5nZXRUQU9Db25maWcodGhpcyk7XG4gICAgaWYgKHR5cGUgPT0gJ0lNUycpIHtcbiAgICAgIHBjaS5nZXRJbnN0YW5jZShkb20sIGNvbmZpZywgdW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgKHBjaSBhcyBhbnkpLmluaXRpYWxpemUodGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyLCBkb20uZmlyc3RFbGVtZW50Q2hpbGQsIGNvbmZpZyk7XG4gICAgfVxuICAgIGlmICh0eXBlID09ICdUQU8nKSB7XG4gICAgICBjb25zdCBsaW5rcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rJykpLm1hcChhY2MgPT4gYWNjLmdldEF0dHJpYnV0ZSgnaHJlZicpKTtcbiAgICAgIGxpbmtzLmZvckVhY2gobGluayA9PiB7XG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgc3R5bGVzLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgc3R5bGVzLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgICBzdHlsZXMubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgICAgc3R5bGVzLmhyZWYgPSBsaW5rO1xuICAgICAgICBkb20uYXBwZW5kQ2hpbGQoc3R5bGVzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0Q2hlY2tpbmcoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBkZWZpbmUoJ3F0aUN1c3RvbUludGVyYWN0aW9uQ29udGV4dCcsICgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZ2lzdGVyOiBjdHhBID0+IHtcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyKGN0eEEpO1xuICAgICAgICB9LFxuICAgICAgICBub3RpZnlSZWFkeTogKCkgPT4ge1xuICAgICAgICAgIC8qIG9ubHkgdXNlZCBpbiB0aGUgVEFPIHZlcnNpb24gKi9cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuYnVpbGRSZXF1aXJlQ29uZmlnKCk7XG4gICAgY29uc3QgcmVxdWlyZVBDSSA9IHJlcXVpcmVqcy5jb25maWcoY29uZmlnKTtcbiAgICByZXF1aXJlUENJKFsncmVxdWlyZSddLCByZXF1aXJlID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZHluYW1pYy1yZXF1aXJlXG4gICAgICByZXF1aXJlKFt0aGlzLm1vZHVsZV0pO1xuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICByZXF1aXJlanMudW5kZWYodGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyKTtcbiAgICAvLyBDbGVhciB0aGUgbW9kdWxlcyBpbiB0aGUgY29udGV4dFxuICAgIGNvbnN0IGNvbnRleHQgPSByZXF1aXJlanMucy5jb250ZXh0cztcbiAgICBkZWxldGUgY29udGV4dFt0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXJdO1xuICAgIHRoaXMuc3RvcENoZWNraW5nKCk7XG4gIH1cblxuICBidWlsZFJlcXVpcmVDb25maWcoKSB7XG4gICAgLy8gU2V0IFJlcXVpcmVKUyBwYXRocyBhbmQgc2hpbSBjb25maWd1cmF0aW9uIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNvbmZpZzogTW9kdWxlUmVzb2x1dGlvbkNvbmZpZyA9IHtcbiAgICAgIGNvbnRleHQ6IHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcixcbiAgICAgIGNhdGNoRXJyb3I6IHRydWUsXG4gICAgICBwYXRoczogd2luZG93WydyZXF1aXJlUGF0aHMnXSB8fCB7fSxcbiAgICAgIHNoaW06IHdpbmRvd1sncmVxdWlyZVNoaW0nXSB8fCB7fVxuICAgIH07XG4gICAgLy8gQ2hlY2sgaWYgUmVxdWlyZUpTIGlzIGF2YWlsYWJsZSwgaWYgbm90LCBzZXQgYW4gZXJyb3IgbWVzc2FnZVxuICAgIGlmICghZ2xvYmFsVGhpcy5yZXF1aXJlKSB7XG4gICAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBgUmVxdWlyZUpTIG5vdCBmb3VuZC4gUGxlYXNlIGxvYWQgaXQgdmlhIENETjogaHR0cHM6Ly9jZG5qcy5jb20vbGlicmFyaWVzL3JlcXVpcmUuanNgO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLXVybCcpO1xuICAgIGNvbnN0IGludGVyYWN0aW9uTW9kdWxlcyA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVyYWN0aW9uLW1vZHVsZXMnKTtcblxuICAgIGlmIChpbnRlcmFjdGlvbk1vZHVsZXMpIHtcbiAgICAgIGNvbnN0IG1vZHVsZXMgPSBpbnRlcmFjdGlvbk1vZHVsZXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWludGVyYWN0aW9uLW1vZHVsZScpO1xuICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgICBjb25zdCBtb2R1bGVJZCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG4gICAgICAgIGNvbnN0IHByaW1hcnlQYXRoID0gbW9kdWxlLmdldEF0dHJpYnV0ZSgncHJpbWFyeS1wYXRoJyk7XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrUGF0aCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ2ZhbGxiYWNrLXBhdGgnKTtcblxuICAgICAgICBpZiAobW9kdWxlSWQgJiYgcHJpbWFyeVBhdGgpIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHBhdGhzIHVzaW5nIFJlcXVpcmVKUydzIGZhbGxiYWNrIGFycmF5XG4gICAgICAgICAgY29uc3QgcGF0aHMgPSBmYWxsYmFja1BhdGhcbiAgICAgICAgICAgID8gdGhpcy5jb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlc29sdmFibGVQYXRoKHByaW1hcnlQYXRoLCBiYXNlVXJsKSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlc29sdmFibGVQYXRoKGZhbGxiYWNrUGF0aCwgYmFzZVVybClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLmdldFJlc29sdmFibGVQYXRoKHByaW1hcnlQYXRoLCBiYXNlVXJsKTtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1BhdGggPSBjb25maWcucGF0aHNbbW9kdWxlSWRdIHx8IFtdO1xuICAgICAgICAgIGNvbmZpZy5wYXRoc1ttb2R1bGVJZF0gPSB0aGlzLmNvbWJpbmVSZXF1aXJlUmVzb2x2ZVBhdGhzKGV4aXN0aW5nUGF0aCwgcGF0aHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIGNvbWJpbmVSZXF1aXJlUmVzb2x2ZVBhdGhzKHBhdGgxOiBzdHJpbmcgfCBzdHJpbmdbXSwgcGF0aDI6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcGF0aDFBcnJheSA9IEFycmF5LmlzQXJyYXkocGF0aDEpID8gcGF0aDEgOiBbcGF0aDFdO1xuICAgIGNvbnN0IHBhdGgyQXJyYXkgPSBBcnJheS5pc0FycmF5KHBhdGgyKSA/IHBhdGgyIDogW3BhdGgyXTtcbiAgICByZXR1cm4gcGF0aDFBcnJheS5jb25jYXQocGF0aDJBcnJheSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURvdWJsZVNsYXNoZXMoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaW5nbGVGb3J3YXJkU2xhc2hlcyA9IHN0clxuICAgICAgLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgJyQxJylcbiAgICAgIC5yZXBsYWNlKC9cXC9cXC8vZywgJy8nKVxuICAgICAgLnJlcGxhY2UoJ2h0dHA6LycsICdodHRwOi8vJylcbiAgICAgIC5yZXBsYWNlKCdodHRwczovJywgJ2h0dHBzOi8vJyk7XG4gICAgcmV0dXJuIHNpbmdsZUZvcndhcmRTbGFzaGVzO1xuICB9XG5cbiAgbG9hZENvbmZpZyA9IGFzeW5jICh1cmw6IHN0cmluZywgYmFzZVVybD86IHN0cmluZyk6IFByb21pc2U8TW9kdWxlUmVzb2x1dGlvbkNvbmZpZz4gPT4ge1xuICAgIHVybCA9IHRoaXMucmVtb3ZlRG91YmxlU2xhc2hlcyh1cmwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1aXJlQ29uZmlnID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgIGlmIChyZXF1aXJlQ29uZmlnLm9rKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlcXVpcmVDb25maWcuanNvbigpO1xuICAgICAgICBjb25zdCBtb2R1bGVDb25nID0gY29uZmlnIGFzIE1vZHVsZVJlc29sdXRpb25Db25maWc7XG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlSWQgaW4gbW9kdWxlQ29uZy5wYXRocykge1xuICAgICAgICAgIGlmIChiYXNlVXJsKSB7XG4gICAgICAgICAgICBtb2R1bGVDb25nLnBhdGhzW21vZHVsZUlkXSA9IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGgobW9kdWxlQ29uZy5wYXRoc1ttb2R1bGVJZF0sIGJhc2VVcmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kdWxlQ29uZztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGdldFJlc29sdmFibGVQYXRoU3RyaW5nID0gKHBhdGg6IHN0cmluZywgYmFzZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC5qcyQvLCAnJyk7XG4gICAgcmV0dXJuIHBhdGg/LnRvTG9jYWxlTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnaHR0cCcpIHx8ICFiYXNlUGF0aFxuICAgICAgPyBwYXRoXG4gICAgICA6IHRoaXMucmVtb3ZlRG91YmxlU2xhc2hlcyhgJHtiYXNlUGF0aH0vJHtwYXRofWApO1xuICB9O1xuXG4gIGdldFJlc29sdmFibGVQYXRoID0gKHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCBiYXNlUGF0aD86IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGgpXG4gICAgICA/IHBhdGgubWFwKHAgPT4gdGhpcy5nZXRSZXNvbHZhYmxlUGF0aFN0cmluZyhwLCBiYXNlUGF0aCkpXG4gICAgICA6IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGhTdHJpbmcocGF0aCwgYmFzZVBhdGgpO1xuICB9O1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+JHt0aGlzLl9lcnJvck1lc3NhZ2UgJiZcbiAgICAgIGh0bWxgPGRpdiBzdHlsZT1cImNvbG9yOnJlZFwiPlxuICAgICAgICA8aDE+RXJyb3I8L2gxPlxuICAgICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZX1cbiAgICAgIDwvZGl2PmB9YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJzogUXRpUG9ydGFibGVDdXN0b21JbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IENTU1Jlc3VsdEdyb3VwLCBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcblxuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSB9IGZyb20gJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24uc3R5bGVzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUFzc29jaWF0ZUludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKFxuICBJbnRlcmFjdGlvbixcbiAgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLFxuICB0cnVlLFxuICAnLmRsJ1xuKSB7XG4gIEBzdGF0ZSgpIHByaXZhdGUgX2NoaWxkcmVuTWFwOiBFbGVtZW50W10gPSBbXTtcblxuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcbiAgLy8gZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2VIYW5kbGVyOiAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJDaG9pY2VIYW5kbGVyID0gdGhpcy5fcmVnaXN0ZXJDaG9pY2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLCB0aGlzLl9yZWdpc3RlckNob2ljZUhhbmRsZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2UoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgY29uc3QgY2hvaWNlID0gZXZlbnQudGFyZ2V0IGFzIFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U7XG4gICAgdGhpcy5fY2hpbGRyZW5NYXAucHVzaChjaG9pY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHNsb3QgbmFtZT1cInF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2VcIj48L3Nsb3Q+XG4gICAgICA8ZGl2IHBhcnQ9XCJkcm9wLWNvbnRhaW5lclwiPlxuICAgICAgICAke3RoaXMuX2NoaWxkcmVuTWFwLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgQXJyYXkuZnJvbShBcnJheShNYXRoLmNlaWwodGhpcy5fY2hpbGRyZW5NYXAubGVuZ3RoIC8gMikpLmtleXMoKSkubWFwKFxuICAgICAgICAgIChfLCBpbmRleCkgPT5cbiAgICAgICAgICAgIGh0bWxgPGRpdiBwYXJ0PVwiYXNzb2NpYWJsZXMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgbmFtZT1cImxlZnQke2luZGV4fVwiIHBhcnQ9XCJkcm9wLWxpc3RcIiBjbGFzcz1cImRsXCIgaWRlbnRpZmllcj1cImRyb3BsaXN0JHtpbmRleH1fbGVmdFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IG5hbWU9XCJyaWdodCR7aW5kZXh9XCIgcGFydD1cImRyb3AtbGlzdFwiIGNsYXNzPVwiZGxcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2luZGV4fV9yaWdodFwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICApfVxuICAgICAgPC9kaXY+YDtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJywgdGhpcy5fcmVnaXN0ZXJDaG9pY2VIYW5kbGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzb2NpYXRlLWludGVyYWN0aW9uJzogUXRpQXNzb2NpYXRlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJleHBvcnQgY2xhc3MgVG91Y2hEcmFnQW5kRHJvcCB7XG4gIHByaXZhdGUgdG91Y2hTdGFydFRpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgdGhlIGZpcnN0IHRvdWNoXG4gIHByaXZhdGUgdG91Y2hTdGFydFBvaW50ID0gbnVsbDsgLy8gUG9pbnQgb2YgdGhlIGZpcnN0IHRvdWNoXG4gIHByaXZhdGUgbGFzdENsaWNrVGltZSA9IDA7IC8vIFRpbWVzdGFtcCBvZiB0aGUgcHJldmlvdXMgY2xpY2tcbiAgcHJpdmF0ZSBpc0RyYWdnYWJsZSA9IGZhbHNlOyAvLyBXaGV0aGVyIGEgZHJhZ2dhYmxlIGVsZW1lbnQgaXMgYWN0aXZlXG4gIHByaXZhdGUgZHJhZ1NvdXJjZTogSFRNTEVsZW1lbnQgPSBudWxsOyAvLyBUaGUgc291cmNlIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZFxuICBwcml2YXRlIGRyYWdDbG9uZTogSFRNTEVsZW1lbnQgPSBudWxsOyAvLyBDbG9uZSBvZiBkcmFnIHNvdXJjZSBmb3IgdmlzdWFsIGZlZWRiYWNrXG4gIHByaXZhdGUgdG91Y2hFbmRUcmlnZ2VyZWQgPSBmYWxzZTsgLy8gRmxhZyBmb3IgdG91Y2hFbmQgZXZlbnRcbiAgcHJpdmF0ZSBpc0RyYWdnaW5nID0gZmFsc2U7IC8vIFdoZXRoZXIgYSBkcmFnIG9wZXJhdGlvbiBpcyBvbmdvaW5nXG4gIHByaXZhdGUgaW5pdGlhbFRyYW5zZm9ybSA9ICcnOyAvLyBPcmlnaW5hbCB0cmFuc2Zvcm0gc3R5bGVcbiAgcHJpdmF0ZSBoYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0ID0gZmFsc2U7IC8vIEZsYWcgdG8gZW5zdXJlIGRyYWdzdGFydCBldmVudCBpcyBkaXNwYXRjaGVkIG9uY2VcbiAgcHJpdmF0ZSByb290Tm9kZTogTm9kZSA9IG51bGw7IC8vIFJvb3Qgbm9kZSBmb3IgYm91bmRhcnkgY2FsY3VsYXRpb25zXG5cbiAgcHJpdmF0ZSBmb2N1c2VkRWxlbWVudDogSFRNTEVsZW1lbnQgPSBudWxsOyAvLyBUbyBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50bHkgZm9jdXNlZCBkcmFnZ2FibGUgZWxlbWVudFxuICBwcml2YXRlIGZvY3VzYWJsZURyb3Bab25lczogSFRNTEVsZW1lbnRbXSA9IFtdOyAvLyBBbGwgZHJvcHpvbmVzIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gIHByaXZhdGUgY3VycmVudERyb3Bab25lSW5kZXggPSAtMTsgLy8gSW5kZXggZm9yIHRhYmJpbmcgdGhyb3VnaCBkcm9wIHpvbmVzXG5cbiAgcHJpdmF0ZSBkYXRhVHJhbnNmZXIgPSB7XG4gICAgZGF0YToge30sXG4gICAgc2V0RGF0YSh0eXBlLCB2YWwpIHtcbiAgICAgIHRoaXMuZGF0YVt0eXBlXSA9IHZhbDtcbiAgICB9LFxuICAgIGdldERhdGEodHlwZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0eXBlXTtcbiAgICB9LFxuICAgIGVmZmVjdEFsbG93ZWQ6ICdtb3ZlJ1xuICB9O1xuICBwcml2YXRlIGNsb25lT2Zmc2V0ID0geyB4OiAwLCB5OiAwIH07IC8vIE9mZnNldCBmb3IgcG9zaXRpb25pbmcgdGhlIGRyYWcgY2xvbmVcblxuICBwcml2YXRlIGxhc3RUYXJnZXQgPSBudWxsOyAvLyBMYXN0IHRvdWNoIHRhcmdldFxuICBwcml2YXRlIGN1cnJlbnREcm9wVGFyZ2V0ID0gbnVsbDsgLy8gQ3VycmVudCBkcm9wcGFibGUgZWxlbWVudFxuICBwcml2YXRlIGFsbG93Q2xpY2sgPSB0cnVlOyAvLyBGbGFnIHRvIGFsbG93IG9yIHByZXZlbnQgY2xpY2tcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRvdWNoRHJhZ0FuZERyb3A7XG5cbiAgY29weVN0eWxlc0ZvckRyYWdDbG9uZSA9IHRydWU7XG4gIGRyYWdPbkNsaWNrRW5hYmxlZCA9IGZhbHNlO1xuICB1c2VEcmFnQ2xvbmUgPSBmYWxzZTsgLy8gU2V0IHRvIHRydWUgdG8gZHJhZyB3aXRoIGEgY2xvbmU7IHNldCB0byBmYWxzZSB0byBkcmFnIHRoZSBvcmlnaW5hbCBlbGVtZW50XG5cbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fRFJBR19ESVNUQU5DRSA9IDU7IC8vIE1pbmltdW0gcGl4ZWwgbW92ZW1lbnQgdG8gc3RhcnQgZHJhZ2dpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBEUkFHX0NMT05FX09QQUNJVFkgPSAxOyAvLyBPcGFjaXR5IG9mIHRoZSBkcmFnIGNsb25lIGVsZW1lbnRcbiAgaW5pdGlhbFRyYW5zaXRpb246IHN0cmluZztcbiAgLy8gZHJvcHBhYmxlczogRWxlbWVudFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmIChUb3VjaERyYWdBbmREcm9wLmluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gVG91Y2hEcmFnQW5kRHJvcC5pbnN0YW5jZTtcbiAgICB9XG4gICAgVG91Y2hEcmFnQW5kRHJvcC5pbnN0YW5jZSA9IHRoaXM7XG5cbiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJzIGZvciB0b3VjaCBhbmQgbW91c2UgaW50ZXJhY3Rpb25zXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVUb3VjaE1vdmUuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZVRvdWNoTW92ZS5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVUb3VjaEVuZC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmhhbmRsZVRvdWNoRW5kLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLmhhbmRsZVRvdWNoQ2FuY2VsLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duLmJpbmQodGhpcykpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5oYW5kbGVLZXlVcC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGFkZERyYWdnYWJsZUVsZW1lbnRzKGRyYWdnYWJsZXM6IEVsZW1lbnRbXSkge1xuICAgIGRyYWdnYWJsZXMuZm9yRWFjaChlbCA9PiB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTsgLy8gTWFrZSBkcmFnZ2FibGUgZWxlbWVudHMgZm9jdXNhYmxlXG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsICgpID0+ICh0aGlzLmZvY3VzZWRFbGVtZW50ID0gZWwgYXMgSFRNTEVsZW1lbnQpKTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IG51bGwpKTtcblxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBhZGREcm9wcGFibGVFbGVtZW50cyhkcm9wcGFibGVzOiBFbGVtZW50W10pIHtcbiAgLy8gICAvLyB0aGlzLmRyb3BwYWJsZXMgPSBkcm9wcGFibGVzO1xuICAvLyAgIGRyb3BwYWJsZXMuZm9yRWFjaChlbCA9PiB7XG4gIC8vICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTsgLy8gTWFrZSBkcmFnZ2FibGUgZWxlbWVudHMgZm9jdXNhYmxlXG4gIC8vICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsICgpID0+ICh0aGlzLmZvY3VzZWRFbGVtZW50ID0gZWwgYXMgSFRNTEVsZW1lbnQpKTtcbiAgLy8gICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IG51bGwpKTtcblxuICAvLyAgICAgLy8gZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAvLyAgICAgLy8gZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoU3RhcnQoZSkge1xuICAgIHRoaXMudG91Y2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5nZXRFdmVudENvb3JkaW5hdGVzKGUpO1xuICAgIHRoaXMudG91Y2hTdGFydFBvaW50ID0geyB4LCB5IH07XG4gICAgdGhpcy5kcmFnU291cmNlID0gZS5jdXJyZW50VGFyZ2V0O1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0cnVlO1xuXG4gICAgLy8gR2V0IHRoZSByb290IG5vZGVcbiAgICB0aGlzLnJvb3ROb2RlID0gdGhpcy5kcmFnU291cmNlLmdldFJvb3ROb2RlKCk7XG5cbiAgICBpZiAodGhpcy5kcmFnT25DbGlja0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB0aGlzLmNyZWF0ZURyYWdDbG9uZShlLCB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnVzZURyYWdDbG9uZSkge1xuICAgICAgLy8gU2F2ZSBpbml0aWFsIHRyYW5zZm9ybVxuICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZHJhZ1NvdXJjZSk7XG4gICAgICB0aGlzLmluaXRpYWxUcmFuc2Zvcm0gPSBjb21wdXRlZFN0eWxlLnRyYW5zZm9ybSA9PT0gJ25vbmUnID8gJycgOiBjb21wdXRlZFN0eWxlLnRyYW5zZm9ybTtcblxuICAgICAgLy8gU2F2ZSB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbiBzdHlsZVxuICAgICAgdGhpcy5pbml0aWFsVHJhbnNpdGlvbiA9IGNvbXB1dGVkU3R5bGUudHJhbnNpdGlvbiB8fCAnJztcblxuICAgICAgLy8gRGlzYWJsZSB0cmFuc2l0aW9uc1xuICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBjbG9uZSBvZmZzZXRcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmRyYWdTb3VyY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLmNsb25lT2Zmc2V0LnggPSB4IC0gcmVjdC5sZWZ0O1xuICAgICAgdGhpcy5jbG9uZU9mZnNldC55ID0geSAtIHJlY3QudG9wO1xuXG4gICAgICAvLyBTZXQgaGlnaGVyIHotaW5kZXggdG8gYnJpbmcgaXQgb24gdG9wXG4gICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUuekluZGV4ID0gJzk5OTknO1xuICAgICAgLy8gdGhpcy5kcmFnU291cmNlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7IC8vIFNvIGl0IGRvZXNuJ3QgYmxvY2sgZXZlbnRzXG4gICAgICB0aGlzLmRyYWdTb3VyY2UuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoTW92ZShlKSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnZ2FibGUgJiYgdGhpcy5kcmFnU291cmNlKSB7XG4gICAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuZ2V0RXZlbnRDb29yZGluYXRlcyhlKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRUb3VjaCA9IHsgY2xpZW50WDogeCwgY2xpZW50WTogeSB9O1xuXG4gICAgICBpZiAodGhpcy5jYWxjdWxhdGVEcmFnRGlzdGFuY2UoY3VycmVudFRvdWNoKSA+PSB0aGlzLk1JTl9EUkFHX0RJU1RBTkNFKSB7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnOyAvLyBTbyBpdCBkb2Vzbid0IGJsb2NrIGV2ZW50c1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNyZWF0ZURyYWdDbG9uZShlLCBjdXJyZW50VG91Y2gpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRHJhZ0Nsb25lKGUsIGN1cnJlbnRUb3VjaDogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9KSB7XG4gICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnVzZURyYWdDbG9uZSkge1xuICAgICAgLy8gRXhpc3RpbmcgY29kZSBmb3IgY3JlYXRpbmcgYW5kIGhhbmRsaW5nIHRoZSBkcmFnIGNsb25lXG4gICAgICBpZiAoIXRoaXMuZHJhZ0Nsb25lKSB7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5vcGFjaXR5ID0gdGhpcy5EUkFHX0NMT05FX09QQUNJVFkudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmUgPSB0aGlzLmRyYWdTb3VyY2UuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLmNvcHlTdHlsZXNGb3JEcmFnQ2xvbmUpIHtcbiAgICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZHJhZ1NvdXJjZSk7XG4gICAgICAgICAgZm9yIChjb25zdCBzdHlsZSBvZiBjb21wdXRlZFN0eWxlcykge1xuICAgICAgICAgICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGVbc3R5bGVdID0gY29tcHV0ZWRTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTW92ZSB0aGUgZHJhZyBjbG9uZSB0byB0aGUgcm9vdCBub2RlXG4gICAgICAgIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgIC8vIEFwcGVuZCB0byB0aGUgaG9zdCBvZiB0aGUgc2hhZG93IHJvb3RcbiAgICAgICAgICB0aGlzLnJvb3ROb2RlLmhvc3QuYXBwZW5kQ2hpbGQodGhpcy5kcmFnQ2xvbmUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5kcmFnQ2xvbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdGVDbG9uZVBvc2l0aW9uKGN1cnJlbnRUb3VjaCk7XG4gICAgICAgIHRoaXMuc2V0RHJhZ0Nsb25lU3R5bGVzKGN1cnJlbnRUb3VjaCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnc3RhcnQnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVEcmFnQ2xvbmVQb3NpdGlvbihjdXJyZW50VG91Y2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIYW5kbGUgZHJhZ2dpbmcgdGhlIG9yaWdpbmFsIGVsZW1lbnQgdXNpbmcgQ1NTIHRyYW5zZm9ybXNcbiAgICAgIGlmICh0aGlzLnRvdWNoU3RhcnRQb2ludCkge1xuICAgICAgICBjb25zdCBkZWx0YVggPSBjdXJyZW50VG91Y2guY2xpZW50WCAtIHRoaXMudG91Y2hTdGFydFBvaW50Lng7XG4gICAgICAgIGNvbnN0IGRlbHRhWSA9IGN1cnJlbnRUb3VjaC5jbGllbnRZIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueTtcblxuICAgICAgICAvLyBBcHBseSBib3VuZGFyaWVzXG4gICAgICAgIC8vIGNvbnN0IHsgYm91bmRlZERlbHRhWCwgYm91bmRlZERlbHRhWSB9ID0gdGhpcy5hcHBseVRyYW5zZm9ybUJvdW5kYXJpZXMoZGVsdGFYLCBkZWx0YVkpO1xuICAgICAgICAvLyB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNmb3JtID0gYCR7dGhpcy5pbml0aWFsVHJhbnNmb3JtfSB0cmFuc2xhdGUoJHtib3VuZGVkRGVsdGFYfXB4LCAke2JvdW5kZWREZWx0YVl9cHgpYDtcblxuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNmb3JtID0gYCR7dGhpcy5pbml0aWFsVHJhbnNmb3JtfSB0cmFuc2xhdGUoJHtkZWx0YVh9cHgsICR7ZGVsdGFZfXB4KWA7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc0Rpc3BhdGNoZWREcmFnU3RhcnQpIHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ3N0YXJ0Jyk7XG4gICAgICAgICAgdGhpcy5oYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRyb3BUYXJnZXQgPSB0aGlzLmZpbmREcm9wVGFyZ2V0KGUpO1xuXG4gICAgaWYgKGRyb3BUYXJnZXQgIT09IHRoaXMubGFzdFRhcmdldCkge1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KGRyb3BUYXJnZXQsICdkcmFnZW50ZXInKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmxhc3RUYXJnZXQsICdkcmFnbGVhdmUnKTtcbiAgICAgIHRoaXMubGFzdFRhcmdldCA9IGRyb3BUYXJnZXQ7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50RHJvcFRhcmdldCA9IGRyb3BUYXJnZXQ7XG4gICAgaWYgKHRoaXMuY3VycmVudERyb3BUYXJnZXQpIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudChkcm9wVGFyZ2V0LCAnZHJhZ292ZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hFbmQoZSkge1xuICAgIHRoaXMudG91Y2hFbmRUcmlnZ2VyZWQgPSB0cnVlO1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICBsZXQgZHJvcEZvdW5kID0gZmFsc2U7XG5cbiAgICAvLyBjb25zb2xlLmxvZygnZHJvcEZvdW5kJywgZHJvcEZvdW5kKTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5jdXJyZW50RHJvcFRhcmdldCwgJ2Ryb3AnKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnZW5kJyk7XG4gICAgICBkcm9wRm91bmQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICBjb25zdCBkcmFnRW5kRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2RyYWdlbmQnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICBkcmFnRW5kRXZlbnRbJ2RhdGFUcmFuc2ZlciddID0geyBkcm9wRWZmZWN0OiAnbm9uZScgfTtcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZT8uZGlzcGF0Y2hFdmVudChkcmFnRW5kRXZlbnQpO1xuICAgIH1cblxuICAgIHRoaXMucmVzZXREcmFnU3RhdGUoZHJvcEZvdW5kKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hDYW5jZWwoZSkge1xuICAgIHRoaXMucmVzZXREcmFnU3RhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZERyb3BUYXJnZXQoZXZlbnQpIHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuZ2V0RXZlbnRDb29yZGluYXRlcyhldmVudCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RHJvcFRhcmdldEF0UG9pbnQoZG9jdW1lbnQsIHgsIHkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREcm9wVGFyZ2V0QXRQb2ludChyb290OiBEb2N1bWVudE9yU2hhZG93Um9vdCwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGRlcHRoOiBudW1iZXIgPSAwKTogRWxlbWVudCB8IG51bGwge1xuICAgIC8vIExpbWl0IHRoZSByZWN1cnNpb24gZGVwdGhcbiAgICBjb25zdCBNQVhfREVQVEggPSAyO1xuICAgIGlmIChkZXB0aCA+IE1BWF9ERVBUSCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IHJvb3QuZWxlbWVudEZyb21Qb2ludCh4LCB5KSBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkcm9wem9uZScpKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBUcmF2ZXJzZSB1cCB0aGUgRE9NIHRyZWUgdG8gZmluZCBhbiBhbmNlc3RvciB3aXRoICdkcm9wem9uZScgYXR0cmlidXRlXG4gICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCkge1xuICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZHJvcHpvbmUnKSkge1xuICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7XG4gICAgICB9XG4gICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgU2hhZG93IERPTSBhbmQgZGVwdGggbGltaXQgbm90IHJlYWNoZWQsIHRyYXZlcnNlIGl0XG4gICAgaWYgKGVsZW1lbnQuc2hhZG93Um9vdCAmJiBkZXB0aCA8IE1BWF9ERVBUSCkge1xuICAgICAgY29uc3Qgc2hhZG93RWxlbWVudCA9IHRoaXMuZ2V0RHJvcFRhcmdldEF0UG9pbnQoZWxlbWVudC5zaGFkb3dSb290LCB4LCB5LCBkZXB0aCArIDEpO1xuICAgICAgaWYgKHNoYWRvd0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHNoYWRvd0VsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm8gZWxlbWVudCB3aXRoICdkcm9wem9uZScgZm91bmRcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlS2V5RG93bihlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZm9jdXNlZEVsZW1lbnQpIHtcbiAgICAgIGlmIChlLmtleSA9PT0gJyAnICYmICF0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgLy8gU3BhY2ViYXIgcHJlc3NlZCB0byBzdGFydCBkcmFnZ2luZ1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2UgPSB0aGlzLmZvY3VzZWRFbGVtZW50O1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuXG4gICAgICAgIC8vIFN0b3JlIHRoZSBkcm9wIHpvbmVzIGZvciBuYXZpZ2F0aW9uXG4gICAgICAgIHRoaXMuY29sbGVjdERyb3Bab25lcygpO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgZHJhZ3N0YXJ0IGV2ZW50XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnc3RhcnQnKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdUYWInICYmIHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAvLyBUYWIga2V5IHRvIG5hdmlnYXRlIHRocm91Z2ggZHJvcCB6b25lc1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZVRvTmV4dERyb3Bab25lKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVLZXlVcChlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGUua2V5ID09PSAnICcgJiYgdGhpcy5pc0RyYWdnaW5nICYmIHRoaXMuY3VycmVudERyb3BUYXJnZXQpIHtcbiAgICAgIC8vIFNwYWNlYmFyIHByZXNzZWQgYWdhaW4gdG8gZHJvcCB0aGUgZWxlbWVudFxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuY3VycmVudERyb3BUYXJnZXQsICdkcm9wJyk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ2VuZCcpO1xuICAgICAgdGhpcy5yZXNldERyYWdTdGF0ZSh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3REcm9wWm9uZXMoKSB7XG4gICAgLy8gQ29sbGVjdCBhbGwgZWxlbWVudHMgd2l0aCBkcm9wem9uZSBhdHRyaWJ1dGVcbiAgICB0aGlzLmZvY3VzYWJsZURyb3Bab25lcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2Ryb3B6b25lXScpKSBhcyBIVE1MRWxlbWVudFtdOyAvLyBBcnJheS5mcm9tKHRoaXMuZHJvcHBhYmxlcyk7XG4gICAgdGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleCA9IC0xOyAvLyBSZXNldCBuYXZpZ2F0aW9uIGluZGV4XG4gIH1cblxuICBwcml2YXRlIG1vdmVUb05leHREcm9wWm9uZSgpIHtcbiAgICBpZiAodGhpcy5mb2N1c2FibGVEcm9wWm9uZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAvLyBVcGRhdGUgaW5kZXggZm9yIHRoZSBuZXh0IGRyb3Agem9uZVxuICAgIHRoaXMuY3VycmVudERyb3Bab25lSW5kZXggPSAodGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleCArIDEpICUgdGhpcy5mb2N1c2FibGVEcm9wWm9uZXMubGVuZ3RoO1xuXG4gICAgLy8gRm9jdXMgdGhlIG5leHQgZHJvcCB6b25lXG4gICAgY29uc3QgbmV4dERyb3Bab25lID0gdGhpcy5mb2N1c2FibGVEcm9wWm9uZXNbdGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleF07XG4gICAgbmV4dERyb3Bab25lLmZvY3VzKCk7XG5cbiAgICAvLyBVcGRhdGUgY3VycmVudCBkcm9wIHRhcmdldFxuICAgIHRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBuZXh0RHJvcFpvbmU7XG5cbiAgICAvLyBEaXNwYXRjaCBkcmFnZW50ZXIgZXZlbnRcbiAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQobmV4dERyb3Bab25lLCAnZHJhZ2VudGVyJyk7XG4gIH1cblxuICBwcml2YXRlIGdldEV2ZW50Q29vcmRpbmF0ZXMoZXZlbnQsIHBhZ2UgPSBmYWxzZSkge1xuICAgIGNvbnN0IHRvdWNoID0gZXZlbnQudG91Y2hlcyA/IGV2ZW50LnRvdWNoZXNbMF0gOiBldmVudDtcbiAgICByZXR1cm4ge1xuICAgICAgeDogcGFnZSA/IHRvdWNoLnBhZ2VYIDogdG91Y2guY2xpZW50WCxcbiAgICAgIHk6IHBhZ2UgPyB0b3VjaC5wYWdlWSA6IHRvdWNoLmNsaWVudFlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVDbG9uZVBvc2l0aW9uKHRvdWNoKSB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLmNsb25lT2Zmc2V0LnggPSB0b3VjaC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIHRoaXMuY2xvbmVPZmZzZXQueSA9IHRvdWNoLmNsaWVudFkgLSByZWN0LnRvcDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RHJhZ0Nsb25lU3R5bGVzKHRvdWNoKSB7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnRvcCA9IGAke3RvdWNoLmNsaWVudFkgLSB0aGlzLmNsb25lT2Zmc2V0Lnl9cHhgO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLmxlZnQgPSBgJHt0b3VjaC5jbGllbnRYIC0gdGhpcy5jbG9uZU9mZnNldC54fXB4YDtcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnpJbmRleCA9ICc5OTk5OTknO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcmFnQ2xvbmVQb3NpdGlvbih0b3VjaCkge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50b3VjaEVuZFRyaWdnZXJlZCB8fCAhdGhpcy5kcmFnQ2xvbmUpIHJldHVybjtcblxuICAgICAgY29uc3QgbmV3TGVmdCA9IHRvdWNoLmNsaWVudFggLSB0aGlzLmNsb25lT2Zmc2V0Lng7XG4gICAgICBjb25zdCBuZXdUb3AgPSB0b3VjaC5jbGllbnRZIC0gdGhpcy5jbG9uZU9mZnNldC55O1xuXG4gICAgICAvLyBBcHBseSBib3VuZGFyaWVzXG4gICAgICBjb25zdCB7IG5ld0xlZnQ6IGJvdW5kZWRMZWZ0LCBuZXdUb3A6IGJvdW5kZWRUb3AgfSA9IHRoaXMuYXBwbHlCb3VuZGFyaWVzKG5ld0xlZnQsIG5ld1RvcCwgdGhpcy5kcmFnQ2xvbmUpO1xuXG4gICAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5sZWZ0ID0gYCR7Ym91bmRlZExlZnR9cHhgO1xuICAgICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUudG9wID0gYCR7Ym91bmRlZFRvcH1weGA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VHJhbnNmb3JtQm91bmRhcmllcyhkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIpIHtcbiAgICAvLyBHZXQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHJvb3Qgbm9kZVxuICAgIGxldCBib3VuZGFyeVJlY3Q6IERPTVJlY3Q7XG4gICAgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSB0aGlzLnJvb3ROb2RlLmhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCB0byB2aWV3cG9ydFxuICAgICAgYm91bmRhcnlSZWN0ID0gbmV3IERPTVJlY3QoMCwgMCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb25zIGFuZCBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudFxuICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gdGhpcy5kcmFnU291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IGVsZW1lbnRSZWN0LndpZHRoO1xuICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSBlbGVtZW50UmVjdC5oZWlnaHQ7XG5cbiAgICAvLyBDYWxjdWxhdGUgcG90ZW50aWFsIG5ldyBwb3NpdGlvblxuICAgIGNvbnN0IG5ld0xlZnQgPSBlbGVtZW50UmVjdC5sZWZ0ICsgZGVsdGFYO1xuICAgIGNvbnN0IG5ld1RvcCA9IGVsZW1lbnRSZWN0LnRvcCArIGRlbHRhWTtcblxuICAgIC8vIExpbWl0IHRoZSBuZXcgcG9zaXRpb24gd2l0aGluIHRoZSBib3VuZGFyaWVzXG4gICAgY29uc3QgYm91bmRlZExlZnQgPSBNYXRoLm1heChib3VuZGFyeVJlY3QubGVmdCwgTWF0aC5taW4obmV3TGVmdCwgYm91bmRhcnlSZWN0LnJpZ2h0IC0gZWxlbWVudFdpZHRoKSk7XG4gICAgY29uc3QgYm91bmRlZFRvcCA9IE1hdGgubWF4KGJvdW5kYXJ5UmVjdC50b3AsIE1hdGgubWluKG5ld1RvcCwgYm91bmRhcnlSZWN0LmJvdHRvbSAtIGVsZW1lbnRIZWlnaHQpKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYm91bmRlZCBkZWx0YSB2YWx1ZXNcbiAgICBjb25zdCBib3VuZGVkRGVsdGFYID0gYm91bmRlZExlZnQgLSBlbGVtZW50UmVjdC5sZWZ0O1xuICAgIGNvbnN0IGJvdW5kZWREZWx0YVkgPSBib3VuZGVkVG9wIC0gZWxlbWVudFJlY3QudG9wO1xuXG4gICAgcmV0dXJuIHsgYm91bmRlZERlbHRhWCwgYm91bmRlZERlbHRhWSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUJvdW5kYXJpZXMobmV3TGVmdDogbnVtYmVyLCBuZXdUb3A6IG51bWJlciwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAvLyBHZXQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHJvb3Qgbm9kZVxuICAgIGxldCBib3VuZGFyeVJlY3Q6IERPTVJlY3Q7XG4gICAgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSB0aGlzLnJvb3ROb2RlLmhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCB0byB2aWV3cG9ydFxuICAgICAgYm91bmRhcnlSZWN0ID0gbmV3IERPTVJlY3QoMCwgMCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbGVtZW50XG4gICAgY29uc3QgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IGVsZW1lbnRSZWN0LndpZHRoO1xuICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSBlbGVtZW50UmVjdC5oZWlnaHQ7XG5cbiAgICAvLyBMaW1pdCB0aGUgbmV3TGVmdCBhbmQgbmV3VG9wIHdpdGhpbiB0aGUgYm91bmRhcmllc1xuICAgIGNvbnN0IGJvdW5kZWRMZWZ0ID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LmxlZnQsIE1hdGgubWluKG5ld0xlZnQsIGJvdW5kYXJ5UmVjdC5yaWdodCAtIGVsZW1lbnRXaWR0aCkpO1xuICAgIGNvbnN0IGJvdW5kZWRUb3AgPSBNYXRoLm1heChib3VuZGFyeVJlY3QudG9wLCBNYXRoLm1pbihuZXdUb3AsIGJvdW5kYXJ5UmVjdC5ib3R0b20gLSBlbGVtZW50SGVpZ2h0KSk7XG5cbiAgICByZXR1cm4geyBuZXdMZWZ0OiBib3VuZGVkTGVmdCwgbmV3VG9wOiBib3VuZGVkVG9wIH07XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZURyYWdEaXN0YW5jZSh0b3VjaCk6IG51bWJlciB7XG4gICAgY29uc3QgeERpc3QgPSBNYXRoLmFicyh0b3VjaC5jbGllbnRYIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueCk7XG4gICAgY29uc3QgeURpc3QgPSBNYXRoLmFicyh0b3VjaC5jbGllbnRZIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueSk7XG4gICAgcmV0dXJuIHhEaXN0ICsgeURpc3Q7XG4gIH1cblxuICBwcml2YXRlIGRpc3BhdGNoQ3VzdG9tRXZlbnQoZWxlbWVudCwgZXZlbnRUeXBlLCBidWJibGUgPSB0cnVlKSB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnRUeXBlLCB7IGJ1YmJsZXM6IGJ1YmJsZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICBldmVudFsnZGF0YVRyYW5zZmVyJ10gPSB0aGlzLmRhdGFUcmFuc2ZlcjtcbiAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldERyYWdTdGF0ZShkcm9wRm91bmQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgIGlmICh0aGlzLnVzZURyYWdDbG9uZSkge1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUub3BhY2l0eSA9ICcxLjAnO1xuICAgICAgICB0aGlzLmRyYWdDbG9uZT8ucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmRyYWdDbG9uZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHN0eWxlc1xuICAgICAgICBpZiAoIWRyb3BGb3VuZCkgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUuekluZGV4ID0gJyc7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gc3R5bGVcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zaXRpb24gPSB0aGlzLmluaXRpYWxUcmFuc2l0aW9uO1xuXG4gICAgICAgIC8vIFJlc2V0IHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9uIHByb3BlcnR5XG4gICAgICAgIHRoaXMuaW5pdGlhbFRyYW5zaXRpb24gPSAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmRyYWdTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuZHJhZ0Nsb25lID0gbnVsbDtcbiAgICB0aGlzLmlzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgdGhpcy50b3VjaFN0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy50b3VjaFN0YXJ0UG9pbnQgPSBudWxsO1xuICAgIHRoaXMudG91Y2hFbmRUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRhdGFUcmFuc2ZlciA9IHtcbiAgICAgIGRhdGE6IHt9LFxuICAgICAgc2V0RGF0YSh0eXBlLCB2YWwpIHtcbiAgICAgICAgdGhpcy5kYXRhW3R5cGVdID0gdmFsO1xuICAgICAgfSxcbiAgICAgIGdldERhdGEodHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhW3R5cGVdO1xuICAgICAgfSxcbiAgICAgIGVmZmVjdEFsbG93ZWQ6ICdtb3ZlJ1xuICAgIH07XG4gICAgdGhpcy5jbG9uZU9mZnNldCA9IHsgeDogMCwgeTogMCB9O1xuICAgIHRoaXMubGFzdFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50RHJvcFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5hbGxvd0NsaWNrID0gdHJ1ZTtcbiAgICB0aGlzLmluaXRpYWxUcmFuc2Zvcm0gPSAnJztcbiAgICB0aGlzLmhhc0Rpc3BhdGNoZWREcmFnU3RhcnQgPSBmYWxzZTtcblxuICAgIHRoaXMucm9vdE5vZGUgPSBudWxsO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5kZWNsYXJlIGNsYXNzIERyb3BwYWJsZXNJbnRlcmZhY2Uge31cblxuZXhwb3J0IGNvbnN0IERyb3BwYWJsZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgdXNlU2hhZG93Um9vdDogYm9vbGVhbixcbiAgZHJvcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmdcbikgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBEcm9wcGFibGVzRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0pIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG4gICAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcblxuICAgICAgY29uc3QgZHJvcHBhYmxlcyA9IHRoaXMuZ2V0RHJvcHBhYmxlRWxlbWVudHMoKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50SGFuZGxlcnMoKTtcbiAgICAgIGRyb3BwYWJsZXMuZm9yRWFjaChkcm9wcGFibGUgPT4ge1xuICAgICAgICB0aGlzLnByZXBhcmVEcm9wcGFibGUoZHJvcHBhYmxlKTtcbiAgICAgICAgdGhpcy5vYnNlcnZlRHJvcHBhYmxlQXR0cmlidXRlcyhkcm9wcGFibGUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc01hdGNoVGFidWxhcigpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERyb3BwYWJsZUVsZW1lbnRzKCk6IEVsZW1lbnRbXSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgICAgdXNlU2hhZG93Um9vdCA/IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcikgOiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVFdmVudEhhbmRsZXJzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnb3ZlckhhbmRsZXIgPSB0aGlzLmRyYWdvdmVySGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5kcmFnbGVhdmVIYW5kbGVyID0gdGhpcy5kcmFnbGVhdmVIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRyYWdlbnRlckhhbmRsZXIgPSB0aGlzLmRyYWdlbnRlckhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuZHJvcEhhbmRsZXIgPSB0aGlzLmRyb3BIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVwYXJlRHJvcHBhYmxlKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnZHJvcHpvbmUnLCAnbW92ZScpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMuZHJhZ2xlYXZlSGFuZGxlcik7XG4gICAgICB0aGlzLmF0dGFjaEV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvYnNlcnZlRHJvcHBhYmxlQXR0cmlidXRlcyhkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaCgoeyBhdHRyaWJ1dGVOYW1lIH0pID0+IHtcbiAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVEcm9wcGFibGVIYW5kbGVycyhkcm9wcGFibGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShkcm9wcGFibGUsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZURyb3BwYWJsZUhhbmRsZXJzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgY29uc3QgZGlzYWJsZWQgPSBkcm9wcGFibGUuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGF0dGFjaEV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5kcmFnb3ZlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMuZHJhZ2VudGVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdvdmVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5kcmFnZW50ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wSGFuZGxlcik7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5vYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ2VudGVySGFuZGxlcihldjogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ292ZXJIYW5kbGVyKGV2OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmFjdGl2YXRlRHJvcHBhYmxlKGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZURyb3BwYWJsZShkcm9wcGFibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdhY3RpdmUnLCAnJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkcm9wSGFuZGxlcihldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBldi5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dCcpO1xuICAgICAgY29uc3QgZHJhZ2dhYmxlID0gdGhpcy5maW5kRHJhZ2dhYmxlKGlkZW50aWZpZXIpO1xuICAgICAgLy8gY29uc29sZS5sb2codGhpcy5pc1ZhbGlkRHJvcChkcm9wcGFibGUsIGRyYWdnYWJsZSkpO1xuXG4gICAgICBpZiAoIWRyYWdnYWJsZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGRyYWdnYWJsZSAmJiAhdGhpcy5pc1ZhbGlkRHJvcChkcm9wcGFibGUsIGRyYWdnYWJsZSkpIHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMubW92ZURyYWdnYWJsZVRvRHJvcHBhYmxlKGRyYWdnYWJsZSwgZHJvcHBhYmxlKTtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyb3BwYWJsZShkcm9wcGFibGUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZERyYWdnYWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgaWYgKCFpZGVudGlmaWVyKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMucXVlcnlTZWxlY3RvcihgW2lkZW50aWZpZXI9JHtpZGVudGlmaWVyfV1gKSB8fCB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgW2lkZW50aWZpZXI9JHtpZGVudGlmaWVyfV1gKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVmFsaWREcm9wKGRyb3BwYWJsZTogSFRNTEVsZW1lbnQsIGRyYWdnYWJsZTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBkcmFnZ2FibGUucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSAhPT0gZHJvcHBhYmxlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbW92ZURyYWdnYWJsZVRvRHJvcHBhYmxlKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIGRyb3BwYWJsZTogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IG1vdmVFbGVtZW50ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIGRyb3BwYWJsZS5hcHBlbmRDaGlsZChkcmFnZ2FibGUpO1xuXG4gICAgICAgIC8vIGNoZWNrTWF4QXNzb2NpYXRpb25zIGFuZCBzYXZlUmVzcG9uc2UgYXJlIGRlZmluZWQvb3ZlcnJpZGRlbiBpbiBhIG1peGluXG4gICAgICAgIHRoaXNbJ2NoZWNrTWF4QXNzb2NpYXRpb25zJ10oKTtcbiAgICAgICAgdGhpc1snc2F2ZVJlc3BvbnNlJ10obnVsbCk7IC8vXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgbW92ZUVsZW1lbnQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmFuc2l0aW9uID0gZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihtb3ZlRWxlbWVudCk7XG4gICAgICBhd2FpdCB0cmFuc2l0aW9uLmZpbmlzaGVkO1xuXG4gICAgICAvLyB0aGlzWydjaGVja01heEFzc29jaWF0aW9ucyddKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWFjdGl2YXRlRHJvcHBhYmxlKGRyb3BwYWJsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2FjdGl2ZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ2xlYXZlSGFuZGxlcihldjogRHJhZ0V2ZW50KTogYm9vbGVhbiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5kZWFjdGl2YXRlRHJvcHBhYmxlKGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbm9uZSc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBEcm9wcGFibGVzRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxEcm9wcGFibGVzSW50ZXJmYWNlPiAmIFQ7XG59O1xuIiwgIi8vIFRISVMgSVMgQSBNSVhJTiwgVEhJUyBJUyBBIE1JWElOXG4vLyBVU0UgTElLRSBUSElTXG4vLyBgYGBjbGFzcyBEcm9wTGlzdCBleHRlbmRzIEZsaXBwYWJsZXMoTGl0RWxlbWVudCkge2BgYFxuLy8gbWl4aW4gd2hpY2ggYW5pbWF0ZXMgY2hpbGRyZW4gd2l0aCBGTElQXG4vLyBhIGNvbWJpbmF0aW9uIGJldHdlZW4gdGhpcyBkaXJlY3RpdmU6XG4vLyBodHRwczovL25nLXJ1bi5jb20vZWRpdC85TUdyNWRZV0EyMEFpSnRweTVhej9vcGVuPWFwcCUyRmFwcC5jb21wb25lbnQuaHRtbFxuLy8gYW5kIGEgdHV0b3JpYWwgaG93IHRvIG1ha2UgYSBtaXhpblxuLy8gaHR0cHM6Ly9saXQuZGV2L2RvY3MvY29tcG9zaXRpb24vbWl4aW5zL1xuXG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBGbGlwcGFibGVzSW50ZXJmYWNlIHtcbiAgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZDtcbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZDtcbn1cblxuLy8ganVzdCBhIGNvbnZlcnNpb24gb2YgYSBhbmd1bGFyIEZMSVAgZGlyZWN0aXZlLCBtYWRlIGFzIGEgTWl4aW5cbi8vIGh0dHBzOi8vbmctcnVuLmNvbS9lZGl0LzlNR3I1ZFlXQTIwQWlKdHB5NWF6P29wZW49YXBwJTJGYXBwLmNvbXBvbmVudC5odG1sXG5leHBvcnQgY29uc3QgRmxpcHBhYmxlc01peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KFxuICBzdXBlckNsYXNzOiBULFxuICBkcm9wcGFibGVzU2VsOiBzdHJpbmcsXG4gIGRyYWdnYWJsZXNTZWw6IHN0cmluZ1xuKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIEZsaXBwYWJsZXNFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgLy8gcHJpdmF0ZSBzdGF0ZSA9IG5ldyBNYXA8RWxlbWVudCwgYW55PigpO1xuICAgIC8vIHByaXZhdGUgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgLy8gZmxpcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmc7XG4gICAgLy8gb3ZlcnJpZGUgYXN5bmMgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcykge1xuICAgIC8vICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsgLy8gcGs6IHRoaXMgaXMgdGhlIGtleSB0byBjYWxjdWxhdGUgY29ycmVjdCBwcm9wb3J0aW9uc1xuICAgIC8vICAgY29uc3QgZHJhZ2dhYmxlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyYWdnYWJsZXNTZWwpKTtcbiAgICAvLyAgIGRyYWdnYWJsZXMuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgIC8vICAgICBjb25zdCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLmFuaW1hdGVNZSk7XG4gICAgLy8gICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbCkpO1xuICAgIC8vICAgZHJvcHBhYmxlcy5mb3JFYWNoKChkcmFnZ2FibGUpID0+IHtcbiAgICAvLyAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKGRyYWdnYWJsZSwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICAvLyAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuICAgIC8vIH1cbiAgICAvLyBwcml2YXRlIGFuaW1hdGVNZSA9ICgpID0+IHtcbiAgICAvLyAgIHRoaXMuc3RhdGUuZm9yRWFjaCgodmFsdWUsIGVsZW0pID0+IHtcbiAgICAvLyAgICAgY29uc3QgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gICAgIGlmICh0aGlzLnN0YXRlLmdldChlbGVtKSA9PSBudWxsKSB7XG4gICAgLy8gICAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgY29uc3QgY2FjaGUgPSB0aGlzLnN0YXRlLmdldChlbGVtKTtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFYID0gY2FjaGUubGVmdCAtIGxlZnQ7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhWSA9IGNhY2hlLnRvcCAtIHRvcDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFXID0gY2FjaGUud2lkdGggLyB3aWR0aDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFIID0gY2FjaGUuaGVpZ2h0IC8gaGVpZ2h0O1xuICAgIC8vICAgICB0aGlzLnN0YXRlLnNldChlbGVtLCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAvLyAgICAgY29uc3QgeyBkdXJhdGlvbiwgZWFzaW5nIH0gPSB7IGR1cmF0aW9uOiAzNTAsIGVhc2luZzogJ2N1YmljLWJlemllcigwLjI2LCAwLjg2LCAwLjQ0LCAwLjk4NSknIH07XG4gICAgLy8gICAgIGVsZW0uYW5pbWF0ZShcbiAgICAvLyAgICAgICBbXG4gICAgLy8gICAgICAgICB7XG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbjogJ3RvcCBsZWZ0JyxcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtOiBgXG4gICAgLy8gdHJhbnNsYXRlKCR7ZGVsdGFYfXB4LCAke2RlbHRhWX1weClcbiAgICAvLyBzY2FsZSgke2RlbHRhV30sICR7ZGVsdGFIfSlcbiAgICAvLyBgLFxuICAgIC8vICAgICAgICAgICAvLyB3aWR0aDogY2FjaGUud2lkdGgsXG4gICAgLy8gICAgICAgICAgIC8vIGhlaWdodDogY2FjaGUuaGVpZ2h0KyAncHgnLFxuICAgIC8vICAgICAgICAgICAvLyBvcGFjaXR5OiBjYWNoZS5vcGFjaXR5LFxuICAgIC8vICAgICAgICAgfSxcbiAgICAvLyAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAndG9wIGxlZnQnLFxuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm06ICdub25lJyxcbiAgICAvLyAgICAgICAgIH0sXG4gICAgLy8gICAgICAgXSxcbiAgICAvLyAgICAgICB7XG4gICAgLy8gICAgICAgICBkdXJhdGlvbixcbiAgICAvLyAgICAgICAgIGVhc2luZyxcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgICk7XG4gICAgLy8gICB9KTtcbiAgICAvLyB9O1xuICAgIC8vIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIC8vICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIC8vIH1cbiAgfVxuICByZXR1cm4gRmxpcHBhYmxlc0VsZW1lbnQgYXMgQ29uc3RydWN0b3I8RmxpcHBhYmxlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IElJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEcm9wcGFibGVzTWl4aW4gfSBmcm9tICcuL2Ryb3BwYWJsZXMtbWl4aW4nO1xuaW1wb3J0IHsgRmxpcHBhYmxlc01peGluIH0gZnJvbSAnLi9mbGlwcGFibGVzLW1peGluJztcblxuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBsaXZlUXVlcnkgfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL2xpdmUtcXVlcnknO1xuaW1wb3J0IHsgVG91Y2hEcmFnQW5kRHJvcCB9IGZyb20gJy4vZHJhZy1kcm9wLWFwaSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuaW50ZXJmYWNlIEludGVyYWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gIGNvcHlTdHlsZXNEcmFnQ2xvbmU6IGJvb2xlYW47XG4gIGRyYWdDYW5CZVBsYWNlZEJhY2s6IGJvb2xlYW47XG4gIGRyYWdPbkNsaWNrOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KFxuICBzdXBlckNsYXNzOiBULFxuICBkcmFnZ2FibGVzU2VsZWN0b3I6IHN0cmluZyxcbiAgdXNlU2hhZG93Um9vdEZvckRyb3BwYWJsZXM6IGJvb2xlYW4sXG4gIGRyb3BwYWJsZXNTZWxlY3Rvcjogc3RyaW5nXG4pID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgRHJhZ0Ryb3BJbnRlcmFjdGlvbkVsZW1lbnQgZXh0ZW5kcyBGbGlwcGFibGVzTWl4aW4oXG4gICAgRHJvcHBhYmxlc01peGluKHN1cGVyQ2xhc3MsIHVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzLCBkcm9wcGFibGVzU2VsZWN0b3IpLFxuICAgIGRyb3BwYWJsZXNTZWxlY3RvcixcbiAgICBkcmFnZ2FibGVzU2VsZWN0b3JcbiAgKSB7XG4gICAgcHJvdGVjdGVkIGRyYWdnYWJsZXMgPSBuZXcgTWFwPEhUTUxFbGVtZW50LCB7IHBhcmVudDogSFRNTEVsZW1lbnQ7IGluZGV4OiBudW1iZXIgfT4oKTtcbiAgICBwcm90ZWN0ZWQgZHJvcHBhYmxlczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGRyYWdEcm9wQXBpOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gICAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiBmYWxzZSwgdHlwZTogT2JqZWN0IH0pIGNvbmZpZ3VyYXRpb246IEludGVyYWN0aW9uQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgIGNvcHlTdHlsZXNEcmFnQ2xvbmU6IHRydWUsXG4gICAgICBkcmFnQ2FuQmVQbGFjZWRCYWNrOiB0cnVlLFxuICAgICAgZHJhZ09uQ2xpY2s6IGZhbHNlXG4gICAgfTtcbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogJ21pbi1hc3NvY2lhdGlvbnMnIH0pIG1pbkFzc29jaWF0aW9ucyA9IDE7XG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICdtYXgtYXNzb2NpYXRpb25zJyB9KSBtYXhBc3NvY2lhdGlvbnMgPSAxO1xuXG4gICAgQGxpdmVRdWVyeShkcmFnZ2FibGVzU2VsZWN0b3IpXG4gICAgaGFuZGxlRHJhZ2dhYmxlc0NoYW5nZShkcmFnc0FkZGVkOiBIVE1MRWxlbWVudFtdLCBkcmFnc1JlbW92ZWQ6IEVsZW1lbnRbXSkge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuICAgICAgY29uc3QgbmV3RHJhZ2dhYmxlcyA9IHRoaXMuZmlsdGVyRXhpc3RpbmdEcmFnZ2FibGVzKGRyYWdzQWRkZWQpO1xuXG4gICAgICBpZiAobmV3RHJhZ2dhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuYWRkTmV3RHJhZ2dhYmxlcyhuZXdEcmFnZ2FibGVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTogdm9pZCB7XG4gICAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZURyb3BwYWJsZXMoKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLmluaXRpYWxpemVEcmFnRHJvcEFwaSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZURyYWdEcm9wQXBpKCkge1xuICAgICAgdGhpcy5kcmFnRHJvcEFwaSA9IG5ldyBUb3VjaERyYWdBbmREcm9wKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudDxEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudD4oJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTWF0Y2hUYWJ1bGFyKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmlsdGVyRXhpc3RpbmdEcmFnZ2FibGVzKGRyYWdnYWJsZXM6IEhUTUxFbGVtZW50W10pOiBIVE1MRWxlbWVudFtdIHtcbiAgICAgIHJldHVybiBkcmFnZ2FibGVzLmZpbHRlcihkID0+ICF0aGlzLmRyYWdnYWJsZXMuaGFzKGQpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZE5ld0RyYWdnYWJsZXMoZHJhZ2dhYmxlczogSFRNTEVsZW1lbnRbXSk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnRHJvcEFwaS5hZGREcmFnZ2FibGVFbGVtZW50cyhkcmFnZ2FibGVzKTtcbiAgICAgIGRyYWdnYWJsZXMuZm9yRWFjaChkcmFnZ2FibGUgPT4gdGhpcy5zdG9yZURyYWdnYWJsZShkcmFnZ2FibGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0b3JlRHJhZ2dhYmxlKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gQXJyYXkuZnJvbShkcmFnZ2FibGUucGFyZW50Tm9kZS5jaGlsZHJlbikuaW5kZXhPZihkcmFnZ2FibGUpO1xuICAgICAgdGhpcy5kcmFnZ2FibGVzLnNldChkcmFnZ2FibGUsIHtcbiAgICAgICAgcGFyZW50OiBkcmFnZ2FibGUucGFyZW50RWxlbWVudCxcbiAgICAgICAgaW5kZXhcbiAgICAgIH0pO1xuICAgICAgZHJhZ2dhYmxlLnN0eWxlLnZpZXdUcmFuc2l0aW9uTmFtZSA9IGBkcmFnLSR7aW5kZXh9LSR7dGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB8fCBjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gICAgICBkcmFnZ2FibGUuc2V0QXR0cmlidXRlKCdxdGktZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICAgIGRyYWdnYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLmhhbmRsZURyYWdTdGFydCk7XG4gICAgICBkcmFnZ2FibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIHRoaXMuaGFuZGxlRHJhZ0VuZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRHJvcHBhYmxlcygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcyA9IEFycmF5LmZyb20oXG4gICAgICAgIHVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzXG4gICAgICAgICAgPyB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpXG4gICAgICAgICAgOiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZURyYWdTdGFydCA9IChldjogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQnLCB0YXJnZXQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZHJhZ2dpbmcnLCAnJyk7XG4gICAgICB0aGlzLmFjdGl2YXRlRHJvcHBhYmxlcygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZURyYWdFbmQgPSBhc3luYyAoZXY6IERyYWdFdmVudCkgPT4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyb3BwYWJsZXMoKTtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBkcmFnZ2FibGUucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2luZycpO1xuICAgICAgY29uc3Qgd2FzRHJvcHBlZCA9IGF3YWl0IHRoaXMud2FzRHJvcHBlZChldik7XG4gICAgICBpZiAoIXdhc0Ryb3BwZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5kcmFnQ2FuQmVQbGFjZWRCYWNrKSB7XG4gICAgICAgICAgdGhpcy5yZXN0b3JlSW5pdGlhbERyYWdnYWJsZVBvc2l0aW9uKGRyYWdnYWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZURyb3BwYWJsZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMuZm9yRWFjaChkID0+IGQuc2V0QXR0cmlidXRlKCdlbmFibGVkJywgJycpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYWN0aXZhdGVEcm9wcGFibGVzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goZCA9PiBkLnJlbW92ZUF0dHJpYnV0ZSgnZW5hYmxlZCcpKTtcbiAgICB9XG5cbiAgICAvLyBNSDogVGhpcyBtZXRob2QgaXMganVzdCB0byBtYWtlIHN1cmUgdGhpcyBjYW4gYmUgdGVzdGVkLlxuICAgIC8vIGJlY2F1c2UgSSBjYW4ndCBnZXQgdGhlIGRyb3BFZmZlY3QgdG8gYmUgJ21vdmUnIGluIHRoZSB0ZXN0XG4gICAgcHJpdmF0ZSBjaGVja0Zvck1vdmVUZXN0SXRlbSA9IChldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICBpZiAoIWV2LmRhdGFUcmFuc2Zlci5pdGVtcykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgbGV0IGhhc01vdmVUZXN0SXRlbSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgZGF0YVRyYW5zZmVyIGl0ZW1zXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbShldi5kYXRhVHJhbnNmZXIuaXRlbXMpO1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gaXRlbXMubGVuZ3RoO1xuXG4gICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBpdGVtcywgcmVzb2x2ZSBpbW1lZGlhdGVseVxuICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gJ3N0cmluZycgJiYgaXRlbS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIGl0ZW0uZ2V0QXNTdHJpbmcoZGF0YSA9PiB7XG4gICAgICAgICAgICAgIGlmIChkYXRhID09PSAnbW92ZS10ZXN0Jykge1xuICAgICAgICAgICAgICAgIGhhc01vdmVUZXN0SXRlbSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBSZXNvbHZlIHRoZSBwcm9taXNlIGFmdGVyIHByb2Nlc3NpbmcgYWxsIGl0ZW1zXG4gICAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShoYXNNb3ZlVGVzdEl0ZW0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGl0ZW0gaXMgbm90ICdzdHJpbmcnLCBzdGlsbCBjb3VudCBkb3duIHBlbmRpbmdcbiAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoaGFzTW92ZVRlc3RJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgYXN5bmMgd2FzRHJvcHBlZChldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBjb25zdCBoYXNNb3ZlVGVzdEl0ZW0gPSBhd2FpdCB0aGlzLmNoZWNrRm9yTW92ZVRlc3RJdGVtKGV2KTtcbiAgICAgIHJldHVybiBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCAhPT0gJ25vbmUnIHx8IGhhc01vdmVUZXN0SXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdhc01vdmVkKGV2OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9PT0gJ21vdmUnO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzdG9yZUluaXRpYWxEcmFnZ2FibGVQb3NpdGlvbihkcmFnZ2FibGU6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCB7IHBhcmVudCwgaW5kZXggfSA9IHRoaXMuZHJhZ2dhYmxlcy5nZXQoZHJhZ2dhYmxlKTtcbiAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpO1xuXG4gICAgICBjb25zdCBtb3ZlRHJhZ2dhYmxlID0gKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIHBhcmVudDogSFRNTEVsZW1lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihpbmRleCwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZHJhZ2dhYmxlLCBwYXJlbnQuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdKTtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICB0aGlzLmNoZWNrTWF4QXNzb2NpYXRpb25zKCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBGYWxsYmFjayBpZiB2aWV3IHRyYW5zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB2aWV3IHRyYW5zaXRpb25zIGlmIHN1cHBvcnRlZFxuICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oKCkgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJyc7XG4gICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgIH0pO1xuICAgICAgLy8gdHJhbnNpdGlvbi5maW5pc2hlZC50aGVuKCgpID0+IHtcbiAgICAgIC8vICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zaXRpb24gPSAnJztcbiAgICAgIC8vIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja01heEFzc29jaWF0aW9ucygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcy5mb3JFYWNoKChkLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBtYXhNYXRjaCA9ICsoZC5nZXRBdHRyaWJ1dGUoJ21hdGNoLW1heCcpIHx8IDEpO1xuICAgICAgICBjb25zdCBjdXJyZW50QXNzb2NpYXRpb25zID0gZC5xdWVyeVNlbGVjdG9yQWxsKCdbcXRpLWRyYWdnYWJsZT1cInRydWVcIl0nKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGRpc2FibGVEcm9wcGFibGUgPSBjdXJyZW50QXNzb2NpYXRpb25zID49IG1heE1hdGNoO1xuICAgICAgICBpZiAoZGlzYWJsZURyb3BwYWJsZSkge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZURyb3BwYWJsZShkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVuYWJsZURyb3BwYWJsZShkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNhYmxlRHJvcHBhYmxlKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJyk7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlQXR0cmlidXRlKCdkcm9wem9uZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlRHJvcHBhYmxlKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2Ryb3B6b25lJywgJ21vdmUnKTtcbiAgICB9XG5cbiAgICBnZXQgdmFsdWUoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdFJlc3BvbnNlRGF0YSgpO1xuICAgIH1cblxuICAgIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hUYWJ1bGFyKCkpIHJldHVybjtcblxuICAgICAgdGhpcy5yZXNldERyb3BwYWJsZXMoKTtcbiAgICAgIHZhbHVlPy5mb3JFYWNoKGVudHJ5ID0+IHRoaXMucGxhY2VSZXNwb25zZShlbnRyeSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGxhY2VSZXNwb25zZShyZXNwb25zZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICBjb25zdCBbZHJvcElkLCAuLi5kcmFnSWRzXSA9IHJlc3BvbnNlLnNwbGl0KCcgJykucmV2ZXJzZSgpO1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gdGhpcy5maW5kRHJvcHBhYmxlQnlJZChkcm9wSWQpO1xuICAgICAgZHJhZ0lkcy5mb3JFYWNoKGRyYWdJZCA9PiB0aGlzLnBsYWNlRHJhZ2dhYmxlSW5Ecm9wcGFibGUoZHJhZ0lkLCBkcm9wcGFibGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmREcm9wcGFibGVCeUlkKGlkZW50aWZpZXI6IHN0cmluZyk6IEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMuZHJvcHBhYmxlcy5maW5kKGRyb3AgPT4gZHJvcC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSA9PT0gaWRlbnRpZmllcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwbGFjZURyYWdnYWJsZUluRHJvcHBhYmxlKGRyYWdJZDogc3RyaW5nLCBkcm9wcGFibGU6IEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IHRoaXMucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYFtpZGVudGlmaWVyPSR7ZHJhZ0lkfV1gKTtcbiAgICAgIGlmICghZHJvcHBhYmxlIHx8ICFkcmFnZ2FibGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ2Fubm90IGZpbmQgZHJhZ2dhYmxlIG9yIGRyb3BwYWJsZSB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyOiAke2RyYWdJZH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbW92ZUVsZW1lbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgZHJvcHBhYmxlLmFwcGVuZENoaWxkKGRyYWdnYWJsZSk7XG4gICAgICAgIHRoaXMuY2hlY2tNYXhBc3NvY2lhdGlvbnMoKTtcbiAgICAgIH07XG5cbiAgICAgIGlmICghZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBtb3ZlRWxlbWVudCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24obW92ZUVsZW1lbnQpO1xuICAgICAgICBhd2FpdCB0cmFuc2l0aW9uLmZpbmlzaGVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgdmFsaWRBc3NvY2lhdGlvbnMgPSB0aGlzLmdldFZhbGlkQXNzb2NpYXRpb25zKCk7XG4gICAgICByZXR1cm4gdGhpcy5taW5Bc3NvY2lhdGlvbnMgPD0gMCB8fCB0aGlzLm1pbkFzc29jaWF0aW9ucyA8PSB2YWxpZEFzc29jaWF0aW9ucztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFZhbGlkQXNzb2NpYXRpb25zKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wcGFibGVzLmZpbHRlcihkID0+IGQuY2hpbGRFbGVtZW50Q291bnQgPiAwKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHVibGljIHNhdmVSZXNwb25zZSgpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5jb2xsZWN0UmVzcG9uc2VEYXRhKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29sbGVjdFJlc3BvbnNlRGF0YSgpOiBzdHJpbmdbXSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuZHJvcHBhYmxlc1xuICAgICAgICAubWFwKGRyb3BwYWJsZSA9PiB7XG4gICAgICAgICAgY29uc3QgZHJhZ2dhYmxlc0luRHJvcHBhYmxlID0gZHJvcHBhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXJzID0gQXJyYXkuZnJvbShkcmFnZ2FibGVzSW5Ecm9wcGFibGUpLm1hcChkID0+IGQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgICAgIGNvbnN0IGRyb3BwYWJsZUlkZW50aWZpZXIgPSBkcm9wcGFibGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgcmV0dXJuIGlkZW50aWZpZXJzLm1hcChpZCA9PiBgJHtpZH0gJHtkcm9wcGFibGVJZGVudGlmaWVyfWApO1xuICAgICAgICB9KVxuICAgICAgICAuZmxhdCgpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIHJlc2V0KHNhdmUgPSB0cnVlKTogdm9pZCB7XG4gICAgICB0aGlzLnJlc2V0RHJvcHBhYmxlcygpO1xuICAgICAgaWYgKHNhdmUpIHRoaXMuc2F2ZVJlc3BvbnNlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXNldERyb3BwYWJsZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBtb3ZlRHJhZ2dhYmxlID0gKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIHBhcmVudDogSFRNTEVsZW1lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IE1hdGgubWluKGluZGV4LCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShkcmFnZ2FibGUsIHBhcmVudC5jaGlsZHJlblt0YXJnZXRJbmRleF0pO1xuICAgICAgfTtcblxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIGlmIHZpZXcgdHJhbnNpdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWRcbiAgICAgICAgdGhpcy5kcmFnZ2FibGVzLmZvckVhY2goKHsgcGFyZW50LCBpbmRleCB9LCBkcmFnZ2FibGUpID0+IHtcbiAgICAgICAgICBtb3ZlRHJhZ2dhYmxlKGRyYWdnYWJsZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB2aWV3IHRyYW5zaXRpb25zIGlmIHN1cHBvcnRlZFxuICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oKCkgPT4ge1xuICAgICAgICB0aGlzLmRyYWdnYWJsZXMuZm9yRWFjaCgoeyBwYXJlbnQsIGluZGV4IH0sIGRyYWdnYWJsZSkgPT4ge1xuICAgICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdHJhbnNpdGlvbi5maW5pc2hlZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gRHJhZ0Ryb3BJbnRlcmFjdGlvbkVsZW1lbnQgYXMgQ29uc3RydWN0b3I8SUludGVyYWN0aW9uPiAmIFQ7XG59O1xuIiwgIi8vIEB3YXRjaCBkZWNvcmF0b3Jcbi8vXG4vLyBSdW5zIHdoZW4gYW4gb2JzZXJ2ZWQgcHJvcGVydHkgY2hhbmdlcywgZS5nLiBAcHJvcGVydHkgb3IgQHN0YXRlLCBidXQgYmVmb3JlIHRoZSBjb21wb25lbnQgdXBkYXRlcy5cbi8vXG4vLyBUbyB3YWl0IGZvciBhbiB1cGRhdGUgdG8gY29tcGxldGUgYWZ0ZXIgYSBjaGFuZ2Ugb2NjdXJzLCB1c2UgYGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGVgIGluIHRoZSBoYW5kbGVyLiBUbyBzdGFydFxuLy8gd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlciwgdXNlIGB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH1gIG9yIGB0aGlzLmhhc1VwZGF0ZWRgIGluIHRoZSBoYW5kbGVyLlxuLy9cbi8vIFVzYWdlOlxuLy9cbi8vICBAd2F0Y2goJ3Byb3BOYW1lJylcbi8vICBoYW5kbGVQcm9wQ2hhbmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuLy8gICAgLi4uXG4vLyAgfVxuXG5pbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXIgPSAocHJldj86IHVua25vd24sIG5leHQ/OiB1bmtub3duKSA9PiB2b2lkO1xuXG50eXBlIE5vblVuZGVmaW5lZDxBPiA9IEEgZXh0ZW5kcyB1bmRlZmluZWQgPyBuZXZlciA6IEE7XG5cbnR5cGUgVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0tPzogTm9uVW5kZWZpbmVkPFRbS10+IGV4dGVuZHMgVXBkYXRlSGFuZGxlciA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbmludGVyZmFjZSBMaXZlUXVlcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgb25seSBzdGFydCB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyXG4gICAqL1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGl2ZVF1ZXJ5KHF1ZXJ5U2VsZWN0b3I6IHN0cmluZywgb3B0aW9ucz86IExpdmVRdWVyeU9wdGlvbnMpIHtcbiAgbGV0IG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICBjb25zdCByZXNvbHZlZE9wdGlvbnM6IFJlcXVpcmVkPExpdmVRdWVyeU9wdGlvbnM+ID0ge1xuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgcmV0dXJuIDxFbGVtQ2xhc3MgZXh0ZW5kcyBMaXRFbGVtZW50PihcbiAgICBwcm90bzogRWxlbUNsYXNzLFxuICAgIGRlY29yYXRlZEZuTmFtZTogVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxFbGVtQ2xhc3M+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHsgY29ubmVjdGVkQ2FsbGJhY2ssIGRpc2Nvbm5lY3RlZENhbGxiYWNrIH0gPSBwcm90bztcblxuICAgIHByb3RvLmNvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gKG11dGF0aW9uTGlzdDogTXV0YXRpb25SZWNvcmRbXSkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50c1RvV2F0Y2ggPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSk7XG4gICAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25MaXN0KSB7XG4gICAgICAgICAgY29uc3QgYWRkZWROb2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2RlcykubWFwKGUgPT4gZSBhcyBFbGVtZW50KTtcbiAgICAgICAgICBjb25zdCByZW1vdmVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpLm1hcChlID0+IGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIGFkZGVkTm9kZXMuZmluZChuID0+IGVsZW1lbnRzVG9XYXRjaC5pbmNsdWRlcyhuKSkpIHtcbiAgICAgICAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcblxuICAgICAgY29uc3QgZWxlbWVudHNBZGRlZCA9IHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSA/PyBbXTtcbiAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShBcnJheS5mcm9tKGVsZW1lbnRzQWRkZWQpLCBbXSk7XG4gICAgfTtcblxuICAgIHByb3RvLmRpc2Nvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9O1xufVxuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgOmhvc3Qge1xuICAgIGRpc3BsYXk6IGJsb2NrOyAvKiBuZWNlc3NhcnkgdG8gY2FsY3VsYXRlIHNjYWxpbmcgcG9zaXRpb24gKi9cbiAgfVxuICBzbG90W25hbWU9J3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnXSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgZ2FwOiAwLjVyZW07XG4gIH1cblxuICA6aG9zdDo6cGFydChhc3NvY2lhYmxlcy1jb250YWluZXIpIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoXG4gICAgICAxODBkZWcsXG4gICAgICByZ2IoMCAwIDAgLyAwJSkgY2FsYyg1MCUgLSAxcHgpLFxuICAgICAgdmFyKC0tcXRpLWJvcmRlci1jb2xvci1ncmF5KSBjYWxjKDUwJSksXG4gICAgICByZ2IoMCAwIDAgLyAwJSkgY2FsYyg1MCUgKyAxcHgpXG4gICAgKTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgcmVtb3ZlRG91YmxlU2xhc2hlcyB9IGZyb20gJy4uLy4uL2ludGVybmFsL3V0aWxzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUN1c3RvbUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICAvLyBUaGlzIGN1c3RvbS1pbnRlcmFjdGlvbiBzdXBwb3J0IHRoZSBDRVMgQVBJIHdoaWNoIGlzIHVzZSBpbiBGQUNFVFxuICAvL1xuICAvLyBJdCB3b3JrcyBsaWtlIHRoaXM6XG4gIC8vIDEuIFRoZSBDSSBtYW5pZmVzdCBpcyBmZXRjaGVkXG4gIC8vIDIuIEFuIGlmcmFtZSBpcyBjcmVhdGVkIGFuZCB0aGUgZmlyc3Qgc3R5bGUgYW5kIGZpcnN0IHNjcmlwdCBmcm9tIHRoZSBtYW5pZmVzdCBhcmUgbG9hZGVkXG4gIC8vIDMuIFRoZSBmaXJzdCBzY3JpcHQgaXMgYm9vdHN0cmFwLmpzIHdoaWNoIGFsc28gY3JlYXRlcyBhbiBpZnJhbWUgYW5kIGxvYWRzIHRoZSBmaXJzdCBtZWRpYSBmcm9tIHRoZSBtYW5pZmVzdFxuICAvLyA0LiBDb21tdW5pY2F0aW9uIGlzIGRvbmUgdmlhIHRoZSBDRVMgQVBJIGJ1dCBiZWNhdXNlIHRoZSBpZnJhbWUgaXMgbm90IGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBnbG9iYWwgQ0VTIG9iamVjdCB3ZSBuZWVkIHRvIHVzZSB3aW5kb3cucG9zdE1lc3NhZ2VcblxuICAvLyBUbyBhY2hpZXZlIHRoaXMgd2UgY2hhbmdlIHRoZSBwYWNrYWdlIGJ5IHJlcGxhY2luZyB0aGUgYm9vdHN0cmFwLmpzIHdpdGggb3VyIG93biBhbmQgaW5qZWN0IGEgcHJveHkgQ0VTIEFQSSB0aGF0IGNvbW11bmljYXRlcyB2aWEgcG9zdE1lc3NhZ2VcbiAgLy8gQmVjYXVzZSB3ZSBhbHNvIHdhbnQgdG8gcnVuIHRoaXMgaW4gc3Rvcnlib29rLCB3ZSBjYW5ub3QgdXNlIHdpbmRvdy50b3AgYmVjYXVzZSB0byBzZW5kIG1lc3NhZ2VzIHRoZXJlLCBiZWNhdXNlIGluIGNhc2Ugb2Ygc3Rvcnlib29rIHRoYXQgaXMgbm90IHRoZSB0b3Agd2luZG93LlxuICAvLyBTbyB3ZSBzZW5kIG1lc3NhZ2VzIHRvIGFsbCBwYXJlbnQgd2luZG93c1xuICBwcml2YXRlIHJhd1Jlc3BvbnNlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlID0gdGhpcy5oYW5kbGVQb3N0TWVzc2FnZS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhJyB9KVxuICBkYXRhOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLWJhc2UtaXRlbScgfSlcbiAgYmFzZUl0ZW1Vcmw6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtYmFzZS1yZWYnIH0pXG4gIGJhc2VSZWZVcmw6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2lkJyB9KVxuICBpZDogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcbiAgbWFuaWZlc3Q6IHtcbiAgICBzY3JpcHQ6IHN0cmluZ1tdO1xuICAgIHN0eWxlOiBzdHJpbmdbXTtcbiAgICBtZWRpYTogc3RyaW5nW107XG4gIH07XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IHVyaVRvTWFuaWZlc3QgPSB0aGlzLmRhdGEuc3RhcnRzV2l0aCgnaHR0cCcpXG4gICAgICA/IHRoaXMuZGF0YVxuICAgICAgOiByZW1vdmVEb3VibGVTbGFzaGVzKHRoaXMuYmFzZUl0ZW1VcmwgKyAnLycgKyB0aGlzLmRhdGEpO1xuICAgIC8vIGZldGNoIHRoZSBqc29uIGZpbGUgbG9jYXRlZCBhdCB0aGUgZGF0YSBhdHRyaWJ1dGVcbiAgICBmZXRjaCh1cmlUb01hbmlmZXN0KVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuanNvbigpKVxuICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgIHRoaXMubWFuaWZlc3QgPSBkYXRhO1xuICAgICAgICB0aGlzLnNldHVwQ0VTKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIHRoaXMuX2Vycm9yTWVzc2FnZSA9IGVycjtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gTUg6IENoYW5nZWQgdGhlIGRlZmF1bHQgYm9vdHN0cmFwLmpzIHRvIHVzZSB0aGUgbmV3IENFUyBBUElcbiAgLy8gQmVjYXVzZSB0aGUgb2xkIG9uZSB1c2VzIHRoZSBnbG9iYWwgQ0VTIG9iamVjdCB0aGF0IGlzIG5vdCBhbGxvd2VkIHRvIGJlIGFjY2Vzc2VkIHdoZW4gdGhlIENJXG4gIC8vIGlzIGVtYmVkZGVkIGluIGFuIGlmcmFtZSBhbmQgY29taW5nIGZyb20gYW5vdGhlciBkb21haW5cbiAgLy8gVGhlcmVmb3Igd2UgbmVlZCB0byB1c2UgdGhlIG5ldyBDRVMgQVBJIHRvIGNvbW11bmljYXRlcyB2aWEgdGhlIGJyb2FkY2FzdCBBUElcbiAgc2V0dXBDRVMoKSB7XG4gICAgY29uc3QgaWZyYW1lID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJyNwY2lDb250YWluZXInKSBhcyBIVE1MSUZyYW1lRWxlbWVudCxcbiAgICAgIGlmcmFtZVdpbiA9IGlmcmFtZS5jb250ZW50V2luZG93IHx8IGlmcmFtZSxcbiAgICAgIGlmcmFtZURvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG5cbiAgICAvLyBjb25zdCBjaGFubmVsID0gbmV3IEJyb2FkY2FzdENoYW5uZWwoJ2Nlc19jaGFubmVsJyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlKTtcbiAgICBpZnJhbWVEb2Mub3BlbigpO1xuICAgIGlmcmFtZURvYy53cml0ZShgXG4gICAgICA8aHRtbD5cbiAgICAgICAgPGhlYWQ+XG4gICAgICAgICAgPGxpbmsgaHJlZj0nJHtyZW1vdmVEb3VibGVTbGFzaGVzKGAke3RoaXMuYmFzZVJlZlVybH0vJHt0aGlzLm1hbmlmZXN0LnN0eWxlWzBdfWApfScgcmVsPVwic3R5bGVzaGVldFwiIC8+XG4gICAgICAgICAgPHNjcmlwdCBzcmM9JyR7cmVtb3ZlRG91YmxlU2xhc2hlcyhgJHt0aGlzLmJhc2VSZWZVcmx9LyR7dGhpcy5tYW5pZmVzdC5zY3JpcHRbMF19YCl9Jz48L3NjcmlwdD5cbiAgICAgICAgPC9oZWFkPlxuICAgICAgICA8Ym9keT48L2JvZHk+XG4gICAgICA8L2h0bWw+XG4gICAgICBgKTtcblxuICAgIGlmcmFtZURvYy5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJRnJhbWVzKCkge1xuICAgIGNvbnN0IGlmcmFtZXNJblNoYWRvd1Jvb3QgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJyk7XG4gICAgY29uc3QgaWZyYW1lID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcblxuICAgIGNvbnN0IG91dGVySUZyYW1lcyA9IFsuLi5pZnJhbWVzSW5TaGFkb3dSb290LCAuLi5pZnJhbWVdO1xuICAgIGZvciAoY29uc3QgaWZyYW1lIG9mIG91dGVySUZyYW1lcykge1xuICAgICAgY29uc3QgaWZyYW1lU3JjID0gaWZyYW1lLnNyYztcbiAgICAgIGNvbnN0IGlzU2FtZU9yaWdpbiA9IG5ldyBVUkwoaWZyYW1lU3JjLCB3aW5kb3cubG9jYXRpb24uaHJlZikub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICAgICAgaWYgKGlzU2FtZU9yaWdpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG91dGVyRG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICBpZiAob3V0ZXJEb2MpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0SW5uZXJJRnJhbWVzKG91dGVyRG9jLCBvdXRlcklGcmFtZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGFjY2Vzc2luZyBuZXN0ZWQgaWZyYW1lOicsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGdldCBvbmx5IHVuaXF1ZSBpZnJhbWVzXG4gICAgb3V0ZXJJRnJhbWVzLmZvckVhY2goKGlmcmFtZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChvdXRlcklGcmFtZXMuaW5kZXhPZihpZnJhbWUpICE9PSBpbmRleCkge1xuICAgICAgICBvdXRlcklGcmFtZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb3V0ZXJJRnJhbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbm5lcklGcmFtZXMoaWZyYW1lRG9jdW1lbnQ6IERvY3VtZW50LCBpZnJhbWVzID0gW10pIHtcbiAgICAvLyBHZXQgYWxsIGlmcmFtZXMgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAgICBjb25zdCBjdXJyZW50SWZyYW1lcyA9IGlmcmFtZURvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuXG4gICAgY3VycmVudElmcmFtZXMuZm9yRWFjaChpZnJhbWUgPT4ge1xuICAgICAgLy8gQWRkIHRoZSBjdXJyZW50IGlmcmFtZSB0byB0aGUgbGlzdFxuICAgICAgaWZyYW1lcy5wdXNoKGlmcmFtZSk7XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGdldCBpZnJhbWVzIHdpdGhpbiB0aGUgY3VycmVudCBpZnJhbWVcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBpZnJhbWUgc3JjIGlzIGZyb20gdGhlIHNhbWUgb3JpZ2luXG4gICAgICBjb25zdCBpZnJhbWVTcmMgPSBpZnJhbWUuc3JjO1xuICAgICAgY29uc3QgaXNTYW1lT3JpZ2luID0gbmV3IFVSTChpZnJhbWVTcmMsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG5cbiAgICAgIGlmIChpc1NhbWVPcmlnaW4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBuZXN0ZWREb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICAgIHRoaXMuZ2V0SW5uZXJJRnJhbWVzKG5lc3RlZERvYywgaWZyYW1lcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhY2Nlc3NpbmcgbmVzdGVkIGlmcmFtZTonLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTa2lwcGVkIGNyb3NzLW9yaWdpbiBpZnJhbWU6JywgaWZyYW1lU3JjKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBpZnJhbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3N0VG9XaW5kb3dBbmRJZnJhbWVzKHR5cGU6IHN0cmluZywgZGF0YTogYW55KSB7XG4gICAgd2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZSwgZGF0YSB9LCAnKicpO1xuICAgIGNvbnN0IGlmcmFtZXMgPSB0aGlzLmdldElGcmFtZXMoKTtcbiAgICBmb3IgKGNvbnN0IGlmcmFtZSBvZiBpZnJhbWVzKSB7XG4gICAgICBpZiAoaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoeyB0eXBlLCBkYXRhIH0sICcqJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlUG9zdE1lc3NhZ2UoZXZlbnQ6IE1lc3NhZ2VFdmVudCkge1xuICAgIGNvbnN0IHsgdHlwZSwgZGF0YSB9ID0gZXZlbnQuZGF0YTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3NldFJlc3BvbnNlJzpcbiAgICAgICAgdGhpcy5yYXdSZXNwb25zZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKGRhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2dldFJlc3BvbnNlJzoge1xuICAgICAgICB0aGlzLnBvc3RUb1dpbmRvd0FuZElmcmFtZXMoJ3Jlc3BvbnNlRGF0YScsIHRoaXMucmF3UmVzcG9uc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2dldE1lZGlhJzoge1xuICAgICAgICBjb25zdCBtZWRpYURhdGEgPSB0aGlzLm1hbmlmZXN0Lm1lZGlhLm1hcChtZWRpYSA9PiB7XG4gICAgICAgICAgY29uc3QgdXJsID0gbWVkaWEuc3RhcnRzV2l0aCgnaHR0cCcpID8gbWVkaWEgOiByZW1vdmVEb3VibGVTbGFzaGVzKHRoaXMuYmFzZVJlZlVybCArICcvJyArIG1lZGlhKTtcbiAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb3N0VG9XaW5kb3dBbmRJZnJhbWVzKCdtZWRpYURhdGEnLCBtZWRpYURhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3NldFN0YWdlSGVpZ2h0JzpcbiAgICAgICAgY29uc29sZS5sb2coJ3NldFN0YWdlSGVpZ2h0IG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yYXdSZXNwb25zZSAhPT0gJyc7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJhd1Jlc3BvbnNlO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmF3UmVzcG9uc2UgPSB2YWw7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UpO1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGlmcmFtZVxuICAgICAgICB3aWR0aD0ke3RoaXMuZ2V0QXR0cmlidXRlKCd3aWR0aCcpfVxuICAgICAgICBoZWlnaHQ9JHt0aGlzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyl9XG4gICAgICAgIGZyYW1lYm9yZGVyPVwiMFwiXG4gICAgICAgIHRpdGxlPVwicGNpQ29udGFpbmVyXCJcbiAgICAgICAgaWQ9XCJwY2lDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgPC9pZnJhbWU+XG4gICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZSAmJlxuICAgICAgaHRtbGA8ZGl2IHN0eWxlPVwiY29sb3I6cmVkXCI+XG4gICAgICAgIDxoMT5FcnJvcjwvaDE+XG4gICAgICAgICR7dGhpcy5fZXJyb3JNZXNzYWdlfVxuICAgICAgPC9kaXY+YH1gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nOiBRdGlDdXN0b21JbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbkBjdXN0b21FbGVtZW50KCdxdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjb3VudC1hdHRlbXB0JyB9KVxuICBwdWJsaWMgY291bnRBdHRlbXB0OiBzdHJpbmcgPSAndHJ1ZSc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIHB1YmxpYyB0aXRsZTogJ2VuZCBhdHRlbXB0JztcblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAvLyBub3QgaW1wbGVtZW50ZWQgYnkgZGVzaWduXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIC8vIG5vdCBpbXBsZW1lbnRlZCBieSBkZXNpZ25cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8YnV0dG9uID9kaXNhYmxlZD0ke3RoaXMuZGlzYWJsZWR9IHBhcnQ9XCJidXR0b25cIiBAY2xpY2s9JHt0aGlzLmVuZEF0dGVtcHR9PiR7dGhpcy50aXRsZX08L2J1dHRvbj5gO1xuICB9XG4gIHB1YmxpYyBlbmRBdHRlbXB0KGU6IEV2ZW50KSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdlbmQtYXR0ZW1wdCcsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQ6IHRoaXMuY291bnRBdHRlbXB0ID09PSAndHJ1ZScgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic6IFF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdhcE1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktZ2FwLXRleHQnLCBmYWxzZSwgJ3F0aS1nYXAnKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG5cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1ib3R0b20pIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gICAgICB9XG4gICAgICAvKiBbcGFydD0nZHJvcHMnXSAsICovXG4gICAgICBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj4gPC9zbG90PjxzbG90IHBhcnQ9XCJkcmFnc1wiIG5hbWU9XCJxdGktZ2FwLXRleHRcIj48L3Nsb3Q+IDxzbG90IHBhcnQ9XCJkcm9wc1wiPjwvc2xvdD5gO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBsZXQgbWF0Y2hlczogeyB0ZXh0OiBzdHJpbmc7IGdhcDogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIG1hdGNoZXMgPSByZXNwb25zZS5tYXAoeCA9PiB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0geC5zcGxpdCgnICcpO1xuICAgICAgICByZXR1cm4geyB0ZXh0OiBzcGxpdFswXSwgZ2FwOiBzcGxpdFsxXSB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2FwcyA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWdhcCcpO1xuICAgIGdhcHMuZm9yRWFjaCgoZ2FwLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaWRlbnRpZmllciA9IGdhcC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgIGNvbnN0IHRleHRJZGVudGlmaWVyID0gbWF0Y2hlcy5maW5kKHggPT4geC5nYXAgPT09IGlkZW50aWZpZXIpPy50ZXh0O1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMucXVlcnlTZWxlY3RvcihgcXRpLWdhcC10ZXh0W2lkZW50aWZpZXI9XCIke3RleHRJZGVudGlmaWVyfVwiXWApPy50ZXh0Q29udGVudC50cmltKCk7XG4gICAgICBpZiAodGV4dElkZW50aWZpZXIgJiYgdGV4dCkge1xuICAgICAgICBpZiAoIWdhcC5uZXh0RWxlbWVudFNpYmxpbmc/LmNsYXNzTGlzdC5jb250YWlucygnY29ycmVjdC1vcHRpb24nKSkge1xuICAgICAgICAgIGNvbnN0IHRleHRTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgIHRleHRTcGFuLmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3Qtb3B0aW9uJyk7XG4gICAgICAgICAgdGV4dFNwYW4udGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgICAgIGdhcC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgdGV4dFNwYW4pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGdhcC5uZXh0RWxlbWVudFNpYmxpbmc/LmNsYXNzTGlzdC5jb250YWlucygnY29ycmVjdC1vcHRpb24nKSkge1xuICAgICAgICBnYXAubmV4dEVsZW1lbnRTaWJsaW5nLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlHYXBNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBzdmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcXVlcnksIHF1ZXJ5QXNzaWduZWRFbGVtZW50cywgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljQXNzb2NpYXRlSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBob3RzcG90cztcbiAgc3RhcnRQb2ludCA9IG51bGw7XG4gIGVuZFBvaW50ID0gbnVsbDtcbiAgQHN0YXRlKCkgX2xpbmVzID0gW107XG4gIEBzdGF0ZSgpIHN0YXJ0Q29vcmQ6IHsgeDogYW55OyB5OiBhbnkgfTtcbiAgQHN0YXRlKCkgbW91c2VDb29yZDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICBAcXVlcnkoJ3N2ZycpIHN2Z0NvbnRhaW5lcjtcbiAgQHF1ZXJ5QXNzaWduZWRFbGVtZW50cyh7IHNlbGVjdG9yOiAnaW1nJyB9KSBnckltYWdlO1xuXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgLy8gcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChxdGktYXNzb2NpYWJsZS1ob3RzcG90KSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgfVxuICAgICAgbGluZS1jb250YWluZXIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICAgc3ZnIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDBweDtcbiAgICAgICAgbGVmdDogMHB4O1xuICAgICAgfVxuICAgIGBcbiAgXTtcbiAgc3ZnOiBTVkdTVkdFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9saW5lcyA9IFtdO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9saW5lcy5sZW5ndGggPiAwO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdGhpcy5fbGluZXMgPSB2YWw7XG4gICAgfVxuICB9XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpbmVzO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8bGluZS1jb250YWluZXI+XG4gICAgICAgIDxzdmdcbiAgICAgICAgICB3aWR0aD0ke2lmRGVmaW5lZCh0aGlzLmdySW1hZ2VbMF0/LndpZHRoKX1cbiAgICAgICAgICBoZWlnaHQ9JHtpZkRlZmluZWQodGhpcy5nckltYWdlWzBdPy5oZWlnaHQpfVxuICAgICAgICAgIHZpZXdib3g9XCIwIDAgJHt0aGlzLmdySW1hZ2VbMF0/LndpZHRofSAke3RoaXMuZ3JJbWFnZVswXT8uaGVpZ2h0fVwiXG4gICAgICAgID5cbiAgICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICAgIHRoaXMuX2xpbmVzLFxuICAgICAgICAgICAgbGluZSA9PiBsaW5lLFxuICAgICAgICAgICAgKGxpbmUsIGluZGV4KSA9PiBzdmdgXG4gICAgICAgICAgICAgIDxsaW5lXG4gICAgICAgICAgICAgICAgcGFydD1cImxpbmVcIlxuICAgICAgICAgICAgICAgIHgxPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVswXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTE9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzBdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHgyPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVsxXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTI9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzFdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHN0cm9rZT1cInJlZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiXG4gICAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZXMgPSB0aGlzLl9saW5lcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgYFxuICAgICAgICAgICl9XG4gICAgICAgICAgJHt0aGlzLnN0YXJ0UG9pbnQgJiZcbiAgICAgICAgICBzdmdgPGxpbmVcbiAgICAgICAgICAgIHBhcnQ9XCJwb2ludFwiXG4gICAgICAgICAgICB4MT0ke3RoaXMuc3RhcnRDb29yZC54fVxuICAgICAgICAgICAgeTE9JHt0aGlzLnN0YXJ0Q29vcmQueX1cbiAgICAgICAgICAgIHgyPSR7dGhpcy5tb3VzZUNvb3JkLnh9XG4gICAgICAgICAgICB5Mj0ke3RoaXMubW91c2VDb29yZC55fVxuICAgICAgICAgICAgc3Ryb2tlPVwicmVkXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIlxuICAgICAgICAgIC8+YH1cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvbGluZS1jb250YWluZXI+YDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG4gICAgcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGUpOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoZSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktYXNzb2NpYWJsZS1ob3RzcG90Jyk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudCA9PiB7XG4gICAgICB0aGlzLm1vdXNlQ29vcmQgPSB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSB0aGlzLmdySW1hZ2VbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSAtIHRoaXMuZ3JJbWFnZVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVswXSArICdweCc7XG4gICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzFdICsgJ3B4JztcblxuICAgICAgaG90c3BvdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0UG9pbnQpIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB0aGlzLnN0YXJ0Q29vcmQgPSB7XG4gICAgICAgICAgICB4OiB0aGlzLnN0YXJ0UG9pbnQuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzBdLFxuICAgICAgICAgICAgeTogdGhpcy5zdGFydFBvaW50LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVsxXVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZW5kUG9pbnQpIHtcbiAgICAgICAgICB0aGlzLmVuZFBvaW50ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgICAgdGhpcy5fbGluZXMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLl9saW5lcyxcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQb2ludC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSArICcgJyArIHRoaXMuZW5kUG9pbnQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJylcbiAgICAgICAgICBdO1xuICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic6IFF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi8uLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpb25Ib3RzcG90cyhcbiAgc2hhcGU6IHN0cmluZyxcbiAgY29vcmRzTnVtYmVyOiBudW1iZXJbXSxcbiAgaW1nOiBIVE1MSW1hZ2VFbGVtZW50LFxuICBob3RzcG90OiBRdGlIb3RzcG90Q2hvaWNlXG4pIHtcbiAgc3dpdGNoIChzaGFwZSkge1xuICAgIGNhc2UgJ2NpcmNsZSc6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXNdID0gY29vcmRzTnVtYmVyO1xuICAgICAgICBjb25zdCBjZW50ZXJYUGVyID0gKGNlbnRlclggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBjZW50ZXJZUGVyID0gKGNlbnRlclkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmFkaXVzUGVyID0gKHJhZGl1cyAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGNlbnRlclhQZXIgLSByYWRpdXNQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gY2VudGVyWVBlciAtIHJhZGl1c1BlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gNCAqIHJhZGl1c1BlciArICdweCc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUuYm9yZGVyUmFkaXVzID0gYDk5OTlweGA7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3JlY3QnOlxuICAgICAge1xuICAgICAgICBjb25zdCBbbGVmdFgsIHRvcFksIHJpZ2h0WCwgYm90dG9tWV0gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgIGNvbnN0IGxlZnRYUGVyID0gKGxlZnRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgdG9wWVBlciA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHJpZ2h0WFBlciA9IChyaWdodFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBib3R0b21ZUGVyID0gKGJvdHRvbVkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gbGVmdFhQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gdG9wWVBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WFBlciAtIGxlZnRYUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVlQZXIgLSB0b3BZUGVyICsgJyUnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwb2x5JzpcbiAgICAgIHtcbiAgICAgICAgLy8gZnJvbSBhLGIsYyxkLGUsZiA9PiBbe3g6YSwgeTpifSx7eDpjLCB5OmR9LHt4OmUsIHk6Zn1dXG4gICAgICAgIGNvbnN0IHBvbHljb29yZHMgPSBjb29yZHNOdW1iZXIucmVkdWNlKChhY2MsIGN1cnJlbnRWYWx1ZSwgY3VycmVudEluZGV4LCBwb2x5QykgPT4ge1xuICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggJSAyID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0VmFsID0gYWNjLnBvcCgpO1xuICAgICAgICAgICAgYWNjW2FjYy5sZW5ndGhdID0geyB4OiBsYXN0VmFsLCB5OiBwb2x5Q1tjdXJyZW50SW5kZXhdIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgYm91bmRpbmcgYm94IGJ5IGZpbmRpbmcgdGhlIG1heCBheCBtaW4gY29vcmRpbmF0ZXMgb2YgeCBhbmQgeVxuICAgICAgICBjb25zdCBsZWZ0WCA9IE1hdGgubWluKC4uLnBvbHljb29yZHMubWFwKHBvaW50ID0+IHBvaW50LngpKTtcbiAgICAgICAgY29uc3QgcmlnaHRYID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueCkpO1xuICAgICAgICBjb25zdCB0b3BZID0gTWF0aC5taW4oLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuICAgICAgICBjb25zdCBib3R0b21ZID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgcmVsYXRpdmUgZGlzdGFuY2UgY2F1c2Ugd2Ugd2FudCB0byB1c2UgcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgbGVmdFhQZXIgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCB0b3BZUGVyID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmlnaHRYUGVyID0gKHJpZ2h0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGJvdHRvbVlQZXIgPSAoYm90dG9tWSAvIGltZy5oZWlnaHQpICogMTAwO1xuXG4gICAgICAgIC8vIHNldCB0aGUgaG90c3BvdCBvbiB4LHkgYW5kIHNldCB0aGUgd2lkdGggYW5kIGhlaWdodCBpbiBwZXJjZW50YWdlc1xuICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDAgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFhQZXIgLSBsZWZ0WFBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZUGVyIC0gdG9wWVBlciArICclJztcblxuICAgICAgICAvLyBhbGwgdGhlIHBvbHlnb24gcG9pbnRzIHNob3VsZCBiZSBjb3JyZWN0ZWQgY2F1c2VkIHRoZXkgYXJlIGZyb21cbiAgICAgICAgLy8gaW1hZ2UgMCwwIHBvaW50LCBhbmQgc2hvdWxkIGJlIGZyb20gdGhlIGhvdHNwb3QgcG9pbnQgd2hpY2ggYWxyZWFkeVxuICAgICAgICAvLyBoYXMgYmVlbiBvZmZzZXR0ZWQgZnJvbSB0aGUgaW1hZ2UgaW4gdGhlIHByZXZpb3VzIGZldyBsaW5lcyBvZiBjb2RlXG4gICAgICAgIC8vIGFsc28gdGhlIHBvaW50cyBoYXZlIGEgcmVsYXRpdmUgZGlzdGFuY2UgdG8gdGhlIGltYWdlLCBidXQgbm93IGhhdmVcbiAgICAgICAgLy8gdG8gaGF2ZSBhIHJlbGF0aXZlIGRpc3RhbmNlIGZyb20gdGhlIHdpZHRoIG9mIHRoZSBob3RzcG90XG4gICAgICAgIGNvbnN0IHBvbHlnb25EYXRhID0gcG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gKHtcbiAgICAgICAgICB4OiAoKHBvaW50LnggLSBsZWZ0WCkgLyAocmlnaHRYIC0gbGVmdFgpKSAqIDEwMCxcbiAgICAgICAgICB5OiAoKHBvaW50LnkgLSB0b3BZKSAvIChib3R0b21ZIC0gdG9wWSkpICogMTAwXG4gICAgICAgIH0pKTtcblxuICAgICAgICAvLyBjcmVhdGUgY2xpcCBwYXRoIGNvb3JkaW5hdGUgc3R5bGUgaW4gcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgcG9seUQgPSBwb2x5Z29uRGF0YS5tYXAocCA9PiBNYXRoLnJvdW5kKHAueCkgKyAnJSAnICsgTWF0aC5yb3VuZChwLnkpICsgJyUnKS5qb2luKCcsJyk7XG5cbiAgICAgICAgLy8gNTAlIDAlLCAxMDAlIDUwJSwgNTAlIDEwMCUsIDAlIDUwJVxuICAgICAgICBob3RzcG90LnN0eWxlLmNsaXBQYXRoID0gYHBvbHlnb24oJHtwb2x5RH0pYDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNHYXBNYXRjaEludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKFxuICBJbnRlcmFjdGlvbixcbiAgJ3F0aS1nYXAtaW1nJyxcbiAgZmFsc2UsXG4gICdxdGktYXNzb2NpYWJsZS1ob3RzcG90J1xuKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cbiAgICBzbG90W25hbWU9J3F0aS1nYXAtaW1nJ10ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGdhcDogMXJlbTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPHNsb3QgbmFtZT1cInF0aS1nYXAtaW1nXCI+PC9zbG90PmA7XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIoZTogQ3VzdG9tRXZlbnQ8bnVsbD4pOiB2b2lkIHtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgaG90c3BvdCA9IGUudGFyZ2V0IGFzIFF0aUhvdHNwb3RDaG9pY2U7XG4gICAgY29uc3QgY29vcmRzID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpO1xuICAgIGNvbnN0IHNoYXBlID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ3NoYXBlJyk7XG4gICAgY29uc3QgY29vcmRzTnVtYmVyID0gY29vcmRzLnNwbGl0KCcsJykubWFwKHMgPT4gcGFyc2VJbnQocykpO1xuXG4gICAgLy8gcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICAgIHN3aXRjaCAoc2hhcGUpIHtcbiAgICAgIGNhc2UgJ2NpcmNsZSc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBbY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBjZW50ZXJYIC0gcmFkaXVzICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGNlbnRlclkgLSByYWRpdXMgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSBob3RzcG90LnN0eWxlLmhlaWdodCA9IDIgKiByYWRpdXMgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyZWN0JzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtsZWZ0WCwgdG9wWSwgcmlnaHRYLCBib3R0b21ZXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBsZWZ0WCArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSB0b3BZICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gcmlnaHRYIC0gbGVmdFggKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gYm90dG9tWSAtIHRvcFkgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY0dhcE1hdGNoSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgQ2hvaWNlLCBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBIb3RzcG90Q2hvaWNlID0gQ2hvaWNlICYgeyBvcmRlcjogbnVtYmVyIH07XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb24gZXh0ZW5kcyBDaG9pY2VzTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuXG4gIC8vIGRvIG5vdCBzZWxlY3QgKCBoaWdobGlnaHQgYmx1ZSwgdGhlIGltYWdlKVxuICAvLyB0YXJnZXQgdGhlIG1haW4gc2xvdCBtYWtlIGl0IHJlbGF0aXZlIGFuZCBmaXQgd2l0aCB0aGUgY29udGVuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgc2xvdDpub3QoW25hbWU9J3Byb21wdCddKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogcXRpLWhvdHNwb3QtY2hvaWNlIHJlbGF0aXZlIHRvIHRoZSBzbG90ICovXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7IC8qIGhvdHNwb3RzIG5vdCBzdHJldGNoaW5nIGZ1cnRoZXIgaWYgaW1hZ2UgaXMgYXQgbWF4IHNpemUgKi9cbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgLyogaW1hZ2Ugbm90IHNlbGVjdGFibGUgYW55bW9yZSAqL1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SG90c3BvdE9yZGVyKGU6IEN1c3RvbUV2ZW50PHsgaWRlbnRpZmllcjogc3RyaW5nOyBjaGVja2VkOiBib29sZWFuIH0+KTogdm9pZCB7XG4gICAgY29uc3QgeyBpZGVudGlmaWVyIH0gPSBlLmRldGFpbDtcblxuICAgIGNvbnN0IGhvdHNwb3QgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maW5kKGVsID0+IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpID09PSBpZGVudGlmaWVyKSBhcyBIb3RzcG90Q2hvaWNlO1xuXG4gICAgY29uc3QgbWF4U2VsZWN0aW9uID0gdGhpcy5fY2hvaWNlRWxlbWVudHMubGVuZ3RoO1xuICAgIGlmICghdGhpcy5jaG9pY2VPcmRlcmluZykge1xuICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IHRydWU7XG4gICAgICBpZiAoaG90c3BvdC5vcmRlciA9PSBudWxsKSB7XG4gICAgICAgIGlmICgodGhpcy5fY2hvaWNlRWxlbWVudHMgYXMgSG90c3BvdENob2ljZVtdKS5maWx0ZXIoaSA9PiBpLm9yZGVyID4gMCkubGVuZ3RoID49IG1heFNlbGVjdGlvbikge1xuICAgICAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47IC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIHVzZXIgYWxyZWFkeSBzZWxlY3RlZCA1IGltYWdlcy5cbiAgICAgICAgfVxuICAgICAgICBob3RzcG90Lm9yZGVyID0gKHRoaXMuX2Nob2ljZUVsZW1lbnRzIGFzIEhvdHNwb3RDaG9pY2VbXSkuZmlsdGVyKGkgPT4gISFpLm9yZGVyKS5sZW5ndGggKyAxO1xuICAgICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICh0aGlzLl9jaG9pY2VFbGVtZW50cyBhcyBIb3RzcG90Q2hvaWNlW10pLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICAgICAgaWYgKGhvdHNwb3Qub3JkZXIgPiBob3RzcG90Lm9yZGVyKSB7XG4gICAgICAgICAgICBob3RzcG90Lm9yZGVyLS07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBob3RzcG90O1xuICAgICAgICB9KTtcbiAgICAgICAgaG90c3BvdC5vcmRlciA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdhY3RpdmF0ZS1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhY3RpdmF0ZS1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHNwb3RJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXNNaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1ob3RzcG90LWNob2ljZScpIHtcbiAgLy8gZG8gbm90IHNlbGVjdCAoIGhpZ2hsaWdodCBibHVlLCB0aGUgaW1hZ2UpXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgLyogd2lkdGg6MTAwJTsgKi9cbiAgICAgIH1cbiAgICBgXG4gIF07XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWludGVyYWN0aW9uJzogUXRpSG90c3BvdEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQ1NTUmVzdWx0R3JvdXAsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VJbnRlcmFjdGlvbiB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0Jztcbi8vIGltcG9ydCB7IFRvdWNoRHJhZ0FuZERyb3AgfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AnO1xuaW1wb3J0ICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCB7IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24uc3R5bGVzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5pbnRlcmZhY2UgQ29sdW1uIHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUm93IHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBpc0NoZWNrZWQ6IGJvb2xlYW47XG59XG5cbkBjdXN0b21FbGVtZW50KCdxdGktbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oXG4gIEludGVyYWN0aW9uLFxuICAncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyxcbiAgZmFsc2UsXG4gICdxdGktc2ltcGxlLW1hdGNoLXNldDpsYXN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSdcbikge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICByb3dzOiBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlW107XG4gIGNvbHM6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2VbXTtcbiAgbGFzdENoZWNrZWRSYWRpbzogSFRNTElucHV0RWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIEBzdGF0ZSgpIF9yZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10gPSBbXTtcbiAgLy8gZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgcmV0dXJuIHN1cGVyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgIGVsc2UgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlIGFzIHN0cmluZ1tdO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZ1tdKSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgc3VwZXIudmFsdWUgPSB2YWw7XG4gICAgZWxzZSB0aGlzLl9yZXNwb25zZSA9IHZhbDtcbiAgfVxuICBAc3RhdGUoKSBjb3JyZWN0T3B0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KSByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZyA9ICcnO1xuXG4gIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpID0gbmV3IFRvdWNoRHJhZ0FuZERyb3AoKTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpLmFkZERyYWdnYWJsZUVsZW1lbnRzKFxuICAgIC8vICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgIC8vICk7XG4gICAgLy8gdGhpcy5kcmFnRHJvcEFwaS5hZGREcm9wcGFibGVFbGVtZW50cyhcbiAgICAvLyAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6bGFzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgIC8vICk7XG4gICAgdGhpcy5yb3dzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlPihcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuICAgIHRoaXMuY29scyA9IEFycmF5LmZyb208UXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZT4oXG4gICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0Omxhc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuXG4gICAgdGhpcy52YWx1ZSA9IFtdO1xuICB9XG5cbiAgaGFuZGxlUmFkaW9DbGljayA9IGUgPT4ge1xuICAgIGNvbnN0IHJhZGlvID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBpZiAodGhpcy5sYXN0Q2hlY2tlZFJhZGlvID09PSByYWRpbykge1xuICAgICAgcmFkaW8uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gbnVsbDtcbiAgICAgIHRoaXMuaGFuZGxlUmFkaW9DaGFuZ2UoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IHJhZGlvO1xuICAgIH1cbiAgfTtcblxuICBoYW5kbGVSYWRpb0NoYW5nZSA9IGUgPT4ge1xuICAgIGNvbnN0IGNoZWNrYm94ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCB2YWx1ZSA9IGNoZWNrYm94LnZhbHVlO1xuICAgIGNvbnN0IG5hbWUgPSBjaGVja2JveC5uYW1lO1xuICAgIGNvbnN0IHR5cGUgPSBjaGVja2JveC50eXBlO1xuXG4gICAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcbiAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gW3ZhbHVlXTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2LmluZGV4T2YobmFtZSkgPT09IC0xKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMudmFsdWUsIHZhbHVlXTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IGNoZWNrYm94O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSk7XG4gICAgICB0aGlzLmxhc3RDaGVja2VkUmFkaW8gPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxSZXNwb25zZUludGVyYWN0aW9uPigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IFsuLi50aGlzLnZhbHVlXSA6IHRoaXMudmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9O1xuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UocmVzcG9uc2VWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAocmVzcG9uc2VWYWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2VWYWx1ZSkpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbnMgPSByZXNwb25zZVZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSB7XG4gICAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PiA8c2xvdD48L3Nsb3Q+YDtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHRhYmxlPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgJHt0aGlzLmNvbHMubWFwKChjb2wsIGkpID0+IGh0bWxgPHRoIHBhcnQ9XCJyLWhlYWRlclwiPiR7dW5zYWZlSFRNTChjb2wuaW5uZXJIVE1MKX08L3RoPmApfVxuICAgICAgICA8L3RyPlxuXG4gICAgICAgICR7dGhpcy5yb3dzLm1hcChcbiAgICAgICAgICAocm93LCBySW5kZXgpID0+XG4gICAgICAgICAgICBodG1sYDx0cj5cbiAgICAgICAgICAgICAgPHRkIHBhcnQ9XCJjLWhlYWRlclwiPiR7dW5zYWZlSFRNTChyb3cuaW5uZXJIVE1MKX08L3RkPlxuICAgICAgICAgICAgICAke3RoaXMuY29scy5tYXAoKGNvbCwgY0luZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93SWQgPSByb3cuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sSWQgPSBjb2wuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBgJHtyb3dJZH0gJHtjb2xJZH1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSW5Sb3dDb3VudCA9IHRoaXMudmFsdWUuZmlsdGVyKHYgPT4gdi5zcGxpdCgnICcpWzBdID09PSByb3dJZCkubGVuZ3RoIHx8IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IHRoaXMudmFsdWUuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBgcmIgJHtjaGVja2VkID8gJ3JiLWNoZWNrZWQnIDogJyd9ICR7dGhpcy5jb3JyZWN0T3B0aW9ucy5pbmNsdWRlcyh2YWx1ZSkgPyAncmItY29ycmVjdCcgOiAnJ31gO1xuICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgaWYgbWF0Y2ggbWF4IGlzIGdyZWF0ZXIgdGhhbiAxIGFuZCBtYXggaXMgcmVhY2hlZFxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc2FibGUgPVxuICAgICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICA6IHJvdy5tYXRjaE1heCA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICA6IHNlbGVjdGVkSW5Sb3dDb3VudCA+PSByb3cubWF0Y2hNYXggJiYgIWNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgPHRkPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9JHtyb3cubWF0Y2hNYXggPT09IDEgPyAncmFkaW8nIDogYGNoZWNrYm94YH1cbiAgICAgICAgICAgICAgICAgICAgcGFydD0ke3BhcnR9XG4gICAgICAgICAgICAgICAgICAgIG5hbWU9JHtyb3dJZH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9JHt2YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgLmRpc2FibGVkPSR7ZGlzYWJsZX1cbiAgICAgICAgICAgICAgICAgICAgQGNoYW5nZT0ke2UgPT4gdGhpcy5oYW5kbGVSYWRpb0NoYW5nZShlKX1cbiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7ZSA9PiAocm93Lm1hdGNoTWF4ID09PSAxID8gdGhpcy5oYW5kbGVSYWRpb0NsaWNrKGUpIDogbnVsbCl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvdGQ+YDtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L3RyPmBcbiAgICAgICAgKX1cbiAgICAgIDwvdGFibGU+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qIFxucXRpLW1hdGNoLWludGVyYWN0aW9uXG5xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uXG4qL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuLy8gdHNsaW50OmRpc2FibGU6IGluZGVudFxuZXhwb3J0IGNsYXNzIFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIHNsb3RbbmFtZT0ncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSddIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgYDtcblxuICAvKiogdGhlIG1pbmltYWwgbnVtYmVyIG9mIHNlbGVjdGlvbnMgYSBjYW5kaWRhdGUgbXVzdCBtYWtlICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1pbidcbiAgfSlcbiAgcHVibGljIG1hdGNoTWluOiBudW1iZXIgPSAwO1xuXG4gIC8qKiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0aW9ucyBhIGNhbmRpZGF0ZSBtdXN0IG1ha2UsIHRoZSBvdGhlciBvcHRpb25zIHdpbGwgYmUgZGlzYWJsZWQgd2hlbiBtYXggb3B0aW9ucyBpcyBjaGVja2VkICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1heCdcbiAgfSlcbiAgcHVibGljIG1hdGNoTWF4OiBudW1iZXIgPSAxO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBhdHRyaWJ1dGU6ICdmaXhlZCdcbiAgfSlcbiAgcHVibGljIGZpeGVkID0gZmFsc2U7XG5cbiAgLy8gcGs6IFRoaXMgbmVlZHMgc29tZSBleHBsYW5hdGlvblxuICAvLyBpbiB0aGUgYXNzb2NpYXRlIGludGVyYWN0aW9uIHRoZXJlIGlzIGEgc3BlY2lhbCBzbG90IGZvciB0aGVzZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlc1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncGFydCcsICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyk7XG4gIH1cblxuICAvLyBwazogVGhpcyBuZWVkcyBzb21lIGV4cGxhbmF0aW9uXG4gIC8vIGluIHF0aS1tYXRjaC1pbnRlcmFjdGlvbiwgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyB1c2VkIHRvIGRlbm90ZSB0aGVcbiAgLy8gZHJhZ2dhYmxlLCBidXQgYWxzbyB0aGUgZHJvcHBhYmxlLiBXRUlSRC4uIGJ1dCBsZXRzIGRlYWwgd2l0aCBpdC5cbiAgLy8gU28gd2UgaGF2ZSBhIHNsb3QgZm9yIHdoZW5ldmVyIGFub3RoZXIgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyBkcm9wcGVkIGluIGhlcmUuXG4gIC8vIEFuZCB3ZSBoYXZlIHNsb3QgZm9yIGNvbnRlbnQgbGlrZSBpbiB0aGlzIGFzc29jaWF0ZSBpbnRlcmFjdGlvblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IHBhcnQ9XCJkcm9wc2xvdFwiIG5hbWU9XCJxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlXCI+PC9zbG90PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSc6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuLy8gaW1wb3J0IGNvbXBvbmVudFN0eWxlcyBmcm9tICcuLi8uLi91dGlsaXRpZXMvc3R5bGVzL2NvbXBvbmVudC5zdHlsZXMnO1xuXG4vKiAke2NvbXBvbmVudFN0eWxlc30gKi9cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgc2xvdCB7XG4gICAgLyogc2xvdCB3aGVyZSB0aGUgKi9cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiAwLjVyZW07XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IC8qIHByZXZlbnRzIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZpbmcgdGhlIHNhbWUgaGVpZ2h0ICovXG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkgc2xvdCB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIHNsb3Qge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gIH1cbiAgc2xvdFtuYW1lPSdwcm9tcHQnXSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbiAgOjpzbG90dGVkKHF0aS1zaW1wbGUtbWF0Y2gtc2V0KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZlIHRoZSBzYW1lIHdpZHRoICovXG4gICAgZmxleDogMTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1lZGlhLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlNZWRpYUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIF92YWx1ZSA9IDA7XG4gIHJlc2V0KCkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBtYXliZSBjaGVjayBpZiB0aGUgbWVkaWEgaGFzIGJlZW4gcGxheWVkP1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4ocGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpKTtcbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gcGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLkludGVyYWN0aW9uLnByb3BlcnRpZXMsXG4gICAgICAuLi57XG4gICAgICAgIHN0ZXA6IHtcbiAgICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgICAgYXR0cmlidXRlOiAnc3RlcCcsXG4gICAgICAgICAgZGVmYXVsdDogMTBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW2Nzc2BgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vIGdldCBhdWRpbywgdmlkZW8gb2Ygb2JqZWN0IHRhZy5cbiAgICBjb25zdCBtZWRpYU9iamVjdCA9IHRoaXMucXVlcnlTZWxlY3RvcignYXVkaW8nKSB8fCB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJykgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCdvYmplY3QnKTtcbiAgICBpZiAobWVkaWFPYmplY3QpIHtcbiAgICAgIC8vIGxpc3RlbiB0byBlbmRlZCBldmVudFxuICAgICAgbWVkaWFPYmplY3QuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCAoKSA9PiB7XG4gICAgICAgIC8vIHNldCB2YWx1ZSB0byAwXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoaXMudmFsdWUgaXMgYSBudW1iZXJcbiAgICAgICAgdGhpcy5fdmFsdWUrKztcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW1lZGlhLWludGVyYWN0aW9uJzogUXRpTWVkaWFJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBTaHVmZmxlTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4nOyAvLyBJbXBvcnQgdGhlIG1peGluXG5pbXBvcnQgeyBRdGlTaW1wbGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWNob2ljZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3JkZXJJbnRlcmFjdGlvbiBleHRlbmRzIFNodWZmbGVNaXhpbihcbiAgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKEludGVyYWN0aW9uLCBgcXRpLXNpbXBsZS1jaG9pY2VgLCB0cnVlLCAnZHJvcC1saXN0JyksXG4gICdxdGktc2ltcGxlLWNob2ljZSdcbikge1xuICBjaGlsZHJlbk1hcDogRWxlbWVudFtdO1xuXG4gIEBzdGF0ZSgpIG5yQ2hvaWNlczogbnVtYmVyID0gMDtcbiAgQHN0YXRlKCkgY29ycmVjdFJlc3BvbnNlczogc3RyaW5nW10gPSBbXTtcbiAgQHN0YXRlKCkgc2hvd0NvcnJlY3RSZXNwb25zZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICAgICAgICBncmlkLWF1dG8tY29sdW1uczogMWZyO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIFtwYXJ0PSdkcm9wcyddIHtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0ndmVydGljYWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSBbcGFydD0nZHJvcHMnXSB7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiByb3c7XG4gICAgICB9XG5cbiAgICAgIFtwYXJ0PSdkcm9wLWxpc3QnXSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgfVxuXG4gICAgICBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgICBpZiAodGhpcy5uckNob2ljZXMgPCBjaG9pY2VzLmxlbmd0aCkge1xuICAgICAgdGhpcy5uckNob2ljZXMgPSBjaG9pY2VzLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPiA8L3Nsb3Q+XG4gICAgICA8ZGl2IHBhcnQ9XCJjb250YWluZXJcIj5cbiAgICAgICAgPHNsb3QgcGFydD1cImRyYWdzXCI+IDwvc2xvdD5cbiAgICAgICAgPGRpdiBwYXJ0PVwiZHJvcHNcIj5cbiAgICAgICAgICAke0FycmF5LmZyb20oQXJyYXkodGhpcy5uckNob2ljZXMpKS5tYXAoXG4gICAgICAgICAgICAoXywgaSkgPT5cbiAgICAgICAgICAgICAgaHRtbGA8ZHJvcC1saXN0IHBhcnQ9XCJkcm9wLWxpc3RcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2l9XCI+PC9kcm9wLWxpc3Q+JHt0aGlzLnNob3dDb3JyZWN0UmVzcG9uc2VzICYmXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA+IGlcbiAgICAgICAgICAgICAgICAgID8gdW5zYWZlSFRNTChgPHNwYW4gcGFydD0nY29ycmVjdC1yZXNwb25zZSc+JHt0aGlzLmNvcnJlY3RSZXNwb25zZXNbaV19PC9zcGFuPmApXG4gICAgICAgICAgICAgICAgICA6ICcnfWBcbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgcmVzcG9uc2VzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICAgIHJlc3BvbnNlcy5mb3JFYWNoKChyZXNwb25zZSwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IHNpbXBsZUNob2ljZSA9IHRoaXMucXVlcnlTZWxlY3RvcihgcXRpLXNpbXBsZS1jaG9pY2VbaWRlbnRpZmllcj1cIiR7cmVzcG9uc2V9XCJdYCk7XG4gICAgICAgIGlmICghc2ltcGxlQ2hvaWNlKSB7XG4gICAgICAgICAgc2ltcGxlQ2hvaWNlID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYHF0aS1zaW1wbGUtY2hvaWNlW2lkZW50aWZpZXI9XCIke3Jlc3BvbnNlfVwiXWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGV4dCA9IHNpbXBsZUNob2ljZT8udGV4dENvbnRlbnQudHJpbSgpO1xuICAgICAgICB0aGlzLmNvcnJlY3RSZXNwb25zZXMgPSBbLi4udGhpcy5jb3JyZWN0UmVzcG9uc2VzLCB0ZXh0XTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSB0cnVlO1xuICB9XG5cbiAgLy8gc29tZSBpbnRlcmFjdGlvbnMgaGF2ZSBhIGRpZmZlcmVudCB3YXkgb2YgZ2V0dGluZyB0aGUgcmVzcG9uc2VcbiAgLy8gdGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgZHJhZyBhbmQgZHJvcCBtaXhpbiBjbGFzc1xuICAvLyB5b3UgaGF2ZSB0byBpbXBsZW1lbnQgeW91ciBvd24gZ2V0UmVzcG9uc2UgbWV0aG9kIGluIHRoZSBzdXBlcmNsYXNzXG4gIC8vIGNhdXNlIHRoZXkgYXJlIGRpZmZlcmVudCBmb3Igc29tZSBpbnRlcmFjdGlvbnMuXG4gIC8vIE1IOiBpcyB0aGlzIGZ1bmN0aW9uIGNhbGxlZD8gU2hvdWxkbid0IHdlIHVzZSBnZXRWYWx1ZT9cbiAgcHJvdGVjdGVkIGdldFJlc3BvbnNlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVDaG9pY2U+KHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdkcm9wLWxpc3QnKSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGRyb3BwYWJsZXMubWFwKGRyb3BwYWJsZSA9PiB7XG4gICAgICBjb25zdCBkcmFnc0luRHJvcHBhYmxlID0gZHJvcHBhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSBBcnJheS5mcm9tKGRyYWdzSW5Ecm9wcGFibGUpLm1hcChkID0+IGQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgcmV0dXJuIFsuLi5pZGVudGlmaWVyc10uam9pbignICcpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICB0aGlzLmNoaWxkcmVuTWFwID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgIHRoaXMuY2hpbGRyZW5NYXAuZm9yRWFjaChlbCA9PiBlbC5zZXRBdHRyaWJ1dGUoJ3BhcnQnLCAncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW9yZGVyLWludGVyYWN0aW9uJzogUXRpT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgY3Vyc29yOiBtb3ZlO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICB9XG4gICAgYFxuICBdO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24nLCBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbik7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJylcbmV4cG9ydCBjbGFzcyBRdGlQb3NpdGlvbk9iamVjdFN0YWdlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBzdGFydFg6IGFueTtcbiAgc3RhcnRZOiBhbnk7XG4gIGRyYWdFbGVtZW50OiBhbnk7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyID0gdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciA9IHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLmJpbmQodGhpcyk7XG4gIH1cblxuICAvLyBEZWZpbmUgYSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIG1vdXNlbW92ZSBldmVudCBvbiB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgZHJhZ0VsZW1lbnRIYW5kbGVyKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgdGhlIG1vdXNlIGhhcyBtb3ZlZCBzaW5jZSB0aGUgbGFzdCBldmVudFxuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXJ0WDtcbiAgICBjb25zdCBkZWx0YVkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuZHJhZ0VsZW1lbnQuc3R5bGUubGVmdCA9IHRoaXMuZHJhZ0VsZW1lbnQub2Zmc2V0TGVmdCArIGRlbHRhWCArICdweCc7XG4gICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS50b3AgPSB0aGlzLmRyYWdFbGVtZW50Lm9mZnNldFRvcCArIGRlbHRhWSArICdweCc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoYSk6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChhKTtcblxuICAgIC8vIEdldCB0aGUgZHJhZ2dhYmxlIGFuZCBkcm9wIHpvbmUgZWxlbWVudHNcbiAgICB0aGlzLmRyYWdFbGVtZW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uPmltZycpO1xuICAgIC8vIGNvbnN0IGNhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FudmFzJyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlcyBmb3IgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuc3RhcnRYID0gMDtcbiAgICB0aGlzLnN0YXJ0WSA9IDA7XG5cbiAgICAvLyBBZGQgYSBtb3VzZWRvd24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5kcmFnRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIFNhdmUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgICAvLyBBZGQgYSBtb3VzZW1vdmUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRvY3VtZW50XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlbW92ZU1vdmVMaXN0ZW5lcihldmVudCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLCB0cnVlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZSc6IFF0aVBvc2l0aW9uT2JqZWN0U3RhZ2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHN0eWxlTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvc3R5bGUtbWFwLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgICAgcG9pbnQtY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnXG4gIH0pXG4gIHB1YmxpYyBtYXhDaG9pY2VzOiBudW1iZXIgPSBJbmZpbml0eTtcblxuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtaW4tY2hvaWNlcydcbiAgfSlcbiAgcHVibGljIG1pbkNob2ljZXM6IG51bWJlciA9IDA7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfcG9pbnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFJlZmVyZW5jZSB0byB0aGUgaW1hZ2UgZWxlbWVudFxuICBwcml2YXRlIF9pbWdFbGVtZW50OiBIVE1MSW1hZ2VFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gRXh0cmFjdGVkIGNsaWNrIGhhbmRsZXIgbWV0aG9kXG4gIHByaXZhdGUgX29uSW1hZ2VDbGljayA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmICh0aGlzLl9wb2ludHMubGVuZ3RoIDwgdGhpcy5tYXhDaG9pY2VzKSB7XG4gICAgICBjb25zdCB4ID0gZXZlbnQub2Zmc2V0WDtcbiAgICAgIGNvbnN0IHkgPSBldmVudC5vZmZzZXRZO1xuXG4gICAgICB0aGlzLl9wb2ludHMgPSBbLi4udGhpcy5fcG9pbnRzLCBgJHt4fSAke3l9YF07XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9wb2ludHMpO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8cG9pbnQtY29udGFpbmVyPlxuICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICB0aGlzLl9wb2ludHMsXG4gICAgICAgICAgcG9pbnQgPT4gcG9pbnQsXG4gICAgICAgICAgKHBvaW50LCBpbmRleCkgPT4gaHRtbGBcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgcGFydD1cInBvaW50XCJcbiAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKC01MCUsIC01MCUpJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiBgJHtwb2ludC5zcGxpdCgnICcpWzBdfXB4YCxcbiAgICAgICAgICAgICAgICB0b3A6IGAke3BvaW50LnNwbGl0KCcgJylbMV19cHhgXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlIHBvaW50IGF0ICR7cG9pbnR9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2ludHMgPSB0aGlzLl9wb2ludHMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fcG9pbnRzKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvcG9pbnQtY29udGFpbmVyPmA7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9wb2ludHMgPSBbXTtcbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wb2ludHMubGVuZ3RoID49IHRoaXMubWluQ2hvaWNlcyAmJiB0aGlzLl9wb2ludHMubGVuZ3RoIDw9IHRoaXMubWF4Q2hvaWNlcztcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fcG9pbnRzID0gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRzO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuX2ltZ0VsZW1lbnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuXG4gICAgaWYgKHRoaXMuX2ltZ0VsZW1lbnQpIHtcbiAgICAgIC8vIEF0dGFjaCB0aGUgY2xpY2sgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHRoaXMuX2ltZ0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkltYWdlQ2xpY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIDxpbWc+IGVsZW1lbnQgZm91bmQgaW4gPHF0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24+Jyk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGlmICh0aGlzLl9pbWdFbGVtZW50KSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIGNsaWNrIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHRoaXMuX2ltZ0VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkltYWdlQ2xpY2spO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJzogUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgcXVlcnkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgU2xpZGVySW50ZXJhY3Rpb24uVHlwZSAocXRpLXNsaWRlci1pbnRlcmFjdGlvbikgcHJlc2VudHMgdGhlIGNhbmRpZGF0ZSB3aXRoIGEgY29udHJvbCBmb3Igc2VsZWN0aW5nIGEgbnVtZXJpY2FsIHZhbHVlIGJldHdlZW4gYSBsb3dlciBhbmQgdXBwZXIgYm91bmQuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLnM2MXhjcmo0cWN5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA2LjBcbiAqXG4gKiBAZXZlbnQgcXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uIC0gZW1pdHRlZCB3aGVuIHRoZSBpbnRlcmFjdGlvbiB3YW50cyB0byByZWdpc3RlciBpdHNlbGZcbiAqIEBldmVudCBxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UgLSBlbWl0dGVkIHdoZW4gdGhlIGludGVyYWN0aW9uIGNoYW5nZXNcbiAqXG4gKiBAY3NzcHJvcCAtLXNob3ctdmFsdWUgLSBzaG93cyB0aGUgY3VycmVudCB2YWx1ZSB3aGlsZSBzbGlkaW5nXG4gKiBAY3NzcHJvcCAtLXNob3ctdGlja3MgLSBzaG93cyB0aGUgdGlja3MgYWNjb3JkaW5nIHRvIHN0ZXBzXG4gKiBAY3NzcHJvcCAtLXNob3ctYm91bmRzIC0gc2hvd3MgdmFsdWUgZm9yIGxvd2VyIGFuZCB1cHBlciBib3VuZGFyeVxuICpcbiAqIEBjc3NwYXJ0IHNsaWRlciAtLSBzbGlkZXIgaW5sdWRpbmcsIGJvdW5kcyBhbmQgdGlja3MgYW5kIHZhbHVlLCB1c2UgaXQgZm9yIHBhZGRpbmdzIGFuZCBtYXJnaW5zXG4gKiBAY3NzcGFydCBib3VuZHMgLS0gZGl2IGZvciBib3VuZHMsIGNvbnRhaW5pbmcgdHdvIGRpdnMgZm9yIHdpdGggbWluLCBhbmQgbWF4IGJvdW5kcyB2YWx1ZVxuICogQGNzc3BhcnQgdGlja3MgLS0gZGl2IGZvciB0aWNrcywgdXNlIGxpbmVhaXIgZ3JhZGllbnQgYW5kIGV4cG9zZWQgY3NzIHZhcmlhYmxlcyBmb3Igc3R5bGluZ1xuICogQGNzc3BhcnQgcmFpbCAtLSBkaXYgZm9yIHJhaWwsIHN0eWxlIGFjY29yZGluZyB0byBuZWVkc1xuICogQGNzc3BhcnQga25vYiAtLSBkaXYsIHNob3VsZCBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZVxuICogQGNzc3BhcnQgdmFsdWUgLS0gZGl2LCBjb250YWluaW5nIHZhbHVlXG4gKlxuICogQHNsb3QgLSBUaGUgZGVmYXVsdCBzbG90IHdoZXJlIDxxdGktc2ltcGxlLWNob2ljZT4gbXVzdCBiZSBwbGFjZWQuXG4gKiBAc2xvdCBwcm9tcHQgLSBzbG90IHdoZXJlIHRoZSBwcm9tcHQgaXMgcGxhY2VkLlxuICovXG5cbkBjdXN0b21FbGVtZW50KCdxdGktc2xpZGVyLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlTbGlkZXJJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgcHJpdmF0ZSBfdmFsdWUgPSAwO1xuICBjc0xpdmU6IENTU1N0eWxlRGVjbGFyYXRpb247XG5cbiAgQHF1ZXJ5KCcja25vYicpXG4gIHByaXZhdGUgX2tub2I6IEhUTUxFbGVtZW50O1xuXG4gIEBxdWVyeSgnI3JhaWwnKVxuICBwcml2YXRlIF9yYWlsOiBIVE1MRWxlbWVudDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdzdGVwLWxhYmVsJyB9KSBzdGVwTGFiZWwgPSBmYWxzZTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJldmVyc2UgPSBmYWxzZTtcblxuICBwcml2YXRlIF9taW46IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdsb3dlci1ib3VuZCcgfSkgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1pbicsIGAke3RoaXMuX21pbn1gKTtcbiAgfVxuICBnZXQgbWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHByaXZhdGUgX21heDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJyB9KSBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1heCcsIGAke3RoaXMuX21heH1gKTtcbiAgfVxuICBnZXQgbWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHByaXZhdGUgX3N0ZXA6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdzdGVwJyB9KSBzZXQgc3RlcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc3RlcCcsIGAke3RoaXMuX3N0ZXB9YCk7XG4gIH1cbiAgZ2V0IHN0ZXAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RlcDtcbiAgfVxuXG4gIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChvbGQsIGRpc2FibGVkKSA9PiB7fTtcblxuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAob2xkLCByZWFkb25seSkgPT4ge307XG5cbiAgcmVzZXQoKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4ocGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpKTtcbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gcGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICAvLyBzdGF0aWMgc2hhZG93Um9vdE9wdGlvbnM6IFNoYWRvd1Jvb3RJbml0ID0geyAuLi5MaXRFbGVtZW50LnNoYWRvd1Jvb3RPcHRpb25zLCBkZWxlZ2F0ZXNGb2N1czogdHJ1ZSwgbW9kZTogJ29wZW4nIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiB0aGUgY29tcHV0ZWQgc3R5bGUgaXMgYSBsaXZlIHByb3BlcnR5LCB3ZSB1c2UgdGhpcyB0byBnZXQgY3NzIHZhcmlhYmxlc1xuICAgIHNlZSByZW5kZXIgdGVtcGxhdGUgKi9cbiAgICB0aGlzLmNzTGl2ZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcyk7XG4gIH1cblxuICBzZXQgcmVzcG9uc2UobXlSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShteVJlc3BvbnNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcignUXRpU2xpZGVySW50ZXJhY3Rpb246IHJlc3BvbnNlIGlzIGFuIGFycmF5LCBidXQgc2hvdWxkIGJlIGEgc2luZ2xlIHZhbHVlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQobXlSZXNwb25zZSk7XG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1F0aVNsaWRlckludGVyYWN0aW9uOiByZXNwb25zZSBpcyBub3QgYSBudW1iZXInKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbY3NzYGBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICAvLyBjb252ZXJ0IHRoZSB2YWx1ZSwgd2hpY2ggaXMgdGhlIHJlYWwgc2xpZGVyIHZhbHVlIHRvIGEgcGVyY2VudGFnZSBmb3IgdGhlIGRvbS5cbiAgICBpZiAodGhpcy5fdmFsdWUgPCB0aGlzLm1pbikge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLm1pbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ZhbHVlID4gdGhpcy5tYXgpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5tYXg7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlUGVyY2VudGFnZSA9ICgodGhpcy5fdmFsdWUgLSB0aGlzLm1pbikgLyAodGhpcy5tYXggLSB0aGlzLm1pbikpICogMTAwO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tdmFsdWUtcGVyY2VudGFnZScsIGAke3ZhbHVlUGVyY2VudGFnZX0lYCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCB0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxkaXYgaWQ9XCJzbGlkZXJcIiBwYXJ0PVwic2xpZGVyXCI+XG4gICAgICAgICR7dGhpcy5jc0xpdmUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaG93LWJvdW5kcycpID09ICd0cnVlJ1xuICAgICAgICAgID8gaHRtbGA8ZGl2IGlkPVwiYm91bmRzXCIgcGFydD1cImJvdW5kc1wiPlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWlufTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWF4fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgJHt0aGlzLmNzTGl2ZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNob3ctdGlja3MnKSA9PSAndHJ1ZScgPyBodG1sYDxkaXYgaWQ9XCJ0aWNrc1wiIHBhcnQ9XCJ0aWNrc1wiPjwvZGl2PmAgOiBub3RoaW5nfVxuICAgICAgICA8ZGl2IGlkPVwicmFpbFwiIHBhcnQ9XCJyYWlsXCIgQG1vdXNlZG93bj0ke3RoaXMuX29uTW91c2VEb3dufSBAdG91Y2hzdGFydD0ke3RoaXMuX29uVG91Y2hNb3ZlfT5cbiAgICAgICAgICA8ZGl2IGlkPVwia25vYlwiIHBhcnQ9XCJrbm9iXCI+XG4gICAgICAgICAgICAke3RoaXMuY3NMaXZlLmdldFByb3BlcnR5VmFsdWUoJy0tc2hvdy12YWx1ZScpID09ICd0cnVlJ1xuICAgICAgICAgICAgICA/IGh0bWxgPGRpdiBpZD1cInZhbHVlXCIgcGFydD1cInZhbHVlXCI+JHt0aGlzLnZhbHVlfTwvZGl2PmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc3RlcCA9IDE7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncm9sZScsICdzbGlkZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gZXZlbnQgPT4ge1xuICAgICAgY29uc3QgeyB4IH0gPSB0aGlzLmdldFBvc2l0aW9uRnJvbUV2ZW50KGV2ZW50KTtcbiAgICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICBjb25zdCB7IHggfSA9IHRoaXMuZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZXZlbnQpO1xuICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVNb3VzZVVwKTtcblxuICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICBjb25zdCBkaWZmWCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG5cbiAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqIGNhbGN1bGF0ZVZhbHVlIGdldHMgeCBwb3NpdGlvbiBhbmQgY29tcGFyZXMgdGhpcyB3aXRoIHRoZSB0b3RhbCB3aWR0aCBpbiBwaXhlbHMgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVWYWx1ZShkaWZmWDogbnVtYmVyKSB7XG4gICAgY29uc3QgdmFsdWVOb3cgPSB0aGlzLm1pbiArICgodGhpcy5tYXggLSB0aGlzLm1pbikgKiBkaWZmWCkgLyB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIGNvbnN0IHJvdW5kZWRTdGVwVmFsdWUgPSB0aGlzLm1pbiArIE1hdGgucm91bmQoKHZhbHVlTm93IC0gdGhpcy5taW4pIC8gdGhpcy5fc3RlcCkgKiB0aGlzLl9zdGVwO1xuICAgIHRoaXMuX3ZhbHVlID0gcm91bmRlZFN0ZXBWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZTogYW55KToge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0ge1xuICAgIGxldCBfdG91Y2hNb3ZlO1xuICAgIGlmIChlLnR5cGUgPT0gJ3RvdWNoc3RhcnQnIHx8IGUudHlwZSA9PSAndG91Y2htb3ZlJyB8fCBlLnR5cGUgPT0gJ3RvdWNoZW5kJyB8fCBlLnR5cGUgPT0gJ3RvdWNoY2FuY2VsJykge1xuICAgICAgY29uc3QgZXZ0ID0gdHlwZW9mIGUub3JpZ2luYWxFdmVudCA9PT0gJ3VuZGVmaW5lZCcgPyBlIDogZS5vcmlnaW5hbEV2ZW50O1xuICAgICAgY29uc3QgdG91Y2ggPSBldnQudG91Y2hlc1swXSB8fCBldnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiB0b3VjaC5wYWdlWCxcbiAgICAgICAgeTogdG91Y2gucGFnZVlcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGUudHlwZSA9PSAnbW91c2Vkb3duJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZXVwJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZW1vdmUnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlb3ZlcicgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VvdXQnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlZW50ZXInIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlbGVhdmUnXG4gICAgKSB7XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiBlLmNsaWVudFgsXG4gICAgICAgIHk6IGUuY2xpZW50WVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIF90b3VjaE1vdmU7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNsaWRlci1pbnRlcmFjdGlvbic6IFF0aVNsaWRlckludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2FsY3VsYXRlIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbi8qKlxuICogaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5maTI5cThkdWJqZ3dcbiAqIDxxdGktY3VzdG9tLW9wZXJhdG9yIGNsYXNzPVwianMub3JnXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJzdHJpbmdcIj48IVtDREFUQVtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjb250ZXh0LnZhcmlhYmxlcyk7XG4gICAgICAgICAgcmV0dXJuICdCJ1xuICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbicpLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICBdXT48L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktY3VzdG9tLW9wZXJhdG9yPlxuICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWN1c3RvbS1vcGVyYXRvcicpXG5leHBvcnQgY2xhc3MgUXRpQ3VzdG9tT3BlcmF0b3IgZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgQ2FsY3VsYXRlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBwcml2YXRlIG9wZXJhdG9yRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9jb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IEBzbG90Y2hhbmdlPSR7dGhpcy5oYW5kbGVTbG90Q2hhbmdlfT48L3Nsb3Q+YDtcbiAgfVxuXG4gIGhhbmRsZVNsb3RDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gZXhwZWN0aW5nIDxbIUNEQVRBWyAuLi4gXV0+IGlzIGNvbnZlcnRlZCBpbnRvIDwhLS0gLi4uIC0tPiB3aXRoIHF0aS10cmFuc2Zvcm06IGNEYXRhVG9Db21tZW50XG4gICAgY29uc3QgY29tbWVudE5vZGUgPSBBcnJheS5mcm9tKHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQ/LmNoaWxkTm9kZXMgPz8gW10pLmZpbmQoXG4gICAgICBub2RlID0+IG5vZGUubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vcGVyYXRvckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKCdjb250ZXh0JywgJ2ZuJywgJ2l0ZW0nLCBjb21tZW50Tm9kZS50ZXh0Q29udGVudCA/PyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignY3VzdG9tLW9wZXJhdG9yIGNvbnRhaW5zIGludmFsaWQgamF2YXNjcmlwdCBjb2RlJywgZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCBmbiA9IHtcbiAgICAgIHZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGNvcnJlY3Q6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgICAgICAgKHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpIGFzIFJlc3BvbnNlVmFyaWFibGUpXG4gICAgICAgICAgPy5jb3JyZWN0UmVzcG9uc2UgPz8gJydcbiAgICB9O1xuICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICBnZXRWYXJpYWJsZTogKHZhcmlhYmxlSWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLl9jb250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdmFyaWFibGVJZGVudGlmaWVyKSxcbiAgICAgIHVwZGF0ZU91dGNvbWVWYXJpYWJsZTogKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1cGRhdGVSZXNwb25zZVZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmc7IHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvckZ1bmN0aW9uKHRoaXMuX2NvbnRleHQsIGZuLCBpdGVtKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY3VzdG9tLW9wZXJhdG9yJzogUXRpQ3VzdG9tT3BlcmF0b3I7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnKVxuZXhwb3J0IGNsYXNzIFF0aUFzc29jaWFibGVIb3RzcG90IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC1pbWdcIj48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc29jaWFibGUtaG90c3BvdCc6IFF0aUFzc29jaWFibGVIb3RzcG90O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcCcpXG5leHBvcnQgY2xhc3MgUXRpR2FwIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC10ZXh0XCI+PC9zbG90PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcCc6IFF0aUdhcDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtaW1nJylcbmV4cG9ydCBjbGFzcyBRdGlHYXBJbWcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLWltZycpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtaW1nJzogUXRpR2FwSW1nO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwLXRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUdhcFRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1nYXAtdGV4dCcpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLXRleHQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwLXRleHQnOiBRdGlHYXBUZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8vIHR5cGUgc2hhcGUgPSB7IHNoYXBlOiAncmVjdCcgfCAnY2lyY2xlJyB8ICdwb2x5JzsgY29vcmRzOiBudW1iZXJbXSB9O1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtY2hvaWNlJylcbmV4cG9ydCBjbGFzcyBRdGlIb3RzcG90Q2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYXJpYS1vcmRlcnZhbHVlJywgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIG9yZGVyOiBudW1iZXI7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWNob2ljZSc6IFF0aUhvdHNwb3RDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnRNaXhpbiB9IGZyb20gJy4vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1ob3R0ZXh0Jykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgcGFydD1cImNoXCI+PGRpdiBwYXJ0PVwiY2hhXCI+PC9kaXY+PC9kaXY+XG4gICAgICA8c2xvdD48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQnOiBRdGlIb3R0ZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWlubGluZS1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUlubGluZUNob2ljZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLXJlZ2lzdGVyJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90Pjwvc2xvdD4gYDtcbiAgfVxuXG4gIHByaXZhdGUgX29uU2VsZWN0SW5saW5lQ2hvaWNlKCkge1xuICAgIC8vIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWlubGluZS1jaG9pY2Utc2VsZWN0Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pbmxpbmUtY2hvaWNlJzogUXRpSW5saW5lQ2hvaWNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50LCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qKlxuICogcXRpLW9yZGVyLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktc2ltcGxlLWNob2ljZScpXG5leHBvcnQgY2xhc3MgUXRpU2ltcGxlQ2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktc2ltcGxlLWNob2ljZScpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuICAgIFtwYXJ0PSdjaCddIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICB9XG4gIGA7XG5cbiAgLy8gcHJvcGVydHkgbGFiZWxcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBtYXJrZXI6IHN0cmluZztcblxuXG4gIGdldCBjaGVja2VkKCkge1xuICAgIHJldHVybiB0aGlzWydpbnRlcm5hbHMnXS5zdGF0ZXMuaGFzKCctLWNoZWNrZWQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IHBhcnQ9XCJjaFwiPlxuICAgICAgICA8ZGl2IHBhcnQ9XCJjaGFcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgJHt0aGlzLm1hcmtlciA/IGh0bWxgPGRpdiBpZD1cImxhYmVsXCI+JHt0aGlzLm1hcmtlcn08L2Rpdj5gIDogbm90aGluZ31cbiAgICAgIDxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PiBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJzogUXRpU2ltcGxlQ2hvaWNlO1xuICB9XG59XG4iLCAiLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXZlbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHknO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktcHJvbXB0L3F0aS1wcm9tcHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldCc7XG4vKiBzdGFydCByZXNwb25zZSBhbmQgb3V0Y29tZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic7XG4vKiBlbmQgcmVzcG9uc2UgYW5kIG91dGNvbWUgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrJztcbi8qIHN0YXJ0IGZlZWRiYWNrICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrJztcbi8qIGVuZCBmZWVkYmFjayAqL1xuLyogc3RhcnQgdGV4dGVudHJ5aW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJztcbi8qIGVuZCB0ZXh0ZW50cnlpbnRlcmFjdGlvbiAqL1xuLyogc3RhcnQgaG90dGV4dCAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGhvdHRleHQgKi9cbi8qIHN0YXJ0IGlubGluZWNob2ljZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGlubGluZWNob2ljZSAqL1xuLyogc3RhcnQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuLyogc3RhcnQgY3VzdG9tIGludGVyYWN0aW9ucyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJztcbi8qIGVuZCBjdXN0b20gaW50ZXJhY3Rpb25zICovXG4vKiBzdGFydCBvbmx5IHByZXZpZXcgaXRlbXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbic7XG4vKiBlbmQgb25seSBwcmV2aWV3IGl0ZW1zICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UnO1xuXG5jb25zb2xlLmxvZyhcbiAgJyVjQ1x1MDBCRlRPJWNMYWIlYzogcXRpLWNvbXBvbmVudHMgbG9hZGVkJyxcbiAgJ2ZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOmdyZWVuJyxcbiAgJ2ZvbnQtZmFtaWx5OiBcIlBUIFNhbnNcIiwgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6Z3JlZW47IGZvbnQtc2l6ZTogc21hbGxlcjt2ZXJ0aWNhbC1hbGlnbjogc3ViJyxcbiAgJ2ZvbnQtd2VpZ2h0OnVuc2V0J1xuKTtcblxuLy8gY3NzIGZvciBmb250IHB0LXNhbnMgYW5kIHN1YnNjcmlwdCBhbmQgZ3JlZW5cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLFNBQVMsZUFBZTtBQUN4QixTQUFTLFlBQVksWUFBWTtBQUNqQyxTQUFTLGVBQWUsZ0JBQWdCOzs7QUMyQmpDLFNBQVMsTUFBTSxjQUFpQyxTQUF3QjtBQUM3RSxRQUFNLGtCQUEwQztBQUFBLElBQzlDLHNCQUFzQjtBQUFBLEtBQ25CO0FBRUwsU0FBTyxDQUErQixPQUFrQixvQkFBMEQ7QUFFaEgsVUFBTSxFQUFFLE9BQU8sSUFBSTtBQUNuQixVQUFNLG9CQUFvQixNQUFNLFFBQVEsWUFBWSxJQUFJLGVBQWUsQ0FBQyxZQUFZO0FBR3BGLFVBQU0sU0FBUyxTQUEyQixjQUFnRTtBQUN4Ryx3QkFBa0IsUUFBUSxDQUFBQSxlQUFZO0FBQ3BDLGNBQU0sTUFBTUE7QUFDWixZQUFJLGFB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V0FBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsR0FaZixnQkFhWDtBQWJXLGtCQUFOO0FBQUEsRUFETkMsZ0JBQWMsbUJBQW1CO0FBQUEsR0FDckI7OztBQ0piLFNBQVMsT0FBQUMsT0FBSyxRQUFBQyxRQUFNLGNBQUFDLGNBQVksV0FBQUMsZ0JBQWU7QUFDL0MsU0FBUyxpQkFBQUMsaUJBQWUsWUFBQUMsa0JBQWdCO0FBUWpDLElBQU0sa0JBQU4sY0FBOEIsbUJBQW1CQyxjQUFZLG1CQUFtQixFQUFFO0FBQUEsRUF5QnZGLElBQUksVUFBVTtBQUNaLFdBQU8sS0FBSyxXQUFXLEVBQUUsT0FBTyxJQUFJLFdBQVc7QUFBQSxFQUNqRDtBQUFBLEVBRVMsU0FBUztBQUNoQixXQUFPQztBQUFBO0FBQUE7QUFBQSxRQUdILEtBQUssU0FBU0EseUJBQXVCLEtBQUssTUFBTSxXQUFXQyxRQUFPO0FBQUE7QUFBQSxFQUV4RTtBQUNGO0FBcENhLGdCQUNKLFNBQVNDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXFCVDtBQUFBLEVBRE5DLFdBQVMsRUFBRSxNQUFNLFFBQVEsV0FBVyxNQUFNLENBQUM7QUFBQSxHQXJCakMsZ0JBc0JKO0FBdEJJLGtCQUFOO0FBQUEsRUFETkMsZ0JBQWMsbUJBQW1CO0FBQUEsR0FDckI7OztBQytEYixRQUFRO0FBQUEsRUFDTjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGOyIsCiAgIm5hbWVzIjogWyJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAieG1sIiwgIkxpdEVsZW1lbnQiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgInByb3BlcnR5IiwgImh0bWwiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY29uc3VtZSIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgImh0bWwiLCAiY3NzIiwgInByb3BlcnR5IiwgImNvbnN1bWUiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJjb25zdW1lIiwgIkxpdEVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiTGl0RWxlbWVudCIsICJwcm9wZXJ0eSIsICJjb25zdW1lIiwgInN0YXRlIiwgImh0bWwiLCAiY3NzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJMaXRFbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJjc3MiLCAiaHRtbCIsICJzdGF0ZSIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJpZkRlZmluZWQiLCAiY3NzIiwgImh0bWwiLCAiaWZEZWZpbmVkIiwgInByb3BlcnR5IiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgImNzcyIsICJodG1sIiwgInN0YXRlIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgImNzcyIsICJodG1sIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgImh0bWwiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiaHRtbCIsICJodG1sIiwgImNvbnN1bWUiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJzdGF0ZSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgInN0YXRlIiwgImNvbnN1bWUiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAiTGl0RWxlbWVudCIsICJMaXRFbGVtZW50IiwgInByb3BlcnR5IiwgImh0bWwiLCAiaHRtbCIsICJjb25zdW1lIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAicHJvcGVydHkiLCAiY29uc3VtZSIsICJzdGF0ZSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAicHJvcGVydHkiLCAicmVxdWlyZSIsICJodG1sIiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInN0YXRlIiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgImRyYWdnYWJsZSIsICJwYXJlbnQiLCAiaW5kZXgiLCAidGFyZ2V0SW5kZXgiLCAicHJvcGVydHkiLCAiY3NzIiwgImh0bWwiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiaWZyYW1lIiwgImh0bWwiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInF1ZXJ5IiwgInN0YXRlIiwgImlmRGVmaW5lZCIsICJodG1sIiwgImlmRGVmaW5lZCIsICJjc3MiLCAic3RhdGUiLCAicXVlcnkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImhvdHNwb3QiLCAiY3NzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJ1bnNhZmVIVE1MIiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAidW5zYWZlSFRNTCIsICJzdGF0ZSIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgInVuc2FmZUhUTUwiLCAiaHRtbCIsICJ1bnNhZmVIVE1MIiwgImNzcyIsICJzdGF0ZSIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgInJlcGVhdCIsICJodG1sIiwgInJlcGVhdCIsICJjc3MiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInF1ZXJ5IiwgImh0bWwiLCAiZXZlbnQiLCAieCIsICJkaWZmWCIsICJjc3MiLCAicXVlcnkiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjb25zdW1lIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInN0YXRlIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjb25zdW1lIiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJub3RoaW5nIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgIm5vdGhpbmciLCAiY3NzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiXQp9Cg==
|
|
6392
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL3dhdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYvcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLXRyYW5zZm9ybWVycy9xdGktdHJhbnNmb3JtZXJzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLXRyYW5zZm9ybWVycy9xdGktdHJhbnNmb3JtLWl0ZW0udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHkuc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXByb21wdC9xdGktcHJvbXB0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXN0eWxlc2hlZXQvcXRpLXN0eWxlc2hlZXQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbi9xdGktcmVzcG9uc2UtZGVjbGFyYXRpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvL3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcnVicmljLWJsb2NrL3F0aS1jb250ZW50LWJvZHkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcnVicmljLWJsb2NrL3F0aS1ydWJyaWMtYmxvY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLWJsb2NrL3F0aS1mZWVkYmFjay1ibG9jay50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC91dGlscy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2staW5saW5lL3F0aS1mZWVkYmFjay1pbmxpbmUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrL3F0aS1tb2RhbC1mZWVkYmFjay50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbi9xdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi9xdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLm1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvdm9jYWJ1bGFyeS92b2NhYnVsYXJ5LW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi5zdHlsZXMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nL3F0aS1vdXRjb21lLXByb2Nlc3NpbmcudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3RlbXBsYXRlLXN0cmluZ3MudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktbG9va3VwLW91dGNvbWUtdmFsdWUvcXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJ1bGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktcmVzcG9uc2UtY29uZGl0aW9uL3F0aS1yZXNwb25zZS1jb25kaXRpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcnVsZS9xdGktc2V0LW91dGNvbWUtdmFsdWUvcXRpLXNldC1vdXRjb21lLXZhbHVlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWVsc2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtZWxzZS9xdGktcmVzcG9uc2UtaWYvcXRpLXJlc3BvbnNlLWVsc2UtaWYvcXRpLXJlc3BvbnNlLWVsc2UtaWYudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktcmVzcG9uc2UtZWxzZS9xdGktcmVzcG9uc2UtaWYvcXRpLXJlc3BvbnNlLWlmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWV4cHJlc3Npb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktYW5kL3F0aS1hbmQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktYW5kL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWJhc2V2YWx1ZS9xdGktYmFzZXZhbHVlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWNvbnRhaW5zL3F0aS1jb250YWlucy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1jb3JyZWN0L3F0aS1jb3JyZWN0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWVxdWFsLXJvdW5kZWQvcXRpLWVxdWFsLXJvdW5kZWQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZXF1YWwvcXRpLWVxdWFsLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWd0L3F0aS1ndC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1ndGUvcXRpLWd0ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1pcy1udWxsL3F0aS1pcy1udWxsLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWx0L3F0aS1sdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1sdGUvcXRpLWx0ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXAtcmVzcG9uc2UvcXRpLW1hcC1yZXNwb25zZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXBwaW5nL3F0aS1tYXBwaW5nLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW1hdGNoL3F0aS1tYXRjaC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tZW1iZXIvcXRpLW1lbWJlci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tdWx0aXBsZS9xdGktbXVsdGlwbGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbm90L3F0aS1ub3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktb3IvcXRpLW9yLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW9yZGVyZWQvcXRpLW9yZGVyZWQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktcHJpbnRlZC12YXJpYWJsZS9xdGktcHJpbnRlZC12YXJpYWJsZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1wcm9kdWN0L3F0aS1wcm9kdWN0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXN0cmluZy1tYXRjaC9xdGktc3RyaW5nLW1hdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXN1bS9xdGktc3VtLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXZhcmlhYmxlL3F0aS12YXJpYWJsZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uL3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtYXBpLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcm9wcGFibGVzLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9mbGlwcGFibGVzLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL2xpdmUtcXVlcnkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uLnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9ob3RzcG90cy9ob3RzcG90LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24uc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbi9xdGktbWVkaWEtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uL3F0aS1vcmRlci1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2xpZGVyLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktY3VzdG9tLW9wZXJhdG9yL3F0aS1jdXN0b20tb3BlcmF0b3IudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWFzc29jaWFibGUtaG90c3BvdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAtaW1nLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAtdGV4dC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1jaG9pY2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgcHJvdmlkZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcbmltcG9ydCB0eXBlIHsgSW50ZXJhY3Rpb25DaGFuZ2VkRGV0YWlscywgT3V0Y29tZUNoYW5nZWREZXRhaWxzIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXZlbnQtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBSZXNwb25zZUludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHR5cGUgeyBWYXJpYWJsZURlY2xhcmF0aW9uLCBWYXJpYWJsZVZhbHVlIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IE91dGNvbWVWYXJpYWJsZSwgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgdHlwZSB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjayc7XG5pbXBvcnQgdHlwZSB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB0eXBlIHsgUXRpUmVzcG9uc2VQcm9jZXNzaW5nIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dFZhcmlhYmxlcyB9IGZyb20gJy4vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCBRdGlSZWdpc3RlclZhcmlhYmxlIGZyb20gJy4uL2ludGVybmFsL2V2ZW50cy9xdGktcmVnaXN0ZXItdmFyaWFibGUnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktYXNzZXNzbWVudC1pdGVtIGVsZW1lbnQgY29udGFpbnMgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmRsdG5uajg3bDB5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA0LjBcbiAqXG4gKiBAZGVwZW5kZW5jeSBxdGktZmVlZGJhY2tcbiAqIEBkZXBlbmRlbmN5IHF0aS1yZXNwb25zZXByb2Nlc3NpbmdcbiAqXG4gKiBAc2xvdCAtIFRoZSBkZWZhdWx0IHNsb3Qgd2hlcmUgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMgZ28uXG4gKlxuICogQGV2ZW50IHF0aS1pbnRlcmFjdGlvbi1jaGFuZ2VkIC0gRW1pdHRlZCB3aGVuIGFuIGludGVyYWN0aW9uIGlzIGNoYW5nZWQuXG4gKiBAZXZlbnQgcXRpLW91dGNvbWUtY2hhbmdlZCAtIEVtaXR0ZWQgd2hlbiBhbiBvdXRjb21lIGhhcyBjaGFuZ2VkLlxuICogQGV2ZW50IHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nIC0gRW1pdHRlZCB3aGVuIHJlc3BvbnNlLXByb2Nlc3NpbmcgaXMgY2FsbGVkLlxuICpcbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKVxuZXhwb3J0IGNsYXNzIFF0aUFzc2Vzc21lbnRJdGVtIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aXRsZTogc3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBhZGFwdGl2ZTogJ3RydWUnIHwgJ2ZhbHNlJyA9ICdmYWxzZSc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aW1lRGVwZW5kZW50OiAndHJ1ZScgfCAnZmFsc2UnIHwgbnVsbCA9IG51bGw7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSBkaXNhYmxlZDogYm9vbGVhbjtcbiAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZURpc2FibGVkQ2hhbmdlID0gKF86IGJvb2xlYW4sIGRpc2FibGVkOiBib29sZWFuKSA9PiB7XG4gICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5kaXNhYmxlZCA9IGRpc2FibGVkKSk7XG4gIH07XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSByZWFkb25seTogYm9vbGVhbjtcbiAgQHdhdGNoKCdyZWFkb25seScsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZVJlYWRvbmx5Q2hhbmdlID0gKF86IGJvb2xlYW4sIHJlYWRvbmx5OiBib29sZWFuKSA9PlxuICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZm9yRWFjaChjaCA9PiAoY2gucmVhZG9ubHkgPSByZWFkb25seSkpO1xuXG4gIEBwcm92aWRlKHsgY29udGV4dDogaXRlbUNvbnRleHQgfSlcbiAgcHJpdmF0ZSBfY29udGV4dDogSXRlbUNvbnRleHQgPSB7XG4gICAgaWRlbnRpZmllcjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSxcbiAgICB2YXJpYWJsZXM6IGl0ZW1Db250ZXh0VmFyaWFibGVzXG4gIH07XG5cbiAgcHVibGljIGdldCB2YXJpYWJsZXMoKTogVmFyaWFibGVWYWx1ZTxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+W10ge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5tYXAodiA9PiAoe1xuICAgICAgaWRlbnRpZmllcjogdi5pZGVudGlmaWVyLFxuICAgICAgdmFsdWU6IHYudmFsdWUsXG4gICAgICB0eXBlOiB2LnR5cGUsXG4gICAgICAvLyBhZGQgZXh0ZXJuYWxzY29yZWQsIGEgZml4ZWQgcHJvcCB0byB0aGUgdGVzdCwgc28gdGhlIHRlc3Rjb250ZXh0IGNhbiByZWFkIGFuZCBkZWNpZGUgaG93IHRvIHNjb3JlIHRoaXMgaXRlbVxuICAgICAgLi4uKHYudHlwZSA9PT0gJ291dGNvbWUnICYmIHYuaWRlbnRpZmllciA9PT0gJ1NDT1JFJ1xuICAgICAgICA/IHsgZXh0ZXJuYWxTY29yZWQ6ICh2IGFzIE91dGNvbWVWYXJpYWJsZSkuZXh0ZXJuYWxTY29yZWQgfVxuICAgICAgICA6IHt9KVxuICAgIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFyaWFibGVzKHZhbHVlOiBWYXJpYWJsZVZhbHVlPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD5bXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUuc29tZSh2ID0+ICEoJ2lkZW50aWZpZXInIGluIHYpKSkge1xuICAgICAgY29uc29sZS53YXJuKCd2YXJpYWJsZXMgcHJvcGVydHkgc2hvdWxkIGJlIGFuIGFycmF5IG9mIFZhcmlhYmxlRGVjbGFyYXRpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fY29udGV4dCA9IHtcbiAgICAgIC4uLnRoaXMuX2NvbnRleHQsXG4gICAgICB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2YXJpYWJsZSA9PiB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nVmFsdWUgPSB2YWx1ZS5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB2YXJpYWJsZS5pZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nVmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi52YXJpYWJsZSwgLi4ubWF0Y2hpbmdWYWx1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YXJpYWJsZTtcbiAgICAgIH0pXG4gICAgfTtcblxuICAgIHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdyZXNwb25zZScpIHtcbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb25FbGVtZW50ID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICAgIChlbDogSW50ZXJhY3Rpb24pID0+IGVsLnJlc3BvbnNlSWRlbnRpZmllciA9PT0gdmFyaWFibGUuaWRlbnRpZmllclxuICAgICAgICApO1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb25FbGVtZW50KSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb25FbGVtZW50LnZhbHVlID0gdmFyaWFibGUudmFsdWUgYXMgc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdvdXRjb21lJykge1xuICAgICAgICB0aGlzLl9mZWVkYmFja0VsZW1lbnRzLmZvckVhY2goZmUgPT4gZmUuY2hlY2tTaG93RmVlZGJhY2sodmFyaWFibGUuaWRlbnRpZmllcikpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbENvbnRleHQ6IFJlYWRvbmx5PEl0ZW1Db250ZXh0PiA9IHsgLi4udGhpcy5fY29udGV4dCwgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcyB9O1xuICBwcml2YXRlIF9mZWVkYmFja0VsZW1lbnRzOiBRdGlGZWVkYmFja1tdID0gW107XG4gIHByaXZhdGUgX2ludGVyYWN0aW9uRWxlbWVudHM6IEludGVyYWN0aW9uW10gPSBbXTtcblxuICBhc3luYyBjb25uZWN0ZWRDYWxsYmFjaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7XG4gICAgdGhpcy5fZW1pdDx7IGRldGFpbDogUXRpQXNzZXNzbWVudEl0ZW0gfT4oJ3F0aS1hc3Nlc3NtZW50LWl0ZW0tY29ubmVjdGVkJywgdGhpcyk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgdXNlIHZhcmlhYmxlcyBwcm9wZXJ0eSBpbnN0ZWFkICovXG4gIHNldCByZXNwb25zZXMobXlSZXNwb25zZXM6IFJlc3BvbnNlSW50ZXJhY3Rpb25bXSkge1xuICAgIGlmIChteVJlc3BvbnNlcykge1xuICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBteVJlc3BvbnNlcykge1xuICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlID0gdGhpcy5nZXRSZXNwb25zZShyZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAocmVzcG9uc2VWYXJpYWJsZSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlUmVzcG9uc2VWYXJpYWJsZShyZXNwb25zZS5yZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGludGVyYWN0aW9uOiBJbnRlcmFjdGlvbiB8IHVuZGVmaW5lZCA9IHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuZmluZChcbiAgICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgICApO1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi52YWx1ZSA9IHJlc3BvbnNlLnJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIChlOiBRdGlSZWdpc3RlclZhcmlhYmxlKSA9PiB7XG4gICAgICB0aGlzLl9jb250ZXh0ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IFsuLi50aGlzLl9jb250ZXh0LnZhcmlhYmxlcywgZS5kZXRhaWwudmFyaWFibGVdIH07XG4gICAgICB0aGlzLl9pbml0aWFsQ29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWZlZWRiYWNrJywgKGU6IEN1c3RvbUV2ZW50PFF0aUZlZWRiYWNrPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGZlZWRiYWNrRWxlbWVudCA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy5fZmVlZGJhY2tFbGVtZW50cy5wdXNoKGZlZWRiYWNrRWxlbWVudCk7XG4gICAgICBmZWVkYmFja0VsZW1lbnQuY2hlY2tTaG93RmVlZGJhY2soZmVlZGJhY2tFbGVtZW50Lm91dGNvbWVJZGVudGlmaWVyKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIChlOiBDdXN0b21FdmVudDxudWxsPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMucHVzaChlLnRhcmdldCBhcyBJbnRlcmFjdGlvbik7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlbmQtYXR0ZW1wdCcsIChlOiBDdXN0b21FdmVudDx7IHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nOyBjb3VudEF0dGVtcHQ6IGJvb2xlYW4gfT4pID0+IHtcbiAgICAgIGNvbnN0IHsgcmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQgfSA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgJ3RydWUnKTtcbiAgICAgIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKGNvdW50QXR0ZW1wdCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAvLyB3b3JkdCBhYW5nZXJvZXBlbiB2YW51aXQgZGUgcHJvY2Vzc2luZ3RlbXBsYXRlXG4gICAgICAncXRpLXNldC1vdXRjb21lLXZhbHVlJyxcbiAgICAgIChlOiBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PikgPT4ge1xuICAgICAgICBjb25zdCB7IG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSB9ID0gZS5kZXRhaWw7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywgdGhpcy5oYW5kbGVVcGRhdGVSZXNwb25zZVZhcmlhYmxlKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q29ycmVjdFJlc3BvbnNlKHNob3c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlcyA9IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbHRlcihcbiAgICAgICh2YXJpOiBSZXNwb25zZVZhcmlhYmxlIHwgT3V0Y29tZVZhcmlhYmxlKSA9PiAnY29ycmVjdFJlc3BvbnNlJyBpbiB2YXJpICYmIHZhcmkuY29ycmVjdFJlc3BvbnNlXG4gICAgKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgY29uc3QgcmVzcG9uc2VzID0gcmVzcG9uc2VWYXJpYWJsZXMubWFwKGNyID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogY3IuaWRlbnRpZmllcixcbiAgICAgICAgcmVzcG9uc2U6IGNyLmNvcnJlY3RSZXNwb25zZVxuICAgICAgfTtcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgKTtcbiAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpbnRlcmFjdGlvbi5jb3JyZWN0UmVzcG9uc2UgPSBzaG93ID8gcmVzcG9uc2UucmVzcG9uc2UgOiAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJvY2Vzc1Jlc3BvbnNlKGNvdW50TnVtQXR0ZW1wdHM6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVzcG9uc2VQcm9jZXNzb3IgPSB0aGlzLnF1ZXJ5U2VsZWN0b3I8UXRpUmVzcG9uc2VQcm9jZXNzaW5nPigncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnKTtcbiAgICBpZiAoIXJlc3BvbnNlUHJvY2Vzc29yKSB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oJ0NsaWVudCBzaWRlIHJlc3BvbnNlIHByb2Nlc3NpbmcgdGVtcGxhdGUgbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2VQcm9jZXNzb3IucHJvY2Vzcykge1xuICAgICAgLy8gY29uc29sZS5pbmZvKCdDbGllbnQgc2lkZSByZXNwb25zZSB3ZWJjb21wb25lbnRzIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXNwb25zZVByb2Nlc3Nvci5wcm9jZXNzKCk7XG5cbiAgICBpZiAodGhpcy5hZGFwdGl2ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgLy8gaWYgYWRhcHRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50TnVtQXR0ZW1wdHMpIHtcbiAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKFxuICAgICAgICAnbnVtQXR0ZW1wdHMnLFxuICAgICAgICAoK3RoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09ICdudW1BdHRlbXB0cycpPy52YWx1ZSArIDEpLnRvU3RyaW5nKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fZW1pdCgncXRpLXJlc3BvbnNlLXByb2Nlc3NlZCcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHJlc2V0UmVzcG9uc2VzKCkge1xuICAgIHRoaXMuX2NvbnRleHQgPSB0aGlzLl9pbml0aWFsQ29udGV4dDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXNwb25zZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxSZXNwb25zZVZhcmlhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikgYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRPdXRjb21lKGlkZW50aWZpZXI6IHN0cmluZyk6IFJlYWRvbmx5PE91dGNvbWVWYXJpYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpIGFzIE91dGNvbWVWYXJpYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD4+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgfVxuXG4gIC8vIHNhdmluZyBwcml2YXRlcyBoZXJlOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIGhhbmRsZVVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoZXZlbnQ6IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KSB7XG4gICAgY29uc3QgeyByZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlIH0gPSBldmVudC5kZXRhaWw7XG4gICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVJlc3BvbnNlVmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4gKHYuaWRlbnRpZmllciAhPT0gaWRlbnRpZmllciA/IHYgOiB7IC4uLnYsIHZhbHVlOiB2YWx1ZSB9KSlcbiAgICB9O1xuXG4gICAgdGhpcy5fZW1pdDxJbnRlcmFjdGlvbkNoYW5nZWREZXRhaWxzPigncXRpLWludGVyYWN0aW9uLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZUlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmFkYXB0aXZlID09PSAnZmFsc2UnKSB7XG4gICAgICAvLyBpZiBhZGFwYXRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZU91dGNvbWVWYXJpYWJsZShpZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9IHRoaXMuZ2V0T3V0Y29tZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghb3V0Y29tZVZhcmlhYmxlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbiBub3Qgc2V0IHF0aS1vdXRjb21lLWlkZW50aWZpZXI6ICR7aWRlbnRpZmllcn0sIGl0IGlzIG5vdCBhdmFpbGFibGVgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4ge1xuICAgICAgICBpZiAodi5pZGVudGlmaWVyICE9PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi52LFxuICAgICAgICAgIHZhbHVlOiBvdXRjb21lVmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnID8gdmFsdWUgOiBbLi4udi52YWx1ZSwgdmFsdWUgYXMgc3RyaW5nXVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayhpZGVudGlmaWVyKSk7XG5cbiAgICB0aGlzLl9lbWl0PE91dGNvbWVDaGFuZ2VkRGV0YWlscz4oJ3F0aS1vdXRjb21lLWNoYW5nZWQnLCB7XG4gICAgICBpdGVtOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBvdXRjb21lSWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgIHZhbHVlOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKT8udmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbXBsZXRpb25TdGF0dXMoKTogJ2NvbXBsZXRlZCcgfCAnaW5jb21wbGV0ZScgfCAnbm90X2F0dGVtcHRlZCcgfCAndW5rbm93bicge1xuICAgIGlmICh0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmV2ZXJ5KGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnY29tcGxldGVkJztcbiAgICBpZiAodGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5zb21lKGludGVyYWN0aW9uRWxlbWVudCA9PiBpbnRlcmFjdGlvbkVsZW1lbnQudmFsaWRhdGUoKSkpIHJldHVybiAnaW5jb21wbGV0ZSc7XG4gICAgcmV0dXJuICdub3RfYXR0ZW1wdGVkJztcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXQ8VD4obmFtZSwgZGV0YWlsID0gbnVsbCkge1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxUPihuYW1lLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzZXNzbWVudC1pdGVtJzogUXRpQXNzZXNzbWVudEl0ZW07XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXIgPSAocHJldj86IHVua25vd24sIG5leHQ/OiB1bmtub3duKSA9PiB2b2lkO1xuXG50eXBlIE5vblVuZGVmaW5lZDxBPiA9IEEgZXh0ZW5kcyB1bmRlZmluZWQgPyBuZXZlciA6IEE7XG5cbnR5cGUgVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0tPzogTm9uVW5kZWZpbmVkPFRbS10+IGV4dGVuZHMgVXBkYXRlSGFuZGxlciA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbmludGVyZmFjZSBXYXRjaE9wdGlvbnMge1xuICAvKipcbiAgICogSWYgdHJ1ZSwgd2lsbCBvbmx5IHN0YXJ0IHdhdGNoaW5nIGFmdGVyIHRoZSBpbml0aWFsIHVwZGF0ZS9yZW5kZXJcbiAgICovXG4gIHdhaXRVbnRpbEZpcnN0VXBkYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSdW5zIHdoZW4gb2JzZXJ2ZWQgcHJvcGVydGllcyBjaGFuZ2UsIGUuZy4gQHByb3BlcnR5IG9yIEBzdGF0ZSwgYnV0IGJlZm9yZSB0aGUgY29tcG9uZW50IHVwZGF0ZXMuIFRvIHdhaXQgZm9yIGFuXG4gKiB1cGRhdGUgdG8gY29tcGxldGUgYWZ0ZXIgYSBjaGFuZ2Ugb2NjdXJzLCB1c2UgYGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGVgIGluIHRoZSBoYW5kbGVyLiBUbyBzdGFydCB3YXRjaGluZyBhZnRlciB0aGVcbiAqIGluaXRpYWwgdXBkYXRlL3JlbmRlciwgdXNlIGB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH1gIG9yIGB0aGlzLmhhc1VwZGF0ZWRgIGluIHRoZSBoYW5kbGVyLlxuICpcbiAqIFVzYWdlOlxuICpcbiAqIEB3YXRjaCgncHJvcE5hbWUnKVxuICogaGFuZGxlUHJvcENoYW5nZShvbGRWYWx1ZSwgbmV3VmFsdWUpIHtcbiAqICAgLi4uXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXRjaChwcm9wZXJ0eU5hbWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcHRpb25zPzogV2F0Y2hPcHRpb25zKSB7XG4gIGNvbnN0IHJlc29sdmVkT3B0aW9uczogUmVxdWlyZWQ8V2F0Y2hPcHRpb25zPiA9IHtcbiAgICB3YWl0VW50aWxGaXJzdFVwZGF0ZTogZmFsc2UsXG4gICAgLi4ub3B0aW9uc1xuICB9O1xuICByZXR1cm4gPEVsZW1DbGFzcyBleHRlbmRzIExpdEVsZW1lbnQ+KHByb3RvOiBFbGVtQ2xhc3MsIGRlY29yYXRlZEZuTmFtZTogVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxFbGVtQ2xhc3M+KSA9PiB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHVwZGF0ZSBpcyBhIHByb3RlY3RlZCBwcm9wZXJ0eVxuICAgIGNvbnN0IHsgdXBkYXRlIH0gPSBwcm90bztcbiAgICBjb25zdCB3YXRjaGVkUHJvcGVydGllcyA9IEFycmF5LmlzQXJyYXkocHJvcGVydHlOYW1lKSA/IHByb3BlcnR5TmFtZSA6IFtwcm9wZXJ0eU5hbWVdO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHVwZGF0ZSBpcyBhIHByb3RlY3RlZCBwcm9wZXJ0eVxuICAgIHByb3RvLnVwZGF0ZSA9IGZ1bmN0aW9uICh0aGlzOiBFbGVtQ2xhc3MsIGNoYW5nZWRQcm9wczogTWFwPGtleW9mIEVsZW1DbGFzcywgRWxlbUNsYXNzW2tleW9mIEVsZW1DbGFzc10+KSB7XG4gICAgICB3YXRjaGVkUHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gcHJvcGVydHkgYXMga2V5b2YgRWxlbUNsYXNzO1xuICAgICAgICBpZiAoY2hhbmdlZFByb3BzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBjaGFuZ2VkUHJvcHMuZ2V0KGtleSk7XG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzW2tleV07XG5cbiAgICAgICAgICBpZiAob2xkVmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXJlc29sdmVkT3B0aW9ucy53YWl0VW50aWxGaXJzdFVwZGF0ZSB8fCB0aGlzLmhhc1VwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgKHRoaXNbZGVjb3JhdGVkRm5OYW1lXSBhcyB1bmtub3duIGFzIFVwZGF0ZUhhbmRsZXIpKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdXBkYXRlLmNhbGwodGhpcywgY2hhbmdlZFByb3BzKTtcbiAgICB9O1xuICB9O1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUNvbnRleHQge1xuICBocmVmPzogc3RyaW5nO1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIHZhcmlhYmxlczogUmVhZG9ubHlBcnJheTxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPj47XG59XG5cbmV4cG9ydCBjb25zdCBpdGVtQ29udGV4dFZhcmlhYmxlcyA9IFtcbiAge1xuICAgIGlkZW50aWZpZXI6ICdjb21wbGV0aW9uU3RhdHVzJyxcbiAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZScsXG4gICAgYmFzZVR5cGU6ICdzdHJpbmcnLFxuICAgIHZhbHVlOiAndW5rbm93bicsXG4gICAgdHlwZTogJ291dGNvbWUnXG4gIH0sXG4gIHtcbiAgICBpZGVudGlmaWVyOiAnbnVtQXR0ZW1wdHMnLFxuICAgIGNhcmRpbmFsaXR5OiAnc2luZ2xlJyxcbiAgICBiYXNlVHlwZTogJ2ludGVnZXInLFxuICAgIHZhbHVlOiAnMCcsXG4gICAgdHlwZTogJ3Jlc3BvbnNlJ1xuICB9XG5dIGFzIFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10+W107XG5cbmV4cG9ydCBjb25zdCBpdGVtQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8SXRlbUNvbnRleHQ+KFN5bWJvbCgnaXRlbScpKTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcXRpVHJhbnNmb3JtSXRlbSB9IGZyb20gJy4uLy4uL3F0aS10cmFuc2Zvcm1lcnMnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjdXN0b20gZWxlbWVudCBmb3IgcmVmZXJlbmNpbmcgYW4gYXNzZXNzbWVudCBzdGltdWx1cy5cbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZicpXG5leHBvcnQgY2xhc3MgUXRpQXNzZXNzbWVudFN0aW11bHVzUmVmIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgc3RpbXVsdXMuXG4gICAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllciA9ICcnO1xuXG4gIC8qKlxuICAgKiBUaGUgaHJlZiBvZiB0aGUgc3RpbXVsdXMuXG4gICAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaHJlZiA9ICcnO1xuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGNvbm5lY3RlZCB0byB0aGUgRE9NLlxuICAgKiBMb2FkcyBhbmQgYXBwZW5kcyB0aGUgc3RpbXVsdXMgaWYgdGhlICdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYtY29ubmVjdGVkJyBldmVudCBpcyBub3QgcHJldmVudGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudCgncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLWNvbm5lY3RlZCcsIHsgY2FuY2VsYWJsZTogdHJ1ZSwgYnViYmxlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBpc1ByZXZlbnRlZCA9IHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICBpZiAoaXNQcmV2ZW50ZWQpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKTtcblxuICAgICAgY29uc3Qgc3RpbXVsdXNSZWYgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXN0aW11bHVzLWlkcmVmPSR7dGhpcy5pZGVudGlmaWVyfV1gKTtcbiAgICAgIGlmIChzdGltdWx1c1JlZikge1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN0aW11bHVzUmVmKHN0aW11bHVzUmVmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3RpbXVsdXMgd2l0aCBkYXRhLXN0aW11bHVzLWlkcmVmICR7dGhpcy5pZGVudGlmaWVyfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYW5kIGFwcGVuZHMgdGhlIHN0aW11bHVzIHRvIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICogQHBhcmFtIHN0aW11bHVzUmVmIC0gVGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIHN0aW11bHVzIHdpbGwgYmUgYXBwZW5kZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdXBkYXRlU3RpbXVsdXNSZWYoc3RpbXVsdXNSZWY6IEVsZW1lbnQpIHtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5ocmVmLnN1YnN0cmluZygwLCB0aGlzLmhyZWYubGFzdEluZGV4T2YoJy8nKSk7XG4gICAgY29uc3Qgc3RpbXVsdXMgPSBhd2FpdCBxdGlUcmFuc2Zvcm1JdGVtKClcbiAgICAgIC5sb2FkKHRoaXMuaHJlZilcbiAgICAgIC50aGVuKGFwaSA9PiBhcGkucGF0aChwYXRoKS5odG1sRG9jKCkpO1xuICAgIGlmIChzdGltdWx1cykgeyAgICAgIFxuICAgICAgY29uc3QgZWxlbWVudHMgPSBzdGltdWx1cy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc3RpbXVsdXMtYm9keSwgcXRpLXN0eWxlc2hlZXQnKTtcbiAgICAgIHN0aW11bHVzUmVmLmlubmVySFRNTCA9ICcnO1xuICAgICAgc3RpbXVsdXNSZWYuYXBwZW5kKC4uLmVsZW1lbnRzKTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmJzogUXRpQXNzZXNzbWVudFN0aW11bHVzUmVmO1xuICB9XG59XG4iLCAiY29uc3QgeG1sID0gU3RyaW5nLnJhdztcblxuLyogICA8IS0tIGNvbnZlcnQgQ0RBVEEgdG8gY29tbWVudHMgLS0+XG4gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCJ0ZXh0KClbY29udGFpbnMoLiwgJ0NEQVRBJyldXCI+XG4gIDx4c2w6Y29tbWVudD5cbiAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD1cIi5cIi8+XG4gIDwveHNsOmNvbW1lbnQ+XG48L3hzbDp0ZW1wbGF0ZT5cbiovXG5cbi8qXG4gIDwhLS0gcmVtb3ZlIHhtbCBjb21tZW50cyAtLT5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cImNvbW1lbnQoKVwiIC8+XG4gICovXG5cbmNvbnN0IHhtbFRvSFRNTCA9IHhtbGA8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj1cIjEuMFwiIHhtbG5zOnhzbD1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybVwiPlxuPHhzbDpvdXRwdXQgbWV0aG9kPVwiaHRtbFwiIHZlcnNpb249XCI1LjBcIiBlbmNvZGluZz1cIlVURi04XCIgaW5kZW50PVwieWVzXCIgLz5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cIkAqfG5vZGUoKVwiPlxuICAgIDx4c2w6Y29weT5cbiAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD1cIkAqfG5vZGUoKVwiLz5cbiAgICA8L3hzbDpjb3B5PlxuICA8L3hzbDp0ZW1wbGF0ZT5cblxuICA8IS0tIHJlbW92ZSBleGlzdGluZyBuYW1lc3BhY2VzIC0tPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwiKlwiPlxuICAgIDwhLS0gcmVtb3ZlIGVsZW1lbnQgcHJlZml4IC0tPlxuICAgIDx4c2w6ZWxlbWVudCBuYW1lPVwie2xvY2FsLW5hbWUoKX1cIj5cbiAgICAgIDwhLS0gcHJvY2VzcyBhdHRyaWJ1dGVzIC0tPlxuICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9XCJAKlwiPlxuICAgICAgICA8IS0tIHJlbW92ZSBhdHRyaWJ1dGUgcHJlZml4IC0tPlxuICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPVwie2xvY2FsLW5hbWUoKX1cIj5cbiAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD1cIi5cIi8+XG4gICAgICAgIDwveHNsOmF0dHJpYnV0ZT5cbiAgICAgIDwveHNsOmZvci1lYWNoPlxuICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz5cbiAgPC94c2w6ZWxlbWVudD5cbjwveHNsOnRlbXBsYXRlPlxuPC94c2w6c3R5bGVzaGVldD5gO1xuXG4vLyBGdW5jdGlvbiB0byBleHRlbmQgZWxlbWVudHMgd2l0aCBhIHNwZWNpZmljIHRhZyBuYW1lIGJ5IGFkZGluZyBhbiBleHRlbnNpb24gc3VmZml4XG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kRWxlbWVudE5hbWUoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50LCB0YWdOYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKSB7XG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGFnTmFtZSkuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCBuZXdUYWdOYW1lID0gYCR7dGFnTmFtZX0tJHtleHRlbnNpb259YDtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudFdpdGhOZXdUYWdOYW1lKGVsZW1lbnQsIG5ld1RhZ05hbWUpO1xuICAgIGVsZW1lbnQucmVwbGFjZVdpdGgobmV3RWxlbWVudCk7XG4gIH0pO1xufVxuXG4vLyBGdW5jdGlvbiB0byBleHRlbmQgYW55IGVsZW1lbnQgd2l0aCBhIHNwZWNpZmljIGNsYXNzIHBhdHRlcm4gKGUuZy4sIFwiZXh0ZW5kOnN1ZmZpeFwiKVxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzKHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudCwgY2xhc3NOYW1lUGF0dGVybjogc3RyaW5nKSB7XG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0O1xuICAgIGlmIChjbGFzc0xpc3QpIHtcbiAgICAgIGNsYXNzTGlzdC5mb3JFYWNoKGNsYXNzTmFtZSA9PiB7XG4gICAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aChgJHtjbGFzc05hbWVQYXR0ZXJufTpgKSkge1xuICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IGNsYXNzTmFtZS5zbGljZShgJHtjbGFzc05hbWVQYXR0ZXJufTpgLmxlbmd0aCk7XG4gICAgICAgICAgY29uc3QgbmV3VGFnTmFtZSA9IGAke2VsZW1lbnQubm9kZU5hbWV9LSR7c3VmZml4fWA7XG4gICAgICAgICAgY29uc3QgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnRXaXRoTmV3VGFnTmFtZShlbGVtZW50LCBuZXdUYWdOYW1lKTtcbiAgICAgICAgICBlbGVtZW50LnJlcGxhY2VXaXRoKG5ld0VsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGVsZW1lbnQgd2l0aCBhIG5ldyB0YWcgbmFtZSBhbmQgY29weSBhdHRyaWJ1dGVzIGFuZCBjaGlsZHJlblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudFdpdGhOZXdUYWdOYW1lKGVsZW1lbnQsIG5ld1RhZ05hbWUpIHtcbiAgY29uc3QgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmV3VGFnTmFtZSk7XG4gIC8vIENvcHkgYXR0cmlidXRlc1xuICBmb3IgKGNvbnN0IGF0dHIgb2YgZWxlbWVudC5hdHRyaWJ1dGVzKSB7XG4gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgfVxuICAvLyBDb3B5IGNoaWxkIG5vZGVzXG4gIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gIH1cbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpdGVtc0Zyb21UZXN0KHhtbEZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KSB7XG4gIGNvbnN0IGl0ZW1zOiB7IGlkZW50aWZpZXI6IHN0cmluZzsgaHJlZjogc3RyaW5nOyBjYXRlZ29yeTogc3RyaW5nIH1bXSA9IFtdO1xuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdxdGktYXNzZXNzbWVudC1pdGVtLXJlZicpLmZvckVhY2goZWwgPT4ge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCBocmVmID0gZWwuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSBlbC5nZXRBdHRyaWJ1dGUoJ2NhdGVnb3J5Jyk7XG4gICAgaXRlbXMucHVzaCh7IGlkZW50aWZpZXIsIGhyZWYsIGNhdGVnb3J5IH0pO1xuICB9KTtcbiAgcmV0dXJuIGl0ZW1zO1xufVxuXG5sZXQgY3VycmVudFJlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0IHwgbnVsbCA9IG51bGw7XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkWE1MKHVybCwgY2FuY2VsUHJldmlvdXNSZXF1ZXN0ID0gZmFsc2UpIHtcbiAgaWYgKGNhbmNlbFByZXZpb3VzUmVxdWVzdCAmJiBjdXJyZW50UmVxdWVzdCAhPT0gbnVsbCkge1xuICAgIGN1cnJlbnRSZXF1ZXN0LmFib3J0KCk7IC8vIEFib3J0IHRoZSBvbmdvaW5nIHJlcXVlc3QgaWYgdGhlcmUgaXMgb25lXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2U8WE1MRG9jdW1lbnQgfCBudWxsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgY3VycmVudFJlcXVlc3QgPSB4aHI7IC8vIFN0b3JlIHRoZSBjdXJyZW50IHJlcXVlc3RcblxuICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuICAgIHhoci5yZXNwb25zZVR5cGUgPSAnZG9jdW1lbnQnO1xuXG4gICAgeGhyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgIHJlc29sdmUoeGhyLnJlc3BvbnNlWE1MKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHhoci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgcmVqZWN0KHhoci5zdGF0dXNUZXh0KTtcbiAgICB9O1xuXG4gICAgeGhyLnNlbmQoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVhNTCh4bWxEb2N1bWVudDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgY29uc3QgeG1sRnJhZ21lbnQgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHhtbERvY3VtZW50LCAndGV4dC94bWwnKTtcbiAgcmV0dXJuIHhtbEZyYWdtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9IVE1MKHhtbEZyYWdtZW50OiBEb2N1bWVudCk6IERvY3VtZW50RnJhZ21lbnQge1xuICBjb25zdCBwcm9jZXNzb3IgPSBuZXcgWFNMVFByb2Nlc3NvcigpO1xuICBjb25zdCB4c2x0RG9jdW1lbnQgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHhtbFRvSFRNTCwgJ3RleHQveG1sJyk7XG4gIHByb2Nlc3Nvci5pbXBvcnRTdHlsZXNoZWV0KHhzbHREb2N1bWVudCk7XG4gIGNvbnN0IGl0ZW1IVE1MRnJhZ21lbnQgPSBwcm9jZXNzb3IudHJhbnNmb3JtVG9GcmFnbWVudCh4bWxGcmFnbWVudCwgZG9jdW1lbnQpO1xuICByZXR1cm4gaXRlbUhUTUxGcmFnbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldExvY2F0aW9uKHhtbEZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50LCBsb2NhdGlvbjogc3RyaW5nKSB7XG4gIGlmICghbG9jYXRpb24uZW5kc1dpdGgoJy8nKSkge1xuICAgIGxvY2F0aW9uICs9ICcvJztcbiAgfVxuXG4gIHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tzcmNdLFtocmVmXSxbcHJpbWFyeS1wYXRoXScpLmZvckVhY2goZWxXaXRoU3JjID0+IHtcbiAgICBsZXQgYXR0cjogJ3NyYycgfCAnaHJlZicgfCAncHJpbWFyeS1wYXRoJyB8ICcnID0gJyc7XG5cbiAgICBpZiAoZWxXaXRoU3JjLmdldEF0dHJpYnV0ZSgnc3JjJykpIHtcbiAgICAgIGF0dHIgPSAnc3JjJztcbiAgICB9XG4gICAgaWYgKGVsV2l0aFNyYy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkge1xuICAgICAgYXR0ciA9ICdocmVmJztcbiAgICB9XG4gICAgaWYgKGVsV2l0aFNyYy5nZXRBdHRyaWJ1dGUoJ3ByaW1hcnktcGF0aCcpKSB7XG4gICAgICBhdHRyID0gJ3ByaW1hcnktcGF0aCc7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGVsV2l0aFNyYy5nZXRBdHRyaWJ1dGUoYXR0cik/LnRyaW0oKTtcblxuICAgIGlmICghYXR0clZhbHVlLnN0YXJ0c1dpdGgoJ2RhdGE6JykgJiYgIWF0dHJWYWx1ZS5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgIGNvbnN0IG5ld1NyY1ZhbHVlID0gbG9jYXRpb24gKyBlbmNvZGVVUkkoYXR0clZhbHVlKTtcbiAgICAgIGVsV2l0aFNyYy5zZXRBdHRyaWJ1dGUoYXR0ciwgbmV3U3JjVmFsdWUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQoeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpIHtcbiAgY29uc3QgY2RhdGFFbGVtZW50cyA9IHhtbEZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1jdXN0b20tb3BlcmF0b3JbY2xhc3M9XCJqcy5vcmdcIl0gPiBxdGktYmFzZS12YWx1ZScpO1xuICBjZGF0YUVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgY29uc3QgY29tbWVudFRleHQgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KGVsZW1lbnQudGV4dENvbnRlbnQpO1xuICAgIGVsZW1lbnQucmVwbGFjZUNoaWxkKGNvbW1lbnRUZXh0LCBlbGVtZW50LmZpcnN0Q2hpbGQpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwU3R5bGVTaGVldHMoeG1sRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpIHtcbiAgLy8gcmVtb3ZlIHF0aS1zdHlsZXNoZWV0IHRhZ1xuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc3R5bGVzaGVldCcpLmZvckVhY2goc3R5bGVzaGVldCA9PiBzdHlsZXNoZWV0LnJlbW92ZSgpKTtcbn1cbiIsICIvKipcbiAqIEJyb3dzZXIgYmFzZWQgUVRJLVhNTCB0byBIVE1MIHRyYW5zZm9ybWVyLlxuICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIGxvYWQsIHBhcnNlLCB0cmFuc2Zvcm0gYW5kIHNlcmlhbGl6ZSBRVEkgWE1MIGl0ZW1zLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBsb2FkLCBwYXJzZSwgdHJhbnNmb3JtIGFuZCBzZXJpYWxpemUgUVRJIFhNTCBpdGVtcy5cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBxdGlUcmFuc2Zvcm1lciA9IHF0aVRyYW5zZm9ybUl0ZW0oKTtcbiAqIGF3YWl0IHF0aVRyYW5zZm9ybWVyLmxvYWQoJ3BhdGgvdG8veG1sL2ZpbGUueG1sJyk7XG4gKiBxdGlUcmFuc2Zvcm1lci5wYXRoKCcvYXNzZXNzbWVudEl0ZW0vaXRlbUJvZHknKTtcbiAqIGNvbnN0IGh0bWwgPSBxdGlUcmFuc2Zvcm1lci5odG1sKCk7XG4gKiBjb25zdCB4bWwgPSBxdGlUcmFuc2Zvcm1lci54bWwoKTtcbiAqIGNvbnN0IGh0bWxkb2MgPSBxdGlUcmFuc2Zvcm1lci5odG1sZG9jKCk7XG4gKiBjb25zdCB4bWxkb2MgPSBxdGlUcmFuc2Zvcm1lci54bWxkb2MoKTtcbiAqXG4gKiBxdGlUcmFuc2Zvcm1JdGVtKCkucGFyc2Uoc3RvcnlYTUwpLmh0bWwoKVxuICovXG5cbmltcG9ydCB7XG4gIGNvbnZlcnRDREFUQXRvQ29tbWVudCxcbiAgZXh0ZW5kRWxlbWVudE5hbWUsXG4gIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzLFxuICBsb2FkWE1MLFxuICBwYXJzZVhNTCxcbiAgc2V0TG9jYXRpb24sXG4gIHN0cmlwU3R5bGVTaGVldHMsXG4gIHRvSFRNTFxufSBmcm9tICcuL3F0aS10cmFuc2Zvcm1lcnMnO1xuXG5leHBvcnQgdHlwZSB0cmFuc2Zvcm1JdGVtQXBpID0ge1xuICBsb2FkOiAodXJpOiBzdHJpbmcsIGNhbmNlbFByZXZpb3VzUmVxdWVzdD86IGJvb2xlYW4pID0+IFByb21pc2U8dHJhbnNmb3JtSXRlbUFwaT47XG4gIHBhcnNlOiAoeG1sU3RyaW5nOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIHBhdGg6IChsb2NhdGlvbjogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBmbjogKGZuOiAoeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50KSA9PiB2b2lkKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBwY2lIb29rczogKHVyaTogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBleHRlbmRFbGVtZW50TmFtZTogKGVsZW1lbnROYW1lOiBzdHJpbmcsIGV4dGVuZDogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBleHRlbmRFbGVtZW50c1dpdGhDbGFzczogKHBhcmFtPzogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBjdXN0b21JbnRlcmFjdGlvbjogKGJhc2VSZWY6IHN0cmluZywgYmFzZUl0ZW06IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgY29udmVydENEQVRBdG9Db21tZW50OiAoKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBzdHJpcFN0eWxlU2hlZXRzOiAoKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBodG1sOiAoKSA9PiBzdHJpbmc7XG4gIHhtbDogKCkgPT4gc3RyaW5nO1xuICBodG1sRG9jOiAoKSA9PiBEb2N1bWVudEZyYWdtZW50O1xuICB4bWxEb2M6ICgpID0+IFhNTERvY3VtZW50O1xufTtcblxuZXhwb3J0IGNvbnN0IHF0aVRyYW5zZm9ybUl0ZW0gPSAoKSA9PiB7XG4gIGxldCB4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQ7XG5cbiAgY29uc3QgYXBpOiB0cmFuc2Zvcm1JdGVtQXBpID0ge1xuICAgIGFzeW5jIGxvYWQodXJpOiBzdHJpbmcsIGNhbmNlbFByZXZpb3VzUmVxdWVzdCA9IGZhbHNlKTogUHJvbWlzZTx0eXBlb2YgYXBpPiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8dHlwZW9mIGFwaT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsb2FkWE1MKHVyaSwgY2FuY2VsUHJldmlvdXNSZXF1ZXN0KS50aGVuKHhtbCA9PiB7XG4gICAgICAgICAgeG1sRnJhZ21lbnQgPSB4bWw7XG4gICAgICAgICAgLy8gc2V0IHRoZSBiYXNlIHBhdGggZm9yIGltYWdlcyBhbmQgb3RoZXIgcmVzb3VyY2VzLFxuICAgICAgICAgIC8vIHlvdSBwcm9iYWJseSB3YW50IHRvIHNldCB0aGUgYmFzZSBwYXRoIHRvIHRoZSBkb2N1bWVudCByb290IGVsc2UgeW91IGNhbiB1c2UgdGhlIHBhdGggbWV0aG9kIHRvIHNldCBpdFxuICAgICAgICAgIGFwaS5wYXRoKHVyaS5zdWJzdHJpbmcoMCwgdXJpLmxhc3RJbmRleE9mKCcvJykpKTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShhcGkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcGFyc2UoeG1sU3RyaW5nOiBzdHJpbmcpOiB0eXBlb2YgYXBpIHtcbiAgICAgIHhtbEZyYWdtZW50ID0gcGFyc2VYTUwoeG1sU3RyaW5nKTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBwYXRoOiAobG9jYXRpb246IHN0cmluZyk6IHR5cGVvZiBhcGkgPT4ge1xuICAgICAgc2V0TG9jYXRpb24oeG1sRnJhZ21lbnQsIGxvY2F0aW9uKTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBmbihmbjogKHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudCkgPT4gdm9pZCk6IHR5cGVvZiBhcGkge1xuICAgICAgZm4oeG1sRnJhZ21lbnQpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIHBjaUhvb2tzKHVyaTogc3RyaW5nKTogdHlwZW9mIGFwaSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gWydob29rJywgJ21vZHVsZSddO1xuICAgICAgY29uc3QgZG9jdW1lbnRQYXRoID0gdXJpLnN1YnN0cmluZygwLCB1cmkubGFzdEluZGV4T2YoJy8nKSk7XG4gICAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgIGNvbnN0IHNyY0F0dHJpYnV0ZXMgPSB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbJyArIGF0dHJpYnV0ZSArICddJyk7XG4gICAgICAgIHNyY0F0dHJpYnV0ZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICBjb25zdCBzcmNWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSkhO1xuICAgICAgICAgIGlmICghc3JjVmFsdWUuc3RhcnRzV2l0aCgnZGF0YTonKSAmJiAhc3JjVmFsdWUuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICAgICAgICAvLyBKdXN0IHBhc3RlIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBzcmMgbG9jYXRpb24gYWZ0ZXIgdGhlIGRvY3VtZW50cm9vdFBhdGhcbiAgICAgICAgICAgIC8vIG9sZCBwY2lzIGNhbiBoYXZlIGEgLmpzLCBuZXcgcGNpJ3MgZG9uJ3RcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdiYXNlLXVybCcsIHVyaSk7XG4gICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgJ21vZHVsZScsXG4gICAgICAgICAgICAgIGRvY3VtZW50UGF0aCArICcvJyArIGVuY29kZVVSSShzcmNWYWx1ZSArIChzcmNWYWx1ZS5lbmRzV2l0aCgnLmpzJykgPyAnJyA6ICcuanMnKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBleHRlbmRFbGVtZW50TmFtZTogKHRhZ05hbWU6IHN0cmluZywgZXh0ZW5zaW9uOiBzdHJpbmcpOiB0eXBlb2YgYXBpID0+IHtcbiAgICAgIGV4dGVuZEVsZW1lbnROYW1lKHhtbEZyYWdtZW50LCB0YWdOYW1lLCBleHRlbnNpb24pO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGV4dGVuZEVsZW1lbnRzV2l0aENsYXNzOiAocGFyYW06IHN0cmluZyA9ICdleHRlbmQnKTogdHlwZW9mIGFwaSA9PiB7XG4gICAgICBleHRlbmRFbGVtZW50c1dpdGhDbGFzcyh4bWxGcmFnbWVudCwgcGFyYW0pO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGN1c3RvbUludGVyYWN0aW9uKGJhc2VSZWY6IHN0cmluZywgYmFzZUl0ZW06IHN0cmluZyk6IHR5cGVvZiBhcGkge1xuICAgICAgY29uc3QgcXRpQ3VzdG9tSW50ZXJhY3Rpb24gPSB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yKCdxdGktY3VzdG9tLWludGVyYWN0aW9uJyk7XG4gICAgICBjb25zdCBxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdCA9IHF0aUN1c3RvbUludGVyYWN0aW9uLnF1ZXJ5U2VsZWN0b3IoJ29iamVjdCcpO1xuXG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYmFzZS1yZWYnLCBiYXNlUmVmKTtcbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLWl0ZW0nLCBiYXNlUmVmICsgYmFzZUl0ZW0pO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCdkYXRhJywgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QuZ2V0QXR0cmlidXRlKCdkYXRhJykpO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCd3aWR0aCcsIHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0LmdldEF0dHJpYnV0ZSgnd2lkdGgnKSk7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0LmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpO1xuXG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5yZW1vdmVDaGlsZChxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgY29udmVydENEQVRBdG9Db21tZW50KCk6IHR5cGVvZiBhcGkge1xuICAgICAgY29udmVydENEQVRBdG9Db21tZW50KHhtbEZyYWdtZW50KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBzdHJpcFN0eWxlU2hlZXRzKCk6IHR5cGVvZiBhcGkge1xuICAgICAgc3RyaXBTdHlsZVNoZWV0cyh4bWxGcmFnbWVudCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgaHRtbCgpIHtcbiAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHRvSFRNTCh4bWxGcmFnbWVudCkpO1xuICAgIH0sXG4gICAgeG1sKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh4bWxGcmFnbWVudCk7XG4gICAgfSxcbiAgICBodG1sRG9jKCkge1xuICAgICAgcmV0dXJuIHRvSFRNTCh4bWxGcmFnbWVudCk7XG4gICAgfSxcbiAgICB4bWxEb2MoKTogWE1MRG9jdW1lbnQge1xuICAgICAgcmV0dXJuIHhtbEZyYWdtZW50OyAvLyBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHhtbEZyYWdtZW50KTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBhcGk7XG59O1xuIiwgImltcG9ydCB7IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXIsIExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgaW50ZXJmYWNlIENob2ljZUludGVyZmFjZSB7XG4gIGlkZW50aWZpZXI6IHN0cmluZztcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRlciB0byBoYW5kbGUgYm9vbGVhbiBhdHRyaWJ1dGVzIGZvciBBUklBIHByb3BlcnRpZXMsXG4gKiBlbnN1cmluZyB0aGV5IGFyZSBzZXQgYXMgJ3RydWUnIG9yICdmYWxzZScgc3RyaW5ncy5cbiAqL1xuY29uc3QgYXJpYUJvb2xlYW5Db252ZXJ0ZXI6IENvbXBsZXhBdHRyaWJ1dGVDb252ZXJ0ZXI8Ym9vbGVhbiwgYm9vbGVhbj4gPSB7XG4gIHRvQXR0cmlidXRlOiAodmFsdWU6IGJvb2xlYW4pID0+ICh2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZScpLFxuICBmcm9tQXR0cmlidXRlOiAodmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHZhbHVlID09PSAndHJ1ZSdcbn07XG5cbi8qKlxuICogQSBtaXhpbiB0aGF0IGFkZHMgY2hvaWNlIGZ1bmN0aW9uYWxpdHkgdG8gYSBMaXRFbGVtZW50LWJhc2VkIGNsYXNzLlxuICogSXQgZGlzcGF0Y2hlcyBldmVudHMgd2l0aCBhIGN1c3RvbSBgdHlwZWAgYW5kIGhhbmRsZXMgc2VsZWN0aW9uIGxvZ2ljLlxuICpcbiAqIEBwYXJhbSBCYXNlIC0gVGhlIGJhc2UgY2xhc3MgdG8gZXh0ZW5kLlxuICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgY2hvaWNlLCB1c2VkIGluIGV2ZW50IG5hbWVzLlxuICogQHJldHVybnMgQSBuZXcgY2xhc3MgZXh0ZW5kaW5nIHRoZSBiYXNlIGNsYXNzIHdpdGggY2hvaWNlIGZ1bmN0aW9uYWxpdHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZlRWxlbWVudE1peGluSW50ZXJmYWNlIHtcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICB0YWJJbmRleDogbnVtYmVyO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHk6IGJvb2xlYW47XG4gIGludGVybmFsczogRWxlbWVudEludGVybmFscztcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gQWN0aXZlRWxlbWVudE1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oQmFzZTogVCwgdHlwZTogc3RyaW5nKSB7XG4gIGFic3RyYWN0IGNsYXNzIFF0aUNob2ljZSBleHRlbmRzIEJhc2Uge1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICAgIHB1YmxpYyBpZGVudGlmaWVyID0gJyc7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogJ3RhYmluZGV4JyB9KVxuICAgIHB1YmxpYyB0YWJJbmRleCA9IDA7XG5cbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIHJlZmxlY3Q6IHRydWUsXG4gICAgICBhdHRyaWJ1dGU6ICdhcmlhLWRpc2FibGVkJyxcbiAgICAgIGNvbnZlcnRlcjogYXJpYUJvb2xlYW5Db252ZXJ0ZXJcbiAgICB9KVxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICByZWZsZWN0OiB0cnVlLFxuICAgICAgYXR0cmlidXRlOiAnYXJpYS1yZWFkb25seScsXG4gICAgICBjb252ZXJ0ZXI6IGFyaWFCb29sZWFuQ29udmVydGVyXG4gICAgfSlcbiAgICBwdWJsaWMgcmVhZG9ubHkgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBpbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHM7XG5cbiAgICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIGhhbmRsZURpc2FibGVkQ2hhbmdlKF9vbGRWYWx1ZTogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMudGFiSW5kZXggPSBkaXNhYmxlZCA/IC0xIDogMDtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmJsdXIoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgc3VwZXIoLi4uYXJncyk7XG4gICAgICB0aGlzLmludGVybmFscyA9IHRoaXMuYXR0YWNoSW50ZXJuYWxzKCk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fb25LZXlVcCk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljayk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGByZWdpc3Rlci0ke3R5cGV9YCwge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX29uS2V5VXApO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2spO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoYHVucmVnaXN0ZXItJHt0eXBlfWAsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX29uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5hbHRLZXkpIHJldHVybjtcblxuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdTcGFjZScpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5fYWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9vbkNsaWNrKCkge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgdGhpcy5fYWN0aXZhdGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hY3RpdmF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmcgfT4oYGFjdGl2YXRlLSR7dHlwZX1gLCB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHsgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gICAgfVxuICB9XG4gIHJldHVybiBRdGlDaG9pY2UgYXMgQ29uc3RydWN0b3I8QWN0aXZlRWxlbWVudE1peGluSW50ZXJmYWNlPiAmIFQ7XG59XG4iLCAiaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1pdGVtLWJvZHkuc3R5bGVzJztcbmltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAgfSBmcm9tICdsaXQnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktaXRlbS1ib2R5IG5vZGUgY29udGFpbnMgdGhlIHRleHQsIGdyYXBoaWNzLCBtZWRpYSBvYmplY3RzIGFuZCBpbnRlcmFjdGlvbnMgdGhhdCBkZXNjcmliZSB0aGUgaXRlbSdzIGNvbnRlbnQgYW5kIGluZm9ybWF0aW9uIGFib3V0IGhvdyBpdCBpcyBzdHJ1Y3R1cmVkLlxuICogQGRvY3VtZW50YXRpb24gaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5zcGhwbzZsdTZ6cWlcbiAqIEBzdGF0dXMgc3RhYmxlXG4gKiBAc2luY2UgNC4wXG4gKlxuICogQHNsb3QgLSBpdGVtIGJvZHkgY29udGVudC5cbiAqIEBzbG90IHF0aS1ydWJyaWMtYmxvY2sgLSB0aGUgcXRpIHJ1YnJpYyBibG9jayBpcyBwbGFjZWQgYWJvdmUgdGhlIGl0ZW1cbiAqXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktaXRlbS1ib2R5JylcbmV4cG9ydCBjbGFzcyBRdGlJdGVtQm9keSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInF0aS1ydWJyaWMtYmxvY2tcIj48L3Nsb3Q+PHNsb3Q+PC9zbG90PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWl0ZW0tYm9keSc6IFF0aUl0ZW1Cb2R5O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzIH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbmA7XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wcm9tcHQnKVxuZXhwb3J0IGNsYXNzIFF0aVByb21wdCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAvLyBpZiBwcm9tcHRzIGFyZSBpbiBpbnRlcmFjdGlvbnMgdGhleSBzaG91bGQgaGF2ZSBhIHNsb3QsIHNvIHRoZSBwcm9tcHQgaGFzIHRvIGdvIHRoZXJlXG4gICAgLy8gaWYgcHJvbXB0IGlzIGluIHRoZSBib2R5LCB0aGVuIGp1c3QgZGlzcGxheSB0aGUgcHJvbXB0IHRoZXJlLlxuICAgIC8vIEEgYmV0dGVyIGNoZWNrIHdvdWxkIGJlIHRoZSBsYXR0ZXIsIGJ1dCBub3QgY2FuJ3QgZ2V0IHRocm91Z2ggdGhlIHNoYWRvd3Jvb3QgdG8gZmluZCB0aGUgc2xvdFxuICAgIGNvbnN0IGluSW50ZXJhY3Rpb24gPSB0aGlzLnBhcmVudEVsZW1lbnQudGFnTmFtZS5lbmRzV2l0aCgnSU5URVJBQ1RJT04nKTtcbiAgICBpZiAoaW5JbnRlcmFjdGlvbikge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncHJvbXB0Jyk7XG4gICAgfVxuICAgIC8vIGNvbnN0IHByb21wdFNsb3QgPSB0aGlzLnBhcmVudEVsZW1lbnQuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKFwiW25hbWU9J3Byb21wdCddXCIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1wcm9tcHQnOiBRdGlQcm9tcHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBQcm9wZXJ0eVZhbHVlTWFwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktc3R5bGVzaGVldCcpXG5leHBvcnQgY2xhc3MgUXRpU3R5bGVzaGVldCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBwcml2YXRlIHN0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlTWFwPGFueT4gfCBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KTogdm9pZCB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7XG5cbiAgICBjb25zdCBsaW5rID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcblxuICAgIGlmIChsaW5rICE9PSBudWxsKSB7XG4gICAgICAvLyBGZXRjaCB0aGUgc3R5bGVzaGVldCBjb250ZW50XG4gICAgICBmZXRjaChsaW5rKVxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS50ZXh0KCkpXG4gICAgICAgIC50aGVuKGNzc0NvbnRlbnQgPT4ge1xuICAgICAgICAgIC8vIE1pbmlmeSB0aGUgQ1NTIGNvbnRlbnQgYnkgcmVtb3Zpbmcgd2hpdGVzcGFjZSBhbmQgY29tbWVudHNcbiAgICAgICAgICBjb25zdCBtaW5pZmllZENzcyA9IHRoaXMubWluaWZ5Q3NzKGNzc0NvbnRlbnQpO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIGEgPHN0eWxlPiBlbGVtZW50IHdpdGggQHNjb3BlIHN1cnJvdW5kaW5nIHRoZSBtaW5pZmllZCBDU1NcbiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgdGhpcy5zdHlsZUVsZW1lbnQubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IGBAc2NvcGUgeyR7bWluaWZpZWRDc3N9fWA7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSBzdHlsZSBlbGVtZW50IHRvIHRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGlzIGNvbXBvbmVudFxuICAgICAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnN0eWxlRWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gcGFyZW50IGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBzY29wZWQgc3R5bGVzaGVldCB0by4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgc3R5bGVzaGVldDonLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRleHRDb250ZW50ICE9PSBudWxsICYmIHRoaXMudGV4dENvbnRlbnQudHJpbSgpICE9PSAnJykge1xuICAgICAgLy8gTWluaWZ5IHRoZSBpbmxpbmUgQ1NTIGNvbnRlbnRcbiAgICAgIGNvbnN0IG1pbmlmaWVkQ3NzID0gdGhpcy5taW5pZnlDc3ModGhpcy50ZXh0Q29udGVudCk7XG5cbiAgICAgIC8vIERpcmVjdGx5IGNyZWF0ZSBhIDxzdHlsZT4gZWxlbWVudCB3aXRoIHRoZSBAc2NvcGUgc3Vycm91bmRpbmcgdGhlIG1pbmlmaWVkIGlubGluZSBzdHlsZXNcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHRoaXMuc3R5bGVFbGVtZW50Lm1lZGlhID0gJ3NjcmVlbic7XG4gICAgICB0aGlzLnN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IGBAc2NvcGUgeyR7bWluaWZpZWRDc3N9fWA7XG5cbiAgICAgIC8vIEFwcGVuZCB0aGUgc3R5bGUgZWxlbWVudCB0byB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhpcyBjb21wb25lbnRcbiAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc3R5bGVFbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignTm8gcGFyZW50IGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBzY29wZWQgc3R5bGVzaGVldCB0by4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1pbmlmeUNzcyhjc3NDb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFJlbW92ZSBjb21tZW50cywgd2hpdGVzcGFjZSwgYW5kIG5ld2xpbmUgY2hhcmFjdGVyc1xuICAgIHJldHVybiBjc3NDb250ZW50XG4gICAgICAucmVwbGFjZSgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAnJykgLy8gUmVtb3ZlIGNvbW1lbnRzXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpIC8vIENvbGxhcHNlIHdoaXRlc3BhY2VcbiAgICAgIC5yZXBsYWNlKC9cXHMqKFt7fTo7XSlcXHMqL2csICckMScpIC8vIFJlbW92ZSBzcGFjZXMgYXJvdW5kIHt9LCA6LCA7XG4gICAgICAudHJpbSgpOyAvLyBUcmltIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKHRoaXMuc3R5bGVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0eWxlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkIG5vdCByZW1vdmUgc3R5bGVzaGVldDonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXN0eWxlc2hlZXQnOiBRdGlTdHlsZXNoZWV0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQmFzZVR5cGUsIENhcmRpbmFsaXR5IH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgT3V0Y29tZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCB7IFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW91dGNvbWUtZGVjbGFyYXRpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU91dGNvbWVEZWNsYXJhdGlvbiBleHRlbmRzIFF0aVZhcmlhYmxlRGVjbGFyYXRpb24ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Jhc2UtdHlwZScgfSkgYmFzZVR5cGU6IEJhc2VUeXBlO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2V4dGVybmFsLXNjb3JlZCcgfSkgZXh0ZXJuYWxTY29yZWQ6ICdodW1hbicgfCAnZXh0ZXJuYWxNYWNoaW5lJyB8IG51bGwgPSBudWxsO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgY2FyZGluYWxpdHk6IENhcmRpbmFsaXR5O1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBnZXQgaW50ZXJwb2xhdGlvblRhYmxlKCk6IE1hcDxudW1iZXIsIG51bWJlcj4gfCBudWxsIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVycG9sYXRpb24tdGFibGUnKTtcbiAgICBpZiAodGFibGUpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpKSB7XG4gICAgICAgIGlmICghZW50cnkuZ2V0QXR0cmlidXRlKCdzb3VyY2UtdmFsdWUnKSAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoJ3RhcmdldC12YWx1ZScpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignc291cmNlLXZhbHVlIG9yIHRhcmdldC12YWx1ZSBpcyBtaXNzaW5nIGluIHF0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlVmFsdWUgPSBwYXJzZUludChlbnRyeS5nZXRBdHRyaWJ1dGUoJ3NvdXJjZS12YWx1ZScpKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmFsdWUgPSBwYXJzZUludChlbnRyeS5nZXRBdHRyaWJ1dGUoJ3RhcmdldC12YWx1ZScpKTtcbiAgICAgICAgaWYgKGlzTmFOKHNvdXJjZVZhbHVlKSB8fCBpc05hTih0YXJnZXRWYWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzb3VyY2UtdmFsdWUgb3IgdGFyZ2V0LXZhbHVlIGlzIG5vdCBhIG51bWJlciBpbiBxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpO1xuICAgICAgICB9XG4gICAgICAgIGVudHJpZXMuc2V0KHNvdXJjZVZhbHVlLCB0YXJnZXRWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cmllcztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGU6IE91dGNvbWVWYXJpYWJsZSA9IHtcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIGNhcmRpbmFsaXR5OiB0aGlzLmNhcmRpbmFsaXR5LFxuICAgICAgYmFzZVR5cGU6IHRoaXMuYmFzZVR5cGUsXG4gICAgICB0eXBlOiAnb3V0Y29tZScsXG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGludGVycG9sYXRpb25UYWJsZTogdGhpcy5pbnRlcnBvbGF0aW9uVGFibGUsXG4gICAgICBleHRlcm5hbFNjb3JlZDogdGhpcy5leHRlcm5hbFNjb3JlZFxuICAgIH07XG4gICAgb3V0Y29tZVZhcmlhYmxlLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWVzKG91dGNvbWVWYXJpYWJsZSk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItdmFyaWFibGUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgdmFyaWFibGU6IG91dGNvbWVWYXJpYWJsZSB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW91dGNvbWUtZGVjbGFyYXRpb24nOiBRdGlPdXRjb21lRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS12YXJpYWJsZWRlY2xhcmF0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWZhdWx0VmFsdWVzKHZhcmlhYmxlOiBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD4pIHtcbiAgICBjb25zdCBodG1sVmFsdWVzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1kZWZhdWx0LXZhbHVlID4gcXRpLXZhbHVlJykpO1xuXG4gICAgaWYgKGh0bWxWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0VmFsdWVzID0gaHRtbFZhbHVlcy5tYXAobiA9PiBuLmlubmVySFRNTC50cmltKCkpO1xuICAgIGlmIChkZWZhdWx0VmFsdWVzLmxlbmd0aCA+IDEgfHwgdmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdtdWx0aXBsZScgfHwgdmFyaWFibGUuY2FyZGluYWxpdHkgPT09ICdvcmRlcmVkJykge1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXM7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VmFsdWVzWzBdO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS12YXJpYWJsZWRlY2xhcmF0aW9uJzogUXRpVmFyaWFibGVEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEJhc2VUeXBlLCBDYXJkaW5hbGl0eSB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpTWFwcGluZyB9IGZyb20gJy4uLy4uL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXBwaW5nL3F0aS1tYXBwaW5nJztcbmltcG9ydCB7IFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZURlY2xhcmF0aW9uIGV4dGVuZHMgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGU7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgY2FyZGluYWxpdHk6IENhcmRpbmFsaXR5O1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGU6IFJlc3BvbnNlVmFyaWFibGUgPSB7XG4gICAgICBiYXNlVHlwZTogdGhpcy5iYXNlVHlwZSxcbiAgICAgIGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllcixcbiAgICAgIGNvcnJlY3RSZXNwb25zZTogdGhpcy5jb3JyZWN0UmVzcG9uc2UsXG4gICAgICBjYXJkaW5hbGl0eTogdGhpcy5jYXJkaW5hbGl0eSB8fCAnc2luZ2xlJyxcbiAgICAgIG1hcHBpbmc6IHRoaXMubWFwcGluZyxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcbiAgICAgIGNhbmRpZGF0ZVJlc3BvbnNlOiBudWxsXG4gICAgfTtcbiAgICByZXNwb25zZVZhcmlhYmxlLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWVzKHJlc3BvbnNlVmFyaWFibGUpO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItdmFyaWFibGUnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHsgdmFyaWFibGU6IHJlc3BvbnNlVmFyaWFibGUgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY29ycmVjdFJlc3BvbnNlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICBjb25zdCBjb3JyZWN0UmVzcG9uc2UgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1jb3JyZWN0LXJlc3BvbnNlJyk7XG4gICAgaWYgKGNvcnJlY3RSZXNwb25zZSkge1xuICAgICAgY29uc3QgdmFsdWVzID0gY29ycmVjdFJlc3BvbnNlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS12YWx1ZScpO1xuICAgICAgaWYgKHRoaXMuY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHZhbHVlc1swXS50ZXh0Q29udGVudDtcbiAgICAgICAgdmFsdWVzWzBdLnJlbW92ZSgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZXNbaV0udGV4dENvbnRlbnQpO1xuICAgICAgICAgIHZhbHVlc1tpXS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgbWFwcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktbWFwcGluZycpIGFzIFF0aU1hcHBpbmc7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uJzogUXRpUmVzcG9uc2VEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nKVxuZXhwb3J0IGNsYXNzIFF0aUNvbXBhbmlvbk1hdGVyaWFsc0luZm8gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgLy8gc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgLy8gICBzbG90IHtcbiAgLy8gICAgIGRpc3BsYXk6IGhpZGRlbjtcbiAgLy8gICB9XG4gIC8vIGA7XG4gIC8vIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgLy8gICByZXR1cm4gaHRtbGAgPHNsb3Q+PC9zbG90PiBgO1xuICAvLyB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jb21wYW5pb24tbWF0ZXJpYWxzLWluZm8nOiBRdGlDb21wYW5pb25NYXRlcmlhbHNJbmZvO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWNvbnRlbnQtYm9keScpXG5leHBvcnQgY2xhc3MgUXRpQ29udGVudEJvZHkgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY29udGVudC1ib2R5JzogUXRpQ29udGVudEJvZHk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJ1YnJpYy1ibG9jaycpXG5leHBvcnQgY2xhc3MgUXRpUnVicmljQmxvY2sgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIG92ZXJyaWRlIGlkOyAvLyA9XCJxdGlBc3BlY3RJbmhvdWRSdWJyaWNCbG9ja1wiXG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHVzZTogJ2luc3RydWN0aW9ucycgfCAnc2NvcmluZycgfCAnbmF2aWdhdGlvbic7IC8vICA9IFwic2NvcmluZ1wiXG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHZpZXc6ICdhdXRob3InIHwgJ2NhbmRpZGF0ZScgfCAncHJvY3RvcicgfCAnc2NvcmVyJyB8ICd0ZXN0Q29uc3RydWN0b3InIHwgJ3R1dG9yJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIGhhbmRsZWNsYXNzTmFtZXNDaGFuZ2Uob2xkLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSB0aGlzLmNsYXNzTmFtZXMuc3BsaXQoJyAnKTtcbiAgICBjbGFzc05hbWVzLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBzd2l0Y2ggKGNsYXNzTmFtZSkge1xuICAgICAgICBjYXNlICdxdGktcnVicmljLWRpc2NyZXRpb25hcnktcGxhY2VtZW50JzpcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktcnVicmljLWJsb2NrJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1ydWJyaWMtaW5saW5lJzpcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICcnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gYnkgZGVmYXVsdCBwdXQgdGhpcyBpbiBhIHNsb3QgaW4gdGhlIGl0ZW0tYm9keVxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1ydWJyaWMtYmxvY2snKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcnVicmljLWJsb2NrJzogUXRpUnVicmljQmxvY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBQcm9wZXJ0eVZhbHVlTWFwLCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1mZWVkYmFjay1ibG9jaycpXG5leHBvcnQgY2xhc3MgUXRpRmVlZGJhY2tCbG9jayBleHRlbmRzIFF0aUZlZWRiYWNrIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLm9uIHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAub2ZmIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCJmZWVkYmFjayAke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tTaG93RmVlZGJhY2sodGhpcy5vdXRjb21lSWRlbnRpZmllcik7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1mZWVkYmFjay1ibG9jayc6IFF0aUZlZWRiYWNrQmxvY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSXNOdWxsT3JVbmRlZmluZWQgfSBmcm9tICcuLi9pbnRlcm5hbC91dGlscyc7XG5pbXBvcnQgeyBpdGVtQ29udGV4dCwgSXRlbUNvbnRleHQgfSBmcm9tICcuLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdGlGZWVkYmFjayBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Nob3ctaGlkZScgfSlcbiAgcHJvdGVjdGVkIHNob3dIaWRlOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdvdXRjb21lLWlkZW50aWZpZXInIH0pXG4gIHB1YmxpYyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwcm90ZWN0ZWQgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiBmYWxzZSB9KVxuICBwdWJsaWMgc2hvd1N0YXR1czogc3RyaW5nO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9jb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFF0aUZlZWRiYWNrPigncXRpLXJlZ2lzdGVyLWZlZWRiYWNrJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2hlY2tTaG93RmVlZGJhY2sob3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZykgeyAgICBcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGUgPSB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBvdXRjb21lSWRlbnRpZmllcikgfHwgbnVsbDs7XG5cbiAgICBpZiAodGhpcy5vdXRjb21lSWRlbnRpZmllciAhPT0gb3V0Y29tZUlkZW50aWZpZXIgfHwgIW91dGNvbWVWYXJpYWJsZSkgcmV0dXJuO1xuICAgIGxldCBpc0ZvdW5kID0gZmFsc2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3V0Y29tZVZhcmlhYmxlLnZhbHVlKSkge1xuICAgICAgaXNGb3VuZCA9IG91dGNvbWVWYXJpYWJsZS52YWx1ZS5pbmNsdWRlcyh0aGlzLmlkZW50aWZpZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpc0ZvdW5kID1cbiAgICAgICAgKCFJc051bGxPclVuZGVmaW5lZCh0aGlzLmlkZW50aWZpZXIpICYmXG4gICAgICAgICAgIUlzTnVsbE9yVW5kZWZpbmVkKG91dGNvbWVWYXJpYWJsZT8udmFsdWUpICYmXG4gICAgICAgICAgdGhpcy5pZGVudGlmaWVyID09PSBvdXRjb21lVmFyaWFibGUudmFsdWUpIHx8XG4gICAgICAgIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0ZlZWRiYWNrKGlzRm91bmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93RmVlZGJhY2sodmFsdWU6IGJvb2xlYW4pIHsgICAgXG4gICAgdGhpcy5zaG93U3RhdHVzID0gKHZhbHVlICYmIHRoaXMuc2hvd0hpZGUgPT09ICdzaG93JykgfHwgKCF2YWx1ZSAmJiB0aGlzLnNob3dIaWRlID09PSAnaGlkZScpID8gJ29uJyA6ICdvZmYnOyAgICBcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBkZWNpbWFsU2VwYXJhdG9yID0gKCkgPT4ge1xuICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KCkuZm9ybWF0KDAuMSkucmVwbGFjZSgvXFxkL2csICcnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCA9IChudW1iZXI6IG51bWJlciB8IHN0cmluZykgPT4ge1xuICAvLyBjaGVjayBpZiB0eXBlIGlzIHN0cmluZ1xuICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVtYmVyO1xuICB9XG4gIGNvbnN0IGRTZXAgPSBkZWNpbWFsU2VwYXJhdG9yKCk7XG4gIGlmIChkU2VwID09PSAnLicpIHtcbiAgICByZXR1cm4gbnVtYmVyLnRvTG9jYWxlU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bWJlci50b1N0cmluZygpLnJlcGxhY2UoJy4nLCAnJykucmVwbGFjZShkU2VwLCAnLicpO1xuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gSXNOdWxsT3JVbmRlZmluZWQodmFsdWU6IHVua25vd24pIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEb3VibGVTbGFzaGVzKHN0cjogc3RyaW5nKSB7XG4gIGNvbnN0IHNpbmdsZUZvcndhcmRTbGFzaGVzID0gc3RyXG4gICAgLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgJyQxJylcbiAgICAucmVwbGFjZSgvXFwvXFwvL2csICcvJylcbiAgICAucmVwbGFjZSgnaHR0cDovJywgJ2h0dHA6Ly8nKVxuICAgIC5yZXBsYWNlKCdodHRwczovJywgJ2h0dHBzOi8vJyk7XG4gIHJldHVybiBzaW5nbGVGb3J3YXJkU2xhc2hlcztcbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1mZWVkYmFjay1pbmxpbmUnKVxuZXhwb3J0IGNsYXNzIFF0aUZlZWRiYWNrSW5saW5lIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCIke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1mZWVkYmFjay1pbmxpbmUnOiBRdGlGZWVkYmFja0lubGluZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2snO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1vZGFsLWZlZWRiYWNrJylcbmV4cG9ydCBjbGFzcyBRdGlNb2RhbEZlZWRiYWNrIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCIke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tb2RhbC1mZWVkYmFjayc6IFF0aU1vZGFsRmVlZGJhY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaWZEZWZpbmVkIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvaWYtZGVmaW5lZC5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpRXh0ZW5kZWRUZXh0SW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3Jvd3MgPSA1O1xuXG4gIC8qKiBleHBlY3RlZCBsZW5ndGggaXMgbWFwcGVkIHRvIHRoZSBwcm9wZXJ0eSBtYXhsZW5ndGggb24gdGhlIHRleHRhcmVhICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnZXhwZWN0ZWQtbGVuZ3RoJyB9KSBleHBlY3RlZExlbmd0aDogbnVtYmVyO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncGF0dGVybi1tYXNrJyB9KSBwYXR0ZXJuTWFzazogc3RyaW5nO1xuXG4gIC8qKiB0ZXh0IGFwcGVhcmluZyBpbiB0aGUgZXh0ZW5kZWQtdGV4dC1udGVyYWN0aW9uIGlmIGl0IGlzIGVtcHR5ICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncGxhY2Vob2xkZXItdGV4dCcgfSkgcGxhY2Vob2xkZXJUZXh0OiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLXBhdHRlcm5tYXNrLW1lc3NhZ2UnIH0pIGRhdGFQYXR0ZXJubWFza01lc3NhZ2U6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF92YWx1ZSA9ICcnO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY2xhc3MnIH0pIGNsYXNzTmFtZXM7XG4gIEB3YXRjaCgnY2xhc3NOYW1lcycpXG4gIGhhbmRsZWNsYXNzTmFtZXNDaGFuZ2Uob2xkLCBjbGFzc2VzOiBzdHJpbmcpIHtcbiAgICBjb25zdCBjbGFzc05hbWVzID0gY2xhc3Nlcy5zcGxpdCgnICcpO1xuICAgIGxldCByb3dzU2V0ID0gZmFsc2U7XG4gICAgY2xhc3NOYW1lcy5mb3JFYWNoKChjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGNsYXNzTmFtZS5zdGFydHNXaXRoKCdxdGktaGVpZ2h0LWxpbmVzLScpKSB7XG4gICAgICAgIGNvbnN0IG5yUm93cyA9IGNsYXNzTmFtZS5yZXBsYWNlKCdxdGktaGVpZ2h0LWxpbmVzLScsICcnKTtcbiAgICAgICAgdGhpcy5fcm93cyA9IHBhcnNlSW50KG5yUm93cyk7XG4gICAgICAgIHJvd3NTZXQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIElmIG5vIHF0aS1oZWlnaHQtbGluZXMgY2xhc3MgaXMgc2V0LCBjYWxjdWxhdGUgcm93cyBiYXNlZCBvbiBleHBlY3RlZExlbmd0aFxuICAgIGlmICghcm93c1NldCAmJiB0aGlzLmV4cGVjdGVkTGVuZ3RoKSB7XG4gICAgICBjb25zdCBlc3RpbWF0ZWRSb3dzID0gTWF0aC5jZWlsKHRoaXMuZXhwZWN0ZWRMZW5ndGggLyA1MCk7IC8vICAnNTAnIGJhc2VkIG9uIGFuIGVzdGltYXRlIGZvciBjaGFyYWN0ZXJzIHBlciByb3dcbiAgICAgIHRoaXMuX3Jvd3MgPSBlc3RpbWF0ZWRSb3dzO1xuICAgIH1cbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbDtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQodGhpcy5yZXNwb25zZUlkZW50aWZpZXIsIHZhbCk7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0Rm9ybVZhbHVlKGZvcm1EYXRhKTtcbiAgICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHZhbGlkYXRlKCkge1xuICAgIGNvbnN0IHRleHRhcmVhID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XG4gICAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHRoaXMucGF0dGVybk1hc2sgJiYgdGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKSB7XG4gICAgICAvLyBDbGVhciBhbnkgY3VzdG9tIGVycm9yIGluaXRpYWxseVxuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KHt9KTtcbiAgICAgIHRleHRhcmVhLnNldEN1c3RvbVZhbGlkaXR5KCcnKTtcbiAgICAgIGNvbnN0IHBhdHRlcm5Tb3VyY2UgPVxuICAgICAgICB0aGlzLnBhdHRlcm5NYXNrLnN0YXJ0c1dpdGgoJ14nKSAmJiB0aGlzLnBhdHRlcm5NYXNrLmVuZHNXaXRoKCckJykgPyB0aGlzLnBhdHRlcm5NYXNrIDogYF4ke3RoaXMucGF0dGVybk1hc2t9JGA7XG5cbiAgICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKHBhdHRlcm5Tb3VyY2UpO1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHRleHRhcmVhLmNoZWNrVmFsaWRpdHkoKSAmJiBwYXR0ZXJuLnRlc3QodGV4dGFyZWEudmFsdWUpO1xuXG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgLy8gU2V0IGN1c3RvbSBlcnJvciBpZiBpbnZhbGlkXG4gICAgICAgIHRoaXMuX2ludGVybmFscy5zZXRWYWxpZGl0eSh7IGN1c3RvbUVycm9yOiB0cnVlIH0sIHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSk7XG4gICAgICAgIHRleHRhcmVhLnNldEN1c3RvbVZhbGlkaXR5KHRoaXMuZGF0YVBhdHRlcm5tYXNrTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0ZXh0YXJlYS5jaGVja1ZhbGlkaXR5KCk7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoaXNWYWxpZCA/IHt9IDogeyBjdXN0b21FcnJvcjogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlICE9PSAnJyAmJiB0ZXh0YXJlYS5jaGVja1ZhbGlkaXR5KCk7XG4gIH1cblxuICBvdmVycmlkZSByZXBvcnRWYWxpZGl0eSgpIHtcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgIGlmICghdGV4dGFyZWEpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJ1biB0aGUgdmFsaWRhdGUgZnVuY3Rpb24gdG8gZW5zdXJlIHRoZSBjdXN0b20gdmFsaWRpdHkgc3RhdGUgaXMgdXAgdG8gZGF0ZVxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICB0ZXh0YXJlYS5yZXBvcnRWYWxpZGl0eSgpO1xuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZDtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBjc3NgXG4gICAgICAgIC8qIFBLOiBkaXNwbGF5IGhvc3QgYXMgYmxvY2ssIGVsc2UgZGVzaWduIHdpbGwgYmUgY29sbGFwc2VkICovXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuICAgICAgICB0ZXh0YXJlYSB7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgYm9yZGVyOiAwO1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90XG4gICAgICA+PHRleHRhcmVhXG4gICAgICAgIHBhcnQ9XCJ0ZXh0YXJlYVwiXG4gICAgICAgIG5hbWU9XCIke3RoaXMucmVzcG9uc2VJZGVudGlmaWVyfVwiXG4gICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIG1heGxlbmd0aD1cIiR7NTAwMH1cIlxuICAgICAgICBAa2V5ZG93bj1cIiR7ZXZlbnQgPT4gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9XCJcbiAgICAgICAgQGtleXVwPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBjaGFuZ2U9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgQGJsdXI9XCIkeyhldmVudDogRm9jdXNFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgfX1cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIiR7aWZEZWZpbmVkKHRoaXMucGxhY2Vob2xkZXJUZXh0ID8gdGhpcy5wbGFjZWhvbGRlclRleHQgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgIHJvd3M9XCIke3RoaXMuX3Jvd3N9XCJcbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiXG4gICAgICAgID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIlxuICAgICAgICAudmFsdWU9JHt0aGlzLl92YWx1ZX1cbiAgICAgID48L3RleHRhcmVhPmA7XG4gIH1cblxuICBwcm90ZWN0ZWQgdGV4dENoYW5nZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgdGhpcy5zZXRFbXB0eUF0dHJpYnV0ZShpbnB1dC52YWx1ZSk7XG4gICAgaWYgKHRoaXMuX3ZhbHVlICE9PSBpbnB1dC52YWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKGlucHV0LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEVtcHR5QXR0cmlidXRlKHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdlbXB0eScsIHRleHQgPT09ICcnID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24nOiBRdGlFeHRlbmRlZFRleHRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgSUludGVyYWN0aW9uIH0gZnJvbSAnLi9pbnRlcmFjdGlvbi5pbnRlcmZhY2UnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW50ZXJhY3Rpb24gZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgSUludGVyYWN0aW9uIHtcbiAgc3RhdGljIGZvcm1Bc3NvY2lhdGVkID0gdHJ1ZTsgLy8gRW5hYmxlIGZvcm0gYXNzb2NpYXRpb25cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KSByZXNwb25zZUlkZW50aWZpZXIgPSAnJztcbiAgLyoqIGRpc2FibGVkIHNob3VsZCBiZSBleHBvc2VkIHRvIHRoZSBhdHRyaWJ1dGVzIGFuZCBhY2Nlc3NpYmxlIGFzIHByb3BlcnR5ICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKiogcmVhZG9ubHkgc2hvdWxkIGJlIGV4cG9zZWQgdG8gdGhlIGF0dHJpYnV0ZXMgYW5kIGFjY2Vzc2libGUgYXMgcHJvcGVydHkgKi9cbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KSByZWFkb25seSA9IGZhbHNlO1xuXG4gIEBzdGF0ZSgpXG4gIHByb3RlY3RlZCBfY29ycmVjdFJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnO1xuICBwcm90ZWN0ZWQgX2ludGVybmFsczogRWxlbWVudEludGVybmFscztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2ludGVybmFscyA9IHRoaXMuYXR0YWNoSW50ZXJuYWxzKCk7XG4gIH1cblxuICBhYnN0cmFjdCB2YWxpZGF0ZSgpOiBib29sZWFuO1xuXG4gIHB1YmxpYyByZXBvcnRWYWxpZGl0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW50ZXJuYWxzLnJlcG9ydFZhbGlkaXR5KCk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9ICcnO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdO1xuICBhYnN0cmFjdCBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSk7XG5cbiAgcHVibGljIGdldCBjb3JyZWN0UmVzcG9uc2UoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9jb3JyZWN0UmVzcG9uc2U7XG4gIH1cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLl9jb3JyZWN0UmVzcG9uc2UgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItaW50ZXJhY3Rpb24nLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNhdmVSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbnRlcmFjdGlvbi1yZXNwb25zZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgIHJlc3BvbnNlOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDU1NSZXN1bHRHcm91cCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IGNyZWF0ZVJlZiB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlZi5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24uc3R5bGVzJztcbkBjdXN0b21FbGVtZW50KCdxdGktdGV4dC1lbnRyeS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpVGV4dEVudHJ5SW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnZXhwZWN0ZWQtbGVuZ3RoJyB9KSBleHBlY3RlZExlbmd0aDogbnVtYmVyO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncGF0dGVybi1tYXNrJyB9KSBwYXR0ZXJuTWFzazogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncGxhY2Vob2xkZXItdGV4dCcgfSkgcGxhY2Vob2xkZXJUZXh0OiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLXBhdHRlcm5tYXNrLW1lc3NhZ2UnIH0pIGRhdGFQYXR0ZXJubWFza01lc3NhZ2U6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF92YWx1ZSA9ICcnO1xuXG4gIGlucHV0UmVmID0gY3JlYXRlUmVmPEhUTUxJbnB1dEVsZW1lbnQ+KCk7XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCh0aGlzLnJlc3BvbnNlSWRlbnRpZmllciwgdmFsKTtcbiAgICAgIHRoaXMuX2ludGVybmFscy5zZXRGb3JtVmFsdWUoZm9ybURhdGEpO1xuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgdmFsaWRhdGUoKSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICBpZiAoIWlucHV0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMucGF0dGVybk1hc2sgJiYgdGhpcy5kYXRhUGF0dGVybm1hc2tNZXNzYWdlKSB7XG4gICAgICAvLyBDbGVhciBhbnkgY3VzdG9tIGVycm9yIGlmIHRoZSBpbnB1dCBpcyB2YWxpZFxuICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KHt9KTtcbiAgICAgIGlucHV0LnNldEN1c3RvbVZhbGlkaXR5KCcnKTsgLy8gQ2xlYXIgdGhlIGN1c3RvbSBtZXNzYWdlXG4gICAgICBjb25zdCBpc1ZhbGlkID0gaW5wdXQuY2hlY2tWYWxpZGl0eSgpO1xuICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgIC8vIFNldCBjdXN0b20gZXJyb3IgaWYgaW52YWxpZFxuICAgICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoeyBjdXN0b21FcnJvcjogdHJ1ZSB9LCB0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpO1xuICAgICAgICBpbnB1dC5zZXRDdXN0b21WYWxpZGl0eSh0aGlzLmRhdGFQYXR0ZXJubWFza01lc3NhZ2UpOyAvLyBTZXQgY3VzdG9tIG1lc3NhZ2Ugb25seSBpZiBpbnZhbGlkXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSBpbnB1dC5jaGVja1ZhbGlkaXR5KCk7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc2V0VmFsaWRpdHkoaXNWYWxpZCA/IHt9IDogeyBjdXN0b21FcnJvcjogZmFsc2UgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl92YWx1ZSAhPT0gJycgJiYgaW5wdXQuY2hlY2tWYWxpZGl0eSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYFxuICAgICAgPGlucHV0XG4gICAgICAgIHBhcnQ9XCJpbnB1dFwiXG4gICAgICAgIG5hbWU9XCIke3RoaXMucmVzcG9uc2VJZGVudGlmaWVyfVwiXG4gICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIEBibHVyPVwiJHsoZXZlbnQ6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICAgIH19XCJcbiAgICAgICAgQGtleWRvd249XCIke2V2ZW50ID0+IGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfVwiXG4gICAgICAgIEBrZXl1cD1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICBAY2hhbmdlPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIHR5cGU9XCIke3RoaXMucGF0dGVybk1hc2sgPT0gJ1swLTldKicgPyAnbnVtYmVyJyA6ICd0ZXh0J31cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIiR7aWZEZWZpbmVkKHRoaXMucGxhY2Vob2xkZXJUZXh0ID8gdGhpcy5wbGFjZWhvbGRlclRleHQgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgIC52YWx1ZT1cIiR7dGhpcy5fdmFsdWV9XCJcbiAgICAgICAgcGF0dGVybj1cIiR7aWZEZWZpbmVkKHRoaXMucGF0dGVybk1hc2sgPyB0aGlzLnBhdHRlcm5NYXNrIDogdW5kZWZpbmVkKX1cIlxuICAgICAgICBtYXhsZW5ndGg9JHsxMDAwfVxuICAgICAgICA/ZGlzYWJsZWQ9XCIke3RoaXMuZGlzYWJsZWR9XCJcbiAgICAgICAgP3JlYWRvbmx5PVwiJHt0aGlzLnJlYWRvbmx5fVwiXG4gICAgICAvPlxuICAgICAgPGRpdiBwYXJ0PVwiY29ycmVjdFwiPiR7dGhpcy5fY29ycmVjdFJlc3BvbnNlfTwvZGl2PlxuICAgIGA7XG4gIH1cbiAgcHJvdGVjdGVkIHRleHRDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMuc2V0RW1wdHlBdHRyaWJ1dGUoaW5wdXQudmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gaW5wdXQudmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBpbnB1dC52YWx1ZTtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZShpbnB1dC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVwb3J0VmFsaWRpdHkoKSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICBpZiAoIWlucHV0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSdW4gdGhlIHZhbGlkYXRlIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGUgY3VzdG9tIHZhbGlkaXR5IHN0YXRlIGlzIHVwIHRvIGRhdGVcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgaW5wdXQucmVwb3J0VmFsaWRpdHkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzVmFsaWQ7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl92YWx1ZSA9ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRFbXB0eUF0dHJpYnV0ZSh0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZW1wdHknLCB0ZXh0ID09PSAnJyA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJzogUXRpVGV4dEVudHJ5SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIDpob3N0IHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIH1cbiAgW3BhcnQ9J2NvcnJlY3QnXSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMSkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiAxLjFyZW07XG4gICAgbWluLXdpZHRoOiAxLjFyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTIpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMi4zcmVtO1xuICAgIG1pbi13aWR0aDogMi4zcmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0zKSBbcGFydD0naW5wdXQnXSB7XG4gICAgd2lkdGg6IDMuM3JlbTtcbiAgICBtaW4td2lkdGg6IDMuM3JlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA0LjJyZW07XG4gICAgbWluLXdpZHRoOiA0LjJyZW07XG4gIH1cblxuICA6aG9zdCgucXRpLWlucHV0LXdpZHRoLTYpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNi42cmVtO1xuICAgIG1pbi13aWR0aDogNi42cmVtO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1pbnB1dC13aWR0aC0xMCkgW3BhcnQ9J2lucHV0J10ge1xuICAgIHdpZHRoOiA4cmVtO1xuICAgIG1pbi13aWR0aDogOHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMTUpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMTJyZW07XG4gICAgbWluLXdpZHRoOiAxMnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMjApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMTdyZW07XG4gICAgbWluLXdpZHRoOiAxN3JlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMjUpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMjByZW07XG4gICAgbWluLXdpZHRoOiAyMHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMzApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMjRyZW07XG4gICAgbWluLXdpZHRoOiAyNHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtMzUpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMjhyZW07XG4gICAgbWluLXdpZHRoOiAyOHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNDApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMzJyZW07XG4gICAgbWluLXdpZHRoOiAzMnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNDUpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogMzZyZW07XG4gICAgbWluLXdpZHRoOiAzNnJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNTApIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNDByZW07XG4gICAgbWluLXdpZHRoOiA0MHJlbTtcbiAgfVxuXG4gIDpob3N0KC5xdGktaW5wdXQtd2lkdGgtNzIpIFtwYXJ0PSdpbnB1dCddIHtcbiAgICB3aWR0aDogNTdyZW07XG4gICAgbWluLXdpZHRoOiA1N3JlbTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90dGV4dC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpSG90dGV4dEludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLWhvdHRleHQnKSB7XG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJywgJycpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nOiBRdGlIb3R0ZXh0SW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSwgcXVlcnkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuXG5pbXBvcnQgeyBDaG9pY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IElJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLmludGVyZmFjZSc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmV4cG9ydCB0eXBlIENob2ljZSA9IEhUTUxFbGVtZW50ICYgQ2hvaWNlSW50ZXJmYWNlICYgeyBpbnRlcm5hbHM6IEVsZW1lbnRJbnRlcm5hbHMgfTtcblxuZXhwb3J0IGludGVyZmFjZSBDaG9pY2VzSW50ZXJmYWNlIGV4dGVuZHMgSUludGVyYWN0aW9uIHtcbiAgX2Nob2ljZUVsZW1lbnRzOiBBcnJheTxDaG9pY2U+O1xuICBjb3JyZWN0UmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgQ2hvaWNlc01peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KHN1cGVyQ2xhc3M6IFQsIHNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgQ2hvaWNlc01peGluRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3MgaW1wbGVtZW50cyBDaG9pY2VzSW50ZXJmYWNlIHtcbiAgICBwdWJsaWMgX2Nob2ljZUVsZW1lbnRzOiBDaG9pY2VbXSA9IFtdO1xuXG4gICAgQHF1ZXJ5KCcjdmFsaWRhdGlvbk1lc3NhZ2UnKVxuICAgIHByaXZhdGUgX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudCE6IEhUTUxFbGVtZW50O1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdtaW4tY2hvaWNlcycgfSlcbiAgICBwdWJsaWMgbWluQ2hvaWNlcyA9IDA7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ21heC1jaG9pY2VzJyB9KVxuICAgIHB1YmxpYyBtYXhDaG9pY2VzID0gMTtcblxuICAgIEB3YXRjaCgnbWF4Q2hvaWNlcycsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgICBfaGFuZGxlTWF4Q2hvaWNlc0NoYW5nZShfb2xkVmFsdWU6IG51bWJlciwgX25ld1ZhbHVlOiBudW1iZXIpIHtcbiAgICAgIHRoaXMuX2RldGVybWluZUlucHV0VHlwZSgpO1xuICAgIH1cblxuICAgIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgX2hhbmRsZURpc2FibGVkQ2hhbmdlID0gKF86IGJvb2xlYW4sIGRpc2FibGVkOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5kaXNhYmxlZCA9IGRpc2FibGVkKSk7XG4gICAgfTtcblxuICAgIEB3YXRjaCgncmVhZG9ubHknLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gICAgX2hhbmRsZVJlYWRvbmx5Q2hhbmdlID0gKF86IGJvb2xlYW4sIHJlYWRvbmx5OiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiAoY2hvaWNlLnJlYWRvbmx5ID0gcmVhZG9ubHkpKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdID0gJyc7XG5cbiAgICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpID8gdGhpcy5fdmFsdWUuam9pbignLCcpIDogdGhpcy5fdmFsdWU7XG4gICAgfVxuXG4gICAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgIGlmICh0aGlzLm1heENob2ljZXMgPiAxICYmIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsLnNwbGl0KCcsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbDtcbiAgICAgIH1cbiAgICAgIC8vIEFzc3VtaW5nIHRoaXMudmFsdWUgaXMgYW4gYXJyYXkgb2Ygc3RyaW5nc1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIHRoaXMuX3ZhbHVlLmZvckVhY2gocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCh0aGlzLnJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldEZvcm1WYWx1ZShmb3JtRGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhpcy52YWx1ZSBpcyBub3QgYW4gYXJyYXlcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldEZvcm1WYWx1ZSh0aGlzLl92YWx1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLl91cGRhdGVDaG9pY2VTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvcnJlY3RSZXNwb25zZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29ycmVjdFJlc3BvbnNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgdGhpcy5fY29ycmVjdFJlc3BvbnNlID0gdmFsdWU7XG4gICAgICBjb25zdCByZXNwb25zZUFycmF5ID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNob2ljZSA9PiB7XG4gICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJ2luY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgICBpZiAocmVzcG9uc2VBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlQXJyYXkuaW5jbHVkZXMoY2hvaWNlLmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLnN0YXRlcy5hZGQoJ2NvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuYWRkKCdpbmNvcnJlY3QtcmVzcG9uc2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihgcmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl9yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGB1bnJlZ2lzdGVyLSR7c2VsZWN0b3J9YCwgdGhpcy5fdW5yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGBhY3RpdmF0ZS0ke3NlbGVjdG9yfWAsIHRoaXMuX2Nob2ljZUVsZW1lbnRTZWxlY3RlZEhhbmRsZXIpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihgcmVnaXN0ZXItJHtzZWxlY3Rvcn1gLCB0aGlzLl9yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGB1bnJlZ2lzdGVyLSR7c2VsZWN0b3J9YCwgdGhpcy5fdW5yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGBhY3RpdmF0ZS0ke3NlbGVjdG9yfWAsIHRoaXMuX2Nob2ljZUVsZW1lbnRTZWxlY3RlZEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ2hvaWNlcyA9IHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZpbHRlcihjaG9pY2UgPT4gdGhpcy5fZ2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UpKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkQ291bnQgPSBzZWxlY3RlZENob2ljZXMubGVuZ3RoO1xuICAgICAgbGV0IGlzVmFsaWQgPSB0cnVlO1xuICAgICAgbGV0IHZhbGlkaXR5TWVzc2FnZSA9ICcnO1xuICAgICAgaWYgKHRoaXMubWF4Q2hvaWNlcyAhPT0gMCAmJiBzZWxlY3RlZENvdW50ID4gdGhpcy5tYXhDaG9pY2VzKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgdmFsaWRpdHlNZXNzYWdlID0gdGhpcy5kYXRhc2V0Lm1heFNlbGVjdGlvbnNNZXNzYWdlIHx8IGBZb3UgY2FuIHNlbGVjdCBhdCBtb3N0ICR7dGhpcy5tYXhDaG9pY2VzfSBjaG9pY2VzLmA7XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkQ291bnQgPCB0aGlzLm1pbkNob2ljZXMpIHtcbiAgICAgICAgaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB2YWxpZGl0eU1lc3NhZ2UgPSB0aGlzLmRhdGFzZXQubWluU2VsZWN0aW9uc01lc3NhZ2UgfHwgYFlvdSBtdXN0IHNlbGVjdCBhdCBsZWFzdCAke3RoaXMubWluQ2hvaWNlc30gY2hvaWNlcy5gO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsZWN0ZWRDaG9pY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzLnNldFZhbGlkaXR5KFxuICAgICAgICAgIGlzVmFsaWQgPyB7fSA6IHsgY3VzdG9tRXJyb3I6IHRydWUgfSxcbiAgICAgICAgICB2YWxpZGl0eU1lc3NhZ2UsXG4gICAgICAgICAgc2VsZWN0ZWRDaG9pY2VzW3NlbGVjdGVkQ291bnQgLSAxXSB8fCB0aGlzLl9jaG9pY2VFbGVtZW50c1swXSB8fCB0aGlzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICByZXR1cm4gaXNWYWxpZDtcbiAgICB9XG5cbiAgICBvdmVycmlkZSByZXBvcnRWYWxpZGl0eSgpIHtcbiAgICAgIGlmICh0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbnRlcm5hbHMudmFsaWRpdHkudmFsaWQpIHtcbiAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uTWVzc2FnZUVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLl9pbnRlcm5hbHMudmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgICAgICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2VFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5faW50ZXJuYWxzLnZhbGlkaXR5LnZhbGlkO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlZ2lzdGVyQ2hvaWNlRWxlbWVudChldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgY29uc3QgY2hvaWNlRWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBDaG9pY2U7XG4gICAgICBjaG9pY2VFbGVtZW50LmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDtcblxuXG4gICAgICBcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLnB1c2goY2hvaWNlRWxlbWVudCk7XG4gICAgICB0aGlzLl9zZXRJbnB1dFR5cGUoY2hvaWNlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdW5yZWdpc3RlckNob2ljZUVsZW1lbnQoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGNob2ljZUVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgQ2hvaWNlO1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maWx0ZXIoY2hvaWNlID0+IGNob2ljZSAhPT0gY2hvaWNlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGV0ZXJtaW5lSW5wdXRUeXBlKCkge1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4ge1xuICAgICAgICB0aGlzLl9zZXRJbnB1dFR5cGUoY2hvaWNlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldElucHV0VHlwZShjaG9pY2VFbGVtZW50OiBDaG9pY2UpIHtcbiAgICAgIC8vIGNob2ljZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgdGhpcy5tYXhDaG9pY2VzID09PSAxID8gJ3JhZGlvJyA6ICdjaGVja2JveCcpO1xuICAgICAgY2hvaWNlRWxlbWVudC5pbnRlcm5hbHMucm9sZSA9IHRoaXMubWF4Q2hvaWNlcyA9PT0gMSA/ICdyYWRpbycgOiAnY2hlY2tib3gnO1xuICAgICAgY2hvaWNlRWxlbWVudC5pbnRlcm5hbHMuc3RhdGVzLmFkZChjaG9pY2VFbGVtZW50LmludGVybmFscy5yb2xlKVxuICAgICAgLy8gY2hvaWNlRWxlbWVudC5pbnRlcm5hbHMuYXJpYUNoZWNrZWQgPSAnZmFsc2UnO1xuICAgICAgLy8gY2hvaWNlRWxlbWVudC5hcmlhUmVhZE9ubHkgPSB0aGlzLnJlYWRvbmx5ID09IHRydWUgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcihldmVudDogQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmcgfT4pIHtcbiAgICAgIHRoaXMuX3RvZ2dsZUNob2ljZUNoZWNrZWQoZXZlbnQudGFyZ2V0IGFzIENob2ljZSk7XG4gICAgICBpZiAodGhpcy5tYXhDaG9pY2VzID09PSAxKSB7XG4gICAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlID0+IHtcbiAgICAgICAgICBpZiAoY2hvaWNlLmlkZW50aWZpZXIgIT09IGV2ZW50LmRldGFpbC5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRDaG9pY2VDaGVja2VkKGNob2ljZSwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9oYW5kbGVDaG9pY2VTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRDaG9pY2VDaGVja2VkKGNob2ljZTogQ2hvaWNlLCBjaGVja2VkOiBib29sZWFuKSB7XG4gICAgICBpZiAoY2hvaWNlLmludGVybmFscz8uc3RhdGVzKSB7XG4gICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgY2hvaWNlLmludGVybmFscy5zdGF0ZXMuYWRkKCctLWNoZWNrZWQnKTtcbiAgICAgICAgICBjaG9pY2UuaW50ZXJuYWxzLmFyaWFDaGVja2VkID0gJ3RydWUnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNob2ljZS5pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnLS1jaGVja2VkJyk7XG4gICAgICAgICAgY2hvaWNlLmludGVybmFscy5hcmlhQ2hlY2tlZCA9ICdmYWxzZSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRDaG9pY2VDaGVja2VkKGNob2ljZTogQ2hvaWNlKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gY2hvaWNlLmludGVybmFscy5zdGF0ZXMuaGFzKCctLWNoZWNrZWQnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF90b2dnbGVDaG9pY2VDaGVja2VkKGNob2ljZTogQ2hvaWNlKSB7XG4gICAgICBjb25zdCBjaGVja2VkID0gdGhpcy5fZ2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UpO1xuICAgICAgdGhpcy5fc2V0Q2hvaWNlQ2hlY2tlZChjaG9pY2UsICFjaGVja2VkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVDaG9pY2VTZWxlY3Rpb24oKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZENob2ljZXMgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maWx0ZXIoY2hvaWNlID0+IHRoaXMuX2dldENob2ljZUNoZWNrZWQoY2hvaWNlKSk7XG4gICAgICBjb25zdCBzZWxlY3RlZElkZW50aWZpZXJzID0gc2VsZWN0ZWRDaG9pY2VzLm1hcChjaG9pY2UgPT4gY2hvaWNlLmlkZW50aWZpZXIpO1xuXG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy5tYXhDaG9pY2VzID09PSAxID8gc2VsZWN0ZWRJZGVudGlmaWVyc1swXSB8fCAnJyA6IHNlbGVjdGVkSWRlbnRpZmllcnM7XG4gICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl92YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIGVhY2ggY2hvaWNlIGVsZW1lbnQgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVzcG9uc2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfdXBkYXRlQ2hvaWNlU2VsZWN0aW9uKCkge1xuICAgICAgY29uc3QgcmVzcG9uc2VBcnJheSA9IEFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpID8gdGhpcy5fdmFsdWUgOiBbdGhpcy5fdmFsdWVdO1xuICAgICAgdGhpcy5fY2hvaWNlRWxlbWVudHMuZm9yRWFjaChjaG9pY2UgPT4ge1xuICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gcmVzcG9uc2VBcnJheS5pbmNsdWRlcyhjaG9pY2UuaWRlbnRpZmllcik7XG4gICAgICAgIHRoaXMuX3NldENob2ljZUNoZWNrZWQoY2hvaWNlLCBpc1NlbGVjdGVkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gQ2hvaWNlc01peGluRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxDaG9pY2VzSW50ZXJmYWNlPiAmIFQ7XG59O1xuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbmludGVyZmFjZSBPcHRpb25UeXBlIHtcbiAgdGV4dENvbnRlbnQ6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XG59XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpSW5saW5lQ2hvaWNlSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgIH1cbiAgICAgICAgc2xvdCB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICB9XG4gICAgICAgIFtyb2xlPSdtZW51J10ge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICB6LWluZGV4OiAxMDAwO1xuICAgICAgICB9XG4gICAgICAgIC5hbmNob3Ige1xuICAgICAgICAgIC8qIGFuY2hvci1uYW1lOiAtLWluZm9ib3g7ICovXG4gICAgICAgICAgd2lkdGg6IGZpdC1jb250ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLnBvc2l0aW9uZWRFbGVtZW50IHtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgLyogcG9zaXRpb24tYW5jaG9yOiAtLWluZm9ib3g7ICovXG4gICAgICAgICAgLyogdG9wOiBhbmNob3IoYm90dG9tKTsgKi9cbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlucHV0V2lkdGhDbGFzcyA9IFtcbiAgICAnJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTInLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMScsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0zJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTQnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtNicsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xMCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0xNScsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0yMCcsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC03MidcbiAgXTtcblxuICBAc3RhdGUoKSBvcHRpb25zOiBPcHRpb25UeXBlW10gPSBbXTtcblxuICBAc3RhdGUoKSBjb3JyZWN0T3B0aW9uOiBzdHJpbmcgPSAnJztcblxuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdkYXRhLXByb21wdCcsIHR5cGU6IFN0cmluZyB9KVxuICBkYXRhUHJvbXB0OiBzdHJpbmcgPSAnc2VsZWN0JztcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2VsZWN0IHBhcnQ9XCJzZWxlY3RcIiBAY2hhbmdlPVwiJHt0aGlzLmNob2ljZVNlbGVjdGVkfVwiID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIiA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCI+XG4gICAgICAgICR7dGhpcy5vcHRpb25zLm1hcChcbiAgICAgICAgICBvcHRpb24gPT4gaHRtbGBcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIke29wdGlvbi52YWx1ZX1cIiA/c2VsZWN0ZWQ9XCIke29wdGlvbi5zZWxlY3RlZH1cIj4ke3Vuc2FmZUhUTUwob3B0aW9uLnRleHRDb250ZW50KX08L29wdGlvbj5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICA8L3NlbGVjdD5cblxuICAgICAgJHt1bnNhZmVIVE1MKHRoaXMuY29ycmVjdE9wdGlvbil9XG4gICAgYDtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdvbi1kcm9wZG93bi1zZWxlY3RlZCcsIHRoaXMuY2hvaWNlU2VsZWN0ZWQpO1xuICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWlubGluZS1jaG9pY2UnKSk7XG4gICAgdGhpcy5vcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICB0ZXh0Q29udGVudDogdGhpcy5kYXRhUHJvbXB0LFxuICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIC4uLmNob2ljZXMubWFwKGNob2ljZSA9PiAoe1xuICAgICAgICB0ZXh0Q29udGVudDogY2hvaWNlLmlubmVySFRNTCxcbiAgICAgICAgdmFsdWU6IGNob2ljZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICB9KSlcbiAgICBdO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdvbi1kcm9wZG93bi1zZWxlY3RlZCcsIHRoaXMuY2hvaWNlU2VsZWN0ZWQpO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCk7XG4gICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9uID8gc2VsZWN0ZWRPcHRpb24udmFsdWUgIT09ICcnIDogZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcCgob3B0aW9uLCBpKSA9PiAoeyAuLi5vcHRpb24sIHNlbGVjdGVkOiBpID09PSAwIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gb3B0aW9uLnZhbHVlKSB7XG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0aW9uO1xuICAgIH0pO1xuICB9XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZChvcHRpb24gPT4gb3B0aW9uLnNlbGVjdGVkKS52YWx1ZTtcbiAgfVxuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9uID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29ycmVjdE9wdGlvbiA9IGA8c3BhbiBwYXJ0PVwiY29ycmVjdC1vcHRpb25cIj4ke1xuICAgICAgdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IHZhbHVlID09PSBvcHRpb24udmFsdWUpLnRleHRDb250ZW50XG4gICAgfTwvc3Bhbj5gO1xuICB9XG5cbiAgcHVibGljIGNob2ljZVNlbGVjdGVkKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uVmFsdWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS52YWx1ZTtcbiAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLm9wdGlvbnMubWFwKG9wdGlvbiA9PiAoeyAuLi5vcHRpb24sIHNlbGVjdGVkOiBvcHRpb24udmFsdWUgPT09IHNlbGVjdGVkT3B0aW9uVmFsdWUgfSkpO1xuICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHNlbGVjdGVkT3B0aW9uVmFsdWUpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJzogUXRpSW5saW5lQ2hvaWNlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBDaG9pY2VzSW50ZXJmYWNlLCBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgU2h1ZmZsZU1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvc2h1ZmZsZS9zaHVmZmxlLW1peGluJztcbmltcG9ydCB7IFZvY2FidWxhcnlNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL3ZvY2FidWxhcnkvdm9jYWJ1bGFyeS1taXhpbic7XG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi5zdHlsZXMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlDaG9pY2VJbnRlcmFjdGlvblxuICBleHRlbmRzIFZvY2FidWxhcnlNaXhpbihcbiAgICBTaHVmZmxlTWl4aW4oQ2hvaWNlc01peGluKEludGVyYWN0aW9uLCAncXRpLXNpbXBsZS1jaG9pY2UnKSwgJ3F0aS1zaW1wbGUtY2hvaWNlJyksXG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJ1xuICApXG4gIGltcGxlbWVudHMgQ2hvaWNlc0ludGVyZmFjZVxue1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+PHNsb3QgcGFydD1cInNsb3RcIj48L3Nsb3Q+XG4gICAgICA8ZGl2IHJvbGU9XCJhbGVydFwiIGlkPVwidmFsaWRhdGlvbk1lc3NhZ2VcIj48L2Rpdj5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24nOiBRdGlDaG9pY2VJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgIi8qKlxuICogTWl4aW4gdGhhdCBwcm92aWRlcyBzaHVmZmxpbmcgZnVuY3Rpb25hbGl0eSBmb3IgYSBMaXRFbGVtZW50LlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgTGl0RWxlbWVudCBzdWJjbGFzcy5cbiAqIEBwYXJhbSB7VH0gc3VwZXJDbGFzcyAtIFRoZSBzdXBlcmNsYXNzIHRvIGV4dGVuZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFRoZSBDU1Mgc2VsZWN0b3IgZm9yIHRoZSBlbGVtZW50cyB0byBzaHVmZmxlLlxuICogQHJldHVybnMge0NvbnN0cnVjdG9yPFNodWZmbGVJbnRlcmZhY2U+ICYgVH0gLSBUaGUgZXh0ZW5kZWQgY2xhc3Mgd2l0aCBzaHVmZmxpbmcgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBhZGRzIGEgc2h1ZmZsZSBwcm9wZXJ0eSB0byB0aGUgY2xhc3Mgd2l0aCBhbiBhdHRyaWJ1dGUgY29udmVydGVyXG4gKlxuICogcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqIHF0aS1jaG9pY2UtaW50ZXJhY3Rpb25cbiAqIHF0aS1tYXRjaC1pbnRlcmFjdGlvblxuICovXG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmRlY2xhcmUgY2xhc3MgU2h1ZmZsZUludGVyZmFjZSB7fVxuZXhwb3J0IGNvbnN0IFNodWZmbGVNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihzdXBlckNsYXNzOiBULCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFNodWZmbGVFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgcHJpdmF0ZSBfc2h1ZmZsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gRGVmaW5lIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBjdXN0b20gY29udmVydGVyXG4gICAgQHByb3BlcnR5KHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIHJlZmxlY3Q6IHRydWUsXG4gICAgICBjb252ZXJ0ZXI6IHN0cmluZ1RvQm9vbGVhbkNvbnZlcnRlclxuICAgIH0pXG4gICAgc2V0IHNodWZmbGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fc2h1ZmZsZTtcbiAgICAgIHRoaXMuX3NodWZmbGUgPSB2YWx1ZTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9zaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVzZXRTaHVmZmxlQ2hvaWNlcygpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCdzaHVmZmxlJywgb2xkVmFsdWUpO1xuICAgIH1cblxuICAgIGdldCBzaHVmZmxlKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3NodWZmbGU7XG4gICAgfVxuXG4gICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgLy8gQ2FsbCBfcmVzZXRTaHVmZmxlQ2hvaWNlcyBpbml0aWFsbHkgdG8gc2V0IHRoZSBDU1Mgb3JkZXIgdG8gaW5pdGlhbC5cbiAgICAgIC8vIElmIHNodWZmbGUgaXMgdHJ1ZSwgX3NodWZmbGVDaG9pY2VzIHdpbGwgYmUgY2FsbGVkIGF1dG9tYXRpY2FsbHkgdmlhIHRoZSBzZXR0ZXIuXG4gICAgICBpZiAodGhpcy5zaHVmZmxlKSB7XG4gICAgICAgIHRoaXMuX3NodWZmbGVDaG9pY2VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXNldFNodWZmbGVDaG9pY2VzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2h1ZmZsZUNob2ljZXMoKSB7XG4gICAgICBjb25zdCBjaG9pY2VzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KHNlbGVjdG9yKSk7XG4gICAgICBjb25zdCBmaXhlZEVsZW1lbnRzOiBBcnJheTx7IGVsZW1lbnQ6IEhUTUxFbGVtZW50OyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgICBjb25zdCBub25GaXhlZEVsZW1lbnRzOiBBcnJheTxIVE1MRWxlbWVudD4gPSBbXTtcblxuICAgICAgLy8gU2VwYXJhdGUgZml4ZWQgYW5kIG5vbi1maXhlZCBlbGVtZW50c1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChjaG9pY2UuaGFzQXR0cmlidXRlKCdmaXhlZCcpKSB7XG4gICAgICAgICAgZml4ZWRFbGVtZW50cy5wdXNoKHsgZWxlbWVudDogY2hvaWNlLCBpbmRleDogaW5kZXggfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9uRml4ZWRFbGVtZW50cy5wdXNoKGNob2ljZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgMSBvciBmZXdlciBub24tZml4ZWQgZWxlbWVudHMsIHRocm93IGFuIGVycm9yIChubyBzaHVmZmxlIHBvc3NpYmxlKVxuICAgICAgaWYgKG5vbkZpeGVkRWxlbWVudHMubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTaHVmZmxpbmcgaXMgbm90IHBvc3NpYmxlIHdpdGggZmV3ZXIgdGhhbiAyIG5vbi1maXhlZCBlbGVtZW50cy4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgaXNTaHVmZmxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgbWF4QXR0ZW1wdHMgPSAxMDsgLy8gTWF4IGF0dGVtcHRzIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHNcbiAgICAgIGxldCBhdHRlbXB0ID0gMDtcblxuICAgICAgLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgb3JkZXIgZm9yIGNvbXBhcmlzb25cbiAgICAgIGNvbnN0IG9yaWdpbmFsT3JkZXIgPSBbLi4ubm9uRml4ZWRFbGVtZW50c107XG5cbiAgICAgIC8vIFNodWZmbGUgdW50aWwgdGhlIHJlc3VsdCBpcyBkaWZmZXJlbnQgb3IgbWF4QXR0ZW1wdHMgaXMgcmVhY2hlZFxuICAgICAgd2hpbGUgKCFpc1NodWZmbGVkICYmIGF0dGVtcHQgPCBtYXhBdHRlbXB0cykge1xuICAgICAgICBhdHRlbXB0Kys7XG5cbiAgICAgICAgLy8gU2h1ZmZsZSBub24tZml4ZWQgZWxlbWVudHNcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vbkZpeGVkRWxlbWVudHMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgIGNvbnN0IGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTtcbiAgICAgICAgICBbbm9uRml4ZWRFbGVtZW50c1tpXSwgbm9uRml4ZWRFbGVtZW50c1tqXV0gPSBbbm9uRml4ZWRFbGVtZW50c1tqXSwgbm9uRml4ZWRFbGVtZW50c1tpXV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2h1ZmZsZWQgcmVzdWx0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBvcmRlclxuICAgICAgICBpc1NodWZmbGVkID0gIW5vbkZpeGVkRWxlbWVudHMuZXZlcnkoKGNob2ljZSwgaW5kZXgpID0+IGNob2ljZSA9PT0gb3JpZ2luYWxPcmRlcltpbmRleF0pO1xuXG4gICAgICAgIGlmIChpc1NodWZmbGVkKSBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc1NodWZmbGVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNodWZmbGUgdGhlIGNob2ljZXMgYWZ0ZXIgbXVsdGlwbGUgYXR0ZW1wdHMuJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFzc2lnbiBvcmRlciB0byBlYWNoIGVsZW1lbnRcbiAgICAgIGxldCBvcmRlciA9IDE7XG4gICAgICBjaG9pY2VzLmZvckVhY2goKGNob2ljZTogSFRNTEVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChjaG9pY2UuaGFzQXR0cmlidXRlKCdmaXhlZCcpKSB7XG4gICAgICAgICAgY2hvaWNlLnN0eWxlLnNldFByb3BlcnR5KCdvcmRlcicsIFN0cmluZyhvcmRlcisrKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgbm9uRml4ZWRDaG9pY2UgPSBub25GaXhlZEVsZW1lbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgbm9uRml4ZWRDaG9pY2UhLnN0eWxlLnNldFByb3BlcnR5KCdvcmRlcicsIFN0cmluZyhvcmRlcisrKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc2V0U2h1ZmZsZUNob2ljZXMoKSB7XG4gICAgICBjb25zdCBjaG9pY2VzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgICAgY2hvaWNlcy5mb3JFYWNoKChjaG9pY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNob2ljZS5zdHlsZS5zZXRQcm9wZXJ0eSgnb3JkZXInLCAnaW5pdGlhbCcpOyAvLyBjaG9pY2Uuc3R5bGUub3JkZXIgPSAnaW5pdGlhbCc7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFNodWZmbGVFbGVtZW50IGFzIENvbnN0cnVjdG9yPFNodWZmbGVJbnRlcmZhY2U+ICYgVDtcbn07XG5cbmNvbnN0IHN0cmluZ1RvQm9vbGVhbkNvbnZlcnRlciA9IHtcbiAgZnJvbUF0dHJpYnV0ZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICB9LFxuICB0b0F0dHJpYnV0ZSh2YWx1ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgfVxufTtcbiIsICIvKipcbiAqIE1peGluIHRoYXQgcHJvdmlkZXMgc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIGEgTGl0RWxlbWVudC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIExpdEVsZW1lbnQgc3ViY2xhc3MuXG4gKiBAcGFyYW0ge1R9IHN1cGVyQ2xhc3MgLSBUaGUgc3VwZXJjbGFzcyB0byBleHRlbmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgLSBUaGUgQ1NTIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudHMgdG8gc2h1ZmZsZS5cbiAqIEByZXR1cm5zIHtDb25zdHJ1Y3RvcjxTaHVmZmxlSW50ZXJmYWNlPiAmIFR9IC0gVGhlIGV4dGVuZGVkIGNsYXNzIHdpdGggc2h1ZmZsaW5nIGZ1bmN0aW9uYWxpdHkuXG4gKlxuICogYWRkcyBhIHNodWZmbGUgcHJvcGVydHkgdG8gdGhlIGNsYXNzIHdpdGggYW4gYXR0cmlidXRlIGNvbnZlcnRlclxuICpcbiAqIHF0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKiBxdGktbWF0Y2gtaW50ZXJhY3Rpb25cbiAqL1xuaW1wb3J0IHsgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlTaW1wbGVDaG9pY2UgfSBmcm9tICcuLi8uLi9xdGktc2ltcGxlLWNob2ljZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxudHlwZSBMYWJlbFR5cGUgPSAncXRpLWxhYmVscy1kZWNpbWFsJyB8ICdxdGktbGFiZWxzLWxvd2VyLWFscGhhJyB8ICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJztcbnR5cGUgTGFiZWxTdWZmaXhUeXBlID0gJ3F0aS1sYWJlbHMtc3VmZml4LXBlcmlvZCcgfCAncXRpLWxhYmVscy1zdWZmaXgtcGFyZW50aGVzaXMnO1xuXG5kZWNsYXJlIGNsYXNzIFZvY2FidWxhcnlJbnRlcmZhY2Uge31cblxuZXhwb3J0IGNvbnN0IFZvY2FidWxhcnlNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihzdXBlckNsYXNzOiBULCBzZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIFZvY2FidWxhcnlFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgcHJpdmF0ZSBfY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgICBwcml2YXRlIF9hbGxMYWJlbHMgPSBbJ3F0aS1sYWJlbHMtZGVjaW1hbCcsICdxdGktbGFiZWxzLWxvd2VyLWFscGhhJywgJ3F0aS1sYWJlbHMtdXBwZXItYWxwaGEnXTtcbiAgICBwcml2YXRlIF9hbGxMYWJlbFN1ZmZpeGVzID0gWydxdGktbGFiZWxzLXN1ZmZpeC1wZXJpb2QnLCAncXRpLWxhYmVscy1zdWZmaXgtcGFyZW50aGVzaXMnXSBhcyBMYWJlbFN1ZmZpeFR5cGVbXTtcbiAgICAvLyBEZWZpbmUgdGhlIHByb3BlcnR5IHdpdGggdGhlIGN1c3RvbSBjb252ZXJ0ZXJcbiAgICBAcHJvcGVydHkoe1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVmbGVjdDogdHJ1ZVxuICAgIH0pXG4gICAgc2V0IGNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9jbGFzc2VzLmpvaW4oJyAnKTtcbiAgICAgIHRoaXMuX2NsYXNzZXMgPSB2YWx1ZS5zcGxpdCgnICcpO1xuXG4gICAgICB0aGlzLl9hZGRMYWJlbHMoKTtcbiAgICAgIC8vIHRoaXMucmVxdWVzdFVwZGF0ZSgnY2xhc3MnLCBvbGRWYWx1ZSk7XG4gICAgfVxuICAgIGdldCBjbGFzcygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX2NsYXNzZXM/LmpvaW4oJyAnKSB8fCAnJztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVzKTogdm9pZCB7XG4gICAgICBzdXBlci51cGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllcyk7XG4gICAgICBpZiAoX2NoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2h1ZmZsZScpKSB7XG4gICAgICAgIHRoaXMuX2FkZExhYmVscygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2FkZExhYmVscygpIHtcbiAgICAgIGNvbnN0IGNsYXNzQ29udGFpbnNMYWJlbCA9IHRoaXMuX2NsYXNzZXMuc29tZShcbiAgICAgICAgY2xzID0+IHRoaXMuX2FsbExhYmVscy5pbmNsdWRlcyhjbHMpIHx8IHRoaXMuX2FsbExhYmVsU3VmZml4ZXMuaW5jbHVkZXMoY2xzIGFzIExhYmVsU3VmZml4VHlwZSlcbiAgICAgICk7XG4gICAgICBjb25zdCBpc051bWJlciA9IHZhbHVlID0+IHtcbiAgICAgICAgcmV0dXJuICFpc05hTigrdmFsdWUpO1xuICAgICAgfTtcbiAgICAgIGlmIChjbGFzc0NvbnRhaW5zTGFiZWwpIHtcbiAgICAgICAgY29uc3QgY2hvaWNlRWxlbWVudHMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1jaG9pY2UnKSkubWFwKGMgPT4gYyBhcyBRdGlTaW1wbGVDaG9pY2UpO1xuICAgICAgICBjb25zdCBjaG9pY2VzID0gY2hvaWNlRWxlbWVudHNcbiAgICAgICAgICAubWFwKChjaG9pY2U6IEhUTUxFbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgZWw6IGNob2ljZSwgb3JkZXI6IGlzTnVtYmVyKGNob2ljZS5zdHlsZS5vcmRlcikgPyArY2hvaWNlLnN0eWxlLm9yZGVyIDogaW5kZXggKyAxIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpXG4gICAgICAgICAgLm1hcChjaG9pY2UgPT4gY2hvaWNlLmVsKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgKGNob2ljZXNbaV0gYXMgUXRpU2ltcGxlQ2hvaWNlKS5tYXJrZXIgPSB0aGlzLl9nZXRMYWJlbChpICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBfZ2V0TGFiZWwoaW5kZXg6IG51bWJlcikge1xuICAgICAgbGV0IGxhc3RMYWJlbCA9IHRoaXMuX2NsYXNzZXMuZmlsdGVyKGMgPT4gdGhpcy5fYWxsTGFiZWxzLmluY2x1ZGVzKGMpKS5wb3AoKSBhcyBMYWJlbFR5cGU7XG4gICAgICBjb25zdCBsYXN0TGFiZWxTdWZmaXggPSB0aGlzLl9jbGFzc2VzLmZpbHRlcihjID0+IHRoaXMuX2FsbExhYmVsU3VmZml4ZXMuaW5jbHVkZXMoYyBhcyBMYWJlbFN1ZmZpeFR5cGUpKS5wb3AoKTtcblxuICAgICAgaWYgKCFsYXN0TGFiZWwgJiYgbGFzdExhYmVsU3VmZml4KSB7XG4gICAgICAgIC8vIGEgc3VmZml4IHdpdGhvdXQgYSBsYWJlbCBpcyBzdHJhbmdlIHNvIGFkZCBxdGktbGFiZWxzLXVwcGVyLWFscGhhXG4gICAgICAgIGxhc3RMYWJlbCA9ICdxdGktbGFiZWxzLXVwcGVyLWFscGhhJztcbiAgICAgIH1cbiAgICAgIGxldCBsYWJlbCA9ICcnO1xuICAgICAgc3dpdGNoIChsYXN0TGFiZWwpIHtcbiAgICAgICAgY2FzZSAncXRpLWxhYmVscy1kZWNpbWFsJzpcbiAgICAgICAgICBsYWJlbCA9IGAke2luZGV4fWA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3F0aS1sYWJlbHMtbG93ZXItYWxwaGEnOlxuICAgICAgICAgIGxhYmVsID0gYCR7U3RyaW5nLmZyb21DaGFyQ29kZSg5NyArIGluZGV4IC0gMSl9YDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncXRpLWxhYmVscy11cHBlci1hbHBoYSc6XG4gICAgICAgICAgbGFiZWwgPSBgJHtTdHJpbmcuZnJvbUNoYXJDb2RlKDY1ICsgaW5kZXggLSAxKX1gO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGxhc3RMYWJlbFN1ZmZpeCA9PT0gJ3F0aS1sYWJlbHMtc3VmZml4LXBlcmlvZCcpIHtcbiAgICAgICAgbGFiZWwgKz0gJy4nO1xuICAgICAgfSBlbHNlIGlmIChsYXN0TGFiZWxTdWZmaXggPT09ICdxdGktbGFiZWxzLXN1ZmZpeC1wYXJlbnRoZXNpcycpIHtcbiAgICAgICAgbGFiZWwgKz0gYClgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxhYmVsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gVm9jYWJ1bGFyeUVsZW1lbnQgYXMgQ29uc3RydWN0b3I8Vm9jYWJ1bGFyeUludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIFtwYXJ0PSdzbG90J10ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBnYXA6IHZhcigtLXF0aS1nYXAtc2l6ZSk7XG4gICAgZmxleC13cmFwOiB3cmFwO1xuICB9XG5cbiAgOjpzbG90dGVkKHF0aS1zaW1wbGUtY2hvaWNlKSB7XG4gICAgZmxleDogMCAwXG4gICAgICBjYWxjKCgxMDAlIC0gKHZhcigtLXF0aS1nYXAtc2l6ZSkgKiB2YXIoLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nKSkpIC8gdmFyKC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZykpICFpbXBvcnRhbnQ7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50O1xuICB9XG5cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTEpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiAxO1xuICB9XG5cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTIpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiAyO1xuICB9XG4gIDpob3N0KC5xdGktY2hvaWNlcy1zdGFja2luZy0zKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC0tY2hvaWNlLWludGVyYWN0aW9ucy1zdGFja2luZzogMztcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtc3RhY2tpbmctNCkgW3BhcnQ9J3Nsb3QnXSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtLWNob2ljZS1pbnRlcmFjdGlvbnMtc3RhY2tpbmc6IDQ7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXN0YWNraW5nLTUpIFtwYXJ0PSdzbG90J10ge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgLS1jaG9pY2UtaW50ZXJhY3Rpb25zLXN0YWNraW5nOiA1O1xuICB9XG4gIDpob3N0KFtvcmllbnRhdGlvbj0naG9yaXpvbnRhbCddKSBbcGFydD0nc2xvdCddIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICB9XG5gO1xuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpUnVsZSwgUXRpUnVsZUJhc2UgfSBmcm9tICcuLic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1wcm9jZXNzaW5nJylcbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgbG9naWMgPSBuZXcgUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3IoKTtcbiAgICBjb25zdCBydWxlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG4gICAgbG9naWMucHJvY2VzcyhydWxlcyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW91dGNvbWUtcHJvY2Vzc2luZyc6IFF0aU91dGNvbWVQcm9jZXNzaW5nO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZ1Byb2Nlc3NvciB7XG4gIHB1YmxpYyBwcm9jZXNzKHJ1bGVzOiBRdGlSdWxlQmFzZVtdKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICBydWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVNYXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgbWFwUmVzcG9uc2UsIG1hcFJlc3BvbnNlUG9pbnQsIG1hdGNoQ29ycmVjdCB9IGZyb20gJy4uLy4uL2ludGVybmFsL3RlbXBsYXRlLXN0cmluZ3MnO1xuaW1wb3J0IHsgdHlwZSBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUvcXRpLXJ1bGUnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUXRpUmVzcG9uc2VQcm9jZXNzaW5nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICBjb25zdCBydWxlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG5cbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgIHJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlTWFwPGFueT4gfCBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCd0ZW1wbGF0ZScpKSB7XG4gICAgICBjb25zdCBzcGxpdHRlZFRlbXBsYXRlTmFtZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCd0ZW1wbGF0ZScpIS5zcGxpdCgnLycpO1xuICAgICAgY29uc3QgdGVtcGxhdGVOYW1lID0gc3BsaXR0ZWRUZW1wbGF0ZU5hbWVbc3BsaXR0ZWRUZW1wbGF0ZU5hbWUubGVuZ3RoIC0gMV0ucmVwbGFjZSgnLnhtbCcsICcnKTtcbiAgICAgIHRoaXMuaW5uZXJIVE1MID0gJyc7XG4gICAgICBzd2l0Y2ggKHRlbXBsYXRlTmFtZSkge1xuICAgICAgICBjYXNlICdtYXBfcmVzcG9uc2UnOiB7XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXBSZXNwb25zZSkuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ21hcF9yZXNwb25zZV9wb2ludCc6IHtcbiAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuZnJhZ21lbnRGcm9tU3RyaW5nKG1hcFJlc3BvbnNlUG9pbnQpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdtYXRjaF9jb3JyZWN0JzpcbiAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuZnJhZ21lbnRGcm9tU3RyaW5nKG1hdGNoQ29ycmVjdCkuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZnJhZ21lbnRGcm9tU3RyaW5nKHN0ckhUTUw6IHN0cmluZykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChzdHJIVE1MKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcmVzcG9uc2UtcHJvY2Vzc2luZyc6IFF0aVJlc3BvbnNlUHJvY2Vzc2luZztcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBtYXRjaENvcnJlY3QgPSBgPHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nPlxuICA8cXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbiAgICA8cXRpLXJlc3BvbnNlLWlmPlxuICAgICAgPHF0aS1tYXRjaD5cbiAgICAgICAgPHF0aS12YXJpYWJsZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS12YXJpYWJsZT5cbiAgICAgICAgPHF0aS1jb3JyZWN0IGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLWNvcnJlY3Q+XG4gICAgICA8L3F0aS1tYXRjaD5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjE8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtaWY+XG4gICAgPHF0aS1yZXNwb25zZS1lbHNlPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG5cbmV4cG9ydCBjb25zdCBtYXBSZXNwb25zZSA9IGA8cXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+XG4gIDxxdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuICAgIDxxdGktcmVzcG9uc2UtaWY+XG4gICAgICA8cXRpLWlzLW51bGw+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICA8L3F0aS1pcy1udWxsPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MC4wPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktbWFwLXJlc3BvbnNlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPiA8L3F0aS1tYXAtcmVzcG9uc2U+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG5cbmV4cG9ydCBjb25zdCBtYXBSZXNwb25zZVBvaW50ID0gYDxxdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5cbiAgPHF0aS1yZXNwb25zZS1jb25kaXRpb24+XG4gICAgPHF0aS1yZXNwb25zZS1pZj5cbiAgICAgIDxxdGktaXMtbnVsbD5cbiAgICAgICAgPHF0aS12YXJpYWJsZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS12YXJpYWJsZT5cbiAgICAgIDwvcXRpLWlzLW51bGw+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4wPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktbWFwLXJlc3BvbnNlLXBvaW50IGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLW1hcC1yZXNwb25zZS1wb2ludD5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWVsc2U+XG4gIDwvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbjwvcXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+YDtcbiIsICJpbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICdAY2l0b2xhYi9xdGktY29tcG9uZW50cy9xdGktY29tcG9uZW50cyc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbi8qKlxuICogVGhlIGxvb2t1cE91dGNvbWVWYWx1ZSBydWxlIHNldHMgdGhlIHZhbHVlIG9mIGFuIG91dGNvbWUgdmFyaWFibGUgdG8gdGhlIHZhbHVlIG9idGFpbmVkXG4gKiBieSBsb29raW5nIHVwIHRoZSB2YWx1ZSBvZiB0aGUgYXNzb2NpYXRlZCBleHByZXNzaW9uIGluIHRoZSBsb29rdXBUYWJsZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoZSBvdXRjb21lJ3MgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdGlMb29rdXBPdXRjb21lVmFsdWUgZXh0ZW5kcyBRdGlSdWxlIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBnZXQgY2hpbGRFeHByZXNzaW9uKCk6IFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxzdHJpbmc+O1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHByb2Nlc3MoKTogbnVtYmVyIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGUgPSB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKS5nZXRWYXJpYWJsZShpZGVudGlmaWVyKSBhcyBPdXRjb21lVmFyaWFibGU7XG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChvdXRjb21lVmFyaWFibGUuaW50ZXJwb2xhdGlvblRhYmxlKSB7XG4gICAgICB2YWx1ZSA9IG91dGNvbWVWYXJpYWJsZS5pbnRlcnBvbGF0aW9uVGFibGUuZ2V0KHBhcnNlSW50KHRoaXMuY2hpbGRFeHByZXNzaW9uLmNhbGN1bGF0ZSgpKSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ2xvb2t1cE91dGNvbWVWYWx1ZTogdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIG91dGNvbWVJZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZScsIFF0aUxvb2t1cE91dGNvbWVWYWx1ZSk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZSc6IFF0aUxvb2t1cE91dGNvbWVWYWx1ZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ydWxlJylcbmV4cG9ydCBjbGFzcyBRdGlSdWxlIGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIFF0aVJ1bGVCYXNlIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF0aVJ1bGVCYXNlIHtcbiAgcHJvY2VzcygpOiBhbnk7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ydWxlJzogUXRpUnVsZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUNvbmRpdGlvbiBleHRlbmRzIFF0aVJ1bGUge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgcHJvY2VzcygpIHtcbiAgICBjb25zdCBicmFuY2hlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlFeHByZXNzaW9uPGFueT5bXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJyYW5jaCA9IGJyYW5jaGVzW2ldO1xuXG4gICAgICBpZiAoYnJhbmNoLmNhbGN1bGF0ZSgpKSB7XG4gICAgICAgIChicmFuY2ggYXMgdW5rbm93biBhcyBRdGlSdWxlKS5wcm9jZXNzKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1jb25kaXRpb24nLCBRdGlSZXNwb25zZUNvbmRpdGlvbik7XG4iLCAiaW1wb3J0IHsgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC91dGlscyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUsIFF0aVJ1bGVCYXNlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlIGV4dGVuZHMgUXRpUnVsZSB7XG4gIHB1YmxpYyBvdmVycmlkZSBwcm9jZXNzKCkge1xuICAgIGNvbnN0IG91dGNvbWVJZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcblxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248c3RyaW5nPjtcblxuICAgIGNvbnN0IHJ1bGUgPSBuZXcgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZShleHByZXNzaW9uKTtcbiAgICBjb25zdCB2YWx1ZSA9IHJ1bGUucHJvY2VzcygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLXNldC1vdXRjb21lLXZhbHVlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgICA/IHZhbHVlLm1hcCgodjogc3RyaW5nKSA9PiBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCh2KSlcbiAgICAgICAgICAgIDogY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZTxUPiBpbXBsZW1lbnRzIFF0aVJ1bGVCYXNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uOiBRdGlFeHByZXNzaW9uQmFzZTxUPikge31cblxuICBwcm9jZXNzKCk6IGFueSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmV4cHJlc3Npb24gPyB0aGlzLmV4cHJlc3Npb24uY2FsY3VsYXRlKCkgOiBudWxsO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2Fybignc2V0T3V0Y29tZVZhbHVlOiB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCBRdGlTZXRPdXRjb21lVmFsdWUpO1xuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRWxzZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3ViUnVsZXMoKTogUXRpUnVsZVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aVJ1bGVbXTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IHN1YlJ1bGVzID0gdGhpcy5nZXRTdWJSdWxlcygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YlJ1bGUgPSBzdWJSdWxlc1tpXTtcbiAgICAgIHN1YlJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1lbHNlJywgUXRpUmVzcG9uc2VFbHNlKTtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aVJlc3BvbnNlSWYgfSBmcm9tICcuLi9xdGktcmVzcG9uc2UtaWYnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VFbHNlSWYgZXh0ZW5kcyBRdGlSZXNwb25zZUlmIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCR7c3VwZXIucmVuZGVyKCl9YDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1lbHNlLWlmJywgUXRpUmVzcG9uc2VFbHNlSWYpO1xuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vLi4vcXRpLXJ1bGUvcXRpLXJ1bGUnO1xuaW1wb3J0IHsgUXRpUmVzcG9uc2VFbHNlIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLWVsc2UnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VJZiBleHRlbmRzIFF0aVJlc3BvbnNlRWxzZSB7XG4gIHB1YmxpYyBvdmVycmlkZSBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxib29sZWFuPjtcbiAgICBjb25zdCByZXN1bHQgPSBleHByZXNzaW9uLmNhbGN1bGF0ZSgpIGFzIGJvb2xlYW47XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRTdWJSdWxlcygpOiBRdGlSdWxlW10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtaWYnLCBRdGlSZXNwb25zZUlmKTtcbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgaXRlbUNvbnRleHQsIEl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpTXVsdGlwbGUgfSBmcm9tICcuL3F0aS1tdWx0aXBsZS9xdGktbXVsdGlwbGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF0aUV4cHJlc3Npb25CYXNlPFQ+IHtcbiAgLy8gZ2V0IGFzc2Vzc21lbnRJdGVtKCk6IFF0aUFzc2Vzc21lbnRJdGVtO1xuXG4gIC8vIGdldFZhcmlhYmxlcygpOiBWYXJpYWJsZURlY2xhcmF0aW9uPG51bWJlciB8IHN0cmluZyB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBudWxsPltdO1xuICBjYWxjdWxhdGUoKTogUmVhZG9ubHk8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdGlFeHByZXNzaW9uPFQ+IGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIFF0aUV4cHJlc3Npb25CYXNlPFQ+IHtcbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIHJlc3VsdDogYW55O1xuXG4gIC8vIGhpZGUgdGhlIHNsb3Qgd2l0aCBjc3NcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICBzbG90IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8cHJlPiR7SlNPTi5zdHJpbmdpZnkodGhpcy5yZXN1bHQsIG51bGwsIDIpfTwvcHJlPlxuICAgICAgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PFQ+IHtcbiAgICB0aGlzLnJlc3VsdCA9IHRoaXMuZ2V0UmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJlc3VsdCgpOiBSZWFkb25seTxUPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcm90ZWN0ZWQgY29udGV4dD86IEl0ZW1Db250ZXh0O1xuXG4gIGdldFZhcmlhYmxlcyA9ICgpOiBWYXJpYWJsZURlY2xhcmF0aW9uPG51bWJlciB8IHN0cmluZyB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBudWxsPltdID0+XG4gICAgLy8gRklYTUU6IGlmIHRoaXMgaXRzZWxmIGlzIG11bHRpcGxlLCB0aGlzIHdpbGwgbmV2ZXIgZW50ZXIgdGhlIHF0aS1tdWx0aXBsZSBzd2l0Y2hcbiAgICAvLyBTZWUgdGhpcyBleGFtcGxlIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS8xRWRUZWNoL3F0aS1leGFtcGxlcy9ibG9iL21hc3Rlci9xdGl2My1leGFtcGxlcy9wYWNrYWdpbmcvaXRlbXMvRXhhbXBsZTA1LWZlZWRiYWNrQmxvY2stYWRhcHRpdmUueG1sXG5cbiAgICBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pXG4gICAgICAubWFwKChlOiBFbGVtZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICdxdGktYmFzZS12YWx1ZSc6IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGJhc2VUeXBlOiBlLmdldEF0dHJpYnV0ZSgnYmFzZS10eXBlJyksXG4gICAgICAgICAgICAgIHZhbHVlOiBlLnRleHRDb250ZW50LnRyaW0oKSxcbiAgICAgICAgICAgICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnXG4gICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS12YXJpYWJsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIHx8ICcnO1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1tdWx0aXBsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpcGxlID0gZSBhcyBRdGlNdWx0aXBsZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG11bHRpcGxlLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJycsXG4gICAgICAgICAgICAgICAgYmFzZVR5cGU6IHZhbHVlc1swXS5iYXNlVHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVzLm1hcCh2ID0+IHYudmFsdWUpLFxuICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAnbXVsdGlwbGUnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdyZXNwb25zZSdcbiAgICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1jb3JyZWN0Jzoge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlOiBSZXNwb25zZVZhcmlhYmxlID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB8fCBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYmFzZVR5cGU6IHJlc3BvbnNlVmFyaWFibGUuYmFzZVR5cGUsXG4gICAgICAgICAgICAgIHZhbHVlOiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZSxcbiAgICAgICAgICAgICAgY2FyZGluYWxpdHk6IHJlc3BvbnNlVmFyaWFibGUuY2FyZGluYWxpdHlcbiAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgLy8gYWRkZWQgZm9yIHVzZSBvZiBxdGktZXF1YWwtcm91bmRlZFxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IGUgYXMgUXRpRXhwcmVzc2lvbjxudW1iZXI+O1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGV4cHJlc3Npb24uZ2V0UmVzdWx0KCk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYmFzZVR5cGU6ICdpbnRlZ2VyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZSdcbiAgICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdkZWZhdWx0IG5vdCBzdWZmaWNpZW50Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKHYgPT4gdiAhPT0gbnVsbCk7XG59XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PGJvb2xlYW4+IHtcbiAgICB0aGlzLnJlc3VsdCA9IHRoaXMuZ2V0UmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGdldFJlc3VsdCgpOiBSZWFkb25seTxib29sZWFuPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5leHBvcnQgY2xhc3MgUXRpQW5kIGV4dGVuZHMgcXRpQW5kTWl4aW4oUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFF0aUNvbmRpdGlvbkV4cHJlc3Npb24+KSB7XG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlQ2hpbGRyZW4oQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuIGFzIHVua25vd24gYXMgUXRpRXhwcmVzc2lvbjxhbnk+W10pKTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBNb2NrUXRpRXhwcmVzc2lvbjxUPiA9IHsgY2FsY3VsYXRlOiAoKSA9PiBUIH07XG50eXBlIE1vY2tDb25zdHJ1Y3RvciA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IHt9O1xuZXhwb3J0IGZ1bmN0aW9uIHF0aUFuZE1peGluPFRCYXNlIGV4dGVuZHMgTW9ja0NvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICByZXR1cm4gY2xhc3MgTW9ja1F0aUFuZCBleHRlbmRzIEJhc2Uge1xuICAgIHB1YmxpYyBjYWxjdWxhdGVDaGlsZHJlbihjaGlsZHJlbjogQXJyYXk8TW9ja1F0aUV4cHJlc3Npb248YW55Pj4pIHtcbiAgICAgIC8vIGNoaWxkcmVuIGNhbiBiZSBhIG1peCBvZiBxdGktZXhwcmVzc2lvbiBhbmQgcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uXG4gICAgICBjb25zdCB2YWx1ZXMgPSBjaGlsZHJlbi5tYXAoYyA9PiB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IGMgYXMgTW9ja1F0aUV4cHJlc3Npb248YW55PjtcbiAgICAgICAgaWYgKCFjb25kaXRpb24uY2FsY3VsYXRlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5jYWxjdWxhdGUoKTtcbiAgICAgICAgbGV0IHZhbCA9IGZhbHNlO1xuICAgICAgICAvLyBjb252ZXJ0IHN0cmluZyB2YWx1ZSB0byBib29sZWFuIGFuZCByZXR1cm4gbnVsbCBpZiBub3QgcG9zc2libGVcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgdmFsID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICB2YWwgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWwgaW4gcXRpLW9yLCBleHBlY3RlZCBib29sZWFuJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB2YWwgPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHZhbHVlcy5ldmVyeShlID0+IHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSAnYm9vbGVhbicgJiYgZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBRdGlBbmQgfSBmcm9tICcuL3F0aS1hbmQnO1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktYW5kJywgUXRpQW5kKTtcblxuZXhwb3J0ICogZnJvbSAnLi9xdGktYW5kJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFuZCc6IFF0aUFuZDtcbiAgfVxufVxuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQmFzZVR5cGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aUJhc2VWYWx1ZSBleHRlbmRzIFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGUgPSAnc3RyaW5nJztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IHN0cmluZyB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnRleHRDb250ZW50LnRyaW0oKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktYmFzZS12YWx1ZScsIFF0aUJhc2VWYWx1ZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpQ29udGFpbnMgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBmb3Igb3RoZXIgdHlwZXMgdGhhbiBkaXJlY3RlZFBhaXJcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSA9PT0gJ211bHRpcGxlJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICAgICAgY29uc3QgZW51bWVyYWJsZSA9IHByb2plY3Rpb24xLmZpbHRlcih4ID0+IHByb2plY3Rpb24yLmluY2x1ZGVzKHgpKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBlbnVtZXJhYmxlLmxlbmd0aCA+IDA7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB2YWx1ZTEuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMi5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ID09PSAnc2luZ2xlJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uMi5pbmNsdWRlcyhwcm9qZWN0aW9uMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICd1bnN1cHBvcnRlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgY29udGFpbnMsIG9ubHkgYmFzZVR5cGU6IGRpcmVjdGVkUGFpciBhbmQgY2FyZGluYWxpdHk6IG11bHRpcGxlIGlzIHN1cHBvcnRlZCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIGNvbnRhaW5zJyk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1jb250YWlucycsIFF0aUNvbnRhaW5zKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUNvcnJlY3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIGdldCBpbnRlcnByZXRhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ludGVycHJldGF0aW9uJykgfHwgJyc7XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZTogUmVzcG9uc2VWYXJpYWJsZSA9IHRoaXMuY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikgfHwgbnVsbDtcbiAgICBpZiAocmVzcG9uc2VWYXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgIHJldHVybiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZS5sZW5ndGggPiAwID8gcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2VbMF0gOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1jb3JyZWN0JywgUXRpQ29ycmVjdCk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlFcXVhbFJvdW5kZWQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIHJvdW5kaW5nTW9kZTogJ2RlY2ltYWxQbGFjZXMnIHwgJ3NpZ25pZmljYW50RmlndXJlcycgPSAnc2lnbmlmaWNhbnRGaWd1cmVzJztcblxuICBnZXQgZmlndXJlcygpIHtcbiAgICBjb25zdCBhdHRyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpZ3VyZXMnKTtcbiAgICBpZiAoIWF0dHIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgYXR0cmlidXRlIGlzIG1pc3NpbmcnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBmaWd1cmVzID0gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ2ZpZ3VyZXMnKSB8fCAnMCcpO1xuICAgIGlmIChpc05hTihmaWd1cmVzKSkge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBhdHRyaWJ1dGUgaXMgbm90IGEgbnVtYmVyJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGZpZ3VyZXMgPCAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGF0dHJpYnV0ZSBpcyBuZWdhdGl2ZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChmaWd1cmVzIDwgMSAmJiB0aGlzLnJvdW5kaW5nTW9kZSA9PT0gJ3NpZ25pZmljYW50RmlndXJlcycpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxIGZvciBSb3VuZGluZ01vZGUgc2lnbmlmaWNhbnRGaWd1cmVzJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpZ3VyZXM7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodGhpcy5yb3VuZGluZ01vZGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgdmFsdWUyLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMS52YWx1ZSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIudmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgZXF1YWwnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh2YWx1ZXNbMF0uYmFzZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnaW50ZWdlcic6XG4gICAgICAgIGNhc2UgJ2Zsb2F0Jzoge1xuICAgICAgICAgIGNvbnN0IGZsb2F0MSA9IHBhcnNlRmxvYXQodmFsdWUxLnZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgICAgY29uc3QgZmxvYXQyID0gcGFyc2VGbG9hdCh2YWx1ZTIudmFsdWUgYXMgc3RyaW5nKTtcblxuICAgICAgICAgIGlmICghaXNOYU4oZmxvYXQxKSAmJiAhaXNOYU4oZmxvYXQyKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucm91bmRpbmdNb2RlID09PSAnc2lnbmlmaWNhbnRGaWd1cmVzJykge1xuICAgICAgICAgICAgICByZXR1cm4gZmxvYXQxLnRvUHJlY2lzaW9uKHRoaXMuZmlndXJlcykgPT09IGZsb2F0Mi50b1ByZWNpc2lvbih0aGlzLmZpZ3VyZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGZsb2F0MSAqIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpKSAvIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpID09PVxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoZmxvYXQyICogTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcykpIC8gTWF0aC5wb3coMTAsIHRoaXMuZmlndXJlcylcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgdmFsdWUgY2Fubm90IGJlIGNhc3RlZCB0byBudW1lcmljIHZhbHVlIGluIGVxdWFsUm91bmRlZCBvcGVyYXRvcjogJHtmbG9hdDF9LCAke2Zsb2F0Mn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHZhbHVlcyBvdGhlciB0aGFuIGZsb2F0IGFuZCBpbnQgY2Fubm90IGJlIHVzZWQgaW4gZXF1YWxSb3VuZGVkIG9wZXJhdG9yLmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aS1lcXVhbC1yb3VuZGVkJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZXF1YWwtcm91bmRlZCcsIFF0aUVxdWFsUm91bmRlZCk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUVxdWFsIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0b2xlcmFuY2VNb2RlOiAnZXhhY3QnIHwgJ3JlbGF0aXZlJyB8ICdhYnNvbHV0ZScgPSAnZXhhY3QnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh0aGlzLnRvbGVyYW5jZU1vZGUgIT09ICdleGFjdCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndG9sZXJhbmNlTW9kZSBpcyBub3Qgc3VwcG9ydGVkIHlldCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgdmFsdWUyLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMS52YWx1ZSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIudmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgZXF1YWwnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyh2YWx1ZTEudmFsdWUgYXMgc3RyaW5nLCB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nLCB2YWx1ZTEuYmFzZVR5cGUpO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGktZXF1YWwnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1lcXVhbCcsIFF0aUVxdWFsKTtcbiIsICJpbXBvcnQgeyBCYXNlVHlwZSB9IGZyb20gJy4uLy4uJztcblxuZXhwb3J0IGNsYXNzIFNjb3JpbmdIZWxwZXIge1xuICBwdWJsaWMgc3RhdGljIGNvbXBhcmVTaW5nbGVWYWx1ZXModmFsdWUxOiBSZWFkb25seTxzdHJpbmc+LCB2YWx1ZTI6IFJlYWRvbmx5PHN0cmluZz4sIGJhc2VUeXBlOiBCYXNlVHlwZSk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAoYmFzZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2lkZW50aWZpZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgcmV0dXJuIHZhbHVlMSA9PT0gdmFsdWUyO1xuICAgICAgY2FzZSAnaW50ZWdlcic6IHtcbiAgICAgICAgY29uc3QgaW50MSA9IHBhcnNlSW50KHZhbHVlMSwgMTApO1xuICAgICAgICBjb25zdCBpbnQyID0gcGFyc2VJbnQodmFsdWUyLCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4oaW50MSkgJiYgIWlzTmFOKGludDIpKSB7XG4gICAgICAgICAgcmV0dXJuIGludDEgPT09IGludDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgQ2Fubm90IGNvbnZlcnQgJHt2YWx1ZTF9IGFuZC9vciAke3ZhbHVlMn0gdG8gaW50LmApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZmxvYXQnOiB7XG4gICAgICAgIGNvbnN0IGZsb2F0MSA9IHBhcnNlRmxvYXQodmFsdWUxKTtcbiAgICAgICAgY29uc3QgZmxvYXQyID0gcGFyc2VGbG9hdCh2YWx1ZTIpO1xuICAgICAgICBpZiAoIWlzTmFOKGZsb2F0MSkgJiYgIWlzTmFOKGZsb2F0MikpIHtcbiAgICAgICAgICByZXR1cm4gZmxvYXQxID09PSBmbG9hdDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgY291bGRuJ3QgY29udmVydCAke3ZhbHVlMX0gYW5kL29yICR7dmFsdWUyfSB0byBmbG9hdC5gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3BhaXInOlxuICAgICAgY2FzZSAnZGlyZWN0ZWRQYWlyJzoge1xuICAgICAgICBjb25zdCBwYWlyMSA9IHZhbHVlMS5zcGxpdCgnICcpLnNvcnQoKTtcbiAgICAgICAgY29uc3QgcGFpcjIgPSB2YWx1ZTIuc3BsaXQoJyAnKS5zb3J0KCk7XG4gICAgICAgIGlmIChwYWlyMS5sZW5ndGggPT09IDIgJiYgcGFpcjIubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgaWYgKGJhc2VUeXBlID09PSAncGFpcicpIHtcbiAgICAgICAgICAgIHBhaXIxLnNvcnQoKTtcbiAgICAgICAgICAgIHBhaXIyLnNvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHBhaXIxLmpvaW4oJyAnKSA9PT0gcGFpcjIuam9pbignICcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGNvbXBhcmVkIHR3byBwYWlyIGJ1dCBvbmUgb2YgdGhlIHZhbHVlcyBkb2VzIG5vdCBoYXZlIDIgdmFsdWVzOiAxOiAke3ZhbHVlMX0gMjogJHt2YWx1ZTJ9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpR3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlID4gK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGd0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZ3QnLCBRdGlHdCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpR3RlIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA+PSArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgZ3RlJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRlJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZ3RlJywgUXRpR3RlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUlzTnVsbCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBpZiAoIXZhcmlhYmxlcykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGVzWzBdLnZhbHVlO1xuICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJztcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIE51bGwnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1pcy1udWxsJywgUXRpSXNOdWxsKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlMdCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPCArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgbHQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gbHQnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sdCcsIFF0aUx0KTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlMdGUgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlIDw9ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBsdGUnKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBsdGUnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sdGUnLCBRdGlMdGUpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJ3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1hcFJlc3BvbnNlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVzcG9uc2U6IFJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmNvbnRleHQudmFyaWFibGVzLmZpbmQociA9PiByLmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik7XG4gICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgY29uc29sZS53YXJuKGBSZXNwb25zZSAke3RoaXMuaWRlbnRpZmllcn0gY2FuIG5vdCBiZSBmb3VuZGApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1hcHBpbmcgPSByZXNwb25zZS5tYXBwaW5nO1xuICAgIGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlcyA9ICFBcnJheS5pc0FycmF5KHJlc3BvbnNlLnZhbHVlKSA/IFtyZXNwb25zZS52YWx1ZV0gOiByZXNwb25zZS52YWx1ZTtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlIG9mIGNhbmRpZGF0ZVJlc3BvbnNlcykge1xuICAgICAgY29uc3QgbWFwcGVkVmFsdWUgPSBtYXBwaW5nLm1hcEVudHJpZXMuZmluZChlbnRyeSA9PiB7XG4gICAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoZW50cnkubWFwS2V5LCBjYW5kaWRhdGVSZXNwb25zZSwgcmVzcG9uc2UuYmFzZVR5cGUpO1xuICAgICAgfSk7XG4gICAgICBpZiAoIShtYXBwZWRWYWx1ZSA9PSBudWxsIHx8IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlID09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBpbmcuZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWFwcGluZy5sb3dlckJvdW5kICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IE1hdGgubWF4KG1hcHBpbmcubG93ZXJCb3VuZCwgcmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKG1hcHBpbmcudXBwZXJCb3VuZCAhPSBudWxsKSB7XG4gICAgICByZXN1bHQgPSBNYXRoLm1pbihtYXBwaW5nLnVwcGVyQm91bmQsIHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWFwLXJlc3BvbnNlJywgUXRpTWFwUmVzcG9uc2UpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlNYXBwaW5nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ2RlZmF1bHQtdmFsdWUnLCB0eXBlOiBOdW1iZXIgfSkgZGVmYXVsdFZhbHVlOiBudW1iZXIgPSAwO1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdsb3dlci1ib3VuZCcsIHR5cGU6IE51bWJlciB9KSBsb3dlckJvdW5kOiBudW1iZXI7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJywgdHlwZTogTnVtYmVyIH0pIHVwcGVyQm91bmQ6IG51bWJlcjtcblxuICBwdWJsaWMgZ2V0IG1hcEVudHJpZXMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktbWFwLWVudHJ5JykpLm1hcChlbCA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXBLZXk6IGVsLmdldEF0dHJpYnV0ZSgnbWFwLWtleScpLFxuICAgICAgICBtYXBwZWRWYWx1ZTogK2VsLmdldEF0dHJpYnV0ZSgnbWFwcGVkLXZhbHVlJylcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWFwcGluZycsIFF0aU1hcHBpbmcpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTWF0Y2ggZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgLy9QSyA6IEZJWE1FLlxuICAvLyBUaGlzIHdhcyBhIGxpdHRsZSBleHBlcmltZW50IGlmIHdlIGNvdWxkIGNhbGwgdGhlIG1hdGNoIGZ1bmN0aW9uIGFzIGEgc3RhdGljIGZ1bmN0aW9uLFxuICAvLyBUaGlzIGNhbiBiZSB1c2VkIGZvciBhbGwga2luZCBvZiB0aGluZ3MsIGJ1dCBub3cgZXNwZWNpYWxseSBmb3IgdXNlIGluXG4gIC8vIHF0aS1yZXNwb25zZS1jb25kaXRpb24tc2NyaXB0XG4gIC8vIGluIHdoaWNoIHdlIHBhc3MgdGhlIGV4cHJlc3Npb25zIGFzIHB1cmUgZnVuY3Rpb25zLCBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuXG4gIC8vIFNBRExZLCB0aGUgZ2V0VmFyaWFibGVzIHRocm93cyByb2V0IGluIGRlIGV0ZW4uLiB3ZWV0IG5vZyBuaWV0IHByZWNpZXMgaG9lIGRlemUgd2Vya3QuXG4gIC8vIE1hYXIgaWsgZ2EgZXJpbiBkdWlrZW4uXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlVG9NYXAgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCBjb3JyZWN0VmFsdWVJbmZvID0gdmFsdWVzWzFdO1xuICAgICAgcmV0dXJuIFF0aU1hdGNoLm1hdGNoKHZhbHVlVG9NYXAsIGNvcnJlY3RWYWx1ZUluZm8pO1xuICAgIH1cblxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIG1hdGNoJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG1hdGNoKHZhbHVlVG9NYXA6IFJlc3BvbnNlVmFyaWFibGUsIGNvcnJlY3RWYWx1ZUluZm86IFJlc3BvbnNlVmFyaWFibGUpIHtcbiAgICBzd2l0Y2ggKGNvcnJlY3RWYWx1ZUluZm8uY2FyZGluYWxpdHkpIHtcbiAgICAgIGNhc2UgJ3NpbmdsZSc6IHtcbiAgICAgICAgaWYgKHZhbHVlVG9NYXAudmFsdWUgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG1hdGNoJyk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoXG4gICAgICAgICAgdmFsdWVUb01hcC52YWx1ZT8udG9TdHJpbmcoKSxcbiAgICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdvcmRlcmVkJzoge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZS5sZW5ndGggIT09IGNvcnJlY3RWYWx1ZUluZm8udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVUb01hcC52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhcbiAgICAgICAgICAgIGNvcnJlY3RWYWx1ZUluZm8udmFsdWVbaV0sXG4gICAgICAgICAgICB2YWx1ZVRvTWFwLnZhbHVlW2ldLFxuICAgICAgICAgICAgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ211bHRpcGxlJzoge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgIUFycmF5LmlzQXJyYXkoY29ycmVjdFZhbHVlSW5mby52YWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVUb01hcC52YWx1ZS5sZW5ndGggIT09IGNvcnJlY3RWYWx1ZUluZm8udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbnN3ZXJJbmRleCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgY29ycmVjdEFuc3dlciBvZiBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSB7XG4gICAgICAgICAgbGV0IG1hdGNoaW5nVmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICAgIGNvbnN0IGFyciA9IFsuLi52YWx1ZVRvTWFwLnZhbHVlXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG12IG9mIGFycikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKGNvcnJlY3RBbnN3ZXIsIG12LCBjb3JyZWN0VmFsdWVJbmZvLmJhc2VUeXBlKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgbWF0Y2hpbmdWYWx1ZSA9IG12O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1hdGNoaW5nVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIChhcnIgYXMgc3RyaW5nW10pLnNwbGljZShhcnIuaW5kZXhPZihtYXRjaGluZ1ZhbHVlKSwgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYW5zd2VySW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbWF0Y2gnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tYXRjaCcsIFF0aU1hdGNoKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlNZW1iZXIgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4gfCBudWxsPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG5cbiAgICBpZiAoISh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIG1lbWJlciBvcGVyYXRvciB0YWtlcyB0d28gc3ViLWV4cHJlc3Npb25zJyk7XG4gICAgfVxuXG4gICAgY29uc3QgW3ZhbHVlMSwgdmFsdWUyXSA9IHZhbHVlcztcblxuICAgIGlmICghKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlKSkge1xuICAgICAgY29uc29sZS53YXJuKCdXaGljaCBtdXN0IGJvdGggaGF2ZSB0aGUgc2FtZSBiYXNlLXR5cGUnKTtcbiAgICB9XG4gICAgaWYgKCEodmFsdWUyLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnIHx8IHZhbHVlMi5jYXJkaW5hbGl0eSA9PT0gJ29yZGVyZWQnKSkge1xuICAgICAgY29uc29sZS53YXJuKCdhbmQgdGhlIHNlY29uZCBtdXN0IGJlIGEgbXVsdGlwbGUgb3Igb3JkZXJlZCBjb250YWluZXInKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JyB8fCB2YWx1ZTIuYmFzZVR5cGUgPT09ICdmbG9hdCcpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIG1lbWJlciBvcGVyYXRvciBzaG91bGQgbm90IGJlIHVzZWQgb24gc3ViLWV4cHJlc3Npb25zIHdpdGggYSBiYXNlLXR5cGUgb2YgZmxvYXQnKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2R1cmF0aW9uJyB8fCB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkdXJhdGlvbicpIHtcbiAgICAgIGNvbnNvbGUud2FybignSXQgbXVzdCBub3QgYmUgdXNlZCBvbiBzdWItZXhwcmVzc2lvbnMgd2l0aCBhIGJhc2UtdHlwZSBvZiBkdXJhdGlvbicpO1xuICAgIH1cblxuICAgIC8vIElmIGVpdGhlciBzdWItZXhwcmVzc2lvbiBpcyBOVUxMIHRoZW4gdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0b3IgaXMgTlVMTFxuICAgIGlmICh2YWx1ZTEudmFsdWUgPT09IG51bGwgfHwgdmFsdWUyLnZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVzdWx0IGlzIGEgc2luZ2xlIGJvb2xlYW4gd2l0aCBhIHZhbHVlIG9mICd0cnVlJyBpZiB0aGUgdmFsdWUgZ2l2ZW4gYnkgdGhlIGZpcnN0IHN1Yi1leHByZXNzaW9uIGlzIGluIHRoZSBjb250YWluZXIgZGVmaW5lZCBieSB0aGUgc2Vjb25kIHN1Yi1leHByZXNzaW9uLlxuICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZztcbiAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICByZXR1cm4gcHJvamVjdGlvbjIuaW5jbHVkZXMocHJvamVjdGlvbjEpO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1lbWJlcicsIFF0aU1lbWJlcik7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSwgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aU11bHRpcGxlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPltdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogUmVzcG9uc2VWYXJpYWJsZVtdIHtcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodmFyaWFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB2YXJpYWJsZXMpIHtcbiAgICAgIGlmICh2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ211bHRpcGxlJyAmJiB2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbXVsdGlwbGUnKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0IHZhbHVlcyA9IHZhcmlhYmxlcy5tYXAodiA9PiB2LnZhbHVlKTtcbiAgICAvLyBjb25zb2xlLmxvZyh2YXJpYWJsZXMpO1xuICAgIC8vIGNvbnN0IGZsYXR0ZW5lZEFycmF5ID0gdmFsdWVzLnJlZHVjZSgoYWNjOiBzdHJpbmdbXSwgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG4gICAgLy8gICByZXR1cm4gYWNjLmNvbmNhdChBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiB2YWx1ZSk7XG4gICAgLy8gfSwgW10pO1xuICAgIC8vIHJldHVybiBmbGF0dGVuZWRBcnJheTtcblxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbXVsdGlwbGUnLCBRdGlNdWx0aXBsZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTm90IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAke3N1cGVyLnJlbmRlcigpfWA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj47XG4gICAgY29uc3QgcmVzdWx0ID0gZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSBhcyBib29sZWFuO1xuICAgIHJldHVybiAhcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW5vdCcsIFF0aU5vdCk7XG4iLCAiaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpT3IgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikubWFwKGMgPT4ge1xuICAgICAgY29uc3QgY29uZGl0aW9uID0gYyBhcyBRdGlFeHByZXNzaW9uPGFueT47XG4gICAgICBpZiAoIWNvbmRpdGlvbi5jYWxjdWxhdGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmRpdGlvbi5jYWxjdWxhdGUoKTtcbiAgICAgIGxldCB2YWwgPSBmYWxzZTtcbiAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHZhbHVlIHRvIGJvb2xlYW4gYW5kIHJldHVybiBudWxsIGlmIG5vdCBwb3NzaWJsZVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICB2YWwgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgdmFsID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWwgaW4gcXRpLW9yLCBleHBlY3RlZCBib29sZWFuJyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIHZhbCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMuc29tZShlID0+IHtcbiAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gJ2Jvb2xlYW4nICYmIGU7XG4gICAgfSk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktb3InLCBRdGlPcik7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aU9yZGVyZWQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPFJlc3BvbnNlVmFyaWFibGVbXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IFJlc3BvbnNlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHZhcmlhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBtdWx0aXBsZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgdmFyaWFibGVzKSB7XG4gICAgICBpZiAodmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdvcmRlcmVkJyAmJiB2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgb3JkZXJlZCcpO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktb3JkZXJlZCcsIFF0aU9yZGVyZWQpO1xuIiwgImltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICdzcmMvbGliL3F0aS1jb21wb25lbnRzL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlQcmludGVkVmFyaWFibGUgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHJvdGVjdGVkIGNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpPy52YWx1ZTtcbiAgICByZXR1cm4gaHRtbGAke0pTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKX1gO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpIHx8IG51bGw7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wcmludGVkLXZhcmlhYmxlJywgUXRpUHJpbnRlZFZhcmlhYmxlKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlQcm9kdWN0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBjb25zdCBwcm9kdWN0ID0gdmFsdWVzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZS5iYXNlVHlwZSA9PSAnZmxvYXQnIHx8IGN1cnJlbnRWYWx1ZS5iYXNlVHlwZSA9PSAnaW50ZWdlcicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYWNjdW11bGF0b3IgKiBwYXJzZUludChjdXJyZW50VmFsdWUudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBjYW4gbm90IGNvbnZlcnQgdG8gbnVtYmVyYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgaGFzIGFub3RoZXIgYmFzZVR5cGUgJHtjdXJyZW50VmFsdWUuYmFzZVR5cGV9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfSwgMSk7XG4gICAgcmV0dXJuIHByb2R1Y3Q7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcHJvZHVjdCcsIFF0aVByb2R1Y3QpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlTdHJpbmdNYXRjaCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Nhc2Utc2Vuc2l0aXZlJyB9KSBjYXNlU2Vuc2l0aXZlID0gJ3RydWUnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmIChcbiAgICAgICAgdmFsdWUxLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICB2YWx1ZTIuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUxLnZhbHVlKSB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMi52YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBzdHJpbmctbWF0Y2gnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgdjEgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09ICd0cnVlJyA/IHZhbHVlMS52YWx1ZSA6ICh2YWx1ZTEudmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgdjIgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPT09ICd0cnVlJyA/IHZhbHVlMi52YWx1ZSA6ICh2YWx1ZTIudmFsdWUgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyh2MSBhcyBzdHJpbmcsIHYyIGFzIHN0cmluZywgdmFsdWUxLmJhc2VUeXBlKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLXN0cmluZy1tYXRjaCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXN0cmluZy1tYXRjaCcsIFF0aVN0cmluZ01hdGNoKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVN1bSBleHRlbmRzIFF0aUV4cHJlc3Npb248bnVtYmVyPiB7XG4gIHByaXZhdGUgX2V4cHJlc3Npb246IFF0aVN1bUV4cHJlc3Npb247XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZXhwcmVzc2lvbiA9IG5ldyBRdGlTdW1FeHByZXNzaW9uKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbiBhcyB1bmtub3duIGFzIFF0aUV4cHJlc3Npb25CYXNlPG51bWJlcj5bXSkpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZXhwcmVzc2lvbi5jYWxjdWxhdGUoKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF0aVN1bUV4cHJlc3Npb24gaW1wbGVtZW50cyBRdGlFeHByZXNzaW9uQmFzZTxudW1iZXI+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uczogUXRpRXhwcmVzc2lvbkJhc2U8bnVtYmVyPltdKSB7fVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5leHByZXNzaW9ucy5tYXAoYyA9PiB7XG4gICAgICBpZiAoIWMuY2FsY3VsYXRlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBjLmNhbGN1bGF0ZSgpO1xuICAgICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWx1ZSBpbiBxdGktc3VtLCBleHBlY3RlZCBudW1iZXInKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc3VtJywgUXRpU3VtKTtcbiIsICJpbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpVmFyaWFibGUgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb250ZXh0LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKS52YWx1ZVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktdmFyaWFibGUnLCBRdGlWYXJpYWJsZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IElNU3BjaSwgTW9kdWxlUmVzb2x1dGlvbkNvbmZpZywgUXRpVmFyaWFibGVKU09OIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5kZWNsYXJlIGNvbnN0IHJlcXVpcmVqczogYW55O1xuZGVjbGFyZSBjb25zdCBkZWZpbmU6IGFueTtcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHByaXZhdGUgaW50ZXJ2YWxJZDogYW55O1xuICBwcml2YXRlIHJhd1Jlc3BvbnNlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBwY2k6IElNU3BjaTx1bmtub3duPjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ21vZHVsZScgfSlcbiAgbW9kdWxlOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjdXN0b20taW50ZXJhY3Rpb24tdHlwZS1pZGVudGlmaWVyJyB9KVxuICBjdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBudWxsO1xuXG4gIHByaXZhdGUgY29udmVydFF0aVZhcmlhYmxlSlNPTihpbnB1dDogUXRpVmFyaWFibGVKU09OKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIGZvciAoY29uc3QgdG9wTGV2ZWxLZXkgaW4gaW5wdXQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIGlmIChpbnB1dC5oYXNPd25Qcm9wZXJ0eSh0b3BMZXZlbEtleSkpIHtcbiAgICAgICAgY29uc3QgbmVzdGVkT2JqZWN0ID0gaW5wdXRbdG9wTGV2ZWxLZXkgYXMgJ2xpc3QnIHwgJ2Jhc2UnXTtcbiAgICAgICAgaWYgKG5lc3RlZE9iamVjdCkge1xuICAgICAgICAgIGZvciAoY29uc3QgbmVzdGVkS2V5IGluIG5lc3RlZE9iamVjdCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICAgICAgaWYgKG5lc3RlZE9iamVjdC5oYXNPd25Qcm9wZXJ0eShuZXN0ZWRLZXkpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbmVzdGVkT2JqZWN0W25lc3RlZEtleSBhcyBrZXlvZiB0eXBlb2YgbmVzdGVkT2JqZWN0XTtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcChTdHJpbmcpOyAvLyBDb252ZXJ0IGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgdG8gc3RyaW5nXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpOyAvLyBDb252ZXJ0IHRoZSBzaW5nbGUgdmFsdWUgdG8gc3RyaW5nXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0Q2hlY2tpbmcoKTogdm9pZCB7XG4gICAgLy8gYmVjYXVzZSB0aGUgcGNpIGRvZXNuJ3QgaGF2ZSBhIG1ldGhvZCB0byBjaGVjayBmb3IgY2hhbmdlcyB3ZSdsbCB1c2UgYW4gaW50ZXJ2YWxcbiAgICAvLyB0byBjaGVjayBpZiB0aGUgcmVzcG9uc2UgaGFzIGNoYW5nZWQuIElmIGNoYW5nZWQgd2UnbGwgc2F2ZSB0aGUgcmVzcG9uc2VcbiAgICB0aGlzLmludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMucGNpLmdldFJlc3BvbnNlKCk7XG4gICAgICBjb25zdCBuZXdSZXNwb25zZSA9IHRoaXMucGNpLmdldFJlc3BvbnNlKCk7XG4gICAgICBjb25zdCBzdHJpbmdpZmllZCA9IEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlKTtcbiAgICAgIGlmIChzdHJpbmdpZmllZCAhPT0gdGhpcy5yYXdSZXNwb25zZSkge1xuICAgICAgICB0aGlzLnJhd1Jlc3BvbnNlID0gc3RyaW5naWZpZWQ7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb252ZXJ0UXRpVmFyaWFibGVKU09OKG5ld1Jlc3BvbnNlKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSwgMjAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcENoZWNraW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludGVydmFsSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlOyAvLyBGT1IgTk9XXG4gIH1cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAvLyBPbmx5IHNldCBzdGF0ZSBpcyBzdXBwb3J0ZWQgaW4gYSBQQ0lcbiAgfVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJhd1Jlc3BvbnNlO1xuICB9XG5cbiAgZ2V0VEFPQ29uZmlnKG5vZGUpIHtcbiAgICBjb25zdCBhID0gbm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdwcm9wZXJ0aWVzJyk7XG4gICAgbGV0IGNvbmZpZyA9IHt9O1xuXG4gICAgY29uc3QgZ2V0UHJvcGVydHlWYWx1ZSA9IGVsID0+IHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0ge307XG4gICAgICBjb25zdCBrZXkgPSBlbC5nZXRBdHRyaWJ1dGUoJ2tleScpO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZWwuY2hpbGRyZW4pO1xuICAgICAgICBjb25zdCBhbGxLZXkgPSBjaGlsZHJlbi5tYXAoKGM6IEhUTUxFbGVtZW50KSA9PiBjLmdldEF0dHJpYnV0ZSgna2V5JykpO1xuICAgICAgICBjb25zdCBpc0FycmF5ID0gYWxsS2V5Lmxlbmd0aCA+IDAgJiYgIWFsbEtleS5maW5kKGsgPT4gIU51bWJlci5pc0ludGVnZXIoK2spKTtcbiAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICBwcm9wZXJ0eVtrZXldID0gY2hpbGRyZW4ubWFwKGMgPT4gZ2V0Q2hpbGRQcm9wZXJ0aWVzKGMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wZXJ0eVtrZXldID0gZWwudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0Q2hpbGRQcm9wZXJ0aWVzID0gKGVsKToge30gfCB2b2lkID0+IHtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBsZXQgcHJvcGVydGllcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsLmNoaWxkcmVuKSB7XG4gICAgICAgICAgcHJvcGVydGllcyA9IHsgLi4ucHJvcGVydGllcywgLi4uZ2V0UHJvcGVydHlWYWx1ZShjaGlsZCkgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0aWVzIG9mIGEpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnRpZXMuZ2V0QXR0cmlidXRlKCdrZXknKTtcbiAgICAgIGlmICgha2V5KSB7XG4gICAgICAgIGNvbmZpZyA9IHsgLi4uY29uZmlnLCAuLi5nZXRDaGlsZFByb3BlcnRpZXMocHJvcGVydGllcykgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdDYW4gbm90IGZpbmQgcXRpLWN1c3RvbS1pbnRlcmFjdGlvbiBjb25maWcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJlZ2lzdGVyKHBjaTogSU1TcGNpPHVua25vd24+KSB7XG4gICAgdGhpcy5wY2kgPSBwY2k7XG5cbiAgICBjb25zdCB0eXBlID0gdGhpcy5wYXJlbnRFbGVtZW50LnRhZ05hbWUgPT09ICdRVEktQ1VTVE9NLUlOVEVSQUNUSU9OJyA/ICdUQU8nIDogJ0lNUyc7XG4gICAgY29uc3QgZG9tOiBIVE1MRWxlbWVudCA9XG4gICAgICB0eXBlID09ICdJTVMnID8gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktaW50ZXJhY3Rpb24tbWFya3VwJykgOiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ21hcmt1cCcpO1xuICAgIGRvbS5jbGFzc0xpc3QuYWRkKCdxdGktY3VzdG9tSW50ZXJhY3Rpb24nKTtcblxuICAgIGlmICh0eXBlID09ICdUQU8nICYmIHRoaXMucXVlcnlTZWxlY3RvcigncHJvcGVydGllcycpKSB7XG4gICAgICAodGhpcy5xdWVyeVNlbGVjdG9yKCdwcm9wZXJ0aWVzJykgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBhbnkgPVxuICAgICAgdHlwZSA9PSAnSU1TJ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHRoaXMuZGF0YXNldCxcbiAgICAgICAgICAgIG9ucmVhZHk6ICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ29ucmVhZHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogdGhpcy5nZXRUQU9Db25maWcodGhpcyk7XG4gICAgaWYgKHR5cGUgPT0gJ0lNUycpIHtcbiAgICAgIHBjaS5nZXRJbnN0YW5jZShkb20sIGNvbmZpZywgdW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgKHBjaSBhcyBhbnkpLmluaXRpYWxpemUodGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyLCBkb20uZmlyc3RFbGVtZW50Q2hpbGQsIGNvbmZpZyk7XG4gICAgfVxuICAgIGlmICh0eXBlID09ICdUQU8nKSB7XG4gICAgICBjb25zdCBsaW5rcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rJykpLm1hcChhY2MgPT4gYWNjLmdldEF0dHJpYnV0ZSgnaHJlZicpKTtcbiAgICAgIGxpbmtzLmZvckVhY2gobGluayA9PiB7XG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgc3R5bGVzLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgc3R5bGVzLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgICBzdHlsZXMubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgICAgc3R5bGVzLmhyZWYgPSBsaW5rO1xuICAgICAgICBkb20uYXBwZW5kQ2hpbGQoc3R5bGVzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0Q2hlY2tpbmcoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBkZWZpbmUoJ3F0aUN1c3RvbUludGVyYWN0aW9uQ29udGV4dCcsICgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlZ2lzdGVyOiBjdHhBID0+IHtcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyKGN0eEEpO1xuICAgICAgICB9LFxuICAgICAgICBub3RpZnlSZWFkeTogKCkgPT4ge1xuICAgICAgICAgIC8qIG9ubHkgdXNlZCBpbiB0aGUgVEFPIHZlcnNpb24gKi9cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuYnVpbGRSZXF1aXJlQ29uZmlnKCk7XG4gICAgY29uc3QgcmVxdWlyZVBDSSA9IHJlcXVpcmVqcy5jb25maWcoY29uZmlnKTtcbiAgICByZXF1aXJlUENJKFsncmVxdWlyZSddLCByZXF1aXJlID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZHluYW1pYy1yZXF1aXJlXG4gICAgICByZXF1aXJlKFt0aGlzLm1vZHVsZV0pO1xuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICByZXF1aXJlanMudW5kZWYodGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyKTtcbiAgICAvLyBDbGVhciB0aGUgbW9kdWxlcyBpbiB0aGUgY29udGV4dFxuICAgIGNvbnN0IGNvbnRleHQgPSByZXF1aXJlanMucy5jb250ZXh0cztcbiAgICBkZWxldGUgY29udGV4dFt0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXJdO1xuICAgIHRoaXMuc3RvcENoZWNraW5nKCk7XG4gIH1cblxuICBidWlsZFJlcXVpcmVDb25maWcoKSB7XG4gICAgLy8gU2V0IFJlcXVpcmVKUyBwYXRocyBhbmQgc2hpbSBjb25maWd1cmF0aW9uIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNvbmZpZzogTW9kdWxlUmVzb2x1dGlvbkNvbmZpZyA9IHtcbiAgICAgIGNvbnRleHQ6IHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcixcbiAgICAgIGNhdGNoRXJyb3I6IHRydWUsXG4gICAgICBwYXRoczogd2luZG93WydyZXF1aXJlUGF0aHMnXSB8fCB7fSxcbiAgICAgIHNoaW06IHdpbmRvd1sncmVxdWlyZVNoaW0nXSB8fCB7fVxuICAgIH07XG4gICAgLy8gQ2hlY2sgaWYgUmVxdWlyZUpTIGlzIGF2YWlsYWJsZSwgaWYgbm90LCBzZXQgYW4gZXJyb3IgbWVzc2FnZVxuICAgIGlmICghZ2xvYmFsVGhpcy5yZXF1aXJlKSB7XG4gICAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBgUmVxdWlyZUpTIG5vdCBmb3VuZC4gUGxlYXNlIGxvYWQgaXQgdmlhIENETjogaHR0cHM6Ly9jZG5qcy5jb20vbGlicmFyaWVzL3JlcXVpcmUuanNgO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLXVybCcpO1xuICAgIGNvbnN0IGludGVyYWN0aW9uTW9kdWxlcyA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVyYWN0aW9uLW1vZHVsZXMnKTtcblxuICAgIGlmIChpbnRlcmFjdGlvbk1vZHVsZXMpIHtcbiAgICAgIGNvbnN0IG1vZHVsZXMgPSBpbnRlcmFjdGlvbk1vZHVsZXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWludGVyYWN0aW9uLW1vZHVsZScpO1xuICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgICBjb25zdCBtb2R1bGVJZCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG4gICAgICAgIGNvbnN0IHByaW1hcnlQYXRoID0gbW9kdWxlLmdldEF0dHJpYnV0ZSgncHJpbWFyeS1wYXRoJyk7XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrUGF0aCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ2ZhbGxiYWNrLXBhdGgnKTtcblxuICAgICAgICBpZiAobW9kdWxlSWQgJiYgcHJpbWFyeVBhdGgpIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHBhdGhzIHVzaW5nIFJlcXVpcmVKUydzIGZhbGxiYWNrIGFycmF5XG4gICAgICAgICAgY29uc3QgcGF0aHMgPSBmYWxsYmFja1BhdGhcbiAgICAgICAgICAgID8gdGhpcy5jb21iaW5lUmVxdWlyZVJlc29sdmVQYXRocyhcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlc29sdmFibGVQYXRoKHByaW1hcnlQYXRoLCBiYXNlVXJsKSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldFJlc29sdmFibGVQYXRoKGZhbGxiYWNrUGF0aCwgYmFzZVVybClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiB0aGlzLmdldFJlc29sdmFibGVQYXRoKHByaW1hcnlQYXRoLCBiYXNlVXJsKTtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1BhdGggPSBjb25maWcucGF0aHNbbW9kdWxlSWRdIHx8IFtdO1xuICAgICAgICAgIGNvbmZpZy5wYXRoc1ttb2R1bGVJZF0gPSB0aGlzLmNvbWJpbmVSZXF1aXJlUmVzb2x2ZVBhdGhzKGV4aXN0aW5nUGF0aCwgcGF0aHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIGNvbWJpbmVSZXF1aXJlUmVzb2x2ZVBhdGhzKHBhdGgxOiBzdHJpbmcgfCBzdHJpbmdbXSwgcGF0aDI6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcGF0aDFBcnJheSA9IEFycmF5LmlzQXJyYXkocGF0aDEpID8gcGF0aDEgOiBbcGF0aDFdO1xuICAgIGNvbnN0IHBhdGgyQXJyYXkgPSBBcnJheS5pc0FycmF5KHBhdGgyKSA/IHBhdGgyIDogW3BhdGgyXTtcbiAgICByZXR1cm4gcGF0aDFBcnJheS5jb25jYXQocGF0aDJBcnJheSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURvdWJsZVNsYXNoZXMoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaW5nbGVGb3J3YXJkU2xhc2hlcyA9IHN0clxuICAgICAgLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgJyQxJylcbiAgICAgIC5yZXBsYWNlKC9cXC9cXC8vZywgJy8nKVxuICAgICAgLnJlcGxhY2UoJ2h0dHA6LycsICdodHRwOi8vJylcbiAgICAgIC5yZXBsYWNlKCdodHRwczovJywgJ2h0dHBzOi8vJyk7XG4gICAgcmV0dXJuIHNpbmdsZUZvcndhcmRTbGFzaGVzO1xuICB9XG5cbiAgbG9hZENvbmZpZyA9IGFzeW5jICh1cmw6IHN0cmluZywgYmFzZVVybD86IHN0cmluZyk6IFByb21pc2U8TW9kdWxlUmVzb2x1dGlvbkNvbmZpZz4gPT4ge1xuICAgIHVybCA9IHRoaXMucmVtb3ZlRG91YmxlU2xhc2hlcyh1cmwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1aXJlQ29uZmlnID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgIGlmIChyZXF1aXJlQ29uZmlnLm9rKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlcXVpcmVDb25maWcuanNvbigpO1xuICAgICAgICBjb25zdCBtb2R1bGVDb25nID0gY29uZmlnIGFzIE1vZHVsZVJlc29sdXRpb25Db25maWc7XG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlSWQgaW4gbW9kdWxlQ29uZy5wYXRocykge1xuICAgICAgICAgIGlmIChiYXNlVXJsKSB7XG4gICAgICAgICAgICBtb2R1bGVDb25nLnBhdGhzW21vZHVsZUlkXSA9IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGgobW9kdWxlQ29uZy5wYXRoc1ttb2R1bGVJZF0sIGJhc2VVcmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kdWxlQ29uZztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGdldFJlc29sdmFibGVQYXRoU3RyaW5nID0gKHBhdGg6IHN0cmluZywgYmFzZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC5qcyQvLCAnJyk7XG4gICAgcmV0dXJuIHBhdGg/LnRvTG9jYWxlTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnaHR0cCcpIHx8ICFiYXNlUGF0aFxuICAgICAgPyBwYXRoXG4gICAgICA6IHRoaXMucmVtb3ZlRG91YmxlU2xhc2hlcyhgJHtiYXNlUGF0aH0vJHtwYXRofWApO1xuICB9O1xuXG4gIGdldFJlc29sdmFibGVQYXRoID0gKHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCBiYXNlUGF0aD86IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhdGgpXG4gICAgICA/IHBhdGgubWFwKHAgPT4gdGhpcy5nZXRSZXNvbHZhYmxlUGF0aFN0cmluZyhwLCBiYXNlUGF0aCkpXG4gICAgICA6IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGhTdHJpbmcocGF0aCwgYmFzZVBhdGgpO1xuICB9O1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+JHt0aGlzLl9lcnJvck1lc3NhZ2UgJiZcbiAgICAgIGh0bWxgPGRpdiBzdHlsZT1cImNvbG9yOnJlZFwiPlxuICAgICAgICA8aDE+RXJyb3I8L2gxPlxuICAgICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZX1cbiAgICAgIDwvZGl2PmB9YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJzogUXRpUG9ydGFibGVDdXN0b21JbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IENTU1Jlc3VsdEdyb3VwLCBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcblxuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSB9IGZyb20gJy4uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24uc3R5bGVzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUFzc29jaWF0ZUludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKFxuICBJbnRlcmFjdGlvbixcbiAgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLFxuICB0cnVlLFxuICAnLmRsJ1xuKSB7XG4gIEBzdGF0ZSgpIHByaXZhdGUgX2NoaWxkcmVuTWFwOiBFbGVtZW50W10gPSBbXTtcblxuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcbiAgLy8gZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2VIYW5kbGVyOiAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJDaG9pY2VIYW5kbGVyID0gdGhpcy5fcmVnaXN0ZXJDaG9pY2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3JlZ2lzdGVyLXF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLCB0aGlzLl9yZWdpc3RlckNob2ljZUhhbmRsZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2UoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgY29uc3QgY2hvaWNlID0gZXZlbnQudGFyZ2V0IGFzIFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U7XG4gICAgdGhpcy5fY2hpbGRyZW5NYXAucHVzaChjaG9pY2UpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHNsb3QgbmFtZT1cInF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2VcIj48L3Nsb3Q+XG4gICAgICA8ZGl2IHBhcnQ9XCJkcm9wLWNvbnRhaW5lclwiPlxuICAgICAgICAke3RoaXMuX2NoaWxkcmVuTWFwLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgQXJyYXkuZnJvbShBcnJheShNYXRoLmNlaWwodGhpcy5fY2hpbGRyZW5NYXAubGVuZ3RoIC8gMikpLmtleXMoKSkubWFwKFxuICAgICAgICAgIChfLCBpbmRleCkgPT5cbiAgICAgICAgICAgIGh0bWxgPGRpdiBwYXJ0PVwiYXNzb2NpYWJsZXMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgbmFtZT1cImxlZnQke2luZGV4fVwiIHBhcnQ9XCJkcm9wLWxpc3RcIiBjbGFzcz1cImRsXCIgaWRlbnRpZmllcj1cImRyb3BsaXN0JHtpbmRleH1fbGVmdFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IG5hbWU9XCJyaWdodCR7aW5kZXh9XCIgcGFydD1cImRyb3AtbGlzdFwiIGNsYXNzPVwiZGxcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2luZGV4fV9yaWdodFwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICApfVxuICAgICAgPC9kaXY+YDtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJywgdGhpcy5fcmVnaXN0ZXJDaG9pY2VIYW5kbGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzb2NpYXRlLWludGVyYWN0aW9uJzogUXRpQXNzb2NpYXRlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJleHBvcnQgY2xhc3MgVG91Y2hEcmFnQW5kRHJvcCB7XG4gIHByaXZhdGUgdG91Y2hTdGFydFRpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgdGhlIGZpcnN0IHRvdWNoXG4gIHByaXZhdGUgdG91Y2hTdGFydFBvaW50ID0gbnVsbDsgLy8gUG9pbnQgb2YgdGhlIGZpcnN0IHRvdWNoXG4gIHByaXZhdGUgbGFzdENsaWNrVGltZSA9IDA7IC8vIFRpbWVzdGFtcCBvZiB0aGUgcHJldmlvdXMgY2xpY2tcbiAgcHJpdmF0ZSBpc0RyYWdnYWJsZSA9IGZhbHNlOyAvLyBXaGV0aGVyIGEgZHJhZ2dhYmxlIGVsZW1lbnQgaXMgYWN0aXZlXG4gIHByaXZhdGUgZHJhZ1NvdXJjZTogSFRNTEVsZW1lbnQgPSBudWxsOyAvLyBUaGUgc291cmNlIGVsZW1lbnQgYmVpbmcgZHJhZ2dlZFxuICBwcml2YXRlIGRyYWdDbG9uZTogSFRNTEVsZW1lbnQgPSBudWxsOyAvLyBDbG9uZSBvZiBkcmFnIHNvdXJjZSBmb3IgdmlzdWFsIGZlZWRiYWNrXG4gIHByaXZhdGUgdG91Y2hFbmRUcmlnZ2VyZWQgPSBmYWxzZTsgLy8gRmxhZyBmb3IgdG91Y2hFbmQgZXZlbnRcbiAgcHJpdmF0ZSBpc0RyYWdnaW5nID0gZmFsc2U7IC8vIFdoZXRoZXIgYSBkcmFnIG9wZXJhdGlvbiBpcyBvbmdvaW5nXG4gIHByaXZhdGUgaW5pdGlhbFRyYW5zZm9ybSA9ICcnOyAvLyBPcmlnaW5hbCB0cmFuc2Zvcm0gc3R5bGVcbiAgcHJpdmF0ZSBoYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0ID0gZmFsc2U7IC8vIEZsYWcgdG8gZW5zdXJlIGRyYWdzdGFydCBldmVudCBpcyBkaXNwYXRjaGVkIG9uY2VcbiAgcHJpdmF0ZSByb290Tm9kZTogTm9kZSA9IG51bGw7IC8vIFJvb3Qgbm9kZSBmb3IgYm91bmRhcnkgY2FsY3VsYXRpb25zXG5cbiAgcHJpdmF0ZSBmb2N1c2VkRWxlbWVudDogSFRNTEVsZW1lbnQgPSBudWxsOyAvLyBUbyBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50bHkgZm9jdXNlZCBkcmFnZ2FibGUgZWxlbWVudFxuICBwcml2YXRlIGZvY3VzYWJsZURyb3Bab25lczogSFRNTEVsZW1lbnRbXSA9IFtdOyAvLyBBbGwgZHJvcHpvbmVzIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gIHByaXZhdGUgY3VycmVudERyb3Bab25lSW5kZXggPSAtMTsgLy8gSW5kZXggZm9yIHRhYmJpbmcgdGhyb3VnaCBkcm9wIHpvbmVzXG5cbiAgcHJpdmF0ZSBkYXRhVHJhbnNmZXIgPSB7XG4gICAgZGF0YToge30sXG4gICAgc2V0RGF0YSh0eXBlLCB2YWwpIHtcbiAgICAgIHRoaXMuZGF0YVt0eXBlXSA9IHZhbDtcbiAgICB9LFxuICAgIGdldERhdGEodHlwZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0eXBlXTtcbiAgICB9LFxuICAgIGVmZmVjdEFsbG93ZWQ6ICdtb3ZlJ1xuICB9O1xuICBwcml2YXRlIGNsb25lT2Zmc2V0ID0geyB4OiAwLCB5OiAwIH07IC8vIE9mZnNldCBmb3IgcG9zaXRpb25pbmcgdGhlIGRyYWcgY2xvbmVcblxuICBwcml2YXRlIGxhc3RUYXJnZXQgPSBudWxsOyAvLyBMYXN0IHRvdWNoIHRhcmdldFxuICBwcml2YXRlIGN1cnJlbnREcm9wVGFyZ2V0ID0gbnVsbDsgLy8gQ3VycmVudCBkcm9wcGFibGUgZWxlbWVudFxuICBwcml2YXRlIGFsbG93Q2xpY2sgPSB0cnVlOyAvLyBGbGFnIHRvIGFsbG93IG9yIHByZXZlbnQgY2xpY2tcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFRvdWNoRHJhZ0FuZERyb3A7XG5cbiAgY29weVN0eWxlc0ZvckRyYWdDbG9uZSA9IHRydWU7XG4gIGRyYWdPbkNsaWNrRW5hYmxlZCA9IGZhbHNlO1xuICB1c2VEcmFnQ2xvbmUgPSBmYWxzZTsgLy8gU2V0IHRvIHRydWUgdG8gZHJhZyB3aXRoIGEgY2xvbmU7IHNldCB0byBmYWxzZSB0byBkcmFnIHRoZSBvcmlnaW5hbCBlbGVtZW50XG5cbiAgcHJpdmF0ZSByZWFkb25seSBNSU5fRFJBR19ESVNUQU5DRSA9IDU7IC8vIE1pbmltdW0gcGl4ZWwgbW92ZW1lbnQgdG8gc3RhcnQgZHJhZ2dpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBEUkFHX0NMT05FX09QQUNJVFkgPSAxOyAvLyBPcGFjaXR5IG9mIHRoZSBkcmFnIGNsb25lIGVsZW1lbnRcbiAgaW5pdGlhbFRyYW5zaXRpb246IHN0cmluZztcbiAgLy8gZHJvcHBhYmxlczogRWxlbWVudFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmIChUb3VjaERyYWdBbmREcm9wLmluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gVG91Y2hEcmFnQW5kRHJvcC5pbnN0YW5jZTtcbiAgICB9XG4gICAgVG91Y2hEcmFnQW5kRHJvcC5pbnN0YW5jZSA9IHRoaXM7XG5cbiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJzIGZvciB0b3VjaCBhbmQgbW91c2UgaW50ZXJhY3Rpb25zXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVUb3VjaE1vdmUuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZVRvdWNoTW92ZS5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVUb3VjaEVuZC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmhhbmRsZVRvdWNoRW5kLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLmhhbmRsZVRvdWNoQ2FuY2VsLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duLmJpbmQodGhpcykpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5oYW5kbGVLZXlVcC5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGFkZERyYWdnYWJsZUVsZW1lbnRzKGRyYWdnYWJsZXM6IEVsZW1lbnRbXSkge1xuICAgIGRyYWdnYWJsZXMuZm9yRWFjaChlbCA9PiB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTsgLy8gTWFrZSBkcmFnZ2FibGUgZWxlbWVudHMgZm9jdXNhYmxlXG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsICgpID0+ICh0aGlzLmZvY3VzZWRFbGVtZW50ID0gZWwgYXMgSFRNTEVsZW1lbnQpKTtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IG51bGwpKTtcblxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBhZGREcm9wcGFibGVFbGVtZW50cyhkcm9wcGFibGVzOiBFbGVtZW50W10pIHtcbiAgLy8gICAvLyB0aGlzLmRyb3BwYWJsZXMgPSBkcm9wcGFibGVzO1xuICAvLyAgIGRyb3BwYWJsZXMuZm9yRWFjaChlbCA9PiB7XG4gIC8vICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTsgLy8gTWFrZSBkcmFnZ2FibGUgZWxlbWVudHMgZm9jdXNhYmxlXG4gIC8vICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsICgpID0+ICh0aGlzLmZvY3VzZWRFbGVtZW50ID0gZWwgYXMgSFRNTEVsZW1lbnQpKTtcbiAgLy8gICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiAodGhpcy5mb2N1c2VkRWxlbWVudCA9IG51bGwpKTtcblxuICAvLyAgICAgLy8gZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAvLyAgICAgLy8gZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoU3RhcnQoZSkge1xuICAgIHRoaXMudG91Y2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5nZXRFdmVudENvb3JkaW5hdGVzKGUpO1xuICAgIHRoaXMudG91Y2hTdGFydFBvaW50ID0geyB4LCB5IH07XG4gICAgdGhpcy5kcmFnU291cmNlID0gZS5jdXJyZW50VGFyZ2V0O1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0cnVlO1xuXG4gICAgLy8gR2V0IHRoZSByb290IG5vZGVcbiAgICB0aGlzLnJvb3ROb2RlID0gdGhpcy5kcmFnU291cmNlLmdldFJvb3ROb2RlKCk7XG5cbiAgICBpZiAodGhpcy5kcmFnT25DbGlja0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB0aGlzLmNyZWF0ZURyYWdDbG9uZShlLCB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnVzZURyYWdDbG9uZSkge1xuICAgICAgLy8gU2F2ZSBpbml0aWFsIHRyYW5zZm9ybVxuICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZHJhZ1NvdXJjZSk7XG4gICAgICB0aGlzLmluaXRpYWxUcmFuc2Zvcm0gPSBjb21wdXRlZFN0eWxlLnRyYW5zZm9ybSA9PT0gJ25vbmUnID8gJycgOiBjb21wdXRlZFN0eWxlLnRyYW5zZm9ybTtcblxuICAgICAgLy8gU2F2ZSB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbiBzdHlsZVxuICAgICAgdGhpcy5pbml0aWFsVHJhbnNpdGlvbiA9IGNvbXB1dGVkU3R5bGUudHJhbnNpdGlvbiB8fCAnJztcblxuICAgICAgLy8gRGlzYWJsZSB0cmFuc2l0aW9uc1xuICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zaXRpb24gPSAnbm9uZSc7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBjbG9uZSBvZmZzZXRcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmRyYWdTb3VyY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLmNsb25lT2Zmc2V0LnggPSB4IC0gcmVjdC5sZWZ0O1xuICAgICAgdGhpcy5jbG9uZU9mZnNldC55ID0geSAtIHJlY3QudG9wO1xuXG4gICAgICAvLyBTZXQgaGlnaGVyIHotaW5kZXggdG8gYnJpbmcgaXQgb24gdG9wXG4gICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUuekluZGV4ID0gJzk5OTknO1xuICAgICAgLy8gdGhpcy5kcmFnU291cmNlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7IC8vIFNvIGl0IGRvZXNuJ3QgYmxvY2sgZXZlbnRzXG4gICAgICB0aGlzLmRyYWdTb3VyY2UuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVRvdWNoTW92ZShlKSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnZ2FibGUgJiYgdGhpcy5kcmFnU291cmNlKSB7XG4gICAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuZ2V0RXZlbnRDb29yZGluYXRlcyhlKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRUb3VjaCA9IHsgY2xpZW50WDogeCwgY2xpZW50WTogeSB9O1xuXG4gICAgICBpZiAodGhpcy5jYWxjdWxhdGVEcmFnRGlzdGFuY2UoY3VycmVudFRvdWNoKSA+PSB0aGlzLk1JTl9EUkFHX0RJU1RBTkNFKSB7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnOyAvLyBTbyBpdCBkb2Vzbid0IGJsb2NrIGV2ZW50c1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNyZWF0ZURyYWdDbG9uZShlLCBjdXJyZW50VG91Y2gpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRHJhZ0Nsb25lKGUsIGN1cnJlbnRUb3VjaDogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9KSB7XG4gICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnVzZURyYWdDbG9uZSkge1xuICAgICAgLy8gRXhpc3RpbmcgY29kZSBmb3IgY3JlYXRpbmcgYW5kIGhhbmRsaW5nIHRoZSBkcmFnIGNsb25lXG4gICAgICBpZiAoIXRoaXMuZHJhZ0Nsb25lKSB7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5vcGFjaXR5ID0gdGhpcy5EUkFHX0NMT05FX09QQUNJVFkudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmUgPSB0aGlzLmRyYWdTb3VyY2UuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLmNvcHlTdHlsZXNGb3JEcmFnQ2xvbmUpIHtcbiAgICAgICAgICBjb25zdCBjb21wdXRlZFN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZHJhZ1NvdXJjZSk7XG4gICAgICAgICAgZm9yIChjb25zdCBzdHlsZSBvZiBjb21wdXRlZFN0eWxlcykge1xuICAgICAgICAgICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGVbc3R5bGVdID0gY29tcHV0ZWRTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTW92ZSB0aGUgZHJhZyBjbG9uZSB0byB0aGUgcm9vdCBub2RlXG4gICAgICAgIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgIC8vIEFwcGVuZCB0byB0aGUgaG9zdCBvZiB0aGUgc2hhZG93IHJvb3RcbiAgICAgICAgICB0aGlzLnJvb3ROb2RlLmhvc3QuYXBwZW5kQ2hpbGQodGhpcy5kcmFnQ2xvbmUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5kcmFnQ2xvbmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdGVDbG9uZVBvc2l0aW9uKGN1cnJlbnRUb3VjaCk7XG4gICAgICAgIHRoaXMuc2V0RHJhZ0Nsb25lU3R5bGVzKGN1cnJlbnRUb3VjaCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnc3RhcnQnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVEcmFnQ2xvbmVQb3NpdGlvbihjdXJyZW50VG91Y2gpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIYW5kbGUgZHJhZ2dpbmcgdGhlIG9yaWdpbmFsIGVsZW1lbnQgdXNpbmcgQ1NTIHRyYW5zZm9ybXNcbiAgICAgIGlmICh0aGlzLnRvdWNoU3RhcnRQb2ludCkge1xuICAgICAgICBjb25zdCBkZWx0YVggPSBjdXJyZW50VG91Y2guY2xpZW50WCAtIHRoaXMudG91Y2hTdGFydFBvaW50Lng7XG4gICAgICAgIGNvbnN0IGRlbHRhWSA9IGN1cnJlbnRUb3VjaC5jbGllbnRZIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueTtcblxuICAgICAgICAvLyBBcHBseSBib3VuZGFyaWVzXG4gICAgICAgIC8vIGNvbnN0IHsgYm91bmRlZERlbHRhWCwgYm91bmRlZERlbHRhWSB9ID0gdGhpcy5hcHBseVRyYW5zZm9ybUJvdW5kYXJpZXMoZGVsdGFYLCBkZWx0YVkpO1xuICAgICAgICAvLyB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNmb3JtID0gYCR7dGhpcy5pbml0aWFsVHJhbnNmb3JtfSB0cmFuc2xhdGUoJHtib3VuZGVkRGVsdGFYfXB4LCAke2JvdW5kZWREZWx0YVl9cHgpYDtcblxuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUudHJhbnNmb3JtID0gYCR7dGhpcy5pbml0aWFsVHJhbnNmb3JtfSB0cmFuc2xhdGUoJHtkZWx0YVh9cHgsICR7ZGVsdGFZfXB4KWA7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhhc0Rpc3BhdGNoZWREcmFnU3RhcnQpIHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ3N0YXJ0Jyk7XG4gICAgICAgICAgdGhpcy5oYXNEaXNwYXRjaGVkRHJhZ1N0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRyb3BUYXJnZXQgPSB0aGlzLmZpbmREcm9wVGFyZ2V0KGUpO1xuXG4gICAgaWYgKGRyb3BUYXJnZXQgIT09IHRoaXMubGFzdFRhcmdldCkge1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KGRyb3BUYXJnZXQsICdkcmFnZW50ZXInKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmxhc3RUYXJnZXQsICdkcmFnbGVhdmUnKTtcbiAgICAgIHRoaXMubGFzdFRhcmdldCA9IGRyb3BUYXJnZXQ7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50RHJvcFRhcmdldCA9IGRyb3BUYXJnZXQ7XG4gICAgaWYgKHRoaXMuY3VycmVudERyb3BUYXJnZXQpIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudChkcm9wVGFyZ2V0LCAnZHJhZ292ZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hFbmQoZSkge1xuICAgIHRoaXMudG91Y2hFbmRUcmlnZ2VyZWQgPSB0cnVlO1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSBmYWxzZTtcbiAgICBsZXQgZHJvcEZvdW5kID0gZmFsc2U7XG5cbiAgICAvLyBjb25zb2xlLmxvZygnZHJvcEZvdW5kJywgZHJvcEZvdW5kKTtcblxuICAgIGlmICh0aGlzLmN1cnJlbnREcm9wVGFyZ2V0KSB7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5jdXJyZW50RHJvcFRhcmdldCwgJ2Ryb3AnKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnZW5kJyk7XG4gICAgICBkcm9wRm91bmQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICBjb25zdCBkcmFnRW5kRXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ2RyYWdlbmQnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgICBkcmFnRW5kRXZlbnRbJ2RhdGFUcmFuc2ZlciddID0geyBkcm9wRWZmZWN0OiAnbm9uZScgfTtcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZT8uZGlzcGF0Y2hFdmVudChkcmFnRW5kRXZlbnQpO1xuICAgIH1cblxuICAgIHRoaXMucmVzZXREcmFnU3RhdGUoZHJvcEZvdW5kKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVG91Y2hDYW5jZWwoZSkge1xuICAgIHRoaXMucmVzZXREcmFnU3RhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZERyb3BUYXJnZXQoZXZlbnQpIHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuZ2V0RXZlbnRDb29yZGluYXRlcyhldmVudCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RHJvcFRhcmdldEF0UG9pbnQoZG9jdW1lbnQsIHgsIHkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREcm9wVGFyZ2V0QXRQb2ludChyb290OiBEb2N1bWVudE9yU2hhZG93Um9vdCwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGRlcHRoOiBudW1iZXIgPSAwKTogRWxlbWVudCB8IG51bGwge1xuICAgIC8vIExpbWl0IHRoZSByZWN1cnNpb24gZGVwdGhcbiAgICBjb25zdCBNQVhfREVQVEggPSAyO1xuICAgIGlmIChkZXB0aCA+IE1BWF9ERVBUSCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IHJvb3QuZWxlbWVudEZyb21Qb2ludCh4LCB5KSBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkcm9wem9uZScpKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBUcmF2ZXJzZSB1cCB0aGUgRE9NIHRyZWUgdG8gZmluZCBhbiBhbmNlc3RvciB3aXRoICdkcm9wem9uZScgYXR0cmlidXRlXG4gICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCkge1xuICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZHJvcHpvbmUnKSkge1xuICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7XG4gICAgICB9XG4gICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgU2hhZG93IERPTSBhbmQgZGVwdGggbGltaXQgbm90IHJlYWNoZWQsIHRyYXZlcnNlIGl0XG4gICAgaWYgKGVsZW1lbnQuc2hhZG93Um9vdCAmJiBkZXB0aCA8IE1BWF9ERVBUSCkge1xuICAgICAgY29uc3Qgc2hhZG93RWxlbWVudCA9IHRoaXMuZ2V0RHJvcFRhcmdldEF0UG9pbnQoZWxlbWVudC5zaGFkb3dSb290LCB4LCB5LCBkZXB0aCArIDEpO1xuICAgICAgaWYgKHNoYWRvd0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHNoYWRvd0VsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm8gZWxlbWVudCB3aXRoICdkcm9wem9uZScgZm91bmRcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlS2V5RG93bihlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZm9jdXNlZEVsZW1lbnQpIHtcbiAgICAgIGlmIChlLmtleSA9PT0gJyAnICYmICF0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgLy8gU3BhY2ViYXIgcHJlc3NlZCB0byBzdGFydCBkcmFnZ2luZ1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2UgPSB0aGlzLmZvY3VzZWRFbGVtZW50O1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuXG4gICAgICAgIC8vIFN0b3JlIHRoZSBkcm9wIHpvbmVzIGZvciBuYXZpZ2F0aW9uXG4gICAgICAgIHRoaXMuY29sbGVjdERyb3Bab25lcygpO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgZHJhZ3N0YXJ0IGV2ZW50XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLmRyYWdTb3VyY2UsICdkcmFnc3RhcnQnKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdUYWInICYmIHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAvLyBUYWIga2V5IHRvIG5hdmlnYXRlIHRocm91Z2ggZHJvcCB6b25lc1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMubW92ZVRvTmV4dERyb3Bab25lKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVLZXlVcChlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGUua2V5ID09PSAnICcgJiYgdGhpcy5pc0RyYWdnaW5nICYmIHRoaXMuY3VycmVudERyb3BUYXJnZXQpIHtcbiAgICAgIC8vIFNwYWNlYmFyIHByZXNzZWQgYWdhaW4gdG8gZHJvcCB0aGUgZWxlbWVudFxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5kaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMuY3VycmVudERyb3BUYXJnZXQsICdkcm9wJyk7XG4gICAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcy5kcmFnU291cmNlLCAnZHJhZ2VuZCcpO1xuICAgICAgdGhpcy5yZXNldERyYWdTdGF0ZSh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3REcm9wWm9uZXMoKSB7XG4gICAgLy8gQ29sbGVjdCBhbGwgZWxlbWVudHMgd2l0aCBkcm9wem9uZSBhdHRyaWJ1dGVcbiAgICB0aGlzLmZvY3VzYWJsZURyb3Bab25lcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2Ryb3B6b25lXScpKSBhcyBIVE1MRWxlbWVudFtdOyAvLyBBcnJheS5mcm9tKHRoaXMuZHJvcHBhYmxlcyk7XG4gICAgdGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleCA9IC0xOyAvLyBSZXNldCBuYXZpZ2F0aW9uIGluZGV4XG4gIH1cblxuICBwcml2YXRlIG1vdmVUb05leHREcm9wWm9uZSgpIHtcbiAgICBpZiAodGhpcy5mb2N1c2FibGVEcm9wWm9uZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAvLyBVcGRhdGUgaW5kZXggZm9yIHRoZSBuZXh0IGRyb3Agem9uZVxuICAgIHRoaXMuY3VycmVudERyb3Bab25lSW5kZXggPSAodGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleCArIDEpICUgdGhpcy5mb2N1c2FibGVEcm9wWm9uZXMubGVuZ3RoO1xuXG4gICAgLy8gRm9jdXMgdGhlIG5leHQgZHJvcCB6b25lXG4gICAgY29uc3QgbmV4dERyb3Bab25lID0gdGhpcy5mb2N1c2FibGVEcm9wWm9uZXNbdGhpcy5jdXJyZW50RHJvcFpvbmVJbmRleF07XG4gICAgbmV4dERyb3Bab25lLmZvY3VzKCk7XG5cbiAgICAvLyBVcGRhdGUgY3VycmVudCBkcm9wIHRhcmdldFxuICAgIHRoaXMuY3VycmVudERyb3BUYXJnZXQgPSBuZXh0RHJvcFpvbmU7XG5cbiAgICAvLyBEaXNwYXRjaCBkcmFnZW50ZXIgZXZlbnRcbiAgICB0aGlzLmRpc3BhdGNoQ3VzdG9tRXZlbnQobmV4dERyb3Bab25lLCAnZHJhZ2VudGVyJyk7XG4gIH1cblxuICBwcml2YXRlIGdldEV2ZW50Q29vcmRpbmF0ZXMoZXZlbnQsIHBhZ2UgPSBmYWxzZSkge1xuICAgIGNvbnN0IHRvdWNoID0gZXZlbnQudG91Y2hlcyA/IGV2ZW50LnRvdWNoZXNbMF0gOiBldmVudDtcbiAgICByZXR1cm4ge1xuICAgICAgeDogcGFnZSA/IHRvdWNoLnBhZ2VYIDogdG91Y2guY2xpZW50WCxcbiAgICAgIHk6IHBhZ2UgPyB0b3VjaC5wYWdlWSA6IHRvdWNoLmNsaWVudFlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVDbG9uZVBvc2l0aW9uKHRvdWNoKSB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZHJhZ1NvdXJjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLmNsb25lT2Zmc2V0LnggPSB0b3VjaC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIHRoaXMuY2xvbmVPZmZzZXQueSA9IHRvdWNoLmNsaWVudFkgLSByZWN0LnRvcDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RHJhZ0Nsb25lU3R5bGVzKHRvdWNoKSB7XG4gICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnRvcCA9IGAke3RvdWNoLmNsaWVudFkgLSB0aGlzLmNsb25lT2Zmc2V0Lnl9cHhgO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLmxlZnQgPSBgJHt0b3VjaC5jbGllbnRYIC0gdGhpcy5jbG9uZU9mZnNldC54fXB4YDtcbiAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgIHRoaXMuZHJhZ0Nsb25lLnN0eWxlLnpJbmRleCA9ICc5OTk5OTknO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcmFnQ2xvbmVQb3NpdGlvbih0b3VjaCkge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50b3VjaEVuZFRyaWdnZXJlZCB8fCAhdGhpcy5kcmFnQ2xvbmUpIHJldHVybjtcblxuICAgICAgY29uc3QgbmV3TGVmdCA9IHRvdWNoLmNsaWVudFggLSB0aGlzLmNsb25lT2Zmc2V0Lng7XG4gICAgICBjb25zdCBuZXdUb3AgPSB0b3VjaC5jbGllbnRZIC0gdGhpcy5jbG9uZU9mZnNldC55O1xuXG4gICAgICAvLyBBcHBseSBib3VuZGFyaWVzXG4gICAgICBjb25zdCB7IG5ld0xlZnQ6IGJvdW5kZWRMZWZ0LCBuZXdUb3A6IGJvdW5kZWRUb3AgfSA9IHRoaXMuYXBwbHlCb3VuZGFyaWVzKG5ld0xlZnQsIG5ld1RvcCwgdGhpcy5kcmFnQ2xvbmUpO1xuXG4gICAgICB0aGlzLmRyYWdDbG9uZS5zdHlsZS5sZWZ0ID0gYCR7Ym91bmRlZExlZnR9cHhgO1xuICAgICAgdGhpcy5kcmFnQ2xvbmUuc3R5bGUudG9wID0gYCR7Ym91bmRlZFRvcH1weGA7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VHJhbnNmb3JtQm91bmRhcmllcyhkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIpIHtcbiAgICAvLyBHZXQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHJvb3Qgbm9kZVxuICAgIGxldCBib3VuZGFyeVJlY3Q6IERPTVJlY3Q7XG4gICAgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSB0aGlzLnJvb3ROb2RlLmhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCB0byB2aWV3cG9ydFxuICAgICAgYm91bmRhcnlSZWN0ID0gbmV3IERPTVJlY3QoMCwgMCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb25zIGFuZCBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudFxuICAgIGNvbnN0IGVsZW1lbnRSZWN0ID0gdGhpcy5kcmFnU291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IGVsZW1lbnRSZWN0LndpZHRoO1xuICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSBlbGVtZW50UmVjdC5oZWlnaHQ7XG5cbiAgICAvLyBDYWxjdWxhdGUgcG90ZW50aWFsIG5ldyBwb3NpdGlvblxuICAgIGNvbnN0IG5ld0xlZnQgPSBlbGVtZW50UmVjdC5sZWZ0ICsgZGVsdGFYO1xuICAgIGNvbnN0IG5ld1RvcCA9IGVsZW1lbnRSZWN0LnRvcCArIGRlbHRhWTtcblxuICAgIC8vIExpbWl0IHRoZSBuZXcgcG9zaXRpb24gd2l0aGluIHRoZSBib3VuZGFyaWVzXG4gICAgY29uc3QgYm91bmRlZExlZnQgPSBNYXRoLm1heChib3VuZGFyeVJlY3QubGVmdCwgTWF0aC5taW4obmV3TGVmdCwgYm91bmRhcnlSZWN0LnJpZ2h0IC0gZWxlbWVudFdpZHRoKSk7XG4gICAgY29uc3QgYm91bmRlZFRvcCA9IE1hdGgubWF4KGJvdW5kYXJ5UmVjdC50b3AsIE1hdGgubWluKG5ld1RvcCwgYm91bmRhcnlSZWN0LmJvdHRvbSAtIGVsZW1lbnRIZWlnaHQpKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYm91bmRlZCBkZWx0YSB2YWx1ZXNcbiAgICBjb25zdCBib3VuZGVkRGVsdGFYID0gYm91bmRlZExlZnQgLSBlbGVtZW50UmVjdC5sZWZ0O1xuICAgIGNvbnN0IGJvdW5kZWREZWx0YVkgPSBib3VuZGVkVG9wIC0gZWxlbWVudFJlY3QudG9wO1xuXG4gICAgcmV0dXJuIHsgYm91bmRlZERlbHRhWCwgYm91bmRlZERlbHRhWSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUJvdW5kYXJpZXMobmV3TGVmdDogbnVtYmVyLCBuZXdUb3A6IG51bWJlciwgZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAvLyBHZXQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHJvb3Qgbm9kZVxuICAgIGxldCBib3VuZGFyeVJlY3Q6IERPTVJlY3Q7XG4gICAgaWYgKHRoaXMucm9vdE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICBib3VuZGFyeVJlY3QgPSB0aGlzLnJvb3ROb2RlLmhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJvb3ROb2RlIGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICAgIGJvdW5kYXJ5UmVjdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCB0byB2aWV3cG9ydFxuICAgICAgYm91bmRhcnlSZWN0ID0gbmV3IERPTVJlY3QoMCwgMCwgd2luZG93LmlubmVyV2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbGVtZW50XG4gICAgY29uc3QgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IGVsZW1lbnRSZWN0LndpZHRoO1xuICAgIGNvbnN0IGVsZW1lbnRIZWlnaHQgPSBlbGVtZW50UmVjdC5oZWlnaHQ7XG5cbiAgICAvLyBMaW1pdCB0aGUgbmV3TGVmdCBhbmQgbmV3VG9wIHdpdGhpbiB0aGUgYm91bmRhcmllc1xuICAgIGNvbnN0IGJvdW5kZWRMZWZ0ID0gTWF0aC5tYXgoYm91bmRhcnlSZWN0LmxlZnQsIE1hdGgubWluKG5ld0xlZnQsIGJvdW5kYXJ5UmVjdC5yaWdodCAtIGVsZW1lbnRXaWR0aCkpO1xuICAgIGNvbnN0IGJvdW5kZWRUb3AgPSBNYXRoLm1heChib3VuZGFyeVJlY3QudG9wLCBNYXRoLm1pbihuZXdUb3AsIGJvdW5kYXJ5UmVjdC5ib3R0b20gLSBlbGVtZW50SGVpZ2h0KSk7XG5cbiAgICByZXR1cm4geyBuZXdMZWZ0OiBib3VuZGVkTGVmdCwgbmV3VG9wOiBib3VuZGVkVG9wIH07XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZURyYWdEaXN0YW5jZSh0b3VjaCk6IG51bWJlciB7XG4gICAgY29uc3QgeERpc3QgPSBNYXRoLmFicyh0b3VjaC5jbGllbnRYIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueCk7XG4gICAgY29uc3QgeURpc3QgPSBNYXRoLmFicyh0b3VjaC5jbGllbnRZIC0gdGhpcy50b3VjaFN0YXJ0UG9pbnQueSk7XG4gICAgcmV0dXJuIHhEaXN0ICsgeURpc3Q7XG4gIH1cblxuICBwcml2YXRlIGRpc3BhdGNoQ3VzdG9tRXZlbnQoZWxlbWVudCwgZXZlbnRUeXBlLCBidWJibGUgPSB0cnVlKSB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnRUeXBlLCB7IGJ1YmJsZXM6IGJ1YmJsZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICBldmVudFsnZGF0YVRyYW5zZmVyJ10gPSB0aGlzLmRhdGFUcmFuc2ZlcjtcbiAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldERyYWdTdGF0ZShkcm9wRm91bmQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgIGlmICh0aGlzLnVzZURyYWdDbG9uZSkge1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUub3BhY2l0eSA9ICcxLjAnO1xuICAgICAgICB0aGlzLmRyYWdDbG9uZT8ucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmRyYWdDbG9uZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHN0eWxlc1xuICAgICAgICBpZiAoIWRyb3BGb3VuZCkgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICB0aGlzLmRyYWdTb3VyY2Uuc3R5bGUuekluZGV4ID0gJyc7XG4gICAgICAgIHRoaXMuZHJhZ1NvdXJjZS5zdHlsZS5wb2ludGVyRXZlbnRzID0gJyc7XG4gICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHRyYW5zaXRpb24gc3R5bGVcbiAgICAgICAgdGhpcy5kcmFnU291cmNlLnN0eWxlLnRyYW5zaXRpb24gPSB0aGlzLmluaXRpYWxUcmFuc2l0aW9uO1xuXG4gICAgICAgIC8vIFJlc2V0IHRoZSBvcmlnaW5hbCB0cmFuc2l0aW9uIHByb3BlcnR5XG4gICAgICAgIHRoaXMuaW5pdGlhbFRyYW5zaXRpb24gPSAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmRyYWdTb3VyY2UgPSBudWxsO1xuICAgIHRoaXMuZHJhZ0Nsb25lID0gbnVsbDtcbiAgICB0aGlzLmlzRHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgdGhpcy50b3VjaFN0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy50b3VjaFN0YXJ0UG9pbnQgPSBudWxsO1xuICAgIHRoaXMudG91Y2hFbmRUcmlnZ2VyZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRhdGFUcmFuc2ZlciA9IHtcbiAgICAgIGRhdGE6IHt9LFxuICAgICAgc2V0RGF0YSh0eXBlLCB2YWwpIHtcbiAgICAgICAgdGhpcy5kYXRhW3R5cGVdID0gdmFsO1xuICAgICAgfSxcbiAgICAgIGdldERhdGEodHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhW3R5cGVdO1xuICAgICAgfSxcbiAgICAgIGVmZmVjdEFsbG93ZWQ6ICdtb3ZlJ1xuICAgIH07XG4gICAgdGhpcy5jbG9uZU9mZnNldCA9IHsgeDogMCwgeTogMCB9O1xuICAgIHRoaXMubGFzdFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50RHJvcFRhcmdldCA9IG51bGw7XG4gICAgdGhpcy5hbGxvd0NsaWNrID0gdHJ1ZTtcbiAgICB0aGlzLmluaXRpYWxUcmFuc2Zvcm0gPSAnJztcbiAgICB0aGlzLmhhc0Rpc3BhdGNoZWREcmFnU3RhcnQgPSBmYWxzZTtcblxuICAgIHRoaXMucm9vdE5vZGUgPSBudWxsO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5kZWNsYXJlIGNsYXNzIERyb3BwYWJsZXNJbnRlcmZhY2Uge31cblxuZXhwb3J0IGNvbnN0IERyb3BwYWJsZXNNaXhpbiA9IDxUIGV4dGVuZHMgQ29uc3RydWN0b3I8SW50ZXJhY3Rpb24+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgdXNlU2hhZG93Um9vdDogYm9vbGVhbixcbiAgZHJvcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmdcbikgPT4ge1xuICBhYnN0cmFjdCBjbGFzcyBEcm9wcGFibGVzRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0pIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG4gICAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcblxuICAgICAgY29uc3QgZHJvcHBhYmxlcyA9IHRoaXMuZ2V0RHJvcHBhYmxlRWxlbWVudHMoKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUV2ZW50SGFuZGxlcnMoKTtcbiAgICAgIGRyb3BwYWJsZXMuZm9yRWFjaChkcm9wcGFibGUgPT4ge1xuICAgICAgICB0aGlzLnByZXBhcmVEcm9wcGFibGUoZHJvcHBhYmxlKTtcbiAgICAgICAgdGhpcy5vYnNlcnZlRHJvcHBhYmxlQXR0cmlidXRlcyhkcm9wcGFibGUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc01hdGNoVGFidWxhcigpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERyb3BwYWJsZUVsZW1lbnRzKCk6IEVsZW1lbnRbXSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgICAgdXNlU2hhZG93Um9vdCA/IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcikgOiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemVFdmVudEhhbmRsZXJzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnb3ZlckhhbmRsZXIgPSB0aGlzLmRyYWdvdmVySGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5kcmFnbGVhdmVIYW5kbGVyID0gdGhpcy5kcmFnbGVhdmVIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRyYWdlbnRlckhhbmRsZXIgPSB0aGlzLmRyYWdlbnRlckhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuZHJvcEhhbmRsZXIgPSB0aGlzLmRyb3BIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVwYXJlRHJvcHBhYmxlKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnZHJvcHpvbmUnLCAnbW92ZScpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMuZHJhZ2xlYXZlSGFuZGxlcik7XG4gICAgICB0aGlzLmF0dGFjaEV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvYnNlcnZlRHJvcHBhYmxlQXR0cmlidXRlcyhkcm9wcGFibGU6IEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaCgoeyBhdHRyaWJ1dGVOYW1lIH0pID0+IHtcbiAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVEcm9wcGFibGVIYW5kbGVycyhkcm9wcGFibGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShkcm9wcGFibGUsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZURyb3BwYWJsZUhhbmRsZXJzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgY29uc3QgZGlzYWJsZWQgPSBkcm9wcGFibGUuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGF0dGFjaEV2ZW50TGlzdGVuZXJzKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5kcmFnb3ZlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMuZHJhZ2VudGVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoZHJvcHBhYmxlOiBFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdvdmVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5kcmFnZW50ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wSGFuZGxlcik7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc01hdGNoVGFidWxhcigpKSByZXR1cm47XG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5vYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ2VudGVySGFuZGxlcihldjogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ292ZXJIYW5kbGVyKGV2OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmFjdGl2YXRlRHJvcHBhYmxlKGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZURyb3BwYWJsZShkcm9wcGFibGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdhY3RpdmUnLCAnJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkcm9wSGFuZGxlcihldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSBldi5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dCcpO1xuICAgICAgY29uc3QgZHJhZ2dhYmxlID0gdGhpcy5maW5kRHJhZ2dhYmxlKGlkZW50aWZpZXIpO1xuICAgICAgLy8gY29uc29sZS5sb2codGhpcy5pc1ZhbGlkRHJvcChkcm9wcGFibGUsIGRyYWdnYWJsZSkpO1xuXG4gICAgICBpZiAoIWRyYWdnYWJsZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGRyYWdnYWJsZSAmJiAhdGhpcy5pc1ZhbGlkRHJvcChkcm9wcGFibGUsIGRyYWdnYWJsZSkpIHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMubW92ZURyYWdnYWJsZVRvRHJvcHBhYmxlKGRyYWdnYWJsZSwgZHJvcHBhYmxlKTtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyb3BwYWJsZShkcm9wcGFibGUpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZERyYWdnYWJsZShpZGVudGlmaWVyOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgaWYgKCFpZGVudGlmaWVyKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMucXVlcnlTZWxlY3RvcihgW2lkZW50aWZpZXI9JHtpZGVudGlmaWVyfV1gKSB8fCB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgW2lkZW50aWZpZXI9JHtpZGVudGlmaWVyfV1gKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVmFsaWREcm9wKGRyb3BwYWJsZTogSFRNTEVsZW1lbnQsIGRyYWdnYWJsZTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBkcmFnZ2FibGUucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSAhPT0gZHJvcHBhYmxlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbW92ZURyYWdnYWJsZVRvRHJvcHBhYmxlKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIGRyb3BwYWJsZTogSFRNTEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IG1vdmVFbGVtZW50ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIGRyb3BwYWJsZS5hcHBlbmRDaGlsZChkcmFnZ2FibGUpO1xuXG4gICAgICAgIC8vIGNoZWNrTWF4QXNzb2NpYXRpb25zIGFuZCBzYXZlUmVzcG9uc2UgYXJlIGRlZmluZWQvb3ZlcnJpZGRlbiBpbiBhIG1peGluXG4gICAgICAgIHRoaXNbJ2NoZWNrTWF4QXNzb2NpYXRpb25zJ10oKTtcbiAgICAgICAgdGhpc1snc2F2ZVJlc3BvbnNlJ10obnVsbCk7IC8vXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgbW92ZUVsZW1lbnQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmFuc2l0aW9uID0gZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihtb3ZlRWxlbWVudCk7XG4gICAgICBhd2FpdCB0cmFuc2l0aW9uLmZpbmlzaGVkO1xuXG4gICAgICAvLyB0aGlzWydjaGVja01heEFzc29jaWF0aW9ucyddKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWFjdGl2YXRlRHJvcHBhYmxlKGRyb3BwYWJsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2FjdGl2ZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZHJhZ2xlYXZlSGFuZGxlcihldjogRHJhZ0V2ZW50KTogYm9vbGVhbiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5kZWFjdGl2YXRlRHJvcHBhYmxlKGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbm9uZSc7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBEcm9wcGFibGVzRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxEcm9wcGFibGVzSW50ZXJmYWNlPiAmIFQ7XG59O1xuIiwgIi8vIFRISVMgSVMgQSBNSVhJTiwgVEhJUyBJUyBBIE1JWElOXG4vLyBVU0UgTElLRSBUSElTXG4vLyBgYGBjbGFzcyBEcm9wTGlzdCBleHRlbmRzIEZsaXBwYWJsZXMoTGl0RWxlbWVudCkge2BgYFxuLy8gbWl4aW4gd2hpY2ggYW5pbWF0ZXMgY2hpbGRyZW4gd2l0aCBGTElQXG4vLyBhIGNvbWJpbmF0aW9uIGJldHdlZW4gdGhpcyBkaXJlY3RpdmU6XG4vLyBodHRwczovL25nLXJ1bi5jb20vZWRpdC85TUdyNWRZV0EyMEFpSnRweTVhej9vcGVuPWFwcCUyRmFwcC5jb21wb25lbnQuaHRtbFxuLy8gYW5kIGEgdHV0b3JpYWwgaG93IHRvIG1ha2UgYSBtaXhpblxuLy8gaHR0cHM6Ly9saXQuZGV2L2RvY3MvY29tcG9zaXRpb24vbWl4aW5zL1xuXG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG50eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBGbGlwcGFibGVzSW50ZXJmYWNlIHtcbiAgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZDtcbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZDtcbn1cblxuLy8ganVzdCBhIGNvbnZlcnNpb24gb2YgYSBhbmd1bGFyIEZMSVAgZGlyZWN0aXZlLCBtYWRlIGFzIGEgTWl4aW5cbi8vIGh0dHBzOi8vbmctcnVuLmNvbS9lZGl0LzlNR3I1ZFlXQTIwQWlKdHB5NWF6P29wZW49YXBwJTJGYXBwLmNvbXBvbmVudC5odG1sXG5leHBvcnQgY29uc3QgRmxpcHBhYmxlc01peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KFxuICBzdXBlckNsYXNzOiBULFxuICBkcm9wcGFibGVzU2VsOiBzdHJpbmcsXG4gIGRyYWdnYWJsZXNTZWw6IHN0cmluZ1xuKSA9PiB7XG4gIGFic3RyYWN0IGNsYXNzIEZsaXBwYWJsZXNFbGVtZW50IGV4dGVuZHMgc3VwZXJDbGFzcyB7XG4gICAgLy8gcHJpdmF0ZSBzdGF0ZSA9IG5ldyBNYXA8RWxlbWVudCwgYW55PigpO1xuICAgIC8vIHByaXZhdGUgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG4gICAgLy8gZmxpcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmc7XG4gICAgLy8gb3ZlcnJpZGUgYXN5bmMgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcykge1xuICAgIC8vICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTsgLy8gcGs6IHRoaXMgaXMgdGhlIGtleSB0byBjYWxjdWxhdGUgY29ycmVjdCBwcm9wb3J0aW9uc1xuICAgIC8vICAgY29uc3QgZHJhZ2dhYmxlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyYWdnYWJsZXNTZWwpKTtcbiAgICAvLyAgIGRyYWdnYWJsZXMuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgIC8vICAgICBjb25zdCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLmFuaW1hdGVNZSk7XG4gICAgLy8gICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbCkpO1xuICAgIC8vICAgZHJvcHBhYmxlcy5mb3JFYWNoKChkcmFnZ2FibGUpID0+IHtcbiAgICAvLyAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKGRyYWdnYWJsZSwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICAvLyAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuICAgIC8vIH1cbiAgICAvLyBwcml2YXRlIGFuaW1hdGVNZSA9ICgpID0+IHtcbiAgICAvLyAgIHRoaXMuc3RhdGUuZm9yRWFjaCgodmFsdWUsIGVsZW0pID0+IHtcbiAgICAvLyAgICAgY29uc3QgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gICAgIGlmICh0aGlzLnN0YXRlLmdldChlbGVtKSA9PSBudWxsKSB7XG4gICAgLy8gICAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgY29uc3QgY2FjaGUgPSB0aGlzLnN0YXRlLmdldChlbGVtKTtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFYID0gY2FjaGUubGVmdCAtIGxlZnQ7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhWSA9IGNhY2hlLnRvcCAtIHRvcDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFXID0gY2FjaGUud2lkdGggLyB3aWR0aDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFIID0gY2FjaGUuaGVpZ2h0IC8gaGVpZ2h0O1xuICAgIC8vICAgICB0aGlzLnN0YXRlLnNldChlbGVtLCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAvLyAgICAgY29uc3QgeyBkdXJhdGlvbiwgZWFzaW5nIH0gPSB7IGR1cmF0aW9uOiAzNTAsIGVhc2luZzogJ2N1YmljLWJlemllcigwLjI2LCAwLjg2LCAwLjQ0LCAwLjk4NSknIH07XG4gICAgLy8gICAgIGVsZW0uYW5pbWF0ZShcbiAgICAvLyAgICAgICBbXG4gICAgLy8gICAgICAgICB7XG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbjogJ3RvcCBsZWZ0JyxcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtOiBgXG4gICAgLy8gdHJhbnNsYXRlKCR7ZGVsdGFYfXB4LCAke2RlbHRhWX1weClcbiAgICAvLyBzY2FsZSgke2RlbHRhV30sICR7ZGVsdGFIfSlcbiAgICAvLyBgLFxuICAgIC8vICAgICAgICAgICAvLyB3aWR0aDogY2FjaGUud2lkdGgsXG4gICAgLy8gICAgICAgICAgIC8vIGhlaWdodDogY2FjaGUuaGVpZ2h0KyAncHgnLFxuICAgIC8vICAgICAgICAgICAvLyBvcGFjaXR5OiBjYWNoZS5vcGFjaXR5LFxuICAgIC8vICAgICAgICAgfSxcbiAgICAvLyAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAndG9wIGxlZnQnLFxuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm06ICdub25lJyxcbiAgICAvLyAgICAgICAgIH0sXG4gICAgLy8gICAgICAgXSxcbiAgICAvLyAgICAgICB7XG4gICAgLy8gICAgICAgICBkdXJhdGlvbixcbiAgICAvLyAgICAgICAgIGVhc2luZyxcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgICk7XG4gICAgLy8gICB9KTtcbiAgICAvLyB9O1xuICAgIC8vIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIC8vICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyAgIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIC8vIH1cbiAgfVxuICByZXR1cm4gRmxpcHBhYmxlc0VsZW1lbnQgYXMgQ29uc3RydWN0b3I8RmxpcHBhYmxlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IElJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEcm9wcGFibGVzTWl4aW4gfSBmcm9tICcuL2Ryb3BwYWJsZXMtbWl4aW4nO1xuaW1wb3J0IHsgRmxpcHBhYmxlc01peGluIH0gZnJvbSAnLi9mbGlwcGFibGVzLW1peGluJztcblxuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBsaXZlUXVlcnkgfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL2xpdmUtcXVlcnknO1xuaW1wb3J0IHsgVG91Y2hEcmFnQW5kRHJvcCB9IGZyb20gJy4vZHJhZy1kcm9wLWFwaSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gYWJzdHJhY3QgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuaW50ZXJmYWNlIEludGVyYWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gIGNvcHlTdHlsZXNEcmFnQ2xvbmU6IGJvb2xlYW47XG4gIGRyYWdDYW5CZVBsYWNlZEJhY2s6IGJvb2xlYW47XG4gIGRyYWdPbkNsaWNrOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxJbnRlcmFjdGlvbj4+KFxuICBzdXBlckNsYXNzOiBULFxuICBkcmFnZ2FibGVzU2VsZWN0b3I6IHN0cmluZyxcbiAgdXNlU2hhZG93Um9vdEZvckRyb3BwYWJsZXM6IGJvb2xlYW4sXG4gIGRyb3BwYWJsZXNTZWxlY3Rvcjogc3RyaW5nXG4pID0+IHtcbiAgYWJzdHJhY3QgY2xhc3MgRHJhZ0Ryb3BJbnRlcmFjdGlvbkVsZW1lbnQgZXh0ZW5kcyBGbGlwcGFibGVzTWl4aW4oXG4gICAgRHJvcHBhYmxlc01peGluKHN1cGVyQ2xhc3MsIHVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzLCBkcm9wcGFibGVzU2VsZWN0b3IpLFxuICAgIGRyb3BwYWJsZXNTZWxlY3RvcixcbiAgICBkcmFnZ2FibGVzU2VsZWN0b3JcbiAgKSB7XG4gICAgcHJvdGVjdGVkIGRyYWdnYWJsZXMgPSBuZXcgTWFwPEhUTUxFbGVtZW50LCB7IHBhcmVudDogSFRNTEVsZW1lbnQ7IGluZGV4OiBudW1iZXIgfT4oKTtcbiAgICBwcm90ZWN0ZWQgZHJvcHBhYmxlczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGRyYWdEcm9wQXBpOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gICAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiBmYWxzZSwgdHlwZTogT2JqZWN0IH0pIGNvbmZpZ3VyYXRpb246IEludGVyYWN0aW9uQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgIGNvcHlTdHlsZXNEcmFnQ2xvbmU6IHRydWUsXG4gICAgICBkcmFnQ2FuQmVQbGFjZWRCYWNrOiB0cnVlLFxuICAgICAgZHJhZ09uQ2xpY2s6IGZhbHNlXG4gICAgfTtcbiAgICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUsIGF0dHJpYnV0ZTogJ21pbi1hc3NvY2lhdGlvbnMnIH0pIG1pbkFzc29jaWF0aW9ucyA9IDE7XG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICdtYXgtYXNzb2NpYXRpb25zJyB9KSBtYXhBc3NvY2lhdGlvbnMgPSAxO1xuXG4gICAgQGxpdmVRdWVyeShkcmFnZ2FibGVzU2VsZWN0b3IpXG4gICAgaGFuZGxlRHJhZ2dhYmxlc0NoYW5nZShkcmFnc0FkZGVkOiBIVE1MRWxlbWVudFtdLCBkcmFnc1JlbW92ZWQ6IEVsZW1lbnRbXSkge1xuICAgICAgaWYgKHRoaXMuaXNNYXRjaFRhYnVsYXIoKSkgcmV0dXJuO1xuICAgICAgY29uc3QgbmV3RHJhZ2dhYmxlcyA9IHRoaXMuZmlsdGVyRXhpc3RpbmdEcmFnZ2FibGVzKGRyYWdzQWRkZWQpO1xuXG4gICAgICBpZiAobmV3RHJhZ2dhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuYWRkTmV3RHJhZ2dhYmxlcyhuZXdEcmFnZ2FibGVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTogdm9pZCB7XG4gICAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZURyb3BwYWJsZXMoKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgICB0aGlzLmluaXRpYWxpemVEcmFnRHJvcEFwaSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZURyYWdEcm9wQXBpKCkge1xuICAgICAgdGhpcy5kcmFnRHJvcEFwaSA9IG5ldyBUb3VjaERyYWdBbmREcm9wKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudDxEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudD4oJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogdGhpc1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTWF0Y2hUYWJ1bGFyKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmlsdGVyRXhpc3RpbmdEcmFnZ2FibGVzKGRyYWdnYWJsZXM6IEhUTUxFbGVtZW50W10pOiBIVE1MRWxlbWVudFtdIHtcbiAgICAgIHJldHVybiBkcmFnZ2FibGVzLmZpbHRlcihkID0+ICF0aGlzLmRyYWdnYWJsZXMuaGFzKGQpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZE5ld0RyYWdnYWJsZXMoZHJhZ2dhYmxlczogSFRNTEVsZW1lbnRbXSk6IHZvaWQge1xuICAgICAgdGhpcy5kcmFnRHJvcEFwaS5hZGREcmFnZ2FibGVFbGVtZW50cyhkcmFnZ2FibGVzKTtcbiAgICAgIGRyYWdnYWJsZXMuZm9yRWFjaChkcmFnZ2FibGUgPT4gdGhpcy5zdG9yZURyYWdnYWJsZShkcmFnZ2FibGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0b3JlRHJhZ2dhYmxlKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gQXJyYXkuZnJvbShkcmFnZ2FibGUucGFyZW50Tm9kZS5jaGlsZHJlbikuaW5kZXhPZihkcmFnZ2FibGUpO1xuICAgICAgdGhpcy5kcmFnZ2FibGVzLnNldChkcmFnZ2FibGUsIHtcbiAgICAgICAgcGFyZW50OiBkcmFnZ2FibGUucGFyZW50RWxlbWVudCxcbiAgICAgICAgaW5kZXhcbiAgICAgIH0pO1xuICAgICAgZHJhZ2dhYmxlLnN0eWxlLnZpZXdUcmFuc2l0aW9uTmFtZSA9IGBkcmFnLSR7aW5kZXh9LSR7dGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSB8fCBjcnlwdG8ucmFuZG9tVVVJRCgpfWA7XG4gICAgICBkcmFnZ2FibGUuc2V0QXR0cmlidXRlKCdxdGktZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICAgIGRyYWdnYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLmhhbmRsZURyYWdTdGFydCk7XG4gICAgICBkcmFnZ2FibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIHRoaXMuaGFuZGxlRHJhZ0VuZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplRHJvcHBhYmxlcygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcyA9IEFycmF5LmZyb20oXG4gICAgICAgIHVzZVNoYWRvd1Jvb3RGb3JEcm9wcGFibGVzXG4gICAgICAgICAgPyB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpXG4gICAgICAgICAgOiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZURyYWdTdGFydCA9IChldjogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgZXYuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQnLCB0YXJnZXQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZHJhZ2dpbmcnLCAnJyk7XG4gICAgICB0aGlzLmFjdGl2YXRlRHJvcHBhYmxlcygpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGhhbmRsZURyYWdFbmQgPSBhc3luYyAoZXY6IERyYWdFdmVudCkgPT4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZURyb3BwYWJsZXMoKTtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBkcmFnZ2FibGUucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2luZycpO1xuICAgICAgY29uc3Qgd2FzRHJvcHBlZCA9IGF3YWl0IHRoaXMud2FzRHJvcHBlZChldik7XG4gICAgICBpZiAoIXdhc0Ryb3BwZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5kcmFnQ2FuQmVQbGFjZWRCYWNrKSB7XG4gICAgICAgICAgdGhpcy5yZXN0b3JlSW5pdGlhbERyYWdnYWJsZVBvc2l0aW9uKGRyYWdnYWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZURyb3BwYWJsZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmRyb3BwYWJsZXMuZm9yRWFjaChkID0+IGQuc2V0QXR0cmlidXRlKCdlbmFibGVkJywgJycpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYWN0aXZhdGVEcm9wcGFibGVzKCk6IHZvaWQge1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goZCA9PiBkLnJlbW92ZUF0dHJpYnV0ZSgnZW5hYmxlZCcpKTtcbiAgICB9XG5cbiAgICAvLyBNSDogVGhpcyBtZXRob2QgaXMganVzdCB0byBtYWtlIHN1cmUgdGhpcyBjYW4gYmUgdGVzdGVkLlxuICAgIC8vIGJlY2F1c2UgSSBjYW4ndCBnZXQgdGhlIGRyb3BFZmZlY3QgdG8gYmUgJ21vdmUnIGluIHRoZSB0ZXN0XG4gICAgcHJpdmF0ZSBjaGVja0Zvck1vdmVUZXN0SXRlbSA9IChldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICBpZiAoIWV2LmRhdGFUcmFuc2Zlci5pdGVtcykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgbGV0IGhhc01vdmVUZXN0SXRlbSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgZGF0YVRyYW5zZmVyIGl0ZW1zXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbShldi5kYXRhVHJhbnNmZXIuaXRlbXMpO1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gaXRlbXMubGVuZ3RoO1xuXG4gICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBpdGVtcywgcmVzb2x2ZSBpbW1lZGlhdGVseVxuICAgICAgICBpZiAocGVuZGluZyA9PT0gMCkge1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gJ3N0cmluZycgJiYgaXRlbS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIGl0ZW0uZ2V0QXNTdHJpbmcoZGF0YSA9PiB7XG4gICAgICAgICAgICAgIGlmIChkYXRhID09PSAnbW92ZS10ZXN0Jykge1xuICAgICAgICAgICAgICAgIGhhc01vdmVUZXN0SXRlbSA9IHRydWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBSZXNvbHZlIHRoZSBwcm9taXNlIGFmdGVyIHByb2Nlc3NpbmcgYWxsIGl0ZW1zXG4gICAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShoYXNNb3ZlVGVzdEl0ZW0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGl0ZW0gaXMgbm90ICdzdHJpbmcnLCBzdGlsbCBjb3VudCBkb3duIHBlbmRpbmdcbiAgICAgICAgICAgIGlmIChwZW5kaW5nID09PSAwKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoaGFzTW92ZVRlc3RJdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgYXN5bmMgd2FzRHJvcHBlZChldjogRHJhZ0V2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBjb25zdCBoYXNNb3ZlVGVzdEl0ZW0gPSBhd2FpdCB0aGlzLmNoZWNrRm9yTW92ZVRlc3RJdGVtKGV2KTtcbiAgICAgIHJldHVybiBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCAhPT0gJ25vbmUnIHx8IGhhc01vdmVUZXN0SXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHdhc01vdmVkKGV2OiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9PT0gJ21vdmUnO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVzdG9yZUluaXRpYWxEcmFnZ2FibGVQb3NpdGlvbihkcmFnZ2FibGU6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCB7IHBhcmVudCwgaW5kZXggfSA9IHRoaXMuZHJhZ2dhYmxlcy5nZXQoZHJhZ2dhYmxlKTtcbiAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gTWF0aC5taW4oaW5kZXgsIHBhcmVudC5jaGlsZHJlbi5sZW5ndGgpO1xuXG4gICAgICBjb25zdCBtb3ZlRHJhZ2dhYmxlID0gKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIHBhcmVudDogSFRNTEVsZW1lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihpbmRleCwgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZHJhZ2dhYmxlLCBwYXJlbnQuY2hpbGRyZW5bdGFyZ2V0SW5kZXhdKTtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICB0aGlzLmNoZWNrTWF4QXNzb2NpYXRpb25zKCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBGYWxsYmFjayBpZiB2aWV3IHRyYW5zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkXG4gICAgICBpZiAoIWRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgbW92ZURyYWdnYWJsZShkcmFnZ2FibGUsIHBhcmVudCwgaW5kZXgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB2aWV3IHRyYW5zaXRpb25zIGlmIHN1cHBvcnRlZFxuICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oKCkgPT4ge1xuICAgICAgICBkcmFnZ2FibGUuc3R5bGUudHJhbnNmb3JtID0gJyc7XG4gICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgIH0pO1xuICAgICAgLy8gdHJhbnNpdGlvbi5maW5pc2hlZC50aGVuKCgpID0+IHtcbiAgICAgIC8vICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zaXRpb24gPSAnJztcbiAgICAgIC8vIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja01heEFzc29jaWF0aW9ucygpOiB2b2lkIHtcbiAgICAgIHRoaXMuZHJvcHBhYmxlcy5mb3JFYWNoKChkLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBtYXhNYXRjaCA9ICsoZC5nZXRBdHRyaWJ1dGUoJ21hdGNoLW1heCcpIHx8IDEpO1xuICAgICAgICBjb25zdCBjdXJyZW50QXNzb2NpYXRpb25zID0gZC5xdWVyeVNlbGVjdG9yQWxsKCdbcXRpLWRyYWdnYWJsZT1cInRydWVcIl0nKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGRpc2FibGVEcm9wcGFibGUgPSBjdXJyZW50QXNzb2NpYXRpb25zID49IG1heE1hdGNoO1xuICAgICAgICBpZiAoZGlzYWJsZURyb3BwYWJsZSkge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZURyb3BwYWJsZShkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVuYWJsZURyb3BwYWJsZShkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNhYmxlRHJvcHBhYmxlKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJyk7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlQXR0cmlidXRlKCdkcm9wem9uZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlRHJvcHBhYmxlKGRyb3BwYWJsZTogRWxlbWVudCk6IHZvaWQge1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2Ryb3B6b25lJywgJ21vdmUnKTtcbiAgICB9XG5cbiAgICBnZXQgdmFsdWUoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuY29sbGVjdFJlc3BvbnNlRGF0YSgpO1xuICAgIH1cblxuICAgIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hUYWJ1bGFyKCkpIHJldHVybjtcblxuICAgICAgdGhpcy5yZXNldERyb3BwYWJsZXMoKTtcbiAgICAgIHZhbHVlPy5mb3JFYWNoKGVudHJ5ID0+IHRoaXMucGxhY2VSZXNwb25zZShlbnRyeSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGxhY2VSZXNwb25zZShyZXNwb25zZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICBjb25zdCBbZHJvcElkLCAuLi5kcmFnSWRzXSA9IHJlc3BvbnNlLnNwbGl0KCcgJykucmV2ZXJzZSgpO1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gdGhpcy5maW5kRHJvcHBhYmxlQnlJZChkcm9wSWQpO1xuICAgICAgZHJhZ0lkcy5mb3JFYWNoKGRyYWdJZCA9PiB0aGlzLnBsYWNlRHJhZ2dhYmxlSW5Ecm9wcGFibGUoZHJhZ0lkLCBkcm9wcGFibGUpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmREcm9wcGFibGVCeUlkKGlkZW50aWZpZXI6IHN0cmluZyk6IEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMuZHJvcHBhYmxlcy5maW5kKGRyb3AgPT4gZHJvcC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSA9PT0gaWRlbnRpZmllcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBwbGFjZURyYWdnYWJsZUluRHJvcHBhYmxlKGRyYWdJZDogc3RyaW5nLCBkcm9wcGFibGU6IEVsZW1lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IHRoaXMucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYFtpZGVudGlmaWVyPSR7ZHJhZ0lkfV1gKTtcbiAgICAgIGlmICghZHJvcHBhYmxlIHx8ICFkcmFnZ2FibGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQ2Fubm90IGZpbmQgZHJhZ2dhYmxlIG9yIGRyb3BwYWJsZSB3aXRoIHRoZSBnaXZlbiBpZGVudGlmaWVyOiAke2RyYWdJZH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbW92ZUVsZW1lbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGRyYWdnYWJsZS5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKDAsIDApJztcbiAgICAgICAgZHJvcHBhYmxlLmFwcGVuZENoaWxkKGRyYWdnYWJsZSk7XG4gICAgICAgIHRoaXMuY2hlY2tNYXhBc3NvY2lhdGlvbnMoKTtcbiAgICAgIH07XG5cbiAgICAgIGlmICghZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBtb3ZlRWxlbWVudCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24obW92ZUVsZW1lbnQpO1xuICAgICAgICBhd2FpdCB0cmFuc2l0aW9uLmZpbmlzaGVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgdmFsaWRBc3NvY2lhdGlvbnMgPSB0aGlzLmdldFZhbGlkQXNzb2NpYXRpb25zKCk7XG4gICAgICByZXR1cm4gdGhpcy5taW5Bc3NvY2lhdGlvbnMgPD0gMCB8fCB0aGlzLm1pbkFzc29jaWF0aW9ucyA8PSB2YWxpZEFzc29jaWF0aW9ucztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFZhbGlkQXNzb2NpYXRpb25zKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wcGFibGVzLmZpbHRlcihkID0+IGQuY2hpbGRFbGVtZW50Q291bnQgPiAwKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHVibGljIHNhdmVSZXNwb25zZSgpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5jb2xsZWN0UmVzcG9uc2VEYXRhKCk7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29sbGVjdFJlc3BvbnNlRGF0YSgpOiBzdHJpbmdbXSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuZHJvcHBhYmxlc1xuICAgICAgICAubWFwKGRyb3BwYWJsZSA9PiB7XG4gICAgICAgICAgY29uc3QgZHJhZ2dhYmxlc0luRHJvcHBhYmxlID0gZHJvcHBhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXJzID0gQXJyYXkuZnJvbShkcmFnZ2FibGVzSW5Ecm9wcGFibGUpLm1hcChkID0+IGQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgICAgIGNvbnN0IGRyb3BwYWJsZUlkZW50aWZpZXIgPSBkcm9wcGFibGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgcmV0dXJuIGlkZW50aWZpZXJzLm1hcChpZCA9PiBgJHtpZH0gJHtkcm9wcGFibGVJZGVudGlmaWVyfWApO1xuICAgICAgICB9KVxuICAgICAgICAuZmxhdCgpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIHJlc2V0KHNhdmUgPSB0cnVlKTogdm9pZCB7XG4gICAgICB0aGlzLnJlc2V0RHJvcHBhYmxlcygpO1xuICAgICAgaWYgKHNhdmUpIHRoaXMuc2F2ZVJlc3BvbnNlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZXNldERyb3BwYWJsZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBtb3ZlRHJhZ2dhYmxlID0gKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQsIHBhcmVudDogSFRNTEVsZW1lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgZHJhZ2dhYmxlLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IE1hdGgubWluKGluZGV4LCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShkcmFnZ2FibGUsIHBhcmVudC5jaGlsZHJlblt0YXJnZXRJbmRleF0pO1xuICAgICAgfTtcblxuICAgICAgaWYgKCFkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIGlmIHZpZXcgdHJhbnNpdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWRcbiAgICAgICAgdGhpcy5kcmFnZ2FibGVzLmZvckVhY2goKHsgcGFyZW50LCBpbmRleCB9LCBkcmFnZ2FibGUpID0+IHtcbiAgICAgICAgICBtb3ZlRHJhZ2dhYmxlKGRyYWdnYWJsZSwgcGFyZW50LCBpbmRleCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB2aWV3IHRyYW5zaXRpb25zIGlmIHN1cHBvcnRlZFxuICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oKCkgPT4ge1xuICAgICAgICB0aGlzLmRyYWdnYWJsZXMuZm9yRWFjaCgoeyBwYXJlbnQsIGluZGV4IH0sIGRyYWdnYWJsZSkgPT4ge1xuICAgICAgICAgIG1vdmVEcmFnZ2FibGUoZHJhZ2dhYmxlLCBwYXJlbnQsIGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdHJhbnNpdGlvbi5maW5pc2hlZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gRHJhZ0Ryb3BJbnRlcmFjdGlvbkVsZW1lbnQgYXMgQ29uc3RydWN0b3I8SUludGVyYWN0aW9uPiAmIFQ7XG59O1xuIiwgIi8vIEB3YXRjaCBkZWNvcmF0b3Jcbi8vXG4vLyBSdW5zIHdoZW4gYW4gb2JzZXJ2ZWQgcHJvcGVydHkgY2hhbmdlcywgZS5nLiBAcHJvcGVydHkgb3IgQHN0YXRlLCBidXQgYmVmb3JlIHRoZSBjb21wb25lbnQgdXBkYXRlcy5cbi8vXG4vLyBUbyB3YWl0IGZvciBhbiB1cGRhdGUgdG8gY29tcGxldGUgYWZ0ZXIgYSBjaGFuZ2Ugb2NjdXJzLCB1c2UgYGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGVgIGluIHRoZSBoYW5kbGVyLiBUbyBzdGFydFxuLy8gd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlciwgdXNlIGB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH1gIG9yIGB0aGlzLmhhc1VwZGF0ZWRgIGluIHRoZSBoYW5kbGVyLlxuLy9cbi8vIFVzYWdlOlxuLy9cbi8vICBAd2F0Y2goJ3Byb3BOYW1lJylcbi8vICBoYW5kbGVQcm9wQ2hhbmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuLy8gICAgLi4uXG4vLyAgfVxuXG5pbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXIgPSAocHJldj86IHVua25vd24sIG5leHQ/OiB1bmtub3duKSA9PiB2b2lkO1xuXG50eXBlIE5vblVuZGVmaW5lZDxBPiA9IEEgZXh0ZW5kcyB1bmRlZmluZWQgPyBuZXZlciA6IEE7XG5cbnR5cGUgVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0tPzogTm9uVW5kZWZpbmVkPFRbS10+IGV4dGVuZHMgVXBkYXRlSGFuZGxlciA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbmludGVyZmFjZSBMaXZlUXVlcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgb25seSBzdGFydCB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyXG4gICAqL1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGl2ZVF1ZXJ5KHF1ZXJ5U2VsZWN0b3I6IHN0cmluZywgb3B0aW9ucz86IExpdmVRdWVyeU9wdGlvbnMpIHtcbiAgbGV0IG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICBjb25zdCByZXNvbHZlZE9wdGlvbnM6IFJlcXVpcmVkPExpdmVRdWVyeU9wdGlvbnM+ID0ge1xuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgcmV0dXJuIDxFbGVtQ2xhc3MgZXh0ZW5kcyBMaXRFbGVtZW50PihcbiAgICBwcm90bzogRWxlbUNsYXNzLFxuICAgIGRlY29yYXRlZEZuTmFtZTogVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxFbGVtQ2xhc3M+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHsgY29ubmVjdGVkQ2FsbGJhY2ssIGRpc2Nvbm5lY3RlZENhbGxiYWNrIH0gPSBwcm90bztcblxuICAgIHByb3RvLmNvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gKG11dGF0aW9uTGlzdDogTXV0YXRpb25SZWNvcmRbXSkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50c1RvV2F0Y2ggPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSk7XG4gICAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25MaXN0KSB7XG4gICAgICAgICAgY29uc3QgYWRkZWROb2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2RlcykubWFwKGUgPT4gZSBhcyBFbGVtZW50KTtcbiAgICAgICAgICBjb25zdCByZW1vdmVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpLm1hcChlID0+IGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIGFkZGVkTm9kZXMuZmluZChuID0+IGVsZW1lbnRzVG9XYXRjaC5pbmNsdWRlcyhuKSkpIHtcbiAgICAgICAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcblxuICAgICAgY29uc3QgZWxlbWVudHNBZGRlZCA9IHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSA/PyBbXTtcbiAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShBcnJheS5mcm9tKGVsZW1lbnRzQWRkZWQpLCBbXSk7XG4gICAgfTtcblxuICAgIHByb3RvLmRpc2Nvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9O1xufVxuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgOmhvc3Qge1xuICAgIGRpc3BsYXk6IGJsb2NrOyAvKiBuZWNlc3NhcnkgdG8gY2FsY3VsYXRlIHNjYWxpbmcgcG9zaXRpb24gKi9cbiAgfVxuICBzbG90W25hbWU9J3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnXSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgZ2FwOiAwLjVyZW07XG4gIH1cblxuICA6aG9zdDo6cGFydChhc3NvY2lhYmxlcy1jb250YWluZXIpIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoXG4gICAgICAxODBkZWcsXG4gICAgICByZ2IoMCAwIDAgLyAwJSkgY2FsYyg1MCUgLSAxcHgpLFxuICAgICAgdmFyKC0tcXRpLWJvcmRlci1jb2xvci1ncmF5KSBjYWxjKDUwJSksXG4gICAgICByZ2IoMCAwIDAgLyAwJSkgY2FsYyg1MCUgKyAxcHgpXG4gICAgKTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgcmVtb3ZlRG91YmxlU2xhc2hlcyB9IGZyb20gJy4uLy4uL2ludGVybmFsL3V0aWxzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUN1c3RvbUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICAvLyBUaGlzIGN1c3RvbS1pbnRlcmFjdGlvbiBzdXBwb3J0IHRoZSBDRVMgQVBJIHdoaWNoIGlzIHVzZSBpbiBGQUNFVFxuICAvL1xuICAvLyBJdCB3b3JrcyBsaWtlIHRoaXM6XG4gIC8vIDEuIFRoZSBDSSBtYW5pZmVzdCBpcyBmZXRjaGVkXG4gIC8vIDIuIEFuIGlmcmFtZSBpcyBjcmVhdGVkIGFuZCB0aGUgZmlyc3Qgc3R5bGUgYW5kIGZpcnN0IHNjcmlwdCBmcm9tIHRoZSBtYW5pZmVzdCBhcmUgbG9hZGVkXG4gIC8vIDMuIFRoZSBmaXJzdCBzY3JpcHQgaXMgYm9vdHN0cmFwLmpzIHdoaWNoIGFsc28gY3JlYXRlcyBhbiBpZnJhbWUgYW5kIGxvYWRzIHRoZSBmaXJzdCBtZWRpYSBmcm9tIHRoZSBtYW5pZmVzdFxuICAvLyA0LiBDb21tdW5pY2F0aW9uIGlzIGRvbmUgdmlhIHRoZSBDRVMgQVBJIGJ1dCBiZWNhdXNlIHRoZSBpZnJhbWUgaXMgbm90IGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBnbG9iYWwgQ0VTIG9iamVjdCB3ZSBuZWVkIHRvIHVzZSB3aW5kb3cucG9zdE1lc3NhZ2VcblxuICAvLyBUbyBhY2hpZXZlIHRoaXMgd2UgY2hhbmdlIHRoZSBwYWNrYWdlIGJ5IHJlcGxhY2luZyB0aGUgYm9vdHN0cmFwLmpzIHdpdGggb3VyIG93biBhbmQgaW5qZWN0IGEgcHJveHkgQ0VTIEFQSSB0aGF0IGNvbW11bmljYXRlcyB2aWEgcG9zdE1lc3NhZ2VcbiAgLy8gQmVjYXVzZSB3ZSBhbHNvIHdhbnQgdG8gcnVuIHRoaXMgaW4gc3Rvcnlib29rLCB3ZSBjYW5ub3QgdXNlIHdpbmRvdy50b3AgYmVjYXVzZSB0byBzZW5kIG1lc3NhZ2VzIHRoZXJlLCBiZWNhdXNlIGluIGNhc2Ugb2Ygc3Rvcnlib29rIHRoYXQgaXMgbm90IHRoZSB0b3Agd2luZG93LlxuICAvLyBTbyB3ZSBzZW5kIG1lc3NhZ2VzIHRvIGFsbCBwYXJlbnQgd2luZG93c1xuICBwcml2YXRlIHJhd1Jlc3BvbnNlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlID0gdGhpcy5oYW5kbGVQb3N0TWVzc2FnZS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhJyB9KVxuICBkYXRhOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLWJhc2UtaXRlbScgfSlcbiAgYmFzZUl0ZW1Vcmw6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtYmFzZS1yZWYnIH0pXG4gIGJhc2VSZWZVcmw6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2lkJyB9KVxuICBpZDogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcbiAgbWFuaWZlc3Q6IHtcbiAgICBzY3JpcHQ6IHN0cmluZ1tdO1xuICAgIHN0eWxlOiBzdHJpbmdbXTtcbiAgICBtZWRpYTogc3RyaW5nW107XG4gIH07XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IHVyaVRvTWFuaWZlc3QgPSB0aGlzLmRhdGEuc3RhcnRzV2l0aCgnaHR0cCcpXG4gICAgICA/IHRoaXMuZGF0YVxuICAgICAgOiByZW1vdmVEb3VibGVTbGFzaGVzKHRoaXMuYmFzZUl0ZW1VcmwgKyAnLycgKyB0aGlzLmRhdGEpO1xuICAgIC8vIGZldGNoIHRoZSBqc29uIGZpbGUgbG9jYXRlZCBhdCB0aGUgZGF0YSBhdHRyaWJ1dGVcbiAgICBmZXRjaCh1cmlUb01hbmlmZXN0KVxuICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuanNvbigpKVxuICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgIHRoaXMubWFuaWZlc3QgPSBkYXRhO1xuICAgICAgICB0aGlzLnNldHVwQ0VTKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIHRoaXMuX2Vycm9yTWVzc2FnZSA9IGVycjtcbiAgICAgIH0pO1xuICB9XG5cbiAgLy8gTUg6IENoYW5nZWQgdGhlIGRlZmF1bHQgYm9vdHN0cmFwLmpzIHRvIHVzZSB0aGUgbmV3IENFUyBBUElcbiAgLy8gQmVjYXVzZSB0aGUgb2xkIG9uZSB1c2VzIHRoZSBnbG9iYWwgQ0VTIG9iamVjdCB0aGF0IGlzIG5vdCBhbGxvd2VkIHRvIGJlIGFjY2Vzc2VkIHdoZW4gdGhlIENJXG4gIC8vIGlzIGVtYmVkZGVkIGluIGFuIGlmcmFtZSBhbmQgY29taW5nIGZyb20gYW5vdGhlciBkb21haW5cbiAgLy8gVGhlcmVmb3Igd2UgbmVlZCB0byB1c2UgdGhlIG5ldyBDRVMgQVBJIHRvIGNvbW11bmljYXRlcyB2aWEgdGhlIGJyb2FkY2FzdCBBUElcbiAgc2V0dXBDRVMoKSB7XG4gICAgY29uc3QgaWZyYW1lID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJyNwY2lDb250YWluZXInKSBhcyBIVE1MSUZyYW1lRWxlbWVudCxcbiAgICAgIGlmcmFtZVdpbiA9IGlmcmFtZS5jb250ZW50V2luZG93IHx8IGlmcmFtZSxcbiAgICAgIGlmcmFtZURvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG5cbiAgICAvLyBjb25zdCBjaGFubmVsID0gbmV3IEJyb2FkY2FzdENoYW5uZWwoJ2Nlc19jaGFubmVsJyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlKTtcbiAgICBpZnJhbWVEb2Mub3BlbigpO1xuICAgIGlmcmFtZURvYy53cml0ZShgXG4gICAgICA8aHRtbD5cbiAgICAgICAgPGhlYWQ+XG4gICAgICAgICAgPGxpbmsgaHJlZj0nJHtyZW1vdmVEb3VibGVTbGFzaGVzKGAke3RoaXMuYmFzZVJlZlVybH0vJHt0aGlzLm1hbmlmZXN0LnN0eWxlWzBdfWApfScgcmVsPVwic3R5bGVzaGVldFwiIC8+XG4gICAgICAgICAgPHNjcmlwdCBzcmM9JyR7cmVtb3ZlRG91YmxlU2xhc2hlcyhgJHt0aGlzLmJhc2VSZWZVcmx9LyR7dGhpcy5tYW5pZmVzdC5zY3JpcHRbMF19YCl9Jz48L3NjcmlwdD5cbiAgICAgICAgPC9oZWFkPlxuICAgICAgICA8Ym9keT48L2JvZHk+XG4gICAgICA8L2h0bWw+XG4gICAgICBgKTtcblxuICAgIGlmcmFtZURvYy5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJRnJhbWVzKCkge1xuICAgIGNvbnN0IGlmcmFtZXNJblNoYWRvd1Jvb3QgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJyk7XG4gICAgY29uc3QgaWZyYW1lID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcblxuICAgIGNvbnN0IG91dGVySUZyYW1lcyA9IFsuLi5pZnJhbWVzSW5TaGFkb3dSb290LCAuLi5pZnJhbWVdO1xuICAgIGZvciAoY29uc3QgaWZyYW1lIG9mIG91dGVySUZyYW1lcykge1xuICAgICAgY29uc3QgaWZyYW1lU3JjID0gaWZyYW1lLnNyYztcbiAgICAgIGNvbnN0IGlzU2FtZU9yaWdpbiA9IG5ldyBVUkwoaWZyYW1lU3JjLCB3aW5kb3cubG9jYXRpb24uaHJlZikub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICAgICAgaWYgKGlzU2FtZU9yaWdpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG91dGVyRG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICBpZiAob3V0ZXJEb2MpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0SW5uZXJJRnJhbWVzKG91dGVyRG9jLCBvdXRlcklGcmFtZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGFjY2Vzc2luZyBuZXN0ZWQgaWZyYW1lOicsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGdldCBvbmx5IHVuaXF1ZSBpZnJhbWVzXG4gICAgb3V0ZXJJRnJhbWVzLmZvckVhY2goKGlmcmFtZSwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChvdXRlcklGcmFtZXMuaW5kZXhPZihpZnJhbWUpICE9PSBpbmRleCkge1xuICAgICAgICBvdXRlcklGcmFtZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gb3V0ZXJJRnJhbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbm5lcklGcmFtZXMoaWZyYW1lRG9jdW1lbnQ6IERvY3VtZW50LCBpZnJhbWVzID0gW10pIHtcbiAgICAvLyBHZXQgYWxsIGlmcmFtZXMgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAgICBjb25zdCBjdXJyZW50SWZyYW1lcyA9IGlmcmFtZURvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuXG4gICAgY3VycmVudElmcmFtZXMuZm9yRWFjaChpZnJhbWUgPT4ge1xuICAgICAgLy8gQWRkIHRoZSBjdXJyZW50IGlmcmFtZSB0byB0aGUgbGlzdFxuICAgICAgaWZyYW1lcy5wdXNoKGlmcmFtZSk7XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGdldCBpZnJhbWVzIHdpdGhpbiB0aGUgY3VycmVudCBpZnJhbWVcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBpZnJhbWUgc3JjIGlzIGZyb20gdGhlIHNhbWUgb3JpZ2luXG4gICAgICBjb25zdCBpZnJhbWVTcmMgPSBpZnJhbWUuc3JjO1xuICAgICAgY29uc3QgaXNTYW1lT3JpZ2luID0gbmV3IFVSTChpZnJhbWVTcmMsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5vcmlnaW4gPT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG5cbiAgICAgIGlmIChpc1NhbWVPcmlnaW4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBuZXN0ZWREb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICAgIHRoaXMuZ2V0SW5uZXJJRnJhbWVzKG5lc3RlZERvYywgaWZyYW1lcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhY2Nlc3NpbmcgbmVzdGVkIGlmcmFtZTonLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdTa2lwcGVkIGNyb3NzLW9yaWdpbiBpZnJhbWU6JywgaWZyYW1lU3JjKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBpZnJhbWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3N0VG9XaW5kb3dBbmRJZnJhbWVzKHR5cGU6IHN0cmluZywgZGF0YTogYW55KSB7XG4gICAgd2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZSwgZGF0YSB9LCAnKicpO1xuICAgIGNvbnN0IGlmcmFtZXMgPSB0aGlzLmdldElGcmFtZXMoKTtcbiAgICBmb3IgKGNvbnN0IGlmcmFtZSBvZiBpZnJhbWVzKSB7XG4gICAgICBpZiAoaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoeyB0eXBlLCBkYXRhIH0sICcqJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlUG9zdE1lc3NhZ2UoZXZlbnQ6IE1lc3NhZ2VFdmVudCkge1xuICAgIGNvbnN0IHsgdHlwZSwgZGF0YSB9ID0gZXZlbnQuZGF0YTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3NldFJlc3BvbnNlJzpcbiAgICAgICAgdGhpcy5yYXdSZXNwb25zZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKGRhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2dldFJlc3BvbnNlJzoge1xuICAgICAgICB0aGlzLnBvc3RUb1dpbmRvd0FuZElmcmFtZXMoJ3Jlc3BvbnNlRGF0YScsIHRoaXMucmF3UmVzcG9uc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2dldE1lZGlhJzoge1xuICAgICAgICBjb25zdCBtZWRpYURhdGEgPSB0aGlzLm1hbmlmZXN0Lm1lZGlhLm1hcChtZWRpYSA9PiB7XG4gICAgICAgICAgY29uc3QgdXJsID0gbWVkaWEuc3RhcnRzV2l0aCgnaHR0cCcpID8gbWVkaWEgOiByZW1vdmVEb3VibGVTbGFzaGVzKHRoaXMuYmFzZVJlZlVybCArICcvJyArIG1lZGlhKTtcbiAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb3N0VG9XaW5kb3dBbmRJZnJhbWVzKCdtZWRpYURhdGEnLCBtZWRpYURhdGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3NldFN0YWdlSGVpZ2h0JzpcbiAgICAgICAgY29uc29sZS5sb2coJ3NldFN0YWdlSGVpZ2h0IG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yYXdSZXNwb25zZSAhPT0gJyc7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJhd1Jlc3BvbnNlO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmF3UmVzcG9uc2UgPSB2YWw7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UpO1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGlmcmFtZVxuICAgICAgICB3aWR0aD0ke3RoaXMuZ2V0QXR0cmlidXRlKCd3aWR0aCcpfVxuICAgICAgICBoZWlnaHQ9JHt0aGlzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyl9XG4gICAgICAgIGZyYW1lYm9yZGVyPVwiMFwiXG4gICAgICAgIHRpdGxlPVwicGNpQ29udGFpbmVyXCJcbiAgICAgICAgaWQ9XCJwY2lDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgPC9pZnJhbWU+XG4gICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZSAmJlxuICAgICAgaHRtbGA8ZGl2IHN0eWxlPVwiY29sb3I6cmVkXCI+XG4gICAgICAgIDxoMT5FcnJvcjwvaDE+XG4gICAgICAgICR7dGhpcy5fZXJyb3JNZXNzYWdlfVxuICAgICAgPC9kaXY+YH1gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nOiBRdGlDdXN0b21JbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbkBjdXN0b21FbGVtZW50KCdxdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjb3VudC1hdHRlbXB0JyB9KVxuICBwdWJsaWMgY291bnRBdHRlbXB0OiBzdHJpbmcgPSAndHJ1ZSc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIHB1YmxpYyB0aXRsZTogJ2VuZCBhdHRlbXB0JztcblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAvLyBub3QgaW1wbGVtZW50ZWQgYnkgZGVzaWduXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIC8vIG5vdCBpbXBsZW1lbnRlZCBieSBkZXNpZ25cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8YnV0dG9uID9kaXNhYmxlZD0ke3RoaXMuZGlzYWJsZWR9IHBhcnQ9XCJidXR0b25cIiBAY2xpY2s9JHt0aGlzLmVuZEF0dGVtcHR9PiR7dGhpcy50aXRsZX08L2J1dHRvbj5gO1xuICB9XG4gIHB1YmxpYyBlbmRBdHRlbXB0KGU6IEV2ZW50KSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdlbmQtYXR0ZW1wdCcsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQ6IHRoaXMuY291bnRBdHRlbXB0ID09PSAndHJ1ZScgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic6IFF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdhcE1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktZ2FwLXRleHQnLCBmYWxzZSwgJ3F0aS1nYXAnKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG5cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1ib3R0b20pIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gICAgICB9XG4gICAgICAvKiBbcGFydD0nZHJvcHMnXSAsICovXG4gICAgICBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj4gPC9zbG90PjxzbG90IHBhcnQ9XCJkcmFnc1wiIG5hbWU9XCJxdGktZ2FwLXRleHRcIj48L3Nsb3Q+IDxzbG90IHBhcnQ9XCJkcm9wc1wiPjwvc2xvdD5gO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBsZXQgbWF0Y2hlczogeyB0ZXh0OiBzdHJpbmc7IGdhcDogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIG1hdGNoZXMgPSByZXNwb25zZS5tYXAoeCA9PiB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0geC5zcGxpdCgnICcpO1xuICAgICAgICByZXR1cm4geyB0ZXh0OiBzcGxpdFswXSwgZ2FwOiBzcGxpdFsxXSB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2FwcyA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWdhcCcpO1xuICAgIGdhcHMuZm9yRWFjaCgoZ2FwLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgaWRlbnRpZmllciA9IGdhcC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgIGNvbnN0IHRleHRJZGVudGlmaWVyID0gbWF0Y2hlcy5maW5kKHggPT4geC5nYXAgPT09IGlkZW50aWZpZXIpPy50ZXh0O1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMucXVlcnlTZWxlY3RvcihgcXRpLWdhcC10ZXh0W2lkZW50aWZpZXI9XCIke3RleHRJZGVudGlmaWVyfVwiXWApPy50ZXh0Q29udGVudC50cmltKCk7XG4gICAgICBpZiAodGV4dElkZW50aWZpZXIgJiYgdGV4dCkge1xuICAgICAgICBpZiAoIWdhcC5uZXh0RWxlbWVudFNpYmxpbmc/LmNsYXNzTGlzdC5jb250YWlucygnY29ycmVjdC1vcHRpb24nKSkge1xuICAgICAgICAgIGNvbnN0IHRleHRTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgIHRleHRTcGFuLmNsYXNzTGlzdC5hZGQoJ2NvcnJlY3Qtb3B0aW9uJyk7XG4gICAgICAgICAgdGV4dFNwYW4udGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgICAgIGdhcC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgdGV4dFNwYW4pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGdhcC5uZXh0RWxlbWVudFNpYmxpbmc/LmNsYXNzTGlzdC5jb250YWlucygnY29ycmVjdC1vcHRpb24nKSkge1xuICAgICAgICBnYXAubmV4dEVsZW1lbnRTaWJsaW5nLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlHYXBNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBzdmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcXVlcnksIHF1ZXJ5QXNzaWduZWRFbGVtZW50cywgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljQXNzb2NpYXRlSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBob3RzcG90cztcbiAgc3RhcnRQb2ludCA9IG51bGw7XG4gIGVuZFBvaW50ID0gbnVsbDtcbiAgQHN0YXRlKCkgX2xpbmVzID0gW107XG4gIEBzdGF0ZSgpIHN0YXJ0Q29vcmQ6IHsgeDogYW55OyB5OiBhbnkgfTtcbiAgQHN0YXRlKCkgbW91c2VDb29yZDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICBAcXVlcnkoJ3N2ZycpIHN2Z0NvbnRhaW5lcjtcbiAgQHF1ZXJ5QXNzaWduZWRFbGVtZW50cyh7IHNlbGVjdG9yOiAnaW1nJyB9KSBnckltYWdlO1xuXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgLy8gcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChxdGktYXNzb2NpYWJsZS1ob3RzcG90KSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgfVxuICAgICAgbGluZS1jb250YWluZXIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICAgc3ZnIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDBweDtcbiAgICAgICAgbGVmdDogMHB4O1xuICAgICAgfVxuICAgIGBcbiAgXTtcbiAgc3ZnOiBTVkdTVkdFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9saW5lcyA9IFtdO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9saW5lcy5sZW5ndGggPiAwO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdGhpcy5fbGluZXMgPSB2YWw7XG4gICAgfVxuICB9XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpbmVzO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8bGluZS1jb250YWluZXI+XG4gICAgICAgIDxzdmdcbiAgICAgICAgICB3aWR0aD0ke2lmRGVmaW5lZCh0aGlzLmdySW1hZ2VbMF0/LndpZHRoKX1cbiAgICAgICAgICBoZWlnaHQ9JHtpZkRlZmluZWQodGhpcy5nckltYWdlWzBdPy5oZWlnaHQpfVxuICAgICAgICAgIHZpZXdib3g9XCIwIDAgJHt0aGlzLmdySW1hZ2VbMF0/LndpZHRofSAke3RoaXMuZ3JJbWFnZVswXT8uaGVpZ2h0fVwiXG4gICAgICAgID5cbiAgICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICAgIHRoaXMuX2xpbmVzLFxuICAgICAgICAgICAgbGluZSA9PiBsaW5lLFxuICAgICAgICAgICAgKGxpbmUsIGluZGV4KSA9PiBzdmdgXG4gICAgICAgICAgICAgIDxsaW5lXG4gICAgICAgICAgICAgICAgcGFydD1cImxpbmVcIlxuICAgICAgICAgICAgICAgIHgxPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVswXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTE9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzBdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHgyPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVsxXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTI9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzFdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHN0cm9rZT1cInJlZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiXG4gICAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZXMgPSB0aGlzLl9saW5lcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgYFxuICAgICAgICAgICl9XG4gICAgICAgICAgJHt0aGlzLnN0YXJ0UG9pbnQgJiZcbiAgICAgICAgICBzdmdgPGxpbmVcbiAgICAgICAgICAgIHBhcnQ9XCJwb2ludFwiXG4gICAgICAgICAgICB4MT0ke3RoaXMuc3RhcnRDb29yZC54fVxuICAgICAgICAgICAgeTE9JHt0aGlzLnN0YXJ0Q29vcmQueX1cbiAgICAgICAgICAgIHgyPSR7dGhpcy5tb3VzZUNvb3JkLnh9XG4gICAgICAgICAgICB5Mj0ke3RoaXMubW91c2VDb29yZC55fVxuICAgICAgICAgICAgc3Ryb2tlPVwicmVkXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIlxuICAgICAgICAgIC8+YH1cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvbGluZS1jb250YWluZXI+YDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG4gICAgcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGUpOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoZSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktYXNzb2NpYWJsZS1ob3RzcG90Jyk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudCA9PiB7XG4gICAgICB0aGlzLm1vdXNlQ29vcmQgPSB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSB0aGlzLmdySW1hZ2VbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSAtIHRoaXMuZ3JJbWFnZVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVswXSArICdweCc7XG4gICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzFdICsgJ3B4JztcblxuICAgICAgaG90c3BvdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0UG9pbnQpIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB0aGlzLnN0YXJ0Q29vcmQgPSB7XG4gICAgICAgICAgICB4OiB0aGlzLnN0YXJ0UG9pbnQuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzBdLFxuICAgICAgICAgICAgeTogdGhpcy5zdGFydFBvaW50LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVsxXVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZW5kUG9pbnQpIHtcbiAgICAgICAgICB0aGlzLmVuZFBvaW50ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgICAgdGhpcy5fbGluZXMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLl9saW5lcyxcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQb2ludC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSArICcgJyArIHRoaXMuZW5kUG9pbnQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJylcbiAgICAgICAgICBdO1xuICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic6IFF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi8uLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpb25Ib3RzcG90cyhcbiAgc2hhcGU6IHN0cmluZyxcbiAgY29vcmRzTnVtYmVyOiBudW1iZXJbXSxcbiAgaW1nOiBIVE1MSW1hZ2VFbGVtZW50LFxuICBob3RzcG90OiBRdGlIb3RzcG90Q2hvaWNlXG4pIHtcbiAgc3dpdGNoIChzaGFwZSkge1xuICAgIGNhc2UgJ2NpcmNsZSc6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXNdID0gY29vcmRzTnVtYmVyO1xuICAgICAgICBjb25zdCBjZW50ZXJYUGVyID0gKGNlbnRlclggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBjZW50ZXJZUGVyID0gKGNlbnRlclkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmFkaXVzUGVyID0gKHJhZGl1cyAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGNlbnRlclhQZXIgLSByYWRpdXNQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gY2VudGVyWVBlciAtIHJhZGl1c1BlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gNCAqIHJhZGl1c1BlciArICdweCc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUuYm9yZGVyUmFkaXVzID0gYDk5OTlweGA7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3JlY3QnOlxuICAgICAge1xuICAgICAgICBjb25zdCBbbGVmdFgsIHRvcFksIHJpZ2h0WCwgYm90dG9tWV0gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgIGNvbnN0IGxlZnRYUGVyID0gKGxlZnRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgdG9wWVBlciA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHJpZ2h0WFBlciA9IChyaWdodFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBib3R0b21ZUGVyID0gKGJvdHRvbVkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gbGVmdFhQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gdG9wWVBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WFBlciAtIGxlZnRYUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVlQZXIgLSB0b3BZUGVyICsgJyUnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwb2x5JzpcbiAgICAgIHtcbiAgICAgICAgLy8gZnJvbSBhLGIsYyxkLGUsZiA9PiBbe3g6YSwgeTpifSx7eDpjLCB5OmR9LHt4OmUsIHk6Zn1dXG4gICAgICAgIGNvbnN0IHBvbHljb29yZHMgPSBjb29yZHNOdW1iZXIucmVkdWNlKChhY2MsIGN1cnJlbnRWYWx1ZSwgY3VycmVudEluZGV4LCBwb2x5QykgPT4ge1xuICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggJSAyID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0VmFsID0gYWNjLnBvcCgpO1xuICAgICAgICAgICAgYWNjW2FjYy5sZW5ndGhdID0geyB4OiBsYXN0VmFsLCB5OiBwb2x5Q1tjdXJyZW50SW5kZXhdIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgYm91bmRpbmcgYm94IGJ5IGZpbmRpbmcgdGhlIG1heCBheCBtaW4gY29vcmRpbmF0ZXMgb2YgeCBhbmQgeVxuICAgICAgICBjb25zdCBsZWZ0WCA9IE1hdGgubWluKC4uLnBvbHljb29yZHMubWFwKHBvaW50ID0+IHBvaW50LngpKTtcbiAgICAgICAgY29uc3QgcmlnaHRYID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueCkpO1xuICAgICAgICBjb25zdCB0b3BZID0gTWF0aC5taW4oLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuICAgICAgICBjb25zdCBib3R0b21ZID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgcmVsYXRpdmUgZGlzdGFuY2UgY2F1c2Ugd2Ugd2FudCB0byB1c2UgcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgbGVmdFhQZXIgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCB0b3BZUGVyID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmlnaHRYUGVyID0gKHJpZ2h0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGJvdHRvbVlQZXIgPSAoYm90dG9tWSAvIGltZy5oZWlnaHQpICogMTAwO1xuXG4gICAgICAgIC8vIHNldCB0aGUgaG90c3BvdCBvbiB4LHkgYW5kIHNldCB0aGUgd2lkdGggYW5kIGhlaWdodCBpbiBwZXJjZW50YWdlc1xuICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDAgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFhQZXIgLSBsZWZ0WFBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZUGVyIC0gdG9wWVBlciArICclJztcblxuICAgICAgICAvLyBhbGwgdGhlIHBvbHlnb24gcG9pbnRzIHNob3VsZCBiZSBjb3JyZWN0ZWQgY2F1c2VkIHRoZXkgYXJlIGZyb21cbiAgICAgICAgLy8gaW1hZ2UgMCwwIHBvaW50LCBhbmQgc2hvdWxkIGJlIGZyb20gdGhlIGhvdHNwb3QgcG9pbnQgd2hpY2ggYWxyZWFkeVxuICAgICAgICAvLyBoYXMgYmVlbiBvZmZzZXR0ZWQgZnJvbSB0aGUgaW1hZ2UgaW4gdGhlIHByZXZpb3VzIGZldyBsaW5lcyBvZiBjb2RlXG4gICAgICAgIC8vIGFsc28gdGhlIHBvaW50cyBoYXZlIGEgcmVsYXRpdmUgZGlzdGFuY2UgdG8gdGhlIGltYWdlLCBidXQgbm93IGhhdmVcbiAgICAgICAgLy8gdG8gaGF2ZSBhIHJlbGF0aXZlIGRpc3RhbmNlIGZyb20gdGhlIHdpZHRoIG9mIHRoZSBob3RzcG90XG4gICAgICAgIGNvbnN0IHBvbHlnb25EYXRhID0gcG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gKHtcbiAgICAgICAgICB4OiAoKHBvaW50LnggLSBsZWZ0WCkgLyAocmlnaHRYIC0gbGVmdFgpKSAqIDEwMCxcbiAgICAgICAgICB5OiAoKHBvaW50LnkgLSB0b3BZKSAvIChib3R0b21ZIC0gdG9wWSkpICogMTAwXG4gICAgICAgIH0pKTtcblxuICAgICAgICAvLyBjcmVhdGUgY2xpcCBwYXRoIGNvb3JkaW5hdGUgc3R5bGUgaW4gcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgcG9seUQgPSBwb2x5Z29uRGF0YS5tYXAocCA9PiBNYXRoLnJvdW5kKHAueCkgKyAnJSAnICsgTWF0aC5yb3VuZChwLnkpICsgJyUnKS5qb2luKCcsJyk7XG5cbiAgICAgICAgLy8gNTAlIDAlLCAxMDAlIDUwJSwgNTAlIDEwMCUsIDAlIDUwJVxuICAgICAgICBob3RzcG90LnN0eWxlLmNsaXBQYXRoID0gYHBvbHlnb24oJHtwb2x5RH0pYDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNHYXBNYXRjaEludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKFxuICBJbnRlcmFjdGlvbixcbiAgJ3F0aS1nYXAtaW1nJyxcbiAgZmFsc2UsXG4gICdxdGktYXNzb2NpYWJsZS1ob3RzcG90J1xuKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cbiAgICBzbG90W25hbWU9J3F0aS1nYXAtaW1nJ10ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGdhcDogMXJlbTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPHNsb3QgbmFtZT1cInF0aS1nYXAtaW1nXCI+PC9zbG90PmA7XG4gIH1cblxuICBwcml2YXRlIHBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIoZTogQ3VzdG9tRXZlbnQ8bnVsbD4pOiB2b2lkIHtcbiAgICBjb25zdCBpbWcgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgY29uc3QgaG90c3BvdCA9IGUudGFyZ2V0IGFzIFF0aUhvdHNwb3RDaG9pY2U7XG4gICAgY29uc3QgY29vcmRzID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ2Nvb3JkcycpO1xuICAgIGNvbnN0IHNoYXBlID0gaG90c3BvdC5nZXRBdHRyaWJ1dGUoJ3NoYXBlJyk7XG4gICAgY29uc3QgY29vcmRzTnVtYmVyID0gY29vcmRzLnNwbGl0KCcsJykubWFwKHMgPT4gcGFyc2VJbnQocykpO1xuXG4gICAgLy8gcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICAgIHN3aXRjaCAoc2hhcGUpIHtcbiAgICAgIGNhc2UgJ2NpcmNsZSc6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCBbY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBjZW50ZXJYIC0gcmFkaXVzICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGNlbnRlclkgLSByYWRpdXMgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSBob3RzcG90LnN0eWxlLmhlaWdodCA9IDIgKiByYWRpdXMgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyZWN0JzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtsZWZ0WCwgdG9wWSwgcmlnaHRYLCBib3R0b21ZXSA9IGNvb3Jkc051bWJlcjtcbiAgICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBsZWZ0WCArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS50b3AgPSB0b3BZICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLndpZHRoID0gcmlnaHRYIC0gbGVmdFggKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gYm90dG9tWSAtIHRvcFkgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY0dhcE1hdGNoSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgQ2hvaWNlLCBDaG9pY2VzTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMubWl4aW4nO1xuaW1wb3J0IHsgUXRpSG90c3BvdENob2ljZSB9IGZyb20gJy4uL3F0aS1ob3RzcG90LWNob2ljZSc7XG5cbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxudHlwZSBIb3RzcG90Q2hvaWNlID0gQ2hvaWNlICYgeyBvcmRlcjogbnVtYmVyIH07XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb24gZXh0ZW5kcyBDaG9pY2VzTWl4aW4oSW50ZXJhY3Rpb24sICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuXG4gIC8vIGRvIG5vdCBzZWxlY3QgKCBoaWdobGlnaHQgYmx1ZSwgdGhlIGltYWdlKVxuICAvLyB0YXJnZXQgdGhlIG1haW4gc2xvdCBtYWtlIGl0IHJlbGF0aXZlIGFuZCBmaXQgd2l0aCB0aGUgY29udGVuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgc2xvdDpub3QoW25hbWU9J3Byb21wdCddKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogcXRpLWhvdHNwb3QtY2hvaWNlIHJlbGF0aXZlIHRvIHRoZSBzbG90ICovXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7IC8qIGhvdHNwb3RzIG5vdCBzdHJldGNoaW5nIGZ1cnRoZXIgaWYgaW1hZ2UgaXMgYXQgbWF4IHNpemUgKi9cbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgLyogaW1hZ2Ugbm90IHNlbGVjdGFibGUgYW55bW9yZSAqL1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SG90c3BvdE9yZGVyKGU6IEN1c3RvbUV2ZW50PHsgaWRlbnRpZmllcjogc3RyaW5nOyBjaGVja2VkOiBib29sZWFuIH0+KTogdm9pZCB7XG4gICAgY29uc3QgeyBpZGVudGlmaWVyIH0gPSBlLmRldGFpbDtcblxuICAgIGNvbnN0IGhvdHNwb3QgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maW5kKGVsID0+IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpID09PSBpZGVudGlmaWVyKSBhcyBIb3RzcG90Q2hvaWNlO1xuXG4gICAgY29uc3QgbWF4U2VsZWN0aW9uID0gdGhpcy5fY2hvaWNlRWxlbWVudHMubGVuZ3RoO1xuICAgIGlmICghdGhpcy5jaG9pY2VPcmRlcmluZykge1xuICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IHRydWU7XG4gICAgICBpZiAoaG90c3BvdC5vcmRlciA9PSBudWxsKSB7XG4gICAgICAgIGlmICgodGhpcy5fY2hvaWNlRWxlbWVudHMgYXMgSG90c3BvdENob2ljZVtdKS5maWx0ZXIoaSA9PiBpLm9yZGVyID4gMCkubGVuZ3RoID49IG1heFNlbGVjdGlvbikge1xuICAgICAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47IC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIHVzZXIgYWxyZWFkeSBzZWxlY3RlZCA1IGltYWdlcy5cbiAgICAgICAgfVxuICAgICAgICBob3RzcG90Lm9yZGVyID0gKHRoaXMuX2Nob2ljZUVsZW1lbnRzIGFzIEhvdHNwb3RDaG9pY2VbXSkuZmlsdGVyKGkgPT4gISFpLm9yZGVyKS5sZW5ndGggKyAxO1xuICAgICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICh0aGlzLl9jaG9pY2VFbGVtZW50cyBhcyBIb3RzcG90Q2hvaWNlW10pLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICAgICAgaWYgKGhvdHNwb3Qub3JkZXIgPiBob3RzcG90Lm9yZGVyKSB7XG4gICAgICAgICAgICBob3RzcG90Lm9yZGVyLS07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBob3RzcG90O1xuICAgICAgICB9KTtcbiAgICAgICAgaG90c3BvdC5vcmRlciA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdhY3RpdmF0ZS1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhY3RpdmF0ZS1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJzogUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXNNaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcy5taXhpbic7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHNwb3RJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXNNaXhpbihJbnRlcmFjdGlvbiwgJ3F0aS1ob3RzcG90LWNob2ljZScpIHtcbiAgLy8gZG8gbm90IHNlbGVjdCAoIGhpZ2hsaWdodCBibHVlLCB0aGUgaW1hZ2UpXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgLyogd2lkdGg6MTAwJTsgKi9cbiAgICAgIH1cbiAgICBgXG4gIF07XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncmVnaXN0ZXItcXRpLWhvdHNwb3QtY2hvaWNlJywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndW5yZWdpc3Rlci1xdGktaG90c3BvdC1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWludGVyYWN0aW9uJzogUXRpSG90c3BvdEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgQ1NTUmVzdWx0R3JvdXAsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VJbnRlcmFjdGlvbiB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0Jztcbi8vIGltcG9ydCB7IFRvdWNoRHJhZ0FuZERyb3AgfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AnO1xuaW1wb3J0ICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCB7IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24uc3R5bGVzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5pbnRlcmZhY2UgQ29sdW1uIHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUm93IHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBpc0NoZWNrZWQ6IGJvb2xlYW47XG59XG5cbkBjdXN0b21FbGVtZW50KCdxdGktbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oXG4gIEludGVyYWN0aW9uLFxuICAncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyxcbiAgZmFsc2UsXG4gICdxdGktc2ltcGxlLW1hdGNoLXNldDpsYXN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSdcbikge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICByb3dzOiBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlW107XG4gIGNvbHM6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2VbXTtcbiAgbGFzdENoZWNrZWRSYWRpbzogSFRNTElucHV0RWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIEBzdGF0ZSgpIF9yZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10gPSBbXTtcbiAgLy8gZHJhZ0Ryb3BBcGk6IFRvdWNoRHJhZ0FuZERyb3A7XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgcmV0dXJuIHN1cGVyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgIGVsc2UgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlIGFzIHN0cmluZ1tdO1xuICB9XG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZ1tdKSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgc3VwZXIudmFsdWUgPSB2YWw7XG4gICAgZWxzZSB0aGlzLl9yZXNwb25zZSA9IHZhbDtcbiAgfVxuICBAc3RhdGUoKSBjb3JyZWN0T3B0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KSByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZyA9ICcnO1xuXG4gIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpID0gbmV3IFRvdWNoRHJhZ0FuZERyb3AoKTtcbiAgICAvLyB0aGlzLmRyYWdEcm9wQXBpLmFkZERyYWdnYWJsZUVsZW1lbnRzKFxuICAgIC8vICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgIC8vICk7XG4gICAgLy8gdGhpcy5kcmFnRHJvcEFwaS5hZGREcm9wcGFibGVFbGVtZW50cyhcbiAgICAvLyAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6bGFzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgIC8vICk7XG4gICAgdGhpcy5yb3dzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlPihcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuICAgIHRoaXMuY29scyA9IEFycmF5LmZyb208UXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZT4oXG4gICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0Omxhc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuXG4gICAgdGhpcy52YWx1ZSA9IFtdO1xuICB9XG5cbiAgaGFuZGxlUmFkaW9DbGljayA9IGUgPT4ge1xuICAgIGNvbnN0IHJhZGlvID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBpZiAodGhpcy5sYXN0Q2hlY2tlZFJhZGlvID09PSByYWRpbykge1xuICAgICAgcmFkaW8uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gbnVsbDtcbiAgICAgIHRoaXMuaGFuZGxlUmFkaW9DaGFuZ2UoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IHJhZGlvO1xuICAgIH1cbiAgfTtcblxuICBoYW5kbGVSYWRpb0NoYW5nZSA9IGUgPT4ge1xuICAgIGNvbnN0IGNoZWNrYm94ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCB2YWx1ZSA9IGNoZWNrYm94LnZhbHVlO1xuICAgIGNvbnN0IG5hbWUgPSBjaGVja2JveC5uYW1lO1xuICAgIGNvbnN0IHR5cGUgPSBjaGVja2JveC50eXBlO1xuXG4gICAgaWYgKGNoZWNrYm94LmNoZWNrZWQpIHtcbiAgICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgICB0aGlzLnZhbHVlID0gW3ZhbHVlXTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2LmluZGV4T2YobmFtZSkgPT09IC0xKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMudmFsdWUsIHZhbHVlXTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IGNoZWNrYm94O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSk7XG4gICAgICB0aGlzLmxhc3RDaGVja2VkUmFkaW8gPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxSZXNwb25zZUludGVyYWN0aW9uPigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICByZXNwb25zZTogQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IFsuLi50aGlzLnZhbHVlXSA6IHRoaXMudmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9O1xuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UocmVzcG9uc2VWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAocmVzcG9uc2VWYWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2VWYWx1ZSkpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbnMgPSByZXNwb25zZVZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBpZiAoIXRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSB7XG4gICAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PiA8c2xvdD48L3Nsb3Q+YDtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHRhYmxlPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgJHt0aGlzLmNvbHMubWFwKChjb2wsIGkpID0+IGh0bWxgPHRoIHBhcnQ9XCJyLWhlYWRlclwiPiR7dW5zYWZlSFRNTChjb2wuaW5uZXJIVE1MKX08L3RoPmApfVxuICAgICAgICA8L3RyPlxuXG4gICAgICAgICR7dGhpcy5yb3dzLm1hcChcbiAgICAgICAgICAocm93LCBySW5kZXgpID0+XG4gICAgICAgICAgICBodG1sYDx0cj5cbiAgICAgICAgICAgICAgPHRkIHBhcnQ9XCJjLWhlYWRlclwiPiR7dW5zYWZlSFRNTChyb3cuaW5uZXJIVE1MKX08L3RkPlxuICAgICAgICAgICAgICAke3RoaXMuY29scy5tYXAoKGNvbCwgY0luZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93SWQgPSByb3cuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sSWQgPSBjb2wuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBgJHtyb3dJZH0gJHtjb2xJZH1gO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSW5Sb3dDb3VudCA9IHRoaXMudmFsdWUuZmlsdGVyKHYgPT4gdi5zcGxpdCgnICcpWzBdID09PSByb3dJZCkubGVuZ3RoIHx8IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IHRoaXMudmFsdWUuaW5jbHVkZXModmFsdWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBgcmIgJHtjaGVja2VkID8gJ3JiLWNoZWNrZWQnIDogJyd9ICR7dGhpcy5jb3JyZWN0T3B0aW9ucy5pbmNsdWRlcyh2YWx1ZSkgPyAncmItY29ycmVjdCcgOiAnJ31gO1xuICAgICAgICAgICAgICAgIC8vIGRpc2FibGUgaWYgbWF0Y2ggbWF4IGlzIGdyZWF0ZXIgdGhhbiAxIGFuZCBtYXggaXMgcmVhY2hlZFxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc2FibGUgPVxuICAgICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICA6IHJvdy5tYXRjaE1heCA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICA6IHNlbGVjdGVkSW5Sb3dDb3VudCA+PSByb3cubWF0Y2hNYXggJiYgIWNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWxgPHRkPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9JHtyb3cubWF0Y2hNYXggPT09IDEgPyAncmFkaW8nIDogYGNoZWNrYm94YH1cbiAgICAgICAgICAgICAgICAgICAgcGFydD0ke3BhcnR9XG4gICAgICAgICAgICAgICAgICAgIG5hbWU9JHtyb3dJZH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9JHt2YWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgLmRpc2FibGVkPSR7ZGlzYWJsZX1cbiAgICAgICAgICAgICAgICAgICAgQGNoYW5nZT0ke2UgPT4gdGhpcy5oYW5kbGVSYWRpb0NoYW5nZShlKX1cbiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7ZSA9PiAocm93Lm1hdGNoTWF4ID09PSAxID8gdGhpcy5oYW5kbGVSYWRpb0NsaWNrKGUpIDogbnVsbCl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvdGQ+YDtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L3RyPmBcbiAgICAgICAgKX1cbiAgICAgIDwvdGFibGU+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qIFxucXRpLW1hdGNoLWludGVyYWN0aW9uXG5xdGktYXNzb2NpYXRlLWludGVyYWN0aW9uXG4qL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuLy8gdHNsaW50OmRpc2FibGU6IGluZGVudFxuZXhwb3J0IGNsYXNzIFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIHNsb3RbbmFtZT0ncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSddIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgYDtcblxuICAvKiogdGhlIG1pbmltYWwgbnVtYmVyIG9mIHNlbGVjdGlvbnMgYSBjYW5kaWRhdGUgbXVzdCBtYWtlICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1pbidcbiAgfSlcbiAgcHVibGljIG1hdGNoTWluOiBudW1iZXIgPSAwO1xuXG4gIC8qKiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0aW9ucyBhIGNhbmRpZGF0ZSBtdXN0IG1ha2UsIHRoZSBvdGhlciBvcHRpb25zIHdpbGwgYmUgZGlzYWJsZWQgd2hlbiBtYXggb3B0aW9ucyBpcyBjaGVja2VkICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1heCdcbiAgfSlcbiAgcHVibGljIG1hdGNoTWF4OiBudW1iZXIgPSAxO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBhdHRyaWJ1dGU6ICdmaXhlZCdcbiAgfSlcbiAgcHVibGljIGZpeGVkID0gZmFsc2U7XG5cbiAgLy8gcGs6IFRoaXMgbmVlZHMgc29tZSBleHBsYW5hdGlvblxuICAvLyBpbiB0aGUgYXNzb2NpYXRlIGludGVyYWN0aW9uIHRoZXJlIGlzIGEgc3BlY2lhbCBzbG90IGZvciB0aGVzZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlc1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncGFydCcsICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyk7XG4gIH1cblxuICAvLyBwazogVGhpcyBuZWVkcyBzb21lIGV4cGxhbmF0aW9uXG4gIC8vIGluIHF0aS1tYXRjaC1pbnRlcmFjdGlvbiwgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyB1c2VkIHRvIGRlbm90ZSB0aGVcbiAgLy8gZHJhZ2dhYmxlLCBidXQgYWxzbyB0aGUgZHJvcHBhYmxlLiBXRUlSRC4uIGJ1dCBsZXRzIGRlYWwgd2l0aCBpdC5cbiAgLy8gU28gd2UgaGF2ZSBhIHNsb3QgZm9yIHdoZW5ldmVyIGFub3RoZXIgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyBkcm9wcGVkIGluIGhlcmUuXG4gIC8vIEFuZCB3ZSBoYXZlIHNsb3QgZm9yIGNvbnRlbnQgbGlrZSBpbiB0aGlzIGFzc29jaWF0ZSBpbnRlcmFjdGlvblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IHBhcnQ9XCJkcm9wc2xvdFwiIG5hbWU9XCJxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlXCI+PC9zbG90PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSc6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuLy8gaW1wb3J0IGNvbXBvbmVudFN0eWxlcyBmcm9tICcuLi8uLi91dGlsaXRpZXMvc3R5bGVzL2NvbXBvbmVudC5zdHlsZXMnO1xuXG4vKiAke2NvbXBvbmVudFN0eWxlc30gKi9cbmV4cG9ydCBkZWZhdWx0IGNzc2BcbiAgc2xvdCB7XG4gICAgLyogc2xvdCB3aGVyZSB0aGUgKi9cbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZ2FwOiAwLjVyZW07XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7IC8qIHByZXZlbnRzIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZpbmcgdGhlIHNhbWUgaGVpZ2h0ICovXG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkgc2xvdCB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgfVxuICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLWxlZnQpIHNsb3Qge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIH1cbiAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSBzbG90IHtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gIH1cbiAgc2xvdFtuYW1lPSdwcm9tcHQnXSB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbiAgOjpzbG90dGVkKHF0aS1zaW1wbGUtbWF0Y2gtc2V0KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoZSBkcmFnIGFuZCBkcm9wIGNvbnRhaW5lciBzbG90cyBoYXZlIHRoZSBzYW1lIHdpZHRoICovXG4gICAgZmxleDogMTtcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1lZGlhLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlNZWRpYUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIF92YWx1ZSA9IDA7XG4gIHJlc2V0KCkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBtYXliZSBjaGVjayBpZiB0aGUgbWVkaWEgaGFzIGJlZW4gcGxheWVkP1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4ocGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpKTtcbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gcGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLkludGVyYWN0aW9uLnByb3BlcnRpZXMsXG4gICAgICAuLi57XG4gICAgICAgIHN0ZXA6IHtcbiAgICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgICAgYXR0cmlidXRlOiAnc3RlcCcsXG4gICAgICAgICAgZGVmYXVsdDogMTBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW2Nzc2BgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vIGdldCBhdWRpbywgdmlkZW8gb2Ygb2JqZWN0IHRhZy5cbiAgICBjb25zdCBtZWRpYU9iamVjdCA9IHRoaXMucXVlcnlTZWxlY3RvcignYXVkaW8nKSB8fCB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3ZpZGVvJykgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCdvYmplY3QnKTtcbiAgICBpZiAobWVkaWFPYmplY3QpIHtcbiAgICAgIC8vIGxpc3RlbiB0byBlbmRlZCBldmVudFxuICAgICAgbWVkaWFPYmplY3QuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCAoKSA9PiB7XG4gICAgICAgIC8vIHNldCB2YWx1ZSB0byAwXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoaXMudmFsdWUgaXMgYSBudW1iZXJcbiAgICAgICAgdGhpcy5fdmFsdWUrKztcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW1lZGlhLWludGVyYWN0aW9uJzogUXRpTWVkaWFJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5pbXBvcnQgeyBTaHVmZmxlTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9zaHVmZmxlL3NodWZmbGUtbWl4aW4nOyAvLyBJbXBvcnQgdGhlIG1peGluXG5pbXBvcnQgeyBRdGlTaW1wbGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWNob2ljZSc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3JkZXJJbnRlcmFjdGlvbiBleHRlbmRzIFNodWZmbGVNaXhpbihcbiAgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKEludGVyYWN0aW9uLCBgcXRpLXNpbXBsZS1jaG9pY2VgLCB0cnVlLCAnZHJvcC1saXN0JyksXG4gICdxdGktc2ltcGxlLWNob2ljZSdcbikge1xuICBjaGlsZHJlbk1hcDogRWxlbWVudFtdO1xuXG4gIEBzdGF0ZSgpIG5yQ2hvaWNlczogbnVtYmVyID0gMDtcbiAgQHN0YXRlKCkgY29ycmVjdFJlc3BvbnNlczogc3RyaW5nW10gPSBbXTtcbiAgQHN0YXRlKCkgc2hvd0NvcnJlY3RSZXNwb25zZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICAgICAgICBncmlkLWF1dG8tY29sdW1uczogMWZyO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIFtwYXJ0PSdkcm9wcyddIHtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0ndmVydGljYWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSBbcGFydD0nZHJvcHMnXSB7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiByb3c7XG4gICAgICB9XG5cbiAgICAgIFtwYXJ0PSdkcm9wLWxpc3QnXSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgfVxuXG4gICAgICBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgICBpZiAodGhpcy5uckNob2ljZXMgPCBjaG9pY2VzLmxlbmd0aCkge1xuICAgICAgdGhpcy5uckNob2ljZXMgPSBjaG9pY2VzLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPiA8L3Nsb3Q+XG4gICAgICA8ZGl2IHBhcnQ9XCJjb250YWluZXJcIj5cbiAgICAgICAgPHNsb3QgcGFydD1cImRyYWdzXCI+IDwvc2xvdD5cbiAgICAgICAgPGRpdiBwYXJ0PVwiZHJvcHNcIj5cbiAgICAgICAgICAke0FycmF5LmZyb20oQXJyYXkodGhpcy5uckNob2ljZXMpKS5tYXAoXG4gICAgICAgICAgICAoXywgaSkgPT5cbiAgICAgICAgICAgICAgaHRtbGA8ZHJvcC1saXN0IHBhcnQ9XCJkcm9wLWxpc3RcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2l9XCI+PC9kcm9wLWxpc3Q+JHt0aGlzLnNob3dDb3JyZWN0UmVzcG9uc2VzICYmXG4gICAgICAgICAgICAgICAgdGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA+IGlcbiAgICAgICAgICAgICAgICAgID8gdW5zYWZlSFRNTChgPHNwYW4gcGFydD0nY29ycmVjdC1yZXNwb25zZSc+JHt0aGlzLmNvcnJlY3RSZXNwb25zZXNbaV19PC9zcGFuPmApXG4gICAgICAgICAgICAgICAgICA6ICcnfWBcbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb3JyZWN0UmVzcG9uc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgcmVzcG9uc2VzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG5cbiAgICAgIHJlc3BvbnNlcy5mb3JFYWNoKChyZXNwb25zZSwgaW5kZXgpID0+IHtcbiAgICAgICAgbGV0IHNpbXBsZUNob2ljZSA9IHRoaXMucXVlcnlTZWxlY3RvcihgcXRpLXNpbXBsZS1jaG9pY2VbaWRlbnRpZmllcj1cIiR7cmVzcG9uc2V9XCJdYCk7XG4gICAgICAgIGlmICghc2ltcGxlQ2hvaWNlKSB7XG4gICAgICAgICAgc2ltcGxlQ2hvaWNlID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYHF0aS1zaW1wbGUtY2hvaWNlW2lkZW50aWZpZXI9XCIke3Jlc3BvbnNlfVwiXWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGV4dCA9IHNpbXBsZUNob2ljZT8udGV4dENvbnRlbnQudHJpbSgpO1xuICAgICAgICB0aGlzLmNvcnJlY3RSZXNwb25zZXMgPSBbLi4udGhpcy5jb3JyZWN0UmVzcG9uc2VzLCB0ZXh0XTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSB0cnVlO1xuICB9XG5cbiAgLy8gc29tZSBpbnRlcmFjdGlvbnMgaGF2ZSBhIGRpZmZlcmVudCB3YXkgb2YgZ2V0dGluZyB0aGUgcmVzcG9uc2VcbiAgLy8gdGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgZHJhZyBhbmQgZHJvcCBtaXhpbiBjbGFzc1xuICAvLyB5b3UgaGF2ZSB0byBpbXBsZW1lbnQgeW91ciBvd24gZ2V0UmVzcG9uc2UgbWV0aG9kIGluIHRoZSBzdXBlcmNsYXNzXG4gIC8vIGNhdXNlIHRoZXkgYXJlIGRpZmZlcmVudCBmb3Igc29tZSBpbnRlcmFjdGlvbnMuXG4gIC8vIE1IOiBpcyB0aGlzIGZ1bmN0aW9uIGNhbGxlZD8gU2hvdWxkbid0IHdlIHVzZSBnZXRWYWx1ZT9cbiAgcHJvdGVjdGVkIGdldFJlc3BvbnNlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBkcm9wcGFibGVzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVDaG9pY2U+KHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdkcm9wLWxpc3QnKSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGRyb3BwYWJsZXMubWFwKGRyb3BwYWJsZSA9PiB7XG4gICAgICBjb25zdCBkcmFnc0luRHJvcHBhYmxlID0gZHJvcHBhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpO1xuICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSBBcnJheS5mcm9tKGRyYWdzSW5Ecm9wcGFibGUpLm1hcChkID0+IGQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpO1xuICAgICAgcmV0dXJuIFsuLi5pZGVudGlmaWVyc10uam9pbignICcpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICB0aGlzLmNoaWxkcmVuTWFwID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgIHRoaXMuY2hpbGRyZW5NYXAuZm9yRWFjaChlbCA9PiBlbC5zZXRBdHRyaWJ1dGUoJ3BhcnQnLCAncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW9yZGVyLWludGVyYWN0aW9uJzogUXRpT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgY3Vyc29yOiBtb3ZlO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICB9XG4gICAgYFxuICBdO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24nLCBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbik7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJylcbmV4cG9ydCBjbGFzcyBRdGlQb3NpdGlvbk9iamVjdFN0YWdlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBzdGFydFg6IGFueTtcbiAgc3RhcnRZOiBhbnk7XG4gIGRyYWdFbGVtZW50OiBhbnk7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyID0gdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciA9IHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLmJpbmQodGhpcyk7XG4gIH1cblxuICAvLyBEZWZpbmUgYSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIG1vdXNlbW92ZSBldmVudCBvbiB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgZHJhZ0VsZW1lbnRIYW5kbGVyKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgdGhlIG1vdXNlIGhhcyBtb3ZlZCBzaW5jZSB0aGUgbGFzdCBldmVudFxuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXJ0WDtcbiAgICBjb25zdCBkZWx0YVkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuZHJhZ0VsZW1lbnQuc3R5bGUubGVmdCA9IHRoaXMuZHJhZ0VsZW1lbnQub2Zmc2V0TGVmdCArIGRlbHRhWCArICdweCc7XG4gICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS50b3AgPSB0aGlzLmRyYWdFbGVtZW50Lm9mZnNldFRvcCArIGRlbHRhWSArICdweCc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoYSk6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChhKTtcblxuICAgIC8vIEdldCB0aGUgZHJhZ2dhYmxlIGFuZCBkcm9wIHpvbmUgZWxlbWVudHNcbiAgICB0aGlzLmRyYWdFbGVtZW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uPmltZycpO1xuICAgIC8vIGNvbnN0IGNhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FudmFzJyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlcyBmb3IgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuc3RhcnRYID0gMDtcbiAgICB0aGlzLnN0YXJ0WSA9IDA7XG5cbiAgICAvLyBBZGQgYSBtb3VzZWRvd24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5kcmFnRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIFNhdmUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgICAvLyBBZGQgYSBtb3VzZW1vdmUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRvY3VtZW50XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlbW92ZU1vdmVMaXN0ZW5lcihldmVudCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLCB0cnVlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZSc6IFF0aVBvc2l0aW9uT2JqZWN0U3RhZ2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHN0eWxlTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvc3R5bGUtbWFwLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgICAgcG9pbnQtY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnXG4gIH0pXG4gIHB1YmxpYyBtYXhDaG9pY2VzOiBudW1iZXIgPSBJbmZpbml0eTtcblxuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtaW4tY2hvaWNlcydcbiAgfSlcbiAgcHVibGljIG1pbkNob2ljZXM6IG51bWJlciA9IDA7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfcG9pbnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFJlZmVyZW5jZSB0byB0aGUgaW1hZ2UgZWxlbWVudFxuICBwcml2YXRlIF9pbWdFbGVtZW50OiBIVE1MSW1hZ2VFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gRXh0cmFjdGVkIGNsaWNrIGhhbmRsZXIgbWV0aG9kXG4gIHByaXZhdGUgX29uSW1hZ2VDbGljayA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmICh0aGlzLl9wb2ludHMubGVuZ3RoIDwgdGhpcy5tYXhDaG9pY2VzKSB7XG4gICAgICBjb25zdCB4ID0gZXZlbnQub2Zmc2V0WDtcbiAgICAgIGNvbnN0IHkgPSBldmVudC5vZmZzZXRZO1xuXG4gICAgICB0aGlzLl9wb2ludHMgPSBbLi4udGhpcy5fcG9pbnRzLCBgJHt4fSAke3l9YF07XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLl9wb2ludHMpO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8cG9pbnQtY29udGFpbmVyPlxuICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICB0aGlzLl9wb2ludHMsXG4gICAgICAgICAgcG9pbnQgPT4gcG9pbnQsXG4gICAgICAgICAgKHBvaW50LCBpbmRleCkgPT4gaHRtbGBcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgcGFydD1cInBvaW50XCJcbiAgICAgICAgICAgICAgc3R5bGU9JHtzdHlsZU1hcCh7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKC01MCUsIC01MCUpJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiBgJHtwb2ludC5zcGxpdCgnICcpWzBdfXB4YCxcbiAgICAgICAgICAgICAgICB0b3A6IGAke3BvaW50LnNwbGl0KCcgJylbMV19cHhgXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUmVtb3ZlIHBvaW50IGF0ICR7cG9pbnR9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wb2ludHMgPSB0aGlzLl9wb2ludHMuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy5fcG9pbnRzKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvcG9pbnQtY29udGFpbmVyPmA7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9wb2ludHMgPSBbXTtcbiAgfVxuXG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wb2ludHMubGVuZ3RoID49IHRoaXMubWluQ2hvaWNlcyAmJiB0aGlzLl9wb2ludHMubGVuZ3RoIDw9IHRoaXMubWF4Q2hvaWNlcztcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fcG9pbnRzID0gQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsIDogW3ZhbF07XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRzO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuX2ltZ0VsZW1lbnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuXG4gICAgaWYgKHRoaXMuX2ltZ0VsZW1lbnQpIHtcbiAgICAgIC8vIEF0dGFjaCB0aGUgY2xpY2sgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHRoaXMuX2ltZ0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkltYWdlQ2xpY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIDxpbWc+IGVsZW1lbnQgZm91bmQgaW4gPHF0aS1zZWxlY3QtcG9pbnQtaW50ZXJhY3Rpb24+Jyk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGlmICh0aGlzLl9pbWdFbGVtZW50KSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIGNsaWNrIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGltYWdlIGVsZW1lbnRcbiAgICAgIHRoaXMuX2ltZ0VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkltYWdlQ2xpY2spO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJzogUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgcXVlcnkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgU2xpZGVySW50ZXJhY3Rpb24uVHlwZSAocXRpLXNsaWRlci1pbnRlcmFjdGlvbikgcHJlc2VudHMgdGhlIGNhbmRpZGF0ZSB3aXRoIGEgY29udHJvbCBmb3Igc2VsZWN0aW5nIGEgbnVtZXJpY2FsIHZhbHVlIGJldHdlZW4gYSBsb3dlciBhbmQgdXBwZXIgYm91bmQuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLnM2MXhjcmo0cWN5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA2LjBcbiAqXG4gKiBAZXZlbnQgcXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uIC0gZW1pdHRlZCB3aGVuIHRoZSBpbnRlcmFjdGlvbiB3YW50cyB0byByZWdpc3RlciBpdHNlbGZcbiAqIEBldmVudCBxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UgLSBlbWl0dGVkIHdoZW4gdGhlIGludGVyYWN0aW9uIGNoYW5nZXNcbiAqXG4gKiBAY3NzcHJvcCAtLXNob3ctdmFsdWUgLSBzaG93cyB0aGUgY3VycmVudCB2YWx1ZSB3aGlsZSBzbGlkaW5nXG4gKiBAY3NzcHJvcCAtLXNob3ctdGlja3MgLSBzaG93cyB0aGUgdGlja3MgYWNjb3JkaW5nIHRvIHN0ZXBzXG4gKiBAY3NzcHJvcCAtLXNob3ctYm91bmRzIC0gc2hvd3MgdmFsdWUgZm9yIGxvd2VyIGFuZCB1cHBlciBib3VuZGFyeVxuICpcbiAqIEBjc3NwYXJ0IHNsaWRlciAtLSBzbGlkZXIgaW5sdWRpbmcsIGJvdW5kcyBhbmQgdGlja3MgYW5kIHZhbHVlLCB1c2UgaXQgZm9yIHBhZGRpbmdzIGFuZCBtYXJnaW5zXG4gKiBAY3NzcGFydCBib3VuZHMgLS0gZGl2IGZvciBib3VuZHMsIGNvbnRhaW5pbmcgdHdvIGRpdnMgZm9yIHdpdGggbWluLCBhbmQgbWF4IGJvdW5kcyB2YWx1ZVxuICogQGNzc3BhcnQgdGlja3MgLS0gZGl2IGZvciB0aWNrcywgdXNlIGxpbmVhaXIgZ3JhZGllbnQgYW5kIGV4cG9zZWQgY3NzIHZhcmlhYmxlcyBmb3Igc3R5bGluZ1xuICogQGNzc3BhcnQgcmFpbCAtLSBkaXYgZm9yIHJhaWwsIHN0eWxlIGFjY29yZGluZyB0byBuZWVkc1xuICogQGNzc3BhcnQga25vYiAtLSBkaXYsIHNob3VsZCBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZVxuICogQGNzc3BhcnQgdmFsdWUgLS0gZGl2LCBjb250YWluaW5nIHZhbHVlXG4gKlxuICogQHNsb3QgLSBUaGUgZGVmYXVsdCBzbG90IHdoZXJlIDxxdGktc2ltcGxlLWNob2ljZT4gbXVzdCBiZSBwbGFjZWQuXG4gKiBAc2xvdCBwcm9tcHQgLSBzbG90IHdoZXJlIHRoZSBwcm9tcHQgaXMgcGxhY2VkLlxuICovXG5cbkBjdXN0b21FbGVtZW50KCdxdGktc2xpZGVyLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlTbGlkZXJJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgcHJpdmF0ZSBfdmFsdWUgPSAwO1xuICBjc0xpdmU6IENTU1N0eWxlRGVjbGFyYXRpb247XG5cbiAgQHF1ZXJ5KCcja25vYicpXG4gIHByaXZhdGUgX2tub2I6IEhUTUxFbGVtZW50O1xuXG4gIEBxdWVyeSgnI3JhaWwnKVxuICBwcml2YXRlIF9yYWlsOiBIVE1MRWxlbWVudDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdzdGVwLWxhYmVsJyB9KSBzdGVwTGFiZWwgPSBmYWxzZTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJldmVyc2UgPSBmYWxzZTtcblxuICBwcml2YXRlIF9taW46IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdsb3dlci1ib3VuZCcgfSkgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1pbicsIGAke3RoaXMuX21pbn1gKTtcbiAgfVxuICBnZXQgbWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHByaXZhdGUgX21heDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJyB9KSBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1heCcsIGAke3RoaXMuX21heH1gKTtcbiAgfVxuICBnZXQgbWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHByaXZhdGUgX3N0ZXA6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdzdGVwJyB9KSBzZXQgc3RlcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc3RlcCcsIGAke3RoaXMuX3N0ZXB9YCk7XG4gIH1cbiAgZ2V0IHN0ZXAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RlcDtcbiAgfVxuXG4gIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChvbGQsIGRpc2FibGVkKSA9PiB7fTtcblxuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAob2xkLCByZWFkb25seSkgPT4ge307XG5cbiAgcmVzZXQoKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgaXNOdW1iZXIgPSAhaXNOYU4ocGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpKTtcbiAgICBpZiAoaXNOdW1iZXIpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gcGFyc2VJbnQodmFsLnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICB9XG4gIH1cblxuICAvLyBzdGF0aWMgc2hhZG93Um9vdE9wdGlvbnM6IFNoYWRvd1Jvb3RJbml0ID0geyAuLi5MaXRFbGVtZW50LnNoYWRvd1Jvb3RPcHRpb25zLCBkZWxlZ2F0ZXNGb2N1czogdHJ1ZSwgbW9kZTogJ29wZW4nIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiB0aGUgY29tcHV0ZWQgc3R5bGUgaXMgYSBsaXZlIHByb3BlcnR5LCB3ZSB1c2UgdGhpcyB0byBnZXQgY3NzIHZhcmlhYmxlc1xuICAgIHNlZSByZW5kZXIgdGVtcGxhdGUgKi9cbiAgICB0aGlzLmNzTGl2ZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcyk7XG4gIH1cblxuICBzZXQgcmVzcG9uc2UobXlSZXNwb25zZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShteVJlc3BvbnNlKSkge1xuICAgICAgY29uc29sZS5lcnJvcignUXRpU2xpZGVySW50ZXJhY3Rpb246IHJlc3BvbnNlIGlzIGFuIGFycmF5LCBidXQgc2hvdWxkIGJlIGEgc2luZ2xlIHZhbHVlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQobXlSZXNwb25zZSk7XG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1F0aVNsaWRlckludGVyYWN0aW9uOiByZXNwb25zZSBpcyBub3QgYSBudW1iZXInKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbY3NzYGBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICAvLyBjb252ZXJ0IHRoZSB2YWx1ZSwgd2hpY2ggaXMgdGhlIHJlYWwgc2xpZGVyIHZhbHVlIHRvIGEgcGVyY2VudGFnZSBmb3IgdGhlIGRvbS5cbiAgICBpZiAodGhpcy5fdmFsdWUgPCB0aGlzLm1pbikge1xuICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLm1pbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ZhbHVlID4gdGhpcy5tYXgpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5tYXg7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlUGVyY2VudGFnZSA9ICgodGhpcy5fdmFsdWUgLSB0aGlzLm1pbikgLyAodGhpcy5tYXggLSB0aGlzLm1pbikpICogMTAwO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tdmFsdWUtcGVyY2VudGFnZScsIGAke3ZhbHVlUGVyY2VudGFnZX0lYCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCB0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIGh0bWxgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxkaXYgaWQ9XCJzbGlkZXJcIiBwYXJ0PVwic2xpZGVyXCI+XG4gICAgICAgICR7dGhpcy5jc0xpdmUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaG93LWJvdW5kcycpID09ICd0cnVlJ1xuICAgICAgICAgID8gaHRtbGA8ZGl2IGlkPVwiYm91bmRzXCIgcGFydD1cImJvdW5kc1wiPlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWlufTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PiR7dGhpcy5fbWF4fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICAgIDogbm90aGluZ31cbiAgICAgICAgJHt0aGlzLmNzTGl2ZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNob3ctdGlja3MnKSA9PSAndHJ1ZScgPyBodG1sYDxkaXYgaWQ9XCJ0aWNrc1wiIHBhcnQ9XCJ0aWNrc1wiPjwvZGl2PmAgOiBub3RoaW5nfVxuICAgICAgICA8ZGl2IGlkPVwicmFpbFwiIHBhcnQ9XCJyYWlsXCIgQG1vdXNlZG93bj0ke3RoaXMuX29uTW91c2VEb3dufSBAdG91Y2hzdGFydD0ke3RoaXMuX29uVG91Y2hNb3ZlfT5cbiAgICAgICAgICA8ZGl2IGlkPVwia25vYlwiIHBhcnQ9XCJrbm9iXCI+XG4gICAgICAgICAgICAke3RoaXMuY3NMaXZlLmdldFByb3BlcnR5VmFsdWUoJy0tc2hvdy12YWx1ZScpID09ICd0cnVlJ1xuICAgICAgICAgICAgICA/IGh0bWxgPGRpdiBpZD1cInZhbHVlXCIgcGFydD1cInZhbHVlXCI+JHt0aGlzLnZhbHVlfTwvZGl2PmBcbiAgICAgICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc3RlcCA9IDE7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncm9sZScsICdzbGlkZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gZXZlbnQgPT4ge1xuICAgICAgY29uc3QgeyB4IH0gPSB0aGlzLmdldFBvc2l0aW9uRnJvbUV2ZW50KGV2ZW50KTtcbiAgICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBoYW5kbGVUb3VjaEVuZCk7XG5cbiAgICBjb25zdCB7IHggfSA9IHRoaXMuZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZXZlbnQpO1xuICAgIGNvbnN0IGRpZmZYID0geCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlVXAgPSAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVNb3VzZVVwKTtcblxuICAgIC8vIGlmIHRoZSBxdGktc2xpZGVyLWludGVyYWN0aW9uIGhhcyBhbiBhYnNvbHV0ZSBsZWZ0IHBvc2l0aW9uIGFuZCBib2R5IGlzIHNjcm9sbGVkIGEgYml0LCB0YWtlIGFjY291bnQgZm9yIHRoYXRcbiAgICBjb25zdCBkaWZmWCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG5cbiAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqIGNhbGN1bGF0ZVZhbHVlIGdldHMgeCBwb3NpdGlvbiBhbmQgY29tcGFyZXMgdGhpcyB3aXRoIHRoZSB0b3RhbCB3aWR0aCBpbiBwaXhlbHMgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVWYWx1ZShkaWZmWDogbnVtYmVyKSB7XG4gICAgY29uc3QgdmFsdWVOb3cgPSB0aGlzLm1pbiArICgodGhpcy5tYXggLSB0aGlzLm1pbikgKiBkaWZmWCkgLyB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIGNvbnN0IHJvdW5kZWRTdGVwVmFsdWUgPSB0aGlzLm1pbiArIE1hdGgucm91bmQoKHZhbHVlTm93IC0gdGhpcy5taW4pIC8gdGhpcy5fc3RlcCkgKiB0aGlzLl9zdGVwO1xuICAgIHRoaXMuX3ZhbHVlID0gcm91bmRlZFN0ZXBWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZTogYW55KToge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH0ge1xuICAgIGxldCBfdG91Y2hNb3ZlO1xuICAgIGlmIChlLnR5cGUgPT0gJ3RvdWNoc3RhcnQnIHx8IGUudHlwZSA9PSAndG91Y2htb3ZlJyB8fCBlLnR5cGUgPT0gJ3RvdWNoZW5kJyB8fCBlLnR5cGUgPT0gJ3RvdWNoY2FuY2VsJykge1xuICAgICAgY29uc3QgZXZ0ID0gdHlwZW9mIGUub3JpZ2luYWxFdmVudCA9PT0gJ3VuZGVmaW5lZCcgPyBlIDogZS5vcmlnaW5hbEV2ZW50O1xuICAgICAgY29uc3QgdG91Y2ggPSBldnQudG91Y2hlc1swXSB8fCBldnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiB0b3VjaC5wYWdlWCxcbiAgICAgICAgeTogdG91Y2gucGFnZVlcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGUudHlwZSA9PSAnbW91c2Vkb3duJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZXVwJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZW1vdmUnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlb3ZlcicgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2VvdXQnIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlZW50ZXInIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlbGVhdmUnXG4gICAgKSB7XG4gICAgICBfdG91Y2hNb3ZlID0ge1xuICAgICAgICB4OiBlLmNsaWVudFgsXG4gICAgICAgIHk6IGUuY2xpZW50WVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIF90b3VjaE1vdmU7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNsaWRlci1pbnRlcmFjdGlvbic6IFF0aVNsaWRlckludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2FsY3VsYXRlIH0gZnJvbSAnLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQgfSBmcm9tICcuLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5cbi8qKlxuICogaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5maTI5cThkdWJqZ3dcbiAqIDxxdGktY3VzdG9tLW9wZXJhdG9yIGNsYXNzPVwianMub3JnXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJzdHJpbmdcIj48IVtDREFUQVtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjb250ZXh0LnZhcmlhYmxlcyk7XG4gICAgICAgICAgcmV0dXJuICdCJ1xuICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbicpLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICBdXT48L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktY3VzdG9tLW9wZXJhdG9yPlxuICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWN1c3RvbS1vcGVyYXRvcicpXG5leHBvcnQgY2xhc3MgUXRpQ3VzdG9tT3BlcmF0b3IgZXh0ZW5kcyBMaXRFbGVtZW50IGltcGxlbWVudHMgQ2FsY3VsYXRlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBwcml2YXRlIG9wZXJhdG9yRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9jb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IEBzbG90Y2hhbmdlPSR7dGhpcy5oYW5kbGVTbG90Q2hhbmdlfT48L3Nsb3Q+YDtcbiAgfVxuXG4gIGhhbmRsZVNsb3RDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gZXhwZWN0aW5nIDxbIUNEQVRBWyAuLi4gXV0+IGlzIGNvbnZlcnRlZCBpbnRvIDwhLS0gLi4uIC0tPiB3aXRoIHF0aS10cmFuc2Zvcm06IGNEYXRhVG9Db21tZW50XG4gICAgY29uc3QgY29tbWVudE5vZGUgPSBBcnJheS5mcm9tKHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQ/LmNoaWxkTm9kZXMgPz8gW10pLmZpbmQoXG4gICAgICBub2RlID0+IG5vZGUubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vcGVyYXRvckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKCdjb250ZXh0JywgJ2ZuJywgJ2l0ZW0nLCBjb21tZW50Tm9kZS50ZXh0Q29udGVudCA/PyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignY3VzdG9tLW9wZXJhdG9yIGNvbnRhaW5zIGludmFsaWQgamF2YXNjcmlwdCBjb2RlJywgZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCBmbiA9IHtcbiAgICAgIHZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGNvcnJlY3Q6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgICAgICAgKHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpIGFzIFJlc3BvbnNlVmFyaWFibGUpXG4gICAgICAgICAgPy5jb3JyZWN0UmVzcG9uc2UgPz8gJydcbiAgICB9O1xuICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICBnZXRWYXJpYWJsZTogKHZhcmlhYmxlSWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLl9jb250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdmFyaWFibGVJZGVudGlmaWVyKSxcbiAgICAgIHVwZGF0ZU91dGNvbWVWYXJpYWJsZTogKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1cGRhdGVSZXNwb25zZVZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmc7IHJlc3BvbnNlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvckZ1bmN0aW9uKHRoaXMuX2NvbnRleHQsIGZuLCBpdGVtKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY3VzdG9tLW9wZXJhdG9yJzogUXRpQ3VzdG9tT3BlcmF0b3I7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnKVxuZXhwb3J0IGNsYXNzIFF0aUFzc29jaWFibGVIb3RzcG90IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC1pbWdcIj48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc29jaWFibGUtaG90c3BvdCc6IFF0aUFzc29jaWFibGVIb3RzcG90O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcCcpXG5leHBvcnQgY2xhc3MgUXRpR2FwIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicXRpLWdhcC10ZXh0XCI+PC9zbG90PmA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcCc6IFF0aUdhcDtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtaW1nJylcbmV4cG9ydCBjbGFzcyBRdGlHYXBJbWcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgfVxuICBgO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLWltZycpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtaW1nJzogUXRpR2FwSW1nO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZ2FwLXRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUdhcFRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1nYXAtdGV4dCcpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgdGFiaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IDA7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktZ2FwLXRleHQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwLXRleHQnOiBRdGlHYXBUZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8vIHR5cGUgc2hhcGUgPSB7IHNoYXBlOiAncmVjdCcgfCAnY2lyY2xlJyB8ICdwb2x5JzsgY29vcmRzOiBudW1iZXJbXSB9O1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHNwb3QtY2hvaWNlJylcbmV4cG9ydCBjbGFzcyBRdGlIb3RzcG90Q2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktaG90c3BvdC1jaG9pY2UnKSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnYXJpYS1vcmRlcnZhbHVlJywgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIG9yZGVyOiBudW1iZXI7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWNob2ljZSc6IFF0aUhvdHNwb3RDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEFjdGl2ZUVsZW1lbnRNaXhpbiB9IGZyb20gJy4vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHRleHQnKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHRleHQgZXh0ZW5kcyBBY3RpdmVFbGVtZW50TWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1ob3R0ZXh0Jykge1xuICBzdGF0aWMgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgcGFydD1cImNoXCI+PGRpdiBwYXJ0PVwiY2hhXCI+PC9kaXY+PC9kaXY+XG4gICAgICA8c2xvdD48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQnOiBRdGlIb3R0ZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWlubGluZS1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUlubGluZUNob2ljZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgb3ZlcnJpZGUgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3NzYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB9XG4gICAgICBgXG4gICAgXTtcbiAgfVxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLXJlZ2lzdGVyJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vblNlbGVjdElubGluZUNob2ljZSk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90Pjwvc2xvdD4gYDtcbiAgfVxuXG4gIHByaXZhdGUgX29uU2VsZWN0SW5saW5lQ2hvaWNlKCkge1xuICAgIC8vIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWlubGluZS1jaG9pY2Utc2VsZWN0Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1pbmxpbmUtY2hvaWNlJzogUXRpSW5saW5lQ2hvaWNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50LCBub3RoaW5nIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQWN0aXZlRWxlbWVudE1peGluIH0gZnJvbSAnLi9pbnRlcm5hbC9hY3RpdmUtZWxlbWVudC9hY3RpdmUtZWxlbWVudC5taXhpbic7XG5cbi8qKlxuICogcXRpLW9yZGVyLWludGVyYWN0aW9uXG4gKiBxdGktY2hvaWNlLWludGVyYWN0aW9uXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktc2ltcGxlLWNob2ljZScpXG5leHBvcnQgY2xhc3MgUXRpU2ltcGxlQ2hvaWNlIGV4dGVuZHMgQWN0aXZlRWxlbWVudE1peGluKExpdEVsZW1lbnQsICdxdGktc2ltcGxlLWNob2ljZScpIHtcbiAgc3RhdGljIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIH1cbiAgICBzbG90IHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgfVxuICAgIFtwYXJ0PSdjaCddIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICB9XG4gIGA7XG5cbiAgLy8gcHJvcGVydHkgbGFiZWxcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHB1YmxpYyBtYXJrZXI6IHN0cmluZztcblxuXG4gIGdldCBjaGVja2VkKCkge1xuICAgIHJldHVybiB0aGlzWydpbnRlcm5hbHMnXS5zdGF0ZXMuaGFzKCctLWNoZWNrZWQnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IHBhcnQ9XCJjaFwiPlxuICAgICAgICA8ZGl2IHBhcnQ9XCJjaGFcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgJHt0aGlzLm1hcmtlciA/IGh0bWxgPGRpdiBpZD1cImxhYmVsXCI+JHt0aGlzLm1hcmtlcn08L2Rpdj5gIDogbm90aGluZ31cbiAgICAgIDxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PiBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJzogUXRpU2ltcGxlQ2hvaWNlO1xuICB9XG59XG4iLCAiLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXZlbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvYWN0aXZlLWVsZW1lbnQvYWN0aXZlLWVsZW1lbnQubWl4aW4nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHknO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktcHJvbXB0L3F0aS1wcm9tcHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldCc7XG4vKiBzdGFydCByZXNwb25zZSBhbmQgb3V0Y29tZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic7XG4vKiBlbmQgcmVzcG9uc2UgYW5kIG91dGNvbWUgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrJztcbi8qIHN0YXJ0IGZlZWRiYWNrICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrJztcbi8qIGVuZCBmZWVkYmFjayAqL1xuLyogc3RhcnQgdGV4dGVudHJ5aW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJztcbi8qIGVuZCB0ZXh0ZW50cnlpbnRlcmFjdGlvbiAqL1xuLyogc3RhcnQgaG90dGV4dCAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGhvdHRleHQgKi9cbi8qIHN0YXJ0IGlubGluZWNob2ljZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGlubGluZWNob2ljZSAqL1xuLyogc3RhcnQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuLyogc3RhcnQgY3VzdG9tIGludGVyYWN0aW9ucyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJztcbi8qIGVuZCBjdXN0b20gaW50ZXJhY3Rpb25zICovXG4vKiBzdGFydCBvbmx5IHByZXZpZXcgaXRlbXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbic7XG4vKiBlbmQgb25seSBwcmV2aWV3IGl0ZW1zICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UnO1xuXG5jb25zb2xlLmxvZyhcbiAgJyVjQ1x1MDBCRlRPJWNMYWIlYzogcXRpLWNvbXBvbmVudHMgbG9hZGVkJyxcbiAgJ2ZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOmdyZWVuJyxcbiAgJ2ZvbnQtZmFtaWx5OiBcIlBUIFNhbnNcIiwgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6Z3JlZW47IGZvbnQtc2l6ZTogc21hbGxlcjt2ZXJ0aWNhbC1hbGlnbjogc3ViJyxcbiAgJ2ZvbnQtd2VpZ2h0OnVuc2V0J1xuKTtcblxuLy8gY3NzIGZvciBmb250IHB0LXNhbnMgYW5kIHN1YnNjcmlwdCBhbmQgZ3JlZW5cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLFNBQVMsZUFBZTtBQUN4QixTQUFTLFlBQVksWUFBWTtBQUNqQyxTQUFTLGVBQWUsZ0JBQWdCOzs7QUMyQmpDLFNBQVMsTUFBTSxjQUFpQyxTQUF3QjtBQUM3RSxRQUFNLGtCQUEwQztBQUFBLElBQzlDLHNCQUFzQjtBQUFBLEtBQ25CO0FBRUwsU0FBTyxDQUErQixPQUFrQixvQkFBMEQ7QUFFaEgsVUFBTSxFQUFFLE9BQU8sSUFBSTtBQUNuQixVQUFNLG9CQUFvQixNQUFNLFFBQVEsWUFBWSxJQUFJLGVBQWUsQ0FBQyxZQUFZO0FBR3BGLFVBQU0sU0FBUyxTQUEyQixjQUFnRTtBQUN4Ryx3QkFBa0IsUUFBUSxDQUFBQSxlQUFZO0FBQ3BDLGNBQU0s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O0FBcENFO0FBQUEsRUFEQ0MsV0FBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQUEsR0FaZixnQkFhWDtBQWJXLGtCQUFOO0FBQUEsRUFETkMsZ0JBQWMsbUJBQW1CO0FBQUEsR0FDckI7OztBQ0piLFNBQVMsT0FBQUMsT0FBSyxRQUFBQyxRQUFNLGNBQUFDLGNBQVksV0FBQUMsZ0JBQWU7QUFDL0MsU0FBUyxpQkFBQUMsaUJBQWUsWUFBQUMsa0JBQWdCO0FBUWpDLElBQU0sa0JBQU4sY0FBOEIsbUJBQW1CQyxjQUFZLG1CQUFtQixFQUFFO0FBQUEsRUF5QnZGLElBQUksVUFBVTtBQUNaLFdBQU8sS0FBSyxXQUFXLEVBQUUsT0FBTyxJQUFJLFdBQVc7QUFBQSxFQUNqRDtBQUFBLEVBRVMsU0FBUztBQUNoQixXQUFPQztBQUFBO0FBQUE7QUFBQSxRQUdILEtBQUssU0FBU0EseUJBQXVCLEtBQUssTUFBTSxXQUFXQyxRQUFPO0FBQUE7QUFBQSxFQUV4RTtBQUNGO0FBcENhLGdCQUNKLFNBQVNDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXFCVDtBQUFBLEVBRE5DLFdBQVMsRUFBRSxNQUFNLFFBQVEsV0FBVyxNQUFNLENBQUM7QUFBQSxHQXJCakMsZ0JBc0JKO0FBdEJJLGtCQUFOO0FBQUEsRUFETkMsZ0JBQWMsbUJBQW1CO0FBQUEsR0FDckI7OztBQytEYixRQUFRO0FBQUEsRUFDTjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGOyIsCiAgIm5hbWVzIjogWyJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAieG1sIiwgIkxpdEVsZW1lbnQiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgInByb3BlcnR5IiwgImh0bWwiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY29uc3VtZSIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgImh0bWwiLCAiY3NzIiwgInByb3BlcnR5IiwgImNvbnN1bWUiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJjb25zdW1lIiwgIkxpdEVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiTGl0RWxlbWVudCIsICJwcm9wZXJ0eSIsICJjb25zdW1lIiwgInN0YXRlIiwgImh0bWwiLCAiY3NzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJMaXRFbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJjc3MiLCAiaHRtbCIsICJzdGF0ZSIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJpZkRlZmluZWQiLCAiY3NzIiwgImh0bWwiLCAiaWZEZWZpbmVkIiwgInByb3BlcnR5IiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgImNzcyIsICJodG1sIiwgInN0YXRlIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgImNzcyIsICJodG1sIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgImh0bWwiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiaHRtbCIsICJodG1sIiwgImNvbnN1bWUiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJzdGF0ZSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgInN0YXRlIiwgImNvbnN1bWUiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAiTGl0RWxlbWVudCIsICJMaXRFbGVtZW50IiwgInByb3BlcnR5IiwgImh0bWwiLCAiaHRtbCIsICJjb25zdW1lIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAicHJvcGVydHkiLCAiY29uc3VtZSIsICJzdGF0ZSIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAicHJvcGVydHkiLCAicmVxdWlyZSIsICJodG1sIiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInN0YXRlIiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgImRyYWdnYWJsZSIsICJwYXJlbnQiLCAiaW5kZXgiLCAidGFyZ2V0SW5kZXgiLCAicHJvcGVydHkiLCAiY3NzIiwgImh0bWwiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiaWZyYW1lIiwgImh0bWwiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInF1ZXJ5IiwgInN0YXRlIiwgImlmRGVmaW5lZCIsICJodG1sIiwgImlmRGVmaW5lZCIsICJjc3MiLCAic3RhdGUiLCAicXVlcnkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImhvdHNwb3QiLCAiY3NzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJ1bnNhZmVIVE1MIiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAidW5zYWZlSFRNTCIsICJzdGF0ZSIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgInVuc2FmZUhUTUwiLCAiaHRtbCIsICJ1bnNhZmVIVE1MIiwgImNzcyIsICJzdGF0ZSIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgInJlcGVhdCIsICJodG1sIiwgInJlcGVhdCIsICJjc3MiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInF1ZXJ5IiwgImh0bWwiLCAiZXZlbnQiLCAieCIsICJkaWZmWCIsICJjc3MiLCAicXVlcnkiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjb25zdW1lIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInN0YXRlIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjb25zdW1lIiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJub3RoaW5nIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgIm5vdGhpbmciLCAiY3NzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiXQp9Cg==
|