bitsnap-react 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -34,6 +34,7 @@ __export(src_exports, {
34
34
  Bitsnap: () => Bitsnap,
35
35
  BitsnapCheckout: () => BitsnapCart_default,
36
36
  GooglePayButton: () => GooglePay_default,
37
+ NotificationsComponent: () => NotificationsComponentPublic_default,
37
38
  createCheckout: () => createCheckout,
38
39
  createPaymentURL: () => createPaymentURL,
39
40
  getReferenceIfPossible: () => getReferenceIfPossible,
@@ -107,6 +108,7 @@ var import_zod = __toESM(require("zod"));
107
108
  // src/components/checkout/constants.ts
108
109
  var HOST = "https://bitsnap.pl";
109
110
  function setCustomHost(host) {
111
+ console.log("setCustomHost", host);
110
112
  HOST = host;
111
113
  }
112
114
 
@@ -1411,20 +1413,20 @@ function Wrapper2(props) {
1411
1413
  var GooglePay_default = Wrapper2;
1412
1414
 
1413
1415
  // src/components/checkout/BitsnapCart.tsx
1414
- var import_react7 = require("react");
1416
+ var import_react8 = require("react");
1415
1417
  var import_zod2 = __toESM(require("zod"));
1416
1418
 
1417
1419
  // src/components/checkout/CartComponent.tsx
1418
- var import_react6 = require("@formkit/auto-animate/react");
1420
+ var import_react7 = require("@formkit/auto-animate/react");
1419
1421
  var import_react_dom = require("react-dom");
1420
1422
 
1421
1423
  // src/components/checkout/CartComponentContent.tsx
1422
- var import_react4 = require("@formkit/auto-animate/react");
1423
- var import_react5 = __toESM(require("react"));
1424
+ var import_react5 = require("@formkit/auto-animate/react");
1425
+ var import_react6 = __toESM(require("react"));
1424
1426
 
1425
1427
  // src/components/checkout/CountrySelector.tsx
1426
- var import_framer_motion = require("framer-motion");
1427
- var import_react2 = require("react");
1428
+ var import_react2 = require("motion/react");
1429
+ var import_react3 = require("react");
1428
1430
  var import_jsx_runtime5 = require("react/jsx-runtime");
1429
1431
  function CountrySelector({
1430
1432
  id,
@@ -1436,8 +1438,8 @@ function CountrySelector({
1436
1438
  countries
1437
1439
  }) {
1438
1440
  var _a;
1439
- const ref = (0, import_react2.useRef)(null);
1440
- (0, import_react2.useEffect)(() => {
1441
+ const ref = (0, import_react3.useRef)(null);
1442
+ (0, import_react3.useEffect)(() => {
1441
1443
  const mutableRef = ref;
1442
1444
  const handleClickOutside = (event) => {
1443
1445
  if (mutableRef.current && // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -1452,12 +1454,12 @@ function CountrySelector({
1452
1454
  document.removeEventListener("mousedown", handleClickOutside);
1453
1455
  };
1454
1456
  }, [ref]);
1455
- (0, import_react2.useEffect)(() => {
1457
+ (0, import_react3.useEffect)(() => {
1456
1458
  if (selectedValue == null && countries.length > 0) {
1457
1459
  onChange(countries[0].code);
1458
1460
  }
1459
1461
  }, []);
1460
- const [query, setQuery] = (0, import_react2.useState)("");
1462
+ const [query, setQuery] = (0, import_react3.useState)("");
1461
1463
  return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { ref, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "relative", children: [
1462
1464
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1463
1465
  "button",
@@ -1508,8 +1510,8 @@ function CountrySelector({
1508
1510
  ]
1509
1511
  }
1510
1512
  ),
1511
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_framer_motion.AnimatePresence, { children: open2 && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1512
- import_framer_motion.motion.ul,
1513
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react2.AnimatePresence, { children: open2 && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
1514
+ import_react2.motion.ul,
1513
1515
  {
1514
1516
  initial: { opacity: 0 },
1515
1517
  animate: { opacity: 1 },
@@ -1604,7 +1606,7 @@ function CountrySelector({
1604
1606
  var CountrySelector_default = CountrySelector;
1605
1607
 
1606
1608
  // src/components/checkout/SingleProduct.tsx
1607
- var import_react3 = require("react");
1609
+ var import_react4 = require("react");
1608
1610
  var import_jsx_runtime6 = require("react/jsx-runtime");
1609
1611
  var SingleProduct = ({ quantity, details, shouldUpdate }) => {
1610
1612
  var _a;
@@ -1626,9 +1628,9 @@ var QuantityComponent = ({
1626
1628
  shouldUpdate,
1627
1629
  className
1628
1630
  }) => {
1629
- const [quantityString, setQuantityString] = (0, import_react3.useState)(quantity.toString());
1630
- const [quantityValue, setQuantityValue] = (0, import_react3.useState)(quantity);
1631
- (0, import_react3.useEffect)(() => {
1631
+ const [quantityString, setQuantityString] = (0, import_react4.useState)(quantity.toString());
1632
+ const [quantityValue, setQuantityValue] = (0, import_react4.useState)(quantity);
1633
+ (0, import_react4.useEffect)(() => {
1632
1634
  shouldUpdate(quantityValue);
1633
1635
  }, [quantityValue]);
1634
1636
  function setNewQuantity(newQuantity) {
@@ -1711,8 +1713,8 @@ var CartComponentContent = ({ className }) => {
1711
1713
  const { mutateAsync: clearCart } = (0, import_react_query4.useMutation)({
1712
1714
  mutationFn: provider.clearCart
1713
1715
  });
1714
- const [errMsg, setErrMsg] = import_react5.default.useState("");
1715
- const [isCountryOpen, setIsCountryOpen] = import_react5.default.useState(false);
1716
+ const [errMsg, setErrMsg] = import_react6.default.useState("");
1717
+ const [isCountryOpen, setIsCountryOpen] = import_react6.default.useState(false);
1716
1718
  const {
1717
1719
  mutateAsync: continueToCheckoutAsync,
1718
1720
  isPending: isContinueToCheckoutLoading
@@ -1735,7 +1737,7 @@ var CartComponentContent = ({ className }) => {
1735
1737
  queryKey: ["cart-country"],
1736
1738
  queryFn: provider.getCountry
1737
1739
  });
1738
- const [productsParent] = (0, import_react4.useAutoAnimate)(
1740
+ const [productsParent] = (0, import_react5.useAutoAnimate)(
1739
1741
  /* optional config */
1740
1742
  );
1741
1743
  const products = isErr(data) ? void 0 : data;
@@ -1791,7 +1793,7 @@ var CartComponentContent = ({ className }) => {
1791
1793
  "div",
1792
1794
  {
1793
1795
  className: "max-h-[70vh] overflow-clip overflow-y-scroll",
1794
- children: products != null && products.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("ul", { className: "mt-5", children: products.map((product) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react5.default.Fragment, { children: product.details != null && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("li", { className: "mb-3", children: [
1796
+ children: products != null && products.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("ul", { className: "mt-5", children: products.map((product) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react6.default.Fragment, { children: product.details != null && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("li", { className: "mb-3", children: [
1795
1797
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1796
1798
  SingleProduct_default,
1797
1799
  {
@@ -1901,7 +1903,7 @@ var CartComponentContent_default = CartComponentContent;
1901
1903
  // src/components/checkout/CartComponent.tsx
1902
1904
  var import_jsx_runtime9 = require("react/jsx-runtime");
1903
1905
  function CartComponent({ isVisible, shouldHide }) {
1904
- const [parent] = (0, import_react6.useAutoAnimate)(
1906
+ const [parent] = (0, import_react7.useAutoAnimate)(
1905
1907
  /* optional config */
1906
1908
  );
1907
1909
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { ref: parent, className: "bitsnap-checkout dark", style: { zIndex: 999999 }, children: isVisible && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
@@ -1992,13 +1994,13 @@ function BitsnapCart({
1992
1994
  (_a = iframe.contentWindow) == null ? void 0 : _a.postMessage(msg, "*");
1993
1995
  });
1994
1996
  }
1995
- (0, import_react7.useEffect)(() => {
1997
+ (0, import_react8.useEffect)(() => {
1996
1998
  onVisibleChange == null ? void 0 : onVisibleChange(isCartVisible);
1997
1999
  }, [isCartVisible]);
1998
- (0, import_react7.useEffect)(() => {
2000
+ (0, import_react8.useEffect)(() => {
1999
2001
  setProjectID(projectID);
2000
2002
  }, [projectID]);
2001
- (0, import_react7.useEffect)(() => {
2003
+ (0, import_react8.useEffect)(() => {
2002
2004
  if (!("cart" in window)) {
2003
2005
  const projectID2 = getProjectID();
2004
2006
  if (projectID2 == null) {
@@ -2083,7 +2085,7 @@ function BitsnapCart({
2083
2085
  }
2084
2086
  });
2085
2087
  }
2086
- (0, import_react7.useEffect)(() => {
2088
+ (0, import_react8.useEffect)(() => {
2087
2089
  var _a;
2088
2090
  setupEventListener();
2089
2091
  if (typeof window !== "undefined") {
@@ -2164,12 +2166,2242 @@ function BitsnapCart({
2164
2166
  ] });
2165
2167
  }
2166
2168
  var BitsnapCart_default = BitsnapCart;
2169
+
2170
+ // src/components/notifications/NotificationsComponentPublic.tsx
2171
+ var import_react19 = require("react");
2172
+
2173
+ // src/rpc-provider.tsx
2174
+ var import_connect_query = require("@connectrpc/connect-query");
2175
+ var import_connect_web2 = require("@connectrpc/connect-web");
2176
+ var import_react_query5 = require("@tanstack/react-query");
2177
+ var import_react9 = require("react");
2178
+
2179
+ // src/gen/proto/public/v1/public_api-PublicApiService_connectquery.ts
2180
+ var public_api_PublicApiService_connectquery_exports = {};
2181
+ __export(public_api_PublicApiService_connectquery_exports, {
2182
+ applePayValidateMerchant: () => applePayValidateMerchant,
2183
+ authorizeOneClickPayment: () => authorizeOneClickPayment,
2184
+ didBuyProduct: () => didBuyProduct,
2185
+ getAvailableCountForProduct: () => getAvailableCountForProduct,
2186
+ getNotificationSettings: () => getNotificationSettings,
2187
+ getNotificationSettingsDetails: () => getNotificationSettingsDetails,
2188
+ getOrder: () => getOrder,
2189
+ getOrderRetryUrl: () => getOrderRetryUrl,
2190
+ getPreOrderDetails: () => getPreOrderDetails,
2191
+ getShopProducts: () => getShopProducts,
2192
+ isOneClickPaymentAvailable: () => isOneClickPaymentAvailable,
2193
+ notifyUserAboutProductAvailability: () => notifyUserAboutProductAvailability,
2194
+ pushEvent: () => pushEvent,
2195
+ pushSendDeviceToken: () => pushSendDeviceToken,
2196
+ shouldShopProducts: () => shouldShopProducts,
2197
+ updateGlobalNotificationSettings: () => updateGlobalNotificationSettings,
2198
+ updateNotificationSettings: () => updateNotificationSettings,
2199
+ userPanelDeleteAccount: () => userPanelDeleteAccount,
2200
+ userPanelGetAudiobookDetails: () => userPanelGetAudiobookDetails,
2201
+ userPanelGetAudiobookDetailsDownloadURLs: () => userPanelGetAudiobookDetailsDownloadURLs,
2202
+ userPanelGetFileDetails: () => userPanelGetFileDetails,
2203
+ userPanelGetProducts: () => userPanelGetProducts,
2204
+ userPanelGetTicketDetails: () => userPanelGetTicketDetails,
2205
+ userPanelLogin: () => userPanelLogin,
2206
+ userPanelLoginWithCode: () => userPanelLoginWithCode,
2207
+ userPanelLogout: () => userPanelLogout
2208
+ });
2209
+ var getOrder = PublicApiService.method.getOrder;
2210
+ var getOrderRetryUrl = PublicApiService.method.getOrderRetryUrl;
2211
+ var userPanelLogin = PublicApiService.method.userPanelLogin;
2212
+ var userPanelLoginWithCode = PublicApiService.method.userPanelLoginWithCode;
2213
+ var userPanelLogout = PublicApiService.method.userPanelLogout;
2214
+ var userPanelDeleteAccount = PublicApiService.method.userPanelDeleteAccount;
2215
+ var userPanelGetProducts = PublicApiService.method.userPanelGetProducts;
2216
+ var userPanelGetAudiobookDetails = PublicApiService.method.userPanelGetAudiobookDetails;
2217
+ var userPanelGetAudiobookDetailsDownloadURLs = PublicApiService.method.userPanelGetAudiobookDetailsDownloadURLs;
2218
+ var userPanelGetFileDetails = PublicApiService.method.userPanelGetFileDetails;
2219
+ var userPanelGetTicketDetails = PublicApiService.method.userPanelGetTicketDetails;
2220
+ var pushSendDeviceToken = PublicApiService.method.pushSendDeviceToken;
2221
+ var pushEvent = PublicApiService.method.pushEvent;
2222
+ var shouldShopProducts = PublicApiService.method.shouldShopProducts;
2223
+ var getShopProducts = PublicApiService.method.getShopProducts;
2224
+ var didBuyProduct = PublicApiService.method.didBuyProduct;
2225
+ var getNotificationSettings = PublicApiService.method.getNotificationSettings;
2226
+ var getNotificationSettingsDetails = PublicApiService.method.getNotificationSettingsDetails;
2227
+ var updateGlobalNotificationSettings = PublicApiService.method.updateGlobalNotificationSettings;
2228
+ var updateNotificationSettings = PublicApiService.method.updateNotificationSettings;
2229
+ var getAvailableCountForProduct = PublicApiService.method.getAvailableCountForProduct;
2230
+ var isOneClickPaymentAvailable = PublicApiService.method.isOneClickPaymentAvailable;
2231
+ var getPreOrderDetails = PublicApiService.method.getPreOrderDetails;
2232
+ var applePayValidateMerchant = PublicApiService.method.applePayValidateMerchant;
2233
+ var authorizeOneClickPayment = PublicApiService.method.authorizeOneClickPayment;
2234
+ var notifyUserAboutProductAvailability = PublicApiService.method.notifyUserAboutProductAvailability;
2235
+
2236
+ // src/gen/proto/dashboard/v1/notifications-NotificationsService_connectquery.ts
2237
+ var notifications_NotificationsService_connectquery_exports = {};
2238
+ __export(notifications_NotificationsService_connectquery_exports, {
2239
+ createNotificationGroup: () => createNotificationGroup,
2240
+ createNotificationGroupUser: () => createNotificationGroupUser,
2241
+ createNotificationMessage: () => createNotificationMessage,
2242
+ createNotificationMessageJob: () => createNotificationMessageJob,
2243
+ createNotificationSetting: () => createNotificationSetting,
2244
+ createNotificationUser: () => createNotificationUser,
2245
+ deleteNotificationGroup: () => deleteNotificationGroup,
2246
+ deleteNotificationGroupUser: () => deleteNotificationGroupUser,
2247
+ deleteNotificationMessage: () => deleteNotificationMessage,
2248
+ deleteNotificationMessageJob: () => deleteNotificationMessageJob,
2249
+ deleteNotificationSetting: () => deleteNotificationSetting,
2250
+ deleteNotificationUser: () => deleteNotificationUser,
2251
+ getNotificationUserSettings: () => getNotificationUserSettings,
2252
+ getSentNotificationMessages: () => getSentNotificationMessages,
2253
+ getUserGroups: () => getUserGroups,
2254
+ readNotificationGroupUsers: () => readNotificationGroupUsers,
2255
+ readNotificationGroups: () => readNotificationGroups,
2256
+ readNotificationMessageJobs: () => readNotificationMessageJobs,
2257
+ readNotificationMessages: () => readNotificationMessages,
2258
+ readNotificationProducts: () => readNotificationProducts,
2259
+ readNotificationSetting: () => readNotificationSetting,
2260
+ readNotificationUsers: () => readNotificationUsers,
2261
+ updateNotificationGroup: () => updateNotificationGroup,
2262
+ updateNotificationGroupUser: () => updateNotificationGroupUser,
2263
+ updateNotificationMessage: () => updateNotificationMessage,
2264
+ updateNotificationMessageJob: () => updateNotificationMessageJob,
2265
+ updateNotificationSetting: () => updateNotificationSetting,
2266
+ updateNotificationUser: () => updateNotificationUser,
2267
+ updateUserGroups: () => updateUserGroups,
2268
+ verifyUserEmail: () => verifyUserEmail
2269
+ });
2270
+
2271
+ // src/gen/proto/dashboard/v1/notifications_pb.ts
2272
+ var import_codegenv27 = require("@bufbuild/protobuf/codegenv2");
2273
+ var import_wkt5 = require("@bufbuild/protobuf/wkt");
2274
+
2275
+ // src/gen/proto/dashboard/v1/product_pb.ts
2276
+ var import_codegenv26 = require("@bufbuild/protobuf/codegenv2");
2277
+ var import_wkt4 = require("@bufbuild/protobuf/wkt");
2278
+ var file_dashboard_v1_product = /* @__PURE__ */ (0, import_codegenv26.fileDesc)("ChpkYXNoYm9hcmQvdjEvcHJvZHVjdC5wcm90bxIUZGFzaGJvYXJkLnByb2R1Y3QudjEiNwogRXhjaGFuZ2VQcm9kdWN0SURzVG9OYW1lc1JlcXVlc3QSEwoLcHJvZHVjdF9pZHMYASADKAkiugEKIUV4Y2hhbmdlUHJvZHVjdElEc1RvTmFtZXNSZXNwb25zZRJgCg1wcm9kdWN0X25hbWVzGAEgAygLMkkuZGFzaGJvYXJkLnByb2R1Y3QudjEuRXhjaGFuZ2VQcm9kdWN0SURzVG9OYW1lc1Jlc3BvbnNlLlByb2R1Y3ROYW1lc0VudHJ5GjMKEVByb2R1Y3ROYW1lc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEieQobR2V0RmlsZUFjY2Vzc01lbWJlcnNSZXF1ZXN0EhIKCnByb2R1Y3RfaWQYASABKAkSEwoGc2VhcmNoGAIgASgJSACIAQESFwoKdmFyaWFudF9pZBgDIAEoCUgBiAEBQgkKB19zZWFyY2hCDQoLX3ZhcmlhbnRfaWQi0QEKHEdldEZpbGVBY2Nlc3NNZW1iZXJzUmVzcG9uc2USSQoHbWVtYmVycxgBIAMoCzI4LmRhc2hib2FyZC5wcm9kdWN0LnYxLkdldEZpbGVBY2Nlc3NNZW1iZXJzUmVzcG9uc2UuVmFsdWUaZgoFVmFsdWUSCgoCaWQYASABKAkSDQoFZW1haWwYAiABKAkSMwoKY3JlYXRlZF9hdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAIgBAUINCgtfY3JlYXRlZF9hdCJkChdHaXZlQWNjZXNzVG9GaWxlUmVxdWVzdBISCgpwcm9kdWN0X2lkGAEgASgJEhcKCnZhcmlhbnRfaWQYAiABKAlIAIgBARINCgVlbWFpbBgDIAEoCUINCgtfdmFyaWFudF9pZCIrChhHaXZlQWNjZXNzVG9GaWxlUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCCInChlSZW1vdmVBY2Nlc3NUb0ZpbGVSZXF1ZXN0EgoKAmlkGAEgASgJIi0KGlJlbW92ZUFjY2Vzc1RvRmlsZVJlc3BvbnNlEg8KB3N1Y2Nlc3MYASABKAgiZAofU2VuZFRlc3RFbWFpbFdpdGhNZXNzYWdlUmVxdWVzdBINCgVlbWFpbBgBIAEoCRIUCgxodG1sX21lc3NhZ2UYAiABKAkSEgoFdGl0bGUYAyABKAlIAIgBAUIICgZfdGl0bGUiLwoZR2V0UHJvZHVjdFZhcmlhbnRzUmVxdWVzdBISCgpwcm9kdWN0X2lkGAEgASgJIpkBChpHZXRQcm9kdWN0VmFyaWFudHNSZXNwb25zZRJQCgh2YXJpYW50cxgBIAMoCzI+LmRhc2hib2FyZC5wcm9kdWN0LnYxLkdldFByb2R1Y3RWYXJpYW50c1Jlc3BvbnNlLlNpbmdsZVZhcmlhbnQaKQoNU2luZ2xlVmFyaWFudBIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJIoMBCihVcGRhdGVQcm9kdWN0QWZ0ZXJQdXJjaGFzZU1lc3NhZ2VSZXF1ZXN0EhIKCnByb2R1Y3RfaWQYASABKAkSDwoHbWVzc2FnZRgCIAEoCRIUCgxodG1sX21lc3NhZ2UYAyABKAkSEgoFdGl0bGUYBCABKAlIAIgBAUIICgZfdGl0bGUiOwolR2V0UHJvZHVjdEFmdGVyUHVyY2hhc2VNZXNzYWdlUmVxdWVzdBISCgpwcm9kdWN0X2lkGAEgASgJIrsCCiZHZXRQcm9kdWN0QWZ0ZXJQdXJjaGFzZU1lc3NhZ2VSZXNwb25zZRJXCgdzdWNjZXNzGAEgASgLMkQuZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0UHJvZHVjdEFmdGVyUHVyY2hhc2VNZXNzYWdlUmVzcG9uc2UuU3VjY2Vzc0gAEjcKB2ZhaWx1cmUYAiABKA4yJC5kYXNoYm9hcmQucHJvZHVjdC52MS5GYWlsdXJlTWVzc2FnZUgAGnUKB1N1Y2Nlc3MSFAoHbWVzc2FnZRgBIAEoCUgAiAEBEhkKDGh0bWxfbWVzc2FnZRgCIAEoCUgBiAEBEhIKBXRpdGxlGAMgASgJSAKIAQFCCgoIX21lc3NhZ2VCDwoNX2h0bWxfbWVzc2FnZUIICgZfdGl0bGVCCAoGcmVzdWx0IjMKHVB1Ymxpc2hQcm9kdWN0SWZOZWVkZWRSZXF1ZXN0EhIKCnByb2R1Y3RfaWQYASABKAkiZQorVXBkYXRlUHJvZHVjdFNlbmRUaWNrZXRBZnRlclB1cmNoYXNlUmVxdWVzdBISCgpwcm9kdWN0X2lkGAEgASgJEiIKGnNlbmRfdGlja2V0X2FmdGVyX3B1cmNoYXNlGAIgASgIIlYKKlVwZGF0ZVByb2R1Y3RBdWRpb2Jvb2tBZnRlclB1cmNoYXNlUmVxdWVzdBISCgpwcm9kdWN0X2lkGAEgASgJEhQKDGF1ZGlvYm9va19pZBgCIAEoCSI+CihHZXRQcm9kdWN0U2VuZFRpY2tldEFmdGVyUHVyY2hhc2VSZXF1ZXN0EhIKCnByb2R1Y3RfaWQYASABKAki+QEKKUdldFByb2R1Y3RTZW5kVGlja2V0QWZ0ZXJQdXJjaGFzZVJlc3BvbnNlEloKB3N1Y2Nlc3MYASABKAsyRy5kYXNoYm9hcmQucHJvZHVjdC52MS5HZXRQcm9kdWN0U2VuZFRpY2tldEFmdGVyUHVyY2hhc2VSZXNwb25zZS5TdWNjZXNzSAASNwoHZmFpbHVyZRgCIAEoDjIkLmRhc2hib2FyZC5wcm9kdWN0LnYxLkZhaWx1cmVNZXNzYWdlSAAaLQoHU3VjY2VzcxIiChpzZW5kX3RpY2tldF9hZnRlcl9wdXJjaGFzZRgBIAEoCEIICgZyZXN1bHQiPQonR2V0UHJvZHVjdEF1ZGlvYm9va0FmdGVyUHVyY2hhc2VSZXF1ZXN0EhIKCnByb2R1Y3RfaWQYASABKAkinwIKKEdldFByb2R1Y3RBdWRpb2Jvb2tBZnRlclB1cmNoYXNlUmVzcG9uc2USWQoHc3VjY2VzcxgBIAEoCzJGLmRhc2hib2FyZC5wcm9kdWN0LnYxLkdldFByb2R1Y3RBdWRpb2Jvb2tBZnRlclB1cmNoYXNlUmVzcG9uc2UuU3VjY2Vzc0gAEjcKB2ZhaWx1cmUYAiABKA4yJC5kYXNoYm9hcmQucHJvZHVjdC52MS5GYWlsdXJlTWVzc2FnZUgAGlUKB1N1Y2Nlc3MSFAoMYXVkaW9ib29rX2lkGAEgASgJEhcKD2F1ZGlvYm9va190aXRsZRgCIAEoCRIbChNhdWRpb2Jvb2tfaW1hZ2VfdXJsGAMgASgJQggKBnJlc3VsdCI3ChVTZWFyY2hQcm9kdWN0c1JlcXVlc3QSEwoGc2VhcmNoGAEgASgJSACIAQFCCQoHX3NlYXJjaCLMAgoWU2VhcmNoUHJvZHVjdHNSZXNwb25zZRJGCgdzdWNjZXNzGAEgASgLMjMuZGFzaGJvYXJkLnByb2R1Y3QudjEuU2VhcmNoUHJvZHVjdHNSZXNwb25zZS5SZXN1bHRIABI3CgdmYWlsdXJlGAIgASgOMiQuZGFzaGJvYXJkLnByb2R1Y3QudjEuRmFpbHVyZU1lc3NhZ2VIABpPCg1TaW5nbGVQcm9kdWN0EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSFgoJaW1hZ2VfdXJsGAMgASgJSACIAQFCDAoKX2ltYWdlX3VybBpWCgZSZXN1bHQSTAoIcHJvZHVjdHMYASADKAsyOi5kYXNoYm9hcmQucHJvZHVjdC52MS5TZWFyY2hQcm9kdWN0c1Jlc3BvbnNlLlNpbmdsZVByb2R1Y3RCCAoGcmVzdWx0IjUKH0dldFByb2R1Y3RCb3VnaHRBcnRpY2xlc1JlcXVlc3QSEgoKcHJvZHVjdF9pZBgBIAEoCSJgCiBHZXRQcm9kdWN0Qm91Z2h0QXJ0aWNsZXNSZXNwb25zZRI8CghhcnRpY2xlcxgBIAMoCzIqLmRhc2hib2FyZC5wcm9kdWN0LnYxLlByb2R1Y3RCb3VnaHRBcnRpY2xlIogBChRQcm9kdWN0Qm91Z2h0QXJ0aWNsZRIKCgJpZBgBIAEoCRISCgpwcm9kdWN0X2lkGAIgASgJEhQKB2NvbnRlbnQYAyABKAlIAIgBARIuCgpjcmVhdGVkX2F0GAggASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEIKCghfY29udGVudCJgCiFVcGRhdGVQcm9kdWN0Qm91Z2h0QXJ0aWNsZVJlcXVlc3QSOwoHYXJ0aWNsZRgBIAEoCzIqLmRhc2hib2FyZC5wcm9kdWN0LnYxLlByb2R1Y3RCb3VnaHRBcnRpY2xlIicKEUdldFByb2R1Y3RSZXF1ZXN0EhIKCnByb2R1Y3RfaWQYASABKAkiiwEKEkdldFByb2R1Y3RSZXNwb25zZRIyCgdwcm9kdWN0GAEgASgLMh8uZGFzaGJvYXJkLnByb2R1Y3QudjEuUHJvZHVjdFYySAASNwoHZmFpbHVyZRgCIAEoDjIkLmRhc2hib2FyZC5wcm9kdWN0LnYxLkZhaWx1cmVNZXNzYWdlSABCCAoGcmVzdWx0InIKHENyZWF0ZU9yVXBkYXRlUHJvZHVjdFJlcXVlc3QSMAoHcHJvZHVjdBgBIAEoCzIfLmRhc2hib2FyZC5wcm9kdWN0LnYxLlByb2R1Y3RWMhIgChhpc19kZXNjcmlwdGlvbl9kaWZmZXJlbnQYAiABKAgiTQoeVXBkYXRlUHJvZHVjdFVuaXF1ZVNsdWdSZXF1ZXN0EhIKCnByb2R1Y3RfaWQYASABKAkSFwoPbmV3X3VuaXF1ZV9zbHVnGAIgASgJIpkJCglQcm9kdWN0VjISDwoCaWQYASABKAlIAIgBARITCgt1bmlxdWVfc2x1ZxgCIAEoCRISCgpwcm9qZWN0X2lkGAMgASgJEjYKBnN0YXR1cxgEIAEoDjImLmRhc2hib2FyZC5wcm9kdWN0LnYxLlByb2R1Y3RWMi5TdGF0dXMSGQoMaXNfcmVjdXJyaW5nGAUgASgISAGIAQESNwoJcmVjdXJyaW5nGAYgASgLMh8uZGFzaGJvYXJkLnByb2R1Y3QudjEuUmVjdXJyaW5nSAKIAQESDAoEbmFtZRgHIAEoCRIYCgtkZXNjcmlwdGlvbhgIIAEoCUgDiAEBEh0KEGh0bWxfZGVzY3JpcHRpb24YCSABKAlIBIgBARIeChFzaG9ydF9kZXNjcmlwdGlvbhgKIAEoCUgFiAEBEhkKDHByaWNlX2Ftb3VudBgLIAEoBUgGiAEBEhsKDnByaWNlX2N1cnJlbmN5GAwgASgJSAeIAQESEAoDdGF4GA0gASgCSAiIAQESHwoSYXZhaWxhYmxlX3F1YW50aXR5GA4gASgFSAmIAQESPwoIZmVhdHVyZXMYDyADKAsyLS5kYXNoYm9hcmQucHJvZHVjdC52MS5Qcm9kdWN0VjIuRmVhdHVyZXNFbnRyeRIOCgZpbWFnZXMYECADKAkSHAoPdGh1bWJuYWlsX2ltYWdlGBEgASgJSAqIAQESFwoKbWFpbl9pbWFnZRgSIAEoCUgLiAEBEi8KCHZhcmlhbnRzGBMgAygLMh0uZGFzaGJvYXJkLnByb2R1Y3QudjEuVmFyaWFudBInChpzZW5kX3RpY2tldF9hZnRlcl9wdXJjaGFzZRgUIAEoCEgMiAEBEicKGmlzX3Byb2R1Y3RfdmlzaWJsZV9vbl9saXN0GBUgASgISA2IAQESGwoOaXNfZGVsaXZlcmFibGUYGCABKAhIDogBARISCgpjcmVhdGVkX2F0GBkgASgDEhIKCnVwZGF0ZWRfYXQYGiABKAMSFwoKZGVsZXRlZF9hdBgbIAEoA0gPiAEBGi8KDUZlYXR1cmVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIzCgZTdGF0dXMSCQoFRFJBRlQQABIPCgtVTlBVQkxJU0hFRBABEg0KCVBVQkxJU0hFRBACQgUKA19pZEIPCg1faXNfcmVjdXJyaW5nQgwKCl9yZWN1cnJpbmdCDgoMX2Rlc2NyaXB0aW9uQhMKEV9odG1sX2Rlc2NyaXB0aW9uQhQKEl9zaG9ydF9kZXNjcmlwdGlvbkIPCg1fcHJpY2VfYW1vdW50QhEKD19wcmljZV9jdXJyZW5jeUIGCgRfdGF4QhUKE19hdmFpbGFibGVfcXVhbnRpdHlCEgoQX3RodW1ibmFpbF9pbWFnZUINCgtfbWFpbl9pbWFnZUIdChtfc2VuZF90aWNrZXRfYWZ0ZXJfcHVyY2hhc2VCHQobX2lzX3Byb2R1Y3RfdmlzaWJsZV9vbl9saXN0QhEKD19pc19kZWxpdmVyYWJsZUINCgtfZGVsZXRlZF9hdCK7AwoJUmVjdXJyaW5nEjoKDWJpbGxpbmdQZXJpb2QYASABKA4yIy5kYXNoYm9hcmQucHJvZHVjdC52MS5CaWxsaW5nUGVyaW9kEhcKCnRyaWFsX2RheXMYAiABKAVIAIgBARIfChJudW1iZXJfb2ZfcGF5bWVudHMYAyABKAVIAYgBARIxCiRjaGFuZ2VfYW1vdW50X2Zvcl9jdXJyZW50U3Vic2NyaWJlcnMYBCABKAhIAogBARI0CidyZW1vdmVfYWNjZXNzX2Zvcl9jYW5jZWxsZWRfc3Vic2NyaWJlcnMYBSABKAhIA4gBARIuCiFzaG91bGRfc2VuZF90cmlhbF9wZXJpb2RfcmVtaW5kZXIYBiABKAhIBIgBAUINCgtfdHJpYWxfZGF5c0IVChNfbnVtYmVyX29mX3BheW1lbnRzQicKJV9jaGFuZ2VfYW1vdW50X2Zvcl9jdXJyZW50U3Vic2NyaWJlcnNCKgooX3JlbW92ZV9hY2Nlc3NfZm9yX2NhbmNlbGxlZF9zdWJzY3JpYmVyc0IkCiJfc2hvdWxkX3NlbmRfdHJpYWxfcGVyaW9kX3JlbWluZGVyIr4BCg9WYXJpYW50RGlzY291bnQSOAoEdHlwZRgBIAEoDjIqLmRhc2hib2FyZC5wcm9kdWN0LnYxLlZhcmlhbnREaXNjb3VudC5UeXBlEg4KBmFtb3VudBgCIAEoBRIxCghlbmRfZGF0ZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAIgBASIhCgRUeXBlEgkKBUZJWEVEEAASDgoKUEVSQ0VOVEFHRRABQgsKCV9lbmRfZGF0ZSLLBAoHVmFyaWFudBIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhgKC2Rlc2NyaXB0aW9uGAMgASgJSACIAQESFgoJaW1hZ2VfdXJsGAQgASgJSAGIAQESFAoMcHJpY2VfYW1vdW50GAUgASgFEhYKDnByaWNlX2N1cnJlbmN5GAYgASgJEhAKA3RheBgHIAEoBUgCiAEBEh8KEmF2YWlsYWJsZV9xdWFudGl0eRgIIAEoBUgDiAEBEjcKCXJlY3VycmluZxgJIAEoCzIfLmRhc2hib2FyZC5wcm9kdWN0LnYxLlJlY3VycmluZ0gEiAEBEhsKDmlzX2RlbGl2ZXJhYmxlGAogASgISAWIAQESIQoUbG93ZXN0X3ByaWNlXzMwX2RheXMYCyABKAVIBogBARI8CghkaXNjb3VudBgMIAEoCzIlLmRhc2hib2FyZC5wcm9kdWN0LnYxLlZhcmlhbnREaXNjb3VudEgHiAEBEj4KFWVzdGltYXRlZF9kZWxpdmVyeV9hdBgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBICIgBAUIOCgxfZGVzY3JpcHRpb25CDAoKX2ltYWdlX3VybEIGCgRfdGF4QhUKE19hdmFpbGFibGVfcXVhbnRpdHlCDAoKX3JlY3VycmluZ0IRCg9faXNfZGVsaXZlcmFibGVCFwoVX2xvd2VzdF9wcmljZV8zMF9kYXlzQgsKCV9kaXNjb3VudEIYChZfZXN0aW1hdGVkX2RlbGl2ZXJ5X2F0IngKHUNyZWF0ZU9yVXBkYXRlUHJvZHVjdFJlc3BvbnNlEhQKCnByb2R1Y3RfaWQYASABKAlIABI3CgdmYWlsdXJlGAIgASgOMiQuZGFzaGJvYXJkLnByb2R1Y3QudjEuRmFpbHVyZU1lc3NhZ2VIAEIICgZyZXN1bHQifAoMQm9vbFJlc3BvbnNlEikKB3N1Y2Nlc3MYASABKAsyFi5nb29nbGUucHJvdG9idWYuRW1wdHlIABI3CgdmYWlsdXJlGAIgASgOMiQuZGFzaGJvYXJkLnByb2R1Y3QudjEuRmFpbHVyZU1lc3NhZ2VIAEIICgZyZXN1bHQqvQEKDUJpbGxpbmdQZXJpb2QSGAoUQklMTElOR19QRVJJT0RfREFJTFkQABIZChVCSUxMSU5HX1BFUklPRF9XRUVLTFkQARIaChZCSUxMSU5HX1BFUklPRF9NT05USExZEAISHAoYQklMTElOR19QRVJJT0RfUVVBUlRFUkxZEAMSIAocQklMTElOR19QRVJJT0RfU0VNSV9BTk5VQUxMWRAEEhsKF0JJTExJTkdfUEVSSU9EX0FOTlVBTExZEAUqlQIKDkZhaWx1cmVNZXNzYWdlEhsKF0ZBSUxVUkVfTUVTU0FHRV9VTktOT1dOEAASJQohRkFJTFVSRV9NRVNTQUdFX1BST0pFQ1RfTk9UX0ZPVU5EEAESJQohRkFJTFVSRV9NRVNTQUdFX1BST0RVQ1RfTk9UX0ZPVU5EEAISJgoiRkFJTFVSRV9NRVNTQUdFX0lOVkFMSURfUFJPRFVDVF9JRBADEiYKIkZBSUxVUkVfTUVTU0FHRV9TTFVHX0FMUkVBRFlfVEFLRU4QBBIpCiVGQUlMVVJFX01FU1NBR0VfQ0FOTk9UX0NSRUFURV9QUk9EVUNUEAUSHQoZRkFJTFVSRV9NRVNTQUdFX05PX0FDQ0VTUxAGMrUUCg1Qcm9kdWN0Um91dGVyEoABChVDcmVhdGVPclVwZGF0ZVByb2R1Y3QSMi5kYXNoYm9hcmQucHJvZHVjdC52MS5DcmVhdGVPclVwZGF0ZVByb2R1Y3RSZXF1ZXN0GjMuZGFzaGJvYXJkLnByb2R1Y3QudjEuQ3JlYXRlT3JVcGRhdGVQcm9kdWN0UmVzcG9uc2UScwoXVXBkYXRlUHJvZHVjdFVuaXF1ZVNsdWcSNC5kYXNoYm9hcmQucHJvZHVjdC52MS5VcGRhdGVQcm9kdWN0VW5pcXVlU2x1Z1JlcXVlc3QaIi5kYXNoYm9hcmQucHJvZHVjdC52MS5Cb29sUmVzcG9uc2USXwoKR2V0UHJvZHVjdBInLmRhc2hib2FyZC5wcm9kdWN0LnYxLkdldFByb2R1Y3RSZXF1ZXN0GiguZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0UHJvZHVjdFJlc3BvbnNlEqQBCiFHZXRQcm9kdWN0U2VuZFRpY2tldEFmdGVyUHVyY2hhc2USPi5kYXNoYm9hcmQucHJvZHVjdC52MS5HZXRQcm9kdWN0U2VuZFRpY2tldEFmdGVyUHVyY2hhc2VSZXF1ZXN0Gj8uZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0UHJvZHVjdFNlbmRUaWNrZXRBZnRlclB1cmNoYXNlUmVzcG9uc2USoQEKIEdldFByb2R1Y3RBdWRpb2Jvb2tBZnRlclB1cmNoYXNlEj0uZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0UHJvZHVjdEF1ZGlvYm9va0FmdGVyUHVyY2hhc2VSZXF1ZXN0Gj4uZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0UHJvZHVjdEF1ZGlvYm9va0FmdGVyUHVyY2hhc2VSZXNwb25zZRKNAQokVXBkYXRlUHJvZHVjdFNlbmRUaWNrZXRBZnRlclB1cmNoYXNlEkEuZGFzaGJvYXJkLnByb2R1Y3QudjEuVXBkYXRlUHJvZHVjdFNlbmRUaWNrZXRBZnRlclB1cmNoYXNlUmVxdWVzdBoiLmRhc2hib2FyZC5wcm9kdWN0LnYxLkJvb2xSZXNwb25zZRKLAQojVXBkYXRlUHJvZHVjdEF1ZGlvYm9va0FmdGVyUHVyY2hhc2USQC5kYXNoYm9hcmQucHJvZHVjdC52MS5VcGRhdGVQcm9kdWN0QXVkaW9ib29rQWZ0ZXJQdXJjaGFzZVJlcXVlc3QaIi5kYXNoYm9hcmQucHJvZHVjdC52MS5Cb29sUmVzcG9uc2UScQoWUHVibGlzaFByb2R1Y3RJZk5lZWRlZBIzLmRhc2hib2FyZC5wcm9kdWN0LnYxLlB1Ymxpc2hQcm9kdWN0SWZOZWVkZWRSZXF1ZXN0GiIuZGFzaGJvYXJkLnByb2R1Y3QudjEuQm9vbFJlc3BvbnNlEpsBCh5HZXRQcm9kdWN0QWZ0ZXJQdXJjaGFzZU1lc3NhZ2USOy5kYXNoYm9hcmQucHJvZHVjdC52MS5HZXRQcm9kdWN0QWZ0ZXJQdXJjaGFzZU1lc3NhZ2VSZXF1ZXN0GjwuZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0UHJvZHVjdEFmdGVyUHVyY2hhc2VNZXNzYWdlUmVzcG9uc2UShwEKIVVwZGF0ZVByb2R1Y3RBZnRlclB1cmNoYXNlTWVzc2FnZRI+LmRhc2hib2FyZC5wcm9kdWN0LnYxLlVwZGF0ZVByb2R1Y3RBZnRlclB1cmNoYXNlTWVzc2FnZVJlcXVlc3QaIi5kYXNoYm9hcmQucHJvZHVjdC52MS5Cb29sUmVzcG9uc2USdwoSR2V0UHJvZHVjdFZhcmlhbnRzEi8uZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0UHJvZHVjdFZhcmlhbnRzUmVxdWVzdBowLmRhc2hib2FyZC5wcm9kdWN0LnYxLkdldFByb2R1Y3RWYXJpYW50c1Jlc3BvbnNlEnUKGFNlbmRUZXN0RW1haWxXaXRoTWVzc2FnZRI1LmRhc2hib2FyZC5wcm9kdWN0LnYxLlNlbmRUZXN0RW1haWxXaXRoTWVzc2FnZVJlcXVlc3QaIi5kYXNoYm9hcmQucHJvZHVjdC52MS5Cb29sUmVzcG9uc2USawoOU2VhcmNoUHJvZHVjdHMSKy5kYXNoYm9hcmQucHJvZHVjdC52MS5TZWFyY2hQcm9kdWN0c1JlcXVlc3QaLC5kYXNoYm9hcmQucHJvZHVjdC52MS5TZWFyY2hQcm9kdWN0c1Jlc3BvbnNlEowBChlFeGNoYW5nZVByb2R1Y3RJRHNUb05hbWVzEjYuZGFzaGJvYXJkLnByb2R1Y3QudjEuRXhjaGFuZ2VQcm9kdWN0SURzVG9OYW1lc1JlcXVlc3QaNy5kYXNoYm9hcmQucHJvZHVjdC52MS5FeGNoYW5nZVByb2R1Y3RJRHNUb05hbWVzUmVzcG9uc2USiQEKGEdldFByb2R1Y3RCb3VnaHRBcnRpY2xlcxI1LmRhc2hib2FyZC5wcm9kdWN0LnYxLkdldFByb2R1Y3RCb3VnaHRBcnRpY2xlc1JlcXVlc3QaNi5kYXNoYm9hcmQucHJvZHVjdC52MS5HZXRQcm9kdWN0Qm91Z2h0QXJ0aWNsZXNSZXNwb25zZRJ5ChpVcGRhdGVQcm9kdWN0Qm91Z2h0QXJ0aWNsZRI3LmRhc2hib2FyZC5wcm9kdWN0LnYxLlVwZGF0ZVByb2R1Y3RCb3VnaHRBcnRpY2xlUmVxdWVzdBoiLmRhc2hib2FyZC5wcm9kdWN0LnYxLkJvb2xSZXNwb25zZRJpChdBZGRQcm9kdWN0Qm91Z2h0QXJ0aWNsZRIqLmRhc2hib2FyZC5wcm9kdWN0LnYxLlByb2R1Y3RCb3VnaHRBcnRpY2xlGiIuZGFzaGJvYXJkLnByb2R1Y3QudjEuQm9vbFJlc3BvbnNlEn0KFEdldEZpbGVBY2Nlc3NNZW1iZXJzEjEuZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0RmlsZUFjY2Vzc01lbWJlcnNSZXF1ZXN0GjIuZGFzaGJvYXJkLnByb2R1Y3QudjEuR2V0RmlsZUFjY2Vzc01lbWJlcnNSZXNwb25zZRJxChBHaXZlQWNjZXNzVG9GaWxlEi0uZGFzaGJvYXJkLnByb2R1Y3QudjEuR2l2ZUFjY2Vzc1RvRmlsZVJlcXVlc3QaLi5kYXNoYm9hcmQucHJvZHVjdC52MS5HaXZlQWNjZXNzVG9GaWxlUmVzcG9uc2USdwoSUmVtb3ZlQWNjZXNzVG9GaWxlEi8uZGFzaGJvYXJkLnByb2R1Y3QudjEuUmVtb3ZlQWNjZXNzVG9GaWxlUmVxdWVzdBowLmRhc2hib2FyZC5wcm9kdWN0LnYxLlJlbW92ZUFjY2Vzc1RvRmlsZVJlc3BvbnNlYgZwcm90bzM", [import_wkt4.file_google_protobuf_empty, import_wkt4.file_google_protobuf_timestamp]);
2279
+
2280
+ // src/gen/proto/dashboard/v1/notifications_pb.ts
2281
+ var file_dashboard_v1_notifications = /* @__PURE__ */ (0, import_codegenv27.fileDesc)("CiBkYXNoYm9hcmQvdjEvbm90aWZpY2F0aW9ucy5wcm90bxIaZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEiYAoWVmVyaWZ5VXNlckVtYWlsUmVxdWVzdBISCgVlbWFpbBgBIAEoCUgAiAEBEhEKBGNvZGUYAiABKAlIAYgBARIMCgRzbHVnGAMgASgJQggKBl9lbWFpbEIHCgVfY29kZSJ/ChdWZXJpZnlVc2VyRW1haWxSZXNwb25zZRIPCgJvaxgBIAEoCEgAiAEBEhkKDGFjY2Vzc190b2tlbhgCIAEoCUgBiAEBEhQKB3VzZXJfaWQYAyABKAlIAogBAUIFCgNfb2tCDwoNX2FjY2Vzc190b2tlbkIKCghfdXNlcl9pZCJQChRHZXRVc2VyR3JvdXBzUmVxdWVzdBIMCgRzbHVnGAEgASgJEhkKDGFjY2Vzc190b2tlbhgCIAEoCUgAiAEBQg8KDV9hY2Nlc3NfdG9rZW4iiQIKFUdldFVzZXJHcm91cHNSZXNwb25zZRJHCgZncm91cHMYASADKAsyNy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5HZXRVc2VyR3JvdXBzUmVzcG9uc2UuR3JvdXAapgEKBUdyb3VwEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSGAoLZGVzY3JpcHRpb24YAyABKAlIAIgBARINCgVpc19vbhgEIAEoCBI8Cglob3dfb2Z0ZW4YBSABKA4yJC5jb21tb24udjEuTm90aWZpY2F0aW9uR3JvdXBIb3dPZnRlbkgBiAEBQg4KDF9kZXNjcmlwdGlvbkIMCgpfaG93X29mdGVuIncKF1VwZGF0ZVVzZXJHcm91cHNSZXF1ZXN0EgwKBHNsdWcYASABKAkSDwoHdXNlcl9pZBgCIAEoCRIRCglncm91cF9pZHMYAyADKAkSGQoMYWNjZXNzX3Rva2VuGAQgASgJSACIAQFCDwoNX2FjY2Vzc190b2tlbiJvCiJHZXROb3RpZmljYXRpb25Vc2VyU2V0dGluZ3NSZXF1ZXN0EgwKBHNsdWcYASABKAkSDwoHdXNlcl9pZBgCIAEoCRIZCgxhY2Nlc3NfdG9rZW4YAyABKAlIAIgBAUIPCg1fYWNjZXNzX3Rva2VuIowECiNHZXROb3RpZmljYXRpb25Vc2VyU2V0dGluZ3NSZXNwb25zZRJZCgdzdWNjZXNzGAEgASgLMkYuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuR2V0Tm90aWZpY2F0aW9uVXNlclNldHRpbmdzUmVzcG9uc2UuUmVzdWx0SAASPQoHZmFpbHVyZRgCIAEoDjIqLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkZhaWx1cmVNZXNzYWdlSAAawAIKBlJlc3VsdBIfChdub3RpZmljYXRpb25fc2V0dGluZ19pZBgBIAEoCRIZChFzdWJzY3JpcHRpb25fc2x1ZxgCIAEoCRIjChttb2JpbGVfbm90aWZpY2F0aW9uX2VuYWJsZWQYAyABKAgSIgoaZW1haWxfbm90aWZpY2F0aW9uX2VuYWJsZWQYBCABKAgSIAoYc21zX25vdGlmaWNhdGlvbl9lbmFibGVkGAUgASgIEiQKHGVtYWlsX25vdGlmaWNhdGlvbl9hdmFpbGFibGUYBiABKAgSIgoac21zX25vdGlmaWNhdGlvbl9hdmFpbGFibGUYByABKAgSJQodbW9iaWxlX25vdGlmaWNhdGlvbl9hdmFpbGFibGUYCCABKAgSHgoWaGFzX3VzZXJfaW5zdGFsbGVkX2FwcBgJIAEoCEIICgZyZXN1bHQiIgogQ3JlYXRlTm90aWZpY2F0aW9uU2V0dGluZ1JlcXVlc3QiIAoeUmVhZE5vdGlmaWNhdGlvblNldHRpbmdSZXF1ZXN0IskBCiBVcGRhdGVOb3RpZmljYXRpb25TZXR0aW5nUmVxdWVzdBIfChdub3RpZmljYXRpb25fc2V0dGluZ19pZBgBIAEoCRIZChFzdWJzY3JpcHRpb25fc2x1ZxgCIAEoCRIjChttb2JpbGVfbm90aWZpY2F0aW9uX2VuYWJsZWQYAyABKAgSIgoaZW1haWxfbm90aWZpY2F0aW9uX2VuYWJsZWQYBCABKAgSIAoYc21zX25vdGlmaWNhdGlvbl9lbmFibGVkGAUgASgIIkMKIERlbGV0ZU5vdGlmaWNhdGlvblNldHRpbmdSZXF1ZXN0Eh8KF25vdGlmaWNhdGlvbl9zZXR0aW5nX2lkGAEgASgJIvMCCh9SZWFkTm90aWZpY2F0aW9uU2V0dGluZ1Jlc3BvbnNlElUKB3N1Y2Nlc3MYASABKAsyQi5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5SZWFkTm90aWZpY2F0aW9uU2V0dGluZ1Jlc3BvbnNlLlJlc3VsdEgAEj0KB2ZhaWx1cmUYAiABKA4yKi5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5GYWlsdXJlTWVzc2FnZUgAGq8BCgZSZXN1bHQSHwoXbm90aWZpY2F0aW9uX3NldHRpbmdfaWQYASABKAkSGQoRc3Vic2NyaXB0aW9uX3NsdWcYAiABKAkSIwobbW9iaWxlX25vdGlmaWNhdGlvbl9lbmFibGVkGAMgASgIEiIKGmVtYWlsX25vdGlmaWNhdGlvbl9lbmFibGVkGAQgASgIEiAKGHNtc19ub3RpZmljYXRpb25fZW5hYmxlZBgFIAEoCEIICgZyZXN1bHQi5AEKG05vdGlmaWNhdGlvblNldHRpbmdSZXNwb25zZRJRCgdzdWNjZXNzGAEgASgLMj4uZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uU2V0dGluZ1Jlc3BvbnNlLlJlc3VsdEgAEj0KB2ZhaWx1cmUYAiABKA4yKi5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5GYWlsdXJlTWVzc2FnZUgAGikKBlJlc3VsdBIfChdub3RpZmljYXRpb25fc2V0dGluZ19pZBgBIAEoCUIICgZyZXN1bHQiygEKHkNyZWF0ZU5vdGlmaWNhdGlvbkdyb3VwUmVxdWVzdBIMCgRuYW1lGAEgASgJEhgKC2Rlc2NyaXB0aW9uGAIgASgJSACIAQESPAoJaG93X29mdGVuGAMgASgOMiQuY29tbW9uLnYxLk5vdGlmaWNhdGlvbkdyb3VwSG93T2Z0ZW5IAYgBARIWCglpc19wdWJsaWMYBCABKAhIAogBAUIOCgxfZGVzY3JpcHRpb25CDAoKX2hvd19vZnRlbkIMCgpfaXNfcHVibGljIloKHVJlYWROb3RpZmljYXRpb25Hcm91cHNSZXF1ZXN0EhEKCWdyb3VwX2lkcxgBIAMoCRIXCgpncm91cF9uYW1lGAIgASgJSACIAQFCDQoLX2dyb3VwX25hbWUi6QEKHlVwZGF0ZU5vdGlmaWNhdGlvbkdyb3VwUmVxdWVzdBIdChVub3RpZmljYXRpb25fZ3JvdXBfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIYCgtkZXNjcmlwdGlvbhgDIAEoCUgAiAEBEjwKCWhvd19vZnRlbhgEIAEoDjIkLmNvbW1vbi52MS5Ob3RpZmljYXRpb25Hcm91cEhvd09mdGVuSAGIAQESFgoJaXNfcHVibGljGAUgASgISAKIAQFCDgoMX2Rlc2NyaXB0aW9uQgwKCl9ob3dfb2Z0ZW5CDAoKX2lzX3B1YmxpYyI/Ch5EZWxldGVOb3RpZmljYXRpb25Hcm91cFJlcXVlc3QSHQoVbm90aWZpY2F0aW9uX2dyb3VwX2lkGAEgASgJIuoDCh5SZWFkTm90aWZpY2F0aW9uR3JvdXBzUmVzcG9uc2USVAoHc3VjY2VzcxgBIAEoCzJBLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlJlYWROb3RpZmljYXRpb25Hcm91cHNSZXNwb25zZS5SZXN1bHRIABI9CgdmYWlsdXJlGAIgASgOMiouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuRmFpbHVyZU1lc3NhZ2VIABrMAQoFR3JvdXASHQoVbm90aWZpY2F0aW9uX2dyb3VwX2lkGAEgASgJEgwKBG5hbWUYAiABKAkSGAoLZGVzY3JpcHRpb24YAyABKAlIAIgBARI8Cglob3dfb2Z0ZW4YBCABKA4yJC5jb21tb24udjEuTm90aWZpY2F0aW9uR3JvdXBIb3dPZnRlbkgBiAEBEg0KBXVzZXJzGAUgASgFEhEKCWlzX3B1YmxpYxgGIAEoCEIOCgxfZGVzY3JpcHRpb25CDAoKX2hvd19vZnRlbhpaCgZSZXN1bHQSUAoGZ3JvdXBzGAEgAygLMkAuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvbkdyb3Vwc1Jlc3BvbnNlLkdyb3VwQggKBnJlc3VsdCLeAQoZTm90aWZpY2F0aW9uR3JvdXBSZXNwb25zZRJPCgdzdWNjZXNzGAEgASgLMjwuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uR3JvdXBSZXNwb25zZS5SZXN1bHRIABI9CgdmYWlsdXJlGAIgASgOMiouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuRmFpbHVyZU1lc3NhZ2VIABonCgZSZXN1bHQSHQoVbm90aWZpY2F0aW9uX2dyb3VwX2lkGAEgASgJQggKBnJlc3VsdCKjAgodQ3JlYXRlTm90aWZpY2F0aW9uVXNlclJlcXVlc3QSDAoEc2x1ZxgBIAEoCRINCgVlbWFpbBgCIAEoCRIOCgZncm91cHMYAyADKAkSEgoFcGhvbmUYBCABKAlIAIgBARIXCgpmaXJzdF9uYW1lGAUgASgJSAGIAQESFgoJbGFzdF9uYW1lGAYgASgJSAKIAQESIwobbW9iaWxlX25vdGlmaWNhdGlvbl9lbmFibGVkGAcgASgIEiIKGmVtYWlsX25vdGlmaWNhdGlvbl9lbmFibGVkGAggASgIEiAKGHNtc19ub3RpZmljYXRpb25fZW5hYmxlZBgJIAEoCEIICgZfcGhvbmVCDQoLX2ZpcnN0X25hbWVCDAoKX2xhc3RfbmFtZSJYChxSZWFkTm90aWZpY2F0aW9uVXNlcnNSZXF1ZXN0EhAKCHVzZXJfaWRzGAEgAygJEhcKCnVzZXJfZW1haWwYAiABKAlIAIgBAUINCgtfdXNlcl9lbWFpbCKwAgodVXBkYXRlTm90aWZpY2F0aW9uVXNlclJlcXVlc3QSDAoEc2x1ZxgBIAEoCRIcChRub3RpZmljYXRpb25fdXNlcl9pZBgCIAEoCRIXCgpmaXJzdF9uYW1lGAMgASgJSACIAQESFgoJbGFzdF9uYW1lGAQgASgJSAGIAQESIwobbW9iaWxlX25vdGlmaWNhdGlvbl9lbmFibGVkGAUgASgIEiIKGmVtYWlsX25vdGlmaWNhdGlvbl9lbmFibGVkGAYgASgIEiAKGHNtc19ub3RpZmljYXRpb25fZW5hYmxlZBgHIAEoCBIZCgxhY2Nlc3NfdG9rZW4YCCABKAlIAogBAUINCgtfZmlyc3RfbmFtZUIMCgpfbGFzdF9uYW1lQg8KDV9hY2Nlc3NfdG9rZW4iagodRGVsZXRlTm90aWZpY2F0aW9uVXNlclJlcXVlc3QSDwoHdXNlcl9pZBgBIAEoCRIMCgRzbHVnGAIgASgJEhkKDGFjY2Vzc190b2tlbhgDIAEoCUgAiAEBQg8KDV9hY2Nlc3NfdG9rZW4i+AEKHVJlYWROb3RpZmljYXRpb25Vc2Vyc1Jlc3BvbnNlElMKB3N1Y2Nlc3MYASABKAsyQC5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5SZWFkTm90aWZpY2F0aW9uVXNlcnNSZXNwb25zZS5SZXN1bHRIABI9CgdmYWlsdXJlGAIgASgOMiouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuRmFpbHVyZU1lc3NhZ2VIABo5CgZSZXN1bHQSLwoFdXNlcnMYASADKAsyIC5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Vc2VyQggKBnJlc3VsdCKpAgoYTm90aWZpY2F0aW9uVXNlclJlc3BvbnNlEk4KB3N1Y2Nlc3MYASABKAsyOy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25Vc2VyUmVzcG9uc2UuUmVzdWx0SAASPQoHZmFpbHVyZRgCIAEoDjIqLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkZhaWx1cmVNZXNzYWdlSAASGQoMYWNjZXNzX3Rva2VuGAMgASgJSAGIAQESFAoHdXNlcl9pZBgEIAEoCUgCiAEBGiYKBlJlc3VsdBIcChRub3RpZmljYXRpb25fdXNlcl9pZBgBIAEoCUIICgZyZXN1bHRCDwoNX2FjY2Vzc190b2tlbkIKCghfdXNlcl9pZCJhCiJDcmVhdGVOb3RpZmljYXRpb25Hcm91cFVzZXJSZXF1ZXN0Eh0KFW5vdGlmaWNhdGlvbl9ncm91cF9pZBgBIAEoCRIcChRub3RpZmljYXRpb25fdXNlcl9pZBgCIAEoCSI3CiJSZWFkTm90aWZpY2F0aW9uR3JvdXBVc2Vyc1JlcXVlc3RzEhEKCWdyb3VwX2lkcxgBIAMoCSKFAQoiVXBkYXRlTm90aWZpY2F0aW9uR3JvdXBVc2VyUmVxdWVzdBIiChpub3RpZmljYXRpb25fZ3JvdXBfdXNlcl9pZBgBIAEoCRIdChVub3RpZmljYXRpb25fZ3JvdXBfaWQYAiABKAkSHAoUbm90aWZpY2F0aW9uX3VzZXJfaWQYAyABKAkiSAoiRGVsZXRlTm90aWZpY2F0aW9uR3JvdXBVc2VyUmVxdWVzdBIiChpub3RpZmljYXRpb25fZ3JvdXBfdXNlcl9pZBgBIAEoCSKCAgoiUmVhZE5vdGlmaWNhdGlvbkdyb3VwVXNlcnNSZXNwb25zZRJYCgdzdWNjZXNzGAEgASgLMkUuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvbkdyb3VwVXNlcnNSZXNwb25zZS5SZXN1bHRIABI9CgdmYWlsdXJlGAIgASgOMiouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuRmFpbHVyZU1lc3NhZ2VIABo5CgZSZXN1bHQSLwoFdXNlcnMYASADKAsyIC5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Vc2VyQggKBnJlc3VsdCLrAQodTm90aWZpY2F0aW9uR3JvdXBVc2VyUmVzcG9uc2USUwoHc3VjY2VzcxgBIAEoCzJALmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbkdyb3VwVXNlclJlc3BvbnNlLlJlc3VsdEgAEj0KB2ZhaWx1cmUYAiABKA4yKi5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5GYWlsdXJlTWVzc2FnZUgAGiwKBlJlc3VsdBIiChpub3RpZmljYXRpb25fZ3JvdXBfdXNlcl9pZBgBIAEoCUIICgZyZXN1bHQi7wMKE05vdGlmaWNhdGlvbk1lc3NhZ2USHwoXbm90aWZpY2F0aW9uX21lc3NhZ2VfaWQYASABKAkSRQoGc3RhdHVzGAIgASgOMjUuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uTWVzc2FnZVN0YXR1cxIrCgdzZW5kX2F0GAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBINCgV0aXRsZRgEIAEoCRIVCghzdWJ0aXRsZRgFIAEoCUgAiAEBEhQKB21lc3NhZ2UYBiABKAlIAYgBARIWCglpbWFnZV91cmwYByABKAlIAogBARIOCgZncm91cHMYCCADKAkSEAoIcHJvZHVjdHMYCSADKAkSDQoFdXNlcnMYCiADKAkSIwobbW9iaWxlX25vdGlmaWNhdGlvbl9lbmFibGVkGAsgASgIEiIKGmVtYWlsX25vdGlmaWNhdGlvbl9lbmFibGVkGAwgASgIEiAKGHNtc19ub3RpZmljYXRpb25fZW5hYmxlZBgNIAEoCBIaCg1lcnJvcl9tZXNzYWdlGA4gASgJSAOIAQFCCwoJX3N1YnRpdGxlQgoKCF9tZXNzYWdlQgwKCl9pbWFnZV91cmxCEAoOX2Vycm9yX21lc3NhZ2UirQMKIENyZWF0ZU5vdGlmaWNhdGlvbk1lc3NhZ2VSZXF1ZXN0EkUKBnN0YXR1cxgBIAEoDjI1LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbk1lc3NhZ2VTdGF0dXMSKwoHc2VuZF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASDQoFdGl0bGUYAyABKAkSFQoIc3VidGl0bGUYBCABKAlIAIgBARIUCgdtZXNzYWdlGAUgASgJSAGIAQESFgoJaW1hZ2VfdXJsGAYgASgJSAKIAQESDgoGZ3JvdXBzGAcgAygJEhAKCHByb2R1Y3RzGAggAygJEg0KBXVzZXJzGAkgAygJEiMKG21vYmlsZV9ub3RpZmljYXRpb25fZW5hYmxlZBgKIAEoCBIiChplbWFpbF9ub3RpZmljYXRpb25fZW5hYmxlZBgLIAEoCBIgChhzbXNfbm90aWZpY2F0aW9uX2VuYWJsZWQYDCABKAhCCwoJX3N1YnRpdGxlQgoKCF9tZXNzYWdlQgwKCl9pbWFnZV91cmwipAIKIkdldFNlbnROb3RpZmljYXRpb25NZXNzYWdlc1JlcXVlc3QSJAoXbm90aWZpY2F0aW9uX21lc3NhZ2VfaWQYASABKAlIAIgBARIzCgpzdGFydF90aW1lGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgBiAEBEjEKCGVuZF90aW1lGAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgCiAEBEiAKE2luY2x1ZGVfZXhwb3J0X2RhdGEYBCABKAhIA4gBAUIaChhfbm90aWZpY2F0aW9uX21lc3NhZ2VfaWRCDQoLX3N0YXJ0X3RpbWVCCwoJX2VuZF90aW1lQhYKFF9pbmNsdWRlX2V4cG9ydF9kYXRhIuEDCiNHZXRTZW50Tm90aWZpY2F0aW9uTWVzc2FnZXNSZXNwb25zZRJZCgdzdWNjZXNzGAEgASgLMkYuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuR2V0U2VudE5vdGlmaWNhdGlvbk1lc3NhZ2VzUmVzcG9uc2UuUmVzdWx0SAASPQoHZmFpbHVyZRgCIAEoDjIqLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkZhaWx1cmVNZXNzYWdlSAAaKAoYTm90aWZpY2F0aW9uTWVzc2FnZVN0YXRzEgwKBHNlbnQYASABKAUa6wEKBlJlc3VsdBJOChVub3RpZmljYXRpb25fbWVzc2FnZXMYASADKAsyLy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25NZXNzYWdlEmcKBXN0YXRzGAIgASgLMlguZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuR2V0U2VudE5vdGlmaWNhdGlvbk1lc3NhZ2VzUmVzcG9uc2UuTm90aWZpY2F0aW9uTWVzc2FnZVN0YXRzEhgKC2V4cG9ydF9kYXRhGAMgASgMSACIAQFCDgoMX2V4cG9ydF9kYXRhQggKBnJlc3VsdCJjCh9SZWFkTm90aWZpY2F0aW9uTWVzc2FnZXNSZXF1ZXN0EiQKF25vdGlmaWNhdGlvbl9tZXNzYWdlX2lkGAEgASgJSACIAQFCGgoYX25vdGlmaWNhdGlvbl9tZXNzYWdlX2lkIvwDCiBVcGRhdGVOb3RpZmljYXRpb25NZXNzYWdlUmVxdWVzdBIfChdub3RpZmljYXRpb25fbWVzc2FnZV9pZBgBIAEoCRJFCgZzdGF0dXMYAiABKA4yNS5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25NZXNzYWdlU3RhdHVzEisKB3NlbmRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEg0KBXRpdGxlGAQgASgJEhUKCHN1YnRpdGxlGAUgASgJSACIAQESFAoHbWVzc2FnZRgGIAEoCUgBiAEBEhYKCWltYWdlX3VybBgHIAEoCUgCiAEBEg4KBmdyb3VwcxgIIAMoCRIQCghwcm9kdWN0cxgJIAMoCRINCgV1c2VycxgKIAMoCRIjChttb2JpbGVfbm90aWZpY2F0aW9uX2VuYWJsZWQYCyABKAgSIgoaZW1haWxfbm90aWZpY2F0aW9uX2VuYWJsZWQYDCABKAgSIAoYc21zX25vdGlmaWNhdGlvbl9lbmFibGVkGA0gASgIEhoKDWVycm9yX21lc3NhZ2UYDiABKAlIA4gBAUILCglfc3VidGl0bGVCCgoIX21lc3NhZ2VCDAoKX2ltYWdlX3VybEIQCg5fZXJyb3JfbWVzc2FnZSJDCiBEZWxldGVOb3RpZmljYXRpb25NZXNzYWdlUmVxdWVzdBIfChdub3RpZmljYXRpb25fbWVzc2FnZV9pZBgBIAEoCSKdAgogUmVhZE5vdGlmaWNhdGlvbk1lc3NhZ2VzUmVzcG9uc2USVgoHc3VjY2VzcxgBIAEoCzJDLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlJlYWROb3RpZmljYXRpb25NZXNzYWdlc1Jlc3BvbnNlLlJlc3VsdEgAEj0KB2ZhaWx1cmUYAiABKA4yKi5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5GYWlsdXJlTWVzc2FnZUgAGlgKBlJlc3VsdBJOChVub3RpZmljYXRpb25fbWVzc2FnZXMYASADKAsyLy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25NZXNzYWdlQggKBnJlc3VsdCLkAQobTm90aWZpY2F0aW9uTWVzc2FnZVJlc3BvbnNlElEKB3N1Y2Nlc3MYASABKAsyPi5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25NZXNzYWdlUmVzcG9uc2UuUmVzdWx0SAASPQoHZmFpbHVyZRgCIAEoDjIqLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkZhaWx1cmVNZXNzYWdlSAAaKQoGUmVzdWx0Eh8KF25vdGlmaWNhdGlvbl9tZXNzYWdlX2lkGAEgASgJQggKBnJlc3VsdCKSAgojQ3JlYXRlTm90aWZpY2F0aW9uTWVzc2FnZUpvYlJlcXVlc3QSSAoGc3RhdHVzGAEgASgOMjguZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uTWVzc2FnZUpvYlN0YXR1cxIrCgdzZW50X2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBITCgtjdXN0b21lcl9pZBgDIAEoCRIfChdub3RpZmljYXRpb25fbWVzc2FnZV9pZBgEIAEoCRIQCghwcmlvcml0eRgFIAMoCRIaCg1lcnJvcl9tZXNzYWdlGAYgASgJSACIAQFCEAoOX2Vycm9yX21lc3NhZ2UibgoiUmVhZE5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JzUmVxdWVzdBIoChtub3RpZmljYXRpb25fbWVzc2FnZV9qb2JfaWQYASABKAlIAIgBAUIeChxfbm90aWZpY2F0aW9uX21lc3NhZ2Vfam9iX2lkIu8BCiNVcGRhdGVOb3RpZmljYXRpb25NZXNzYWdlSm9iUmVxdWVzdBIjChtub3RpZmljYXRpb25fbWVzc2FnZV9qb2JfaWQYASABKAkSSAoGc3RhdHVzGAIgASgOMjguZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uTWVzc2FnZUpvYlN0YXR1cxIrCgdzZW50X2F0GAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIaCg1lcnJvcl9tZXNzYWdlGAQgASgJSACIAQFCEAoOX2Vycm9yX21lc3NhZ2UiSgojRGVsZXRlTm90aWZpY2F0aW9uTWVzc2FnZUpvYlJlcXVlc3QSIwobbm90aWZpY2F0aW9uX21lc3NhZ2Vfam9iX2lkGAEgASgJIvwECiNSZWFkTm90aWZpY2F0aW9uTWVzc2FnZUpvYnNSZXNwb25zZRJZCgdzdWNjZXNzGAEgASgLMkYuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JzUmVzcG9uc2UuUmVzdWx0SAASPQoHZmFpbHVyZRgCIAEoDjIqLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkZhaWx1cmVNZXNzYWdlSAAaqgIKFk5vdGlmaWNhdGlvbk1lc3NhZ2VKb2ISIwobbm90aWZpY2F0aW9uX21lc3NhZ2Vfam9iX2lkGAEgASgJEkgKBnN0YXR1cxgCIAEoDjI4LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JTdGF0dXMSKwoHc2VudF9hdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEwoLY3VzdG9tZXJfaWQYBCABKAkSHwoXbm90aWZpY2F0aW9uX21lc3NhZ2VfaWQYBSABKAkSEAoIcHJpb3JpdHkYBiADKAkSGgoNZXJyb3JfbWVzc2FnZRgHIAEoCUgAiAEBQhAKDl9lcnJvcl9tZXNzYWdlGoMBCgZSZXN1bHQSeQoZbm90aWZpY2F0aW9uX21lc3NhZ2Vfam9icxgBIAMoCzJWLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlJlYWROb3RpZmljYXRpb25NZXNzYWdlSm9ic1Jlc3BvbnNlLk5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JCCAoGcmVzdWx0Iu4BCh5Ob3RpZmljYXRpb25NZXNzYWdlSm9iUmVzcG9uc2USVAoHc3VjY2VzcxgBIAEoCzJBLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JSZXNwb25zZS5SZXN1bHRIABI9CgdmYWlsdXJlGAIgASgOMiouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuRmFpbHVyZU1lc3NhZ2VIABotCgZSZXN1bHQSIwobbm90aWZpY2F0aW9uX21lc3NhZ2Vfam9iX2lkGAEgASgJQggKBnJlc3VsdCLQAgoEVXNlchIcChRub3RpZmljYXRpb25fdXNlcl9pZBgBIAEoCRINCgVlbWFpbBgCIAEoCRIXCgpmaXJzdF9uYW1lGAMgASgJSACIAQESFgoJbGFzdF9uYW1lGAQgASgJSAGIAQESIwobbW9iaWxlX25vdGlmaWNhdGlvbl9lbmFibGVkGAUgASgIEiIKGmVtYWlsX25vdGlmaWNhdGlvbl9lbmFibGVkGAYgASgIEiAKGHNtc19ub3RpZmljYXRpb25fZW5hYmxlZBgHIAEoCBIuCgpjcmVhdGVkX2F0GAggASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIdChBpc19hcHBfaW5zdGFsbGVkGAkgASgISAKIAQFCDQoLX2ZpcnN0X25hbWVCDAoKX2xhc3RfbmFtZUITChFfaXNfYXBwX2luc3RhbGxlZCI2Ch9SZWFkTm90aWZpY2F0aW9uUHJvZHVjdHNSZXF1ZXN0EhMKC3Byb2R1Y3RfaWRzGAEgAygJKlkKGU5vdGlmaWNhdGlvbk1lc3NhZ2VTdGF0dXMSCQoFRFJBRlQQABILCgdQTEFOTkVEEAESDwoLSU5fUFJPR1JFU1MQAhIICgRTRU5UEAMSCQoFRVJST1IQBCrOAQocTm90aWZpY2F0aW9uTWVzc2FnZUpvYlN0YXR1cxIoCiROT1RJRklDQVRJT05fTUVTU0FHRV9KT0JfU1RBVFVTX1RPRE8QABIvCitOT1RJRklDQVRJT05fTUVTU0FHRV9KT0JfU1RBVFVTX0lOX1BST0dSRVNTEAESKAokTk9USUZJQ0FUSU9OX01FU1NBR0VfSk9CX1NUQVRVU19TRU5UEAISKQolTk9USUZJQ0FUSU9OX01FU1NBR0VfSk9CX1NUQVRVU19FUlJPUhADKrcOCg5GYWlsdXJlTWVzc2FnZRIbChdGQUlMVVJFX01FU1NBR0VfVU5LTk9XThAAEiUKIUZBSUxVUkVfTUVTU0FHRV9QUk9KRUNUX05PVF9GT1VORBABEjIKLkZBSUxVUkVfTUVTU0FHRV9OT1RJRklDQVRJT05fU0VUVElOR19OT1RfRk9VTkQQAhI2CjJGQUlMVVJFX01FU1NBR0VfQ1JFQVRFX05PVElGSUNBVElPTl9TRVRUSU5HX0ZBSUxFRBADEjYKMkZBSUxVUkVfTUVTU0FHRV9VUERBVEVfTk9USUZJQ0FUSU9OX1NFVFRJTkdfRkFJTEVEEAQSNgoyRkFJTFVSRV9NRVNTQUdFX0RFTEVURV9OT1RJRklDQVRJT05fU0VUVElOR19GQUlMRUQQBRIwCixGQUlMVVJFX01FU1NBR0VfTk9USUZJQ0FUSU9OX0dST1VQX05PVF9GT1VORBAGEjEKLUZBSUxVUkVfTUVTU0FHRV9OT1RJRklDQVRJT05fR1JPVVBTX05PVF9GT1VORBAHEjQKMEZBSUxVUkVfTUVTU0FHRV9DUkVBVEVfTk9USUZJQ0FUSU9OX0dST1VQX0ZBSUxFRBAIEjQKMEZBSUxVUkVfTUVTU0FHRV9VUERBVEVfTk9USUZJQ0FUSU9OX0dST1VQX0ZBSUxFRBAJEjQKMEZBSUxVUkVfTUVTU0FHRV9ERUxFVEVfTk9USUZJQ0FUSU9OX0dST1VQX0ZBSUxFRBAKEi8KK0ZBSUxVUkVfTUVTU0FHRV9OT1RJRklDQVRJT05fVVNFUl9OT1RfRk9VTkQQCxIwCixGQUlMVVJFX01FU1NBR0VfTk9USUZJQ0FUSU9OX1VTRVJTX05PVF9GT1VORBAMEjMKL0ZBSUxVUkVfTUVTU0FHRV9DUkVBVEVfTk9USUZJQ0FUSU9OX1VTRVJfRkFJTEVEEA0SMwovRkFJTFVSRV9NRVNTQUdFX1VQREFURV9OT1RJRklDQVRJT05fVVNFUl9GQUlMRUQQDhIzCi9GQUlMVVJFX01FU1NBR0VfREVMRVRFX05PVElGSUNBVElPTl9VU0VSX0ZBSUxFRBAPEjUKMUZBSUxVUkVfTUVTU0FHRV9OT1RJRklDQVRJT05fR1JPVVBfVVNFUl9OT1RfRk9VTkQQEBI5CjVGQUlMVVJFX01FU1NBR0VfQ1JFQVRFX05PVElGSUNBVElPTl9HUk9VUF9VU0VSX0ZBSUxFRBAREjkKNUZBSUxVUkVfTUVTU0FHRV9VUERBVEVfTk9USUZJQ0FUSU9OX0dST1VQX1VTRVJfRkFJTEVEEBISOQo1RkFJTFVSRV9NRVNTQUdFX0RFTEVURV9OT1RJRklDQVRJT05fR1JPVVBfVVNFUl9GQUlMRUQQExIyCi5GQUlMVVJFX01FU1NBR0VfTk9USUZJQ0FUSU9OX01FU1NBR0VfTk9UX0ZPVU5EEBQSMwovRkFJTFVSRV9NRVNTQUdFX05PVElGSUNBVElPTl9NRVNTQUdFU19OT1RfRk9VTkQQFRI2CjJGQUlMVVJFX01FU1NBR0VfQ1JFQVRFX05PVElGSUNBVElPTl9NRVNTQUdFX0ZBSUxFRBAWEjYKMkZBSUxVUkVfTUVTU0FHRV9VUERBVEVfTk9USUZJQ0FUSU9OX01FU1NBR0VfRkFJTEVEEBcSNgoyRkFJTFVSRV9NRVNTQUdFX0RFTEVURV9OT1RJRklDQVRJT05fTUVTU0FHRV9GQUlMRUQQGBI2CjJGQUlMVVJFX01FU1NBR0VfTk9USUZJQ0FUSU9OX01FU1NBR0VfSk9CX05PVF9GT1VORBAZEjcKM0ZBSUxVUkVfTUVTU0FHRV9OT1RJRklDQVRJT05fTUVTU0FHRV9KT0JTX05PVF9GT1VORBAaEjoKNkZBSUxVUkVfTUVTU0FHRV9DUkVBVEVfTk9USUZJQ0FUSU9OX01FU1NBR0VfSk9CX0ZBSUxFRBAbEjoKNkZBSUxVUkVfTUVTU0FHRV9VUERBVEVfTk9USUZJQ0FUSU9OX01FU1NBR0VfSk9CX0ZBSUxFRBAcEjoKNkZBSUxVUkVfTUVTU0FHRV9ERUxFVEVfTk9USUZJQ0FUSU9OX01FU1NBR0VfSk9CX0ZBSUxFRBAdEjYKMkZBSUxVUkVfTUVTU0FHRV9OT1RJRklDQVRJT05fU0VUVElOR19BTFJFQURZX0VYSVNUEB4SOwo3RkFJTFVSRV9NRVNTQUdFX05PVElGSUNBVElPTl9TRVRUSU5HX1NMVUdfQUxSRUFEWV9UQUtFThAfEjMKL0ZBSUxVUkVfTUVTU0FHRV9OT1RJRklDQVRJT05fVVNFUl9BTFJFQURZX0VYSVNUECASNAowRkFJTFVSRV9NRVNTQUdFX05PVElGSUNBVElPTl9HUk9VUF9BTFJFQURZX0VYSVNUECEyuyIKFE5vdGlmaWNhdGlvbnNTZXJ2aWNlEpIBChlDcmVhdGVOb3RpZmljYXRpb25TZXR0aW5nEjwuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuQ3JlYXRlTm90aWZpY2F0aW9uU2V0dGluZ1JlcXVlc3QaNy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25TZXR0aW5nUmVzcG9uc2USkgEKF1JlYWROb3RpZmljYXRpb25TZXR0aW5nEjouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvblNldHRpbmdSZXF1ZXN0GjsuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvblNldHRpbmdSZXNwb25zZRKSAQoZVXBkYXRlTm90aWZpY2F0aW9uU2V0dGluZxI8LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlVwZGF0ZU5vdGlmaWNhdGlvblNldHRpbmdSZXF1ZXN0GjcuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uU2V0dGluZ1Jlc3BvbnNlEpIBChlEZWxldGVOb3RpZmljYXRpb25TZXR0aW5nEjwuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuRGVsZXRlTm90aWZpY2F0aW9uU2V0dGluZ1JlcXVlc3QaNy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25TZXR0aW5nUmVzcG9uc2USjAEKF0NyZWF0ZU5vdGlmaWNhdGlvbkdyb3VwEjouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuQ3JlYXRlTm90aWZpY2F0aW9uR3JvdXBSZXF1ZXN0GjUuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uR3JvdXBSZXNwb25zZRKPAQoWUmVhZE5vdGlmaWNhdGlvbkdyb3VwcxI5LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlJlYWROb3RpZmljYXRpb25Hcm91cHNSZXF1ZXN0GjouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvbkdyb3Vwc1Jlc3BvbnNlEowBChdVcGRhdGVOb3RpZmljYXRpb25Hcm91cBI6LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlVwZGF0ZU5vdGlmaWNhdGlvbkdyb3VwUmVxdWVzdBo1LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbkdyb3VwUmVzcG9uc2USjAEKF0RlbGV0ZU5vdGlmaWNhdGlvbkdyb3VwEjouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuRGVsZXRlTm90aWZpY2F0aW9uR3JvdXBSZXF1ZXN0GjUuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uR3JvdXBSZXNwb25zZRKJAQoWQ3JlYXRlTm90aWZpY2F0aW9uVXNlchI5LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkNyZWF0ZU5vdGlmaWNhdGlvblVzZXJSZXF1ZXN0GjQuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uVXNlclJlc3BvbnNlEowBChVSZWFkTm90aWZpY2F0aW9uVXNlcnMSOC5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5SZWFkTm90aWZpY2F0aW9uVXNlcnNSZXF1ZXN0GjkuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvblVzZXJzUmVzcG9uc2USiQEKFlVwZGF0ZU5vdGlmaWNhdGlvblVzZXISOS5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5VcGRhdGVOb3RpZmljYXRpb25Vc2VyUmVxdWVzdBo0LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvblVzZXJSZXNwb25zZRKJAQoWRGVsZXRlTm90aWZpY2F0aW9uVXNlchI5LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkRlbGV0ZU5vdGlmaWNhdGlvblVzZXJSZXF1ZXN0GjQuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uVXNlclJlc3BvbnNlEpgBChtDcmVhdGVOb3RpZmljYXRpb25Hcm91cFVzZXISPi5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5DcmVhdGVOb3RpZmljYXRpb25Hcm91cFVzZXJSZXF1ZXN0GjkuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uR3JvdXBVc2VyUmVzcG9uc2USnAEKGlJlYWROb3RpZmljYXRpb25Hcm91cFVzZXJzEj4uZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvbkdyb3VwVXNlcnNSZXF1ZXN0cxo+LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlJlYWROb3RpZmljYXRpb25Hcm91cFVzZXJzUmVzcG9uc2USmAEKG1VwZGF0ZU5vdGlmaWNhdGlvbkdyb3VwVXNlchI+LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlVwZGF0ZU5vdGlmaWNhdGlvbkdyb3VwVXNlclJlcXVlc3QaOS5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25Hcm91cFVzZXJSZXNwb25zZRKYAQobRGVsZXRlTm90aWZpY2F0aW9uR3JvdXBVc2VyEj4uZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuRGVsZXRlTm90aWZpY2F0aW9uR3JvdXBVc2VyUmVxdWVzdBo5LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbkdyb3VwVXNlclJlc3BvbnNlEpIBChlDcmVhdGVOb3RpZmljYXRpb25NZXNzYWdlEjwuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuQ3JlYXRlTm90aWZpY2F0aW9uTWVzc2FnZVJlcXVlc3QaNy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25NZXNzYWdlUmVzcG9uc2USlQEKGFJlYWROb3RpZmljYXRpb25NZXNzYWdlcxI7LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlJlYWROb3RpZmljYXRpb25NZXNzYWdlc1JlcXVlc3QaPC5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5SZWFkTm90aWZpY2F0aW9uTWVzc2FnZXNSZXNwb25zZRKeAQobR2V0U2VudE5vdGlmaWNhdGlvbk1lc3NhZ2VzEj4uZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuR2V0U2VudE5vdGlmaWNhdGlvbk1lc3NhZ2VzUmVxdWVzdBo/LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkdldFNlbnROb3RpZmljYXRpb25NZXNzYWdlc1Jlc3BvbnNlEpIBChlVcGRhdGVOb3RpZmljYXRpb25NZXNzYWdlEjwuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuVXBkYXRlTm90aWZpY2F0aW9uTWVzc2FnZVJlcXVlc3QaNy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5Ob3RpZmljYXRpb25NZXNzYWdlUmVzcG9uc2USkgEKGURlbGV0ZU5vdGlmaWNhdGlvbk1lc3NhZ2USPC5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5EZWxldGVOb3RpZmljYXRpb25NZXNzYWdlUmVxdWVzdBo3LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbk1lc3NhZ2VSZXNwb25zZRKbAQocQ3JlYXRlTm90aWZpY2F0aW9uTWVzc2FnZUpvYhI/LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkNyZWF0ZU5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JSZXF1ZXN0GjouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uTWVzc2FnZUpvYlJlc3BvbnNlEp4BChtSZWFkTm90aWZpY2F0aW9uTWVzc2FnZUpvYnMSPi5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5SZWFkTm90aWZpY2F0aW9uTWVzc2FnZUpvYnNSZXF1ZXN0Gj8uZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuUmVhZE5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JzUmVzcG9uc2USmwEKHFVwZGF0ZU5vdGlmaWNhdGlvbk1lc3NhZ2VKb2ISPy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5VcGRhdGVOb3RpZmljYXRpb25NZXNzYWdlSm9iUmVxdWVzdBo6LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLk5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JSZXNwb25zZRKbAQocRGVsZXRlTm90aWZpY2F0aW9uTWVzc2FnZUpvYhI/LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkRlbGV0ZU5vdGlmaWNhdGlvbk1lc3NhZ2VKb2JSZXF1ZXN0GjouZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuTm90aWZpY2F0aW9uTWVzc2FnZUpvYlJlc3BvbnNlEoUBChhSZWFkTm90aWZpY2F0aW9uUHJvZHVjdHMSOy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5SZWFkTm90aWZpY2F0aW9uUHJvZHVjdHNSZXF1ZXN0GiwuZGFzaGJvYXJkLnByb2R1Y3QudjEuU2VhcmNoUHJvZHVjdHNSZXNwb25zZRKeAQobR2V0Tm90aWZpY2F0aW9uVXNlclNldHRpbmdzEj4uZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuR2V0Tm90aWZpY2F0aW9uVXNlclNldHRpbmdzUmVxdWVzdBo/LmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLkdldE5vdGlmaWNhdGlvblVzZXJTZXR0aW5nc1Jlc3BvbnNlEnoKD1ZlcmlmeVVzZXJFbWFpbBIyLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlZlcmlmeVVzZXJFbWFpbFJlcXVlc3QaMy5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5WZXJpZnlVc2VyRW1haWxSZXNwb25zZRJ0Cg1HZXRVc2VyR3JvdXBzEjAuZGFzaGJvYXJkLm5vdGlmaWNhdGlvbnMudjEuR2V0VXNlckdyb3Vwc1JlcXVlc3QaMS5kYXNoYm9hcmQubm90aWZpY2F0aW9ucy52MS5HZXRVc2VyR3JvdXBzUmVzcG9uc2USXwoQVXBkYXRlVXNlckdyb3VwcxIzLmRhc2hib2FyZC5ub3RpZmljYXRpb25zLnYxLlVwZGF0ZVVzZXJHcm91cHNSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5YgZwcm90bzM", [import_wkt5.file_google_protobuf_timestamp, import_wkt5.file_google_protobuf_empty, file_dashboard_v1_product, file_common_v1_push_notifications]);
2282
+ var FailureMessage = /* @__PURE__ */ ((FailureMessage2) => {
2283
+ FailureMessage2[FailureMessage2["UNKNOWN"] = 0] = "UNKNOWN";
2284
+ FailureMessage2[FailureMessage2["PROJECT_NOT_FOUND"] = 1] = "PROJECT_NOT_FOUND";
2285
+ FailureMessage2[FailureMessage2["NOTIFICATION_SETTING_NOT_FOUND"] = 2] = "NOTIFICATION_SETTING_NOT_FOUND";
2286
+ FailureMessage2[FailureMessage2["CREATE_NOTIFICATION_SETTING_FAILED"] = 3] = "CREATE_NOTIFICATION_SETTING_FAILED";
2287
+ FailureMessage2[FailureMessage2["UPDATE_NOTIFICATION_SETTING_FAILED"] = 4] = "UPDATE_NOTIFICATION_SETTING_FAILED";
2288
+ FailureMessage2[FailureMessage2["DELETE_NOTIFICATION_SETTING_FAILED"] = 5] = "DELETE_NOTIFICATION_SETTING_FAILED";
2289
+ FailureMessage2[FailureMessage2["NOTIFICATION_GROUP_NOT_FOUND"] = 6] = "NOTIFICATION_GROUP_NOT_FOUND";
2290
+ FailureMessage2[FailureMessage2["NOTIFICATION_GROUPS_NOT_FOUND"] = 7] = "NOTIFICATION_GROUPS_NOT_FOUND";
2291
+ FailureMessage2[FailureMessage2["CREATE_NOTIFICATION_GROUP_FAILED"] = 8] = "CREATE_NOTIFICATION_GROUP_FAILED";
2292
+ FailureMessage2[FailureMessage2["UPDATE_NOTIFICATION_GROUP_FAILED"] = 9] = "UPDATE_NOTIFICATION_GROUP_FAILED";
2293
+ FailureMessage2[FailureMessage2["DELETE_NOTIFICATION_GROUP_FAILED"] = 10] = "DELETE_NOTIFICATION_GROUP_FAILED";
2294
+ FailureMessage2[FailureMessage2["NOTIFICATION_USER_NOT_FOUND"] = 11] = "NOTIFICATION_USER_NOT_FOUND";
2295
+ FailureMessage2[FailureMessage2["NOTIFICATION_USERS_NOT_FOUND"] = 12] = "NOTIFICATION_USERS_NOT_FOUND";
2296
+ FailureMessage2[FailureMessage2["CREATE_NOTIFICATION_USER_FAILED"] = 13] = "CREATE_NOTIFICATION_USER_FAILED";
2297
+ FailureMessage2[FailureMessage2["UPDATE_NOTIFICATION_USER_FAILED"] = 14] = "UPDATE_NOTIFICATION_USER_FAILED";
2298
+ FailureMessage2[FailureMessage2["DELETE_NOTIFICATION_USER_FAILED"] = 15] = "DELETE_NOTIFICATION_USER_FAILED";
2299
+ FailureMessage2[FailureMessage2["NOTIFICATION_GROUP_USER_NOT_FOUND"] = 16] = "NOTIFICATION_GROUP_USER_NOT_FOUND";
2300
+ FailureMessage2[FailureMessage2["CREATE_NOTIFICATION_GROUP_USER_FAILED"] = 17] = "CREATE_NOTIFICATION_GROUP_USER_FAILED";
2301
+ FailureMessage2[FailureMessage2["UPDATE_NOTIFICATION_GROUP_USER_FAILED"] = 18] = "UPDATE_NOTIFICATION_GROUP_USER_FAILED";
2302
+ FailureMessage2[FailureMessage2["DELETE_NOTIFICATION_GROUP_USER_FAILED"] = 19] = "DELETE_NOTIFICATION_GROUP_USER_FAILED";
2303
+ FailureMessage2[FailureMessage2["NOTIFICATION_MESSAGE_NOT_FOUND"] = 20] = "NOTIFICATION_MESSAGE_NOT_FOUND";
2304
+ FailureMessage2[FailureMessage2["NOTIFICATION_MESSAGES_NOT_FOUND"] = 21] = "NOTIFICATION_MESSAGES_NOT_FOUND";
2305
+ FailureMessage2[FailureMessage2["CREATE_NOTIFICATION_MESSAGE_FAILED"] = 22] = "CREATE_NOTIFICATION_MESSAGE_FAILED";
2306
+ FailureMessage2[FailureMessage2["UPDATE_NOTIFICATION_MESSAGE_FAILED"] = 23] = "UPDATE_NOTIFICATION_MESSAGE_FAILED";
2307
+ FailureMessage2[FailureMessage2["DELETE_NOTIFICATION_MESSAGE_FAILED"] = 24] = "DELETE_NOTIFICATION_MESSAGE_FAILED";
2308
+ FailureMessage2[FailureMessage2["NOTIFICATION_MESSAGE_JOB_NOT_FOUND"] = 25] = "NOTIFICATION_MESSAGE_JOB_NOT_FOUND";
2309
+ FailureMessage2[FailureMessage2["NOTIFICATION_MESSAGE_JOBS_NOT_FOUND"] = 26] = "NOTIFICATION_MESSAGE_JOBS_NOT_FOUND";
2310
+ FailureMessage2[FailureMessage2["CREATE_NOTIFICATION_MESSAGE_JOB_FAILED"] = 27] = "CREATE_NOTIFICATION_MESSAGE_JOB_FAILED";
2311
+ FailureMessage2[FailureMessage2["UPDATE_NOTIFICATION_MESSAGE_JOB_FAILED"] = 28] = "UPDATE_NOTIFICATION_MESSAGE_JOB_FAILED";
2312
+ FailureMessage2[FailureMessage2["DELETE_NOTIFICATION_MESSAGE_JOB_FAILED"] = 29] = "DELETE_NOTIFICATION_MESSAGE_JOB_FAILED";
2313
+ FailureMessage2[FailureMessage2["NOTIFICATION_SETTING_ALREADY_EXIST"] = 30] = "NOTIFICATION_SETTING_ALREADY_EXIST";
2314
+ FailureMessage2[FailureMessage2["NOTIFICATION_SETTING_SLUG_ALREADY_TAKEN"] = 31] = "NOTIFICATION_SETTING_SLUG_ALREADY_TAKEN";
2315
+ FailureMessage2[FailureMessage2["NOTIFICATION_USER_ALREADY_EXIST"] = 32] = "NOTIFICATION_USER_ALREADY_EXIST";
2316
+ FailureMessage2[FailureMessage2["NOTIFICATION_GROUP_ALREADY_EXIST"] = 33] = "NOTIFICATION_GROUP_ALREADY_EXIST";
2317
+ return FailureMessage2;
2318
+ })(FailureMessage || {});
2319
+ var NotificationsService = /* @__PURE__ */ (0, import_codegenv27.serviceDesc)(file_dashboard_v1_notifications, 0);
2320
+
2321
+ // src/gen/proto/dashboard/v1/notifications-NotificationsService_connectquery.ts
2322
+ var createNotificationSetting = NotificationsService.method.createNotificationSetting;
2323
+ var readNotificationSetting = NotificationsService.method.readNotificationSetting;
2324
+ var updateNotificationSetting = NotificationsService.method.updateNotificationSetting;
2325
+ var deleteNotificationSetting = NotificationsService.method.deleteNotificationSetting;
2326
+ var createNotificationGroup = NotificationsService.method.createNotificationGroup;
2327
+ var readNotificationGroups = NotificationsService.method.readNotificationGroups;
2328
+ var updateNotificationGroup = NotificationsService.method.updateNotificationGroup;
2329
+ var deleteNotificationGroup = NotificationsService.method.deleteNotificationGroup;
2330
+ var createNotificationUser = NotificationsService.method.createNotificationUser;
2331
+ var readNotificationUsers = NotificationsService.method.readNotificationUsers;
2332
+ var updateNotificationUser = NotificationsService.method.updateNotificationUser;
2333
+ var deleteNotificationUser = NotificationsService.method.deleteNotificationUser;
2334
+ var createNotificationGroupUser = NotificationsService.method.createNotificationGroupUser;
2335
+ var readNotificationGroupUsers = NotificationsService.method.readNotificationGroupUsers;
2336
+ var updateNotificationGroupUser = NotificationsService.method.updateNotificationGroupUser;
2337
+ var deleteNotificationGroupUser = NotificationsService.method.deleteNotificationGroupUser;
2338
+ var createNotificationMessage = NotificationsService.method.createNotificationMessage;
2339
+ var readNotificationMessages = NotificationsService.method.readNotificationMessages;
2340
+ var getSentNotificationMessages = NotificationsService.method.getSentNotificationMessages;
2341
+ var updateNotificationMessage = NotificationsService.method.updateNotificationMessage;
2342
+ var deleteNotificationMessage = NotificationsService.method.deleteNotificationMessage;
2343
+ var createNotificationMessageJob = NotificationsService.method.createNotificationMessageJob;
2344
+ var readNotificationMessageJobs = NotificationsService.method.readNotificationMessageJobs;
2345
+ var updateNotificationMessageJob = NotificationsService.method.updateNotificationMessageJob;
2346
+ var deleteNotificationMessageJob = NotificationsService.method.deleteNotificationMessageJob;
2347
+ var readNotificationProducts = NotificationsService.method.readNotificationProducts;
2348
+ var getNotificationUserSettings = NotificationsService.method.getNotificationUserSettings;
2349
+ var verifyUserEmail = NotificationsService.method.verifyUserEmail;
2350
+ var getUserGroups = NotificationsService.method.getUserGroups;
2351
+ var updateUserGroups = NotificationsService.method.updateUserGroups;
2352
+
2353
+ // src/rpc-provider.tsx
2354
+ var import_jsx_runtime11 = require("react/jsx-runtime");
2355
+ console.log("HOST", HOST);
2356
+ var currentFinalTransportHost;
2357
+ var finalTransport;
2358
+ BigInt.prototype.toJSON = function() {
2359
+ return this.toString();
2360
+ };
2361
+ var rpcProvider = {
2362
+ publicApi: public_api_PublicApiService_connectquery_exports,
2363
+ notifications: notifications_NotificationsService_connectquery_exports
2364
+ };
2365
+ var useQuery4 = import_connect_query.useQuery;
2366
+ var useMutation3 = import_connect_query.useMutation;
2367
+ var RpcProvider = ({ children }) => {
2368
+ if (finalTransport == null || currentFinalTransportHost !== HOST) {
2369
+ currentFinalTransportHost = HOST;
2370
+ finalTransport = (0, import_connect_web2.createConnectTransport)({
2371
+ baseUrl: HOST + "/api/rpc",
2372
+ useBinaryFormat: true,
2373
+ // @ts-ignore
2374
+ fetch: async (input, init) => {
2375
+ return fetch(input, {
2376
+ ...init,
2377
+ keepalive: false,
2378
+ credentials: "include"
2379
+ });
2380
+ }
2381
+ });
2382
+ }
2383
+ const [queryClient] = (0, import_react9.useState)(
2384
+ () => new import_react_query5.QueryClient({
2385
+ defaultOptions: { queries: { staleTime: 5e3 } }
2386
+ })
2387
+ );
2388
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_connect_query.TransportProvider, { transport: finalTransport, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_query5.QueryClientProvider, { client: queryClient, children }) });
2389
+ };
2390
+
2391
+ // src/components/notifications/NotificationsComponentPublic.tsx
2392
+ var import_react_query6 = require("@tanstack/react-query");
2393
+ var import_lucide_react11 = require("lucide-react");
2394
+
2395
+ // src/components/notifications/constants.tsx
2396
+ var import_jsx_runtime12 = require("react/jsx-runtime");
2397
+ var DEFAULT_TEXTS = {
2398
+ title: null,
2399
+ description: null,
2400
+ managingDescription: "Zarz\u0105dzaj rodzajami powiadomie\u0144 i sposobem dostarczania.",
2401
+ formTitle: "Podaj Email aby zapisa\u0107 si\u0119\xA0do powiadomie\u0144",
2402
+ formEmailLabel: "Email",
2403
+ formPhoneLabel: "Numer telefonu",
2404
+ formPhoneOptional: "(opcjonalnie)",
2405
+ formEmailPlaceholder: "np. mail@gmail...",
2406
+ formPhonePlaceholder: "np. 663...",
2407
+ formSubmitButton: "Zapisz si\u0119",
2408
+ formSuccessMessage: "Zapisa\u0142e\u015B si\u0119 do powiadomie\u0144.",
2409
+ agreementText: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
2410
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { style: { color: "red" }, children: "*" }),
2411
+ "Wyra\u017Cam zgod\u0119 na przetwarzanie moich danych w celach marketingowych zgodnie z",
2412
+ " ",
2413
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2414
+ "a",
2415
+ {
2416
+ href: "/regulations/polityka-prywatnosci",
2417
+ target: "_blank",
2418
+ className: "cursor-alias font-bold hover:font-medium",
2419
+ children: "regulaminem"
2420
+ }
2421
+ ),
2422
+ " ",
2423
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "text-xs font-light", children: "(zgod\u0119 mo\u017Cna w ka\u017Cdej chwili wycofa\u0107)" })
2424
+ ] }),
2425
+ qrCodeTitle: "lub zainstaluj aplikacj\u0119 mobiln\u0105",
2426
+ qrCodeSubtitle: "Aplikacja mobilna",
2427
+ qrCodeScanText: "zeskanuj kod QR",
2428
+ groupsNoSelectionWarning: "Je\u015Bli \u017Cadna z grup nie jest zaznaczona, nie otrzymasz \u017Cadnych powiadomie\u0144.",
2429
+ groupsSelectAllButton: "Zaznacz wszystkie",
2430
+ groupsUpdateButton: "Aktualizuj",
2431
+ groupsUpdateSuccess: "Zaktualizowano pomy\u015Blnie.",
2432
+ groupsTitle: "Zarz\u0105dzaj grupami z kt\xF3rych chcesz otrzymywa\u0107 powiadomienia",
2433
+ manageDataTitle: "Ustawienia powiadomie\u0144",
2434
+ manageDataDescription: "W jaki spos\xF3b chcesz otrzymywa\u0107 powiadomienia?",
2435
+ manageDataUnsubscribeButton: "Odsubskrybuj",
2436
+ manageDataUpdatedMessage: "Zaktualizowano",
2437
+ manageDataUnsubscribeDescription: "Wypisz mnie z wszystkich powiadomie\u0144 i grup.",
2438
+ loginEmailLabel: "Email",
2439
+ loginEmailPlaceholder: "Wprowad\u017A sw\xF3j email",
2440
+ loginSendCodeButton: "Wy\u015Blij kod weryfikacyjny",
2441
+ loginSendingButton: "Wysy\u0142anie...",
2442
+ loginCodeLabel: "Wprowad\u017A kod weryfikacyjny",
2443
+ loginCodeSentMessage: "Wys\u0142ali\u015Bmy kod weryfikacyjny na adres",
2444
+ loginChangeEmailButton: "Popraw email",
2445
+ loginResendCodeButton: "Wy\u015Blij kod ponownie",
2446
+ loginInvalidEmailError: "Wprowad\u017A prawid\u0142owy adres email",
2447
+ loginSlugRequiredError: "Wymagany jest identyfikator projektu",
2448
+ loginInvalidCodeError: "Nieprawid\u0142owy kod weryfikacyjny",
2449
+ loginVerificationFailedError: "Weryfikacja nie powiod\u0142a si\u0119. Sprawd\u017A sw\xF3j kod.",
2450
+ loginSendEmailError: "Nie uda\u0142o si\u0119 wys\u0142a\u0107 kodu weryfikacyjnego",
2451
+ loginVerifyCodeError: "Nie uda\u0142o si\u0119 zweryfikowa\u0107 kodu",
2452
+ loginResendEmailError: "Nie uda\u0142o si\u0119 ponownie wys\u0142a\u0107 kodu weryfikacyjnego",
2453
+ loginTitle: "Wpisz email aby zarz\u0105dza\u0107 powiadomieniami",
2454
+ loginDescription: "Dostaniesz kod weryfikacyjny na email.",
2455
+ loginIHaveCode: "Mam ju\u017C kod"
2456
+ };
2457
+
2458
+ // src/ui/button.tsx
2459
+ var import_react_slot = require("@radix-ui/react-slot");
2460
+ var import_class_variance_authority = require("class-variance-authority");
2461
+ var import_jsx_runtime13 = require("react/jsx-runtime");
2462
+ var buttonVariants = (0, import_class_variance_authority.cva)(
2463
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
2464
+ {
2465
+ variants: {
2466
+ variant: {
2467
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
2468
+ destructive: "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
2469
+ outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
2470
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
2471
+ ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
2472
+ link: "text-primary underline-offset-4 hover:underline"
2473
+ },
2474
+ size: {
2475
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
2476
+ sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
2477
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
2478
+ icon: "size-9",
2479
+ "icon-sm": "size-8",
2480
+ "icon-lg": "size-10"
2481
+ }
2482
+ },
2483
+ defaultVariants: {
2484
+ variant: "default",
2485
+ size: "default"
2486
+ }
2487
+ }
2488
+ );
2489
+ function Button({
2490
+ className,
2491
+ variant,
2492
+ size,
2493
+ asChild = false,
2494
+ ...props
2495
+ }) {
2496
+ const Comp = asChild ? import_react_slot.Slot : "button";
2497
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
2498
+ Comp,
2499
+ {
2500
+ "data-slot": "button",
2501
+ className: cn(buttonVariants({ variant, size, className })),
2502
+ ...props
2503
+ }
2504
+ );
2505
+ }
2506
+
2507
+ // src/components/notifications/NotificationHeader.tsx
2508
+ var import_lucide_react2 = require("lucide-react");
2509
+ var import_jsx_runtime14 = require("react/jsx-runtime");
2510
+ function NotificationHeader({
2511
+ projectName,
2512
+ projectLogo,
2513
+ projectLogoDark,
2514
+ description,
2515
+ className,
2516
+ onLogout
2517
+ }) {
2518
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
2519
+ projectLogo != null || projectName != null && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
2520
+ "h2",
2521
+ {
2522
+ className: cn(
2523
+ "flex max-w-44 items-center gap-3 text-lg font-medium text-black sm:max-w-none md:text-xl lg:text-2xl xl:text-3xl dark:text-neutral-100",
2524
+ className == null ? void 0 : className.headerTitle
2525
+ ),
2526
+ children: [
2527
+ projectLogo != null && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
2528
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
2529
+ "img",
2530
+ {
2531
+ src: projectLogo,
2532
+ alt: "",
2533
+ className: cn(
2534
+ "h-12 w-auto dark:hidden",
2535
+ className == null ? void 0 : className.headerLogo
2536
+ )
2537
+ }
2538
+ ),
2539
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
2540
+ "img",
2541
+ {
2542
+ src: projectLogoDark != null ? projectLogoDark : projectLogo,
2543
+ alt: "",
2544
+ className: cn(
2545
+ "hidden h-12 w-auto dark:inline",
2546
+ className == null ? void 0 : className.headerLogo
2547
+ )
2548
+ }
2549
+ )
2550
+ ] }),
2551
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { children: projectName })
2552
+ ]
2553
+ }
2554
+ ),
2555
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center gap-2", children: [
2556
+ description && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
2557
+ "p",
2558
+ {
2559
+ className: cn(
2560
+ "mt-4 font-medium text-left",
2561
+ className == null ? void 0 : className.headerDescription
2562
+ ),
2563
+ children: description
2564
+ }
2565
+ ),
2566
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "grow" }),
2567
+ onLogout && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Button, { variant: "ghost", size: "icon-sm", onClick: onLogout, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_lucide_react2.LogOutIcon, { className: "h-5 w-5" }) })
2568
+ ] })
2569
+ ] });
2570
+ }
2571
+
2572
+ // src/ui/switch.tsx
2573
+ var SwitchPrimitive = __toESM(require("@radix-ui/react-switch"));
2574
+ var import_jsx_runtime15 = require("react/jsx-runtime");
2575
+ function Switch({
2576
+ className,
2577
+ ...props
2578
+ }) {
2579
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
2580
+ SwitchPrimitive.Root,
2581
+ {
2582
+ "data-slot": "switch",
2583
+ className: cn(
2584
+ "peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",
2585
+ className
2586
+ ),
2587
+ ...props,
2588
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
2589
+ SwitchPrimitive.Thumb,
2590
+ {
2591
+ "data-slot": "switch-thumb",
2592
+ className: cn(
2593
+ "bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0"
2594
+ )
2595
+ }
2596
+ )
2597
+ }
2598
+ );
2599
+ }
2600
+
2601
+ // src/components/notifications/NotificationGroupsList.tsx
2602
+ var import_react10 = require("@formkit/auto-animate/react");
2603
+ var import_lucide_react4 = require("lucide-react");
2604
+
2605
+ // src/ui/popover.tsx
2606
+ var PopoverPrimitive = __toESM(require("@radix-ui/react-popover"));
2607
+ var import_jsx_runtime16 = require("react/jsx-runtime");
2608
+ function Popover({
2609
+ ...props
2610
+ }) {
2611
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
2612
+ }
2613
+ function PopoverTrigger({
2614
+ ...props
2615
+ }) {
2616
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props });
2617
+ }
2618
+ function PopoverContent({
2619
+ className,
2620
+ align = "center",
2621
+ sideOffset = 4,
2622
+ ...props
2623
+ }) {
2624
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(PopoverPrimitive.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
2625
+ PopoverPrimitive.Content,
2626
+ {
2627
+ "data-slot": "popover-content",
2628
+ align,
2629
+ sideOffset,
2630
+ className: cn(
2631
+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden",
2632
+ className
2633
+ ),
2634
+ ...props
2635
+ }
2636
+ ) });
2637
+ }
2638
+
2639
+ // src/components/notifications/HowOftenComponent.tsx
2640
+ var import_lucide_react3 = require("lucide-react");
2641
+ var import_jsx_runtime17 = require("react/jsx-runtime");
2642
+ function HowOftenComponent({ regularity }) {
2643
+ let text = "";
2644
+ switch (regularity) {
2645
+ case "rarely":
2646
+ text = "rzadko";
2647
+ break;
2648
+ case "often":
2649
+ text = "cz\u0119sto";
2650
+ break;
2651
+ case "very_often":
2652
+ text = "codzienne";
2653
+ break;
2654
+ }
2655
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(Popover, { children: [
2656
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
2657
+ PopoverTrigger,
2658
+ {
2659
+ onClick: (e) => {
2660
+ e.stopPropagation();
2661
+ },
2662
+ children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
2663
+ "button",
2664
+ {
2665
+ type: "button",
2666
+ className: "flex w-[30%] cursor-help flex-col items-center justify-center text-xs md:w-[25%] xl:w-[20%]",
2667
+ children: [
2668
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_lucide_react3.ClockIcon, { size: 12 }),
2669
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: text })
2670
+ ]
2671
+ }
2672
+ )
2673
+ }
2674
+ ),
2675
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(PopoverContent, { className: "w-80", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "grid gap-4", children: [
2676
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "space-y-2", children: [
2677
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h4", { className: "leading-none font-medium", children: "Co to oznacza?" }),
2678
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("ul", { className: "list-inside list-disc text-sm", children: [
2679
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("li", { children: [
2680
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "font-semibold", children: "Rzadko" }),
2681
+ " \u2013 powiadomienia b\u0119d\u0105 wysy\u0142ane maksymalnie kilka razy w miesi\u0105cu."
2682
+ ] }),
2683
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("li", { children: [
2684
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "font-semibold", children: "Cz\u0119sto" }),
2685
+ " \u2013 powiadomienia mog\u0119 by\u0107 wysy\u0142ane kilka razy w tygodniu."
2686
+ ] }),
2687
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("li", { children: [
2688
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "font-semibold", children: "Codzienne" }),
2689
+ " \u2013 powiadomienia b\u0119d\u0105 wysy\u0142ane nawet codziennie."
2690
+ ] })
2691
+ ] })
2692
+ ] }),
2693
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "grid gap-2" })
2694
+ ] }) })
2695
+ ] });
2696
+ }
2697
+
2698
+ // src/ui/card.tsx
2699
+ var import_jsx_runtime18 = require("react/jsx-runtime");
2700
+ function Card({ className, ...props }) {
2701
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2702
+ "div",
2703
+ {
2704
+ "data-slot": "card",
2705
+ className: cn(
2706
+ "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",
2707
+ className
2708
+ ),
2709
+ ...props
2710
+ }
2711
+ );
2712
+ }
2713
+ function CardHeader({ className, ...props }) {
2714
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2715
+ "div",
2716
+ {
2717
+ "data-slot": "card-header",
2718
+ className: cn(
2719
+ "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
2720
+ className
2721
+ ),
2722
+ ...props
2723
+ }
2724
+ );
2725
+ }
2726
+ function CardTitle({ className, ...props }) {
2727
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2728
+ "div",
2729
+ {
2730
+ "data-slot": "card-title",
2731
+ className: cn("leading-none font-semibold", className),
2732
+ ...props
2733
+ }
2734
+ );
2735
+ }
2736
+ function CardDescription({ className, ...props }) {
2737
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2738
+ "div",
2739
+ {
2740
+ "data-slot": "card-description",
2741
+ className: cn("text-muted-foreground text-sm", className),
2742
+ ...props
2743
+ }
2744
+ );
2745
+ }
2746
+ function CardContent({ className, ...props }) {
2747
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2748
+ "div",
2749
+ {
2750
+ "data-slot": "card-content",
2751
+ className: cn("px-6", className),
2752
+ ...props
2753
+ }
2754
+ );
2755
+ }
2756
+
2757
+ // src/components/notifications/NotificationGroupsList.tsx
2758
+ var import_jsx_runtime19 = require("react/jsx-runtime");
2759
+ function NotificationGroupsList({
2760
+ groups = [],
2761
+ isManaging,
2762
+ onToggle,
2763
+ onCheckAll,
2764
+ onUpdate,
2765
+ isUpdating,
2766
+ wasChanged,
2767
+ isUserGroupsUpdated,
2768
+ className,
2769
+ texts
2770
+ }) {
2771
+ var _a, _b, _c, _d, _e;
2772
+ const [groupsParent] = (0, import_react10.useAutoAnimate)();
2773
+ const [updateGroupsParent] = (0, import_react10.useAutoAnimate)();
2774
+ const hasNoSelection = groups.filter((group) => group.isOn === false).length > 0;
2775
+ const hasUnchecked = groups.filter((group) => group.isOn === false).length > 0;
2776
+ if (groups.length <= 1 && isManaging != true) {
2777
+ return null;
2778
+ }
2779
+ const content = /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
2780
+ "div",
2781
+ {
2782
+ ref: groupsParent,
2783
+ className: cn("my-5 flex flex-col gap-3", className == null ? void 0 : className.groupsList),
2784
+ children: [
2785
+ groups.map((group) => /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
2786
+ "div",
2787
+ {
2788
+ id: group.id,
2789
+ role: "button",
2790
+ className: cn(
2791
+ group.isOn ? "bg-neutral-50 hover:bg-transparent shadow-sm border-transparent dark:bg-neutral-800" : "border-neutral-200 hover:bg-neutral-50 dark:hover:border-neutral-800 shadow-sm dark:border-neutral-800",
2792
+ "active:bg-beige-300 flex w-full cursor-pointer items-center gap-3 rounded-xl border px-3 py-2 transition active:dark:bg-neutral-900",
2793
+ className == null ? void 0 : className.groupItem
2794
+ ),
2795
+ onClick: (e) => {
2796
+ if (e.target instanceof HTMLButtonElement) {
2797
+ return;
2798
+ }
2799
+ onToggle(group.id);
2800
+ },
2801
+ children: [
2802
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2803
+ Switch,
2804
+ {
2805
+ checked: group.isOn,
2806
+ className: "data-[state=checked]:bg-blue-500 dark:data-[state=unchecked]:bg-neutral-700",
2807
+ onCheckedChange: () => {
2808
+ onToggle(group.id);
2809
+ }
2810
+ }
2811
+ ),
2812
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "flex flex-col items-start justify-start", children: [
2813
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "font-medium text-sm", children: group.name }),
2814
+ group.description && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "text-xs font-light", children: group.description })
2815
+ ] }),
2816
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "grow" }),
2817
+ group.howOften && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(HowOftenComponent, { regularity: group.howOften })
2818
+ ]
2819
+ },
2820
+ group.id
2821
+ )),
2822
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "flex gap-2", children: [
2823
+ isManaging === true && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [
2824
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
2825
+ "div",
2826
+ {
2827
+ ref: updateGroupsParent,
2828
+ className: "flex flex-col items-start justify-start",
2829
+ children: [
2830
+ wasChanged && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
2831
+ Button,
2832
+ {
2833
+ variant: "default",
2834
+ size: "sm",
2835
+ className: "relative",
2836
+ disabled: isUpdating,
2837
+ onClick: onUpdate,
2838
+ children: [
2839
+ (_a = texts == null ? void 0 : texts.groupsUpdateButton) != null ? _a : DEFAULT_TEXTS.groupsUpdateButton,
2840
+ isUpdating && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Spinner, {}) })
2841
+ ]
2842
+ }
2843
+ ),
2844
+ isUserGroupsUpdated && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("p", { className: "mt-3 flex items-center gap-2 text-sm text-green-500", children: [
2845
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_lucide_react4.CheckCircleIcon, { color: "var(--color-green-500", size: 16 }),
2846
+ " ",
2847
+ (_b = texts == null ? void 0 : texts.groupsUpdateSuccess) != null ? _b : DEFAULT_TEXTS.groupsUpdateSuccess
2848
+ ] })
2849
+ ]
2850
+ }
2851
+ ),
2852
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "grow" })
2853
+ ] }),
2854
+ hasUnchecked && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "flex justify-start", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2855
+ Button,
2856
+ {
2857
+ className: "cursor-pointer dark:bg-neutral-700",
2858
+ onClick: onCheckAll,
2859
+ size: "sm",
2860
+ variant: "secondary",
2861
+ type: "button",
2862
+ children: (_c = texts == null ? void 0 : texts.groupsSelectAllButton) != null ? _c : DEFAULT_TEXTS.groupsSelectAllButton
2863
+ }
2864
+ ) })
2865
+ ] }),
2866
+ hasNoSelection && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "flex text-left gap-2 text-xs text-yellow-500", children: [
2867
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_lucide_react4.TriangleAlertIcon, { color: "orange", size: 16 }),
2868
+ (_d = texts == null ? void 0 : texts.groupsNoSelectionWarning) != null ? _d : DEFAULT_TEXTS.groupsNoSelectionWarning
2869
+ ] })
2870
+ ]
2871
+ }
2872
+ );
2873
+ if (isManaging == true) {
2874
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(Card, { className: "mt-5 text-left", children: [
2875
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(CardHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(CardTitle, { children: (_e = texts == null ? void 0 : texts.groupsTitle) != null ? _e : DEFAULT_TEXTS.groupsTitle }) }),
2876
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(CardContent, { children: content })
2877
+ ] });
2878
+ }
2879
+ return content;
2880
+ }
2881
+
2882
+ // src/components/notifications/QRCodeSection.tsx
2883
+ var import_jsx_runtime20 = require("react/jsx-runtime");
2884
+ function QRCodeSection({
2885
+ showQRCode = true,
2886
+ isManaging,
2887
+ className,
2888
+ texts
2889
+ }) {
2890
+ var _a, _b, _c, _d;
2891
+ const isBrowser = typeof window !== "undefined";
2892
+ const darkMode = isBrowser ? ((_a = window.matchMedia) == null ? void 0 : _a.call(window, "(prefers-color-scheme: dark)").matches) ? true : false : false;
2893
+ function getURL(isBrowser2) {
2894
+ if (isBrowser2) {
2895
+ return window.location.href;
2896
+ }
2897
+ return "";
2898
+ }
2899
+ if (!showQRCode) {
2900
+ return null;
2901
+ }
2902
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
2903
+ Card,
2904
+ {
2905
+ className: cn(
2906
+ "bg-beige-100 rounded-xl p-4 dark:bg-neutral-700",
2907
+ className == null ? void 0 : className.qrCodeSection
2908
+ ),
2909
+ children: [
2910
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(CardHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
2911
+ CardTitle,
2912
+ {
2913
+ className: cn(
2914
+ "mb-3 text-base font-medium lg:text-lg",
2915
+ className == null ? void 0 : className.qrCodeTitle
2916
+ ),
2917
+ children: [
2918
+ (_b = texts == null ? void 0 : texts.qrCodeSubtitle) != null ? _b : DEFAULT_TEXTS.qrCodeSubtitle,
2919
+ " " + ((_c = texts == null ? void 0 : texts.qrCodeTitle) != null ? _c : DEFAULT_TEXTS.qrCodeTitle)
2920
+ ]
2921
+ }
2922
+ ) }),
2923
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(CardContent, { className: "flex flex-col items-center gap-2", children: [
2924
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "mt-1.5 mb-3 flex items-center gap-x-2", children: [
2925
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2926
+ "a",
2927
+ {
2928
+ href: "https://apps.apple.com/us/app/bitsnap/id6741902807",
2929
+ target: "_blank",
2930
+ className: "max-w-28 flex-1 basis-1/2 lg:max-w-36",
2931
+ children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2932
+ "img",
2933
+ {
2934
+ className: "h-auto w-full",
2935
+ src: HOST + "/app-store-logo.png",
2936
+ alt: "Download on App Store"
2937
+ }
2938
+ )
2939
+ }
2940
+ ),
2941
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2942
+ "a",
2943
+ {
2944
+ href: "https://play.google.com/store/apps/details?id=com.bitsnap.Bitsnap&pli=1",
2945
+ target: "_blank",
2946
+ className: "max-w-28 flex-1 basis-1/2 lg:max-w-36",
2947
+ children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2948
+ "img",
2949
+ {
2950
+ className: "h-auto w-full",
2951
+ src: HOST + "/google-play-logo.png",
2952
+ alt: "Get in on Google Play"
2953
+ }
2954
+ )
2955
+ }
2956
+ )
2957
+ ] }),
2958
+ isBrowser && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
2959
+ "div",
2960
+ {
2961
+ className: cn(
2962
+ "flex min-w-[40%] flex-col items-center gap-2 rounded-xl bg-white p-2 dark:bg-neutral-900",
2963
+ className == null ? void 0 : className.qrCodeContainer
2964
+ ),
2965
+ children: [
2966
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2967
+ "img",
2968
+ {
2969
+ className: "mt-3 w-[80%] p-1 pt-3",
2970
+ src: HOST + `/api/qr-gen?url=${getURL(isBrowser)}&bgColor=${!darkMode ? "F6F4F0" : "171717"}&textColor=${!darkMode ? "000000" : "ffffff"}&margin=0`
2971
+ }
2972
+ ),
2973
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "text-xs md:text-sm", children: (_d = texts == null ? void 0 : texts.qrCodeScanText) != null ? _d : DEFAULT_TEXTS.qrCodeScanText })
2974
+ ]
2975
+ }
2976
+ ) })
2977
+ ] })
2978
+ ]
2979
+ }
2980
+ );
2981
+ }
2982
+
2983
+ // src/components/notifications/AddUserToGroups.tsx
2984
+ var import_react13 = require("react");
2985
+ var import_react_phone_number_input = require("react-phone-number-input");
2986
+
2987
+ // src/ui/input.tsx
2988
+ var import_jsx_runtime21 = require("react/jsx-runtime");
2989
+ function Input({ className, type, ...props }) {
2990
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2991
+ "input",
2992
+ {
2993
+ type,
2994
+ "data-slot": "input",
2995
+ className: cn(
2996
+ "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
2997
+ "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
2998
+ "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
2999
+ className
3000
+ ),
3001
+ ...props
3002
+ }
3003
+ );
3004
+ }
3005
+
3006
+ // src/components/notifications/FormInput.tsx
3007
+ var import_react11 = require("@formkit/auto-animate/react");
3008
+ var import_react_label = require("@radix-ui/react-label");
3009
+ var import_lucide_react5 = require("lucide-react");
3010
+ var import_react12 = require("react");
3011
+ var import_jsx_runtime22 = require("react/jsx-runtime");
3012
+ function FormInput({
3013
+ submit,
3014
+ isLoading,
3015
+ errMsg,
3016
+ emailLack,
3017
+ warnMsg,
3018
+ isSubmited,
3019
+ agreementLack,
3020
+ showPhoneInput = false,
3021
+ agreementText,
3022
+ className,
3023
+ texts
3024
+ }) {
3025
+ var _a, _b, _c, _d, _e, _f, _g;
3026
+ const [email, setEmail] = (0, import_react12.useState)("");
3027
+ const [phone, setPhone] = (0, import_react12.useState)("");
3028
+ const [isChecked, setIsChecked] = (0, import_react12.useState)(false);
3029
+ const [parent] = (0, import_react11.useAutoAnimate)();
3030
+ function submitForm(e) {
3031
+ e.preventDefault();
3032
+ submit(email, phone, isChecked);
3033
+ }
3034
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
3035
+ "form",
3036
+ {
3037
+ ref: parent,
3038
+ onSubmit: submitForm,
3039
+ className: cn("flex flex-col gap-3 text-left", className == null ? void 0 : className.formContainer),
3040
+ children: [
3041
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex flex-col gap-1 text-left", children: [
3042
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_label.Label, { className: "text-sm", htmlFor: "bts-notifications-form-email", children: (_a = texts == null ? void 0 : texts.formEmailLabel) != null ? _a : DEFAULT_TEXTS.formEmailLabel }),
3043
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
3044
+ Input,
3045
+ {
3046
+ value: email,
3047
+ onChange: (newVal) => {
3048
+ setEmail(newVal.currentTarget.value);
3049
+ },
3050
+ id: "bts-notifications-form-email",
3051
+ className: cn(emailLack === true ? "border-red-400" : ""),
3052
+ type: "email",
3053
+ placeholder: (_b = texts == null ? void 0 : texts.formEmailPlaceholder) != null ? _b : DEFAULT_TEXTS.formEmailPlaceholder
3054
+ }
3055
+ )
3056
+ ] }),
3057
+ showPhoneInput && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex flex-col gap-1 text-left", children: [
3058
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_react_label.Label, { className: "text-sm", htmlFor: "bts-notifications-form-phone", children: [
3059
+ (_c = texts == null ? void 0 : texts.formPhoneLabel) != null ? _c : DEFAULT_TEXTS.formPhoneLabel,
3060
+ " ",
3061
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "text-neutral-500 dark:text-neutral-500", children: (_d = texts == null ? void 0 : texts.formPhoneOptional) != null ? _d : DEFAULT_TEXTS.formPhoneOptional })
3062
+ ] }),
3063
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
3064
+ Input,
3065
+ {
3066
+ value: phone,
3067
+ onChange: (newVal) => {
3068
+ setPhone(newVal.currentTarget.value);
3069
+ },
3070
+ id: "bts-notifications-form-phone",
3071
+ className: "",
3072
+ type: "tel",
3073
+ autoComplete: "tel",
3074
+ autoCorrect: "off",
3075
+ placeholder: (_e = texts == null ? void 0 : texts.formPhonePlaceholder) != null ? _e : DEFAULT_TEXTS.formPhonePlaceholder
3076
+ }
3077
+ )
3078
+ ] }),
3079
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex items-start gap-x-1.5", children: [
3080
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
3081
+ "input",
3082
+ {
3083
+ className: "cursor-pointer",
3084
+ id: "bts-notifications-form-marketing-consent",
3085
+ type: "checkbox",
3086
+ checked: isChecked,
3087
+ onChange: () => {
3088
+ setIsChecked(!isChecked);
3089
+ }
3090
+ }
3091
+ ),
3092
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
3093
+ "label",
3094
+ {
3095
+ htmlFor: "bts-notifications-form-marketing-consent",
3096
+ className: cn(
3097
+ "cursor-pointer text-xs leading-4 transition-colors md:text-sm md:leading-4",
3098
+ agreementLack === true ? "text-yellow-700" : ""
3099
+ ),
3100
+ children: agreementText
3101
+ }
3102
+ )
3103
+ ] }),
3104
+ errMsg.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("p", { className: "mb-3 flex items-center gap-1 text-sm text-red-400", children: [
3105
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react5.TriangleAlertIcon, { color: "#ff6467", size: 16 }),
3106
+ " ",
3107
+ errMsg
3108
+ ] }),
3109
+ warnMsg.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("p", { className: "mb-3 flex items-center gap-1 text-sm text-amber-400", children: [
3110
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react5.CircleAlertIcon, { color: "var(--color-amber-400)", size: 16 }),
3111
+ " ",
3112
+ warnMsg
3113
+ ] }),
3114
+ isSubmited == false && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "flex justify-start", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
3115
+ Button,
3116
+ {
3117
+ variant: "default",
3118
+ disabled: isLoading,
3119
+ className: cn(
3120
+ isLoading ? "cursor-not-allowed text-transparent" : "",
3121
+ "relative"
3122
+ ),
3123
+ children: [
3124
+ (_f = texts == null ? void 0 : texts.formSubmitButton) != null ? _f : DEFAULT_TEXTS.formSubmitButton,
3125
+ isLoading && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Spinner, {}) })
3126
+ ]
3127
+ }
3128
+ ) }),
3129
+ isSubmited && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex items-center gap-3 text-sm text-green-400", children: [
3130
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react5.CheckCircleIcon, { size: 16 }),
3131
+ " ",
3132
+ (_g = texts == null ? void 0 : texts.formSuccessMessage) != null ? _g : DEFAULT_TEXTS.formSuccessMessage
3133
+ ] })
3134
+ ]
3135
+ }
3136
+ );
3137
+ }
3138
+
3139
+ // src/components/notifications/AddUserToGroups.tsx
3140
+ var import_jsx_runtime23 = require("react/jsx-runtime");
3141
+ var emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
3142
+ function AddUserToGroups({
3143
+ groups,
3144
+ onToggle,
3145
+ onCheckAll,
3146
+ slug,
3147
+ showPhoneInput = false,
3148
+ agreementText,
3149
+ className,
3150
+ texts,
3151
+ isUpdating,
3152
+ wasChanged,
3153
+ onSuccess
3154
+ }) {
3155
+ var _a, _b;
3156
+ const [errMsg, setErrMsg] = (0, import_react13.useState)("");
3157
+ const [warnMsg, setWarnMsg] = (0, import_react13.useState)("");
3158
+ const [isSubmited, setIsSubmited] = (0, import_react13.useState)(false);
3159
+ const [agreementLack, setAgreementLack] = (0, import_react13.useState)(false);
3160
+ const [emailLack, setEmailLack] = (0, import_react13.useState)(false);
3161
+ const {
3162
+ mutateAsync: createNotificationUserMutation,
3163
+ isPending: isCreateNotificationUserPending
3164
+ } = useMutation3(rpcProvider.notifications.createNotificationUser);
3165
+ function validatePhoneNumber(phone) {
3166
+ if (phone == null) {
3167
+ return false;
3168
+ }
3169
+ return (0, import_react_phone_number_input.isValidPhoneNumber)(phone, "PL");
3170
+ }
3171
+ async function save(email, phone, agreement) {
3172
+ setErrMsg("");
3173
+ setWarnMsg("");
3174
+ setEmailLack(false);
3175
+ setIsSubmited(false);
3176
+ setAgreementLack(false);
3177
+ if (!agreement) {
3178
+ setAgreementLack(true);
3179
+ const msg = "Zgoda w tym przypadku jest wymagana.";
3180
+ setErrMsg(msg);
3181
+ return;
3182
+ }
3183
+ if (emailRegex.test(email) === false) {
3184
+ setErrMsg("Email jest nieprawid\u0142owy.");
3185
+ setEmailLack(true);
3186
+ return;
3187
+ }
3188
+ if (phone.length > 0) {
3189
+ if (validatePhoneNumber(phone) === false) {
3190
+ const msg = "Numer telefonu mo\u017Ce by\u0107 nieprawid\u0142owy. Zapisali\u015Bmy go ale je\u015Bli jest nieprawid\u0142owy to wpisz jeszcze raz i kliknij przycisk.";
3191
+ setWarnMsg(msg);
3192
+ }
3193
+ }
3194
+ try {
3195
+ const newNotificationUser = await createNotificationUserMutation({
3196
+ slug,
3197
+ email,
3198
+ phone,
3199
+ groups: groups.filter((el) => el.isOn == true).map((el) => el.id),
3200
+ mobileNotificationEnabled: true,
3201
+ emailNotificationEnabled: true,
3202
+ smsNotificationEnabled: true
3203
+ });
3204
+ if (newNotificationUser.result.case === "success") {
3205
+ setIsSubmited(true);
3206
+ setTimeout(() => {
3207
+ onSuccess == null ? void 0 : onSuccess(
3208
+ false,
3209
+ newNotificationUser.userId,
3210
+ newNotificationUser.accessToken
3211
+ );
3212
+ }, 1e3);
3213
+ return;
3214
+ } else {
3215
+ setIsSubmited(true);
3216
+ const failureMessage = newNotificationUser.result.value;
3217
+ if (failureMessage != null) {
3218
+ if (failureMessage == 32 /* NOTIFICATION_USER_ALREADY_EXIST */) {
3219
+ onSuccess == null ? void 0 : onSuccess(true, void 0, void 0);
3220
+ return;
3221
+ }
3222
+ console.log(`Code error: ${FailureMessage[failureMessage]}`);
3223
+ setErrMsg("Wyst\u0105pi\u0142 b\u0142\u0105d: " + FailureMessage[failureMessage]);
3224
+ return;
3225
+ }
3226
+ return;
3227
+ }
3228
+ } catch (e) {
3229
+ setErrMsg("Wyst\u0105pi\u0142 b\u0142\u0105d podczas zapisywania. Spr\xF3buj ponownie.");
3230
+ console.log(`Error: ${e}`);
3231
+ }
3232
+ }
3233
+ const text = (_a = texts == null ? void 0 : texts.formTitle) != null ? _a : DEFAULT_TEXTS.formTitle;
3234
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
3235
+ "div",
3236
+ {
3237
+ className: cn(
3238
+ "bg-beige-100 rounded-xl p-4 dark:bg-neutral-700",
3239
+ className == null ? void 0 : className.formSection
3240
+ ),
3241
+ children: [
3242
+ text.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
3243
+ "h3",
3244
+ {
3245
+ className: cn(
3246
+ "mb-3 text-base font-medium lg:text-lg",
3247
+ className == null ? void 0 : className.formTitle
3248
+ ),
3249
+ children: text
3250
+ }
3251
+ ),
3252
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
3253
+ NotificationGroupsList,
3254
+ {
3255
+ groups,
3256
+ isManaging: false,
3257
+ onToggle: onToggle != null ? onToggle : () => {
3258
+ },
3259
+ onCheckAll: onCheckAll != null ? onCheckAll : () => {
3260
+ },
3261
+ isUpdating: isUpdating != null ? isUpdating : false,
3262
+ wasChanged: wasChanged != null ? wasChanged : false,
3263
+ isUserGroupsUpdated: false,
3264
+ className,
3265
+ texts
3266
+ }
3267
+ ),
3268
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
3269
+ FormInput,
3270
+ {
3271
+ errMsg,
3272
+ emailLack,
3273
+ warnMsg,
3274
+ submit: save,
3275
+ isLoading: isCreateNotificationUserPending,
3276
+ isSubmited,
3277
+ agreementLack,
3278
+ showPhoneInput,
3279
+ agreementText: (_b = agreementText != null ? agreementText : texts == null ? void 0 : texts.agreementText) != null ? _b : DEFAULT_TEXTS.agreementText,
3280
+ className,
3281
+ texts
3282
+ }
3283
+ )
3284
+ ]
3285
+ }
3286
+ );
3287
+ }
3288
+
3289
+ // src/components/notifications/ManageMyData.tsx
3290
+ var import_react15 = require("react");
3291
+
3292
+ // src/ui/skeleton.tsx
3293
+ var import_jsx_runtime24 = require("react/jsx-runtime");
3294
+ function Skeleton2({ className, ...props }) {
3295
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
3296
+ "div",
3297
+ {
3298
+ "data-slot": "skeleton",
3299
+ className: cn("bg-accent animate-pulse rounded-md", className),
3300
+ ...props
3301
+ }
3302
+ );
3303
+ }
3304
+
3305
+ // src/components/notifications/ManageMyData.tsx
3306
+ var import_react_label2 = require("@radix-ui/react-label");
3307
+ var import_lucide_react7 = require("lucide-react");
3308
+ var import_use_debounce = require("use-debounce");
3309
+
3310
+ // src/components/notifications/UnsubscribeDialog.tsx
3311
+ var import_lucide_react6 = require("lucide-react");
3312
+ var import_react_dom2 = require("react-dom");
3313
+ var import_react14 = require("react");
3314
+ var import_jsx_runtime25 = require("react/jsx-runtime");
3315
+ function UnsubscribeDialog({
3316
+ open: open2,
3317
+ onOpenChange,
3318
+ onConfirm,
3319
+ isDeleting = false
3320
+ }) {
3321
+ const [mounted, setMounted] = (0, import_react14.useState)(false);
3322
+ (0, import_react14.useEffect)(() => {
3323
+ setMounted(true);
3324
+ return () => setMounted(false);
3325
+ }, []);
3326
+ (0, import_react14.useEffect)(() => {
3327
+ if (open2) {
3328
+ document.body.style.overflow = "hidden";
3329
+ } else {
3330
+ document.body.style.overflow = "";
3331
+ }
3332
+ return () => {
3333
+ document.body.style.overflow = "";
3334
+ };
3335
+ }, [open2]);
3336
+ if (!mounted || !open2) {
3337
+ return null;
3338
+ }
3339
+ const handleBackdropClick = (e) => {
3340
+ if (e.target === e.currentTarget) {
3341
+ onOpenChange(false);
3342
+ }
3343
+ };
3344
+ const handleConfirm = () => {
3345
+ onConfirm();
3346
+ };
3347
+ return (0, import_react_dom2.createPortal)(
3348
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
3349
+ "div",
3350
+ {
3351
+ className: "fixed inset-0 z-[9999] flex items-center justify-center bg-black/50 p-4",
3352
+ onClick: handleBackdropClick,
3353
+ children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
3354
+ "div",
3355
+ {
3356
+ className: cn(
3357
+ "relative w-full max-w-md rounded-2xl bg-white p-6 shadow-lg",
3358
+ "dark:bg-neutral-800",
3359
+ "animate-in fade-in-0 zoom-in-95 duration-200"
3360
+ ),
3361
+ onClick: (e) => e.stopPropagation(),
3362
+ children: [
3363
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
3364
+ "button",
3365
+ {
3366
+ onClick: () => onOpenChange(false),
3367
+ className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-white transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-neutral-950 focus:ring-offset-2 disabled:pointer-events-none dark:ring-offset-neutral-950 dark:focus:ring-neutral-300",
3368
+ disabled: isDeleting,
3369
+ children: [
3370
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_lucide_react6.XIcon, { className: "h-4 w-4" }),
3371
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "sr-only", children: "Zamknij" })
3372
+ ]
3373
+ }
3374
+ ),
3375
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex flex-col gap-4", children: [
3376
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-start gap-3", children: [
3377
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
3378
+ import_lucide_react6.TriangleAlertIcon,
3379
+ {
3380
+ className: "h-6 w-6 text-amber-500",
3381
+ "aria-hidden": "true"
3382
+ }
3383
+ ) }),
3384
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h2", { className: "text-lg font-semibold text-black dark:text-neutral-100", children: "Czy na pewno chcesz si\u0119 wypisa\u0107?" }) })
3385
+ ] }),
3386
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { className: "text-sm text-neutral-600 dark:text-neutral-400", children: "Klikni\u0119cie tego przycisku spowoduje wypisanie z wszelkich powiadomie\u0144 i grup, kt\xF3re zapisa\u0142e\u015B." }),
3387
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", children: [
3388
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
3389
+ Button,
3390
+ {
3391
+ type: "button",
3392
+ variant: "ghost",
3393
+ onClick: () => onOpenChange(false),
3394
+ disabled: isDeleting,
3395
+ className: "sm:min-w-[100px]",
3396
+ children: "Anuluj"
3397
+ }
3398
+ ),
3399
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
3400
+ Button,
3401
+ {
3402
+ type: "button",
3403
+ variant: "destructive",
3404
+ onClick: handleConfirm,
3405
+ disabled: isDeleting,
3406
+ className: cn(
3407
+ isDeleting && "cursor-not-allowed text-transparent",
3408
+ "relative sm:min-w-[100px]"
3409
+ ),
3410
+ children: [
3411
+ "Usu\u0144",
3412
+ isDeleting && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-white border-t-transparent" }) })
3413
+ ]
3414
+ }
3415
+ )
3416
+ ] })
3417
+ ] })
3418
+ ]
3419
+ }
3420
+ )
3421
+ }
3422
+ ),
3423
+ document.body
3424
+ );
3425
+ }
3426
+
3427
+ // src/components/notifications/ManageMyData.tsx
3428
+ var import_react16 = require("@formkit/auto-animate/react");
3429
+ var import_jsx_runtime26 = require("react/jsx-runtime");
3430
+ function ManageMyData({
3431
+ accessToken,
3432
+ slug,
3433
+ userID,
3434
+ className,
3435
+ texts
3436
+ }) {
3437
+ var _a, _b, _c, _d, _e;
3438
+ const [parent] = (0, import_react16.useAutoAnimate)();
3439
+ const [parentCard] = (0, import_react16.useAutoAnimate)();
3440
+ const { mutateAsync: deleteMyData, isPending: isDeleting } = useMutation3(
3441
+ rpcProvider.notifications.deleteNotificationUser
3442
+ );
3443
+ const { mutateAsync: updateNotificationUser2, isPending: isUpdating } = useMutation3(rpcProvider.notifications.updateNotificationUser);
3444
+ const { data: userSettings, isFetching: isLoading } = useQuery4(
3445
+ rpcProvider.notifications.getNotificationUserSettings,
3446
+ {
3447
+ userId: userID,
3448
+ slug,
3449
+ accessToken
3450
+ }
3451
+ );
3452
+ const [email, setEmail] = (0, import_react15.useState)(false);
3453
+ const [phone, setPhone] = (0, import_react15.useState)(false);
3454
+ const [isDataUpdated, setIsDataUpdated] = (0, import_react15.useState)(false);
3455
+ const [push, setPush] = (0, import_react15.useState)(false);
3456
+ const [isDialogOpen, setIsDialogOpen] = (0, import_react15.useState)(false);
3457
+ const details = (userSettings == null ? void 0 : userSettings.result.case) === "success" ? (_a = userSettings == null ? void 0 : userSettings.result) == null ? void 0 : _a.value : void 0;
3458
+ function deleteData() {
3459
+ setIsDialogOpen(true);
3460
+ }
3461
+ async function handleConfirmDelete() {
3462
+ await deleteMyData({
3463
+ accessToken,
3464
+ slug,
3465
+ userId: userID
3466
+ });
3467
+ setIsDialogOpen(false);
3468
+ }
3469
+ async function updateData() {
3470
+ await updateNotificationUser2({
3471
+ accessToken,
3472
+ slug,
3473
+ notificationUserId: userID,
3474
+ mobileNotificationEnabled: push,
3475
+ emailNotificationEnabled: email,
3476
+ smsNotificationEnabled: phone
3477
+ });
3478
+ setIsDataUpdated(true);
3479
+ setTimeout(() => {
3480
+ setIsDataUpdated(false);
3481
+ }, 3e3);
3482
+ }
3483
+ const debouncedUpdateData = (0, import_use_debounce.useDebouncedCallback)((_) => {
3484
+ updateData();
3485
+ }, 300);
3486
+ (0, import_react15.useEffect)(() => {
3487
+ var _a2, _b2, _c2, _d2;
3488
+ const details2 = (userSettings == null ? void 0 : userSettings.result.case) === "success" ? (_a2 = userSettings == null ? void 0 : userSettings.result) == null ? void 0 : _a2.value : void 0;
3489
+ setEmail((_b2 = details2 == null ? void 0 : details2.emailNotificationEnabled) != null ? _b2 : false);
3490
+ setPhone((_c2 = details2 == null ? void 0 : details2.smsNotificationEnabled) != null ? _c2 : false);
3491
+ setPush((_d2 = details2 == null ? void 0 : details2.mobileNotificationEnabled) != null ? _d2 : false);
3492
+ }, [userSettings]);
3493
+ function setData(key, value) {
3494
+ if (key === "email") {
3495
+ setEmail(value);
3496
+ }
3497
+ if (key === "phone") {
3498
+ setPhone(value);
3499
+ }
3500
+ if (key === "push") {
3501
+ setPush(value);
3502
+ }
3503
+ debouncedUpdateData(true);
3504
+ }
3505
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
3506
+ "div",
3507
+ {
3508
+ className: cn(
3509
+ "bg-beige-100 rounded-xl p-4 dark:bg-neutral-700",
3510
+ className == null ? void 0 : className.manageDataSection
3511
+ ),
3512
+ children: [
3513
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "flex justify-start", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
3514
+ "h3",
3515
+ {
3516
+ className: cn(
3517
+ "mb-3 text-base font-medium lg:text-lg",
3518
+ className == null ? void 0 : className.manageDataTitle
3519
+ ),
3520
+ children: (_b = texts == null ? void 0 : texts.manageDataTitle) != null ? _b : DEFAULT_TEXTS.manageDataTitle
3521
+ }
3522
+ ) }),
3523
+ isLoading ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(Skeleton2, { className: "h-64 w-full" }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(Card, { ref: parentCard, className: cn(isUpdating && "relative"), children: [
3524
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(CardHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(CardTitle, { children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("p", { className: "text-sm text-left", children: (_c = texts == null ? void 0 : texts.manageDataDescription) != null ? _c : DEFAULT_TEXTS.manageDataDescription }) }) }),
3525
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(CardContent, { ref: parent, children: [
3526
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
3527
+ "div",
3528
+ {
3529
+ className: cn(
3530
+ isUpdating && "opacity-50 pointer-events-none",
3531
+ "flex flex-col gap-2"
3532
+ ),
3533
+ children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "flex flex-col items-start gap-5 gap-x-2", children: [
3534
+ (details == null ? void 0 : details.emailNotificationAvailable) && /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "flex items-center gap-3", children: [
3535
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
3536
+ Switch,
3537
+ {
3538
+ id: "email-enabled",
3539
+ className: "data-[state=checked]:bg-blue-500 dark:data-[state=unchecked]:bg-neutral-600",
3540
+ checked: email,
3541
+ onCheckedChange: () => {
3542
+ setData("email", !email);
3543
+ }
3544
+ }
3545
+ ),
3546
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_label2.Label, { htmlFor: "email-enabled", className: "text-sm", children: "Email" })
3547
+ ] }),
3548
+ (details == null ? void 0 : details.smsNotificationAvailable) && /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "flex items-center gap-3", children: [
3549
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
3550
+ Switch,
3551
+ {
3552
+ id: "sms-enabled",
3553
+ className: "data-[state=checked]:bg-blue-500 dark:data-[state=unchecked]:bg-neutral-600",
3554
+ checked: phone,
3555
+ onCheckedChange: () => {
3556
+ setData("phone", !phone);
3557
+ }
3558
+ }
3559
+ ),
3560
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_label2.Label, { htmlFor: "sms-enabled", className: "text-sm", children: "SMS" })
3561
+ ] }),
3562
+ (details == null ? void 0 : details.mobileNotificationAvailable) && /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [
3563
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "flex items-center gap-3", children: [
3564
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
3565
+ Switch,
3566
+ {
3567
+ id: "push-enabled",
3568
+ className: "data-[state=checked]:bg-blue-500 dark:data-[state=unchecked]:bg-neutral-600",
3569
+ checked: push,
3570
+ onCheckedChange: () => {
3571
+ setData("push", !push);
3572
+ }
3573
+ }
3574
+ ),
3575
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_label2.Label, { htmlFor: "push-enabled", className: "text-sm", children: "Powiadomienia na telefon" })
3576
+ ] }),
3577
+ (details == null ? void 0 : details.hasUserInstalledApp) === false && /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "flex items-center gap-3", children: [
3578
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
3579
+ import_lucide_react7.MessageCircleWarningIcon,
3580
+ {
3581
+ color: "var(--color-amber-500)",
3582
+ size: 26
3583
+ }
3584
+ ),
3585
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("p", { className: "text-xs text-amber-500", children: "Wygl\u0105da na to, \u017Ce nie masz zainstalowanej aplikacji mobilnej. Zainstaluj i wyra\u017A zgod\u0119 na otrzymywanie powiadomie\u0144 na telefon." })
3586
+ ] })
3587
+ ] })
3588
+ ] })
3589
+ }
3590
+ ),
3591
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "mt-5 flex flex-col gap-2 text-left", children: [
3592
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("hr", {}),
3593
+ isDataUpdated && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("p", { className: "text-xs text-green-500", children: (_d = texts == null ? void 0 : texts.manageDataUpdatedMessage) != null ? _d : DEFAULT_TEXTS.manageDataUpdatedMessage }),
3594
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "flex items-center gap-x-2", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
3595
+ Button,
3596
+ {
3597
+ size: "sm",
3598
+ variant: "link",
3599
+ className: cn(
3600
+ "pl-0 ml-0",
3601
+ isDeleting && "cursor-not-allowed"
3602
+ ),
3603
+ onClick: deleteData,
3604
+ children: [
3605
+ (_e = texts == null ? void 0 : texts.manageDataUnsubscribeButton) != null ? _e : DEFAULT_TEXTS.manageDataUnsubscribeButton,
3606
+ isDeleting && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(Spinner, {}) })
3607
+ ]
3608
+ }
3609
+ ) })
3610
+ ] })
3611
+ ] }),
3612
+ isUpdating && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "bg-black/30 absolute inset-0 rounded-xl", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(Spinner, {}) }) })
3613
+ ] }),
3614
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
3615
+ UnsubscribeDialog,
3616
+ {
3617
+ open: isDialogOpen,
3618
+ onOpenChange: setIsDialogOpen,
3619
+ onConfirm: handleConfirmDelete,
3620
+ isDeleting
3621
+ }
3622
+ )
3623
+ ]
3624
+ }
3625
+ );
3626
+ }
3627
+
3628
+ // src/components/notifications/LoginScreen.tsx
3629
+ var import_react17 = require("react");
3630
+
3631
+ // src/ui/label.tsx
3632
+ var LabelPrimitive = __toESM(require("@radix-ui/react-label"));
3633
+ var import_jsx_runtime27 = require("react/jsx-runtime");
3634
+ function Label3({
3635
+ className,
3636
+ ...props
3637
+ }) {
3638
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
3639
+ LabelPrimitive.Root,
3640
+ {
3641
+ "data-slot": "label",
3642
+ className: cn(
3643
+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
3644
+ className
3645
+ ),
3646
+ ...props
3647
+ }
3648
+ );
3649
+ }
3650
+
3651
+ // src/ui/input-otp.tsx
3652
+ var React3 = __toESM(require("react"));
3653
+ var import_input_otp = require("input-otp");
3654
+ var import_lucide_react8 = require("lucide-react");
3655
+ var import_jsx_runtime28 = require("react/jsx-runtime");
3656
+ function InputOTP({
3657
+ className,
3658
+ containerClassName,
3659
+ ...props
3660
+ }) {
3661
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
3662
+ import_input_otp.OTPInput,
3663
+ {
3664
+ "data-slot": "input-otp",
3665
+ containerClassName: cn(
3666
+ "flex items-center gap-2 has-disabled:opacity-50",
3667
+ containerClassName
3668
+ ),
3669
+ className: cn("disabled:cursor-not-allowed", className),
3670
+ ...props
3671
+ }
3672
+ );
3673
+ }
3674
+ function InputOTPGroup({ className, ...props }) {
3675
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
3676
+ "div",
3677
+ {
3678
+ "data-slot": "input-otp-group",
3679
+ className: cn("flex items-center", className),
3680
+ ...props
3681
+ }
3682
+ );
3683
+ }
3684
+ function InputOTPSlot({
3685
+ index,
3686
+ className,
3687
+ ...props
3688
+ }) {
3689
+ var _a;
3690
+ const inputOTPContext = React3.useContext(import_input_otp.OTPInputContext);
3691
+ const { char, hasFakeCaret, isActive } = (_a = inputOTPContext == null ? void 0 : inputOTPContext.slots[index]) != null ? _a : {};
3692
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
3693
+ "div",
3694
+ {
3695
+ "data-slot": "input-otp-slot",
3696
+ "data-active": isActive,
3697
+ className: cn(
3698
+ "data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-r text-sm shadow-xs transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md data-[active=true]:z-10 data-[active=true]:ring-[3px]",
3699
+ className
3700
+ ),
3701
+ ...props,
3702
+ children: [
3703
+ char,
3704
+ hasFakeCaret && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "animate-caret-blink bg-foreground h-4 w-px duration-1000" }) })
3705
+ ]
3706
+ }
3707
+ );
3708
+ }
3709
+
3710
+ // src/components/notifications/LoginScreen.tsx
3711
+ var import_lucide_react10 = require("lucide-react");
3712
+ var import_react18 = require("@formkit/auto-animate/react");
3713
+
3714
+ // src/ui/dialog.tsx
3715
+ var DialogPrimitive = __toESM(require("@radix-ui/react-dialog"));
3716
+ var import_lucide_react9 = require("lucide-react");
3717
+ var import_jsx_runtime29 = require("react/jsx-runtime");
3718
+ function Dialog({
3719
+ ...props
3720
+ }) {
3721
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(DialogPrimitive.Root, { "data-slot": "dialog", ...props });
3722
+ }
3723
+ function DialogPortal({
3724
+ ...props
3725
+ }) {
3726
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(DialogPrimitive.Portal, { "data-slot": "dialog-portal", ...props });
3727
+ }
3728
+ function DialogOverlay({
3729
+ className,
3730
+ ...props
3731
+ }) {
3732
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
3733
+ DialogPrimitive.Overlay,
3734
+ {
3735
+ "data-slot": "dialog-overlay",
3736
+ className: cn(
3737
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
3738
+ className
3739
+ ),
3740
+ ...props
3741
+ }
3742
+ );
3743
+ }
3744
+ function DialogContent({
3745
+ className,
3746
+ children,
3747
+ showCloseButton = true,
3748
+ ...props
3749
+ }) {
3750
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(DialogPortal, { "data-slot": "dialog-portal", children: [
3751
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(DialogOverlay, {}),
3752
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
3753
+ DialogPrimitive.Content,
3754
+ {
3755
+ "data-slot": "dialog-content",
3756
+ className: cn(
3757
+ "bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg",
3758
+ className
3759
+ ),
3760
+ ...props,
3761
+ children: [
3762
+ children,
3763
+ showCloseButton && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
3764
+ DialogPrimitive.Close,
3765
+ {
3766
+ "data-slot": "dialog-close",
3767
+ className: "ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
3768
+ children: [
3769
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_lucide_react9.XIcon, {}),
3770
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "sr-only", children: "Close" })
3771
+ ]
3772
+ }
3773
+ )
3774
+ ]
3775
+ }
3776
+ )
3777
+ ] });
3778
+ }
3779
+
3780
+ // src/components/notifications/LoginScreen.tsx
3781
+ var import_jsx_runtime30 = require("react/jsx-runtime");
3782
+ function LoginScreen({
3783
+ slug,
3784
+ onSuccess,
3785
+ onError,
3786
+ className,
3787
+ isOpen,
3788
+ onClose,
3789
+ texts
3790
+ }) {
3791
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
3792
+ const [parentContent] = (0, import_react18.useAutoAnimate)();
3793
+ const [parentHeader] = (0, import_react18.useAutoAnimate)();
3794
+ const [email, setEmail] = (0, import_react17.useState)("");
3795
+ const [code, setCode] = (0, import_react17.useState)("");
3796
+ const [isEmailSent, setIsEmailSent] = (0, import_react17.useState)(false);
3797
+ const [error, setError] = (0, import_react17.useState)(null);
3798
+ const { mutateAsync: verifyUserEmail2, isPending: isVerifying } = useMutation3(
3799
+ rpcProvider.notifications.verifyUserEmail
3800
+ );
3801
+ const handleSendEmail = async (e) => {
3802
+ var _a2;
3803
+ e.preventDefault();
3804
+ setError(null);
3805
+ if (!email || !email.includes("@")) {
3806
+ setError((_a2 = texts.loginInvalidEmailError) != null ? _a2 : "");
3807
+ return;
3808
+ }
3809
+ try {
3810
+ await verifyUserEmail2({
3811
+ email,
3812
+ slug
3813
+ });
3814
+ setIsEmailSent(true);
3815
+ } catch (err) {
3816
+ const error2 = err instanceof Error ? err : new Error(texts.loginSendEmailError);
3817
+ setError(error2.message);
3818
+ onError == null ? void 0 : onError(error2);
3819
+ }
3820
+ };
3821
+ const handleVerifyCode = async (value) => {
3822
+ var _a2, _b2;
3823
+ setCode(value);
3824
+ setError(null);
3825
+ if (value.length === 6) {
3826
+ try {
3827
+ const response = await verifyUserEmail2({
3828
+ email: void 0,
3829
+ code: value,
3830
+ slug
3831
+ });
3832
+ if (response.ok && response.accessToken) {
3833
+ onSuccess == null ? void 0 : onSuccess(response.userId, response.accessToken);
3834
+ } else {
3835
+ setError((_a2 = texts.loginVerificationFailedError) != null ? _a2 : "");
3836
+ onError == null ? void 0 : onError(new Error(texts.loginVerificationFailedError));
3837
+ }
3838
+ } catch (err) {
3839
+ const error2 = err instanceof Error ? err : new Error(texts.loginVerifyCodeError);
3840
+ if (error2.message.includes("Invalid code")) {
3841
+ setError((_b2 = texts.loginInvalidCodeError) != null ? _b2 : error2.message);
3842
+ setCode("");
3843
+ return;
3844
+ }
3845
+ setError(error2.message);
3846
+ onError == null ? void 0 : onError(error2);
3847
+ setCode("");
3848
+ }
3849
+ }
3850
+ };
3851
+ const handleResendEmail = async () => {
3852
+ var _a2;
3853
+ setCode("");
3854
+ setError(null);
3855
+ if (!email || !slug) {
3856
+ setError((_a2 = texts.loginSlugRequiredError) != null ? _a2 : "");
3857
+ return;
3858
+ }
3859
+ try {
3860
+ await verifyUserEmail2({
3861
+ email,
3862
+ slug
3863
+ });
3864
+ } catch (err) {
3865
+ const error2 = err instanceof Error ? err : new Error(texts.loginResendEmailError);
3866
+ setError(error2.message);
3867
+ onError == null ? void 0 : onError(error2);
3868
+ }
3869
+ };
3870
+ const handleChangeEmail = () => {
3871
+ setIsEmailSent(false);
3872
+ setCode("");
3873
+ setError(null);
3874
+ };
3875
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Dialog, { open: isOpen, onOpenChange: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(DialogContent, { className: "sm:max-w-[425px] min-h-[250px]", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "flex flex-col min-h-[250px] h-full", children: [
3876
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { ref: parentHeader, className: "flex items-start gap-2 mb-2", children: [
3877
+ isEmailSent && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
3878
+ Button,
3879
+ {
3880
+ variant: "ghost",
3881
+ size: "icon-sm",
3882
+ onClick: () => {
3883
+ setIsEmailSent(false);
3884
+ },
3885
+ children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_lucide_react10.ArrowLeft, { className: "h-5 w-5" })
3886
+ }
3887
+ ),
3888
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(CardTitle, { children: isEmailSent ? (_a = texts.loginCodeLabel) != null ? _a : "" : (_b = texts.loginTitle) != null ? _b : "" }) })
3889
+ ] }),
3890
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(CardDescription, { className: "mb-4", children: isEmailSent ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment, { children: [
3891
+ (_c = texts.loginCodeSentMessage) != null ? _c : "",
3892
+ " ",
3893
+ email
3894
+ ] }) : (_d = texts.loginDescription) != null ? _d : "" }),
3895
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "flex-1 flex flex-col", children: !isEmailSent ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("form", { onSubmit: handleSendEmail, className: "flex flex-col flex-1", children: [
3896
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "space-y-2", children: [
3897
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Label3, { htmlFor: "email", children: (_e = texts.loginEmailLabel) != null ? _e : "" }),
3898
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
3899
+ Input,
3900
+ {
3901
+ id: "email",
3902
+ type: "email",
3903
+ placeholder: (_f = texts.loginEmailPlaceholder) != null ? _f : "",
3904
+ value: email,
3905
+ onChange: (e) => setEmail(e.target.value),
3906
+ required: true,
3907
+ disabled: isVerifying,
3908
+ "aria-invalid": error ? "true" : "false"
3909
+ }
3910
+ )
3911
+ ] }),
3912
+ error && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
3913
+ "div",
3914
+ {
3915
+ className: "text-sm text-destructive mt-2 mb-1",
3916
+ role: "alert",
3917
+ children: error
3918
+ }
3919
+ ),
3920
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "grow" }),
3921
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "flex flex-col items-start gap-0 pt-2", children: [
3922
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Button, { type: "submit", size: "sm", disabled: isVerifying, children: isVerifying ? (_g = texts.loginSendingButton) != null ? _g : "" : (_h = texts.loginSendCodeButton) != null ? _h : "" }),
3923
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
3924
+ Button,
3925
+ {
3926
+ type: "button",
3927
+ variant: "link",
3928
+ className: "ml-0 pl-0",
3929
+ size: "sm",
3930
+ onClick: () => {
3931
+ setIsEmailSent(true);
3932
+ },
3933
+ children: (_i = texts.loginIHaveCode) != null ? _i : ""
3934
+ }
3935
+ )
3936
+ ] })
3937
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
3938
+ "form",
3939
+ {
3940
+ onSubmit: (e) => e.preventDefault(),
3941
+ className: "flex flex-col flex-1",
3942
+ children: [
3943
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "space-y-2", children: [
3944
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Label3, { children: (_j = texts.loginCodeLabel) != null ? _j : "" }),
3945
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
3946
+ InputOTP,
3947
+ {
3948
+ maxLength: 6,
3949
+ value: code,
3950
+ onChange: handleVerifyCode,
3951
+ disabled: isVerifying,
3952
+ children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(InputOTPGroup, { children: [
3953
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InputOTPSlot, { index: 0 }),
3954
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InputOTPSlot, { index: 1 }),
3955
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InputOTPSlot, { index: 2 }),
3956
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InputOTPSlot, { index: 3 }),
3957
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InputOTPSlot, { index: 4 }),
3958
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(InputOTPSlot, { index: 5 })
3959
+ ] })
3960
+ }
3961
+ ),
3962
+ isVerifying && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Spinner, {})
3963
+ ] }),
3964
+ error && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
3965
+ "div",
3966
+ {
3967
+ className: "text-sm text-destructive mt-2 mb-1",
3968
+ role: "alert",
3969
+ children: error
3970
+ }
3971
+ ),
3972
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "grow" }),
3973
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "flex flex-col items-start gap-2 pt-2", children: [
3974
+ email.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
3975
+ Button,
3976
+ {
3977
+ variant: "link",
3978
+ size: "sm",
3979
+ onClick: handleResendEmail,
3980
+ disabled: isVerifying,
3981
+ className: "flex-1 ml-0 pl-0",
3982
+ children: (_k = texts.loginResendCodeButton) != null ? _k : ""
3983
+ }
3984
+ ),
3985
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
3986
+ Button,
3987
+ {
3988
+ variant: "link",
3989
+ size: "sm",
3990
+ onClick: handleChangeEmail,
3991
+ disabled: isVerifying,
3992
+ className: "flex-1 ml-0 pl-0",
3993
+ children: (_l = texts.loginChangeEmailButton) != null ? _l : ""
3994
+ }
3995
+ )
3996
+ ] })
3997
+ ]
3998
+ }
3999
+ ) })
4000
+ ] }) }) });
4001
+ }
4002
+
4003
+ // src/components/notifications/NotificationsComponentPublic.tsx
4004
+ var import_react20 = require("@formkit/auto-animate/react");
4005
+ var import_jsx_runtime31 = require("react/jsx-runtime");
4006
+ function reducer(state, action) {
4007
+ switch (action.type) {
4008
+ case "SET_IS_LOGGED_IN": {
4009
+ return {
4010
+ ...state,
4011
+ isLoggedIn: action.value
4012
+ };
4013
+ }
4014
+ case "SET_USER_ID": {
4015
+ return {
4016
+ ...state,
4017
+ userID: action.value
4018
+ };
4019
+ }
4020
+ case "SET_LOADING": {
4021
+ return {
4022
+ ...state,
4023
+ isLoading: action.value
4024
+ };
4025
+ }
4026
+ case "SET_PUBLIC_GROUPS": {
4027
+ return {
4028
+ ...state,
4029
+ groupsProvided: action.value,
4030
+ groups: state.groups.filter(
4031
+ (group) => {
4032
+ var _a;
4033
+ return ((_a = action.value) == null ? void 0 : _a.find((g) => g.id === group.id)) != null;
4034
+ }
4035
+ )
4036
+ };
4037
+ }
4038
+ case "SET_GROUPS": {
4039
+ const isDefaultOn = state.isLoggedIn == false || state.groupsProvided != null;
4040
+ const newGroupsWithIsOn = action.value.map((group) => {
4041
+ var _a, _b, _c;
4042
+ if (state.isLoggedIn == true) {
4043
+ return group;
4044
+ }
4045
+ return {
4046
+ ...group,
4047
+ isOn: (_c = (_b = (_a = state.groupsProvided) == null ? void 0 : _a.find((g) => g.id === group.id)) == null ? void 0 : _b.isOn) != null ? _c : isDefaultOn
4048
+ };
4049
+ });
4050
+ return {
4051
+ ...state,
4052
+ groups: newGroupsWithIsOn
4053
+ };
4054
+ }
4055
+ case "TOGGLE_GROUP": {
4056
+ const updatedGroups = state.groups.map((group) => {
4057
+ if (group.id === action.groupID) {
4058
+ return {
4059
+ ...group,
4060
+ isOn: !group.isOn
4061
+ };
4062
+ }
4063
+ return group;
4064
+ });
4065
+ return {
4066
+ ...state,
4067
+ wasChanged: true,
4068
+ groups: updatedGroups
4069
+ };
4070
+ }
4071
+ case "CHECK_ALL_GROUPS": {
4072
+ const updated = state.groups.map((group) => {
4073
+ return {
4074
+ ...group,
4075
+ isOn: true
4076
+ };
4077
+ });
4078
+ return {
4079
+ ...state,
4080
+ groups: updated,
4081
+ wasChanged: true
4082
+ };
4083
+ }
4084
+ case "SET_WAS_CHANGED":
4085
+ return {
4086
+ ...state,
4087
+ wasChanged: action.value
4088
+ };
4089
+ case "SET_IS_USER_GROUPS_UPDATED":
4090
+ return {
4091
+ ...state,
4092
+ isUserGroupsUpdated: action.value
4093
+ };
4094
+ case "RESET_UPDATE_STATE":
4095
+ return {
4096
+ ...state,
4097
+ wasChanged: false,
4098
+ isUserGroupsUpdated: true
4099
+ };
4100
+ case "SHOW_SETTINGS":
4101
+ return {
4102
+ ...state,
4103
+ showSettings: true
4104
+ };
4105
+ case "HIDE_SETTINGS":
4106
+ return {
4107
+ ...state,
4108
+ showSettings: false
4109
+ };
4110
+ default:
4111
+ return state;
4112
+ }
4113
+ }
4114
+ function NotificationsComponentPublic(props) {
4115
+ var _a, _b, _c, _d;
4116
+ const [parent] = (0, import_react20.useAutoAnimate)();
4117
+ let slug = (_b = (_a = props.slug) != null ? _a : getProjectID()) != null ? _b : typeof window !== "undefined" ? window.location.hostname : "";
4118
+ const { mutateAsync: updateUserGroups2, isPending: isUpdating } = useMutation3(
4119
+ rpcProvider.notifications.updateUserGroups
4120
+ );
4121
+ const { data: userInfo, refetch: refetchAccessToken } = (0, import_react_query6.useQuery)({
4122
+ queryKey: ["notifications_accessToken"],
4123
+ queryFn: () => {
4124
+ var _a2, _b2;
4125
+ if (typeof window !== "undefined") {
4126
+ return {
4127
+ accessToken: (_a2 = localStorage.getItem("notifications_accessToken")) != null ? _a2 : void 0,
4128
+ userID: (_b2 = localStorage.getItem("notifications_userID")) != null ? _b2 : void 0
4129
+ };
4130
+ }
4131
+ return void 0;
4132
+ }
4133
+ });
4134
+ const {
4135
+ data: groupsDownloaded,
4136
+ isPending: isGroupsDownloading,
4137
+ refetch: refetchGroups
4138
+ } = useQuery4(rpcProvider.notifications.getUserGroups, {
4139
+ slug,
4140
+ accessToken: userInfo == null ? void 0 : userInfo.accessToken
4141
+ });
4142
+ const [state, dispatch] = (0, import_react19.useReducer)(reducer, {
4143
+ isLoading: isGroupsDownloading,
4144
+ isUserGroupsUpdated: false,
4145
+ wasChanged: false,
4146
+ groupsProvided: props.groups,
4147
+ groups: [],
4148
+ showSettings: userInfo != null && props.isManaging == true,
4149
+ isLoggedIn: userInfo != null,
4150
+ userID: void 0
4151
+ });
4152
+ (0, import_react19.useEffect)(() => {
4153
+ dispatch({ type: "SET_LOADING", value: isUpdating || isGroupsDownloading });
4154
+ }, [isUpdating, isGroupsDownloading]);
4155
+ (0, import_react19.useEffect)(() => {
4156
+ dispatch({
4157
+ type: "SET_IS_LOGGED_IN",
4158
+ value: (userInfo == null ? void 0 : userInfo.accessToken) != null
4159
+ });
4160
+ dispatch({ type: "SET_USER_ID", value: userInfo == null ? void 0 : userInfo.userID });
4161
+ if ((userInfo == null ? void 0 : userInfo.accessToken) != null && props.isManaging == true) {
4162
+ dispatch({ type: "SHOW_SETTINGS" });
4163
+ }
4164
+ }, [userInfo, props.isManaging]);
4165
+ (0, import_react19.useEffect)(() => {
4166
+ if (groupsDownloaded == null) {
4167
+ return;
4168
+ }
4169
+ let newGroups = groupsDownloaded.groups.map((group) => {
4170
+ var _a2;
4171
+ let howOften = "rarely";
4172
+ switch (group.howOften) {
4173
+ case 0 /* RARELY */:
4174
+ howOften = "rarely";
4175
+ break;
4176
+ case 1 /* OFTEN */:
4177
+ howOften = "often";
4178
+ break;
4179
+ case 2 /* VERY_OFTEN */:
4180
+ howOften = "veryOften";
4181
+ break;
4182
+ }
4183
+ return {
4184
+ id: group.id,
4185
+ name: group.name,
4186
+ description: group.description,
4187
+ howOften,
4188
+ isOn: (_a2 = group.isOn) != null ? _a2 : void 0
4189
+ };
4190
+ });
4191
+ dispatch({ type: "SET_GROUPS", value: newGroups });
4192
+ }, [groupsDownloaded, isGroupsDownloading, props.groups]);
4193
+ const timeoutRef = (0, import_react19.useRef)(null);
4194
+ (0, import_react19.useEffect)(() => {
4195
+ dispatch({ type: "SET_PUBLIC_GROUPS", value: props.groups });
4196
+ }, [props.groups]);
4197
+ const {
4198
+ texts,
4199
+ showQRCode = false,
4200
+ showPhoneInput = false,
4201
+ hiddenGroupIds = [],
4202
+ className
4203
+ } = props;
4204
+ const mergedTexts = { ...DEFAULT_TEXTS, ...texts };
4205
+ async function updateGroups() {
4206
+ await updateUserGroups2({
4207
+ accessToken: userInfo == null ? void 0 : userInfo.accessToken,
4208
+ slug,
4209
+ userId: props.userID,
4210
+ groupIds: state.groups.filter((el) => el.isOn === true).map((el) => el.id)
4211
+ });
4212
+ dispatch({ type: "RESET_UPDATE_STATE" });
4213
+ if (timeoutRef.current) {
4214
+ clearTimeout(timeoutRef.current);
4215
+ }
4216
+ timeoutRef.current = setTimeout(() => {
4217
+ dispatch({ type: "SET_IS_USER_GROUPS_UPDATED", value: false });
4218
+ }, 2e3);
4219
+ }
4220
+ function toggleGroup(groupID) {
4221
+ dispatch({ type: "TOGGLE_GROUP", groupID });
4222
+ }
4223
+ function checkAllGroups() {
4224
+ dispatch({ type: "CHECK_ALL_GROUPS" });
4225
+ }
4226
+ function handleSettingsClick() {
4227
+ dispatch({ type: "SHOW_SETTINGS" });
4228
+ }
4229
+ function handleCloseSettings() {
4230
+ dispatch({ type: "HIDE_SETTINGS" });
4231
+ }
4232
+ function handleLogout() {
4233
+ localStorage.removeItem("notifications_accessToken");
4234
+ localStorage.removeItem("notifications_userID");
4235
+ refetchAccessToken();
4236
+ dispatch({ type: "SET_USER_ID", value: void 0 });
4237
+ dispatch({ type: "SET_IS_LOGGED_IN", value: false });
4238
+ dispatch({ type: "HIDE_SETTINGS" });
4239
+ }
4240
+ async function handleLoginSuccess(userID, accessToken) {
4241
+ if (typeof window !== "undefined") {
4242
+ localStorage.setItem("notifications_accessToken", accessToken);
4243
+ if (userID != null) {
4244
+ localStorage.setItem("notifications_userID", userID);
4245
+ }
4246
+ }
4247
+ dispatch({ type: "SET_USER_ID", value: userID });
4248
+ try {
4249
+ await refetchAccessToken();
4250
+ refetchGroups().then().catch().finally(() => {
4251
+ if (props.isManaging == true) {
4252
+ dispatch({ type: "SHOW_SETTINGS" });
4253
+ }
4254
+ });
4255
+ } catch (e) {
4256
+ console.log(`Error: ${e}`);
4257
+ }
4258
+ }
4259
+ (0, import_react19.useEffect)(() => {
4260
+ return () => {
4261
+ if (timeoutRef.current) {
4262
+ clearTimeout(timeoutRef.current);
4263
+ }
4264
+ };
4265
+ }, []);
4266
+ const isManagingEnabled = props.isManaging == true && state.userID != null && (userInfo == null ? void 0 : userInfo.accessToken) != null;
4267
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("main", { className: cn("bitsnap-checkout relative", className == null ? void 0 : className.container), children: [
4268
+ mergedTexts.title != null && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("h1", { className: "text-2xl font-semibold text-black md:text-3xl lg:text-4xl xl:text-5xl dark:text-neutral-100", children: mergedTexts.title }),
4269
+ !state.showSettings && props.isManaging && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
4270
+ Button,
4271
+ {
4272
+ onClick: handleSettingsClick,
4273
+ variant: "outline",
4274
+ size: "icon",
4275
+ className: "absolute bottom-6 right-6 z-50 h-12 w-12 rounded-full shadow-lg hover:shadow-xl md:bottom-8 md:right-8",
4276
+ "aria-label": "Settings",
4277
+ children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_lucide_react11.Settings, { className: "h-5 w-5" })
4278
+ }
4279
+ ),
4280
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
4281
+ "div",
4282
+ {
4283
+ className: cn(
4284
+ "md:pt8 relative z-0 mt-6 overflow-hidden rounded-2xl bg-white px-3 pt-6 pb-3 md:px-5 md:pb-5 dark:bg-neutral-800",
4285
+ className == null ? void 0 : className.header
4286
+ ),
4287
+ children: state.showSettings ? (
4288
+ // Settings View
4289
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "space-y-6", children: state.isLoggedIn && // Managing Groups View (logged in)
4290
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
4291
+ "div",
4292
+ {
4293
+ className: cn(
4294
+ "grid grid-cols-1 gap-3 lg:gap-6",
4295
+ isManagingEnabled ? "md:grid-cols-2" : ""
4296
+ ),
4297
+ children: [
4298
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: className == null ? void 0 : className.groupsContainer, children: [
4299
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
4300
+ NotificationHeader,
4301
+ {
4302
+ projectName: props.projectName,
4303
+ projectLogo: props.projectLogo,
4304
+ projectLogoDark: props.projectLogoDark,
4305
+ description: mergedTexts.managingDescription,
4306
+ className,
4307
+ onLogout: handleLogout
4308
+ }
4309
+ ),
4310
+ isGroupsDownloading && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "flex justify-center items-center py-8", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Spinner, {}) }),
4311
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
4312
+ NotificationGroupsList,
4313
+ {
4314
+ groups: state.groups,
4315
+ hiddenGroupIds,
4316
+ isManaging: props.isManaging,
4317
+ onToggle: toggleGroup,
4318
+ onCheckAll: checkAllGroups,
4319
+ onUpdate: updateGroups,
4320
+ isUpdating,
4321
+ wasChanged: state.wasChanged,
4322
+ isUserGroupsUpdated: state.isUserGroupsUpdated,
4323
+ className,
4324
+ texts: mergedTexts
4325
+ }
4326
+ )
4327
+ ] }),
4328
+ isManagingEnabled && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
4329
+ ManageMyData,
4330
+ {
4331
+ accessToken: (_c = userInfo.accessToken) != null ? _c : "",
4332
+ slug,
4333
+ userID: (_d = state.userID) != null ? _d : "",
4334
+ className,
4335
+ texts: mergedTexts
4336
+ }
4337
+ ),
4338
+ showQRCode != false && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
4339
+ QRCodeSection,
4340
+ {
4341
+ showQRCode,
4342
+ isManaging: true,
4343
+ className,
4344
+ texts: mergedTexts
4345
+ }
4346
+ )
4347
+ ]
4348
+ }
4349
+ ) })
4350
+ ) : (
4351
+ // Default View (Form only)
4352
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: cn("grid grid-cols-1 gap-3 lg:gap-6"), children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
4353
+ AddUserToGroups,
4354
+ {
4355
+ slug,
4356
+ onToggle: (id) => {
4357
+ dispatch({ type: "TOGGLE_GROUP", groupID: id });
4358
+ },
4359
+ onCheckAll: () => {
4360
+ dispatch({ type: "CHECK_ALL_GROUPS" });
4361
+ },
4362
+ onSuccess: (userAlreadyExists, userID, accessToken) => {
4363
+ if (accessToken != null) {
4364
+ handleLoginSuccess(userID, accessToken);
4365
+ }
4366
+ if (userAlreadyExists) {
4367
+ dispatch({ type: "SHOW_SETTINGS" });
4368
+ }
4369
+ },
4370
+ groups: state.groups,
4371
+ showPhoneInput,
4372
+ agreementText: mergedTexts.agreementText,
4373
+ className,
4374
+ texts: mergedTexts,
4375
+ wasChanged: state.wasChanged,
4376
+ isUpdating
4377
+ }
4378
+ ) })
4379
+ )
4380
+ }
4381
+ ),
4382
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
4383
+ LoginScreen,
4384
+ {
4385
+ isOpen: state.showSettings && !state.isLoggedIn,
4386
+ slug,
4387
+ onSuccess: handleLoginSuccess,
4388
+ texts: mergedTexts,
4389
+ onClose: handleCloseSettings
4390
+ }
4391
+ )
4392
+ ] });
4393
+ }
4394
+ function Wrapper3(props) {
4395
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(RpcProvider, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(NotificationsComponentPublic, { ...props }) });
4396
+ }
4397
+ var NotificationsComponentPublic_default = Wrapper3;
2167
4398
  // Annotate the CommonJS export names for ESM import in node:
2168
4399
  0 && (module.exports = {
2169
4400
  ApplePayButton,
2170
4401
  Bitsnap,
2171
4402
  BitsnapCheckout,
2172
4403
  GooglePayButton,
4404
+ NotificationsComponent,
2173
4405
  createCheckout,
2174
4406
  createPaymentURL,
2175
4407
  getReferenceIfPossible,