@rusticarcade/palette 0.3.0 → 0.3.1
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/dev/index.js +4 -4
- package/dist/prod/index.js +2 -2
- package/package.json +1 -1
package/dist/dev/index.js
CHANGED
|
@@ -1012,9 +1012,9 @@ function prepareCompiledTemplate(compiled, prototypeFragment) {
|
|
|
1012
1012
|
listContainer.insertBefore(startMarker, itemPrototype);
|
|
1013
1013
|
listContainer.insertBefore(endMarker, itemPrototype.nextSibling);
|
|
1014
1014
|
const rowRootElement = itemPrototype.cloneNode(false);
|
|
1015
|
-
const
|
|
1015
|
+
const templateContentFragment = htmlToFragment(scheme.listContentHtml);
|
|
1016
1016
|
const rowTemplateElement = document.createElement("template");
|
|
1017
|
-
rowTemplateElement.appendChild(
|
|
1017
|
+
rowTemplateElement.content.appendChild(templateContentFragment);
|
|
1018
1018
|
itemPrototype.remove();
|
|
1019
1019
|
const plan = {
|
|
1020
1020
|
type: "each",
|
|
@@ -1910,5 +1910,5 @@ export {
|
|
|
1910
1910
|
Component
|
|
1911
1911
|
};
|
|
1912
1912
|
|
|
1913
|
-
//# debugId=
|
|
1914
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2Vycm9ycy50cyIsICJzcmMvaGVscGVyL2Nzcy50cyIsICJzcmMvdXRpbC9hdHRyaWJ1dGVzLnRzIiwgInNyYy91dGlsL2NoYW5nZS10YWcudHMiLCAic3JjL3V0aWwvZWxlbWVudC1tYXRjaC50cyIsICJzcmMvdXRpbC9scnUtY2FjaGUudHMiLCAic3JjL3V0aWwvZnJhZ21lbnRzLnRzIiwgInNyYy9oZWxwZXIvaHRtbC50cyIsICJzcmMvc3RhdGUvc3RhdGUudHMiLCAic3JjL3RlbXBsYXRlL3N5bnRheC50cyIsICJzcmMvdGVtcGxhdGUvYnVpbGQudHMiLCAic3JjL3RlbXBsYXRlL2pvYnMudHMiLCAic3JjL3RlbXBsYXRlL3RlbXBsYXRlLnRzIiwgInNyYy9jb21wb25lbnQvZGVsZWdhdG9yLnRzIiwgInNyYy9jb21wb25lbnQvY29tcG9uZW50LnRzIiwgInNyYy9jb21wb25lbnQvZmFjdG9yeS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbi8qKlxuICogUG9zc2libGUgZXJyb3IgdHlwZXMgZm9yIHtAbGluayBQYWxldHRlRXJyb3J9XG4gKlxuICogQ29kZXMgYXJlIGNhdGVnb3JpemVkIGludG8gZ3JvdXBzIGJ5IHRoZSAxMDAnczpcbiAqXG4gKiAtIDAgLSA5OTogSW52YXJpYW50c1xuICogLSAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyAvIEVudmlyb25tZW50IEVycm9yc1xuICogLSAyMDAgLSAyOTk6IFRlbXBsYXRpbmcgRXJyb3JzXG4gKiAtIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gRXJyb3JDb2RlIHtcbiAgLy8gMCAtIDk5OiBJbnZhcmlhbnRzXG4gIElOVkFSSUFOVCA9IDAsXG4gIElOVkFMSURfRU5WID0gMSxcblxuICAvLyAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyBFcnJvcnNcbiAgRFVQRV9UQUdOQU1FID0gMTAwLFxuICBJTlZBTElEX1RBR05BTUUgPSAxMDEsXG5cbiAgLy8gMjAwIC0gMjk5OiBUZW1wbGF0ZSBFcnJvcnNcbiAgVEVNUExBVEVfSU5WQUxJRCA9IDIwMCxcbiAgVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTiA9IDIwMSxcbiAgVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlQgPSAyMDIsXG4gIFRFTVBMQVRFX0lOVkFMSURfTElTVCA9IDIwMyxcbiAgVEVNUExBVEVfSU5WQUxJRF9OT0RFX1JFRiA9IDIwNCxcbiAgVEVNUExBVEVfTUlTU0lOR19MSVNUX1BBUkVOVCA9IDIwNSxcbiAgVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWSA9IDIwNixcbiAgVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZID0gMjA3LFxuXG4gIC8vIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAgTUlTU0lOR19FTEVNRU5UID0gMzAwLFxuICBNSVNTSU5HX1NUQVRFID0gMzAxLFxuICBJTlZBTElEX0NPTlRFTlQgPSAzMDIsXG4gIElOVkFMSURfU1RBVEVfS0VZID0gMzAzLFxuICBJTlZBTElEX1NUQVRFX1VQREFURSA9IDMwNCxcbiAgU1RBVEVfTE9DS0VEID0gMzA1LFxuICBNQVhfU0VRVUVOVElBTF9SRU5ERVJTID0gMzA2LFxufVxuXG5mdW5jdGlvbiBnZXREZXZFcnJvcihjb2RlOiBFcnJvckNvZGUpIHtcbiAgY29uc3QgREVWX0VSUk9SX0lORk86IFJlY29yZDxFcnJvckNvZGUsIHN0cmluZz4gPSB7XG4gICAgW0Vycm9yQ29kZS5JTlZBUklBTlRdOiBgXG5JTlZBUklBTlRcbkEgY29uZGl0aW9uIGhhcyBvY2N1cnJlZCB3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBzdWNoIGFzIGEgY29kZSBwYXRoIHRoYXRcbnNob3VsZG4ndCBiZSByZWFjaGFibGUgd2hlbiB1c2luZyBjb3JyZWN0IHR5cGVzLCBvciBhIGRpc2FsbG93ZWQgc3RhdGUuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX0VOVl06IGBcbklOVkFMSURfRU5WXG5GYWlsZWQgdG8gZmluZCBhIGN1c3RvbSBlbGVtZW50cyByZWdpc3RyeSBpbiB0aGlzIGVudmlyb25tZW50LiBJcyBhIHdpbmRvd1xuZ2xvYmFsIGF2YWlsYWJsZSB3aXRoIGEgY3VzdG9tRWxlbWVudHMgcHJvcGVydHk/XG5gLFxuXG4gICAgW0Vycm9yQ29kZS5EVVBFX1RBR05BTUVdOiBgXG5EVVBFX1RBR05BTUVcbkZhaWxlZCB0byByZWdpc3RlciBhIGN1c3RvbSBlbGVtZW50IHdpdGggdGhlIHRhZ25hbWUgJXMgYmVjYXVzZSBhbm90aGVyXG5jdXN0b20gZWxlbWVudCBpcyBhbHJlYWR5IGRlZmluZWQgd2l0aCB0aGF0IG5hbWUuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX1RBR05BTUVdOiBgXG5JTlZBTElEX1RBR05BTUVcbkZhaWxlZCB0byBkZXRlcm1pbmUgYSB2YWxpZCBIVE1MIFRhZyB0byB1c2Ugd2hlbiByZWdpc3RlcmluZyBhIGNvbXBvbmVudCBhcyBhXG5jdXN0b20gZWxlbWVudC4gU3BlY2lmeSBhIHN0YXRpYyByZWFkb25seSB0YWdOYW1lIHByb3BlcnR5IG9uIHlvdXIgY29tcG9uZW50XG5jbGFzcyBvciBwcm92aWRlIGEgdGFnTmFtZSBhcmd1bWVudCB0byBDb21wb25lbnQucmVnaXN0ZXIuXG5cbkFsdGVybmF0aXZlbHksIHlvdSBjYW4gZGlyZWN0bHkgcmVnaXN0ZXIgeW91ciBlbGVtZW50IGFzIHlvdSB3b3VsZCBhbnkgb3RoZXJcbkhUTUwgY3VzdG9tIGVsZW1lbnQ6IGN1c3RvbUVsZW1lbnRzLmRlZmluZShcIm15LXRhZ1wiLCBNeUNvbXBvbmVudENsYXNzKTtcbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1JU1NJTkdfRUxFTUVOVF06IGBcbk1JU1NJTkdfRUxFTUVOVFxuQW4gZWxlbWVudCB3YXMgZXhwZWN0ZWQgdG8gZXhpc3QgYnV0IHdhcyBub3QgZm91bmQgd2hlbiB0aGUgRE9NIHdhcyBxdWVyaWVkLlxuYCxcblxuICAgIFtFcnJvckNvZGUuTUlTU0lOR19TVEFURV06IGBcbk1JU1NJTkdfU1RBVEVcbkEgQ29tcG9uZW50J3MgcmVhY3RpdmUgc3RhdGUgd2FzIGFjY2Vzc2VkLCBidXQgbm8gaW5pdGlhbFN0YXRlIGlzIGRlZmluZWQgZm9yXG50aGUgQ29tcG9uZW50J3MgY2xhc3MuIEluaXRpYWwgc3RhdGUgbXVzdCBiZSBkZWZpbmVkIGFzIGFuIG9iamVjdCBvciBmdW5jdGlvbi5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfQ09OVEVOVF06IGBcbklOVkFMSURfQ09OVEVOVFxuVHJpZWQgdG8gc2V0IGEgdmFsdWUgYXMgY29udGVudCBpbiBhIHRlbXBsYXRlLCBidXQgdGhlIHZhbHVlIHdhcyBub3QgYSBzdXBwb3J0ZWRcbnR5cGUuIFZhbHVlcyBtdXN0IGJlIGEgc3RyaW5nLCBIVE1MRWxlbWVudC5cblxuSW5zdGVhZCwgZ290ICVzOiAlcy5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURdOiBgXG5URU1QTEFURV9JTlZBTElEXG5UaGUgdmFsdWUgJXMgY2Fubm90IGJlIGludGVycG9sYXRlZCB2aWEgdGhlIFRlbXBsYXRlIGh0bWwgc3RyaW5nIGhlbHBlci5cblZhbHVlcyBtYXkgb25seSBiZSBIVE1MVGVtcGxhdGVFbGVtZW50cyAodGVtcGxhdGUgY29udGVudCBpcyBhZG9wdGVkKSBvclxuc3RyaW5ncyAoc2hvcnRoYW5kIGZvciBhIDo6c3dhcCBkaXJlY3RpdmUgb24gYW4gZWxlbWVudClcbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT05dOiBgXG5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OXG5BIHRlbXBsYXRlIHZhbHVlIG5vdGF0aW9uIGZhaWxlZCB0byBwYXJzZS4gTm90YXRpb25zIG11c3QgYmVnaW4gd2l0aCBvbmUgb2ZcbkAsICQsICosIG9yICMsIGZvbGxvd2VkIGJ5IGEgZG90LXNlcGFyYXRlZCBwYXRoIG9mIGFjY2Vzc29yIG5hbWVzLiBPcHRpb25hbGx5LFxubm90YXRpb25zIG1heSBoYXZlIG1vZGlmaWVycyBhcm91bmQgdGhlbSwgc3VjaCBhcyB0aGUgTk9UKCkgbW9kaWZpZXIuXG5cblRoZSBub3RhdGlvbiB0aGF0IGZhaWxlZCB0byBwYXJzZSB3YXMgXCIlc1wiXG5gLFxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlRdOiBgXG5URU1QTEFURV9JTlZBTElEX0NPTVBPTkVOVFxuRmFpbGVkIHRvIGludGVycG9sYXRlIGEgQ29tcG9uZW50IGluIGFuIGh0bWwgdGVtcGxhdGUgc3RyaW5nIGR1ZSB0byB0aGVcbkNvbXBvbmVudCBoYXZpbmcgYW4gaW52YWxpZCB0YWdOYW1lIHByb3BlcnR5LlxuXG5Db21wb25lbnQgXCIlc1wiIGhhcyBhbiBpbnZhbGlkIHRhZ05hbWUgcHJvcGVydHkgXCIlc1wiXG4gICAgYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19MSVNUX1BBUkVOVF06IGBcblRFTVBMQVRFX01JU1NJTkdfTElTVF9QQVJFTlRcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIHByZXBhcmUgYW4gOjplYWNoIGRpcmVjdGl2ZSBiZWNhdXNlIG5vIHZhbGlkIHBhcmVudCBub2RlXG53YXMgZm91bmQgZm9yIHRoZSBsaXN0IHRvIHJlbmRlciBpbnRvLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9MSVNUXTogYFxuVEVNUExBVEVfSU5WQUxJRF9MSVNUXG5BIHRlbXBsYXRlIGZhaWxlZCB0byByZW5kZXIgYmVjYXVzZSBhbiA6OmVhY2ggZGlyZWN0aXZlIGZldGNoZWQgYSB2YWx1ZSB3aGljaFxud2FzIG5vdCBhbiBhcnJheSBvZiBhY3Rpb25hYmxlIGRhdGEuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PREVfUkVGXTogYFxuVEVNUExBVEVfSU5WQUxJRF9OT0RFX1JFRlxuQSB0ZW1wbGF0ZSBmYWlsZWQgdG8gcHJlcGFyZSBhIG5vZGUgZnJvbSBhIGNvbXBpbGVkIHNvdXJjZS4gVHlwaWNhbGx5LCB0aGlzXG5tZWFucyBzb21ldGhpbmcgaXMgYnJva2VuIHdpdGhpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUgcmF0aGVyIHRoYW4gYW4gZXJyb3Igd2l0aFxudGhlIHRlbXBsYXRlIGNvbnRlbnQgaXRzZWxmLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWV06IGBcblRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVlcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIGNvbXBpbGUgYmVjYXVzZSBhbiA6OmVhY2ggZGlyZWN0aXZlIHdhcyBmb3VuZCBvbiBhbiBlbGVtZW50XG53aXRob3V0IGEgY29ycmVzcG9uZGluZyA6OmtleSBkaXJlY3RpdmUuIDo6ZWFjaCBkaXJlY3RpdmVzIG11c3QgaGF2ZSBhIDo6a2V5XG5kaXJlY3RpdmUgc3BlY2lmaWVkIG9uIHRoZSBzYW1lIGVsZW1lbnQsIHdob3NlIG5vdGF0aW9uIGV2YWx1YXRlcyB0byBhIHVuaXF1ZVxudmFsdWUgZm9yIGVhY2ggaXRlbSBpbiB0aGUgbGlzdC5cblxuRXhhbXBsZTogPGxpIDo6ZWFjaD1cIiRpdGVtc1wiIDo6a2V5PVwiI2lkXCI+IC4uLiA8L2xpPlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZXTogYFxuVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZXG5BIGxpc3QgZmFpbGVkIHRvIHJlbmRlciBiZWNhdXNlIGl0ZW0ga2V5ICVzIGFwcGVhcmVkIG11bHRpcGxlIHRpbWVzIHdoZW5cbnJlc29sdmluZyBsaXN0IGl0ZW0ga2V5cy4gRWFjaCA6OmtleSBkaXJlY3RpdmUgbXVzdCByZWZlcmVuY2UgYSBub3RhdGlvbiB3aG9zZVxudmFsdWUgaXMgdW5pcXVlIGZvciBlYWNoIGxpc3QgaXRlbS5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfS0VZXTogYFxuSU5WQUxJRF9TVEFURV9LRVlcblRyaWVkIHRvIGFjY2VzcyBhIHN0YXRlIHByb3BlcnR5IHdoaWNoIGRvZXMgbm90IGV4aXN0XG5cbktleSBwYXRoOiAlc1xuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9TVEFURV9VUERBVEVdOiBgXG5JTlZBTElEX1NUQVRFX1VQREFURVxuQSBDb21wb25lbnQncyBzZXRTdGF0ZSgpIHdhcyBjYWxsZWQgd2l0aCBhIHZhbHVlIHdoaWNoIGNvdWxkIG5vdCBiZSBwYXRjaGVkIGluXG50byB0aGUgZXhpc3RpbmcgY29tcG9uZW50IHN0YXRlLlxuXG5zZXRTdGF0ZSgpIHRha2VzIGEgcGFydGlhbCBvYmplY3QgZGVzY3JpYmluZyBzdGF0ZSBrZXlzIHRvIHVwZGF0ZS5cblxuSW5zdGVhZCwgcmVjZWl2ZWQ6ICVzXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5TVEFURV9MT0NLRURdOiBgXG5TVEFURV9MT0NLRURcbkEgU3RhdGUgcmVjZWl2ZWQgYSByZXF1ZXN0IHRvIHVwZGF0ZSBvciBsb2NrIHdoaWxlIGFscmVhZHkgbG9ja2VkLlxuU3RhdGVzIG1heSBiZSBsb2NrZWQgdXNpbmcgdGhlIC5sb2NrKCkgbWV0aG9kIGFuZCB1bmxvY2tlZCB1c2luZyB0aGUgLnVubG9jaygpXG5tZXRob2QuIFN0YXRlcyBsb2NrIGR1cmluZyBhc3luYyBtdXRhdGlvbnMgZG9uZSB0aHJvdWdoIHRoZSAubXV0YXRlQXN5bmMoKVxubWV0aG9kIGlmIFwidHJ1ZVwiIGlzIHBhc3NlZCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci5cblxuWW91IGNhbiBjaGVjayB0aGUgbG9jayBzdGF0dXMgb2YgYSBTdGF0ZSBpbnN0YW5jZSB3aXRoIC5pc0xvY2tlZFxuYCxcblxuICAgIFtFcnJvckNvZGUuTUFYX1NFUVVFTlRJQUxfUkVOREVSU106IGBcbk1BWF9TRVFVRU5USUFMX1JFTkRFUlNcbkEgY29tcG9uZW50IGhhcyBlcnJvcmVkIGFmdGVyIHJlLXJlbmRlcmluZyBtb3JlIHRoYW4gJXMgdGltZXMgaW4gdGhlIHNhbWUgZnJhbWUuXG5cblRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgYmVjYXVzZSBzdGF0ZSBvciBsaXZlIGF0dHJpYnV0ZXMgYXJlIGJlaW5nIG1vZGlmaWVkXG5kdXJpbmcgYSByZW5kZXIgbGlmZWN5Y2xlIG1ldGhvZCBzdWNoIGFzIGJlZm9yZVVwZGF0ZSgpIG9yIGFmdGVyVXBkYXRlKCkuIElmXG5zdGF0ZSBjaGFuZ2VzIHVuY29uZGl0aW9uYWxseSBkdXJpbmcgYSByZW5kZXIsIHRoZSByZW5kZXIgd2lsbCBpbmZpbml0ZWx5IGxvb3AuXG5VcGRhdGluZyByZW5kZXIgc291cmNlIGRhdGEgZHVyaW5nIGEgcmVuZGVyIGN5Y2xlIGlzIHN1cHBvcnRlZCwgYnV0IGluZmluaXRlXG51cGRhdGUgbG9vcHMgbWF5IG9jY3VyIGlmIHVuY2hlY2tlZC5cbmAsXG4gIH07XG5cbiAgcmV0dXJuIERFVl9FUlJPUl9JTkZPW2NvZGVdO1xufVxuXG4vKipcbiAqIEFuIGVycm9yIG9yaWdpbmF0aW5nIGZyb20gd2l0aGluIGEgUGFsZXR0ZSBzdWJzeXN0ZW0uXG4gKlxuICogSW4gdGhlIGBkZXZlbG9wbWVudGAgZW52aXJvbm1lbnQsIHRoZSBlcnJvciB3aWxsIHN1cmZhY2Ugd2l0aCBleHRlbmRlZCBpbmZvXG4gKiBhYm91dCB0aGUgZXJyb3IgYW5kIGFueSBkZXRhaWxzIHdoaWNoIG1heSBiZSByZWxldmFudCB0byBoZWxwIHdpdGggZGVidWdnaW5nLlxuICpcbiAqIEluIHRoZSBgcHJvZHVjdGlvbmAgZW52aXJvbm1lbnQsIGEgbWluaW1hbCBlcnJvciBvbmx5IHN1cmZhY2luZyB0aGUgbnVtZXJpY1xuICogZXJyb3IgY29kZSBpcyB0aHJvd24gaW5zdGVhZC5cbiAqXG4gKiBDb2RlcyBhcmUgY2F0ZWdvcml6ZWQgaW50byBncm91cHMgYnkgdGhlIDEwMCdzOlxuICpcbiAqIC0gMCAtIDk5OiBJbnZhcmlhbnRzXG4gKiAtIDEwMCAtIDE5OTogQ3VzdG9tIEVsZW1lbnRzIC8gRW52aXJvbm1lbnQgRXJyb3JzXG4gKiAtIDIwMCAtIDI5OTogVGVtcGxhdGluZyBFcnJvcnNcbiAqIC0gMzAwIC0gMzk5OiBSdW50aW1lIEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgUGFsZXR0ZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBuYW1lID0gXCJQYWxldHRlRXJyb3JcIjtcbiAgY29kZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvZGU6IG51bWJlciwgLi4udmFsdWVzOiBzdHJpbmdbXSkge1xuICAgIGxldCBtZXNzYWdlID0gYENvZGU6ICR7Y29kZX1gO1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBtZXNzYWdlICs9IGdldERldkVycm9yKGNvZGUpO1xuXG4gICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZXMpIHtcbiAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZShgJXNgLCBTdHJpbmcodmFsKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbi8qKlxuICogQHJldHVybnMgQW4gYXJyYXkgb2Yge0BsaW5rIENTU1N0eWxlU2hlZXR9cyBjb250YWluaW5nIHRoZSBwcm92aWRlZCBDU1NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzcyhcbiAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksXG4gIC4uLnZhbHVlczogdW5rbm93bltdXG4pOiBDU1NTdHlsZVNoZWV0IHtcbiAgbGV0IHJlc3VsdCA9IHN0cmluZ3NbMF0gPz8gXCJcIjtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG5leHRWYWwgPSB2YWx1ZXNbaV0gPz8gXCJcIjtcbiAgICBjb25zdCBuZXh0U3RyID0gc3RyaW5nc1tpICsgMV0gPz8gXCJcIjtcbiAgICByZXN1bHQgKz0gYCR7bmV4dFZhbH0ke25leHRTdHJ9YDtcbiAgfVxuXG4gIGNvbnN0IHNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKTtcbiAgc2hlZXQucmVwbGFjZVN5bmMocmVzdWx0KTtcbiAgcmV0dXJuIHNoZWV0O1xufVxuXG50eXBlIENsYXNzVmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCB1bmRlZmluZWRcbiAgfCBudWxsXG4gIHwgQ2xhc3NBcnJheVxuICB8IENsYXNzT2JqZWN0O1xudHlwZSBDbGFzc0FycmF5ID0gQ2xhc3NWYWx1ZVtdO1xudHlwZSBDbGFzc09iamVjdCA9IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbi8qKlxuICogR2l2ZW4gZmxleGlibGUgaW5wdXQsIGdlbmVyYXRlIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBzZXR0aW5nIGFzIGFuIGh0bWwgY2xhc3NcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzaWZ5KFwibXktY2xhc3NcIiwgXCJhbm90aGVyLWNsYXNzXCIpIC8vIFwibXktY2xhc3MgYW5vdGhlci1jbGFzc1wiXG4gKiBjbGFzc2lmeShbXCJteS1jbGFzc1wiLCBcImFub3RoZXItY2xhc3NcIl0pIC8vIFwibXktY2xhc3MgYW5vdGhlci1jbGFzc1wiXG4gKiBjbGFzc2lmeSh7IGVuYWJsZWQ6IHRydWUsIGRpc2FibGVkOiBmYWxzZSB9KSAvLyBcImVuYWJsZWRcIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeSguLi5hcmdzOiBDbGFzc1ZhbHVlW10pOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0U3RyaW5nID0gXCJcIjtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJncy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBhcmd1bWVudCA9IGFyZ3NbaW5kZXhdO1xuXG4gICAgaWYgKCFhcmd1bWVudCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gU3RyaW5ncy9udW1zIC0+IERpcmVjdCBhcHBlbmRcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBhcmd1bWVudCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHJlc3VsdFN0cmluZykge1xuICAgICAgICByZXN1bHRTdHJpbmcgKz0gXCIgXCI7XG4gICAgICB9XG4gICAgICByZXN1bHRTdHJpbmcgKz0gYXJndW1lbnQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYXJyYXlzIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnQpKSB7XG4gICAgICBjb25zdCBuZXN0ZWRSZXN1bHQgPSBjbGFzc2lmeSguLi5hcmd1bWVudCk7XG4gICAgICBpZiAobmVzdGVkUmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHRTdHJpbmcpIHtcbiAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gXCIgXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0U3RyaW5nICs9IG5lc3RlZFJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBvYmplY3RzIHdpdGggY29uZGl0aW9uYWwgY2xhc3MgbmFtZXNcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGNsYXNzTmFtZSBpbiBhcmd1bWVudCkge1xuICAgICAgICAvLyBPbmx5IGluY2x1ZGUgY2xhc3MgbmFtZSBpZiBpdHMgdmFsdWUgaXMgdHJ1dGh5XG4gICAgICAgIGlmIChhcmd1bWVudFtjbGFzc05hbWVdKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdFN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0U3RyaW5nICs9IFwiIFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gY2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFN0cmluZztcbn1cbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5cbi8qKiBBbiBhdHRyaWJ1dGUgdmFsdWUgYXMgcmVhZCBmcm9tIGEgRE9NIGVsZW1lbnQgKi9cbnR5cGUgQXR0cmlidXRlVmFsdWUgPSBzdHJpbmcgfCBudWxsO1xuXG4vKiogQSBNYXAgb2Ygc3RyaW5nIGF0dHJpYnV0ZSBuYW1lcyB0byB7QGxpbmsgQXR0cmlidXRlVmFsdWV9ICovXG50eXBlIEF0dHJpYnV0ZU1hcCA9IE1hcDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWx1ZTogdW5rbm93bik6IEF0dHJpYnV0ZVZhbHVlIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBmYWxzZSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF0dHJpYnV0ZU1hcChcbiAgc291cmNlOiBvYmplY3QgfCBNYXA8c3RyaW5nLCB1bmtub3duPiB8IEhUTUxFbGVtZW50LFxuKTogQXR0cmlidXRlTWFwIHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHNvdXJjZS5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBtYXAuc2V0KG5hbWUsIHNlcmlhbGl6ZUF0dHJpYnV0ZShzb3VyY2UuZ2V0QXR0cmlidXRlKG5hbWUpKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBpZiAoc291cmNlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHNvdXJjZSkge1xuICAgICAgbWFwLnNldChrZXksIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiICYmIHNvdXJjZSAhPT0gbnVsbCkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKSB7XG4gICAgICBtYXAuc2V0KGtleSwgc2VyaWFsaXplQXR0cmlidXRlKHZhbCkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QXR0cmlidXRlTWFwKFxuICB0YXJnZXQ6IEhUTUxFbGVtZW50LFxuICBhdHRyczogQXR0cmlidXRlTWFwLFxuKTogdm9pZCB7XG4gIGNvbnN0IGN1cnJlbnROYW1lcyA9IG5ldyBTZXQodGFyZ2V0LmdldEF0dHJpYnV0ZU5hbWVzKCkpO1xuICBjb25zdCBpbmNvbWluZ05hbWVzID0gbmV3IFNldChhdHRycy5rZXlzKCkpO1xuICBjb25zdCBhdHRyaWJ1dGVzVG9SZW1vdmUgPSBjdXJyZW50TmFtZXMuZGlmZmVyZW5jZShpbmNvbWluZ05hbWVzKTtcblxuICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0cmlidXRlc1RvUmVtb3ZlKSB7XG4gICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW25hbWUsIHZhbF0gb2YgYXR0cnMpIHtcbiAgICBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbCk7XG4gICAgfVxuICB9XG59XG4iLAogICAgIi8qXG4gKiBDb3B5cmlnaHQgwqkgUnVzdGljIEFyY2FkZSwgTExDIDIwMjZcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbi8qKlxuICogR2l2ZW4gYW4gZWxlbWVudCwgcmVwbGFjZSBpdCB3aXRoIGEgZGlmZmVyZW50IHRhZywgYWRvcHRpbmcgYWxsIGF0dHJpYnV0ZXNcbiAqIGFuZCBjaGlsZCBlbGVtZW50cy5cbiAqIEBwYXJhbSAkdGFyZ2V0IFRoZSBlbGVtZW50IHRvIHN3YXAgb3V0XG4gKiBAcGFyYW0gbmV3VGFnIFRoZSBuZXcgSFRNTCB0YWdOYW1lIHRvIHVzZVxuICogQHJldHVybnMgVGhlIG5ld2x5IHN3YXBwZWQtaW4gZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhbmdlVGFnKCR0YXJnZXQ6IEhUTUxFbGVtZW50LCBuZXdUYWc6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgY29uc3QgJG5ld0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuZXdUYWcpO1xuXG4gIHdoaWxlICgkdGFyZ2V0LmZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAkbmV3RWwuYXBwZW5kQ2hpbGQoJHRhcmdldC5maXJzdENoaWxkKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgYXR0ck5hbWUgb2YgJHRhcmdldC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgY29uc3QgdmFsID0gJHRhcmdldC5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuXG4gICAgaWYgKHZhbCAhPT0gbnVsbCkge1xuICAgICAgJG5ld0VsLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgdmFsKTtcbiAgICB9XG4gIH1cblxuICAkdGFyZ2V0LnJlcGxhY2VXaXRoKCRuZXdFbCk7XG4gIHJldHVybiAkbmV3RWw7XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IHsgQ2hhckNvZGVzIH0gZnJvbSBcIi4vY2hhcmFjdGVyLWNvZGVzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RhZ05hbWUoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBFbnN1cmUgdGhlIGNoYXJhY3RlciBjb2RlIGlzIGEgbGV0dGVyIG9yIGh5cGhlblxuICAgIGNvbnN0IGNoYXIgPSBzdHIuY2hhckNvZGVBdChpKTtcblxuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIGNoYXIgPT09IENoYXJDb2Rlcy5IeXBoZW4gfHxcbiAgICAgICAgKGNoYXIgPj0gQ2hhckNvZGVzLkEgJiYgY2hhciA8PSBDaGFyQ29kZXMuWikgfHxcbiAgICAgICAgKGNoYXIgPj0gQ2hhckNvZGVzLmEgJiYgY2hhciA8PSBDaGFyQ29kZXMueilcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBBIHBlcmZvcm1hbmNlIG9wdGltaXplZCB2ZXJzaW9uIG9mIGAubWF0Y2hlcygpYCB3aGljaCBpbmNsdWRlcyBmYXN0ZXJcbiAqIG1hdGNoaW5nIHN0cmF0ZWdpZXMgZm9yIGNvbW1vbiBxdWVyaWVzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPcHRpbWl6ZWQgcXVlcnkgdHlwZXM6XG4gKlxuICogLSBTaW5nbGUgSUQgc2VsZWN0b3IgYFwiI2lkZW50aWZpZXJcImBcbiAqIC0gU2luZ2xlIGNsYXNzIHNlbGVjdG9yIGBcIi5jbGFzc25hbWVcImBcbiAqIC0gVGFnbmFtZSBzZWxlY3RvciBgXCJidXR0b25cImBcbiAqIC0gU2ltcGxlIGF0dHJpYnV0ZSBzZWxlY3RvciBgXCJbYXR0cj0ndmFsdWUnXVwiYFxuICpcbiAqIEFsbCBvdGhlciB0eXBlcyBvZiBxdWVyaWVzIHVzZSB0aGUgYmFzZSAubWF0Y2hlcygpIGZvciBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbGVtZW50TWF0Y2hlcyhlbGVtZW50OiBFbGVtZW50LCBxdWVyeTogc3RyaW5nKSB7XG4gIC8vIElmIHRoZSBxdWVyeSBpcyBhIHNpbXBsZSBJRCwgY2hlY2sgaXQgZGlyZWN0bHlcbiAgaWYgKFxuICAgIHF1ZXJ5WzBdID09PSBcIiNcIiAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCIgXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCIuXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCJbXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCI6XCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCI+XCIpID09PSAtMVxuICApIHtcbiAgICByZXR1cm4gZWxlbWVudC5pZCA9PT0gcXVlcnkuc2xpY2UoMSk7XG4gIH1cblxuICAvLyBJZiB0aGUgcXVlcnkgaXMgYSBzaW1wbGUgY2xhc3NuYW1lLCBjaGVjayBpdCBkaXJlY3RseVxuICBpZiAoXG4gICAgcXVlcnlbMF0gPT09IFwiLlwiICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIiBcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIiNcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIltcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIjpcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIj5cIikgPT09IC0xXG4gICkge1xuICAgIHJldHVybiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhxdWVyeS5zbGljZSgxKSk7XG4gIH1cblxuICAvLyBJZiB0aGUgcXVlcnkgaXMgZm9yIGp1c3QgYSB0YWduYW1lLCBjaGVjayBpdCBkaXJlY3RseVxuICBpZiAoaXNUYWdOYW1lKHF1ZXJ5KSkge1xuICAgIHJldHVybiBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIC8vIElmIHRoZSBxdWVyeSBpcyBmb3IgYSBzaW5nbGUgc2VsZWN0b3IgdmFsdWUsIGNoZWNrIGl0IGRpcmVjdGx5XG4gIGlmIChcbiAgICBxdWVyeVswXSA9PT0gXCJbXCIgJiZcbiAgICBxdWVyeVtxdWVyeS5sZW5ndGggLSAxXSA9PT0gXCJdXCIgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiIFwiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiOlwiKSA9PT0gLTFcbiAgKSB7XG4gICAgY29uc3QgYXR0ciA9IHF1ZXJ5LnNsaWNlKDEsIC0xKTtcbiAgICBjb25zdCBlcUluZGV4ID0gYXR0ci5pbmRleE9mKFwiPVwiKTtcbiAgICBpZiAoZXFJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyKTtcbiAgICB9XG4gICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyLnNsaWNlKDAsIGVxSW5kZXgpO1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGF0dHIuc2xpY2UoZXFJbmRleCArIDEpLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgXCJcIik7XG4gICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKSA9PT0gYXR0clZhbHVlO1xuICB9XG5cbiAgLy8gT3RoZXJ3aXNlLCB1c2UgbmF0aXZlIGAubWF0Y2hlc2AgZm9yIGNvbXBsZXggc3R1ZmZcbiAgcmV0dXJuIGVsZW1lbnQubWF0Y2hlcyhxdWVyeSk7XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xudHlwZSBNZXRyaWNzID0ge1xuICBoaXRzOiBudW1iZXI7XG4gIG1pc3NlczogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTFJVQ2FjaGVNZXRyaWNzID0ge1xuICBsb29rdXBzOiBudW1iZXI7XG4gIGhpdHM6IG51bWJlcjtcbiAgbWlzc2VzOiBudW1iZXI7XG4gIGNhcGFjaXR5OiBudW1iZXI7XG4gIGVudHJpZXM6IG51bWJlcjtcbiAgaGl0UmF0ZTogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBBIHNpbXBsZSBpbi1tZW1vcnkgTFJVIENhY2hlIHVzaW5nIEphdmFTY3JpcHQgbWFwcy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIENhY2hlZCBuZXR3b3JrIHJlcXVlc3RcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBBIGNhY2hlIG9mIEFQSSBVUkxzIHRvIHRoZWlyIHJldHVybmVkIHBheWxvYWRzXG4gKiBjb25zdCBjYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIEFQSVBheWxvYWQ+KCk7XG4gKlxuICogYXN5bmMgZnVuY3Rpb24gbWFrZVJlcXVlc3QodXJsOiBzdHJpbmcpIHtcbiAqICAgbGV0IGNhY2hlZCA9IGNhY2hlLmdldCh1cmwpO1xuICogICBpZiAoY2FjaGVkKSB7XG4gKiAgICAgcmV0dXJuIGNhY2hlZDtcbiAqICAgfVxuICpcbiAqICAgLy8gLi4uIE1ha2UgdGhlIHJlcXVlc3QgYW5kIGNhY2hlLnNldCgpIHRoZSByZXNwb25zZVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBMUlVDYWNoZTxLLCBWPiB7XG4gIHByaXZhdGUgX21heFNpemU6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZGF0YTogTWFwPEssIFY+O1xuICBwcml2YXRlIF9tZXRyaWNzOiBNZXRyaWNzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAgfTtcblxuICBjb25zdHJ1Y3RvcihtYXhTaXplOiBudW1iZXIgPSA1MDApIHtcbiAgICBpZiAobWF4U2l6ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMUlUgQ2FjaGUgY2FwYWNpdHkgbXVzdCBiZSA+PSAxXCIpO1xuICAgIH1cblxuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICB0aGlzLl9tZXRyaWNzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXhTaXplID0gbWF4U2l6ZTtcbiAgICB0aGlzLl9kYXRhID0gbmV3IE1hcDxLLCBWPigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJpbSA9ICgpID0+IHtcbiAgICB3aGlsZSAodGhpcy5fZGF0YS5zaXplID4gdGhpcy5fbWF4U2l6ZSkge1xuICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLl9kYXRhLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAoZmlyc3RLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBYnN1cmRcIik7XG4gICAgICB9XG4gICAgICB0aGlzLl9kYXRhLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgY2FjaGUgcGVyZm9ybWFuY2UgbWV0cmljcyBmcm9tIHRoaXMgTFJVIENhY2hlIGluc3RhbmNlLlxuICAgKlxuICAgKiBJbiBkZXZlbG9wbWVudCBtb2RlLCB0aGlzIHJldHVybnMgaW5zaWdodHMgaW50byBoaXRzL21pc3NlcyBvZiB0aGUgY2FjaGUsXG4gICAqIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhbmQgZW50cnkgY291bnQuXG4gICAqXG4gICAqIEluIHByb2R1Y3Rpb24gbW9kZSwgdGhpcyByZXR1cm5zIGEgcGxhY2Vob2xkZXIgb2JqZWN0LCBhcyBtZXRyaWMgY29sbGVjdGlvblxuICAgKiBpcyBub3QgYWN0aXZlIGluIHByb2R1Y3Rpb24uXG4gICAqL1xuICBnZXQgbWV0cmljcygpOiBMUlVDYWNoZU1ldHJpY3Mge1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBjb25zdCB7IGhpdHMgPSAwLCBtaXNzZXMgPSAwIH0gPSB0aGlzLl9tZXRyaWNzID8/IHt9O1xuICAgICAgY29uc3QgbG9va3VwcyA9IGhpdHMgKyBtaXNzZXM7XG4gICAgICBjb25zdCBoaXRSYXRlID0gbG9va3VwcyA9PT0gMCA/IDAgOiBoaXRzIC8gbG9va3VwcztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9va3VwcyxcbiAgICAgICAgaGl0czogaGl0cyxcbiAgICAgICAgbWlzc2VzOiBtaXNzZXMsXG4gICAgICAgIGNhcGFjaXR5OiB0aGlzLl9tYXhTaXplLFxuICAgICAgICBlbnRyaWVzOiB0aGlzLl9kYXRhLnNpemUsXG4gICAgICAgIGhpdFJhdGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsb29rdXBzOiAwLFxuICAgICAgaGl0czogMCxcbiAgICAgIG1pc3NlczogMCxcbiAgICAgIGNhcGFjaXR5OiAwLFxuICAgICAgZW50cmllczogMCxcbiAgICAgIGhpdFJhdGU6IDAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIG1heGltdW0gY2FjaGUgc2l6ZSBmb3IgdGhpcyBpbnN0YW5jZS4gSW1tZWRpYXRlbHkgdHJpZ2dlcnMgYVxuICAgKiBwdXJnZSBvZiBjYWNoZWQgY29udGVudHMgaWYgdGhlIG5ldyBjYXBhY2l0eSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnRcbiAgICogbnVtYmVyIG9mIGNhY2hlZCBlbnRyaWVzLlxuICAgKi9cbiAgc2V0Q2FwYWNpdHkgPSAobWF4U2l6ZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgaWYgKG1heFNpemUgPD0gMCAmJiBfX0RFVl9fKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW1BhbGV0dGUgTFJVIENhY2hlXSBDYWNoZSBzaXplIGlzIDw9IDAuIENhY2hlIGlzIGRpc2FibGVkLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXhTaXplID0gbWF4U2l6ZTtcbiAgICB0aGlzLl90cmltKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgdmFsdWUgZnJvbSB0aGUgY2FjaGUsIHJldHVybmluZyBgdW5kZWZpbmVkYCBpZiBubyB2YWx1ZSB3YXMgZm91bmRcbiAgICovXG4gIGdldChrZXk6IEspOiBWIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGEuZ2V0KGtleSk7XG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgdGhpcy5fbWV0cmljcy5taXNzZXMgKz0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIGFuZCByZS1zZXQgdGhlIHZhbHVlIHRvIG1vdmUgdGhlIGtleSB0byB0aGUgZW5kIG9mIHRoZSBrZXkgbGlzdFxuICAgIHRoaXMuX2RhdGEuZGVsZXRlKGtleSk7XG4gICAgdGhpcy5fZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG5cbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgdGhpcy5fbWV0cmljcy5oaXRzICs9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHZhbHVlIGluIHRoZSBjYWNoZS4gVGhpcyBhbHNvIG1vdmVzIHRoZSB2YWx1ZSB0byB0aGUgYmFjayBvZiB0aGUgbGlzdFxuICAgKiBvZiB2YWx1ZXMgdG8gY29uc2lkZXIgZXZpY3Rpbmcgd2hlbiB0aGUgY2FjaGUgaXMgZnVsbC5cbiAgICovXG4gIHNldChrZXk6IEssIHZhbHVlOiBWKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGlmIGV4aXN0cyB0byB1cGRhdGUgcG9zaXRpb25cbiAgICBpZiAodGhpcy5fZGF0YS5oYXMoa2V5KSkge1xuICAgICAgdGhpcy5fZGF0YS5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRhLnNldChrZXksIHZhbHVlKTtcblxuICAgIGlmICh0aGlzLl9kYXRhLnNpemUgPiB0aGlzLl9tYXhTaXplKSB7XG4gICAgICB0aGlzLl90cmltKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjb250ZW50cyBvZiB0aGlzIGNhY2hlIGluc3RhbmNlXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRhLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIGNhY2hlIGluc3RhbmNlXG4gICAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnNpemU7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTFJVQ2FjaGU7XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IExSVUNhY2hlIGZyb20gXCIuL2xydS1jYWNoZVwiO1xuXG5leHBvcnQgY29uc3QgZnJhZ21lbnRDYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIERvY3VtZW50RnJhZ21lbnQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBodG1sVG9GcmFnbWVudChodG1sOiBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgY29uc3QgbG9va3VwID0gZnJhZ21lbnRDYWNoZS5nZXQoaHRtbCk7XG5cbiAgaWYgKGxvb2t1cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGxvb2t1cC5jbG9uZU5vZGUodHJ1ZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgfVxuXG4gIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gIHRlbXAuaW5uZXJIVE1MID0gaHRtbDtcbiAgZnJhZ21lbnRDYWNoZS5zZXQoaHRtbCwgdGVtcC5jb250ZW50KTtcbiAgcmV0dXJuIHRlbXAuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiI2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5pbXBvcnQgeyBpc1RhZ05hbWUgfSBmcm9tIFwiI3V0aWxcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGVtcGxhdGVTdHJpbmdWYWx1ZShcbiAgdmFsOiBzdHJpbmcgfCB0eXBlb2YgQ29tcG9uZW50IHwgSFRNTFRlbXBsYXRlRWxlbWVudCxcbik6IHN0cmluZyB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgcmV0dXJuIHZhbC5pbm5lckhUTUw7XG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIHZhbCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgKHZhbC5wcm90b3R5cGUgaW5zdGFuY2VvZiBDb21wb25lbnQgfHwgdmFsID09PSBDb21wb25lbnQpXG4gICkge1xuICAgIGNvbnN0IHRhZ05hbWUgPSB2YWwudGFnTmFtZTtcbiAgICBpZiAoIWlzVGFnTmFtZSh0YWdOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfQ09NUE9ORU5ULFxuICAgICAgICB2YWwubmFtZSxcbiAgICAgICAgdmFsLnRhZ05hbWUsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGFnTmFtZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGA8c3BhbiA6OnN3YXA9XCIke3ZhbH1cIj48L3NwYW4+YDtcbiAgfVxuXG4gIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSUQsIFN0cmluZyh2YWwpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4ge0BsaW5rIEhUTUxUZW1wbGF0ZUVsZW1lbnR9IGZyb20gdGhlIHByb3ZpZGVkIEhUTUwgc3RyaW5nLlxuICpcbiAqIFRoZXNlIEhUTUwgVGVtcGxhdGVzIGNhbiBiZSB1c2VkIGFzIHN0YW5kYXJkIEhUTUwgVGVtcGxhdGVzLCBvciBhcyB0aGVcbiAqIGZvdW5kYXRpb24gZm9yIGEge0BsaW5rIENvbXBvbmVudH0gb3Igc3RhbmRhbG9uZSB7QGxpbmsgVGVtcGxhdGV9XG4gKlxuICogSW50ZXJwb2xhdGVzIHZhbHVlcyBpbiB0aGUgdGVtcGxhdGUgc3RyaW5nIHRvIHByb3ZpZGUgaGVscGVycyBmb3IgY29tcG9zaW5nXG4gKiB0ZW1wbGF0ZXM6XG4gKlxuICogLSBIVE1MVGVtcGxhdGVFbGVtZW50IHJlZmVyZW5jZXMgYXJlIHNlcmlhbGl6ZWQgdG8gSFRNTCBhbmQgaW5saW5lZFxuICogLSBTdHJpbmdzIGFyZSBtb2RpZmllZCB0byBiZWNvbWUgPHNwYW4+IHRhZ3Mgd2l0aCB0aGUgOjpzd2FwIGRpcmVjdGl2ZSBzZXRcbiAqICAgdG8gdGhlIHN0cmluZyB2YWx1ZS4gVGhpcyBpcyBoZWxwZnVsIHNob3J0aGFuZCBmb3IgY29udGVudCBwbGFjZWhvbGRlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBUaGlzIHRlbXBsYXRlIHN0cmluZ1xuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0ICR0ZW1wbGF0ZSA9IGh0bWxgXG4gKiA8ZGl2IDpjbGFzcz1cIipjbGFzc25hbWVzXCI+XG4gKiAgICR7XCJAY29udGVudFwifVxuICogPC9kaXY+XG4gKiBgXG4gKiBgYGBcbiAqXG4gKiBQcm9kdWNlcyB0aGlzIHRlbXBsYXRlIGVsZW1lbnQgKHBvcnRyYXllZCBhcyBIVE1MKVxuICpcbiAqIGBgYGh0bWxcbiAqIDx0ZW1wbGF0ZT5cbiAqICAgPGRpdiA6Y2xhc3M9XCIqY2xhc3NuYW1lc1wiPlxuICogICAgIDxzcGFuIDo6c3dhcD1cIkBjb250ZW50XCI+PC9zcGFuPlxuICogICA8L2Rpdj5cbiAqIDwvdGVtcGxhdGU+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh0bWwoXG4gIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LFxuICAuLi52YWx1ZXM6IChcbiAgICB8IGBAJHtzdHJpbmd9YFxuICAgIHwgYCQke3N0cmluZ31gXG4gICAgfCBgIyR7c3RyaW5nfWBcbiAgICB8IGAqJHtzdHJpbmd9YFxuICAgIHwgSFRNTFRlbXBsYXRlRWxlbWVudFxuICAgIHwgdHlwZW9mIENvbXBvbmVudDxhbnk+XG4gIClbXVxuKTogSFRNTFRlbXBsYXRlRWxlbWVudCB7XG4gIGNvbnN0IGZ1bGxTdHJpbmcgPSBzdHJpbmdzLnJlZHVjZSgoYWNjLCBzdHIsIGkpID0+IHtcbiAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IHZhbHVlc1tpXVxuICAgICAgPyBgJHtwYXJzZVRlbXBsYXRlU3RyaW5nVmFsdWUodmFsdWVzW2ldKX1gXG4gICAgICA6IFwiXCI7XG4gICAgcmV0dXJuIGFjYyArIHN0ciArIHBhcnNlZFZhbHVlO1xuICB9LCBcIlwiKTtcblxuICBjb25zdCB0ZW1wbGF0ZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gIHRlbXBsYXRlRWxlbWVudC5pbm5lckhUTUwgPSBmdWxsU3RyaW5nO1xuICByZXR1cm4gdGVtcGxhdGVFbGVtZW50O1xufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5cbmV4cG9ydCB0eXBlIFN0YXRlTGlzdGVuZXI8U2hhcGU+ID0gKHN0YXRlOiBTaGFwZSkgPT4gdm9pZDtcblxuY29uc3QgUFJPWFlfREVQVEhfV0FSTklOR19MSU1JVCA9IDQ7XG5cbmNvbnN0IEFycmF5TXV0YXRvckZ1bmN0aW9ucyA9IG5ldyBTZXQoW1xuICBcInB1c2hcIixcbiAgXCJwb3BcIixcbiAgXCJzaGlmdFwiLFxuICBcInVuc2hpZnRcIixcbiAgXCJzcGxpY2VcIixcbiAgXCJzb3J0XCIsXG4gIFwicmV2ZXJzZVwiLFxuICBcImZpbGxcIixcbiAgXCJjb3B5V2l0aGluXCIsXG5dKTtcblxuY29uc3QgRGF0YVN0cnVjdHVyZU11dGF0b3JGdW5jdGlvbnMgPSBuZXcgU2V0KFtcbiAgXCJhZGRcIixcbiAgXCJkZWxldGVcIixcbiAgXCJjbGVhclwiLFxuICBcInNldFwiLFxuXSk7XG5cbi8qKlxuICogUG93ZXJmdWwgYW5kIGZsZXhpYmxlIHN0YXRlIG1hbmFnZW1lbnQgd2l0aCBkZWVwIHJlYWN0aXZpdHksIHRyYW5zYWN0aW9uLCBhbmRcbiAqIGxvY2tpbmcgc3VwcG9ydC5cbiAqXG4gKiBUaGUgU3RhdGUgY2xhc3Mgd3JhcHMgc3RhdGVmdWwgZGF0YSBhbmQgcHJvdmlkZXMgYW4gQVBJIGZvciBtdXRhdGluZyB0aGUgZGF0YVxuICogd2hpbGUgbGlzdGVuZXJzIHN1YnNjcmliZSB0byBtZWFuaW5nZnVsIHVwZGF0ZXMuXG4gKlxuICogTW9kaWZ5IHN0YXRlIHdpdGggc2V0dGVycywgbXV0YXRvcnMsIHRyYW5zYWN0aW9ucywgb3IgcHJveGllZCB1cGRhdGVzIHdpdGhcbiAqIGRlZXAgcmVhY3Rpdml0eSBhbmQgYXJyYXkgbXV0YXRpb24gc3VwcG9ydCBidWlsdCBpbi5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHN0YXRlID0gbmV3IFN0YXRlKHtjb3VudDogMX0pO1xuICogc3RhdGUuYWRkTGlzdGVuZXIoZGF0YSA9PiBjb25zb2xlLmxvZyhkYXRhKSlcbiAqXG4gKiBzdGF0ZS5zZXQoXCJjb3VudFwiLCAyKTsgLy8gUHJpbnRzIFwiMlwiXG4gKiBzdGF0ZS5zZXQoXCJjb3VudFwiLCAyKTsgLy8gTm90aGluZyBoYXBwZW5zLCBubyBjaGFuZ2VcbiAqIHN0YXRlLmxpdmUuY291bnQgPSAzOyAvLyBQcmludHMgXCIzXCJcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU3RhdGU8U2hhcGUgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgcHJpdmF0ZSBfZGF0YTogU2hhcGU7XG4gIHByaXZhdGUgX2xpc3RlbmVyczogU2V0PFN0YXRlTGlzdGVuZXI8U2hhcGU+PiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBfcHJveHk/OiBTaGFwZTtcbiAgcHJpdmF0ZSBfcHJveHlDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgYW55PigpO1xuICBwcml2YXRlIF9yZXZlcnNlUHJveHlDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgb2JqZWN0PigpO1xuICBwcml2YXRlIF9pc0xvY2tlZCA9IGZhbHNlO1xuXG4gIC8vIE9ubHkgYWxsb3cgd2FybmluZyBpbiBkZXYgbW9kZSwgYW5kIG9ubHkgcHJpbnQgdGhlIHdhcm5pbmcgb25jZSBwZXIgaW5zdFxuICBwcml2YXRlIF9oYXNXYXJuZWQgPSAhX19ERVZfXztcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsRGF0YTogU2hhcGUsIG9uQ2hhbmdlPzogU3RhdGVMaXN0ZW5lcjxTaGFwZT4pIHtcbiAgICB0aGlzLl9kYXRhID0gaW5pdGlhbERhdGE7XG4gICAgdGhpcy5nZXQgPSB0aGlzLmdldC5iaW5kKHRoaXMpO1xuXG4gICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuYWRkKG9uQ2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGF6aWx5IGNyZWF0ZSBhbmQgY2FjaGUgcHJveGllcyBpbnRvIHRoZSBzdGF0ZSBmb3IgcmVhY3RpdmUgdXBkYXRlcyBvblxuICAgKiBuZXN0ZWQgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlUHJveHk8VD4odGFyZ2V0OiBULCBwYXRoOiBzdHJpbmdbXSA9IFtdKTogVCB7XG4gICAgLy8gUmV0dXJuIHByaW1pdGl2ZXMgaW1tZWRpYXRlbHlcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiB8fCB0YXJnZXQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGEgY2FjaGVkIHByb3h5IGZvciB0aGlzIG9iamVjdFxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuX3Byb3h5Q2FjaGUuZ2V0KHRhcmdldCBhcyBvYmplY3QpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIGlmICghdGhpcy5faGFzV2FybmVkICYmIHBhdGgubGVuZ3RoID4gUFJPWFlfREVQVEhfV0FSTklOR19MSU1JVCkge1xuICAgICAgICB0aGlzLl9oYXNXYXJuZWQgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLndhcm4oYFxuW1N0YXRlXSBEZWVwbHkgbmVzdGVkIGxpdmUgc3RhdGUgYWNjZXNzIG1heSBoYXZlIHBlcmZvcm1hbmNlIGltcGFjdHMuIEZvciBkZWVwbHlcbm5lc3RlZCBvciBjb21wbGV4IHN0YXRlIHVwZGF0ZXMsIHVzZSAubXV0YXRlKCksIC5wYXRjaCgpLCBvciAudHJhbnNhY3Rpb24oKSBmb3Jcbm9wdGltYWwgcGVyZm9ybWFuY2UgKFdhcm5pbmcgd2hpbGUgZXZhbHVhdGluZyBsaXZlIGFjY2VzcyB0byAke3BhdGguam9pbihcIi5cIil9KVxuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBwcm94eSBhbmQgY2FjaGUgaXRcbiAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQgYXMgb2JqZWN0LCB7XG4gICAgICBnZXQ6IChvYmosIGtleTogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgIC8vIFN5bWJvbHMgLT4gRGlyZWN0IHJldHVyblxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgIHJldHVybiAob2JqIGFzIGFueSlba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKG9iaiBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgLy8gRm9yIEFycmF5cywgTWFwcywgYW5kIFNldHMsIGhhbmRsZSBtdXRhdG9yIGZ1bmN0aW9ucyBjb3JyZWN0bHlcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChvYmogaW5zdGFuY2VvZiBTZXQgfHwgb2JqIGluc3RhbmNlb2YgTWFwIHx8IEFycmF5LmlzQXJyYXkob2JqKSkgJiZcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtdXRhdGlvbkZucyA9IEFycmF5LmlzQXJyYXkob2JqKVxuICAgICAgICAgICAgPyBBcnJheU11dGF0b3JGdW5jdGlvbnNcbiAgICAgICAgICAgIDogRGF0YVN0cnVjdHVyZU11dGF0b3JGdW5jdGlvbnM7XG4gICAgICAgICAgY29uc3QgaXNNdXRhdGlvbiA9IG11dGF0aW9uRm5zLmhhcyhrZXkpO1xuXG4gICAgICAgICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnNuYXBzaG90KCk7XG5cbiAgICAgICAgICAgIGxldCBjdXJyZW50OiBhbnkgPSBzbmFwc2hvdDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIHBhdGgpIHtcbiAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IChjdXJyZW50IGFzIGFueSlba2V5XSguLi5hcmdzKTtcblxuICAgICAgICAgICAgaWYgKGlzTXV0YXRpb24pIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZShzbmFwc2hvdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9iamVjdHMgLT4gcmVjdXJzaXZlbHkgY3JlYXRlIGEgcHJveHlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVQcm94eSh2YWx1ZSwgWy4uLnBhdGgsIGtleV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJpbWl0aXZlcyAtPiBSZXR1cm4gdmFsdWVcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSxcblxuICAgICAgc2V0OiAoX29iaiwga2V5OiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gUmVqZWN0IGlmIGN1cnJlbnRseSBsb2NrZWRcbiAgICAgICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FsbG93IHNldHRpbmcgc3ltYm9sIHByb3BlcnRpZXMgb24gdGFyZ2V0IGRhdGEgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBhbmQgdXBkYXRlIHRoZSBwYXRoIHdpdGggdGhlIHZhbHVlXG4gICAgICAgIGNvbnN0IG5ld1BhdGggPSBbLi4ucGF0aCwga2V5XTtcbiAgICAgICAgdGhpcy5fc2V0TmVzdGVkKG5ld1BhdGgsIHRoaXMuX3Vud3JhcFByb3h5KHZhbHVlKSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICBoYXM6IChvYmosIGtleTogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gb2JqO1xuICAgICAgfSxcblxuICAgICAgb3duS2V5czogKG9iaikgPT4ge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKG9iaik7XG4gICAgICB9LFxuXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IChvYmosIGtleTogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KTtcblxuICAgICAgICBpZiAoZGVzYykge1xuICAgICAgICAgIGRlc2MuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjO1xuICAgICAgfSxcblxuICAgICAgZGVsZXRlUHJvcGVydHk6IChvYmosIGtleSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiB8fCAhKGtleSBpbiBvYmopKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBhbmQgdXBkYXRlIHRoZSBwYXRoIHdpdGggdGhlIHZhbHVlXG4gICAgICAgIGNvbnN0IG5ld1BhdGggPSBbLi4ucGF0aCwga2V5XTtcblxuICAgICAgICB0aGlzLl9zZXROZXN0ZWQobmV3UGF0aCwgdW5kZWZpbmVkKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfSkgYXMgVDtcblxuICAgIHRoaXMuX3Byb3h5Q2FjaGUuc2V0KHRhcmdldCBhcyBvYmplY3QsIHByb3h5KTtcbiAgICB0aGlzLl9yZXZlcnNlUHJveHlDYWNoZS5zZXQocHJveHkgYXMgb2JqZWN0LCB0YXJnZXQgYXMgb2JqZWN0KTtcbiAgICByZXR1cm4gcHJveHk7XG4gIH1cblxuICBwcml2YXRlIF91bndyYXBQcm94eTxUPih2YWx1ZTogVCk6IFQge1xuICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGZvciBwcmltaXRpdmVzXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgb25lIG9mIG91ciBwcm94aWVzXG4gICAgY29uc3QgcmF3VGFyZ2V0ID0gdGhpcy5fcmV2ZXJzZVByb3h5Q2FjaGUuZ2V0KHZhbHVlIGFzIG9iamVjdCk7XG4gICAgaWYgKHJhd1RhcmdldCkge1xuICAgICAgcmV0dXJuIHJhd1RhcmdldCBhcyBUO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHRoaXMuX3Vud3JhcFByb3h5KGl0ZW0pKSBhcyBUO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwbGFpbiBvYmplY3RzXG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgIGNvbnN0IHVud3JhcHBlZDogYW55ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoT2JqZWN0Lmhhc093bih2YWx1ZSwga2V5KSkge1xuICAgICAgICAgIHVud3JhcHBlZFtrZXldID0gdGhpcy5fdW53cmFwUHJveHkoKHZhbHVlIGFzIGFueSlba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1bndyYXBwZWQ7XG4gICAgfVxuXG4gICAgLy8gT3RoZXIgb2JqZWN0cyAoRGF0ZSwgTWFwLCBTZXQsIGV0Yy4pIHBhc3MgdGhyb3VnaFxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2V0dGluZyBuZXN0ZWQgdmFsdWVzIGFuZCBlbWl0dGluZyB1cGRhdGVkIGRhdGEgaWYgdGhlIHZhbHVlIGNoYW5nZWRcbiAgICovXG4gIHByaXZhdGUgX3NldE5lc3RlZChwYXRoOiBzdHJpbmdbXSwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIC8vIE5vdGhpbmcgdG8gZG8gd2l0aCBlbXB0eSBwYXRoc1xuICAgIGlmICghcGF0aC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBhdCB0aGUgcm9vdCBhbmQgc2VlayB0byB0aGUgdmFsdWUgYmVpbmcgc2V0XG4gICAgbGV0IGN1cnJlbnQ6IGFueSA9IHRoaXMuX2RhdGE7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBwYXRoW2ldID8/IFwiXCI7XG4gICAgICBpZiAoIShrZXkgaW4gY3VycmVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQUxJRF9TVEFURV9LRVksIHBhdGguam9pbihcIi5cIikpO1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbEtleSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXSA/PyBcIlwiO1xuICAgIGlmICghKGZpbmFsS2V5IGluIGN1cnJlbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBTElEX1NUQVRFX0tFWSwgcGF0aC5qb2luKFwiLlwiKSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGFuZCBlbWl0IG9ubHkgaWYgdGhlIHZhbHVlIGlzIGRpZmZlcmVudC4gT3RoZXJ3aXNlIG5vLW9wLlxuICAgIGlmIChjdXJyZW50W2ZpbmFsS2V5XSAhPT0gdmFsdWUgJiYgIU9iamVjdC5pcyhjdXJyZW50W2ZpbmFsS2V5XSwgdmFsdWUpKSB7XG4gICAgICBjdXJyZW50W2ZpbmFsS2V5XSA9IHZhbHVlO1xuICAgICAgdGhpcy5fZW1pdCh0aGlzLmN1cnJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGFuIGluY29taW5nIHBhcnRpYWwgc3RhdGUgYW5kIGVtaXQgdXBkYXRlcyB0byBsaXN0ZW5lcnMgaWYgdGhlcmVcbiAgICogYXJlIGFueSBjaGFuZ2VzIGRldGVjdGVkLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBPYmplY3QuaXMoKSB0byBjaGVjayBmb3IgZGlmZmVyZW5jZXMuIERvZXMgbm90IGF0dGVtcHQgZGVlcCBkaWZmaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfcHJvY2Vzc0luY29taW5nU3RhdGUgPSAoaW5jb21pbmdTdGF0ZTogUGFydGlhbDxTaGFwZT4pOiB2b2lkID0+IHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgaW5jb21pbmdTdGF0ZSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgaW5jb21pbmdTdGF0ZSA9PT0gbnVsbCB8fFxuICAgICAgQXJyYXkuaXNBcnJheShpbmNvbWluZ1N0YXRlKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfVVBEQVRFLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShpbmNvbWluZ1N0YXRlKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBpZiBhbnkga2V5L3ZhbHVlIHBhaXIgb24gdGhlIGluY29taW5nIHN0YXRlIGRpZmZlcnMgZnJvbSB0aGVcbiAgICAvLyBleGlzdGluZyBkYXRhXG4gICAgZm9yIChjb25zdCBba2V5LCBuZXdWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5jb21pbmdTdGF0ZSkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuX2RhdGFba2V5IGFzIGtleW9mIFNoYXBlXTtcbiAgICAgIGlmICghT2JqZWN0LmlzKGN1cnJlbnRWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICAodGhpcy5fZGF0YSBhcyBhbnkpW2tleV0gPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgdGhpcy5fZW1pdCh0aGlzLl9kYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEVtaXQgdGhlIGN1cnJlbnQgc3RhdGUgdG8gYWxsIGxpc3RlbmVyc1xuICAgKi9cbiAgcHJpdmF0ZSBfZW1pdCA9IChkYXRhOiBTaGFwZSk6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICBsaXN0ZW5lcihkYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHN0YXRlXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgaXMgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCBzdGF0ZS4gSXQgaXMgbWFya2VkIGFzIFJlYWRvbmx5XG4gICAqIHRvIGhlbHAgcHJldmVudCBhY2NpZGVudGFsIGNoYW5nZXMuIE5ldmVyIGVkaXQgdGhpcyB2YWx1ZSBkaXJlY3RseS5cbiAgICovXG4gIGdldCBjdXJyZW50KCk6IFJlYWRvbmx5PFNoYXBlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogUHJveGllZCBhY2Nlc3MgdG8gc3RhdGUgcHJvcGVydGllcyB3aXRoIGF1dG9tYXRpYyByZWNvbmNpbGlhdGlvbi5cbiAgICpcbiAgICogQWxsb3dzIGRpcmVjdCBwcm9wZXJ0eSBhY2Nlc3MgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZyBzdGF0ZSB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIERlZXAgcmVhY3Rpdml0eSB3aXRoIHRoZSBgLmxpdmVgIGFjY2Vzc29yXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdGUgPSBuZXcgU3RhdGUoe1xuICAgKiAgIG5lc3RlZDoge1xuICAgKiAgICAgdmFsdWVzOiBbMSwgMiwgM10sXG4gICAqICAgfVxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gRGVlcCB2YWx1ZSBhc3NpZ25tZW50IHRyaWdnZXJzIHN0YXRlIHVwZGF0ZXNcbiAgICogc3RhdGUubGl2ZS5uZXN0ZWQudmFsdWVzWzFdID0gNTtcbiAgICpcbiAgICogLy8gQXJyYXkgbXV0YXRvcnMgYXJlIGF1dG9tYXRpY2FsbHkgcmVhY3RpdmUgYXMgd2VsbFxuICAgKiBzdGF0ZS5saXZlLm5lc3RlZC52YWx1ZXMucHVzaCg0KTtcbiAgICogc3RhdGUubGl2ZS5uZXN0ZWQudmFsdWVzLnJldmVyc2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXQgbGl2ZSgpOiBTaGFwZSB7XG4gICAgaWYgKCF0aGlzLl9wcm94eSkge1xuICAgICAgdGhpcy5fcHJveHkgPSB0aGlzLl9jcmVhdGVQcm94eSh0aGlzLl9kYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Byb3h5O1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGlzIHN0YXRlIGlzIGN1cnJlbnRseSBsb2NrZWQgKHRydWUpIG9yIG5vdCAoZmFsc2UpXG4gICAqL1xuICBnZXQgaXNMb2NrZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTG9ja2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHdoZW4gdGhpcyBzdGF0ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBMaXN0ZW5lcnMgYXJlIGludm9rZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHJlZ2lzdGVyZWQgYW5kIGFyZSBwYXNzZWQgYVxuICAgKiByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsbHkgbWFuYWdlZCBzdGF0ZSBvYmplY3QgYXMgYSByZWFkb25seSBvYmplY3QuXG4gICAqXG4gICAqICoqRG8gbm90IG1vZGlmeSBzdGF0ZSB2YWx1ZXMgZGlyZWN0bHkqKi4gSW5zdGVhZCwgdXNlIHtAbGluayBzZXR9IG9yXG4gICAqIHtAbGluayBwYXRjaH0gdG8gbWFrZSBpbW11dGFibGUgdXBkYXRlcy5cbiAgICovXG4gIGFkZExpc3RlbmVyID0gKGxpc3RlbmVyOiBTdGF0ZUxpc3RlbmVyPFNoYXBlPik6IHZvaWQgPT4ge1xuICAgIHRoaXMuX2xpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgc3RhdGUgaGFuZGxlclxuICAgKi9cbiAgcmVtb3ZlTGlzdGVuZXIgPSAobGlzdGVuZXI6IFN0YXRlTGlzdGVuZXI8U2hhcGU+KTogdm9pZCA9PiB7XG4gICAgdGhpcy5fbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZSB2YWx1ZSBmcm9tIHRoZSBzdGF0ZSBvYmplY3RcbiAgICpcbiAgICogVGhlIHZhbHVlIGlzIHJldHVybmVkIGFzIFJlYWRvbmx5IHRvIHByZXZlbnQgYWNjaWRlbnRhbCBzdGF0ZSBtdXRhdGlvbnMuXG4gICAqIFRvIG11dGF0ZSBzdGF0ZWZ1bCBwcm9wZXJ0aWVzLCB1c2Uge0BsaW5rIHNldH0gb3Ige0BsaW5rIHBhdGNofSBpbnN0ZWFkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRlID0gbmV3IFN0YXRlKHsgY291bnQ6IDEgfSk7XG4gICAqIGNvbnNvbGUubG9nKHN0YXRlLmdldChcImNvdW50XCIpKTsgLy8gMVxuICAgKiBgYGBcbiAgICpcbiAgICovXG4gIGdldCA9IDxLIGV4dGVuZHMga2V5b2YgU2hhcGU+KGtleTogSyk6IFJlYWRvbmx5PFNoYXBlW0tdPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFba2V5XSBhcyBSZWFkb25seTxTaGFwZVtLXT47XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkZWVwIGNsb25lIG9mIHRoZSBjdXJyZW50IHN0YXRlIGRhdGEgdXNpbmcgYHN0cnVjdHVyZWRDbG9uZSgpYCB0b1xuICAgKiBtYWtlIHRoZSBjb3B5LlxuICAgKlxuICAgKiBUaGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbiBjYW4gYmUgZWRpdGVkIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZVxuICAgKiBhY3R1YWwgaW50ZXJuYWwgc3RhdGUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc25hcCA9IHN0YXRlLnNuYXBzaG90KCk7XG4gICAqIHNuYXAuY291bnQgKz0gMTtcbiAgICogc3RhdGUucGF0Y2goc25hcCk7XG4gICAqIGBgYFxuICAgKi9cbiAgc25hcHNob3QgPSAoKTogU2hhcGUgPT4ge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5fZGF0YSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBhIHNpbmdsZSBzdGF0ZWZ1bCBwcm9wZXJ0eSB3aGlsZSBsZWF2aW5nIG90aGVyIHByb3BlcnRpZXMgdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBUcmlnZ2VycyBhbiB1cGRhdGUgdG8gYWxsIGxpc3RlbmVycyBpZiB0aGUgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gYmVmb3JlXG4gICAqIHdoZW4gY29tcGFyZWQgdXNpbmcgc2hhbGxvdyBlcXVhbGl0eS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0ZSA9IG5ldyBTdGF0ZSh7IGNvdW50OiAxLCBjb2xvcjogXCJyZWRcIiB9KTtcbiAgICogc3RhdGUuc2V0KFwiY291bnRcIiwgMik7IC8vIFN0YXRlIGlzIG5vdyB7IGNvdW50OiAyLCBjb2xvcjogXCJyZWRcIiB9XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0ID0gPEsgZXh0ZW5kcyBrZXlvZiBTaGFwZT4oa2V5OiBLLCB2YWx1ZTogU2hhcGVbS10pOiB2b2lkID0+IHtcbiAgICAvLyBSZWplY3QgaWYgY3VycmVudGx5IGxvY2tlZFxuICAgIGlmICh0aGlzLl9pc0xvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aWFsOiBQYXJ0aWFsPFNoYXBlPiA9IHt9O1xuICAgIHBhcnRpYWxba2V5XSA9IHZhbHVlO1xuXG4gICAgdGhpcy5fcHJvY2Vzc0luY29taW5nU3RhdGUocGFydGlhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBtdWx0aXBsZSBzdGF0ZWZ1bCBwcm9wZXJ0aWVzIGF0IG9uY2UsIGxlYXZpbmcgb21pdHRlZCBwcm9wZXJ0aWVzXG4gICAqIHVuY2hhbmdlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogUGF0Y2ggYSBwYXJ0aWFsIHN0YXRlLCB1cGRhdGluZyBhbGwgbGlzdGVkIHByb3BlcnRpZXMgYXQgb25jZVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRlID0gbmV3IFN0YXRlKHtcbiAgICogICB3ZWF0aGVyOiBcInN1bm55XCIsXG4gICAqICAgdGVtcGVyYXR1cmU6IDMwLFxuICAgKiAgIGh1bWlkaXR5OiA3MCxcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIExlYXZlcyBgdGVtcGVyYXR1cmVgIHVuY2hhbmdlZFxuICAgKiBzdGF0ZS5wYXRjaCh7XG4gICAqICAgd2VhdGhlcjogXCJjbG91ZHlcIixcbiAgICogICBodW1pZGl0eTogNTAsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHBhdGNoID0gKHBhdGNoOiBQYXJ0aWFsPFNoYXBlPik6IFN0YXRlPFNoYXBlPiA9PiB7XG4gICAgLy8gUmVqZWN0IGlmIGN1cnJlbnRseSBsb2NrZWRcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvY2Vzc0luY29taW5nU3RhdGUocGF0Y2gpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGdWxseSByZXBsYWNlIHRoZSBjdXJyZW50IHN0YXRlIGRhdGEgYW5kIGZvcmNlIGxpc3RlbmVycyB0byByZWNlaXZlIHRoZVxuICAgKiB1cGRhdGVkIGRhdGEgaW1tZWRpYXRlbHkuXG4gICAqL1xuICByZXBsYWNlID0gKHN0YXRlOiBTaGFwZSk6IFN0YXRlPFNoYXBlPiA9PiB7XG4gICAgLy8gUmVqZWN0IGlmIGN1cnJlbnRseSBsb2NrZWRcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0YSA9IHN0YXRlO1xuICAgIHRoaXMuX2VtaXQodGhpcy5fZGF0YSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIExvY2sgdGhpcyBTdGF0ZSBpbnN0YW5jZSwgcHJldmVudGluZyBmdXJ0aGVyIGV4dGVybmFsIGNoYW5nZXNcbiAgICovXG4gIGxvY2sgPSAoKTogU3RhdGU8U2hhcGU+ID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgdGhpcy5faXNMb2NrZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVbmxvY2sgdGhpcyBTdGF0ZSBpbnN0YW5jZSwgYWxsb3dpbmcgZnVydGhlciBleHRlcm5hbCBjaGFuZ2VzXG4gICAqL1xuICB1bmxvY2sgPSAoKTogU3RhdGU8U2hhcGU+ID0+IHtcbiAgICB0aGlzLl9pc0xvY2tlZCA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBcHBseSBjb21wbGV4IHVwZGF0ZXMgdG8gdGhlIHN0YXRlIHVzaW5nIGEgbXV0YXRvciBmdW5jdGlvbi5cbiAgICpcbiAgICogVGhlIG11dGF0b3IgZnVuY3Rpb24gdGFrZXMgb25lIHBhcmFtZXRlciB3aGljaCBpcyBhIHN0cnVjdHVyZWRDbG9uZSBjb3B5IG9mXG4gICAqIHRoZSBjdXJyZW50IHN0YXRlIG9iamVjdC4gV2hhdGV2ZXIgaXMgcmV0dXJuZWQgYnkgdGhlIG11dGF0b3IgaXMgdGhlblxuICAgKiBwYXRjaGVkIGluIHRvIHRoZSBzdGF0ZS5cbiAgICovXG4gIG11dGF0ZSA9IChtdXRhdG9yOiAoY3VycmVudDogU2hhcGUpID0+IFNoYXBlKTogU3RhdGU8U2hhcGU+ID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvY2Vzc0luY29taW5nU3RhdGUobXV0YXRvcih0aGlzLnNuYXBzaG90KCkpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUGVyZm9ybSBhbiBhc3luYyBtdXRhdGlvbiBvZiB0aGUgc3RhdGUsIG9wdGlvbmFsbHkgbG9ja2luZyB0aGUgc3RhdGUgZHVyaW5nXG4gICAqIHRoZSBwcm9jZXNzLlxuICAgKiBAcGFyYW0gbXV0YXRvciBBIGZ1bmN0aW9uIHRvIG11dGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXcgc3RhdGVcbiAgICogQHBhcmFtIGxvY2sgSWYgYHRydWVgLCBsb2NrIHRoZSBzdGF0ZSB1bnRpbCB0aGUgbXV0YXRvciBjb21wbGV0ZXNcbiAgICovXG4gIG11dGF0ZUFzeW5jID0gYXN5bmMgKFxuICAgIG11dGF0b3I6IChjdXJyZW50OiBTaGFwZSkgPT4gUHJvbWlzZTxTaGFwZT4sXG4gICAgbG9jayA9IGZhbHNlLFxuICApOiBQcm9taXNlPFN0YXRlPFNoYXBlPj4gPT4ge1xuICAgIGlmICh0aGlzLl9pc0xvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICB9XG5cbiAgICBpZiAobG9jaykge1xuICAgICAgdGhpcy5faXNMb2NrZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG11dGF0aW9uUmVzdWx0ID0gYXdhaXQgbXV0YXRvcih0aGlzLnNuYXBzaG90KCkpO1xuICAgIHRoaXMuX3Byb2Nlc3NJbmNvbWluZ1N0YXRlKG11dGF0aW9uUmVzdWx0KTtcblxuICAgIGlmIChsb2NrKSB7XG4gICAgICB0aGlzLl9pc0xvY2tlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgdHJhbnNhY3Rpb24tc3R5bGUgc2V0IG9mIGFjdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBmdW5jdGlvbi5cbiAgICpcbiAgICogVGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGNhbiBkbyBhbnl0aGluZywgYmV5b25kIGp1c3Qgc2V0dGluZyBzdGF0ZS4gQW55XG4gICAqIHVuY2F1Z2h0IGVycm9ycyB0aHJvd24gZnJvbSB3aXRoaW4gdGhlIGZ1bmN0aW9uIHdpbGwgY2F1c2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIHRvIGZhaWwgYW5kIHRoZSBzdGF0ZSB0byBhdXRvbWF0aWNhbGx5IHJvbGwgYmFjayB0byB0aGUgbGFzdCB2YWxpZCBzdGF0ZS5cbiAgICpcbiAgICogRHVyaW5nIGEgdHJhbnNhY3Rpb24sIHRoaXMgc3RhdGUgaW5zdGFuY2Ugd2lsbCBiZSBsb2NrZWQsIHByZXZlbnRpbmcgb3RoZXJcbiAgICogY2hhbmdlcy5cbiAgICpcbiAgICogVHJhbnNhY3Rpb25zIHdpbGwgYWx3YXlzIHJlc3VsdCBpbiBhIHN0YXRlIHVwZGF0ZSB3aGVuIHN1Y2Nlc3NmdWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIFRyYW5zYWN0aW9ucyB3aXRoIGxvY2tpbmcgYW5kIHJvbGxiYWNrIHN1cHBvcnRcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0ZSA9IG5ldyBTdGF0ZSh7Y291bnQ6IDF9KTtcbiAgICpcbiAgICogc3RhdGUudHJhbnNhY3Rpb24oYXN5bmMgKHMpID0+IHtcbiAgICogICAvLyBgc2AgaXMgYSBmdWxsIFN0YXRlIG9iamVjdCB5b3UgY2FuIHNhZmVseSBtYW5pcHVsYXRlXG4gICAqICAgcy5zZXQoXCJjb3VudFwiLCAxMCk7XG4gICAqIH0pO1xuICAgKiBzdGF0ZS5nZXQoXCJjb3VudFwiKTsgLy8gPT4gMTA7XG4gICAqXG4gICAqIC8vIEVycm9ycyBpbnNpZGUgdGhlIHRyYW5zYWN0aW9uIHJvbGwgYmFjayB0aGUgc3RhdGVcbiAgICogc3RhdGUudHJhbnNhY3Rpb24oYXN5bmMgKHMpID0+IHtcbiAgICogICBzLnNldChcImNvdW50XCIsIDEwMCk7XG4gICAqICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAqIH0pO1xuICAgKiBzdGF0ZS5nZXQoXCJjb3VudFwiKTsgLy8gPT4gMTA7XG4gICAqL1xuICB0cmFuc2FjdGlvbiA9IChmbjogKHN0YXRlOiBTdGF0ZTxTaGFwZT4pID0+IHZvaWQpOiBib29sZWFuID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgLy8gTG9jayBvdXRzaWRlIG9mIHRoZSB0cnkvY2F0Y2ggdG8gdGhyb3cgaW1tZWRpYXRlbHksIHNlcGFyYXRpbmcgdGhlXG4gICAgLy8gdHJhbnNhY3Rpb24gZnVuY3Rpb24gZXJyb3IgZnJvbSB0aGUgYWN0dWFsIGNhbGwgc2l0ZSBlcnJvcnNcbiAgICB0aGlzLl9pc0xvY2tlZCA9IHRydWU7XG5cbiAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IHN0YXRlIG9iamVjdCB0byB1c2Ugd2l0aGluIHRoZSB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25TdGF0ZSA9IG5ldyBTdGF0ZTxTaGFwZT4odGhpcy5zbmFwc2hvdCgpKTtcblxuICAgICAgLy8gUnVuIHRoZSB0cmFuc2FjdGlvbiBpdHNlbGZcbiAgICAgIGZuKHRyYW5zYWN0aW9uU3RhdGUpO1xuXG4gICAgICAvLyBBZG9wdCB0aGUgcmVzdWx0aW5nIHN0YXRlIG9mIHRoZSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZSh0cmFuc2FjdGlvblN0YXRlLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbU3RhdGVdIFRyYW5zYWN0aW9uIGZhaWxlZCBkdWUgdG8gY2F1Z2h0IGVycm9yXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNMb2NrZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfTtcblxuICAvKipcbiAgICogUGVyZm9ybSBhIHRyYW5zYWN0aW9uLXN0eWxlIHNldCBvZiBhY3Rpb25zIGRlZmluZWQgd2l0aGluIGFuIGFzeW5jIGZ1bmN0aW9uXG4gICAqXG4gICAqIFRoZSBwcm92aWRlZCBmdW5jdGlvbiBjYW4gZG8gYW55dGhpbmcsIGJleW9uZCBqdXN0IHNldHRpbmcgc3RhdGUuIEFueVxuICAgKiB1bmNhdWdodCBlcnJvcnMgdGhyb3duIGZyb20gd2l0aGluIHRoZSBmdW5jdGlvbiB3aWxsIGNhdXNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiB0byBmYWlsIGFuZCB0aGUgc3RhdGUgdG8gYXV0b21hdGljYWxseSByb2xsIGJhY2sgdG8gdGhlIGxhc3QgdmFsaWQgc3RhdGUuXG4gICAqXG4gICAqIER1cmluZyBhIHRyYW5zYWN0aW9uLCB0aGlzIHN0YXRlIGluc3RhbmNlIHdpbGwgYmUgbG9ja2VkLCBwcmV2ZW50aW5nIG90aGVyXG4gICAqIGNoYW5nZXMuXG4gICAqXG4gICAqIFRyYW5zYWN0aW9ucyB3aWxsIGFsd2F5cyByZXN1bHQgaW4gYSBzdGF0ZSB1cGRhdGUgd2hlbiBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBUcmFuc2FjdGlvbnMgd2l0aCBsb2NraW5nIGFuZCByb2xsYmFjayBzdXBwb3J0XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdGUgPSBuZXcgU3RhdGUoe2NvdW50OiAxfSk7XG4gICAqXG4gICAqIC8vIEF3YWl0aW5nIHRoZSByZXN1bHQgb2YgYSB0cmFuc2FjdGlvblxuICAgKiBhd2FpdCBzdGF0ZS50cmFuc2FjdGlvbkFzeW5jKGFzeW5jIChzKSA9PiB7XG4gICAqICAgLy8gYHNgIGlzIGEgZnVsbCBTdGF0ZSBvYmplY3QgeW91IGNhbiBzYWZlbHkgbWFuaXB1bGF0ZVxuICAgKiAgIHMuc2V0KFwiY291bnRcIiwgMTApO1xuICAgKiB9KTtcbiAgICogc3RhdGUuZ2V0KFwiY291bnRcIik7IC8vID0+IDEwO1xuICAgKlxuICAgKiAvLyBFcnJvcnMgaW5zaWRlIHRoZSB0cmFuc2FjdGlvbiByb2xsIGJhY2sgdGhlIHN0YXRlXG4gICAqIGF3YWl0IHN0YXRlLnRyYW5zYWN0aW9uQXN5bmMoYXN5bmMgKHMpID0+IHtcbiAgICogICBzLnNldChcImNvdW50XCIsIDEwMCk7XG4gICAqICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAqIH0pO1xuICAgKiBzdGF0ZS5nZXQoXCJjb3VudFwiKTsgLy8gPT4gMTA7XG4gICAqXG4gICAqIC8vIElmIHlvdSBmb3JnZXQgdG8gYXdhaXQgdGhlIHRyYW5zYWN0aW9uLCBpdHMgc3RpbGwgbG9ja2VkXG4gICAqIHN0YXRlLnRyYW5zYWN0aW9uQXN5bmMoYXN5bmMgKHMpID0+IHtcbiAgICogICBhd2FpdCB3YWl0U2Vjb25kcygxKTtcbiAgICogfSk7XG4gICAqIHN0YXRlLnNldChcImNvdW50XCIsIDEpOyAvLyBFcnJvcjogU3RhdGUgaXMgbG9ja2VkIVxuICAgKiBgYGBcbiAgICovXG4gIHRyYW5zYWN0aW9uQXN5bmMgPSBhc3luYyAoXG4gICAgZm46IChzdGF0ZTogU3RhdGU8U2hhcGU+KSA9PiBQcm9taXNlPHZvaWQ+LFxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgLy8gTG9jayBvdXRzaWRlIG9mIHRoZSB0cnkvY2F0Y2ggdG8gdGhyb3cgaW1tZWRpYXRlbHksIHNlcGFyYXRpbmcgdGhlXG4gICAgLy8gdHJhbnNhY3Rpb24gZnVuY3Rpb24gZXJyb3IgZnJvbSB0aGUgYWN0dWFsIGNhbGwgc2l0ZSBlcnJvcnNcbiAgICB0aGlzLl9pc0xvY2tlZCA9IHRydWU7XG5cbiAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IHN0YXRlIG9iamVjdCB0byB1c2Ugd2l0aGluIHRoZSB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25TdGF0ZSA9IG5ldyBTdGF0ZTxTaGFwZT4odGhpcy5zbmFwc2hvdCgpKTtcblxuICAgICAgLy8gUnVuIHRoZSB0cmFuc2FjdGlvbiBpdHNlbGZcbiAgICAgIGF3YWl0IGZuKHRyYW5zYWN0aW9uU3RhdGUpO1xuXG4gICAgICAvLyBBZG9wdCB0aGUgcmVzdWx0aW5nIHN0YXRlIG9mIHRoZSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZSh0cmFuc2FjdGlvblN0YXRlLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbU3RhdGVdIFRyYW5zYWN0aW9uIGZhaWxlZCBkdWUgdG8gY2F1Z2h0IGVycm9yXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNMb2NrZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgQ2hhckNvZGVzIH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQgdHlwZSB7IFBhcnNlZE5vdGF0aW9uIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBDaGVjayBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBtYXRjaGVzIHRoZSBcImJvdW5kIGF0dHJpYnV0ZVwiIHN5bnRheFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpc0JvdW5kQXR0cmlidXRlKFwiOmNsYXNzXCIpIC8vIHRydWVcbiAqIGlzQm91bmRBdHRyaWJ1dGUoXCI6OmNsYXNzXCIpIC8vIGZhbHNlXG4gKiBpc0JvdW5kQXR0cmlidXRlKFwiY2xhc3NcIikgLy8gZmFsc2VcbiAqIGBgYFxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIGZ1bmN0aW9uIHVzZXMgbG9vcHMgYW5kIGNoYXJhY3RlciBjb2RlIGNoZWNrcyBpbnN0ZWFkIG9mIGEgcmVnZXggdG9cbiAqIG9wdGltaXplIGZvciBob3QgcGF0aHMgZHVyaW5nIGluaXRpYWwgcGFyc2luZyBhbmQgcmVuZGVyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCb3VuZEF0dHJpYnV0ZShhdHRyTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChhdHRyTmFtZVswXSAhPT0gXCI6XCIgfHwgYXR0ck5hbWUubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYXR0ck5hbWUubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBFbnN1cmUgdGhlIGNoYXJhY3RlciBjb2RlIGlzIGEgbGV0dGVyIG9yIGh5cGhlblxuICAgIGNvbnN0IGNoYXIgPSBhdHRyTmFtZS5jaGFyQ29kZUF0KGkpO1xuXG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgY2hhciA9PT0gQ2hhckNvZGVzLkh5cGhlbiB8fFxuICAgICAgICAoY2hhciA+PSBDaGFyQ29kZXMuQSAmJiBjaGFyIDw9IENoYXJDb2Rlcy5aKSB8fFxuICAgICAgICAoY2hhciA+PSBDaGFyQ29kZXMuYSAmJiBjaGFyIDw9IENoYXJDb2Rlcy56KVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBlbnVtIE5vdGF0aW9uUHJlZml4IHtcbiAgQXR0cmlidXRlcyA9IFwiQFwiLFxuICBTdGF0ZSA9IFwiJFwiLFxuICBEYXRhID0gXCIqXCIsXG4gIEl0ZW0gPSBcIiNcIixcbn1cblxuY29uc3QgUFJFRklYX01BUFBJTkc6IFJlY29yZDxOb3RhdGlvblByZWZpeCwgc3RyaW5nPiA9IHtcbiAgW05vdGF0aW9uUHJlZml4LkF0dHJpYnV0ZXNdOiBcImF0dHJcIixcbiAgW05vdGF0aW9uUHJlZml4LlN0YXRlXTogXCJzdGF0ZVwiLFxuICBbTm90YXRpb25QcmVmaXguRGF0YV06IFwiZGF0YVwiLFxuICBbTm90YXRpb25QcmVmaXguSXRlbV06IFwiaXRlbVwiLFxufTtcblxuY29uc3QgcHJlZml4TWFwcGluZyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoUFJFRklYX01BUFBJTkcpKTtcblxuLyoqXG4gKiBQYXJzZSBhIG5vdGF0aW9uIGludG8gYW4gb2JqZWN0IHdpdGggcnVudGltZSBpbmZvcm1hdGlvblxuICpcbiAqIEByZW1hcmtzXG4gKiBGb3VyIG5vdGF0aW9ucyBhcmUgc3VwcG9ydGVkOlxuICpcbiAqIC0gYEBhdHRybmFtZWAgLT4gUm9vdCBlbGVtZW50IGF0dHJpYnV0ZXNcbiAqIC0gYCRzdGF0ZXZhbHVlYCAtPiBTdGF0ZWZ1bCBjb250ZW50XG4gKiAtIGAqcHJvcGVydHkub3Iud2hhdGV2ZXJgIC0+IENvbXB1dGVkIGRhdGEgcHJvcGVydGllc1xuICogLSBgI2NvbG9yYCAtPiBMaXN0IGl0ZW0gcHJvcGVydGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VOb3RhdGlvbihub3RhdGlvbjogc3RyaW5nKTogUGFyc2VkTm90YXRpb24ge1xuICAvLyBDaGVjayBmb3IgcHJlZml4IG1vZGlmaWVyc1xuICBsZXQgbm90TW9kaWZpZXIgPSBmYWxzZTtcblxuICBsZXQgcGF0aFBhcnQgPSBcIlwiO1xuICBjb25zdCBjb21wdXRlZFBhdGg6IHN0cmluZ1tdID0gW107XG5cbiAgbGV0IGlzRmlyc3QgPSB0cnVlO1xuICBmb3IgKGNvbnN0IGNoYXIgb2Ygbm90YXRpb24pIHtcbiAgICAvLyAhIGF0IHBvc2l0aW9uIDAgLT4gRW5hYmxlIE5PVCBtb2RpZmllciwgZG9udCBjb3VudCB0b3dhcmRzIGlkeFxuICAgIGlmIChpc0ZpcnN0ICYmIGNoYXIgPT09IFwiIVwiKSB7XG4gICAgICBub3RNb2RpZmllciA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlLCBwb3NpdGlvbiAwIG11c3QgYmUgYSBwcmVmaXhcbiAgICBlbHNlIGlmIChpc0ZpcnN0KSB7XG4gICAgICBjb25zdCBwcmVmaXggPSBwcmVmaXhNYXBwaW5nLmdldChjaGFyKTtcblxuICAgICAgaWYgKCFwcmVmaXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTiwgbm90YXRpb24pO1xuICAgICAgfVxuXG4gICAgICBjb21wdXRlZFBhdGgucHVzaChwcmVmaXgpO1xuICAgICAgaXNGaXJzdCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENvbGxlY3QgY2hhcmFjdGVycyBhbmQgcHVzaCB3aGVuIGhpdHRpbmcgYSBkb3Qgb3IgZW5kXG4gICAgZWxzZSBpZiAoY2hhciA9PT0gXCIuXCIpIHtcbiAgICAgIGlmIChwYXRoUGFydC5sZW5ndGgpIHtcbiAgICAgICAgY29tcHV0ZWRQYXRoLnB1c2gocGF0aFBhcnQpO1xuICAgICAgICBwYXRoUGFydCA9IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OLCBub3RhdGlvbik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGhQYXJ0ICs9IGNoYXI7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIHRoZSBmaW5hbCBwYXJ0IHdoaWNoIG11c3QgZXhpc3QgKG90aGVyd2lzZSwgaXQgZW5kZWQgaW4gYSBkb3QpXG4gIGlmICghcGF0aFBhcnQubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTiwgbm90YXRpb24pO1xuICB9XG5cbiAgY29tcHV0ZWRQYXRoLnB1c2gocGF0aFBhcnQpO1xuXG4gIGlmIChjb21wdXRlZFBhdGgubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT04sIG5vdGF0aW9uKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmFzZTogbm90YXRpb24sXG4gICAgcGF0aDogY29tcHV0ZWRQYXRoLFxuICAgIG1vZGlmaWVyczogbm90TW9kaWZpZXIgPyB7IG5vdDogdHJ1ZSB9IDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG5leHBvcnQgdHlwZSBOb3RhdGlvbkFjY2Vzc29yID0gKHNvdXJjZTogdW5rbm93bikgPT4gdW5rbm93bjtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVmFsdWVBY2Nlc3Nvcihub3RhdGlvbjogUGFyc2VkTm90YXRpb24pOiBOb3RhdGlvbkFjY2Vzc29yIHtcbiAgY29uc3QgeyBwYXRoLCBtb2RpZmllcnMgfSA9IG5vdGF0aW9uO1xuXG4gIGlmIChwYXRoLmxlbmd0aCA8IDIpIHtcbiAgICAvLyBOb3RhdGlvbnMgbXVzdCBhbHdheXMgaGF2ZSBhdCBsZWFzdCAyIHBhcnRzOiB0aGUgbmFtZXNwYWNlLCBhbmQgYXQgbGVhc3RcbiAgICAvLyBvbmUgcHJvcGVydHkgbmFtZSBvbiB0aGUgbmFtZXNwYWNlIChleGFtcGxlOiBbXCJzdGF0ZVwiLCBcInZpc2libGVcIl0pXG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbiAgfVxuXG4gIC8vIEZvciAyIGFuZCAzIGxlbmd0aCBwYXRocywgcHJlLWJha2UgYWNjZXNzb3JzIHRvIG9wdGltaXplIGZvciBjb21tb24gY2FzZXNcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgW2ZpcnN0S2V5LCBzZWNvbmRLZXldID0gcGF0aDtcblxuICAgIGlmIChmaXJzdEtleSA9PT0gdW5kZWZpbmVkIHx8IHNlY29uZEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlOiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IChzb3VyY2UgYXMgYW55KT8uW2ZpcnN0S2V5XT8uW3NlY29uZEtleV0gPz8gbnVsbDtcbiAgICAgIGlmIChtb2RpZmllcnM/Lm5vdCkge1xuICAgICAgICAvLyBBdHRyaWJ1dGUgdmFsdWVzIG11c3QgdHJlYXQgdGhlIGVtcHR5IHN0cmluZyBhcyB0cnV0aHkgcGVyIERPTSBydWxlc1xuICAgICAgICBpZiAoZmlyc3RLZXkgPT09IFwiYXR0clwiKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBcIlwiICYmICF2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMykge1xuICAgIGNvbnN0IFtmaXJzdEtleSwgc2Vjb25kS2V5LCB0aGlyZEtleV0gPSBwYXRoO1xuXG4gICAgaWYgKFxuICAgICAgZmlyc3RLZXkgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgc2Vjb25kS2V5ID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXJkS2V5ID09PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2U6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgKHNvdXJjZSBhcyBhbnkpPy5bZmlyc3RLZXldPy5bc2Vjb25kS2V5XT8uW3RoaXJkS2V5XSA/PyBudWxsO1xuICAgICAgaWYgKG1vZGlmaWVycz8ubm90KSB7XG4gICAgICAgIGlmIChmaXJzdEtleSA9PT0gXCJhdHRyXCIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IFwiXCIgJiYgIXZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICF2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICB9XG5cbiAgLy8gRm9yIGxvbmdlciBwYXRocywgb3B0IGZvciBhIHByZS1idWlsdCBsb29wXG4gIHJldHVybiAoc291cmNlOiB1bmtub3duKSA9PiB7XG4gICAgbGV0IGN1cnJlbnQgPSBzb3VyY2U7XG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGF0aCkge1xuICAgICAgaWYgKCFjdXJyZW50IHx8IHR5cGVvZiBjdXJyZW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0IGFzIGtleW9mIHR5cGVvZiBjdXJyZW50XTtcbiAgICB9XG5cbiAgICBpZiAobW9kaWZpZXJzPy5ub3QpIHtcbiAgICAgIGlmIChwYXRoWzBdID09PSBcImF0dHJcIikge1xuICAgICAgICByZXR1cm4gY3VycmVudCAhPT0gXCJcIiAmJiAhY3VycmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhY3VycmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IGh0bWxUb0ZyYWdtZW50IH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQge1xuICBidWlsZFZhbHVlQWNjZXNzb3IsXG4gIGlzQm91bmRBdHRyaWJ1dGUsXG4gIHR5cGUgTm90YXRpb25BY2Nlc3NvcixcbiAgcGFyc2VOb3RhdGlvbixcbn0gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQge1xuICB0eXBlIEFueVJlbmRlclBsYW4sXG4gIHR5cGUgQW55U2NoZW1lLFxuICB0eXBlIEF0dHJpYnV0ZVVwZGF0ZVBsYW4sXG4gIHR5cGUgQXR0cmlidXRlVXBkYXRlU2NoZW1lLFxuICB0eXBlIENvbXBpbGVkVGVtcGxhdGUsXG4gIHR5cGUgQ29udGVudFN3YXBQbGFuLFxuICB0eXBlIENvbnRlbnRTd2FwU2NoZW1lLFxuICBEaXJlY3RpdmUsXG4gIHR5cGUgTGlzdFJlbmRlclBsYW4sXG4gIHR5cGUgTGlzdFJlbmRlclNjaGVtZSxcbiAgdHlwZSBQYXJzZWROb3RhdGlvbixcbiAgdHlwZSBQcmVwYXJlZFRlbXBsYXRlLFxuICB0eXBlIFRhZ0NoYW5nZVBsYW4sXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IFJFRl9BVFRSID0gXCJkYXRhLW5vZGUtcmVmXCI7XG5cbmZ1bmN0aW9uIGNvbGxlY3RPcGVyYWJsZU5vZGVzKGZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KTogSFRNTEVsZW1lbnRbXSB7XG4gIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZnJhZ21lbnQsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgY29uc3Qga25vd25JZ25vcmVzID0gbmV3IFNldDxOb2RlPigpO1xuICBjb25zdCBub2RlczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gIGxldCBjdXJyZW50Tm9kZTogTm9kZSB8IG51bGwgPSB3YWxrZXIubmV4dE5vZGUoKTtcblxuICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICBpZiAoIShjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgY3VycmVudE5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxldCBwYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgIGxldCBpc0luTGlzdCA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHBhcmVudCAmJiAhaXNJbkxpc3QpIHtcbiAgICAgIGlmIChcbiAgICAgICAga25vd25JZ25vcmVzLmhhcyhwYXJlbnQpIHx8XG4gICAgICAgIChwYXJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBwYXJlbnQuaGFzQXR0cmlidXRlKERpcmVjdGl2ZS5FYWNoKSlcbiAgICAgICkge1xuICAgICAgICBpc0luTGlzdCA9IHRydWU7XG4gICAgICAgIGtub3duSWdub3Jlcy5hZGQoY3VycmVudE5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0luTGlzdCkge1xuICAgICAgbm9kZXMucHVzaChjdXJyZW50Tm9kZSk7XG4gICAgfVxuXG4gICAgY3VycmVudE5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgfVxuXG4gIHJldHVybiBub2Rlcztcbn1cblxuLyoqXG4gKiBDb21waWxlIGFuIHtAbGluayBIVE1MVGVtcGxhdGVFbGVtZW50fSBpbnRvIGEge0BsaW5rIENvbXBpbGVkVGVtcGxhdGV9IGZvclxuICogY2FjaGluZywgY2xvbmluZywgb3Igc3RvcmFnZS5cbiAqXG4gKiBDb21waWxlZCB0ZW1wbGF0ZSBvYmplY3RzIGNvbnRhaW4gYSBKU09OLXNlcmlhbGl6YWJsZSBkYXRhIHJlcHJlc2VudGF0aW9uIG9mXG4gKiBhIHRlbXBsYXRlIGFuZCBjYW4gYmUgcHJlcGFyZWQgdXNpbmcge0BsaW5rIHByZXBhcmVDb21waWxlZFRlbXBsYXRlfSB0b1xuICogY3JlYXRlIG5ldyBUZW1wbGF0ZSBpbnN0YW5jZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb21waWxlZCA9IGNvbXBpbGVUZW1wbGF0ZSgkdGVtcGxhdGVFbGVtZW50KTtcbiAqIGNvbnN0IHN0cmluZ2lmaWVkID0gSlNPTi5zdHJpbmdpZnkoY29tcGlsZWQpOyAvLyBhIEpTT04gdGVtcGxhdGUgYnVuZGxlXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVUZW1wbGF0ZShzb3VyY2U6IEhUTUxUZW1wbGF0ZUVsZW1lbnQpOiBDb21waWxlZFRlbXBsYXRlIHtcbiAgY29uc3QgcGFyc2VkTm90YXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIFBhcnNlZE5vdGF0aW9uPigpO1xuICBjb25zdCBzY2hlbWVzOiBBbnlTY2hlbWVbXSA9IFtdO1xuICBsZXQgZWxlbWVudElkID0gMDtcblxuICBjb25zdCBlbnN1cmVOb2RlUmVmID0gKGVsOiBIVE1MRWxlbWVudCk6IHN0cmluZyA9PiB7XG4gICAgbGV0IHJlZiA9IGVsLmdldEF0dHJpYnV0ZShSRUZfQVRUUik7XG4gICAgaWYgKCFyZWYpIHtcbiAgICAgIHJlZiA9IGBlbC0ke2VsZW1lbnRJZCsrfWA7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUkVGX0FUVFIsIHJlZik7XG4gICAgfVxuICAgIHJldHVybiByZWY7XG4gIH07XG5cbiAgY29uc3QgY2xvbmVkVGVtcGxhdGVFbGVtZW50ID0gc291cmNlLmNvbnRlbnQuY2xvbmVOb2RlKFxuICAgIHRydWUsXG4gICkgYXMgRG9jdW1lbnRGcmFnbWVudDtcblxuICBjb25zdCBub2RlczogSFRNTEVsZW1lbnRbXSA9IGNvbGxlY3RPcGVyYWJsZU5vZGVzKGNsb25lZFRlbXBsYXRlRWxlbWVudCk7XG5cbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgLy8gQ29sbGVjdCBhbGwgYXR0cmlidXRlcyBvbiB0aGlzIG5vZGVcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBub2RlLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIGF0dHJpYnV0ZXMuc2V0KG5hbWUsIG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZGlyZWN0aXZlIGF0dHJpYnV0ZXNcbiAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZV0gb2YgYXR0cmlidXRlcykge1xuICAgICAgLy8gQmFpbCBxdWlja2x5IGlmIHRoaXMgaXNuJ3QgYSBkaXJlY3RpdmVcbiAgICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSA9PT0gbnVsbCB8fCBhdHRyaWJ1dGVOYW1lWzBdICE9PSBcIjpcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIG5vdGF0aW9uIGhhcyBiZWVuIHBhcnNlZCBiZWZvcmUsIHJldXNlIHRoYXRcbiAgICAgIGxldCBub3RhdGlvbiA9IHBhcnNlZE5vdGF0aW9ucy5nZXQoYXR0cmlidXRlVmFsdWUpO1xuXG4gICAgICBpZiAobm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBub3RhdGlvbiA9IHBhcnNlTm90YXRpb24oYXR0cmlidXRlVmFsdWUpO1xuICAgICAgICBwYXJzZWROb3RhdGlvbnMuc2V0KGF0dHJpYnV0ZVZhbHVlLCBub3RhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXG4gICAgICAvLyA6OmtleSBpcyBoYW5kbGVkIGluIHRoZSA6OmVhY2ggcm91dGVcbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuS2V5KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUQUcgQ0hBTkdFIFNDSEVNRVNcbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuVGFnKSB7XG4gICAgICAgIHNjaGVtZXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJ0YWdcIixcbiAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgICBub2RlUmVmOiBlbnN1cmVOb2RlUmVmKG5vZGUpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gTElTVCBSRU5ERVIgU0NIRU1FU1xuICAgICAgZWxzZSBpZiAoYXR0cmlidXRlTmFtZSA9PT0gRGlyZWN0aXZlLkVhY2gpIHtcbiAgICAgICAgY29uc3Qgbm9kZVJlZiA9IGVuc3VyZU5vZGVSZWYobm9kZSk7XG5cbiAgICAgICAgLy8gQSA6OmtleSBkaXJlY3RpdmUgaXMgcmVxdWlyZWQgd2l0aCBhbnkgOjplYWNoXG4gICAgICAgIGNvbnN0IGtleU5vdGF0aW9uID0gbm9kZS5nZXRBdHRyaWJ1dGUoRGlyZWN0aXZlLktleSk7XG4gICAgICAgIGlmIChrZXlOb3RhdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoRGlyZWN0aXZlLktleSk7XG5cbiAgICAgICAgY29uc3QgbGlzdENvbnRlbnRIdG1sID0gbm9kZS5pbm5lckhUTUw7XG5cbiAgICAgICAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjaGVtZTogTGlzdFJlbmRlclNjaGVtZSA9IHtcbiAgICAgICAgICB0eXBlOiBcImVhY2hcIixcbiAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgICBrZXlOb3RhdGlvbjogcGFyc2VOb3RhdGlvbihrZXlOb3RhdGlvbiksXG4gICAgICAgICAgbm9kZVJlZixcbiAgICAgICAgICBsaXN0Q29udGVudEh0bWwsXG4gICAgICAgIH07XG5cbiAgICAgICAgc2NoZW1lcy5wdXNoKHNjaGVtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENPTlRFTlQgU1dBUCBTQ0hFTUVTXG4gICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuU3dhcCkge1xuICAgICAgICBjb25zdCBzY2hlbWU6IENvbnRlbnRTd2FwU2NoZW1lID0ge1xuICAgICAgICAgIHR5cGU6IFwic3dhcFwiLFxuICAgICAgICAgIG5vdGF0aW9uLFxuICAgICAgICAgIG5vZGVSZWY6IGVuc3VyZU5vZGVSZWYobm9kZSksXG4gICAgICAgIH07XG5cbiAgICAgICAgc2NoZW1lcy5wdXNoKHNjaGVtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFUVFJJQlVURSBVUERBVEUgU0NIRU1FU1xuICAgICAgZWxzZSBpZiAoaXNCb3VuZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICBjb25zdCBiaW5kTmFtZSA9IGF0dHJpYnV0ZU5hbWUuc2xpY2UoMSk7XG5cbiAgICAgICAgY29uc3Qgc2NoZW1lOiBBdHRyaWJ1dGVVcGRhdGVTY2hlbWUgPSB7XG4gICAgICAgICAgdHlwZTogXCJhdHRyXCIsXG4gICAgICAgICAgbm90YXRpb24sXG4gICAgICAgICAgYXR0cmlidXRlOiBiaW5kTmFtZSxcbiAgICAgICAgICBub2RlUmVmOiBlbnN1cmVOb2RlUmVmKG5vZGUpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNjaGVtZXMucHVzaChzY2hlbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFRlbXBsYXRlOiAke2F0dHJpYnV0ZU5hbWV9IGlzIG5vdCBhIHZhbGlkIGRpcmVjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgbm90YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWROb3RhdGlvbj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgcGFyc2VkTm90YXRpb25zKSB7XG4gICAgbm90YXRpb25zW2tleV0gPSB2YWw7XG4gIH1cblxuICBjb25zdCB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgdGVtcC5hcHBlbmRDaGlsZChjbG9uZWRUZW1wbGF0ZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcbiAgY29uc3QgaHRtbCA9IHRlbXAuaW5uZXJIVE1MO1xuXG4gIGNvbnN0IGNvbXBpbGVkOiBDb21waWxlZFRlbXBsYXRlID0ge1xuICAgIGh0bWwsXG4gICAgc2NoZW1lcyxcbiAgICBub3RhdGlvbnMsXG4gIH07XG5cbiAgcmV0dXJuIGNvbXBpbGVkO1xufVxuXG4vKipcbiAqIEdpdmVuIGEge0BsaW5rIENvbXBpbGVkVGVtcGxhdGV9IHN0cnVjdHVyZSwgcmV0dXJuIGFuIG9iamVjdCBjb250YWluaW5nIHRoZVxuICogZGF0YSBuZWVkZWQgdG8gY3JlYXRlIG5ldyBUZW1wbGF0ZSBpbnN0YW5jZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb21waWxlZFRlbXBsYXRlID0gZ2V0Q29tcGlsZWRUZW1wbGF0ZUpTT04oKTtcbiAqIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29tcGlsZWRUZW1wbGF0ZSk7XG4gKiBjb25zdCBwcmVwYXJlZCA9IHByZXBhcmVDb21waWxlZFRlbXBsYXRlKHBhcnNlZCk7XG4gKlxuICogLy8gRWxzZXdoZXJlLi4uXG4gKlxuICogY29uc3QgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUocHJlcGFyZWQpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlQ29tcGlsZWRUZW1wbGF0ZShcbiAgY29tcGlsZWQ6IENvbXBpbGVkVGVtcGxhdGUsXG4gIHByb3RvdHlwZUZyYWdtZW50PzogRG9jdW1lbnRGcmFnbWVudCxcbik6IFByZXBhcmVkVGVtcGxhdGUge1xuICBjb25zdCBwbGFuc0J5Tm90YXRpb246IE1hcDxzdHJpbmcsIFNldDxBbnlSZW5kZXJQbGFuPj4gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IG5vdGF0aW9uQWNjZXNzb3JzOiBNYXA8c3RyaW5nLCBOb3RhdGlvbkFjY2Vzc29yPiA9IG5ldyBNYXAoKTtcbiAgY29uc3Qgbm9kZVJlZnM6IE1hcDxzdHJpbmcsIEhUTUxFbGVtZW50PiA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IFtub3RhdGlvbiwgcGFyc2VkXSBvZiBPYmplY3QuZW50cmllcyhjb21waWxlZC5ub3RhdGlvbnMpKSB7XG4gICAgbm90YXRpb25BY2Nlc3NvcnMuc2V0KG5vdGF0aW9uLCBidWlsZFZhbHVlQWNjZXNzb3IocGFyc2VkKSk7XG4gIH1cblxuICBjb25zdCBmcmFnbWVudCA9IHByb3RvdHlwZUZyYWdtZW50ID8/IGh0bWxUb0ZyYWdtZW50KGNvbXBpbGVkLmh0bWwpO1xuXG4gIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZnJhZ21lbnQsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULCB7XG4gICAgYWNjZXB0Tm9kZShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG5vZGUuaGFzQXR0cmlidXRlKFJFRl9BVFRSKVxuICAgICAgICA/IE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVFxuICAgICAgICA6IE5vZGVGaWx0ZXIuRklMVEVSX1NLSVA7XG4gICAgfSxcbiAgfSk7XG5cbiAgbGV0IG1hcmtOb2RlOiBOb2RlIHwgbnVsbCA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuXG4gIHdoaWxlIChtYXJrTm9kZSkge1xuICAgIGlmICghKG1hcmtOb2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZWYgPSBtYXJrTm9kZS5nZXRBdHRyaWJ1dGUoUkVGX0FUVFIpO1xuXG4gICAgaWYgKHJlZiA9PT0gbnVsbCkge1xuICAgICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbiBpbiBwcmFjdGljZSwgYXMgdGhlIHRyZWUgd2Fsa2VyIG9ubHkgc3VyZmFjZXNcbiAgICAgIC8vIGVsZW1lbnRzIHdpdGggYW4gZXh0YW50IG5vZGUgcmVmIGF0dHJpYnV0ZVxuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbiAgICB9XG5cbiAgICBub2RlUmVmcy5zZXQocmVmLCBtYXJrTm9kZSk7XG4gICAgbWFya05vZGUucmVtb3ZlQXR0cmlidXRlKFJFRl9BVFRSKTtcbiAgICBtYXJrTm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuICB9XG5cbiAgY29uc3QgYXNzb2NpYXRlUGxhbiA9IChwbGFuOiBBbnlSZW5kZXJQbGFuLCBub3RhdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgbGV0IG5vdGF0aW9uUGxhbnMgPSBwbGFuc0J5Tm90YXRpb24uZ2V0KG5vdGF0aW9uKTtcbiAgICBpZiAoIW5vdGF0aW9uUGxhbnMpIHtcbiAgICAgIG5vdGF0aW9uUGxhbnMgPSBuZXcgU2V0KCk7XG4gICAgICBwbGFuc0J5Tm90YXRpb24uc2V0KG5vdGF0aW9uLCBub3RhdGlvblBsYW5zKTtcbiAgICB9XG4gICAgbm90YXRpb25QbGFucy5hZGQocGxhbik7XG4gIH07XG5cbiAgY29uc3QgZ2V0QnlOb2RlUmVmID0gKG5vZGVSZWY6IHN0cmluZyk6IEhUTUxFbGVtZW50ID0+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBub2RlUmVmcy5nZXQobm9kZVJlZik7XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9ERV9SRUYpO1xuICB9O1xuXG4gIGZvciAoY29uc3Qgc2NoZW1lIG9mIGNvbXBpbGVkLnNjaGVtZXMpIHtcbiAgICAvLyBIeWRyYXRlIExpc3Qgc2NoZW1lcyBpbnRvIExpc3QgcGxhbnNcbiAgICBpZiAoc2NoZW1lLnR5cGUgPT09IFwiZWFjaFwiKSB7XG4gICAgICBjb25zdCBpdGVtUHJvdG90eXBlID0gZ2V0QnlOb2RlUmVmKHNjaGVtZS5ub2RlUmVmKTtcbiAgICAgIGNvbnN0IGxpc3RDb250YWluZXIgPSBpdGVtUHJvdG90eXBlLnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgIGlmICghbGlzdENvbnRhaW5lcikge1xuICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9NSVNTSU5HX0xJU1RfUEFSRU5UKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGxpc3Qgc3RhcnQvZW5kIG1hcmtlcnNcbiAgICAgIGNvbnN0IHN0YXJ0TWFya2VyID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcImxpc3Qtc3RhcnRcIik7XG4gICAgICBjb25zdCBlbmRNYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KFwibGlzdC1lbmRcIik7XG5cbiAgICAgIGxpc3RDb250YWluZXIuaW5zZXJ0QmVmb3JlKHN0YXJ0TWFya2VyLCBpdGVtUHJvdG90eXBlKTtcbiAgICAgIGxpc3RDb250YWluZXIuaW5zZXJ0QmVmb3JlKGVuZE1hcmtlciwgaXRlbVByb3RvdHlwZS5uZXh0U2libGluZyk7XG5cbiAgICAgIC8vIFNoYWxsb3cgY29weSBvZiB0aGUgcm93IHJvb3RcbiAgICAgIGNvbnN0IHJvd1Jvb3RFbGVtZW50ID0gaXRlbVByb3RvdHlwZS5jbG9uZU5vZGUoZmFsc2UpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAvLyBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgcm93IGludG8gYSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgdGVtcGxhdGVDb250ZW50U3JjID0gaHRtbFRvRnJhZ21lbnQoc2NoZW1lLmxpc3RDb250ZW50SHRtbCk7XG4gICAgICBjb25zdCByb3dUZW1wbGF0ZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gICAgICByb3dUZW1wbGF0ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGVtcGxhdGVDb250ZW50U3JjKTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSBvcmlnaW5hbCByb290IHByb3RvdHlwZSBzaW5jZSB3ZSB3aWxsIGJlIHJlbmRlcmluZyBuZXcgaXRlbXNcbiAgICAgIGl0ZW1Qcm90b3R5cGUucmVtb3ZlKCk7XG5cbiAgICAgIGNvbnN0IHBsYW46IExpc3RSZW5kZXJQbGFuID0ge1xuICAgICAgICB0eXBlOiBcImVhY2hcIixcbiAgICAgICAgbm90YXRpb246IHNjaGVtZS5ub3RhdGlvbixcbiAgICAgICAga2V5Tm90YXRpb246IHNjaGVtZS5rZXlOb3RhdGlvbixcbiAgICAgICAgbGlzdENvbnRhaW5lckVsZW1lbnQ6IGxpc3RDb250YWluZXIsXG4gICAgICAgIHJvd1RlbXBsYXRlRWxlbWVudCxcbiAgICAgICAgcm93Um9vdEVsZW1lbnQsXG4gICAgICAgIHN0YXJ0TWFya2VyLFxuICAgICAgICBlbmRNYXJrZXIsXG4gICAgICAgIHJvd1RlbXBsYXRlc0J5Um9vdDogbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgcm93Um9vdHNCeUtleTogbmV3IE1hcCgpLFxuICAgICAgfTtcblxuICAgICAgYXNzb2NpYXRlUGxhbihwbGFuLCBzY2hlbWUubm90YXRpb24uYmFzZSk7XG4gICAgfVxuICAgIC8vIEh5ZHJhdGUgU3dhcCBzY2hlbWVzIGludG8gU3dhcCBwbGFuc1xuICAgIGVsc2UgaWYgKHNjaGVtZS50eXBlID09PSBcInN3YXBcIikge1xuICAgICAgY29uc3QgcGxhbjogQ29udGVudFN3YXBQbGFuID0ge1xuICAgICAgICB0eXBlOiBcInN3YXBcIixcbiAgICAgICAgbm90YXRpb246IHNjaGVtZS5ub3RhdGlvbixcbiAgICAgICAgbm9kZTogZ2V0QnlOb2RlUmVmKHNjaGVtZS5ub2RlUmVmKSxcbiAgICAgIH07XG5cbiAgICAgIGFzc29jaWF0ZVBsYW4ocGxhbiwgc2NoZW1lLm5vdGF0aW9uLmJhc2UpO1xuICAgIH1cblxuICAgIC8vIEh5ZHJhdGUgVGFnIGNoYW5nZSBwbGFuc1xuICAgIGVsc2UgaWYgKHNjaGVtZS50eXBlID09PSBcInRhZ1wiKSB7XG4gICAgICBjb25zdCBwbGFuOiBUYWdDaGFuZ2VQbGFuID0ge1xuICAgICAgICB0eXBlOiBcInRhZ1wiLFxuICAgICAgICBub3RhdGlvbjogc2NoZW1lLm5vdGF0aW9uLFxuICAgICAgICBub2RlOiBnZXRCeU5vZGVSZWYoc2NoZW1lLm5vZGVSZWYpLFxuICAgICAgfTtcblxuICAgICAgYXNzb2NpYXRlUGxhbihwbGFuLCBwbGFuLm5vdGF0aW9uLmJhc2UpO1xuICAgIH1cblxuICAgIC8vIEh5ZHJhdGUgQXR0cmlidXRlIHVwZGF0ZSBwbGFuc1xuICAgIGVsc2UgaWYgKHNjaGVtZS50eXBlID09PSBcImF0dHJcIikge1xuICAgICAgY29uc3QgcGxhbjogQXR0cmlidXRlVXBkYXRlUGxhbiA9IHtcbiAgICAgICAgdHlwZTogXCJhdHRyXCIsXG4gICAgICAgIGF0dHJpYnV0ZTogc2NoZW1lLmF0dHJpYnV0ZSxcbiAgICAgICAgbm90YXRpb246IHNjaGVtZS5ub3RhdGlvbixcbiAgICAgICAgbm9kZTogZ2V0QnlOb2RlUmVmKHNjaGVtZS5ub2RlUmVmKSxcbiAgICAgIH07XG5cbiAgICAgIGFzc29jaWF0ZVBsYW4ocGxhbiwgcGxhbi5ub3RhdGlvbi5iYXNlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBsYW5zQnlOb3RhdGlvbixcbiAgICBub3RhdGlvbkFjY2Vzc29ycyxcbiAgICBmcmFnbWVudCxcbiAgfTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgY2xhc3NpZnkgfSBmcm9tIFwiI2hlbHBlclwiO1xuaW1wb3J0IHtcbiAgYXBwbHlBdHRyaWJ1dGVNYXAsXG4gIGNoYW5nZVRhZyxcbiAgY3JlYXRlQXR0cmlidXRlTWFwLFxuICBzZXJpYWxpemVBdHRyaWJ1dGUsXG59IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHsgYnVpbGRWYWx1ZUFjY2Vzc29yIH0gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSwgdHlwZSBUZW1wbGF0ZUNvbnRleHQgfSBmcm9tIFwiLi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHR5cGUge1xuICBBdHRyaWJ1dGVVcGRhdGVKb2IsXG4gIEF0dHJpYnV0ZVVwZGF0ZVBsYW4sXG4gIENvbnRlbnRTd2FwSm9iLFxuICBDb250ZW50U3dhcFBsYW4sXG4gIExpc3RSZW5kZXJKb2IsXG4gIExpc3RSZW5kZXJKb2JJdGVtLFxuICBMaXN0UmVuZGVyUGxhbixcbiAgVGFnQ2hhbmdlSm9iLFxuICBUYWdDaGFuZ2VQbGFuLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgU0tJUFBFRF9KT0IgPSBTeW1ib2woXCJub29wXCIpO1xuZXhwb3J0IHR5cGUgU2tpcHBlZEpvYiA9IHR5cGVvZiBTS0lQUEVEX0pPQjtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBBVFRSSUJVVEUgVVBEQVRFIEpPQlMgLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUF0dHJpYnV0ZUpvYihcbiAgcGxhbjogQXR0cmlidXRlVXBkYXRlUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IEF0dHJpYnV0ZVVwZGF0ZUpvYiB8IFNraXBwZWRKb2Ige1xuICBjb25zdCByYXdWYWx1ZSA9IHZhbHVlcy5nZXQocGxhbi5ub3RhdGlvbi5iYXNlKTtcbiAgbGV0IHZhbHVlID0gdHlwZW9mIHJhd1ZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyByYXdWYWx1ZShwbGFuLm5vZGUpIDogcmF3VmFsdWU7XG5cbiAgLy8gUGFyc2UgdGhlIHZhbHVlIHdpdGggYGNsYXNzaWZ5YCBpZiBzZXR0aW5nIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgaWYgKHBsYW4uYXR0cmlidXRlID09PSBcImNsYXNzXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdmFsdWUgPSBjbGFzc2lmeSh2YWx1ZSk7XG4gIH1cblxuICBjb25zdCBzZXJpYWxpemVkVmFsdWUgPSBzZXJpYWxpemVBdHRyaWJ1dGUodmFsdWUpO1xuICBjb25zdCBjdXJyZW50ID0gcGxhbi5ub2RlLmdldEF0dHJpYnV0ZShwbGFuLmF0dHJpYnV0ZSk7XG5cbiAgaWYgKHNlcmlhbGl6ZWRWYWx1ZSAhPT0gY3VycmVudCkge1xuICAgIHJldHVybiBbcGxhbi5ub2RlLCBwbGFuLmF0dHJpYnV0ZSwgc2VyaWFsaXplZFZhbHVlXTtcbiAgfVxuXG4gIHJldHVybiBTS0lQUEVEX0pPQjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkF0dHJpYnV0ZUpvYnMoam9iczogQXR0cmlidXRlVXBkYXRlSm9iW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbm9kZSwgbmFtZSwgdmFsdWVdIG9mIGpvYnMpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBDT05URU5UIFNXQVAgSk9CUyAvL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVDb250ZW50U3dhcEpvYihcbiAgcGxhbjogQ29udGVudFN3YXBQbGFuLFxuICB2YWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+LFxuKTogQ29udGVudFN3YXBKb2IgfCBTa2lwcGVkSm9iIHtcbiAgY29uc3QgcmF3VmFsdWUgPSB2YWx1ZXMuZ2V0KHBsYW4ubm90YXRpb24uYmFzZSk7XG4gIGNvbnN0IHZhbHVlID0gdHlwZW9mIHJhd1ZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyByYXdWYWx1ZShwbGFuLm5vZGUpIDogcmF3VmFsdWU7XG5cbiAgLy8gU3RyaW5nLCBOdW1iZXIsIEJvb2xlYW4gLT4gVGV4dCBOb2RlXG4gIGlmIChcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiXG4gICkge1xuICAgIGNvbnN0IGFzU3RyID0gYCR7dmFsdWV9YDtcbiAgICBpZiAocGxhbi5ub2RlLnRleHRDb250ZW50ID09PSBhc1N0cikge1xuICAgICAgcmV0dXJuIFNLSVBQRURfSk9CO1xuICAgIH1cblxuICAgIHJldHVybiBbcGxhbiwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYXNTdHIpXTtcbiAgfVxuXG4gIC8vIE51bGxpc2ggdmFsdWVzIC0+IENvbW1lbnRcbiAgZWxzZSBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChwbGFuLm5vZGUgaW5zdGFuY2VvZiBDb21tZW50KSB7XG4gICAgICByZXR1cm4gU0tJUFBFRF9KT0I7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtwbGFuLCBkb2N1bWVudC5jcmVhdGVDb21tZW50KFwiZW1wdHlcIildO1xuICB9XG5cbiAgLy8gSFRNTEVsZW1lbnQgLT4gU3dhcCBub2Rlc1xuICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKE9iamVjdC5pcyhwbGFuLm5vZGUsIHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFNLSVBQRURfSk9CO1xuICAgIH1cblxuICAgIHJldHVybiBbcGxhbiwgdmFsdWUuY2xvbmVOb2RlKHRydWUpXTtcbiAgfVxuXG4gIC8vIEFueXRoaW5nIGVsc2UgLT4gVW5zdXBwb3J0ZWRcbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgIEVycm9yQ29kZS5JTlZBTElEX0NPTlRFTlQsXG4gICAgICB0eXBlb2YgdmFsdWUsXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWx1ZSksXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuQ29udGVudFN3YXBKb2JzKGpvYnM6IENvbnRlbnRTd2FwSm9iW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbcGxhbiwgcmVwbGFjZV0gb2Ygam9icykge1xuICAgIGNvbnN0IHBhcmVudCA9IHBsYW4ubm9kZS5wYXJlbnROb2RlO1xuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4gaW4gcHJhY3RpY2VcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gICAgfVxuXG4gICAgcGFyZW50LnJlcGxhY2VDaGlsZChyZXBsYWNlLCBwbGFuLm5vZGUpO1xuICAgIHBsYW4ubm9kZSA9IHJlcGxhY2U7XG4gIH1cbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBUQUcgQ0hBTkdFIEpPQlMgLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVRhZ0NoYW5nZUpvYihcbiAgcGxhbjogVGFnQ2hhbmdlUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IFRhZ0NoYW5nZUpvYiB8IFNraXBwZWRKb2Ige1xuICBjb25zdCByYXdWYWx1ZSA9IHZhbHVlcy5nZXQocGxhbi5ub3RhdGlvbi5iYXNlKSA/PyBcIlwiO1xuICBjb25zdCB2YWx1ZSA9IHR5cGVvZiByYXdWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gcmF3VmFsdWUocGxhbi5ub2RlKSA6IHJhd1ZhbHVlO1xuICBjb25zdCBuZXh0VGFnID0gYCR7dmFsdWV9YC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBjdXJyZW50VGFnID0gcGxhbi5ub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICBpZiAoIW5leHRUYWcgfHwgbmV4dFRhZyA9PT0gY3VycmVudFRhZykge1xuICAgIHJldHVybiBTS0lQUEVEX0pPQjtcbiAgfVxuXG4gIHJldHVybiBbcGxhbiwgbmV4dFRhZ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5UYWdDaGFuZ2VKb2JzKGpvYnM6IFRhZ0NoYW5nZUpvYltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW3BsYW4sIG5leHRUYWddIG9mIGpvYnMpIHtcbiAgICBwbGFuLm5vZGUgPSBjaGFuZ2VUYWcocGxhbi5ub2RlLCBuZXh0VGFnKTtcbiAgfVxufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBMSVNUIFJFTkRFUiBKT0JTIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmZ1bmN0aW9uIGZldGNoTGlzdERhdGEoXG4gIHBsYW46IExpc3RSZW5kZXJQbGFuLFxuICB2YWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSB7XG4gIGNvbnN0IG5vdGF0aW9uVmFsdWUgPSB2YWx1ZXMuZ2V0KHBsYW4ubm90YXRpb24uYmFzZSk7XG4gIGNvbnN0IGV2YWx1YXRlZFZhbHVlID1cbiAgICB0eXBlb2Ygbm90YXRpb25WYWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IG5vdGF0aW9uVmFsdWUocGxhbi5zdGFydE1hcmtlci5wYXJlbnROb2RlKVxuICAgICAgOiBub3RhdGlvblZhbHVlO1xuXG4gIGlmIChldmFsdWF0ZWRWYWx1ZSA9PT0gbnVsbCB8fCBldmFsdWF0ZWRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoZXZhbHVhdGVkVmFsdWUpKSB7XG4gICAgcmV0dXJuIGV2YWx1YXRlZFZhbHVlO1xuICB9XG5cbiAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9MSVNUKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEhUTUxFbGVtZW50cyhzdGFydDogTm9kZSwgZW5kOiBOb2RlKTogU2V0PEhUTUxFbGVtZW50PiB7XG4gIGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IHN0YXJ0O1xuICBjb25zdCBub2RlU2V0ID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcblxuICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSBlbmQpIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICBub2RlU2V0LmFkZChub2RlKTtcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgfVxuXG4gIHJldHVybiBub2RlU2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUxpc3RSZW5kZXJKb2IoXG4gIHBsYW46IExpc3RSZW5kZXJQbGFuLFxuICB2YWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+LFxuKTogTGlzdFJlbmRlckpvYiB8IFNraXBwZWRKb2Ige1xuICAvLyBGZXRjaCB0aGUgZGF0YSBmb3IgcmVuZGVyaW5nIHRoZSB1cGRhdGVkIGxpc3QgaXRlbXNcbiAgY29uc3QgbGlzdERhdGEgPSBmZXRjaExpc3REYXRhKHBsYW4sIHZhbHVlcyk7XG5cbiAgLy8gRW1wdHkgLT4gUmVtb3ZlIHRoZSBsaXN0IGNvbnRlbnRzIGVudGlyZWx5IGFuZCBleGl0XG4gIGlmIChsaXN0RGF0YS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW3BsYW4sIFtdXTtcbiAgfVxuXG4gIC8vIENvbGxlY3QgZXhpc3RpbmcgZWxlbWVudHMgZnJvbSB0aGUgRE9NIGZvciBhc3Nlc3NtZW50XG4gIGNvbnN0IHsgcm93VGVtcGxhdGVzQnlSb290LCByb3dUZW1wbGF0ZUVsZW1lbnQsIHJvd1Jvb3RFbGVtZW50IH0gPSBwbGFuO1xuICBjb25zdCBrZXlBY2Nlc3NvciA9IGJ1aWxkVmFsdWVBY2Nlc3NvcihwbGFuLmtleU5vdGF0aW9uKTtcbiAgY29uc3QgbGlzdFJlbmRlckNvbnRleHRzOiBNYXA8dW5rbm93biwgTGlzdFJlbmRlckpvYkl0ZW0+ID0gbmV3IE1hcCgpO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0RGF0YSkge1xuICAgIGNvbnN0IGNvbnRleHQ6IFRlbXBsYXRlQ29udGV4dCA9IHtcbiAgICAgIGl0ZW0sXG4gICAgfTtcblxuICAgIGNvbnN0IGtleSA9IGtleUFjY2Vzc29yKGNvbnRleHQpO1xuXG4gICAgaWYgKGxpc3RSZW5kZXJDb250ZXh0cy5oYXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWSxcbiAgICAgICAgU3RyaW5nKGtleSksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIEhUTUwgRWxlbWVudCB3ZSBleHBlY3QgdG8gc2VlIGhlcmVcbiAgICBsZXQgcm93Um9vdCA9IHBsYW4ucm93Um9vdHNCeUtleS5nZXQoa2V5KTtcblxuICAgIGlmIChyb3dSb290ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvd1Jvb3QgPSByb3dSb290RWxlbWVudC5jbG9uZU5vZGUoZmFsc2UpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgcGxhbi5yb3dSb290c0J5S2V5LnNldChrZXksIHJvd1Jvb3QpO1xuICAgIH1cblxuICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIHRlbXBsYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcm93IHJvb3RcbiAgICBsZXQgcm93VGVtcGxhdGUgPSByb3dUZW1wbGF0ZXNCeVJvb3QuZ2V0KHJvd1Jvb3QpO1xuXG4gICAgaWYgKHJvd1RlbXBsYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvd1RlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHJvd1RlbXBsYXRlRWxlbWVudCk7XG4gICAgICByb3dUZW1wbGF0ZXNCeVJvb3Quc2V0KHJvd1Jvb3QsIHJvd1RlbXBsYXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCBqb2JJdGVtOiBMaXN0UmVuZGVySm9iSXRlbSA9IHtcbiAgICAgIGNvbnRleHQsXG4gICAgICByb290OiByb3dSb290LFxuICAgICAgdGVtcGxhdGU6IHJvd1RlbXBsYXRlLFxuICAgICAgYXR0ck1hcDogY3JlYXRlQXR0cmlidXRlTWFwKGl0ZW0pLFxuICAgIH07XG5cbiAgICBsaXN0UmVuZGVyQ29udGV4dHMuc2V0KGtleSwgam9iSXRlbSk7XG4gIH1cblxuICAvLyBDbGVhbiB1cCBjYWNoZWQgZGF0YVxuICBmb3IgKGNvbnN0IFtrZXksIHJvb3RdIG9mIHBsYW4ucm93Um9vdHNCeUtleSkge1xuICAgIGlmICghbGlzdFJlbmRlckNvbnRleHRzLmhhcyhrZXkpKSB7XG4gICAgICBwbGFuLnJvd1Jvb3RzQnlLZXkuZGVsZXRlKGtleSk7XG4gICAgICBwbGFuLnJvd1RlbXBsYXRlc0J5Um9vdC5kZWxldGUocm9vdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtwbGFuLCBBcnJheS5mcm9tKGxpc3RSZW5kZXJDb250ZXh0cy52YWx1ZXMoKSldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuTGlzdFJlbmRlckpvYnMoam9iczogTGlzdFJlbmRlckpvYltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW3BsYW4sIHJlbmRlckl0ZW1zXSBvZiBqb2JzKSB7XG4gICAgY29uc3QgeyBlbmRNYXJrZXIsIGxpc3RDb250YWluZXJFbGVtZW50IH0gPSBwbGFuO1xuXG4gICAgLy8gRmFzdCBwYXRoIGZvciBlbXB0eSBsaXN0cyAtPiBSZW1vdmUgZXZlcnl0aGluZyBhbmQgY29udGludWVcbiAgICBpZiAocmVuZGVySXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgcGxhbi5yb3dSb290c0J5S2V5LnZhbHVlcygpKSB7XG4gICAgICAgIHJvb3QucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgICBwbGFuLnJvd1Jvb3RzQnlLZXkuY2xlYXIoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgc2NhbiB0aGUgY3VycmVudCBub2RlcyBhbmQgbW9kaWZ5IGFzIG5lZWRlZFxuICAgIGNvbnN0IGV4aXN0aW5nRE9NTm9kZXMgPSBBcnJheS5mcm9tKFxuICAgICAgY29sbGVjdEhUTUxFbGVtZW50cyhwbGFuLnN0YXJ0TWFya2VyLCBwbGFuLmVuZE1hcmtlciksXG4gICAgKTtcblxuICAgIGNvbnN0IHJvb3RzVG9LZWVwID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcblxuICAgIGxldCBleGlzdGluZ0RPTU5vZGVJZHggPSAwO1xuXG4gICAgZm9yIChjb25zdCByZW5kZXJJdGVtIG9mIHJlbmRlckl0ZW1zKSB7XG4gICAgICBjb25zdCB7IHJvb3QsIGF0dHJNYXAsIGNvbnRleHQsIHRlbXBsYXRlIH0gPSByZW5kZXJJdGVtO1xuICAgICAgY29uc3QgZXhpc3RpbmdET01Ob2RlID0gZXhpc3RpbmdET01Ob2Rlc1tleGlzdGluZ0RPTU5vZGVJZHhdO1xuXG4gICAgICAvLyBTcHJlYWQgaXRlbSBhcyBhdHRyaWJ1dGVzIG9uIHRoZSByb290IGFuZCB1cGRhdGUgdGhlIHRlbXBsYXRlXG4gICAgICBhcHBseUF0dHJpYnV0ZU1hcChyb290LCBhdHRyTWFwKTtcbiAgICAgIHRlbXBsYXRlLnJlbmRlcihyb290LCBjb250ZXh0KTtcblxuICAgICAgcm9vdHNUb0tlZXAuYWRkKHJvb3QpO1xuXG4gICAgICAvLyBOb2RlIGlzIHRoZSBleGlzdGluZyBET00gTm9kZSwgY29udGludWVcbiAgICAgIGlmIChPYmplY3QuaXMoZXhpc3RpbmdET01Ob2RlLCByb290KSkge1xuICAgICAgICBleGlzdGluZ0RPTU5vZGVJZHggKz0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vIGV4aXN0aW5nIG5vZGUgLT4gYXBwZW5kIGl0ZW1cbiAgICAgIGlmICghZXhpc3RpbmdET01Ob2RlKSB7XG4gICAgICAgIGxpc3RDb250YWluZXJFbGVtZW50Lmluc2VydEJlZm9yZShyb290LCBlbmRNYXJrZXIpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRE9NIG5vZGUgZXhpc3RzIGJ1dCBpc24ndCB0aGUgb25lIHdlJ3JlIGxvb2tpbmcgZm9yLiBJbnNlcnQgYmVmb3JlLlxuICAgICAgbGlzdENvbnRhaW5lckVsZW1lbnQuaW5zZXJ0QmVmb3JlKHJvb3QsIGV4aXN0aW5nRE9NTm9kZSk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgb2xkIGVsZW1lbnRzXG4gICAgZm9yIChjb25zdCByb290IG9mIGV4aXN0aW5nRE9NTm9kZXMpIHtcbiAgICAgIGlmICghcm9vdHNUb0tlZXAuaGFzKHJvb3QpKSB7XG4gICAgICAgIHJvb3QucmVtb3ZlKCk7XG4gICAgICAgIHBsYW4ucm93VGVtcGxhdGVzQnlSb290LmRlbGV0ZShyb290KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB7IGZyYWdtZW50Q2FjaGUsIGh0bWxUb0ZyYWdtZW50IH0gZnJvbSBcIi4uL3V0aWwvZnJhZ21lbnRzXCI7XG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gXCIuLi91dGlsL2xydS1jYWNoZVwiO1xuaW1wb3J0IHsgY29tcGlsZVRlbXBsYXRlLCBwcmVwYXJlQ29tcGlsZWRUZW1wbGF0ZSB9IGZyb20gXCIuL2J1aWxkXCI7XG5pbXBvcnQge1xuICBwcmVwYXJlQXR0cmlidXRlSm9iLFxuICBwcmVwYXJlQ29udGVudFN3YXBKb2IsXG4gIHByZXBhcmVMaXN0UmVuZGVySm9iLFxuICBwcmVwYXJlVGFnQ2hhbmdlSm9iLFxuICBydW5BdHRyaWJ1dGVKb2JzLFxuICBydW5Db250ZW50U3dhcEpvYnMsXG4gIHJ1bkxpc3RSZW5kZXJKb2JzLFxuICBydW5UYWdDaGFuZ2VKb2JzLFxuICBTS0lQUEVEX0pPQixcbn0gZnJvbSBcIi4vam9ic1wiO1xuaW1wb3J0IHR5cGUgeyBOb3RhdGlvbkFjY2Vzc29yIH0gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFueVJlbmRlclBsYW4sXG4gIEF0dHJpYnV0ZVVwZGF0ZUpvYixcbiAgQ29tcGlsZWRUZW1wbGF0ZSxcbiAgQ29udGVudFN3YXBKb2IsXG4gIExpc3RSZW5kZXJKb2IsXG4gIFRhZ0NoYW5nZUpvYixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgVGVtcGxhdGVSb290ID0gSFRNTEVsZW1lbnQgfCBTaGFkb3dSb290O1xuZXhwb3J0IHR5cGUgVGVtcGxhdGVDb250ZXh0ID0ge1xuICBhdHRyPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD47XG4gIHN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaXRlbT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpbmRleD86IG51bWJlcjtcbn07XG5cbmNvbnN0IGNvbXBpbGVDYWNoZSA9IG5ldyBMUlVDYWNoZTxIVE1MVGVtcGxhdGVFbGVtZW50LCBDb21waWxlZFRlbXBsYXRlPigpO1xuXG5pZiAoX19ERVZfXyAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICh3aW5kb3cgYXMgYW55KS5fX1BBTEVUVEVfREVWVE9PTFNfXyA9IHtcbiAgICBkdW1wQ2FjaGVNZXRyaWNzOiAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcIkNvbXBpbGVkIFRlbXBsYXRlcyBDYWNoZVwiLCBjb21waWxlQ2FjaGUubWV0cmljcyk7XG4gICAgICBjb25zb2xlLmxvZyhcIkhUTUwgRnJhZ21lbnRzIENhY2hlXCIsIGZyYWdtZW50Q2FjaGUubWV0cmljcyk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBBIHJlbmRlcmFibGUgdGVtcGxhdGUgZnJvbSBhbiBIVE1MVGVtcGxhdGVFbGVtZW50XG4gKlxuICogTGV2ZXJhZ2VzIGEgc2ltcGxlIHN5bnRheCB0byBwcm92aWRlIGFjY2Vzc29ycyB0byB0ZW1wbGF0ZSBkYXRhIGZyb20gb25lIG9mXG4gKiBmb3VyIGNhdGVnb3JpZXMsIGJhc2VkIG9uIHVzZSBjYXNlOlxuICpcbiAqIGBgYFxuICogYEBgIC0+IFRoZSBgYXR0cmAgbmFtZXNwYWNlICh0aGUgaG9zdCBlbGVtZW50J3MgYXR0cmlidXRlcylcbiAqIGAkYCAtPiBUaGUgYHN0YXRlYCBuYW1lc3BhY2UgKHRoZSBob3N0IGVsZW1lbnQncyByZWFjdGl2ZSBzdGF0ZSlcbiAqIGAqYCAtPiBUaGUgYGRhdGFgIG5hbWVzcGFjZSAodGhlIGhvc3QgZWxlbWVudCdzIGNvbXB1dGVkIGRhdGEpXG4gKiBgI2AgLT4gVGhlIGBpdGVtYCBuYW1lc3BhY2UgKGxpc3QgaXRlbSBhY2Nlc3Mgd2l0aCA6OmVhY2gpXG4gKiBgYGBcbiAqXG4gKiBCaW5kIGF0dHJpYnV0ZXMgdG8gYSB2YWx1ZSB1c2luZyB0aGUgYDphdHRyaWJ1dGVgIHN5bnRheDpcbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IDppZD1cIiRpZFwiIDpjbGFzcz1cIkBjbGFzc25hbWVcIj48L2Rpdj5cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVGVtcGxhdGUge1xuICAvKipcbiAgICogUHJvcGVydGllcyByZWxhdGVkIHRvIHRoZSBnbG9iYWwgVGVtcGxhdGUgYnVpbGQgY2FjaGUuXG4gICAqXG4gICAqIFRoaXMgaXMgbm90IHNvbWV0aGluZyB0eXBpY2FsbHkgbmVlZGVkIGZvciBnZW5lcmFsIGFwcCBkZXZlbG9wbWVudCwgYnV0XG4gICAqIGFsbG93cyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiB0byB0dW5lIHRoZSBjYWNoaW5nIHN5c3RlbSBpZiBuZWVkIGJlLlxuICAgKlxuICAgKiBDYWNoZSBzaXplcyBkZWZhdWx0IHRvIDUwMCBIVE1MIFRlbXBsYXRlIEZyYWdtZW50cyBhbmQgY29tcGlsZWQgUGFsZXR0ZVxuICAgKiB0ZW1wbGF0ZXMgKGluY2x1ZGVzIG5lc3RlZCB0ZW1wbGF0ZXMgbGlrZSBsaXN0cykgdG8gY292ZXIgbW9zdCBhcHBsaWNhdGlvblxuICAgKiBuZWVkcyB3aXRob3V0IHVzaW5nIG11Y2ggbWVtb3J5LlxuICAgKi9cbiAgc3RhdGljIGNhY2hlID0ge1xuICAgIC8qKlxuICAgICAqIFdpcGUgYWxsIGNhY2hlZCB0ZW1wbGF0ZXMgYW5kIEhUTUwgZnJhZ21lbnRzXG4gICAgICovXG4gICAgY2xlYXI6ICgpOiB2b2lkID0+IHtcbiAgICAgIGZyYWdtZW50Q2FjaGUuY2xlYXIoKTtcbiAgICAgIGNvbXBpbGVDYWNoZS5jbGVhcigpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB0aGUgZGVmYXVsdCBjYWNoZSBjYXBhY2l0eSBvZiA1MDAgaXRlbXMgcGVyIGNhY2hlXG4gICAgICpcbiAgICAgKiBHZW5lcmFsIGNhY2hpbmcgZ3VpZGFuY2U6XG4gICAgICogLSA5NSUgb2YgdGhlIHRpbWUsIDUwMCB3b3JrcyBmaW5lXG4gICAgICogLSBGb3IgdmVyeSBsYXJnZSBhcHBsaWNhdGlvbnMsIHVwIHRvIDEwMDAgaXMgcmVhc29uYWJsZVxuICAgICAqIC0gRm9yIHNtYWxsZXIgYXBwcywgZHJvcHBpbmcgZG93biB0byAxMDAgLSAyNTAgbWF5IHNhdmUgbWVtb3J5XG4gICAgICpcbiAgICAgKiBVbHRpbWF0ZWx5IHRoZSBpbXBhY3Qgd2lsbCBiZSBtaW5pbWFsIHVubGVzcyB5b3VyIGFwcCBoYXMgdmVyeSBzcGVjaWZpY1xuICAgICAqIHJlbmRlcmluZyBuZWVkcy5cbiAgICAgKi9cbiAgICBzZXRDYXBhY2l0eTogKG1heFNpemU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgZnJhZ21lbnRDYWNoZS5zZXRDYXBhY2l0eShtYXhTaXplKTtcbiAgICAgIGNvbXBpbGVDYWNoZS5zZXRDYXBhY2l0eShtYXhTaXplKTtcbiAgICB9LFxuICB9O1xuXG4gIHByaXZhdGUgX2NvbXBpbGVkOiBDb21waWxlZFRlbXBsYXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwge0BsaW5rIEhUTUxUZW1wbGF0ZUVsZW1lbnR9IHVzZWQgdG8gY3JlYXRlIHRoaXMgVGVtcGxhdGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIE1ha2Ugc3VyZSB0byBuZXZlciBvcGVyYXRlIGRpcmVjdGx5IG9uIHRoaXMgZWxlbWVudC4gQWx3YXlzIGNsb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBfdGVtcGxhdGVFbGVtZW50PzogSFRNTFRlbXBsYXRlRWxlbWVudDtcblxuICAvKiogVGhlIGN1cnJlbnQga25vd24gcm9vdCBlbGVtZW50IHRoYXQgdGhpcyBUZW1wbGF0ZSBpcyByZW5kZXJlZCBpbnRvICovXG4gIHByaXZhdGUgX21vdW50ZWRSb290PzogVGVtcGxhdGVSb290O1xuXG4gIC8qKiBUaGUgbW9zdCByZWNlbnQgc2V0IHZhbHVlIGZvciBlYWNoIG5vdGF0aW9uIHRoYXQgaGFzIHJlbmRlcmVkICovXG4gIHByaXZhdGUgX2xhdGVzdFJlbmRlcmVkVmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPiA9IG5ldyBNYXAoKTtcblxuICAvKiogVGhlIGFjdGl2ZSBIVE1MRWxlbWVudCB3aGljaCB0aGUgdGVtcGxhdGUgaXMgdXBkYXRpbmcgb24gcmVuZGVycyAqL1xuICBwcml2YXRlIF9mcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudDtcblxuICAvKiogVmFsdWUgTm90YXRpb25zIC0+IFNldDxSZW5kZXIgUGxhbnM+ICovXG4gIHByaXZhdGUgX3BsYW5zQnlOb3RhdGlvbjogTWFwPHN0cmluZywgU2V0PEFueVJlbmRlclBsYW4+PiA9IG5ldyBNYXAoKTtcblxuICAvKiogVmFsdWUgTm90YXRpb25zIC0+IEFjY2Vzc29yIGZ1bmN0aW9ucyAqL1xuICBwcml2YXRlIF9ub3RhdGlvbkFjY2Vzc29yczogTWFwPHN0cmluZywgTm90YXRpb25BY2Nlc3Nvcj4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IodGVtcGxhdGU6IEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICBpZiAodGVtcGxhdGUgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZUVsZW1lbnQgPSB0ZW1wbGF0ZTtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IGNvbXBpbGVDYWNoZS5nZXQodGVtcGxhdGUpO1xuICAgICAgY29uc3QgY29tcGlsZWQgPSBjYWNoZWQgPz8gY29tcGlsZVRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgICAgIHRoaXMuX2NvbXBpbGVkID0gY29tcGlsZWQ7XG5cbiAgICAgIC8vIEFsd2F5cyBzZXQgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIHRvIG1vdmUgaXQgdG8gdGhlIGZyb250IG9mIHRoZSBjYWNoZVxuICAgICAgY29tcGlsZUNhY2hlLnNldCh0ZW1wbGF0ZSwgY29tcGlsZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb21waWxlZCA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8vIFByZXBhcmUgYSBmcmFnbWVudCBmcm9tIHRoZSBjb21waWxlZCBIVE1MIChjYWNoZWQpXG4gICAgY29uc3QgZnJhZ21lbnQgPSBodG1sVG9GcmFnbWVudCh0aGlzLl9jb21waWxlZC5odG1sKTtcbiAgICBjb25zdCBoeWRyYXRlZCA9IHByZXBhcmVDb21waWxlZFRlbXBsYXRlKHRoaXMuX2NvbXBpbGVkLCBmcmFnbWVudCk7XG5cbiAgICB0aGlzLl9wbGFuc0J5Tm90YXRpb24gPSBoeWRyYXRlZC5wbGFuc0J5Tm90YXRpb247XG4gICAgdGhpcy5fbm90YXRpb25BY2Nlc3NvcnMgPSBoeWRyYXRlZC5ub3RhdGlvbkFjY2Vzc29ycztcbiAgICB0aGlzLl9mcmFnbWVudCA9IGh5ZHJhdGVkLmZyYWdtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZ1bGwgY29weSBvZiB0aGlzIHRlbXBsYXRlIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRvIGFub3RoZXIgcm9vdFxuICAgKi9cbiAgY2xvbmUgPSAoKTogVGVtcGxhdGUgPT4ge1xuICAgIHJldHVybiBuZXcgVGVtcGxhdGUodGhpcy5lbGVtZW50KCkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBBbiB7QGxpbmsgSFRNTFRlbXBsYXRlRWxlbWVudH0gcmVwcmVzZW50aW5nIHRoaXMgdGVtcGxhdGVcbiAgICovXG4gIGVsZW1lbnQgPSAoKTogSFRNTFRlbXBsYXRlRWxlbWVudCA9PiB7XG4gICAgaWYgKHRoaXMuX3RlbXBsYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlRWxlbWVudDtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSB0aGlzLl9jb21waWxlZC5odG1sO1xuICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgfTtcblxuICBwcml2YXRlIF9jb2xsZWN0VXBkYXRlZFZhbHVlcyA9IChcbiAgICBjb250ZXh0OiBUZW1wbGF0ZUNvbnRleHQsXG4gICk6IE1hcDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICBjb25zdCB1cGRhdGVkVmFsdWVzID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG5cbiAgICBmb3IgKGNvbnN0IFtyYXdOb3RhdGlvbiwgYWNjZXNzb3JdIG9mIHRoaXMuX25vdGF0aW9uQWNjZXNzb3JzKSB7XG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gdGhpcy5fbGF0ZXN0UmVuZGVyZWRWYWx1ZXMuZ2V0KHJhd05vdGF0aW9uKTtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYWNjZXNzb3IoY29udGV4dCk7XG5cbiAgICAgIGlmIChwcmV2aW91c1ZhbHVlICE9PSBuZXdWYWx1ZSAmJiAhT2JqZWN0LmlzKHByZXZpb3VzVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgICB1cGRhdGVkVmFsdWVzLnNldChyYXdOb3RhdGlvbiwgbmV3VmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkVmFsdWVzO1xuICB9O1xuXG4gIHByaXZhdGUgX3VwZGF0ZShuZXdWYWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgY29uc3Qgc2NoZWR1bGVkUGxhbnM6IFNldDxBbnlSZW5kZXJQbGFuPiA9IG5ldyBTZXQoKTtcblxuICAgIGNvbnN0IGF0dHJpYnV0ZUpvYnM6IEF0dHJpYnV0ZVVwZGF0ZUpvYltdID0gW107XG4gICAgY29uc3QgY29udGVudFN3YXBKb2JzOiBDb250ZW50U3dhcEpvYltdID0gW107XG4gICAgY29uc3QgdGFnQ2hhbmdlSm9iczogVGFnQ2hhbmdlSm9iW10gPSBbXTtcbiAgICBjb25zdCBsaXN0UmVuZGVySm9iczogTGlzdFJlbmRlckpvYltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtub3RhdGlvbl0gb2YgbmV3VmFsdWVzKSB7XG4gICAgICBjb25zdCBhZmZlY3RlZFBsYW5zID0gdGhpcy5fcGxhbnNCeU5vdGF0aW9uLmdldChub3RhdGlvbik7XG5cbiAgICAgIGlmIChhZmZlY3RlZFBsYW5zKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGxhbiBvZiBhZmZlY3RlZFBsYW5zKSB7XG4gICAgICAgICAgaWYgKHNjaGVkdWxlZFBsYW5zLmhhcyhwbGFuKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NoZWR1bGVkUGxhbnMuYWRkKHBsYW4pO1xuXG4gICAgICAgICAgc3dpdGNoIChwbGFuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhdHRyXCI6IHtcbiAgICAgICAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZUF0dHJpYnV0ZUpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUpvYnMucHVzaChqb2IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImVhY2hcIjoge1xuICAgICAgICAgICAgICBjb25zdCBqb2IgPSBwcmVwYXJlTGlzdFJlbmRlckpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgICAgICAgIGxpc3RSZW5kZXJKb2JzLnB1c2goam9iKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJzd2FwXCI6IHtcbiAgICAgICAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZUNvbnRlbnRTd2FwSm9iKHBsYW4sIG5ld1ZhbHVlcyk7XG4gICAgICAgICAgICAgIGlmIChqb2IgIT09IFNLSVBQRURfSk9CKSB7XG4gICAgICAgICAgICAgICAgY29udGVudFN3YXBKb2JzLnB1c2goam9iKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJ0YWdcIjoge1xuICAgICAgICAgICAgICBjb25zdCBqb2IgPSBwcmVwYXJlVGFnQ2hhbmdlSm9iKHBsYW4sIG5ld1ZhbHVlcyk7XG4gICAgICAgICAgICAgIGlmIChqb2IgIT09IFNLSVBQRURfSk9CKSB7XG4gICAgICAgICAgICAgICAgdGFnQ2hhbmdlSm9icy5wdXNoKGpvYik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgaW1wb3NzaWJsZSBnaXZlbiBhbiBleGhhdXN0aXZlIHN3aXRjaCBjYXNlXG4gICAgICAgICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcnVuQXR0cmlidXRlSm9icyhhdHRyaWJ1dGVKb2JzKTtcbiAgICBydW5MaXN0UmVuZGVySm9icyhsaXN0UmVuZGVySm9icyk7XG4gICAgcnVuQ29udGVudFN3YXBKb2JzKGNvbnRlbnRTd2FwSm9icyk7XG4gICAgcnVuVGFnQ2hhbmdlSm9icyh0YWdDaGFuZ2VKb2JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhpcyB0ZW1wbGF0ZSBpbnRvIGEgdGFyZ2V0IGhvc3QgZWxlbWVudC5cbiAgICovXG4gIHJlbmRlciA9IChyb290OiBUZW1wbGF0ZVJvb3QsIGNvbnRleHQ6IFRlbXBsYXRlQ29udGV4dCk6IHZvaWQgPT4ge1xuICAgIGlmIChyb290ICE9PSB0aGlzLl9tb3VudGVkUm9vdCkge1xuICAgICAgdGhpcy5fbW91bnRlZFJvb3QgPSByb290O1xuICAgICAgd2hpbGUgKHJvb3QuZmlyc3RDaGlsZCkge1xuICAgICAgICByb290LnJlbW92ZUNoaWxkKHJvb3QuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHJvb3QuYXBwZW5kKHRoaXMuX2ZyYWdtZW50KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZFZhbHVlcyA9IHRoaXMuX2NvbGxlY3RVcGRhdGVkVmFsdWVzKGNvbnRleHQpO1xuXG4gICAgaWYgKHJlc29sdmVkVmFsdWVzLnNpemUgIT09IDApIHtcbiAgICAgIHRoaXMuX3VwZGF0ZShyZXNvbHZlZFZhbHVlcyk7XG5cbiAgICAgIC8vIFNhdmUgdGhlIHZhbHVlcyB0aGF0IHdlcmUgdXNlZCBmb3IgdGhpcyByZW5kZXIgaWYgdGhlIHJlbmRlciBzdWNjZWVkZWRcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiByZXNvbHZlZFZhbHVlcykge1xuICAgICAgICB0aGlzLl9sYXRlc3RSZW5kZXJlZFZhbHVlcy5zZXQoa2V5LCB2YWwpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBlbGVtZW50TWF0Y2hlcyB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHR5cGUgeyBDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRcIjtcblxuZXhwb3J0IHR5cGUgRXZlbnROYW1lID0ga2V5b2YgR2xvYmFsRXZlbnRIYW5kbGVyc0V2ZW50TWFwO1xuZXhwb3J0IHR5cGUgRXZlbnRIYW5kbGVyPEsgZXh0ZW5kcyBFdmVudE5hbWUgPSBFdmVudE5hbWU+ID0gKFxuICBldmVudDogR2xvYmFsRXZlbnRIYW5kbGVyc0V2ZW50TWFwW0tdLFxuKSA9PiB2b2lkO1xuXG50eXBlIEV2ZW50SGFuZGxlck1hcCA9IE1hcDxzdHJpbmcsIEV2ZW50SGFuZGxlcj47XG5cbi8qKlxuICogTWFuYWdlZCBldmVudCBkZWxlZ2F0aW9uIHRvIGNvYWxlc2NlIGV2ZW50IGxpc3RlbmVycyBmb3IgYW4gZW50aXJlIHRyZWUgaW50b1xuICogc2luZ2xlIHJvb3QtbGV2ZWwgbGlzdGVuZXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBMaXN0ZW4gZm9yIGV2ZW50cyBmcm9tIGFueSBjaGlsZCBlbGVtZW50IG9mIHRoZSBkZWxlZ2F0ZWQgcm9vdFxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRlbGVnYXRvciA9IG5ldyBFdmVudERlbGVnYXRvcigkcm9vdCk7XG4gKiBkZWxlZ2F0b3IuYWRkRGVsZWdhdGVkTGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGljayk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogTGlzdGVuIGZvciBldmVudHMgZnJvbSBjaGlsZCBlbGVtZW50cyBtYXRjaGluZyBgLmFjdGlvbmBcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBkZWxlZ2F0b3IgPSBuZXcgRXZlbnREZWxlZ2F0b3IoJHJvb3QpO1xuICogZGVsZWdhdG9yLmFkZERlbGVnYXRlZExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2xpY2ssIFwiLmFjdGlvblwiKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRXZlbnREZWxlZ2F0b3Ige1xuICBzdGF0aWMgbmV4dExpc3RlbmVySWQgPSAwO1xuXG4gIHN0YXRpYyBwcm9jZXNzVGFyZ2V0RGVzY3JpcHRvcihcbiAgICB0YXJnZXREZXNjcmlwdG9yOiBzdHJpbmcgfCB0eXBlb2YgQ29tcG9uZW50PGFueT4gfCBIVE1MRWxlbWVudCxcbiAgKTogc3RyaW5nIHtcbiAgICAvLyBDcmVhdGUgYSBxdWVyeSBmaWx0ZXIgZnJvbSB0aGUgdGFyZ2V0IGRlc2NyaXB0b3JcbiAgICBpZiAodGFyZ2V0RGVzY3JpcHRvciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgYW4gSUQsIHVzZSB0aGF0XG4gICAgICBpZiAodGFyZ2V0RGVzY3JpcHRvci5pZC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGAjJHt0YXJnZXREZXNjcmlwdG9yLmlkfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBnZW5lcmF0ZWRJZCA9IGBsaXN0ZW4tJHtFdmVudERlbGVnYXRvci5uZXh0TGlzdGVuZXJJZCsrfWA7XG4gICAgICAgIHRhcmdldERlc2NyaXB0b3Iuc2V0QXR0cmlidXRlKFwiZGF0YS1saXN0ZW5lci1pZFwiLCBnZW5lcmF0ZWRJZCk7XG4gICAgICAgIHJldHVybiBgW2RhdGEtbGlzdGVuZXItaWQ9XCIke2dlbmVyYXRlZElkfVwiXWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0RGVzY3JpcHRvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBpZiAodGFyZ2V0RGVzY3JpcHRvci50YWdOYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbQ29tcG9uZW50XSBBdXRvbWF0aWMgbGlzdGVuZXIgc2V0dXAgZmFpbHVyZTogQ29tcG9uZW50ICR7dGFyZ2V0RGVzY3JpcHRvci5uYW1lfSBoYXMgbm8gZGVmaW5lZCB0YWduYW1lYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSB0YXJnZXQgZGVzY3JpcHRvciBpcyBhIENvbXBvbmVudCBjbGFzcywgcHVsbCB0aGUgdGFnbmFtZVxuICAgICAgcmV0dXJuIHRhcmdldERlc2NyaXB0b3IudGFnTmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0RGVzY3JpcHRvcjtcbiAgfVxuXG4gIHByaXZhdGUgX3Jvb3Q6IEhUTUxFbGVtZW50IHwgU2hhZG93Um9vdCB8IERvY3VtZW50O1xuICBwcml2YXRlIF9yb290TGlzdGVuZXJzOiBFdmVudEhhbmRsZXJNYXAgPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX2V2ZW50czogTWFwPHN0cmluZywgTWFwPHN0cmluZywgU2V0PEV2ZW50SGFuZGxlcj4+PiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3Rvcihyb290OiBIVE1MRWxlbWVudCB8IFNoYWRvd1Jvb3QgfCBEb2N1bWVudCA9IGRvY3VtZW50KSB7XG4gICAgdGhpcy5fcm9vdCA9IHJvb3Q7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVyc0ZvckV2ZW50KGV2ZW50OiBzdHJpbmcpOiBNYXA8c3RyaW5nLCBTZXQ8RXZlbnRIYW5kbGVyPj4ge1xuICAgIGxldCBoYW5kbGVyTWFwID0gdGhpcy5fZXZlbnRzLmdldChldmVudCk7XG5cbiAgICBpZiAoaGFuZGxlck1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYW5kbGVyTWFwID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5fZXZlbnRzLnNldChldmVudCwgaGFuZGxlck1hcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZXJNYXA7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVyc0ZvckV2ZW50QW5kUXVlcnk8RSBleHRlbmRzIEV2ZW50TmFtZT4oXG4gICAgZXZlbnQ6IEUsXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgKTogU2V0PEV2ZW50SGFuZGxlcjxFPj4ge1xuICAgIGNvbnN0IGhhbmRsZXJNYXAgPSB0aGlzLl9oYW5kbGVyc0ZvckV2ZW50KGV2ZW50KTtcbiAgICBsZXQgaGFuZGxlclNldCA9IGhhbmRsZXJNYXAuZ2V0KHF1ZXJ5KTtcblxuICAgIGlmIChoYW5kbGVyU2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhbmRsZXJTZXQgPSBuZXcgU2V0KCk7XG4gICAgICBoYW5kbGVyTWFwLnNldChxdWVyeSwgaGFuZGxlclNldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZXJTZXQ7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVSb290TGlzdGVuZXIoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcm9vdExpc3RlbmVycy5oYXMoZXZlbnROYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxpc3RlbmVyID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlcnNGb3JFdmVudCA9IHRoaXMuX2hhbmRsZXJzRm9yRXZlbnQoZXZlbnROYW1lKTtcbiAgICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBldmVudDtcblxuICAgICAgaWYgKHRhcmdldCA9PT0gbnVsbCB8fCAhKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsID0gdGFyZ2V0O1xuXG4gICAgICBsZXQgc3RvcEltbWVkaWF0ZUNhbGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgb3JpZ2luYWxGbiA9IGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjtcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9ICgpID0+IHtcbiAgICAgICAgb3JpZ2luYWxGbi5jYWxsKGV2ZW50KTtcbiAgICAgICAgc3RvcEltbWVkaWF0ZUNhbGxlZCA9IHRydWU7XG4gICAgICB9O1xuXG4gICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PT0gdGhpcy5fcm9vdCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBpbnZhbGlkIGVsZW1lbnRzXG4gICAgICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbnZva2UgaGFuZGxlcnNcbiAgICAgICAgZm9yIChjb25zdCBbcXVlcnksIGhhbmRsZXJzXSBvZiBoYW5kbGVyc0ZvckV2ZW50KSB7XG4gICAgICAgICAgaWYgKHF1ZXJ5ID09PSBcIipcIiB8fCBlbGVtZW50TWF0Y2hlcyhub2RlLCBxdWVyeSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwobm9kZSwgZXZlbnQpO1xuXG4gICAgICAgICAgICAgIC8vIFJlc3BlY3QgLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpIGFuZCAucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICBpZiAoc3RvcEltbWVkaWF0ZUNhbGxlZCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzcGVjdCAuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgaWYgKGV2ZW50LmNhbmNlbEJ1YmJsZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgaWYgKG5vZGUgPT09IHRoaXMuX3Jvb3QgfHwgbm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLl9yb290TGlzdGVuZXJzLnNldChldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB0aGlzLl9yb290LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBhZGRMaXN0ZW5lcjxFIGV4dGVuZHMgRXZlbnROYW1lPihcbiAgICBldmVudE5hbWU6IEUsXG4gICAgaGFuZGxlcjogRXZlbnRIYW5kbGVyPEU+LFxuICAgIHF1ZXJ5RmlsdGVyOiBzdHJpbmcgPSBcIipcIixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5faGFuZGxlcnNGb3JFdmVudEFuZFF1ZXJ5KGV2ZW50TmFtZSwgcXVlcnlGaWx0ZXIpLmFkZChoYW5kbGVyKTtcbiAgICB0aGlzLl9jcmVhdGVSb290TGlzdGVuZXIoZXZlbnROYW1lKTtcbiAgfVxuXG4gIHJlbW92ZUxpc3RlbmVyKFxuICAgIGV2ZW50TmFtZTogRXZlbnROYW1lLFxuICAgIGhhbmRsZXI6IEV2ZW50SGFuZGxlcixcbiAgICBxdWVyeUZpbHRlcjogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVyU2V0ID0gdGhpcy5faGFuZGxlcnNGb3JFdmVudEFuZFF1ZXJ5KGV2ZW50TmFtZSwgcXVlcnlGaWx0ZXIpO1xuICAgIGhhbmRsZXJTZXQuZGVsZXRlKGhhbmRsZXIpO1xuXG4gICAgLy8gSWYgdGhhdCB3YXMgdGhlIGxhc3QgaGFuZGxlciBmb3IgdGhhdCBldmVudC9xdWVyeSBjb21ibywgZGVsZXRlIHRoZSBzZXRcbiAgICBpZiAoaGFuZGxlclNldC5zaXplID09PSAwKSB7XG4gICAgICBjb25zdCBldmVudEhhbmRsZXJTZXRzID0gdGhpcy5faGFuZGxlcnNGb3JFdmVudChldmVudE5hbWUpO1xuICAgICAgZXZlbnRIYW5kbGVyU2V0cy5kZWxldGUocXVlcnlGaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFudXAgPSAoKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBbZXZlbnQsIGhhbmRsZXJdIG9mIHRoaXMuX3Jvb3RMaXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuX3Jvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgfVxuXG4gICAgdGhpcy5fcm9vdExpc3RlbmVycy5jbGVhcigpO1xuICB9O1xufVxuIiwKICAgICIvKlxuICogQ29weXJpZ2h0IMKpIFJ1c3RpYyBBcmNhZGUsIExMQyAyMDI2XG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IGNzcyB9IGZyb20gXCIjaGVscGVyXCI7XG5pbXBvcnQgeyBTdGF0ZSB9IGZyb20gXCIjc3RhdGVcIjtcbmltcG9ydCB7IFRlbXBsYXRlLCB0eXBlIFRlbXBsYXRlQ29udGV4dCB9IGZyb20gXCIjdGVtcGxhdGVcIjtcbmltcG9ydCB7IGNyZWF0ZUF0dHJpYnV0ZU1hcCwgc2VyaWFsaXplQXR0cmlidXRlIH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQgeyBFdmVudERlbGVnYXRvciwgdHlwZSBFdmVudEhhbmRsZXIsIHR5cGUgRXZlbnROYW1lIH0gZnJvbSBcIi4vZGVsZWdhdG9yXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dHJpYnV0ZU1hcCxcbiAgQ29tcG9uZW50U3R5bGVzLFxuICBDb21wdXRlZFByb3BlcnRpZXMsXG4gIExpdmVBdHRyaWJ1dGVzLFxuICBTdGF0ZUluaXRpYWxpemVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBNQVhfU0VRVUVOVElBTF9SRU5ERVJTID0gMTAwO1xuY29uc3QgQkxBTktfVEVNUExBVEUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5cbnR5cGUgSW50ZXJuYWxSZW5kZXJTdGF0dXMgPSB7XG4gIHdpbGxSZW5kZXI6IGJvb2xlYW47XG4gIGlzUmVuZGVyaW5nOiBib29sZWFuO1xuICBzZXF1ZW50aWFsUmVuZGVyczogbnVtYmVyO1xuICBwb3N0UmVuZGVyQ2FsbGJhY2tzOiBTZXQ8Vm9pZEZ1bmN0aW9uPjtcbiAgbGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwOiBBdHRyaWJ1dGVNYXA7XG4gIHRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzOiBBdHRyaWJ1dGVNYXA7XG59O1xuXG4vKipcbiAqIFRoZSAqKkNvbXBvbmVudCoqIGNsYXNzIGV4dGVuZHMgdGhlIGJhc2UgSFRNTEVsZW1lbnQgY2xhc3MgdG8gcHJvdmlkZSBhblxuICogZXJnb25vbWljIHdheSB0byBkZXNpZ24gYW5kIGRldmVsb3AgV2ViIENvbXBvbmVudHMgd2l0aCByZWFjdGl2ZSBzdGF0ZSxcbiAqIG1hbmFnZWQgYXR0cmlidXRlcywgYW5kIGR5bmFtaWMgdGVtcGxhdGluZy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbXBvbmVudDxcbiAgU3RhdGVTaGFwZSBleHRlbmRzIG9iamVjdCA9IHt9LFxuPiBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgLy8g4pWt4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWuXG4gIC8vIOKUgiAgICAgICAgICAgICAgICAgU3RhdGljIEhlbHBlciBNZXRob2RzICAgICAgICAgICAgICAgICAg4pSCXG4gIC8vIOKVsOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVr1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIENvbXBvbmVudCB3aXRoIHRoZSBicm93c2VyLiBPcHRpb25hbGx5IHByb3ZpZGUgYW4gb3ZlcnJpZGluZ1xuICAgKiB0YWcgbmFtZS5cbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcihcbiAgICBjb21wb25lbnQ6IEN1c3RvbUVsZW1lbnRDb25zdHJ1Y3RvciB8IHR5cGVvZiBDb21wb25lbnQsXG4gICAgdGFnTmFtZT86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgdHlwZW9mIHdpbmRvdy5jdXN0b21FbGVtZW50cyA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQUxJRF9FTlYpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudFRhZ25hbWUgPVxuICAgICAgXCJ0YWdOYW1lXCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQudGFnTmFtZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNvbXBvbmVudC50YWdOYW1lXG4gICAgICAgIDogbnVsbDtcbiAgICBjb25zdCBjb21wdXRlZFRhZ25hbWUgPSB0YWdOYW1lID8/IGNvbXBvbmVudFRhZ25hbWU7XG5cbiAgICBpZiAoXG4gICAgICBjb21wdXRlZFRhZ25hbWUgPT09IG51bGwgfHxcbiAgICAgIGNvbXB1dGVkVGFnbmFtZS5sZW5ndGggPT09IDAgfHxcbiAgICAgICFjb21wdXRlZFRhZ25hbWUuaW5jbHVkZXMoXCItXCIpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBTElEX1RBR05BTUUpO1xuICAgIH1cblxuICAgIGlmICh3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KGNvbXB1dGVkVGFnbmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLkRVUEVfVEFHTkFNRSwgdGFnTmFtZSA/PyBcIlwiKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgYW55IGxpdmUgYXR0cmlidXRlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIG9ic2VydmVkQXR0cmlidXRlc1xuXG4gICAgd2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgICAgIGNvbXB1dGVkVGFnbmFtZSxcbiAgICAgIGNvbXBvbmVudCBhcyBDdXN0b21FbGVtZW50Q29uc3RydWN0b3IsXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgU3RhdGljIENvbXBvbmVudCBDb25maWd1cmF0aW9uIFByb3BlcnRpZXMgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICAvKipcbiAgICogVGhlIEhUTUwgdGFnIG5hbWUgdG8gdXNlIGZvciB0aGlzIENvbXBvbmVudFxuICAgKi9cbiAgc3RhdGljIHRhZ05hbWU6IHN0cmluZyA9IFwiXCI7XG5cbiAgLyoqXG4gICAqIEFuIEhUTUwgVGVtcGxhdGUgZWxlbWVudCBmb3IgdGhpcyBlbGVtZW50IHRvIHVzZS5cbiAgICovXG4gIHN0YXRpYyB0ZW1wbGF0ZTogSFRNTFRlbXBsYXRlRWxlbWVudCB8IFRlbXBsYXRlID0gQkxBTktfVEVNUExBVEU7XG5cbiAgLyoqXG4gICAqIEEge0BsaW5rIENTU1N0eWxlU2hlZXR9IGFycmF5IG9yIHN0cmluZyB0byBhZG9wdCBhcyB0aGUgY29tcG9uZW50J3Mgc2NvcGVkIHN0eWxlc1xuICAgKi9cbiAgc3RhdGljIHN0eWxlczogQ29tcG9uZW50U3R5bGVzID0gW107XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIGh0bWwgYXR0cmlidXRlIG5hbWVzIHRvIG9ic2VydmUgdG8gdHJpZ2dlciB1cGRhdGVzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiB5b3UgdXNlIHRoZSB7QGxpbmsgZGVmaW5lfSBmYWN0b3J5IGhlbHBlciwgdGhpcyB2YWx1ZSB3aWxsIGJlXG4gICAqIGF1dG9tYXRpY2FsbHkgbWVyZ2VkIHdpdGggYSBsaXN0IG9mIGFueSBkZWZpbmVkIHtAbGluayBsaXZlQXR0cmlidXRlc30uXG4gICAqL1xuICBzdGF0aWMgb2JzZXJ2ZWRBdHRyaWJ1dGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBmb3IgdGhpcyBDb21wb25lbnQncyBTaGFkb3dSb290LlxuICAgKlxuICAgKiAtIGBcIm9wZW5cImAgYWxsb3dzIEpTIGFjY2VzcyB0byB0aGUgY2hpbGRyZW4gb2YgdGhpcyBjb21wb25lbnRcbiAgICogLSBgXCJjbG9zZWRcImAgKGRlZmF1bHQpIGRpc2FsbG93cyBpbnRlcm5hbCBKUyBhY2Nlc3NcbiAgICovXG4gIHN0YXRpYyBzaGFkb3dSb290TW9kZTogXCJjbG9zZWRcIiB8IFwib3BlblwiID0gXCJjbG9zZWRcIjtcblxuICAvLyDila3ilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila5cbiAgLy8g4pSCICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlIFByb3BlcnRpZXMgICAgICAgICAgICAgICAgICDilIJcbiAgLy8g4pWw4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWvXG5cbiAgLyoqXG4gICAqIFByaW1hcnkgc2NyaXB0aW5nIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICpcbiAgICogVXNlIGBzY3JpcHQoKWAgdG8gZGVmaW5lIHByaW1hcnkgYmVoYXZpb3JzLCBsaXN0ZW5lcnMsIGFuZCBpbml0aWFsaXphdGlvbnMuXG4gICAqXG4gICAqIElmIG5lZWQgYmUsIHJldHVybiBhIGZ1bmN0aW9uIHRvIGF1dG9tYXRpY2FsbHkgY2FsbCB3aGVuIHRoZSBjb21wb25lbnQgaXNcbiAgICogdW5tb3VudGluZyBmb3IgY2xlYW51cCBzY3JpcHRzLiBBbHRlcm5hdGl2ZWx5LCB1c2Uge0BsaW5rIGZpbmFsaXplfSBmb3JcbiAgICogY2xlYW51cCB0YXNrcywgd2hpY2ggd2lsbCBhbHdheXMgcnVuIGxhc3QsIGV2ZW4gYWZ0ZXIgdGhlIHJldHVybmVkIGZ1bmN0aW9uXG4gICAqIGZyb20gc2NyaXB0KCkuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2NyaXB0PygpOiBWb2lkRnVuY3Rpb24gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGVhY2ggdGVtcGxhdGUgdXBkYXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgYmVmb3JlVXBkYXRlPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZWFjaCB0ZW1wbGF0ZSB1cGRhdGVcbiAgICovXG4gIHByb3RlY3RlZCBhZnRlclVwZGF0ZT8ocHJldmlvdXNBdHRyaWJ1dGVzOiBBdHRyaWJ1dGVNYXApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYXMgdGhlIGZpbmFsIGxpZmVjeWNsZSBtZXRob2QgYXQgdGhlIGVuZCBvZiB0aGUgdW5tb3VudGluZyBwcm9jZXNzLlxuICAgKlxuICAgKiBDb250ZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGFuZCB0aGUgY29tcG9uZW50IGlzIG5vIGxvbmdlclxuICAgKiBjb25zaWRlcmVkIG1vdW50ZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIHJ1bnMuXG4gICAqXG4gICAqIFVzZSB0aGlzIGZvciBmaW5hbCBjbGVhbnVwIHRhc2tzIGFuZCBmcmVlaW5nIHJlc291cmNlcy5cbiAgICovXG4gIHByb3RlY3RlZCBmaW5hbGl6ZT8oKTogdm9pZDtcblxuICAvKipcbiAgICogSWYgZGVmaW5lZCwgcmVjZWl2ZXMgZXJyb3JzIGNhdWdodCBkdXJpbmcgdGhlIGxpZmVjeWNsZSBtZXRob2RzIG9mIHRoaXNcbiAgICogY29tcG9uZW50IGFuZCBpdCdzIGNoaWxkcmVuLiBJZiBub3QgZGVmaW5lZCwgdGhpcyBjb21wb25lbnQgd2lsbCBpbnN0ZWFkXG4gICAqIHRocm93IGVycm9ycyBhcyB0aGV5IGFyZSBmb3VuZC5cbiAgICpcbiAgICogSWYgdGhlIGVycm9yIGNhbm5vdCBiZSBoYW5kbGVkLCBgb25FcnJvcigpYCBzaG91bGQgcmUtdGhyb3cgaXQgZm9yIGEgaGlnaGVyXG4gICAqIHVwIGNvbXBvbmVudCB0byBldmFsdWF0ZS5cbiAgICpcbiAgICogVG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIHdoaWxlIHJlbW92aW5nIGFuIGVycm9yaW5nIGNvbXBvbmVudCBmcm9tIHRoZVxuICAgKiBET00sIHVzZSBgdGhpcy5yZXBsYWNlV2l0aCgpYCBhbmQgYSBuZXdseSBjb25zdHJ1Y3RlZCBwbGFjZWhvbGRlciBlbGVtZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBSZWNvdmVyaW5nIGZyb20gZXJyb3JzIG9yIGRpc3BsYXlpbmcgYSBmYWxsYmFja1xuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG9uRXJyb3IoZXJyb3IpIHtcbiAgICogICAvLyBIYW5kbGUga25vd24gZXJyb3JzXG4gICAqICAgaWYgKGVycm9yLm1lc3NhZ2UgPSBcIkludmFsaWQgSW5wdXRcIikge1xuICAgKiAgICAgdGhpcy5zdGF0ZS5pbnB1dCA9IFwiXCI7XG4gICAqICAgICByZXR1cm47XG4gICAqICAgfVxuICAgKlxuICAgKiAgIC8vIERpc3BsYXkgYSBmYWxsYmFjayBiYW5uZXJcbiAgICogICBjb25zdCBiYW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgKiAgIGJhbm5lci50ZXh0Q29udGVudCA9IFwiQW4gdW5leHBlY3RlZCBlcnJvciBkb25lIGRpZFwiO1xuICAgKiAgIHRoaXMucmVwbGFjZVdpdGgoYmFubmVyKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHByb3RlY3RlZCBvbkVycm9yPyhlcnJvcjogdW5rbm93bik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGlzIENvbXBvbmVudCdzIHJlYWN0aXZlIGludGVybmFsIHN0YXRlLCBpZiBhbnkuXG4gICAqXG4gICAqIElmIGBpbml0aWFsU3RhdGVgIGlzIGRlZmluZWQgYXMgYSBmdW5jdGlvbiwgdGhlIGZ1bmN0aW9uIGlzIGV2YWx1YXRlZCBhdFxuICAgKiBtb3VudGluZyB0aW1lIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGluaXRpYWwgc3RhdGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdGlhbFN0YXRlPzogU3RhdGVJbml0aWFsaXplcjxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogQW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHJldHVybmluZyBhbiBvYmplY3Qgd2hpY2ggcG9wdWxhdGVzIHRoZSBgZGF0YWAgdmFsdWVzXG4gICAqIGluIHRoZSB0ZW1wbGF0aW5nIGVuZ2luZS4gU3VjaCB2YWx1ZXMgYXJlIGFjY2Vzc2VkIHVzaW5nIHRoZSBgKmAgbm90YXRpb24uXG4gICAqXG4gICAqIFdoZW4gYSBob3N0ZWQgdmFsdWUgaXMgYWNjZXNzZWQsIGl0J3MgdmFsdWUgaXMgY29lcmNlZCBiYXNlZCBvbiB0aGUgd2F5IGl0XG4gICAqIGlzIGJlaW5nIHVzZWQuIEZvciBhdHRyaWJ1dGVzLCB2YWx1ZXMgYXJlIHNlcmlhbGl6ZWQgdG8gYSBzdHJpbmcgb3IgbnVsbCxcbiAgICogd2hpY2ggd2lsbCBzZXQgdGhlIGF0dHJpYnV0ZSAoc3RyaW5nKSBvciByZW1vdmUgaXQgKG51bGwpLlxuICAgKlxuICAgKiBGb3IgY29udGVudCBzd2Fwcywgc3RyaW5ncywgbnVtYmVycyBhbmQgYm9vbGVhbnMgYXJlIHJlbmRlcmVkIGFzIHN0cmluZ3NcbiAgICogYW5kIHNldCBhcyB0ZXh0Q29udGVudC4gbnVsbCBhbmQgdW5kZWZpbmVkIHZhbHVlcyByZW5kZXIgbm90aGluZyAod2l0aCBhXG4gICAqIGNvbW1lbnQgcGxhY2Vob2xkZXIpLCBhbiBIVE1MRWxlbWVudCB3aWxsIGJlIHN3YXBwZWQgaW4gYXMgYSBjbG9uZWQgbm9kZS5cbiAgICpcbiAgICogRnVuY3Rpb25zIGFyZSBldmFsdWF0ZWQgYXQgcmVuZGVyL3VwZGF0ZSB0aW1lLCBhbmQgdGhlaXIgcmV0dXJuIHZhbHVlIGlzXG4gICAqIHVzZWQgaW5zdGVhZC4gRnVuY3Rpb25zIGFyZSBwYXNzZWQgdGhlIGN1cnJlbnQgdGFyZ2V0IG5vZGUgYWNjZXNzaW5nIHRoZVxuICAgKiBwcm9wZXJ0eSBhcyBpdHMgZmlyc3QgYW5kIG9ubHkgYXJndW1lbnQuXG4gICAqXG4gICAqIE90aGVyIHR5cGVzIGFyZSB1bnN1cHBvcnRlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBob3N0ID0ge1xuICAgKiAgIGF2YXRhclVybDogXCJodHRwOi8vLi4uXCIsXG4gICAqICAgcmVuZGVyVGltZTogKCkgPT4gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBgYGBodG1sXG4gICAqIDxpbWcgOnNyYz1cIiphdmF0YXJVcmxcIiAvPlxuICAgKiA8c3Bhbj5SZW5kZXJlZCBhdCAke1wiKnJlbmRlclRpbWVcIn08L3NwYW4+XG4gICAqIGBgYFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbXB1dGVkUHJvcGVydGllcz86IENvbXB1dGVkUHJvcGVydGllczxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogRGVjbGFyYXRpb24gb2YgYXR0cmlidXRlIGJlaGF2aW9ycyBkdXJpbmcgdXBkYXRlcy5cbiAgICpcbiAgICogRWFjaCBrZXkgaXMgdGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlLiBWYWx1ZXMgYXJlIGFuIG9iamVjdCB3aXRoIHR3b1xuICAgKiBvcHRpb25hbCBmdW5jdGlvbiBkZWZpbml0aW9uczpcbiAgICpcbiAgICogYG9uQ2hhbmdlKG5ld1ZhbHVlLCBvbGRWYWx1ZSk6IHZvaWRgLCBhIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHdoZW4gdGhlIHZhbHVlXG4gICAqIG9mIHRoaXMgYXR0cmlidXRlIGhhcyBjaGFuZ2VkLiBSdW5zIG9uY2UgcGVyIHVwZGF0ZSBjeWNsZSwgKmJlZm9yZSogdGhlXG4gICAqIHVwZGF0ZSBvY2N1cnMuXG4gICAqXG4gICAqIGByZWZsZWN0KCk6IHVua25vd25gLCBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSB2YWx1ZSB0byBzZXJpYWxpemUgYW5kIHNldFxuICAgKiBhcyB0aGlzIGF0dHJpYnV0ZSAqYWZ0ZXIqIGFuIHVwZGF0ZSBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbGl2ZUF0dHJpYnV0ZXMgPSB7XG4gICAqICAgZG9uZToge1xuICAgKiAgICAgb25DaGFuZ2UobmV3VmFsdWUpIHtcbiAgICogICAgICAgdGhpcy5zdGF0ZS5zZXQoXCJkb25lXCIsICEhbmV3VmFsdWUpO1xuICAgKiAgICAgfSxcbiAgICogICAgIHJlZmxlY3QoKSB7IHJldHVybiB0aGlzLnN0YXRlLmN1cnJlbnQuZG9uZSB9XG4gICAqICAgfVxuICAgKiB9O1xuICAgKiBgYGBcbiAgICpcbiAgICogQHJlbWFya3NcbiAgICpcbiAgICogSWYgdXNpbmcgdGhlIHtAbGluayBkZWZpbmV9IGhlbHBlciwgdGhlIGtleXMgb2YgdGhpcyBwcm9wZXJ0eSBhcmVcbiAgICogYXV0b21hdGljYWxseSBtZXJnZWQgd2l0aCBhbnkgZGVmaW5lZCB7QGxpbmsgb2JzZXJ2ZWRBdHRyaWJ1dGVzfS5cbiAgICpcbiAgICogSWYgeW91IGFyZSBkaXJlY3RseSBleHRlbmRpbmcgdGhlIGNsYXNzLCBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBtdXN0IGJlXG4gICAqIGV4cGxpY2l0bHkgZGVmaW5lZCB3aXRoIGFueSBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIG1vbml0b3JlZCwgcmVnYXJkbGVzc1xuICAgKiBvZiBpZiB0aGV5J3JlIGRlZmluZWQgaGVyZS5cbiAgICovXG4gIHByb3RlY3RlZCBsaXZlQXR0cmlidXRlcz86IExpdmVBdHRyaWJ1dGVzPFN0YXRlU2hhcGU+O1xuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgICAgICAgICBJbnRlcm5hbCBTdGF0ZSBNYW5hZ2VtZW50ICAgICAgICAgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICBwcml2YXRlIF9pc0NvbXBvbmVudE1vdW50ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdGVtcGxhdGU6IFRlbXBsYXRlO1xuICBwcml2YXRlIF9yb290OiBTaGFkb3dSb290O1xuICBwcml2YXRlIF9zdGF0ZT86IFN0YXRlPFN0YXRlU2hhcGU+O1xuICBwcml2YXRlIF9kZWxlZ2F0b3I/OiBFdmVudERlbGVnYXRvcjtcbiAgcHJpdmF0ZSBfb3duTGlzdGVuZXJzOiBTZXQ8e1xuICAgIGhhbmRsZXI6IEV2ZW50SGFuZGxlcjtcbiAgICBldmVudDogRXZlbnROYW1lO1xuICB9PiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBfbGl2ZUF0dHJpYnV0ZUNvbmZpZ3M6IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgTGl2ZUF0dHJpYnV0ZXM8U3RhdGVTaGFwZT5bc3RyaW5nXVxuICA+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9jbGVhbnVwRm4/OiBWb2lkRnVuY3Rpb247XG5cbiAgcHJpdmF0ZSBfcmVuZGVySW50ZXJuYWxzOiBJbnRlcm5hbFJlbmRlclN0YXR1cyA9IHtcbiAgICB3aWxsUmVuZGVyOiBmYWxzZSxcblxuICAgIC8qKiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSByZW5kZXIvdXBkYXRlIHByb2Nlc3MgaXMgYWN0aXZlbHkgcnVubmluZyAqL1xuICAgIGlzUmVuZGVyaW5nOiBmYWxzZSxcbiAgICBzZXF1ZW50aWFsUmVuZGVyczogMCxcbiAgICBwb3N0UmVuZGVyQ2FsbGJhY2tzOiBuZXcgU2V0KCksXG4gICAgbGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwOiBuZXcgTWFwKCksXG4gICAgdHJhY2tlZEF0dHJpYnV0ZUNoYW5nZXM6IG5ldyBNYXAoKSxcbiAgfTtcblxuICAvLyDila3ilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila5cbiAgLy8g4pSCICAgICAgICAgICAgIEludGVybmFscyBhbmQgUHJpdmF0ZSBNZXRob2RzICAgICAgICAgICAgICDilIJcbiAgLy8g4pWw4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWvXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnN0IHsgdGVtcGxhdGUsIHN0eWxlcywgc2hhZG93Um9vdE1vZGUgfSA9IHRoaXNcbiAgICAgIC5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQ29tcG9uZW50O1xuXG4gICAgLy8gTm9ybWFsaXplIHN0eWxlcyB0byBhbiBhcnJheSBvZiBDU1NTdHlsZVNoZWV0IG9iamVjdHNcbiAgICBjb25zdCBuZXdTdHlsZXMgPSBBcnJheS5pc0FycmF5KHN0eWxlcylcbiAgICAgID8gc3R5bGVzXG4gICAgICA6IHR5cGVvZiBzdHlsZXMgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBbc3R5bGVzXVxuICAgICAgICA6IFtjc3NgJHtzdHlsZXN9YF07XG5cbiAgICB0aGlzLl9yb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiBzaGFkb3dSb290TW9kZSB9KTtcbiAgICB0aGlzLl9yb290LmFkb3B0ZWRTdHlsZVNoZWV0cy5wdXNoKC4uLm5ld1N0eWxlcyk7XG4gICAgdGhpcy5fdGVtcGxhdGUgPVxuICAgICAgdGVtcGxhdGUgaW5zdGFuY2VvZiBUZW1wbGF0ZSA/IHRlbXBsYXRlIDogbmV3IFRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgfVxuXG4gIC8qKiBQcm9kdWNlIHRoZSBkYXRhIG9iamVjdCB0byBwYXNzIHRvIHRoZSB0ZW1wbGF0ZSdzIHJlbmRlciBmdW5jdGlvbiAqL1xuICBwcml2YXRlIF9nZXRSZW5kZXJDb250ZXh0KGF0dHI6IEF0dHJpYnV0ZU1hcCk6IFRlbXBsYXRlQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHI6IE9iamVjdC5mcm9tRW50cmllcyhhdHRyKSxcbiAgICAgIGRhdGE6XG4gICAgICAgIHR5cGVvZiB0aGlzLmNvbXB1dGVkUHJvcGVydGllcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0aGlzLmNvbXB1dGVkUHJvcGVydGllcygpXG4gICAgICAgICAgOiB0aGlzLmNvbXB1dGVkUHJvcGVydGllcyxcbiAgICAgIHN0YXRlOiB0aGlzLl9zdGF0ZSA/IHRoaXMuX3N0YXRlLmN1cnJlbnQgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2VzY2FsYXRlRXJyb3IoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSB0aGlzLnBhcmVudE5vZGU7XG5cbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgaWYgKFxuICAgICAgICBub2RlIGluc3RhbmNlb2YgQ29tcG9uZW50ICYmXG4gICAgICAgIFwib25FcnJvclwiIGluIG5vZGUgJiZcbiAgICAgICAgdHlwZW9mIG5vZGUub25FcnJvciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICApIHtcbiAgICAgICAgbm9kZS5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICBub2RlID0gbm9kZS5ob3N0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCB0byBlc2NhbGF0ZSB0bywgdGhyb3cgdGhlIGVycm9yXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIF9yZXBvcnRFcnJvcihlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vbkVycm9yKSB7XG4gICAgICB0aGlzLl9lc2NhbGF0ZUVycm9yKGVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9leGVjdXRlQXR0cmlidXRlQ2hhbmdlSGFuZGxlcnMgPSAoKSA9PiB7XG4gICAgY29uc3QgcHJldkF0dHJzID0gdGhpcy5fcmVuZGVySW50ZXJuYWxzLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZU1hcDtcblxuICAgIC8vIENvcHkgdGhlIGNoYW5nZXMgdG8gYSBuZXcgbWFwIGFuZCBjbGVhciB0aGUgdHJhY2tpbmcgbWFwXG4gICAgY29uc3QgdHJhY2tlZENoYW5nZXMgPSBuZXcgTWFwKFxuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzLFxuICAgICk7XG4gICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzLmNsZWFyKCk7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWxdIG9mIHRyYWNrZWRDaGFuZ2VzKSB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLl9saXZlQXR0cmlidXRlQ29uZmlncy5nZXQobmFtZSk7XG4gICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFwib25DaGFuZ2VcIiBpbiBjb25maWcpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHByZXZBdHRycy5nZXQobmFtZSkgPz8gbnVsbDtcblxuICAgICAgICBpZiAoY29uZmlnICYmIHByZXZpb3VzVmFsdWUgIT09IHZhbCkge1xuICAgICAgICAgIGNvbmZpZy5vbkNoYW5nZT8uY2FsbCh0aGlzLCB2YWwsIHByZXZpb3VzVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgX3JlZmxlY3RMaXZlQXR0cmlidXRlcyA9ICgpID0+IHtcbiAgICBjb25zdCB0b1NldDogW25hbWU6IHN0cmluZywgdmFsOiBzdHJpbmcgfCBudWxsXVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb25maWddIG9mIHRoaXMuX2xpdmVBdHRyaWJ1dGVDb25maWdzKSB7XG4gICAgICBpZiAoXCJyZWZsZWN0XCIgaW4gY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHNlcmlhbGl6ZUF0dHJpYnV0ZShjb25maWcucmVmbGVjdD8uY2FsbCh0aGlzKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcblxuICAgICAgICBpZiAodmFsICE9PSBjdXJyZW50KSB7XG4gICAgICAgICAgdG9TZXQucHVzaChbbmFtZSwgdmFsXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWxdIG9mIHRvU2V0KSB7XG4gICAgICB0aGlzLnJlZmxlY3RBdHRyaWJ1dGUobmFtZSwgdmFsKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIFRoZSBhY3R1YWwgdXBkYXRlIGJlaGF2aW9yICovXG4gIHByaXZhdGUgX3BlcmZvcm1VcGRhdGUgPSAoKTogdm9pZCA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEltbWVkaWF0ZWx5IGZsaXAgZmxhZ3MgdG8gZGVub3RlIGEgcmVuZGVyIGlzIGluIHByb2dyZXNzIGFuZCBhbGxvd1xuICAgICAgLy8gcXVldWVpbmcgYW5vdGhlciByZW5kZXIgcmVxdWVzdC5cbiAgICAgIHRoaXMuX3JlbmRlckludGVybmFscy5pc1JlbmRlcmluZyA9IHRydWU7XG4gICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlciA9IGZhbHNlO1xuXG4gICAgICAvLyBBdHRyaWJ1dGVzOiBSdW4gYW55IGByZWFkYCBob29rcyBmb3IgY2hhbmdlZCBhdHRyaWJ1dGVzXG4gICAgICB0aGlzLl9leGVjdXRlQXR0cmlidXRlQ2hhbmdlSGFuZGxlcnMoKTtcblxuICAgICAgLy8gQ2FjaGUgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgcHJldmlvdXMgcmVuZGVyXG4gICAgICBjb25zdCBwcmV2QXR0cnMgPSB0aGlzLl9yZW5kZXJJbnRlcm5hbHMubGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwO1xuXG4gICAgICB0aGlzLmJlZm9yZVVwZGF0ZT8uKCk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudCBzbmFwc2hvdCBvZiBhdHRyaWJ1dGVzXG4gICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gY3JlYXRlQXR0cmlidXRlTWFwKHRoaXMpO1xuICAgICAgdGhpcy5fdGVtcGxhdGUucmVuZGVyKHRoaXMucm9vdCwgdGhpcy5fZ2V0UmVuZGVyQ29udGV4dChuZXdBdHRyaWJ1dGVzKSk7XG4gICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMubGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwID0gbmV3QXR0cmlidXRlcztcbiAgICAgIHRoaXMuYWZ0ZXJVcGRhdGU/LihwcmV2QXR0cnMpO1xuXG4gICAgICAvLyBBdHRyaWJ1dGVzOiBSdW4gYW55IGB3cml0ZWAgaG9va3MgZm9yIHVwZGF0ZWQgdmFsdWVzXG4gICAgICB0aGlzLl9yZWZsZWN0TGl2ZUF0dHJpYnV0ZXMoKTtcblxuICAgICAgLy8gUnVuIGFueSByZXF1ZXN0ZWQgcmVuZGVyIGNhbGxiYWNrc1xuICAgICAgLy8gVGhlc2UgYXJlIGNvbnNpZGVyZWQgbGlmZWN5Y2xlIG1ldGhvZHMgYXMgd2VsbCwgYW5kIHdpbGwgcmVwb3J0IGVycm9yc1xuICAgICAgLy8gYXMgYW55IG90aGVyIGxpZmVjeWNsZSBtZXRob2Qgd291bGRcbiAgICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMucG9zdFJlbmRlckNhbGxiYWNrcy5zaXplKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IEFycmF5LmZyb20odGhpcy5fcmVuZGVySW50ZXJuYWxzLnBvc3RSZW5kZXJDYWxsYmFja3MpO1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMucG9zdFJlbmRlckNhbGxiYWNrcy5jbGVhcigpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZm4gb2YgY2FsbGJhY2tzKSB7XG4gICAgICAgICAgZm4oKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgYHdpbGxSZW5kZXJgIGZsYWcgd2FzIGZsaXBwZWQsIGltbWVkaWF0ZWx5IHBlcmZvcm0gYSByZW5kZXJcbiAgICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlcikge1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMuc2VxdWVudGlhbFJlbmRlcnMgKz0gMTtcblxuICAgICAgICBpZiAodGhpcy5fcmVuZGVySW50ZXJuYWxzLnNlcXVlbnRpYWxSZW5kZXJzID49IE1BWF9TRVFVRU5USUFMX1JFTkRFUlMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgICAgICAgRXJyb3JDb2RlLk1BWF9TRVFVRU5USUFMX1JFTkRFUlMsXG4gICAgICAgICAgICBgJHt0aGlzLl9yZW5kZXJJbnRlcm5hbHMuc2VxdWVudGlhbFJlbmRlcnN9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcGVyZm9ybVVwZGF0ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnNlcXVlbnRpYWxSZW5kZXJzID0gMDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLndpbGxSZW5kZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBTYWZlbHkgcmVxdWVzdCBmb3IgYW4gdXBkYXRlIHRvIHJ1biBvbiB0aGUgbmV4dCBmcmFtZSAqL1xuICBwcml2YXRlIF9zY2hlZHVsZVVwZGF0ZSA9ICgpID0+IHtcbiAgICAvLyBQcmV2ZW50IHNjaGVkdWxpbmcgbXVsdGlwbGUgcmVuZGVyc1xuICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JlbmRlckludGVybmFscy53aWxsUmVuZGVyID0gdHJ1ZTtcblxuICAgIC8vIElmIGN1cnJlbnRseSByZW5kZXJpbmcsIGRvbid0IHJlcXVlc3QgYSByZW5kZXIsIGl0IHdpbGwgYXV0by1jb250aW51ZVxuICAgIC8vIHVudGlsIHRoZXJlIGFyZSBubyBjaGFuZ2VzIHRvIHJlbmRlclxuICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMuaXNSZW5kZXJpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIHJlbmRlciBpcyByZXF1ZXN0ZWQgYW5kIHdlJ3JlIG5vdCByZW5kZXJpbmcsIHJlcXVlc3QgYSByZW5kZXIgZnJhbWVcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fcGVyZm9ybVVwZGF0ZSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBfYWRvcHRTdGF0ZShzdGF0ZTogU3RhdGVTaGFwZSB8IFN0YXRlPFN0YXRlU2hhcGU+KSB7XG4gICAgLy8gSWYgdGhpcyBpcyBleGFjdGx5IG91ciBvd24gc3RhdGUgb2JqZWN0LCBkbyBub3RoaW5nXG4gICAgaWYgKE9iamVjdC5pcyh0aGlzLl9zdGF0ZSwgc3RhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgc3RhdGUgZXhpc3RzLCByZW1vdmUgdGhlIGxpc3RlbmVyIGFuZCBzY2hlZHVsZSBhIHJlbmRlclxuICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgdGhpcy5fc3RhdGUucmVtb3ZlTGlzdGVuZXIodGhpcy5fc2NoZWR1bGVVcGRhdGUpO1xuICAgICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBBZG9wdCB0aGUgaW5jb21pbmcgc3RhdGUgb2JqIG9yIHdyYXAgYW5kIGFkb3B0IGl0XG4gICAgY29uc3QgaW5jb21pbmdTdGF0ZU9iaiA9IHN0YXRlIGluc3RhbmNlb2YgU3RhdGUgPyBzdGF0ZSA6IG5ldyBTdGF0ZShzdGF0ZSk7XG4gICAgdGhpcy5fc3RhdGUgPSBpbmNvbWluZ1N0YXRlT2JqO1xuXG4gICAgLy8gRW5zdXJlIHRoZXJlIGlzIG5vdCBhY2NpZGVudGFsbHkgdHdvIG9mIHRoZSBzYW1lIHJlbmRlciBsaXN0ZW5lcnNcbiAgICB0aGlzLl9zdGF0ZS5yZW1vdmVMaXN0ZW5lcih0aGlzLl9zY2hlZHVsZVVwZGF0ZSk7XG4gICAgdGhpcy5fc3RhdGUuYWRkTGlzdGVuZXIodGhpcy5fc2NoZWR1bGVVcGRhdGUpO1xuICB9XG5cbiAgLy8g4pWt4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWuXG4gIC8vIOKUgiAgICAgICAgICAgQ3VzdG9tIEVsZW1lbnQgQ2FsbGJhY2sgT3ZlcnJpZGVzICAgICAgICAgICAg4pSCXG4gIC8vIOKVsOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVr1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNjcmlwdH0gaW5zdGVhZFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0NvbXBvbmVudE1vdW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMuaXNSZW5kZXJpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlciA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBjcmVhdGVBdHRyaWJ1dGVNYXAodGhpcyk7XG4gICAgICAgIHRoaXMuX2xpdmVBdHRyaWJ1dGVDb25maWdzID0gbmV3IE1hcChcbiAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLmxpdmVBdHRyaWJ1dGVzID8/IHt9KSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3RhdGVmdWwgY29tcG9uZW50LCBzZXQgdXAgdGhhdCBzdGF0ZVxuICAgICAgICBpZiAodGhpcy5pbml0aWFsU3RhdGUpIHtcbiAgICAgICAgICBjb25zdCBpbml0ID1cbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmluaXRpYWxTdGF0ZSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICA/IHRoaXMuaW5pdGlhbFN0YXRlXG4gICAgICAgICAgICAgIDogdGhpcy5pbml0aWFsU3RhdGUoKTtcblxuICAgICAgICAgIHRoaXMuX2Fkb3B0U3RhdGUoaW5pdCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90ZW1wbGF0ZS5yZW5kZXIodGhpcy5yb290LCB0aGlzLl9nZXRSZW5kZXJDb250ZXh0KGF0dHJpYnV0ZXMpKTtcbiAgICAgICAgdGhpcy5fcmVmbGVjdExpdmVBdHRyaWJ1dGVzKCk7XG4gICAgICAgIHRoaXMuX3JlbmRlckludGVybmFscy5sYXN0UmVuZGVyZWRBdHRyaWJ1dGVNYXAgPSBhdHRyaWJ1dGVzO1xuICAgICAgICB0aGlzLl9pc0NvbXBvbmVudE1vdW50ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9jbGVhbnVwRm4gPSB0aGlzLnNjcmlwdD8uKCkgPz8gdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoZXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBmaW5hbGl6ZX1cbiAgICovXG4gIHByb3RlY3RlZCBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAvLyBJZiB0aGlzIHRhc2sgcnVucyBidXQgdGhlIGNvbXBvbmVudCBpcyBzdGlsbCBjb25uZWN0ZWQsIHRoZW4gZG8gbm90aGluZ1xuICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IHdhcyBqdXN0IG1vdmVkIGluIHRoZSBET00uXG4gICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCB8fCAhdGhpcy5faXNDb21wb25lbnRNb3VudGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gT25seSBydW4gdGhlIGRpc2Nvbm5lY3QgaWYgdGhlIGVsZW1lbnQgaXMgYWN0dWFsbHkgdW5tb3VudGVkIGFuZCBub3RcbiAgICAgIC8vIGp1c3QgbW92ZWQuIFVzaW5nIHRoaXMgaW4gcGxhY2Ugb2YgY29ubmVjdGVkTW92ZUNhbGxiYWNrKCkgZm9yIGNvbXBhdFxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fZGVsZWdhdG9yPy5jbGVhbnVwKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgYW55IGxpc3RlbmVycyBzZXQgdXAgb24gc2VsZlxuICAgICAgICBpZiAodGhpcy5fb3duTGlzdGVuZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9vd25MaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihsaXN0ZW5lci5ldmVudCwgbGlzdGVuZXIuaGFuZGxlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2xlYW51cEZuPy4oKTtcbiAgICAgICAgdGhpcy5faXNDb21wb25lbnRNb3VudGVkID0gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihlcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBSdW4gdGhlIGZpbmFsaXplIGNhbGwgYWZ0ZXIgZXZlcnl0aGluZywgZXZlbiBpZiB0aGUgY2xlYW51cCBmbiBmYWlsZWRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmZpbmFsaXplPy4oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGxpdmVBdHRyaWJ1dGVzfSBpbnN0ZWFkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBfOiBzdHJpbmcgfCBudWxsLFxuICAgIG5ld1ZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICApOiB2b2lkIHtcbiAgICAvLyBJZ25vcmUgYXR0cmlidXRlIGNoYW5nZXMgdGhhdCBvY2N1ciBkdXJpbmcgYW4gdXBkYXRlLCBhcyB0aGV5IGFyZVxuICAgIC8vIGNvbWluZyBmcm9tIGluc2lkZSB0aGUgaG91c2VcbiAgICBpZiAodGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzUmVuZGVyaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2tpcCBub24tY2hhbmdlcyB1c2luZyB0aGUgc3RvcmVkIGF0dHJpYnV0ZXMgYXMgcmVmZXJlbmNlIHRvIGNvbXBhcmVcbiAgICAvLyB0byB0aGUgcmVuZGVyIHN0YXRlIHJhdGhlciB0aGFuIHRoZSBkb21cbiAgICBpZiAoXG4gICAgICBuZXdWYWx1ZSA9PT0gdGhpcy5fcmVuZGVySW50ZXJuYWxzLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZU1hcD8uZ2V0KG5hbWUpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FjaGUgdGhlIHVwZGF0ZWQgYXR0cmlidXRlIHZhbHVlXG4gICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzLnNldChuYW1lLCBuZXdWYWx1ZSk7XG5cbiAgICAvLyBTY2hlZHVsZSBhIHJlbmRlclxuICAgIGlmICghdGhpcy5fcmVuZGVySW50ZXJuYWxzLndpbGxSZW5kZXIpIHtcbiAgICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pWt4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWuXG4gIC8vIOKUgiAgICAgICAgICAgICAgICAgICAgUHVibGljIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAg4pSCXG4gIC8vIOKVsOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVr1xuXG4gIC8qKlxuICAgKiBUaGUgU2hhZG93Um9vdCBub2RlIG9mIHRoaXMgZWxlbWVudFxuICAgKi9cbiAgZ2V0IHJvb3QoKTogU2hhZG93Um9vdCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3Q7XG4gIH1cblxuICAvKipcbiAgICogRGlyZWN0bHkgYWNjZXNzIGFuZCBtYW5pcHVsYXRlIHRoaXMgQ29tcG9uZW50J3MgcmVhY3RpdmUgc3RhdGUgd2l0aCBkZWVwXG4gICAqIHJlYWN0aXZpdHkgZW5hYmxlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbml0aWFsU3RhdGUgPSB7IHZhbHVlczogeyBjb3VudDogMSwgdGltZTogMCB9IH07XG4gICAqXG4gICAqIGluY3JlbWVudCgpIHtcbiAgICogICB0aGlzLnN0YXRlLnZhbHVlcy5jb3VudCA9IDI7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgaXMgYSBzaG9ydGhhbmQgZ2V0dGVyIGZvciBgdGhpcy5nZXRTdGF0ZSgpLmxpdmVgXG4gICAqL1xuICBnZXQgc3RhdGUoKTogU3RhdGVTaGFwZSB7XG4gICAgaWYgKCF0aGlzLl9zdGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuTUlTU0lOR19TVEFURSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlLmxpdmU7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgY3VycmVudCBzdGF0ZSB3aXRoIGEgbmV3IHZhbHVlIG9yIGFkb3B0IGEgd2hvbGUgZGlmZmVyZW50IFN0YXRlXG4gICAqIGluc3RhbmNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIFN0YXRlIHJlcGxhY2VtZW50XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQWx3YXlzIHRyaWdnZXJzIGEgcmVuZGVyXG4gICAqIHRoaXMuc3RhdGUgPSB7IHNvbWU6IFwibmV3U3RhdGVcIiB9XG4gICAqXG4gICAqIC8vIEFkb3B0IGEgbmV3IHN0YXRlIGluc3RhbmNlIGFsdG9nZXRoZXJcbiAgICogY29uc3Qgb3RoZXJTdGF0ZSA9IG5ldyBTdGF0ZSh7c29tZTogXCJuZXdTdGF0ZVwifSk7XG4gICAqIHRoaXMuc3RhdGUgPSBvdGhlclN0YXRlO1xuICAgKlxuICAgKiAvLyBDYXVzZXMgYSByZW5kZXJcbiAgICogb3RoZXJTdGF0ZS5zZXQoXCJzb21lXCIsIFwidmFsdWVcIik7XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0IHN0YXRlKG5ld1N0YXRlOiBTdGF0ZVNoYXBlIHwgU3RhdGU8U3RhdGVTaGFwZT4pIHtcbiAgICB0aGlzLl9hZG9wdFN0YXRlKG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2Nlc3MgdGhlIGZ1bGwge0BsaW5rIFN0YXRlfSBpbnN0YW5jZSBmb3IgdGhpcyBDb21wb25lbnQuXG4gICAqXG4gICAqIFVzaW5nIHRoaXMgbWV0aG9kIG9uIGEgY29tcG9uZW50IHdoaWNoIGlzIG5vdCB1c2luZyByZWFjdGl2ZSBzdGF0ZVxuICAgKiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciBiZWluZyB0aHJvd24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIFJldHJpZXZlIHN0YXRlZnVsIHZhbHVlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY2xhc3MgRXhhbXBsZSBleHRlbmRzIENvbXBvbmVudCB7XG4gICAqICAgaW5pdGlhbFN0YXRlID0geyBjb3VudDogMSB9O1xuICAgKlxuICAgKiAgIHNjcmlwdCgpIHtcbiAgICogICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXRTdGF0ZSgpO1xuICAgKiAgICAgY29uc29sZS5sb2coYFRoZSBjb3VudCBpcyAke3N0YXRlLmdldChcImNvdW50XCIpfWApO1xuICAgKiAgIH1cbiAgICpcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogU2V0IGEgc3RhdGVmdWwgdmFsdWVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjbGFzcyBFeGFtcGxlIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICogICBpbml0aWFsU3RhdGUgPSB7IGNvdW50OiAxIH07XG4gICAqXG4gICAqICAgaW5jcmVtZW50KCkge1xuICAgKiAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gICAqICAgICBjb25zdCBjdXJyZW50ID0gc3RhdGUuZ2V0KFwiY291bnRcIik7XG4gICAqICAgICBzdGF0ZS5zZXQoXCJjb3VudFwiLCBjdXJyZW50ICsgMSk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0U3RhdGUoKTogU3RhdGU8U3RhdGVTaGFwZT4ge1xuICAgIGlmICghdGhpcy5fc3RhdGUpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLk1JU1NJTkdfU1RBVEUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBzY2hlZHVsZSBhIHJlbmRlciB0byBvY2N1clxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBDYWxsaW5nIHtAbGluayByZXF1ZXN0UmVuZGVyfSBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSBldmVudCBsb29wIHdvbid0XG4gICAqIHNjaGVkdWxlIG11bHRpcGxlIHJlbmRlcnMuIFJlbmRlcnMgYXJlIHNjaGVkdWxlZCB0byBvY2N1ciBvbiB0aGUgbmV4dFxuICAgKiBhbmltYXRpb24gZnJhbWUuXG4gICAqL1xuICByZXF1ZXN0UmVuZGVyKGNhbGxiYWNrPzogVm9pZEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMucG9zdFJlbmRlckNhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbWFuYWdlZCBldmVudCBsaXN0ZW5lciBvbiB0aGlzIENvbXBvbmVudCB3aXRoIGFuIG9wdGlvbmFsIHF1ZXJ5XG4gICAqIGZpbHRlciBzdHJpbmcgdG8gc3BlY2lmeSB3aGljaCBlbGVtZW50cyB0byBsaXN0ZW4gdG8gZXZlbnRzIGZyb20uXG4gICAqXG4gICAqIEV2ZW50IGhhbmRsZXJzIHNldCB1cCB3aXRoIGBsaXN0ZW4oKWAgYXJlIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cCB3aGVuXG4gICAqIHRoZSBjb21wb25lbnQgaXMgdW5tb3VudGVkLlxuICAgKlxuICAgKiBIYW5kbGVycyBhcmUgZGVsZWdhdGVkIHRvIGEgc2luZ2xlIGxpc3RlbmVyIHBlciBldmVudCBvbiB0aGUgcm9vdCBvZiB0aGVcbiAgICogQ29tcG9uZW50LCB3aGljaCBpcyB0aGUgY2xvc2VkIFNoYWRvd1Jvb3QgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogU2V0IHVwIGFuIGV2ZW50IGxpc3RlbmVyIGZvciBhIGNsaWNrIGV2ZW50IGZyb20gYSBidXR0b24gd2l0aCBJRCBcInN1Ym1pdFwiXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGhpcy5saXN0ZW4oXCIjc3VibWl0XCIsIFwiY2xpY2tcIiwgdGhpcy5oYW5kbGVDbGljayk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBTZXQgdXAgYW4gZXZlbnQgbGlzdGVuZXIgb24gdGhlIGhvc3QgZWxlbWVudCBpdHNlbGYgKGB0aGlzYCkuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gVXNlIFwiOmhvc3RcIiBvciBcIjpIT1NUXCIgYXMgdGhlIHF1ZXJ5IHNlbGVjdG9yIHRvIHRhcmdlIHRoZSBob3N0IGVsZW1lbnRcbiAgICogdGhpcy5saXN0ZW4oXCI6aG9zdFwiLCBcImFuaW1hdGlvbmVuZFwiLCB0aGlzLmhhbmRsZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIGxpc3RlbjxFIGV4dGVuZHMgRXZlbnROYW1lPihcbiAgICB0YXJnZXREZXNjcmlwdG9yOiBzdHJpbmcgfCB0eXBlb2YgQ29tcG9uZW50PGFueT4gfCBIVE1MRWxlbWVudCxcbiAgICBldmVudE5hbWU6IEUsXG4gICAgZXZlbnRIYW5kbGVyOiBFdmVudEhhbmRsZXI8RT4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHF1ZXJ5ID0gRXZlbnREZWxlZ2F0b3IucHJvY2Vzc1RhcmdldERlc2NyaXB0b3IodGFyZ2V0RGVzY3JpcHRvcik7XG5cbiAgICAvLyBJZiB0aGUgcXVlcnkgZmlsdGVyIGlzIGBcIjpob3N0XCJgLCBzZXQgdXAgYW4gb3duTGlzdGVuZXJcbiAgICBpZiAocXVlcnkgPT09IFwiOmhvc3RcIiB8fCBxdWVyeSA9PT0gXCI6SE9TVFwiKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIpO1xuICAgICAgdGhpcy5fb3duTGlzdGVuZXJzLmFkZCh7XG4gICAgICAgIGhhbmRsZXI6IGV2ZW50SGFuZGxlciBhcyBFdmVudEhhbmRsZXIsXG4gICAgICAgIGV2ZW50OiBldmVudE5hbWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHNldCB1cCBhIHJvb3QgbGlzdGVuZXJcbiAgICBpZiAoIXRoaXMuX2RlbGVnYXRvcikge1xuICAgICAgdGhpcy5fZGVsZWdhdG9yID0gbmV3IEV2ZW50RGVsZWdhdG9yKHRoaXMucm9vdCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGVsZWdhdG9yLmFkZExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyLCBxdWVyeSk7XG4gIH1cblxuICBzdG9wTGlzdGVuaW5nPEUgZXh0ZW5kcyBFdmVudE5hbWU+KFxuICAgIHRhcmdldERlc2NyaXB0b3I6IHN0cmluZyB8IHR5cGVvZiBDb21wb25lbnQ8YW55PiB8IEhUTUxFbGVtZW50LFxuICAgIGV2ZW50TmFtZTogRSxcbiAgICBldmVudEhhbmRsZXI6IEV2ZW50SGFuZGxlcjxFPixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcXVlcnkgPSBFdmVudERlbGVnYXRvci5wcm9jZXNzVGFyZ2V0RGVzY3JpcHRvcih0YXJnZXREZXNjcmlwdG9yKTtcblxuICAgIC8vIElmIHRoZSBxdWVyeSBmaWx0ZXIgaXMgYFwiOmhvc3RcImAsIHJlbW92ZSBmcm9tIHRoZSBvd25MaXN0ZW5lciBsaXN0XG4gICAgaWYgKHF1ZXJ5ID09PSBcIjpob3N0XCIgfHwgcXVlcnkgPT09IFwiOkhPU1RcIikge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyIGFzIEV2ZW50SGFuZGxlcik7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX293bkxpc3RlbmVycykge1xuICAgICAgICBpZiAobGlzdGVuZXIuZXZlbnQgPT09IGV2ZW50TmFtZSAmJiBsaXN0ZW5lci5oYW5kbGVyID09PSBldmVudEhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLl9vd25MaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBkZWxlZ2F0b3IgaXMgbm90IHNldCB1cCwgdGhlcmUncyBub3RoaW5nIHRvIGRvXG4gICAgaWYgKCF0aGlzLl9kZWxlZ2F0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWxlZ2F0b3IucmVtb3ZlTGlzdGVuZXIoXG4gICAgICBldmVudE5hbWUsXG4gICAgICBldmVudEhhbmRsZXIgYXMgRXZlbnRIYW5kbGVyLFxuICAgICAgcXVlcnksXG4gICAgKTtcbiAgfVxuXG4gIGRpc3BhdGNoRXZlbnQoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzcGF0Y2ggYSB7QGxpbmsgQ3VzdG9tRXZlbnR9IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBkZXRhaWxcbiAgICpcbiAgICogQGV4YW1wbGUgRGVmaW5pbmcgY3VzdG9tIGV2ZW50c1xuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlZmluZSB0eXBlcy4gVGhpcyBjYW4gaGFwcGVuIGluIHRoZSBzYW1lIGZpbGUgb3IgZWxzZXdoZXJlIGZvciBjb21tb25cbiAgICogLy8gYW5kIHNoYXJlZCBldmVudHMuXG4gICAqIGV4cG9ydCB0eXBlIE15RXZlbnQgPSBDdXN0b21FdmVudDxUPiAvLyBTZXQgYFRgIHRvIHRoZSBldmVudCBkZXRhaWwgdHlwZVxuICAgKlxuICAgKiBkZWNsYXJlIGdsb2JhbCB7XG4gICAqICBpbnRlcmZhY2UgR2xvYmFsRXZlbnRIYW5kbGVyc0V2ZW50TWFwIHtcbiAgICogICAgXCJteS1ldmVudC1uYW1lXCI6IE15RXZlbnRcbiAgICogIH1cbiAgICogfVxuICAgKlxuICAgKiAvLyBEaXNwYXRjaCBhIGN1c3RvbSBldmVudFxuICAgKiB0aGlzLmRpc3BhdGNoRXZlbnQoXCJteS1ldmVudC1uYW1lXCIsIFQpO1xuICAgKlxuICAgKiAvLyBMaXN0ZW4gdG8gYSBjdXN0b20gZXZlbnRcbiAgICogJGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJteS1ldmVudC1uYW1lXCIsIC4uLik7XG4gICAqIGBgYFxuICAgKi9cbiAgZGlzcGF0Y2hFdmVudDxUPihcbiAgICBldmVudDogc3RyaW5nLFxuICAgIGRldGFpbD86IFQsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGJ1YmJsZXM6IGJvb2xlYW47XG4gICAgICBjYW5jZWxhYmxlOiBib29sZWFuO1xuICAgICAgY29tcG9zZWQ6IGJvb2xlYW47XG4gICAgfSxcbiAgKTogYm9vbGVhbjtcbiAgZGlzcGF0Y2hFdmVudDxUPihcbiAgICBldmVudDogc3RyaW5nIHwgRXZlbnQsXG4gICAgZGV0YWlsPzogVCxcbiAgICBvcHRpb25zPzoge1xuICAgICAgYnViYmxlczogYm9vbGVhbjtcbiAgICAgIGNhbmNlbGFibGU6IGJvb2xlYW47XG4gICAgICBjb21wb3NlZDogYm9vbGVhbjtcbiAgICB9LFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgLi4uKG9wdGlvbnMgPz8ge30pLFxuICAgIH07XG5cbiAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxUPihldmVudCwge1xuICAgICAgICBkZXRhaWwsXG4gICAgICAgIC4uLm9wdHMsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcXVlcnlTZWxlY3RvcjxFIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KHF1ZXJ5OiBzdHJpbmcpOiBFIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3QucXVlcnlTZWxlY3RvcihxdWVyeSk7XG4gIH1cblxuICBxdWVyeVNlbGVjdG9yQWxsPEUgZXh0ZW5kcyBIVE1MRWxlbWVudD4ocXVlcnk6IHN0cmluZyk6IE5vZGVMaXN0T2Y8RT4ge1xuICAgIHJldHVybiB0aGlzLl9yb290LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpIGFzIE5vZGVMaXN0T2Y8RT47XG4gIH1cblxuICBnZXRFbGVtZW50QnlJZDxFIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KGlkOiBzdHJpbmcpOiBFIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuX3Jvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gdGhpcy5fcm9vdC5nZXRFbGVtZW50QnlJZChpZCkgYXMgRSB8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBIVE1MRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3Rvci5jYWxsKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgIyR7aWR9YCxcbiAgICAgICkgYXMgRSB8IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVxdWlyZUVsZW1lbnRCeUlkPEUgZXh0ZW5kcyBIVE1MRWxlbWVudD4oaWQ6IHN0cmluZyk6IEUge1xuICAgIGNvbnN0IGxvb2t1cCA9IHRoaXMuZ2V0RWxlbWVudEJ5SWQ8RT4oaWQpO1xuICAgIGlmICghbG9va3VwKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5NSVNTSU5HX0VMRU1FTlQpO1xuICAgIH1cbiAgICByZXR1cm4gbG9va3VwO1xuICB9XG5cbiAgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCBhIHZhbHVlIGFzIGFuIGF0dHJpYnV0ZSwgc2VyaWFsaXppbmcgdG8gYSBzdHJpbmcgb3IgYG51bGxgLlxuICAgKlxuICAgKiBudWxsIHZhbHVlcyBjYXVzZSB0aGUgYXR0cmlidXRlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGlzIGVsZW1lbnRcbiAgICovXG4gIHNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gc2VyaWFsaXplQXR0cmlidXRlKHZhbHVlKTtcbiAgICBpZiAoc2VyaWFsaXplZCA9PT0gbnVsbCkge1xuICAgICAgSFRNTEVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZS5jYWxsKHRoaXMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBIVE1MRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlLmNhbGwodGhpcywgbmFtZSwgc2VyaWFsaXplZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhdHRyaWJ1dGUgYXMgYSBudW1iZXIsIGZhbGxpbmcgYmFjayB0byBhIHNwZWNpZmllZCBkZWZhdWx0LlxuICAgKlxuICAgKlxuICAgKiBgbnVsbGAgYXR0cmlidXRlcyBhcmUgcmV0dXJuZWQgYXMgYG51bGxgLCB3aGlsZSBzdHJpbmcgYXR0cmlidXRlcyBhcmVcbiAgICogcGFyc2VkIHVzaW5nIHRoZSBgTnVtYmVyKClgIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBWYWx1ZXMgd2hpY2ggZXZhbHVhdGUgdG8gTmFOIGFyZSByZXR1cm5lZCBhcyBgbnVsbGAuXG4gICAqL1xuICBnZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IG51bWJlcik6IG51bWJlcjtcblxuICAvKipcbiAgICogR2V0IGFuIGF0dHJpYnV0ZSBhcyBhIHN0cmluZywgZmFsbGluZyBiYWNrIHRvIGEgc3BlY2lmaWVkIGRlZmF1bHRcbiAgICovXG4gIGdldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nKTogc3RyaW5nO1xuICBnZXRBdHRyaWJ1dGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZyB8IG51bWJlcixcbiAgKTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsdWUgPSBIVE1MRWxlbWVudC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlLmNhbGwodGhpcywgbmFtZSk7XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG5cbiAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cblxuICAgIC8vIEludmFsaWQgZnVuY3Rpb24gaW52b2NhdGlvblxuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgb24gdGhpcyBlbGVtZW50IGlmIHRoZSBwcm92aWRlZCB2YWx1ZVxuICAgKiBkaWZmZXJzIGZyb20gdGhlIGF0dHJpYnV0ZSB3aGVuIHNlcmlhbGl6ZWRcbiAgICovXG4gIHJlZmxlY3RBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICBjb25zdCByZWZsZWN0ZWQgPSBzZXJpYWxpemVBdHRyaWJ1dGUodmFsdWUpO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IHJlZmxlY3RlZCkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgcmVmbGVjdGVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRoaXMgZWxlbWVudCB0byBhIHN0cmluZ1xuICAgKi9cbiAgdG9TdHJpbmcoZnVsbDogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIENvbXBvbmVudCkubmFtZTtcbiAgICBjb25zdCBhdHRyU3RyaW5nID0gdGhpcy5nZXRBdHRyaWJ1dGVOYW1lcygpXG4gICAgICAubWFwKChhdHRyTmFtZSkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgIHJldHVybiB2YWwgPyBgJHthdHRyTmFtZX09XCIke3ZhbH1cImAgOiBcIlwiO1xuICAgICAgfSlcbiAgICAgIC5qb2luKFwiIFwiKTtcbiAgICBjb25zdCBhdHRycyA9IGF0dHJTdHJpbmcubGVuZ3RoID4gMCA/IGAgJHthdHRyU3RyaW5nfWAgOiBcIlwiO1xuXG4gICAgaWYgKGZ1bGwpIHtcbiAgICAgIHJldHVybiBgQ29tcG9uZW50PCR7bmFtZX0ke2F0dHJzfT5cXG4ke3RoaXMucm9vdC5pbm5lckhUTUx9XFxuPC8ke25hbWV9PmA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBDb21wb25lbnQ8JHtuYW1lfSR7YXR0cnN9PmA7XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUge1xuICBBdHRyaWJ1dGVNYXAsXG4gIENvbXBvbmVudFN0eWxlcyxcbiAgQ29tcHV0ZWRQcm9wZXJ0aWVzLFxuICBMaXZlQXR0cmlidXRlcyxcbiAgU3RhdGVJbml0aWFsaXplcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgQkxBTktfVEVNUExBVEUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50U2hvcnRoYW5kPFN0YXRlU2hhcGUgZXh0ZW5kcyBvYmplY3QgPSB7fT4ge1xuICAvKipcbiAgICogQW4gSFRNTCBUZW1wbGF0ZSBlbGVtZW50IGZvciB0aGlzIGVsZW1lbnQgdG8gdXNlLlxuICAgKi9cbiAgdGVtcGxhdGU/OiBIVE1MVGVtcGxhdGVFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBBIHtAbGluayBDU1NTdHlsZVNoZWV0fSBhcnJheSB0byBhZG9wdCB0byB0aGUgZWxlbWVudCdzIHNoYWRvdyBET01cbiAgICovXG4gIHN0eWxlcz86IENvbXBvbmVudFN0eWxlcztcblxuICAvKipcbiAgICogVGhlIG1vZGUgZm9yIHRoaXMgQ29tcG9uZW50J3MgU2hhZG93Um9vdC5cbiAgICpcbiAgICogLSBgXCJvcGVuXCJgIGFsbG93cyBKUyBhY2Nlc3MgdG8gdGhlIGNoaWxkcmVuIG9mIHRoaXMgY29tcG9uZW50XG4gICAqIC0gYFwiY2xvc2VkXCJgIChkZWZhdWx0KSBkaXNhbGxvd3MgaW50ZXJuYWwgSlMgYWNjZXNzXG4gICAqL1xuICBzaGFkb3dSb290TW9kZT86IFwiY2xvc2VkXCIgfCBcIm9wZW5cIjtcblxuICAvKipcbiAgICogVGhlIGluaXRpYWwgc3RhdGUgZm9yIHRoaXMgQ29tcG9uZW50J3MgcmVhY3RpdmUgaW50ZXJuYWwgc3RhdGUsIGlmIGFueS5cbiAgICovXG4gIGluaXRpYWxTdGF0ZT86IFN0YXRlSW5pdGlhbGl6ZXI8U3RhdGVTaGFwZT47XG5cbiAgLyoqXG4gICAqIEFuIG9iamVjdCBvciBmdW5jdGlvbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdoaWNoIHBvcHVsYXRlcyB0aGUgYGRhdGFgIHZhbHVlc1xuICAgKiBpbiB0aGUgdGVtcGxhdGluZyBlbmdpbmUuIFN1Y2ggdmFsdWVzIGFyZSBhY2Nlc3NlZCB1c2luZyB0aGUgYCpgIG5vdGF0aW9uLlxuICAgKi9cbiAgY29tcHV0ZWRQcm9wZXJ0aWVzPzogQ29tcHV0ZWRQcm9wZXJ0aWVzPFN0YXRlU2hhcGU+O1xuXG4gIC8qKlxuICAgKiBEZWNsYXJhdGlvbiBvZiBhdHRyaWJ1dGUgYmVoYXZpb3JzIGR1cmluZyB1cGRhdGVzLlxuICAgKi9cbiAgbGl2ZUF0dHJpYnV0ZXM/OiBMaXZlQXR0cmlidXRlczxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gc2NyaXB0aW5nIGZvciB0aGlzIENvbXBvbmVudFxuICAgKi9cbiAgc2NyaXB0PzogKHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPikgPT4gVm9pZEZ1bmN0aW9uIHwgdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBlYWNoIHRlbXBsYXRlIHVwZGF0ZVxuICAgKi9cbiAgYmVmb3JlVXBkYXRlPzogKHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggdGVtcGxhdGUgdXBkYXRlXG4gICAqL1xuICBhZnRlclVwZGF0ZT86IChcbiAgICB0aGlzOiBDb21wb25lbnQ8U3RhdGVTaGFwZT4sXG4gICAgcHJldmlvdXNBdHRyaWJ1dGVzOiBBdHRyaWJ1dGVNYXAsXG4gICkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGFzIHRoZSBmaW5hbCBsaWZlY3ljbGUgbWV0aG9kIGF0IHRoZSBlbmQgb2YgdGhlIHVubW91bnRpbmcgcHJvY2Vzcy5cbiAgICpcbiAgICogQ29udGVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIERPTSBhbmQgdGhlIGNvbXBvbmVudCBpcyBubyBsb25nZXJcbiAgICogY29uc2lkZXJlZCBtb3VudGVkIHdoZW4gdGhpcyBmdW5jdGlvbiBydW5zLlxuICAgKlxuICAgKiBVc2UgdGhpcyBmb3IgZmluYWwgY2xlYW51cCB0YXNrcyBhbmQgZnJlZWluZyByZXNvdXJjZXMuXG4gICAqL1xuICBmaW5hbGl6ZT86ICh0aGlzOiBDb21wb25lbnQ8U3RhdGVTaGFwZT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIElmIGRlZmluZWQsIHJlY2VpdmVzIGVycm9ycyBjYXVnaHQgZHVyaW5nIHRoZSBsaWZlY3ljbGUgbWV0aG9kcyBvZiB0aGlzXG4gICAqIGNvbXBvbmVudCBhbmQgaXQncyBjaGlsZHJlbi4gSWYgbm90IGRlZmluZWQsIHRoaXMgY29tcG9uZW50IHdpbGwgaW5zdGVhZFxuICAgKiB0aHJvdyBlcnJvcnMgYXMgdGhleSBhcmUgZm91bmQuXG4gICAqXG4gICAqIElmIHRoZSBlcnJvciBjYW5ub3QgYmUgaGFuZGxlZCwgYG9uRXJyb3IoKWAgc2hvdWxkIHJlLXRocm93IGl0IGZvciBhIGhpZ2hlclxuICAgKiB1cCBjb21wb25lbnQgdG8gZXZhbHVhdGUuXG4gICAqXG4gICAqIFRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSB3aGlsZSByZW1vdmluZyBhbiBlcnJvcmluZyBjb21wb25lbnQgZnJvbSB0aGVcbiAgICogRE9NLCB1c2UgYHRoaXMucmVwbGFjZVdpdGgoKWAgYW5kIGEgbmV3bHkgY29uc3RydWN0ZWQgcGxhY2Vob2xkZXIgZWxlbWVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogUmVjb3ZlcmluZyBmcm9tIGVycm9ycyBvciBkaXNwbGF5aW5nIGEgZmFsbGJhY2tcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBvbkVycm9yKGVycm9yKSB7XG4gICAqICAgLy8gSGFuZGxlIGtub3duIGVycm9yc1xuICAgKiAgIGlmIChlcnJvci5tZXNzYWdlID0gXCJJbnZhbGlkIElucHV0XCIpIHtcbiAgICogICAgIHRoaXMuc3RhdGUuaW5wdXQgPSBcIlwiO1xuICAgKiAgICAgcmV0dXJuO1xuICAgKiAgIH1cbiAgICpcbiAgICogICAvLyBEaXNwbGF5IGEgZmFsbGJhY2sgYmFubmVyXG4gICAqICAgY29uc3QgYmFubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICogICBiYW5uZXIudGV4dENvbnRlbnQgPSBcIkFuIHVuZXhwZWN0ZWQgZXJyb3IgZG9uZSBkaWRcIjtcbiAgICogICB0aGlzLnJlcGxhY2VXaXRoKGJhbm5lcik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBvbkVycm9yPzogKHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPiwgZXJyb3I6IHVua25vd24pID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmU8U3RhdGVTaGFwZSBleHRlbmRzIG9iamVjdCA9IHt9PihcbiAgdGFnbmFtZTogc3RyaW5nLFxuICBkZWZpbml0aW9uOiBDb21wb25lbnRTaG9ydGhhbmQ8U3RhdGVTaGFwZT4sXG4pOiB0eXBlb2YgQ29tcG9uZW50PFN0YXRlU2hhcGU+IHtcbiAgY29uc3Qge1xuICAgIC8vIENvbmZpZ1xuICAgIHRlbXBsYXRlID0gQkxBTktfVEVNUExBVEUsXG4gICAgc3R5bGVzID0gW10sXG4gICAgc2hhZG93Um9vdE1vZGUgPSBcImNsb3NlZFwiLFxuICAgIGluaXRpYWxTdGF0ZSxcbiAgICBjb21wdXRlZFByb3BlcnRpZXMgPSB7fSxcbiAgICBsaXZlQXR0cmlidXRlcyA9IHt9LFxuXG4gICAgLy8gTGlmZWN5Y2xlXG4gICAgc2NyaXB0LFxuICAgIGJlZm9yZVVwZGF0ZSxcbiAgICBhZnRlclVwZGF0ZSxcbiAgICBmaW5hbGl6ZSxcbiAgICBvbkVycm9yLFxuICB9ID0gZGVmaW5pdGlvbjtcblxuICBjb25zdCBmdWxsT2JzZXJ2ZWRBdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShcbiAgICBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhsaXZlQXR0cmlidXRlcyldKSxcbiAgKTtcblxuICBjb25zdCBjbHMgPSBjbGFzcyBleHRlbmRzIENvbXBvbmVudDxTdGF0ZVNoYXBlPiB7XG4gICAgc3RhdGljIHRhZ05hbWUgPSB0YWduYW1lO1xuICAgIHN0YXRpYyB0ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIHN0YXRpYyBzdHlsZXMgPSBzdHlsZXM7XG4gICAgc3RhdGljIG9ic2VydmVkQXR0cmlidXRlcyA9IFsuLi5mdWxsT2JzZXJ2ZWRBdHRyaWJ1dGVzXTtcbiAgICBzdGF0aWMgc2hhZG93Um9vdE1vZGUgPSBzaGFkb3dSb290TW9kZTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoKTtcblxuICAgICAgdGhpcy5pbml0aWFsU3RhdGUgPVxuICAgICAgICB0eXBlb2YgaW5pdGlhbFN0YXRlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGluaXRpYWxTdGF0ZS5iaW5kKHRoaXMpXG4gICAgICAgICAgOiBpbml0aWFsU3RhdGU7XG4gICAgICB0aGlzLmNvbXB1dGVkUHJvcGVydGllcyA9XG4gICAgICAgIHR5cGVvZiBjb21wdXRlZFByb3BlcnRpZXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gY29tcHV0ZWRQcm9wZXJ0aWVzLmJpbmQodGhpcylcbiAgICAgICAgICA6IGNvbXB1dGVkUHJvcGVydGllcztcbiAgICAgIHRoaXMubGl2ZUF0dHJpYnV0ZXMgPSBsaXZlQXR0cmlidXRlcztcblxuICAgICAgZm9yIChjb25zdCBkZWYgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmxpdmVBdHRyaWJ1dGVzKSkge1xuICAgICAgICBpZiAoZGVmLm9uQ2hhbmdlKSB7XG4gICAgICAgICAgZGVmLm9uQ2hhbmdlID0gZGVmLm9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVmLnJlZmxlY3QpIHtcbiAgICAgICAgICBkZWYucmVmbGVjdCA9IGRlZi5yZWZsZWN0LmJpbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ/LmJpbmQodGhpcykgPz8gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5iZWZvcmVVcGRhdGUgPSBiZWZvcmVVcGRhdGU/LmJpbmQodGhpcykgPz8gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5hZnRlclVwZGF0ZSA9IGFmdGVyVXBkYXRlPy5iaW5kKHRoaXMpID8/IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZmluYWxpemUgPSBmaW5hbGl6ZT8uYmluZCh0aGlzKSA/PyB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm9uRXJyb3IgPSBvbkVycm9yPy5iaW5kKHRoaXMpID8/IHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgQ29tcG9uZW50LnJlZ2lzdGVyKGNscywgdGFnbmFtZSk7XG5cbiAgcmV0dXJuIGNscztcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUE0Q0EsU0FBUyxXQUFXLENBQUMsTUFBaUI7QUFBQSxFQUNwQyxNQUFNLGlCQUE0QztBQUFBLEtBQy9DLG9CQUFzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FNdEIsc0JBQXdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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
|
|
1913
|
+
//# debugId=0F958CC20A4D682464756E2164756E21
|
|
1914
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2Vycm9ycy50cyIsICJzcmMvaGVscGVyL2Nzcy50cyIsICJzcmMvdXRpbC9hdHRyaWJ1dGVzLnRzIiwgInNyYy91dGlsL2NoYW5nZS10YWcudHMiLCAic3JjL3V0aWwvZWxlbWVudC1tYXRjaC50cyIsICJzcmMvdXRpbC9scnUtY2FjaGUudHMiLCAic3JjL3V0aWwvZnJhZ21lbnRzLnRzIiwgInNyYy9oZWxwZXIvaHRtbC50cyIsICJzcmMvc3RhdGUvc3RhdGUudHMiLCAic3JjL3RlbXBsYXRlL3N5bnRheC50cyIsICJzcmMvdGVtcGxhdGUvYnVpbGQudHMiLCAic3JjL3RlbXBsYXRlL2pvYnMudHMiLCAic3JjL3RlbXBsYXRlL3RlbXBsYXRlLnRzIiwgInNyYy9jb21wb25lbnQvZGVsZWdhdG9yLnRzIiwgInNyYy9jb21wb25lbnQvY29tcG9uZW50LnRzIiwgInNyYy9jb21wb25lbnQvZmFjdG9yeS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbi8qKlxuICogUG9zc2libGUgZXJyb3IgdHlwZXMgZm9yIHtAbGluayBQYWxldHRlRXJyb3J9XG4gKlxuICogQ29kZXMgYXJlIGNhdGVnb3JpemVkIGludG8gZ3JvdXBzIGJ5IHRoZSAxMDAnczpcbiAqXG4gKiAtIDAgLSA5OTogSW52YXJpYW50c1xuICogLSAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyAvIEVudmlyb25tZW50IEVycm9yc1xuICogLSAyMDAgLSAyOTk6IFRlbXBsYXRpbmcgRXJyb3JzXG4gKiAtIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gRXJyb3JDb2RlIHtcbiAgLy8gMCAtIDk5OiBJbnZhcmlhbnRzXG4gIElOVkFSSUFOVCA9IDAsXG4gIElOVkFMSURfRU5WID0gMSxcblxuICAvLyAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyBFcnJvcnNcbiAgRFVQRV9UQUdOQU1FID0gMTAwLFxuICBJTlZBTElEX1RBR05BTUUgPSAxMDEsXG5cbiAgLy8gMjAwIC0gMjk5OiBUZW1wbGF0ZSBFcnJvcnNcbiAgVEVNUExBVEVfSU5WQUxJRCA9IDIwMCxcbiAgVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTiA9IDIwMSxcbiAgVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlQgPSAyMDIsXG4gIFRFTVBMQVRFX0lOVkFMSURfTElTVCA9IDIwMyxcbiAgVEVNUExBVEVfSU5WQUxJRF9OT0RFX1JFRiA9IDIwNCxcbiAgVEVNUExBVEVfTUlTU0lOR19MSVNUX1BBUkVOVCA9IDIwNSxcbiAgVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWSA9IDIwNixcbiAgVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZID0gMjA3LFxuXG4gIC8vIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAgTUlTU0lOR19FTEVNRU5UID0gMzAwLFxuICBNSVNTSU5HX1NUQVRFID0gMzAxLFxuICBJTlZBTElEX0NPTlRFTlQgPSAzMDIsXG4gIElOVkFMSURfU1RBVEVfS0VZID0gMzAzLFxuICBJTlZBTElEX1NUQVRFX1VQREFURSA9IDMwNCxcbiAgU1RBVEVfTE9DS0VEID0gMzA1LFxuICBNQVhfU0VRVUVOVElBTF9SRU5ERVJTID0gMzA2LFxufVxuXG5mdW5jdGlvbiBnZXREZXZFcnJvcihjb2RlOiBFcnJvckNvZGUpIHtcbiAgY29uc3QgREVWX0VSUk9SX0lORk86IFJlY29yZDxFcnJvckNvZGUsIHN0cmluZz4gPSB7XG4gICAgW0Vycm9yQ29kZS5JTlZBUklBTlRdOiBgXG5JTlZBUklBTlRcbkEgY29uZGl0aW9uIGhhcyBvY2N1cnJlZCB3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBzdWNoIGFzIGEgY29kZSBwYXRoIHRoYXRcbnNob3VsZG4ndCBiZSByZWFjaGFibGUgd2hlbiB1c2luZyBjb3JyZWN0IHR5cGVzLCBvciBhIGRpc2FsbG93ZWQgc3RhdGUuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX0VOVl06IGBcbklOVkFMSURfRU5WXG5GYWlsZWQgdG8gZmluZCBhIGN1c3RvbSBlbGVtZW50cyByZWdpc3RyeSBpbiB0aGlzIGVudmlyb25tZW50LiBJcyBhIHdpbmRvd1xuZ2xvYmFsIGF2YWlsYWJsZSB3aXRoIGEgY3VzdG9tRWxlbWVudHMgcHJvcGVydHk/XG5gLFxuXG4gICAgW0Vycm9yQ29kZS5EVVBFX1RBR05BTUVdOiBgXG5EVVBFX1RBR05BTUVcbkZhaWxlZCB0byByZWdpc3RlciBhIGN1c3RvbSBlbGVtZW50IHdpdGggdGhlIHRhZ25hbWUgJXMgYmVjYXVzZSBhbm90aGVyXG5jdXN0b20gZWxlbWVudCBpcyBhbHJlYWR5IGRlZmluZWQgd2l0aCB0aGF0IG5hbWUuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX1RBR05BTUVdOiBgXG5JTlZBTElEX1RBR05BTUVcbkZhaWxlZCB0byBkZXRlcm1pbmUgYSB2YWxpZCBIVE1MIFRhZyB0byB1c2Ugd2hlbiByZWdpc3RlcmluZyBhIGNvbXBvbmVudCBhcyBhXG5jdXN0b20gZWxlbWVudC4gU3BlY2lmeSBhIHN0YXRpYyByZWFkb25seSB0YWdOYW1lIHByb3BlcnR5IG9uIHlvdXIgY29tcG9uZW50XG5jbGFzcyBvciBwcm92aWRlIGEgdGFnTmFtZSBhcmd1bWVudCB0byBDb21wb25lbnQucmVnaXN0ZXIuXG5cbkFsdGVybmF0aXZlbHksIHlvdSBjYW4gZGlyZWN0bHkgcmVnaXN0ZXIgeW91ciBlbGVtZW50IGFzIHlvdSB3b3VsZCBhbnkgb3RoZXJcbkhUTUwgY3VzdG9tIGVsZW1lbnQ6IGN1c3RvbUVsZW1lbnRzLmRlZmluZShcIm15LXRhZ1wiLCBNeUNvbXBvbmVudENsYXNzKTtcbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1JU1NJTkdfRUxFTUVOVF06IGBcbk1JU1NJTkdfRUxFTUVOVFxuQW4gZWxlbWVudCB3YXMgZXhwZWN0ZWQgdG8gZXhpc3QgYnV0IHdhcyBub3QgZm91bmQgd2hlbiB0aGUgRE9NIHdhcyBxdWVyaWVkLlxuYCxcblxuICAgIFtFcnJvckNvZGUuTUlTU0lOR19TVEFURV06IGBcbk1JU1NJTkdfU1RBVEVcbkEgQ29tcG9uZW50J3MgcmVhY3RpdmUgc3RhdGUgd2FzIGFjY2Vzc2VkLCBidXQgbm8gaW5pdGlhbFN0YXRlIGlzIGRlZmluZWQgZm9yXG50aGUgQ29tcG9uZW50J3MgY2xhc3MuIEluaXRpYWwgc3RhdGUgbXVzdCBiZSBkZWZpbmVkIGFzIGFuIG9iamVjdCBvciBmdW5jdGlvbi5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfQ09OVEVOVF06IGBcbklOVkFMSURfQ09OVEVOVFxuVHJpZWQgdG8gc2V0IGEgdmFsdWUgYXMgY29udGVudCBpbiBhIHRlbXBsYXRlLCBidXQgdGhlIHZhbHVlIHdhcyBub3QgYSBzdXBwb3J0ZWRcbnR5cGUuIFZhbHVlcyBtdXN0IGJlIGEgc3RyaW5nLCBIVE1MRWxlbWVudC5cblxuSW5zdGVhZCwgZ290ICVzOiAlcy5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURdOiBgXG5URU1QTEFURV9JTlZBTElEXG5UaGUgdmFsdWUgJXMgY2Fubm90IGJlIGludGVycG9sYXRlZCB2aWEgdGhlIFRlbXBsYXRlIGh0bWwgc3RyaW5nIGhlbHBlci5cblZhbHVlcyBtYXkgb25seSBiZSBIVE1MVGVtcGxhdGVFbGVtZW50cyAodGVtcGxhdGUgY29udGVudCBpcyBhZG9wdGVkKSBvclxuc3RyaW5ncyAoc2hvcnRoYW5kIGZvciBhIDo6c3dhcCBkaXJlY3RpdmUgb24gYW4gZWxlbWVudClcbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT05dOiBgXG5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OXG5BIHRlbXBsYXRlIHZhbHVlIG5vdGF0aW9uIGZhaWxlZCB0byBwYXJzZS4gTm90YXRpb25zIG11c3QgYmVnaW4gd2l0aCBvbmUgb2ZcbkAsICQsICosIG9yICMsIGZvbGxvd2VkIGJ5IGEgZG90LXNlcGFyYXRlZCBwYXRoIG9mIGFjY2Vzc29yIG5hbWVzLiBPcHRpb25hbGx5LFxubm90YXRpb25zIG1heSBoYXZlIG1vZGlmaWVycyBhcm91bmQgdGhlbSwgc3VjaCBhcyB0aGUgTk9UKCkgbW9kaWZpZXIuXG5cblRoZSBub3RhdGlvbiB0aGF0IGZhaWxlZCB0byBwYXJzZSB3YXMgXCIlc1wiXG5gLFxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlRdOiBgXG5URU1QTEFURV9JTlZBTElEX0NPTVBPTkVOVFxuRmFpbGVkIHRvIGludGVycG9sYXRlIGEgQ29tcG9uZW50IGluIGFuIGh0bWwgdGVtcGxhdGUgc3RyaW5nIGR1ZSB0byB0aGVcbkNvbXBvbmVudCBoYXZpbmcgYW4gaW52YWxpZCB0YWdOYW1lIHByb3BlcnR5LlxuXG5Db21wb25lbnQgXCIlc1wiIGhhcyBhbiBpbnZhbGlkIHRhZ05hbWUgcHJvcGVydHkgXCIlc1wiXG4gICAgYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19MSVNUX1BBUkVOVF06IGBcblRFTVBMQVRFX01JU1NJTkdfTElTVF9QQVJFTlRcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIHByZXBhcmUgYW4gOjplYWNoIGRpcmVjdGl2ZSBiZWNhdXNlIG5vIHZhbGlkIHBhcmVudCBub2RlXG53YXMgZm91bmQgZm9yIHRoZSBsaXN0IHRvIHJlbmRlciBpbnRvLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9MSVNUXTogYFxuVEVNUExBVEVfSU5WQUxJRF9MSVNUXG5BIHRlbXBsYXRlIGZhaWxlZCB0byByZW5kZXIgYmVjYXVzZSBhbiA6OmVhY2ggZGlyZWN0aXZlIGZldGNoZWQgYSB2YWx1ZSB3aGljaFxud2FzIG5vdCBhbiBhcnJheSBvZiBhY3Rpb25hYmxlIGRhdGEuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PREVfUkVGXTogYFxuVEVNUExBVEVfSU5WQUxJRF9OT0RFX1JFRlxuQSB0ZW1wbGF0ZSBmYWlsZWQgdG8gcHJlcGFyZSBhIG5vZGUgZnJvbSBhIGNvbXBpbGVkIHNvdXJjZS4gVHlwaWNhbGx5LCB0aGlzXG5tZWFucyBzb21ldGhpbmcgaXMgYnJva2VuIHdpdGhpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUgcmF0aGVyIHRoYW4gYW4gZXJyb3Igd2l0aFxudGhlIHRlbXBsYXRlIGNvbnRlbnQgaXRzZWxmLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWV06IGBcblRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVlcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIGNvbXBpbGUgYmVjYXVzZSBhbiA6OmVhY2ggZGlyZWN0aXZlIHdhcyBmb3VuZCBvbiBhbiBlbGVtZW50XG53aXRob3V0IGEgY29ycmVzcG9uZGluZyA6OmtleSBkaXJlY3RpdmUuIDo6ZWFjaCBkaXJlY3RpdmVzIG11c3QgaGF2ZSBhIDo6a2V5XG5kaXJlY3RpdmUgc3BlY2lmaWVkIG9uIHRoZSBzYW1lIGVsZW1lbnQsIHdob3NlIG5vdGF0aW9uIGV2YWx1YXRlcyB0byBhIHVuaXF1ZVxudmFsdWUgZm9yIGVhY2ggaXRlbSBpbiB0aGUgbGlzdC5cblxuRXhhbXBsZTogPGxpIDo6ZWFjaD1cIiRpdGVtc1wiIDo6a2V5PVwiI2lkXCI+IC4uLiA8L2xpPlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZXTogYFxuVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZXG5BIGxpc3QgZmFpbGVkIHRvIHJlbmRlciBiZWNhdXNlIGl0ZW0ga2V5ICVzIGFwcGVhcmVkIG11bHRpcGxlIHRpbWVzIHdoZW5cbnJlc29sdmluZyBsaXN0IGl0ZW0ga2V5cy4gRWFjaCA6OmtleSBkaXJlY3RpdmUgbXVzdCByZWZlcmVuY2UgYSBub3RhdGlvbiB3aG9zZVxudmFsdWUgaXMgdW5pcXVlIGZvciBlYWNoIGxpc3QgaXRlbS5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfS0VZXTogYFxuSU5WQUxJRF9TVEFURV9LRVlcblRyaWVkIHRvIGFjY2VzcyBhIHN0YXRlIHByb3BlcnR5IHdoaWNoIGRvZXMgbm90IGV4aXN0XG5cbktleSBwYXRoOiAlc1xuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9TVEFURV9VUERBVEVdOiBgXG5JTlZBTElEX1NUQVRFX1VQREFURVxuQSBDb21wb25lbnQncyBzZXRTdGF0ZSgpIHdhcyBjYWxsZWQgd2l0aCBhIHZhbHVlIHdoaWNoIGNvdWxkIG5vdCBiZSBwYXRjaGVkIGluXG50byB0aGUgZXhpc3RpbmcgY29tcG9uZW50IHN0YXRlLlxuXG5zZXRTdGF0ZSgpIHRha2VzIGEgcGFydGlhbCBvYmplY3QgZGVzY3JpYmluZyBzdGF0ZSBrZXlzIHRvIHVwZGF0ZS5cblxuSW5zdGVhZCwgcmVjZWl2ZWQ6ICVzXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5TVEFURV9MT0NLRURdOiBgXG5TVEFURV9MT0NLRURcbkEgU3RhdGUgcmVjZWl2ZWQgYSByZXF1ZXN0IHRvIHVwZGF0ZSBvciBsb2NrIHdoaWxlIGFscmVhZHkgbG9ja2VkLlxuU3RhdGVzIG1heSBiZSBsb2NrZWQgdXNpbmcgdGhlIC5sb2NrKCkgbWV0aG9kIGFuZCB1bmxvY2tlZCB1c2luZyB0aGUgLnVubG9jaygpXG5tZXRob2QuIFN0YXRlcyBsb2NrIGR1cmluZyBhc3luYyBtdXRhdGlvbnMgZG9uZSB0aHJvdWdoIHRoZSAubXV0YXRlQXN5bmMoKVxubWV0aG9kIGlmIFwidHJ1ZVwiIGlzIHBhc3NlZCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci5cblxuWW91IGNhbiBjaGVjayB0aGUgbG9jayBzdGF0dXMgb2YgYSBTdGF0ZSBpbnN0YW5jZSB3aXRoIC5pc0xvY2tlZFxuYCxcblxuICAgIFtFcnJvckNvZGUuTUFYX1NFUVVFTlRJQUxfUkVOREVSU106IGBcbk1BWF9TRVFVRU5USUFMX1JFTkRFUlNcbkEgY29tcG9uZW50IGhhcyBlcnJvcmVkIGFmdGVyIHJlLXJlbmRlcmluZyBtb3JlIHRoYW4gJXMgdGltZXMgaW4gdGhlIHNhbWUgZnJhbWUuXG5cblRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgYmVjYXVzZSBzdGF0ZSBvciBsaXZlIGF0dHJpYnV0ZXMgYXJlIGJlaW5nIG1vZGlmaWVkXG5kdXJpbmcgYSByZW5kZXIgbGlmZWN5Y2xlIG1ldGhvZCBzdWNoIGFzIGJlZm9yZVVwZGF0ZSgpIG9yIGFmdGVyVXBkYXRlKCkuIElmXG5zdGF0ZSBjaGFuZ2VzIHVuY29uZGl0aW9uYWxseSBkdXJpbmcgYSByZW5kZXIsIHRoZSByZW5kZXIgd2lsbCBpbmZpbml0ZWx5IGxvb3AuXG5VcGRhdGluZyByZW5kZXIgc291cmNlIGRhdGEgZHVyaW5nIGEgcmVuZGVyIGN5Y2xlIGlzIHN1cHBvcnRlZCwgYnV0IGluZmluaXRlXG51cGRhdGUgbG9vcHMgbWF5IG9jY3VyIGlmIHVuY2hlY2tlZC5cbmAsXG4gIH07XG5cbiAgcmV0dXJuIERFVl9FUlJPUl9JTkZPW2NvZGVdO1xufVxuXG4vKipcbiAqIEFuIGVycm9yIG9yaWdpbmF0aW5nIGZyb20gd2l0aGluIGEgUGFsZXR0ZSBzdWJzeXN0ZW0uXG4gKlxuICogSW4gdGhlIGBkZXZlbG9wbWVudGAgZW52aXJvbm1lbnQsIHRoZSBlcnJvciB3aWxsIHN1cmZhY2Ugd2l0aCBleHRlbmRlZCBpbmZvXG4gKiBhYm91dCB0aGUgZXJyb3IgYW5kIGFueSBkZXRhaWxzIHdoaWNoIG1heSBiZSByZWxldmFudCB0byBoZWxwIHdpdGggZGVidWdnaW5nLlxuICpcbiAqIEluIHRoZSBgcHJvZHVjdGlvbmAgZW52aXJvbm1lbnQsIGEgbWluaW1hbCBlcnJvciBvbmx5IHN1cmZhY2luZyB0aGUgbnVtZXJpY1xuICogZXJyb3IgY29kZSBpcyB0aHJvd24gaW5zdGVhZC5cbiAqXG4gKiBDb2RlcyBhcmUgY2F0ZWdvcml6ZWQgaW50byBncm91cHMgYnkgdGhlIDEwMCdzOlxuICpcbiAqIC0gMCAtIDk5OiBJbnZhcmlhbnRzXG4gKiAtIDEwMCAtIDE5OTogQ3VzdG9tIEVsZW1lbnRzIC8gRW52aXJvbm1lbnQgRXJyb3JzXG4gKiAtIDIwMCAtIDI5OTogVGVtcGxhdGluZyBFcnJvcnNcbiAqIC0gMzAwIC0gMzk5OiBSdW50aW1lIEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgUGFsZXR0ZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBuYW1lID0gXCJQYWxldHRlRXJyb3JcIjtcbiAgY29kZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvZGU6IG51bWJlciwgLi4udmFsdWVzOiBzdHJpbmdbXSkge1xuICAgIGxldCBtZXNzYWdlID0gYENvZGU6ICR7Y29kZX1gO1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBtZXNzYWdlICs9IGdldERldkVycm9yKGNvZGUpO1xuXG4gICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZXMpIHtcbiAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZShgJXNgLCBTdHJpbmcodmFsKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbi8qKlxuICogQHJldHVybnMgQW4gYXJyYXkgb2Yge0BsaW5rIENTU1N0eWxlU2hlZXR9cyBjb250YWluaW5nIHRoZSBwcm92aWRlZCBDU1NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzcyhcbiAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksXG4gIC4uLnZhbHVlczogdW5rbm93bltdXG4pOiBDU1NTdHlsZVNoZWV0IHtcbiAgbGV0IHJlc3VsdCA9IHN0cmluZ3NbMF0gPz8gXCJcIjtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG5leHRWYWwgPSB2YWx1ZXNbaV0gPz8gXCJcIjtcbiAgICBjb25zdCBuZXh0U3RyID0gc3RyaW5nc1tpICsgMV0gPz8gXCJcIjtcbiAgICByZXN1bHQgKz0gYCR7bmV4dFZhbH0ke25leHRTdHJ9YDtcbiAgfVxuXG4gIGNvbnN0IHNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKTtcbiAgc2hlZXQucmVwbGFjZVN5bmMocmVzdWx0KTtcbiAgcmV0dXJuIHNoZWV0O1xufVxuXG50eXBlIENsYXNzVmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCB1bmRlZmluZWRcbiAgfCBudWxsXG4gIHwgQ2xhc3NBcnJheVxuICB8IENsYXNzT2JqZWN0O1xudHlwZSBDbGFzc0FycmF5ID0gQ2xhc3NWYWx1ZVtdO1xudHlwZSBDbGFzc09iamVjdCA9IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbi8qKlxuICogR2l2ZW4gZmxleGlibGUgaW5wdXQsIGdlbmVyYXRlIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBzZXR0aW5nIGFzIGFuIGh0bWwgY2xhc3NcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzaWZ5KFwibXktY2xhc3NcIiwgXCJhbm90aGVyLWNsYXNzXCIpIC8vIFwibXktY2xhc3MgYW5vdGhlci1jbGFzc1wiXG4gKiBjbGFzc2lmeShbXCJteS1jbGFzc1wiLCBcImFub3RoZXItY2xhc3NcIl0pIC8vIFwibXktY2xhc3MgYW5vdGhlci1jbGFzc1wiXG4gKiBjbGFzc2lmeSh7IGVuYWJsZWQ6IHRydWUsIGRpc2FibGVkOiBmYWxzZSB9KSAvLyBcImVuYWJsZWRcIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeSguLi5hcmdzOiBDbGFzc1ZhbHVlW10pOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0U3RyaW5nID0gXCJcIjtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJncy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBhcmd1bWVudCA9IGFyZ3NbaW5kZXhdO1xuXG4gICAgaWYgKCFhcmd1bWVudCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gU3RyaW5ncy9udW1zIC0+IERpcmVjdCBhcHBlbmRcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBhcmd1bWVudCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHJlc3VsdFN0cmluZykge1xuICAgICAgICByZXN1bHRTdHJpbmcgKz0gXCIgXCI7XG4gICAgICB9XG4gICAgICByZXN1bHRTdHJpbmcgKz0gYXJndW1lbnQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYXJyYXlzIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnQpKSB7XG4gICAgICBjb25zdCBuZXN0ZWRSZXN1bHQgPSBjbGFzc2lmeSguLi5hcmd1bWVudCk7XG4gICAgICBpZiAobmVzdGVkUmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHRTdHJpbmcpIHtcbiAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gXCIgXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0U3RyaW5nICs9IG5lc3RlZFJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBvYmplY3RzIHdpdGggY29uZGl0aW9uYWwgY2xhc3MgbmFtZXNcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGNsYXNzTmFtZSBpbiBhcmd1bWVudCkge1xuICAgICAgICAvLyBPbmx5IGluY2x1ZGUgY2xhc3MgbmFtZSBpZiBpdHMgdmFsdWUgaXMgdHJ1dGh5XG4gICAgICAgIGlmIChhcmd1bWVudFtjbGFzc05hbWVdKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdFN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0U3RyaW5nICs9IFwiIFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gY2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFN0cmluZztcbn1cbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5cbi8qKiBBbiBhdHRyaWJ1dGUgdmFsdWUgYXMgcmVhZCBmcm9tIGEgRE9NIGVsZW1lbnQgKi9cbnR5cGUgQXR0cmlidXRlVmFsdWUgPSBzdHJpbmcgfCBudWxsO1xuXG4vKiogQSBNYXAgb2Ygc3RyaW5nIGF0dHJpYnV0ZSBuYW1lcyB0byB7QGxpbmsgQXR0cmlidXRlVmFsdWV9ICovXG50eXBlIEF0dHJpYnV0ZU1hcCA9IE1hcDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWx1ZTogdW5rbm93bik6IEF0dHJpYnV0ZVZhbHVlIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBmYWxzZSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF0dHJpYnV0ZU1hcChcbiAgc291cmNlOiBvYmplY3QgfCBNYXA8c3RyaW5nLCB1bmtub3duPiB8IEhUTUxFbGVtZW50LFxuKTogQXR0cmlidXRlTWFwIHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHNvdXJjZS5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBtYXAuc2V0KG5hbWUsIHNlcmlhbGl6ZUF0dHJpYnV0ZShzb3VyY2UuZ2V0QXR0cmlidXRlKG5hbWUpKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBpZiAoc291cmNlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHNvdXJjZSkge1xuICAgICAgbWFwLnNldChrZXksIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiICYmIHNvdXJjZSAhPT0gbnVsbCkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKSB7XG4gICAgICBtYXAuc2V0KGtleSwgc2VyaWFsaXplQXR0cmlidXRlKHZhbCkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QXR0cmlidXRlTWFwKFxuICB0YXJnZXQ6IEhUTUxFbGVtZW50LFxuICBhdHRyczogQXR0cmlidXRlTWFwLFxuKTogdm9pZCB7XG4gIGNvbnN0IGN1cnJlbnROYW1lcyA9IG5ldyBTZXQodGFyZ2V0LmdldEF0dHJpYnV0ZU5hbWVzKCkpO1xuICBjb25zdCBpbmNvbWluZ05hbWVzID0gbmV3IFNldChhdHRycy5rZXlzKCkpO1xuICBjb25zdCBhdHRyaWJ1dGVzVG9SZW1vdmUgPSBjdXJyZW50TmFtZXMuZGlmZmVyZW5jZShpbmNvbWluZ05hbWVzKTtcblxuICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0cmlidXRlc1RvUmVtb3ZlKSB7XG4gICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW25hbWUsIHZhbF0gb2YgYXR0cnMpIHtcbiAgICBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbCk7XG4gICAgfVxuICB9XG59XG4iLAogICAgIi8qXG4gKiBDb3B5cmlnaHQgwqkgUnVzdGljIEFyY2FkZSwgTExDIDIwMjZcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbi8qKlxuICogR2l2ZW4gYW4gZWxlbWVudCwgcmVwbGFjZSBpdCB3aXRoIGEgZGlmZmVyZW50IHRhZywgYWRvcHRpbmcgYWxsIGF0dHJpYnV0ZXNcbiAqIGFuZCBjaGlsZCBlbGVtZW50cy5cbiAqIEBwYXJhbSAkdGFyZ2V0IFRoZSBlbGVtZW50IHRvIHN3YXAgb3V0XG4gKiBAcGFyYW0gbmV3VGFnIFRoZSBuZXcgSFRNTCB0YWdOYW1lIHRvIHVzZVxuICogQHJldHVybnMgVGhlIG5ld2x5IHN3YXBwZWQtaW4gZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhbmdlVGFnKCR0YXJnZXQ6IEhUTUxFbGVtZW50LCBuZXdUYWc6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgY29uc3QgJG5ld0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuZXdUYWcpO1xuXG4gIHdoaWxlICgkdGFyZ2V0LmZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAkbmV3RWwuYXBwZW5kQ2hpbGQoJHRhcmdldC5maXJzdENoaWxkKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgYXR0ck5hbWUgb2YgJHRhcmdldC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgY29uc3QgdmFsID0gJHRhcmdldC5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuXG4gICAgaWYgKHZhbCAhPT0gbnVsbCkge1xuICAgICAgJG5ld0VsLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgdmFsKTtcbiAgICB9XG4gIH1cblxuICAkdGFyZ2V0LnJlcGxhY2VXaXRoKCRuZXdFbCk7XG4gIHJldHVybiAkbmV3RWw7XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IHsgQ2hhckNvZGVzIH0gZnJvbSBcIi4vY2hhcmFjdGVyLWNvZGVzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RhZ05hbWUoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBFbnN1cmUgdGhlIGNoYXJhY3RlciBjb2RlIGlzIGEgbGV0dGVyIG9yIGh5cGhlblxuICAgIGNvbnN0IGNoYXIgPSBzdHIuY2hhckNvZGVBdChpKTtcblxuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIGNoYXIgPT09IENoYXJDb2Rlcy5IeXBoZW4gfHxcbiAgICAgICAgKGNoYXIgPj0gQ2hhckNvZGVzLkEgJiYgY2hhciA8PSBDaGFyQ29kZXMuWikgfHxcbiAgICAgICAgKGNoYXIgPj0gQ2hhckNvZGVzLmEgJiYgY2hhciA8PSBDaGFyQ29kZXMueilcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBBIHBlcmZvcm1hbmNlIG9wdGltaXplZCB2ZXJzaW9uIG9mIGAubWF0Y2hlcygpYCB3aGljaCBpbmNsdWRlcyBmYXN0ZXJcbiAqIG1hdGNoaW5nIHN0cmF0ZWdpZXMgZm9yIGNvbW1vbiBxdWVyaWVzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPcHRpbWl6ZWQgcXVlcnkgdHlwZXM6XG4gKlxuICogLSBTaW5nbGUgSUQgc2VsZWN0b3IgYFwiI2lkZW50aWZpZXJcImBcbiAqIC0gU2luZ2xlIGNsYXNzIHNlbGVjdG9yIGBcIi5jbGFzc25hbWVcImBcbiAqIC0gVGFnbmFtZSBzZWxlY3RvciBgXCJidXR0b25cImBcbiAqIC0gU2ltcGxlIGF0dHJpYnV0ZSBzZWxlY3RvciBgXCJbYXR0cj0ndmFsdWUnXVwiYFxuICpcbiAqIEFsbCBvdGhlciB0eXBlcyBvZiBxdWVyaWVzIHVzZSB0aGUgYmFzZSAubWF0Y2hlcygpIGZvciBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbGVtZW50TWF0Y2hlcyhlbGVtZW50OiBFbGVtZW50LCBxdWVyeTogc3RyaW5nKSB7XG4gIC8vIElmIHRoZSBxdWVyeSBpcyBhIHNpbXBsZSBJRCwgY2hlY2sgaXQgZGlyZWN0bHlcbiAgaWYgKFxuICAgIHF1ZXJ5WzBdID09PSBcIiNcIiAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCIgXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCIuXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCJbXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCI6XCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCI+XCIpID09PSAtMVxuICApIHtcbiAgICByZXR1cm4gZWxlbWVudC5pZCA9PT0gcXVlcnkuc2xpY2UoMSk7XG4gIH1cblxuICAvLyBJZiB0aGUgcXVlcnkgaXMgYSBzaW1wbGUgY2xhc3NuYW1lLCBjaGVjayBpdCBkaXJlY3RseVxuICBpZiAoXG4gICAgcXVlcnlbMF0gPT09IFwiLlwiICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIiBcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIiNcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIltcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIjpcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIj5cIikgPT09IC0xXG4gICkge1xuICAgIHJldHVybiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhxdWVyeS5zbGljZSgxKSk7XG4gIH1cblxuICAvLyBJZiB0aGUgcXVlcnkgaXMgZm9yIGp1c3QgYSB0YWduYW1lLCBjaGVjayBpdCBkaXJlY3RseVxuICBpZiAoaXNUYWdOYW1lKHF1ZXJ5KSkge1xuICAgIHJldHVybiBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIC8vIElmIHRoZSBxdWVyeSBpcyBmb3IgYSBzaW5nbGUgc2VsZWN0b3IgdmFsdWUsIGNoZWNrIGl0IGRpcmVjdGx5XG4gIGlmIChcbiAgICBxdWVyeVswXSA9PT0gXCJbXCIgJiZcbiAgICBxdWVyeVtxdWVyeS5sZW5ndGggLSAxXSA9PT0gXCJdXCIgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiIFwiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiOlwiKSA9PT0gLTFcbiAgKSB7XG4gICAgY29uc3QgYXR0ciA9IHF1ZXJ5LnNsaWNlKDEsIC0xKTtcbiAgICBjb25zdCBlcUluZGV4ID0gYXR0ci5pbmRleE9mKFwiPVwiKTtcbiAgICBpZiAoZXFJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyKTtcbiAgICB9XG4gICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyLnNsaWNlKDAsIGVxSW5kZXgpO1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGF0dHIuc2xpY2UoZXFJbmRleCArIDEpLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgXCJcIik7XG4gICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKSA9PT0gYXR0clZhbHVlO1xuICB9XG5cbiAgLy8gT3RoZXJ3aXNlLCB1c2UgbmF0aXZlIGAubWF0Y2hlc2AgZm9yIGNvbXBsZXggc3R1ZmZcbiAgcmV0dXJuIGVsZW1lbnQubWF0Y2hlcyhxdWVyeSk7XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xudHlwZSBNZXRyaWNzID0ge1xuICBoaXRzOiBudW1iZXI7XG4gIG1pc3NlczogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTFJVQ2FjaGVNZXRyaWNzID0ge1xuICBsb29rdXBzOiBudW1iZXI7XG4gIGhpdHM6IG51bWJlcjtcbiAgbWlzc2VzOiBudW1iZXI7XG4gIGNhcGFjaXR5OiBudW1iZXI7XG4gIGVudHJpZXM6IG51bWJlcjtcbiAgaGl0UmF0ZTogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBBIHNpbXBsZSBpbi1tZW1vcnkgTFJVIENhY2hlIHVzaW5nIEphdmFTY3JpcHQgbWFwcy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIENhY2hlZCBuZXR3b3JrIHJlcXVlc3RcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBBIGNhY2hlIG9mIEFQSSBVUkxzIHRvIHRoZWlyIHJldHVybmVkIHBheWxvYWRzXG4gKiBjb25zdCBjYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIEFQSVBheWxvYWQ+KCk7XG4gKlxuICogYXN5bmMgZnVuY3Rpb24gbWFrZVJlcXVlc3QodXJsOiBzdHJpbmcpIHtcbiAqICAgbGV0IGNhY2hlZCA9IGNhY2hlLmdldCh1cmwpO1xuICogICBpZiAoY2FjaGVkKSB7XG4gKiAgICAgcmV0dXJuIGNhY2hlZDtcbiAqICAgfVxuICpcbiAqICAgLy8gLi4uIE1ha2UgdGhlIHJlcXVlc3QgYW5kIGNhY2hlLnNldCgpIHRoZSByZXNwb25zZVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBMUlVDYWNoZTxLLCBWPiB7XG4gIHByaXZhdGUgX21heFNpemU6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZGF0YTogTWFwPEssIFY+O1xuICBwcml2YXRlIF9tZXRyaWNzOiBNZXRyaWNzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAgfTtcblxuICBjb25zdHJ1Y3RvcihtYXhTaXplOiBudW1iZXIgPSA1MDApIHtcbiAgICBpZiAobWF4U2l6ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMUlUgQ2FjaGUgY2FwYWNpdHkgbXVzdCBiZSA+PSAxXCIpO1xuICAgIH1cblxuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICB0aGlzLl9tZXRyaWNzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXhTaXplID0gbWF4U2l6ZTtcbiAgICB0aGlzLl9kYXRhID0gbmV3IE1hcDxLLCBWPigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJpbSA9ICgpID0+IHtcbiAgICB3aGlsZSAodGhpcy5fZGF0YS5zaXplID4gdGhpcy5fbWF4U2l6ZSkge1xuICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLl9kYXRhLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAoZmlyc3RLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBYnN1cmRcIik7XG4gICAgICB9XG4gICAgICB0aGlzLl9kYXRhLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgY2FjaGUgcGVyZm9ybWFuY2UgbWV0cmljcyBmcm9tIHRoaXMgTFJVIENhY2hlIGluc3RhbmNlLlxuICAgKlxuICAgKiBJbiBkZXZlbG9wbWVudCBtb2RlLCB0aGlzIHJldHVybnMgaW5zaWdodHMgaW50byBoaXRzL21pc3NlcyBvZiB0aGUgY2FjaGUsXG4gICAqIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhbmQgZW50cnkgY291bnQuXG4gICAqXG4gICAqIEluIHByb2R1Y3Rpb24gbW9kZSwgdGhpcyByZXR1cm5zIGEgcGxhY2Vob2xkZXIgb2JqZWN0LCBhcyBtZXRyaWMgY29sbGVjdGlvblxuICAgKiBpcyBub3QgYWN0aXZlIGluIHByb2R1Y3Rpb24uXG4gICAqL1xuICBnZXQgbWV0cmljcygpOiBMUlVDYWNoZU1ldHJpY3Mge1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBjb25zdCB7IGhpdHMgPSAwLCBtaXNzZXMgPSAwIH0gPSB0aGlzLl9tZXRyaWNzID8/IHt9O1xuICAgICAgY29uc3QgbG9va3VwcyA9IGhpdHMgKyBtaXNzZXM7XG4gICAgICBjb25zdCBoaXRSYXRlID0gbG9va3VwcyA9PT0gMCA/IDAgOiBoaXRzIC8gbG9va3VwcztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9va3VwcyxcbiAgICAgICAgaGl0czogaGl0cyxcbiAgICAgICAgbWlzc2VzOiBtaXNzZXMsXG4gICAgICAgIGNhcGFjaXR5OiB0aGlzLl9tYXhTaXplLFxuICAgICAgICBlbnRyaWVzOiB0aGlzLl9kYXRhLnNpemUsXG4gICAgICAgIGhpdFJhdGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsb29rdXBzOiAwLFxuICAgICAgaGl0czogMCxcbiAgICAgIG1pc3NlczogMCxcbiAgICAgIGNhcGFjaXR5OiAwLFxuICAgICAgZW50cmllczogMCxcbiAgICAgIGhpdFJhdGU6IDAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIG1heGltdW0gY2FjaGUgc2l6ZSBmb3IgdGhpcyBpbnN0YW5jZS4gSW1tZWRpYXRlbHkgdHJpZ2dlcnMgYVxuICAgKiBwdXJnZSBvZiBjYWNoZWQgY29udGVudHMgaWYgdGhlIG5ldyBjYXBhY2l0eSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnRcbiAgICogbnVtYmVyIG9mIGNhY2hlZCBlbnRyaWVzLlxuICAgKi9cbiAgc2V0Q2FwYWNpdHkgPSAobWF4U2l6ZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgaWYgKG1heFNpemUgPD0gMCAmJiBfX0RFVl9fKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW1BhbGV0dGUgTFJVIENhY2hlXSBDYWNoZSBzaXplIGlzIDw9IDAuIENhY2hlIGlzIGRpc2FibGVkLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXhTaXplID0gbWF4U2l6ZTtcbiAgICB0aGlzLl90cmltKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgdmFsdWUgZnJvbSB0aGUgY2FjaGUsIHJldHVybmluZyBgdW5kZWZpbmVkYCBpZiBubyB2YWx1ZSB3YXMgZm91bmRcbiAgICovXG4gIGdldChrZXk6IEspOiBWIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGEuZ2V0KGtleSk7XG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgdGhpcy5fbWV0cmljcy5taXNzZXMgKz0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIGFuZCByZS1zZXQgdGhlIHZhbHVlIHRvIG1vdmUgdGhlIGtleSB0byB0aGUgZW5kIG9mIHRoZSBrZXkgbGlzdFxuICAgIHRoaXMuX2RhdGEuZGVsZXRlKGtleSk7XG4gICAgdGhpcy5fZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG5cbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgdGhpcy5fbWV0cmljcy5oaXRzICs9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHZhbHVlIGluIHRoZSBjYWNoZS4gVGhpcyBhbHNvIG1vdmVzIHRoZSB2YWx1ZSB0byB0aGUgYmFjayBvZiB0aGUgbGlzdFxuICAgKiBvZiB2YWx1ZXMgdG8gY29uc2lkZXIgZXZpY3Rpbmcgd2hlbiB0aGUgY2FjaGUgaXMgZnVsbC5cbiAgICovXG4gIHNldChrZXk6IEssIHZhbHVlOiBWKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGlmIGV4aXN0cyB0byB1cGRhdGUgcG9zaXRpb25cbiAgICBpZiAodGhpcy5fZGF0YS5oYXMoa2V5KSkge1xuICAgICAgdGhpcy5fZGF0YS5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRhLnNldChrZXksIHZhbHVlKTtcblxuICAgIGlmICh0aGlzLl9kYXRhLnNpemUgPiB0aGlzLl9tYXhTaXplKSB7XG4gICAgICB0aGlzLl90cmltKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjb250ZW50cyBvZiB0aGlzIGNhY2hlIGluc3RhbmNlXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRhLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIGNhY2hlIGluc3RhbmNlXG4gICAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnNpemU7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTFJVQ2FjaGU7XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IExSVUNhY2hlIGZyb20gXCIuL2xydS1jYWNoZVwiO1xuXG5leHBvcnQgY29uc3QgZnJhZ21lbnRDYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIERvY3VtZW50RnJhZ21lbnQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBodG1sVG9GcmFnbWVudChodG1sOiBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgY29uc3QgbG9va3VwID0gZnJhZ21lbnRDYWNoZS5nZXQoaHRtbCk7XG5cbiAgaWYgKGxvb2t1cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGxvb2t1cC5jbG9uZU5vZGUodHJ1ZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgfVxuXG4gIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gIHRlbXAuaW5uZXJIVE1MID0gaHRtbDtcbiAgZnJhZ21lbnRDYWNoZS5zZXQoaHRtbCwgdGVtcC5jb250ZW50KTtcbiAgcmV0dXJuIHRlbXAuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiI2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5pbXBvcnQgeyBpc1RhZ05hbWUgfSBmcm9tIFwiI3V0aWxcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGVtcGxhdGVTdHJpbmdWYWx1ZShcbiAgdmFsOiBzdHJpbmcgfCB0eXBlb2YgQ29tcG9uZW50IHwgSFRNTFRlbXBsYXRlRWxlbWVudCxcbik6IHN0cmluZyB7XG4gIGlmICh2YWwgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgcmV0dXJuIHZhbC5pbm5lckhUTUw7XG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIHZhbCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgKHZhbC5wcm90b3R5cGUgaW5zdGFuY2VvZiBDb21wb25lbnQgfHwgdmFsID09PSBDb21wb25lbnQpXG4gICkge1xuICAgIGNvbnN0IHRhZ05hbWUgPSB2YWwudGFnTmFtZTtcbiAgICBpZiAoIWlzVGFnTmFtZSh0YWdOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfQ09NUE9ORU5ULFxuICAgICAgICB2YWwubmFtZSxcbiAgICAgICAgdmFsLnRhZ05hbWUsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGFnTmFtZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGA8c3BhbiA6OnN3YXA9XCIke3ZhbH1cIj48L3NwYW4+YDtcbiAgfVxuXG4gIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSUQsIFN0cmluZyh2YWwpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4ge0BsaW5rIEhUTUxUZW1wbGF0ZUVsZW1lbnR9IGZyb20gdGhlIHByb3ZpZGVkIEhUTUwgc3RyaW5nLlxuICpcbiAqIFRoZXNlIEhUTUwgVGVtcGxhdGVzIGNhbiBiZSB1c2VkIGFzIHN0YW5kYXJkIEhUTUwgVGVtcGxhdGVzLCBvciBhcyB0aGVcbiAqIGZvdW5kYXRpb24gZm9yIGEge0BsaW5rIENvbXBvbmVudH0gb3Igc3RhbmRhbG9uZSB7QGxpbmsgVGVtcGxhdGV9XG4gKlxuICogSW50ZXJwb2xhdGVzIHZhbHVlcyBpbiB0aGUgdGVtcGxhdGUgc3RyaW5nIHRvIHByb3ZpZGUgaGVscGVycyBmb3IgY29tcG9zaW5nXG4gKiB0ZW1wbGF0ZXM6XG4gKlxuICogLSBIVE1MVGVtcGxhdGVFbGVtZW50IHJlZmVyZW5jZXMgYXJlIHNlcmlhbGl6ZWQgdG8gSFRNTCBhbmQgaW5saW5lZFxuICogLSBTdHJpbmdzIGFyZSBtb2RpZmllZCB0byBiZWNvbWUgPHNwYW4+IHRhZ3Mgd2l0aCB0aGUgOjpzd2FwIGRpcmVjdGl2ZSBzZXRcbiAqICAgdG8gdGhlIHN0cmluZyB2YWx1ZS4gVGhpcyBpcyBoZWxwZnVsIHNob3J0aGFuZCBmb3IgY29udGVudCBwbGFjZWhvbGRlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBUaGlzIHRlbXBsYXRlIHN0cmluZ1xuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0ICR0ZW1wbGF0ZSA9IGh0bWxgXG4gKiA8ZGl2IDpjbGFzcz1cIipjbGFzc25hbWVzXCI+XG4gKiAgICR7XCJAY29udGVudFwifVxuICogPC9kaXY+XG4gKiBgXG4gKiBgYGBcbiAqXG4gKiBQcm9kdWNlcyB0aGlzIHRlbXBsYXRlIGVsZW1lbnQgKHBvcnRyYXllZCBhcyBIVE1MKVxuICpcbiAqIGBgYGh0bWxcbiAqIDx0ZW1wbGF0ZT5cbiAqICAgPGRpdiA6Y2xhc3M9XCIqY2xhc3NuYW1lc1wiPlxuICogICAgIDxzcGFuIDo6c3dhcD1cIkBjb250ZW50XCI+PC9zcGFuPlxuICogICA8L2Rpdj5cbiAqIDwvdGVtcGxhdGU+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh0bWwoXG4gIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LFxuICAuLi52YWx1ZXM6IChcbiAgICB8IGBAJHtzdHJpbmd9YFxuICAgIHwgYCQke3N0cmluZ31gXG4gICAgfCBgIyR7c3RyaW5nfWBcbiAgICB8IGAqJHtzdHJpbmd9YFxuICAgIHwgSFRNTFRlbXBsYXRlRWxlbWVudFxuICAgIHwgdHlwZW9mIENvbXBvbmVudDxhbnk+XG4gIClbXVxuKTogSFRNTFRlbXBsYXRlRWxlbWVudCB7XG4gIGNvbnN0IGZ1bGxTdHJpbmcgPSBzdHJpbmdzLnJlZHVjZSgoYWNjLCBzdHIsIGkpID0+IHtcbiAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IHZhbHVlc1tpXVxuICAgICAgPyBgJHtwYXJzZVRlbXBsYXRlU3RyaW5nVmFsdWUodmFsdWVzW2ldKX1gXG4gICAgICA6IFwiXCI7XG4gICAgcmV0dXJuIGFjYyArIHN0ciArIHBhcnNlZFZhbHVlO1xuICB9LCBcIlwiKTtcblxuICBjb25zdCB0ZW1wbGF0ZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gIHRlbXBsYXRlRWxlbWVudC5pbm5lckhUTUwgPSBmdWxsU3RyaW5nO1xuICByZXR1cm4gdGVtcGxhdGVFbGVtZW50O1xufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5cbmV4cG9ydCB0eXBlIFN0YXRlTGlzdGVuZXI8U2hhcGU+ID0gKHN0YXRlOiBTaGFwZSkgPT4gdm9pZDtcblxuY29uc3QgUFJPWFlfREVQVEhfV0FSTklOR19MSU1JVCA9IDQ7XG5cbmNvbnN0IEFycmF5TXV0YXRvckZ1bmN0aW9ucyA9IG5ldyBTZXQoW1xuICBcInB1c2hcIixcbiAgXCJwb3BcIixcbiAgXCJzaGlmdFwiLFxuICBcInVuc2hpZnRcIixcbiAgXCJzcGxpY2VcIixcbiAgXCJzb3J0XCIsXG4gIFwicmV2ZXJzZVwiLFxuICBcImZpbGxcIixcbiAgXCJjb3B5V2l0aGluXCIsXG5dKTtcblxuY29uc3QgRGF0YVN0cnVjdHVyZU11dGF0b3JGdW5jdGlvbnMgPSBuZXcgU2V0KFtcbiAgXCJhZGRcIixcbiAgXCJkZWxldGVcIixcbiAgXCJjbGVhclwiLFxuICBcInNldFwiLFxuXSk7XG5cbi8qKlxuICogUG93ZXJmdWwgYW5kIGZsZXhpYmxlIHN0YXRlIG1hbmFnZW1lbnQgd2l0aCBkZWVwIHJlYWN0aXZpdHksIHRyYW5zYWN0aW9uLCBhbmRcbiAqIGxvY2tpbmcgc3VwcG9ydC5cbiAqXG4gKiBUaGUgU3RhdGUgY2xhc3Mgd3JhcHMgc3RhdGVmdWwgZGF0YSBhbmQgcHJvdmlkZXMgYW4gQVBJIGZvciBtdXRhdGluZyB0aGUgZGF0YVxuICogd2hpbGUgbGlzdGVuZXJzIHN1YnNjcmliZSB0byBtZWFuaW5nZnVsIHVwZGF0ZXMuXG4gKlxuICogTW9kaWZ5IHN0YXRlIHdpdGggc2V0dGVycywgbXV0YXRvcnMsIHRyYW5zYWN0aW9ucywgb3IgcHJveGllZCB1cGRhdGVzIHdpdGhcbiAqIGRlZXAgcmVhY3Rpdml0eSBhbmQgYXJyYXkgbXV0YXRpb24gc3VwcG9ydCBidWlsdCBpbi5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHN0YXRlID0gbmV3IFN0YXRlKHtjb3VudDogMX0pO1xuICogc3RhdGUuYWRkTGlzdGVuZXIoZGF0YSA9PiBjb25zb2xlLmxvZyhkYXRhKSlcbiAqXG4gKiBzdGF0ZS5zZXQoXCJjb3VudFwiLCAyKTsgLy8gUHJpbnRzIFwiMlwiXG4gKiBzdGF0ZS5zZXQoXCJjb3VudFwiLCAyKTsgLy8gTm90aGluZyBoYXBwZW5zLCBubyBjaGFuZ2VcbiAqIHN0YXRlLmxpdmUuY291bnQgPSAzOyAvLyBQcmludHMgXCIzXCJcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU3RhdGU8U2hhcGUgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgcHJpdmF0ZSBfZGF0YTogU2hhcGU7XG4gIHByaXZhdGUgX2xpc3RlbmVyczogU2V0PFN0YXRlTGlzdGVuZXI8U2hhcGU+PiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBfcHJveHk/OiBTaGFwZTtcbiAgcHJpdmF0ZSBfcHJveHlDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgYW55PigpO1xuICBwcml2YXRlIF9yZXZlcnNlUHJveHlDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgb2JqZWN0PigpO1xuICBwcml2YXRlIF9pc0xvY2tlZCA9IGZhbHNlO1xuXG4gIC8vIE9ubHkgYWxsb3cgd2FybmluZyBpbiBkZXYgbW9kZSwgYW5kIG9ubHkgcHJpbnQgdGhlIHdhcm5pbmcgb25jZSBwZXIgaW5zdFxuICBwcml2YXRlIF9oYXNXYXJuZWQgPSAhX19ERVZfXztcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsRGF0YTogU2hhcGUsIG9uQ2hhbmdlPzogU3RhdGVMaXN0ZW5lcjxTaGFwZT4pIHtcbiAgICB0aGlzLl9kYXRhID0gaW5pdGlhbERhdGE7XG4gICAgdGhpcy5nZXQgPSB0aGlzLmdldC5iaW5kKHRoaXMpO1xuXG4gICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuYWRkKG9uQ2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGF6aWx5IGNyZWF0ZSBhbmQgY2FjaGUgcHJveGllcyBpbnRvIHRoZSBzdGF0ZSBmb3IgcmVhY3RpdmUgdXBkYXRlcyBvblxuICAgKiBuZXN0ZWQgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlUHJveHk8VD4odGFyZ2V0OiBULCBwYXRoOiBzdHJpbmdbXSA9IFtdKTogVCB7XG4gICAgLy8gUmV0dXJuIHByaW1pdGl2ZXMgaW1tZWRpYXRlbHlcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiB8fCB0YXJnZXQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGEgY2FjaGVkIHByb3h5IGZvciB0aGlzIG9iamVjdFxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuX3Byb3h5Q2FjaGUuZ2V0KHRhcmdldCBhcyBvYmplY3QpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIGlmICghdGhpcy5faGFzV2FybmVkICYmIHBhdGgubGVuZ3RoID4gUFJPWFlfREVQVEhfV0FSTklOR19MSU1JVCkge1xuICAgICAgICB0aGlzLl9oYXNXYXJuZWQgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLndhcm4oYFxuW1N0YXRlXSBEZWVwbHkgbmVzdGVkIGxpdmUgc3RhdGUgYWNjZXNzIG1heSBoYXZlIHBlcmZvcm1hbmNlIGltcGFjdHMuIEZvciBkZWVwbHlcbm5lc3RlZCBvciBjb21wbGV4IHN0YXRlIHVwZGF0ZXMsIHVzZSAubXV0YXRlKCksIC5wYXRjaCgpLCBvciAudHJhbnNhY3Rpb24oKSBmb3Jcbm9wdGltYWwgcGVyZm9ybWFuY2UgKFdhcm5pbmcgd2hpbGUgZXZhbHVhdGluZyBsaXZlIGFjY2VzcyB0byAke3BhdGguam9pbihcIi5cIil9KVxuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBwcm94eSBhbmQgY2FjaGUgaXRcbiAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQgYXMgb2JqZWN0LCB7XG4gICAgICBnZXQ6IChvYmosIGtleTogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgIC8vIFN5bWJvbHMgLT4gRGlyZWN0IHJldHVyblxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgIHJldHVybiAob2JqIGFzIGFueSlba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKG9iaiBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgLy8gRm9yIEFycmF5cywgTWFwcywgYW5kIFNldHMsIGhhbmRsZSBtdXRhdG9yIGZ1bmN0aW9ucyBjb3JyZWN0bHlcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChvYmogaW5zdGFuY2VvZiBTZXQgfHwgb2JqIGluc3RhbmNlb2YgTWFwIHx8IEFycmF5LmlzQXJyYXkob2JqKSkgJiZcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtdXRhdGlvbkZucyA9IEFycmF5LmlzQXJyYXkob2JqKVxuICAgICAgICAgICAgPyBBcnJheU11dGF0b3JGdW5jdGlvbnNcbiAgICAgICAgICAgIDogRGF0YVN0cnVjdHVyZU11dGF0b3JGdW5jdGlvbnM7XG4gICAgICAgICAgY29uc3QgaXNNdXRhdGlvbiA9IG11dGF0aW9uRm5zLmhhcyhrZXkpO1xuXG4gICAgICAgICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnNuYXBzaG90KCk7XG5cbiAgICAgICAgICAgIGxldCBjdXJyZW50OiBhbnkgPSBzbmFwc2hvdDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIHBhdGgpIHtcbiAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IChjdXJyZW50IGFzIGFueSlba2V5XSguLi5hcmdzKTtcblxuICAgICAgICAgICAgaWYgKGlzTXV0YXRpb24pIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZShzbmFwc2hvdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9iamVjdHMgLT4gcmVjdXJzaXZlbHkgY3JlYXRlIGEgcHJveHlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVQcm94eSh2YWx1ZSwgWy4uLnBhdGgsIGtleV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJpbWl0aXZlcyAtPiBSZXR1cm4gdmFsdWVcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSxcblxuICAgICAgc2V0OiAoX29iaiwga2V5OiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gUmVqZWN0IGlmIGN1cnJlbnRseSBsb2NrZWRcbiAgICAgICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FsbG93IHNldHRpbmcgc3ltYm9sIHByb3BlcnRpZXMgb24gdGFyZ2V0IGRhdGEgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBhbmQgdXBkYXRlIHRoZSBwYXRoIHdpdGggdGhlIHZhbHVlXG4gICAgICAgIGNvbnN0IG5ld1BhdGggPSBbLi4ucGF0aCwga2V5XTtcbiAgICAgICAgdGhpcy5fc2V0TmVzdGVkKG5ld1BhdGgsIHRoaXMuX3Vud3JhcFByb3h5KHZhbHVlKSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICBoYXM6IChvYmosIGtleTogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gb2JqO1xuICAgICAgfSxcblxuICAgICAgb3duS2V5czogKG9iaikgPT4ge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKG9iaik7XG4gICAgICB9LFxuXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IChvYmosIGtleTogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KTtcblxuICAgICAgICBpZiAoZGVzYykge1xuICAgICAgICAgIGRlc2MuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjO1xuICAgICAgfSxcblxuICAgICAgZGVsZXRlUHJvcGVydHk6IChvYmosIGtleSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiB8fCAhKGtleSBpbiBvYmopKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBhbmQgdXBkYXRlIHRoZSBwYXRoIHdpdGggdGhlIHZhbHVlXG4gICAgICAgIGNvbnN0IG5ld1BhdGggPSBbLi4ucGF0aCwga2V5XTtcblxuICAgICAgICB0aGlzLl9zZXROZXN0ZWQobmV3UGF0aCwgdW5kZWZpbmVkKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfSkgYXMgVDtcblxuICAgIHRoaXMuX3Byb3h5Q2FjaGUuc2V0KHRhcmdldCBhcyBvYmplY3QsIHByb3h5KTtcbiAgICB0aGlzLl9yZXZlcnNlUHJveHlDYWNoZS5zZXQocHJveHkgYXMgb2JqZWN0LCB0YXJnZXQgYXMgb2JqZWN0KTtcbiAgICByZXR1cm4gcHJveHk7XG4gIH1cblxuICBwcml2YXRlIF91bndyYXBQcm94eTxUPih2YWx1ZTogVCk6IFQge1xuICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGZvciBwcmltaXRpdmVzXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgb25lIG9mIG91ciBwcm94aWVzXG4gICAgY29uc3QgcmF3VGFyZ2V0ID0gdGhpcy5fcmV2ZXJzZVByb3h5Q2FjaGUuZ2V0KHZhbHVlIGFzIG9iamVjdCk7XG4gICAgaWYgKHJhd1RhcmdldCkge1xuICAgICAgcmV0dXJuIHJhd1RhcmdldCBhcyBUO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHRoaXMuX3Vud3JhcFByb3h5KGl0ZW0pKSBhcyBUO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwbGFpbiBvYmplY3RzXG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgIGNvbnN0IHVud3JhcHBlZDogYW55ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoT2JqZWN0Lmhhc093bih2YWx1ZSwga2V5KSkge1xuICAgICAgICAgIHVud3JhcHBlZFtrZXldID0gdGhpcy5fdW53cmFwUHJveHkoKHZhbHVlIGFzIGFueSlba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1bndyYXBwZWQ7XG4gICAgfVxuXG4gICAgLy8gT3RoZXIgb2JqZWN0cyAoRGF0ZSwgTWFwLCBTZXQsIGV0Yy4pIHBhc3MgdGhyb3VnaFxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2V0dGluZyBuZXN0ZWQgdmFsdWVzIGFuZCBlbWl0dGluZyB1cGRhdGVkIGRhdGEgaWYgdGhlIHZhbHVlIGNoYW5nZWRcbiAgICovXG4gIHByaXZhdGUgX3NldE5lc3RlZChwYXRoOiBzdHJpbmdbXSwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIC8vIE5vdGhpbmcgdG8gZG8gd2l0aCBlbXB0eSBwYXRoc1xuICAgIGlmICghcGF0aC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBhdCB0aGUgcm9vdCBhbmQgc2VlayB0byB0aGUgdmFsdWUgYmVpbmcgc2V0XG4gICAgbGV0IGN1cnJlbnQ6IGFueSA9IHRoaXMuX2RhdGE7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBwYXRoW2ldID8/IFwiXCI7XG4gICAgICBpZiAoIShrZXkgaW4gY3VycmVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQUxJRF9TVEFURV9LRVksIHBhdGguam9pbihcIi5cIikpO1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbEtleSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXSA/PyBcIlwiO1xuICAgIGlmICghKGZpbmFsS2V5IGluIGN1cnJlbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBTElEX1NUQVRFX0tFWSwgcGF0aC5qb2luKFwiLlwiKSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGFuZCBlbWl0IG9ubHkgaWYgdGhlIHZhbHVlIGlzIGRpZmZlcmVudC4gT3RoZXJ3aXNlIG5vLW9wLlxuICAgIGlmIChjdXJyZW50W2ZpbmFsS2V5XSAhPT0gdmFsdWUgJiYgIU9iamVjdC5pcyhjdXJyZW50W2ZpbmFsS2V5XSwgdmFsdWUpKSB7XG4gICAgICBjdXJyZW50W2ZpbmFsS2V5XSA9IHZhbHVlO1xuICAgICAgdGhpcy5fZW1pdCh0aGlzLmN1cnJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGFuIGluY29taW5nIHBhcnRpYWwgc3RhdGUgYW5kIGVtaXQgdXBkYXRlcyB0byBsaXN0ZW5lcnMgaWYgdGhlcmVcbiAgICogYXJlIGFueSBjaGFuZ2VzIGRldGVjdGVkLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBPYmplY3QuaXMoKSB0byBjaGVjayBmb3IgZGlmZmVyZW5jZXMuIERvZXMgbm90IGF0dGVtcHQgZGVlcCBkaWZmaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfcHJvY2Vzc0luY29taW5nU3RhdGUgPSAoaW5jb21pbmdTdGF0ZTogUGFydGlhbDxTaGFwZT4pOiB2b2lkID0+IHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgaW5jb21pbmdTdGF0ZSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgaW5jb21pbmdTdGF0ZSA9PT0gbnVsbCB8fFxuICAgICAgQXJyYXkuaXNBcnJheShpbmNvbWluZ1N0YXRlKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfVVBEQVRFLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShpbmNvbWluZ1N0YXRlKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBpZiBhbnkga2V5L3ZhbHVlIHBhaXIgb24gdGhlIGluY29taW5nIHN0YXRlIGRpZmZlcnMgZnJvbSB0aGVcbiAgICAvLyBleGlzdGluZyBkYXRhXG4gICAgZm9yIChjb25zdCBba2V5LCBuZXdWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5jb21pbmdTdGF0ZSkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuX2RhdGFba2V5IGFzIGtleW9mIFNoYXBlXTtcbiAgICAgIGlmICghT2JqZWN0LmlzKGN1cnJlbnRWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICAodGhpcy5fZGF0YSBhcyBhbnkpW2tleV0gPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgdGhpcy5fZW1pdCh0aGlzLl9kYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEVtaXQgdGhlIGN1cnJlbnQgc3RhdGUgdG8gYWxsIGxpc3RlbmVyc1xuICAgKi9cbiAgcHJpdmF0ZSBfZW1pdCA9IChkYXRhOiBTaGFwZSk6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICBsaXN0ZW5lcihkYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHN0YXRlXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgaXMgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCBzdGF0ZS4gSXQgaXMgbWFya2VkIGFzIFJlYWRvbmx5XG4gICAqIHRvIGhlbHAgcHJldmVudCBhY2NpZGVudGFsIGNoYW5nZXMuIE5ldmVyIGVkaXQgdGhpcyB2YWx1ZSBkaXJlY3RseS5cbiAgICovXG4gIGdldCBjdXJyZW50KCk6IFJlYWRvbmx5PFNoYXBlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogUHJveGllZCBhY2Nlc3MgdG8gc3RhdGUgcHJvcGVydGllcyB3aXRoIGF1dG9tYXRpYyByZWNvbmNpbGlhdGlvbi5cbiAgICpcbiAgICogQWxsb3dzIGRpcmVjdCBwcm9wZXJ0eSBhY2Nlc3MgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZyBzdGF0ZSB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIERlZXAgcmVhY3Rpdml0eSB3aXRoIHRoZSBgLmxpdmVgIGFjY2Vzc29yXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdGUgPSBuZXcgU3RhdGUoe1xuICAgKiAgIG5lc3RlZDoge1xuICAgKiAgICAgdmFsdWVzOiBbMSwgMiwgM10sXG4gICAqICAgfVxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gRGVlcCB2YWx1ZSBhc3NpZ25tZW50IHRyaWdnZXJzIHN0YXRlIHVwZGF0ZXNcbiAgICogc3RhdGUubGl2ZS5uZXN0ZWQudmFsdWVzWzFdID0gNTtcbiAgICpcbiAgICogLy8gQXJyYXkgbXV0YXRvcnMgYXJlIGF1dG9tYXRpY2FsbHkgcmVhY3RpdmUgYXMgd2VsbFxuICAgKiBzdGF0ZS5saXZlLm5lc3RlZC52YWx1ZXMucHVzaCg0KTtcbiAgICogc3RhdGUubGl2ZS5uZXN0ZWQudmFsdWVzLnJldmVyc2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXQgbGl2ZSgpOiBTaGFwZSB7XG4gICAgaWYgKCF0aGlzLl9wcm94eSkge1xuICAgICAgdGhpcy5fcHJveHkgPSB0aGlzLl9jcmVhdGVQcm94eSh0aGlzLl9kYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Byb3h5O1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGlzIHN0YXRlIGlzIGN1cnJlbnRseSBsb2NrZWQgKHRydWUpIG9yIG5vdCAoZmFsc2UpXG4gICAqL1xuICBnZXQgaXNMb2NrZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTG9ja2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHdoZW4gdGhpcyBzdGF0ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBMaXN0ZW5lcnMgYXJlIGludm9rZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHJlZ2lzdGVyZWQgYW5kIGFyZSBwYXNzZWQgYVxuICAgKiByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsbHkgbWFuYWdlZCBzdGF0ZSBvYmplY3QgYXMgYSByZWFkb25seSBvYmplY3QuXG4gICAqXG4gICAqICoqRG8gbm90IG1vZGlmeSBzdGF0ZSB2YWx1ZXMgZGlyZWN0bHkqKi4gSW5zdGVhZCwgdXNlIHtAbGluayBzZXR9IG9yXG4gICAqIHtAbGluayBwYXRjaH0gdG8gbWFrZSBpbW11dGFibGUgdXBkYXRlcy5cbiAgICovXG4gIGFkZExpc3RlbmVyID0gKGxpc3RlbmVyOiBTdGF0ZUxpc3RlbmVyPFNoYXBlPik6IHZvaWQgPT4ge1xuICAgIHRoaXMuX2xpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgc3RhdGUgaGFuZGxlclxuICAgKi9cbiAgcmVtb3ZlTGlzdGVuZXIgPSAobGlzdGVuZXI6IFN0YXRlTGlzdGVuZXI8U2hhcGU+KTogdm9pZCA9PiB7XG4gICAgdGhpcy5fbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZSB2YWx1ZSBmcm9tIHRoZSBzdGF0ZSBvYmplY3RcbiAgICpcbiAgICogVGhlIHZhbHVlIGlzIHJldHVybmVkIGFzIFJlYWRvbmx5IHRvIHByZXZlbnQgYWNjaWRlbnRhbCBzdGF0ZSBtdXRhdGlvbnMuXG4gICAqIFRvIG11dGF0ZSBzdGF0ZWZ1bCBwcm9wZXJ0aWVzLCB1c2Uge0BsaW5rIHNldH0gb3Ige0BsaW5rIHBhdGNofSBpbnN0ZWFkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRlID0gbmV3IFN0YXRlKHsgY291bnQ6IDEgfSk7XG4gICAqIGNvbnNvbGUubG9nKHN0YXRlLmdldChcImNvdW50XCIpKTsgLy8gMVxuICAgKiBgYGBcbiAgICpcbiAgICovXG4gIGdldCA9IDxLIGV4dGVuZHMga2V5b2YgU2hhcGU+KGtleTogSyk6IFJlYWRvbmx5PFNoYXBlW0tdPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFba2V5XSBhcyBSZWFkb25seTxTaGFwZVtLXT47XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkZWVwIGNsb25lIG9mIHRoZSBjdXJyZW50IHN0YXRlIGRhdGEgdXNpbmcgYHN0cnVjdHVyZWRDbG9uZSgpYCB0b1xuICAgKiBtYWtlIHRoZSBjb3B5LlxuICAgKlxuICAgKiBUaGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbiBjYW4gYmUgZWRpdGVkIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZVxuICAgKiBhY3R1YWwgaW50ZXJuYWwgc3RhdGUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc25hcCA9IHN0YXRlLnNuYXBzaG90KCk7XG4gICAqIHNuYXAuY291bnQgKz0gMTtcbiAgICogc3RhdGUucGF0Y2goc25hcCk7XG4gICAqIGBgYFxuICAgKi9cbiAgc25hcHNob3QgPSAoKTogU2hhcGUgPT4ge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5fZGF0YSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBhIHNpbmdsZSBzdGF0ZWZ1bCBwcm9wZXJ0eSB3aGlsZSBsZWF2aW5nIG90aGVyIHByb3BlcnRpZXMgdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBUcmlnZ2VycyBhbiB1cGRhdGUgdG8gYWxsIGxpc3RlbmVycyBpZiB0aGUgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gYmVmb3JlXG4gICAqIHdoZW4gY29tcGFyZWQgdXNpbmcgc2hhbGxvdyBlcXVhbGl0eS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0ZSA9IG5ldyBTdGF0ZSh7IGNvdW50OiAxLCBjb2xvcjogXCJyZWRcIiB9KTtcbiAgICogc3RhdGUuc2V0KFwiY291bnRcIiwgMik7IC8vIFN0YXRlIGlzIG5vdyB7IGNvdW50OiAyLCBjb2xvcjogXCJyZWRcIiB9XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0ID0gPEsgZXh0ZW5kcyBrZXlvZiBTaGFwZT4oa2V5OiBLLCB2YWx1ZTogU2hhcGVbS10pOiB2b2lkID0+IHtcbiAgICAvLyBSZWplY3QgaWYgY3VycmVudGx5IGxvY2tlZFxuICAgIGlmICh0aGlzLl9pc0xvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aWFsOiBQYXJ0aWFsPFNoYXBlPiA9IHt9O1xuICAgIHBhcnRpYWxba2V5XSA9IHZhbHVlO1xuXG4gICAgdGhpcy5fcHJvY2Vzc0luY29taW5nU3RhdGUocGFydGlhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBtdWx0aXBsZSBzdGF0ZWZ1bCBwcm9wZXJ0aWVzIGF0IG9uY2UsIGxlYXZpbmcgb21pdHRlZCBwcm9wZXJ0aWVzXG4gICAqIHVuY2hhbmdlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogUGF0Y2ggYSBwYXJ0aWFsIHN0YXRlLCB1cGRhdGluZyBhbGwgbGlzdGVkIHByb3BlcnRpZXMgYXQgb25jZVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRlID0gbmV3IFN0YXRlKHtcbiAgICogICB3ZWF0aGVyOiBcInN1bm55XCIsXG4gICAqICAgdGVtcGVyYXR1cmU6IDMwLFxuICAgKiAgIGh1bWlkaXR5OiA3MCxcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIExlYXZlcyBgdGVtcGVyYXR1cmVgIHVuY2hhbmdlZFxuICAgKiBzdGF0ZS5wYXRjaCh7XG4gICAqICAgd2VhdGhlcjogXCJjbG91ZHlcIixcbiAgICogICBodW1pZGl0eTogNTAsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHBhdGNoID0gKHBhdGNoOiBQYXJ0aWFsPFNoYXBlPik6IFN0YXRlPFNoYXBlPiA9PiB7XG4gICAgLy8gUmVqZWN0IGlmIGN1cnJlbnRseSBsb2NrZWRcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvY2Vzc0luY29taW5nU3RhdGUocGF0Y2gpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGdWxseSByZXBsYWNlIHRoZSBjdXJyZW50IHN0YXRlIGRhdGEgYW5kIGZvcmNlIGxpc3RlbmVycyB0byByZWNlaXZlIHRoZVxuICAgKiB1cGRhdGVkIGRhdGEgaW1tZWRpYXRlbHkuXG4gICAqL1xuICByZXBsYWNlID0gKHN0YXRlOiBTaGFwZSk6IFN0YXRlPFNoYXBlPiA9PiB7XG4gICAgLy8gUmVqZWN0IGlmIGN1cnJlbnRseSBsb2NrZWRcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0YSA9IHN0YXRlO1xuICAgIHRoaXMuX2VtaXQodGhpcy5fZGF0YSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIExvY2sgdGhpcyBTdGF0ZSBpbnN0YW5jZSwgcHJldmVudGluZyBmdXJ0aGVyIGV4dGVybmFsIGNoYW5nZXNcbiAgICovXG4gIGxvY2sgPSAoKTogU3RhdGU8U2hhcGU+ID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgdGhpcy5faXNMb2NrZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVbmxvY2sgdGhpcyBTdGF0ZSBpbnN0YW5jZSwgYWxsb3dpbmcgZnVydGhlciBleHRlcm5hbCBjaGFuZ2VzXG4gICAqL1xuICB1bmxvY2sgPSAoKTogU3RhdGU8U2hhcGU+ID0+IHtcbiAgICB0aGlzLl9pc0xvY2tlZCA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBcHBseSBjb21wbGV4IHVwZGF0ZXMgdG8gdGhlIHN0YXRlIHVzaW5nIGEgbXV0YXRvciBmdW5jdGlvbi5cbiAgICpcbiAgICogVGhlIG11dGF0b3IgZnVuY3Rpb24gdGFrZXMgb25lIHBhcmFtZXRlciB3aGljaCBpcyBhIHN0cnVjdHVyZWRDbG9uZSBjb3B5IG9mXG4gICAqIHRoZSBjdXJyZW50IHN0YXRlIG9iamVjdC4gV2hhdGV2ZXIgaXMgcmV0dXJuZWQgYnkgdGhlIG11dGF0b3IgaXMgdGhlblxuICAgKiBwYXRjaGVkIGluIHRvIHRoZSBzdGF0ZS5cbiAgICovXG4gIG11dGF0ZSA9IChtdXRhdG9yOiAoY3VycmVudDogU2hhcGUpID0+IFNoYXBlKTogU3RhdGU8U2hhcGU+ID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvY2Vzc0luY29taW5nU3RhdGUobXV0YXRvcih0aGlzLnNuYXBzaG90KCkpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUGVyZm9ybSBhbiBhc3luYyBtdXRhdGlvbiBvZiB0aGUgc3RhdGUsIG9wdGlvbmFsbHkgbG9ja2luZyB0aGUgc3RhdGUgZHVyaW5nXG4gICAqIHRoZSBwcm9jZXNzLlxuICAgKiBAcGFyYW0gbXV0YXRvciBBIGZ1bmN0aW9uIHRvIG11dGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXcgc3RhdGVcbiAgICogQHBhcmFtIGxvY2sgSWYgYHRydWVgLCBsb2NrIHRoZSBzdGF0ZSB1bnRpbCB0aGUgbXV0YXRvciBjb21wbGV0ZXNcbiAgICovXG4gIG11dGF0ZUFzeW5jID0gYXN5bmMgKFxuICAgIG11dGF0b3I6IChjdXJyZW50OiBTaGFwZSkgPT4gUHJvbWlzZTxTaGFwZT4sXG4gICAgbG9jayA9IGZhbHNlLFxuICApOiBQcm9taXNlPFN0YXRlPFNoYXBlPj4gPT4ge1xuICAgIGlmICh0aGlzLl9pc0xvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICB9XG5cbiAgICBpZiAobG9jaykge1xuICAgICAgdGhpcy5faXNMb2NrZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG11dGF0aW9uUmVzdWx0ID0gYXdhaXQgbXV0YXRvcih0aGlzLnNuYXBzaG90KCkpO1xuICAgIHRoaXMuX3Byb2Nlc3NJbmNvbWluZ1N0YXRlKG11dGF0aW9uUmVzdWx0KTtcblxuICAgIGlmIChsb2NrKSB7XG4gICAgICB0aGlzLl9pc0xvY2tlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgdHJhbnNhY3Rpb24tc3R5bGUgc2V0IG9mIGFjdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBmdW5jdGlvbi5cbiAgICpcbiAgICogVGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGNhbiBkbyBhbnl0aGluZywgYmV5b25kIGp1c3Qgc2V0dGluZyBzdGF0ZS4gQW55XG4gICAqIHVuY2F1Z2h0IGVycm9ycyB0aHJvd24gZnJvbSB3aXRoaW4gdGhlIGZ1bmN0aW9uIHdpbGwgY2F1c2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIHRvIGZhaWwgYW5kIHRoZSBzdGF0ZSB0byBhdXRvbWF0aWNhbGx5IHJvbGwgYmFjayB0byB0aGUgbGFzdCB2YWxpZCBzdGF0ZS5cbiAgICpcbiAgICogRHVyaW5nIGEgdHJhbnNhY3Rpb24sIHRoaXMgc3RhdGUgaW5zdGFuY2Ugd2lsbCBiZSBsb2NrZWQsIHByZXZlbnRpbmcgb3RoZXJcbiAgICogY2hhbmdlcy5cbiAgICpcbiAgICogVHJhbnNhY3Rpb25zIHdpbGwgYWx3YXlzIHJlc3VsdCBpbiBhIHN0YXRlIHVwZGF0ZSB3aGVuIHN1Y2Nlc3NmdWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIFRyYW5zYWN0aW9ucyB3aXRoIGxvY2tpbmcgYW5kIHJvbGxiYWNrIHN1cHBvcnRcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0ZSA9IG5ldyBTdGF0ZSh7Y291bnQ6IDF9KTtcbiAgICpcbiAgICogc3RhdGUudHJhbnNhY3Rpb24oYXN5bmMgKHMpID0+IHtcbiAgICogICAvLyBgc2AgaXMgYSBmdWxsIFN0YXRlIG9iamVjdCB5b3UgY2FuIHNhZmVseSBtYW5pcHVsYXRlXG4gICAqICAgcy5zZXQoXCJjb3VudFwiLCAxMCk7XG4gICAqIH0pO1xuICAgKiBzdGF0ZS5nZXQoXCJjb3VudFwiKTsgLy8gPT4gMTA7XG4gICAqXG4gICAqIC8vIEVycm9ycyBpbnNpZGUgdGhlIHRyYW5zYWN0aW9uIHJvbGwgYmFjayB0aGUgc3RhdGVcbiAgICogc3RhdGUudHJhbnNhY3Rpb24oYXN5bmMgKHMpID0+IHtcbiAgICogICBzLnNldChcImNvdW50XCIsIDEwMCk7XG4gICAqICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAqIH0pO1xuICAgKiBzdGF0ZS5nZXQoXCJjb3VudFwiKTsgLy8gPT4gMTA7XG4gICAqL1xuICB0cmFuc2FjdGlvbiA9IChmbjogKHN0YXRlOiBTdGF0ZTxTaGFwZT4pID0+IHZvaWQpOiBib29sZWFuID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgLy8gTG9jayBvdXRzaWRlIG9mIHRoZSB0cnkvY2F0Y2ggdG8gdGhyb3cgaW1tZWRpYXRlbHksIHNlcGFyYXRpbmcgdGhlXG4gICAgLy8gdHJhbnNhY3Rpb24gZnVuY3Rpb24gZXJyb3IgZnJvbSB0aGUgYWN0dWFsIGNhbGwgc2l0ZSBlcnJvcnNcbiAgICB0aGlzLl9pc0xvY2tlZCA9IHRydWU7XG5cbiAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IHN0YXRlIG9iamVjdCB0byB1c2Ugd2l0aGluIHRoZSB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25TdGF0ZSA9IG5ldyBTdGF0ZTxTaGFwZT4odGhpcy5zbmFwc2hvdCgpKTtcblxuICAgICAgLy8gUnVuIHRoZSB0cmFuc2FjdGlvbiBpdHNlbGZcbiAgICAgIGZuKHRyYW5zYWN0aW9uU3RhdGUpO1xuXG4gICAgICAvLyBBZG9wdCB0aGUgcmVzdWx0aW5nIHN0YXRlIG9mIHRoZSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZSh0cmFuc2FjdGlvblN0YXRlLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbU3RhdGVdIFRyYW5zYWN0aW9uIGZhaWxlZCBkdWUgdG8gY2F1Z2h0IGVycm9yXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNMb2NrZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfTtcblxuICAvKipcbiAgICogUGVyZm9ybSBhIHRyYW5zYWN0aW9uLXN0eWxlIHNldCBvZiBhY3Rpb25zIGRlZmluZWQgd2l0aGluIGFuIGFzeW5jIGZ1bmN0aW9uXG4gICAqXG4gICAqIFRoZSBwcm92aWRlZCBmdW5jdGlvbiBjYW4gZG8gYW55dGhpbmcsIGJleW9uZCBqdXN0IHNldHRpbmcgc3RhdGUuIEFueVxuICAgKiB1bmNhdWdodCBlcnJvcnMgdGhyb3duIGZyb20gd2l0aGluIHRoZSBmdW5jdGlvbiB3aWxsIGNhdXNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiB0byBmYWlsIGFuZCB0aGUgc3RhdGUgdG8gYXV0b21hdGljYWxseSByb2xsIGJhY2sgdG8gdGhlIGxhc3QgdmFsaWQgc3RhdGUuXG4gICAqXG4gICAqIER1cmluZyBhIHRyYW5zYWN0aW9uLCB0aGlzIHN0YXRlIGluc3RhbmNlIHdpbGwgYmUgbG9ja2VkLCBwcmV2ZW50aW5nIG90aGVyXG4gICAqIGNoYW5nZXMuXG4gICAqXG4gICAqIFRyYW5zYWN0aW9ucyB3aWxsIGFsd2F5cyByZXN1bHQgaW4gYSBzdGF0ZSB1cGRhdGUgd2hlbiBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBUcmFuc2FjdGlvbnMgd2l0aCBsb2NraW5nIGFuZCByb2xsYmFjayBzdXBwb3J0XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdGUgPSBuZXcgU3RhdGUoe2NvdW50OiAxfSk7XG4gICAqXG4gICAqIC8vIEF3YWl0aW5nIHRoZSByZXN1bHQgb2YgYSB0cmFuc2FjdGlvblxuICAgKiBhd2FpdCBzdGF0ZS50cmFuc2FjdGlvbkFzeW5jKGFzeW5jIChzKSA9PiB7XG4gICAqICAgLy8gYHNgIGlzIGEgZnVsbCBTdGF0ZSBvYmplY3QgeW91IGNhbiBzYWZlbHkgbWFuaXB1bGF0ZVxuICAgKiAgIHMuc2V0KFwiY291bnRcIiwgMTApO1xuICAgKiB9KTtcbiAgICogc3RhdGUuZ2V0KFwiY291bnRcIik7IC8vID0+IDEwO1xuICAgKlxuICAgKiAvLyBFcnJvcnMgaW5zaWRlIHRoZSB0cmFuc2FjdGlvbiByb2xsIGJhY2sgdGhlIHN0YXRlXG4gICAqIGF3YWl0IHN0YXRlLnRyYW5zYWN0aW9uQXN5bmMoYXN5bmMgKHMpID0+IHtcbiAgICogICBzLnNldChcImNvdW50XCIsIDEwMCk7XG4gICAqICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAqIH0pO1xuICAgKiBzdGF0ZS5nZXQoXCJjb3VudFwiKTsgLy8gPT4gMTA7XG4gICAqXG4gICAqIC8vIElmIHlvdSBmb3JnZXQgdG8gYXdhaXQgdGhlIHRyYW5zYWN0aW9uLCBpdHMgc3RpbGwgbG9ja2VkXG4gICAqIHN0YXRlLnRyYW5zYWN0aW9uQXN5bmMoYXN5bmMgKHMpID0+IHtcbiAgICogICBhd2FpdCB3YWl0U2Vjb25kcygxKTtcbiAgICogfSk7XG4gICAqIHN0YXRlLnNldChcImNvdW50XCIsIDEpOyAvLyBFcnJvcjogU3RhdGUgaXMgbG9ja2VkIVxuICAgKiBgYGBcbiAgICovXG4gIHRyYW5zYWN0aW9uQXN5bmMgPSBhc3luYyAoXG4gICAgZm46IChzdGF0ZTogU3RhdGU8U2hhcGU+KSA9PiBQcm9taXNlPHZvaWQ+LFxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgLy8gTG9jayBvdXRzaWRlIG9mIHRoZSB0cnkvY2F0Y2ggdG8gdGhyb3cgaW1tZWRpYXRlbHksIHNlcGFyYXRpbmcgdGhlXG4gICAgLy8gdHJhbnNhY3Rpb24gZnVuY3Rpb24gZXJyb3IgZnJvbSB0aGUgYWN0dWFsIGNhbGwgc2l0ZSBlcnJvcnNcbiAgICB0aGlzLl9pc0xvY2tlZCA9IHRydWU7XG5cbiAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IHN0YXRlIG9iamVjdCB0byB1c2Ugd2l0aGluIHRoZSB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25TdGF0ZSA9IG5ldyBTdGF0ZTxTaGFwZT4odGhpcy5zbmFwc2hvdCgpKTtcblxuICAgICAgLy8gUnVuIHRoZSB0cmFuc2FjdGlvbiBpdHNlbGZcbiAgICAgIGF3YWl0IGZuKHRyYW5zYWN0aW9uU3RhdGUpO1xuXG4gICAgICAvLyBBZG9wdCB0aGUgcmVzdWx0aW5nIHN0YXRlIG9mIHRoZSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZSh0cmFuc2FjdGlvblN0YXRlLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbU3RhdGVdIFRyYW5zYWN0aW9uIGZhaWxlZCBkdWUgdG8gY2F1Z2h0IGVycm9yXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNMb2NrZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgQ2hhckNvZGVzIH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQgdHlwZSB7IFBhcnNlZE5vdGF0aW9uIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBDaGVjayBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBtYXRjaGVzIHRoZSBcImJvdW5kIGF0dHJpYnV0ZVwiIHN5bnRheFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpc0JvdW5kQXR0cmlidXRlKFwiOmNsYXNzXCIpIC8vIHRydWVcbiAqIGlzQm91bmRBdHRyaWJ1dGUoXCI6OmNsYXNzXCIpIC8vIGZhbHNlXG4gKiBpc0JvdW5kQXR0cmlidXRlKFwiY2xhc3NcIikgLy8gZmFsc2VcbiAqIGBgYFxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIGZ1bmN0aW9uIHVzZXMgbG9vcHMgYW5kIGNoYXJhY3RlciBjb2RlIGNoZWNrcyBpbnN0ZWFkIG9mIGEgcmVnZXggdG9cbiAqIG9wdGltaXplIGZvciBob3QgcGF0aHMgZHVyaW5nIGluaXRpYWwgcGFyc2luZyBhbmQgcmVuZGVyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCb3VuZEF0dHJpYnV0ZShhdHRyTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChhdHRyTmFtZVswXSAhPT0gXCI6XCIgfHwgYXR0ck5hbWUubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYXR0ck5hbWUubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBFbnN1cmUgdGhlIGNoYXJhY3RlciBjb2RlIGlzIGEgbGV0dGVyIG9yIGh5cGhlblxuICAgIGNvbnN0IGNoYXIgPSBhdHRyTmFtZS5jaGFyQ29kZUF0KGkpO1xuXG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgY2hhciA9PT0gQ2hhckNvZGVzLkh5cGhlbiB8fFxuICAgICAgICAoY2hhciA+PSBDaGFyQ29kZXMuQSAmJiBjaGFyIDw9IENoYXJDb2Rlcy5aKSB8fFxuICAgICAgICAoY2hhciA+PSBDaGFyQ29kZXMuYSAmJiBjaGFyIDw9IENoYXJDb2Rlcy56KVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBlbnVtIE5vdGF0aW9uUHJlZml4IHtcbiAgQXR0cmlidXRlcyA9IFwiQFwiLFxuICBTdGF0ZSA9IFwiJFwiLFxuICBEYXRhID0gXCIqXCIsXG4gIEl0ZW0gPSBcIiNcIixcbn1cblxuY29uc3QgUFJFRklYX01BUFBJTkc6IFJlY29yZDxOb3RhdGlvblByZWZpeCwgc3RyaW5nPiA9IHtcbiAgW05vdGF0aW9uUHJlZml4LkF0dHJpYnV0ZXNdOiBcImF0dHJcIixcbiAgW05vdGF0aW9uUHJlZml4LlN0YXRlXTogXCJzdGF0ZVwiLFxuICBbTm90YXRpb25QcmVmaXguRGF0YV06IFwiZGF0YVwiLFxuICBbTm90YXRpb25QcmVmaXguSXRlbV06IFwiaXRlbVwiLFxufTtcblxuY29uc3QgcHJlZml4TWFwcGluZyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoUFJFRklYX01BUFBJTkcpKTtcblxuLyoqXG4gKiBQYXJzZSBhIG5vdGF0aW9uIGludG8gYW4gb2JqZWN0IHdpdGggcnVudGltZSBpbmZvcm1hdGlvblxuICpcbiAqIEByZW1hcmtzXG4gKiBGb3VyIG5vdGF0aW9ucyBhcmUgc3VwcG9ydGVkOlxuICpcbiAqIC0gYEBhdHRybmFtZWAgLT4gUm9vdCBlbGVtZW50IGF0dHJpYnV0ZXNcbiAqIC0gYCRzdGF0ZXZhbHVlYCAtPiBTdGF0ZWZ1bCBjb250ZW50XG4gKiAtIGAqcHJvcGVydHkub3Iud2hhdGV2ZXJgIC0+IENvbXB1dGVkIGRhdGEgcHJvcGVydGllc1xuICogLSBgI2NvbG9yYCAtPiBMaXN0IGl0ZW0gcHJvcGVydGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VOb3RhdGlvbihub3RhdGlvbjogc3RyaW5nKTogUGFyc2VkTm90YXRpb24ge1xuICAvLyBDaGVjayBmb3IgcHJlZml4IG1vZGlmaWVyc1xuICBsZXQgbm90TW9kaWZpZXIgPSBmYWxzZTtcblxuICBsZXQgcGF0aFBhcnQgPSBcIlwiO1xuICBjb25zdCBjb21wdXRlZFBhdGg6IHN0cmluZ1tdID0gW107XG5cbiAgbGV0IGlzRmlyc3QgPSB0cnVlO1xuICBmb3IgKGNvbnN0IGNoYXIgb2Ygbm90YXRpb24pIHtcbiAgICAvLyAhIGF0IHBvc2l0aW9uIDAgLT4gRW5hYmxlIE5PVCBtb2RpZmllciwgZG9udCBjb3VudCB0b3dhcmRzIGlkeFxuICAgIGlmIChpc0ZpcnN0ICYmIGNoYXIgPT09IFwiIVwiKSB7XG4gICAgICBub3RNb2RpZmllciA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlLCBwb3NpdGlvbiAwIG11c3QgYmUgYSBwcmVmaXhcbiAgICBlbHNlIGlmIChpc0ZpcnN0KSB7XG4gICAgICBjb25zdCBwcmVmaXggPSBwcmVmaXhNYXBwaW5nLmdldChjaGFyKTtcblxuICAgICAgaWYgKCFwcmVmaXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTiwgbm90YXRpb24pO1xuICAgICAgfVxuXG4gICAgICBjb21wdXRlZFBhdGgucHVzaChwcmVmaXgpO1xuICAgICAgaXNGaXJzdCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENvbGxlY3QgY2hhcmFjdGVycyBhbmQgcHVzaCB3aGVuIGhpdHRpbmcgYSBkb3Qgb3IgZW5kXG4gICAgZWxzZSBpZiAoY2hhciA9PT0gXCIuXCIpIHtcbiAgICAgIGlmIChwYXRoUGFydC5sZW5ndGgpIHtcbiAgICAgICAgY29tcHV0ZWRQYXRoLnB1c2gocGF0aFBhcnQpO1xuICAgICAgICBwYXRoUGFydCA9IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OLCBub3RhdGlvbik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGhQYXJ0ICs9IGNoYXI7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIHRoZSBmaW5hbCBwYXJ0IHdoaWNoIG11c3QgZXhpc3QgKG90aGVyd2lzZSwgaXQgZW5kZWQgaW4gYSBkb3QpXG4gIGlmICghcGF0aFBhcnQubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTiwgbm90YXRpb24pO1xuICB9XG5cbiAgY29tcHV0ZWRQYXRoLnB1c2gocGF0aFBhcnQpO1xuXG4gIGlmIChjb21wdXRlZFBhdGgubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT04sIG5vdGF0aW9uKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmFzZTogbm90YXRpb24sXG4gICAgcGF0aDogY29tcHV0ZWRQYXRoLFxuICAgIG1vZGlmaWVyczogbm90TW9kaWZpZXIgPyB7IG5vdDogdHJ1ZSB9IDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG5leHBvcnQgdHlwZSBOb3RhdGlvbkFjY2Vzc29yID0gKHNvdXJjZTogdW5rbm93bikgPT4gdW5rbm93bjtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVmFsdWVBY2Nlc3Nvcihub3RhdGlvbjogUGFyc2VkTm90YXRpb24pOiBOb3RhdGlvbkFjY2Vzc29yIHtcbiAgY29uc3QgeyBwYXRoLCBtb2RpZmllcnMgfSA9IG5vdGF0aW9uO1xuXG4gIGlmIChwYXRoLmxlbmd0aCA8IDIpIHtcbiAgICAvLyBOb3RhdGlvbnMgbXVzdCBhbHdheXMgaGF2ZSBhdCBsZWFzdCAyIHBhcnRzOiB0aGUgbmFtZXNwYWNlLCBhbmQgYXQgbGVhc3RcbiAgICAvLyBvbmUgcHJvcGVydHkgbmFtZSBvbiB0aGUgbmFtZXNwYWNlIChleGFtcGxlOiBbXCJzdGF0ZVwiLCBcInZpc2libGVcIl0pXG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbiAgfVxuXG4gIC8vIEZvciAyIGFuZCAzIGxlbmd0aCBwYXRocywgcHJlLWJha2UgYWNjZXNzb3JzIHRvIG9wdGltaXplIGZvciBjb21tb24gY2FzZXNcbiAgaWYgKHBhdGgubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgW2ZpcnN0S2V5LCBzZWNvbmRLZXldID0gcGF0aDtcblxuICAgIGlmIChmaXJzdEtleSA9PT0gdW5kZWZpbmVkIHx8IHNlY29uZEtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlOiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IChzb3VyY2UgYXMgYW55KT8uW2ZpcnN0S2V5XT8uW3NlY29uZEtleV0gPz8gbnVsbDtcbiAgICAgIGlmIChtb2RpZmllcnM/Lm5vdCkge1xuICAgICAgICAvLyBBdHRyaWJ1dGUgdmFsdWVzIG11c3QgdHJlYXQgdGhlIGVtcHR5IHN0cmluZyBhcyB0cnV0aHkgcGVyIERPTSBydWxlc1xuICAgICAgICBpZiAoZmlyc3RLZXkgPT09IFwiYXR0clwiKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBcIlwiICYmICF2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMykge1xuICAgIGNvbnN0IFtmaXJzdEtleSwgc2Vjb25kS2V5LCB0aGlyZEtleV0gPSBwYXRoO1xuXG4gICAgaWYgKFxuICAgICAgZmlyc3RLZXkgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgc2Vjb25kS2V5ID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXJkS2V5ID09PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2U6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgKHNvdXJjZSBhcyBhbnkpPy5bZmlyc3RLZXldPy5bc2Vjb25kS2V5XT8uW3RoaXJkS2V5XSA/PyBudWxsO1xuICAgICAgaWYgKG1vZGlmaWVycz8ubm90KSB7XG4gICAgICAgIGlmIChmaXJzdEtleSA9PT0gXCJhdHRyXCIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUgIT09IFwiXCIgJiYgIXZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICF2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICB9XG5cbiAgLy8gRm9yIGxvbmdlciBwYXRocywgb3B0IGZvciBhIHByZS1idWlsdCBsb29wXG4gIHJldHVybiAoc291cmNlOiB1bmtub3duKSA9PiB7XG4gICAgbGV0IGN1cnJlbnQgPSBzb3VyY2U7XG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGF0aCkge1xuICAgICAgaWYgKCFjdXJyZW50IHx8IHR5cGVvZiBjdXJyZW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0IGFzIGtleW9mIHR5cGVvZiBjdXJyZW50XTtcbiAgICB9XG5cbiAgICBpZiAobW9kaWZpZXJzPy5ub3QpIHtcbiAgICAgIGlmIChwYXRoWzBdID09PSBcImF0dHJcIikge1xuICAgICAgICByZXR1cm4gY3VycmVudCAhPT0gXCJcIiAmJiAhY3VycmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhY3VycmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IGh0bWxUb0ZyYWdtZW50IH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQge1xuICBidWlsZFZhbHVlQWNjZXNzb3IsXG4gIGlzQm91bmRBdHRyaWJ1dGUsXG4gIHR5cGUgTm90YXRpb25BY2Nlc3NvcixcbiAgcGFyc2VOb3RhdGlvbixcbn0gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQge1xuICB0eXBlIEFueVJlbmRlclBsYW4sXG4gIHR5cGUgQW55U2NoZW1lLFxuICB0eXBlIEF0dHJpYnV0ZVVwZGF0ZVBsYW4sXG4gIHR5cGUgQXR0cmlidXRlVXBkYXRlU2NoZW1lLFxuICB0eXBlIENvbXBpbGVkVGVtcGxhdGUsXG4gIHR5cGUgQ29udGVudFN3YXBQbGFuLFxuICB0eXBlIENvbnRlbnRTd2FwU2NoZW1lLFxuICBEaXJlY3RpdmUsXG4gIHR5cGUgTGlzdFJlbmRlclBsYW4sXG4gIHR5cGUgTGlzdFJlbmRlclNjaGVtZSxcbiAgdHlwZSBQYXJzZWROb3RhdGlvbixcbiAgdHlwZSBQcmVwYXJlZFRlbXBsYXRlLFxuICB0eXBlIFRhZ0NoYW5nZVBsYW4sXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IFJFRl9BVFRSID0gXCJkYXRhLW5vZGUtcmVmXCI7XG5cbmZ1bmN0aW9uIGNvbGxlY3RPcGVyYWJsZU5vZGVzKGZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KTogSFRNTEVsZW1lbnRbXSB7XG4gIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZnJhZ21lbnQsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5UKTtcbiAgY29uc3Qga25vd25JZ25vcmVzID0gbmV3IFNldDxOb2RlPigpO1xuICBjb25zdCBub2RlczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gIGxldCBjdXJyZW50Tm9kZTogTm9kZSB8IG51bGwgPSB3YWxrZXIubmV4dE5vZGUoKTtcblxuICB3aGlsZSAoY3VycmVudE5vZGUpIHtcbiAgICBpZiAoIShjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgY3VycmVudE5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxldCBwYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgIGxldCBpc0luTGlzdCA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHBhcmVudCAmJiAhaXNJbkxpc3QpIHtcbiAgICAgIGlmIChcbiAgICAgICAga25vd25JZ25vcmVzLmhhcyhwYXJlbnQpIHx8XG4gICAgICAgIChwYXJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBwYXJlbnQuaGFzQXR0cmlidXRlKERpcmVjdGl2ZS5FYWNoKSlcbiAgICAgICkge1xuICAgICAgICBpc0luTGlzdCA9IHRydWU7XG4gICAgICAgIGtub3duSWdub3Jlcy5hZGQoY3VycmVudE5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0luTGlzdCkge1xuICAgICAgbm9kZXMucHVzaChjdXJyZW50Tm9kZSk7XG4gICAgfVxuXG4gICAgY3VycmVudE5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgfVxuXG4gIHJldHVybiBub2Rlcztcbn1cblxuLyoqXG4gKiBDb21waWxlIGFuIHtAbGluayBIVE1MVGVtcGxhdGVFbGVtZW50fSBpbnRvIGEge0BsaW5rIENvbXBpbGVkVGVtcGxhdGV9IGZvclxuICogY2FjaGluZywgY2xvbmluZywgb3Igc3RvcmFnZS5cbiAqXG4gKiBDb21waWxlZCB0ZW1wbGF0ZSBvYmplY3RzIGNvbnRhaW4gYSBKU09OLXNlcmlhbGl6YWJsZSBkYXRhIHJlcHJlc2VudGF0aW9uIG9mXG4gKiBhIHRlbXBsYXRlIGFuZCBjYW4gYmUgcHJlcGFyZWQgdXNpbmcge0BsaW5rIHByZXBhcmVDb21waWxlZFRlbXBsYXRlfSB0b1xuICogY3JlYXRlIG5ldyBUZW1wbGF0ZSBpbnN0YW5jZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb21waWxlZCA9IGNvbXBpbGVUZW1wbGF0ZSgkdGVtcGxhdGVFbGVtZW50KTtcbiAqIGNvbnN0IHN0cmluZ2lmaWVkID0gSlNPTi5zdHJpbmdpZnkoY29tcGlsZWQpOyAvLyBhIEpTT04gdGVtcGxhdGUgYnVuZGxlXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVUZW1wbGF0ZShzb3VyY2U6IEhUTUxUZW1wbGF0ZUVsZW1lbnQpOiBDb21waWxlZFRlbXBsYXRlIHtcbiAgY29uc3QgcGFyc2VkTm90YXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIFBhcnNlZE5vdGF0aW9uPigpO1xuICBjb25zdCBzY2hlbWVzOiBBbnlTY2hlbWVbXSA9IFtdO1xuICBsZXQgZWxlbWVudElkID0gMDtcblxuICBjb25zdCBlbnN1cmVOb2RlUmVmID0gKGVsOiBIVE1MRWxlbWVudCk6IHN0cmluZyA9PiB7XG4gICAgbGV0IHJlZiA9IGVsLmdldEF0dHJpYnV0ZShSRUZfQVRUUik7XG4gICAgaWYgKCFyZWYpIHtcbiAgICAgIHJlZiA9IGBlbC0ke2VsZW1lbnRJZCsrfWA7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUkVGX0FUVFIsIHJlZik7XG4gICAgfVxuICAgIHJldHVybiByZWY7XG4gIH07XG5cbiAgY29uc3QgY2xvbmVkVGVtcGxhdGVFbGVtZW50ID0gc291cmNlLmNvbnRlbnQuY2xvbmVOb2RlKFxuICAgIHRydWUsXG4gICkgYXMgRG9jdW1lbnRGcmFnbWVudDtcblxuICBjb25zdCBub2RlczogSFRNTEVsZW1lbnRbXSA9IGNvbGxlY3RPcGVyYWJsZU5vZGVzKGNsb25lZFRlbXBsYXRlRWxlbWVudCk7XG5cbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgLy8gQ29sbGVjdCBhbGwgYXR0cmlidXRlcyBvbiB0aGlzIG5vZGVcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBub2RlLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIGF0dHJpYnV0ZXMuc2V0KG5hbWUsIG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZGlyZWN0aXZlIGF0dHJpYnV0ZXNcbiAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZV0gb2YgYXR0cmlidXRlcykge1xuICAgICAgLy8gQmFpbCBxdWlja2x5IGlmIHRoaXMgaXNuJ3QgYSBkaXJlY3RpdmVcbiAgICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSA9PT0gbnVsbCB8fCBhdHRyaWJ1dGVOYW1lWzBdICE9PSBcIjpcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIG5vdGF0aW9uIGhhcyBiZWVuIHBhcnNlZCBiZWZvcmUsIHJldXNlIHRoYXRcbiAgICAgIGxldCBub3RhdGlvbiA9IHBhcnNlZE5vdGF0aW9ucy5nZXQoYXR0cmlidXRlVmFsdWUpO1xuXG4gICAgICBpZiAobm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBub3RhdGlvbiA9IHBhcnNlTm90YXRpb24oYXR0cmlidXRlVmFsdWUpO1xuICAgICAgICBwYXJzZWROb3RhdGlvbnMuc2V0KGF0dHJpYnV0ZVZhbHVlLCBub3RhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXG4gICAgICAvLyA6OmtleSBpcyBoYW5kbGVkIGluIHRoZSA6OmVhY2ggcm91dGVcbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuS2V5KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUQUcgQ0hBTkdFIFNDSEVNRVNcbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuVGFnKSB7XG4gICAgICAgIHNjaGVtZXMucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJ0YWdcIixcbiAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgICBub2RlUmVmOiBlbnN1cmVOb2RlUmVmKG5vZGUpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gTElTVCBSRU5ERVIgU0NIRU1FU1xuICAgICAgZWxzZSBpZiAoYXR0cmlidXRlTmFtZSA9PT0gRGlyZWN0aXZlLkVhY2gpIHtcbiAgICAgICAgY29uc3Qgbm9kZVJlZiA9IGVuc3VyZU5vZGVSZWYobm9kZSk7XG5cbiAgICAgICAgLy8gQSA6OmtleSBkaXJlY3RpdmUgaXMgcmVxdWlyZWQgd2l0aCBhbnkgOjplYWNoXG4gICAgICAgIGNvbnN0IGtleU5vdGF0aW9uID0gbm9kZS5nZXRBdHRyaWJ1dGUoRGlyZWN0aXZlLktleSk7XG4gICAgICAgIGlmIChrZXlOb3RhdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoRGlyZWN0aXZlLktleSk7XG5cbiAgICAgICAgY29uc3QgbGlzdENvbnRlbnRIdG1sID0gbm9kZS5pbm5lckhUTUw7XG5cbiAgICAgICAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjaGVtZTogTGlzdFJlbmRlclNjaGVtZSA9IHtcbiAgICAgICAgICB0eXBlOiBcImVhY2hcIixcbiAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgICBrZXlOb3RhdGlvbjogcGFyc2VOb3RhdGlvbihrZXlOb3RhdGlvbiksXG4gICAgICAgICAgbm9kZVJlZixcbiAgICAgICAgICBsaXN0Q29udGVudEh0bWwsXG4gICAgICAgIH07XG5cbiAgICAgICAgc2NoZW1lcy5wdXNoKHNjaGVtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENPTlRFTlQgU1dBUCBTQ0hFTUVTXG4gICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuU3dhcCkge1xuICAgICAgICBjb25zdCBzY2hlbWU6IENvbnRlbnRTd2FwU2NoZW1lID0ge1xuICAgICAgICAgIHR5cGU6IFwic3dhcFwiLFxuICAgICAgICAgIG5vdGF0aW9uLFxuICAgICAgICAgIG5vZGVSZWY6IGVuc3VyZU5vZGVSZWYobm9kZSksXG4gICAgICAgIH07XG5cbiAgICAgICAgc2NoZW1lcy5wdXNoKHNjaGVtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFUVFJJQlVURSBVUERBVEUgU0NIRU1FU1xuICAgICAgZWxzZSBpZiAoaXNCb3VuZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICBjb25zdCBiaW5kTmFtZSA9IGF0dHJpYnV0ZU5hbWUuc2xpY2UoMSk7XG5cbiAgICAgICAgY29uc3Qgc2NoZW1lOiBBdHRyaWJ1dGVVcGRhdGVTY2hlbWUgPSB7XG4gICAgICAgICAgdHlwZTogXCJhdHRyXCIsXG4gICAgICAgICAgbm90YXRpb24sXG4gICAgICAgICAgYXR0cmlidXRlOiBiaW5kTmFtZSxcbiAgICAgICAgICBub2RlUmVmOiBlbnN1cmVOb2RlUmVmKG5vZGUpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNjaGVtZXMucHVzaChzY2hlbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFRlbXBsYXRlOiAke2F0dHJpYnV0ZU5hbWV9IGlzIG5vdCBhIHZhbGlkIGRpcmVjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgbm90YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWROb3RhdGlvbj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgcGFyc2VkTm90YXRpb25zKSB7XG4gICAgbm90YXRpb25zW2tleV0gPSB2YWw7XG4gIH1cblxuICBjb25zdCB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgdGVtcC5hcHBlbmRDaGlsZChjbG9uZWRUZW1wbGF0ZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcbiAgY29uc3QgaHRtbCA9IHRlbXAuaW5uZXJIVE1MO1xuXG4gIGNvbnN0IGNvbXBpbGVkOiBDb21waWxlZFRlbXBsYXRlID0ge1xuICAgIGh0bWwsXG4gICAgc2NoZW1lcyxcbiAgICBub3RhdGlvbnMsXG4gIH07XG5cbiAgcmV0dXJuIGNvbXBpbGVkO1xufVxuXG4vKipcbiAqIEdpdmVuIGEge0BsaW5rIENvbXBpbGVkVGVtcGxhdGV9IHN0cnVjdHVyZSwgcmV0dXJuIGFuIG9iamVjdCBjb250YWluaW5nIHRoZVxuICogZGF0YSBuZWVkZWQgdG8gY3JlYXRlIG5ldyBUZW1wbGF0ZSBpbnN0YW5jZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb21waWxlZFRlbXBsYXRlID0gZ2V0Q29tcGlsZWRUZW1wbGF0ZUpTT04oKTtcbiAqIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29tcGlsZWRUZW1wbGF0ZSk7XG4gKiBjb25zdCBwcmVwYXJlZCA9IHByZXBhcmVDb21waWxlZFRlbXBsYXRlKHBhcnNlZCk7XG4gKlxuICogLy8gRWxzZXdoZXJlLi4uXG4gKlxuICogY29uc3QgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUocHJlcGFyZWQpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlQ29tcGlsZWRUZW1wbGF0ZShcbiAgY29tcGlsZWQ6IENvbXBpbGVkVGVtcGxhdGUsXG4gIHByb3RvdHlwZUZyYWdtZW50PzogRG9jdW1lbnRGcmFnbWVudCxcbik6IFByZXBhcmVkVGVtcGxhdGUge1xuICBjb25zdCBwbGFuc0J5Tm90YXRpb246IE1hcDxzdHJpbmcsIFNldDxBbnlSZW5kZXJQbGFuPj4gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IG5vdGF0aW9uQWNjZXNzb3JzOiBNYXA8c3RyaW5nLCBOb3RhdGlvbkFjY2Vzc29yPiA9IG5ldyBNYXAoKTtcbiAgY29uc3Qgbm9kZVJlZnM6IE1hcDxzdHJpbmcsIEhUTUxFbGVtZW50PiA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IFtub3RhdGlvbiwgcGFyc2VkXSBvZiBPYmplY3QuZW50cmllcyhjb21waWxlZC5ub3RhdGlvbnMpKSB7XG4gICAgbm90YXRpb25BY2Nlc3NvcnMuc2V0KG5vdGF0aW9uLCBidWlsZFZhbHVlQWNjZXNzb3IocGFyc2VkKSk7XG4gIH1cblxuICBjb25zdCBmcmFnbWVudCA9IHByb3RvdHlwZUZyYWdtZW50ID8/IGh0bWxUb0ZyYWdtZW50KGNvbXBpbGVkLmh0bWwpO1xuXG4gIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZnJhZ21lbnQsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULCB7XG4gICAgYWNjZXB0Tm9kZShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG5vZGUuaGFzQXR0cmlidXRlKFJFRl9BVFRSKVxuICAgICAgICA/IE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVFxuICAgICAgICA6IE5vZGVGaWx0ZXIuRklMVEVSX1NLSVA7XG4gICAgfSxcbiAgfSk7XG5cbiAgbGV0IG1hcmtOb2RlOiBOb2RlIHwgbnVsbCA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuXG4gIHdoaWxlIChtYXJrTm9kZSkge1xuICAgIGlmICghKG1hcmtOb2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZWYgPSBtYXJrTm9kZS5nZXRBdHRyaWJ1dGUoUkVGX0FUVFIpO1xuXG4gICAgaWYgKHJlZiA9PT0gbnVsbCkge1xuICAgICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbiBpbiBwcmFjdGljZSwgYXMgdGhlIHRyZWUgd2Fsa2VyIG9ubHkgc3VyZmFjZXNcbiAgICAgIC8vIGVsZW1lbnRzIHdpdGggYW4gZXh0YW50IG5vZGUgcmVmIGF0dHJpYnV0ZVxuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbiAgICB9XG5cbiAgICBub2RlUmVmcy5zZXQocmVmLCBtYXJrTm9kZSk7XG4gICAgbWFya05vZGUucmVtb3ZlQXR0cmlidXRlKFJFRl9BVFRSKTtcbiAgICBtYXJrTm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuICB9XG5cbiAgY29uc3QgYXNzb2NpYXRlUGxhbiA9IChwbGFuOiBBbnlSZW5kZXJQbGFuLCBub3RhdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgbGV0IG5vdGF0aW9uUGxhbnMgPSBwbGFuc0J5Tm90YXRpb24uZ2V0KG5vdGF0aW9uKTtcbiAgICBpZiAoIW5vdGF0aW9uUGxhbnMpIHtcbiAgICAgIG5vdGF0aW9uUGxhbnMgPSBuZXcgU2V0KCk7XG4gICAgICBwbGFuc0J5Tm90YXRpb24uc2V0KG5vdGF0aW9uLCBub3RhdGlvblBsYW5zKTtcbiAgICB9XG4gICAgbm90YXRpb25QbGFucy5hZGQocGxhbik7XG4gIH07XG5cbiAgY29uc3QgZ2V0QnlOb2RlUmVmID0gKG5vZGVSZWY6IHN0cmluZyk6IEhUTUxFbGVtZW50ID0+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBub2RlUmVmcy5nZXQobm9kZVJlZik7XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9ERV9SRUYpO1xuICB9O1xuXG4gIGZvciAoY29uc3Qgc2NoZW1lIG9mIGNvbXBpbGVkLnNjaGVtZXMpIHtcbiAgICAvLyBIeWRyYXRlIExpc3Qgc2NoZW1lcyBpbnRvIExpc3QgcGxhbnNcbiAgICBpZiAoc2NoZW1lLnR5cGUgPT09IFwiZWFjaFwiKSB7XG4gICAgICBjb25zdCBpdGVtUHJvdG90eXBlID0gZ2V0QnlOb2RlUmVmKHNjaGVtZS5ub2RlUmVmKTtcbiAgICAgIGNvbnN0IGxpc3RDb250YWluZXIgPSBpdGVtUHJvdG90eXBlLnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgIGlmICghbGlzdENvbnRhaW5lcikge1xuICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9NSVNTSU5HX0xJU1RfUEFSRU5UKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGxpc3Qgc3RhcnQvZW5kIG1hcmtlcnNcbiAgICAgIGNvbnN0IHN0YXJ0TWFya2VyID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcImxpc3Qtc3RhcnRcIik7XG4gICAgICBjb25zdCBlbmRNYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KFwibGlzdC1lbmRcIik7XG5cbiAgICAgIGxpc3RDb250YWluZXIuaW5zZXJ0QmVmb3JlKHN0YXJ0TWFya2VyLCBpdGVtUHJvdG90eXBlKTtcbiAgICAgIGxpc3RDb250YWluZXIuaW5zZXJ0QmVmb3JlKGVuZE1hcmtlciwgaXRlbVByb3RvdHlwZS5uZXh0U2libGluZyk7XG5cbiAgICAgIC8vIFNoYWxsb3cgY29weSBvZiB0aGUgcm93IHJvb3RcbiAgICAgIGNvbnN0IHJvd1Jvb3RFbGVtZW50ID0gaXRlbVByb3RvdHlwZS5jbG9uZU5vZGUoZmFsc2UpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAvLyBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgcm93IGludG8gYSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgdGVtcGxhdGVDb250ZW50RnJhZ21lbnQgPSBodG1sVG9GcmFnbWVudChzY2hlbWUubGlzdENvbnRlbnRIdG1sKTtcbiAgICAgIGNvbnN0IHJvd1RlbXBsYXRlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICAgIHJvd1RlbXBsYXRlRWxlbWVudC5jb250ZW50LmFwcGVuZENoaWxkKHRlbXBsYXRlQ29udGVudEZyYWdtZW50KTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSBvcmlnaW5hbCByb290IHByb3RvdHlwZSBzaW5jZSB3ZSB3aWxsIGJlIHJlbmRlcmluZyBuZXcgaXRlbXNcbiAgICAgIGl0ZW1Qcm90b3R5cGUucmVtb3ZlKCk7XG5cbiAgICAgIGNvbnN0IHBsYW46IExpc3RSZW5kZXJQbGFuID0ge1xuICAgICAgICB0eXBlOiBcImVhY2hcIixcbiAgICAgICAgbm90YXRpb246IHNjaGVtZS5ub3RhdGlvbixcbiAgICAgICAga2V5Tm90YXRpb246IHNjaGVtZS5rZXlOb3RhdGlvbixcbiAgICAgICAgbGlzdENvbnRhaW5lckVsZW1lbnQ6IGxpc3RDb250YWluZXIsXG4gICAgICAgIHJvd1RlbXBsYXRlRWxlbWVudCxcbiAgICAgICAgcm93Um9vdEVsZW1lbnQsXG4gICAgICAgIHN0YXJ0TWFya2VyLFxuICAgICAgICBlbmRNYXJrZXIsXG4gICAgICAgIHJvd1RlbXBsYXRlc0J5Um9vdDogbmV3IFdlYWtNYXAoKSxcbiAgICAgICAgcm93Um9vdHNCeUtleTogbmV3IE1hcCgpLFxuICAgICAgfTtcblxuICAgICAgYXNzb2NpYXRlUGxhbihwbGFuLCBzY2hlbWUubm90YXRpb24uYmFzZSk7XG4gICAgfVxuICAgIC8vIEh5ZHJhdGUgU3dhcCBzY2hlbWVzIGludG8gU3dhcCBwbGFuc1xuICAgIGVsc2UgaWYgKHNjaGVtZS50eXBlID09PSBcInN3YXBcIikge1xuICAgICAgY29uc3QgcGxhbjogQ29udGVudFN3YXBQbGFuID0ge1xuICAgICAgICB0eXBlOiBcInN3YXBcIixcbiAgICAgICAgbm90YXRpb246IHNjaGVtZS5ub3RhdGlvbixcbiAgICAgICAgbm9kZTogZ2V0QnlOb2RlUmVmKHNjaGVtZS5ub2RlUmVmKSxcbiAgICAgIH07XG5cbiAgICAgIGFzc29jaWF0ZVBsYW4ocGxhbiwgc2NoZW1lLm5vdGF0aW9uLmJhc2UpO1xuICAgIH1cblxuICAgIC8vIEh5ZHJhdGUgVGFnIGNoYW5nZSBwbGFuc1xuICAgIGVsc2UgaWYgKHNjaGVtZS50eXBlID09PSBcInRhZ1wiKSB7XG4gICAgICBjb25zdCBwbGFuOiBUYWdDaGFuZ2VQbGFuID0ge1xuICAgICAgICB0eXBlOiBcInRhZ1wiLFxuICAgICAgICBub3RhdGlvbjogc2NoZW1lLm5vdGF0aW9uLFxuICAgICAgICBub2RlOiBnZXRCeU5vZGVSZWYoc2NoZW1lLm5vZGVSZWYpLFxuICAgICAgfTtcblxuICAgICAgYXNzb2NpYXRlUGxhbihwbGFuLCBwbGFuLm5vdGF0aW9uLmJhc2UpO1xuICAgIH1cblxuICAgIC8vIEh5ZHJhdGUgQXR0cmlidXRlIHVwZGF0ZSBwbGFuc1xuICAgIGVsc2UgaWYgKHNjaGVtZS50eXBlID09PSBcImF0dHJcIikge1xuICAgICAgY29uc3QgcGxhbjogQXR0cmlidXRlVXBkYXRlUGxhbiA9IHtcbiAgICAgICAgdHlwZTogXCJhdHRyXCIsXG4gICAgICAgIGF0dHJpYnV0ZTogc2NoZW1lLmF0dHJpYnV0ZSxcbiAgICAgICAgbm90YXRpb246IHNjaGVtZS5ub3RhdGlvbixcbiAgICAgICAgbm9kZTogZ2V0QnlOb2RlUmVmKHNjaGVtZS5ub2RlUmVmKSxcbiAgICAgIH07XG5cbiAgICAgIGFzc29jaWF0ZVBsYW4ocGxhbiwgcGxhbi5ub3RhdGlvbi5iYXNlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBsYW5zQnlOb3RhdGlvbixcbiAgICBub3RhdGlvbkFjY2Vzc29ycyxcbiAgICBmcmFnbWVudCxcbiAgfTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgY2xhc3NpZnkgfSBmcm9tIFwiI2hlbHBlclwiO1xuaW1wb3J0IHtcbiAgYXBwbHlBdHRyaWJ1dGVNYXAsXG4gIGNoYW5nZVRhZyxcbiAgY3JlYXRlQXR0cmlidXRlTWFwLFxuICBzZXJpYWxpemVBdHRyaWJ1dGUsXG59IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHsgYnVpbGRWYWx1ZUFjY2Vzc29yIH0gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSwgdHlwZSBUZW1wbGF0ZUNvbnRleHQgfSBmcm9tIFwiLi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHR5cGUge1xuICBBdHRyaWJ1dGVVcGRhdGVKb2IsXG4gIEF0dHJpYnV0ZVVwZGF0ZVBsYW4sXG4gIENvbnRlbnRTd2FwSm9iLFxuICBDb250ZW50U3dhcFBsYW4sXG4gIExpc3RSZW5kZXJKb2IsXG4gIExpc3RSZW5kZXJKb2JJdGVtLFxuICBMaXN0UmVuZGVyUGxhbixcbiAgVGFnQ2hhbmdlSm9iLFxuICBUYWdDaGFuZ2VQbGFuLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgU0tJUFBFRF9KT0IgPSBTeW1ib2woXCJub29wXCIpO1xuZXhwb3J0IHR5cGUgU2tpcHBlZEpvYiA9IHR5cGVvZiBTS0lQUEVEX0pPQjtcblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBBVFRSSUJVVEUgVVBEQVRFIEpPQlMgLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUF0dHJpYnV0ZUpvYihcbiAgcGxhbjogQXR0cmlidXRlVXBkYXRlUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IEF0dHJpYnV0ZVVwZGF0ZUpvYiB8IFNraXBwZWRKb2Ige1xuICBjb25zdCByYXdWYWx1ZSA9IHZhbHVlcy5nZXQocGxhbi5ub3RhdGlvbi5iYXNlKTtcbiAgbGV0IHZhbHVlID0gdHlwZW9mIHJhd1ZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyByYXdWYWx1ZShwbGFuLm5vZGUpIDogcmF3VmFsdWU7XG5cbiAgLy8gUGFyc2UgdGhlIHZhbHVlIHdpdGggYGNsYXNzaWZ5YCBpZiBzZXR0aW5nIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgaWYgKHBsYW4uYXR0cmlidXRlID09PSBcImNsYXNzXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdmFsdWUgPSBjbGFzc2lmeSh2YWx1ZSk7XG4gIH1cblxuICBjb25zdCBzZXJpYWxpemVkVmFsdWUgPSBzZXJpYWxpemVBdHRyaWJ1dGUodmFsdWUpO1xuICBjb25zdCBjdXJyZW50ID0gcGxhbi5ub2RlLmdldEF0dHJpYnV0ZShwbGFuLmF0dHJpYnV0ZSk7XG5cbiAgaWYgKHNlcmlhbGl6ZWRWYWx1ZSAhPT0gY3VycmVudCkge1xuICAgIHJldHVybiBbcGxhbi5ub2RlLCBwbGFuLmF0dHJpYnV0ZSwgc2VyaWFsaXplZFZhbHVlXTtcbiAgfVxuXG4gIHJldHVybiBTS0lQUEVEX0pPQjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkF0dHJpYnV0ZUpvYnMoam9iczogQXR0cmlidXRlVXBkYXRlSm9iW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbm9kZSwgbmFtZSwgdmFsdWVdIG9mIGpvYnMpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBDT05URU5UIFNXQVAgSk9CUyAvL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVDb250ZW50U3dhcEpvYihcbiAgcGxhbjogQ29udGVudFN3YXBQbGFuLFxuICB2YWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+LFxuKTogQ29udGVudFN3YXBKb2IgfCBTa2lwcGVkSm9iIHtcbiAgY29uc3QgcmF3VmFsdWUgPSB2YWx1ZXMuZ2V0KHBsYW4ubm90YXRpb24uYmFzZSk7XG4gIGNvbnN0IHZhbHVlID0gdHlwZW9mIHJhd1ZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyByYXdWYWx1ZShwbGFuLm5vZGUpIDogcmF3VmFsdWU7XG5cbiAgLy8gU3RyaW5nLCBOdW1iZXIsIEJvb2xlYW4gLT4gVGV4dCBOb2RlXG4gIGlmIChcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiXG4gICkge1xuICAgIGNvbnN0IGFzU3RyID0gYCR7dmFsdWV9YDtcbiAgICBpZiAocGxhbi5ub2RlLnRleHRDb250ZW50ID09PSBhc1N0cikge1xuICAgICAgcmV0dXJuIFNLSVBQRURfSk9CO1xuICAgIH1cblxuICAgIHJldHVybiBbcGxhbiwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYXNTdHIpXTtcbiAgfVxuXG4gIC8vIE51bGxpc2ggdmFsdWVzIC0+IENvbW1lbnRcbiAgZWxzZSBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChwbGFuLm5vZGUgaW5zdGFuY2VvZiBDb21tZW50KSB7XG4gICAgICByZXR1cm4gU0tJUFBFRF9KT0I7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtwbGFuLCBkb2N1bWVudC5jcmVhdGVDb21tZW50KFwiZW1wdHlcIildO1xuICB9XG5cbiAgLy8gSFRNTEVsZW1lbnQgLT4gU3dhcCBub2Rlc1xuICBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKE9iamVjdC5pcyhwbGFuLm5vZGUsIHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFNLSVBQRURfSk9CO1xuICAgIH1cblxuICAgIHJldHVybiBbcGxhbiwgdmFsdWUuY2xvbmVOb2RlKHRydWUpXTtcbiAgfVxuXG4gIC8vIEFueXRoaW5nIGVsc2UgLT4gVW5zdXBwb3J0ZWRcbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgIEVycm9yQ29kZS5JTlZBTElEX0NPTlRFTlQsXG4gICAgICB0eXBlb2YgdmFsdWUsXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWx1ZSksXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuQ29udGVudFN3YXBKb2JzKGpvYnM6IENvbnRlbnRTd2FwSm9iW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbcGxhbiwgcmVwbGFjZV0gb2Ygam9icykge1xuICAgIGNvbnN0IHBhcmVudCA9IHBsYW4ubm9kZS5wYXJlbnROb2RlO1xuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4gaW4gcHJhY3RpY2VcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gICAgfVxuXG4gICAgcGFyZW50LnJlcGxhY2VDaGlsZChyZXBsYWNlLCBwbGFuLm5vZGUpO1xuICAgIHBsYW4ubm9kZSA9IHJlcGxhY2U7XG4gIH1cbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBUQUcgQ0hBTkdFIEpPQlMgLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVRhZ0NoYW5nZUpvYihcbiAgcGxhbjogVGFnQ2hhbmdlUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IFRhZ0NoYW5nZUpvYiB8IFNraXBwZWRKb2Ige1xuICBjb25zdCByYXdWYWx1ZSA9IHZhbHVlcy5nZXQocGxhbi5ub3RhdGlvbi5iYXNlKSA/PyBcIlwiO1xuICBjb25zdCB2YWx1ZSA9IHR5cGVvZiByYXdWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gcmF3VmFsdWUocGxhbi5ub2RlKSA6IHJhd1ZhbHVlO1xuICBjb25zdCBuZXh0VGFnID0gYCR7dmFsdWV9YC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBjdXJyZW50VGFnID0gcGxhbi5ub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICBpZiAoIW5leHRUYWcgfHwgbmV4dFRhZyA9PT0gY3VycmVudFRhZykge1xuICAgIHJldHVybiBTS0lQUEVEX0pPQjtcbiAgfVxuXG4gIHJldHVybiBbcGxhbiwgbmV4dFRhZ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5UYWdDaGFuZ2VKb2JzKGpvYnM6IFRhZ0NoYW5nZUpvYltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW3BsYW4sIG5leHRUYWddIG9mIGpvYnMpIHtcbiAgICBwbGFuLm5vZGUgPSBjaGFuZ2VUYWcocGxhbi5ub2RlLCBuZXh0VGFnKTtcbiAgfVxufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBMSVNUIFJFTkRFUiBKT0JTIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmZ1bmN0aW9uIGZldGNoTGlzdERhdGEoXG4gIHBsYW46IExpc3RSZW5kZXJQbGFuLFxuICB2YWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSB7XG4gIGNvbnN0IG5vdGF0aW9uVmFsdWUgPSB2YWx1ZXMuZ2V0KHBsYW4ubm90YXRpb24uYmFzZSk7XG4gIGNvbnN0IGV2YWx1YXRlZFZhbHVlID1cbiAgICB0eXBlb2Ygbm90YXRpb25WYWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IG5vdGF0aW9uVmFsdWUocGxhbi5zdGFydE1hcmtlci5wYXJlbnROb2RlKVxuICAgICAgOiBub3RhdGlvblZhbHVlO1xuXG4gIGlmIChldmFsdWF0ZWRWYWx1ZSA9PT0gbnVsbCB8fCBldmFsdWF0ZWRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoZXZhbHVhdGVkVmFsdWUpKSB7XG4gICAgcmV0dXJuIGV2YWx1YXRlZFZhbHVlO1xuICB9XG5cbiAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9MSVNUKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEhUTUxFbGVtZW50cyhzdGFydDogTm9kZSwgZW5kOiBOb2RlKTogU2V0PEhUTUxFbGVtZW50PiB7XG4gIGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IHN0YXJ0O1xuICBjb25zdCBub2RlU2V0ID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcblxuICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSBlbmQpIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICBub2RlU2V0LmFkZChub2RlKTtcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgfVxuXG4gIHJldHVybiBub2RlU2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUxpc3RSZW5kZXJKb2IoXG4gIHBsYW46IExpc3RSZW5kZXJQbGFuLFxuICB2YWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+LFxuKTogTGlzdFJlbmRlckpvYiB8IFNraXBwZWRKb2Ige1xuICAvLyBGZXRjaCB0aGUgZGF0YSBmb3IgcmVuZGVyaW5nIHRoZSB1cGRhdGVkIGxpc3QgaXRlbXNcbiAgY29uc3QgbGlzdERhdGEgPSBmZXRjaExpc3REYXRhKHBsYW4sIHZhbHVlcyk7XG5cbiAgLy8gRW1wdHkgLT4gUmVtb3ZlIHRoZSBsaXN0IGNvbnRlbnRzIGVudGlyZWx5IGFuZCBleGl0XG4gIGlmIChsaXN0RGF0YS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW3BsYW4sIFtdXTtcbiAgfVxuXG4gIC8vIENvbGxlY3QgZXhpc3RpbmcgZWxlbWVudHMgZnJvbSB0aGUgRE9NIGZvciBhc3Nlc3NtZW50XG4gIGNvbnN0IHsgcm93VGVtcGxhdGVzQnlSb290LCByb3dUZW1wbGF0ZUVsZW1lbnQsIHJvd1Jvb3RFbGVtZW50IH0gPSBwbGFuO1xuICBjb25zdCBrZXlBY2Nlc3NvciA9IGJ1aWxkVmFsdWVBY2Nlc3NvcihwbGFuLmtleU5vdGF0aW9uKTtcbiAgY29uc3QgbGlzdFJlbmRlckNvbnRleHRzOiBNYXA8dW5rbm93biwgTGlzdFJlbmRlckpvYkl0ZW0+ID0gbmV3IE1hcCgpO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0RGF0YSkge1xuICAgIGNvbnN0IGNvbnRleHQ6IFRlbXBsYXRlQ29udGV4dCA9IHtcbiAgICAgIGl0ZW0sXG4gICAgfTtcblxuICAgIGNvbnN0IGtleSA9IGtleUFjY2Vzc29yKGNvbnRleHQpO1xuXG4gICAgaWYgKGxpc3RSZW5kZXJDb250ZXh0cy5oYXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWSxcbiAgICAgICAgU3RyaW5nKGtleSksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIEhUTUwgRWxlbWVudCB3ZSBleHBlY3QgdG8gc2VlIGhlcmVcbiAgICBsZXQgcm93Um9vdCA9IHBsYW4ucm93Um9vdHNCeUtleS5nZXQoa2V5KTtcblxuICAgIGlmIChyb3dSb290ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvd1Jvb3QgPSByb3dSb290RWxlbWVudC5jbG9uZU5vZGUoZmFsc2UpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgcGxhbi5yb3dSb290c0J5S2V5LnNldChrZXksIHJvd1Jvb3QpO1xuICAgIH1cblxuICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIHRlbXBsYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcm93IHJvb3RcbiAgICBsZXQgcm93VGVtcGxhdGUgPSByb3dUZW1wbGF0ZXNCeVJvb3QuZ2V0KHJvd1Jvb3QpO1xuXG4gICAgaWYgKHJvd1RlbXBsYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvd1RlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHJvd1RlbXBsYXRlRWxlbWVudCk7XG4gICAgICByb3dUZW1wbGF0ZXNCeVJvb3Quc2V0KHJvd1Jvb3QsIHJvd1RlbXBsYXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCBqb2JJdGVtOiBMaXN0UmVuZGVySm9iSXRlbSA9IHtcbiAgICAgIGNvbnRleHQsXG4gICAgICByb290OiByb3dSb290LFxuICAgICAgdGVtcGxhdGU6IHJvd1RlbXBsYXRlLFxuICAgICAgYXR0ck1hcDogY3JlYXRlQXR0cmlidXRlTWFwKGl0ZW0pLFxuICAgIH07XG5cbiAgICBsaXN0UmVuZGVyQ29udGV4dHMuc2V0KGtleSwgam9iSXRlbSk7XG4gIH1cblxuICAvLyBDbGVhbiB1cCBjYWNoZWQgZGF0YVxuICBmb3IgKGNvbnN0IFtrZXksIHJvb3RdIG9mIHBsYW4ucm93Um9vdHNCeUtleSkge1xuICAgIGlmICghbGlzdFJlbmRlckNvbnRleHRzLmhhcyhrZXkpKSB7XG4gICAgICBwbGFuLnJvd1Jvb3RzQnlLZXkuZGVsZXRlKGtleSk7XG4gICAgICBwbGFuLnJvd1RlbXBsYXRlc0J5Um9vdC5kZWxldGUocm9vdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtwbGFuLCBBcnJheS5mcm9tKGxpc3RSZW5kZXJDb250ZXh0cy52YWx1ZXMoKSldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuTGlzdFJlbmRlckpvYnMoam9iczogTGlzdFJlbmRlckpvYltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW3BsYW4sIHJlbmRlckl0ZW1zXSBvZiBqb2JzKSB7XG4gICAgY29uc3QgeyBlbmRNYXJrZXIsIGxpc3RDb250YWluZXJFbGVtZW50IH0gPSBwbGFuO1xuXG4gICAgLy8gRmFzdCBwYXRoIGZvciBlbXB0eSBsaXN0cyAtPiBSZW1vdmUgZXZlcnl0aGluZyBhbmQgY29udGludWVcbiAgICBpZiAocmVuZGVySXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgcGxhbi5yb3dSb290c0J5S2V5LnZhbHVlcygpKSB7XG4gICAgICAgIHJvb3QucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgICBwbGFuLnJvd1Jvb3RzQnlLZXkuY2xlYXIoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgc2NhbiB0aGUgY3VycmVudCBub2RlcyBhbmQgbW9kaWZ5IGFzIG5lZWRlZFxuICAgIGNvbnN0IGV4aXN0aW5nRE9NTm9kZXMgPSBBcnJheS5mcm9tKFxuICAgICAgY29sbGVjdEhUTUxFbGVtZW50cyhwbGFuLnN0YXJ0TWFya2VyLCBwbGFuLmVuZE1hcmtlciksXG4gICAgKTtcblxuICAgIGNvbnN0IHJvb3RzVG9LZWVwID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcblxuICAgIGxldCBleGlzdGluZ0RPTU5vZGVJZHggPSAwO1xuXG4gICAgZm9yIChjb25zdCByZW5kZXJJdGVtIG9mIHJlbmRlckl0ZW1zKSB7XG4gICAgICBjb25zdCB7IHJvb3QsIGF0dHJNYXAsIGNvbnRleHQsIHRlbXBsYXRlIH0gPSByZW5kZXJJdGVtO1xuICAgICAgY29uc3QgZXhpc3RpbmdET01Ob2RlID0gZXhpc3RpbmdET01Ob2Rlc1tleGlzdGluZ0RPTU5vZGVJZHhdO1xuXG4gICAgICAvLyBTcHJlYWQgaXRlbSBhcyBhdHRyaWJ1dGVzIG9uIHRoZSByb290IGFuZCB1cGRhdGUgdGhlIHRlbXBsYXRlXG4gICAgICBhcHBseUF0dHJpYnV0ZU1hcChyb290LCBhdHRyTWFwKTtcbiAgICAgIHRlbXBsYXRlLnJlbmRlcihyb290LCBjb250ZXh0KTtcblxuICAgICAgcm9vdHNUb0tlZXAuYWRkKHJvb3QpO1xuXG4gICAgICAvLyBOb2RlIGlzIHRoZSBleGlzdGluZyBET00gTm9kZSwgY29udGludWVcbiAgICAgIGlmIChPYmplY3QuaXMoZXhpc3RpbmdET01Ob2RlLCByb290KSkge1xuICAgICAgICBleGlzdGluZ0RPTU5vZGVJZHggKz0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vIGV4aXN0aW5nIG5vZGUgLT4gYXBwZW5kIGl0ZW1cbiAgICAgIGlmICghZXhpc3RpbmdET01Ob2RlKSB7XG4gICAgICAgIGxpc3RDb250YWluZXJFbGVtZW50Lmluc2VydEJlZm9yZShyb290LCBlbmRNYXJrZXIpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRE9NIG5vZGUgZXhpc3RzIGJ1dCBpc24ndCB0aGUgb25lIHdlJ3JlIGxvb2tpbmcgZm9yLiBJbnNlcnQgYmVmb3JlLlxuICAgICAgbGlzdENvbnRhaW5lckVsZW1lbnQuaW5zZXJ0QmVmb3JlKHJvb3QsIGV4aXN0aW5nRE9NTm9kZSk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgb2xkIGVsZW1lbnRzXG4gICAgZm9yIChjb25zdCByb290IG9mIGV4aXN0aW5nRE9NTm9kZXMpIHtcbiAgICAgIGlmICghcm9vdHNUb0tlZXAuaGFzKHJvb3QpKSB7XG4gICAgICAgIHJvb3QucmVtb3ZlKCk7XG4gICAgICAgIHBsYW4ucm93VGVtcGxhdGVzQnlSb290LmRlbGV0ZShyb290KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB7IGZyYWdtZW50Q2FjaGUsIGh0bWxUb0ZyYWdtZW50IH0gZnJvbSBcIi4uL3V0aWwvZnJhZ21lbnRzXCI7XG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gXCIuLi91dGlsL2xydS1jYWNoZVwiO1xuaW1wb3J0IHsgY29tcGlsZVRlbXBsYXRlLCBwcmVwYXJlQ29tcGlsZWRUZW1wbGF0ZSB9IGZyb20gXCIuL2J1aWxkXCI7XG5pbXBvcnQge1xuICBwcmVwYXJlQXR0cmlidXRlSm9iLFxuICBwcmVwYXJlQ29udGVudFN3YXBKb2IsXG4gIHByZXBhcmVMaXN0UmVuZGVySm9iLFxuICBwcmVwYXJlVGFnQ2hhbmdlSm9iLFxuICBydW5BdHRyaWJ1dGVKb2JzLFxuICBydW5Db250ZW50U3dhcEpvYnMsXG4gIHJ1bkxpc3RSZW5kZXJKb2JzLFxuICBydW5UYWdDaGFuZ2VKb2JzLFxuICBTS0lQUEVEX0pPQixcbn0gZnJvbSBcIi4vam9ic1wiO1xuaW1wb3J0IHR5cGUgeyBOb3RhdGlvbkFjY2Vzc29yIH0gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFueVJlbmRlclBsYW4sXG4gIEF0dHJpYnV0ZVVwZGF0ZUpvYixcbiAgQ29tcGlsZWRUZW1wbGF0ZSxcbiAgQ29udGVudFN3YXBKb2IsXG4gIExpc3RSZW5kZXJKb2IsXG4gIFRhZ0NoYW5nZUpvYixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgVGVtcGxhdGVSb290ID0gSFRNTEVsZW1lbnQgfCBTaGFkb3dSb290O1xuZXhwb3J0IHR5cGUgVGVtcGxhdGVDb250ZXh0ID0ge1xuICBhdHRyPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD47XG4gIHN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaXRlbT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpbmRleD86IG51bWJlcjtcbn07XG5cbmNvbnN0IGNvbXBpbGVDYWNoZSA9IG5ldyBMUlVDYWNoZTxIVE1MVGVtcGxhdGVFbGVtZW50LCBDb21waWxlZFRlbXBsYXRlPigpO1xuXG5pZiAoX19ERVZfXyAmJiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICh3aW5kb3cgYXMgYW55KS5fX1BBTEVUVEVfREVWVE9PTFNfXyA9IHtcbiAgICBkdW1wQ2FjaGVNZXRyaWNzOiAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcIkNvbXBpbGVkIFRlbXBsYXRlcyBDYWNoZVwiLCBjb21waWxlQ2FjaGUubWV0cmljcyk7XG4gICAgICBjb25zb2xlLmxvZyhcIkhUTUwgRnJhZ21lbnRzIENhY2hlXCIsIGZyYWdtZW50Q2FjaGUubWV0cmljcyk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBBIHJlbmRlcmFibGUgdGVtcGxhdGUgZnJvbSBhbiBIVE1MVGVtcGxhdGVFbGVtZW50XG4gKlxuICogTGV2ZXJhZ2VzIGEgc2ltcGxlIHN5bnRheCB0byBwcm92aWRlIGFjY2Vzc29ycyB0byB0ZW1wbGF0ZSBkYXRhIGZyb20gb25lIG9mXG4gKiBmb3VyIGNhdGVnb3JpZXMsIGJhc2VkIG9uIHVzZSBjYXNlOlxuICpcbiAqIGBgYFxuICogYEBgIC0+IFRoZSBgYXR0cmAgbmFtZXNwYWNlICh0aGUgaG9zdCBlbGVtZW50J3MgYXR0cmlidXRlcylcbiAqIGAkYCAtPiBUaGUgYHN0YXRlYCBuYW1lc3BhY2UgKHRoZSBob3N0IGVsZW1lbnQncyByZWFjdGl2ZSBzdGF0ZSlcbiAqIGAqYCAtPiBUaGUgYGRhdGFgIG5hbWVzcGFjZSAodGhlIGhvc3QgZWxlbWVudCdzIGNvbXB1dGVkIGRhdGEpXG4gKiBgI2AgLT4gVGhlIGBpdGVtYCBuYW1lc3BhY2UgKGxpc3QgaXRlbSBhY2Nlc3Mgd2l0aCA6OmVhY2gpXG4gKiBgYGBcbiAqXG4gKiBCaW5kIGF0dHJpYnV0ZXMgdG8gYSB2YWx1ZSB1c2luZyB0aGUgYDphdHRyaWJ1dGVgIHN5bnRheDpcbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IDppZD1cIiRpZFwiIDpjbGFzcz1cIkBjbGFzc25hbWVcIj48L2Rpdj5cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVGVtcGxhdGUge1xuICAvKipcbiAgICogUHJvcGVydGllcyByZWxhdGVkIHRvIHRoZSBnbG9iYWwgVGVtcGxhdGUgYnVpbGQgY2FjaGUuXG4gICAqXG4gICAqIFRoaXMgaXMgbm90IHNvbWV0aGluZyB0eXBpY2FsbHkgbmVlZGVkIGZvciBnZW5lcmFsIGFwcCBkZXZlbG9wbWVudCwgYnV0XG4gICAqIGFsbG93cyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiB0byB0dW5lIHRoZSBjYWNoaW5nIHN5c3RlbSBpZiBuZWVkIGJlLlxuICAgKlxuICAgKiBDYWNoZSBzaXplcyBkZWZhdWx0IHRvIDUwMCBIVE1MIFRlbXBsYXRlIEZyYWdtZW50cyBhbmQgY29tcGlsZWQgUGFsZXR0ZVxuICAgKiB0ZW1wbGF0ZXMgKGluY2x1ZGVzIG5lc3RlZCB0ZW1wbGF0ZXMgbGlrZSBsaXN0cykgdG8gY292ZXIgbW9zdCBhcHBsaWNhdGlvblxuICAgKiBuZWVkcyB3aXRob3V0IHVzaW5nIG11Y2ggbWVtb3J5LlxuICAgKi9cbiAgc3RhdGljIGNhY2hlID0ge1xuICAgIC8qKlxuICAgICAqIFdpcGUgYWxsIGNhY2hlZCB0ZW1wbGF0ZXMgYW5kIEhUTUwgZnJhZ21lbnRzXG4gICAgICovXG4gICAgY2xlYXI6ICgpOiB2b2lkID0+IHtcbiAgICAgIGZyYWdtZW50Q2FjaGUuY2xlYXIoKTtcbiAgICAgIGNvbXBpbGVDYWNoZS5jbGVhcigpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB0aGUgZGVmYXVsdCBjYWNoZSBjYXBhY2l0eSBvZiA1MDAgaXRlbXMgcGVyIGNhY2hlXG4gICAgICpcbiAgICAgKiBHZW5lcmFsIGNhY2hpbmcgZ3VpZGFuY2U6XG4gICAgICogLSA5NSUgb2YgdGhlIHRpbWUsIDUwMCB3b3JrcyBmaW5lXG4gICAgICogLSBGb3IgdmVyeSBsYXJnZSBhcHBsaWNhdGlvbnMsIHVwIHRvIDEwMDAgaXMgcmVhc29uYWJsZVxuICAgICAqIC0gRm9yIHNtYWxsZXIgYXBwcywgZHJvcHBpbmcgZG93biB0byAxMDAgLSAyNTAgbWF5IHNhdmUgbWVtb3J5XG4gICAgICpcbiAgICAgKiBVbHRpbWF0ZWx5IHRoZSBpbXBhY3Qgd2lsbCBiZSBtaW5pbWFsIHVubGVzcyB5b3VyIGFwcCBoYXMgdmVyeSBzcGVjaWZpY1xuICAgICAqIHJlbmRlcmluZyBuZWVkcy5cbiAgICAgKi9cbiAgICBzZXRDYXBhY2l0eTogKG1heFNpemU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgZnJhZ21lbnRDYWNoZS5zZXRDYXBhY2l0eShtYXhTaXplKTtcbiAgICAgIGNvbXBpbGVDYWNoZS5zZXRDYXBhY2l0eShtYXhTaXplKTtcbiAgICB9LFxuICB9O1xuXG4gIHByaXZhdGUgX2NvbXBpbGVkOiBDb21waWxlZFRlbXBsYXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwge0BsaW5rIEhUTUxUZW1wbGF0ZUVsZW1lbnR9IHVzZWQgdG8gY3JlYXRlIHRoaXMgVGVtcGxhdGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIE1ha2Ugc3VyZSB0byBuZXZlciBvcGVyYXRlIGRpcmVjdGx5IG9uIHRoaXMgZWxlbWVudC4gQWx3YXlzIGNsb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBfdGVtcGxhdGVFbGVtZW50PzogSFRNTFRlbXBsYXRlRWxlbWVudDtcblxuICAvKiogVGhlIGN1cnJlbnQga25vd24gcm9vdCBlbGVtZW50IHRoYXQgdGhpcyBUZW1wbGF0ZSBpcyByZW5kZXJlZCBpbnRvICovXG4gIHByaXZhdGUgX21vdW50ZWRSb290PzogVGVtcGxhdGVSb290O1xuXG4gIC8qKiBUaGUgbW9zdCByZWNlbnQgc2V0IHZhbHVlIGZvciBlYWNoIG5vdGF0aW9uIHRoYXQgaGFzIHJlbmRlcmVkICovXG4gIHByaXZhdGUgX2xhdGVzdFJlbmRlcmVkVmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPiA9IG5ldyBNYXAoKTtcblxuICAvKiogVGhlIGFjdGl2ZSBIVE1MRWxlbWVudCB3aGljaCB0aGUgdGVtcGxhdGUgaXMgdXBkYXRpbmcgb24gcmVuZGVycyAqL1xuICBwcml2YXRlIF9mcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudDtcblxuICAvKiogVmFsdWUgTm90YXRpb25zIC0+IFNldDxSZW5kZXIgUGxhbnM+ICovXG4gIHByaXZhdGUgX3BsYW5zQnlOb3RhdGlvbjogTWFwPHN0cmluZywgU2V0PEFueVJlbmRlclBsYW4+PiA9IG5ldyBNYXAoKTtcblxuICAvKiogVmFsdWUgTm90YXRpb25zIC0+IEFjY2Vzc29yIGZ1bmN0aW9ucyAqL1xuICBwcml2YXRlIF9ub3RhdGlvbkFjY2Vzc29yczogTWFwPHN0cmluZywgTm90YXRpb25BY2Nlc3Nvcj4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IodGVtcGxhdGU6IEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICBpZiAodGVtcGxhdGUgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZUVsZW1lbnQgPSB0ZW1wbGF0ZTtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IGNvbXBpbGVDYWNoZS5nZXQodGVtcGxhdGUpO1xuICAgICAgY29uc3QgY29tcGlsZWQgPSBjYWNoZWQgPz8gY29tcGlsZVRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgICAgIHRoaXMuX2NvbXBpbGVkID0gY29tcGlsZWQ7XG5cbiAgICAgIC8vIEFsd2F5cyBzZXQgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIHRvIG1vdmUgaXQgdG8gdGhlIGZyb250IG9mIHRoZSBjYWNoZVxuICAgICAgY29tcGlsZUNhY2hlLnNldCh0ZW1wbGF0ZSwgY29tcGlsZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb21waWxlZCA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8vIFByZXBhcmUgYSBmcmFnbWVudCBmcm9tIHRoZSBjb21waWxlZCBIVE1MIChjYWNoZWQpXG4gICAgY29uc3QgZnJhZ21lbnQgPSBodG1sVG9GcmFnbWVudCh0aGlzLl9jb21waWxlZC5odG1sKTtcbiAgICBjb25zdCBoeWRyYXRlZCA9IHByZXBhcmVDb21waWxlZFRlbXBsYXRlKHRoaXMuX2NvbXBpbGVkLCBmcmFnbWVudCk7XG5cbiAgICB0aGlzLl9wbGFuc0J5Tm90YXRpb24gPSBoeWRyYXRlZC5wbGFuc0J5Tm90YXRpb247XG4gICAgdGhpcy5fbm90YXRpb25BY2Nlc3NvcnMgPSBoeWRyYXRlZC5ub3RhdGlvbkFjY2Vzc29ycztcbiAgICB0aGlzLl9mcmFnbWVudCA9IGh5ZHJhdGVkLmZyYWdtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZ1bGwgY29weSBvZiB0aGlzIHRlbXBsYXRlIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRvIGFub3RoZXIgcm9vdFxuICAgKi9cbiAgY2xvbmUgPSAoKTogVGVtcGxhdGUgPT4ge1xuICAgIHJldHVybiBuZXcgVGVtcGxhdGUodGhpcy5lbGVtZW50KCkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBBbiB7QGxpbmsgSFRNTFRlbXBsYXRlRWxlbWVudH0gcmVwcmVzZW50aW5nIHRoaXMgdGVtcGxhdGVcbiAgICovXG4gIGVsZW1lbnQgPSAoKTogSFRNTFRlbXBsYXRlRWxlbWVudCA9PiB7XG4gICAgaWYgKHRoaXMuX3RlbXBsYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlRWxlbWVudDtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSB0aGlzLl9jb21waWxlZC5odG1sO1xuICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgfTtcblxuICBwcml2YXRlIF9jb2xsZWN0VXBkYXRlZFZhbHVlcyA9IChcbiAgICBjb250ZXh0OiBUZW1wbGF0ZUNvbnRleHQsXG4gICk6IE1hcDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICBjb25zdCB1cGRhdGVkVmFsdWVzID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG5cbiAgICBmb3IgKGNvbnN0IFtyYXdOb3RhdGlvbiwgYWNjZXNzb3JdIG9mIHRoaXMuX25vdGF0aW9uQWNjZXNzb3JzKSB7XG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gdGhpcy5fbGF0ZXN0UmVuZGVyZWRWYWx1ZXMuZ2V0KHJhd05vdGF0aW9uKTtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYWNjZXNzb3IoY29udGV4dCk7XG5cbiAgICAgIGlmIChwcmV2aW91c1ZhbHVlICE9PSBuZXdWYWx1ZSAmJiAhT2JqZWN0LmlzKHByZXZpb3VzVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgICB1cGRhdGVkVmFsdWVzLnNldChyYXdOb3RhdGlvbiwgbmV3VmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkVmFsdWVzO1xuICB9O1xuXG4gIHByaXZhdGUgX3VwZGF0ZShuZXdWYWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgY29uc3Qgc2NoZWR1bGVkUGxhbnM6IFNldDxBbnlSZW5kZXJQbGFuPiA9IG5ldyBTZXQoKTtcblxuICAgIGNvbnN0IGF0dHJpYnV0ZUpvYnM6IEF0dHJpYnV0ZVVwZGF0ZUpvYltdID0gW107XG4gICAgY29uc3QgY29udGVudFN3YXBKb2JzOiBDb250ZW50U3dhcEpvYltdID0gW107XG4gICAgY29uc3QgdGFnQ2hhbmdlSm9iczogVGFnQ2hhbmdlSm9iW10gPSBbXTtcbiAgICBjb25zdCBsaXN0UmVuZGVySm9iczogTGlzdFJlbmRlckpvYltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtub3RhdGlvbl0gb2YgbmV3VmFsdWVzKSB7XG4gICAgICBjb25zdCBhZmZlY3RlZFBsYW5zID0gdGhpcy5fcGxhbnNCeU5vdGF0aW9uLmdldChub3RhdGlvbik7XG5cbiAgICAgIGlmIChhZmZlY3RlZFBsYW5zKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGxhbiBvZiBhZmZlY3RlZFBsYW5zKSB7XG4gICAgICAgICAgaWYgKHNjaGVkdWxlZFBsYW5zLmhhcyhwbGFuKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2NoZWR1bGVkUGxhbnMuYWRkKHBsYW4pO1xuXG4gICAgICAgICAgc3dpdGNoIChwbGFuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhdHRyXCI6IHtcbiAgICAgICAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZUF0dHJpYnV0ZUpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUpvYnMucHVzaChqb2IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImVhY2hcIjoge1xuICAgICAgICAgICAgICBjb25zdCBqb2IgPSBwcmVwYXJlTGlzdFJlbmRlckpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgICAgICAgIGxpc3RSZW5kZXJKb2JzLnB1c2goam9iKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJzd2FwXCI6IHtcbiAgICAgICAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZUNvbnRlbnRTd2FwSm9iKHBsYW4sIG5ld1ZhbHVlcyk7XG4gICAgICAgICAgICAgIGlmIChqb2IgIT09IFNLSVBQRURfSk9CKSB7XG4gICAgICAgICAgICAgICAgY29udGVudFN3YXBKb2JzLnB1c2goam9iKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJ0YWdcIjoge1xuICAgICAgICAgICAgICBjb25zdCBqb2IgPSBwcmVwYXJlVGFnQ2hhbmdlSm9iKHBsYW4sIG5ld1ZhbHVlcyk7XG4gICAgICAgICAgICAgIGlmIChqb2IgIT09IFNLSVBQRURfSk9CKSB7XG4gICAgICAgICAgICAgICAgdGFnQ2hhbmdlSm9icy5wdXNoKGpvYik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgaW1wb3NzaWJsZSBnaXZlbiBhbiBleGhhdXN0aXZlIHN3aXRjaCBjYXNlXG4gICAgICAgICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcnVuQXR0cmlidXRlSm9icyhhdHRyaWJ1dGVKb2JzKTtcbiAgICBydW5MaXN0UmVuZGVySm9icyhsaXN0UmVuZGVySm9icyk7XG4gICAgcnVuQ29udGVudFN3YXBKb2JzKGNvbnRlbnRTd2FwSm9icyk7XG4gICAgcnVuVGFnQ2hhbmdlSm9icyh0YWdDaGFuZ2VKb2JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhpcyB0ZW1wbGF0ZSBpbnRvIGEgdGFyZ2V0IGhvc3QgZWxlbWVudC5cbiAgICovXG4gIHJlbmRlciA9IChyb290OiBUZW1wbGF0ZVJvb3QsIGNvbnRleHQ6IFRlbXBsYXRlQ29udGV4dCk6IHZvaWQgPT4ge1xuICAgIGlmIChyb290ICE9PSB0aGlzLl9tb3VudGVkUm9vdCkge1xuICAgICAgdGhpcy5fbW91bnRlZFJvb3QgPSByb290O1xuICAgICAgd2hpbGUgKHJvb3QuZmlyc3RDaGlsZCkge1xuICAgICAgICByb290LnJlbW92ZUNoaWxkKHJvb3QuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHJvb3QuYXBwZW5kKHRoaXMuX2ZyYWdtZW50KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZFZhbHVlcyA9IHRoaXMuX2NvbGxlY3RVcGRhdGVkVmFsdWVzKGNvbnRleHQpO1xuXG4gICAgaWYgKHJlc29sdmVkVmFsdWVzLnNpemUgIT09IDApIHtcbiAgICAgIHRoaXMuX3VwZGF0ZShyZXNvbHZlZFZhbHVlcyk7XG5cbiAgICAgIC8vIFNhdmUgdGhlIHZhbHVlcyB0aGF0IHdlcmUgdXNlZCBmb3IgdGhpcyByZW5kZXIgaWYgdGhlIHJlbmRlciBzdWNjZWVkZWRcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiByZXNvbHZlZFZhbHVlcykge1xuICAgICAgICB0aGlzLl9sYXRlc3RSZW5kZXJlZFZhbHVlcy5zZXQoa2V5LCB2YWwpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBlbGVtZW50TWF0Y2hlcyB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHR5cGUgeyBDb21wb25lbnQgfSBmcm9tIFwiLi9jb21wb25lbnRcIjtcblxuZXhwb3J0IHR5cGUgRXZlbnROYW1lID0ga2V5b2YgR2xvYmFsRXZlbnRIYW5kbGVyc0V2ZW50TWFwO1xuZXhwb3J0IHR5cGUgRXZlbnRIYW5kbGVyPEsgZXh0ZW5kcyBFdmVudE5hbWUgPSBFdmVudE5hbWU+ID0gKFxuICBldmVudDogR2xvYmFsRXZlbnRIYW5kbGVyc0V2ZW50TWFwW0tdLFxuKSA9PiB2b2lkO1xuXG50eXBlIEV2ZW50SGFuZGxlck1hcCA9IE1hcDxzdHJpbmcsIEV2ZW50SGFuZGxlcj47XG5cbi8qKlxuICogTWFuYWdlZCBldmVudCBkZWxlZ2F0aW9uIHRvIGNvYWxlc2NlIGV2ZW50IGxpc3RlbmVycyBmb3IgYW4gZW50aXJlIHRyZWUgaW50b1xuICogc2luZ2xlIHJvb3QtbGV2ZWwgbGlzdGVuZXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBMaXN0ZW4gZm9yIGV2ZW50cyBmcm9tIGFueSBjaGlsZCBlbGVtZW50IG9mIHRoZSBkZWxlZ2F0ZWQgcm9vdFxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRlbGVnYXRvciA9IG5ldyBFdmVudERlbGVnYXRvcigkcm9vdCk7XG4gKiBkZWxlZ2F0b3IuYWRkRGVsZWdhdGVkTGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGljayk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogTGlzdGVuIGZvciBldmVudHMgZnJvbSBjaGlsZCBlbGVtZW50cyBtYXRjaGluZyBgLmFjdGlvbmBcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBkZWxlZ2F0b3IgPSBuZXcgRXZlbnREZWxlZ2F0b3IoJHJvb3QpO1xuICogZGVsZWdhdG9yLmFkZERlbGVnYXRlZExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2xpY2ssIFwiLmFjdGlvblwiKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRXZlbnREZWxlZ2F0b3Ige1xuICBzdGF0aWMgbmV4dExpc3RlbmVySWQgPSAwO1xuXG4gIHN0YXRpYyBwcm9jZXNzVGFyZ2V0RGVzY3JpcHRvcihcbiAgICB0YXJnZXREZXNjcmlwdG9yOiBzdHJpbmcgfCB0eXBlb2YgQ29tcG9uZW50PGFueT4gfCBIVE1MRWxlbWVudCxcbiAgKTogc3RyaW5nIHtcbiAgICAvLyBDcmVhdGUgYSBxdWVyeSBmaWx0ZXIgZnJvbSB0aGUgdGFyZ2V0IGRlc2NyaXB0b3JcbiAgICBpZiAodGFyZ2V0RGVzY3JpcHRvciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgYW4gSUQsIHVzZSB0aGF0XG4gICAgICBpZiAodGFyZ2V0RGVzY3JpcHRvci5pZC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGAjJHt0YXJnZXREZXNjcmlwdG9yLmlkfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBnZW5lcmF0ZWRJZCA9IGBsaXN0ZW4tJHtFdmVudERlbGVnYXRvci5uZXh0TGlzdGVuZXJJZCsrfWA7XG4gICAgICAgIHRhcmdldERlc2NyaXB0b3Iuc2V0QXR0cmlidXRlKFwiZGF0YS1saXN0ZW5lci1pZFwiLCBnZW5lcmF0ZWRJZCk7XG4gICAgICAgIHJldHVybiBgW2RhdGEtbGlzdGVuZXItaWQ9XCIke2dlbmVyYXRlZElkfVwiXWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0RGVzY3JpcHRvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBpZiAodGFyZ2V0RGVzY3JpcHRvci50YWdOYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbQ29tcG9uZW50XSBBdXRvbWF0aWMgbGlzdGVuZXIgc2V0dXAgZmFpbHVyZTogQ29tcG9uZW50ICR7dGFyZ2V0RGVzY3JpcHRvci5uYW1lfSBoYXMgbm8gZGVmaW5lZCB0YWduYW1lYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSB0YXJnZXQgZGVzY3JpcHRvciBpcyBhIENvbXBvbmVudCBjbGFzcywgcHVsbCB0aGUgdGFnbmFtZVxuICAgICAgcmV0dXJuIHRhcmdldERlc2NyaXB0b3IudGFnTmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0RGVzY3JpcHRvcjtcbiAgfVxuXG4gIHByaXZhdGUgX3Jvb3Q6IEhUTUxFbGVtZW50IHwgU2hhZG93Um9vdCB8IERvY3VtZW50O1xuICBwcml2YXRlIF9yb290TGlzdGVuZXJzOiBFdmVudEhhbmRsZXJNYXAgPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX2V2ZW50czogTWFwPHN0cmluZywgTWFwPHN0cmluZywgU2V0PEV2ZW50SGFuZGxlcj4+PiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3Rvcihyb290OiBIVE1MRWxlbWVudCB8IFNoYWRvd1Jvb3QgfCBEb2N1bWVudCA9IGRvY3VtZW50KSB7XG4gICAgdGhpcy5fcm9vdCA9IHJvb3Q7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVyc0ZvckV2ZW50KGV2ZW50OiBzdHJpbmcpOiBNYXA8c3RyaW5nLCBTZXQ8RXZlbnRIYW5kbGVyPj4ge1xuICAgIGxldCBoYW5kbGVyTWFwID0gdGhpcy5fZXZlbnRzLmdldChldmVudCk7XG5cbiAgICBpZiAoaGFuZGxlck1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYW5kbGVyTWFwID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5fZXZlbnRzLnNldChldmVudCwgaGFuZGxlck1hcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZXJNYXA7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVyc0ZvckV2ZW50QW5kUXVlcnk8RSBleHRlbmRzIEV2ZW50TmFtZT4oXG4gICAgZXZlbnQ6IEUsXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgKTogU2V0PEV2ZW50SGFuZGxlcjxFPj4ge1xuICAgIGNvbnN0IGhhbmRsZXJNYXAgPSB0aGlzLl9oYW5kbGVyc0ZvckV2ZW50KGV2ZW50KTtcbiAgICBsZXQgaGFuZGxlclNldCA9IGhhbmRsZXJNYXAuZ2V0KHF1ZXJ5KTtcblxuICAgIGlmIChoYW5kbGVyU2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhbmRsZXJTZXQgPSBuZXcgU2V0KCk7XG4gICAgICBoYW5kbGVyTWFwLnNldChxdWVyeSwgaGFuZGxlclNldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZXJTZXQ7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVSb290TGlzdGVuZXIoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcm9vdExpc3RlbmVycy5oYXMoZXZlbnROYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxpc3RlbmVyID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlcnNGb3JFdmVudCA9IHRoaXMuX2hhbmRsZXJzRm9yRXZlbnQoZXZlbnROYW1lKTtcbiAgICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBldmVudDtcblxuICAgICAgaWYgKHRhcmdldCA9PT0gbnVsbCB8fCAhKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsID0gdGFyZ2V0O1xuXG4gICAgICBsZXQgc3RvcEltbWVkaWF0ZUNhbGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3Qgb3JpZ2luYWxGbiA9IGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjtcbiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9ICgpID0+IHtcbiAgICAgICAgb3JpZ2luYWxGbi5jYWxsKGV2ZW50KTtcbiAgICAgICAgc3RvcEltbWVkaWF0ZUNhbGxlZCA9IHRydWU7XG4gICAgICB9O1xuXG4gICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICBpZiAobm9kZSA9PT0gdGhpcy5fcm9vdCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBpbnZhbGlkIGVsZW1lbnRzXG4gICAgICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbnZva2UgaGFuZGxlcnNcbiAgICAgICAgZm9yIChjb25zdCBbcXVlcnksIGhhbmRsZXJzXSBvZiBoYW5kbGVyc0ZvckV2ZW50KSB7XG4gICAgICAgICAgaWYgKHF1ZXJ5ID09PSBcIipcIiB8fCBlbGVtZW50TWF0Y2hlcyhub2RlLCBxdWVyeSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwobm9kZSwgZXZlbnQpO1xuXG4gICAgICAgICAgICAgIC8vIFJlc3BlY3QgLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpIGFuZCAucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICBpZiAoc3RvcEltbWVkaWF0ZUNhbGxlZCB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzcGVjdCAuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgaWYgKGV2ZW50LmNhbmNlbEJ1YmJsZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgaWYgKG5vZGUgPT09IHRoaXMuX3Jvb3QgfHwgbm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLl9yb290TGlzdGVuZXJzLnNldChldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB0aGlzLl9yb290LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gIH1cblxuICBhZGRMaXN0ZW5lcjxFIGV4dGVuZHMgRXZlbnROYW1lPihcbiAgICBldmVudE5hbWU6IEUsXG4gICAgaGFuZGxlcjogRXZlbnRIYW5kbGVyPEU+LFxuICAgIHF1ZXJ5RmlsdGVyOiBzdHJpbmcgPSBcIipcIixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5faGFuZGxlcnNGb3JFdmVudEFuZFF1ZXJ5KGV2ZW50TmFtZSwgcXVlcnlGaWx0ZXIpLmFkZChoYW5kbGVyKTtcbiAgICB0aGlzLl9jcmVhdGVSb290TGlzdGVuZXIoZXZlbnROYW1lKTtcbiAgfVxuXG4gIHJlbW92ZUxpc3RlbmVyKFxuICAgIGV2ZW50TmFtZTogRXZlbnROYW1lLFxuICAgIGhhbmRsZXI6IEV2ZW50SGFuZGxlcixcbiAgICBxdWVyeUZpbHRlcjogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBoYW5kbGVyU2V0ID0gdGhpcy5faGFuZGxlcnNGb3JFdmVudEFuZFF1ZXJ5KGV2ZW50TmFtZSwgcXVlcnlGaWx0ZXIpO1xuICAgIGhhbmRsZXJTZXQuZGVsZXRlKGhhbmRsZXIpO1xuXG4gICAgLy8gSWYgdGhhdCB3YXMgdGhlIGxhc3QgaGFuZGxlciBmb3IgdGhhdCBldmVudC9xdWVyeSBjb21ibywgZGVsZXRlIHRoZSBzZXRcbiAgICBpZiAoaGFuZGxlclNldC5zaXplID09PSAwKSB7XG4gICAgICBjb25zdCBldmVudEhhbmRsZXJTZXRzID0gdGhpcy5faGFuZGxlcnNGb3JFdmVudChldmVudE5hbWUpO1xuICAgICAgZXZlbnRIYW5kbGVyU2V0cy5kZWxldGUocXVlcnlGaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFudXAgPSAoKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBbZXZlbnQsIGhhbmRsZXJdIG9mIHRoaXMuX3Jvb3RMaXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMuX3Jvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlcik7XG4gICAgfVxuXG4gICAgdGhpcy5fcm9vdExpc3RlbmVycy5jbGVhcigpO1xuICB9O1xufVxuIiwKICAgICIvKlxuICogQ29weXJpZ2h0IMKpIFJ1c3RpYyBBcmNhZGUsIExMQyAyMDI2XG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IGNzcyB9IGZyb20gXCIjaGVscGVyXCI7XG5pbXBvcnQgeyBTdGF0ZSB9IGZyb20gXCIjc3RhdGVcIjtcbmltcG9ydCB7IFRlbXBsYXRlLCB0eXBlIFRlbXBsYXRlQ29udGV4dCB9IGZyb20gXCIjdGVtcGxhdGVcIjtcbmltcG9ydCB7IGNyZWF0ZUF0dHJpYnV0ZU1hcCwgc2VyaWFsaXplQXR0cmlidXRlIH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQgeyBFdmVudERlbGVnYXRvciwgdHlwZSBFdmVudEhhbmRsZXIsIHR5cGUgRXZlbnROYW1lIH0gZnJvbSBcIi4vZGVsZWdhdG9yXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dHJpYnV0ZU1hcCxcbiAgQ29tcG9uZW50U3R5bGVzLFxuICBDb21wdXRlZFByb3BlcnRpZXMsXG4gIExpdmVBdHRyaWJ1dGVzLFxuICBTdGF0ZUluaXRpYWxpemVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBNQVhfU0VRVUVOVElBTF9SRU5ERVJTID0gMTAwO1xuY29uc3QgQkxBTktfVEVNUExBVEUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5cbnR5cGUgSW50ZXJuYWxSZW5kZXJTdGF0dXMgPSB7XG4gIHdpbGxSZW5kZXI6IGJvb2xlYW47XG4gIGlzUmVuZGVyaW5nOiBib29sZWFuO1xuICBzZXF1ZW50aWFsUmVuZGVyczogbnVtYmVyO1xuICBwb3N0UmVuZGVyQ2FsbGJhY2tzOiBTZXQ8Vm9pZEZ1bmN0aW9uPjtcbiAgbGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwOiBBdHRyaWJ1dGVNYXA7XG4gIHRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzOiBBdHRyaWJ1dGVNYXA7XG59O1xuXG4vKipcbiAqIFRoZSAqKkNvbXBvbmVudCoqIGNsYXNzIGV4dGVuZHMgdGhlIGJhc2UgSFRNTEVsZW1lbnQgY2xhc3MgdG8gcHJvdmlkZSBhblxuICogZXJnb25vbWljIHdheSB0byBkZXNpZ24gYW5kIGRldmVsb3AgV2ViIENvbXBvbmVudHMgd2l0aCByZWFjdGl2ZSBzdGF0ZSxcbiAqIG1hbmFnZWQgYXR0cmlidXRlcywgYW5kIGR5bmFtaWMgdGVtcGxhdGluZy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbXBvbmVudDxcbiAgU3RhdGVTaGFwZSBleHRlbmRzIG9iamVjdCA9IHt9LFxuPiBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgLy8g4pWt4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWuXG4gIC8vIOKUgiAgICAgICAgICAgICAgICAgU3RhdGljIEhlbHBlciBNZXRob2RzICAgICAgICAgICAgICAgICAg4pSCXG4gIC8vIOKVsOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVr1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIENvbXBvbmVudCB3aXRoIHRoZSBicm93c2VyLiBPcHRpb25hbGx5IHByb3ZpZGUgYW4gb3ZlcnJpZGluZ1xuICAgKiB0YWcgbmFtZS5cbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcihcbiAgICBjb21wb25lbnQ6IEN1c3RvbUVsZW1lbnRDb25zdHJ1Y3RvciB8IHR5cGVvZiBDb21wb25lbnQsXG4gICAgdGFnTmFtZT86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgICAgdHlwZW9mIHdpbmRvdy5jdXN0b21FbGVtZW50cyA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQUxJRF9FTlYpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudFRhZ25hbWUgPVxuICAgICAgXCJ0YWdOYW1lXCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQudGFnTmFtZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNvbXBvbmVudC50YWdOYW1lXG4gICAgICAgIDogbnVsbDtcbiAgICBjb25zdCBjb21wdXRlZFRhZ25hbWUgPSB0YWdOYW1lID8/IGNvbXBvbmVudFRhZ25hbWU7XG5cbiAgICBpZiAoXG4gICAgICBjb21wdXRlZFRhZ25hbWUgPT09IG51bGwgfHxcbiAgICAgIGNvbXB1dGVkVGFnbmFtZS5sZW5ndGggPT09IDAgfHxcbiAgICAgICFjb21wdXRlZFRhZ25hbWUuaW5jbHVkZXMoXCItXCIpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBTElEX1RBR05BTUUpO1xuICAgIH1cblxuICAgIGlmICh3aW5kb3cuY3VzdG9tRWxlbWVudHMuZ2V0KGNvbXB1dGVkVGFnbmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLkRVUEVfVEFHTkFNRSwgdGFnTmFtZSA/PyBcIlwiKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgYW55IGxpdmUgYXR0cmlidXRlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIG9ic2VydmVkQXR0cmlidXRlc1xuXG4gICAgd2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgICAgIGNvbXB1dGVkVGFnbmFtZSxcbiAgICAgIGNvbXBvbmVudCBhcyBDdXN0b21FbGVtZW50Q29uc3RydWN0b3IsXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgU3RhdGljIENvbXBvbmVudCBDb25maWd1cmF0aW9uIFByb3BlcnRpZXMgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICAvKipcbiAgICogVGhlIEhUTUwgdGFnIG5hbWUgdG8gdXNlIGZvciB0aGlzIENvbXBvbmVudFxuICAgKi9cbiAgc3RhdGljIHRhZ05hbWU6IHN0cmluZyA9IFwiXCI7XG5cbiAgLyoqXG4gICAqIEFuIEhUTUwgVGVtcGxhdGUgZWxlbWVudCBmb3IgdGhpcyBlbGVtZW50IHRvIHVzZS5cbiAgICovXG4gIHN0YXRpYyB0ZW1wbGF0ZTogSFRNTFRlbXBsYXRlRWxlbWVudCB8IFRlbXBsYXRlID0gQkxBTktfVEVNUExBVEU7XG5cbiAgLyoqXG4gICAqIEEge0BsaW5rIENTU1N0eWxlU2hlZXR9IGFycmF5IG9yIHN0cmluZyB0byBhZG9wdCBhcyB0aGUgY29tcG9uZW50J3Mgc2NvcGVkIHN0eWxlc1xuICAgKi9cbiAgc3RhdGljIHN0eWxlczogQ29tcG9uZW50U3R5bGVzID0gW107XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIGh0bWwgYXR0cmlidXRlIG5hbWVzIHRvIG9ic2VydmUgdG8gdHJpZ2dlciB1cGRhdGVzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiB5b3UgdXNlIHRoZSB7QGxpbmsgZGVmaW5lfSBmYWN0b3J5IGhlbHBlciwgdGhpcyB2YWx1ZSB3aWxsIGJlXG4gICAqIGF1dG9tYXRpY2FsbHkgbWVyZ2VkIHdpdGggYSBsaXN0IG9mIGFueSBkZWZpbmVkIHtAbGluayBsaXZlQXR0cmlidXRlc30uXG4gICAqL1xuICBzdGF0aWMgb2JzZXJ2ZWRBdHRyaWJ1dGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBmb3IgdGhpcyBDb21wb25lbnQncyBTaGFkb3dSb290LlxuICAgKlxuICAgKiAtIGBcIm9wZW5cImAgYWxsb3dzIEpTIGFjY2VzcyB0byB0aGUgY2hpbGRyZW4gb2YgdGhpcyBjb21wb25lbnRcbiAgICogLSBgXCJjbG9zZWRcImAgKGRlZmF1bHQpIGRpc2FsbG93cyBpbnRlcm5hbCBKUyBhY2Nlc3NcbiAgICovXG4gIHN0YXRpYyBzaGFkb3dSb290TW9kZTogXCJjbG9zZWRcIiB8IFwib3BlblwiID0gXCJjbG9zZWRcIjtcblxuICAvLyDila3ilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila5cbiAgLy8g4pSCICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlIFByb3BlcnRpZXMgICAgICAgICAgICAgICAgICDilIJcbiAgLy8g4pWw4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWvXG5cbiAgLyoqXG4gICAqIFByaW1hcnkgc2NyaXB0aW5nIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICpcbiAgICogVXNlIGBzY3JpcHQoKWAgdG8gZGVmaW5lIHByaW1hcnkgYmVoYXZpb3JzLCBsaXN0ZW5lcnMsIGFuZCBpbml0aWFsaXphdGlvbnMuXG4gICAqXG4gICAqIElmIG5lZWQgYmUsIHJldHVybiBhIGZ1bmN0aW9uIHRvIGF1dG9tYXRpY2FsbHkgY2FsbCB3aGVuIHRoZSBjb21wb25lbnQgaXNcbiAgICogdW5tb3VudGluZyBmb3IgY2xlYW51cCBzY3JpcHRzLiBBbHRlcm5hdGl2ZWx5LCB1c2Uge0BsaW5rIGZpbmFsaXplfSBmb3JcbiAgICogY2xlYW51cCB0YXNrcywgd2hpY2ggd2lsbCBhbHdheXMgcnVuIGxhc3QsIGV2ZW4gYWZ0ZXIgdGhlIHJldHVybmVkIGZ1bmN0aW9uXG4gICAqIGZyb20gc2NyaXB0KCkuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2NyaXB0PygpOiBWb2lkRnVuY3Rpb24gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGVhY2ggdGVtcGxhdGUgdXBkYXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgYmVmb3JlVXBkYXRlPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZWFjaCB0ZW1wbGF0ZSB1cGRhdGVcbiAgICovXG4gIHByb3RlY3RlZCBhZnRlclVwZGF0ZT8ocHJldmlvdXNBdHRyaWJ1dGVzOiBBdHRyaWJ1dGVNYXApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYXMgdGhlIGZpbmFsIGxpZmVjeWNsZSBtZXRob2QgYXQgdGhlIGVuZCBvZiB0aGUgdW5tb3VudGluZyBwcm9jZXNzLlxuICAgKlxuICAgKiBDb250ZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGFuZCB0aGUgY29tcG9uZW50IGlzIG5vIGxvbmdlclxuICAgKiBjb25zaWRlcmVkIG1vdW50ZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIHJ1bnMuXG4gICAqXG4gICAqIFVzZSB0aGlzIGZvciBmaW5hbCBjbGVhbnVwIHRhc2tzIGFuZCBmcmVlaW5nIHJlc291cmNlcy5cbiAgICovXG4gIHByb3RlY3RlZCBmaW5hbGl6ZT8oKTogdm9pZDtcblxuICAvKipcbiAgICogSWYgZGVmaW5lZCwgcmVjZWl2ZXMgZXJyb3JzIGNhdWdodCBkdXJpbmcgdGhlIGxpZmVjeWNsZSBtZXRob2RzIG9mIHRoaXNcbiAgICogY29tcG9uZW50IGFuZCBpdCdzIGNoaWxkcmVuLiBJZiBub3QgZGVmaW5lZCwgdGhpcyBjb21wb25lbnQgd2lsbCBpbnN0ZWFkXG4gICAqIHRocm93IGVycm9ycyBhcyB0aGV5IGFyZSBmb3VuZC5cbiAgICpcbiAgICogSWYgdGhlIGVycm9yIGNhbm5vdCBiZSBoYW5kbGVkLCBgb25FcnJvcigpYCBzaG91bGQgcmUtdGhyb3cgaXQgZm9yIGEgaGlnaGVyXG4gICAqIHVwIGNvbXBvbmVudCB0byBldmFsdWF0ZS5cbiAgICpcbiAgICogVG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIHdoaWxlIHJlbW92aW5nIGFuIGVycm9yaW5nIGNvbXBvbmVudCBmcm9tIHRoZVxuICAgKiBET00sIHVzZSBgdGhpcy5yZXBsYWNlV2l0aCgpYCBhbmQgYSBuZXdseSBjb25zdHJ1Y3RlZCBwbGFjZWhvbGRlciBlbGVtZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBSZWNvdmVyaW5nIGZyb20gZXJyb3JzIG9yIGRpc3BsYXlpbmcgYSBmYWxsYmFja1xuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG9uRXJyb3IoZXJyb3IpIHtcbiAgICogICAvLyBIYW5kbGUga25vd24gZXJyb3JzXG4gICAqICAgaWYgKGVycm9yLm1lc3NhZ2UgPSBcIkludmFsaWQgSW5wdXRcIikge1xuICAgKiAgICAgdGhpcy5zdGF0ZS5pbnB1dCA9IFwiXCI7XG4gICAqICAgICByZXR1cm47XG4gICAqICAgfVxuICAgKlxuICAgKiAgIC8vIERpc3BsYXkgYSBmYWxsYmFjayBiYW5uZXJcbiAgICogICBjb25zdCBiYW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgKiAgIGJhbm5lci50ZXh0Q29udGVudCA9IFwiQW4gdW5leHBlY3RlZCBlcnJvciBkb25lIGRpZFwiO1xuICAgKiAgIHRoaXMucmVwbGFjZVdpdGgoYmFubmVyKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHByb3RlY3RlZCBvbkVycm9yPyhlcnJvcjogdW5rbm93bik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGlzIENvbXBvbmVudCdzIHJlYWN0aXZlIGludGVybmFsIHN0YXRlLCBpZiBhbnkuXG4gICAqXG4gICAqIElmIGBpbml0aWFsU3RhdGVgIGlzIGRlZmluZWQgYXMgYSBmdW5jdGlvbiwgdGhlIGZ1bmN0aW9uIGlzIGV2YWx1YXRlZCBhdFxuICAgKiBtb3VudGluZyB0aW1lIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGluaXRpYWwgc3RhdGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdGlhbFN0YXRlPzogU3RhdGVJbml0aWFsaXplcjxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogQW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHJldHVybmluZyBhbiBvYmplY3Qgd2hpY2ggcG9wdWxhdGVzIHRoZSBgZGF0YWAgdmFsdWVzXG4gICAqIGluIHRoZSB0ZW1wbGF0aW5nIGVuZ2luZS4gU3VjaCB2YWx1ZXMgYXJlIGFjY2Vzc2VkIHVzaW5nIHRoZSBgKmAgbm90YXRpb24uXG4gICAqXG4gICAqIFdoZW4gYSBob3N0ZWQgdmFsdWUgaXMgYWNjZXNzZWQsIGl0J3MgdmFsdWUgaXMgY29lcmNlZCBiYXNlZCBvbiB0aGUgd2F5IGl0XG4gICAqIGlzIGJlaW5nIHVzZWQuIEZvciBhdHRyaWJ1dGVzLCB2YWx1ZXMgYXJlIHNlcmlhbGl6ZWQgdG8gYSBzdHJpbmcgb3IgbnVsbCxcbiAgICogd2hpY2ggd2lsbCBzZXQgdGhlIGF0dHJpYnV0ZSAoc3RyaW5nKSBvciByZW1vdmUgaXQgKG51bGwpLlxuICAgKlxuICAgKiBGb3IgY29udGVudCBzd2Fwcywgc3RyaW5ncywgbnVtYmVycyBhbmQgYm9vbGVhbnMgYXJlIHJlbmRlcmVkIGFzIHN0cmluZ3NcbiAgICogYW5kIHNldCBhcyB0ZXh0Q29udGVudC4gbnVsbCBhbmQgdW5kZWZpbmVkIHZhbHVlcyByZW5kZXIgbm90aGluZyAod2l0aCBhXG4gICAqIGNvbW1lbnQgcGxhY2Vob2xkZXIpLCBhbiBIVE1MRWxlbWVudCB3aWxsIGJlIHN3YXBwZWQgaW4gYXMgYSBjbG9uZWQgbm9kZS5cbiAgICpcbiAgICogRnVuY3Rpb25zIGFyZSBldmFsdWF0ZWQgYXQgcmVuZGVyL3VwZGF0ZSB0aW1lLCBhbmQgdGhlaXIgcmV0dXJuIHZhbHVlIGlzXG4gICAqIHVzZWQgaW5zdGVhZC4gRnVuY3Rpb25zIGFyZSBwYXNzZWQgdGhlIGN1cnJlbnQgdGFyZ2V0IG5vZGUgYWNjZXNzaW5nIHRoZVxuICAgKiBwcm9wZXJ0eSBhcyBpdHMgZmlyc3QgYW5kIG9ubHkgYXJndW1lbnQuXG4gICAqXG4gICAqIE90aGVyIHR5cGVzIGFyZSB1bnN1cHBvcnRlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBob3N0ID0ge1xuICAgKiAgIGF2YXRhclVybDogXCJodHRwOi8vLi4uXCIsXG4gICAqICAgcmVuZGVyVGltZTogKCkgPT4gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBgYGBodG1sXG4gICAqIDxpbWcgOnNyYz1cIiphdmF0YXJVcmxcIiAvPlxuICAgKiA8c3Bhbj5SZW5kZXJlZCBhdCAke1wiKnJlbmRlclRpbWVcIn08L3NwYW4+XG4gICAqIGBgYFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbXB1dGVkUHJvcGVydGllcz86IENvbXB1dGVkUHJvcGVydGllczxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogRGVjbGFyYXRpb24gb2YgYXR0cmlidXRlIGJlaGF2aW9ycyBkdXJpbmcgdXBkYXRlcy5cbiAgICpcbiAgICogRWFjaCBrZXkgaXMgdGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlLiBWYWx1ZXMgYXJlIGFuIG9iamVjdCB3aXRoIHR3b1xuICAgKiBvcHRpb25hbCBmdW5jdGlvbiBkZWZpbml0aW9uczpcbiAgICpcbiAgICogYG9uQ2hhbmdlKG5ld1ZhbHVlLCBvbGRWYWx1ZSk6IHZvaWRgLCBhIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHdoZW4gdGhlIHZhbHVlXG4gICAqIG9mIHRoaXMgYXR0cmlidXRlIGhhcyBjaGFuZ2VkLiBSdW5zIG9uY2UgcGVyIHVwZGF0ZSBjeWNsZSwgKmJlZm9yZSogdGhlXG4gICAqIHVwZGF0ZSBvY2N1cnMuXG4gICAqXG4gICAqIGByZWZsZWN0KCk6IHVua25vd25gLCBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSB2YWx1ZSB0byBzZXJpYWxpemUgYW5kIHNldFxuICAgKiBhcyB0aGlzIGF0dHJpYnV0ZSAqYWZ0ZXIqIGFuIHVwZGF0ZSBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbGl2ZUF0dHJpYnV0ZXMgPSB7XG4gICAqICAgZG9uZToge1xuICAgKiAgICAgb25DaGFuZ2UobmV3VmFsdWUpIHtcbiAgICogICAgICAgdGhpcy5zdGF0ZS5zZXQoXCJkb25lXCIsICEhbmV3VmFsdWUpO1xuICAgKiAgICAgfSxcbiAgICogICAgIHJlZmxlY3QoKSB7IHJldHVybiB0aGlzLnN0YXRlLmN1cnJlbnQuZG9uZSB9XG4gICAqICAgfVxuICAgKiB9O1xuICAgKiBgYGBcbiAgICpcbiAgICogQHJlbWFya3NcbiAgICpcbiAgICogSWYgdXNpbmcgdGhlIHtAbGluayBkZWZpbmV9IGhlbHBlciwgdGhlIGtleXMgb2YgdGhpcyBwcm9wZXJ0eSBhcmVcbiAgICogYXV0b21hdGljYWxseSBtZXJnZWQgd2l0aCBhbnkgZGVmaW5lZCB7QGxpbmsgb2JzZXJ2ZWRBdHRyaWJ1dGVzfS5cbiAgICpcbiAgICogSWYgeW91IGFyZSBkaXJlY3RseSBleHRlbmRpbmcgdGhlIGNsYXNzLCBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBtdXN0IGJlXG4gICAqIGV4cGxpY2l0bHkgZGVmaW5lZCB3aXRoIGFueSBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIG1vbml0b3JlZCwgcmVnYXJkbGVzc1xuICAgKiBvZiBpZiB0aGV5J3JlIGRlZmluZWQgaGVyZS5cbiAgICovXG4gIHByb3RlY3RlZCBsaXZlQXR0cmlidXRlcz86IExpdmVBdHRyaWJ1dGVzPFN0YXRlU2hhcGU+O1xuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgICAgICAgICBJbnRlcm5hbCBTdGF0ZSBNYW5hZ2VtZW50ICAgICAgICAgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICBwcml2YXRlIF9pc0NvbXBvbmVudE1vdW50ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdGVtcGxhdGU6IFRlbXBsYXRlO1xuICBwcml2YXRlIF9yb290OiBTaGFkb3dSb290O1xuICBwcml2YXRlIF9zdGF0ZT86IFN0YXRlPFN0YXRlU2hhcGU+O1xuICBwcml2YXRlIF9kZWxlZ2F0b3I/OiBFdmVudERlbGVnYXRvcjtcbiAgcHJpdmF0ZSBfb3duTGlzdGVuZXJzOiBTZXQ8e1xuICAgIGhhbmRsZXI6IEV2ZW50SGFuZGxlcjtcbiAgICBldmVudDogRXZlbnROYW1lO1xuICB9PiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBfbGl2ZUF0dHJpYnV0ZUNvbmZpZ3M6IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgTGl2ZUF0dHJpYnV0ZXM8U3RhdGVTaGFwZT5bc3RyaW5nXVxuICA+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9jbGVhbnVwRm4/OiBWb2lkRnVuY3Rpb247XG5cbiAgcHJpdmF0ZSBfcmVuZGVySW50ZXJuYWxzOiBJbnRlcm5hbFJlbmRlclN0YXR1cyA9IHtcbiAgICB3aWxsUmVuZGVyOiBmYWxzZSxcblxuICAgIC8qKiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSByZW5kZXIvdXBkYXRlIHByb2Nlc3MgaXMgYWN0aXZlbHkgcnVubmluZyAqL1xuICAgIGlzUmVuZGVyaW5nOiBmYWxzZSxcbiAgICBzZXF1ZW50aWFsUmVuZGVyczogMCxcbiAgICBwb3N0UmVuZGVyQ2FsbGJhY2tzOiBuZXcgU2V0KCksXG4gICAgbGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwOiBuZXcgTWFwKCksXG4gICAgdHJhY2tlZEF0dHJpYnV0ZUNoYW5nZXM6IG5ldyBNYXAoKSxcbiAgfTtcblxuICAvLyDila3ilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila5cbiAgLy8g4pSCICAgICAgICAgICAgIEludGVybmFscyBhbmQgUHJpdmF0ZSBNZXRob2RzICAgICAgICAgICAgICDilIJcbiAgLy8g4pWw4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWvXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnN0IHsgdGVtcGxhdGUsIHN0eWxlcywgc2hhZG93Um9vdE1vZGUgfSA9IHRoaXNcbiAgICAgIC5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQ29tcG9uZW50O1xuXG4gICAgLy8gTm9ybWFsaXplIHN0eWxlcyB0byBhbiBhcnJheSBvZiBDU1NTdHlsZVNoZWV0IG9iamVjdHNcbiAgICBjb25zdCBuZXdTdHlsZXMgPSBBcnJheS5pc0FycmF5KHN0eWxlcylcbiAgICAgID8gc3R5bGVzXG4gICAgICA6IHR5cGVvZiBzdHlsZXMgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBbc3R5bGVzXVxuICAgICAgICA6IFtjc3NgJHtzdHlsZXN9YF07XG5cbiAgICB0aGlzLl9yb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiBzaGFkb3dSb290TW9kZSB9KTtcbiAgICB0aGlzLl9yb290LmFkb3B0ZWRTdHlsZVNoZWV0cy5wdXNoKC4uLm5ld1N0eWxlcyk7XG4gICAgdGhpcy5fdGVtcGxhdGUgPVxuICAgICAgdGVtcGxhdGUgaW5zdGFuY2VvZiBUZW1wbGF0ZSA/IHRlbXBsYXRlIDogbmV3IFRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgfVxuXG4gIC8qKiBQcm9kdWNlIHRoZSBkYXRhIG9iamVjdCB0byBwYXNzIHRvIHRoZSB0ZW1wbGF0ZSdzIHJlbmRlciBmdW5jdGlvbiAqL1xuICBwcml2YXRlIF9nZXRSZW5kZXJDb250ZXh0KGF0dHI6IEF0dHJpYnV0ZU1hcCk6IFRlbXBsYXRlQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHI6IE9iamVjdC5mcm9tRW50cmllcyhhdHRyKSxcbiAgICAgIGRhdGE6XG4gICAgICAgIHR5cGVvZiB0aGlzLmNvbXB1dGVkUHJvcGVydGllcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0aGlzLmNvbXB1dGVkUHJvcGVydGllcygpXG4gICAgICAgICAgOiB0aGlzLmNvbXB1dGVkUHJvcGVydGllcyxcbiAgICAgIHN0YXRlOiB0aGlzLl9zdGF0ZSA/IHRoaXMuX3N0YXRlLmN1cnJlbnQgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2VzY2FsYXRlRXJyb3IoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSB0aGlzLnBhcmVudE5vZGU7XG5cbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgaWYgKFxuICAgICAgICBub2RlIGluc3RhbmNlb2YgQ29tcG9uZW50ICYmXG4gICAgICAgIFwib25FcnJvclwiIGluIG5vZGUgJiZcbiAgICAgICAgdHlwZW9mIG5vZGUub25FcnJvciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICApIHtcbiAgICAgICAgbm9kZS5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICBub2RlID0gbm9kZS5ob3N0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCB0byBlc2NhbGF0ZSB0bywgdGhyb3cgdGhlIGVycm9yXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIF9yZXBvcnRFcnJvcihlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vbkVycm9yKSB7XG4gICAgICB0aGlzLl9lc2NhbGF0ZUVycm9yKGVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9leGVjdXRlQXR0cmlidXRlQ2hhbmdlSGFuZGxlcnMgPSAoKSA9PiB7XG4gICAgY29uc3QgcHJldkF0dHJzID0gdGhpcy5fcmVuZGVySW50ZXJuYWxzLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZU1hcDtcblxuICAgIC8vIENvcHkgdGhlIGNoYW5nZXMgdG8gYSBuZXcgbWFwIGFuZCBjbGVhciB0aGUgdHJhY2tpbmcgbWFwXG4gICAgY29uc3QgdHJhY2tlZENoYW5nZXMgPSBuZXcgTWFwKFxuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzLFxuICAgICk7XG4gICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzLmNsZWFyKCk7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWxdIG9mIHRyYWNrZWRDaGFuZ2VzKSB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLl9saXZlQXR0cmlidXRlQ29uZmlncy5nZXQobmFtZSk7XG4gICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFwib25DaGFuZ2VcIiBpbiBjb25maWcpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHByZXZBdHRycy5nZXQobmFtZSkgPz8gbnVsbDtcblxuICAgICAgICBpZiAoY29uZmlnICYmIHByZXZpb3VzVmFsdWUgIT09IHZhbCkge1xuICAgICAgICAgIGNvbmZpZy5vbkNoYW5nZT8uY2FsbCh0aGlzLCB2YWwsIHByZXZpb3VzVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgX3JlZmxlY3RMaXZlQXR0cmlidXRlcyA9ICgpID0+IHtcbiAgICBjb25zdCB0b1NldDogW25hbWU6IHN0cmluZywgdmFsOiBzdHJpbmcgfCBudWxsXVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb25maWddIG9mIHRoaXMuX2xpdmVBdHRyaWJ1dGVDb25maWdzKSB7XG4gICAgICBpZiAoXCJyZWZsZWN0XCIgaW4gY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHNlcmlhbGl6ZUF0dHJpYnV0ZShjb25maWcucmVmbGVjdD8uY2FsbCh0aGlzKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcblxuICAgICAgICBpZiAodmFsICE9PSBjdXJyZW50KSB7XG4gICAgICAgICAgdG9TZXQucHVzaChbbmFtZSwgdmFsXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWxdIG9mIHRvU2V0KSB7XG4gICAgICB0aGlzLnJlZmxlY3RBdHRyaWJ1dGUobmFtZSwgdmFsKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIFRoZSBhY3R1YWwgdXBkYXRlIGJlaGF2aW9yICovXG4gIHByaXZhdGUgX3BlcmZvcm1VcGRhdGUgPSAoKTogdm9pZCA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEltbWVkaWF0ZWx5IGZsaXAgZmxhZ3MgdG8gZGVub3RlIGEgcmVuZGVyIGlzIGluIHByb2dyZXNzIGFuZCBhbGxvd1xuICAgICAgLy8gcXVldWVpbmcgYW5vdGhlciByZW5kZXIgcmVxdWVzdC5cbiAgICAgIHRoaXMuX3JlbmRlckludGVybmFscy5pc1JlbmRlcmluZyA9IHRydWU7XG4gICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlciA9IGZhbHNlO1xuXG4gICAgICAvLyBBdHRyaWJ1dGVzOiBSdW4gYW55IGByZWFkYCBob29rcyBmb3IgY2hhbmdlZCBhdHRyaWJ1dGVzXG4gICAgICB0aGlzLl9leGVjdXRlQXR0cmlidXRlQ2hhbmdlSGFuZGxlcnMoKTtcblxuICAgICAgLy8gQ2FjaGUgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgcHJldmlvdXMgcmVuZGVyXG4gICAgICBjb25zdCBwcmV2QXR0cnMgPSB0aGlzLl9yZW5kZXJJbnRlcm5hbHMubGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwO1xuXG4gICAgICB0aGlzLmJlZm9yZVVwZGF0ZT8uKCk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudCBzbmFwc2hvdCBvZiBhdHRyaWJ1dGVzXG4gICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gY3JlYXRlQXR0cmlidXRlTWFwKHRoaXMpO1xuICAgICAgdGhpcy5fdGVtcGxhdGUucmVuZGVyKHRoaXMucm9vdCwgdGhpcy5fZ2V0UmVuZGVyQ29udGV4dChuZXdBdHRyaWJ1dGVzKSk7XG4gICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMubGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwID0gbmV3QXR0cmlidXRlcztcbiAgICAgIHRoaXMuYWZ0ZXJVcGRhdGU/LihwcmV2QXR0cnMpO1xuXG4gICAgICAvLyBBdHRyaWJ1dGVzOiBSdW4gYW55IGB3cml0ZWAgaG9va3MgZm9yIHVwZGF0ZWQgdmFsdWVzXG4gICAgICB0aGlzLl9yZWZsZWN0TGl2ZUF0dHJpYnV0ZXMoKTtcblxuICAgICAgLy8gUnVuIGFueSByZXF1ZXN0ZWQgcmVuZGVyIGNhbGxiYWNrc1xuICAgICAgLy8gVGhlc2UgYXJlIGNvbnNpZGVyZWQgbGlmZWN5Y2xlIG1ldGhvZHMgYXMgd2VsbCwgYW5kIHdpbGwgcmVwb3J0IGVycm9yc1xuICAgICAgLy8gYXMgYW55IG90aGVyIGxpZmVjeWNsZSBtZXRob2Qgd291bGRcbiAgICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMucG9zdFJlbmRlckNhbGxiYWNrcy5zaXplKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IEFycmF5LmZyb20odGhpcy5fcmVuZGVySW50ZXJuYWxzLnBvc3RSZW5kZXJDYWxsYmFja3MpO1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMucG9zdFJlbmRlckNhbGxiYWNrcy5jbGVhcigpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZm4gb2YgY2FsbGJhY2tzKSB7XG4gICAgICAgICAgZm4oKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgYHdpbGxSZW5kZXJgIGZsYWcgd2FzIGZsaXBwZWQsIGltbWVkaWF0ZWx5IHBlcmZvcm0gYSByZW5kZXJcbiAgICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlcikge1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMuc2VxdWVudGlhbFJlbmRlcnMgKz0gMTtcblxuICAgICAgICBpZiAodGhpcy5fcmVuZGVySW50ZXJuYWxzLnNlcXVlbnRpYWxSZW5kZXJzID49IE1BWF9TRVFVRU5USUFMX1JFTkRFUlMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgICAgICAgRXJyb3JDb2RlLk1BWF9TRVFVRU5USUFMX1JFTkRFUlMsXG4gICAgICAgICAgICBgJHt0aGlzLl9yZW5kZXJJbnRlcm5hbHMuc2VxdWVudGlhbFJlbmRlcnN9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcGVyZm9ybVVwZGF0ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnNlcXVlbnRpYWxSZW5kZXJzID0gMDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLndpbGxSZW5kZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBTYWZlbHkgcmVxdWVzdCBmb3IgYW4gdXBkYXRlIHRvIHJ1biBvbiB0aGUgbmV4dCBmcmFtZSAqL1xuICBwcml2YXRlIF9zY2hlZHVsZVVwZGF0ZSA9ICgpID0+IHtcbiAgICAvLyBQcmV2ZW50IHNjaGVkdWxpbmcgbXVsdGlwbGUgcmVuZGVyc1xuICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JlbmRlckludGVybmFscy53aWxsUmVuZGVyID0gdHJ1ZTtcblxuICAgIC8vIElmIGN1cnJlbnRseSByZW5kZXJpbmcsIGRvbid0IHJlcXVlc3QgYSByZW5kZXIsIGl0IHdpbGwgYXV0by1jb250aW51ZVxuICAgIC8vIHVudGlsIHRoZXJlIGFyZSBubyBjaGFuZ2VzIHRvIHJlbmRlclxuICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMuaXNSZW5kZXJpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIHJlbmRlciBpcyByZXF1ZXN0ZWQgYW5kIHdlJ3JlIG5vdCByZW5kZXJpbmcsIHJlcXVlc3QgYSByZW5kZXIgZnJhbWVcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fcGVyZm9ybVVwZGF0ZSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBfYWRvcHRTdGF0ZShzdGF0ZTogU3RhdGVTaGFwZSB8IFN0YXRlPFN0YXRlU2hhcGU+KSB7XG4gICAgLy8gSWYgdGhpcyBpcyBleGFjdGx5IG91ciBvd24gc3RhdGUgb2JqZWN0LCBkbyBub3RoaW5nXG4gICAgaWYgKE9iamVjdC5pcyh0aGlzLl9zdGF0ZSwgc3RhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgc3RhdGUgZXhpc3RzLCByZW1vdmUgdGhlIGxpc3RlbmVyIGFuZCBzY2hlZHVsZSBhIHJlbmRlclxuICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgdGhpcy5fc3RhdGUucmVtb3ZlTGlzdGVuZXIodGhpcy5fc2NoZWR1bGVVcGRhdGUpO1xuICAgICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBBZG9wdCB0aGUgaW5jb21pbmcgc3RhdGUgb2JqIG9yIHdyYXAgYW5kIGFkb3B0IGl0XG4gICAgY29uc3QgaW5jb21pbmdTdGF0ZU9iaiA9IHN0YXRlIGluc3RhbmNlb2YgU3RhdGUgPyBzdGF0ZSA6IG5ldyBTdGF0ZShzdGF0ZSk7XG4gICAgdGhpcy5fc3RhdGUgPSBpbmNvbWluZ1N0YXRlT2JqO1xuXG4gICAgLy8gRW5zdXJlIHRoZXJlIGlzIG5vdCBhY2NpZGVudGFsbHkgdHdvIG9mIHRoZSBzYW1lIHJlbmRlciBsaXN0ZW5lcnNcbiAgICB0aGlzLl9zdGF0ZS5yZW1vdmVMaXN0ZW5lcih0aGlzLl9zY2hlZHVsZVVwZGF0ZSk7XG4gICAgdGhpcy5fc3RhdGUuYWRkTGlzdGVuZXIodGhpcy5fc2NoZWR1bGVVcGRhdGUpO1xuICB9XG5cbiAgLy8g4pWt4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWuXG4gIC8vIOKUgiAgICAgICAgICAgQ3VzdG9tIEVsZW1lbnQgQ2FsbGJhY2sgT3ZlcnJpZGVzICAgICAgICAgICAg4pSCXG4gIC8vIOKVsOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVr1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNjcmlwdH0gaW5zdGVhZFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0NvbXBvbmVudE1vdW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMuaXNSZW5kZXJpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlciA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBjcmVhdGVBdHRyaWJ1dGVNYXAodGhpcyk7XG4gICAgICAgIHRoaXMuX2xpdmVBdHRyaWJ1dGVDb25maWdzID0gbmV3IE1hcChcbiAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLmxpdmVBdHRyaWJ1dGVzID8/IHt9KSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3RhdGVmdWwgY29tcG9uZW50LCBzZXQgdXAgdGhhdCBzdGF0ZVxuICAgICAgICBpZiAodGhpcy5pbml0aWFsU3RhdGUpIHtcbiAgICAgICAgICBjb25zdCBpbml0ID1cbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmluaXRpYWxTdGF0ZSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICA/IHRoaXMuaW5pdGlhbFN0YXRlXG4gICAgICAgICAgICAgIDogdGhpcy5pbml0aWFsU3RhdGUoKTtcblxuICAgICAgICAgIHRoaXMuX2Fkb3B0U3RhdGUoaW5pdCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90ZW1wbGF0ZS5yZW5kZXIodGhpcy5yb290LCB0aGlzLl9nZXRSZW5kZXJDb250ZXh0KGF0dHJpYnV0ZXMpKTtcbiAgICAgICAgdGhpcy5fcmVmbGVjdExpdmVBdHRyaWJ1dGVzKCk7XG4gICAgICAgIHRoaXMuX3JlbmRlckludGVybmFscy5sYXN0UmVuZGVyZWRBdHRyaWJ1dGVNYXAgPSBhdHRyaWJ1dGVzO1xuICAgICAgICB0aGlzLl9pc0NvbXBvbmVudE1vdW50ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9jbGVhbnVwRm4gPSB0aGlzLnNjcmlwdD8uKCkgPz8gdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoZXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBmaW5hbGl6ZX1cbiAgICovXG4gIHByb3RlY3RlZCBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAvLyBJZiB0aGlzIHRhc2sgcnVucyBidXQgdGhlIGNvbXBvbmVudCBpcyBzdGlsbCBjb25uZWN0ZWQsIHRoZW4gZG8gbm90aGluZ1xuICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IHdhcyBqdXN0IG1vdmVkIGluIHRoZSBET00uXG4gICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCB8fCAhdGhpcy5faXNDb21wb25lbnRNb3VudGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gT25seSBydW4gdGhlIGRpc2Nvbm5lY3QgaWYgdGhlIGVsZW1lbnQgaXMgYWN0dWFsbHkgdW5tb3VudGVkIGFuZCBub3RcbiAgICAgIC8vIGp1c3QgbW92ZWQuIFVzaW5nIHRoaXMgaW4gcGxhY2Ugb2YgY29ubmVjdGVkTW92ZUNhbGxiYWNrKCkgZm9yIGNvbXBhdFxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fZGVsZWdhdG9yPy5jbGVhbnVwKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgYW55IGxpc3RlbmVycyBzZXQgdXAgb24gc2VsZlxuICAgICAgICBpZiAodGhpcy5fb3duTGlzdGVuZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9vd25MaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihsaXN0ZW5lci5ldmVudCwgbGlzdGVuZXIuaGFuZGxlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2xlYW51cEZuPy4oKTtcbiAgICAgICAgdGhpcy5faXNDb21wb25lbnRNb3VudGVkID0gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihlcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBSdW4gdGhlIGZpbmFsaXplIGNhbGwgYWZ0ZXIgZXZlcnl0aGluZywgZXZlbiBpZiB0aGUgY2xlYW51cCBmbiBmYWlsZWRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmZpbmFsaXplPy4oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGxpdmVBdHRyaWJ1dGVzfSBpbnN0ZWFkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBfOiBzdHJpbmcgfCBudWxsLFxuICAgIG5ld1ZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICApOiB2b2lkIHtcbiAgICAvLyBJZ25vcmUgYXR0cmlidXRlIGNoYW5nZXMgdGhhdCBvY2N1ciBkdXJpbmcgYW4gdXBkYXRlLCBhcyB0aGV5IGFyZVxuICAgIC8vIGNvbWluZyBmcm9tIGluc2lkZSB0aGUgaG91c2VcbiAgICBpZiAodGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzUmVuZGVyaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2tpcCBub24tY2hhbmdlcyB1c2luZyB0aGUgc3RvcmVkIGF0dHJpYnV0ZXMgYXMgcmVmZXJlbmNlIHRvIGNvbXBhcmVcbiAgICAvLyB0byB0aGUgcmVuZGVyIHN0YXRlIHJhdGhlciB0aGFuIHRoZSBkb21cbiAgICBpZiAoXG4gICAgICBuZXdWYWx1ZSA9PT0gdGhpcy5fcmVuZGVySW50ZXJuYWxzLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZU1hcD8uZ2V0KG5hbWUpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FjaGUgdGhlIHVwZGF0ZWQgYXR0cmlidXRlIHZhbHVlXG4gICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzLnNldChuYW1lLCBuZXdWYWx1ZSk7XG5cbiAgICAvLyBTY2hlZHVsZSBhIHJlbmRlclxuICAgIGlmICghdGhpcy5fcmVuZGVySW50ZXJuYWxzLndpbGxSZW5kZXIpIHtcbiAgICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pWt4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWuXG4gIC8vIOKUgiAgICAgICAgICAgICAgICAgICAgUHVibGljIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAg4pSCXG4gIC8vIOKVsOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVr1xuXG4gIC8qKlxuICAgKiBUaGUgU2hhZG93Um9vdCBub2RlIG9mIHRoaXMgZWxlbWVudFxuICAgKi9cbiAgZ2V0IHJvb3QoKTogU2hhZG93Um9vdCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3Q7XG4gIH1cblxuICAvKipcbiAgICogRGlyZWN0bHkgYWNjZXNzIGFuZCBtYW5pcHVsYXRlIHRoaXMgQ29tcG9uZW50J3MgcmVhY3RpdmUgc3RhdGUgd2l0aCBkZWVwXG4gICAqIHJlYWN0aXZpdHkgZW5hYmxlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbml0aWFsU3RhdGUgPSB7IHZhbHVlczogeyBjb3VudDogMSwgdGltZTogMCB9IH07XG4gICAqXG4gICAqIGluY3JlbWVudCgpIHtcbiAgICogICB0aGlzLnN0YXRlLnZhbHVlcy5jb3VudCA9IDI7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgaXMgYSBzaG9ydGhhbmQgZ2V0dGVyIGZvciBgdGhpcy5nZXRTdGF0ZSgpLmxpdmVgXG4gICAqL1xuICBnZXQgc3RhdGUoKTogU3RhdGVTaGFwZSB7XG4gICAgaWYgKCF0aGlzLl9zdGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuTUlTU0lOR19TVEFURSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlLmxpdmU7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgY3VycmVudCBzdGF0ZSB3aXRoIGEgbmV3IHZhbHVlIG9yIGFkb3B0IGEgd2hvbGUgZGlmZmVyZW50IFN0YXRlXG4gICAqIGluc3RhbmNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIFN0YXRlIHJlcGxhY2VtZW50XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQWx3YXlzIHRyaWdnZXJzIGEgcmVuZGVyXG4gICAqIHRoaXMuc3RhdGUgPSB7IHNvbWU6IFwibmV3U3RhdGVcIiB9XG4gICAqXG4gICAqIC8vIEFkb3B0IGEgbmV3IHN0YXRlIGluc3RhbmNlIGFsdG9nZXRoZXJcbiAgICogY29uc3Qgb3RoZXJTdGF0ZSA9IG5ldyBTdGF0ZSh7c29tZTogXCJuZXdTdGF0ZVwifSk7XG4gICAqIHRoaXMuc3RhdGUgPSBvdGhlclN0YXRlO1xuICAgKlxuICAgKiAvLyBDYXVzZXMgYSByZW5kZXJcbiAgICogb3RoZXJTdGF0ZS5zZXQoXCJzb21lXCIsIFwidmFsdWVcIik7XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0IHN0YXRlKG5ld1N0YXRlOiBTdGF0ZVNoYXBlIHwgU3RhdGU8U3RhdGVTaGFwZT4pIHtcbiAgICB0aGlzLl9hZG9wdFN0YXRlKG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2Nlc3MgdGhlIGZ1bGwge0BsaW5rIFN0YXRlfSBpbnN0YW5jZSBmb3IgdGhpcyBDb21wb25lbnQuXG4gICAqXG4gICAqIFVzaW5nIHRoaXMgbWV0aG9kIG9uIGEgY29tcG9uZW50IHdoaWNoIGlzIG5vdCB1c2luZyByZWFjdGl2ZSBzdGF0ZVxuICAgKiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciBiZWluZyB0aHJvd24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIFJldHJpZXZlIHN0YXRlZnVsIHZhbHVlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY2xhc3MgRXhhbXBsZSBleHRlbmRzIENvbXBvbmVudCB7XG4gICAqICAgaW5pdGlhbFN0YXRlID0geyBjb3VudDogMSB9O1xuICAgKlxuICAgKiAgIHNjcmlwdCgpIHtcbiAgICogICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXRTdGF0ZSgpO1xuICAgKiAgICAgY29uc29sZS5sb2coYFRoZSBjb3VudCBpcyAke3N0YXRlLmdldChcImNvdW50XCIpfWApO1xuICAgKiAgIH1cbiAgICpcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogU2V0IGEgc3RhdGVmdWwgdmFsdWVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjbGFzcyBFeGFtcGxlIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICogICBpbml0aWFsU3RhdGUgPSB7IGNvdW50OiAxIH07XG4gICAqXG4gICAqICAgaW5jcmVtZW50KCkge1xuICAgKiAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gICAqICAgICBjb25zdCBjdXJyZW50ID0gc3RhdGUuZ2V0KFwiY291bnRcIik7XG4gICAqICAgICBzdGF0ZS5zZXQoXCJjb3VudFwiLCBjdXJyZW50ICsgMSk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0U3RhdGUoKTogU3RhdGU8U3RhdGVTaGFwZT4ge1xuICAgIGlmICghdGhpcy5fc3RhdGUpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLk1JU1NJTkdfU1RBVEUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBzY2hlZHVsZSBhIHJlbmRlciB0byBvY2N1clxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBDYWxsaW5nIHtAbGluayByZXF1ZXN0UmVuZGVyfSBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSBldmVudCBsb29wIHdvbid0XG4gICAqIHNjaGVkdWxlIG11bHRpcGxlIHJlbmRlcnMuIFJlbmRlcnMgYXJlIHNjaGVkdWxlZCB0byBvY2N1ciBvbiB0aGUgbmV4dFxuICAgKiBhbmltYXRpb24gZnJhbWUuXG4gICAqL1xuICByZXF1ZXN0UmVuZGVyKGNhbGxiYWNrPzogVm9pZEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMucG9zdFJlbmRlckNhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbWFuYWdlZCBldmVudCBsaXN0ZW5lciBvbiB0aGlzIENvbXBvbmVudCB3aXRoIGFuIG9wdGlvbmFsIHF1ZXJ5XG4gICAqIGZpbHRlciBzdHJpbmcgdG8gc3BlY2lmeSB3aGljaCBlbGVtZW50cyB0byBsaXN0ZW4gdG8gZXZlbnRzIGZyb20uXG4gICAqXG4gICAqIEV2ZW50IGhhbmRsZXJzIHNldCB1cCB3aXRoIGBsaXN0ZW4oKWAgYXJlIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cCB3aGVuXG4gICAqIHRoZSBjb21wb25lbnQgaXMgdW5tb3VudGVkLlxuICAgKlxuICAgKiBIYW5kbGVycyBhcmUgZGVsZWdhdGVkIHRvIGEgc2luZ2xlIGxpc3RlbmVyIHBlciBldmVudCBvbiB0aGUgcm9vdCBvZiB0aGVcbiAgICogQ29tcG9uZW50LCB3aGljaCBpcyB0aGUgY2xvc2VkIFNoYWRvd1Jvb3QgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogU2V0IHVwIGFuIGV2ZW50IGxpc3RlbmVyIGZvciBhIGNsaWNrIGV2ZW50IGZyb20gYSBidXR0b24gd2l0aCBJRCBcInN1Ym1pdFwiXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGhpcy5saXN0ZW4oXCIjc3VibWl0XCIsIFwiY2xpY2tcIiwgdGhpcy5oYW5kbGVDbGljayk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBTZXQgdXAgYW4gZXZlbnQgbGlzdGVuZXIgb24gdGhlIGhvc3QgZWxlbWVudCBpdHNlbGYgKGB0aGlzYCkuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gVXNlIFwiOmhvc3RcIiBvciBcIjpIT1NUXCIgYXMgdGhlIHF1ZXJ5IHNlbGVjdG9yIHRvIHRhcmdlIHRoZSBob3N0IGVsZW1lbnRcbiAgICogdGhpcy5saXN0ZW4oXCI6aG9zdFwiLCBcImFuaW1hdGlvbmVuZFwiLCB0aGlzLmhhbmRsZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIGxpc3RlbjxFIGV4dGVuZHMgRXZlbnROYW1lPihcbiAgICB0YXJnZXREZXNjcmlwdG9yOiBzdHJpbmcgfCB0eXBlb2YgQ29tcG9uZW50PGFueT4gfCBIVE1MRWxlbWVudCxcbiAgICBldmVudE5hbWU6IEUsXG4gICAgZXZlbnRIYW5kbGVyOiBFdmVudEhhbmRsZXI8RT4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHF1ZXJ5ID0gRXZlbnREZWxlZ2F0b3IucHJvY2Vzc1RhcmdldERlc2NyaXB0b3IodGFyZ2V0RGVzY3JpcHRvcik7XG5cbiAgICAvLyBJZiB0aGUgcXVlcnkgZmlsdGVyIGlzIGBcIjpob3N0XCJgLCBzZXQgdXAgYW4gb3duTGlzdGVuZXJcbiAgICBpZiAocXVlcnkgPT09IFwiOmhvc3RcIiB8fCBxdWVyeSA9PT0gXCI6SE9TVFwiKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIpO1xuICAgICAgdGhpcy5fb3duTGlzdGVuZXJzLmFkZCh7XG4gICAgICAgIGhhbmRsZXI6IGV2ZW50SGFuZGxlciBhcyBFdmVudEhhbmRsZXIsXG4gICAgICAgIGV2ZW50OiBldmVudE5hbWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHNldCB1cCBhIHJvb3QgbGlzdGVuZXJcbiAgICBpZiAoIXRoaXMuX2RlbGVnYXRvcikge1xuICAgICAgdGhpcy5fZGVsZWdhdG9yID0gbmV3IEV2ZW50RGVsZWdhdG9yKHRoaXMucm9vdCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGVsZWdhdG9yLmFkZExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyLCBxdWVyeSk7XG4gIH1cblxuICBzdG9wTGlzdGVuaW5nPEUgZXh0ZW5kcyBFdmVudE5hbWU+KFxuICAgIHRhcmdldERlc2NyaXB0b3I6IHN0cmluZyB8IHR5cGVvZiBDb21wb25lbnQ8YW55PiB8IEhUTUxFbGVtZW50LFxuICAgIGV2ZW50TmFtZTogRSxcbiAgICBldmVudEhhbmRsZXI6IEV2ZW50SGFuZGxlcjxFPixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcXVlcnkgPSBFdmVudERlbGVnYXRvci5wcm9jZXNzVGFyZ2V0RGVzY3JpcHRvcih0YXJnZXREZXNjcmlwdG9yKTtcblxuICAgIC8vIElmIHRoZSBxdWVyeSBmaWx0ZXIgaXMgYFwiOmhvc3RcImAsIHJlbW92ZSBmcm9tIHRoZSBvd25MaXN0ZW5lciBsaXN0XG4gICAgaWYgKHF1ZXJ5ID09PSBcIjpob3N0XCIgfHwgcXVlcnkgPT09IFwiOkhPU1RcIikge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyIGFzIEV2ZW50SGFuZGxlcik7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX293bkxpc3RlbmVycykge1xuICAgICAgICBpZiAobGlzdGVuZXIuZXZlbnQgPT09IGV2ZW50TmFtZSAmJiBsaXN0ZW5lci5oYW5kbGVyID09PSBldmVudEhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLl9vd25MaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBkZWxlZ2F0b3IgaXMgbm90IHNldCB1cCwgdGhlcmUncyBub3RoaW5nIHRvIGRvXG4gICAgaWYgKCF0aGlzLl9kZWxlZ2F0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWxlZ2F0b3IucmVtb3ZlTGlzdGVuZXIoXG4gICAgICBldmVudE5hbWUsXG4gICAgICBldmVudEhhbmRsZXIgYXMgRXZlbnRIYW5kbGVyLFxuICAgICAgcXVlcnksXG4gICAgKTtcbiAgfVxuXG4gIGRpc3BhdGNoRXZlbnQoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzcGF0Y2ggYSB7QGxpbmsgQ3VzdG9tRXZlbnR9IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBkZXRhaWxcbiAgICpcbiAgICogQGV4YW1wbGUgRGVmaW5pbmcgY3VzdG9tIGV2ZW50c1xuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlZmluZSB0eXBlcy4gVGhpcyBjYW4gaGFwcGVuIGluIHRoZSBzYW1lIGZpbGUgb3IgZWxzZXdoZXJlIGZvciBjb21tb25cbiAgICogLy8gYW5kIHNoYXJlZCBldmVudHMuXG4gICAqIGV4cG9ydCB0eXBlIE15RXZlbnQgPSBDdXN0b21FdmVudDxUPiAvLyBTZXQgYFRgIHRvIHRoZSBldmVudCBkZXRhaWwgdHlwZVxuICAgKlxuICAgKiBkZWNsYXJlIGdsb2JhbCB7XG4gICAqICBpbnRlcmZhY2UgR2xvYmFsRXZlbnRIYW5kbGVyc0V2ZW50TWFwIHtcbiAgICogICAgXCJteS1ldmVudC1uYW1lXCI6IE15RXZlbnRcbiAgICogIH1cbiAgICogfVxuICAgKlxuICAgKiAvLyBEaXNwYXRjaCBhIGN1c3RvbSBldmVudFxuICAgKiB0aGlzLmRpc3BhdGNoRXZlbnQoXCJteS1ldmVudC1uYW1lXCIsIFQpO1xuICAgKlxuICAgKiAvLyBMaXN0ZW4gdG8gYSBjdXN0b20gZXZlbnRcbiAgICogJGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJteS1ldmVudC1uYW1lXCIsIC4uLik7XG4gICAqIGBgYFxuICAgKi9cbiAgZGlzcGF0Y2hFdmVudDxUPihcbiAgICBldmVudDogc3RyaW5nLFxuICAgIGRldGFpbD86IFQsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGJ1YmJsZXM6IGJvb2xlYW47XG4gICAgICBjYW5jZWxhYmxlOiBib29sZWFuO1xuICAgICAgY29tcG9zZWQ6IGJvb2xlYW47XG4gICAgfSxcbiAgKTogYm9vbGVhbjtcbiAgZGlzcGF0Y2hFdmVudDxUPihcbiAgICBldmVudDogc3RyaW5nIHwgRXZlbnQsXG4gICAgZGV0YWlsPzogVCxcbiAgICBvcHRpb25zPzoge1xuICAgICAgYnViYmxlczogYm9vbGVhbjtcbiAgICAgIGNhbmNlbGFibGU6IGJvb2xlYW47XG4gICAgICBjb21wb3NlZDogYm9vbGVhbjtcbiAgICB9LFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgLi4uKG9wdGlvbnMgPz8ge30pLFxuICAgIH07XG5cbiAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxUPihldmVudCwge1xuICAgICAgICBkZXRhaWwsXG4gICAgICAgIC4uLm9wdHMsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcXVlcnlTZWxlY3RvcjxFIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KHF1ZXJ5OiBzdHJpbmcpOiBFIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3QucXVlcnlTZWxlY3RvcihxdWVyeSk7XG4gIH1cblxuICBxdWVyeVNlbGVjdG9yQWxsPEUgZXh0ZW5kcyBIVE1MRWxlbWVudD4ocXVlcnk6IHN0cmluZyk6IE5vZGVMaXN0T2Y8RT4ge1xuICAgIHJldHVybiB0aGlzLl9yb290LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpIGFzIE5vZGVMaXN0T2Y8RT47XG4gIH1cblxuICBnZXRFbGVtZW50QnlJZDxFIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KGlkOiBzdHJpbmcpOiBFIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuX3Jvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gdGhpcy5fcm9vdC5nZXRFbGVtZW50QnlJZChpZCkgYXMgRSB8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBIVE1MRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3Rvci5jYWxsKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgIyR7aWR9YCxcbiAgICAgICkgYXMgRSB8IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVxdWlyZUVsZW1lbnRCeUlkPEUgZXh0ZW5kcyBIVE1MRWxlbWVudD4oaWQ6IHN0cmluZyk6IEUge1xuICAgIGNvbnN0IGxvb2t1cCA9IHRoaXMuZ2V0RWxlbWVudEJ5SWQ8RT4oaWQpO1xuICAgIGlmICghbG9va3VwKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5NSVNTSU5HX0VMRU1FTlQpO1xuICAgIH1cbiAgICByZXR1cm4gbG9va3VwO1xuICB9XG5cbiAgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCBhIHZhbHVlIGFzIGFuIGF0dHJpYnV0ZSwgc2VyaWFsaXppbmcgdG8gYSBzdHJpbmcgb3IgYG51bGxgLlxuICAgKlxuICAgKiBudWxsIHZhbHVlcyBjYXVzZSB0aGUgYXR0cmlidXRlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGlzIGVsZW1lbnRcbiAgICovXG4gIHNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gc2VyaWFsaXplQXR0cmlidXRlKHZhbHVlKTtcbiAgICBpZiAoc2VyaWFsaXplZCA9PT0gbnVsbCkge1xuICAgICAgSFRNTEVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZS5jYWxsKHRoaXMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBIVE1MRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlLmNhbGwodGhpcywgbmFtZSwgc2VyaWFsaXplZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhdHRyaWJ1dGUgYXMgYSBudW1iZXIsIGZhbGxpbmcgYmFjayB0byBhIHNwZWNpZmllZCBkZWZhdWx0LlxuICAgKlxuICAgKlxuICAgKiBgbnVsbGAgYXR0cmlidXRlcyBhcmUgcmV0dXJuZWQgYXMgYG51bGxgLCB3aGlsZSBzdHJpbmcgYXR0cmlidXRlcyBhcmVcbiAgICogcGFyc2VkIHVzaW5nIHRoZSBgTnVtYmVyKClgIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBWYWx1ZXMgd2hpY2ggZXZhbHVhdGUgdG8gTmFOIGFyZSByZXR1cm5lZCBhcyBgbnVsbGAuXG4gICAqL1xuICBnZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IG51bWJlcik6IG51bWJlcjtcblxuICAvKipcbiAgICogR2V0IGFuIGF0dHJpYnV0ZSBhcyBhIHN0cmluZywgZmFsbGluZyBiYWNrIHRvIGEgc3BlY2lmaWVkIGRlZmF1bHRcbiAgICovXG4gIGdldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nKTogc3RyaW5nO1xuICBnZXRBdHRyaWJ1dGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZyB8IG51bWJlcixcbiAgKTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsdWUgPSBIVE1MRWxlbWVudC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlLmNhbGwodGhpcywgbmFtZSk7XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG5cbiAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cblxuICAgIC8vIEludmFsaWQgZnVuY3Rpb24gaW52b2NhdGlvblxuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgb24gdGhpcyBlbGVtZW50IGlmIHRoZSBwcm92aWRlZCB2YWx1ZVxuICAgKiBkaWZmZXJzIGZyb20gdGhlIGF0dHJpYnV0ZSB3aGVuIHNlcmlhbGl6ZWRcbiAgICovXG4gIHJlZmxlY3RBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICBjb25zdCByZWZsZWN0ZWQgPSBzZXJpYWxpemVBdHRyaWJ1dGUodmFsdWUpO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IHJlZmxlY3RlZCkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgcmVmbGVjdGVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRoaXMgZWxlbWVudCB0byBhIHN0cmluZ1xuICAgKi9cbiAgdG9TdHJpbmcoZnVsbDogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIENvbXBvbmVudCkubmFtZTtcbiAgICBjb25zdCBhdHRyU3RyaW5nID0gdGhpcy5nZXRBdHRyaWJ1dGVOYW1lcygpXG4gICAgICAubWFwKChhdHRyTmFtZSkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgIHJldHVybiB2YWwgPyBgJHthdHRyTmFtZX09XCIke3ZhbH1cImAgOiBcIlwiO1xuICAgICAgfSlcbiAgICAgIC5qb2luKFwiIFwiKTtcbiAgICBjb25zdCBhdHRycyA9IGF0dHJTdHJpbmcubGVuZ3RoID4gMCA/IGAgJHthdHRyU3RyaW5nfWAgOiBcIlwiO1xuXG4gICAgaWYgKGZ1bGwpIHtcbiAgICAgIHJldHVybiBgQ29tcG9uZW50PCR7bmFtZX0ke2F0dHJzfT5cXG4ke3RoaXMucm9vdC5pbm5lckhUTUx9XFxuPC8ke25hbWV9PmA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBDb21wb25lbnQ8JHtuYW1lfSR7YXR0cnN9PmA7XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUge1xuICBBdHRyaWJ1dGVNYXAsXG4gIENvbXBvbmVudFN0eWxlcyxcbiAgQ29tcHV0ZWRQcm9wZXJ0aWVzLFxuICBMaXZlQXR0cmlidXRlcyxcbiAgU3RhdGVJbml0aWFsaXplcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgQkxBTktfVEVNUExBVEUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50U2hvcnRoYW5kPFN0YXRlU2hhcGUgZXh0ZW5kcyBvYmplY3QgPSB7fT4ge1xuICAvKipcbiAgICogQW4gSFRNTCBUZW1wbGF0ZSBlbGVtZW50IGZvciB0aGlzIGVsZW1lbnQgdG8gdXNlLlxuICAgKi9cbiAgdGVtcGxhdGU/OiBIVE1MVGVtcGxhdGVFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBBIHtAbGluayBDU1NTdHlsZVNoZWV0fSBhcnJheSB0byBhZG9wdCB0byB0aGUgZWxlbWVudCdzIHNoYWRvdyBET01cbiAgICovXG4gIHN0eWxlcz86IENvbXBvbmVudFN0eWxlcztcblxuICAvKipcbiAgICogVGhlIG1vZGUgZm9yIHRoaXMgQ29tcG9uZW50J3MgU2hhZG93Um9vdC5cbiAgICpcbiAgICogLSBgXCJvcGVuXCJgIGFsbG93cyBKUyBhY2Nlc3MgdG8gdGhlIGNoaWxkcmVuIG9mIHRoaXMgY29tcG9uZW50XG4gICAqIC0gYFwiY2xvc2VkXCJgIChkZWZhdWx0KSBkaXNhbGxvd3MgaW50ZXJuYWwgSlMgYWNjZXNzXG4gICAqL1xuICBzaGFkb3dSb290TW9kZT86IFwiY2xvc2VkXCIgfCBcIm9wZW5cIjtcblxuICAvKipcbiAgICogVGhlIGluaXRpYWwgc3RhdGUgZm9yIHRoaXMgQ29tcG9uZW50J3MgcmVhY3RpdmUgaW50ZXJuYWwgc3RhdGUsIGlmIGFueS5cbiAgICovXG4gIGluaXRpYWxTdGF0ZT86IFN0YXRlSW5pdGlhbGl6ZXI8U3RhdGVTaGFwZT47XG5cbiAgLyoqXG4gICAqIEFuIG9iamVjdCBvciBmdW5jdGlvbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdoaWNoIHBvcHVsYXRlcyB0aGUgYGRhdGFgIHZhbHVlc1xuICAgKiBpbiB0aGUgdGVtcGxhdGluZyBlbmdpbmUuIFN1Y2ggdmFsdWVzIGFyZSBhY2Nlc3NlZCB1c2luZyB0aGUgYCpgIG5vdGF0aW9uLlxuICAgKi9cbiAgY29tcHV0ZWRQcm9wZXJ0aWVzPzogQ29tcHV0ZWRQcm9wZXJ0aWVzPFN0YXRlU2hhcGU+O1xuXG4gIC8qKlxuICAgKiBEZWNsYXJhdGlvbiBvZiBhdHRyaWJ1dGUgYmVoYXZpb3JzIGR1cmluZyB1cGRhdGVzLlxuICAgKi9cbiAgbGl2ZUF0dHJpYnV0ZXM/OiBMaXZlQXR0cmlidXRlczxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gc2NyaXB0aW5nIGZvciB0aGlzIENvbXBvbmVudFxuICAgKi9cbiAgc2NyaXB0PzogKHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPikgPT4gVm9pZEZ1bmN0aW9uIHwgdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBlYWNoIHRlbXBsYXRlIHVwZGF0ZVxuICAgKi9cbiAgYmVmb3JlVXBkYXRlPzogKHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggdGVtcGxhdGUgdXBkYXRlXG4gICAqL1xuICBhZnRlclVwZGF0ZT86IChcbiAgICB0aGlzOiBDb21wb25lbnQ8U3RhdGVTaGFwZT4sXG4gICAgcHJldmlvdXNBdHRyaWJ1dGVzOiBBdHRyaWJ1dGVNYXAsXG4gICkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGFzIHRoZSBmaW5hbCBsaWZlY3ljbGUgbWV0aG9kIGF0IHRoZSBlbmQgb2YgdGhlIHVubW91bnRpbmcgcHJvY2Vzcy5cbiAgICpcbiAgICogQ29udGVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIERPTSBhbmQgdGhlIGNvbXBvbmVudCBpcyBubyBsb25nZXJcbiAgICogY29uc2lkZXJlZCBtb3VudGVkIHdoZW4gdGhpcyBmdW5jdGlvbiBydW5zLlxuICAgKlxuICAgKiBVc2UgdGhpcyBmb3IgZmluYWwgY2xlYW51cCB0YXNrcyBhbmQgZnJlZWluZyByZXNvdXJjZXMuXG4gICAqL1xuICBmaW5hbGl6ZT86ICh0aGlzOiBDb21wb25lbnQ8U3RhdGVTaGFwZT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIElmIGRlZmluZWQsIHJlY2VpdmVzIGVycm9ycyBjYXVnaHQgZHVyaW5nIHRoZSBsaWZlY3ljbGUgbWV0aG9kcyBvZiB0aGlzXG4gICAqIGNvbXBvbmVudCBhbmQgaXQncyBjaGlsZHJlbi4gSWYgbm90IGRlZmluZWQsIHRoaXMgY29tcG9uZW50IHdpbGwgaW5zdGVhZFxuICAgKiB0aHJvdyBlcnJvcnMgYXMgdGhleSBhcmUgZm91bmQuXG4gICAqXG4gICAqIElmIHRoZSBlcnJvciBjYW5ub3QgYmUgaGFuZGxlZCwgYG9uRXJyb3IoKWAgc2hvdWxkIHJlLXRocm93IGl0IGZvciBhIGhpZ2hlclxuICAgKiB1cCBjb21wb25lbnQgdG8gZXZhbHVhdGUuXG4gICAqXG4gICAqIFRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSB3aGlsZSByZW1vdmluZyBhbiBlcnJvcmluZyBjb21wb25lbnQgZnJvbSB0aGVcbiAgICogRE9NLCB1c2UgYHRoaXMucmVwbGFjZVdpdGgoKWAgYW5kIGEgbmV3bHkgY29uc3RydWN0ZWQgcGxhY2Vob2xkZXIgZWxlbWVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogUmVjb3ZlcmluZyBmcm9tIGVycm9ycyBvciBkaXNwbGF5aW5nIGEgZmFsbGJhY2tcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBvbkVycm9yKGVycm9yKSB7XG4gICAqICAgLy8gSGFuZGxlIGtub3duIGVycm9yc1xuICAgKiAgIGlmIChlcnJvci5tZXNzYWdlID0gXCJJbnZhbGlkIElucHV0XCIpIHtcbiAgICogICAgIHRoaXMuc3RhdGUuaW5wdXQgPSBcIlwiO1xuICAgKiAgICAgcmV0dXJuO1xuICAgKiAgIH1cbiAgICpcbiAgICogICAvLyBEaXNwbGF5IGEgZmFsbGJhY2sgYmFubmVyXG4gICAqICAgY29uc3QgYmFubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICogICBiYW5uZXIudGV4dENvbnRlbnQgPSBcIkFuIHVuZXhwZWN0ZWQgZXJyb3IgZG9uZSBkaWRcIjtcbiAgICogICB0aGlzLnJlcGxhY2VXaXRoKGJhbm5lcik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBvbkVycm9yPzogKHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPiwgZXJyb3I6IHVua25vd24pID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmU8U3RhdGVTaGFwZSBleHRlbmRzIG9iamVjdCA9IHt9PihcbiAgdGFnbmFtZTogc3RyaW5nLFxuICBkZWZpbml0aW9uOiBDb21wb25lbnRTaG9ydGhhbmQ8U3RhdGVTaGFwZT4sXG4pOiB0eXBlb2YgQ29tcG9uZW50PFN0YXRlU2hhcGU+IHtcbiAgY29uc3Qge1xuICAgIC8vIENvbmZpZ1xuICAgIHRlbXBsYXRlID0gQkxBTktfVEVNUExBVEUsXG4gICAgc3R5bGVzID0gW10sXG4gICAgc2hhZG93Um9vdE1vZGUgPSBcImNsb3NlZFwiLFxuICAgIGluaXRpYWxTdGF0ZSxcbiAgICBjb21wdXRlZFByb3BlcnRpZXMgPSB7fSxcbiAgICBsaXZlQXR0cmlidXRlcyA9IHt9LFxuXG4gICAgLy8gTGlmZWN5Y2xlXG4gICAgc2NyaXB0LFxuICAgIGJlZm9yZVVwZGF0ZSxcbiAgICBhZnRlclVwZGF0ZSxcbiAgICBmaW5hbGl6ZSxcbiAgICBvbkVycm9yLFxuICB9ID0gZGVmaW5pdGlvbjtcblxuICBjb25zdCBmdWxsT2JzZXJ2ZWRBdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShcbiAgICBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhsaXZlQXR0cmlidXRlcyldKSxcbiAgKTtcblxuICBjb25zdCBjbHMgPSBjbGFzcyBleHRlbmRzIENvbXBvbmVudDxTdGF0ZVNoYXBlPiB7XG4gICAgc3RhdGljIHRhZ05hbWUgPSB0YWduYW1lO1xuICAgIHN0YXRpYyB0ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIHN0YXRpYyBzdHlsZXMgPSBzdHlsZXM7XG4gICAgc3RhdGljIG9ic2VydmVkQXR0cmlidXRlcyA9IFsuLi5mdWxsT2JzZXJ2ZWRBdHRyaWJ1dGVzXTtcbiAgICBzdGF0aWMgc2hhZG93Um9vdE1vZGUgPSBzaGFkb3dSb290TW9kZTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoKTtcblxuICAgICAgdGhpcy5pbml0aWFsU3RhdGUgPVxuICAgICAgICB0eXBlb2YgaW5pdGlhbFN0YXRlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGluaXRpYWxTdGF0ZS5iaW5kKHRoaXMpXG4gICAgICAgICAgOiBpbml0aWFsU3RhdGU7XG4gICAgICB0aGlzLmNvbXB1dGVkUHJvcGVydGllcyA9XG4gICAgICAgIHR5cGVvZiBjb21wdXRlZFByb3BlcnRpZXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gY29tcHV0ZWRQcm9wZXJ0aWVzLmJpbmQodGhpcylcbiAgICAgICAgICA6IGNvbXB1dGVkUHJvcGVydGllcztcbiAgICAgIHRoaXMubGl2ZUF0dHJpYnV0ZXMgPSBsaXZlQXR0cmlidXRlcztcblxuICAgICAgZm9yIChjb25zdCBkZWYgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmxpdmVBdHRyaWJ1dGVzKSkge1xuICAgICAgICBpZiAoZGVmLm9uQ2hhbmdlKSB7XG4gICAgICAgICAgZGVmLm9uQ2hhbmdlID0gZGVmLm9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVmLnJlZmxlY3QpIHtcbiAgICAgICAgICBkZWYucmVmbGVjdCA9IGRlZi5yZWZsZWN0LmJpbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ/LmJpbmQodGhpcykgPz8gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5iZWZvcmVVcGRhdGUgPSBiZWZvcmVVcGRhdGU/LmJpbmQodGhpcykgPz8gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5hZnRlclVwZGF0ZSA9IGFmdGVyVXBkYXRlPy5iaW5kKHRoaXMpID8/IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZmluYWxpemUgPSBmaW5hbGl6ZT8uYmluZCh0aGlzKSA/PyB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm9uRXJyb3IgPSBvbkVycm9yPy5iaW5kKHRoaXMpID8/IHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgQ29tcG9uZW50LnJlZ2lzdGVyKGNscywgdGFnbmFtZSk7XG5cbiAgcmV0dXJuIGNscztcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUE0Q0EsU0FBUyxXQUFXLENBQUMsTUFBaUI7QUFBQSxFQUNwQyxNQUFNLGlCQUE0QztBQUFBLEtBQy9DLG9CQUFzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FNdEIsc0JBQXdCO0FBQUE7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
|
package/dist/prod/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
class U extends Error{name="PaletteError";code;constructor(L,...Y){let Z=`Code: ${L}`;super(Z);this.code=L}}function h(L,...Y){let Z=L[0]??"";for(let Q=0;Q<Y.length;Q++){let W=Y[Q]??"",$=L[Q+1]??"";Z+=`${W}${$}`}let G=new CSSStyleSheet;return G.replaceSync(Z),G}function S(...L){let Y="";for(let Z=0;Z<L.length;Z++){let G=L[Z];if(!G)continue;if(typeof G==="string"||typeof G==="number"){if(Y)Y+=" ";Y+=G;continue}if(Array.isArray(G)){let Q=S(...G);if(Q){if(Y)Y+=" ";Y+=Q}continue}if(typeof G==="object"){for(let Q in G)if(G[Q]){if(Y)Y+=" ";Y+=Q}}}return Y}function K(L){if(typeof L==="string"||typeof L==="number")return`${L}`;if(L===!0)return"";if(L===null||L===!1||L===void 0)return null;return L.toString()}function f(L){let Y=new Map;if(L instanceof HTMLElement){for(let Z of L.getAttributeNames())Y.set(Z,K(L.getAttribute(Z)));return Y}if(L instanceof Map){for(let[Z,G]of L)Y.set(Z,K(G));return Y}if(typeof L==="object"&&L!==null){for(let[Z,G]of Object.entries(L))Y.set(Z,K(G));return Y}throw new U(0)}function y(L,Y){let Z=new Set(L.getAttributeNames()),G=new Set(Y.keys()),Q=Z.difference(G);for(let W of Q)L.removeAttribute(W);for(let[W,$]of Y)if($===null)L.removeAttribute(W);else L.setAttribute(W,$)}function v(L,Y){let Z=document.createElement(Y);while(L.firstChild!==null)Z.appendChild(L.firstChild);for(let G of L.getAttributeNames()){let Q=L.getAttribute(G);if(Q!==null)Z.setAttribute(G,Q)}return L.replaceWith(Z),Z}function E(L){for(let Y=0;Y<L.length;Y++){let Z=L.charCodeAt(Y);if(!(Z===45||Z>=65&&Z<=90||Z>=97&&Z<=122))return!1}return!0}function c(L,Y){if(Y[0]==="#"&&Y.indexOf(" ")===-1&&Y.indexOf(".")===-1&&Y.indexOf("[")===-1&&Y.indexOf(":")===-1&&Y.indexOf(">")===-1)return L.id===Y.slice(1);if(Y[0]==="."&&Y.indexOf(" ")===-1&&Y.indexOf("#")===-1&&Y.indexOf("[")===-1&&Y.indexOf(":")===-1&&Y.indexOf(">")===-1)return L.classList.contains(Y.slice(1));if(E(Y))return L.tagName.toLowerCase()===Y.toLowerCase();if(Y[0]==="["&&Y[Y.length-1]==="]"&&Y.indexOf(" ")===-1&&Y.indexOf(":")===-1){let Z=Y.slice(1,-1),G=Z.indexOf("=");if(G===-1)return L.hasAttribute(Z);let Q=Z.slice(0,G),W=Z.slice(G+1).replace(/^["']|["']$/g,"");return L.getAttribute(Q)===W}return L.matches(Y)}class b{_maxSize;_data;_metrics={hits:0,misses:0};constructor(L=500){if(L<=0)throw Error("LRU Cache capacity must be >= 1");this._maxSize=L,this._data=new Map}_trim=()=>{while(this._data.size>this._maxSize){let L=this._data.keys().next().value;if(L===void 0)throw Error("Absurd");this._data.delete(L)}};get metrics(){return{lookups:0,hits:0,misses:0,capacity:0,entries:0,hitRate:0}}setCapacity=(L)=>{L<=0,this._maxSize=L,this._trim()};get(L){let Y=this._data.get(L);if(Y===void 0)return;return this._data.delete(L),this._data.set(L,Y),Y}set(L,Y){if(this._data.has(L))this._data.delete(L);if(this._data.set(L,Y),this._data.size>this._maxSize)this._trim()}clear(){this._data.clear()}get size(){return this._data.size}}var m=b;var V=new m;function q(L){let Y=V.get(L);if(Y!==void 0)return Y.cloneNode(!0);let Z=document.createElement("template");return Z.innerHTML=L,V.set(L,Z.content),Z.content.cloneNode(!0)}function Y2(L){if(L instanceof HTMLTemplateElement)return L.innerHTML;if(typeof L==="function"&&(L.prototype instanceof I||L===I)){let Y=L.tagName;if(!E(Y))throw new U(202,L.name,L.tagName);return Y}if(typeof L==="string")return`<span ::swap="${L}"></span>`;throw new U(200,String(L))}function Z2(L,...Y){let Z=L.reduce((Q,W,$)=>{let M=Y[$]?`${Y2(Y[$])}`:"";return Q+W+M},""),G=document.createElement("template");return G.innerHTML=Z,G}var G2=new Set(["push","pop","shift","unshift","splice","sort","reverse","fill","copyWithin"]),Q2=new Set(["add","delete","clear","set"]);class D{_data;_listeners=new Set;_proxy;_proxyCache=new WeakMap;_reverseProxyCache=new WeakMap;_isLocked=!1;_hasWarned=!0;constructor(L,Y){if(this._data=L,this.get=this.get.bind(this),Y)this._listeners.add(Y)}_createProxy(L,Y=[]){if(typeof L!=="object"||L===null)return L;let Z=this._proxyCache.get(L);if(Z)return Z;let G=new Proxy(L,{get:(Q,W)=>{if(typeof W==="symbol")return Q[W];let $=Q[W];if((Q instanceof Set||Q instanceof Map||Array.isArray(Q))&&typeof $==="function"){let F=(Array.isArray(Q)?G2:Q2).has(W);return(...H)=>{let z=this.snapshot(),X=z;for(let B of Y)X=X[B];let _=X[W](...H);if(F){if(this._isLocked)throw new U(305);this._processIncomingState(z)}return _}}if(typeof $==="object"&&$!==null)return this._createProxy($,[...Y,W]);return $},set:(Q,W,$)=>{if(this._isLocked)throw new U(305);if(typeof W==="symbol")return!1;let M=[...Y,W];return this._setNested(M,this._unwrapProxy($)),!0},has:(Q,W)=>{return W in Q},ownKeys:(Q)=>{return Reflect.ownKeys(Q)},getOwnPropertyDescriptor:(Q,W)=>{let $=Object.getOwnPropertyDescriptor(Q,W);if($)$.configurable=!0;return $},deleteProperty:(Q,W)=>{if(typeof W==="symbol"||!(W in Q))return!1;let $=[...Y,W];return this._setNested($,void 0),!0}});return this._proxyCache.set(L,G),this._reverseProxyCache.set(G,L),G}_unwrapProxy(L){if(typeof L!=="object"||L===null)return L;let Y=this._reverseProxyCache.get(L);if(Y)return Y;if(Array.isArray(L))return L.map((Z)=>this._unwrapProxy(Z));if(Object.getPrototypeOf(L)===Object.prototype){let Z={};for(let G in L)if(Object.hasOwn(L,G))Z[G]=this._unwrapProxy(L[G]);return Z}return L}_setNested(L,Y){if(!L.length)return;let Z=this._data;for(let Q=0;Q<L.length-1;Q++){let W=L[Q]??"";if(!(W in Z))throw new U(303,L.join("."));Z=Z[W]}let G=L[L.length-1]??"";if(!(G in Z))throw new U(303,L.join("."));if(Z[G]!==Y&&!Object.is(Z[G],Y))Z[G]=Y,this._emit(this.current)}_processIncomingState=(L)=>{if(typeof L!=="object"||L===null||Array.isArray(L))throw new U(304,JSON.stringify(L));let Y=!1;for(let[Z,G]of Object.entries(L)){let Q=this._data[Z];if(!Object.is(Q,G))Y=!0,this._data[Z]=G}if(Y)this._emit(this._data)};_emit=(L)=>{for(let Y of this._listeners)Y(L)};get current(){return this._data}get live(){if(!this._proxy)this._proxy=this._createProxy(this._data);return this._proxy}get isLocked(){return this._isLocked}addListener=(L)=>{this._listeners.add(L)};removeListener=(L)=>{this._listeners.delete(L)};get=(L)=>{return this._data[L]};snapshot=()=>{return structuredClone(this._data)};set=(L,Y)=>{if(this._isLocked)throw new U(305);let Z={};Z[L]=Y,this._processIncomingState(Z)};patch=(L)=>{if(this._isLocked)throw new U(305);return this._processIncomingState(L),this};replace=(L)=>{if(this._isLocked)throw new U(305);return this._data=L,this._emit(this._data),this};lock=()=>{if(this._isLocked)throw new U(305);return this._isLocked=!0,this};unlock=()=>{return this._isLocked=!1,this};mutate=(L)=>{if(this._isLocked)throw new U(305);return this._processIncomingState(L(this.snapshot())),this};mutateAsync=async(L,Y=!1)=>{if(this._isLocked)throw new U(305);if(Y)this._isLocked=!0;let Z=await L(this.snapshot());if(this._processIncomingState(Z),Y)this._isLocked=!1;return this};transaction=(L)=>{if(this._isLocked)throw new U(305);this._isLocked=!0;let Y=!0;try{let Z=new D(this.snapshot());L(Z),this._processIncomingState(Z.current)}catch(Z){Y=!1}finally{this._isLocked=!1}return Y};transactionAsync=async(L)=>{if(this._isLocked)throw new U(305);this._isLocked=!0;let Y=!0;try{let Z=new D(this.snapshot());await L(Z),this._processIncomingState(Z.current)}catch(Z){Y=!1}finally{this._isLocked=!1}return Y}}function p(L){if(L[0]!==":"||L.length<2)return!1;for(let Y=1;Y<L.length;Y++){let Z=L.charCodeAt(Y);if(!(Z===45||Z>=65&&Z<=90||Z>=97&&Z<=122))return!1}return!0}var W2={["@"]:"attr",["$"]:"state",["*"]:"data",["#"]:"item"},X2=new Map(Object.entries(W2));function g(L){let Y=!1,Z="",G=[],Q=!0;for(let W of L)if(Q&&W==="!")Y=!0;else if(Q){let $=X2.get(W);if(!$)throw new U(201,L);G.push($),Q=!1}else if(W===".")if(Z.length)G.push(Z),Z="";else throw new U(201,L);else Z+=W;if(!Z.length)throw new U(201,L);if(G.push(Z),G.length<2)throw new U(201,L);return{base:L,path:G,modifiers:Y?{not:!0}:void 0}}function k(L){let{path:Y,modifiers:Z}=L;if(Y.length<2)throw new U(0);if(Y.length===2){let[G,Q]=Y;if(G===void 0||Q===void 0)throw new U(0);return(W)=>{let $=W?.[G]?.[Q]??null;if(Z?.not){if(G==="attr")return $!==""&&!$;return!$}return $}}if(Y.length===3){let[G,Q,W]=Y;if(G===void 0||Q===void 0||W===void 0)throw new U(0);return($)=>{let M=$?.[G]?.[Q]?.[W]??null;if(Z?.not){if(G==="attr")return M!==""&&!M;return!M}return M}}return(G)=>{let Q=G;for(let W of Y){if(!Q||typeof Q!=="object")return null;Q=Q[W]}if(Z?.not){if(Y[0]==="attr")return Q!==""&&!Q;return!Q}return Q}}var P="data-node-ref";function $2(L){let Y=document.createTreeWalker(L,NodeFilter.SHOW_ELEMENT),Z=new Set,G=[],Q=Y.nextNode();while(Q){if(!(Q instanceof HTMLElement)){Q=Y.nextNode();continue}let W=Q.parentNode,$=!1;while(W&&!$){if(Z.has(W)||W instanceof HTMLElement&&W.hasAttribute("::each")){$=!0,Z.add(Q);break}W=W.parentNode}if(!$)G.push(Q);Q=Y.nextNode()}return G}function d(L){let Y=new Map,Z=[],G=0,Q=(X)=>{let _=X.getAttribute(P);if(!_)_=`el-${G++}`,X.setAttribute(P,_);return _},W=L.content.cloneNode(!0),$=$2(W);for(let X of $){let _=new Map;for(let B of X.getAttributeNames())_.set(B,X.getAttribute(B));for(let[B,J]of _){if(J===null||B[0]!==":")continue;let O=Y.get(J);if(O===void 0)O=g(J),Y.set(J,O);if(X.removeAttribute(B),B==="::key")continue;if(B==="::tag")Z.push({type:"tag",notation:O,nodeRef:Q(X)});else if(B==="::each"){let A=Q(X),x=X.getAttribute("::key");if(x===null)throw new U(206);X.removeAttribute("::key");let C=X.innerHTML;while(X.firstChild)X.removeChild(X.firstChild);let e={type:"each",notation:O,keyNotation:g(x),nodeRef:A,listContentHtml:C};Z.push(e)}else if(B==="::swap"){let A={type:"swap",notation:O,nodeRef:Q(X)};Z.push(A)}else if(p(B)){let A=B.slice(1),x={type:"attr",notation:O,attribute:A,nodeRef:Q(X)};Z.push(x)}}}let M={};for(let[X,_]of Y)M[X]=_;let F=document.createElement("div");return F.appendChild(W.cloneNode(!0)),{html:F.innerHTML,schemes:Z,notations:M}}function u(L,Y){let Z=new Map,G=new Map,Q=new Map;for(let[z,X]of Object.entries(L.notations))G.set(z,k(X));let W=Y??q(L.html),$=document.createTreeWalker(W,NodeFilter.SHOW_ELEMENT,{acceptNode(z){return z.hasAttribute(P)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}}),M=$.nextNode();while(M){if(!(M instanceof HTMLElement))continue;let z=M.getAttribute(P);if(z===null)throw new U(0);Q.set(z,M),M.removeAttribute(P),M=$.nextNode()}let F=(z,X)=>{let _=Z.get(X);if(!_)_=new Set,Z.set(X,_);_.add(z)},H=(z)=>{let X=Q.get(z);if(X)return X;throw new U(204)};for(let z of L.schemes)if(z.type==="each"){let X=H(z.nodeRef),_=X.parentElement;if(!_)throw new U(205);let B=document.createComment("list-start"),J=document.createComment("list-end");_.insertBefore(B,X),_.insertBefore(J,X.nextSibling);let O=X.cloneNode(!1),A=q(z.listContentHtml),x=document.createElement("template");x.appendChild(A),X.remove();let C={type:"each",notation:z.notation,keyNotation:z.keyNotation,listContainerElement:_,rowTemplateElement:x,rowRootElement:O,startMarker:B,endMarker:J,rowTemplatesByRoot:new WeakMap,rowRootsByKey:new Map};F(C,z.notation.base)}else if(z.type==="swap"){let X={type:"swap",notation:z.notation,node:H(z.nodeRef)};F(X,z.notation.base)}else if(z.type==="tag"){let X={type:"tag",notation:z.notation,node:H(z.nodeRef)};F(X,X.notation.base)}else if(z.type==="attr"){let X={type:"attr",attribute:z.attribute,notation:z.notation,node:H(z.nodeRef)};F(X,X.notation.base)}return{plansByNotation:Z,notationAccessors:G,fragment:W}}var j=Symbol("noop");function i(L,Y){let Z=Y.get(L.notation.base),G=typeof Z==="function"?Z(L.node):Z;if(L.attribute==="class"&&typeof G!=="string")G=S(G);let Q=K(G),W=L.node.getAttribute(L.attribute);if(Q!==W)return[L.node,L.attribute,Q];return j}function s(L){for(let[Y,Z,G]of L)if(G===null)Y.removeAttribute(Z);else Y.setAttribute(Z,G)}function l(L,Y){let Z=Y.get(L.notation.base),G=typeof Z==="function"?Z(L.node):Z;if(typeof G==="string"||typeof G==="number"||typeof G==="boolean"){let Q=`${G}`;if(L.node.textContent===Q)return j;return[L,document.createTextNode(Q)]}else if(G===null||G===void 0){if(L.node instanceof Comment)return j;return[L,document.createComment("empty")]}else if(G instanceof HTMLElement){if(Object.is(L.node,G))return j;return[L,G.cloneNode(!0)]}else throw new U(302,typeof G,JSON.stringify(G))}function o(L){for(let[Y,Z]of L){let G=Y.node.parentNode;if(!G)throw new U(0);G.replaceChild(Z,Y.node),Y.node=Z}}function n(L,Y){let Z=Y.get(L.notation.base)??"",Q=`${typeof Z==="function"?Z(L.node):Z}`.toLowerCase(),W=L.node.tagName.toLowerCase();if(!Q||Q===W)return j;return[L,Q]}function a(L){for(let[Y,Z]of L)Y.node=v(Y.node,Z)}function U2(L,Y){let Z=Y.get(L.notation.base),G=typeof Z==="function"?Z(L.startMarker.parentNode):Z;if(G===null||G===void 0)return[];if(Array.isArray(G))return G;throw new U(203)}function z2(L,Y){let Z=L,G=new Set;while(Z&&Z!==Y){if(Z instanceof HTMLElement)G.add(Z);Z=Z.nextSibling}return G}function r(L,Y){let Z=U2(L,Y);if(Z.length===0)return[L,[]];let{rowTemplatesByRoot:G,rowTemplateElement:Q,rowRootElement:W}=L,$=k(L.keyNotation),M=new Map;for(let F of Z){let H={item:F},z=$(H);if(M.has(z))throw new U(207,String(z));let X=L.rowRootsByKey.get(z);if(X===void 0)X=W.cloneNode(!1),L.rowRootsByKey.set(z,X);let _=G.get(X);if(_===void 0)_=new T(Q),G.set(X,_);let B={context:H,root:X,template:_,attrMap:f(F)};M.set(z,B)}for(let[F,H]of L.rowRootsByKey)if(!M.has(F))L.rowRootsByKey.delete(F),L.rowTemplatesByRoot.delete(H);return[L,Array.from(M.values())]}function t(L){for(let[Y,Z]of L){let{endMarker:G,listContainerElement:Q}=Y;if(Z.length===0){for(let F of Y.rowRootsByKey.values())F.remove();Y.rowRootsByKey.clear();continue}let W=Array.from(z2(Y.startMarker,Y.endMarker)),$=new Set,M=0;for(let F of Z){let{root:H,attrMap:z,context:X,template:_}=F,B=W[M];if(y(H,z),_.render(H,X),$.add(H),Object.is(B,H)){M+=1;continue}if(!B){Q.insertBefore(H,G);continue}Q.insertBefore(H,B)}for(let F of W)if(!$.has(F))F.remove(),Y.rowTemplatesByRoot.delete(F)}}var N=new b;class T{static cache={clear:()=>{V.clear(),N.clear()},setCapacity:(L)=>{V.setCapacity(L),N.setCapacity(L)}};_compiled;_templateElement;_mountedRoot;_latestRenderedValues=new Map;_fragment;_plansByNotation=new Map;_notationAccessors=new Map;constructor(L){if(L instanceof HTMLTemplateElement){this._templateElement=L;let Q=N.get(L)??d(L);this._compiled=Q,N.set(L,Q)}else this._compiled=L;let Y=q(this._compiled.html),Z=u(this._compiled,Y);this._plansByNotation=Z.plansByNotation,this._notationAccessors=Z.notationAccessors,this._fragment=Z.fragment}clone=()=>{return new T(this.element())};element=()=>{if(this._templateElement)return this._templateElement;let L=document.createElement("template");return L.innerHTML=this._compiled.html,L};_collectUpdatedValues=(L)=>{let Y=new Map;for(let[Z,G]of this._notationAccessors){let Q=this._latestRenderedValues.get(Z),W=G(L);if(Q!==W&&!Object.is(Q,W))Y.set(Z,W)}return Y};_update(L){let Y=new Set,Z=[],G=[],Q=[],W=[];for(let[$]of L){let M=this._plansByNotation.get($);if(M)for(let F of M){if(Y.has(F))continue;switch(Y.add(F),F.type){case"attr":{let H=i(F,L);if(H!==j)Z.push(H);break}case"each":{let H=r(F,L);if(H!==j)W.push(H);break}case"swap":{let H=l(F,L);if(H!==j)G.push(H);break}case"tag":{let H=n(F,L);if(H!==j)Q.push(H);break}default:throw new U(0)}}}s(Z),t(W),o(G),a(Q)}render=(L,Y)=>{if(L!==this._mountedRoot){this._mountedRoot=L;while(L.firstChild)L.removeChild(L.firstChild);L.append(this._fragment)}let Z=this._collectUpdatedValues(Y);if(Z.size!==0){this._update(Z);for(let[G,Q]of Z)this._latestRenderedValues.set(G,Q)}}}class w{static nextListenerId=0;static processTargetDescriptor(L){if(L instanceof HTMLElement)if(L.id.length)return`#${L.id}`;else{let Y=`listen-${w.nextListenerId++}`;return L.setAttribute("data-listener-id",Y),`[data-listener-id="${Y}"]`}else if(typeof L==="function")return L.tagName;return L}_root;_rootListeners=new Map;_events=new Map;constructor(L=document){this._root=L}_handlersForEvent(L){let Y=this._events.get(L);if(Y===void 0)Y=new Map,this._events.set(L,Y);return Y}_handlersForEventAndQuery(L,Y){let Z=this._handlersForEvent(L),G=Z.get(Y);if(G===void 0)G=new Set,Z.set(Y,G);return G}_createRootListener(L){if(this._rootListeners.has(L))return;let Y=(Z)=>{let G=this._handlersForEvent(L),{target:Q}=Z;if(Q===null||!(Q instanceof Node))return;let W=Q,$=!1,M=Z.stopImmediatePropagation;Z.stopImmediatePropagation=()=>{M.call(Z),$=!0};while(W){if(W===this._root)break;if(!(W instanceof Element)){W=W.parentNode;continue}for(let[F,H]of G)if(F==="*"||c(W,F)){for(let z of H)if(z.call(W,Z),$||Z.defaultPrevented)return}if(Z.cancelBubble)return;if(W=W.parentNode,W===this._root||W instanceof ShadowRoot)break}};this._rootListeners.set(L,Y),this._root.addEventListener(L,Y)}addListener(L,Y,Z="*"){this._handlersForEventAndQuery(L,Z).add(Y),this._createRootListener(L)}removeListener(L,Y,Z){let G=this._handlersForEventAndQuery(L,Z);if(G.delete(Y),G.size===0)this._handlersForEvent(L).delete(Z)}cleanup=()=>{for(let[L,Y]of this._rootListeners)this._root.removeEventListener(L,Y);this._rootListeners.clear()}}var F2=100,M2=document.createElement("template");class I extends HTMLElement{static register(L,Y){if(typeof window>"u"||typeof window.customElements>"u")throw new U(1);let Z="tagName"in L&&typeof L.tagName==="string"?L.tagName:null,G=Y??Z;if(G===null||G.length===0||!G.includes("-"))throw new U(101);if(window.customElements.get(G))throw new U(100,Y??"");window.customElements.define(G,L)}static tagName="";static template=M2;static styles=[];static observedAttributes=[];static shadowRootMode="closed";initialState;computedProperties;liveAttributes;_isComponentMounted=!1;_template;_root;_state;_delegator;_ownListeners=new Set;_liveAttributeConfigs=new Map;_cleanupFn;_renderInternals={willRender:!1,isRendering:!1,sequentialRenders:0,postRenderCallbacks:new Set,lastRenderedAttributeMap:new Map,trackedAttributeChanges:new Map};constructor(){super();let{template:L,styles:Y,shadowRootMode:Z}=this.constructor,G=Array.isArray(Y)?Y:typeof Y==="object"?[Y]:[h`${Y}`];this._root=this.attachShadow({mode:Z}),this._root.adoptedStyleSheets.push(...G),this._template=L instanceof T?L:new T(L)}_getRenderContext(L){return{attr:Object.fromEntries(L),data:typeof this.computedProperties==="function"?this.computedProperties():this.computedProperties,state:this._state?this._state.current:void 0}}_escalateError(L){let Y=this.parentNode;while(Y)if(Y instanceof I&&"onError"in Y&&typeof Y.onError==="function"){Y.onError(L);return}else if(Y instanceof ShadowRoot)Y=Y.host;else Y=Y.parentNode;throw L}_reportError(L){if(!this.onError)this._escalateError(L);else this.onError(L)}_executeAttributeChangeHandlers=()=>{let L=this._renderInternals.lastRenderedAttributeMap,Y=new Map(this._renderInternals.trackedAttributeChanges);this._renderInternals.trackedAttributeChanges.clear();for(let[Z,G]of Y){let Q=this._liveAttributeConfigs.get(Z);if(!Q)continue;if("onChange"in Q){let W=L.get(Z)??null;if(Q&&W!==G)Q.onChange?.call(this,G,W)}}};_reflectLiveAttributes=()=>{let L=[];for(let[Y,Z]of this._liveAttributeConfigs)if("reflect"in Z){let G=K(Z.reflect?.call(this)),Q=this.getAttribute(Y);if(G!==Q)L.push([Y,G])}for(let[Y,Z]of L)this.reflectAttribute(Y,Z)};_performUpdate=()=>{try{this._renderInternals.isRendering=!0,this._renderInternals.willRender=!1,this._executeAttributeChangeHandlers();let L=this._renderInternals.lastRenderedAttributeMap;this.beforeUpdate?.();let Y=f(this);if(this._template.render(this.root,this._getRenderContext(Y)),this._renderInternals.lastRenderedAttributeMap=Y,this.afterUpdate?.(L),this._reflectLiveAttributes(),this._renderInternals.postRenderCallbacks.size){let Z=Array.from(this._renderInternals.postRenderCallbacks);this._renderInternals.postRenderCallbacks.clear();for(let G of Z)G()}if(this._renderInternals.willRender){if(this._renderInternals.sequentialRenders+=1,this._renderInternals.sequentialRenders>=F2)throw new U(306,`${this._renderInternals.sequentialRenders}`);this._performUpdate()}else this._renderInternals.sequentialRenders=0}catch(L){this._renderInternals.willRender=!1,this._reportError(L)}finally{this._renderInternals.isRendering=!1}};_scheduleUpdate=()=>{if(this._renderInternals.willRender)return;if(this._renderInternals.willRender=!0,this._renderInternals.isRendering)return;requestAnimationFrame(this._performUpdate)};_adoptState(L){if(Object.is(this._state,L))return;if(this._state)this._state.removeListener(this._scheduleUpdate),this._scheduleUpdate();let Y=L instanceof D?L:new D(L);this._state=Y,this._state.removeListener(this._scheduleUpdate),this._state.addListener(this._scheduleUpdate)}connectedCallback(){if(this._isComponentMounted)return;queueMicrotask(()=>{try{this._renderInternals.isRendering=!0,this._renderInternals.willRender=!1;let L=f(this);if(this._liveAttributeConfigs=new Map(Object.entries(this.liveAttributes??{})),this.initialState){let Y=typeof this.initialState==="object"?this.initialState:this.initialState();this._adoptState(Y)}this._template.render(this.root,this._getRenderContext(L)),this._reflectLiveAttributes(),this._renderInternals.lastRenderedAttributeMap=L,this._isComponentMounted=!0,this._cleanupFn=this.script?.()??void 0}catch(L){this._reportError(L)}finally{this._renderInternals.isRendering=!1}})}disconnectedCallback(){queueMicrotask(()=>{if(this.isConnected||!this._isComponentMounted)return;try{if(this._delegator?.cleanup(),this._ownListeners.size>0)for(let L of this._ownListeners)this.removeEventListener(L.event,L.handler);this._cleanupFn?.(),this._isComponentMounted=!1}catch(L){this._reportError(L)}finally{try{this.finalize?.()}catch(L){this._reportError(L)}}})}attributeChangedCallback(L,Y,Z){if(this._renderInternals.isRendering)return;if(Z===this._renderInternals.lastRenderedAttributeMap?.get(L))return;if(this._renderInternals.trackedAttributeChanges.set(L,Z),!this._renderInternals.willRender)this._scheduleUpdate()}get root(){return this._root}get state(){if(!this._state)throw new U(301);return this._state.live}set state(L){this._adoptState(L)}getState(){if(!this._state)throw new U(301);return this._state}requestRender(L){if(L)this._renderInternals.postRenderCallbacks.add(L);this._scheduleUpdate()}listen(L,Y,Z){let G=w.processTargetDescriptor(L);if(G===":host"||G===":HOST"){this.addEventListener(Y,Z),this._ownListeners.add({handler:Z,event:Y});return}if(!this._delegator)this._delegator=new w(this.root);this._delegator.addListener(Y,Z,G)}stopListening(L,Y,Z){let G=w.processTargetDescriptor(L);if(G===":host"||G===":HOST"){this.removeEventListener(Y,Z);for(let Q of this._ownListeners)if(Q.event===Y&&Q.handler===Z)this._ownListeners.delete(Q);return}if(!this._delegator)return;this._delegator.removeListener(Y,Z,G)}dispatchEvent(L,Y,Z){if(L instanceof Event)return super.dispatchEvent(L);let G={bubbles:!0,cancelable:!0,composed:!0,...Z??{}};return super.dispatchEvent(new CustomEvent(L,{detail:Y,...G}))}querySelector(L){return this._root.querySelector(L)}querySelectorAll(L){return this._root.querySelectorAll(L)}getElementById(L){if(this._root instanceof ShadowRoot)return this._root.getElementById(L);else return HTMLElement.prototype.querySelector.call(this,`#${L}`)}requireElementById(L){let Y=this.getElementById(L);if(!Y)throw new U(300);return Y}setAttribute(L,Y){let Z=K(Y);if(Z===null)HTMLElement.prototype.removeAttribute.call(this,L);else HTMLElement.prototype.setAttribute.call(this,L,Z)}getAttribute(L,Y){let Z=HTMLElement.prototype.getAttribute.call(this,L);if(Y===void 0)return Z;if(typeof Y==="number"){if(Z===null)return Y;let G=Number(Z);if(Number.isNaN(G))return Y;return G}throw new U(0)}reflectAttribute(L,Y){let Z=this.getAttribute(L),G=K(Y);if(Z!==G)this.setAttribute(L,G)}toString(L=!1){let Y=this.constructor.name,Z=this.getAttributeNames().map((Q)=>{let W=this.getAttribute(Q);return W?`${Q}="${W}"`:""}).join(" "),G=Z.length>0?` ${Z}`:"";if(L)return`Component<${Y}${G}>
|
|
1
|
+
class U extends Error{name="PaletteError";code;constructor(L,...Y){let Z=`Code: ${L}`;super(Z);this.code=L}}function h(L,...Y){let Z=L[0]??"";for(let Q=0;Q<Y.length;Q++){let W=Y[Q]??"",$=L[Q+1]??"";Z+=`${W}${$}`}let G=new CSSStyleSheet;return G.replaceSync(Z),G}function P(...L){let Y="";for(let Z=0;Z<L.length;Z++){let G=L[Z];if(!G)continue;if(typeof G==="string"||typeof G==="number"){if(Y)Y+=" ";Y+=G;continue}if(Array.isArray(G)){let Q=P(...G);if(Q){if(Y)Y+=" ";Y+=Q}continue}if(typeof G==="object"){for(let Q in G)if(G[Q]){if(Y)Y+=" ";Y+=Q}}}return Y}function K(L){if(typeof L==="string"||typeof L==="number")return`${L}`;if(L===!0)return"";if(L===null||L===!1||L===void 0)return null;return L.toString()}function f(L){let Y=new Map;if(L instanceof HTMLElement){for(let Z of L.getAttributeNames())Y.set(Z,K(L.getAttribute(Z)));return Y}if(L instanceof Map){for(let[Z,G]of L)Y.set(Z,K(G));return Y}if(typeof L==="object"&&L!==null){for(let[Z,G]of Object.entries(L))Y.set(Z,K(G));return Y}throw new U(0)}function y(L,Y){let Z=new Set(L.getAttributeNames()),G=new Set(Y.keys()),Q=Z.difference(G);for(let W of Q)L.removeAttribute(W);for(let[W,$]of Y)if($===null)L.removeAttribute(W);else L.setAttribute(W,$)}function v(L,Y){let Z=document.createElement(Y);while(L.firstChild!==null)Z.appendChild(L.firstChild);for(let G of L.getAttributeNames()){let Q=L.getAttribute(G);if(Q!==null)Z.setAttribute(G,Q)}return L.replaceWith(Z),Z}function E(L){for(let Y=0;Y<L.length;Y++){let Z=L.charCodeAt(Y);if(!(Z===45||Z>=65&&Z<=90||Z>=97&&Z<=122))return!1}return!0}function c(L,Y){if(Y[0]==="#"&&Y.indexOf(" ")===-1&&Y.indexOf(".")===-1&&Y.indexOf("[")===-1&&Y.indexOf(":")===-1&&Y.indexOf(">")===-1)return L.id===Y.slice(1);if(Y[0]==="."&&Y.indexOf(" ")===-1&&Y.indexOf("#")===-1&&Y.indexOf("[")===-1&&Y.indexOf(":")===-1&&Y.indexOf(">")===-1)return L.classList.contains(Y.slice(1));if(E(Y))return L.tagName.toLowerCase()===Y.toLowerCase();if(Y[0]==="["&&Y[Y.length-1]==="]"&&Y.indexOf(" ")===-1&&Y.indexOf(":")===-1){let Z=Y.slice(1,-1),G=Z.indexOf("=");if(G===-1)return L.hasAttribute(Z);let Q=Z.slice(0,G),W=Z.slice(G+1).replace(/^["']|["']$/g,"");return L.getAttribute(Q)===W}return L.matches(Y)}class b{_maxSize;_data;_metrics={hits:0,misses:0};constructor(L=500){if(L<=0)throw Error("LRU Cache capacity must be >= 1");this._maxSize=L,this._data=new Map}_trim=()=>{while(this._data.size>this._maxSize){let L=this._data.keys().next().value;if(L===void 0)throw Error("Absurd");this._data.delete(L)}};get metrics(){return{lookups:0,hits:0,misses:0,capacity:0,entries:0,hitRate:0}}setCapacity=(L)=>{L<=0,this._maxSize=L,this._trim()};get(L){let Y=this._data.get(L);if(Y===void 0)return;return this._data.delete(L),this._data.set(L,Y),Y}set(L,Y){if(this._data.has(L))this._data.delete(L);if(this._data.set(L,Y),this._data.size>this._maxSize)this._trim()}clear(){this._data.clear()}get size(){return this._data.size}}var m=b;var V=new m;function q(L){let Y=V.get(L);if(Y!==void 0)return Y.cloneNode(!0);let Z=document.createElement("template");return Z.innerHTML=L,V.set(L,Z.content),Z.content.cloneNode(!0)}function Y2(L){if(L instanceof HTMLTemplateElement)return L.innerHTML;if(typeof L==="function"&&(L.prototype instanceof I||L===I)){let Y=L.tagName;if(!E(Y))throw new U(202,L.name,L.tagName);return Y}if(typeof L==="string")return`<span ::swap="${L}"></span>`;throw new U(200,String(L))}function Z2(L,...Y){let Z=L.reduce((Q,W,$)=>{let M=Y[$]?`${Y2(Y[$])}`:"";return Q+W+M},""),G=document.createElement("template");return G.innerHTML=Z,G}var G2=new Set(["push","pop","shift","unshift","splice","sort","reverse","fill","copyWithin"]),Q2=new Set(["add","delete","clear","set"]);class D{_data;_listeners=new Set;_proxy;_proxyCache=new WeakMap;_reverseProxyCache=new WeakMap;_isLocked=!1;_hasWarned=!0;constructor(L,Y){if(this._data=L,this.get=this.get.bind(this),Y)this._listeners.add(Y)}_createProxy(L,Y=[]){if(typeof L!=="object"||L===null)return L;let Z=this._proxyCache.get(L);if(Z)return Z;let G=new Proxy(L,{get:(Q,W)=>{if(typeof W==="symbol")return Q[W];let $=Q[W];if((Q instanceof Set||Q instanceof Map||Array.isArray(Q))&&typeof $==="function"){let F=(Array.isArray(Q)?G2:Q2).has(W);return(...H)=>{let z=this.snapshot(),X=z;for(let B of Y)X=X[B];let _=X[W](...H);if(F){if(this._isLocked)throw new U(305);this._processIncomingState(z)}return _}}if(typeof $==="object"&&$!==null)return this._createProxy($,[...Y,W]);return $},set:(Q,W,$)=>{if(this._isLocked)throw new U(305);if(typeof W==="symbol")return!1;let M=[...Y,W];return this._setNested(M,this._unwrapProxy($)),!0},has:(Q,W)=>{return W in Q},ownKeys:(Q)=>{return Reflect.ownKeys(Q)},getOwnPropertyDescriptor:(Q,W)=>{let $=Object.getOwnPropertyDescriptor(Q,W);if($)$.configurable=!0;return $},deleteProperty:(Q,W)=>{if(typeof W==="symbol"||!(W in Q))return!1;let $=[...Y,W];return this._setNested($,void 0),!0}});return this._proxyCache.set(L,G),this._reverseProxyCache.set(G,L),G}_unwrapProxy(L){if(typeof L!=="object"||L===null)return L;let Y=this._reverseProxyCache.get(L);if(Y)return Y;if(Array.isArray(L))return L.map((Z)=>this._unwrapProxy(Z));if(Object.getPrototypeOf(L)===Object.prototype){let Z={};for(let G in L)if(Object.hasOwn(L,G))Z[G]=this._unwrapProxy(L[G]);return Z}return L}_setNested(L,Y){if(!L.length)return;let Z=this._data;for(let Q=0;Q<L.length-1;Q++){let W=L[Q]??"";if(!(W in Z))throw new U(303,L.join("."));Z=Z[W]}let G=L[L.length-1]??"";if(!(G in Z))throw new U(303,L.join("."));if(Z[G]!==Y&&!Object.is(Z[G],Y))Z[G]=Y,this._emit(this.current)}_processIncomingState=(L)=>{if(typeof L!=="object"||L===null||Array.isArray(L))throw new U(304,JSON.stringify(L));let Y=!1;for(let[Z,G]of Object.entries(L)){let Q=this._data[Z];if(!Object.is(Q,G))Y=!0,this._data[Z]=G}if(Y)this._emit(this._data)};_emit=(L)=>{for(let Y of this._listeners)Y(L)};get current(){return this._data}get live(){if(!this._proxy)this._proxy=this._createProxy(this._data);return this._proxy}get isLocked(){return this._isLocked}addListener=(L)=>{this._listeners.add(L)};removeListener=(L)=>{this._listeners.delete(L)};get=(L)=>{return this._data[L]};snapshot=()=>{return structuredClone(this._data)};set=(L,Y)=>{if(this._isLocked)throw new U(305);let Z={};Z[L]=Y,this._processIncomingState(Z)};patch=(L)=>{if(this._isLocked)throw new U(305);return this._processIncomingState(L),this};replace=(L)=>{if(this._isLocked)throw new U(305);return this._data=L,this._emit(this._data),this};lock=()=>{if(this._isLocked)throw new U(305);return this._isLocked=!0,this};unlock=()=>{return this._isLocked=!1,this};mutate=(L)=>{if(this._isLocked)throw new U(305);return this._processIncomingState(L(this.snapshot())),this};mutateAsync=async(L,Y=!1)=>{if(this._isLocked)throw new U(305);if(Y)this._isLocked=!0;let Z=await L(this.snapshot());if(this._processIncomingState(Z),Y)this._isLocked=!1;return this};transaction=(L)=>{if(this._isLocked)throw new U(305);this._isLocked=!0;let Y=!0;try{let Z=new D(this.snapshot());L(Z),this._processIncomingState(Z.current)}catch(Z){Y=!1}finally{this._isLocked=!1}return Y};transactionAsync=async(L)=>{if(this._isLocked)throw new U(305);this._isLocked=!0;let Y=!0;try{let Z=new D(this.snapshot());await L(Z),this._processIncomingState(Z.current)}catch(Z){Y=!1}finally{this._isLocked=!1}return Y}}function p(L){if(L[0]!==":"||L.length<2)return!1;for(let Y=1;Y<L.length;Y++){let Z=L.charCodeAt(Y);if(!(Z===45||Z>=65&&Z<=90||Z>=97&&Z<=122))return!1}return!0}var W2={["@"]:"attr",["$"]:"state",["*"]:"data",["#"]:"item"},X2=new Map(Object.entries(W2));function g(L){let Y=!1,Z="",G=[],Q=!0;for(let W of L)if(Q&&W==="!")Y=!0;else if(Q){let $=X2.get(W);if(!$)throw new U(201,L);G.push($),Q=!1}else if(W===".")if(Z.length)G.push(Z),Z="";else throw new U(201,L);else Z+=W;if(!Z.length)throw new U(201,L);if(G.push(Z),G.length<2)throw new U(201,L);return{base:L,path:G,modifiers:Y?{not:!0}:void 0}}function k(L){let{path:Y,modifiers:Z}=L;if(Y.length<2)throw new U(0);if(Y.length===2){let[G,Q]=Y;if(G===void 0||Q===void 0)throw new U(0);return(W)=>{let $=W?.[G]?.[Q]??null;if(Z?.not){if(G==="attr")return $!==""&&!$;return!$}return $}}if(Y.length===3){let[G,Q,W]=Y;if(G===void 0||Q===void 0||W===void 0)throw new U(0);return($)=>{let M=$?.[G]?.[Q]?.[W]??null;if(Z?.not){if(G==="attr")return M!==""&&!M;return!M}return M}}return(G)=>{let Q=G;for(let W of Y){if(!Q||typeof Q!=="object")return null;Q=Q[W]}if(Z?.not){if(Y[0]==="attr")return Q!==""&&!Q;return!Q}return Q}}var S="data-node-ref";function $2(L){let Y=document.createTreeWalker(L,NodeFilter.SHOW_ELEMENT),Z=new Set,G=[],Q=Y.nextNode();while(Q){if(!(Q instanceof HTMLElement)){Q=Y.nextNode();continue}let W=Q.parentNode,$=!1;while(W&&!$){if(Z.has(W)||W instanceof HTMLElement&&W.hasAttribute("::each")){$=!0,Z.add(Q);break}W=W.parentNode}if(!$)G.push(Q);Q=Y.nextNode()}return G}function d(L){let Y=new Map,Z=[],G=0,Q=(X)=>{let _=X.getAttribute(S);if(!_)_=`el-${G++}`,X.setAttribute(S,_);return _},W=L.content.cloneNode(!0),$=$2(W);for(let X of $){let _=new Map;for(let B of X.getAttributeNames())_.set(B,X.getAttribute(B));for(let[B,J]of _){if(J===null||B[0]!==":")continue;let O=Y.get(J);if(O===void 0)O=g(J),Y.set(J,O);if(X.removeAttribute(B),B==="::key")continue;if(B==="::tag")Z.push({type:"tag",notation:O,nodeRef:Q(X)});else if(B==="::each"){let A=Q(X),x=X.getAttribute("::key");if(x===null)throw new U(206);X.removeAttribute("::key");let C=X.innerHTML;while(X.firstChild)X.removeChild(X.firstChild);let e={type:"each",notation:O,keyNotation:g(x),nodeRef:A,listContentHtml:C};Z.push(e)}else if(B==="::swap"){let A={type:"swap",notation:O,nodeRef:Q(X)};Z.push(A)}else if(p(B)){let A=B.slice(1),x={type:"attr",notation:O,attribute:A,nodeRef:Q(X)};Z.push(x)}}}let M={};for(let[X,_]of Y)M[X]=_;let F=document.createElement("div");return F.appendChild(W.cloneNode(!0)),{html:F.innerHTML,schemes:Z,notations:M}}function u(L,Y){let Z=new Map,G=new Map,Q=new Map;for(let[z,X]of Object.entries(L.notations))G.set(z,k(X));let W=Y??q(L.html),$=document.createTreeWalker(W,NodeFilter.SHOW_ELEMENT,{acceptNode(z){return z.hasAttribute(S)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}}),M=$.nextNode();while(M){if(!(M instanceof HTMLElement))continue;let z=M.getAttribute(S);if(z===null)throw new U(0);Q.set(z,M),M.removeAttribute(S),M=$.nextNode()}let F=(z,X)=>{let _=Z.get(X);if(!_)_=new Set,Z.set(X,_);_.add(z)},H=(z)=>{let X=Q.get(z);if(X)return X;throw new U(204)};for(let z of L.schemes)if(z.type==="each"){let X=H(z.nodeRef),_=X.parentElement;if(!_)throw new U(205);let B=document.createComment("list-start"),J=document.createComment("list-end");_.insertBefore(B,X),_.insertBefore(J,X.nextSibling);let O=X.cloneNode(!1),A=q(z.listContentHtml),x=document.createElement("template");x.content.appendChild(A),X.remove();let C={type:"each",notation:z.notation,keyNotation:z.keyNotation,listContainerElement:_,rowTemplateElement:x,rowRootElement:O,startMarker:B,endMarker:J,rowTemplatesByRoot:new WeakMap,rowRootsByKey:new Map};F(C,z.notation.base)}else if(z.type==="swap"){let X={type:"swap",notation:z.notation,node:H(z.nodeRef)};F(X,z.notation.base)}else if(z.type==="tag"){let X={type:"tag",notation:z.notation,node:H(z.nodeRef)};F(X,X.notation.base)}else if(z.type==="attr"){let X={type:"attr",attribute:z.attribute,notation:z.notation,node:H(z.nodeRef)};F(X,X.notation.base)}return{plansByNotation:Z,notationAccessors:G,fragment:W}}var j=Symbol("noop");function i(L,Y){let Z=Y.get(L.notation.base),G=typeof Z==="function"?Z(L.node):Z;if(L.attribute==="class"&&typeof G!=="string")G=P(G);let Q=K(G),W=L.node.getAttribute(L.attribute);if(Q!==W)return[L.node,L.attribute,Q];return j}function s(L){for(let[Y,Z,G]of L)if(G===null)Y.removeAttribute(Z);else Y.setAttribute(Z,G)}function l(L,Y){let Z=Y.get(L.notation.base),G=typeof Z==="function"?Z(L.node):Z;if(typeof G==="string"||typeof G==="number"||typeof G==="boolean"){let Q=`${G}`;if(L.node.textContent===Q)return j;return[L,document.createTextNode(Q)]}else if(G===null||G===void 0){if(L.node instanceof Comment)return j;return[L,document.createComment("empty")]}else if(G instanceof HTMLElement){if(Object.is(L.node,G))return j;return[L,G.cloneNode(!0)]}else throw new U(302,typeof G,JSON.stringify(G))}function o(L){for(let[Y,Z]of L){let G=Y.node.parentNode;if(!G)throw new U(0);G.replaceChild(Z,Y.node),Y.node=Z}}function n(L,Y){let Z=Y.get(L.notation.base)??"",Q=`${typeof Z==="function"?Z(L.node):Z}`.toLowerCase(),W=L.node.tagName.toLowerCase();if(!Q||Q===W)return j;return[L,Q]}function a(L){for(let[Y,Z]of L)Y.node=v(Y.node,Z)}function U2(L,Y){let Z=Y.get(L.notation.base),G=typeof Z==="function"?Z(L.startMarker.parentNode):Z;if(G===null||G===void 0)return[];if(Array.isArray(G))return G;throw new U(203)}function z2(L,Y){let Z=L,G=new Set;while(Z&&Z!==Y){if(Z instanceof HTMLElement)G.add(Z);Z=Z.nextSibling}return G}function r(L,Y){let Z=U2(L,Y);if(Z.length===0)return[L,[]];let{rowTemplatesByRoot:G,rowTemplateElement:Q,rowRootElement:W}=L,$=k(L.keyNotation),M=new Map;for(let F of Z){let H={item:F},z=$(H);if(M.has(z))throw new U(207,String(z));let X=L.rowRootsByKey.get(z);if(X===void 0)X=W.cloneNode(!1),L.rowRootsByKey.set(z,X);let _=G.get(X);if(_===void 0)_=new T(Q),G.set(X,_);let B={context:H,root:X,template:_,attrMap:f(F)};M.set(z,B)}for(let[F,H]of L.rowRootsByKey)if(!M.has(F))L.rowRootsByKey.delete(F),L.rowTemplatesByRoot.delete(H);return[L,Array.from(M.values())]}function t(L){for(let[Y,Z]of L){let{endMarker:G,listContainerElement:Q}=Y;if(Z.length===0){for(let F of Y.rowRootsByKey.values())F.remove();Y.rowRootsByKey.clear();continue}let W=Array.from(z2(Y.startMarker,Y.endMarker)),$=new Set,M=0;for(let F of Z){let{root:H,attrMap:z,context:X,template:_}=F,B=W[M];if(y(H,z),_.render(H,X),$.add(H),Object.is(B,H)){M+=1;continue}if(!B){Q.insertBefore(H,G);continue}Q.insertBefore(H,B)}for(let F of W)if(!$.has(F))F.remove(),Y.rowTemplatesByRoot.delete(F)}}var N=new b;class T{static cache={clear:()=>{V.clear(),N.clear()},setCapacity:(L)=>{V.setCapacity(L),N.setCapacity(L)}};_compiled;_templateElement;_mountedRoot;_latestRenderedValues=new Map;_fragment;_plansByNotation=new Map;_notationAccessors=new Map;constructor(L){if(L instanceof HTMLTemplateElement){this._templateElement=L;let Q=N.get(L)??d(L);this._compiled=Q,N.set(L,Q)}else this._compiled=L;let Y=q(this._compiled.html),Z=u(this._compiled,Y);this._plansByNotation=Z.plansByNotation,this._notationAccessors=Z.notationAccessors,this._fragment=Z.fragment}clone=()=>{return new T(this.element())};element=()=>{if(this._templateElement)return this._templateElement;let L=document.createElement("template");return L.innerHTML=this._compiled.html,L};_collectUpdatedValues=(L)=>{let Y=new Map;for(let[Z,G]of this._notationAccessors){let Q=this._latestRenderedValues.get(Z),W=G(L);if(Q!==W&&!Object.is(Q,W))Y.set(Z,W)}return Y};_update(L){let Y=new Set,Z=[],G=[],Q=[],W=[];for(let[$]of L){let M=this._plansByNotation.get($);if(M)for(let F of M){if(Y.has(F))continue;switch(Y.add(F),F.type){case"attr":{let H=i(F,L);if(H!==j)Z.push(H);break}case"each":{let H=r(F,L);if(H!==j)W.push(H);break}case"swap":{let H=l(F,L);if(H!==j)G.push(H);break}case"tag":{let H=n(F,L);if(H!==j)Q.push(H);break}default:throw new U(0)}}}s(Z),t(W),o(G),a(Q)}render=(L,Y)=>{if(L!==this._mountedRoot){this._mountedRoot=L;while(L.firstChild)L.removeChild(L.firstChild);L.append(this._fragment)}let Z=this._collectUpdatedValues(Y);if(Z.size!==0){this._update(Z);for(let[G,Q]of Z)this._latestRenderedValues.set(G,Q)}}}class w{static nextListenerId=0;static processTargetDescriptor(L){if(L instanceof HTMLElement)if(L.id.length)return`#${L.id}`;else{let Y=`listen-${w.nextListenerId++}`;return L.setAttribute("data-listener-id",Y),`[data-listener-id="${Y}"]`}else if(typeof L==="function")return L.tagName;return L}_root;_rootListeners=new Map;_events=new Map;constructor(L=document){this._root=L}_handlersForEvent(L){let Y=this._events.get(L);if(Y===void 0)Y=new Map,this._events.set(L,Y);return Y}_handlersForEventAndQuery(L,Y){let Z=this._handlersForEvent(L),G=Z.get(Y);if(G===void 0)G=new Set,Z.set(Y,G);return G}_createRootListener(L){if(this._rootListeners.has(L))return;let Y=(Z)=>{let G=this._handlersForEvent(L),{target:Q}=Z;if(Q===null||!(Q instanceof Node))return;let W=Q,$=!1,M=Z.stopImmediatePropagation;Z.stopImmediatePropagation=()=>{M.call(Z),$=!0};while(W){if(W===this._root)break;if(!(W instanceof Element)){W=W.parentNode;continue}for(let[F,H]of G)if(F==="*"||c(W,F)){for(let z of H)if(z.call(W,Z),$||Z.defaultPrevented)return}if(Z.cancelBubble)return;if(W=W.parentNode,W===this._root||W instanceof ShadowRoot)break}};this._rootListeners.set(L,Y),this._root.addEventListener(L,Y)}addListener(L,Y,Z="*"){this._handlersForEventAndQuery(L,Z).add(Y),this._createRootListener(L)}removeListener(L,Y,Z){let G=this._handlersForEventAndQuery(L,Z);if(G.delete(Y),G.size===0)this._handlersForEvent(L).delete(Z)}cleanup=()=>{for(let[L,Y]of this._rootListeners)this._root.removeEventListener(L,Y);this._rootListeners.clear()}}var F2=100,M2=document.createElement("template");class I extends HTMLElement{static register(L,Y){if(typeof window>"u"||typeof window.customElements>"u")throw new U(1);let Z="tagName"in L&&typeof L.tagName==="string"?L.tagName:null,G=Y??Z;if(G===null||G.length===0||!G.includes("-"))throw new U(101);if(window.customElements.get(G))throw new U(100,Y??"");window.customElements.define(G,L)}static tagName="";static template=M2;static styles=[];static observedAttributes=[];static shadowRootMode="closed";initialState;computedProperties;liveAttributes;_isComponentMounted=!1;_template;_root;_state;_delegator;_ownListeners=new Set;_liveAttributeConfigs=new Map;_cleanupFn;_renderInternals={willRender:!1,isRendering:!1,sequentialRenders:0,postRenderCallbacks:new Set,lastRenderedAttributeMap:new Map,trackedAttributeChanges:new Map};constructor(){super();let{template:L,styles:Y,shadowRootMode:Z}=this.constructor,G=Array.isArray(Y)?Y:typeof Y==="object"?[Y]:[h`${Y}`];this._root=this.attachShadow({mode:Z}),this._root.adoptedStyleSheets.push(...G),this._template=L instanceof T?L:new T(L)}_getRenderContext(L){return{attr:Object.fromEntries(L),data:typeof this.computedProperties==="function"?this.computedProperties():this.computedProperties,state:this._state?this._state.current:void 0}}_escalateError(L){let Y=this.parentNode;while(Y)if(Y instanceof I&&"onError"in Y&&typeof Y.onError==="function"){Y.onError(L);return}else if(Y instanceof ShadowRoot)Y=Y.host;else Y=Y.parentNode;throw L}_reportError(L){if(!this.onError)this._escalateError(L);else this.onError(L)}_executeAttributeChangeHandlers=()=>{let L=this._renderInternals.lastRenderedAttributeMap,Y=new Map(this._renderInternals.trackedAttributeChanges);this._renderInternals.trackedAttributeChanges.clear();for(let[Z,G]of Y){let Q=this._liveAttributeConfigs.get(Z);if(!Q)continue;if("onChange"in Q){let W=L.get(Z)??null;if(Q&&W!==G)Q.onChange?.call(this,G,W)}}};_reflectLiveAttributes=()=>{let L=[];for(let[Y,Z]of this._liveAttributeConfigs)if("reflect"in Z){let G=K(Z.reflect?.call(this)),Q=this.getAttribute(Y);if(G!==Q)L.push([Y,G])}for(let[Y,Z]of L)this.reflectAttribute(Y,Z)};_performUpdate=()=>{try{this._renderInternals.isRendering=!0,this._renderInternals.willRender=!1,this._executeAttributeChangeHandlers();let L=this._renderInternals.lastRenderedAttributeMap;this.beforeUpdate?.();let Y=f(this);if(this._template.render(this.root,this._getRenderContext(Y)),this._renderInternals.lastRenderedAttributeMap=Y,this.afterUpdate?.(L),this._reflectLiveAttributes(),this._renderInternals.postRenderCallbacks.size){let Z=Array.from(this._renderInternals.postRenderCallbacks);this._renderInternals.postRenderCallbacks.clear();for(let G of Z)G()}if(this._renderInternals.willRender){if(this._renderInternals.sequentialRenders+=1,this._renderInternals.sequentialRenders>=F2)throw new U(306,`${this._renderInternals.sequentialRenders}`);this._performUpdate()}else this._renderInternals.sequentialRenders=0}catch(L){this._renderInternals.willRender=!1,this._reportError(L)}finally{this._renderInternals.isRendering=!1}};_scheduleUpdate=()=>{if(this._renderInternals.willRender)return;if(this._renderInternals.willRender=!0,this._renderInternals.isRendering)return;requestAnimationFrame(this._performUpdate)};_adoptState(L){if(Object.is(this._state,L))return;if(this._state)this._state.removeListener(this._scheduleUpdate),this._scheduleUpdate();let Y=L instanceof D?L:new D(L);this._state=Y,this._state.removeListener(this._scheduleUpdate),this._state.addListener(this._scheduleUpdate)}connectedCallback(){if(this._isComponentMounted)return;queueMicrotask(()=>{try{this._renderInternals.isRendering=!0,this._renderInternals.willRender=!1;let L=f(this);if(this._liveAttributeConfigs=new Map(Object.entries(this.liveAttributes??{})),this.initialState){let Y=typeof this.initialState==="object"?this.initialState:this.initialState();this._adoptState(Y)}this._template.render(this.root,this._getRenderContext(L)),this._reflectLiveAttributes(),this._renderInternals.lastRenderedAttributeMap=L,this._isComponentMounted=!0,this._cleanupFn=this.script?.()??void 0}catch(L){this._reportError(L)}finally{this._renderInternals.isRendering=!1}})}disconnectedCallback(){queueMicrotask(()=>{if(this.isConnected||!this._isComponentMounted)return;try{if(this._delegator?.cleanup(),this._ownListeners.size>0)for(let L of this._ownListeners)this.removeEventListener(L.event,L.handler);this._cleanupFn?.(),this._isComponentMounted=!1}catch(L){this._reportError(L)}finally{try{this.finalize?.()}catch(L){this._reportError(L)}}})}attributeChangedCallback(L,Y,Z){if(this._renderInternals.isRendering)return;if(Z===this._renderInternals.lastRenderedAttributeMap?.get(L))return;if(this._renderInternals.trackedAttributeChanges.set(L,Z),!this._renderInternals.willRender)this._scheduleUpdate()}get root(){return this._root}get state(){if(!this._state)throw new U(301);return this._state.live}set state(L){this._adoptState(L)}getState(){if(!this._state)throw new U(301);return this._state}requestRender(L){if(L)this._renderInternals.postRenderCallbacks.add(L);this._scheduleUpdate()}listen(L,Y,Z){let G=w.processTargetDescriptor(L);if(G===":host"||G===":HOST"){this.addEventListener(Y,Z),this._ownListeners.add({handler:Z,event:Y});return}if(!this._delegator)this._delegator=new w(this.root);this._delegator.addListener(Y,Z,G)}stopListening(L,Y,Z){let G=w.processTargetDescriptor(L);if(G===":host"||G===":HOST"){this.removeEventListener(Y,Z);for(let Q of this._ownListeners)if(Q.event===Y&&Q.handler===Z)this._ownListeners.delete(Q);return}if(!this._delegator)return;this._delegator.removeListener(Y,Z,G)}dispatchEvent(L,Y,Z){if(L instanceof Event)return super.dispatchEvent(L);let G={bubbles:!0,cancelable:!0,composed:!0,...Z??{}};return super.dispatchEvent(new CustomEvent(L,{detail:Y,...G}))}querySelector(L){return this._root.querySelector(L)}querySelectorAll(L){return this._root.querySelectorAll(L)}getElementById(L){if(this._root instanceof ShadowRoot)return this._root.getElementById(L);else return HTMLElement.prototype.querySelector.call(this,`#${L}`)}requireElementById(L){let Y=this.getElementById(L);if(!Y)throw new U(300);return Y}setAttribute(L,Y){let Z=K(Y);if(Z===null)HTMLElement.prototype.removeAttribute.call(this,L);else HTMLElement.prototype.setAttribute.call(this,L,Z)}getAttribute(L,Y){let Z=HTMLElement.prototype.getAttribute.call(this,L);if(Y===void 0)return Z;if(typeof Y==="number"){if(Z===null)return Y;let G=Number(Z);if(Number.isNaN(G))return Y;return G}throw new U(0)}reflectAttribute(L,Y){let Z=this.getAttribute(L),G=K(Y);if(Z!==G)this.setAttribute(L,G)}toString(L=!1){let Y=this.constructor.name,Z=this.getAttributeNames().map((Q)=>{let W=this.getAttribute(Q);return W?`${Q}="${W}"`:""}).join(" "),G=Z.length>0?` ${Z}`:"";if(L)return`Component<${Y}${G}>
|
|
2
2
|
${this.root.innerHTML}
|
|
3
|
-
</${Y}>`;return`Component<${Y}${G}>`}}var H2=document.createElement("template");function _2(L,Y){let{template:Z=H2,styles:G=[],shadowRootMode:Q="closed",initialState:W,computedProperties:$={},liveAttributes:M={},script:F,beforeUpdate:H,afterUpdate:z,finalize:X,onError:_}=Y,B=Array.from(new Set([...Object.keys(M)])),J=class extends I{static tagName=L;static template=Z;static styles=G;static observedAttributes=[...B];static shadowRootMode=Q;constructor(){super();this.initialState=typeof W==="function"?W.bind(this):W,this.computedProperties=typeof $==="function"?$.bind(this):$,this.liveAttributes=M;for(let O of Object.values(this.liveAttributes)){if(O.onChange)O.onChange=O.onChange.bind(this);if(O.reflect)O.reflect=O.reflect.bind(this)}this.script=F?.bind(this)??void 0,this.beforeUpdate=H?.bind(this)??void 0,this.afterUpdate=z?.bind(this)??void 0,this.finalize=X?.bind(this)??void 0,this.onError=_?.bind(this)??void 0}};return I.register(J,L),J}export{Z2 as html,_2 as define,h as css,
|
|
3
|
+
</${Y}>`;return`Component<${Y}${G}>`}}var H2=document.createElement("template");function _2(L,Y){let{template:Z=H2,styles:G=[],shadowRootMode:Q="closed",initialState:W,computedProperties:$={},liveAttributes:M={},script:F,beforeUpdate:H,afterUpdate:z,finalize:X,onError:_}=Y,B=Array.from(new Set([...Object.keys(M)])),J=class extends I{static tagName=L;static template=Z;static styles=G;static observedAttributes=[...B];static shadowRootMode=Q;constructor(){super();this.initialState=typeof W==="function"?W.bind(this):W,this.computedProperties=typeof $==="function"?$.bind(this):$,this.liveAttributes=M;for(let O of Object.values(this.liveAttributes)){if(O.onChange)O.onChange=O.onChange.bind(this);if(O.reflect)O.reflect=O.reflect.bind(this)}this.script=F?.bind(this)??void 0,this.beforeUpdate=H?.bind(this)??void 0,this.afterUpdate=z?.bind(this)??void 0,this.finalize=X?.bind(this)??void 0,this.onError=_?.bind(this)??void 0}};return I.register(J,L),J}export{Z2 as html,_2 as define,h as css,P as classify,T as Template,D as State,U as PaletteError,I as Component};
|