diff --git a/packages/bootstrap-components/dist/generators.js b/packages/bootstrap-components/dist/generators.js index 6f18e32cae..1021b09753 100644 --- a/packages/bootstrap-components/dist/generators.js +++ b/packages/bootstrap-components/dist/generators.js @@ -447,4 +447,4 @@ const navItem = ({record}) => ({ }); export { app, forms, indexTables, recordHomePageComponents as recordHomepages }; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9ycy5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2dlbmVyYXRvcnMvYnV0dG9uR2VuZXJhdG9ycy5qcyIsIi4uL3NyYy9nZW5lcmF0b3JzL2Zvcm1zR2VuZXJhdG9yLmpzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2V0UmVjb3JkUGF0aC5qcyIsIi4uL3NyYy9nZW5lcmF0b3JzL2luZGV4VGFibGVzR2VuZXJhdG9yLmpzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVjb3JkSG9tZVBhZ2VHZW5lcmF0b3IuanMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9zZWxlY3RlZE5hdkNvbnRlbnRHZW5lcmF0b3IuanMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hcHBHZW5lcmF0b3IuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGJ1dHRvbnMgPSAoKSA9PiBbXG4gICAge1xuICAgICAgICBuYW1lOiBcImNvbW1vbi9QcmltYXJ5IEJ1dHRvblwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJCb290c3RyYXAgcHJpbWFyeSBidXR0b24gXCIsXG4gICAgICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2J1dHRvblwiLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbmFtZTogXCJjb21tb24vRGVmYXVsdCBCdXR0b25cIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiQm9vdHN0cmFwIGRlZmF1bHQgYnV0dG9uXCIsXG4gICAgICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2J1dHRvblwiLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJ0biBidG4tc2Vjb25kYXJ5XCJcbiAgICAgICAgfVxuICAgIH1cbl0iLCJpbXBvcnQge2J1dHRvbnN9IGZyb20gXCIuL2J1dHRvbkdlbmVyYXRvcnNcIjtcblxuZXhwb3J0IGNvbnN0IGZvcm1zID0gKHtyZWNvcmRzLCBpbmRleGVzLCBoZWxwZXJzfSkgPT4gXG4gICAgW1xuICAgICAgICAuLi5yZWNvcmRzLm1hcChyb290KSxcbiAgICAgICAgLi4uYnV0dG9ucyh7cmVjb3JkcywgaW5kZXhlcywgaGVscGVyc30pXG4gICAgXTtcblxuZXhwb3J0IGNvbnN0IGZvcm1OYW1lID0gcmVjb3JkID0+ICBgJHtyZWNvcmQubmFtZX0vJHtyZWNvcmQubmFtZX0gRm9ybWA7XG5cbmNvbnN0IHJvb3QgPSByZWNvcmQgPT4gKHtcbiAgICBuYW1lOiBmb3JtTmFtZShyZWNvcmQpLFxuICAgIGRlc2NyaXB0aW9uOiBgQ29udHJvbCBmb3IgY3JlYXRpbmcvdXBkYXRpbmcgJyR7cmVjb3JkLm5vZGVLZXkoKX0nIGAsXG4gICAgaW5oZXJpdHM6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvZGl2XCIsXG4gICAgcHJvcHM6IHtcbiAgICAgICAgY2xhc3NOYW1lOlwicC0xXCIsXG4gICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvaDNcIixcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogYEVkaXQgJHtyZWNvcmQubmFtZX1gLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmb3JtKHJlY29yZCksXG4gICAgICAgICAgICBzYXZlQ2FuY2VsQnV0dG9ucyhyZWNvcmQpXG4gICAgICAgIF1cbiAgICB9XG59KSBcblxuY29uc3QgZm9ybSA9IHJlY29yZCA9PiAoe1xuICAgIGNvbXBvbmVudDoge1xuICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2Zvcm1cIixcbiAgICAgICAgZm9ybUNvbnRyb2xzOiBcbiAgICAgICAgICAgIHJlY29yZC5maWVsZHMubWFwKGYgPT4gZm9ybUNvbnRyb2wocmVjb3JkLCBmKSlcbiAgICB9XG59KVxuXG5jb25zdCBmb3JtQ29udHJvbCA9IChyZWNvcmQsIGZpZWxkKSA9PiB7XG4gICAgaWYoZmllbGQudHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBmaWVsZC50eXBlT3B0aW9ucy52YWx1ZXMgJiYgZmllbGQudHlwZU9wdGlvbnMudmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuICh7XG4gICAgICAgICAgICBjb250cm9sOiB7XG4gICAgICAgICAgICAgICAgX2NvbXBvbmVudDogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9zZWxlY3RcIixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBmaWVsZC50eXBlT3B0aW9ucy52YWx1ZXMubWFwKHYgPT4gKHtpZDp2LCB2YWx1ZTp2fSkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgIFwiIyNiYnN0YXRlXCI6YCR7cmVjb3JkLm5hbWV9LiR7ZmllbGQubmFtZX1gLFxuICAgICAgICAgICAgICAgICAgICBcIiMjYmJzb3VyY2VcIjpcInN0b3JlXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhYmVsOiBmaWVsZC5sYWJlbFxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gKHtcbiAgICAgICAgICAgIGNvbnRyb2w6IHtcbiAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2lucHV0XCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgXCIjI2Jic3RhdGVcIjpgJHtyZWNvcmQubmFtZX0uJHtmaWVsZC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgIFwiIyNiYnNvdXJjZVwiOlwic3RvcmVcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImZvcm0tY29udHJvbFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IGZpZWxkLnR5cGUgPT09IFwic3RyaW5nXCIgPyBcInRleHRcIlxuICAgICAgICAgICAgICAgICAgICA6IGZpZWxkLnR5cGUgPT09IFwiZGF0ZXRpbWVcIiA/IFwiZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIDogZmllbGQudHlwZSA9PT0gXCJudW1iZXJcIiA/IFwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcInRleHRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhYmVsOiBmaWVsZC5sYWJlbFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmNvbnN0IHNhdmVDYW5jZWxCdXR0b25zID0gKHJlY29yZCkgPT4gKHtcbiAgICBjb21wb25lbnQ6IHtcbiAgICAgICAgX2NvbXBvbmVudDogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9zdGFja3BhbmVsXCIsXG4gICAgICAgIGRpcmVjdGlvbjogXCJob3Jpem9udGFsXCIsXG4gICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICBwYWRkZWRQYW5lbEZvckJ1dHRvbih7XG4gICAgICAgICAgICAgICAgX2NvbXBvbmVudDogXCJjb21tb24vUHJpbWFyeSBCdXR0b25cIixcbiAgICAgICAgICAgICAgICBjb250ZW50VGV4dDogYFNhdmUgJHtyZWNvcmQubmFtZX1gLFxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6IFsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiU2F2ZSBSZWNvcmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVBhdGg6IGAke3JlY29yZC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiU2V0IFN0YXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogYGlzRWRpdGluZyR7cmVjb3JkLm5hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwYWRkZWRQYW5lbEZvckJ1dHRvbih7XG4gICAgICAgICAgICAgICAgX2NvbXBvbmVudDogXCJjb21tb24vRGVmYXVsdCBCdXR0b25cIixcbiAgICAgICAgICAgICAgICBjb250ZW50VGV4dDogYENhbmNlbGAsXG4gICAgICAgICAgICAgICAgb25DbGljazogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIlNldCBTdGF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGBpc0VkaXRpbmcke3JlY29yZC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIF1cbiAgICB9XG59KVxuXG5jb25zdCBwYWRkZWRQYW5lbEZvckJ1dHRvbiA9IChidXR0b24pID0+ICh7XG4gICAgY29udHJvbDoge1xuICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2RpdlwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiYnRuLWdyb3VwXCIsXG4gICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBidXR0b25cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH1cbn0pO1xuXG4iLCJleHBvcnQgY29uc3QgZ2V0UmVjb3JkUGF0aCA9IChyZWNvcmQpID0+IHtcblxuICAgIGNvbnN0IHBhcnRzID0gW107XG5cbiAgICBjb25zdCBhZGQgPSAoY3VycmVudCkgPT4ge1xuICAgICAgICBwYXJ0cy5wdXNoKGN1cnJlbnQubmFtZSk7XG4gICAgICAgIGlmKGN1cnJlbnQucGFyZW50KCkudHlwZSA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZChjdXJyZW50LnBhcmVudCgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMucmV2ZXJzZSgpLmpvaW4oXCIvXCIpO1xufSIsImltcG9ydCB7IGdldFJlY29yZFBhdGggfSBmcm9tIFwiLi9nZXRSZWNvcmRQYXRoXCI7XG5cbmV4cG9ydCBjb25zdCBpbmRleFRhYmxlcyA9ICh7aW5kZXhlcywgaGVscGVyc30pID0+IFxuICAgIGluZGV4ZXMubWFwKGkgPT4gaW5kZXhUYWJsZShpLCBoZWxwZXJzKSk7XG5cbmNvbnN0IGV4Y2x1ZGVkQ29sdW1ucyA9IFtcImlkXCIsIFwiaXNOZXdcIiwgXCJrZXlcIiwgXCJ0eXBlXCIsIFwic29ydEtleVwiXTtcblxuZXhwb3J0IGNvbnN0IGluZGV4VGFibGVQcm9wcyA9IChpbmRleCwgaGVscGVycykgPT4gKHtcbiAgICBkYXRhOiB7XG4gICAgICAgIFwiIyNiYnN0YXRlXCI6aW5kZXgubm9kZUtleSgpLFxuICAgICAgICBcIiMjYmJzb3VyY2VcIjpcInN0b3JlXCJcbiAgICB9LFxuICAgIHRhYmxlQ2xhc3M6IFwidGFibGUgdGFibGUtaG92ZXJcIixcbiAgICB0aGVhZENsYXNzOiBcInRoZWFkLWRhcmtcIixcbiAgICBjb2x1bW5zOiBoZWxwZXJzXG4gICAgICAgICAgICAgICAgLmluZGV4U2NoZW1hKGluZGV4KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoYyA9PiAhZXhjbHVkZWRDb2x1bW5zLmluY2x1ZGVzKGMubmFtZSkpXG4gICAgICAgICAgICAgICAgLm1hcChjb2x1bW4pLFxuICAgIG9uUm93Q2xpY2s6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJTZXQgU3RhdGVcIixcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICBwYXRoOiBgc2VsZWN0ZWRyb3dfJHtpbmRleC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgXCIjI2Jic3RhdGVcIjogXCJrZXlcIixcbiAgICAgICAgICAgICAgICAgICAgXCIjI2Jic291cmNlXCI6IFwiZXZlbnRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICBdXG59KTtcblxuZXhwb3J0IGNvbnN0IGdldEluZGV4VGFibGVOYW1lID0gKGluZGV4LCByZWNvcmQpID0+IHtcbiAgICByZWNvcmQgPSByZWNvcmQgXG4gICAgICAgICAgICAgfHwgaW5kZXgucGFyZW50KCkudHlwZSA9PT0gXCJyZWNvcmRcIiA/IGluZGV4LnBhcmVudCgpIDogbnVsbDtcbiAgICBcbiAgICByZXR1cm4gKHJlY29yZFxuICAgICAgICAgICAgPyBgJHtnZXRSZWNvcmRQYXRoKHJlY29yZCl9LyR7aW5kZXgubmFtZX0gVGFibGVgXG4gICAgICAgICAgICA6IGAke2luZGV4Lm5hbWV9IFRhYmxlYCk7XG59XG5cbmNvbnN0IGluZGV4VGFibGUgPSAoaW5kZXgsIGhlbHBlcnMpID0+ICh7XG4gICAgbmFtZTogZ2V0SW5kZXhUYWJsZU5hbWUoaW5kZXgpLFxuICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL3RhYmxlXCIsXG4gICAgcHJvcHM6IGluZGV4VGFibGVQcm9wcyhpbmRleCwgaGVscGVycylcbn0pO1xuXG5jb25zdCBjb2x1bW4gPSAoY29sKSA9PiAoe1xuICAgIHRpdGxlOiBjb2wubmFtZSxcbiAgICB2YWx1ZToge1xuICAgICAgICBcIiMjYmJzdGF0ZVwiOiBjb2wubmFtZSxcbiAgICAgICAgXCIjI2Jic291cmNlXCI6XCJjb250ZXh0XCJcbiAgICB9XG59KSIsImltcG9ydCB7XG4gICAgZ2V0SW5kZXhUYWJsZU5hbWUsIGluZGV4VGFibGVzXG59IGZyb20gXCIuL2luZGV4VGFibGVzR2VuZXJhdG9yXCI7XG5cbmltcG9ydCB7XG4gICAgYnV0dG9uc1xufSBmcm9tIFwiLi9idXR0b25HZW5lcmF0b3JzXCI7XG5cbmV4cG9ydCBjb25zdCByZWNvcmRIb21lUGFnZUNvbXBvbmVudHMgPSAoe2luZGV4ZXMsIHJlY29yZHMsIGhlbHBlcnN9KSA9PiBcbiAgICBbICAgXG4gICAgICAgIC4uLnJlY29yZEhvbWVwYWdlcyh7aW5kZXhlcywgcmVjb3Jkc30pXG4gICAgICAgICAgLm1hcChjb21wb25lbnQpLFxuXG4gICAgICAgIC4uLnJlY29yZEhvbWVwYWdlcyh7aW5kZXhlcywgcmVjb3Jkc30pXG4gICAgICAgICAgICAubWFwKGhvbWVQYWdlQnV0dG9ucyksXG4gICAgICAgIFxuICAgICAgICAuLi5pbmRleFRhYmxlcyh7aW5kZXhlcywgcmVjb3JkcywgaGVscGVyc30pLFxuXG4gICAgICAgIC4uLmJ1dHRvbnMoe2luZGV4ZXMsIGJ1dHRvbnMsIGhlbHBlcnN9KVxuICAgIF1cblxuXG5jb25zdCBmaW5kSW5kZXhGb3JSZWNvcmQgPSAoaW5kZXhlcywgcmVjb3JkKSA9PiB7XG4gICAgY29uc3QgZm9yUmVjb3JkID0gaW5kZXhlcy5maWx0ZXIoaSA9PiBpLmFsbG93ZWRSZWNvcmROb2RlSWRzLmluY2x1ZGVzKHJlY29yZC5ub2RlSWQpKTtcbiAgICBpZihmb3JSZWNvcmQubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgaWYoZm9yUmVjb3JkLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGZvclJlY29yZFswXTtcbiAgICBjb25zdCBub01hcCA9IGZvclJlY29yZC5maWx0ZXIoaSA9PiAhaS5maWx0ZXIgfHwgIWkuZmlsdGVyLnRyaW0oKSk7XG4gICAgaWYobm9NYXAubGVuZ3RoID09PSAwKSBmb3JSZWNvcmRbMF07XG4gICAgcmV0dXJuIG5vTWFwWzBdO1xufVxuXG5leHBvcnQgY29uc3QgcmVjb3JkSG9tZXBhZ2VzID0gKHtpbmRleGVzLCByZWNvcmRzfSkgPT4gXG4gICAgcmVjb3Jkcy5maWx0ZXIociA9PiByLnBhcmVudCgpLnR5cGUgPT09IFwicm9vdFwiKVxuICAgICAgICAubWFwKHIgPT4oe1xuICAgICAgICAgICAgcmVjb3JkOnIsIFxuICAgICAgICAgICAgaW5kZXg6ZmluZEluZGV4Rm9yUmVjb3JkKGluZGV4ZXMsIHIpXG4gICAgICAgIH0pKVxuICAgICAgICAuZmlsdGVyKHIgPT4gci5pbmRleCk7XG5cblxuZXhwb3J0IGNvbnN0ICBob21lcGFnZUNvbXBvbmVudE5hbWUgPSAocmVjb3JkKSA9PiBcbiAgICBgJHtyZWNvcmQubmFtZX0vJHtyZWNvcmQubmFtZX0gaG9tZXBhZ2VgO1xuXG5jb25zdCBjb21wb25lbnQgPSAoe3JlY29yZCwgaW5kZXh9KSA9PiAoe1xuICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2RpdlwiLFxuICAgIG5hbWU6IGhvbWVwYWdlQ29tcG9uZW50TmFtZShyZWNvcmQpLFxuICAgIHByb3BzOiB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJkLWZsZXggZmxleC1jb2x1bW4gaC0xMDBcIixcbiAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudDogYCR7cmVjb3JkLm5hbWV9L2hvbWVwYWdlIGJ1dHRvbnNgLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IGdldEluZGV4VGFibGVOYW1lKGluZGV4KVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImZsZXgtZ293LTEgb3ZlcmZsb3ctYXV0b1wiXG4gICAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIG9uTG9hZDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiU2V0IFN0YXRlXCIsXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiBgaXNFZGl0aW5nJHtyZWNvcmQubmFtZX1gLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJMaXN0IFJlY29yZHNcIixcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlUGF0aDogaW5kZXgubm9kZUtleSgpLFxuICAgICAgICAgICAgICAgICAgICBpbmRleEtleTogaW5kZXgubm9kZUtleSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfVxuXG59KTtcblxuY29uc3QgaG9tZVBhZ2VCdXR0b25zID0gKHtpbmRleCwgcmVjb3JkfSkgPT4gKHtcbiAgICBpbmhlcml0czogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9kaXZcIixcbiAgICBuYW1lOiBgJHtyZWNvcmQubmFtZX0vaG9tZXBhZ2UgYnV0dG9uc2AsXG4gICAgcHJvcHM6IHtcbiAgICAgICAgY2xhc3NOYW1lOiBcImJ0bi10b29sYmFyIG10LTQgbWItMlwiLFxuICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDoge1xuICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2RpdlwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYnRuLWdyb3VwIG1yLTNcIixcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudDogXCJjb21tb24vRGVmYXVsdCBCdXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFRleHQ6IGBDcmVhdGUgJHtyZWNvcmQubmFtZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJHZXQgTmV3IFJlY29yZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVQYXRoOiByZWNvcmQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbktleTogYC8ke3JlY29yZC5jb2xsZWN0aW9uTmFtZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFJlY29yZFR5cGU6IHJlY29yZC5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJTZXQgU3RhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGBpc0VkaXRpbmcke3JlY29yZC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiY29tbW9uL0RlZmF1bHQgQnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUZXh0OiBgUmVmcmVzaGAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIkxpc3QgUmVjb3Jkc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVQYXRoOiBpbmRleC5ub2RlS2V5KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4S2V5OiBpbmRleC5ub2RlS2V5KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDoge1xuICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2lmXCIsXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogYCRzdG9yZS5zZWxlY3RlZHJvd18ke2luZGV4Lm5hbWV9ICYmICRzdG9yZS5zZWxlY3RlZHJvd18ke2luZGV4Lm5hbWV9Lmxlbmd0aCA+IDBgLFxuICAgICAgICAgICAgICAgICAgICB0aGVuQ29tcG9uZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2RpdlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJ0bi1ncm91cFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudDogXCJjb21tb24vRGVmYXVsdCBCdXR0b25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUZXh0OiBgRWRpdCAke3JlY29yZC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIkxvYWQgUmVjb3JkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlUGF0aDogcmVjb3JkLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRLZXk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjYmJzdGF0ZVwiIDogYHNlbGVjdGVkcm93XyR7aW5kZXgubmFtZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNzb3VyY2VcIjogXCJzdG9yZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiU2V0IFN0YXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGBpc0VkaXRpbmcke3JlY29yZC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiY29tbW9uL0RlZmF1bHQgQnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VGV4dDogYERlbGV0ZSAke3JlY29yZC5uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIkRlbGV0ZSBSZWNvcmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkS2V5OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIjI2Jic3RhdGVcIiA6IGBzZWxlY3RlZHJvd18ke2luZGV4Lm5hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjc291cmNlXCI6IFwic3RvcmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfVxufSkiLCJpbXBvcnQgeyBcbiAgICByZWNvcmRIb21lcGFnZXMsIFxuICAgIGhvbWVwYWdlQ29tcG9uZW50TmFtZSxcbiAgICByZWNvcmRIb21lUGFnZUNvbXBvbmVudHNcbn0gZnJvbSBcIi4vcmVjb3JkSG9tZVBhZ2VHZW5lcmF0b3JcIjtcbmltcG9ydCB7IGZvcm1OYW1lLCBmb3JtcyB9IGZyb20gXCIuL2Zvcm1zR2VuZXJhdG9yXCI7XG5cbmV4cG9ydCBjb25zdCBzZWxlY3ROYXZDb250ZW50ID0gKHtpbmRleGVzLCByZWNvcmRzLCBoZWxwZXJzfSkgPT4gXG4gICAgW1xuICAgICAgICAuLi5yZWNvcmRIb21lcGFnZXMoe2luZGV4ZXMsIHJlY29yZHN9KVxuICAgICAgICAgICAgLm1hcChjb21wb25lbnQpLFxuXG4gICAgICAgIC4uLnJlY29yZEhvbWVQYWdlQ29tcG9uZW50cyh7aW5kZXhlcywgcmVjb3JkcywgaGVscGVyc30pLFxuXG4gICAgICAgIC4uLmZvcm1zKHtpbmRleGVzLCByZWNvcmRzLCBoZWxwZXJzfSlcblxuICAgIF1cblxuXG5leHBvcnQgY29uc3QgbmF2Q29udGVudENvbXBvbmVudE5hbWUgPSByZWNvcmQgPT5cbiAgICBgJHtyZWNvcmQubmFtZX0vJHtyZWNvcmQubmFtZX0gTmF2IENvbnRlbnRgO1xuXG5jb25zdCBjb21wb25lbnQgPSAoe3JlY29yZCwgaW5kZXh9KSA9PiAoe1xuICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2lmXCIsXG4gICAgZGVzY3JpcHRpb246IGB0aGUgY29tcG9uZW50IHRoYXQgZ2V0cyBkaXNwbGF5ZWQgd2hlbiB0aGUgJHtyZWNvcmQuY29sbGVjdGlvbk5hbWV9IG5hdiBpcyBzZWxlY3RlZGAsXG4gICAgbmFtZTogbmF2Q29udGVudENvbXBvbmVudE5hbWUocmVjb3JkKSxcbiAgICBwcm9wczoge1xuICAgICAgICBjb25kaXRpb246IGAkc3RvcmUuaXNFZGl0aW5nJHtyZWNvcmQubmFtZX1gLFxuICAgICAgICB0aGVuQ29tcG9uZW50OiB7XG4gICAgICAgICAgICBfY29tcG9uZW50OiBmb3JtTmFtZShyZWNvcmQpXG4gICAgICAgIH0sXG4gICAgICAgIGVsc2VDb21wb25lbnQ6IHtcbiAgICAgICAgICAgIF9jb21wb25lbnQ6IGhvbWVwYWdlQ29tcG9uZW50TmFtZShyZWNvcmQpXG4gICAgICAgIH1cbiAgICB9XG59KTsiLCJpbXBvcnQgeyBuYXZDb250ZW50Q29tcG9uZW50TmFtZSwgc2VsZWN0TmF2Q29udGVudCB9IGZyb20gXCIuL3NlbGVjdGVkTmF2Q29udGVudEdlbmVyYXRvclwiO1xuaW1wb3J0IHsgcmVjb3JkSG9tZXBhZ2VzIH0gZnJvbSBcIi4vcmVjb3JkSG9tZVBhZ2VHZW5lcmF0b3JcIjtcbmV4cG9ydCBjb25zdCBhcHAgPSAoe3JlY29yZHMsIGluZGV4ZXMsIGhlbHBlcnN9KSA9PiBbXG4gICAge1xuICAgICAgICBuYW1lOiBcIkFwcGxpY2F0aW9uIFJvb3RcIixcbiAgICAgICAgaW5oZXJpdHM6IFwiQGJ1ZGliYXNlL2Jvb3RzdHJhcC1jb21wb25lbnRzL25hdlwiLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgaXRlbXM6IHJlY29yZEhvbWVwYWdlcyh7aW5kZXhlcywgcmVjb3Jkc30pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAobmF2SXRlbSksXG4gICAgICAgICAgICBvcmllbnRhdGlvbjogXCJob3Jpem9udGFsXCIsXG4gICAgICAgICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIixcbiAgICAgICAgICAgIGZpbGw6IGZhbHNlLFxuICAgICAgICAgICAgcGlsbHM6IHRydWUsXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW06IHtcbiAgICAgICAgICAgICAgICBcIiMjYmJzdGF0ZVwiOlwic2VsZWN0ZWROYXZcIixcbiAgICAgICAgICAgICAgICBcIiMjYmJzdGF0ZWZhbGxiYWNrXCI6YCR7cmVjb3Jkc1swXS5uYW1lfWAsXG4gICAgICAgICAgICAgICAgXCIjI2Jic291cmNlXCI6IFwic3RvcmVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJwLTNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG5hbWU6IFwiTG9naW5cIixcbiAgICAgICAgaW5oZXJpdHM6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvbG9naW5cIixcbiAgICAgICAgcHJvcHM6IHt9XG4gICAgfSxcbiAgICAuLi5zZWxlY3ROYXZDb250ZW50KHtyZWNvcmRzLCBpbmRleGVzLCBoZWxwZXJzfSlcbl1cblxuXG5leHBvcnQgY29uc3QgbmF2SXRlbSA9ICh7cmVjb3JkfSkgPT4gKHtcbiAgICB0aXRsZTogcmVjb3JkLmNvbGxlY3Rpb25OYW1lLFxuICAgIGNvbXBvbmVudCA6IHtcbiAgICAgICAgX2NvbXBvbmVudDogbmF2Q29udGVudENvbXBvbmVudE5hbWUocmVjb3JkKVxuICAgIH1cbn0pXG5cbiJdLCJuYW1lcyI6WyJjb21wb25lbnQiXSwibWFwcGluZ3MiOiJBQUFPLE1BQU0sT0FBTyxHQUFHLE1BQU07QUFDN0IsSUFBSTtBQUNKLFFBQVEsSUFBSSxFQUFFLHVCQUF1QjtBQUNyQyxRQUFRLFdBQVcsRUFBRSwyQkFBMkI7QUFDaEQsUUFBUSxRQUFRLEVBQUUsc0NBQXNDO0FBQ3hELFFBQVEsS0FBSyxFQUFFO0FBQ2YsWUFBWSxTQUFTLEVBQUUsaUJBQWlCO0FBQ3hDLFNBQVM7QUFDVCxLQUFLO0FBQ0wsSUFBSTtBQUNKLFFBQVEsSUFBSSxFQUFFLHVCQUF1QjtBQUNyQyxRQUFRLFdBQVcsRUFBRSwwQkFBMEI7QUFDL0MsUUFBUSxRQUFRLEVBQUUsc0NBQXNDO0FBQ3hELFFBQVEsS0FBSyxFQUFFO0FBQ2YsWUFBWSxTQUFTLEVBQUUsbUJBQW1CO0FBQzFDLFNBQVM7QUFDVCxLQUFLO0FBQ0w7O0FDZlksTUFBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FB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 +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdG9ycy5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL2dlbmVyYXRvcnMvYnV0dG9uR2VuZXJhdG9ycy5qcyIsIi4uL3NyYy9nZW5lcmF0b3JzL2Zvcm1zR2VuZXJhdG9yLmpzIiwiLi4vc3JjL2dlbmVyYXRvcnMvZ2V0UmVjb3JkUGF0aC5qcyIsIi4uL3NyYy9nZW5lcmF0b3JzL2luZGV4VGFibGVzR2VuZXJhdG9yLmpzIiwiLi4vc3JjL2dlbmVyYXRvcnMvcmVjb3JkSG9tZVBhZ2VHZW5lcmF0b3IuanMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9zZWxlY3RlZE5hdkNvbnRlbnRHZW5lcmF0b3IuanMiLCIuLi9zcmMvZ2VuZXJhdG9ycy9hcHBHZW5lcmF0b3IuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGJ1dHRvbnMgPSAoKSA9PiBbXHJcbiAgICB7XHJcbiAgICAgICAgbmFtZTogXCJjb21tb24vUHJpbWFyeSBCdXR0b25cIixcclxuICAgICAgICBkZXNjcmlwdGlvbjogXCJCb290c3RyYXAgcHJpbWFyeSBidXR0b24gXCIsXHJcbiAgICAgICAgaW5oZXJpdHM6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvYnV0dG9uXCIsXHJcbiAgICAgICAgcHJvcHM6IHtcclxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICBuYW1lOiBcImNvbW1vbi9EZWZhdWx0IEJ1dHRvblwiLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkJvb3RzdHJhcCBkZWZhdWx0IGJ1dHRvblwiLFxyXG4gICAgICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2J1dHRvblwiLFxyXG4gICAgICAgIHByb3BzOiB7XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJidG4gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5dIiwiaW1wb3J0IHtidXR0b25zfSBmcm9tIFwiLi9idXR0b25HZW5lcmF0b3JzXCI7XHJcblxyXG5leHBvcnQgY29uc3QgZm9ybXMgPSAoe3JlY29yZHMsIGluZGV4ZXMsIGhlbHBlcnN9KSA9PiBcclxuICAgIFtcclxuICAgICAgICAuLi5yZWNvcmRzLm1hcChyb290KSxcclxuICAgICAgICAuLi5idXR0b25zKHtyZWNvcmRzLCBpbmRleGVzLCBoZWxwZXJzfSlcclxuICAgIF07XHJcblxyXG5leHBvcnQgY29uc3QgZm9ybU5hbWUgPSByZWNvcmQgPT4gIGAke3JlY29yZC5uYW1lfS8ke3JlY29yZC5uYW1lfSBGb3JtYDtcclxuXHJcbmNvbnN0IHJvb3QgPSByZWNvcmQgPT4gKHtcclxuICAgIG5hbWU6IGZvcm1OYW1lKHJlY29yZCksXHJcbiAgICBkZXNjcmlwdGlvbjogYENvbnRyb2wgZm9yIGNyZWF0aW5nL3VwZGF0aW5nICcke3JlY29yZC5ub2RlS2V5KCl9JyBgLFxyXG4gICAgaW5oZXJpdHM6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvZGl2XCIsXHJcbiAgICBwcm9wczoge1xyXG4gICAgICAgIGNsYXNzTmFtZTpcInAtMVwiLFxyXG4gICAgICAgIGNoaWxkcmVuOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDoge1xyXG4gICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvaDNcIixcclxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBgRWRpdCAke3JlY29yZC5uYW1lfWAsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGZvcm0ocmVjb3JkKSxcclxuICAgICAgICAgICAgc2F2ZUNhbmNlbEJ1dHRvbnMocmVjb3JkKVxyXG4gICAgICAgIF1cclxuICAgIH1cclxufSkgXHJcblxyXG5jb25zdCBmb3JtID0gcmVjb3JkID0+ICh7XHJcbiAgICBjb21wb25lbnQ6IHtcclxuICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2Zvcm1cIixcclxuICAgICAgICBmb3JtQ29udHJvbHM6IFxyXG4gICAgICAgICAgICByZWNvcmQuZmllbGRzLm1hcChmID0+IGZvcm1Db250cm9sKHJlY29yZCwgZikpXHJcbiAgICB9XHJcbn0pXHJcblxyXG5jb25zdCBmb3JtQ29udHJvbCA9IChyZWNvcmQsIGZpZWxkKSA9PiB7XHJcbiAgICBpZihmaWVsZC50eXBlID09PSBcInN0cmluZ1wiICYmIGZpZWxkLnR5cGVPcHRpb25zLnZhbHVlcyAmJiBmaWVsZC50eXBlT3B0aW9ucy52YWx1ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJldHVybiAoe1xyXG4gICAgICAgICAgICBjb250cm9sOiB7XHJcbiAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL3NlbGVjdFwiLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uczogZmllbGQudHlwZU9wdGlvbnMudmFsdWVzLm1hcCh2ID0+ICh7aWQ6diwgdmFsdWU6dn0pKSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgXCIjI2Jic3RhdGVcIjpgJHtyZWNvcmQubmFtZX0uJHtmaWVsZC5uYW1lfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgXCIjI2Jic291cmNlXCI6XCJzdG9yZVwiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGxhYmVsOiBmaWVsZC5sYWJlbFxyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gKHtcclxuICAgICAgICAgICAgY29udHJvbDoge1xyXG4gICAgICAgICAgICAgICAgX2NvbXBvbmVudDogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9pbnB1dFwiLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcclxuICAgICAgICAgICAgICAgICAgICBcIiMjYmJzdGF0ZVwiOmAke3JlY29yZC5uYW1lfS4ke2ZpZWxkLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICBcIiMjYmJzb3VyY2VcIjpcInN0b3JlXCJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiZm9ybS1jb250cm9sXCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBmaWVsZC50eXBlID09PSBcInN0cmluZ1wiID8gXCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICA6IGZpZWxkLnR5cGUgPT09IFwiZGF0ZXRpbWVcIiA/IFwiZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgOiBmaWVsZC50eXBlID09PSBcIm51bWJlclwiID8gXCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0XCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbGFiZWw6IGZpZWxkLmxhYmVsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IHNhdmVDYW5jZWxCdXR0b25zID0gKHJlY29yZCkgPT4gKHtcclxuICAgIGNvbXBvbmVudDoge1xyXG4gICAgICAgIF9jb21wb25lbnQ6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvc3RhY2twYW5lbFwiLFxyXG4gICAgICAgIGRpcmVjdGlvbjogXCJob3Jpem9udGFsXCIsXHJcbiAgICAgICAgY2hpbGRyZW46IFtcclxuICAgICAgICAgICAgcGFkZGVkUGFuZWxGb3JCdXR0b24oe1xyXG4gICAgICAgICAgICAgICAgX2NvbXBvbmVudDogXCJjb21tb24vUHJpbWFyeSBCdXR0b25cIixcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRUZXh0OiBgU2F2ZSAke3JlY29yZC5uYW1lfWAsXHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiBbICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJTYXZlIFJlY29yZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVBhdGg6IGAke3JlY29yZC5uYW1lfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJTZXQgU3RhdGVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogYGlzRWRpdGluZyR7cmVjb3JkLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBwYWRkZWRQYW5lbEZvckJ1dHRvbih7XHJcbiAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcImNvbW1vbi9EZWZhdWx0IEJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgY29udGVudFRleHQ6IGBDYW5jZWxgLFxyXG4gICAgICAgICAgICAgICAgb25DbGljazogW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJTZXQgU3RhdGVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogYGlzRWRpdGluZyR7cmVjb3JkLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG59KVxyXG5cclxuY29uc3QgcGFkZGVkUGFuZWxGb3JCdXR0b24gPSAoYnV0dG9uKSA9PiAoe1xyXG4gICAgY29udHJvbDoge1xyXG4gICAgICAgIF9jb21wb25lbnQ6IFwiQGJ1ZGliYXNlL3N0YW5kYXJkLWNvbXBvbmVudHMvZGl2XCIsXHJcbiAgICAgICAgY2xhc3NOYW1lOiBcImJ0bi1ncm91cFwiLFxyXG4gICAgICAgIGNoaWxkcmVuOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogYnV0dG9uXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBdXHJcbiAgICB9XHJcbn0pO1xyXG5cclxuIiwiZXhwb3J0IGNvbnN0IGdldFJlY29yZFBhdGggPSAocmVjb3JkKSA9PiB7XHJcblxyXG4gICAgY29uc3QgcGFydHMgPSBbXTtcclxuXHJcbiAgICBjb25zdCBhZGQgPSAoY3VycmVudCkgPT4ge1xyXG4gICAgICAgIHBhcnRzLnB1c2goY3VycmVudC5uYW1lKTtcclxuICAgICAgICBpZihjdXJyZW50LnBhcmVudCgpLnR5cGUgPT09IFwicm9vdFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFkZChjdXJyZW50LnBhcmVudCgpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGFydHMucmV2ZXJzZSgpLmpvaW4oXCIvXCIpO1xyXG59IiwiaW1wb3J0IHsgZ2V0UmVjb3JkUGF0aCB9IGZyb20gXCIuL2dldFJlY29yZFBhdGhcIjtcclxuXHJcbmV4cG9ydCBjb25zdCBpbmRleFRhYmxlcyA9ICh7aW5kZXhlcywgaGVscGVyc30pID0+IFxyXG4gICAgaW5kZXhlcy5tYXAoaSA9PiBpbmRleFRhYmxlKGksIGhlbHBlcnMpKTtcclxuXHJcbmNvbnN0IGV4Y2x1ZGVkQ29sdW1ucyA9IFtcImlkXCIsIFwiaXNOZXdcIiwgXCJrZXlcIiwgXCJ0eXBlXCIsIFwic29ydEtleVwiXTtcclxuXHJcbmV4cG9ydCBjb25zdCBpbmRleFRhYmxlUHJvcHMgPSAoaW5kZXgsIGhlbHBlcnMpID0+ICh7XHJcbiAgICBkYXRhOiB7XHJcbiAgICAgICAgXCIjI2Jic3RhdGVcIjppbmRleC5ub2RlS2V5KCksXHJcbiAgICAgICAgXCIjI2Jic291cmNlXCI6XCJzdG9yZVwiXHJcbiAgICB9LFxyXG4gICAgdGFibGVDbGFzczogXCJ0YWJsZSB0YWJsZS1ob3ZlclwiLFxyXG4gICAgdGhlYWRDbGFzczogXCJ0aGVhZC1kYXJrXCIsXHJcbiAgICBjb2x1bW5zOiBoZWxwZXJzXHJcbiAgICAgICAgICAgICAgICAuaW5kZXhTY2hlbWEoaW5kZXgpXHJcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGMgPT4gIWV4Y2x1ZGVkQ29sdW1ucy5pbmNsdWRlcyhjLm5hbWUpKVxyXG4gICAgICAgICAgICAgICAgLm1hcChjb2x1bW4pLFxyXG4gICAgb25Sb3dDbGljazogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJTZXQgU3RhdGVcIixcclxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgICAgICAgICAgcGF0aDogYHNlbGVjdGVkcm93XyR7aW5kZXgubmFtZX1gLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcclxuICAgICAgICAgICAgICAgICAgICBcIiMjYmJzdGF0ZVwiOiBcImtleVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiIyNiYnNvdXJjZVwiOiBcImV2ZW50XCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9XHJcbiAgICBdXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IGdldEluZGV4VGFibGVOYW1lID0gKGluZGV4LCByZWNvcmQpID0+IHtcclxuICAgIHJlY29yZCA9IHJlY29yZCBcclxuICAgICAgICAgICAgIHx8IGluZGV4LnBhcmVudCgpLnR5cGUgPT09IFwicmVjb3JkXCIgPyBpbmRleC5wYXJlbnQoKSA6IG51bGw7XHJcbiAgICBcclxuICAgIHJldHVybiAocmVjb3JkXHJcbiAgICAgICAgICAgID8gYCR7Z2V0UmVjb3JkUGF0aChyZWNvcmQpfS8ke2luZGV4Lm5hbWV9IFRhYmxlYFxyXG4gICAgICAgICAgICA6IGAke2luZGV4Lm5hbWV9IFRhYmxlYCk7XHJcbn1cclxuXHJcbmNvbnN0IGluZGV4VGFibGUgPSAoaW5kZXgsIGhlbHBlcnMpID0+ICh7XHJcbiAgICBuYW1lOiBnZXRJbmRleFRhYmxlTmFtZShpbmRleCksXHJcbiAgICBpbmhlcml0czogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy90YWJsZVwiLFxyXG4gICAgcHJvcHM6IGluZGV4VGFibGVQcm9wcyhpbmRleCwgaGVscGVycylcclxufSk7XHJcblxyXG5jb25zdCBjb2x1bW4gPSAoY29sKSA9PiAoe1xyXG4gICAgdGl0bGU6IGNvbC5uYW1lLFxyXG4gICAgdmFsdWU6IHtcclxuICAgICAgICBcIiMjYmJzdGF0ZVwiOiBjb2wubmFtZSxcclxuICAgICAgICBcIiMjYmJzb3VyY2VcIjpcImNvbnRleHRcIlxyXG4gICAgfVxyXG59KSIsImltcG9ydCB7XHJcbiAgICBnZXRJbmRleFRhYmxlTmFtZSwgaW5kZXhUYWJsZXNcclxufSBmcm9tIFwiLi9pbmRleFRhYmxlc0dlbmVyYXRvclwiO1xyXG5cclxuaW1wb3J0IHtcclxuICAgIGJ1dHRvbnNcclxufSBmcm9tIFwiLi9idXR0b25HZW5lcmF0b3JzXCI7XHJcblxyXG5leHBvcnQgY29uc3QgcmVjb3JkSG9tZVBhZ2VDb21wb25lbnRzID0gKHtpbmRleGVzLCByZWNvcmRzLCBoZWxwZXJzfSkgPT4gXHJcbiAgICBbICAgXHJcbiAgICAgICAgLi4ucmVjb3JkSG9tZXBhZ2VzKHtpbmRleGVzLCByZWNvcmRzfSlcclxuICAgICAgICAgIC5tYXAoY29tcG9uZW50KSxcclxuXHJcbiAgICAgICAgLi4ucmVjb3JkSG9tZXBhZ2VzKHtpbmRleGVzLCByZWNvcmRzfSlcclxuICAgICAgICAgICAgLm1hcChob21lUGFnZUJ1dHRvbnMpLFxyXG4gICAgICAgIFxyXG4gICAgICAgIC4uLmluZGV4VGFibGVzKHtpbmRleGVzLCByZWNvcmRzLCBoZWxwZXJzfSksXHJcblxyXG4gICAgICAgIC4uLmJ1dHRvbnMoe2luZGV4ZXMsIGJ1dHRvbnMsIGhlbHBlcnN9KVxyXG4gICAgXVxyXG5cclxuXHJcbmNvbnN0IGZpbmRJbmRleEZvclJlY29yZCA9IChpbmRleGVzLCByZWNvcmQpID0+IHtcclxuICAgIGNvbnN0IGZvclJlY29yZCA9IGluZGV4ZXMuZmlsdGVyKGkgPT4gaS5hbGxvd2VkUmVjb3JkTm9kZUlkcy5pbmNsdWRlcyhyZWNvcmQubm9kZUlkKSk7XHJcbiAgICBpZihmb3JSZWNvcmQubGVuZ3RoID09PSAwKSByZXR1cm47XHJcbiAgICBpZihmb3JSZWNvcmQubGVuZ3RoID09PSAxKSByZXR1cm4gZm9yUmVjb3JkWzBdO1xyXG4gICAgY29uc3Qgbm9NYXAgPSBmb3JSZWNvcmQuZmlsdGVyKGkgPT4gIWkuZmlsdGVyIHx8ICFpLmZpbHRlci50cmltKCkpO1xyXG4gICAgaWYobm9NYXAubGVuZ3RoID09PSAwKSBmb3JSZWNvcmRbMF07XHJcbiAgICByZXR1cm4gbm9NYXBbMF07XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCByZWNvcmRIb21lcGFnZXMgPSAoe2luZGV4ZXMsIHJlY29yZHN9KSA9PiBcclxuICAgIHJlY29yZHMuZmlsdGVyKHIgPT4gci5wYXJlbnQoKS50eXBlID09PSBcInJvb3RcIilcclxuICAgICAgICAubWFwKHIgPT4oe1xyXG4gICAgICAgICAgICByZWNvcmQ6ciwgXHJcbiAgICAgICAgICAgIGluZGV4OmZpbmRJbmRleEZvclJlY29yZChpbmRleGVzLCByKVxyXG4gICAgICAgIH0pKVxyXG4gICAgICAgIC5maWx0ZXIociA9PiByLmluZGV4KTtcclxuXHJcblxyXG5leHBvcnQgY29uc3QgIGhvbWVwYWdlQ29tcG9uZW50TmFtZSA9IChyZWNvcmQpID0+IFxyXG4gICAgYCR7cmVjb3JkLm5hbWV9LyR7cmVjb3JkLm5hbWV9IGhvbWVwYWdlYDtcclxuXHJcbmNvbnN0IGNvbXBvbmVudCA9ICh7cmVjb3JkLCBpbmRleH0pID0+ICh7XHJcbiAgICBpbmhlcml0czogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9kaXZcIixcclxuICAgIG5hbWU6IGhvbWVwYWdlQ29tcG9uZW50TmFtZShyZWNvcmQpLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgICBjbGFzc05hbWU6IFwiZC1mbGV4IGZsZXgtY29sdW1uIGgtMTAwXCIsXHJcbiAgICAgICAgY2hpbGRyZW46IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudDogYCR7cmVjb3JkLm5hbWV9L2hvbWVwYWdlIGJ1dHRvbnNgLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHtcclxuICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBnZXRJbmRleFRhYmxlTmFtZShpbmRleClcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiZmxleC1nb3ctMSBvdmVyZmxvdy1hdXRvXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF0sXHJcbiAgICAgICAgb25Mb2FkOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiU2V0IFN0YXRlXCIsXHJcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogYGlzRWRpdGluZyR7cmVjb3JkLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIkxpc3QgUmVjb3Jkc1wiLFxyXG4gICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlUGF0aDogaW5kZXgubm9kZUtleSgpLFxyXG4gICAgICAgICAgICAgICAgICAgIGluZGV4S2V5OiBpbmRleC5ub2RlS2V5KClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbn0pO1xyXG5cclxuY29uc3QgaG9tZVBhZ2VCdXR0b25zID0gKHtpbmRleCwgcmVjb3JkfSkgPT4gKHtcclxuICAgIGluaGVyaXRzOiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2RpdlwiLFxyXG4gICAgbmFtZTogYCR7cmVjb3JkLm5hbWV9L2hvbWVwYWdlIGJ1dHRvbnNgLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgICBjbGFzc05hbWU6IFwiYnRuLXRvb2xiYXIgbXQtNCBtYi0yXCIsXHJcbiAgICAgICAgY2hpbGRyZW46IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudDogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9kaXZcIixcclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYnRuLWdyb3VwIG1yLTNcIixcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcImNvbW1vbi9EZWZhdWx0IEJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUZXh0OiBgQ3JlYXRlICR7cmVjb3JkLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiR2V0IE5ldyBSZWNvcmRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVBhdGg6IHJlY29yZC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25LZXk6IGAvJHtyZWNvcmQuY29sbGVjdGlvbk5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFJlY29yZFR5cGU6IHJlY29yZC5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIlNldCBTdGF0ZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGBpc0VkaXRpbmcke3JlY29yZC5uYW1lfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiY29tbW9uL0RlZmF1bHQgQnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFRleHQ6IGBSZWZyZXNoYCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiTGlzdCBSZWNvcmRzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVQYXRoOiBpbmRleC5ub2RlS2V5KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhLZXk6IGluZGV4Lm5vZGVLZXkoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHtcclxuICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2lmXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBgJHN0b3JlLnNlbGVjdGVkcm93XyR7aW5kZXgubmFtZX0gJiYgJHN0b3JlLnNlbGVjdGVkcm93XyR7aW5kZXgubmFtZX0ubGVuZ3RoID4gMGAsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhlbkNvbXBvbmVudDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50OiBcIkBidWRpYmFzZS9zdGFuZGFyZC1jb21wb25lbnRzL2RpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYnRuLWdyb3VwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiY29tbW9uL0RlZmF1bHQgQnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUZXh0OiBgRWRpdCAke3JlY29yZC5uYW1lfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjZXZlbnRIYW5kbGVyVHlwZVwiOiBcIkxvYWQgUmVjb3JkXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVBhdGg6IHJlY29yZC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRLZXk6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNiYnN0YXRlXCIgOiBgc2VsZWN0ZWRyb3dfJHtpbmRleC5uYW1lfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjc291cmNlXCI6IFwic3RvcmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIjI2V2ZW50SGFuZGxlclR5cGVcIjogXCJTZXQgU3RhdGVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGBpc0VkaXRpbmcke3JlY29yZC5uYW1lfWAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnQ6IFwiY29tbW9uL0RlZmF1bHQgQnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUZXh0OiBgRGVsZXRlICR7cmVjb3JkLm5hbWV9YCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIyNldmVudEhhbmRsZXJUeXBlXCI6IFwiRGVsZXRlIFJlY29yZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkS2V5OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiMjYmJzdGF0ZVwiIDogYHNlbGVjdGVkcm93XyR7aW5kZXgubmFtZX1gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIjI3NvdXJjZVwiOiBcInN0b3JlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgIH1cclxufSkiLCJpbXBvcnQgeyBcclxuICAgIHJlY29yZEhvbWVwYWdlcywgXHJcbiAgICBob21lcGFnZUNvbXBvbmVudE5hbWUsXHJcbiAgICByZWNvcmRIb21lUGFnZUNvbXBvbmVudHNcclxufSBmcm9tIFwiLi9yZWNvcmRIb21lUGFnZUdlbmVyYXRvclwiO1xyXG5pbXBvcnQgeyBmb3JtTmFtZSwgZm9ybXMgfSBmcm9tIFwiLi9mb3Jtc0dlbmVyYXRvclwiO1xyXG5cclxuZXhwb3J0IGNvbnN0IHNlbGVjdE5hdkNvbnRlbnQgPSAoe2luZGV4ZXMsIHJlY29yZHMsIGhlbHBlcnN9KSA9PiBcclxuICAgIFtcclxuICAgICAgICAuLi5yZWNvcmRIb21lcGFnZXMoe2luZGV4ZXMsIHJlY29yZHN9KVxyXG4gICAgICAgICAgICAubWFwKGNvbXBvbmVudCksXHJcblxyXG4gICAgICAgIC4uLnJlY29yZEhvbWVQYWdlQ29tcG9uZW50cyh7aW5kZXhlcywgcmVjb3JkcywgaGVscGVyc30pLFxyXG5cclxuICAgICAgICAuLi5mb3Jtcyh7aW5kZXhlcywgcmVjb3JkcywgaGVscGVyc30pXHJcblxyXG4gICAgXVxyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBuYXZDb250ZW50Q29tcG9uZW50TmFtZSA9IHJlY29yZCA9PlxyXG4gICAgYCR7cmVjb3JkLm5hbWV9LyR7cmVjb3JkLm5hbWV9IE5hdiBDb250ZW50YDtcclxuXHJcbmNvbnN0IGNvbXBvbmVudCA9ICh7cmVjb3JkLCBpbmRleH0pID0+ICh7XHJcbiAgICBpbmhlcml0czogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9pZlwiLFxyXG4gICAgZGVzY3JpcHRpb246IGB0aGUgY29tcG9uZW50IHRoYXQgZ2V0cyBkaXNwbGF5ZWQgd2hlbiB0aGUgJHtyZWNvcmQuY29sbGVjdGlvbk5hbWV9IG5hdiBpcyBzZWxlY3RlZGAsXHJcbiAgICBuYW1lOiBuYXZDb250ZW50Q29tcG9uZW50TmFtZShyZWNvcmQpLFxyXG4gICAgcHJvcHM6IHtcclxuICAgICAgICBjb25kaXRpb246IGAkc3RvcmUuaXNFZGl0aW5nJHtyZWNvcmQubmFtZX1gLFxyXG4gICAgICAgIHRoZW5Db21wb25lbnQ6IHtcclxuICAgICAgICAgICAgX2NvbXBvbmVudDogZm9ybU5hbWUocmVjb3JkKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZWxzZUNvbXBvbmVudDoge1xyXG4gICAgICAgICAgICBfY29tcG9uZW50OiBob21lcGFnZUNvbXBvbmVudE5hbWUocmVjb3JkKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufSk7IiwiaW1wb3J0IHsgbmF2Q29udGVudENvbXBvbmVudE5hbWUsIHNlbGVjdE5hdkNvbnRlbnQgfSBmcm9tIFwiLi9zZWxlY3RlZE5hdkNvbnRlbnRHZW5lcmF0b3JcIjtcclxuaW1wb3J0IHsgcmVjb3JkSG9tZXBhZ2VzIH0gZnJvbSBcIi4vcmVjb3JkSG9tZVBhZ2VHZW5lcmF0b3JcIjtcclxuZXhwb3J0IGNvbnN0IGFwcCA9ICh7cmVjb3JkcywgaW5kZXhlcywgaGVscGVyc30pID0+IFtcclxuICAgIHtcclxuICAgICAgICBuYW1lOiBcIkFwcGxpY2F0aW9uIFJvb3RcIixcclxuICAgICAgICBpbmhlcml0czogXCJAYnVkaWJhc2UvYm9vdHN0cmFwLWNvbXBvbmVudHMvbmF2XCIsXHJcbiAgICAgICAgcHJvcHM6IHtcclxuICAgICAgICAgICAgaXRlbXM6IHJlY29yZEhvbWVwYWdlcyh7aW5kZXhlcywgcmVjb3Jkc30pXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcChuYXZJdGVtKSxcclxuICAgICAgICAgICAgb3JpZW50YXRpb246IFwiaG9yaXpvbnRhbFwiLFxyXG4gICAgICAgICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIixcclxuICAgICAgICAgICAgZmlsbDogZmFsc2UsXHJcbiAgICAgICAgICAgIHBpbGxzOiB0cnVlLFxyXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW06IHtcclxuICAgICAgICAgICAgICAgIFwiIyNiYnN0YXRlXCI6XCJzZWxlY3RlZE5hdlwiLFxyXG4gICAgICAgICAgICAgICAgXCIjI2Jic3RhdGVmYWxsYmFja1wiOmAke3JlY29yZHNbMF0ubmFtZX1gLFxyXG4gICAgICAgICAgICAgICAgXCIjI2Jic291cmNlXCI6IFwic3RvcmVcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjbGFzc05hbWU6IFwicC0zXCJcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIG5hbWU6IFwiTG9naW5cIixcclxuICAgICAgICBpbmhlcml0czogXCJAYnVkaWJhc2Uvc3RhbmRhcmQtY29tcG9uZW50cy9sb2dpblwiLFxyXG4gICAgICAgIHByb3BzOiB7fVxyXG4gICAgfSxcclxuICAgIC4uLnNlbGVjdE5hdkNvbnRlbnQoe3JlY29yZHMsIGluZGV4ZXMsIGhlbHBlcnN9KVxyXG5dXHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IG5hdkl0ZW0gPSAoe3JlY29yZH0pID0+ICh7XHJcbiAgICB0aXRsZTogcmVjb3JkLmNvbGxlY3Rpb25OYW1lLFxyXG4gICAgY29tcG9uZW50IDoge1xyXG4gICAgICAgIF9jb21wb25lbnQ6IG5hdkNvbnRlbnRDb21wb25lbnROYW1lKHJlY29yZClcclxuICAgIH1cclxufSlcclxuXHJcbiJdLCJuYW1lcyI6WyJjb21wb25lbnQiXSwibWFwcGluZ3MiOiJBQUFPLE1BQU0sT0FBTyxHQUFHLE1BQU07SUFDekI7UUFDSSxJQUFJLEVBQUUsdUJBQXVCO1FBQzdCLFdBQVcsRUFBRSwyQkFBMkI7UUFDeEMsUUFBUSxFQUFFLHNDQUFzQztRQUNoRCxLQUFLLEVBQUU7WUFDSCxTQUFTLEVBQUUsaUJBQWlCO1NBQy9CO0tBQ0o7SUFDRDtRQUNJLElBQUksRUFBRSx1QkFBdUI7UUFDN0IsV0FBVyxFQUFFLDBCQUEwQjtRQUN2QyxRQUFRLEVBQUUsc0NBQXNDO1FBQ2hELEtBQUssRUFBRTtZQUNILFNBQVMsRUFBRSxtQkFBbUI7U0FDakM7S0FDSjs7O0NBQ0osRENmVyxNQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7SUFDN0M7UUFDSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMs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 diff --git a/packages/builder/package.json b/packages/builder/package.json index 9595da46f6..904a609ca6 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -36,6 +36,7 @@ "dependencies": { "@budibase/client": "^0.0.16", "@nx-js/compiler-util": "^2.0.0", + "codemirror": "^5.51.0", "date-fns": "^1.29.0", "feather-icons": "^4.21.0", "flatpickr": "^4.5.7", diff --git a/packages/builder/src/builderStore/buildCodeForScreens.js b/packages/builder/src/builderStore/buildCodeForScreens.js new file mode 100644 index 0000000000..fdd2c8d797 --- /dev/null +++ b/packages/builder/src/builderStore/buildCodeForScreens.js @@ -0,0 +1,35 @@ + + +const buildCodeForSingleScreen = (screen) => { + let code = ""; + const walkProps = (props) => { + if(props._code && props._code.trim().length > 0) { + code += buildComponentCode(props) + } + + if(!props._children) return; + + for(let child of props._children) { + walkProps(child); + } + } + + walkProps(screen.props); + + return code; +} + +export const buildCodeForScreens = screens => { + let allfunctions = ""; + for(let screen of screens) { + allfunctions += buildCodeForSingleScreen(screen); + } + + return (`return ({ ${allfunctions} });`); +} + +const buildComponentCode = (componentProps) => +`"${componentProps._id}" : (render, context) => { +${componentProps._code} +}, +`; \ No newline at end of file diff --git a/packages/builder/src/builderStore/store.js b/packages/builder/src/builderStore/store.js index c9dc3da87b..7e52a0e881 100644 --- a/packages/builder/src/builderStore/store.js +++ b/packages/builder/src/builderStore/store.js @@ -22,6 +22,7 @@ import { import { loadLibs, loadLibUrls, loadGeneratorLibs } from "./loadComponentLibraries"; +import { buildCodeForScreens } from "./buildCodeForScreens"; import { uuid } from './uuid'; import { generate_screen_css } from './generate_css'; @@ -97,6 +98,7 @@ export const getStore = () => { store.selectComponent = selectComponent(store); store.setComponentProp = setComponentProp(store); store.setComponentStyle = setComponentStyle(store); + store.setComponentCode = setComponentCode(store); return store; } @@ -669,7 +671,8 @@ const savePackage = (store, s) => { s.components, s.screens, s.pages.unauthenticated.appBody) - } + }, + uiFunctions: buildCodeForScreens(s.screens) }; const data = { @@ -687,6 +690,7 @@ const setCurrentScreen = store => screenName => { s.currentFrontEndItem = screen; s.currentFrontEndType = "screen"; s.currentComponentInfo = getScreenInfo(s.components, screen); + setCurrentScreenFunctions(s); return s; }) } @@ -695,8 +699,9 @@ const setCurrentPage = store => pageName => { store.update(s => { s.currentFrontEndType = "page"; s.currentPageName = pageName; + setCurrentScreenFunctions(s); return s; - }) + }); } const addChildComponent = store => component => { @@ -770,3 +775,22 @@ const setComponentStyle = store => (type, name, value) => { return s; }) } + +const setComponentCode = store => (code) => { + store.update(s => { + s.currentComponentInfo._code = code; + + setCurrentScreenFunctions(s); + // save without messing with the store + _save(s.appname, s.currentFrontEndItem, store, s) + + return s; + }) +} + +const setCurrentScreenFunctions = (s) => { + s.currentScreenFunctions = + s.currentFrontEndItem === "screen" + ? buildCodeForScreens([s.currentFrontEndItem]) + : "({});"; +} diff --git a/packages/builder/src/builderStore/store.js.orig b/packages/builder/src/builderStore/store.js.orig new file mode 100644 index 0000000000..9c753a180e --- /dev/null +++ b/packages/builder/src/builderStore/store.js.orig @@ -0,0 +1,799 @@ +import { + hierarchy as hierarchyFunctions, +} from "../../../core/src"; +import { + filter, cloneDeep, sortBy, + map, last, keys, concat, keyBy, + find, isEmpty, values, +} from "lodash/fp"; +import { + pipe, getNode, validate, + constructHierarchy, templateApi +} from "../common/core"; +import { writable } from "svelte/store"; +import { defaultPagesObject } from "../userInterface/pagesParsing/defaultPagesObject" +import { buildPropsHierarchy } from "../userInterface/pagesParsing/buildPropsHierarchy" +import api from "./api"; +import { isRootComponent, getExactComponent } from "../userInterface/pagesParsing/searchComponents"; +import { rename } from "../userInterface/pagesParsing/renameScreen"; +import { + getNewComponentInfo, getScreenInfo, +} from "../userInterface/pagesParsing/createProps"; +import { + loadLibs, loadLibUrls, loadGeneratorLibs +} from "./loadComponentLibraries"; +<<<<<<< HEAD +import { buildCodeForScreens } from "./buildCodeForScreens"; +======= +import { uuid } from './uuid'; +import { generate_screen_css } from './generate_css'; +>>>>>>> master + +let appname = ""; + +export const getStore = () => { + + const initial = { + apps: [], + appname: "", + hierarchy: {}, + actions: [], + triggers: [], + pages: defaultPagesObject(), + mainUi: {}, + unauthenticatedUi: {}, + components: [], + currentFrontEndItem: null, + currentComponentInfo: null, + currentFrontEndType: "none", + currentPageName: "", + currentComponentProps: null, + currentNodeIsNew: false, + errors: [], + activeNav: "database", + isBackend: true, + hasAppPackage: false, + accessLevels: { version: 0, levels: [] }, + currentNode: null, + libraries: null, + showSettings: false, + useAnalytics: true, + }; + + const store = writable(initial); + + store.initialise = initialise(store, initial); + store.newChildRecord = newRecord(store, false); + store.newRootRecord = newRecord(store, true); + store.selectExistingNode = selectExistingNode(store); + store.newChildIndex = newIndex(store, false); + store.newRootIndex = newIndex(store, true); + store.saveCurrentNode = saveCurrentNode(store); + store.importAppDefinition = importAppDefinition(store); + store.deleteCurrentNode = deleteCurrentNode(store); + store.saveField = saveField(store); + store.deleteField = deleteField(store); + store.saveAction = saveAction(store); + store.deleteAction = deleteAction(store); + store.saveTrigger = saveTrigger(store); + store.deleteTrigger = deleteTrigger(store); + store.saveLevel = saveLevel(store); + store.deleteLevel = deleteLevel(store); + store.setActiveNav = setActiveNav(store); + store.saveScreen = saveScreen(store); + store.refreshComponents = refreshComponents(store); + store.addComponentLibrary = addComponentLibrary(store); + store.renameScreen = renameScreen(store); + store.deleteScreen = deleteScreen(store); + store.setCurrentScreen = setCurrentScreen(store); + store.setCurrentPage = setCurrentPage(store); + store.createScreen = createScreen(store); + store.removeComponentLibrary = removeComponentLibrary(store); + store.addStylesheet = addStylesheet(store); + store.removeStylesheet = removeStylesheet(store); + store.savePage = savePage(store); + store.showFrontend = showFrontend(store); + store.showBackend = showBackend(store); + store.showSettings = showSettings(store); + store.useAnalytics = useAnalytics(store); + store.createGeneratedComponents = createGeneratedComponents(store); + store.addChildComponent = addChildComponent(store); + store.selectComponent = selectComponent(store); + store.setComponentProp = setComponentProp(store); + store.setComponentStyle = setComponentStyle(store); + store.setComponentCode = setComponentCode(store); + return store; +} + +export default getStore; + +const initialise = (store, initial) => async () => { + + appname = window.location.hash + ? last(window.location.hash.substr(1).split("/")) + : ""; + + if (!appname) { + initial.apps = await api.get(`/_builder/api/apps`).then(r => r.json()); + initial.hasAppPackage = false; + store.set(initial); + return initial; + } + + const pkg = await api.get(`/_builder/api/${appname}/appPackage`) + .then(r => r.json()); + + initial.libraries = await loadLibs(appname, pkg); + initial.generatorLibraries = await loadGeneratorLibs(appname, pkg); + initial.loadLibraryUrls = () => loadLibUrls(appname, pkg); + initial.appname = appname; + initial.pages = pkg.pages; + initial.hasAppPackage = true; + initial.hierarchy = pkg.appDefinition.hierarchy; + initial.accessLevels = pkg.accessLevels; + initial.screens = values(pkg.screens); + initial.generators = generatorsArray(pkg.components.generators); + initial.components = values(pkg.components.components); + initial.actions = values(pkg.appDefinition.actions); + initial.triggers = pkg.appDefinition.triggers; + + if (!!initial.hierarchy && !isEmpty(initial.hierarchy)) { + initial.hierarchy = constructHierarchy(initial.hierarchy); + const shadowHierarchy = createShadowHierarchy(initial.hierarchy); + if (initial.currentNode !== null) + initial.currentNode = getNode( + shadowHierarchy, initial.currentNode.nodeId + ); + } + + store.set(initial); + return initial; +} + +const generatorsArray = generators => + pipe(generators, [ + keys, + filter(k => k !== "_lib"), + map(k => generators[k]) + ]); + + +const showSettings = store => show => { + store.update(s => { + s.showSettings = !s.showSettings; + return s; + }); +} + +const useAnalytics = store => useAnalytics => { + store.update(s => { + s.useAnalytics = !s.useAnalytics; + return s; + }); +} + +const showBackend = store => () => { + store.update(s => { + s.isBackend = true; + return s; + }) +} + +const showFrontend = store => () => { + store.update(s => { + s.isBackend = false; + return s; + }) +} + +const newRecord = (store, useRoot) => () => { + store.update(s => { + s.currentNodeIsNew = true; + const shadowHierarchy = createShadowHierarchy(s.hierarchy); + parent = useRoot ? shadowHierarchy + : getNode( + shadowHierarchy, + s.currentNode.nodeId); + s.errors = []; + s.currentNode = templateApi(shadowHierarchy) + .getNewRecordTemplate(parent, "", true); + return s; + }); +} + + +const selectExistingNode = (store) => (nodeId) => { + store.update(s => { + const shadowHierarchy = createShadowHierarchy(s.hierarchy); + s.currentNode = getNode( + shadowHierarchy, nodeId + ); + s.currentNodeIsNew = false; + s.errors = []; + s.activeNav = "database"; + return s; + }) +} + +const newIndex = (store, useRoot) => () => { + store.update(s => { + s.currentNodeIsNew = true; + s.errors = []; + const shadowHierarchy = createShadowHierarchy(s.hierarchy); + parent = useRoot ? shadowHierarchy + : getNode( + shadowHierarchy, + s.currentNode.nodeId); + + s.currentNode = templateApi(shadowHierarchy) + .getNewIndexTemplate(parent); + return s; + }); +} + +const saveCurrentNode = (store) => () => { + store.update(s => { + + const errors = validate.node(s.currentNode); + s.errors = errors; + if (errors.length > 0) { + return s; + } + + const parentNode = getNode( + s.hierarchy, s.currentNode.parent().nodeId); + + const existingNode = getNode( + s.hierarchy, s.currentNode.nodeId); + + let index = parentNode.children.length; + if (!!existingNode) { + // remove existing + index = existingNode.parent().children.indexOf(existingNode); + existingNode.parent().children = pipe(existingNode.parent().children, [ + filter(c => c.nodeId !== existingNode.nodeId) + ]); + } + + // should add node into existing hierarchy + const cloned = cloneDeep(s.currentNode); + templateApi(s.hierarchy).constructNode( + parentNode, + cloned + ); + + const newIndexOfchild = child => { + if (child === cloned) return index; + const currentIndex = parentNode.children.indexOf(child); + return currentIndex >= index ? currentIndex + 1 : currentIndex; + } + + parentNode.children = pipe(parentNode.children, [ + sortBy(newIndexOfchild) + ]); + + if (!existingNode && s.currentNode.type === "record") { + const defaultIndex = templateApi(s.hierarchy) + .getNewIndexTemplate(cloned.parent()); + defaultIndex.name = `all_${cloned.collectionName}`; + defaultIndex.allowedRecordNodeIds = [cloned.nodeId]; + } + + s.currentNodeIsNew = false; + + savePackage(store, s); + + return s; + }); +} + +const importAppDefinition = store => appDefinition => { + store.update(s => { + s.hierarchy = appDefinition.hierarchy; + s.currentNode = appDefinition.hierarchy.children.length > 0 + ? appDefinition.hierarchy.children[0] + : null; + s.actions = appDefinition.actions; + s.triggers = appDefinition.triggers; + s.currentNodeIsNew = false; + return s; + }); +} + +const deleteCurrentNode = store => () => { + store.update(s => { + const nodeToDelete = getNode(s.hierarchy, s.currentNode.nodeId); + s.currentNode = hierarchyFunctions.isRoot(nodeToDelete.parent()) + ? find(n => n != s.currentNode) + (s.hierarchy.children) + : nodeToDelete.parent(); + if (hierarchyFunctions.isRecord(nodeToDelete)) { + nodeToDelete.parent().children = filter(c => c.nodeId !== nodeToDelete.nodeId) + (nodeToDelete.parent().children); + } else { + nodeToDelete.parent().indexes = filter(c => c.nodeId !== nodeToDelete.nodeId) + (nodeToDelete.parent().indexes); + } + s.errors = []; + savePackage(store, s); + return s; + }); +} + +const saveField = databaseStore => (field) => { + databaseStore.update(db => { + db.currentNode.fields = filter(f => f.name !== field.name) + (db.currentNode.fields); + + templateApi(db.hierarchy).addField(db.currentNode, field); + return db; + }); +} + + +const deleteField = databaseStore => field => { + databaseStore.update(db => { + db.currentNode.fields = filter(f => f.name !== field.name) + (db.currentNode.fields); + + return db; + }); +} + + +const saveAction = store => (newAction, isNew, oldAction = null) => { + store.update(s => { + + const existingAction = isNew + ? null + : find(a => a.name === oldAction.name)(s.actions); + + if (existingAction) { + s.actions = pipe(s.actions, [ + map(a => a === existingAction ? newAction : a) + ]); + } else { + s.actions.push(newAction); + } + savePackage(store, s); + return s; + }); +} + +const deleteAction = store => action => { + store.update(s => { + s.actions = filter(a => a.name !== action.name)(s.actions); + savePackage(store, s); + return s; + }); +} + +const saveTrigger = store => (newTrigger, isNew, oldTrigger = null) => { + store.update(s => { + + const existingTrigger = isNew + ? null + : find(a => a.name === oldTrigger.name)(s.triggers); + + if (existingTrigger) { + s.triggers = pipe(s.triggers, [ + map(a => a === existingTrigger ? newTrigger : a) + ]); + } else { + s.triggers.push(newTrigger); + } + savePackage(store, s); + return s; + }); +} + +const deleteTrigger = store => trigger => { + store.update(s => { + s.triggers = filter(t => t.name !== trigger.name)(s.triggers); + return s; + }); +} + +const incrementAccessLevelsVersion = (s) => + s.accessLevels.version = (s.accessLevels.version || 0) + 1; + +const saveLevel = store => (newLevel, isNew, oldLevel = null) => { + store.update(s => { + + const levels = s.accessLevels.levels; + + const existingLevel = isNew + ? null + : find(a => a.name === oldLevel.name)(levels); + + if (existingLevel) { + s.accessLevels.levels = pipe(levels, [ + map(a => a === existingLevel ? newLevel : a) + ]); + } else { + s.accessLevels.levels.push(newLevel); + } + + incrementAccessLevelsVersion(s); + + savePackage(store, s); + return s; + }); +} + +const deleteLevel = store => level => { + store.update(s => { + s.accessLevels.levels = filter(t => t.name !== level.name)(s.accessLevels.levels); + incrementAccessLevelsVersion(s); + savePackage(store, s); + return s; + }); +} + +const setActiveNav = store => navName => { + store.update(s => { + s.activeNav = navName; + return s; + }); +} + +const createShadowHierarchy = hierarchy => + constructHierarchy(JSON.parse(JSON.stringify(hierarchy))); + +const saveScreen = store => (screen) => { + store.update(s => { + return _saveScreen(store, s, screen); + }) +}; + +const _saveScreen = (store, s, screen) => { + const screens = pipe(s.screens, [ + filter(c => c.name !== screen.name), + concat([screen]) + ]); + + s.screens = screens; + s.currentFrontEndItem = screen; + s.currentComponentInfo = getScreenInfo( + s.components, screen); + + api.post(`/_builder/api/${s.appname}/screen`, screen) + .then(() => savePackage(store, s)); + + return s; +} + +const _save = (appname, screen, store, s) => + api.post(`/_builder/api/${appname}/screen`, screen) + .then(() => savePackage(store, s)); + +const createScreen = store => (screenName, layoutComponentName) => { + store.update(s => { + const newComponentInfo = getNewComponentInfo( + s.components, layoutComponentName, screenName); + + s.currentFrontEndItem = newComponentInfo.component; + s.currentComponentInfo = newComponentInfo; + s.currentFrontEndType = "screen"; + + return _saveScreen(store, s, newComponentInfo.component); + }); +}; + +const createGeneratedComponents = store => components => { + store.update(s => { + s.components = [...s.components, ...components]; + s.screens = [...s.screens, ...components]; + + const doCreate = async () => { + for (let c of components) { + await api.post(`/_builder/api/${s.appname}/screen`, c); + } + + await savePackage(store, s); + } + + doCreate(); + + return s; + }); +}; + +const deleteScreen = store => name => { + store.update(s => { + + const components = pipe(s.components, [ + filter(c => c.name !== name) + ]); + + const screens = pipe(s.screens, [ + filter(c => c.name !== name) + ]); + + s.components = components; + s.screens = screens; + if (s.currentFrontEndItem.name === name) { + s.currentFrontEndItem = null; + s.currentFrontEndType = ""; + } + + api.delete(`/_builder/api/${s.appname}/screen/${name}`); + + return s; + }) +} + +const renameScreen = store => (oldname, newname) => { + store.update(s => { + + const { + screens, pages, error, changedScreens + } = rename(s.pages, s.screens, oldname, newname); + + if (error) { + // should really do something with this + return s; + } + + s.screens = screens; + s.pages = pages; + if (s.currentFrontEndItem.name === oldname) + s.currentFrontEndItem.name = newname; + + const saveAllChanged = async () => { + for (let screenName of changedScreens) { + const changedScreen + = getExactComponent(screens, screenName); + await api.post(`/_builder/api/${s.appname}/screen`, changedScreen); + } + } + + api.patch(`/_builder/api/${s.appname}/screen`, { + oldname, newname + }) + .then(() => saveAllChanged()) + .then(() => { + savePackage(store, s); + }); + + return s; + }) +} + +const savePage = store => async page => { + store.update(s => { + if (s.currentFrontEndType !== "page" || !s.currentPageName) { + return s; + } + + s.pages[s.currentPageName] = page; + savePackage(store, s); + return s; + }); +} + +const addComponentLibrary = store => async lib => { + + const response = + await api.get(`/_builder/api/${appname}/componentlibrary?lib=${encodeURI(lib)}`, undefined, false); + + const success = response.status === 200; + + const error = response.status === 404 + ? `Could not find library ${lib}` + : success + ? "" + : response.statusText; + + const components = success + ? await response.json() + : []; + + store.update(s => { + if (success) { + + const componentsArray = []; + for (let c in components) { + componentsArray.push(components[c]); + } + + s.components = pipe(s.components, [ + filter(c => !c.name.startsWith(`${lib}/`)), + concat(componentsArray) + ]); + + s.pages.componentLibraries.push(lib); + savePackage(store, s); + } + + return s; + }) +} + +const removeComponentLibrary = store => lib => { + store.update(s => { + + + s.pages.componentLibraries = filter(l => l !== lib)( + s.pages.componentLibraries); + savePackage(store, s); + + + return s; + }) +} + +const addStylesheet = store => stylesheet => { + store.update(s => { + s.pages.stylesheets.push(stylesheet); + savePackage(store, s); + return s; + }) +} + +const removeStylesheet = store => stylesheet => { + store.update(s => { + s.pages.stylesheets = filter(s => s !== stylesheet)(s.pages.stylesheets); + savePackage(store, s); + return s; + }); +} + +const refreshComponents = store => async () => { + + const componentsAndGenerators = + await api.get(`/_builder/api/${db.appname}/components`).then(r => r.json()); + + const components = pipe(componentsAndGenerators.components, [ + keys, + map(k => ({ ...componentsAndGenerators[k], name: k })) + ]); + + store.update(s => { + s.components = pipe(s.components, [ + filter(c => !isRootComponent(c)), + concat(components) + ]); + s.generators = componentsAndGenerators.generators; + return s; + }); +}; + +const savePackage = (store, s) => { + + const appDefinition = { + hierarchy: s.hierarchy, + triggers: s.triggers, + actions: keyBy("name")(s.actions), + props: { + main: buildPropsHierarchy( + s.components, + s.screens, + s.pages.main.appBody), + unauthenticated: buildPropsHierarchy( + s.components, + s.screens, + s.pages.unauthenticated.appBody) + }, + uiFunctions: buildCodeForScreens(s.screens) + }; + + const data = { + appDefinition, + accessLevels: s.accessLevels, + pages: s.pages, + } + + return api.post(`/_builder/api/${s.appname}/appPackage`, data); +} + +const setCurrentScreen = store => screenName => { + store.update(s => { + const screen = getExactComponent(s.screens, screenName); + s.currentFrontEndItem = screen; + s.currentFrontEndType = "screen"; + s.currentComponentInfo = getScreenInfo(s.components, screen); + setCurrentScreenFunctions(s); + return s; + }) +} + +const setCurrentPage = store => pageName => { + store.update(s => { + s.currentFrontEndType = "page"; + s.currentPageName = pageName; + setCurrentScreenFunctions(s); + return s; + }); +} + +const addChildComponent = store => component => { + + store.update(s => { + const newComponent = getNewComponentInfo( + s.components, component); + + let children = s.currentComponentInfo.component ? + s.currentComponentInfo.component.props._children : + s.currentComponentInfo._children; + + const component_definition = Object.assign( + cloneDeep(newComponent.fullProps), { + _component: component, + _styles: { position: {}, layout: {} }, + _id: uuid() + }) + + if (children) { + if (s.currentComponentInfo.component) { + s.currentComponentInfo.component.props._children = children.concat(component_definition); + } else { + s.currentComponentInfo._children = children.concat(component_definition) + } + } else { + if (s.currentComponentInfo.component) { + s.currentComponentInfo.component.props._children = [component_definition]; + } else { + s.currentComponentInfo._children = [component_definition] + } + } + + _saveScreen(store, s, s.currentFrontEndItem); + + _saveScreen(store, s, s.currentFrontEndItem); + + return s; + }) +} + +const selectComponent = store => component => { + store.update(s => { + s.currentComponentInfo = component; + return s; + }) + +} + +const setComponentProp = store => (name, value) => { + store.update(s => { + const current_component = s.currentComponentInfo; + s.currentComponentInfo[name] = value; + _saveScreen(store, s, s.currentFrontEndItem); + s.currentComponentInfo = current_component; + return s; + }) +} + +const setComponentStyle = store => (type, name, value) => { + store.update(s => { + if (!s.currentComponentInfo._styles) { + s.currentComponentInfo._styles = {}; + } + s.currentComponentInfo._styles[type][name] = value; + s.currentFrontEndItem._css = generate_screen_css(s.currentFrontEndItem.props._children) + + // save without messing with the store + _save(s.appname, s.currentFrontEndItem, store, s) + + return s; + }) +} + +const setComponentCode = store => (code) => { + store.update(s => { + s.currentComponentInfo._code = code; + + setCurrentScreenFunctions(s); + // save without messing with the store + _save(s.appname, s.currentFrontEndItem, store, s) + + return s; + }) +} + +const setCurrentScreenFunctions = (s) => { + s.currentScreenFunctions = + s.currentFrontEndItem === "screen" + ? buildCodeForScreens([s.currentFrontEndItem]) + : "({});"; +} diff --git a/packages/builder/src/common/Icons/CircleIndicator.svelte b/packages/builder/src/common/Icons/CircleIndicator.svelte new file mode 100644 index 0000000000..9c0fe034f4 --- /dev/null +++ b/packages/builder/src/common/Icons/CircleIndicator.svelte @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/packages/builder/src/common/Icons/index.js b/packages/builder/src/common/Icons/index.js index c00ebb3ce4..2aeb386bd7 100644 --- a/packages/builder/src/common/Icons/index.js +++ b/packages/builder/src/common/Icons/index.js @@ -4,5 +4,6 @@ export { default as TerminalIcon } from './Terminal.svelte'; export { default as InputIcon } from './Input.svelte'; export { default as ImageIcon } from './Image.svelte'; export { default as ArrowDownIcon } from './ArrowDown.svelte'; -export { default as EventsIcon } from './Events.svelte'; +export { default as CircleIndicator } from './CircleIndicator.svelte'; export { default as PencilIcon } from './Pencil.svelte'; +export { default as EventsIcon } from './Events.svelte'; \ No newline at end of file diff --git a/packages/builder/src/common/Icons/index.js.orig b/packages/builder/src/common/Icons/index.js.orig new file mode 100644 index 0000000000..69f195a161 --- /dev/null +++ b/packages/builder/src/common/Icons/index.js.orig @@ -0,0 +1,12 @@ +export { default as LayoutIcon } from './Layout.svelte'; +export { default as PaintIcon } from './Paint.svelte'; +export { default as TerminalIcon } from './Terminal.svelte'; +export { default as InputIcon } from './Input.svelte'; +export { default as ImageIcon } from './Image.svelte'; +export { default as ArrowDownIcon } from './ArrowDown.svelte'; +<<<<<<< HEAD +export { default as CircleIndicator } from './CircleIndicator.svelte'; +======= +export { default as EventsIcon } from './Events.svelte'; +export { default as PencilIcon } from './Pencil.svelte'; +>>>>>>> master diff --git a/packages/builder/src/index.html b/packages/builder/src/index.html index 184103a067..8ce642e160 100644 --- a/packages/builder/src/index.html +++ b/packages/builder/src/index.html @@ -8,6 +8,8 @@ + + diff --git a/packages/builder/src/main.js b/packages/builder/src/main.js index 723e771208..9c2a6b5066 100644 --- a/packages/builder/src/main.js +++ b/packages/builder/src/main.js @@ -10,6 +10,8 @@ import "/assets/budibase-logo.png"; import "/assets/budibase-logo-only.png"; import "uikit/dist/css/uikit.min.css"; import "uikit/dist/js/uikit.min.js"; +import "codemirror/lib/codemirror.css"; +import 'codemirror/theme/monokai.css'; const app = new App({ target: document.getElementById("app") diff --git a/packages/builder/src/userInterface/CodeEditor.svelte b/packages/builder/src/userInterface/CodeEditor.svelte index f4f2d7aa93..dbe87d8eff 100644 --- a/packages/builder/src/userInterface/CodeEditor.svelte +++ b/packages/builder/src/userInterface/CodeEditor.svelte @@ -1,47 +1,83 @@ -
Use the code box below to add snippets of javascript to enhance your webapp
+{snippet}- -
Use the code box below to control how this component is displayed, with javascript.
+ +