@blinkk/root-cms 1.0.0-rc.13 → 1.0.0-rc.14

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blinkk/root-cms",
3
- "version": "1.0.0-rc.13",
3
+ "version": "1.0.0-rc.14",
4
4
  "author": "s@blinkk.com",
5
5
  "license": "MIT",
6
6
  "engines": {
@@ -44,10 +44,6 @@
44
44
  "./project": {
45
45
  "types": "./dist/project.d.ts",
46
46
  "import": "./dist/project.js"
47
- },
48
- "./richtext": {
49
- "types": "./dist/richtext.d.ts",
50
- "import": "./dist/richtext.js"
51
47
  }
52
48
  },
53
49
  "dependencies": {
@@ -101,10 +97,10 @@
101
97
  "typescript": "5.2.2",
102
98
  "vite": "5.0.8",
103
99
  "vitest": "^0.34.6",
104
- "@blinkk/root": "1.0.0-rc.13"
100
+ "@blinkk/root": "1.0.0-rc.14"
105
101
  },
106
102
  "peerDependencies": {
107
- "@blinkk/root": "1.0.0-rc.13",
103
+ "@blinkk/root": "1.0.0-rc.14",
108
104
  "firebase-admin": ">=11",
109
105
  "firebase-functions": ">=4",
110
106
  "preact": ">=10",
@@ -1,68 +0,0 @@
1
- import * as preact from 'preact';
2
- import { FunctionalComponent } from 'preact';
3
-
4
- interface RichTextBlock {
5
- type: string;
6
- data?: any;
7
- }
8
- interface RichTextData {
9
- [key: string]: any;
10
- blocks: any[];
11
- }
12
- type RichTextBlockComponent = FunctionalComponent<any>;
13
- interface RichTextProps {
14
- data: RichTextData;
15
- components?: Record<string, RichTextBlockComponent>;
16
- }
17
- /** Renders data from the "richtext" field. */
18
- declare function RichText(props: RichTextProps): preact.JSX.Element;
19
- declare namespace RichText {
20
- var ParagraphBlock: (props: RichTextParagraphBlockProps) => preact.JSX.Element | null;
21
- var HeadingBlock: (props: RichTextHeadingBlockProps) => preact.JSX.Element | null;
22
- var ListBlock: (props: RichTextListBlockProps) => preact.JSX.Element | null;
23
- var ImageBlock: (props: RichTextImageBlockProps) => preact.JSX.Element | null;
24
- var HtmlBlock: (props: RichTextHtmlBlockProps) => preact.JSX.Element | null;
25
- }
26
- interface RichTextParagraphBlockProps {
27
- type: 'paragraph';
28
- data?: {
29
- text?: string;
30
- };
31
- }
32
- interface RichTextHeadingBlockProps {
33
- type: 'heading';
34
- data?: {
35
- level?: number;
36
- text?: string;
37
- };
38
- }
39
- interface ListItem {
40
- content?: string;
41
- items?: ListItem[];
42
- }
43
- interface RichTextListBlockProps {
44
- type: 'orderedList' | 'unorderedList';
45
- data?: {
46
- style?: 'ordered' | 'unordered';
47
- items?: ListItem[];
48
- };
49
- }
50
- interface RichTextImageBlockProps {
51
- type: 'image';
52
- data?: {
53
- file?: {
54
- url: string;
55
- width: string | number;
56
- height: string | number;
57
- alt: string;
58
- };
59
- };
60
- }
61
- interface RichTextHtmlBlockProps {
62
- type: 'html';
63
- data?: {
64
- html?: string;
65
- };
66
- }
67
-
68
- export { RichText, type RichTextBlock, type RichTextBlockComponent, type RichTextData, type RichTextHeadingBlockProps, type RichTextHtmlBlockProps, type RichTextImageBlockProps, type RichTextListBlockProps, type RichTextParagraphBlockProps, type RichTextProps };
package/dist/richtext.js DELETED
@@ -1,119 +0,0 @@
1
- // core/richtext.tsx
2
- import { useTranslations } from "@blinkk/root";
3
- import { Fragment, jsx, jsxs } from "preact/jsx-runtime";
4
- function RichText(props) {
5
- var _a;
6
- const components = {
7
- heading: RichText.HeadingBlock,
8
- html: RichText.HtmlBlock,
9
- image: RichText.ImageBlock,
10
- orderedList: RichText.ListBlock,
11
- paragraph: RichText.ParagraphBlock,
12
- unorderedList: RichText.ListBlock,
13
- ...props.components
14
- };
15
- const blocks = (((_a = props.data) == null ? void 0 : _a.blocks) || []).filter((block) => {
16
- const blockType = block == null ? void 0 : block.type;
17
- if (!blockType) {
18
- return false;
19
- }
20
- if (!(blockType in components)) {
21
- console.warn(`ignoring unknown richtext type: "${blockType}"`);
22
- return false;
23
- }
24
- return true;
25
- });
26
- return /* @__PURE__ */ jsx(Fragment, { children: blocks.map((block) => {
27
- const Block = components[block.type];
28
- return /* @__PURE__ */ jsx(Block, { ...block });
29
- }) });
30
- }
31
- RichText.ParagraphBlock = (props) => {
32
- var _a;
33
- if (!((_a = props.data) == null ? void 0 : _a.text)) {
34
- return null;
35
- }
36
- const t = useTranslations();
37
- return /* @__PURE__ */ jsx("p", { dangerouslySetInnerHTML: { __html: t(props.data.text) } });
38
- };
39
- RichText.HeadingBlock = (props) => {
40
- var _a;
41
- if (!((_a = props.data) == null ? void 0 : _a.text)) {
42
- return null;
43
- }
44
- const t = useTranslations();
45
- const level = props.data.level || 2;
46
- const Component = `h${level}`;
47
- return /* @__PURE__ */ jsx(Component, { dangerouslySetInnerHTML: { __html: t(props.data.text) } });
48
- };
49
- RichText.ListBlock = (props) => {
50
- var _a, _b, _c;
51
- if (!((_b = (_a = props.data) == null ? void 0 : _a.items) == null ? void 0 : _b.length)) {
52
- return null;
53
- }
54
- let style = (_c = props.data) == null ? void 0 : _c.style;
55
- if (!style) {
56
- style = props.type === "orderedList" ? "ordered" : "unordered";
57
- }
58
- const Component = style === "ordered" ? "ol" : "ul";
59
- const items = props.data.items;
60
- const t = useTranslations();
61
- return /* @__PURE__ */ jsx(Component, { children: items.map((item) => {
62
- var _a2;
63
- if (item.content || ((_a2 = item.items) == null ? void 0 : _a2.length)) {
64
- return /* @__PURE__ */ jsxs("li", { children: [
65
- item.content && /* @__PURE__ */ jsx(
66
- RichText.ParagraphBlock,
67
- {
68
- type: "paragraph",
69
- data: { text: item.content }
70
- }
71
- ),
72
- item.items && item.items.length > 0 && /* @__PURE__ */ jsx(
73
- RichText.ListBlock,
74
- {
75
- type: props.type,
76
- data: { style, items: item.items }
77
- }
78
- )
79
- ] });
80
- }
81
- return null;
82
- }) });
83
- };
84
- RichText.ImageBlock = (props) => {
85
- var _a, _b, _c, _d, _e, _f, _g, _h;
86
- const imageUrl = (_b = (_a = props.data) == null ? void 0 : _a.file) == null ? void 0 : _b.url;
87
- if (!imageUrl) {
88
- return null;
89
- }
90
- const width = toNumber((_d = (_c = props.data) == null ? void 0 : _c.file) == null ? void 0 : _d.width);
91
- const height = toNumber((_f = (_e = props.data) == null ? void 0 : _e.file) == null ? void 0 : _f.height);
92
- const alt = ((_h = (_g = props.data) == null ? void 0 : _g.file) == null ? void 0 : _h.alt) || "";
93
- return /* @__PURE__ */ jsx("img", { src: imageUrl, width, height, alt });
94
- };
95
- RichText.HtmlBlock = (props) => {
96
- var _a;
97
- const html = ((_a = props.data) == null ? void 0 : _a.html) || "";
98
- if (!html) {
99
- return null;
100
- }
101
- return /* @__PURE__ */ jsx("div", { dangerouslySetInnerHTML: { __html: html } });
102
- };
103
- function toNumber(input) {
104
- if (input === void 0) {
105
- return 0;
106
- }
107
- if (typeof input === "number") {
108
- return input;
109
- }
110
- const parsedNumber = parseFloat(input);
111
- if (isNaN(parsedNumber)) {
112
- return 0;
113
- }
114
- return parsedNumber;
115
- }
116
- export {
117
- RichText
118
- };
119
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY29yZS9yaWNodGV4dC50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7dXNlVHJhbnNsYXRpb25zfSBmcm9tICdAYmxpbmtrL3Jvb3QnO1xuaW1wb3J0IHtGdW5jdGlvbmFsQ29tcG9uZW50fSBmcm9tICdwcmVhY3QnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0QmxvY2sge1xuICB0eXBlOiBzdHJpbmc7XG4gIGRhdGE/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHREYXRhIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBibG9ja3M6IGFueVtdO1xufVxuXG5leHBvcnQgdHlwZSBSaWNoVGV4dEJsb2NrQ29tcG9uZW50ID0gRnVuY3Rpb25hbENvbXBvbmVudDxhbnk+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0UHJvcHMge1xuICBkYXRhOiBSaWNoVGV4dERhdGE7XG4gIGNvbXBvbmVudHM/OiBSZWNvcmQ8c3RyaW5nLCBSaWNoVGV4dEJsb2NrQ29tcG9uZW50Pjtcbn1cblxuLyoqIFJlbmRlcnMgZGF0YSBmcm9tIHRoZSBcInJpY2h0ZXh0XCIgZmllbGQuICovXG5leHBvcnQgZnVuY3Rpb24gUmljaFRleHQocHJvcHM6IFJpY2hUZXh0UHJvcHMpIHtcbiAgY29uc3QgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgUmljaFRleHRCbG9ja0NvbXBvbmVudD4gPSB7XG4gICAgaGVhZGluZzogUmljaFRleHQuSGVhZGluZ0Jsb2NrLFxuICAgIGh0bWw6IFJpY2hUZXh0Lkh0bWxCbG9jayxcbiAgICBpbWFnZTogUmljaFRleHQuSW1hZ2VCbG9jayxcbiAgICBvcmRlcmVkTGlzdDogUmljaFRleHQuTGlzdEJsb2NrLFxuICAgIHBhcmFncmFwaDogUmljaFRleHQuUGFyYWdyYXBoQmxvY2ssXG4gICAgdW5vcmRlcmVkTGlzdDogUmljaFRleHQuTGlzdEJsb2NrLFxuICAgIC4uLnByb3BzLmNvbXBvbmVudHMsXG4gIH07XG4gIGNvbnN0IGJsb2NrcyA9IChwcm9wcy5kYXRhPy5ibG9ja3MgfHwgW10pLmZpbHRlcigoYmxvY2spID0+IHtcbiAgICBjb25zdCBibG9ja1R5cGUgPSBibG9jaz8udHlwZTtcbiAgICBpZiAoIWJsb2NrVHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIShibG9ja1R5cGUgaW4gY29tcG9uZW50cykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgaWdub3JpbmcgdW5rbm93biByaWNodGV4dCB0eXBlOiBcIiR7YmxvY2tUeXBlfVwiYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAge2Jsb2Nrcy5tYXAoKGJsb2NrKSA9PiB7XG4gICAgICAgIGNvbnN0IEJsb2NrID0gY29tcG9uZW50c1tibG9jay50eXBlXTtcbiAgICAgICAgcmV0dXJuIDxCbG9jayB7Li4uYmxvY2t9IC8+O1xuICAgICAgfSl9XG4gICAgPC8+XG4gICk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHRQYXJhZ3JhcGhCbG9ja1Byb3BzIHtcbiAgdHlwZTogJ3BhcmFncmFwaCc7XG4gIGRhdGE/OiB7XG4gICAgdGV4dD86IHN0cmluZztcbiAgfTtcbn1cblxuUmljaFRleHQuUGFyYWdyYXBoQmxvY2sgPSAocHJvcHM6IFJpY2hUZXh0UGFyYWdyYXBoQmxvY2tQcm9wcykgPT4ge1xuICBpZiAoIXByb3BzLmRhdGE/LnRleHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB0ID0gdXNlVHJhbnNsYXRpb25zKCk7XG4gIHJldHVybiA8cCBkYW5nZXJvdXNseVNldElubmVySFRNTD17e19faHRtbDogdChwcm9wcy5kYXRhLnRleHQpfX0gLz47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0SGVhZGluZ0Jsb2NrUHJvcHMge1xuICB0eXBlOiAnaGVhZGluZyc7XG4gIGRhdGE/OiB7XG4gICAgbGV2ZWw/OiBudW1iZXI7XG4gICAgdGV4dD86IHN0cmluZztcbiAgfTtcbn1cblxudHlwZSBIZWFkaW5nQ29tcG9uZW50ID0gJ2gxJyB8ICdoMicgfCAnaDMnIHwgJ2g0JyB8ICdoNScgfCAnaDYnO1xuXG5SaWNoVGV4dC5IZWFkaW5nQmxvY2sgPSAocHJvcHM6IFJpY2hUZXh0SGVhZGluZ0Jsb2NrUHJvcHMpID0+IHtcbiAgaWYgKCFwcm9wcy5kYXRhPy50ZXh0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgdCA9IHVzZVRyYW5zbGF0aW9ucygpO1xuICBjb25zdCBsZXZlbCA9IHByb3BzLmRhdGEubGV2ZWwgfHwgMjtcbiAgY29uc3QgQ29tcG9uZW50ID0gYGgke2xldmVsfWAgYXMgSGVhZGluZ0NvbXBvbmVudDtcbiAgcmV0dXJuIDxDb21wb25lbnQgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IHQocHJvcHMuZGF0YS50ZXh0KX19IC8+O1xufTtcblxuaW50ZXJmYWNlIExpc3RJdGVtIHtcbiAgY29udGVudD86IHN0cmluZztcbiAgaXRlbXM/OiBMaXN0SXRlbVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0TGlzdEJsb2NrUHJvcHMge1xuICB0eXBlOiAnb3JkZXJlZExpc3QnIHwgJ3Vub3JkZXJlZExpc3QnO1xuICBkYXRhPzoge1xuICAgIHN0eWxlPzogJ29yZGVyZWQnIHwgJ3Vub3JkZXJlZCc7XG4gICAgaXRlbXM/OiBMaXN0SXRlbVtdO1xuICB9O1xufVxuXG5SaWNoVGV4dC5MaXN0QmxvY2sgPSAocHJvcHM6IFJpY2hUZXh0TGlzdEJsb2NrUHJvcHMpID0+IHtcbiAgaWYgKCFwcm9wcy5kYXRhPy5pdGVtcz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgc3R5bGUgPSBwcm9wcy5kYXRhPy5zdHlsZTtcbiAgaWYgKCFzdHlsZSkge1xuICAgIHN0eWxlID0gcHJvcHMudHlwZSA9PT0gJ29yZGVyZWRMaXN0JyA/ICdvcmRlcmVkJyA6ICd1bm9yZGVyZWQnO1xuICB9XG4gIGNvbnN0IENvbXBvbmVudCA9IHN0eWxlID09PSAnb3JkZXJlZCcgPyAnb2wnIDogJ3VsJztcbiAgY29uc3QgaXRlbXMgPSBwcm9wcy5kYXRhLml0ZW1zO1xuICBjb25zdCB0ID0gdXNlVHJhbnNsYXRpb25zKCk7XG4gIHJldHVybiAoXG4gICAgPENvbXBvbmVudD5cbiAgICAgIHtpdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uY29udGVudCB8fCBpdGVtLml0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICB7aXRlbS5jb250ZW50ICYmIChcbiAgICAgICAgICAgICAgICA8UmljaFRleHQuUGFyYWdyYXBoQmxvY2tcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJwYXJhZ3JhcGhcIlxuICAgICAgICAgICAgICAgICAgZGF0YT17e3RleHQ6IGl0ZW0uY29udGVudH19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAge2l0ZW0uaXRlbXMgJiYgaXRlbS5pdGVtcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgICA8UmljaFRleHQuTGlzdEJsb2NrXG4gICAgICAgICAgICAgICAgICB0eXBlPXtwcm9wcy50eXBlfVxuICAgICAgICAgICAgICAgICAgZGF0YT17e3N0eWxlLCBpdGVtczogaXRlbS5pdGVtc319XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pfVxuICAgIDwvQ29tcG9uZW50PlxuICApO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dEltYWdlQmxvY2tQcm9wcyB7XG4gIHR5cGU6ICdpbWFnZSc7XG4gIGRhdGE/OiB7XG4gICAgZmlsZT86IHtcbiAgICAgIHVybDogc3RyaW5nO1xuICAgICAgd2lkdGg6IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGhlaWdodDogc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgYWx0OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbn1cblxuUmljaFRleHQuSW1hZ2VCbG9jayA9IChwcm9wczogUmljaFRleHRJbWFnZUJsb2NrUHJvcHMpID0+IHtcbiAgY29uc3QgaW1hZ2VVcmwgPSBwcm9wcy5kYXRhPy5maWxlPy51cmw7XG4gIGlmICghaW1hZ2VVcmwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB3aWR0aCA9IHRvTnVtYmVyKHByb3BzLmRhdGE/LmZpbGU/LndpZHRoKTtcbiAgY29uc3QgaGVpZ2h0ID0gdG9OdW1iZXIocHJvcHMuZGF0YT8uZmlsZT8uaGVpZ2h0KTtcbiAgY29uc3QgYWx0ID0gcHJvcHMuZGF0YT8uZmlsZT8uYWx0IHx8ICcnO1xuICByZXR1cm4gPGltZyBzcmM9e2ltYWdlVXJsfSB3aWR0aD17d2lkdGh9IGhlaWdodD17aGVpZ2h0fSBhbHQ9e2FsdH0gLz47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0SHRtbEJsb2NrUHJvcHMge1xuICB0eXBlOiAnaHRtbCc7XG4gIGRhdGE/OiB7XG4gICAgaHRtbD86IHN0cmluZztcbiAgfTtcbn1cblxuUmljaFRleHQuSHRtbEJsb2NrID0gKHByb3BzOiBSaWNoVGV4dEh0bWxCbG9ja1Byb3BzKSA9PiB7XG4gIGNvbnN0IGh0bWwgPSBwcm9wcy5kYXRhPy5odG1sIHx8ICcnO1xuICBpZiAoIWh0bWwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gPGRpdiBkYW5nZXJvdXNseVNldElubmVySFRNTD17e19faHRtbDogaHRtbH19IC8+O1xufTtcblxuZnVuY3Rpb24gdG9OdW1iZXIoaW5wdXQ/OiBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoaW5wdXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG4gIGNvbnN0IHBhcnNlZE51bWJlciA9IHBhcnNlRmxvYXQoaW5wdXQpO1xuICBpZiAoaXNOYU4ocGFyc2VkTnVtYmVyKSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBwYXJzZWROdW1iZXI7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUSx1QkFBc0I7QUEyQzFCLG1CQUdXLEtBdUVILFlBMUVSO0FBdEJHLFNBQVMsU0FBUyxPQUFzQjtBQXJCL0M7QUFzQkUsUUFBTSxhQUFxRDtBQUFBLElBQ3pELFNBQVMsU0FBUztBQUFBLElBQ2xCLE1BQU0sU0FBUztBQUFBLElBQ2YsT0FBTyxTQUFTO0FBQUEsSUFDaEIsYUFBYSxTQUFTO0FBQUEsSUFDdEIsV0FBVyxTQUFTO0FBQUEsSUFDcEIsZUFBZSxTQUFTO0FBQUEsSUFDeEIsR0FBRyxNQUFNO0FBQUEsRUFDWDtBQUNBLFFBQU0sWUFBVSxXQUFNLFNBQU4sbUJBQVksV0FBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVU7QUFDMUQsVUFBTSxZQUFZLCtCQUFPO0FBQ3pCLFFBQUksQ0FBQyxXQUFXO0FBQ2QsYUFBTztBQUFBLElBQ1Q7QUFDQSxRQUFJLEVBQUUsYUFBYSxhQUFhO0FBQzlCLGNBQVEsS0FBSyxvQ0FBb0MsU0FBUyxHQUFHO0FBQzdELGFBQU87QUFBQSxJQUNUO0FBQ0EsV0FBTztBQUFBLEVBQ1QsQ0FBQztBQUNELFNBQ0UsZ0NBQ0csaUJBQU8sSUFBSSxDQUFDLFVBQVU7QUFDckIsVUFBTSxRQUFRLFdBQVcsTUFBTSxJQUFJO0FBQ25DLFdBQU8sb0JBQUMsU0FBTyxHQUFHLE9BQU87QUFBQSxFQUMzQixDQUFDLEdBQ0g7QUFFSjtBQVNBLFNBQVMsaUJBQWlCLENBQUMsVUFBdUM7QUEzRGxFO0FBNERF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