diff --git a/.eslintrc.cjs b/.eslintrc.cjs
new file mode 100644
index 0000000..563d159
--- /dev/null
+++ b/.eslintrc.cjs
@@ -0,0 +1,26 @@
+const globals = require('globals');
+
+module.exports = [
+ {
+ files: ['**/*.js', '**/*.ts', '**/*.tsx'],
+ languageOptions: {
+ ecmaVersion: 2021,
+ sourceType: 'module',
+ globals: {
+ ...globals.browser,
+ ...globals.node,
+ },
+ parser: '@typescript-eslint/parser',
+ },
+ plugins: ['@typescript-eslint'],
+ rules: {
+ 'no-unused-vars': 'warn',
+ 'no-console': 'off',
+ 'indent': ['error', 2],
+ 'quotes': ['error', 'single'],
+ 'semi': ['error', 'always'],
+
+ '@typescript-eslint/no-unused-vars': 'warn',
+ },
+ },
+];
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index e427ff3..d0eb167 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,8 @@
node_modules/
*/node_modules/
*/build/
+
+**/node_modules/
+**/build/
+.DS_Store
+.env
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..bb087f2
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,11 @@
+{
+ "singleQuote": true,
+ "tabWidth": 2,
+ "printWidth": 80,
+ "trailingComma": "all",
+ "quoteProps": "as-needed",
+ "jsxSingleQuote": true,
+ "bracketSpacing": true,
+ "bracketSameLine": false,
+ "arrowParens": "always"
+}
diff --git a/.sequelizerc b/.sequelizerc
new file mode 100644
index 0000000..fe89188
--- /dev/null
+++ b/.sequelizerc
@@ -0,0 +1,7 @@
+const path = require('path');
+module.exports = {
+ "config": path.resolve("src", "db", "db.config.js"),
+ "models-path": path.resolve("src", "db", "models"),
+ "seeders-path": path.resolve("src", "db", "seeders"),
+ "migrations-path": path.resolve("src", "db", "migrations")
+};
\ No newline at end of file
diff --git a/app-shell/src/_schema.json b/app-shell/src/_schema.json
index 5fac4d0..b794ad3 100644
--- a/app-shell/src/_schema.json
+++ b/app-shell/src/_schema.json
@@ -1,5 +1,4 @@
-
-
{
- "Initial version": "{\"iv\":\"pKUIzV5mPhrJMA6E\",\"encryptedData\":\"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\"}"
-}
+ "Initial version": "{\"iv\":\"pKUIzV5mPhrJMA6E\",\"encryptedData\":\"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\"}",
+ "title update": "{\"iv\":\"IGZJUCZPAavpMZCd\",\"encryptedData\":\"/vye6AMGmjOxSFHmkkrJOE2jpg2U0Iz47/lALD7thjLz8CDEohpB1x7E7fbEw/C6GmPbzNULuPCCk+5RVXsZTeK8zR0x7YGPuSIzG/s879Bi/YKUEYy9/O1pTkFIKDpvfdJHUrTnftTB8THrziWwVJey0k5DkNJlXByJXdKzxQmhSeR4zA7AaeJgRpzLQa/yco2Uh9qkqEOuxN3dMIuqhD5YS1HFkEi3qNhs0jhiiOOMplcg7jo5JCJYHf7GZ9jYpY4kT2iSpuXTDBoSu1IZRlAtk+M2hm4h5C7LDfcgOh0KCw5Tc8erPQVthPq7fQIFjs380TixX1L8oUu6dDq/xZHUT8uhAQIDLZURee1v9aZgdmx7qo6OxRQfM6yrnbHU7zSjWg8cUAhmYKiqA4CRiAl0Da7WxKPiYPFftbP7uB+LL4iBZ0G3wyoeguTXiQgcuQKq4vH5tc9SCNx2W9ZFj96WquDuIlmhctNgleb+JMtwYgNx59qpCRtoefx4IkHHRrfT/G9qRyGJduVs5OsaoPWKZlxZJ7hP3+RS97aYRlhKvVE+jWkGvVHXUsFMV3CXV/8cQT+vFdS5PID7ORb62zKyK1PbjErrJpRcK0oi0FuLjgX/tE+HB7oqT2y9kPdnzWO72jxz6OhUXPt8WUyl7e979c3flC+ANgcKuzSWubMbJGhk/FeWezIoqM9/RSoT/nwzEvWPjgsyMFNM9EWSado8w3DZbYxxMA1SvZh7EtUpVykp0D+xWqSExZctW7Gn68Pv+gE1a45RFedWlf7NEArSwrC6Mrs4nsnYZgPFGYUu8115i4YB5CneGXedRf8JdaGglrKOV7IZ4FU3XN1rsn1s1elj1/PLaBvGdlcmnTDKxLym1oWhEtJv3ulsqKdOvunrN5rqlK7WyOGsu+VOmNVLFW9LXf/WmSVdk2u5zCkFfqUjscGTiNl4yL6FO6H7C9TernQ9zrq0ARUynC4Kyamp8rpi5MUC/aCMSE+lx7hXeMJAtrqTBrPqI1/EPfDFoKdpc/zV+QSynFAtXVnfWR+t02jPZQZxpfujmxbOd7BwTNAysz/0v/7Is1+uVNsHkX5SP983EQ03H8F7uVEaYY8/Pl80IGrzFOvOazayiMU2HFLOe0bf3kVDoAPYOjDTrHcnweYyW1irQPwHnHiA0RpxAmZzpJWiAXN3673wghAtQYdoECSAepVbZiez2cV2KAWqRCov/wnVK4chCgQH3/fsUcxUUowWjeQP79n5Sm5G+vcHwx7dEyeBQ3hgdNRSBh/8wQ1zTEVnID5KD5/6N7Q6YCpt6gqKNdWY2qDE1CEYRD7bdU9+HwuPH359AOdkgE4kgsoiq8+0K82IOftKdpPGF+mhHU5hfCD1k2jtCZhNp+guCvYqypno8Fxq4arKJFBkv1FpMn85IsRLMh+VTeHp+epBRH2S6SIo7RPVCUZjTJgS0F2Xr2XxxAJRtziVIPcI+tGfonAWAhEANUkAhfilXtT3rMkZbGdiOMCHJGxohbGKXCU3CQLJGyd8Flz75DFBlaHys5v6HaZQAZcHlqCwIoJRqrkJ9s9K4Jjk4hOg/zJpbBYDj/xRlDCFxeOhi4jApDhG95Zdmrn5lcLtWDJjWRLeuABW+UOTVXcgdLk37u+OO6Dh99kbHB/jV9Qv9PH8NzpY8cnmwWyf3Yv1cCiuGPi2NcRSdXFAozMoE8/xiLAeGbDB2Tvu5CSvmkeiJRUIu/gdzi3dwPpV5ly1hZr91e9n2K6h7pJ91SjRP9/oYz2aLCWeN30d5OCCk/w8BjlNBf7zh6lFjJFX92/3uwuGDTiZunssUYsBlN5hcIvC0Zy+qnLa/NoKVqJlmPNAtsOIjzRplH9SUDKnpNqkUeaxGJhVyOQVcwDV4Hxfvy31YzJYQgeJQ27ULYCQgu4MCA1O0BodIYeowN+QpcqUbDVvFcVBb2USmJWlGPGCssSIK+WffU9luUzYV4se6oFYnp3S81cHQx91d0ai8emYhO5AytszKHIeJkHZ7mpjYJV+mIAGnWGExATYuYHEs2rHNgGIMcGhfVER7BYaML6DK0mFG57Z3+g4iohE86HISicOAy8vDFi08lICFrwXkb8p2t2/5nBG001IdaW1Kbf2dNce/WE/9oxuxLbiikE60QVnwt6oYPzYDlFqzRIHNJyC1E1LXJ7HW6UcLHlIdeZMtxVsE5FHqZWdQcMPJxT7sNEA8wCr1Cs9k94qniK9PyXU4T9+2ZD78IGTM/VGl/wPTUh4q4QYDXrvjVMZl0W3zbg4O+vkDBU550MQDW3UHvcGVeUrOqKDO6Md/Vza3M6Qjn0nQJ6nMazaF2vdGhtbw/I/T2XhYbacdU3gXtzrtvbeE8K0+rq3cG7OCOAMMSBIvLt/HBdj2lMYHbGMqhxK31hmjknycZOFawxbRifZWC1kGTChoqvp8YcgUb6NPGSKHW/xQghzOFPnPQ7C4nEMr1VjD5wvT0OXZwh/pDYoZj8xtr0hD9tvZcDRFZb9UEd8PTegybkP1LujXOzkRGVGOTXTm9aFgE1An1tafdt2hxJzgNmD26HkiWZhg9Trj/jd9ZpKoF47pVQ+10EIAP/C/DE4mw5tQmaY/wKZkvOiBY5b2XolPJy+8tv0vHxbtciwokHjIPAqiT50+dGSDI+cBagB4aWpe8G9T39B1NT+IUNW64nm7nqGXbN075wg2iGEdnYssejvtJQReg9ddwgvo+Ol+b0Ku151fY796ZDzSkg3NjMeb4KF9VA65Wki8VgcIzZoxZ3kxX1MOHxwgViY8jiEPLB4+/BgepLqxjE6w4t0cBUlbpMTcGvV5fLPCHoq4uu+OB7Zlw9JQFED8nr3qm/7Kc4k2nKC8dzot75mZL9L0m1a47lYwPqjBy0LSoweFdwqQjhVWUiQVCcpIsgryoMbnHlkO4+vFfnY+D3QphQ6W2QDvGdUxT4fkFbjqe69Ns/UaAtYcQcM2zC/TmWKPkUXGhOfAZx8HTnDHKp+/AnkC8qrUJ36HH85ggrUN+yzLhBkQEU0kFx2VAM7XiVwTW1eYFHOMwHsoSQykRvYEUNrhDGOrj5Va+mCWIaY0BwM+T7ylO61Eyiotu8PeO3LUQxZOMuGBIjfXdU1d8YeZ0aRU+xcHzRQDmJ2JvPnzN3WwnGkumSbnAmnvHd8K6kdtapyJsV3w9cn6gPiLj3G5zAzh2xv7o42d3vcZMnkX+Huq5Ubb/LjOPGIo/pZ+XXq4ZAveG1wx/c8+GgHsd4Knkz2WTorUI3NCcKivVp3zQHrK69DtHT+Dh+5H3/Sfcli/2yY2mOnQ4DZ+4aUaXi7hS57NgGlKjqM/naRpFK9pW1sFvZtOF5X2ixz3NoEgswSGvl/rT7cdAMvFUj9PnKGmFqsFrkUZQefxK2fVmbY0qobgYwt/EZOWVN8oSfs5tTXJk3mWLphlXCu4ia1W3nsInV3w+O5EvA7FfdIXLmfUMwJtfj8yeoDfKZsaQa52eIvoXjm/x6DK3Iz1t11cNXmq3XWQ9eRj9C8Qe4mSCRcqjyEjQdUuhZDk4NQA3CFDxhphgAZvPw39CU18jrHrIIz4qTZCIBE7XC2eykT1BvMiRjaEZYFYsLXhKFaIG/4WQL/THLZF+bCnwFZM1eq/z3JCDhOxJEDSrLF1qIyWzGLLZdiFep02R17TSu9EcoC7eAI6RH/6Fqy537Em6Kap5A4cJ9Y2CUkIbVeiVv330yrf2a/r3w44tyY1iI3zPWHrBOMUCu8bZU8Jsa3vEqQHgt5yepJaSm1+NuoTE7ERkxSrikmtbYnqFjr9WUaZ7Dc8hWCmMDr7uMrmdGGSNs0H6ofJzYP8vEkpz410bGGbCcyR3iJneMDuLBH4NjvxmNg/TfbITo3JgueyjRFIk8RNypKpyx9yikgv0WindShf9ab28mJNm9rvEp6C0dfy89r0YmMoqqYWlmXeJmKwp7lZynidqBwJRBAQ6E+ZYIjrDCkpWZQyCAxW1kjClIzPaPiYwRlwSZ8jWoYDRKTw4+R8zsPXND/CERK4ize4s78kYJTS8q/GXxqu34f2hcoQhLgayyFBR5UvWbBXMmwDi1WebUUNzjWdyNM5835MM1nxEKGCotntAFexb/1E9cHDJNBEeV86qyG+/cC18iqY8HY7Tb7Ef1rpEFcA5c5A8Zn3fV4G211sQDmLTpzMBdaELYcxoGGd0IKun5627q72Vdh0jZm+ffhiyDK310Rw6jpbUef1JHMUzlNI/EfzL5tyZzv/1InZBUtO43bd/bPizki1NhwgTHjf+RbtjnEl67S6lWCpShhI+4JBKGQ1wK3pnmTIa61OjCUHJ8UEunDi/n7Q/EHYYId0ve3sGN4mcQVKk2spQSCg8Jz40GbKqXvKD35X1QXlCmSJeIlfao2yJwsS2NGmKcwjXTmYQBNw9pNsAX3qSk1zKQndxWAJ6SApwBrSXJ/dAadpWYe7J4Xa60Sr2Jau/tCJK0nhHcKx1ICIQ6jgWKmTKsWGdtOoeR1RWAWMK/i9P8RjlYYE3Kn5dvAytpLEhYFXQuVcYW2Tyq1exKPf/i3FjwAQ9hY+D51wjqA5GAWWG6GasnSjQJpVV1RIQQPndMrFqbVHpqKiLIBafaqfNuroLIsaWyGICoBpt5dNpvOPFiIPauAtaWuwxsvHKO5K2TYrfnrZ8FPFHbfLi55xQtUbk3w+NL30iqWzNS+ges0CuFox53/GX1fuAJjQWkwpHfNwuSrteo2DSfpf4woUnyVA4C2l1c7mJzhaI39/kO9LeKxUfFKk8RBpK0i+DoER2V54iRZQvKy50n1A5L8n8RkRvjQ7xlBY3uAhA5a/UNgZ7jvtK+yxJChbSAFFznH9RMryhw+O+yz1OvG7SIBIWHr4/gv+9nhvq4+YBkYlpLKTg4N7/JOJULfQhCpNuAYyDwMLd6vueIwwW2nhfKxFYf7ka5wjiTshNgZnVR7U05FwlIE2pcMPEWgiLD/huKTZiEnp2k8+JyhGa6axxhZ2HwI4geFU4ehtnt8tcyLruYrkECqHAPMEeswTva7m9nAW+pEVNfOZIX3gYr3Zvef3zbcRD5eoupFTivVJSiLJe+CzU0hgYl/+3Y2TEGqWDWzfE6Dx+2ezLQtNJbDtVtw9+Rh56W105Xd09EC05MLhbrLEdbf6KdgVe2H9Q8h9vEQ02WpJNRs26En07yR3KrzZUBSs2CDz+kQG3zamrRn+b0x9Eg8zOI4YEwgLYNgsxtNLTOSHx2u9O38NxIZyAOJGyVWLuIJ2FtbO4C78XQUa7BzMSs5mO95l4GdH7nRD5/mIY66tGqD8WKRq9r616eV545bzxTTTyxbdgwJ1j7JDuyZUXOgd7wRZcqejvRqpLbjTJKnKNbkq8yCIGiiq8gv0MpgxYqpeusXSBwwBOgYhjL4yfYU9hVTDApdwXM+pA7clu5WhoCdHre8yWUdmNF4KQO+PVJf4cfumEcGmidPSKCZEDgUfCIc8Zf8hAz4Kynzy+NbzU+CFnoKanYI8cxh/r2RTCYYSjb/WVtJ2xEKGWFKfEAsFiqYSE5vLyYSxhIr1DgxQE/mzBr1XMJ/bIyUuMn8LoH7FPBS1p5USq8XgRJz5W9GlT8xU/+BLK9Rtp2Ndhqh8KskxaSsgdkTJXMNoq2olHUBlsvGD4+1zgL4uAPuG+CkM/howIJpK6FC8BJpg1vLvuRUEOhtLl2MVwZtpY8Oj4qCxYnRqRlEl+/L8RwpvCY0aMwba0l/WE9RHETwhemlugRVfzg9/x3cKQ413OgYxGfJsL2snaG9N664lVsCTJYXXR5cC9I/uBxJFNrvZdNGh5sY67ttwjBji0CUw1Eo0ha6xbCeRsS8hsjIg3d2+M16PwHEhhdtE5cP3KCHbYx47frrglkiTMzR3r9avHgw+KxSp8yCeRBwhsixDdZEgEpFCr5dvGyOs1sAs7tZeNKw7YIBI9EV1bIhzkuT8ZY3Gf90ItLxzvj/ZQzeGCjBs/rVperQZRyq6cWBUG2XxenLIS01wy24FXtofJmFS6UuZS2nhSv4n99G9arRgTef5+XMIAiFk7kh2LWqq/t/rUNIrIEpUDjg97Om6nbXifHueI4o4bWE1VH5IxCbX+7h/5GPZJE+y0OckgOhRd1ctTTIH0M0vJOLEaF3GHHdZ1KzCivCBdsZjBNChKmlJuYiJu5oFmuR1Bsj4TKCgzFooenG6LBpY9zvuQOcY3C6CcolEGErXCIBh2OU4NhcR7CwWZmdpdvIsbS9DRUDsr3Ld2BRf5d8/LCnar9M70LFBm1C94tB9KQkmFkG6OzMLAxcdUE7xGDwgs7UBWJqJhK040V00BDOwY98CZ50Pvy5sGHuhyXs2Ii57CudBzMYgoZqgxD1cx3ZAiHtUL4BC13U84z3APg+wU+MYeIxLkiEVqW27xKvU+WSuVeygyKxJnhGdLKqSZhHWQLye//VzCFaYIR+sfp+wBVfxHATArcR5SybJ12nT/6CpsqjvEAsSlw8TjStRZBN/hy41VE2KgkqiSNEsU5rMcSOggvQ+kilTcbkZKHoyuxBN8Dn8ja90qXqEz/NtpnOoonylpu7KJBWwNaWDsqfakqyOqKZcookxKMeZ+NvWNdU3isrvp67lly99eFkC0mk3v4FPPdshcHvZLx6dw5Ge4beMv0MJUfk0srUTdQVYFkTAzgJjBvjSxb4im8/O64bE49dbWv0pPiKaeqZSwrQFpp0Dd1pk3PDDHK9jNYcysn2onGI8GkwOYx0BrS60NamCYVr/QpD1IjblWp7ys7uXDv3fHcaE1INVwXhb9r/LPxuuPOIuOwxdu+XymrPRcopZIALcH3VPQNkubqVHt7FA1xGCU13uPik5kgCwqOBiGnegWWoDA7EGujXCccGQZX3Lml3Radpw+fDvcCtcqydV63fCmuG/IPZXHEURX68CHSKKyqa2h4pfRHDgBel+bxmldeX2rMnz8rtSm4FxBe0nvl8IQfq/BoBUlQ3Qi9FqX9ljQBh4sjKi0O4ZOg/hkz9kI0zM/n2B7csn0c1BF3Lc+13UqoiL/s7C7Zve8N1l4OrA0Tl1yvfkIB4/+bS4HKXIKasqRNbOkqbLtEL25sH4CQUElx9p3UXGtTDrb6BWDYcfAyfZZ1JMz+9/LKUeCeNQV4x3fXZwqkKedpa7N69Jam08/q6erbeJ+hBKMu83bZ03ZKrbMiH52T8x5e2gX+mypw+Gcp0q1kPQ+eIDB5KvCX3xYsckTHMGnazAKfjmbQkSIbqeardWOC3avV2eG/F3tuRTLTBmjT0dVlpoCkpsZKVOYjlUtupUvMuIxl37GiKj08EvEhfamyEABqEhN9DO/APJpK1ILVLcE61cIe2IrHU1tpfAW8Eyqwz0xyZlGxFCIoNvih8PSq4sKzNkXnVBfUmko2Cr+8eeFMVbLc2SJP+bKfXZKmbW4dtOxFDoLCQkOUHDMN5ZcGy+gc8m8eLl1CKC2T+aPR4UB8A5n+Hjqom4HETlHA3Az7501pVLRcX7ymR+tJ/b9eKkwO5SO9l4PKrVSQqHxSIf6xr+fAKdpdF5c7Lxhpn+BD+Sy/cC6a6A3L08aSJQp/xrZPkrsyJa5xB2VaQQo4HEM9WuloU62ifRDUfZTCV59r1Pkipv7I2YgH+h8rTrV2V7mRcSC5KElv2QKSsieArV2ZQL1tAn0x+/ss2WHJOTs8pihPs3R5/SB/DwH2xgPCX9TbyHbdhCsAP72TR5WdmRelei3I7wQlQKk6xga+TErHWFW5HVjdjrclhOS4Adl1gfc2vILiBh3dCObczfiueLzFljh1OopJg8EO83pCGi9ArmCdjL1OO8aFv7pXez7VaB41uuvclxchTqCD2AqOMeEFl1E6xSWQKEEKjH6wVuVurDAkUcA98zg85a56qyo2bAOwgbJjJGNqlSPdVKauqplRn4GNtIKh6X9eVO28dIBuiccZOPVX+5vLLqBHgBU2dqqoz1eXW6eF/SiwaagYARkweACOpXGr6eKms6JNtcUlNF3YCyBgCU2yyC8/CSdubhLaM0zrBjhviiqbs/NjGnF7gDDbhTAXzSVP8pTyAZS/ZmfAyELIMrJwdZczz6HKwE7ZGiFqNvYND8ltAEv3YyFUJvdPVc0q9/q/PZW/XzyXlTM0Yyp03LM3UJ81RiJG+6th+jZTHS06PzLVZm1rWHnKjI2MwfvpshemRDHOiXaXQUMZyQ7tGdS72fgQCmYd0FmSYCPWOk76hgVRXc14jwlGHbbe3fG+gHYPJ+DdIuzIfQxlvGe6tzkxIsC3kSJYs/xLQI8R2+rfFtjuzjgrdeMbasZNGCGGjd5D+XgeFUvsrQpwuxtEiyeAhvzlYfJ6ILEas86hJNMgXZWtZZ65a5KNkRwqdtDwv8BmYSWuKnB5bjtEMJ+gJT0M+NQ/DRyXe6WzoDn1nKvdDZRgUzHqoVpNQF5sHIykJlf5r+Chc9C7d/0KpTEDXJnx+7Dbx5YfcOWtSNHvFj9yN9YHePV8Zdzj9Fj4nenWRyBT5rq5QS+qklo9r/2vLuOnCOfja0Hf+hY9gPC6qUViJ+fSdXJozVs/dee3DSyRN1HvWT8YRv1PHIqgclKcKCWxQi5LOMyhiL2P0fiQ/e+uY3FKuiQ+8IipPDIfLONoaK9bNNAJzjuUirQhjAHEDXkH/x5+kTDsPvboT7k/D8UjYUyMz1qtw1PZqK00OOdHwTelTtfQZf7q1uovcv3AeeI0Qij8xkycmacHODI+Sc/0PIe99tI3idcbuPALoJu6RZ32KXFRsPTPV6BT0d6kCzbQYKXSYe7W4IAinuSNRFU+4CH4es4Z7+sD+04kt+BRTFY3AcGoEFfVdGGivpaELcN9GgYxauXAfJrYbBFCJjFZAjUnf0OTb4P9ifxvrVl3GHUPm3BDKyPza9HoBVdmp+tGlKOZ1S6nlYKe1kGkSc0hyp6BvtZuGuLIkt0YrlTgIDzO7heoGhaXsJTXsjDw303KJ42zOmPyf0p4zyFu8lGJSr624NN1JyFVUJ53EXASrq8+Tbz+esWWbgORqIjzP6KPwMUWujByvImll6dy2b8JS8f60wvtXpgDM0sJxN9OmBdWcbI9Xvg7fCX9QkCyG70ABV7VuhPJ2NpDGJ1dbweD/vm/FwWLDZnRG+eBFo5w8mxjWTZ0ZK0O4YDf2nHauyqmCjDOAnFSJnUP18JhMCswRgxyTdcmhsVS5UeNT1jceJUejX/fTkIxDfG6lUA7xKf5giWGTqggDZ9pe4rraTgGYMShHScyi8ZgQY6QDPmMVlVhXx963Exo3ftBFsQSEVuWEw6NQp3ykQQ4f3zfW/WIWx5VHR4kF0V0HV5//r1bNwWOuwTOcpzrdMtGO5OdupI7OGUaxgEOQLyasWV6+nnsqGzjppij4GXXKBWAAFSJbomXOMHosmsQFLMYgiy4TiZj6TI8NtrvPQOtNbMYSzuqkr6QhnLFUFro5+dYHe+A4x4avRLa1yPqVuwP+N+A1nOJ4JmNIFSGWVKGZ3whoDUz9zG3hjzfUoL6ltOi0Xuk2iHCMC0bHNbvUhv3doXFiXx0WaMNnU1ohsvnhN0HfrpqUQFejPD3Z664ASZMHWLdJUoySZJRZDdw7Z5CphN/n8f5++4n7fAvPE0watvieoICUAgFst3hUjrxZJ2zB98F0LfUHCMusbuBJL5wQwa6D4ucZ6FA1uIN8xapAtleD/Jiwhu2e62I92u1uk+2mDB2dl5C9AyhKZrulH/h5+sh25qJR2ds8vLCAhN8TXPNjWQMnE9HzOH16w1HGa820D3nS7gSHGaO6AE7DgZHq/iexkaPwrYMkYOyD4b2nM5fY1NovfppuhGdE8l5ZsOVBvkpLJzWbqwQjdxYa8rS4N3Yen7bfSgk29TQtmJE21JfBs4lY+t39BXvjLeVRnY/tXKUASCrqIb51VBzjKH2J5ci4hlLFX3k0gN5lUdd7x/zGfd1n/Dn1D/dxjpaxPy7W+EUlx895+61QKC0na13QWm3h7vsejrsInFpE+C9GUgwTnJyhm3ulqiOx4V7ZnewS0SSOzs6H4CBY6e/wmbVLlSuM/hdcafMlEjMqPNwaIuhbxx03TIHU1LifrJUMzuRmao57f7dn3J+SO/2G7zDOfiuiQrxGhSxI4R9yZwBgz4FiRFVP5kXdEe8lNq2ojwig3ILfEUYLLGSluEItPm0wzNsHkU3BdrJGEBjpnt7fmgrsPsfP/N10ivfUEFbuEUy9fUDokIMKxbvKRwPtEL9L9U+es57asZnjIzA168PGWa9xpS7IXSe40+f9rqco0aqgQ6JP4BWh6NHNLgjeaP0I976hKpTWegsDjYHqPpbhraiwqJjzn0iy3iTaBKVnsvted7aOmvAXX2SE7Xchwvsc9Xv0Bz4rNN3eLgO8RX+LzDh3q18I1ZduqBRyt3yloD6PtHst6cO/08kzIcNc6GezWIMgyrIJcx8V4ns8iFlh3Q8b0QB10dEAmj4wHXdOOkYG0zHZOcUJ4JVypRpnajkDOTF12RUbR2PDhECJ8C+UBNppnhnKZwC1IjH9StyHXHOAResbxhaMhdshag/OHabmpu3PfLboefU3fJhJcZVusuS+x6D6MeOOCve9s3tJVfjKwyW8I7sPRZZFuuKPMIMXw0/1dzEUxmJcQwXDizw8TdPZ7YcRI+PAssj08G8oFnltKLhkncQN4pnbhEZiVJ0kD2dsWRnhQJLuuekNBsCodSp1w9UjnZTKLvh9orJOwzeA5g6iQUwaOdTVKxODXIkpEfpDzDToptApZrak8zZGIrGV0JqMiD/83aC5E9KBlgdBRxXet9yPxae9akEZyy2XEGTNXsvoSF1uoyyN1ucnPZpzDOxpieoymoXVynbd6D52cQ7T7YiND6bp/keZnBv8mmP5K5I7v6LtH3Rr79rY37YUApratIrnxlcczp+bvC0V/AOkBR8n61Yd752w+JW10WBP0raMmYPzUp6Jogu7bMI8Pdj79Qo9jC4kLuFeu8sJiu7AJiujYNkoXE4+U0S4M4noZL34e0ISIEc2hom7byj4VAQ0Ju/Sl6Xfpt4WJF7YiYWcZg0AckI+IyUafXygBAsEBj8goMeoNzsJ34befQLkL6hlfO2eHhDmS0LMzMdmXGrvt0W14DSgrqXABj551xbwto8Xtjc6jD06LOIGrjyMXJacw0rcxv4PgSNIC0cQcBVpnsyYPzcF9qkfTKNgfhQQ/baz7wfBurLunUn+M0WItXI4UXim1GAXtLJBapWY6E0bCJWYkSlyOVSCRGONVSF2SN5ChUqStW7rDBcUXNM9kw8nmi9UGJeyhlwMcnm0YL2aeKEFogDrvBv70CMJvL1YG09tB8AWcUO+ZvFmHvDicznGI06YX5xUTUg591/5J7e0TAhYkegkmbkhLouxO0V1sU8NiERo16OozrDPJXWZpcrjShCG5CSCRrElDUcKraUhys5SY75ukzHKYZy2ttwvb/T/jcDhZJlBToCHuHCgSonelPS5TZvD5+P0UvVsw7yIDCAAkB4n7xQ6ipa7Cd/8fLi1RINQbImj37g3Q6joQhfgbDwCsBCxMzY4m7KkoECKJHZ7hJJxlT5PdtXXOJN+vAYtQXO3tdT3yq1jrMxWBMBfVBjCLPJNGaBxRn2fICcIOTL9We/9vIRQDSqS/NJUxsxTlLSlqPVO5mE7doU5fl4LnTDegoNCZqd+ODcRvJlGyG9SL8AuGD6XT+ks4aCduN2QXGwB+aj78tcBeqC2FZOW7yecKxny2j0MrRpkFUKyv47/vq+xMMPQhqD/2acUB5uwQnEAwyR6UvbGzfPKenNMpOaOJYOu2pFnTp0sNW4r4mLE7+EaKJlJfmpT1z55pFg2mCQ2n8h+2E4U2Q79TxiAiYUql93+/61TKGnqKdrdGu0uAbKLV7QuN/8GxPAdLs0uoiO3ZXrWYUohjymDsHVfg8cy9SE1GpL6LXT7e9N0usyus55hhTK1TQdrqKSzn6BmucbHI036CBVcIy3qzZ1v53ZP5LbwbGVvTSYYsi9z5PvRvj29pF04Eocjz0TDyUjZbSVejdP6ydo+lFfm7wP9IniVdmZLftRbXcqHSvzWOX5u9DAQavqkQtsaRxsV00f27odIACHu5pXtznEOmpSQWSAoH/XzA23sQlMeLx0hv8LwwzXWd+sbCR/bSmGlsiYBsoBjij6NsrGSruWFYVMS9II0kCCHM/GPwN/SZIuSWuAf6KcLrARJG+oDUv4VAEjFKAB5d/KJTv+xx459aTHHCtgY0RvZqI3Rnrf2EyWCf7moYBnqusXd8gUnwHBJBhL9ts6EEY0fMZVoBsjxG3Lwu+g0iSzDykBADwnG+Y084iaMr3iXyPzqavmAMuVNkrVdgfrA3X4o+MNcBhBOjlJ4zvMQuMjFB4Sh6fdY+8NfnR2jH7146HfwGD2Y1AlymOWzdzRjRLev7osmbGlM8JuS0VjBip46BlzF+Cf0MhBf8dtStn+8EO8HRWqVmsv0TRHFkzBh4XPGz6mYyL6n4lmjqNpqXj3ZWeNGmHzD0350dTFeBms50QtTJU6Ck83hsmpAvxgIxPtOYG8ecrN9MT13gBeKhfJHS1Z2JBPFDaLz4ewlWlBIA7epXzh+HOnMcyLjM7ZTtBi91FwOzW60ECYX6OuTewavmYDbd14eEcp/fJWBDku+OEt3505/mYE+tAP9tykqlnnn4ETZYoztxN4JOk6FBpplLIYf5M5jpxeOwYn3d4UyG2XPFeI0yqB12A1DPAqVLVAN+0PhcDuVK8RrO2QfX06l58gbXjZ6SoE9STje1/UPDYqZAuuHatglYabKat8Ytk4ScNRJaNNOiHpWGTdBd4P5NLGRkxxdnPwXsBTn846Dc3UwTSVCRRW73opvmrHPZATzLzLyE7vRENCilP0kPbgSetRY4KIxtXGIQW4uDzk5c8x1mSL9S6+e1xRYNTpbWr8xrr8NPVGjTW0fxX0JMDQ0aBJSCc2XpXDqDg4HvKfeYmfAjBu1c1+JeJs7WJ8S8GYsAmV96OnngQdV7oxEwYGpx9Sh6bi3OLtsBGX9QxD3c1wcaUhfjcT0yR8ySWW7r1HQ9Jy9sKBPYGA599gH4OwYUrnJ2PpZ4UJZPWlw3ZRIzuKfnC4ke4sRO6sflSJC7m4Qu62UMgapbzF0SlcVTA2CIO7Z8BjAaY69Yo+n/Ekchao5Qh4Ppnt/qv3H4/Ae2V4NK/4fZHbIhbmFFqEwYqJmT67IY5TqeZjVVIWas2Btf6foyDcJJYGZE5JJFbLp97lQ4YAYsPgxmoD6a5l9o2ZMyPx+Fwh57KAVYdDxqCBg+xxwJGs/jN2Z8X82O9f3aaMA0NGlWiD6Q2fideCVJrEUwrBt4cHr1SwdQ0jeec1SdkbFtzZE+XMjVk7dRweurbojW5w7TixnP4X3AVk6DokWG2eTN3byBt2cEhZmvIah9Bs0Ewz6IOWUwgyGAWqaPuQzdXZfTx1eGYaCqNoq4nZHi4/5k5t+7P0uEPK0WmbrKnv8BIoUM20ZoPFSYMA2TxTqmJXuzWQBSsVuVS4cymeo3r5m/ShnTZIQF8BQ7F5dBxX/MjXREWYU3ft499aFIL2PQOzNOpTSYWhiCNGF1GPTYe9tmUCr/N4Z77ra4JL7m1/0oWNZ0kKXNJ4HC7kzH5wCFec9XqagwxJjGRHvsFcDIyxk0W6LIXkALrlh6f9YBZt6fx1n/nUSLDX2KNAwVBCokotRvSxLHk3HA8nGA3WrrjJw9jcaJjNVMMR9DTpwUSG/15jW5xbs4KslrIgvYRQ1Npy5wU030Mhyc3HKTi3nXmGD/GYxAaLEczbMvg/fz9k/1daoo0rQXbBIlYfGcauvuM/y3W5cwSRHRUkXuSsxWUF9EGt07yF1fqvtASjG4mbC4w81HcZVntlk0H3n/xtbWfIm7r/TBq2Sljb0qCxn4oXK2l1MporEsu+qlhgPm1W33DKeH4fD92zcQbtFeiV229lBxG1nulrLzHKe1XCrPtyF9KcvgUwI8PVsGoH8Jupvkb0alWw11kYwKCc4oBAcutte17PJaPqK1g3ziApT2SXZG2kjQLUfM47PS6jpdfNjx1KSvRh4SkrWRzTBq+VtmPJUJinHSVOUJSEfKvc8/VMEbUqzaG1IoIItiCZYVb0vXJbZo/Q5GZVT2fpEsQJgd3iRLX11S/N60DXpdwFX+OT4m+lVH31jsikN1HLTktOCtBdsaBzbfSrBQHq3LFfDM3+AMMM3E4TnP8YdxcWQq13OuJeFBfu7rJe3iKYyrAkh0O9u8PT/gOaCCZBAbb7qP6xdgysj4WEEbfrgT5FpD1/qy/qZTtydk3iXb9G4KL/t2p04gKDIgoUZ6ftTR91BIymp4mgfc7Awu+D3Sf9Ci7cPweYimXgbseicg2tgrI8BsBcJLfyX9MQdtYHO+p4SDR7fR513smv/nSyllO7mTDdMMEPmCtT1zpaOfebcqRGHBf916WPrMUfUyHePF4umS9WeZptJo0UFdYy9/2atx1zc5Xnm0nkzbgOr2Bzp1ZUJ74VcC0AiNrZPWttQ8wVnBykrsFCGMtaQtqIbhifoj1ExsWqfJxyri14UEHiJFFKkAhTtXiY0omndtc3p62+6ENqYhd/xjKB57gUt6lm181vur/K1bW88C4M7DBc4lgkiMjmTreUcCmuIqwlrX8nxv0Xag+agdm5L5KjCwq3eBq/DstVIamWxQ0owdSrWgr7SS75/X7BUzkO36Czo4ofshUI10jE2CpeahAHXx1wIa/r9IKPwiSl5zAuEYE53GUNHymwSMl8yKkRlFuLjatViudiFQgA9YoU4GNcOpFvAzYC1xI3iJThQKo6XjgaBRih/VP1igoPnYh3TAB+FS0qbPf2oWRDiYm+04CE+M+aIs6VaVycAK85LRIP24j0aElJWA+UBNmA9BIPhX0uI5ASoea8/1gC1Ux9HQziUNj1fKDZWAMZCZqGaIiNx1mQS/BbUMdn/Ztr54mpGdJDwzHoALGb0ykgz8ZRiz2QjlCRDb18vkhFCmaKmZh3PIpDVnvB+SFBZnV3eBrZxmuXF3WcyiYHYvW1jsra/cYeaFZas4jBdL0PpXg9Q2G3VYBPbYTroN7HY8N/dURhsF1FfdrZb7/kXRM/up9zfv9AoeSdY/+NFv3D4oGa9OAHlB0VwL5s+eJV/pSgLZ0M6hidyMe9kzFbfw1pTzdJqizLJrC7qdid5v43U1kaKutoEAUfb+khZe/gvp2iQUMC7/q7pN9FEe7MrqdZbOI8Q85mlZdk8CCss31N3ZmWcV/PxPW/WEDC1WwBy1mbxpy9UnEpGshNSF5+eZSq2NdZ4zZfKglTM+EYsG7EM3bMiwoDfw3qw3DcMhGYIfjaxjzCOMfDDyV6IV/LetLPBgmlPqop4HmLZioC+F0RX5+ps+J8fKnj+Cb83YLicyqxNf2eUBIWe0aIw2Gr+6/v7KsKbuXzECNd3CpINi0WQDUdeOyp/y9UnNQZUgdGP5qCc8zjqlnquNvfWE0Il86XQeRRZ/lQ/Wq0++koaUN6oVwGUHNw3/H7sc6YJNfVIobs4prbPQ+ACvo2yD+wyqhPS3/9++CbisSCi+J4ti6Bo3hdM6w8HM5+5ikioLEObbJZFFiP6f8Ea/XG7CCn+4v7Cc7sQSUHm2wCM5phixFIsBf6b+EWlsXnAd6IBU/0M09JKUf2HEWuexaKme8UfYxreFkRB/l7Q+BY4q+HG5Wv6jScarq2dF4UEDLV1HxzSQD1+dP4/LiOdAUuAPo82/pUaxZ9v3sI/4FWYn9YXEyls0EAnnDB4i58HGdZNxFLABuc53xmUYnhdLH71tVdwdRQB72j+6RCloMubK3veTVD6QtUWhZEhD9Rn2/LU4NKZA8iX/8Ge4Qx64AOahgD/NijYrHXGUuA7d6UHFfS/5BWoLY9/+JZhaU36MSZM+SlYysvchVXSyVwbZV6w+iTCUrcl2vDuwNLG9p2wzCfc5FWUpJOb+iIol6cSaOpPtEOrzDp2uf+XLmdzK2iKKxZnT8i4+U+axAVAO543uSyg59VjT08pSN+0pupoj+kfnsTX7xivIatPXMA5a0mVhIu1EsihusNiQCaLaJ/kPguD30rjiZoxPci/mC3Gf4oY96YhWRR3leomxJKCXATSBepg+MHPOwzlytcusJiobqTMDnLkh4HvO2qUBCGDw0qqBkq1tVL/RM2vKDLs1FHC3KMCdpbCO7clDamkoz11fuyUd1IkeXXf/txOqtZlm8D/huMkkUaqp0CmzKy4IMhmWRdM+noyzuWQ5njUrvzS2qeWUyhDIZvdK+xdGCopr1AGciO5KtYOOjDOcbpMb5NpqAT1df604EXx0IjBAA7L6OzhZx/lpg4cE7awP7SrpE/d4fwprGb5Rry3H0Qk1I0pdk58aJTKBgi+S/Sa01VYjJ/xXq8a5v2sYRa29ZD53CxMthvEEtUpnIfbPkJ2fsMs4YAzQVvMjKYvpQWtwFv4ty+Cb6gVZe5gXzRP9khFtWoiYjB14ajrlFyaJ7ieyv2oK6Iq4R9pYlcLYgwC0zDrGhqZpmIRQqWFKEUcw8+kVKvzEgyik1xRXShhZFQbNGwdwTHjpqL2MUEe1Rk/x76v7Ac2kgvFTU2RMJXYAp592+A/7ZvHiFl0R54LvTlG0Yn5WbJM/pMd1TuRFrYAxC4ex+DXTCHBEIo6DslrqNh817nHzRgJkwfaK+JLW5iXhVgo+zoMlEni3IKadH2IOsNpZ+MHYI/4ZWmi3Jzva2YkSkP03t/ZFdEOaMn9OgUy/dg9tifpuZDzt+C1kmx6mYqGtsxHqY8YTKvMOD8xhQxpIh+7Uux8XaZM6FzToW7xSqHQtYf6Lk0laUlynncT64SixY5/842qqy6gcnYy3qYHcSBW3GC3iRbZZfFBKpQI4m2pV+Q9h5hO3eU5i1fbRjT2cy/aWiDcbjZ6hLRN/UpdQ+Abi1NAaKjz7tmwdD360BV05cKI6kkTaL8QGEBoOp5ZszkFd8Za+JEX7nVcPVuuW0sXiXVzy2s+kpWY53NFYvfZhDN3q0GmL2mTsrhb6OFxMdtrpN9A3F+eiSgI7xEDAY1bP9R7GzwYsXFwi75vyub3udccfZxGOzB/hKrsmoma5v276djXPJ5pBGrbhIgsUpm8zNUgc83s7SaJlY+sWbVFLlQnASzI2Hd0Vcag0+i5cMVamSfrsWz3wys2BUxXqkBm65Bmv4kczHHhSgjUmsJvrfR3Y1+r966JnH89zgFrfPgUV817+9eoLLbHMRxFWGmXZiTC7Ex4bXt4HKyFgrEbUo8WpztM474/D7juMpX9vAFXYBDeRL1dH6OJL/XfbqfmPeqdLMOkxZ/ak0LiCHLZ548ArvvWS8DHpSz7F2EV/07KzzKO6jU3Z/DgPNFynHhqLB/82tLn5A+gW2ZkdGjgsoZ5il9pAgxjnUzb/xSvsJOhc29zVCJonvUMNlIAtlaEP1gVfjMvG50SE7CsiJqYavDUbAw3oRa+FWUcUYooudGhKIZu6JWyTxeuwhFFSBVsrW38UjYDPdTRBtxF6nxjF/+L1v9rCW6lYAZZuDtlR03rWccBOydnOTPpu7lY3s8l2Aem0Ow2bJ8mDxOndyi87k1rVahdGlkPjcQNnsUvQGKMppePNEmmkfjROULgBc0BN4mlCNyNc+BQfPgv4E2yqyR6qEnNrTyPapiu/cs0oj3dHABrFsl3ViR9GC5zFF4Yjr5VSr7p2SId6g3xvCTjAoFw1rmk++a7dp8q7WMD7wn9HF0T6RXjMq6sKLzXbFvycGUp4Dp0q06Hf3tU+ndVHEYdEiixDRu8y8JMTUGfvbqbSZt0wVCLJHlbaKvYNH4iOTHS8/2uQ44xy2zJa73cQ08zafMWPCWzBljLo+ZkaUKEgOSaryn8trqwDd25TTDTsErMa6JUettfu3ZdL6S5EICPQx0eL3QYuQGv9A83GgpLdbsl98ykKdTuTPHwWQaFpP+Vw2O26f6wgvaEsCgeYEAPGbkUwrjySIOhP9zAPvlXpZjBlDjAM465/UzbIN1IyMrK7+oCeW2onMJmWuRpJpa1okSRrq/883Fb7uEB3s2GM7yapE6C7PTxouiryEdgjkhJMhdsZxziIWhoKrAHeXANtAMrvVXUFLQB0bYzbyvxFXWMzyhVjHRE041DdadYKu62WOcPi0067b2skLKa9zAb2tpdtoGQPKgTzXsJ0mn2FDwuWJFGfxC1w4HbStNSHFzcwqh7rCNdllF89h31eWgbr0KQ44tupfzEyFaZW21wX4jGvBM9Zo7Gplpvvw1KD0tNYZ9Ry6xkn2e53xPkcBzBWn7TwT7jiCe5KiMaL4EbX0rhINc6NsMobh58NbeqQriIBDoA0R3WPeTav6bxu9ujfmu8DbEX7gCV+AjfR78Si7FjDcAXiH2kSVcOaaTvVDVwHFbsYRR0alCOwpRIvaPdNAg0XHjiFmPb3Y2eLC3SxP7gHDowxTrGJ6ZpHJBDYyrcQoHs28w3+F1OlUNPvHm46HWntKH4tK8NLgMixKDIv1zt82dFdbKetceKPoYdYH7YpR+vTmL9axetyIR140EAJ3tzY+owGn0HtThwbE4O/MbPbY6JaHwjhcUdk8EYfXLVlygaFBQFK3aX5sW6PvCnTd0UJKyWPE0+j7RI0QOQb82YIQypRg9BEgqLQrpJHRiw0pkzJN5fSoh+Fzo24uDJbkFGxcdYbFkI07w4EUaHiOQjECjwPjIhb1CcPmQIx3cGTUS0JmmMdYCRAg5kPvRQ1vW0174oQpgZyersTadQkSAWmI/pjRsu2x+xbYP9o/+3+Ec6qe9tH/cllgMjnN/blnSe/yX4bs9gGtohJbX85GgyL7DiTJZyR0mJ7r4PRvapUAwGmJe2JjwE8E4XtlI4BT9D+PL3I8XrlxnqMXqWGVVJP2tTG15xWOB4c1qcGNk7Nl15rntzqQuP/YRoOFq5KiBSLZ0BMs54gXCw2wCpRxf/dzySSfMHZ4iO7j2Gh36Ayaywbi+f1/lnUa5HhJXNk5PiyKcgEXj31JREIv0szBjUXfTfJoO4/pre5pBBU1uBSL9DxC9E0FCSan2Wx2Vg8XtdS8mz4XRTLOL6mHi8kTaeRBRTheJobh/qv7UtxdmiJ8NoebMc+NTrGop598YNYO8WOvHq9RIv08rLmNnYz2AR6nMh1mXrDs05C6tOXeSOpo4Kmzcvl395m6IFmIVcXKmLqmeXZG57u108SudazJdYsr8SPxIUaO5ii0PyvZdnMcGalEdA6Xpp0LjkPiawzXZyvff7Bgnfu0qq3CIrEGSeIp1lvXm7e8X2cZPNzEhXCuhN0DWXp9VvlEukMqpsUqgaP5H+6Pc4Fqs3I1WupDzOatfGoWhUup732kXzNh3+4dtasIXqSFCE7ofLl+0/k5ePeqOuyWN0lgK4AuU7HudRg6CbIRQpo6TZJBwJKaCIwutaL4Vq+zu284bKqUj2szrft63UYcbbYH7XJYOiolFKVIv84B3ZQMVebVCEKQjsBM7f9nWR+ZPy++tqrnWLjpPs+egCgGrkNQdyFjg6E/KCn1QshUpvvgTZvw5d9uE4BaVuY5RJW7eaU1Jr/jWmQa2LeWvGpti6VnJFygPvno3Efj/c9DLqLiJisn0M2OJTCSYjPGqvs926alLYvMDUetnq98sKP9FBFMK+u2kGK9lwYzFGKHuiMLDNnZtYRB8BiP3SclcjEMX7PWRnQbc5phHiMbLa70PkFSpR8lJCk3dFmVh/Z6YqgqSid4vyc0QbaxYB9Y0MEgMiUbY+AMI59prrDLELE2GCeQ0YBksIYm7reFELd0+ca+n0Q0WTxDmLjiWcyBa5Uw00tYCcpc/uo4WDqlHLRaqk1ZSRTO7/mnelO1cBwym2OG6jJPjMbgoOxOCWi79qdNZAxuv/MNCKGQMrX1wgFAc+gJH+ftrHYAByh2T3097q+1b7NmET9V70mpY23ytZ5wnRvAkAEqgmAICDz+bfelQR1wp6pO4dGl9P1b99JfF0DIgOO9tNGYPdEgDgl08s+pw/ghnOAIxr7PrWvaOzpAh9gKSp04L43d4rcjfPoxsTheUc56fSBLL3Jzhp+f1hGJPwWhxUXP63+5hke6VC+95NlKma2qIDfzGsQw+M5ryTdwVG8CAidr+SPeMhTe8PSKwuDpKMoFfw1V8X9ki1f51zCMTmgZp01GMouJYOxwhYBsNwH+U5TsQenNbYpz2MRLai0NbwNEoNd7ap+58FMzoAG6533hNCFX2d92jzRhm52jEiawlcc2SyfYUo0hrFN5a+71gT7yYX1vi0qWM0sZ3kUQhDIOAdINcVm2GEWzsF73Zt5gGqnLUKpSLBBdguXvl9YTFsokMgyNVdSrhTTjxGIOxv1X7izyiDJiqB5Mu9fcneOHFr0wmPVYxqcVyZ4TdeZFM6+P3oX/iMPSQGDR197UuYi5dyn1ZCllGt9r2OOifEIQEWBy9i+L/uQSPdqXs0cbgcQY6fx9FX4NKup7qexQBn2fAjdzY2YLtyrILisykSva5F7jWqpGfAsyM56XGP10Hbfpa29hlCtd/44UTtanOucewkc2hjN7nTcQ5Vu11McEe1MK97CYLoFhjzZlSl/NJaxnWRx59Tcx0AS11+oddVqx4ee3PWjaNXVPOZSv1rouOW3hOsHEjIE9lg9+88HNZFcaBHyEYE7uYMdupelS1l8QQ3KZlUBViDSwidHID/IDhfTD8oH7NZvdRLhODFFvkg8FzXoVhZ8HtLuko/6xyNtNfucAhKoWFVeeowIoH8o2Y8dzTYzBLP5yMjvIdOTTjsPIsoStzan0z9ee31Laz1PKAPNIVo6n/VkEHyzEtWOuwqgw/XasmvZUQlXToU81HJ30IWJ+sQClf/whtbjORjBIq+VS3Nra49KEGjhTD74w3JXag+Yi6mmdWWR/cSeShE5Ts0lx4E8FdDQ+WXZsTPwRukYzg81SwVStbefnQ9TSLDPav5z1tSkFkCYOEG/YRn4jpn8cALEPi1jtvBg/WmlWoI4b1VtHMu04hGf3ac0U7QG7KfEOr6qw806QPA3dnB6V+qKyTXpGN1xhL4sbDDuu6BJSretSISBJZgA4N7tAwPxHq5Dqi18LNzd9azPKziPeCfCxL6C4qYa33qcFnFTuEzp6gA7e/JgFG3uEQNPCN1F1rdBToFB1BVxyXYhHo+UKyW8hsnhi98EWJoJvVOL5leDsI1asRO5+0lf7/3tArKNX/uok1qdmPjvm9DpnHLWelNCAXdaFcxk0/hZboAPGKQbJEXTU4yqwtim6bGxdNXNef57X2ntG56lSKUzGQMSywvtOrCjxOyg05BsCOiachUBAYia3+2557Om5OUMVJHFARDu3VX3Nj39MYP6eYgXE9dwIfIJFbScB1z/hINtdfo8WgxRBdzTbZzBbbaFd8sZqwIHxlVNlCkqGmF15AEekjIWUXG+T8UvRqDnUSwLgY49/ONjELjgtXir+QqW+xocOdp0cFw2+4Wym5La8uyFAYtT5AsVok/+KQYbP00LLDniorKLEJ86MJSnByCP05mD1A/zYo5K/RC7V+oCMlfVSX0Lkp92p4uWwgDk1gpTaWvrpOXFlyKjErIrznLfWM+daOTf8RbR9bdZdRZa1X5T+TDKtc6LJzNAt85CBdLFU4IyqXl/bLvKoh0kWpmrq7xa8s7dOfx2r9/aMLThyKkZJmRzf9usK2ne9m7/g+eGRnx7EV1BdFYIQtIbhERiN+eBE4/2HAWaG0ZE1osloheDyOnZk4x3K5MKC30arA5Ax/vDqezNNIjB77MKvHukUMuKbRLUkv6tlv44lBiO3e+IXEZWYhRP/kZ+umzeu09dYZvppiPaOeoCVhEruu7HqYu1VrYHYv5Yr6wYKTXiIMZF+mIha1wTafVZQfArmqcQzfe6Q/AUHA3MDLbrxh0KOmRU7WcJFAOe5GnTV4Ro5XyM93bazqPeQlOiZxS+1jS6UfsGchRomodjoBDcHzfIA7WMI4hufrL5f8cFaeVfHITEP3ZJP0sfZ2abZ5xsm3xgisnTg64DLj4xP/pljVoinHVRW9hHSpgbyz9HE1g+MNzmf7GUxOHNZ47lj1wGQojFpDJeIMld3RaOkJ5Th4aPXX67docnTfQTZ91uYEzOxp+CyYv81DdIjnLjpgYYIrDcEIaBMISTgS7qABnltt+Wgr4dBdkCOWpEJCClqkE/34EZMKpi/v1FGzqlaH1Nselp8f1OprmPTVY6rLGzcCORCCFcSPYTkYF7rCbI42/THCLPpd2371tNvn+eVuHYseaQKwva52LWT/YkUjOArkdM8Oy6iB9gM2bOv6UJBlqp2KA2tp6qloAzDtO4UaAWvYUA/iEQpEXWI3r7eAQAns1BlfmqgewQ7xi+3AC25WwkwW/yIeD4scVqN6dcrZS12HSaigpBejWGSwSSC3HcyzTQjoFm1589zMwwrHl53cfyz9uiyZxSgXs57sNuDeijTVtC0DR2YcIps2M4z5XvSvasyJPc99RQTTtar6HE58eXUqEBoiU7ozS7cleeqiFIyUZfB0Qp/HATmJHRMoxeYYM6anVQUZR6nPhG9uXCAVin/Nor6mLBq53JJvwhDPEJ6FjBeR/Ay+TrvkMmrEBom/O3P27VVgczqruIr7E62TCQiqDQ9+M2to3X1I/W/RImPtik9hpCbZwz2YhBdDIQsYWrHtVCYdjOWbudIGakxFEThNCx47vOQ4+FLsaNfhtrTzVaV3mXKi8DUwjP4peGxj5uzrKOQ8gsFSgEhtQry8fETNnYFRx/p2D+IyHog1HXcWHuM1bLHuiRe23+yma3xoZEqM2WbNVBrtcX9f3vyWePc7SCw0Gt03g6rYMd8ZiVwExITnB8vZ+44mG7a5/rBJxgCVnWksXOogTZp94v285PfhNErWNCcnctv1mnjBHpht5981g3lAfyitz5yVYT4PBEQTP8IUvphzhxPve4xRQUOcnwcQbGW3tZ6pC/J6sXT1j30NX7YxGv/QA1Cj01uVK9+4Xvx5RSB5BdvLWvhwxXndwVBbArKbudTN9ZXDOa0tZSsggYK0g6l00heayaxcpVQgv0zFgYgiuMonAJkOoQAfEh7JrSeYGY5rhH5RUX2vdir0GCDQoO56twAbJpsKvnsK3pNYjUqO0Gfo47lqkWmNRwVricB6uHkUzCri4E7mH+r4ZmAji+mg33kweWUCk0+W4taRm3fb25D5QNjjRzx0d3n//BZ0xs6JxE7SQJP/u1ufQ+fyCIpcp6vV3fclVCFQ8RgyEziI+z9N/+C+wGkTzoEaoe5qf/TGdTsWXpFJCWCKxuo6MTqBniXVmq/bcdyF8MTu6IX1fWRuKdVeMxqdgHZt2tVisSTC7HlIzb8Mx5PJ7Z1LaAaXs1+nDjuFUggDYWqpdDdz+qo97gLQMBndzMm/gxsZj+kPbnBi7wVTnQdwlgxmG7TCwIp5bx05RFvuOt3BQVTrkMVT1DEcK8umaBvRuagpmYTHB/gq4AxusMjJZJhlCxBdX4PJixzGeT9W39qcky8vVIGgfRlENM+5dRE+5TW/byzY91Ys8+pt2EknUO+aSBs5snhrg9f52eXc2iEWtCAZ0CaLEfBgNOBssdHwIdwDf8FyBlNLvUD20Ue8sEdCzP0hlYO0ObF9jZKi4Ht9WenPwApk5DGBdA3Z+UBTiHgnmtDFm6IyY6m6kOIP1OkQnx4hrfwURcun7ttcvtomrjh5sqgi7HigDaKXHD64DxtZJ38phTmyFnnrYceuHrPdCeOMUXKyDw8cyg1JoYBTivTg6WOqTvGN2M15GdYjkXlbejVX/coWq/oOCOsN+EcVY1QdzJVmemKWa2INhU92pLQsXdsTVdyXYjDjkx2PPpItP3e5hoydht1kbFiVeweQZwMsDNRn+QgswN2uvRX1ZRen/z+cHQSGbPMCqovb/kU/cvvTstj43UH1x5VR8im6E9ErzwbLUZuNs29BxrK4feVqy3eFxX4y39mN4XMuoZFiT7rkSmoMPJ3m+SbNLhmhLAeCmp9lSOCto6uZDHcLzdrKjoWIpfW0BNM8VOalJRohCSlcOdHkFGAydtA33JdjvVxO1fae/buNp9F5+n/DrwONiQgA+htcitseWi1ayZUNB6zikdOfPy60zIy8aNPRn3j9QtIQYsVjL3sJptqmz4FrBX1uJE2ubyx1YIJ8hRWugqNmkSjNKZVj4tBYoWixy9NAPAHTcGJGdAj8grzNvhNHAbkxmWFA5abHke+ZGG3YlpGELge/ijK+TbN522KrD66NqnKcmSTVPCennjT72VuobLYHVIU5ShQ7VKnckDw7BsltPqQsyGHX6QOzC50wLMltaSBQeavMZJaL+i1odBUzUGfX+tF9+nJC/hoWjEW7G72SkP4anlOIXoEpz+He7FnuDbzPE/l2QW9dv5TuOiaHRpnHtlI0kNE7RrunzgmrJtPy1BbHbnwbGY31SEEYP+FlyHyBcpPPswl8lR62L381wL34rYY67v1Zo8u8+7srpRiNLmdAEV9J8pPI/qUQGvLC0SHrTRJ7XWUUefhdmkoAExjb+kS6lmp/RV1A3PivCk95z11oB+zrSCGp4o+TCV4xA9Y0/JJpQwEgalBaQPeMeAry9eNU7fUzO+VoHaFdt1MB844ECzL/dtsQg1E+06PND+vuk/EmLgRgBp40NvY1J4hme7hp1MrNhU3kLhA0dUvq+QMgU/chP1DnOw2q5eyiZRCPzRL6p9H2vYbgqRtSBRpvctYpqdfVXUogRZZMV+SwsONRrJgXVebfBLQgcZFrepcJnX/szY8T/xC95nO7YzjTEK9ZhSWs8fKkgCFERLlrGskyLIARqhDWiyCoEjdPRWgiQCKRMloT0LOsFjXdKhqgm6xjtNoAKeg63e8uK3Y3ddwjumJU5kg6xhxK4HHAa6eea0ttzT5W9g8n0ivvvSgQD9GyOiy2H/t10uy94X5E6i7HlkE01ZhBzZ8pVI8FHrVQ8FbvS8yzJIGXuywS2Cy3wnXnWGHYmuAV5RYO4RxYeCvFT9qfRxbe30HRzf2/RoD9+smt5OY3bxEIk5Y4FIKBxyJtKdb/J7gu0iKIVM0gJ6Tvk1dyV0EfoizQFwZAuhUxei4aSJlgzncB2JDfNeLeMSnA6cLM3fnHhnF45pp6XwOHxqB3oOAc86bCSndhiAUF4GxAO0oJhYyaN5T1bP2YIGitqDJz7UpIhkvqYt+3LnFUAnkgwgwUsavZXx7/WhO2Pj6siiVInuNXwTXx4a+zGYt2oA8U2dI7BOHlaehJJdmYsAGfmno8+NZhpGUuHcPJK0D+7t1Rhm4wO2FEDLM5xiY2s58KXdue9XL+XR+/rEG+k1CDmqx7Wvr7UklMNTLP5FU/9brL/9h4af+oalfGfyy54OvOAJAe7gUwD4uTo9b51Z2A6FZw1gMdO/1N6yuS2rjLP3jJzssJeRDnU00g1Ukt1/+jQYO0CUkUgQidhfPt6eFRYbcA4VB4DJkRj1Q9Bji2363+vENyyCFm3wLIQGxG68eqaQ4nDjqk+Ve6oT4+cuFrYj7cHQeLlhukqHIdoHpyTVpHkDXZTkVx7uGVw6jd1lZ2FfY8Fdhan5eK6cInKb1yZL4VyXmRrLSBPUUzM+rlnCGX9Kxra1fHOwJ9TzixpesJbvm1595f1iY1XkpbfzvH4Y7GRj6Asc4Q/pB2fx3eW+551G0tEr6UlsoKXo0gWmsbb0QMbpiPDhqNlqPc2OYiEV58Via6amXxYLgbriV3wgoTmnuPfhecNCh0Mmr41DRR6FL+1vmh8XpjW/wc/ET1PaXl+Bg16BDqCB1QU9fDQCUHaTKoheRrWVLy3OkIUNpZ7pYZXaA/K5yY4DXQlAnDruhfoN2Ma9mQJd4OJwCt4OKfmzRySWJyDRcNb5+RJE7a1p9ic+G13un3CdDNYCSVRl6g2AU1qE08SRmrsi4Z3JFaYwjVuQRNenV5zy1oxx+UYrKhhS7C3ERSJRufsntnRKZhgE4Vw1x7iUDYU+b1REro7TItTOQ3oYS/Q9xR2MpYSUMbY+wfgfUlqOg1QEWNBnPMiyXkoR4pVqvX9BhSB1Cd5pUbs5MYzEkWIihXhsC0XebsBeALzvU3sdDOsvEC2hv6FrhAJ6x5c6wNrT6e0OS9JGEi9Bga4AaojVYCBFhs+WRd09PtGKhhXZ3q8mYrwSLSaL+vGp2GLM21NwJt4WNw1zjsZr/my6hz/Bgi7WFnkfL86z70mU5OsW0AP0C7XuVNHa5rTOlclabUulvUVNg5eeYgV2t7KvIcrBX31IUSlyAHKPS/RkiCMHXQCUgPgjhMrqV0V2PuiEfr2No4EE8NwUYjkG8klG0DYpiJiaWnwjtqkrOv4RoTXZ2+asNMKhyX/LpccjeTVBTxIkR/XNqkJNlglTa89qswWU0R3e7Yf7GXYcv7DxH1WsXM9RbEg4o1wekzhu1R3n0rYYXkVnxQ2LwZ+ySR62dNLUlJzlMIR0Q7bcrFXfZ5y+FEZEFXboWCkvWlwnwqER1TfnBqAlOmyiuMT8u7rMNsocQDyGQq890s/ksQWmtbPXZw6KAodqjt4st42C/IushAm9ugb8LE+vyz2+awHLoWVm8w0D2vop9K1uzwB8pEjMeieX+2sUgdOPy3hUy2b4jWw9yIiwppXJr7OpUdntwSunZFCrIPmHVm6V986Gw8uz5eobP//ZG4DkqAQ4DmWqSF12CJQeUU+CVz96FXF5nfhCHySBq3a4LHV4o3HXmgUOKE6MIhnUcHNXSqk2+EZEfaV8mC+kfXJ48CCviouggBq+M3CEulmf3vD3oPcGLWQTJpT1a/gPqqWdcoHqXeSeQCY6uPJoICfuITdh56Mddfpb2ui+GwQeK3xDABjmfScIJ+8o/et7XEBophqqYxKd84nNBAZtJyS21Xx7c7IBHzFy1xOwodxpy76DgM8ygVVE4MEchFBe6/gatPN1Q9gJNSalgzAul0eMiJFudkzfsf2KuQG3IZUVW5RDf6e9WrSnuvRKkuZrLOjOMWJBZJy+rlpUs75r5dSBCVMjwcJslQpplgnDr4/p70RCb3jokzfgjMbBXlsTq69I9Zlq/wgHyYskb7yLNoyklQC/YFZqaC0oJMSEoUKjLAwhd+gSRghX2Z7j0Fh9B0XMIUICEsHgNdAqrM5FMbuL1XS7rvO2oKsODwbt5jZEZCrQlW/XVICdfd+eQLe4qiqTykP2uE6ysk4gLt9i/s5i0Tad8vKQb6MigYd2WHC8ySS/h+K246aByUBtmfxKRphdxmQSNXoKgPL6frTdpdgv7SP5L8ImvqzQjs1tqR8Hw8YjxsTJf1YdA3nj0BUXboddIRTiGlUztlCG+dQJ0LxkTOOGFda4Q7chWH3SBKTQB6Oet3fKWYHQdaiqx4lw8B1aQDNtH8Q/Vm4PcHsvbubCnqvSKIYz32ZTJFFFFQqyfEf56JwVbvsyPsJaGwl9qsE1FT7D4Jkb5wOrSr57j7Yd0YiZt5lVbAP4cIJiqrhGRG30Ohd7I5niaXp0/vocakDwgMOzAiM47Qk+j3rY4ldZpOTurqOy6vBwR3nDU+V3DIpG+TRdlyDAlmzhfWrzVDXPQPY6Av5zm1vw0a/L7SqgeZU1M2JRlPp6edJJ2xz0Fn2CZQ/WS5CzCh6Ur/XQmCca6U121qa+3b9MbmSx3/Rkc/OeKp3p7gGdGOD0AKa0U6aJy2HBEGkXdqC+d08mojtUGOYYQI0+bTfhvHzoLBmnSjFMZZ4alN5rKJ0m77GY/0u2AGQWNMMElgBmIXYhJqVIxIm5R1/NHHpFgGcXiOaoy5g/ZBIShy9vWfEAAiH13TByJ4/Hj1560jPCu9bn6vqkzM72ErFUDi6VS9JDM+WRVFFrv2wcTA6JdfnsjxMDmQ7/+nVWZm9hX3MsE3xZvBwSu/lnN1TQj9+79edKKJRfsfcBCDkRnYcKvGCZTKLiPhz4iRU21fB8mnGS51onR1x67eAe0iUW9aSYsQ3laojTjsimti3rJfWkHBd9oDYn9EAtFZ+4BE7vCVbH6ONdm0dQNpaT78EtZZWHK46A84qRC84lVGdef1/7UTDBQLleKEdqrlT43OPxn2B2qHVy/4DFew0gx9DkG+Aq5wkW1hyEb39EHF115J2Cn3Bs+RGbO0X1bXauWdOOsHZ1IW57thABYgcL1pxotp00rbSU3CoYvNO9HGu62Et+jQ0u/WG/qttywZ+FKpWg/5dDgHaPTWEnEJZW6bXY57404edmtCzOQzes662wOpcM1e1saOAf2CRhD70DDcZV/7GMPE/5XeSn6HetycJS4ilkTZm3uAXI0+sWMfXnTuVySoN6n9WMdZLtfhzqgiAWe/Z5vuXQOasj/bw7Ce9gu5r7Gnc8L2wuQNcsiYKhnyrn5KZR0nEwh8Z3WAjVh5wdwsOf26orh8Z/0996TAdhzatWcDT38NAutrNJXtYunO/gLH+OnfCoiuE1jKXKSkJmzd+YJmcDQ0PCSNpfwFUK7xPz8gh2cMYItGmptneLtmKjHyvMpSgSF9l431UR8qgjrtaNmKgclOgse3+SPRWyTSdzp00cwL7xe8vmK47LeLyJNg+TisgDE56K+Si1AoeETtXe2lx6+7OTwLY/pEvzXgLlqmpfnHCK5DkM3+CIfepimt+L6dQa8+e7eyKba23t5D9podMk38P1yiXwYH1ZRVyh05i77XXblcfiz9Zuuup0ZFFfg1qmZMY6yUa0oZbieSvJlo968Qo8aqRDN/mPov8xnGEeuk89DqMC5FIx5HLvuVQrKVUVf2xMskBcyvYjjsUFAA7fgFtQ9OppEYvbNqO9TYL8y3hD5bp5qCE3vYAExF8LAt/KuRGUj0Ctw5g1BrEhHakkWCsLHivlbFyX8TiZmM9FJ1JRADmpSEG7Lw/4ODpM5oxjY7+TN1g7y8dkhFnCJlSk0G0xkDjY6Hfmf4V/ZPWdWbz2UwU6D83lbfSgjyXKWwQf0rZ8tKzP9WLrVQx3feDeJGNoiUvq7R7X1nMf+Kj1EgPTEriZ7bpPU7QNDokWrvwMXAxR5CbHM3MQ+p/6bti4FCkZtJGrAoVmTK31B1ve6HuJbCakVhuKVbjSXaR4+FReuvrvxZ8ZgmWITXOvhjKutVcRHiHzEk/ta/tOoi+pPxunUNXL8wN1Q0IIyzWHA+AV3XBTbFZbZMJVclpPB6UuNAF4BhYcQj7w3cbxjSlx3vA3N8C7sA1bjNfS7gNUfy781GDkYXuQiSEGys5pVHJhjGlU9BSnBhW2SqNa+HnAGCdzCGRnXbYEsRIjePGSKuTAZ3PLXXeLi9sbXOm2rwpCxAMJzMDK7P1RUtuSZn/dhvWgs2p4DB6vm04RJhhqT9l6OJBkw251Fcx3dZUFZPSuTU3a54/0PkZwt1PuZEhP3SEmh4FVb2RNje8f0OgS67uFUFHeLCUcYsksKvzWQRH54rmy234CqIK6oAI58t9aH/3vGzDgNOkIo1UWrh/Kf90bviafhN4tkMqTWhmjHfM/ccphCks42h3wkhOCgSzceMeBERtDnfXRYL4ayvBxPYdEo4cx8Q2xMI5dWcAlXZdKHt7UlvPviS8ycilA+jCjq/YhbajzmVZZ7Vnv7nSS+ZBXY4DBV2XwuaylEk32JRLGOvt0JMJz/HhV5q1G9cYxYI0gFjYMQx4KjFYiBKzN8LBp2rgwO+MVEdTCtWEgqxIJGmvjhQl8ryQ3hixeY39sOxdqJmO2Pc9y13Kjdn3gbZsR/pIqJ4FCfqWPnLyS6OI1+Eq/efHuBDeuxLOVRzKr26uC8UACmkLFrTPjNqVNnSLHzPrioguc/URkRoTCVXgpC5+pPNncpQ9cFauSF9P/Yr66yGiL37tJXLeNQjedqNc9KUbRHhCXVbCn2ooPsoQu2hAhzOthGYZGwVvXYNlPdStlTs33HupcTudd5x5EjGMGjIziF3LAyNkjBjT4qxJholpfj9x4CFlnTFjZtsxH0ONupUVUboMfDQ1PuGmuN2kaKdzF6tAH8UWWbnvs8YHk/ttrgjYaZY73FdWkrBVMNAs0176vsxbx7aRZqCKfgg1oZ9tePgUZF9BTYGZbwxmSbrWn3YazLA34sigKJv9VDz49DUWETfO5st8695IUvPYo2zrWrS0/1ZmJPDtdENObIlw7fE1rubmDhsifRFJ59eTKlyTgujrn7xPs5Tz0Z8icCbL69UfC4tGWtk0xJ9Q26/meNgi6McVAFicI5DjOsc0sYfOmYAEyauDZWOH9OcX0KhWIrFnSmdFzT9Bz7MhjSMsawAUtch7OiDeARsoRK25vpvlXz0a/HnNVxeGF8Di7FT7OZHfGvHj1e9rR3LmRydXExiNJcFz7wKN68wZ7DWcECrQ2y5/PgEUS+N5UiTA0RTEfNPYOklH1LPUJ7UtJaBfX45MNpGgTxdO9jqMimxSBVtkkUSa5xJGqiIBFOjP9omSFMUBwq/rSgUrg23rRNL8MQxvPSxCTPRigZzeQqbxLBeP6zVw6W6FPtaMcPK6g7j5nneLX3gjCB98HFtv343tV705b/23rIsYEQGu4dMlOhBHk9pMuwuhUgL3l6fhQxQoUvB6LnsLKI4ifr2oKr76Uy9/5sr3UMAfg/ycN5HCzZmEDNl375uFA+YxsF0TWtWT8/4gSyCCjp+1XiDfG45APpJOJ/3YWuGyd4ZPCCYKYVjub/w5\"}"
+}
\ No newline at end of file
diff --git a/src/_schema.json b/src/_schema.json
new file mode 100644
index 0000000..33b2953
--- /dev/null
+++ b/src/_schema.json
@@ -0,0 +1,5 @@
+
+
+{
+ "Initial version": "{\"iv\":\"1onoaxzdwupnCwD6\",\"encryptedData\":\"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\"}"
+}
diff --git a/src/config.js b/src/config.js
new file mode 100644
index 0000000..507ae1c
--- /dev/null
+++ b/src/config.js
@@ -0,0 +1,16 @@
+
+
+const config = {
+ schema_encryption_key: process.env.SCHEMA_ENCRYPTION_KEY || 'oAYZbSQ7otWLWy/1v6KGwzcpfe4LxdtkDcAUD7HAaw0=',
+
+ project_uuid: '002bf152-658c-4d2c-b0b0-a20c706dc31d',
+ flHost: process.env.NODE_ENV === 'production' ? 'https://flatlogic.com/projects' : 'http://localhost:3000/projects',
+
+ gitea_domain: process.env.GITEA_DOMAIN || 'gitea.flatlogic.app',
+ gitea_username: process.env.GITEA_USERNAME || 'admin',
+ gitea_api_token: process.env.GITEA_API_TOKEN || 'f22e83489657f49c320d081fc934e5c9daacfa08',
+ github_repo_url: process.env.GITHUB_REPO_URL || null,
+ github_token: process.env.GITHUB_TOKEN || null,
+};
+
+module.exports = config;
diff --git a/src/helpers.js b/src/helpers.js
new file mode 100644
index 0000000..1d918b5
--- /dev/null
+++ b/src/helpers.js
@@ -0,0 +1,23 @@
+const jwt = require('jsonwebtoken');
+const config = require('./config');
+
+module.exports = class Helpers {
+ static wrapAsync(fn) {
+ return function (req, res, next) {
+ fn(req, res, next).catch(next);
+ };
+ }
+
+ static commonErrorHandler(error, req, res, next) {
+ if ([400, 403, 404].includes(error.code)) {
+ return res.status(error.code).send(error.message);
+ }
+
+ console.error(error);
+ return res.status(500).send(error.message);
+ }
+
+ static jwtSign(data) {
+ return jwt.sign(data, config.secret_key, { expiresIn: '6h' });
+ }
+};
diff --git a/src/index.js b/src/index.js
new file mode 100644
index 0000000..e33065d
--- /dev/null
+++ b/src/index.js
@@ -0,0 +1,54 @@
+const express = require('express');
+const cors = require('cors');
+const app = express();
+const bodyParser = require('body-parser');
+const checkPermissions = require('./middlewares/check-permissions');
+const modifyPath = require('./middlewares/modify-path');
+const VCS = require('./services/vcs');
+
+const executorRoutes = require('./routes/executor');
+const vcsRoutes = require('./routes/vcs');
+
+// Function to initialize the Git repository
+function initRepo() {
+ const projectId = '30959';
+ return VCS.initRepo(projectId);
+}
+
+// Start the Express app on APP_SHELL_PORT (4000)
+function startServer() {
+ const PORT = 4000;
+ app.listen(PORT, () => {
+ console.log(`Listening on port ${PORT}`);
+ });
+}
+
+// Run Git check after the server is up
+function runGitCheck() {
+ initRepo()
+ .then(result => {
+ console.log(result?.message ? result.message : result);
+ // Here you can add additional logic if needed
+ })
+ .catch(err => {
+ console.error('Error during repo initialization:', err);
+ // Optionally exit the process if Git check is critical:
+ // process.exit(1);
+ });
+}
+
+app.use(cors({ origin: true }));
+app.use(bodyParser.json());
+app.use(checkPermissions);
+app.use(modifyPath);
+
+app.use('/executor', executorRoutes);
+app.use('/vcs', vcsRoutes);
+
+// Start the app_shell server
+startServer();
+
+// Now perform Git check
+runGitCheck();
+
+module.exports = app;
diff --git a/src/middlewares/check-permissions.js b/src/middlewares/check-permissions.js
new file mode 100644
index 0000000..cc9d90a
--- /dev/null
+++ b/src/middlewares/check-permissions.js
@@ -0,0 +1,17 @@
+const config = require('../config');
+
+function checkPermissions(req, res, next) {
+ const project_uuid = config.project_uuid;
+ const requiredHeader = 'X-Project-UUID';
+ const headerValue = req.headers[requiredHeader.toLowerCase()];
+ // Logging whatever request we're getting
+ console.log('Request:', req.url, req.method, req.body, req.headers);
+
+ if (headerValue && headerValue === project_uuid) {
+ next();
+ } else {
+ res.status(403).send({ error: 'Stop right there, criminal scum! Your project UUID is invalid or missing.' });
+ }
+}
+
+module.exports = checkPermissions;
\ No newline at end of file
diff --git a/src/middlewares/modify-path.js b/src/middlewares/modify-path.js
new file mode 100644
index 0000000..0154280
--- /dev/null
+++ b/src/middlewares/modify-path.js
@@ -0,0 +1,8 @@
+function modifyPath(req, res, next) {
+ if (req.body && req.body.path) {
+ req.body.path = '../../../' + req.body.path;
+ }
+ next();
+ }
+
+module.exports = modifyPath;
\ No newline at end of file
diff --git a/src/routes/executor.js b/src/routes/executor.js
new file mode 100644
index 0000000..588cfff
--- /dev/null
+++ b/src/routes/executor.js
@@ -0,0 +1,312 @@
+const express = require('express');
+const multer = require('multer');
+const upload = multer({ dest: 'uploads/' });
+const fs = require('fs');
+
+const ExecutorService = require('../services/executor');
+
+const wrapAsync = require('../helpers').wrapAsync;
+
+const router = express.Router();
+
+router.post(
+ '/read_project_tree',
+ wrapAsync(async (req, res) => {
+ const { path } = req.body;
+ const tree = await ExecutorService.readProjectTree(path);
+ res.status(200).send(tree);
+ }),
+);
+
+router.post(
+ '/read_file',
+ wrapAsync(async (req, res) => {
+ const { path, showLines } = req.body;
+ const content = await ExecutorService.readFileContents(path, showLines);
+ res.status(200).send(content);
+ }),
+);
+
+router.post(
+ '/count_file_lines',
+ wrapAsync(async (req, res) => {
+ const { path } = req.body;
+ const content = await ExecutorService.countFileLines(path);
+ res.status(200).send(content);
+ }),
+);
+
+// router.post(
+// '/read_file_header',
+// wrapAsync(async (req, res) => {
+// const { path, N } = req.body;
+// try {
+// const header = await ExecutorService.readFileHeader(path, N);
+// res.status(200).send(header);
+// } catch (error) {
+// res.status(500).send({
+// error: true,
+// message: error.message,
+// details: error.details || error.stack,
+// validation: error.validation
+// });
+// }
+// }),
+// );
+
+router.post(
+ '/read_file_line_context',
+ wrapAsync(async (req, res) => {
+ const { path, lineNumber, windowSize, showLines } = req.body;
+ try {
+ const context = await ExecutorService.readFileLineContext(path, lineNumber, windowSize, showLines);
+ res.status(200).send(context);
+ } catch (error) {
+ res.status(500).send({
+ error: true,
+ message: error.message,
+ details: error.details || error.stack,
+ validation: error.validation
+ });
+ }
+ }),
+);
+
+router.post(
+ '/write_file',
+ wrapAsync(async (req, res) => {
+ const { path, fileContents, comment } = req.body;
+ try {
+ await ExecutorService.writeFile(path, fileContents, comment);
+ res.status(200).send({ message: 'File written successfully' });
+ } catch (error) {
+ res.status(500).send({
+ error: true,
+ message: error.message,
+ details: error.details || error.stack,
+ validation: error.validation
+ });
+ }
+ }),
+);
+
+router.post(
+ '/insert_file_content',
+ wrapAsync(async (req, res) => {
+ const { path, lineNumber, newContent, message } = req.body;
+ try {
+ await ExecutorService.insertFileContent(path, lineNumber, newContent, message);
+ res.status(200).send({ message: 'File written successfully' });
+ } catch (error) {
+ res.status(500).send({
+ error: true,
+ message: error.message,
+ details: error.details || error.stack,
+ validation: error.validation
+ });
+ }
+ }),
+);
+
+router.post(
+ '/replace_file_line',
+ wrapAsync(async (req, res) => {
+ const { path, lineNumber, newText } = req.body;
+ try {
+ const result = await ExecutorService.replaceFileLine(path, lineNumber, newText);
+ res.status(200).send(result);
+ } catch (error) {
+ res.status(500).send({
+ error: true,
+ message: error.message,
+ details: error.details || error.stack,
+ validation: error.validation
+ });
+ }
+ }),
+);
+router.post(
+ '/replace_file_chunk',
+ wrapAsync(async (req, res) => {
+ const { path, startLine, endLine, newCode } = req.body;
+ try {
+ const result = await ExecutorService.replaceFileChunk(path, startLine, endLine, newCode);
+ res.status(200).send(result);
+ } catch (error) {
+ res.status(500).send({
+ error: true,
+ message: error.message,
+ details: error.details || error.stack,
+ validation: error.validation
+ });
+ }
+ }),
+);
+
+router.post(
+ '/delete_file_lines',
+ wrapAsync(async (req, res) => {
+ const { path, startLine, endLine, message } = req.body;
+ try {
+ const result = await ExecutorService.deleteFileLines(path, startLine, endLine, message);
+ res.status(200).send(result);
+ } catch (error) {
+ res.status(500).send({
+ error: true,
+ message: error.message,
+ details: error.details || error.stack,
+ validation: error.validation
+ });
+ }
+ }),
+);
+
+router.post(
+ '/validate_file',
+ wrapAsync(async (req, res) => {
+ const { path } = req.body;
+ try {
+ const validationResult = await ExecutorService.validateFile(path);
+ res.status(200).send({ validationResult });
+ } catch (error) {
+ res.status(500).send({
+ error: true,
+ message: error.message,
+ details: error.details || error.stack,
+ validation: error.validation
+ });
+ }
+ }),
+);
+
+
+router.post(
+ '/check_frontend_runtime_error',
+ wrapAsync(async (req, res) => {
+ try {
+ const result = await ExecutorService.checkFrontendRuntimeLogs();
+ res.status(200).send(result);
+ } catch (error) {
+ res.status(500).send({ error: error });
+ }
+ }),
+);
+
+
+router.post(
+ '/replace_code_block',
+ wrapAsync(async (req, res) => {
+ const {path, oldCode, newCode, message} = req.body;
+ try {
+ const response = await ExecutorService.replaceCodeBlock(path, oldCode, newCode, message);
+ res.status(200).send(response);
+ } catch (error) {
+ res.status(500).send({
+ error: true,
+ message: error.message,
+ details: error.details || error.stack,
+ validation: error.validation
+ })
+ }
+ })
+)
+
+router.post('/update_project_files_from_scheme',
+ upload.single('file'), // 'file' - name of the field in the form
+ async (req, res) => {
+ console.log('Request received');
+ console.log('Headers:', req.headers);
+ if (!req.file) {
+ return res.status(400).json({ error: 'No file uploaded' });
+ }
+
+ console.log('File info:', {
+ originalname: req.file.originalname,
+ path: req.file.path,
+ size: req.file.size,
+ mimetype: req.file.mimetype
+ });
+
+ try {
+ console.log('Starting update process...');
+ const result = await ExecutorService.updateProjectFilesFromScheme(req.file.path);
+ console.log('Update completed, result:', result);
+
+ console.log('Removing temp file...');
+ fs.unlinkSync(req.file.path);
+ console.log('Temp file removed');
+
+ console.log('Sending response...');
+ return res.json(result);
+ } catch (error) {
+ console.error('Error in route handler:', error);
+ if (req.file) {
+ try {
+ fs.unlinkSync(req.file.path);
+ console.log('Temp file removed after error');
+ } catch (unlinkError) {
+ console.error('Error removing temp file:', unlinkError);
+ }
+ }
+ console.error('Update project files error:', error);
+ return res.status(500).json({
+ error: error.message,
+ stack: process.env.NODE_ENV === 'development' ? error.stack : undefined
+ });
+ }
+ }
+);
+
+router.post(
+ '/get_db_schema',
+ wrapAsync(async (req, res) => {
+ try {
+
+ const jsonSchema = await ExecutorService.getDBSchema();
+ res.status(200).send({ jsonSchema });
+ } catch (error) {
+ res.status(500).send({ error: error });
+ }
+ }),
+);
+
+router.post(
+ '/execute_sql',
+ wrapAsync(async (req, res) => {
+ try {
+ const { query } = req.body;
+ const result = await ExecutorService.executeSQL(query);
+ res.status(200).send(result);
+ } catch (error) {
+ res.status(500).send({ error: error });
+ }
+ }),
+);
+
+router.post(
+ '/search_files',
+ wrapAsync(async (req, res) => {
+ try {
+ const { searchStrings } = req.body;
+
+ if (
+ typeof searchStrings !== 'string' &&
+ !(
+ Array.isArray(searchStrings) &&
+ searchStrings.every(item => typeof item === 'string')
+ )
+ ) {
+ return res.status(400).send({ error: 'searchStrings must be a string or an array of strings' });
+ }
+
+ const result = await ExecutorService.searchFiles(searchStrings);
+ res.status(200).send(result);
+ } catch (error) {
+ res.status(500).send({ error: error.message });
+ }
+ }),
+);
+
+router.use('/', require('../helpers').commonErrorHandler);
+
+module.exports = router;
diff --git a/src/routes/vcs.js b/src/routes/vcs.js
new file mode 100644
index 0000000..926498d
--- /dev/null
+++ b/src/routes/vcs.js
@@ -0,0 +1,40 @@
+const express = require('express');
+const wrapAsync = require('../helpers').wrapAsync; // Ваша обёртка для обработки асинхронных маршрутов
+const VSC = require('../services/vcs');
+const router = express.Router();
+
+router.post('/init', wrapAsync(async (req, res) => {
+ const result = await VSC.initRepo();
+ res.status(200).send(result);
+}));
+
+router.post('/commit', wrapAsync(async (req, res) => {
+ const { message, files, dev_schema } = req.body;
+ const result = await VSC.commitChanges(message, files, dev_schema);
+ res.status(200).send(result);
+}));
+
+router.post('/log', wrapAsync(async (req, res) => {
+ const result = await VSC.getLog();
+ res.status(200).send(result);
+}));
+
+router.post('/rollback', wrapAsync(async (req, res) => {
+ const { ref } = req.body;
+ // const result = await VSC.checkout(ref);
+ const result = await VSC.revert(ref);
+ res.status(200).send(result);
+}));
+
+router.post('/sync-to-stable', wrapAsync(async (req, res) => {
+ const result = await VSC.mergeDevIntoMaster();
+ res.status(200).send(result);
+}));
+
+router.post('/reset-dev', wrapAsync(async (req, res) => {
+ const result = await VSC.resetDevBranch();
+ res.status(200).send(result);
+}));
+
+router.use('/', require('../helpers').commonErrorHandler);
+module.exports = router;
\ No newline at end of file
diff --git a/src/services/database.js b/src/services/database.js
new file mode 100644
index 0000000..bf8f3a9
--- /dev/null
+++ b/src/services/database.js
@@ -0,0 +1,88 @@
+// Database.js
+const { Client } = require('pg');
+const config = require('../../../backend/src/db/db.config');
+
+const env = process.env.NODE_ENV || 'development';
+const dbConfig = config[env];
+
+class Database {
+ constructor() {
+ this.client = new Client({
+ user: dbConfig.username,
+ password: dbConfig.password,
+ database: dbConfig.database,
+ host: dbConfig.host,
+ port: dbConfig.port
+ });
+
+ // Connect once, reuse the client
+ this.client.connect().catch(err => {
+ console.error('Error connecting to the database:', err);
+ throw err;
+ });
+ }
+
+ async executeSQL(query) {
+ try {
+ const result = await this.client.query(query);
+ return {
+ success: true,
+ rows: result.rows
+ };
+ } catch (error) {
+ console.error('Error executing query:', error);
+ throw error;
+ }
+ }
+
+ // Method to fetch simple table/column info from 'information_schema'
+ // (You can expand this to handle constraints, indexes, etc.)
+ async getDBSchema(schemaName = 'public') {
+ try {
+ const tableQuery = `
+ SELECT table_name
+ FROM information_schema.tables
+ WHERE table_schema = $1
+ AND table_type = 'BASE TABLE'
+ ORDER BY table_name
+ `;
+
+ const columnQuery = `
+ SELECT table_name, column_name, data_type, is_nullable
+ FROM information_schema.columns
+ WHERE table_schema = $1
+ ORDER BY table_name, ordinal_position
+ `;
+
+ const [tablesResult, columnsResult] = await Promise.all([
+ this.client.query(tableQuery, [schemaName]),
+ this.client.query(columnQuery, [schemaName]),
+ ]);
+
+ // Build a simple schema object:
+ const tables = tablesResult.rows.map(row => row.table_name);
+ const columnsByTable = {};
+
+ columnsResult.rows.forEach(row => {
+ const { table_name, column_name, data_type, is_nullable } = row;
+ if (!columnsByTable[table_name]) columnsByTable[table_name] = [];
+ columnsByTable[table_name].push({ column_name, data_type, is_nullable });
+ });
+
+ // Combine tables with their columns
+ return tables.map(table => ({
+ table,
+ columns: columnsByTable[table] || [],
+ }));
+ } catch (error) {
+ console.error('Error fetching schema:', error);
+ throw error;
+ }
+ }
+
+ async close() {
+ await this.client.end();
+ }
+}
+
+module.exports = new Database();
diff --git a/src/services/executor.js b/src/services/executor.js
new file mode 100644
index 0000000..eecb869
--- /dev/null
+++ b/src/services/executor.js
@@ -0,0 +1,1206 @@
+const fs = require('fs').promises;
+const os = require('os');
+const path = require('path');
+const AdmZip = require('adm-zip');
+const { exec } = require('child_process');
+const util = require('util');
+const ProjectEventsService = require('./project-events');
+const config = require('../config.js');
+// Babel Parser for JS/TS/TSX
+const babelParser = require('@babel/parser');
+const babelParse = babelParser.parse;
+
+// Local App DB Connection
+const database = require('./database');
+
+// PostCSS for CSS
+const postcss = require('postcss');
+
+const execAsync = util.promisify(exec);
+
+module.exports = class ExecutorService {
+ static async readProjectTree(directoryPath) {
+ const paths = {
+ frontend: '../../../frontend',
+ backend: '../../../backend',
+ default: '../../../'
+ };
+
+ try {
+ const publicDir = path.join(__dirname, paths[directoryPath] || directoryPath || paths.default);
+
+ return await getDirectoryTree(publicDir);
+ } catch (error) {
+ console.error('Error reading directory:', error);
+
+ throw error;
+ }
+ }
+
+ static async readFileContents(filePath, showLines) {
+ try {
+ const fullPath = path.join(__dirname, filePath);
+ const content = await fs.readFile(fullPath, 'utf8');
+
+ if (showLines) {
+ const lines = content.split('\n');
+
+ const lineObject = {};
+ lines.forEach((line, index) => {
+ lineObject[index + 1] = line;
+ });
+
+ return lineObject;
+ } else {
+ return content;
+ }
+ } catch (error) {
+ console.error('Error reading file:', error);
+ throw error;
+ }
+ }
+
+ static async countFileLines(filePath) {
+ try {
+ const fullPath = path.join(__dirname, filePath);
+
+ // Check file exists
+ await fs.access(fullPath);
+
+ // Read file content
+ const content = await fs.readFile(fullPath, 'utf8');
+
+ // Split by newline and count
+ const lines = content.split('\n');
+
+ return {
+ success: true,
+ lineCount: lines.length
+ };
+ } catch (error) {
+ console.error('Error counting file lines:', error);
+ return {
+ success: false,
+ message: error.message
+ };
+ }
+ }
+
+ // static async readFileHeader(filePath, N = 30) {
+ // try {
+ // const fullPath = path.join(__dirname, filePath);
+ // const content = await fs.readFile(fullPath, 'utf8');
+ // const lines = content.split('\n');
+ //
+ // if (lines.length < N) {
+ // return { error: `File has less than ${N} lines` };
+ // }
+ //
+ // const headerLines = lines.slice(0, Math.min(50, lines.length));
+ //
+ // const lineObject = {};
+ // headerLines.forEach((line, index) => {
+ // lineObject[index + 1] = line;
+ // });
+ //
+ // return lineObject;
+ // } catch (error) {
+ // console.error('Error reading file header:', error);
+ // throw error;
+ // }
+ // }
+
+ static async readFileLineContext(filePath, lineNumber, windowSize, showLines) {
+ try {
+ const fullPath = path.join(__dirname, filePath);
+ const content = await fs.readFile(fullPath, 'utf8');
+ const lines = content.split('\n');
+
+ const start = Math.max(0, lineNumber - windowSize);
+ const end = Math.min(lines.length, lineNumber + windowSize + 1);
+
+ const contextLines = lines.slice(start, end);
+
+ if (showLines) {
+ const lineObject = {};
+ contextLines.forEach((line, index) => {
+ lineObject[start + index + 1] = line;
+ });
+
+ return lineObject;
+ } else {
+ return contextLines.join('\n');
+ }
+ } catch (error) {
+ console.error('Error reading file line context:', error);
+ throw error;
+ }
+ }
+
+ static async validateFile(filePath) {
+ console.log('Validating file:', filePath);
+
+ // Read file content
+ let content;
+ try {
+ content = await fs.readFile(filePath, 'utf8');
+ } catch (err) {
+ throw new Error(`Could not read file: ${filePath}\n${err.message}`);
+ }
+
+ // Determine file extension
+ let ext = path.extname(filePath).toLowerCase();
+ if (ext === '.temp') {
+ ext = path.extname(filePath.slice(0, -5)).toLowerCase();
+ }
+
+ try {
+ switch (ext) {
+ case '.js':
+ case '.ts':
+ case '.tsx': {
+ // Parse JS/TS/TSX with Babel
+ babelParse(content, {
+ sourceType: 'module',
+ // plugins array covers JS, TS, TSX, and optional JS flavors
+ plugins: ['jsx', 'typescript']
+ });
+ break;
+ }
+
+ case '.css': {
+ // Parse CSS with PostCSS
+ postcss.parse(content);
+ break;
+ }
+
+ default: {
+ // If the extension isn't recognized, assume it's "valid"
+ // or you could throw an error to force a known extension
+ console.warn(`No validation implemented for extension "${ext}". Skipping syntax check.`);
+ }
+ }
+
+ // If parsing succeeded, return true
+ return true;
+
+ } catch (parseError) {
+ // Rethrow parse errors with a friendlier message
+ throw parseError;
+ }
+ }
+
+ static async checkFrontendRuntimeLogs() {
+ const frontendLogPath = '../frontend/json/runtimeError.json';
+
+ try {
+ // Check if file exists
+ try {
+ console.log('Accessing frontend logs:', frontendLogPath);
+ await fs.access(frontendLogPath);
+ } catch (error) {
+ console.log('Frontend logs not found:', error);
+ // File doesn't exist - return empty object
+ return {runtime_error: {}};
+ }
+
+ // File exists, try to read it
+ try {
+ // Read the entire file instead of using tail
+ const fileContent = await fs.readFile(frontendLogPath, 'utf8');
+ console.log('Reading frontend logs:', fileContent);
+
+ // Handle empty file
+ if (!fileContent || fileContent.trim() === '') {
+ return {runtime_error: {}};
+ }
+
+ // Parse JSON content
+ const runtime_error = JSON.parse(fileContent);
+
+ console.log('Parsed frontend logs:', runtime_error);
+ return {runtime_error};
+ } catch (error) {
+ // Error reading or parsing file
+ console.error('Error reading frontend runtime logs:', error);
+ return {runtime_error: {}};
+ }
+ } catch (error) {
+ // Unexpected error
+ console.log('Error checking frontend logs:', error);
+ return {runtime_error: {}};
+ }
+ }
+
+ static async writeFile(filePath, fileContents, comment) {
+ try {
+ console.log(comment)
+ const fullPath = path.join(__dirname, filePath);
+
+ // Write to a temp file first
+ const tempPath = `${fullPath}.temp`;
+ await fs.writeFile(tempPath, fileContents, 'utf8');
+
+ // Validate the temp file
+ await this.validateFile(tempPath);
+
+ // Rename temp file to original path
+ await fs.rename(tempPath, fullPath);
+
+ return true;
+ } catch (error) {
+ console.error('Error writing file:', error);
+ throw error;
+ }
+ }
+
+ static async insertFileContent(filePath, lineNumber, newContent, message) {
+ try {
+ const fullPath = path.join(__dirname, filePath);
+
+ // Check file exists
+ await fs.access(fullPath);
+
+ // Read and split by line
+ const content = await fs.readFile(fullPath, 'utf8');
+ const lines = content.split('\n');
+
+ // Ensure lineNumber is within [1 ... lines.length + 1]
+ // 1 means "insert at the very first line"
+ // lines.length + 1 means "append at the end"
+ if (lineNumber < 1) {
+ lineNumber = 1;
+ }
+ if (lineNumber > lines.length + 1) {
+ lineNumber = lines.length + 1;
+ }
+
+ // Convert to 0-based index
+ const insertIndex = lineNumber - 1;
+
+ // Prepare preview
+ const preview = {
+ insertionLine: lineNumber,
+ insertedLines: newContent.split('\n')
+ };
+
+ // Insert newContent lines at the specified index
+ lines.splice(insertIndex, 0, ...newContent.split('\n'));
+
+ // Write changes to a temp file first
+ const updatedContent = lines.join('\n');
+ const tempPath = `${fullPath}.temp`;
+ await fs.writeFile(tempPath, updatedContent, 'utf8');
+
+ await this.validateFile(tempPath);
+
+ // Rename temp file to original path
+ await fs.rename(tempPath, fullPath);
+
+ return {
+ success: true
+ };
+
+ } catch (error) {
+ console.error('Error inserting file content:', error);
+ throw error;
+ }
+ }
+
+ static async replaceFileLine(filePath, lineNumber, newText, message = null) {
+ const fullPath = path.join(__dirname, filePath);
+ try {
+
+ try {
+ await fs.access(fullPath);
+ } catch (error) {
+ throw new Error(`File not found: ${filePath}`);
+ }
+
+ const content = await fs.readFile(fullPath, 'utf8');
+ const lines = content.split('\n');
+
+ if (lineNumber < 1 || lineNumber > lines.length) {
+ throw new Error(`Invalid line number: ${lineNumber}. File has ${lines.length} lines`);
+ }
+
+ if (typeof newText !== 'string') {
+ throw new Error('New text must be a string');
+ }
+
+ const preview = {
+ oldLine: lines[lineNumber - 1],
+ newLine: newText,
+ lineNumber: lineNumber
+ };
+
+ lines[lineNumber - 1] = newText;
+ const newContent = lines.join('\n');
+ const tempPath = `${fullPath}.temp`;
+ await fs.writeFile(tempPath, newContent, 'utf8');
+
+ await this.validateFile(tempPath);
+
+ await fs.rename(tempPath, fullPath);
+
+ return {
+ success: true
+ };
+
+ } catch (error) {
+ console.error('Error updating file line:', error);
+
+ try {
+ await fs.unlink(`${fullPath}.temp`);
+ } catch {
+ }
+
+ throw {
+ error: error,
+ message: error.message,
+ details: error.stack
+ };
+ }
+ }
+
+ static async replaceFileChunk(filePath, startLine, endLine, newCode) {
+ try {
+ // Check if this is a single-line change
+ const newCodeLines = newCode.split('\n');
+ if (newCodeLines.length === 1 && endLine === startLine) {
+ // Redirect to replace_file_line
+ return await this.replaceFileLine(filePath, startLine, newCode);
+ }
+
+ const fullPath = path.join(__dirname, filePath);
+
+ // Check if file exists
+ try {
+ await fs.access(fullPath);
+ } catch (error) {
+ throw new Error(`File not found: ${filePath}`);
+ }
+
+ const content = await fs.readFile(fullPath, 'utf8');
+ const lines = content.split('\n');
+
+ // Adjust line numbers to array indices (subtract 1)
+ const startIndex = startLine - 1;
+ const endIndex = endLine - 1;
+
+ // Validate input parameters
+ if (startIndex < 0 || endIndex >= lines.length || startIndex > endIndex) {
+ throw new Error(`Invalid line range: ${startLine}-${endLine}. File has ${lines.length} lines`);
+ }
+
+ // Check type of new code
+ if (typeof newCode !== 'string') {
+ throw new Error('New code must be a string');
+ }
+
+ // Create changes preview
+ const preview = {
+ oldLines: lines.slice(startIndex, endIndex + 1),
+ newLines: newCode.split('\n'),
+ startLine,
+ endLine
+ };
+
+ // Apply changes to temp file first
+ lines.splice(startIndex, endIndex - startIndex + 1, ...newCode.split('\n'));
+ const newContent = lines.join(os.EOL);
+ const tempPath = `${fullPath}.temp`;
+ await fs.writeFile(tempPath, newContent, 'utf8');
+ await this.validateFile(tempPath);
+ // Apply changes if all validations passed
+ await fs.rename(tempPath, fullPath);
+
+ return {
+ success: true
+ };
+
+ } catch (error) {
+ console.error('Error updating file slice:', error);
+
+ // Clean up temp file if exists
+ try {
+ await fs.unlink(`${fullPath}.temp`);
+ } catch {
+ }
+
+ throw {
+ error: error,
+ message: error.message,
+ details: error.details || error.stack
+ };
+ }
+ }
+
+ static async replaceCodeBlock(filePath, oldCode, newCode, message) {
+ try {
+ console.log(message);
+ const fullPath = path.join(__dirname, filePath);
+
+ // Check file exists
+ await fs.access(fullPath);
+
+ // Read file content
+ let content = await fs.readFile(fullPath, 'utf8');
+
+ // A small helper to unify line breaks to just `\n`
+ const unifyLineBreaks = (str) => str.replace(/\r\n/g, '\n');
+
+ // Normalize line breaks in file content, oldCode, and newCode
+ content = unifyLineBreaks(content);
+ oldCode = unifyLineBreaks(oldCode);
+ newCode = unifyLineBreaks(newCode);
+
+ // Optional: Trim trailing spaces or handle other whitespace normalization if needed
+ // oldCode = oldCode.trim();
+ // newCode = newCode.trim();
+
+ // Check if oldCode actually exists in the content
+ const index = content.indexOf(oldCode);
+ if (index === -1) {
+ return {
+ success: false,
+ message: 'Old code not found in file.'
+ };
+ }
+
+ // Create a preview before replacing
+ const preview = {
+ oldCodeSnippet: oldCode,
+ newCodeSnippet: newCode
+ };
+
+ // Perform replacement (single occurrence). For multiple, use replaceAll or a loop.
+ // If you want a global replacement, consider:
+ // content = content.split(oldCode).join(newCode);
+ content = content.replace(oldCode, newCode);
+
+ // Write to a temp file first
+ const tempPath = `${fullPath}.temp`;
+ await fs.writeFile(tempPath, content, 'utf8');
+
+ await this.validateFile(tempPath);
+ // Rename temp file to original
+ await fs.rename(tempPath, fullPath);
+
+ return {
+ success: true
+ };
+
+ } catch (error) {
+ console.error('Error replacing code:', error);
+ return {
+ error: error,
+ message: error.message,
+ details: error.details || error.stack
+ };
+ }
+ }
+
+ //todo add validation
+ static async deleteFileLines(filePath, startLine, endLine, veryShortDescription) {
+ try {
+ const fullPath = path.join(__dirname, filePath);
+
+ // Check if file exists
+ await fs.access(fullPath);
+
+ // Read file content
+ const content = await fs.readFile(fullPath, 'utf8');
+ const lines = content.split('\n');
+
+ // Convert to zero-based indices
+ const startIndex = startLine - 1;
+ const endIndex = endLine - 1;
+
+ // Validate range
+ if (startIndex < 0 || endIndex >= lines.length || startIndex > endIndex) {
+ throw new Error(
+ `Invalid line range: ${startLine}-${endLine}. File has ${lines.length} lines`
+ );
+ }
+
+ // Prepare a preview of the lines being deleted
+ const preview = {
+ deletedLines: lines.slice(startIndex, endIndex + 1),
+ startLine,
+ endLine
+ };
+
+ // Remove lines
+ lines.splice(startIndex, endIndex - startIndex + 1);
+
+ // Join remaining lines and write to a temporary file
+ const newContent = lines.join('\n');
+ const tempPath = `${fullPath}.temp`;
+ await fs.writeFile(tempPath, newContent, 'utf8');
+
+ await this.validateFile(tempPath);
+ // Rename temp file to original
+ await fs.rename(tempPath, fullPath);
+
+ return {
+ success: true
+ };
+
+ } catch (error) {
+ console.error('Error deleting file lines:', error);
+ return {
+ error: error,
+ message: error.message,
+ details: error.details || error.stack
+ };
+ }
+ }
+
+ static async validateTypeScript(filePath, content = null) {
+ try {
+ // Basic validation of JSX syntax
+ const jsxErrors = [];
+
+ if (content !== null) {
+ // Check for matching braces
+ if ((content.match(/{/g) || []).length !== (content.match(/}/g) || []).length) {
+ jsxErrors.push("Unmatched curly braces");
+ }
+
+ // Check for invalid syntax in JSX attributes
+ if (content.includes('label={')) {
+ if (!content.match(/label={[^}]+}/)) {
+ jsxErrors.push("Invalid label attribute syntax");
+ }
+ }
+
+ if (jsxErrors.length > 0) {
+ return {
+ valid: false,
+ errors: jsxErrors.map(error => ({
+ code: 'JSX_SYNTAX_ERROR',
+ severity: 'error',
+ location: '',
+ message: error
+ }))
+ };
+ }
+ }
+
+ return {
+ valid: true,
+ errors: [],
+ errorCount: 0,
+ warningCount: 0
+ };
+
+ } catch (error) {
+ console.error('TypeScript validation error:', error);
+ return {
+ valid: false,
+ errors: [{
+ code: 'VALIDATION_FAILED',
+ severity: 'error',
+ location: '',
+ message: `TypeScript validation error: ${error.message}`
+ }],
+ errorCount: 1,
+ warningCount: 0
+ };
+ }
+ }
+
+ static async validateBackendFiles(backendPath) {
+ try {
+ // Check for syntax errors
+ await execAsync(`node --check ${backendPath}/src/index.js`);
+
+ // Try to run the code in a test environment
+ const testProcess = exec(
+ 'NODE_ENV=test node -e "try { require(\'./src/index.js\') } catch(e) { console.error(e); process.exit(1) }"',
+ {cwd: backendPath}
+ );
+
+ return new Promise((resolve) => {
+ let output = '';
+ let error = '';
+
+ testProcess.stdout.on('data', (data) => {
+ output += data;
+ });
+
+ testProcess.stderr.on('data', (data) => {
+ error += data;
+ });
+
+ testProcess.on('close', (code) => {
+ if (code === 0) {
+ resolve({valid: true});
+ } else {
+ resolve({
+ valid: false,
+ error: error || output
+ });
+ }
+ });
+
+ // Timeout on validation
+ setTimeout(() => {
+ testProcess.kill();
+ resolve({
+ valid: true,
+ warning: 'Validation timeout, but no immediate errors found'
+ });
+ }, 5000);
+ });
+ } catch (error) {
+ return {
+ valid: false,
+ error: error.message
+ };
+ }
+ }
+
+ static async createBackup(ROOT_PATH) {
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
+ const backupDir = path.join(ROOT_PATH, 'backups', timestamp);
+
+ try {
+ await fs.mkdir(path.join(ROOT_PATH, 'backups'), {recursive: true});
+
+ const dirsToBackup = ['frontend', 'backend'];
+
+ for (const dir of dirsToBackup) {
+ const sourceDir = path.join(ROOT_PATH, dir);
+ const targetDir = path.join(backupDir, dir);
+
+ await fs.mkdir(targetDir, {recursive: true});
+
+ await execAsync(
+ `cd "${sourceDir}" && ` +
+ `find . -type f -not -path "*/node_modules/*" -not -path "*/\\.*" | ` +
+ `while read file; do ` +
+ `mkdir -p "${targetDir}/$(dirname "$file")" && ` +
+ `cp "$file" "${targetDir}/$file"; ` +
+ `done`
+ );
+ }
+
+ console.log('Backup created at:', backupDir);
+ return backupDir;
+ } catch (error) {
+ console.error('Error creating backup:', error);
+ throw error;
+ }
+ }
+
+ static async restoreFromBackup(backupDir, ROOT_PATH) {
+ try {
+ console.log('Restoring from backup:', backupDir);
+ await execAsync(`rm -rf ${ROOT_PATH}/backend/*`);
+ await execAsync(`cp -r ${backupDir}/* ${ROOT_PATH}/backend/`);
+ return true;
+ } catch (error) {
+ console.error('Error restoring from backup:', error);
+ throw error;
+ }
+ }
+
+ static async updateProjectFilesFromScheme(zipFilePath) {
+ const MAX_FILE_SIZE = 10 * 1024 * 1024;
+ const ROOT_PATH = path.join(__dirname, '../../../');
+
+ try {
+ console.log('Checking file access...');
+ await fs.access(zipFilePath);
+
+ console.log('Getting file stats...');
+ const stats = await fs.stat(zipFilePath);
+ console.log('File size:', stats.size);
+
+ if (stats.size > MAX_FILE_SIZE) {
+ console.log('File size exceeds limit');
+ return {success: false, error: 'File size exceeds limit'};
+ }
+
+ // Copying zip file to /tmp
+ const tempZipPath = path.join('/tmp', path.basename(zipFilePath));
+ await fs.copyFile(zipFilePath, tempZipPath);
+
+ // Launching background update process
+ const servicesUpdate = (async () => {
+ try {
+ console.log('Stopping services...');
+
+ // await ProjectEventsService.sendEvent('SERVICE_STOP_STARTED', {
+ // message: 'Stopping services',
+ // timestamp: new Date().toISOString()
+ // });
+
+ await stopServices();
+
+ // await ProjectEventsService.sendEvent('SERVICE_STOP_COMPLETED', {
+ // message: 'Services stopped successfully',
+ // timestamp: new Date().toISOString()
+ // });
+
+ console.log('Creating zip instance...');
+ const zip = new AdmZip(tempZipPath);
+
+ console.log('Extracting files to:', ROOT_PATH);
+ zip.extractAllTo(ROOT_PATH, true);
+ console.log('Files extracted');
+
+ const removedFilesPath = path.join(ROOT_PATH, 'removed_files.json');
+ try {
+ await fs.access(removedFilesPath);
+ const removedFilesContent = await fs.readFile(removedFilesPath, 'utf8');
+ const filesToRemove = JSON.parse(removedFilesContent);
+ await removeFiles(filesToRemove, ROOT_PATH);
+
+ await fs.unlink(removedFilesPath);
+ } catch (error) {
+ console.log('No removed files to process or error accessing removed_files.json:', error);
+ }
+
+ // Remove temp zip file
+ await fs.unlink(tempZipPath);
+
+ // await ProjectEventsService.sendEvent('SERVICE_START_STARTED', {
+ // message: 'Starting services',
+ // timestamp: new Date().toISOString()
+ // });
+
+ // Start services after a delay
+ setTimeout(async () => {
+ try {
+ await startServices();
+ console.log('Services started successfully');
+
+ await ProjectEventsService.sendEvent('SERVICE_START_COMPLETED', {
+ message: 'All files have been successfully retrieved and applied.',
+ timestamp: new Date().toISOString()
+ });
+ } catch (e) {
+ console.error('Failed to start services:', e);
+ }
+ }, 3000);
+
+ } catch (error) {
+ console.error('Error in service update process:', error);
+ }
+ })();
+
+ servicesUpdate.catch(error => {
+ console.error('Background update process failed:', error);
+ });
+
+ console.log('Returning immediate response');
+
+ return {
+ success: true,
+ message: 'Update process initiated'
+ };
+
+ } catch (error) {
+ console.error('Critical error in updateProjectFilesFromScheme:', error);
+ return {
+ success: false,
+ error: error.message
+ };
+ }
+ }
+
+ static async getDBSchema() {
+ try {
+ return await database.getDBSchema();
+ } catch (error) {
+ console.error('Error reading schema:', error);
+ throw {
+ error: error,
+ message: error.message,
+ details: error.details || error.stack
+ };
+ }
+ }
+
+ static async executeSQL(query) {
+ try {
+ return await database.executeSQL(query);
+ } catch (error) {
+ console.error('Error executing query:', error);
+ throw {
+ error: error,
+ message: error.message,
+ details: error.details || error.stack
+ };
+ }
+ }
+
+ static async stopServices() {
+ return await stopServices();
+ }
+
+ static async startServices() {
+ return await startServices();
+ }
+
+ static async checkServicesStatus() {
+ return await checkStatus();
+ }
+
+ static async searchFiles(searchStrings) {
+ const results = {};
+ const ROOT_PATH = path.join(__dirname, '../../../');
+ const directories = [`${ROOT_PATH}backend/`, `${ROOT_PATH}frontend/`];
+ const excludeDirs = ['node_modules', 'build', 'app_shell'];
+
+ if (!Array.isArray(searchStrings)) {
+ searchStrings = [searchStrings];
+ }
+
+ for (const searchString of searchStrings) {
+ try {
+ for (const directoryPath of directories) {
+ const findCommand = `find '${directoryPath}' -type f ${excludeDirs.map(dir => `-not -path "*/${dir}/*"`).join(' ')} -print | xargs grep -nH -C 1 -e '${searchString}'`;
+
+ try {
+ const { stdout } = await execAsync(findCommand);
+
+ const lines = stdout.trim().split('\n').filter(line => line !== '');
+ const searchResults = {};
+ // searchResults['__raw_lines__'] = lines;
+
+ for (let i = 0; i < lines.length; i++) {
+ const line = lines[i];
+ const parts = line.split(':');
+ let filePath = '';
+ let lineNumberStr = '';
+ let content = '';
+ let relativeFilePath = '';
+ let lineNum = null;
+
+ if (parts.length >= 3 && !parts[0].includes('-')) {
+ filePath = parts.shift();
+ lineNumberStr = parts.shift();
+ content = parts.join(':').trim();
+ relativeFilePath = filePath.replace(`${ROOT_PATH}`, '');
+ lineNum = parseInt(lineNumberStr, 10) + 1;
+ } else {
+ content = line.trim();
+ }
+
+ const context = [];
+ if (i > 0 && lines[i - 1].includes(':')) {
+ const prevLineParts = lines[i - 1].split(':');
+ if (prevLineParts.length >= 3 && !prevLineParts[0].includes('-')) {
+ prevLineParts.shift();
+ prevLineParts.shift();
+ context.push(prevLineParts.join(':').trim());
+ } else {
+ context.push(lines[i - 1].trim());
+ }
+ }
+ context.push(content);
+ if (i < lines.length - 1 && lines[i + 1].includes(':')) {
+ const nextLineParts = lines[i + 1].split(':');
+ if (nextLineParts.length >= 3 && !nextLineParts[0].includes('-')) {
+ nextLineParts.shift();
+ nextLineParts.shift();
+ context.push(nextLineParts.join(':').trim());
+ } else {
+ context.push(lines[i + 1].trim());
+ }
+ }
+
+ if (relativeFilePath && !searchResults[relativeFilePath]) {
+ searchResults[relativeFilePath] = [];
+ }
+ if (relativeFilePath) {
+ searchResults[relativeFilePath].push({
+ lineNumber: lineNum,
+ context: context.join('\n'),
+ // __filePathAndLine__: filePath + ':' + lineNumberStr + ':' + content,
+ });
+ }
+ }
+
+ if (!results[searchString]) {
+ results[searchString] = {};
+ }
+ Object.assign(results[searchString], searchResults);
+ } catch (err) {
+ if (!err.message.includes('No such file or directory') && !err.stderr.includes('No such file or directory')) {
+ console.error(`Error using find/grep for "${searchString}" in ${directoryPath}:`, err);
+ }
+ }
+ }
+ } catch (error) {
+ console.error(`Error searching for "${searchString}":`, error);
+ results[searchString] = { error: error.message };
+ }
+ }
+
+ return results;
+ }
+
+}
+
+async function getDirectoryTree(dirPath) {
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
+ const result = {};
+
+ for (const entry of entries) {
+ const fullPath = path.join(dirPath, entry.name);
+
+ if (entry.isDirectory() && (
+ entry.name === 'node_modules' ||
+ entry.name === 'app-shell' ||
+ entry.name === '.git' ||
+ entry.name === '.idea'
+ )) {
+ continue;
+ }
+
+ const relativePath = fullPath.replace('/app', '');
+
+ if (entry.isDirectory()) {
+ const subTree = await getDirectoryTree(fullPath);
+ Object.keys(subTree).forEach(key => {
+ result[key.replace('/app', '')] = subTree[key];
+ });
+ } else {
+ const fileContent = await fs.readFile(fullPath, 'utf8');
+ const lineCount = fileContent.split('\n').length;
+ result[relativePath] = lineCount;
+ }
+ }
+
+ return result;
+}
+
+async function stopServices() {
+ try {
+ console.log('Finding service processes...');
+ // await ProjectEventsService.sendEvent('SERVICE_STOP_INITIATED', {
+ // message: 'Initiating service stop',
+ // timestamp: new Date().toISOString()
+ // });
+ // Frontend stopping
+ const { stdout: frontendProcess } = await execAsync("ps -o pid,cmd | grep '[n]ext-server' | awk '{print $1}'");
+ if (frontendProcess.trim()) {
+ console.log('Stopping frontend, pid:', frontendProcess.trim());
+
+ // await ProjectEventsService.sendEvent('FRONTEND_STOP_STARTED', {
+ // message: `Stopping frontend, pid: ${frontendProcess.trim()}`,
+ // timestamp: new Date().toISOString()
+ // });
+
+ // await execAsync(`kill -15 ${frontendProcess.trim()}`);
+
+ // await ProjectEventsService.sendEvent('FRONTEND_STOP_COMPLETED', {
+ // message: 'Frontend stopped successfully',
+ // timestamp: new Date().toISOString()
+ // });
+ }
+
+ // Backend stopping
+ const { stdout: backendProcess } = await execAsync("ps -o pid,cmd | grep '[n]ode ./src/index.js' | grep -v app-shell | awk '{print $1}'");
+ if (backendProcess.trim()) {
+ console.log('Stopping backend, pid:', backendProcess.trim());
+
+ // await ProjectEventsService.sendEvent('BACKEND_STOP_STARTED', {
+ // message: `Stopping backend, pid: ${backendProcess.trim()}`,
+ // timestamp: new Date().toISOString()
+ // });
+
+ // await execAsync(`kill -15 ${backendProcess.trim()}`);
+
+ // await ProjectEventsService.sendEvent('BACKEND_STOP_COMPLETED', {
+ // message: 'Backend stopped successfully',
+ // timestamp: new Date().toISOString()
+ // });
+ }
+
+ await new Promise(resolve => setTimeout(resolve, 4000));
+
+
+ // await ProjectEventsService.sendEvent('SERVICE_STOP_COMPLETED', {
+ // message: 'All services stopped successfully',
+ // timestamp: new Date().toISOString()
+ // });
+
+ return { success: true };
+ } catch (error) {
+ console.error('Error stopping services:', error);
+
+ await ProjectEventsService.sendEvent('SERVICE_STOP_FAILED', {
+ message: 'Error stopping services',
+ error: error.message,
+ timestamp: new Date().toISOString()
+ });
+
+ return { success: false, error: error.message };
+ }
+}
+
+async function startServices() {
+ try {
+ console.log('Starting services...');
+ // await ProjectEventsService.sendEvent('SERVICE_START_INITIATED', {
+ // message: 'Initiating service start',
+ // timestamp: new Date().toISOString()
+ // });
+
+ // await ProjectEventsService.sendEvent('FRONTEND_START_STARTED', {
+ // message: 'Starting frontend service',
+ // timestamp: new Date().toISOString()
+ // });
+ // await execAsync('yarn --cwd /app/frontend dev &');
+ // await ProjectEventsService.sendEvent('FRONTEND_START_COMPLETED', {
+ // message: 'Frontend service started successfully',
+ // timestamp: new Date().toISOString()
+ // });
+
+ // await ProjectEventsService.sendEvent('BACKEND_START_STARTED', {
+ // message: 'Starting backend service',
+ // timestamp: new Date().toISOString()
+ // });
+ // await execAsync('yarn --cwd /app/backend start &');
+ // await ProjectEventsService.sendEvent('BACKEND_START_COMPLETED', {
+ // message: 'Backend service started successfully',
+ // timestamp: new Date().toISOString()
+ // });
+
+ // await ProjectEventsService.sendEvent('SERVICE_START_COMPLETED', {
+ // message: 'All services started successfully',
+ // timestamp: new Date().toISOString()
+ // });
+
+ return { success: true };
+ } catch (error) {
+ console.error('Error starting services:', error);
+ await ProjectEventsService.sendEvent('SERVICE_START_FAILED', {
+ message: 'Error starting services',
+ error: error.message,
+ timestamp: new Date().toISOString()
+ });
+ return { success: false, error: error.message };
+ }
+}
+
+async function checkStatus() {
+ try {
+ const { stdout } = await execAsync('ps aux');
+ return {
+ success: true,
+ frontendRunning: stdout.includes('next-server'),
+ backendRunning: stdout.includes('nodemon') && stdout.includes('/app/backend'),
+ nginxRunning: stdout.includes('nginx: master process')
+ };
+ } catch (error) {
+ return {
+ success: false,
+ error: error.message
+ };
+ }
+}
+
+async function validateJSXSyntax(code) {
+ // Define validation rules for JSX
+ const rules = [
+ {
+ // JSX attribute with expression
+ pattern: /^[a-zA-Z][a-zA-Z0-9]*={.*}$/,
+ message: 'Invalid JSX attribute syntax'
+ },
+ {
+ // Invalid sequences
+ pattern: /,{2,}/,
+ message: 'Invalid character sequence detected',
+ shouldNotMatch: true
+ },
+ {
+ // Ternary expressions
+ pattern: /^[a-zA-Z][a-zA-Z0-9]*={[\w\s]+\?[^}]+:[^}]+}$/,
+ message: 'Invalid ternary expression in JSX'
+ }
+ ];
+
+ // Validate each line
+ const lines = code.split('\n');
+ for (const line of lines) {
+ const trimmedLine = line.trim();
+
+ // Skip empty lines
+ if (!trimmedLine) continue;
+
+ // Check each rule
+ for (const rule of rules) {
+ if (rule.shouldNotMatch) {
+ // For patterns that should not be present
+ if (rule.pattern.test(trimmedLine)) {
+ return {
+ valid: false,
+ errors: [{
+ code: 'JSX_SYNTAX_ERROR',
+ severity: 'error',
+ location: '',
+ message: rule.message
+ }]
+ };
+ }
+ } else {
+ // For patterns that should match
+ if (trimmedLine.includes('=') && !rule.pattern.test(trimmedLine)) {
+ return {
+ valid: false,
+ errors: [{
+ code: 'JSX_SYNTAX_ERROR',
+ severity: 'error',
+ location: '',
+ message: rule.message
+ }]
+ };
+ }
+ }
+ }
+
+ // Additional JSX-specific checks
+ if ((trimmedLine.match(/{/g) || []).length !== (trimmedLine.match(/}/g) || []).length) {
+ return {
+ valid: false,
+ errors: [{
+ code: 'JSX_SYNTAX_ERROR',
+ severity: 'error',
+ location: '',
+ message: 'Unmatched curly braces in JSX'
+ }]
+ };
+ }
+ }
+
+ // If all checks pass
+ return {
+ valid: true,
+ errors: []
+ };
+}
+
+async function removeFiles(files, rootPath) {
+ try {
+ for (const file of files) {
+ const fullPath = path.join(rootPath, file);
+ try {
+ await fs.unlink(fullPath);
+ console.log(`File removed: ${fullPath}`);
+ } catch (error) {
+ console.error(`Error when trying to delete a file ${fullPath}:`, error);
+ }
+ }
+ } catch (error) {
+ console.error('Error removing files:', error);
+ throw error;
+ }
+}
\ No newline at end of file
diff --git a/src/services/notifications/errors/forbidden.js b/src/services/notifications/errors/forbidden.js
new file mode 100644
index 0000000..192fa10
--- /dev/null
+++ b/src/services/notifications/errors/forbidden.js
@@ -0,0 +1,16 @@
+const { getNotification, isNotification } = require('../helpers');
+
+module.exports = class ForbiddenError extends Error {
+ constructor(messageCode) {
+ let message;
+
+ if (messageCode && isNotification(messageCode)) {
+ message = getNotification(messageCode);
+ }
+
+ message = message || getNotification('errors.forbidden.message');
+
+ super(message);
+ this.code = 403;
+ }
+};
diff --git a/src/services/notifications/errors/validation.js b/src/services/notifications/errors/validation.js
new file mode 100644
index 0000000..464550c
--- /dev/null
+++ b/src/services/notifications/errors/validation.js
@@ -0,0 +1,16 @@
+const { getNotification, isNotification } = require('../helpers');
+
+module.exports = class ValidationError extends Error {
+ constructor(messageCode) {
+ let message;
+
+ if (messageCode && isNotification(messageCode)) {
+ message = getNotification(messageCode);
+ }
+
+ message = message || getNotification('errors.validation.message');
+
+ super(message);
+ this.code = 400;
+ }
+};
diff --git a/src/services/notifications/helpers.js b/src/services/notifications/helpers.js
new file mode 100644
index 0000000..1c3a60f
--- /dev/null
+++ b/src/services/notifications/helpers.js
@@ -0,0 +1,30 @@
+const _get = require('lodash/get');
+const errors = require('./list');
+
+function format(message, args) {
+ if (!message) {
+ return null;
+ }
+
+ return message.replace(/{(\d+)}/g, function (match, number) {
+ return typeof args[number] != 'undefined' ? args[number] : match;
+ });
+}
+
+const isNotification = (key) => {
+ const message = _get(errors, key);
+ return !!message;
+};
+
+const getNotification = (key, ...args) => {
+ const message = _get(errors, key);
+
+ if (!message) {
+ return key;
+ }
+
+ return format(message, args);
+};
+
+exports.getNotification = getNotification;
+exports.isNotification = isNotification;
diff --git a/src/services/notifications/list.js b/src/services/notifications/list.js
new file mode 100644
index 0000000..a0a1613
--- /dev/null
+++ b/src/services/notifications/list.js
@@ -0,0 +1,100 @@
+const errors = {
+ app: {
+ title: 'test',
+ },
+
+ auth: {
+ userDisabled: 'Your account is disabled',
+ forbidden: 'Forbidden',
+ unauthorized: 'Unauthorized',
+ userNotFound: `Sorry, we don't recognize your credentials`,
+ wrongPassword: `Sorry, we don't recognize your credentials`,
+ weakPassword: 'This password is too weak',
+ emailAlreadyInUse: 'Email is already in use',
+ invalidEmail: 'Please provide a valid email',
+ passwordReset: {
+ invalidToken: 'Password reset link is invalid or has expired',
+ error: `Email not recognized`,
+ },
+ passwordUpdate: {
+ samePassword: `You can't use the same password. Please create new password`,
+ },
+ userNotVerified: `Sorry, your email has not been verified yet`,
+ emailAddressVerificationEmail: {
+ invalidToken: 'Email verification link is invalid or has expired',
+ error: `Email not recognized`,
+ },
+ },
+
+ iam: {
+ errors: {
+ userAlreadyExists: 'User with this email already exists',
+ userNotFound: 'User not found',
+ disablingHimself: `You can't disable yourself`,
+ revokingOwnPermission: `You can't revoke your own owner permission`,
+ deletingHimself: `You can't delete yourself`,
+ emailRequired: 'Email is required',
+ },
+ },
+
+ importer: {
+ errors: {
+ invalidFileEmpty: 'The file is empty',
+ invalidFileExcel: 'Only excel (.xlsx) files are allowed',
+ invalidFileUpload:
+ 'Invalid file. Make sure you are using the last version of the template.',
+ importHashRequired: 'Import hash is required',
+ importHashExistent: 'Data has already been imported',
+ userEmailMissing: 'Some items in the CSV do not have an email',
+ },
+ },
+
+ errors: {
+ forbidden: {
+ message: 'Forbidden',
+ },
+ validation: {
+ message: 'An error occurred',
+ },
+ searchQueryRequired: {
+ message: 'Search query is required',
+ },
+ },
+
+ emails: {
+ invitation: {
+ subject: `You've been invited to {0}`,
+ body: `
+
Hello,
+ You've been invited to {0} set password for your {1} account.
+ {2}
+ Thanks,
+ Your {0} team
+ `,
+ },
+ emailAddressVerification: {
+ subject: `Verify your email for {0}`,
+ body: `
+ Hello,
+ Follow this link to verify your email address.
+ {0}
+ If you didn't ask to verify this address, you can ignore this email.
+ Thanks,
+ Your {1} team
+ `,
+ },
+ passwordReset: {
+ subject: `Reset your password for {0}`,
+ body: `
+ Hello,
+ Follow this link to reset your {0} password for your {1} account.
+ {2}
+ If you didn't ask to reset your password, you can ignore this email.
+ Thanks,
+ Your {0} team
+ `,
+ },
+ },
+};
+
+module.exports = errors;
diff --git a/src/services/project-events.js b/src/services/project-events.js
new file mode 100644
index 0000000..dabc32d
--- /dev/null
+++ b/src/services/project-events.js
@@ -0,0 +1,67 @@
+const axios = require('axios');
+const config = require('../config.js');
+
+class ProjectEventsService {
+ /**
+ * Sends a project event to the Rails backend
+ *
+ * @param {string} eventType - Type of the event
+ * @param {object} payload - Event payload data
+ * @param {object} options - Additional options
+ * @param {string} [options.conversationId] - Optional conversation ID
+ * @param {boolean} [options.isError=false] - Whether this is an error event
+ * @returns {Promise