@beam3_dev/api_module 0.0.44 → 0.0.46
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/wb3Api.js +5 -8
- package/dist/wb3Api.js.map +1 -0
- package/dist/wb3Api.umd.cjs +3 -3
- package/dist/wb3Api.umd.cjs.map +1 -0
- package/package.json +1 -1
package/dist/wb3Api.js
CHANGED
|
@@ -392,7 +392,7 @@ function k(e, t = void 0, n = void 0) {
|
|
|
392
392
|
f(s, {
|
|
393
393
|
onComplete(i, c, o) {
|
|
394
394
|
const a = JSON.parse(i);
|
|
395
|
-
e.token = a?.csrf?.value, e.datas = a?.data[0], t &&
|
|
395
|
+
e.token = a?.csrf?.value, e.datas = a?.data[0], t && t(e);
|
|
396
396
|
},
|
|
397
397
|
onFailure(i) {
|
|
398
398
|
n && n(i);
|
|
@@ -446,7 +446,7 @@ function D(e, t, n = void 0, s = void 0) {
|
|
|
446
446
|
}
|
|
447
447
|
function be(e, t, n, s = void 0, i = void 0) {
|
|
448
448
|
const c = `${e.space}/resources/v1/modeler/documents/${t}/files/DownloadTicket`;
|
|
449
|
-
f(c, {
|
|
449
|
+
n || (n = e.token), f(c, {
|
|
450
450
|
method: "PUT",
|
|
451
451
|
headers: {
|
|
452
452
|
ENO_CSRF_TOKEN: n
|
|
@@ -669,14 +669,11 @@ async function I(e, t = void 0, n = void 0, s = void 0) {
|
|
|
669
669
|
"_3DSpace_download_doc() / Le paramètre space est obligatoire"
|
|
670
670
|
);
|
|
671
671
|
try {
|
|
672
|
-
D(
|
|
672
|
+
console.log("_3DSpace_download_doc / credentials", e), D(
|
|
673
673
|
e,
|
|
674
674
|
i,
|
|
675
675
|
(c) => {
|
|
676
|
-
|
|
677
|
-
"_3dspace_download_doc / _3DSpace_file_url / response ",
|
|
678
|
-
c
|
|
679
|
-
), f(c, {
|
|
676
|
+
f(c, {
|
|
680
677
|
headers: {
|
|
681
678
|
ENO_CSRF_TOKEN: e.token
|
|
682
679
|
},
|
|
@@ -1959,4 +1956,4 @@ export {
|
|
|
1959
1956
|
Ze as sayHello,
|
|
1960
1957
|
de as updateEvent
|
|
1961
1958
|
};
|
|
1962
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2IzQXBpLmpzIiwic291cmNlcyI6WyIuLi9zcmMvbGliL2FwaS9pbmRleC5qcyIsIi4uL3NyYy9saWIvZ291di9jb2xvcnMuanMiLCIuLi9zcmMvbGliL2dvdXYvZ291dl9hcGkuanMiLCIuLi9zcmMvbGliL3V0aWxzL3VwZGF0ZUV2ZW50LmpzIiwiLi4vc3JjL2xpYi9wbGF0ZWZvcm0vbWFpbi8zZGV4cGVyaWVuY2VfYXBpLmpzIiwiLi4vc3JjL2xpYi9wbGF0ZWZvcm0vQ29tcGFzcy9pbmRleC5qcyIsIi4uL3NyYy9saWIvcGxhdGVmb3JtL21haW4vM2Rjb21wYXNzX2FwaS5qcyIsIi4uL3NyYy9saWIvcGxhdGVmb3JtL1VzZXJzZ3JvdXAvaW5kZXguanMiLCIuLi9zcmMvbGliL3BsYXRlZm9ybS9tYWluLzNkc3BhY2VfYXBpLmpzIiwiLi4vc3JjL2xpYi9wbGF0ZWZvcm0vbWFpbi9nZXRDU1JGVG9rZW4uanMiLCIuLi9zcmMvbGliL3BsYXRlZm9ybS9tYWluL2dldENUWC5qcyIsIi4uL3NyYy9saWIvcGxhdGVmb3JtL21haW4vZ2V0RGF0YUZyb20zRFNwYWNlLmpzIiwiLi4vc3JjL2xpYi9wbGF0ZWZvcm0vbWFpbi9nZXREb3dubG9hZERvY3VtZW50LmpzIiwiLi4vc3JjL2xpYi9wbGF0ZWZvcm0vbWFpbi9wdXNoRGF0YUluM0RTcGFjZS5qcyIsIi4uL3NyYy9saWIvcGxhdGVmb3JtL21haW4vbG9hZERhdGFzLmpzIiwiLi4vc3JjL2xpYi9wbGF0ZWZvcm0vVGFnL2luZGV4LmpzIiwiLi4vc3JjL2xpYi9wbGF0ZWZvcm0vU3d5bS8zZHN3eW1fYXBpLmpzIiwiLi4vc3JjL2xpYi9wbGF0ZWZvcm0vU3d5bS9jb21tdW5hdXRlL2luZGV4LmpzIiwiLi4vc3JjL2xpYi9wbGF0ZWZvcm0vU3d5bS9pZGVhL2luZGV4LmpzIiwiLi4vc3JjL2xpYi9wbGF0ZWZvcm0vU3d5bS91c2VyL2luZGV4LmpzIiwiLi4vc3JjL2xpYi9hZGQvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gVVVJRCBnw6luw6hyZSB1biBVVUlEIChVbml2ZXJzYWxseSBVbmlxdWUgSWRlbnRpZmllcikgYWzDqWF0b2lyZS5cclxuICogQHJldHVybnMgTGEgZm9uY3Rpb24gVVVJRCByZW52b2llIHVuIFVVSUQgKFVuaXZlcnNhbGx5IFVuaXF1ZSBJZGVudGlmaWVyKSBnw6luw6lyw6kgYWzDqWF0b2lyZW1lbnQgw6AgbCdhaWRlIGRlIGxhIGZvbmN0aW9uIHV1aWQuXHJcbiAqXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gVVVJRCgpIHtcclxuICByZXR1cm4gdXVpZCgpO1xyXG59XHJcbiIsIi8vIHBvdXIgbGVzIGNoYXJ0cyBQaXZldGVhdVxyXG5leHBvcnQgY29uc3QgY291bGV1cnMgPSB7XHJcbiAgYjNNM1llbGxvdzogXCIjRkZCMzAwXCIsXHJcbiAgYjNBYm91dGFnZUJsdWU6IFwiIzQyQTVGNVwiLFxyXG4gIGIzVXNpbmFnZUdyZWVuOiBcIiM2ODlGMzhcIixcclxuICBiM1Bhbm5lYXVPcmFuZ2U6IFwiI2ZmODAwMFwiLFxyXG4gIGIzTTM1MHBlcmNlbnQ6IFwiI2ZhZmE2ZVwiLFxyXG4gIGIzTTM4MHBlcmNlbnQ6IFwiI2FhZTQ3OVwiLFxyXG4gIGIzTTM5MHBlcmNlbnQ6IFwiIzY0Yzk4N1wiLFxyXG4gIGIzTTMxMDBwZXJjZW50OiBcIiMyM2FhOGZcIixcclxuICBiM00zMTA1cGVyY2VudDogXCIjMDA4OThhXCIsXHJcbiAgYjNNMzExMHBlcmNlbnQ6IFwiIzE3Njg3N1wiLFxyXG4gIGIzTTMxMjBwZXJjZW50OiBcIiMyYTQ4NThcIixcclxuICBiM0Fib3V0YWdlNTBwZXJjZW50OiBcIiNmYWZhNmVcIixcclxuICBiM0Fib3V0YWdlODBwZXJjZW50OiBcIiNhYWU0NzlcIixcclxuICBiM0Fib3V0YWdlOTBwZXJjZW50OiBcIiM2NGM5ODdcIixcclxuICBiM0Fib3V0YWdlMTAwcGVyY2VudDogXCIjMjNhYThmXCIsXHJcbiAgYjNBYm91dGFnZTEwNXBlcmNlbnQ6IFwiIzAwODk4YVwiLFxyXG4gIGIzQWJvdXRhZ2UxMTBwZXJjZW50OiBcIiMxNzY4NzdcIixcclxuICBiM0Fib3V0YWdlMTIwcGVyY2VudDogXCIjMmE0ODU4XCIsXHJcbiAgYjNXYXJuaW5nOiBcIiNGRjAwMDBcIixcclxuICBiM0VkaXQxOiBcIiNBRDE0NTdcIixcclxuICBiM0VkaXQyOiBcIiNGNDUxMUVcIixcclxuICBiM0VkaXQzOiBcIiMwMDk2ODhcIixcclxuICBiM0VkaXQ0OiBcIiNENTAwMDBcIixcclxuICBiM0VkaXQ1OiBcIiMwMzlCRTVcIixcclxuICBiM0VkaXQ2OiBcIiM5RTY5QUZcIixcclxuICBiM0VkaXQ3OiBcIiNBNzlCOEVcIixcclxuICBiM0VkaXQ4OiBcIiM2MTYxNjFcIixcclxuICBiM0VkaXQ5OiBcIiM3OTU1NDhcIixcclxufTtcclxuIiwiaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tIFwibHV4b25cIjtcclxuaW1wb3J0IHsgY291bGV1cnMgfSBmcm9tIFwiLi9jb2xvcnNcIjtcclxuLyoqXHJcbiAqIENldHRlIGZvbmN0aW9uIHLDqWN1cMOocmUgdW5lIGxpc3RlIGRlIGNvbW11bmVzIGVuIGZvbmN0aW9uIGQndW4gY29kZSBwb3N0YWwgZG9ubsOpIMOgIGwnYWlkZSBkJ3VuZSBBUElcclxuICogZCdJR04gRnJhbmNlLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3AgLSBMZSBwYXJhbcOodHJlIGBjcGAgZXN0IHVuZSBjaGHDrm5lIHJlcHLDqXNlbnRhbnQgdW4gY29kZSBwb3N0YWwgZnJhbsOnYWlzLiBJbCBlc3QgY29udmVydGlcclxuICogZW4gZW50aWVyIMOgIGwnYWlkZSBkZSBgcGFyc2VJbnQoKWAgYXZhbnQgZCfDqnRyZSB1dGlsaXPDqSBkYW5zIGxhIHJlcXXDqnRlIEFQSS5cclxuICogQHBhcmFtIHsgRnVuY3Rpb24gfSAtIG9uRG9uZSBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBleMOpY3V0w6llIGxvcnNxdWUgbCdhcHBlbCBBUEkgcsOpdXNzaXQgZXRcclxuICogcmVudm9pZSB1bmUgcsOpcG9uc2UuIElsIHByZW5kIGxlcyBkb25uw6llcyBkZSByw6lwb25zZSBjb21tZSBhcmd1bWVudCBldCBwZXV0IMOqdHJlIHV0aWxpc8OpIHBvdXIgZ8OpcmVyXHJcbiAqIGxlcyBkb25uw6llcyBkYW5zIGxhIGZvbmN0aW9uIGFwcGVsYW50ZS5cclxuICogQHBhcmFtIHsgRnVuY3Rpb24gfSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGV4w6ljdXTDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGxhIHJlcXXDqnRlIGRlIHLDqWN1cMOpcmF0aW9uLiBJbCBwZXJtZXQgdW5lIGdlc3Rpb24gcGVyc29ubmFsaXPDqWUgZGVzIGVycmV1cnMgZXQgcGV1dFxyXG4gKiDDqnRyZSB1dGlsaXPDqSBwb3VyIGFmZmljaGVyIGRlcyBtZXNzYWdlcyBkJ2VycmV1ciBvdSBlZmZlY3R1ZXIgZCdhdXRyZXMgYWN0aW9ucyBlbiByw6lwb25zZSDDoCB1bmVcclxuICogZXJyZXVyLlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbW11bmVzKGNwLCBvbkRvbmUgPSB1bmRlZmluZWQsIG9uRXJyb3IgPSB1bmRlZmluZWQpIHtcclxuICBjb25zdCBjb2RlUG9zdGFsID0gcGFyc2VJbnQoY3ApO1xyXG4gIGF3YWl0IGZldGNoKFxyXG4gICAgXCJodHRwczovL2FwaWNhcnRvLmlnbi5mci9hcGkvY29kZXMtcG9zdGF1eC9jb21tdW5lcy9cIiArIGNvZGVQb3N0YWwsXHJcbiAgICB7XHJcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gIClcclxuICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKVxyXG4gICAgLnRoZW4oKGpzb24pID0+IHtcclxuICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKGpzb24pO1xyXG4gICAgfSlcclxuICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyb3IpO1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIDogXCIgKyBlcnJvcik7XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIElsIHMnYWdpdCBkJ3VuZSBmb25jdGlvbiBKYXZhU2NyaXB0IHF1aSB1dGlsaXNlIGwnQVBJLWFkcmVzc2UuZGF0YS5nb3V2LmZyIHBvdXIgcmVjaGVyY2hlciBkZXNcclxuICogYWRyZXNzZXMgw6AgcGFydGlyIGQndW5lIHJlcXXDqnRlIGV0IHJlbnZvaWUgbGVzIHLDqXN1bHRhdHMgYXUgZm9ybWF0IEpTT04uXHJcbiAqIEBwYXJhbSB7IFN0cmluZyB9IHF1ZXJ5IC0gTCdhZHJlc3NlIG91IGxhIHJlcXXDqnRlIGQnZW1wbGFjZW1lbnQgw6AgcmVjaGVyY2hlciBkYW5zIGwnQVBJLlxyXG4gKiBAcGFyYW0geyBGdW5jdGlvbiB9IC0gb25Eb25lIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGV4w6ljdXTDqWUgbG9yc3F1ZSBsJ2FwcGVsIEFQSSByw6l1c3NpdCBldFxyXG4gKiByZW52b2llIHVuZSByw6lwb25zZS4gSWwgcHJlbmQgbGEgcsOpcG9uc2UgSlNPTiBjb21tZSBwYXJhbcOodHJlLlxyXG4gKiBAcGFyYW0geyBGdW5jdGlvbiB9IC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgZXjDqWN1dMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdhcHBlbCBkZSBsJ0FQSS4gQydlc3QgdW4gcGFyYW3DqHRyZSBvcHRpb25uZWwgcXVpIHBldXQgw6p0cmUgcGFzc8OpIMOgIGxhIGZvbmN0aW9uXHJcbiAqIGBmaW5kQWRyZXNzZWAuIFMnaWwgZXN0IGZvdXJuaSwgaWwgcmVjZXZyYSBsJ29iamV0IGQnZXJyZXVyIGNvbW1lIGFyZ3VtZW50LlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRBZHJlc3NlKFxyXG4gIHF1ZXJ5LFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICAvLyBodHRwczovL2FwaS1hZHJlc3NlLmRhdGEuZ291di5mci9zZWFyY2gvP3E9XHJcbiAgcXVlcnkgPSBlbmNvZGVVUklDb21wb25lbnQocXVlcnkpO1xyXG4gIGF3YWl0IGZldGNoKFxyXG4gICAgXCJodHRwczovL2FwaS1hZHJlc3NlLmRhdGEuZ291di5mci9zZWFyY2gvP3E9XCIgKyBxdWVyeSArIFwiJmxpbWl0PTE1XCIsXHJcbiAgICB7XHJcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gIClcclxuICAgIC50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuanNvbigpKVxyXG4gICAgLnRoZW4oKGpzb24pID0+IHtcclxuICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKGpzb24pO1xyXG4gICAgfSlcclxuICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyb3IpO1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyZXVyIDogXCIgKyBlcnJvcik7XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgZ2V0RGF0YUZyb21Hb3V2RnJgIHLDqWN1cMOocmUgbGVzIGRvbm7DqWVzIGRlIGwnQVBJIGR1IGdvdXZlcm5lbWVudCBmcmFuw6dhaXMgcG91ciBsZXNcclxuICogam91cnMgZsOpcmnDqXMgZXQgbGVzIGZvcm1hdGUgZGFucyB1bmUgc3RydWN0dXJlIGRlIGRvbm7DqWVzIHNww6ljaWZpcXVlLlxyXG4gKiBAcGFyYW0gZXZlbnRzIC0gTGUgcGFyYW3DqHRyZSBgZXZlbnRzYCBlc3QgdW4gdGFibGVhdSBkJ29iamV0cyByZXByw6lzZW50YW50IGRlcyDDqXbDqW5lbWVudHMuIChzdG9yZS5sb2FkZWRFdmVudHMpXHJcbiAqIEBwYXJhbSBjb2xvcnMgLSBMZSBwYXJhbcOodHJlIGBjb2xvcnNgIGVzdCB1biBvYmpldHMgcmVwcsOpc2VudGFudCBkZXMgY291bGV1cnMuIChQaXZldGVhdSlcclxuICogQHJldHVybnMgbGVzIGRvbm7DqWVzIGZvcm1hdMOpZXMsIHF1aSBpbmNsdWVudCBsZXMgw6l2w6luZW1lbnRzIHLDqWN1cMOpcsOpcyBkZXB1aXMgbGUgcG9pbnQgZGUgdGVybWluYWlzb25cclxuICogQVBJIFwiaHR0cHM6Ly9jYWxlbmRyaWVyLmFwaS5nb3V2LmZyL2pvdXJzLWZlcmllcy9tZXRyb3BvbGUvXCIuIExlcyDDqXbDqW5lbWVudHMgc29udCBmb3JtYXTDqXMgZGFucyB1bmVcclxuICogc3RydWN0dXJlIHNww6ljaWZpcXVlIGV0IHJlbnZvecOpcyBzb3VzIGZvcm1lIGQnb2JqZXQuXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGF0YUZyb21Hb3V2RnIoZXZlbnRzLCBjb2xvcnMgPSBjb3VsZXVycykge1xyXG4gIGxldCB5ZWFyID0gRGF0ZVRpbWUubm93KCkueWVhcjtcclxuICBjb25zdCBsb2FkZWRFdmVudHMgPSBldmVudHM7XHJcbiAgY29uc3Qgc29ydGVkRGF0YSA9IFtdO1xyXG5cclxuICBjb25zdCBmb3JtYXREYXRhID0gKGpzb24pID0+IHtcclxuICAgIGZvciAobGV0IGRhdGUgaW4ganNvbikgc29ydGVkRGF0YS5wdXNoKHsgZGF0ZSwgY29tbWVudDoganNvbltkYXRlXSB9KTtcclxuICB9O1xyXG5cclxuICBmb3IgKGxldCBpID0geWVhcjsgaSA8PSB5ZWFyICsgMTsgaSsrKSB7XHJcbiAgICBhd2FpdCBmZXRjaChcclxuICAgICAgXCJodHRwczovL2NhbGVuZHJpZXIuYXBpLmdvdXYuZnIvam91cnMtZmVyaWVzL21ldHJvcG9sZS9cIiArIGkgKyBcIi5qc29uXCIsXHJcbiAgICAgIHtcclxuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgKVxyXG4gICAgICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmpzb24oKSlcclxuICAgICAgLnRoZW4oKGpzb24pID0+IHtcclxuICAgICAgICBmb3JtYXREYXRhKGpzb24pO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBjb25zb2xlLmVycm9yKFwiRXJyZXVyIDogXCIgKyBlcnJvcikpO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgZm9ybWF0ZWREYXRhID0gKCkgPT4ge1xyXG4gICAgY29uc3QgZGF0YSA9XHJcbiAgICAgIGxvYWRlZEV2ZW50cy5sZW5ndGggPT09IDBcclxuICAgICAgICA/IHtcclxuICAgICAgICAgICAgZXZlbnRzOiBbXSxcclxuICAgICAgICAgIH1cclxuICAgICAgICA6IGxvYWRlZEV2ZW50cztcclxuICAgIGZvciAobGV0IGVhY2ggb2Ygc29ydGVkRGF0YSkge1xyXG4gICAgICBjb25zdCBpbmRleCA9IGRhdGEuZXZlbnRzLmZpbmRJbmRleChcclxuICAgICAgICAoZXZlbnQpID0+XHJcbiAgICAgICAgICBldmVudC5zdGFydCA9PT0gRGF0ZVRpbWUuZnJvbUlTTyhlYWNoLmRhdGUpLnRvSVNPRGF0ZSgpICYmXHJcbiAgICAgICAgICBldmVudC5uYW1lID09PSBcIkbDqXJpw6kgOiBcIiArIGVhY2guY29tbWVudCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpXHJcbiAgICAgICAgZGF0YS5ldmVudHMucHVzaCh7XHJcbiAgICAgICAgICBuYW1lOiBcIkbDqXJpw6kgOiBcIiArIGVhY2guY29tbWVudCxcclxuICAgICAgICAgIHN0YXJ0OiBEYXRlVGltZS5mcm9tSVNPKGVhY2guZGF0ZSkudG9JU09EYXRlKCksXHJcbiAgICAgICAgICBlbmQ6IERhdGVUaW1lLmZyb21JU08oZWFjaC5kYXRlKS50b0lTT0RhdGUoKSxcclxuICAgICAgICAgIGNvbG9yOiBjb2xvcnMuYjNCdXNpbm5lc3NEYXlzLFxyXG4gICAgICAgICAgdGltZWQ6IGZhbHNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIGZvcm1hdGVkRGF0YSgpO1xyXG59XHJcbiIsIi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYHVwZGF0ZUV2ZW50YCBtZXQgw6Agam91ciB1biB0YWJsZWF1IGQnw6l2w6luZW1lbnRzIGVuIGFqb3V0YW50IG91IGVuIHN1cHByaW1hbnQgdW5cclxuICogw6l2w6luZW1lbnQgZW4gZm9uY3Rpb24gZCd1bmUgY29uZGl0aW9uIGRvbm7DqWUuXHJcbiAqIEBwYXJhbSB7QXJyYXl9IGV2ZW50cyAtIChzdG9yZS5sb2FkZWRFdmVudHMpVW5lIHBhbm9wbGllIGQnw6l2w6luZW1lbnRzLiBDaGFxdWUgw6l2w6luZW1lbnQgZXN0IHVuIG9iamV0IGF2ZWMgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIHV1aWQsIHN0YXJ0LCBlbmQsIGV0Yy5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBMZSBwYXJhbcOodHJlIGBkYXRhYCBlc3QgdW4gb2JqZXQgcXVpIHJlcHLDqXNlbnRlIGwnw6l2w6luZW1lbnQgw6AgbWV0dHJlIMOgIGpvdXIuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfVtkYXRhLnV1aWRdIC0gTCdpZGVudGlmaWFudCB1bmlxdWUgZGUgbCfDqXbDqW5lbWVudC5cclxuICogQHBhcmFtIHtCb29sZWFufSBbYWRkPXRydWVdIC0gTGUgcGFyYW3DqHRyZSBcImFkZFwiIGVzdCB1bmUgdmFsZXVyIGJvb2zDqWVubmUgcXVpIGTDqXRlcm1pbmUgcydpbCBmYXV0IGFqb3V0ZXIgb3VcclxuICogbWV0dHJlIMOgIGpvdXIgdW4gw6l2w6luZW1lbnQgZGFucyBsZSB0YWJsZWF1IGRlcyDDqXbDqW5lbWVudHMuIFNpIGFkZCBlc3QgdnJhaSwgbGEgZm9uY3Rpb24gYWpvdXRlcmFcclxuICogbCfDqXbDqW5lbWVudCBhdSB0YWJsZWF1IHMnaWwgbidleGlzdGUgcGFzIGTDqWrDoC4gU2kgYWRkIGVzdCBmYXV4LCBsYSBmb25jdGlvbiBtZXR0cmEgw6Agam91clxyXG4gKiBsJ8OpdsOpbmVtZW50IGV4aXN0YW50IGRhbnMgbGUgdGFibGVhdVxyXG4gKiBAcmV0dXJucyBsZSB0YWJsZWF1IGBkYmAgKHN0b3JlLmxvYWRlZEV2ZW50cykgbWlzIMOgIGpvdXIuXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRXZlbnQoZXZlbnRzLCBkYXRhLCBhZGQgPSB0cnVlKSB7XHJcbiAgY29uc3QgaW5kZXggPSBldmVudHMuZXZlbnRzLmZpbmRJbmRleCgodmFsKSA9PiB2YWwudXVpZCA9PT0gZGF0YS51dWlkKTtcclxuXHJcbiAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgZXZlbnRzLmV2ZW50cy5wdXNoKGRhdGEpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBpZiAoYWRkKSBldmVudHMuZXZlbnRzW2luZGV4XSA9IGRhdGE7XHJcbiAgICBlbHNlIGV2ZW50cy5ldmVudHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICB9XHJcblxyXG4gIGlmIChldmVudHMubGVuZ3RoID4gMCkgZXZlbnRzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnQgLSBiLnN0YXJ0KTtcclxuXHJcbiAgcmV0dXJuIGV2ZW50cztcclxufVxyXG4iLCJpbXBvcnQgeyB3aWRnZXQsIHJlcXVpcmVqcyB9IGZyb20gXCJAd2lkZ2V0LWxhYi8zZGRhc2hib2FyZC11dGlsc1wiO1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBDZXR0ZSBmb25jdGlvbiBlZmZlY3R1ZSB1biBhcHBlbCBIVFRQIGF1dGhlbnRpZmnDqSDDoCBsJ2FpZGUgZGUgbGEgYmlibGlvdGjDqHF1ZSBXQUZEYXRhIGVuIGRlIGxhIHBsYXRlZm9ybWUuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBMJ1VSTCBkdSBwb2ludCBkZSB0ZXJtaW5haXNvbiBkZSBsJ0FQSSBxdWUgbGEgZm9uY3Rpb24gYXBwZWxsZXJhLlxyXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIExlIHBhcmFtw6h0cmUgYG9wdGlvbnNgIGVzdCB1biBvYmpldCBxdWkgY29udGllbnQgZGl2ZXJzZXMgb3B0aW9ucyBwb3VyIGxhIHJlcXXDqnRlXHJcbiAqIEhUVFAsIHRlbGxlcyBxdWUgbGEgbcOpdGhvZGUgZGUgcmVxdcOqdGUgKEdFVCwgUE9TVCwgZXRjLiksIGxlcyBlbi10w6p0ZXMsIGxlIGNvcnBzLCBldGMuIENlcyBvcHRpb25zXHJcbiAqIHNvbnQgZ8OpbsOpcmFsZW1lbnQgdHJhbnNtaXNlcyDDoCBsJ0FQSSBgZmV0Y2hgIG91IGBYTUxIdHRwUmVxdWVzdGAgcG91ciBlZmZlY3R1ZXIgbGEgcmVxdcOqdGUgSFRUUFxyXG4gKiByw6llbGxlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCBvcHRpb25zKSB7XHJcbiAgcmVxdWlyZWpzKFtcIkRTL1dBRkRhdGEvV0FGRGF0YVwiXSwgKFdBRkRhdGEpID0+IHtcclxuICAgIFdBRkRhdGEuYXV0aGVudGljYXRlZFJlcXVlc3QodXJsLCBvcHRpb25zKTtcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBDZXR0ZSBmb25jdGlvbiBkw6lmaW5pdCB1biDDqWzDqW1lbnQgY29tbWUgw6l0YW50IGTDqXBsYcOnYWJsZSBldCB0cmFuc21ldCBkZXMgZG9ubsOpZXMgZXQgdW5lIGZvbmN0aW9uIGRlXHJcbiAqIHJhcHBlbCDDoCBleMOpY3V0ZXIgbG9yc3F1ZSBsZSBnbGlzc2VtZW50IGNvbW1lbmNlIChkcmFnIGFuZCBkcm9wKS5cclxuICogQHBhcmFtIGVsZW0gLSBMJ8OpbMOpbWVudCBIVE1MIHF1aSBkb2l0IMOqdHJlIHJlbmR1IGTDqXBsYcOnYWJsZS5cclxuICogQHBhcmFtIHN0ckRhdGEgLSBzdHJEYXRhIGVzdCB1bmUgY2hhw65uZSBxdWkgcmVwcsOpc2VudGUgbGVzIGRvbm7DqWVzIGFzc29jacOpZXMgw6AgbCfDqWzDqW1lbnQgZMOpcGxhw6dhYmxlLlxyXG4gKiBDZXMgZG9ubsOpZXMgc29udCBhY2Nlc3NpYmxlcyBsb3JzIGRlcyBvcMOpcmF0aW9ucyBkZSBnbGlzc2VyLWTDqXBvc2VyIHBvdXIgZm91cm5pciBkZXMgaW5mb3JtYXRpb25zXHJcbiAqIHN1cHBsw6ltZW50YWlyZXMgc3VyIGwnw6lsw6ltZW50IGTDqXBsYWPDqS5cclxuICogQHBhcmFtIG9uRHJhZyAtIG9uRHJhZyBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBleMOpY3V0w6llIGF1IGTDqWJ1dCBkZSBsJ29ww6lyYXRpb24gZGVcclxuICogZ2xpc3NlbWVudC4gSWwgcGV1dCDDqnRyZSB1dGlsaXPDqSBwb3VyIGVmZmVjdHVlciB0b3V0ZXMgbGVzIGFjdGlvbnMgbsOpY2Vzc2FpcmVzIGF2YW50IGxlIGTDqWJ1dCBkZVxyXG4gKiBsJ29ww6lyYXRpb24gZGUgZ2xpc3NlbWVudCwgdGVsbGVzIHF1ZSBsYSBjb25maWd1cmF0aW9uIGRlcyBkb25uw6llcyDDoCB0cmFuc2bDqXJlciBvdSBsYSBtaXNlIMOgIGpvdXIgZGVcclxuICogbCdhcHBhcmVuY2UgZGUgbCfDqWzDqW1lbnQgZMOpcGxhw6dhYmxlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9zZXREcmFnZ2FibGUoZWxlbSwgc3RyRGF0YSwgb25EcmFnKSB7XHJcbiAgcmVxdWlyZWpzKFtcIkRTL0RhdGFEcmFnQW5kRHJvcC9EYXRhRHJhZ0FuZERyb3BcIl0sIChEYXRhRHJhZ0FuZERyb3ApID0+IHtcclxuICAgIERhdGFEcmFnQW5kRHJvcC5kcmFnZ2FibGUoZWxlbSwgeyBkYXRhOiBzdHJEYXRhLCBzdGFydDogb25EcmFnIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIENldHRlIGZvbmN0aW9uIGNvbmZpZ3VyZSB1biBwcm94eSBkZSBuYXZpZ2F0ZXVyIGRlIGJhbGlzZXMgYXZlYyBkZXMgYmFsaXNlcyBzcMOpY2lmacOpZXMgZXQgdW4gw6l2w6luZW1lbnQgZGUgZmlsdHJlIGZhY3VsdGF0aWYuXHJcbiAqXHJcbiAqIEBwYXJhbSB0YWdzIC0gTGUgcGFyYW3DqHRyZSB0YWdzIGVzdCB1biB0YWJsZWF1IGRlIGNoYcOubmVzIHJlcHLDqXNlbnRhbnQgbGVzIGJhbGlzZXMgcXVpIHNlcm9udFxyXG4gKiB1dGlsaXPDqWVzIHBvdXIgZmlsdHJlciBsZXMgc3VqZXRzIGRhbnMgbGUgd2lkZ2V0IFRhZ05hdmlnYXRvclByb3h5LlxyXG4gKiBAcGFyYW0gW29uVGFnZ2VyRmlsdGVyXSAtIExlIHBhcmFtw6h0cmUgb25UYWdnZXJGaWx0ZXIgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgZXjDqWN1dMOpZVxyXG4gKiBsb3JzcXVlIGwndXRpbGlzYXRldXIgZmlsdHJlcmEgbGVzIHN1amV0cyBkYW5zIGxlIHRhZ2dlci4gSWwgcmVjZXZyYSBsZXMgc3VqZXRzIGZpbHRyw6lzIGVuIGFyZ3VtZW50LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9zZXR1cFRhZ2dlcih0YWdzLCBvblRhZ2dlckZpbHRlciA9IHVuZGVmaW5lZCkge1xyXG4gIHJlcXVpcmVqcyhbXCJEUy9UYWdOYXZpZ2F0b3JQcm94eS9UYWdOYXZpZ2F0b3JQcm94eVwiXSwgKFRhZ05hdmlnYXRvclByb3h5KSA9PiB7XHJcbiAgICBsZXQgdGFnZ2VyUHJveHk7XHJcbiAgICBpZiAodGFnZ2VyUHJveHkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0YWdnZXJQcm94eSA9IFRhZ05hdmlnYXRvclByb3h5LmNyZWF0ZVByb3h5KHtcclxuICAgICAgICB3aWRnZXRJZDogd2lkZ2V0LmlkLFxyXG4gICAgICAgIGZpbHRlcmluZ01vZGU6IFwiV2l0aEZpbHRlcmluZ1NlcnZpY2VzXCIsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKG9uVGFnZ2VyRmlsdGVyICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgdGFnZ2VyUHJveHkuYWRkRXZlbnQoXCJvbkZpbHRlclN1YmplY3RzQ2hhbmdlXCIsIG9uVGFnZ2VyRmlsdGVyKTtcclxuICAgIH1cclxuICAgIHRhZ2dlclByb3h5LnNldFN1YmplY3RzVGFncyh0YWdzKTtcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENldHRlIGZvbmN0aW9uIGTDqWZpbml0IHVuIMOpbMOpbWVudCBjb21tZSBwb3V2YW50IMOqdHJlIGTDqXBvc8OpIMOgIGwnYWlkZSBkZSBsYSBiaWJsaW90aMOocXVlXHJcbiAqIERhdGFEcmFnQW5kRHJvcC5cclxuICogQHBhcmFtIGVsZW0gLSBMJ8OpbMOpbWVudCBIVE1MIHF1aSBkb2l0IMOqdHJlIHJlbmR1IGTDqXBvc2FibGUuXHJcbiAqIEBwYXJhbSBkcm9wIC0gTGUgcGFyYW3DqHRyZSBgZHJvcGAgZXN0IHVuZSBmb25jdGlvbiBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXUndW4gw6lsw6ltZW50IGTDqXBsYcOnYWJsZSBlc3RcclxuICogZMOpcG9zw6kgc3VyIGwnw6lsw6ltZW50IGTDqXBsYcOnYWJsZS4gSWwgcHJlbmQgZ8OpbsOpcmFsZW1lbnQgbCfDqWzDqW1lbnQgc3VwcHJpbcOpIGNvbW1lIGFyZ3VtZW50IGV0IGV4w6ljdXRlXHJcbiAqIHVuZSBhY3Rpb24gYmFzw6llIHN1ciBjZWx1aS1jaS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfc2V0RHJvcHBhYmxlKGVsZW0sIGRyb3ApIHtcclxuICByZXF1aXJlanMoW1wiRFMvRGF0YURyYWdBbmREcm9wL0RhdGFEcmFnQW5kRHJvcFwiXSwgKERhdGFEcmFnQW5kRHJvcCkgPT4ge1xyXG4gICAgRGF0YURyYWdBbmREcm9wLmRyb3BwYWJsZShlbGVtLCB7IGRyb3AgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ2V0dGUgZm9uY3Rpb24gYXN5bmNocm9uZSBvYnRpZW50IGxlcyBzZXJ2aWNlcyBkZSBsYSBwbGF0ZWZvcm1lIMOgIGwnYWlkZSBkZSBsYSBiaWJsaW90aMOocXVlIGkzRFhDb21wYXNzU2VydmljZXMgZXQgYXBwZWxsZSBsZXMgZm9uY3Rpb25zIG9uQ29tcGxldGUgb3Ugb25GYWlsdXJlIGVuIGZvbmN0aW9uIGR1IHLDqXN1bHRhdC5cclxuICpcclxuICogQHBhcmFtIHBsYXRmb3JtSWQgLSBJRCBkZSBsYSBwbGF0ZS1mb3JtZSBwb3VyIGxhcXVlbGxlIGxlcyBzZXJ2aWNlcyBzb250IGRlbWFuZMOpcy4gU2kgYXVjdW4gSUQgZGVcclxuICogcGxhdGUtZm9ybWUgbidlc3QgZm91cm5pLCBsYSBmb25jdGlvbiB0ZW50ZXJhIGRlIHLDqWN1cMOpcmVyIGwnSUQgw6AgcGFydGlyIGQndW5lIHZhbGV1ciBkZSB3aWRnZXQuIFNpXHJcbiAqIGF1Y3VuIElEIG4nZXN0IHRyb3V2w6ksIGlsIHNlcmEgZMOpZmluaSBzdXIgYHVuZGVmaW5lZGAuXHJcbiAqIEBwYXJhbSBvbkNvbXBsZXRlIC0gVW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBleMOpY3V0w6llIGxvcnNxdWUgbGVzIHNlcnZpY2VzIGRlIGxhIHBsYXRlZm9ybWVcclxuICogc2Vyb250IHLDqWN1cMOpcsOpcyBhdmVjIHN1Y2PDqHMuIElsIHByZW5kIGxlcyBzZXJ2aWNlcyBkZSBwbGF0ZWZvcm1lIHLDqWN1cMOpcsOpcyBjb21tZSBhcmd1bWVudC5cclxuICogQHBhcmFtIG9uRmFpbHVyZSAtIExlIHBhcmFtw6h0cmUgb25GYWlsdXJlIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGV4w6ljdXTDqWUgZW4gY2FzXHJcbiAqIGQnZXJyZXVyIG91IGQnw6ljaGVjIGRhbnMgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGdldFBsYXRmb3JtU2VydmljZXMuIElsIHBlcm1ldCBkZSBnw6lyZXIgbGVzXHJcbiAqIGVycmV1cnMgZXQgZGUgZm91cm5pciB1biByZXRvdXIgZCdpbmZvcm1hdGlvbiBhcHByb3ByacOpIMOgIGwndXRpbGlzYXRldXIuXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2dldFBsYXRmb3JtU2VydmljZXMoXHJcbiAgcGxhdGZvcm1JZCxcclxuICBvbkNvbXBsZXRlID0gdW5kZWZpbmVkLFxyXG4gIG9uRmFpbHVyZSA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgcmVxdWlyZWpzKFxyXG4gICAgW1wiRFMvaTNEWENvbXBhc3NTZXJ2aWNlcy9pM0RYQ29tcGFzc1NlcnZpY2VzXCJdLFxyXG4gICAgKGkzRFhDb21wYXNzU2VydmljZXMpID0+IHtcclxuICAgICAgaWYgKCFwbGF0Zm9ybUlkIHx8IHBsYXRmb3JtSWQgPT09IFwiXCIpIHtcclxuICAgICAgICBwbGF0Zm9ybUlkID0gd2lkZ2V0LmdldFZhbHVlKFwiUGxhdEZvcm1JbnN0YW5jZUlkXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghcGxhdGZvcm1JZCB8fCBwbGF0Zm9ybUlkID09PSBcIlwiKSB7XHJcbiAgICAgICAgcGxhdGZvcm1JZCA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgICBpZiAob25Db21wbGV0ZSkge1xyXG4gICAgICAgIG9uQ29tcGxldGUoXHJcbiAgICAgICAgICBpM0RYQ29tcGFzc1NlcnZpY2VzLmdldFBsYXRmb3JtU2VydmljZXMoe1xyXG4gICAgICAgICAgICBwbGF0Zm9ybUlkLFxyXG4gICAgICAgICAgICBvbkNvbXBsZXRlLFxyXG4gICAgICAgICAgICBvbkZhaWx1cmUsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb25cclxuICogIExhIGZvbmN0aW9uIGBfZ2V0UGxhdGVmb3JtSW5mb3NgIHLDqWN1cMOocmUgbGVzIGluZm9ybWF0aW9ucyBzdXIgbGEgcGxhdGVmb3JtZSDDoCBsJ2FpZGUgZHUgbW9kdWxlXHJcbiAqIFBsYXRmb3JtQVBJIGV0IHJlbnZvaWUgbGVzIGluZm9ybWF0aW9ucyBkYW5zIHVuIG9iamV0LlxyXG4gKiBAcmV0dXJucyB1biBvYmpldCBhcHBlbMOpIFwicmV0b3VyQVBJXCIgcXVpIGNvbnRpZW50IGxlcyBwcm9wcmnDqXTDqXMgc3VpdmFudGVzIDpcclxuICogLSB7U3RyaW5nfSB0ZW5hbnQsIExlIHRlbmFudCBkZSBsYSBwbGF0ZWZvcm1lIHN1ciBsZXF1ZWwgb24gdHJhdmFpbGxlLlxyXG4gKiAtIHtPYmplY3R9IHVzZXIsIEwndXRpbGlzYXRldXIgY29ubmVjdMOpIMOgIGxhIHBsYXRlZm9ybWUuLi5cclxuICogLSB7QXJyYXlPZk9iamVjdH0gYXBwc0NvbmZpZ3VyYXRpb24sIGxpc3RlIGQnYXBwIGF1cXVlbCBvbiBhY2PDqHMuXHJcbiAqIC0ge1N0cmluZ30gYXBwQ29uZlxyXG4gKlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRQbGF0ZWZvcm1JbmZvcygpIHtcclxuICBsZXQgcmV0b3VyQVBJID0ge307XHJcblxyXG4gIHJlcXVpcmVqcyhbXCJEUy9QbGF0Zm9ybUFQSS9QbGF0Zm9ybUFQSVwiXSwgKHBsQVBJKSA9PiB7XHJcbiAgICBjb25zdCB0ZW5hbnQgPSBwbEFQSS5nZXRUZW5hbnQoKTtcclxuICAgIGNvbnN0IHVzZXIgPSBwbEFQSS5nZXRVc2VyKCk7XHJcbiAgICBjb25zdCBhcHBzQ29uZmlndXJhdGlvbiA9IHBsQVBJLmdldEFsbEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvbnMoKTtcclxuICAgIGNvbnN0IGFwcENvbmYgPSBwbEFQSS5nZXRBcHBsaWNhdGlvbkNvbmZpZ3VyYXRpb24oXHJcbiAgICAgIFwiY29tLjNkcy53cC5wYXNzcG9ydC5jb3JzXCIsXHJcbiAgICApO1xyXG4gICAgcmV0b3VyQVBJID0ge1xyXG4gICAgICB0ZW5hbnQsXHJcbiAgICAgIHVzZXIsXHJcbiAgICAgIGFwcHNDb25maWd1cmF0aW9uLFxyXG4gICAgICBhcHBDb25mLFxyXG4gICAgfTtcclxuICB9KTtcclxuICBjb25zb2xlLmxvZyhcIiVjUkVUT1VSIEFQSSA6XCIsIFwiY29sb3I6Ymx1ZVwiLCByZXRvdXJBUEkpO1xyXG4gIHJldHVybiByZXRvdXJBUEk7XHJcbn1cclxuIiwiaW1wb3J0IHsgX2h0dHBDYWxsQXV0aGVudGljYXRlZCB9IGZyb20gXCIuLi9tYWluLzNkZXhwZXJpZW5jZV9hcGlcIjtcclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgY29tcGFzc19nZXRMaXN0QWRkaXRpb25hbEFwcHNgIGVmZmVjdHVlIHVuZSByZXF1w6p0ZSBIVFRQIEdFVCBhdXRoZW50aWZpw6llIHBvdXJcclxuICogcsOpY3Vww6lyZXIgdW5lIGxpc3RlIGQnYXBwbGljYXRpb25zIHN1cHBsw6ltZW50YWlyZXMgZW4gZm9uY3Rpb24gZGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uXHJcbiAqIGZvdXJuaWVzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBuw6ljZXNzYWlyZXMgw6BcclxuICogbCdhdXRoZW50aWZpY2F0aW9uLiBJbCBkb2l0IGF2b2lyIGxlcyBwcm9wcmnDqXTDqXMgc3VpdmFudGVzwqA6IHNwYWNlLCB0b2tlblxyXG4gKiBAcHJvcGVydHkge1N0cmluZ30gW3NwYWNlXSAtIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcHJvcGVydHkge1N0cmluZ30gW3RlbmFudF0gLSBsZSB0ZW5hbnQgY291cmFudCAoZXg6IFIxMTMyMTAwOTY4NDQ3KVxyXG4gKiBAcGFyYW0gb25Eb25lIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGwnYXBwZWxcclxuICogZCdBUEkgcsOpdXNzaXQgZXQgcXVlIGxlcyBkb25uw6llcyBkZSByw6lwb25zZSBzb250IGZvcm1hdMOpZXMuIElsIHByZW5kIGRldXggYXJndW1lbnRzIDpcclxuICogYGZvcm1hdGVkSW5mb3NgIGV0IGBpbmZvYC4gYGZvcm1hdGVkSW5mb3NgIGVzdCB1biB0YWJsZWF1IGQnb2JqZXRzIGNvbnRlbmFudCBsZSBub20gZXQgbCdpZGVudGlmaWFudFxyXG4gKiBkZSBjaGFxdWUgYXBwbGljYXRpb24sXHJcbiAqIEBwYXJhbSBvbkVycm9yIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGxhIHJlcXXDqnRlIEhUVFAuIElsIHByZW5kIHVuIHBhcmFtw6h0cmUsIMKrIGluZm8gwrssIHF1aSBlc3QgdW4gb2JqZXQgY29udGVuYW50IGRlc1xyXG4gKiBpbmZvcm1hdGlvbnMgc3VyIGwnZXJyZXVyLlxyXG4gKi9cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjb21wYXNzX2dldExpc3RBZGRpdGlvbmFsQXBwcyhjcmVkZW50aWFscywgb25Eb25lLCBvbkVycm9yKSB7XHJcbiAgY29uc3QgVVJMID0ge1xyXG4gICAgYmFzZTogYCR7Y3JlZGVudGlhbHMuc3BhY2V9YCxcclxuICAgIHVyaTogXCIvcmVzb3VyY2VzL0FwcHNNbmd0L2FwaS9jdXN0b20vYXBwbGljYXRpb25zXCIsXHJcbiAgICBvcHRpb246IGA/ZmlsdGVyPSR7Y3JlZGVudGlhbHMudGVuYW50fWAsIC8vIGZhY3VsdGF0aWZcclxuICB9O1xyXG4gIGNvbnN0IHVybCA9IGAke1VSTC5iYXNlfSR7VVJMLnVyaX0ke1VSTC5vcHRpb259YDtcclxuXHJcbiAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICB9LFxyXG4gICAgb25Db21wbGV0ZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxuICAgICAgY29uc3QgZm9ybWF0ZWRJbmZvcyA9IGluZm8uZGF0YS5tYXAoKGFwcCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5hbWUgPSBhcHAuYXR0cmlidXRlcy5uYW1lO1xyXG4gICAgICAgIGNvbnN0IGlkID0gYXBwLmlkO1xyXG4gICAgICAgIHJldHVybiB7IG5hbWUsIGlkIH07XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKGZvcm1hdGVkSW5mb3MsIGluZm8pO1xyXG4gICAgfSxcclxuICAgIG9uRmFpbHVyZShyZXNwb25zZSwgaGVhZGVycykge1xyXG4gICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgIGluZm9bXCJtc2dcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICBpbmZvW1wiZXJyQ29kZVwiXSA9IGhlYWRlcnMuZXJyb3Jjb2RlO1xyXG5cclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoaW5mbyk7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcbiIsImltcG9ydCB7IF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQgfSBmcm9tIFwiLi8zZGV4cGVyaWVuY2VfYXBpLmpzXCI7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfQXBwTW5ndF9nZXRfdXNlcnNgIGVmZmVjdHVlIHVuIGFwcGVsIEhUVFAgYXV0aGVudGlmacOpIHBvdXIgcsOpY3Vww6lyZXIgdW5lIGxpc3RlXHJcbiAqIGQndXRpbGlzYXRldXJzIGQndW5lIHBsYXRlZm9ybWUgc3DDqWNpZmnDqWUuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IDNEU3BhY2UgPT4oaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhKSwgM0RTd3ltLCB1c2Vyc2dyb3VwLCAzRENvbXBhc3MuLi4pXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy50ZW5hbnQgLSBMJ2lkZW50aWZpYW50IGR1IHRlbmFudCBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDoxMTMyMTAwOTY4NDQ3KVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsJ2FwcGVsXHJcbiAqIEFQSSBzZXJhIHRlcm1pbsOpIGF2ZWMgc3VjY8Oocy4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIMKrIGluZm8gwrssIHF1aSBjb3JyZXNwb25kIGF1eCBkb25uw6llcyBkZSByw6lwb25zZVxyXG4gKiBkZSBsJ0FQSS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGxhIHJlcXXDqnRlIEhUVFAuIElsIGVzdCBmYWN1bHRhdGlmIGV0IHBldXQgw6p0cmUgaW5kw6lmaW5pLiBTJ2lsIGVzdCBmb3VybmksIGlsIHNlcmFcclxuICogYXBwZWzDqSBhdmVjIGwnb2JqZXQgZGUgcsOpcG9uc2UgY29tbWUgYXJndW1lbnQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX0FwcE1uZ3RfZ2V0X3VzZXJzKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBsZXQgdXJsID0gYCR7Y3JlZGVudGlhbHMuc3BhY2V9L3Jlc291cmNlcy9BcHBzTW5ndC91c2VyP3BsYXRmb3JtPSR7Y3JlZGVudGlhbHMudGVuYW50fSZsaW1pdD0tMWA7XHJcblxyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIl9BcHBNbmd0X2dldF91c2VycyA9PiBcIiwgaW5mbyk7XHJcbiAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShpbmZvKTtcclxuICAgIH0sXHJcbiAgICBvbkZhaWx1cmUocmVzcG9uc2UsIGhlYWRlcnMpIHtcclxuICAgICAgY29uc3QgaW5mbyA9IHJlc3BvbnNlO1xyXG4gICAgICBpbmZvW1wibXNnXCJdID0gaGVhZGVycy5lcnJvcm1zZztcclxuICAgICAgaW5mb1tcImVyckNvZGVcIl0gPSBoZWFkZXJzLmVycm9yY29kZTtcclxuXHJcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm8pO1xyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgX0FwcE1uZ3RfZ2V0X2luZm9fdXNlcmAgZWZmZWN0dWUgdW4gYXBwZWwgSFRUUCBhdXRoZW50aWZpw6kgcG91ciByw6ljdXDDqXJlciBkZXNcclxuICogaW5mb3JtYXRpb25zIHN1ciB1biB1dGlsaXNhdGV1ciDDoCBwYXJ0aXIgZCd1bmUgcGxhdGVmb3JtZSBzcMOpY2lmaXF1ZS5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIHVzZXJzZ3JvdXAsIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtTdHJpbmd9IGlkIC0gTGUgcGFyYW3DqHRyZSBgaWRgIGVzdCBsJ2lkZW50aWZpYW50IHVuaXF1ZSBkZSBsJ3V0aWxpc2F0ZXVyIHBvdXIgbGVxdWVsIHZvdXMgc291aGFpdGV6XHJcbiAqIHLDqWN1cMOpcmVyIGRlcyBpbmZvcm1hdGlvbnMuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxhXHJcbiAqIHJlcXXDqnRlIHNlcmEgdGVybWluw6llIGF2ZWMgc3VjY8Oocy4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIMKraW5mb8K7LCBxdWkgY29ycmVzcG9uZCBhdXggZG9ubsOpZXMgZGUgcsOpcG9uc2UgZHUgc2VydmV1ci5cclxuICpcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGxhIHJlcXXDqnRlIEhUVFAuIElsIGVzdCBmYWN1bHRhdGlmIGV0IHBldXQgw6p0cmUgaW5kw6lmaW5pLiBTJ2lsIGVzdCBmb3VybmksIGlsIHNlcmFcclxuICogYXBwZWzDqSBhdmVjIGxlIHBhcmFtw6h0cmUgYHJlc3BvbnNlYCwgcXVpIGNvbnRpZW50IGxhIHLDqXBvbnNlIGQnZXJyZXVyIGR1IHNlcnZldXIuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX0FwcE1uZ3RfZ2V0X2luZm9fdXNlcihcclxuICBjcmVkZW50aWFscyxcclxuICBpZCxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgbGV0IHVybCA9IGAke2NyZWRlbnRpYWxzLnNwYWNlfS9yZXNvdXJjZXMvQXBwc01uZ3QvdXNlcj9wbGF0Zm9ybT0ke2NyZWRlbnRpYWxzLnRlbmFudH0maWQ9JHtpZH1gO1xyXG5cclxuICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgb25Db21wbGV0ZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxuICAgICAgLy9jb25zb2xlLmxvZyhcIl9BcHBNbmd0X2dldF9pbmZvX3VzZXIgPT4gXCIsIGluZm8pO1xyXG4gICAgICBpZiAob25Eb25lKSBvbkRvbmUoaW5mbyk7XHJcbiAgICB9LFxyXG5cclxuICAgIG9uRmFpbHVyZShyZXNwb25zZSwgaGVhZGVycykge1xyXG4gICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgIGluZm9bXCJtc2dcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICBpbmZvW1wiZXJyQ29kZVwiXSA9IGhlYWRlcnMuZXJyb3Jjb2RlO1xyXG5cclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoaW5mbyk7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcbiIsImltcG9ydCB7IF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQgfSBmcm9tIFwiLi4vbWFpbi8zZGV4cGVyaWVuY2VfYXBpXCI7XHJcblxyXG4vL0xJTksgLSBodHRwczovL21lZGlhLjNkcy5jb20vc3VwcG9ydC9kb2N1bWVudGF0aW9uL2RldmVsb3Blci9DbG91ZC9lbi9FbmdsaXNoL0NBQWkzRFhVR1JFU1QvVXNlcnNHcm91cF92MS5odG0jXHJcbi8vIVNFQ1RJT04sIFBvdXIgZmFpcmUgZGVzIG1vZGlmaWNhdGlvbiBkZSBVRyBpbCBmYXV0IMOqdHJlIE9XTkVSXHJcblxyXG4vLyBVUkkgZGUgdGVzdCBzdXIgbGUgdGVuYW50IFBJVkVURUFVX1RFU1Q6XHJcbmNvbnN0IF91cmkgPSBcInV1aWQ6M2ZjYjYxZjItNjQxNy00NzZkLThhOWMtYTE2ZmI4ODg3NzFlXCI7XHJcblxyXG5jb25zdCB0b3BIZWFkZXIgPSB7XHJcbiAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb24sdGV4dC9qYXZhc2NyaXB0LCovKlwiLFxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgY3JlYXRlVXNlckdyb3Vwc2AgY3LDqWUgdW4gbm91dmVhdSBncm91cGUgZCd1dGlsaXNhdGV1cnMgYXZlYyBsZXMgZMOpdGFpbHMgZXQgbGVzIG1lbWJyZXNcclxuICogc3DDqWNpZmnDqXMuIEF0dGVudGlvbiwgbCdpbmRleGF0aW9uIGR1IFVzZXJHcm91cCBtZXQgZHUgdGVtcHMuXHJcblxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgdXNlcnNncm91cCwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMuY3VycmVudFVzZXIuZW1haWwgLSBMZSBwYXJhbcOodHJlIGBjdXJyZW50VXNlcmAgZXN0IHVuIHF1aSBjb250aWVudCBsZXMgaW5mb3JtYXRpb25zIGRlIGwndXRpbGlzYXRldXIgcXVpIGVudm9pZSBsZSBtZXNzYWdlKGFwcGVsZXIgZGVwdWlzIGxhIGZvbmN0aW9uIGBfM0RTd3ltX2dldF9jdXJyZW50dXNlcmApLlxyXG4gKiBcclxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFzIC0gTGVzIGluZm9ybWF0aW9ucyBkdSBncm91cGUgZCd1dGlsaXNhdGV1cnMuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhcy50aXRsZSAtIExlIHRpdHJlIGR1IGdyb3VwZSBkJ3V0aWxpc2F0ZXVycy4gRW50cmUgMyBldCAxMjggY2FyYWN0ZcyAcmVzLCBvYmxpZ2F0b2lyZS5cclxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGFzLmRlc2NyaXB0aW9uIC0gTGEgZGVzY3JpcHRpb24gZHUgZ3JvdXBlIGQndXRpbGlzYXRldXJzLiA1MTIgY2FyYWN0ZcyAcmVzIG1heC5cclxuICogQHBhcmFtIHtBcnJheX0gZGF0YXMubWVtYmVycyAtIFVuIHRhYmxlYXUgZCdlbWFpbHMgZGVzIG1lbWJyZXMgZHUgZ3JvdXBlIGQndXRpbGlzYXRldXJzLiAxMDAgbWF4IGVtYWlsIHBhciBncm91cGUuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhcy5zaGFyaW5nIC0gTGUgZHJvaXQgZGUgcGFydGFnZSBkdSBncm91cGUgZCd1dGlsaXNhdGV1cnMuIG93bmVyL21hbmFnZXIvdmlld2VyXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhcy52aXNpYmlsaXR5IC0gTGEgdmlzaWJpbGl0w6kgZHUgZ3JvdXBlIGQndXRpbGlzYXRldXJzLiBwdWJsaWMvcHJpdmF0ZVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIFVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsJ2FwcGVsIGQnQVBJIHLDqXVzc2l0IGV0IHF1ZSBsZXNcclxuICogZ3JvdXBlcyBkJ3V0aWxpc2F0ZXVycyBzb250IGNyw6nDqXMuIElsIHJlY2V2cmEgbGVzIGRvbm7DqWVzIGRlIHLDqXBvbnNlIGNvbW1lIGFyZ3VtZW50LlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBjcmVhdGVVc2VyR3JvdXBzYC4gSWwgdm91cyBwZXJtZXQgZGUgZ8OpcmVyIGV0IGRlIHRyYWl0ZXJcclxuICogbCdlcnJldXIgZGUgbWFuacOocmUgcGVyc29ubmFsaXPDqWUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVXNlckdyb3VwcyhcclxuICBjcmVkZW50aWFscyxcclxuICBkYXRhcyxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgeyBzcGFjZSwgY3VycmVudFVzZXIgfSA9IGNyZWRlbnRpYWxzO1xyXG4gIGNvbnN0IFVSTCA9IHtcclxuICAgIFVSSVVHcjogXCIvM2RyZGZwZXJzaXN0L3Jlc291cmNlcy92MS91c2Vyc2dyb3VwXCIsXHJcbiAgfTtcclxuICBjb25zdCB1cmwgPSBgJHtzcGFjZX0ke1VSTC5VUklVR3J9YDtcclxuXHJcbiAgY29uc3QgdGVtcGxhdGVEYXRhID0ge1xyXG4gICAgZ3JvdXBzOiBbXHJcbiAgICAgIHtcclxuICAgICAgICB0aXRsZTogZGF0YXMudGl0bGUsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IGRhdGFzLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgIG1lbWJlcnM6IGRhdGFzLm1lbWJlcnMgfHwgW2N1cnJlbnRVc2VyLmVtYWlsLCBcInNhbXVlbC5tdXJlYXVAYmVhbTMuZnJcIl0sXHJcbiAgICAgICAgcGVuZGluZ19tZW1iZXJzOiBbXSxcclxuICAgICAgICBzaGFyaW5nOiBkYXRhcy5zaGFyaW5nLFxyXG4gICAgICAgIHZpc2liaWxpdHk6IGRhdGFzLnZpc2liaWxpdHksXHJcbiAgICAgIH0sXHJcbiAgICBdLFxyXG4gIH07XHJcblxyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgaGVhZGVyczogdG9wSGVhZGVyLFxyXG4gICAgZGF0YTogSlNPTi5zdHJpbmdpZnkodGVtcGxhdGVEYXRhKSxcclxuICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKEpTT04ucGFyc2UocmVzcG9uc2UpKTtcclxuICAgIH0sXHJcbiAgICBvbkZhaWx1cmUoZXJyLCBoZWFkZXJzKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgIGNvbnN0IGluZm8gPSBlcnI7XHJcbiAgICAgIGluZm9bXCJtc2dcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICBpbmZvW1wiZXJyQ29kZVwiXSA9IGhlYWRlcnMuZXJyb3Jjb2RlO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIuKdjCBzZW5kRGlyZWN0TWVzc2FnZSA9PiBcIiwgaW5mbyk7XHJcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm8pO1xyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgZ2V0Q29tcGxlbWVudFVHYCBlZmZlY3R1ZSB1bmUgcmVxdcOqdGUgR0VUIHZlcnMgdW4gVVJJIHNww6ljaWZpw6kgYXZlYyBsZXMgaW5mb3JtYXRpb25zXHJcbiAqIGQnYXV0aGVudGlmaWNhdGlvbiBldCByZW52b2llIGxhIHLDqXBvbnNlLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgdXNlcnNncm91cCwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudGVuYW50IC0gTCdpZGVudGlmaWFudCBkdSB0ZW5hbnQgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IFIxMTMyMTAwOTY4NDQ3KVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gW3VyaV0gLSBMZSBwYXJhbcOodHJlIGB1cmlgIGVzdCBsJ2lkZW50aWZpYW50IGRlIGxhIHJlc3NvdXJjZSBkb250IHZvdXMgc291aGFpdGV6IHLDqWN1cMOpcmVyIGxlXHJcbiAqIGNvbXBsw6ltZW50LiAoZXg6IHV1aWQ6ZGNhZDE0Y2MtNWJjZC00NWZkLWE1NGQtMjQ2Yjk1MDQ3ZDQ1KVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsYVxyXG4gKiByZXF1w6p0ZSBIVFRQIHNlcmEgdGVybWluw6llIGF2ZWMgc3VjY8Oocy4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIHF1aSBjb3JyZXNwb25kIGF1eCBkb25uw6llcyBkZSByw6lwb25zZVxyXG4gKiBkZSBsYSByZXF1w6p0ZS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgZ2V0Q29tcGxlbWVudFVHYC4gSWwgdm91cyBwZXJtZXQgZGUgZ8OpcmVyIGV0IGRlIHRyYWl0ZXJcclxuICogbGVzIGluZm9ybWF0aW9ucyBkJ2VycmV1ci5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21wbGVtZW50VUcoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgdXJpLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCB7IHNwYWNlLCB0ZW5hbnQgfSA9IGNyZWRlbnRpYWxzO1xyXG4gIGNvbnN0IGJhc2VVUkwgPSBzcGFjZTtcclxuICBjb25zdCBVUkkgPSBgLzNkcmRmcGVyc2lzdC92MS9yZXNvdXJjZXMvJHt1cml9YDtcclxuICBjb25zdCBPUFRzID0gYD8kbWFzaz1kc2FjY2VzczpNYXNrLkdyb3VwVUkuUHJvcGVydGllcyZ0ZW5hbnQ9ZHN0ZW5hbnQ6JHt0ZW5hbnR9YDtcclxuICBjb25zdCBVUkwgPSBgJHtiYXNlVVJMfSR7VVJJfSR7T1BUc31gO1xyXG5cclxuICBjb25zdCBoZWFkZXJzID0ge1xyXG4gICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvbix0ZXh0L2phdmFzY3JpcHQsKi8qXCIsXHJcbiAgfTtcclxuICBjb25zdCBvcHRzID0ge1xyXG4gICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgaGVhZGVyczogaGVhZGVycyxcclxuICB9O1xyXG5cclxuICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKFVSTCwge1xyXG4gICAgb3B0cyxcclxuICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKEpTT04ucGFyc2UocmVzcG9uc2UpKTtcclxuICAgIH0sXHJcbiAgICBvbkZhaWx1cmUoZXJyLCBoZWFkZXJzKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSBlcnI7XHJcbiAgICAgIGluZm9bXCJtc2dcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICBpbmZvW1wiZXJyQ29kZVwiXSA9IGhlYWRlcnMuZXJyb3Jjb2RlO1xyXG5cclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoaW5mbyk7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBnZXRVc2Vyc0dyb3VwUnVsZXNgIGVmZmVjdHVlIHVuZSByZXF1w6p0ZSBIVFRQIEdFVCBwb3VyIHLDqWN1cMOpcmVyIHVuZSBsaXN0ZSBkZVxyXG4gKiByZXNwb25zYWJpbGl0w6lzIGRlIGdyb3VwZSBwb3VyIHVuIGdyb3VwZSBkJ3V0aWxpc2F0ZXVycy5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIHVzZXJzZ3JvdXAsIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRlbmFudCAtIEwnaWRlbnRpZmlhbnQgZHUgdGVuYW50IHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiBSMTEzMjEwMDk2ODQ0NylcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbGFcclxuICogcmVxdcOqdGUgSFRUUCBzZXJhIHRlcm1pbsOpZSBhdmVjIHN1Y2PDqHMuIElsIGZhdXQgdW4gYXJndW1lbnQsIHF1aSBjb3JyZXNwb25kIGF1eCBkb25uw6llcyBkZSByw6lwb25zZVxyXG4gKiBhbmFseXPDqWVzIGF1IGZvcm1hdCBKU09OLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBnZXRVc2Vyc0dyb3VwUnVsZXNgLiBDJ2VzdCB1biBwYXJhbcOodHJlIGZhY3VsdGF0aWYsIGRvbmNcclxuICogcydpbCBuJ2VzdCBwYXMgZm91cm5pLCBsYSBmb25jdGlvbiBuZSBmZXJhIHJpZW4gZW4gY2FzIGQnZXJyZXVyLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJzR3JvdXBSdWxlcyhcclxuICBjcmVkZW50aWFscyxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgeyBzcGFjZSwgdGVuYW50IH0gPSBjcmVkZW50aWFscztcclxuICBjb25zdCBiYXNlVVJMID0gc3BhY2U7XHJcbiAgY29uc3QgVVJJID1cclxuICAgIFwiLzNkcmRmcGVyc2lzdC9yZXNvdXJjZXMvdjEvb3B0aW9uLXNldHMvZHN1c2VyZ3JvdXA6TGlzdE9mR3JvdXBSZXNwb25zaWJpbGl0aWVzL29wdGlvbnNcIjtcclxuICBjb25zdCBPUFRTID0gYD90ZW5hbnQ9ZHN0ZW5hbnQ6JHt0ZW5hbnR9YDtcclxuICBjb25zdCBPUFRzSCA9IHtcclxuICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uLCovKix0ZXN0L2phdmFzY3JpcHRcIixcclxuICB9O1xyXG4gIGNvbnN0IFVSTCA9IGAke2Jhc2VVUkx9JHtVUkl9JHtPUFRTfWA7XHJcblxyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQoVVJMLCB7XHJcbiAgICBPUFRzSCxcclxuICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKEpTT04ucGFyc2UocmVzcG9uc2UpKTtcclxuICAgIH0sXHJcbiAgICBvbkZhaWx1cmUoZXJyLCBoZWFkZXJzKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSBlcnI7XHJcbiAgICAgIGluZm9bXCJtc2dcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICBpbmZvW1wiZXJyQ29kZVwiXSA9IGhlYWRlcnMuZXJyb3Jjb2RlO1xyXG5cclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoaW5mbyk7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIMKrIGdldFVzZXJHcm91cHNMaXN0IMK7IHLDqWN1cMOocmUgdW5lIGxpc3RlIGRlIGdyb3VwZXMgZCd1dGlsaXNhdGV1cnMgZCd1biBzZXJ2ZXVyIGVuXHJcbiAqIHV0aWxpc2FudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gZm91cm5pZXMgZXQgYXBwZWxsZSBsYSBmb25jdGlvbiBkZSByYXBwZWwgwqsgb25Eb25lIMK7XHJcbiAqIGF2ZWMgbGEgcsOpcG9uc2UuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IDNEU3BhY2UgPT4oaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhKSwgM0RTd3ltLCB1c2Vyc2dyb3VwLCAzRENvbXBhc3MuLi4pXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy50ZW5hbnQgLSBMJ2lkZW50aWZpYW50IGR1IHRlbmFudCBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogUjExMzIxMDA5Njg0NDcpXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscy5jdXJyZW50VXNlci5lbWFpbCAtIExlIHBhcmFtw6h0cmUgYGN1cnJlbnRVc2VyYCBlc3QgdW4gcXVpIGNvbnRpZW50IGxlcyBpbmZvcm1hdGlvbnMgZGUgbCd1dGlsaXNhdGV1ciBxdWkgZW52b2llIGxlIG1lc3NhZ2UoYXBwZWxlciBkZXB1aXMgbGEgZm9uY3Rpb24gYF8zRFN3eW1fZ2V0X2N1cnJlbnR1c2VyYClcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBVbmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbCdvcMOpcmF0aW9uIHNlcmEgdGVybWluw6llIGF2ZWNcclxuICogc3VjY8Oocy4gSWwgcmVjZXZyYSBsYSByw6lwb25zZSBlbiBwYXJhbcOodHJlLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBnZXRVc2VyR3JvdXBzTGlzdGAuIElsIHZvdXMgcGVybWV0IGRlIGfDqXJlciBldCBkZVxyXG4gKiByw6lwb25kcmUgw6AgdG91dGUgZXJyZXVyIHF1aSBzZSBwcm9kdWl0LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJHcm91cHNMaXN0KFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCB7IHNwYWNlLCBjdXJyZW50VXNlciB9ID0gY3JlZGVudGlhbHM7XHJcbiAgY29uc3QgVVJJID0gXCIvM2RyZGZwZXJzaXN0L3Jlc291cmNlcy92MS91c2Vyc2dyb3VwXCI7XHJcbiAgY29uc3Qgb3B0ID1cclxuICAgIFwiP3NlbGVjdD11cmksdGl0bGUsZGVzY3JpcHRpb24sb3duZXIsbWVtYmVycyxwZW5kaW5nX21lbWJlcnMsY3JlYXRpb25fZGF0ZSxtb2RpZmljYXRpb25fZGF0ZSx2aXNpYmlsaXR5XCI7XHJcbiAgY29uc3QgdXJsID0gYCR7c3BhY2V9JHtVUkl9JHtvcHR9YDtcclxuICBjb25zdCBoZWFkZXIgPSB7XHJcbiAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uLHRleHQvamF2YXNjcmlwdCwqLypcIixcclxuICB9O1xyXG4gIGNvbnN0IG9wdHMgPSB7IG1ldGhvZDogXCJHRVRcIiwgaGVhZGVyczogaGVhZGVyIH07XHJcbiAgdHJ5IHtcclxuICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICAgIG9wdHMsXHJcbiAgICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgICBjb25zdCByZXBVRyA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG4gICAgICAgIGNvbnN0IHJlcG9uc2UgPSB7fTtcclxuICAgICAgICBjb25zdCBVRyA9IHJlcFVHLmdyb3Vwcy5maWx0ZXIoKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgIHJldHVybiBlbGVtZW50LnVyaS5zdGFydHNXaXRoKFwidXVpZDpcIik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50VXNlciAmJiBPYmplY3Qua2V5cyhjdXJyZW50VXNlcikubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgY29uc3QgaWFtT3duZXIgPSBVRy5maWx0ZXIoKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQub3duZXIgPT09IGN1cnJlbnRVc2VyLmVtYWlsO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBjb25zdCBpYW1NZW1iZXIgPSBVRy5maWx0ZXIoKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQubWVtYmVycy5pbmNsdWRlcyhjdXJyZW50VXNlci5lbWFpbCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGNvbnN0IGlhbSA9IGlhbU93bmVyLmNvbmNhdChpYW1NZW1iZXIpO1xyXG4gICAgICAgICAgcmVwb25zZVtcImlhbVwiXSA9IGlhbTtcclxuICAgICAgICAgIHJlcG9uc2VbXCJVR1wiXSA9IFVHO1xyXG4gICAgICAgICAgcmVwb25zZVtcImlhbU1lbWJlclwiXSA9IGlhbU1lbWJlcjtcclxuXHJcbiAgICAgICAgICBnZXRVc2Vyc0dyb3VwUnVsZXMoXHJcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzLFxyXG4gICAgICAgICAgICAocnVsZXMpID0+IHtcclxuICAgICAgICAgICAgICByZXBvbnNlW1wicnVsZXNcIl0gPSBydWxlcztcclxuICAgICAgICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUocmVwb25zZSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIChlcnIpID0+IHtcclxuICAgICAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRmFpbHVyZShlcnIpIHtcclxuICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihlcnIpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gZGVsZXRlVXNlckdyb3VwcyBlc3QgdXRpbGlzw6llIHBvdXIgc3VwcHJpbWVyIGRlcyBncm91cGVzIGQndXRpbGlzYXRldXJzIMOgIGwnYWlkZSBkZXNcclxuICogaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gZXQgZGUgbCdVUkkgZm91cm5pcy5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIHVzZXJzZ3JvdXAsIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtTdHJpbmd9IFt1cmldIC0gTGUgcGFyYW3DqHRyZSBgdXJpYCBlc3QgbCdpZGVudGlmaWFudCBkdSBncm91cGUgZCd1dGlsaXNhdGV1cnMgcXVlIHZvdXMgc291aGFpdGV6XHJcbiAqIHN1cHByaW1lci4gSWwgZXN0IHV0aWxpc8OpIHBvdXIgY29uc3RydWlyZSBsJ1VSTCBkZSBsYSByZXF1w6p0ZSBERUxFVEUuKGV4OiB1dWlkOmRjYWQxNGNjLTViY2QtNDVmZC1hNTRkLTI0NmI5NTA0N2Q0NSlcclxuICovXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlVXNlckdyb3VwcyhjcmVkZW50aWFscywgdXJpKSB7XHJcbiAgY29uc3QgeyBzcGFjZSB9ID0gY3JlZGVudGlhbHM7XHJcbiAgY29uc3QgVVJJID0gXCIvM2RyZGZwZXJzaXN0L3Jlc291cmNlcy92MS91c2Vyc2dyb3VwXCI7XHJcbiAgY29uc3QgdXJsID0gYCR7c3BhY2V9JHtVUkl9LyR7dXJpfWA7XHJcblxyXG4gIGNvbnN0IG9wdHMgPSB7XHJcbiAgICBtZXRob2Q6IFwiREVMRVRFXCIsXHJcbiAgfTtcclxuICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwgb3B0cyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYHBhdGNoVXNlckdyb3Vwc2AgZXN0IHV0aWxpc8OpZSBwb3VyIG1ldHRyZSDDoCBqb3VyIGxlcyBncm91cGVzIGQndXRpbGlzYXRldXJzIGVuIGVudm95YW50XHJcbiAqIHVuZSByZXF1w6p0ZSBQQVRDSCDDoCB1biBVUkkgc3DDqWNpZmnDqSBhdmVjIGxlcyBkb25uw6llcyBmb3Vybmllcy5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIHVzZXJzZ3JvdXAsIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRlbmFudCAtIEwnaWRlbnRpZmlhbnQgZHUgdGVuYW50IHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiBSMTEzMjEwMDk2ODQ0NylcclxuICogQHBhcmFtIHVyaSAtIExlIHBhcmFtw6h0cmUgYHVyaWAgZXN0IHVuZSBjaGHDrm5lIHF1aSByZXByw6lzZW50ZSBsJ2lkZW50aWZpYW50IGR1IGdyb3VwZSBkJ3V0aWxpc2F0ZXVyc1xyXG4gKiBxdWUgdm91cyBzb3VoYWl0ZXogY29ycmlnZXIuIElsIGVzdCB1dGlsaXPDqSBwb3VyIGNvbnN0cnVpcmUgbCdVUkwgZGUgbGEgcmVxdcOqdGUgUEFUQ0guKGV4OiB1dWlkOmRjYWQxNGNjLTViY2QtNDVmZC1hNTRkLTI0NmI5NTA0N2Q0NSlcclxuICogQHBhcmFtIHtBcnJheU9mT2JqZWN0c30gZGF0YXMgLSBMZSBwYXJhbcOodHJlIGBkYXRhc2AgZXN0IHVuIHRhYmxlYXUgZCdvYmpldHMgcXVpIHNww6ljaWZpZW50IGxlcyBtb2RpZmljYXRpb25zIMOgXHJcbiAqIGFwcG9ydGVyIGF1eCBncm91cGVzIGQndXRpbGlzYXRldXJzLihleDogZGF0YXNbMF0ub3AsIGRhdGFzWzBdLmZpZWxkLCBkYXRhc1swXS52YWx1ZSlcclxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGFzWzBdLm9wIC0gbCdvcMOpcmF0aW9uIMOgIHLDqWFsaXNlci4gKGV4OiBcImFkZFwiLCBcInJlbW92ZVwiLCBcInJlcGxhY2VcIilcclxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGFzWzBdLmZpZWxkIC0gQ2Ugc3VyIHF1b2kgYWdpciAoZXg6IG1lbWJlcnNbXSwgdGl0bGUsIGRlc2NyaXB0aW9uLCBvd25lciwgdmlzaWJpbGl0eSlcclxuICogQHBhcmFtIHtTdHJpbmdPckFycmF5fSBkYXRhc1swXS52YWx1ZSAtIExhIG5vdXZlbGxlIHZhbGV1ciBpbXBhY3TDqWUuIFNpIGNlIHNvbnQgZGVzIG1lbWJyZXMgdmFsdWUgc2VyYSB1biBUYWJsZWF1IGRlIFN0cmluZy5cclxuIFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIFVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsYSByZXF1w6p0ZSBQQVRDSCBzZXJhIHRlcm1pbsOpZVxyXG4gKiBhdmVjIHN1Y2PDqHMuIElsIHJlY2V2cmEgbGEgcsOpcG9uc2UgZW4gcGFyYW3DqHRyZS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgcGF0Y2hVc2VyR3JvdXBzYC4gSWwgdm91cyBwZXJtZXQgZGUgZ8OpcmVyIHRvdXRlcyBsZXNcclxuICogZXJyZXVycyBxdWkgc2UgcHJvZHVpc2VudCBldCBk4oCZZWZmZWN0dWVyIHRvdXRlIGdlc3Rpb24gb3Ugam91cm5hbGlzYXRpb24gZGVzIGVycmV1cnMgbsOpY2Vzc2FpcmUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hVc2VyR3JvdXBzKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIHVyaSxcclxuICBkYXRhcyxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgeyBzcGFjZSwgdGVuYW50IH0gPSBjcmVkZW50aWFscztcclxuICBjb25zdCBVUkwgPSB7XHJcbiAgICBVUklUSTogXCIvM2RyZGZwZXJzaXN0L3Jlc291cmNlcy92MS90ZW1wbGF0ZS1pbnN0YW5jZXNcIixcclxuICAgIFVSSVVHcjogXCIvM2RyZGZwZXJzaXN0L3Jlc291cmNlcy92MS91c2Vyc2dyb3VwXCIsXHJcbiAgICBuZXh0VVJJQ2g6IFwiL2NoYXJhY3RlcmlzdGljc1wiLFxyXG4gICAgbmV4dFVSSUdyOiBcIi9ncm91cFwiLFxyXG4gICAgbmV4VVJJbWVtOiBcIi9tZW1iZXJzXCIsXHJcbiAgICBPUFRzVEk6IGA/JG1hc2s9ZHNhY2Nlc3M6TWFzay5Hcm91cFVJLlByb3BlcnRpZXNgLFxyXG4gICAgT1BUc1RlbmFudDogYHRlbmFudD1kc3RlbmFudDoke3RlbmFudH1gLFxyXG4gIH07XHJcblxyXG4gIC8vIExlIGZvcm1hdCBkZXMgZGF0YXMgZXN0IG9ibGlnYXRvaXJlIDogW3t9XVxyXG4gIC8vIG9wIDogYWRkLCByZXBsYWNlLCByZW1vdmVcclxuICAvLyBmaWVsZCA6IG1lbWJlcnNbXSwgcGVuZGluZ19tZW1iZXJzW10sIHRpdGxlLCBkZXNjcmlwdGlvbiwgb3duZXIsIHZpc2liaWxpdHlcclxuICAvLyB2YWx1ZSA6IHN0cmluZyBvdSBhcnJheVxyXG5cclxuICBjb25zdCBkYXRhTWVtYmVycyA9IGRhdGFzO1xyXG4gIC8vICBbXHJcbiAgLy8gICB7XHJcbiAgLy8gICAgIG9wOiBcImFkZFwiLFxyXG4gIC8vICAgICBmaWVsZDogXCJtZW1iZXJzXCIsXHJcbiAgLy8gICAgIHZhbHVlOiBbXCJzYW11ZWwubXVyZWF1QGJlYW0zLmZyXCJdLFxyXG4gIC8vICAgfSxcclxuICAvLyAgIHtcclxuICAvLyAgICAgb3A6IFwicmVwbGFjZVwiLFxyXG4gIC8vICAgICBmaWVsZDogXCJ0aXRsZVwiLFxyXG4gIC8vICAgICB2YWx1ZTogXCJCRUFNwrMgUiZEIC0gREVWXCIsXHJcbiAgLy8gICB9LFxyXG4gIC8vIF07XHJcblxyXG4gIGNvbnN0IGJhc2VVUkwgPSBgJHtzcGFjZX0ke1VSTC5VUklVR3J9LyR7dXJpfWA7IC8vIHJvdXRlIGRlIGJhc2UgcG91ciBsZSBQQVRDSCAoRE9DKVxyXG5cclxuICBjb25zdCBkYXRhTWVtYmVyc1NUUiA9IEpTT04uc3RyaW5naWZ5KGRhdGFNZW1iZXJzKTtcclxuXHJcbiAgX2h0dHBDYWxsQXV0aGVudGljYXRlZChiYXNlVVJMLCB7XHJcbiAgICBoZWFkZXJzOiB0b3BIZWFkZXIsXHJcbiAgICBtZXRob2Q6IFwiUEFUQ0hcIixcclxuICAgIGRhdGE6IGRhdGFNZW1iZXJzU1RSLFxyXG4gICAgdHlwZTogXCJqc29uXCIsXHJcbiAgICBvbkNvbXBsZXRlKHJlc3BvbnNlKSB7XHJcbiAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShyZXNwb25zZSk7XHJcbiAgICB9LFxyXG4gICAgb25GYWlsdXJlKGVycikge1xyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihlcnIpO1xyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG5cclxuLy9BTkNIT1IgLSAgQ09OVFJPTCAoR2VzdGlvbiBkZXMgcHJvcHJpw6l0YWlyZXMgZHUgZ3JvdXBlKVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgcGF0Y2hVc2VyR3JvdXBzQ29udHJvbGAgZXN0IHV0aWxpc8OpZSBwb3VyIG1ldHRyZSDDoCBqb3VyIGxlIGNvbnRyw7RsZSBkZXMgZ3JvdXBlc1xyXG4gKiBkJ3V0aWxpc2F0ZXVycyBlbiBlbnZveWFudCB1bmUgcmVxdcOqdGUgUEFUQ0ggw6AgdW4gVVJJIHNww6ljaWZpw6kgYXZlYyBsZXMgaW5mb3JtYXRpb25zXHJcbiAqIGQnaWRlbnRpZmljYXRpb24gZXQgbGVzIGRvbm7DqWVzIGZvdXJuaWVzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgdXNlcnNncm91cCwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJpIC0gTGUgcGFyYW3DqHRyZSBgdXJpYCBlc3QgdW5lIGNoYcOubmUgcXVpIHJlcHLDqXNlbnRlIGwnaWRlbnRpZmlhbnQgZHUgZ3JvdXBlIGQndXRpbGlzYXRldXJzXHJcbiAqIHF1ZSB2b3VzIHNvdWhhaXRleiBjb3JyaWdlci4gSWwgZXN0IHV0aWxpc8OpIHBvdXIgY29uc3RydWlyZSBsJ1VSTCBkZSBsYSByZXF1w6p0ZSBQQVRDSC4oZXg6IHV1aWQ6ZGNhZDE0Y2MtNWJjZC00NWZkLWE1NGQtMjQ2Yjk1MDQ3ZDQ1KVxyXG4gKiBAcGFyYW0ge0FycmF5T2ZPYmplY3R9IF9kYXRhcyAtIExlIHBhcmFtw6h0cmUgYGRhdGFzYCBlc3QgdW4gdGFibGVhdSBkJ29iamV0cyBxdWkgY29udGllbnQgbGVzIGluZm9ybWF0aW9uc1xyXG4gKiBuw6ljZXNzYWlyZXMgcG91ciBwYXRjaGVyIGxlIGNvbnRyw7RsZSBkZXMgZ3JvdXBlcyBkJ3V0aWxpc2F0ZXVycy4gKGV4IDogZGF0YXNbMF0ub3AsICBkYXRhc1swXS52YWx1ZSlcclxuICogQHBhcmFtIHtTdHJpbmd9ICAgb3AgLSBMJ29ww6lyYXRpb24gZGUgY29ycmVjdGlmLiBJbCBwZXV0IMOqdHJlICdhZGQnLCAncmVwbGFjZScsICdyZW1vdmUnLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gICB2YWx1ZSAtXHJcbiAqIEBwYXJhbSB7QXJyYXl9ICAgdmFsdWUuYWdlbnRzIC0gVW4gdGFibGVhdSBk4oCZdXRpbGlzYXRldXJzLiBMZSAxZXIgaW5kZXggZG9pdCDDqnRyZSDDoCB2aWRlLiAoZXggOiBbXCJcIixcIkJvYi5EeWxhbkBiZWFtMy5mclwiXSkuIDEwMCB1dGlsaXNhdGV1cnMgbWF4aW11bXMuXHJcbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlLnJlc3BvbnNpYmlsaXRpZXMgLSBVbiB0YWJsZWF1IGRlIHJlc3BvbnNpYmlsaXTDqXMuIChleDogW1wiZHNhY2Nlc3M6UmVzcG9uc2liaWxpdHkuR3JvdXAuTWFpbk93bmVyXCIsIFwiZHNhY2Nlc3M6UmVzcG9uc2liaWxpdHkuR3JvdXAuT3duZXJcIiwgXCJkc2FjY2VzczpSZXNwb25zaWJpbGl0eS5Hcm91cC5WaWV3ZXJcIiwgXCJkc2FjY2VzczpSZXNwb25zaWJpbGl0eS5Hcm91cC5BdXRob3JcIiwgXCJkc2FjY2VzczpSZXNwb25zaWJpbGl0eS5Hcm91cFNlcnZpY2UuQWRtaW5pc3RyYXRvclwiXSlcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWVcclxuICogbCdvcMOpcmF0aW9uIGRlIHBhdGNoIHNlcmEgdGVybWluw6llIGF2ZWMgc3VjY8Oocy4gSWwgZmF1dCB1biBhcmd1bWVudCwgcXVpIGVzdCBsYSByw6lwb25zZSBkdSBzZXJ2ZXVyLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBwYXRjaFVzZXJHcm91cHNDb250cm9sYC4gSWwgdm91cyBwZXJtZXQgZGUgZ8OpcmVyIHRvdXRlc1xyXG4gKiBsZXMgZXJyZXVycyBxdWkgc2UgcHJvZHVpc2VudCBldCBk4oCZZWZmZWN0dWVyIHRvdXRlIGdlc3Rpb24gb3Ugam91cm5hbGlzYXRpb24gZGVzIGVycmV1cnMgbsOpY2Vzc2FpcmUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hVc2VyR3JvdXBzQ29udHJvbChcclxuICBjcmVkZW50aWFscyxcclxuICB1cmksXHJcbiAgX2RhdGFzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCB7IHNwYWNlIH0gPSBjcmVkZW50aWFscztcclxuICBjb25zdCBVUkkgPSBcIi8zZHJkZnBlcnNpc3QvcmVzb3VyY2VzL3YxL3VzZXJzZ3JvdXBcIjtcclxuXHJcbiAgY29uc3QgdXJsID0gYCR7c3BhY2V9JHtVUkl9LyR7dXJpfS9zaGFyaW5nYDtcclxuICAvL2xpc3RlIGRlcyByZXNwb25zYWJpbGl0w6lzIDogW1wiZHNhY2Nlc3M6UmVzcG9uc2liaWxpdHkuR3JvdXAuTWFpbk93bmVyXCIsIFwiZHNhY2Nlc3M6UmVzcG9uc2liaWxpdHkuR3JvdXAuT3duZXJcIiwgXCJkc2FjY2VzczpSZXNwb25zaWJpbGl0eS5Hcm91cC5WaWV3ZXJcIiwgXCJkc2FjY2VzczpSZXNwb25zaWJpbGl0eS5Hcm91cC5BdXRob3JcIiwgXCJkc2FjY2VzczpSZXNwb25zaWJpbGl0eS5Hcm91cFNlcnZpY2UuQWRtaW5pc3RyYXRvclwiXVxyXG4gIGNvbnN0IGRhdGFzID0gX2RhdGFzO1xyXG4gIC8vIFtcclxuICAvLyAgIHtcclxuICAvLyAgICAgb3A6IFwiYWRkXCIsIC8vIGFkZCwgcmVwbGFjZSwgcmVtb3ZlXHJcbiAgLy8gICAgIHBhdGg6IFwiL3NoYXJpbmdcIixcclxuICAvLyAgICAgdmFsdWU6IHtcclxuICAvLyAgICAgICBhZ2VudHM6IFtcIlwiLCBcInNhbXVlbC5tdXJlYXVAYmVhbTMuZnJcIiwgXCJ5YW4uY29xdW96QGJlYW0zLmZyXCJdLFxyXG4gIC8vICAgICAgIHJlc3BvbnNpYmlsaXRpZXM6IFtcImRzYWNjZXNzOlJlc3BvbnNpYmlsaXR5Lkdyb3VwLk93bmVyXCJdLFxyXG4gIC8vICAgICB9LFxyXG4gIC8vICAgfSxcclxuICAvLyBdO1xyXG5cclxuICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgbWV0aG9kOiBcIlBBVENIXCIsXHJcbiAgICBoZWFkZXJzOiB0b3BIZWFkZXIsXHJcbiAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhcyksXHJcbiAgICB0eXBlOiBcImpzb25cIixcclxuICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKHJlc3BvbnNlKTtcclxuICAgIH0sXHJcbiAgICBvbkZhaWx1cmUoZXJyKSB7XHJcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGVycik7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIMKrIHJlYWRVc2VyR3JvdXBDb250cm9sIMK7IGVzdCB1dGlsaXPDqWUgcG91ciByw6ljdXDDqXJlciBsZXMgaW5mb3JtYXRpb25zIGRlIGNvbnRyw7RsZSBkZVxyXG4gKiBncm91cGUgZCd1dGlsaXNhdGV1cnMgw6AgcGFydGlyIGQndW4gVVJJIHNww6ljaWZpw6kgw6AgbCdhaWRlIGQndW5lIHJlcXXDqnRlIEhUVFAgR0VULlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgdXNlcnNncm91cCwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJpIC0gTGUgcGFyYW3DqHRyZSBgdXJpYCBlc3QgdW5lIGNoYcOubmUgcXVpIHJlcHLDqXNlbnRlIGwnaWRlbnRpZmlhbnQgZHUgZ3JvdXBlIGQndXRpbGlzYXRldXJzXHJcbiAqIHBvdXIgbGVxdWVsIHZvdXMgc291aGFpdGV6IHLDqWN1cMOpcmVyIGxlcyBpbmZvcm1hdGlvbnMgZGUgY29udHLDtGxlLiAoZXg6IHV1aWQ6ZGNhZDE0Y2MtNWJjZC00NWZkLWE1NGQtMjQ2Yjk1MDQ3ZDQ1KVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsYVxyXG4gKiByZXF1w6p0ZSBIVFRQIHNlcmEgdGVybWluw6llIGF2ZWMgc3VjY8Oocy4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIHF1aSBjb3JyZXNwb25kIGF1eCBkb25uw6llcyBkZSByw6lwb25zZVxyXG4gKiBkZSBsYSByZXF1w6p0ZS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgcmVhZFVzZXJHcm91cENvbnRyb2xgLiBJbCB2b3VzIHBlcm1ldCBkZSBnw6lyZXIgZXQgZGVcclxuICogcsOpcG9uZHJlIMOgIHRvdXRlIGVycmV1ciBxdWkgc2UgcHJvZHVpdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZWFkVXNlckdyb3VwQ29udHJvbChcclxuICBjcmVkZW50aWFscyxcclxuICB1cmksXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IHsgc3BhY2UgfSA9IGNyZWRlbnRpYWxzO1xyXG4gIGNvbnN0IFVSSSA9IFwiLzNkcmRmcGVyc2lzdC9yZXNvdXJjZXMvdjEvdXNlcnNncm91cFwiO1xyXG5cclxuICBjb25zdCB1cmwgPSBgJHtzcGFjZX0ke1VSSX0vJHt1cml9L3NoYXJpbmdgO1xyXG5cclxuICBjb25zdCBoZWFkZXIgPSB7XHJcbiAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uLHRleHQvamF2YXNjcmlwdCwqLypcIixcclxuICB9O1xyXG4gIGNvbnN0IG9wdHMgPSB7XHJcbiAgICBtZXRob2Q6IFwiR0VUXCIsXHJcbiAgICBoZWFkZXJzOiBoZWFkZXIsXHJcbiAgfTtcclxuICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgb3B0cyxcclxuICAgIG9uQ29tcGxldGUoX3JlcCkge1xyXG4gICAgICBpZiAob25Eb25lKSBvbkRvbmUoSlNPTi5wYXJzZShfcmVwKSk7XHJcbiAgICB9LFxyXG4gICAgb25GYWlsdXJlKGVycikge1xyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihlcnIpO1xyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG4iLCJpbXBvcnQge1xyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQsXHJcbiAgX2dldFBsYXRmb3JtU2VydmljZXMsXHJcbn0gZnJvbSBcIi4vM2RleHBlcmllbmNlX2FwaVwiO1xyXG5pbXBvcnQgeyBVVUlEIH0gZnJvbSBcIi4uLy4uL2FwaS9pbmRleFwiO1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgXzNkU3BhY2VfZ2V0X2RvY0luZm9gIHLDqWN1cMOocmUgZGVzIGluZm9ybWF0aW9ucyBzdXIgdW4gZG9jdW1lbnQgZGFucyB1biBlc3BhY2UgM0QuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1J2ljaSDCqyB0b2tlbiDCuyBldCDCqyBzcGFjZSDCuy4oZXg6IGNyZWRlbnRpYWxzLnNwYWNlLCBjcmVkZW50aWFscy50ZW5hbnQsIGNyZWRlbnRpYWxzLnRva2VuLi4uKS5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU2FwY2UpIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcblxyXG4gKiBAcGFyYW0ge1N0cmluZ30gW2RvY2lkXSAtIExlIHBhcmFtw6h0cmUgYGRvY2lkYCBlc3QgbCdJRCBkdSBkb2N1bWVudCBwb3VyIGxlcXVlbCB2b3VzIHNvdWhhaXRleiByw6ljdXDDqXJlciBkZXNcclxuICogaW5mb3JtYXRpb25zLiBDJ2VzdCB1biBwYXJhbcOodHJlIG9ibGlnYXRvaXJlIGV0IGRvaXQgw6p0cmUgZm91cm5pLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsZXNcclxuICogaW5mb3JtYXRpb25zIGR1IGRvY3VtZW50IHNlcm9udCByw6ljdXDDqXLDqWVzIGF2ZWMgc3VjY8Oocy4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIHF1aSBlc3QgbCdvYmpldFxyXG4gKiBkJ2luZm9ybWF0aW9ucyBkdSBkb2N1bWVudC5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnYXBwZWwgSFRUUC4gSWwgcHJlbmQgdW4gcGFyYW3DqHRyZSwgcXVpIGVzdCBsYSByw6lwb25zZSBkJ2VycmV1ci5cclxuICogQHJldHVybnMgTGEgZm9uY3Rpb24gbmUgcmVudm9pZSBleHBsaWNpdGVtZW50IHJpZW4uXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gXzNEU3BhY2VfZ2V0X2RvY0luZm8oXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgZG9jaWQgPSB1bmRlZmluZWQsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IF8zRFNwYWNlID0gY3JlZGVudGlhbHMuc3BhY2U7XHJcbiAgaWYgKGRvY2lkID09PSB1bmRlZmluZWQpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiTGUgcGFyYW3DqHRyZSBkb2NpZCBlc3Qgb2JsaWdhdG9pcmVcIik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG4gIGNvbnN0IHVybCA9IF8zRFNwYWNlICsgYC9yZXNvdXJjZXMvdjEvbW9kZWxlci9kb2N1bWVudHMvJHtkb2NpZH1gO1xyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG4gICAgICBpZiAob25Eb25lKSBvbkRvbmUoaW5mbyk7XHJcbiAgICB9LFxyXG5cclxuICAgIG9uRmFpbHVyZShyZXNwb25zZSkge1xyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihyZXNwb25zZSk7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIENldHRlIGZvbmN0aW9uIGVmZmVjdHVlIHVuIGFwcGVsIEhUVFAgYXV0aGVudGlmacOpIHBvdXIgcsOpY3Vww6lyZXIgbGUgamV0b24gQ1NSRiBwb3VyIHVuIGRvY3VtZW50IGRlXHJcbiAqIG1vZMOpbGlzYXRpb24gM0QuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1J2ljaSDCqyB0b2tlbiDCuyBldCDCqyBzcGFjZSDCuy4oZXg6IGNyZWRlbnRpYWxzLnNwYWNlLCBjcmVkZW50aWFscy50ZW5hbnQsIGNyZWRlbnRpYWxzLnRva2VuLi4uKS5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3BhY2UpIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5vYmpJRCAtIElEIGR1IGRvY3VtZW50IHBvdXIgbGVxdWVsIGxlIGpldG9uIENTUkYgZXN0IGRlbWFuZMOpLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgb25Eb25lIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGV4w6ljdXTDqWUgbG9yc3F1ZSBsYVxyXG4gKiByZXF1w6p0ZSBIVFRQIHNlcmEgdGVybWluw6llIGF2ZWMgc3VjY8Oocy4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIHF1aSBjb3JyZXNwb25kIGF1eCBkb25uw6llcyBkZSByw6lwb25zZVxyXG4gKiByZW52b3nDqWVzIHBhciBsZSBzZXJ2ZXVyLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBleMOpY3V0w6llIHNpIGxhIHJlcXXDqnRlXHJcbiAqIEhUVFAgw6ljaG91ZSBvdSByZW5jb250cmUgdW5lIGVycmV1ci4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIHF1aSBlc3QgbGEgcsOpcG9uc2UgZCdlcnJldXIuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gXzNEU3BhY2VfZ2V0X2NzcmYoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGlmIChjcmVkZW50aWFscy5vYmpJRCAmJiBjcmVkZW50aWFscy5vYmpJRCAhPT0gXCJcIikge1xyXG4gICAgbGV0IHVybCA9IGAke2NyZWRlbnRpYWxzLnNwYWNlfS9yZXNvdXJjZXMvdjEvbW9kZWxlci9kb2N1bWVudHMvJHtjcmVkZW50aWFscy5vYmpJRH1gO1xyXG5cclxuICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICAgIG9uQ29tcGxldGUocmVzcG9uc2UsIGhlYWRlcnMsIHhocikge1xyXG4gICAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxuICAgICAgICBjcmVkZW50aWFsc1tcInRva2VuXCJdID0gaW5mbz8uY3NyZj8udmFsdWU7XHJcbiAgICAgICAgY3JlZGVudGlhbHNbXCJkYXRhc1wiXSA9IGluZm8/LmRhdGFbMF07XHJcbiAgICAgICAgaWYgKG9uRG9uZSkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJpbmZvID0+IFwiLCBpbmZvKTtcclxuICAgICAgICAgIG9uRG9uZShjcmVkZW50aWFscyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG5cclxuICAgICAgb25GYWlsdXJlKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IocmVzcG9uc2UpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIF8zRFNwYWNlX2NzcmYoY3JlZGVudGlhbHMpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBDZXR0ZSBmb25jdGlvbiBKYXZhU2NyaXB0IHLDqWN1cMOocmUgbGUgVE9LRU4gQ1NSRiBkJ3VuZSBhcHBsaWNhdGlvbiAzRFNwYWNlLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdSdpY2kgwqsgdG9rZW4gwrsgZXQgwqsgc3BhY2UgwrsuKGV4OiBjcmVkZW50aWFscy5zcGFjZSwgY3JlZGVudGlhbHMudGVuYW50LCBjcmVkZW50aWFscy50b2tlbi4uLikuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFNhcGNlKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG4gKiBAcGFyYW0ge0NhbGxiYWNrfSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsZSBqZXRvblxyXG4gKiBDU1JGIHNlcmEgcsOpY3Vww6lyw6kgYXZlYyBzdWNjw6hzLiBJbCBmYXV0IHVuIGFyZ3VtZW50LCBxdWkgZXN0IGxhIHZhbGV1ciBkdSBqZXRvbiBDU1JGLlxyXG4gKiBAcGFyYW0ge0NhbGxiYWNrfSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzaSB1bmUgZXJyZXVyXHJcbiAqIHN1cnZpZW50IGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBfM0RTcGFjZV9jc3JmYC4gSWwgZXN0IHV0aWxpc8OpIHBvdXIgZ8OpcmVyIGV0IGFmZmljaGVyXHJcbiAqIGxlcyBtZXNzYWdlcyBk4oCZZXJyZXVyIG91IGV4w6ljdXRlciB0b3V0ZSBsb2dpcXVlIGRlIGdlc3Rpb24gZGVzIGVycmV1cnMgbsOpY2Vzc2FpcmUuXHJcbiAqIEByZXR1cm5zIGxhIHZhbGV1ciBkdSBqZXRvbiBDU1JGLCBxdWkgZXN0IG9idGVudWUgw6AgcGFydGlyIGRlIGxhIHLDqXBvbnNlIGRlIGwnYXBwZWwgSFRUUC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfM0RTcGFjZV9jc3JmKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBpZiAoY3JlZGVudGlhbHMuc3BhY2UpIHtcclxuICAgIGNvbnN0IHVybCA9IGNyZWRlbnRpYWxzLnNwYWNlICsgXCIvcmVzb3VyY2VzL3YxL2FwcGxpY2F0aW9uL0NTUkZcIjtcclxuICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICAgIG9uQ29tcGxldGUocmVzcG9uc2UsIGhlYWRlcnMsIHhocikge1xyXG4gICAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKGluZm8uY3NyZi52YWx1ZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRmFpbHVyZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgICAgY29uc3QgaW5mb3MgPSB7IHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIgfTtcclxuICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvcyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9IGVsc2Uge1xyXG4gICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoXCJFUlJPUiA6IHVybCBkdSAzRFNwYWNlIG5vbiBkw6lmaW5pLlwiKTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ2V0dGUgZm9uY3Rpb24gZ8OpbsOocmUgdW5lIFVSTCBwb3VyIHTDqWzDqWNoYXJnZXIgdW4gZmljaGllciDDoCBwYXJ0aXIgZCd1bmUgcGxhdGVmb3JtZSBkZSBtb2TDqWxpc2F0aW9uXHJcbiAqIDNELCBlbiB1dGlsaXNhbnQgbCdhdXRoZW50aWZpY2F0aW9uIGV0IGxhIGdlc3Rpb24gZGVzIGVycmV1cnMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1J2ljaSDCqyB0b2tlbiDCuyBldCDCqyBzcGFjZSDCuy4oZXg6IGNyZWRlbnRpYWxzLnNwYWNlLCBjcmVkZW50aWFscy50ZW5hbnQsIGNyZWRlbnRpYWxzLnRva2VuLi4uKS5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3BhY2UpIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcblxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZG9jaWQgLSBJRCBkdSBkb2N1bWVudCBwb3VyIGxlcXVlbCBsJ1VSTCBkdSBmaWNoaWVyIGVzdCBkZW1hbmTDqWUuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gVW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGwnVVJMIGR1IGZpY2hpZXIgc2VyYSByw6ljdXDDqXLDqWVcclxuICogYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCB1biBwYXJhbcOodHJlLCBxdWkgZXN0IGwnVVJMIGR1IGZpY2hpZXIuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgb25FcnJvciBlc3QgdW5lIGZvbmN0aW9uIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZSBlcnJldXIgbG9yc1xyXG4gKiBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24uIElsIHMnYWdpdCBkJ3VuIHBhcmFtw6h0cmUgZmFjdWx0YXRpZiBldCBwZXV0IMOqdHJlIGxhaXNzw6kgaW5kw6lmaW5pIHMnaWxcclxuICogbidlc3QgcGFzIG7DqWNlc3NhaXJlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFNwYWNlX2ZpbGVfdXJsKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIGRvY2lkLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBsZXQgdXJsID1cclxuICAgIGNyZWRlbnRpYWxzLnNwYWNlICtcclxuICAgIGAvcmVzb3VyY2VzL3YxL21vZGVsZXIvZG9jdW1lbnRzLyR7ZG9jaWR9L2ZpbGVzL0Rvd25sb2FkVGlja2V0YDtcclxuICBfM0RTcGFjZV9nZXRfY3NyZihcclxuICAgIGNyZWRlbnRpYWxzLFxyXG5cclxuICAgIChpbmZvKSA9PiB7XHJcbiAgICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgIEVOT19DU1JGX1RPS0VOOiBjcmVkZW50aWFscy50b2tlbixcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbkNvbXBsZXRlKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICBsZXQgaW5mbyA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG5cclxuICAgICAgICAgIGlmIChpbmZvLnN1Y2Nlc3MgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBjb25zdCBmaWxlX3VybCA9IGluZm8uZGF0YVswXS5kYXRhZWxlbWVudHMudGlja2V0VVJMO1xyXG4gICAgICAgICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShmaWxlX3VybCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbkZhaWx1cmUocmVzcG9uc2UsIGhlYWQpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwi4pig77iPIGVycm9yID0+IFwiLCByZXNwb25zZSwgaGVhZCk7XHJcbiAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihyZXNwb25zZSwgaGVhZCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG4gICAgb25FcnJvcixcclxuICApO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIENldHRlIGZvbmN0aW9uIGVudm9pZSB1bmUgcmVxdcOqdGUgUFVUIMOgIHVuZSBVUkwgc3DDqWNpZmnDqWUgYXZlYyBkZXMgZW4tdMOqdGVzIGQnYXV0aGVudGlmaWNhdGlvbiBldFxyXG4gKiByZW52b2llIHVuZSBVUkwgZGUgZmljaGllciBlbiBjYXMgZGUgc3VjY8Oocy5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXUnaWNpIMKrIHRva2VuIMK7IGV0IMKrIHNwYWNlIMK7LihleDogY3JlZGVudGlhbHMuc3BhY2UsIGNyZWRlbnRpYWxzLnRlbmFudCwgY3JlZGVudGlhbHMudG9rZW4uLi4pLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTcGFjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IFtkb2NpZF0gLSBMJ0lEIGR1IGRvY3VtZW50IHBvdXIgbGVxdWVsIGxlIHRpY2tldCBkZSB0w6lsw6ljaGFyZ2VtZW50IGRlIGZpY2hpZXIgZXN0IGRlbWFuZMOpLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gW2Nzcl0gLSBMZSBwYXJhbcOodHJlIFwiY3NyXCIgZXN0IHVuIGpldG9uIENTUkYgdXRpbGlzw6kgw6AgZGVzIGZpbnMgZCdhdXRoZW50aWZpY2F0aW9uIGV0IGRlXHJcbiAqIHPDqWN1cml0w6kuIElsIGVzdCB0cmFuc21pcyBlbiB0YW50IHF1J2VuLXTDqnRlIGRhbnMgbGEgcmVxdcOqdGUgSFRUUCDDoCBsJ1VSTCBzcMOpY2lmacOpZS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIG9uRG9uZSBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBleMOpY3V0w6llIGxvcnNxdWUgbGFcclxuICogcmVxdcOqdGUgSFRUUCBhYm91dGlyYSBldCBxdWUgbCdVUkwgZHUgZmljaGllciBzZXJhIG9idGVudWUuIElsIHByZW5kIHVuIGFyZ3VtZW50LCBxdWkgZXN0IGwnVVJMIGR1XHJcbiAqIGZpY2hpZXIuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgb25FcnJvciBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBleMOpY3V0w6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsYSByZXF1w6p0ZSBIVFRQLiBJbCBlc3QgZmFjdWx0YXRpZiBldCBwZXV0IMOqdHJlIGxhaXNzw6kgaW5kw6lmaW5pIHMnaWwgbidlc3QgcGFzXHJcbiAqIG7DqWNlc3NhaXJlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFNwYWNlX2ZpbGVfdXJsX2NzcihcclxuICBjcmVkZW50aWFscyxcclxuICBkb2NpZCxcclxuICBjc3IsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IHVybCA9IGAke2NyZWRlbnRpYWxzLnNwYWNlfS9yZXNvdXJjZXMvdjEvbW9kZWxlci9kb2N1bWVudHMvJHtkb2NpZH0vZmlsZXMvRG93bmxvYWRUaWNrZXRgO1xyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICBtZXRob2Q6IFwiUFVUXCIsXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIEVOT19DU1JGX1RPS0VOOiBjc3IsXHJcbiAgICB9LFxyXG5cclxuICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgbGV0IGluZm8gPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxuICAgICAgaWYgKGluZm8uc3VjY2VzcyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBmaWxlX3VybCA9IGluZm8uZGF0YVswXS5kYXRhZWxlbWVudHMudGlja2V0VVJMO1xyXG4gICAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKGZpbGVfdXJsKTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGVycik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIG9uRmFpbHVyZShyZXNwb25zZSkge1xyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihyZXNwb25zZSk7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIENldHRlIGZvbmN0aW9uIG1ldCDDoCBqb3VyIHVuIGZpY2hpZXIgZGFucyB1biBlc3BhY2UgM0QgYXZlYyBsZXMgZG9ubsOpZXMgZXQgbGUgbm9tIGRlIGZpY2hpZXIgZG9ubsOpcyxcclxuICogZW4gdXRpbGlzYW50IGxhIHByb3RlY3Rpb24gQ1NSRi5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXUnaWNpIMKrIHRva2VuIMK7IGV0IMKrIHNwYWNlIMK7LihleDogY3JlZGVudGlhbHMuc3BhY2UsIGNyZWRlbnRpYWxzLnRlbmFudCwgY3JlZGVudGlhbHMudG9rZW4uLi4pLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTcGFjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IFtkb2NJZF0gLSBJRCBkZSBkb2N1bWVudCBkdSBmaWNoaWVyIGQnZXNwYWNlIDNEIGVuIGNvdXJzIGRlIG1pc2Ugw6Agam91ci5cclxuICogQHBhcmFtIHtTdHJpbmd9IFtmaWxlSWRdIC0gTGUgcGFyYW3DqHRyZSBmaWxlaWQgZXN0IGwnaWRlbnRpZmlhbnQgdW5pcXVlIGR1IGZpY2hpZXIgcXVpIGRvaXQgw6p0cmUgbWlzIMOgIGpvdXIuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZGF0YV0gLSBDZSBwYXJhbcOodHJlIHJlcHLDqXNlbnRlIGxlcyBkb25uw6llcyBkdSBmaWNoaWVyIHF1aSBkb2l2ZW50IMOqdHJlIG1pc2VzIMOgIGpvdXIuIElsIHBldXRcclxuICogc2UgcHLDqXNlbnRlciBzb3VzIGxhIGZvcm1lIGQndW4gZm9ybWF0IGJpbmFpcmUgb3UgdGV4dGUuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZmlsZW5hbWVdIC0gTm9tIGR1IGZpY2hpZXIgbWlzIMOgIGpvdXIuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBvbkRvbmUgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgZXjDqWN1dMOpZSBsb3JzcXVlXHJcbiAqIGwnb3DDqXJhdGlvbiBkZSBtaXNlIMOgIGpvdXIgZHUgZmljaGllciBzZXJhIHRlcm1pbsOpZSBhdmVjIHN1Y2PDqHMuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGV4w6ljdXTDqWUgc2kgdW5lIGVycmV1clxyXG4gKiBzdXJ2aWVudCBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNkc3BhY2VfZmlsZV91cGRhdGVgLiBJbCBwZXJtZXQgZGUgZ8OpcmVyIGxlcyBlcnJldXJzXHJcbiAqIGRlIG1hbmnDqHJlIHBlcnNvbm5hbGlzw6llLCBwbHV0w7R0IHF1ZSBkZSBzJ2FwcHV5ZXIgc3VyIGxlIGNvbXBvcnRlbWVudCBkZSBnZXN0aW9uIGRlcyBlcnJldXJzIHBhclxyXG4gKiBkw6lmYXV0LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFNwYWNlX2ZpbGVfdXBkYXRlKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIGRvY0lkLFxyXG4gIGZpbGVJZCxcclxuICBkYXRhLFxyXG4gIGZpbGVuYW1lLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBfM0RTcGFjZV9nZXRfY3NyZihcclxuICAgIGNyZWRlbnRpYWxzLFxyXG4gICAgZG9jSWQsXHJcbiAgICAoaW5mbykgPT4ge1xyXG4gICAgICBfM0RTcGFjZV9maWxlX3VwZGF0ZV9jc3IoXHJcbiAgICAgICAgY3JlZGVudGlhbHMsXHJcbiAgICAgICAgZG9jSWQsXHJcbiAgICAgICAgZmlsZUlkLFxyXG4gICAgICAgIGRhdGEsXHJcbiAgICAgICAgZmlsZW5hbWUsXHJcbiAgICAgICAgaW5mby5jc3JmLnZhbHVlLFxyXG4gICAgICAgIG9uRG9uZSxcclxuICAgICAgICBvbkVycm9yLFxyXG4gICAgICApO1xyXG4gICAgfSxcclxuICAgIG9uRXJyb3IsXHJcbiAgKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBDZXR0ZSBmb25jdGlvbiBtZXQgw6Agam91ciB1biBmaWNoaWVyIGRhbnMgbGUgZG9jdW1lbnQgZHUgM0RTcGFjZSDDoCBsJ2FpZGUgZCd1biBqZXRvbiBDaGVja2luVGlja2V0IGV0IENTUkYuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1J2ljaSDCqyB0b2tlbiDCuyBldCDCqyBzcGFjZSDCuy4oZXg6IGNyZWRlbnRpYWxzLnNwYWNlLCBjcmVkZW50aWFscy50ZW5hbnQsIGNyZWRlbnRpYWxzLnRva2VuLi4uKS5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3BhY2UpIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBkb2NJZCAtIElEIGR1IGRvY3VtZW50IGVuIGNvdXJzIGRlIG1pc2Ugw6Agam91ci5cclxuICogQHBhcmFtIHtTdHJpbmd9IGZpbGVJZCAtIElEIGR1IGZpY2hpZXIgbWlzIMOgIGpvdXIgZGFucyBsZSBkb2N1bWVudC5cclxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGEgLSBMZXMgZG9ubsOpZXMgYmluYWlyZXMgZHUgZmljaGllciBlbiBjb3VycyBkZSBtaXNlIMOgIGpvdXIuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlbmFtZSAtIE5vbSBkdSBmaWNoaWVyIG1pcyDDoCBqb3VyLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3NyIC0gY3NyIHNpZ25pZmllIENyb3NzLVNpdGUgUmVxdWVzdCBGb3JnZXJ5IHRva2VuLCBxdWkgZXN0IHVuZSBtZXN1cmUgZGUgc8OpY3VyaXTDqSB1dGlsaXPDqWVcclxuICogcG91ciBlbXDDqmNoZXIgbCdhY2PDqHMgbm9uIGF1dG9yaXPDqSBhdXggYXBwbGljYXRpb25zIFdlYi4gSWwgcydhZ2l0IGQndW4gamV0b24gdW5pcXVlIGfDqW7DqXLDqSBwYXIgbGVcclxuICogc2VydmV1ciBldCBlbnZvecOpIGF1IGNsaWVudCwgcXVpIGVzdCBlbnN1aXRlIGluY2x1cyBkYW5zIGxlcyByZXF1w6p0ZXMgdWx0w6lyaWV1cmVzIHBvdXIgdsOpcmlmaWVyXHJcbiAqIGwnYXV0aGVudGljaXTDqSBkZSBsYSByZXF1w6p0ZS4gRGFucyBjZXR0ZSBmb25jdGlvbiwgbGVcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIG9uRG9uZSBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBleMOpY3V0w6llIGxvcnNxdWUgbGFcclxuICogZm9uY3Rpb24gc2UgdGVybWluZXJhIGF2ZWMgc3VjY8Oocy4gSWwgcHJlbmQgbGEgcsOpcG9uc2UgY29tbWUgYXJndW1lbnQuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsYSByZXF1w6p0ZSBIVFRQLiBJbCBlc3QgZmFjdWx0YXRpZiBldCBzJ2lsIG4nZXN0IHBhcyBmb3VybmksIGwnZXJyZXVyIHNlcmEgdHJhaXTDqWUgZW5cclxuICogaW50ZXJuZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfM0RTcGFjZV9maWxlX3VwZGF0ZV9jc3IoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgZG9jSWQsXHJcbiAgZmlsZUlkLFxyXG4gIGRhdGEsXHJcbiAgZmlsZW5hbWUsXHJcbiAgY3NyLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCB1cmwgPVxyXG4gICAgY3JlZGVudGlhbHMuc3BhY2UgK1xyXG4gICAgYC9yZXNvdXJjZXMvdjEvbW9kZWxlci9kb2N1bWVudHMvJHtkb2NJZH0vZmlsZXMvQ2hlY2tpblRpY2tldGA7XHJcbiAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgIG1ldGhvZDogXCJQVVRcIixcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgRU5PX0NTUkZfVE9LRU46IGNzcixcclxuICAgIH0sXHJcblxyXG4gICAgb25Db21wbGV0ZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKHJlc3BvbnNlKS5kYXRhWzBdLmRhdGFlbGVtZW50cztcclxuXHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcblxyXG4gICAgICBmb3JtRGF0YS5hcHBlbmQoXCJfX2Zjc19fam9iVGlja2V0XCIsIGluZm8udGlja2V0KTtcclxuICAgICAgZm9ybURhdGEuYXBwZW5kKFwiZmlsZV8wXCIsIGRhdGEsIGZpbGVuYW1lKTtcclxuXHJcbiAgICAgIGNvbnN0IG9wdHMgPSB7fTtcclxuICAgICAgb3B0cy5tZXRob2QgPSBcIlBPU1RcIjtcclxuICAgICAgb3B0cy5kYXRhID0gZm9ybURhdGE7XHJcblxyXG4gICAgICBvcHRzLm9uQ29tcGxldGUgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAvL1VwZGF0ZSB0aGUgRkNTIGZpbGUgcmVjZWlwdFxyXG4gICAgICAgIGxldCB0ZW1wSWQgPSBcInRlbXBfXCIgKyBEYXRlLm5vdygpO1xyXG4gICAgICAgIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgbWV0aG9kOiBcIlBVVFwiLFxyXG4gICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBFTk9fQ1NSRl9UT0tFTjogY3NyLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgZGF0YTogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlkOiBkb2NJZCxcclxuICAgICAgICAgICAgICAgIHJlbGF0ZWRkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgIGZpbGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWQ6IGZpbGVJZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGFlbGVtZW50czoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogZmlsZW5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpcHQ6IHJlc3BvbnNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUFjdGlvbjogXCJSRVZJU0VcIixcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRlbXBJZCxcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgfSksXHJcblxyXG4gICAgICAgICAgdHlwZTogXCJqc29uXCIsXHJcblxyXG4gICAgICAgICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUocmVzcG9uc2UpO1xyXG4gICAgICAgICAgfSxcclxuXHJcbiAgICAgICAgICBvbkZhaWx1cmUocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IocmVzcG9uc2UpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKFxyXG4gICAgICAgICAgY3JlZGVudGlhbHMuc3BhY2UgKyBcIi9yZXNvdXJjZXMvdjEvbW9kZWxlci9kb2N1bWVudHNcIixcclxuICAgICAgICAgIG9wdGlvbnMsXHJcbiAgICAgICAgKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIG9wdHMub25GYWlsdXJlID0gZnVuY3Rpb24gKGVycikge1xyXG4gICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGVycik7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBvcHRzLnRpbWVvdXQgPSAwO1xyXG5cclxuICAgICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZChpbmZvLnRpY2tldFVSTCwgb3B0cyk7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIENldHRlIGZvbmN0aW9uIGNyw6llIHVuIGRvY3VtZW50IGRhbnMgbGUgM0RzcGFjZSDDoCBwYXJ0aXIgZGVzIGRvbm7DqWVzIGZvdXJuaWVzIGF1IGZvcm1hdCBKU09OLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdSdpY2kgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7IGV0IMKrIGN0eCDCuy4oZXg6IGNyZWRlbnRpYWxzLnNwYWNlLCBjcmVkZW50aWFscy50ZW5hbnQsIGNyZWRlbnRpYWxzLnRva2VuKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTcGFjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRva2VuIC0gTGUgcGFyYW3DqHRyZSB0b2tlbiBlc3QgbGUgamV0b24gQ1NSRi4gKGhlYWRlcnMgZXg6IEVOT19DU1JGX1RPS0VOOnRva2VuKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuY3R4IC0gTCdJRCBkdSBjb250ZXh0ZSBkZSB0cmF2YWlsLlxyXG4gKiBAcGFyYW0ge1N0cmluZ31bZGF0YV0gLSBMZSBwYXJhbcOodHJlIGRhdGEgY29ycmVzcG9uZCBhdXggZG9ubsOpZXMgSlNPTiBxdWkgZG9pdmVudCDDqnRyZSBjaGFyZ8OpZXMgZGFucyBsZSAzRHNwYWNlLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ31bZmlsZW5hbWVdIC0gTGUgbm9tIGR1IGZpY2hpZXIgw6AgY3LDqWVyLlxyXG4gKiBAcGFyYW0ge1N0cmluZ31bZGVzY10gLSBkZXNjIGVzdCB1biBwYXJhbcOodHJlIGRlIGNoYcOubmUgcXVpIHJlcHLDqXNlbnRlIGxhIGRlc2NyaXB0aW9uIGR1IGRvY3VtZW50IGVuIGNvdXJzIGRlIGNyw6lhdGlvbiBkYW5zIGxlIDNEc3BhY2UuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259W29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIG9uRG9uZSBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxhIHJlcXXDqnRlIEhUVFAgc2VyYSB0ZXJtaW7DqWUgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCBsYSByw6lwb25zZSBjb21tZSBhcmd1bWVudC5cclxuICpcclxuICogQHBhcmFtIHtGdW5jdGlvbn1bb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIG9uRXJyb3IgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBfM2RTcGFjZV9DcmVhdGVfRG9jLiBJbCBwcmVuZCBsJ29iamV0IGRlIHLDqXBvbnNlIGNvbW1lIGFyZ3VtZW50LlxyXG4gKlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF8zRFNwYWNlX0NyZWF0ZV9Eb2MoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgZGF0YSwgLy8gZGF0YVxyXG4gIGZpbGVuYW1lLCAvL3JlZiBjb2NsaWNvXHJcbiAgZGVzYywgLy8gcmVmIG5hbWVcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgX3NwYWNlID0gY3JlZGVudGlhbHMuc3BhY2U7XHJcbiAgY29uc3QgY3NyID0gY3JlZGVudGlhbHMudG9rZW47XHJcbiAgY29uc3QgY3R4ID0gY3JlZGVudGlhbHMuY3R4O1xyXG5cclxuICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gIGNvbnN0IGpzb25GaWxlID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KGRhdGEpXSwge1xyXG4gICAgdHlwZTogXCJ0ZXh0L3BsYWluXCIsXHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IHVybHMgPSB7XHJcbiAgICB1cmxfVGlja2V0OiBgJHtfc3BhY2V9L3Jlc291cmNlcy92MS9tb2RlbGVyL2RvY3VtZW50cy9maWxlcy9DaGVja2luVGlja2V0YCxcclxuICAgIHVybF9Qb3N0OiBgJHtfc3BhY2V9L3Jlc291cmNlcy92MS9tb2RlbGVyL2RvY3VtZW50cy8/U2VjdXJpdHlDb250ZXh0PWN0eDo6JHtjdHh9YCxcclxuICB9O1xyXG5cclxuICBpZiAoIV9zcGFjZSAmJiBfc3BhY2UgIT09IFwiXCIpIHtcclxuICAgIGNvbnNvbGUubG9nKFwibGUgc3RvcmUuXzNEU3BhY2UgZXN0IHZpZGVcIik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG4gIC8vIDFcclxuICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybHMudXJsX1RpY2tldCwge1xyXG4gICAgbWV0aG9kOiBcIlBVVFwiLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBFTk9fQ1NSRl9UT0tFTjogY3NyLnZhbHVlLFxyXG4gICAgfSxcclxuXHJcbiAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UocmVzcG9uc2UpLmRhdGFbMF0uZGF0YWVsZW1lbnRzO1xyXG5cclxuICAgICAgZm9ybURhdGEuYXBwZW5kKFwiX19mY3NfX2pvYlRpY2tldFwiLCBpbmZvLnRpY2tldCk7XHJcbiAgICAgIGZvcm1EYXRhLmFwcGVuZChcImZpbGVuYW1lXCIsIGpzb25GaWxlLCBmaWxlbmFtZSk7XHJcblxyXG4gICAgICBjb25zdCBvcHRzID0ge1xyXG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgZGF0YTogZm9ybURhdGEsXHJcblxyXG4gICAgICAgIG9uQ29tcGxldGUodGlja2V0KSB7XHJcbiAgICAgICAgICBpZiAoY3R4ICE9PSBcIlwiICYmIGNzciAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgRU5PX0NTUkZfVE9LRU46IGNzcixcclxuICAgICAgICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IFtcclxuICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiRG9jdW1lbnRcIixcclxuICAgICAgICAgICAgICAgICAgICBkYXRhZWxlbWVudHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBgVGl0bGVfJHtmaWxlbmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoXCIgXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKFwiX1wiKX1gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgcG9saWN5OiBcIkRvY3VtZW50IFJlbGVhc2VcIixcclxuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRlZGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZpbGVzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhZWxlbWVudHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBgJHtmaWxlbmFtZX0uanNvbmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXB0OiB0aWNrZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wSWQ6IFVVSUQoKSxcclxuICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgdHlwZTogXCJqc29uXCIsXHJcbiAgICAgICAgICAgICAgdGltZW91dDogMCxcclxuXHJcbiAgICAgICAgICAgICAgb25Db21wbGV0ZTogaGFuZGxlU3VjY2VzcyxcclxuICAgICAgICAgICAgICBvbkZhaWx1cmU6IGhhbmRsZUVycm9yLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKGN0eCAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICAgIC8vIDNcclxuICAgICAgICAgICAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybHMudXJsX1Bvc3QsIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJsZSBzdG9yZSBlc3QgdmlkZVwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbkZhaWx1cmU6IGhhbmRsZUVycm9yLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgZnVuY3Rpb24gaGFuZGxlU3VjY2VzcyhyZXNwb25zZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiU3VjY2VzcyAtLSByZXNwb25zZSBcIiwgcmVzcG9uc2UuZGF0YVswXSk7XHJcblxyXG4gICAgICAgIGlmIChvbkRvbmUpIHtcclxuICAgICAgICAgIG9uRG9uZShyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBmdW5jdGlvbiBoYW5kbGVFcnJvcihyZXNwb25zZSwgaGVhZGVycykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRXJyZXVyIC0tIHJlc3BvbnNlIFwiLCByZXNwb25zZSwgXCJcXG4gaGVhZGVycyBcIiwgaGVhZGVycyk7XHJcbiAgICAgICAgaWYgKG9uRXJyb3IpIHtcclxuICAgICAgICAgIG9uRXJyb3IocmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZChpbmZvLnRpY2tldFVSTCwgb3B0cyk7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIENldHRlIGZvbmN0aW9uIHLDqWN1cMOocmUgbGVzIGNvbnRleHRlcyBkZSBzw6ljdXJpdMOpIGJhc8OpcyBzdXIgZGVzIHBhcmFtw6h0cmVzIHNww6ljaWZpw6lzIMOgIHBhcnRpciBkJ3VuXHJcbiAqIGjDtHRlIGRvbm7DqS5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXUnaWNpIMKrIHNwYWNlIMK7LihleDogY3JlZGVudGlhbHMuc3BhY2UsIGNyZWRlbnRpYWxzLnRlbmFudCwgY3JlZGVudGlhbHMudG9rZW4uLi4pLlxyXG4gKkBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFNwYWNlKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gW2NzXSAtIExlIHRpdHJlIGQndW4gZXNwYWNlIGRlIGNvbGxhYm9yYXRpb24uXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbcm9sZV0gLSBMZSBwYXJhbcOodHJlIGRlIHLDtGxlIGVzdCB1biBwYXJhbcOodHJlIGZhY3VsdGF0aWYgcXVpIHNww6ljaWZpZSBsZSByw7RsZSBkZVxyXG4gKiBsJ3V0aWxpc2F0ZXVyIGRhbnMgbCdlc3BhY2UgZGUgY29sbGFib3JhdGlvbi4gU2kgZm91cm5pLCBsYSBmb25jdGlvbiBmaWx0cmVyYSBsZXMgZXNwYWNlcyBkZVxyXG4gKiBjb2xsYWJvcmF0aW9uIHBvdXIgdHJvdXZlciBjZWx1aSBvw7kgbCd1dGlsaXNhdGV1ciBhIGxlIHLDtGxlIHNww6ljaWZpw6kuIFMnaWwgbidlc3QgcGFzIGZvdXJuaSwgbGFcclxuICogZm9uY3Rpb24gdXRpbGlzZXJhIGxlIHByZW1pZXIgZXNwYWNlIGRlIGNvbGxhYm9yYXRpb24gdHJvdXbDqS5cclxuICogQHBhcmFtIHtTdHJpbmd9IFtvcmdhbml6YXRpb25dIC0gTm9tIGRlIGwnb3JnYW5pc2F0aW9uIHBvdXIgbGFxdWVsbGUgbGUgY29udGV4dGUgZGUgc8OpY3VyaXTDqSBlc3QgcsOpY3Vww6lyw6kuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGEgZm9uY3Rpb24gw6AgYXBwZWxlciBsb3JzcXVlIGxlIGNvbnRleHRlIGRlIHPDqWN1cml0w6kgYSDDqXTDqSByw6ljdXDDqXLDqSBhdmVjIHN1Y2PDqHMuXHJcbiAqIElsIHByZW5kIGxlIGNvbnRleHRlIGNvbW1lIHBhcmFtw6h0cmUuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgb25FcnJvciBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgZXN0IGFwcGVsw6llIHNpIHVuZSBlcnJldXIgc2VcclxuICogcHJvZHVpdCBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbi4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIHF1aSBlc3QgbGUgbWVzc2FnZSBkJ2VycmV1ciBvdVxyXG4gKiBsJ29iamV0LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFNwYWNlX2dldF9zZWN1cml0eUNvbnRleHRzKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIGNzID0gdW5kZWZpbmVkLFxyXG4gIHJvbGUgPSB1bmRlZmluZWQsXHJcbiAgb3JnYW5pemF0aW9uID0gdW5kZWZpbmVkLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCB1cmwgPVxyXG4gICAgYCR7Y3JlZGVudGlhbHMuc3BhY2V9L3Jlc291cmNlcy9tb2RlbGVyL3Buby9wZXJzb24/YCArXHJcbiAgICBcImN1cnJlbnQ9dHJ1ZVwiICtcclxuICAgIFwiJnNlbGVjdD1wcmVmZXJyZWRjcmVkZW50aWFsc1wiICtcclxuICAgIFwiJnNlbGVjdD1jb2xsYWJzcGFjZXNcIjtcclxuXHJcbiAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgLy8gcm9sZS5jb21wYW55LmNzXHJcbiAgICAgIGNvbnN0IGNvbnRleHRzID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcbiAgICAgIGxldCBjb250ZXh0ID0gXCJcIjtcclxuICAgICAgbGV0IGZpbmFsQ3MsXHJcbiAgICAgICAgZmluYWxPcmcsXHJcbiAgICAgICAgZmluYWxSb2xlID0gdW5kZWZpbmVkO1xyXG4gICAgICBpZiAoY3MpIHtcclxuICAgICAgICBsZXQgb0NTID0gY29udGV4dHMuY29sbGFic3BhY2VzLmZpbmQoKGUpID0+IGUudGl0bGUgPT09IGNzKTtcclxuICAgICAgICBpZiAob0NTKSB7XHJcbiAgICAgICAgICBmaW5hbENzID0gY3M7XHJcbiAgICAgICAgICBsZXQgY291cGxlcyA9IG9DUy5jb3VwbGVzO1xyXG4gICAgICAgICAgY291cGxlcyA9IGNvdXBsZXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAodmFsdWUsIGluZGV4LCBzZWxmKSA9PlxyXG4gICAgICAgICAgICAgIGluZGV4ID09PVxyXG4gICAgICAgICAgICAgIHNlbGYuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgKHQpID0+XHJcbiAgICAgICAgICAgICAgICAgIHQub3JnYW5pemF0aW9uLnBpZCA9PT0gdmFsdWUub3JnYW5pemF0aW9uLnBpZCAmJlxyXG4gICAgICAgICAgICAgICAgICB0LnJvbGUucGlkID09PSB2YWx1ZS5yb2xlLnBpZCxcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmIChyb2xlKSB7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJvbGUpKSB7XHJcbiAgICAgICAgICAgICAgcm9sZS5mb3JFYWNoKChyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZpbmFsUm9sZSlcclxuICAgICAgICAgICAgICAgICAgY291cGxlcy5mb3JFYWNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgciA9PT0gZS5yb2xlLm5hbWUgJiZcclxuICAgICAgICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbiA9PT0gZS5vcmdhbml6YXRpb24udGl0bGVcclxuICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZpbmFsUm9sZSA9IHI7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmaW5hbE9yZyA9IG9yZ2FuaXphdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHIgPT09IGUucm9sZS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVmaW5lU2luZ2xlSXRlbSA9IGNvdXBsZXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY291cGxlKSA9PiBjb3VwbGUucm9sZS5uYW1lID09PSByLFxyXG4gICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZpbmVTaW5nbGVJdGVtLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFJvbGUgPSBkZWZpbmVTaW5nbGVJdGVtWzBdLnJvbGUubmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxPcmcgPSBkZWZpbmVTaW5nbGVJdGVtWzBdLm9yZ2FuaXphdGlvbi50aXRsZTtcclxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZGVmaW5lU2luZ2xlSXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb3VwbGVzLmZvckVhY2goKGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgcm9sZSA9PT0gZS5yb2xlLm5hbWUgJiZcclxuICAgICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uID09PSBlLm9yZ2FuaXphdGlvbi50aXRsZVxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgIGZpbmFsUm9sZSA9IHJvbGU7XHJcbiAgICAgICAgICAgICAgICAgIGZpbmFsT3JnID0gb3JnYW5pemF0aW9uO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb2xlID09PSBlLnJvbGUubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgZGVmaW5lU2luZ2xlSXRlbSA9IGNvdXBsZXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgICAgIChjb3VwbGUpID0+IGNvdXBsZS5yb2xlLm5hbWUgPT09IHJvbGUsXHJcbiAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChkZWZpbmVTaW5nbGVJdGVtLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmFsUm9sZSA9IGRlZmluZVNpbmdsZUl0ZW1bMF0ucm9sZS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmFsT3JnID0gZGVmaW5lU2luZ2xlSXRlbVswXS5vcmdhbml6YXRpb24udGl0bGU7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihkZWZpbmVTaW5nbGVJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChmaW5hbENzICYmIGZpbmFsT3JnICYmIGZpbmFsUm9sZSkge1xyXG4gICAgICAgIGNvbnRleHQgPSBmaW5hbFJvbGUgKyBcIi5cIiArIGZpbmFsT3JnICsgXCIuXCIgKyBmaW5hbENzO1xyXG4gICAgICAgIG9uRG9uZShjb250ZXh0KTtcclxuICAgICAgICAvLyBvbkRvbmUoZW5jb2RlVVJJKGNvbnRleHQpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoY29udGV4dHMucHJlZmVycmVkY3JlZGVudGlhbHMpIHtcclxuICAgICAgICAgIGNvbnRleHQgPVxyXG4gICAgICAgICAgICBjb250ZXh0cy5wcmVmZXJyZWRjcmVkZW50aWFscy5yb2xlLm5hbWUgK1xyXG4gICAgICAgICAgICBcIi5cIiArXHJcbiAgICAgICAgICAgIGNvbnRleHRzLnByZWZlcnJlZGNyZWRlbnRpYWxzLm9yZ2FuaXphdGlvbi50aXRsZSArXHJcbiAgICAgICAgICAgIFwiLlwiICtcclxuICAgICAgICAgICAgY29udGV4dHMucHJlZmVycmVkY3JlZGVudGlhbHMuY29sbGFic3BhY2UudGl0bGU7XHJcbiAgICAgICAgICBvbkRvbmUoY29udGV4dCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChvbkVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQgPSBmaW5hbFJvbGUgKyBcIi5cIiArIGZpbmFsT3JnICsgXCIuXCIgKyBmaW5hbENzO1xyXG4gICAgICAgICAgICBvbkVycm9yKGNvbnRleHQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIG9uRmFpbHVyZShlcnIpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJFcnJldXIgZGUgcsOpY3Vww6lyYXRpb24gZHUgY29udGV4dGUgZGUgc8OpY3VyaXTDqS4gPT4gXCIsIGVycik7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfM2RzcGFjZV9kb3dubG9hZF9kb2NgIGVzdCB1bmUgZm9uY3Rpb24gYXN5bmNocm9uZSBxdWkgdMOpbMOpY2hhcmdlIHVuIGRvY3VtZW50IMOgIHBhcnRpciBkJ3VuIGVzcGFjZSAzRCwgYXZlYyBkZXMgcmFwcGVscyBmYWN1bHRhdGlmcyBwb3VyIGxlIHN1Y2PDqHMgZXQgbGEgZ2VzdGlvbiBkZXMgZXJyZXVycy5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gbsOpY2Vzc2FpcmVzIMOgXHJcbiAqIGwnYXV0aGVudGlmaWNhdGlvbi4gSWwgZG9pdCBhdm9pciBsZXMgcHJvcHJpw6l0w6lzIHN1aXZhbnRlczogc3BhY2UsIHRva2VuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFNwYWNlKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG5cclxuICogQHBhcmFtICB7U3RyaW5nfSBbY3JlZGVudGlhbHMudG9rZW5dIC0gTGUgcGFyYW3DqHRyZSB0b2tlbiBlc3QgbGUgamV0b24gQ1NSRi4gKGhlYWRlcnMgZXg6IEVOT19DU1JGX1RPS0VOOnRva2VuKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gW29iamVjdElkXSAtIExlIHBhcmFtw6h0cmUgb2JqZWN0SWQgZXN0IGwnaWRlbnRpZmlhbnQgdW5pcXVlIGR1IGRvY3VtZW50IHF1ZSB2b3VzIHNvdWhhaXRlelxyXG4gKiB0w6lsw6ljaGFyZ2VyIGRlcHVpcyBsZSAzRFNwYWNlLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsZVxyXG4gKiB0w6lsw6ljaGFyZ2VtZW50IHNlcmEgdGVybWluw6kgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgcXVpIGVzdCBsZXMgZG9ubsOpZXMgZGUgcsOpcG9uc2UgZHVcclxuICogdMOpbMOpY2hhcmdlbWVudC5cclxuICogQHBhcmFtIHtDYWxsYmFja30gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNkc3BhY2VfZG93bmxvYWRfZG9jYC4gSWwgdm91cyBwZXJtZXQgZGUgZ8OpcmVyIGV0IGRlXHJcbiAqIHLDqXBvbmRyZSDDoCB0b3V0ZXMgbGVzIGVycmV1cnMgcXVpIHNlIHByb2R1aXNlbnQuXHJcbiBcclxuICogQHJldHVybnMgdW5lIHByb21lc3NlLlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF8zRFNwYWNlX2Rvd25sb2FkX2RvYyhcclxuICBjcmVkZW50aWFscyxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuICBtZXNzYWdlID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCBvYmplY3RJZCA9IGNyZWRlbnRpYWxzLm9iaklEO1xyXG4gIGlmIChvYmplY3RJZCA9PT0gdW5kZWZpbmVkIHx8IG9iamVjdElkID09PSBcIlwiKSB7XHJcbiAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgIFwiXzNEU3BhY2VfZG93bmxvYWRfZG9jKCkgLyBMZSBwYXJhbcOodHJlIG9iamVjdElkIGVzdCBvYmxpZ2F0b2lyZVwiLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGlmIChjcmVkZW50aWFscy5zcGFjZSA9PT0gXCJcIiB8fCAhY3JlZGVudGlhbHMuc3BhY2UpIHtcclxuICAgIGNvbnNvbGUud2FybihcclxuICAgICAgXCJfM0RTcGFjZV9kb3dubG9hZF9kb2MoKSAvIExlIHBhcmFtw6h0cmUgc3BhY2UgZXN0IG9ibGlnYXRvaXJlXCIsXHJcbiAgICApO1xyXG4gIH1cclxuICB0cnkge1xyXG4gICAgXzNEU3BhY2VfZmlsZV91cmwoXHJcbiAgICAgIGNyZWRlbnRpYWxzLFxyXG4gICAgICBvYmplY3RJZCxcclxuICAgICAgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICBcIl8zZHNwYWNlX2Rvd25sb2FkX2RvYyAvIF8zRFNwYWNlX2ZpbGVfdXJsIC8gcmVzcG9uc2UgXCIsXHJcbiAgICAgICAgICByZXNwb25zZSxcclxuICAgICAgICApO1xyXG4gICAgICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQocmVzcG9uc2UsIHtcclxuICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgRU5PX0NTUkZfVE9LRU46IGNyZWRlbnRpYWxzLnRva2VuLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShyZXN1bHQpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uRmFpbHVyZShlcnJvciwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgICAgICAgIGlmIChvbkVycm9yKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJlcnJvciBodHRwXCIsIGVycm9yKTtcclxuICAgICAgICAgICAgICBvbkVycm9yKHsgZXJyb3IsIGhlYWRlcnMsIHhociB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiKl8zZHNwYWNlX2Rvd25sb2FkX2RvYyAvIGVycm9yIGZpbGUgVVJMICpcIiwgZXJyb3IpO1xyXG4gICAgICB9LFxyXG4gICAgKTtcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgY29uc29sZS5sb2coXCIqXzNkc3BhY2VfZG93bmxvYWRfZG9jIC8gZXJyb3IgZmlsZSBVUkwgKlwiLCBlcnJvcik7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfM2RzcGFjZV9kb3dubG9hZF9tdWx0aWRvY2AgdMOpbMOpY2hhcmdlIHBsdXNpZXVycyBkb2N1bWVudHMgw6AgcGFydGlyIGQndW4gZXNwYWNlIDNEIGVuXHJcbiAqIHV0aWxpc2FudCB1biB0b2tlbiBldCBkZXMgb2JqZWN0SUQgZG9ubsOpcy5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBuw6ljZXNzYWlyZXMgw6BcclxuICogbCdhdXRoZW50aWZpY2F0aW9uIGRhbnMgdW5lIGZvbmN0aW9uIGludGVybmUoXzNEU3BhY2VfZ2V0X2Rvd25sb2FkVGlja2V0X211bHRpZG9jKS4gSWwgZG9pdCBhdm9pciBsZXMgcHJvcHJpw6l0w6lzIHN1aXZhbnRlczogc3BhY2UsIHRva2VuLCB0ZW5hbnRcclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3BhY2UpIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy50ZW5hbnQgLSBsZSB0ZW5hbnQgY291cmFudCBcclxuICogQGV4YW1wbGUge3RlbmFudDpcIlIxMTMyMTAwOTY4NDQ3XCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbY3JlZGVudGlhbHMudG9rZW5dIC0gTGUgcGFyYW3DqHRyZSB0b2tlbiBlc3QgbGUgamV0b24gQ1NSRi4gKGhlYWRlcnMgZXg6IEVOT19DU1JGX1RPS0VOOnRva2VuKVxyXG5cclxuICogQHBhcmFtIHtTdHJpbmd9IFtvYmplY3RJZHNdIC0gVW4gdGFibGVhdSBkJ0lEIGQnb2JqZXQgcXVpIGRvaXZlbnQgw6p0cmUgdMOpbMOpY2hhcmfDqXMgw6AgcGFydGlyIGR1IDNEU3BhY2UuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxlXHJcbiAqIHByb2Nlc3N1cyBkZSB0w6lsw6ljaGFyZ2VtZW50IHNlcmEgdGVybWluw6kgYXZlYyBzdWNjw6hzLiBJbCBmYXV0IHVuIGFyZ3VtZW50LCBxdWkgZXN0IGxlIHLDqXN1bHRhdCBkdVxyXG4gKiBwcm9jZXNzdXMgZGUgdMOpbMOpY2hhcmdlbWVudC5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBwZW5kYW50IGxlIHByb2Nlc3N1cyBkZSB0w6lsw6ljaGFyZ2VtZW50LiBJbCB2b3VzIHBlcm1ldCBkZSBnw6lyZXIgbGVzIGVycmV1cnMgcXVpIHN1cnZpZW5uZW50XHJcbiAqIGxvcnMgZHUgdMOpbMOpY2hhcmdlbWVudC5cclxuXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gXzNEU3BhY2VfZG93bmxvYWRfbXVsdGlkb2MoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgb2JqZWN0SWRzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBsZXQgbGlzdERpdiA9IFtdO1xyXG4gIGNvbnN0IGNodW5rU2l6ZSA9IDgwO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0SWRzLmxlbmd0aDsgaSArPSBjaHVua1NpemUpIHtcclxuICAgIGNvbnN0IGNodW5rID0gb2JqZWN0SWRzLnNsaWNlKGksIGkgKyBjaHVua1NpemUpO1xyXG4gICAgbGlzdERpdi5wdXNoKGNodW5rKTtcclxuICB9XHJcbiAgY29uc3QgbG9vcCA9IChpKSA9PiB7XHJcbiAgICBfM0RTcGFjZV9nZXRfZG93bmxvYWRUaWNrZXRfbXVsdGlkb2MoXHJcbiAgICAgIGNyZWRlbnRpYWxzLFxyXG4gICAgICBsaXN0RGl2W2ldLFxyXG4gICAgICAoKSA9PiB7XHJcbiAgICAgICAgaSsrO1xyXG4gICAgICAgIGlmIChpIDwgbGlzdERpdi5sZW5ndGgpIHtcclxuICAgICAgICAgIGxvb3AoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICAoZG9uZSkgPT4ge1xyXG4gICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShkb25lKTtcclxuICAgICAgfSxcclxuICAgICk7XHJcbiAgfTtcclxuXHJcbiAgbG9vcCgwKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgXzNkc3BhY2VfZ2V0X2Rvd25sb2FkVGlja2V0X211bHRpZG9jYCBwZXJtZXQgZGUgcsOpY3Vww6lyZXIgdW4gdGlja2V0IGRlIHTDqWzDqWNoYXJnZW1lbnRcclxuICogZGUgcGx1c2lldXJzIGRvY3VtZW50cyBkYW5zIHVuIGVzcGFjZSAzRC5cclxuICogQHBhcmFtIHtPYmplY3R9IFtjcmVkZW50aWFsc10gLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIG7DqWNlc3NhaXJlcyDDoFxyXG4gKiBsJ2F1dGhlbnRpZmljYXRpb24uIElsIGRvaXQgYXZvaXIgbGVzIHByb3ByacOpdMOpcyBzdWl2YW50ZXM6IHNwYWNlLCB0b2tlbiwgdGVuYW50XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFNwYWNlKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudGVuYW50IC0gbGUgdGVuYW50IGNvdXJhbnRcclxuICogQGV4YW1wbGUge3RlbmFudDpcIlIxMTMyMTAwOTY4NDQ3XCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbY3JlZGVudGlhbHMudG9rZW5dIC0gTGUgcGFyYW3DqHRyZSB0b2tlbiBlc3QgbGUgamV0b24gQ1NSRi4gKGhlYWRlcnMgZXg6IEVOT19DU1JGX1RPS0VOOnRva2VuKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gW29iamVjdElkc10gLSBUYWJsZWF1IGQnSUQgZCdvYmpldCBwb3VyIGxlc3F1ZWxzIGxlIHRpY2tldCBkZSB0w6lsw6ljaGFyZ2VtZW50IGRvaXQgw6p0cmUgZ8OpbsOpcsOpLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25OZXh0XSAtIFVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgYXByw6hzIGNoYXF1ZSBkZW1hbmRlIGRlIHRpY2tldCBkZVxyXG4gKiB0w6lsw6ljaGFyZ2VtZW50IHLDqXVzc2llIHBvdXIgY2hhcXVlIG9iamVjdElkLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsZVxyXG4gKiBwcm9jZXNzdXMgZGUgdMOpbMOpY2hhcmdlbWVudCBkZSBjaGFxdWUgb2JqZXQgc2VyYSB0ZXJtaW7DqSBhdmVjIHN1Y2PDqHMuIElsIGx1aSBzZXJhIHRyYW5zbWlzIHVuIG9iamV0XHJcbiAqIGNvbnRlbmFudCDCqyBvYmplY3RJZCDCuywgwqsgZmlsZU5hbWUgwrsgZXQgwqsgZGF0YSDCuyBkdSBmaWNoaWVyIHTDqWzDqWNoYXJnw6kuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24uIElsIGVzdCBmYWN1bHRhdGlmIGV0IHBldXQgw6p0cmUgdXRpbGlzw6kgcG91ciBnw6lyZXIgbGVzXHJcbiAqIGVycmV1cnMgcXVpIHN1cnZpZW5uZW50LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFNwYWNlX2dldF9kb3dubG9hZFRpY2tldF9tdWx0aWRvYyhcclxuICBjcmVkZW50aWFscyxcclxuICBvYmplY3RJZHMsXHJcbiAgb25OZXh0ID0gdW5kZWZpbmVkLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCBjb21waWxEYXRhID0gW107XHJcbiAgb2JqZWN0SWRzLmZvckVhY2goKG9iamVjdElkKSA9PiB7XHJcbiAgICBjb21waWxEYXRhLnB1c2goe1xyXG4gICAgICBpZDogb2JqZWN0SWQsXHJcbiAgICB9KTtcclxuICB9KTtcclxuICBsZXQgZGF0YSA9IEpTT04uc3RyaW5naWZ5KHtcclxuICAgIGNzcmY6IHtcclxuICAgICAgbmFtZTogXCJFTk9fQ1NSRl9UT0tFTlwiLFxyXG4gICAgICB2YWx1ZTogY3JlZGVudGlhbHMudG9rZW4sXHJcbiAgICB9LFxyXG4gICAgZGF0YTogY29tcGlsRGF0YSxcclxuICB9KTtcclxuXHJcbiAgY29uc3QgdXJsID0gYCR7Y3JlZGVudGlhbHMuc3BhY2V9L3Jlc291cmNlcy92MS9tb2RlbGVyL2RvY3VtZW50cy9Eb3dubG9hZFRpY2tldD90ZW5hbnQ9JHtjcmVkZW50aWFscy50ZW5hbnR9JmU2dy1sYW5nPWZyJmU2dy10aW1lem9uZT0tMTIwYDtcclxuICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgbWV0aG9kOiBcIlBVVFwiLFxyXG4gICAgZGF0YSxcclxuICAgIHR5cGU6IFwianNvblwiLFxyXG4gICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICBjb25zdCBkYXRhcyA9IHJlc3BvbnNlLmRhdGE7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzID09PSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKG9uTmV4dCkgb25OZXh0KCk7XHJcbiAgICAgICAgZGF0YXMuZm9yRWFjaCgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBkYXRhLmRhdGFlbGVtZW50cy5maWxlTmFtZTtcclxuICAgICAgICAgICAgY29uc3QgZmlsZVVybCA9IGRhdGEuZGF0YWVsZW1lbnRzLnRpY2tldFVSTDtcclxuICAgICAgICAgICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZChmaWxlVXJsLCB7XHJcbiAgICAgICAgICAgICAgb25Db21wbGV0ZTogKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAob25Eb25lKVxyXG4gICAgICAgICAgICAgICAgICBvbkRvbmUoe1xyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdElkOiBkYXRhLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IEpTT04ucGFyc2UocmVzcG9uc2UpLFxyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIG9uRmFpbHVyZTogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGh0dHBcIiwgZXJyb3IpO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGVycik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBvbkZhaWx1cmUocmVzcG9uc2UpIHtcclxuICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihyZXNwb25zZSk7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcblxyXG4vLyBNQVRVUklUWVxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIENldHRlIGZvbmN0aW9uIEphdmFTY3JpcHQgcsOpY3Vww6hyZSBsZXMgcHJvY2hhaW5zIMOpdGF0cyBwb3NzaWJsZXMgcG91ciB1biBvYmpldCBkb25uw6kgZGFucyB1biBlc3BhY2VcclxuICogM0QuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTcGFjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRva2VuIC0gTGUgcGFyYW3DqHRyZSB0b2tlbiBlc3QgbGUgamV0b24gQ1NSRi4gKGhlYWRlcnMgZXg6IEVOT19DU1JGX1RPS0VOOnRva2VuKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuY3R4IC0gTCdJRCBkdSBjb250ZXh0ZSBkZSB0cmF2YWlsLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gb2JqZWN0SWQgLSBMZSBwYXJhbcOodHJlIGBvYmplY3RJZGAgZXN0IGwnaWRlbnRpZmlhbnQgZGUgbCdvYmpldCBkb250IHZvdXMgc291aGFpdGV6IHLDqWN1cMOpcmVyXHJcbiAqIGxlcyBwcm9jaGFpbnMgw6l0YXRzLiBJbCBlc3QgdXRpbGlzw6kgcG91ciBzcMOpY2lmaWVyIGwnb2JqZXQgcG91ciBsZXF1ZWwgdm91cyBzb3VoYWl0ZXogb2J0ZW5pciBsZXNcclxuICogw6l0YXRzIHN1aXZhbnRzIGRhbnMgbCdlc3BhY2UgM0QuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gVW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxhIGRlbWFuZGUgc2VyYSB0ZXJtaW7DqWUgYXZlY1xyXG4gKiBzdWNjw6hzLiBJbCByZWNldnJhIGxhIHLDqXBvbnNlIGVuIHBhcmFtw6h0cmUuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24uIElsIHMnYWdpdCBkJ3VuIHBhcmFtw6h0cmUgZmFjdWx0YXRpZiwgZG9uYyBzJ2lsIG4nZXN0IHBhc1xyXG4gKiBmb3VybmksIGlsIHNlcmEgcGFyIGTDqWZhdXQgwqtub24gZMOpZmluacK7LlxyXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFNwYWNlX2xpZmVjeWNsZV9nZXROZXh0U3RhdGVzKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9iamVjdElkLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc3VsdCkgPT4ge1xyXG4gICAgaWYgKGNyZWRlbnRpYWxzLnRva2VuID09PSBcIlwiKSB7XHJcbiAgICAgIF8zRFNwYWNlX2NzcmYoY3JlZGVudGlhbHMpO1xyXG4gICAgfVxyXG4gICAgaWYgKG9iamVjdElkICE9PSB1bmRlZmluZWQgJiYgb2JqZWN0SWQgIT09IFwiXCIgJiYgb2JqZWN0SWQgIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgdXJsID0gYCR7Y3JlZGVudGlhbHMuc3BhY2V9L3Jlc291cmNlcy92MS9tb2RlbGVyL2RzbGMvbWF0dXJpdHkvZ2V0TmV4dFN0YXRlc2A7XHJcblxyXG4gICAgICBfM0RTcGFjZV9nZXRfc2VjdXJpdHlDb250ZXh0cyhcclxuICAgICAgICBjcmVkZW50aWFscy5zcGFjZSxcclxuICAgICAgICBcIkVTUEFDRSBDT01NVU5cIixcclxuICAgICAgICBbXCJWUExNUHJvamVjdExlYWRlclwiLCBcIlZQTE1DcmVhdG9yXCJdLFxyXG4gICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAoY3R4KSA9PiAoY3JlZGVudGlhbHNbXCJjdHhcIl0gPSBjdHgpLFxyXG4gICAgICAgIChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwib25FcnJvciA9PlwiLCBlcnIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICk7XHJcbiAgICAgIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgU2VjdXJpdHlDb250ZXh0OiBcImN0eDo6XCIgKyBjcmVkZW50aWFscy5jdHgsXHJcbiAgICAgICAgICBFTk9fQ1NSRl9UT0tFTjogY3JlZGVudGlhbHMudG9rZW4sXHJcbiAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICBkYXRhOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBpZDogb2JqZWN0SWQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHR5cGU6IFwianNvblwiLFxyXG4gICAgICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShyZXNwb25zZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkZhaWx1cmUocmVzcG9uc2UpIHtcclxuICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKHJlc3BvbnNlKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG4gICAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBDZXR0ZSBmb25jdGlvbiBwZXJtZXQgZGUgY2hhbmdlciBsJ8OpdGF0IGQndW4gb2JqZXQgZGFucyB1biBlc3BhY2UgM0QuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTcGFjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRva2VuIC0gTGUgcGFyYW3DqHRyZSB0b2tlbiBlc3QgbGUgamV0b24gQ1NSRi4gKGhlYWRlcnMgZXg6IEVOT19DU1JGX1RPS0VOOnRva2VuKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuY3R4IC0gTCdJRCBkdSBjb250ZXh0ZSBkZSB0cmF2YWlsLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gb2JqZWN0SWQgLSBMZSBwYXJhbcOodHJlIG9iamVjdElkIGVzdCBsJ2lkZW50aWZpYW50IGRlIGwnb2JqZXQgZG9udCBsJ8OpdGF0IGRvaXQgw6p0cmUgbW9kaWZpw6kuXHJcbiAqIElsIHMnYWdpdCBkJ3VuIGlkZW50aWZpYW50IHVuaXF1ZSBxdWkgcmVwcsOpc2VudGUgdW4gb2JqZXQgc3DDqWNpZmlxdWUgZGFucyBsZSBzeXN0w6htZS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW25leHRTdGF0ZV0gLSBMZSBwYXJhbcOodHJlIGBuZXh0U3RhdGVgIGVzdCBsJ8OpdGF0IHNvdWhhaXTDqSB2ZXJzIGxlcXVlbCB2b3VzIHNvdWhhaXRleiBtb2RpZmllclxyXG4gKiBsJ29iamV0LiBJbCByZXByw6lzZW50ZSBsJ8OpdGF0IHN1aXZhbnQgZHUgY3ljbGUgZGUgdmllIGRlIGwnb2JqZXQuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gVW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGwnb3DDqXJhdGlvbiBkZSBjaGFuZ2VtZW50IGQnw6l0YXRcclxuICogc2VyYSB0ZXJtaW7DqWUgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCBsYSByw6lwb25zZSBjb21tZSBhcmd1bWVudC5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNkc3BhY2VfbGlmZWN5bGVfY2hhbmdlU3RhdGVgLiBDJ2VzdCB1biBwYXJhbcOodHJlXHJcbiAqIGZhY3VsdGF0aWYsIGRvbmMgcydpbCBuJ2VzdCBwYXMgZm91cm5pLCBsYSBmb25jdGlvbiBuZSBmZXJhIHJpZW4gZW4gY2FzIGRlIHByb2Jsw6htZS5cclxuICogQHJldHVybnMgdW5lIHByb21lc3NlLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFNwYWNlX2xpZmVjeWNsZV9jaGFuZ2VTdGF0ZShcclxuICBjcmVkZW50aWFscyxcclxuICBvYmplY3RJZCxcclxuICBuZXh0U3RhdGUsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzdWx0KSA9PiB7XHJcbiAgICBpZiAoY3JlZGVudGlhbHMudG9rZW4gPT09IFwiXCIpIHtcclxuICAgICAgXzNEU3BhY2VfY3NyZihjcmVkZW50aWFscyk7XHJcbiAgICB9XHJcbiAgICBpZiAob2JqZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3RJZCAhPT0gXCJcIiAmJiBvYmplY3RJZCAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCB1cmwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vcmVzb3VyY2VzL3YxL21vZGVsZXIvZHNsYy9tYXR1cml0eS9jaGFuZ2VTdGF0ZWA7XHJcblxyXG4gICAgICBfM0RTcGFjZV9nZXRfc2VjdXJpdHlDb250ZXh0cyhcclxuICAgICAgICBjcmVkZW50aWFscy5zcGFjZSxcclxuICAgICAgICBcIkVTUEFDRSBDT01NVU5cIixcclxuICAgICAgICBbXCJWUExNUHJvamVjdExlYWRlclwiLCBcIlZQTE1DcmVhdG9yXCJdLFxyXG4gICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAoY3R4KSA9PiAoY3JlZGVudGlhbHNbXCJjdHhcIl0gPSBjdHgpLFxyXG4gICAgICAgIChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwib25FcnJvciA9PlwiLCBlcnIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICk7XHJcbiAgICAgIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgU2VjdXJpdHlDb250ZXh0OiBcImN0eDo6XCIgKyBjcmVkZW50aWFscy5jdHgsXHJcbiAgICAgICAgICBFTk9fQ1NSRl9UT0tFTjogY3JlZGVudGlhbHMudG9rZW4sXHJcbiAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICBkYXRhOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBpZDogb2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgbmV4dFN0YXRlLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9KSxcclxuICAgICAgICB0eXBlOiBcImpzb25cIixcclxuICAgICAgICBvbkNvbXBsZXRlKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUocmVzcG9uc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25GYWlsdXJlKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihyZXNwb25zZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuICAgICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIG9wdGlvbnMpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcbi8vIFJFU0VSVkFUSU9OXHJcbi8vVE9ETyAtXHJcbmZ1bmN0aW9uIF8zRFNwYWNlX2xpZmVjeWxlX3Jlc2VydmUoXHJcbiAgaG9zdCxcclxuICBvYmplY3RJZCxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgLy8gLi4uXHJcbn1cclxuLy9UT0RPIC1cclxuZnVuY3Rpb24gXzNEU3BhY2VfbGlmZWN5bGVfdW5yZXNlcnZlKFxyXG4gIGhvc3QsXHJcbiAgb2JqZWN0SWQsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIC8vIC4uLlxyXG59XHJcbi8vIFNIQVJJTkdcclxuLy9UT0RPIC1cclxuZnVuY3Rpb24gXzNEU3BhY2VfbGlmZWN5bGVfZ2V0U2hhcmluZyhcclxuICBob3N0LFxyXG4gIG9iamVjdElkLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICAvLyAuLi5cclxufVxyXG4vL1RPRE8gLVxyXG5mdW5jdGlvbiBfM0RTcGFjZV9saWZlY3lsZV9zZXRTaGFyaW5nKFxyXG4gIGhvc3QsXHJcbiAgb2JqZWN0SWQsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIC8vIC4uLlxyXG59XHJcbi8vIFZFUlNJT05JTkdcclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgXzNEU3BhY2VfbGlmZWN5Y2xlX2dldEdyYXBoYCByw6ljdXDDqHJlIHVuIGdyYXBoaXF1ZSBkdSBjeWNsZSBkZSB2aWUgZCd1biBvYmpldCBzcGF0aWFsXHJcbiAqIDNEIMOgIGwnYWlkZSBkZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gZXQgZGUgbCdJRCBkJ29iamV0IGZvdXJuaXMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXIgbGEgZGVtYW5kZS5cclxuICogIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LihleDogY3JlZGVudGlhbHMuc3BhY2UsIGNyZWRlbnRpYWxzLnRlbmFudCwgY3JlZGVudGlhbHMudG9rZW4uLi4pLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTcGFjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRlbmFudCAtIGxlIHRlbmFudCBjb3VyYW50XHJcbiAqIEBleGFtcGxlIHt0ZW5hbnQ6XCJSMTEzMjEwMDk2ODQ0N1wifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudG9rZW4gLSBMZSBwYXJhbcOodHJlIHRva2VuIGVzdCBsZSBqZXRvbiBDU1JGLiAoaGVhZGVycyBleDogRU5PX0NTUkZfVE9LRU46dG9rZW4pXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5jdHggLSBMJ0lEIGR1IGNvbnRleHRlIGRlIHRyYXZhaWwuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBvYmplY3RJZCAtIExlIHBhcmFtw6h0cmUgb2JqZWN0SWQgZXN0IGwnaWRlbnRpZmlhbnQgZGUgbCdvYmpldCBwb3VyIGxlcXVlbCB2b3VzIHNvdWhhaXRlelxyXG4gKiByw6ljdXDDqXJlciBsZSBncmFwaGlxdWUuIElsIGVzdCB1dGlsaXPDqSBwb3VyIHNww6ljaWZpZXIgbCdvYmpldCBwb3VyIGxlcXVlbCB2b3VzIHNvdWhhaXRleiBvYnRlbmlyIGxlXHJcbiAqIGdyYXBoaXF1ZSBkZSB2ZXJzaW9uLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIFVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsYSByw6ljdXDDqXJhdGlvbiBkdSBncmFwaGlxdWUgc2VyYVxyXG4gKiByw6l1c3NpZS4gSWwgcHJlbmQgbGEgcsOpcG9uc2UgY29tbWUgYXJndW1lbnQuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYF8zRFNwYWNlX2xpZmVjeWNsZV9nZXRHcmFwaGAuIEMnZXN0IHVuIHBhcmFtw6h0cmVcclxuICogZmFjdWx0YXRpZiwgZG9uYyBzJ2lsIG4nZXN0IHBhcyBmb3VybmksIGxhIGZvbmN0aW9uIG5lIGZlcmEgcmllbiBlbiBjYXMgZCdlcnJldXIuXHJcbiAqIEByZXR1cm5zIHVuZSBwcm9tZXNzZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfM0RTcGFjZV9saWZlY3ljbGVfZ2V0R3JhcGgoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgb2JqZWN0SWQsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIC8vIEEgVkFMSURFUlxyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzdWx0KSA9PiB7XHJcbiAgICBpZiAoY3JlZGVudGlhbHMudG9rZW4gPT09IFwiXCIpIHtcclxuICAgICAgXzNEU3BhY2VfY3NyZihjcmVkZW50aWFscyk7XHJcbiAgICB9XHJcbiAgICBpZiAob2JqZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3RJZCAhPT0gXCJcIiAmJiBvYmplY3RJZCAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCB1cmwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vcmVzb3VyY2VzL3YxL2RzbGMvdmVyc2lvbmdyYXBoP3dpdGhUaHVtYm5haWw9MCZ3aXRoSXNMYXN0VmVyc2lvbj0wJndpdGhBdHRyaWJ1dGVzPTAmd2l0aENvcHlGcm9tPTAmdGVuYW50PSR7Y3JlZGVudGlhbHMudGVuYW50fWA7XHJcblxyXG4gICAgICBfM0RTcGFjZV9nZXRfc2VjdXJpdHlDb250ZXh0cyhcclxuICAgICAgICBjcmVkZW50aWFscy5zcGFjZSxcclxuICAgICAgICBcIkVTUEFDRSBDT01NVU5cIixcclxuICAgICAgICBbXCJWUExNUHJvamVjdExlYWRlclwiLCBcIlZQTE1DcmVhdG9yXCJdLFxyXG4gICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAoY3R4KSA9PiAoY3JlZGVudGlhbHNbXCJjdHhcIl0gPSBjdHgpLFxyXG4gICAgICAgIChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwib25FcnJvciA9PlwiLCBlcnIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICk7XHJcbiAgICAgIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgc2VjdXJpdHljb250ZXh0OiBcImN0eDo6XCIgKyBjcmVkZW50aWFscy5jdHgsXHJcbiAgICAgICAgICBFTk9fQ1NSRl9UT0tFTjogY3JlZGVudGlhbHMudG9rZW4sXHJcbiAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICBncmFwaFJlcXVlc3RzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBpZDogb2JqZWN0SWQsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHR5cGU6IFwianNvblwiLFxyXG4gICAgICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShyZXNwb25zZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkZhaWx1cmUocmVzcG9uc2UpIHtcclxuICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKHJlc3BvbnNlKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG4gICAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuLy8gUkVWSVNJT05cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgXzNEU3BhY2VfbGlmZWN5Y2xlX2dldE5leHRSZXZpc2lvbmAgcGVybWV0IGRlIHLDqWN1cMOpcmVyIGxhIHByb2NoYWluZSByw6l2aXNpb24gZCd1blxyXG4gKiBkb2N1bWVudCBkYW5zIHVuIGVzcGFjZSAzRC5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3BhY2UpIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy50ZW5hbnQgLSBsZSB0ZW5hbnQgY291cmFudFxyXG4gKiBAZXhhbXBsZSB7dGVuYW50OlwiUjExMzIxMDA5Njg0NDdcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRva2VuIC0gTGUgcGFyYW3DqHRyZSB0b2tlbiBlc3QgbGUgamV0b24gQ1NSRi4gKGhlYWRlcnMgZXg6IEVOT19DU1JGX1RPS0VOOnRva2VuKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuY3R4IC0gTCdJRCBkdSBjb250ZXh0ZSBkZSB0cmF2YWlsLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gb2JqZWN0SWQgLSBMZSBwYXJhbcOodHJlIGBvYmplY3RJZGAgZXN0IGwnaWRlbnRpZmlhbnQgdW5pcXVlIGRlIGwnb2JqZXQgcG91ciBsZXF1ZWwgdm91c1xyXG4gKiBzb3VoYWl0ZXogb2J0ZW5pciBsYSBwcm9jaGFpbmUgcsOpdmlzaW9uLiBJbCBlc3QgdXRpbGlzw6kgcG91ciBzcMOpY2lmaWVyIGwnb2JqZXQgcXVpIGRvaXQgw6p0cmUgcsOpdmlzw6kuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gVW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGwnb3DDqXJhdGlvbiBzZXJhIHRlcm1pbsOpZSBhdmVjXHJcbiAqIHN1Y2PDqHMuIElsIHByZW5kIGxhIHLDqXBvbnNlIGNvbW1lIGFyZ3VtZW50LlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBfM0RTcGFjZV9saWZlY3ljbGVfZ2V0TmV4dFJldmlzaW9uYC4gSWwgcydhZ2l0IGQndW5cclxuICogcGFyYW3DqHRyZSBmYWN1bHRhdGlmLCBkb25jIHMnaWwgbidlc3QgcGFzIGZvdXJuaSwgaWwgc2VyYSBwYXIgZMOpZmF1dCDCq25vbiBkw6lmaW5pwrsuXHJcbiAqIEByZXR1cm5zIFVuZSBwcm9tZXNzZSBlc3QgcmVudm95w6llLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFNwYWNlX2xpZmVjeWNsZV9nZXROZXh0UmV2aXNpb24oXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgb2JqZWN0SWQsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzdWx0KSA9PiB7XHJcbiAgICBpZiAoY3JlZGVudGlhbHMudG9rZW4gPT09IFwiXCIpIHtcclxuICAgICAgXzNEU3BhY2VfY3NyZihjcmVkZW50aWFscyk7XHJcbiAgICB9XHJcbiAgICBpZiAob2JqZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBvYmplY3RJZCAhPT0gXCJcIiAmJiBvYmplY3RJZCAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCB1cmwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vcmVzb3VyY2VzL2xpZmVjeWNsZS9yZXZpc2UvcHJlcGFyZV9yZXZpc2VfbWFza2F0dHJpYnV0ZXM/dGVuYW50PSR7Y3JlZGVudGlhbHMudGVuYW50fWA7XHJcblxyXG4gICAgICBfM0RTcGFjZV9nZXRfc2VjdXJpdHlDb250ZXh0cyhcclxuICAgICAgICBjcmVkZW50aWFscy5zcGFjZSxcclxuICAgICAgICBcIkVTUEFDRSBDT01NVU5cIixcclxuICAgICAgICBbXCJWUExNUHJvamVjdExlYWRlclwiLCBcIlZQTE1DcmVhdG9yXCJdLFxyXG4gICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAoY3R4KSA9PiAoY3JlZGVudGlhbHNbXCJjdHhcIl0gPSBjdHgpLFxyXG4gICAgICAgIChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwib25FcnJvciA9PlwiLCBlcnIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICk7XHJcbiAgICAgIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgU2VjdXJpdHlDb250ZXh0OiBcImN0eDo6XCIgKyBjcmVkZW50aWFscy5jdHgsXHJcbiAgICAgICAgICBFTk9fQ1NSRl9UT0tFTjogY3JlZGVudGlhbHMudG9rZW4sXHJcbiAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICBkYXRhOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBcImF0dHJpYnV0ZVtQTE1SZWZlcmVuY2UuVl92ZXJzaW9uQ29tbWVudF1cIjogbnVsbCxcclxuICAgICAgICAgICAgICBwaHlzaWNhbGlkOiBvYmplY3RJZCxcclxuICAgICAgICAgICAgICB0eXBlOiBcIkRvY3VtZW50XCIsXHJcbiAgICAgICAgICAgICAgdGVuYW50OiBjcmVkZW50aWFscy50ZW5hbnQsXHJcbiAgICAgICAgICAgICAgb2JqZWN0SWQsXHJcbiAgICAgICAgICAgICAgcG9saWN5OiBcIkRvY3VtZW50IFJlbGVhc2VcIixcclxuICAgICAgICAgICAgICBhdmFpbGFibGVTZW1hbnRpYzogW1wiRVwiLCBcIkxBU1RcIiwgXCJORVdcIiwgXCJEVVBcIl0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHR5cGU6IFwianNvblwiLFxyXG4gICAgICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShyZXNwb25zZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkZhaWx1cmUocmVzcG9uc2UpIHtcclxuICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKHJlc3BvbnNlKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG4gICAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwgb3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgXzNEU3BhY2VfbGlmZWN5Y2xlX2NoYW5nZVJldmlzaW9uYCBlc3QgdXRpbGlzw6llIHBvdXIgY2hhbmdlciBsYSByw6l2aXNpb24gZCd1biBvYmpldFxyXG4gKiBkYW5zIHVuIGVzcGFjZSAzRC5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3BhY2UpIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy50ZW5hbnQgLSBsZSB0ZW5hbnQgY291cmFudFxyXG4gKiBAZXhhbXBsZSB7dGVuYW50OlwiUjExMzIxMDA5Njg0NDdcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRva2VuIC0gTGUgcGFyYW3DqHRyZSB0b2tlbiBlc3QgbGUgamV0b24gQ1NSRi4gKGhlYWRlcnMgZXg6IEVOT19DU1JGX1RPS0VOOnRva2VuKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuY3R4IC0gTCdJRCBkdSBjb250ZXh0ZSBkZSB0cmF2YWlsLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gb2JqZWN0SWQgLSBMZSBwYXJhbcOodHJlIG9iamVjdElkIHJlcHLDqXNlbnRlIGwnaWRlbnRpZmlhbnQgdW5pcXVlIGRlIGwnb2JqZXQgZGFucyBsJ2VzcGFjZSAzRC5cclxuICogSWwgZXN0IHV0aWxpc8OpIHBvdXIgc3DDqWNpZmllciBxdWVsbGUgcsOpdmlzaW9uIGRlIGwnb2JqZXQgZG9pdCDDqnRyZSBtb2RpZmnDqWUuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHRSZXZpc2lvbiAtIExlIHBhcmFtw6h0cmUgYG5leHRSZXZpc2lvbmAgZXN0IGxlIG51bcOpcm8gZGUgcsOpdmlzaW9uIHF1aSBzZXJhIGF0dHJpYnXDqSDDoFxyXG4gKiBsJ29iamV0IGFwcsOocyBsZSBjaGFuZ2VtZW50IGRlIHLDqXZpc2lvbi5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBVbmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbCdvcMOpcmF0aW9uIHNlcmEgdGVybWluw6llIGF2ZWNcclxuICogc3VjY8Oocy4gSWwgcHJlbmQgbGEgcsOpcG9uc2UgY29tbWUgYXJndW1lbnQuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYF8zRFNwYWNlX2xpZmVjeWNsZV9jaGFuZ2VSZXZpc2lvbmAuIElsIHZvdXMgcGVybWV0IGRlXHJcbiAqIGfDqXJlciB0b3V0ZXMgbGVzIGVycmV1cnMgcXVpIHNlIHByb2R1aXNlbnQgZXQgZOKAmWVmZmVjdHVlciB0b3V0ZSBnZXN0aW9uIG91IGpvdXJuYWxpc2F0aW9uIGRlc1xyXG4gKiBlcnJldXJzIG7DqWNlc3NhaXJlLlxyXG4gKiBAcmV0dXJucyB1bmUgcHJvbWVzc2UuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gXzNEU3BhY2VfbGlmZWN5Y2xlX2NoYW5nZVJldmlzaW9uKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9iamVjdElkLFxyXG4gIG5leHRSZXZpc2lvbixcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXN1bHQpID0+IHtcclxuICAgIGlmIChjcmVkZW50aWFscy50b2tlbiA9PT0gXCJcIikge1xyXG4gICAgICBfM0RTcGFjZV9jc3JmKGNyZWRlbnRpYWxzKTtcclxuICAgIH1cclxuICAgIGlmIChvYmplY3RJZCAhPT0gdW5kZWZpbmVkICYmIG9iamVjdElkICE9PSBcIlwiICYmIG9iamVjdElkICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IHVybCA9IGAke2NyZWRlbnRpYWxzLnNwYWNlfS9yZXNvdXJjZXMvbGlmZWN5Y2xlL3JldmlzZS9tYWpvcj90ZW5hbnQ9JHtjcmVkZW50aWFscy50ZW5hbnR9YDtcclxuXHJcbiAgICAgIF8zRFNwYWNlX2dldF9zZWN1cml0eUNvbnRleHRzKFxyXG4gICAgICAgIGNyZWRlbnRpYWxzLnNwYWNlLFxyXG4gICAgICAgIFwiRVNQQUNFIENPTU1VTlwiLFxyXG4gICAgICAgIFtcIlZQTE1Qcm9qZWN0TGVhZGVyXCIsIFwiVlBMTUNyZWF0b3JcIl0sXHJcbiAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgIChjdHgpID0+IChjcmVkZW50aWFsc1tcImN0eFwiXSA9IGN0eCksXHJcbiAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJvbkVycm9yID0+XCIsIGVycik7XHJcbiAgICAgICAgfSxcclxuICAgICAgKTtcclxuICAgICAgbGV0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICBzZWN1cml0eWNvbnRleHQ6IFwiY3R4OjpcIiArIGNyZWRlbnRpYWxzLmN0eCxcclxuICAgICAgICAgIEVOT19DU1JGX1RPS0VOOiBjcmVkZW50aWFscy50b2tlbixcclxuICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgIGRhdGE6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHBoeXNpY2FsaWQ6IG9iamVjdElkLFxyXG4gICAgICAgICAgICAgIHByb3Bvc2VkUmV2aXNpb246IG5leHRSZXZpc2lvbixcclxuICAgICAgICAgICAgICBtb2RpZmllZEF0dHJpYnV0ZXM6IHtcclxuICAgICAgICAgICAgICAgIHJldmlzaW9uOiBuZXh0UmV2aXNpb24sXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICBmb2xkZXJpZDogbnVsbCxcclxuICAgICAgICAgIG5vdGlmaWNhdGlvblRpbWVvdXQ6IDYwMCxcclxuICAgICAgICB9KSxcclxuICAgICAgICB0eXBlOiBcImpzb25cIixcclxuICAgICAgICBvbkNvbXBsZXRlKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUocmVzcG9uc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgb25GYWlsdXJlKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihyZXNwb25zZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuICAgICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIG9wdGlvbnMpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcbi8vIFNFQ1RJT046IEJPT0tNQVJLU1xyXG4vLyBBTkNIT1I6IF8zZHNwYWNlX2Jvb2ttYXJrX2dldENoaWxkcmVuXHJcbi8vIFRPRE8gOiBBIGZpbmlyICwgbWFucXVlIGxhIEZOIF8zZHNwYWNlX2dldF9tdWx0aURvY0luZm8oKVxyXG4vLyBmdW5jdGlvbiBfM0RTcGFjZV9ib29rbWFya19nZXRDaGlsZHJlbihcclxuLy8gICBjcmVkZW50aWFscyxcclxuLy8gICBvYmpJZEJvb2ttYXJrLFxyXG4vLyAgIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuLy8gICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4vLyApIHtcclxuLy8gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4vLyAgICAgLy8gY29uc3Qgc3RvcmUgPSBtYWluU3RvcmUoKTtcclxuXHJcbi8vICAgICBjb25zdCB1cmwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vcmVzb3VyY2VzL3YxL21vZGVsZXIvZHNia3MvZHNia3M6Qm9va21hcmsvJHtvYmpJZEJvb2ttYXJrfT8kbWFzaz1kc2JrczpCa3NNYXNrLkl0ZW1zYDtcclxuLy8gICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbi8vICAgICAgIGhlYWRlcnM6IHtcclxuLy8gICAgICAgICBTZWN1cml0eUNvbnRleHQ6IGBjdHg6OiR7Y3JlZGVudGlhbHMuY3R4fWAsXHJcbi8vICAgICAgIH0sXHJcbi8vICAgICAgIG9uQ29tcGxldGU6IChyZXNwb25zZSkgPT4ge1xyXG4vLyAgICAgICAgIGxldCB0cnlQYXJzZTtcclxuLy8gICAgICAgICB0cnkge1xyXG4vLyAgICAgICAgICAgdHJ5UGFyc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxuLy8gICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4vLyAgICAgICAgICAgdHJ5UGFyc2UgPSByZXNwb25zZTtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgICAgaWYgKHR5cGVvZiB0cnlQYXJzZSA9PT0gXCJvYmplY3RcIikge1xyXG4vLyAgICAgICAgICAgbGV0IGl0ZW1zID0gdHJ5UGFyc2U/Lm1lbWJlclswXT8uaXRlbXM/Lm1lbWJlcjtcclxuLy8gICAgICAgICAgIGlmIChpdGVtcykge1xyXG4vLyAgICAgICAgICAgICBjb25zdCBsaXN0T2JqSWRzID0gaXRlbXMubWFwKChlKSA9PiB7XHJcbi8vICAgICAgICAgICAgICAgaWYgKGU/LnJlZmVyZW5jZWRPYmplY3Q/LmlkZW50aWZpZXIpIHtcclxuLy8gICAgICAgICAgICAgICAgIHJldHVybiBlLnJlZmVyZW5jZWRPYmplY3QuaWRlbnRpZmllcjtcclxuLy8gICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICAgICBpZiAobGlzdE9iaklkcy5sZW5ndGgpIHtcclxuLy8gICAgICAgICAgICAgICBfM0RTcGFjZV9nZXRfbXVsdGlEb2NJbmZvKGhvc3QsIGxpc3RPYmpJZHMsIChyZXMpID0+IHtcclxuLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiXzNkc3BhY2VfZ2V0X211bHRpRG9jSW5mbyBSZXNwb25zZSA6IFwiLCB7XHJcbi8vICAgICAgICAgICAgICAgICAgIC4uLnJlcyxcclxuLy8gICAgICAgICAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICAgICAgICAgaWYgKHJlcz8uZGF0YS5sZW5ndGgpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdFJlc3BvbnNlcyA9IHJlcy5kYXRhO1xyXG4vLyAgICAgICAgICAgICAgICAgICBsaXN0UmVzcG9uc2VzLmZvckVhY2goKHIpID0+IHtcclxuLy8gICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudE9iamVjdCA9IGl0ZW1zLmZpbmQoXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICAobykgPT4gby5yZWZlcmVuY2VkT2JqZWN0LmlkZW50aWZpZXIgPT09IHIuaWRlbnRpZmllcixcclxuLy8gICAgICAgICAgICAgICAgICAgICApO1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50T2JqZWN0KSB7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0LnJlZmVyZW5jZWRPYmplY3RbXCJkYXRhZWxlbWVudHNcIl0gPVxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICByLmRhdGFlbGVtZW50cztcclxuLy8gICAgICAgICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUodHJ5UGFyc2UpO1xyXG4vLyAgICAgICAgIHJlc29sdmUgPSB0cnlQYXJzZTtcclxuLy8gICAgICAgICByZXR1cm4gcmVzb2x2ZTtcclxuLy8gICAgICAgfSxcclxuLy8gICAgICAgb25GYWlsdXJlKHJlc3BvbnNlKSB7XHJcbi8vICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IocmVzcG9uc2UpO1xyXG4vLyAgICAgICAgIHJlamVjdCA9IHJlc3BvbnNlO1xyXG4vLyAgICAgICAgIHJldHVybiByZWplY3Q7XHJcbi8vICAgICAgIH0sXHJcbi8vICAgICB9KTtcclxuLy8gICB9KTtcclxuLy8gfVxyXG4vLyFTRUNUSU9OXHJcblxyXG4vLyBtb2R1bGUuZXhwb3J0cyA9IHtcclxuXHJcbi8vICAgXzNEU3BhY2VfYm9va21hcmtfZ2V0Q2hpbGRyZW4sXHJcbi8vIH07XHJcbiIsImltcG9ydCB7IF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQgfSBmcm9tIFwiLi8zZGV4cGVyaWVuY2VfYXBpXCI7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBnZXRDU1JGVG9rZW5gIGVzdCB1bmUgZm9uY3Rpb24gYXN5bmNocm9uZSBxdWkgcsOpY3Vww6hyZSB1biBqZXRvbiBDU1JGIMOgIHBhcnRpciBkJ3VuZSBVUkxcclxuICogc3DDqWNpZmnDqWUgZXQgYXBwZWxsZSBsZSByYXBwZWwgYG9uRG9uZWAgYXZlYyBsZSBqZXRvbiBlbiBjYXMgZGUgc3VjY8Oocywgb3UgbGUgcmFwcGVsIGBvbkVycm9yYCBhdmVjXHJcbiAqIHVuZSBlcnJldXIgZW4gY2FzIGQnw6ljaGVjLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3BhY2UpIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcbiAqXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRG9uZSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsZSBqZXRvblxyXG4gKiBDU1JGIHNlcmEgcsOpY3Vww6lyw6kgYXZlYyBzdWNjw6hzLiBJbCBmYXV0IHVuIGFyZ3VtZW50LCBxdWkgZXN0IGxhIHZhbGV1ciBkdSBqZXRvbiBDU1JGLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkVycm9yIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lIGVycmV1ciBsb3JzIGRlIGxhIHJlcXXDqnRlIEhUVFAuIElsIGVzdCBmYWN1bHRhdGlmIGV0IHBldXQgw6p0cmUgdXRpbGlzw6kgcG91ciBnw6lyZXIgbGVzIGVycmV1cnMgcXVpIHNlIHByb2R1aXNlbnQgbG9ycyBkZSBsYSBkZW1hbmRlLlxyXG4gKlxyXG4gKlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENTUkZUb2tlbihjcmVkZW50aWFscywgb25Eb25lLCBvbkVycm9yKSB7XHJcbiAgY29uc3QgdXJsID0gYCR7Y3JlZGVudGlhbHMuc3BhY2V9L3Jlc291cmNlcy92MS9hcHBsaWNhdGlvbi9DU1JGYDtcclxuICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG4gICAgICBpZiAob25Eb25lKSBvbkRvbmUocmVzcG9uc2UuY3NyZik7XHJcbiAgICB9LFxyXG4gICAgb25GYWlsdXJlKGVycm9yLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgY29uc3QgaW5mb3MgPSB7IGVycm9yLCBoZWFkZXJzLCB4aHIgfTtcclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoaW5mb3MpO1xyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG4iLCJpbXBvcnQgeyBfaHR0cENhbGxBdXRoZW50aWNhdGVkIH0gZnJvbSBcIi4vM2RleHBlcmllbmNlX2FwaVwiO1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgZ2V0QWxsQ29udGV4dFNlY3VyaXR5YCBlZmZlY3R1ZSB1bmUgcmVxdcOqdGUgSFRUUCBHRVQgYXV0aGVudGlmacOpZSBwb3VyIHLDqWN1cMOpcmVyIHRvdXRlc1xyXG4gKiBsZXMgcmVzc291cmNlcyBkZSBzw6ljdXJpdMOpIGR1IGNvbnRleHRlLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyIGxhIGRlbWFuZGUuXHJcbiAqICBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXUnaWNpIMKrIHNwYWNlIMK7IGV0IMKrIHRlbmFudCDCuy4oZXg6IGNyZWRlbnRpYWxzLnNwYWNlLCBjcmVkZW50aWFscy50ZW5hbnQpLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTcGFjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRlbmFudCAtIGxlIHRlbmFudCBjb3VyYW50XHJcbiAqIEBleGFtcGxlIHt0ZW5hbnQ6XCJSMTEzMjEwMDk2ODQ0N1wifVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIFVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsYSByZXF1w6p0ZSBIVFRQIHNlcmEgdGVybWluw6llIGF2ZWNcclxuICogc3VjY8Oocy4gSWwgcHJlbmQgZGV1eCBwYXJhbcOodHJlczogXCJyZXBcIiAobGEgcsOpcG9uc2UgSlNPTiBhbmFseXPDqWUpIGV0IFwiaGVhZGVyc1wiIChsZXMgZW4tdMOqdGVzIGRlXHJcbiAqIHLDqXBvbnNlKS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGxhIHJlcXXDqnRlIEhUVFAuIElsIGZhdXQgdHJvaXMgYXJndW1lbnRzIDogwqsgcsOpcG9uc2UgwrssIMKrIGVuLXTDqnRlcyDCuyBldCDCqyB4aHIgwrsuXHJcbiAqIEwnYXJndW1lbnQgYHJlc3BvbnNlYCBjb250aWVudCBsZSBjb3JwcyBkZSBsYSByw6lwb25zZSBkJ2VycmV1ciwgbCdhcmd1bWVudCBgaGVhZGVyc2AgY29udGllbnQgbGVzIGVuLXTDqnRlcyBkZSByw6lwb25zZSxcclxuICpcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxDb250ZXh0U2VjdXJpdHkoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IFVSTCA9IHtcclxuICAgIGJhc2U6IGAke2NyZWRlbnRpYWxzLnNwYWNlfWAsXHJcbiAgICB1cmk6IFwiL3Jlc291cmNlcy9icHMvY3NwYWNlc1wiLFxyXG4gICAgb3B0VGVuYW50OiBgdGVuYW50PSR7Y3JlZGVudGlhbHMudGVuYW50fWAsXHJcbiAgfTtcclxuXHJcbiAgY29uc3QgdXJsID0gYCR7VVJMLmJhc2V9JHtVUkwudXJpfT8ke1VSTC5vcHRUZW5hbnR9YDtcclxuXHJcbiAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb24sdGV4dC9qYXZhc2NyaXB0LCovKlwiLFxyXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2RzLWpzb25cIixcclxuICAgIH0sXHJcbiAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzKSB7XHJcbiAgICAgIGNvbnN0IHJlcCA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG5cclxuICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKHJlcCwgaGVhZGVycyk7XHJcbiAgICB9LFxyXG4gICAgb25GYWlsdXJlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoeyByZXNwb25zZSwgaGVhZGVycywgeGhyIH0pO1xyXG4gICAgfSxcclxuICB9KTtcclxufVxyXG4iLCJpbXBvcnQgeyBfaHR0cENhbGxBdXRoZW50aWNhdGVkIH0gZnJvbSBcIi4vM2RleHBlcmllbmNlX2FwaVwiO1xyXG5pbXBvcnQgeyBfM0RTcGFjZV9maWxlX3VybCB9IGZyb20gXCIuLzNkc3BhY2VfYXBpXCI7XHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYGdldERhdGFGcm9tM0RTcGFjZWAgcsOpY3Vww6hyZSBsZXMgZG9ubsOpZXMgZCd1biBlc3BhY2UgM0QgZW4gdXRpbGlzYW50IGxlcyBpbmZvcm1hdGlvbnNcclxuICogZCdpZGVudGlmaWNhdGlvbiBmb3VybmllcyBldCBsZXMgcHLDqWbDqXJlbmNlcyBkdSB3aWRnZXQsIGV0IGFwcGVsbGUgbGUgcmFwcGVsIGBvbkRvbmVgIGF2ZWMgbGFcclxuICogcsOpcG9uc2Ugb3UgbGUgcmFwcGVsIGBvbkVycm9yYCBhdmVjIHRvdXRlcyBsZXMgZXJyZXVycyByZW5jb250csOpZXMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuyBldCDCqyBzcGFjZSDCuy4oZXg6IGNyZWRlbnRpYWxzLnRva2VuLCBjcmVkZW50aWFscy5zcGFjZSwgY3JlZGVudGlhbHMudGVuYW50LCBjcmVkZW50aWFscy5jdHgpXHJcbiAqIEBwcm9wZXJ0eSBzcGFjZSAtIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcHJvcGVydHkgdG9rZW4gLSBMZSBwYXJhbcOodHJlIHRva2VuIGVzdCBsZSBqZXRvbiBDU1JGLiAoaGVhZGVycyBleDogRU5PX0NTUkZfVE9LRU46dG9rZW4pXHJcbiAqXHJcbiAqIEBwYXJhbSB3aWRnZXRQcmVmZXJlbmNlIC0gTGUgcGFyYW3DqHRyZSBgd2lkZ2V0UHJlZmVyZW5jZWAgZXN0IHVuIG9iamV0IHF1aSBjb250aWVudCBsZXMgcHLDqWbDqXJlbmNlc1xyXG4gKiBkdSB3aWRnZXQuIElsIHBldXQgaW5jbHVyZSBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgbGEgdGFpbGxlLCBsYSBjb3VsZXVyLCBsYSBwb3NpdGlvbiBkdSB3aWRnZXQgb3VcclxuICogdG91dGUgYXV0cmUgcGVyc29ubmFsaXNhdGlvbiBzcMOpY2lmaXF1ZSBhdSB3aWRnZXQuXHJcbiAqIEBwYXJhbSBvbkRvbmUgLSBVbmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbGEgcsOpY3Vww6lyYXRpb24gZGVzIGRvbm7DqWVzIHNlcmFcclxuICogcsOpdXNzaWUuIElsIHByZW5kIGxhIHLDqXBvbnNlIGNvbW1lIHBhcmFtw6h0cmUuXHJcbiAqIEBwYXJhbSBvbkVycm9yIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgZ2V0RGF0YUZyb20zRFNwYWNlYC4gSWwgZXN0IHV0aWxpc8OpIHBvdXIgZ8OpcmVyIGV0IHRyYWl0ZXJcclxuICogbGVzIGVycmV1cnMgcXVpIHN1cnZpZW5uZW50LlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFGcm9tM0RTcGFjZShcclxuICBjcmVkZW50aWFscyxcclxuICB3aWRnZXRQcmVmZXJlbmNlLFxyXG4gIG9uRG9uZSxcclxuICBvbkVycm9yLFxyXG4pIHtcclxuICBfM0RTcGFjZV9maWxlX3VybChcclxuICAgIGNyZWRlbnRpYWxzLnNwYWNlLFxyXG4gICAgd2lkZ2V0UHJlZmVyZW5jZSxcclxuICAgIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHJlc3BvbnNlLCB7XHJcbiAgICAgICAgaGVhZGVyOiB7IEVOT19DU1JGX1RPS0VOOiBjcmVkZW50aWFscy50b2tlbiB9LFxyXG4gICAgICAgIG9uQ29tcGxldGU6IChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKHJlc3BvbnNlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uRmFpbHVyZTogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIGh0dHBcIiwgZXJyb3IpO1xyXG4gICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhcImVycm9yIGZpbGUgVVJMXCIsIGVycm9yKTtcclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyb3IpO1xyXG4gICAgfSxcclxuICApO1xyXG59XHJcbiIsImltcG9ydCB7IF8zRFNwYWNlX2ZpbGVfdXJsIH0gZnJvbSBcIi4vM2RzcGFjZV9hcGlcIjtcclxuaW1wb3J0IHsgX2h0dHBDYWxsQXV0aGVudGljYXRlZCB9IGZyb20gXCIuLzNkZXhwZXJpZW5jZV9hcGlcIjtcclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgZ2V0RG93bmxvYWREb2N1bWVudGAgZXN0IHVuZSBmb25jdGlvbiBhc3luY2hyb25lIHF1aSByw6ljdXDDqHJlIHVuIGRvY3VtZW50IMOgIHTDqWzDqWNoYXJnZXJcclxuICogw6AgcGFydGlyIGQndW4gZXNwYWNlIGV0IGQndW4gSUQgZGUgZG9jdW1lbnQgc3DDqWNpZmnDqXMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtTdHJpbmd9IGRvY0lkIC0gTCdJRCBkdSBkb2N1bWVudCBkdSBmaWNoaWVyIHF1ZSB2b3VzIHNvdWhhaXRleiB0w6lsw6ljaGFyZ2VyLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgdW5lIGZvaXMgbGVcclxuICogdMOpbMOpY2hhcmdlbWVudCB0ZXJtaW7DqSBldCByw6l1c3NpLiBMZXMgZG9ubsOpZXMgZGUgcsOpcG9uc2Ugc2Vyb250IHRyYW5zbWlzZXMgY29tbWUgYXJndW1lbnQuIElsIHByZW5kIHRyb2lzIGFyZ3VtZW50cyA6IMKrIHJlcG9uc2UgwrssIMKrIGhlYWRlcnMgwrsgZXQgwqsgeGhyIMK7LlxyXG4gKlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIHBlbmRhbnQgbGUgcHJvY2Vzc3VzIGRlIHTDqWzDqWNoYXJnZW1lbnQuIElsIHByZW5kIHRyb2lzIGFyZ3VtZW50cyA6IMKrIGVycm9yIMK7LCDCqyBoZWFkZXJzIMK7IGV0IMKrIHhociDCuy5cclxuICpcclxuICogQHJldHVybnMgdW4gb2JqZXQgUHJvbWVzc2UuXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RG93bmxvYWREb2N1bWVudChcclxuICBjcmVkZW50aWFscyxcclxuICBkb2NJZCxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXN1bHQpID0+IHtcclxuICAgIC8vVE9ETyAtIGEgdGVzdCA/IG1hbnF1ZSBsJ1VSTFxyXG4gICAgXzNEU3BhY2VfZmlsZV91cmwoY3JlZGVudGlhbHMuc3BhY2UsIGRvY0lkLCAocmVwb25zZSkgPT4ge1xyXG4gICAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHJlcG9uc2UsIHtcclxuICAgICAgICBvbkNvbXBsZXRlOiAocmVwb25zZSwgaGVhZGVycywgeGhyKSA9PiB7XHJcbiAgICAgICAgICByZXN1bHQoSlNPTi5wYXJzZShyZXBvbnNlKSk7XHJcbiAgICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUoSlNPTi5wYXJzZShyZXBvbnNlKSwgaGVhZGVycywgeGhyKTtcclxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkZhaWx1cmU6IChlcnJvciwgaGVhZGVycywgeGhyKSA9PiB7XHJcbiAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihlcnJvciwgaGVhZGVycywgeGhyKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yLCBoZWFkZXJzPy5lcnJvcm1zZyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG4iLCJpbXBvcnQgeyBfM0RTcGFjZV9nZXRfY3NyZiwgXzNEU3BhY2VfZmlsZV91cGRhdGUgfSBmcm9tIFwiLi8zZHNwYWNlX2FwaVwiO1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiDCqyBwdXNoRGF0YUluM0RTcGFjZSDCuyBlc3QgdXRpbGlzw6llIHBvdXIgcG91c3NlciBsZXMgZG9ubsOpZXMgZGFucyBsZSAzRFNwYWNlIMOgIGwnYWlkZVxyXG4gKiBkZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gZXQgZGUgbCdJRCBkJ29iamV0IGZvdXJuaXMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gbsOpY2Vzc2FpcmVzIMOgXHJcbiAqIGwnYXV0aGVudGlmaWNhdGlvbiBkYW5zIHVuZSBmb25jdGlvbiBpbnRlcm5lKF8zRFNwYWNlX2dldF9kb3dubG9hZFRpY2tldF9tdWx0aWRvYykuIElsIGRvaXQgYXZvaXIgbGVzIHByb3ByacOpdMOpcyBzdWl2YW50ZXM6IHNwYWNlLCB0b2tlbiwgdGVuYW50XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbY3JlZGVudGlhbHMuc3BhY2VdIC0gTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA6KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSkgLCAzRFN3eW0sIDNEQ29tcGFzcy4uLilcclxuIFxyXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YUJhc2UgLSBMZSBwYXJhbcOodHJlIGBkYXRhQmFzZWAgZXN0IHVuIG9iamV0IHF1aSBjb250aWVudCBsZXMgZG9ubsOpZXMgcXVlIHZvdXMgc291aGFpdGV6XHJcbiAqIHRyYW5zZsOpcmVyIGRhbnMgbCdlc3BhY2UgM0QuIElsIHNlcmEgY29udmVydGkgYXUgZm9ybWF0IEpTT04gZXQgZW5yZWdpc3Ryw6kgc291cyBmb3JtZSBkZSBmaWNoaWVyXHJcbiAqIGRhbnMgbCdlc3BhY2UgM0QuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBvYmplY3RJZCAtIExlIHBhcmFtw6h0cmUgb2JqZWN0SWQgZXN0IGwnaWRlbnRpZmlhbnQgdW5pcXVlIGRlIGwnb2JqZXQgZGFucyBsJ2VzcGFjZSAzRCBvw7kgbGVzXHJcbiAqIGRvbm7DqWVzIHNlcm9udCBwb3Vzc8OpZXMuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBvbkRvbmUgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsZXNcclxuICogZG9ubsOpZXMgc2Vyb250IGNvcnJlY3RlbWVudCBwb3Vzc8OpZXMgdmVycyBsJ2VzcGFjZSAzRC4gSWwgZmF1dCB1biBhcmd1bWVudCwgcXVpIGVzdCBsZSByw6lzdWx0YXQgZGVcclxuICogbCdvcMOpcmF0aW9uLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzaSB1bmUgZXJyZXVyXHJcbiAqIHN1cnZpZW50IGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBwdXNoRGF0YUluM0RTcGFjZWAuIElsIHZvdXMgcGVybWV0IGRlIGfDqXJlciBldCBkZVxyXG4gKiByw6lwb25kcmUgw6AgdG91dGUgZXJyZXVyIHBvdXZhbnQgc3VydmVuaXIuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHVzaERhdGFJbjNEU3BhY2UoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgZGF0YUJhc2UsXHJcbiAgb2JqZWN0SWQsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IGpzb25GaWxlID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KGRhdGFCYXNlKV0sIHsgdHlwZTogXCJ0ZXh0L3BsYWluXCIgfSk7XHJcblxyXG4gIF8zRFNwYWNlX2dldF9jc3JmKFxyXG4gICAgY3JlZGVudGlhbHMsXHJcbiAgICBvYmplY3RJZCxcclxuICAgIChkYXRhKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpbGVJZCA9IGRhdGEuZGF0YVswXS5yZWxhdGVkZGF0YS5maWxlc1swXS5pZDtcclxuICAgICAgY29uc3QgZmlsZU5hbWUgPVxyXG4gICAgICAgIGRhdGEuZGF0YVswXS5kYXRhZWxlbWVudHMuc2Vjb25kYXJ5VGl0bGUgIT09IFwiXCJcclxuICAgICAgICAgID8gZGF0YS5kYXRhWzBdLmRhdGFlbGVtZW50cy5zZWNvbmRhcnlUaXRsZVxyXG4gICAgICAgICAgOiBkYXRhLmRhdGFbMF0uZGF0YWVsZW1lbnRzLnRpdGxlO1xyXG5cclxuICAgICAgXzNEU3BhY2VfZmlsZV91cGRhdGUoXHJcbiAgICAgICAgY3JlZGVudGlhbHMsXHJcbiAgICAgICAgb2JqZWN0SWQsXHJcbiAgICAgICAgZmlsZUlkLFxyXG4gICAgICAgIGpzb25GaWxlLFxyXG4gICAgICAgIGZpbGVOYW1lLFxyXG4gICAgICAgIChyZXN1bHQpID0+IHtcclxuICAgICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShyZXN1bHQpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyKTtcclxuICAgICAgICB9LFxyXG4gICAgICApO1xyXG4gICAgfSxcclxuICAgIChlcnJvcikgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkVuIGNhcyBkJ2VycmV1ciBub3VzIGF2b25zIDpcIiwgZXJyb3IpO1xyXG4gICAgICBhbGVydChcIkVycmV1ciBsb3JzIGRlIGxhIHNhdXZlZ2FyZGUsIFZldWlsbGV6IHLDqWVzc2F5ZXpcIik7XHJcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGVycm9yKTtcclxuICAgIH0sXHJcbiAgKTtcclxufVxyXG4iLCJpbXBvcnQge1xyXG4gIF8zRFNwYWNlX2Rvd25sb2FkX2RvYyxcclxuICBfM0RTcGFjZV9kb3dubG9hZF9tdWx0aWRvYyxcclxuICBfM0RTcGFjZV9nZXRfY3NyZixcclxuICBfM0RTcGFjZV9jc3JmLFxyXG59IGZyb20gXCIuLzNkc3BhY2VfYXBpXCI7XHJcblxyXG5sZXQgbGlzdE9iamVjdElkLCBkYXRhcztcclxuXHJcbmNvbnN0IG1peGVkRGF0YXMgPSBbXTtcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYGdldF8zRFNwYWNlX2NzcmZgIHLDqWN1cMOocmUgdW4gamV0b24gQ1NSRiBkdSAzRFNwYWNlIGVuIHV0aWxpc2FudCBsZXMgIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIGZvdXJuaWVzLihBbmNpZW5uZW1lbnQgbG9hZERhdGFzKCkpXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1J2ljaScgwqsgb2JqSUQgwrssIMKrIHNwYWNlIMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTcGFjZSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLm9iaklEIC0gTGUgcGFyYW3DqHRyZSBvYmpJRCBjb3JyZXNwb25kIMOgIHVuIG9iamVjdCBJRCBjb250YW50IGxlcyBvYmpldHMgSWQgZGVzIGJhc2VzIGRlIGRvbm7DqWVzKShzZSBiYXNlIHN1ciB1biB0ZW5hbnQpLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsZSBqZXRvblxyXG4gKiBDU1JGIHNlcmEgcsOpY3Vww6lyw6kgYXZlYyBzdWNjw6hzLiBJbCBmYXV0IHVuIGFyZ3VtZW50LCBxdWkgZXN0IGxhIHZhbGV1ciBkdSBqZXRvbiBDU1JGLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzaSB1bmUgZXJyZXVyXHJcbiAqIHN1cnZpZW50IGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBnZXRfM0RTcGFjZV9jc3JmYC4gQydlc3QgdW4gcGFyYW3DqHRyZSBmYWN1bHRhdGlmLCBkb25jXHJcbiAqIHMnaWwgbidlc3QgcGFzIGZvdXJuaSwgbGEgZm9uY3Rpb24gbmUgZmVyYSByaWVuIGVuIGNhcyBkJ2VycmV1ci5cclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRfM0RTcGFjZV9jc3JmKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBpZiAoY3JlZGVudGlhbHMub2JqSUQgJiYgY3JlZGVudGlhbHMub2JqSUQgIT09IFwiXCIpIHtcclxuICAgIF8zRFNwYWNlX2dldF9jc3JmKFxyXG4gICAgICBjcmVkZW50aWFscyxcclxuXHJcbiAgICAgIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShyZXNwb25zZSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnIpID0+IHtcclxuICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihlcnIpO1xyXG4gICAgICB9LFxyXG4gICAgKTtcclxuICB9IGVsc2UgaWYgKGNyZWRlbnRpYWxzLm9iaklEID09PSBudWxsKSB7XHJcbiAgICBfM0RTcGFjZV9jc3JmKFxyXG4gICAgICBjcmVkZW50aWFscyxcclxuICAgICAgKHJlcCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1zZyA9IFwiUGFzIGQnb2JqSUQsIG91IGludmFsaWRlXCI7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IHsgcmVwLCBtc2cgfTtcclxuICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUoaW5mbyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnIpID0+IHtcclxuICAgICAgICBjb25zdCBtc2cgPSBcIlBhcyBkJ29iaklEIGV0IGVycmV1ciBzdXIgbGUgU3BhY2VcIjtcclxuICAgICAgICBjb25zdCBpbmZvcyA9IHsgbXNnLCBlcnIgfTtcclxuICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvcyk7XHJcbiAgICAgIH0sXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgZ2V0RGF0YXNCeVRlbmFudGAgZXN0IHVuZSBmb25jdGlvbiBhc3luY2hyb25lIHF1aSB0w6lsw6ljaGFyZ2UgZGVzIGRvY3VtZW50cyDDoCBwYXJ0aXIgZCd1biBlc3BhY2UgM0Qgw6AgbCdhaWRlIGRlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBmb3VybmllcyBldCBhcHBlbGxlIGxlIHJhcHBlbCBgb25Eb25lYFxyXG4gKiBhdmVjIGxlcyBkb25uw6llcyB0w6lsw6ljaGFyZ8OpZXMgb3UgbGUgcmFwcGVsIGBvbkVycm9yYCBhdmVjIHVuZSBlcnJldXIgbGUgY2FzIMOpY2jDqWFudC4gKGFuY2llbm5lbWVudCBnZXREb2N1bWVudHMoKSlcclxuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1J2ljaSDCqyB0b2tlbiDCuyBldCDCqyBzcGFjZSDCuy4oZXg6IGNyZWRlbnRpYWxzLnNwYWNlLCBjcmVkZW50aWFscy50ZW5hbnQsIGNyZWRlbnRpYWxzLnRva2VuLi4uKS5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3BhY2UpIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oM0RTcGFjZSwgM0RTd3ltLCAzRENvbXBhc3MsLi4uZXRjKVxyXG4gKiBAZXhhbXBsZSBwb3VyIGxlIDNEU3BhY2Uge3NwYWNlOlwiaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhXCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy50ZW5hbnQgLSBsZSB0ZW5hbnQgY291cmFudCBcclxuICogQGV4YW1wbGUge3RlbmFudDpcIlIxMTMyMTAwOTY4NDQ3XCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy50b2tlbiAtIExlIHBhcmFtw6h0cmUgdG9rZW4gZXN0IGxlIGpldG9uIENTUkYuIChoZWFkZXJzIGV4OiBFTk9fQ1NSRl9UT0tFTjp0b2tlbilcclxuICogQHBhcmFtIHtBcnJheU9mT2JqZWN0fSBjcmVkZW50aWFscy5vYmpJZHMgLSBUYWJsZWF1IGQnb2JqZXRzIGRlcyBvYmpldHMgSWQgZGVzIGJhc2VzIGRlIGRvbm7DqWVzIGV0IGxldXIgbm9tLihleDogY3JlZGVudGlhbHMub2JqSWRzPVt7b2JqSWQ6XCJ4eHhcIixuYW1lOlwieHh4XCJ9LHtvYmpJZDpcInh4eFwiLG5hbWU6XCJ4eHhcIn1dICkgKG5hbWUgZGlzcG9uaWJsZSBkYW5zIGxlIG1vZHVsZSA6IFxyXG4gKiAtIGRiQ2xpZW50cywgXHJcbiAqIC0gZGJDYXRhbG9ncywgXHJcbiAqIC0gZGJQcm9qZXRzIClcclxuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBvbkRvbmUgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsZXNcclxuICogZG9ubsOpZXMgc2Vyb250IHTDqWzDqWNoYXJnw6llcyBhdmVjIHN1Y2PDqHMuIElsIGZhdXQgdW4gYXJndW1lbnQsIHF1aSBjb3JyZXNwb25kIGF1eCBkb25uw6llc1xyXG4gKiB0w6lsw6ljaGFyZ8OpZXMuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHNpIHVuZSBlcnJldXJcclxuICogc3VydmllbnQgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYF8zRFNwYWNlX2Rvd25sb2FkX2RvY2AuIElsIHZvdXMgcGVybWV0IGRlIGfDqXJlciBldCBkZVxyXG4gKiByw6lwb25kcmUgw6AgdG91dGUgZXJyZXVyIHBvdXZhbnQgc3VydmVuaXIuXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGF0YXNCeVRlbmFudChcclxuICBjcmVkZW50aWFscyxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc29sZS5sb2coXCJnZXREYXRhc0J5VGVuYW50XCIsIGNyZWRlbnRpYWxzKTtcclxuICBhd2FpdCBfM0RTcGFjZV9kb3dubG9hZF9kb2MoXHJcbiAgICBjcmVkZW50aWFscyxcclxuICAgIChkYXRhKSA9PiB7XHJcbiAgICAgIGNvbnN0IF9kYXRhcyA9IHt9O1xyXG4gICAgICBfZGF0YXNbXCJvYmpcIl0gPSBkYXRhO1xyXG4gICAgICBnZXREYXRhc0Zyb20zRFNwYWNlKFxyXG4gICAgICAgIGNyZWRlbnRpYWxzLFxyXG4gICAgICAgIChyZXBvbnNlKSA9PiB7XHJcbiAgICAgICAgICBfZGF0YXNbXCJkYXRhc1wiXSA9IHJlcG9uc2U7XHJcbiAgICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUoX2RhdGFzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnIpID0+IHtcclxuICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGVycik7XHJcbiAgICAgICAgfSxcclxuICAgICAgKTtcclxuICAgIH0sXHJcbiAgICAoZXJyKSA9PiB7XHJcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGVycik7XHJcbiAgICB9LFxyXG4gICk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYGdldERhdGFzRnJvbTNEU3BhY2VgIHLDqWN1cMOocmUgbGVzIGRvbm7DqWVzIGQndW4gZXNwYWNlIDNEIGVuIHV0aWxpc2FudCBsZXMgaW5mb3JtYXRpb25zXHJcbiAqIGQnaWRlbnRpZmljYXRpb24gZm91cm5pZXMgZXQgYXBwZWxsZSBsZSByYXBwZWwgYG9uRG9uZWAgYXZlYyBsZXMgZG9ubsOpZXMgcsOpY3Vww6lyw6llcyBvdSBsZSByYXBwZWxcclxuICogYG9uRXJyb3JgIGF2ZWMgdW5lIGVycmV1ciBsZSBjYXMgw6ljaMOpYW50LlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdSdpY2kgwqsgdG9rZW4gwrsgZXQgwqsgc3BhY2UgwrsuKGV4OiBjcmVkZW50aWFscy5zcGFjZSwgY3JlZGVudGlhbHMudGVuYW50LCBjcmVkZW50aWFscy50b2tlbi4uLikuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFNwYWNlKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudGVuYW50IC0gbGUgdGVuYW50IGNvdXJhbnRcclxuICogQGV4YW1wbGUge3RlbmFudDpcIlIxMTMyMTAwOTY4NDQ3XCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy50b2tlbiAtIExlIHBhcmFtw6h0cmUgdG9rZW4gZXN0IGxlIGpldG9uIENTUkYuIChoZWFkZXJzIGV4OiBFTk9fQ1NSRl9UT0tFTjp0b2tlbilcclxuICogQHBhcmFtIHtBcnJheU9mT2JqZWN0fSBjcmVkZW50aWFscy5vYmpJZHMgLSBUYWJsZWF1IGQnb2JqZXRzIGRlcyBvYmpldHMgSWQgZGVzIGJhc2VzIGRlIGRvbm7DqWVzIGV0IGxldXIgbm9tLihleDogY3JlZGVudGlhbHMub2JqSWRzPVt7b2JqSWQ6XCJ4eHhcIixuYW1lOlwieHh4XCJ9LHtvYmpJZDpcInh4eFwiLG5hbWU6XCJ4eHhcIn1dICkgKG5hbWUgZGlzcG9uaWJsZSBkYW5zIGxlIG1vZHVsZSA6XHJcbiAqIC0gZGJDbGllbnRzLFxyXG4gKiAtIGRiQ2F0YWxvZ3MsXHJcbiAqIC0gZGJQcm9qZXRzIClcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgdG91dGVzXHJcbiAqIGxlcyBkb25uw6llcyBhdXJvbnQgw6l0w6kgdMOpbMOpY2hhcmfDqWVzIGF2ZWMgc3VjY8OocyBkZXB1aXMgbCdlc3BhY2UgM0QuIElsIGZhdXQgdW4gYXJndW1lbnQsIHF1aSBlc3QgdW5cclxuICogdGFibGVhdSBk4oCZb2JqZXRzLiBDaGFxdWUgb2JqZXQgZHUgdGFibGVhdSByZXByw6lzZW50ZSB1biBkb2N1bWVudCB0w6lsw6ljaGFyZ8OpIGV0IHBvc3PDqGRlIGRldXhcclxuICogcHJvcHJpw6l0w6lzOiBsZSBub20gZHUgZG9jdW1lbnRcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNEU3BhY2VfZG93bmxvYWRfZG9jYC4gSWwgdm91cyBwZXJtZXQgZGUgZ8OpcmVyIGV0IGRlXHJcbiAqIHLDqXBvbmRyZSDDoCB0b3V0ZSBlcnJldXIgcXVpIHNlIHByb2R1aXQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YXNGcm9tM0RTcGFjZShcclxuICBjcmVkZW50aWFscyxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgYmJkcyA9IFtdO1xyXG4gIGNyZWRlbnRpYWxzLm9iaklkcy5mb3JFYWNoKChvYmosIGkpID0+IHtcclxuICAgIF8zRFNwYWNlX2Rvd25sb2FkX2RvYyhcclxuICAgICAgY3JlZGVudGlhbHMsXHJcbiAgICAgIG9iai5vYmpJZCxcclxuICAgICAgKGRhdGEpID0+IHtcclxuICAgICAgICBiYmRzLnB1c2goeyBbb2JqLm5hbWVdOiBkYXRhIH0pO1xyXG4gICAgICAgIGlmIChvYmoubmFtZSA9PT0gXCJkYlByb2pldHNcIikge1xyXG4gICAgICAgICAgbGlzdE9iamVjdElkID0gZGF0YS5hZmZhaXJlcy5tYXAoKGFmZikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYWZmLm9iamVjdElEO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBkYXRhTWl4aW5nKGNyZWRlbnRpYWxzLCBkYXRhcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpID09PSBjcmVkZW50aWFscy5vYmpJZHMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKGJiZHMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGVycik7XHJcbiAgICAgIH0sXHJcbiAgICApO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBkYXRhTWl4aW5nYCBwcmVuZCBlbiBjb21wdGUgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uLCBsZXMgZG9ubsOpZXMgZXQgbGVzXHJcbiAqIHJhcHBlbHMgZmFjdWx0YXRpZnMsIHTDqWzDqWNoYXJnZSBsZXMgZG9ubsOpZXMgw6AgcGFydGlyIGQndW4gZXNwYWNlIDNELCBsZXMgbcOpbGFuZ2UgYXZlYyBsZXMgZG9ubsOpZXNcclxuICogZCdlbnRyw6llIGV0IHJlbnZvaWUgbGVzIGRvbm7DqWVzIG3DqWxhbmfDqWVzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdSdpY2kgwqsgdG9rZW4gwrsgZXQgwqsgc3BhY2UgwrsuKGV4OiBjcmVkZW50aWFscy5zcGFjZSwgY3JlZGVudGlhbHMudGVuYW50LCBjcmVkZW50aWFscy50b2tlbi4uLikuXHJcbkBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFNwYWNlKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudGVuYW50IC0gbGUgdGVuYW50IGNvdXJhbnQgXHJcbiAqIEBleGFtcGxlIHt0ZW5hbnQ6XCJSMTEzMjEwMDk2ODQ0N1wifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudG9rZW4gLSBMZSBwYXJhbcOodHJlIHRva2VuIGVzdCBsZSBqZXRvbiBDU1JGLiAoaGVhZGVycyBleDogRU5PX0NTUkZfVE9LRU46dG9rZW4pXHJcbiAqIEBwYXJhbSBfZGF0YXMgLSBMZSBwYXJhbcOodHJlIGBfZGF0YXNgIGVzdCB1biB0YWJsZWF1IGQnb2JqZXRzIElEIGQnQWZmYWlyZXNcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbGVcclxuICogcHJvY2Vzc3VzIGRlIG3DqWxhbmdlIGRlcyBkb25uw6llcyBzZXJhIHRlcm1pbsOpIGF2ZWMgc3VjY8Oocy4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIGBtaXhlZERhdGFzYCwgcXVpXHJcbiAqIGVzdCB1biB0YWJsZWF1IGNvbnRlbmFudCBsZXMgZG9ubsOpZXMgbWl4dGVzLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBlbiBjYXNcclxuICogZCdlcnJldXIgbG9ycyBkdSBwcm9jZXNzdXMgZGUgbcOpbGFuZ2UgZGVzIGRvbm7DqWVzLiBJbCBmYXV0IHVuIGFyZ3VtZW50LCBxdWkgZXN0IGwnb2JqZXQgZCdlcnJldXIuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGF0YU1peGluZyhcclxuICBjcmVkZW50aWFscyxcclxuICBfZGF0YXMsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIF8zRFNwYWNlX2Rvd25sb2FkX211bHRpZG9jKFxyXG4gICAgY3JlZGVudGlhbHMsXHJcbiAgICBsaXN0T2JqZWN0SWQsXHJcbiAgICAocmVzdWx0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvcHlEYXRhID0gWy4uLl9kYXRhc107XHJcbiAgICAgIGNvcHlEYXRhLmZpbmQoKGUpID0+IGUub2JqZWN0SUQgPT09IHJlc3VsdC5vYmplY3RJZClbXCJkYXRhXCJdID1cclxuICAgICAgICByZXN1bHQuZGF0YTtcclxuICAgICAgZGF0YXMgPSBjb3B5RGF0YTtcclxuXHJcbiAgICAgIG1peGVkRGF0YXMucHVzaChyZXN1bHQuZGF0YSk7XHJcbiAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShtaXhlZERhdGFzKTtcclxuICAgIH0sXHJcbiAgICAoZXJyKSA9PiB7XHJcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGVyciksIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICB9LFxyXG4gICk7XHJcbn1cclxuIiwiaW1wb3J0IHsgX2h0dHBDYWxsQXV0aGVudGljYXRlZCB9IGZyb20gXCIuLi9tYWluLzNkZXhwZXJpZW5jZV9hcGlcIjtcclxuaW1wb3J0IHsgXzNEU3BhY2VfZ2V0X2RvY0luZm8gfSBmcm9tIFwiLi4vbWFpbi8zZHNwYWNlX2FwaVwiO1xyXG5pbXBvcnQgeyBVVUlEIH0gZnJvbSBcIi4uLy4uL2FwaS9pbmRleFwiO1xyXG5cclxuLy8gTElOSyAtIGh0dHBzOi8vbWVkaWEuM2RzLmNvbS9zdXBwb3J0L2RvY3VtZW50YXRpb24vZGV2ZWxvcGVyL0Nsb3VkL2VuL0VuZ2xpc2gvQ0FBM0RTcGFjZVJFU1QvQ0FBNldSZXN0U2VydmljZVByaW5jaXBsZXMuaHRtXHJcbi8vIERvYyBkZSB0ZXN0IHN1ciB0ZW5hbnQgQkVBTTMgUFJPRFxyXG5jb25zdCBvYmpJRFRFU1QgPSBcIkI3MEMxMkNEQUUwNDE1MDA2NTc5QTkzMjAwMDYxQTE0XCI7XHJcbi8vIERvYyBkZSB0ZXN0IHN1ciB0ZW5hbnQgUGl2ZXRhdSBURVNUXHJcbmNvbnN0IG9iaklEVEVTVDIgPSBcIkZBMzVGQjlCMTc3QTI4MDA2NTgwMTkwNDAwMTkzQzIwXCI7XHJcbmNvbnN0IG9iaklEVEVTVDMgPSBcIkZBMzVGQjlCMTc3QTI4MDA2NTgwMEVBMDAwMEY1OTlDXCI7XHJcblxyXG5jb25zdCBzb3VyY2VzU2VhcmNoaW5nID0gW1xyXG4gIFwic3d5bVwiLFxyXG4gIFwiM2RzcGFjZVwiLFxyXG4gIFwiZHJpdmVcIixcclxuICBcInVzZXJzZ3JvdXBcIixcclxuICBcIjNkcGxhblwiLFxyXG4gIFwiZGFzaGJvYXJkXCIsXHJcbl07XHJcblxyXG5jb25zdCBsaXN0UHJlZGljYXRlcyA9IHtcclxuICBob3c6IFwiZHM2dzpob3dcIixcclxuICB3aGF0OiBcImRzNnc6d2hhdFwiLFxyXG4gIHdoZW46IFwiZHM2dzp3aGVuXCIsXHJcbiAgd2hlcmU6IFwiZHM2dzp3aGVyZVwiLFxyXG4gIHdobzogXCJkczZ3Ondob1wiLFxyXG4gIHdoeTogXCJkczZ3OndoeVwiLFxyXG59O1xyXG5jb25zdCBvYmpUb1RhZyA9IHtcclxuICBvYmpJZDogb2JqSURURVNUMyxcclxuICBwcmVkOiBcIndob1wiLFxyXG4gIG9yZGVyX2J5OiBcImRlc2NcIixcclxuICB0YWc6IFwidGVzdFRhZ1wiLFxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgYWRkVGFnVG9Eb2NgIGVzdCB1dGlsaXPDqWUgcG91ciBham91dGVyIHVuZSBiYWxpc2Ugw6AgdW4gZG9jdW1lbnQgZGFucyB1biBlc3BhY2UgM0QgZW5cclxuICogdXRpbGlzYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBldCBsZXMgaW5mb3JtYXRpb25zIHN1ciBsJ29iamV0IGZvdXJuaWVzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMuY3VycmVudFVzZXIudXNlcm5hbWUgLSBMZSBwYXJhbcOodHJlIGBjdXJyZW50VXNlcmAgZXN0IHVuIHF1aSBjb250aWVudCBsZXMgaW5mb3JtYXRpb25zIGRlIGwndXRpbGlzYXRldXIgcXVpIGVudm9pZSBsZSBtZXNzYWdlKGFwcGVsZXIgZGVwdWlzIGxhIGZvbmN0aW9uIGBfM0RTd3ltX2dldF9jdXJyZW50dXNlcmApLCB1bmUgY2hhw65uZSBkZSBjYXJhY3TDqHJlIGNvbnRlbmFudCBsZSBub20gZCd1dGlsaXNhdGV1ci5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRlbmFudCAtIEwnaWRlbnRpZmlhbnQgZHUgdGVuYW50IHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiBSMTEzMjEwMDk2ODQ0NylcclxuICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIExlIHBhcmFtw6h0cmUgYG9iamAgZXN0IHVuIG9iamV0IHF1aSBjb250aWVudCBsZXMgcHJvcHJpw6l0w6lzIHN1aXZhbnRlc8KgOlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gb2JqLmluZm8ubmFtZSAtIEwnaWRlbnRpZmlhbnQgZGUgbCdvYmpldCBxdWUgdm91cyBzb3VoYWl0ZXogbWFycXVlci4gKGV4OiBCNzBDMTJDREFFMDQxNTAwNjU3OUE5MzIwMDA2MUExNClcclxuICogQHBhcmFtIHtTdHJpbmd9IG9iai5wcmVkIC0gTGEgcHJvcHJpw6l0w6kgZGUgbCdvYmpldCBxdWUgdm91cyBzb3VoYWl0ZXogbWFycXVlci4gKGV4OiBob3csIHdoYXQsIHdoZW4sIHdoZXJlLCB3aG8sIHdoeSlcclxuICogQHBhcmFtIHtTdHJpbmd9IG9iai50YWcgLSBMZSB0YWcgcXVlIHZvdXMgc291aGFpdGV6IGFqb3V0ZXIgw6AgbCdvYmpldC5cclxuICogQHBhcmFtIHtTdHJpbmd9IG9iai5vcmRlcl9ieSAtIEwnb3JkcmUgZGUgbGEgYmFsaXNlIHF1ZSB2b3VzIHNvdWhhaXRleiBham91dGVyIMOgIGwnb2JqZXQuIChleDogYXNjLCBkZXNjKVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZVxyXG4gKiBsJ29ww6lyYXRpb24gZGUgbWFycXVhZ2Ugc2VyYSB0ZXJtaW7DqWUgYXZlYyBzdWNjw6hzLiBMYSByw6lwb25zZSBkdSBzZXJ2ZXVyIGx1aSBzZXJhIHRyYW5zbWlzZSBlblxyXG4gKiBhcmd1bWVudC5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgYWRkVGFnVG9Eb2NgLiBJbCB2b3VzIHBlcm1ldCBkZSBnw6lyZXIgZXQgZGUgdHJhaXRlclxyXG4gKiBsJ2VycmV1ciBkZSBtYW5pw6hyZSBwZXJzb25uYWxpc8OpZS5cclxuICogQGV4YW1wbGUgY3JlZGVudGlhbHM9e3NwYWNlOiBcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwiLCBjdXJyZW50VXNlcjogeyB1c2VybmFtZTogXCJZYW5cIiB9LCB0ZW5hbnQ6IFwiUjExMzIxMDA5Njg0NDdcIn1cclxuICogQGV4YW1wbGUgb2JqPXtvYmpJZDogXCJCNzBDMTJDREFFMDQxNTAwNjU3OUE5MzIwMDA2MUExNFwiLCBwcmVkOiBcIndoYXRcIiwgdGFnOiBcInRlc3RUYWdcIn1cclxuICpcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRUYWdUb0RvYyhcclxuICBjcmVkZW50aWFscyxcclxuICBvYmosXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IHsgc3BhY2UsIHRlbmFudCB9ID0gY3JlZGVudGlhbHM7XHJcbiAgY29uc3QgeyBvYmpJZCwgcHJlZCwgdGFnIH0gPSBvYmo7XHJcblxyXG4gIGNvbnN0IFVSTCA9IHtcclxuICAgIHVyaTogXCIvcmVzb3VyY2VzLzZ3L3RhZ3NcIixcclxuICAgIG90cENUWDogXCJTZWN1cml0eUNvbnRleHQ9cHJlZmVycmVkXCIsXHJcbiAgICBvcHRUZW5hbnQ6IGB0ZW5hbnQ9JHt0ZW5hbnR9YCxcclxuICB9O1xyXG4gIGNvbnN0IHVybCA9IGAke3NwYWNlfSR7VVJMLnVyaX0/JHtVUkwub3RwQ1RYfSYke1VSTC5vcHRUZW5hbnR9YDtcclxuICBjb25zdCBkYXRhVGVzdCA9IHtcclxuICAgIHRhZzogW1xyXG4gICAgICB7XHJcbiAgICAgICAgc3ViamVjdDogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB1cmk6IGBwaWQ6Ly8ke29iaklkfWAsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgcHJlZGljYXRlOiBsaXN0UHJlZGljYXRlc1twcmVkXSxcclxuICAgICAgICBvYmplY3Q6IHtcclxuICAgICAgICAgIGxpdGVyYWw6IHRhZyxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgXSxcclxuICB9O1xyXG5cclxuICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgbWV0aG9kOiBcIlBVVFwiLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgIH0sXHJcbiAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhVGVzdCksXHJcbiAgICBvbkNvbXBsZXRlKHJlc3BvbnNlKSB7XHJcbiAgICAgIGNvbnN0IHJlc3AgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxuICAgICAgY29uc3QgaW5mbyA9IHt9O1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBfM0RTcGFjZV9nZXRfZG9jSW5mbyhcclxuICAgICAgICAgIGNyZWRlbnRpYWxzLFxyXG4gICAgICAgICAgb2JqSWQsXHJcbiAgICAgICAgICAocmVwKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvY05hbWUgPSByZXAuZGF0YVswXS5kYXRhZWxlbWVudHMudGl0bGU7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvY0V4dCA9XHJcbiAgICAgICAgICAgICAgcmVwLmRhdGFbMF0uZGF0YWVsZW1lbnRzLmZpbGVFeHRlbnNpb24gIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgPyByZXAuZGF0YVswXS5kYXRhZWxlbWVudHMuZmlsZUV4dGVuc2lvblxyXG4gICAgICAgICAgICAgICAgOiBcIlwiO1xyXG4gICAgICAgICAgICBjb25zdCBjcmVhdGVCeSA9XHJcbiAgICAgICAgICAgICAgcmVwLmRhdGFbMF0ucmVsYXRlZGRhdGEub3duZXJJbmZvWzBdLmRhdGFlbGVtZW50cy5uYW1lO1xyXG4gICAgICAgICAgICBpbmZvW1wibmFtZVwiXSA9IGRvY05hbWU7XHJcbiAgICAgICAgICAgIGluZm9bXCJleHRcIl0gPSBkb2NFeHQ7XHJcbiAgICAgICAgICAgIGluZm9bXCJjcmVhdGVCeVwiXSA9IGNyZWF0ZUJ5O1xyXG4gICAgICAgICAgICBvYmouaW5mbyA9IHsgLi4uaW5mbyB9O1xyXG4gICAgICAgICAgICBnZXRBY3R1YWxUYWdzT25Eb2MoXHJcbiAgICAgICAgICAgICAgY3JlZGVudGlhbHMsXHJcbiAgICAgICAgICAgICAgb2JqLFxyXG4gICAgICAgICAgICAgIChyZXApID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShyZXApO1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIChyZXNwb25zZSwgaGVhZGVycykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgICAgICAgIGluZm9bXCJtc2dcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICAgICAgICBpbmZvW1wiZXJyQ29kZVwiXSA9IGhlYWRlcnMuZXJyb3Jjb2RlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIuKdjCBzZW5kRGlyZWN0TWVzc2FnZSA9PiBcIiwgaW5mbyk7XHJcbiAgICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm8pO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICApO1xyXG4gICAgICB9LCAyMDAwKTtcclxuICAgIH0sXHJcbiAgICBvbkZhaWx1cmUocmVzcG9uc2UsIGhlYWRlcnMpIHtcclxuICAgICAgY29uc3QgaW5mbyA9IHJlc3BvbnNlO1xyXG4gICAgICBpbmZvW1wibXNnXCJdID0gaGVhZGVycy5lcnJvcm1zZztcclxuICAgICAgaW5mb1tcImVyckNvZGVcIl0gPSBoZWFkZXJzLmVycm9yY29kZTtcclxuICAgICAgY29uc29sZS5sb2coXCLinYwgc2VuZERpcmVjdE1lc3NhZ2UgPT4gXCIsIGluZm8pO1xyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgZ2V0QWN0dWFsVGFnc09uRG9jYCByw6ljdXDDqHJlIGxlcyBiYWxpc2VzIHLDqWVsbGVzIGQndW4gZG9jdW1lbnQgZW4gdXRpbGlzYW50IGxlc1xyXG4gKiBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBldCBsZXMgaW5mb3JtYXRpb25zIHN1ciBsJ29iamV0IGZvdXJuaWVzLiBBcHBlbGVyIGRlcHVpcyBgYWRkVGFnVG9Eb2MoKWBcclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRlbmFudCAtIEwnaWRlbnRpZmlhbnQgZHUgdGVuYW50IHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiBSMTEzMjEwMDk2ODQ0NylcclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzLmN1cnJlbnRVc2VyLnVzZXJuYW1lIC0gTGUgcGFyYW3DqHRyZSBgY3VycmVudFVzZXJgIGVzdCB1biBxdWkgY29udGllbnQgbGVzIGluZm9ybWF0aW9ucyBkZSBsJ3V0aWxpc2F0ZXVyIHF1aSBlbnZvaWUgbGUgbWVzc2FnZShhcHBlbGVyIGRlcHVpcyBsYSBmb25jdGlvbiBgXzNEU3d5bV9nZXRfY3VycmVudHVzZXJgKS5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzLmN0eCAgLSBMJ0lEIGR1IGNvbnRleHRlIGRlIHRyYXZhaWwuXHJcbiAqIEBwYXJhbSBvYmogLSBMZSBwYXJhbcOodHJlIGBvYmpgIGVzdCB1biBvYmpldCBxdWkgY29udGllbnQgZGVzIGluZm9ybWF0aW9ucyBzdXIgbGUgZG9jdW1lbnQuIElsXHJcbiAqIHBvc3PDqGRlIGxlcyBwcm9wcmnDqXTDqXMgc3VpdmFudGVzIDpcclxuICogQHBhcmFtIHtTdHJpbmd9IG9iai5pbmZvLm5hbWUgLSBMZSBub20gZHUgZG9jdW1lbnQuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlXHJcbiAqIGwnb3DDqXJhdGlvbiBkZSBtYXJxdWFnZSBzZXJhIHRlcm1pbsOpZSBhdmVjIHN1Y2PDqHMuIExhIHLDqXBvbnNlIGR1IHNlcnZldXIgbHVpIHNlcmEgdHJhbnNtaXNlIGVuXHJcbiAqIGFyZ3VtZW50LlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBhZGRUYWdUb0RvY2AuIElsIHZvdXMgcGVybWV0IGRlIGfDqXJlciBldCBkZSB0cmFpdGVyXHJcbiAqIGwnZXJyZXVyIGRlIG1hbmnDqHJlIHBlcnNvbm5hbGlzw6llLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdHVhbFRhZ3NPbkRvYyhcclxuICBjcmVkZW50aWFscyxcclxuICBvYmosXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIC8vIGNvbnN0IG5vbUZpY2hpZXIgPSBcImJlYW1fY3ViZV9URVNUX0JERFwiO1xyXG4gIGNvbnNvbGUubG9nKFwib2JqIFwiLCBvYmopO1xyXG4gIGNvbnN0IG5vbUZpY2hpZXIgPSBvYmouaW5mby5uYW1lO1xyXG4gIGNvbnN0IFVSTCA9IHtcclxuICAgIGJhc2VVcmw6IGBodHRwczovLyR7Y3JlZGVudGlhbHMudGVuYW50LnRvTG93ZXJDYXNlKCl9LWV1MS1mZWRzZWFyY2guM2RleHBlcmllbmNlLjNkcy5jb21gLFxyXG4gICAgdXJpOiBcIi9mZWRlcmF0ZWQvc2VhcmNoXCIsXHJcbiAgfTtcclxuICBjb25zdCB1cmwgPSBgJHtVUkwuYmFzZVVybH0ke1VSTC51cml9YDtcclxuICBjb25zdCBoZWFkZXJzID0ge1xyXG4gICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvbix0ZXh0L2phdmFzY3JpcHQsKi8qXCIsXHJcbiAgfTtcclxuICBjb25zdCB1dWlkID0gVVVJRCgpO1xyXG4gIGNvbnN0IGRhdGFQYXR0ZXJuID0ge1xyXG4gICAgd2l0aF9pbmRleGluZ19kYXRlOiB0cnVlLFxyXG4gICAgd2l0aF9zeW50aGVzaXM6IHRydWUsXHJcbiAgICB3aXRoX25sczogZmFsc2UsXHJcbiAgICBsYWJlbDogYDNEU2VhcmNoLSR7Y3JlZGVudGlhbHMuY3VycmVudFVzZXIudXNlcm5hbWV9LUFqb3V0RGVUYWdCZWFtLSR7dXVpZH1gLFxyXG4gICAgbG9jYWxlOiBcImZyXCIsXHJcbiAgICBzZWxlY3RfcHJlZGljYXRlOiBbXHJcbiAgICAgIFwiZHM2dzpsYWJlbFwiLFxyXG4gICAgICBcImRzNnc6dHlwZVwiLFxyXG4gICAgICBcImRzNnc6ZGVzY3JpcHRpb25cIixcclxuICAgICAgXCJkczZ3OmlkZW50aWZpZXJcIixcclxuICAgICAgXCJkczZ3Om1vZGlmaWVkXCIsXHJcbiAgICAgIFwiZHM2dzpjcmVhdGVkXCIsXHJcbiAgICAgIFwiZHM2d2c6cmV2aXNpb25cIixcclxuICAgICAgXCJkczZ3OnN0YXR1c1wiLFxyXG4gICAgICBcImRzNnc6cmVzcG9uc2libGVcIixcclxuICAgICAgXCJvd25lclwiLFxyXG4gICAgICBcImRzNnc6cmVzcG9uc2libGVVaWRcIixcclxuICAgICAgXCJkczZ3ZzpmaWxlc2l6ZVwiLFxyXG4gICAgICBcImRzNnc6cHJvamVjdFwiLFxyXG4gICAgICBcImRzNnc6ZGF0YVNvdXJjZVwiLFxyXG4gICAgICBcImRzNnc6Y29tbXVuaXR5XCIsXHJcbiAgICAgIFwiZHM2dzpvcmlnaW5hdG9yXCIsXHJcbiAgICAgIFwiZHNnZW86cmVmZXJlbnRpYWxcIixcclxuICAgICAgXCJkczZ3Omxhc3RNb2RpZmllZEJ5XCIsXHJcbiAgICAgIFwiZHM2dzpyZXBvc2l0b3J5XCIsXHJcbiAgICAgIFwiZGN0ZXJtczp0aXRsZVwiLFxyXG4gICAgICBcImRjdGVybXM6ZGVzY3JpcHRpb25cIixcclxuICAgICAgXCJkczZ3OmNvbnRhaW5lclVpZFwiLFxyXG4gICAgXSxcclxuICAgIHdpdGhfc3ludGhlc2lzX2hpZXJhcmNoaWNhbDogdHJ1ZSxcclxuICAgIHNlbGVjdF9maWxlOiBbXCJpY29uXCIsIFwidGh1bWJuYWlsXzJkXCJdLFxyXG4gICAgcXVlcnk6IG5vbUZpY2hpZXIsXHJcbiAgICBzcGVjaWZpY19zb3VyY2VfcGFyYW1ldGVyOiB7XHJcbiAgICAgIFwiM2RzcGFjZVwiOiB7XHJcbiAgICAgICAgYWRkaXRpb25hbF9xdWVyeTpcclxuICAgICAgICAgICcgQU5EIE5PVCAob3duZXI6XCJFTk9WSUFfQ0xPVURcIiBPUiBvd25lcjpcIlNlcnZpY2UgQ3JlYXRvclwiIE9SIG93bmVyOlwiQ29ycG9yYXRlXCIgT1Igb3duZXI6XCJVc2VyIEFnZW50XCIgT1Igb3duZXI6XCJTTE1JbnN0YWxsZXJBZG1pblwiIE9SIG93bmVyOlwiQ3JlYXRvclwiIE9SIG93bmVyOlwiVlBMTUFkbWluVXNlclwiKSBBTkQgKGRzNndfNThfaXNsYXN0cmV2aXNpb25wZXJzdGF0ZTp0cnVlIE9SIE5PVCBsaXN0b2ZmaWVsZHM6ZHM2d181OF9pc2xhc3RyZXZpc2lvbnBlcnN0YXRlKScsXHJcbiAgICAgIH0sXHJcbiAgICAgIGRyaXZlOiB7XHJcbiAgICAgICAgYWRkaXRpb25hbF9xdWVyeTpcclxuICAgICAgICAgICcgQU5EIE5PVCAoW2ZsYXR0ZW5lZHRheG9ub21pZXNdOlwidHlwZXMvRHJpdmVOb2RlXCIgQU5EICggW2N1cnJlbnRdOlwiVHJhc2hlZFwiIE9SIFtwb2xpY3ldOlwiRHJpdmUgRmlsZSBJdGVyYXRpb25cIikgKScsXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gICAgc2VsZWN0X2V4Y2x1ZGVfc3ludGhlc2lzOiBbXCJkczZ3OndoYXQvZHM2dzp0b3BpY1wiXSxcclxuICAgIG9yZGVyX2J5OiBvYmpUb1RhZy5vcmRlcl9ieSxcclxuICAgIG9yZGVyX2ZpZWxkOiBcInJlbGV2YW5jZVwiLFxyXG4gICAgc2VsZWN0X3NuaXBwZXRzOiBbXHJcbiAgICAgIFwiZHM2dzpzbmlwcGV0XCIsXHJcbiAgICAgIFwiZHM2dzpsYWJlbDpzbmlwcGV0XCIsXHJcbiAgICAgIFwiZHM2dzpyZXNwb25zaWJsZTpzbmlwcGV0XCIsXHJcbiAgICAgIFwiZHM2dzpjb21tdW5pdHk6c25pcHBldFwiLFxyXG4gICAgICBcInN3eW06bWVzc2FnZV90ZXh0OnNuaXBwZXRcIixcclxuICAgIF0sXHJcbiAgICBucmVzdWx0czogNDAsXHJcbiAgICBzdGFydDogXCIwXCIsXHJcbiAgICBzb3VyY2U6IHNvdXJjZXNTZWFyY2hpbmcsXHJcbiAgICB0ZW5hbnQ6IGNyZWRlbnRpYWxzLnRlbmFudCxcclxuICAgIGxvZ2luOiB7XHJcbiAgICAgIFwiM2RzcGFjZVwiOiB7XHJcbiAgICAgICAgU2VjdXJpdHlDb250ZXh0OiBjcmVkZW50aWFscy5jdHgsXHJcbiAgICAgIH0sXHJcbiAgICB9LFxyXG4gIH07XHJcbiAgY29uc29sZS5sb2coXCJkYXRhUGF0dGVybiA9PiBcIiwgZGF0YVBhdHRlcm4pO1xyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgaGVhZGVyczogaGVhZGVycyxcclxuICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGFQYXR0ZXJuKSxcclxuICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG4gICAgICBvbkRvbmUoaW5mbyk7XHJcbiAgICB9LFxyXG4gICAgb25GYWlsdXJlKGVyciwgaGVhZGVycykge1xyXG4gICAgICBjb25zdCBpbmZvID0gZXJyO1xyXG4gICAgICBpbmZvW1wibXNnXCJdID0gaGVhZGVycy5lcnJvcm1zZztcclxuICAgICAgaW5mb1tcImVyckNvZGVcIl0gPSBoZWFkZXJzLmVycm9yY29kZTtcclxuICAgICAgY29uc29sZS5sb2coXCLinYwgc2VuZERpcmVjdE1lc3NhZ2UgPT4gXCIsIGluZm8pO1xyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvKTtcclxuICAgICAgY29uc29sZS5sb2coXCJFcnJldXIgZGUgcmVjdXBlcmF0aW9uIGQnaWQgZHUgZG9jIGV0IGRlcyB0YWdzXCIsIGVycik7XHJcbiAgICB9LFxyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGByZW1vdmVUYWdUb0RvY2AgZXN0IHV0aWxpc8OpZSBwb3VyIHN1cHByaW1lciB1bmUgYmFsaXNlIHNww6ljaWZpcXVlIGQndW4gZG9jdW1lbnQgZW5cclxuICogdXRpbGlzYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBldCBsZXMgaW5mb3JtYXRpb25zIHN1ciBsJ29iamV0IGZvdXJuaWVzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudGVuYW50IC0gTCdpZGVudGlmaWFudCBkdSB0ZW5hbnQgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IFIxMTMyMTAwOTY4NDQ3KVxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gTGUgcGFyYW3DqHRyZSBgb2JqYCBlc3QgdW4gb2JqZXQgcXVpIGNvbnRpZW50IGxlcyBwcm9wcmnDqXTDqXMgc3VpdmFudGVzwqA6XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBvYmoub2JqSWQgLSBMJ2lkZW50aWZpYW50IHVuaXF1ZSBkZSBsJ29iamV0IHBvdXIgbGVxdWVsIHZvdXMgc291aGFpdGV6IHN1cHByaW1lciBsYSBiYWxpc2UuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBvYmoucHJlZCAtIEwnaWRlbnRpZmlhbnQgZGUgbGEgcmVsYXRpb24gZW50cmUgbCdvYmpldCBldCBsYSBiYWxpc2UuIChleDogaG93LCB3aGF0LCB3aGVuLCB3aGVyZSwgd2hvLCB3aHkpLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gb2JqLnRhZyAtIExlIG5vbSBkdSB0YWcgw6Agc3VwcHJpbWVyLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsYVxyXG4gKiBzdXBwcmVzc2lvbiBkZSBsYSBiYWxpc2UgZHUgZG9jdW1lbnQgc2VyYSB0ZXJtaW7DqWUgYXZlYyBzdWNjw6hzLiBJbCBmYXV0IHVuIGFyZ3VtZW50LCBxdWkgZXN0IGxhXHJcbiAqIHLDqXBvbnNlIGR1IHNlcnZldXIuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYHJlbW92ZVRhZ1RvRG9jYC4gSWwgdm91cyBwZXJtZXQgZGUgZ8OpcmVyIGV0IGRlIHRyYWl0ZXJcclxuICogbCdlcnJldXIgZGUgbWFuacOocmUgcGVyc29ubmFsaXPDqWUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVGFnVG9Eb2MoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgb2JqLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCB7IG9iaklkLCBwcmVkLCB0YWcgfSA9IG9iajtcclxuXHJcbiAgY29uc3QgVVJMID0ge1xyXG4gICAgdXJpOiBcIi9yZXNvdXJjZXMvNncvdGFnc1wiLFxyXG4gICAgb3RwQ1RYOiBcIlNlY3VyaXR5Q29udGV4dD1wcmVmZXJyZWRcIixcclxuICAgIG9wdFRlbmFudDogYHRlbmFudD0ke2NyZWRlbnRpYWxzLnRlbmFudH1gLFxyXG4gIH07XHJcbiAgY29uc3QgdXJsID0gYCR7Y3JlZGVudGlhbHMuc3BhY2V9JHtVUkwudXJpfT8ke1VSTC5vdHBDVFh9JiR7VVJMLm9wdFRlbmFudH1gO1xyXG4gIGNvbnN0IGRhdGFUZXN0ID0ge1xyXG4gICAgdGFnOiBbXHJcbiAgICAgIHtcclxuICAgICAgICBzdWJqZWN0OiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHVyaTogYHBpZDovLyR7b2JqSWR9YCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBwcmVkaWNhdGU6IGxpc3RQcmVkaWNhdGVzW3ByZWRdLFxyXG4gICAgICAgIG9iamVjdDoge1xyXG4gICAgICAgICAgbGl0ZXJhbDogdGFnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICBdLFxyXG4gIH07XHJcbiAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgIG1ldGhvZDogXCJERUxFVEVcIixcclxuICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGFUZXN0KSxcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uLHRleHQvamF2YXNjcmlwdCwqLypcIixcclxuICAgIH0sXHJcbiAgICBvbkNvbXBsZXRlKHJlc3BvbnNlKSB7XHJcbiAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShyZXNwb25zZSk7XHJcbiAgICB9LFxyXG4gICAgb25GYWlsdXJlKGVyciwgaGVhZGVycykge1xyXG4gICAgICBjb25zdCBpbmZvID0gZXJyO1xyXG4gICAgICBpbmZvW1wibXNnXCJdID0gaGVhZGVycy5lcnJvcm1zZztcclxuICAgICAgaW5mb1tcImVyckNvZGVcIl0gPSBoZWFkZXJzLmVycm9yY29kZTtcclxuICAgICAgY29uc29sZS5sb2coXCLinYwgc2VuZERpcmVjdE1lc3NhZ2UgPT4gXCIsIGluZm8pO1xyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gwqsgZ2V0SW5mb0RvY1RhZ3MgwrsgZWZmZWN0dWUgdW4gYXBwZWwgSFRUUCBwb3VyIHLDqWN1cMOpcmVyIGRlcyBpbmZvcm1hdGlvbnMgc3VyIGxlc1xyXG4gKiBkb2N1bWVudHMgZW4gZm9uY3Rpb24gZGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIGV0IGRlcyBpZGVudGlmaWFudHMgZGUgZG9jdW1lbnQgZm91cm5pcy5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtTdHJpbmd9IFtzdHJdIC0gTGUgcGFyYW3DqHRyZSBgc3RyYCBlc3QgdW5lIGNoYcOubmUgcXVpIHJlcHLDqXNlbnRlIGwnSUQgZHUgZG9jdW1lbnRzIHBvdXIgbGVzcXVlbHNcclxuICogdm91cyBzb3VoYWl0ZXogcsOpY3Vww6lyZXIgZGVzIGluZm9ybWF0aW9ucy5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbGFcclxuICogcmVxdcOqdGUgSFRUUCBzZXJhIHRlcm1pbsOpZSBhdmVjIHN1Y2PDqHMuIElsIHByZW5kIHVuIGFyZ3VtZW50LCBxdWkgY29ycmVzcG9uZCBhdXggZG9ubsOpZXMgZGUgcsOpcG9uc2VcclxuICogZGUgbGEgcmVxdcOqdGUuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYGdldEluZm9Eb2NUYWdzYC4gSWwgdm91cyBwZXJtZXQgZGUgZ8OpcmVyIGV0IGRlIHRyYWl0ZXJcclxuICogbGVzIGluZm9ybWF0aW9ucyBkJ2VycmV1ci5cclxuICogQHJldHVybnMgTGEgZm9uY3Rpb24gbmUgcmVudm9pZSBleHBsaWNpdGVtZW50IHJpZW4uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5mb0RvY1RhZ3MoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgc3RyID0gXCJcIixcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgeyBzcGFjZSB9ID0gY3JlZGVudGlhbHM7XHJcbiAgaWYgKHN0ciA9PT0gXCJcIikgcmV0dXJuO1xyXG5cclxuICBjb25zdCBVUkwgPSB7XHJcbiAgICB1cmk6IFwiL2Vub3ZpYS9yZXNvdXJjZXMvdjEvbW9kZWxlci9kb2N1bWVudHNcIixcclxuICB9O1xyXG5cclxuICBjb25zdCBoZWFkZXJzID0ge1xyXG4gICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIixcclxuICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uLHRleHQvamF2YXNjcmlwdCwqLypcIixcclxuICB9O1xyXG4gIGNvbnN0IHVybCA9IGAke3NwYWNlfSR7VVJMLnVyaX1gO1xyXG5cclxuICBjb25zdCBkYXRhVGVzdCA9IGAkaW5jbHVkZT1ub25lLGxvY2tlckluZm8sb3duZXJJbmZvLG9yaWdpbmF0b3JJbmZvLGZpbGVzLG93bmVySW5mbyxvcmlnaW5hdG9ySW5mbyYkZmllbGRzPW5vbmUsdGl0bGUsbmFtZSx0eXBlTkxTLGNvbGxhYlNwYWNlVGl0bGUscmV2aXNpb24saXNMYXRlc3RSZXZpc2lvbixmaWxlcyxsb2NrU3RhdHVzLGxvY2tlckluZm8ubmFtZSxsb2NrZXJJbmZvLmZpcnN0bmFtZSxsb2NrZXJJbmZvLmxhc3RuYW1lLG93bmVyLG93bmVySW5mby5uYW1lLG93bmVySW5mby5maXJzdG5hbWUsb3duZXJJbmZvLmxhc3RuYW1lLHN0YXRlTkxTLG1vZGlmaWVkLHBvbGljeSxzdGF0ZSxvcmdhbml6YXRpb25UaXRsZSxvcmlnaW5hdG9yLG9yaWdpbmF0b3JJbmZvLm5hbWUsb3JpZ2luYXRvckluZm8uZmlyc3RuYW1lLG9yaWdpbmF0b3JJbmZvLmxhc3RuYW1lLGhhc01vZGlmeUFjY2VzcyxmaWxlRXh0ZW5zaW9uLGZpbGVzLm5hbWUsZmlsZXMudGl0bGUsZmlsZXMucmV2aXNpb24sZmlsZXMubG9ja2VyLG93bmVySW5mbyxvd25lckluZm8ubmFtZSxvd25lckluZm8uZmlyc3RuYW1lLG93bmVySW5mby5sYXN0bmFtZSxvcmlnaW5hdG9ySW5mbyxvcmlnaW5hdG9ySW5mby5uYW1lLG9yaWdpbmF0b3JJbmZvLmZpcnN0bmFtZSxvcmlnaW5hdG9ySW5mby5sYXN0bmFtZSYkaWRzPSR7c3RyfWA7XHJcblxyXG4gIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQodXJsLCB7XHJcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgaGVhZGVyczogaGVhZGVycyxcclxuICAgIGRhdGE6IGRhdGFUZXN0LFxyXG4gICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICBpZiAob25Eb25lKSBvbkRvbmUoSlNPTi5wYXJzZShyZXNwb25zZSkpO1xyXG4gICAgfSxcclxuICAgIG9uRmFpbHVyZShlcnIsIGhlYWRlcikge1xyXG4gICAgICBjb25zdCBpbmZvID0gZXJyO1xyXG4gICAgICBpbmZvW1wibXNnXCJdID0gaGVhZGVyLmVycm9yO1xyXG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuIiwiaW1wb3J0IHsgX2h0dHBDYWxsQXV0aGVudGljYXRlZCB9IGZyb20gXCIuLi9tYWluLzNkZXhwZXJpZW5jZV9hcGlcIjtcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYF8zRFN3eW1fZ2V0X3ZlcnNpb25gIHLDqWN1cMOocmUgbGUgdG9rZW4gZHUgM0RTd3ltIGV0IGVmZmVjdHVlIGRlcyBhY3Rpb25zIHN1cHBsw6ltZW50YWlyZXMgc2kgbsOpY2Vzc2FpcmUuIE9ibGlnYXRvaXJlIHBvdXIgY2hhcXVlIGFwcGVsIGQnQVBJIGR1IFN3eW0uXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFN3eW0pIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IDNEU3BhY2UgPT4oaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhKSwgM0RTd3ltLCAzRENvbXBhc3MuLi4pXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxlc1xyXG4gKiBpbmZvcm1hdGlvbnMgZGUgdmVyc2lvbiBzZXJvbnQgcsOpY3Vww6lyw6llcyBhdmVjIHN1Y2PDqHMuIElsIHByZW5kIHVuIGFyZ3VtZW50LCBgdG9rZW5JbmZvYCwgcXVpIGVzdCBsYVxyXG4gKiByw6lwb25zZSBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkZSB2ZXJzaW9uLiBMZSB0b2tlbiBlc3QgYXVzc2kgZW52b3nDqSBkYW5zIHVuZSBub3V2ZWxsZSBwcm9wcmnDqXTDqSA6IGBjcmVkZW50aWFscy50b2tlbmBcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGxhIHJlcXXDqnRlIEhUVFAuIElsIGVzdCBmYWN1bHRhdGlmIGV0IHBldXQgw6p0cmUgaW5kw6lmaW5pLlxyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF8zRFN3eW1fZ2V0X3ZlcnNpb24oXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IHVybCA9IGNyZWRlbnRpYWxzLnNwYWNlICsgXCIvYXBpL2luZGV4L3RrXCI7XHJcblxyXG4gIHJldHVybiBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgb25Db21wbGV0ZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgIGNvbnN0IHRva2VuSW5mbyA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG5cclxuICAgICAgaWYgKG9uRG9uZSkge1xyXG4gICAgICAgIG9uRG9uZSh0b2tlbkluZm8pO1xyXG4gICAgICAgIHJldHVybiAoY3JlZGVudGlhbHNbXCJ0b2tlblwiXSA9IHRva2VuSW5mbz8ucmVzdWx0Py5TZXJ2ZXJUb2tlbik7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgb25GYWlsdXJlKHJlc3BvbnNlKSB7XHJcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKHJlc3BvbnNlKTtcclxuICAgIH0sXHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBMYSBmb25jdGlvbiBgXzNEU3d5bV9nZXRBbGxOZXdzYCByw6ljdXDDqHJlIHRvdXRlcyBsZXMgYWN0dWFsaXTDqXMgZCd1bmUgcGxhdGVmb3JtZSAzREV4cGVyaWVuY2UgZW5cclxuICogdXRpbGlzYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBmb3Vybmllcy5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3d5bSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbGFcclxuICogcmVxdcOqdGUgc2VyYSB0ZXJtaW7DqWUgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCBkZXV4IGFyZ3VtZW50cyA6IMKrIHLDqXBvbnNlIMK7IGV0IMKrIGVuLXTDqnRlcyDCuy4gTCdhcmd1bWVudFxyXG4gKiBgcmVzcG9uc2VgIGNvbnRpZW50IGxlcyBkb25uw6llcyBkZSByw6lwb25zZSBkdSBzZXJ2ZXVyIGV0IGwnYXJndW1lbnQgYGhlYWRlcnNgIGNvbnRpZW50IGxlcyBlbi10w6p0ZXNcclxuICogZGUgcsOpcG9uc2UuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYF8zRFN3eW1fZ2V0QWxsTmV3c2AuIElsIHByZW5kIGRldXggcGFyYW3DqHRyZXMgOiDCqyByw6lwb25zZVxyXG4gKiDCuyBldCDCqyBlbi10w6p0ZXMgwrsuIExlIHBhcmFtw6h0cmUgYHJlc3BvbnNlYCBjb250aWVudCBsZXMgZG9ubsOpZXMgZGUgcsOpcG9uc2Ugw6AgbCdlcnJldXIgZXQgbGVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfM0RTd3ltX2dldEFsbE5ld3MoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIC8vICEgQXR0ZW50aW9uIGJlYXVjb3VwIGQnaW5mb3Mgw6AgdHJpZXIgZXQgY2hlY2tlclxyXG4gIC8vIHZvaXIgYXVzc2kgbGVzIHBvc3NpYmlsaXTDqXMgZGVzIHBhcmFtc1xyXG5cclxuICBjb25zdCB1cmwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vYXBpL2V4YWxlYWQvd2hhdHNuZXdgO1xyXG4gIGNvbnN0IGRhdGEgPSB7XHJcbiAgICBwYXJhbXM6IHtcclxuICAgICAgY29tbXVuaXR5X2lkOiBudWxsLFxyXG4gICAgICBoYXNoX2tleTogbnVsbCxcclxuICAgICAgbGVnYWN5Rm9ybWF0OiBmYWxzZSxcclxuICAgICAgbnJlc3VsdHM6IDEsXHJcbiAgICAgIHF1ZXJ5OiBcIiNhbGxcIixcclxuICAgICAgc3RhcnQ6IDAsXHJcbiAgICB9LFxyXG4gIH07XHJcbiAgXzNEU3d5bV9nZXRfdmVyc2lvbihjcmVkZW50aWFscywgKHRva2VuKSA9PiB7XHJcbiAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgXCJYLURTLVNXWU0tQ1NSRlRPS0VOXCI6IHRva2VuLnJlc3VsdC5TZXJ2ZXJUb2tlbixcclxuICAgICAgICBcIkNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOFwiLFxyXG4gICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgIH0sXHJcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxyXG4gICAgICB0eXBlOiBcImpzb25cIixcclxuICAgICAgb25Db21wbGV0ZShyZXNwb25zZSwgaGVhZGVycykge1xyXG4gICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShyZXNwb25zZSwgaGVhZGVycyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRmFpbHVyZShyZXNwb25zZSwgaGVhZGVycykge1xyXG4gICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKHJlc3BvbnNlLCBoZWFkZXJzKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogTGEgZm9uY3Rpb24gYF8zRFN3eW1fZ2V0RmFtaWxpYXJQZW9wbGVgIHLDqWN1cMOocmUgdW5lIGxpc3RlIGRlIHBlcnNvbm5lcyBmYW1pbGnDqHJlcyBlbiBmb25jdGlvbiBkdVxyXG4gKiBwcm9maWwgZGUgbCd1dGlsaXNhdGV1ciBhY3R1ZWwuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFN3eW0pIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IDNEU3BhY2UgPT4oaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhKSwgM0RTd3ltLCAzRENvbXBhc3MuLi4pXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGwnYXBwZWxcclxuICogZCdBUEkgcsOpdXNzaXQgZXQgcXVlIGxlcyBkb25uw6llcyBzb250IHLDqWN1cMOpcsOpZXMuIElsIGZhdXQgZGV1eCBhcmd1bWVudHMgOiBgbXlDb250YWN0c2AgZXRcclxuICogYHJlc3BvbnNlYC4gYG15Q29udGFjdHNgIGVzdCB1biB0YWJsZWF1IGQnb2JqZXRzIGNvbnRlbmFudCBsZSBsb2dpbiBldCBsZSBub20gY29tcGxldCBkZXMgcGVyc29ubmVzXHJcbiAqIGZhbWlsacOocmVzLiBgcsOpcG9uc2VcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNEU3d5bV9nZXRGYW1pbGlhclBlb3BsZWAuIElsIHByZW5kIGRldXggcGFyYW3DqHRyZXMgOiDCq1xyXG4gKiByw6lwb25zZSDCuyBldCDCqyBlbi10w6p0ZXMgwrsuIExlIHBhcmFtw6h0cmUgYHJlc3BvbnNlYCBjb250aWVudCBsYSByw6lwb25zZSBkJ2VycmV1ciBkdSBzZXJ2ZXVyXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gXzNEU3d5bV9nZXRGYW1pbGlhclBlb3BsZShcclxuICBjcmVkZW50aWFscyxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgdXJsID0gYCR7Y3JlZGVudGlhbHMuc3BhY2V9L2FwaS9SZWNvbW1lbmRhdGlvbi9nZXRwZW9wbGVmYW1pbGlhcnRvY3VycmVudHVzZXJgO1xyXG4gIGNvbnN0IF9kYXRhID0ge1xyXG4gICAgcGFyYW1zOiB7XHJcbiAgICAgIGlkc1RvRmlsdGVyQXJyOiBbXSxcclxuICAgICAgbW9kZTogXCJvZmZsaW5lXCIsXHJcbiAgICAgIGxpbWl0OiAzMCxcclxuICAgICAgaXRlbVR5cGU6IFwiVXNlclwiLFxyXG4gICAgICBtYXhOYk9mQ29tbW9uRWxlbWVudHM6IFwiNVwiLFxyXG4gICAgfSxcclxuICB9O1xyXG4gIF8zRFN3eW1fZ2V0X3ZlcnNpb24oY3JlZGVudGlhbHMsICh0b2tlbikgPT4ge1xyXG4gICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIFwiWC1EUy1TV1lNLUNTUkZUT0tFTlwiOiB0b2tlbi5yZXN1bHQuU2VydmVyVG9rZW4sXHJcbiAgICAgICAgXCJDb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLThcIixcclxuICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICB9LFxyXG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShfZGF0YSksXHJcbiAgICAgIHR5cGU6IFwianNvblwiLFxyXG4gICAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgbXlDb250YWN0cyA9IHJlc3BvbnNlLnJlc3VsdC5oaXRzLm1hcCgoY29udGFjdCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHsgbG9naW46IGNvbnRhY3QubG9naW4sIGZ1bGxOYW1lOiBjb250YWN0Lm5hbWUgfTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKG15Q29udGFjdHMsIHJlc3BvbnNlKTtcclxuICAgICAgfSxcclxuICAgICAgb25GYWlsdXJlKHJlc3BvbnNlLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IocmVzcG9uc2UsIGhlYWRlcnMpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuIiwiaW1wb3J0IHsgX2h0dHBDYWxsQXV0aGVudGljYXRlZCB9IGZyb20gXCIuLi8uLi9tYWluLzNkZXhwZXJpZW5jZV9hcGlcIjtcclxuaW1wb3J0IHsgXzNEU3d5bV9nZXRfdmVyc2lvbiB9IGZyb20gXCIuLi8zZHN3eW1fYXBpXCI7XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfM2RTd2ltX2dldEFsbENvbW11bml0aWVzYCByw6ljdXDDqHJlIHVuZSBsaXN0ZSBkZSBjb21tdW5hdXTDqXMgw6AgcGFydGlyIGQndW5lIHBsYXRlZm9ybWVcclxuICogM0QgU3dpbSBlbiB1dGlsaXNhbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIGZvdXJuaWVzLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTd3ltKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKGV4OiAzRFNwYWNlID0+KGh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYSksIDNEU3d5bSwgM0RDb21wYXNzLi4uKVxyXG4gKiBAcGFyYW0ge051bWJlcn0gY3JlZGVudGlhbHMubGltaXQgLSBMZSBwYXJhbcOodHJlIGBsaW1pdGAgZXN0IHVuIG5vbWJyZSBlbnRpZXIgcXVpIGluZGlxdWUgbGUgbm9tYnJlIG1heGltdW0gZGUgY29tbXVuYXV0w6lzIMOgIHJlY2V2b2lyLiBQYXIgZMOpZmF1dCwgaWwgZXN0IGRlIDEwLCBtYWlzIHZvdXMgcG91dmV6IGxlIGNoYW5nZXIganVzcXUnw6AgMTI4LCBhdSBkZWzDoCBvbiBjaGFuZ2UgZGUgcGFnZS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IGNyZWRlbnRpYWxzLnBhZ2UgLSBMZSBwYXJhbcOodHJlIGBwYWdlYCBlc3QgdW4gbm9tYnJlIGVudGllciBxdWkgaW5kaXF1ZSBsYSBwYWdlIGNvdXJhbnRlLiBQYXIgZMOpZmF1dCwgaWwgZXN0IMOgIDEuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gVW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSB1bmUgZm9pcyBsJ29ww6lyYXRpb24gdGVybWluw6llLiBJbCBwcmVuZCBsYVxyXG4gKiBsaXN0ZSBkZXMgY29tbXVuYXV0w6lzIGNvbW1lIHBhcmFtw6h0cmUuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYF8zZFN3aW1fZ2V0QWxsQ29tbXVuaXRpZXNgLiBJbCB2b3VzIHBlcm1ldCBkZSBnw6lyZXIgZXQgZGVcclxuICogcsOpcG9uZHJlIMOgIHRvdXRlIGVycmV1ciBxdWkgc2UgcHJvZHVpdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfM0RTd2ltX2dldEFsbENvbW11bml0aWVzKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCBVUkwgPSB7XHJcbiAgICBiYXNlOiBjcmVkZW50aWFscy5zcGFjZSxcclxuICAgIHVyaTogXCIvYXBpL2NvbW11bml0eS9saXN0bXljb21tdW5pdGllc1wiLFxyXG4gICAgbGltaXQ6IGAvbGltaXQvJHtjcmVkZW50aWFscy5saW1pdCA/IGNyZWRlbnRpYWxzLmxpbWl0IDogMTI4fWAsXHJcbiAgICBwYWdlOiBgL3BhZ2UvJHtjcmVkZW50aWFscy5wYWdlID8gY3JlZGVudGlhbHMucGFnZSA6IFwiMVwifWAsXHJcbiAgfTtcclxuXHJcbiAgY29uc3QgdXJsID0gYCR7VVJMLmJhc2V9JHtVUkwudXJpfSR7VVJMLmxpbWl0fSR7VVJMLnBhZ2V9YDtcclxuICBjb25zdCBjb21tdW5hdXRlcyA9IFtdO1xyXG4gIF8zRFN3eW1fZ2V0X3ZlcnNpb24oY3JlZGVudGlhbHMsICh0b2tlbikgPT4ge1xyXG4gICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgXCJYLURTLVNXWU0tQ1NSRlRPS0VOXCI6IHRva2VuLnJlc3VsdC5TZXJ2ZXJUb2tlbixcclxuICAgICAgfSxcclxuICAgICAgb25Db21wbGV0ZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG4gICAgICAgIGNvbnN0IF9jb21tdW5pdGllc0luZm8gPSBpbmZvLnJlc3VsdDtcclxuICAgICAgICBsZXQgY291bnQgPSAwO1xyXG5cclxuICAgICAgICBfY29tbXVuaXRpZXNJbmZvLmZvckVhY2goKGNvbW11KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBfY29tbXVuYXV0ZSA9IHtcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGNvbW11LmRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICBpZDogY29tbXUuaWQsXHJcbiAgICAgICAgICAgIHRpdGxlOiBjb21tdS50aXRsZSxcclxuICAgICAgICAgICAgb3duZXI6IGNvbW11Lm93bmVyLFxyXG4gICAgICAgICAgICByb2xlOiBjb21tdS5yb2xlLFxyXG4gICAgICAgICAgICBhY2Nlc3M6IGNvbW11LmFjY2VzcyxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBfM0RTd2ltX2dldE1lbWJlcnNDb21tdW5pdHkoXHJcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzLFxyXG4gICAgICAgICAgICBjb21tdS5pZCxcclxuICAgICAgICAgICAgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICAgIF9jb21tdW5hdXRlW1wibWVtYmVyc1wiXSA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgY29tbXVuYXV0ZXMucHVzaChfY29tbXVuYXV0ZSk7XHJcbiAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSBfY29tbXVuaXRpZXNJbmZvLmxlbmd0aCAmJiBvbkRvbmUpIHtcclxuICAgICAgICAgICAgICAgIG9uRG9uZShjb21tdW5hdXRlcyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoZXJyKSA9PiBvbkVycm9yKGVyciksXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkZhaWx1cmUocmVzcG9uc2UsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgICAgaW5mb1tcInN0YXR1c1wiXSA9IGhlYWRlcnMuc3RhdHVzO1xyXG4gICAgICAgIGluZm9bXCJyZXNwb25zZVwiXSA9IGhlYWRlcnMuZXJyb3Jtc2c7XHJcbiAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoaW5mbyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgXzNEU3dpbV9nZXRNZW1iZXJzQ29tbXVuaXR5YCByw6ljdXDDqHJlIHVuZSBsaXN0ZSBkZXMgbWVtYnJlcyBkJ3VuZSBjb21tdW5hdXTDqSBlbiB1dGlsaXNhbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIGV0IGwnSUQgZGUgY29tbXVuYXV0w6kgZm91cm5pcy5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3d5bSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtOdW1iZXJ9IGNyZWRlbnRpYWxzLmxpbWl0IC0gTGUgcGFyYW3DqHRyZSBgbGltaXRgIGVzdCB1biBub21icmUgZW50aWVyIHF1aSBpbmRpcXVlIGxlIG5vbWJyZSBtYXhpbXVtIGRlIGNvbW11bmF1dMOpcyDDoCByZWNldm9pci4gUGFyIGTDqWZhdXQsIGlsIGVzdCBkZSA1MCwgbWFpcyB2b3VzIHBvdXZleiBsZSBjaGFuZ2VyIGp1c3F1J8OgIDEyOCwgYXUgZGVsw6Agb24gY2hhbmdlIGRlIHBhZ2UuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBjcmVkZW50aWFscy5wYWdlIC0gTGUgcGFyYW3DqHRyZSBgcGFnZWAgZXN0IHVuIG5vbWJyZSBlbnRpZXIgcXVpIGluZGlxdWUgbGEgcGFnZSBjb3VyYW50ZS4gUGFyIGTDqWZhdXQsIGlsIGVzdCDDoCAxLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gaWRDb21tdSAtIEwnaWRlbnRpZmlhbnQgZGUgbGEgY29tbXVuYXV0w6kgZG9udCB2b3VzIHNvdWhhaXRleiByw6ljdXDDqXJlciBsZXMgbWVtYnJlcy4gKGV4OiBcIllYZEE1eDREU1VLdGxBaTJ3bW55VEFcIilcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gb25Eb25lIC0gVW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGwnYXBwZWwgZCdBUEkgcsOpdXNzaXQgZXQgcmVudm9pZSBsZXNcclxuICogZG9ubsOpZXMgZGUgcsOpcG9uc2UuIExlcyBkb25uw6llcyBkZSByw6lwb25zZSBzZXJvbnQgdHJhbnNtaXNlcyBlbiBhcmd1bWVudCDDoCBjZXR0ZSBmb25jdGlvbi5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYF8zRFN3aW1fZ2V0TWVtYmVyc0NvbW11bml0eWAuIElsIGVzdCB1dGlsaXPDqSBwb3VyIGfDqXJlclxyXG4gKiB0b3V0ZXMgbGVzIGVycmV1cnMgcXVpIHNlIHByb2R1aXNlbnQgZXQgZm91cm5pciB1bmUgZ2VzdGlvbiBkZXMgZXJyZXVycyBvdSBkZXMgbWVzc2FnZXMgZCdlcnJldXJcclxuICogYXBwcm9wcmnDqXMgw6AgbCdhcHBlbGFudCBkZSBsYSBmb25jdGlvbi5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfM0RTd2ltX2dldE1lbWJlcnNDb21tdW5pdHkoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgaWRDb21tdSxcclxuICBvbkRvbmUsXHJcbiAgb25FcnJvcixcclxuKSB7XHJcbiAgY29uc3QgVVJMID0gYCR7Y3JlZGVudGlhbHMuc3BhY2V9L2FwaS9jb21tdW5pdHkvbGlzdG1lbWJlcnNgO1xyXG5cclxuICBjb25zdCBkYXRhcyA9IHtcclxuICAgIHBhcmFtczoge1xyXG4gICAgICBwYWdlOiBjcmVkZW50aWFscy5wYWdlID8gY3JlZGVudGlhbHMucGFnZSA6IDEsXHJcbiAgICAgIGxpbWl0OiBjcmVkZW50aWFscy5saW1pdCA/IGNyZWRlbnRpYWxzLmxpbWl0IDogNTAsXHJcbiAgICAgIGNvbW11bml0eV9pZDogaWRDb21tdSxcclxuICAgIH0sXHJcbiAgfTtcclxuICBfM0RTd3ltX2dldF92ZXJzaW9uKGNyZWRlbnRpYWxzLCAodG9rZW4pID0+IHtcclxuICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQoVVJMLCB7XHJcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICBcIkNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOFwiLFxyXG4gICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgXCJYLURTLVNXWU0tQ1NSRlRPS0VOXCI6IHRva2VuLnJlc3VsdC5TZXJ2ZXJUb2tlbixcclxuICAgICAgfSxcclxuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZGF0YXMpLFxyXG4gICAgICB0eXBlOiBcImpzb25cIixcclxuICAgICAgb25Db21wbGV0ZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IHJlc3BvbnNlO1xyXG4gICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShpbmZvKTtcclxuICAgICAgfSxcclxuICAgICAgb25GYWlsdXJlKHJlc3BvbnNlLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IHJlc3BvbnNlO1xyXG4gICAgICAgIGluZm9bXCJzdGF0dXNcIl0gPSBoZWFkZXJzLnN0YXR1cztcclxuICAgICAgICBpbmZvW1wicmVzcG9uc2VcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm8pO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYF8zRFN3eW1fZ2V0SWRlYVN0YXR1c01hdHVyaXR5YCByw6ljdXDDqHJlIGxlIHN0YXR1dCBldCBsYSBtYXR1cml0w6kgZCd1bmUgaWTDqWUgZCd1bmVcclxuICogY29tbXVuYXV0w6kgM0RFeHBlcmllbmNlIMOgIGwnYWlkZSBkZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gZm91cm5pZXMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFN3eW0pIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IDNEU3BhY2UgPT4oaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhKSwgM0RTd3ltLCAzRENvbXBhc3MuLi4pXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5jb21tdV9pZCAtIEwnSUQgZGUgY29tbXVuYXV0w6kgM0RFeHBlcmllbmNlIChleDpcIllYZEE1eDREU1VLdGxBaTJ3bW55VEFcIilcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbGFcclxuICogcmVxdcOqdGUgQVBJIHNlcmEgdGVybWluw6llIGF2ZWMgc3VjY8Oocy4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIMKrIGluZm8gwrssIHF1aSBjb3JyZXNwb25kIGF1eCBkb25uw6llcyBkZVxyXG4gKiByw6lwb25zZSBkZSBsJ0FQSS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNEU3d5bV9nZXRJZGVhU3RhdHVzTWF0dXJpdHlgLiBJbCB2b3VzIHBlcm1ldCBkZSBnw6lyZXJcclxuICogZXQgZGUgdHJhaXRlciBsJ2VycmV1ciBkZSBtYW5pw6hyZSBwZXJzb25uYWxpc8OpZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfM0RTd3ltX2dldElkZWFTdGF0dXNNYXR1cml0eShcclxuICBjcmVkZW50aWFscyxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgY29tbXVJRCA9IFwiWVhkQTV4NERTVUt0bEFpMndtbnlUQVwiO1xyXG4gIGlmICghY3JlZGVudGlhbHMuY29tbXVfaWQpIGNyZWRlbnRpYWxzLmNvbW11X2lkID0gY29tbXVJRDtcclxuICBjb25zdCBVUkwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vYXBpL3YyL2NvbW11bml0aWVzLyR7Y3JlZGVudGlhbHMuY29tbXVfaWR9L2lkZWFzL3N0YXR1c2VzYDtcclxuICBfM0RTd3ltX2dldF92ZXJzaW9uKGNyZWRlbnRpYWxzLCAodG9rZW4pID0+IHtcclxuICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQoVVJMLCB7XHJcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIFwiQ29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04XCIsXHJcbiAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICBcIlgtRFMtU1dZTS1DU1JGVE9LRU5cIjogdG9rZW4ucmVzdWx0LlNlcnZlclRva2VuLFxyXG4gICAgICB9LFxyXG5cclxuICAgICAgb25Db21wbGV0ZShyZXNwb25zZSkge1xyXG4gICAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKGluZm8pO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkZhaWx1cmUocmVzcG9uc2UsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgICAgaW5mb1tcInN0YXR1c1wiXSA9IGhlYWRlcnMuc3RhdHVzO1xyXG4gICAgICAgIGluZm9bXCJyZXNwb25zZVwiXSA9IGhlYWRlcnMuZXJyb3Jtc2c7XHJcbiAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoaW5mbyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG5cclxuLy8gVEVTVFxyXG5jb25zdCBjb250ZW50TVNHID0ge1xyXG4gIHJlY2VpcHQ6IFtcImMwMDAwNTcwMTYzN1wiXSwgLy8gTGlzdGUgZGVzIHBlcnNvbm5lcyDDoCBxdWkgZW52b3llciBsZSBtZXNzYWdlXHJcbiAgbXNnOiBcIlRFU1RTIEJlYW0gwrMgREVWLCBIYXBweSBuZXcgeWVhciAhIOODvijijJDilqBf4pagKeODjuKZqlwiLCAvLyBNZXNzYWdlIMOgIGVudm95ZXJcclxufTtcclxuXHJcbi8vIENSRUFUSU9OIERFIE1FU1NBR0VTIERJUkVDVCBPVSBJTlNUQU5UQU7DiVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgXzNEU3d5bV9idWlsZERpcmVjdE1lc3NhZ2VgIHBlcm1ldCBkJ2Vudm95ZXIgdW4gbWVzc2FnZSBkaXJlY3Qgw6AgdW4gb3UgcGx1c2lldXJzIHV0aWxpc2F0ZXVycyBkYW5zIHVuIGVzcGFjZSBwbGF0ZWZvcm1lIDNERXhwZXJpZW5jZS5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3d5bSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtPYmplY3R9IFtjcmVkZW50aWFscy5jdXJyZW50VXNlcl0gLSBMZSBwYXJhbcOodHJlIGBjdXJyZW50VXNlcmAgZXN0IHVuIHF1aSBjb250aWVudCBsZXMgaW5mb3JtYXRpb25zIGRlIGwndXRpbGlzYXRldXIgcXVpIGVudm9pZSBsZSBtZXNzYWdlKGFwcGVsZXIgZGVwdWlzIGxhIGZvbmN0aW9uIGBfM0RTd3ltX2dldF9jdXJyZW50dXNlcmApLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NyZWRlbnRpYWxzLmN1cnJlbnRVc2VyLmxvZ2luXSAtIExlIHBhcmFtw6h0cmUgYGxvZ2luYCBlc3QgbCdpZGVudGlmaWFudCBkJ2Vudm9pcyBkdSBtZXNzYWdlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY3JlZGVudGlhbHMuY3VycmVudFVzZXIuZmlyc3RfbmFtZV0gLSBMZSBwYXJhbcOodHJlIGBmaXJzdF9uYW1lYCBlc3QgbCdpZGVudGlmaWFudCBkJ2Vudm9pcyBkdSBtZXNzYWdlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY3JlZGVudGlhbHMuY3VycmVudFVzZXIubGFzdF9uYW1lXSAtIExlIHBhcmFtw6h0cmUgYGxhc3RfbmFtZWAgZXN0IGwnaWRlbnRpZmlhbnQgZCdlbnZvaXMgZHUgbWVzc2FnZS5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IFtkYXRhc10gLSBMZSBwYXJhbcOodHJlIGBkYXRhc2AgZXN0IHVuIG9iamV0IHF1aSBjb250aWVudCBsZXMgZG9ubsOpZXMgZHUgbWVzc2FnZXMuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZGF0YXMubXNnXSAtIExlIHBhcmFtw6h0cmUgYG1zZ2AgZXN0IHVuZSBjaGHDrm5lIGRlIGNhcmFjdMOocmVzIHF1aSBjb250aWVudCBsZSBtZXNzYWdlIMOgIGVudm95ZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7QXJyYXl9IFtkYXRhcy5yZWNlaXB0XSAtIExhIGxpc3RlIGRlcyB1dGlsaXNhdGV1cnMgw6AgcXVpIGVudm95ZXIgbGUgbWVzc2FnZSAobG9naW4pLiBMYSBsaXN0ZSBkZXMgcGVyc29ubmVzIGFjY2Vzc2libGUgZXN0IGfDqW7DqXJlciBwYXIgbGEgZm9uY3Rpb24gXzNEU3d5bV9nZXRGYW1pbGlhclBlb3BsZS4gKGV4OiBbXCJiZW0zX3lhbi5jb3F1b3pcIixcImJlbV9ib2JfRHlsYW5cIl0pXHJcbiAqXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gVW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGxlIG1lc3NhZ2UgZGlyZWN0IHNlcmEgZW52b3nDqSBhdmVjXHJcbiAqIHN1Y2PDqHMuIElsIHByZW5kIHVuIGFyZ3VtZW50LCBxdWkgZXN0IHVuIG9iamV0IGNvbnRlbmFudCBkZXMgaW5mb3JtYXRpb25zIHN1ciBsYSByw6lwb25zZSBkdSBzZXJ2ZXVyLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBfM0RTd3ltX2J1aWxkRGlyZWN0TWVzc2FnZWAuIElsIGVzdCBmYWN1bHRhdGlmIGV0IHBldXRcclxuICogw6p0cmUgaW5kw6lmaW5pLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFN3eW1fYnVpbGREaXJlY3RNZXNzYWdlKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIGRhdGFzLFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCB7IGxpc3RBbGxDb250YWN0cywgY3VycmVudFVzZXIgfSA9IGNyZWRlbnRpYWxzO1xyXG4gIGNvbnNvbGUubG9nKFwiX19saXN0QWxsQ29udGFjdHNcIiwgbGlzdEFsbENvbnRhY3RzLmhpdHMpO1xyXG4gIGNvbnN0IF9VUkwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vYXBpL2RpcmVjdG1lc3NhZ2VzYDtcclxuXHJcbiAgY29uc3QgX2RhdGEgPSB7XHJcbiAgICB1c2VyczogW2N1cnJlbnRVc2VyLmxvZ2luXS5jb25jYXQoZGF0YXMucmVjZWlwdCksXHJcbiAgfTtcclxuXHJcbiAgY29uc3QgTVNHRGF0YSA9IHtcclxuICAgIGlkX21zZzogXCJcIixcclxuICAgIHNlbmRlcklkOiBjcmVkZW50aWFscy5jdXJyZW50VXNlci5sb2dpbixcclxuICAgIHNlbmRlck5hbWU6IGAke2NyZWRlbnRpYWxzLmN1cnJlbnRVc2VyLmZpcnN0X25hbWV9ICR7Y3JlZGVudGlhbHMuY3VycmVudFVzZXIubGFzdF9uYW1lfWAsXHJcbiAgICBtc2c6IGZvcm1hdGVkTWVzc2FnZShkYXRhcy5tc2cpLFxyXG4gIH07XHJcbiAgbGV0IG90aGVyQ29tbXVuaXR5ID0gZmFsc2U7XHJcbiAgXzNEU3d5bV9maW5kQ29tbXVuaXR5VG9JbnN0YW50TVNHKFxyXG4gICAgX2RhdGEudXNlcnMsXHJcbiAgICAocmVwKSA9PiB7XHJcbiAgICAgIGlmIChyZXAgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIE1TR0RhdGFbXCJpZF9tc2dcIl0gPSByZXAuaWQ7XHJcbiAgICAgICAgb3RoZXJDb21tdW5pdHkgPSB0cnVlO1xyXG4gICAgICAgIF8zRFN3eW1fc2VuZE1lc3NhZ2VEYXRhKGNyZWRlbnRpYWxzLCBNU0dEYXRhKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIChlcnIpID0+IHtcclxuICAgICAgb3RoZXJDb21tdW5pdHkgPSBmYWxzZTtcclxuICAgICAgY29uc29sZS5sb2coXCJfM2RTd3ltX2ZpbmRDb21tdW5pdHlUb0luc3RhbnRNU0cgY2FsbGJhY2tcIiwgZXJyKTtcclxuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZXJyKTtcclxuICAgICAgTVNHRGF0YVtcImlkX21zZ1wiXSA9IFwiXCI7XHJcbiAgICB9LFxyXG4gICk7XHJcblxyXG4gIGlmIChvdGhlckNvbW11bml0eSA9PT0gZmFsc2UpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAob3RoZXJDb21tdW5pdHkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgXzNEU3d5bV9nZXRfdmVyc2lvbihjcmVkZW50aWFscywgKHRva2VuKSA9PiB7XHJcbiAgICAgICAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKF9VUkwsIHtcclxuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgXCJYLURTLVNXWU0tQ1NSRlRPS0VOXCI6IHRva2VuLnJlc3VsdC5TZXJ2ZXJUb2tlbixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoX2RhdGEpLFxyXG4gICAgICAgICAgICB0eXBlOiBcImpzb25cIixcclxuICAgICAgICAgICAgb25Db21wbGV0ZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IHJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgIGluZm9bXCJyZXBvbnNlXCJdID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgIGluZm9bXCJzdGF0dXNcIl0gPSB4aHIuc3RhdHVzO1xyXG4gICAgICAgICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShpbmZvKTtcclxuICAgICAgICAgICAgICBNU0dEYXRhW1wiaWRfbXNnXCJdID0gaW5mby5yZXN1bHQuaWQ7XHJcbiAgICAgICAgICAgICAgXzNEU3d5bV9zZW5kTWVzc2FnZURhdGEoY3JlZGVudGlhbHMsIE1TR0RhdGEpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvbkZhaWx1cmUocmVzcG9uc2UsIGhlYWRlcnMsIHhocikge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGluZm8gPSByZXNwb25zZTtcclxuICAgICAgICAgICAgICBpbmZvW1wibXNnXCJdID0gaGVhZGVycy5lcnJvcm1zZztcclxuICAgICAgICAgICAgICBpbmZvW1wic3RhdHVzXCJdID0gaGVhZGVycy5zdGF0dXM7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm8pO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0sIDUwMCk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfM0RTd3ltX2ZpbmRDb21tdW5pdHlUb0luc3RhbnRNU0dgIGVzdCB1dGlsaXPDqWUgcG91ciByZWNoZXJjaGVyIHVuZSBjb21tdW5hdXTDqSBkYW5zIHVuZVxyXG4gKiBwbGF0ZWZvcm1lIDNERXhwZXJpZW5jZSBwb3VyIGxhIG1lc3NhZ2VyaWUgaW5zdGFudGFuw6llIGVuIGZvbmN0aW9uIGRlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvblxyXG4gKiBldCBkZXMgZG9ubsOpZXMgZm91cm5pZXMuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjcmVkZW50aWFscyAtIFVuIG9iamV0IGNvbnRlbmFudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gcmVxdWlzZXMgcG91ciBhdXRoZW50aWZpZXJcclxuICogbGEgZGVtYW5kZS4gSWwgaW5jbHV0IGfDqW7DqXJhbGVtZW50IGRlcyBwcm9wcmnDqXTDqXMgdGVsbGVzIHF1ZSDCqyB0b2tlbiDCuywgwqsgc3BhY2UgwrssIMKrIHRlbmFudCDCuyBldCDCqyBjdHggwrsuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjcmVkZW50aWFscy5zcGFjZSAtICgzRFN3eW0pIEwnVVJMIGR1IHNlcnZldXIgc3VyIGxlcXVlbCBsJ0FQSSBlc3QgZMOpcGxvecOpZS4oZXg6IDNEU3BhY2UgPT4oaHR0cHM6Ly9yMTEzMjEwMDk2ODQ0Ny1ldTEtc3BhY2UuM2RleHBlcmllbmNlLjNkcy5jb20vZW5vdmlhKSwgM0RTd3ltLCAzRENvbXBhc3MuLi4pXHJcbiAqIEBwYXJhbSB7QXJyYXl9IGRhdGFzIC0gTGUgcGFyYW3DqHRyZSBgZGF0YXNgIGVzdCB1biB0YWJsZWF1IHF1aSBjb250aWVudCBsZXMgZG9ubsOpZXMgw6AgdXRpbGlzZXIgcG91ciB0cm91dmVyIHVuZSBjb21tdW5hdXTDqSBwb3VyIGVudm95ZXIgdW4gbWVzc2FnZSBpbnN0YW50YW7DqS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gb25Eb25lIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlXHJcbiAqIGwnb3DDqXJhdGlvbiBzZXJhIHRlcm1pbsOpZSBhdmVjIHN1Y2PDqHMuIElsIGZhdXQgdW4gYXJndW1lbnQsIHF1aSBlc3QgbGUgcsOpc3VsdGF0IGRlIGwnb3DDqXJhdGlvbi5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gb25FcnJvciAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYF8zRFN3eW1fZmluZENvbW11bml0eVRvSW5zdGFudE1TR2AuIElsIGVzdCBmYWN1bHRhdGlmIGV0XHJcbiAqIHBldXQgw6p0cmUgb21pcyBz4oCZaWwgbuKAmWVzdCBwYXMgbsOpY2Vzc2FpcmUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gXzNEU3d5bV9maW5kQ29tbXVuaXR5VG9JbnN0YW50TVNHKFxyXG4gIGNyZWRlbnRpYWxzLFxyXG4gIGRhdGFzLFxyXG4gIG9uRG9uZSxcclxuICBvbkVycm9yLFxyXG4pIHtcclxuICBjb25zdCBVUkwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vYXBpL2RpcmVjdG1lc3NhZ2VzL2xpdGU/d2l0aF9mYXZvcml0ZXM9ZmFsc2VgO1xyXG4gIF8zRFN3eW1fZ2V0X3ZlcnNpb24oY3JlZGVudGlhbHMsICh0b2tlbikgPT4ge1xyXG4gICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZChVUkwsIHtcclxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb24sdGV4dC9qYXZhc2NyaXB0LCovKlwiLFxyXG4gICAgICAgIFwiWC1EUy1TV1lNLUNTUkZUT0tFTlwiOiB0b2tlbi5yZXN1bHQuU2VydmVyVG9rZW4sXHJcbiAgICAgIH0sXHJcbiAgICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcbiAgICAgICAgY29uc3QgaW5mb1NvcnRlZEJ5TGVuZ3RocyA9IFtdO1xyXG4gICAgICAgIGluZm8ucmVzdWx0LmZvckVhY2goKGNvbSkgPT4ge1xyXG4gICAgICAgICAgY29tLnVzZXJzID0gY29tLnVzZXJzLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGEubG9naW4ubG9jYWxlQ29tcGFyZShiLmxvZ2luKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYgKGNvbS51c2Vycy5sZW5ndGggPT09IGRhdGFzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBpbmZvU29ydGVkQnlMZW5ndGhzLnB1c2goY29tKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBzb3J0ZWREYXRhcyA9IGRhdGFzLnNvcnQoKTtcclxuXHJcbiAgICAgICAgY29uc3QgX2RhdGFzID0gaW5mb1NvcnRlZEJ5TGVuZ3Rocy5maW5kKChjb20pID0+IHtcclxuICAgICAgICAgIGNvbnN0IGxvZ2lucyA9IFtdO1xyXG4gICAgICAgICAgY29tLnVzZXJzLmZvckVhY2goKHVzZXIpID0+IHtcclxuICAgICAgICAgICAgbG9naW5zLnB1c2godXNlci5sb2dpbik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShsb2dpbnMpID09PSBKU09OLnN0cmluZ2lmeShzb3J0ZWREYXRhcyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmIChvbkRvbmUgJiYgX2RhdGFzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIG9uRG9uZShfZGF0YXMpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob25FcnJvciB8fCBfZGF0YXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgb25FcnJvcihfZGF0YXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgb25GYWlsdXJlKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IHJlc3BvbnNlO1xyXG4gICAgICAgIGluZm9bXCJtc2dcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICAgIGluZm9bXCJlcnJDb2RlXCJdID0gaGVhZGVycy5lcnJvcmNvZGU7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLinYwgc2VuZERpcmVjdE1lc3NhZ2VMaXRlID0+IFwiLCBpbmZvKTtcclxuICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfM0RTd3ltX3NlbmRNZXNzYWdlRGF0YWAgZW52b2llIHVuIG1lc3NhZ2UgZGlyZWN0IGF2ZWMgbGVzIGluZm9ybWF0aW9uc1xyXG4gKiBkJ2lkZW50aWZpY2F0aW9uIGV0IGxlIGNvbnRlbnUgZG9ubsOpcywgZXQgYXBwZWxsZSBsZXMgcmFwcGVscyBgb25Eb25lYCBvdSBgb25FcnJvcmAgZW4gZm9uY3Rpb24gZHVcclxuICogc3VjY8OocyBvdSBkZSBsJ8OpY2hlYyBkZSBsYSByZXF1w6p0ZS5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3d5bSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIGNvbnRlbnQgLSBMZSBwYXJhbcOodHJlIGBjb250ZW50YCBlc3QgdW4gb2JqZXQgcXVpIGNvbnRpZW50IGxlcyBwcm9wcmnDqXTDqXMgc3VpdmFudGVzwqA6XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50LmlkX21zZyAtIEwnaWRlbnRpZmlhbnQgZHUgbWVzc2FnZSDDoCBlbnZveWVyLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY29udGVudC5zZW5kZXJJZCAtIEwnaWRlbnRpZmlhbnQgZGUgbCd1dGlsaXNhdGV1ciBxdWkgZW52b2llIGxlIG1lc3NhZ2UuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50LnNlbmRlck5hbWUgLSBMZSBub20gZGUgbCd1dGlsaXNhdGV1ciBxdWkgZW52b2llIGxlIG1lc3NhZ2UuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGwnZW52b2lcclxuICogZHUgbWVzc2FnZSBzZXJhIHRlcm1pbsOpIGF2ZWMgc3VjY8Oocy4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIHF1aSBlc3QgdW4gb2JqZXQgY29udGVuYW50IGRlc1xyXG4gKiBpbmZvcm1hdGlvbnMgc3VyIGxhIHLDqXBvbnNlIGR1IHNlcnZldXIuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYF8zRFN3eW1fc2VuZE1lc3NhZ2VEYXRhYC4gSWwgdm91cyBwZXJtZXQgZGUgZ8OpcmVyIGV0IGRlXHJcbiAqIHRyYWl0ZXIgbGVzIGluZm9ybWF0aW9ucyBkJ2VycmV1ci5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfM0RTd3ltX3NlbmRNZXNzYWdlRGF0YShcclxuICBjcmVkZW50aWFscyxcclxuICBjb250ZW50LFxyXG4gIG9uRG9uZSA9IHVuZGVmaW5lZCxcclxuICBvbkVycm9yID0gdW5kZWZpbmVkLFxyXG4pIHtcclxuICBjb25zdCBVUkwgPSB7XHJcbiAgICBiYXNlOiBjcmVkZW50aWFscy5zcGFjZSxcclxuICAgIHVyaTogXCIvYXBpL2NvbW11bml0eVwiLFxyXG4gICAgaWRfbXNnOiBgJHtjb250ZW50LmlkX21zZ31gLFxyXG4gICAgZW5kVXJpOiBcIi9pbnN0YW50bWVzc2FnZXNcIixcclxuICB9O1xyXG5cclxuICBjb25zdCB1cmwgPSBgJHtVUkwuYmFzZX0ke1VSTC51cml9LyR7VVJMLmlkX21zZ30ke1VSTC5lbmRVcml9YDtcclxuXHJcbiAgY29uc3QgZGF0YXMgPSB7XHJcbiAgICBhdXRob3I6IHsgbG9naW46IGNvbnRlbnQuc2VuZGVySWQsIGRpc3BsYXlOYW1lOiBjb250ZW50LnNlbmRlck5hbWUgfSxcclxuICAgIGFjY2Vzc1N0YXRlOiBudWxsLFxyXG4gICAgY29tbWVudFVyaTogbnVsbCxcclxuICAgIGNvbW1lbnRzOiBudWxsLFxyXG4gICAgZW5kb3JzZW1lbnRzOiBudWxsLFxyXG4gICAgbW9kZXJhdGlvblN0YXRlOiBudWxsLFxyXG4gICAgcGFyZW50Q29tbWVudFVyaTogbnVsbCxcclxuICAgIHJpY2hNZXNzYWdlOiBjb250ZW50Lm1zZyxcclxuICB9O1xyXG4gIGNvbnNvbGUubG9nKFwiXzNkU3d5bV9zZW5kRGlyZWN0TWVzc2FnZURhdGEgdXJsIFwiLCB1cmwpO1xyXG4gIF8zRFN3eW1fZ2V0X3ZlcnNpb24oY3JlZGVudGlhbHMsICh0b2tlbikgPT4ge1xyXG4gICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgXCJYLURTLVNXWU0tQ1NSRlRPS0VOXCI6IHRva2VuLnJlc3VsdC5TZXJ2ZXJUb2tlbixcclxuICAgICAgfSxcclxuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZGF0YXMpLFxyXG4gICAgICB0eXBlOiBcImpzb25cIixcclxuICAgICAgb25Db21wbGV0ZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IHJlc3BvbnNlO1xyXG4gICAgICAgIGluZm9bXCJzdGF0dXNcIl0gPSB4aHIuc3RhdHVzO1xyXG4gICAgICAgIGluZm9bXCJyZXNwb25zZVwiXSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIuKchSBfM2RTd3ltX3NlbmREaXJlY3RNZXNzYWdlRGF0YSA9PiBcIiwgaW5mbyk7XHJcbiAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKGluZm8pO1xyXG4gICAgICB9LFxyXG4gICAgICBvbkZhaWx1cmUocmVzcG9uc2UsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCBpbmZvID0gcmVzcG9uc2U7XHJcbiAgICAgICAgaW5mb1tcIm1zZ1wiXSA9IGhlYWRlcnMuZXJyb3Jtc2c7XHJcbiAgICAgICAgaW5mb1tcImVyckNvZGVcIl0gPSBoZWFkZXJzLmVycm9yY29kZTtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIuKdjCBzZW5kRGlyZWN0TWVzc2FnZSA9PiBcIiwgaW5mbyk7XHJcbiAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoaW5mbyk7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgZm9ybWF0ZWRNZXNzYWdlYCByZW52b2llIHVuIG1lc3NhZ2UgZm9ybWF0w6kgYXZlYyBsYSBkYXRlIGV0IGwnaGV1cmUgYWN0dWVsbGVzLlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSAtIExlIHBhcmFtw6h0cmUgYG1lc3NhZ2VgIGVzdCB1bmUgY2hhw65uZSBxdWkgcmVwcsOpc2VudGUgbGUgY29udGVudSBkdSBtZXNzYWdlIHF1ZSB2b3VzIHNvdWhhaXRleiBlbnZveWVyLlxyXG4gKlxyXG4gKiBAcmV0dXJucyB1biBtZXNzYWdlIGZvcm1hdMOpIGF2ZWMgbGEgZGF0ZSBldCBsJ2hldXJlIGFjdHVlbGxlcy4gTGUgbWVzc2FnZSBlc3QgZW52ZWxvcHDDqSBkYW5zIHVuZSBiYWxpc2UgZGUgcGFyYWdyYXBoZSwgc3VpdmllIGQndW4gc2F1dCBkZSBsaWduZSBldCBkJ3VuZSByw6hnbGUgaG9yaXpvbnRhbGUuXHJcbiAqICAgRW4gZGVzc291cywgaWwgY29tcHJlbmQgdW5lIHBocmFzZSBpbmRpcXVhbnQgcXVhbmQgbGUgbWVzc2FnZSBhIMOpdMOpIGVudm95w6ksIHkgY29tcHJpcyBsYSBkYXRlIGV0IGwnaGV1cmUuXHJcbiAqXHJcbiAqL1xyXG5mdW5jdGlvbiBmb3JtYXRlZE1lc3NhZ2UobWVzc2FnZSkge1xyXG4gIGNvbnN0IF9kYXRlcyA9IG5ldyBEYXRlKCkudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XHJcbiAgY29uc3QgdGltZSA9IG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCk7XHJcbiAgcmV0dXJuIGA8cD4ke21lc3NhZ2V9IDwvcD5cclxuICA8YnIvPlxyXG4gIDxoci8+XHJcbiAgPHA+PHU+ZW52b3llciA6PC91PkxlIDxiPiR7X2RhdGVzfSDDoCAke3RpbWV9PC9iPjwvcD5gO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgXzNEU3dpbV9nZXRBbGxDb21tdW5pdGllcyxcclxuICBfM0RTd2ltX2dldE1lbWJlcnNDb21tdW5pdHksXHJcbiAgXzNEU3d5bV9nZXRJZGVhU3RhdHVzTWF0dXJpdHksXHJcbiAgXzNEU3d5bV9idWlsZERpcmVjdE1lc3NhZ2UsXHJcbiAgXzNEU3d5bV9maW5kQ29tbXVuaXR5VG9JbnN0YW50TVNHLFxyXG4gIF8zRFN3eW1fc2VuZE1lc3NhZ2VEYXRhLFxyXG59O1xyXG4iLCJpbXBvcnQgeyBfaHR0cENhbGxBdXRoZW50aWNhdGVkIH0gZnJvbSBcIi4uLy4uL21haW4vM2RleHBlcmllbmNlX2FwaVwiO1xyXG5pbXBvcnQgeyBfM0RTd3ltX2dldF92ZXJzaW9uIH0gZnJvbSBcIi4uLzNkc3d5bV9hcGlcIjtcclxuLypcclxuICogQGV4ZW1wbGUgZGF0YVRlc3RcclxuICovXHJcbmNvbnN0IGRhdGFUZXN0ID0ge1xyXG4gIHRpdGxlOiBcIlRFU1QgREVWIENPTU1VTklUWSBJREVBXCIsIC8vIHRpdHJlIGR1IHBvc3RcclxuICBjb21tdW5pdHlfaWQ6IFwiWVhkQTV4NERTVUt0bEFpMndtbnlUQVwiLCAvLyBTVEFUVVQgUFJPSkVUUyAtIFBoYXNlIGNvbW1lcmNpYWxlLCAgdGVuYW50IFBJVkVURUFVIFRFU1RcclxuICBjb21tdW5pdHlfdGl0bGU6IFwiVEVTVCBERVYgQ09NTVVOSVRZXCIsIC8vIFBvc3NpYmlsaXTDqSBkZSByZWNoZXJjaGUgcGFyIHRpdHJlIGRlIGxhIGNvbW11bmF1dMOpIChvcHRpb24pXHJcbiAgaWRlZV9pZDogXCJUSGhSSThybFFOV0tSeHB2M1hxcXVnXCIsIC8vIGlkIGRlIGwnaWRlZSBxdWkgZXN0IGNyw6llciBhdSBwb3N0IChfM2RTd3ltX3Bvc3RJZGVhKVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgXzNEU3d5bV9wb3N0SWRlYWAgZXN0IHV0aWxpc8OpZSBwb3VyIHB1YmxpZXIgdW5lIGlkw6llIHN1ciB1bmUgY29tbXVuYXV0w6kgM0RTd3ltIGVuIHV0aWxpc2FudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gZXQgbGVzIGRvbm7DqWVzIGZvdXJuaWVzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTd3ltKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG5cclxuICogQHBhcmFtIHtBcnJheX0gY3JlZGVudGlhbHMuc3d5bUNvbW11bml0aWVzIHRhYmxlYXUgZGVzIGNvbW11bmF1dMOpcyBpc3N1ZSBkZSBsYSBmb25jdGlvbiBgXzNEU3dpbV9nZXRBbGxDb21tdW5pdGllc2BcclxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBMZSBwYXJhbcOodHJlIGBkYXRhYCBlc3QgdW4gb2JqZXQgcXVpIGNvbnRpZW50IGxlcyBwcm9wcmnDqXTDqXMgc3VpdmFudGVzOiBgdGl0bGVgLCBgY29tbXVuaXR5X2lkYCBldCBgY29tbXVuaXR5X3RpdGxlYCBDZSBkZXJuaWVyIGVzdCBvcHRpb25uZWwuXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhLnRpdGxlIC0gTGUgdGl0cmUgZGUgbCdpZMOpZS5cclxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGEuY29tbXVuaXR5X2lkIC0gTCdJRCBkZSBsYSBjb21tdW5hdXTDqSBzdXIgbGFxdWVsbGUgbCdpZMOpZSBkb2l0IMOqdHJlIHB1YmxpZWUuKGV4OiBcIllYZEE1eDREU1VLdGxBaTJ3bW55VEFcIilcclxuICogQHBhcmFtIHtTdHJpbmd9IGRhdGEuY29tbXVuaXR5X3RpdGxlIC0gTGUgdGl0cmUgZGUgbGEgY29tbXVuYXV0w6kgc3VyIGxhcXVlbGxlIGwnaWTDqWUgZG9pdCDDqnRyZSBwdWJsaWVlLihvcHRpb25uZWwsIGV4OiBURVNUIERFViBDT01NVU5JVFkpXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhLnRleHRfaHRtbCAtIExlIG1lc3NhZ2UgSFRNTCBkZSBsJ2lkw6llIChPcHRpb25uZWwgc3VyIGxlcyB0ZW5hbnRzIFBpdmV0ZWF1IFByb2QgZXQgdGVzdClcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbGEgZm9uY3Rpb24gYF8zRFN3eW1fcG9zdElkZWFgIHRlcm1pbmVyYSBhdmVjIHN1Y2PDqHMgc29uIGV4w6ljdXRpb24uIElsIHByZW5kIHVuIGFyZ3VtZW50LCDCqyBpbmZvIMK7LCBxdWkgY29udGllbnQgbGVzIGRvbm7DqWVzIGRlIHLDqXBvbnNlIGRlIGwnYXBwZWwgQVBJLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmUgZXJyZXVyIGxvcnMgZGUgbCdleMOpY3V0aW9uIGRlIGxhIGZvbmN0aW9uIGBfM0RTd3ltX3Bvc3RJZGVhYC4gSWwgcydhZ2l0IGQndW4gcGFyYW3DqHRyZSBmYWN1bHRhdGlmLCBkb25jIHMnaWwgbidlc3QgcGFzIGZvdXJuaSwgaWwgc2VyYSBwYXIgZMOpZmF1dCDCq8Kgbm9uIGTDqWZpbmnCoMK7LlxyXG4gKlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFN3eW1fcG9zdElkZWEoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgZGF0YSxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgVVJMID0gYCR7Y3JlZGVudGlhbHMuc3BhY2V9L2FwaS9pZGVhL2FkZGA7XHJcblxyXG4gIGNvbnN0IGZpbmRCeUlEID0gY3JlZGVudGlhbHMuc3d5bUNvbW11bml0aWVzLmZpbmQoXHJcbiAgICAoY29tbXUpID0+IGNvbW11LmlkID09PSBkYXRhLmNvbW11bml0eV9pZCxcclxuICApO1xyXG4gIGNvbnN0IGZpbmRCeVRpdGxlID0gY3JlZGVudGlhbHMuc3d5bUNvbW11bml0aWVzLmZpbmQoXHJcbiAgICAoY29tbXUpID0+IGNvbW11LnRpdGxlLnRvTG93ZXJDYXNlKCkgPT09IGRhdGEuY29tbXVuaXR5X3RpdGxlLnRvTG93ZXJDYXNlKCksXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgZm9ybWF0ZWREYXRhID0ge1xyXG4gICAgcGFyYW1zOiB7XHJcbiAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLCAvLyBTdHJpbmcsIGxlIG5vbSBkZSBsJ2FmZmFpcmVcclxuICAgICAgY29tbXVuaXR5X2lkOiBmaW5kQnlJRD8uaWQgIT09IHVuZGVmaW5lZCA/IGZpbmRCeUlELmlkIDogZmluZEJ5VGl0bGUuaWQsIC8vIFN0cmluZywgbCdpZCBkZSBsYSBjb21tdW5hdXTDqVxyXG4gICAgICBtZXNzYWdlOiB0ZW1wbGF0ZUFmZmFpcmVNZXNzYWdlKGRhdGEudGV4dF9odG1sKSwgLy8gU1RSSU5HID0+ICBsZSBjb250ZW51ZSBkdSBtZXNzYWdlIGRvaXQgw6p0cmUgYXUgZm9ybWF0IEhUTUxcclxuICAgICAgcHVibGlzaGVkOiAxLCAvLyAxIHB1YmxpZXIsIDAgbm9uIHB1YmxpZXJcclxuICAgIH0sXHJcbiAgfTtcclxuXHJcbiAgXzNEU3d5bV9nZXRfdmVyc2lvbihjcmVkZW50aWFscywgKHRva2VuKSA9PiB7XHJcbiAgICBjb25zdCBoZWFkZXJzID0ge1xyXG4gICAgICBcIkNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOFwiLFxyXG4gICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICBcIlgtRFMtU1dZTS1DU1JGVE9LRU5cIjogdG9rZW4ucmVzdWx0LlNlcnZlclRva2VuLFxyXG4gICAgfTtcclxuXHJcbiAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKFVSTCwge1xyXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxyXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzLFxyXG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShmb3JtYXRlZERhdGEpLFxyXG4gICAgICB0eXBlOiBcImpzb25cIixcclxuICAgICAgb25Db21wbGV0ZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xyXG4gICAgICAgIGluZm9bXCJzdGF0dXNcIl0gPSB4aHIuc3RhdHVzO1xyXG4gICAgICAgIGluZm9bXCJyZXNwb25zZVwiXSA9IHhoci5yZXNwb25zZTtcclxuICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUoaW5mbyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRmFpbHVyZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IHJlc3BvbnNlO1xyXG4gICAgICAgIGluZm9bXCJzdGF0dXNcIl0gPSBoZWFkZXJzLnN0YXR1cztcclxuICAgICAgICBpbmZvW1wicmVzcG9uc2VcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm8pO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gTGEgZm9uY3Rpb24gYF8zRFN3eW1fZGVsZXRlSWRlYWAgZXN0IHV0aWxpc8OpZSBwb3VyIHN1cHByaW1lciB1bmUgaWTDqWUgZGFucyB1bmUgY29tbXVuYXV0w6kgM0RFeHBlcmllbmNlIGVuIHV0aWxpc2FudCBsZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gZXQgbGVzIGRvbm7DqWVzIGZvdXJuaWVzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTd3ltKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG4gXHJcbiAqIEBwYXJhbSBkYXRhIC0gTGUgcGFyYW3DqHRyZSBgZGF0YWAgZXN0IHVuIG9iamV0IHF1aSBjb250aWVudCBsZXMgcHJvcHJpw6l0w6lzIHN1aXZhbnRlczpcclxuICogYGNvbW11bml0eV9pZGAgZXQgJ2lkZWVfaWQnXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhLmNvbW11bml0eV9pZCAtIEwnSUQgZGUgbGEgY29tbXVuYXV0w6kgc3VyIGxhcXVlbGxlIGwnaWTDqWUgZG9pdCDDqnRyZSBzdXBwcmltw6llLihleDogXCJZWGRBNXg0RFNVS3RsQWkyd21ueVRBXCIpXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhLmlkZWVfaWQgLSBMJ0lEIGRlIGwnaWTDqWUgcXVlIHZvdXMgc291aGFpdGV6IHN1cHByaW1lciAoZXg6IFwiVEhoUkk4cmxRTldLUnhwdjNYcXF1Z1wiKVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsYVxyXG4gKiBzdXBwcmVzc2lvbiBkZSBsJ2lkw6llIHNlcmEgdGVybWluw6llIGF2ZWMgc3VjY8Oocy4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIMKraW5mb8K7LCBxdWkgY29udGllbnQgZGVzXHJcbiAqIGluZm9ybWF0aW9ucyBzdXIgbGEgcsOpcG9uc2UgZHUgc2VydmV1ci5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNEU3d5bV9kZWxldGVJZGVhYC4gSWwgdm91cyBwZXJtZXQgZGUgZ8OpcmVyIGV0IGRlXHJcbiAqIHRyYWl0ZXIgbGVzIGluZm9ybWF0aW9ucyBkJ2VycmV1ci5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfM0RTd3ltX2RlbGV0ZUlkZWEoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgZGF0YSxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgVVJMID0gYCR7Y3JlZGVudGlhbHMuc3BhY2V9L2FwaS9pZGVhL2RlbGV0ZWA7XHJcbiAgY29uc3QgZm9ybWF0ZWREYXRhID0ge1xyXG4gICAgcGFyYW1zOiB7XHJcbiAgICAgIGNvbW11bml0eV9pZDogZGF0YS5jb21tdW5pdHlfaWQsXHJcbiAgICAgIGlkZWF0aW9uSWRzOiBbZGF0YS5pZGVlX2lkXSxcclxuICAgIH0sXHJcbiAgfTtcclxuICBfM0RTd3ltX2dldF92ZXJzaW9uKGNyZWRlbnRpYWxzLCAodG9rZW4pID0+IHtcclxuICAgIF9odHRwQ2FsbEF1dGhlbnRpY2F0ZWQoVVJMLCB7XHJcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICBcIkNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOFwiLFxyXG4gICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgXCJYLURTLVNXWU0tQ1NSRlRPS0VOXCI6IHRva2VuLnJlc3VsdC5TZXJ2ZXJUb2tlbixcclxuICAgICAgfSxcclxuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZm9ybWF0ZWREYXRhKSxcclxuICAgICAgdHlwZTogXCJqc29uXCIsXHJcbiAgICAgIG9uQ29tcGxldGUocmVzcG9uc2UsIGhlYWRlcnMsIHhocikge1xyXG4gICAgICAgIGNvbnN0IGluZm8gPSByZXNwb25zZTtcclxuICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUoaW5mbyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRmFpbHVyZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IHJlc3BvbnNlO1xyXG4gICAgICAgIGluZm9bXCJzdGF0dXNcIl0gPSBoZWFkZXJzLnN0YXR1cztcclxuICAgICAgICBpbmZvW1wicmVzcG9uc2VcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm8pO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gQ2V0dGUgZm9uY3Rpb24gSmF2YVNjcmlwdCByw6ljdXDDqHJlIHVuZSBpZMOpZSBTV1lNIMOgIGwnYWlkZSBkZXMgaW5mb3JtYXRpb25zIGQnaWRlbnRpZmljYXRpb24gZXQgZGUgbCdJRCBkZSBwdWJsaWNhdGlvbiBmb3VybmlzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY3JlZGVudGlhbHMgLSBVbiBvYmpldCBjb250ZW5hbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIHJlcXVpc2VzIHBvdXIgYXV0aGVudGlmaWVyXHJcbiAqIGxhIGRlbWFuZGUuIElsIGluY2x1dCBnw6luw6lyYWxlbWVudCBkZXMgcHJvcHJpw6l0w6lzIHRlbGxlcyBxdWUgwqsgdG9rZW4gwrssIMKrIHNwYWNlIMK7LCDCqyB0ZW5hbnQgwrsgZXQgwqsgY3R4IMK7LlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMuc3BhY2UgLSAoM0RTd3ltKSBMJ1VSTCBkdSBzZXJ2ZXVyIHN1ciBsZXF1ZWwgbCdBUEkgZXN0IGTDqXBsb3nDqWUuKDNEU3BhY2UsIDNEU3d5bSwgM0RDb21wYXNzLC4uLmV0YylcclxuICogQGV4YW1wbGUgcG91ciBsZSAzRFNwYWNlIHtzcGFjZTpcImh0dHBzOi8vcjExMzIxMDA5Njg0NDctZXUxLXNwYWNlLjNkZXhwZXJpZW5jZS4zZHMuY29tL2Vub3ZpYVwifVxyXG4gKiBAcGFyYW0ge1N0cmluZ30gY3JlZGVudGlhbHMudGVuYW50IC0gbGUgdGVuYW50IGNvdXJhbnRcclxuICogQGV4YW1wbGUge3RlbmFudDpcIlIxMTMyMTAwOTY4NDQ3XCJ9XHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbaWRQb3N0XSAtIEwnaWRlbnRpZmlhbnQgZGUgbGEgcHVibGljYXRpb24gb3UgZGUgbCdpZMOpZSBxdWUgdm91cyBzb3VoYWl0ZXogcsOpY3Vww6lyZXIuIFNpIGF1Y3VuIGlkZW50aWZpYW50IG4nZXN0IGZvdXJuaSwgaWwgcydhZ2lyYSBwYXIgZMOpZmF1dCBkZSBsJ2lkZW50aWZpYW50IGRlIGwnaWTDqWUgZGUgbW9kw6hsZS4gKGFjdHVlbGxlbWVudCA9PiBQaXZldGVhdSBwcm9kIDpcInRGdHowRzRNUjZxTnRLZ0pqTmZUb2dcIiwgUGl2ZXRlYXUgdGVzdCA6XCJRcHYzSE4tdFRET3NVLTdfYzVEbkRnXCIpLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25Eb25lXSAtIExlIHBhcmFtw6h0cmUgYG9uRG9uZWAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgbG9yc3F1ZSBsYSByZXF1w6p0ZSBBUEkgc2VyYSB0ZXJtaW7DqWUgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgwqsgaW5mbyDCuywgcXVpIGNvbnRpZW50IGxlcyBkb25uw6llcyBkZSByw6lwb25zZSBkZSBsJ2FwcGVsIEFQSS4gKGluZm8ubXNnIDogdGVtcGxhdGUgcsOpY3Vww6lyZXIgbG9ycyBkZSBsYSBjcsOpYXRpb24gZCd1bmUgQWZmYWlyZSBldCB1dGlsaXNlciBkYW5zIGxhIGZvbmN0aW9uIGBfM0RTd3ltX3Bvc3RJZGVhKClgKS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRXJyb3JdIC0gTGUgcGFyYW3DqHRyZSBgb25FcnJvcmAgZXN0IHVuZSBmb25jdGlvbiBkZSByYXBwZWwgcXVpIHNlcmEgYXBwZWzDqWUgcydpbCB5IGEgdW5lXHJcbiAqIGVycmV1ciBsb3JzIGRlIGwnZXjDqWN1dGlvbiBkZSBsYSBmb25jdGlvbiBgXzNEU3d5bV9nZXRTV1lNSWRlYWAuIElsIHZvdXMgcGVybWV0IGRlIGfDqXJlciBldCBkZVxyXG4gKiB0cmFpdGVyIGwnZXJyZXVyIGRlIG1hbmnDqHJlIHBlcnNvbm5hbGlzw6llLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFN3eW1fZ2V0U1dZTUlkZWEoXHJcbiAgY3JlZGVudGlhbHMsXHJcbiAgaWRQb3N0ID0gXCJcIixcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgLy8gVGVuYW50IFBJVkVURUFVIFRFU1QgdGVtcGxhdGUgaWQgfHwgdGVuYW50IFBJVkVURUFVIFBST0RcclxuICBjb25zdCB0ZW1wbGF0ZUlkZWFJZCA9XHJcbiAgICBjcmVkZW50aWFscy50ZW5hbnQudG9Mb3dlckNhc2UoKSA9PT0gXCJyMTEzMjEwMTcxNjM3M1wiXHJcbiAgICAgID8gXCJ0RnR6MEc0TVI2cU50S2dKak5mVG9nXCJcclxuICAgICAgOiBjcmVkZW50aWFscy50ZW5hbnQudG9Mb3dlckNhc2UoKSA9PT0gXCJyMTEzMjEwMTI4Njg1OVwiXHJcbiAgICAgID8gXCJRcHYzSE4tdFRET3NVLTdfYzVEbkRnXCJcclxuICAgICAgOiBcIlRlbXBsYXRlX2QnaWTDqWVfw6BfY3LDqWVyXCI7IC8vIHRlbXBsYXRlIGNyw6llciDDoCBsYSBjcmVhdGlvbiBkJ3VuZSBBZmZhaXJlXHJcbiAgaWYgKGlkUG9zdCA9PT0gXCJcIikge1xyXG4gICAgaWRQb3N0ID0gdGVtcGxhdGVJZGVhSWQ7XHJcbiAgfVxyXG5cclxuICBjb25zdCBVUkwgPSBgJHtjcmVkZW50aWFscy5zcGFjZX0vYXBpL2lkZWEvZ2V0YDtcclxuICBjb25zdCBkYXRhcyA9IHtcclxuICAgIHBhcmFtczoge1xyXG4gICAgICBpZDogaWRQb3N0LFxyXG4gICAgfSxcclxuICB9O1xyXG4gIF8zRFN3eW1fZ2V0X3ZlcnNpb24oY3JlZGVudGlhbHMsICh0b2tlbikgPT4ge1xyXG4gICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZChVUkwsIHtcclxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIFwiQ29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04XCIsXHJcbiAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICBcIlgtRFMtU1dZTS1DU1JGVE9LRU5cIjogdG9rZW4ucmVzdWx0LlNlcnZlclRva2VuLFxyXG4gICAgICB9LFxyXG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhcyksXHJcbiAgICAgIHR5cGU6IFwianNvblwiLFxyXG4gICAgICBvbkNvbXBsZXRlKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IHJlc3BvbnNlO1xyXG4gICAgICAgIGluZm9bXCJtc2dcIl0gPSBpbmZvLnJlc3VsdC5tZXNzYWdlO1xyXG5cclxuICAgICAgICBpZiAob25Eb25lKSBvbkRvbmUoaW5mbyk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uRmFpbHVyZShyZXNwb25zZSkge1xyXG4gICAgICAgIGNvbnN0IGluZm8gPSByZXNwb25zZTtcclxuICAgICAgICBpbmZvW1wic3RhdHVzXCJdID0gaGVhZGVycy5zdGF0dXM7XHJcbiAgICAgICAgaW5mb1tcInJlc3BvbnNlXCJdID0gaGVhZGVycy5lcnJvcm1zZztcclxuICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfM0RTd3ltX2dldF9BbGxTV1lNSWRlYXNgIHLDqWN1cMOocmUgdG91dGVzIGxlcyBpZMOpZXMgU1dZTSBlbiB1dGlsaXNhbnQgbGVzIGluZm9ybWF0aW9ucyBkJ2lkZW50aWZpY2F0aW9uIGZvdXJuaWVzIGV0IGxlcyBwYXJhbcOodHJlcyBmYWN1bHRhdGlmcy5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllclxyXG4gKiBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3d5bSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLigzRFNwYWNlLCAzRFN3eW0sIDNEQ29tcGFzcywuLi5ldGMpXHJcbiAqIEBleGFtcGxlIHBvdXIgbGUgM0RTcGFjZSB7c3BhY2U6XCJodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWFcIn1cclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnRlbmFudCAtIGxlIHRlbmFudCBjb3VyYW50XHJcbiAqIEBleGFtcGxlIHt0ZW5hbnQ6XCJSMTEzMjEwMDk2ODQ0N1wifVxyXG4gKiBAcGFyYW0ge09iamVjdH0gW2RhdGFdIC0gTGUgcGFyYW3DqHRyZSBgZGF0YWAgZXN0IHVuIG9iamV0IHF1aSBjb250aWVudCBkZXMgZG9ubsOpZXMgc3VwcGzDqW1lbnRhaXJlcyBwb3VyIGxhIHJlcXXDqnRlIEFQSS4gSWwgcG9zc8OoZGUgbGVzIHByb3ByacOpdMOpcyBzdWl2YW50ZXMgOlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZGF0YS5jb21tdW5pdHlfaWQgLSBMJ0lEIGRlIGxhIGNvbW11bmF1dMOpIHN1ciBsYXF1ZWxsZSBsJ2lkw6llIGRvaXQgw6p0cmUgcmVjaGVyY2jDqWUuKGV4OiBcIllYZEE1eDREU1VLdGxBaTJ3bW55VEFcIilcclxuICogQHBhcmFtIHtOdW1iZXJ9IGRhdGEubGltaXQgLSBMZSBub21icmUgZCdpZMOpZXMgw6AgcmVudm95ZXIgKG9wdGlvbm5lbCwgcGFyIGTDqWZhdXQgMTAgKDEwIHByZW1pw6hyZXMgaWTDqWVzKSlcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbGFcclxuICogcmVxdcOqdGUgQVBJIHNlcmEgdGVybWluw6llIGF2ZWMgc3VjY8Oocy4gSWwgcHJlbmQgdW4gYXJndW1lbnQsIMKraW5mb8K7LCBxdWkgY29ycmVzcG9uZCBhdXggZG9ubsOpZXMgZGVcclxuICogcsOpcG9uc2UgZGUgbCdBUEkuXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkVycm9yXSAtIExlIHBhcmFtw6h0cmUgYG9uRXJyb3JgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIHMnaWwgeSBhIHVuZVxyXG4gKiBlcnJldXIgbG9ycyBkZSBsJ2V4w6ljdXRpb24gZGUgbGEgZm9uY3Rpb24gYF8zRFN3eW1fZ2V0X0FsbFNXWU1JZGVhc2AuIElsIGVzdCBmYWN1bHRhdGlmIGV0IHBldXQgw6p0cmVcclxuICogaW5kw6lmaW5pLiBTJ2lsIGVzdCBmb3VybmksIGlsIHNlcmEgYXBwZWzDqSBhdmVjIGxlcyBpbmZvcm1hdGlvbnMgZCdlcnJldXIgc291cyBmb3JtZSBkZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF8zRFN3eW1fZ2V0X0FsbFNXWU1JZGVhcyhcclxuICBjcmVkZW50aWFscyxcclxuICBkYXRhID0gZGF0YVRlc3QsXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IFVSTCA9IHtcclxuICAgIHVyaTogXCIvYXBpL2lkZWEvbGlzdFwiLFxyXG4gICAgY29tSWQ6IGAvY29tbXVuaXR5X2lkLyR7XHJcbiAgICAgIGNyZWRlbnRpYWxzLnRlbmFudC50b0xvd2VyQ2FzZSgpID09PSBcInIxMTMyMTAxNzE2MzczXCJcclxuICAgICAgICA/IGRhdGEuY29tbXVuaXR5X2lkXHJcbiAgICAgICAgOiBcImJnbklzRzc0U1VXc3d5R3pTNk5DNmdcIlxyXG4gICAgfWAsXHJcbiAgICBsaW1pdDogYC9saW1pdC8ke2RhdGEubGltaXQgPyBkYXRhLmxpbWl0IDogMTB9YCxcclxuICB9O1xyXG4gIGNvbnN0IHVybCA9IGAke2NyZWRlbnRpYWxzLnNwYWNlfSR7VVJMLnVyaX0ke1VSTC5jb21JZH0ke1VSTC5saW1pdH1gO1xyXG4gIF8zRFN3eW1fZ2V0X3ZlcnNpb24oY3JlZGVudGlhbHMsICh0b2tlbikgPT4ge1xyXG4gICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgXCJYLURTLVNXWU0tQ1NSRlRPS0VOXCI6IHRva2VuLnJlc3VsdC5TZXJ2ZXJUb2tlbixcclxuICAgICAgfSxcclxuXHJcbiAgICAgIG9uQ29tcGxldGUocmVzcG9uc2UpIHtcclxuICAgICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcblxyXG4gICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShpbmZvKTtcclxuICAgICAgfSxcclxuICAgICAgb25GYWlsdXJlKHJlc3BvbnNlLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaW5mbyA9IHJlc3BvbnNlO1xyXG4gICAgICAgIGluZm9bXCJzdGF0dXNcIl0gPSBoZWFkZXJzLnN0YXR1cztcclxuICAgICAgICBpbmZvW1wicmVzcG9uc2VcIl0gPSBoZWFkZXJzLmVycm9ybXNnO1xyXG4gICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGluZm8pO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRlbXBsYXRlQWZmYWlyZU1lc3NhZ2UodHh0KSB7XHJcbiAgLy8gVEVNUExBVEUgQUZGQUlSRVNcclxuICBpZiAoIXR4dCB8fCB0eHQgPT09IFwiXCIpIHtcclxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgPGgyPjx1PklORk9STUFUSU9OUyBBRkZBSVJFIDo8L3U+PC9oMj5cclxuICA8cD48dT584pqg77iPPGVtPiBNZXJjaSBkZSByZXNwZWN0ZXIgbCYjMzk7w6ljcml0dXJlIGRlcyB0YWdzLCBlbiBNQUpVU0NVTEVTLCBub20gY29tcGxldCwgcGFzIGRlIGNhcmFjdMOocmVzPC9lbT48L3U+PC9wPlxyXG4gIDxwPjx1PjxlbT58c3DDqWNpYXV4LCBzw6lwYXJhdGlvbiBwYXIgJiMzNDtfJiMzNDsgc2kgYmVzb2luICE8L2VtPjwvdT48L3A+XHJcbiAgPHA+PHN0cm9uZz5Sw6lmw6lyZW5jZSBjbGllbnQgPC9zdHJvbmc+OiAgPGVtPlxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzp3aG9cIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+Q0xJRU5UPC9hPiBcclxuICA8L2VtPjwvcD5cclxuICA8cD48c3Ryb25nPlLDqWbDqXJlbmNlIHByb2pldCA8L3N0cm9uZz46IDxlbT5cclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6d2hhdFwiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj5OT00gQUZGQUlSRTwvYT4gXHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3OndoZXJlXCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPlZJTExFPC9hPiBcclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6d2hlcmVcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+RFBUPC9hPiBcclxuICA8L2VtPjwvcD5cclxuICA8cD4mI3gxZjRkZDsgPHN0cm9uZz5CYXNlIGRvY3VtZW50YWlyZTwvc3Ryb25nPiA6IExJRU4gcHJvamV0PC9wPlxyXG4gIDxwPiYjeDFmNGRkOyA8c3Ryb25nPkZpY2hlIENPQ0xJQ088L3N0cm9uZz4gOiBMSUVOIHByb2pldDxlbT48c3Ryb25nPjwvc3Ryb25nPlxyXG4gIDwvZW0+PC9wPlxyXG4gIDxwPjxiciAvPjwvcD5cclxuICA8dGFibGUgYm9yZGVyPVwiMVwiPlxyXG4gIDx0Ym9keT5cclxuICA8dHI+PHRkPjxzdHJvbmc+RGVzY3JpcHRpb24gcHJvamV0IDwvc3Ryb25nPjpcclxuICA8YnIgLz48YnIgLz48L3RkPjwvdHI+XHJcbiAgPC90Ym9keT5cclxuICA8L3RhYmxlPlxyXG4gIDxwPjxiciAvPjwvcD5cclxuICA8cD48YnIgLz48L3A+XHJcbiAgPHA+PHN0cm9uZz5Qcm9kdWl0IDo8ZW0+IDwvZW0+PC9zdHJvbmc+PGVtPlxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzp3aGF0XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPkhleGFwbGkgVXNpbsOpPC9hPlxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzp3aGF0XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPkhleGFwbGkgTVA8L2E+XHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3OndoYXRcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+TGFtd29vZDwvYT5cclxuICA8L2VtPjwvcD5cclxuICA8cD48c3Ryb25nPlR5cGUgZGUgQsOidGltZW50IDo8L3N0cm9uZz48ZW0+XHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3OndoYXRcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+TG9nZW1lbnRzPC9hPiBcclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6d2hhdFwiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj5CVVA8L2E+IFxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzp3aGF0XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPkVSUDwvYT4gXHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3OndoYXRcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+UGxhdGVmb3JtZSBMb2dpc3RpcXVlPC9hPiBcclxuICA8L2VtPjwvcD5cclxuICA8cD48c3Ryb25nPkVzc2VuY2UgOjwvc3Ryb25nPiA8ZW0+XHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3Omhvd1wiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj5ET1VHTEFTPC9hPiBcclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6aG93XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPlBJTjwvYT4gXHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3Omhvd1wiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj5NSVhURTwvYT4gXHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3Omhvd1wiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj5FUElDRUE8L2E+IFxyXG4gIDwvZW0+PC9wPlxyXG4gIDxwPjxzdHJvbmc+UXVhbGl0w6kgOiA8L3N0cm9uZz48ZW0+XHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3Omhvd1wiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj5OVkk8L2E+IFxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzpob3dcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+VkkxRjwvYT4gXHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3Omhvd1wiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj5WSTJGPC9hPiBcclxuICA8L2VtPjxzdHJvbmc+PC9zdHJvbmc+PC9wPlxyXG4gIDxwPjxzdHJvbmc+VHJhaXRlbWVudCA6IDwvc3Ryb25nPjxlbT5cclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6aG93XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPlBBUktBPC9hPiBcclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6aG93XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPkNUMjwvYT4gXHJcbiAgPC9lbT48L3A+XHJcbiAgPHA+PHN0cm9uZz5UeXBlIGRlIFBhcm9pIDogPC9zdHJvbmc+PGVtPlxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzp3aGF0XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPk11cnMgSW50w6lyaWV1cnM8L2E+IFxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzp3aGF0XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPk11cnMgRXh0w6lyaWV1cnM8L2E+IFxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzp3aGF0XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPlBsYW5jaGVyczwvYT4gXHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3OndoYXRcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+Q291dmVydHVyZTwvYT4gXHJcbiAgPC9lbT48L3A+XHJcbiAgPHA+PGVtPlxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzp3aGF0XCIgZGF0YS10eXBlPVwiaW50ZXJuYWxcIiBjbGFzcz1cInM2bS10YWctbGluayBzNm0tbGlua1wiPkV0YW5jaMOpaXTDqSBBY2Nlc3NpYmxlPC9hPiBcclxuICA8YSBkYXRhLXByZWRpY2F0ZT1cImRzNnc6d2hhdFwiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj5FdGFuY2jDqWl0w6kgTm9uLUFjY2Vzc2libGU8L2E+IFxyXG4gIDwvZW0+PC9wPlxyXG4gIDxwPjxzdHJvbmc+SGF1dGV1ciBEZXJuaWVyIFBsYW5jaGVyIDo8L3N0cm9uZz48ZW0+PHN0cm9uZz4gPC9zdHJvbmc+IFxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzpob3dcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+SGF1dGV1ciAmbHQ7OG08L2E+IFxyXG4gIDxhIGRhdGEtcHJlZGljYXRlPVwiZHM2dzpob3dcIiBkYXRhLXR5cGU9XCJpbnRlcm5hbFwiIGNsYXNzPVwiczZtLXRhZy1saW5rIHM2bS1saW5rXCI+OG0mbHQ7IEhhdXRldXIgJmx0OzI4bTwvYT4gXHJcbiAgPGEgZGF0YS1wcmVkaWNhdGU9XCJkczZ3Omhvd1wiIGRhdGEtdHlwZT1cImludGVybmFsXCIgY2xhc3M9XCJzNm0tdGFnLWxpbmsgczZtLWxpbmtcIj4yOG0mbHQ7IEhhdXRldXIgJmx0OzUwbTwvYT4gXHJcbiAgPC9lbT48L3A+XHJcbiAgPGgyPjxiciAvPjwvaDI+XHJcbiAgPGgyPjx1PkVRVUlQRSBQSVZFVEVBVSA6PC91PjwvaDI+XHJcbiAgPHRhYmxlIGJvcmRlcj1cIjFcIj5cclxuICA8dGJvZHk+XHJcbiAgPHRyPjx0ZD48c3Ryb25nPkNoYXJnw6kgZCYjMzk7QWZmYWlyZXM8L3N0cm9uZz48L3RkPjx0ZD48YnIgLz48L3RkPjwvdHI+XHJcbiAgPHRyPjx0ZD48c3Ryb25nPlNlcnZpY2Ugw6l0dWRlcyBkZSBwcml4PC9zdHJvbmc+PC90ZD48dGQ+PGJyIC8+PC90ZD48L3RyPlxyXG4gIDwvdGJvZHk+PC90YWJsZT5cclxuICA8cD5cclxuICA8L3A+YDtcclxuICAgIHJldHVybiBtZXNzYWdlO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gdHh0O1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBfaHR0cENhbGxBdXRoZW50aWNhdGVkIH0gZnJvbSBcIi4uLy4uL21haW4vM2RleHBlcmllbmNlX2FwaVwiO1xyXG5pbXBvcnQgeyBfM0RTd3ltX2dldF92ZXJzaW9uIH0gZnJvbSBcIi4uLzNkc3d5bV9hcGkuanNcIjtcclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBMYSBmb25jdGlvbiBgXzNEU3d5bV9nZXRfY3VycmVudFVzZXJgIGVzdCB1dGlsaXPDqWUgcG91ciByw6ljdXDDqXJlciBkZXMgaW5mb3JtYXRpb25zIHN1ciBsJ3V0aWxpc2F0ZXVyIGFjdHVlbCBkYW5zIHVuZSBwbGF0ZWZvcm1lIDNERXhwZXJpZW5jZS5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllciBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3d5bSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIDNEQ29tcGFzcy4uLiksIEF0dGVudGlvbiBpY2kgbGUgc3BhY2UgcHJlbmQgYmllbiBsZSAzRFN3eW1cclxuICpcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29uRG9uZV0gLSBMZSBwYXJhbcOodHJlIGBvbkRvbmVgIGVzdCB1bmUgZm9uY3Rpb24gZGUgcmFwcGVsIHF1aSBzZXJhIGFwcGVsw6llIGxvcnNxdWUgbCdhcHBlbFxyXG4gKiBBUEkgcsOpdXNzaXQgZXQgcXVlIGxlcyBpbmZvcm1hdGlvbnMgdXRpbGlzYXRldXIgc29udCByw6ljdXDDqXLDqWVzLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgcXVpIGVzdFxyXG4gKiBsJ29iamV0IGQnaW5mb3JtYXRpb25zIHV0aWxpc2F0ZXVyLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdhcHBlbCBkZSBsJ0FQSS4gSWwgcHJlbmQgdW4gcGFyYW3DqHRyZSwgcXVpIGVzdCBsYSByw6lwb25zZSBkJ2VycmV1ciBkZSBsJ0FQSS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfM0RTd3ltX2dldF9jdXJyZW50VXNlcihcclxuICBjcmVkZW50aWFscyxcclxuICBvbkRvbmUgPSB1bmRlZmluZWQsXHJcbiAgb25FcnJvciA9IHVuZGVmaW5lZCxcclxuKSB7XHJcbiAgY29uc3QgdXJsID0gY3JlZGVudGlhbHMuc3BhY2UgKyBcIi9hcGkvdXNlci9nZXRjdXJyZW50L1wiO1xyXG4gIF8zRFN3eW1fZ2V0X3ZlcnNpb24oXHJcbiAgICBjcmVkZW50aWFscyxcclxuICAgICh0b2tlbikgPT4ge1xyXG4gICAgICBfaHR0cENhbGxBdXRoZW50aWNhdGVkKHVybCwge1xyXG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcclxuICAgICAgICBoZWFkZXJzOiB7IFwiWC1EUy1TV1lNLUNTUkZUT0tFTlwiOiB0b2tlbi5yZXN1bHQuU2VydmVyVG9rZW4gfSxcclxuICAgICAgICBvbkNvbXBsZXRlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxuICAgICAgICAgIGlmIChvbkRvbmUpIG9uRG9uZShpbmZvLnJlc3VsdCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25GYWlsdXJlKHJlc3BvbnNlLCBoZWFkZXJzLCB4aHIpIHtcclxuICAgICAgICAgIGNvbnN0IGluZm9zID0geyByZXNwb25zZSwgaGVhZGVycywgeGhyIH07XHJcbiAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihpbmZvcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG4gICAgb25FcnJvcixcclxuICApO1xyXG59XHJcblxyXG4vKipcclxuICogQGRlc2NyaXB0aW9uIExhIGZvbmN0aW9uIGBfM0RTd3ltX2dldF9maW5kVXNlcmAgZXN0IHV0aWxpc8OpZSBwb3VyIHJlY2hlcmNoZXIgdW4gdXRpbGlzYXRldXIgcGFyIHNvbiBpZGVudGlmaWFudFxyXG4gKiBkYW5zIHVuIGVzcGFjZSAzRFN3eW0gZW4gdXRpbGlzYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiBmb3Vybmllcy5cclxuICogQHBhcmFtIHtPYmplY3R9IGNyZWRlbnRpYWxzIC0gVW4gb2JqZXQgY29udGVuYW50IGxlcyBpbmZvcm1hdGlvbnMgZCdpZGVudGlmaWNhdGlvbiByZXF1aXNlcyBwb3VyIGF1dGhlbnRpZmllciBsYSBkZW1hbmRlLiBJbCBpbmNsdXQgZ8OpbsOpcmFsZW1lbnQgZGVzIHByb3ByacOpdMOpcyB0ZWxsZXMgcXVlIMKrIHRva2VuIMK7LCDCqyBzcGFjZSDCuywgwqsgdGVuYW50IMK7IGV0IMKrIGN0eCDCuy5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGNyZWRlbnRpYWxzLnNwYWNlIC0gKDNEU3d5bSkgTCdVUkwgZHUgc2VydmV1ciBzdXIgbGVxdWVsIGwnQVBJIGVzdCBkw6lwbG95w6llLihleDogM0RTcGFjZSA9PihodHRwczovL3IxMTMyMTAwOTY4NDQ3LWV1MS1zcGFjZS4zZGV4cGVyaWVuY2UuM2RzLmNvbS9lbm92aWEpLCAzRFN3eW0sIDNEQ29tcGFzcy4uLilcclxuICogQHBhcmFtIHtTdHJpbmd9IHVzZXJMb2dpbiAtIExlIHBhcmFtw6h0cmUgdXNlckxvZ2luIGVzdCBsZSBub20gZGUgbG9naW4gZGUgbCd1dGlsaXNhdGV1ciBxdWUgdm91cyBzb3VoYWl0ZXpcclxuICogcmV0cm91dmVyIGRhbnMgbGEgcGxhdGVmb3JtZSAzRFN3eW0uXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvbkRvbmVdIC0gTGUgcGFyYW3DqHRyZSBgb25Eb25lYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBsb3JzcXVlIGwnYXBwZWxcclxuICogQVBJIHNlcmEgdGVybWluw6kgYXZlYyBzdWNjw6hzLiBJbCBwcmVuZCB1biBhcmd1bWVudCwgwqsgaW5mbyDCuywgcXVpIGNvcnJlc3BvbmQgYXV4IGRvbm7DqWVzIGRlIHLDqXBvbnNlXHJcbiAqIHJlbnZvecOpZXMgcGFyIGwnQVBJLlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb25FcnJvcl0gLSBMZSBwYXJhbcOodHJlIGBvbkVycm9yYCBlc3QgdW5lIGZvbmN0aW9uIGRlIHJhcHBlbCBxdWkgc2VyYSBhcHBlbMOpZSBzJ2lsIHkgYSB1bmVcclxuICogZXJyZXVyIGxvcnMgZGUgbCdhcHBlbCBkZSBsJ0FQSS4gSWwgcHJlbmQgdW4gcGFyYW3DqHRyZSwgcXVpIGVzdCBsYSByw6lwb25zZSBkJ2VycmV1ciBkZSBsJ0FQSS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfM0RTd3ltX2dldF9maW5kVXNlcihcclxuICBjcmVkZW50aWFscyxcclxuICB1c2VyTG9naW4sXHJcbiAgb25Eb25lID0gdW5kZWZpbmVkLFxyXG4gIG9uRXJyb3IgPSB1bmRlZmluZWQsXHJcbikge1xyXG4gIGNvbnN0IHVybCA9IGNyZWRlbnRpYWxzLnNwYWNlICsgXCIvYXBpL3VzZXIvZmluZC9sb2dpbi9cIiArIHVzZXJMb2dpbjtcclxuICBfM0RTd3ltX2dldF92ZXJzaW9uKFxyXG4gICAgY3JlZGVudGlhbHMsXHJcbiAgICAodG9rZW4pID0+IHtcclxuICAgICAgX2h0dHBDYWxsQXV0aGVudGljYXRlZCh1cmwsIHtcclxuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXHJcbiAgICAgICAgaGVhZGVyczogeyBcIlgtRFMtU1dZTS1DU1JGVE9LRU5cIjogdG9rZW4ucmVzdWx0LlNlcnZlclRva2VuIH0sXHJcbiAgICAgICAgb25Db21wbGV0ZShyZXNwb25zZSwgaGVhZGVycywgeGhyKSB7XHJcbiAgICAgICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XHJcblxyXG4gICAgICAgICAgaWYgKG9uRG9uZSkgb25Eb25lKGluZm8pO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9uRmFpbHVyZShyZXNwb25zZSkge1xyXG4gICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IocmVzcG9uc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuICAgIG9uRXJyb3IsXHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIF8zRFN3eW1fZ2V0X2N1cnJlbnRVc2VyLFxyXG4gIF8zRFN3eW1fZ2V0X2ZpbmRVc2VyLFxyXG59O1xyXG4iLCIvKipcclxuICogQGRlc2NyaXB0aW9uIEZvbmN0aW9uIFRlc3QgcGVybWV0dGFudCBkZSB0ZXN0ZXIgbCdpbnN0YWxsYXRpb24gZGUgbGEgbGlicmFpcmllXHJcbiAqXHJcbiAqIEBwYXJhbSAgIHtTdHJpbmd9ICBfbmFtZSAgdW5lIHNpbXBsZSBjaGFpbmVcclxuICpcclxuICogQHJldHVybiAge1N0cmluZ31cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzYXlIZWxsbyhfbmFtZSkge1xyXG4gIGNvbnN0IG5hbWUgPSBcIkhlbGxvIFwiICsgX25hbWU7XHJcbiAgY29uc29sZS5sb2cobmFtZSk7XHJcbiAgcmV0dXJuIG5hbWU7XHJcbn1cclxuIl0sIm5hbWVzIjpbIlVVSUQiLCJ1dWlkIiwiY291bGV1cnMiLCJnZXRDb21tdW5lcyIsImNwIiwib25Eb25lIiwib25FcnJvciIsImNvZGVQb3N0YWwiLCJyZXNwb25zZSIsImpzb24iLCJlcnJvciIsImZpbmRBZHJlc3NlIiwicXVlcnkiLCJnZXREYXRhRnJvbUdvdXZGciIsImV2ZW50cyIsImNvbG9ycyIsInllYXIiLCJEYXRlVGltZSIsImxvYWRlZEV2ZW50cyIsInNvcnRlZERhdGEiLCJmb3JtYXREYXRhIiwiZGF0ZSIsImkiLCJkYXRhIiwiZWFjaCIsImV2ZW50IiwidXBkYXRlRXZlbnQiLCJhZGQiLCJpbmRleCIsInZhbCIsImEiLCJiIiwiX2h0dHBDYWxsQXV0aGVudGljYXRlZCIsInVybCIsIm9wdGlvbnMiLCJyZXF1aXJlanMiLCJXQUZEYXRhIiwiX3NldERyYWdnYWJsZSIsImVsZW0iLCJzdHJEYXRhIiwib25EcmFnIiwiRGF0YURyYWdBbmREcm9wIiwiX3NldHVwVGFnZ2VyIiwidGFncyIsIm9uVGFnZ2VyRmlsdGVyIiwiVGFnTmF2aWdhdG9yUHJveHkiLCJ0YWdnZXJQcm94eSIsIndpZGdldCIsIl9zZXREcm9wcGFibGUiLCJkcm9wIiwiX2dldFBsYXRmb3JtU2VydmljZXMiLCJwbGF0Zm9ybUlkIiwib25Db21wbGV0ZSIsIm9uRmFpbHVyZSIsImkzRFhDb21wYXNzU2VydmljZXMiLCJfZ2V0UGxhdGVmb3JtSW5mb3MiLCJyZXRvdXJBUEkiLCJwbEFQSSIsInRlbmFudCIsInVzZXIiLCJhcHBzQ29uZmlndXJhdGlvbiIsImFwcENvbmYiLCJjb21wYXNzX2dldExpc3RBZGRpdGlvbmFsQXBwcyIsImNyZWRlbnRpYWxzIiwiVVJMIiwiaGVhZGVycyIsInhociIsImluZm8iLCJmb3JtYXRlZEluZm9zIiwiYXBwIiwibmFtZSIsImlkIiwiX0FwcE1uZ3RfZ2V0X3VzZXJzIiwiX0FwcE1uZ3RfZ2V0X2luZm9fdXNlciIsInRvcEhlYWRlciIsImNyZWF0ZVVzZXJHcm91cHMiLCJkYXRhcyIsInNwYWNlIiwiY3VycmVudFVzZXIiLCJ0ZW1wbGF0ZURhdGEiLCJlcnIiLCJnZXRDb21wbGVtZW50VUciLCJ1cmkiLCJiYXNlVVJMIiwiVVJJIiwiT1BUcyIsImdldFVzZXJzR3JvdXBSdWxlcyIsIk9QVFMiLCJPUFRzSCIsImdldFVzZXJHcm91cHNMaXN0Iiwib3B0cyIsInJlcFVHIiwicmVwb25zZSIsIlVHIiwiZWxlbWVudCIsImlhbU93bmVyIiwiaWFtTWVtYmVyIiwiaWFtIiwicnVsZXMiLCJkZWxldGVVc2VyR3JvdXBzIiwicGF0Y2hVc2VyR3JvdXBzIiwiZGF0YU1lbWJlcnMiLCJkYXRhTWVtYmVyc1NUUiIsInBhdGNoVXNlckdyb3Vwc0NvbnRyb2wiLCJfZGF0YXMiLCJyZWFkVXNlckdyb3VwQ29udHJvbCIsIl9yZXAiLCJfM0RTcGFjZV9nZXRfZG9jSW5mbyIsImRvY2lkIiwiXzNEU3BhY2UiLCJfM0RTcGFjZV9nZXRfY3NyZiIsIl8zRFNwYWNlX2NzcmYiLCJfM0RTcGFjZV9maWxlX3VybCIsImZpbGVfdXJsIiwiaGVhZCIsIl8zRFNwYWNlX2ZpbGVfdXJsX2NzciIsImNzciIsIl8zRFNwYWNlX2ZpbGVfdXBkYXRlIiwiZG9jSWQiLCJmaWxlSWQiLCJmaWxlbmFtZSIsIl8zRFNwYWNlX2ZpbGVfdXBkYXRlX2NzciIsImZvcm1EYXRhIiwidGVtcElkIiwiXzNEU3BhY2VfQ3JlYXRlX0RvYyIsImRlc2MiLCJfc3BhY2UiLCJjdHgiLCJqc29uRmlsZSIsInVybHMiLCJ0aWNrZXQiLCJoYW5kbGVTdWNjZXNzIiwiaGFuZGxlRXJyb3IiLCJfM0RTcGFjZV9nZXRfc2VjdXJpdHlDb250ZXh0cyIsImNzIiwicm9sZSIsIm9yZ2FuaXphdGlvbiIsImNvbnRleHRzIiwiY29udGV4dCIsImZpbmFsQ3MiLCJmaW5hbE9yZyIsImZpbmFsUm9sZSIsIm9DUyIsImUiLCJjb3VwbGVzIiwidmFsdWUiLCJzZWxmIiwidCIsInIiLCJkZWZpbmVTaW5nbGVJdGVtIiwiY291cGxlIiwiXzNEU3BhY2VfZG93bmxvYWRfZG9jIiwibWVzc2FnZSIsIm9iamVjdElkIiwicmVzdWx0IiwiXzNEU3BhY2VfZG93bmxvYWRfbXVsdGlkb2MiLCJvYmplY3RJZHMiLCJsaXN0RGl2IiwiY2h1bmsiLCJsb29wIiwiXzNEU3BhY2VfZ2V0X2Rvd25sb2FkVGlja2V0X211bHRpZG9jIiwiZG9uZSIsIm9uTmV4dCIsImNvbXBpbERhdGEiLCJmaWxlTmFtZSIsImZpbGVVcmwiLCJfM0RTcGFjZV9saWZlY3ljbGVfZ2V0TmV4dFN0YXRlcyIsIl8zRFNwYWNlX2xpZmVjeWNsZV9jaGFuZ2VTdGF0ZSIsIm5leHRTdGF0ZSIsIl8zRFNwYWNlX2xpZmVjeWNsZV9nZXRHcmFwaCIsIl8zRFNwYWNlX2xpZmVjeWNsZV9nZXROZXh0UmV2aXNpb24iLCJfM0RTcGFjZV9saWZlY3ljbGVfY2hhbmdlUmV2aXNpb24iLCJuZXh0UmV2aXNpb24iLCJnZXRDU1JGVG9rZW4iLCJnZXRBbGxDb250ZXh0U2VjdXJpdHkiLCJyZXAiLCJnZXREYXRhRnJvbTNEU3BhY2UiLCJ3aWRnZXRQcmVmZXJlbmNlIiwiZ2V0RG93bmxvYWREb2N1bWVudCIsInB1c2hEYXRhSW4zRFNwYWNlIiwiZGF0YUJhc2UiLCJsaXN0T2JqZWN0SWQiLCJtaXhlZERhdGFzIiwiZ2V0XzNEU3BhY2VfY3NyZiIsImdldERhdGFzQnlUZW5hbnQiLCJnZXREYXRhc0Zyb20zRFNwYWNlIiwiYmJkcyIsIm9iaiIsImFmZiIsImRhdGFNaXhpbmciLCJjb3B5RGF0YSIsIm9iaklEVEVTVDMiLCJzb3VyY2VzU2VhcmNoaW5nIiwibGlzdFByZWRpY2F0ZXMiLCJvYmpUb1RhZyIsImFkZFRhZ1RvRG9jIiwib2JqSWQiLCJwcmVkIiwidGFnIiwiZGF0YVRlc3QiLCJkb2NOYW1lIiwiZG9jRXh0IiwiY3JlYXRlQnkiLCJnZXRBY3R1YWxUYWdzT25Eb2MiLCJub21GaWNoaWVyIiwiZGF0YVBhdHRlcm4iLCJyZW1vdmVUYWdUb0RvYyIsImdldEluZm9Eb2NUYWdzIiwic3RyIiwiaGVhZGVyIiwiXzNEU3d5bV9nZXRfdmVyc2lvbiIsInRva2VuSW5mbyIsIl8zRFN3eW1fZ2V0QWxsTmV3cyIsInRva2VuIiwiXzNEU3d5bV9nZXRGYW1pbGlhclBlb3BsZSIsIl9kYXRhIiwibXlDb250YWN0cyIsImNvbnRhY3QiLCJfM0RTd2ltX2dldEFsbENvbW11bml0aWVzIiwiY29tbXVuYXV0ZXMiLCJfY29tbXVuaXRpZXNJbmZvIiwiY291bnQiLCJjb21tdSIsIl9jb21tdW5hdXRlIiwiXzNEU3dpbV9nZXRNZW1iZXJzQ29tbXVuaXR5IiwiaWRDb21tdSIsIl8zRFN3eW1fZ2V0SWRlYVN0YXR1c01hdHVyaXR5IiwiY29tbXVJRCIsIl8zRFN3eW1fYnVpbGREaXJlY3RNZXNzYWdlIiwibGlzdEFsbENvbnRhY3RzIiwiX1VSTCIsIk1TR0RhdGEiLCJmb3JtYXRlZE1lc3NhZ2UiLCJvdGhlckNvbW11bml0eSIsIl8zRFN3eW1fZmluZENvbW11bml0eVRvSW5zdGFudE1TRyIsIl8zRFN3eW1fc2VuZE1lc3NhZ2VEYXRhIiwiaW5mb1NvcnRlZEJ5TGVuZ3RocyIsImNvbSIsInNvcnRlZERhdGFzIiwibG9naW5zIiwiY29udGVudCIsIl9kYXRlcyIsInRpbWUiLCJfM0RTd3ltX3Bvc3RJZGVhIiwiZmluZEJ5SUQiLCJmaW5kQnlUaXRsZSIsImZvcm1hdGVkRGF0YSIsInRlbXBsYXRlQWZmYWlyZU1lc3NhZ2UiLCJfM0RTd3ltX2RlbGV0ZUlkZWEiLCJfM0RTd3ltX2dldFNXWU1JZGVhIiwiaWRQb3N0IiwidGVtcGxhdGVJZGVhSWQiLCJfM0RTd3ltX2dldF9BbGxTV1lNSWRlYXMiLCJ0eHQiLCJfM0RTd3ltX2dldF9jdXJyZW50VXNlciIsIl8zRFN3eW1fZ2V0X2ZpbmRVc2VyIiwidXNlckxvZ2luIiwic2F5SGVsbG8iLCJfbmFtZSJdLCJtYXBwaW5ncyI6Ijs7O0FBTU8sU0FBU0EsSUFBTztBQUNyQixTQUFPQyxFQUFJO0FBQ2I7QUNQWSxNQUFDQyxJQUFXO0FBQUEsRUFDdEIsWUFBWTtBQUFBLEVBQ1osZ0JBQWdCO0FBQUEsRUFDaEIsZ0JBQWdCO0FBQUEsRUFDaEIsaUJBQWlCO0FBQUEsRUFDakIsZUFBZTtBQUFBLEVBQ2YsZUFBZTtBQUFBLEVBQ2YsZUFBZTtBQUFBLEVBQ2YsZ0JBQWdCO0FBQUEsRUFDaEIsZ0JBQWdCO0FBQUEsRUFDaEIsZ0JBQWdCO0FBQUEsRUFDaEIsZ0JBQWdCO0FBQUEsRUFDaEIscUJBQXFCO0FBQUEsRUFDckIscUJBQXFCO0FBQUEsRUFDckIscUJBQXFCO0FBQUEsRUFDckIsc0JB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
|
|
1959
|
+
//# sourceMappingURL=wb3Api.js.map
|