@blinkk/root-cms 1.0.0-rc.12 → 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.12",
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.12"
100
+ "@blinkk/root": "1.0.0-rc.14"
105
101
  },
106
102
  "peerDependencies": {
107
- "@blinkk/root": "1.0.0-rc.12",
103
+ "@blinkk/root": "1.0.0-rc.14",
108
104
  "firebase-admin": ">=11",
109
105
  "firebase-functions": ">=4",
110
106
  "preact": ">=10",
@@ -1,65 +0,0 @@
1
- import * as preact from 'preact';
2
- import { FunctionalComponent } from 'preact';
3
-
4
- interface RichTextData {
5
- [key: string]: any;
6
- blocks: any[];
7
- }
8
-
9
- type RichTextBlockComponent = FunctionalComponent<any>;
10
- interface RichTextProps {
11
- data: RichTextData;
12
- components?: Record<string, RichTextBlockComponent>;
13
- }
14
- /** Renders data from the "richtext" field. */
15
- declare function RichText(props: RichTextProps): preact.JSX.Element;
16
- declare namespace RichText {
17
- var ParagraphBlock: (props: RichTextParagraphBlockProps) => preact.JSX.Element | null;
18
- var HeadingBlock: (props: RichTextHeadingBlockProps) => preact.JSX.Element | null;
19
- var ListBlock: (props: RichTextListBlockProps) => preact.JSX.Element | null;
20
- var ImageBlock: (props: RichTextImageBlockProps) => preact.JSX.Element | null;
21
- var HtmlBlock: (props: RichTextHtmlBlockProps) => preact.JSX.Element | null;
22
- }
23
- interface RichTextParagraphBlockProps {
24
- type: 'paragraph';
25
- data?: {
26
- text?: string;
27
- };
28
- }
29
- interface RichTextHeadingBlockProps {
30
- type: 'heading';
31
- data?: {
32
- level?: number;
33
- text?: string;
34
- };
35
- }
36
- interface ListItem {
37
- content?: string;
38
- items?: ListItem[];
39
- }
40
- interface RichTextListBlockProps {
41
- type: 'orderedList' | 'unorderedList';
42
- data?: {
43
- style?: 'ordered' | 'unordered';
44
- items?: ListItem[];
45
- };
46
- }
47
- interface RichTextImageBlockProps {
48
- type: 'image';
49
- data?: {
50
- file?: {
51
- url: string;
52
- width: string | number;
53
- height: string | number;
54
- alt: string;
55
- };
56
- };
57
- }
58
- interface RichTextHtmlBlockProps {
59
- type: 'html';
60
- data?: {
61
- html?: string;
62
- };
63
- }
64
-
65
- export { RichText, type RichTextBlockComponent, type RichTextHeadingBlockProps, type RichTextHtmlBlockProps, type RichTextImageBlockProps, type RichTextListBlockProps, type RichTextParagraphBlockProps, type RichTextProps };
package/dist/richtext.js DELETED
@@ -1,119 +0,0 @@
1
- // richtext/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,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vcmljaHRleHQvcmljaHRleHQudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQge3VzZVRyYW5zbGF0aW9uc30gZnJvbSAnQGJsaW5ray9yb290JztcbmltcG9ydCB7RnVuY3Rpb25hbENvbXBvbmVudH0gZnJvbSAncHJlYWN0JztcbmltcG9ydCB7UmljaFRleHREYXRhfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgUmljaFRleHRCbG9ja0NvbXBvbmVudCA9IEZ1bmN0aW9uYWxDb21wb25lbnQ8YW55PjtcblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dFByb3BzIHtcbiAgZGF0YTogUmljaFRleHREYXRhO1xuICBjb21wb25lbnRzPzogUmVjb3JkPHN0cmluZywgUmljaFRleHRCbG9ja0NvbXBvbmVudD47XG59XG5cbi8qKiBSZW5kZXJzIGRhdGEgZnJvbSB0aGUgXCJyaWNodGV4dFwiIGZpZWxkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJpY2hUZXh0KHByb3BzOiBSaWNoVGV4dFByb3BzKSB7XG4gIGNvbnN0IGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIFJpY2hUZXh0QmxvY2tDb21wb25lbnQ+ID0ge1xuICAgIGhlYWRpbmc6IFJpY2hUZXh0LkhlYWRpbmdCbG9jayxcbiAgICBodG1sOiBSaWNoVGV4dC5IdG1sQmxvY2ssXG4gICAgaW1hZ2U6IFJpY2hUZXh0LkltYWdlQmxvY2ssXG4gICAgb3JkZXJlZExpc3Q6IFJpY2hUZXh0Lkxpc3RCbG9jayxcbiAgICBwYXJhZ3JhcGg6IFJpY2hUZXh0LlBhcmFncmFwaEJsb2NrLFxuICAgIHVub3JkZXJlZExpc3Q6IFJpY2hUZXh0Lkxpc3RCbG9jayxcbiAgICAuLi5wcm9wcy5jb21wb25lbnRzLFxuICB9O1xuICBjb25zdCBibG9ja3MgPSAocHJvcHMuZGF0YT8uYmxvY2tzIHx8IFtdKS5maWx0ZXIoKGJsb2NrKSA9PiB7XG4gICAgY29uc3QgYmxvY2tUeXBlID0gYmxvY2s/LnR5cGU7XG4gICAgaWYgKCFibG9ja1R5cGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCEoYmxvY2tUeXBlIGluIGNvbXBvbmVudHMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYGlnbm9yaW5nIHVua25vd24gcmljaHRleHQgdHlwZTogXCIke2Jsb2NrVHlwZX1cImApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHtibG9ja3MubWFwKChibG9jaykgPT4ge1xuICAgICAgICBjb25zdCBCbG9jayA9IGNvbXBvbmVudHNbYmxvY2sudHlwZV07XG4gICAgICAgIHJldHVybiA8QmxvY2sgey4uLmJsb2NrfSAvPjtcbiAgICAgIH0pfVxuICAgIDwvPlxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJpY2hUZXh0UGFyYWdyYXBoQmxvY2tQcm9wcyB7XG4gIHR5cGU6ICdwYXJhZ3JhcGgnO1xuICBkYXRhPzoge1xuICAgIHRleHQ/OiBzdHJpbmc7XG4gIH07XG59XG5cblJpY2hUZXh0LlBhcmFncmFwaEJsb2NrID0gKHByb3BzOiBSaWNoVGV4dFBhcmFncmFwaEJsb2NrUHJvcHMpID0+IHtcbiAgaWYgKCFwcm9wcy5kYXRhPy50ZXh0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgdCA9IHVzZVRyYW5zbGF0aW9ucygpO1xuICByZXR1cm4gPHAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IHQocHJvcHMuZGF0YS50ZXh0KX19IC8+O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dEhlYWRpbmdCbG9ja1Byb3BzIHtcbiAgdHlwZTogJ2hlYWRpbmcnO1xuICBkYXRhPzoge1xuICAgIGxldmVsPzogbnVtYmVyO1xuICAgIHRleHQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbnR5cGUgSGVhZGluZ0NvbXBvbmVudCA9ICdoMScgfCAnaDInIHwgJ2gzJyB8ICdoNCcgfCAnaDUnIHwgJ2g2JztcblxuUmljaFRleHQuSGVhZGluZ0Jsb2NrID0gKHByb3BzOiBSaWNoVGV4dEhlYWRpbmdCbG9ja1Byb3BzKSA9PiB7XG4gIGlmICghcHJvcHMuZGF0YT8udGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHQgPSB1c2VUcmFuc2xhdGlvbnMoKTtcbiAgY29uc3QgbGV2ZWwgPSBwcm9wcy5kYXRhLmxldmVsIHx8IDI7XG4gIGNvbnN0IENvbXBvbmVudCA9IGBoJHtsZXZlbH1gIGFzIEhlYWRpbmdDb21wb25lbnQ7XG4gIHJldHVybiA8Q29tcG9uZW50IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiB0KHByb3BzLmRhdGEudGV4dCl9fSAvPjtcbn07XG5cbmludGVyZmFjZSBMaXN0SXRlbSB7XG4gIGNvbnRlbnQ/OiBzdHJpbmc7XG4gIGl0ZW1zPzogTGlzdEl0ZW1bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dExpc3RCbG9ja1Byb3BzIHtcbiAgdHlwZTogJ29yZGVyZWRMaXN0JyB8ICd1bm9yZGVyZWRMaXN0JztcbiAgZGF0YT86IHtcbiAgICBzdHlsZT86ICdvcmRlcmVkJyB8ICd1bm9yZGVyZWQnO1xuICAgIGl0ZW1zPzogTGlzdEl0ZW1bXTtcbiAgfTtcbn1cblxuUmljaFRleHQuTGlzdEJsb2NrID0gKHByb3BzOiBSaWNoVGV4dExpc3RCbG9ja1Byb3BzKSA9PiB7XG4gIGlmICghcHJvcHMuZGF0YT8uaXRlbXM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGV0IHN0eWxlID0gcHJvcHMuZGF0YT8uc3R5bGU7XG4gIGlmICghc3R5bGUpIHtcbiAgICBzdHlsZSA9IHByb3BzLnR5cGUgPT09ICdvcmRlcmVkTGlzdCcgPyAnb3JkZXJlZCcgOiAndW5vcmRlcmVkJztcbiAgfVxuICBjb25zdCBDb21wb25lbnQgPSBzdHlsZSA9PT0gJ29yZGVyZWQnID8gJ29sJyA6ICd1bCc7XG4gIGNvbnN0IGl0ZW1zID0gcHJvcHMuZGF0YS5pdGVtcztcbiAgY29uc3QgdCA9IHVzZVRyYW5zbGF0aW9ucygpO1xuICByZXR1cm4gKFxuICAgIDxDb21wb25lbnQ+XG4gICAgICB7aXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmNvbnRlbnQgfHwgaXRlbS5pdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAge2l0ZW0uY29udGVudCAmJiAoXG4gICAgICAgICAgICAgICAgPFJpY2hUZXh0LlBhcmFncmFwaEJsb2NrXG4gICAgICAgICAgICAgICAgICB0eXBlPVwicGFyYWdyYXBoXCJcbiAgICAgICAgICAgICAgICAgIGRhdGE9e3t0ZXh0OiBpdGVtLmNvbnRlbnR9fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIHtpdGVtLml0ZW1zICYmIGl0ZW0uaXRlbXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgICAgPFJpY2hUZXh0Lkxpc3RCbG9ja1xuICAgICAgICAgICAgICAgICAgdHlwZT17cHJvcHMudHlwZX1cbiAgICAgICAgICAgICAgICAgIGRhdGE9e3tzdHlsZSwgaXRlbXM6IGl0ZW0uaXRlbXN9fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KX1cbiAgICA8L0NvbXBvbmVudD5cbiAgKTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmljaFRleHRJbWFnZUJsb2NrUHJvcHMge1xuICB0eXBlOiAnaW1hZ2UnO1xuICBkYXRhPzoge1xuICAgIGZpbGU/OiB7XG4gICAgICB1cmw6IHN0cmluZztcbiAgICAgIHdpZHRoOiBzdHJpbmcgfCBudW1iZXI7XG4gICAgICBoZWlnaHQ6IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGFsdDogc3RyaW5nO1xuICAgIH07XG4gIH07XG59XG5cblJpY2hUZXh0LkltYWdlQmxvY2sgPSAocHJvcHM6IFJpY2hUZXh0SW1hZ2VCbG9ja1Byb3BzKSA9PiB7XG4gIGNvbnN0IGltYWdlVXJsID0gcHJvcHMuZGF0YT8uZmlsZT8udXJsO1xuICBpZiAoIWltYWdlVXJsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgd2lkdGggPSB0b051bWJlcihwcm9wcy5kYXRhPy5maWxlPy53aWR0aCk7XG4gIGNvbnN0IGhlaWdodCA9IHRvTnVtYmVyKHByb3BzLmRhdGE/LmZpbGU/LmhlaWdodCk7XG4gIGNvbnN0IGFsdCA9IHByb3BzLmRhdGE/LmZpbGU/LmFsdCB8fCAnJztcbiAgcmV0dXJuIDxpbWcgc3JjPXtpbWFnZVVybH0gd2lkdGg9e3dpZHRofSBoZWlnaHQ9e2hlaWdodH0gYWx0PXthbHR9IC8+O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBSaWNoVGV4dEh0bWxCbG9ja1Byb3BzIHtcbiAgdHlwZTogJ2h0bWwnO1xuICBkYXRhPzoge1xuICAgIGh0bWw/OiBzdHJpbmc7XG4gIH07XG59XG5cblJpY2hUZXh0Lkh0bWxCbG9jayA9IChwcm9wczogUmljaFRleHRIdG1sQmxvY2tQcm9wcykgPT4ge1xuICBjb25zdCBodG1sID0gcHJvcHMuZGF0YT8uaHRtbCB8fCAnJztcbiAgaWYgKCFodG1sKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIDxkaXYgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGh0bWx9fSAvPjtcbn07XG5cbmZ1bmN0aW9uIHRvTnVtYmVyKGlucHV0Pzogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuICBjb25zdCBwYXJzZWROdW1iZXIgPSBwYXJzZUZsb2F0KGlucHV0KTtcbiAgaWYgKGlzTmFOKHBhcnNlZE51bWJlcikpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gcGFyc2VkTnVtYmVyO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVEsdUJBQXNCO0FBa0MxQixtQkFHVyxLQXVFSCxZQTFFUjtBQXRCRyxTQUFTLFNBQVMsT0FBc0I7QUFaL0M7QUFhRSxRQUFNLGFBQXFEO0FBQUEsSUFDekQsU0FBUyxTQUFTO0FBQUEsSUFDbEIsTUFBTSxTQUFTO0FBQUEsSUFDZixPQUFPLFNBQVM7QUFBQSxJQUNoQixhQUFhLFNBQVM7QUFBQSxJQUN0QixXQUFXLFNBQVM7QUFBQSxJQUNwQixlQUFlLFNBQVM7QUFBQSxJQUN4QixHQUFHLE1BQU07QUFBQSxFQUNYO0FBQ0EsUUFBTSxZQUFVLFdBQU0sU0FBTixtQkFBWSxXQUFVLENBQUMsR0FBRyxPQUFPLENBQUMsVUFBVTtBQUMxRCxVQUFNLFlBQVksK0JBQU87QUFDekIsUUFBSSxDQUFDLFdBQVc7QUFDZCxhQUFPO0FBQUEsSUFDVDtBQUNBLFFBQUksRUFBRSxhQUFhLGFBQWE7QUFDOUIsY0FBUSxLQUFLLG9DQUFvQyxTQUFTLEdBQUc7QUFDN0QsYUFBTztBQUFBLElBQ1Q7QUFDQSxXQUFPO0FBQUEsRUFDVCxDQUFDO0FBQ0QsU0FDRSxnQ0FDRyxpQkFBTyxJQUFJLENBQUMsVUFBVTtBQUNyQixVQUFNLFFBQVEsV0FBVyxNQUFNLElBQUk7QUFDbkMsV0FBTyxvQkFBQyxTQUFPLEdBQUcsT0FBTztBQUFBLEVBQzNCLENBQUMsR0FDSDtBQUVKO0FBU0EsU0FBUyxpQkFBaUIsQ0FBQyxVQUF1QztBQWxEbEU7QUFtREUsTUFBSSxHQUFDLFdBQU0sU0FBTixtQkFBWSxPQUFNO0FBQ3JCLFdBQU87QUFBQSxFQUNUO0FBQ0EsUUFBTSxJQUFJLGdCQUFnQjtBQUMxQixTQUFPLG9CQUFDLE9BQUUseUJBQXlCLEVB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
File without changes
File without changes
File without changes