@blinkk/root-cms 1.0.0-beta.23 → 1.0.0-beta.25

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/app.js CHANGED
@@ -80,12 +80,16 @@ async function renderApp(req, res, options) {
80
80
  });
81
81
  const rootConfig = options.rootConfig || {};
82
82
  const cmsConfig = options.cmsConfig || {};
83
+ let gci = cmsConfig.gci;
84
+ if (gci === true) {
85
+ gci = "https://gci.rootjs.dev";
86
+ }
83
87
  const ctx = {
84
88
  rootConfig: {
85
89
  projectId: cmsConfig.id || "default",
86
90
  projectName: cmsConfig.name || cmsConfig.id || "",
87
91
  domain: rootConfig.domain || "https://example.com",
88
- gci: cmsConfig.gci ?? "https://gci.rootjs.dev",
92
+ gci,
89
93
  i18n: rootConfig.i18n
90
94
  },
91
95
  firebaseConfig: options.firebaseConfig,
@@ -199,4 +203,4 @@ export {
199
203
  renderApp,
200
204
  renderSignIn
201
205
  };
202
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9hcHAudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCB7UmVxdWVzdCwgUmVzcG9uc2V9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge3JlbmRlciBhcyByZW5kZXJUb1N0cmluZ30gZnJvbSAncHJlYWN0LXJlbmRlci10by1zdHJpbmcnO1xuXG5pbXBvcnQge0NvbGxlY3Rpb259IGZyb20gJy4vc2NoZW1hLmpzJztcblxuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5cbmludGVyZmFjZSBBcHBQcm9wcyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGN0eDogYW55O1xufVxuXG5mdW5jdGlvbiBBcHAocHJvcHM6IEFwcFByb3BzKSB7XG4gIHJldHVybiAoXG4gICAgPGh0bWw+XG4gICAgICA8aGVhZD5cbiAgICAgICAgPHRpdGxlPntwcm9wcy50aXRsZX08L3RpdGxlPlxuICAgICAgICA8bGluayByZWw9XCJwcmVjb25uZWN0XCIgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb21cIiAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInByZWNvbm5lY3RcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tXCJcbiAgICAgICAgICBjcm9zc09yaWdpbj1cImFub255bW91c1wiXG4gICAgICAgIC8+XG4gICAgICAgIDxsaW5rXG4gICAgICAgICAgcmVsPVwic3R5bGVzaGVldFwiXG4gICAgICAgICAgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEAzMDA7NDAwOzUwMDs2MDA7NzAwOzkwMCZkaXNwbGF5PXN3YXBcIlxuICAgICAgICAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInN0eWxlc2hlZXRcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUdvb2dsZStTYW5zOndnaHRANTAwJmRpc3BsYXk9c3dhcFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwie0NTU19VUkx9XCIgLz5cbiAgICAgIDwvaGVhZD5cbiAgICAgIDxib2R5PlxuICAgICAgICA8ZGl2IGlkPVwicm9vdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9vdHN0cmFwXCI+XG4gICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwiYm9vdHN0cmFwX19sb2FkaW5nXCI+TG9hZGluZy4uLjwvaDE+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvb3RzdHJhcC1lcnJvclwiPlxuICAgICAgICAgICAgICBJZiB0aGlzIHBhZ2UgZmFpbHMgdG8gbG9hZCwgdHJ5IGEgZm9yY2UgcmVmcmVzaCBieSBob2xkaW5nIHRoZVxuICAgICAgICAgICAgICBzaGlmdCBrZXkgd2hpbGUgcmVmcmVzaGluZyB0aGUgcGFnZS5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNjcmlwdFxuICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7XG4gICAgICAgICAgICBfX2h0bWw6IGB3aW5kb3cuX19ST09UX0NUWCA9ICR7SlNPTi5zdHJpbmdpZnkocHJvcHMuY3R4KX1gLFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICAgIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiIHNyYz1cIntKU19VUkx9XCI+PC9zY3JpcHQ+XG4gICAgICA8L2JvZHk+XG4gICAgPC9odG1sPlxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyQXBwKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgb3B0aW9uczogYW55KSB7XG4gIGNvbnN0IGNvbGxlY3Rpb25Nb2R1bGVzID0gaW1wb3J0Lm1ldGEuZ2xvYignL2NvbGxlY3Rpb25zLyouc2NoZW1hLnRzJywge1xuICAgIGVhZ2VyOiB0cnVlLFxuICB9KSBhcyBhbnk7XG4gIGNvbnN0IGNvbGxlY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDb2xsZWN0aW9uPiA9IHt9O1xuICBPYmplY3Qua2V5cyhjb2xsZWN0aW9uTW9kdWxlcykuZm9yRWFjaCgobW9kdWxlSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25JZCA9IHBhdGgucGFyc2UobW9kdWxlSWQpLmJhc2Uuc3BsaXQoJy4nKVswXTtcbiAgICBjb25zdCBtb2R1bGUgPSBjb2xsZWN0aW9uTW9kdWxlc1ttb2R1bGVJZF07XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG1vZHVsZS5kZWZhdWx0IGFzIENvbGxlY3Rpb247XG4gICAgY29sbGVjdGlvbnNbY29sbGVjdGlvbklkXSA9IGNvbGxlY3Rpb247XG4gIH0pO1xuICBjb25zdCByb290Q29uZmlnID0gb3B0aW9ucy5yb290Q29uZmlnIHx8IHt9O1xuICBjb25zdCBjbXNDb25maWcgPSBvcHRpb25zLmNtc0NvbmZpZyB8fCB7fTtcbiAgY29uc3QgY3R4ID0ge1xuICAgIHJvb3RDb25maWc6IHtcbiAgICAgIHByb2plY3RJZDogY21zQ29uZmlnLmlkIHx8ICdkZWZhdWx0JyxcbiAgICAgIHByb2plY3ROYW1lOiBjbXNDb25maWcubmFtZSB8fCBjbXNDb25maWcuaWQgfHwgJycsXG4gICAgICBkb21haW46IHJvb3RDb25maWcuZG9tYWluIHx8ICdodHRwczovL2V4YW1wbGUuY29tJyxcbiAgICAgIGdjaTogY21zQ29uZmlnLmdjaSA/PyAnaHR0cHM6Ly9nY2kucm9vdGpzLmRldicsXG4gICAgICBpMThuOiByb290Q29uZmlnLmkxOG4sXG4gICAgfSxcbiAgICBmaXJlYmFzZUNvbmZpZzogb3B0aW9ucy5maXJlYmFzZUNvbmZpZyxcbiAgICBjb2xsZWN0aW9uczogY29sbGVjdGlvbnMsXG4gIH07XG4gIGNvbnN0IHByb2plY3ROYW1lID0gY21zQ29uZmlnLm5hbWUgfHwgY21zQ29uZmlnLmlkIHx8ICcnO1xuICBjb25zdCB0aXRsZSA9IHByb2plY3ROYW1lID8gYCR7cHJvamVjdE5hbWV9IFx1MjAxMyBSb290LmpzIENNU2AgOiAnUm9vdC5qcyBDTVMnO1xuXG4gIGNvbnN0IG1haW5IdG1sID0gcmVuZGVyVG9TdHJpbmcoPEFwcCB0aXRsZT17dGl0bGV9IGN0eD17Y3R4fSAvPik7XG4gIGxldCBodG1sID0gYDwhZG9jdHlwZSBodG1sPlxcbiR7bWFpbkh0bWx9YDtcbiAgaWYgKHJlcS52aXRlU2VydmVyKSB7XG4gICAgY29uc3QgdWlDc3NQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3VpL3VpLmNzcycpO1xuICAgIGNvbnN0IHVpSnNQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3VpL3VpLmpzJyk7XG4gICAgY29uc3QgdHBsID0gaHRtbFxuICAgICAgLnJlcGxhY2UoJ3tDU1NfVVJMfScsIGAvQGZzJHt1aUNzc1BhdGh9YClcbiAgICAgIC5yZXBsYWNlKCd7SlNfVVJMfScsIGAvQGZzJHt1aUpzUGF0aH1gKTtcbiAgICBodG1sID0gYXdhaXQgcmVxLnZpdGVTZXJ2ZXIhLnRyYW5zZm9ybUluZGV4SHRtbChyZXEub3JpZ2luYWxVcmwsIHRwbCk7XG4gIH0gZWxzZSB7XG4gICAgaHRtbCA9IGh0bWxcbiAgICAgIC5yZXBsYWNlKCd7Q1NTX1VSTH0nLCAnL2Ntcy9zdGF0aWMvdWkuY3NzJylcbiAgICAgIC5yZXBsYWNlKCd7SlNfVVJMfScsICcvY21zL3N0YXRpYy91aS5qcycpO1xuICB9XG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgcmVzLnNlbmQoaHRtbCk7XG59XG5cbmludGVyZmFjZSBTaWduSW5Qcm9wcyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGN0eDogYW55O1xufVxuXG5mdW5jdGlvbiBTaWduSW4ocHJvcHM6IFNpZ25JblByb3BzKSB7XG4gIHJldHVybiAoXG4gICAgPGh0bWw+XG4gICAgICA8aGVhZD5cbiAgICAgICAgPG1ldGEgY2hhcnNldD1cInV0Zi04XCIgLz5cbiAgICAgICAgPHRpdGxlPntwcm9wcy50aXRsZX08L3RpdGxlPlxuICAgICAgICA8bGluayByZWw9XCJwcmVjb25uZWN0XCIgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb21cIiAvPlxuICAgICAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMFwiIC8+XG4gICAgICAgIDxsaW5rXG4gICAgICAgICAgcmVsPVwicHJlY29ubmVjdFwiXG4gICAgICAgICAgaHJlZj1cImh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb21cIlxuICAgICAgICAgIGNyb3NzT3JpZ2luPVwiYW5vbnltb3VzXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGxpbmtcbiAgICAgICAgICByZWw9XCJzdHlsZXNoZWV0XCJcbiAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1JbnRlcjp3Z2h0QDMwMDs0MDA7NTAwOzYwMDs3MDA7OTAwJmRpc3BsYXk9c3dhcFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwie0NTU19VUkx9XCIgLz5cbiAgICAgIDwvaGVhZD5cbiAgICAgIDxib2R5PlxuICAgICAgICA8ZGl2IGlkPVwicm9vdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9vdHN0cmFwXCI+XG4gICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwiYm9vdHN0cmFwX19sb2FkaW5nXCI+TG9hZGluZy4uLjwvaDE+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvb3RzdHJhcC1lcnJvclwiPlxuICAgICAgICAgICAgICBJZiB0aGlzIHBhZ2UgZmFpbHMgdG8gbG9hZCwgdHJ5IGEgZm9yY2UgcmVmcmVzaCBieSBob2xkaW5nIHRoZVxuICAgICAgICAgICAgICBzaGlmdCBrZXkgd2hpbGUgcmVmcmVzaGluZyB0aGUgcGFnZS5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNjcmlwdFxuICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7XG4gICAgICAgICAgICBfX2h0bWw6IGB3aW5kb3cuX19ST09UX0NUWCA9ICR7SlNPTi5zdHJpbmdpZnkocHJvcHMuY3R4KX1gLFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICAgIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiIHNyYz1cIntKU19VUkx9XCI+PC9zY3JpcHQ+XG4gICAgICA8L2JvZHk+XG4gICAgPC9odG1sPlxuICApO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlclNpZ25JbihyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG9wdGlvbnM6IGFueSkge1xuICBjb25zdCBjdHggPSB7ZmlyZWJhc2VDb25maWc6IG9wdGlvbnMuZmlyZWJhc2VDb25maWd9O1xuICBjb25zdCBtYWluSHRtbCA9IHJlbmRlclRvU3RyaW5nKDxTaWduSW4gdGl0bGU9XCJTaWduIGluXCIgY3R4PXtjdHh9IC8+KTtcbiAgbGV0IGh0bWwgPSBgPCFkb2N0eXBlIGh0bWw+XFxuJHttYWluSHRtbH1gO1xuICBpZiAocmVxLnZpdGVTZXJ2ZXIpIHtcbiAgICBjb25zdCBjc3NQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3VpL3NpZ25pbi5jc3MnKTtcbiAgICBjb25zdCBqc1BhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAndWkvc2lnbmluLmpzJyk7XG4gICAgY29uc3QgdHBsID0gaHRtbFxuICAgICAgLnJlcGxhY2UoJ3tDU1NfVVJMfScsIGAvQGZzJHtjc3NQYXRofWApXG4gICAgICAucmVwbGFjZSgne0pTX1VSTH0nLCBgL0BmcyR7anNQYXRofWApO1xuICAgIGh0bWwgPSBhd2FpdCByZXEudml0ZVNlcnZlciEudHJhbnNmb3JtSW5kZXhIdG1sKHJlcS5vcmlnaW5hbFVybCwgdHBsKTtcbiAgfSBlbHNlIHtcbiAgICBodG1sID0gaHRtbFxuICAgICAgLnJlcGxhY2UoJ3tDU1NfVVJMfScsICcvY21zL3N0YXRpYy9zaWduaW4uY3NzJylcbiAgICAgIC5yZXBsYWNlKCd7SlNfVVJMfScsICcvY21zL3N0YXRpYy9zaWduaW4uanMnKTtcbiAgfVxuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJyk7XG4gIHJlcy5zZW5kKGh0bWwpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLE9BQU8sVUFBVTtBQUNqQixTQUFRLHFCQUFvQjtBQUc1QixTQUFRLFVBQVUsc0JBQXFCO0FBY2pDLFNBQ0UsS0FERjtBQVZOLElBQU0sWUFBWSxLQUFLLFFBQVEsY0FBYyxZQUFZLEdBQUcsQ0FBQztBQU83RCxTQUFTLElBQUksT0FBaUI7QUFDNUIsU0FDRSxxQkFBQztBQUFBLElBQ0M7QUFBQSwyQkFBQztBQUFBLFFBQ0M7QUFBQSw4QkFBQztBQUFBLFlBQU8sZ0JBQU07QUFBQSxXQUFNO0FBQUEsVUFDcEIsb0JBQUM7QUFBQSxZQUFLLEtBQUk7QUFBQSxZQUFhLE1BQUs7QUFBQSxXQUErQjtBQUFBLFVBQzNELG9CQUFDO0FBQUEsWUFDQyxLQUFJO0FBQUEsWUFDSixNQUFLO0FBQUEsWUFDTCxhQUFZO0FBQUEsV0FDZDtBQUFBLFVBQ0Esb0JBQUM7QUFBQSxZQUNDLEtBQUk7QUFBQSxZQUNKLE1BQUs7QUFBQSxXQUNQO0FBQUEsVUFDQSxvQkFBQztBQUFBLFlBQ0MsS0FBSTtBQUFBLFlBQ0osTUFBSztBQUFBLFdBQ1A7QUFBQSxVQUNBLG9CQUFDO0FBQUEsWUFBSyxLQUFJO0FBQUEsWUFBYSxNQUFLO0FBQUEsV0FBWTtBQUFBO0FBQUEsT0FDMUM7QUFBQSxNQUNBLHFCQUFDO0FBQUEsUUFDQztBQUFBLDhCQUFDO0FBQUEsWUFBSSxJQUFHO0FBQUEsWUFDTiwrQkFBQztBQUFBLGNBQUksV0FBVTtBQUFBLGNBQ2I7QUFBQSxvQ0FBQztBQUFBLGtCQUFHLFdBQVU7QUFBQSxrQkFBcUI7QUFBQSxpQkFBVTtBQUFBLGdCQUM3QyxvQkFBQztBQUFBLGtCQUFJLFdBQVU7QUFBQSxrQkFBa0I7QUFBQSxpQkFHakM7QUFBQTtBQUFBLGFBQ0Y7QUFBQSxXQUNGO0FBQUEsVUFDQSxvQkFBQztBQUFBLFlBQ0MseUJBQXlCO0FBQUEsY0FDdkIsUUFBUSx1QkFBdUIsS0FBSyxVQUFVLE1BQU0sR0FBRztBQUFBLFlBQ3pEO0FBQUEsV0FDRjtBQUFBLFVBQ0Esb0JBQUM7QUFBQSxZQUFPLE1BQUs7QUFBQSxZQUFTLEtBQUk7QUFBQSxXQUFXO0FBQUE7QUFBQSxPQUN2QztBQUFBO0FBQUEsR0FDRjtBQUVKO0FBRUEsZUFBc0IsVUFBVSxLQUFjLEtBQWUsU0FBYztBQUN6RSxRQUFNLG9CQUFvQixZQUFZLEtBQUssNEJBQTRCO0FBQUEsSUFDckUsT0FBTztBQUFBLEVBQ1QsQ0FBQztBQUNELFFBQU0sY0FBMEMsQ0FBQztBQUNqRCxTQUFPLEtBQUssaUJBQWlCLEVBQUUsUUFBUSxDQUFDLGFBQXFCO0FBQzNELFVBQU0sZUFBZSxLQUFLLE1BQU0sUUFBUSxFQUFFLEtBQUssTUFBTSxHQUFHLEVBQUU7QUFDMUQsVUFBTSxTQUFTLGtCQUFrQjtBQUNqQyxVQUFNLGFBQWEsT0FBTztBQUMxQixnQkFBWSxnQkFBZ0I7QUFBQSxFQUM5QixDQUFDO0FBQ0QsUUFBTSxhQUFhLFFBQVEsY0FBYyxDQUFDO0FBQzFDLFFBQU0sWUFBWSxRQUFRLGFBQWEsQ0FBQztBQUN4QyxRQUFNLE1BQU07QUFBQSxJQUNWLFlBQVk7QUFBQSxNQUNWLFdBQVcsVUFBVSxNQUFNO0FBQUEsTUFDM0IsYUFBYSxVQUFVLFFBQVEsVUFBVSxNQUFNO0FBQUEsTUFDL0MsUUFBUSxXQUFXLFVBQVU7QUFBQSxNQUM3QixLQUFLLFVBQVUsT0FBTztBQUFBLE1BQ3RCLE1BQU0sV0FBVztBQUFBLElBQ25CO0FBQUEsSUFDQSxnQkFBZ0IsUUFBUTtBQUFBLElBQ3hCO0FBQUEsRUFDRjtBQUNBLFFBQU0sY0FBYyxVQUFVLFFBQVEsVUFBVSxNQUFNO0FBQ3RELFFBQU0sUUFBUSxjQUFjLEdBQUcsbUNBQThCO0FBRTdELFFBQU0sV0FBVyxlQUFlLG9CQUFDO0FBQUEsSUFBSTtBQUFBLElBQWM7QUFBQSxHQUFVLENBQUU7QUFDL0QsTUFBSSxPQUFPO0FBQUEsRUFBb0I7QUFDL0IsTUFBSSxJQUFJLFlBQVk7QUFDbEIsVUFBTSxZQUFZLEtBQUssS0FBSyxXQUFXLFdBQVc7QUFDbEQsVUFBTSxXQUFXLEtBQUssS0FBSyxXQUFXLFVBQVU7QUFDaEQsVUFBTSxNQUFNLEtBQ1QsUUFBUSxhQUFhLE9BQU8sV0FBVyxFQUN2QyxRQUFRLFlBQVksT0FBTyxVQUFVO0FBQ3hDLFdBQU8sTUFBTSxJQUFJLFdBQVksbUJBQW1CLElBQUksYUFBYSxHQUFHO0FBQUEsRUFDdEUsT0FBTztBQUNMLFdBQU8sS0FDSixRQUFRLGFBQWEsb0JBQW9CLEVBQ3pDLFFBQVEsWUFBWSxtQkFBbUI7QUFBQSxFQUM1QztBQUNBLE1BQUksVUFBVSxnQkFBZ0IsV0FBVztBQUN6QyxNQUFJLEtBQUssSUFBSTtBQUNmO0FBT0EsU0FBUyxPQUFPLE9BQW9CO0FBQ2xDLFNBQ0UscUJBQUM7QUFBQSxJQUNDO0FBQUEsMkJBQUM7QUFBQSxRQUNDO0FBQUEsOEJBQUM7QUFBQSxZQUFLLFNBQVE7QUFBQSxXQUFRO0FBQUEsVUFDdEIsb0JBQUM7QUFBQSxZQUFPLGdCQUFNO0FBQUEsV0FBTTtBQUFBLFVBQ3BCLG9CQUFDO0FBQUEsWUFBSyxLQUFJO0FBQUEsWUFBYSxNQUFLO0FBQUEsV0FBK0I7QUFBQSxVQUMzRCxvQkFBQztBQUFBLFlBQUssTUFBSztBQUFBLFlBQVcsU0FBUTtBQUFBLFdBQXdDO0FBQUEsVUFDdEUsb0JBQUM7QUFBQSxZQUNDLEtBQUk7QUFBQSxZQUNKLE1BQUs7QUFBQSxZQUNMLGFBQVk7QUFBQSxXQUNkO0FBQUEsVUFDQSxvQkFBQztBQUFBLFlBQ0MsS0FBSTtBQUFBLFlBQ0osTUFBSztBQUFBLFdBQ1A7QUFBQSxVQUNBLG9CQUFDO0FBQUEsWUFBSyxLQUFJO0FBQUEsWUFBYSxNQUFLO0FBQUEsV0FBWTtBQUFBO0FBQUEsT0FDMUM7QUFBQSxNQUNBLHFCQUFDO0FBQUEsUUFDQztBQUFBLDhCQUFDO0FBQUEsWUFBSSxJQUFHO0FBQUEsWUFDTiwrQkFBQztBQUFBLGNBQUksV0FBVTtBQUFBLGNBQ2I7QUFBQSxvQ0FBQztBQUFBLGtCQUFHLFdBQVU7QUFBQSxrQkFBcUI7QUFBQSxpQkFBVTtBQUFBLGdCQUM3QyxvQkFBQztBQUFBLGtCQUFJLFdBQVU7QUFBQSxrQkFBa0I7QUFBQSxpQkFHakM7QUFBQTtBQUFBLGFBQ0Y7QUFBQSxXQUNGO0FBQUEsVUFDQSxvQkFBQztBQUFBLFlBQ0MseUJBQXlCO0FBQUEsY0FDdkIsUUFBUSx1QkFBdUIsS0FBSyxVQUFVLE1BQU0sR0FBRztBQUFBLFlBQ3pEO0FBQUEsV0FDRjtBQUFBLFVBQ0Esb0JBQUM7QUFBQSxZQUFPLE1BQUs7QUFBQSxZQUFTLEtBQUk7QUFBQSxXQUFXO0FBQUE7QUFBQSxPQUN2QztBQUFBO0FBQUEsR0FDRjtBQUVKO0FBQ0EsZUFBc0IsYUFBYSxLQUFjLEtBQWUsU0FBYztBQUM1RSxRQUFNLE1BQU0sRUFBQyxnQkFBZ0IsUUFBUSxlQUFjO0FBQ25ELFFBQU0sV0FBVyxlQUFlLG9CQUFDO0FBQUEsSUFBTyxPQUFNO0FBQUEsSUFBVTtBQUFBLEdBQVUsQ0FBRTtBQUNwRSxNQUFJLE9BQU87QUFBQSxFQUFvQjtBQUMvQixNQUFJLElBQUksWUFBWTtBQUNsQixVQUFNLFVBQVUsS0FBSyxLQUFLLFdBQVcsZUFBZTtBQUNwRCxVQUFNLFNBQVMsS0FBSyxLQUFLLFdBQVcsY0FBYztBQUNsRCxVQUFNLE1BQU0sS0FDVCxRQUFRLGFBQWEsT0FBTyxTQUFTLEVBQ3JDLFFBQVEsWUFBWSxPQUFPLFFBQVE7QUFDdEMsV0FBTyxNQUFNLElBQUksV0FBWSxtQkFBbUIsSUFBSSxhQUFhLEdBQUc7QUFBQSxFQUN0RSxPQUFPO0FBQ0wsV0FBTyxLQUNKLFFBQVEsYUFBYSx3QkFBd0IsRUFDN0MsUUFBUSxZQUFZLHVCQUF1QjtBQUFBLEVBQ2hEO0FBQ0EsTUFBSSxVQUFVLGdCQUFnQixXQUFXO0FBQ3pDLE1BQUksS0FBSyxJQUFJO0FBQ2Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
206
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9hcHAudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtmaWxlVVJMVG9QYXRofSBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCB7UmVxdWVzdCwgUmVzcG9uc2V9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQge3JlbmRlciBhcyByZW5kZXJUb1N0cmluZ30gZnJvbSAncHJlYWN0LXJlbmRlci10by1zdHJpbmcnO1xuXG5pbXBvcnQge0NvbGxlY3Rpb259IGZyb20gJy4vc2NoZW1hLmpzJztcblxuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5cbmludGVyZmFjZSBBcHBQcm9wcyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGN0eDogYW55O1xufVxuXG5mdW5jdGlvbiBBcHAocHJvcHM6IEFwcFByb3BzKSB7XG4gIHJldHVybiAoXG4gICAgPGh0bWw+XG4gICAgICA8aGVhZD5cbiAgICAgICAgPHRpdGxlPntwcm9wcy50aXRsZX08L3RpdGxlPlxuICAgICAgICA8bGluayByZWw9XCJwcmVjb25uZWN0XCIgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb21cIiAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInByZWNvbm5lY3RcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tXCJcbiAgICAgICAgICBjcm9zc09yaWdpbj1cImFub255bW91c1wiXG4gICAgICAgIC8+XG4gICAgICAgIDxsaW5rXG4gICAgICAgICAgcmVsPVwic3R5bGVzaGVldFwiXG4gICAgICAgICAgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEAzMDA7NDAwOzUwMDs2MDA7NzAwOzkwMCZkaXNwbGF5PXN3YXBcIlxuICAgICAgICAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInN0eWxlc2hlZXRcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUdvb2dsZStTYW5zOndnaHRANTAwJmRpc3BsYXk9c3dhcFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwie0NTU19VUkx9XCIgLz5cbiAgICAgIDwvaGVhZD5cbiAgICAgIDxib2R5PlxuICAgICAgICA8ZGl2IGlkPVwicm9vdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9vdHN0cmFwXCI+XG4gICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwiYm9vdHN0cmFwX19sb2FkaW5nXCI+TG9hZGluZy4uLjwvaDE+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvb3RzdHJhcC1lcnJvclwiPlxuICAgICAgICAgICAgICBJZiB0aGlzIHBhZ2UgZmFpbHMgdG8gbG9hZCwgdHJ5IGEgZm9yY2UgcmVmcmVzaCBieSBob2xkaW5nIHRoZVxuICAgICAgICAgICAgICBzaGlmdCBrZXkgd2hpbGUgcmVmcmVzaGluZyB0aGUgcGFnZS5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNjcmlwdFxuICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7XG4gICAgICAgICAgICBfX2h0bWw6IGB3aW5kb3cuX19ST09UX0NUWCA9ICR7SlNPTi5zdHJpbmdpZnkocHJvcHMuY3R4KX1gLFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICAgIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiIHNyYz1cIntKU19VUkx9XCI+PC9zY3JpcHQ+XG4gICAgICA8L2JvZHk+XG4gICAgPC9odG1sPlxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyQXBwKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgb3B0aW9uczogYW55KSB7XG4gIGNvbnN0IGNvbGxlY3Rpb25Nb2R1bGVzID0gaW1wb3J0Lm1ldGEuZ2xvYignL2NvbGxlY3Rpb25zLyouc2NoZW1hLnRzJywge1xuICAgIGVhZ2VyOiB0cnVlLFxuICB9KSBhcyBhbnk7XG4gIGNvbnN0IGNvbGxlY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBDb2xsZWN0aW9uPiA9IHt9O1xuICBPYmplY3Qua2V5cyhjb2xsZWN0aW9uTW9kdWxlcykuZm9yRWFjaCgobW9kdWxlSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25JZCA9IHBhdGgucGFyc2UobW9kdWxlSWQpLmJhc2Uuc3BsaXQoJy4nKVswXTtcbiAgICBjb25zdCBtb2R1bGUgPSBjb2xsZWN0aW9uTW9kdWxlc1ttb2R1bGVJZF07XG4gICAgY29uc3QgY29sbGVjdGlvbiA9IG1vZHVsZS5kZWZhdWx0IGFzIENvbGxlY3Rpb247XG4gICAgY29sbGVjdGlvbnNbY29sbGVjdGlvbklkXSA9IGNvbGxlY3Rpb247XG4gIH0pO1xuICBjb25zdCByb290Q29uZmlnID0gb3B0aW9ucy5yb290Q29uZmlnIHx8IHt9O1xuICBjb25zdCBjbXNDb25maWcgPSBvcHRpb25zLmNtc0NvbmZpZyB8fCB7fTtcbiAgbGV0IGdjaSA9IGNtc0NvbmZpZy5nY2k7XG4gIGlmIChnY2kgPT09IHRydWUpIHtcbiAgICBnY2kgPSAnaHR0cHM6Ly9nY2kucm9vdGpzLmRldic7XG4gIH1cbiAgY29uc3QgY3R4ID0ge1xuICAgIHJvb3RDb25maWc6IHtcbiAgICAgIHByb2plY3RJZDogY21zQ29uZmlnLmlkIHx8ICdkZWZhdWx0JyxcbiAgICAgIHByb2plY3ROYW1lOiBjbXNDb25maWcubmFtZSB8fCBjbXNDb25maWcuaWQgfHwgJycsXG4gICAgICBkb21haW46IHJvb3RDb25maWcuZG9tYWluIHx8ICdodHRwczovL2V4YW1wbGUuY29tJyxcbiAgICAgIGdjaTogZ2NpLFxuICAgICAgaTE4bjogcm9vdENvbmZpZy5pMThuLFxuICAgIH0sXG4gICAgZmlyZWJhc2VDb25maWc6IG9wdGlvbnMuZmlyZWJhc2VDb25maWcsXG4gICAgY29sbGVjdGlvbnM6IGNvbGxlY3Rpb25zLFxuICB9O1xuICBjb25zdCBwcm9qZWN0TmFtZSA9IGNtc0NvbmZpZy5uYW1lIHx8IGNtc0NvbmZpZy5pZCB8fCAnJztcbiAgY29uc3QgdGl0bGUgPSBwcm9qZWN0TmFtZSA/IGAke3Byb2plY3ROYW1lfSBcdTIwMTMgUm9vdC5qcyBDTVNgIDogJ1Jvb3QuanMgQ01TJztcblxuICBjb25zdCBtYWluSHRtbCA9IHJlbmRlclRvU3RyaW5nKDxBcHAgdGl0bGU9e3RpdGxlfSBjdHg9e2N0eH0gLz4pO1xuICBsZXQgaHRtbCA9IGA8IWRvY3R5cGUgaHRtbD5cXG4ke21haW5IdG1sfWA7XG4gIGlmIChyZXEudml0ZVNlcnZlcikge1xuICAgIGNvbnN0IHVpQ3NzUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICd1aS91aS5jc3MnKTtcbiAgICBjb25zdCB1aUpzUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICd1aS91aS5qcycpO1xuICAgIGNvbnN0IHRwbCA9IGh0bWxcbiAgICAgIC5yZXBsYWNlKCd7Q1NTX1VSTH0nLCBgL0BmcyR7dWlDc3NQYXRofWApXG4gICAgICAucmVwbGFjZSgne0pTX1VSTH0nLCBgL0BmcyR7dWlKc1BhdGh9YCk7XG4gICAgaHRtbCA9IGF3YWl0IHJlcS52aXRlU2VydmVyIS50cmFuc2Zvcm1JbmRleEh0bWwocmVxLm9yaWdpbmFsVXJsLCB0cGwpO1xuICB9IGVsc2Uge1xuICAgIGh0bWwgPSBodG1sXG4gICAgICAucmVwbGFjZSgne0NTU19VUkx9JywgJy9jbXMvc3RhdGljL3VpLmNzcycpXG4gICAgICAucmVwbGFjZSgne0pTX1VSTH0nLCAnL2Ntcy9zdGF0aWMvdWkuanMnKTtcbiAgfVxuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJyk7XG4gIHJlcy5zZW5kKGh0bWwpO1xufVxuXG5pbnRlcmZhY2UgU2lnbkluUHJvcHMge1xuICB0aXRsZTogc3RyaW5nO1xuICBjdHg6IGFueTtcbn1cblxuZnVuY3Rpb24gU2lnbkluKHByb3BzOiBTaWduSW5Qcm9wcykge1xuICByZXR1cm4gKFxuICAgIDxodG1sPlxuICAgICAgPGhlYWQ+XG4gICAgICAgIDxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiIC8+XG4gICAgICAgIDx0aXRsZT57cHJvcHMudGl0bGV9PC90aXRsZT5cbiAgICAgICAgPGxpbmsgcmVsPVwicHJlY29ubmVjdFwiIGhyZWY9XCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tXCIgLz5cbiAgICAgICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjBcIiAvPlxuICAgICAgICA8bGlua1xuICAgICAgICAgIHJlbD1cInByZWNvbm5lY3RcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tXCJcbiAgICAgICAgICBjcm9zc09yaWdpbj1cImFub255bW91c1wiXG4gICAgICAgIC8+XG4gICAgICAgIDxsaW5rXG4gICAgICAgICAgcmVsPVwic3R5bGVzaGVldFwiXG4gICAgICAgICAgaHJlZj1cImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEAzMDA7NDAwOzUwMDs2MDA7NzAwOzkwMCZkaXNwbGF5PXN3YXBcIlxuICAgICAgICAvPlxuICAgICAgICA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cIntDU1NfVVJMfVwiIC8+XG4gICAgICA8L2hlYWQ+XG4gICAgICA8Ym9keT5cbiAgICAgICAgPGRpdiBpZD1cInJvb3RcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvb3RzdHJhcFwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cImJvb3RzdHJhcF9fbG9hZGluZ1wiPkxvYWRpbmcuLi48L2gxPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJib290c3RyYXAtZXJyb3JcIj5cbiAgICAgICAgICAgICAgSWYgdGhpcyBwYWdlIGZhaWxzIHRvIGxvYWQsIHRyeSBhIGZvcmNlIHJlZnJlc2ggYnkgaG9sZGluZyB0aGVcbiAgICAgICAgICAgICAgc2hpZnQga2V5IHdoaWxlIHJlZnJlc2hpbmcgdGhlIHBhZ2UuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzY3JpcHRcbiAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17e1xuICAgICAgICAgICAgX19odG1sOiBgd2luZG93Ll9fUk9PVF9DVFggPSAke0pTT04uc3RyaW5naWZ5KHByb3BzLmN0eCl9YCxcbiAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICAgICA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIiBzcmM9XCJ7SlNfVVJMfVwiPjwvc2NyaXB0PlxuICAgICAgPC9ib2R5PlxuICAgIDwvaHRtbD5cbiAgKTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJTaWduSW4ocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBvcHRpb25zOiBhbnkpIHtcbiAgY29uc3QgY3R4ID0ge2ZpcmViYXNlQ29uZmlnOiBvcHRpb25zLmZpcmViYXNlQ29uZmlnfTtcbiAgY29uc3QgbWFpbkh0bWwgPSByZW5kZXJUb1N0cmluZyg8U2lnbkluIHRpdGxlPVwiU2lnbiBpblwiIGN0eD17Y3R4fSAvPik7XG4gIGxldCBodG1sID0gYDwhZG9jdHlwZSBodG1sPlxcbiR7bWFpbkh0bWx9YDtcbiAgaWYgKHJlcS52aXRlU2VydmVyKSB7XG4gICAgY29uc3QgY3NzUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICd1aS9zaWduaW4uY3NzJyk7XG4gICAgY29uc3QganNQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3VpL3NpZ25pbi5qcycpO1xuICAgIGNvbnN0IHRwbCA9IGh0bWxcbiAgICAgIC5yZXBsYWNlKCd7Q1NTX1VSTH0nLCBgL0BmcyR7Y3NzUGF0aH1gKVxuICAgICAgLnJlcGxhY2UoJ3tKU19VUkx9JywgYC9AZnMke2pzUGF0aH1gKTtcbiAgICBodG1sID0gYXdhaXQgcmVxLnZpdGVTZXJ2ZXIhLnRyYW5zZm9ybUluZGV4SHRtbChyZXEub3JpZ2luYWxVcmwsIHRwbCk7XG4gIH0gZWxzZSB7XG4gICAgaHRtbCA9IGh0bWxcbiAgICAgIC5yZXBsYWNlKCd7Q1NTX1VSTH0nLCAnL2Ntcy9zdGF0aWMvc2lnbmluLmNzcycpXG4gICAgICAucmVwbGFjZSgne0pTX1VSTH0nLCAnL2Ntcy9zdGF0aWMvc2lnbmluLmpzJyk7XG4gIH1cbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpO1xuICByZXMuc2VuZChodG1sKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxPQUFPLFVBQVU7QUFDakIsU0FBUSxxQkFBb0I7QUFHNUIsU0FBUSxVQUFVLHNCQUFxQjtBQWNqQyxTQUNFLEtBREY7QUFWTixJQUFNLFlBQVksS0FBSyxRQUFRLGNBQWMsWUFBWSxHQUFHLENBQUM7QUFPN0QsU0FBUyxJQUFJLE9BQWlCO0FBQzVCLFNBQ0UscUJBQUM7QUFBQSxJQUNDO0FBQUEsMkJBQUM7QUFBQSxRQUNDO0FBQUEsOEJBQUM7QUFBQSxZQUFPLGdCQUFNO0FBQUEsV0FBTTtBQUFBLFVBQ3BCLG9CQUFDO0FBQUEsWUFBSyxLQUFJO0FBQUEsWUFBYSxNQUFLO0FBQUEsV0FBK0I7QUFBQSxVQUMzRCxvQkFBQztBQUFBLFlBQ0MsS0FBSTtBQUFBLFlBQ0osTUFBSztBQUFBLFlBQ0wsYUFBWTtBQUFBLFdBQ2Q7QUFBQSxVQUNBLG9CQUFDO0FBQUEsWUFDQyxLQUFJO0FBQUEsWUFDSixNQUFLO0FBQUEsV0FDUDtBQUFBLFVBQ0Esb0JBQUM7QUFBQSxZQUNDLEtBQUk7QUFBQSxZQUNKLE1BQUs7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
package/dist/plugin.d.ts CHANGED
@@ -32,8 +32,19 @@ type CMSPluginOptions = {
32
32
  isUserAuthorized?: (req: Request, user: CMSUser) => boolean | Promise<boolean>;
33
33
  /**
34
34
  * URL to GCI service for transforming uploaded GCS images to a Google App
35
- * Engine Images API serving URL. Defaults to "https://gci.rootjs.dev". To
36
- * disable, set this value to `false`.
35
+ * Engine Images API serving URL.
36
+ *
37
+ * Setting this to `true` uses the default hosted service at
38
+ * https://gci.rootjs.dev.
39
+ *
40
+ * To set up GCI:
41
+ *
42
+ * - Create a GCS bucket with fine-grained permissions
43
+ * - Share owner access to the bucket with the service account returned in
44
+ * https://gci.rootjs.dev/_/service_account
45
+ *
46
+ * To disable GCI, leave this value empty or set to `false`, which which will
47
+ * serve images directly from GCS instead.
37
48
  */
38
49
  gci?: string | boolean;
39
50
  };
package/dist/plugin.js CHANGED
@@ -8,37 +8,61 @@ import { applicationDefault, initializeApp } from "firebase-admin/app";
8
8
  import { getAuth } from "firebase-admin/auth";
9
9
  import sirv from "sirv";
10
10
 
11
+ // core/api.ts
12
+ import multer from "multer";
13
+
11
14
  // core/csv.ts
12
- import { createRequire } from "node:module";
13
- var require2 = createRequire(import.meta.url);
14
- var createObjectCsvStringifier = require2("csv-writer").createObjectCsvStringifier;
15
+ import { parse as csvParse } from "csv-parse/sync";
16
+ import { stringify as csvStringify } from "csv-stringify/sync";
15
17
  function arrayToCsv(req) {
16
18
  const headers = req.headers || [];
17
19
  const rows = req.rows || [];
18
- if (headers.length === 0 || rows.length === 0) {
19
- return "";
20
- }
21
- const csvWriter = createObjectCsvStringifier({
22
- header: headers.map((h) => ({ id: h, title: h }))
20
+ return csvStringify(rows, {
21
+ header: true,
22
+ columns: headers
23
23
  });
24
- const csvHeader = csvWriter.getHeaderString() || "";
25
- const csvRows = csvWriter.stringifyRecords(rows) || "";
26
- return csvHeader + csvRows;
24
+ }
25
+ function csvToArray(csvString) {
26
+ const rows = csvParse(csvString, {
27
+ columns: true,
28
+ skip_empty_lines: true
29
+ });
30
+ return rows;
27
31
  }
28
32
 
29
33
  // core/api.ts
34
+ var upload = multer();
30
35
  function api(server) {
31
36
  server.use("/cms/api/csv.download", (req, res) => {
32
37
  if (req.method !== "POST" || !String(req.get("content-type")).startsWith("application/json")) {
33
38
  res.status(400).json({ success: false, error: "BAD_REQUEST" });
34
39
  }
35
- const body = req.body || {};
36
- const headers = body.headers || [];
37
- const rows = body.rows || [];
38
- const csv = arrayToCsv({ headers, rows });
39
- res.setHeader("Content-Type", "text/csv");
40
- res.setHeader("Content-Disposition", 'attachment; filename="data.csv"');
41
- res.status(200).end(csv);
40
+ try {
41
+ const body = req.body || {};
42
+ const headers = body.headers || [];
43
+ const rows = body.rows || [];
44
+ const csv = arrayToCsv({ headers, rows });
45
+ res.setHeader("Content-Type", "text/csv");
46
+ res.setHeader("Content-Disposition", 'attachment; filename="data.csv"');
47
+ res.status(200).end(csv);
48
+ } catch (err) {
49
+ console.error(err.stack || err);
50
+ res.status(500).json({ success: false, error: "UNKNOWN" });
51
+ }
52
+ });
53
+ server.use("/cms/api/csv.import", upload.single("file"), (req, res) => {
54
+ if (req.method !== "POST" || !req.file) {
55
+ res.status(400).json({ success: false, error: "BAD_REQUEST" });
56
+ }
57
+ try {
58
+ const file = req.file;
59
+ const csvString = file.buffer.toString("utf8");
60
+ const rows = csvToArray(csvString);
61
+ res.status(200).json({ success: true, data: rows });
62
+ } catch (err) {
63
+ console.error(err.stack || err);
64
+ res.status(500).json({ success: false, error: "UNKNOWN" });
65
+ }
42
66
  });
43
67
  }
44
68
 
@@ -172,8 +196,10 @@ function cmsPlugin(options) {
172
196
  const expiresIn = 60 * 60 * 24 * 5 * 1e3;
173
197
  const idToken = req.body.idToken;
174
198
  let sessionCookie;
199
+ let secureCookie = true;
175
200
  if (process.env.NODE_ENV === "development") {
176
201
  sessionCookie = idToken;
202
+ secureCookie = false;
177
203
  } else {
178
204
  sessionCookie = await auth.createSessionCookie(idToken, {
179
205
  expiresIn
@@ -182,7 +208,7 @@ function cmsPlugin(options) {
182
208
  res.cookie(SESSION_COOKIE, sessionCookie, {
183
209
  maxAge: expiresIn,
184
210
  httpOnly: true,
185
- secure: true
211
+ secure: secureCookie
186
212
  });
187
213
  res.json({ success: true });
188
214
  } catch (err) {
@@ -251,4 +277,4 @@ function fileExists(filepath) {
251
277
  export {
252
278
  cmsPlugin
253
279
  };
254
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9wbHVnaW4udHMiLCAiLi4vY29yZS9jc3YudHMiLCAiLi4vY29yZS9hcGkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7cHJvbWlzZXMgYXMgZnN9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7ZmlsZVVSTFRvUGF0aH0gZnJvbSAnbm9kZTp1cmwnO1xuXG5pbXBvcnQge1xuICBDb25maWd1cmVTZXJ2ZXJPcHRpb25zLFxuICBOZXh0RnVuY3Rpb24sXG4gIFBsdWdpbixcbiAgUmVxdWVzdCxcbiAgUmVzcG9uc2UsXG4gIFNlcnZlcixcbn0gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCBib2R5UGFyc2VyIGZyb20gJ2JvZHktcGFyc2VyJztcbmltcG9ydCBjb29raWVQYXJzZXIgZnJvbSAnY29va2llLXBhcnNlcic7XG5pbXBvcnQge2FwcGxpY2F0aW9uRGVmYXVsdCwgaW5pdGlhbGl6ZUFwcH0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vYXBwJztcbmltcG9ydCB7Z2V0QXV0aCwgRGVjb2RlZElkVG9rZW59IGZyb20gJ2ZpcmViYXNlLWFkbWluL2F1dGgnO1xuaW1wb3J0IHNpcnYgZnJvbSAnc2lydic7XG5pbXBvcnQge2FwaX0gZnJvbSAnLi9hcGkuanMnO1xuXG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxudHlwZSBBcHBNb2R1bGUgPSB0eXBlb2YgaW1wb3J0KCcuL2FwcC5qcycpO1xuXG5jb25zdCBTRVNTSU9OX0NPT0tJRSA9ICdfcm9vdGpzX2Ntcyc7XG5cbmV4cG9ydCB0eXBlIENNU1VzZXIgPSBEZWNvZGVkSWRUb2tlbjtcblxuZXhwb3J0IHR5cGUgQ01TUGx1Z2luT3B0aW9ucyA9IHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcHJvamVjdC4gRGF0YSB3aWxsIGJlIHN0b3JlZCB1bmRlciB0aGUgbmFtZXNwYWNlXG4gICAqIGBQcm9qZWN0cy8ke2lkfWAgaW4gZmlyZXN0b3JlLlxuICAgKi9cbiAgaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LiBVc2VkIGluIHRoZSBoZWFkZXIgb2YgdGhlIENNUyB0byBoZWxwIGlkZW50aWZ5XG4gICAqIHRoZSBwcm9qZWN0LlxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlyZWJhc2UgY29uZmlnIG9iamVjdCwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGluIHRoZSBGaXJlYmFzZSBDb25zb2xlIGJ5XG4gICAqIGdvaW5nIHRvIFwiUHJvamVjdCBTZXR0aW5nc1wiLlxuICAgKi9cbiAgZmlyZWJhc2VDb25maWc6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG4gICAgYXBpS2V5OiBzdHJpbmc7XG4gICAgYXV0aERvbWFpbjogc3RyaW5nO1xuICAgIHByb2plY3RJZDogc3RyaW5nO1xuICAgIHN0b3JhZ2VCdWNrZXQ6IHN0cmluZztcbiAgICBtZXNzYWdpbmdTZW5kZXJJZDogc3RyaW5nO1xuICAgIGFwcElkOiBzdHJpbmc7XG4gIH07XG5cbiAgLyoqIFNlY3JldCB2YWx1ZShzKSB1c2VkIGZvciBzaWduaW5nIHRoZSB1c2VyIGF1dGhlbnRpY2F0aW9uIGNvb2tpZS4gKi9cbiAgY29va2llU2VjcmV0Pzogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLyoqIEZ1bmN0aW9uIGNhbGxlZCB0byBjaGVjayBpZiBhIHVzZXIgc2hvdWxkIGhhdmUgYWNjZXNzIHRvIHRoZSBDTVMuICovXG4gIGlzVXNlckF1dGhvcml6ZWQ/OiAoXG4gICAgcmVxOiBSZXF1ZXN0LFxuICAgIHVzZXI6IENNU1VzZXJcbiAgKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogVVJMIHRvIEdDSSBzZXJ2aWNlIGZvciB0cmFuc2Zvcm1pbmcgdXBsb2FkZWQgR0NTIGltYWdlcyB0byBhIEdvb2dsZSBBcHBcbiAgICogRW5naW5lIEltYWdlcyBBUEkgc2VydmluZyBVUkwuIERlZmF1bHRzIHRvIFwiaHR0cHM6Ly9nY2kucm9vdGpzLmRldlwiLiBUb1xuICAgKiBkaXNhYmxlLCBzZXQgdGhpcyB2YWx1ZSB0byBgZmFsc2VgLlxuICAgKi9cbiAgZ2NpPzogc3RyaW5nIHwgYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIENNU1BsdWdpbiA9IFBsdWdpbiAmIHtcbiAgbmFtZTogJ3Jvb3QtY21zJztcbiAgZ2V0Q29uZmlnOiAoKSA9PiBDTVNQbHVnaW5PcHRpb25zO1xufTtcblxuZnVuY3Rpb24gZ2VuZXJhdGVTZWNyZXQoKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGNvbnN0IGNoYXJzID1cbiAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDM2OyBpKyspIHtcbiAgICBjb25zdCByYW5kID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKTtcbiAgICByZXN1bHQucHVzaChjaGFycy5jaGFyQXQocmFuZCkpO1xuICB9XG4gIHJldHVybiByZXN1bHQuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGlzRXhwaXJlZChkZWNvZGVkSWRUb2tlbjogRGVjb2RlZElkVG9rZW4pIHtcbiAgY29uc3QgdHMgPSBNYXRoLmZsb29yKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCk7XG4gIHJldHVybiB0cyA+PSBkZWNvZGVkSWRUb2tlbi5leHA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbXNQbHVnaW4ob3B0aW9uczogQ01TUGx1Z2luT3B0aW9ucyk6IENNU1BsdWdpbiB7XG4gIGNvbnN0IGZpcmViYXNlQ29uZmlnID0gb3B0aW9ucy5maXJlYmFzZUNvbmZpZztcbiAgY29uc3QgY29va2llU2VjcmV0ID0gb3B0aW9ucy5jb29raWVTZWNyZXQgfHwgZ2VuZXJhdGVTZWNyZXQoKTtcbiAgY29uc3QgYXBwID0gaW5pdGlhbGl6ZUFwcCh7XG4gICAgcHJvamVjdElkOiBmaXJlYmFzZUNvbmZpZy5wcm9qZWN0SWQsXG4gICAgY3JlZGVudGlhbDogYXBwbGljYXRpb25EZWZhdWx0KCksXG4gIH0pO1xuICBjb25zdCBhdXRoID0gZ2V0QXV0aChhcHApO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgbG9naW4gaXMgcmVxdWlyZWQgZm9yIHRoZSByZXF1ZXN0LiBDdXJyZW50bHkgcmV0dXJucyBgdHJ1ZWAgaWZcbiAgICogdGhlIFVSTCBwYXRoIHN0YXJ0cyB3aXRoIC9jbXMgb3IgaWYgP3ByZXZpZXc9dHJ1ZSBpcyBpbiB0aGUgVVJMLlxuICAgKi9cbiAgZnVuY3Rpb24gbG9naW5SZXF1aXJlZChyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgICBpZiAocmVxLm9yaWdpbmFsVXJsLnN0YXJ0c1dpdGgoJy9jbXMnKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChTdHJpbmcocmVxLnF1ZXJ5LnByZXZpZXcpID09PSAndHJ1ZScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgYSBuZXcgbG9naW4gcmVxdWVzdCBmb3IgYSB1c2VyLiBUaGUgcmVxdWVzdCBib2R5IHNob3VsZCBjb250YWluXG4gICAqIGFuIGlkVG9rZW4sIHdoaWNoIGlzIHZlcmlmaWVkIG9uIHByb2QgdXNpbmcgRmlyZWJhc2UgQWRtaW4gYW5kIElkZW50aXR5XG4gICAqIFRvb2xraXQuIElmIGEgYGlzVXNlckF1dGhvcml6ZWQoKWAgY29uZmlnIGlzIHNldCwgdGhpcyBmdW5jdGlvbiB3aWxsIGFsc29cbiAgICogdmVyaWZ5IHZpYSB0aGF0IGZ1bmN0aW9uLiBSZXR1cm5zIHRydWUgaWYgdGhlIGxvZ2luIHZlcmlmaWNhdGlvbiBzdWNjZWVkcy5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVVzZXJMb2dpbihyZXE6IFJlcXVlc3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBpZFRva2VuID0gcmVxLmJvZHk/LmlkVG9rZW47XG4gICAgaWYgKCFpZFRva2VuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gT24gbG9jYWwgZGV2LCBzaW1wbHkgdmVyaWZ5IHRoYXQgYW4gaWRUb2tlbiBpcyBzZXQuIFRoZSBpZGVudGl0eSB0b29sa2l0XG4gICAgLy8gdGhhdCB2ZXJpZmllcyBpZCB0b2tlbnMgcmVxdWlyZXMgYSBzZXJ2aWNlIGFjY291bnQsIHdoaWNoIHdlIHdhbnQgdG9cbiAgICAvLyBhdm9pZCBoYXZpbmcgdG8gc2V0IHVwIHdoZW4gdXNlcnMgYXJlIGRvaW5nIGxvY2FsIGRldmVsb3BtZW50LlxuICAgIC8vIEF1dGhlbnRpY2F0aW9uIGlzIHN0aWxsIHJlcXVpcmVkIGJ5IHRoZSBmcm9udGVuZCB1c2luZyBGaXJlYmFzZSBBdXRoLFxuICAgIC8vIHRoaXMganVzdCBieXBhc3NlcyB0aGUgaW5pdGlhbCBzZXJ2ZXIgY2hlY2sgYmVmb3JlIHRoZSB1aSBpcyByZW5kZXJlZC5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKGlkVG9rZW4pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBqd3QgPSBhd2FpdCBhdXRoLnZlcmlmeUlkVG9rZW4oaWRUb2tlbiwgdHJ1ZSk7XG4gICAgICBpZiAoaXNFeHBpcmVkKGp3dCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFqd3QuZW1haWwgfHwgIWp3dC5lbWFpbF92ZXJpZmllZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5pc1VzZXJBdXRob3JpemVkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBvcHRpb25zLmlzVXNlckF1dGhvcml6ZWQocmVxLCBqd3QpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignZmFpbGVkIHRvIHZlcmlmeSBqd3QgdG9rZW4nKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gVE9ETyhzdGV2ZW5sZSk6IGRlY2lkZSB3aGV0aGVyIHdlIHdhbnQgdG8gZW5mb3JjZSBgaXNVc2VyQXV0aG9yaXplZCgpYC5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgc2Vzc2lvbiBzaG91bGQgYmUgYWxsb3dlZCB0byBhY2Nlc3MgdGhlXG4gICAqIENNUy4gUmV0dXJucyB0cnVlIGlmIGFjY2VzcyBpcyBncmFudGVkLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VXNlclNlc3Npb24ocmVxOiBSZXF1ZXN0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc2Vzc2lvbkNvb2tpZSA9IFN0cmluZyhyZXEuY29va2llc1tTRVNTSU9OX0NPT0tJRV0gfHwgJycpO1xuICAgIGlmICghc2Vzc2lvbkNvb2tpZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE9uIGxvY2FsIGRldiwgc2ltcGx5IHZlcmlmeSB0aGF0IGFuIHNlc3Npb24gY29va2llIGlzIHNldC4gU2VlIG5vdGVcbiAgICAvLyBhYm92ZSBpbiBgdmVyaWZ5VXNlckxvZ2luKClgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oc2Vzc2lvbkNvb2tpZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGp3dCA9IGF3YWl0IGF1dGgudmVyaWZ5U2Vzc2lvbkNvb2tpZShzZXNzaW9uQ29va2llLCB0cnVlKTtcbiAgICAgIGlmIChpc0V4cGlyZWQoand0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIWp3dC5lbWFpbCB8fCAhand0LmVtYWlsX3ZlcmlmaWVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLmlzVXNlckF1dGhvcml6ZWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG9wdGlvbnMuaXNVc2VyQXV0aG9yaXplZChyZXEsIGp3dCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPKHN0ZXZlbmxlKTogZGVjaWRlIHdoZXRoZXIgd2Ugd2FudCB0byBlbmZvcmNlIGBpc1VzZXJBdXRob3JpemVkKClgLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmYWlsZWQgdG8gdmVyaWZ5IGp3dCB0b2tlbicpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3Jvb3QtY21zJyxcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvbmZpZyBvcHRpb25zIHBhc3NlZCB0byB0aGUgcGx1Z2luLlxuICAgICAqL1xuICAgIGdldENvbmZpZzogKCkgPT4ge1xuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgbWFwIG9mIHNzciBmaWxlcyB0byBpbmNsdWRlIHdoZW4gcnVubmluZyBgcm9vdCBidWlsZGAuXG4gICAgICovXG4gICAgc3NySW5wdXQ6ICgpID0+ICh7XG4gICAgICBjbXM6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL2FwcC5qcycpLFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgQ01TLXNwZWNpZmljIG1pZGRsZXdhcmUgdG8gdGhlIFJvb3QuanMgc2VydmVyLlxuICAgICAqL1xuICAgIGNvbmZpZ3VyZVNlcnZlcjogYXN5bmMgKFxuICAgICAgc2VydmVyOiBTZXJ2ZXIsXG4gICAgICBzZXJ2ZXJPcHRpb25zOiBDb25maWd1cmVTZXJ2ZXJPcHRpb25zXG4gICAgKSA9PiB7XG4gICAgICBzZXJ2ZXIudXNlKGNvb2tpZVBhcnNlcihjb29raWVTZWNyZXQpKTtcbiAgICAgIHNlcnZlci51c2UoYm9keVBhcnNlci5qc29uKCkpO1xuXG4gICAgICBhc3luYyBmdW5jdGlvbiBnZXRSZW5kZXJlcihyZXE6IFJlcXVlc3QpOiBQcm9taXNlPEFwcE1vZHVsZT4ge1xuICAgICAgICBpZiAoc2VydmVyT3B0aW9ucy50eXBlID09PSAnZGV2Jykge1xuICAgICAgICAgIGNvbnN0IGFwcEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vYXBwLmpzJyk7XG4gICAgICAgICAgY29uc3QgYXBwID0gKGF3YWl0IHJlcS52aXRlU2VydmVyIS5zc3JMb2FkTW9kdWxlKFxuICAgICAgICAgICAgYXBwRmlsZVBhdGhcbiAgICAgICAgICApKSBhcyBBcHBNb2R1bGU7XG4gICAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFwcEltcG9ydFBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgcmVxLnJvb3RDb25maWchLnJvb3REaXIsXG4gICAgICAgICAgJ2Rpc3Qvc2VydmVyL2Ntcy5qcydcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEoYXdhaXQgZmlsZUV4aXN0cyhhcHBJbXBvcnRQYXRoKSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnZGlzdC9zZXJ2ZXIvY21zLmpzIG5vdCBmb3VuZC4gcnVuIGByb290IGJ1aWxkYCB0byBjcmVhdGUgaXQuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBwID0gKGF3YWl0IGltcG9ydChhcHBJbXBvcnRQYXRoKSkgYXMgQXBwTW9kdWxlO1xuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGF0aWNEaXIgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAndWknKTtcbiAgICAgIHNlcnZlci51c2UoJy9jbXMvc3RhdGljJywgc2lydihzdGF0aWNEaXIsIHtkZXY6IGZhbHNlfSkpO1xuXG4gICAgICAvLyBMb2dpbiBoYW5kbGVyLlxuICAgICAgc2VydmVyLnVzZSgnL2Ntcy9sb2dpbicsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJlcS5tZXRob2QgPT09ICdQVVQnICYmXG4gICAgICAgICAgcmVxLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID09PSAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGlzQXV0aG9yaXplZCA9IGF3YWl0IHZlcmlmeVVzZXJMb2dpbihyZXEpO1xuICAgICAgICAgICAgaWYgKCFpc0F1dGhvcml6ZWQpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1cyg0MDEpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ05PVF9BVVRIT1JJWkVEJ30pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCBzZXNzaW9uIGV4cGlyYXRpb24gdG8gNSBkYXlzLlxuICAgICAgICAgICAgY29uc3QgZXhwaXJlc0luID0gNjAgKiA2MCAqIDI0ICogNSAqIDEwMDA7XG4gICAgICAgICAgICBjb25zdCBpZFRva2VuID0gcmVxLmJvZHkuaWRUb2tlbiE7XG5cbiAgICAgICAgICAgIGxldCBzZXNzaW9uQ29va2llOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgICAgICAgc2Vzc2lvbkNvb2tpZSA9IGlkVG9rZW47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZXNzaW9uQ29va2llID0gYXdhaXQgYXV0aC5jcmVhdGVTZXNzaW9uQ29va2llKGlkVG9rZW4sIHtcbiAgICAgICAgICAgICAgICBleHBpcmVzSW4sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLmNvb2tpZShTRVNTSU9OX0NPT0tJRSwgc2Vzc2lvbkNvb2tpZSwge1xuICAgICAgICAgICAgICBtYXhBZ2U6IGV4cGlyZXNJbixcbiAgICAgICAgICAgICAgaHR0cE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgIHNlY3VyZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzLmpzb24oe3N1Y2Nlc3M6IHRydWV9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIGlmIChlcnIuc3RhY2spIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgIC5zdGF0dXMoNTAwKVxuICAgICAgICAgICAgICAuanNvbih7c3VjY2VzczogZmFsc2UsIGVycm9yOiAnVU5LTk9XTl9TRVJWRVJfRVJST1InfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXBwID0gYXdhaXQgZ2V0UmVuZGVyZXIocmVxKTtcbiAgICAgICAgICBhcHAucmVuZGVyU2lnbkluKHJlcSwgcmVzLCBvcHRpb25zKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIGlmIChlcnIuc3RhY2spIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzLnN0YXR1cyg1MDApLnNlbmQoJ1VOS05PV04gU0VSVkVSIEVSUk9SJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMb2dvdXQgaGFuZGxlci5cbiAgICAgIHNlcnZlci51c2UoJy9jbXMvbG9nb3V0JywgYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICByZXMuY2xlYXJDb29raWUoU0VTU0lPTl9DT09LSUUpO1xuICAgICAgICByZXMucmVkaXJlY3QoJy9jbXMvbG9naW4nKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTYWZlZ3VhcmQgdG8gdmVyaWZ5IHVzZXIgbG9naW4gYmVmb3JlIHJlbmRlcmluZyBhbnkgQ01TIHBhZ2UuXG4gICAgICBzZXJ2ZXIudXNlKGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgICAgICBpZiAoIWxvZ2luUmVxdWlyZWQocmVxKSkge1xuICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNlcklzTG9nZ2VkSW4gPSBhd2FpdCB2ZXJpZnlVc2VyU2Vzc2lvbihyZXEpO1xuICAgICAgICBpZiAodXNlcklzTG9nZ2VkSW4pIHtcbiAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXEub3JpZ2luYWxVcmwuc3RhcnRzV2l0aCgnL2Ntcy9hcGknKSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAxKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdOT1RfQVVUSE9SSVpFRCd9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgICAgY29udGludWU6IHJlcS5vcmlnaW5hbFVybCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcy5yZWRpcmVjdChgL2Ntcy9sb2dpbj8ke3BhcmFtcy50b1N0cmluZygpfWApO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlZ2lzdGVyIEFQSSBoYW5kbGVycy5cbiAgICAgIGFwaShzZXJ2ZXIpO1xuXG4gICAgICAvLyBSZW5kZXIgdGhlIENNUyBTUEEuXG4gICAgICBzZXJ2ZXIudXNlKCcvY21zJywgYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFwcCA9IGF3YWl0IGdldFJlbmRlcmVyKHJlcSk7XG4gICAgICAgICAgYXdhaXQgYXBwLnJlbmRlckFwcChyZXEsIHJlcywge1xuICAgICAgICAgICAgcm9vdENvbmZpZzogcmVxLnJvb3RDb25maWcsXG4gICAgICAgICAgICBjbXNDb25maWc6IG9wdGlvbnMsXG4gICAgICAgICAgICBmaXJlYmFzZUNvbmZpZzogb3B0aW9ucy5maXJlYmFzZUNvbmZpZyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gVE9ETyhzdGV2ZW5sZSk6IHJlbmRlciBhIGN1c3RvbSBlcnJvciBwYWdlLlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuc2VuZCgnVU5LTk9XTiBTRVJWRVIgRVJST1InKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmlsZUV4aXN0cyhmaWxlcGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBmc1xuICAgIC5hY2Nlc3MoZmlsZXBhdGgpXG4gICAgLnRoZW4oKCkgPT4gdHJ1ZSlcbiAgICAuY2F0Y2goKCkgPT4gZmFsc2UpO1xufVxuIiwgImltcG9ydCB7Y3JlYXRlUmVxdWlyZX0gZnJvbSAnbm9kZTptb2R1bGUnO1xuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxuLy8gTk9URShzdGV2ZW5sZSk6IHRoZSBjc3Ytd3JpdGVyIHBhY2thZ2UgaGFzIG1pc2NvbmZpZ3VyZWQgXCJ0eXBlc1wiIHNvIGByZXF1aXJlYFxuLy8gaXMgbmVlZGVkIGhlcmUuXG5jb25zdCBjcmVhdGVPYmplY3RDc3ZTdHJpbmdpZmllciA9XG4gIHJlcXVpcmUoJ2Nzdi13cml0ZXInKS5jcmVhdGVPYmplY3RDc3ZTdHJpbmdpZmllcjtcbi8vIGltcG9ydCB0eXBlIHtjcmVhdGVPYmplY3RDc3ZTdHJpbmdpZmllcn0gZnJvbSAnY3N2LXdyaXRlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVRvQ3N2KHJlcToge1xuICBoZWFkZXJzOiBzdHJpbmdbXTtcbiAgcm93czogQXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj47XG59KTogc3RyaW5nIHtcbiAgY29uc3QgaGVhZGVycyA9IHJlcS5oZWFkZXJzIHx8IFtdO1xuICBjb25zdCByb3dzID0gcmVxLnJvd3MgfHwgW107XG4gIGlmIChoZWFkZXJzLmxlbmd0aCA9PT0gMCB8fCByb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGNzdldyaXRlciA9IGNyZWF0ZU9iamVjdENzdlN0cmluZ2lmaWVyKHtcbiAgICBoZWFkZXI6IGhlYWRlcnMubWFwKChoKSA9PiAoe2lkOiBoLCB0aXRsZTogaH0pKSxcbiAgfSk7XG4gIGNvbnN0IGNzdkhlYWRlciA9IGNzdldyaXRlci5nZXRIZWFkZXJTdHJpbmcoKSB8fCAnJztcbiAgY29uc3QgY3N2Um93cyA9IGNzdldyaXRlci5zdHJpbmdpZnlSZWNvcmRzKHJvd3MpIHx8ICcnO1xuICByZXR1cm4gY3N2SGVhZGVyICsgY3N2Um93cztcbn1cbiIsICJpbXBvcnQge1NlcnZlcn0gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7YXJyYXlUb0Nzdn0gZnJvbSAnLi9jc3YuanMnO1xuXG4vKipcbiAqIFJlZ2lzdGVycyBBUEkgbWlkZGxld2FyZSBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwaShzZXJ2ZXI6IFNlcnZlcikge1xuICBzZXJ2ZXIudXNlKCcvY21zL2FwaS9jc3YuZG93bmxvYWQnLCAocmVxLCByZXMpID0+IHtcbiAgICBpZiAoXG4gICAgICByZXEubWV0aG9kICE9PSAnUE9TVCcgfHxcbiAgICAgICFTdHJpbmcocmVxLmdldCgnY29udGVudC10eXBlJykpLnN0YXJ0c1dpdGgoJ2FwcGxpY2F0aW9uL2pzb24nKVxuICAgICkge1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0JBRF9SRVFVRVNUJ30pO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHkgPSByZXEuYm9keSB8fCB7fTtcbiAgICBjb25zdCBoZWFkZXJzID0gYm9keS5oZWFkZXJzIHx8IFtdO1xuICAgIGNvbnN0IHJvd3MgPSBib2R5LnJvd3MgfHwgW107XG4gICAgY29uc3QgY3N2ID0gYXJyYXlUb0Nzdih7aGVhZGVycywgcm93c30pO1xuICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2NzdicpO1xuICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudDsgZmlsZW5hbWU9XCJkYXRhLmNzdlwiJyk7XG4gICAgcmVzLnN0YXR1cygyMDApLmVuZChjc3YpO1xuICB9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFRLFlBQVksVUFBUztBQUM3QixPQUFPLFVBQVU7QUFDakIsU0FBUSxxQkFBb0I7QUFVNUIsT0FBTyxnQkFBZ0I7QUFDdkIsT0FBTyxrQkFBa0I7QUFDekIsU0FBUSxvQkFBb0IscUJBQW9CO0FBQ2hELFNBQVEsZUFBOEI7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
280
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9wbHVnaW4udHMiLCAiLi4vY29yZS9hcGkudHMiLCAiLi4vY29yZS9jc3YudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7cHJvbWlzZXMgYXMgZnN9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7ZmlsZVVSTFRvUGF0aH0gZnJvbSAnbm9kZTp1cmwnO1xuXG5pbXBvcnQge1xuICBDb25maWd1cmVTZXJ2ZXJPcHRpb25zLFxuICBOZXh0RnVuY3Rpb24sXG4gIFBsdWdpbixcbiAgUmVxdWVzdCxcbiAgUmVzcG9uc2UsXG4gIFNlcnZlcixcbn0gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCBib2R5UGFyc2VyIGZyb20gJ2JvZHktcGFyc2VyJztcbmltcG9ydCBjb29raWVQYXJzZXIgZnJvbSAnY29va2llLXBhcnNlcic7XG5pbXBvcnQge2FwcGxpY2F0aW9uRGVmYXVsdCwgaW5pdGlhbGl6ZUFwcH0gZnJvbSAnZmlyZWJhc2UtYWRtaW4vYXBwJztcbmltcG9ydCB7Z2V0QXV0aCwgRGVjb2RlZElkVG9rZW59IGZyb20gJ2ZpcmViYXNlLWFkbWluL2F1dGgnO1xuaW1wb3J0IHNpcnYgZnJvbSAnc2lydic7XG5pbXBvcnQge2FwaX0gZnJvbSAnLi9hcGkuanMnO1xuXG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxudHlwZSBBcHBNb2R1bGUgPSB0eXBlb2YgaW1wb3J0KCcuL2FwcC5qcycpO1xuXG5jb25zdCBTRVNTSU9OX0NPT0tJRSA9ICdfcm9vdGpzX2Ntcyc7XG5cbmV4cG9ydCB0eXBlIENNU1VzZXIgPSBEZWNvZGVkSWRUb2tlbjtcblxuZXhwb3J0IHR5cGUgQ01TUGx1Z2luT3B0aW9ucyA9IHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcHJvamVjdC4gRGF0YSB3aWxsIGJlIHN0b3JlZCB1bmRlciB0aGUgbmFtZXNwYWNlXG4gICAqIGBQcm9qZWN0cy8ke2lkfWAgaW4gZmlyZXN0b3JlLlxuICAgKi9cbiAgaWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LiBVc2VkIGluIHRoZSBoZWFkZXIgb2YgdGhlIENNUyB0byBoZWxwIGlkZW50aWZ5XG4gICAqIHRoZSBwcm9qZWN0LlxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlyZWJhc2UgY29uZmlnIG9iamVjdCwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGluIHRoZSBGaXJlYmFzZSBDb25zb2xlIGJ5XG4gICAqIGdvaW5nIHRvIFwiUHJvamVjdCBTZXR0aW5nc1wiLlxuICAgKi9cbiAgZmlyZWJhc2VDb25maWc6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG4gICAgYXBpS2V5OiBzdHJpbmc7XG4gICAgYXV0aERvbWFpbjogc3RyaW5nO1xuICAgIHByb2plY3RJZDogc3RyaW5nO1xuICAgIHN0b3JhZ2VCdWNrZXQ6IHN0cmluZztcbiAgICBtZXNzYWdpbmdTZW5kZXJJZDogc3RyaW5nO1xuICAgIGFwcElkOiBzdHJpbmc7XG4gIH07XG5cbiAgLyoqIFNlY3JldCB2YWx1ZShzKSB1c2VkIGZvciBzaWduaW5nIHRoZSB1c2VyIGF1dGhlbnRpY2F0aW9uIGNvb2tpZS4gKi9cbiAgY29va2llU2VjcmV0Pzogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLyoqIEZ1bmN0aW9uIGNhbGxlZCB0byBjaGVjayBpZiBhIHVzZXIgc2hvdWxkIGhhdmUgYWNjZXNzIHRvIHRoZSBDTVMuICovXG4gIGlzVXNlckF1dGhvcml6ZWQ/OiAoXG4gICAgcmVxOiBSZXF1ZXN0LFxuICAgIHVzZXI6IENNU1VzZXJcbiAgKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogVVJMIHRvIEdDSSBzZXJ2aWNlIGZvciB0cmFuc2Zvcm1pbmcgdXBsb2FkZWQgR0NTIGltYWdlcyB0byBhIEdvb2dsZSBBcHBcbiAgICogRW5naW5lIEltYWdlcyBBUEkgc2VydmluZyBVUkwuXG4gICAqXG4gICAqIFNldHRpbmcgdGhpcyB0byBgdHJ1ZWAgdXNlcyB0aGUgZGVmYXVsdCBob3N0ZWQgc2VydmljZSBhdFxuICAgKiBodHRwczovL2djaS5yb290anMuZGV2LlxuICAgKlxuICAgKiBUbyBzZXQgdXAgR0NJOlxuICAgKlxuICAgKiAtIENyZWF0ZSBhIEdDUyBidWNrZXQgd2l0aCBmaW5lLWdyYWluZWQgcGVybWlzc2lvbnNcbiAgICogLSBTaGFyZSBvd25lciBhY2Nlc3MgdG8gdGhlIGJ1Y2tldCB3aXRoIHRoZSBzZXJ2aWNlIGFjY291bnQgcmV0dXJuZWQgaW5cbiAgICogICBodHRwczovL2djaS5yb290anMuZGV2L18vc2VydmljZV9hY2NvdW50XG4gICAqXG4gICAqIFRvIGRpc2FibGUgR0NJLCBsZWF2ZSB0aGlzIHZhbHVlIGVtcHR5IG9yIHNldCB0byBgZmFsc2VgLCB3aGljaCB3aGljaCB3aWxsXG4gICAqIHNlcnZlIGltYWdlcyBkaXJlY3RseSBmcm9tIEdDUyBpbnN0ZWFkLlxuICAgKi9cbiAgZ2NpPzogc3RyaW5nIHwgYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIENNU1BsdWdpbiA9IFBsdWdpbiAmIHtcbiAgbmFtZTogJ3Jvb3QtY21zJztcbiAgZ2V0Q29uZmlnOiAoKSA9PiBDTVNQbHVnaW5PcHRpb25zO1xufTtcblxuZnVuY3Rpb24gZ2VuZXJhdGVTZWNyZXQoKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGNvbnN0IGNoYXJzID1cbiAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDM2OyBpKyspIHtcbiAgICBjb25zdCByYW5kID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKTtcbiAgICByZXN1bHQucHVzaChjaGFycy5jaGFyQXQocmFuZCkpO1xuICB9XG4gIHJldHVybiByZXN1bHQuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGlzRXhwaXJlZChkZWNvZGVkSWRUb2tlbjogRGVjb2RlZElkVG9rZW4pIHtcbiAgY29uc3QgdHMgPSBNYXRoLmZsb29yKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCk7XG4gIHJldHVybiB0cyA+PSBkZWNvZGVkSWRUb2tlbi5leHA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbXNQbHVnaW4ob3B0aW9uczogQ01TUGx1Z2luT3B0aW9ucyk6IENNU1BsdWdpbiB7XG4gIGNvbnN0IGZpcmViYXNlQ29uZmlnID0gb3B0aW9ucy5maXJlYmFzZUNvbmZpZztcbiAgY29uc3QgY29va2llU2VjcmV0ID0gb3B0aW9ucy5jb29raWVTZWNyZXQgfHwgZ2VuZXJhdGVTZWNyZXQoKTtcbiAgY29uc3QgYXBwID0gaW5pdGlhbGl6ZUFwcCh7XG4gICAgcHJvamVjdElkOiBmaXJlYmFzZUNvbmZpZy5wcm9qZWN0SWQsXG4gICAgY3JlZGVudGlhbDogYXBwbGljYXRpb25EZWZhdWx0KCksXG4gIH0pO1xuICBjb25zdCBhdXRoID0gZ2V0QXV0aChhcHApO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgbG9naW4gaXMgcmVxdWlyZWQgZm9yIHRoZSByZXF1ZXN0LiBDdXJyZW50bHkgcmV0dXJucyBgdHJ1ZWAgaWZcbiAgICogdGhlIFVSTCBwYXRoIHN0YXJ0cyB3aXRoIC9jbXMgb3IgaWYgP3ByZXZpZXc9dHJ1ZSBpcyBpbiB0aGUgVVJMLlxuICAgKi9cbiAgZnVuY3Rpb24gbG9naW5SZXF1aXJlZChyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgICBpZiAocmVxLm9yaWdpbmFsVXJsLnN0YXJ0c1dpdGgoJy9jbXMnKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChTdHJpbmcocmVxLnF1ZXJ5LnByZXZpZXcpID09PSAndHJ1ZScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgYSBuZXcgbG9naW4gcmVxdWVzdCBmb3IgYSB1c2VyLiBUaGUgcmVxdWVzdCBib2R5IHNob3VsZCBjb250YWluXG4gICAqIGFuIGlkVG9rZW4sIHdoaWNoIGlzIHZlcmlmaWVkIG9uIHByb2QgdXNpbmcgRmlyZWJhc2UgQWRtaW4gYW5kIElkZW50aXR5XG4gICAqIFRvb2xraXQuIElmIGEgYGlzVXNlckF1dGhvcml6ZWQoKWAgY29uZmlnIGlzIHNldCwgdGhpcyBmdW5jdGlvbiB3aWxsIGFsc29cbiAgICogdmVyaWZ5IHZpYSB0aGF0IGZ1bmN0aW9uLiBSZXR1cm5zIHRydWUgaWYgdGhlIGxvZ2luIHZlcmlmaWNhdGlvbiBzdWNjZWVkcy5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVVzZXJMb2dpbihyZXE6IFJlcXVlc3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBpZFRva2VuID0gcmVxLmJvZHk/LmlkVG9rZW47XG4gICAgaWYgKCFpZFRva2VuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gT24gbG9jYWwgZGV2LCBzaW1wbHkgdmVyaWZ5IHRoYXQgYW4gaWRUb2tlbiBpcyBzZXQuIFRoZSBpZGVudGl0eSB0b29sa2l0XG4gICAgLy8gdGhhdCB2ZXJpZmllcyBpZCB0b2tlbnMgcmVxdWlyZXMgYSBzZXJ2aWNlIGFjY291bnQsIHdoaWNoIHdlIHdhbnQgdG9cbiAgICAvLyBhdm9pZCBoYXZpbmcgdG8gc2V0IHVwIHdoZW4gdXNlcnMgYXJlIGRvaW5nIGxvY2FsIGRldmVsb3BtZW50LlxuICAgIC8vIEF1dGhlbnRpY2F0aW9uIGlzIHN0aWxsIHJlcXVpcmVkIGJ5IHRoZSBmcm9udGVuZCB1c2luZyBGaXJlYmFzZSBBdXRoLFxuICAgIC8vIHRoaXMganVzdCBieXBhc3NlcyB0aGUgaW5pdGlhbCBzZXJ2ZXIgY2hlY2sgYmVmb3JlIHRoZSB1aSBpcyByZW5kZXJlZC5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKGlkVG9rZW4pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBqd3QgPSBhd2FpdCBhdXRoLnZlcmlmeUlkVG9rZW4oaWRUb2tlbiwgdHJ1ZSk7XG4gICAgICBpZiAoaXNFeHBpcmVkKGp3dCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCFqd3QuZW1haWwgfHwgIWp3dC5lbWFpbF92ZXJpZmllZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5pc1VzZXJBdXRob3JpemVkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBvcHRpb25zLmlzVXNlckF1dGhvcml6ZWQocmVxLCBqd3QpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignZmFpbGVkIHRvIHZlcmlmeSBqd3QgdG9rZW4nKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gVE9ETyhzdGV2ZW5sZSk6IGRlY2lkZSB3aGV0aGVyIHdlIHdhbnQgdG8gZW5mb3JjZSBgaXNVc2VyQXV0aG9yaXplZCgpYC5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB3aGV0aGVyIHRoZSBjdXJyZW50IHVzZXIgc2Vzc2lvbiBzaG91bGQgYmUgYWxsb3dlZCB0byBhY2Nlc3MgdGhlXG4gICAqIENNUy4gUmV0dXJucyB0cnVlIGlmIGFjY2VzcyBpcyBncmFudGVkLlxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VXNlclNlc3Npb24ocmVxOiBSZXF1ZXN0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc2Vzc2lvbkNvb2tpZSA9IFN0cmluZyhyZXEuY29va2llc1tTRVNTSU9OX0NPT0tJRV0gfHwgJycpO1xuICAgIGlmICghc2Vzc2lvbkNvb2tpZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE9uIGxvY2FsIGRldiwgc2ltcGx5IHZlcmlmeSB0aGF0IGFuIHNlc3Npb24gY29va2llIGlzIHNldC4gU2VlIG5vdGVcbiAgICAvLyBhYm92ZSBpbiBgdmVyaWZ5VXNlckxvZ2luKClgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oc2Vzc2lvbkNvb2tpZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGp3dCA9IGF3YWl0IGF1dGgudmVyaWZ5U2Vzc2lvbkNvb2tpZShzZXNzaW9uQ29va2llLCB0cnVlKTtcbiAgICAgIGlmIChpc0V4cGlyZWQoand0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoIWp3dC5lbWFpbCB8fCAhand0LmVtYWlsX3ZlcmlmaWVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLmlzVXNlckF1dGhvcml6ZWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG9wdGlvbnMuaXNVc2VyQXV0aG9yaXplZChyZXEsIGp3dCk7XG4gICAgICB9XG4gICAgICAvLyBUT0RPKHN0ZXZlbmxlKTogZGVjaWRlIHdoZXRoZXIgd2Ugd2FudCB0byBlbmZvcmNlIGBpc1VzZXJBdXRob3JpemVkKClgLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmYWlsZWQgdG8gdmVyaWZ5IGp3dCB0b2tlbicpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3Jvb3QtY21zJyxcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGNvbmZpZyBvcHRpb25zIHBhc3NlZCB0byB0aGUgcGx1Z2luLlxuICAgICAqL1xuICAgIGdldENvbmZpZzogKCkgPT4ge1xuICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEEgbWFwIG9mIHNzciBmaWxlcyB0byBpbmNsdWRlIHdoZW4gcnVubmluZyBgcm9vdCBidWlsZGAuXG4gICAgICovXG4gICAgc3NySW5wdXQ6ICgpID0+ICh7XG4gICAgICBjbXM6IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuL2FwcC5qcycpLFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogQXR0YWNoZXMgQ01TLXNwZWNpZmljIG1pZGRsZXdhcmUgdG8gdGhlIFJvb3QuanMgc2VydmVyLlxuICAgICAqL1xuICAgIGNvbmZpZ3VyZVNlcnZlcjogYXN5bmMgKFxuICAgICAgc2VydmVyOiBTZXJ2ZXIsXG4gICAgICBzZXJ2ZXJPcHRpb25zOiBDb25maWd1cmVTZXJ2ZXJPcHRpb25zXG4gICAgKSA9PiB7XG4gICAgICBzZXJ2ZXIudXNlKGNvb2tpZVBhcnNlcihjb29raWVTZWNyZXQpKTtcbiAgICAgIHNlcnZlci51c2UoYm9keVBhcnNlci5qc29uKCkpO1xuXG4gICAgICBhc3luYyBmdW5jdGlvbiBnZXRSZW5kZXJlcihyZXE6IFJlcXVlc3QpOiBQcm9taXNlPEFwcE1vZHVsZT4ge1xuICAgICAgICBpZiAoc2VydmVyT3B0aW9ucy50eXBlID09PSAnZGV2Jykge1xuICAgICAgICAgIGNvbnN0IGFwcEZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vYXBwLmpzJyk7XG4gICAgICAgICAgY29uc3QgYXBwID0gKGF3YWl0IHJlcS52aXRlU2VydmVyIS5zc3JMb2FkTW9kdWxlKFxuICAgICAgICAgICAgYXBwRmlsZVBhdGhcbiAgICAgICAgICApKSBhcyBBcHBNb2R1bGU7XG4gICAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFwcEltcG9ydFBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgcmVxLnJvb3RDb25maWchLnJvb3REaXIsXG4gICAgICAgICAgJ2Rpc3Qvc2VydmVyL2Ntcy5qcydcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEoYXdhaXQgZmlsZUV4aXN0cyhhcHBJbXBvcnRQYXRoKSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnZGlzdC9zZXJ2ZXIvY21zLmpzIG5vdCBmb3VuZC4gcnVuIGByb290IGJ1aWxkYCB0byBjcmVhdGUgaXQuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBwID0gKGF3YWl0IGltcG9ydChhcHBJbXBvcnRQYXRoKSkgYXMgQXBwTW9kdWxlO1xuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGF0aWNEaXIgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAndWknKTtcbiAgICAgIHNlcnZlci51c2UoJy9jbXMvc3RhdGljJywgc2lydihzdGF0aWNEaXIsIHtkZXY6IGZhbHNlfSkpO1xuXG4gICAgICAvLyBMb2dpbiBoYW5kbGVyLlxuICAgICAgc2VydmVyLnVzZSgnL2Ntcy9sb2dpbicsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJlcS5tZXRob2QgPT09ICdQVVQnICYmXG4gICAgICAgICAgcmVxLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID09PSAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGlzQXV0aG9yaXplZCA9IGF3YWl0IHZlcmlmeVVzZXJMb2dpbihyZXEpO1xuICAgICAgICAgICAgaWYgKCFpc0F1dGhvcml6ZWQpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1cyg0MDEpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ05PVF9BVVRIT1JJWkVEJ30pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCBzZXNzaW9uIGV4cGlyYXRpb24gdG8gNSBkYXlzLlxuICAgICAgICAgICAgY29uc3QgZXhwaXJlc0luID0gNjAgKiA2MCAqIDI0ICogNSAqIDEwMDA7XG4gICAgICAgICAgICBjb25zdCBpZFRva2VuID0gcmVxLmJvZHkuaWRUb2tlbiE7XG5cbiAgICAgICAgICAgIGxldCBzZXNzaW9uQ29va2llOiBzdHJpbmc7XG4gICAgICAgICAgICBsZXQgc2VjdXJlQ29va2llID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICAgICAgICBzZXNzaW9uQ29va2llID0gaWRUb2tlbjtcbiAgICAgICAgICAgICAgc2VjdXJlQ29va2llID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZXNzaW9uQ29va2llID0gYXdhaXQgYXV0aC5jcmVhdGVTZXNzaW9uQ29va2llKGlkVG9rZW4sIHtcbiAgICAgICAgICAgICAgICBleHBpcmVzSW4sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzLmNvb2tpZShTRVNTSU9OX0NPT0tJRSwgc2Vzc2lvbkNvb2tpZSwge1xuICAgICAgICAgICAgICBtYXhBZ2U6IGV4cGlyZXNJbixcbiAgICAgICAgICAgICAgaHR0cE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgIHNlY3VyZTogc2VjdXJlQ29va2llLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXMuanNvbih7c3VjY2VzczogdHJ1ZX0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgaWYgKGVyci5zdGFjaykge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVyci5zdGFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNcbiAgICAgICAgICAgICAgLnN0YXR1cyg1MDApXG4gICAgICAgICAgICAgIC5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdVTktOT1dOX1NFUlZFUl9FUlJPUid9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhcHAgPSBhd2FpdCBnZXRSZW5kZXJlcihyZXEpO1xuICAgICAgICAgIGFwcC5yZW5kZXJTaWduSW4ocmVxLCByZXMsIG9wdGlvbnMpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgaWYgKGVyci5zdGFjaykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuc2VuZCgnVU5LTk9XTiBTRVJWRVIgRVJST1InKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExvZ291dCBoYW5kbGVyLlxuICAgICAgc2VydmVyLnVzZSgnL2Ntcy9sb2dvdXQnLCBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHJlcy5jbGVhckNvb2tpZShTRVNTSU9OX0NPT0tJRSk7XG4gICAgICAgIHJlcy5yZWRpcmVjdCgnL2Ntcy9sb2dpbicpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNhZmVndWFyZCB0byB2ZXJpZnkgdXNlciBsb2dpbiBiZWZvcmUgcmVuZGVyaW5nIGFueSBDTVMgcGFnZS5cbiAgICAgIHNlcnZlci51c2UoYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgICAgIGlmICghbG9naW5SZXF1aXJlZChyZXEpKSB7XG4gICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VySXNMb2dnZWRJbiA9IGF3YWl0IHZlcmlmeVVzZXJTZXNzaW9uKHJlcSk7XG4gICAgICAgIGlmICh1c2VySXNMb2dnZWRJbikge1xuICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcS5vcmlnaW5hbFVybC5zdGFydHNXaXRoKCcvY21zL2FwaScpKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDEpLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ05PVF9BVVRIT1JJWkVEJ30pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgICBjb250aW51ZTogcmVxLm9yaWdpbmFsVXJsLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzLnJlZGlyZWN0KGAvY21zL2xvZ2luPyR7cGFyYW1zLnRvU3RyaW5nKCl9YCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUmVnaXN0ZXIgQVBJIGhhbmRsZXJzLlxuICAgICAgYXBpKHNlcnZlcik7XG5cbiAgICAgIC8vIFJlbmRlciB0aGUgQ01TIFNQQS5cbiAgICAgIHNlcnZlci51c2UoJy9jbXMnLCBhc3luYyAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXBwID0gYXdhaXQgZ2V0UmVuZGVyZXIocmVxKTtcbiAgICAgICAgICBhd2FpdCBhcHAucmVuZGVyQXBwKHJlcSwgcmVzLCB7XG4gICAgICAgICAgICByb290Q29uZmlnOiByZXEucm9vdENvbmZpZyxcbiAgICAgICAgICAgIGNtc0NvbmZpZzogb3B0aW9ucyxcbiAgICAgICAgICAgIGZpcmViYXNlQ29uZmlnOiBvcHRpb25zLmZpcmViYXNlQ29uZmlnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBUT0RPKHN0ZXZlbmxlKTogcmVuZGVyIGEgY3VzdG9tIGVycm9yIHBhZ2UuXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNTAwKS5zZW5kKCdVTktOT1dOIFNFUlZFUiBFUlJPUicpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBmaWxlRXhpc3RzKGZpbGVwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIGZzXG4gICAgLmFjY2VzcyhmaWxlcGF0aClcbiAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgIC5jYXRjaCgoKSA9PiBmYWxzZSk7XG59XG4iLCAiaW1wb3J0IHtTZXJ2ZXJ9IGZyb20gJ0BibGlua2svcm9vdCc7XG5pbXBvcnQgbXVsdGVyIGZyb20gJ211bHRlcic7XG5pbXBvcnQge2FycmF5VG9Dc3YsIGNzdlRvQXJyYXl9IGZyb20gJy4vY3N2LmpzJztcblxuY29uc3QgdXBsb2FkID0gbXVsdGVyKCk7XG5cbi8qKlxuICogUmVnaXN0ZXJzIEFQSSBtaWRkbGV3YXJlIGhhbmRsZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBpKHNlcnZlcjogU2VydmVyKSB7XG4gIC8qKlxuICAgKiBBY2NlcHRzIGEgSlNPTiBvYmplY3QgY29udGFpbmluZyB7aGVhZGVyczogWy4uLl0sIHJvd3M6IFsuLi5dfSBhbmQgc2VuZHNcbiAgICogYW4gSFRUUCByZXNwb25zZSB3aXRoIGEgY29ycmVzcG9uZGluZyBDU1YgZmlsZSBhcyBhbiBhdHRhY2htZW50LlxuICAgKlxuICAgKiBTYW1wbGUgcmVxdWVzdDpcbiAgICpcbiAgICogYGBganNvblxuICAgKiB7XG4gICAqICAgXCJoZWFkZXJzXCI6IFtcImZvb1wiXSxcbiAgICogICBcInJvd3NcIjogW1xuICAgKiAgICAge1wiZm9vXCI6IFwiYmFyXCJ9LFxuICAgKiAgICAge1wiZm9vXCI6IFwiYmF6XCJ9LFxuICAgKiAgIF1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHNlcnZlci51c2UoJy9jbXMvYXBpL2Nzdi5kb3dubG9hZCcsIChyZXEsIHJlcykgPT4ge1xuICAgIGlmIChcbiAgICAgIHJlcS5tZXRob2QgIT09ICdQT1NUJyB8fFxuICAgICAgIVN0cmluZyhyZXEuZ2V0KCdjb250ZW50LXR5cGUnKSkuc3RhcnRzV2l0aCgnYXBwbGljYXRpb24vanNvbicpXG4gICAgKSB7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIGVycm9yOiAnQkFEX1JFUVVFU1QnfSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJvZHkgPSByZXEuYm9keSB8fCB7fTtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBib2R5LmhlYWRlcnMgfHwgW107XG4gICAgICBjb25zdCByb3dzID0gYm9keS5yb3dzIHx8IFtdO1xuICAgICAgY29uc3QgY3N2ID0gYXJyYXlUb0Nzdih7aGVhZGVycywgcm93c30pO1xuICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvY3N2Jyk7XG4gICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiZGF0YS5jc3ZcIicpO1xuICAgICAgcmVzLnN0YXR1cygyMDApLmVuZChjc3YpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2sgfHwgZXJyKTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdVTktOT1dOJ30pO1xuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYSBDU1YgZmlsZSBhbmQgcmV0dXJucyBhIEpTT04gYXJyYXkgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlXG4gICAqIENTVi5cbiAgICpcbiAgICogU2FtcGxlIHJlc3BvbnNlOlxuICAgKlxuICAgKiBgYGBqc29uXG4gICAqIHtcbiAgICogICBcInN1Y2Nlc3NcIjogdHJ1ZSxcbiAgICogICBcImRhdGFcIjogW1xuICAgKiAgICAge1wiZm9vXCI6IFwiYmFyXCJ9LFxuICAgKiAgICAge1wiZm9vXCI6IFwiYmF6XCJ9LFxuICAgKiAgIF1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHNlcnZlci51c2UoJy9jbXMvYXBpL2Nzdi5pbXBvcnQnLCB1cGxvYWQuc2luZ2xlKCdmaWxlJyksIChyZXEsIHJlcykgPT4ge1xuICAgIGlmIChyZXEubWV0aG9kICE9PSAnUE9TVCcgfHwgIXJlcS5maWxlKSB7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7c3VjY2VzczogZmFsc2UsIGVycm9yOiAnQkFEX1JFUVVFU1QnfSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGUgPSByZXEuZmlsZSE7XG4gICAgICBjb25zdCBjc3ZTdHJpbmcgPSBmaWxlLmJ1ZmZlci50b1N0cmluZygndXRmOCcpO1xuICAgICAgY29uc3Qgcm93cyA9IGNzdlRvQXJyYXkoY3N2U3RyaW5nKTtcbiAgICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHtzdWNjZXNzOiB0cnVlLCBkYXRhOiByb3dzfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVyci5zdGFjayB8fCBlcnIpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe3N1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ1VOS05PV04nfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsICJpbXBvcnQge3BhcnNlIGFzIGNzdlBhcnNlfSBmcm9tICdjc3YtcGFyc2Uvc3luYyc7XG5pbXBvcnQge3N0cmluZ2lmeSBhcyBjc3ZTdHJpbmdpZnl9IGZyb20gJ2Nzdi1zdHJpbmdpZnkvc3luYyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVRvQ3N2KHJlcToge1xuICBoZWFkZXJzOiBzdHJpbmdbXTtcbiAgcm93czogQXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj47XG59KTogc3RyaW5nIHtcbiAgY29uc3QgaGVhZGVycyA9IHJlcS5oZWFkZXJzIHx8IFtdO1xuICBjb25zdCByb3dzID0gcmVxLnJvd3MgfHwgW107XG4gIHJldHVybiBjc3ZTdHJpbmdpZnkocm93cywge1xuICAgIGhlYWRlcjogdHJ1ZSxcbiAgICBjb2x1bW5zOiBoZWFkZXJzLFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNzdlRvQXJyYXkoY3N2U3RyaW5nOiBzdHJpbmcpIHtcbiAgY29uc3Qgcm93cyA9IGNzdlBhcnNlKGNzdlN0cmluZywge1xuICAgIGNvbHVtbnM6IHRydWUsXG4gICAgc2tpcF9lbXB0eV9saW5lczogdHJ1ZSxcbiAgfSk7XG4gIHJldHVybiByb3dzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVEsWUFBWSxVQUFTO0FBQzdCLE9BQU8sVUFBVTtBQUNqQixTQUFRLHFCQUFvQjtBQVU1QixPQUFPLGdCQUFnQjtBQUN2QixPQUFPLGtCQUFrQjtBQUN6QixTQUFRLG9CQUFvQixxQkFBb0I7QUFDaEQsU0FBUSxlQUE4QjtBQUN0QyxPQUFPLFVBQVU7OztBQ2ZqQixPQUFPLFlBQVk7OztBQ0RuQixTQUFRLFNBQVMsZ0JBQWU7QUFDaEMsU0FBUSxhQUFhLG9CQUFtQjtBQUVqQyxTQUFTLFdBQVcsS0FHaEI7QUFDVCxRQUFNLFVBQVUsSUFBSSxXQUFXLENBQUM7QUFDaEMsUUFBTSxPQUFPLElBQUksUUFBUSxDQUFDO0FBQzFCLFNBQU8sYUFBYSxNQUFNO0FBQUEsSUFDeEIsUUFBUTtBQUFBLElBQ1IsU0FBUztBQUFBLEVBQ1gsQ0FBQztBQUNIO0FBRU8sU0FBUyxXQUFXLFdB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
package/dist/ui/ui.css CHANGED
@@ -186,6 +186,22 @@
186
186
  max-width: 70ch;
187
187
  }
188
188
 
189
+ /* ui/components/SlugInput/SlugInput.css */
190
+ .SlugInput__inputs {
191
+ display: flex;
192
+ gap: 8px;
193
+ align-items: center;
194
+ }
195
+ .SlugInput__slug {
196
+ flex: 1;
197
+ }
198
+ .SlugInput__urlHelp {
199
+ margin-top: 8px;
200
+ }
201
+ .SlugInput__urlHelp::before {
202
+ content: "URL: ";
203
+ }
204
+
189
205
  /* ui/components/NewDocModal/NewDocModal.css */
190
206
  .NewDocModal__body {
191
207
  font-size: 12px;
@@ -435,6 +451,7 @@
435
451
  font-weight: 500;
436
452
  }
437
453
  .CollectionPage__collection__docsList__doc__image {
454
+ border: 1px solid var(--color-border);
438
455
  flex-shrink: 0;
439
456
  }
440
457
  .CollectionPage__collection__docsList__doc__content__title {
@@ -783,6 +800,7 @@
783
800
  .LocalizationModal__translations__table__col {
784
801
  padding-left: 8px;
785
802
  padding-right: 8px;
803
+ text-align: left;
786
804
  }
787
805
  .LocalizationModal__translations__localeSelect {
788
806
  display: flex;
@@ -862,12 +880,25 @@
862
880
  border-bottom: 1px solid var(--color-border);
863
881
  display: flex;
864
882
  align-items: center;
865
- gap: 4px;
883
+ justify-content: space-between;
884
+ gap: 24px;
866
885
  height: var(--top-bar-height);
886
+ position: sticky;
887
+ top: 0;
888
+ z-index: 10;
889
+ background: white;
890
+ }
891
+ .DocumentPage__side__header__nav {
892
+ display: flex;
893
+ align-items: center;
894
+ gap: 4px;
867
895
  }
868
896
  .DocumentPage__side__header__back {
869
897
  color: var(--color-text-default);
870
898
  }
899
+ .DocumentPage__side__header__buttons {
900
+ justify-self: flex-end;
901
+ }
871
902
  .DocumentPage__side__editor {
872
903
  padding: 8px 12px 120px;
873
904
  }
@@ -1205,3 +1236,27 @@ body.menu\:open {
1205
1236
  color: var(--color-text-default);
1206
1237
  border-bottom-color: lightblue;
1207
1238
  }
1239
+
1240
+ /* ui/components/CopyDocModal/CopyDocModal.css */
1241
+ .CopyDocModal__from__label,
1242
+ .CopyDocModal__to__label {
1243
+ margin-bottom: 8px;
1244
+ }
1245
+ .CopyDocModal__from__value code {
1246
+ margin-left: 0;
1247
+ }
1248
+ .CopyDocModal__to {
1249
+ margin-top: 16px;
1250
+ }
1251
+ .CopyDocModal__error {
1252
+ margin: 24px 0;
1253
+ font-size: 14px;
1254
+ color: red;
1255
+ font-weight: 600;
1256
+ }
1257
+ .CopyDocModal__buttons {
1258
+ margin-top: 24px;
1259
+ display: flex;
1260
+ justify-content: flex-end;
1261
+ gap: 12px;
1262
+ }