From ab407cdbcbb47c97a0b7bb21df28a9283a153c95 Mon Sep 17 00:00:00 2001 From: Anand987 Date: Sun, 6 Jun 2021 17:43:04 +0530 Subject: [PATCH] Merge branch 'master' of https://github.com/Anand987/deep_learning_pipeline-train-inference- --- application/frontend/package-lock.json | 63 ++++++ application/frontend/package.json | 1 + application/frontend/src/App.js | 4 + .../src/components/utils/FileContext.js | 0 application/frontend/src/pages/Editor.js | 19 -- application/frontend/src/pages/FileEditor.js | 41 ++++ .../frontend/src/pages/RichTextEditor.css | 63 ++++++ .../frontend/src/pages/RichTextEditor.js | 197 ++++++++++++++++++ application/frontend/src/pages/hello.txt | 7 + .../apis/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 201 bytes .../apis/__pycache__/admin.cpython-39.pyc | Bin 0 -> 242 bytes .../apis/__pycache__/apps.cpython-39.pyc | Bin 0 -> 474 bytes .../apis/__pycache__/models.cpython-39.pyc | Bin 0 -> 1476 bytes .../__pycache__/serializers.cpython-39.pyc | Bin 0 -> 1043 bytes .../apis/__pycache__/urls.cpython-39.pyc | Bin 0 -> 400 bytes .../apis/__pycache__/views.cpython-39.pyc | Bin 0 -> 3022 bytes .../__pycache__/0001_initial.cpython-39.pyc | Bin 0 -> 859 bytes .../__pycache__/0002_post.cpython-39.pyc | Bin 0 -> 807 bytes .../0003_alter_post_image.cpython-39.pyc | Bin 0 -> 634 bytes ...ename_image_post_file_data1.cpython-39.pyc | Bin 0 -> 613 bytes ...e_file_data1_post_file_data.cpython-39.pyc | Bin 0 -> 633 bytes .../0006_auto_20210531_0203.cpython-39.pyc | Bin 0 -> 1018 bytes .../0007_auto_20210531_0341.cpython-39.pyc | Bin 0 -> 1094 bytes .../0008_auto_20210603_1117.cpython-39.pyc | Bin 0 -> 988 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 212 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 216 bytes .../__pycache__/settings.cpython-39.pyc | Bin 0 -> 2514 bytes .../__pycache__/urls.cpython-39.pyc | Bin 0 -> 1055 bytes .../__pycache__/wsgi.cpython-39.pyc | Bin 0 -> 643 bytes 29 files changed, 376 insertions(+), 19 deletions(-) create mode 100644 application/frontend/src/components/utils/FileContext.js delete mode 100644 application/frontend/src/pages/Editor.js create mode 100644 application/frontend/src/pages/FileEditor.js create mode 100644 application/frontend/src/pages/RichTextEditor.css create mode 100644 application/frontend/src/pages/RichTextEditor.js create mode 100644 application/frontend/src/pages/hello.txt create mode 100644 training_controller/apis/__pycache__/__init__.cpython-39.pyc create mode 100644 training_controller/apis/__pycache__/admin.cpython-39.pyc create mode 100644 training_controller/apis/__pycache__/apps.cpython-39.pyc create mode 100644 training_controller/apis/__pycache__/models.cpython-39.pyc create mode 100644 training_controller/apis/__pycache__/serializers.cpython-39.pyc create mode 100644 training_controller/apis/__pycache__/urls.cpython-39.pyc create mode 100644 training_controller/apis/__pycache__/views.cpython-39.pyc create mode 100644 training_controller/apis/migrations/__pycache__/0001_initial.cpython-39.pyc create mode 100644 training_controller/apis/migrations/__pycache__/0002_post.cpython-39.pyc create mode 100644 training_controller/apis/migrations/__pycache__/0003_alter_post_image.cpython-39.pyc create mode 100644 training_controller/apis/migrations/__pycache__/0004_rename_image_post_file_data1.cpython-39.pyc create mode 100644 training_controller/apis/migrations/__pycache__/0005_rename_file_data1_post_file_data.cpython-39.pyc create mode 100644 training_controller/apis/migrations/__pycache__/0006_auto_20210531_0203.cpython-39.pyc create mode 100644 training_controller/apis/migrations/__pycache__/0007_auto_20210531_0341.cpython-39.pyc create mode 100644 training_controller/apis/migrations/__pycache__/0008_auto_20210603_1117.cpython-39.pyc create mode 100644 training_controller/apis/migrations/__pycache__/__init__.cpython-39.pyc create mode 100644 training_controller/training_controller/__pycache__/__init__.cpython-39.pyc create mode 100644 training_controller/training_controller/__pycache__/settings.cpython-39.pyc create mode 100644 training_controller/training_controller/__pycache__/urls.cpython-39.pyc create mode 100644 training_controller/training_controller/__pycache__/wsgi.cpython-39.pyc diff --git a/application/frontend/package-lock.json b/application/frontend/package-lock.json index 8bb11a7e..04bf6f7e 100644 --- a/application/frontend/package-lock.json +++ b/application/frontend/package-lock.json @@ -4537,6 +4537,14 @@ "sha.js": "^2.4.8" } }, + "cross-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "requires": { + "node-fetch": "2.6.1" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -5323,6 +5331,16 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, + "draft-js": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.11.7.tgz", + "integrity": "sha512-ne7yFfN4sEL82QPQEn80xnADR8/Q6ALVworbC5UOSzOvjffmYfFsr3xSZtxbIirti14R7Y33EZC5rivpLgIbsg==", + "requires": { + "fbjs": "^2.0.0", + "immutable": "~3.7.4", + "object-assign": "^4.1.1" + } + }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -6601,6 +6619,36 @@ "bser": "2.1.1" } }, + "fbjs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-2.0.0.tgz", + "integrity": "sha512-8XA8ny9ifxrAWlyhAbexXcs3rRMtxWcs3M0lctLfB49jRDHiaxj+Mo0XxbwE7nKZYzgCFoq64FS+WFd4IycPPQ==", + "requires": { + "core-js": "^3.6.4", + "cross-fetch": "^3.0.4", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + }, + "dependencies": { + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + } + } + }, + "fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", @@ -7654,6 +7702,11 @@ "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==" }, + "immutable": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", + "integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks=" + }, "import-cwd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", @@ -10500,6 +10553,11 @@ } } }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, "node-forge": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", @@ -14976,6 +15034,11 @@ "is-typedarray": "^1.0.0" } }, + "ua-parser-js": { + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==" + }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", diff --git a/application/frontend/package.json b/application/frontend/package.json index 53b6e304..9a89e987 100644 --- a/application/frontend/package.json +++ b/application/frontend/package.json @@ -9,6 +9,7 @@ "@testing-library/user-event": "^12.8.3", "axios": "^0.21.1", "bootstrap": "^4.3.1", + "draft-js": "^0.11.7", "react": "^17.0.2", "react-dom": "^17.0.2", "react-router-dom": "^5.2.0", diff --git a/application/frontend/src/App.js b/application/frontend/src/App.js index 2cba908d..eab03f7f 100644 --- a/application/frontend/src/App.js +++ b/application/frontend/src/App.js @@ -4,6 +4,7 @@ import "./App.css"; import Layout from "./components/layout/Layout"; import HomePage from "./pages/HomePage"; import ModelPage from "./pages/ModelPage"; +import FileEditor from "./pages/FileEditor"; const App = () => { return ( @@ -15,6 +16,9 @@ const App = () => { + + + ); diff --git a/application/frontend/src/components/utils/FileContext.js b/application/frontend/src/components/utils/FileContext.js new file mode 100644 index 00000000..e69de29b diff --git a/application/frontend/src/pages/Editor.js b/application/frontend/src/pages/Editor.js deleted file mode 100644 index e26be95f..00000000 --- a/application/frontend/src/pages/Editor.js +++ /dev/null @@ -1,19 +0,0 @@ -import axios from "axios"; -import { useEffect, useState } from "react"; -import API from "../components/utils/API"; - -const Editor = (props) => { - const [data, setData] = useState(""); - - useEffect(() => { - const response = axios({ - url: `${API}/file/:filename`, - }); - const data = response.data; - setData(data); - }, []); - - return
{data}
; -}; - -export default Editor; diff --git a/application/frontend/src/pages/FileEditor.js b/application/frontend/src/pages/FileEditor.js new file mode 100644 index 00000000..1c0539c6 --- /dev/null +++ b/application/frontend/src/pages/FileEditor.js @@ -0,0 +1,41 @@ +import React from "react"; +import ReactDOM from "react-dom"; +import { ContentState, convertToRaw, Editor, EditorState } from "draft-js"; +import file from "./hello.txt"; + +const FileEditor = (props) => { + let _contentState = ContentState.createFromText(file); + const raw = convertToRaw(_contentState); + const [contentState, setContentState] = React.useState(raw); + + const [editorState, setEditorState] = React.useState( + EditorState.createWithContent() + ); + + const editor = React.useRef(null); + + function focusEditor() { + editor.current.focus(); + } + + React.useEffect(() => { + focusEditor(); + }, []); + + return ( +
+

Config File

+
+ setEditorState(editorState)} + /> +
+
+ ); +}; + +export default FileEditor; diff --git a/application/frontend/src/pages/RichTextEditor.css b/application/frontend/src/pages/RichTextEditor.css new file mode 100644 index 00000000..deee6dec --- /dev/null +++ b/application/frontend/src/pages/RichTextEditor.css @@ -0,0 +1,63 @@ +RichEditor-root { + background: #fff; + border: 1px solid #ddd; + font-family: "Georgia", serif; + font-size: 14px; + padding: 15px; +} + +.RichEditor-editor { + border-top: 1px solid #ddd; + cursor: text; + font-size: 16px; + margin-top: 10px; +} + +.RichEditor-editor .public-DraftEditorPlaceholder-root, +.RichEditor-editor .public-DraftEditor-content { + margin: 0 -15px -15px; + padding: 15px; +} + +.RichEditor-editor .public-DraftEditor-content { + min-height: 100px; +} + +.RichEditor-hidePlaceholder .public-DraftEditorPlaceholder-root { + display: none; +} + +.RichEditor-editor .RichEditor-blockquote { + border-left: 5px solid #eee; + color: #666; + font-family: "Hoefler Text", "Georgia", serif; + font-style: italic; + margin: 16px 0; + padding: 10px 20px; +} + +.RichEditor-editor .public-DraftStyleDefault-pre { + background-color: rgba(0, 0, 0, 0.05); + font-family: "Inconsolata", "Menlo", "Consolas", monospace; + font-size: 16px; + padding: 20px; +} + +.RichEditor-controls { + font-family: "Helvetica", sans-serif; + font-size: 14px; + margin-bottom: 5px; + user-select: none; +} + +.RichEditor-styleButton { + color: #999; + cursor: pointer; + margin-right: 16px; + padding: 2px 0; + display: inline-block; +} + +.RichEditor-activeButton { + color: #5890ff; +} diff --git a/application/frontend/src/pages/RichTextEditor.js b/application/frontend/src/pages/RichTextEditor.js new file mode 100644 index 00000000..93c60c27 --- /dev/null +++ b/application/frontend/src/pages/RichTextEditor.js @@ -0,0 +1,197 @@ +import React from "react"; +import { Editor, EditorState, RichUtils, getDefaultKeyBinding } from "draft-js"; +import "./RichTextEditor.css"; + +class RichTextEditor extends React.Component { + constructor(props) { + super(props); + this.state = { editorState: EditorState.createEmpty() }; + + this.focus = () => this.refs.editor.focus(); + this.onChange = (editorState) => this.setState({ editorState }); + + this.handleKeyCommand = this._handleKeyCommand.bind(this); + this.mapKeyToEditorCommand = this._mapKeyToEditorCommand.bind(this); + this.toggleBlockType = this._toggleBlockType.bind(this); + this.toggleInlineStyle = this._toggleInlineStyle.bind(this); + } + + _handleKeyCommand(command, editorState) { + const newState = RichUtils.handleKeyCommand(editorState, command); + if (newState) { + this.onChange(newState); + return true; + } + return false; + } + + _mapKeyToEditorCommand(e) { + if (e.keyCode === 9 /* TAB */) { + const newEditorState = RichUtils.onTab( + e, + this.state.editorState, + 4 /* maxDepth */ + ); + if (newEditorState !== this.state.editorState) { + this.onChange(newEditorState); + } + return; + } + return getDefaultKeyBinding(e); + } + + _toggleBlockType(blockType) { + this.onChange(RichUtils.toggleBlockType(this.state.editorState, blockType)); + } + + _toggleInlineStyle(inlineStyle) { + this.onChange( + RichUtils.toggleInlineStyle(this.state.editorState, inlineStyle) + ); + } + + render() { + const { editorState } = this.state; + + // If the user changes block type before entering any text, we can + // either style the placeholder or hide it. Let's just hide it now. + let className = "RichEditor-editor"; + var contentState = editorState.getCurrentContent(); + if (!contentState.hasText()) { + if (contentState.getBlockMap().first().getType() !== "unstyled") { + className += " RichEditor-hidePlaceholder"; + } + } + + return ( +
+ + +
+ +
+
+ ); + } +} + +// Custom overrides for "code" style. +const styleMap = { + CODE: { + backgroundColor: "rgba(0, 0, 0, 0.05)", + fontFamily: '"Inconsolata", "Menlo", "Consolas", monospace', + fontSize: 16, + padding: 2, + }, +}; + +function getBlockStyle(block) { + switch (block.getType()) { + case "blockquote": + return "RichEditor-blockquote"; + default: + return null; + } +} + +class StyleButton extends React.Component { + constructor() { + super(); + this.onToggle = (e) => { + e.preventDefault(); + this.props.onToggle(this.props.style); + }; + } + + render() { + let className = "RichEditor-styleButton"; + if (this.props.active) { + className += " RichEditor-activeButton"; + } + + return ( + + {this.props.label} + + ); + } +} + +const BLOCK_TYPES = [ + { label: "H1", style: "header-one" }, + { label: "H2", style: "header-two" }, + { label: "H3", style: "header-three" }, + { label: "H4", style: "header-four" }, + { label: "H5", style: "header-five" }, + { label: "H6", style: "header-six" }, + { label: "Blockquote", style: "blockquote" }, + { label: "UL", style: "unordered-list-item" }, + { label: "OL", style: "ordered-list-item" }, + { label: "Code Block", style: "code-block" }, +]; + +const BlockStyleControls = (props) => { + const { editorState } = props; + const selection = editorState.getSelection(); + const blockType = editorState + .getCurrentContent() + .getBlockForKey(selection.getStartKey()) + .getType(); + + return ( +
+ {BLOCK_TYPES.map((type) => ( + + ))} +
+ ); +}; + +var INLINE_STYLES = [ + { label: "Bold", style: "BOLD" }, + { label: "Italic", style: "ITALIC" }, + { label: "Underline", style: "UNDERLINE" }, + { label: "Monospace", style: "CODE" }, +]; + +const InlineStyleControls = (props) => { + const currentStyle = props.editorState.getCurrentInlineStyle(); + + return ( +
+ {INLINE_STYLES.map((type) => ( + + ))} +
+ ); +}; + +export default RichTextEditor; diff --git a/application/frontend/src/pages/hello.txt b/application/frontend/src/pages/hello.txt new file mode 100644 index 00000000..e18fcf01 --- /dev/null +++ b/application/frontend/src/pages/hello.txt @@ -0,0 +1,7 @@ + Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestiae vitae recusandae ea atque eaque aliquid, dolore laboriosam? A quis eaque hic, asperiores consequatur sint temporibus inventore, vel minus mollitia minima eius neque deserunt. Amet asperiores et dolore corporis earum, fugit impedit, a alias architecto eaque doloribus tempora nesciunt hic! Mollitia commodi nobis error impedit veniam necessitatibus quaerat nam amet nostrum hic, doloremque earum, quasi, libero itaque. Sapiente, numquam. Blanditiis odit voluptate quidem beatae magni quasi officiis! Unde iste cumque similique inventore earum. Incidunt, omnis odit exercitationem aspernatur eaque dolor iste maiores in officiis, aliquid, illo cumque facilis voluptatum similique repudiandae. + Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestiae vitae recusandae ea atque eaque aliquid, dolore laboriosam? A quis eaque hic, asperiores consequatur sint temporibus inventore, vel minus mollitia minima eius neque deserunt. Amet asperiores et dolore corporis earum, fugit impedit, a alias architecto eaque doloribus tempora nesciunt hic! Mollitia commodi nobis error impedit veniam necessitatibus quaerat nam amet nostrum hic, doloremque earum, quasi, libero itaque. Sapiente, numquam. Blanditiis odit voluptate quidem beatae magni quasi officiis! Unde iste cumque similique inventore earum. Incidunt, omnis odit exercitationem aspernatur eaque dolor iste maiores in officiis, aliquid, illo cumque facilis voluptatum similique repudiandae. + Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestiae vitae recusandae ea atque eaque aliquid, dolore laboriosam? A quis eaque hic, asperiores consequatur sint temporibus inventore, vel minus mollitia minima eius neque deserunt. Amet asperiores et dolore corporis earum, fugit impedit, a alias architecto eaque doloribus tempora nesciunt hic! Mollitia commodi nobis error impedit veniam necessitatibus quaerat nam amet nostrum hic, doloremque earum, quasi, libero itaque. Sapiente, numquam. Blanditiis odit voluptate quidem beatae magni quasi officiis! Unde iste cumque similique inventore earum. Incidunt, omnis odit exercitationem aspernatur eaque dolor iste maiores in officiis, aliquid, illo cumque facilis voluptatum similique repudiandae. + Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestiae vitae recusandae ea atque eaque aliquid, dolore laboriosam? A quis eaque hic, asperiores consequatur sint temporibus inventore, vel minus mollitia minima eius neque deserunt. Amet asperiores et dolore corporis earum, fugit impedit, a alias architecto eaque doloribus tempora nesciunt hic! Mollitia commodi nobis error impedit veniam necessitatibus quaerat nam amet nostrum hic, doloremque earum, quasi, libero itaque. Sapiente, numquam. Blanditiis odit voluptate quidem beatae magni quasi officiis! Unde iste cumque similique inventore earum. Incidunt, omnis odit exercitationem aspernatur eaque dolor iste maiores in officiis, aliquid, illo cumque facilis voluptatum similique repudiandae. + Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestiae vitae recusandae ea atque eaque aliquid, dolore laboriosam? A quis eaque hic, asperiores consequatur sint temporibus inventore, vel minus mollitia minima eius neque deserunt. Amet asperiores et dolore corporis earum, fugit impedit, a alias architecto eaque doloribus tempora nesciunt hic! Mollitia commodi nobis error impedit veniam necessitatibus quaerat nam amet nostrum hic, doloremque earum, quasi, libero itaque. Sapiente, numquam. Blanditiis odit voluptate quidem beatae magni quasi officiis! Unde iste cumque similique inventore earum. Incidunt, omnis odit exercitationem aspernatur eaque dolor iste maiores in officiis, aliquid, illo cumque facilis voluptatum similique repudiandae. + Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestiae vitae recusandae ea atque eaque aliquid, dolore laboriosam? A quis eaque hic, asperiores consequatur sint temporibus inventore, vel minus mollitia minima eius neque deserunt. Amet asperiores et dolore corporis earum, fugit impedit, a alias architecto eaque doloribus tempora nesciunt hic! Mollitia commodi nobis error impedit veniam necessitatibus quaerat nam amet nostrum hic, doloremque earum, quasi, libero itaque. Sapiente, numquam. Blanditiis odit voluptate quidem beatae magni quasi officiis! Unde iste cumque similique inventore earum. Incidunt, omnis odit exercitationem aspernatur eaque dolor iste maiores in officiis, aliquid, illo cumque facilis voluptatum similique repudiandae. + Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestiae vitae recusandae ea atque eaque aliquid, dolore laboriosam? A quis eaque hic, asperiores consequatur sint temporibus inventore, vel minus mollitia minima eius neque deserunt. Amet asperiores et dolore corporis earum, fugit impedit, a alias architecto eaque doloribus tempora nesciunt hic! Mollitia commodi nobis error impedit veniam necessitatibus quaerat nam amet nostrum hic, doloremque earum, quasi, libero itaque. Sapiente, numquam. Blanditiis odit voluptate quidem beatae magni quasi officiis! Unde iste cumque similique inventore earum. Incidunt, omnis odit exercitationem aspernatur eaque dolor iste maiores in officiis, aliquid, illo cumque facilis voluptatum similique repudiandae. diff --git a/training_controller/apis/__pycache__/__init__.cpython-39.pyc b/training_controller/apis/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..101422a25957d5b64a9c636ed0981a62378eeee8 GIT binary patch literal 201 zcmYe~<>g`kf{ulI5qruypOA6ke{cYdrV4dYC(KXYGP4dW?p)HL1sZ}PG(-JZb?yM zW}a?lURr8VYF=`xZVXreq$D{%ucRnHCnvQiCb1y1I3_+mGcU6wK3=b&@)n0pZhlH> NPO2Tq9iM@i0RX%?H&Flp literal 0 HcmV?d00001 diff --git a/training_controller/apis/__pycache__/admin.cpython-39.pyc b/training_controller/apis/__pycache__/admin.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b6738027a54c28511542f3cc6713d2c548c511d GIT binary patch literal 242 zcmYe~<>g`kf{ulI5}bhaV-N=!FabFZKwK;UBvKes7;_kM8KW2(8B&;n88n$+0!0}# z8E>&BrsQVk`Drpm@ug%X=B4NBCFkdr6lEqAfecv5P{a(Rz{Ia?7ps_nqWrAXj%;FfZYxD{#Z*kb<=BJeAq}nk8?f(qK3;+(w BLY@Es literal 0 HcmV?d00001 diff --git a/training_controller/apis/__pycache__/apps.cpython-39.pyc b/training_controller/apis/__pycache__/apps.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa14783423af48e8cda8a35fcdf1f6cf8bc77c87 GIT binary patch literal 474 zcmYjOy-ve05Vn(4YD>EyRwUL8%>y8W8rpzBC{%?hieyaeMy_1P*vSAZ49vU%Bk#bI zWM$$Nm^inU=t=kae!e^3*>pJUBapX`ulsj6zn!xy0XSn&dj!A`!xF7r52(rTx3@;IAc(I0Kid(8G>q@`OM1#=0lgD?Z;Z! zP5tvBTT)e45qpSM730!IXQGUox;htJvMiuLO~X#xB}CB`C#3BY0?bA_dqBuzL*+KJ z&-j8ivL+Pj$-*^g1DE?mrU&D!;dePb&S$1t@}jo+Y<_cRTiqL52VETC kbtDb_c5l14V;av5=eYl4ZY=kEZTDoe@2PuR>$n5|58nuTQvd(} literal 0 HcmV?d00001 diff --git a/training_controller/apis/__pycache__/models.cpython-39.pyc b/training_controller/apis/__pycache__/models.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..addcc761bd283a1a6c9bd79d097f8e4ec8f96fe4 GIT binary patch literal 1476 zcmZ`(&2k$>5T4mT?XD#|I29m3K`tCbm7NQhP!tu)aZ*qqTp_0|RSjeHNM2>NyXhSj z*o2dF;lMj2$Giato@B0^@(P^j9tl|lGSc+){Paxs*I%z5401v3*B5{M@OvV}pFG)a z5l!w=?|=jdkd;`-LQ2+yDkuU!hDGSdsE8nh=$R;Dh#{ddfgYqZ_8thxAb%zxH*%g{ zhDAmzJJ6?<{(2>c;CnF~yrP%HP`YH%fT_CCMDoJAu^v)CqTcmMfVASNxRmb*vJFNT zdE0bWfwuZK-4S*cY3MIIGtr$<_PjMO1;%9fS9R~R@d-9_GqK(Hxm-RtePYs%SVh+ZBfsag@+G0~x2FJQB zyYVW7!}i==Cl^pbiS%59=c?8A>;n!WAR#37NKU-Yb84(J`aaUPNufC9B_VI+Ja`_0 zd@5fsUcty^o0x}@i(4#f>w>0p5kKOhc~jQIz@=r~Sxx>TU+Xbg3Cg>0I}OF zTIl$YkZFLsG``t0-Ua!baxlO0=wff<(e0mqp+7yJOdDKi>mMHmI3PQhPRq*FdSPDo z=Ee-0WvfmpXP}mC)o4(*`Iv0}!Rsydiu%7AGvhAxZcM_6LV_p)6V4-$5d0>KcuP;V z^d9M{$snXN`If%3rS~C%n3z0(gi!Cf{9C4{Iw88f0(y>UmM`>AM3;JI&t6KGZT$WZ zgPFxXuM9mQ$J~`8x*@iutqdtqXR7JzsPvQ~J}dPpS*>xn*uQe)aJ@Ym?z&Vd##Jeo zD@80^R;>4xda~5jY6qENE;~BYc)v6i_{HJnqT!qL8;68~@sCUe!H0;aGFYtSBPV~EE zu$^cVgQO%T{!yM`DsHvyrOtITOTX=(PM#CPyMZ?ojs`NG0-oxZ^UI>w4B4!s!awgi=MH1ec($p;;h*XML6Xg7R;;*eB12=&$*| b_gwn1<5kA#Ha!YzmN0V;%wnoxmgh}xc3E16Y1sa%}h)ZPlwYq{_k z9QzJDiLadc3Y?g6fJ9A-YRRLW&)&~7-+V=<(_*;3egE-sH(=~1CCe+qWDmFPV~|X8 z&89r#oXJ3jI+%u8IE}K1vjZk08GmIm27VS_g;|0~A{&S_{vZvR98o4J(w_rd1_x1`UmEtKMFHu66MUrQ+43I3me0B%f&LPx=YY0(jEyS>! zxKxO;n1T?lCB(Fn7ubn#Z6VGt3OzqDB(jU~5VT7s3beG>%yba-;n#V8Hy@em492z1 zM@Jvt4fan&e=rz{_k-6*!?(kOTmsC5hQgGpJQXuF1FcHv)uvEoPn8oeP>!LOdw{Nt ztFktg)?o5trfj}6jGfsR7f~Z^tiV!nDUZ0>!jIu~WKycDNr9~6;YF?UuT45gFl^wq z=qqIK`HI;0pWpK}b`Utmxr0`S?=!_0|E2V^Gz}~s=Xks87-2)*84_u2|D@Lg+_w}o z+jspym+A1YV3ZHLsoOMQYcVlsqtBK3WJph!c)M8d9YfW)E${AyvAy7iNY<6-(wB2L Pz9OY84Xe$!n-AmPID+Mb literal 0 HcmV?d00001 diff --git a/training_controller/apis/__pycache__/urls.cpython-39.pyc b/training_controller/apis/__pycache__/urls.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64c8d3071a802bf6b27ab46ee579bbe685ee1911 GIT binary patch literal 400 zcmYjM%Sr<=6iucx?bwG4w|+r|)_oCC>?n%Xp)D?kffy#&njw=6$yCulaN$4LrT^fU z%+^)GFAxNiy75BJO=U`==xSE3o9qJ~Ohw5W@l$IKdb(k2Qoh zcik6_!b?1i0J8wR+f_okX?4HGe+2K@N$|ko(L8S# zih&>+GNqZ>Puit2l_7$g%E=@xVA5~Z9hOtMP{XAbMtjyqyNESPc4NDLW39;5#%Klt zvWhE7=BIUw8sg5>9jmhmD$vrrBi(TZ4!-m8D2=tst;VGB^!g$?nUir8#pE(No=(mu zXDI_Hi2$l4mkUzz5(Jkps5Iqrz~voikQofp&A_c>N>*A40Xn56H>t}!ET8J|!2We9 R;Lznap@l9Ey{^CW^9uvBbWH#N literal 0 HcmV?d00001 diff --git a/training_controller/apis/__pycache__/views.cpython-39.pyc b/training_controller/apis/__pycache__/views.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b04c61bd079d864e8889af07282665998771153 GIT binary patch literal 3022 zcmaJ@OLH5?5#HGs79a?M50Q54#E9Zb0wttKMv5KhQC1{MmMfwe5qWruRg)!V04%iF zUC#_eiUpqNOAf011@fq?&pG6fTmHdZbMjxvDc!RmMbefRHNDgG=;zmsjb~?T4m^K9 z`{&>O({!BwB6Ioif%zDQ`Zo~naFRMBLJ7gSo4O;9dUo!m{wSaU%zYlDVF%w~S{X$& z8dYi4u2<4eHb?Vx-p*%0#{ylj^E&8Qq>FYw zn=a8M-r#dzI`jr_@_BeKKXUj2U;NVHi=uww(G}pA_zmE1SpF?OyX&-=OM z=UFf5vxiA4>^6h_avNmUUS9*Qa&PDHpA&HaBIllrQ=RO@Qo~Rns`fCKqjHXRo!jvW ztW`SJV{0KQIp5jtqKW5E0FwyDeHiLrK(up8&YWYS-3d8?tZ8rP4};TCS2#Iy|MC8@ zJ8@4VIN|B)X>H<7V3jz3f$aM5JAvG0%?(F=y6zDB`y40-S;HAt=Wu#BJ8TT+hD|nq zg}HAmMsI=bi|q;8G{w)nIO)hG-MpgngN4 z(GEHPo5VJei{K{q1`8w>%kF^b7ln}T!n(~~N!|n2%z{|! zo(=C^SWX6A@{fs?+Onv zq~;y$d)T?AZE#nlfS)AKSm$9E1)e`4Oz@B6GZ?A`L_0%r>Oz}=b};c#{7d&Z(EcPC z1}B&=Z@UBi&L73ui*_ihaK%*eeG5=CEP&At^h3hQ zOXzwNAKjHZ@b=E2XM(Ff?743{Cj=Z1CIR^?gvaaGx*M>7ZeCh5&e}Ehk(Y)&iJCZ-eJ8dMlko*kKHf=K4>s(Op@bJ)h$*6Cla{yn@kB^rg z!}V#ur~{a>Q`GDmfbBxUTHlp06tLZnOvG3gj|5|;#uyaU7#ck@b;iCJ$7#7EXV6%z z9NH-CKQZfK`3ogiapwah*f=i{tUvi9AisrSQ53oGi|pE)>um{6pV!;8&OGixHhr^l z;my?#iYu@~xOy;bZ7skAJ0jE*@u9ko0}Bjq`=~yxi#4nkxd!Ljgf>tCe3(p20xIoW z(q)~cGmtG&e!!^fPGdAahoNlElcRUvVE0;?0bhOyhvl!3e1znU(fl>+{uPE591)3p z`)%6f!#L~bYif{7-5qNsQL$+Nbl@LaLT(Ro`AlL|%*^!c0KVcRmZu4AA5{iDnmVpZ z{9^^%UPG6zidwUOT@t^H>GHL$5+3RjVpgu50M@qT*VSSx$wbhZ%G)hed=m-c$GUkb l#ujI`yGOq%;rcuL##6Xnhc*S3;5O~Mq`)E4Y~jT literal 0 HcmV?d00001 diff --git a/training_controller/apis/migrations/__pycache__/0001_initial.cpython-39.pyc b/training_controller/apis/migrations/__pycache__/0001_initial.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af4c104f7686f8cfe54d2b6fcd6e83846c1b5e3c GIT binary patch literal 859 zcmYjP&2AGh5VpOWzs;tU(gQa*A?47jToFPoO*4N;QOjy#8cNZ+7QCDst*?YEg{Ga7n6dczq`9M^{G9?czI~w$T8;V(# z^RWR@fwbMis7#nSe+zTlDZwa_st;hpcVN!*61Wx_*tTn!D|y|<&YT+JJx@U=)rD=& zw7Q%DD&*?93#9MamV}9zrIqR79kYfeT7^{e0}~^jJY@@E;J{-FMwOJ&ac);d7Pj zp$-Ri4cpnj5N5gUp=0ef46vf5r#H z;R$~^+&di|jSgc8P@qJ@Xr&Wgr~*=@VXHDi=`E!vV2~ng#SW-L#<{Lco~B@8QK&M$ z`Ec>h&dy`LYH+)loBAg=ah3Pcw3*L*-=~ai(sjB)*J$vY{qg_0s1d$+M^1%K@@;wU dAG_b)m*9$auj>ccY8dg$W4|9psCBx}{UbZu?zxlmeJB}*5LtHwI6;9%SF-K|07QaQJk zm>856!S!pSX40IBPk8F$1`YkB&d{Y_&>U6`3N2^oI#$^duYejF1SEny5hd!v9=nA} zr7ddfIs{W-*01S4(fSRQ#`C(YBnVr1el1q_NMQ-hXpp*|XyJu$i4dgbyhQR-AwJJ# z>5F{?Sfd8i6NQbTfilII&GW-hcmgxOpJ9hQqOVH{94C?T&VGK&+{GX|&RXs8x-n z(zs%cRC-0}BQ!)6SMoODOT0j)DoZrEpHF`Gf^wSF3*iM@txt`AmtES;V=}#vUq_uN z;QUdr6ePjYAO1JGZfiy~!x*Mg7u6~pwu-bOw1;=S+;~q3%k^H}X#3i0)p!Y)!+*}- B>kt3{ literal 0 HcmV?d00001 diff --git a/training_controller/apis/migrations/__pycache__/0003_alter_post_image.cpython-39.pyc b/training_controller/apis/migrations/__pycache__/0003_alter_post_image.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68f4867d7946e0d075b03f0f5cb2a62abf83595c GIT binary patch literal 634 zcmYjO&1w`u5bmDt+3XAkaxsq}47efaO+*sRCMdct(bF){wp*2@m!6)nXZGM(5k2G~ zJo*kkNnbtr3WCJyj*?W5ub#I1H93CD%P<=OyK_<*i ztJfHcNEGN%S3DHk-gX+)*j0jtjDsnsTMRN`eqqqUqAJ2vCBIUkREqMp7U_LQsrOrL zV{T-CJvucN(@Mfdy*FIGV)5q7^J&9rrQKCKZ7Yl^2Q2+n{ literal 0 HcmV?d00001 diff --git a/training_controller/apis/migrations/__pycache__/0004_rename_image_post_file_data1.cpython-39.pyc b/training_controller/apis/migrations/__pycache__/0004_rename_image_post_file_data1.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b59dee020400084021e2dfb0ece8431af9f64b01 GIT binary patch literal 613 zcmYjN&2AGh5VqIekS?u+K)e9rl0&K>I3a|JXsAFCqQEIy$(YP^<;bxYdn?p4TsUyy z4LI@+Jc+NIcm*U>#+#yatQpPk=b29*98`?t%lDt}&N*Yha&T271xKXu4jEv;E!*%V z=j?<*0pc?QfqY$j63YVQ8#XF`Qy&}gRBcQXbZ5MatDL$jB?U*M@h%x;OAd_2dBc|i z<+{wkAffy!C^LWo!Cp&yum0nWiX?SwV!AzRqK$r4+TF(YQ+cN_{xfHV@_qutf*xRt94z z=!kTEfw}n1poLWV7B6rA!NN_d_vX*Hz#agAzCi`Fi^PyZ_FWJ%fC16o38OdHeB&gfs?lxnU^<;Xk{+#Eqtt6vqikH;$zyF$g6h;> zNFz|>8>ATB5Z;-vFR+ljWvNb6TPDSIHcRL*wZ8H2uzB9)tGC`qoz z*K*ycu=k&4yUiCbXu<(`d!NEkBo}Fx@+5wL(~JIePU4MVrEKkX;bXsYk8hT{%pyS; PKE2fKS>$b_JX_))U{tdo literal 0 HcmV?d00001 diff --git a/training_controller/apis/migrations/__pycache__/0006_auto_20210531_0203.cpython-39.pyc b/training_controller/apis/migrations/__pycache__/0006_auto_20210531_0203.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..890a69a4ba8b5be31e0d704329f0b4db4715fedd GIT binary patch literal 1018 zcmY*YJ8u&~5Wbfm=SLDCygC{lE)qG3LV*xUh@B{i7%QYYSz0!p@ny~V?$|q{gcb@Y z{0FE=$$#LNY)h4n77D`b#(A)-9nCkpw=>_jbG%-!STw#I|9CU+S=LVtt`3S>YqYWl zWWWMDvPO1bkDS1p|e)QQI(MhCC^0?XR0_#0Hdt0 zx2}#Ffi+s$S2Ab?HduiJc4!AKdc%TFfW=`6Jemb4LTTa+94J$)3_esQHleCPwJEA& z@tc2aQGABt6_|xNbL!fE==xO@mf*(3p?p=Chno}Ic(=3{x%ty!uB0>f{=SwV2viuUO%8usFx)fE8fW1xSY_}Sos_}82u)ai|BdBUB z#fZxz_7;znpP>{y5+6|2-lN=4GGsc7DjOY{fRlS9Si>ff`5}ui4)X(5$VDFE3DAxz z^^-WqI9K&tauJI-G{q_36sPN?kNt5PB^+3uC_hIkTF2FF#P_M*3qqQ&NnRWXj37HF z)H0XIyOb{QG`mituFA|5%9yG!M#YXv6{c#8y&Ln$2t^1m#TYQ|3(TaW%dKu08H`fW z)sfnB5w4R!n>wfRHx9U*x_fw-Pu)!t{miYlFv1+o1*(#yIPJXemV8Lp8T03J>q)OG zlOgu=tk>Or^`gD8$6D=nm%VJS?{>C3TRlKbNlz|~WT{9o5-~0q5f?-}Kzi;zF7z%` z)jG>0ict1+Q}iyIzDMoxn3+djZZ0o1S67x;bGf;)m>x;}V-;y-kI0l==hQ2Bw&Tp( zGc+s4&ir=%dNqokdakj*%vT-i93O@}4wFULH|iO|%;qK6Gf&^H%1_VU;hEMo({j(b F{{XsID)s;X literal 0 HcmV?d00001 diff --git a/training_controller/apis/migrations/__pycache__/0007_auto_20210531_0341.cpython-39.pyc b/training_controller/apis/migrations/__pycache__/0007_auto_20210531_0341.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f79a862ff57fbffb9ce8f35fa0e954fdbb005493 GIT binary patch literal 1094 zcmZ`&OK;Oa5cVsMohE7N1CBf-kaB3`wmc++P)nOuASe}ZvLY?p%rtf6*k-*!v{yL5 zAvgX2;>3U8m+Tcd30T^J$MramaE41iq#dhBboqj1Snc8m0ZoeFsO=HUd2THFDD52ByUfQ7t=3}Gb zjwp_?-LO=pA9V$nQJUn+?Wcfo-Y}Itke!ZpIX&vMS*4l3CBUKpN^W+|(5B!eu)s#Q zS4OYr>7?L789eZzf<8{do?&SG+}nABWcUre=YO> zTDneHhXtZ_R{0Mmbcmb7vnW^Rf*`og_&}y?Iapo_uB|MwU^!R`D+OJarMV;-G<7Bq zGK{{I4P#Uyj-&G$Yz++!7YU-z-=+*w$d!jtvX_p4&L~wGaE}jS9f-eRF(zHPzu9mm zaTDH05NNGN&G<;ryQ6}8@8CGOkz&MJc05h z=CW{9H7R(ML`k>UZa1ct$CysWn5r;F)CLrjsVZa720T8pQ~@(g0FzFHxv+FhZw+8m zmnSr7<*)B^QS6mR6`_p!D0C~T%33V($mDNQ#p7G9wk>o;I>^{A&k@)$0aZyeJZiKL zhPX_g1$=+KakIT6(jInX-rjli@Lp^E3EOD3cG&&a+N15e+goiw%t%u%3XWNnVH_p6 zSg>BCS3p4|aIt+XLnlq7NaGkqTem>_q{rLT3^)F6hLx*J&FnzvC--UQ0fA>*znqd| zTJ*bQT0b0jysrP8oc^);THJ2<;gn9;9RHDo)nv4}L!kwrzUR}|Vyj$b5PI$`%%| z$Vaf`ANZ2lvg(2#K)mkQiCT$?W^&Gb&GEf<(CIWaTA#msdv(jwwC{>sU1ZaCXy-jT zKm$G265Z1i!!vZnjo9?8Lk&!@K5Ag09@!sE&j#a#=GqsOqq&A`CgD^BMVRtj){+!3 z&PQYAySiFLc4+4j9jJLaXr2N3RQF7@BC4qF0DHbzE&ricj4l5-wCYy}WMY9+Qw;6jo3u1M>Vt^TPKt2vJ7lta?I!5I@ zC<_xw($fWTb^%JWFjZhZ|DivYRr;3y`gPs-W&J2?xHZ|RTG4~oWjo7Oc{diuvOT?Jcf@VFt<1Y@ XN`>x{Lpl$up*>RF&XvTj?wJ1o!Dt)# literal 0 HcmV?d00001 diff --git a/training_controller/apis/migrations/__pycache__/__init__.cpython-39.pyc b/training_controller/apis/migrations/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56d62914e9a182d5c4f4139bde50b63f70a78eac GIT binary patch literal 212 zcmYe~<>g`kg3g6|5qruypOA6ke{cYdrV4dYC(KXYGP4dW?p)HL1sZ}PG(-JZb?yM zW}a?lURr8VYF=`xZVXreq$D{%ucRnHCnvQiCb1y1I3_nUy(qCHGe565CO$qhFS8^* YUaz3?7Kcr4eoARhsvXElpMjVG0A&|D_5c6? literal 0 HcmV?d00001 diff --git a/training_controller/training_controller/__pycache__/__init__.cpython-39.pyc b/training_controller/training_controller/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53fe09aa64f72ce91fc79a6bb59302b796c16fde GIT binary patch literal 216 zcmYe~<>g`kg3g6|5qruypOA6ke{cYdrV4dYC(KXYGP4dW?p)HL1sZ}PG(-JZb?yM zW}a?lURr8VYF=`xZVXreq$D{%ucRnHCnvQCt5|$|W?p7Ve7s&ke0 z-BlbD=&7f^Lk>-Dz4QtCB)s<27wDlVnhq&B7Gwi;C2_esJ2T(xw==tP=I6@-e13ZK z+xO0bApD*V#yQ-=gFvfVJ?H1s@7rHFYtTF;_;5`1%ZXSV;Cnm{1;#)%akJbVGn`z+F}vf&J443DtnQz& z2#>hW4;=S7)Q|k_R?4v+rG>)A>~4$^K8{d>eHc?)J)@ZA0rgm19RYLfM;_F(ybp*t zK*#kat66EAqiJR>Wl8pm+fa!vtOI~5V*Kf(o6}k{!ux|>eCr&V6u*GFOd zvK2=TV^ChmhVzP`3{LJaOckE8GT_)CKJlEinw}0dLK;6jucsY2<^6%*z(J4qPwc-w zul=yfTB8_G96UO&gXX};l(?roOygi}z^ti`S&K_mxK^Ots__RSzd)rQBJ44Flk}h* z!!3e6)T~@hina|mhHWRs2+n1X?9)7Oo0M!jJ+>W=w6T)lf{$NEUaE?Ru);sMnMjp0oU(tG>5&$-8;>skjhL8)?flgEsY~t zQnf9m(=cto(Cw|d)=;fWHSlfg?K)(ioh>eHe-Y@1KvUNI^@I9guQj~v*M; z{sX@xS5Eu|4hY*#r3wvcmg3k?&+mQT_uj+1yRm21*Ka?r-nKmNr@gGN$Xs5UPuY!l zBaiqbD18=;0^gonWs8NQkVT`&_aG!81oMq~`z|o&2qLm^=idd>V6;iv@4aLbe+fKK zOH4WC)4UK|OHq~}(T9subR_tMP8SkuDtH`U&H!C4WLaUYL2`A4N~$!HVxd9V2MTF{ zK2rFkQgk9DVnPChKSpNFw60V?%ZMmcO6HhPMJ2@?3Y`{$Wx%s% z>3*g~MGKW#=gg#6Sv>fRnTe(P@yUW07Tq$f3;HxghlC)^5oMK-x{uIA3WnHCj;pFM zuKDjb{*JOCu*T3lHDqVqPG_&-H4_Z>5XTH&bnLm4#78Aos&{ROk+rD*Lm~7Gqy>^X zp;mBSn^+G01JPLj6sz0@=_dam8uFrC5K~Yig3D*Anc7ZP`V5^g$UrgWvA)nv(4>*F zzm#iPj?@ai0@?WPIZ+;r_PP|)%m}#3)UgH^x059CFVn_e;@1%-jPfL?L#ue*ZoF?d zoISgZa79&iyJdgw@maD}xAWYzPM(h*HE3M}(`#v(+N-zMC`dC)o(!!yR8&J9T4MF~ zTCu--(vF_ne%~DT$LGsdRO9oDcW(wqm-+EvaGswI4lmAzXRpQtpvp}{OE)?dt)QeF vdTy9{rt3ihFQ7NRXS(jSSwLxZQ*SmtS3tSLg(p z5D|z_1(N{pnhNvUq!theR`nl8qArf^LyT(Q$mCdrBhos)dx$=dx;>g1J(mkQHpRUro7YCGx9e9u8xK^WVFotv(D?{VTXFF1HhHr_t5H>{6vH^N6t