circuit-json-to-spice 0.0.40 → 0.0.42
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/index.js
CHANGED
|
@@ -820,8 +820,8 @@ var processSimulationVoltageSources = (netlist, simulationVoltageSources, nodeMa
|
|
|
820
820
|
}
|
|
821
821
|
}
|
|
822
822
|
} else {
|
|
823
|
-
const positivePortId = simSource.positive_source_port_id;
|
|
824
|
-
const negativePortId = simSource.negative_source_port_id;
|
|
823
|
+
const positivePortId = simSource.positive_source_port_id ?? simSource.terminal1_source_port_id;
|
|
824
|
+
const negativePortId = simSource.negative_source_port_id ?? simSource.terminal2_source_port_id;
|
|
825
825
|
if (positivePortId && negativePortId && "voltage" in simSource && simSource.voltage !== void 0) {
|
|
826
826
|
const positiveNode = nodeMap.get(positivePortId) || "0";
|
|
827
827
|
const negativeNode = nodeMap.get(negativePortId) || "0";
|
|
@@ -1459,4 +1459,4 @@ export {
|
|
|
1459
1459
|
circuitJsonToSpice,
|
|
1460
1460
|
convertSpiceNetlistToString
|
|
1461
1461
|
};
|
|
1462
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL3NwaWNlLXV0aWxzL2NvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZy50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3QudHMiLCAiLi4vbGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnQudHMiLCAiLi4vbGliL2NpcmN1aXRKc29uVG9TcGljZS50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQkpUQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQ2FwYWNpdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQ3VycmVudFNvdXJjZUNvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0Rpb2RlQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSW5kdWN0b3JDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9JbmR1Y3RvckNvdXBsaW5nQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSkZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL01PU0ZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL1Jlc2lzdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvU3ViY2lyY3VpdENhbGxDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9UcmFuc21pc3Npb25MaW5lQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9Wb2x0YWdlU291cmNlQ29tbWFuZC50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9oZWxwZXJzLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS1yZXNpc3Rvci50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9zaW1wbGUtc3dpdGNoLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS1jYXBhY2l0b3IudHMiLCAiLi4vbGliL3Byb2Nlc3NvcnMvc2ltcGxlLWRpb2RlLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS1pbmR1Y3Rvci50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9zaW1wbGUtbW9zZmV0LnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS10cmFuc2lzdG9yLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3Byb2Nlc3Mtc2ltdWxhdGlvbi12b2x0YWdlLXNvdXJjZXMudHMiLCAiLi4vbGliL3Byb2Nlc3NvcnMvcHJvY2Vzcy1zaW11bGF0aW9uLWN1cnJlbnQtc291cmNlcy50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tZXhwZXJpbWVudC50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tb3AtYW1wLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3Byb2Nlc3Mtc2ltdWxhdGlvbi1zcGljZS1zdWJjaXJjdWl0cy50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZVN1YmNpcmN1aXQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcIi4uL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyA9IChuZXRsaXN0OiBTcGljZU5ldGxpc3QpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIC8vIFRpdGxlIGxpbmUgKHJlcXVpcmVkIGZpcnN0IGxpbmUgaW4gU1BJQ0UpXG4gIGxpbmVzLnB1c2gobmV0bGlzdC50aXRsZSlcblxuICAvLyBBZGQgbW9kZWxzXG4gIGlmIChuZXRsaXN0Lm1vZGVscy5zaXplID4gMCkge1xuICAgIGxpbmVzLnB1c2goLi4uQXJyYXkuZnJvbShuZXRsaXN0Lm1vZGVscy52YWx1ZXMoKSkpXG4gIH1cblxuICAvLyBDb21wb25lbnQgbGluZXNcbiAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgbmV0bGlzdC5jb21wb25lbnRzKSB7XG4gICAgbGluZXMucHVzaChjb21wb25lbnQudG9TcGljZVN0cmluZygpKVxuICB9XG5cbiAgaWYgKG5ldGxpc3Qub3B0aW9uU3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaCguLi5uZXRsaXN0Lm9wdGlvblN0YXRlbWVudHMpXG4gIH1cblxuICBpZiAobmV0bGlzdC5tZXRhZGF0YUNvbW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3QubWV0YWRhdGFDb21tZW50cylcbiAgfVxuXG4gIC8vIEFkZCBzdWJjaXJjdWl0IGRlZmluaXRpb25zXG4gIGZvciAoY29uc3Qgc3ViY2lyY3VpdCBvZiBuZXRsaXN0LnN1YmNpcmN1aXRzKSB7XG4gICAgbGluZXMucHVzaChzdWJjaXJjdWl0LnRvU3BpY2VTdHJpbmcoKSlcbiAgfVxuXG4gIGlmIChuZXRsaXN0LnByaW50U3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaCguLi5uZXRsaXN0LnByaW50U3RhdGVtZW50cylcbiAgfVxuXG4gIGlmIChuZXRsaXN0LnNhdmVTdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3Quc2F2ZVN0YXRlbWVudHMpXG4gIH1cblxuICAvLyBBZGQgY29udHJvbCBibG9jayBpZiBwcmVzZW50XG4gIGlmIChuZXRsaXN0LmNvbnRyb2xzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKFwiLmNvbnRyb2xcIilcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3QuY29udHJvbHMpXG4gICAgbGluZXMucHVzaChcIi5lbmRjXCIpXG4gIH1cblxuICBpZiAoXG4gICAgbmV0bGlzdC50cmFuQ29tbWFuZCAmJlxuICAgICFsaW5lcy5zb21lKChsKSA9PiBsLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCIudHJhblwiKSlcbiAgKSB7XG4gICAgbGluZXMucHVzaChuZXRsaXN0LnRyYW5Db21tYW5kKVxuICB9XG5cbiAgLy8gRW5kIHdpdGggLkVORFxuICBsaW5lcy5wdXNoKFwiLkVORFwiKVxuXG4gIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpXG59XG4iLCAiaW1wb3J0IHsgY29udmVydFNwaWNlTmV0bGlzdFRvU3RyaW5nIH0gZnJvbSBcIi4uL3NwaWNlLXV0aWxzL2NvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZ1wiXG5pbXBvcnQgdHlwZSB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcIi4vU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHR5cGUgeyBTcGljZVN1YmNpcmN1aXQgfSBmcm9tIFwiLi9TcGljZVN1YmNpcmN1aXRcIlxuXG5leHBvcnQgY2xhc3MgU3BpY2VOZXRsaXN0IHtcbiAgdGl0bGU6IHN0cmluZ1xuICBjb21wb25lbnRzOiBTcGljZUNvbXBvbmVudFtdXG4gIG5vZGVzOiBTZXQ8c3RyaW5nPlxuICBjb250cm9sczogc3RyaW5nW11cbiAgc3ViY2lyY3VpdHM6IFNwaWNlU3ViY2lyY3VpdFtdXG4gIG1vZGVsczogTWFwPHN0cmluZywgc3RyaW5nPlxuICBvcHRpb25TdGF0ZW1lbnRzOiBzdHJpbmdbXVxuICBtZXRhZGF0YUNvbW1lbnRzOiBzdHJpbmdbXVxuICB0cmFuQ29tbWFuZDogc3RyaW5nIHwgbnVsbFxuICBwcmludFN0YXRlbWVudHM6IHN0cmluZ1tdXG4gIHNhdmVTdGF0ZW1lbnRzOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKHRpdGxlID0gXCJDaXJjdWl0IE5ldGxpc3RcIikge1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZVxuICAgIHRoaXMuY29tcG9uZW50cyA9IFtdXG4gICAgdGhpcy5ub2RlcyA9IG5ldyBTZXQoKVxuICAgIHRoaXMuY29udHJvbHMgPSBbXVxuICAgIHRoaXMuc3ViY2lyY3VpdHMgPSBbXVxuICAgIHRoaXMubW9kZWxzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5vcHRpb25TdGF0ZW1lbnRzID0gW11cbiAgICB0aGlzLm1ldGFkYXRhQ29tbWVudHMgPSBbXVxuICAgIHRoaXMudHJhbkNvbW1hbmQgPSBudWxsXG4gICAgdGhpcy5wcmludFN0YXRlbWVudHMgPSBbXVxuICAgIHRoaXMuc2F2ZVN0YXRlbWVudHMgPSBbXVxuICB9XG5cbiAgYWRkQ29tcG9uZW50KGNvbXBvbmVudDogU3BpY2VDb21wb25lbnQpIHtcbiAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpXG4gICAgLy8gQWRkIG5vZGVzIHRvIHRoZSBzZXRcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgY29tcG9uZW50Lm5vZGVzKSB7XG4gICAgICB0aGlzLm5vZGVzLmFkZChub2RlKVxuICAgIH1cbiAgfVxuXG4gIGFkZFN1YmNpcmN1aXQoc3ViY2lyY3VpdDogU3BpY2VTdWJjaXJjdWl0KSB7XG4gICAgaWYgKHRoaXMuc3ViY2lyY3VpdHMuZmluZCgocykgPT4gcy5uYW1lID09PSBzdWJjaXJjdWl0Lm5hbWUpKSByZXR1cm5cbiAgICB0aGlzLnN1YmNpcmN1aXRzLnB1c2goc3ViY2lyY3VpdClcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKSB7XG4gICAgcmV0dXJuIGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyh0aGlzKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4uL3NwaWNlLWNvbW1hbmRzL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgY2xhc3MgU3BpY2VDb21wb25lbnQge1xuICBuYW1lOiBzdHJpbmdcbiAgY29tbWFuZDogQmFzZVNwaWNlQ29tbWFuZFxuICBub2Rlczogc3RyaW5nW11cblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGNvbW1hbmQ6IEJhc2VTcGljZUNvbW1hbmQsIG5vZGVzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWVcbiAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kXG4gICAgdGhpcy5ub2RlcyA9IG5vZGVzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZC50b1NwaWNlU3RyaW5nKClcbiAgfVxufVxuIiwgImltcG9ydCB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCIuL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcIi4vc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgdHlwZSB7XG4gIEFueUNpcmN1aXRFbGVtZW50LFxuICBTaW11bGF0aW9uQ3VycmVudFByb2JlLFxuICBTaW11bGF0aW9uT3BBbXAsXG4gIFNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXQsXG4gIFNpbXVsYXRpb25Td2l0Y2gsXG4gIFNpbXVsYXRpb25Wb2x0YWdlUHJvYmUsXG4gIFNvdXJjZVNpbXBsZURpb2RlLFxuICBTb3VyY2VTaW1wbGVMZWQsXG4gIFNvdXJjZVNpbXBsZU1vc2ZldCxcbiAgU291cmNlU2ltcGxlU3dpdGNoLFxuICBTb3VyY2VTaW1wbGVUcmFuc2lzdG9yLFxufSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IGdldFNvdXJjZVBvcnRDb25uZWN0aXZpdHlNYXBGcm9tQ2lyY3VpdEpzb24gfSBmcm9tIFwiY2lyY3VpdC1qc29uLXRvLWNvbm5lY3Rpdml0eS1tYXBcIlxuaW1wb3J0IHsgc3UgfSBmcm9tIFwiQHRzY2lyY3VpdC9jaXJjdWl0LWpzb24tdXRpbFwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltcGxlUmVzaXN0b3IgfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3NpbXBsZS1yZXNpc3RvclwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltcGxlU3dpdGNoIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9zaW1wbGUtc3dpdGNoXCJcbmltcG9ydCB7IHByb2Nlc3NTaW1wbGVDYXBhY2l0b3IgfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3NpbXBsZS1jYXBhY2l0b3JcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXBsZURpb2RlLCBwcm9jZXNzU2ltcGxlTGVkIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9zaW1wbGUtZGlvZGVcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXBsZUluZHVjdG9yIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9zaW1wbGUtaW5kdWN0b3JcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXBsZU1vc2ZldCB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvc2ltcGxlLW1vc2ZldFwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltcGxlVHJhbnNpc3RvciB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvc2ltcGxlLXRyYW5zaXN0b3JcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXVsYXRpb25Wb2x0YWdlU291cmNlcyB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvcHJvY2Vzcy1zaW11bGF0aW9uLXZvbHRhZ2Utc291cmNlc1wiXG5pbXBvcnQgeyBwcm9jZXNzU2ltdWxhdGlvbkN1cnJlbnRTb3VyY2VzIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tY3VycmVudC1zb3VyY2VzXCJcbmltcG9ydCB7IHByb2Nlc3NTaW11bGF0aW9uRXhwZXJpbWVudCB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvcHJvY2Vzcy1zaW11bGF0aW9uLWV4cGVyaW1lbnRcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXVsYXRpb25PcEFtcHMgfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3Byb2Nlc3Mtc2ltdWxhdGlvbi1vcC1hbXBcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXVsYXRpb25TcGljZVN1YmNpcmN1aXRzIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tc3BpY2Utc3ViY2lyY3VpdHNcIlxuXG5leHBvcnQgZnVuY3Rpb24gY2lyY3VpdEpzb25Ub1NwaWNlKFxuICBjaXJjdWl0SnNvbjogQW55Q2lyY3VpdEVsZW1lbnRbXSxcbik6IFNwaWNlTmV0bGlzdCB7XG4gIGNvbnN0IG5ldGxpc3QgPSBuZXcgU3BpY2VOZXRsaXN0KFwiKiBDaXJjdWl0IEpTT04gdG8gU1BJQ0UgTmV0bGlzdFwiKVxuICBjb25zdCBzb3VyY2VDb21wb25lbnRzID0gc3UoY2lyY3VpdEpzb24pLnNvdXJjZV9jb21wb25lbnQubGlzdCgpXG4gIGNvbnN0IHNvdXJjZVBvcnRzID0gc3UoY2lyY3VpdEpzb24pLnNvdXJjZV9wb3J0Lmxpc3QoKVxuICBjb25zdCBzb3VyY2VUcmFjZXMgPSBzdShjaXJjdWl0SnNvbikuc291cmNlX3RyYWNlLmxpc3QoKVxuICBjb25zdCBzaW11bGF0aW9uUHJvYmVzID0gY2lyY3VpdEpzb24uZmlsdGVyKFxuICAgIChlbG0pID0+IGVsbS50eXBlID09PSBcInNpbXVsYXRpb25fdm9sdGFnZV9wcm9iZVwiLFxuICApIGFzIFNpbXVsYXRpb25Wb2x0YWdlUHJvYmVbXVxuICBjb25zdCBzaW11bGF0aW9uQ3VycmVudFByb2JlcyA9IGNpcmN1aXRKc29uLmZpbHRlcihcbiAgICAoZWxtKSA9PiBlbG0udHlwZSA9PT0gXCJzaW11bGF0aW9uX2N1cnJlbnRfcHJvYmVcIixcbiAgKSBhcyBTaW11bGF0aW9uQ3VycmVudFByb2JlW11cbiAgY29uc3Qgc2ltdWxhdGlvblN3aXRjaGVzID0gY2lyY3VpdEpzb25cbiAgICAuZmlsdGVyKFxuICAgICAgKGVsZW1lbnQpID0+IChlbGVtZW50IGFzIHsgdHlwZT86IHN0cmluZyB9KS50eXBlID09PSBcInNpbXVsYXRpb25fc3dpdGNoXCIsXG4gICAgKVxuICAgIC5tYXAoKGVsZW1lbnQpID0+IGVsZW1lbnQgYXMgdW5rbm93biBhcyBTaW11bGF0aW9uU3dpdGNoKVxuICBjb25zdCBzaW11bGF0aW9uT3BBbXBzID0gY2lyY3VpdEpzb24uZmlsdGVyKFxuICAgIChlbG0pID0+IGVsbS50eXBlID09PSBcInNpbXVsYXRpb25fb3BfYW1wXCIsXG4gICkgYXMgU2ltdWxhdGlvbk9wQW1wW11cbiAgY29uc3Qgc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdHMgPSBjaXJjdWl0SnNvbi5maWx0ZXIoXG4gICAgKGVsbSkgPT4gZWxtLnR5cGUgPT09IFwic2ltdWxhdGlvbl9zcGljZV9zdWJjaXJjdWl0XCIsXG4gICkgYXMgU2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdFtdXG4gIGNvbnN0IHNpbXVsYXRpb25Td2l0Y2hNYXAgPSBuZXcgTWFwPHN0cmluZywgU2ltdWxhdGlvblN3aXRjaD4oKVxuXG4gIGZvciAoY29uc3Qgc2ltU3dpdGNoIG9mIHNpbXVsYXRpb25Td2l0Y2hlcykge1xuICAgIGlmIChzaW1Td2l0Y2guc291cmNlX2NvbXBvbmVudF9pZCkge1xuICAgICAgc2ltdWxhdGlvblN3aXRjaE1hcC5zZXQoc2ltU3dpdGNoLnNvdXJjZV9jb21wb25lbnRfaWQsIHNpbVN3aXRjaClcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25uTWFwID0gZ2V0U291cmNlUG9ydENvbm5lY3Rpdml0eU1hcEZyb21DaXJjdWl0SnNvbihjaXJjdWl0SnNvbilcblxuICAvLyBDcmVhdGUgbm9kZSBtYXBwaW5nIGZyb20gcG9ydCBjb25uZWN0aW9uc1xuICBjb25zdCBub2RlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICBjb25zdCBuZXRUb05vZGVOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICBsZXQgbm9kZUNvdW50ZXIgPSAxXG5cbiAgY29uc3QgcHJvYmVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGlmIChzaW11bGF0aW9uUHJvYmVzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHByb2JlIG9mIHNpbXVsYXRpb25Qcm9iZXMpIHtcbiAgICAgIGlmIChwcm9iZS5uYW1lKSB7XG4gICAgICAgIHByb2JlTmFtZXMuYWRkKHByb2JlLm5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgdGhlcmUgYXJlIHByb2JlIG5hbWVzIGxpa2UgTjEsIE4yLCBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBjb25mbGljdHNcbiAgY29uc3QgbnVtZXJpY1Byb2JlTmFtZXMgPSBbLi4ucHJvYmVOYW1lc11cbiAgICAubWFwKChuYW1lKSA9PiAvXk4oXFxkKykkL2kuZXhlYyhuYW1lKSlcbiAgICAuZmlsdGVyKChtKTogbSBpcyBSZWdFeHBFeGVjQXJyYXkgPT4gbSAhPT0gbnVsbClcbiAgICAubWFwKChtKSA9PiBwYXJzZUludChtWzFdLCAxMCkpXG5cbiAgaWYgKG51bWVyaWNQcm9iZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBub2RlQ291bnRlciA9IE1hdGgubWF4KC4uLm51bWVyaWNQcm9iZU5hbWVzKSArIDFcbiAgfVxuXG4gIGNvbnN0IGdyb3VuZE5ldHMgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gIC8vIEZpbmQgZ3JvdW5kIGZyb20gc291cmNlIG5ldHMgdGhhdCBpbmNsdWRlIFwiZ25kXCIgaW4gdGhlIG5hbWVcbiAgY29uc3QgZ25kU291cmNlTmV0SWRzID0gbmV3IFNldChcbiAgICBzdShjaXJjdWl0SnNvbilcbiAgICAgIC5zb3VyY2VfbmV0Lmxpc3QoKVxuICAgICAgLmZpbHRlcigoc24pID0+IHNuLm5hbWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJnbmRcIikpXG4gICAgICAubWFwKChzbikgPT4gc24uc291cmNlX25ldF9pZCksXG4gIClcblxuICBpZiAoZ25kU291cmNlTmV0SWRzLnNpemUgPiAwKSB7XG4gICAgZm9yIChjb25zdCB0cmFjZSBvZiBzdShjaXJjdWl0SnNvbikuc291cmNlX3RyYWNlLmxpc3QoKSkge1xuICAgICAgaWYgKHRyYWNlLmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBpc09uR25kTmV0ID0gdHJhY2UuY29ubmVjdGVkX3NvdXJjZV9uZXRfaWRzLnNvbWUoKG5ldElkKSA9PlxuICAgICAgICAgIGduZFNvdXJjZU5ldElkcy5oYXMobmV0SWQpLFxuICAgICAgICApXG4gICAgICAgIGlmIChpc09uR25kTmV0KSB7XG4gICAgICAgICAgY29uc3QgYVBvcnRPbkduZCA9IHRyYWNlLmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHNbMF1cbiAgICAgICAgICBjb25zdCBnbmROZXQgPSBjb25uTWFwLmdldE5ldENvbm5lY3RlZFRvSWQoYVBvcnRPbkduZClcbiAgICAgICAgICBpZiAoZ25kTmV0KSB7XG4gICAgICAgICAgICBncm91bmROZXRzLmFkZChnbmROZXQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmluZCBncm91bmQgbm9kZSBmcm9tIHBvcnRzIG5hbWVkIFwiR05EXCJcbiAgY29uc3QgZ3JvdW5kUG9ydHMgPSBzb3VyY2VQb3J0cy5maWx0ZXIoKHApID0+IHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJnbmRcIilcbiAgZm9yIChjb25zdCBncm91bmRQb3J0IG9mIGdyb3VuZFBvcnRzKSB7XG4gICAgY29uc3QgZ3JvdW5kTmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKGdyb3VuZFBvcnQuc291cmNlX3BvcnRfaWQpXG4gICAgaWYgKGdyb3VuZE5ldCkge1xuICAgICAgZ3JvdW5kTmV0cy5hZGQoZ3JvdW5kTmV0KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc2ltU291cmNlIG9mIHN1KGNpcmN1aXRKc29uKS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlLmxpc3QoKSkge1xuICAgIGNvbnN0IG5lZ19wb3J0X2lkID1cbiAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS5uZWdhdGl2ZV9zb3VyY2VfcG9ydF9pZCA/P1xuICAgICAgKHNpbVNvdXJjZSBhcyBhbnkpLnRlcm1pbmFsMl9zb3VyY2VfcG9ydF9pZFxuICAgIGlmIChuZWdfcG9ydF9pZCkge1xuICAgICAgY29uc3QgZ25kX25ldCA9IGNvbm5NYXAuZ2V0TmV0Q29ubmVjdGVkVG9JZChuZWdfcG9ydF9pZClcbiAgICAgIGlmIChnbmRfbmV0KSB7XG4gICAgICAgIGdyb3VuZE5ldHMuYWRkKGduZF9uZXQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBncm91bmROZXQgb2YgZ3JvdW5kTmV0cykge1xuICAgIG5ldFRvTm9kZU5hbWUuc2V0KGdyb3VuZE5ldCwgXCIwXCIpXG4gIH1cblxuICAvLyBQcmUtYXNzaWduIG5vZGUgbmFtZXMgZnJvbSB2b2x0YWdlIHByb2Jlc1xuICBpZiAoc2ltdWxhdGlvblByb2Jlcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBwcm9iZSBvZiBzaW11bGF0aW9uUHJvYmVzKSB7XG4gICAgICBpZiAoIXByb2JlLm5hbWUpIGNvbnRpbnVlXG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9wb3J0X2lkIHx8XG4gICAgICAgIHByb2JlLnJlZmVyZW5jZV9pbnB1dF9zb3VyY2VfbmV0X2lkXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IG5ldDogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbFxuICAgICAgY29uc3Qgc2lnbmFsX3BvcnRfaWQgPSBwcm9iZS5zaWduYWxfaW5wdXRfc291cmNlX3BvcnRfaWRcbiAgICAgIGNvbnN0IHNpZ25hbF9uZXRfaWQgPSBwcm9iZS5zaWduYWxfaW5wdXRfc291cmNlX25ldF9pZFxuXG4gICAgICBpZiAoc2lnbmFsX3BvcnRfaWQpIHtcbiAgICAgICAgbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKHNpZ25hbF9wb3J0X2lkKVxuICAgICAgfSBlbHNlIGlmIChzaWduYWxfbmV0X2lkKSB7XG4gICAgICAgIGNvbnN0IHRyYWNlID0gc291cmNlVHJhY2VzLmZpbmQoKHQpID0+XG4gICAgICAgICAgdC5jb25uZWN0ZWRfc291cmNlX25ldF9pZHMuaW5jbHVkZXMoc2lnbmFsX25ldF9pZCEpLFxuICAgICAgICApXG4gICAgICAgIGlmICh0cmFjZSAmJiB0cmFjZS5jb25uZWN0ZWRfc291cmNlX3BvcnRfaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBwb3J0SWQgPSB0cmFjZS5jb25uZWN0ZWRfc291cmNlX3BvcnRfaWRzWzBdXG4gICAgICAgICAgbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKHBvcnRJZClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmV0KSB7XG4gICAgICAgIGlmICghbmV0VG9Ob2RlTmFtZS5oYXMobmV0KSkge1xuICAgICAgICAgIG5ldFRvTm9kZU5hbWUuc2V0KG5ldCwgcHJvYmUubmFtZSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzaWduYWxfcG9ydF9pZCAmJiBwcm9iZS5uYW1lKSB7XG4gICAgICAgIC8vIEl0J3MgYSBmbG9hdGluZyBwb3J0IHdpdGggYSBwcm9iZSwgc28gd2UgbWFwIGl0IGRpcmVjdGx5LiBUaGlzIHBvcnRcbiAgICAgICAgLy8gd2lsbCBub3cgYmUgc2tpcHBlZCBpbiB0aGUgc2Vjb25kLXBhc3MgZm9yIHVuY29ubmVjdGVkIHBvcnRzLlxuICAgICAgICBub2RlTWFwLnNldChzaWduYWxfcG9ydF9pZCwgcHJvYmUubmFtZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBGaXJzdCBwYXNzOiBhc3NpZ24gbm9kZSBudW1iZXJzIHRvIGFsbCBjb25uZWN0ZWQgbmV0c1xuICBmb3IgKGNvbnN0IHBvcnQgb2Ygc291cmNlUG9ydHMpIHtcbiAgICBjb25zdCBwb3J0SWQgPSBwb3J0LnNvdXJjZV9wb3J0X2lkXG4gICAgY29uc3QgbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKHBvcnRJZClcbiAgICBpZiAobmV0KSB7XG4gICAgICBpZiAoIW5ldFRvTm9kZU5hbWUuaGFzKG5ldCkpIHtcbiAgICAgICAgbmV0VG9Ob2RlTmFtZS5zZXQobmV0LCBgTiR7bm9kZUNvdW50ZXIrK31gKVxuICAgICAgfVxuICAgICAgbm9kZU1hcC5zZXQocG9ydElkLCBuZXRUb05vZGVOYW1lLmdldChuZXQpISlcbiAgICB9XG4gIH1cblxuICAvLyBTZWNvbmQgcGFzczogYXNzaWduIG5vZGUgbnVtYmVycyB0byB1bmNvbm5lY3RlZCBwb3J0c1xuICBmb3IgKGNvbnN0IHBvcnQgb2Ygc291cmNlUG9ydHMpIHtcbiAgICBjb25zdCBwb3J0SWQgPSBwb3J0LnNvdXJjZV9wb3J0X2lkXG4gICAgLy8gSWYgYSBwb3J0IHdhc24ndCBpbiBhIG5ldCwgaXQgd29uJ3QgYmUgaW4gdGhlIG5vZGVNYXAgeWV0XG4gICAgaWYgKCFub2RlTWFwLmhhcyhwb3J0SWQpKSB7XG4gICAgICAvLyBVbmNvbm5lY3RlZCBwb3J0LCBjcmVhdGUgYSBuZXcgZmxvYXRpbmcgbm9kZSBmb3IgaXRcbiAgICAgIG5vZGVNYXAuc2V0KHBvcnRJZCwgYE4ke25vZGVDb3VudGVyKyt9YClcbiAgICB9XG4gIH1cblxuICAvLyBQcm9jZXNzIGVhY2ggY29tcG9uZW50XG4gIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHNvdXJjZUNvbXBvbmVudHMpIHtcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgIT09IFwic291cmNlX2NvbXBvbmVudFwiKSBjb250aW51ZVxuXG4gICAgY29uc3QgY29tcG9uZW50UG9ydHMgPSBzdShjaXJjdWl0SnNvbilcbiAgICAgIC5zb3VyY2VfcG9ydC5saXN0KHtcbiAgICAgICAgc291cmNlX2NvbXBvbmVudF9pZDogY29tcG9uZW50LnNvdXJjZV9jb21wb25lbnRfaWQsXG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IChhLnBpbl9udW1iZXIgPz8gMCkgLSAoYi5waW5fbnVtYmVyID8/IDApKVxuXG4gICAgLy8gR2V0IG5vZGUgbmFtZXMgZm9yIGNvbXBvbmVudCBwb3J0c1xuICAgIGNvbnN0IG5vZGVzID0gY29tcG9uZW50UG9ydHMubWFwKChwb3J0KSA9PiB7XG4gICAgICByZXR1cm4gbm9kZU1hcC5nZXQocG9ydC5zb3VyY2VfcG9ydF9pZCkgfHwgXCIwXCJcbiAgICB9KVxuXG4gICAgLy8gQ3JlYXRlIFNQSUNFIGNvbXBvbmVudCBiYXNlZCBvbiB0eXBlXG4gICAgaWYgKFwiZnR5cGVcIiBpbiBjb21wb25lbnQpIHtcbiAgICAgIGxldCBzcGljZUNvbXBvbmVudDogU3BpY2VDb21wb25lbnQgfCBudWxsID0gbnVsbFxuXG4gICAgICBzd2l0Y2ggKChjb21wb25lbnQgYXMgeyBmdHlwZTogc3RyaW5nIH0pLmZ0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfcmVzaXN0b3JcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZVJlc2lzdG9yKHsgY29tcG9uZW50LCBub2RlcyB9KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV9zd2l0Y2hcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZVN3aXRjaCh7XG4gICAgICAgICAgICBuZXRsaXN0LFxuICAgICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQgYXMgU291cmNlU2ltcGxlU3dpdGNoLFxuICAgICAgICAgICAgbm9kZXMsXG4gICAgICAgICAgICBzaW11bGF0aW9uU3dpdGNoTWFwLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX2NhcGFjaXRvclwiOiB7XG4gICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBwcm9jZXNzU2ltcGxlQ2FwYWNpdG9yKHsgY29tcG9uZW50LCBub2RlcyB9KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV9kaW9kZVwiOiB7XG4gICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBwcm9jZXNzU2ltcGxlRGlvZGUoe1xuICAgICAgICAgICAgbmV0bGlzdCxcbiAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50IGFzIFNvdXJjZVNpbXBsZURpb2RlLFxuICAgICAgICAgICAgY29tcG9uZW50UG9ydHMsXG4gICAgICAgICAgICBub2RlTWFwLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX2xlZFwiOiB7XG4gICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBwcm9jZXNzU2ltcGxlTGVkKHtcbiAgICAgICAgICAgIG5ldGxpc3QsXG4gICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCBhcyBTb3VyY2VTaW1wbGVMZWQsXG4gICAgICAgICAgICBjb21wb25lbnRQb3J0cyxcbiAgICAgICAgICAgIG5vZGVNYXAsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfaW5kdWN0b3JcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZUluZHVjdG9yKHsgY29tcG9uZW50LCBub2RlcyB9KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV9tb3NmZXRcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZU1vc2ZldCh7XG4gICAgICAgICAgICBuZXRsaXN0LFxuICAgICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQgYXMgU291cmNlU2ltcGxlTW9zZmV0LFxuICAgICAgICAgICAgY29tcG9uZW50UG9ydHMsXG4gICAgICAgICAgICBub2RlTWFwLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX3RyYW5zaXN0b3JcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZVRyYW5zaXN0b3Ioe1xuICAgICAgICAgICAgbmV0bGlzdCxcbiAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50IGFzIFNvdXJjZVNpbXBsZVRyYW5zaXN0b3IsXG4gICAgICAgICAgICBjb21wb25lbnRQb3J0cyxcbiAgICAgICAgICAgIG5vZGVNYXAsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzcGljZUNvbXBvbmVudCkge1xuICAgICAgICBuZXRsaXN0LmFkZENvbXBvbmVudChzcGljZUNvbXBvbmVudClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm9jZXNzU2ltdWxhdGlvblZvbHRhZ2VTb3VyY2VzKFxuICAgIG5ldGxpc3QsXG4gICAgc3UoY2lyY3VpdEpzb24pLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2UubGlzdCgpLFxuICAgIG5vZGVNYXAsXG4gIClcblxuICBwcm9jZXNzU2ltdWxhdGlvbkN1cnJlbnRTb3VyY2VzKFxuICAgIG5ldGxpc3QsXG4gICAgc3UoY2lyY3VpdEpzb24pLnNpbXVsYXRpb25fY3VycmVudF9zb3VyY2UubGlzdCgpLFxuICAgIG5vZGVNYXAsXG4gIClcblxuICBwcm9jZXNzU2ltdWxhdGlvbk9wQW1wcyhuZXRsaXN0LCBzaW11bGF0aW9uT3BBbXBzLCBub2RlTWFwKVxuXG4gIHByb2Nlc3NTaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0cyhcbiAgICBuZXRsaXN0LFxuICAgIHNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXRzLFxuICAgIG5vZGVNYXAsXG4gIClcblxuICBjb25zdCBzaW11bGF0aW9uRXhwZXJpbWVudCA9IGNpcmN1aXRKc29uLmZpbmQoXG4gICAgKGVsbSkgPT4gZWxtLnR5cGUgPT09IFwic2ltdWxhdGlvbl9leHBlcmltZW50XCIsXG4gIClcbiAgaWYgKHNpbXVsYXRpb25FeHBlcmltZW50KVxuICAgIHByb2Nlc3NTaW11bGF0aW9uRXhwZXJpbWVudChcbiAgICAgIG5ldGxpc3QsXG4gICAgICBzaW11bGF0aW9uRXhwZXJpbWVudCxcbiAgICAgIHNpbXVsYXRpb25Qcm9iZXMsXG4gICAgICBzaW11bGF0aW9uQ3VycmVudFByb2JlcyxcbiAgICAgIHNvdXJjZVRyYWNlcyxcbiAgICAgIG5vZGVNYXAsXG4gICAgKVxuXG4gIHJldHVybiBuZXRsaXN0XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQkpUQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGNvbGxlY3Rvcjogc3RyaW5nXG4gIGJhc2U6IHN0cmluZ1xuICBlbWl0dGVyOiBzdHJpbmdcbiAgc3Vic3RyYXRlPzogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbiAgYXJlYT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgQkpUQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwiYmp0XCIgYXMgY29uc3RcbiAgcHJvcHM6IEJKVENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBCSlRDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIGNvbGxlY3RvciwgYmFzZSwgZW1pdHRlciwgc3Vic3RyYXRlLCBtb2RlbCwgYXJlYSB9ID1cbiAgICAgIHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgUSR7bmFtZX0gJHtjb2xsZWN0b3J9ICR7YmFzZX0gJHtlbWl0dGVyfWBcbiAgICBpZiAoc3Vic3RyYXRlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7c3Vic3RyYXRlfWBcbiAgICB9XG4gICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsfWBcbiAgICBpZiAoYXJlYSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FyZWF9YFxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENhcGFjaXRvckNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICBtb2RlbE5hbWU/OiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xuICBpbml0aWFsQ29uZGl0aW9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBDYXBhY2l0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJjYXBhY2l0b3JcIiBhcyBjb25zdFxuXG4gIHByb3BzOiBDYXBhY2l0b3JDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQ2FwYWNpdG9yQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgaW5pdGlhbENvbmRpdGlvbixcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYEMke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKG1vZGVsTmFtZSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsTmFtZX1gXG4gICAgfVxuICAgIHNwaWNlU3RyaW5nICs9IGAgJHt2YWx1ZX1gXG4gICAgaWYgKGluaXRpYWxDb25kaXRpb24pIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgSUM9JHtpbml0aWFsQ29uZGl0aW9ufWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBDdXJyZW50U291cmNlQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIHZhbHVlPzogc3RyaW5nXG4gIGFjTWFnbml0dWRlPzogc3RyaW5nXG4gIGFjUGhhc2U/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIEN1cnJlbnRTb3VyY2VDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJjdXJyZW50X3NvdXJjZVwiIGFzIGNvbnN0XG4gIHByb3BzOiBDdXJyZW50U291cmNlQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IEN1cnJlbnRTb3VyY2VDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIHBvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlLCB2YWx1ZSwgYWNNYWduaXR1ZGUsIGFjUGhhc2UgfSA9XG4gICAgICB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYEkke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7dmFsdWV9YFxuICAgIH1cbiAgICBpZiAoYWNNYWduaXR1ZGUpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgQUMgJHthY01hZ25pdHVkZX1gXG4gICAgICBpZiAoYWNQaGFzZSkge1xuICAgICAgICBzcGljZVN0cmluZyArPSBgICR7YWNQaGFzZX1gXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlvZGVDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgbW9kZWw6IHN0cmluZ1xuICBhcmVhPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBEaW9kZUNvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImRpb2RlXCIgYXMgY29uc3RcbiAgcHJvcHM6IERpb2RlQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IERpb2RlQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZSwgbW9kZWwsIGFyZWEgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgRCR7bmFtZX0gJHtwb3NpdGl2ZU5vZGV9ICR7bmVnYXRpdmVOb2RlfSAke21vZGVsfWBcbiAgICBpZiAoYXJlYSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FyZWF9YFxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEluZHVjdG9yQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIG1vZGVsPzogc3RyaW5nXG4gIHZhbHVlOiBzdHJpbmdcbiAgaW5pdGlhbENvbmRpdGlvbj86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgSW5kdWN0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJpbmR1Y3RvclwiIGFzIGNvbnN0XG4gIHByb3BzOiBJbmR1Y3RvckNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBJbmR1Y3RvckNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIG1vZGVsLCB2YWx1ZSwgaW5pdGlhbENvbmRpdGlvbiB9ID1cbiAgICAgIHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgTCR7bmFtZX0gJHtwb3NpdGl2ZU5vZGV9ICR7bmVnYXRpdmVOb2RlfWBcbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHttb2RlbH1gXG4gICAgfVxuICAgIHNwaWNlU3RyaW5nICs9IGAgJHt2YWx1ZX1gXG4gICAgaWYgKGluaXRpYWxDb25kaXRpb24pIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgSUM9JHtpbml0aWFsQ29uZGl0aW9ufWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBJbmR1Y3RvckNvdXBsaW5nQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGluZHVjdG9yczogc3RyaW5nW11cbiAgY291cGxpbmc6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgSW5kdWN0b3JDb3VwbGluZ0NvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImluZHVjdG9yX2NvdXBsaW5nXCIgYXMgY29uc3RcbiAgcHJvcHM6IEluZHVjdG9yQ291cGxpbmdDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSW5kdWN0b3JDb3VwbGluZ0NvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgaW5kdWN0b3JzLCBjb3VwbGluZyB9ID0gdGhpcy5wcm9wc1xuICAgIHJldHVybiBgSyR7bmFtZX0gJHtpbmR1Y3RvcnMuam9pbihcIiBcIil9ICR7Y291cGxpbmd9YFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgSkZFVENvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBkcmFpbjogc3RyaW5nXG4gIGdhdGU6IHN0cmluZ1xuICBzb3VyY2U6IHN0cmluZ1xuICBtb2RlbDogc3RyaW5nXG4gIGFyZWE/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIEpGRVRDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJqZmV0XCIgYXMgY29uc3RcbiAgcHJvcHM6IEpGRVRDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSkZFVENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgZHJhaW4sIGdhdGUsIHNvdXJjZSwgbW9kZWwsIGFyZWEgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgSiR7bmFtZX0gJHtkcmFpbn0gJHtnYXRlfSAke3NvdXJjZX0gJHttb2RlbH1gXG4gICAgaWYgKGFyZWEpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHthcmVhfWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBNT1NGRVRDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgZHJhaW46IHN0cmluZ1xuICBnYXRlOiBzdHJpbmdcbiAgc291cmNlOiBzdHJpbmdcbiAgc3Vic3RyYXRlOiBzdHJpbmdcbiAgbW9kZWw6IHN0cmluZ1xuICBsZW5ndGg/OiBzdHJpbmdcbiAgd2lkdGg/OiBzdHJpbmdcbiAgZHJhaW5BcmVhPzogc3RyaW5nXG4gIHNvdXJjZUFyZWE/OiBzdHJpbmdcbiAgZHJhaW5QZXJpbWV0ZXI/OiBzdHJpbmdcbiAgc291cmNlUGVyaW1ldGVyPzogc3RyaW5nXG4gIGRyYWluUmVzaXN0YW5jZT86IHN0cmluZ1xuICBzb3VyY2VSZXNpc3RhbmNlPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBNT1NGRVRDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJtb3NmZXRcIiBhcyBjb25zdFxuICBwcm9wczogTU9TRkVUQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IE1PU0ZFVENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBkcmFpbixcbiAgICAgIGdhdGUsXG4gICAgICBzb3VyY2UsXG4gICAgICBzdWJzdHJhdGUsXG4gICAgICBtb2RlbCxcbiAgICAgIGxlbmd0aCxcbiAgICAgIHdpZHRoLFxuICAgICAgZHJhaW5BcmVhLFxuICAgICAgc291cmNlQXJlYSxcbiAgICAgIGRyYWluUGVyaW1ldGVyLFxuICAgICAgc291cmNlUGVyaW1ldGVyLFxuICAgICAgZHJhaW5SZXNpc3RhbmNlLFxuICAgICAgc291cmNlUmVzaXN0YW5jZSxcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYE0ke25hbWV9ICR7ZHJhaW59ICR7Z2F0ZX0gJHtzb3VyY2V9ICR7c3Vic3RyYXRlfSAke21vZGVsfWBcblxuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiA9IHtcbiAgICAgIEw6IGxlbmd0aCxcbiAgICAgIFc6IHdpZHRoLFxuICAgICAgQUQ6IGRyYWluQXJlYSxcbiAgICAgIEFTOiBzb3VyY2VBcmVhLFxuICAgICAgUEQ6IGRyYWluUGVyaW1ldGVyLFxuICAgICAgUFM6IHNvdXJjZVBlcmltZXRlcixcbiAgICAgIE5SRDogZHJhaW5SZXNpc3RhbmNlLFxuICAgICAgTlJTOiBzb3VyY2VSZXNpc3RhbmNlLFxuICAgIH1cblxuICAgIE9iamVjdC5lbnRyaWVzKHBhcmFtcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2tleX09JHt2YWx1ZX1gXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzaXN0b3JDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgbW9kZWw/OiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXN0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJyZXNpc3RvclwiIGFzIGNvbnN0XG4gIHByb3BzOiBSZXNpc3RvckNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBSZXNpc3RvckNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIG1vZGVsLCB2YWx1ZSB9ID0gdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBSJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9YFxuICAgIGlmIChtb2RlbCkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsfWBcbiAgICB9XG4gICAgc3BpY2VTdHJpbmcgKz0gYCAke3ZhbHVlfWBcbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFN1YmNpcmN1aXRDYWxsQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIG5vZGVzOiBzdHJpbmdbXVxuICBzdWJjaXJjdWl0TmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBTdWJjaXJjdWl0Q2FsbENvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcInN1YmNpcmN1aXRfY2FsbFwiIGFzIGNvbnN0XG4gIHByb3BzOiBTdWJjaXJjdWl0Q2FsbENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBTdWJjaXJjdWl0Q2FsbENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgbm9kZXMsIHN1YmNpcmN1aXROYW1lIH0gPSB0aGlzLnByb3BzXG4gICAgcmV0dXJuIGBYJHtuYW1lfSAke25vZGVzLmpvaW4oXCIgXCIpfSAke3N1YmNpcmN1aXROYW1lfWBcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbWlzc2lvbkxpbmVDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgYVBvc2l0aXZlOiBzdHJpbmdcbiAgYU5lZ2F0aXZlOiBzdHJpbmdcbiAgYlBvc2l0aXZlOiBzdHJpbmdcbiAgYk5lZ2F0aXZlOiBzdHJpbmdcbiAgaW1wZWRhbmNlOiBzdHJpbmdcbiAgZGVsYXk/OiBzdHJpbmdcbiAgZnJlcXVlbmN5Pzogc3RyaW5nXG4gIG5vcm1hbGl6ZWRMZW5ndGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFRyYW5zbWlzc2lvbkxpbmVDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJ0cmFuc21pc3Npb25fbGluZVwiIGFzIGNvbnN0XG4gIHByb3BzOiBUcmFuc21pc3Npb25MaW5lQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFRyYW5zbWlzc2lvbkxpbmVDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgYVBvc2l0aXZlLFxuICAgICAgYU5lZ2F0aXZlLFxuICAgICAgYlBvc2l0aXZlLFxuICAgICAgYk5lZ2F0aXZlLFxuICAgICAgaW1wZWRhbmNlLFxuICAgICAgZGVsYXksXG4gICAgICBmcmVxdWVuY3ksXG4gICAgICBub3JtYWxpemVkTGVuZ3RoLFxuICAgIH0gPSB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYFQke25hbWV9ICR7YVBvc2l0aXZlfSAke2FOZWdhdGl2ZX0gJHtiUG9zaXRpdmV9ICR7Yk5lZ2F0aXZlfSBaMD0ke2ltcGVkYW5jZX1gXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgIFREPSR7ZGVsYXl9YFxuICAgIH0gZWxzZSBpZiAoZnJlcXVlbmN5KSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgIEY9JHtmcmVxdWVuY3l9YFxuICAgICAgaWYgKG5vcm1hbGl6ZWRMZW5ndGgpIHtcbiAgICAgICAgc3BpY2VTdHJpbmcgKz0gYCBOTD0ke25vcm1hbGl6ZWRMZW5ndGh9YFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIHBvc2l0aXZlQ29udHJvbDogc3RyaW5nXG4gIG5lZ2F0aXZlQ29udHJvbDogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwidm9sdGFnZV9jb250cm9sbGVkX3N3aXRjaFwiIGFzIGNvbnN0XG4gIHByb3BzOiBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICBwb3NpdGl2ZUNvbnRyb2wsXG4gICAgICBuZWdhdGl2ZUNvbnRyb2wsXG4gICAgICBtb2RlbCxcbiAgICB9ID0gdGhpcy5wcm9wc1xuICAgIHJldHVybiBgUyR7bmFtZX0gJHtwb3NpdGl2ZU5vZGV9ICR7bmVnYXRpdmVOb2RlfSAke3Bvc2l0aXZlQ29udHJvbH0gJHtuZWdhdGl2ZUNvbnRyb2x9ICR7bW9kZWx9YFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9sdGFnZVNvdXJjZUNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICB2YWx1ZT86IHN0cmluZ1xuICBhY01hZ25pdHVkZT86IHN0cmluZ1xuICBhY1BoYXNlPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBWb2x0YWdlU291cmNlQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwidm9sdGFnZV9zb3VyY2VcIiBhcyBjb25zdFxuICBwcm9wczogVm9sdGFnZVNvdXJjZUNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBWb2x0YWdlU291cmNlQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZSwgdmFsdWUsIGFjTWFnbml0dWRlLCBhY1BoYXNlIH0gPVxuICAgICAgdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBWJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9YFxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke3ZhbHVlfWBcbiAgICB9XG4gICAgaWYgKGFjTWFnbml0dWRlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgIEFDICR7YWNNYWduaXR1ZGV9YFxuICAgICAgaWYgKGFjUGhhc2UpIHtcbiAgICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FjUGhhc2V9YFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgU2ltdWxhdGlvblN3aXRjaCB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UmVzaXN0YW5jZShyZXNpc3RhbmNlOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAocmVzaXN0YW5jZSA+PSAxZTYpIHJldHVybiBgJHtyZXNpc3RhbmNlIC8gMWU2fU1FR2BcbiAgaWYgKHJlc2lzdGFuY2UgPj0gMWUzKSByZXR1cm4gYCR7cmVzaXN0YW5jZSAvIDFlM31LYFxuICByZXR1cm4gcmVzaXN0YW5jZS50b1N0cmluZygpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDYXBhY2l0YW5jZShjYXBhY2l0YW5jZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGNhcGFjaXRhbmNlID49IDFlLTMpIHJldHVybiBgJHtjYXBhY2l0YW5jZSAqIDFlM31NYFxuICBpZiAoY2FwYWNpdGFuY2UgPj0gMWUtNikgcmV0dXJuIGAke2NhcGFjaXRhbmNlICogMWU2fVVgXG4gIGlmIChjYXBhY2l0YW5jZSA+PSAxZS05KSByZXR1cm4gYCR7Y2FwYWNpdGFuY2UgKiAxZTl9TmBcbiAgaWYgKGNhcGFjaXRhbmNlID49IDFlLTEyKSByZXR1cm4gYCR7Y2FwYWNpdGFuY2UgKiAxZTEyfVBgXG4gIHJldHVybiBjYXBhY2l0YW5jZS50b1N0cmluZygpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRJbmR1Y3RhbmNlKGluZHVjdGFuY2U6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChpbmR1Y3RhbmNlID49IDEpIHJldHVybiBpbmR1Y3RhbmNlLnRvU3RyaW5nKClcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtMykgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTN9bWBcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtNikgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTZ9dWBcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtOSkgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTl9bmBcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtMTIpIHJldHVybiBgJHtpbmR1Y3RhbmNlICogMWUxMn1wYFxuICByZXR1cm4gaW5kdWN0YW5jZS50b1N0cmluZygpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUlkZW50aWZpZXIodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgcHJlZml4OiBzdHJpbmcpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHByZWZpeFxuICBjb25zdCBzYW5pdGl6ZWQgPSB2YWx1ZS5yZXBsYWNlKC9bXkEtWmEtejAtOV9dL2csIFwiX1wiKVxuICBpZiAoIXNhbml0aXplZCkgcmV0dXJuIHByZWZpeFxuICBpZiAoL15bMC05XS8udGVzdChzYW5pdGl6ZWQpKSB7XG4gICAgcmV0dXJuIGAke3ByZWZpeH1fJHtzYW5pdGl6ZWR9YFxuICB9XG4gIHJldHVybiBzYW5pdGl6ZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2ltdWxhdGlvblN3aXRjaENvbnRyb2xWYWx1ZShcbiAgc2ltdWxhdGlvblN3aXRjaDogU2ltdWxhdGlvblN3aXRjaCB8IHVuZGVmaW5lZCxcbikge1xuICBjb25zdCBoaWdoVm9sdGFnZSA9IDVcbiAgY29uc3QgbG93Vm9sdGFnZSA9IDBcbiAgY29uc3QgcmlzZVRpbWUgPSBcIjFuXCJcbiAgY29uc3QgZmFsbFRpbWUgPSBcIjFuXCJcblxuICBpZiAoIXNpbXVsYXRpb25Td2l0Y2gpIHtcbiAgICByZXR1cm4gYERDICR7bG93Vm9sdGFnZX1gXG4gIH1cblxuICBjb25zdCBzdGFydHNDbG9zZWQgPSBzaW11bGF0aW9uU3dpdGNoLnN0YXJ0c19jbG9zZWQgPz8gZmFsc2VcbiAgY29uc3QgY2xvc2VzQXQgPSBzaW11bGF0aW9uU3dpdGNoLmNsb3Nlc19hdCA/PyAwXG4gIGNvbnN0IG9wZW5zQXQgPSBzaW11bGF0aW9uU3dpdGNoLm9wZW5zX2F0XG4gIGNvbnN0IHN3aXRjaGluZ0ZyZXF1ZW5jeSA9IHNpbXVsYXRpb25Td2l0Y2guc3dpdGNoaW5nX2ZyZXF1ZW5jeVxuXG4gIGNvbnN0IFtpbml0aWFsVm9sdGFnZSwgcHVsc2VkVm9sdGFnZV0gPSBzdGFydHNDbG9zZWRcbiAgICA/IFtoaWdoVm9sdGFnZSwgbG93Vm9sdGFnZV1cbiAgICA6IFtsb3dWb2x0YWdlLCBoaWdoVm9sdGFnZV1cblxuICBpZiAoc3dpdGNoaW5nRnJlcXVlbmN5ICYmIHN3aXRjaGluZ0ZyZXF1ZW5jeSA+IDApIHtcbiAgICBjb25zdCBwZXJpb2QgPSAxIC8gc3dpdGNoaW5nRnJlcXVlbmN5XG4gICAgY29uc3Qgd2lkdGhGcm9tT3BlbkNsb3NlID1cbiAgICAgIG9wZW5zQXQgJiYgb3BlbnNBdCA+IGNsb3Nlc0F0ID8gTWF0aC5taW4ob3BlbnNBdCAtIGNsb3Nlc0F0LCBwZXJpb2QpIDogMFxuICAgIGNvbnN0IHB1bHNlV2lkdGggPVxuICAgICAgd2lkdGhGcm9tT3BlbkNsb3NlID4gMCA/IHdpZHRoRnJvbU9wZW5DbG9zZSA6IE1hdGgubWF4KHBlcmlvZCAvIDIsIDFlLTkpXG5cbiAgICByZXR1cm4gYFBVTFNFKCR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoaW5pdGlhbFZvbHRhZ2UpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHB1bHNlZFZvbHRhZ2UpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKGNsb3Nlc0F0KX0gJHtyaXNlVGltZX0gJHtmYWxsVGltZX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwdWxzZVdpZHRoKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwZXJpb2QpfSlgXG4gIH1cblxuICBpZiAob3BlbnNBdCAhPT0gdW5kZWZpbmVkICYmIG9wZW5zQXQgPiBjbG9zZXNBdCkge1xuICAgIGNvbnN0IHB1bHNlV2lkdGggPSBNYXRoLm1heChvcGVuc0F0IC0gY2xvc2VzQXQsIDFlLTkpXG4gICAgY29uc3QgcGVyaW9kID0gY2xvc2VzQXQgKyBwdWxzZVdpZHRoICogMlxuXG4gICAgcmV0dXJuIGBQVUxTRSgke2Zvcm1hdE51bWJlckZvclNwaWNlKGluaXRpYWxWb2x0YWdlKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwdWxzZWRWb2x0YWdlKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShjbG9zZXNBdCl9ICR7cmlzZVRpbWV9ICR7ZmFsbFRpbWV9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocHVsc2VXaWR0aCl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocGVyaW9kKX0pYFxuICB9XG5cbiAgaWYgKGNsb3Nlc0F0ID4gMCkge1xuICAgIGNvbnN0IHBlcmlvZCA9IGNsb3Nlc0F0ICogMlxuICAgIGNvbnN0IHB1bHNlV2lkdGggPSBNYXRoLm1heChwZXJpb2QgLyAyLCAxZS05KVxuICAgIHJldHVybiBgUFVMU0UoJHtmb3JtYXROdW1iZXJGb3JTcGljZShpbml0aWFsVm9sdGFnZSl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocHVsc2VkVm9sdGFnZSl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoY2xvc2VzQXQpfSAke3Jpc2VUaW1lfSAke2ZhbGxUaW1lfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHB1bHNlV2lkdGgpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHBlcmlvZCl9KWBcbiAgfVxuXG4gIHJldHVybiBgREMgJHtzdGFydHNDbG9zZWQgPyBoaWdoVm9sdGFnZSA6IGxvd1ZvbHRhZ2V9YFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TnVtYmVyRm9yU3BpY2UodmFsdWU6IG51bWJlcikge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiBgJHt2YWx1ZX1gXG4gIGlmICh2YWx1ZSA9PT0gMCkgcmV0dXJuIFwiMFwiXG5cbiAgY29uc3QgYWJzVmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoYWJzVmFsdWUgPj0gMWUzIHx8IGFic1ZhbHVlIDw9IDFlLTMpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlLnRvRXhwb25lbnRpYWwoNikpLnRvU3RyaW5nKClcbiAgfVxuXG4gIHJldHVybiBOdW1iZXIodmFsdWUudG9QcmVjaXNpb24oNikpLnRvU3RyaW5nKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFNlY29uZHNGb3JTcGljZSh2YWx1ZTogbnVtYmVyKSB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgcmV0dXJuIGAke3ZhbHVlfWBcbiAgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gXCIwXCJcblxuICBjb25zdCB1bml0cyA9IFtcbiAgICBbXCJUXCIsIDFlMTJdLFxuICAgIFtcIkdcIiwgMWU5XSxcbiAgICBbXCJNRUdcIiwgMWU2XSxcbiAgICBbXCJrXCIsIDFlM10sXG4gICAgW1wibVwiLCAxZS0zXSxcbiAgICBbXCJ1XCIsIDFlLTZdLFxuICAgIFtcIm5cIiwgMWUtOV0sXG4gICAgW1wicFwiLCAxZS0xMl0sXG4gIF0gYXMgY29uc3RcblxuICBmb3IgKGNvbnN0IFtzdWZmaXgsIG11bHRpcGxpZXJdIG9mIHVuaXRzKSB7XG4gICAgY29uc3Qgc2NhbGVkID0gdmFsdWUgLyBtdWx0aXBsaWVyXG4gICAgaWYgKE1hdGguYWJzKHNjYWxlZCkgPj0gMC45OTk5OTkgJiYgTWF0aC5hYnMoc2NhbGVkKSA8IDk5OS45OTk5OTkpIHtcbiAgICAgIGNvbnN0IHJvdW5kZWQgPSBOdW1iZXIoc2NhbGVkLnRvUHJlY2lzaW9uKDYpKVxuICAgICAgaWYgKE1hdGguYWJzKHJvdW5kZWQgKiBtdWx0aXBsaWVyIC0gdmFsdWUpIDw9IE1hdGguYWJzKHZhbHVlKSAqIDFlLTkpIHtcbiAgICAgICAgcmV0dXJuIGAke3JvdW5kZWR9JHtzdWZmaXh9YFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmb3JtYXROdW1iZXJGb3JTcGljZSh2YWx1ZSlcbn1cbiIsICJpbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgeyBSZXNpc3RvckNvbW1hbmQgfSBmcm9tIFwibGliL3NwaWNlLWNvbW1hbmRzXCJcbmltcG9ydCB0eXBlIHsgQW55Q2lyY3VpdEVsZW1lbnQgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IGZvcm1hdFJlc2lzdGFuY2UgfSBmcm9tIFwiLi9oZWxwZXJzXCJcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW1wbGVSZXNpc3RvciA9ICh7XG4gIGNvbXBvbmVudCxcbiAgbm9kZXMsXG59OiB7XG4gIGNvbXBvbmVudDogQW55Q2lyY3VpdEVsZW1lbnRcbiAgbm9kZXM6IHN0cmluZ1tdXG59KTogU3BpY2VDb21wb25lbnQgfCBudWxsID0+IHtcbiAgaWYgKFwicmVzaXN0YW5jZVwiIGluIGNvbXBvbmVudCAmJiBcIm5hbWVcIiBpbiBjb21wb25lbnQpIHtcbiAgICBjb25zdCByZXNpc3RvckNtZCA9IG5ldyBSZXNpc3RvckNvbW1hbmQoe1xuICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLFxuICAgICAgcG9zaXRpdmVOb2RlOiBub2Rlc1swXSB8fCBcIjBcIixcbiAgICAgIG5lZ2F0aXZlTm9kZTogbm9kZXNbMV0gfHwgXCIwXCIsXG4gICAgICB2YWx1ZTogZm9ybWF0UmVzaXN0YW5jZShjb21wb25lbnQucmVzaXN0YW5jZSBhcyBudW1iZXIpLFxuICAgIH0pXG4gICAgcmV0dXJuIG5ldyBTcGljZUNvbXBvbmVudChjb21wb25lbnQubmFtZSBhcyBzdHJpbmcsIHJlc2lzdG9yQ21kLCBub2RlcylcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuIiwgImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQge1xuICBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmQsXG4gIFZvbHRhZ2VTb3VyY2VDb21tYW5kLFxufSBmcm9tIFwibGliL3NwaWNlLWNvbW1hbmRzXCJcbmltcG9ydCB0eXBlIHsgU2ltdWxhdGlvblN3aXRjaCwgU291cmNlU2ltcGxlU3dpdGNoIH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQge1xuICBidWlsZFNpbXVsYXRpb25Td2l0Y2hDb250cm9sVmFsdWUsXG4gIHNhbml0aXplSWRlbnRpZmllcixcbn0gZnJvbSBcIi4vaGVscGVyc1wiXG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltcGxlU3dpdGNoID0gKHtcbiAgbmV0bGlzdCxcbiAgY29tcG9uZW50LFxuICBub2RlcyxcbiAgc2ltdWxhdGlvblN3aXRjaE1hcCxcbn06IHtcbiAgbmV0bGlzdDogU3BpY2VOZXRsaXN0XG4gIGNvbXBvbmVudDogU291cmNlU2ltcGxlU3dpdGNoXG4gIG5vZGVzOiBzdHJpbmdbXVxuICBzaW11bGF0aW9uU3dpdGNoTWFwOiBNYXA8c3RyaW5nLCBTaW11bGF0aW9uU3dpdGNoPlxufSk6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9PiB7XG4gIGNvbnN0IHNhbml0aXplZEJhc2UgPSBzYW5pdGl6ZUlkZW50aWZpZXIoXG4gICAgY29tcG9uZW50Lm5hbWUgPz8gY29tcG9uZW50LnNvdXJjZV9jb21wb25lbnRfaWQsXG4gICAgXCJTV1wiLFxuICApXG4gIGNvbnN0IHBvc2l0aXZlTm9kZSA9IG5vZGVzWzBdIHx8IFwiMFwiXG4gIGNvbnN0IG5lZ2F0aXZlTm9kZSA9IG5vZGVzWzFdIHx8IFwiMFwiXG4gIGNvbnN0IGNvbnRyb2xOb2RlID0gYE5DVFJMXyR7c2FuaXRpemVkQmFzZX1gXG4gIGNvbnN0IG1vZGVsTmFtZSA9IGBTV18ke3Nhbml0aXplZEJhc2V9YFxuXG4gIGNvbnN0IGFzc29jaWF0ZWRTaW11bGF0aW9uU3dpdGNoID0gc2ltdWxhdGlvblN3aXRjaE1hcC5nZXQoXG4gICAgY29tcG9uZW50LnNvdXJjZV9jb21wb25lbnRfaWQsXG4gIClcblxuICBjb25zdCBjb250cm9sVmFsdWUgPSBidWlsZFNpbXVsYXRpb25Td2l0Y2hDb250cm9sVmFsdWUoXG4gICAgYXNzb2NpYXRlZFNpbXVsYXRpb25Td2l0Y2gsXG4gIClcblxuICBjb25zdCBzd2l0Y2hDbWQgPSBuZXcgVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kKHtcbiAgICBuYW1lOiBzYW5pdGl6ZWRCYXNlLFxuICAgIHBvc2l0aXZlTm9kZSxcbiAgICBuZWdhdGl2ZU5vZGUsXG4gICAgcG9zaXRpdmVDb250cm9sOiBjb250cm9sTm9kZSxcbiAgICBuZWdhdGl2ZUNvbnRyb2w6IFwiMFwiLFxuICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gIH0pXG5cbiAgaWYgKCFuZXRsaXN0Lm1vZGVscy5oYXMobW9kZWxOYW1lKSkge1xuICAgIG5ldGxpc3QubW9kZWxzLnNldChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGAuTU9ERUwgJHttb2RlbE5hbWV9IFNXKFJvbj0wLjEgUm9mZj0xZTkgVnQ9Mi41IFZoPTAuMSlgLFxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGNvbnRyb2xTb3VyY2VOYW1lID0gYENUUkxfJHtzYW5pdGl6ZWRCYXNlfWBcbiAgY29uc3QgY29udHJvbFNvdXJjZUNtZCA9IG5ldyBWb2x0YWdlU291cmNlQ29tbWFuZCh7XG4gICAgbmFtZTogY29udHJvbFNvdXJjZU5hbWUsXG4gICAgcG9zaXRpdmVOb2RlOiBjb250cm9sTm9kZSxcbiAgICBuZWdhdGl2ZU5vZGU6IFwiMFwiLFxuICAgIHZhbHVlOiBjb250cm9sVmFsdWUsXG4gIH0pXG5cbiAgY29uc3QgY29udHJvbENvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICBjb250cm9sU291cmNlTmFtZSxcbiAgICBjb250cm9sU291cmNlQ21kLFxuICAgIFtjb250cm9sTm9kZSwgXCIwXCJdLFxuICApXG5cbiAgbmV0bGlzdC5hZGRDb21wb25lbnQoY29udHJvbENvbXBvbmVudClcblxuICByZXR1cm4gbmV3IFNwaWNlQ29tcG9uZW50KHNhbml0aXplZEJhc2UsIHN3aXRjaENtZCwgW1xuICAgIHBvc2l0aXZlTm9kZSxcbiAgICBuZWdhdGl2ZU5vZGUsXG4gICAgY29udHJvbE5vZGUsXG4gICAgXCIwXCIsXG4gIF0pXG59XG4iLCAiaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHsgQ2FwYWNpdG9yQ29tbWFuZCB9IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlDaXJjdWl0RWxlbWVudCB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHsgZm9ybWF0Q2FwYWNpdGFuY2UgfSBmcm9tIFwiLi9oZWxwZXJzXCJcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW1wbGVDYXBhY2l0b3IgPSAoe1xuICBjb21wb25lbnQsXG4gIG5vZGVzLFxufToge1xuICBjb21wb25lbnQ6IEFueUNpcmN1aXRFbGVtZW50XG4gIG5vZGVzOiBzdHJpbmdbXVxufSk6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9PiB7XG4gIGlmIChcImNhcGFjaXRhbmNlXCIgaW4gY29tcG9uZW50ICYmIFwibmFtZVwiIGluIGNvbXBvbmVudCkge1xuICAgIGNvbnN0IGNhcGFjaXRvckNtZCA9IG5ldyBDYXBhY2l0b3JDb21tYW5kKHtcbiAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZyxcbiAgICAgIHBvc2l0aXZlTm9kZTogbm9kZXNbMF0gfHwgXCIwXCIsXG4gICAgICBuZWdhdGl2ZU5vZGU6IG5vZGVzWzFdIHx8IFwiMFwiLFxuICAgICAgdmFsdWU6IGZvcm1hdENhcGFjaXRhbmNlKGNvbXBvbmVudC5jYXBhY2l0YW5jZSBhcyBudW1iZXIpLFxuICAgIH0pXG4gICAgcmV0dXJuIG5ldyBTcGljZUNvbXBvbmVudChjb21wb25lbnQubmFtZSBhcyBzdHJpbmcsIGNhcGFjaXRvckNtZCwgbm9kZXMpXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3RcIlxuaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHsgRGlvZGVDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5pbXBvcnQgdHlwZSB7XG4gIFNvdXJjZVBvcnQsXG4gIFNvdXJjZVNpbXBsZURpb2RlLFxuICBTb3VyY2VTaW1wbGVMZWQsXG59IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuXG5jb25zdCBnZXREaW9kZU5vZGVzID0gKFxuICBjb21wb25lbnRQb3J0czogU291cmNlUG9ydFtdLFxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKSA9PiB7XG4gIGNvbnN0IGFub2RlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgKHApID0+IHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJhbm9kZVwiIHx8IHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJhbm9kZVwiKSxcbiAgKVxuICBjb25zdCBjYXRob2RlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgKHApID0+XG4gICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiY2F0aG9kZVwiIHx8IHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJjYXRob2RlXCIpLFxuICApXG5cbiAgcmV0dXJuIHtcbiAgICBwb3NpdGl2ZU5vZGU6IG5vZGVNYXAuZ2V0KGFub2RlUG9ydD8uc291cmNlX3BvcnRfaWQgPz8gXCJcIikgfHwgXCIwXCIsXG4gICAgbmVnYXRpdmVOb2RlOiBub2RlTWFwLmdldChjYXRob2RlUG9ydD8uc291cmNlX3BvcnRfaWQgPz8gXCJcIikgfHwgXCIwXCIsXG4gIH1cbn1cblxuY29uc3QgcHJvY2Vzc0Rpb2RlTGlrZUNvbXBvbmVudCA9ICh7XG4gIG5ldGxpc3QsXG4gIGNvbXBvbmVudCxcbiAgY29tcG9uZW50UG9ydHMsXG4gIG5vZGVNYXAsXG4gIG1vZGVsTmFtZSxcbiAgbW9kZWxEZWZpbml0aW9uLFxufToge1xuICBuZXRsaXN0OiBTcGljZU5ldGxpc3RcbiAgY29tcG9uZW50OiBTb3VyY2VTaW1wbGVEaW9kZSB8IFNvdXJjZVNpbXBsZUxlZFxuICBjb21wb25lbnRQb3J0czogU291cmNlUG9ydFtdXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgbW9kZWxOYW1lOiBzdHJpbmdcbiAgbW9kZWxEZWZpbml0aW9uOiBzdHJpbmdcbn0pOiBTcGljZUNvbXBvbmVudCB8IG51bGwgPT4ge1xuICBpZiAoXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgY29uc3QgeyBwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZSB9ID0gZ2V0RGlvZGVOb2RlcyhcbiAgICAgIGNvbXBvbmVudFBvcnRzLFxuICAgICAgbm9kZU1hcCxcbiAgICApXG5cbiAgICBjb25zdCBkaW9kZUNtZCA9IG5ldyBEaW9kZUNvbW1hbmQoe1xuICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLFxuICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICB9KVxuICAgIG5ldGxpc3QubW9kZWxzLnNldChtb2RlbE5hbWUsIG1vZGVsRGVmaW5pdGlvbilcbiAgICByZXR1cm4gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZywgZGlvZGVDbWQsIFtcbiAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICBdKVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltcGxlRGlvZGUgPSAoe1xuICBuZXRsaXN0LFxuICBjb21wb25lbnQsXG4gIGNvbXBvbmVudFBvcnRzLFxuICBub2RlTWFwLFxufToge1xuICBuZXRsaXN0OiBTcGljZU5ldGxpc3RcbiAgY29tcG9uZW50OiBTb3VyY2VTaW1wbGVEaW9kZVxuICBjb21wb25lbnRQb3J0czogU291cmNlUG9ydFtdXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbn0pOiBTcGljZUNvbXBvbmVudCB8IG51bGwgPT4ge1xuICByZXR1cm4gcHJvY2Vzc0Rpb2RlTGlrZUNvbXBvbmVudCh7XG4gICAgbmV0bGlzdCxcbiAgICBjb21wb25lbnQsXG4gICAgY29tcG9uZW50UG9ydHMsXG4gICAgbm9kZU1hcCxcbiAgICBtb2RlbE5hbWU6IFwiRFwiLFxuICAgIG1vZGVsRGVmaW5pdGlvbjogXCIuTU9ERUwgRCBEXCIsXG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltcGxlTGVkID0gKHtcbiAgbmV0bGlzdCxcbiAgY29tcG9uZW50LFxuICBjb21wb25lbnRQb3J0cyxcbiAgbm9kZU1hcCxcbn06IHtcbiAgbmV0bGlzdDogU3BpY2VOZXRsaXN0XG4gIGNvbXBvbmVudDogU291cmNlU2ltcGxlTGVkXG4gIGNvbXBvbmVudFBvcnRzOiBTb3VyY2VQb3J0W11cbiAgbm9kZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPlxufSk6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9PiB7XG4gIHJldHVybiBwcm9jZXNzRGlvZGVMaWtlQ29tcG9uZW50KHtcbiAgICBuZXRsaXN0LFxuICAgIGNvbXBvbmVudCxcbiAgICBjb21wb25lbnRQb3J0cyxcbiAgICBub2RlTWFwLFxuICAgIG1vZGVsTmFtZTogXCJMRURcIixcbiAgICBtb2RlbERlZmluaXRpb246XG4gICAgICBcIi5NT0RFTCBMRUQgRChJUz0xZS0yMCBOPTIgUlM9MTAgQ0pPPTJwIEVHPTIuMSBCVj01IElCVj0xMHUpXCIsXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHsgSW5kdWN0b3JDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5pbXBvcnQgdHlwZSB7IEFueUNpcmN1aXRFbGVtZW50IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgeyBmb3JtYXRJbmR1Y3RhbmNlIH0gZnJvbSBcIi4vaGVscGVyc1wiXG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltcGxlSW5kdWN0b3IgPSAoe1xuICBjb21wb25lbnQsXG4gIG5vZGVzLFxufToge1xuICBjb21wb25lbnQ6IEFueUNpcmN1aXRFbGVtZW50XG4gIG5vZGVzOiBzdHJpbmdbXVxufSk6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9PiB7XG4gIGlmIChcImluZHVjdGFuY2VcIiBpbiBjb21wb25lbnQgJiYgXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgY29uc3QgaW5kdWN0b3JDbWQgPSBuZXcgSW5kdWN0b3JDb21tYW5kKHtcbiAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZyxcbiAgICAgIHBvc2l0aXZlTm9kZTogbm9kZXNbMF0gfHwgXCIwXCIsXG4gICAgICBuZWdhdGl2ZU5vZGU6IG5vZGVzWzFdIHx8IFwiMFwiLFxuICAgICAgdmFsdWU6IGZvcm1hdEluZHVjdGFuY2UoY29tcG9uZW50LmluZHVjdGFuY2UgYXMgbnVtYmVyKSxcbiAgICB9KVxuICAgIHJldHVybiBuZXcgU3BpY2VDb21wb25lbnQoY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLCBpbmR1Y3RvckNtZCwgbm9kZXMpXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3RcIlxuaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHsgTU9TRkVUQ29tbWFuZCB9IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuaW1wb3J0IHR5cGUgeyBTb3VyY2VQb3J0LCBTb3VyY2VTaW1wbGVNb3NmZXQgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW1wbGVNb3NmZXQgPSAoe1xuICBuZXRsaXN0LFxuICBjb21wb25lbnQsXG4gIGNvbXBvbmVudFBvcnRzLFxuICBub2RlTWFwLFxufToge1xuICBuZXRsaXN0OiBTcGljZU5ldGxpc3RcbiAgY29tcG9uZW50OiBTb3VyY2VTaW1wbGVNb3NmZXRcbiAgY29tcG9uZW50UG9ydHM6IFNvdXJjZVBvcnRbXVxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG59KTogU3BpY2VDb21wb25lbnQgfCBudWxsID0+IHtcbiAgaWYgKFwibmFtZVwiIGluIGNvbXBvbmVudCkge1xuICAgIGNvbnN0IGRyYWluUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAocCkgPT5cbiAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImRyYWluXCIgfHwgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImRyYWluXCIpLFxuICAgIClcbiAgICBjb25zdCBnYXRlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAocCkgPT4gcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImdhdGVcIiB8fCBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwiZ2F0ZVwiKSxcbiAgICApXG4gICAgY29uc3Qgc291cmNlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAocCkgPT5cbiAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcInNvdXJjZVwiIHx8IHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJzb3VyY2VcIiksXG4gICAgKVxuXG4gICAgY29uc3QgZHJhaW5Ob2RlID0gbm9kZU1hcC5nZXQoZHJhaW5Qb3J0Py5zb3VyY2VfcG9ydF9pZCA/PyBcIlwiKSB8fCBcIjBcIlxuICAgIGNvbnN0IGdhdGVOb2RlID0gbm9kZU1hcC5nZXQoZ2F0ZVBvcnQ/LnNvdXJjZV9wb3J0X2lkID8/IFwiXCIpIHx8IFwiMFwiXG4gICAgY29uc3Qgc291cmNlTm9kZSA9IG5vZGVNYXAuZ2V0KHNvdXJjZVBvcnQ/LnNvdXJjZV9wb3J0X2lkID8/IFwiXCIpIHx8IFwiMFwiXG5cbiAgICAvLyBGb3IgMy1waW4gTU9TRkVUcywgc3Vic3RyYXRlIGlzIHR5cGljYWxseSBjb25uZWN0ZWQgdG8gc291cmNlXG4gICAgY29uc3Qgc3Vic3RyYXRlTm9kZSA9IHNvdXJjZU5vZGVcblxuICAgIGNvbnN0IGNoYW5uZWxfdHlwZSA9IGNvbXBvbmVudC5jaGFubmVsX3R5cGUgPz8gXCJuXCJcbiAgICBjb25zdCBtb3NmZXRfbW9kZSA9IGNvbXBvbmVudC5tb3NmZXRfbW9kZSA/PyBcImVuaGFuY2VtZW50XCJcblxuICAgIGNvbnN0IG1vZGVsVHlwZSA9IGAke2NoYW5uZWxfdHlwZS50b1VwcGVyQ2FzZSgpfU1PU2BcbiAgICBjb25zdCBtb2RlbE5hbWUgPSBgJHttb2RlbFR5cGV9XyR7bW9zZmV0X21vZGUudG9VcHBlckNhc2UoKX1gXG5cbiAgICBpZiAoIW5ldGxpc3QubW9kZWxzLmhhcyhtb2RlbE5hbWUpKSB7XG4gICAgICBpZiAobW9zZmV0X21vZGUgPT09IFwiZW5oYW5jZW1lbnRcIikge1xuICAgICAgICBjb25zdCB2dG8gPSBjaGFubmVsX3R5cGUgPT09IFwicFwiID8gLTEgOiAxXG4gICAgICAgIG5ldGxpc3QubW9kZWxzLnNldChcbiAgICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgICAgYC5NT0RFTCAke21vZGVsTmFtZX0gJHttb2RlbFR5cGV9IChWVE89JHt2dG99IEtQPTAuMSlgLFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXRsaXN0Lm1vZGVscy5zZXQoXG4gICAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICAgIGAuTU9ERUwgJHttb2RlbE5hbWV9ICR7bW9kZWxUeXBlfSAoS1A9MC4xKWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtb3NmZXRDbWQgPSBuZXcgTU9TRkVUQ29tbWFuZCh7XG4gICAgICBuYW1lOiBjb21wb25lbnQubmFtZSBhcyBzdHJpbmcsXG4gICAgICBkcmFpbjogZHJhaW5Ob2RlLFxuICAgICAgZ2F0ZTogZ2F0ZU5vZGUsXG4gICAgICBzb3VyY2U6IHNvdXJjZU5vZGUsXG4gICAgICBzdWJzdHJhdGU6IHN1YnN0cmF0ZU5vZGUsXG4gICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgIH0pXG5cbiAgICByZXR1cm4gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZywgbW9zZmV0Q21kLCBbXG4gICAgICBkcmFpbk5vZGUsXG4gICAgICBnYXRlTm9kZSxcbiAgICAgIHNvdXJjZU5vZGUsXG4gICAgXSlcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuIiwgImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgeyBCSlRDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5pbXBvcnQgdHlwZSB7IFNvdXJjZVBvcnQsIFNvdXJjZVNpbXBsZVRyYW5zaXN0b3IgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW1wbGVUcmFuc2lzdG9yID0gKHtcbiAgbmV0bGlzdCxcbiAgY29tcG9uZW50LFxuICBjb21wb25lbnRQb3J0cyxcbiAgbm9kZU1hcCxcbn06IHtcbiAgbmV0bGlzdDogU3BpY2VOZXRsaXN0XG4gIGNvbXBvbmVudDogU291cmNlU2ltcGxlVHJhbnNpc3RvclxuICBjb21wb25lbnRQb3J0czogU291cmNlUG9ydFtdXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbn0pOiBTcGljZUNvbXBvbmVudCB8IG51bGwgPT4ge1xuICBpZiAoXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgY29uc3QgY29sbGVjdG9yUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAocCkgPT5cbiAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImNvbGxlY3RvclwiIHx8XG4gICAgICAgIHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJjb2xsZWN0b3JcIiksXG4gICAgKVxuICAgIGNvbnN0IGJhc2VQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgIChwKSA9PiBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiYmFzZVwiIHx8IHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJiYXNlXCIpLFxuICAgIClcbiAgICBjb25zdCBlbWl0dGVyUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAocCkgPT5cbiAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImVtaXR0ZXJcIiB8fFxuICAgICAgICBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwiZW1pdHRlclwiKSxcbiAgICApXG5cbiAgICBpZiAoIWNvbGxlY3RvclBvcnQgfHwgIWJhc2VQb3J0IHx8ICFlbWl0dGVyUG9ydCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJhbnNpc3RvciAke2NvbXBvbmVudC5uYW1lfSBpcyBtaXNzaW5nIHJlcXVpcmVkIHBvcnRzIChjb2xsZWN0b3IsIGJhc2UsIGVtaXR0ZXIpYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBjb2xsZWN0b3JOb2RlID0gbm9kZU1hcC5nZXQoY29sbGVjdG9yUG9ydC5zb3VyY2VfcG9ydF9pZCkgfHwgXCIwXCJcbiAgICBjb25zdCBiYXNlTm9kZSA9IG5vZGVNYXAuZ2V0KGJhc2VQb3J0LnNvdXJjZV9wb3J0X2lkKSB8fCBcIjBcIlxuICAgIGNvbnN0IGVtaXR0ZXJOb2RlID0gbm9kZU1hcC5nZXQoZW1pdHRlclBvcnQuc291cmNlX3BvcnRfaWQpIHx8IFwiMFwiXG5cbiAgICBjb25zdCB0cmFuc2lzdG9yX3R5cGUgPSBjb21wb25lbnQudHJhbnNpc3Rvcl90eXBlID8/IFwibnBuXCJcbiAgICBjb25zdCBtb2RlbE5hbWUgPSB0cmFuc2lzdG9yX3R5cGUudG9VcHBlckNhc2UoKVxuICAgIGlmICghbmV0bGlzdC5tb2RlbHMuaGFzKG1vZGVsTmFtZSkpIHtcbiAgICAgIG5ldGxpc3QubW9kZWxzLnNldChcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBgLk1PREVMICR7bW9kZWxOYW1lfSAke3RyYW5zaXN0b3JfdHlwZS50b1VwcGVyQ2FzZSgpfWAsXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgYmp0Q21kID0gbmV3IEJKVENvbW1hbmQoe1xuICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLFxuICAgICAgY29sbGVjdG9yOiBjb2xsZWN0b3JOb2RlLFxuICAgICAgYmFzZTogYmFzZU5vZGUsXG4gICAgICBlbWl0dGVyOiBlbWl0dGVyTm9kZSxcbiAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgfSlcbiAgICByZXR1cm4gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZywgYmp0Q21kLCBbXG4gICAgICBjb2xsZWN0b3JOb2RlLFxuICAgICAgYmFzZU5vZGUsXG4gICAgICBlbWl0dGVyTm9kZSxcbiAgICBdKVxuICB9XG4gIHJldHVybiBudWxsXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBbnlDaXJjdWl0RWxlbWVudCwgU2ltdWxhdGlvblZvbHRhZ2VTb3VyY2UgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBWb2x0YWdlU291cmNlQ29tbWFuZCB9IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuaW1wb3J0IHsgZm9ybWF0U2Vjb25kc0ZvclNwaWNlIH0gZnJvbSBcIi4vaGVscGVyc1wiXG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltdWxhdGlvblZvbHRhZ2VTb3VyY2VzID0gKFxuICBuZXRsaXN0OiBTcGljZU5ldGxpc3QsXG4gIHNpbXVsYXRpb25Wb2x0YWdlU291cmNlczogU2ltdWxhdGlvblZvbHRhZ2VTb3VyY2VbXSxcbiAgbm9kZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPixcbikgPT4ge1xuICBmb3IgKGNvbnN0IHNpbVNvdXJjZSBvZiBzaW11bGF0aW9uVm9sdGFnZVNvdXJjZXMpIHtcbiAgICBpZiAoc2ltU291cmNlLnR5cGUgIT09IFwic2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZVwiKSBjb250aW51ZVxuXG4gICAgaWYgKHNpbVNvdXJjZS5pc19kY19zb3VyY2UgPT09IGZhbHNlKSB7XG4gICAgICAvLyBBQyBTb3VyY2VcbiAgICAgIGlmIChcbiAgICAgICAgXCJ0ZXJtaW5hbDFfc291cmNlX3BvcnRfaWRcIiBpbiBzaW1Tb3VyY2UgJiZcbiAgICAgICAgXCJ0ZXJtaW5hbDJfc291cmNlX3BvcnRfaWRcIiBpbiBzaW1Tb3VyY2UgJiZcbiAgICAgICAgc2ltU291cmNlLnRlcm1pbmFsMV9zb3VyY2VfcG9ydF9pZCAmJlxuICAgICAgICBzaW1Tb3VyY2UudGVybWluYWwyX3NvdXJjZV9wb3J0X2lkXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcG9zaXRpdmVOb2RlID1cbiAgICAgICAgICBub2RlTWFwLmdldChzaW1Tb3VyY2UudGVybWluYWwxX3NvdXJjZV9wb3J0X2lkKSB8fCBcIjBcIlxuICAgICAgICBjb25zdCBuZWdhdGl2ZU5vZGUgPVxuICAgICAgICAgIG5vZGVNYXAuZ2V0KHNpbVNvdXJjZS50ZXJtaW5hbDJfc291cmNlX3BvcnRfaWQpIHx8IFwiMFwiXG5cbiAgICAgICAgbGV0IHZhbHVlID0gXCJcIlxuICAgICAgICBjb25zdCB3YXZlX3NoYXBlID0gc2ltU291cmNlLndhdmVfc2hhcGVcbiAgICAgICAgaWYgKHdhdmVfc2hhcGUgPT09IFwic2luZXdhdmVcIikge1xuICAgICAgICAgIGNvbnN0IHZfb2Zmc2V0ID0gMCAvLyBub3QgcHJvdmlkZWQgaW4gY2lyY3VpdEpzb25cbiAgICAgICAgICBjb25zdCB2X3BlYWsgPSBzaW1Tb3VyY2Uudm9sdGFnZSA/PyAwXG4gICAgICAgICAgY29uc3QgZnJlcSA9IHNpbVNvdXJjZS5mcmVxdWVuY3kgPz8gMFxuICAgICAgICAgIGNvbnN0IGRlbGF5ID0gMCAvLyBub3QgcHJvdmlkZWQgaW4gY2lyY3VpdEpzb25cbiAgICAgICAgICBjb25zdCBkYW1waW5nX2ZhY3RvciA9IDAgLy8gbm90IHByb3ZpZGVkIGluIGNpcmN1aXRKc29uXG4gICAgICAgICAgY29uc3QgcGhhc2UgPSBzaW1Tb3VyY2UucGhhc2UgPz8gMFxuICAgICAgICAgIGlmIChmcmVxID4gMCkge1xuICAgICAgICAgICAgdmFsdWUgPSBgU0lOKCR7dl9vZmZzZXR9ICR7dl9wZWFrfSAke2ZyZXF9ICR7ZGVsYXl9ICR7ZGFtcGluZ19mYWN0b3J9ICR7cGhhc2V9KWBcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBgREMgJHtzaW1Tb3VyY2Uudm9sdGFnZSA/PyAwfWBcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2F2ZV9zaGFwZSA9PT0gXCJzcXVhcmVcIikge1xuICAgICAgICAgIGNvbnN0IHZfaW5pdGlhbCA9IDBcbiAgICAgICAgICBjb25zdCB2X3B1bHNlZCA9IHNpbVNvdXJjZS52b2x0YWdlID8/IDBcbiAgICAgICAgICBjb25zdCBmcmVxID0gc2ltU291cmNlLmZyZXF1ZW5jeSA/PyAwXG4gICAgICAgICAgY29uc3QgcGVyaW9kX2Zyb21fZnJlcSA9IGZyZXEgPT09IDAgPyBJbmZpbml0eSA6IDEgLyBmcmVxXG4gICAgICAgICAgY29uc3QgaGFzRXhwbGljaXRQZXJpb2QgPSBzaW1Tb3VyY2UucGVyaW9kICE9PSB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFB1bHNlV2lkdGggPSBzaW1Tb3VyY2UucHVsc2Vfd2lkdGggIT09IHVuZGVmaW5lZFxuICAgICAgICAgIGNvbnN0IHBlcmlvZCA9IGhhc0V4cGxpY2l0UGVyaW9kXG4gICAgICAgICAgICA/IHNpbVNvdXJjZS5wZXJpb2QhIC8gMTAwMFxuICAgICAgICAgICAgOiBwZXJpb2RfZnJvbV9mcmVxXG4gICAgICAgICAgY29uc3QgZHV0eV9jeWNsZSA9IHNpbVNvdXJjZS5kdXR5X2N5Y2xlID8/IDAuNVxuICAgICAgICAgIGNvbnN0IHB1bHNlX3dpZHRoID0gcGVyaW9kICogZHV0eV9jeWNsZVxuICAgICAgICAgIGNvbnN0IGRlbGF5ID1cbiAgICAgICAgICAgIHNpbVNvdXJjZS5wdWxzZV9kZWxheSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gc2ltU291cmNlLnB1bHNlX2RlbGF5IC8gMTAwMFxuICAgICAgICAgICAgICA6IDBcbiAgICAgICAgICBjb25zdCByaXNlX3RpbWUgPVxuICAgICAgICAgICAgc2ltU291cmNlLnJpc2VfdGltZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gZm9ybWF0U2Vjb25kc0ZvclNwaWNlKHNpbVNvdXJjZS5yaXNlX3RpbWUgLyAxMDAwKVxuICAgICAgICAgICAgICA6IFwiMW5cIlxuICAgICAgICAgIGNvbnN0IGZhbGxfdGltZSA9XG4gICAgICAgICAgICBzaW1Tb3VyY2UuZmFsbF90aW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBmb3JtYXRTZWNvbmRzRm9yU3BpY2Uoc2ltU291cmNlLmZhbGxfdGltZSAvIDEwMDApXG4gICAgICAgICAgICAgIDogXCIxblwiXG4gICAgICAgICAgY29uc3QgcHVsc2VXaWR0aFRleHQgPSBoYXNFeHBsaWNpdFB1bHNlV2lkdGhcbiAgICAgICAgICAgID8gZm9ybWF0U2Vjb25kc0ZvclNwaWNlKHNpbVNvdXJjZS5wdWxzZV93aWR0aCEgLyAxMDAwKVxuICAgICAgICAgICAgOiBmb3JtYXRTZWNvbmRzRm9yU3BpY2UocHVsc2Vfd2lkdGgpXG4gICAgICAgICAgY29uc3QgcGVyaW9kVGV4dCA9IGZvcm1hdFNlY29uZHNGb3JTcGljZShwZXJpb2QpXG4gICAgICAgICAgdmFsdWUgPSBgUFVMU0UoJHt2X2luaXRpYWx9ICR7dl9wdWxzZWR9ICR7Zm9ybWF0U2Vjb25kc0ZvclNwaWNlKGRlbGF5KX0gJHtyaXNlX3RpbWV9ICR7ZmFsbF90aW1lfSAke3B1bHNlV2lkdGhUZXh0fSAke3BlcmlvZFRleHR9KWBcbiAgICAgICAgfSBlbHNlIGlmIChzaW1Tb3VyY2Uudm9sdGFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFsdWUgPSBgREMgJHtzaW1Tb3VyY2Uudm9sdGFnZX1gXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBjb25zdCB2b2x0YWdlU291cmNlQ21kID0gbmV3IFZvbHRhZ2VTb3VyY2VDb21tYW5kKHtcbiAgICAgICAgICAgIG5hbWU6IHNpbVNvdXJjZS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlX2lkLFxuICAgICAgICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGNvbnN0IHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICAgICAgc2ltU291cmNlLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2VfaWQsXG4gICAgICAgICAgICB2b2x0YWdlU291cmNlQ21kLFxuICAgICAgICAgICAgW3Bvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlXSxcbiAgICAgICAgICApXG4gICAgICAgICAgbmV0bGlzdC5hZGRDb21wb25lbnQoc3BpY2VDb21wb25lbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gREMgU291cmNlIChpc19kY19zb3VyY2UgaXMgdHJ1ZSBvciB1bmRlZmluZWQpXG4gICAgICBjb25zdCBwb3NpdGl2ZVBvcnRJZCA9IHNpbVNvdXJjZS5wb3NpdGl2ZV9zb3VyY2VfcG9ydF9pZFxuICAgICAgY29uc3QgbmVnYXRpdmVQb3J0SWQgPSBzaW1Tb3VyY2UubmVnYXRpdmVfc291cmNlX3BvcnRfaWRcblxuICAgICAgaWYgKFxuICAgICAgICBwb3NpdGl2ZVBvcnRJZCAmJlxuICAgICAgICBuZWdhdGl2ZVBvcnRJZCAmJlxuICAgICAgICBcInZvbHRhZ2VcIiBpbiBzaW1Tb3VyY2UgJiZcbiAgICAgICAgc2ltU291cmNlLnZvbHRhZ2UgIT09IHVuZGVmaW5lZFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aXZlTm9kZSA9IG5vZGVNYXAuZ2V0KHBvc2l0aXZlUG9ydElkKSB8fCBcIjBcIlxuICAgICAgICBjb25zdCBuZWdhdGl2ZU5vZGUgPSBub2RlTWFwLmdldChuZWdhdGl2ZVBvcnRJZCkgfHwgXCIwXCJcblxuICAgICAgICBjb25zdCB2b2x0YWdlU291cmNlQ21kID0gbmV3IFZvbHRhZ2VTb3VyY2VDb21tYW5kKHtcbiAgICAgICAgICBuYW1lOiBzaW1Tb3VyY2Uuc2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZV9pZCxcbiAgICAgICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgICAgIHZhbHVlOiBgREMgJHsoc2ltU291cmNlIGFzIGFueSkudm9sdGFnZX1gLFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICAgIHNpbVNvdXJjZS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlX2lkLFxuICAgICAgICAgIHZvbHRhZ2VTb3VyY2VDbWQsXG4gICAgICAgICAgW3Bvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlXSxcbiAgICAgICAgKVxuICAgICAgICBuZXRsaXN0LmFkZENvbXBvbmVudChzcGljZUNvbXBvbmVudClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFueUNpcmN1aXRFbGVtZW50IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgdHlwZSB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3RcIlxuaW1wb3J0IHsgQ3VycmVudFNvdXJjZUNvbW1hbmQgfSBmcm9tIFwibGliL3NwaWNlLWNvbW1hbmRzXCJcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW11bGF0aW9uQ3VycmVudFNvdXJjZXMgPSAoXG4gIG5ldGxpc3Q6IFNwaWNlTmV0bGlzdCxcbiAgc2ltdWxhdGlvbkN1cnJlbnRTb3VyY2VzOiBBbnlDaXJjdWl0RWxlbWVudFtdLFxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKSA9PiB7XG4gIGZvciAoY29uc3Qgc2ltU291cmNlIG9mIHNpbXVsYXRpb25DdXJyZW50U291cmNlcykge1xuICAgIGlmIChzaW1Tb3VyY2UudHlwZSAhPT0gXCJzaW11bGF0aW9uX2N1cnJlbnRfc291cmNlXCIpIGNvbnRpbnVlXG5cbiAgICBpZiAoc2ltU291cmNlLmlzX2RjX3NvdXJjZSA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIEFDL1BVTFNFIFNvdXJjZVxuICAgICAgY29uc3QgcG9zaXRpdmVQb3J0SWQgPSBzaW1Tb3VyY2UudGVybWluYWwxX3NvdXJjZV9wb3J0X2lkXG4gICAgICBjb25zdCBuZWdhdGl2ZVBvcnRJZCA9IHNpbVNvdXJjZS50ZXJtaW5hbDJfc291cmNlX3BvcnRfaWRcblxuICAgICAgaWYgKHBvc2l0aXZlUG9ydElkICYmIG5lZ2F0aXZlUG9ydElkKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aXZlTm9kZSA9IG5vZGVNYXAuZ2V0KHBvc2l0aXZlUG9ydElkKSB8fCBcIjBcIlxuICAgICAgICBjb25zdCBuZWdhdGl2ZU5vZGUgPSBub2RlTWFwLmdldChuZWdhdGl2ZVBvcnRJZCkgfHwgXCIwXCJcblxuICAgICAgICBsZXQgdmFsdWUgPSBcIlwiXG4gICAgICAgIGNvbnN0IHdhdmVfc2hhcGUgPSBzaW1Tb3VyY2Uud2F2ZV9zaGFwZVxuICAgICAgICBpZiAod2F2ZV9zaGFwZSA9PT0gXCJzaW5ld2F2ZVwiKSB7XG4gICAgICAgICAgY29uc3QgaV9vZmZzZXQgPSAwIC8vIG5vdCBwcm92aWRlZFxuICAgICAgICAgIGNvbnN0IGlfcGVhayA9IChzaW1Tb3VyY2UucGVha190b19wZWFrX2N1cnJlbnQgPz8gMCkgLyAyXG4gICAgICAgICAgY29uc3QgZnJlcSA9IHNpbVNvdXJjZS5mcmVxdWVuY3kgPz8gMFxuICAgICAgICAgIGNvbnN0IGRlbGF5ID0gMFxuICAgICAgICAgIGNvbnN0IGRhbXBpbmdfZmFjdG9yID0gMFxuICAgICAgICAgIGNvbnN0IHBoYXNlID0gc2ltU291cmNlLnBoYXNlID8/IDBcbiAgICAgICAgICBpZiAoZnJlcSA+IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gYFNJTigke2lfb2Zmc2V0fSAke2lfcGVha30gJHtmcmVxfSAke2RlbGF5fSAke2RhbXBpbmdfZmFjdG9yfSAke3BoYXNlfSlgXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gYERDICR7aV9wZWFrfWBcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2F2ZV9zaGFwZSA9PT0gXCJzcXVhcmVcIikge1xuICAgICAgICAgIGNvbnN0IGlfaW5pdGlhbCA9IDBcbiAgICAgICAgICBjb25zdCBpX3B1bHNlZCA9IHNpbVNvdXJjZS5wZWFrX3RvX3BlYWtfY3VycmVudCA/PyAwXG4gICAgICAgICAgY29uc3QgZnJlcSA9IHNpbVNvdXJjZS5mcmVxdWVuY3kgPz8gMFxuICAgICAgICAgIGNvbnN0IHBlcmlvZF9mcm9tX2ZyZXEgPSBmcmVxID09PSAwID8gSW5maW5pdHkgOiAxIC8gZnJlcVxuICAgICAgICAgIGNvbnN0IHBlcmlvZCA9IHBlcmlvZF9mcm9tX2ZyZXFcbiAgICAgICAgICBjb25zdCBkdXR5X2N5Y2xlID0gc2ltU291cmNlLmR1dHlfY3ljbGUgPz8gMC41XG4gICAgICAgICAgY29uc3QgcHVsc2Vfd2lkdGggPSBwZXJpb2QgKiBkdXR5X2N5Y2xlXG4gICAgICAgICAgY29uc3QgZGVsYXkgPSAwXG4gICAgICAgICAgY29uc3QgcmlzZV90aW1lID0gXCIxblwiXG4gICAgICAgICAgY29uc3QgZmFsbF90aW1lID0gXCIxblwiXG4gICAgICAgICAgdmFsdWUgPSBgUFVMU0UoJHtpX2luaXRpYWx9ICR7aV9wdWxzZWR9ICR7ZGVsYXl9ICR7cmlzZV90aW1lfSAke2ZhbGxfdGltZX0gJHtwdWxzZV93aWR0aH0gJHtwZXJpb2R9KWBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRTb3VyY2VDbWQgPSBuZXcgQ3VycmVudFNvdXJjZUNvbW1hbmQoe1xuICAgICAgICAgICAgbmFtZTogc2ltU291cmNlLnNpbXVsYXRpb25fY3VycmVudF9zb3VyY2VfaWQsXG4gICAgICAgICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICAgICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgY29uc3Qgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICAgICAgICBzaW1Tb3VyY2Uuc2ltdWxhdGlvbl9jdXJyZW50X3NvdXJjZV9pZCxcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2VDbWQsXG4gICAgICAgICAgICBbcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGVdLFxuICAgICAgICAgIClcbiAgICAgICAgICBuZXRsaXN0LmFkZENvbXBvbmVudChzcGljZUNvbXBvbmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEQyBTb3VyY2VcbiAgICAgIGNvbnN0IHBvc2l0aXZlUG9ydElkID0gc2ltU291cmNlLnBvc2l0aXZlX3NvdXJjZV9wb3J0X2lkXG4gICAgICBjb25zdCBuZWdhdGl2ZVBvcnRJZCA9IHNpbVNvdXJjZS5uZWdhdGl2ZV9zb3VyY2VfcG9ydF9pZFxuXG4gICAgICBpZiAoXG4gICAgICAgIHBvc2l0aXZlUG9ydElkICYmXG4gICAgICAgIG5lZ2F0aXZlUG9ydElkICYmXG4gICAgICAgIFwiY3VycmVudFwiIGluIHNpbVNvdXJjZSAmJlxuICAgICAgICBzaW1Tb3VyY2UuY3VycmVudCAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcG9zaXRpdmVOb2RlID0gbm9kZU1hcC5nZXQocG9zaXRpdmVQb3J0SWQpIHx8IFwiMFwiXG4gICAgICAgIGNvbnN0IG5lZ2F0aXZlTm9kZSA9IG5vZGVNYXAuZ2V0KG5lZ2F0aXZlUG9ydElkKSB8fCBcIjBcIlxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTb3VyY2VDbWQgPSBuZXcgQ3VycmVudFNvdXJjZUNvbW1hbmQoe1xuICAgICAgICAgIG5hbWU6IHNpbVNvdXJjZS5zaW11bGF0aW9uX2N1cnJlbnRfc291cmNlX2lkLFxuICAgICAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICAgICAgdmFsdWU6IGBEQyAke3NpbVNvdXJjZS5jdXJyZW50fWAsXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3Qgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICAgICAgc2ltU291cmNlLnNpbXVsYXRpb25fY3VycmVudF9zb3VyY2VfaWQsXG4gICAgICAgICAgY3VycmVudFNvdXJjZUNtZCxcbiAgICAgICAgICBbcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGVdLFxuICAgICAgICApXG4gICAgICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KHNwaWNlQ29tcG9uZW50KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHtcbiAgU2ltdWxhdGlvbkN1cnJlbnRQcm9iZSxcbiAgU2ltdWxhdGlvbkV4cGVyaW1lbnQsXG4gIFNpbXVsYXRpb25Wb2x0YWdlUHJvYmUsXG4gIFNvdXJjZVRyYWNlLFxufSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBWb2x0YWdlU291cmNlQ29tbWFuZCB9IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuaW1wb3J0IHsgZm9ybWF0TnVtYmVyRm9yU3BpY2UsIHNhbml0aXplSWRlbnRpZmllciB9IGZyb20gXCIuL2hlbHBlcnNcIlxuXG5jb25zdCBzcGljZU9wdGlvbk9yZGVyID0gW1wibWV0aG9kXCIsIFwicmVsdG9sXCIsIFwiYWJzdG9sXCIsIFwidm50b2xcIl0gYXMgY29uc3RcblxuaW50ZXJmYWNlIFZvbHRhZ2VQcm9iZVZlY3Rvck1hcHBpbmcge1xuICBzaW11bGF0aW9uX3ZvbHRhZ2VfcHJvYmVfaWQ6IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nXG4gIHNwaWNlX3ZlY3Rvcjogc3RyaW5nXG4gIHNvdXJjZV9ub2RlX25hbWU6IHN0cmluZ1xuICByZWZlcmVuY2Vfbm9kZV9uYW1lPzogc3RyaW5nXG59XG5cbmludGVyZmFjZSBDdXJyZW50UHJvYmVWZWN0b3JNYXBwaW5nIHtcbiAgc2ltdWxhdGlvbl9jdXJyZW50X3Byb2JlX2lkOiBzdHJpbmdcbiAgbmFtZT86IHN0cmluZ1xuICBzcGljZV92ZWN0b3I6IHN0cmluZ1xuICBzZW5zZV92b2x0YWdlX3NvdXJjZV9uYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVfbm9kZV9uYW1lOiBzdHJpbmdcbiAgbmVnYXRpdmVfbm9kZV9uYW1lOiBzdHJpbmdcbn1cblxuY29uc3QgZ2V0UG9ydElkRnJvbU5ldElkID0gKHNvdXJjZVRyYWNlczogU291cmNlVHJhY2VbXSwgbmV0SWQ6IHN0cmluZykgPT4ge1xuICBjb25zdCB0cmFjZSA9IHNvdXJjZVRyYWNlcy5maW5kKCh0KSA9PlxuICAgIHQuY29ubmVjdGVkX3NvdXJjZV9uZXRfaWRzLmluY2x1ZGVzKG5ldElkKSxcbiAgKVxuICByZXR1cm4gdHJhY2U/LmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHNbMF1cbn1cblxuY29uc3QgcmVzb2x2ZU5vZGVOYW1lRnJvbVNvdXJjZVBvcnRPck5ldCA9ICh7XG4gIHNvdXJjZVBvcnRJZCxcbiAgc291cmNlTmV0SWQsXG4gIHNvdXJjZVRyYWNlcyxcbiAgbm9kZU1hcCxcbn06IHtcbiAgc291cmNlUG9ydElkPzogc3RyaW5nXG4gIHNvdXJjZU5ldElkPzogc3RyaW5nXG4gIHNvdXJjZVRyYWNlczogU291cmNlVHJhY2VbXVxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG59KSA9PiB7XG4gIGlmIChzb3VyY2VQb3J0SWQpIHtcbiAgICByZXR1cm4gbm9kZU1hcC5nZXQoc291cmNlUG9ydElkKVxuICB9XG5cbiAgaWYgKCFzb3VyY2VOZXRJZCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IHNvdXJjZVBvcnRJZEZyb21OZXQgPSBnZXRQb3J0SWRGcm9tTmV0SWQoc291cmNlVHJhY2VzLCBzb3VyY2VOZXRJZClcbiAgaWYgKCFzb3VyY2VQb3J0SWRGcm9tTmV0KSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIG5vZGVNYXAuZ2V0KHNvdXJjZVBvcnRJZEZyb21OZXQpXG59XG5cbmNvbnN0IGdldFNlbnNlVm9sdGFnZVNvdXJjZU5hbWUgPSAocHJvYmU6IFNpbXVsYXRpb25DdXJyZW50UHJvYmUpID0+XG4gIHNhbml0aXplSWRlbnRpZmllcihcbiAgICBgc2Vuc2VfJHtwcm9iZS5zaW11bGF0aW9uX2N1cnJlbnRfcHJvYmVfaWR9YCxcbiAgICBcInNlbnNlX2N1cnJlbnRfcHJvYmVcIixcbiAgKVxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc1NpbXVsYXRpb25FeHBlcmltZW50ID0gKFxuICBuZXRsaXN0OiBTcGljZU5ldGxpc3QsXG4gIHNpbUV4cGVyaW1lbnQ6IFNpbXVsYXRpb25FeHBlcmltZW50LFxuICBzaW11bGF0aW9uUHJvYmVzOiBTaW11bGF0aW9uVm9sdGFnZVByb2JlW10sXG4gIHNpbXVsYXRpb25DdXJyZW50UHJvYmVzOiBTaW11bGF0aW9uQ3VycmVudFByb2JlW10sXG4gIHNvdXJjZVRyYWNlczogU291cmNlVHJhY2VbXSxcbiAgbm9kZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPixcbikgPT4ge1xuICBpZiAoIXNpbUV4cGVyaW1lbnQpIHJldHVyblxuXG4gIGNvbnN0IGlzVHJhbnNpZW50RXhwZXJpbWVudCA9XG4gICAgc2ltRXhwZXJpbWVudC5leHBlcmltZW50X3R5cGU/LmluY2x1ZGVzKFwidHJhbnNpZW50XCIpID8/IGZhbHNlXG4gIGNvbnN0IHRyYW5zaWVudFByb2JlVmVjdG9ycyA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgY29uc3Qgc3BpY2VPcHRpb25zID0gc2ltRXhwZXJpbWVudC5zcGljZV9vcHRpb25zXG4gIGlmIChzcGljZU9wdGlvbnMpIHtcbiAgICBjb25zdCBvcHRpb25QYXJ0cyA9IHNwaWNlT3B0aW9uT3JkZXJcbiAgICAgIC5tYXAoKGtleSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHNwaWNlT3B0aW9uc1trZXldXG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGAke2tleX09JHt2YWx1ZX1gXG4gICAgICB9KVxuICAgICAgLmZpbHRlcigocGFydCk6IHBhcnQgaXMgc3RyaW5nID0+IHBhcnQgIT09IG51bGwpXG5cbiAgICBpZiAob3B0aW9uUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgbmV0bGlzdC5vcHRpb25TdGF0ZW1lbnRzLnB1c2goYC5vcHRpb25zICR7b3B0aW9uUGFydHMuam9pbihcIiBcIil9YClcbiAgICB9XG4gIH1cblxuICAvLyBQcm9jZXNzIHNpbXVsYXRpb24gdm9sdGFnZSBwcm9iZXNcbiAgaWYgKHNpbXVsYXRpb25Qcm9iZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHByb2JlVmVjdG9yTWFwcGluZ3M6IFZvbHRhZ2VQcm9iZVZlY3Rvck1hcHBpbmdbXSA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHByb2JlIG9mIHNpbXVsYXRpb25Qcm9iZXMpIHtcbiAgICAgIGNvbnN0IHNpZ25hbE5vZGVOYW1lID0gcmVzb2x2ZU5vZGVOYW1lRnJvbVNvdXJjZVBvcnRPck5ldCh7XG4gICAgICAgIHNvdXJjZVBvcnRJZDogcHJvYmUuc2lnbmFsX2lucHV0X3NvdXJjZV9wb3J0X2lkLFxuICAgICAgICBzb3VyY2VOZXRJZDogcHJvYmUuc2lnbmFsX2lucHV0X3NvdXJjZV9uZXRfaWQsXG4gICAgICAgIHNvdXJjZVRyYWNlcyxcbiAgICAgICAgbm9kZU1hcCxcbiAgICAgIH0pXG4gICAgICBpZiAoIXNpZ25hbE5vZGVOYW1lKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBoYXNSZWZlcmVuY2UgPVxuICAgICAgICBwcm9iZS5yZWZlcmVuY2VfaW5wdXRfc291cmNlX3BvcnRfaWQgfHxcbiAgICAgICAgcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9uZXRfaWRcblxuICAgICAgaWYgKGhhc1JlZmVyZW5jZSkge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VOb2RlTmFtZSA9IHJlc29sdmVOb2RlTmFtZUZyb21Tb3VyY2VQb3J0T3JOZXQoe1xuICAgICAgICAgIHNvdXJjZVBvcnRJZDogcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9wb3J0X2lkLFxuICAgICAgICAgIHNvdXJjZU5ldElkOiBwcm9iZS5yZWZlcmVuY2VfaW5wdXRfc291cmNlX25ldF9pZCxcbiAgICAgICAgICBzb3VyY2VUcmFjZXMsXG4gICAgICAgICAgbm9kZU1hcCxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHJlZmVyZW5jZU5vZGVOYW1lICYmIHJlZmVyZW5jZU5vZGVOYW1lICE9PSBcIjBcIikge1xuICAgICAgICAgIGNvbnN0IHNwaWNlVmVjdG9yID0gYFYoJHtzaWduYWxOb2RlTmFtZX0sJHtyZWZlcmVuY2VOb2RlTmFtZX0pYFxuICAgICAgICAgIHRyYW5zaWVudFByb2JlVmVjdG9ycy5hZGQoc3BpY2VWZWN0b3IpXG4gICAgICAgICAgcHJvYmVWZWN0b3JNYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIHNpbXVsYXRpb25fdm9sdGFnZV9wcm9iZV9pZDogcHJvYmUuc2ltdWxhdGlvbl92b2x0YWdlX3Byb2JlX2lkLFxuICAgICAgICAgICAgbmFtZTogcHJvYmUubmFtZSxcbiAgICAgICAgICAgIHNwaWNlX3ZlY3Rvcjogc3BpY2VWZWN0b3IsXG4gICAgICAgICAgICBzb3VyY2Vfbm9kZV9uYW1lOiBzaWduYWxOb2RlTmFtZSxcbiAgICAgICAgICAgIHJlZmVyZW5jZV9ub2RlX25hbWU6IHJlZmVyZW5jZU5vZGVOYW1lLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAoc2lnbmFsTm9kZU5hbWUgIT09IFwiMFwiKSB7XG4gICAgICAgICAgY29uc3Qgc3BpY2VWZWN0b3IgPSBgVigke3NpZ25hbE5vZGVOYW1lfSlgXG4gICAgICAgICAgdHJhbnNpZW50UHJvYmVWZWN0b3JzLmFkZChzcGljZVZlY3RvcilcbiAgICAgICAgICBwcm9iZVZlY3Rvck1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgc2ltdWxhdGlvbl92b2x0YWdlX3Byb2JlX2lkOiBwcm9iZS5zaW11bGF0aW9uX3ZvbHRhZ2VfcHJvYmVfaWQsXG4gICAgICAgICAgICBuYW1lOiBwcm9iZS5uYW1lLFxuICAgICAgICAgICAgc3BpY2VfdmVjdG9yOiBzcGljZVZlY3RvcixcbiAgICAgICAgICAgIHNvdXJjZV9ub2RlX25hbWU6IHNpZ25hbE5vZGVOYW1lLFxuICAgICAgICAgICAgcmVmZXJlbmNlX25vZGVfbmFtZTogcmVmZXJlbmNlTm9kZU5hbWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2luZ2xlLWVuZGVkIHByb2JlXG4gICAgICAgIGlmIChzaWduYWxOb2RlTmFtZSAhPT0gXCIwXCIpIHtcbiAgICAgICAgICBjb25zdCBzcGljZVZlY3RvciA9IGBWKCR7c2lnbmFsTm9kZU5hbWV9KWBcbiAgICAgICAgICB0cmFuc2llbnRQcm9iZVZlY3RvcnMuYWRkKHNwaWNlVmVjdG9yKVxuICAgICAgICAgIHByb2JlVmVjdG9yTWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBzaW11bGF0aW9uX3ZvbHRhZ2VfcHJvYmVfaWQ6IHByb2JlLnNpbXVsYXRpb25fdm9sdGFnZV9wcm9iZV9pZCxcbiAgICAgICAgICAgIG5hbWU6IHByb2JlLm5hbWUsXG4gICAgICAgICAgICBzcGljZV92ZWN0b3I6IHNwaWNlVmVjdG9yLFxuICAgICAgICAgICAgc291cmNlX25vZGVfbmFtZTogc2lnbmFsTm9kZU5hbWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9iZVZlY3Rvck1hcHBpbmdzLmxlbmd0aCA+IDAgJiYgaXNUcmFuc2llbnRFeHBlcmltZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IG1hcHBpbmcgb2YgcHJvYmVWZWN0b3JNYXBwaW5ncykge1xuICAgICAgICBuZXRsaXN0Lm1ldGFkYXRhQ29tbWVudHMucHVzaChcbiAgICAgICAgICBgKiB0c2NpcmN1aXRfcHJvYmUgJHtKU09OLnN0cmluZ2lmeShtYXBwaW5nKX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ3VycmVudCBwcm9iZXMgYXJlIGlubGluZSBhbW1ldGVyIGVsZW1lbnRzLCBzbyB0aGUgMFYgc2Vuc2Ugc291cmNlIGlzIHBhcnRcbiAgLy8gb2YgdGhlIHNpbXVsYXRlZCB0b3BvbG9neSBldmVuIHdoZW4gdGhlIGV4cGVyaW1lbnQgZG9lcyBub3QgcHJpbnQgY3VycmVudC5cbiAgaWYgKHNpbXVsYXRpb25DdXJyZW50UHJvYmVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBzZW5zZVZvbHRhZ2VTb3VyY2VOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgY29uc3QgY3VycmVudFByb2JlVmVjdG9yTWFwcGluZ3M6IEN1cnJlbnRQcm9iZVZlY3Rvck1hcHBpbmdbXSA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHByb2JlIG9mIHNpbXVsYXRpb25DdXJyZW50UHJvYmVzKSB7XG4gICAgICBjb25zdCBwb3NpdGl2ZU5vZGVOYW1lID0gcmVzb2x2ZU5vZGVOYW1lRnJvbVNvdXJjZVBvcnRPck5ldCh7XG4gICAgICAgIHNvdXJjZVBvcnRJZDogcHJvYmUucG9zaXRpdmVfc291cmNlX3BvcnRfaWQsXG4gICAgICAgIHNvdXJjZU5ldElkOiBwcm9iZS5wb3NpdGl2ZV9zb3VyY2VfbmV0X2lkLFxuICAgICAgICBzb3VyY2VUcmFjZXMsXG4gICAgICAgIG5vZGVNYXAsXG4gICAgICB9KVxuICAgICAgY29uc3QgbmVnYXRpdmVOb2RlTmFtZSA9IHJlc29sdmVOb2RlTmFtZUZyb21Tb3VyY2VQb3J0T3JOZXQoe1xuICAgICAgICBzb3VyY2VQb3J0SWQ6IHByb2JlLm5lZ2F0aXZlX3NvdXJjZV9wb3J0X2lkLFxuICAgICAgICBzb3VyY2VOZXRJZDogcHJvYmUubmVnYXRpdmVfc291cmNlX25ldF9pZCxcbiAgICAgICAgc291cmNlVHJhY2VzLFxuICAgICAgICBub2RlTWFwLFxuICAgICAgfSlcblxuICAgICAgaWYgKCFwb3NpdGl2ZU5vZGVOYW1lIHx8ICFuZWdhdGl2ZU5vZGVOYW1lKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBzZW5zZVZvbHRhZ2VTb3VyY2VCYXNlTmFtZSA9IGdldFNlbnNlVm9sdGFnZVNvdXJjZU5hbWUocHJvYmUpXG4gICAgICBsZXQgc2Vuc2VWb2x0YWdlU291cmNlTmFtZSA9IHNlbnNlVm9sdGFnZVNvdXJjZUJhc2VOYW1lXG4gICAgICBsZXQgZHVwbGljYXRlSW5kZXggPSAyXG4gICAgICB3aGlsZSAoc2Vuc2VWb2x0YWdlU291cmNlTmFtZXMuaGFzKHNlbnNlVm9sdGFnZVNvdXJjZU5hbWUpKSB7XG4gICAgICAgIHNlbnNlVm9sdGFnZVNvdXJjZU5hbWUgPSBgJHtzZW5zZVZvbHRhZ2VTb3VyY2VCYXNlTmFtZX1fJHtkdXBsaWNhdGVJbmRleCsrfWBcbiAgICAgIH1cbiAgICAgIHNlbnNlVm9sdGFnZVNvdXJjZU5hbWVzLmFkZChzZW5zZVZvbHRhZ2VTb3VyY2VOYW1lKVxuXG4gICAgICBjb25zdCBzcGljZVNlbnNlVm9sdGFnZVNvdXJjZU5hbWUgPSBgViR7c2Vuc2VWb2x0YWdlU291cmNlTmFtZX1gXG4gICAgICBjb25zdCBzcGljZVZlY3RvciA9IGBJKCR7c3BpY2VTZW5zZVZvbHRhZ2VTb3VyY2VOYW1lfSlgXG4gICAgICBjb25zdCB2b2x0YWdlU291cmNlQ21kID0gbmV3IFZvbHRhZ2VTb3VyY2VDb21tYW5kKHtcbiAgICAgICAgbmFtZTogc2Vuc2VWb2x0YWdlU291cmNlTmFtZSxcbiAgICAgICAgcG9zaXRpdmVOb2RlOiBwb3NpdGl2ZU5vZGVOYW1lLFxuICAgICAgICBuZWdhdGl2ZU5vZGU6IG5lZ2F0aXZlTm9kZU5hbWUsXG4gICAgICAgIHZhbHVlOiBcIkRDIDBcIixcbiAgICAgIH0pXG5cbiAgICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KFxuICAgICAgICBuZXcgU3BpY2VDb21wb25lbnQoc2Vuc2VWb2x0YWdlU291cmNlTmFtZSwgdm9sdGFnZVNvdXJjZUNtZCwgW1xuICAgICAgICAgIHBvc2l0aXZlTm9kZU5hbWUsXG4gICAgICAgICAgbmVnYXRpdmVOb2RlTmFtZSxcbiAgICAgICAgXSksXG4gICAgICApXG5cbiAgICAgIGlmIChpc1RyYW5zaWVudEV4cGVyaW1lbnQpIHtcbiAgICAgICAgdHJhbnNpZW50UHJvYmVWZWN0b3JzLmFkZChzcGljZVZlY3RvcilcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQcm9iZVZlY3Rvck1hcHBpbmdzLnB1c2goe1xuICAgICAgICBzaW11bGF0aW9uX2N1cnJlbnRfcHJvYmVfaWQ6IHByb2JlLnNpbXVsYXRpb25fY3VycmVudF9wcm9iZV9pZCxcbiAgICAgICAgbmFtZTogcHJvYmUubmFtZSxcbiAgICAgICAgc3BpY2VfdmVjdG9yOiBzcGljZVZlY3RvcixcbiAgICAgICAgc2Vuc2Vfdm9sdGFnZV9zb3VyY2VfbmFtZTogc3BpY2VTZW5zZVZvbHRhZ2VTb3VyY2VOYW1lLFxuICAgICAgICBwb3NpdGl2ZV9ub2RlX25hbWU6IHBvc2l0aXZlTm9kZU5hbWUsXG4gICAgICAgIG5lZ2F0aXZlX25vZGVfbmFtZTogbmVnYXRpdmVOb2RlTmFtZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRQcm9iZVZlY3Rvck1hcHBpbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgbWFwcGluZyBvZiBjdXJyZW50UHJvYmVWZWN0b3JNYXBwaW5ncykge1xuICAgICAgICBuZXRsaXN0Lm1ldGFkYXRhQ29tbWVudHMucHVzaChcbiAgICAgICAgICBgKiB0c2NpcmN1aXRfY3VycmVudF9wcm9iZSAke0pTT04uc3RyaW5naWZ5KG1hcHBpbmcpfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAodHJhbnNpZW50UHJvYmVWZWN0b3JzLnNpemUgPiAwICYmIGlzVHJhbnNpZW50RXhwZXJpbWVudCkge1xuICAgIGNvbnN0IHByb2JlVmVjdG9ycyA9IFsuLi50cmFuc2llbnRQcm9iZVZlY3RvcnNdLmpvaW4oXCIgXCIpXG4gICAgbmV0bGlzdC5wcmludFN0YXRlbWVudHMucHVzaChgLlBSSU5UIFRSQU4gJHtwcm9iZVZlY3RvcnN9YClcbiAgICBuZXRsaXN0LnNhdmVTdGF0ZW1lbnRzLnB1c2goYC5TQVZFICR7cHJvYmVWZWN0b3JzfWApXG4gIH1cblxuICBjb25zdCB0aW1lUGVyU3RlcCA9IHNpbUV4cGVyaW1lbnQudGltZV9wZXJfc3RlcFxuICBjb25zdCBlbmRUaW1lID0gc2ltRXhwZXJpbWVudC5lbmRfdGltZV9tc1xuICBjb25zdCBzdGFydFRpbWVNcyA9IHNpbUV4cGVyaW1lbnQuc3RhcnRfdGltZV9tc1xuXG4gIGlmICh0aW1lUGVyU3RlcCAmJiBlbmRUaW1lKSB7XG4gICAgLy8gY2lyY3VpdC1qc29uIHZhbHVlcyBhcmUgaW4gbXMsIFNQSUNFIHJlcXVpcmVzIHNlY29uZHNcbiAgICBjb25zdCBzdGFydFRpbWUgPSAoc3RhcnRUaW1lTXMgPz8gMCkgLyAxMDAwXG5cbiAgICBsZXQgdHJhbkNtZCA9IGAudHJhbiAke2Zvcm1hdE51bWJlckZvclNwaWNlKFxuICAgICAgdGltZVBlclN0ZXAgLyAxMDAwLFxuICAgICl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoZW5kVGltZSAvIDEwMDApfWBcbiAgICBpZiAoc3RhcnRUaW1lID4gMCkge1xuICAgICAgdHJhbkNtZCArPSBgICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2Uoc3RhcnRUaW1lKX1gXG4gICAgfVxuICAgIHRyYW5DbWQgKz0gXCIgVUlDXCJcbiAgICBuZXRsaXN0LnRyYW5Db21tYW5kID0gdHJhbkNtZFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTaW11bGF0aW9uT3BBbXAgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBTdWJjaXJjdWl0Q2FsbENvbW1hbmQgfSBmcm9tIFwibGliL3NwaWNlLWNvbW1hbmRzXCJcblxuY29uc3QgT1BBTVBfU1VCQ0lSQ1VJVF9OQU1FID0gXCJHRU5FUklDX09QQU1QXCJcbmNvbnN0IE9QQU1QX1NVQkNJUkNVSVRfREVGSU5JVElPTiA9IGBcbi5TVUJDS1QgJHtPUEFNUF9TVUJDSVJDVUlUX05BTUV9IG5vbl9pbnZlcnRpbmdfaW5wdXQgaW52ZXJ0aW5nX2lucHV0IHBvc2l0aXZlX3N1cHBseSBuZWdhdGl2ZV9zdXBwbHkgb3V0cHV0XG4qIEdlbmVyaWMgT3AtQW1wIE1vZGVsXG5FMSBpbnRlcm5hbF9vdXRwdXQgMCBub25faW52ZXJ0aW5nX2lucHV0IGludmVydGluZ19pbnB1dCAxMDBrXG5SaW4gbm9uX2ludmVydGluZ19pbnB1dCBpbnZlcnRpbmdfaW5wdXQgMTBNZWdcblJvdXQgaW50ZXJuYWxfb3V0cHV0IG91dHB1dCA3NVxuRDEgb3V0cHV0IHBvc2l0aXZlX3N1cHBseSBvcGFtcF9kaW9kZVxuRDIgbmVnYXRpdmVfc3VwcGx5IG91dHB1dCBvcGFtcF9kaW9kZVxuLm1vZGVsIG9wYW1wX2Rpb2RlIERcbi5FTkRTICR7T1BBTVBfU1VCQ0lSQ1VJVF9OQU1FfVxuYC50cmltKClcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW11bGF0aW9uT3BBbXBzID0gKFxuICBuZXRsaXN0OiBTcGljZU5ldGxpc3QsXG4gIHNpbXVsYXRpb25PcEFtcHM6IFNpbXVsYXRpb25PcEFtcFtdLFxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKSA9PiB7XG4gIGlmIChzaW11bGF0aW9uT3BBbXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgaWYgKCFuZXRsaXN0Lm1vZGVscy5oYXMoT1BBTVBfU1VCQ0lSQ1VJVF9OQU1FKSkge1xuICAgIG5ldGxpc3QubW9kZWxzLnNldChPUEFNUF9TVUJDSVJDVUlUX05BTUUsIE9QQU1QX1NVQkNJUkNVSVRfREVGSU5JVElPTilcbiAgfVxuXG4gIGZvciAoY29uc3Qgc2ltT3BBbXAgb2Ygc2ltdWxhdGlvbk9wQW1wcykge1xuICAgIGlmIChzaW1PcEFtcC50eXBlICE9PSBcInNpbXVsYXRpb25fb3BfYW1wXCIpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBub25JbnZlcnRpbmdJbnB1dE5vZGUgPVxuICAgICAgbm9kZU1hcC5nZXQoc2ltT3BBbXAubm9uX2ludmVydGluZ19pbnB1dF9zb3VyY2VfcG9ydF9pZCkgPz8gXCIwXCJcbiAgICBjb25zdCBpbnZlcnRpbmdJbnB1dE5vZGUgPVxuICAgICAgbm9kZU1hcC5nZXQoc2ltT3BBbXAuaW52ZXJ0aW5nX2lucHV0X3NvdXJjZV9wb3J0X2lkKSA/PyBcIjBcIlxuICAgIGNvbnN0IG91dHB1dE5vZGUgPSBub2RlTWFwLmdldChzaW1PcEFtcC5vdXRwdXRfc291cmNlX3BvcnRfaWQpID8/IFwiMFwiXG4gICAgY29uc3QgcG9zaXRpdmVTdXBwbHlOb2RlID1cbiAgICAgIG5vZGVNYXAuZ2V0KHNpbU9wQW1wLnBvc2l0aXZlX3N1cHBseV9zb3VyY2VfcG9ydF9pZCkgPz8gXCIwXCJcbiAgICBjb25zdCBuZWdhdGl2ZVN1cHBseU5vZGUgPVxuICAgICAgbm9kZU1hcC5nZXQoc2ltT3BBbXAubmVnYXRpdmVfc3VwcGx5X3NvdXJjZV9wb3J0X2lkKSA/PyBcIjBcIlxuXG4gICAgY29uc3Qgbm9kZXMgPSBbXG4gICAgICBub25JbnZlcnRpbmdJbnB1dE5vZGUsXG4gICAgICBpbnZlcnRpbmdJbnB1dE5vZGUsXG4gICAgICBwb3NpdGl2ZVN1cHBseU5vZGUsXG4gICAgICBuZWdhdGl2ZVN1cHBseU5vZGUsXG4gICAgICBvdXRwdXROb2RlLFxuICAgIF1cblxuICAgIGNvbnN0IG9wQW1wQ21kID0gbmV3IFN1YmNpcmN1aXRDYWxsQ29tbWFuZCh7XG4gICAgICBuYW1lOiBzaW1PcEFtcC5zaW11bGF0aW9uX29wX2FtcF9pZCxcbiAgICAgIG5vZGVzLFxuICAgICAgc3ViY2lyY3VpdE5hbWU6IE9QQU1QX1NVQkNJUkNVSVRfTkFNRSxcbiAgICB9KVxuXG4gICAgY29uc3Qgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICBzaW1PcEFtcC5zaW11bGF0aW9uX29wX2FtcF9pZCxcbiAgICAgIG9wQW1wQ21kLFxuICAgICAgbm9kZXMsXG4gICAgKVxuICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KHNwaWNlQ29tcG9uZW50KVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgdHlwZSB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3RcIlxuaW1wb3J0IHsgU3ViY2lyY3VpdENhbGxDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNwaWNlU3ViY2t0KFxuICBzb3VyY2U6IHN0cmluZyxcbik6IHsgbW9kZWxOYW1lOiBzdHJpbmc7IHBpbk5hbWVzOiBzdHJpbmdbXSB9IHwgbnVsbCB7XG4gIGNvbnN0IGxvZ2ljYWxMaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIGZvciAoY29uc3QgcGh5c2ljYWxMaW5lIG9mIHNvdXJjZS5zcGxpdCgvXFxyP1xcbi8pKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBwaHlzaWNhbExpbmUudHJpbSgpXG5cbiAgICBpZiAoL15cXCsvLnRlc3QodHJpbW1lZExpbmUpICYmIGxvZ2ljYWxMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dpY2FsTGluZXNbbG9naWNhbExpbmVzLmxlbmd0aCAtIDFdICs9IGAgJHt0cmltbWVkTGluZS5zbGljZSgxKS50cmltKCl9YFxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBsb2dpY2FsTGluZXMucHVzaCh0cmltbWVkTGluZSlcbiAgfVxuXG4gIGNvbnN0IGxpbmUgPSBsb2dpY2FsTGluZXMuZmluZCgobGluZSkgPT4gL15cXC5zdWJja3RcXHMrL2kudGVzdChsaW5lKSlcblxuICBpZiAoIWxpbmUpIHJldHVybiBudWxsXG5cbiAgY29uc3QgdG9rZW5zID0gbGluZS5zcGxpdCgvXFxzKy8pXG4gIGNvbnN0IG1vZGVsTmFtZSA9IHRva2Vuc1sxXVxuICBjb25zdCBwaW5OYW1lcyA9IHRva2Vucy5zbGljZSgyKVxuXG4gIGlmICghbW9kZWxOYW1lIHx8IHBpbk5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGxcbiAgcmV0dXJuIHsgbW9kZWxOYW1lLCBwaW5OYW1lcyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzU2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdHMoXG4gIG5ldGxpc3Q6IFNwaWNlTmV0bGlzdCxcbiAgc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdHM6IFNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXRbXSxcbiAgbm9kZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPixcbikge1xuICBpZiAoc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdHMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBmb3IgKGNvbnN0IHNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXQgb2Ygc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdHMpIHtcbiAgICBjb25zdCBwYXJzZWRTdWJja3QgPSBwYXJzZVNwaWNlU3ViY2t0KFxuICAgICAgc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdC5zdWJjaXJjdWl0X3NvdXJjZSxcbiAgICApXG5cbiAgICBpZiAoIXBhcnNlZFN1YmNrdCkgY29udGludWVcblxuICAgIGNvbnN0IHsgbW9kZWxOYW1lLCBwaW5OYW1lcyB9ID0gcGFyc2VkU3ViY2t0XG5cbiAgICBpZiAoIW5ldGxpc3QubW9kZWxzLmhhcyhtb2RlbE5hbWUpKSB7XG4gICAgICBuZXRsaXN0Lm1vZGVscy5zZXQobW9kZWxOYW1lLCBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0LnN1YmNpcmN1aXRfc291cmNlKVxuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzID0gcGluTmFtZXMubWFwKChzcGljZVBpbk5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZVBvcnRJZCA9XG4gICAgICAgIHNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXQuc3BpY2VfcGluX3RvX3NvdXJjZV9wb3J0X21hcFtzcGljZVBpbk5hbWVdXG4gICAgICByZXR1cm4gbm9kZU1hcC5nZXQoc291cmNlUG9ydElkKSA/PyBcIjBcIlxuICAgIH0pXG5cbiAgICBjb25zdCBzdWJjaXJjdWl0Q2FsbENvbW1hbmQgPSBuZXcgU3ViY2lyY3VpdENhbGxDb21tYW5kKHtcbiAgICAgIG5hbWU6IHNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXQuc2ltdWxhdGlvbl9zcGljZV9zdWJjaXJjdWl0X2lkLFxuICAgICAgbm9kZXMsXG4gICAgICBzdWJjaXJjdWl0TmFtZTogbW9kZWxOYW1lLFxuICAgIH0pXG5cbiAgICBuZXRsaXN0LmFkZENvbXBvbmVudChcbiAgICAgIG5ldyBTcGljZUNvbXBvbmVudChcbiAgICAgICAgc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdC5zaW11bGF0aW9uX3NwaWNlX3N1YmNpcmN1aXRfaWQsXG4gICAgICAgIHN1YmNpcmN1aXRDYWxsQ29tbWFuZCxcbiAgICAgICAgbm9kZXMsXG4gICAgICApLFxuICAgIClcbiAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBTcGljZVN1YmNpcmN1aXQge1xuICBuYW1lOiBzdHJpbmdcbiAgcGluczogc3RyaW5nW11cblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHBpbnM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHRoaXMucGlucyA9IHBpbnNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwaW5TdHJpbmcgPSB0aGlzLnBpbnMuam9pbihcIiBcIilcbiAgICBjb25zdCBoZWFkZXIgPSBgLlNVQkNLVCAke3RoaXMubmFtZX0gJHtwaW5TdHJpbmd9YFxuICAgIGNvbnN0IGZvb3RlciA9IGAuRU5EUyAke3RoaXMubmFtZX1gXG5cbiAgICBjb25zdCBib2R5ID0gYCogUGxhY2Vob2xkZXIgZm9yICR7dGhpcy5uYW1lfS4gTm8gZGVmaW5pdGlvbiBmb3VuZCBpbiBjaXJjdWl0IEpTT04uYFxuXG4gICAgcmV0dXJuIFtcIlwiLCBoZWFkZXIsIGJvZHksIGZvb3Rlcl0uam9pbihcIlxcblwiKVxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBRU8sSUFBTSw4QkFBOEIsQ0FBQyxZQUFrQztBQUM1RSxRQUFNLFFBQWtCLENBQUM7QUFHekIsUUFBTSxLQUFLLFFBQVEsS0FBSztBQUd4QixNQUFJLFFBQVEsT0FBTyxPQUFPLEdBQUc7QUFDM0IsVUFBTSxLQUFLLEdBQUcsTUFBTSxLQUFLLFFBQVEsT0FBTyxPQUFPLENBQUMsQ0FBQztBQUFBLEVBQ25EO0FBR0EsYUFBVyxhQUFhLFFBQVEsWUFBWTtBQUMxQyxVQUFNLEtBQUssVUFBVSxjQUFjLENBQUM7QUFBQSxFQUN0QztBQUVBLE1BQUksUUFBUSxpQkFBaUIsU0FBUyxHQUFHO0FBQ3ZDLFVBQU0sS0FBSyxHQUFHLFFBQVEsZ0JBQWdCO0FBQUEsRUFDeEM7QUFFQSxNQUFJLFFBQVEsaUJBQWlCLFNBQVMsR0FBRztBQUN2QyxVQUFNLEtBQUssR0FBRyxRQUFRLGdCQUFnQjtBQUFBLEVBQ3hDO0FBR0EsYUFBVyxjQUFjLFFBQVEsYUFBYTtBQUM1QyxVQUFNLEtBQUssV0FBVyxj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
|
|
1462
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL3NwaWNlLXV0aWxzL2NvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZy50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3QudHMiLCAiLi4vbGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnQudHMiLCAiLi4vbGliL2NpcmN1aXRKc29uVG9TcGljZS50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQkpUQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQ2FwYWNpdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvQ3VycmVudFNvdXJjZUNvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL0Rpb2RlQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSW5kdWN0b3JDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9JbmR1Y3RvckNvdXBsaW5nQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvSkZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL01PU0ZFVENvbW1hbmQudHMiLCAiLi4vbGliL3NwaWNlLWNvbW1hbmRzL1Jlc2lzdG9yQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvU3ViY2lyY3VpdENhbGxDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9UcmFuc21pc3Npb25MaW5lQ29tbWFuZC50cyIsICIuLi9saWIvc3BpY2UtY29tbWFuZHMvVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kLnRzIiwgIi4uL2xpYi9zcGljZS1jb21tYW5kcy9Wb2x0YWdlU291cmNlQ29tbWFuZC50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9oZWxwZXJzLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS1yZXNpc3Rvci50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9zaW1wbGUtc3dpdGNoLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS1jYXBhY2l0b3IudHMiLCAiLi4vbGliL3Byb2Nlc3NvcnMvc2ltcGxlLWRpb2RlLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS1pbmR1Y3Rvci50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9zaW1wbGUtbW9zZmV0LnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3NpbXBsZS10cmFuc2lzdG9yLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3Byb2Nlc3Mtc2ltdWxhdGlvbi12b2x0YWdlLXNvdXJjZXMudHMiLCAiLi4vbGliL3Byb2Nlc3NvcnMvcHJvY2Vzcy1zaW11bGF0aW9uLWN1cnJlbnQtc291cmNlcy50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tZXhwZXJpbWVudC50cyIsICIuLi9saWIvcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tb3AtYW1wLnRzIiwgIi4uL2xpYi9wcm9jZXNzb3JzL3Byb2Nlc3Mtc2ltdWxhdGlvbi1zcGljZS1zdWJjaXJjdWl0cy50cyIsICIuLi9saWIvc3BpY2UtY2xhc3Nlcy9TcGljZVN1YmNpcmN1aXQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcIi4uL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyA9IChuZXRsaXN0OiBTcGljZU5ldGxpc3QpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIC8vIFRpdGxlIGxpbmUgKHJlcXVpcmVkIGZpcnN0IGxpbmUgaW4gU1BJQ0UpXG4gIGxpbmVzLnB1c2gobmV0bGlzdC50aXRsZSlcblxuICAvLyBBZGQgbW9kZWxzXG4gIGlmIChuZXRsaXN0Lm1vZGVscy5zaXplID4gMCkge1xuICAgIGxpbmVzLnB1c2goLi4uQXJyYXkuZnJvbShuZXRsaXN0Lm1vZGVscy52YWx1ZXMoKSkpXG4gIH1cblxuICAvLyBDb21wb25lbnQgbGluZXNcbiAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgbmV0bGlzdC5jb21wb25lbnRzKSB7XG4gICAgbGluZXMucHVzaChjb21wb25lbnQudG9TcGljZVN0cmluZygpKVxuICB9XG5cbiAgaWYgKG5ldGxpc3Qub3B0aW9uU3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaCguLi5uZXRsaXN0Lm9wdGlvblN0YXRlbWVudHMpXG4gIH1cblxuICBpZiAobmV0bGlzdC5tZXRhZGF0YUNvbW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3QubWV0YWRhdGFDb21tZW50cylcbiAgfVxuXG4gIC8vIEFkZCBzdWJjaXJjdWl0IGRlZmluaXRpb25zXG4gIGZvciAoY29uc3Qgc3ViY2lyY3VpdCBvZiBuZXRsaXN0LnN1YmNpcmN1aXRzKSB7XG4gICAgbGluZXMucHVzaChzdWJjaXJjdWl0LnRvU3BpY2VTdHJpbmcoKSlcbiAgfVxuXG4gIGlmIChuZXRsaXN0LnByaW50U3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaCguLi5uZXRsaXN0LnByaW50U3RhdGVtZW50cylcbiAgfVxuXG4gIGlmIChuZXRsaXN0LnNhdmVTdGF0ZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3Quc2F2ZVN0YXRlbWVudHMpXG4gIH1cblxuICAvLyBBZGQgY29udHJvbCBibG9jayBpZiBwcmVzZW50XG4gIGlmIChuZXRsaXN0LmNvbnRyb2xzLmxlbmd0aCA+IDApIHtcbiAgICBsaW5lcy5wdXNoKFwiLmNvbnRyb2xcIilcbiAgICBsaW5lcy5wdXNoKC4uLm5ldGxpc3QuY29udHJvbHMpXG4gICAgbGluZXMucHVzaChcIi5lbmRjXCIpXG4gIH1cblxuICBpZiAoXG4gICAgbmV0bGlzdC50cmFuQ29tbWFuZCAmJlxuICAgICFsaW5lcy5zb21lKChsKSA9PiBsLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCIudHJhblwiKSlcbiAgKSB7XG4gICAgbGluZXMucHVzaChuZXRsaXN0LnRyYW5Db21tYW5kKVxuICB9XG5cbiAgLy8gRW5kIHdpdGggLkVORFxuICBsaW5lcy5wdXNoKFwiLkVORFwiKVxuXG4gIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpXG59XG4iLCAiaW1wb3J0IHsgY29udmVydFNwaWNlTmV0bGlzdFRvU3RyaW5nIH0gZnJvbSBcIi4uL3NwaWNlLXV0aWxzL2NvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZ1wiXG5pbXBvcnQgdHlwZSB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcIi4vU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHR5cGUgeyBTcGljZVN1YmNpcmN1aXQgfSBmcm9tIFwiLi9TcGljZVN1YmNpcmN1aXRcIlxuXG5leHBvcnQgY2xhc3MgU3BpY2VOZXRsaXN0IHtcbiAgdGl0bGU6IHN0cmluZ1xuICBjb21wb25lbnRzOiBTcGljZUNvbXBvbmVudFtdXG4gIG5vZGVzOiBTZXQ8c3RyaW5nPlxuICBjb250cm9sczogc3RyaW5nW11cbiAgc3ViY2lyY3VpdHM6IFNwaWNlU3ViY2lyY3VpdFtdXG4gIG1vZGVsczogTWFwPHN0cmluZywgc3RyaW5nPlxuICBvcHRpb25TdGF0ZW1lbnRzOiBzdHJpbmdbXVxuICBtZXRhZGF0YUNvbW1lbnRzOiBzdHJpbmdbXVxuICB0cmFuQ29tbWFuZDogc3RyaW5nIHwgbnVsbFxuICBwcmludFN0YXRlbWVudHM6IHN0cmluZ1tdXG4gIHNhdmVTdGF0ZW1lbnRzOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKHRpdGxlID0gXCJDaXJjdWl0IE5ldGxpc3RcIikge1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZVxuICAgIHRoaXMuY29tcG9uZW50cyA9IFtdXG4gICAgdGhpcy5ub2RlcyA9IG5ldyBTZXQoKVxuICAgIHRoaXMuY29udHJvbHMgPSBbXVxuICAgIHRoaXMuc3ViY2lyY3VpdHMgPSBbXVxuICAgIHRoaXMubW9kZWxzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5vcHRpb25TdGF0ZW1lbnRzID0gW11cbiAgICB0aGlzLm1ldGFkYXRhQ29tbWVudHMgPSBbXVxuICAgIHRoaXMudHJhbkNvbW1hbmQgPSBudWxsXG4gICAgdGhpcy5wcmludFN0YXRlbWVudHMgPSBbXVxuICAgIHRoaXMuc2F2ZVN0YXRlbWVudHMgPSBbXVxuICB9XG5cbiAgYWRkQ29tcG9uZW50KGNvbXBvbmVudDogU3BpY2VDb21wb25lbnQpIHtcbiAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpXG4gICAgLy8gQWRkIG5vZGVzIHRvIHRoZSBzZXRcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgY29tcG9uZW50Lm5vZGVzKSB7XG4gICAgICB0aGlzLm5vZGVzLmFkZChub2RlKVxuICAgIH1cbiAgfVxuXG4gIGFkZFN1YmNpcmN1aXQoc3ViY2lyY3VpdDogU3BpY2VTdWJjaXJjdWl0KSB7XG4gICAgaWYgKHRoaXMuc3ViY2lyY3VpdHMuZmluZCgocykgPT4gcy5uYW1lID09PSBzdWJjaXJjdWl0Lm5hbWUpKSByZXR1cm5cbiAgICB0aGlzLnN1YmNpcmN1aXRzLnB1c2goc3ViY2lyY3VpdClcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKSB7XG4gICAgcmV0dXJuIGNvbnZlcnRTcGljZU5ldGxpc3RUb1N0cmluZyh0aGlzKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4uL3NwaWNlLWNvbW1hbmRzL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgY2xhc3MgU3BpY2VDb21wb25lbnQge1xuICBuYW1lOiBzdHJpbmdcbiAgY29tbWFuZDogQmFzZVNwaWNlQ29tbWFuZFxuICBub2Rlczogc3RyaW5nW11cblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGNvbW1hbmQ6IEJhc2VTcGljZUNvbW1hbmQsIG5vZGVzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWVcbiAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kXG4gICAgdGhpcy5ub2RlcyA9IG5vZGVzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZC50b1NwaWNlU3RyaW5nKClcbiAgfVxufVxuIiwgImltcG9ydCB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCIuL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcIi4vc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgdHlwZSB7XG4gIEFueUNpcmN1aXRFbGVtZW50LFxuICBTaW11bGF0aW9uQ3VycmVudFByb2JlLFxuICBTaW11bGF0aW9uT3BBbXAsXG4gIFNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXQsXG4gIFNpbXVsYXRpb25Td2l0Y2gsXG4gIFNpbXVsYXRpb25Wb2x0YWdlUHJvYmUsXG4gIFNvdXJjZVNpbXBsZURpb2RlLFxuICBTb3VyY2VTaW1wbGVMZWQsXG4gIFNvdXJjZVNpbXBsZU1vc2ZldCxcbiAgU291cmNlU2ltcGxlU3dpdGNoLFxuICBTb3VyY2VTaW1wbGVUcmFuc2lzdG9yLFxufSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IGdldFNvdXJjZVBvcnRDb25uZWN0aXZpdHlNYXBGcm9tQ2lyY3VpdEpzb24gfSBmcm9tIFwiY2lyY3VpdC1qc29uLXRvLWNvbm5lY3Rpdml0eS1tYXBcIlxuaW1wb3J0IHsgc3UgfSBmcm9tIFwiQHRzY2lyY3VpdC9jaXJjdWl0LWpzb24tdXRpbFwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltcGxlUmVzaXN0b3IgfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3NpbXBsZS1yZXNpc3RvclwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltcGxlU3dpdGNoIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9zaW1wbGUtc3dpdGNoXCJcbmltcG9ydCB7IHByb2Nlc3NTaW1wbGVDYXBhY2l0b3IgfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3NpbXBsZS1jYXBhY2l0b3JcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXBsZURpb2RlLCBwcm9jZXNzU2ltcGxlTGVkIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9zaW1wbGUtZGlvZGVcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXBsZUluZHVjdG9yIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9zaW1wbGUtaW5kdWN0b3JcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXBsZU1vc2ZldCB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvc2ltcGxlLW1vc2ZldFwiXG5pbXBvcnQgeyBwcm9jZXNzU2ltcGxlVHJhbnNpc3RvciB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvc2ltcGxlLXRyYW5zaXN0b3JcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXVsYXRpb25Wb2x0YWdlU291cmNlcyB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvcHJvY2Vzcy1zaW11bGF0aW9uLXZvbHRhZ2Utc291cmNlc1wiXG5pbXBvcnQgeyBwcm9jZXNzU2ltdWxhdGlvbkN1cnJlbnRTb3VyY2VzIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tY3VycmVudC1zb3VyY2VzXCJcbmltcG9ydCB7IHByb2Nlc3NTaW11bGF0aW9uRXhwZXJpbWVudCB9IGZyb20gXCIuL3Byb2Nlc3NvcnMvcHJvY2Vzcy1zaW11bGF0aW9uLWV4cGVyaW1lbnRcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXVsYXRpb25PcEFtcHMgfSBmcm9tIFwiLi9wcm9jZXNzb3JzL3Byb2Nlc3Mtc2ltdWxhdGlvbi1vcC1hbXBcIlxuaW1wb3J0IHsgcHJvY2Vzc1NpbXVsYXRpb25TcGljZVN1YmNpcmN1aXRzIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy9wcm9jZXNzLXNpbXVsYXRpb24tc3BpY2Utc3ViY2lyY3VpdHNcIlxuXG5leHBvcnQgZnVuY3Rpb24gY2lyY3VpdEpzb25Ub1NwaWNlKFxuICBjaXJjdWl0SnNvbjogQW55Q2lyY3VpdEVsZW1lbnRbXSxcbik6IFNwaWNlTmV0bGlzdCB7XG4gIGNvbnN0IG5ldGxpc3QgPSBuZXcgU3BpY2VOZXRsaXN0KFwiKiBDaXJjdWl0IEpTT04gdG8gU1BJQ0UgTmV0bGlzdFwiKVxuICBjb25zdCBzb3VyY2VDb21wb25lbnRzID0gc3UoY2lyY3VpdEpzb24pLnNvdXJjZV9jb21wb25lbnQubGlzdCgpXG4gIGNvbnN0IHNvdXJjZVBvcnRzID0gc3UoY2lyY3VpdEpzb24pLnNvdXJjZV9wb3J0Lmxpc3QoKVxuICBjb25zdCBzb3VyY2VUcmFjZXMgPSBzdShjaXJjdWl0SnNvbikuc291cmNlX3RyYWNlLmxpc3QoKVxuICBjb25zdCBzaW11bGF0aW9uUHJvYmVzID0gY2lyY3VpdEpzb24uZmlsdGVyKFxuICAgIChlbG0pID0+IGVsbS50eXBlID09PSBcInNpbXVsYXRpb25fdm9sdGFnZV9wcm9iZVwiLFxuICApIGFzIFNpbXVsYXRpb25Wb2x0YWdlUHJvYmVbXVxuICBjb25zdCBzaW11bGF0aW9uQ3VycmVudFByb2JlcyA9IGNpcmN1aXRKc29uLmZpbHRlcihcbiAgICAoZWxtKSA9PiBlbG0udHlwZSA9PT0gXCJzaW11bGF0aW9uX2N1cnJlbnRfcHJvYmVcIixcbiAgKSBhcyBTaW11bGF0aW9uQ3VycmVudFByb2JlW11cbiAgY29uc3Qgc2ltdWxhdGlvblN3aXRjaGVzID0gY2lyY3VpdEpzb25cbiAgICAuZmlsdGVyKFxuICAgICAgKGVsZW1lbnQpID0+IChlbGVtZW50IGFzIHsgdHlwZT86IHN0cmluZyB9KS50eXBlID09PSBcInNpbXVsYXRpb25fc3dpdGNoXCIsXG4gICAgKVxuICAgIC5tYXAoKGVsZW1lbnQpID0+IGVsZW1lbnQgYXMgdW5rbm93biBhcyBTaW11bGF0aW9uU3dpdGNoKVxuICBjb25zdCBzaW11bGF0aW9uT3BBbXBzID0gY2lyY3VpdEpzb24uZmlsdGVyKFxuICAgIChlbG0pID0+IGVsbS50eXBlID09PSBcInNpbXVsYXRpb25fb3BfYW1wXCIsXG4gICkgYXMgU2ltdWxhdGlvbk9wQW1wW11cbiAgY29uc3Qgc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdHMgPSBjaXJjdWl0SnNvbi5maWx0ZXIoXG4gICAgKGVsbSkgPT4gZWxtLnR5cGUgPT09IFwic2ltdWxhdGlvbl9zcGljZV9zdWJjaXJjdWl0XCIsXG4gICkgYXMgU2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdFtdXG4gIGNvbnN0IHNpbXVsYXRpb25Td2l0Y2hNYXAgPSBuZXcgTWFwPHN0cmluZywgU2ltdWxhdGlvblN3aXRjaD4oKVxuXG4gIGZvciAoY29uc3Qgc2ltU3dpdGNoIG9mIHNpbXVsYXRpb25Td2l0Y2hlcykge1xuICAgIGlmIChzaW1Td2l0Y2guc291cmNlX2NvbXBvbmVudF9pZCkge1xuICAgICAgc2ltdWxhdGlvblN3aXRjaE1hcC5zZXQoc2ltU3dpdGNoLnNvdXJjZV9jb21wb25lbnRfaWQsIHNpbVN3aXRjaClcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25uTWFwID0gZ2V0U291cmNlUG9ydENvbm5lY3Rpdml0eU1hcEZyb21DaXJjdWl0SnNvbihjaXJjdWl0SnNvbilcblxuICAvLyBDcmVhdGUgbm9kZSBtYXBwaW5nIGZyb20gcG9ydCBjb25uZWN0aW9uc1xuICBjb25zdCBub2RlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICBjb25zdCBuZXRUb05vZGVOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICBsZXQgbm9kZUNvdW50ZXIgPSAxXG5cbiAgY29uc3QgcHJvYmVOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGlmIChzaW11bGF0aW9uUHJvYmVzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHByb2JlIG9mIHNpbXVsYXRpb25Qcm9iZXMpIHtcbiAgICAgIGlmIChwcm9iZS5uYW1lKSB7XG4gICAgICAgIHByb2JlTmFtZXMuYWRkKHByb2JlLm5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgdGhlcmUgYXJlIHByb2JlIG5hbWVzIGxpa2UgTjEsIE4yLCBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBjb25mbGljdHNcbiAgY29uc3QgbnVtZXJpY1Byb2JlTmFtZXMgPSBbLi4ucHJvYmVOYW1lc11cbiAgICAubWFwKChuYW1lKSA9PiAvXk4oXFxkKykkL2kuZXhlYyhuYW1lKSlcbiAgICAuZmlsdGVyKChtKTogbSBpcyBSZWdFeHBFeGVjQXJyYXkgPT4gbSAhPT0gbnVsbClcbiAgICAubWFwKChtKSA9PiBwYXJzZUludChtWzFdLCAxMCkpXG5cbiAgaWYgKG51bWVyaWNQcm9iZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBub2RlQ291bnRlciA9IE1hdGgubWF4KC4uLm51bWVyaWNQcm9iZU5hbWVzKSArIDFcbiAgfVxuXG4gIGNvbnN0IGdyb3VuZE5ldHMgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gIC8vIEZpbmQgZ3JvdW5kIGZyb20gc291cmNlIG5ldHMgdGhhdCBpbmNsdWRlIFwiZ25kXCIgaW4gdGhlIG5hbWVcbiAgY29uc3QgZ25kU291cmNlTmV0SWRzID0gbmV3IFNldChcbiAgICBzdShjaXJjdWl0SnNvbilcbiAgICAgIC5zb3VyY2VfbmV0Lmxpc3QoKVxuICAgICAgLmZpbHRlcigoc24pID0+IHNuLm5hbWU/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJnbmRcIikpXG4gICAgICAubWFwKChzbikgPT4gc24uc291cmNlX25ldF9pZCksXG4gIClcblxuICBpZiAoZ25kU291cmNlTmV0SWRzLnNpemUgPiAwKSB7XG4gICAgZm9yIChjb25zdCB0cmFjZSBvZiBzdShjaXJjdWl0SnNvbikuc291cmNlX3RyYWNlLmxpc3QoKSkge1xuICAgICAgaWYgKHRyYWNlLmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBpc09uR25kTmV0ID0gdHJhY2UuY29ubmVjdGVkX3NvdXJjZV9uZXRfaWRzLnNvbWUoKG5ldElkKSA9PlxuICAgICAgICAgIGduZFNvdXJjZU5ldElkcy5oYXMobmV0SWQpLFxuICAgICAgICApXG4gICAgICAgIGlmIChpc09uR25kTmV0KSB7XG4gICAgICAgICAgY29uc3QgYVBvcnRPbkduZCA9IHRyYWNlLmNvbm5lY3RlZF9zb3VyY2VfcG9ydF9pZHNbMF1cbiAgICAgICAgICBjb25zdCBnbmROZXQgPSBjb25uTWFwLmdldE5ldENvbm5lY3RlZFRvSWQoYVBvcnRPbkduZClcbiAgICAgICAgICBpZiAoZ25kTmV0KSB7XG4gICAgICAgICAgICBncm91bmROZXRzLmFkZChnbmROZXQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRmluZCBncm91bmQgbm9kZSBmcm9tIHBvcnRzIG5hbWVkIFwiR05EXCJcbiAgY29uc3QgZ3JvdW5kUG9ydHMgPSBzb3VyY2VQb3J0cy5maWx0ZXIoKHApID0+IHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJnbmRcIilcbiAgZm9yIChjb25zdCBncm91bmRQb3J0IG9mIGdyb3VuZFBvcnRzKSB7XG4gICAgY29uc3QgZ3JvdW5kTmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKGdyb3VuZFBvcnQuc291cmNlX3BvcnRfaWQpXG4gICAgaWYgKGdyb3VuZE5ldCkge1xuICAgICAgZ3JvdW5kTmV0cy5hZGQoZ3JvdW5kTmV0KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc2ltU291cmNlIG9mIHN1KGNpcmN1aXRKc29uKS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlLmxpc3QoKSkge1xuICAgIGNvbnN0IG5lZ19wb3J0X2lkID1cbiAgICAgIChzaW1Tb3VyY2UgYXMgYW55KS5uZWdhdGl2ZV9zb3VyY2VfcG9ydF9pZCA/P1xuICAgICAgKHNpbVNvdXJjZSBhcyBhbnkpLnRlcm1pbmFsMl9zb3VyY2VfcG9ydF9pZFxuICAgIGlmIChuZWdfcG9ydF9pZCkge1xuICAgICAgY29uc3QgZ25kX25ldCA9IGNvbm5NYXAuZ2V0TmV0Q29ubmVjdGVkVG9JZChuZWdfcG9ydF9pZClcbiAgICAgIGlmIChnbmRfbmV0KSB7XG4gICAgICAgIGdyb3VuZE5ldHMuYWRkKGduZF9uZXQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBncm91bmROZXQgb2YgZ3JvdW5kTmV0cykge1xuICAgIG5ldFRvTm9kZU5hbWUuc2V0KGdyb3VuZE5ldCwgXCIwXCIpXG4gIH1cblxuICAvLyBQcmUtYXNzaWduIG5vZGUgbmFtZXMgZnJvbSB2b2x0YWdlIHByb2Jlc1xuICBpZiAoc2ltdWxhdGlvblByb2Jlcy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBwcm9iZSBvZiBzaW11bGF0aW9uUHJvYmVzKSB7XG4gICAgICBpZiAoIXByb2JlLm5hbWUpIGNvbnRpbnVlXG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJvYmUucmVmZXJlbmNlX2lucHV0X3NvdXJjZV9wb3J0X2lkIHx8XG4gICAgICAgIHByb2JlLnJlZmVyZW5jZV9pbnB1dF9zb3VyY2VfbmV0X2lkXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgbGV0IG5ldDogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbFxuICAgICAgY29uc3Qgc2lnbmFsX3BvcnRfaWQgPSBwcm9iZS5zaWduYWxfaW5wdXRfc291cmNlX3BvcnRfaWRcbiAgICAgIGNvbnN0IHNpZ25hbF9uZXRfaWQgPSBwcm9iZS5zaWduYWxfaW5wdXRfc291cmNlX25ldF9pZFxuXG4gICAgICBpZiAoc2lnbmFsX3BvcnRfaWQpIHtcbiAgICAgICAgbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKHNpZ25hbF9wb3J0X2lkKVxuICAgICAgfSBlbHNlIGlmIChzaWduYWxfbmV0X2lkKSB7XG4gICAgICAgIGNvbnN0IHRyYWNlID0gc291cmNlVHJhY2VzLmZpbmQoKHQpID0+XG4gICAgICAgICAgdC5jb25uZWN0ZWRfc291cmNlX25ldF9pZHMuaW5jbHVkZXMoc2lnbmFsX25ldF9pZCEpLFxuICAgICAgICApXG4gICAgICAgIGlmICh0cmFjZSAmJiB0cmFjZS5jb25uZWN0ZWRfc291cmNlX3BvcnRfaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBwb3J0SWQgPSB0cmFjZS5jb25uZWN0ZWRfc291cmNlX3BvcnRfaWRzWzBdXG4gICAgICAgICAgbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKHBvcnRJZClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobmV0KSB7XG4gICAgICAgIGlmICghbmV0VG9Ob2RlTmFtZS5oYXMobmV0KSkge1xuICAgICAgICAgIG5ldFRvTm9kZU5hbWUuc2V0KG5ldCwgcHJvYmUubmFtZSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzaWduYWxfcG9ydF9pZCAmJiBwcm9iZS5uYW1lKSB7XG4gICAgICAgIC8vIEl0J3MgYSBmbG9hdGluZyBwb3J0IHdpdGggYSBwcm9iZSwgc28gd2UgbWFwIGl0IGRpcmVjdGx5LiBUaGlzIHBvcnRcbiAgICAgICAgLy8gd2lsbCBub3cgYmUgc2tpcHBlZCBpbiB0aGUgc2Vjb25kLXBhc3MgZm9yIHVuY29ubmVjdGVkIHBvcnRzLlxuICAgICAgICBub2RlTWFwLnNldChzaWduYWxfcG9ydF9pZCwgcHJvYmUubmFtZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBGaXJzdCBwYXNzOiBhc3NpZ24gbm9kZSBudW1iZXJzIHRvIGFsbCBjb25uZWN0ZWQgbmV0c1xuICBmb3IgKGNvbnN0IHBvcnQgb2Ygc291cmNlUG9ydHMpIHtcbiAgICBjb25zdCBwb3J0SWQgPSBwb3J0LnNvdXJjZV9wb3J0X2lkXG4gICAgY29uc3QgbmV0ID0gY29ubk1hcC5nZXROZXRDb25uZWN0ZWRUb0lkKHBvcnRJZClcbiAgICBpZiAobmV0KSB7XG4gICAgICBpZiAoIW5ldFRvTm9kZU5hbWUuaGFzKG5ldCkpIHtcbiAgICAgICAgbmV0VG9Ob2RlTmFtZS5zZXQobmV0LCBgTiR7bm9kZUNvdW50ZXIrK31gKVxuICAgICAgfVxuICAgICAgbm9kZU1hcC5zZXQocG9ydElkLCBuZXRUb05vZGVOYW1lLmdldChuZXQpISlcbiAgICB9XG4gIH1cblxuICAvLyBTZWNvbmQgcGFzczogYXNzaWduIG5vZGUgbnVtYmVycyB0byB1bmNvbm5lY3RlZCBwb3J0c1xuICBmb3IgKGNvbnN0IHBvcnQgb2Ygc291cmNlUG9ydHMpIHtcbiAgICBjb25zdCBwb3J0SWQgPSBwb3J0LnNvdXJjZV9wb3J0X2lkXG4gICAgLy8gSWYgYSBwb3J0IHdhc24ndCBpbiBhIG5ldCwgaXQgd29uJ3QgYmUgaW4gdGhlIG5vZGVNYXAgeWV0XG4gICAgaWYgKCFub2RlTWFwLmhhcyhwb3J0SWQpKSB7XG4gICAgICAvLyBVbmNvbm5lY3RlZCBwb3J0LCBjcmVhdGUgYSBuZXcgZmxvYXRpbmcgbm9kZSBmb3IgaXRcbiAgICAgIG5vZGVNYXAuc2V0KHBvcnRJZCwgYE4ke25vZGVDb3VudGVyKyt9YClcbiAgICB9XG4gIH1cblxuICAvLyBQcm9jZXNzIGVhY2ggY29tcG9uZW50XG4gIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHNvdXJjZUNvbXBvbmVudHMpIHtcbiAgICBpZiAoY29tcG9uZW50LnR5cGUgIT09IFwic291cmNlX2NvbXBvbmVudFwiKSBjb250aW51ZVxuXG4gICAgY29uc3QgY29tcG9uZW50UG9ydHMgPSBzdShjaXJjdWl0SnNvbilcbiAgICAgIC5zb3VyY2VfcG9ydC5saXN0KHtcbiAgICAgICAgc291cmNlX2NvbXBvbmVudF9pZDogY29tcG9uZW50LnNvdXJjZV9jb21wb25lbnRfaWQsXG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IChhLnBpbl9udW1iZXIgPz8gMCkgLSAoYi5waW5fbnVtYmVyID8/IDApKVxuXG4gICAgLy8gR2V0IG5vZGUgbmFtZXMgZm9yIGNvbXBvbmVudCBwb3J0c1xuICAgIGNvbnN0IG5vZGVzID0gY29tcG9uZW50UG9ydHMubWFwKChwb3J0KSA9PiB7XG4gICAgICByZXR1cm4gbm9kZU1hcC5nZXQocG9ydC5zb3VyY2VfcG9ydF9pZCkgfHwgXCIwXCJcbiAgICB9KVxuXG4gICAgLy8gQ3JlYXRlIFNQSUNFIGNvbXBvbmVudCBiYXNlZCBvbiB0eXBlXG4gICAgaWYgKFwiZnR5cGVcIiBpbiBjb21wb25lbnQpIHtcbiAgICAgIGxldCBzcGljZUNvbXBvbmVudDogU3BpY2VDb21wb25lbnQgfCBudWxsID0gbnVsbFxuXG4gICAgICBzd2l0Y2ggKChjb21wb25lbnQgYXMgeyBmdHlwZTogc3RyaW5nIH0pLmZ0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfcmVzaXN0b3JcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZVJlc2lzdG9yKHsgY29tcG9uZW50LCBub2RlcyB9KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV9zd2l0Y2hcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZVN3aXRjaCh7XG4gICAgICAgICAgICBuZXRsaXN0LFxuICAgICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQgYXMgU291cmNlU2ltcGxlU3dpdGNoLFxuICAgICAgICAgICAgbm9kZXMsXG4gICAgICAgICAgICBzaW11bGF0aW9uU3dpdGNoTWFwLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX2NhcGFjaXRvclwiOiB7XG4gICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBwcm9jZXNzU2ltcGxlQ2FwYWNpdG9yKHsgY29tcG9uZW50LCBub2RlcyB9KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV9kaW9kZVwiOiB7XG4gICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBwcm9jZXNzU2ltcGxlRGlvZGUoe1xuICAgICAgICAgICAgbmV0bGlzdCxcbiAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50IGFzIFNvdXJjZVNpbXBsZURpb2RlLFxuICAgICAgICAgICAgY29tcG9uZW50UG9ydHMsXG4gICAgICAgICAgICBub2RlTWFwLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX2xlZFwiOiB7XG4gICAgICAgICAgc3BpY2VDb21wb25lbnQgPSBwcm9jZXNzU2ltcGxlTGVkKHtcbiAgICAgICAgICAgIG5ldGxpc3QsXG4gICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCBhcyBTb3VyY2VTaW1wbGVMZWQsXG4gICAgICAgICAgICBjb21wb25lbnRQb3J0cyxcbiAgICAgICAgICAgIG5vZGVNYXAsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzaW1wbGVfaW5kdWN0b3JcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZUluZHVjdG9yKHsgY29tcG9uZW50LCBub2RlcyB9KVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNpbXBsZV9tb3NmZXRcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZU1vc2ZldCh7XG4gICAgICAgICAgICBuZXRsaXN0LFxuICAgICAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQgYXMgU291cmNlU2ltcGxlTW9zZmV0LFxuICAgICAgICAgICAgY29tcG9uZW50UG9ydHMsXG4gICAgICAgICAgICBub2RlTWFwLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwic2ltcGxlX3RyYW5zaXN0b3JcIjoge1xuICAgICAgICAgIHNwaWNlQ29tcG9uZW50ID0gcHJvY2Vzc1NpbXBsZVRyYW5zaXN0b3Ioe1xuICAgICAgICAgICAgbmV0bGlzdCxcbiAgICAgICAgICAgIGNvbXBvbmVudDogY29tcG9uZW50IGFzIFNvdXJjZVNpbXBsZVRyYW5zaXN0b3IsXG4gICAgICAgICAgICBjb21wb25lbnRQb3J0cyxcbiAgICAgICAgICAgIG5vZGVNYXAsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzcGljZUNvbXBvbmVudCkge1xuICAgICAgICBuZXRsaXN0LmFkZENvbXBvbmVudChzcGljZUNvbXBvbmVudClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm9jZXNzU2ltdWxhdGlvblZvbHRhZ2VTb3VyY2VzKFxuICAgIG5ldGxpc3QsXG4gICAgc3UoY2lyY3VpdEpzb24pLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2UubGlzdCgpLFxuICAgIG5vZGVNYXAsXG4gIClcblxuICBwcm9jZXNzU2ltdWxhdGlvbkN1cnJlbnRTb3VyY2VzKFxuICAgIG5ldGxpc3QsXG4gICAgc3UoY2lyY3VpdEpzb24pLnNpbXVsYXRpb25fY3VycmVudF9zb3VyY2UubGlzdCgpLFxuICAgIG5vZGVNYXAsXG4gIClcblxuICBwcm9jZXNzU2ltdWxhdGlvbk9wQW1wcyhuZXRsaXN0LCBzaW11bGF0aW9uT3BBbXBzLCBub2RlTWFwKVxuXG4gIHByb2Nlc3NTaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0cyhcbiAgICBuZXRsaXN0LFxuICAgIHNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXRzLFxuICAgIG5vZGVNYXAsXG4gIClcblxuICBjb25zdCBzaW11bGF0aW9uRXhwZXJpbWVudCA9IGNpcmN1aXRKc29uLmZpbmQoXG4gICAgKGVsbSkgPT4gZWxtLnR5cGUgPT09IFwic2ltdWxhdGlvbl9leHBlcmltZW50XCIsXG4gIClcbiAgaWYgKHNpbXVsYXRpb25FeHBlcmltZW50KVxuICAgIHByb2Nlc3NTaW11bGF0aW9uRXhwZXJpbWVudChcbiAgICAgIG5ldGxpc3QsXG4gICAgICBzaW11bGF0aW9uRXhwZXJpbWVudCxcbiAgICAgIHNpbXVsYXRpb25Qcm9iZXMsXG4gICAgICBzaW11bGF0aW9uQ3VycmVudFByb2JlcyxcbiAgICAgIHNvdXJjZVRyYWNlcyxcbiAgICAgIG5vZGVNYXAsXG4gICAgKVxuXG4gIHJldHVybiBuZXRsaXN0XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgQkpUQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGNvbGxlY3Rvcjogc3RyaW5nXG4gIGJhc2U6IHN0cmluZ1xuICBlbWl0dGVyOiBzdHJpbmdcbiAgc3Vic3RyYXRlPzogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbiAgYXJlYT86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgQkpUQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwiYmp0XCIgYXMgY29uc3RcbiAgcHJvcHM6IEJKVENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBCSlRDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIGNvbGxlY3RvciwgYmFzZSwgZW1pdHRlciwgc3Vic3RyYXRlLCBtb2RlbCwgYXJlYSB9ID1cbiAgICAgIHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgUSR7bmFtZX0gJHtjb2xsZWN0b3J9ICR7YmFzZX0gJHtlbWl0dGVyfWBcbiAgICBpZiAoc3Vic3RyYXRlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7c3Vic3RyYXRlfWBcbiAgICB9XG4gICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsfWBcbiAgICBpZiAoYXJlYSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FyZWF9YFxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIENhcGFjaXRvckNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICBtb2RlbE5hbWU/OiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xuICBpbml0aWFsQ29uZGl0aW9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBDYXBhY2l0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJjYXBhY2l0b3JcIiBhcyBjb25zdFxuXG4gIHByb3BzOiBDYXBhY2l0b3JDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogQ2FwYWNpdG9yQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qge1xuICAgICAgbmFtZSxcbiAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgaW5pdGlhbENvbmRpdGlvbixcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYEMke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKG1vZGVsTmFtZSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsTmFtZX1gXG4gICAgfVxuICAgIHNwaWNlU3RyaW5nICs9IGAgJHt2YWx1ZX1gXG4gICAgaWYgKGluaXRpYWxDb25kaXRpb24pIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgSUM9JHtpbml0aWFsQ29uZGl0aW9ufWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBDdXJyZW50U291cmNlQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIHZhbHVlPzogc3RyaW5nXG4gIGFjTWFnbml0dWRlPzogc3RyaW5nXG4gIGFjUGhhc2U/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIEN1cnJlbnRTb3VyY2VDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJjdXJyZW50X3NvdXJjZVwiIGFzIGNvbnN0XG4gIHByb3BzOiBDdXJyZW50U291cmNlQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IEN1cnJlbnRTb3VyY2VDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IG5hbWUsIHBvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlLCB2YWx1ZSwgYWNNYWduaXR1ZGUsIGFjUGhhc2UgfSA9XG4gICAgICB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYEkke25hbWV9ICR7cG9zaXRpdmVOb2RlfSAke25lZ2F0aXZlTm9kZX1gXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgICR7dmFsdWV9YFxuICAgIH1cbiAgICBpZiAoYWNNYWduaXR1ZGUpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgQUMgJHthY01hZ25pdHVkZX1gXG4gICAgICBpZiAoYWNQaGFzZSkge1xuICAgICAgICBzcGljZVN0cmluZyArPSBgICR7YWNQaGFzZX1gXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlvZGVDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgbW9kZWw6IHN0cmluZ1xuICBhcmVhPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBEaW9kZUNvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImRpb2RlXCIgYXMgY29uc3RcbiAgcHJvcHM6IERpb2RlQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IERpb2RlQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZSwgbW9kZWwsIGFyZWEgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgRCR7bmFtZX0gJHtwb3NpdGl2ZU5vZGV9ICR7bmVnYXRpdmVOb2RlfSAke21vZGVsfWBcbiAgICBpZiAoYXJlYSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FyZWF9YFxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEluZHVjdG9yQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIG1vZGVsPzogc3RyaW5nXG4gIHZhbHVlOiBzdHJpbmdcbiAgaW5pdGlhbENvbmRpdGlvbj86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgSW5kdWN0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJpbmR1Y3RvclwiIGFzIGNvbnN0XG4gIHByb3BzOiBJbmR1Y3RvckNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBJbmR1Y3RvckNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIG1vZGVsLCB2YWx1ZSwgaW5pdGlhbENvbmRpdGlvbiB9ID1cbiAgICAgIHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgTCR7bmFtZX0gJHtwb3NpdGl2ZU5vZGV9ICR7bmVnYXRpdmVOb2RlfWBcbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHttb2RlbH1gXG4gICAgfVxuICAgIHNwaWNlU3RyaW5nICs9IGAgJHt2YWx1ZX1gXG4gICAgaWYgKGluaXRpYWxDb25kaXRpb24pIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgSUM9JHtpbml0aWFsQ29uZGl0aW9ufWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBJbmR1Y3RvckNvdXBsaW5nQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIGluZHVjdG9yczogc3RyaW5nW11cbiAgY291cGxpbmc6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgSW5kdWN0b3JDb3VwbGluZ0NvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcImluZHVjdG9yX2NvdXBsaW5nXCIgYXMgY29uc3RcbiAgcHJvcHM6IEluZHVjdG9yQ291cGxpbmdDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSW5kdWN0b3JDb3VwbGluZ0NvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgaW5kdWN0b3JzLCBjb3VwbGluZyB9ID0gdGhpcy5wcm9wc1xuICAgIHJldHVybiBgSyR7bmFtZX0gJHtpbmR1Y3RvcnMuam9pbihcIiBcIil9ICR7Y291cGxpbmd9YFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgSkZFVENvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBkcmFpbjogc3RyaW5nXG4gIGdhdGU6IHN0cmluZ1xuICBzb3VyY2U6IHN0cmluZ1xuICBtb2RlbDogc3RyaW5nXG4gIGFyZWE/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIEpGRVRDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJqZmV0XCIgYXMgY29uc3RcbiAgcHJvcHM6IEpGRVRDb21tYW5kUHJvcHNcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSkZFVENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgZHJhaW4sIGdhdGUsIHNvdXJjZSwgbW9kZWwsIGFyZWEgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgc3BpY2VTdHJpbmcgPSBgSiR7bmFtZX0gJHtkcmFpbn0gJHtnYXRlfSAke3NvdXJjZX0gJHttb2RlbH1gXG4gICAgaWYgKGFyZWEpIHtcbiAgICAgIHNwaWNlU3RyaW5nICs9IGAgJHthcmVhfWBcbiAgICB9XG4gICAgcmV0dXJuIHNwaWNlU3RyaW5nXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEJhc2VTcGljZUNvbW1hbmQgfSBmcm9tIFwiLi9CYXNlU3BpY2VDb21tYW5kXCJcblxuZXhwb3J0IGludGVyZmFjZSBNT1NGRVRDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgZHJhaW46IHN0cmluZ1xuICBnYXRlOiBzdHJpbmdcbiAgc291cmNlOiBzdHJpbmdcbiAgc3Vic3RyYXRlOiBzdHJpbmdcbiAgbW9kZWw6IHN0cmluZ1xuICBsZW5ndGg/OiBzdHJpbmdcbiAgd2lkdGg/OiBzdHJpbmdcbiAgZHJhaW5BcmVhPzogc3RyaW5nXG4gIHNvdXJjZUFyZWE/OiBzdHJpbmdcbiAgZHJhaW5QZXJpbWV0ZXI/OiBzdHJpbmdcbiAgc291cmNlUGVyaW1ldGVyPzogc3RyaW5nXG4gIGRyYWluUmVzaXN0YW5jZT86IHN0cmluZ1xuICBzb3VyY2VSZXNpc3RhbmNlPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBNT1NGRVRDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJtb3NmZXRcIiBhcyBjb25zdFxuICBwcm9wczogTU9TRkVUQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IE1PU0ZFVENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBkcmFpbixcbiAgICAgIGdhdGUsXG4gICAgICBzb3VyY2UsXG4gICAgICBzdWJzdHJhdGUsXG4gICAgICBtb2RlbCxcbiAgICAgIGxlbmd0aCxcbiAgICAgIHdpZHRoLFxuICAgICAgZHJhaW5BcmVhLFxuICAgICAgc291cmNlQXJlYSxcbiAgICAgIGRyYWluUGVyaW1ldGVyLFxuICAgICAgc291cmNlUGVyaW1ldGVyLFxuICAgICAgZHJhaW5SZXNpc3RhbmNlLFxuICAgICAgc291cmNlUmVzaXN0YW5jZSxcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYE0ke25hbWV9ICR7ZHJhaW59ICR7Z2F0ZX0gJHtzb3VyY2V9ICR7c3Vic3RyYXRlfSAke21vZGVsfWBcblxuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiA9IHtcbiAgICAgIEw6IGxlbmd0aCxcbiAgICAgIFc6IHdpZHRoLFxuICAgICAgQUQ6IGRyYWluQXJlYSxcbiAgICAgIEFTOiBzb3VyY2VBcmVhLFxuICAgICAgUEQ6IGRyYWluUGVyaW1ldGVyLFxuICAgICAgUFM6IHNvdXJjZVBlcmltZXRlcixcbiAgICAgIE5SRDogZHJhaW5SZXNpc3RhbmNlLFxuICAgICAgTlJTOiBzb3VyY2VSZXNpc3RhbmNlLFxuICAgIH1cblxuICAgIE9iamVjdC5lbnRyaWVzKHBhcmFtcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2tleX09JHt2YWx1ZX1gXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBzcGljZVN0cmluZ1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzaXN0b3JDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgcG9zaXRpdmVOb2RlOiBzdHJpbmdcbiAgbmVnYXRpdmVOb2RlOiBzdHJpbmdcbiAgbW9kZWw/OiBzdHJpbmdcbiAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXN0b3JDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJyZXNpc3RvclwiIGFzIGNvbnN0XG4gIHByb3BzOiBSZXNpc3RvckNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBSZXNpc3RvckNvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGUsIG1vZGVsLCB2YWx1ZSB9ID0gdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBSJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9YFxuICAgIGlmIChtb2RlbCkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke21vZGVsfWBcbiAgICB9XG4gICAgc3BpY2VTdHJpbmcgKz0gYCAke3ZhbHVlfWBcbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFN1YmNpcmN1aXRDYWxsQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIG5vZGVzOiBzdHJpbmdbXVxuICBzdWJjaXJjdWl0TmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBTdWJjaXJjdWl0Q2FsbENvbW1hbmQgaW1wbGVtZW50cyBCYXNlU3BpY2VDb21tYW5kIHtcbiAgY29tbWFuZE5hbWUgPSBcInN1YmNpcmN1aXRfY2FsbFwiIGFzIGNvbnN0XG4gIHByb3BzOiBTdWJjaXJjdWl0Q2FsbENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBTdWJjaXJjdWl0Q2FsbENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgbmFtZSwgbm9kZXMsIHN1YmNpcmN1aXROYW1lIH0gPSB0aGlzLnByb3BzXG4gICAgcmV0dXJuIGBYJHtuYW1lfSAke25vZGVzLmpvaW4oXCIgXCIpfSAke3N1YmNpcmN1aXROYW1lfWBcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbWlzc2lvbkxpbmVDb21tYW5kUHJvcHMge1xuICBuYW1lOiBzdHJpbmdcbiAgYVBvc2l0aXZlOiBzdHJpbmdcbiAgYU5lZ2F0aXZlOiBzdHJpbmdcbiAgYlBvc2l0aXZlOiBzdHJpbmdcbiAgYk5lZ2F0aXZlOiBzdHJpbmdcbiAgaW1wZWRhbmNlOiBzdHJpbmdcbiAgZGVsYXk/OiBzdHJpbmdcbiAgZnJlcXVlbmN5Pzogc3RyaW5nXG4gIG5vcm1hbGl6ZWRMZW5ndGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFRyYW5zbWlzc2lvbkxpbmVDb21tYW5kIGltcGxlbWVudHMgQmFzZVNwaWNlQ29tbWFuZCB7XG4gIGNvbW1hbmROYW1lID0gXCJ0cmFuc21pc3Npb25fbGluZVwiIGFzIGNvbnN0XG4gIHByb3BzOiBUcmFuc21pc3Npb25MaW5lQ29tbWFuZFByb3BzXG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFRyYW5zbWlzc2lvbkxpbmVDb21tYW5kUHJvcHMpIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgfVxuXG4gIHRvU3BpY2VTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgYVBvc2l0aXZlLFxuICAgICAgYU5lZ2F0aXZlLFxuICAgICAgYlBvc2l0aXZlLFxuICAgICAgYk5lZ2F0aXZlLFxuICAgICAgaW1wZWRhbmNlLFxuICAgICAgZGVsYXksXG4gICAgICBmcmVxdWVuY3ksXG4gICAgICBub3JtYWxpemVkTGVuZ3RoLFxuICAgIH0gPSB0aGlzLnByb3BzXG4gICAgbGV0IHNwaWNlU3RyaW5nID0gYFQke25hbWV9ICR7YVBvc2l0aXZlfSAke2FOZWdhdGl2ZX0gJHtiUG9zaXRpdmV9ICR7Yk5lZ2F0aXZlfSBaMD0ke2ltcGVkYW5jZX1gXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgIFREPSR7ZGVsYXl9YFxuICAgIH0gZWxzZSBpZiAoZnJlcXVlbmN5KSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgIEY9JHtmcmVxdWVuY3l9YFxuICAgICAgaWYgKG5vcm1hbGl6ZWRMZW5ndGgpIHtcbiAgICAgICAgc3BpY2VTdHJpbmcgKz0gYCBOTD0ke25vcm1hbGl6ZWRMZW5ndGh9YFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQmFzZVNwaWNlQ29tbWFuZCB9IGZyb20gXCIuL0Jhc2VTcGljZUNvbW1hbmRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZFByb3BzIHtcbiAgbmFtZTogc3RyaW5nXG4gIHBvc2l0aXZlTm9kZTogc3RyaW5nXG4gIG5lZ2F0aXZlTm9kZTogc3RyaW5nXG4gIHBvc2l0aXZlQ29udHJvbDogc3RyaW5nXG4gIG5lZ2F0aXZlQ29udHJvbDogc3RyaW5nXG4gIG1vZGVsOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFZvbHRhZ2VDb250cm9sbGVkU3dpdGNoQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwidm9sdGFnZV9jb250cm9sbGVkX3N3aXRjaFwiIGFzIGNvbnN0XG4gIHByb3BzOiBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmRQcm9wcykge1xuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHtcbiAgICAgIG5hbWUsXG4gICAgICBwb3NpdGl2ZU5vZGUsXG4gICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICBwb3NpdGl2ZUNvbnRyb2wsXG4gICAgICBuZWdhdGl2ZUNvbnRyb2wsXG4gICAgICBtb2RlbCxcbiAgICB9ID0gdGhpcy5wcm9wc1xuICAgIHJldHVybiBgUyR7bmFtZX0gJHtwb3NpdGl2ZU5vZGV9ICR7bmVnYXRpdmVOb2RlfSAke3Bvc2l0aXZlQ29udHJvbH0gJHtuZWdhdGl2ZUNvbnRyb2x9ICR7bW9kZWx9YFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBCYXNlU3BpY2VDb21tYW5kIH0gZnJvbSBcIi4vQmFzZVNwaWNlQ29tbWFuZFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9sdGFnZVNvdXJjZUNvbW1hbmRQcm9wcyB7XG4gIG5hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZU5vZGU6IHN0cmluZ1xuICBuZWdhdGl2ZU5vZGU6IHN0cmluZ1xuICB2YWx1ZT86IHN0cmluZ1xuICBhY01hZ25pdHVkZT86IHN0cmluZ1xuICBhY1BoYXNlPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBWb2x0YWdlU291cmNlQ29tbWFuZCBpbXBsZW1lbnRzIEJhc2VTcGljZUNvbW1hbmQge1xuICBjb21tYW5kTmFtZSA9IFwidm9sdGFnZV9zb3VyY2VcIiBhcyBjb25zdFxuICBwcm9wczogVm9sdGFnZVNvdXJjZUNvbW1hbmRQcm9wc1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBWb2x0YWdlU291cmNlQ29tbWFuZFByb3BzKSB7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gIH1cblxuICB0b1NwaWNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBuYW1lLCBwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZSwgdmFsdWUsIGFjTWFnbml0dWRlLCBhY1BoYXNlIH0gPVxuICAgICAgdGhpcy5wcm9wc1xuICAgIGxldCBzcGljZVN0cmluZyA9IGBWJHtuYW1lfSAke3Bvc2l0aXZlTm9kZX0gJHtuZWdhdGl2ZU5vZGV9YFxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke3ZhbHVlfWBcbiAgICB9XG4gICAgaWYgKGFjTWFnbml0dWRlKSB7XG4gICAgICBzcGljZVN0cmluZyArPSBgIEFDICR7YWNNYWduaXR1ZGV9YFxuICAgICAgaWYgKGFjUGhhc2UpIHtcbiAgICAgICAgc3BpY2VTdHJpbmcgKz0gYCAke2FjUGhhc2V9YFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3BpY2VTdHJpbmdcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgU2ltdWxhdGlvblN3aXRjaCB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UmVzaXN0YW5jZShyZXNpc3RhbmNlOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAocmVzaXN0YW5jZSA+PSAxZTYpIHJldHVybiBgJHtyZXNpc3RhbmNlIC8gMWU2fU1FR2BcbiAgaWYgKHJlc2lzdGFuY2UgPj0gMWUzKSByZXR1cm4gYCR7cmVzaXN0YW5jZSAvIDFlM31LYFxuICByZXR1cm4gcmVzaXN0YW5jZS50b1N0cmluZygpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRDYXBhY2l0YW5jZShjYXBhY2l0YW5jZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGNhcGFjaXRhbmNlID49IDFlLTMpIHJldHVybiBgJHtjYXBhY2l0YW5jZSAqIDFlM31NYFxuICBpZiAoY2FwYWNpdGFuY2UgPj0gMWUtNikgcmV0dXJuIGAke2NhcGFjaXRhbmNlICogMWU2fVVgXG4gIGlmIChjYXBhY2l0YW5jZSA+PSAxZS05KSByZXR1cm4gYCR7Y2FwYWNpdGFuY2UgKiAxZTl9TmBcbiAgaWYgKGNhcGFjaXRhbmNlID49IDFlLTEyKSByZXR1cm4gYCR7Y2FwYWNpdGFuY2UgKiAxZTEyfVBgXG4gIHJldHVybiBjYXBhY2l0YW5jZS50b1N0cmluZygpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRJbmR1Y3RhbmNlKGluZHVjdGFuY2U6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChpbmR1Y3RhbmNlID49IDEpIHJldHVybiBpbmR1Y3RhbmNlLnRvU3RyaW5nKClcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtMykgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTN9bWBcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtNikgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTZ9dWBcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtOSkgcmV0dXJuIGAke2luZHVjdGFuY2UgKiAxZTl9bmBcbiAgaWYgKGluZHVjdGFuY2UgPj0gMWUtMTIpIHJldHVybiBgJHtpbmR1Y3RhbmNlICogMWUxMn1wYFxuICByZXR1cm4gaW5kdWN0YW5jZS50b1N0cmluZygpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUlkZW50aWZpZXIodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCwgcHJlZml4OiBzdHJpbmcpIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHByZWZpeFxuICBjb25zdCBzYW5pdGl6ZWQgPSB2YWx1ZS5yZXBsYWNlKC9bXkEtWmEtejAtOV9dL2csIFwiX1wiKVxuICBpZiAoIXNhbml0aXplZCkgcmV0dXJuIHByZWZpeFxuICBpZiAoL15bMC05XS8udGVzdChzYW5pdGl6ZWQpKSB7XG4gICAgcmV0dXJuIGAke3ByZWZpeH1fJHtzYW5pdGl6ZWR9YFxuICB9XG4gIHJldHVybiBzYW5pdGl6ZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU2ltdWxhdGlvblN3aXRjaENvbnRyb2xWYWx1ZShcbiAgc2ltdWxhdGlvblN3aXRjaDogU2ltdWxhdGlvblN3aXRjaCB8IHVuZGVmaW5lZCxcbikge1xuICBjb25zdCBoaWdoVm9sdGFnZSA9IDVcbiAgY29uc3QgbG93Vm9sdGFnZSA9IDBcbiAgY29uc3QgcmlzZVRpbWUgPSBcIjFuXCJcbiAgY29uc3QgZmFsbFRpbWUgPSBcIjFuXCJcblxuICBpZiAoIXNpbXVsYXRpb25Td2l0Y2gpIHtcbiAgICByZXR1cm4gYERDICR7bG93Vm9sdGFnZX1gXG4gIH1cblxuICBjb25zdCBzdGFydHNDbG9zZWQgPSBzaW11bGF0aW9uU3dpdGNoLnN0YXJ0c19jbG9zZWQgPz8gZmFsc2VcbiAgY29uc3QgY2xvc2VzQXQgPSBzaW11bGF0aW9uU3dpdGNoLmNsb3Nlc19hdCA/PyAwXG4gIGNvbnN0IG9wZW5zQXQgPSBzaW11bGF0aW9uU3dpdGNoLm9wZW5zX2F0XG4gIGNvbnN0IHN3aXRjaGluZ0ZyZXF1ZW5jeSA9IHNpbXVsYXRpb25Td2l0Y2guc3dpdGNoaW5nX2ZyZXF1ZW5jeVxuXG4gIGNvbnN0IFtpbml0aWFsVm9sdGFnZSwgcHVsc2VkVm9sdGFnZV0gPSBzdGFydHNDbG9zZWRcbiAgICA/IFtoaWdoVm9sdGFnZSwgbG93Vm9sdGFnZV1cbiAgICA6IFtsb3dWb2x0YWdlLCBoaWdoVm9sdGFnZV1cblxuICBpZiAoc3dpdGNoaW5nRnJlcXVlbmN5ICYmIHN3aXRjaGluZ0ZyZXF1ZW5jeSA+IDApIHtcbiAgICBjb25zdCBwZXJpb2QgPSAxIC8gc3dpdGNoaW5nRnJlcXVlbmN5XG4gICAgY29uc3Qgd2lkdGhGcm9tT3BlbkNsb3NlID1cbiAgICAgIG9wZW5zQXQgJiYgb3BlbnNBdCA+IGNsb3Nlc0F0ID8gTWF0aC5taW4ob3BlbnNBdCAtIGNsb3Nlc0F0LCBwZXJpb2QpIDogMFxuICAgIGNvbnN0IHB1bHNlV2lkdGggPVxuICAgICAgd2lkdGhGcm9tT3BlbkNsb3NlID4gMCA/IHdpZHRoRnJvbU9wZW5DbG9zZSA6IE1hdGgubWF4KHBlcmlvZCAvIDIsIDFlLTkpXG5cbiAgICByZXR1cm4gYFBVTFNFKCR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoaW5pdGlhbFZvbHRhZ2UpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHB1bHNlZFZvbHRhZ2UpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKGNsb3Nlc0F0KX0gJHtyaXNlVGltZX0gJHtmYWxsVGltZX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwdWxzZVdpZHRoKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwZXJpb2QpfSlgXG4gIH1cblxuICBpZiAob3BlbnNBdCAhPT0gdW5kZWZpbmVkICYmIG9wZW5zQXQgPiBjbG9zZXNBdCkge1xuICAgIGNvbnN0IHB1bHNlV2lkdGggPSBNYXRoLm1heChvcGVuc0F0IC0gY2xvc2VzQXQsIDFlLTkpXG4gICAgY29uc3QgcGVyaW9kID0gY2xvc2VzQXQgKyBwdWxzZVdpZHRoICogMlxuXG4gICAgcmV0dXJuIGBQVUxTRSgke2Zvcm1hdE51bWJlckZvclNwaWNlKGluaXRpYWxWb2x0YWdlKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShwdWxzZWRWb2x0YWdlKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShjbG9zZXNBdCl9ICR7cmlzZVRpbWV9ICR7ZmFsbFRpbWV9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocHVsc2VXaWR0aCl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocGVyaW9kKX0pYFxuICB9XG5cbiAgaWYgKGNsb3Nlc0F0ID4gMCkge1xuICAgIGNvbnN0IHBlcmlvZCA9IGNsb3Nlc0F0ICogMlxuICAgIGNvbnN0IHB1bHNlV2lkdGggPSBNYXRoLm1heChwZXJpb2QgLyAyLCAxZS05KVxuICAgIHJldHVybiBgUFVMU0UoJHtmb3JtYXROdW1iZXJGb3JTcGljZShpbml0aWFsVm9sdGFnZSl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UocHVsc2VkVm9sdGFnZSl9ICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoY2xvc2VzQXQpfSAke3Jpc2VUaW1lfSAke2ZhbGxUaW1lfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHB1bHNlV2lkdGgpfSAke2Zvcm1hdE51bWJlckZvclNwaWNlKHBlcmlvZCl9KWBcbiAgfVxuXG4gIHJldHVybiBgREMgJHtzdGFydHNDbG9zZWQgPyBoaWdoVm9sdGFnZSA6IGxvd1ZvbHRhZ2V9YFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TnVtYmVyRm9yU3BpY2UodmFsdWU6IG51bWJlcikge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiBgJHt2YWx1ZX1gXG4gIGlmICh2YWx1ZSA9PT0gMCkgcmV0dXJuIFwiMFwiXG5cbiAgY29uc3QgYWJzVmFsdWUgPSBNYXRoLmFicyh2YWx1ZSlcblxuICBpZiAoYWJzVmFsdWUgPj0gMWUzIHx8IGFic1ZhbHVlIDw9IDFlLTMpIHtcbiAgICByZXR1cm4gTnVtYmVyKHZhbHVlLnRvRXhwb25lbnRpYWwoNikpLnRvU3RyaW5nKClcbiAgfVxuXG4gIHJldHVybiBOdW1iZXIodmFsdWUudG9QcmVjaXNpb24oNikpLnRvU3RyaW5nKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFNlY29uZHNGb3JTcGljZSh2YWx1ZTogbnVtYmVyKSB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgcmV0dXJuIGAke3ZhbHVlfWBcbiAgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gXCIwXCJcblxuICBjb25zdCB1bml0cyA9IFtcbiAgICBbXCJUXCIsIDFlMTJdLFxuICAgIFtcIkdcIiwgMWU5XSxcbiAgICBbXCJNRUdcIiwgMWU2XSxcbiAgICBbXCJrXCIsIDFlM10sXG4gICAgW1wibVwiLCAxZS0zXSxcbiAgICBbXCJ1XCIsIDFlLTZdLFxuICAgIFtcIm5cIiwgMWUtOV0sXG4gICAgW1wicFwiLCAxZS0xMl0sXG4gIF0gYXMgY29uc3RcblxuICBmb3IgKGNvbnN0IFtzdWZmaXgsIG11bHRpcGxpZXJdIG9mIHVuaXRzKSB7XG4gICAgY29uc3Qgc2NhbGVkID0gdmFsdWUgLyBtdWx0aXBsaWVyXG4gICAgaWYgKE1hdGguYWJzKHNjYWxlZCkgPj0gMC45OTk5OTkgJiYgTWF0aC5hYnMoc2NhbGVkKSA8IDk5OS45OTk5OTkpIHtcbiAgICAgIGNvbnN0IHJvdW5kZWQgPSBOdW1iZXIoc2NhbGVkLnRvUHJlY2lzaW9uKDYpKVxuICAgICAgaWYgKE1hdGguYWJzKHJvdW5kZWQgKiBtdWx0aXBsaWVyIC0gdmFsdWUpIDw9IE1hdGguYWJzKHZhbHVlKSAqIDFlLTkpIHtcbiAgICAgICAgcmV0dXJuIGAke3JvdW5kZWR9JHtzdWZmaXh9YFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmb3JtYXROdW1iZXJGb3JTcGljZSh2YWx1ZSlcbn1cbiIsICJpbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgeyBSZXNpc3RvckNvbW1hbmQgfSBmcm9tIFwibGliL3NwaWNlLWNvbW1hbmRzXCJcbmltcG9ydCB0eXBlIHsgQW55Q2lyY3VpdEVsZW1lbnQgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IGZvcm1hdFJlc2lzdGFuY2UgfSBmcm9tIFwiLi9oZWxwZXJzXCJcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW1wbGVSZXNpc3RvciA9ICh7XG4gIGNvbXBvbmVudCxcbiAgbm9kZXMsXG59OiB7XG4gIGNvbXBvbmVudDogQW55Q2lyY3VpdEVsZW1lbnRcbiAgbm9kZXM6IHN0cmluZ1tdXG59KTogU3BpY2VDb21wb25lbnQgfCBudWxsID0+IHtcbiAgaWYgKFwicmVzaXN0YW5jZVwiIGluIGNvbXBvbmVudCAmJiBcIm5hbWVcIiBpbiBjb21wb25lbnQpIHtcbiAgICBjb25zdCByZXNpc3RvckNtZCA9IG5ldyBSZXNpc3RvckNvbW1hbmQoe1xuICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLFxuICAgICAgcG9zaXRpdmVOb2RlOiBub2Rlc1swXSB8fCBcIjBcIixcbiAgICAgIG5lZ2F0aXZlTm9kZTogbm9kZXNbMV0gfHwgXCIwXCIsXG4gICAgICB2YWx1ZTogZm9ybWF0UmVzaXN0YW5jZShjb21wb25lbnQucmVzaXN0YW5jZSBhcyBudW1iZXIpLFxuICAgIH0pXG4gICAgcmV0dXJuIG5ldyBTcGljZUNvbXBvbmVudChjb21wb25lbnQubmFtZSBhcyBzdHJpbmcsIHJlc2lzdG9yQ21kLCBub2RlcylcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuIiwgImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQge1xuICBWb2x0YWdlQ29udHJvbGxlZFN3aXRjaENvbW1hbmQsXG4gIFZvbHRhZ2VTb3VyY2VDb21tYW5kLFxufSBmcm9tIFwibGliL3NwaWNlLWNvbW1hbmRzXCJcbmltcG9ydCB0eXBlIHsgU2ltdWxhdGlvblN3aXRjaCwgU291cmNlU2ltcGxlU3dpdGNoIH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQge1xuICBidWlsZFNpbXVsYXRpb25Td2l0Y2hDb250cm9sVmFsdWUsXG4gIHNhbml0aXplSWRlbnRpZmllcixcbn0gZnJvbSBcIi4vaGVscGVyc1wiXG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltcGxlU3dpdGNoID0gKHtcbiAgbmV0bGlzdCxcbiAgY29tcG9uZW50LFxuICBub2RlcyxcbiAgc2ltdWxhdGlvblN3aXRjaE1hcCxcbn06IHtcbiAgbmV0bGlzdDogU3BpY2VOZXRsaXN0XG4gIGNvbXBvbmVudDogU291cmNlU2ltcGxlU3dpdGNoXG4gIG5vZGVzOiBzdHJpbmdbXVxuICBzaW11bGF0aW9uU3dpdGNoTWFwOiBNYXA8c3RyaW5nLCBTaW11bGF0aW9uU3dpdGNoPlxufSk6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9PiB7XG4gIGNvbnN0IHNhbml0aXplZEJhc2UgPSBzYW5pdGl6ZUlkZW50aWZpZXIoXG4gICAgY29tcG9uZW50Lm5hbWUgPz8gY29tcG9uZW50LnNvdXJjZV9jb21wb25lbnRfaWQsXG4gICAgXCJTV1wiLFxuICApXG4gIGNvbnN0IHBvc2l0aXZlTm9kZSA9IG5vZGVzWzBdIHx8IFwiMFwiXG4gIGNvbnN0IG5lZ2F0aXZlTm9kZSA9IG5vZGVzWzFdIHx8IFwiMFwiXG4gIGNvbnN0IGNvbnRyb2xOb2RlID0gYE5DVFJMXyR7c2FuaXRpemVkQmFzZX1gXG4gIGNvbnN0IG1vZGVsTmFtZSA9IGBTV18ke3Nhbml0aXplZEJhc2V9YFxuXG4gIGNvbnN0IGFzc29jaWF0ZWRTaW11bGF0aW9uU3dpdGNoID0gc2ltdWxhdGlvblN3aXRjaE1hcC5nZXQoXG4gICAgY29tcG9uZW50LnNvdXJjZV9jb21wb25lbnRfaWQsXG4gIClcblxuICBjb25zdCBjb250cm9sVmFsdWUgPSBidWlsZFNpbXVsYXRpb25Td2l0Y2hDb250cm9sVmFsdWUoXG4gICAgYXNzb2NpYXRlZFNpbXVsYXRpb25Td2l0Y2gsXG4gIClcblxuICBjb25zdCBzd2l0Y2hDbWQgPSBuZXcgVm9sdGFnZUNvbnRyb2xsZWRTd2l0Y2hDb21tYW5kKHtcbiAgICBuYW1lOiBzYW5pdGl6ZWRCYXNlLFxuICAgIHBvc2l0aXZlTm9kZSxcbiAgICBuZWdhdGl2ZU5vZGUsXG4gICAgcG9zaXRpdmVDb250cm9sOiBjb250cm9sTm9kZSxcbiAgICBuZWdhdGl2ZUNvbnRyb2w6IFwiMFwiLFxuICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gIH0pXG5cbiAgaWYgKCFuZXRsaXN0Lm1vZGVscy5oYXMobW9kZWxOYW1lKSkge1xuICAgIG5ldGxpc3QubW9kZWxzLnNldChcbiAgICAgIG1vZGVsTmFtZSxcbiAgICAgIGAuTU9ERUwgJHttb2RlbE5hbWV9IFNXKFJvbj0wLjEgUm9mZj0xZTkgVnQ9Mi41IFZoPTAuMSlgLFxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGNvbnRyb2xTb3VyY2VOYW1lID0gYENUUkxfJHtzYW5pdGl6ZWRCYXNlfWBcbiAgY29uc3QgY29udHJvbFNvdXJjZUNtZCA9IG5ldyBWb2x0YWdlU291cmNlQ29tbWFuZCh7XG4gICAgbmFtZTogY29udHJvbFNvdXJjZU5hbWUsXG4gICAgcG9zaXRpdmVOb2RlOiBjb250cm9sTm9kZSxcbiAgICBuZWdhdGl2ZU5vZGU6IFwiMFwiLFxuICAgIHZhbHVlOiBjb250cm9sVmFsdWUsXG4gIH0pXG5cbiAgY29uc3QgY29udHJvbENvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICBjb250cm9sU291cmNlTmFtZSxcbiAgICBjb250cm9sU291cmNlQ21kLFxuICAgIFtjb250cm9sTm9kZSwgXCIwXCJdLFxuICApXG5cbiAgbmV0bGlzdC5hZGRDb21wb25lbnQoY29udHJvbENvbXBvbmVudClcblxuICByZXR1cm4gbmV3IFNwaWNlQ29tcG9uZW50KHNhbml0aXplZEJhc2UsIHN3aXRjaENtZCwgW1xuICAgIHBvc2l0aXZlTm9kZSxcbiAgICBuZWdhdGl2ZU5vZGUsXG4gICAgY29udHJvbE5vZGUsXG4gICAgXCIwXCIsXG4gIF0pXG59XG4iLCAiaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHsgQ2FwYWNpdG9yQ29tbWFuZCB9IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuaW1wb3J0IHR5cGUgeyBBbnlDaXJjdWl0RWxlbWVudCB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHsgZm9ybWF0Q2FwYWNpdGFuY2UgfSBmcm9tIFwiLi9oZWxwZXJzXCJcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW1wbGVDYXBhY2l0b3IgPSAoe1xuICBjb21wb25lbnQsXG4gIG5vZGVzLFxufToge1xuICBjb21wb25lbnQ6IEFueUNpcmN1aXRFbGVtZW50XG4gIG5vZGVzOiBzdHJpbmdbXVxufSk6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9PiB7XG4gIGlmIChcImNhcGFjaXRhbmNlXCIgaW4gY29tcG9uZW50ICYmIFwibmFtZVwiIGluIGNvbXBvbmVudCkge1xuICAgIGNvbnN0IGNhcGFjaXRvckNtZCA9IG5ldyBDYXBhY2l0b3JDb21tYW5kKHtcbiAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZyxcbiAgICAgIHBvc2l0aXZlTm9kZTogbm9kZXNbMF0gfHwgXCIwXCIsXG4gICAgICBuZWdhdGl2ZU5vZGU6IG5vZGVzWzFdIHx8IFwiMFwiLFxuICAgICAgdmFsdWU6IGZvcm1hdENhcGFjaXRhbmNlKGNvbXBvbmVudC5jYXBhY2l0YW5jZSBhcyBudW1iZXIpLFxuICAgIH0pXG4gICAgcmV0dXJuIG5ldyBTcGljZUNvbXBvbmVudChjb21wb25lbnQubmFtZSBhcyBzdHJpbmcsIGNhcGFjaXRvckNtZCwgbm9kZXMpXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3RcIlxuaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHsgRGlvZGVDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5pbXBvcnQgdHlwZSB7XG4gIFNvdXJjZVBvcnQsXG4gIFNvdXJjZVNpbXBsZURpb2RlLFxuICBTb3VyY2VTaW1wbGVMZWQsXG59IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuXG5jb25zdCBnZXREaW9kZU5vZGVzID0gKFxuICBjb21wb25lbnRQb3J0czogU291cmNlUG9ydFtdLFxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKSA9PiB7XG4gIGNvbnN0IGFub2RlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgKHApID0+IHAubmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gXCJhbm9kZVwiIHx8IHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJhbm9kZVwiKSxcbiAgKVxuICBjb25zdCBjYXRob2RlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgKHApID0+XG4gICAgICBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiY2F0aG9kZVwiIHx8IHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJjYXRob2RlXCIpLFxuICApXG5cbiAgcmV0dXJuIHtcbiAgICBwb3NpdGl2ZU5vZGU6IG5vZGVNYXAuZ2V0KGFub2RlUG9ydD8uc291cmNlX3BvcnRfaWQgPz8gXCJcIikgfHwgXCIwXCIsXG4gICAgbmVnYXRpdmVOb2RlOiBub2RlTWFwLmdldChjYXRob2RlUG9ydD8uc291cmNlX3BvcnRfaWQgPz8gXCJcIikgfHwgXCIwXCIsXG4gIH1cbn1cblxuY29uc3QgcHJvY2Vzc0Rpb2RlTGlrZUNvbXBvbmVudCA9ICh7XG4gIG5ldGxpc3QsXG4gIGNvbXBvbmVudCxcbiAgY29tcG9uZW50UG9ydHMsXG4gIG5vZGVNYXAsXG4gIG1vZGVsTmFtZSxcbiAgbW9kZWxEZWZpbml0aW9uLFxufToge1xuICBuZXRsaXN0OiBTcGljZU5ldGxpc3RcbiAgY29tcG9uZW50OiBTb3VyY2VTaW1wbGVEaW9kZSB8IFNvdXJjZVNpbXBsZUxlZFxuICBjb21wb25lbnRQb3J0czogU291cmNlUG9ydFtdXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgbW9kZWxOYW1lOiBzdHJpbmdcbiAgbW9kZWxEZWZpbml0aW9uOiBzdHJpbmdcbn0pOiBTcGljZUNvbXBvbmVudCB8IG51bGwgPT4ge1xuICBpZiAoXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgY29uc3QgeyBwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZSB9ID0gZ2V0RGlvZGVOb2RlcyhcbiAgICAgIGNvbXBvbmVudFBvcnRzLFxuICAgICAgbm9kZU1hcCxcbiAgICApXG5cbiAgICBjb25zdCBkaW9kZUNtZCA9IG5ldyBEaW9kZUNvbW1hbmQoe1xuICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLFxuICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgbW9kZWw6IG1vZGVsTmFtZSxcbiAgICB9KVxuICAgIG5ldGxpc3QubW9kZWxzLnNldChtb2RlbE5hbWUsIG1vZGVsRGVmaW5pdGlvbilcbiAgICByZXR1cm4gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZywgZGlvZGVDbWQsIFtcbiAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICBdKVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltcGxlRGlvZGUgPSAoe1xuICBuZXRsaXN0LFxuICBjb21wb25lbnQsXG4gIGNvbXBvbmVudFBvcnRzLFxuICBub2RlTWFwLFxufToge1xuICBuZXRsaXN0OiBTcGljZU5ldGxpc3RcbiAgY29tcG9uZW50OiBTb3VyY2VTaW1wbGVEaW9kZVxuICBjb21wb25lbnRQb3J0czogU291cmNlUG9ydFtdXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbn0pOiBTcGljZUNvbXBvbmVudCB8IG51bGwgPT4ge1xuICByZXR1cm4gcHJvY2Vzc0Rpb2RlTGlrZUNvbXBvbmVudCh7XG4gICAgbmV0bGlzdCxcbiAgICBjb21wb25lbnQsXG4gICAgY29tcG9uZW50UG9ydHMsXG4gICAgbm9kZU1hcCxcbiAgICBtb2RlbE5hbWU6IFwiRFwiLFxuICAgIG1vZGVsRGVmaW5pdGlvbjogXCIuTU9ERUwgRCBEXCIsXG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltcGxlTGVkID0gKHtcbiAgbmV0bGlzdCxcbiAgY29tcG9uZW50LFxuICBjb21wb25lbnRQb3J0cyxcbiAgbm9kZU1hcCxcbn06IHtcbiAgbmV0bGlzdDogU3BpY2VOZXRsaXN0XG4gIGNvbXBvbmVudDogU291cmNlU2ltcGxlTGVkXG4gIGNvbXBvbmVudFBvcnRzOiBTb3VyY2VQb3J0W11cbiAgbm9kZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPlxufSk6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9PiB7XG4gIHJldHVybiBwcm9jZXNzRGlvZGVMaWtlQ29tcG9uZW50KHtcbiAgICBuZXRsaXN0LFxuICAgIGNvbXBvbmVudCxcbiAgICBjb21wb25lbnRQb3J0cyxcbiAgICBub2RlTWFwLFxuICAgIG1vZGVsTmFtZTogXCJMRURcIixcbiAgICBtb2RlbERlZmluaXRpb246XG4gICAgICBcIi5NT0RFTCBMRUQgRChJUz0xZS0yMCBOPTIgUlM9MTAgQ0pPPTJwIEVHPTIuMSBCVj01IElCVj0xMHUpXCIsXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHsgSW5kdWN0b3JDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5pbXBvcnQgdHlwZSB7IEFueUNpcmN1aXRFbGVtZW50IH0gZnJvbSBcImNpcmN1aXQtanNvblwiXG5pbXBvcnQgeyBmb3JtYXRJbmR1Y3RhbmNlIH0gZnJvbSBcIi4vaGVscGVyc1wiXG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltcGxlSW5kdWN0b3IgPSAoe1xuICBjb21wb25lbnQsXG4gIG5vZGVzLFxufToge1xuICBjb21wb25lbnQ6IEFueUNpcmN1aXRFbGVtZW50XG4gIG5vZGVzOiBzdHJpbmdbXVxufSk6IFNwaWNlQ29tcG9uZW50IHwgbnVsbCA9PiB7XG4gIGlmIChcImluZHVjdGFuY2VcIiBpbiBjb21wb25lbnQgJiYgXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgY29uc3QgaW5kdWN0b3JDbWQgPSBuZXcgSW5kdWN0b3JDb21tYW5kKHtcbiAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZyxcbiAgICAgIHBvc2l0aXZlTm9kZTogbm9kZXNbMF0gfHwgXCIwXCIsXG4gICAgICBuZWdhdGl2ZU5vZGU6IG5vZGVzWzFdIHx8IFwiMFwiLFxuICAgICAgdmFsdWU6IGZvcm1hdEluZHVjdGFuY2UoY29tcG9uZW50LmluZHVjdGFuY2UgYXMgbnVtYmVyKSxcbiAgICB9KVxuICAgIHJldHVybiBuZXcgU3BpY2VDb21wb25lbnQoY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLCBpbmR1Y3RvckNtZCwgbm9kZXMpXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNwaWNlTmV0bGlzdCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZU5ldGxpc3RcIlxuaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHsgTU9TRkVUQ29tbWFuZCB9IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuaW1wb3J0IHR5cGUgeyBTb3VyY2VQb3J0LCBTb3VyY2VTaW1wbGVNb3NmZXQgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW1wbGVNb3NmZXQgPSAoe1xuICBuZXRsaXN0LFxuICBjb21wb25lbnQsXG4gIGNvbXBvbmVudFBvcnRzLFxuICBub2RlTWFwLFxufToge1xuICBuZXRsaXN0OiBTcGljZU5ldGxpc3RcbiAgY29tcG9uZW50OiBTb3VyY2VTaW1wbGVNb3NmZXRcbiAgY29tcG9uZW50UG9ydHM6IFNvdXJjZVBvcnRbXVxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG59KTogU3BpY2VDb21wb25lbnQgfCBudWxsID0+IHtcbiAgaWYgKFwibmFtZVwiIGluIGNvbXBvbmVudCkge1xuICAgIGNvbnN0IGRyYWluUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAocCkgPT5cbiAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImRyYWluXCIgfHwgcC5wb3J0X2hpbnRzPy5pbmNsdWRlcyhcImRyYWluXCIpLFxuICAgIClcbiAgICBjb25zdCBnYXRlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAocCkgPT4gcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImdhdGVcIiB8fCBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwiZ2F0ZVwiKSxcbiAgICApXG4gICAgY29uc3Qgc291cmNlUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAocCkgPT5cbiAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcInNvdXJjZVwiIHx8IHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJzb3VyY2VcIiksXG4gICAgKVxuXG4gICAgY29uc3QgZHJhaW5Ob2RlID0gbm9kZU1hcC5nZXQoZHJhaW5Qb3J0Py5zb3VyY2VfcG9ydF9pZCA/PyBcIlwiKSB8fCBcIjBcIlxuICAgIGNvbnN0IGdhdGVOb2RlID0gbm9kZU1hcC5nZXQoZ2F0ZVBvcnQ/LnNvdXJjZV9wb3J0X2lkID8/IFwiXCIpIHx8IFwiMFwiXG4gICAgY29uc3Qgc291cmNlTm9kZSA9IG5vZGVNYXAuZ2V0KHNvdXJjZVBvcnQ/LnNvdXJjZV9wb3J0X2lkID8/IFwiXCIpIHx8IFwiMFwiXG5cbiAgICAvLyBGb3IgMy1waW4gTU9TRkVUcywgc3Vic3RyYXRlIGlzIHR5cGljYWxseSBjb25uZWN0ZWQgdG8gc291cmNlXG4gICAgY29uc3Qgc3Vic3RyYXRlTm9kZSA9IHNvdXJjZU5vZGVcblxuICAgIGNvbnN0IGNoYW5uZWxfdHlwZSA9IGNvbXBvbmVudC5jaGFubmVsX3R5cGUgPz8gXCJuXCJcbiAgICBjb25zdCBtb3NmZXRfbW9kZSA9IGNvbXBvbmVudC5tb3NmZXRfbW9kZSA/PyBcImVuaGFuY2VtZW50XCJcblxuICAgIGNvbnN0IG1vZGVsVHlwZSA9IGAke2NoYW5uZWxfdHlwZS50b1VwcGVyQ2FzZSgpfU1PU2BcbiAgICBjb25zdCBtb2RlbE5hbWUgPSBgJHttb2RlbFR5cGV9XyR7bW9zZmV0X21vZGUudG9VcHBlckNhc2UoKX1gXG5cbiAgICBpZiAoIW5ldGxpc3QubW9kZWxzLmhhcyhtb2RlbE5hbWUpKSB7XG4gICAgICBpZiAobW9zZmV0X21vZGUgPT09IFwiZW5oYW5jZW1lbnRcIikge1xuICAgICAgICBjb25zdCB2dG8gPSBjaGFubmVsX3R5cGUgPT09IFwicFwiID8gLTEgOiAxXG4gICAgICAgIG5ldGxpc3QubW9kZWxzLnNldChcbiAgICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgICAgYC5NT0RFTCAke21vZGVsTmFtZX0gJHttb2RlbFR5cGV9IChWVE89JHt2dG99IEtQPTAuMSlgLFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXRsaXN0Lm1vZGVscy5zZXQoXG4gICAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICAgIGAuTU9ERUwgJHttb2RlbE5hbWV9ICR7bW9kZWxUeXBlfSAoS1A9MC4xKWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtb3NmZXRDbWQgPSBuZXcgTU9TRkVUQ29tbWFuZCh7XG4gICAgICBuYW1lOiBjb21wb25lbnQubmFtZSBhcyBzdHJpbmcsXG4gICAgICBkcmFpbjogZHJhaW5Ob2RlLFxuICAgICAgZ2F0ZTogZ2F0ZU5vZGUsXG4gICAgICBzb3VyY2U6IHNvdXJjZU5vZGUsXG4gICAgICBzdWJzdHJhdGU6IHN1YnN0cmF0ZU5vZGUsXG4gICAgICBtb2RlbDogbW9kZWxOYW1lLFxuICAgIH0pXG5cbiAgICByZXR1cm4gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZywgbW9zZmV0Q21kLCBbXG4gICAgICBkcmFpbk5vZGUsXG4gICAgICBnYXRlTm9kZSxcbiAgICAgIHNvdXJjZU5vZGUsXG4gICAgXSlcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuIiwgImltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBTcGljZUNvbXBvbmVudCB9IGZyb20gXCJsaWIvc3BpY2UtY2xhc3Nlcy9TcGljZUNvbXBvbmVudFwiXG5pbXBvcnQgeyBCSlRDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5pbXBvcnQgdHlwZSB7IFNvdXJjZVBvcnQsIFNvdXJjZVNpbXBsZVRyYW5zaXN0b3IgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcblxuZXhwb3J0IGNvbnN0IHByb2Nlc3NTaW1wbGVUcmFuc2lzdG9yID0gKHtcbiAgbmV0bGlzdCxcbiAgY29tcG9uZW50LFxuICBjb21wb25lbnRQb3J0cyxcbiAgbm9kZU1hcCxcbn06IHtcbiAgbmV0bGlzdDogU3BpY2VOZXRsaXN0XG4gIGNvbXBvbmVudDogU291cmNlU2ltcGxlVHJhbnNpc3RvclxuICBjb21wb25lbnRQb3J0czogU291cmNlUG9ydFtdXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbn0pOiBTcGljZUNvbXBvbmVudCB8IG51bGwgPT4ge1xuICBpZiAoXCJuYW1lXCIgaW4gY29tcG9uZW50KSB7XG4gICAgY29uc3QgY29sbGVjdG9yUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAocCkgPT5cbiAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImNvbGxlY3RvclwiIHx8XG4gICAgICAgIHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJjb2xsZWN0b3JcIiksXG4gICAgKVxuICAgIGNvbnN0IGJhc2VQb3J0ID0gY29tcG9uZW50UG9ydHMuZmluZChcbiAgICAgIChwKSA9PiBwLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiYmFzZVwiIHx8IHAucG9ydF9oaW50cz8uaW5jbHVkZXMoXCJiYXNlXCIpLFxuICAgIClcbiAgICBjb25zdCBlbWl0dGVyUG9ydCA9IGNvbXBvbmVudFBvcnRzLmZpbmQoXG4gICAgICAocCkgPT5cbiAgICAgICAgcC5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBcImVtaXR0ZXJcIiB8fFxuICAgICAgICBwLnBvcnRfaGludHM/LmluY2x1ZGVzKFwiZW1pdHRlclwiKSxcbiAgICApXG5cbiAgICBpZiAoIWNvbGxlY3RvclBvcnQgfHwgIWJhc2VQb3J0IHx8ICFlbWl0dGVyUG9ydCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJhbnNpc3RvciAke2NvbXBvbmVudC5uYW1lfSBpcyBtaXNzaW5nIHJlcXVpcmVkIHBvcnRzIChjb2xsZWN0b3IsIGJhc2UsIGVtaXR0ZXIpYCxcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBjb2xsZWN0b3JOb2RlID0gbm9kZU1hcC5nZXQoY29sbGVjdG9yUG9ydC5zb3VyY2VfcG9ydF9pZCkgfHwgXCIwXCJcbiAgICBjb25zdCBiYXNlTm9kZSA9IG5vZGVNYXAuZ2V0KGJhc2VQb3J0LnNvdXJjZV9wb3J0X2lkKSB8fCBcIjBcIlxuICAgIGNvbnN0IGVtaXR0ZXJOb2RlID0gbm9kZU1hcC5nZXQoZW1pdHRlclBvcnQuc291cmNlX3BvcnRfaWQpIHx8IFwiMFwiXG5cbiAgICBjb25zdCB0cmFuc2lzdG9yX3R5cGUgPSBjb21wb25lbnQudHJhbnNpc3Rvcl90eXBlID8/IFwibnBuXCJcbiAgICBjb25zdCBtb2RlbE5hbWUgPSB0cmFuc2lzdG9yX3R5cGUudG9VcHBlckNhc2UoKVxuICAgIGlmICghbmV0bGlzdC5tb2RlbHMuaGFzKG1vZGVsTmFtZSkpIHtcbiAgICAgIG5ldGxpc3QubW9kZWxzLnNldChcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBgLk1PREVMICR7bW9kZWxOYW1lfSAke3RyYW5zaXN0b3JfdHlwZS50b1VwcGVyQ2FzZSgpfWAsXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgYmp0Q21kID0gbmV3IEJKVENvbW1hbmQoe1xuICAgICAgbmFtZTogY29tcG9uZW50Lm5hbWUgYXMgc3RyaW5nLFxuICAgICAgY29sbGVjdG9yOiBjb2xsZWN0b3JOb2RlLFxuICAgICAgYmFzZTogYmFzZU5vZGUsXG4gICAgICBlbWl0dGVyOiBlbWl0dGVyTm9kZSxcbiAgICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gICAgfSlcbiAgICByZXR1cm4gbmV3IFNwaWNlQ29tcG9uZW50KGNvbXBvbmVudC5uYW1lIGFzIHN0cmluZywgYmp0Q21kLCBbXG4gICAgICBjb2xsZWN0b3JOb2RlLFxuICAgICAgYmFzZU5vZGUsXG4gICAgICBlbWl0dGVyTm9kZSxcbiAgICBdKVxuICB9XG4gIHJldHVybiBudWxsXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBbnlDaXJjdWl0RWxlbWVudCwgU2ltdWxhdGlvblZvbHRhZ2VTb3VyY2UgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBWb2x0YWdlU291cmNlQ29tbWFuZCB9IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuaW1wb3J0IHsgZm9ybWF0U2Vjb25kc0ZvclNwaWNlIH0gZnJvbSBcIi4vaGVscGVyc1wiXG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltdWxhdGlvblZvbHRhZ2VTb3VyY2VzID0gKFxuICBuZXRsaXN0OiBTcGljZU5ldGxpc3QsXG4gIHNpbXVsYXRpb25Wb2x0YWdlU291cmNlczogU2ltdWxhdGlvblZvbHRhZ2VTb3VyY2VbXSxcbiAgbm9kZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPixcbikgPT4ge1xuICBmb3IgKGNvbnN0IHNpbVNvdXJjZSBvZiBzaW11bGF0aW9uVm9sdGFnZVNvdXJjZXMpIHtcbiAgICBpZiAoc2ltU291cmNlLnR5cGUgIT09IFwic2ltdWxhdGlvbl92b2x0YWdlX3NvdXJjZVwiKSBjb250aW51ZVxuXG4gICAgaWYgKHNpbVNvdXJjZS5pc19kY19zb3VyY2UgPT09IGZhbHNlKSB7XG4gICAgICAvLyBBQyBTb3VyY2VcbiAgICAgIGlmIChcbiAgICAgICAgXCJ0ZXJtaW5hbDFfc291cmNlX3BvcnRfaWRcIiBpbiBzaW1Tb3VyY2UgJiZcbiAgICAgICAgXCJ0ZXJtaW5hbDJfc291cmNlX3BvcnRfaWRcIiBpbiBzaW1Tb3VyY2UgJiZcbiAgICAgICAgc2ltU291cmNlLnRlcm1pbmFsMV9zb3VyY2VfcG9ydF9pZCAmJlxuICAgICAgICBzaW1Tb3VyY2UudGVybWluYWwyX3NvdXJjZV9wb3J0X2lkXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcG9zaXRpdmVOb2RlID1cbiAgICAgICAgICBub2RlTWFwLmdldChzaW1Tb3VyY2UudGVybWluYWwxX3NvdXJjZV9wb3J0X2lkKSB8fCBcIjBcIlxuICAgICAgICBjb25zdCBuZWdhdGl2ZU5vZGUgPVxuICAgICAgICAgIG5vZGVNYXAuZ2V0KHNpbVNvdXJjZS50ZXJtaW5hbDJfc291cmNlX3BvcnRfaWQpIHx8IFwiMFwiXG5cbiAgICAgICAgbGV0IHZhbHVlID0gXCJcIlxuICAgICAgICBjb25zdCB3YXZlX3NoYXBlID0gc2ltU291cmNlLndhdmVfc2hhcGVcbiAgICAgICAgaWYgKHdhdmVfc2hhcGUgPT09IFwic2luZXdhdmVcIikge1xuICAgICAgICAgIGNvbnN0IHZfb2Zmc2V0ID0gMCAvLyBub3QgcHJvdmlkZWQgaW4gY2lyY3VpdEpzb25cbiAgICAgICAgICBjb25zdCB2X3BlYWsgPSBzaW1Tb3VyY2Uudm9sdGFnZSA/PyAwXG4gICAgICAgICAgY29uc3QgZnJlcSA9IHNpbVNvdXJjZS5mcmVxdWVuY3kgPz8gMFxuICAgICAgICAgIGNvbnN0IGRlbGF5ID0gMCAvLyBub3QgcHJvdmlkZWQgaW4gY2lyY3VpdEpzb25cbiAgICAgICAgICBjb25zdCBkYW1waW5nX2ZhY3RvciA9IDAgLy8gbm90IHByb3ZpZGVkIGluIGNpcmN1aXRKc29uXG4gICAgICAgICAgY29uc3QgcGhhc2UgPSBzaW1Tb3VyY2UucGhhc2UgPz8gMFxuICAgICAgICAgIGlmIChmcmVxID4gMCkge1xuICAgICAgICAgICAgdmFsdWUgPSBgU0lOKCR7dl9vZmZzZXR9ICR7dl9wZWFrfSAke2ZyZXF9ICR7ZGVsYXl9ICR7ZGFtcGluZ19mYWN0b3J9ICR7cGhhc2V9KWBcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBgREMgJHtzaW1Tb3VyY2Uudm9sdGFnZSA/PyAwfWBcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2F2ZV9zaGFwZSA9PT0gXCJzcXVhcmVcIikge1xuICAgICAgICAgIGNvbnN0IHZfaW5pdGlhbCA9IDBcbiAgICAgICAgICBjb25zdCB2X3B1bHNlZCA9IHNpbVNvdXJjZS52b2x0YWdlID8/IDBcbiAgICAgICAgICBjb25zdCBmcmVxID0gc2ltU291cmNlLmZyZXF1ZW5jeSA/PyAwXG4gICAgICAgICAgY29uc3QgcGVyaW9kX2Zyb21fZnJlcSA9IGZyZXEgPT09IDAgPyBJbmZpbml0eSA6IDEgLyBmcmVxXG4gICAgICAgICAgY29uc3QgaGFzRXhwbGljaXRQZXJpb2QgPSBzaW1Tb3VyY2UucGVyaW9kICE9PSB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFB1bHNlV2lkdGggPSBzaW1Tb3VyY2UucHVsc2Vfd2lkdGggIT09IHVuZGVmaW5lZFxuICAgICAgICAgIGNvbnN0IHBlcmlvZCA9IGhhc0V4cGxpY2l0UGVyaW9kXG4gICAgICAgICAgICA/IHNpbVNvdXJjZS5wZXJpb2QhIC8gMTAwMFxuICAgICAgICAgICAgOiBwZXJpb2RfZnJvbV9mcmVxXG4gICAgICAgICAgY29uc3QgZHV0eV9jeWNsZSA9IHNpbVNvdXJjZS5kdXR5X2N5Y2xlID8/IDAuNVxuICAgICAgICAgIGNvbnN0IHB1bHNlX3dpZHRoID0gcGVyaW9kICogZHV0eV9jeWNsZVxuICAgICAgICAgIGNvbnN0IGRlbGF5ID1cbiAgICAgICAgICAgIHNpbVNvdXJjZS5wdWxzZV9kZWxheSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gc2ltU291cmNlLnB1bHNlX2RlbGF5IC8gMTAwMFxuICAgICAgICAgICAgICA6IDBcbiAgICAgICAgICBjb25zdCByaXNlX3RpbWUgPVxuICAgICAgICAgICAgc2ltU291cmNlLnJpc2VfdGltZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gZm9ybWF0U2Vjb25kc0ZvclNwaWNlKHNpbVNvdXJjZS5yaXNlX3RpbWUgLyAxMDAwKVxuICAgICAgICAgICAgICA6IFwiMW5cIlxuICAgICAgICAgIGNvbnN0IGZhbGxfdGltZSA9XG4gICAgICAgICAgICBzaW1Tb3VyY2UuZmFsbF90aW1lICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBmb3JtYXRTZWNvbmRzRm9yU3BpY2Uoc2ltU291cmNlLmZhbGxfdGltZSAvIDEwMDApXG4gICAgICAgICAgICAgIDogXCIxblwiXG4gICAgICAgICAgY29uc3QgcHVsc2VXaWR0aFRleHQgPSBoYXNFeHBsaWNpdFB1bHNlV2lkdGhcbiAgICAgICAgICAgID8gZm9ybWF0U2Vjb25kc0ZvclNwaWNlKHNpbVNvdXJjZS5wdWxzZV93aWR0aCEgLyAxMDAwKVxuICAgICAgICAgICAgOiBmb3JtYXRTZWNvbmRzRm9yU3BpY2UocHVsc2Vfd2lkdGgpXG4gICAgICAgICAgY29uc3QgcGVyaW9kVGV4dCA9IGZvcm1hdFNlY29uZHNGb3JTcGljZShwZXJpb2QpXG4gICAgICAgICAgdmFsdWUgPSBgUFVMU0UoJHt2X2luaXRpYWx9ICR7dl9wdWxzZWR9ICR7Zm9ybWF0U2Vjb25kc0ZvclNwaWNlKGRlbGF5KX0gJHtyaXNlX3RpbWV9ICR7ZmFsbF90aW1lfSAke3B1bHNlV2lkdGhUZXh0fSAke3BlcmlvZFRleHR9KWBcbiAgICAgICAgfSBlbHNlIGlmIChzaW1Tb3VyY2Uudm9sdGFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFsdWUgPSBgREMgJHtzaW1Tb3VyY2Uudm9sdGFnZX1gXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBjb25zdCB2b2x0YWdlU291cmNlQ21kID0gbmV3IFZvbHRhZ2VTb3VyY2VDb21tYW5kKHtcbiAgICAgICAgICAgIG5hbWU6IHNpbVNvdXJjZS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlX2lkLFxuICAgICAgICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgICAgICAgbmVnYXRpdmVOb2RlLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGNvbnN0IHNwaWNlQ29tcG9uZW50ID0gbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICAgICAgc2ltU291cmNlLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2VfaWQsXG4gICAgICAgICAgICB2b2x0YWdlU291cmNlQ21kLFxuICAgICAgICAgICAgW3Bvc2l0aXZlTm9kZSwgbmVnYXRpdmVOb2RlXSxcbiAgICAgICAgICApXG4gICAgICAgICAgbmV0bGlzdC5hZGRDb21wb25lbnQoc3BpY2VDb21wb25lbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gREMgU291cmNlIChpc19kY19zb3VyY2UgaXMgdHJ1ZSBvciB1bmRlZmluZWQpXG4gICAgICAvLyBGYWxsIGJhY2sgdG8gdGVybWluYWwxL3Rlcm1pbmFsMiAodGhlIEFDIHBhdGggYWxyZWFkeSB1c2VzIHRoZXNlKSBzbyBhXG4gICAgICAvLyBEQyBzb3VyY2UgdGhhdCBvbmx5IGhhcyB0ZXJtaW5hbCBwb3J0IGlkcyBpc24ndCBzaWxlbnRseSBkcm9wcGVkLlxuICAgICAgY29uc3QgcG9zaXRpdmVQb3J0SWQgPVxuICAgICAgICBzaW1Tb3VyY2UucG9zaXRpdmVfc291cmNlX3BvcnRfaWQgPz9cbiAgICAgICAgKHNpbVNvdXJjZSBhcyBhbnkpLnRlcm1pbmFsMV9zb3VyY2VfcG9ydF9pZFxuICAgICAgY29uc3QgbmVnYXRpdmVQb3J0SWQgPVxuICAgICAgICBzaW1Tb3VyY2UubmVnYXRpdmVfc291cmNlX3BvcnRfaWQgPz9cbiAgICAgICAgKHNpbVNvdXJjZSBhcyBhbnkpLnRlcm1pbmFsMl9zb3VyY2VfcG9ydF9pZFxuXG4gICAgICBpZiAoXG4gICAgICAgIHBvc2l0aXZlUG9ydElkICYmXG4gICAgICAgIG5lZ2F0aXZlUG9ydElkICYmXG4gICAgICAgIFwidm9sdGFnZVwiIGluIHNpbVNvdXJjZSAmJlxuICAgICAgICBzaW1Tb3VyY2Uudm9sdGFnZSAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcG9zaXRpdmVOb2RlID0gbm9kZU1hcC5nZXQocG9zaXRpdmVQb3J0SWQpIHx8IFwiMFwiXG4gICAgICAgIGNvbnN0IG5lZ2F0aXZlTm9kZSA9IG5vZGVNYXAuZ2V0KG5lZ2F0aXZlUG9ydElkKSB8fCBcIjBcIlxuXG4gICAgICAgIGNvbnN0IHZvbHRhZ2VTb3VyY2VDbWQgPSBuZXcgVm9sdGFnZVNvdXJjZUNvbW1hbmQoe1xuICAgICAgICAgIG5hbWU6IHNpbVNvdXJjZS5zaW11bGF0aW9uX3ZvbHRhZ2Vfc291cmNlX2lkLFxuICAgICAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgICAgICBuZWdhdGl2ZU5vZGUsXG4gICAgICAgICAgdmFsdWU6IGBEQyAkeyhzaW1Tb3VyY2UgYXMgYW55KS52b2x0YWdlfWAsXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3Qgc3BpY2VDb21wb25lbnQgPSBuZXcgU3BpY2VDb21wb25lbnQoXG4gICAgICAgICAgc2ltU291cmNlLnNpbXVsYXRpb25fdm9sdGFnZV9zb3VyY2VfaWQsXG4gICAgICAgICAgdm9sdGFnZVNvdXJjZUNtZCxcbiAgICAgICAgICBbcG9zaXRpdmVOb2RlLCBuZWdhdGl2ZU5vZGVdLFxuICAgICAgICApXG4gICAgICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KHNwaWNlQ29tcG9uZW50KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQW55Q2lyY3VpdEVsZW1lbnQgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBDdXJyZW50U291cmNlQ29tbWFuZCB9IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc1NpbXVsYXRpb25DdXJyZW50U291cmNlcyA9IChcbiAgbmV0bGlzdDogU3BpY2VOZXRsaXN0LFxuICBzaW11bGF0aW9uQ3VycmVudFNvdXJjZXM6IEFueUNpcmN1aXRFbGVtZW50W10sXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4pID0+IHtcbiAgZm9yIChjb25zdCBzaW1Tb3VyY2Ugb2Ygc2ltdWxhdGlvbkN1cnJlbnRTb3VyY2VzKSB7XG4gICAgaWYgKHNpbVNvdXJjZS50eXBlICE9PSBcInNpbXVsYXRpb25fY3VycmVudF9zb3VyY2VcIikgY29udGludWVcblxuICAgIGlmIChzaW1Tb3VyY2UuaXNfZGNfc291cmNlID09PSBmYWxzZSkge1xuICAgICAgLy8gQUMvUFVMU0UgU291cmNlXG4gICAgICBjb25zdCBwb3NpdGl2ZVBvcnRJZCA9IHNpbVNvdXJjZS50ZXJtaW5hbDFfc291cmNlX3BvcnRfaWRcbiAgICAgIGNvbnN0IG5lZ2F0aXZlUG9ydElkID0gc2ltU291cmNlLnRlcm1pbmFsMl9zb3VyY2VfcG9ydF9pZFxuXG4gICAgICBpZiAocG9zaXRpdmVQb3J0SWQgJiYgbmVnYXRpdmVQb3J0SWQpIHtcbiAgICAgICAgY29uc3QgcG9zaXRpdmVOb2RlID0gbm9kZU1hcC5nZXQocG9zaXRpdmVQb3J0SWQpIHx8IFwiMFwiXG4gICAgICAgIGNvbnN0IG5lZ2F0aXZlTm9kZSA9IG5vZGVNYXAuZ2V0KG5lZ2F0aXZlUG9ydElkKSB8fCBcIjBcIlxuXG4gICAgICAgIGxldCB2YWx1ZSA9IFwiXCJcbiAgICAgICAgY29uc3Qgd2F2ZV9zaGFwZSA9IHNpbVNvdXJjZS53YXZlX3NoYXBlXG4gICAgICAgIGlmICh3YXZlX3NoYXBlID09PSBcInNpbmV3YXZlXCIpIHtcbiAgICAgICAgICBjb25zdCBpX29mZnNldCA9IDAgLy8gbm90IHByb3ZpZGVkXG4gICAgICAgICAgY29uc3QgaV9wZWFrID0gKHNpbVNvdXJjZS5wZWFrX3RvX3BlYWtfY3VycmVudCA/PyAwKSAvIDJcbiAgICAgICAgICBjb25zdCBmcmVxID0gc2ltU291cmNlLmZyZXF1ZW5jeSA/PyAwXG4gICAgICAgICAgY29uc3QgZGVsYXkgPSAwXG4gICAgICAgICAgY29uc3QgZGFtcGluZ19mYWN0b3IgPSAwXG4gICAgICAgICAgY29uc3QgcGhhc2UgPSBzaW1Tb3VyY2UucGhhc2UgPz8gMFxuICAgICAgICAgIGlmIChmcmVxID4gMCkge1xuICAgICAgICAgICAgdmFsdWUgPSBgU0lOKCR7aV9vZmZzZXR9ICR7aV9wZWFrfSAke2ZyZXF9ICR7ZGVsYXl9ICR7ZGFtcGluZ19mYWN0b3J9ICR7cGhhc2V9KWBcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBgREMgJHtpX3BlYWt9YFxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh3YXZlX3NoYXBlID09PSBcInNxdWFyZVwiKSB7XG4gICAgICAgICAgY29uc3QgaV9pbml0aWFsID0gMFxuICAgICAgICAgIGNvbnN0IGlfcHVsc2VkID0gc2ltU291cmNlLnBlYWtfdG9fcGVha19jdXJyZW50ID8/IDBcbiAgICAgICAgICBjb25zdCBmcmVxID0gc2ltU291cmNlLmZyZXF1ZW5jeSA/PyAwXG4gICAgICAgICAgY29uc3QgcGVyaW9kX2Zyb21fZnJlcSA9IGZyZXEgPT09IDAgPyBJbmZpbml0eSA6IDEgLyBmcmVxXG4gICAgICAgICAgY29uc3QgcGVyaW9kID0gcGVyaW9kX2Zyb21fZnJlcVxuICAgICAgICAgIGNvbnN0IGR1dHlfY3ljbGUgPSBzaW1Tb3VyY2UuZHV0eV9jeWNsZSA/PyAwLjVcbiAgICAgICAgICBjb25zdCBwdWxzZV93aWR0aCA9IHBlcmlvZCAqIGR1dHlfY3ljbGVcbiAgICAgICAgICBjb25zdCBkZWxheSA9IDBcbiAgICAgICAgICBjb25zdCByaXNlX3RpbWUgPSBcIjFuXCJcbiAgICAgICAgICBjb25zdCBmYWxsX3RpbWUgPSBcIjFuXCJcbiAgICAgICAgICB2YWx1ZSA9IGBQVUxTRSgke2lfaW5pdGlhbH0gJHtpX3B1bHNlZH0gJHtkZWxheX0gJHtyaXNlX3RpbWV9ICR7ZmFsbF90aW1lfSAke3B1bHNlX3dpZHRofSAke3BlcmlvZH0pYFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFNvdXJjZUNtZCA9IG5ldyBDdXJyZW50U291cmNlQ29tbWFuZCh7XG4gICAgICAgICAgICBuYW1lOiBzaW1Tb3VyY2Uuc2ltdWxhdGlvbl9jdXJyZW50X3NvdXJjZV9pZCxcbiAgICAgICAgICAgIHBvc2l0aXZlTm9kZSxcbiAgICAgICAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBjb25zdCBzcGljZUNvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICAgICAgICAgIHNpbVNvdXJjZS5zaW11bGF0aW9uX2N1cnJlbnRfc291cmNlX2lkLFxuICAgICAgICAgICAgY3VycmVudFNvdXJjZUNtZCxcbiAgICAgICAgICAgIFtwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZV0sXG4gICAgICAgICAgKVxuICAgICAgICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KHNwaWNlQ29tcG9uZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERDIFNvdXJjZVxuICAgICAgY29uc3QgcG9zaXRpdmVQb3J0SWQgPSBzaW1Tb3VyY2UucG9zaXRpdmVfc291cmNlX3BvcnRfaWRcbiAgICAgIGNvbnN0IG5lZ2F0aXZlUG9ydElkID0gc2ltU291cmNlLm5lZ2F0aXZlX3NvdXJjZV9wb3J0X2lkXG5cbiAgICAgIGlmIChcbiAgICAgICAgcG9zaXRpdmVQb3J0SWQgJiZcbiAgICAgICAgbmVnYXRpdmVQb3J0SWQgJiZcbiAgICAgICAgXCJjdXJyZW50XCIgaW4gc2ltU291cmNlICYmXG4gICAgICAgIHNpbVNvdXJjZS5jdXJyZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwb3NpdGl2ZU5vZGUgPSBub2RlTWFwLmdldChwb3NpdGl2ZVBvcnRJZCkgfHwgXCIwXCJcbiAgICAgICAgY29uc3QgbmVnYXRpdmVOb2RlID0gbm9kZU1hcC5nZXQobmVnYXRpdmVQb3J0SWQpIHx8IFwiMFwiXG5cbiAgICAgICAgY29uc3QgY3VycmVudFNvdXJjZUNtZCA9IG5ldyBDdXJyZW50U291cmNlQ29tbWFuZCh7XG4gICAgICAgICAgbmFtZTogc2ltU291cmNlLnNpbXVsYXRpb25fY3VycmVudF9zb3VyY2VfaWQsXG4gICAgICAgICAgcG9zaXRpdmVOb2RlLFxuICAgICAgICAgIG5lZ2F0aXZlTm9kZSxcbiAgICAgICAgICB2YWx1ZTogYERDICR7c2ltU291cmNlLmN1cnJlbnR9YCxcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBzcGljZUNvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICAgICAgICBzaW1Tb3VyY2Uuc2ltdWxhdGlvbl9jdXJyZW50X3NvdXJjZV9pZCxcbiAgICAgICAgICBjdXJyZW50U291cmNlQ21kLFxuICAgICAgICAgIFtwb3NpdGl2ZU5vZGUsIG5lZ2F0aXZlTm9kZV0sXG4gICAgICAgIClcbiAgICAgICAgbmV0bGlzdC5hZGRDb21wb25lbnQoc3BpY2VDb21wb25lbnQpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUge1xuICBTaW11bGF0aW9uQ3VycmVudFByb2JlLFxuICBTaW11bGF0aW9uRXhwZXJpbWVudCxcbiAgU2ltdWxhdGlvblZvbHRhZ2VQcm9iZSxcbiAgU291cmNlVHJhY2UsXG59IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHR5cGUgeyBTcGljZU5ldGxpc3QgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcbmltcG9ydCB7IFZvbHRhZ2VTb3VyY2VDb21tYW5kIH0gZnJvbSBcImxpYi9zcGljZS1jb21tYW5kc1wiXG5pbXBvcnQgeyBmb3JtYXROdW1iZXJGb3JTcGljZSwgc2FuaXRpemVJZGVudGlmaWVyIH0gZnJvbSBcIi4vaGVscGVyc1wiXG5cbmNvbnN0IHNwaWNlT3B0aW9uT3JkZXIgPSBbXCJtZXRob2RcIiwgXCJyZWx0b2xcIiwgXCJhYnN0b2xcIiwgXCJ2bnRvbFwiXSBhcyBjb25zdFxuXG5pbnRlcmZhY2UgVm9sdGFnZVByb2JlVmVjdG9yTWFwcGluZyB7XG4gIHNpbXVsYXRpb25fdm9sdGFnZV9wcm9iZV9pZDogc3RyaW5nXG4gIG5hbWU/OiBzdHJpbmdcbiAgc3BpY2VfdmVjdG9yOiBzdHJpbmdcbiAgc291cmNlX25vZGVfbmFtZTogc3RyaW5nXG4gIHJlZmVyZW5jZV9ub2RlX25hbWU/OiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIEN1cnJlbnRQcm9iZVZlY3Rvck1hcHBpbmcge1xuICBzaW11bGF0aW9uX2N1cnJlbnRfcHJvYmVfaWQ6IHN0cmluZ1xuICBuYW1lPzogc3RyaW5nXG4gIHNwaWNlX3ZlY3Rvcjogc3RyaW5nXG4gIHNlbnNlX3ZvbHRhZ2Vfc291cmNlX25hbWU6IHN0cmluZ1xuICBwb3NpdGl2ZV9ub2RlX25hbWU6IHN0cmluZ1xuICBuZWdhdGl2ZV9ub2RlX25hbWU6IHN0cmluZ1xufVxuXG5jb25zdCBnZXRQb3J0SWRGcm9tTmV0SWQgPSAoc291cmNlVHJhY2VzOiBTb3VyY2VUcmFjZVtdLCBuZXRJZDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHRyYWNlID0gc291cmNlVHJhY2VzLmZpbmQoKHQpID0+XG4gICAgdC5jb25uZWN0ZWRfc291cmNlX25ldF9pZHMuaW5jbHVkZXMobmV0SWQpLFxuICApXG4gIHJldHVybiB0cmFjZT8uY29ubmVjdGVkX3NvdXJjZV9wb3J0X2lkc1swXVxufVxuXG5jb25zdCByZXNvbHZlTm9kZU5hbWVGcm9tU291cmNlUG9ydE9yTmV0ID0gKHtcbiAgc291cmNlUG9ydElkLFxuICBzb3VyY2VOZXRJZCxcbiAgc291cmNlVHJhY2VzLFxuICBub2RlTWFwLFxufToge1xuICBzb3VyY2VQb3J0SWQ/OiBzdHJpbmdcbiAgc291cmNlTmV0SWQ/OiBzdHJpbmdcbiAgc291cmNlVHJhY2VzOiBTb3VyY2VUcmFjZVtdXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz5cbn0pID0+IHtcbiAgaWYgKHNvdXJjZVBvcnRJZCkge1xuICAgIHJldHVybiBub2RlTWFwLmdldChzb3VyY2VQb3J0SWQpXG4gIH1cblxuICBpZiAoIXNvdXJjZU5ldElkKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3Qgc291cmNlUG9ydElkRnJvbU5ldCA9IGdldFBvcnRJZEZyb21OZXRJZChzb3VyY2VUcmFjZXMsIHNvdXJjZU5ldElkKVxuICBpZiAoIXNvdXJjZVBvcnRJZEZyb21OZXQpIHJldHVybiB1bmRlZmluZWRcblxuICByZXR1cm4gbm9kZU1hcC5nZXQoc291cmNlUG9ydElkRnJvbU5ldClcbn1cblxuY29uc3QgZ2V0U2Vuc2VWb2x0YWdlU291cmNlTmFtZSA9IChwcm9iZTogU2ltdWxhdGlvbkN1cnJlbnRQcm9iZSkgPT5cbiAgc2FuaXRpemVJZGVudGlmaWVyKFxuICAgIGBzZW5zZV8ke3Byb2JlLnNpbXVsYXRpb25fY3VycmVudF9wcm9iZV9pZH1gLFxuICAgIFwic2Vuc2VfY3VycmVudF9wcm9iZVwiLFxuICApXG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzU2ltdWxhdGlvbkV4cGVyaW1lbnQgPSAoXG4gIG5ldGxpc3Q6IFNwaWNlTmV0bGlzdCxcbiAgc2ltRXhwZXJpbWVudDogU2ltdWxhdGlvbkV4cGVyaW1lbnQsXG4gIHNpbXVsYXRpb25Qcm9iZXM6IFNpbXVsYXRpb25Wb2x0YWdlUHJvYmVbXSxcbiAgc2ltdWxhdGlvbkN1cnJlbnRQcm9iZXM6IFNpbXVsYXRpb25DdXJyZW50UHJvYmVbXSxcbiAgc291cmNlVHJhY2VzOiBTb3VyY2VUcmFjZVtdLFxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKSA9PiB7XG4gIGlmICghc2ltRXhwZXJpbWVudCkgcmV0dXJuXG5cbiAgY29uc3QgaXNUcmFuc2llbnRFeHBlcmltZW50ID1cbiAgICBzaW1FeHBlcmltZW50LmV4cGVyaW1lbnRfdHlwZT8uaW5jbHVkZXMoXCJ0cmFuc2llbnRcIikgPz8gZmFsc2VcbiAgY29uc3QgdHJhbnNpZW50UHJvYmVWZWN0b3JzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICBjb25zdCBzcGljZU9wdGlvbnMgPSBzaW1FeHBlcmltZW50LnNwaWNlX29wdGlvbnNcbiAgaWYgKHNwaWNlT3B0aW9ucykge1xuICAgIGNvbnN0IG9wdGlvblBhcnRzID0gc3BpY2VPcHRpb25PcmRlclxuICAgICAgLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3BpY2VPcHRpb25zW2tleV1cbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogYCR7a2V5fT0ke3ZhbHVlfWBcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChwYXJ0KTogcGFydCBpcyBzdHJpbmcgPT4gcGFydCAhPT0gbnVsbClcblxuICAgIGlmIChvcHRpb25QYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgICBuZXRsaXN0Lm9wdGlvblN0YXRlbWVudHMucHVzaChgLm9wdGlvbnMgJHtvcHRpb25QYXJ0cy5qb2luKFwiIFwiKX1gKVxuICAgIH1cbiAgfVxuXG4gIC8vIFByb2Nlc3Mgc2ltdWxhdGlvbiB2b2x0YWdlIHByb2Jlc1xuICBpZiAoc2ltdWxhdGlvblByb2Jlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcHJvYmVWZWN0b3JNYXBwaW5nczogVm9sdGFnZVByb2JlVmVjdG9yTWFwcGluZ1tdID0gW11cblxuICAgIGZvciAoY29uc3QgcHJvYmUgb2Ygc2ltdWxhdGlvblByb2Jlcykge1xuICAgICAgY29uc3Qgc2lnbmFsTm9kZU5hbWUgPSByZXNvbHZlTm9kZU5hbWVGcm9tU291cmNlUG9ydE9yTmV0KHtcbiAgICAgICAgc291cmNlUG9ydElkOiBwcm9iZS5zaWduYWxfaW5wdXRfc291cmNlX3BvcnRfaWQsXG4gICAgICAgIHNvdXJjZU5ldElkOiBwcm9iZS5zaWduYWxfaW5wdXRfc291cmNlX25ldF9pZCxcbiAgICAgICAgc291cmNlVHJhY2VzLFxuICAgICAgICBub2RlTWFwLFxuICAgICAgfSlcbiAgICAgIGlmICghc2lnbmFsTm9kZU5hbWUpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGhhc1JlZmVyZW5jZSA9XG4gICAgICAgIHByb2JlLnJlZmVyZW5jZV9pbnB1dF9zb3VyY2VfcG9ydF9pZCB8fFxuICAgICAgICBwcm9iZS5yZWZlcmVuY2VfaW5wdXRfc291cmNlX25ldF9pZFxuXG4gICAgICBpZiAoaGFzUmVmZXJlbmNlKSB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZU5vZGVOYW1lID0gcmVzb2x2ZU5vZGVOYW1lRnJvbVNvdXJjZVBvcnRPck5ldCh7XG4gICAgICAgICAgc291cmNlUG9ydElkOiBwcm9iZS5yZWZlcmVuY2VfaW5wdXRfc291cmNlX3BvcnRfaWQsXG4gICAgICAgICAgc291cmNlTmV0SWQ6IHByb2JlLnJlZmVyZW5jZV9pbnB1dF9zb3VyY2VfbmV0X2lkLFxuICAgICAgICAgIHNvdXJjZVRyYWNlcyxcbiAgICAgICAgICBub2RlTWFwLFxuICAgICAgICB9KVxuICAgICAgICBpZiAocmVmZXJlbmNlTm9kZU5hbWUgJiYgcmVmZXJlbmNlTm9kZU5hbWUgIT09IFwiMFwiKSB7XG4gICAgICAgICAgY29uc3Qgc3BpY2VWZWN0b3IgPSBgVigke3NpZ25hbE5vZGVOYW1lfSwke3JlZmVyZW5jZU5vZGVOYW1lfSlgXG4gICAgICAgICAgdHJhbnNpZW50UHJvYmVWZWN0b3JzLmFkZChzcGljZVZlY3RvcilcbiAgICAgICAgICBwcm9iZVZlY3Rvck1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgc2ltdWxhdGlvbl92b2x0YWdlX3Byb2JlX2lkOiBwcm9iZS5zaW11bGF0aW9uX3ZvbHRhZ2VfcHJvYmVfaWQsXG4gICAgICAgICAgICBuYW1lOiBwcm9iZS5uYW1lLFxuICAgICAgICAgICAgc3BpY2VfdmVjdG9yOiBzcGljZVZlY3RvcixcbiAgICAgICAgICAgIHNvdXJjZV9ub2RlX25hbWU6IHNpZ25hbE5vZGVOYW1lLFxuICAgICAgICAgICAgcmVmZXJlbmNlX25vZGVfbmFtZTogcmVmZXJlbmNlTm9kZU5hbWUsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChzaWduYWxOb2RlTmFtZSAhPT0gXCIwXCIpIHtcbiAgICAgICAgICBjb25zdCBzcGljZVZlY3RvciA9IGBWKCR7c2lnbmFsTm9kZU5hbWV9KWBcbiAgICAgICAgICB0cmFuc2llbnRQcm9iZVZlY3RvcnMuYWRkKHNwaWNlVmVjdG9yKVxuICAgICAgICAgIHByb2JlVmVjdG9yTWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICBzaW11bGF0aW9uX3ZvbHRhZ2VfcHJvYmVfaWQ6IHByb2JlLnNpbXVsYXRpb25fdm9sdGFnZV9wcm9iZV9pZCxcbiAgICAgICAgICAgIG5hbWU6IHByb2JlLm5hbWUsXG4gICAgICAgICAgICBzcGljZV92ZWN0b3I6IHNwaWNlVmVjdG9yLFxuICAgICAgICAgICAgc291cmNlX25vZGVfbmFtZTogc2lnbmFsTm9kZU5hbWUsXG4gICAgICAgICAgICByZWZlcmVuY2Vfbm9kZV9uYW1lOiByZWZlcmVuY2VOb2RlTmFtZSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaW5nbGUtZW5kZWQgcHJvYmVcbiAgICAgICAgaWYgKHNpZ25hbE5vZGVOYW1lICE9PSBcIjBcIikge1xuICAgICAgICAgIGNvbnN0IHNwaWNlVmVjdG9yID0gYFYoJHtzaWduYWxOb2RlTmFtZX0pYFxuICAgICAgICAgIHRyYW5zaWVudFByb2JlVmVjdG9ycy5hZGQoc3BpY2VWZWN0b3IpXG4gICAgICAgICAgcHJvYmVWZWN0b3JNYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIHNpbXVsYXRpb25fdm9sdGFnZV9wcm9iZV9pZDogcHJvYmUuc2ltdWxhdGlvbl92b2x0YWdlX3Byb2JlX2lkLFxuICAgICAgICAgICAgbmFtZTogcHJvYmUubmFtZSxcbiAgICAgICAgICAgIHNwaWNlX3ZlY3Rvcjogc3BpY2VWZWN0b3IsXG4gICAgICAgICAgICBzb3VyY2Vfbm9kZV9uYW1lOiBzaWduYWxOb2RlTmFtZSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHByb2JlVmVjdG9yTWFwcGluZ3MubGVuZ3RoID4gMCAmJiBpc1RyYW5zaWVudEV4cGVyaW1lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgbWFwcGluZyBvZiBwcm9iZVZlY3Rvck1hcHBpbmdzKSB7XG4gICAgICAgIG5ldGxpc3QubWV0YWRhdGFDb21tZW50cy5wdXNoKFxuICAgICAgICAgIGAqIHRzY2lyY3VpdF9wcm9iZSAke0pTT04uc3RyaW5naWZ5KG1hcHBpbmcpfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDdXJyZW50IHByb2JlcyBhcmUgaW5saW5lIGFtbWV0ZXIgZWxlbWVudHMsIHNvIHRoZSAwViBzZW5zZSBzb3VyY2UgaXMgcGFydFxuICAvLyBvZiB0aGUgc2ltdWxhdGVkIHRvcG9sb2d5IGV2ZW4gd2hlbiB0aGUgZXhwZXJpbWVudCBkb2VzIG5vdCBwcmludCBjdXJyZW50LlxuICBpZiAoc2ltdWxhdGlvbkN1cnJlbnRQcm9iZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHNlbnNlVm9sdGFnZVNvdXJjZU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgICBjb25zdCBjdXJyZW50UHJvYmVWZWN0b3JNYXBwaW5nczogQ3VycmVudFByb2JlVmVjdG9yTWFwcGluZ1tdID0gW11cblxuICAgIGZvciAoY29uc3QgcHJvYmUgb2Ygc2ltdWxhdGlvbkN1cnJlbnRQcm9iZXMpIHtcbiAgICAgIGNvbnN0IHBvc2l0aXZlTm9kZU5hbWUgPSByZXNvbHZlTm9kZU5hbWVGcm9tU291cmNlUG9ydE9yTmV0KHtcbiAgICAgICAgc291cmNlUG9ydElkOiBwcm9iZS5wb3NpdGl2ZV9zb3VyY2VfcG9ydF9pZCxcbiAgICAgICAgc291cmNlTmV0SWQ6IHByb2JlLnBvc2l0aXZlX3NvdXJjZV9uZXRfaWQsXG4gICAgICAgIHNvdXJjZVRyYWNlcyxcbiAgICAgICAgbm9kZU1hcCxcbiAgICAgIH0pXG4gICAgICBjb25zdCBuZWdhdGl2ZU5vZGVOYW1lID0gcmVzb2x2ZU5vZGVOYW1lRnJvbVNvdXJjZVBvcnRPck5ldCh7XG4gICAgICAgIHNvdXJjZVBvcnRJZDogcHJvYmUubmVnYXRpdmVfc291cmNlX3BvcnRfaWQsXG4gICAgICAgIHNvdXJjZU5ldElkOiBwcm9iZS5uZWdhdGl2ZV9zb3VyY2VfbmV0X2lkLFxuICAgICAgICBzb3VyY2VUcmFjZXMsXG4gICAgICAgIG5vZGVNYXAsXG4gICAgICB9KVxuXG4gICAgICBpZiAoIXBvc2l0aXZlTm9kZU5hbWUgfHwgIW5lZ2F0aXZlTm9kZU5hbWUpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IHNlbnNlVm9sdGFnZVNvdXJjZUJhc2VOYW1lID0gZ2V0U2Vuc2VWb2x0YWdlU291cmNlTmFtZShwcm9iZSlcbiAgICAgIGxldCBzZW5zZVZvbHRhZ2VTb3VyY2VOYW1lID0gc2Vuc2VWb2x0YWdlU291cmNlQmFzZU5hbWVcbiAgICAgIGxldCBkdXBsaWNhdGVJbmRleCA9IDJcbiAgICAgIHdoaWxlIChzZW5zZVZvbHRhZ2VTb3VyY2VOYW1lcy5oYXMoc2Vuc2VWb2x0YWdlU291cmNlTmFtZSkpIHtcbiAgICAgICAgc2Vuc2VWb2x0YWdlU291cmNlTmFtZSA9IGAke3NlbnNlVm9sdGFnZVNvdXJjZUJhc2VOYW1lfV8ke2R1cGxpY2F0ZUluZGV4Kyt9YFxuICAgICAgfVxuICAgICAgc2Vuc2VWb2x0YWdlU291cmNlTmFtZXMuYWRkKHNlbnNlVm9sdGFnZVNvdXJjZU5hbWUpXG5cbiAgICAgIGNvbnN0IHNwaWNlU2Vuc2VWb2x0YWdlU291cmNlTmFtZSA9IGBWJHtzZW5zZVZvbHRhZ2VTb3VyY2VOYW1lfWBcbiAgICAgIGNvbnN0IHNwaWNlVmVjdG9yID0gYEkoJHtzcGljZVNlbnNlVm9sdGFnZVNvdXJjZU5hbWV9KWBcbiAgICAgIGNvbnN0IHZvbHRhZ2VTb3VyY2VDbWQgPSBuZXcgVm9sdGFnZVNvdXJjZUNvbW1hbmQoe1xuICAgICAgICBuYW1lOiBzZW5zZVZvbHRhZ2VTb3VyY2VOYW1lLFxuICAgICAgICBwb3NpdGl2ZU5vZGU6IHBvc2l0aXZlTm9kZU5hbWUsXG4gICAgICAgIG5lZ2F0aXZlTm9kZTogbmVnYXRpdmVOb2RlTmFtZSxcbiAgICAgICAgdmFsdWU6IFwiREMgMFwiLFxuICAgICAgfSlcblxuICAgICAgbmV0bGlzdC5hZGRDb21wb25lbnQoXG4gICAgICAgIG5ldyBTcGljZUNvbXBvbmVudChzZW5zZVZvbHRhZ2VTb3VyY2VOYW1lLCB2b2x0YWdlU291cmNlQ21kLCBbXG4gICAgICAgICAgcG9zaXRpdmVOb2RlTmFtZSxcbiAgICAgICAgICBuZWdhdGl2ZU5vZGVOYW1lLFxuICAgICAgICBdKSxcbiAgICAgIClcblxuICAgICAgaWYgKGlzVHJhbnNpZW50RXhwZXJpbWVudCkge1xuICAgICAgICB0cmFuc2llbnRQcm9iZVZlY3RvcnMuYWRkKHNwaWNlVmVjdG9yKVxuICAgICAgfVxuICAgICAgY3VycmVudFByb2JlVmVjdG9yTWFwcGluZ3MucHVzaCh7XG4gICAgICAgIHNpbXVsYXRpb25fY3VycmVudF9wcm9iZV9pZDogcHJvYmUuc2ltdWxhdGlvbl9jdXJyZW50X3Byb2JlX2lkLFxuICAgICAgICBuYW1lOiBwcm9iZS5uYW1lLFxuICAgICAgICBzcGljZV92ZWN0b3I6IHNwaWNlVmVjdG9yLFxuICAgICAgICBzZW5zZV92b2x0YWdlX3NvdXJjZV9uYW1lOiBzcGljZVNlbnNlVm9sdGFnZVNvdXJjZU5hbWUsXG4gICAgICAgIHBvc2l0aXZlX25vZGVfbmFtZTogcG9zaXRpdmVOb2RlTmFtZSxcbiAgICAgICAgbmVnYXRpdmVfbm9kZV9uYW1lOiBuZWdhdGl2ZU5vZGVOYW1lLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFByb2JlVmVjdG9yTWFwcGluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBtYXBwaW5nIG9mIGN1cnJlbnRQcm9iZVZlY3Rvck1hcHBpbmdzKSB7XG4gICAgICAgIG5ldGxpc3QubWV0YWRhdGFDb21tZW50cy5wdXNoKFxuICAgICAgICAgIGAqIHRzY2lyY3VpdF9jdXJyZW50X3Byb2JlICR7SlNPTi5zdHJpbmdpZnkobWFwcGluZyl9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0cmFuc2llbnRQcm9iZVZlY3RvcnMuc2l6ZSA+IDAgJiYgaXNUcmFuc2llbnRFeHBlcmltZW50KSB7XG4gICAgY29uc3QgcHJvYmVWZWN0b3JzID0gWy4uLnRyYW5zaWVudFByb2JlVmVjdG9yc10uam9pbihcIiBcIilcbiAgICBuZXRsaXN0LnByaW50U3RhdGVtZW50cy5wdXNoKGAuUFJJTlQgVFJBTiAke3Byb2JlVmVjdG9yc31gKVxuICAgIG5ldGxpc3Quc2F2ZVN0YXRlbWVudHMucHVzaChgLlNBVkUgJHtwcm9iZVZlY3RvcnN9YClcbiAgfVxuXG4gIGNvbnN0IHRpbWVQZXJTdGVwID0gc2ltRXhwZXJpbWVudC50aW1lX3Blcl9zdGVwXG4gIGNvbnN0IGVuZFRpbWUgPSBzaW1FeHBlcmltZW50LmVuZF90aW1lX21zXG4gIGNvbnN0IHN0YXJ0VGltZU1zID0gc2ltRXhwZXJpbWVudC5zdGFydF90aW1lX21zXG5cbiAgaWYgKHRpbWVQZXJTdGVwICYmIGVuZFRpbWUpIHtcbiAgICAvLyBjaXJjdWl0LWpzb24gdmFsdWVzIGFyZSBpbiBtcywgU1BJQ0UgcmVxdWlyZXMgc2Vjb25kc1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IChzdGFydFRpbWVNcyA/PyAwKSAvIDEwMDBcblxuICAgIGxldCB0cmFuQ21kID0gYC50cmFuICR7Zm9ybWF0TnVtYmVyRm9yU3BpY2UoXG4gICAgICB0aW1lUGVyU3RlcCAvIDEwMDAsXG4gICAgKX0gJHtmb3JtYXROdW1iZXJGb3JTcGljZShlbmRUaW1lIC8gMTAwMCl9YFxuICAgIGlmIChzdGFydFRpbWUgPiAwKSB7XG4gICAgICB0cmFuQ21kICs9IGAgJHtmb3JtYXROdW1iZXJGb3JTcGljZShzdGFydFRpbWUpfWBcbiAgICB9XG4gICAgdHJhbkNtZCArPSBcIiBVSUNcIlxuICAgIG5ldGxpc3QudHJhbkNvbW1hbmQgPSB0cmFuQ21kXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNpbXVsYXRpb25PcEFtcCB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHsgU3BpY2VDb21wb25lbnQgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VDb21wb25lbnRcIlxuaW1wb3J0IHR5cGUgeyBTcGljZU5ldGxpc3QgfSBmcm9tIFwibGliL3NwaWNlLWNsYXNzZXMvU3BpY2VOZXRsaXN0XCJcbmltcG9ydCB7IFN1YmNpcmN1aXRDYWxsQ29tbWFuZCB9IGZyb20gXCJsaWIvc3BpY2UtY29tbWFuZHNcIlxuXG5jb25zdCBPUEFNUF9TVUJDSVJDVUlUX05BTUUgPSBcIkdFTkVSSUNfT1BBTVBcIlxuY29uc3QgT1BBTVBfU1VCQ0lSQ1VJVF9ERUZJTklUSU9OID0gYFxuLlNVQkNLVCAke09QQU1QX1NVQkNJUkNVSVRfTkFNRX0gbm9uX2ludmVydGluZ19pbnB1dCBpbnZlcnRpbmdfaW5wdXQgcG9zaXRpdmVfc3VwcGx5IG5lZ2F0aXZlX3N1cHBseSBvdXRwdXRcbiogR2VuZXJpYyBPcC1BbXAgTW9kZWxcbkUxIGludGVybmFsX291dHB1dCAwIG5vbl9pbnZlcnRpbmdfaW5wdXQgaW52ZXJ0aW5nX2lucHV0IDEwMGtcblJpbiBub25faW52ZXJ0aW5nX2lucHV0IGludmVydGluZ19pbnB1dCAxME1lZ1xuUm91dCBpbnRlcm5hbF9vdXRwdXQgb3V0cHV0IDc1XG5EMSBvdXRwdXQgcG9zaXRpdmVfc3VwcGx5IG9wYW1wX2Rpb2RlXG5EMiBuZWdhdGl2ZV9zdXBwbHkgb3V0cHV0IG9wYW1wX2Rpb2RlXG4ubW9kZWwgb3BhbXBfZGlvZGUgRFxuLkVORFMgJHtPUEFNUF9TVUJDSVJDVUlUX05BTUV9XG5gLnRyaW0oKVxuXG5leHBvcnQgY29uc3QgcHJvY2Vzc1NpbXVsYXRpb25PcEFtcHMgPSAoXG4gIG5ldGxpc3Q6IFNwaWNlTmV0bGlzdCxcbiAgc2ltdWxhdGlvbk9wQW1wczogU2ltdWxhdGlvbk9wQW1wW10sXG4gIG5vZGVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4pID0+IHtcbiAgaWYgKHNpbXVsYXRpb25PcEFtcHMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBpZiAoIW5ldGxpc3QubW9kZWxzLmhhcyhPUEFNUF9TVUJDSVJDVUlUX05BTUUpKSB7XG4gICAgbmV0bGlzdC5tb2RlbHMuc2V0KE9QQU1QX1NVQkNJUkNVSVRfTkFNRSwgT1BBTVBfU1VCQ0lSQ1VJVF9ERUZJTklUSU9OKVxuICB9XG5cbiAgZm9yIChjb25zdCBzaW1PcEFtcCBvZiBzaW11bGF0aW9uT3BBbXBzKSB7XG4gICAgaWYgKHNpbU9wQW1wLnR5cGUgIT09IFwic2ltdWxhdGlvbl9vcF9hbXBcIikgY29udGludWVcblxuICAgIGNvbnN0IG5vbkludmVydGluZ0lucHV0Tm9kZSA9XG4gICAgICBub2RlTWFwLmdldChzaW1PcEFtcC5ub25faW52ZXJ0aW5nX2lucHV0X3NvdXJjZV9wb3J0X2lkKSA/PyBcIjBcIlxuICAgIGNvbnN0IGludmVydGluZ0lucHV0Tm9kZSA9XG4gICAgICBub2RlTWFwLmdldChzaW1PcEFtcC5pbnZlcnRpbmdfaW5wdXRfc291cmNlX3BvcnRfaWQpID8/IFwiMFwiXG4gICAgY29uc3Qgb3V0cHV0Tm9kZSA9IG5vZGVNYXAuZ2V0KHNpbU9wQW1wLm91dHB1dF9zb3VyY2VfcG9ydF9pZCkgPz8gXCIwXCJcbiAgICBjb25zdCBwb3NpdGl2ZVN1cHBseU5vZGUgPVxuICAgICAgbm9kZU1hcC5nZXQoc2ltT3BBbXAucG9zaXRpdmVfc3VwcGx5X3NvdXJjZV9wb3J0X2lkKSA/PyBcIjBcIlxuICAgIGNvbnN0IG5lZ2F0aXZlU3VwcGx5Tm9kZSA9XG4gICAgICBub2RlTWFwLmdldChzaW1PcEFtcC5uZWdhdGl2ZV9zdXBwbHlfc291cmNlX3BvcnRfaWQpID8/IFwiMFwiXG5cbiAgICBjb25zdCBub2RlcyA9IFtcbiAgICAgIG5vbkludmVydGluZ0lucHV0Tm9kZSxcbiAgICAgIGludmVydGluZ0lucHV0Tm9kZSxcbiAgICAgIHBvc2l0aXZlU3VwcGx5Tm9kZSxcbiAgICAgIG5lZ2F0aXZlU3VwcGx5Tm9kZSxcbiAgICAgIG91dHB1dE5vZGUsXG4gICAgXVxuXG4gICAgY29uc3Qgb3BBbXBDbWQgPSBuZXcgU3ViY2lyY3VpdENhbGxDb21tYW5kKHtcbiAgICAgIG5hbWU6IHNpbU9wQW1wLnNpbXVsYXRpb25fb3BfYW1wX2lkLFxuICAgICAgbm9kZXMsXG4gICAgICBzdWJjaXJjdWl0TmFtZTogT1BBTVBfU1VCQ0lSQ1VJVF9OQU1FLFxuICAgIH0pXG5cbiAgICBjb25zdCBzcGljZUNvbXBvbmVudCA9IG5ldyBTcGljZUNvbXBvbmVudChcbiAgICAgIHNpbU9wQW1wLnNpbXVsYXRpb25fb3BfYW1wX2lkLFxuICAgICAgb3BBbXBDbWQsXG4gICAgICBub2RlcyxcbiAgICApXG4gICAgbmV0bGlzdC5hZGRDb21wb25lbnQoc3BpY2VDb21wb25lbnQpXG4gIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IFNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXQgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB7IFNwaWNlQ29tcG9uZW50IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlQ29tcG9uZW50XCJcbmltcG9ydCB0eXBlIHsgU3BpY2VOZXRsaXN0IH0gZnJvbSBcImxpYi9zcGljZS1jbGFzc2VzL1NwaWNlTmV0bGlzdFwiXG5pbXBvcnQgeyBTdWJjaXJjdWl0Q2FsbENvbW1hbmQgfSBmcm9tIFwibGliL3NwaWNlLWNvbW1hbmRzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3BpY2VTdWJja3QoXG4gIHNvdXJjZTogc3RyaW5nLFxuKTogeyBtb2RlbE5hbWU6IHN0cmluZzsgcGluTmFtZXM6IHN0cmluZ1tdIH0gfCBudWxsIHtcbiAgY29uc3QgbG9naWNhbExpbmVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBwaHlzaWNhbExpbmUgb2Ygc291cmNlLnNwbGl0KC9cXHI/XFxuLykpIHtcbiAgICBjb25zdCB0cmltbWVkTGluZSA9IHBoeXNpY2FsTGluZS50cmltKClcblxuICAgIGlmICgvXlxcKy8udGVzdCh0cmltbWVkTGluZSkgJiYgbG9naWNhbExpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2ljYWxMaW5lc1tsb2dpY2FsTGluZXMubGVuZ3RoIC0gMV0gKz0gYCAke3RyaW1tZWRMaW5lLnNsaWNlKDEpLnRyaW0oKX1gXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGxvZ2ljYWxMaW5lcy5wdXNoKHRyaW1tZWRMaW5lKVxuICB9XG5cbiAgY29uc3QgbGluZSA9IGxvZ2ljYWxMaW5lcy5maW5kKChsaW5lKSA9PiAvXlxcLnN1YmNrdFxccysvaS50ZXN0KGxpbmUpKVxuXG4gIGlmICghbGluZSkgcmV0dXJuIG51bGxcblxuICBjb25zdCB0b2tlbnMgPSBsaW5lLnNwbGl0KC9cXHMrLylcbiAgY29uc3QgbW9kZWxOYW1lID0gdG9rZW5zWzFdXG4gIGNvbnN0IHBpbk5hbWVzID0gdG9rZW5zLnNsaWNlKDIpXG5cbiAgaWYgKCFtb2RlbE5hbWUgfHwgcGluTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbFxuICByZXR1cm4geyBtb2RlbE5hbWUsIHBpbk5hbWVzIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NTaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0cyhcbiAgbmV0bGlzdDogU3BpY2VOZXRsaXN0LFxuICBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0czogU2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdFtdLFxuICBub2RlTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuKSB7XG4gIGlmIChzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0cy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gIGZvciAoY29uc3Qgc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdCBvZiBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0cykge1xuICAgIGNvbnN0IHBhcnNlZFN1YmNrdCA9IHBhcnNlU3BpY2VTdWJja3QoXG4gICAgICBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0LnN1YmNpcmN1aXRfc291cmNlLFxuICAgIClcblxuICAgIGlmICghcGFyc2VkU3ViY2t0KSBjb250aW51ZVxuXG4gICAgY29uc3QgeyBtb2RlbE5hbWUsIHBpbk5hbWVzIH0gPSBwYXJzZWRTdWJja3RcblxuICAgIGlmICghbmV0bGlzdC5tb2RlbHMuaGFzKG1vZGVsTmFtZSkpIHtcbiAgICAgIG5ldGxpc3QubW9kZWxzLnNldChtb2RlbE5hbWUsIHNpbXVsYXRpb25TcGljZVN1YmNpcmN1aXQuc3ViY2lyY3VpdF9zb3VyY2UpXG4gICAgfVxuXG4gICAgY29uc3Qgbm9kZXMgPSBwaW5OYW1lcy5tYXAoKHNwaWNlUGluTmFtZSkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlUG9ydElkID1cbiAgICAgICAgc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdC5zcGljZV9waW5fdG9fc291cmNlX3BvcnRfbWFwW3NwaWNlUGluTmFtZV1cbiAgICAgIHJldHVybiBub2RlTWFwLmdldChzb3VyY2VQb3J0SWQpID8/IFwiMFwiXG4gICAgfSlcblxuICAgIGNvbnN0IHN1YmNpcmN1aXRDYWxsQ29tbWFuZCA9IG5ldyBTdWJjaXJjdWl0Q2FsbENvbW1hbmQoe1xuICAgICAgbmFtZTogc2ltdWxhdGlvblNwaWNlU3ViY2lyY3VpdC5zaW11bGF0aW9uX3NwaWNlX3N1YmNpcmN1aXRfaWQsXG4gICAgICBub2RlcyxcbiAgICAgIHN1YmNpcmN1aXROYW1lOiBtb2RlbE5hbWUsXG4gICAgfSlcblxuICAgIG5ldGxpc3QuYWRkQ29tcG9uZW50KFxuICAgICAgbmV3IFNwaWNlQ29tcG9uZW50KFxuICAgICAgICBzaW11bGF0aW9uU3BpY2VTdWJjaXJjdWl0LnNpbXVsYXRpb25fc3BpY2Vfc3ViY2lyY3VpdF9pZCxcbiAgICAgICAgc3ViY2lyY3VpdENhbGxDb21tYW5kLFxuICAgICAgICBub2RlcyxcbiAgICAgICksXG4gICAgKVxuICB9XG59XG4iLCAiZXhwb3J0IGNsYXNzIFNwaWNlU3ViY2lyY3VpdCB7XG4gIG5hbWU6IHN0cmluZ1xuICBwaW5zOiBzdHJpbmdbXVxuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgcGluczogc3RyaW5nW10pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgdGhpcy5waW5zID0gcGluc1xuICB9XG5cbiAgdG9TcGljZVN0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBpblN0cmluZyA9IHRoaXMucGlucy5qb2luKFwiIFwiKVxuICAgIGNvbnN0IGhlYWRlciA9IGAuU1VCQ0tUICR7dGhpcy5uYW1lfSAke3BpblN0cmluZ31gXG4gICAgY29uc3QgZm9vdGVyID0gYC5FTkRTICR7dGhpcy5uYW1lfWBcblxuICAgIGNvbnN0IGJvZHkgPSBgKiBQbGFjZWhvbGRlciBmb3IgJHt0aGlzLm5hbWV9LiBObyBkZWZpbml0aW9uIGZvdW5kIGluIGNpcmN1aXQgSlNPTi5gXG5cbiAgICByZXR1cm4gW1wiXCIsIGhlYWRlciwgYm9keSwgZm9vdGVyXS5qb2luKFwiXFxuXCIpXG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFFTyxJQUFNLDhCQUE4QixDQUFDLFlBQWtDO0FBQzVFLFFBQU0sUUFBa0IsQ0FBQztBQUd6QixRQUFNLEtBQUssUUFBUSxLQUFLO0FBR3hCLE1BQUksUUFBUSxPQUFPLE9BQU8sR0FBRztBQUMzQixVQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssUUFBUSxPQUFPLE9BQU8s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
|
|
@@ -90,8 +90,14 @@ export const processSimulationVoltageSources = (
|
|
|
90
90
|
}
|
|
91
91
|
} else {
|
|
92
92
|
// DC Source (is_dc_source is true or undefined)
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
// Fall back to terminal1/terminal2 (the AC path already uses these) so a
|
|
94
|
+
// DC source that only has terminal port ids isn't silently dropped.
|
|
95
|
+
const positivePortId =
|
|
96
|
+
simSource.positive_source_port_id ??
|
|
97
|
+
(simSource as any).terminal1_source_port_id
|
|
98
|
+
const negativePortId =
|
|
99
|
+
simSource.negative_source_port_id ??
|
|
100
|
+
(simSource as any).terminal2_source_port_id
|
|
95
101
|
|
|
96
102
|
if (
|
|
97
103
|
positivePortId &&
|
package/package.json
CHANGED
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"type": "source_project_metadata",
|
|
4
|
+
"source_project_metadata_id": "source_project_metadata_0",
|
|
5
|
+
"software_used_string": "@tscircuit/core@0.0.874"
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"type": "source_group",
|
|
9
|
+
"source_group_id": "source_group_0",
|
|
10
|
+
"is_subcircuit": true,
|
|
11
|
+
"was_automatically_named": true,
|
|
12
|
+
"subcircuit_id": "subcircuit_source_group_0"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"type": "source_port",
|
|
16
|
+
"source_port_id": "source_port_0",
|
|
17
|
+
"name": "pin1",
|
|
18
|
+
"pin_number": 1,
|
|
19
|
+
"port_hints": ["pin1", "terminal1", "1"],
|
|
20
|
+
"source_component_id": "source_component_0",
|
|
21
|
+
"subcircuit_id": "subcircuit_source_group_0",
|
|
22
|
+
"subcircuit_connectivity_map_key": "unnamedsubcircuit303_connectivity_net0"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"type": "source_port",
|
|
26
|
+
"source_port_id": "source_port_1",
|
|
27
|
+
"name": "pin2",
|
|
28
|
+
"pin_number": 2,
|
|
29
|
+
"port_hints": ["pin2", "terminal2", "2"],
|
|
30
|
+
"source_component_id": "source_component_0",
|
|
31
|
+
"subcircuit_id": "subcircuit_source_group_0",
|
|
32
|
+
"subcircuit_connectivity_map_key": "unnamedsubcircuit303_connectivity_net2"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"type": "source_component",
|
|
36
|
+
"source_component_id": "source_component_0",
|
|
37
|
+
"ftype": "simple_voltage_source",
|
|
38
|
+
"name": "VS1",
|
|
39
|
+
"voltage": 5,
|
|
40
|
+
"frequency": 60,
|
|
41
|
+
"wave_shape": "sinewave",
|
|
42
|
+
"are_pins_interchangeable": true,
|
|
43
|
+
"source_group_id": "source_group_0"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"type": "source_port",
|
|
47
|
+
"source_port_id": "source_port_2",
|
|
48
|
+
"name": "pin1",
|
|
49
|
+
"pin_number": 1,
|
|
50
|
+
"port_hints": ["pin1", "anode", "pos", "left", "1"],
|
|
51
|
+
"source_component_id": "source_component_1",
|
|
52
|
+
"subcircuit_id": "subcircuit_source_group_0",
|
|
53
|
+
"subcircuit_connectivity_map_key": "unnamedsubcircuit303_connectivity_net0"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"type": "source_port",
|
|
57
|
+
"source_port_id": "source_port_3",
|
|
58
|
+
"name": "pin2",
|
|
59
|
+
"pin_number": 2,
|
|
60
|
+
"port_hints": ["pin2", "cathode", "neg", "right", "2"],
|
|
61
|
+
"source_component_id": "source_component_1",
|
|
62
|
+
"subcircuit_id": "subcircuit_source_group_0",
|
|
63
|
+
"subcircuit_connectivity_map_key": "unnamedsubcircuit303_connectivity_net1"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"type": "source_component",
|
|
67
|
+
"source_component_id": "source_component_1",
|
|
68
|
+
"ftype": "simple_resistor",
|
|
69
|
+
"name": "R1",
|
|
70
|
+
"resistance": 10000,
|
|
71
|
+
"display_resistance": "10kΩ",
|
|
72
|
+
"are_pins_interchangeable": true,
|
|
73
|
+
"source_group_id": "source_group_0"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"type": "source_port",
|
|
77
|
+
"source_port_id": "source_port_4",
|
|
78
|
+
"name": "pin1",
|
|
79
|
+
"pin_number": 1,
|
|
80
|
+
"port_hints": ["pin1", "anode", "pos", "left", "1"],
|
|
81
|
+
"source_component_id": "source_component_2",
|
|
82
|
+
"subcircuit_id": "subcircuit_source_group_0",
|
|
83
|
+
"subcircuit_connectivity_map_key": "unnamedsubcircuit303_connectivity_net1"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"type": "source_port",
|
|
87
|
+
"source_port_id": "source_port_5",
|
|
88
|
+
"name": "pin2",
|
|
89
|
+
"pin_number": 2,
|
|
90
|
+
"port_hints": ["pin2", "cathode", "neg", "right", "2"],
|
|
91
|
+
"source_component_id": "source_component_2",
|
|
92
|
+
"subcircuit_id": "subcircuit_source_group_0",
|
|
93
|
+
"subcircuit_connectivity_map_key": "unnamedsubcircuit303_connectivity_net2"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"type": "source_component",
|
|
97
|
+
"source_component_id": "source_component_2",
|
|
98
|
+
"ftype": "simple_resistor",
|
|
99
|
+
"name": "R2",
|
|
100
|
+
"resistance": 10000,
|
|
101
|
+
"display_resistance": "10kΩ",
|
|
102
|
+
"are_pins_interchangeable": true,
|
|
103
|
+
"source_group_id": "source_group_0"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"type": "source_board",
|
|
107
|
+
"source_board_id": "source_board_0",
|
|
108
|
+
"source_group_id": "source_group_0"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"type": "source_trace",
|
|
112
|
+
"source_trace_id": "source_trace_0",
|
|
113
|
+
"connected_source_port_ids": ["source_port_0", "source_port_2"],
|
|
114
|
+
"connected_source_net_ids": [],
|
|
115
|
+
"subcircuit_id": "subcircuit_source_group_0",
|
|
116
|
+
"display_name": ".VS1 > .pin1 to .R1 > .pin1",
|
|
117
|
+
"subcircuit_connectivity_map_key": "unnamedsubcircuit303_connectivity_net0"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"type": "source_trace",
|
|
121
|
+
"source_trace_id": "source_trace_1",
|
|
122
|
+
"connected_source_port_ids": ["source_port_3", "source_port_4"],
|
|
123
|
+
"connected_source_net_ids": [],
|
|
124
|
+
"subcircuit_id": "subcircuit_source_group_0",
|
|
125
|
+
"display_name": ".R1 > .pin2 to .R2 > .pin1",
|
|
126
|
+
"subcircuit_connectivity_map_key": "unnamedsubcircuit303_connectivity_net1"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"type": "source_trace",
|
|
130
|
+
"source_trace_id": "source_trace_2",
|
|
131
|
+
"connected_source_port_ids": ["source_port_1", "source_port_5"],
|
|
132
|
+
"connected_source_net_ids": [],
|
|
133
|
+
"subcircuit_id": "subcircuit_source_group_0",
|
|
134
|
+
"display_name": ".VS1 > .pin2 to .R2 > .pin2",
|
|
135
|
+
"subcircuit_connectivity_map_key": "unnamedsubcircuit303_connectivity_net2"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"type": "simulation_voltage_source",
|
|
139
|
+
"simulation_voltage_source_id": "simulation_voltage_source_0",
|
|
140
|
+
"is_dc_source": true,
|
|
141
|
+
"terminal1_source_port_id": "source_port_0",
|
|
142
|
+
"terminal2_source_port_id": "source_port_1",
|
|
143
|
+
"voltage": 5
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"type": "schematic_component",
|
|
147
|
+
"schematic_component_id": "schematic_component_0",
|
|
148
|
+
"center": {
|
|
149
|
+
"x": 0,
|
|
150
|
+
"y": 0
|
|
151
|
+
},
|
|
152
|
+
"size": {
|
|
153
|
+
"width": 1.08,
|
|
154
|
+
"height": 0.818910699999999
|
|
155
|
+
},
|
|
156
|
+
"source_component_id": "source_component_0",
|
|
157
|
+
"is_box_with_pins": true,
|
|
158
|
+
"symbol_name": "ac_voltmeter_right",
|
|
159
|
+
"schematic_group_id": "schematic_group_0"
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"type": "schematic_component",
|
|
163
|
+
"schematic_component_id": "schematic_component_1",
|
|
164
|
+
"center": {
|
|
165
|
+
"x": 0,
|
|
166
|
+
"y": -2
|
|
167
|
+
},
|
|
168
|
+
"size": {
|
|
169
|
+
"width": 1.1,
|
|
170
|
+
"height": 0.388910699999999
|
|
171
|
+
},
|
|
172
|
+
"source_component_id": "source_component_1",
|
|
173
|
+
"is_box_with_pins": true,
|
|
174
|
+
"symbol_name": "boxresistor_right",
|
|
175
|
+
"symbol_display_value": "10kΩ",
|
|
176
|
+
"schematic_group_id": "schematic_group_0"
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"type": "schematic_component",
|
|
180
|
+
"schematic_component_id": "schematic_component_2",
|
|
181
|
+
"center": {
|
|
182
|
+
"x": 0,
|
|
183
|
+
"y": 2
|
|
184
|
+
},
|
|
185
|
+
"size": {
|
|
186
|
+
"width": 1.1,
|
|
187
|
+
"height": 0.388910699999999
|
|
188
|
+
},
|
|
189
|
+
"source_component_id": "source_component_2",
|
|
190
|
+
"is_box_with_pins": true,
|
|
191
|
+
"symbol_name": "boxresistor_right",
|
|
192
|
+
"symbol_display_value": "10kΩ",
|
|
193
|
+
"schematic_group_id": "schematic_group_0"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"type": "schematic_group",
|
|
197
|
+
"schematic_group_id": "schematic_group_0",
|
|
198
|
+
"is_subcircuit": true,
|
|
199
|
+
"subcircuit_id": "subcircuit_source_group_0",
|
|
200
|
+
"name": "unnamed_board1",
|
|
201
|
+
"center": {
|
|
202
|
+
"x": 0,
|
|
203
|
+
"y": 0
|
|
204
|
+
},
|
|
205
|
+
"width": 0,
|
|
206
|
+
"height": 0,
|
|
207
|
+
"schematic_component_ids": [],
|
|
208
|
+
"source_group_id": "source_group_0"
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"type": "schematic_port",
|
|
212
|
+
"schematic_port_id": "schematic_port_0",
|
|
213
|
+
"schematic_component_id": "schematic_component_0",
|
|
214
|
+
"center": {
|
|
215
|
+
"x": -0.54,
|
|
216
|
+
"y": -0.0050000000000000044
|
|
217
|
+
},
|
|
218
|
+
"source_port_id": "source_port_0",
|
|
219
|
+
"facing_direction": "left",
|
|
220
|
+
"distance_from_component_edge": 0.4,
|
|
221
|
+
"pin_number": 1,
|
|
222
|
+
"display_pin_label": "terminal1",
|
|
223
|
+
"is_connected": true
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"type": "schematic_port",
|
|
227
|
+
"schematic_port_id": "schematic_port_1",
|
|
228
|
+
"schematic_component_id": "schematic_component_0",
|
|
229
|
+
"center": {
|
|
230
|
+
"x": 0.54,
|
|
231
|
+
"y": 0.0049999999999999975
|
|
232
|
+
},
|
|
233
|
+
"source_port_id": "source_port_1",
|
|
234
|
+
"facing_direction": "right",
|
|
235
|
+
"distance_from_component_edge": 0.4,
|
|
236
|
+
"pin_number": 2,
|
|
237
|
+
"display_pin_label": "terminal2",
|
|
238
|
+
"is_connected": true
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"type": "schematic_port",
|
|
242
|
+
"schematic_port_id": "schematic_port_2",
|
|
243
|
+
"schematic_component_id": "schematic_component_1",
|
|
244
|
+
"center": {
|
|
245
|
+
"x": -0.55,
|
|
246
|
+
"y": -1.9999999999999998
|
|
247
|
+
},
|
|
248
|
+
"source_port_id": "source_port_2",
|
|
249
|
+
"facing_direction": "left",
|
|
250
|
+
"distance_from_component_edge": 0.4,
|
|
251
|
+
"pin_number": 1,
|
|
252
|
+
"display_pin_label": "anode",
|
|
253
|
+
"is_connected": true
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"type": "schematic_port",
|
|
257
|
+
"schematic_port_id": "schematic_port_3",
|
|
258
|
+
"schematic_component_id": "schematic_component_1",
|
|
259
|
+
"center": {
|
|
260
|
+
"x": 0.55,
|
|
261
|
+
"y": -1.9999999999999998
|
|
262
|
+
},
|
|
263
|
+
"source_port_id": "source_port_3",
|
|
264
|
+
"facing_direction": "right",
|
|
265
|
+
"distance_from_component_edge": 0.4,
|
|
266
|
+
"pin_number": 2,
|
|
267
|
+
"display_pin_label": "cathode",
|
|
268
|
+
"is_connected": false
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
"type": "schematic_port",
|
|
272
|
+
"schematic_port_id": "schematic_port_4",
|
|
273
|
+
"schematic_component_id": "schematic_component_2",
|
|
274
|
+
"center": {
|
|
275
|
+
"x": -0.55,
|
|
276
|
+
"y": 2
|
|
277
|
+
},
|
|
278
|
+
"source_port_id": "source_port_4",
|
|
279
|
+
"facing_direction": "left",
|
|
280
|
+
"distance_from_component_edge": 0.4,
|
|
281
|
+
"pin_number": 1,
|
|
282
|
+
"display_pin_label": "anode",
|
|
283
|
+
"is_connected": false
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"type": "schematic_port",
|
|
287
|
+
"schematic_port_id": "schematic_port_5",
|
|
288
|
+
"schematic_component_id": "schematic_component_2",
|
|
289
|
+
"center": {
|
|
290
|
+
"x": 0.55,
|
|
291
|
+
"y": 2
|
|
292
|
+
},
|
|
293
|
+
"source_port_id": "source_port_5",
|
|
294
|
+
"facing_direction": "right",
|
|
295
|
+
"distance_from_component_edge": 0.4,
|
|
296
|
+
"pin_number": 2,
|
|
297
|
+
"display_pin_label": "cathode",
|
|
298
|
+
"is_connected": true
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
"type": "schematic_trace",
|
|
302
|
+
"schematic_trace_id": "schematic_trace_0",
|
|
303
|
+
"source_trace_id": "solver_VS1.1-R1.1",
|
|
304
|
+
"edges": [
|
|
305
|
+
{
|
|
306
|
+
"from": {
|
|
307
|
+
"x": -0.54,
|
|
308
|
+
"y": -0.0050000000000000044
|
|
309
|
+
},
|
|
310
|
+
"to": {
|
|
311
|
+
"x": -0.75,
|
|
312
|
+
"y": -0.0050000000000000044
|
|
313
|
+
}
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
"from": {
|
|
317
|
+
"x": -0.75,
|
|
318
|
+
"y": -0.0050000000000000044
|
|
319
|
+
},
|
|
320
|
+
"to": {
|
|
321
|
+
"x": -0.75,
|
|
322
|
+
"y": -1.9999999999999998
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
"from": {
|
|
327
|
+
"x": -0.75,
|
|
328
|
+
"y": -1.9999999999999998
|
|
329
|
+
},
|
|
330
|
+
"to": {
|
|
331
|
+
"x": -0.55,
|
|
332
|
+
"y": -1.9999999999999998
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
],
|
|
336
|
+
"junctions": [],
|
|
337
|
+
"subcircuit_connectivity_map_key": "unnamedsubcircuit303_connectivity_net0"
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
"type": "schematic_trace",
|
|
341
|
+
"schematic_trace_id": "schematic_trace_1",
|
|
342
|
+
"source_trace_id": "solver_VS1.2-R2.2",
|
|
343
|
+
"edges": [
|
|
344
|
+
{
|
|
345
|
+
"from": {
|
|
346
|
+
"x": 0.54,
|
|
347
|
+
"y": 0.0049999999999999975
|
|
348
|
+
},
|
|
349
|
+
"to": {
|
|
350
|
+
"x": 0.75,
|
|
351
|
+
"y": 0.0049999999999999975
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
"from": {
|
|
356
|
+
"x": 0.75,
|
|
357
|
+
"y": 0.0049999999999999975
|
|
358
|
+
},
|
|
359
|
+
"to": {
|
|
360
|
+
"x": 0.75,
|
|
361
|
+
"y": 2
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
"from": {
|
|
366
|
+
"x": 0.75,
|
|
367
|
+
"y": 2
|
|
368
|
+
},
|
|
369
|
+
"to": {
|
|
370
|
+
"x": 0.55,
|
|
371
|
+
"y": 2
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
],
|
|
375
|
+
"junctions": [],
|
|
376
|
+
"subcircuit_connectivity_map_key": "unnamedsubcircuit303_connectivity_net2"
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
"type": "schematic_net_label",
|
|
380
|
+
"schematic_net_label_id": "schematic_net_label_0",
|
|
381
|
+
"text": "R1_pin2/R2_pin1",
|
|
382
|
+
"anchor_position": {
|
|
383
|
+
"x": 0.55,
|
|
384
|
+
"y": -1.9999999999999998
|
|
385
|
+
},
|
|
386
|
+
"center": {
|
|
387
|
+
"x": 1.3,
|
|
388
|
+
"y": -1.9999999999999998
|
|
389
|
+
},
|
|
390
|
+
"anchor_side": "left"
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
"type": "schematic_net_label",
|
|
394
|
+
"schematic_net_label_id": "schematic_net_label_1",
|
|
395
|
+
"text": "R1_pin2/R2_pin1",
|
|
396
|
+
"anchor_position": {
|
|
397
|
+
"x": -0.55,
|
|
398
|
+
"y": 2
|
|
399
|
+
},
|
|
400
|
+
"center": {
|
|
401
|
+
"x": -1.3,
|
|
402
|
+
"y": 2
|
|
403
|
+
},
|
|
404
|
+
"anchor_side": "right"
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
"type": "pcb_component",
|
|
408
|
+
"pcb_component_id": "pcb_component_0",
|
|
409
|
+
"center": {
|
|
410
|
+
"x": 0,
|
|
411
|
+
"y": -2
|
|
412
|
+
},
|
|
413
|
+
"width": 0,
|
|
414
|
+
"height": 0,
|
|
415
|
+
"layer": "top",
|
|
416
|
+
"rotation": 0,
|
|
417
|
+
"source_component_id": "source_component_1",
|
|
418
|
+
"subcircuit_id": "subcircuit_source_group_0",
|
|
419
|
+
"do_not_place": false,
|
|
420
|
+
"obstructs_within_bounds": true
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
"type": "pcb_missing_footprint_error",
|
|
424
|
+
"pcb_missing_footprint_error_id": "pcb_missing_footprint_error_0",
|
|
425
|
+
"message": "No footprint found for component: <resistor#294 name=\".R1\" />",
|
|
426
|
+
"source_component_id": "source_component_1",
|
|
427
|
+
"error_type": "pcb_missing_footprint_error"
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
"type": "pcb_component",
|
|
431
|
+
"pcb_component_id": "pcb_component_1",
|
|
432
|
+
"center": {
|
|
433
|
+
"x": 0,
|
|
434
|
+
"y": 2
|
|
435
|
+
},
|
|
436
|
+
"width": 0,
|
|
437
|
+
"height": 0,
|
|
438
|
+
"layer": "top",
|
|
439
|
+
"rotation": 0,
|
|
440
|
+
"source_component_id": "source_component_2",
|
|
441
|
+
"subcircuit_id": "subcircuit_source_group_0",
|
|
442
|
+
"do_not_place": false,
|
|
443
|
+
"obstructs_within_bounds": true
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
"type": "pcb_missing_footprint_error",
|
|
447
|
+
"pcb_missing_footprint_error_id": "pcb_missing_footprint_error_1",
|
|
448
|
+
"message": "No footprint found for component: <resistor#297 name=\".R2\" />",
|
|
449
|
+
"source_component_id": "source_component_2",
|
|
450
|
+
"error_type": "pcb_missing_footprint_error"
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
"type": "pcb_board",
|
|
454
|
+
"pcb_board_id": "pcb_board_0",
|
|
455
|
+
"center": {
|
|
456
|
+
"x": 0,
|
|
457
|
+
"y": 0
|
|
458
|
+
},
|
|
459
|
+
"thickness": 1.4,
|
|
460
|
+
"num_layers": 2,
|
|
461
|
+
"width": 10,
|
|
462
|
+
"height": 10,
|
|
463
|
+
"material": "fr4"
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
"type": "pcb_autorouting_error",
|
|
467
|
+
"pcb_autorouting_error_id": "pcb_autorouting_error_0",
|
|
468
|
+
"pcb_error_id": "pcb_autorouter_error_subcircuit_subcircuit_source_group_0",
|
|
469
|
+
"error_type": "pcb_autorouting_error",
|
|
470
|
+
"message": "En ran out of iterations (capacity-autorouter@0.0.140)"
|
|
471
|
+
}
|
|
472
|
+
]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { expect, test } from "bun:test"
|
|
2
|
+
import { circuitJsonToSpice } from "lib/circuitJsonToSpice"
|
|
3
|
+
import dcVoltageSource from "./assets/dc-voltage-source-terminals.json"
|
|
4
|
+
|
|
5
|
+
// A DC voltage source that uses terminal1_source_port_id/terminal2_source_port_id
|
|
6
|
+
// (instead of positive/negative) should still emit its V line.
|
|
7
|
+
test("DC voltage source using terminal1/terminal2", () => {
|
|
8
|
+
const spiceString = circuitJsonToSpice(dcVoltageSource as any).toSpiceString()
|
|
9
|
+
|
|
10
|
+
expect(spiceString).toMatchInlineSnapshot(`
|
|
11
|
+
"* Circuit JSON to SPICE Netlist
|
|
12
|
+
RR1 N1 N2 10K
|
|
13
|
+
RR2 N2 0 10K
|
|
14
|
+
Vsimulation_voltage_source_0 N1 0 DC 5
|
|
15
|
+
.END"
|
|
16
|
+
`)
|
|
17
|
+
})
|